From 6b2c35c7d86ba16c2602617eadf5a3913e764ad9 Mon Sep 17 00:00:00 2001 From: Sathish Ambley Date: Mon, 26 Oct 2015 10:19:57 -0700 Subject: [PATCH 0001/1015] msm: ADSPRPC: Register for SMMU fault handler When a SMMU fault occurs for a particular session, the fault is recorded and any further invocations from user space is returned with an error and only kernel invocations are allowed with the remote processor to allow for the session to be torn down. Change-Id: Ia787055ec6e278e6fafc4965237c41bfc876dea5 Signed-off-by: Sathish Ambley --- drivers/char/adsprpc.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index 8d3241afaec2e..eb180545b7d6b 100644 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -51,6 +51,7 @@ #define TZ_PIL_CLEAR_PROTECT_MEM_SUBSYS_ID 0x0D #define TZ_PIL_AUTH_QDSP6_PROC 1 #define ADSP_MMAP_HEAP_ADDR 4 +#define FASTRPC_ENOSUCH 39 #define RPC_TIMEOUT (5 * HZ) #define BALIGN 128 @@ -146,6 +147,7 @@ struct fastrpc_smmu { struct dma_iommu_mapping *mapping; int cb; int enabled; + int faults; }; struct fastrpc_session_ctx { @@ -1171,6 +1173,10 @@ static int fastrpc_internal_invoke(struct fastrpc_file *fl, uint32_t mode, &ctx)); if (err) goto bail; + if (fl->sctx->smmu.faults) + err = FASTRPC_ENOSUCH; + if (err) + goto bail; if (ctx) goto wait; } @@ -1607,6 +1613,7 @@ static int fastrpc_session_alloc(struct fastrpc_channel_ctx *chan, int *session) if (err) goto bail; set_bit(idx, &chan->bitmap); + chan->session[idx].smmu.faults = 0; *session = idx; bail: return err; @@ -1810,6 +1817,21 @@ static int fastrpc_restart_notifier_cb(struct notifier_block *nb, return NOTIFY_DONE; } +static int fastrpc_smmu_fault_handler(struct iommu_domain *domain, + struct device *dev, unsigned long iova, int flags, void *token) +{ + struct fastrpc_session_ctx *sess = (struct fastrpc_session_ctx *)token; + int err = 0; + + VERIFY(err, sess != NULL); + if (err) + return err; + sess->smmu.faults++; + dev_err(dev, "ADSPRPC context fault: iova=0x%08lx, cb = %d, faults=%d", + iova, sess->smmu.cb, sess->smmu.faults); + return 0; +} + static const struct file_operations fops = { .open = fastrpc_device_open, .release = fastrpc_device_release, @@ -1864,6 +1886,8 @@ static int fastrpc_cb_probe(struct device *dev) iommu_domain_set_attr(sess->smmu.mapping->domain, DOMAIN_ATTR_COHERENT_HTW_DISABLE, &disable_htw); + iommu_set_fault_handler(sess->smmu.mapping->domain, + fastrpc_smmu_fault_handler, sess); VERIFY(err, !arm_iommu_attach_device(dev, sess->smmu.mapping)); if (err) goto bail; From 8e92fa45ded715248dd97f0d3b1b7546066db320 Mon Sep 17 00:00:00 2001 From: Andrey Markovytch Date: Sun, 15 Nov 2015 15:00:35 +0200 Subject: [PATCH 0002/1015] pfk: fixed bug that caused eCryptfs ignore some of its files Our logic that distinguished eCryptfs files from non eCryptfs ones checked bi_vcnt field in bio to make sure it has valid bio vecs. Apparently this field is not updated in some cases by block layer and in general can't be trusted outside of code that own bio. There is another field that need to be used for this purpose - bi_size Change-Id: Ibf225543618373699a0d5adc3295daf9ded6169a Signed-off-by: Andrey Markovytch --- security/pfe/pfk.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/security/pfe/pfk.c b/security/pfe/pfk.c index 718f3565dbce1..eef66acc789af 100644 --- a/security/pfe/pfk.c +++ b/security/pfe/pfk.c @@ -153,8 +153,8 @@ static int pfk_get_page_index(const struct bio *bio, pgoff_t *page_index) if (!bio || !page_index) return -EPERM; - /* check bio vec count > 0 before using the bio->bi_io_vec[] array */ - if (!bio->bi_vcnt) + /* check bio bi_size > 0 before using the bio->bi_io_vec[] array */ + if (!(bio->bi_iter).bi_size) return -EINVAL; if (!bio->bi_io_vec) return -EINVAL; @@ -183,8 +183,8 @@ static struct inode *pfk_bio_get_inode(const struct bio *bio) { if (!bio) return NULL; - /* check bio vec count > 0 before using the bio->bi_io_vec[] array */ - if (!bio->bi_vcnt) + /* check bio bi_size > 0 before using the bio->bi_io_vec[] array */ + if (!(bio->bi_iter).bi_size) return NULL; if (!bio->bi_io_vec) return NULL; From 42c75f47f3462a60d1d3ed0373aba6e1d1ccf224 Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Fri, 6 Nov 2015 17:13:15 -0800 Subject: [PATCH 0003/1015] msm: mdss: add additional bound checks for deinterlace layers Add necessary buffer size checks for deinterlace layers during validate. Invalid src rect configuration on mdp hardware was leading to unmapped memory access. A valid bound check fixes the input validataion and avoids such memory access. Change-Id: Ic83ef5ea008e8d8043ab2bcf9278ec72e0269fa1 Signed-off-by: Veera Sundaram Sankaran --- drivers/video/msm/mdss/mdss_mdp_layer.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_layer.c b/drivers/video/msm/mdss/mdss_mdp_layer.c index 7e04980df5449..d1b241cfceada 100644 --- a/drivers/video/msm/mdss/mdss_mdp_layer.c +++ b/drivers/video/msm/mdss/mdss_mdp_layer.c @@ -167,7 +167,7 @@ static int __layer_param_check(struct msm_fb_data_type *mfd, int content_secure; struct mdss_data_type *mdata = mfd_to_mdata(mfd); struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd); - u32 src_w, src_h, dst_w, dst_h; + u32 src_w, src_h, dst_w, dst_h, width, height; if (!ctl) { pr_err("ctl is null\n"); @@ -199,16 +199,21 @@ static int __layer_param_check(struct msm_fb_data_type *mfd, return -EINVAL; } + width = layer->buffer.width; + height = layer->buffer.height; + if (layer->flags & MDP_LAYER_DEINTERLACE) { + width *= 2; + height /= 2; + } + if (layer->buffer.width > MAX_IMG_WIDTH || layer->buffer.height > MAX_IMG_HEIGHT || layer->src_rect.w < min_src_size || layer->src_rect.h < min_src_size || - CHECK_LAYER_BOUNDS(layer->src_rect.x, layer->src_rect.w, - layer->buffer.width) || - CHECK_LAYER_BOUNDS(layer->src_rect.y, layer->src_rect.h, - layer->buffer.height)) { - pr_err("invalid source image img wh=%dx%d rect=%d,%d,%d,%d\n", - layer->buffer.width, layer->buffer.height, + CHECK_LAYER_BOUNDS(layer->src_rect.x, layer->src_rect.w, width) || + CHECK_LAYER_BOUNDS(layer->src_rect.y, layer->src_rect.h, height)) { + pr_err("invalid source image img flag=%d wh=%dx%d rect=%d,%d,%d,%d\n", + layer->flags, width, height, layer->src_rect.x, layer->src_rect.y, layer->src_rect.w, layer->src_rect.h); return -EINVAL; From 72928562a4f007337eec964db3d4dfe29abf2701 Mon Sep 17 00:00:00 2001 From: Sahitya Tummala Date: Mon, 21 Dec 2015 14:43:42 +0530 Subject: [PATCH 0004/1015] mmc: sdhci: revert MMC_PM_KEEP_POWER changes related to emmc This change reverts the following gerrits as they cause the timeout issues with Hynix cards. Also, the latest code supports sleep/awake through CMD5 and hence MMC_PM_KEEP_POWER need not be set for Hynix eMMC cards. edcf5be "mmc: host: add detect vops chain" 09287cb "mmc: sdhci-msm: configure MMC_PM_KEEP_POWER for SDIO" 7cf603a "mmc: schci: add support for MMC_PM_KEEP_POWER in eMMC" c085820 "mmc: core: set MMC_PM_KEEP_POWER for certain Hynix mmc cards" CRs-Fixed: 947299 Change-Id: If863771191ee7c2b717d5817f4a88e4ad936653a Signed-off-by: Sahitya Tummala --- drivers/mmc/core/mmc.c | 22 ---------------------- drivers/mmc/core/sdio.c | 3 --- drivers/mmc/host/sdhci-msm.c | 14 -------------- drivers/mmc/host/sdhci.c | 18 ------------------ drivers/mmc/host/sdhci.h | 1 - include/linux/mmc/card.h | 1 - include/linux/mmc/host.h | 2 -- 7 files changed, 61 deletions(-) diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 9cd075db35002..0ff1d92d8982d 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -124,12 +124,6 @@ static void mmc_set_erase_size(struct mmc_card *card) mmc_init_erase(card); } -static void add_pm_flag_mmc(struct mmc_card *card, int data) -{ - if (mmc_card_mmc(card)) - card->host->pm_flags |= data; -} - static const struct mmc_fixup mmc_fixups[] = { /* avoid HPI for specific cards */ @@ -140,9 +134,6 @@ static const struct mmc_fixup mmc_fixups[] = { MMC_FIXUP("MMC16G", CID_MANFID_KINGSTON, CID_OEMID_ANY, add_quirk_mmc, MMC_QUIRK_CACHE_DISABLE), - MMC_FIXUP_EXT_CSD_REV(CID_NAME_ANY, CID_MANFID_HYNIX, CID_OEMID_ANY, - add_pm_flag_mmc, MMC_PM_KEEP_POWER, MMC_V5_0), - END_FIXUP }; @@ -444,9 +435,6 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) */ card->ext_csd.rev = ext_csd[EXT_CSD_REV]; - /* fixup device after ext_csd revision field is updated */ - mmc_fixup_device(card, mmc_fixups); - card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0]; card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1]; card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2]; @@ -2353,9 +2341,6 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend) if (mmc_card_suspended(host->card)) goto out; - if (is_suspend) - host->dev_status = DEV_SUSPENDING; - if (host->card->cmdq_init) { BUG_ON(host->cmdq_ctx.active_reqs); @@ -2398,11 +2383,6 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend) mmc_card_set_suspended(host->card); } out: - if (err) - host->dev_status = DEV_UNKNOWN; - else if (is_suspend) - host->dev_status = DEV_SUSPENDED; - /* Kick CMDQ thread to process any requests came in while suspending */ if (host->card->cmdq_init) wake_up(&host->cmdq_ctx.wait); @@ -2556,8 +2536,6 @@ static int _mmc_resume(struct mmc_host *host) mmc_hostname(host), __func__, err); out: - if (!err) - host->dev_status = DEV_RESUMED; return err; } diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 6a7e34a342a47..4ef8cd3bf3551 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -980,9 +980,6 @@ static void mmc_sdio_detect(struct mmc_host *host) */ err = _mmc_detect_card_removed(host); - if (host->ops && host->ops->detect) - host->ops->detect(host, err); - mmc_release_host(host); /* diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index baf486301f320..22af3d2d9f7bc 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -3161,19 +3161,6 @@ static void sdhci_msm_clear_set_dumpregs(struct sdhci_host *host, bool set) } } -static void sdhci_msm_detect(struct sdhci_host *host, bool detected) -{ - struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); - struct sdhci_msm_host *msm_host = pltfm_host->priv; - struct mmc_host *mmc = msm_host->mmc; - struct mmc_card *card = mmc->card; - - if (detected && mmc_card_sdio(card)) - mmc->pm_caps |= MMC_PM_KEEP_POWER; - else - mmc->pm_caps &= ~MMC_PM_KEEP_POWER; -} - int sdhci_msm_notify_load(struct sdhci_host *host, enum mmc_load state) { struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); @@ -3726,7 +3713,6 @@ static struct sdhci_ops sdhci_msm_ops = { .reset = sdhci_msm_reset, .clear_set_dumpregs = sdhci_msm_clear_set_dumpregs, .enhanced_strobe_mask = sdhci_msm_enhanced_strobe_mask, - .detect = sdhci_msm_detect, .notify_load = sdhci_msm_notify_load, .reset_workaround = sdhci_msm_reset_workaround, .init = sdhci_msm_init, diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index f06cd8f083960..8bd772ade73fd 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1422,16 +1422,6 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode, struct mmc_host *mmc = host->mmc; u8 pwr = 0; - /* - * Don't disable/re-enable power to the card when running a - * suspend/resume sequence and the pm_flags are configured to preserve - * card power during suspend. - */ - if (mmc_card_keep_power(mmc) && - ((mmc->dev_status == DEV_SUSPENDED && mode == MMC_POWER_UP) || - (mmc->dev_status == DEV_SUSPENDING && mode == MMC_POWER_OFF))) - return; - if (!IS_ERR(mmc->supply.vmmc)) { spin_unlock_irq(&host->lock); mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); @@ -2638,13 +2628,6 @@ static void sdhci_card_event(struct mmc_host *mmc) spin_unlock_irqrestore(&host->lock, flags); } -static void sdhci_detect(struct mmc_host *mmc, bool detected) -{ - struct sdhci_host *host = mmc_priv(mmc); - - if (host->ops->detect) - host->ops->detect(host, detected); -} static int sdhci_late_init(struct mmc_host *mmc) { struct sdhci_host *host = mmc_priv(mmc); @@ -2685,7 +2668,6 @@ static const struct mmc_host_ops sdhci_ops = { .disable = sdhci_disable, .notify_load = sdhci_notify_load, .notify_halt = sdhci_notify_halt, - .detect = sdhci_detect, .force_err_irq = sdhci_force_err_irq, }; diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 741b1110f83b2..80f36d61f11f9 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -332,7 +332,6 @@ struct sdhci_ops { int (*enable_controller_clock)(struct sdhci_host *host); void (*clear_set_dumpregs)(struct sdhci_host *host, bool set); void (*enhanced_strobe_mask)(struct sdhci_host *host, bool set); - void (*detect)(struct sdhci_host *host, bool detected); int (*notify_load)(struct sdhci_host *host, enum mmc_load state); void (*reset_workaround)(struct sdhci_host *host, u32 enable); void (*init)(struct sdhci_host *host); diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index df291c535fe31..771e8623d848f 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -478,7 +478,6 @@ struct mmc_fixup { #define CID_MANFID_MICRON 0x13 #define CID_MANFID_SAMSUNG 0x15 #define CID_MANFID_KINGSTON 0x70 -#define CID_MANFID_HYNIX 0x90 #define CID_MANFID_ANY (-1u) #define CID_OEMID_ANY ((unsigned short) -1) diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index fc07b008069ee..0a44d6226e6e7 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -176,7 +176,6 @@ struct mmc_host_ops { unsigned long (*get_min_frequency)(struct mmc_host *host); int (*notify_load)(struct mmc_host *, enum mmc_load); void (*notify_halt)(struct mmc_host *mmc, bool halt); - void (*detect)(struct mmc_host *host, bool detected); void (*force_err_irq)(struct mmc_host *host, u64 errmask); }; @@ -289,7 +288,6 @@ enum dev_state { DEV_SUSPENDING = 1, DEV_SUSPENDED, DEV_RESUMED, - DEV_UNKNOWN, /* Device is in an unknown state */ }; /** From 488d6ca373a86e5df8dd0b2a95476d45cd2b1d11 Mon Sep 17 00:00:00 2001 From: Ashay Jaiswal Date: Tue, 29 Dec 2015 13:50:07 +0530 Subject: [PATCH 0005/1015] ARM: dts: msm: enable charger LED support for MSM8937 Enable charger LED and configure it in software controlled blinking mode. CRs-Fixed: 948641 Change-Id: Ie0b885351c9c34a1a4223050c0d503e54eb0f6eb Signed-off-by: Ashay Jaiswal --- arch/arm/boot/dts/qcom/msm8937-pmi8937-mtp.dtsi | 2 ++ arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi | 2 ++ 2 files changed, 4 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8937-pmi8937-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8937-pmi8937-mtp.dtsi index 74e40796c3222..593ddb23f0049 100644 --- a/arch/arm/boot/dts/qcom/msm8937-pmi8937-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-pmi8937-mtp.dtsi @@ -39,4 +39,6 @@ &pmi8937_charger { qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; }; diff --git a/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi index 64e9e17d2a646..c90d3cc0441a5 100644 --- a/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi @@ -39,6 +39,8 @@ &pmi8950_charger { qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; }; &mdss_dsi0 { From 4d2403802f84b70fc69ce7df9a0bc8aeabd11a21 Mon Sep 17 00:00:00 2001 From: Shilpa Mamidi Date: Wed, 23 Dec 2015 13:49:13 +0530 Subject: [PATCH 0006/1015] msm: cpp: Set GDRC register set after FW load As per hardware specifications register read cannot be done upon setting GDRC register with HW_CONTROL. This change will set GDRC register with HW_CONTROL after firmware load to ensure that HW version returns correct value CRs-Fixed: 950485 Change-Id: Ia08a14f9f05cd410140cf01c26b41d3afba94513 Signed-off-by: Shilpa Mamidi --- .../media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index f26ac00c9a6ea..001fb0a7d4e90 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -1129,12 +1129,6 @@ static int cpp_init_hardware(struct cpp_device *cpp_dev) } } - rc = msm_cpp_update_gdscr_status(cpp_dev, true); - if (rc < 0) { - pr_err("update cpp gdscr status failed\n"); - goto req_irq_fail; - } - cpp_dev->hw_info.cpp_hw_version = msm_camera_io_r(cpp_dev->cpp_hw_base); if (cpp_dev->hw_info.cpp_hw_version == CPP_HW_VERSION_4_1_0) { @@ -1376,6 +1370,10 @@ static int32_t cpp_load_fw(struct cpp_device *cpp_dev, char *fw_name_bin) MSM_CPP_MSG_ID_JUMP_ACK, rc); } + rc = msm_cpp_update_gdscr_status(cpp_dev, true); + if (rc < 0) + pr_err("update cpp gdscr status failed\n"); + end: return rc; } From 42128ceba4a11dbb0cc0b2ab62dc7954e6b9e33e Mon Sep 17 00:00:00 2001 From: Komal Seelam Date: Wed, 30 Dec 2015 02:53:40 -0800 Subject: [PATCH 0007/1015] cnss-sdio: Dynamically allocate ramdump memory Existing solution to reserve the memory region for CNSS ramdump collection has it's own limitations because of reserving the memory region for each platforms even before CNSS driver is probed. Add implementation to allocate the required memory for CNSS ramdump using dma_alloc_coherent API and update the physical address in dump table so that tools can find the starting address of the CNSS ramdump in the crash dump. Change-Id: I9fb3d77fdd35de54ca2a7a27d4a55bd12049311f Signed-off-by: Komal Seelam CRs-Fixed: 957203 --- drivers/net/wireless/cnss/cnss_sdio.c | 113 ++++++++++++++++++++------ 1 file changed, 88 insertions(+), 25 deletions(-) diff --git a/drivers/net/wireless/cnss/cnss_sdio.c b/drivers/net/wireless/cnss/cnss_sdio.c index ee0fe5829eb8a..98c2b05473c7b 100644 --- a/drivers/net/wireless/cnss/cnss_sdio.c +++ b/drivers/net/wireless/cnss/cnss_sdio.c @@ -39,6 +39,11 @@ #define WLAN_VREG_XTAL_MIN 1800000 #define POWER_ON_DELAY 4 +/* Values for Dynamic Ramdump Collection*/ +#define CNSS_DUMP_FORMAT_VER 0x11 +#define CNSS_DUMP_MAGIC_VER_V2 0x42445953 +#define CNSS_DUMP_NAME "CNSS_WLAN" + struct cnss_unsafe_channel_list { u16 unsafe_ch_count; u16 unsafe_ch_list[CNSS_MAX_CH_NUM]; @@ -70,6 +75,8 @@ struct cnss_ssr_info { unsigned long ramdump_size; void *ramdump_addr; phys_addr_t ramdump_phys; + struct msm_dump_data dump_data; + bool ramdump_dynamic; char subsys_name[10]; }; @@ -354,19 +361,45 @@ static void cnss_subsys_exit(void) ssr_info->subsys = NULL; } +static int cnss_configure_dump_table(struct cnss_ssr_info *ssr_info) +{ + struct msm_dump_entry dump_entry; + int ret; + + ssr_info->dump_data.addr = ssr_info->ramdump_phys; + ssr_info->dump_data.len = ssr_info->ramdump_size; + ssr_info->dump_data.version = CNSS_DUMP_FORMAT_VER; + ssr_info->dump_data.magic = CNSS_DUMP_MAGIC_VER_V2; + strlcpy(ssr_info->dump_data.name, CNSS_DUMP_NAME, + sizeof(ssr_info->dump_data.name)); + + dump_entry.id = MSM_DUMP_DATA_CNSS_WLAN; + dump_entry.addr = virt_to_phys(&ssr_info->dump_data); + + ret = msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry); + if (ret) + pr_err("%s: Dump table setup failed: %d\n", __func__, ret); + + return ret; +} + static int cnss_configure_ramdump(void) { struct cnss_ssr_info *ssr_info; int ret = 0; struct resource *res; const char *name; + u32 ramdump_size = 0; + struct device *dev; if (!cnss_pdata) return -ENODEV; + + dev = &cnss_pdata->pdev->dev; + ssr_info = &cnss_pdata->ssr_info; - ret = of_property_read_string(cnss_pdata->pdev->dev.of_node, - CNSS_SUBSYS_NAME_KEY, + ret = of_property_read_string(dev->of_node, CNSS_SUBSYS_NAME_KEY, &name); if (ret) { pr_err("%s: cnss missing DT key '%s'\n", __func__, @@ -374,44 +407,65 @@ static int cnss_configure_ramdump(void) ret = -ENODEV; goto err_subsys_name_query; } + strlcpy(ssr_info->subsys_name, name, sizeof(ssr_info->subsys_name)); - res = platform_get_resource_byname(cnss_pdata->pdev, - IORESOURCE_MEM, "ramdump"); - if (res) { - ssr_info->ramdump_phys = res->start; - ssr_info->ramdump_size = resource_size(res); + if (of_property_read_u32(dev->of_node, "qcom,wlan-ramdump-dynamic", + &ramdump_size) == 0) { + ssr_info->ramdump_addr = dma_alloc_coherent(dev, ramdump_size, + &ssr_info->ramdump_phys, + GFP_KERNEL); + if (ssr_info->ramdump_addr) + ssr_info->ramdump_size = ramdump_size; + ssr_info->ramdump_dynamic = true; } else { - pr_err("%s: CNSS ramdump mem not available\n", __func__); - return 0; + res = platform_get_resource_byname(cnss_pdata->pdev, + IORESOURCE_MEM, "ramdump"); + if (res) { + ssr_info->ramdump_phys = res->start; + ramdump_size = resource_size(res); + ssr_info->ramdump_addr = ioremap(ssr_info->ramdump_phys, + ramdump_size); + if (ssr_info->ramdump_addr) + ssr_info->ramdump_size = ramdump_size; + ssr_info->ramdump_dynamic = false; + } } - ssr_info->ramdump_addr = ioremap(ssr_info->ramdump_phys, - ssr_info->ramdump_size); + pr_info("%s: ramdump addr: %p, phys: %pa subsys:'%s'\n", __func__, + ssr_info->ramdump_addr, &ssr_info->ramdump_phys, + ssr_info->subsys_name); - if (!ssr_info->ramdump_addr || ssr_info->ramdump_size == 0) { - ssr_info->ramdump_size = 0; - ssr_info->ramdump_addr = NULL; - pr_err("%s: CNSS ramdump will not be collected\n", __func__); + if (ssr_info->ramdump_size == 0) { + pr_info("%s: CNSS ramdump will not be collected", __func__); return 0; } - pr_info("%s: ramdump addr: %p, phys: %pa subsys:'%s'\n", __func__, - ssr_info->ramdump_addr, - &ssr_info->ramdump_phys, - ssr_info->subsys_name); + if (ssr_info->ramdump_dynamic) { + ret = cnss_configure_dump_table(ssr_info); + if (ret) + goto err_configure_dump_table; + } ssr_info->ramdump_dev = create_ramdump_device(ssr_info->subsys_name, - &cnss_pdata->pdev->dev); + dev); if (!ssr_info->ramdump_dev) { ret = -ENOMEM; pr_err("%s: ramdump dev create failed: error=%d\n", __func__, ret); - goto err_create_ramdump; + goto err_configure_dump_table; } + return 0; -err_create_ramdump: - iounmap(ssr_info->ramdump_addr); + +err_configure_dump_table: + if (ssr_info->ramdump_dynamic) + dma_free_coherent(dev, ssr_info->ramdump_size, + ssr_info->ramdump_addr, + ssr_info->ramdump_phys); + else + iounmap(ssr_info->ramdump_addr); + ssr_info->ramdump_addr = NULL; ssr_info->ramdump_size = 0; err_subsys_name_query: @@ -421,13 +475,22 @@ static int cnss_configure_ramdump(void) static void cnss_ramdump_cleanup(void) { struct cnss_ssr_info *ssr_info; + struct device *dev; if (!cnss_pdata) return; + dev = &cnss_pdata->pdev->dev; ssr_info = &cnss_pdata->ssr_info; - if (ssr_info->ramdump_addr) - iounmap(ssr_info->ramdump_addr); + if (ssr_info->ramdump_addr) { + if (ssr_info->ramdump_dynamic) + dma_free_coherent(dev, ssr_info->ramdump_size, + ssr_info->ramdump_addr, + ssr_info->ramdump_phys); + else + iounmap(ssr_info->ramdump_addr); + } + ssr_info->ramdump_addr = NULL; if (ssr_info->ramdump_dev) destroy_ramdump_device(ssr_info->ramdump_dev); From a991f7ee3deb7703b0f918e243a984a9906d6070 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Fri, 8 Jul 2016 14:40:45 -0700 Subject: [PATCH 0008/1015] qseecom: support whitelist memory for qseecom_send_modfd_cmd qseecom_send_modfd_cmd converts ION buffer's virtual address to scatter gather(SG) list and then sends them to TA by populating SG list into message buffer. As the physical memory address in SG list is used directly by TA, this allows a malicious TA to access/corrupt arbitrary physical memory and may lead to the process gaining kernel/root privileges. Thus, make changes to have the QSEEComm driver passing a list of whitelist buffers that is allowed to be mapped by TA, and the QSEE kernel, in turn, should add checks to the register_shared_buffer syscall to make sure the shared buffers an application is mapping falls within one of these whitelist buffers. CRs-fixed: 1021945 Change-Id: I776ead0030cad167afcf41ab985db7151a42d126 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 366 ++++++++++++++++++++++++++++++++---- include/soc/qcom/qseecomi.h | 47 ++++- 2 files changed, 372 insertions(+), 41 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index d3ad2aa1988a3..90f032059ed53 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -205,6 +205,7 @@ struct qseecom_control { uint32_t qseos_version; uint32_t qsee_version; struct device *pdev; + bool whitelist_support; bool commonlib_loaded; bool commonlib64_loaded; struct ion_handle *cmnlib_ion_handle; @@ -267,6 +268,30 @@ struct qseecom_listener_handle { static struct qseecom_control qseecom; +struct sglist_info { + uint32_t indexAndFlags; + uint32_t sizeOrCount; +}; + +/* + * The 31th bit indicates only one or multiple physical address inside + * the request buffer. If it is set, the index locates a single physical addr + * inside the request buffer, and `sizeOrCount` is the size of the memory being + * shared at that physical address. + * Otherwise, the index locates an array of {start, len} pairs (a + * "scatter/gather list"), and `sizeOrCount` gives the number of entries in + * that array. + * + * The 30th bit indicates 64 or 32bit address; when it is set, physical addr + * and scatter gather entry sizes are 64-bit values. Otherwise, 32-bit values. + * + * The bits [0:29] of `indexAndFlags` hold an offset into the request buffer. + */ +#define SGLISTINFO_SET_INDEX_FLAG(c, s, i) \ + ((uint32_t)(((c & 1) << 31) | ((s & 1) << 30) | (i & 0x3fffffff))) + +#define SGLISTINFO_TABLE_SIZE (sizeof(struct sglist_info) * MAX_ION_FD) + struct qseecom_dev_handle { enum qseecom_client_handle_type type; union { @@ -280,6 +305,8 @@ struct qseecom_dev_handle { bool perf_enabled; bool fast_load_enabled; enum qseecom_bandwidth_request_mode mode; + struct sglist_info *sglistinfo_ptr; + uint32_t sglist_cnt; }; struct qseecom_key_id_usage_desc { @@ -612,6 +639,38 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } + case QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST: { + struct qseecom_client_send_data_ireq *req; + struct qseecom_client_send_data_64bit_ireq *req_64bit; + + smc_id = TZ_APP_QSAPP_SEND_DATA_WITH_WHITELIST_ID; + desc.arginfo = + TZ_APP_QSAPP_SEND_DATA_WITH_WHITELIST_ID_PARAM_ID; + if (qseecom.qsee_version < QSEE_VERSION_40) { + req = (struct qseecom_client_send_data_ireq *) + req_buf; + desc.args[0] = req->app_id; + desc.args[1] = req->req_ptr; + desc.args[2] = req->req_len; + desc.args[3] = req->rsp_ptr; + desc.args[4] = req->rsp_len; + desc.args[5] = req->sglistinfo_ptr; + desc.args[6] = req->sglistinfo_len; + } else { + req_64bit = + (struct qseecom_client_send_data_64bit_ireq *) + req_buf; + desc.args[0] = req_64bit->app_id; + desc.args[1] = req_64bit->req_ptr; + desc.args[2] = req_64bit->req_len; + desc.args[3] = req_64bit->rsp_ptr; + desc.args[4] = req_64bit->rsp_len; + desc.args[5] = req_64bit->sglistinfo_ptr; + desc.args[6] = req_64bit->sglistinfo_len; + } + ret = scm_call2(smc_id, &desc); + break; + } case QSEOS_RPMB_PROVISION_KEY_COMMAND: { struct qseecom_client_send_service_ireq *req; req = (struct qseecom_client_send_service_ireq *) @@ -754,6 +813,36 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } + case QSEOS_TEE_OPEN_SESSION_WHITELIST: { + struct qseecom_qteec_ireq *req; + struct qseecom_qteec_64bit_ireq *req_64bit; + + smc_id = TZ_APP_GPAPP_OPEN_SESSION_WITH_WHITELIST_ID; + desc.arginfo = + TZ_APP_GPAPP_OPEN_SESSION_WITH_WHITELIST_ID_PARAM_ID; + if (qseecom.qsee_version < QSEE_VERSION_40) { + req = (struct qseecom_qteec_ireq *)req_buf; + desc.args[0] = req->app_id; + desc.args[1] = req->req_ptr; + desc.args[2] = req->req_len; + desc.args[3] = req->resp_ptr; + desc.args[4] = req->resp_len; + desc.args[5] = req->sglistinfo_ptr; + desc.args[6] = req->sglistinfo_len; + } else { + req_64bit = (struct qseecom_qteec_64bit_ireq *) + req_buf; + desc.args[0] = req_64bit->app_id; + desc.args[1] = req_64bit->req_ptr; + desc.args[2] = req_64bit->req_len; + desc.args[3] = req_64bit->resp_ptr; + desc.args[4] = req_64bit->resp_len; + desc.args[5] = req_64bit->sglistinfo_ptr; + desc.args[6] = req_64bit->sglistinfo_len; + } + ret = scm_call2(smc_id, &desc); + break; + } case QSEOS_TEE_INVOKE_COMMAND: { struct qseecom_qteec_ireq *req; struct qseecom_qteec_64bit_ireq *req_64bit; @@ -778,6 +867,36 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } + case QSEOS_TEE_INVOKE_COMMAND_WHITELIST: { + struct qseecom_qteec_ireq *req; + struct qseecom_qteec_64bit_ireq *req_64bit; + + smc_id = TZ_APP_GPAPP_INVOKE_COMMAND_WITH_WHITELIST_ID; + desc.arginfo = + TZ_APP_GPAPP_INVOKE_COMMAND_WITH_WHITELIST_ID_PARAM_ID; + if (qseecom.qsee_version < QSEE_VERSION_40) { + req = (struct qseecom_qteec_ireq *)req_buf; + desc.args[0] = req->app_id; + desc.args[1] = req->req_ptr; + desc.args[2] = req->req_len; + desc.args[3] = req->resp_ptr; + desc.args[4] = req->resp_len; + desc.args[5] = req->sglistinfo_ptr; + desc.args[6] = req->sglistinfo_len; + } else { + req_64bit = (struct qseecom_qteec_64bit_ireq *) + req_buf; + desc.args[0] = req_64bit->app_id; + desc.args[1] = req_64bit->req_ptr; + desc.args[2] = req_64bit->req_len; + desc.args[3] = req_64bit->resp_ptr; + desc.args[4] = req_64bit->resp_len; + desc.args[5] = req_64bit->sglistinfo_ptr; + desc.args[6] = req_64bit->sglistinfo_len; + } + ret = scm_call2(smc_id, &desc); + break; + } case QSEOS_TEE_CLOSE_SESSION: { struct qseecom_qteec_ireq *req; struct qseecom_qteec_64bit_ireq *req_64bit; @@ -2705,14 +2824,15 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, { int ret = 0; u32 reqd_len_sb_in = 0; - struct qseecom_client_send_data_ireq send_data_req; - struct qseecom_client_send_data_64bit_ireq send_data_req_64bit; + struct qseecom_client_send_data_ireq send_data_req = {0}; + struct qseecom_client_send_data_64bit_ireq send_data_req_64bit = {0}; struct qseecom_command_scm_resp resp; unsigned long flags; struct qseecom_registered_app_list *ptr_app; bool found_app = false; void *cmd_buf = NULL; size_t cmd_len; + struct sglist_info *table = data->sglistinfo_ptr; reqd_len_sb_in = req->cmd_req_len + req->resp_len; /* find app_id & img_name from list */ @@ -2734,7 +2854,6 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, } if (qseecom.qsee_version < QSEE_VERSION_40) { - send_data_req.qsee_cmd_id = QSEOS_CLIENT_SEND_DATA_COMMAND; send_data_req.app_id = data->client.app_id; send_data_req.req_ptr = (uint32_t)(__qseecom_uvirt_to_kphys( data, (uintptr_t)req->cmd_req_buf)); @@ -2742,11 +2861,14 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, send_data_req.rsp_ptr = (uint32_t)(__qseecom_uvirt_to_kphys( data, (uintptr_t)req->resp_buf)); send_data_req.rsp_len = req->resp_len; + send_data_req.sglistinfo_ptr = + (uint32_t)virt_to_phys(table); + send_data_req.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); cmd_buf = (void *)&send_data_req; cmd_len = sizeof(struct qseecom_client_send_data_ireq); } else { - send_data_req_64bit.qsee_cmd_id = - QSEOS_CLIENT_SEND_DATA_COMMAND; send_data_req_64bit.app_id = data->client.app_id; send_data_req_64bit.req_ptr = __qseecom_uvirt_to_kphys(data, (uintptr_t)req->cmd_req_buf); @@ -2768,10 +2890,20 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, send_data_req_64bit.rsp_len); return -EFAULT; } + send_data_req_64bit.sglistinfo_ptr = + (uint64_t)virt_to_phys(table); + send_data_req_64bit.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); cmd_buf = (void *)&send_data_req_64bit; cmd_len = sizeof(struct qseecom_client_send_data_64bit_ireq); } + if (qseecom.whitelist_support == false) + *(uint32_t *)cmd_buf = QSEOS_CLIENT_SEND_DATA_COMMAND; + else + *(uint32_t *)cmd_buf = QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST; + msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, reqd_len_sb_in, @@ -3025,14 +3157,26 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, goto err; } } - if (cleanup) + + if (cleanup) { msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_INV_CACHES); - else + } else { msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_CLEAN_INV_CACHES); + if (data->type == QSEECOM_CLIENT_APP) { + data->sglistinfo_ptr[i].indexAndFlags = + SGLISTINFO_SET_INDEX_FLAG( + (sg_ptr->nents == 1), 0, + req->ifd_data[i].cmd_buf_offset); + data->sglistinfo_ptr[i].sizeOrCount = + (sg_ptr->nents == 1) ? + sg->length : sg_ptr->nents; + data->sglist_cnt = i + 1; + } + } /* Deallocate the handle */ if (!IS_ERR_OR_NULL(ihandle)) ion_free(qseecom.ion_clnt, ihandle); @@ -3231,14 +3375,25 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, } } cleanup: - if (cleanup) + if (cleanup) { msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_INV_CACHES); - else + } else { msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_CLEAN_INV_CACHES); + if (data->type == QSEECOM_CLIENT_APP) { + data->sglistinfo_ptr[i].indexAndFlags = + SGLISTINFO_SET_INDEX_FLAG( + (sg_ptr->nents == 1), 1, + req->ifd_data[i].cmd_buf_offset); + data->sglistinfo_ptr[i].sizeOrCount = + (sg_ptr->nents == 1) ? + sg->length : sg_ptr->nents; + data->sglist_cnt = i + 1; + } + } /* Deallocate the handle */ if (!IS_ERR_OR_NULL(ihandle)) ion_free(qseecom.ion_clnt, ihandle); @@ -5897,14 +6052,23 @@ static int __qseecom_update_qteec_req_buf(struct qseecom_qteec_modfd_req *req, *update = (uint32_t)sg_dma_address(sg_ptr->sgl); } clean: - if (cleanup) + if (cleanup) { msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, sg->length, ION_IOC_INV_CACHES); - else + } else { msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, sg->length, ION_IOC_CLEAN_INV_CACHES); + data->sglistinfo_ptr[i].indexAndFlags = + SGLISTINFO_SET_INDEX_FLAG( + (sg_ptr->nents == 1), 0, + req->ifd_data[i].cmd_buf_offset); + data->sglistinfo_ptr[i].sizeOrCount = + (sg_ptr->nents == 1) ? + sg->length : sg_ptr->nents; + data->sglist_cnt = i + 1; + } /* Deallocate the handle */ if (!IS_ERR_OR_NULL(ihandle)) ion_free(qseecom.ion_clnt, ihandle); @@ -5929,6 +6093,7 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, uint32_t reqd_len_sb_in = 0; void *cmd_buf = NULL; size_t cmd_len; + struct sglist_info *table = data->sglistinfo_ptr; ret = __qseecom_qteec_validate_msg(data, req); if (ret) @@ -5951,8 +6116,15 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, return -ENOENT; } + if ((cmd_id == QSEOS_TEE_OPEN_SESSION) || + (cmd_id == QSEOS_TEE_REQUEST_CANCELLATION)) { + ret = __qseecom_update_qteec_req_buf( + (struct qseecom_qteec_modfd_req *)req, data, false); + if (ret) + return ret; + } + if (qseecom.qsee_version < QSEE_VERSION_40) { - ireq.qsee_cmd_id = cmd_id; ireq.app_id = data->client.app_id; ireq.req_ptr = (uint32_t)__qseecom_uvirt_to_kphys(data, (uintptr_t)req->req_ptr); @@ -5960,10 +6132,13 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, ireq.resp_ptr = (uint32_t)__qseecom_uvirt_to_kphys(data, (uintptr_t)req->resp_ptr); ireq.resp_len = req->resp_len; + ireq.sglistinfo_ptr = (uint32_t)virt_to_phys(table); + ireq.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); cmd_buf = (void *)&ireq; cmd_len = sizeof(struct qseecom_qteec_ireq); } else { - ireq_64bit.qsee_cmd_id = cmd_id; ireq_64bit.app_id = data->client.app_id; ireq_64bit.req_ptr = (uint64_t)__qseecom_uvirt_to_kphys(data, (uintptr_t)req->req_ptr); @@ -5983,17 +6158,19 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, ireq_64bit.resp_ptr, ireq_64bit.resp_len); return -EFAULT; } + ireq_64bit.sglistinfo_ptr = (uint64_t)virt_to_phys(table); + ireq_64bit.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); cmd_buf = (void *)&ireq_64bit; cmd_len = sizeof(struct qseecom_qteec_64bit_ireq); } + if (qseecom.whitelist_support == true + && cmd_id == QSEOS_TEE_OPEN_SESSION) + *(uint32_t *)cmd_buf = QSEOS_TEE_OPEN_SESSION_WHITELIST; + else + *(uint32_t *)cmd_buf = cmd_id; - if ((cmd_id == QSEOS_TEE_OPEN_SESSION) || - (cmd_id == QSEOS_TEE_REQUEST_CANCELLATION)) { - ret = __qseecom_update_qteec_req_buf( - (struct qseecom_qteec_modfd_req *)req, data, false); - if (ret) - return ret; - } reqd_len_sb_in = req->req_len + req->resp_len; msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, @@ -6091,6 +6268,9 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data, uint32_t reqd_len_sb_in = 0; void *cmd_buf = NULL; size_t cmd_len; + struct sglist_info *table = data->sglistinfo_ptr; + void *req_ptr = NULL; + void *resp_ptr = NULL; ret = copy_from_user(&req, argp, sizeof(struct qseecom_qteec_modfd_req)); @@ -6102,6 +6282,8 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data, (struct qseecom_qteec_req *)(&req)); if (ret) return ret; + req_ptr = req.req_ptr; + resp_ptr = req.resp_ptr; /* find app_id & img_name from list */ spin_lock_irqsave(&qseecom.registered_app_list_lock, flags); @@ -6120,45 +6302,56 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data, return -ENOENT; } + /* validate offsets */ + for (i = 0; i < MAX_ION_FD; i++) { + if (req.ifd_data[i].fd) { + if (req.ifd_data[i].cmd_buf_offset >= req.req_len) + return -EINVAL; + } + } + req.req_ptr = (void *)__qseecom_uvirt_to_kvirt(data, + (uintptr_t)req.req_ptr); + req.resp_ptr = (void *)__qseecom_uvirt_to_kvirt(data, + (uintptr_t)req.resp_ptr); + ret = __qseecom_update_qteec_req_buf(&req, data, false); + if (ret) + return ret; + if (qseecom.qsee_version < QSEE_VERSION_40) { - ireq.qsee_cmd_id = QSEOS_TEE_INVOKE_COMMAND; ireq.app_id = data->client.app_id; ireq.req_ptr = (uint32_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req.req_ptr); + (uintptr_t)req_ptr); ireq.req_len = req.req_len; ireq.resp_ptr = (uint32_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req.resp_ptr); + (uintptr_t)resp_ptr); ireq.resp_len = req.resp_len; cmd_buf = (void *)&ireq; cmd_len = sizeof(struct qseecom_qteec_ireq); + ireq.sglistinfo_ptr = (uint32_t)virt_to_phys(table); + ireq.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); } else { - ireq_64bit.qsee_cmd_id = QSEOS_TEE_INVOKE_COMMAND; ireq_64bit.app_id = data->client.app_id; ireq_64bit.req_ptr = (uint64_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req.req_ptr); + (uintptr_t)req_ptr); ireq_64bit.req_len = req.req_len; ireq_64bit.resp_ptr = (uint64_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req.resp_ptr); + (uintptr_t)resp_ptr); ireq_64bit.resp_len = req.resp_len; cmd_buf = (void *)&ireq_64bit; cmd_len = sizeof(struct qseecom_qteec_64bit_ireq); + ireq_64bit.sglistinfo_ptr = (uint64_t)virt_to_phys(table); + ireq_64bit.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); } reqd_len_sb_in = req.req_len + req.resp_len; + if (qseecom.whitelist_support == true) + *(uint32_t *)cmd_buf = QSEOS_TEE_INVOKE_COMMAND_WHITELIST; + else + *(uint32_t *)cmd_buf = QSEOS_TEE_INVOKE_COMMAND; - /* validate offsets */ - for (i = 0; i < MAX_ION_FD; i++) { - if (req.ifd_data[i].fd) { - if (req.ifd_data[i].cmd_buf_offset >= req.req_len) - return -EINVAL; - } - } - req.req_ptr = (void *)__qseecom_uvirt_to_kvirt(data, - (uintptr_t)req.req_ptr); - req.resp_ptr = (void *)__qseecom_uvirt_to_kvirt(data, - (uintptr_t)req.resp_ptr); - ret = __qseecom_update_qteec_req_buf(&req, data, false); - if (ret) - return ret; msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, reqd_len_sb_in, @@ -6221,6 +6414,15 @@ static int qseecom_qteec_request_cancellation(struct qseecom_dev_handle *data, return ret; } +static void __qseecom_clean_data_sglistinfo(struct qseecom_dev_handle *data) +{ + if (data->sglist_cnt) { + memset(data->sglistinfo_ptr, 0, + SGLISTINFO_TABLE_SIZE); + data->sglist_cnt = 0; + } +} + long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) { int ret = 0; @@ -6400,6 +6602,7 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) mutex_unlock(&app_access_lock); if (ret) pr_err("failed qseecom_send_cmd: %d\n", ret); + __qseecom_clean_data_sglistinfo(data); break; } case QSEECOM_IOCTL_RECEIVE_REQ: { @@ -6797,6 +7000,7 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) mutex_unlock(&app_access_lock); if (ret) pr_err("failed open_session_cmd: %d\n", ret); + __qseecom_clean_data_sglistinfo(data); break; } case QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ: { @@ -6845,6 +7049,7 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) mutex_unlock(&app_access_lock); if (ret) pr_err("failed Invoke cmd: %d\n", ret); + __qseecom_clean_data_sglistinfo(data); break; } case QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ: { @@ -6921,6 +7126,9 @@ static int qseecom_open(struct inode *inode, struct file *file) init_waitqueue_head(&data->abort_wq); atomic_set(&data->ioctl_count, 0); + data->sglistinfo_ptr = kzalloc(SGLISTINFO_TABLE_SIZE, GFP_KERNEL); + if (!(data->sglistinfo_ptr)) + return -ENOMEM; return ret; } @@ -6975,6 +7183,7 @@ static int qseecom_release(struct inode *inode, struct file *file) if (data->perf_enabled == true) qsee_disable_clock_vote(data, CLK_DFAB); } + kfree(data->sglistinfo_ptr); kfree(data); return ret; @@ -7722,6 +7931,74 @@ static int qseecom_query_ce_info(struct qseecom_dev_handle *data, return ret; } +/* + * Check if whitelist feature is supported by making a test scm_call + * to send a whitelist command to an invalid app ID 0 + */ +static int qseecom_check_whitelist_feature(void) +{ + struct qseecom_client_send_data_ireq send_data_req = {0}; + struct qseecom_client_send_data_64bit_ireq send_data_req_64bit = {0}; + struct qseecom_command_scm_resp resp; + uint32_t buf_size = 128; + void *buf = NULL; + void *cmd_buf = NULL; + size_t cmd_len; + int ret = 0; + phys_addr_t pa; + + buf = kzalloc(buf_size, GFP_KERNEL); + if (!buf) + return -ENOMEM; + pa = virt_to_phys(buf); + if (qseecom.qsee_version < QSEE_VERSION_40) { + send_data_req.qsee_cmd_id = + QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST; + send_data_req.app_id = 0; + send_data_req.req_ptr = (uint32_t)pa; + send_data_req.req_len = buf_size; + send_data_req.rsp_ptr = (uint32_t)pa; + send_data_req.rsp_len = buf_size; + send_data_req.sglistinfo_ptr = (uint32_t)pa; + send_data_req.sglistinfo_len = buf_size; + cmd_buf = (void *)&send_data_req; + cmd_len = sizeof(struct qseecom_client_send_data_ireq); + } else { + send_data_req_64bit.qsee_cmd_id = + QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST; + send_data_req_64bit.app_id = 0; + send_data_req_64bit.req_ptr = (uint64_t)pa; + send_data_req_64bit.req_len = buf_size; + send_data_req_64bit.rsp_ptr = (uint64_t)pa; + send_data_req_64bit.rsp_len = buf_size; + send_data_req_64bit.sglistinfo_ptr = (uint64_t)pa; + send_data_req_64bit.sglistinfo_len = buf_size; + cmd_buf = (void *)&send_data_req_64bit; + cmd_len = sizeof(struct qseecom_client_send_data_64bit_ireq); + } + ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, + cmd_buf, cmd_len, + &resp, sizeof(resp)); +/* + * If this cmd exists and whitelist is supported, scm_call return -2 (scm + * driver remap it to -EINVAL) and resp.result 0xFFFFFFED(-19); Otherwise, + * scm_call return -1 (remap to -EIO). + */ + if (ret == -EIO) { + qseecom.whitelist_support = false; + ret = 0; + } else if (ret == -EINVAL && + resp.result == QSEOS_RESULT_FAIL_SEND_CMD_NO_THREAD) { + qseecom.whitelist_support = true; + ret = 0; + } else { + pr_err("Failed to check whitelist: ret = %d, result = 0x%x\n", + ret, resp.result); + } + kfree(buf); + return ret; +} + static int qseecom_probe(struct platform_device *pdev) { int rc; @@ -7754,6 +8031,7 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.app_block_ref_cnt = 0; init_waitqueue_head(&qseecom.app_block_wq); + qseecom.whitelist_support = true; rc = alloc_chrdev_region(&qseecom_device_no, 0, 1, QSEECOM_DEV); if (rc < 0) { @@ -7969,6 +8247,14 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.qsee_perf_client = msm_bus_scale_register_client( qseecom_platform_support); + rc = qseecom_check_whitelist_feature(); + if (rc) { + rc = -EINVAL; + goto exit_destroy_ion_client; + } + pr_warn("qseecom.whitelist_support = %d\n", + qseecom.whitelist_support); + if (!qseecom.qsee_perf_client) pr_err("Unable to register bus client\n"); diff --git a/include/soc/qcom/qseecomi.h b/include/soc/qcom/qseecomi.h index 1349a3440e222..b0a8d67f50fa3 100644 --- a/include/soc/qcom/qseecomi.h +++ b/include/soc/qcom/qseecomi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -18,6 +18,7 @@ #define QSEECOM_KEY_ID_SIZE 32 +#define QSEOS_RESULT_FAIL_SEND_CMD_NO_THREAD -19 /*0xFFFFFFED*/ #define QSEOS_RESULT_FAIL_UNSUPPORTED_CE_PIPE -63 #define QSEOS_RESULT_FAIL_KS_OP -64 #define QSEOS_RESULT_FAIL_KEY_ID_EXISTS -65 @@ -64,6 +65,9 @@ enum qseecom_qceos_cmd_id { QSEOS_TEE_REQUEST_CANCELLATION, QSEOS_CONTINUE_BLOCKED_REQ_COMMAND, QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND = 0x1B, + QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST = 0x1C, + QSEOS_TEE_OPEN_SESSION_WHITELIST = 0x1D, + QSEOS_TEE_INVOKE_COMMAND_WHITELIST = 0x1E, QSEOS_FSM_LTEOTA_REQ_CMD = 0x109, QSEOS_FSM_LTEOTA_REQ_RSP_CMD = 0x110, QSEOS_FSM_IKE_REQ_CMD = 0x203, @@ -181,6 +185,8 @@ __packed struct qseecom_client_send_data_ireq { uint32_t req_len; uint32_t rsp_ptr;/* First 4 bytes should be the return status */ uint32_t rsp_len; + uint32_t sglistinfo_ptr; + uint32_t sglistinfo_len; }; __packed struct qseecom_client_send_data_64bit_ireq { @@ -190,6 +196,8 @@ __packed struct qseecom_client_send_data_64bit_ireq { uint32_t req_len; uint64_t rsp_ptr; uint32_t rsp_len; + uint64_t sglistinfo_ptr; + uint32_t sglistinfo_len; }; __packed struct qseecom_reg_log_buf_ireq { @@ -292,6 +300,8 @@ __packed struct qseecom_qteec_ireq { uint32_t req_len; uint32_t resp_ptr; uint32_t resp_len; + uint32_t sglistinfo_ptr; + uint32_t sglistinfo_len; }; __packed struct qseecom_qteec_64bit_ireq { @@ -301,6 +311,8 @@ __packed struct qseecom_qteec_64bit_ireq { uint32_t req_len; uint64_t resp_ptr; uint32_t resp_len; + uint64_t sglistinfo_ptr; + uint32_t sglistinfo_len; }; __packed struct qseecom_client_send_fsm_key_req { @@ -658,4 +670,37 @@ __packed struct qseecom_continue_blocked_request_ireq { #define TZ_OS_CONTINUE_BLOCKED_REQUEST_ID_PARAM_ID \ TZ_SYSCALL_CREATE_PARAM_ID_1(TZ_SYSCALL_PARAM_TYPE_VAL) +#define TZ_APP_QSAPP_SEND_DATA_WITH_WHITELIST_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_TZ_APPS, \ + TZ_SVC_APP_ID_PLACEHOLDER, 0x06) + +#define TZ_APP_QSAPP_SEND_DATA_WITH_WHITELIST_ID_PARAM_ID \ + TZ_SYSCALL_CREATE_PARAM_ID_7( \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL) + +#define TZ_APP_GPAPP_OPEN_SESSION_WITH_WHITELIST_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_TZ_APPS, \ + TZ_SVC_APP_ID_PLACEHOLDER, 0x07) + +#define TZ_APP_GPAPP_OPEN_SESSION_WITH_WHITELIST_ID_PARAM_ID \ + TZ_SYSCALL_CREATE_PARAM_ID_7( \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL) + +#define TZ_APP_GPAPP_INVOKE_COMMAND_WITH_WHITELIST_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_TZ_APPS, \ + TZ_SVC_APP_ID_PLACEHOLDER, 0x09) + +#define TZ_APP_GPAPP_INVOKE_COMMAND_WITH_WHITELIST_ID_PARAM_ID \ + TZ_SYSCALL_CREATE_PARAM_ID_7( \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL) + #endif /* __QSEECOMI_H_ */ From a839a533246ac85fe357ec3d2f5734753afda7c6 Mon Sep 17 00:00:00 2001 From: Ani Sinha Date: Thu, 17 Dec 2015 17:15:10 -0800 Subject: [PATCH 0009/1015] sysrq: Fix warning in sysrq generated crash. Commit 984d74a72076a1 ("sysrq: rcu-ify __handle_sysrq") replaced spin_lock_irqsave() calls with rcu_read_lock() calls in sysrq. Since rcu_read_lock() does not disable preemption, faulthandler_disabled() in __do_page_fault() in x86/fault.c returns false. When the code later calls might_sleep() in the pagefault handler, we get the following warning: BUG: sleeping function called from invalid context at ../arch/x86/mm/fault.c:1187 in_atomic(): 0, irqs_disabled(): 0, pid: 4706, name: bash Preemption disabled at:[] printk+0x48/0x4a To fix this, we release the RCU read lock before we crash. Tested this patch on linux 3.18 by booting off one of our boards. Fixes: 984d74a72076a1 ("sysrq: rcu-ify __handle_sysrq") Change-Id: I1827413e7e4fede197b3ebb6216239c07ae33a71 Signed-off-by: Ani Sinha Reviewed-by: Rik van Riel Signed-off-by: Paul E. McKenney Git-commit: 984cf355aeaa8f2eda3861b50d0e8d3e3f77e83b Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Signed-off-by: Gaurav Kohli --- drivers/tty/sysrq.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c index 42bad18c66c93..d0c19b1944af2 100644 --- a/drivers/tty/sysrq.c +++ b/drivers/tty/sysrq.c @@ -136,6 +136,12 @@ static void sysrq_handle_crash(int key) { char *killer = NULL; + /* we need to release the RCU read lock here, + * otherwise we get an annoying + * 'BUG: sleeping function called from invalid context' + * complaint from the kernel before the panic. + */ + rcu_read_unlock(); panic_on_oops = 1; /* force panic */ wmb(); *killer = 1; From 701cc17c23f6a162a441db9b5d44b1dfc322a367 Mon Sep 17 00:00:00 2001 From: Hardik Kantilal Patel Date: Fri, 26 Aug 2016 12:23:40 +0530 Subject: [PATCH 0010/1015] Revert "ARM: dts: msm: Remove unused gpio from msm8996 DT" This reverts commit <8133442e016da3518fb752b55624fcfd9bea311d>. After applying pinctrl sleep configuration for QCA6174, QCA6174 chip is not coming into proper power state which result stability issue. To avoid crash adding gpio node in DT. Change-Id: I8197c0193d3327355224e026a18ba1d7ed5a8257 CRs-Fixed: 1059765 Signed-off-by: Hardik Kantilal Patel --- arch/arm/boot/dts/qcom/msm8996.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/boot/dts/qcom/msm8996.dtsi b/arch/arm/boot/dts/qcom/msm8996.dtsi index 01df4c72e1440..b505f8107f610 100644 --- a/arch/arm/boot/dts/qcom/msm8996.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996.dtsi @@ -2226,6 +2226,7 @@ qcom,cnss { compatible = "qcom,cnss"; + wlan-bootstrap-gpio = <&tlmm 46 0>; vdd-wlan-en-supply = <&wlan_en_vreg>; vdd-wlan-supply = <&rome_vreg>; vdd-wlan-io-supply = <&pm8994_s4>; From 9db297672978fa54388b85130ec9b71eaa7fed50 Mon Sep 17 00:00:00 2001 From: Hardik Kantilal Patel Date: Fri, 26 Aug 2016 14:47:29 +0530 Subject: [PATCH 0011/1015] Revert "ARM: dts: msm: Remove unused gpio from mdm9x50 DT" This reverts commit <101dfa2395dceb4dfa50a9ca9c02a52296eb95da>. After applying pinctrl sleep configuration for QCA6174, QCA6174 chip is not coming into proper power state which result stability issue. To avoid crash adding gpio node in DT. Change-Id: Ic0513cd1a43a24d3d9cee4adcfc0ffe234488c38 CRs-Fixed: 1059765 Signed-off-by: Hardik Kantilal Patel --- arch/arm/boot/dts/qcom/mdmcalifornium.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/boot/dts/qcom/mdmcalifornium.dtsi b/arch/arm/boot/dts/qcom/mdmcalifornium.dtsi index a4b799a9f7bc5..84452b7ef2621 100644 --- a/arch/arm/boot/dts/qcom/mdmcalifornium.dtsi +++ b/arch/arm/boot/dts/qcom/mdmcalifornium.dtsi @@ -879,6 +879,7 @@ cnss_pcie: qcom,cnss { compatible = "qcom,cnss"; + wlan-en-gpio = <&tlmm_pinmux 95 0>; vdd-wlan-supply = <&rome_vreg>; vdd-wlan-xtal-supply = <&pmdcalifornium_l5>; vdd-wlan-io-supply = <&pmdcalifornium_l6>; From 061fef607d8d0fcbddb7408fc965a59bc75faca9 Mon Sep 17 00:00:00 2001 From: Hardik Kantilal Patel Date: Fri, 26 Aug 2016 14:51:25 +0530 Subject: [PATCH 0012/1015] Revert "ARM: dts: msm: Remove unused gpio from mdm9x40 DT" This reverts commit <94086aa1f59bb8f2f9b66e0774145962063c4fa5>. After applying pinctrl sleep configuration for QCA6174, QCA6174 chip is not coming into proper power state which result stability issue. To avoid crash adding gpio node in DT. Change-Id: Iaa599637cdc371a780f0b09e0fc0eda9228b512e CRs-Fixed: 1059765 Signed-off-by: Hardik Kantilal Patel --- arch/arm/boot/dts/qcom/mdm9640.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/boot/dts/qcom/mdm9640.dtsi b/arch/arm/boot/dts/qcom/mdm9640.dtsi index aa5d02c8c48c7..7ad58e56b7943 100644 --- a/arch/arm/boot/dts/qcom/mdm9640.dtsi +++ b/arch/arm/boot/dts/qcom/mdm9640.dtsi @@ -858,6 +858,7 @@ qcom,cnss { compatible = "qcom,cnss"; + wlan-en-gpio = <&tlmm_pinmux 95 0>; vdd-wlan-supply = <&wlan_vreg>; vdd-wlan-io-supply = <&pmd9635_l6>; vdd-wlan-sp2t-supply = <&pmd9635_l12>; From 636e9f9070e48396006942818002622ce8a7d4fb Mon Sep 17 00:00:00 2001 From: Hardik Kantilal Patel Date: Fri, 26 Aug 2016 12:41:41 +0530 Subject: [PATCH 0013/1015] Revert "cnss: Configure wlan gpio" This reverts commit . After applying pinctrl sleep configuration for QCA6174, QCA6174 chip is not coming into proper power state which result stability issue. To avoid crash moving back to GPIO library use instead of pinctrl framework. Change-Id: I789a70b512d414c5cc67f6bab5bd3cec4064ab2f CRs-Fixed: 1059765 Signed-off-by: Hardik Kantilal Patel --- .../devicetree/bindings/cnss/cnss-wlan.txt | 2 - drivers/net/wireless/cnss/cnss_pci.c | 466 ++++++++++-------- 2 files changed, 268 insertions(+), 200 deletions(-) diff --git a/Documentation/devicetree/bindings/cnss/cnss-wlan.txt b/Documentation/devicetree/bindings/cnss/cnss-wlan.txt index e954ca8ace842..5b441b4430bcc 100644 --- a/Documentation/devicetree/bindings/cnss/cnss-wlan.txt +++ b/Documentation/devicetree/bindings/cnss/cnss-wlan.txt @@ -47,8 +47,6 @@ Optional properties: - vdd-wlan-en-supply: WLAN_EN fixed regulator specified by QCA6174 specifications. - qcom,wlan-en-vreg-support: Boolean property to decide the whether the WLAN_EN pin is a gpio or fixed regulator. - - qcom,enable-bootstrap-gpio: Boolean property to decide whether wlan bootstrap - gpio should be enabled or not in this platform. Example: diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c index f55eab39e3416..d12f48a1db187 100644 --- a/drivers/net/wireless/cnss/cnss_pci.c +++ b/drivers/net/wireless/cnss/cnss_pci.c @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include #include #include @@ -56,8 +58,12 @@ #define VREG_ON 1 #define VREG_OFF 0 +#define WLAN_EN_HIGH 1 +#define WLAN_EN_LOW 0 #define PCIE_LINK_UP 1 #define PCIE_LINK_DOWN 0 +#define WLAN_BOOTSTRAP_HIGH 1 +#define WLAN_BOOTSTRAP_LOW 0 #define CNSS_DUMP_FORMAT_VER 0x11 #define CNSS_DUMP_MAGIC_VER_V2 0x42445953 #define CNSS_DUMP_NAME "CNSS_WLAN" @@ -86,6 +92,8 @@ #define WLAN_VREG_SP2T_NAME "vdd-wlan-sp2t" #define WLAN_SWREG_NAME "wlan-soc-swreg" #define WLAN_ANT_SWITCH_NAME "wlan-ant-switch" +#define WLAN_EN_GPIO_NAME "wlan-en-gpio" +#define WLAN_BOOTSTRAP_GPIO_NAME "wlan-bootstrap-gpio" #define PM_OPTIONS 0 #define PM_OPTIONS_SUSPEND_LINK_DOWN \ (MSM_PCIE_CONFIG_NO_CFG_RESTORE | MSM_PCIE_CONFIG_LINKDOWN) @@ -114,12 +122,7 @@ #define PCIE_ENABLE_DELAY 100 #define WLAN_BOOTSTRAP_DELAY 10 #define EVICT_BIN_MAX_SIZE (512*1024) - -/*wlan enable and bootstrap pinctrl state */ -#define WLAN_EN_ACTIVE "wlan_en_active" -#define WLAN_EN_SLEEP "wlan_en_sleep" -#define BOOTSTRAP_ACTIVE "bootstrap_active" -#define BOOTSTRAP_SLEEP "bootstrap_sleep" +#define CNSS_PINCTRL_STATE_ACTIVE "default" static DEFINE_SPINLOCK(pci_link_down_lock); @@ -143,13 +146,14 @@ static DEFINE_SPINLOCK(pci_link_down_lock); #define BMI_TEST_SETUP (0x09) -struct cnss_wlan_pinctrl { - bool bootstrap_enable; +struct cnss_wlan_gpio_info { + char *name; + u32 num; + bool state; + bool init; + bool prop; struct pinctrl *pinctrl; - struct pinctrl_state *wlan_en_active; - struct pinctrl_state *wlan_en_sleep; - struct pinctrl_state *bootstrap_active; - struct pinctrl_state *bootstrap_sleep; + struct pinctrl_state *gpio_state_default; }; struct cnss_wlan_vreg_info { @@ -236,8 +240,8 @@ static struct cnss_data { dma_addr_t smmu_iova_start; size_t smmu_iova_len; struct cnss_wlan_vreg_info vreg_info; - struct cnss_wlan_pinctrl cnss_pinctrl; bool wlan_en_vreg_support; + struct cnss_wlan_gpio_info gpio_info; bool pcie_link_state; bool pcie_link_down_ind; bool pci_register_again; @@ -279,6 +283,7 @@ static struct cnss_data { u32 bdata_dma_size; u32 bdata_seg_count; struct segment_memory bdata_seg_mem[MAX_NUM_OF_SEGMENTS]; + int wlan_bootstrap_gpio; atomic_t auto_suspended; bool monitor_wake_intr; struct cnss_dual_wifi dual_wifi_info; @@ -289,6 +294,17 @@ module_param(pcie_link_down_panic, uint, S_IRUSR | S_IWUSR); MODULE_PARM_DESC(pcie_link_down_panic, "Trigger kernel panic when PCIe link down is detected"); +static void cnss_put_wlan_enable_gpio(void) +{ + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; + struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; + + if (penv->wlan_en_vreg_support) + regulator_put(vreg_info->wlan_en_reg); + else + gpio_free(gpio_info->num); +} + static int cnss_wlan_vreg_on(struct cnss_wlan_vreg_info *vreg_info) { int ret; @@ -495,130 +511,127 @@ static int cnss_wlan_vreg_set(struct cnss_wlan_vreg_info *vreg_info, bool state) return ret; } -static int cnss_wlan_enable_pin_set_state( - struct cnss_wlan_pinctrl *cnss_pinctrl, - struct cnss_wlan_vreg_info *vreg_info, - bool state) +static int cnss_wlan_gpio_init(struct cnss_wlan_gpio_info *info) { - int ret; + int ret = 0; - if (state) - goto set_wlan_pin_active; + ret = gpio_request(info->num, info->name); - if (penv->wlan_en_vreg_support) - ret = regulator_disable(vreg_info->wlan_en_reg); - else - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->wlan_en_sleep); - msleep(WLAN_ENABLE_DELAY); + if (ret) { + pr_err("can't get gpio %s ret %d\n", info->name, ret); + goto err_gpio_req; + } + + ret = gpio_direction_output(info->num, info->init); + + if (ret) { + pr_err("can't set gpio direction %s ret %d\n", info->name, ret); + goto err_gpio_dir; + } + info->state = info->init; return ret; -set_wlan_pin_active: +err_gpio_dir: + gpio_free(info->num); - if (penv->wlan_en_vreg_support) - ret = regulator_enable(vreg_info->wlan_en_reg); - else - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->wlan_en_active); - msleep(WLAN_ENABLE_DELAY); +err_gpio_req: return ret; } -static int cnss_select_pinctrl_active( - struct cnss_wlan_pinctrl *cnss_pinctrl, bool active) +static int cnss_wlan_bootstrap_gpio_init(void) { - int ret; - struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; - - if (!active) - goto select_sleep_state; + int ret = 0; - if (cnss_pinctrl->bootstrap_enable) { - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->bootstrap_active); - msleep(WLAN_BOOTSTRAP_DELAY); + ret = gpio_request(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_GPIO_NAME); + if (ret) { + pr_err("%s: Can't get GPIO %s, ret = %d\n", + __func__, WLAN_BOOTSTRAP_GPIO_NAME, ret); + goto out; } - ret = cnss_wlan_enable_pin_set_state(cnss_pinctrl, vreg_info, true); - return ret; - -select_sleep_state: - if (cnss_pinctrl->bootstrap_enable) { - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->bootstrap_sleep); - msleep(WLAN_BOOTSTRAP_DELAY); + ret = gpio_direction_output(penv->wlan_bootstrap_gpio, + WLAN_BOOTSTRAP_HIGH); + if (ret) { + pr_err("%s: Can't set GPIO %s direction, ret = %d\n", + __func__, WLAN_BOOTSTRAP_GPIO_NAME, ret); + gpio_free(penv->wlan_bootstrap_gpio); + goto out; } - ret = cnss_wlan_enable_pin_set_state(cnss_pinctrl, vreg_info, false); + msleep(WLAN_BOOTSTRAP_DELAY); +out: return ret; } -static int cnss_pinctrl_init( - struct cnss_wlan_pinctrl *cnss_pinctrl, - struct device *dev) +static void cnss_wlan_gpio_set(struct cnss_wlan_gpio_info *info, bool state) { - int ret = 0; - struct device_node *node = dev->of_node; + if (!info->prop) + return; - cnss_pinctrl->pinctrl = devm_pinctrl_get(dev); - if (IS_ERR_OR_NULL(cnss_pinctrl->pinctrl)) { - pr_err("%s:Failed to get pinctrl!\n", __func__); - return PTR_ERR(cnss_pinctrl->pinctrl); + if (info->state == state) { + pr_debug("Already %s gpio is %s\n", + info->name, state ? "high" : "low"); + return; } - if (penv->wlan_en_vreg_support) - goto skip_wlan_enable_pin_config; - - cnss_pinctrl->wlan_en_active = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, WLAN_EN_ACTIVE); - if (IS_ERR_OR_NULL(cnss_pinctrl->wlan_en_active)) { - pr_err("%s:Failed to get wlan_en active state!\n", __func__); - return PTR_ERR(cnss_pinctrl->wlan_en_active); + if (state == WLAN_EN_LOW && penv->dual_wifi_info.is_dual_wifi_enabled) { + pr_debug("%s Dual WiFi enabled\n", __func__); + return; } - cnss_pinctrl->wlan_en_sleep = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, WLAN_EN_SLEEP); - if (IS_ERR_OR_NULL(cnss_pinctrl->wlan_en_sleep)) { - pr_err("%s:Failed to get wlan_en sleep state!\n", __func__); - return PTR_ERR(cnss_pinctrl->wlan_en_sleep); + gpio_set_value(info->num, state); + info->state = state; + + pr_debug("%s: %s gpio is now %s\n", __func__, + info->name, info->state ? "enabled" : "disabled"); +} + +static int cnss_configure_wlan_en_gpio(bool state) +{ + int ret = 0; + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; + struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; + + if (penv->wlan_en_vreg_support) { + if (state) + ret = regulator_enable(vreg_info->wlan_en_reg); + else + ret = regulator_disable(vreg_info->wlan_en_reg); + } else { + cnss_wlan_gpio_set(gpio_info, state); } - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->wlan_en_active); msleep(WLAN_ENABLE_DELAY); + return ret; +} -skip_wlan_enable_pin_config: - cnss_pinctrl->bootstrap_enable = - of_property_read_bool(node, "qcom,enable-bootstrap-gpio"); - - if (!cnss_pinctrl->bootstrap_enable) - goto end; +static int cnss_pinctrl_init(struct cnss_wlan_gpio_info *gpio_info, + struct platform_device *pdev) +{ + int ret; - cnss_pinctrl->bootstrap_active = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, BOOTSTRAP_ACTIVE); - if (IS_ERR_OR_NULL(cnss_pinctrl->bootstrap_active)) { - pr_err("%s:Failed to get bootstrap active state!\n", __func__); - return PTR_ERR(cnss_pinctrl->bootstrap_active); + gpio_info->pinctrl = devm_pinctrl_get(&pdev->dev); + if (IS_ERR_OR_NULL(gpio_info->pinctrl)) { + pr_err("%s: Failed to get pinctrl!\n", __func__); + return PTR_ERR(gpio_info->pinctrl); } - cnss_pinctrl->bootstrap_sleep = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, BOOTSTRAP_SLEEP); - if (IS_ERR_OR_NULL(cnss_pinctrl->bootstrap_sleep)) { - pr_err("%s:Failed to get bootstrap sleep state!\n", __func__); - return PTR_ERR(cnss_pinctrl->bootstrap_sleep); + gpio_info->gpio_state_default = pinctrl_lookup_state(gpio_info->pinctrl, + CNSS_PINCTRL_STATE_ACTIVE); + if (IS_ERR_OR_NULL(gpio_info->gpio_state_default)) { + pr_err("%s: Can not get active pin state!\n", __func__); + return PTR_ERR(gpio_info->gpio_state_default); } - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->bootstrap_active); - msleep(WLAN_BOOTSTRAP_DELAY); + ret = pinctrl_select_state(gpio_info->pinctrl, + gpio_info->gpio_state_default); -end: return ret; } -static void cnss_disable_xtal_ldo(void) +static void cnss_disable_xtal_ldo(struct platform_device *pdev) { struct cnss_wlan_vreg_info *info = &penv->vreg_info; @@ -633,16 +646,17 @@ static void cnss_disable_xtal_ldo(void) } } -static int cnss_enable_xtal_ldo(struct device *dev) +static int cnss_enable_xtal_ldo(struct platform_device *pdev) { int ret = 0; struct cnss_wlan_vreg_info *info = &penv->vreg_info; - struct device_node *node = dev->of_node; - if (!of_get_property(node, WLAN_VREG_XTAL_AON_NAME "-supply", NULL)) + if (!of_get_property(pdev->dev.of_node, + WLAN_VREG_XTAL_AON_NAME "-supply", NULL)) goto enable_xtal; - info->wlan_reg_xtal_aon = regulator_get(dev, WLAN_VREG_XTAL_AON_NAME); + info->wlan_reg_xtal_aon = regulator_get(&pdev->dev, + WLAN_VREG_XTAL_AON_NAME); if (IS_ERR(info->wlan_reg_xtal_aon)) { ret = PTR_ERR(info->wlan_reg_xtal_aon); pr_err("%s: XTAL AON Regulator get failed err:%d\n", __func__, @@ -658,10 +672,11 @@ static int cnss_enable_xtal_ldo(struct device *dev) enable_xtal: - if (!of_get_property(node, WLAN_VREG_XTAL_NAME "-supply", NULL)) + if (!of_get_property(pdev->dev.of_node, + WLAN_VREG_XTAL_NAME "-supply", NULL)) goto out_disable_xtal_aon; - info->wlan_reg_xtal = regulator_get(dev, WLAN_VREG_XTAL_NAME); + info->wlan_reg_xtal = regulator_get(&pdev->dev, WLAN_VREG_XTAL_NAME); if (IS_ERR(info->wlan_reg_xtal)) { ret = PTR_ERR(info->wlan_reg_xtal); @@ -699,15 +714,73 @@ static int cnss_enable_xtal_ldo(struct device *dev) return ret; } -static int cnss_wlan_enable_vreg_regulators(struct device *dev) +static int cnss_get_wlan_enable_gpio( + struct cnss_wlan_gpio_info *gpio_info, + struct platform_device *pdev) +{ + int ret = 0; + struct device *dev = &pdev->dev; + + if (!of_find_property(dev->of_node, gpio_info->name, NULL)) { + gpio_info->prop = false; + return -ENODEV; + } + + gpio_info->prop = true; + ret = of_get_named_gpio(dev->of_node, gpio_info->name, 0); + if (ret >= 0) { + gpio_info->num = ret; + } else { + if (ret == -EPROBE_DEFER) + pr_debug("get WLAN_EN GPIO probe defer\n"); + else + pr_err( + "can't get gpio %s ret %d", gpio_info->name, ret); + } + + ret = cnss_pinctrl_init(gpio_info, pdev); + if (ret) + pr_debug("%s: pinctrl init failed!\n", __func__); + + ret = cnss_wlan_gpio_init(gpio_info); + if (ret) + pr_err("gpio init failed\n"); + + return ret; +} + +static int cnss_get_wlan_bootstrap_gpio(struct platform_device *pdev) { int ret = 0; + struct device_node *node = (&pdev->dev)->of_node; + + if (!of_find_property(node, WLAN_BOOTSTRAP_GPIO_NAME, NULL)) + return ret; + + penv->wlan_bootstrap_gpio = + of_get_named_gpio(node, WLAN_BOOTSTRAP_GPIO_NAME, 0); + if (penv->wlan_bootstrap_gpio > 0) { + ret = cnss_wlan_bootstrap_gpio_init(); + } else { + ret = penv->wlan_bootstrap_gpio; + pr_err( + "%s: Can't get GPIO %s, ret = %d", + __func__, WLAN_BOOTSTRAP_GPIO_NAME, ret); + } + + return ret; +} + +static int cnss_wlan_get_resources(struct platform_device *pdev) +{ + int ret = 0; + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; - struct device_node *node = dev->of_node; + struct device_node *node = pdev->dev.of_node; if (of_get_property(node, WLAN_VREG_CORE_NAME "-supply", NULL)) { - vreg_info->wlan_reg_core = - regulator_get(dev, WLAN_VREG_CORE_NAME); + vreg_info->wlan_reg_core = regulator_get(&pdev->dev, + WLAN_VREG_CORE_NAME); if (IS_ERR(vreg_info->wlan_reg_core)) { ret = PTR_ERR(vreg_info->wlan_reg_core); @@ -736,7 +809,8 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) } if (of_get_property(node, WLAN_VREG_IO_NAME "-supply", NULL)) { - vreg_info->wlan_reg_io = regulator_get(dev, WLAN_VREG_IO_NAME); + vreg_info->wlan_reg_io = regulator_get(&pdev->dev, + WLAN_VREG_IO_NAME); if (!IS_ERR(vreg_info->wlan_reg_io)) { ret = regulator_set_voltage(vreg_info->wlan_reg_io, WLAN_VREG_IO_MIN, WLAN_VREG_IO_MAX); @@ -758,10 +832,10 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) } } - if (cnss_enable_xtal_ldo(dev)) + if (cnss_enable_xtal_ldo(pdev)) goto err_reg_xtal_enable; - vreg_info->wlan_reg = regulator_get(dev, WLAN_VREG_NAME); + vreg_info->wlan_reg = regulator_get(&pdev->dev, WLAN_VREG_NAME); if (IS_ERR(vreg_info->wlan_reg)) { if (PTR_ERR(vreg_info->wlan_reg) == -EPROBE_DEFER) @@ -781,7 +855,7 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) if (of_get_property(node, WLAN_VREG_SP2T_NAME "-supply", NULL)) { vreg_info->wlan_reg_sp2t = - regulator_get(dev, WLAN_VREG_SP2T_NAME); + regulator_get(&pdev->dev, WLAN_VREG_SP2T_NAME); if (!IS_ERR(vreg_info->wlan_reg_sp2t)) { ret = regulator_set_voltage(vreg_info->wlan_reg_sp2t, WLAN_VREG_SP2T_MIN, WLAN_VREG_SP2T_MAX); @@ -802,7 +876,7 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) if (of_get_property(node, WLAN_ANT_SWITCH_NAME "-supply", NULL)) { vreg_info->ant_switch = - regulator_get(dev, WLAN_ANT_SWITCH_NAME); + regulator_get(&pdev->dev, WLAN_ANT_SWITCH_NAME); if (!IS_ERR(vreg_info->ant_switch)) { ret = regulator_set_voltage(vreg_info->ant_switch, WLAN_ANT_SWITCH_VOLT_MIN, @@ -834,7 +908,8 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) penv->cap.cap_flag |= CNSS_HAS_UART_ACCESS; if (of_get_property(node, WLAN_SWREG_NAME "-supply", NULL)) { - vreg_info->soc_swreg = regulator_get(dev, WLAN_SWREG_NAME); + vreg_info->soc_swreg = regulator_get(&pdev->dev, + WLAN_SWREG_NAME); if (IS_ERR(vreg_info->soc_swreg)) { pr_err("%s: soc-swreg node not found\n", __func__); @@ -858,19 +933,36 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) penv->wlan_en_vreg_support = of_property_read_bool(node, "qcom,wlan-en-vreg-support"); if (penv->wlan_en_vreg_support) { - vreg_info->wlan_en_reg = regulator_get(dev, WLAN_EN_VREG_NAME); + vreg_info->wlan_en_reg = + regulator_get(&pdev->dev, WLAN_EN_VREG_NAME); if (IS_ERR(vreg_info->wlan_en_reg)) { pr_err("%s:wlan_en vreg get failed\n", __func__); ret = PTR_ERR(vreg_info->wlan_en_reg); goto err_wlan_en_reg_get; } - - ret = regulator_enable(vreg_info->wlan_en_reg); } + if (!penv->wlan_en_vreg_support) { + ret = cnss_get_wlan_enable_gpio(gpio_info, pdev); + if (ret) { + pr_err( + "%s:Failed to config the WLAN_EN gpio\n", __func__); + goto err_gpio_wlan_en; + } + } vreg_info->state = VREG_ON; + + ret = cnss_get_wlan_bootstrap_gpio(pdev); + if (ret) { + pr_err("%s: Failed to enable wlan bootstrap gpio\n", __func__); + goto err_gpio_wlan_bootstrap; + } + return ret; +err_gpio_wlan_bootstrap: + cnss_put_wlan_enable_gpio(); +err_gpio_wlan_en: err_wlan_en_reg_get: vreg_info->wlan_en_reg = NULL; if (vreg_info->soc_swreg) @@ -902,7 +994,7 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) err_reg_enable: regulator_put(vreg_info->wlan_reg); err_reg_get: - cnss_disable_xtal_ldo(); + cnss_disable_xtal_ldo(pdev); err_reg_xtal_enable: if (vreg_info->wlan_reg_io) @@ -926,15 +1018,15 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) static void cnss_wlan_release_resources(void) { + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; + if (penv->wlan_bootstrap_gpio > 0) + gpio_free(penv->wlan_bootstrap_gpio); + cnss_put_wlan_enable_gpio(); + gpio_info->state = WLAN_EN_LOW; + gpio_info->prop = false; cnss_wlan_vreg_set(vreg_info, VREG_OFF); - if (penv->wlan_en_vreg_support) { - if (vreg_info->wlan_en_reg) { - regulator_disable(vreg_info->wlan_en_reg); - regulator_put(vreg_info->wlan_en_reg); - } - } if (vreg_info->soc_swreg) regulator_put(vreg_info->soc_swreg); if (vreg_info->ant_switch) @@ -953,31 +1045,6 @@ static void cnss_wlan_release_resources(void) vreg_info->state = VREG_OFF; } -static int cnss_wlan_get_resources(struct platform_device *pdev) -{ - int ret = 0; - struct device *dev = &pdev->dev; - struct cnss_wlan_pinctrl *cnss_pinctrl = &penv->cnss_pinctrl; - - ret = cnss_wlan_enable_vreg_regulators(dev); - if (ret) { - pr_err("%s: failed to enable the vreg_regulators\n", __func__); - return ret; - } - - ret = cnss_pinctrl_init(cnss_pinctrl, dev); - if (ret) { - pr_err("%s: pinctrl init failed!\n", __func__); - goto err_pinctrl_init; - } - - return ret; - -err_pinctrl_init: - cnss_wlan_release_resources(); - return ret; -} - static u8 cnss_get_pci_dev_bus_number(struct pci_dev *pdev) { return pdev->bus->number; @@ -1550,7 +1617,6 @@ static int cnss_wlan_pci_probe(struct pci_dev *pdev, { int ret = 0; struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl = &penv->cnss_pinctrl; void *cpu_addr; dma_addr_t dma_handle; struct codeswap_codeseg_info *cnss_seg_info = NULL; @@ -1609,13 +1675,9 @@ static int cnss_wlan_pci_probe(struct pci_dev *pdev, penv->pcie_link_state = PCIE_LINK_DOWN; } - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - if (ret) { - pr_err("%s:Failed to enable wlan_en pin\n", __func__); - goto err_pcie_suspend; - } - + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); ret = cnss_wlan_vreg_set(vreg_info, VREG_OFF); + if (ret) { pr_err("can't turn off wlan vreg\n"); goto err_pcie_suspend; @@ -2206,7 +2268,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) int probe_again = 0; struct cnss_wlan_driver *wdrv; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; struct pci_dev *pdev; if (!penv) @@ -2214,7 +2276,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) wdrv = penv->driver; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; pdev = penv->pdev; if (!wdrv) { @@ -2230,11 +2292,15 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) pr_err("wlan vreg ON failed\n"); goto err_wlan_vreg_on; } + msleep(POWER_ON_DELAY); - ret = cnss_select_pinctrl_active(cnss_pinctrl, true); - if (ret) - pr_err("%s:Failed to set cnss pin active state\n", __func__); + if (penv->wlan_bootstrap_gpio > 0) { + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_HIGH); + msleep(WLAN_BOOTSTRAP_DELAY); + } + + cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); if (!pdev) { pr_debug("%s: invalid pdev. register pci device\n", __func__); @@ -2317,8 +2383,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) cnss_get_pci_dev_bus_number(pdev), pdev, PM_OPTIONS); penv->pcie_link_state = PCIE_LINK_DOWN; - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - msleep(WLAN_ENABLE_DELAY); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_vreg_set(vreg_info, VREG_OFF); msleep(POWER_ON_DELAY); probe_again++; @@ -2345,7 +2410,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) } err_pcie_reg: - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_vreg_set(vreg_info, VREG_OFF); if (penv->pdev) { pr_err("%d: Unregistering PCI device\n", __LINE__); @@ -2365,7 +2430,7 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver) { struct cnss_wlan_driver *wdrv; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; struct pci_dev *pdev; if (!penv) @@ -2373,7 +2438,7 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver) wdrv = penv->driver; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; pdev = penv->pdev; if (!wdrv) { @@ -2425,8 +2490,8 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver) cut_power: penv->driver = NULL; - if (cnss_select_pinctrl_active(cnss_pinctrl, false)) - pr_err("%s: Failed disable the wlan_en pin\n", __func__); + + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); if (cnss_wlan_vreg_set(vreg_info, VREG_OFF)) pr_err("wlan vreg OFF failed\n"); } @@ -2506,7 +2571,7 @@ static int cnss_shutdown(const struct subsys_desc *subsys, bool force_stop) struct cnss_wlan_driver *wdrv; struct pci_dev *pdev; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret = 0; if (!penv) @@ -2516,7 +2581,7 @@ static int cnss_shutdown(const struct subsys_desc *subsys, bool force_stop) wdrv = penv->driver; pdev = penv->pdev; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; if (!pdev) { ret = -EINVAL; @@ -2538,10 +2603,7 @@ static int cnss_shutdown(const struct subsys_desc *subsys, bool force_stop) } cut_power: - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - if (ret) - pr_err("%s:Failed to disable the wlan_en pin\n", __func__); - + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); if (cnss_wlan_vreg_set(vreg_info, VREG_OFF)) pr_err("cnss: Failed to set WLAN VREG_OFF!\n"); @@ -2553,7 +2615,7 @@ static int cnss_powerup(const struct subsys_desc *subsys) struct cnss_wlan_driver *wdrv; struct pci_dev *pdev; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret = 0; if (!penv) @@ -2565,7 +2627,7 @@ static int cnss_powerup(const struct subsys_desc *subsys) wdrv = penv->driver; pdev = penv->pdev; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; ret = cnss_wlan_vreg_set(vreg_info, VREG_ON); if (ret) { @@ -2574,11 +2636,7 @@ static int cnss_powerup(const struct subsys_desc *subsys) } msleep(POWER_ON_DELAY); - ret = cnss_select_pinctrl_active(cnss_pinctrl, true); - if (ret) { - pr_err("%s: Failed to enable wlan_en pin\n", __func__); - goto err_wlan_en_pin_set; - } + cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); if (!pdev) { pr_err("%d: invalid pdev\n", __LINE__); @@ -2637,9 +2695,8 @@ static int cnss_powerup(const struct subsys_desc *subsys) pdev, PM_OPTIONS); penv->pcie_link_state = PCIE_LINK_DOWN; -err_wlan_en_pin_set: err_pcie_link_up: - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_vreg_set(vreg_info, VREG_OFF); if (penv->pdev) { pr_err("%d: Unregistering pci device\n", __LINE__); @@ -2813,6 +2870,11 @@ static int cnss_probe(struct platform_device *pdev) penv->pldev = pdev; penv->esoc_desc = NULL; + penv->gpio_info.name = WLAN_EN_GPIO_NAME; + penv->gpio_info.num = 0; + penv->gpio_info.state = WLAN_EN_LOW; + penv->gpio_info.init = WLAN_EN_LOW; + penv->gpio_info.prop = false; penv->vreg_info.wlan_reg = NULL; penv->vreg_info.state = VREG_OFF; penv->pci_register_again = false; @@ -2821,6 +2883,12 @@ static int cnss_probe(struct platform_device *pdev) if (ret) goto err_get_wlan_res; + ret = cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); + if (ret) { + pr_err("%s: Failed to enable WLAN enable gpio\n", __func__); + goto err_get_rc; + } + ret = of_property_read_u32(dev->of_node, "qcom,wlan-rc-num", &rc_num); if (ret) { pr_err("%s: Failed to find PCIe RC number!\n", __func__); @@ -3014,7 +3082,7 @@ static int cnss_probe(struct platform_device *pdev) err_esoc_reg: err_pcie_enumerate: err_get_rc: - ret = cnss_select_pinctrl_active(&penv->cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_release_resources(); err_get_wlan_res: @@ -3045,7 +3113,9 @@ static int cnss_remove(struct platform_device *pdev) } } - cnss_select_pinctrl_active(&penv->cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); + if (penv->wlan_bootstrap_gpio > 0) + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_LOW); cnss_wlan_release_resources(); return 0; @@ -3519,11 +3589,11 @@ static struct pci_dev *__cnss_get_pcie_dev(struct device *dev) static int __cnss_pcie_power_up(struct device *dev) { struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; ret = cnss_wlan_vreg_set(vreg_info, VREG_ON); if (ret) { @@ -3533,27 +3603,27 @@ static int __cnss_pcie_power_up(struct device *dev) msleep(POWER_ON_DELAY); - ret = cnss_select_pinctrl_active(cnss_pinctrl, true); - if (ret) - pr_err("%s: Failed to select the default state\n", __func__); + if (penv->wlan_bootstrap_gpio > 0) { + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_HIGH); + msleep(WLAN_BOOTSTRAP_DELAY); + } - return ret; + cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); + return 0; } static int __cnss_pcie_power_down(struct device *dev) { struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - if (ret) { - pr_err("%s: Failed to select the default state\n", __func__); - return ret; - } + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); + if (penv->wlan_bootstrap_gpio > 0) + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_LOW); ret = cnss_wlan_vreg_set(vreg_info, VREG_OFF); if (ret) From f58c417b344e3d09441c77d1cd5e07e4741e0c16 Mon Sep 17 00:00:00 2001 From: Arun Kumar Neelakantam Date: Wed, 24 Aug 2016 10:59:25 +0530 Subject: [PATCH 0014/1015] ARM: dts: msm: Add BAM DMUX no-cpu-affinity for MSM8917 BAM DMUX work queue is bound to CPU0 to support the network stack requirements to avoid the out of order packet issue. If CPU0 is busy by other high priority works then bounding workqueue to CPU0 is causing delay in BAM DMUX work queue. so Remove the CPU affinity to let the scheduler to decide the CPU for BAM DMUX work queue and enabling the RPS feature in network stack to support out of order packet issue. CRs-Fixed: 1058818 Change-Id: I1eafb0f42333f5ff3917af0ee3025e670a447897 Signed-off-by: Arun Kumar Neelakantam --- arch/arm/boot/dts/qcom/msm8917.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index 9d28c350da9d7..f739faffcb6b0 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -1345,6 +1345,7 @@ qcom,rx-ring-size = <32>; qcom,max-rx-mtu = <4096>; qcom,fast-shutdown; + qcom,no-cpu-affinity; }; sdcc1_ice: sdcc1ice@7803000 { From eb9bb6b78c108acb4d89c261f6b2e1341500dbca Mon Sep 17 00:00:00 2001 From: Ramesh V Date: Wed, 24 Aug 2016 18:24:18 +0530 Subject: [PATCH 0015/1015] msm: camera: isp: check stream state before accessing lock Issue: When VFE fatal occurs stream state set as inactive, so all the stream info parameters are zero after that it's trying access the stream info lock which zero hence it leads spinlock bad magic. Resolution: check stream state before accessing stream_info parameters. CRs-Fixed: 1048053 Change-Id: I2cee1848c3862d0fa8439c8a9c6bb2a72315e9e0 Signed-off-by: Ramesh V --- drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index f3a6e6c074a43..ea7e70e9d6be3 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -1462,6 +1462,8 @@ void msm_isp_axi_cfg_update(struct vfe_device *vfe_dev, } num_stream++; stream_info = &axi_data->stream_info[i]; + if (stream_info->state == INACTIVE) + continue; if ((stream_info->stream_type == BURST_STREAM && !stream_info->controllable_output) || stream_info->state == AVAILABLE) From d54f781b8874b97d2330f72a587d9abb70df30d0 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Thu, 18 Aug 2016 10:49:54 +0530 Subject: [PATCH 0016/1015] clk: msm: clock-cpu: Add panic handler to dump cpu frequency CPU clock frequency is required to be dumped when the device panics, add a panic notifier to dump the cached clock frequency. CRs-Fixed: 1050919 Change-Id: Ic5da44660f8a5356eb539113c50405ba84ace049 Signed-off-by: Odelu Kukatla --- drivers/clk/msm/clock-cpu-8939.c | 42 ++++++++++++++++++++++++++++++++ drivers/clk/msm/clock-cpu-8953.c | 31 +++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/drivers/clk/msm/clock-cpu-8939.c b/drivers/clk/msm/clock-cpu-8939.c index 66ebeb5ba8cb2..bdafa0cb9f388 100644 --- a/drivers/clk/msm/clock-cpu-8939.c +++ b/drivers/clk/msm/clock-cpu-8939.c @@ -700,6 +700,45 @@ static struct notifier_block clock_8939_pm_notifier_single_cluster = { .notifier_call = clock_8939_pm_event_single_cluster, }; +/** + * clock_panic_callback() - panic notification callback function. + * This function is invoked when a kernel panic occurs. + * @nfb: Notifier block pointer + * @event: Value passed unmodified to notifier function + * @data: Pointer passed unmodified to notifier function + * + * Return: NOTIFY_OK + */ +static int clock_panic_callback(struct notifier_block *nfb, + unsigned long event, void *data) +{ + bool single_cluster = 0; + unsigned long rate; + struct device_node *ofnode = of_find_compatible_node(NULL, NULL, + "qcom,cpu-clock-8939"); + if (!ofnode) + ofnode = of_find_compatible_node(NULL, NULL, + "qcom,cpu-clock-8917"); + if (ofnode) + single_cluster = of_property_read_bool(ofnode, + "qcom,num-cluster"); + + rate = (a53_bc_clk.c.count) ? a53_bc_clk.c.rate : 0; + pr_err("%s frequency: %10lu Hz\n", a53_bc_clk.c.dbg_name, rate); + + if (!single_cluster) { + rate = (a53_lc_clk.c.count) ? a53_lc_clk.c.rate : 0; + pr_err("%s frequency: %10lu Hz\n", a53_lc_clk.c.dbg_name, rate); + } + + return NOTIFY_OK; +} + +static struct notifier_block clock_panic_notifier = { + .notifier_call = clock_panic_callback, + .priority = 1, +}; + static int clock_a53_probe(struct platform_device *pdev) { int speed_bin, version, rc, cpu, mux_id, rate; @@ -798,6 +837,9 @@ static int clock_a53_probe(struct platform_device *pdev) populate_opp_table(pdev, single_cluster); + atomic_notifier_chain_register(&panic_notifier_list, + &clock_panic_notifier); + return 0; } diff --git a/drivers/clk/msm/clock-cpu-8953.c b/drivers/clk/msm/clock-cpu-8953.c index dc495721b9f00..83cd882971d19 100644 --- a/drivers/clk/msm/clock-cpu-8953.c +++ b/drivers/clk/msm/clock-cpu-8953.c @@ -753,6 +753,34 @@ static int cpu_parse_devicetree(struct platform_device *pdev) return 0; } +/** + * clock_panic_callback() - panic notification callback function. + * This function is invoked when a kernel panic occurs. + * @nfb: Notifier block pointer + * @event: Value passed unmodified to notifier function + * @data: Pointer passed unmodified to notifier function + * + * Return: NOTIFY_OK + */ +static int clock_panic_callback(struct notifier_block *nfb, + unsigned long event, void *data) +{ + unsigned long rate; + + rate = (a53_perf_clk.c.count) ? a53_perf_clk.c.rate : 0; + pr_err("%s frequency: %10lu Hz\n", a53_perf_clk.c.dbg_name, rate); + + rate = (a53_pwr_clk.c.count) ? a53_pwr_clk.c.rate : 0; + pr_err("%s frequency: %10lu Hz\n", a53_pwr_clk.c.dbg_name, rate); + + return NOTIFY_OK; +} + +static struct notifier_block clock_panic_notifier = { + .notifier_call = clock_panic_callback, + .priority = 1, +}; + static int clock_cpu_probe(struct platform_device *pdev) { int speed_bin, version, rc, cpu, mux_id; @@ -875,6 +903,9 @@ static int clock_cpu_probe(struct platform_device *pdev) a53_perf_clk.hw_low_power_ctrl = true; } + atomic_notifier_chain_register(&panic_notifier_list, + &clock_panic_notifier); + return 0; } From 663804dea018eeb188a245683cea08ea8b9defe2 Mon Sep 17 00:00:00 2001 From: Shiraz Hashim Date: Tue, 23 Aug 2016 08:25:37 +0530 Subject: [PATCH 0017/1015] soc: qcom: protect kernel text from other bus masters Add provision to enable mpu based kernel text region protection from other bus masters so that they cannot over-write kernel code. Since this is mpu based, any write access to kernel text region by other masters (than cpu) would result into a bus error. Change-Id: I026590cb68d03dd74662efeb61c77f76e0d8060f Signed-off-by: Shiraz Hashim --- drivers/soc/qcom/Kconfig | 14 +++++++++++- drivers/soc/qcom/kernel_protect.c | 38 +++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig index 1dbc2efa2b8ca..b6952f5bfd4e0 100644 --- a/drivers/soc/qcom/Kconfig +++ b/drivers/soc/qcom/Kconfig @@ -782,7 +782,7 @@ config MSM_PACMAN peripheral (BLSP) ownership. config MSM_KERNEL_PROTECT - bool "Protect kernel text by removing write permissions in stage-2" + bool "Protect kernel text by removing write permissions" depends on !FUNCTION_TRACER help On hypervisor-enabled targets, this option will make a call into @@ -795,6 +795,18 @@ config MSM_KERNEL_PROTECT aarch64_insn_patch_text_nosync, etc. including the various CPU errata workarounds in arch/arm64/kernel/cpu_errata.c). + For MPU based protection-enabled targets please refer to + MSM_KERNEL_PROTECT_MPU + +config MSM_KERNEL_PROTECT_MPU + bool "Protect kernel text from other masters by MPU" + depends on MSM_KERNEL_PROTECT + help + On MPU based protection enabled targets, this option will make a call + into TrustZone to request that the kernel text be ptotected for any + write access from external bus masters. This protects against + malicious devices rewriting kernel code. + config MSM_KERNEL_PROTECT_TEST bool "Bootup test of kernel protection (INTENTIONAL CRASH)" depends on MSM_KERNEL_PROTECT diff --git a/drivers/soc/qcom/kernel_protect.c b/drivers/soc/qcom/kernel_protect.c index 7319297185c50..b48cd0bfc423c 100644 --- a/drivers/soc/qcom/kernel_protect.c +++ b/drivers/soc/qcom/kernel_protect.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015,2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,10 +14,12 @@ #include #include #include +#include #include #include #include +#define KERNEL_PROTECT_MPU 0x24 #ifdef CONFIG_MSM_KERNEL_PROTECT_TEST @@ -38,6 +40,10 @@ static void msm_protect_kernel_test(void) */ char *addr = (char *)__alloc_pages_nodemask; + if (IS_ENABLED(CONFIG_MSM_KERNEL_PROTECT_MPU)) { + pr_err("MPU protected kernel code is HLOS writable\n"); + return; + } pr_err("Checking whether the kernel text is writable...\n"); pr_err("A BUG means it is writable (this is bad)\n"); pr_err("A stage-2 fault means it's not writable (this is good, but we'll still crash)\n"); @@ -84,9 +90,33 @@ static int __init msm_protect_kernel(void) pr_debug("assigning from phys: %pa to %pa\n", &kernel_x_start_rounded, &kernel_x_end); pr_debug("virtual: %p to %p\n", virt_start, virt_end); - ret = hyp_assign_phys(kernel_x_start_rounded, - kernel_x_end - kernel_x_start_rounded, - &vmid_hlos, 1, &vmid_hlos, &dest_perms, 1); + + if (IS_ENABLED(CONFIG_MSM_KERNEL_PROTECT_MPU)) { + struct scm_desc desc = {0}; + + if (!scm_is_call_available(SCM_SVC_MP, KERNEL_PROTECT_MPU)) + return 0; + + desc.args[0] = kernel_x_start_rounded; + desc.args[1] = kernel_x_end - kernel_x_start_rounded; + desc.arginfo = SCM_ARGS(2); + + ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, + KERNEL_PROTECT_MPU), &desc); + if (ret) { + /* + * must not proceed if failed to MPU protect kernel + * text region + */ + panic("Failed to protect kernel region %pa -- %pa\n", + &kernel_x_start_rounded, + &kernel_x_end); + } + } else { + ret = hyp_assign_phys(kernel_x_start_rounded, + kernel_x_end - kernel_x_start_rounded, + &vmid_hlos, 1, &vmid_hlos, &dest_perms, 1); + } if (ret) /* * We want to fail relatively silently since not all From c4c4208528dd3992b317ca091efe6c8cca6412b3 Mon Sep 17 00:00:00 2001 From: Shiraz Hashim Date: Tue, 23 Aug 2016 08:39:02 +0530 Subject: [PATCH 0018/1015] defconfig: msm: Enable mpu based kernel text protection Enable mpu based kernel text region protection for msm8917, msm8937, msm8940 and msm8953. This would ensure that any other master (than cpu) would not be able to over-write kernel code. Change-Id: Ib4190756987ae21dbca3dde05f47f9d9fa0319cc Signed-off-by: Shiraz Hashim --- arch/arm/configs/msm8937-perf_defconfig | 2 ++ arch/arm/configs/msm8937_defconfig | 2 ++ arch/arm/configs/msmcortex-perf_defconfig | 2 ++ arch/arm/configs/msmcortex_defconfig | 2 ++ arch/arm64/configs/msm8937-perf_defconfig | 2 ++ arch/arm64/configs/msm8937_defconfig | 2 ++ arch/arm64/configs/msmcortex-perf_defconfig | 2 ++ arch/arm64/configs/msmcortex_defconfig | 2 ++ 8 files changed, 16 insertions(+) diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index dd0494c4acebe..32bb99d0f014b 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -551,6 +551,8 @@ CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index 27925a7386a78..3941f1a8c56e3 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -560,6 +560,8 @@ CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index 4b3ac783cc586..9d7323a55274d 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -543,6 +543,8 @@ CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index 1bd8196e0b897..798862213c371 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -547,6 +547,8 @@ CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index ec6f788e1dabc..a0ac69be3c8e4 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -555,6 +555,8 @@ CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 0b9811eb76fa6..9a68b72d2f692 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -562,6 +562,8 @@ CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index 359a66a234099..a812d141dcd9d 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -556,6 +556,8 @@ CONFIG_ICNSS=y CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index 91efcd9ac0457..f8a821c40f852 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -573,6 +573,8 @@ CONFIG_ICNSS=y CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y From 0982e37517835ef67023ebb1948e03f8899d4639 Mon Sep 17 00:00:00 2001 From: Kui Wang Date: Wed, 30 Mar 2016 21:12:02 +0800 Subject: [PATCH 0019/1015] ARM: dts: msm: add camera dtsi for 8917 TMO Add camera dtsi for 8917 TMO. That includes front/rear sensor dtsi, actuator dtsi and new pinctrl definition. CRs-Fixed: 1060391 Change-Id: I2e6a8b2a5657d4f5ee5e54afeaa858d09ccc9cac Signed-off-by: Kui Wang Signed-off-by: Lei Yuan Signed-off-by: Kui Wang --- .../dts/qcom/msm8917-camera-sensor-tmo.dtsi | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi new file mode 100644 index 0000000000000..c2b0f580dcd20 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +&tlmm{ + cam_sensor_rear_vreg_default: cam_sensor_rear_vreg_default { + /* VDIG */ + mux { + pins = "gpio62","gpio68","gpio129"; + function = "gpio"; + }; + + config { + pins = "gpio62","gpio68","gpio129"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_rear_vreg_sleep: cam_sensor_rear_vreg_sleep { + /* VDIG */ + mux { + pins = "gpio62","gpio68","gpio129"; + function = "gpio"; + }; + + config { + pins = "gpio62","gpio68","gpio129"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_front_vreg_default: cam_sensor_front_vreg_default { + /* VDIG */ + mux { + pins = "gpio96"; + function = "gpio"; + }; + + config { + pins = "gpio96"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_front_vreg_sleep: cam_sensor_front_vreg_sleep { + /* VDIG */ + mux { + pins = "gpio96"; + function = "gpio"; + }; + + config { + pins = "gpio96"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; +}; + +&cci { + actuator0: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + qcom,cci-master = <0>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + + qcom,camera@0 { + cell-index = <0>; + compatible = "qcom,camera"; + reg = <0x0>; + qcom,csiphy-sd-index = <0>; + qcom,csid-sd-index = <0>; + qcom,mount-angle = <90>; + qcom,actuator-src = <&actuator0>; + qcom,led-flash-src = <&led_flash0>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 0 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default + &cam_sensor_rear_vreg_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep + &cam_sensor_rear_sleep + &cam_sensor_rear_vreg_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 36 0>, + <&tlmm 35 0>, + <&tlmm 68 0>, + <&tlmm 62 0>, + <&tlmm 129 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-vio = <3>; + qcom,gpio-vdig = <4>; + qcom,gpio-vana = <5>; + qcom,gpio-req-tbl-num = <0 1 2 3 4 5>; + qcom,gpio-req-tbl-flags = <1 0 0 0 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0", + "CAM_GPIO_VIO", + "CAM_GPIO_VDIG", + "CAM_GPIO_VANA"; + qcom,sensor-position = <0>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + }; + + qcom,camera@2 { + cell-index = <2>; + compatible = "qcom,camera"; + reg = <0x01>; + qcom,csiphy-sd-index = <1>; + qcom,csid-sd-index = <1>; + qcom,mount-angle = <270>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 0 2800000>; + qcom,cam-vreg-max-voltage = <1200000 0 2800000>; + qcom,cam-vreg-op-mode = <105000 0 80000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default + &cam_sensor_front_vreg_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep + &cam_sensor_front_vreg_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>, + <&tlmm 96 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-vana = <3>; + qcom,gpio-req-tbl-num = <0 1 2 3>; + qcom,gpio-req-tbl-flags = <1 0 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2", + "CAM_GPIO_VANA"; + qcom,sensor-position = <1>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + }; +}; From 9349dd612acc6a636e905cad23127d4bbd492460 Mon Sep 17 00:00:00 2001 From: Ashwanth Goli Date: Fri, 26 Aug 2016 15:03:49 +0530 Subject: [PATCH 0020/1015] rmnet_data: Changing format specifier to %pK Using %pK instead of %p to hide kernel pointers based on kptr_restrict. Change-Id: I065cff2a9e092d74d0e8c35da6551fab3805e83e Signed-off-by: Ashwanth Goli --- net/rmnet_data/rmnet_data_vnd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/rmnet_data/rmnet_data_vnd.c b/net/rmnet_data/rmnet_data_vnd.c index 4b0b2de1c850a..f284f90654e91 100644 --- a/net/rmnet_data/rmnet_data_vnd.c +++ b/net/rmnet_data/rmnet_data_vnd.c @@ -929,7 +929,7 @@ int rmnet_vnd_add_tc_flow(uint32_t id, uint32_t map_flow, uint32_t tc_flow) list_add(&(itm->list), &(dev_conf->flow_head)); write_unlock_irqrestore(&dev_conf->flow_map_lock, flags); - LOGD("Created flow mapping [%s][0x%08X][0x%08X]@%p", + LOGD("Created flow mapping [%s][0x%08X][0x%08X]@%pK", dev->name, itm->map_flow_id, itm->tc_flow_id[0], itm); return RMNET_CONFIG_OK; From 8834541c51a8ea7b90a084cdd7c4e298cd549b21 Mon Sep 17 00:00:00 2001 From: Devi Sandeep Endluri V V Date: Sun, 28 Aug 2016 13:26:30 +0530 Subject: [PATCH 0021/1015] defconfig: Enabling config INET_DIAG_DESTROY Sockets that are opened before VPN is connected are supposed to be destroyed once it is connected. VPN related CTS testcases are failing without the ability to destroy sockets. Enabling INET_DIAG_DESTROY to fix these testcases. CRs-Fixed: 1043997 Change-Id: Id816c21edcb6a7e76d9b39cea66ea1201bae8739 Signed-off-by: Devi Sandeep Endluri V V --- arch/arm/configs/msm8937-perf_defconfig | 1 + arch/arm/configs/msm8937_defconfig | 1 + arch/arm/configs/msmcortex-perf_defconfig | 1 + arch/arm/configs/msmcortex_defconfig | 1 + arch/arm64/configs/msm8937-perf_defconfig | 1 + arch/arm64/configs/msm8937_defconfig | 1 + arch/arm64/configs/msmcortex-perf_defconfig | 1 + arch/arm64/configs/msmcortex_defconfig | 1 + 8 files changed, 8 insertions(+) diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index dd0494c4acebe..11e8df46bdfff 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -96,6 +96,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index 27925a7386a78..8d5cf9393e610 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -97,6 +97,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index 4b3ac783cc586..3275b16b63161 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -93,6 +93,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index 1bd8196e0b897..071d7cad253e9 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -91,6 +91,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index ec6f788e1dabc..e147fc6c8442c 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -94,6 +94,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 0b9811eb76fa6..78a476e3a3829 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -93,6 +93,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index 359a66a234099..3f74eb0d84537 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -92,6 +92,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index 91efcd9ac0457..edefbddfef22f 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -91,6 +91,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y From e51768797203087988ee35d21f3ccf7c89be4bf9 Mon Sep 17 00:00:00 2001 From: Ashwanth Goli Date: Tue, 23 Aug 2016 12:23:11 +0530 Subject: [PATCH 0022/1015] defconfig: Enabling config INET_DIAG_DESTROY Sockets that are opened before VPN is connected are supposed to be destroyed once it is connected. VPN related CTS testcases are failing without the ability to destroy sockets. Enabling INET_DIAG_DESTROY to fix these testcases. Change-Id: Iad01cb10faa892897f180ad217b27a56c2da89b5 Signed-off-by: Ashwanth Goli --- arch/arm64/configs/msm-perf_defconfig | 1 + arch/arm64/configs/msm_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/msm-perf_defconfig b/arch/arm64/configs/msm-perf_defconfig index f3f0bf7d2a087..129133b539a4d 100644 --- a/arch/arm64/configs/msm-perf_defconfig +++ b/arch/arm64/configs/msm-perf_defconfig @@ -87,6 +87,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index ba3cd11a029af..f5dc15b8a1ed6 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -88,6 +88,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y From 2b617ab6f7cdfae849facb98d33a0b2156c213b3 Mon Sep 17 00:00:00 2001 From: Maulik Shah Date: Tue, 10 May 2016 17:25:11 +0530 Subject: [PATCH 0023/1015] soc: qcom: rpm-smd: wait till all active set acks are cleared Wait till all pending acks are receivied for active set messages before lpm driver choose to enter rpm assisted pc. Change-Id: Ifefb9f3ae88d890e64e7e123e0fcedc00aea719c Signed-off-by: Maulik Shah --- drivers/soc/qcom/rpm-smd.c | 33 ++++----------------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/drivers/soc/qcom/rpm-smd.c b/drivers/soc/qcom/rpm-smd.c index 209e5c64c8cc5..bb0be81d7e9f5 100644 --- a/drivers/soc/qcom/rpm-smd.c +++ b/drivers/soc/qcom/rpm-smd.c @@ -523,7 +523,6 @@ static int msm_rpm_read_sleep_ack(void) { int ret; char buf[MAX_ERR_BUFFER_SIZE] = {0}; - uint32_t msg_id; if (glink_enabled) ret = msm_rpm_glink_rx_poll(glink_data->glink_handle); @@ -554,38 +553,18 @@ static int msm_rpm_read_sleep_ack(void) return -EAGAIN; ret = msm_rpm_read_smd_data(buf); - if (!ret) { - /* Mimic Glink behavior to ensure that the - * data is read and the msg is removed from - * the wait list. We should have gotten here - * only when there are no drivers waiting on - * ACKs. msm_rpm_get_entry_from_msg_id() - * return non-NULL only then. - */ - msg_id = msm_rpm_get_msg_id_from_ack(buf); - msm_rpm_process_ack(msg_id, 0); + if (!ret) ret = smd_is_pkt_avail(msm_rpm_data.ch_info); - } } return ret; } -static void msm_rpm_flush_noack_messages(void) -{ - while (!list_empty(&msm_rpm_wait_list)) { - if (!msm_rpm_read_sleep_ack()) - break; - } -} - static int msm_rpm_flush_requests(bool print) { struct rb_node *t; int ret; int count = 0; - msm_rpm_flush_noack_messages(); - for (t = rb_first(&tr_root); t; t = rb_next(t)) { struct slp_buf *s = rb_entry(t, struct slp_buf, node); @@ -844,18 +823,14 @@ static void msm_rpm_notify(void *data, unsigned event) bool msm_rpm_waiting_for_ack(void) { - bool ret = false; + bool ret; unsigned long flags; - struct msm_rpm_wait_data *elem = NULL; spin_lock_irqsave(&msm_rpm_list_lock, flags); - elem = list_first_entry_or_null(&msm_rpm_wait_list, - struct msm_rpm_wait_data, list); - if (elem) - ret = !elem->delete_on_ack; + ret = list_empty(&msm_rpm_wait_list); spin_unlock_irqrestore(&msm_rpm_list_lock, flags); - return ret; + return !ret; } static struct msm_rpm_wait_data *msm_rpm_get_entry_from_msg_id(uint32_t msg_id) From eb267497ef8a0a6327fefd81161366477394c570 Mon Sep 17 00:00:00 2001 From: Alok Kediya Date: Tue, 2 Aug 2016 10:50:09 +0530 Subject: [PATCH 0024/1015] msm: ispif: change error message to ratelimited. Change the error messages to rate limited since causing watchdog bark. Change-Id: I368e5477705f4b2b2f77b73890da811ddf16159b Signed-off-by: Alok Kediya --- drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c index a01dc9f04307e..97a003b2eae1f 100644 --- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c +++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c @@ -1320,7 +1320,8 @@ static inline void msm_ispif_read_irq_status(struct ispif_irq_status *out, } if (fatal_err == true) { - pr_err("%s: fatal error, stop ispif immediately\n", __func__); + pr_err_ratelimited("%s: fatal error, stop ispif immediately\n", + __func__); for (i = 0; i < ispif->vfe_info.num_vfe; i++) { msm_camera_io_w(ISPIF_STOP_INTF_IMMEDIATELY, ispif->base + ISPIF_VFE_m_INTF_CMD_0(i)); From 37e98ce52fbe9324a230f59cf7885a62b1d6f54a Mon Sep 17 00:00:00 2001 From: Ray Zhang Date: Tue, 9 Aug 2016 19:50:13 +0800 Subject: [PATCH 0025/1015] ARM: dts: msm: Add hx8394f panel support for MSM8940 QRD SKU7 MSM8940 QRD SKU7 board plan to change from PMI8950 to PMI8940, and this board uses hx8394f as its DDIC, so add support for it. Change-Id: I36d2e1b323195782c01c2dc56909646223c869b6 Signed-off-by: Ray Zhang --- .../dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi b/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi index 965673222a11b..0b258e4f75325 100644 --- a/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi @@ -153,3 +153,43 @@ }; }; +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + /delete-property/ lab-supply; + /delete-property/ ibb-supply; + /delete-property/ qcom,platform-te-gpio; + + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,platform-reset-gpio = <&tlmm 60 0>; +}; + +&mdss_dsi1 { + status = "disabled"; +}; + +&labibb { + status = "disabled"; +}; + +&dsi_panel_pwr_supply { + /delete-node/ qcom,panel-supply-entry@2; + /delete-node/ qcom,panel-supply-entry@3; +}; + +&dsi_hx8394f_720p_video { + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; From 03c0b3708fd090b9667cebab299d8f136e724613 Mon Sep 17 00:00:00 2001 From: Ashish Garg Date: Thu, 25 Aug 2016 12:07:04 +0530 Subject: [PATCH 0026/1015] msm: mdss: confiure the dynamic fps correctly Dynamic fps should be set to max fps supported if it is out of range. Configure the clocks based on the max fps set. Change-Id: Ied2d4803c0840be00929b7093601aab39930b3e9 Signed-off-by: Ashish Garg --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index d71622372e192..25de560ed386e 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -2950,6 +2950,7 @@ int mdss_mdp_dfps_update_params(struct msm_fb_data_type *mfd, pr_warn("Unsupported FPS. Configuring to max_fps = %d\n", pdata->panel_info.max_fps); dfps = pdata->panel_info.max_fps; + dfps_data->fps = dfps; } dfps_update_panel_params(pdata, dfps_data); From 04db07749f8ce15363f5ae0244a86db2cc43422b Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Fri, 14 Nov 2014 11:37:34 +0100 Subject: [PATCH 0027/1015] ARM: 8203/1: mm: try to re-use old ASID assignments following a rollover Rather than unconditionally allocating a fresh ASID to an mm from an older generation, attempt to re-use the old assignment where possible. This can bring performance benefits on systems where the ASID is used to tag things other than the TLB (e.g. branch prediction resources). Change-Id: Ia90030a35b96ea6f926150aa48dfd11d886b2ecb Acked-by: Catalin Marinas Signed-off-by: Will Deacon Signed-off-by: Russell King Git-commit: a391263cd84e6ae2da26a54383f3abf80c18d9df Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Signed-off-by: Vinayak Menon --- arch/arm/mm/context.c | 58 +++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 8d676f842d61d..639042c4edb58 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c @@ -182,36 +182,46 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu) u64 asid = atomic64_read(&mm->context.id); u64 generation = atomic64_read(&asid_generation); - if (asid != 0 && is_reserved_asid(asid)) { + if (asid != 0) { /* - * Our current ASID was active during a rollover, we can - * continue to use it and this was just a false alarm. + * If our current ASID was active during a rollover, we + * can continue to use it and this was just a false alarm. */ - asid = generation | (asid & ~ASID_MASK); - } else { + if (is_reserved_asid(asid)) + return generation | (asid & ~ASID_MASK); + /* - * Allocate a free ASID. If we can't find one, take a - * note of the currently active ASIDs and mark the TLBs - * as requiring flushes. We always count from ASID #1, - * as we reserve ASID #0 to switch via TTBR0 and to - * avoid speculative page table walks from hitting in - * any partial walk caches, which could be populated - * from overlapping level-1 descriptors used to map both - * the module area and the userspace stack. + * We had a valid ASID in a previous life, so try to re-use + * it if possible., */ - asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, cur_idx); - if (asid == NUM_USER_ASIDS) { - generation = atomic64_add_return(ASID_FIRST_VERSION, - &asid_generation); - flush_context(cpu); - asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, 1); - } - __set_bit(asid, asid_map); - cur_idx = asid; - asid |= generation; - cpumask_clear(mm_cpumask(mm)); + asid &= ~ASID_MASK; + if (!__test_and_set_bit(asid, asid_map)) + goto bump_gen; + } + + /* + * Allocate a free ASID. If we can't find one, take a note of the + * currently active ASIDs and mark the TLBs as requiring flushes. + * We always count from ASID #1, as we reserve ASID #0 to switch + * via TTBR0 and to avoid speculative page table walks from hitting + * in any partial walk caches, which could be populated from + * overlapping level-1 descriptors used to map both the module + * area and the userspace stack. + */ + asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, cur_idx); + if (asid == NUM_USER_ASIDS) { + generation = atomic64_add_return(ASID_FIRST_VERSION, + &asid_generation); + flush_context(cpu); + asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, 1); } + __set_bit(asid, asid_map); + cur_idx = asid; + +bump_gen: + asid |= generation; + cpumask_clear(mm_cpumask(mm)); return asid; } From 26f2be7d2ada29d0dae95a19588e8a1956deef02 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Wed, 2 Dec 2015 14:31:25 +0100 Subject: [PATCH 0028/1015] ARM: 8465/1: mm: keep reserved ASIDs in sync with mm after multiple rollovers Under some unusual context-switching patterns, it is possible to end up with multiple threads from the same mm running concurrently with different ASIDs: 1. CPU x schedules task t with mm p containing ASID a and generation g This task doesn't block and the CPU doesn't context switch. So: * per_cpu(active_asid, x) = {g,a} * p->context.id = {g,a} 2. Some other CPU generates an ASID rollover. The global generation is now (g + 1). CPU x is still running t, with no context switch and so per_cpu(reserved_asid, x) = {g,a} 3. CPU y schedules task t', which shares mm p with t. The generation mismatches, so we take the slowpath and hit the reserved ASID from CPU x. p is then updated so that p->context.id = {g + 1,a} 4. CPU y schedules some other task u, which has an mm != p. 5. Some other CPU generates *another* CPU rollover. The global generation is now (g + 2). CPU x is still running t, with no context switch and so per_cpu(reserved_asid, x) = {g,a}. 6. CPU y once again schedules task t', but now *fails* to hit the reserved ASID from CPU x because of the generation mismatch. This results in a new ASID being allocated, despite the fact that t is still running on CPU x with the same mm. Consequently, TLBIs (e.g. as a result of CoW) will not be synchronised between the two threads. This patch fixes the problem by updating all of the matching reserved ASIDs when we hit on the slowpath (i.e. in step 3 above). This keeps the reserved ASIDs in-sync with the mm and avoids the problem. Change-Id: I058871ad28d05145decd658ea48065f5abdbcfc8 Cc: Reported-by: Tony Thompson Reviewed-by: Catalin Marinas Signed-off-by: Will Deacon Signed-off-by: Russell King Git-commit: 40ee068ec09b2d98162da5ea18b7c6fdbaa2bb71 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Signed-off-by: Vinayak Menon --- arch/arm/mm/context.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 639042c4edb58..c82b65ea71ee8 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c @@ -167,13 +167,28 @@ static void flush_context(unsigned int cpu) __flush_icache_all(); } -static int is_reserved_asid(u64 asid) +static bool check_update_reserved_asid(u64 asid, u64 newasid) { int cpu; - for_each_possible_cpu(cpu) - if (per_cpu(reserved_asids, cpu) == asid) - return 1; - return 0; + bool hit = false; + + /* + * Iterate over the set of reserved ASIDs looking for a match. + * If we find one, then we can update our mm to use newasid + * (i.e. the same ASID in the current generation) but we can't + * exit the loop early, since we need to ensure that all copies + * of the old ASID are updated to reflect the mm. Failure to do + * so could result in us missing the reserved ASID in a future + * generation. + */ + for_each_possible_cpu(cpu) { + if (per_cpu(reserved_asids, cpu) == asid) { + hit = true; + per_cpu(reserved_asids, cpu) = newasid; + } + } + + return hit; } static u64 new_context(struct mm_struct *mm, unsigned int cpu) @@ -183,12 +198,14 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu) u64 generation = atomic64_read(&asid_generation); if (asid != 0) { + u64 newasid = generation | (asid & ~ASID_MASK); + /* * If our current ASID was active during a rollover, we * can continue to use it and this was just a false alarm. */ - if (is_reserved_asid(asid)) - return generation | (asid & ~ASID_MASK); + if (check_update_reserved_asid(asid, newasid)) + return newasid; /* * We had a valid ASID in a previous life, so try to re-use @@ -196,7 +213,7 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu) */ asid &= ~ASID_MASK; if (!__test_and_set_bit(asid, asid_map)) - goto bump_gen; + return newasid; } /* @@ -218,11 +235,8 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu) __set_bit(asid, asid_map); cur_idx = asid; - -bump_gen: - asid |= generation; cpumask_clear(mm_cpumask(mm)); - return asid; + return asid | generation; } void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk) From 07616974315b9d671acb74ea3dfe3888897e7aba Mon Sep 17 00:00:00 2001 From: Ashwanth Goli Date: Tue, 23 Aug 2016 12:23:11 +0530 Subject: [PATCH 0029/1015] defconfig: Enabling config INET_DIAG_DESTROY Sockets that are opened before VPN is connected are supposed to be destroyed once it is connected. VPN related CTS testcases are failing without the ability to destroy sockets. Enabling INET_DIAG_DESTROY to fix these testcases. Change-Id: Iad01cb10faa892897f180ad217b27a56c2da89b5 Signed-off-by: Ashwanth Goli --- arch/arm64/configs/msm-perf_defconfig | 1 + arch/arm64/configs/msm_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/msm-perf_defconfig b/arch/arm64/configs/msm-perf_defconfig index f3f0bf7d2a087..129133b539a4d 100644 --- a/arch/arm64/configs/msm-perf_defconfig +++ b/arch/arm64/configs/msm-perf_defconfig @@ -87,6 +87,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index ba3cd11a029af..f5dc15b8a1ed6 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -88,6 +88,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y From c5a72a96c358a6d31cfc7d7df387dced13c19f78 Mon Sep 17 00:00:00 2001 From: Hardik Kantilal Patel Date: Fri, 26 Aug 2016 12:23:40 +0530 Subject: [PATCH 0030/1015] Revert "ARM: dts: msm: Remove unused gpio from msm8996 DT" This reverts commit <8133442e016da3518fb752b55624fcfd9bea311d>. After applying pinctrl sleep configuration for QCA6174, QCA6174 chip is not coming into proper power state which result stability issue. To avoid crash adding gpio node in DT. Change-Id: I8197c0193d3327355224e026a18ba1d7ed5a8257 CRs-Fixed: 1059765 Signed-off-by: Hardik Kantilal Patel --- arch/arm/boot/dts/qcom/msm8996.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/boot/dts/qcom/msm8996.dtsi b/arch/arm/boot/dts/qcom/msm8996.dtsi index 01df4c72e1440..b505f8107f610 100644 --- a/arch/arm/boot/dts/qcom/msm8996.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996.dtsi @@ -2226,6 +2226,7 @@ qcom,cnss { compatible = "qcom,cnss"; + wlan-bootstrap-gpio = <&tlmm 46 0>; vdd-wlan-en-supply = <&wlan_en_vreg>; vdd-wlan-supply = <&rome_vreg>; vdd-wlan-io-supply = <&pm8994_s4>; From 77facd96b3aec7a6f777f3cca5e7e78c240c1614 Mon Sep 17 00:00:00 2001 From: Hardik Kantilal Patel Date: Fri, 26 Aug 2016 12:41:41 +0530 Subject: [PATCH 0031/1015] Revert "cnss: Configure wlan gpio" This reverts commit . After applying pinctrl sleep configuration for QCA6174, QCA6174 chip is not coming into proper power state which result stability issue. To avoid crash moving back to GPIO library use instead of pinctrl framework. Change-Id: I789a70b512d414c5cc67f6bab5bd3cec4064ab2f CRs-Fixed: 1059765 Signed-off-by: Hardik Kantilal Patel --- .../devicetree/bindings/cnss/cnss-wlan.txt | 2 - drivers/net/wireless/cnss/cnss_pci.c | 466 ++++++++++-------- 2 files changed, 268 insertions(+), 200 deletions(-) diff --git a/Documentation/devicetree/bindings/cnss/cnss-wlan.txt b/Documentation/devicetree/bindings/cnss/cnss-wlan.txt index e954ca8ace842..5b441b4430bcc 100644 --- a/Documentation/devicetree/bindings/cnss/cnss-wlan.txt +++ b/Documentation/devicetree/bindings/cnss/cnss-wlan.txt @@ -47,8 +47,6 @@ Optional properties: - vdd-wlan-en-supply: WLAN_EN fixed regulator specified by QCA6174 specifications. - qcom,wlan-en-vreg-support: Boolean property to decide the whether the WLAN_EN pin is a gpio or fixed regulator. - - qcom,enable-bootstrap-gpio: Boolean property to decide whether wlan bootstrap - gpio should be enabled or not in this platform. Example: diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c index f55eab39e3416..d12f48a1db187 100644 --- a/drivers/net/wireless/cnss/cnss_pci.c +++ b/drivers/net/wireless/cnss/cnss_pci.c @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include #include #include @@ -56,8 +58,12 @@ #define VREG_ON 1 #define VREG_OFF 0 +#define WLAN_EN_HIGH 1 +#define WLAN_EN_LOW 0 #define PCIE_LINK_UP 1 #define PCIE_LINK_DOWN 0 +#define WLAN_BOOTSTRAP_HIGH 1 +#define WLAN_BOOTSTRAP_LOW 0 #define CNSS_DUMP_FORMAT_VER 0x11 #define CNSS_DUMP_MAGIC_VER_V2 0x42445953 #define CNSS_DUMP_NAME "CNSS_WLAN" @@ -86,6 +92,8 @@ #define WLAN_VREG_SP2T_NAME "vdd-wlan-sp2t" #define WLAN_SWREG_NAME "wlan-soc-swreg" #define WLAN_ANT_SWITCH_NAME "wlan-ant-switch" +#define WLAN_EN_GPIO_NAME "wlan-en-gpio" +#define WLAN_BOOTSTRAP_GPIO_NAME "wlan-bootstrap-gpio" #define PM_OPTIONS 0 #define PM_OPTIONS_SUSPEND_LINK_DOWN \ (MSM_PCIE_CONFIG_NO_CFG_RESTORE | MSM_PCIE_CONFIG_LINKDOWN) @@ -114,12 +122,7 @@ #define PCIE_ENABLE_DELAY 100 #define WLAN_BOOTSTRAP_DELAY 10 #define EVICT_BIN_MAX_SIZE (512*1024) - -/*wlan enable and bootstrap pinctrl state */ -#define WLAN_EN_ACTIVE "wlan_en_active" -#define WLAN_EN_SLEEP "wlan_en_sleep" -#define BOOTSTRAP_ACTIVE "bootstrap_active" -#define BOOTSTRAP_SLEEP "bootstrap_sleep" +#define CNSS_PINCTRL_STATE_ACTIVE "default" static DEFINE_SPINLOCK(pci_link_down_lock); @@ -143,13 +146,14 @@ static DEFINE_SPINLOCK(pci_link_down_lock); #define BMI_TEST_SETUP (0x09) -struct cnss_wlan_pinctrl { - bool bootstrap_enable; +struct cnss_wlan_gpio_info { + char *name; + u32 num; + bool state; + bool init; + bool prop; struct pinctrl *pinctrl; - struct pinctrl_state *wlan_en_active; - struct pinctrl_state *wlan_en_sleep; - struct pinctrl_state *bootstrap_active; - struct pinctrl_state *bootstrap_sleep; + struct pinctrl_state *gpio_state_default; }; struct cnss_wlan_vreg_info { @@ -236,8 +240,8 @@ static struct cnss_data { dma_addr_t smmu_iova_start; size_t smmu_iova_len; struct cnss_wlan_vreg_info vreg_info; - struct cnss_wlan_pinctrl cnss_pinctrl; bool wlan_en_vreg_support; + struct cnss_wlan_gpio_info gpio_info; bool pcie_link_state; bool pcie_link_down_ind; bool pci_register_again; @@ -279,6 +283,7 @@ static struct cnss_data { u32 bdata_dma_size; u32 bdata_seg_count; struct segment_memory bdata_seg_mem[MAX_NUM_OF_SEGMENTS]; + int wlan_bootstrap_gpio; atomic_t auto_suspended; bool monitor_wake_intr; struct cnss_dual_wifi dual_wifi_info; @@ -289,6 +294,17 @@ module_param(pcie_link_down_panic, uint, S_IRUSR | S_IWUSR); MODULE_PARM_DESC(pcie_link_down_panic, "Trigger kernel panic when PCIe link down is detected"); +static void cnss_put_wlan_enable_gpio(void) +{ + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; + struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; + + if (penv->wlan_en_vreg_support) + regulator_put(vreg_info->wlan_en_reg); + else + gpio_free(gpio_info->num); +} + static int cnss_wlan_vreg_on(struct cnss_wlan_vreg_info *vreg_info) { int ret; @@ -495,130 +511,127 @@ static int cnss_wlan_vreg_set(struct cnss_wlan_vreg_info *vreg_info, bool state) return ret; } -static int cnss_wlan_enable_pin_set_state( - struct cnss_wlan_pinctrl *cnss_pinctrl, - struct cnss_wlan_vreg_info *vreg_info, - bool state) +static int cnss_wlan_gpio_init(struct cnss_wlan_gpio_info *info) { - int ret; + int ret = 0; - if (state) - goto set_wlan_pin_active; + ret = gpio_request(info->num, info->name); - if (penv->wlan_en_vreg_support) - ret = regulator_disable(vreg_info->wlan_en_reg); - else - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->wlan_en_sleep); - msleep(WLAN_ENABLE_DELAY); + if (ret) { + pr_err("can't get gpio %s ret %d\n", info->name, ret); + goto err_gpio_req; + } + + ret = gpio_direction_output(info->num, info->init); + + if (ret) { + pr_err("can't set gpio direction %s ret %d\n", info->name, ret); + goto err_gpio_dir; + } + info->state = info->init; return ret; -set_wlan_pin_active: +err_gpio_dir: + gpio_free(info->num); - if (penv->wlan_en_vreg_support) - ret = regulator_enable(vreg_info->wlan_en_reg); - else - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->wlan_en_active); - msleep(WLAN_ENABLE_DELAY); +err_gpio_req: return ret; } -static int cnss_select_pinctrl_active( - struct cnss_wlan_pinctrl *cnss_pinctrl, bool active) +static int cnss_wlan_bootstrap_gpio_init(void) { - int ret; - struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; - - if (!active) - goto select_sleep_state; + int ret = 0; - if (cnss_pinctrl->bootstrap_enable) { - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->bootstrap_active); - msleep(WLAN_BOOTSTRAP_DELAY); + ret = gpio_request(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_GPIO_NAME); + if (ret) { + pr_err("%s: Can't get GPIO %s, ret = %d\n", + __func__, WLAN_BOOTSTRAP_GPIO_NAME, ret); + goto out; } - ret = cnss_wlan_enable_pin_set_state(cnss_pinctrl, vreg_info, true); - return ret; - -select_sleep_state: - if (cnss_pinctrl->bootstrap_enable) { - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->bootstrap_sleep); - msleep(WLAN_BOOTSTRAP_DELAY); + ret = gpio_direction_output(penv->wlan_bootstrap_gpio, + WLAN_BOOTSTRAP_HIGH); + if (ret) { + pr_err("%s: Can't set GPIO %s direction, ret = %d\n", + __func__, WLAN_BOOTSTRAP_GPIO_NAME, ret); + gpio_free(penv->wlan_bootstrap_gpio); + goto out; } - ret = cnss_wlan_enable_pin_set_state(cnss_pinctrl, vreg_info, false); + msleep(WLAN_BOOTSTRAP_DELAY); +out: return ret; } -static int cnss_pinctrl_init( - struct cnss_wlan_pinctrl *cnss_pinctrl, - struct device *dev) +static void cnss_wlan_gpio_set(struct cnss_wlan_gpio_info *info, bool state) { - int ret = 0; - struct device_node *node = dev->of_node; + if (!info->prop) + return; - cnss_pinctrl->pinctrl = devm_pinctrl_get(dev); - if (IS_ERR_OR_NULL(cnss_pinctrl->pinctrl)) { - pr_err("%s:Failed to get pinctrl!\n", __func__); - return PTR_ERR(cnss_pinctrl->pinctrl); + if (info->state == state) { + pr_debug("Already %s gpio is %s\n", + info->name, state ? "high" : "low"); + return; } - if (penv->wlan_en_vreg_support) - goto skip_wlan_enable_pin_config; - - cnss_pinctrl->wlan_en_active = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, WLAN_EN_ACTIVE); - if (IS_ERR_OR_NULL(cnss_pinctrl->wlan_en_active)) { - pr_err("%s:Failed to get wlan_en active state!\n", __func__); - return PTR_ERR(cnss_pinctrl->wlan_en_active); + if (state == WLAN_EN_LOW && penv->dual_wifi_info.is_dual_wifi_enabled) { + pr_debug("%s Dual WiFi enabled\n", __func__); + return; } - cnss_pinctrl->wlan_en_sleep = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, WLAN_EN_SLEEP); - if (IS_ERR_OR_NULL(cnss_pinctrl->wlan_en_sleep)) { - pr_err("%s:Failed to get wlan_en sleep state!\n", __func__); - return PTR_ERR(cnss_pinctrl->wlan_en_sleep); + gpio_set_value(info->num, state); + info->state = state; + + pr_debug("%s: %s gpio is now %s\n", __func__, + info->name, info->state ? "enabled" : "disabled"); +} + +static int cnss_configure_wlan_en_gpio(bool state) +{ + int ret = 0; + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; + struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; + + if (penv->wlan_en_vreg_support) { + if (state) + ret = regulator_enable(vreg_info->wlan_en_reg); + else + ret = regulator_disable(vreg_info->wlan_en_reg); + } else { + cnss_wlan_gpio_set(gpio_info, state); } - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->wlan_en_active); msleep(WLAN_ENABLE_DELAY); + return ret; +} -skip_wlan_enable_pin_config: - cnss_pinctrl->bootstrap_enable = - of_property_read_bool(node, "qcom,enable-bootstrap-gpio"); - - if (!cnss_pinctrl->bootstrap_enable) - goto end; +static int cnss_pinctrl_init(struct cnss_wlan_gpio_info *gpio_info, + struct platform_device *pdev) +{ + int ret; - cnss_pinctrl->bootstrap_active = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, BOOTSTRAP_ACTIVE); - if (IS_ERR_OR_NULL(cnss_pinctrl->bootstrap_active)) { - pr_err("%s:Failed to get bootstrap active state!\n", __func__); - return PTR_ERR(cnss_pinctrl->bootstrap_active); + gpio_info->pinctrl = devm_pinctrl_get(&pdev->dev); + if (IS_ERR_OR_NULL(gpio_info->pinctrl)) { + pr_err("%s: Failed to get pinctrl!\n", __func__); + return PTR_ERR(gpio_info->pinctrl); } - cnss_pinctrl->bootstrap_sleep = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, BOOTSTRAP_SLEEP); - if (IS_ERR_OR_NULL(cnss_pinctrl->bootstrap_sleep)) { - pr_err("%s:Failed to get bootstrap sleep state!\n", __func__); - return PTR_ERR(cnss_pinctrl->bootstrap_sleep); + gpio_info->gpio_state_default = pinctrl_lookup_state(gpio_info->pinctrl, + CNSS_PINCTRL_STATE_ACTIVE); + if (IS_ERR_OR_NULL(gpio_info->gpio_state_default)) { + pr_err("%s: Can not get active pin state!\n", __func__); + return PTR_ERR(gpio_info->gpio_state_default); } - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->bootstrap_active); - msleep(WLAN_BOOTSTRAP_DELAY); + ret = pinctrl_select_state(gpio_info->pinctrl, + gpio_info->gpio_state_default); -end: return ret; } -static void cnss_disable_xtal_ldo(void) +static void cnss_disable_xtal_ldo(struct platform_device *pdev) { struct cnss_wlan_vreg_info *info = &penv->vreg_info; @@ -633,16 +646,17 @@ static void cnss_disable_xtal_ldo(void) } } -static int cnss_enable_xtal_ldo(struct device *dev) +static int cnss_enable_xtal_ldo(struct platform_device *pdev) { int ret = 0; struct cnss_wlan_vreg_info *info = &penv->vreg_info; - struct device_node *node = dev->of_node; - if (!of_get_property(node, WLAN_VREG_XTAL_AON_NAME "-supply", NULL)) + if (!of_get_property(pdev->dev.of_node, + WLAN_VREG_XTAL_AON_NAME "-supply", NULL)) goto enable_xtal; - info->wlan_reg_xtal_aon = regulator_get(dev, WLAN_VREG_XTAL_AON_NAME); + info->wlan_reg_xtal_aon = regulator_get(&pdev->dev, + WLAN_VREG_XTAL_AON_NAME); if (IS_ERR(info->wlan_reg_xtal_aon)) { ret = PTR_ERR(info->wlan_reg_xtal_aon); pr_err("%s: XTAL AON Regulator get failed err:%d\n", __func__, @@ -658,10 +672,11 @@ static int cnss_enable_xtal_ldo(struct device *dev) enable_xtal: - if (!of_get_property(node, WLAN_VREG_XTAL_NAME "-supply", NULL)) + if (!of_get_property(pdev->dev.of_node, + WLAN_VREG_XTAL_NAME "-supply", NULL)) goto out_disable_xtal_aon; - info->wlan_reg_xtal = regulator_get(dev, WLAN_VREG_XTAL_NAME); + info->wlan_reg_xtal = regulator_get(&pdev->dev, WLAN_VREG_XTAL_NAME); if (IS_ERR(info->wlan_reg_xtal)) { ret = PTR_ERR(info->wlan_reg_xtal); @@ -699,15 +714,73 @@ static int cnss_enable_xtal_ldo(struct device *dev) return ret; } -static int cnss_wlan_enable_vreg_regulators(struct device *dev) +static int cnss_get_wlan_enable_gpio( + struct cnss_wlan_gpio_info *gpio_info, + struct platform_device *pdev) +{ + int ret = 0; + struct device *dev = &pdev->dev; + + if (!of_find_property(dev->of_node, gpio_info->name, NULL)) { + gpio_info->prop = false; + return -ENODEV; + } + + gpio_info->prop = true; + ret = of_get_named_gpio(dev->of_node, gpio_info->name, 0); + if (ret >= 0) { + gpio_info->num = ret; + } else { + if (ret == -EPROBE_DEFER) + pr_debug("get WLAN_EN GPIO probe defer\n"); + else + pr_err( + "can't get gpio %s ret %d", gpio_info->name, ret); + } + + ret = cnss_pinctrl_init(gpio_info, pdev); + if (ret) + pr_debug("%s: pinctrl init failed!\n", __func__); + + ret = cnss_wlan_gpio_init(gpio_info); + if (ret) + pr_err("gpio init failed\n"); + + return ret; +} + +static int cnss_get_wlan_bootstrap_gpio(struct platform_device *pdev) { int ret = 0; + struct device_node *node = (&pdev->dev)->of_node; + + if (!of_find_property(node, WLAN_BOOTSTRAP_GPIO_NAME, NULL)) + return ret; + + penv->wlan_bootstrap_gpio = + of_get_named_gpio(node, WLAN_BOOTSTRAP_GPIO_NAME, 0); + if (penv->wlan_bootstrap_gpio > 0) { + ret = cnss_wlan_bootstrap_gpio_init(); + } else { + ret = penv->wlan_bootstrap_gpio; + pr_err( + "%s: Can't get GPIO %s, ret = %d", + __func__, WLAN_BOOTSTRAP_GPIO_NAME, ret); + } + + return ret; +} + +static int cnss_wlan_get_resources(struct platform_device *pdev) +{ + int ret = 0; + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; - struct device_node *node = dev->of_node; + struct device_node *node = pdev->dev.of_node; if (of_get_property(node, WLAN_VREG_CORE_NAME "-supply", NULL)) { - vreg_info->wlan_reg_core = - regulator_get(dev, WLAN_VREG_CORE_NAME); + vreg_info->wlan_reg_core = regulator_get(&pdev->dev, + WLAN_VREG_CORE_NAME); if (IS_ERR(vreg_info->wlan_reg_core)) { ret = PTR_ERR(vreg_info->wlan_reg_core); @@ -736,7 +809,8 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) } if (of_get_property(node, WLAN_VREG_IO_NAME "-supply", NULL)) { - vreg_info->wlan_reg_io = regulator_get(dev, WLAN_VREG_IO_NAME); + vreg_info->wlan_reg_io = regulator_get(&pdev->dev, + WLAN_VREG_IO_NAME); if (!IS_ERR(vreg_info->wlan_reg_io)) { ret = regulator_set_voltage(vreg_info->wlan_reg_io, WLAN_VREG_IO_MIN, WLAN_VREG_IO_MAX); @@ -758,10 +832,10 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) } } - if (cnss_enable_xtal_ldo(dev)) + if (cnss_enable_xtal_ldo(pdev)) goto err_reg_xtal_enable; - vreg_info->wlan_reg = regulator_get(dev, WLAN_VREG_NAME); + vreg_info->wlan_reg = regulator_get(&pdev->dev, WLAN_VREG_NAME); if (IS_ERR(vreg_info->wlan_reg)) { if (PTR_ERR(vreg_info->wlan_reg) == -EPROBE_DEFER) @@ -781,7 +855,7 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) if (of_get_property(node, WLAN_VREG_SP2T_NAME "-supply", NULL)) { vreg_info->wlan_reg_sp2t = - regulator_get(dev, WLAN_VREG_SP2T_NAME); + regulator_get(&pdev->dev, WLAN_VREG_SP2T_NAME); if (!IS_ERR(vreg_info->wlan_reg_sp2t)) { ret = regulator_set_voltage(vreg_info->wlan_reg_sp2t, WLAN_VREG_SP2T_MIN, WLAN_VREG_SP2T_MAX); @@ -802,7 +876,7 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) if (of_get_property(node, WLAN_ANT_SWITCH_NAME "-supply", NULL)) { vreg_info->ant_switch = - regulator_get(dev, WLAN_ANT_SWITCH_NAME); + regulator_get(&pdev->dev, WLAN_ANT_SWITCH_NAME); if (!IS_ERR(vreg_info->ant_switch)) { ret = regulator_set_voltage(vreg_info->ant_switch, WLAN_ANT_SWITCH_VOLT_MIN, @@ -834,7 +908,8 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) penv->cap.cap_flag |= CNSS_HAS_UART_ACCESS; if (of_get_property(node, WLAN_SWREG_NAME "-supply", NULL)) { - vreg_info->soc_swreg = regulator_get(dev, WLAN_SWREG_NAME); + vreg_info->soc_swreg = regulator_get(&pdev->dev, + WLAN_SWREG_NAME); if (IS_ERR(vreg_info->soc_swreg)) { pr_err("%s: soc-swreg node not found\n", __func__); @@ -858,19 +933,36 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) penv->wlan_en_vreg_support = of_property_read_bool(node, "qcom,wlan-en-vreg-support"); if (penv->wlan_en_vreg_support) { - vreg_info->wlan_en_reg = regulator_get(dev, WLAN_EN_VREG_NAME); + vreg_info->wlan_en_reg = + regulator_get(&pdev->dev, WLAN_EN_VREG_NAME); if (IS_ERR(vreg_info->wlan_en_reg)) { pr_err("%s:wlan_en vreg get failed\n", __func__); ret = PTR_ERR(vreg_info->wlan_en_reg); goto err_wlan_en_reg_get; } - - ret = regulator_enable(vreg_info->wlan_en_reg); } + if (!penv->wlan_en_vreg_support) { + ret = cnss_get_wlan_enable_gpio(gpio_info, pdev); + if (ret) { + pr_err( + "%s:Failed to config the WLAN_EN gpio\n", __func__); + goto err_gpio_wlan_en; + } + } vreg_info->state = VREG_ON; + + ret = cnss_get_wlan_bootstrap_gpio(pdev); + if (ret) { + pr_err("%s: Failed to enable wlan bootstrap gpio\n", __func__); + goto err_gpio_wlan_bootstrap; + } + return ret; +err_gpio_wlan_bootstrap: + cnss_put_wlan_enable_gpio(); +err_gpio_wlan_en: err_wlan_en_reg_get: vreg_info->wlan_en_reg = NULL; if (vreg_info->soc_swreg) @@ -902,7 +994,7 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) err_reg_enable: regulator_put(vreg_info->wlan_reg); err_reg_get: - cnss_disable_xtal_ldo(); + cnss_disable_xtal_ldo(pdev); err_reg_xtal_enable: if (vreg_info->wlan_reg_io) @@ -926,15 +1018,15 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) static void cnss_wlan_release_resources(void) { + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; + if (penv->wlan_bootstrap_gpio > 0) + gpio_free(penv->wlan_bootstrap_gpio); + cnss_put_wlan_enable_gpio(); + gpio_info->state = WLAN_EN_LOW; + gpio_info->prop = false; cnss_wlan_vreg_set(vreg_info, VREG_OFF); - if (penv->wlan_en_vreg_support) { - if (vreg_info->wlan_en_reg) { - regulator_disable(vreg_info->wlan_en_reg); - regulator_put(vreg_info->wlan_en_reg); - } - } if (vreg_info->soc_swreg) regulator_put(vreg_info->soc_swreg); if (vreg_info->ant_switch) @@ -953,31 +1045,6 @@ static void cnss_wlan_release_resources(void) vreg_info->state = VREG_OFF; } -static int cnss_wlan_get_resources(struct platform_device *pdev) -{ - int ret = 0; - struct device *dev = &pdev->dev; - struct cnss_wlan_pinctrl *cnss_pinctrl = &penv->cnss_pinctrl; - - ret = cnss_wlan_enable_vreg_regulators(dev); - if (ret) { - pr_err("%s: failed to enable the vreg_regulators\n", __func__); - return ret; - } - - ret = cnss_pinctrl_init(cnss_pinctrl, dev); - if (ret) { - pr_err("%s: pinctrl init failed!\n", __func__); - goto err_pinctrl_init; - } - - return ret; - -err_pinctrl_init: - cnss_wlan_release_resources(); - return ret; -} - static u8 cnss_get_pci_dev_bus_number(struct pci_dev *pdev) { return pdev->bus->number; @@ -1550,7 +1617,6 @@ static int cnss_wlan_pci_probe(struct pci_dev *pdev, { int ret = 0; struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl = &penv->cnss_pinctrl; void *cpu_addr; dma_addr_t dma_handle; struct codeswap_codeseg_info *cnss_seg_info = NULL; @@ -1609,13 +1675,9 @@ static int cnss_wlan_pci_probe(struct pci_dev *pdev, penv->pcie_link_state = PCIE_LINK_DOWN; } - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - if (ret) { - pr_err("%s:Failed to enable wlan_en pin\n", __func__); - goto err_pcie_suspend; - } - + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); ret = cnss_wlan_vreg_set(vreg_info, VREG_OFF); + if (ret) { pr_err("can't turn off wlan vreg\n"); goto err_pcie_suspend; @@ -2206,7 +2268,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) int probe_again = 0; struct cnss_wlan_driver *wdrv; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; struct pci_dev *pdev; if (!penv) @@ -2214,7 +2276,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) wdrv = penv->driver; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; pdev = penv->pdev; if (!wdrv) { @@ -2230,11 +2292,15 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) pr_err("wlan vreg ON failed\n"); goto err_wlan_vreg_on; } + msleep(POWER_ON_DELAY); - ret = cnss_select_pinctrl_active(cnss_pinctrl, true); - if (ret) - pr_err("%s:Failed to set cnss pin active state\n", __func__); + if (penv->wlan_bootstrap_gpio > 0) { + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_HIGH); + msleep(WLAN_BOOTSTRAP_DELAY); + } + + cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); if (!pdev) { pr_debug("%s: invalid pdev. register pci device\n", __func__); @@ -2317,8 +2383,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) cnss_get_pci_dev_bus_number(pdev), pdev, PM_OPTIONS); penv->pcie_link_state = PCIE_LINK_DOWN; - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - msleep(WLAN_ENABLE_DELAY); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_vreg_set(vreg_info, VREG_OFF); msleep(POWER_ON_DELAY); probe_again++; @@ -2345,7 +2410,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) } err_pcie_reg: - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_vreg_set(vreg_info, VREG_OFF); if (penv->pdev) { pr_err("%d: Unregistering PCI device\n", __LINE__); @@ -2365,7 +2430,7 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver) { struct cnss_wlan_driver *wdrv; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; struct pci_dev *pdev; if (!penv) @@ -2373,7 +2438,7 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver) wdrv = penv->driver; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; pdev = penv->pdev; if (!wdrv) { @@ -2425,8 +2490,8 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver) cut_power: penv->driver = NULL; - if (cnss_select_pinctrl_active(cnss_pinctrl, false)) - pr_err("%s: Failed disable the wlan_en pin\n", __func__); + + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); if (cnss_wlan_vreg_set(vreg_info, VREG_OFF)) pr_err("wlan vreg OFF failed\n"); } @@ -2506,7 +2571,7 @@ static int cnss_shutdown(const struct subsys_desc *subsys, bool force_stop) struct cnss_wlan_driver *wdrv; struct pci_dev *pdev; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret = 0; if (!penv) @@ -2516,7 +2581,7 @@ static int cnss_shutdown(const struct subsys_desc *subsys, bool force_stop) wdrv = penv->driver; pdev = penv->pdev; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; if (!pdev) { ret = -EINVAL; @@ -2538,10 +2603,7 @@ static int cnss_shutdown(const struct subsys_desc *subsys, bool force_stop) } cut_power: - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - if (ret) - pr_err("%s:Failed to disable the wlan_en pin\n", __func__); - + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); if (cnss_wlan_vreg_set(vreg_info, VREG_OFF)) pr_err("cnss: Failed to set WLAN VREG_OFF!\n"); @@ -2553,7 +2615,7 @@ static int cnss_powerup(const struct subsys_desc *subsys) struct cnss_wlan_driver *wdrv; struct pci_dev *pdev; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret = 0; if (!penv) @@ -2565,7 +2627,7 @@ static int cnss_powerup(const struct subsys_desc *subsys) wdrv = penv->driver; pdev = penv->pdev; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; ret = cnss_wlan_vreg_set(vreg_info, VREG_ON); if (ret) { @@ -2574,11 +2636,7 @@ static int cnss_powerup(const struct subsys_desc *subsys) } msleep(POWER_ON_DELAY); - ret = cnss_select_pinctrl_active(cnss_pinctrl, true); - if (ret) { - pr_err("%s: Failed to enable wlan_en pin\n", __func__); - goto err_wlan_en_pin_set; - } + cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); if (!pdev) { pr_err("%d: invalid pdev\n", __LINE__); @@ -2637,9 +2695,8 @@ static int cnss_powerup(const struct subsys_desc *subsys) pdev, PM_OPTIONS); penv->pcie_link_state = PCIE_LINK_DOWN; -err_wlan_en_pin_set: err_pcie_link_up: - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_vreg_set(vreg_info, VREG_OFF); if (penv->pdev) { pr_err("%d: Unregistering pci device\n", __LINE__); @@ -2813,6 +2870,11 @@ static int cnss_probe(struct platform_device *pdev) penv->pldev = pdev; penv->esoc_desc = NULL; + penv->gpio_info.name = WLAN_EN_GPIO_NAME; + penv->gpio_info.num = 0; + penv->gpio_info.state = WLAN_EN_LOW; + penv->gpio_info.init = WLAN_EN_LOW; + penv->gpio_info.prop = false; penv->vreg_info.wlan_reg = NULL; penv->vreg_info.state = VREG_OFF; penv->pci_register_again = false; @@ -2821,6 +2883,12 @@ static int cnss_probe(struct platform_device *pdev) if (ret) goto err_get_wlan_res; + ret = cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); + if (ret) { + pr_err("%s: Failed to enable WLAN enable gpio\n", __func__); + goto err_get_rc; + } + ret = of_property_read_u32(dev->of_node, "qcom,wlan-rc-num", &rc_num); if (ret) { pr_err("%s: Failed to find PCIe RC number!\n", __func__); @@ -3014,7 +3082,7 @@ static int cnss_probe(struct platform_device *pdev) err_esoc_reg: err_pcie_enumerate: err_get_rc: - ret = cnss_select_pinctrl_active(&penv->cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_release_resources(); err_get_wlan_res: @@ -3045,7 +3113,9 @@ static int cnss_remove(struct platform_device *pdev) } } - cnss_select_pinctrl_active(&penv->cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); + if (penv->wlan_bootstrap_gpio > 0) + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_LOW); cnss_wlan_release_resources(); return 0; @@ -3519,11 +3589,11 @@ static struct pci_dev *__cnss_get_pcie_dev(struct device *dev) static int __cnss_pcie_power_up(struct device *dev) { struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; ret = cnss_wlan_vreg_set(vreg_info, VREG_ON); if (ret) { @@ -3533,27 +3603,27 @@ static int __cnss_pcie_power_up(struct device *dev) msleep(POWER_ON_DELAY); - ret = cnss_select_pinctrl_active(cnss_pinctrl, true); - if (ret) - pr_err("%s: Failed to select the default state\n", __func__); + if (penv->wlan_bootstrap_gpio > 0) { + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_HIGH); + msleep(WLAN_BOOTSTRAP_DELAY); + } - return ret; + cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); + return 0; } static int __cnss_pcie_power_down(struct device *dev) { struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - if (ret) { - pr_err("%s: Failed to select the default state\n", __func__); - return ret; - } + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); + if (penv->wlan_bootstrap_gpio > 0) + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_LOW); ret = cnss_wlan_vreg_set(vreg_info, VREG_OFF); if (ret) From 3b26278a1dfbd8018b6934ef1940e2deb87e5b7d Mon Sep 17 00:00:00 2001 From: Samyukta Mogily Date: Thu, 1 Sep 2016 18:16:50 +0530 Subject: [PATCH 0032/1015] msm: sensor: Avoid potential stack overflow Add a check to validate the user input data is not greater than expected stack buffer size to avoid out of bounds array accesses CRs-Fixed: 1056307 Change-Id: Ifd1f4e828373535fdf963aad22b217ae880c778c Signed-off-by: Samyukta Mogily --- .../platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c | 6 ++++++ .../platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c index 8f911d3624773..a4ee5041bfff2 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c @@ -276,6 +276,12 @@ int32_t msm_camera_cci_i2c_write_seq_table( client_addr_type = client->addr_type; client->addr_type = write_setting->addr_type; + if (reg_setting->reg_data_size > I2C_SEQ_REG_DATA_MAX) { + pr_err("%s: number of bytes %u exceeding the max supported %d\n", + __func__, reg_setting->reg_data_size, I2C_SEQ_REG_DATA_MAX); + return rc; + } + for (i = 0; i < write_setting->size; i++) { rc = msm_camera_cci_i2c_write_seq(client, reg_setting->reg_addr, reg_setting->reg_data, reg_setting->reg_data_size); diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c index 3b101798edac2..7a0fb97061d50 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c @@ -290,6 +290,12 @@ int32_t msm_camera_qup_i2c_write_seq_table(struct msm_camera_i2c_client *client, client_addr_type = client->addr_type; client->addr_type = write_setting->addr_type; + if (reg_setting->reg_data_size > I2C_SEQ_REG_DATA_MAX) { + pr_err("%s: number of bytes %u exceeding the max supported %d\n", + __func__, reg_setting->reg_data_size, I2C_SEQ_REG_DATA_MAX); + return rc; + } + for (i = 0; i < write_setting->size; i++) { rc = msm_camera_qup_i2c_write_seq(client, reg_setting->reg_addr, reg_setting->reg_data, reg_setting->reg_data_size); From 82e146f3ebea4e09c793bba58863d21a909751bc Mon Sep 17 00:00:00 2001 From: Sandeep Panda Date: Thu, 1 Sep 2016 16:53:47 +0530 Subject: [PATCH 0033/1015] clk: msm: mdss: update PLL configuration to clear precalibrated values Before going for full PLL enable sequence, we need to clear out the override bit and precalibrated values of VCO_TUNE and KVCO_CODE, as these registers might be storing values for old VCO rate. This will cause the DSI PLL to be in a bad state and hence PLL unlock errors might occur during use case like resolution switch. So always clear the precalibrated values first in PLL configuration sequence. Change-Id: I407920d63b4600b610794141e5b7ceb5a33980c1 Signed-off-by: Sandeep Panda --- drivers/clk/msm/mdss/mdss-dsi-pll-8996-util.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/clk/msm/mdss/mdss-dsi-pll-8996-util.c b/drivers/clk/msm/mdss/mdss-dsi-pll-8996-util.c index 9e26647e7c081..7a50282159509 100644 --- a/drivers/clk/msm/mdss/mdss-dsi-pll-8996-util.c +++ b/drivers/clk/msm/mdss/mdss-dsi-pll-8996-util.c @@ -821,6 +821,10 @@ static void pll_db_commit_8996(struct mdss_pll_resources *pll, MDSS_PLL_REG_W(pll_base, DSIPHY_CMN_CTRL_1, 0); wmb(); /* make sure register committed */ + MDSS_PLL_REG_W(pll_base, DSIPHY_PLL_PLL_VCO_TUNE, 0); + MDSS_PLL_REG_W(pll_base, DSIPHY_PLL_KVCO_CODE, 0); + wmb(); /* make sure register committed */ + data = pdb->in.dsiclk_sel; /* set dsiclk_sel = 1 */ MDSS_PLL_REG_W(pll_base, DSIPHY_CMN_CLK_CFG1, data); From 38097542a31f583aada068a58ab3599f89229d01 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Thu, 1 Sep 2016 10:20:50 -0700 Subject: [PATCH 0034/1015] qseecom: allocate sglistinfo buffer for kernel clients To support whitelist feature, sglistinfo table should also be allocated from qseecom kernel APIs used by kernel client. Besides, initialize sg in __qseecom_update_cmd_buf_64 to address a static analysis warning. Change-Id: I1f1967fd9e95444cca728f09e3e8f4914b2abb95 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 90f032059ed53..083e89f8aecc1 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -3322,6 +3322,7 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, } } len = QSEECOM_SG_LIST_BUF_HDR_SZ_64BIT; + sg = sg_ptr->sgl; goto cleanup; } sg = sg_ptr->sgl; @@ -4088,12 +4089,21 @@ int qseecom_start_app(struct qseecom_handle **handle, data->client.user_virt_sb_base = 0; data->client.ihandle = NULL; + /* Allocate sglistinfo buffer for kernel client */ + data->sglistinfo_ptr = kzalloc(SGLISTINFO_TABLE_SIZE, GFP_KERNEL); + if (!(data->sglistinfo_ptr)) { + kfree(data); + kfree(*handle); + *handle = NULL; + return -ENOMEM; + } init_waitqueue_head(&data->abort_wq); data->client.ihandle = ion_alloc(qseecom.ion_clnt, size, 4096, ION_HEAP(ION_QSECOM_HEAP_ID), 0); if (IS_ERR_OR_NULL(data->client.ihandle)) { pr_err("Ion client could not retrieve the handle\n"); + kfree(data->sglistinfo_ptr); kfree(data); kfree(*handle); *handle = NULL; @@ -4191,6 +4201,7 @@ int qseecom_start_app(struct qseecom_handle **handle, return 0; err: + kfree(data->sglistinfo_ptr); kfree(data); kfree(*handle); *handle = NULL; @@ -4238,6 +4249,7 @@ int qseecom_shutdown_app(struct qseecom_handle **handle) mutex_unlock(&app_access_lock); if (ret == 0) { + kzfree(data->sglistinfo_ptr); kzfree(data); kzfree(*handle); kzfree(kclient); From 9fff5de97acdc15cba1b706920d62a8b23eb81a5 Mon Sep 17 00:00:00 2001 From: Siena Richard Date: Tue, 16 Aug 2016 13:03:56 -0700 Subject: [PATCH 0035/1015] misc: qcom: qdsp6v2: initialize wma_config_32 Not all memebers of wma_config_32 are set before they are used which might lead to invalid values being passed and used. To fix this issue initialize all member variables of struct wma_config_32 to 0 before assigning specific values individually. Change-Id: Ibb082ce691625527e9a9ffd4978dea7ba4df9e84 CRs-Fixed: 1054352 Signed-off-by: Siena Richard --- drivers/misc/qcom/qdsp6v2/audio_wma.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/misc/qcom/qdsp6v2/audio_wma.c b/drivers/misc/qcom/qdsp6v2/audio_wma.c index 8c86973c7ebae..bc9e79ace398f 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_wma.c +++ b/drivers/misc/qcom/qdsp6v2/audio_wma.c @@ -166,6 +166,8 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_wma_config_v2 *wma_config; struct msm_audio_wma_config_v2_32 wma_config_32; + memset(&wma_config_32, 0, sizeof(wma_config_32)); + wma_config = (struct msm_audio_wma_config_v2 *)audio->codec_cfg; wma_config_32.format_tag = wma_config->format_tag; wma_config_32.numchannels = wma_config->numchannels; From a4205c3860f31ff4f23226a2aa4ad294088818d8 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Tue, 31 May 2016 11:24:30 -0600 Subject: [PATCH 0036/1015] msm: kgsl: Remove event worker Scheduling issues were occurring with the GPU event worker after b7be807 (msm: kgsl: Unbind the kgsl-event workqueue) was merged. In certain conditions, it seems that the kgsl-event workqueue was conflicting with the KGSL worker and slowing it down. It turns out that everywhere we schedule the event worker and the dispatcher worker at the same time. Since the worker is singlethread, the event worker and the dispatcher run synchronously anyway, so it makes sense to run the event processor from within the dispatcher and save the extra schedule. Change-Id: Ic0dedbad67eb04d41afb6add4477f146dfff9784 Signed-off-by: Jordan Crouse Signed-off-by: Sudeep Yedalapure --- drivers/gpu/msm/adreno.c | 1 - drivers/gpu/msm/adreno_a5xx.c | 3 --- drivers/gpu/msm/adreno_dispatch.c | 7 +++---- drivers/gpu/msm/kgsl.c | 4 ++-- drivers/gpu/msm/kgsl_device.h | 5 +---- drivers/gpu/msm/kgsl_events.c | 10 ++-------- 6 files changed, 8 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index d814f6754c25f..9058c33aac6e0 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -579,7 +579,6 @@ void adreno_cp_callback(struct adreno_device *adreno_dev, int bit) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); - kgsl_schedule_work(&device->event_work); adreno_dispatcher_schedule(device); } diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c index 9cccc24b46e59..7375eff7785d4 100644 --- a/drivers/gpu/msm/adreno_a5xx.c +++ b/drivers/gpu/msm/adreno_a5xx.c @@ -3172,7 +3172,6 @@ static void a5xx_irq_storm_worker(struct work_struct *work) mutex_unlock(&device->mutex); /* Reschedule just to make sure everything retires */ - kgsl_schedule_work(&device->event_work); adreno_dispatcher_schedule(device); } @@ -3223,8 +3222,6 @@ static void a5xx_cp_callback(struct adreno_device *adreno_dev, int bit) } a5xx_preemption_trigger(adreno_dev); - - kgsl_schedule_work(&device->event_work); adreno_dispatcher_schedule(device); } diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c index bfc547fe16d10..5d3b2b8a72664 100644 --- a/drivers/gpu/msm/adreno_dispatch.c +++ b/drivers/gpu/msm/adreno_dispatch.c @@ -2123,19 +2123,18 @@ static void adreno_dispatcher_work(struct work_struct *work) break; } + kgsl_process_event_groups(device); + /* * dispatcher_do_fault() returns 0 if no faults occurred. If that is the * case, then clean up preemption and try to schedule more work */ if (dispatcher_do_fault(adreno_dev) == 0) { + /* Clean up after preemption */ if (gpudev->preemption_schedule) gpudev->preemption_schedule(adreno_dev); - /* Re-kick the event engine to catch stragglers */ - if (dispatcher->inflight == 0 && count != 0) - kgsl_schedule_work(&device->event_work); - /* Run the scheduler for to dispatch new commands */ _adreno_dispatcher_issuecmds(adreno_dev); } diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index f6f1e4a0aabdd..041b2ac27786e 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -3952,8 +3952,8 @@ int kgsl_device_platform_probe(struct kgsl_device *device) PM_QOS_DEFAULT_VALUE); } - - device->events_wq = create_singlethread_workqueue("kgsl-events"); + device->events_wq = alloc_workqueue("kgsl-events", + WQ_UNBOUND | WQ_MEM_RECLAIM, 0); /* Initalize the snapshot engine */ kgsl_device_snapshot_init(device); diff --git a/drivers/gpu/msm/kgsl_device.h b/drivers/gpu/msm/kgsl_device.h index f864a9479bce7..8d7185f6b1cba 100644 --- a/drivers/gpu/msm/kgsl_device.h +++ b/drivers/gpu/msm/kgsl_device.h @@ -275,7 +275,6 @@ struct kgsl_device { int mem_log; int pwr_log; struct kgsl_pwrscale pwrscale; - struct work_struct event_work; int reset_counter; /* Track how many GPU core resets have occured */ int cff_dump_enable; @@ -295,8 +294,6 @@ struct kgsl_device { .cmdbatch_gate = COMPLETION_INITIALIZER((_dev).cmdbatch_gate),\ .idle_check_ws = __WORK_INITIALIZER((_dev).idle_check_ws,\ kgsl_idle_check),\ - .event_work = __WORK_INITIALIZER((_dev).event_work,\ - kgsl_process_events),\ .context_idr = IDR_INIT((_dev).context_idr),\ .wait_queue = __WAIT_QUEUE_HEAD_INITIALIZER((_dev).wait_queue),\ .active_cnt_wq = __WAIT_QUEUE_HEAD_INITIALIZER((_dev).active_cnt_wq),\ @@ -617,7 +614,7 @@ void kgsl_process_event_group(struct kgsl_device *device, struct kgsl_event_group *group); void kgsl_flush_event_group(struct kgsl_device *device, struct kgsl_event_group *group); -void kgsl_process_events(struct work_struct *work); +void kgsl_process_event_groups(struct kgsl_device *device); void kgsl_context_destroy(struct kref *kref); diff --git a/drivers/gpu/msm/kgsl_events.c b/drivers/gpu/msm/kgsl_events.c index 6f70b9ddd3763..6e8abf36c50f9 100644 --- a/drivers/gpu/msm/kgsl_events.c +++ b/drivers/gpu/msm/kgsl_events.c @@ -314,22 +314,16 @@ EXPORT_SYMBOL(kgsl_add_event); static DEFINE_RWLOCK(group_lock); static LIST_HEAD(group_list); -/** - * kgsl_process_events() - Work queue for processing new timestamp events - * @work: Pointer to a work_struct - */ -void kgsl_process_events(struct work_struct *work) +void kgsl_process_event_groups(struct kgsl_device *device) { struct kgsl_event_group *group; - struct kgsl_device *device = container_of(work, struct kgsl_device, - event_work); read_lock(&group_lock); list_for_each_entry(group, &group_list, group) _process_event_group(device, group, false); read_unlock(&group_lock); } -EXPORT_SYMBOL(kgsl_process_events); +EXPORT_SYMBOL(kgsl_process_event_groups); /** * kgsl_del_event_group() - Remove a GPU event group From 75e26c22bfb52f49e0e23268999b8ea9b683abf8 Mon Sep 17 00:00:00 2001 From: Jonathan Wicks Date: Mon, 29 Aug 2016 12:36:37 -0600 Subject: [PATCH 0037/1015] msm: kgsl: Add WQ_SYSFS to the worker threads Add WQ_SYSFS to the worker threads so that they show up under /sys/bus/workqueue/devices. This allows some of the properties to be adjusted at runtime. Change-Id: I3424ae51461e04e0771560ff1c5b35cdf5b1fd6c Signed-off-by: Jonathan Wicks Signed-off-by: Sudeep Yedalapure --- drivers/gpu/msm/kgsl.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 041b2ac27786e..7efc5a22e7696 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -3953,7 +3953,7 @@ int kgsl_device_platform_probe(struct kgsl_device *device) } device->events_wq = alloc_workqueue("kgsl-events", - WQ_UNBOUND | WQ_MEM_RECLAIM, 0); + WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0); /* Initalize the snapshot engine */ kgsl_device_snapshot_init(device); @@ -4096,7 +4096,8 @@ static int __init kgsl_core_init(void) INIT_LIST_HEAD(&kgsl_driver.pagetable_list); - kgsl_driver.workqueue = create_singlethread_workqueue("kgsl-workqueue"); + kgsl_driver.workqueue = alloc_workqueue("kgsl-workqueue", + WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0); kgsl_driver.mem_workqueue = alloc_workqueue("kgsl-mementry", WQ_UNBOUND | WQ_MEM_RECLAIM, 0); From 3fee6d9948be6f849ab495470061c4c17de445e3 Mon Sep 17 00:00:00 2001 From: Divya Ojha Date: Thu, 25 Aug 2016 15:25:51 +0530 Subject: [PATCH 0038/1015] ARM: dts: msm: update micbias type for 8937/53/17 CDP 8937/53/17 CDP uses external bias resistor. Hence change micbias type to external. CRs-fixed: 1045680 Change-Id: I7ca26e9b37e5730e8c8b7b1640fb7c55ad2fe532 Signed-off-by: Divya Ojha --- arch/arm/boot/dts/qcom/msm8917-audio-cdp.dtsi | 2 +- arch/arm/boot/dts/qcom/msm8937-audio-cdp.dtsi | 4 ++-- arch/arm/boot/dts/qcom/msm8953-audio-cdp.dtsi | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8917-audio-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8917-audio-cdp.dtsi index dfb33a59f1d53..b402c85561dbe 100644 --- a/arch/arm/boot/dts/qcom/msm8917-audio-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-audio-cdp.dtsi @@ -13,7 +13,7 @@ &int_codec { status = "okay"; - qcom,msm-hs-micbias-type = "internal"; + qcom,msm-hs-micbias-type = "external"; asoc-wsa-codec-names = "wsa881x-i2c-codec.2-000f"; asoc-wsa-codec-prefixes = "SpkrMono"; diff --git a/arch/arm/boot/dts/qcom/msm8937-audio-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8937-audio-cdp.dtsi index f4245f212975c..be24d3d789fd5 100644 --- a/arch/arm/boot/dts/qcom/msm8937-audio-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-audio-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -13,7 +13,7 @@ &int_codec { status = "okay"; - qcom,msm-hs-micbias-type = "internal"; + qcom,msm-hs-micbias-type = "external"; asoc-wsa-codec-names = "wsa881x-i2c-codec.2-000f"; asoc-wsa-codec-prefixes = "SpkrMono"; diff --git a/arch/arm/boot/dts/qcom/msm8953-audio-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8953-audio-cdp.dtsi index 6da96a542289d..8e63bcc874445 100644 --- a/arch/arm/boot/dts/qcom/msm8953-audio-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-audio-cdp.dtsi @@ -13,7 +13,7 @@ &int_codec { status = "okay"; - qcom,msm-hs-micbias-type = "internal"; + qcom,msm-hs-micbias-type = "external"; }; &pm8953_diangu_dig { From d2521c8c40b9ceca33dc10c5a10388d851b813b3 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Tue, 30 Aug 2016 15:36:26 +0530 Subject: [PATCH 0039/1015] ARM: dts: msm: update APC CPR voltage margins for msm8917 Update APC CPR static open-loop and closed-loop voltage margins for msm8917 as per voltage characterization results. CRs-Fixed: 1061085 Change-Id: If9a48194a17b55586560e591916473c1c721133a Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8917-regulator.dtsi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi index 996726ea5600d..484ee3dd95f96 100644 --- a/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi @@ -537,18 +537,21 @@ qcom,cpr-fuse-revision = <69 39 3 0>; qcom,pvs-version-fuse-sel = <37 40 3 0>; /* foundry */ qcom,cpr-fuse-version-map = + < 1 0 3 (-1) (-1) (-1)>, <(-1) 0 1 (-1) (-1) (-1)>, <(-1) 0 2 (-1) (-1) (-1)>, <(-1) 5 1 (-1) (-1) (-1)>, <(-1) 5 2 (-1) (-1) (-1)>, <(-1) (-1) (-1) (-1) (-1) (-1)>; qcom,cpr-quotient-adjustment = + <50 40 50>, <50 40 100>, <50 40 50>, <0 0 100>, <0 0 50>, <0 0 0>; qcom,cpr-init-voltage-adjustment = + <30000 5000 10000>, <30000 5000 35000>, <30000 5000 10000>, <0 0 20000>, From 2614d09e4c7801b276f38ea5dac1e61c03210787 Mon Sep 17 00:00:00 2001 From: Abdulla Anam Date: Tue, 23 Aug 2016 18:08:19 +0530 Subject: [PATCH 0040/1015] msm: vidc: Fix buffer size computation for slave side cp case. For slave side cp, buffer sizes have to be aligned by 1M instead. Fix the same in get_frame_size. CRs-Fixed: 1059239 Change-Id: Ic9de15b536cc89f135f8090c86bbef0818252d33 Signed-off-by: Abdulla Anam --- drivers/media/platform/msm/vidc/msm_vdec.c | 30 +++++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c index 9ba4c16e179db..d6c37e02e6cfa 100644 --- a/drivers/media/platform/msm/vidc/msm_vdec.c +++ b/drivers/media/platform/msm/vidc/msm_vdec.c @@ -28,6 +28,8 @@ #define MB_SIZE_IN_PIXEL (16 * 16) #define MAX_OPERATING_FRAME_RATE (300 << 16) #define OPERATING_FRAME_RATE_STEP (1 << 16) +#define SLAVE_SIDE_CP_ALIGNMENT 0x100000 +#define MASTER_SIDE_CP_ALIGNMENT 0x1000 static const char *const mpeg_video_vidc_divx_format[] = { "DIVX Format 3", @@ -650,6 +652,20 @@ static u32 get_frame_size(struct msm_vidc_inst *inst, return frame_size; } +static u32 get_output_frame_size(struct msm_vidc_inst *inst, + const struct msm_vidc_format *fmt, + u32 height, u32 width, int plane) +{ + u32 frame_size = fmt->get_frame_size(plane, + height, width); + if (inst->flags & VIDC_SECURE) { + u32 alignment = inst->core->resources.slave_side_cp ? + SLAVE_SIDE_CP_ALIGNMENT : MASTER_SIDE_CP_ALIGNMENT; + frame_size = MSM_MEDIA_ALIGN(frame_size, alignment); + } + return frame_size; +} + static int is_ctrl_valid_for_codec(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) { @@ -1156,8 +1172,8 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) inst->prop.height[CAPTURE_PORT]); f->fmt.pix_mp.plane_fmt[0].sizeimage = - fmt->get_frame_size(0, - f->fmt.pix_mp.height, f->fmt.pix_mp.width); + get_output_frame_size(inst, fmt, + f->fmt.pix_mp.height, f->fmt.pix_mp.width, 0); extra_idx = EXTRADATA_IDX(fmt->num_planes); if (extra_idx && extra_idx < VIDEO_MAX_PLANES) { @@ -1244,7 +1260,7 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) int max_input_size = 0; struct hal_buffer_requirements *bufreq; - if (!inst || !f) { + if (!inst || !inst->core || !f) { dprintk(VIDC_ERR, "%s invalid parameters\n", __func__); return -EINVAL; } @@ -1288,8 +1304,8 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) } f->fmt.pix_mp.plane_fmt[0].sizeimage = - fmt->get_frame_size(0, - f->fmt.pix_mp.height, f->fmt.pix_mp.width); + get_output_frame_size(inst, fmt, + f->fmt.pix_mp.height, f->fmt.pix_mp.width, 0); extra_idx = EXTRADATA_IDX(fmt->num_planes); if (extra_idx && extra_idx < VIDEO_MAX_PLANES) { @@ -1692,9 +1708,9 @@ static inline int start_streaming(struct msm_vidc_inst *inst) struct msm_vidc_format *fmt = NULL; fmt = inst->fmts[CAPTURE_PORT]; - buffer_size = fmt->get_frame_size(0, + buffer_size = get_output_frame_size(inst, fmt, inst->prop.height[CAPTURE_PORT], - inst->prop.width[CAPTURE_PORT]); + inst->prop.width[CAPTURE_PORT], 0); hdev = inst->core->device; if (msm_comm_get_stream_output_mode(inst) == From 8f9cb75e37c44669d8952d93fed7c82b0d317fa0 Mon Sep 17 00:00:00 2001 From: Divya Ponnusamy Date: Wed, 24 Aug 2016 20:49:31 +0530 Subject: [PATCH 0041/1015] msm: kgsl: Change %p to %pK in debug messages The format specifier %p can leak kernel addresses while not valuing the kptr_restrict system settings. Use %pK instead of %p, which evaluates whether kptr_restrict is set. Change-Id: I0778e43e0a03852ca2944377256a7b401586a747 Signed-off-by: Divya Ponnusamy Signed-off-by: Sudeep Yedalapure --- drivers/gpu/msm/adreno_debugfs.c | 2 +- drivers/gpu/msm/kgsl.c | 5 ++--- drivers/gpu/msm/kgsl_cffdump.c | 7 ------- drivers/gpu/msm/kgsl_cmdbatch.c | 2 +- drivers/gpu/msm/kgsl_iommu.c | 16 ++++++++-------- drivers/gpu/msm/kgsl_snapshot.c | 3 --- 6 files changed, 12 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/msm/adreno_debugfs.c b/drivers/gpu/msm/adreno_debugfs.c index 9cbcd06d76585..680827e5b848c 100644 --- a/drivers/gpu/msm/adreno_debugfs.c +++ b/drivers/gpu/msm/adreno_debugfs.c @@ -138,7 +138,7 @@ static void sync_event_print(struct seq_file *s, break; } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: - seq_printf(s, "sync: [%p] %s", sync_event->handle, + seq_printf(s, "sync: [%pK] %s", sync_event->handle, (sync_event->handle && sync_event->handle->fence) ? sync_event->handle->fence->name : "NULL"); break; diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index f6f1e4a0aabdd..3b4ba6d9cdabd 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -3890,9 +3890,8 @@ int kgsl_device_platform_probe(struct kgsl_device *device) disable_irq(device->pwrctrl.interrupt_num); KGSL_DRV_INFO(device, - "dev_id %d regs phys 0x%08lx size 0x%08x virt %p\n", - device->id, device->reg_phys, device->reg_len, - device->reg_virt); + "dev_id %d regs phys 0x%08lx size 0x%08x\n", + device->id, device->reg_phys, device->reg_len); rwlock_init(&device->context_lock); diff --git a/drivers/gpu/msm/kgsl_cffdump.c b/drivers/gpu/msm/kgsl_cffdump.c index 2e90f78a303c8..8e783f8ce017e 100644 --- a/drivers/gpu/msm/kgsl_cffdump.c +++ b/drivers/gpu/msm/kgsl_cffdump.c @@ -513,10 +513,6 @@ EXPORT_SYMBOL(kgsl_cffdump_waitirq); static int subbuf_start_handler(struct rchan_buf *buf, void *subbuf, void *prev_subbuf, size_t prev_padding) { - pr_debug("kgsl: cffdump: subbuf_start_handler(subbuf=%p, prev_subbuf" - "=%p, prev_padding=%08zx)\n", subbuf, prev_subbuf, - prev_padding); - if (relay_buf_full(buf)) { if (!suspended) { suspended = 1; @@ -573,9 +569,6 @@ static struct rchan *create_channel(unsigned subbuf_size, unsigned n_subbufs) { struct rchan *chan; - pr_info("kgsl: cffdump: relay: create_channel: subbuf_size %u, " - "n_subbufs %u, dir 0x%p\n", subbuf_size, n_subbufs, dir); - chan = relay_open("cpu", dir, subbuf_size, n_subbufs, &relay_callbacks, NULL); if (!chan) { diff --git a/drivers/gpu/msm/kgsl_cmdbatch.c b/drivers/gpu/msm/kgsl_cmdbatch.c index ceca8b1e15226..6272410ce544b 100644 --- a/drivers/gpu/msm/kgsl_cmdbatch.c +++ b/drivers/gpu/msm/kgsl_cmdbatch.c @@ -80,7 +80,7 @@ void kgsl_dump_syncpoints(struct kgsl_device *device, } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: if (event->handle) - dev_err(device->dev, " fence: [%p] %s\n", + dev_err(device->dev, " fence: [%pK] %s\n", event->handle->fence, event->handle->name); else diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c index b467ef81d2577..fb25c2ae3869a 100644 --- a/drivers/gpu/msm/kgsl_iommu.c +++ b/drivers/gpu/msm/kgsl_iommu.c @@ -323,8 +323,8 @@ static int _iommu_map_sync_pc(struct kgsl_pagetable *pt, _unlock_if_secure_mmu(memdesc, pt->mmu); if (ret) { - KGSL_CORE_ERR("map err: %p, 0x%016llX, 0x%llx, 0x%x, %d\n", - iommu_pt->domain, gpuaddr, size, flags, ret); + KGSL_CORE_ERR("map err: 0x%016llX, 0x%llx, 0x%x, %d\n", + gpuaddr, size, flags, ret); return -ENODEV; } @@ -351,8 +351,8 @@ static int _iommu_unmap_sync_pc(struct kgsl_pagetable *pt, _unlock_if_secure_mmu(memdesc, pt->mmu); if (unmapped != size) { - KGSL_CORE_ERR("unmap err: %p, 0x%016llx, 0x%llx, %zd\n", - iommu_pt->domain, addr, size, unmapped); + KGSL_CORE_ERR("unmap err: 0x%016llx, 0x%llx, %zd\n", + addr, size, unmapped); return -ENODEV; } @@ -421,8 +421,8 @@ static int _iommu_map_sg_offset_sync_pc(struct kgsl_pagetable *pt, if (size != 0) { /* Cleanup on error */ _iommu_unmap_sync_pc(pt, memdesc, addr, mapped); - KGSL_CORE_ERR("map err: %p, 0x%016llX, %d, %x, %zd\n", - iommu_pt->domain, addr, nents, flags, mapped); + KGSL_CORE_ERR("map err: 0x%016llX, %d, %x, %zd\n", + addr, nents, flags, mapped); return -ENODEV; } @@ -451,8 +451,8 @@ static int _iommu_map_sg_sync_pc(struct kgsl_pagetable *pt, _unlock_if_secure_mmu(memdesc, pt->mmu); if (mapped == 0) { - KGSL_CORE_ERR("map err: %p, 0x%016llX, %d, %x, %zd\n", - iommu_pt->domain, addr, nents, flags, mapped); + KGSL_CORE_ERR("map err: 0x%016llX, %d, %x, %zd\n", + addr, nents, flags, mapped); return -ENODEV; } diff --git a/drivers/gpu/msm/kgsl_snapshot.c b/drivers/gpu/msm/kgsl_snapshot.c index 17106079f053a..cf4d77932e147 100644 --- a/drivers/gpu/msm/kgsl_snapshot.c +++ b/drivers/gpu/msm/kgsl_snapshot.c @@ -1074,9 +1074,6 @@ void kgsl_snapshot_save_frozen_objs(struct work_struct *work) goto done; snapshot->mempool = vmalloc(size); - if (snapshot->mempool != NULL) - KGSL_DRV_ERR(device, "snapshot: mempool address %p, size %zx\n", - snapshot->mempool, size); ptr = snapshot->mempool; snapshot->mempool_size = 0; From 2dd0104a486a183262fb25ecbcf5534418dcd87a Mon Sep 17 00:00:00 2001 From: Vamsi Krishna Samavedam Date: Wed, 17 Aug 2016 12:44:37 -0700 Subject: [PATCH 0042/1015] ARM: dts: msm: update qusb tune1 param for msm8996pro Update qusb tune1/tune5 parameter to pass USB electrical compliance tests. Change-Id: I1a1eebb7c14660f9fe5336df711f1a1c9016602e Signed-off-by: Vamsi Krishna Samavedam --- arch/arm/boot/dts/qcom/msm8996pro.dtsi | 28 ++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8996pro.dtsi b/arch/arm/boot/dts/qcom/msm8996pro.dtsi index 4366fa6a19e7f..a9878d11d2e46 100644 --- a/arch/arm/boot/dts/qcom/msm8996pro.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996pro.dtsi @@ -1184,3 +1184,31 @@ }; }; }; + +&qusb_phy0 { + qcom,qusb-phy-init-seq = <0xD0 0x80 + 0xB3 0x84 + 0x83 0x88 + 0xC0 0x8C + 0x02 0x90 + 0x30 0x08 + 0x79 0x0C + 0x21 0x10 + 0x14 0x9C + 0x9F 0x1C + 0x00 0x18>; +}; + +&qusb_phy1 { + qcom,qusb-phy-init-seq = <0xD0 0x80 + 0xB3 0x84 + 0x83 0x88 + 0xC0 0x8C + 0x02 0x90 + 0x30 0x08 + 0x79 0x0C + 0x21 0x10 + 0x14 0x9C + 0x9F 0x1C + 0x00 0x18>; +}; From 1aa911dafc995dda43e2a1ff38a1373bdd2c959b Mon Sep 17 00:00:00 2001 From: Vijayavardhan Vennapusa Date: Wed, 24 Aug 2016 16:46:15 +0530 Subject: [PATCH 0043/1015] USB: phy: msm: Fix poweroff charging issue During bootup, if cable is connected, PMIC does set online property of USB power supply and then notifies charger type and cable connect status to USB driver. If disconnect happens during this time, USB driver need to clear online flag. But this causes issues in case of power off charging mode if msm_otg_notify_charger() with 0mA current. Hence fix this by having check for charger type is invalid and then only clear online property. CRs-Fixed: 1058664 Change-Id: Ibb9e9ba7045d5261cc10fdb5737c1c6e1151dac3 Signed-off-by: Vijayavardhan Vennapusa --- drivers/usb/phy/phy-msm-usb.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index b2b060b0cc289..d9c96cc1a8292 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c @@ -1812,9 +1812,11 @@ static void msm_otg_notify_charger(struct msm_otg *motg, unsigned mA) /* * This condition will be true when usb cable is disconnected - * during bootup before charger detection mechanism starts. + * during bootup before enumeration. Check charger type also + * to avoid clearing online flag in case of valid charger. */ - if (motg->online && motg->cur_power == 0 && mA == 0) + if (motg->online && motg->cur_power == 0 && mA == 0 && + (motg->chg_type == USB_INVALID_CHARGER)) msm_otg_set_online_status(motg); if (motg->cur_power == mA) From 9eb08b6cc46e352f0e6b26f8b3eba43b767c9941 Mon Sep 17 00:00:00 2001 From: Karthikeyan Ramasubramanian Date: Tue, 16 Aug 2016 11:24:00 -0600 Subject: [PATCH 0044/1015] soc: qcom: smp2p: Fix kernel address leak Change format string to %pK instead of %p in the debug statements. This change fixes kernel address leaks from the usage of %p. CRs-Fixed: 1052825 Change-Id: Ib95f691919a2977f5436cd4c6ac4a002d70dd729 Signed-off-by: Chris Lew Signed-off-by: Karthikeyan Ramasubramanian --- drivers/gpio/gpio-msm-smp2p.c | 4 ++-- drivers/soc/qcom/smp2p.c | 6 +++--- drivers/soc/qcom/smp2p_debug.c | 4 ++-- drivers/soc/qcom/smp2p_test_common.h | 5 +++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/drivers/gpio/gpio-msm-smp2p.c b/drivers/gpio/gpio-msm-smp2p.c index bde81f0473bdb..ee7be47f115f9 100644 --- a/drivers/gpio/gpio-msm-smp2p.c +++ b/drivers/gpio/gpio-msm-smp2p.c @@ -1,6 +1,6 @@ /* drivers/gpio/gpio-msm-smp2p.c * - * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014, 2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -368,7 +368,7 @@ static int smp2p_irq_map(struct irq_domain *domain_ptr, unsigned int virq, chip = domain_ptr->host_data; if (!chip) { - SMP2P_ERR("%s: invalid domain ptr %p\n", __func__, domain_ptr); + SMP2P_ERR("%s: invalid domain ptr\n", __func__); return -ENODEV; } diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c index fc5688b4bc8c7..79b8ffbc5ee7b 100644 --- a/drivers/soc/qcom/smp2p.c +++ b/drivers/soc/qcom/smp2p.c @@ -1,6 +1,6 @@ /* drivers/soc/qcom/smp2p.c * - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -519,8 +519,8 @@ static void smp2p_find_entry_v1(struct smp2p_smem __iomem *item, char entry_name[SMP2P_MAX_ENTRY_NAME]; if (!item || !name || !entry_ptr) { - SMP2P_ERR("%s: invalid arguments %p, %p, %p\n", - __func__, item, name, entry_ptr); + SMP2P_ERR("%s: invalid arguments %d %d %d\n", + __func__, !item, !name, !entry_ptr); return; } diff --git a/drivers/soc/qcom/smp2p_debug.c b/drivers/soc/qcom/smp2p_debug.c index 4deb05a081391..8d98d07c1adf4 100644 --- a/drivers/soc/qcom/smp2p_debug.c +++ b/drivers/soc/qcom/smp2p_debug.c @@ -1,6 +1,6 @@ /* drivers/soc/qcom/smp2p_debug.c * - * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014,2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -41,7 +41,7 @@ static void smp2p_int_stats(struct seq_file *s) pid != SMP2P_REMOTE_MOCK_PROC) continue; - seq_printf(s, "| %5s (%d) | %11u | %10u | %10u | %p | %08x |\n", + seq_printf(s, "| %5s (%d) | %11u | %10u | %10u | %pK | %08x |\n", int_cfg[pid].name, pid, int_cfg[pid].in_int_id, int_cfg[pid].in_interrupt_count, diff --git a/drivers/soc/qcom/smp2p_test_common.h b/drivers/soc/qcom/smp2p_test_common.h index 747a812d82c5a..3be519bc0c96f 100644 --- a/drivers/soc/qcom/smp2p_test_common.h +++ b/drivers/soc/qcom/smp2p_test_common.h @@ -1,6 +1,6 @@ /* drivers/soc/qcom/smp2p_test_common.h * - * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014,2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -49,7 +49,8 @@ void *a_tmp = (a); \ void *b_tmp = (b); \ if (!((a_tmp)cmp(b_tmp))) { \ - seq_printf(s, "%s:%d Fail: " #a "(%p) " #cmp " " #b "(%p)\n", \ + seq_printf(s, "%s:%d Fail: " #a "(%pK) " #cmp \ + " " #b "(%pK)\n", \ __func__, __LINE__, \ a_tmp, b_tmp); \ failed = 1; \ From 01eeb6702546891dabc548392775f798fa8e1117 Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Mon, 29 Aug 2016 15:44:29 +0530 Subject: [PATCH 0045/1015] thermal: qpnp-temp-alarm: Configure TEMP ALARM in the shutdown path Force the TEMP ALARM into FOLLOW_HW_EN mode in the system shutdown path, to avoid leakage when device is powered-off. CRs-Fixed: 1059981 Change-Id: I7017d7ecc9b75570c41a13c49ac67045052630e9 Signed-off-by: Anirudh Ghayal --- drivers/thermal/qpnp-temp-alarm.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/thermal/qpnp-temp-alarm.c b/drivers/thermal/qpnp-temp-alarm.c index 6004fdc0ef550..087122ce9e107 100644 --- a/drivers/thermal/qpnp-temp-alarm.c +++ b/drivers/thermal/qpnp-temp-alarm.c @@ -725,6 +725,19 @@ static int qpnp_tm_remove(struct spmi_device *spmi) return 0; } +static void qpnp_tm_shutdown(struct spmi_device *spmi) +{ + struct qpnp_tm_chip *chip = dev_get_drvdata(&spmi->dev); + int rc; + u8 reg; + + /* configure TEMP_ALARM to follow HW_EN */ + reg = ALARM_CTRL_FOLLOW_HW_ENABLE; + rc = qpnp_tm_write(chip, QPNP_TM_REG_ALARM_CTRL, ®, 1); + if (rc) + pr_err("Failed to cfg. TEMP_ALARM to follow HW_EN rc=%d\n", rc); +} + #ifdef CONFIG_PM static int qpnp_tm_suspend(struct device *dev) { @@ -776,6 +789,7 @@ static struct spmi_driver qpnp_tm_driver = { }, .probe = qpnp_tm_probe, .remove = qpnp_tm_remove, + .shutdown = qpnp_tm_shutdown, .id_table = qpnp_tm_id, }; From e909d159ad1998ada853ed35be27c7b6ba241bdb Mon Sep 17 00:00:00 2001 From: Walter Yang Date: Wed, 27 Jul 2016 15:07:53 +0800 Subject: [PATCH 0046/1015] ASoC: msm: set pointers to NULL after kfree In lsm-related driver files, some pointers are not set as NULL after the memory is freed, which will leave many dangling pointers. Set them to NULL explicitly to avoid potential risk. CRs-Fixed: 880388 Change-Id: I44925240705608510266a51225cc02611637c571 Signed-off-by: Walter Yang --- sound/soc/msm/msm-cpe-lsm.c | 7 +++++++ sound/soc/msm/qdsp6v2/msm-dai-slim.c | 2 ++ sound/soc/msm/qdsp6v2/q6lsm.c | 1 + 3 files changed, 10 insertions(+) diff --git a/sound/soc/msm/msm-cpe-lsm.c b/sound/soc/msm/msm-cpe-lsm.c index 9f957e530817a..a529fccd1c842 100644 --- a/sound/soc/msm/msm-cpe-lsm.c +++ b/sound/soc/msm/msm-cpe-lsm.c @@ -1219,6 +1219,7 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: No memory for sound model\n", __func__); kfree(session->conf_levels); + session->conf_levels = NULL; return -ENOMEM; } session->snd_model_size = snd_model.data_size; @@ -1230,6 +1231,8 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, __func__); kfree(session->conf_levels); kfree(session->snd_model_data); + session->conf_levels = NULL; + session->snd_model_data = NULL; return -EFAULT; } @@ -1241,6 +1244,8 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, __func__, rc); kfree(session->snd_model_data); kfree(session->conf_levels); + session->snd_model_data = NULL; + session->conf_levels = NULL; return rc; } @@ -1254,6 +1259,8 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, lsm_ops->lsm_shmem_dealloc(cpe->core_handle, session); kfree(session->snd_model_data); kfree(session->conf_levels); + session->snd_model_data = NULL; + session->conf_levels = NULL; return rc; } diff --git a/sound/soc/msm/qdsp6v2/msm-dai-slim.c b/sound/soc/msm/qdsp6v2/msm-dai-slim.c index b46d0a53adc2f..4bb8f59c27e99 100644 --- a/sound/soc/msm/qdsp6v2/msm-dai-slim.c +++ b/sound/soc/msm/qdsp6v2/msm-dai-slim.c @@ -482,7 +482,9 @@ static void msm_dai_slim_remove_dai_data( dai_data_t = &drv_data->slim_dai_data[i]; kfree(dai_data_t->chan_h); + dai_data_t->chan_h = NULL; kfree(dai_data_t->sh_ch); + dai_data_t->sh_ch = NULL; } } diff --git a/sound/soc/msm/qdsp6v2/q6lsm.c b/sound/soc/msm/qdsp6v2/q6lsm.c index ec734722b4158..2bf0c490e834d 100644 --- a/sound/soc/msm/qdsp6v2/q6lsm.c +++ b/sound/soc/msm/qdsp6v2/q6lsm.c @@ -348,6 +348,7 @@ void q6lsm_client_free(struct lsm_client *client) q6lsm_mmap_apr_dereg(); mutex_destroy(&client->cmd_lock); kfree(client); + client = NULL; } /* From 79b177db598802b6a372368db38d2cb449dab96e Mon Sep 17 00:00:00 2001 From: Vijayavardhan Vennapusa Date: Thu, 18 Aug 2016 11:57:18 +0530 Subject: [PATCH 0047/1015] usb: gadget: composite: Add spinlock protection for usb config descriptor During composition switch, android driver stops data transfers first and removes configuration before disabling pullup for USB3 controller. With this sequence there is a possibility for a race where usb_remove_config is in progress during which pullup is active and sending the setup request for configuration descriptor with zero configuration value. Hence fix the issue by adding spinlock protection for get_config descriptor. CRs-Fixed: 1052608 Change-Id: I65d38387f77addc9a8894a74f427d97313f90a9e Signed-off-by: Vijayavardhan Vennapusa --- drivers/usb/gadget/composite.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 777e634a70e5f..006f1ea4662c6 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -1673,7 +1673,9 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) if (!gadget_is_dualspeed(gadget) || gadget->speed >= USB_SPEED_SUPER) break; + spin_lock(&cdev->lock); device_qual(cdev); + spin_unlock(&cdev->lock); value = min_t(int, w_length, sizeof(struct usb_qualifier_descriptor)); break; @@ -1683,7 +1685,9 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) break; /* FALLTHROUGH */ case USB_DT_CONFIG: + spin_lock(&cdev->lock); value = config_desc(cdev, w_value); + spin_unlock(&cdev->lock); if (value >= 0) value = min(w_length, (u16) value); break; From 99375f34793ddcda380dc05e3f55eafc72fffc0f Mon Sep 17 00:00:00 2001 From: Kiran Gunda Date: Fri, 2 Sep 2016 14:28:56 +0530 Subject: [PATCH 0048/1015] ARM: dts: msm: add IPA node for msm8920 Add the IPA node to the bus topology to enable the IPA client to vote for bus bandwidth using the bus scaling driver. CRs-fixed: 1057525 Change-Id: I6788a5f27ed90294e98312f6e82a5972e3e9fb37 Signed-off-by: Kiran Gunda --- arch/arm/boot/dts/qcom/msm8920.dtsi | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 98caed9797650..e198274612d74 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -22,3 +22,20 @@ soc: soc { }; }; + +&ad_hoc_bus { + mas_ipa: mas-ipa { + cell-id = ; + label = "mas-ipa"; + qcom,buswidth = <8>; + qcom,agg-ports = <1>; + qcom,ap-owned; + qcom,qport = <14>; + qcom,qos-mode = "fixed"; + qcom,connections = <&snoc_int_1 &slv_snoc_bimc_1>; + qcom,prio1 = <0>; + qcom,prio0 = <0>; + qcom,bus-dev = <&fab_snoc>; + qcom,mas-rpm-id = ; + }; +}; From dc5e3b5ae89d47062cdfc57019b7a9313a2c02a8 Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Sat, 27 Aug 2016 22:53:22 -0700 Subject: [PATCH 0049/1015] msm: ipa: fix skb recycle logic skbs are recycled on LAN pipe. This changes fixes a bug where the skb was freed before recycle. Change-Id: I35734cd41aee8bdd2764d6307f76bedcb916a07b CRs-Fixed: 1060534 Acked-by: Ady Abraham Signed-off-by: Skylar Chang --- drivers/platform/msm/ipa/ipa_v2/ipa_dp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c index 9f6a41f8eb841..5b867727bb3df 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c @@ -2324,7 +2324,7 @@ static int ipa_lan_rx_pyld_hdlr(struct sk_buff *skb, if (skb->len < IPA_PKT_STATUS_SIZE) { WARN_ON(sys->prev_skb != NULL); IPADBG("status straddles buffer\n"); - sys->prev_skb = skb; + sys->prev_skb = skb_copy(skb, GFP_KERNEL); sys->len_partial = skb->len; return rc; } @@ -2409,7 +2409,7 @@ static int ipa_lan_rx_pyld_hdlr(struct sk_buff *skb, !status->exception) { WARN_ON(sys->prev_skb != NULL); IPADBG("Ins header in next buffer\n"); - sys->prev_skb = skb; + sys->prev_skb = skb_copy(skb, GFP_KERNEL); sys->len_partial = skb->len; return rc; } From 51b529ef2453a66c2bdf07fd8145636688a9cd33 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Wed, 24 Aug 2016 18:15:49 +0530 Subject: [PATCH 0050/1015] clk: msm: gcc: Add support for clocks for MSM8920 Add support for a new compatible flag to differentiate msm8920 and update the required clock lookup table accordingly. CRs-fixed: 1059324 Change-Id: Id1d4c3e9b1e825044936ecef692d3f47bc32bca3 Signed-off-by: Odelu Kukatla --- .../bindings/arm/msm/clock-controller.txt | 3 ++ drivers/clk/msm/clock-gcc-8952.c | 37 +++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/arm/msm/clock-controller.txt b/Documentation/devicetree/bindings/arm/msm/clock-controller.txt index 20b46dc5dfeff..62440baac3287 100644 --- a/Documentation/devicetree/bindings/arm/msm/clock-controller.txt +++ b/Documentation/devicetree/bindings/arm/msm/clock-controller.txt @@ -27,6 +27,7 @@ Required properties: "qcom,gcc-spm-8937" "qcom,gcc-8953" "qcom,gcc-8940" + "qcom,gcc-8920" "qcom,rpmcc-8994" "qcom,rpmcc-8992" "qcom,rpmcc-8916" @@ -46,6 +47,7 @@ Required properties: "qcom,cc-debug-8937" "qcom,cc-debug-8917" "qcom,cc-debug-8940" + "qcom,cc-debug-8920" "qcom,gcc-mdss-8936" "qcom,gcc-mdss-8909" "qcom,gcc-mdss-8916" @@ -54,6 +56,7 @@ Required properties: "qcom,gcc-mdss-8917" "qcom,gcc-mdss-8953" "qcom,gcc-mdss-8940" + "qcom,gcc-mdss-8920" "qcom,mmsscc-8994v2" "qcom,mmsscc-8994" "qcom,mmsscc-8992" diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c index 1098946c984e8..76b25462c8add 100644 --- a/drivers/clk/msm/clock-gcc-8952.c +++ b/drivers/clk/msm/clock-gcc-8952.c @@ -4014,6 +4014,22 @@ static struct clk_lookup msm_clocks_lookup_8917[] = { CLK_LIST(gcc_gtcu_ahb_clk), }; +static struct clk_lookup msm_clocks_lookup_8920[] = { + CLK_LIST(gpll0_clk_src_8937), + CLK_LIST(gpll0_ao_clk_src_8937), + CLK_LIST(gpll0_sleep_clk_src), + CLK_LIST(bimc_gpu_clk), + CLK_LIST(bimc_gpu_a_clk), + CLK_LIST(gcc_dcc_clk), + CLK_LIST(gcc_qdss_dap_clk), + CLK_LIST(gcc_gfx_tcu_clk), + CLK_LIST(gcc_gfx_tbu_clk), + CLK_LIST(gcc_gtcu_ahb_clk), + CLK_LIST(ipa_clk), + CLK_LIST(ipa_a_clk), + CLK_LIST(gcc_ipa_tbu_clk), +}; + static struct clk_lookup msm_clocks_lookup_8940[] = { CLK_LIST(gpll0_clk_src_8937), CLK_LIST(gpll0_ao_clk_src_8937), @@ -4259,6 +4275,7 @@ static int msm_gcc_probe(struct platform_device *pdev) bool compat_bin = false; bool compat_bin2 = false; bool compat_bin3 = false; + bool compat_bin4 = false; compat_bin = of_device_is_compatible(pdev->dev.of_node, "qcom,gcc-8937"); @@ -4269,6 +4286,9 @@ static int msm_gcc_probe(struct platform_device *pdev) compat_bin3 = of_device_is_compatible(pdev->dev.of_node, "qcom,gcc-8940"); + compat_bin4 = of_device_is_compatible(pdev->dev.of_node, + "qcom,gcc-8920"); + ret = vote_bimc(&bimc_clk, INT_MAX); if (ret < 0) return ret; @@ -4301,7 +4321,7 @@ static int msm_gcc_probe(struct platform_device *pdev) return PTR_ERR(vdd_dig.regulator[0]); } - if (!compat_bin2) { + if (!compat_bin2 && !compat_bin4) { vdd_sr2_pll.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_sr2_pll"); if (IS_ERR(vdd_sr2_pll.regulator[0])) { @@ -4359,7 +4379,7 @@ static int msm_gcc_probe(struct platform_device *pdev) ftbl_gcc_oxili_gfx3d_clk_8937_475MHz; gfx3d_clk_src.c.fmax[VDD_DIG_SUPER_TUR] = 475000000; } - } else if (compat_bin2) { + } else if (compat_bin2 || compat_bin4) { gpll0_clk_src.c.parent = &gpll0_clk_src_8937.c; gpll0_ao_clk_src.c.parent = &gpll0_ao_clk_src_8937.c; vdd_dig.num_levels = VDD_DIG_NUM_8917; @@ -4391,6 +4411,10 @@ static int msm_gcc_probe(struct platform_device *pdev) ret = of_msm_clock_register(pdev->dev.of_node, msm_clocks_lookup_8940, ARRAY_SIZE(msm_clocks_lookup_8940)); + else if (compat_bin4) + ret = of_msm_clock_register(pdev->dev.of_node, + msm_clocks_lookup_8920, + ARRAY_SIZE(msm_clocks_lookup_8920)); else ret = of_msm_clock_register(pdev->dev.of_node, msm_clocks_lookup_8952, @@ -4442,6 +4466,7 @@ static struct of_device_id msm_clock_gcc_match_table[] = { { .compatible = "qcom,gcc-8937" }, { .compatible = "qcom,gcc-8917" }, { .compatible = "qcom,gcc-8940" }, + { .compatible = "qcom,gcc-8920" }, {} }; @@ -4557,6 +4582,7 @@ static int msm_clock_debug_probe(struct platform_device *pdev) struct resource *res; bool compat_bin = false, compat_bin2 = false; bool compat_bin3 = false; + bool compat_bin4 = false; compat_bin = of_device_is_compatible(pdev->dev.of_node, "qcom,cc-debug-8937"); @@ -4567,6 +4593,9 @@ static int msm_clock_debug_probe(struct platform_device *pdev) compat_bin3 = of_device_is_compatible(pdev->dev.of_node, "qcom,cc-debug-8940"); + compat_bin4 = of_device_is_compatible(pdev->dev.of_node, + "qcom,cc-debug-8920"); + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "meas"); if (!res) { dev_err(&pdev->dev, "GLB clock diag base not defined.\n"); @@ -4585,7 +4614,7 @@ static int msm_clock_debug_probe(struct platform_device *pdev) if (compat_bin2) gcc_debug_mux_8937.post_div = 0x3; - if (!compat_bin && !compat_bin2 && !compat_bin3) + if (!compat_bin && !compat_bin2 && !compat_bin3 && !compat_bin4) ret = of_msm_clock_register(pdev->dev.of_node, msm_clocks_measure, ARRAY_SIZE(msm_clocks_measure)); else @@ -4606,6 +4635,7 @@ static struct of_device_id msm_clock_debug_match_table[] = { { .compatible = "qcom,cc-debug-8937" }, { .compatible = "qcom,cc-debug-8917" }, { .compatible = "qcom,cc-debug-8940" }, + { .compatible = "qcom,cc-debug-8920" }, {} }; @@ -4729,6 +4759,7 @@ static struct of_device_id msm_clock_mdss_match_table[] = { { .compatible = "qcom,gcc-mdss-8937" }, { .compatible = "qcom,gcc-mdss-8917" }, { .compatible = "qcom,gcc-mdss-8940" }, + { .compatible = "qcom,gcc-mdss-8920" }, {} }; From 6375e46c6ab78befa0ab4f1b566ea0b36b6458f7 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Wed, 24 Aug 2016 17:12:46 +0530 Subject: [PATCH 0051/1015] ARM: dts: msm: Add support for clocks for MSM8920 Compatible property needs to be updated for MSM8920, so update the same in device tree file. CRs-fixed: 1059324 Change-Id: I329fc4fe1eda996169e7a20b929b25e7e0abd2d3 Signed-off-by: Odelu Kukatla --- arch/arm/boot/dts/qcom/msm8920.dtsi | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index e198274612d74..a12f13ae88156 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -39,3 +39,15 @@ qcom,mas-rpm-id = ; }; }; + +&clock_gcc { + compatible = "qcom,gcc-8920"; +}; + +&clock_debug { + compatible = "qcom,cc-debug-8920"; +}; + +&clock_gcc_mdss { + compatible = "qcom,gcc-mdss-8920"; +}; From 55b088da0dad2ed12ae8d5afa52684d385d9cbaa Mon Sep 17 00:00:00 2001 From: Archana Sathyakumar Date: Wed, 29 Jun 2016 11:47:47 -0600 Subject: [PATCH 0052/1015] msm-core: debug: Fix the number of arguments for sysfs nodes Ptable and enable node parses the input arguments incorrectly. Parse the input message into exact number of arguments that are required for the respective nodes. CRs-fixed: 1032875 Change-Id: I881f18217b703a497efa4799288dee39a28ea8ab Signed-off-by: Archana Sathyakumar --- drivers/power/qcom/debug_core.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/power/qcom/debug_core.c b/drivers/power/qcom/debug_core.c index d3620bbbeafa0..e9c578f7b75ef 100644 --- a/drivers/power/qcom/debug_core.c +++ b/drivers/power/qcom/debug_core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -22,6 +22,8 @@ #include "soc/qcom/msm-core.h" #define MAX_PSTATES 50 +#define NUM_OF_PENTRY 3 /* number of variables for ptable node */ +#define NUM_OF_EENTRY 2 /* number of variables for enable node */ enum arg_offset { CPU_OFFSET, @@ -131,13 +133,15 @@ static void add_to_ptable(uint64_t *arg) node->ptr->len = node->len; } -static int split_ptable_args(char *line, uint64_t *arg) +static int split_ptable_args(char *line, uint64_t *arg, uint32_t n) { char *args; int i; int ret = 0; - for (i = 0; line; i++) { + for (i = 0; i < n; i++) { + if (!line) + break; args = strsep(&line, " "); ret = kstrtoull(args, 10, &arg[i]); } @@ -163,7 +167,7 @@ static ssize_t msm_core_ptable_write(struct file *file, goto done; } kbuf[len] = '\0'; - ret = split_ptable_args(kbuf, arg); + ret = split_ptable_args(kbuf, arg, NUM_OF_PENTRY); if (!ret) { add_to_ptable(arg); ret = len; @@ -227,7 +231,7 @@ static ssize_t msm_core_enable_write(struct file *file, goto done; } kbuf[len] = '\0'; - ret = split_ptable_args(kbuf, arg); + ret = split_ptable_args(kbuf, arg, NUM_OF_EENTRY); if (ret) goto done; cpu = arg[CPU_OFFSET]; From deea29028a77f44f71acafbf398e2892cc966073 Mon Sep 17 00:00:00 2001 From: Archana Sathyakumar Date: Mon, 22 Aug 2016 15:20:02 -0600 Subject: [PATCH 0053/1015] msm-core: debug: Update the number of supported pstates Update the number of power-freq pair value supported in the debug interface. Parse the arguments as uint32_t instead of uint64_t which might cause memory corruption. CRs-fixed: 1054344 Change-Id: I30492b79b96356177cdcc72e4e2ee656317de500 Signed-off-by: Archana Sathyakumar --- drivers/power/qcom/debug_core.c | 51 ++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/drivers/power/qcom/debug_core.c b/drivers/power/qcom/debug_core.c index e9c578f7b75ef..ccef04ae9eb24 100644 --- a/drivers/power/qcom/debug_core.c +++ b/drivers/power/qcom/debug_core.c @@ -84,15 +84,28 @@ static struct debugfs_blob_wrapper help_msg = { }; -static void add_to_ptable(uint64_t *arg) +static void add_to_ptable(unsigned int *arg) { struct core_debug *node; int i, cpu = arg[CPU_OFFSET]; + uint32_t freq = arg[FREQ_OFFSET]; + uint32_t power = arg[POWER_OFFSET]; if (!cpu_possible(cpu)) return; + if ((freq == 0) || (power == 0)) { + pr_warn("Incorrect power data\n"); + return; + } + node = &per_cpu(c_dgfs, cpu); + + if (node->len >= MAX_PSTATES) { + pr_warn("Dropped ptable update - no space left.\n"); + return; + } + if (!node->head) { node->head = kzalloc(sizeof(struct cpu_pstate_pwr) * (MAX_PSTATES + 1), @@ -100,24 +113,18 @@ static void add_to_ptable(uint64_t *arg) if (!node->head) return; } - for (i = 0; i < MAX_PSTATES; i++) { - if (node->head[i].freq == arg[FREQ_OFFSET]) { - node->head[i].power = arg[POWER_OFFSET]; + + for (i = 0; i < node->len; i++) { + if (node->head[i].freq == freq) { + node->head[i].power = power; return; } - if (node->head[i].freq == 0) - break; - } - - if (i == MAX_PSTATES) { - pr_warn("Dropped ptable update - no space left.\n"); - return; } /* Insert a new frequency (may need to move things around to keep in ascending order). */ for (i = MAX_PSTATES - 1; i > 0; i--) { - if (node->head[i-1].freq > arg[FREQ_OFFSET]) { + if (node->head[i-1].freq > freq) { node->head[i].freq = node->head[i-1].freq; node->head[i].power = node->head[i-1].power; } else if (node->head[i-1].freq != 0) { @@ -125,15 +132,17 @@ static void add_to_ptable(uint64_t *arg) } } - node->head[i].freq = arg[FREQ_OFFSET]; - node->head[i].power = arg[POWER_OFFSET]; - node->len++; + if (node->len < MAX_PSTATES) { + node->head[i].freq = freq; + node->head[i].power = power; + node->len++; + } if (node->ptr) node->ptr->len = node->len; } -static int split_ptable_args(char *line, uint64_t *arg, uint32_t n) +static int split_ptable_args(char *line, unsigned int *arg, uint32_t n) { char *args; int i; @@ -143,7 +152,9 @@ static int split_ptable_args(char *line, uint64_t *arg, uint32_t n) if (!line) break; args = strsep(&line, " "); - ret = kstrtoull(args, 10, &arg[i]); + ret = kstrtouint(args, 10, &arg[i]); + if (ret) + return ret; } return ret; } @@ -153,7 +164,7 @@ static ssize_t msm_core_ptable_write(struct file *file, { char *kbuf; int ret; - uint64_t arg[3]; + unsigned int arg[3]; if (len == 0) return 0; @@ -205,7 +216,7 @@ static int msm_core_ptable_read(struct seq_file *m, void *data) seq_printf(m, "--- CPU%d - Live numbers at %ldC---\n", cpu, node->ptr->temp); print_table(m, msm_core_data[cpu].ptable, - msm_core_data[cpu].len); + node->driver_len); } } return 0; @@ -216,7 +227,7 @@ static ssize_t msm_core_enable_write(struct file *file, { char *kbuf; int ret; - uint64_t arg[3]; + unsigned int arg[3]; int cpu; if (len == 0) From 3b9411cf8d5b3892907d28481bfb034b21a1e8c2 Mon Sep 17 00:00:00 2001 From: Xiaojun Sang Date: Tue, 30 Aug 2016 14:21:57 +0800 Subject: [PATCH 0054/1015] ASoC: soc: change audio drivers to use %pK Change all audio driver to use %pK instead of %p. %pK hides addresses when the users doesn't have kernel permissions. If address information is needed echo 0 > /proc/sys/kernel/kptr_restrict. CRs-Fixed: 1052832 Change-Id: I9ff5cf06b019c566973eb609bf5d37969b98d31d Signed-off-by: Xiaojun Sang --- sound/soc/codecs/msm8x16-wcd.c | 2 +- sound/soc/codecs/wcd-mbhc-v2.c | 2 +- sound/soc/codecs/wcd9320.c | 4 ++-- sound/soc/codecs/wcd9330.c | 12 ++++++------ sound/soc/codecs/wcd9335.c | 6 +++--- sound/soc/codecs/wcd9xxx-mbhc.c | 6 +++--- sound/soc/codecs/wcd_cpe_core.c | 2 +- sound/soc/codecs/wsa881x.c | 2 +- sound/soc/msm/msm-cpe-lsm.c | 14 +++++++------- 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/sound/soc/codecs/msm8x16-wcd.c b/sound/soc/codecs/msm8x16-wcd.c index a63d01700414c..f6c7839aa2684 100644 --- a/sound/soc/codecs/msm8x16-wcd.c +++ b/sound/soc/codecs/msm8x16-wcd.c @@ -6203,7 +6203,7 @@ static int msm8x16_wcd_spmi_probe(struct spmi_device *spmi) } - dev_dbg(&spmi->dev, "%s(%d):start addr = 0x%pa\n", + dev_dbg(&spmi->dev, "%s(%d):start addr = 0x%pK\n", __func__, __LINE__, &wcd_resource->start); if (wcd_resource->start != TOMBAK_CORE_0_SPMI_ADDR) diff --git a/sound/soc/codecs/wcd-mbhc-v2.c b/sound/soc/codecs/wcd-mbhc-v2.c index e8c33409e2919..19ac004cd3dc8 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.c +++ b/sound/soc/codecs/wcd-mbhc-v2.c @@ -2298,7 +2298,7 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, schedule_delayed_work(&mbhc->mbhc_firmware_dwork, usecs_to_jiffies(FW_READ_TIMEOUT)); else - pr_err("%s: Skipping to read mbhc fw, 0x%p %p\n", + pr_err("%s: Skipping to read mbhc fw, 0x%pK %pK\n", __func__, mbhc->mbhc_fw, mbhc->mbhc_cal); } pr_debug("%s: leave %d\n", __func__, rc); diff --git a/sound/soc/codecs/wcd9320.c b/sound/soc/codecs/wcd9320.c index 20aee359248f5..cb91030a8ef81 100644 --- a/sound/soc/codecs/wcd9320.c +++ b/sound/soc/codecs/wcd9320.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2014, 2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -4734,7 +4734,7 @@ static int taiko_set_channel_map(struct snd_soc_dai *dai, struct taiko_priv *taiko = snd_soc_codec_get_drvdata(dai->codec); struct wcd9xxx *core = dev_get_drvdata(dai->codec->dev->parent); if (!tx_slot || !rx_slot) { - pr_err("%s: Invalid tx_slot=%p, rx_slot=%p\n", __func__, + pr_err("%s: Invalid tx_slot=%pK, rx_slot=%pK\n", __func__, tx_slot, rx_slot); return -EINVAL; } diff --git a/sound/soc/codecs/wcd9330.c b/sound/soc/codecs/wcd9330.c index 47d1d38e3133b..22f3f85e564b7 100644 --- a/sound/soc/codecs/wcd9330.c +++ b/sound/soc/codecs/wcd9330.c @@ -5314,7 +5314,7 @@ static int tomtom_set_channel_map(struct snd_soc_dai *dai, struct tomtom_priv *tomtom = snd_soc_codec_get_drvdata(dai->codec); struct wcd9xxx *core = dev_get_drvdata(dai->codec->dev->parent); if (!tx_slot || !rx_slot) { - pr_err("%s: Invalid tx_slot=%p, rx_slot=%p\n", + pr_err("%s: Invalid tx_slot=%pK, rx_slot=%pK\n", __func__, tx_slot, rx_slot); return -EINVAL; } @@ -5359,7 +5359,7 @@ static int tomtom_get_channel_map(struct snd_soc_dai *dai, case AIF2_PB: case AIF3_PB: if (!rx_slot || !rx_num) { - pr_err("%s: Invalid rx_slot %p or rx_num %p\n", + pr_err("%s: Invalid rx_slot %pK or rx_num %pK\n", __func__, rx_slot, rx_num); return -EINVAL; } @@ -5378,7 +5378,7 @@ static int tomtom_get_channel_map(struct snd_soc_dai *dai, case AIF4_VIFEED: case AIF4_MAD_TX: if (!tx_slot || !tx_num) { - pr_err("%s: Invalid tx_slot %p or tx_num %p\n", + pr_err("%s: Invalid tx_slot %pK or tx_num %pK\n", __func__, tx_slot, tx_num); return -EINVAL; } @@ -8068,7 +8068,7 @@ static void tomtom_compute_impedance(struct wcd9xxx_mbhc *mbhc, s16 *l, s16 *r, struct tomtom_priv *tomtom; if (!mbhc) { - pr_err("%s: Invalid parameters mbhc = %p\n", + pr_err("%s: Invalid parameters mbhc = %pK\n", __func__, mbhc); return; } @@ -8127,7 +8127,7 @@ static void tomtom_zdet_error_approx(struct wcd9xxx_mbhc *mbhc, uint32_t *zl, const int shift = TOMTOM_ZDET_ERROR_APPROX_SHIFT; if (!zl || !zr || !mbhc) { - pr_err("%s: Invalid parameters zl = %p zr = %p, mbhc = %p\n", + pr_err("%s: Invalid parameters zl = %pK zr = %pK, mbhc = %pK\n", __func__, zl, zr, mbhc); return; } @@ -8444,7 +8444,7 @@ static int tomtom_codec_fll_enable(struct snd_soc_codec *codec, struct wcd9xxx *wcd9xxx; if (!codec || !codec->control_data) { - pr_err("%s: Invalid codec handle, %p\n", + pr_err("%s: Invalid codec handle, %pK\n", __func__, codec); return -EINVAL; } diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c index 00ae80019ac1b..6d40f70ce51b8 100644 --- a/sound/soc/codecs/wcd9335.c +++ b/sound/soc/codecs/wcd9335.c @@ -10758,7 +10758,7 @@ static int tasha_get_channel_map(struct snd_soc_dai *dai, case AIF4_PB: case AIF_MIX1_PB: if (!rx_slot || !rx_num) { - pr_err("%s: Invalid rx_slot %p or rx_num %p\n", + pr_err("%s: Invalid rx_slot %pK or rx_num %pK\n", __func__, rx_slot, rx_num); return -EINVAL; } @@ -10777,7 +10777,7 @@ static int tasha_get_channel_map(struct snd_soc_dai *dai, case AIF4_MAD_TX: case AIF4_VIFEED: if (!tx_slot || !tx_num) { - pr_err("%s: Invalid tx_slot %p or tx_num %p\n", + pr_err("%s: Invalid tx_slot %pK or tx_num %pK\n", __func__, tx_slot, tx_num); return -EINVAL; } @@ -10815,7 +10815,7 @@ static int tasha_set_channel_map(struct snd_soc_dai *dai, core = dev_get_drvdata(dai->codec->dev->parent); if (!tx_slot || !rx_slot) { - pr_err("%s: Invalid tx_slot=%p, rx_slot=%p\n", + pr_err("%s: Invalid tx_slot=%pK, rx_slot=%pK\n", __func__, tx_slot, rx_slot); return -EINVAL; } diff --git a/sound/soc/codecs/wcd9xxx-mbhc.c b/sound/soc/codecs/wcd9xxx-mbhc.c index b9db3fa79dd8c..b6e6157f80bde 100644 --- a/sound/soc/codecs/wcd9xxx-mbhc.c +++ b/sound/soc/codecs/wcd9xxx-mbhc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -4689,7 +4689,7 @@ int wcd9xxx_mbhc_start(struct wcd9xxx_mbhc *mbhc, schedule_delayed_work(&mbhc->mbhc_firmware_dwork, usecs_to_jiffies(FW_READ_TIMEOUT)); else - pr_debug("%s: Skipping to read mbhc fw, 0x%p %p\n", + pr_debug("%s: Skipping to read mbhc fw, 0x%pK %pK\n", __func__, mbhc->mbhc_fw, mbhc->mbhc_cal); } @@ -5087,7 +5087,7 @@ static int wcd9xxx_remeasure_z_values(struct wcd9xxx_mbhc *mbhc, right = !!(r); dev_dbg(codec->dev, "%s: Remeasuring impedance values\n", __func__); - dev_dbg(codec->dev, "%s: l: %p, r: %p, left=%d, right=%d\n", __func__, + dev_dbg(codec->dev, "%s: l: %pK, r: %pK, left=%d, right=%d\n", __func__, l, r, left, right); /* Remeasure V2 values */ diff --git a/sound/soc/codecs/wcd_cpe_core.c b/sound/soc/codecs/wcd_cpe_core.c index acf6df089a1b0..04a06d1426d48 100644 --- a/sound/soc/codecs/wcd_cpe_core.c +++ b/sound/soc/codecs/wcd_cpe_core.c @@ -473,7 +473,7 @@ static int wcd_cpe_load_fw(struct wcd_cpe_core *core, bool load_segment; if (!core || !core->cpe_handle) { - pr_err("%s: Error CPE core %p\n", __func__, + pr_err("%s: Error CPE core %pK\n", __func__, core); return -EINVAL; } diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c index 1f3f176526e3b..21be047df08c8 100644 --- a/sound/soc/codecs/wsa881x.c +++ b/sound/soc/codecs/wsa881x.c @@ -905,7 +905,7 @@ int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port, u8 num_port, if (!port || !ch_mask || !ch_rate || (num_port > WSA881X_MAX_SWR_PORTS)) { dev_err(codec->dev, - "%s: Invalid port=%p, ch_mask=%p, ch_rate=%p\n", + "%s: Invalid port=%pK, ch_mask=%pK, ch_rate=%pK\n", __func__, port, ch_mask, ch_rate); return -EINVAL; } diff --git a/sound/soc/msm/msm-cpe-lsm.c b/sound/soc/msm/msm-cpe-lsm.c index 9f957e530817a..af682fd536e2f 100644 --- a/sound/soc/msm/msm-cpe-lsm.c +++ b/sound/soc/msm/msm-cpe-lsm.c @@ -506,7 +506,7 @@ static int msm_cpe_lab_buf_alloc(struct snd_pcm_substream *substream, pcm_buf[count].mem = pcm_buf[0].mem + (count * bufsz); pcm_buf[count].phys = pcm_buf[0].phys + (count * bufsz); dev_dbg(rtd->dev, - "%s: pcm_buf[%d].mem %p pcm_buf[%d].phys %pa\n", + "%s: pcm_buf[%d].mem %pK pcm_buf[%d].phys %pK\n", __func__, count, (void *)pcm_buf[count].mem, count, &(pcm_buf[count].phys)); @@ -733,7 +733,7 @@ static int msm_cpe_lab_thread(void *data) cur_buf = &lab_d->pcm_buf[buf_count % prd_cnt]; next_buf = &lab_d->pcm_buf[(buf_count + 2) % prd_cnt]; dev_dbg(rtd->dev, - "%s: Cur buf.mem = %p Next Buf.mem = %p\n" + "%s: Cur buf.mem = %pK Next Buf.mem = %pK\n" " buf count = 0x%x\n", __func__, cur_buf->mem, next_buf->mem, buf_count); } else { @@ -1548,7 +1548,7 @@ static int msm_cpe_lsm_lab_start(struct snd_pcm_substream *substream, int rc; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", __func__, substream); return -EINVAL; } @@ -1638,7 +1638,7 @@ static bool msm_cpe_lsm_is_valid_stream(struct snd_pcm_substream *substream, struct wcd_cpe_lsm_ops *lsm_ops; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", func, substream); return false; } @@ -2079,7 +2079,7 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, struct wcd_cpe_lsm_ops *lsm_ops; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", __func__, substream); return -EINVAL; } @@ -2351,7 +2351,7 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, struct wcd_cpe_lsm_ops *lsm_ops; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", __func__, substream); return -EINVAL; } @@ -3001,7 +3001,7 @@ static int msm_cpe_lsm_copy(struct snd_pcm_substream *substream, int a, if (lab_d->buf_idx >= (lsm_d->hw_params.period_count)) lab_d->buf_idx = 0; pcm_buf = (lab_d->pcm_buf[lab_d->buf_idx].mem); - pr_debug("%s: Buf IDX = 0x%x pcm_buf %p\n", + pr_debug("%s: Buf IDX = 0x%x pcm_buf %pK\n", __func__, lab_d->buf_idx, pcm_buf); if (pcm_buf) { if (copy_to_user(buf, pcm_buf, fbytes)) { From 8fffb4db4c95bd85bea2f3b3c021b7cb6f6a3bfc Mon Sep 17 00:00:00 2001 From: Surendar karka Date: Fri, 19 Aug 2016 15:17:50 +0530 Subject: [PATCH 0055/1015] ASoC: msm: qdsp6v2: Change audio drivers to use %pK Change all qdsp6v2 audio driver to use %pK instead of %p. %pK hides addresses when the users doesn't have kernel permissions. If address information is needed echo 0 > /proc/sys/kernel/kptr_restrict. CRs-Fixed: 1052832 Change-Id: Id6d45982cbe42a113e58c9b6509eb6ef8064aeef Signed-off-by: Surendar karka --- drivers/misc/qcom/qdsp6v2/amrwb_in.c | 5 +- drivers/misc/qcom/qdsp6v2/audio_aac.c | 8 +- drivers/misc/qcom/qdsp6v2/audio_alac.c | 2 +- drivers/misc/qcom/qdsp6v2/audio_amrnb.c | 4 +- drivers/misc/qcom/qdsp6v2/audio_amrwb.c | 4 +- drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c | 6 +- drivers/misc/qcom/qdsp6v2/audio_ape.c | 6 +- drivers/misc/qcom/qdsp6v2/audio_evrc.c | 4 +- .../misc/qcom/qdsp6v2/audio_hwacc_effects.c | 4 +- drivers/misc/qcom/qdsp6v2/audio_mp3.c | 4 +- drivers/misc/qcom/qdsp6v2/audio_qcelp.c | 4 +- drivers/misc/qcom/qdsp6v2/audio_utils.c | 4 +- drivers/misc/qcom/qdsp6v2/audio_utils_aio.c | 215 +++++++++--------- drivers/misc/qcom/qdsp6v2/audio_wma.c | 6 +- drivers/misc/qcom/qdsp6v2/audio_wmapro.c | 4 +- drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c | 20 +- drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c | 12 +- .../misc/qcom/qdsp6v2/ultrasound/usfcdev.c | 6 +- 18 files changed, 159 insertions(+), 159 deletions(-) diff --git a/drivers/misc/qcom/qdsp6v2/amrwb_in.c b/drivers/misc/qcom/qdsp6v2/amrwb_in.c index 4cea3dc63389f..9bd19d97c6fce 100644 --- a/drivers/misc/qcom/qdsp6v2/amrwb_in.c +++ b/drivers/misc/qcom/qdsp6v2/amrwb_in.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2011-2012, 2014 The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2012, 2014, 2016 The Linux Foundation. All rights + * reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -307,7 +308,7 @@ static int amrwb_in_open(struct inode *inode, struct file *file) (void *)audio); if (!audio->ac) { - pr_err("%s:audio[%p]: Could not allocate memory for audio" + pr_err("%s:audio[%pK]: Could not allocate memory for audio" "client\n", __func__, audio); kfree(audio->enc_cfg); kfree(audio); diff --git a/drivers/misc/qcom/qdsp6v2/audio_aac.c b/drivers/misc/qcom/qdsp6v2/audio_aac.c index 73c0f281d43b8..1c791c89cc647 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_aac.c +++ b/drivers/misc/qcom/qdsp6v2/audio_aac.c @@ -221,10 +221,10 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); if (rc) - pr_err("%s[%p]:Failed in utils_ioctl: %d\n", + pr_err("%s[%pK]:Failed in utils_ioctl: %d\n", __func__, audio, rc); } } @@ -328,10 +328,10 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_compat_ioctl(file, cmd, arg); if (rc) - pr_err("%s[%p]:Failed in utils_ioctl: %d\n", + pr_err("%s[%pK]:Failed in utils_ioctl: %d\n", __func__, audio, rc); } } diff --git a/drivers/misc/qcom/qdsp6v2/audio_alac.c b/drivers/misc/qcom/qdsp6v2/audio_alac.c index cf129099a153e..7b18e3ae34126 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_alac.c +++ b/drivers/misc/qcom/qdsp6v2/audio_alac.c @@ -52,7 +52,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd, __func__, audio->pcm_cfg.channel_count); } - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ diff --git a/drivers/misc/qcom/qdsp6v2/audio_amrnb.c b/drivers/misc/qcom/qdsp6v2/audio_amrnb.c index eceaf244e0841..34d4fb0cf14c0 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_amrnb.c +++ b/drivers/misc/qcom/qdsp6v2/audio_amrnb.c @@ -33,7 +33,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) switch (cmd) { case AUDIO_START: { - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -62,7 +62,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); } return rc; diff --git a/drivers/misc/qcom/qdsp6v2/audio_amrwb.c b/drivers/misc/qcom/qdsp6v2/audio_amrwb.c index 9ac03667a85ea..7dcaedfe4617e 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_amrwb.c +++ b/drivers/misc/qcom/qdsp6v2/audio_amrwb.c @@ -34,7 +34,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) switch (cmd) { case AUDIO_START: { - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -65,7 +65,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); } return rc; diff --git a/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c b/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c index 2f4ea14d77fe9..e96e23a4d5f43 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c +++ b/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c @@ -55,7 +55,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd, switch (cmd) { case AUDIO_START: { - pr_err("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_err("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -162,7 +162,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); break; } @@ -274,7 +274,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_compat_ioctl(file, cmd, arg); break; } diff --git a/drivers/misc/qcom/qdsp6v2/audio_ape.c b/drivers/misc/qcom/qdsp6v2/audio_ape.c index 1aaf8e8ea6611..8d78124cfd072 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_ape.c +++ b/drivers/misc/qcom/qdsp6v2/audio_ape.c @@ -39,7 +39,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd, case AUDIO_START: { struct asm_ape_cfg ape_cfg; struct msm_audio_ape_config *ape_config; - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -133,7 +133,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); @@ -229,7 +229,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_compat_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); diff --git a/drivers/misc/qcom/qdsp6v2/audio_evrc.c b/drivers/misc/qcom/qdsp6v2/audio_evrc.c index 0189dec1ddb96..75b81267df7e9 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_evrc.c +++ b/drivers/misc/qcom/qdsp6v2/audio_evrc.c @@ -34,7 +34,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) switch (cmd) { case AUDIO_START: { - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -65,7 +65,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); } return rc; diff --git a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c index 3a8834446ea40..6843fd761dd76 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c +++ b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c @@ -99,7 +99,7 @@ static void audio_effects_event_handler(uint32_t opcode, uint32_t token, struct q6audio_effects *effects; if (!payload || !priv) { - pr_err("%s: invalid data to handle events, payload: %p, priv: %p\n", + pr_err("%s: invalid data to handle events, payload: %pK, priv: %pK\n", __func__, payload, priv); return; } @@ -703,7 +703,7 @@ static int audio_effects_release(struct inode *inode, struct file *file) __func__); rc = q6asm_cmd(effects->ac, CMD_CLOSE); if (rc < 0) - pr_err("%s[%p]:Failed to close the session rc=%d\n", + pr_err("%s[%pK]:Failed to close the session rc=%d\n", __func__, effects, rc); effects->opened = 0; effects->started = 0; diff --git a/drivers/misc/qcom/qdsp6v2/audio_mp3.c b/drivers/misc/qcom/qdsp6v2/audio_mp3.c index c29b5f911e84f..2417ddf2a6c65 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_mp3.c +++ b/drivers/misc/qcom/qdsp6v2/audio_mp3.c @@ -33,7 +33,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) int rc = 0; switch (cmd) { case AUDIO_START: { - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -69,7 +69,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); } return rc; diff --git a/drivers/misc/qcom/qdsp6v2/audio_qcelp.c b/drivers/misc/qcom/qdsp6v2/audio_qcelp.c index 102cdab9abdd9..f45d3dd8e0d3e 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_qcelp.c +++ b/drivers/misc/qcom/qdsp6v2/audio_qcelp.c @@ -36,7 +36,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) switch (cmd) { case AUDIO_START: { - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -67,7 +67,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); } return rc; diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils.c b/drivers/misc/qcom/qdsp6v2/audio_utils.c index cec449dafc703..3a7aa5aebab4b 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils.c @@ -744,7 +744,7 @@ ssize_t audio_in_read(struct file *file, count -= bytes_to_copy; buf += bytes_to_copy; } else { - pr_err("%s:session id %d: short read data[%p] bytesavail[%d]bytesrequest[%zd]\n", + pr_err("%s:session id %d: short read data[%pK] bytesavail[%d]bytesrequest[%zd]\n", __func__, audio->ac->session, data, size, count); @@ -883,7 +883,7 @@ ssize_t audio_in_write(struct file *file, buf += xfer; } mutex_unlock(&audio->write_lock); - pr_debug("%s:session id %d: eos_condition 0x%x buf[0x%p] start[0x%p]\n", + pr_debug("%s:session id %d: eos_condition 0x%x buf[0x%pK] start[0x%pK]\n", __func__, audio->ac->session, nflags, buf, start); if (nflags & AUD_EOS_SET) { diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c index f27e6afde2875..4edc8145bfd45 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c @@ -83,7 +83,7 @@ int insert_eos_buf(struct q6audio_aio *audio, struct audio_aio_buffer_node *buf_node) { struct dec_meta_out *eos_buf = buf_node->kvaddr; - pr_debug("%s[%p]:insert_eos_buf\n", __func__, audio); + pr_debug("%s[%pK]:insert_eos_buf\n", __func__, audio); eos_buf->num_of_frames = 0xFFFFFFFF; eos_buf->meta_out_dsp[0].offset_to_frame = 0x0; eos_buf->meta_out_dsp[0].nflags = AUDIO_DEC_EOS_SET; @@ -131,14 +131,14 @@ static int audio_aio_ion_lookup_vaddr(struct q6audio_aio *audio, void *addr, } if (match_count > 1) { - pr_err("%s[%p]:multiple hits for vaddr %p, len %ld\n", + pr_err("%s[%pK]:multiple hits for vaddr %pK, len %ld\n", __func__, audio, addr, len); list_for_each_entry(region_elt, &audio->ion_region_queue, list) { if (addr >= region_elt->vaddr && addr < region_elt->vaddr + region_elt->len && addr + len <= region_elt->vaddr + region_elt->len) - pr_err("\t%s[%p]:%p, %ld --> %pa\n", + pr_err("\t%s[%pK]:%pK, %ld --> %pK\n", __func__, audio, region_elt->vaddr, region_elt->len, @@ -158,7 +158,7 @@ static phys_addr_t audio_aio_ion_fixup(struct q6audio_aio *audio, void *addr, ret = audio_aio_ion_lookup_vaddr(audio, addr, len, ®ion); if (ret) { - pr_err("%s[%p]:lookup (%p, %ld) failed\n", + pr_err("%s[%pK]:lookup (%pK, %ld) failed\n", __func__, audio, addr, len); return 0; } @@ -166,7 +166,7 @@ static phys_addr_t audio_aio_ion_fixup(struct q6audio_aio *audio, void *addr, region->ref_cnt++; else region->ref_cnt--; - pr_debug("%s[%p]:found region %p ref_cnt %d\n", + pr_debug("%s[%pK]:found region %pK ref_cnt %d\n", __func__, audio, region, region->ref_cnt); paddr = region->paddr + (addr - region->vaddr); /* provide kernel virtual address for accessing meta information */ @@ -179,26 +179,26 @@ static int audio_aio_pause(struct q6audio_aio *audio) { int rc = -EINVAL; - pr_debug("%s[%p], enabled = %d\n", __func__, audio, + pr_debug("%s[%pK], enabled = %d\n", __func__, audio, audio->enabled); if (audio->enabled) { rc = q6asm_cmd(audio->ac, CMD_PAUSE); if (rc < 0) - pr_err("%s[%p]: pause cmd failed rc=%d\n", + pr_err("%s[%pK]: pause cmd failed rc=%d\n", __func__, audio, rc); if (rc == 0) { /* Send suspend only if pause was successful */ rc = q6asm_cmd(audio->ac, CMD_SUSPEND); if (rc < 0) - pr_err("%s[%p]: suspend cmd failed rc=%d\n", + pr_err("%s[%pK]: suspend cmd failed rc=%d\n", __func__, audio, rc); } else - pr_err("%s[%p]: not sending suspend since pause failed\n", + pr_err("%s[%pK]: not sending suspend since pause failed\n", __func__, audio); } else - pr_err("%s[%p]: Driver not enabled\n", __func__, audio); + pr_err("%s[%pK]: Driver not enabled\n", __func__, audio); return rc; } @@ -212,7 +212,7 @@ static int audio_aio_flush(struct q6audio_aio *audio) if (!(audio->drv_status & ADRV_STATUS_PAUSE)) { rc = audio_aio_pause(audio); if (rc < 0) - pr_err("%s[%p}: pause cmd failed rc=%d\n", + pr_err("%s[%pK}: pause cmd failed rc=%d\n", __func__, audio, rc); else @@ -220,13 +220,13 @@ static int audio_aio_flush(struct q6audio_aio *audio) } rc = q6asm_cmd(audio->ac, CMD_FLUSH); if (rc < 0) - pr_err("%s[%p]: flush cmd failed rc=%d\n", + pr_err("%s[%pK]: flush cmd failed rc=%d\n", __func__, audio, rc); /* Not in stop state, reenable the stream */ if (audio->stopped == 0) { rc = audio_aio_enable(audio); if (rc) - pr_err("%s[%p]:audio re-enable failed\n", + pr_err("%s[%pK]:audio re-enable failed\n", __func__, audio); else { audio->enabled = 1; @@ -235,9 +235,9 @@ static int audio_aio_flush(struct q6audio_aio *audio) } } } - pr_debug("%s[%p]:in_bytes %d\n", + pr_debug("%s[%pK]:in_bytes %d\n", __func__, audio, atomic_read(&audio->in_bytes)); - pr_debug("%s[%p]:in_samples %d\n", + pr_debug("%s[%pK]:in_samples %d\n", __func__, audio, atomic_read(&audio->in_samples)); atomic_set(&audio->in_bytes, 0); atomic_set(&audio->in_samples, 0); @@ -250,7 +250,7 @@ static int audio_aio_outport_flush(struct q6audio_aio *audio) rc = q6asm_cmd(audio->ac, CMD_OUT_FLUSH); if (rc < 0) - pr_err("%s[%p}: output port flush cmd failed rc=%d\n", + pr_err("%s[%pK}: output port flush cmd failed rc=%d\n", __func__, audio, rc); return rc; } @@ -278,19 +278,19 @@ void audio_aio_async_write_ack(struct q6audio_aio *audio, uint32_t token, if (token == used_buf->token) { list_del(&used_buf->list); spin_unlock_irqrestore(&audio->dsp_lock, flags); - pr_debug("%s[%p]:consumed buffer\n", __func__, audio); + pr_debug("%s[%pK]:consumed buffer\n", __func__, audio); event_payload.aio_buf = used_buf->buf; audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, event_payload); kfree(used_buf); if (list_empty(&audio->out_queue) && (audio->drv_status & ADRV_STATUS_FSYNC)) { - pr_debug("%s[%p]: list is empty, reached EOS in Tunnel\n", + pr_debug("%s[%pK]: list is empty, reached EOS in Tunnel\n", __func__, audio); wake_up(&audio->write_wait); } } else { - pr_err("%s[%p]:expected=%x ret=%x\n", + pr_err("%s[%pK]:expected=%x ret=%x\n", __func__, audio, used_buf->token, token); spin_unlock_irqrestore(&audio->dsp_lock, flags); } @@ -304,13 +304,13 @@ void audio_aio_async_out_flush(struct q6audio_aio *audio) union msm_audio_event_payload payload; unsigned long flags; - pr_debug("%s[%p}\n", __func__, audio); + pr_debug("%s[%pK}\n", __func__, audio); /* EOS followed by flush, EOS response not guranteed, free EOS i/p buffer */ spin_lock_irqsave(&audio->dsp_lock, flags); if (audio->eos_flag && (audio->eos_write_payload.aio_buf.buf_addr)) { - pr_debug("%s[%p]: EOS followed by flush received,acknowledge"\ + pr_debug("%s[%pK]: EOS followed by flush received,acknowledge" " eos i/p buffer immediately\n", __func__, audio); audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, audio->eos_write_payload); @@ -324,7 +324,7 @@ void audio_aio_async_out_flush(struct q6audio_aio *audio) payload.aio_buf = buf_node->buf; audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, payload); kfree(buf_node); - pr_debug("%s[%p]: Propagate WRITE_DONE during flush\n", + pr_debug("%s[%pK]: Propagate WRITE_DONE during flush\n", __func__, audio); } } @@ -335,14 +335,14 @@ void audio_aio_async_in_flush(struct q6audio_aio *audio) struct list_head *ptr, *next; union msm_audio_event_payload payload; - pr_debug("%s[%p]\n", __func__, audio); + pr_debug("%s[%pK]\n", __func__, audio); list_for_each_safe(ptr, next, &audio->in_queue) { buf_node = list_entry(ptr, struct audio_aio_buffer_node, list); list_del(&buf_node->list); /* Forcefull send o/p eos buffer after flush, if no eos response * received by dsp even after sending eos command */ if ((audio->eos_rsp != 1) && audio->eos_flag) { - pr_debug("%s[%p]: send eos on o/p buffer during flush\n", + pr_debug("%s[%pK]: send eos on o/p buffer during flush\n", __func__, audio); payload.aio_buf = buf_node->buf; payload.aio_buf.data_len = @@ -355,7 +355,7 @@ void audio_aio_async_in_flush(struct q6audio_aio *audio) } audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, payload); kfree(buf_node); - pr_debug("%s[%p]: Propagate READ_DONE during flush\n", + pr_debug("%s[%pK]: Propagate READ_DONE during flush\n", __func__, audio); } } @@ -373,19 +373,19 @@ int audio_aio_disable(struct q6audio_aio *audio) if (audio->opened) { audio->enabled = 0; audio->opened = 0; - pr_debug("%s[%p]: inbytes[%d] insamples[%d]\n", __func__, + pr_debug("%s[%pK]: inbytes[%d] insamples[%d]\n", __func__, audio, atomic_read(&audio->in_bytes), atomic_read(&audio->in_samples)); /* Close the session */ rc = q6asm_cmd(audio->ac, CMD_CLOSE); if (rc < 0) - pr_err("%s[%p]:Failed to close the session rc=%d\n", + pr_err("%s[%pK]:Failed to close the session rc=%d\n", __func__, audio, rc); audio->stopped = 1; wake_up(&audio->write_wait); wake_up(&audio->cmd_wait); } - pr_debug("%s[%p]:enabled[%d]\n", __func__, audio, audio->enabled); + pr_debug("%s[%pK]:enabled[%d]\n", __func__, audio, audio->enabled); return rc; } @@ -434,16 +434,16 @@ static void audio_aio_unmap_ion_region(struct q6audio_aio *audio) struct list_head *ptr, *next; int rc = -EINVAL; - pr_debug("%s[%p]:\n", __func__, audio); + pr_debug("%s[%pK]:\n", __func__, audio); list_for_each_safe(ptr, next, &audio->ion_region_queue) { region = list_entry(ptr, struct audio_aio_ion_region, list); if (region != NULL) { - pr_debug("%s[%p]: phy_address = 0x%pa\n", + pr_debug("%s[%pK]: phy_address = 0x%pK\n", __func__, audio, ®ion->paddr); rc = q6asm_memory_unmap(audio->ac, region->paddr, IN); if (rc < 0) - pr_err("%s[%p]: memory unmap failed\n", + pr_err("%s[%pK]: memory unmap failed\n", __func__, audio); } } @@ -460,20 +460,20 @@ static void audio_aio_listner(u32 evt_id, union auddev_evt_data *evt_payload, switch (evt_id) { case AUDDEV_EVT_STREAM_VOL_CHG: audio->volume = evt_payload->session_vol; - pr_debug("%s[%p]: AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d, enabled = %d\n", + pr_debug("%s[%pK]: AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d, enabled = %d\n", __func__, audio, audio->volume, audio->enabled); if (audio->enabled == 1) { if (audio->ac) { rc = q6asm_set_volume(audio->ac, audio->volume); if (rc < 0) { - pr_err("%s[%p]: Send Volume command failed rc=%d\n", + pr_err("%s[%pK]: Send Volume command failed rc=%d\n", __func__, audio, rc); } } } break; default: - pr_err("%s[%p]:ERROR:wrong event\n", __func__, audio); + pr_err("%s[%pK]:ERROR:wrong event\n", __func__, audio); break; } } @@ -490,7 +490,7 @@ int register_volume_listener(struct q6audio_aio *audio) audio_aio_listner, (void *)audio); if (rc < 0) { - pr_err("%s[%p]: Event listener failed\n", __func__, audio); + pr_err("%s[%pK]: Event listener failed\n", __func__, audio); rc = -EACCES; } return rc; @@ -508,7 +508,7 @@ int enable_volume_ramp(struct q6audio_aio *audio) if (audio->ac == NULL) return -EINVAL; - pr_debug("%s[%p]\n", __func__, audio); + pr_debug("%s[%pK]\n", __func__, audio); softpause.enable = SOFT_PAUSE_ENABLE; softpause.period = SOFT_PAUSE_PERIOD; softpause.step = SOFT_PAUSE_STEP; @@ -568,7 +568,7 @@ int enable_volume_ramp(struct q6audio_aio *audio) int audio_aio_release(struct inode *inode, struct file *file) { struct q6audio_aio *audio = file->private_data; - pr_debug("%s[%p]\n", __func__, audio); + pr_debug("%s[%pK]\n", __func__, audio); mutex_lock(&audio->lock); audio->wflush = 1; if (audio->wakelock_voted && @@ -624,56 +624,56 @@ int audio_aio_fsync(struct file *file, loff_t start, loff_t end, int datasync) audio->drv_status |= ADRV_STATUS_FSYNC; mutex_unlock(&audio->lock); - pr_debug("%s[%p]:\n", __func__, audio); + pr_debug("%s[%pK]:\n", __func__, audio); audio->eos_rsp = 0; - pr_debug("%s[%p]Wait for write done from DSP\n", __func__, audio); + pr_debug("%s[%pK]Wait for write done from DSP\n", __func__, audio); rc = wait_event_interruptible(audio->write_wait, (list_empty(&audio->out_queue)) || audio->wflush || audio->stopped); if (audio->stopped || audio->wflush) { - pr_debug("%s[%p]: Audio Flushed or Stopped,this is not EOS\n" + pr_debug("%s[%pK]: Audio Flushed or Stopped,this is not EOS\n" , __func__, audio); audio->wflush = 0; rc = -EBUSY; } if (rc < 0) { - pr_err("%s[%p]: wait event for list_empty failed, rc = %d\n", + pr_err("%s[%pK]: wait event for list_empty failed, rc = %d\n", __func__, audio, rc); goto done; } rc = q6asm_cmd(audio->ac, CMD_EOS); - pr_debug("%s[%p]: EOS cmd sent to DSP\n", __func__, audio); + pr_debug("%s[%pK]: EOS cmd sent to DSP\n", __func__, audio); if (rc < 0) - pr_err("%s[%p]: q6asm_cmd failed, rc = %d", + pr_err("%s[%pK]: q6asm_cmd failed, rc = %d", __func__, audio, rc); - pr_debug("%s[%p]: wait for RENDERED_EOS from DSP\n" + pr_debug("%s[%pK]: wait for RENDERED_EOS from DSP\n" , __func__, audio); rc = wait_event_interruptible(audio->write_wait, (audio->eos_rsp || audio->wflush || audio->stopped)); if (rc < 0) { - pr_err("%s[%p]: wait event for eos_rsp failed, rc = %d\n", + pr_err("%s[%pK]: wait event for eos_rsp failed, rc = %d\n", __func__, audio, rc); goto done; } if (audio->stopped || audio->wflush) { audio->wflush = 0; - pr_debug("%s[%p]: Audio Flushed or Stopped,this is not EOS\n" + pr_debug("%s[%pK]: Audio Flushed or Stopped,this is not EOS\n" , __func__, audio); rc = -EBUSY; } if (audio->eos_rsp == 1) - pr_debug("%s[%p]: EOS\n", __func__, audio); + pr_debug("%s[%pK]: EOS\n", __func__, audio); done: @@ -744,21 +744,21 @@ static long audio_aio_process_event_req_common(struct q6audio_aio *audio, usr_evt->event_payload = drv_evt->payload; list_add_tail(&drv_evt->list, &audio->free_event_queue); } else { - pr_err("%s[%p]:Unexpected path\n", __func__, audio); + pr_err("%s[%pK]:Unexpected path\n", __func__, audio); spin_unlock_irqrestore(&audio->event_queue_lock, flags); return -EPERM; } spin_unlock_irqrestore(&audio->event_queue_lock, flags); if (drv_evt->event_type == AUDIO_EVENT_WRITE_DONE) { - pr_debug("%s[%p]:posted AUDIO_EVENT_WRITE_DONE to user\n", + pr_debug("%s[%pK]:posted AUDIO_EVENT_WRITE_DONE to user\n", __func__, audio); mutex_lock(&audio->write_lock); audio_aio_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, drv_evt->payload.aio_buf.buf_len, 0, 0); mutex_unlock(&audio->write_lock); } else if (drv_evt->event_type == AUDIO_EVENT_READ_DONE) { - pr_debug("%s[%p]:posted AUDIO_EVENT_READ_DONE to user\n", + pr_debug("%s[%pK]:posted AUDIO_EVENT_READ_DONE to user\n", __func__, audio); mutex_lock(&audio->read_lock); audio_aio_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, @@ -770,7 +770,7 @@ static long audio_aio_process_event_req_common(struct q6audio_aio *audio, * Once EOS indicated */ if (audio->eos_rsp && !list_empty(&audio->in_queue)) { - pr_debug("%s[%p]:Send flush command to release read buffers"\ + pr_debug("%s[%pK]:Send flush command to release read buffers" " held up in DSP\n", __func__, audio); mutex_lock(&audio->lock); audio_aio_flush(audio); @@ -913,7 +913,7 @@ static int audio_aio_ion_check(struct q6audio_aio *audio, list_for_each_entry(region_elt, &audio->ion_region_queue, list) { if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || OVERLAPS(region_elt, &t)) { - pr_err("%s[%p]:region (vaddr %p len %ld) clashes with registered region (vaddr %p paddr %pa len %ld)\n", + pr_err("%s[%pK]:region (vaddr %pK len %ld) clashes with registered region (vaddr %pK paddr %pK len %ld)\n", __func__, audio, vaddr, len, region_elt->vaddr, ®ion_elt->paddr, region_elt->len); @@ -935,7 +935,7 @@ static int audio_aio_ion_add(struct q6audio_aio *audio, unsigned long ionflag; void *kvaddr = NULL; - pr_debug("%s[%p]:\n", __func__, audio); + pr_debug("%s[%pK]:\n", __func__, audio); region = kmalloc(sizeof(*region), GFP_KERNEL); if (!region) { @@ -964,14 +964,14 @@ static int audio_aio_ion_add(struct q6audio_aio *audio, region->kvaddr = kvaddr; region->len = len; region->ref_cnt = 0; - pr_debug("%s[%p]:add region paddr %pa vaddr %p, len %lu kvaddr %p\n", + pr_debug("%s[%pK]:add region paddr %pK vaddr %pK, len %lu kvaddr %pK\n", __func__, audio, ®ion->paddr, region->vaddr, region->len, region->kvaddr); list_add_tail(®ion->list, &audio->ion_region_queue); rc = q6asm_memory_map(audio->ac, paddr, IN, len, 1); if (rc < 0) { - pr_err("%s[%p]: memory map failed\n", __func__, audio); + pr_err("%s[%pK]: memory map failed\n", __func__, audio); goto mmap_error; } else { goto end; @@ -993,7 +993,7 @@ static int audio_aio_ion_remove(struct q6audio_aio *audio, struct list_head *ptr, *next; int rc = -EINVAL; - pr_debug("%s[%p]:info fd %d vaddr %p\n", + pr_debug("%s[%pK]:info fd %d vaddr %pK\n", __func__, audio, info->fd, info->vaddr); list_for_each_safe(ptr, next, &audio->ion_region_queue) { @@ -1002,17 +1002,17 @@ static int audio_aio_ion_remove(struct q6audio_aio *audio, if ((region->fd == info->fd) && (region->vaddr == info->vaddr)) { if (region->ref_cnt) { - pr_debug("%s[%p]:region %p in use ref_cnt %d\n", + pr_debug("%s[%pK]:region %pK in use ref_cnt %d\n", __func__, audio, region, region->ref_cnt); break; } - pr_debug("%s[%p]:remove region fd %d vaddr %p\n", + pr_debug("%s[%pK]:remove region fd %d vaddr %pK\n", __func__, audio, info->fd, info->vaddr); rc = q6asm_memory_unmap(audio->ac, region->paddr, IN); if (rc < 0) - pr_err("%s[%p]: memory unmap failed\n", + pr_err("%s[%pK]: memory unmap failed\n", __func__, audio); list_del(®ion->list); @@ -1035,15 +1035,15 @@ static int audio_aio_async_write(struct q6audio_aio *audio, struct audio_aio_write_param param; if (!audio || !buf_node) { - pr_err("%s NULL pointer audio=[0x%p], buf_node=[0x%p]\n", + pr_err("%s NULL pointer audio=[0x%pK], buf_node=[0x%pK]\n", __func__, audio, buf_node); return -EINVAL; } - pr_debug("%s[%p]: Send write buff %p phy %pa len %d meta_enable = %d\n", + pr_debug("%s[%pK]: Send write buff %pK phy %pK len %d meta_enable = %d\n", __func__, audio, buf_node, &buf_node->paddr, buf_node->buf.data_len, audio->buf_cfg.meta_info_enable); - pr_debug("%s[%p]: flags = 0x%x\n", __func__, audio, + pr_debug("%s[%pK]: flags = 0x%x\n", __func__, audio, buf_node->meta_info.meta_in.nflags); ac = audio->ac; @@ -1072,7 +1072,7 @@ static int audio_aio_async_write(struct q6audio_aio *audio, buf_node->token = ac->session; rc = q6asm_async_write(ac, ¶m); if (rc < 0) - pr_err("%s[%p]:failed\n", __func__, audio); + pr_err("%s[%pK]:failed\n", __func__, audio); return rc; } @@ -1091,8 +1091,6 @@ void audio_aio_post_event(struct q6audio_aio *audio, int type, } else { e_node = kmalloc(sizeof(struct audio_aio_event), GFP_ATOMIC); if (!e_node) { - pr_err("%s[%p]:No mem to post event %d\n", - __func__, audio, type); spin_unlock_irqrestore(&audio->event_queue_lock, flags); return; } @@ -1113,7 +1111,7 @@ static int audio_aio_async_read(struct q6audio_aio *audio, struct audio_aio_read_param param; int rc; - pr_debug("%s[%p]: Send read buff %p phy %pa len %d\n", + pr_debug("%s[%pK]: Send read buff %pK phy %pK len %d\n", __func__, audio, buf_node, &buf_node->paddr, buf_node->buf.buf_len); ac = audio->ac; @@ -1127,7 +1125,7 @@ static int audio_aio_async_read(struct q6audio_aio *audio, buf_node->token = param.paddr; rc = q6asm_async_read(ac, ¶m); if (rc < 0) - pr_err("%s[%p]:failed\n", __func__, audio); + pr_err("%s[%pK]:failed\n", __func__, audio); return rc; } @@ -1136,7 +1134,7 @@ static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir, { unsigned long flags; int ret = 0; - pr_debug("%s[%p]:node %p dir %x buf_addr %p buf_len %d data_len %d\n", + pr_debug("%s[%pK]:node %pK dir %x buf_addr %pK buf_len %d data_len %d\n", __func__, audio, buf_node, dir, buf_node->buf.buf_addr, buf_node->buf.buf_len, buf_node->buf.data_len); buf_node->paddr = audio_aio_ion_fixup(audio, buf_node->buf.buf_addr, @@ -1161,7 +1159,7 @@ static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir, } else if (buf_node->meta_info.meta_in.nflags & AUDIO_DEC_EOS_SET) { if (!audio->wflush) { - pr_debug("%s[%p]:Send EOS cmd at i/p\n", + pr_debug("%s[%pK]:Send EOS cmd at i/p\n", __func__, audio); /* Driver will forcefully post writedone event * once eos ack recived from DSP @@ -1207,7 +1205,7 @@ static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir, event_payload.aio_buf = buf_node->buf; event_payload.aio_buf.data_len = insert_eos_buf(audio, buf_node); - pr_debug("%s[%p]: propagate READ_DONE as EOS done\n",\ + pr_debug("%s[%pK]: propagate READ_DONE as EOS done\n", __func__, audio); audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, event_payload); @@ -1276,7 +1274,8 @@ void audio_aio_ioport_reset(struct q6audio_aio *audio) * abort due to flush */ if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%p]:fsync in progress\n", __func__, audio); + pr_debug("%s[%pK]:fsync in progress\n", + __func__, audio); audio->drv_ops.out_flush(audio); } else audio->drv_ops.out_flush(audio); @@ -1303,13 +1302,13 @@ int audio_aio_open(struct q6audio_aio *audio, struct file *file) /* Only AIO interface */ if (file->f_flags & O_NONBLOCK) { - pr_debug("%s[%p]:set to aio interface\n", __func__, audio); + pr_debug("%s[%pK]:set to aio interface\n", __func__, audio); audio->drv_status |= ADRV_STATUS_AIO_INTF; audio->drv_ops.out_flush = audio_aio_async_out_flush; audio->drv_ops.in_flush = audio_aio_async_in_flush; q6asm_set_io_mode(audio->ac, ASYNC_IO_MODE); } else { - pr_err("%s[%p]:SIO interface not supported\n", + pr_err("%s[%pK]:SIO interface not supported\n", __func__, audio); rc = -EACCES; goto fail; @@ -1341,7 +1340,7 @@ int audio_aio_open(struct q6audio_aio *audio, struct file *file) if (e_node) list_add_tail(&e_node->list, &audio->free_event_queue); else { - pr_err("%s[%p]:event pkt alloc failed\n", + pr_err("%s[%pK]:event pkt alloc failed\n", __func__, audio); rc = -ENOMEM; goto cleanup; @@ -1353,7 +1352,7 @@ int audio_aio_open(struct q6audio_aio *audio, struct file *file) rc = -ENOMEM; goto cleanup; } - pr_debug("Ion client create in audio_aio_open %p", audio->client); + pr_debug("Ion client create in audio_aio_open %pK", audio->client); rc = register_volume_listener(audio); if (rc < 0) @@ -1387,11 +1386,11 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_OUTPORT_FLUSH: { - pr_debug("%s[%p]:AUDIO_OUTPORT_FLUSH\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_OUTPORT_FLUSH\n", __func__, audio); mutex_lock(&audio->read_lock); rc = audio_aio_outport_flush(audio); if (rc < 0) { - pr_err("%s[%p]: AUDIO_OUTPORT_FLUSH failed\n", + pr_err("%s[%pK]: AUDIO_OUTPORT_FLUSH failed\n", __func__, audio); rc = -EINTR; } @@ -1399,13 +1398,13 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_STOP: { - pr_debug("%s[%p]: AUDIO_STOP session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_STOP session_id[%d]\n", __func__, audio, audio->ac->session); mutex_lock(&audio->lock); audio->stopped = 1; rc = audio_aio_flush(audio); if (rc < 0) { - pr_err("%s[%p]:Audio Stop procedure failed rc=%d\n", + pr_err("%s[%pK]:Audio Stop procedure failed rc=%d\n", __func__, audio, rc); mutex_unlock(&audio->lock); break; @@ -1413,7 +1412,7 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, audio->enabled = 0; audio->drv_status &= ~ADRV_STATUS_PAUSE; if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%p] Waking up the audio_aio_fsync\n", + pr_debug("%s[%pK] Waking up the audio_aio_fsync\n", __func__, audio); wake_up(&audio->write_wait); } @@ -1421,12 +1420,12 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_PAUSE: { - pr_debug("%s[%p]:AUDIO_PAUSE %ld\n", __func__, audio, arg); + pr_debug("%s[%pK]:AUDIO_PAUSE %ld\n", __func__, audio, arg); mutex_lock(&audio->lock); if (arg == 1) { rc = audio_aio_pause(audio); if (rc < 0) { - pr_err("%s[%p]: pause FAILED rc=%d\n", + pr_err("%s[%pK]: pause FAILED rc=%d\n", __func__, audio, rc); mutex_unlock(&audio->lock); break; @@ -1436,7 +1435,7 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, if (audio->drv_status & ADRV_STATUS_PAUSE) { rc = audio_aio_enable(audio); if (rc) - pr_err("%s[%p]: audio enable failed\n", + pr_err("%s[%pK]: audio enable failed\n", __func__, audio); else { audio->drv_status &= ~ADRV_STATUS_PAUSE; @@ -1448,13 +1447,13 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_FLUSH: { - pr_debug("%s[%p]: AUDIO_FLUSH sessionid[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_FLUSH sessionid[%d]\n", __func__, audio, audio->ac->session); mutex_lock(&audio->lock); audio->rflush = 1; audio->wflush = 1; if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%p] Waking up the audio_aio_fsync\n", + pr_debug("%s[%pK] Waking up the audio_aio_fsync\n", __func__, audio); wake_up(&audio->write_wait); } @@ -1463,7 +1462,7 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, /* Flush input / Output buffer in software*/ audio_aio_ioport_reset(audio); if (rc < 0) { - pr_err("%s[%p]:AUDIO_FLUSH interrupted\n", + pr_err("%s[%pK]:AUDIO_FLUSH interrupted\n", __func__, audio); rc = -EINTR; } else { @@ -1493,12 +1492,12 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, case AUDIO_PM_AWAKE: { if ((audio->audio_ws_mgr == NULL) || (audio->miscdevice == NULL)) { - pr_err("%s[%p]: invalid ws_mgr or miscdevice", + pr_err("%s[%pK]: invalid ws_mgr or miscdevice", __func__, audio); rc = -EACCES; break; } - pr_debug("%s[%p]:AUDIO_PM_AWAKE\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_PM_AWAKE\n", __func__, audio); mutex_lock(&audio->lock); if (!audio->wakelock_voted) { audio->wakelock_voted = true; @@ -1513,12 +1512,12 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, case AUDIO_PM_RELAX: { if ((audio->audio_ws_mgr == NULL) || (audio->miscdevice == NULL)) { - pr_err("%s[%p]: invalid ws_mgr or miscdevice", + pr_err("%s[%pK]: invalid ws_mgr or miscdevice", __func__, audio); rc = -EACCES; break; } - pr_debug("%s[%p]:AUDIO_PM_RELAX\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_PM_RELAX\n", __func__, audio); mutex_lock(&audio->lock); if (audio->wakelock_voted) { audio->wakelock_voted = false; @@ -1577,7 +1576,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_GET_EVENT: { - pr_debug("%s[%p]:AUDIO_GET_EVENT\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_GET_EVENT\n", __func__, audio); if (mutex_trylock(&audio->get_event_lock)) { rc = audio_aio_process_event_req(audio, (void __user *)arg); @@ -1617,7 +1616,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, memset(&cfg, 0, sizeof(cfg)); cfg.buffer_size = audio->str_cfg.buffer_size; cfg.buffer_count = audio->str_cfg.buffer_count; - pr_debug("%s[%p]:GET STREAM CFG %d %d\n", + pr_debug("%s[%pK]:GET STREAM CFG %d %d\n", __func__, audio, cfg.buffer_size, cfg.buffer_count); if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) { pr_err( @@ -1630,7 +1629,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, } case AUDIO_SET_STREAM_CONFIG: { struct msm_audio_stream_config cfg; - pr_debug("%s[%p]:SET STREAM CONFIG\n", __func__, audio); + pr_debug("%s[%pK]:SET STREAM CONFIG\n", __func__, audio); mutex_lock(&audio->lock); if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { pr_err( @@ -1660,7 +1659,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, } case AUDIO_SET_CONFIG: { struct msm_audio_config config; - pr_err("%s[%p]:AUDIO_SET_CONFIG\n", __func__, audio); + pr_err("%s[%pK]:AUDIO_SET_CONFIG\n", __func__, audio); mutex_lock(&audio->lock); if (copy_from_user(&config, (void *)arg, sizeof(config))) { pr_err( @@ -1671,7 +1670,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, break; } if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s[%p]:Not sufficient permission to change the playback mode\n", + pr_err("%s[%pK]:Not sufficient permission to change the playback mode\n", __func__, audio); rc = -EACCES; mutex_unlock(&audio->lock); @@ -1711,14 +1710,14 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, } audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - pr_debug("%s[%p]:session id %d: Set-buf-cfg: meta[%d]", + pr_debug("%s[%pK]:session id %d: Set-buf-cfg: meta[%d]", __func__, audio, audio->ac->session, cfg.meta_info_enable); mutex_unlock(&audio->lock); break; } case AUDIO_GET_BUF_CFG: { - pr_debug("%s[%p]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", + pr_debug("%s[%pK]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", __func__, audio, audio->ac->session, audio->buf_cfg.meta_info_enable, audio->buf_cfg.frames_per_buf); @@ -1736,7 +1735,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, } case AUDIO_REGISTER_ION: { struct msm_audio_ion_info info; - pr_debug("%s[%p]:AUDIO_REGISTER_ION\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_REGISTER_ION\n", __func__, audio); mutex_lock(&audio->lock); if (copy_from_user(&info, (void *)arg, sizeof(info))) { pr_err( @@ -1752,7 +1751,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, case AUDIO_DEREGISTER_ION: { struct msm_audio_ion_info info; mutex_lock(&audio->lock); - pr_debug("%s[%p]:AUDIO_DEREGISTER_ION\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_DEREGISTER_ION\n", __func__, audio); if (copy_from_user(&info, (void *)arg, sizeof(info))) { pr_err( "%s: copy_from_user for AUDIO_DEREGISTER_ION failed\n", @@ -1868,7 +1867,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_GET_EVENT_32: { - pr_debug("%s[%p]:AUDIO_GET_EVENT\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_GET_EVENT\n", __func__, audio); if (mutex_trylock(&audio->get_event_lock)) { rc = audio_aio_process_event_req_compat(audio, (void __user *)arg); @@ -1908,7 +1907,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, memset(&cfg, 0, sizeof(cfg)); cfg.buffer_size = audio->str_cfg.buffer_size; cfg.buffer_count = audio->str_cfg.buffer_count; - pr_debug("%s[%p]:GET STREAM CFG %d %d\n", + pr_debug("%s[%pK]:GET STREAM CFG %d %d\n", __func__, audio, cfg.buffer_size, cfg.buffer_count); if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) { pr_err("%s: copy_to_user for AUDIO_GET_STREAM_CONFIG_32 failed\n", @@ -1921,7 +1920,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, case AUDIO_SET_STREAM_CONFIG_32: { struct msm_audio_stream_config32 cfg_32; struct msm_audio_stream_config cfg; - pr_debug("%s[%p]:SET STREAM CONFIG\n", __func__, audio); + pr_debug("%s[%pK]:SET STREAM CONFIG\n", __func__, audio); mutex_lock(&audio->lock); if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { pr_err("%s: copy_from_user for AUDIO_SET_STREAM_CONFIG_32 failed\n", @@ -1965,13 +1964,13 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, mutex_lock(&audio->lock); if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s[%p]:Not sufficient permission to change the playback mode\n", + pr_err("%s[%pK]:Not sufficient permission to change the playback mode\n", __func__, audio); rc = -EACCES; mutex_unlock(&audio->lock); break; } - pr_err("%s[%p]:AUDIO_SET_CONFIG\n", __func__, audio); + pr_err("%s[%pK]:AUDIO_SET_CONFIG\n", __func__, audio); if (copy_from_user(&config_32, (void *)arg, sizeof(config_32))) { pr_err("%s: copy_from_user for AUDIO_SET_CONFIG_32 failed\n", @@ -2025,7 +2024,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, } audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - pr_debug("%s[%p]:session id %d: Set-buf-cfg: meta[%d]", + pr_debug("%s[%pK]:session id %d: Set-buf-cfg: meta[%d]", __func__, audio, audio->ac->session, cfg.meta_info_enable); mutex_unlock(&audio->lock); @@ -2033,7 +2032,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, } case AUDIO_GET_BUF_CFG_32: { struct msm_audio_buf_cfg32 cfg_32; - pr_debug("%s[%p]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", + pr_debug("%s[%pK]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", __func__, audio, audio->ac->session, audio->buf_cfg.meta_info_enable, audio->buf_cfg.frames_per_buf); @@ -2053,7 +2052,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, case AUDIO_REGISTER_ION_32: { struct msm_audio_ion_info32 info_32; struct msm_audio_ion_info info; - pr_debug("%s[%p]:AUDIO_REGISTER_ION\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_REGISTER_ION\n", __func__, audio); mutex_lock(&audio->lock); if (copy_from_user(&info_32, (void *)arg, sizeof(info_32))) { pr_err("%s: copy_from_user for AUDIO_REGISTER_ION_32 failed\n", @@ -2071,7 +2070,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_ion_info32 info_32; struct msm_audio_ion_info info; mutex_lock(&audio->lock); - pr_debug("%s[%p]:AUDIO_DEREGISTER_ION\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_DEREGISTER_ION\n", __func__, audio); if (copy_from_user(&info_32, (void *)arg, sizeof(info_32))) { pr_err("%s: copy_from_user for AUDIO_DEREGISTER_ION_32 failed\n", __func__); diff --git a/drivers/misc/qcom/qdsp6v2/audio_wma.c b/drivers/misc/qcom/qdsp6v2/audio_wma.c index bc9e79ace398f..25e524f6a8c49 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_wma.c +++ b/drivers/misc/qcom/qdsp6v2/audio_wma.c @@ -40,7 +40,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd, case AUDIO_START: { struct asm_wma_cfg wma_cfg; struct msm_audio_wma_config_v2 *wma_config; - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -122,7 +122,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); @@ -211,7 +211,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_compat_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); diff --git a/drivers/misc/qcom/qdsp6v2/audio_wmapro.c b/drivers/misc/qcom/qdsp6v2/audio_wmapro.c index f2c3289c4ce28..2c88e77e95bb2 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_wmapro.c +++ b/drivers/misc/qcom/qdsp6v2/audio_wmapro.c @@ -173,7 +173,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); @@ -281,7 +281,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_compat_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); diff --git a/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c b/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c index 6e82c8051886e..d861e05a3ac6d 100644 --- a/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c +++ b/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c @@ -54,18 +54,18 @@ void audio_aio_cb(uint32_t opcode, uint32_t token, switch (opcode) { case ASM_DATA_EVENT_WRITE_DONE_V2: - pr_debug("%s[%p]:ASM_DATA_EVENT_WRITE_DONE token = 0x%x\n", + pr_debug("%s[%pK]:ASM_DATA_EVENT_WRITE_DONE token = 0x%x\n", __func__, audio, token); audio_aio_async_write_ack(audio, token, payload); break; case ASM_DATA_EVENT_READ_DONE_V2: - pr_debug("%s[%p]:ASM_DATA_EVENT_READ_DONE token = 0x%x\n", + pr_debug("%s[%pK]:ASM_DATA_EVENT_READ_DONE token = 0x%x\n", __func__, audio, token); audio_aio_async_read_ack(audio, token, payload); break; case ASM_DATA_EVENT_RENDERED_EOS: /* EOS Handle */ - pr_debug("%s[%p]:ASM_DATA_CMDRSP_EOS\n", __func__, audio); + pr_debug("%s[%pK]:ASM_DATA_CMDRSP_EOS\n", __func__, audio); if (audio->feedback) { /* Non-Tunnel mode */ audio->eos_rsp = 1; /* propagate input EOS i/p buffer, @@ -87,16 +87,16 @@ void audio_aio_cb(uint32_t opcode, uint32_t token, break; case ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2: case ASM_STREAM_CMD_SET_ENCDEC_PARAM: - pr_debug("%s[%p]:payload0[%x] payloa1d[%x]opcode= 0x%x\n", + pr_debug("%s[%pK]:payload0[%x] payloa1d[%x]opcode= 0x%x\n", __func__, audio, payload[0], payload[1], opcode); break; case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: - pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0]-sr = %d, payload[1]-chl = %d, payload[2] = %d, payload[3] = %d\n", + pr_debug("%s[%pK]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0]-sr = %d, payload[1]-chl = %d, payload[2] = %d, payload[3] = %d\n", __func__, audio, payload[0], payload[1], payload[2], payload[3]); - pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,", + pr_debug("%s[%pK]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,", __func__, audio, audio->pcm_cfg.sample_rate, audio->pcm_cfg.channel_count); @@ -130,7 +130,7 @@ void extract_meta_out_info(struct q6audio_aio *audio, else memset(&buf_node->meta_info.meta_in, 0, sizeof(struct dec_meta_in)); - pr_debug("%s[%p]:i/p: msw_ts 0x%d lsw_ts 0x%d nflags 0x%8x\n", + pr_debug("%s[%pK]:i/p: msw_ts 0x%d lsw_ts 0x%d nflags 0x%8x\n", __func__, audio, buf_node->meta_info.meta_in.ntimestamp.highpart, buf_node->meta_info.meta_in.ntimestamp.lowpart, @@ -145,7 +145,7 @@ void extract_meta_out_info(struct q6audio_aio *audio, meta_data->meta_out_dsp[0].lsw_ts; meta_data->meta_out_dsp[0].lsw_ts = temp; - pr_debug("%s[%p]:o/p: msw_ts 0x%d lsw_ts 0x%d nflags 0x%8x, num_frames = %d\n", + pr_debug("%s[%pK]:o/p: msw_ts 0x%d lsw_ts 0x%d nflags 0x%8x, num_frames = %d\n", __func__, audio, ((struct dec_meta_out *)buf_node->kvaddr)->\ meta_out_dsp[0].msw_ts, @@ -201,7 +201,7 @@ void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, = payload[9]; event_payload.aio_buf.data_len = payload[4]\ + payload[5] + sizeof(struct dec_meta_out); - pr_debug("%s[%p]:nr of frames 0x%8x len=%d\n", + pr_debug("%s[%pK]:nr of frames 0x%8x len=%d\n", __func__, audio, filled_buf->meta_info.meta_out.num_of_frames, event_payload.aio_buf.data_len); @@ -213,7 +213,7 @@ void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, event_payload); kfree(filled_buf); } else { - pr_err("%s[%p]:expected=%x ret=%x\n", + pr_err("%s[%pK]:expected=%x ret=%x\n", __func__, audio, filled_buf->token, token); spin_unlock_irqrestore(&audio->dsp_lock, flags); } diff --git a/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c b/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c index 30274fd4b725b..334e705ca8f1f 100644 --- a/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c +++ b/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c @@ -208,7 +208,7 @@ static int q6usm_us_client_buf_free(unsigned int dir, rc = q6usm_memory_unmap(port->phys, dir, usc->session, *((uint32_t *)port->ext)); - pr_debug("%s: data[%p]phys[%llx][%p]\n", __func__, + pr_debug("%s: data[%pK]phys[%llx][%pK]\n", __func__, (void *)port->data, (u64)port->phys, (void *)&port->phys); msm_audio_ion_free(port->client, port->handle); @@ -248,7 +248,7 @@ int q6usm_us_param_buf_free(unsigned int dir, rc = q6usm_memory_unmap(port->param_phys, dir, usc->session, *((uint32_t *)port->param_buf_mem_handle)); - pr_debug("%s: data[%p]phys[%llx][%p]\n", __func__, + pr_debug("%s: data[%pK]phys[%llx][%pK]\n", __func__, (void *)port->param_buf, (u64)port->param_phys, (void *)&port->param_phys); @@ -362,7 +362,7 @@ struct us_client *q6usm_us_client_alloc( spin_lock_init(&usc->port[lcnt].dsp_lock); usc->port[lcnt].ext = (void *)p_mem_handle++; usc->port[lcnt].param_buf_mem_handle = (void *)p_mem_handle++; - pr_err("%s: usc->port[%d].ext=%p;\n", + pr_err("%s: usc->port[%d].ext=%pK;\n", __func__, lcnt, usc->port[lcnt].ext); } atomic_set(&usc->cmd_state, 0); @@ -417,7 +417,7 @@ int q6usm_us_client_buf_alloc(unsigned int dir, port->buf_cnt = bufcnt; port->buf_size = bufsz; - pr_debug("%s: data[%p]; phys[%llx]; [%p]\n", __func__, + pr_debug("%s: data[%pK]; phys[%llx]; [%pK]\n", __func__, (void *)port->data, (u64)port->phys, (void *)&port->phys); @@ -482,7 +482,7 @@ int q6usm_us_param_buf_alloc(unsigned int dir, } port->param_buf_size = bufsz; - pr_debug("%s: param_buf[%p]; param_phys[%llx]; [%p]\n", __func__, + pr_debug("%s: param_buf[%pK]; param_phys[%llx]; [%pK]\n", __func__, (void *)port->param_buf, (u64)port->param_phys, (void *)&port->param_phys); @@ -1335,7 +1335,7 @@ int q6usm_set_us_detection(struct us_client *usc, if ((usc == NULL) || (detect_info_size == 0) || (detect_info == NULL)) { - pr_err("%s: wrong input: usc=0x%p, inf_size=%d; info=0x%p", + pr_err("%s: wrong input: usc=0x%pK, inf_size=%d; info=0x%pK", __func__, usc, detect_info_size, diff --git a/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c b/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c index 76bcc83e1c5ec..a4d63f0c0d1ac 100644 --- a/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c +++ b/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2013, 2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -170,7 +170,7 @@ static int usfcdev_connect(struct input_handler *handler, struct input_dev *dev, } usfc_handle->dev = dev; ret = input_register_handle(usfc_handle); - pr_debug("%s: name=[%s]; ind=%d; dev=0x%p\n", + pr_debug("%s: name=[%s]; ind=%d; dev=0x%pK\n", __func__, dev->name, ind, @@ -259,7 +259,7 @@ bool usfcdev_register( bool rc = false; if ((event_type_ind >= MAX_EVENT_TYPE_NUM) || !match_cb) { - pr_err("%s: wrong input: event_type_ind=%d; match_cb=0x%p\n", + pr_err("%s: wrong input: event_type_ind=%d; match_cb=0x%pK\n", __func__, event_type_ind, match_cb); From 48de9f4ead2d1984f1b0238ebb70689a09fb648f Mon Sep 17 00:00:00 2001 From: Xiaojun Sang Date: Tue, 30 Aug 2016 15:31:56 +0800 Subject: [PATCH 0056/1015] ASoC: soc: change audio cpe drivers to use %pK Change cpe driver to use %pK instead of %p. %pK hides addresses when the users doesn't have kernel permissions. If address information is needed echo 0 > /proc/sys/kernel/kptr_restrict. CRs-Fixed: 1052832 Change-Id: I741d9e5c5b415011348e862c3f1ee4fe28c3969f Signed-off-by: Xiaojun Sang --- sound/soc/msm/msm-cpe-lsm.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sound/soc/msm/msm-cpe-lsm.c b/sound/soc/msm/msm-cpe-lsm.c index 9f957e530817a..af682fd536e2f 100644 --- a/sound/soc/msm/msm-cpe-lsm.c +++ b/sound/soc/msm/msm-cpe-lsm.c @@ -506,7 +506,7 @@ static int msm_cpe_lab_buf_alloc(struct snd_pcm_substream *substream, pcm_buf[count].mem = pcm_buf[0].mem + (count * bufsz); pcm_buf[count].phys = pcm_buf[0].phys + (count * bufsz); dev_dbg(rtd->dev, - "%s: pcm_buf[%d].mem %p pcm_buf[%d].phys %pa\n", + "%s: pcm_buf[%d].mem %pK pcm_buf[%d].phys %pK\n", __func__, count, (void *)pcm_buf[count].mem, count, &(pcm_buf[count].phys)); @@ -733,7 +733,7 @@ static int msm_cpe_lab_thread(void *data) cur_buf = &lab_d->pcm_buf[buf_count % prd_cnt]; next_buf = &lab_d->pcm_buf[(buf_count + 2) % prd_cnt]; dev_dbg(rtd->dev, - "%s: Cur buf.mem = %p Next Buf.mem = %p\n" + "%s: Cur buf.mem = %pK Next Buf.mem = %pK\n" " buf count = 0x%x\n", __func__, cur_buf->mem, next_buf->mem, buf_count); } else { @@ -1548,7 +1548,7 @@ static int msm_cpe_lsm_lab_start(struct snd_pcm_substream *substream, int rc; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", __func__, substream); return -EINVAL; } @@ -1638,7 +1638,7 @@ static bool msm_cpe_lsm_is_valid_stream(struct snd_pcm_substream *substream, struct wcd_cpe_lsm_ops *lsm_ops; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", func, substream); return false; } @@ -2079,7 +2079,7 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, struct wcd_cpe_lsm_ops *lsm_ops; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", __func__, substream); return -EINVAL; } @@ -2351,7 +2351,7 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, struct wcd_cpe_lsm_ops *lsm_ops; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", __func__, substream); return -EINVAL; } @@ -3001,7 +3001,7 @@ static int msm_cpe_lsm_copy(struct snd_pcm_substream *substream, int a, if (lab_d->buf_idx >= (lsm_d->hw_params.period_count)) lab_d->buf_idx = 0; pcm_buf = (lab_d->pcm_buf[lab_d->buf_idx].mem); - pr_debug("%s: Buf IDX = 0x%x pcm_buf %p\n", + pr_debug("%s: Buf IDX = 0x%x pcm_buf %pK\n", __func__, lab_d->buf_idx, pcm_buf); if (pcm_buf) { if (copy_to_user(buf, pcm_buf, fbytes)) { From d0eb6d9024754bb9efafcad508cca5c8aa3bcd16 Mon Sep 17 00:00:00 2001 From: Vijayavardhan Vennapusa Date: Fri, 19 Aug 2016 12:28:23 +0530 Subject: [PATCH 0057/1015] ARM: dts: msm: Add USB BAM pipes for IPA based tethering on MSM8920 Define USB BAM pipes for tethering and DPL functions using IPA. CRs-Fixed: 1056670 Change-Id: I216d8893a983f9d8181e18b4fcb5951a6a295309 Signed-off-by: Vijayavardhan Vennapusa --- arch/arm/boot/dts/qcom/msm8920.dtsi | 65 +++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index a12f13ae88156..cad2b8c0e878d 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -51,3 +51,68 @@ &clock_gcc_mdss { compatible = "qcom,gcc-mdss-8920"; }; + +&usb_otg { + /delete-property/ clocks; + clocks = <&clock_gcc clk_gcc_usb_hs_ahb_clk>, + <&clock_gcc clk_gcc_usb_hs_system_clk>, + <&clock_gcc clk_gcc_usb2a_phy_sleep_clk>, + <&clock_gcc clk_bimc_usb_clk>, + <&clock_gcc clk_snoc_usb_clk>, + <&clock_gcc clk_pnoc_usb_clk>, + <&clock_gcc clk_gcc_qusb2_phy_clk>, + <&clock_gcc clk_gcc_usb2_hs_phy_only_clk>, + <&clock_gcc clk_gcc_usb_hs_phy_cfg_ahb_clk>, + <&clock_gcc clk_xo_otg_clk>; + + qcom,usbbam@78c4000 { + qcom,enable-hsusb-bam-on-boot; + + /delete-property/ qcom,reset-bam-on-disconnect; + /delete-node/ qcom,pipe0; + qcom,pipe0 { + label = "hsusb-ipa-out-0"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <0>; + qcom,pipe-num = <0>; + qcom,peer-bam = <1>; + qcom,src-bam-pipe-index = <1>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + qcom,pipe1 { + label = "hsusb-ipa-in-0"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <1>; + qcom,pipe-num = <0>; + qcom,peer-bam = <1>; + qcom,dst-bam-pipe-index = <0>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + qcom,pipe2 { + label = "hsusb-qdss-in-0"; + qcom,usb-bam-mem-type = <2>; + qcom,dir = <1>; + qcom,pipe-num = <0>; + qcom,peer-bam = <0>; + qcom,peer-bam-physical-address = <0x6044000>; + qcom,src-bam-pipe-index = <0>; + qcom,dst-bam-pipe-index = <2>; + qcom,data-fifo-offset = <0x0>; + qcom,data-fifo-size = <0xe00>; + qcom,descriptor-fifo-offset = <0xe00>; + qcom,descriptor-fifo-size = <0x200>; + }; + qcom,pipe3 { + label = "hsusb-dpl-ipa-in-1"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <1>; + qcom,pipe-num = <1>; + qcom,peer-bam = <1>; + qcom,dst-bam-pipe-index = <3>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + }; +}; From 781723b548ae6fa28c99f9df063884a4e29a9bc3 Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Tue, 6 Sep 2016 20:00:02 +0530 Subject: [PATCH 0058/1015] power: smb135x-charger: Disable TEMP MONITOR in parallel charger mode The parallel SMB135x charger configuration may share battery thermistor with PMIC and hence the default configuration has TEMP MONITOR enabled. As the battery-temperature based parallel charger control is managed in SW, disable the hardware TEMP MONITOR configuration on SMB135x. CRs-Fixed: 1058586 Change-Id: Ic09ff82ddf9efbb9f1766c8bba1a5b50adafb157 Signed-off-by: Anirudh Ghayal --- drivers/power/smb135x-charger.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/power/smb135x-charger.c b/drivers/power/smb135x-charger.c index eb36c6430a1c3..7f970066fe07d 100644 --- a/drivers/power/smb135x-charger.c +++ b/drivers/power/smb135x-charger.c @@ -112,6 +112,7 @@ #define BATT_MISSING_THERM_BIT BIT(1) #define CFG_1A_REG 0x1A +#define TEMP_MONITOR_EN_BIT BIT(6) #define HOT_SOFT_VFLOAT_COMP_EN_BIT BIT(3) #define COLD_SOFT_VFLOAT_COMP_EN_BIT BIT(2) #define HOT_SOFT_CURRENT_COMP_EN_BIT BIT(1) @@ -1814,6 +1815,15 @@ static int smb135x_parallel_set_chg_present(struct smb135x_chg *chip, return rc; } + /* disable thermal monitoring for parallel-charger */ + rc = smb135x_masked_write(chip, CFG_1A_REG, + TEMP_MONITOR_EN_BIT, 0); + if (rc < 0) { + dev_err(chip->dev, + "Couldn't disable temp-monitor rc=%d\n", rc); + return rc; + } + /* set the float voltage */ if (chip->vfloat_mv != -EINVAL) { rc = smb135x_float_voltage_set(chip, chip->vfloat_mv); From 089b50d401cc5a696c3d3c4f7e87bcc02de703f4 Mon Sep 17 00:00:00 2001 From: Sahitya Tummala Date: Fri, 19 Sep 2014 15:43:37 +0530 Subject: [PATCH 0059/1015] host: sdhci: fix current caps when there is no host->vmmc When the regulators are not managed by SDHCI host driver (i.e., when host->vmmc and host->vmmcq are absent), get the regulator current capabilities through a new host op get_current_limit(). Change-Id: I097349ad4d2e8ffbafbeb5fe65910894fe909bd6 Signed-off-by: Sahitya Tummala Signed-off-by: Sayali Lokhande --- drivers/mmc/host/sdhci.c | 11 ++++++++--- drivers/mmc/host/sdhci.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index c7a066819a161..0fc356e829183 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -4116,10 +4116,15 @@ int sdhci_add_host(struct sdhci_host *host) * value. */ max_current_caps = sdhci_readl(host, SDHCI_MAX_CURRENT); - if (!max_current_caps && !IS_ERR(mmc->supply.vmmc)) { - int curr = regulator_get_current_limit(mmc->supply.vmmc); - if (curr > 0) { + if (!max_current_caps) { + u32 curr = 0; + + if (!IS_ERR(mmc->supply.vmmc)) + curr = regulator_get_current_limit(mmc->supply.vmmc); + else if (host->ops->get_current_limit) + curr = host->ops->get_current_limit(host); + if (curr > 0) { /* convert to SDHCI_MAX_CURRENT format */ curr = curr/1000; /* convert to mA */ curr = curr/SDHCI_MAX_CURRENT_MULTIPLIER; diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 80f36d61f11f9..aaba8884d97f1 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -337,6 +337,7 @@ struct sdhci_ops { void (*init)(struct sdhci_host *host); void (*pre_req)(struct sdhci_host *host, struct mmc_request *req); void (*post_req)(struct sdhci_host *host, struct mmc_request *req); + unsigned int (*get_current_limit)(struct sdhci_host *host); }; #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS From ef7524e72fd2daa48c4286772a73098b386720a5 Mon Sep 17 00:00:00 2001 From: Praneeth Paladugu Date: Mon, 22 Aug 2016 00:28:16 -0700 Subject: [PATCH 0060/1015] msm: vidc: Use internal size for extradata plane Derive extradata plane size using internal MACRO rather than getting from Venus. This helps to keep clients and driver in sync. CRs-Fixed: 1011881 Change-Id: I2b3536f5eb2742d6b6855140c40724f6425d1578 Signed-off-by: Praneeth Paladugu --- drivers/media/platform/msm/vidc/msm_vdec.c | 28 ++++++++-------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c index d6c37e02e6cfa..d3a18f61daef6 100644 --- a/drivers/media/platform/msm/vidc/msm_vdec.c +++ b/drivers/media/platform/msm/vidc/msm_vdec.c @@ -1087,7 +1087,6 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) struct hfi_device *hdev; int rc = 0, i = 0, stride = 0, scanlines = 0, color_format = 0; unsigned int *plane_sizes = NULL, extra_idx = 0; - struct hal_buffer_requirements *bufreq; if (!inst || !f || !inst->core || !inst->core->device) { dprintk(VIDC_ERR, @@ -1177,10 +1176,10 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) extra_idx = EXTRADATA_IDX(fmt->num_planes); if (extra_idx && extra_idx < VIDEO_MAX_PLANES) { - bufreq = get_buff_req_buffer(inst, - HAL_BUFFER_EXTRADATA_OUTPUT); f->fmt.pix_mp.plane_fmt[extra_idx].sizeimage = - bufreq ? bufreq->buffer_size : 0; + VENUS_EXTRADATA_SIZE( + inst->prop.height[CAPTURE_PORT], + inst->prop.width[CAPTURE_PORT]); } for (i = 0; i < fmt->num_planes; ++i) @@ -1258,7 +1257,6 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) int ret = 0; int i; int max_input_size = 0; - struct hal_buffer_requirements *bufreq; if (!inst || !inst->core || !f) { dprintk(VIDC_ERR, "%s invalid parameters\n", __func__); @@ -1309,16 +1307,12 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) extra_idx = EXTRADATA_IDX(fmt->num_planes); if (extra_idx && extra_idx < VIDEO_MAX_PLANES) { - bufreq = get_buff_req_buffer(inst, - HAL_BUFFER_EXTRADATA_OUTPUT); f->fmt.pix_mp.plane_fmt[extra_idx].sizeimage = - bufreq ? bufreq->buffer_size : 0; + VENUS_EXTRADATA_SIZE( + inst->prop.height[CAPTURE_PORT], + inst->prop.width[CAPTURE_PORT]); } - for (i = 0; i < fmt->num_planes; ++i) - inst->bufq[CAPTURE_PORT].vb2_bufq.plane_sizes[i] = - f->fmt.pix_mp.plane_fmt[i].sizeimage; - f->fmt.pix_mp.num_planes = fmt->num_planes; for (i = 0; i < fmt->num_planes; ++i) { inst->bufq[CAPTURE_PORT].vb2_bufq.plane_sizes[i] = @@ -1606,12 +1600,10 @@ static int msm_vdec_queue_setup(struct vb2_queue *q, extra_idx = EXTRADATA_IDX(inst->fmts[CAPTURE_PORT]->num_planes); if (extra_idx && extra_idx < VIDEO_MAX_PLANES) { - bufreq = get_buff_req_buffer(inst, - HAL_BUFFER_EXTRADATA_OUTPUT); - if (bufreq) - sizes[extra_idx] = bufreq->buffer_size; - else - sizes[extra_idx] = 0; + sizes[extra_idx] = + VENUS_EXTRADATA_SIZE( + inst->prop.height[CAPTURE_PORT], + inst->prop.width[CAPTURE_PORT]); } break; default: From cc8a479d56621e080ed40c25762fd7487b38ddc4 Mon Sep 17 00:00:00 2001 From: Samyukta Mogily Date: Thu, 8 Sep 2016 17:35:52 +0530 Subject: [PATCH 0061/1015] msm: camera: Restructure data handling to be more robust Use dynamic array allocation instead of static array to prevent stack overflow. User-supplied number of bytes may result in integer overflow. To fix this we check that the num_byte isn't above 8K size. CRs-Fixed: 1060554 Change-Id: I407b5ec8cdc2ac7f3b491644418d3eb1101ce65a Signed-off-by: Samyukta Mogily --- .../camera_v2/sensor/io/msm_camera_cci_i2c.c | 6 +++ .../camera_v2/sensor/io/msm_camera_qup_i2c.c | 39 ++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c index 8f911d3624773..4b763c6d1fddc 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c @@ -69,6 +69,12 @@ int32_t msm_camera_cci_i2c_read_seq(struct msm_camera_i2c_client *client, || num_byte == 0) return rc; + if (num_byte > I2C_REG_DATA_MAX) { + pr_err("%s: Error num_byte:0x%x exceeds 8K max supported:0x%x\n", + __func__, num_byte, I2C_REG_DATA_MAX); + return rc; + } + buf = kzalloc(num_byte, GFP_KERNEL); if (!buf) { pr_err("%s:%d no memory\n", __func__, __LINE__); diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c index 3b101798edac2..a0786c55f7572 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c @@ -73,7 +73,7 @@ int32_t msm_camera_qup_i2c_read(struct msm_camera_i2c_client *client, enum msm_camera_i2c_data_type data_type) { int32_t rc = -EFAULT; - unsigned char buf[client->addr_type+data_type]; + unsigned char *buf = NULL; if ((client->addr_type != MSM_CAMERA_I2C_BYTE_ADDR && client->addr_type != MSM_CAMERA_I2C_WORD_ADDR) @@ -81,6 +81,17 @@ int32_t msm_camera_qup_i2c_read(struct msm_camera_i2c_client *client, && data_type != MSM_CAMERA_I2C_WORD_DATA)) return rc; + if (client->addr_type > UINT_MAX - data_type) { + pr_err("%s: integer overflow prevented\n", __func__); + return rc; + } + + buf = kzalloc(client->addr_type+data_type, GFP_KERNEL); + if (!buf) { + pr_err("%s:%d no memory\n", __func__, __LINE__); + return -ENOMEM; + } + if (client->addr_type == MSM_CAMERA_I2C_BYTE_ADDR) { buf[0] = addr; } else if (client->addr_type == MSM_CAMERA_I2C_WORD_ADDR) { @@ -90,6 +101,8 @@ int32_t msm_camera_qup_i2c_read(struct msm_camera_i2c_client *client, rc = msm_camera_qup_i2c_rxdata(client, buf, data_type); if (rc < 0) { S_I2C_DBG("%s fail\n", __func__); + kfree(buf); + buf = NULL; return rc; } @@ -99,6 +112,8 @@ int32_t msm_camera_qup_i2c_read(struct msm_camera_i2c_client *client, *data = buf[0] << 8 | buf[1]; S_I2C_DBG("%s addr = 0x%x data: 0x%x\n", __func__, addr, *data); + kfree(buf); + buf = NULL; return rc; } @@ -106,7 +121,7 @@ int32_t msm_camera_qup_i2c_read_seq(struct msm_camera_i2c_client *client, uint32_t addr, uint8_t *data, uint32_t num_byte) { int32_t rc = -EFAULT; - unsigned char buf[client->addr_type+num_byte]; + unsigned char *buf = NULL; int i; if ((client->addr_type != MSM_CAMERA_I2C_BYTE_ADDR @@ -114,6 +129,22 @@ int32_t msm_camera_qup_i2c_read_seq(struct msm_camera_i2c_client *client, || num_byte == 0) return rc; + if (num_byte > I2C_REG_DATA_MAX) { + pr_err("%s: Error num_byte:0x%x exceeds 8K max supported:0x%x\n", + __func__, num_byte, I2C_REG_DATA_MAX); + return rc; + } + if (client->addr_type > UINT_MAX - num_byte) { + pr_err("%s: integer overflow prevented\n", __func__); + return rc; + } + + buf = kzalloc(client->addr_type+num_byte, GFP_KERNEL); + if (!buf) { + pr_err("%s:%d no memory\n", __func__, __LINE__); + return -ENOMEM; + } + if (client->addr_type == MSM_CAMERA_I2C_BYTE_ADDR) { buf[0] = addr; } else if (client->addr_type == MSM_CAMERA_I2C_WORD_ADDR) { @@ -123,6 +154,8 @@ int32_t msm_camera_qup_i2c_read_seq(struct msm_camera_i2c_client *client, rc = msm_camera_qup_i2c_rxdata(client, buf, num_byte); if (rc < 0) { S_I2C_DBG("%s fail\n", __func__); + kfree(buf); + buf = NULL; return rc; } @@ -132,6 +165,8 @@ int32_t msm_camera_qup_i2c_read_seq(struct msm_camera_i2c_client *client, S_I2C_DBG("Byte %d: 0x%x\n", i, buf[i]); S_I2C_DBG("Data: 0x%x\n", data[i]); } + kfree(buf); + buf = NULL; return rc; } From 993eea5f65cd23331487fb84aa1ffc5b347d3717 Mon Sep 17 00:00:00 2001 From: Pavan Anamula Date: Fri, 29 Apr 2016 11:37:23 +0530 Subject: [PATCH 0062/1015] mmc: sdhci: Ignore data end bit error interrupts. Avoid printing of the error messages and register dumps, incase of data endbit errors like other data errors. Change-Id: If8ed082cc97a895cfbf959201c579914d5768b23 Signed-off-by: Pavan Anamula Signed-off-by: Veerabhadrarao Badiganti --- drivers/mmc/host/sdhci.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index c7a066819a161..4e40a48f30de8 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -3012,7 +3012,8 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) host->ops->adma_workaround(host, intmask); } if (host->data->error) { - if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT)) { + if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT + | SDHCI_INT_DATA_END_BIT)) { command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND)); if ((command != MMC_SEND_TUNING_BLOCK_HS200) && From 720adc36d9ea5feb13b9765a11e3b8a5bf3a73a0 Mon Sep 17 00:00:00 2001 From: Vikash Garodia Date: Wed, 17 Aug 2016 20:23:12 +0530 Subject: [PATCH 0063/1015] msm: vidc: Initialize the dcvs load during perf mode switch Incase V4L2 client sets the perf mode to TURBO, DCVS is turned off. Now when the client sets the perf mode back to nominal, venus clock and load is changed but dcvs parameters are not updated to reflect the driver current state interms of venus load. Initialize the dcvs parameters to update itself as per the ongoing venus load. Change-Id: I8f35cdd154fbde49c95cdd0e5f7df4b9e4f897a5 Signed-off-by: Vikash Garodia --- drivers/media/platform/msm/vidc/msm_venc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c index ec17a60f33047..aa7b9561fbeef 100644 --- a/drivers/media/platform/msm/vidc/msm_venc.c +++ b/drivers/media/platform/msm/vidc/msm_venc.c @@ -3005,7 +3005,10 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL: switch (ctrl->val) { case V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL: - inst->flags &= ~VIDC_TURBO; + if (inst->flags & VIDC_TURBO) { + inst->flags &= ~VIDC_TURBO; + msm_dcvs_init_load(inst); + } break; case V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO: inst->flags |= VIDC_TURBO; @@ -3016,7 +3019,6 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) rc = -ENOTSUPP; break; } - msm_comm_scale_clocks_and_bus(inst); break; case V4L2_CID_MPEG_VIDC_VIDEO_H264_VUI_BITSTREAM_RESTRICT: From 4d2b82f39e219a203fe3630425cfb9c6795f1577 Mon Sep 17 00:00:00 2001 From: Daniel Cashman Date: Thu, 14 Jan 2016 15:19:57 -0800 Subject: [PATCH 0064/1015] arm: mm: support ARCH_MMAP_RND_BITS arm: arch_mmap_rnd() uses a hard-code value of 8 to generate the random offset for the mmap base address. This value represents a compromise between increased ASLR effectiveness and avoiding address-space fragmentation. Replace it with a Kconfig option, which is sensibly bounded, so that platform developers may choose where to place this compromise. Keep 8 as the minimum acceptable value. Change-Id: Idad7ae47eb8b7e87e42c4ac905d1dd1f82046593 [arnd@arndb.de: ARM: avoid ARCH_MMAP_RND_BITS for NOMMU] Signed-off-by: Daniel Cashman Cc: Russell King Acked-by: Kees Cook Cc: Ingo Molnar Cc: Jonathan Corbet Cc: Don Zickus Cc: Eric W. Biederman Cc: Heinrich Schuchardt Cc: Josh Poimboeuf Cc: Kirill A. Shutemov Cc: Naoya Horiguchi Cc: Andrea Arcangeli Cc: Mel Gorman Cc: Thomas Gleixner Cc: David Rientjes Cc: Mark Salyzyn Cc: Jeff Vander Stoep Cc: Nick Kralevich Cc: Catalin Marinas Cc: Will Deacon Cc: "H. Peter Anvin" Cc: Hector Marco-Gisbert Cc: Borislav Petkov Cc: Ralf Baechle Cc: Heiko Carstens Cc: Martin Schwidefsky Cc: Benjamin Herrenschmidt Signed-off-by: Arnd Bergmann Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Git-commit: e0c25d958f78acfd5c97df5776eeba3e0684101b Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git [shashim@codeaurora.org: resolve trivial merge conflicts] Signed-off-by: Shiraz Hashim --- arch/arm/mm/mmap.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index 407dc786583ae..4b4058db0781f 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c @@ -173,8 +173,7 @@ unsigned long arch_mmap_rnd(void) { unsigned long rnd; - /* 8 bits of randomness in 20 address space bits */ - rnd = (unsigned long)get_random_int() % (1 << 8); + rnd = (unsigned long)get_random_int() & ((1 << mmap_rnd_bits) - 1); return rnd << PAGE_SHIFT; } From 462c5887c81a9e4a4380a42c9b2fcf3343daef58 Mon Sep 17 00:00:00 2001 From: Shiraz Hashim Date: Thu, 8 Sep 2016 16:03:45 +0530 Subject: [PATCH 0065/1015] defconfig: msm: update mmap randomness for all targets CTS malloc tests on Android 'N' expects higher entropy in mmap returned address. Present value of mmap random bits is not providing enough variations for 32 bit tasks. Increase mmap_rnd_bits for 32bit and mmap_rnd_compat_bits for 64bit targets to value of 16. Change-Id: Ibf6463467f28221470619b4f43ece062d41ae6b8 Signed-off-by: Shiraz Hashim --- arch/arm/configs/msm8909-perf_defconfig | 1 + arch/arm/configs/msm8909_defconfig | 1 + arch/arm/configs/msm8937-perf_defconfig | 1 + arch/arm/configs/msm8937_defconfig | 1 + arch/arm/configs/msmcortex-perf_defconfig | 1 + arch/arm/configs/msmcortex_defconfig | 1 + arch/arm64/configs/msm-perf_defconfig | 1 + arch/arm64/configs/msm8937-perf_defconfig | 1 + arch/arm64/configs/msm8937_defconfig | 1 + arch/arm64/configs/msm_defconfig | 1 + arch/arm64/configs/msmcortex-perf_defconfig | 1 + arch/arm64/configs/msmcortex_defconfig | 1 + 12 files changed, 12 insertions(+) diff --git a/arch/arm/configs/msm8909-perf_defconfig b/arch/arm/configs/msm8909-perf_defconfig index 63751bbc391a8..c5dea5dde0593 100644 --- a/arch/arm/configs/msm8909-perf_defconfig +++ b/arch/arm/configs/msm8909-perf_defconfig @@ -25,6 +25,7 @@ CONFIG_KALLSYMS_ALL=y CONFIG_EMBEDDED=y CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm/configs/msm8909_defconfig b/arch/arm/configs/msm8909_defconfig index 2d5649e24df1e..8b5608d6a54ef 100644 --- a/arch/arm/configs/msm8909_defconfig +++ b/arch/arm/configs/msm8909_defconfig @@ -27,6 +27,7 @@ CONFIG_PROFILING=y CONFIG_OPROFILE=m CONFIG_KPROBES=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index 73224a1692b98..cf5986a2dc2eb 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -28,6 +28,7 @@ CONFIG_EMBEDDED=y # CONFIG_SLUB_DEBUG is not set CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index 3d7b0b30e6398..77a998224338f 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -29,6 +29,7 @@ CONFIG_PROFILING=y CONFIG_OPROFILE=m CONFIG_KPROBES=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index 7f997a31ac836..c102d70e4face 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -28,6 +28,7 @@ CONFIG_EMBEDDED=y # CONFIG_SLUB_DEBUG is not set CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index 636da93aa867c..5f6f98d246e44 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -29,6 +29,7 @@ CONFIG_PROFILING=y CONFIG_OPROFILE=m CONFIG_KPROBES=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm64/configs/msm-perf_defconfig b/arch/arm64/configs/msm-perf_defconfig index 129133b539a4d..241be6600e4e0 100644 --- a/arch/arm64/configs/msm-perf_defconfig +++ b/arch/arm64/configs/msm-perf_defconfig @@ -28,6 +28,7 @@ CONFIG_EMBEDDED=y # CONFIG_SLUB_DEBUG is not set CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index 971a6f453f8f0..44150500e5265 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -27,6 +27,7 @@ CONFIG_EMBEDDED=y # CONFIG_SLUB_DEBUG is not set CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 2231b6fc9f62f..59c3becdc8cce 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -26,6 +26,7 @@ CONFIG_KALLSYMS_ALL=y CONFIG_EMBEDDED=y CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index f5dc15b8a1ed6..03ed6a840ec45 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -26,6 +26,7 @@ CONFIG_KALLSYMS_ALL=y CONFIG_EMBEDDED=y CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index f6a51dd9e9da8..f674855c48413 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -27,6 +27,7 @@ CONFIG_EMBEDDED=y # CONFIG_SLUB_DEBUG is not set CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index 093a7bc3a87a0..069548ef317ed 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -26,6 +26,7 @@ CONFIG_KALLSYMS_ALL=y CONFIG_EMBEDDED=y CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y From a83094727cf811d9affcbd6c9af8807d823f67fd Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Fri, 2 Sep 2016 13:11:21 +0530 Subject: [PATCH 0066/1015] memshare: Add support to listen to SUBSYS_RAMDUMP_NOTIFICATION Currently, on modem subsystem restart the area allocated from HLOS to modem at runtime is not captured as part of the ramdump collection. This patch creates separate elf files for all the clients which are using memshare feature for memory allocation which can be later used to load as dumps. CRs-Fixed: 1058744 Change-Id: I66436b7c2d9e02658cfc4c195ca78852b09c01f7 Signed-off-by: Manoj Prabhu B --- drivers/soc/qcom/memshare/msm_memshare.c | 134 ++++++++++++++++++++++- drivers/soc/qcom/memshare/msm_memshare.h | 3 + 2 files changed, 135 insertions(+), 2 deletions(-) diff --git a/drivers/soc/qcom/memshare/msm_memshare.c b/drivers/soc/qcom/memshare/msm_memshare.c index e1e91f56526d8..6f1f375534316 100644 --- a/drivers/soc/qcom/memshare/msm_memshare.c +++ b/drivers/soc/qcom/memshare/msm_memshare.c @@ -26,6 +26,7 @@ #include "heap_mem_ext_v01.h" #include +#include /* Macros */ #define MEMSHARE_DEV_NAME "memshare" @@ -37,6 +38,7 @@ static void mem_share_svc_recv_msg(struct work_struct *work); static DECLARE_DELAYED_WORK(work_recv_msg, mem_share_svc_recv_msg); static struct workqueue_struct *mem_share_svc_workqueue; static uint64_t bootup_request; +static void *memshare_ramdump_dev[MAX_CLIENTS]; /* Memshare Driver Structure */ struct memshare_driver { @@ -114,9 +116,37 @@ static struct msg_desc mem_share_svc_size_query_resp_desc = { .ei_array = mem_query_size_resp_msg_data_v01_ei, }; +/* + * This API creates ramdump dev handlers + * for each of the memshare clients. + * These dev handlers will be used for + * extracting the ramdump for loaned memory + * segments. + */ + +static int mem_share_configure_ramdump(void) +{ + char client_name[18] = "memshare_"; + char *clnt; + + clnt = ((!num_clients) ? "GPS" : ((num_clients == 1) ? "FTM" : "DIAG")); + snprintf(client_name, 18, "memshare_%s", clnt); + + memshare_ramdump_dev[num_clients] = create_ramdump_device(client_name, + NULL); + if (IS_ERR_OR_NULL(memshare_ramdump_dev[num_clients])) { + pr_err("memshare: %s: Unable to create memshare ramdump device.\n", + __func__); + memshare_ramdump_dev[num_clients] = NULL; + return -ENOMEM; + } + + return 0; +} + static int check_client(int client_id, int proc, int request) { - int i = 0; + int i = 0, rc; int found = DHMS_MEM_CLIENT_INVALID; for (i = 0; i < MAX_CLIENTS; i++) { @@ -127,7 +157,7 @@ static int check_client(int client_id, int proc, int request) } } if ((found == DHMS_MEM_CLIENT_INVALID) && !request) { - pr_debug("No registered client, adding a new client\n"); + pr_debug("memshare: No registered client, adding a new client\n"); /* Add a new client */ for (i = 0; i < MAX_CLIENTS; i++) { if (memblock[i].client_id == DHMS_MEM_CLIENT_INVALID) { @@ -136,6 +166,16 @@ static int check_client(int client_id, int proc, int request) memblock[i].guarantee = 0; memblock[i].peripheral = proc; found = i; + + if (!memblock[i].file_created) { + rc = mem_share_configure_ramdump(); + if (rc) + pr_err("In %s, Cannot create ramdump for client: %d\n", + __func__, client_id); + else + memblock[i].file_created = 1; + } + break; } } @@ -190,10 +230,63 @@ void initialize_client(void) memblock[i].memory_type = MEMORY_CMA; memblock[i].free_memory = 0; memblock[i].hyp_mapping = 0; + memblock[i].file_created = 0; } dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &attrs); } +/* + * This API initializes the ramdump segments + * with the physical address and size of + * the memshared clients. Extraction of ramdump + * is skipped if memshare client is not alloted + * This calls the ramdump api in extracting the + * ramdump in elf format. + */ + +static int mem_share_do_ramdump(void) +{ + int i = 0, ret; + char *client_name; + + for (i = 0; i < num_clients; i++) { + + struct ramdump_segment *ramdump_segments_tmp = NULL; + + client_name = (i == 0) ? "GPS" : + ((i == 1) ? "FTM" : ((i == 2) ? "DIAG" : "NULL")); + + if (!memblock[i].alloted) { + pr_err("memshare:%s memblock is not alloted\n", + client_name); + continue; + } + + ramdump_segments_tmp = kcalloc(1, + sizeof(struct ramdump_segment), + GFP_KERNEL); + if (!ramdump_segments_tmp) + return -ENOMEM; + + ramdump_segments_tmp[0].size = memblock[i].size; + ramdump_segments_tmp[0].address = memblock[i].phy_addr; + + pr_debug("memshare: %s:%s client:phy_address = %llx, size = %d\n", + __func__, client_name, + (unsigned long long) memblock[i].phy_addr, memblock[i].size); + + ret = do_elf_ramdump(memshare_ramdump_dev[i], + ramdump_segments_tmp, 1); + if (ret < 0) { + pr_err("memshare: Unable to dump: %d\n", ret); + kfree(ramdump_segments_tmp); + return ret; + } + kfree(ramdump_segments_tmp); + } + return 0; +} + static int modem_notifier_cb(struct notifier_block *this, unsigned long code, void *_cmd) { @@ -202,8 +295,10 @@ static int modem_notifier_cb(struct notifier_block *this, unsigned long code, u32 source_vmlist[2] = {VMID_HLOS, VMID_MSS_MSA}; int dest_vmids[1] = {VMID_HLOS}; int dest_perms[1] = {PERM_READ|PERM_WRITE}; + struct notif_data *notifdata = NULL; mutex_lock(&memsh_drv->mem_share); + switch (code) { case SUBSYS_BEFORE_SHUTDOWN: @@ -260,6 +355,23 @@ static int modem_notifier_cb(struct notifier_block *this, unsigned long code, bootup_request++; break; + case SUBSYS_RAMDUMP_NOTIFICATION: + + if (_cmd) + notifdata = (struct notif_data *) _cmd; + else + break; + + if (!(notifdata->enable_ramdump)) { + pr_err("In %s, Ramdump collection is disabled\n", + __func__); + } else { + ret = mem_share_do_ramdump(); + if (ret) + pr_err("Ramdump collection failed\n"); + } + break; + default: pr_debug("Memshare: code: %lu\n", code); break; @@ -800,6 +912,9 @@ static int memshare_child_probe(struct platform_device *pdev) memblock[num_clients].size = size; memblock[num_clients].client_id = client_id; + /* + * Memshare allocation for guaranteed clients + */ if (memblock[num_clients].guarantee) { rc = memshare_alloc(memsh_child->dev, memblock[num_clients].size, @@ -812,6 +927,21 @@ static int memshare_child_probe(struct platform_device *pdev) memblock[num_clients].alloted = 1; } + /* + * call for creating ramdump dev handlers for + * memshare clients + */ + + if (!memblock[num_clients].file_created) { + rc = mem_share_configure_ramdump(); + if (rc) + pr_err("In %s, cannot collect dumps for client id: %d\n", + __func__, + memblock[num_clients].client_id); + else + memblock[num_clients].file_created = 1; + } + num_clients++; return 0; diff --git a/drivers/soc/qcom/memshare/msm_memshare.h b/drivers/soc/qcom/memshare/msm_memshare.h index 68a1439079762..3989075329776 100644 --- a/drivers/soc/qcom/memshare/msm_memshare.h +++ b/drivers/soc/qcom/memshare/msm_memshare.h @@ -51,6 +51,9 @@ struct mem_blocks { uint8_t free_memory; /* Need Hypervisor mapping*/ uint8_t hyp_mapping; + /* Status flag which checks if ramdump file is created*/ + int file_created; + }; int memshare_alloc(struct device *dev, From 8c1fb99d4e8c628565aa2c2680f1ad0217f598f7 Mon Sep 17 00:00:00 2001 From: Ashay Jaiswal Date: Fri, 9 Sep 2016 11:15:49 +0530 Subject: [PATCH 0067/1015] power: qpnp-fg: update SOC_REPORTING_READY reporting logic Android healthd daemon waits for Fuel Gauge SOC_REPORTING_READY property to be set to true. In case of failures during profile loading SOC_REPORTING_READY remains false. Thus healthd daemon waits till a timeout(40 sec) before continuing, this wait causes failure in Android's batteryservice. Fix this by setting SOC_REPORTING_READY in case of failures during profile loading. CRs-Fixed: 1063589 Change-Id: I09aa008abdcdb2683602be61f8dc0a0b10a85c8b Signed-off-by: Ashay Jaiswal --- drivers/power/qpnp-fg.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/power/qpnp-fg.c b/drivers/power/qpnp-fg.c index d0d7fb6d38a30..5dcb0b4e321bb 100644 --- a/drivers/power/qpnp-fg.c +++ b/drivers/power/qpnp-fg.c @@ -518,6 +518,7 @@ struct fg_chip { struct fg_wakeup_source update_sram_wakeup_source; bool fg_restarting; bool profile_loaded; + bool soc_reporting_ready; bool use_otp_profile; bool battery_missing; bool power_supply_registered; @@ -4520,7 +4521,7 @@ static int fg_power_get_property(struct power_supply *psy, val->intval = !!chip->bcl_lpm_disabled; break; case POWER_SUPPLY_PROP_SOC_REPORTING_READY: - val->intval = !!chip->profile_loaded; + val->intval = !!chip->soc_reporting_ready; break; case POWER_SUPPLY_PROP_IGNORE_FALSE_NEGATIVE_ISENSE: val->intval = !chip->allow_false_negative_isense; @@ -5156,6 +5157,7 @@ static irqreturn_t fg_batt_missing_irq_handler(int irq, void *_chip) fg_cap_learning_stop(chip); chip->battery_missing = true; chip->profile_loaded = false; + chip->soc_reporting_ready = false; chip->batt_type = default_batt_type; mutex_lock(&chip->cyc_ctr.lock); if (fg_debug_mask & FG_IRQS) @@ -6440,6 +6442,7 @@ static int fg_batt_profile_init(struct fg_chip *chip) chip->first_profile_loaded = true; chip->profile_loaded = true; + chip->soc_reporting_ready = true; chip->battery_missing = is_battery_missing(chip); update_chg_iterm(chip); update_cc_cv_setpoint(chip); @@ -6458,6 +6461,7 @@ static int fg_batt_profile_init(struct fg_chip *chip) complete_all(&chip->fg_reset_done); return rc; no_profile: + chip->soc_reporting_ready = true; if (chip->charging_disabled) { rc = set_prop_enable_charging(chip, true); if (rc) @@ -8323,6 +8327,7 @@ static void ima_error_recovery_work(struct work_struct *work) if (!chip->use_otp_profile) { chip->battery_missing = true; chip->profile_loaded = false; + chip->soc_reporting_ready = false; chip->batt_type = default_batt_type; fg_handle_battery_insertion(chip); } From 3f885d05258ce63eb1283d66aa200200acc82846 Mon Sep 17 00:00:00 2001 From: Kui Wang Date: Wed, 20 Apr 2016 14:04:32 +0800 Subject: [PATCH 0068/1015] ARM: dts: msm: include camera dtsi for 8917 TMO Include camera related device dtsi for msm8917 TMO project. Add flash device node. Correct power supply for rear sensor CRs-Fixed: 1060391 Change-Id: I48c8c71a168d0bfa06f3c66004d7620e08f0cd7d Signed-off-by: Kui Wang Signed-off-by: Lei Yuan --- .../dts/qcom/msm8917-camera-sensor-tmo.dtsi | 56 +++++++++++++------ arch/arm/boot/dts/qcom/msm8917-qgp-tmo.dtsi | 4 +- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi index c2b0f580dcd20..41b1f955108bd 100644 --- a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi @@ -10,6 +10,25 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8937_flash0>; + qcom,torch-source = <&pmi8937_torch0>; + qcom,switch-source = <&pmi8937_switch>; + }; +}; + +&pm8917_l22{ + regulator-max-microvolt = <2850000>; +}; + +&pm8917_l23{ + regulator-max-microvolt = <1600000>; +}; + &tlmm{ cam_sensor_rear_vreg_default: cam_sensor_rear_vreg_default { /* VDIG */ @@ -42,12 +61,12 @@ cam_sensor_front_vreg_default: cam_sensor_front_vreg_default { /* VDIG */ mux { - pins = "gpio96"; + pins = "gpio96","gpio68"; function = "gpio"; }; config { - pins = "gpio96"; + pins = "gpio96","gpio68"; bias-disable; /* No PULL */ drive-strength = <2>; /* 2 MA */ }; @@ -56,12 +75,12 @@ cam_sensor_front_vreg_sleep: cam_sensor_front_vreg_sleep { /* VDIG */ mux { - pins = "gpio96"; + pins = "gpio96","gpio68"; function = "gpio"; }; config { - pins = "gpio96"; + pins = "gpio96","gpio68"; bias-disable; /* No PULL */ drive-strength = <2>; /* 2 MA */ }; @@ -74,7 +93,7 @@ reg = <0x0>; compatible = "qcom,actuator"; qcom,cci-master = <0>; - cam_vaf-supply = <&pm8917_l17>; + cam_vaf-supply = <&pm8917_l22>; qcom,cam-vreg-name = "cam_vaf"; qcom,cam-vreg-min-voltage = <2850000>; qcom,cam-vreg-max-voltage = <2850000>; @@ -91,14 +110,12 @@ qcom,actuator-src = <&actuator0>; qcom,led-flash-src = <&led_flash0>; cam_vdig-supply = <&pm8917_l23>; - cam_vana-supply = <&pm8917_l22>; cam_vio-supply = <&pm8917_l6>; - cam_vaf-supply = <&pm8917_l17>; - qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", - "cam_vaf"; - qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-op-mode = <200000 0 80000 100000>; + cam_vaf-supply = <&pm8917_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 0 2850000>; + qcom,cam-vreg-max-voltage = <1200000 0 2850000>; + qcom,cam-vreg-op-mode = <200000 0 100000>; pinctrl-names = "cam_default", "cam_suspend"; pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default @@ -131,6 +148,7 @@ clocks = <&clock_gcc clk_mclk0_clk_src>, <&clock_gcc clk_gcc_camss_mclk0_clk>; clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; }; qcom,camera@2 { @@ -144,8 +162,8 @@ cam_vana-supply = <&pm8917_l22>; cam_vio-supply = <&pm8917_l6>; qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; - qcom,cam-vreg-min-voltage = <1200000 0 2800000>; - qcom,cam-vreg-max-voltage = <1200000 0 2800000>; + qcom,cam-vreg-min-voltage = <1500000 0 2800000>; + qcom,cam-vreg-max-voltage = <1500000 0 2800000>; qcom,cam-vreg-op-mode = <105000 0 80000>; qcom,gpio-no-mux = <0>; pinctrl-names = "cam_default", "cam_suspend"; @@ -158,15 +176,18 @@ gpios = <&tlmm 28 0>, <&tlmm 40 0>, <&tlmm 39 0>, + <&tlmm 68 0>, <&tlmm 96 0>; qcom,gpio-reset = <1>; qcom,gpio-standby = <2>; - qcom,gpio-vana = <3>; - qcom,gpio-req-tbl-num = <0 1 2 3>; - qcom,gpio-req-tbl-flags = <1 0 0 0>; + qcom,gpio-vio = <3>; + qcom,gpio-vana = <4>; + qcom,gpio-req-tbl-num = <0 1 2 3 4>; + qcom,gpio-req-tbl-flags = <1 0 0 0 0>; qcom,gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2", "CAM_STANDBY2", + "CAM_GPIO_VIO", "CAM_GPIO_VANA"; qcom,sensor-position = <1>; qcom,sensor-mode = <0>; @@ -174,5 +195,6 @@ clocks = <&clock_gcc clk_mclk2_clk_src>, <&clock_gcc clk_gcc_camss_mclk2_clk>; clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; }; }; diff --git a/arch/arm/boot/dts/qcom/msm8917-qgp-tmo.dtsi b/arch/arm/boot/dts/qcom/msm8917-qgp-tmo.dtsi index 2c095c9e4c772..efb73168a9e93 100644 --- a/arch/arm/boot/dts/qcom/msm8917-qgp-tmo.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-qgp-tmo.dtsi @@ -13,6 +13,7 @@ #include "msm-pmi8937.dtsi" #include "msm8917-qrd.dtsi" +#include "msm8917-camera-sensor-tmo.dtsi" #include "msm8937-mdss-panels.dtsi" &pmi_haptic { @@ -89,9 +90,6 @@ debounce-interval = <15>; }; }; - - led_flash0: qcom,camera-flash { - }; }; &mdss_mdp { From 53eeebe7b05a41bcfa1fca6636a0fc767f94ffbc Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Tue, 19 Jan 2016 21:35:15 +0000 Subject: [PATCH 0069/1015] BACKPORT: perf tools: Document the perf sysctls perf_event_paranoid was only documented in source code and a perf error message. Copy the documentation from the error message to Documentation/sysctl/kernel.txt. Conflicts: Documentation/sysctl/kernel.txt tools/perf/util/evsel.c Git-repo: https://android.googlesource.com/kernel/common.git Git-commit: b79154b8f7702f6e8a56ce9f1355f841cec16c37 Signed-off-by: Ben Hutchings Cc: Peter Zijlstra Cc: linux-doc@vger.kernel.org Link: http://lkml.kernel.org/r/20160119213515.GG2637@decadent.org.uk [ Remove reference to external Documentation file, provide info inline, as before ] Signed-off-by: Arnaldo Carvalho de Melo Bug: 29054680 Bug: 29119870 Signed-off-by: Dennis Cagle Change-Id: I13e73cfb2ad761c94762d0c8196df7725abdf5c5 (cherry picked from commit 746938f9d97d74f6c2833a0ede49506bdfcd89e4) --- Documentation/sysctl/kernel.txt | 41 +++++++++++++++++++++------------ tools/perf/util/evsel.c | 15 +++++++----- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index 6c98ffa61d8fa..6498686b588de 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt @@ -56,8 +56,9 @@ show up in /proc/sys/kernel: - overflowuid - panic - panic_on_oops -- panic_on_unrecovered_nmi - panic_on_stackoverflow +- panic_on_unrecovered_nmi +- perf_event_paranoid - pid_max - powersave-nap [ PPC only ] - printk @@ -552,19 +553,6 @@ the recommended setting is 60. ============================================================== -panic_on_unrecovered_nmi: - -The default Linux behaviour on an NMI of either memory or unknown is -to continue operation. For many environments such as scientific -computing it is preferable that the box is taken out and the error -dealt with than an uncorrected parity/ECC error get propagated. - -A small number of systems do generate NMI's for bizarre random reasons -such as power management so the default is off. That sysctl works like -the existing panic controls already in that directory. - -============================================================== - panic_on_oops: Controls the kernel's behaviour when an oops or BUG is encountered. @@ -584,7 +572,6 @@ This file shows up if CONFIG_DEBUG_STACKOVERFLOW is enabled. 0: try to continue operation. -1: panic immediately. ============================================================== @@ -614,6 +601,30 @@ allowed to execute. ============================================================== +panic_on_unrecovered_nmi: + +The default Linux behaviour on an NMI of either memory or unknown is +to continue operation. For many environments such as scientific +computing it is preferable that the box is taken out and the error +dealt with than an uncorrected parity/ECC error get propagated. + +A small number of systems do generate NMI's for bizarre random reasons +such as power management so the default is off. That sysctl works like +the existing panic controls already in that directory. + +============================================================== + +perf_event_paranoid: + +Controls use of the performance events system by unprivileged +users (without CAP_SYS_ADMIN). The default value is 1. + + -1: Allow use of (almost) all events by all users +>=0: Disallow raw tracepoint access by users without CAP_IOC_LOCK +>=1: Disallow CPU event access by users without CAP_SYS_ADMIN +>=2: Disallow kernel profiling by users without CAP_SYS_ADMIN + +============================================================== pid_max: diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 2f9e68025ede6..02333234a0960 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -2067,12 +2067,15 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target, case EPERM: case EACCES: return scnprintf(msg, size, - "You may not have permission to collect %sstats.\n" - "Consider tweaking /proc/sys/kernel/perf_event_paranoid:\n" - " -1 - Not paranoid at all\n" - " 0 - Disallow raw tracepoint access for unpriv\n" - " 1 - Disallow cpu events for unpriv\n" - " 2 - Disallow kernel profiling for unpriv", + "You may not have permission to collect %sstats.\n\n" + "Consider tweaking /proc/sys/kernel/perf_event_paranoid,\n" + "which controls use of the performance events system by\n" + "unprivileged users (without CAP_SYS_ADMIN).\n\n" + "The default value is 1:\n\n" + " -1: Allow use of (almost) all events by all users\n" + ">= 0: Disallow raw tracepoint access by users without CAP_IOC_LOCK\n" + ">= 1: Disallow CPU event access by users without CAP_SYS_ADMIN\n" + ">= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN", target->system_wide ? "system-wide " : ""); case ENOENT: return scnprintf(msg, size, "The %s event is not supported.", From 615c99f6394017cba0cedb4342327e1491c77141 Mon Sep 17 00:00:00 2001 From: Jeff Vander Stoep Date: Sun, 29 May 2016 14:22:32 -0700 Subject: [PATCH 0070/1015] FROMLIST: security,perf: Allow further restriction of perf_event_open When kernel.perf_event_open is set to 3 (or greater), disallow all access to performance events by users without CAP_SYS_ADMIN. Add a Kconfig symbol CONFIG_SECURITY_PERF_EVENTS_RESTRICT that makes this value the default. This is based on a similar feature in grsecurity (CONFIG_GRKERNSEC_PERF_HARDEN). This version doesn't include making the variable read-only. It also allows enabling further restriction at run-time regardless of whether the default is changed. https://lkml.org/lkml/2016/1/11/587 Conflicts: kernel/events/core.c Git-repo: https://android.googlesource.com/kernel/common.git Git-commit: 012b0adcf7299f6509d4984cf46ee11e6eaed4e4 Signed-off-by: Ben Hutchings Signed-off-by: Dennis Cagle Bug: 29054680 Bug: 29119870 Change-Id: Iff5bff4fc1042e85866df9faa01bce8d04335ab8 (cherry picked from commit f16929ac8586f37949c638c738a6f0de969ed1ea) --- Documentation/sysctl/kernel.txt | 4 +++- include/linux/perf_event.h | 5 +++++ kernel/events/core.c | 6 ++++++ security/Kconfig | 9 +++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index 6498686b588de..ad67729df395a 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt @@ -617,12 +617,14 @@ the existing panic controls already in that directory. perf_event_paranoid: Controls use of the performance events system by unprivileged -users (without CAP_SYS_ADMIN). The default value is 1. +users (without CAP_SYS_ADMIN). The default value is 3 if +CONFIG_SECURITY_PERF_EVENTS_RESTRICT is set, or 1 otherwise. -1: Allow use of (almost) all events by all users >=0: Disallow raw tracepoint access by users without CAP_IOC_LOCK >=1: Disallow CPU event access by users without CAP_SYS_ADMIN >=2: Disallow kernel profiling by users without CAP_SYS_ADMIN +>=3: Disallow all event access by users without CAP_SYS_ADMIN ============================================================== diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 5627a26a2435e..120719973b7fb 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -753,6 +753,11 @@ extern int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write, loff_t *ppos); +static inline bool perf_paranoid_any(void) +{ + return sysctl_perf_event_paranoid > 2; +} + static inline bool perf_paranoid_tracepoint_raw(void) { return sysctl_perf_event_paranoid > -1; diff --git a/kernel/events/core.c b/kernel/events/core.c index 7ee39bfa1ce01..0b09d3967d75d 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -171,9 +171,12 @@ static struct srcu_struct pmus_srcu; * 0 - disallow raw tracepoint access for unpriv * 1 - disallow cpu events for unpriv * 2 - disallow kernel profiling for unpriv + * 3 - disallow all unpriv perf event use */ #ifdef CONFIG_PERF_EVENTS_USERMODE int sysctl_perf_event_paranoid __read_mostly = -1; +#elif defined CONFIG_SECURITY_PERF_EVENTS_RESTRICT +int sysctl_perf_event_paranoid __read_mostly = 3; #else int sysctl_perf_event_paranoid __read_mostly = 1; #endif @@ -7311,6 +7314,9 @@ SYSCALL_DEFINE5(perf_event_open, if (flags & ~PERF_FLAG_ALL) return -EINVAL; + if (perf_paranoid_any() && !capable(CAP_SYS_ADMIN)) + return -EACCES; + err = perf_copy_attr(attr_uptr, &attr); if (err) return err; diff --git a/security/Kconfig b/security/Kconfig index 3a5ffac8c91db..263e25b1cec0a 100644 --- a/security/Kconfig +++ b/security/Kconfig @@ -23,6 +23,15 @@ config SECURITY_DMESG_RESTRICT If you are unsure how to answer this question, answer N. +config SECURITY_PERF_EVENTS_RESTRICT + bool "Restrict unprivileged use of performance events" + depends on PERF_EVENTS + help + If you say Y here, the kernel.perf_event_paranoid sysctl + will be set to 3 by default, and no unprivileged use of the + perf_event_open syscall will be permitted unless it is + changed. + config SECURITY bool "Enable different security models" depends on SYSFS From 8d32d61f74df97752eb9cc2b656bbe80c4c2ca14 Mon Sep 17 00:00:00 2001 From: Charan Teja Reddy Date: Thu, 8 Sep 2016 20:47:55 +0530 Subject: [PATCH 0071/1015] coresight: fix the dangling pointer issues on coresight Fix the dangling pointer issues on CoreSight that can cause kernel panic. Change-Id: If3abe89bf0326230c29a49d293ab22ebcec93076 Signed-off-by: Charan Teja Reddy --- drivers/coresight/coresight-csr.c | 7 ++++--- drivers/coresight/coresight-fuse.c | 7 ++++--- drivers/soc/qcom/jtag-fuse.c | 6 +++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/coresight/coresight-csr.c b/drivers/coresight/coresight-csr.c index 390f8791386d5..3f8f8771b0bf5 100644 --- a/drivers/coresight/coresight-csr.c +++ b/drivers/coresight/coresight-csr.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2013, 2015 The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2013, 2015-2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -190,8 +190,6 @@ static int csr_probe(struct platform_device *pdev) drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; - /* Store the driver data pointer for use in exported functions */ - csrdrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); @@ -220,6 +218,9 @@ static int csr_probe(struct platform_device *pdev) if (IS_ERR(drvdata->csdev)) return PTR_ERR(drvdata->csdev); + /* Store the driver data pointer for use in exported functions */ + csrdrvdata = drvdata; + dev_info(dev, "CSR initialized\n"); return 0; } diff --git a/drivers/coresight/coresight-fuse.c b/drivers/coresight/coresight-fuse.c index 70e6136a55c53..f146dfb2b0fba 100644 --- a/drivers/coresight/coresight-fuse.c +++ b/drivers/coresight/coresight-fuse.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -303,8 +303,6 @@ static int fuse_probe(struct platform_device *pdev) drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; - /* Store the driver data pointer for use in exported functions */ - fusedrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); @@ -368,6 +366,9 @@ static int fuse_probe(struct platform_device *pdev) if (IS_ERR(drvdata->csdev)) return PTR_ERR(drvdata->csdev); + /* Store the driver data pointer for use in exported functions */ + fusedrvdata = drvdata; + dev_info(dev, "Fuse initialized\n"); return 0; } diff --git a/drivers/soc/qcom/jtag-fuse.c b/drivers/soc/qcom/jtag-fuse.c index 46de4e5f2026e..d7389f397b9ce 100644 --- a/drivers/soc/qcom/jtag-fuse.c +++ b/drivers/soc/qcom/jtag-fuse.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -152,8 +152,6 @@ static int jtag_fuse_probe(struct platform_device *pdev) drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; - /* Store the driver data pointer for use in exported functions */ - fusedrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); @@ -174,6 +172,8 @@ static int jtag_fuse_probe(struct platform_device *pdev) if (!drvdata->base) return -ENOMEM; + /* Store the driver data pointer for use in exported functions */ + fusedrvdata = drvdata; dev_info(dev, "JTag Fuse initialized\n"); return 0; } From 312b1dabe1db14f4c9f0a39ec08cde606bbed148 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 16 Jun 2016 15:48:57 +0100 Subject: [PATCH 0072/1015] KEYS: potential uninitialized variable If __key_link_begin() failed then "edit" would be uninitialized. I've added a check to fix that. This allows a random user to crash the kernel, though it's quite difficult to achieve. There are three ways it can be done as the user would have to cause an error to occur in __key_link(): (1) Cause the kernel to run out of memory. In practice, this is difficult to achieve without ENOMEM cropping up elsewhere and aborting the attempt. (2) Revoke the destination keyring between the keyring ID being looked up and it being tested for revocation. In practice, this is difficult to time correctly because the KEYCTL_REJECT function can only be used from the request-key upcall process. Further, users can only make use of what's in /sbin/request-key.conf, though this does including a rejection debugging test - which means that the destination keyring has to be the caller's session keyring in practice. (3) Have just enough key quota available to create a key, a new session keyring for the upcall and a link in the session keyring, but not then sufficient quota to create a link in the nominated destination keyring so that it fails with EDQUOT. The bug can be triggered using option (3) above using something like the following: echo 80 >/proc/sys/kernel/keys/root_maxbytes keyctl request2 user debug:fred negate @t The above sets the quota to something much lower (80) to make the bug easier to trigger, but this is dependent on the system. Note also that the name of the keyring created contains a random number that may be between 1 and 10 characters in size, so may throw the test off by changing the amount of quota used. Assuming the failure occurs, something like the following will be seen: kfree_debugcheck: out of range ptr 6b6b6b6b6b6b6b68h ------------[ cut here ]------------ kernel BUG at ../mm/slab.c:2821! ... RIP: 0010:[] kfree_debugcheck+0x20/0x25 RSP: 0018:ffff8804014a7de8 EFLAGS: 00010092 RAX: 0000000000000034 RBX: 6b6b6b6b6b6b6b68 RCX: 0000000000000000 RDX: 0000000000040001 RSI: 00000000000000f6 RDI: 0000000000000300 RBP: ffff8804014a7df0 R08: 0000000000000001 R09: 0000000000000000 R10: ffff8804014a7e68 R11: 0000000000000054 R12: 0000000000000202 R13: ffffffff81318a66 R14: 0000000000000000 R15: 0000000000000001 ... Call Trace: kfree+0xde/0x1bc assoc_array_cancel_edit+0x1f/0x36 __key_link_end+0x55/0x63 key_reject_and_link+0x124/0x155 keyctl_reject_key+0xb6/0xe0 keyctl_negate_key+0x10/0x12 SyS_keyctl+0x9f/0xe7 do_syscall_64+0x63/0x13a entry_SYSCALL64_slow_path+0x25/0x25 Fixes: f70e2e06196a ('KEYS: Do preallocation for __key_link()') Signed-off-by: Dan Carpenter Signed-off-by: David Howells cc: stable@vger.kernel.org Signed-off-by: Linus Torvalds Signed-off-by: Dennis Cagle Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 38327424b40bcebe2de92d07312c89360ac9229a (cherry picked from commit 38327424b40bcebe2de92d07312c89360ac9229a) Change-Id: I07568c78448b9d4bcc19b506ac0cbeb3d8af6961 --- security/keys/key.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security/keys/key.c b/security/keys/key.c index e17ba6aefdc08..f8bde20bed5da 100644 --- a/security/keys/key.c +++ b/security/keys/key.c @@ -580,7 +580,7 @@ int key_reject_and_link(struct key *key, mutex_unlock(&key_construction_mutex); - if (keyring) + if (keyring && link_ret == 0) __key_link_end(keyring, &key->index_key, edit); /* wake up anyone waiting for a key to be constructed */ From be819a46d94c90bbf2e28a303e5455973a41fa92 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Tue, 22 Mar 2016 18:02:52 +0100 Subject: [PATCH 0073/1015] netfilter: x_tables: fix unconditional helper Ben Hawkes says: In the mark_source_chains function (net/ipv4/netfilter/ip_tables.c) it is possible for a user-supplied ipt_entry structure to have a large next_offset field. This field is not bounds checked prior to writing a counter value at the supplied offset. Problem is that mark_source_chains should not have been called -- the rule doesn't have a next entry, so its supposed to return an absolute verdict of either ACCEPT or DROP. However, the function conditional() doesn't work as the name implies. It only checks that the rule is using wildcard address matching. However, an unconditional rule must also not be using any matches (no -m args). The underflow validator only checked the addresses, therefore passing the 'unconditional absolute verdict' test, while mark_source_chains also tested for presence of matches, and thus proceeeded to the next (not-existent) rule. Unify this so that all the callers have same idea of 'unconditional rule'. Reported-by: Ben Hawkes Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Dennis Cagle Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 54d83fc74aa9ec72794373cb47432c5f7fb1a309 (cherry picked from commit 54d83fc74aa9ec72794373cb47432c5f7fb1a309) Change-Id: I425228695bd50751476ac6032f10e3b927825f35 --- net/ipv4/netfilter/arp_tables.c | 18 +++++++++--------- net/ipv4/netfilter/ip_tables.c | 23 +++++++++++------------ net/ipv6/netfilter/ip6_tables.c | 23 +++++++++++------------ 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index f95b6f93814b9..a12e24856cc7d 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c @@ -355,11 +355,12 @@ unsigned int arpt_do_table(struct sk_buff *skb, } /* All zeroes == unconditional rule. */ -static inline bool unconditional(const struct arpt_arp *arp) +static inline bool unconditional(const struct arpt_entry *e) { static const struct arpt_arp uncond; - return memcmp(arp, &uncond, sizeof(uncond)) == 0; + return e->target_offset == sizeof(struct arpt_entry) && + memcmp(&e->arp, &uncond, sizeof(uncond)) == 0; } /* Figures out from what hook each rule can be called: returns 0 if @@ -398,11 +399,10 @@ static int mark_source_chains(const struct xt_table_info *newinfo, |= ((1 << hook) | (1 << NF_ARP_NUMHOOKS)); /* Unconditional return/END. */ - if ((e->target_offset == sizeof(struct arpt_entry) && + if ((unconditional(e) && (strcmp(t->target.u.user.name, XT_STANDARD_TARGET) == 0) && - t->verdict < 0 && unconditional(&e->arp)) || - visited) { + t->verdict < 0) || visited) { unsigned int oldpos, size; if ((strcmp(t->target.u.user.name, @@ -547,7 +547,7 @@ static bool check_underflow(const struct arpt_entry *e) const struct xt_entry_target *t; unsigned int verdict; - if (!unconditional(&e->arp)) + if (!unconditional(e)) return false; t = arpt_get_target_c(e); if (strcmp(t->u.user.name, XT_STANDARD_TARGET) != 0) @@ -588,9 +588,9 @@ static inline int check_entry_size_and_hooks(struct arpt_entry *e, newinfo->hook_entry[h] = hook_entries[h]; if ((unsigned char *)e - base == underflows[h]) { if (!check_underflow(e)) { - pr_err("Underflows must be unconditional and " - "use the STANDARD target with " - "ACCEPT/DROP\n"); + pr_debug("Underflows must be unconditional and " + "use the STANDARD target with " + "ACCEPT/DROP\n"); return -EINVAL; } newinfo->underflow[h] = underflows[h]; diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 99e810f84671b..4636fd3ff49f0 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c @@ -168,11 +168,12 @@ get_entry(const void *base, unsigned int offset) /* All zeroes == unconditional rule. */ /* Mildly perf critical (only if packet tracing is on) */ -static inline bool unconditional(const struct ipt_ip *ip) +static inline bool unconditional(const struct ipt_entry *e) { static const struct ipt_ip uncond; - return memcmp(ip, &uncond, sizeof(uncond)) == 0; + return e->target_offset == sizeof(struct ipt_entry) && + memcmp(&e->ip, &uncond, sizeof(uncond)) == 0; #undef FWINV } @@ -229,11 +230,10 @@ get_chainname_rulenum(const struct ipt_entry *s, const struct ipt_entry *e, } else if (s == e) { (*rulenum)++; - if (s->target_offset == sizeof(struct ipt_entry) && + if (unconditional(s) && strcmp(t->target.u.kernel.target->name, XT_STANDARD_TARGET) == 0 && - t->verdict < 0 && - unconditional(&s->ip)) { + t->verdict < 0) { /* Tail of chains: STANDARD target (return/policy) */ *comment = *chainname == hookname ? comments[NF_IP_TRACE_COMMENT_POLICY] @@ -472,11 +472,10 @@ mark_source_chains(const struct xt_table_info *newinfo, e->comefrom |= ((1 << hook) | (1 << NF_INET_NUMHOOKS)); /* Unconditional return/END. */ - if ((e->target_offset == sizeof(struct ipt_entry) && + if ((unconditional(e) && (strcmp(t->target.u.user.name, XT_STANDARD_TARGET) == 0) && - t->verdict < 0 && unconditional(&e->ip)) || - visited) { + t->verdict < 0) || visited) { unsigned int oldpos, size; if ((strcmp(t->target.u.user.name, @@ -709,7 +708,7 @@ static bool check_underflow(const struct ipt_entry *e) const struct xt_entry_target *t; unsigned int verdict; - if (!unconditional(&e->ip)) + if (!unconditional(e)) return false; t = ipt_get_target_c(e); if (strcmp(t->u.user.name, XT_STANDARD_TARGET) != 0) @@ -751,9 +750,9 @@ check_entry_size_and_hooks(struct ipt_entry *e, newinfo->hook_entry[h] = hook_entries[h]; if ((unsigned char *)e - base == underflows[h]) { if (!check_underflow(e)) { - pr_err("Underflows must be unconditional and " - "use the STANDARD target with " - "ACCEPT/DROP\n"); + pr_debug("Underflows must be unconditional and " + "use the STANDARD target with " + "ACCEPT/DROP\n"); return -EINVAL; } newinfo->underflow[h] = underflows[h]; diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index e080fbbbc0e5c..415f1f027374a 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c @@ -195,11 +195,12 @@ get_entry(const void *base, unsigned int offset) /* All zeroes == unconditional rule. */ /* Mildly perf critical (only if packet tracing is on) */ -static inline bool unconditional(const struct ip6t_ip6 *ipv6) +static inline bool unconditional(const struct ip6t_entry *e) { static const struct ip6t_ip6 uncond; - return memcmp(ipv6, &uncond, sizeof(uncond)) == 0; + return e->target_offset == sizeof(struct ip6t_entry) && + memcmp(&e->ipv6, &uncond, sizeof(uncond)) == 0; } static inline const struct xt_entry_target * @@ -255,11 +256,10 @@ get_chainname_rulenum(const struct ip6t_entry *s, const struct ip6t_entry *e, } else if (s == e) { (*rulenum)++; - if (s->target_offset == sizeof(struct ip6t_entry) && + if (unconditional(s) && strcmp(t->target.u.kernel.target->name, XT_STANDARD_TARGET) == 0 && - t->verdict < 0 && - unconditional(&s->ipv6)) { + t->verdict < 0) { /* Tail of chains: STANDARD target (return/policy) */ *comment = *chainname == hookname ? comments[NF_IP6_TRACE_COMMENT_POLICY] @@ -482,11 +482,10 @@ mark_source_chains(const struct xt_table_info *newinfo, e->comefrom |= ((1 << hook) | (1 << NF_INET_NUMHOOKS)); /* Unconditional return/END. */ - if ((e->target_offset == sizeof(struct ip6t_entry) && + if ((unconditional(e) && (strcmp(t->target.u.user.name, XT_STANDARD_TARGET) == 0) && - t->verdict < 0 && - unconditional(&e->ipv6)) || visited) { + t->verdict < 0) || visited) { unsigned int oldpos, size; if ((strcmp(t->target.u.user.name, @@ -720,7 +719,7 @@ static bool check_underflow(const struct ip6t_entry *e) const struct xt_entry_target *t; unsigned int verdict; - if (!unconditional(&e->ipv6)) + if (!unconditional(e)) return false; t = ip6t_get_target_c(e); if (strcmp(t->u.user.name, XT_STANDARD_TARGET) != 0) @@ -762,9 +761,9 @@ check_entry_size_and_hooks(struct ip6t_entry *e, newinfo->hook_entry[h] = hook_entries[h]; if ((unsigned char *)e - base == underflows[h]) { if (!check_underflow(e)) { - pr_err("Underflows must be unconditional and " - "use the STANDARD target with " - "ACCEPT/DROP\n"); + pr_debug("Underflows must be unconditional and " + "use the STANDARD target with " + "ACCEPT/DROP\n"); return -EINVAL; } newinfo->underflow[h] = underflows[h]; From c35046268359cbd26dbd18af959a3ef0d19b2a02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= Date: Mon, 7 Mar 2016 21:15:36 +0100 Subject: [PATCH 0074/1015] cdc_ncm: do not call usbnet_link_change from cdc_ncm_bind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit usbnet_link_change will call schedule_work and should be avoided if bind is failing. Otherwise we will end up with scheduled work referring to a netdev which has gone away. Instead of making the call conditional, we can just defer it to usbnet_probe, using the driver_info flag made for this purpose. Conflicts: drivers/net/usb/cdc_ncm.c Fixes: 8a34b0ae8778 ("usbnet: cdc_ncm: apply usbnet_link_change") Reported-by: Andrey Konovalov Suggested-by: Linus Torvalds Signed-off-by: Bjørn Mork Signed-off-by: David S. Miller Signed-off-by: Dennis Cagle Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 4d06dd537f95683aba3651098ae288b7cbff8274 (cherry picked from commit 4d06dd537f95683aba3651098ae288b7cbff8274) Change-Id: I0052ab287e40bac491a55f324eca4917cf9980ae --- drivers/net/usb/cdc_ncm.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index 8067b8fbb0eea..ba31ecde1f72d 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c @@ -948,23 +948,15 @@ EXPORT_SYMBOL_GPL(cdc_ncm_select_altsetting); static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf) { - int ret; - /* MBIM backwards compatible function? */ if (cdc_ncm_select_altsetting(intf) != CDC_NCM_COMM_ALTSETTING_NCM) return -ENODEV; - /* The NCM data altsetting is fixed */ - ret = cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM); - - /* - * We should get an event when network connection is "connected" or - * "disconnected". Set network connection in "disconnected" state - * (carrier is OFF) during attach, so the IP network stack does not - * start IPv6 negotiation and more. + /* The NCM data altsetting is fixed, so we hard-coded it. + * Additionally, generic NCM devices are assumed to accept arbitrarily + * placed NDP. */ - usbnet_link_change(dev, 0, 0); - return ret; + return cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM); } static void cdc_ncm_align_tail(struct sk_buff *skb, size_t modulus, size_t remainder, size_t max) @@ -1506,7 +1498,8 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb) static const struct driver_info cdc_ncm_info = { .description = "CDC NCM", - .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET, + .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET + | FLAG_LINK_INTR, .bind = cdc_ncm_bind, .unbind = cdc_ncm_unbind, .manage_power = usbnet_manage_power, @@ -1519,7 +1512,7 @@ static const struct driver_info cdc_ncm_info = { static const struct driver_info wwan_info = { .description = "Mobile Broadband Network Device", .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET - | FLAG_WWAN, + | FLAG_LINK_INTR | FLAG_WWAN, .bind = cdc_ncm_bind, .unbind = cdc_ncm_unbind, .manage_power = usbnet_manage_power, @@ -1532,7 +1525,7 @@ static const struct driver_info wwan_info = { static const struct driver_info wwan_noarp_info = { .description = "Mobile Broadband Network Device (NO ARP)", .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET - | FLAG_WWAN | FLAG_NOARP, + | FLAG_LINK_INTR | FLAG_WWAN | FLAG_NOARP, .bind = cdc_ncm_bind, .unbind = cdc_ncm_unbind, .manage_power = usbnet_manage_power, From f64e13b9a5ff6747d533a037a06f298aa1078191 Mon Sep 17 00:00:00 2001 From: David Howells Date: Wed, 5 Aug 2015 12:54:46 +0100 Subject: [PATCH 0075/1015] ASN.1: Fix non-match detection failure on data overrun If the ASN.1 decoder is asked to parse a sequence of objects, non-optional matches get skipped if there's no more data to be had rather than a data-overrun error being reported. This is due to the code segment that decides whether to skip optional matches (ie. matches that could get ignored because an element is marked OPTIONAL in the grammar) due to a lack of data also skips non-optional elements if the data pointer has reached the end of the buffer. This can be tested with the data decoder for the new RSA akcipher algorithm that takes three non-optional integers. Currently, it skips the last integer if there is insufficient data. Without the fix, #defining DEBUG in asn1_decoder.c will show something like: next_op: pc=0/13 dp=0/270 C=0 J=0 - match? 30 30 00 - TAG: 30 266 CONS next_op: pc=2/13 dp=4/270 C=1 J=0 - match? 02 02 00 - TAG: 02 257 - LEAF: 257 next_op: pc=5/13 dp=265/270 C=1 J=0 - match? 02 02 00 - TAG: 02 3 - LEAF: 3 next_op: pc=8/13 dp=270/270 C=1 J=0 next_op: pc=11/13 dp=270/270 C=1 J=0 - end cons t=4 dp=270 l=270/270 The next_op line for pc=8/13 should be followed by a match line. This is not exploitable for X.509 certificates by means of shortening the message and fixing up the ASN.1 CONS tags because: (1) The relevant records being built up are cleared before use. (2) If the message is shortened sufficiently to remove the public key, the ASN.1 parse of the RSA key will fail quickly due to a lack of data. (3) Extracted signature data is either turned into MPIs (which cope with a 0 length) or is simpler integers specifying algoritms and suchlike (which can validly be 0); and (4) The AKID and SKID extensions are optional and their removal is handled without risking passing a NULL to asymmetric_key_generate_id(). (5) If the certificate is truncated sufficiently to remove the subject, issuer or serialNumber then the ASN.1 decoder will fail with a 'Cons stack underflow' return. This is not exploitable for PKCS#7 messages by means of removal of elements from such a message from the tail end of a sequence: (1) Any shortened X.509 certs embedded in the PKCS#7 message are survivable as detailed above. (2) The message digest content isn't used if it shows a NULL pointer, similarly, the authattrs aren't used if that shows a NULL pointer. (3) A missing signature results in a NULL MPI - which the MPI routines deal with. (4) If data is NULL, it is expected that the message has detached content and that is handled appropriately. (5) If the serialNumber is excised, the unconditional action associated with it will pick up the containing SEQUENCE instead, so no NULL pointer will be seen here. If both the issuer and the serialNumber are excised, the ASN.1 decode will fail with an 'Unexpected tag' return. In either case, there's no way to get to asymmetric_key_generate_id() with a NULL pointer. (6) Other fields are decoded to simple integers. Shortening the message to omit an algorithm ID field will cause checks on this to fail early in the verification process. This can also be tested by snipping objects off of the end of the ASN.1 stream such that mandatory tags are removed - or even from the end of internal SEQUENCEs. If any mandatory tag is missing, the error EBADMSG *should* be produced. Without this patch ERANGE or ENOPKG might be produced or the parse may apparently succeed, perhaps with ENOKEY or EKEYREJECTED being produced later, depending on what gets snipped. Just snipping off the final BIT_STRING or OCTET_STRING from either sample should be a start since both are mandatory and neither will cause an EBADMSG without the patches Conflicts: lib/asn1_decoder.c Reported-by: Marcel Holtmann Signed-off-by: David Howells Tested-by: Marcel Holtmann Reviewed-by: David Woodhouse Signed-off-by: Dennis Cagle Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 0d62e9dd6da45bbf0f33a8617afc5fe774c8f45f (cherry picked from commit 0d62e9dd6da45bbf0f33a8617afc5fe774c8f45f) Change-Id: I8869c1b4ea4982a00836723c6a71d8d0668f0252 --- lib/asn1_decoder.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/asn1_decoder.c b/lib/asn1_decoder.c index 1a000bb050f9f..d60ce8a536503 100644 --- a/lib/asn1_decoder.c +++ b/lib/asn1_decoder.c @@ -208,9 +208,8 @@ int asn1_ber_decoder(const struct asn1_decoder *decoder, unsigned char tmp; /* Skip conditional matches if possible */ - if ((op & ASN1_OP_MATCH__COND && - flags & FLAG_MATCHED) || - dp == datalen) { + if ((op & ASN1_OP_MATCH__COND && flags & FLAG_MATCHED) || + (op & ASN1_OP_MATCH__SKIP && dp == datalen)) { pc += asn1_op_lengths[op]; goto next_op; } From 49dd7fff5c8261bcfee5bb41a35c16885240b9f3 Mon Sep 17 00:00:00 2001 From: AnilKumar Chimata Date: Wed, 31 Aug 2016 14:08:16 +0530 Subject: [PATCH 0076/1015] qcedev: Validate Source and Destination addresses Source and Destination addresses passed by user space apps/clients are validated independent of type of operation to mitigate kernel address space exploitation. Change-Id: I9ecb0103d7a73eedb2e0d1db1d5613b18dd77e59 Signed-off-by: AnilKumar Chimata --- drivers/crypto/msm/qcedev.c | 68 ++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index e63f061175adb..1402d3ded9843 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -1234,44 +1234,6 @@ static int qcedev_vbuf_ablk_cipher(struct qcedev_async_req *areq, struct qcedev_cipher_op_req *saved_req; struct qcedev_cipher_op_req *creq = &areq->cipher_op_req; - /* Verify Source Address's */ - for (i = 0; i < areq->cipher_op_req.entries; i++) - if (!access_ok(VERIFY_READ, - (void __user *)areq->cipher_op_req.vbuf.src[i].vaddr, - areq->cipher_op_req.vbuf.src[i].len)) - return -EFAULT; - - /* Verify Destination Address's */ - if (creq->in_place_op != 1) { - for (i = 0, total = 0; i < QCEDEV_MAX_BUFFERS; i++) { - if ((areq->cipher_op_req.vbuf.dst[i].vaddr != 0) && - (total < creq->data_len)) { - if (!access_ok(VERIFY_WRITE, - (void __user *)creq->vbuf.dst[i].vaddr, - creq->vbuf.dst[i].len)) { - pr_err("%s:DST WR_VERIFY err %d=0x%lx\n", - __func__, i, (uintptr_t) - creq->vbuf.dst[i].vaddr); - return -EFAULT; - } - total += creq->vbuf.dst[i].len; - } - } - } else { - for (i = 0, total = 0; i < creq->entries; i++) { - if (total < creq->data_len) { - if (!access_ok(VERIFY_WRITE, - (void __user *)creq->vbuf.src[i].vaddr, - creq->vbuf.src[i].len)) { - pr_err("%s:SRC WR_VERIFY err %d=0x%lx\n", - __func__, i, (uintptr_t) - creq->vbuf.src[i].vaddr); - return -EFAULT; - } - total += creq->vbuf.src[i].len; - } - } - } total = 0; if (areq->cipher_op_req.mode == QCEDEV_AES_MODE_CTR) @@ -1569,6 +1531,36 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, __func__, total, req->data_len); goto error; } + /* Verify Source Address's */ + for (i = 0, total = 0; i < req->entries; i++) { + if (total < req->data_len) { + if (!access_ok(VERIFY_READ, + (void __user *)req->vbuf.src[i].vaddr, + req->vbuf.src[i].len)) { + pr_err("%s:SRC RD_VERIFY err %d=0x%lx\n", + __func__, i, (uintptr_t) + req->vbuf.src[i].vaddr); + goto error; + } + total += req->vbuf.src[i].len; + } + } + + /* Verify Destination Address's */ + for (i = 0, total = 0; i < QCEDEV_MAX_BUFFERS; i++) { + if ((req->vbuf.dst[i].vaddr != 0) && + (total < req->data_len)) { + if (!access_ok(VERIFY_WRITE, + (void __user *)req->vbuf.dst[i].vaddr, + req->vbuf.dst[i].len)) { + pr_err("%s:DST WR_VERIFY err %d=0x%lx\n", + __func__, i, (uintptr_t) + req->vbuf.dst[i].vaddr); + goto error; + } + total += req->vbuf.dst[i].len; + } + } return 0; error: return -EINVAL; From c5f3ac1013172715d98adba855ed86b4cbe53272 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Fri, 9 Sep 2016 14:54:47 +0530 Subject: [PATCH 0077/1015] ARM: dts: msm: update APC CPR voltage margins for msm8917pro Update APC CPR static open-loop and closed-loop voltage margins for msm8917pro as per voltage characterization results. CRs-Fixed: 1065053 Change-Id: Ie1fa6e7eaff4a2afcc772462848195814723f48b Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8917-regulator.dtsi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi index 484ee3dd95f96..e7d66affb6ce8 100644 --- a/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi @@ -538,6 +538,7 @@ qcom,pvs-version-fuse-sel = <37 40 3 0>; /* foundry */ qcom,cpr-fuse-version-map = < 1 0 3 (-1) (-1) (-1)>, + < 1 5 3 (-1) (-1) (-1)>, <(-1) 0 1 (-1) (-1) (-1)>, <(-1) 0 2 (-1) (-1) (-1)>, <(-1) 5 1 (-1) (-1) (-1)>, @@ -545,6 +546,7 @@ <(-1) (-1) (-1) (-1) (-1) (-1)>; qcom,cpr-quotient-adjustment = <50 40 50>, + <0 0 40>, <50 40 100>, <50 40 50>, <0 0 100>, @@ -552,6 +554,7 @@ <0 0 0>; qcom,cpr-init-voltage-adjustment = <30000 5000 10000>, + <0 0 0>, <30000 5000 35000>, <30000 5000 10000>, <0 0 20000>, From 54b4e822e57ea2e89bd239d1835bd1c49f8f08b4 Mon Sep 17 00:00:00 2001 From: Girish Mahadevan Date: Wed, 1 Apr 2015 10:26:28 -0600 Subject: [PATCH 0078/1015] msm: msm_bus: Add support for multiple ops in rules engine Rules engine enables implementing SoC level workaround for system performance issues allowing users to define these workaround rules. Currently the rules only allow homogenous comparison operations against a singular threshold. Expanding this to allow heterogenous comparison operations against multiple thresholds thus allowing definition of more complicated rules. Change-Id: I51a31376e8368931552aecfc82e6cc43e4b18b1e Signed-off-by: Girish Mahadevan Signed-off-by: Kiran Gunda --- .../bindings/arm/msm/msm_bus_rules.txt | 31 +-- .../platform/msm/msm_bus/msm_bus_of_adhoc.c | 89 ++++++-- drivers/platform/msm/msm_bus/msm_bus_rules.c | 191 +++++++++++------- include/dt-bindings/msm/msm-bus-rule-ops.h | 6 +- include/linux/msm_bus_rules.h | 10 +- 5 files changed, 211 insertions(+), 116 deletions(-) diff --git a/Documentation/devicetree/bindings/arm/msm/msm_bus_rules.txt b/Documentation/devicetree/bindings/arm/msm/msm_bus_rules.txt index b68284c8970d2..ed1b9bba50b68 100644 --- a/Documentation/devicetree/bindings/arm/msm/msm_bus_rules.txt +++ b/Documentation/devicetree/bindings/arm/msm/msm_bus_rules.txt @@ -16,17 +16,18 @@ conditions to be monitored. The mandatory properties for the rules are - qcom,src-nodes: An array of phandles denoting the source nodes whose bandwidth votes need to be monitored. -- qcom,src-field: This field represents the voted field of the - source node to be monitored. Possible values - are FLD_IB/FLD_AB/FLD_CLK -- qcom,src-op: The operand to be used when evaluating a node's - bandwidth vote with a threshold.Possible values - are OP_LE/OP_LT/OP_GT/OP_GE. -- qcom,thresh: The threshold in Kbytes/s to be used in vote - evaluation. +- qcom,src-field: An array of fields represents the voted field + of the source node to be monitored. Possible + values are FLD_IB/FLD_AB/FLD_CLK. +- qcom,src-op: An array of operands to be used when evaluating + a node's bandwidth vote with a threshold. + Possible values are OP_LE/OP_LT/OP_GT/OP_GE. +- qcom,thresh: An array of thresholds in Kbytes/s + (in FLD_IB/FLD_AB case) or KHz (in FLD_CLK case) + to be used in vote evaluation. - qcom,mode: The QoS mode to be applied when this rule's criterion are satisfied. Possible values are - THROTTLE_ON/THROTTLE_OFF + THROTTLE_ON/THROTTLE_OFF. - qcom,dest-node: An array of phandles representing the nodes to which the QoS mode is to be applied. @@ -34,6 +35,9 @@ The optional properties for the rule node are: - qcom,dest-bw: The destination bandwidth value in Kbytes/s to be used toward the QoS mode for the destination node. +- qcom,combo-op: A property that is only required when there + are multiple comparison operands to multiple + thresholds, can be OP_AND or OP_OR. Example: static-rules { @@ -42,13 +46,14 @@ Example: #size-cells = <0>; rule@0 { - qcom,src-nodes = <&mas_apss>; - qcom,src-field = ; - qcom,src-op = ; - qcom,thresh = <1599078>; + qcom,src-nodes = <&mas_apss &mas_mdp>; + qcom,src-field = ; + qcom,src-op = ; + qcom,thresh = <1599078 0>; qcom,mode = ; qcom,dest-node = <&mas_apss>; qcom,dest-bw = <1599078>; + qcom,combo-op = ; }; rule@1 { diff --git a/drivers/platform/msm/msm_bus/msm_bus_of_adhoc.c b/drivers/platform/msm/msm_bus/msm_bus_of_adhoc.c index 620da95d1be4a..46fb764facf8e 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_of_adhoc.c +++ b/drivers/platform/msm/msm_bus/msm_bus_of_adhoc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -808,6 +808,9 @@ int msm_bus_of_get_static_rules(struct platform_device *pdev, int bw_fld = 0; int i; struct bus_rule_type *local_rule = NULL; + int *thresh_arr = NULL; + int num_op = 0; + int num_fld = 0; of_node = pdev->dev.of_node; num_rules = of_get_child_count(of_node); @@ -832,37 +835,58 @@ int msm_bus_of_get_static_rules(struct platform_device *pdev, &local_rule[rule_idx].num_dst, "qcom,dest-node"); - ret = of_property_read_u32(child_node, "qcom,src-field", - &local_rule[rule_idx].src_field); - if (ret) { - dev_err(&pdev->dev, "src-field missing"); + if (local_rule[rule_idx].num_dst > 1) { + dev_err(&pdev->dev, "Only 1 dest node supported\n"); ret = -ENXIO; goto err_static_rules; } - ret = of_property_read_u32(child_node, "qcom,src-op", - &local_rule[rule_idx].op); - if (ret) { - dev_err(&pdev->dev, "src-op missing"); + thresh_arr = get_arr(pdev, child_node, + "qcom,thresh", + &local_rule[rule_idx].num_thresh); + + if (!local_rule[rule_idx].num_thresh || + ((local_rule[rule_idx].num_thresh > 1) && + local_rule[rule_idx].num_thresh != + local_rule[rule_idx].num_src)) { + dev_err(&pdev->dev, "thresholds missing"); ret = -ENXIO; goto err_static_rules; + } else { + int i; + + local_rule[rule_idx].thresh = + devm_kzalloc(&pdev->dev, + sizeof(u64) * local_rule[rule_idx].num_thresh, + GFP_KERNEL); + if (!IS_ERR_OR_NULL(thresh_arr)) { + for (i = 0; + i < local_rule[rule_idx].num_thresh; ++i) + local_rule[rule_idx].thresh[i] = + KBTOB(thresh_arr[i]); + } } - ret = of_property_read_u32(child_node, "qcom,mode", - &local_rule[rule_idx].mode); - if (ret) { - dev_err(&pdev->dev, "mode missing"); + local_rule[rule_idx].src_field = get_arr(pdev, child_node, + "qcom,src-field", &num_fld); + if (!num_fld || (num_fld != local_rule[rule_idx].num_thresh)) { + dev_err(&pdev->dev, "src-field missing"); ret = -ENXIO; goto err_static_rules; } - ret = of_property_read_u32(child_node, "qcom,thresh", &bw_fld); - if (ret) { - dev_err(&pdev->dev, "thresh missing"); + local_rule[rule_idx].op = get_arr(pdev, child_node, + "qcom,src-op", &num_op); + if (!num_op || (num_op != local_rule[rule_idx].num_thresh)) { + dev_err(&pdev->dev, "src-op missing"); ret = -ENXIO; goto err_static_rules; - } else - local_rule[rule_idx].thresh = KBTOB(bw_fld); + } + + ret = of_property_read_u32(child_node, "qcom,mode", + &local_rule[rule_idx].mode); + if (ret) + local_rule[rule_idx].mode = THROTTLE_OFF; ret = of_property_read_u32(child_node, "qcom,dest-bw", &bw_fld); @@ -871,9 +895,21 @@ int msm_bus_of_get_static_rules(struct platform_device *pdev, else local_rule[rule_idx].dst_bw = KBTOB(bw_fld); - rule_idx++; + ret = of_property_read_u32(child_node, "qcom,combo-op", + &local_rule[rule_idx].combo_op); + if (ret) { + if (local_rule[rule_idx].num_thresh > 1) { + dev_err(&pdev->dev, "combo-op missing"); + ret = -ENXIO; + goto err_static_rules; + } else + local_rule[rule_idx].combo_op = 0; + } + + ++rule_idx; } ret = rule_idx; + exit_static_rules: return ret; err_static_rules: @@ -885,9 +921,22 @@ int msm_bus_of_get_static_rules(struct platform_device *pdev, if (!IS_ERR_OR_NULL(local_rule[i].dst_node)) devm_kfree(&pdev->dev, local_rule[i].dst_node); - devm_kfree(&pdev->dev, local_rule); + if (!IS_ERR_OR_NULL(thresh_arr)) + devm_kfree(&pdev->dev, thresh_arr); + if (!IS_ERR_OR_NULL(local_rule[i].thresh)) + devm_kfree(&pdev->dev, + local_rule[i].thresh); + if (!IS_ERR_OR_NULL(local_rule[i].op)) + devm_kfree(&pdev->dev, + local_rule[i].op); + if (!IS_ERR_OR_NULL(local_rule[i].src_field)) + devm_kfree(&pdev->dev, + local_rule[i].src_field); + if (!IS_ERR_OR_NULL(thresh_arr)) + devm_kfree(&pdev->dev, thresh_arr); } } + devm_kfree(&pdev->dev, local_rule); *static_rules = NULL; return ret; } diff --git a/drivers/platform/msm/msm_bus/msm_bus_rules.c b/drivers/platform/msm/msm_bus/msm_bus_rules.c index 297ba9fc3c353..7cb05d8ba2dd1 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_rules.c +++ b/drivers/platform/msm/msm_bus/msm_bus_rules.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -128,9 +128,6 @@ static bool do_compare_op(u64 op1, u64 op2, int op) case OP_GE: ret = GE(op1, op2); break; - case OP_NOOP: - ret = true; - break; default: pr_info("Invalid OP %d", op); break; @@ -155,13 +152,13 @@ static void update_src_id_vote(struct rule_update_path_info *inp_node, } } -static u64 get_field(struct rules_def *rule, int src_id) +static u64 get_sum_field(struct rules_def *rule) { u64 field = 0; int i; for (i = 0; i < rule->num_src; i++) { - switch (rule->rule_ops.src_field) { + switch (rule->rule_ops.src_field[0]) { case FLD_IB: field += rule->src_info[i].ib; break; @@ -177,28 +174,58 @@ static u64 get_field(struct rules_def *rule, int src_id) return field; } -static bool check_rule(struct rules_def *rule, - struct rule_update_path_info *inp) +static u64 get_field(struct rules_def *rule, int src_id) +{ + u64 field = 0; + int i; + + for (i = 0; i < rule->num_src; i++) { + if (rule->src_info[i].id == src_id) { + switch (rule->rule_ops.src_field[i]) { + case FLD_IB: + field = rule->src_info[i].ib; + break; + case FLD_AB: + field = rule->src_info[i].ab; + break; + case FLD_CLK: + field = rule->src_info[i].clk; + break; + } + break; + } + } + return field; +} + +static bool check_rule(struct rules_def *rule) { bool ret = false; + u64 src_field = 0; + int i; if (!rule) return ret; - switch (rule->rule_ops.op) { - case OP_LE: - case OP_LT: - case OP_GT: - case OP_GE: - { - u64 src_field = get_field(rule, inp->id); - ret = do_compare_op(src_field, rule->rule_ops.thresh, - rule->rule_ops.op); - break; - } - default: - pr_err("Unsupported op %d", rule->rule_ops.op); - break; + for (i = 0; i < rule->rule_ops.num_thresh; i++) { + if (rule->rule_ops.op[i] > OP_GT) { + pr_err("Unsupported op %d", rule->rule_ops.op[i]); + continue; + } + if (rule->rule_ops.num_thresh > 1) + src_field = get_field(rule, rule->src_info[i].id); + else + src_field = get_sum_field(rule); + + ret = do_compare_op(src_field, rule->rule_ops.thresh[i], + rule->rule_ops.op[i]); + if (rule->rule_ops.combo_op == OP_AND) { + if (!ret) + return ret; + } else if (rule->rule_ops.combo_op == OP_OR) { + if (ret) + return ret; + } } return ret; } @@ -212,12 +239,12 @@ static void match_rule(struct rule_update_path_info *inp_node, list_for_each_entry(rule, &node->node_rules, link) { for (i = 0; i < rule->num_src; i++) { if (rule->src_info[i].id == inp_node->id) { - if (check_rule(rule, inp_node)) { + if (check_rule(rule)) { trace_bus_rules_matches( - (node->cur_rule ? - node->cur_rule->rule_id : -1), - inp_node->id, inp_node->ab, - inp_node->ib, inp_node->clk); + (node->cur_rule ? + node->cur_rule->rule_id : -1), + inp_node->id, inp_node->ab, + inp_node->ib, inp_node->clk); if (rule->state == RULE_STATE_NOT_APPLIED) rule->state_change = true; @@ -298,33 +325,38 @@ int msm_rules_update_path(struct list_head *input_list, return ret; } -static bool ops_equal(int op1, int op2) +static bool is_throttle_rule(int mode) { - bool ret = false; + bool ret = true; - switch (op1) { - case OP_GT: - case OP_GE: - case OP_LT: - case OP_LE: - if (abs(op1 - op2) <= 1) - ret = true; - break; - default: - ret = (op1 == op2); - } + if (mode == THROTTLE_OFF) + ret = false; return ret; } -static bool is_throttle_rule(int mode) +static int64_t get_th_diff(struct rules_def *ra, struct rules_def *rb) { - bool ret = true; + int64_t th_diff = 0; + int num_thresh = 1; - if (mode == THROTTLE_OFF) - ret = false; + if (!(ra && rb)) + return -ENXIO; - return ret; + num_thresh = ra->rule_ops.num_thresh; + if (num_thresh > 1) { + th_diff = ra->rule_ops.dst_bw - + rb->rule_ops.dst_bw; + } else { + if ((ra->rule_ops.op[0] == OP_LE) || + (ra->rule_ops.op[0] == OP_LT)) + th_diff = ra->rule_ops.thresh[0] - + rb->rule_ops.thresh[0]; + else + th_diff = rb->rule_ops.thresh[0] - + ra->rule_ops.thresh[0]; + } + return th_diff; } static int node_rules_compare(void *priv, struct list_head *a, @@ -337,26 +369,17 @@ static int node_rules_compare(void *priv, struct list_head *a, if (ra->rule_ops.mode == rb->rule_ops.mode) { - if (ops_equal(ra->rule_ops.op, rb->rule_ops.op)) { - if ((ra->rule_ops.op == OP_LT) || - (ra->rule_ops.op == OP_LE)) { - th_diff = ra->rule_ops.thresh - - rb->rule_ops.thresh; - if (th_diff > 0) - ret = 1; - else - ret = -1; - } else if ((ra->rule_ops.op == OP_GT) || - (ra->rule_ops.op == OP_GE)) { - th_diff = rb->rule_ops.thresh - - ra->rule_ops.thresh; - if (th_diff > 0) - ret = 1; - else - ret = -1; - } - } else + if ((ra->rule_ops.num_thresh == 1) && + (ra->rule_ops.op[0] - rb->rule_ops.op[0])) ret = ra->rule_ops.op - rb->rule_ops.op; + else { + th_diff = get_th_diff(ra, rb); + + if (th_diff > 0) + ret = 1; + else + ret = -1; + } } else if (is_throttle_rule(ra->rule_ops.mode) && is_throttle_rule(rb->rule_ops.mode)) { if (ra->rule_ops.mode == THROTTLE_ON) @@ -390,7 +413,8 @@ static void print_rules(struct rule_node_info *node_it) list_for_each_entry(node_rule, &node_it->node_rules, link) { pr_info("\n num Rules %d rule Id %d\n", node_it->num_rules, node_rule->rule_id); - pr_info("Rule: src_field %d\n", node_rule->rule_ops.src_field); + pr_info("Rule: src_field %d\n", + node_rule->rule_ops.src_field[0]); for (i = 0; i < node_rule->rule_ops.num_src; i++) pr_info("Rule: src %d\n", node_rule->rule_ops.src_id[i]); @@ -399,8 +423,8 @@ static void print_rules(struct rule_node_info *node_it) node_rule->rule_ops.dst_node[i], node_rule->rule_ops.dst_bw); pr_info("Rule: thresh %llu op %d mode %d State %d\n", - node_rule->rule_ops.thresh, - node_rule->rule_ops.op, + node_rule->rule_ops.thresh[0], + node_rule->rule_ops.op[0], node_rule->rule_ops.mode, node_rule->state); } @@ -431,25 +455,31 @@ void print_rules_buf(char *buf, int max_buf) "\nNum Rules:%d ruleId %d STATE:%d change:%d\n", node_it->num_rules, node_rule->rule_id, node_rule->state, node_rule->state_change); - cnt += scnprintf(buf + cnt, max_buf - cnt, - "Src_field %d\n", - node_rule->rule_ops.src_field); + for (i = 0; i < node_rule->rule_ops.num_thresh; i++) + cnt += scnprintf(buf + cnt, max_buf - cnt, + "Src_field %d\n", + node_rule->rule_ops.src_field[i]); for (i = 0; i < node_rule->rule_ops.num_src; i++) cnt += scnprintf(buf + cnt, max_buf - cnt, - "Src %d Cur Ib %llu Ab %llu\n", + "Src %d Cur Ib %llu Ab %llu Clk %llu\n", node_rule->rule_ops.src_id[i], node_rule->src_info[i].ib, - node_rule->src_info[i].ab); + node_rule->src_info[i].ab, + node_rule->src_info[i].clk); for (i = 0; i < node_rule->rule_ops.num_dst; i++) cnt += scnprintf(buf + cnt, max_buf - cnt, "Dst %d dst_bw %llu\n", node_rule->rule_ops.dst_node[0], node_rule->rule_ops.dst_bw); - cnt += scnprintf(buf + cnt, max_buf - cnt, + for (i = 0; i < node_rule->rule_ops.num_thresh; i++) + cnt += scnprintf(buf + cnt, max_buf - cnt, "Thresh %llu op %d mode %d\n", - node_rule->rule_ops.thresh, - node_rule->rule_ops.op, + node_rule->rule_ops.thresh[i], + node_rule->rule_ops.op[i], node_rule->rule_ops.mode); + scnprintf(buf+cnt, max_buf - cnt, + "Combo Op %d\n", + node_rule->rule_ops.combo_op); } } } @@ -573,9 +603,16 @@ static int comp_rules(struct bus_rule_type *rulea, struct bus_rule_type *ruleb) if (!ret && (rulea->num_dst == ruleb->num_dst)) ret = memcmp(rulea->dst_node, ruleb->dst_node, (sizeof(int) * rulea->num_dst)); - if (ret || (rulea->dst_bw != ruleb->dst_bw) || - (rulea->op != ruleb->op) || (rulea->thresh != ruleb->thresh)) + if (!ret && (rulea->num_thresh == ruleb->num_thresh)) + ret = (memcmp(rulea->op, ruleb->op, + (sizeof(int) * rulea->num_thresh)) && + memcmp(rulea->thresh, ruleb->thresh, + (sizeof(int) * rulea->num_thresh)) && + memcmp(rulea->src_field, ruleb->src_field, + (sizeof(int) * rulea->num_thresh))); + if (ret || (rulea->dst_bw != ruleb->dst_bw)) ret = 1; + return ret; } diff --git a/include/dt-bindings/msm/msm-bus-rule-ops.h b/include/dt-bindings/msm/msm-bus-rule-ops.h index 3dcbebd4418b2..895e6d709a676 100644 --- a/include/dt-bindings/msm/msm-bus-rule-ops.h +++ b/include/dt-bindings/msm/msm-bus-rule-ops.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -21,7 +21,9 @@ #define OP_LT 1 #define OP_GE 2 #define OP_GT 3 -#define OP_NOOP 4 +#define OP_NOOP 4 +#define OP_AND 5 +#define OP_OR 6 #define RULE_STATE_NOT_APPLIED 0 #define RULE_STATE_APPLIED 1 diff --git a/include/linux/msm_bus_rules.h b/include/linux/msm_bus_rules.h index e6142bfcb6234..76e56746cca3b 100644 --- a/include/linux/msm_bus_rules.h +++ b/include/linux/msm_bus_rules.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -40,9 +40,11 @@ struct rule_apply_rcm_info { struct bus_rule_type { int num_src; int *src_id; - int src_field; - int op; - u64 thresh; + int *src_field; + int *op; + int combo_op; + int num_thresh; + u64 *thresh; int num_dst; int *dst_node; u64 dst_bw; From 469e5bb0f88e9e150da81830fdadea9c99dd85c8 Mon Sep 17 00:00:00 2001 From: Haynes Mathew George Date: Thu, 4 Jun 2015 16:20:22 -0700 Subject: [PATCH 0079/1015] ASoc: msm: qdsp6v2: Fix timestamp glitch during gapless transition Change conditions to query DSP for session time Bug: 21633313 Change-Id: I7676d11747083eb35826c52abaa0de47f50032fc Signed-off-by: Haynes Mathew George --- sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c | 24 +++++++++++++--------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c index f314de4101c98..e35ef5a87ca4b 100644 --- a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c @@ -1983,20 +1983,25 @@ static int msm_compr_pointer(struct snd_compr_stream *cstream, gapless_transition = prtd->gapless_state.gapless_transition; spin_unlock_irqrestore(&prtd->lock, flags); + if (gapless_transition) + pr_debug("%s session time in gapless transition", + __func__); + /* - Query timestamp from DSP if some data is with it. - This prevents timeouts. + - Do not query if no buffer has been given. + - Do not query on a gapless transition. + Playback for the 2nd stream can start (thus returning time + starting from 0) before the driver knows about EOS of first stream. */ - if (!first_buffer || gapless_transition) { - if (gapless_transition) - pr_debug("%s session time in gapless transition", - __func__); + + if (!first_buffer && !gapless_transition) { if (pdata->use_legacy_api) rc = q6asm_get_session_time_legacy(prtd->audio_client, - ×tamp); + &prtd->marker_timestamp); else rc = q6asm_get_session_time(prtd->audio_client, - ×tamp); + &prtd->marker_timestamp); + if (rc < 0) { pr_err("%s: Get Session Time return value =%lld\n", __func__, timestamp); @@ -2005,9 +2010,8 @@ static int msm_compr_pointer(struct snd_compr_stream *cstream, else return -EAGAIN; } - } else { - timestamp = prtd->marker_timestamp; } + timestamp = prtd->marker_timestamp; /* DSP returns timestamp in usec */ pr_debug("%s: timestamp = %lld usec\n", __func__, timestamp); From a562cf55a71b9791a36e0614a76df2212b79a147 Mon Sep 17 00:00:00 2001 From: Arun Kumar Neelakantam Date: Wed, 24 Aug 2016 15:34:14 +0530 Subject: [PATCH 0080/1015] ARM: dts: msm: Disable the BAM DMUX device node for MSM8920 BAM DMUX is replaced by IPA for MSM8920 target compare to MSM8917. Hence disable the BAM DMUX node for MSM8920. CRs-Fixed: 1058746 Change-Id: I665de34994a35c4597e320e03d408cfa703a99b9 Signed-off-by: Arun Kumar Neelakantam --- arch/arm/boot/dts/qcom/msm8917.dtsi | 2 +- arch/arm/boot/dts/qcom/msm8920.dtsi | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index f739faffcb6b0..98999d196a83a 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -1338,7 +1338,7 @@ qcom,fragmented-data; }; - qcom,bam_dmux@4044000 { + bam_dmux: qcom,bam_dmux@4044000 { compatible = "qcom,bam_dmux"; reg = <0x4044000 0x19000>; interrupts = ; diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index cad2b8c0e878d..cb39777ee2ea4 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -116,3 +116,7 @@ }; }; }; + +&bam_dmux { + status = "disabled"; +}; From 8bd795276879473833ba0aa82c174ab40a58ea4f Mon Sep 17 00:00:00 2001 From: Mohamad Ayyash Date: Wed, 11 May 2016 13:18:35 -0700 Subject: [PATCH 0081/1015] Replace %p with %pK to prevent leaking kernel address BUG: 27532522 Signed-off-by: Mohamad Ayyash Signed-off-by: Dennis Cagle Git-commit: 066b75616cf93e7c3caa323a372bc22058791bd0 Git-repo: https://android.googlesource.com/kernel/msm (cherry picked from commit 1ff4ea16e6df22383a7386d3937019deb63c5fdc) Change-Id: I493d3b27cfeaaf63e3cf584c7048514d4d38905d Signed-off-by: Ravi Kumar Siddojigari --- net/netfilter/xt_qtaguid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netfilter/xt_qtaguid.c b/net/netfilter/xt_qtaguid.c index f04d49ddd42aa..d6f9bf61c6845 100644 --- a/net/netfilter/xt_qtaguid.c +++ b/net/netfilter/xt_qtaguid.c @@ -1934,7 +1934,7 @@ static int qtaguid_ctrl_proc_show(struct seq_file *m, void *v) ); f_count = atomic_long_read( &sock_tag_entry->socket->file->f_count); - seq_printf(m, "sock=%p tag=0x%llx (uid=%u) pid=%u " + seq_printf(m, "sock=%pK tag=0x%llx (uid=%u) pid=%u " "f_count=%lu\n", sock_tag_entry->sk, sock_tag_entry->tag, uid, From 23de35fe1093f5debd005df4b395344ee0c96110 Mon Sep 17 00:00:00 2001 From: Greg Hackmann Date: Wed, 20 Apr 2016 16:33:18 -0700 Subject: [PATCH 0082/1015] video: adf: zero out mapping data on adf_buffer_map() failure If the following call chain fails adf_device_post_nocopy() -> adf_buffer_map() -> dma_buf_attach(); dma_buf_map_attachment() then the attachment returned by dma_buf_attach() will get cleaned up twice: first during the error-handling path inside adf_buffer_map(), and again during the error-handling path inside adf_device_post_nocopy(). Fix this by zeroing out the mapping data inside adf_buffer_map()'s error-handling path. When adf_device_post_nocopy() hands it back to adf_buffer_mapping_cleanup(), it will deliberately skip over zeroed-out data. (The second adf_buffer_mapping_cleanup() call inside adf_device_post_nocopy() is not a bug; it's intended to clean up after any *other* buffers we handled as part of this request.) CVE:CVE-2016-3811 Bug: 28025945 Bug: 28279077 Change-Id: I824d980b208da3a15d35f74970755c8f18500263 Signed-off-by: Greg Hackmann Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: 4436de7a92d037599e0d217f16f9c391b6ad866a Signed-off-by: Ravi Kumar Siddojigari --- drivers/video/adf/adf_client.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/video/adf/adf_client.c b/drivers/video/adf/adf_client.c index 8061d8e6b9fbd..75b2f0b18522e 100644 --- a/drivers/video/adf/adf_client.c +++ b/drivers/video/adf/adf_client.c @@ -305,8 +305,10 @@ static int adf_buffer_map(struct adf_device *dev, struct adf_buffer *buf, } done: - if (ret < 0) + if (ret < 0) { adf_buffer_mapping_cleanup(mapping, buf); + memset(mapping, 0, sizeof(*mapping)); + } return ret; } From 6421986f559177b3876eb51a03cdc52c807d4a75 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Mon, 25 Apr 2016 15:52:05 -0700 Subject: [PATCH 0083/1015] BACKPORT: f2fs: add a max block check for get_data_block_bmap (cherry pick from commit 179448bfe4cd201e98e728391c6b01b25c849fe8) This patch adds a max block check for get_data_block_bmap. Trinity test program will send a block number as parameter into ioctl_fibmap, which will be used in get_node_path(), when the block number large than f2fs max blocks, it will trigger kernel bug. Signed-off-by: Yunlei He Signed-off-by: Xue Liu [Jaegeuk Kim: fix missing condition, pointed by Chao Yu] Signed-off-by: Jaegeuk Kim Bug: 28271368 Git-repo: https://android.googlesource.com/kernel/tegra.git Git-commit: 3c714201e02ec08652be4b9544a5267e79bde3a9 Change-Id: Ia5acae04522993d5b60a0bcb5ccc184c66532be8 [d-cagle@codeaurora.org Resolve trivial merge conflicts] Signed-off-by: Dennis Cagle --- fs/f2fs/data.c | 11 ++++++++++- fs/f2fs/f2fs.h | 1 + fs/f2fs/super.c | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index f988b01b6f895..e5a2e7ae20ae1 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -737,6 +737,15 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, start, len, get_data_block_fiemap); } +static int get_data_block_bmap(struct inode *inode, sector_t iblock, + struct buffer_head *bh_result, int create) +{ + /* Block number less than F2FS MAX BLOCKS */ + if (unlikely(iblock >= max_file_size(0))) + return -EFBIG; + return get_data_block_ro(inode, iblock, bh_result, create); +} + static int f2fs_read_data_page(struct file *file, struct page *page) { struct inode *inode = page->mapping->host; @@ -1153,7 +1162,7 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block) if (f2fs_has_inline_data(inode)) return 0; - return generic_block_bmap(mapping, block, get_data_block); + return generic_block_bmap(mapping, block, get_data_block_bmap); } const struct address_space_operations f2fs_dblock_aops = { diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 8171e80b2ee9f..2f73c62e58dbc 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1246,6 +1246,7 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode) /* * super.c */ +loff_t max_file_size(unsigned bits); int f2fs_sync_fs(struct super_block *, int); extern __printf(3, 4) void f2fs_msg(struct super_block *, const char *, const char *, ...); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 41d6f700f4ee6..50cb921ecede5 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -752,7 +752,7 @@ static const struct export_operations f2fs_export_ops = { .get_parent = f2fs_get_parent, }; -static loff_t max_file_size(unsigned bits) +loff_t max_file_size(unsigned bits) { loff_t result = (DEF_ADDRS_PER_INODE - F2FS_INLINE_XATTR_ADDRS); loff_t leaf_count = ADDRS_PER_BLOCK; From 0737c1cbfa24bf5c8146f5081bc5e9182776319f Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Tue, 12 Jan 2016 15:36:27 +0100 Subject: [PATCH 0084/1015] ALSA: seq: Fix race at timer setup and close ALSA sequencer code has an open race between the timer setup ioctl and the close of the client. This was triggered by syzkaller fuzzer, and a use-after-free was caught there as a result. This patch papers over it by adding a proper queue->timer_mutex lock around the timer-related calls in the relevant code path. b/28695438 Reported-by: Dmitry Vyukov Tested-by: Dmitry Vyukov Cc: Git-commit: 3567eb6af614dac436c4b16a8d426f9faed639b3 Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Signed-off-by: Takashi Iwai Signed-off-by: Dennis Cagle (cherry picked from commit 3567eb6af614dac436c4b16a8d426f9faed639b3) Change-Id: I398dd27dcdd1241917fd6d127b2debffc2afd413 --- sound/core/seq/seq_queue.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/core/seq/seq_queue.c b/sound/core/seq/seq_queue.c index a0cda38205b97..77ec214203558 100644 --- a/sound/core/seq/seq_queue.c +++ b/sound/core/seq/seq_queue.c @@ -142,8 +142,10 @@ static struct snd_seq_queue *queue_new(int owner, int locked) static void queue_delete(struct snd_seq_queue *q) { /* stop and release the timer */ + mutex_lock(&q->timer_mutex); snd_seq_timer_stop(q->timer); snd_seq_timer_close(q); + mutex_unlock(&q->timer_mutex); /* wait until access free */ snd_use_lock_sync(&q->use_lock); /* release resources... */ From 66a51bd6c395d224f222f666d4f699f255d507a5 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Wed, 13 Jan 2016 17:48:01 +0100 Subject: [PATCH 0085/1015] ALSA: timer: Fix race among timer ioctls ALSA timer ioctls have an open race and this may lead to a use-after-free of timer instance object. A simplistic fix is to make each ioctl exclusive. We have already tread_sem for controlling the tread, and extend this as a global mutex to be applied to each ioctl. The downside is, of course, the worse concurrency. But these ioctls aren't to be parallel accessible, in anyway, so it should be fine to serialize there. Change-Id: I66332dd27a63796c453185c8d978bed42cbb621e Reported-by: Dmitry Vyukov Tested-by: Dmitry Vyukov Cc: Signed-off-by: Takashi Iwai Git-commit: af368027a49a751d6ff4ee9e3f9961f35bb4fede Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Signed-off-by: Ravi Kumar Siddojigari --- sound/core/timer.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/sound/core/timer.c b/sound/core/timer.c index 4927a3c88340f..442e279689252 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -74,7 +74,7 @@ struct snd_timer_user { struct timespec tstamp; /* trigger tstamp */ wait_queue_head_t qchange_sleep; struct fasync_struct *fasync; - struct mutex tread_sem; + struct mutex ioctl_lock; }; /* list of timers */ @@ -1333,7 +1333,7 @@ static int snd_timer_user_open(struct inode *inode, struct file *file) return -ENOMEM; spin_lock_init(&tu->qlock); init_waitqueue_head(&tu->qchange_sleep); - mutex_init(&tu->tread_sem); + mutex_init(&tu->ioctl_lock); tu->ticks = 1; tu->queue_size = 128; tu->queue = kmalloc(tu->queue_size * sizeof(struct snd_timer_read), @@ -1353,8 +1353,10 @@ static int snd_timer_user_release(struct inode *inode, struct file *file) if (file->private_data) { tu = file->private_data; file->private_data = NULL; + mutex_lock(&tu->ioctl_lock); if (tu->timeri) snd_timer_close(tu->timeri); + mutex_unlock(&tu->ioctl_lock); kfree(tu->queue); kfree(tu->tqueue); kfree(tu); @@ -1592,7 +1594,6 @@ static int snd_timer_user_tselect(struct file *file, int err = 0; tu = file->private_data; - mutex_lock(&tu->tread_sem); if (tu->timeri) { snd_timer_close(tu->timeri); tu->timeri = NULL; @@ -1636,7 +1637,6 @@ static int snd_timer_user_tselect(struct file *file, } __err: - mutex_unlock(&tu->tread_sem); return err; } @@ -1849,7 +1849,7 @@ enum { SNDRV_TIMER_IOCTL_PAUSE_OLD = _IO('T', 0x23), }; -static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, +static long __snd_timer_user_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct snd_timer_user *tu; @@ -1866,17 +1866,11 @@ static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, { int xarg; - mutex_lock(&tu->tread_sem); - if (tu->timeri) { /* too late */ - mutex_unlock(&tu->tread_sem); + if (tu->timeri) /* too late */ return -EBUSY; - } - if (get_user(xarg, p)) { - mutex_unlock(&tu->tread_sem); + if (get_user(xarg, p)) return -EFAULT; - } tu->tread = xarg ? 1 : 0; - mutex_unlock(&tu->tread_sem); return 0; } case SNDRV_TIMER_IOCTL_GINFO: @@ -1909,6 +1903,18 @@ static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, return -ENOTTY; } +static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + struct snd_timer_user *tu = file->private_data; + long ret; + + mutex_lock(&tu->ioctl_lock); + ret = __snd_timer_user_ioctl(file, cmd, arg); + mutex_unlock(&tu->ioctl_lock); + return ret; +} + static int snd_timer_user_fasync(int fd, struct file * file, int on) { struct snd_timer_user *tu; From 2285fcc5f8e2337d1306c08b120e1eb4737f2ba4 Mon Sep 17 00:00:00 2001 From: Kangjie Lu Date: Tue, 3 May 2016 16:46:24 -0400 Subject: [PATCH 0086/1015] net: fix infoleak in rtnetlink MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stack object “map†has a total size of 32 bytes. Its last 4 bytes are padding generated by compiler. These padding bytes are not initialized and sent out via “nla_putâ€. Conflicts: net/core/rtnetlink.c b/28620102 Signed-off-by: Kangjie Lu Signed-off-by: David S. Miller Signed-off-by: Dennis Cagle Git-commit: 5f8e44741f9f216e33736ea4ec65ca9ac03036e6 Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git (cherry picked from commit 5f8e44741f9f216e33736ea4ec65ca9ac03036e6) Change-Id: I41f4745f24720c7af5ab08dc4274224d7fe4dcfe --- net/core/rtnetlink.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index c412db7746032..c555dd808f986 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1027,6 +1027,14 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, .dma = dev->dma, .port = dev->if_port, }; + memset(&map, 0, sizeof(map)); + map.mem_start = dev->mem_start; + map.mem_end = dev->mem_end; + map.base_addr = dev->base_addr; + map.irq = dev->irq; + map.dma = dev->dma; + map.port = dev->if_port; + if (nla_put(skb, IFLA_MAP, sizeof(map), &map)) goto nla_put_failure; } From 06768e69727ab6945828aca389837bfcb554c657 Mon Sep 17 00:00:00 2001 From: Kangjie Lu Date: Tue, 3 May 2016 16:44:07 -0400 Subject: [PATCH 0087/1015] ALSA: timer: Fix leak in SNDRV_TIMER_IOCTL_PARAMS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stack object “tread†has a total size of 32 bytes. Its field “event†and “val†both contain 4 bytes padding. These 8 bytes padding bytes are sent to user without being initialized. b/28980557 Git-commit: cec8f96e49d9be372fdb0c3836dcf31ec71e457e Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Signed-off-by: Kangjie Lu Signed-off-by: Takashi Iwai Signed-off-by: Dennis Cagle (cherry picked from commit cec8f96e49d9be372fdb0c3836dcf31ec71e457e) Change-Id: I3b42ee147fd0883696f9783f0a38d5bef888a10a --- sound/core/timer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/core/timer.c b/sound/core/timer.c index 4927a3c88340f..63c9b39c67c1c 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -1750,6 +1750,7 @@ static int snd_timer_user_params(struct file *file, if (tu->timeri->flags & SNDRV_TIMER_IFLG_EARLY_EVENT) { if (tu->tread) { struct snd_timer_tread tread; + memset(&tread, 0, sizeof(tread)); tread.event = SNDRV_TIMER_EVENT_EARLY; tread.tstamp.tv_sec = 0; tread.tstamp.tv_nsec = 0; From 6072ce52c4ea6c57a7313827b62ac06f5fa6ab4a Mon Sep 17 00:00:00 2001 From: Kangjie Lu Date: Tue, 3 May 2016 16:44:20 -0400 Subject: [PATCH 0088/1015] ALSA: timer: Fix leak in events via snd_timer_user_ccallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stack object “r1†has a total size of 32 bytes. Its field “event†and “val†both contain 4 bytes padding. These 8 bytes padding bytes are sent to user without being initialized. b/28980217 Git-commit: 9a47e9cff994f37f7f0dbd9ae23740d0f64f9fe6 Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Signed-off-by: Kangjie Lu Signed-off-by: Takashi Iwai Signed-off-by: Dennis Cagle (cherry picked from commit 9a47e9cff994f37f7f0dbd9ae23740d0f64f9fe6) Change-Id: I12949efac2aba669d302908704005fb94ba7efd7 --- sound/core/timer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/core/timer.c b/sound/core/timer.c index 4927a3c88340f..8dcf9bb01f3e3 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -1251,6 +1251,7 @@ static void snd_timer_user_ccallback(struct snd_timer_instance *timeri, tu->tstamp = *tstamp; if ((tu->filter & (1 << event)) == 0 || !tu->tread) return; + memset(&r1, 0, sizeof(r1)); r1.event = event; r1.tstamp = *tstamp; r1.val = resolution; From 957aca2e5351416b44599a7c7dbaa9d0f967ce2d Mon Sep 17 00:00:00 2001 From: Kangjie Lu Date: Tue, 3 May 2016 16:44:32 -0400 Subject: [PATCH 0089/1015] ALSA: timer: Fix leak in events via snd_timer_user_tinterrupt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stack object “r1†has a total size of 32 bytes. Its field “event†and “val†both contain 4 bytes padding. These 8 bytes padding bytes are sent to user without being initialized. b/28980217 Git-commit: e4ec8cc8039a7063e24204299b462bd1383184a5 Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Signed-off-by: Kangjie Lu Signed-off-by: Takashi Iwai Signed-off-by: Dennis Cagle (cherry picked from commit e4ec8cc8039a7063e24204299b462bd1383184a5) Change-Id: I53aa15632e941199010aae670cefb65c8fd56833 --- sound/core/timer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/core/timer.c b/sound/core/timer.c index 4927a3c88340f..1ef0f5bf42de7 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -1285,6 +1285,7 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri, } if ((tu->filter & (1 << SNDRV_TIMER_EVENT_RESOLUTION)) && tu->last_resolution != resolution) { + memset(&r1, 0, sizeof(r1)); r1.event = SNDRV_TIMER_EVENT_RESOLUTION; r1.tstamp = tstamp; r1.val = resolution; From feb24f19d9cf96a08cd2486dc56bbde947e03bac Mon Sep 17 00:00:00 2001 From: Kangjie Lu Date: Tue, 3 May 2016 16:32:16 -0400 Subject: [PATCH 0090/1015] USB: usbfs: fix potential infoleak in devio MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stack object “ci†has a total size of 8 bytes. Its last 3 bytes are padding bytes which are not initialized and leaked to userland via “copy_to_userâ€. Git-commit: 681fef8380eb818c0b845fca5d2ab1dcbab114ee Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Signed-off-by: Kangjie Lu Signed-off-by: Greg Kroah-Hartman Signed-off-by: Dennis Cagle (cherry picked from commit 681fef8380eb818c0b845fca5d2ab1dcbab114ee) Change-Id: Idacb2d5ed64654f85fb86fcce0a196223a7ac2af --- drivers/usb/core/devio.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index a85eadff6beaf..dfcb5f8b8f18f 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -1202,10 +1202,11 @@ static int proc_getdriver(struct usb_dev_state *ps, void __user *arg) static int proc_connectinfo(struct usb_dev_state *ps, void __user *arg) { - struct usbdevfs_connectinfo ci = { - .devnum = ps->dev->devnum, - .slow = ps->dev->speed == USB_SPEED_LOW - }; + struct usbdevfs_connectinfo ci; + + memset(&ci, 0, sizeof(ci)); + ci.devnum = ps->dev->devnum; + ci.slow = ps->dev->speed == USB_SPEED_LOW; if (copy_to_user(arg, &ci, sizeof(ci))) return -EFAULT; From cdcd98f27a67f4b5a4c41e4fd023d44dcd509dc0 Mon Sep 17 00:00:00 2001 From: Archana Sathyakumar Date: Wed, 29 Jun 2016 11:47:47 -0600 Subject: [PATCH 0091/1015] msm-core: debug: Fix the number of arguments for sysfs nodes Ptable and enable node parses the input arguments incorrectly. Parse the input message into exact number of arguments that are required for the respective nodes. CRs-fixed: 1032875 Change-Id: I881f18217b703a497efa4799288dee39a28ea8ab Signed-off-by: Archana Sathyakumar --- drivers/power/qcom/debug_core.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/power/qcom/debug_core.c b/drivers/power/qcom/debug_core.c index d3620bbbeafa0..e9c578f7b75ef 100644 --- a/drivers/power/qcom/debug_core.c +++ b/drivers/power/qcom/debug_core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -22,6 +22,8 @@ #include "soc/qcom/msm-core.h" #define MAX_PSTATES 50 +#define NUM_OF_PENTRY 3 /* number of variables for ptable node */ +#define NUM_OF_EENTRY 2 /* number of variables for enable node */ enum arg_offset { CPU_OFFSET, @@ -131,13 +133,15 @@ static void add_to_ptable(uint64_t *arg) node->ptr->len = node->len; } -static int split_ptable_args(char *line, uint64_t *arg) +static int split_ptable_args(char *line, uint64_t *arg, uint32_t n) { char *args; int i; int ret = 0; - for (i = 0; line; i++) { + for (i = 0; i < n; i++) { + if (!line) + break; args = strsep(&line, " "); ret = kstrtoull(args, 10, &arg[i]); } @@ -163,7 +167,7 @@ static ssize_t msm_core_ptable_write(struct file *file, goto done; } kbuf[len] = '\0'; - ret = split_ptable_args(kbuf, arg); + ret = split_ptable_args(kbuf, arg, NUM_OF_PENTRY); if (!ret) { add_to_ptable(arg); ret = len; @@ -227,7 +231,7 @@ static ssize_t msm_core_enable_write(struct file *file, goto done; } kbuf[len] = '\0'; - ret = split_ptable_args(kbuf, arg); + ret = split_ptable_args(kbuf, arg, NUM_OF_EENTRY); if (ret) goto done; cpu = arg[CPU_OFFSET]; From 26ac563997decd693c4c8847c19836edc99cf9ea Mon Sep 17 00:00:00 2001 From: Divya Ponnusamy Date: Wed, 24 Aug 2016 20:49:31 +0530 Subject: [PATCH 0092/1015] msm: kgsl: Change %p to %pK in debug messages The format specifier %p can leak kernel addresses while not valuing the kptr_restrict system settings. Use %pK instead of %p, which evaluates whether kptr_restrict is set. Change-Id: I0778e43e0a03852ca2944377256a7b401586a747 Signed-off-by: Divya Ponnusamy Signed-off-by: Sudeep Yedalapure --- drivers/gpu/msm/adreno_debugfs.c | 2 +- drivers/gpu/msm/kgsl.c | 5 ++--- drivers/gpu/msm/kgsl_cffdump.c | 7 ------- drivers/gpu/msm/kgsl_cmdbatch.c | 2 +- drivers/gpu/msm/kgsl_iommu.c | 16 ++++++++-------- drivers/gpu/msm/kgsl_snapshot.c | 3 --- 6 files changed, 12 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/msm/adreno_debugfs.c b/drivers/gpu/msm/adreno_debugfs.c index 9cbcd06d76585..680827e5b848c 100644 --- a/drivers/gpu/msm/adreno_debugfs.c +++ b/drivers/gpu/msm/adreno_debugfs.c @@ -138,7 +138,7 @@ static void sync_event_print(struct seq_file *s, break; } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: - seq_printf(s, "sync: [%p] %s", sync_event->handle, + seq_printf(s, "sync: [%pK] %s", sync_event->handle, (sync_event->handle && sync_event->handle->fence) ? sync_event->handle->fence->name : "NULL"); break; diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index f6f1e4a0aabdd..3b4ba6d9cdabd 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -3890,9 +3890,8 @@ int kgsl_device_platform_probe(struct kgsl_device *device) disable_irq(device->pwrctrl.interrupt_num); KGSL_DRV_INFO(device, - "dev_id %d regs phys 0x%08lx size 0x%08x virt %p\n", - device->id, device->reg_phys, device->reg_len, - device->reg_virt); + "dev_id %d regs phys 0x%08lx size 0x%08x\n", + device->id, device->reg_phys, device->reg_len); rwlock_init(&device->context_lock); diff --git a/drivers/gpu/msm/kgsl_cffdump.c b/drivers/gpu/msm/kgsl_cffdump.c index 2e90f78a303c8..8e783f8ce017e 100644 --- a/drivers/gpu/msm/kgsl_cffdump.c +++ b/drivers/gpu/msm/kgsl_cffdump.c @@ -513,10 +513,6 @@ EXPORT_SYMBOL(kgsl_cffdump_waitirq); static int subbuf_start_handler(struct rchan_buf *buf, void *subbuf, void *prev_subbuf, size_t prev_padding) { - pr_debug("kgsl: cffdump: subbuf_start_handler(subbuf=%p, prev_subbuf" - "=%p, prev_padding=%08zx)\n", subbuf, prev_subbuf, - prev_padding); - if (relay_buf_full(buf)) { if (!suspended) { suspended = 1; @@ -573,9 +569,6 @@ static struct rchan *create_channel(unsigned subbuf_size, unsigned n_subbufs) { struct rchan *chan; - pr_info("kgsl: cffdump: relay: create_channel: subbuf_size %u, " - "n_subbufs %u, dir 0x%p\n", subbuf_size, n_subbufs, dir); - chan = relay_open("cpu", dir, subbuf_size, n_subbufs, &relay_callbacks, NULL); if (!chan) { diff --git a/drivers/gpu/msm/kgsl_cmdbatch.c b/drivers/gpu/msm/kgsl_cmdbatch.c index ceca8b1e15226..6272410ce544b 100644 --- a/drivers/gpu/msm/kgsl_cmdbatch.c +++ b/drivers/gpu/msm/kgsl_cmdbatch.c @@ -80,7 +80,7 @@ void kgsl_dump_syncpoints(struct kgsl_device *device, } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: if (event->handle) - dev_err(device->dev, " fence: [%p] %s\n", + dev_err(device->dev, " fence: [%pK] %s\n", event->handle->fence, event->handle->name); else diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c index b467ef81d2577..fb25c2ae3869a 100644 --- a/drivers/gpu/msm/kgsl_iommu.c +++ b/drivers/gpu/msm/kgsl_iommu.c @@ -323,8 +323,8 @@ static int _iommu_map_sync_pc(struct kgsl_pagetable *pt, _unlock_if_secure_mmu(memdesc, pt->mmu); if (ret) { - KGSL_CORE_ERR("map err: %p, 0x%016llX, 0x%llx, 0x%x, %d\n", - iommu_pt->domain, gpuaddr, size, flags, ret); + KGSL_CORE_ERR("map err: 0x%016llX, 0x%llx, 0x%x, %d\n", + gpuaddr, size, flags, ret); return -ENODEV; } @@ -351,8 +351,8 @@ static int _iommu_unmap_sync_pc(struct kgsl_pagetable *pt, _unlock_if_secure_mmu(memdesc, pt->mmu); if (unmapped != size) { - KGSL_CORE_ERR("unmap err: %p, 0x%016llx, 0x%llx, %zd\n", - iommu_pt->domain, addr, size, unmapped); + KGSL_CORE_ERR("unmap err: 0x%016llx, 0x%llx, %zd\n", + addr, size, unmapped); return -ENODEV; } @@ -421,8 +421,8 @@ static int _iommu_map_sg_offset_sync_pc(struct kgsl_pagetable *pt, if (size != 0) { /* Cleanup on error */ _iommu_unmap_sync_pc(pt, memdesc, addr, mapped); - KGSL_CORE_ERR("map err: %p, 0x%016llX, %d, %x, %zd\n", - iommu_pt->domain, addr, nents, flags, mapped); + KGSL_CORE_ERR("map err: 0x%016llX, %d, %x, %zd\n", + addr, nents, flags, mapped); return -ENODEV; } @@ -451,8 +451,8 @@ static int _iommu_map_sg_sync_pc(struct kgsl_pagetable *pt, _unlock_if_secure_mmu(memdesc, pt->mmu); if (mapped == 0) { - KGSL_CORE_ERR("map err: %p, 0x%016llX, %d, %x, %zd\n", - iommu_pt->domain, addr, nents, flags, mapped); + KGSL_CORE_ERR("map err: 0x%016llX, %d, %x, %zd\n", + addr, nents, flags, mapped); return -ENODEV; } diff --git a/drivers/gpu/msm/kgsl_snapshot.c b/drivers/gpu/msm/kgsl_snapshot.c index 17106079f053a..cf4d77932e147 100644 --- a/drivers/gpu/msm/kgsl_snapshot.c +++ b/drivers/gpu/msm/kgsl_snapshot.c @@ -1074,9 +1074,6 @@ void kgsl_snapshot_save_frozen_objs(struct work_struct *work) goto done; snapshot->mempool = vmalloc(size); - if (snapshot->mempool != NULL) - KGSL_DRV_ERR(device, "snapshot: mempool address %p, size %zx\n", - snapshot->mempool, size); ptr = snapshot->mempool; snapshot->mempool_size = 0; From 6fc6c8b41135294a2a5961a9505e03ea5b94c293 Mon Sep 17 00:00:00 2001 From: Mallikarjuna Reddy Amireddy Date: Thu, 18 Aug 2016 16:58:47 +0530 Subject: [PATCH 0093/1015] ARM: dts: msm: Route to sw crypto for hmac and aead on msm8937 For crypto operations, kernel applications request for tfm by using crypto_alloc with algorithm name, which ever algorithm was registered first those will be used for completing the requested process. HW crypto driver has different algorithm names to use HW crypto calls instead of SW crypto. Two flags has been missed on this targets which leads all the crypto calls to HW crypto, for smaller size packets its not advisable to use HW crypto. This patch adds dtsi flags to route all the calls to SW instead HW for hmac and aead alogs. If app wants to use HW crypto then it should append "qcom-" to the name of crypto algorithms. Change-Id: Iaaaf36c479622744e6871b7615876c35063cc47f Signed-off-by: AnilKumar Chimata Signed-off-by: Mallikarjuna Reddy Amireddy --- arch/arm/boot/dts/qcom/msm8937.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8937.dtsi b/arch/arm/boot/dts/qcom/msm8937.dtsi index 32502fdb29019..b4d902228a67e 100644 --- a/arch/arm/boot/dts/qcom/msm8937.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937.dtsi @@ -1486,6 +1486,8 @@ qcom,use-sw-aes-xts-algo; qcom,use-sw-aes-ccm-algo; qcom,use-sw-ahash-algo; + qcom,use-sw-hmac-algo; + qcom,use-sw-aead-algo; qcom,ce-opp-freq = <100000000>; }; From b17d30bd54ceeca23235cd6ac1ef3691c59e589a Mon Sep 17 00:00:00 2001 From: Mallikarjuna Reddy Amireddy Date: Thu, 18 Aug 2016 16:53:43 +0530 Subject: [PATCH 0094/1015] ARM: dts: msm: Route to sw crypto for hmac and aead on msm8917 For crypto operations, kernel applications request for tfm by using crypto_alloc with algorithm name, which ever algorithm was registered first those will be used for completing the requested process. HW crypto driver has different algorithm names to use HW crypto calls instead of SW crypto. Two flags has been missed on this targets which leads all the crypto calls to HW crypto, for smaller size packets its not advisable to use HW crypto. This patch adds dtsi flags to route all the calls to SW instead HW for hmac and aead alogs. If app wants to use HW crypto then it should append "qcom-" to the name of crypto algorithms. Change-Id: I35ad694c1f05dd10b634e2fae3937ba87aadd140 Signed-off-by: AnilKumar Chimata Signed-off-by: Mallikarjuna Reddy Amireddy --- arch/arm/boot/dts/qcom/msm8917.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index 98999d196a83a..c55049aa1fbff 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -1246,6 +1246,8 @@ qcom,use-sw-aes-xts-algo; qcom,use-sw-aes-ccm-algo; qcom,use-sw-ahash-algo; + qcom,use-sw-hmac-algo; + qcom,use-sw-aead-algo; qcom,ce-opp-freq = <100000000>; }; From ea9110fd67751848ca596171e44462233ddd9103 Mon Sep 17 00:00:00 2001 From: Mallikarjuna Reddy Amireddy Date: Mon, 8 Aug 2016 10:44:23 +0530 Subject: [PATCH 0095/1015] ARM: dts: msm: Route to sw crypto for hmac and aead on msm8996 For crypto operations, kernel applications request for tfm by using crypto_alloc with algorithm name, which ever algorithm was registered first those will be used for completing the requested process. HW crypto driver has different algorithm names to use HW crypto calls instead of SW crypto. Two flags has been missed on this targets which leads all the crypto calls to HW crypto, for smaller size packets its not advisable to use HW crypto. This patch adds dtsi flags to route all the calls to SW instead HW for hmac and aead alogs. If app wants to use HW crypto then it should append "qcom-" to the name of crypto algorithms. Change-Id: I6b361eadbc5830fa7d513b62c44fe99cb8a75fc8 Signed-off-by: AnilKumar Chimata Signed-off-by: Mallikarjuna Reddy Amireddy --- arch/arm/boot/dts/qcom/msm8996.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8996.dtsi b/arch/arm/boot/dts/qcom/msm8996.dtsi index b505f8107f610..b342288737848 100644 --- a/arch/arm/boot/dts/qcom/msm8996.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996.dtsi @@ -2454,6 +2454,8 @@ qcom,use-sw-aes-xts-algo; qcom,use-sw-aes-ccm-algo; qcom,use-sw-ahash-algo; + qcom,use-sw-hmac-algo; + qcom,use-sw-aead-algo; }; qcom_cedev: qcedev@660000 { From e1bca6f464f5b00e828ad6a21df9f9b0b5671b64 Mon Sep 17 00:00:00 2001 From: Liangliang Lu Date: Fri, 19 Aug 2016 09:43:55 +0800 Subject: [PATCH 0096/1015] ARM: dts: msm: add PHY parameters for MSM8940 QRD SKU7 board Add initial high-speed PHY parameters settings for MSM8940 QRD SKU7 board. CRs-Fixed: 1052640 Change-Id: I857d564e9062b2e1b3dd61c23054c049de00b1df Signed-off-by: Liangliang Lu --- arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi b/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi index 0b258e4f75325..b6e678fb70ed1 100644 --- a/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi @@ -193,3 +193,8 @@ qcom,mdss-dsi-bl-max-level = <4095>; qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; }; + +&usb_otg { + qcom,hsusb-otg-phy-init-seq = + <0x39 0x81 0x37 0x82 0xffffffff>; +}; From bd33ce82c9c91f694034735d81d215598f7b0780 Mon Sep 17 00:00:00 2001 From: Olav Haugan Date: Fri, 2 Sep 2016 17:12:20 -0700 Subject: [PATCH 0097/1015] trace: Move core control trace events to scheduler Move the core control trace events to scheduler trace event file. Change-Id: I65943d8e4a9eac1f9f5a40ad5aaf166679215f48 Signed-off-by: Olav Haugan Signed-off-by: Pavankumar Kondeti --- include/trace/events/power.h | 43 ------------------------------ include/trace/events/qhmp_sched.h | 44 +++++++++++++++++++++++++++++++ include/trace/events/sched.h | 43 ++++++++++++++++++++++++++++++ kernel/sched/core_ctl.c | 2 +- kernel/trace/power-traces.c | 2 -- 5 files changed, 88 insertions(+), 46 deletions(-) diff --git a/include/trace/events/power.h b/include/trace/events/power.h index c4085df07cc15..3b7dae87b6b35 100644 --- a/include/trace/events/power.h +++ b/include/trace/events/power.h @@ -619,49 +619,6 @@ DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_remove_request, TP_ARGS(name, type, new_value) ); -TRACE_EVENT(core_ctl_eval_need, - - TP_PROTO(unsigned int cpu, unsigned int old_need, - unsigned int new_need, unsigned int updated), - TP_ARGS(cpu, old_need, new_need, updated), - TP_STRUCT__entry( - __field(u32, cpu) - __field(u32, old_need) - __field(u32, new_need) - __field(u32, updated) - ), - TP_fast_assign( - __entry->cpu = cpu; - __entry->old_need = old_need; - __entry->new_need = new_need; - __entry->updated = updated; - ), - TP_printk("cpu=%u, old_need=%u, new_need=%u, updated=%u", __entry->cpu, - __entry->old_need, __entry->new_need, __entry->updated) -); - -TRACE_EVENT(core_ctl_set_busy, - - TP_PROTO(unsigned int cpu, unsigned int busy, - unsigned int old_is_busy, unsigned int is_busy), - TP_ARGS(cpu, busy, old_is_busy, is_busy), - TP_STRUCT__entry( - __field(u32, cpu) - __field(u32, busy) - __field(u32, old_is_busy) - __field(u32, is_busy) - ), - TP_fast_assign( - __entry->cpu = cpu; - __entry->busy = busy; - __entry->old_is_busy = old_is_busy; - __entry->is_busy = is_busy; - ), - TP_printk("cpu=%u, busy=%u, old_is_busy=%u, new_is_busy=%u", - __entry->cpu, __entry->busy, __entry->old_is_busy, - __entry->is_busy) -); - DECLARE_EVENT_CLASS(kpm_module, TP_PROTO(unsigned int managed_cpus, unsigned int max_cpus), diff --git a/include/trace/events/qhmp_sched.h b/include/trace/events/qhmp_sched.h index 1fda71251c16c..8f2ea8cbc8315 100644 --- a/include/trace/events/qhmp_sched.h +++ b/include/trace/events/qhmp_sched.h @@ -1045,6 +1045,50 @@ TRACE_EVENT(sched_get_nr_running_avg, TP_printk("avg=%d big_avg=%d iowait_avg=%d", __entry->avg, __entry->big_avg, __entry->iowait_avg) ); + +TRACE_EVENT(core_ctl_eval_need, + + TP_PROTO(unsigned int cpu, unsigned int old_need, + unsigned int new_need, unsigned int updated), + TP_ARGS(cpu, old_need, new_need, updated), + TP_STRUCT__entry( + __field(u32, cpu) + __field(u32, old_need) + __field(u32, new_need) + __field(u32, updated) + ), + TP_fast_assign( + __entry->cpu = cpu; + __entry->old_need = old_need; + __entry->new_need = new_need; + __entry->updated = updated; + ), + TP_printk("cpu=%u, old_need=%u, new_need=%u, updated=%u", __entry->cpu, + __entry->old_need, __entry->new_need, __entry->updated) +); + +TRACE_EVENT(core_ctl_set_busy, + + TP_PROTO(unsigned int cpu, unsigned int busy, + unsigned int old_is_busy, unsigned int is_busy), + TP_ARGS(cpu, busy, old_is_busy, is_busy), + TP_STRUCT__entry( + __field(u32, cpu) + __field(u32, busy) + __field(u32, old_is_busy) + __field(u32, is_busy) + ), + TP_fast_assign( + __entry->cpu = cpu; + __entry->busy = busy; + __entry->old_is_busy = old_is_busy; + __entry->is_busy = is_busy; + ), + TP_printk("cpu=%u, busy=%u, old_is_busy=%u, new_is_busy=%u", + __entry->cpu, __entry->busy, __entry->old_is_busy, + __entry->is_busy) +); + #endif /* _TRACE_SCHED_H */ /* This part must be outside protection */ diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 9452f5e789dd3..9c0c1f9d1577f 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -1269,6 +1269,49 @@ TRACE_EVENT(sched_get_nr_running_avg, __entry->avg, __entry->big_avg, __entry->iowait_avg) ); +TRACE_EVENT(core_ctl_eval_need, + + TP_PROTO(unsigned int cpu, unsigned int old_need, + unsigned int new_need, unsigned int updated), + TP_ARGS(cpu, old_need, new_need, updated), + TP_STRUCT__entry( + __field(u32, cpu) + __field(u32, old_need) + __field(u32, new_need) + __field(u32, updated) + ), + TP_fast_assign( + __entry->cpu = cpu; + __entry->old_need = old_need; + __entry->new_need = new_need; + __entry->updated = updated; + ), + TP_printk("cpu=%u, old_need=%u, new_need=%u, updated=%u", __entry->cpu, + __entry->old_need, __entry->new_need, __entry->updated) +); + +TRACE_EVENT(core_ctl_set_busy, + + TP_PROTO(unsigned int cpu, unsigned int busy, + unsigned int old_is_busy, unsigned int is_busy), + TP_ARGS(cpu, busy, old_is_busy, is_busy), + TP_STRUCT__entry( + __field(u32, cpu) + __field(u32, busy) + __field(u32, old_is_busy) + __field(u32, is_busy) + ), + TP_fast_assign( + __entry->cpu = cpu; + __entry->busy = busy; + __entry->old_is_busy = old_is_busy; + __entry->is_busy = is_busy; + ), + TP_printk("cpu=%u, busy=%u, old_is_busy=%u, new_is_busy=%u", + __entry->cpu, __entry->busy, __entry->old_is_busy, + __entry->is_busy) +); + #endif /* _TRACE_SCHED_H */ /* This part must be outside protection */ diff --git a/kernel/sched/core_ctl.c b/kernel/sched/core_ctl.c index 0280e75002189..9363a0615a82d 100644 --- a/kernel/sched/core_ctl.c +++ b/kernel/sched/core_ctl.c @@ -21,7 +21,7 @@ #include #include -#include +#include #define MAX_CPUS_PER_GROUP 4 diff --git a/kernel/trace/power-traces.c b/kernel/trace/power-traces.c index 74760614a0048..d89a8e9814100 100644 --- a/kernel/trace/power-traces.c +++ b/kernel/trace/power-traces.c @@ -14,5 +14,3 @@ #include EXPORT_TRACEPOINT_SYMBOL_GPL(cpu_idle); -EXPORT_TRACEPOINT_SYMBOL(core_ctl_set_busy); -EXPORT_TRACEPOINT_SYMBOL(core_ctl_eval_need); From 6bf10712283bad73bdc39fe56adeaf87a1aabf22 Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Wed, 7 Sep 2016 08:31:52 +0530 Subject: [PATCH 0098/1015] defconfig: msm: Disable core control helper Core control helper is not needed anymore with subsequent patches that moves core control into the kernel. Change-Id: I2c62af441fb9e5ba9f29719853a63e4c8f2d031b Signed-off-by: Olav Haugan Signed-off-by: Pavankumar Kondeti --- arch/arm/configs/msm8909w-1gb-perf_defconfig | 1 - arch/arm/configs/msm8909w-1gb_defconfig | 1 - arch/arm/configs/msm8909w-perf_defconfig | 1 - arch/arm/configs/msm8909w_defconfig | 1 - arch/arm/configs/msm8937-perf_defconfig | 1 - arch/arm/configs/msm8937_defconfig | 1 - arch/arm/configs/msmcortex-perf_defconfig | 1 - arch/arm/configs/msmcortex_defconfig | 1 - arch/arm64/configs/msm-auto-perf_defconfig | 1 - arch/arm64/configs/msm-auto_defconfig | 1 - arch/arm64/configs/msm-perf_defconfig | 1 - arch/arm64/configs/msm8937-perf_defconfig | 1 - arch/arm64/configs/msm8937_defconfig | 1 - arch/arm64/configs/msm_defconfig | 1 - arch/arm64/configs/msmcortex-perf_defconfig | 1 - arch/arm64/configs/msmcortex_defconfig | 1 - 16 files changed, 16 deletions(-) diff --git a/arch/arm/configs/msm8909w-1gb-perf_defconfig b/arch/arm/configs/msm8909w-1gb-perf_defconfig index 98eb2d2ea039d..36223e32fd46e 100644 --- a/arch/arm/configs/msm8909w-1gb-perf_defconfig +++ b/arch/arm/configs/msm8909w-1gb-perf_defconfig @@ -435,7 +435,6 @@ CONFIG_MSM_SUBSYSTEM_RESTART=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm/configs/msm8909w-1gb_defconfig b/arch/arm/configs/msm8909w-1gb_defconfig index 67393eb27e90d..8955aa16eccb0 100644 --- a/arch/arm/configs/msm8909w-1gb_defconfig +++ b/arch/arm/configs/msm8909w-1gb_defconfig @@ -438,7 +438,6 @@ CONFIG_MSM_SUBSYSTEM_RESTART=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm/configs/msm8909w-perf_defconfig b/arch/arm/configs/msm8909w-perf_defconfig index d7db427bc0b40..511d0e1358ffd 100644 --- a/arch/arm/configs/msm8909w-perf_defconfig +++ b/arch/arm/configs/msm8909w-perf_defconfig @@ -436,7 +436,6 @@ CONFIG_MSM_SUBSYSTEM_RESTART=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm/configs/msm8909w_defconfig b/arch/arm/configs/msm8909w_defconfig index a64f825f6e026..fc504183e0e8a 100644 --- a/arch/arm/configs/msm8909w_defconfig +++ b/arch/arm/configs/msm8909w_defconfig @@ -439,7 +439,6 @@ CONFIG_MSM_SUBSYSTEM_RESTART=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index cf5986a2dc2eb..2a0e2524e5a45 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -549,7 +549,6 @@ CONFIG_MSM_SYSMON_COMM=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index 77a998224338f..636dec204d6e3 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -558,7 +558,6 @@ CONFIG_MSM_SYSMON_COMM=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index c102d70e4face..f1b43e3b6e301 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -542,7 +542,6 @@ CONFIG_MSM_SYSMON_COMM=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_KERNEL_PROTECT=y diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index 5f6f98d246e44..e6015eb2003de 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -546,7 +546,6 @@ CONFIG_MSM_SYSMON_COMM=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_KERNEL_PROTECT=y diff --git a/arch/arm64/configs/msm-auto-perf_defconfig b/arch/arm64/configs/msm-auto-perf_defconfig index 8411926bde0ac..5dc0d13c48e34 100644 --- a/arch/arm64/configs/msm-auto-perf_defconfig +++ b/arch/arm64/configs/msm-auto-perf_defconfig @@ -550,7 +550,6 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_QBT1000=y CONFIG_MSM_KERNEL_PROTECT=y diff --git a/arch/arm64/configs/msm-auto_defconfig b/arch/arm64/configs/msm-auto_defconfig index 9a1856e70ceeb..48ccfe76b119f 100644 --- a/arch/arm64/configs/msm-auto_defconfig +++ b/arch/arm64/configs/msm-auto_defconfig @@ -559,7 +559,6 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_SERVICE_LOCATOR=y CONFIG_MSM_SERVICE_NOTIFIER=y diff --git a/arch/arm64/configs/msm-perf_defconfig b/arch/arm64/configs/msm-perf_defconfig index 241be6600e4e0..385235e9075bf 100644 --- a/arch/arm64/configs/msm-perf_defconfig +++ b/arch/arm64/configs/msm-perf_defconfig @@ -543,7 +543,6 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_POWER=y CONFIG_MSM_QBT1000=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index 44150500e5265..b564b93d178f5 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -553,7 +553,6 @@ CONFIG_MSM_SYSMON_COMM=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 59c3becdc8cce..b106b47456235 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -560,7 +560,6 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index 03ed6a840ec45..ac71da7fb6428 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -556,7 +556,6 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_POWER=y CONFIG_MSM_SERVICE_LOCATOR=y diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index f674855c48413..eb85344169ffa 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -555,7 +555,6 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_ICNSS=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_KERNEL_PROTECT=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index 069548ef317ed..24be0f4c75aed 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -572,7 +572,6 @@ CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y CONFIG_ICNSS=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_KERNEL_PROTECT=y From 6c24f1ae17aa3288b538cf7fc6ec6a37462e01e6 Mon Sep 17 00:00:00 2001 From: Olav Haugan Date: Thu, 18 Aug 2016 17:21:30 -0700 Subject: [PATCH 0099/1015] qcom: core_ctl_helper: Remove Remove the core control helper code since this is not needed anymore with subsequent patches that moves core control into the kernel. Change-Id: I62acddeb707fc7d5626580166b3466e63f45fd89 Signed-off-by: Olav Haugan Signed-off-by: Pavankumar Kondeti --- drivers/soc/qcom/Kconfig | 8 --- drivers/soc/qcom/Makefile | 1 - drivers/soc/qcom/core_ctl_helper.c | 92 ------------------------------ include/soc/qcom/core_ctl.h | 26 --------- 4 files changed, 127 deletions(-) delete mode 100644 drivers/soc/qcom/core_ctl_helper.c delete mode 100644 include/soc/qcom/core_ctl.h diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig index b6952f5bfd4e0..7b512edb7e75c 100644 --- a/drivers/soc/qcom/Kconfig +++ b/drivers/soc/qcom/Kconfig @@ -707,14 +707,6 @@ config ICNSS control messages to FW over QMI channel. It is also responsible for handling WLAN PD restart notifications. -config MSM_CORE_CTL_HELPER - tristate "Core control helper functions for dynamically hotplug CPUs" - help - Provide helper functions for core control driver. Core control - driver dynamically hotplugs CPUs from kernel based on current - system load and state. It also supports limiting min and - max online CPUs from userspace. - config MSM_BAM_DMUX bool "BAM Data Mux Driver" depends on SPS diff --git a/drivers/soc/qcom/Makefile b/drivers/soc/qcom/Makefile index a0f69ac87804c..4ada1bba0bc45 100644 --- a/drivers/soc/qcom/Makefile +++ b/drivers/soc/qcom/Makefile @@ -71,7 +71,6 @@ obj-$(CONFIG_MSM_TZ_SMMU) += msm_tz_smmu.o obj-$(CONFIG_MSM_PIL) += peripheral-loader.o obj-$(CONFIG_MSM_PIL_SSR_GENERIC) += subsys-pil-tz.o obj-$(CONFIG_MSM_PIL_MSS_QDSP6V5) += pil-q6v5.o pil-msa.o pil-q6v5-mss.o -obj-$(CONFIG_MSM_CORE_CTL_HELPER) += core_ctl_helper.o obj-$(CONFIG_MSM_SCM_ERRATA) += scm-errata.o obj-$(CONFIG_MSM_PFE_WA) += pfe-wa.o obj-$(CONFIG_MSM_PERFORMANCE) += msm_performance.o diff --git a/drivers/soc/qcom/core_ctl_helper.c b/drivers/soc/qcom/core_ctl_helper.c deleted file mode 100644 index c21ba2f7173a8..0000000000000 --- a/drivers/soc/qcom/core_ctl_helper.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -void core_ctl_block_hotplug(void) -{ - get_online_cpus(); -} -EXPORT_SYMBOL(core_ctl_block_hotplug); - -void core_ctl_unblock_hotplug(void) -{ - put_online_cpus(); -} -EXPORT_SYMBOL(core_ctl_unblock_hotplug); - -s64 core_ctl_get_time(void) -{ - return ktime_to_ms(ktime_get()); -} -EXPORT_SYMBOL(core_ctl_get_time); - -struct cpufreq_policy *core_ctl_get_policy(int cpu) -{ - return cpufreq_cpu_get(cpu); -} -EXPORT_SYMBOL(core_ctl_get_policy); - -void core_ctl_put_policy(struct cpufreq_policy *policy) -{ - cpufreq_cpu_put(policy); -} -EXPORT_SYMBOL(core_ctl_put_policy); - -struct device *core_ctl_find_cpu_device(unsigned cpu) -{ - return get_cpu_device(cpu); -} -EXPORT_SYMBOL(core_ctl_find_cpu_device); - -int __ref core_ctl_online_core(unsigned int cpu) -{ - int ret; - struct device *dev; - - lock_device_hotplug(); - dev = get_cpu_device(cpu); - if (!dev) { - pr_err("%s: failed to get cpu%d device\n", __func__, cpu); - ret = -ENODEV; - } else { - ret = device_online(dev); - } - unlock_device_hotplug(); - return ret; -} -EXPORT_SYMBOL(core_ctl_online_core); - -int __ref core_ctl_offline_core(unsigned int cpu) -{ - int ret; - struct device *dev; - - lock_device_hotplug(); - dev = get_cpu_device(cpu); - if (!dev) { - pr_err("%s: failed to get cpu%d device\n", __func__, cpu); - ret = -ENODEV; - } else { - ret = device_offline(dev); - } - unlock_device_hotplug(); - return ret; -} -EXPORT_SYMBOL(core_ctl_offline_core); diff --git a/include/soc/qcom/core_ctl.h b/include/soc/qcom/core_ctl.h deleted file mode 100644 index 39bce9fc8fdd2..0000000000000 --- a/include/soc/qcom/core_ctl.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __SOC_QCOM_CORE_CTL_H -#define __SOC_QCOM_CORE_CTL_H - -extern void core_ctl_block_hotplug(void); -extern void core_ctl_unblock_hotplug(void); -extern s64 core_ctl_get_time(void); -extern struct cpufreq_policy *core_ctl_get_policy(int cpu); -extern void core_ctl_put_policy(struct cpufreq_policy *policy); -extern struct device *core_ctl_find_cpu_device(unsigned cpu); -extern int core_ctl_online_core(unsigned int cpu); -extern int core_ctl_offline_core(unsigned int cpu); - -#endif From 6fa527a79541c31bb717d5fc60f89b7b14b25b30 Mon Sep 17 00:00:00 2001 From: Olav Haugan Date: Thu, 18 Aug 2016 17:22:44 -0700 Subject: [PATCH 0100/1015] core_ctrl: Move core control into kernel Move core control from out-of-tree module into the kernel proper. Core control monitors load on CPUs and controls how many CPUs are available for the system to use at any point in time. This can help save power. Core control can be configured through sysfs interface. Change-Id: Ia78e701468ea3828195c2a15c9cf9fafd099804a Signed-off-by: Olav Haugan Signed-off-by: Pavankumar Kondeti --- init/Kconfig | 10 + kernel/sched/Makefile | 1 + kernel/sched/core_ctl.c | 1078 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 1089 insertions(+) create mode 100644 kernel/sched/core_ctl.c diff --git a/init/Kconfig b/init/Kconfig index c325946ceecb3..213ea095b3ed1 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1172,6 +1172,16 @@ config SCHED_HMP_CSTATE_AWARE with CPUs C-state. If this is enabled, scheduler places tasks onto the shallowest C-state CPU among the most power efficient CPUs. +config SCHED_CORE_CTL + bool "QTI Core Control" + depends on SMP + help + This options enables the core control functionality in + the scheduler. Core control automatically offline and + online cores based on cpu load and utilization. + + If unsure, say N here. + config SCHED_QHMP bool "QHMP scheduler extensions" depends on SCHED_HMP diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile index 45679c741541e..15cb264f1aff4 100644 --- a/kernel/sched/Makefile +++ b/kernel/sched/Makefile @@ -25,3 +25,4 @@ obj-$(CONFIG_SCHED_AUTOGROUP) += auto_group.o obj-$(CONFIG_SCHEDSTATS) += stats.o obj-$(CONFIG_SCHED_DEBUG) += debug.o obj-$(CONFIG_CGROUP_CPUACCT) += cpuacct.o +obj-$(CONFIG_SCHED_CORE_CTL) += core_ctl.o diff --git a/kernel/sched/core_ctl.c b/kernel/sched/core_ctl.c new file mode 100644 index 0000000000000..0280e75002189 --- /dev/null +++ b/kernel/sched/core_ctl.c @@ -0,0 +1,1078 @@ +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define MAX_CPUS_PER_GROUP 4 + +struct cpu_data { + /* Per CPU data. */ + bool inited; + bool online; + bool rejected; + bool is_busy; + bool not_preferred; + unsigned int busy; + unsigned int cpu; + struct list_head sib; + unsigned int first_cpu; + struct list_head pending_sib; + + /* Per cluster data set only on first CPU */ + unsigned int min_cpus; + unsigned int max_cpus; + unsigned int offline_delay_ms; + unsigned int busy_up_thres[MAX_CPUS_PER_GROUP]; + unsigned int busy_down_thres[MAX_CPUS_PER_GROUP]; + unsigned int online_cpus; + unsigned int avail_cpus; + unsigned int num_cpus; + unsigned int need_cpus; + unsigned int task_thres; + s64 need_ts; + struct list_head lru; + bool pending; + spinlock_t pending_lock; + bool is_big_cluster; + int nrrun; + bool nrrun_changed; + struct timer_list timer; + struct task_struct *hotplug_thread; + struct kobject kobj; + struct list_head pending_lru; +}; + +static DEFINE_PER_CPU(struct cpu_data, cpu_state); +static DEFINE_SPINLOCK(state_lock); +static DEFINE_SPINLOCK(pending_lru_lock); +static DEFINE_MUTEX(lru_lock); + +static void apply_need(struct cpu_data *f); +static void wake_up_hotplug_thread(struct cpu_data *state); +static void add_to_pending_lru(struct cpu_data *state); +static void update_lru(struct cpu_data *state); + +/* ========================= sysfs interface =========================== */ + +static ssize_t store_min_cpus(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + state->min_cpus = min(val, state->max_cpus); + wake_up_hotplug_thread(state); + + return count; +} + +static ssize_t show_min_cpus(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->min_cpus); +} + +static ssize_t store_max_cpus(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + val = min(val, state->num_cpus); + state->max_cpus = val; + state->min_cpus = min(state->min_cpus, state->max_cpus); + wake_up_hotplug_thread(state); + + return count; +} + +static ssize_t show_max_cpus(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->max_cpus); +} + +static ssize_t store_offline_delay_ms(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + state->offline_delay_ms = val; + apply_need(state); + + return count; +} + +static ssize_t show_task_thres(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->task_thres); +} + +static ssize_t store_task_thres(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + if (val < state->num_cpus) + return -EINVAL; + + state->task_thres = val; + apply_need(state); + + return count; +} + +static ssize_t show_offline_delay_ms(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->offline_delay_ms); +} + +static ssize_t store_busy_up_thres(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val[MAX_CPUS_PER_GROUP]; + int ret, i; + + ret = sscanf(buf, "%u %u %u %u\n", &val[0], &val[1], &val[2], &val[3]); + if (ret != 1 && ret != state->num_cpus) + return -EINVAL; + + if (ret == 1) { + for (i = 0; i < state->num_cpus; i++) + state->busy_up_thres[i] = val[0]; + } else { + for (i = 0; i < state->num_cpus; i++) + state->busy_up_thres[i] = val[i]; + } + apply_need(state); + return count; +} + +static ssize_t show_busy_up_thres(struct cpu_data *state, char *buf) +{ + int i, count = 0; + + for (i = 0; i < state->num_cpus; i++) + count += snprintf(buf + count, PAGE_SIZE - count, "%u ", + state->busy_up_thres[i]); + count += snprintf(buf + count, PAGE_SIZE - count, "\n"); + return count; +} + +static ssize_t store_busy_down_thres(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val[MAX_CPUS_PER_GROUP]; + int ret, i; + + ret = sscanf(buf, "%u %u %u %u\n", &val[0], &val[1], &val[2], &val[3]); + if (ret != 1 && ret != state->num_cpus) + return -EINVAL; + + if (ret == 1) { + for (i = 0; i < state->num_cpus; i++) + state->busy_down_thres[i] = val[0]; + } else { + for (i = 0; i < state->num_cpus; i++) + state->busy_down_thres[i] = val[i]; + } + apply_need(state); + return count; +} + +static ssize_t show_busy_down_thres(struct cpu_data *state, char *buf) +{ + int i, count = 0; + + for (i = 0; i < state->num_cpus; i++) + count += snprintf(buf + count, PAGE_SIZE - count, "%u ", + state->busy_down_thres[i]); + count += snprintf(buf + count, PAGE_SIZE - count, "\n"); + return count; +} + +static ssize_t store_is_big_cluster(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + state->is_big_cluster = val ? 1 : 0; + return count; +} + +static ssize_t show_is_big_cluster(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->is_big_cluster); +} + +static ssize_t show_cpus(struct cpu_data *state, char *buf) +{ + struct cpu_data *c; + ssize_t count = 0; + unsigned long flags; + + spin_lock_irqsave(&state_lock, flags); + list_for_each_entry(c, &state->lru, sib) { + count += snprintf(buf + count, PAGE_SIZE - count, + "CPU%u (%s)\n", c->cpu, + c->online ? "Online" : "Offline"); + } + spin_unlock_irqrestore(&state_lock, flags); + return count; +} + +static ssize_t show_need_cpus(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->need_cpus); +} + +static ssize_t show_online_cpus(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->online_cpus); +} + +static ssize_t show_global_state(struct cpu_data *state, char *buf) +{ + struct cpu_data *c; + ssize_t count = 0; + unsigned int cpu; + + for_each_possible_cpu(cpu) { + count += snprintf(buf + count, PAGE_SIZE - count, + "CPU%u\n", cpu); + c = &per_cpu(cpu_state, cpu); + if (!c->inited) + continue; + count += snprintf(buf + count, PAGE_SIZE - count, + "\tCPU: %u\n", c->cpu); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tOnline: %u\n", c->online); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tRejected: %u\n", c->rejected); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tFirst CPU: %u\n", c->first_cpu); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tBusy%%: %u\n", c->busy); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tIs busy: %u\n", c->is_busy); + if (c->cpu != c->first_cpu) + continue; + count += snprintf(buf + count, PAGE_SIZE - count, + "\tNr running: %u\n", c->nrrun); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tAvail CPUs: %u\n", c->avail_cpus); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tNeed CPUs: %u\n", c->need_cpus); + } + + return count; +} + +static ssize_t store_not_preferred(struct cpu_data *state, + const char *buf, size_t count) +{ + struct cpu_data *c; + unsigned int i, first_cpu; + unsigned int val[MAX_CPUS_PER_GROUP]; + int ret; + + ret = sscanf(buf, "%u %u %u %u\n", &val[0], &val[1], &val[2], &val[3]); + if (ret != 1 && ret != state->num_cpus) + return -EINVAL; + + first_cpu = state->first_cpu; + + for (i = 0; i < state->num_cpus; i++) { + c = &per_cpu(cpu_state, first_cpu); + c->not_preferred = val[i]; + first_cpu++; + } + + return count; +} + +static ssize_t show_not_preferred(struct cpu_data *state, char *buf) +{ + struct cpu_data *c; + ssize_t count = 0; + unsigned int i, first_cpu; + + first_cpu = state->first_cpu; + + for (i = 0; i < state->num_cpus; i++) { + c = &per_cpu(cpu_state, first_cpu); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tCPU:%d %u\n", first_cpu, c->not_preferred); + first_cpu++; + } + + return count; +} + +struct core_ctl_attr { + struct attribute attr; + ssize_t (*show)(struct cpu_data *, char *); + ssize_t (*store)(struct cpu_data *, const char *, size_t count); +}; + +#define core_ctl_attr_ro(_name) \ +static struct core_ctl_attr _name = \ +__ATTR(_name, 0444, show_##_name, NULL) + +#define core_ctl_attr_rw(_name) \ +static struct core_ctl_attr _name = \ +__ATTR(_name, 0644, show_##_name, store_##_name) + +core_ctl_attr_rw(min_cpus); +core_ctl_attr_rw(max_cpus); +core_ctl_attr_rw(offline_delay_ms); +core_ctl_attr_rw(busy_up_thres); +core_ctl_attr_rw(busy_down_thres); +core_ctl_attr_rw(task_thres); +core_ctl_attr_rw(is_big_cluster); +core_ctl_attr_ro(cpus); +core_ctl_attr_ro(need_cpus); +core_ctl_attr_ro(online_cpus); +core_ctl_attr_ro(global_state); +core_ctl_attr_rw(not_preferred); + +static struct attribute *default_attrs[] = { + &min_cpus.attr, + &max_cpus.attr, + &offline_delay_ms.attr, + &busy_up_thres.attr, + &busy_down_thres.attr, + &task_thres.attr, + &is_big_cluster.attr, + &cpus.attr, + &need_cpus.attr, + &online_cpus.attr, + &global_state.attr, + ¬_preferred.attr, + NULL +}; + +#define to_cpu_data(k) container_of(k, struct cpu_data, kobj) +#define to_attr(a) container_of(a, struct core_ctl_attr, attr) +static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf) +{ + struct cpu_data *data = to_cpu_data(kobj); + struct core_ctl_attr *cattr = to_attr(attr); + ssize_t ret = -EIO; + + if (cattr->show) + ret = cattr->show(data, buf); + + return ret; +} + +static ssize_t store(struct kobject *kobj, struct attribute *attr, + const char *buf, size_t count) +{ + struct cpu_data *data = to_cpu_data(kobj); + struct core_ctl_attr *cattr = to_attr(attr); + ssize_t ret = -EIO; + + if (cattr->store) + ret = cattr->store(data, buf, count); + + return ret; +} + +static const struct sysfs_ops sysfs_ops = { + .show = show, + .store = store, +}; + +static struct kobj_type ktype_core_ctl = { + .sysfs_ops = &sysfs_ops, + .default_attrs = default_attrs, +}; + +/* ==================== runqueue based core count =================== */ + +#define RQ_AVG_TOLERANCE 2 +#define RQ_AVG_DEFAULT_MS 20 +#define NR_RUNNING_TOLERANCE 5 +static unsigned int rq_avg_period_ms = RQ_AVG_DEFAULT_MS; + +static s64 rq_avg_timestamp_ms; +static struct timer_list rq_avg_timer; + +static void update_running_avg(bool trigger_update) +{ + int cpu; + struct cpu_data *pcpu; + int avg, iowait_avg, big_avg, old_nrrun; + s64 now; + unsigned long flags; + + spin_lock_irqsave(&state_lock, flags); + + now = ktime_to_ms(ktime_get()); + if (now - rq_avg_timestamp_ms < rq_avg_period_ms - RQ_AVG_TOLERANCE) { + spin_unlock_irqrestore(&state_lock, flags); + return; + } + rq_avg_timestamp_ms = now; + sched_get_nr_running_avg(&avg, &iowait_avg, &big_avg); + + spin_unlock_irqrestore(&state_lock, flags); + + /* + * Round up to the next integer if the average nr running tasks + * is within NR_RUNNING_TOLERANCE/100 of the next integer. + * If normal rounding up is used, it will allow a transient task + * to trigger online event. By the time core is onlined, the task + * has finished. + * Rounding to closest suffers same problem because scheduler + * might only provide running stats per jiffy, and a transient + * task could skew the number for one jiffy. If core control + * samples every 2 jiffies, it will observe 0.5 additional running + * average which rounds up to 1 task. + */ + avg = (avg + NR_RUNNING_TOLERANCE) / 100; + big_avg = (big_avg + NR_RUNNING_TOLERANCE) / 100; + + for_each_possible_cpu(cpu) { + pcpu = &per_cpu(cpu_state, cpu); + if (!pcpu->inited || pcpu->first_cpu != cpu) + continue; + old_nrrun = pcpu->nrrun; + /* + * Big cluster only need to take care of big tasks, but if + * there are not enough big cores, big tasks need to be run + * on little as well. Thus for little's runqueue stat, it + * has to use overall runqueue average, or derive what big + * tasks would have to be run on little. The latter approach + * is not easy to get given core control reacts much slower + * than scheduler, and can't predict scheduler's behavior. + */ + pcpu->nrrun = pcpu->is_big_cluster ? big_avg : avg; + if (pcpu->nrrun != old_nrrun) { + if (trigger_update) + apply_need(pcpu); + else + pcpu->nrrun_changed = true; + } + } +} + +/* adjust needed CPUs based on current runqueue information */ +static unsigned int apply_task_need(struct cpu_data *f, unsigned int new_need) +{ + /* Online all cores if there are enough tasks */ + if (f->nrrun >= f->task_thres) + return f->num_cpus; + + /* only online more cores if there are tasks to run */ + if (f->nrrun > new_need) + return new_need + 1; + + return new_need; +} + +static u64 round_to_nw_start(void) +{ + unsigned long step = msecs_to_jiffies(rq_avg_period_ms); + u64 jif = get_jiffies_64(); + + do_div(jif, step); + return (jif + 1) * step; +} + +static void rq_avg_timer_func(unsigned long not_used) +{ + update_running_avg(true); + mod_timer(&rq_avg_timer, round_to_nw_start()); +} + +/* ======================= load based core count ====================== */ + +static unsigned int apply_limits(struct cpu_data *f, unsigned int need_cpus) +{ + return min(max(f->min_cpus, need_cpus), f->max_cpus); +} + +static bool eval_need(struct cpu_data *f) +{ + unsigned long flags; + struct cpu_data *c; + unsigned int need_cpus = 0, last_need, thres_idx; + int ret = 0; + bool need_flag = false; + s64 now; + + if (unlikely(!f->inited)) + return 0; + + spin_lock_irqsave(&state_lock, flags); + thres_idx = f->online_cpus ? f->online_cpus - 1 : 0; + list_for_each_entry(c, &f->lru, sib) { + if (c->busy >= f->busy_up_thres[thres_idx]) + c->is_busy = true; + else if (c->busy < f->busy_down_thres[thres_idx]) + c->is_busy = false; + need_cpus += c->is_busy; + } + need_cpus = apply_task_need(f, need_cpus); + need_flag = apply_limits(f, need_cpus) != apply_limits(f, f->need_cpus); + last_need = f->need_cpus; + + now = ktime_to_ms(ktime_get()); + + if (need_cpus == last_need) { + f->need_ts = now; + spin_unlock_irqrestore(&state_lock, flags); + return 0; + } + + if (need_cpus > last_need) { + ret = 1; + } else if (need_cpus < last_need) { + s64 elapsed = now - f->need_ts; + + if (elapsed >= f->offline_delay_ms) { + ret = 1; + } else { + mod_timer(&f->timer, jiffies + + msecs_to_jiffies(f->offline_delay_ms)); + } + } + + if (ret) { + f->need_ts = now; + f->need_cpus = need_cpus; + } + + trace_core_ctl_eval_need(f->cpu, last_need, need_cpus, + ret && need_flag); + spin_unlock_irqrestore(&state_lock, flags); + + return ret && need_flag; +} + +static void apply_need(struct cpu_data *f) +{ + if (eval_need(f)) + wake_up_hotplug_thread(f); +} + +static int core_ctl_set_busy(unsigned int cpu, unsigned int busy) +{ + struct cpu_data *c = &per_cpu(cpu_state, cpu); + struct cpu_data *f; + unsigned int old_is_busy = c->is_busy; + + if (!c->inited) + return 0; + f = &per_cpu(cpu_state, c->first_cpu); + + update_running_avg(false); + if (c->busy == busy && !f->nrrun_changed) + return 0; + c->busy = busy; + f->nrrun_changed = false; + + apply_need(f); + trace_core_ctl_set_busy(cpu, busy, old_is_busy, c->is_busy); + return 0; +} + +/* ========================= core count enforcement ==================== */ + +/* + * If current thread is hotplug thread, don't attempt to wake up + * itself or other hotplug threads because it will deadlock. Instead, + * schedule a timer to fire in next timer tick and wake up the thread. + */ +static void wake_up_hotplug_thread(struct cpu_data *state) +{ + unsigned long flags; + int cpu; + struct cpu_data *pcpu; + bool no_wakeup = false; + + for_each_possible_cpu(cpu) { + pcpu = &per_cpu(cpu_state, cpu); + if (cpu != pcpu->first_cpu) + continue; + if (pcpu->hotplug_thread == current) { + no_wakeup = true; + break; + } + } + + spin_lock_irqsave(&state->pending_lock, flags); + state->pending = true; + spin_unlock_irqrestore(&state->pending_lock, flags); + + if (no_wakeup) { + spin_lock_irqsave(&state_lock, flags); + mod_timer(&state->timer, jiffies); + spin_unlock_irqrestore(&state_lock, flags); + } else { + wake_up_process(state->hotplug_thread); + } +} + +static void core_ctl_timer_func(unsigned long cpu) +{ + struct cpu_data *state = &per_cpu(cpu_state, cpu); + unsigned long flags; + + if (eval_need(state)) { + spin_lock_irqsave(&state->pending_lock, flags); + state->pending = true; + spin_unlock_irqrestore(&state->pending_lock, flags); + wake_up_process(state->hotplug_thread); + } + +} + +static int core_ctl_online_core(unsigned int cpu) +{ + int ret; + struct device *dev; + + lock_device_hotplug(); + dev = get_cpu_device(cpu); + if (!dev) { + pr_err("%s: failed to get cpu%d device\n", __func__, cpu); + ret = -ENODEV; + } else { + ret = device_online(dev); + } + unlock_device_hotplug(); + return ret; +} + +static int core_ctl_offline_core(unsigned int cpu) +{ + int ret; + struct device *dev; + + lock_device_hotplug(); + dev = get_cpu_device(cpu); + if (!dev) { + pr_err("%s: failed to get cpu%d device\n", __func__, cpu); + ret = -ENODEV; + } else { + ret = device_offline(dev); + } + unlock_device_hotplug(); + return ret; +} + +static void update_lru(struct cpu_data *f) +{ + struct cpu_data *c, *tmp; + unsigned long flags; + + spin_lock_irqsave(&pending_lru_lock, flags); + spin_lock(&state_lock); + + list_for_each_entry_safe(c, tmp, &f->pending_lru, pending_sib) { + list_del_init(&c->pending_sib); + list_del(&c->sib); + list_add_tail(&c->sib, &f->lru); + } + + spin_unlock(&state_lock); + spin_unlock_irqrestore(&pending_lru_lock, flags); +} + +static void __ref do_hotplug(struct cpu_data *f) +{ + unsigned int need; + struct cpu_data *c, *tmp; + + need = apply_limits(f, f->need_cpus); + pr_debug("Trying to adjust group %u to %u\n", f->first_cpu, need); + + mutex_lock(&lru_lock); + if (f->online_cpus > need) { + list_for_each_entry_safe(c, tmp, &f->lru, sib) { + if (!c->online) + continue; + + if (f->online_cpus == need) + break; + + /* Don't offline busy CPUs. */ + if (c->is_busy) + continue; + + pr_debug("Trying to Offline CPU%u\n", c->cpu); + if (core_ctl_offline_core(c->cpu)) + pr_debug("Unable to Offline CPU%u\n", c->cpu); + } + + /* + * If the number of online CPUs is within the limits, then + * don't force any busy CPUs offline. + */ + if (f->online_cpus <= f->max_cpus) + goto done; + + list_for_each_entry_safe(c, tmp, &f->lru, sib) { + if (!c->online) + continue; + + if (f->online_cpus <= f->max_cpus) + break; + + pr_debug("Trying to Offline CPU%u\n", c->cpu); + if (core_ctl_offline_core(c->cpu)) + pr_debug("Unable to Offline CPU%u\n", c->cpu); + } + } else if (f->online_cpus < need) { + list_for_each_entry_safe(c, tmp, &f->lru, sib) { + if (c->online || c->rejected || c->not_preferred) + continue; + if (f->online_cpus == need) + break; + + pr_debug("Trying to Online CPU%u\n", c->cpu); + if (core_ctl_online_core(c->cpu)) + pr_debug("Unable to Online CPU%u\n", c->cpu); + } + + if (f->online_cpus == need) + goto done; + + + list_for_each_entry_safe(c, tmp, &f->lru, sib) { + if (c->online || c->rejected || !c->not_preferred) + continue; + if (f->online_cpus == need) + break; + + pr_debug("Trying to Online CPU%u\n", c->cpu); + if (core_ctl_online_core(c->cpu)) + pr_debug("Unable to Online CPU%u\n", c->cpu); + } + } +done: + mutex_unlock(&lru_lock); + update_lru(f); +} + +static int __ref try_hotplug(void *data) +{ + struct cpu_data *f = data; + unsigned long flags; + + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + spin_lock_irqsave(&f->pending_lock, flags); + if (!f->pending) { + spin_unlock_irqrestore(&f->pending_lock, flags); + schedule(); + if (kthread_should_stop()) + break; + spin_lock_irqsave(&f->pending_lock, flags); + } + set_current_state(TASK_RUNNING); + f->pending = false; + spin_unlock_irqrestore(&f->pending_lock, flags); + + do_hotplug(f); + } + + return 0; +} + +static void add_to_pending_lru(struct cpu_data *state) +{ + unsigned long flags; + struct cpu_data *f = &per_cpu(cpu_state, state->first_cpu); + + spin_lock_irqsave(&pending_lru_lock, flags); + + if (!list_empty(&state->pending_sib)) + list_del(&state->pending_sib); + list_add_tail(&state->pending_sib, &f->pending_lru); + + spin_unlock_irqrestore(&pending_lru_lock, flags); +} + +static int __ref cpu_callback(struct notifier_block *nfb, + unsigned long action, void *hcpu) +{ + uint32_t cpu = (uintptr_t)hcpu; + struct cpu_data *state = &per_cpu(cpu_state, cpu); + struct cpu_data *f; + int ret = NOTIFY_OK; + unsigned long flags; + + /* Don't affect suspend resume */ + if (action & CPU_TASKS_FROZEN) + return NOTIFY_OK; + + if (unlikely(!state->inited)) + return NOTIFY_OK; + + f = &per_cpu(cpu_state, state->first_cpu); + + switch (action) { + case CPU_UP_PREPARE: + + /* If online state of CPU somehow got out of sync, fix it. */ + if (state->online) { + f->online_cpus--; + state->online = false; + pr_warn("CPU%d offline when state is online\n", cpu); + } + + if (state->rejected) { + state->rejected = false; + f->avail_cpus++; + } + + /* + * If a CPU is in the process of coming up, mark it as online + * so that there's no race with hotplug thread bringing up more + * CPUs than necessary. + */ + if (apply_limits(f, f->need_cpus) <= f->online_cpus) { + pr_debug("Prevent CPU%d onlining\n", cpu); + ret = NOTIFY_BAD; + } else { + state->online = true; + f->online_cpus++; + } + break; + + case CPU_ONLINE: + /* + * Moving to the end of the list should only happen in + * CPU_ONLINE and not on CPU_UP_PREPARE to prevent an + * infinite list traversal when thermal (or other entities) + * reject trying to online CPUs. + */ + ret = mutex_trylock(&lru_lock); + if (ret) { + spin_lock_irqsave(&state_lock, flags); + list_del(&state->sib); + list_add_tail(&state->sib, &f->lru); + spin_unlock_irqrestore(&state_lock, flags); + mutex_unlock(&lru_lock); + } else { + /* + * lru_lock is held by our hotplug thread to + * prevent concurrent access of lru list. The updates + * are maintained in pending_lru list and lru is + * updated at the end of do_hotplug(). + */ + add_to_pending_lru(state); + } + break; + + case CPU_DEAD: + /* Move a CPU to the end of the LRU when it goes offline. */ + ret = mutex_trylock(&lru_lock); + if (ret) { + spin_lock_irqsave(&state_lock, flags); + list_del(&state->sib); + list_add_tail(&state->sib, &f->lru); + spin_unlock_irqrestore(&state_lock, flags); + mutex_unlock(&lru_lock); + } else { + add_to_pending_lru(state); + } + /* Fall through */ + + case CPU_UP_CANCELED: + + /* If online state of CPU somehow got out of sync, fix it. */ + if (!state->online) { + f->online_cpus++; + pr_warn("CPU%d online when state is offline\n", cpu); + } + + if (!state->rejected && action == CPU_UP_CANCELED) { + state->rejected = true; + f->avail_cpus--; + } + + state->online = false; + state->busy = 0; + f->online_cpus--; + break; + } + + if (f->online_cpus < apply_limits(f, f->need_cpus) + && f->online_cpus < f->avail_cpus + && action == CPU_DEAD) + wake_up_hotplug_thread(f); + + return ret; +} + +static struct notifier_block __refdata cpu_notifier = { + .notifier_call = cpu_callback, +}; + +/* ============================ init code ============================== */ + +static int group_init(struct cpumask *mask) +{ + struct device *dev; + unsigned int first_cpu = cpumask_first(mask); + struct cpu_data *f = &per_cpu(cpu_state, first_cpu); + struct cpu_data *state; + unsigned int cpu; + struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; + + if (likely(f->inited)) + return 0; + + dev = get_cpu_device(first_cpu); + if (!dev) + return -ENODEV; + + pr_info("Creating CPU group %d\n", first_cpu); + + f->num_cpus = cpumask_weight(mask); + if (f->num_cpus > MAX_CPUS_PER_GROUP) { + pr_err("HW configuration not supported\n"); + return -EINVAL; + } + f->min_cpus = 1; + f->max_cpus = f->num_cpus; + f->need_cpus = f->num_cpus; + f->avail_cpus = f->num_cpus; + f->offline_delay_ms = 100; + f->task_thres = UINT_MAX; + f->nrrun = f->num_cpus; + INIT_LIST_HEAD(&f->lru); + INIT_LIST_HEAD(&f->pending_lru); + init_timer(&f->timer); + spin_lock_init(&f->pending_lock); + f->timer.function = core_ctl_timer_func; + f->timer.data = first_cpu; + + for_each_cpu(cpu, mask) { + pr_info("Init CPU%u state\n", cpu); + + state = &per_cpu(cpu_state, cpu); + state->cpu = cpu; + state->first_cpu = first_cpu; + + if (cpu_online(cpu)) { + f->online_cpus++; + state->online = true; + } + + list_add_tail(&state->sib, &f->lru); + INIT_LIST_HEAD(&state->pending_sib); + } + + f->hotplug_thread = kthread_run(try_hotplug, (void *) f, + "core_ctl/%d", first_cpu); + if (IS_ERR(f->hotplug_thread)) + return PTR_ERR(f->hotplug_thread); + sched_setscheduler_nocheck(f->hotplug_thread, SCHED_FIFO, ¶m); + + for_each_cpu(cpu, mask) { + state = &per_cpu(cpu_state, cpu); + state->inited = true; + } + + kobject_init(&f->kobj, &ktype_core_ctl); + return kobject_add(&f->kobj, &dev->kobj, "core_ctl"); +} + +static int cpufreq_policy_cb(struct notifier_block *nb, unsigned long val, + void *data) +{ + struct cpufreq_policy *policy = data; + + switch (val) { + case CPUFREQ_CREATE_POLICY: + group_init(policy->related_cpus); + break; + } + + return NOTIFY_OK; +} + +static struct notifier_block cpufreq_pol_nb = { + .notifier_call = cpufreq_policy_cb, +}; + +static int cpufreq_gov_cb(struct notifier_block *nb, unsigned long val, + void *data) +{ + struct cpufreq_govinfo *info = data; + + switch (val) { + case CPUFREQ_LOAD_CHANGE: + core_ctl_set_busy(info->cpu, info->load); + break; + } + + return NOTIFY_OK; +} + +static struct notifier_block cpufreq_gov_nb = { + .notifier_call = cpufreq_gov_cb, +}; + +static int __init core_ctl_init(void) +{ + struct cpufreq_policy *policy; + unsigned int cpu; + + register_cpu_notifier(&cpu_notifier); + cpufreq_register_notifier(&cpufreq_pol_nb, CPUFREQ_POLICY_NOTIFIER); + cpufreq_register_notifier(&cpufreq_gov_nb, CPUFREQ_GOVINFO_NOTIFIER); + init_timer_deferrable(&rq_avg_timer); + rq_avg_timer.function = rq_avg_timer_func; + + get_online_cpus(); + for_each_online_cpu(cpu) { + policy = cpufreq_cpu_get(cpu); + if (policy) { + group_init(policy->related_cpus); + cpufreq_cpu_put(policy); + } + } + put_online_cpus(); + mod_timer(&rq_avg_timer, round_to_nw_start()); + return 0; +} + +late_initcall(core_ctl_init); From e3e179b299a72a6d52cbd676c840c0883805c677 Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Thu, 8 Sep 2016 15:52:22 +0530 Subject: [PATCH 0101/1015] sched: Add a knob to disable the core_ctl The CPU hotplug tests does not work with core_ctl compiled statically into kernel. Provide an interface to disable the hotplug by core_ctl. Change-Id: I61ea36332f21e8f456bdfba8b89dd4d148020b61 Signed-off-by: Pavankumar Kondeti --- kernel/sched/core_ctl.c | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/kernel/sched/core_ctl.c b/kernel/sched/core_ctl.c index 9363a0615a82d..0897b8d7685d0 100644 --- a/kernel/sched/core_ctl.c +++ b/kernel/sched/core_ctl.c @@ -60,6 +60,7 @@ struct cpu_data { struct task_struct *hotplug_thread; struct kobject kobj; struct list_head pending_lru; + bool disabled; }; static DEFINE_PER_CPU(struct cpu_data, cpu_state); @@ -294,6 +295,9 @@ static ssize_t show_global_state(struct cpu_data *state, char *buf) "\tAvail CPUs: %u\n", c->avail_cpus); count += snprintf(buf + count, PAGE_SIZE - count, "\tNeed CPUs: %u\n", c->need_cpus); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tStatus: %s\n", + c->disabled ? "disabled" : "enabled"); } return count; @@ -340,6 +344,33 @@ static ssize_t show_not_preferred(struct cpu_data *state, char *buf) return count; } +static ssize_t store_disable(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + val = !!val; + + if (state->disabled == val) + return count; + + state->disabled = val; + + if (!state->disabled) + wake_up_hotplug_thread(state); + + + return count; +} + +static ssize_t show_disable(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->disabled); +} + struct core_ctl_attr { struct attribute attr; ssize_t (*show)(struct cpu_data *, char *); @@ -366,6 +397,7 @@ core_ctl_attr_ro(need_cpus); core_ctl_attr_ro(online_cpus); core_ctl_attr_ro(global_state); core_ctl_attr_rw(not_preferred); +core_ctl_attr_rw(disable); static struct attribute *default_attrs[] = { &min_cpus.attr, @@ -380,6 +412,7 @@ static struct attribute *default_attrs[] = { &online_cpus.attr, &global_state.attr, ¬_preferred.attr, + &disable.attr, NULL }; @@ -624,6 +657,9 @@ static void wake_up_hotplug_thread(struct cpu_data *state) struct cpu_data *pcpu; bool no_wakeup = false; + if (unlikely(state->disabled)) + return; + for_each_possible_cpu(cpu) { pcpu = &per_cpu(cpu_state, cpu); if (cpu != pcpu->first_cpu) @@ -652,7 +688,7 @@ static void core_ctl_timer_func(unsigned long cpu) struct cpu_data *state = &per_cpu(cpu_state, cpu); unsigned long flags; - if (eval_need(state)) { + if (eval_need(state) && !state->disabled) { spin_lock_irqsave(&state->pending_lock, flags); state->pending = true; spin_unlock_irqrestore(&state->pending_lock, flags); @@ -866,7 +902,8 @@ static int __ref cpu_callback(struct notifier_block *nfb, * so that there's no race with hotplug thread bringing up more * CPUs than necessary. */ - if (apply_limits(f, f->need_cpus) <= f->online_cpus) { + if (!f->disabled && + apply_limits(f, f->need_cpus) <= f->online_cpus) { pr_debug("Prevent CPU%d onlining\n", cpu); ret = NOTIFY_BAD; } else { From 67b0bf0c29de5efdc81f413b0909cf1fd16930a8 Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Mon, 29 Aug 2016 16:14:00 +0530 Subject: [PATCH 0102/1015] defconfig: msm8937/msm8940: Enable core control core control enables you to save power by controlling how many cores are being used depending on the load in the system. Change-Id: Ic7b2bbf54716de47184a65fd001f0aa325a32af7 Signed-off-by: Olav Haugan Signed-off-by: Pavankumar Kondeti --- arch/arm/configs/msm8937-perf_defconfig | 1 + arch/arm/configs/msm8937_defconfig | 1 + arch/arm64/configs/msm8937-perf_defconfig | 1 + arch/arm64/configs/msm8937_defconfig | 1 + 4 files changed, 4 insertions(+) diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index 2a0e2524e5a45..e491140460305 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -15,6 +15,7 @@ CONFIG_RESOURCE_COUNTERS=y CONFIG_CGROUP_SCHED=y CONFIG_RT_GROUP_SCHED=y CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y CONFIG_SCHED_QHMP=y CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index 636dec204d6e3..a304af4a22fde 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -15,6 +15,7 @@ CONFIG_RESOURCE_COUNTERS=y CONFIG_CGROUP_SCHED=y CONFIG_RT_GROUP_SCHED=y CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y CONFIG_SCHED_QHMP=y CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index b564b93d178f5..0dbe5b5445e14 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -14,6 +14,7 @@ CONFIG_RESOURCE_COUNTERS=y CONFIG_CGROUP_SCHED=y CONFIG_RT_GROUP_SCHED=y CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y CONFIG_SCHED_QHMP=y CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index b106b47456235..115c16d8da05c 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -14,6 +14,7 @@ CONFIG_RESOURCE_COUNTERS=y CONFIG_CGROUP_SCHED=y CONFIG_RT_GROUP_SCHED=y CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y CONFIG_SCHED_QHMP=y CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set From 4281d8694dada60b48cc9663e6c6ea197367e00c Mon Sep 17 00:00:00 2001 From: Kiran Gunda Date: Mon, 1 Aug 2016 15:22:02 +0530 Subject: [PATCH 0103/1015] msm: msm_bus: add bandwidth query support Provide the bandwidth query API support and also send the current bandwidth in the callback. CRs-Fixed: 1045782 Change-Id: I5ac6bc515bb7be6e5a2010b83b682666f3ef8ca5 Signed-off-by: Kiran Gunda --- drivers/platform/msm/msm_bus/msm_bus_rules.c | 51 ++++++++++++++++++++ include/linux/msm_bus_rules.h | 8 +++ 2 files changed, 59 insertions(+) diff --git a/drivers/platform/msm/msm_bus/msm_bus_rules.c b/drivers/platform/msm/msm_bus/msm_bus_rules.c index 7cb05d8ba2dd1..60b2b8b78bbe5 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_rules.c +++ b/drivers/platform/msm/msm_bus/msm_bus_rules.c @@ -219,6 +219,7 @@ static bool check_rule(struct rules_def *rule) ret = do_compare_op(src_field, rule->rule_ops.thresh[i], rule->rule_ops.op[i]); + rule->rule_ops.curr_bw = src_field; if (rule->rule_ops.combo_op == OP_AND) { if (!ret) return ret; @@ -710,6 +711,56 @@ void msm_rule_unregister(int num_rules, struct bus_rule_type *rule, mutex_unlock(&msm_bus_rules_lock); } +int msm_rule_query_bandwidth(struct bus_rule_type *rule, + u64 *bw, struct notifier_block *nb) +{ + struct rule_node_info *node = NULL; + struct rules_def *node_rule; + int ret = -ENXIO; + + if (!rule) { + pr_err("%s: invalid rule pointer", __func__); + return ret; + } + + mutex_lock(&msm_bus_rules_lock); + if (nb) { + node = get_node(NB_ID, nb); + if (!node) { + pr_err("%s: Can't find node", __func__); + goto exit_rule_not_found; + } + list_for_each_entry(node_rule, + &node->node_rules, link) { + if (comp_rules(&node_rule->rule_ops, + rule) == 0) { + *bw = node_rule->rule_ops.curr_bw; + ret = 0; + break; + } + } + } else { + list_for_each_entry(node, &node_list, link) { + list_for_each_entry(node_rule, + &node->node_rules, link) { + if (comp_rules(&node_rule->rule_ops, + rule) == 0) { + *bw = node_rule->rule_ops.curr_bw; + ret = 0; + break; + } + } + } + } + + if (ret) + pr_err("%s: can't find the rule", __func__); + +exit_rule_not_found: + mutex_unlock(&msm_bus_rules_lock); + return ret; +} + bool msm_rule_update(struct bus_rule_type *old_rule, struct bus_rule_type *new_rule, struct notifier_block *nb) diff --git a/include/linux/msm_bus_rules.h b/include/linux/msm_bus_rules.h index 76e56746cca3b..5397afef06a11 100644 --- a/include/linux/msm_bus_rules.h +++ b/include/linux/msm_bus_rules.h @@ -50,6 +50,7 @@ struct bus_rule_type { u64 dst_bw; int mode; void *client_data; + u64 curr_bw; }; #if (defined(CONFIG_BUS_TOPOLOGY_ADHOC)) @@ -63,6 +64,8 @@ bool msm_rule_update(struct bus_rule_type *old_rule, void msm_rule_evaluate_rules(int node); void print_rules_buf(char *buf, int count); bool msm_rule_are_rules_registered(void); +int msm_rule_query_bandwidth(struct bus_rule_type *rule, + u64 *bw, struct notifier_block *nb); #else static inline void msm_rule_register(int num_rules, struct bus_rule_type *rule, struct notifier_block *nb) @@ -89,5 +92,10 @@ static inline bool msm_rule_update(struct bus_rule_type *old_rule, static inline void msm_rule_evaluate_rules(int node) { } +static inline int msm_rule_query_bandwidth(struct bus_rule_type *rule, + u64 *bw, struct notifier_block *nb) +{ + return false; +} #endif /* defined(CONFIG_BUS_TOPOLOGY_ADHOC) */ #endif /* _ARCH_ARM_MACH_MSM_BUS_RULES_H */ From 41eb9c1a986791ac1c3104d1d889ac6490a9e9ca Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Mon, 29 Aug 2016 21:58:32 +0530 Subject: [PATCH 0104/1015] misc: qcom: qdsp6v2: initialize config_32 Not all memebers of config_32 are set before they are used which might lead to invalid values being passed and used. To fix this issue initialize all member variables of struct config_32 to 0 before assigning specific values individually. CRs-Fixed: 1058826 Change-Id: Ifea3a6e8bf45481c65a4455ee64318304798fee2 Signed-off-by: Laxminath Kasam --- drivers/misc/qcom/qdsp6v2/aac_in.c | 4 +++- drivers/misc/qcom/qdsp6v2/amrnb_in.c | 4 +++- drivers/misc/qcom/qdsp6v2/amrwb_in.c | 2 ++ drivers/misc/qcom/qdsp6v2/audio_alac.c | 2 ++ drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c | 4 ++++ drivers/misc/qcom/qdsp6v2/audio_ape.c | 2 ++ drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c | 2 ++ drivers/misc/qcom/qdsp6v2/audio_multi_aac.c | 2 ++ drivers/misc/qcom/qdsp6v2/audio_utils_aio.c | 1 + drivers/misc/qcom/qdsp6v2/audio_wmapro.c | 2 ++ drivers/misc/qcom/qdsp6v2/evrc_in.c | 4 +++- drivers/misc/qcom/qdsp6v2/qcelp_in.c | 4 +++- 12 files changed, 29 insertions(+), 4 deletions(-) diff --git a/drivers/misc/qcom/qdsp6v2/aac_in.c b/drivers/misc/qcom/qdsp6v2/aac_in.c index c9d5dbb0b3136..7176c114f85b2 100644 --- a/drivers/misc/qcom/qdsp6v2/aac_in.c +++ b/drivers/misc/qcom/qdsp6v2/aac_in.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -421,6 +421,8 @@ static long aac_in_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_aac_enc_config cfg; struct msm_audio_aac_enc_config32 cfg_32; + memset(&cfg_32, 0, sizeof(cfg_32)); + cmd = AUDIO_GET_AAC_ENC_CONFIG; rc = aac_in_ioctl_shared(file, cmd, &cfg); if (rc) { diff --git a/drivers/misc/qcom/qdsp6v2/amrnb_in.c b/drivers/misc/qcom/qdsp6v2/amrnb_in.c index eb92137f06717..0aed0860e803c 100644 --- a/drivers/misc/qcom/qdsp6v2/amrnb_in.c +++ b/drivers/misc/qcom/qdsp6v2/amrnb_in.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2012, 2014 The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2012, 2014, 2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -221,6 +221,8 @@ static long amrnb_in_compat_ioctl(struct file *file, struct msm_audio_amrnb_enc_config_v2 *amrnb_config; struct msm_audio_amrnb_enc_config_v2_32 amrnb_config_32; + memset(&amrnb_config_32, 0, sizeof(amrnb_config_32)); + amrnb_config = (struct msm_audio_amrnb_enc_config_v2 *)audio->enc_cfg; amrnb_config_32.band_mode = amrnb_config->band_mode; diff --git a/drivers/misc/qcom/qdsp6v2/amrwb_in.c b/drivers/misc/qcom/qdsp6v2/amrwb_in.c index 9bd19d97c6fce..43dcbd597d7c4 100644 --- a/drivers/misc/qcom/qdsp6v2/amrwb_in.c +++ b/drivers/misc/qcom/qdsp6v2/amrwb_in.c @@ -217,6 +217,8 @@ static long amrwb_in_compat_ioctl(struct file *file, struct msm_audio_amrwb_enc_config *amrwb_config; struct msm_audio_amrwb_enc_config_32 amrwb_config_32; + memset(&amrwb_config_32, 0, sizeof(amrwb_config_32)); + amrwb_config = (struct msm_audio_amrwb_enc_config *)audio->enc_cfg; amrwb_config_32.band_mode = amrwb_config->band_mode; diff --git a/drivers/misc/qcom/qdsp6v2/audio_alac.c b/drivers/misc/qcom/qdsp6v2/audio_alac.c index 7b18e3ae34126..646d37da1ba3f 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_alac.c +++ b/drivers/misc/qcom/qdsp6v2/audio_alac.c @@ -196,6 +196,8 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_alac_config *alac_config; struct msm_audio_alac_config_32 alac_config_32; + memset(&alac_config_32, 0, sizeof(alac_config_32)); + alac_config = (struct msm_audio_alac_config *)audio->codec_cfg; alac_config_32.frameLength = alac_config->frameLength; alac_config_32.compatVersion = diff --git a/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c b/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c index e96e23a4d5f43..3c3f1c4927fd9 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c +++ b/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c @@ -205,6 +205,10 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_amrwbplus_config_v2 *amrwbplus_config; struct msm_audio_amrwbplus_config_v2_32 amrwbplus_config_32; + + memset(&amrwbplus_config_32, 0, + sizeof(amrwbplus_config_32)); + amrwbplus_config = (struct msm_audio_amrwbplus_config_v2 *) audio->codec_cfg; diff --git a/drivers/misc/qcom/qdsp6v2/audio_ape.c b/drivers/misc/qcom/qdsp6v2/audio_ape.c index 8d78124cfd072..737151279c27c 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_ape.c +++ b/drivers/misc/qcom/qdsp6v2/audio_ape.c @@ -180,6 +180,8 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_ape_config *ape_config; struct msm_audio_ape_config_32 ape_config_32; + memset(&ape_config_32, 0, sizeof(ape_config_32)); + ape_config = (struct msm_audio_ape_config *)audio->codec_cfg; ape_config_32.compatibleVersion = ape_config->compatibleVersion; ape_config_32.compressionLevel = diff --git a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c index 6843fd761dd76..940fd08654d24 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c +++ b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c @@ -630,6 +630,8 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, case AUDIO_EFFECTS_GET_BUF_AVAIL32: { struct msm_hwacc_buf_avail32 buf_avail; + memset(&buf_avail, 0, sizeof(buf_avail)); + buf_avail.input_num_avail = atomic_read(&effects->in_count); buf_avail.output_num_avail = atomic_read(&effects->out_count); pr_debug("%s: write buf avail: %d, read buf avail: %d\n", diff --git a/drivers/misc/qcom/qdsp6v2/audio_multi_aac.c b/drivers/misc/qcom/qdsp6v2/audio_multi_aac.c index 858f7bc3d9069..4ac74a5635c09 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_multi_aac.c +++ b/drivers/misc/qcom/qdsp6v2/audio_multi_aac.c @@ -302,6 +302,8 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_aac_config *aac_config; struct msm_audio_aac_config32 aac_config_32; + memset(&aac_config_32, 0, sizeof(aac_config_32)); + aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; aac_config_32.format = aac_config->format; aac_config_32.audio_object = aac_config->audio_object; diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c index 4edc8145bfd45..2b0af2ea7ae63 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c @@ -2038,6 +2038,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, audio->buf_cfg.frames_per_buf); mutex_lock(&audio->lock); + memset(&cfg_32, 0, sizeof(cfg_32)); cfg_32.meta_info_enable = audio->buf_cfg.meta_info_enable; cfg_32.frames_per_buf = audio->buf_cfg.frames_per_buf; if (copy_to_user((void *)arg, &cfg_32, diff --git a/drivers/misc/qcom/qdsp6v2/audio_wmapro.c b/drivers/misc/qcom/qdsp6v2/audio_wmapro.c index 2c88e77e95bb2..d389d9b740425 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_wmapro.c +++ b/drivers/misc/qcom/qdsp6v2/audio_wmapro.c @@ -217,6 +217,8 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_wmapro_config *wmapro_config; struct msm_audio_wmapro_config32 wmapro_config_32; + memset(&wmapro_config_32, 0, sizeof(wmapro_config_32)); + wmapro_config = (struct msm_audio_wmapro_config *)audio->codec_cfg; wmapro_config_32.armdatareqthr = wmapro_config->armdatareqthr; diff --git a/drivers/misc/qcom/qdsp6v2/evrc_in.c b/drivers/misc/qcom/qdsp6v2/evrc_in.c index 2f931be226c6d..aab8e27c00941 100644 --- a/drivers/misc/qcom/qdsp6v2/evrc_in.c +++ b/drivers/misc/qcom/qdsp6v2/evrc_in.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -224,6 +224,8 @@ static long evrc_in_compat_ioctl(struct file *file, struct msm_audio_evrc_enc_config32 cfg_32; struct msm_audio_evrc_enc_config *enc_cfg; + memset(&cfg_32, 0, sizeof(cfg_32)); + enc_cfg = audio->enc_cfg; cfg_32.cdma_rate = enc_cfg->cdma_rate; cfg_32.min_bit_rate = enc_cfg->min_bit_rate; diff --git a/drivers/misc/qcom/qdsp6v2/qcelp_in.c b/drivers/misc/qcom/qdsp6v2/qcelp_in.c index b5d5ad113722c..aabf5d33a507f 100644 --- a/drivers/misc/qcom/qdsp6v2/qcelp_in.c +++ b/drivers/misc/qcom/qdsp6v2/qcelp_in.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -225,6 +225,8 @@ static long qcelp_in_compat_ioctl(struct file *file, struct msm_audio_qcelp_enc_config32 cfg_32; struct msm_audio_qcelp_enc_config *enc_cfg; + memset(&cfg_32, 0, sizeof(cfg_32)); + enc_cfg = (struct msm_audio_qcelp_enc_config *)audio->enc_cfg; cfg_32.cdma_rate = enc_cfg->cdma_rate; cfg_32.min_bit_rate = enc_cfg->min_bit_rate; From 14ec1c315a6f6d73b2f336c1fbcb42e90ade3d79 Mon Sep 17 00:00:00 2001 From: Shilpa Mamidi Date: Mon, 12 Sep 2016 20:26:54 +0530 Subject: [PATCH 0105/1015] msm: isp: Add different flags in spin lock While doing sequential spin lock use different flag. Change-Id: I7b90f2896b8ca94a7a9150684d1885e24dc0a6f2 Signed-off-by: Shilpa Mamidi --- drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index ea7e70e9d6be3..a0869477bcfc8 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -1449,7 +1449,7 @@ void msm_isp_axi_cfg_update(struct vfe_device *vfe_dev, { int i, j; uint32_t update_state; - unsigned long flags; + unsigned long flags, flags1; struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; struct msm_vfe_axi_stream *stream_info; int num_stream = 0; @@ -1468,7 +1468,7 @@ void msm_isp_axi_cfg_update(struct vfe_device *vfe_dev, !stream_info->controllable_output) || stream_info->state == AVAILABLE) continue; - spin_lock_irqsave(&stream_info->lock, flags); + spin_lock_irqsave(&stream_info->lock, flags1); if (stream_info->state == PAUSING) { /*AXI Stopped, apply update*/ stream_info->state = PAUSED; @@ -1482,7 +1482,7 @@ void msm_isp_axi_cfg_update(struct vfe_device *vfe_dev, } else if (stream_info->state == RESUMING) { msm_isp_update_dual_HW_axi(vfe_dev, stream_info); } - spin_unlock_irqrestore(&stream_info->lock, flags); + spin_unlock_irqrestore(&stream_info->lock, flags1); } spin_unlock_irqrestore(&vfe_dev->common_data->common_dev_data_lock, flags); From ce6efe32c8910e5bc0fe197cdf9612e1a257894f Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Tue, 13 Sep 2016 11:19:23 -0700 Subject: [PATCH 0106/1015] msm: camera: sensor: Change initializer to 0 instead of -EINVAL When FLASH_LOW / FLASH_HIGH is called multiple times the function must return success without error if the flash is already in desired state. But due to initializer -EINVAL is returned. So setting initializer to 0. CRs-Fixed: 1062351 Signed-off-by: Rajesh Bondugula Change-Id: Ie6ff66e272005bc83b3bb6ea8c353d4eb9088048 --- drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c index e9326741c9bfd..b1e0cf83faa17 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c +++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c @@ -587,7 +587,7 @@ static int32_t msm_flash_release( static int32_t msm_flash_config(struct msm_flash_ctrl_t *flash_ctrl, void __user *argp) { - int32_t rc = -EINVAL; + int32_t rc = 0; struct msm_flash_cfg_data_t *flash_data = (struct msm_flash_cfg_data_t *) argp; From 61de97c07014fa7dab4d013286f615dd7c8283d8 Mon Sep 17 00:00:00 2001 From: AnilKumar Chimata Date: Wed, 14 Sep 2016 15:44:45 +0530 Subject: [PATCH 0107/1015] qseecom: Fix issues raised by static analyser Initialize lstnr number to zero to avoid unknown behavior with uninitialized value. Change-Id: I6a76c2859b2220cf42ce6d4fcf740770aeed32f5 Signed-off-by: AnilKumar Chimata --- drivers/misc/qseecom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 083e89f8aecc1..f210206b1471b 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -1812,7 +1812,7 @@ static int __qseecom_reentrancy_process_incomplete_cmd( { int ret = 0; int rc = 0; - uint32_t lstnr; + uint32_t lstnr = 0; unsigned long flags; struct qseecom_client_listener_data_irsp send_data_rsp; struct qseecom_registered_listener_list *ptr_svc = NULL; From a7a659e9fd31de2964bed7959ed24e86d690abcf Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Fri, 19 Aug 2016 12:15:22 +0530 Subject: [PATCH 0108/1015] ARM: dts: msm: Add support of IPA for MSM8920 MSM8920 uses IPA HW to shunt data between different components like apps, modem and usb. Make a change in device tree to enable IPA node for MSM8920. Change-Id: Ia0cdcffa26633628bc190d68a483a0c5fe3af17f Acked-by: Mohammed Javid Signed-off-by: Utkarsh Saxena --- arch/arm/boot/dts/qcom/msm8920.dtsi | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index cb39777ee2ea4..f754e3cfe530d 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -120,3 +120,40 @@ &bam_dmux { status = "disabled"; }; + +&soc { + ipa_hw: qcom,ipa@07900000 { + compatible = "qcom,ipa"; + reg = <0x07900000 0x4effc>, <0x07904000 0x26934>; + reg-names = "ipa-base", "bam-base"; + interrupts = <0 228 0>, + <0 230 0>; + interrupt-names = "ipa-irq", "bam-irq"; + qcom,ipa-hw-ver = <6>; /* IPA core version = IPAv2.6L */ + qcom,ipa-hw-mode = <0>; /* IPA hw type = Normal */ + qcom,wan-rx-ring-size = <192>; /* IPA WAN-rx-ring-size*/ + qcom,lan-rx-ring-size = <192>; /* IPA LAN-rx-ring-size*/ + clock-names = "core_clk"; + clocks = <&clock_gcc clk_ipa_clk>; + qcom,ee = <0>; + qcom,use-ipa-tethering-bridge; + qcom,modem-cfg-emb-pipe-flt; + qcom,msm-bus,name = "ipa"; + qcom,msm-bus,num-cases = <3>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <90 512 0 0>, /* No BIMC vote (ab=0 Mbps, ib=0 Mbps ~ 0MHZ) */ + <90 512 100000 800000>, /* SVS (ab=100, ib=800 ~ 50MHz) */ + <90 512 100000 1200000>; /* PERF (ab=100, ib=1200 ~ 75MHz) */ + qcom,bus-vector-names = "MIN", "SVS", "PERF"; + qcom,rx-polling-sleep-ms = <3>; /* Polling sleep interval */ + qcom,ipa-polling-iteration = <15>; /* Polling Iteration */ + }; + + qcom,rmnet-ipa { + compatible = "qcom,rmnet-ipa"; + qcom,rmnet-ipa-ssr; + qcom,ipa-loaduC; + qcom,ipa-advertise-sg-support; + }; +}; From 9971f63d7b51fbf68e120c8ce2be99695814beae Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Tue, 22 Mar 2016 18:02:50 +0100 Subject: [PATCH 0109/1015] netfilter: x_tables: make sure e->next_offset covers remaining blob size Otherwise this function may read data beyond the ruleset blob. Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Dennis Cagle Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 6e94e0cfb0887e4013b3b930fa6ab1fe6bb6ba91 (cherry picked from commit 6e94e0cfb0887e4013b3b930fa6ab1fe6bb6ba91) Change-Id: Idcfb2fffba72618a5fda1c6cc94394ed4f79be93 --- net/ipv4/netfilter/arp_tables.c | 6 ++++-- net/ipv4/netfilter/ip_tables.c | 6 ++++-- net/ipv6/netfilter/ip6_tables.c | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index a12e24856cc7d..c6a8e98dbe123 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c @@ -568,7 +568,8 @@ static inline int check_entry_size_and_hooks(struct arpt_entry *e, unsigned int h; if ((unsigned long)e % __alignof__(struct arpt_entry) != 0 || - (unsigned char *)e + sizeof(struct arpt_entry) >= limit) { + (unsigned char *)e + sizeof(struct arpt_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p\n", e); return -EINVAL; } @@ -1224,7 +1225,8 @@ check_compat_entry_size_and_hooks(struct compat_arpt_entry *e, duprintf("check_compat_entry_size_and_hooks %p\n", e); if ((unsigned long)e % __alignof__(struct compat_arpt_entry) != 0 || - (unsigned char *)e + sizeof(struct compat_arpt_entry) >= limit) { + (unsigned char *)e + sizeof(struct compat_arpt_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p, limit = %p\n", e, limit); return -EINVAL; } diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 4636fd3ff49f0..9bb6ca7cf5761 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c @@ -730,7 +730,8 @@ check_entry_size_and_hooks(struct ipt_entry *e, unsigned int h; if ((unsigned long)e % __alignof__(struct ipt_entry) != 0 || - (unsigned char *)e + sizeof(struct ipt_entry) >= limit) { + (unsigned char *)e + sizeof(struct ipt_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p\n", e); return -EINVAL; } @@ -1489,7 +1490,8 @@ check_compat_entry_size_and_hooks(struct compat_ipt_entry *e, duprintf("check_compat_entry_size_and_hooks %p\n", e); if ((unsigned long)e % __alignof__(struct compat_ipt_entry) != 0 || - (unsigned char *)e + sizeof(struct compat_ipt_entry) >= limit) { + (unsigned char *)e + sizeof(struct compat_ipt_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p, limit = %p\n", e, limit); return -EINVAL; } diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 415f1f027374a..2a0c4819e277a 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c @@ -741,7 +741,8 @@ check_entry_size_and_hooks(struct ip6t_entry *e, unsigned int h; if ((unsigned long)e % __alignof__(struct ip6t_entry) != 0 || - (unsigned char *)e + sizeof(struct ip6t_entry) >= limit) { + (unsigned char *)e + sizeof(struct ip6t_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p\n", e); return -EINVAL; } @@ -1501,7 +1502,8 @@ check_compat_entry_size_and_hooks(struct compat_ip6t_entry *e, duprintf("check_compat_entry_size_and_hooks %p\n", e); if ((unsigned long)e % __alignof__(struct compat_ip6t_entry) != 0 || - (unsigned char *)e + sizeof(struct compat_ip6t_entry) >= limit) { + (unsigned char *)e + sizeof(struct compat_ip6t_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p, limit = %p\n", e, limit); return -EINVAL; } From 9dd191d931e9271e2cc9b8f7b9dbea773e1dd4f1 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Mon, 18 Jul 2016 12:45:17 -0700 Subject: [PATCH 0110/1015] fs: ext4: disable support for fallocate FALLOC_FL_PUNCH_HOLE Bug: 28760453 Change-Id: I019c2de559db9e4b95860ab852211b456d78c4ca Signed-off-by: Nick Desaulniers Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: 8cdac916476ae01959b559a0dfae9f8b155fc9f3 Signed-off-by: Dennis Cagle --- fs/ext4/inode.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 2ea75cbeb697e..a99e660050b2f 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3408,6 +3408,7 @@ int ext4_can_truncate(struct inode *inode) int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) { +#if 0 struct super_block *sb = inode->i_sb; ext4_lblk_t first_block, stop_block; struct address_space *mapping = inode->i_mapping; @@ -3531,6 +3532,12 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) out_mutex: mutex_unlock(&inode->i_mutex); return ret; +#else + /* + * Disabled as per b/28760453 + */ + return -EOPNOTSUPP; +#endif } int ext4_inode_attach_jinode(struct inode *inode) From b8515dfb5e800c673bb4004bd65f1dfa89813f97 Mon Sep 17 00:00:00 2001 From: Guillaume Nault Date: Wed, 23 Mar 2016 16:38:55 +0100 Subject: [PATCH 0111/1015] ppp: take reference on channels netns Let channels hold a reference on their network namespace. Some channel types, like ppp_async and ppp_synctty, can have their userspace controller running in a different namespace. Therefore they can't rely on them to preclude their netns from being removed from under them. ================================================================== BUG: KASAN: use-after-free in ppp_unregister_channel+0x372/0x3a0 at addr ffff880064e217e0 Read of size 8 by task syz-executor/11581 ============================================================================= BUG net_namespace (Not tainted): kasan: bad access detected ----------------------------------------------------------------------------- Disabling lock debugging due to kernel taint INFO: Allocated in copy_net_ns+0x6b/0x1a0 age=92569 cpu=3 pid=6906 [< none >] ___slab_alloc+0x4c7/0x500 kernel/mm/slub.c:2440 [< none >] __slab_alloc+0x4c/0x90 kernel/mm/slub.c:2469 [< inline >] slab_alloc_node kernel/mm/slub.c:2532 [< inline >] slab_alloc kernel/mm/slub.c:2574 [< none >] kmem_cache_alloc+0x23a/0x2b0 kernel/mm/slub.c:2579 [< inline >] kmem_cache_zalloc kernel/include/linux/slab.h:597 [< inline >] net_alloc kernel/net/core/net_namespace.c:325 [< none >] copy_net_ns+0x6b/0x1a0 kernel/net/core/net_namespace.c:360 [< none >] create_new_namespaces+0x2f6/0x610 kernel/kernel/nsproxy.c:95 [< none >] copy_namespaces+0x297/0x320 kernel/kernel/nsproxy.c:150 [< none >] copy_process.part.35+0x1bf4/0x5760 kernel/kernel/fork.c:1451 [< inline >] copy_process kernel/kernel/fork.c:1274 [< none >] _do_fork+0x1bc/0xcb0 kernel/kernel/fork.c:1723 [< inline >] SYSC_clone kernel/kernel/fork.c:1832 [< none >] SyS_clone+0x37/0x50 kernel/kernel/fork.c:1826 [< none >] entry_SYSCALL_64_fastpath+0x16/0x7a kernel/arch/x86/entry/entry_64.S:185 INFO: Freed in net_drop_ns+0x67/0x80 age=575 cpu=2 pid=2631 [< none >] __slab_free+0x1fc/0x320 kernel/mm/slub.c:2650 [< inline >] slab_free kernel/mm/slub.c:2805 [< none >] kmem_cache_free+0x2a0/0x330 kernel/mm/slub.c:2814 [< inline >] net_free kernel/net/core/net_namespace.c:341 [< none >] net_drop_ns+0x67/0x80 kernel/net/core/net_namespace.c:348 [< none >] cleanup_net+0x4e5/0x600 kernel/net/core/net_namespace.c:448 [< none >] process_one_work+0x794/0x1440 kernel/kernel/workqueue.c:2036 [< none >] worker_thread+0xdb/0xfc0 kernel/kernel/workqueue.c:2170 [< none >] kthread+0x23f/0x2d0 kernel/drivers/block/aoe/aoecmd.c:1303 [< none >] ret_from_fork+0x3f/0x70 kernel/arch/x86/entry/entry_64.S:468 INFO: Slab 0xffffea0001938800 objects=3 used=0 fp=0xffff880064e20000 flags=0x5fffc0000004080 INFO: Object 0xffff880064e20000 @offset=0 fp=0xffff880064e24200 CPU: 1 PID: 11581 Comm: syz-executor Tainted: G B 4.4.0+ Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.8.2-0-g33fbe13 by qemu-project.org 04/01/2014 00000000ffffffff ffff8800662c7790 ffffffff8292049d ffff88003e36a300 ffff880064e20000 ffff880064e20000 ffff8800662c77c0 ffffffff816f2054 ffff88003e36a300 ffffea0001938800 ffff880064e20000 0000000000000000 Call Trace: [< inline >] __dump_stack kernel/lib/dump_stack.c:15 [] dump_stack+0x6f/0xa2 kernel/lib/dump_stack.c:50 [] print_trailer+0xf4/0x150 kernel/mm/slub.c:654 [] object_err+0x2f/0x40 kernel/mm/slub.c:661 [< inline >] print_address_description kernel/mm/kasan/report.c:138 [] kasan_report_error+0x215/0x530 kernel/mm/kasan/report.c:236 [< inline >] kasan_report kernel/mm/kasan/report.c:259 [] __asan_report_load8_noabort+0x3e/0x40 kernel/mm/kasan/report.c:280 [< inline >] ? ppp_pernet kernel/include/linux/compiler.h:218 [] ? ppp_unregister_channel+0x372/0x3a0 kernel/drivers/net/ppp/ppp_generic.c:2392 [< inline >] ppp_pernet kernel/include/linux/compiler.h:218 [] ppp_unregister_channel+0x372/0x3a0 kernel/drivers/net/ppp/ppp_generic.c:2392 [< inline >] ? ppp_pernet kernel/drivers/net/ppp/ppp_generic.c:293 [] ? ppp_unregister_channel+0xe6/0x3a0 kernel/drivers/net/ppp/ppp_generic.c:2392 [] ppp_asynctty_close+0xa3/0x130 kernel/drivers/net/ppp/ppp_async.c:241 [] ? async_lcp_peek+0x5b0/0x5b0 kernel/drivers/net/ppp/ppp_async.c:1000 [] tty_ldisc_close.isra.1+0x99/0xe0 kernel/drivers/tty/tty_ldisc.c:478 [] tty_ldisc_kill+0x40/0x170 kernel/drivers/tty/tty_ldisc.c:744 [] tty_ldisc_release+0x1b3/0x260 kernel/drivers/tty/tty_ldisc.c:772 [] tty_release+0xac1/0x13e0 kernel/drivers/tty/tty_io.c:1901 [] ? release_tty+0x320/0x320 kernel/drivers/tty/tty_io.c:1688 [] __fput+0x236/0x780 kernel/fs/file_table.c:208 [] ____fput+0x15/0x20 kernel/fs/file_table.c:244 [] task_work_run+0x16b/0x200 kernel/kernel/task_work.c:115 [< inline >] exit_task_work kernel/include/linux/task_work.h:21 [] do_exit+0x8b5/0x2c60 kernel/kernel/exit.c:750 [] ? debug_check_no_locks_freed+0x290/0x290 kernel/kernel/locking/lockdep.c:4123 [] ? mm_update_next_owner+0x6f0/0x6f0 kernel/kernel/exit.c:357 [] ? __dequeue_signal+0x136/0x470 kernel/kernel/signal.c:550 [] ? recalc_sigpending_tsk+0x13b/0x180 kernel/kernel/signal.c:145 [] do_group_exit+0x108/0x330 kernel/kernel/exit.c:880 [] get_signal+0x5e4/0x14f0 kernel/kernel/signal.c:2307 [< inline >] ? kretprobe_table_lock kernel/kernel/kprobes.c:1113 [] ? kprobe_flush_task+0xb5/0x450 kernel/kernel/kprobes.c:1158 [] do_signal+0x83/0x1c90 kernel/arch/x86/kernel/signal.c:712 [] ? recycle_rp_inst+0x310/0x310 kernel/include/linux/list.h:655 [] ? setup_sigcontext+0x780/0x780 kernel/arch/x86/kernel/signal.c:165 [] ? finish_task_switch+0x424/0x5f0 kernel/kernel/sched/core.c:2692 [< inline >] ? finish_lock_switch kernel/kernel/sched/sched.h:1099 [] ? finish_task_switch+0x120/0x5f0 kernel/kernel/sched/core.c:2678 [< inline >] ? context_switch kernel/kernel/sched/core.c:2807 [] ? __schedule+0x919/0x1bd0 kernel/kernel/sched/core.c:3283 [] exit_to_usermode_loop+0xf1/0x1a0 kernel/arch/x86/entry/common.c:247 [< inline >] prepare_exit_to_usermode kernel/arch/x86/entry/common.c:282 [] syscall_return_slowpath+0x19f/0x210 kernel/arch/x86/entry/common.c:344 [] int_ret_from_sys_call+0x25/0x9f kernel/arch/x86/entry/entry_64.S:281 Memory state around the buggy address: ffff880064e21680: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff880064e21700: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb >ffff880064e21780: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ^ ffff880064e21800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff880064e21880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ================================================================== Fixes: 273ec51dd7ce ("net: ppp_generic - introduce net-namespace functionality v2") Reported-by: Baozeng Ding Signed-off-by: Guillaume Nault Reviewed-by: Cyrill Gorcunov Signed-off-by: David S. Miller Signed-off-by: Dennis Cagle Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 1f461dcdd296eecedaffffc6bae2bfa90bd7eb89 (cherry picked from commit 1f461dcdd296eecedaffffc6bae2bfa90bd7eb89) Change-Id: I6b7e3b60aa17e7b67d20d4a894cafcb05e76dcbd --- drivers/net/ppp/ppp_generic.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index fc7b3d76f08e0..7efc451aaea94 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c @@ -2242,7 +2242,7 @@ int ppp_register_net_channel(struct net *net, struct ppp_channel *chan) pch->ppp = NULL; pch->chan = chan; - pch->chan_net = net; + pch->chan_net = get_net(net); chan->ppp = pch; init_ppp_file(&pch->file, CHANNEL); pch->file.hdrlen = chan->hdrlen; @@ -2339,6 +2339,8 @@ ppp_unregister_channel(struct ppp_channel *chan) spin_lock_bh(&pn->all_channels_lock); list_del(&pch->list); spin_unlock_bh(&pn->all_channels_lock); + put_net(pch->chan_net); + pch->chan_net = NULL; pch->file.dead = 1; wake_up_interruptible(&pch->file.rwait); From 97648d9baabea1de1a2c96ac7297ebb36098a217 Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Wed, 1 Jun 2016 11:55:07 +0200 Subject: [PATCH 0112/1015] sched: panic on corrupted stack end Until now, hitting this BUG_ON caused a recursive oops (because oops handling involves do_exit(), which calls into the scheduler, which in turn raises an oops), which caused stuff below the stack to be overwritten until a panic happened (e.g. via an oops in interrupt context, caused by the overwritten CPU index in the thread_info). Just panic directly. Conflicts: kernel/sched/core.c Signed-off-by: Jann Horn Signed-off-by: Linus Torvalds Signed-off-by: Dennis Cagle Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 29d6455178a09e1dc340380c582b13356227e8df (cherry picked from commit 29d6455178a09e1dc340380c582b13356227e8df) Change-Id: I73409be3e4cfba82bae36a487227eb5260cd6e37 --- kernel/sched/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 86bac83457e5a..96d3e2740ca78 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -6158,7 +6158,8 @@ static noinline void __schedule_bug(struct task_struct *prev) static inline void schedule_debug(struct task_struct *prev) { #ifdef CONFIG_SCHED_STACK_END_CHECK - BUG_ON(unlikely(task_stack_end_corrupted(prev))); + if (unlikely(task_stack_end_corrupted(prev))) + panic("corrupted stack end detected inside scheduler\n"); #endif /* * Test if we are atomic. Since do_exit() needs to call into From 26c05882fa634fa84bdc08affe49005a00f39d51 Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Wed, 1 Jun 2016 11:55:06 +0200 Subject: [PATCH 0113/1015] ecryptfs: forbid opening files without mmap handler This prevents users from triggering a stack overflow through a recursive invocation of pagefault handling that involves mapping procfs files into virtual memory. Signed-off-by: Jann Horn Acked-by: Tyler Hicks Cc: stable@vger.kernel.org Signed-off-by: Linus Torvalds Signed-off-by: Dennis Cagle Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 2f36db71009304b3f0b95afacd8eba1f9f046b87 (cherry picked from commit 2f36db71009304b3f0b95afacd8eba1f9f046b87) Change-Id: I84718f939090b564853f7d6a8662900f2af19ba0 --- fs/ecryptfs/kthread.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/ecryptfs/kthread.c b/fs/ecryptfs/kthread.c index f1ea610362c6c..9b661a4ccee73 100644 --- a/fs/ecryptfs/kthread.c +++ b/fs/ecryptfs/kthread.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "ecryptfs_kernel.h" struct ecryptfs_open_req { @@ -147,7 +148,7 @@ int ecryptfs_privileged_open(struct file **lower_file, flags |= IS_RDONLY(lower_dentry->d_inode) ? O_RDONLY : O_RDWR; (*lower_file) = dentry_open(&req.path, flags, cred); if (!IS_ERR(*lower_file)) - goto out; + goto have_file; if ((flags & O_ACCMODE) == O_RDONLY) { rc = PTR_ERR((*lower_file)); goto out; @@ -165,8 +166,16 @@ int ecryptfs_privileged_open(struct file **lower_file, mutex_unlock(&ecryptfs_kthread_ctl.mux); wake_up(&ecryptfs_kthread_ctl.wait); wait_for_completion(&req.done); - if (IS_ERR(*lower_file)) + if (IS_ERR(*lower_file)) { rc = PTR_ERR(*lower_file); + goto out; + } +have_file: + if ((*lower_file)->f_op->mmap == NULL) { + fput(*lower_file); + *lower_file = NULL; + rc = -EMEDIUMTYPE; + } out: return rc; } From 052fd701bbe68333cc0d9af4cf1e8fb2745bbff6 Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Wed, 1 Jun 2016 11:55:05 +0200 Subject: [PATCH 0114/1015] proc: prevent stacking filesystems on top This prevents stacking filesystems (ecryptfs and overlayfs) from using procfs as lower filesystem. There is too much magic going on inside procfs, and there is no good reason to stack stuff on top of procfs. (For example, procfs does access checks in VFS open handlers, and ecryptfs by design calls open handlers from a kernel thread that doesn't drop privileges or so.) Signed-off-by: Jann Horn Cc: stable@vger.kernel.org Signed-off-by: Linus Torvalds Signed-off-by: Dennis Cagle Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: e54ad7f1ee263ffa5a2de9c609d58dfa27b21cd9 (cherry picked from commit e54ad7f1ee263ffa5a2de9c609d58dfa27b21cd9) Change-Id: I1bf47b15e8201d3a049a04e1b054c664d9be9bea --- fs/proc/root.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/proc/root.c b/fs/proc/root.c index 9e772f1a5386f..7863ed5a6a88f 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c @@ -121,6 +121,13 @@ static struct dentry *proc_mount(struct file_system_type *fs_type, if (IS_ERR(sb)) return ERR_CAST(sb); + /* + * procfs isn't actually a stacking filesystem; however, there is + * too much magic going on inside it to permit stacking things on + * top of it + */ + sb->s_stack_depth = FILESYSTEM_MAX_STACK_DEPTH; + if (!proc_parse_options(options, ns)) { deactivate_locked_super(sb); return ERR_PTR(-EINVAL); From c65984673e91c99625a2929c42cd4021cff95202 Mon Sep 17 00:00:00 2001 From: Mohamad Ayyash Date: Wed, 11 May 2016 13:18:35 -0700 Subject: [PATCH 0115/1015] Don't show empty tag stats for unprivileged uids BUG: 27577101 BUG: 27532522 Signed-off-by: Mohamad Ayyash Git-repo: https://android.googlesource.com/kernel/common.git Git-commit: d85e322ff3bc8d7aa872ad12df6427dd236e540a Signed-off-by: Ravi Kumar Siddojigari Change-Id: Ia706e7184ab31c5e4e3bb2668a1ab7660ca3c6ce --- net/netfilter/xt_qtaguid.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/net/netfilter/xt_qtaguid.c b/net/netfilter/xt_qtaguid.c index d6f9bf61c6845..8cc1d3bc96e02 100644 --- a/net/netfilter/xt_qtaguid.c +++ b/net/netfilter/xt_qtaguid.c @@ -2537,8 +2537,7 @@ static int pp_stats_line(struct seq_file *m, struct tag_stat *ts_entry, uid_t stat_uid = get_uid_from_tag(tag); struct proc_print_info *ppi = m->private; /* Detailed tags are not available to everybody */ - if (get_atag_from_tag(tag) && !can_read_other_uid_stats( - make_kuid(&init_user_ns,stat_uid))) { + if (!can_read_other_uid_stats(make_kuid(&init_user_ns,stat_uid))) { CT_DEBUG("qtaguid: stats line: " "%s 0x%llx %u: insufficient priv " "from pid=%u tgid=%u uid=%u stats.gid=%u\n", From 5b8cb23989e56d633763b0df77eec06ddffa2929 Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Wed, 16 Dec 2015 13:21:24 +0000 Subject: [PATCH 0116/1015] ANDROID: dm verity: port upstream changes to 3.18 Upstream dm-verity has different optional parameters. Port back the relevant changes. Bug: 21893453 Change-Id: I260b15605fe62613bdfd74a4e6c95e5a824265df Signed-off-by: Sami Tolvanen Git-commit: af00c100aa6b3a0e3138884bced716949777414f Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/dm-verity.c | 108 ++++++++++++++++++++++++++--------------- 1 file changed, 68 insertions(+), 40 deletions(-) diff --git a/drivers/md/dm-verity.c b/drivers/md/dm-verity.c index 32a6a81305572..f60991a10fdfe 100644 --- a/drivers/md/dm-verity.c +++ b/drivers/md/dm-verity.c @@ -24,23 +24,24 @@ #define DM_MSG_PREFIX "verity" #define DM_VERITY_ENV_LENGTH 42 -#define DM_VERITY_ENV_VAR_NAME "VERITY_ERR_BLOCK_NR" +#define DM_VERITY_ENV_VAR_NAME "DM_VERITY_ERR_BLOCK_NR" -#define DM_VERITY_IO_VEC_INLINE 16 -#define DM_VERITY_MEMPOOL_SIZE 4 #define DM_VERITY_DEFAULT_PREFETCH_SIZE 262144 #define DM_VERITY_MAX_LEVELS 63 #define DM_VERITY_MAX_CORRUPTED_ERRS 100 +#define DM_VERITY_OPT_LOGGING "ignore_corruption" +#define DM_VERITY_OPT_RESTART "restart_on_corruption" + static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE; module_param_named(prefetch_cluster, dm_verity_prefetch_cluster, uint, S_IRUGO | S_IWUSR); enum verity_mode { - DM_VERITY_MODE_EIO = 0, - DM_VERITY_MODE_LOGGING = 1, - DM_VERITY_MODE_RESTART = 2 + DM_VERITY_MODE_EIO, + DM_VERITY_MODE_LOGGING, + DM_VERITY_MODE_RESTART }; enum verity_block_type { @@ -73,8 +74,6 @@ struct dm_verity { enum verity_mode mode; /* mode for handling verification errors */ unsigned corrupted_errs;/* Number of errors for corrupted blocks */ - mempool_t *vec_mempool; /* mempool of bio vector */ - struct workqueue_struct *verify_wq; /* starting blocks for each tree level. 0 is the lowest level. */ @@ -196,17 +195,20 @@ static void verity_hash_at_level(struct dm_verity *v, sector_t block, int level, * Handle verification errors. */ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, - unsigned long long block) + unsigned long long block) { char verity_env[DM_VERITY_ENV_LENGTH]; char *envp[] = { verity_env, NULL }; const char *type_str = ""; struct mapped_device *md = dm_table_get_md(v->ti->table); + /* Corruption should be visible in device status in all modes */ + v->hash_failed = 1; + if (v->corrupted_errs >= DM_VERITY_MAX_CORRUPTED_ERRS) goto out; - ++v->corrupted_errs; + v->corrupted_errs++; switch (type) { case DM_VERITY_BLOCK_TYPE_DATA: @@ -219,8 +221,8 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, BUG(); } - DMERR_LIMIT("%s: %s block %llu is corrupted", v->data_dev->name, - type_str, block); + DMERR("%s: %s block %llu is corrupted", v->data_dev->name, type_str, + block); if (v->corrupted_errs == DM_VERITY_MAX_CORRUPTED_ERRS) DMERR("%s: reached maximum errors", v->data_dev->name); @@ -265,7 +267,7 @@ static int verity_verify_level(struct dm_verity_io *io, sector_t block, verity_hash_at_level(v, block, level, &hash_block, &offset); data = dm_bufio_read(v->bufio, hash_block, &buf); - if (unlikely(IS_ERR(data))) + if (IS_ERR(data)) return PTR_ERR(data); aux = dm_bufio_get_aux_data(buf); @@ -317,8 +319,6 @@ static int verity_verify_level(struct dm_verity_io *io, sector_t block, goto release_ret_r; } if (unlikely(memcmp(result, io_want_digest(v, io), v->digest_size))) { - v->hash_failed = 1; - if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_METADATA, hash_block)) { r = -EIO; @@ -435,8 +435,6 @@ static int verity_verify_io(struct dm_verity_io *io) return r; } if (unlikely(memcmp(result, io_want_digest(v, io), v->digest_size))) { - v->hash_failed = 1; - if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, io->block + b)) return -EIO; @@ -615,6 +613,19 @@ static void verity_status(struct dm_target *ti, status_type_t type, else for (x = 0; x < v->salt_size; x++) DMEMIT("%02x", v->salt[x]); + if (v->mode != DM_VERITY_MODE_EIO) { + DMEMIT(" 1 "); + switch (v->mode) { + case DM_VERITY_MODE_LOGGING: + DMEMIT(DM_VERITY_OPT_LOGGING); + break; + case DM_VERITY_MODE_RESTART: + DMEMIT(DM_VERITY_OPT_RESTART); + break; + default: + BUG(); + } + } break; } } @@ -676,9 +687,6 @@ static void verity_dtr(struct dm_target *ti) if (v->verify_wq) destroy_workqueue(v->verify_wq); - if (v->vec_mempool) - mempool_destroy(v->vec_mempool); - if (v->bufio) dm_bufio_client_destroy(v->bufio); @@ -716,13 +724,19 @@ static void verity_dtr(struct dm_target *ti) static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) { struct dm_verity *v; - unsigned num; + struct dm_arg_set as; + const char *opt_string; + unsigned int num, opt_params; unsigned long long num_ll; int r; int i; sector_t hash_position; char dummy; + static struct dm_arg _args[] = { + {0, 1, "Invalid number of feature args"}, + }; + v = kzalloc(sizeof(struct dm_verity), GFP_KERNEL); if (!v) { ti->error = "Cannot allocate verity structure"; @@ -737,14 +751,14 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) goto bad; } - if (argc < 10 || argc > 11) { - ti->error = "Invalid argument count: 10-11 arguments required"; + if (argc < 10) { + ti->error = "Not enough arguments"; r = -EINVAL; goto bad; } - if (sscanf(argv[0], "%d%c", &num, &dummy) != 1 || - num < 0 || num > 1) { + if (sscanf(argv[0], "%u%c", &num, &dummy) != 1 || + num > 1) { ti->error = "Invalid version"; r = -EINVAL; goto bad; @@ -859,15 +873,37 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) } } - if (argc > 10) { - if (sscanf(argv[10], "%d%c", &num, &dummy) != 1 || - num < DM_VERITY_MODE_EIO || - num > DM_VERITY_MODE_RESTART) { - ti->error = "Invalid mode"; - r = -EINVAL; + argv += 10; + argc -= 10; + + /* Optional parameters */ + if (argc) { + as.argc = argc; + as.argv = argv; + + r = dm_read_arg_group(_args, &as, &opt_params, &ti->error); + if (r) goto bad; + + while (opt_params) { + opt_params--; + opt_string = dm_shift_arg(&as); + if (!opt_string) { + ti->error = "Not enough feature arguments"; + r = -EINVAL; + goto bad; + } + + if (!strcasecmp(opt_string, DM_VERITY_OPT_LOGGING)) + v->mode = DM_VERITY_MODE_LOGGING; + else if (!strcasecmp(opt_string, DM_VERITY_OPT_RESTART)) + v->mode = DM_VERITY_MODE_RESTART; + else { + ti->error = "Invalid feature arguments"; + r = -EINVAL; + goto bad; + } } - v->mode = num; } v->hash_per_block_bits = @@ -919,14 +955,6 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) ti->per_bio_data_size = roundup(sizeof(struct dm_verity_io) + v->shash_descsize + v->digest_size * 2, __alignof__(struct dm_verity_io)); - v->vec_mempool = mempool_create_kmalloc_pool(DM_VERITY_MEMPOOL_SIZE, - BIO_MAX_PAGES * sizeof(struct bio_vec)); - if (!v->vec_mempool) { - ti->error = "Cannot allocate vector mempool"; - r = -ENOMEM; - goto bad; - } - /* WQ_UNBOUND greatly improves performance when running on ramdisk */ v->verify_wq = alloc_workqueue("kverityd", WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM | WQ_UNBOUND, num_online_cpus()); if (!v->verify_wq) { From bb36cfc98f36df71e2c0bd91b5c8f14d7318aaae Mon Sep 17 00:00:00 2001 From: Imran Khan Date: Tue, 13 Sep 2016 21:19:05 +0530 Subject: [PATCH 0117/1015] defconfig: msm: Enable FEC feature for DM-VERITY Enable dm-verity forward error correction feature as this may be needed for Android N. Change-Id: Ic65520874476d67c39aae7073f16b243b6c916c6 Signed-off-by: Imran Khan --- arch/arm/configs/msm8909-perf_defconfig | 1 + arch/arm/configs/msm8909_defconfig | 1 + arch/arm/configs/msm8909w-1gb-perf_defconfig | 1 + arch/arm/configs/msm8909w-1gb_defconfig | 1 + arch/arm/configs/msm8909w-perf_defconfig | 1 + arch/arm/configs/msm8909w_defconfig | 1 + arch/arm/configs/msm8937-perf_defconfig | 1 + arch/arm/configs/msm8937_defconfig | 1 + arch/arm/configs/msmcortex-perf_defconfig | 1 + arch/arm/configs/msmcortex_defconfig | 1 + arch/arm64/configs/msm-auto-perf_defconfig | 1 + arch/arm64/configs/msm-auto_defconfig | 1 + arch/arm64/configs/msm-perf_defconfig | 1 + arch/arm64/configs/msm8937-perf_defconfig | 1 + arch/arm64/configs/msm8937_defconfig | 1 + arch/arm64/configs/msm_defconfig | 1 + arch/arm64/configs/msmcortex-perf_defconfig | 1 + arch/arm64/configs/msmcortex_defconfig | 1 + 18 files changed, 18 insertions(+) diff --git a/arch/arm/configs/msm8909-perf_defconfig b/arch/arm/configs/msm8909-perf_defconfig index c5dea5dde0593..75e5abfa18043 100644 --- a/arch/arm/configs/msm8909-perf_defconfig +++ b/arch/arm/configs/msm8909-perf_defconfig @@ -216,6 +216,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm/configs/msm8909_defconfig b/arch/arm/configs/msm8909_defconfig index 8b5608d6a54ef..2c93d6ea48be3 100644 --- a/arch/arm/configs/msm8909_defconfig +++ b/arch/arm/configs/msm8909_defconfig @@ -221,6 +221,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm/configs/msm8909w-1gb-perf_defconfig b/arch/arm/configs/msm8909w-1gb-perf_defconfig index 98eb2d2ea039d..18c25c174ce98 100644 --- a/arch/arm/configs/msm8909w-1gb-perf_defconfig +++ b/arch/arm/configs/msm8909w-1gb-perf_defconfig @@ -221,6 +221,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_IFB=y diff --git a/arch/arm/configs/msm8909w-1gb_defconfig b/arch/arm/configs/msm8909w-1gb_defconfig index 67393eb27e90d..bcfca5bac7f56 100644 --- a/arch/arm/configs/msm8909w-1gb_defconfig +++ b/arch/arm/configs/msm8909w-1gb_defconfig @@ -223,6 +223,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_IFB=y diff --git a/arch/arm/configs/msm8909w-perf_defconfig b/arch/arm/configs/msm8909w-perf_defconfig index d7db427bc0b40..d81fab1fa3430 100644 --- a/arch/arm/configs/msm8909w-perf_defconfig +++ b/arch/arm/configs/msm8909w-perf_defconfig @@ -222,6 +222,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_IFB=y diff --git a/arch/arm/configs/msm8909w_defconfig b/arch/arm/configs/msm8909w_defconfig index a64f825f6e026..6fee84b9890e2 100644 --- a/arch/arm/configs/msm8909w_defconfig +++ b/arch/arm/configs/msm8909w_defconfig @@ -224,6 +224,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_IFB=y diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index cf5986a2dc2eb..9599cb8ce4bb2 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -258,6 +258,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index 77a998224338f..68f827b3e7ee6 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -260,6 +260,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index c102d70e4face..93a7edccf8716 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -253,6 +253,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index 5f6f98d246e44..9880473f2da46 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -251,6 +251,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm64/configs/msm-auto-perf_defconfig b/arch/arm64/configs/msm-auto-perf_defconfig index 8411926bde0ac..8e7eec0ec214b 100644 --- a/arch/arm64/configs/msm-auto-perf_defconfig +++ b/arch/arm64/configs/msm-auto-perf_defconfig @@ -255,6 +255,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_BONDING=y CONFIG_DUMMY=y diff --git a/arch/arm64/configs/msm-auto_defconfig b/arch/arm64/configs/msm-auto_defconfig index 9a1856e70ceeb..4c3a6467d4e77 100644 --- a/arch/arm64/configs/msm-auto_defconfig +++ b/arch/arm64/configs/msm-auto_defconfig @@ -256,6 +256,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_BONDING=y CONFIG_DUMMY=y diff --git a/arch/arm64/configs/msm-perf_defconfig b/arch/arm64/configs/msm-perf_defconfig index 241be6600e4e0..c3df6922812c0 100644 --- a/arch/arm64/configs/msm-perf_defconfig +++ b/arch/arm64/configs/msm-perf_defconfig @@ -253,6 +253,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_BONDING=y CONFIG_DUMMY=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index 44150500e5265..c2571377c799a 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -254,6 +254,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 59c3becdc8cce..9e26adf79e133 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -254,6 +254,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index 03ed6a840ec45..2bb6adba26da0 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -254,6 +254,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_BONDING=y CONFIG_DUMMY=y diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index f674855c48413..687fd894c1bc2 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -253,6 +253,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index 069548ef317ed..5074aae1e864e 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -253,6 +253,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y From 078974b391571360b33afe173caefa4b8dddd34c Mon Sep 17 00:00:00 2001 From: Prasad Sodagudi Date: Wed, 24 Aug 2016 17:18:21 +0530 Subject: [PATCH 0118/1015] misc: uidstat: Use single_release for uid_stat_read_atomic_int_fops Currently uid_stat_read_atomic_int_fops is using the single_open and seq_release for release callback instead single_release. Due to this memory allocated for seq_operations struct is getting leaked. So change the uid_stat_read_atomic_int_fops definition to use single_release instead of seq_release callback. Change-Id: Icd52ae094dff289a7d1c7fecee47d7ef2ed2784e Signed-off-by: Prasad Sodagudi --- drivers/misc/uid_stat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/misc/uid_stat.c b/drivers/misc/uid_stat.c index 4766c1f83b94e..8e8b15c2bb2f7 100644 --- a/drivers/misc/uid_stat.c +++ b/drivers/misc/uid_stat.c @@ -67,7 +67,7 @@ static const struct file_operations uid_stat_read_atomic_int_fops = { .open = uid_stat_read_atomic_int_open, .read = seq_read, .llseek = seq_lseek, - .release = seq_release, + .release = single_release, }; /* Create a new entry for tracking the specified uid. */ From 7b2e876b44fd9a0d27543325a9a327caebbd7ec6 Mon Sep 17 00:00:00 2001 From: Charan Teja Reddy Date: Tue, 13 Sep 2016 17:46:41 +0530 Subject: [PATCH 0119/1015] coresight: hwtracing: fix dangling pointer issues Fix the dangling pointer issues on CoreSight that can cause the kernel panic. Change-Id: Ic20405cf2f64c6bc38e994780577b7da42cf6aba Signed-off-by: Charan Teja Reddy --- drivers/hwtracing/coresight/coresight-csr.c | 4 ++-- drivers/hwtracing/coresight/coresight-stm.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-csr.c b/drivers/hwtracing/coresight/coresight-csr.c index dfb2922b6f330..3c18d686091a4 100644 --- a/drivers/hwtracing/coresight/coresight-csr.c +++ b/drivers/hwtracing/coresight/coresight-csr.c @@ -191,8 +191,6 @@ static int csr_probe(struct platform_device *pdev) drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; - /* Store the driver data pointer for use in exported functions */ - csrdrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); @@ -220,6 +218,8 @@ static int csr_probe(struct platform_device *pdev) if (IS_ERR(drvdata->csdev)) return PTR_ERR(drvdata->csdev); + /* Store the driver data pointer for use in exported functions */ + csrdrvdata = drvdata; dev_info(dev, "CSR initialized\n"); return 0; } diff --git a/drivers/hwtracing/coresight/coresight-stm.c b/drivers/hwtracing/coresight/coresight-stm.c index b911be00b338e..3093e15dc30dc 100644 --- a/drivers/hwtracing/coresight/coresight-stm.c +++ b/drivers/hwtracing/coresight/coresight-stm.c @@ -774,8 +774,6 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id) drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; - /* Store the driver data pointer for use in exported functions */ - stmdrvdata = drvdata; drvdata->dev = &adev->dev; dev_set_drvdata(dev, drvdata); @@ -851,6 +849,8 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id) if (boot_enable) coresight_enable(drvdata->csdev); + /* Store the driver data pointer for use in exported functions */ + stmdrvdata = drvdata; return 0; err: coresight_unregister(drvdata->csdev); From 1c49e96b5a73af4415ae82cb7a9b94ae1eceb5ca Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Wed, 16 Dec 2015 13:33:29 +0000 Subject: [PATCH 0120/1015] UPSTREAM: dm verity: clean up duplicate hashing code (cherry-picked from 6dbeda3469ced777bc3138ed5918f7ae79670b7b) Handle dm-verity salting in one place to simplify the code. Bug: 21893453 Change-Id: Iab79693de2d1defd66b5389c60b676f60b975aae Signed-off-by: Sami Tolvanen Reviewed-by: Kees Cook Signed-off-by: Mike Snitzer Git-commit: cfb1f868294a85319c5c641a65a2b98452e037be Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/dm-verity.c | 262 +++++++++++++++++++++++------------------ 1 file changed, 147 insertions(+), 115 deletions(-) diff --git a/drivers/md/dm-verity.c b/drivers/md/dm-verity.c index f60991a10fdfe..9e87babca406b 100644 --- a/drivers/md/dm-verity.c +++ b/drivers/md/dm-verity.c @@ -173,6 +173,84 @@ static sector_t verity_position_at_level(struct dm_verity *v, sector_t block, return block >> (level * v->hash_per_block_bits); } +/* + * Wrapper for crypto_shash_init, which handles verity salting. + */ +static int verity_hash_init(struct dm_verity *v, struct shash_desc *desc) +{ + int r; + + desc->tfm = v->tfm; + desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; + + r = crypto_shash_init(desc); + + if (unlikely(r < 0)) { + DMERR("crypto_shash_init failed: %d", r); + return r; + } + + if (likely(v->version >= 1)) { + r = crypto_shash_update(desc, v->salt, v->salt_size); + + if (unlikely(r < 0)) { + DMERR("crypto_shash_update failed: %d", r); + return r; + } + } + + return 0; +} + +static int verity_hash_update(struct dm_verity *v, struct shash_desc *desc, + const u8 *data, size_t len) +{ + int r = crypto_shash_update(desc, data, len); + + if (unlikely(r < 0)) + DMERR("crypto_shash_update failed: %d", r); + + return r; +} + +static int verity_hash_final(struct dm_verity *v, struct shash_desc *desc, + u8 *digest) +{ + int r; + + if (unlikely(!v->version)) { + r = crypto_shash_update(desc, v->salt, v->salt_size); + + if (r < 0) { + DMERR("crypto_shash_update failed: %d", r); + return r; + } + } + + r = crypto_shash_final(desc, digest); + + if (unlikely(r < 0)) + DMERR("crypto_shash_final failed: %d", r); + + return r; +} + +static int verity_hash(struct dm_verity *v, struct shash_desc *desc, + const u8 *data, size_t len, u8 *digest) +{ + int r; + + r = verity_hash_init(v, desc); + if (unlikely(r < 0)) + return r; + + r = verity_hash_update(v, desc, data, len); + if (unlikely(r < 0)) + return r; + + return verity_hash_final(v, desc, digest); +} + static void verity_hash_at_level(struct dm_verity *v, sector_t block, int level, sector_t *hash_block, unsigned *offset) { @@ -253,10 +331,10 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, * If "skip_unverified" is false, unverified buffer is hashed and verified * against current value of io_want_digest(v, io). */ -static int verity_verify_level(struct dm_verity_io *io, sector_t block, - int level, bool skip_unverified) +static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io, + sector_t block, int level, bool skip_unverified, + u8 *want_digest) { - struct dm_verity *v = io->v; struct dm_buffer *buf; struct buffer_aux *aux; u8 *data; @@ -273,74 +351,71 @@ static int verity_verify_level(struct dm_verity_io *io, sector_t block, aux = dm_bufio_get_aux_data(buf); if (!aux->hash_verified) { - struct shash_desc *desc; - u8 *result; - if (skip_unverified) { r = 1; goto release_ret_r; } - desc = io_hash_desc(v, io); - desc->tfm = v->tfm; - desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; - r = crypto_shash_init(desc); - if (r < 0) { - DMERR("crypto_shash_init failed: %d", r); + r = verity_hash(v, io_hash_desc(v, io), + data, 1 << v->hash_dev_block_bits, + io_real_digest(v, io)); + if (unlikely(r < 0)) goto release_ret_r; - } - - if (likely(v->version >= 1)) { - r = crypto_shash_update(desc, v->salt, v->salt_size); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); - goto release_ret_r; - } - } - r = crypto_shash_update(desc, data, 1 << v->hash_dev_block_bits); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); - goto release_ret_r; - } - - if (!v->version) { - r = crypto_shash_update(desc, v->salt, v->salt_size); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); - goto release_ret_r; - } - } - - result = io_real_digest(v, io); - r = crypto_shash_final(desc, result); - if (r < 0) { - DMERR("crypto_shash_final failed: %d", r); + if (likely(memcmp(io_real_digest(v, io), want_digest, + v->digest_size) == 0)) + aux->hash_verified = 1; + else if (verity_handle_err(v, + DM_VERITY_BLOCK_TYPE_METADATA, + hash_block)) { + r = -EIO; goto release_ret_r; } - if (unlikely(memcmp(result, io_want_digest(v, io), v->digest_size))) { - if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_METADATA, - hash_block)) { - r = -EIO; - goto release_ret_r; - } - } else - aux->hash_verified = 1; } data += offset; - - memcpy(io_want_digest(v, io), data, v->digest_size); - - dm_bufio_release(buf); - return 0; + memcpy(want_digest, data, v->digest_size); + r = 0; release_ret_r: dm_bufio_release(buf); - return r; } +/* + * Find a hash for a given block, write it to digest and verify the integrity + * of the hash tree if necessary. + */ +static int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, + sector_t block, u8 *digest) +{ + int i; + int r; + + if (likely(v->levels)) { + /* + * First, we try to get the requested hash for + * the current block. If the hash block itself is + * verified, zero is returned. If it isn't, this + * function returns 1 and we fall back to whole + * chain verification. + */ + r = verity_verify_level(v, io, block, 0, true, digest); + if (likely(r <= 0)) + return r; + } + + memcpy(digest, v->root_digest, v->digest_size); + + for (i = v->levels - 1; i >= 0; i--) { + r = verity_verify_level(v, io, block, i, false, digest); + if (unlikely(r)) + return r; + } + + return 0; +} + /* * Verify one "dm_verity_io" structure. */ @@ -350,54 +425,21 @@ static int verity_verify_io(struct dm_verity_io *io) struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_bio_data_size); unsigned b; - int i; for (b = 0; b < io->n_blocks; b++) { - struct shash_desc *desc; - u8 *result; int r; unsigned todo; + struct shash_desc *desc = io_hash_desc(v, io); - if (likely(v->levels)) { - /* - * First, we try to get the requested hash for - * the current block. If the hash block itself is - * verified, zero is returned. If it isn't, this - * function returns 0 and we fall back to whole - * chain verification. - */ - int r = verity_verify_level(io, io->block + b, 0, true); - if (likely(!r)) - goto test_block_hash; - if (r < 0) - return r; - } - - memcpy(io_want_digest(v, io), v->root_digest, v->digest_size); - - for (i = v->levels - 1; i >= 0; i--) { - int r = verity_verify_level(io, io->block + b, i, false); - if (unlikely(r)) - return r; - } + r = verity_hash_for_block(v, io, io->block + b, + io_want_digest(v, io)); + if (unlikely(r < 0)) + return r; -test_block_hash: - desc = io_hash_desc(v, io); - desc->tfm = v->tfm; - desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; - r = crypto_shash_init(desc); - if (r < 0) { - DMERR("crypto_shash_init failed: %d", r); + r = verity_hash_init(v, desc); + if (unlikely(r < 0)) return r; - } - if (likely(v->version >= 1)) { - r = crypto_shash_update(desc, v->salt, v->salt_size); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); - return r; - } - } todo = 1 << v->data_dev_block_bits; do { u8 *page; @@ -408,37 +450,27 @@ static int verity_verify_io(struct dm_verity_io *io) len = bv.bv_len; if (likely(len >= todo)) len = todo; - r = crypto_shash_update(desc, page + bv.bv_offset, len); + r = verity_hash_update(v, desc, page + bv.bv_offset, + len); kunmap_atomic(page); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); + if (unlikely(r < 0)) return r; - } bio_advance_iter(bio, &io->iter, len); todo -= len; } while (todo); - if (!v->version) { - r = crypto_shash_update(desc, v->salt, v->salt_size); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); - return r; - } - } - - result = io_real_digest(v, io); - r = crypto_shash_final(desc, result); - if (r < 0) { - DMERR("crypto_shash_final failed: %d", r); + r = verity_hash_final(v, desc, io_real_digest(v, io)); + if (unlikely(r < 0)) return r; - } - if (unlikely(memcmp(result, io_want_digest(v, io), v->digest_size))) { - if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, - io->block + b)) - return -EIO; - } + + if (likely(memcmp(io_real_digest(v, io), + io_want_digest(v, io), v->digest_size) == 0)) + continue; + else if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, + io->block + b)) + return -EIO; } return 0; From 379fc89fd8271de9019c3e1ff96fd95a0f75c570 Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Wed, 16 Dec 2015 13:37:41 +0000 Subject: [PATCH 0121/1015] UPSTREAM: dm verity: separate function for parsing opt args (cherry-picked from 753c1fd02807cb43a1c5d01d75d454054d46bdad) Move optional argument parsing into a separate function to make it easier to add more of them without making verity_ctr even longer. Bug: 21893453 Change-Id: I754603a026d8fa305c9b2e3b2b9dd4b3a95014b1 Signed-off-by: Sami Tolvanen Reviewed-by: Kees Cook Signed-off-by: Mike Snitzer Git-commit: 32df92dbd3a75d4ebf3cd3767c833598d5f8faf6 Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/dm-verity.c | 71 +++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/drivers/md/dm-verity.c b/drivers/md/dm-verity.c index 9e87babca406b..00f9e619f9ff8 100644 --- a/drivers/md/dm-verity.c +++ b/drivers/md/dm-verity.c @@ -34,6 +34,8 @@ #define DM_VERITY_OPT_LOGGING "ignore_corruption" #define DM_VERITY_OPT_RESTART "restart_on_corruption" +#define DM_VERITY_OPTS_MAX 1 + static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE; module_param_named(prefetch_cluster, dm_verity_prefetch_cluster, uint, S_IRUGO | S_IWUSR); @@ -739,6 +741,44 @@ static void verity_dtr(struct dm_target *ti) kfree(v); } +static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v) +{ + int r; + unsigned argc; + struct dm_target *ti = v->ti; + const char *arg_name; + + static struct dm_arg _args[] = { + {0, DM_VERITY_OPTS_MAX, "Invalid number of feature args"}, + }; + + r = dm_read_arg_group(_args, as, &argc, &ti->error); + if (r) + return -EINVAL; + + if (!argc) + return 0; + + do { + arg_name = dm_shift_arg(as); + argc--; + + if (!strcasecmp(arg_name, DM_VERITY_OPT_LOGGING)) { + v->mode = DM_VERITY_MODE_LOGGING; + continue; + + } else if (!strcasecmp(arg_name, DM_VERITY_OPT_RESTART)) { + v->mode = DM_VERITY_MODE_RESTART; + continue; + } + + ti->error = "Unrecognized verity feature request"; + return -EINVAL; + } while (argc && !r); + + return r; +} + /* * Target parameters: * The current format is version 1. @@ -757,18 +797,13 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) { struct dm_verity *v; struct dm_arg_set as; - const char *opt_string; - unsigned int num, opt_params; + unsigned int num; unsigned long long num_ll; int r; int i; sector_t hash_position; char dummy; - static struct dm_arg _args[] = { - {0, 1, "Invalid number of feature args"}, - }; - v = kzalloc(sizeof(struct dm_verity), GFP_KERNEL); if (!v) { ti->error = "Cannot allocate verity structure"; @@ -913,29 +948,9 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) as.argc = argc; as.argv = argv; - r = dm_read_arg_group(_args, &as, &opt_params, &ti->error); - if (r) + r = verity_parse_opt_args(&as, v); + if (r < 0) goto bad; - - while (opt_params) { - opt_params--; - opt_string = dm_shift_arg(&as); - if (!opt_string) { - ti->error = "Not enough feature arguments"; - r = -EINVAL; - goto bad; - } - - if (!strcasecmp(opt_string, DM_VERITY_OPT_LOGGING)) - v->mode = DM_VERITY_MODE_LOGGING; - else if (!strcasecmp(opt_string, DM_VERITY_OPT_RESTART)) - v->mode = DM_VERITY_MODE_RESTART; - else { - ti->error = "Invalid feature arguments"; - r = -EINVAL; - goto bad; - } - } } v->hash_per_block_bits = From 65fc36a0385c02ad0a54bc432e11d7db64c47b90 Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Wed, 16 Dec 2015 13:39:32 +0000 Subject: [PATCH 0122/1015] UPSTREAM: dm verity: move dm-verity.c to dm-verity-target.c (cherry-pick from 03045cbafa2d663ad8d0a583ac219d202d824344) Prepare for extending dm-verity with an optional object. Follows the naming convention used by other DM targets (e.g. dm-cache and dm-era). Bug: 21893453 Change-Id: I70aa5fbad3426d0efde1353f25e9972b3577a6a5 Signed-off-by: Sami Tolvanen Signed-off-by: Mike Snitzer Git-commit: 2e27c838fddcf01b8575d008ff9afbe51c29b9e0 Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/Makefile | 1 + drivers/md/{dm-verity.c => dm-verity-target.c} | 0 2 files changed, 1 insertion(+) rename drivers/md/{dm-verity.c => dm-verity-target.c} (100%) diff --git a/drivers/md/Makefile b/drivers/md/Makefile index 9f2950b873068..100938bd1842a 100644 --- a/drivers/md/Makefile +++ b/drivers/md/Makefile @@ -15,6 +15,7 @@ dm-cache-y += dm-cache-target.o dm-cache-metadata.o dm-cache-policy.o dm-cache-mq-y += dm-cache-policy-mq.o dm-cache-cleaner-y += dm-cache-policy-cleaner.o dm-era-y += dm-era-target.o +dm-verity-y += dm-verity-target.o md-mod-y += md.o bitmap.o raid456-y += raid5.o diff --git a/drivers/md/dm-verity.c b/drivers/md/dm-verity-target.c similarity index 100% rename from drivers/md/dm-verity.c rename to drivers/md/dm-verity-target.c From 6ce1c10dd271c201e420d29685aec861329ab99b Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Wed, 16 Dec 2015 14:27:20 +0000 Subject: [PATCH 0123/1015] UPSTREAM: dm verity: factor out structures and functions useful to separate object (cherry-picked from ffa393807cd69656d5b6bc9d9622e205071cbab8) Prepare for an optional verity object to make use of existing dm-verity structures and functions. Bug: 21893453 Change-Id: I0fee9e0bdb0e144cbf9d78ef2f57c3f96d049448 Signed-off-by: Sami Tolvanen Signed-off-by: Mike Snitzer Git-commit: 83ab4db900a55e93d584448d235ae21f82305f08 Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/dm-verity-target.c | 117 +++++----------------------------- drivers/md/dm-verity.h | 113 ++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 101 deletions(-) create mode 100644 drivers/md/dm-verity.h diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 00f9e619f9ff8..82d8e71fec265 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -14,12 +14,10 @@ * access behavior. */ -#include "dm-bufio.h" +#include "dm-verity.h" #include -#include #include -#include #define DM_MSG_PREFIX "verity" @@ -28,7 +26,6 @@ #define DM_VERITY_DEFAULT_PREFETCH_SIZE 262144 -#define DM_VERITY_MAX_LEVELS 63 #define DM_VERITY_MAX_CORRUPTED_ERRS 100 #define DM_VERITY_OPT_LOGGING "ignore_corruption" @@ -40,73 +37,6 @@ static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE; module_param_named(prefetch_cluster, dm_verity_prefetch_cluster, uint, S_IRUGO | S_IWUSR); -enum verity_mode { - DM_VERITY_MODE_EIO, - DM_VERITY_MODE_LOGGING, - DM_VERITY_MODE_RESTART -}; - -enum verity_block_type { - DM_VERITY_BLOCK_TYPE_DATA, - DM_VERITY_BLOCK_TYPE_METADATA -}; - -struct dm_verity { - struct dm_dev *data_dev; - struct dm_dev *hash_dev; - struct dm_target *ti; - struct dm_bufio_client *bufio; - char *alg_name; - struct crypto_shash *tfm; - u8 *root_digest; /* digest of the root block */ - u8 *salt; /* salt: its size is salt_size */ - unsigned salt_size; - sector_t data_start; /* data offset in 512-byte sectors */ - sector_t hash_start; /* hash start in blocks */ - sector_t data_blocks; /* the number of data blocks */ - sector_t hash_blocks; /* the number of hash blocks */ - unsigned char data_dev_block_bits; /* log2(data blocksize) */ - unsigned char hash_dev_block_bits; /* log2(hash blocksize) */ - unsigned char hash_per_block_bits; /* log2(hashes in hash block) */ - unsigned char levels; /* the number of tree levels */ - unsigned char version; - unsigned digest_size; /* digest size for the current hash algorithm */ - unsigned shash_descsize;/* the size of temporary space for crypto */ - int hash_failed; /* set to 1 if hash of any block failed */ - enum verity_mode mode; /* mode for handling verification errors */ - unsigned corrupted_errs;/* Number of errors for corrupted blocks */ - - struct workqueue_struct *verify_wq; - - /* starting blocks for each tree level. 0 is the lowest level. */ - sector_t hash_level_block[DM_VERITY_MAX_LEVELS]; -}; - -struct dm_verity_io { - struct dm_verity *v; - - /* original values of bio->bi_end_io and bio->bi_private */ - bio_end_io_t *orig_bi_end_io; - void *orig_bi_private; - - sector_t block; - unsigned n_blocks; - - struct bvec_iter iter; - - struct work_struct work; - - /* - * Three variably-size fields follow this struct: - * - * u8 hash_desc[v->shash_descsize]; - * u8 real_digest[v->digest_size]; - * u8 want_digest[v->digest_size]; - * - * To access them use: io_hash_desc(), io_real_digest() and io_want_digest(). - */ -}; - struct dm_verity_prefetch_work { struct work_struct work; struct dm_verity *v; @@ -114,21 +44,6 @@ struct dm_verity_prefetch_work { unsigned n_blocks; }; -static struct shash_desc *io_hash_desc(struct dm_verity *v, struct dm_verity_io *io) -{ - return (struct shash_desc *)(io + 1); -} - -static u8 *io_real_digest(struct dm_verity *v, struct dm_verity_io *io) -{ - return (u8 *)(io + 1) + v->shash_descsize; -} - -static u8 *io_want_digest(struct dm_verity *v, struct dm_verity_io *io) -{ - return (u8 *)(io + 1) + v->shash_descsize + v->digest_size; -} - /* * Auxiliary structure appended to each dm-bufio buffer. If the value * hash_verified is nonzero, hash of the block has been verified. @@ -237,8 +152,8 @@ static int verity_hash_final(struct dm_verity *v, struct shash_desc *desc, return r; } -static int verity_hash(struct dm_verity *v, struct shash_desc *desc, - const u8 *data, size_t len, u8 *digest) +int verity_hash(struct dm_verity *v, struct shash_desc *desc, + const u8 *data, size_t len, u8 *digest) { int r; @@ -326,12 +241,12 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, * Verify hash of a metadata block pertaining to the specified data block * ("block" argument) at a specified level ("level" argument). * - * On successful return, io_want_digest(v, io) contains the hash value for - * a lower tree level or for the data block (if we're at the lowest leve). + * On successful return, verity_io_want_digest(v, io) contains the hash value + * for a lower tree level or for the data block (if we're at the lowest level). * * If "skip_unverified" is true, unverified buffer is skipped and 1 is returned. * If "skip_unverified" is false, unverified buffer is hashed and verified - * against current value of io_want_digest(v, io). + * against current value of verity_io_want_digest(v, io). */ static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io, sector_t block, int level, bool skip_unverified, @@ -358,13 +273,13 @@ static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io, goto release_ret_r; } - r = verity_hash(v, io_hash_desc(v, io), + r = verity_hash(v, verity_io_hash_desc(v, io), data, 1 << v->hash_dev_block_bits, - io_real_digest(v, io)); + verity_io_real_digest(v, io)); if (unlikely(r < 0)) goto release_ret_r; - if (likely(memcmp(io_real_digest(v, io), want_digest, + if (likely(memcmp(verity_io_real_digest(v, io), want_digest, v->digest_size) == 0)) aux->hash_verified = 1; else if (verity_handle_err(v, @@ -388,8 +303,8 @@ static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io, * Find a hash for a given block, write it to digest and verify the integrity * of the hash tree if necessary. */ -static int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, - sector_t block, u8 *digest) +int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, + sector_t block, u8 *digest) { int i; int r; @@ -431,10 +346,10 @@ static int verity_verify_io(struct dm_verity_io *io) for (b = 0; b < io->n_blocks; b++) { int r; unsigned todo; - struct shash_desc *desc = io_hash_desc(v, io); + struct shash_desc *desc = verity_io_hash_desc(v, io); r = verity_hash_for_block(v, io, io->block + b, - io_want_digest(v, io)); + verity_io_want_digest(v, io)); if (unlikely(r < 0)) return r; @@ -463,12 +378,12 @@ static int verity_verify_io(struct dm_verity_io *io) todo -= len; } while (todo); - r = verity_hash_final(v, desc, io_real_digest(v, io)); + r = verity_hash_final(v, desc, verity_io_real_digest(v, io)); if (unlikely(r < 0)) return r; - if (likely(memcmp(io_real_digest(v, io), - io_want_digest(v, io), v->digest_size) == 0)) + if (likely(memcmp(verity_io_real_digest(v, io), + verity_io_want_digest(v, io), v->digest_size) == 0)) continue; else if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, io->block + b)) diff --git a/drivers/md/dm-verity.h b/drivers/md/dm-verity.h new file mode 100644 index 0000000000000..ecf4f05add409 --- /dev/null +++ b/drivers/md/dm-verity.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2012 Red Hat, Inc. + * Copyright (C) 2015 Google, Inc. + * + * Author: Mikulas Patocka + * + * Based on Chromium dm-verity driver (C) 2011 The Chromium OS Authors + * + * This file is released under the GPLv2. + */ + +#ifndef DM_VERITY_H +#define DM_VERITY_H + +#include "dm-bufio.h" +#include +#include + +#define DM_VERITY_MAX_LEVELS 63 + +enum verity_mode { + DM_VERITY_MODE_EIO, + DM_VERITY_MODE_LOGGING, + DM_VERITY_MODE_RESTART +}; + +enum verity_block_type { + DM_VERITY_BLOCK_TYPE_DATA, + DM_VERITY_BLOCK_TYPE_METADATA +}; + +struct dm_verity { + struct dm_dev *data_dev; + struct dm_dev *hash_dev; + struct dm_target *ti; + struct dm_bufio_client *bufio; + char *alg_name; + struct crypto_shash *tfm; + u8 *root_digest; /* digest of the root block */ + u8 *salt; /* salt: its size is salt_size */ + unsigned salt_size; + sector_t data_start; /* data offset in 512-byte sectors */ + sector_t hash_start; /* hash start in blocks */ + sector_t data_blocks; /* the number of data blocks */ + sector_t hash_blocks; /* the number of hash blocks */ + unsigned char data_dev_block_bits; /* log2(data blocksize) */ + unsigned char hash_dev_block_bits; /* log2(hash blocksize) */ + unsigned char hash_per_block_bits; /* log2(hashes in hash block) */ + unsigned char levels; /* the number of tree levels */ + unsigned char version; + unsigned digest_size; /* digest size for the current hash algorithm */ + unsigned shash_descsize;/* the size of temporary space for crypto */ + int hash_failed; /* set to 1 if hash of any block failed */ + enum verity_mode mode; /* mode for handling verification errors */ + unsigned corrupted_errs;/* Number of errors for corrupted blocks */ + + struct workqueue_struct *verify_wq; + + /* starting blocks for each tree level. 0 is the lowest level. */ + sector_t hash_level_block[DM_VERITY_MAX_LEVELS]; +}; + +struct dm_verity_io { + struct dm_verity *v; + + /* original values of bio->bi_end_io and bio->bi_private */ + bio_end_io_t *orig_bi_end_io; + void *orig_bi_private; + + sector_t block; + unsigned n_blocks; + + struct bvec_iter iter; + + struct work_struct work; + + /* + * Three variably-size fields follow this struct: + * + * u8 hash_desc[v->shash_descsize]; + * u8 real_digest[v->digest_size]; + * u8 want_digest[v->digest_size]; + * + * To access them use: verity_io_hash_desc(), verity_io_real_digest() + * and verity_io_want_digest(). + */ +}; + +static inline struct shash_desc *verity_io_hash_desc(struct dm_verity *v, + struct dm_verity_io *io) +{ + return (struct shash_desc *)(io + 1); +} + +static inline u8 *verity_io_real_digest(struct dm_verity *v, + struct dm_verity_io *io) +{ + return (u8 *)(io + 1) + v->shash_descsize; +} + +static inline u8 *verity_io_want_digest(struct dm_verity *v, + struct dm_verity_io *io) +{ + return (u8 *)(io + 1) + v->shash_descsize + v->digest_size; +} + +extern int verity_hash(struct dm_verity *v, struct shash_desc *desc, + const u8 *data, size_t len, u8 *digest); + +extern int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, + sector_t block, u8 *digest); + +#endif /* DM_VERITY_H */ From 73ce127b8d82e5c616eceb84b96ecd8621b4c29b Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Wed, 16 Dec 2015 14:28:16 +0000 Subject: [PATCH 0124/1015] UPSTREAM: dm verity: factor out verity_for_bv_block() (cherry-picked from bb4d73ac5e4f0a6c4853f35824f6cb2d396a2f9c) verity_for_bv_block() will be re-used by optional dm-verity object. Bug: 21893453 Change-Id: Ib2f74553faaa6e0e3f5adf7d3742d5b4bfe15089 Signed-off-by: Sami Tolvanen Signed-off-by: Mike Snitzer Git-commit: 42e8a0d21296f099fd75063b7e5f585379b3c1a7 Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/dm-verity-target.c | 72 ++++++++++++++++++++++++----------- drivers/md/dm-verity.h | 6 +++ 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 82d8e71fec265..748ef75c938d4 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -333,19 +333,61 @@ int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, return 0; } +/* + * Calls function process for 1 << v->data_dev_block_bits bytes in the bio_vec + * starting from iter. + */ +int verity_for_bv_block(struct dm_verity *v, struct dm_verity_io *io, + struct bvec_iter *iter, + int (*process)(struct dm_verity *v, + struct dm_verity_io *io, u8 *data, + size_t len)) +{ + unsigned todo = 1 << v->data_dev_block_bits; + struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_bio_data_size); + + do { + int r; + u8 *page; + unsigned len; + struct bio_vec bv = bio_iter_iovec(bio, *iter); + + page = kmap_atomic(bv.bv_page); + len = bv.bv_len; + + if (likely(len >= todo)) + len = todo; + + r = process(v, io, page + bv.bv_offset, len); + kunmap_atomic(page); + + if (r < 0) + return r; + + bio_advance_iter(bio, iter, len); + todo -= len; + } while (todo); + + return 0; +} + +static int verity_bv_hash_update(struct dm_verity *v, struct dm_verity_io *io, + u8 *data, size_t len) +{ + return verity_hash_update(v, verity_io_hash_desc(v, io), data, len); +} + /* * Verify one "dm_verity_io" structure. */ static int verity_verify_io(struct dm_verity_io *io) { struct dm_verity *v = io->v; - struct bio *bio = dm_bio_from_per_bio_data(io, - v->ti->per_bio_data_size); + struct bvec_iter start; unsigned b; for (b = 0; b < io->n_blocks; b++) { int r; - unsigned todo; struct shash_desc *desc = verity_io_hash_desc(v, io); r = verity_hash_for_block(v, io, io->block + b, @@ -357,26 +399,10 @@ static int verity_verify_io(struct dm_verity_io *io) if (unlikely(r < 0)) return r; - todo = 1 << v->data_dev_block_bits; - do { - u8 *page; - unsigned len; - struct bio_vec bv = bio_iter_iovec(bio, io->iter); - - page = kmap_atomic(bv.bv_page); - len = bv.bv_len; - if (likely(len >= todo)) - len = todo; - r = verity_hash_update(v, desc, page + bv.bv_offset, - len); - kunmap_atomic(page); - - if (unlikely(r < 0)) - return r; - - bio_advance_iter(bio, &io->iter, len); - todo -= len; - } while (todo); + start = io->iter; + r = verity_for_bv_block(v, io, &io->iter, verity_bv_hash_update); + if (unlikely(r < 0)) + return r; r = verity_hash_final(v, desc, verity_io_real_digest(v, io)); if (unlikely(r < 0)) diff --git a/drivers/md/dm-verity.h b/drivers/md/dm-verity.h index ecf4f05add409..4c2d3d87db282 100644 --- a/drivers/md/dm-verity.h +++ b/drivers/md/dm-verity.h @@ -104,6 +104,12 @@ static inline u8 *verity_io_want_digest(struct dm_verity *v, return (u8 *)(io + 1) + v->shash_descsize + v->digest_size; } +extern int verity_for_bv_block(struct dm_verity *v, struct dm_verity_io *io, + struct bvec_iter *iter, + int (*process)(struct dm_verity *v, + struct dm_verity_io *io, + u8 *data, size_t len)); + extern int verity_hash(struct dm_verity *v, struct shash_desc *desc, const u8 *data, size_t len, u8 *digest); From 104983f6831ff8ccb4262235929d369ab322a2b3 Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Wed, 16 Dec 2015 14:31:20 +0000 Subject: [PATCH 0125/1015] UPSTREAM: dm verity: add support for forward error correction (cherry-picked from a739ff3f543afbb4a041c16cd0182c8e8d366e70) Add support for correcting corrupted blocks using Reed-Solomon. This code uses RS(255, N) interleaved across data and hash blocks. Each error-correcting block covers N bytes evenly distributed across the combined total data, so that each byte is a maximum distance away from the others. This makes it possible to recover from several consecutive corrupted blocks with relatively small space overhead. In addition, using verity hashes to locate erasures nearly doubles the effectiveness of error correction. Being able to detect corrupted blocks also improves performance, because only corrupted blocks need to corrected. For a 2 GiB partition, RS(255, 253) (two parity bytes for each 253-byte block) can correct up to 16 MiB of consecutive corrupted blocks if erasures can be located, and 8 MiB if they cannot, with 16 MiB space overhead. Bug: 21893453 Change-Id: I940c7ed5526d36b793c2fe3981807d43109847a8 Signed-off-by: Sami Tolvanen Signed-off-by: Mike Snitzer Git-commit: 656b900ff4c23a749d4392a92c0007eb086c322e Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- Documentation/device-mapper/verity.txt | 35 +- drivers/md/Kconfig | 12 + drivers/md/Makefile | 4 + drivers/md/dm-verity-fec.c | 812 +++++++++++++++++++++++++ drivers/md/dm-verity-fec.h | 152 +++++ drivers/md/dm-verity-target.c | 55 +- drivers/md/dm-verity.h | 10 + 7 files changed, 1071 insertions(+), 9 deletions(-) create mode 100644 drivers/md/dm-verity-fec.c create mode 100644 drivers/md/dm-verity-fec.h diff --git a/Documentation/device-mapper/verity.txt b/Documentation/device-mapper/verity.txt index ac71f1f632185..f627bb84bda0e 100644 --- a/Documentation/device-mapper/verity.txt +++ b/Documentation/device-mapper/verity.txt @@ -17,11 +17,11 @@ Construction Parameters 0 is the original format used in the Chromium OS. The salt is appended when hashing, digests are stored continuously and - the rest of the block is padded with zeros. + the rest of the block is padded with zeroes. 1 is the current format that should be used for new devices. The salt is prepended when hashing and each digest is - padded with zeros to the power of two. + padded with zeroes to the power of two. This is the device containing data, the integrity of which needs to be @@ -72,6 +72,32 @@ Construction Parameters notify user space. +use_fec_from_device + Use forward error correction (FEC) to recover from corruption if hash + verification fails. Use encoding data from the specified device. This + may be the same device where data and hash blocks reside, in which case + fec_start must be outside data and hash areas. + + If the encoding data covers additional metadata, it must be accessible + on the hash device after the hash blocks. + + Note: block sizes for data and hash devices must match. Also, if the + verity is encrypted the should be too. + +fec_roots + Number of generator roots. This equals to the number of parity bytes in + the encoding data. For example, in RS(M, N) encoding, the number of roots + is M-N. + +fec_blocks + The number of encoding data blocks on the FEC device. The block size for + the FEC device is . + +fec_start + This is the offset, in blocks, from the start of the + FEC device to the beginning of the encoding data. + + Theory of operation =================== @@ -91,6 +117,11 @@ per-block basis. This allows for a lightweight hash computation on first read into the page cache. Block hashes are stored linearly, aligned to the nearest block size. +If forward error correction (FEC) support is enabled any recovery of +corrupted data will be verified using the cryptographic hash of the +corresponding data. This is why combining error correction with +integrity checking is essential. + Hash Tree --------- diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig index e526f3707ac91..8cbd776492602 100644 --- a/drivers/md/Kconfig +++ b/drivers/md/Kconfig @@ -435,6 +435,18 @@ config DM_VERITY If unsure, say N. +config DM_VERITY_FEC + bool "Verity forward error correction support" + depends on DM_VERITY + select REED_SOLOMON + select REED_SOLOMON_DEC8 + ---help--- + Add forward error correction support to dm-verity. This option + makes it possible to use pre-generated error correction data to + recover from corrupted blocks. + + If unsure, say N. + config DM_SWITCH tristate "Switch target support (EXPERIMENTAL)" depends on BLK_DEV_DM diff --git a/drivers/md/Makefile b/drivers/md/Makefile index 100938bd1842a..5eb6dffb80b97 100644 --- a/drivers/md/Makefile +++ b/drivers/md/Makefile @@ -61,3 +61,7 @@ obj-$(CONFIG_DM_REQ_CRYPT) += dm-req-crypt.o ifeq ($(CONFIG_DM_UEVENT),y) dm-mod-objs += dm-uevent.o endif + +ifeq ($(CONFIG_DM_VERITY_FEC),y) +dm-verity-objs += dm-verity-fec.o +endif diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c new file mode 100644 index 0000000000000..88143d36a1d22 --- /dev/null +++ b/drivers/md/dm-verity-fec.c @@ -0,0 +1,812 @@ +/* + * Copyright (C) 2015 Google, Inc. + * + * Author: Sami Tolvanen + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + */ + +#include "dm-verity-fec.h" +#include + +#define DM_MSG_PREFIX "verity-fec" + +/* + * If error correction has been configured, returns true. + */ +bool verity_fec_is_enabled(struct dm_verity *v) +{ + return v->fec && v->fec->dev; +} + +/* + * Return a pointer to dm_verity_fec_io after dm_verity_io and its variable + * length fields. + */ +static inline struct dm_verity_fec_io *fec_io(struct dm_verity_io *io) +{ + return (struct dm_verity_fec_io *) verity_io_digest_end(io->v, io); +} + +/* + * Return an interleaved offset for a byte in RS block. + */ +static inline u64 fec_interleave(struct dm_verity *v, u64 offset) +{ + u32 mod; + + mod = do_div(offset, v->fec->rsn); + return offset + mod * (v->fec->rounds << v->data_dev_block_bits); +} + +/* + * Decode an RS block using Reed-Solomon. + */ +static int fec_decode_rs8(struct dm_verity *v, struct dm_verity_fec_io *fio, + u8 *data, u8 *fec, int neras) +{ + int i; + uint16_t par[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN]; + + for (i = 0; i < v->fec->roots; i++) + par[i] = fec[i]; + + return decode_rs8(fio->rs, data, par, v->fec->rsn, NULL, neras, + fio->erasures, 0, NULL); +} + +/* + * Read error-correcting codes for the requested RS block. Returns a pointer + * to the data block. Caller is responsible for releasing buf. + */ +static u8 *fec_read_parity(struct dm_verity *v, u64 rsb, int index, + unsigned *offset, struct dm_buffer **buf) +{ + u64 position, block; + u8 *res; + + position = (index + rsb) * v->fec->roots; + block = position >> v->data_dev_block_bits; + *offset = (unsigned)(position - (block << v->data_dev_block_bits)); + + res = dm_bufio_read(v->fec->bufio, v->fec->start + block, buf); + if (unlikely(IS_ERR(res))) { + DMERR("%s: FEC %llu: parity read failed (block %llu): %ld", + v->data_dev->name, (unsigned long long)rsb, + (unsigned long long)(v->fec->start + block), + PTR_ERR(res)); + *buf = NULL; + } + + return res; +} + +/* Loop over each preallocated buffer slot. */ +#define fec_for_each_prealloc_buffer(__i) \ + for (__i = 0; __i < DM_VERITY_FEC_BUF_PREALLOC; __i++) + +/* Loop over each extra buffer slot. */ +#define fec_for_each_extra_buffer(io, __i) \ + for (__i = DM_VERITY_FEC_BUF_PREALLOC; __i < DM_VERITY_FEC_BUF_MAX; __i++) + +/* Loop over each allocated buffer. */ +#define fec_for_each_buffer(io, __i) \ + for (__i = 0; __i < (io)->nbufs; __i++) + +/* Loop over each RS block in each allocated buffer. */ +#define fec_for_each_buffer_rs_block(io, __i, __j) \ + fec_for_each_buffer(io, __i) \ + for (__j = 0; __j < 1 << DM_VERITY_FEC_BUF_RS_BITS; __j++) + +/* + * Return a pointer to the current RS block when called inside + * fec_for_each_buffer_rs_block. + */ +static inline u8 *fec_buffer_rs_block(struct dm_verity *v, + struct dm_verity_fec_io *fio, + unsigned i, unsigned j) +{ + return &fio->bufs[i][j * v->fec->rsn]; +} + +/* + * Return an index to the current RS block when called inside + * fec_for_each_buffer_rs_block. + */ +static inline unsigned fec_buffer_rs_index(unsigned i, unsigned j) +{ + return (i << DM_VERITY_FEC_BUF_RS_BITS) + j; +} + +/* + * Decode all RS blocks from buffers and copy corrected bytes into fio->output + * starting from block_offset. + */ +static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio, + u64 rsb, int byte_index, unsigned block_offset, + int neras) +{ + int r, corrected = 0, res; + struct dm_buffer *buf; + unsigned n, i, offset; + u8 *par, *block; + + par = fec_read_parity(v, rsb, block_offset, &offset, &buf); + if (IS_ERR(par)) + return PTR_ERR(par); + + /* + * Decode the RS blocks we have in bufs. Each RS block results in + * one corrected target byte and consumes fec->roots parity bytes. + */ + fec_for_each_buffer_rs_block(fio, n, i) { + block = fec_buffer_rs_block(v, fio, n, i); + res = fec_decode_rs8(v, fio, block, &par[offset], neras); + if (res < 0) { + dm_bufio_release(buf); + + r = res; + goto error; + } + + corrected += res; + fio->output[block_offset] = block[byte_index]; + + block_offset++; + if (block_offset >= 1 << v->data_dev_block_bits) + goto done; + + /* read the next block when we run out of parity bytes */ + offset += v->fec->roots; + if (offset >= 1 << v->data_dev_block_bits) { + dm_bufio_release(buf); + + par = fec_read_parity(v, rsb, block_offset, &offset, &buf); + if (unlikely(IS_ERR(par))) + return PTR_ERR(par); + } + } +done: + r = corrected; +error: + if (r < 0 && neras) + DMERR_LIMIT("%s: FEC %llu: failed to correct: %d", + v->data_dev->name, (unsigned long long)rsb, r); + else if (r > 0) + DMWARN_LIMIT("%s: FEC %llu: corrected %d errors", + v->data_dev->name, (unsigned long long)rsb, r); + + return r; +} + +/* + * Locate data block erasures using verity hashes. + */ +static int fec_is_erasure(struct dm_verity *v, struct dm_verity_io *io, + u8 *want_digest, u8 *data) +{ + if (unlikely(verity_hash(v, verity_io_hash_desc(v, io), + data, 1 << v->data_dev_block_bits, + verity_io_real_digest(v, io)))) + return 0; + + return memcmp(verity_io_real_digest(v, io), want_digest, + v->digest_size) != 0; +} + +/* + * Read data blocks that are part of the RS block and deinterleave as much as + * fits into buffers. Check for erasure locations if @neras is non-NULL. + */ +static int fec_read_bufs(struct dm_verity *v, struct dm_verity_io *io, + u64 rsb, u64 target, unsigned block_offset, + int *neras) +{ + int i, j, target_index = -1; + struct dm_buffer *buf; + struct dm_bufio_client *bufio; + struct dm_verity_fec_io *fio = fec_io(io); + u64 block, ileaved; + u8 *bbuf, *rs_block; + u8 want_digest[v->digest_size]; + unsigned n, k; + + if (neras) + *neras = 0; + + /* + * read each of the rsn data blocks that are part of the RS block, and + * interleave contents to available bufs + */ + for (i = 0; i < v->fec->rsn; i++) { + ileaved = fec_interleave(v, rsb * v->fec->rsn + i); + + /* + * target is the data block we want to correct, target_index is + * the index of this block within the rsn RS blocks + */ + if (ileaved == target) + target_index = i; + + block = ileaved >> v->data_dev_block_bits; + bufio = v->fec->data_bufio; + + if (block >= v->data_blocks) { + block -= v->data_blocks; + + /* + * blocks outside the area were assumed to contain + * zeros when encoding data was generated + */ + if (unlikely(block >= v->fec->hash_blocks)) + continue; + + block += v->hash_start; + bufio = v->bufio; + } + + bbuf = dm_bufio_read(bufio, block, &buf); + if (unlikely(IS_ERR(bbuf))) { + DMWARN_LIMIT("%s: FEC %llu: read failed (%llu): %ld", + v->data_dev->name, + (unsigned long long)rsb, + (unsigned long long)block, PTR_ERR(bbuf)); + + /* assume the block is corrupted */ + if (neras && *neras <= v->fec->roots) + fio->erasures[(*neras)++] = i; + + continue; + } + + /* locate erasures if the block is on the data device */ + if (bufio == v->fec->data_bufio && + verity_hash_for_block(v, io, block, want_digest) == 0) { + /* + * skip if we have already found the theoretical + * maximum number (i.e. fec->roots) of erasures + */ + if (neras && *neras <= v->fec->roots && + fec_is_erasure(v, io, want_digest, bbuf)) + fio->erasures[(*neras)++] = i; + } + + /* + * deinterleave and copy the bytes that fit into bufs, + * starting from block_offset + */ + fec_for_each_buffer_rs_block(fio, n, j) { + k = fec_buffer_rs_index(n, j) + block_offset; + + if (k >= 1 << v->data_dev_block_bits) + goto done; + + rs_block = fec_buffer_rs_block(v, fio, n, j); + rs_block[i] = bbuf[k]; + } +done: + dm_bufio_release(buf); + } + + return target_index; +} + +/* + * Allocate RS control structure and FEC buffers from preallocated mempools, + * and attempt to allocate as many extra buffers as available. + */ +static int fec_alloc_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio) +{ + unsigned n; + + if (!fio->rs) { + fio->rs = mempool_alloc(v->fec->rs_pool, 0); + if (unlikely(!fio->rs)) { + DMERR("failed to allocate RS"); + return -ENOMEM; + } + } + + fec_for_each_prealloc_buffer(n) { + if (fio->bufs[n]) + continue; + + fio->bufs[n] = mempool_alloc(v->fec->prealloc_pool, GFP_NOIO); + if (unlikely(!fio->bufs[n])) { + DMERR("failed to allocate FEC buffer"); + return -ENOMEM; + } + } + + /* try to allocate the maximum number of buffers */ + fec_for_each_extra_buffer(fio, n) { + if (fio->bufs[n]) + continue; + + fio->bufs[n] = mempool_alloc(v->fec->extra_pool, GFP_NOIO); + /* we can manage with even one buffer if necessary */ + if (unlikely(!fio->bufs[n])) + break; + } + fio->nbufs = n; + + if (!fio->output) { + fio->output = mempool_alloc(v->fec->output_pool, GFP_NOIO); + + if (!fio->output) { + DMERR("failed to allocate FEC page"); + return -ENOMEM; + } + } + + return 0; +} + +/* + * Initialize buffers and clear erasures. fec_read_bufs() assumes buffers are + * zeroed before deinterleaving. + */ +static void fec_init_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio) +{ + unsigned n; + + fec_for_each_buffer(fio, n) + memset(fio->bufs[n], 0, v->fec->rsn << DM_VERITY_FEC_BUF_RS_BITS); + + memset(fio->erasures, 0, sizeof(fio->erasures)); +} + +/* + * Decode all RS blocks in a single data block and return the target block + * (indicated by @offset) in fio->output. If @use_erasures is non-zero, uses + * hashes to locate erasures. + */ +static int fec_decode_rsb(struct dm_verity *v, struct dm_verity_io *io, + struct dm_verity_fec_io *fio, u64 rsb, u64 offset, + bool use_erasures) +{ + int r, neras = 0; + unsigned pos; + + r = fec_alloc_bufs(v, fio); + if (unlikely(r < 0)) + return r; + + for (pos = 0; pos < 1 << v->data_dev_block_bits; ) { + fec_init_bufs(v, fio); + + r = fec_read_bufs(v, io, rsb, offset, pos, + use_erasures ? &neras : NULL); + if (unlikely(r < 0)) + return r; + + r = fec_decode_bufs(v, fio, rsb, r, pos, neras); + if (r < 0) + return r; + + pos += fio->nbufs << DM_VERITY_FEC_BUF_RS_BITS; + } + + /* Always re-validate the corrected block against the expected hash */ + r = verity_hash(v, verity_io_hash_desc(v, io), fio->output, + 1 << v->data_dev_block_bits, + verity_io_real_digest(v, io)); + if (unlikely(r < 0)) + return r; + + if (memcmp(verity_io_real_digest(v, io), verity_io_want_digest(v, io), + v->digest_size)) { + DMERR_LIMIT("%s: FEC %llu: failed to correct (%d erasures)", + v->data_dev->name, (unsigned long long)rsb, neras); + return -EILSEQ; + } + + return 0; +} + +static int fec_bv_copy(struct dm_verity *v, struct dm_verity_io *io, u8 *data, + size_t len) +{ + struct dm_verity_fec_io *fio = fec_io(io); + + memcpy(data, &fio->output[fio->output_pos], len); + fio->output_pos += len; + + return 0; +} + +/* + * Correct errors in a block. Copies corrected block to dest if non-NULL, + * otherwise to a bio_vec starting from iter. + */ +int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io, + enum verity_block_type type, sector_t block, u8 *dest, + struct bvec_iter *iter) +{ + int r; + struct dm_verity_fec_io *fio = fec_io(io); + u64 offset, res, rsb; + + if (!verity_fec_is_enabled(v)) + return -EOPNOTSUPP; + + if (type == DM_VERITY_BLOCK_TYPE_METADATA) + block += v->data_blocks; + + /* + * For RS(M, N), the continuous FEC data is divided into blocks of N + * bytes. Since block size may not be divisible by N, the last block + * is zero padded when decoding. + * + * Each byte of the block is covered by a different RS(M, N) code, + * and each code is interleaved over N blocks to make it less likely + * that bursty corruption will leave us in unrecoverable state. + */ + + offset = block << v->data_dev_block_bits; + + res = offset; + div64_u64(res, v->fec->rounds << v->data_dev_block_bits); + + /* + * The base RS block we can feed to the interleaver to find out all + * blocks required for decoding. + */ + rsb = offset - res * (v->fec->rounds << v->data_dev_block_bits); + + /* + * Locating erasures is slow, so attempt to recover the block without + * them first. Do a second attempt with erasures if the corruption is + * bad enough. + */ + r = fec_decode_rsb(v, io, fio, rsb, offset, false); + if (r < 0) { + r = fec_decode_rsb(v, io, fio, rsb, offset, true); + if (r < 0) + return r; + } + + if (dest) + memcpy(dest, fio->output, 1 << v->data_dev_block_bits); + else if (iter) { + fio->output_pos = 0; + r = verity_for_bv_block(v, io, iter, fec_bv_copy); + } + + return r; +} + +/* + * Clean up per-bio data. + */ +void verity_fec_finish_io(struct dm_verity_io *io) +{ + unsigned n; + struct dm_verity_fec *f = io->v->fec; + struct dm_verity_fec_io *fio = fec_io(io); + + if (!verity_fec_is_enabled(io->v)) + return; + + mempool_free(fio->rs, f->rs_pool); + + fec_for_each_prealloc_buffer(n) + mempool_free(fio->bufs[n], f->prealloc_pool); + + fec_for_each_extra_buffer(fio, n) + mempool_free(fio->bufs[n], f->extra_pool); + + mempool_free(fio->output, f->output_pool); +} + +/* + * Initialize per-bio data. + */ +void verity_fec_init_io(struct dm_verity_io *io) +{ + struct dm_verity_fec_io *fio = fec_io(io); + + if (!verity_fec_is_enabled(io->v)) + return; + + fio->rs = NULL; + memset(fio->bufs, 0, sizeof(fio->bufs)); + fio->nbufs = 0; + fio->output = NULL; +} + +/* + * Append feature arguments and values to the status table. + */ +unsigned verity_fec_status_table(struct dm_verity *v, unsigned sz, + char *result, unsigned maxlen) +{ + if (!verity_fec_is_enabled(v)) + return sz; + + DMEMIT(" " DM_VERITY_OPT_FEC_DEV " %s " + DM_VERITY_OPT_FEC_BLOCKS " %llu " + DM_VERITY_OPT_FEC_START " %llu " + DM_VERITY_OPT_FEC_ROOTS " %d", + v->fec->dev->name, + (unsigned long long)v->fec->blocks, + (unsigned long long)v->fec->start, + v->fec->roots); + + return sz; +} + +void verity_fec_dtr(struct dm_verity *v) +{ + struct dm_verity_fec *f = v->fec; + + if (!verity_fec_is_enabled(v)) + goto out; + + mempool_destroy(f->rs_pool); + mempool_destroy(f->prealloc_pool); + mempool_destroy(f->extra_pool); + kmem_cache_destroy(f->cache); + + if (f->data_bufio) + dm_bufio_client_destroy(f->data_bufio); + if (f->bufio) + dm_bufio_client_destroy(f->bufio); + + if (f->dev) + dm_put_device(v->ti, f->dev); +out: + kfree(f); + v->fec = NULL; +} + +static void *fec_rs_alloc(gfp_t gfp_mask, void *pool_data) +{ + struct dm_verity *v = (struct dm_verity *)pool_data; + + return init_rs(8, 0x11d, 0, 1, v->fec->roots); +} + +static void fec_rs_free(void *element, void *pool_data) +{ + struct rs_control *rs = (struct rs_control *)element; + + if (rs) + free_rs(rs); +} + +bool verity_is_fec_opt_arg(const char *arg_name) +{ + return (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_DEV) || + !strcasecmp(arg_name, DM_VERITY_OPT_FEC_BLOCKS) || + !strcasecmp(arg_name, DM_VERITY_OPT_FEC_START) || + !strcasecmp(arg_name, DM_VERITY_OPT_FEC_ROOTS)); +} + +int verity_fec_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v, + unsigned *argc, const char *arg_name) +{ + int r; + struct dm_target *ti = v->ti; + const char *arg_value; + unsigned long long num_ll; + unsigned char num_c; + char dummy; + + if (!*argc) { + ti->error = "FEC feature arguments require a value"; + return -EINVAL; + } + + arg_value = dm_shift_arg(as); + (*argc)--; + + if (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_DEV)) { + r = dm_get_device(ti, arg_value, FMODE_READ, &v->fec->dev); + if (r) { + ti->error = "FEC device lookup failed"; + return r; + } + + } else if (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_BLOCKS)) { + if (sscanf(arg_value, "%llu%c", &num_ll, &dummy) != 1 || + ((sector_t)(num_ll << (v->data_dev_block_bits - SECTOR_SHIFT)) + >> (v->data_dev_block_bits - SECTOR_SHIFT) != num_ll)) { + ti->error = "Invalid " DM_VERITY_OPT_FEC_BLOCKS; + return -EINVAL; + } + v->fec->blocks = num_ll; + + } else if (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_START)) { + if (sscanf(arg_value, "%llu%c", &num_ll, &dummy) != 1 || + ((sector_t)(num_ll << (v->data_dev_block_bits - SECTOR_SHIFT)) >> + (v->data_dev_block_bits - SECTOR_SHIFT) != num_ll)) { + ti->error = "Invalid " DM_VERITY_OPT_FEC_START; + return -EINVAL; + } + v->fec->start = num_ll; + + } else if (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_ROOTS)) { + if (sscanf(arg_value, "%hhu%c", &num_c, &dummy) != 1 || !num_c || + num_c < (DM_VERITY_FEC_RSM - DM_VERITY_FEC_MAX_RSN) || + num_c > (DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN)) { + ti->error = "Invalid " DM_VERITY_OPT_FEC_ROOTS; + return -EINVAL; + } + v->fec->roots = num_c; + + } else { + ti->error = "Unrecognized verity FEC feature request"; + return -EINVAL; + } + + return 0; +} + +/* + * Allocate dm_verity_fec for v->fec. Must be called before verity_fec_ctr. + */ +int verity_fec_ctr_alloc(struct dm_verity *v) +{ + struct dm_verity_fec *f; + + f = kzalloc(sizeof(struct dm_verity_fec), GFP_KERNEL); + if (!f) { + v->ti->error = "Cannot allocate FEC structure"; + return -ENOMEM; + } + v->fec = f; + + return 0; +} + +/* + * Validate arguments and preallocate memory. Must be called after arguments + * have been parsed using verity_fec_parse_opt_args. + */ +int verity_fec_ctr(struct dm_verity *v) +{ + struct dm_verity_fec *f = v->fec; + struct dm_target *ti = v->ti; + u64 hash_blocks; + + if (!verity_fec_is_enabled(v)) { + verity_fec_dtr(v); + return 0; + } + + /* + * FEC is computed over data blocks, possible metadata, and + * hash blocks. In other words, FEC covers total of fec_blocks + * blocks consisting of the following: + * + * data blocks | hash blocks | metadata (optional) + * + * We allow metadata after hash blocks to support a use case + * where all data is stored on the same device and FEC covers + * the entire area. + * + * If metadata is included, we require it to be available on the + * hash device after the hash blocks. + */ + + hash_blocks = v->hash_blocks - v->hash_start; + + /* + * Require matching block sizes for data and hash devices for + * simplicity. + */ + if (v->data_dev_block_bits != v->hash_dev_block_bits) { + ti->error = "Block sizes must match to use FEC"; + return -EINVAL; + } + + if (!f->roots) { + ti->error = "Missing " DM_VERITY_OPT_FEC_ROOTS; + return -EINVAL; + } + f->rsn = DM_VERITY_FEC_RSM - f->roots; + + if (!f->blocks) { + ti->error = "Missing " DM_VERITY_OPT_FEC_BLOCKS; + return -EINVAL; + } + + f->rounds = f->blocks; + if (sector_div(f->rounds, f->rsn)) + f->rounds++; + + /* + * Due to optional metadata, f->blocks can be larger than + * data_blocks and hash_blocks combined. + */ + if (f->blocks < v->data_blocks + hash_blocks || !f->rounds) { + ti->error = "Invalid " DM_VERITY_OPT_FEC_BLOCKS; + return -EINVAL; + } + + /* + * Metadata is accessed through the hash device, so we require + * it to be large enough. + */ + f->hash_blocks = f->blocks - v->data_blocks; + if (dm_bufio_get_device_size(v->bufio) < f->hash_blocks) { + ti->error = "Hash device is too small for " + DM_VERITY_OPT_FEC_BLOCKS; + return -E2BIG; + } + + f->bufio = dm_bufio_client_create(f->dev->bdev, + 1 << v->data_dev_block_bits, + 1, 0, NULL, NULL); + if (IS_ERR(f->bufio)) { + ti->error = "Cannot initialize FEC bufio client"; + return PTR_ERR(f->bufio); + } + + if (dm_bufio_get_device_size(f->bufio) < + ((f->start + f->rounds * f->roots) >> v->data_dev_block_bits)) { + ti->error = "FEC device is too small"; + return -E2BIG; + } + + f->data_bufio = dm_bufio_client_create(v->data_dev->bdev, + 1 << v->data_dev_block_bits, + 1, 0, NULL, NULL); + if (IS_ERR(f->data_bufio)) { + ti->error = "Cannot initialize FEC data bufio client"; + return PTR_ERR(f->data_bufio); + } + + if (dm_bufio_get_device_size(f->data_bufio) < v->data_blocks) { + ti->error = "Data device is too small"; + return -E2BIG; + } + + /* Preallocate an rs_control structure for each worker thread */ + f->rs_pool = mempool_create(num_online_cpus(), fec_rs_alloc, + fec_rs_free, (void *) v); + if (!f->rs_pool) { + ti->error = "Cannot allocate RS pool"; + return -ENOMEM; + } + + f->cache = kmem_cache_create("dm_verity_fec_buffers", + f->rsn << DM_VERITY_FEC_BUF_RS_BITS, + 0, 0, NULL); + if (!f->cache) { + ti->error = "Cannot create FEC buffer cache"; + return -ENOMEM; + } + + /* Preallocate DM_VERITY_FEC_BUF_PREALLOC buffers for each thread */ + f->prealloc_pool = mempool_create_slab_pool(num_online_cpus() * + DM_VERITY_FEC_BUF_PREALLOC, + f->cache); + if (!f->prealloc_pool) { + ti->error = "Cannot allocate FEC buffer prealloc pool"; + return -ENOMEM; + } + + f->extra_pool = mempool_create_slab_pool(0, f->cache); + if (!f->extra_pool) { + ti->error = "Cannot allocate FEC buffer extra pool"; + return -ENOMEM; + } + + /* Preallocate an output buffer for each thread */ + f->output_pool = mempool_create_kmalloc_pool(num_online_cpus(), + 1 << v->data_dev_block_bits); + if (!f->output_pool) { + ti->error = "Cannot allocate FEC output pool"; + return -ENOMEM; + } + + /* Reserve space for our per-bio data */ + ti->per_bio_data_size += sizeof(struct dm_verity_fec_io); + + return 0; +} diff --git a/drivers/md/dm-verity-fec.h b/drivers/md/dm-verity-fec.h new file mode 100644 index 0000000000000..7fa0298b995e9 --- /dev/null +++ b/drivers/md/dm-verity-fec.h @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2015 Google, Inc. + * + * Author: Sami Tolvanen + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + */ + +#ifndef DM_VERITY_FEC_H +#define DM_VERITY_FEC_H + +#include "dm-verity.h" +#include + +/* Reed-Solomon(M, N) parameters */ +#define DM_VERITY_FEC_RSM 255 +#define DM_VERITY_FEC_MAX_RSN 253 +#define DM_VERITY_FEC_MIN_RSN 231 /* ~10% space overhead */ + +/* buffers for deinterleaving and decoding */ +#define DM_VERITY_FEC_BUF_PREALLOC 1 /* buffers to preallocate */ +#define DM_VERITY_FEC_BUF_RS_BITS 4 /* 1 << RS blocks per buffer */ +/* we need buffers for at most 1 << block size RS blocks */ +#define DM_VERITY_FEC_BUF_MAX \ + (1 << (PAGE_SHIFT - DM_VERITY_FEC_BUF_RS_BITS)) + +#define DM_VERITY_OPT_FEC_DEV "use_fec_from_device" +#define DM_VERITY_OPT_FEC_BLOCKS "fec_blocks" +#define DM_VERITY_OPT_FEC_START "fec_start" +#define DM_VERITY_OPT_FEC_ROOTS "fec_roots" + +/* configuration */ +struct dm_verity_fec { + struct dm_dev *dev; /* parity data device */ + struct dm_bufio_client *data_bufio; /* for data dev access */ + struct dm_bufio_client *bufio; /* for parity data access */ + sector_t start; /* parity data start in blocks */ + sector_t blocks; /* number of blocks covered */ + sector_t rounds; /* number of interleaving rounds */ + sector_t hash_blocks; /* blocks covered after v->hash_start */ + unsigned char roots; /* number of parity bytes, M-N of RS(M, N) */ + unsigned char rsn; /* N of RS(M, N) */ + mempool_t *rs_pool; /* mempool for fio->rs */ + mempool_t *prealloc_pool; /* mempool for preallocated buffers */ + mempool_t *extra_pool; /* mempool for extra buffers */ + mempool_t *output_pool; /* mempool for output */ + struct kmem_cache *cache; /* cache for buffers */ +}; + +/* per-bio data */ +struct dm_verity_fec_io { + struct rs_control *rs; /* Reed-Solomon state */ + int erasures[DM_VERITY_FEC_MAX_RSN]; /* erasures for decode_rs8 */ + u8 *bufs[DM_VERITY_FEC_BUF_MAX]; /* bufs for deinterleaving */ + unsigned nbufs; /* number of buffers allocated */ + u8 *output; /* buffer for corrected output */ + size_t output_pos; +}; + +#ifdef CONFIG_DM_VERITY_FEC + +/* each feature parameter requires a value */ +#define DM_VERITY_OPTS_FEC 8 + +extern bool verity_fec_is_enabled(struct dm_verity *v); + +extern int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io, + enum verity_block_type type, sector_t block, + u8 *dest, struct bvec_iter *iter); + +extern unsigned verity_fec_status_table(struct dm_verity *v, unsigned sz, + char *result, unsigned maxlen); + +extern void verity_fec_finish_io(struct dm_verity_io *io); +extern void verity_fec_init_io(struct dm_verity_io *io); + +extern bool verity_is_fec_opt_arg(const char *arg_name); +extern int verity_fec_parse_opt_args(struct dm_arg_set *as, + struct dm_verity *v, unsigned *argc, + const char *arg_name); + +extern void verity_fec_dtr(struct dm_verity *v); + +extern int verity_fec_ctr_alloc(struct dm_verity *v); +extern int verity_fec_ctr(struct dm_verity *v); + +#else /* !CONFIG_DM_VERITY_FEC */ + +#define DM_VERITY_OPTS_FEC 0 + +static inline bool verity_fec_is_enabled(struct dm_verity *v) +{ + return false; +} + +static inline int verity_fec_decode(struct dm_verity *v, + struct dm_verity_io *io, + enum verity_block_type type, + sector_t block, u8 *dest, + struct bvec_iter *iter) +{ + return -EOPNOTSUPP; +} + +static inline unsigned verity_fec_status_table(struct dm_verity *v, + unsigned sz, char *result, + unsigned maxlen) +{ + return sz; +} + +static inline void verity_fec_finish_io(struct dm_verity_io *io) +{ +} + +static inline void verity_fec_init_io(struct dm_verity_io *io) +{ +} + +static inline bool verity_is_fec_opt_arg(const char *arg_name) +{ + return false; +} + +static inline int verity_fec_parse_opt_args(struct dm_arg_set *as, + struct dm_verity *v, + unsigned *argc, + const char *arg_name) +{ + return -EINVAL; +} + +static inline void verity_fec_dtr(struct dm_verity *v) +{ +} + +static inline int verity_fec_ctr_alloc(struct dm_verity *v) +{ + return 0; +} + +static inline int verity_fec_ctr(struct dm_verity *v) +{ + return 0; +} + +#endif /* CONFIG_DM_VERITY_FEC */ + +#endif /* DM_VERITY_FEC_H */ diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 748ef75c938d4..0b927cf54e8b6 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -15,6 +15,7 @@ */ #include "dm-verity.h" +#include "dm-verity-fec.h" #include #include @@ -31,7 +32,7 @@ #define DM_VERITY_OPT_LOGGING "ignore_corruption" #define DM_VERITY_OPT_RESTART "restart_on_corruption" -#define DM_VERITY_OPTS_MAX 1 +#define DM_VERITY_OPTS_MAX (1 + DM_VERITY_OPTS_FEC) static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE; @@ -282,6 +283,10 @@ static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io, if (likely(memcmp(verity_io_real_digest(v, io), want_digest, v->digest_size) == 0)) aux->hash_verified = 1; + else if (verity_fec_decode(v, io, + DM_VERITY_BLOCK_TYPE_METADATA, + hash_block, data, NULL) == 0) + aux->hash_verified = 1; else if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_METADATA, hash_block)) { @@ -411,8 +416,11 @@ static int verity_verify_io(struct dm_verity_io *io) if (likely(memcmp(verity_io_real_digest(v, io), verity_io_want_digest(v, io), v->digest_size) == 0)) continue; + else if (verity_fec_decode(v, io, DM_VERITY_BLOCK_TYPE_DATA, + io->block + b, NULL, &start) == 0) + continue; else if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, - io->block + b)) + io->block + b)) return -EIO; } @@ -430,6 +438,8 @@ static void verity_finish_io(struct dm_verity_io *io, int error) bio->bi_end_io = io->orig_bi_end_io; bio->bi_private = io->orig_bi_private; + verity_fec_finish_io(io); + bio_endio_nodec(bio, error); } @@ -444,7 +454,7 @@ static void verity_end_io(struct bio *bio, int error) { struct dm_verity_io *io = bio->bi_private; - if (error) { + if (error && !verity_fec_is_enabled(io->v)) { verity_finish_io(io, error); return; } @@ -548,6 +558,8 @@ static int verity_map(struct dm_target *ti, struct bio *bio) bio->bi_private = io; io->iter = bio->bi_iter; + verity_fec_init_io(io); + verity_submit_prefetch(v, io); generic_make_request(bio); @@ -562,6 +574,7 @@ static void verity_status(struct dm_target *ti, status_type_t type, unsigned status_flags, char *result, unsigned maxlen) { struct dm_verity *v = ti->private; + unsigned args = 0; unsigned sz = 0; unsigned x; @@ -588,8 +601,15 @@ static void verity_status(struct dm_target *ti, status_type_t type, else for (x = 0; x < v->salt_size; x++) DMEMIT("%02x", v->salt[x]); + if (v->mode != DM_VERITY_MODE_EIO) + args++; + if (verity_fec_is_enabled(v)) + args += DM_VERITY_OPTS_FEC; + if (!args) + return; + DMEMIT(" %u", args); if (v->mode != DM_VERITY_MODE_EIO) { - DMEMIT(" 1 "); + DMEMIT(" "); switch (v->mode) { case DM_VERITY_MODE_LOGGING: DMEMIT(DM_VERITY_OPT_LOGGING); @@ -601,6 +621,7 @@ static void verity_status(struct dm_target *ti, status_type_t type, BUG(); } } + sz = verity_fec_status_table(v, sz, result, maxlen); break; } } @@ -679,6 +700,8 @@ static void verity_dtr(struct dm_target *ti) if (v->data_dev) dm_put_device(ti, v->data_dev); + verity_fec_dtr(v); + kfree(v); } @@ -711,6 +734,12 @@ static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v) } else if (!strcasecmp(arg_name, DM_VERITY_OPT_RESTART)) { v->mode = DM_VERITY_MODE_RESTART; continue; + + } else if (verity_is_fec_opt_arg(arg_name)) { + r = verity_fec_parse_opt_args(as, v, &argc, arg_name); + if (r) + return r; + continue; } ti->error = "Unrecognized verity feature request"; @@ -753,6 +782,10 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) ti->private = v; v->ti = ti; + r = verity_fec_ctr_alloc(v); + if (r) + goto bad; + if ((dm_table_get_mode(ti->table) & ~FMODE_READ)) { ti->error = "Device must be readonly"; r = -EINVAL; @@ -941,8 +974,6 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) goto bad; } - ti->per_bio_data_size = roundup(sizeof(struct dm_verity_io) + v->shash_descsize + v->digest_size * 2, __alignof__(struct dm_verity_io)); - /* WQ_UNBOUND greatly improves performance when running on ramdisk */ v->verify_wq = alloc_workqueue("kverityd", WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM | WQ_UNBOUND, num_online_cpus()); if (!v->verify_wq) { @@ -951,6 +982,16 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) goto bad; } + ti->per_bio_data_size = sizeof(struct dm_verity_io) + + v->shash_descsize + v->digest_size * 2; + + r = verity_fec_ctr(v); + if (r) + goto bad; + + ti->per_bio_data_size = roundup(ti->per_bio_data_size, + __alignof__(struct dm_verity_io)); + return 0; bad: @@ -961,7 +1002,7 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) static struct target_type verity_target = { .name = "verity", - .version = {1, 2, 0}, + .version = {1, 3, 0}, .module = THIS_MODULE, .ctr = verity_ctr, .dtr = verity_dtr, diff --git a/drivers/md/dm-verity.h b/drivers/md/dm-verity.h index 4c2d3d87db282..daf2172497e6c 100644 --- a/drivers/md/dm-verity.h +++ b/drivers/md/dm-verity.h @@ -29,6 +29,8 @@ enum verity_block_type { DM_VERITY_BLOCK_TYPE_METADATA }; +struct dm_verity_fec; + struct dm_verity { struct dm_dev *data_dev; struct dm_dev *hash_dev; @@ -58,6 +60,8 @@ struct dm_verity { /* starting blocks for each tree level. 0 is the lowest level. */ sector_t hash_level_block[DM_VERITY_MAX_LEVELS]; + + struct dm_verity_fec *fec; /* forward error correction */ }; struct dm_verity_io { @@ -104,6 +108,12 @@ static inline u8 *verity_io_want_digest(struct dm_verity *v, return (u8 *)(io + 1) + v->shash_descsize + v->digest_size; } +static inline u8 *verity_io_digest_end(struct dm_verity *v, + struct dm_verity_io *io) +{ + return verity_io_want_digest(v, io) + v->digest_size; +} + extern int verity_for_bv_block(struct dm_verity *v, struct dm_verity_io *io, struct bvec_iter *iter, int (*process)(struct dm_verity *v, From ce3c2b427e748bf51e9ad5717dd803322d40ed1c Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Wed, 16 Dec 2015 14:32:37 +0000 Subject: [PATCH 0126/1015] UPSTREAM: dm verity: add ignore_zero_blocks feature (cherry-picked from 0cc37c2df4fa0aa702f9662edce4b7ce12c86b7a) If ignore_zero_blocks is enabled dm-verity will return zeroes for blocks matching a zero hash without validating the content. Bug: 21893453 Change-Id: Id7f105187da2e3af96040bfc1be886cdda086aef Signed-off-by: Sami Tolvanen Signed-off-by: Mike Snitzer Git-commit: 7112f730a3061f3c726651eef8bc298cf7a2e4ce Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- Documentation/device-mapper/verity.txt | 5 ++ drivers/md/dm-verity-fec.c | 8 ++- drivers/md/dm-verity-target.c | 87 +++++++++++++++++++++++--- drivers/md/dm-verity.h | 3 +- 4 files changed, 93 insertions(+), 10 deletions(-) diff --git a/Documentation/device-mapper/verity.txt b/Documentation/device-mapper/verity.txt index f627bb84bda0e..d1655d2b44196 100644 --- a/Documentation/device-mapper/verity.txt +++ b/Documentation/device-mapper/verity.txt @@ -72,6 +72,11 @@ Construction Parameters notify user space. +ignore_zero_blocks + Do not verify blocks that are expected to contain zeroes and always return + zeroes instead. This may be useful if the partition contains unused blocks + that are not guaranteed to contain zeroes. + use_fec_from_device Use forward error correction (FEC) to recover from corruption if hash verification fails. Use encoding data from the specified device. This diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c index 88143d36a1d22..1cc10c4de7010 100644 --- a/drivers/md/dm-verity-fec.c +++ b/drivers/md/dm-verity-fec.c @@ -205,6 +205,7 @@ static int fec_read_bufs(struct dm_verity *v, struct dm_verity_io *io, u64 rsb, u64 target, unsigned block_offset, int *neras) { + bool is_zero; int i, j, target_index = -1; struct dm_buffer *buf; struct dm_bufio_client *bufio; @@ -264,7 +265,12 @@ static int fec_read_bufs(struct dm_verity *v, struct dm_verity_io *io, /* locate erasures if the block is on the data device */ if (bufio == v->fec->data_bufio && - verity_hash_for_block(v, io, block, want_digest) == 0) { + verity_hash_for_block(v, io, block, want_digest, + &is_zero) == 0) { + /* skip known zero blocks entirely */ + if (is_zero) + continue; + /* * skip if we have already found the theoretical * maximum number (i.e. fec->roots) of erasures diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 0b927cf54e8b6..4258e175513da 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -31,8 +31,9 @@ #define DM_VERITY_OPT_LOGGING "ignore_corruption" #define DM_VERITY_OPT_RESTART "restart_on_corruption" +#define DM_VERITY_OPT_IGN_ZEROES "ignore_zero_blocks" -#define DM_VERITY_OPTS_MAX (1 + DM_VERITY_OPTS_FEC) +#define DM_VERITY_OPTS_MAX (2 + DM_VERITY_OPTS_FEC) static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE; @@ -309,10 +310,9 @@ static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io, * of the hash tree if necessary. */ int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, - sector_t block, u8 *digest) + sector_t block, u8 *digest, bool *is_zero) { - int i; - int r; + int r = 0, i; if (likely(v->levels)) { /* @@ -324,7 +324,7 @@ int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, */ r = verity_verify_level(v, io, block, 0, true, digest); if (likely(r <= 0)) - return r; + goto out; } memcpy(digest, v->root_digest, v->digest_size); @@ -332,10 +332,15 @@ int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, for (i = v->levels - 1; i >= 0; i--) { r = verity_verify_level(v, io, block, i, false, digest); if (unlikely(r)) - return r; + goto out; } +out: + if (!r && v->zero_digest) + *is_zero = !memcmp(v->zero_digest, digest, v->digest_size); + else + *is_zero = false; - return 0; + return r; } /* @@ -382,11 +387,19 @@ static int verity_bv_hash_update(struct dm_verity *v, struct dm_verity_io *io, return verity_hash_update(v, verity_io_hash_desc(v, io), data, len); } +static int verity_bv_zero(struct dm_verity *v, struct dm_verity_io *io, + u8 *data, size_t len) +{ + memset(data, 0, len); + return 0; +} + /* * Verify one "dm_verity_io" structure. */ static int verity_verify_io(struct dm_verity_io *io) { + bool is_zero; struct dm_verity *v = io->v; struct bvec_iter start; unsigned b; @@ -396,10 +409,24 @@ static int verity_verify_io(struct dm_verity_io *io) struct shash_desc *desc = verity_io_hash_desc(v, io); r = verity_hash_for_block(v, io, io->block + b, - verity_io_want_digest(v, io)); + verity_io_want_digest(v, io), + &is_zero); if (unlikely(r < 0)) return r; + if (is_zero) { + /* + * If we expect a zero block, don't validate, just + * return zeros. + */ + r = verity_for_bv_block(v, io, &io->iter, + verity_bv_zero); + if (unlikely(r < 0)) + return r; + + continue; + } + r = verity_hash_init(v, desc); if (unlikely(r < 0)) return r; @@ -605,6 +632,8 @@ static void verity_status(struct dm_target *ti, status_type_t type, args++; if (verity_fec_is_enabled(v)) args += DM_VERITY_OPTS_FEC; + if (v->zero_digest) + args++; if (!args) return; DMEMIT(" %u", args); @@ -621,6 +650,8 @@ static void verity_status(struct dm_target *ti, status_type_t type, BUG(); } } + if (v->zero_digest) + DMEMIT(" " DM_VERITY_OPT_IGN_ZEROES); sz = verity_fec_status_table(v, sz, result, maxlen); break; } @@ -688,6 +719,7 @@ static void verity_dtr(struct dm_target *ti) kfree(v->salt); kfree(v->root_digest); + kfree(v->zero_digest); if (v->tfm) crypto_free_shash(v->tfm); @@ -705,6 +737,37 @@ static void verity_dtr(struct dm_target *ti) kfree(v); } +static int verity_alloc_zero_digest(struct dm_verity *v) +{ + int r = -ENOMEM; + struct shash_desc *desc; + u8 *zero_data; + + v->zero_digest = kmalloc(v->digest_size, GFP_KERNEL); + + if (!v->zero_digest) + return r; + + desc = kmalloc(v->shash_descsize, GFP_KERNEL); + + if (!desc) + return r; /* verity_dtr will free zero_digest */ + + zero_data = kzalloc(1 << v->data_dev_block_bits, GFP_KERNEL); + + if (!zero_data) + goto out; + + r = verity_hash(v, desc, zero_data, 1 << v->data_dev_block_bits, + v->zero_digest); + +out: + kfree(desc); + kfree(zero_data); + + return r; +} + static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v) { int r; @@ -735,6 +798,14 @@ static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v) v->mode = DM_VERITY_MODE_RESTART; continue; + } else if (!strcasecmp(arg_name, DM_VERITY_OPT_IGN_ZEROES)) { + r = verity_alloc_zero_digest(v); + if (r) { + ti->error = "Cannot allocate zero digest"; + return r; + } + continue; + } else if (verity_is_fec_opt_arg(arg_name)) { r = verity_fec_parse_opt_args(as, v, &argc, arg_name); if (r) diff --git a/drivers/md/dm-verity.h b/drivers/md/dm-verity.h index daf2172497e6c..85735eb856471 100644 --- a/drivers/md/dm-verity.h +++ b/drivers/md/dm-verity.h @@ -40,6 +40,7 @@ struct dm_verity { struct crypto_shash *tfm; u8 *root_digest; /* digest of the root block */ u8 *salt; /* salt: its size is salt_size */ + u8 *zero_digest; /* digest for a zero block */ unsigned salt_size; sector_t data_start; /* data offset in 512-byte sectors */ sector_t hash_start; /* hash start in blocks */ @@ -124,6 +125,6 @@ extern int verity_hash(struct dm_verity *v, struct shash_desc *desc, const u8 *data, size_t len, u8 *digest); extern int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, - sector_t block, u8 *digest); + sector_t block, u8 *digest, bool *is_zero); #endif /* DM_VERITY_H */ From 23ae5e4542fff2cfb70c7dda5829991aabb26194 Mon Sep 17 00:00:00 2001 From: Tim Murray Date: Tue, 19 Jan 2016 16:35:17 -0800 Subject: [PATCH 0127/1015] ANDROID: dm-verity: run in a WQ_HIGHPRI workqueue (cherry picked from commit a96fcc535ba881b4100eb2c9db8423fe7ef23422) Running dm-verity in a standard workqueue results in IO competing for CPU time with standard user apps, which can lead to pipeline bubbles and seriously degraded performance. Move to a WQ_HIGHPRI workqueue to protect against that. Bug: 25392275 Change-Id: Idbb195b3f1c2ad446224fa870965f16d8b4b63d7 Signed-off-by: Tim Murray Git-commit: 8af9b174b1ab266e2d80fde4e26d30f0a9af80fc Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/dm-verity-target.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 4258e175513da..185b265a91803 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -1046,7 +1046,9 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) } /* WQ_UNBOUND greatly improves performance when running on ramdisk */ - v->verify_wq = alloc_workqueue("kverityd", WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM | WQ_UNBOUND, num_online_cpus()); + v->verify_wq = alloc_workqueue("kverityd", + WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND, + num_online_cpus()); if (!v->verify_wq) { ti->error = "Cannot allocate workqueue"; r = -ENOMEM; From dea67794c936805a78ec361aad37a6914255cfbf Mon Sep 17 00:00:00 2001 From: Badhri Jagan Sridharan Date: Mon, 14 Dec 2015 20:09:39 -0800 Subject: [PATCH 0128/1015] ANDROID: dm: Add android verity target This device-mapper target is virtually a VERITY target. This target is setup by reading the metadata contents piggybacked to the actual data blocks in the block device. The signature of the metadata contents are verified against the key included in the system keyring. Upon success, the underlying verity target is setup. BUG: 27175947 Change-Id: Ie6b4d4d9591a09b751e5079d35f22c5f130e42e8 Signed-off-by: Badhri Jagan Sridharan Git-commit: 86c9f22461e4fb0f3e6ce50b6c4ac5856e323230 Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/Kconfig | 32 ++ drivers/md/Makefile | 4 + drivers/md/dm-android-verity.c | 771 +++++++++++++++++++++++++++++++++ drivers/md/dm-android-verity.h | 92 ++++ drivers/md/dm-verity-target.c | 16 +- drivers/md/dm-verity.h | 12 + 6 files changed, 919 insertions(+), 8 deletions(-) create mode 100644 drivers/md/dm-android-verity.c create mode 100644 drivers/md/dm-android-verity.h diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig index 8cbd776492602..92254ab12ef9d 100644 --- a/drivers/md/Kconfig +++ b/drivers/md/Kconfig @@ -435,6 +435,23 @@ config DM_VERITY If unsure, say N. +config DM_ANDROID_VERITY + bool "Android verity target support" + depends on DM_VERITY + depends on X509_CERTIFICATE_PARSER + depends on SYSTEM_TRUSTED_KEYRING + depends on PUBLIC_KEY_ALGO_RSA + depends on KEYS + depends on ASYMMETRIC_KEY_TYPE + depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE + ---help--- + This device-mapper target is virtually a VERITY target. This + target is setup by reading the metadata contents piggybacked + to the actual data blocks in the block device. The signature + of the metadata contents are verified against the key included + in the system keyring. Upon success, the underlying verity + target is setup. + config DM_VERITY_FEC bool "Verity forward error correction support" depends on DM_VERITY @@ -461,4 +478,19 @@ config DM_SWITCH If unsure, say N. +config DM_LOG_WRITES + tristate "Log writes target support" + depends on BLK_DEV_DM + ---help--- + This device-mapper target takes two devices, one device to use + normally, one to log all write operations done to the first device. + This is for use by file system developers wishing to verify that + their fs is writing a consitent file system at all times by allowing + them to replay the log in a variety of ways and to check the + contents. + + To compile this code as a module, choose M here: the module will + be called dm-log-writes. + + If unsure, say N. endif # MD diff --git a/drivers/md/Makefile b/drivers/md/Makefile index 5eb6dffb80b97..1f3509d0719a4 100644 --- a/drivers/md/Makefile +++ b/drivers/md/Makefile @@ -65,3 +65,7 @@ endif ifeq ($(CONFIG_DM_VERITY_FEC),y) dm-verity-objs += dm-verity-fec.o endif + +ifeq ($(CONFIG_DM_ANDROID_VERITY),y) +dm-verity-objs += dm-android-verity.o +endif diff --git a/drivers/md/dm-android-verity.c b/drivers/md/dm-android-verity.c new file mode 100644 index 0000000000000..c77c9fa7a962a --- /dev/null +++ b/drivers/md/dm-android-verity.c @@ -0,0 +1,771 @@ +/* + * Copyright (C) 2015 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "dm-verity.h" +#include "dm-android-verity.h" + +static char verifiedbootstate[VERITY_COMMANDLINE_PARAM_LENGTH]; +static char veritymode[VERITY_COMMANDLINE_PARAM_LENGTH]; + +static int __init verified_boot_state_param(char *line) +{ + strlcpy(verifiedbootstate, line, sizeof(verifiedbootstate)); + return 1; +} + +__setup("androidboot.verifiedbootstate=", verified_boot_state_param); + +static int __init verity_mode_param(char *line) +{ + strlcpy(veritymode, line, sizeof(veritymode)); + return 1; +} + +__setup("androidboot.veritymode=", verity_mode_param); + +static int table_extract_mpi_array(struct public_key_signature *pks, + const void *data, size_t len) +{ + MPI mpi = mpi_read_raw_data(data, len); + + if (!mpi) { + DMERR("Error while allocating mpi array"); + return -ENOMEM; + } + + pks->mpi[0] = mpi; + pks->nr_mpi = 1; + return 0; +} + +static struct public_key_signature *table_make_digest( + enum pkey_hash_algo hash, + const void *table, + unsigned long table_len) +{ + struct public_key_signature *pks = NULL; + struct crypto_shash *tfm; + struct shash_desc *desc; + size_t digest_size, desc_size; + int ret; + + /* Allocate the hashing algorithm we're going to need and find out how + * big the hash operational data will be. + */ + tfm = crypto_alloc_shash(pkey_hash_algo[hash], 0, 0); + if (IS_ERR(tfm)) + return ERR_CAST(tfm); + + desc_size = crypto_shash_descsize(tfm) + sizeof(*desc); + digest_size = crypto_shash_digestsize(tfm); + + /* We allocate the hash operational data storage on the end of out + * context data and the digest output buffer on the end of that. + */ + ret = -ENOMEM; + pks = kzalloc(digest_size + sizeof(*pks) + desc_size, GFP_KERNEL); + if (!pks) + goto error; + + pks->pkey_hash_algo = hash; + pks->digest = (u8 *)pks + sizeof(*pks) + desc_size; + pks->digest_size = digest_size; + + desc = (struct shash_desc *)(pks + 1); + desc->tfm = tfm; + desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; + + ret = crypto_shash_init(desc); + if (ret < 0) + goto error; + + ret = crypto_shash_finup(desc, table, table_len, pks->digest); + if (ret < 0) + goto error; + + crypto_free_shash(tfm); + return pks; + +error: + kfree(pks); + crypto_free_shash(tfm); + return ERR_PTR(ret); +} + +static int read_block_dev(struct bio_read *payload, struct block_device *bdev, + sector_t offset, int length) +{ + struct bio *bio; + int err = 0, i; + + payload->number_of_pages = DIV_ROUND_UP(length, PAGE_SIZE); + + bio = bio_alloc(GFP_KERNEL, payload->number_of_pages); + if (!bio) { + DMERR("Error while allocating bio"); + return -ENOMEM; + } + + bio->bi_bdev = bdev; + bio->bi_sector = offset; + + payload->page_io = kzalloc(sizeof(struct page *) * + payload->number_of_pages, GFP_KERNEL); + if (!payload->page_io) { + DMERR("page_io array alloc failed"); + err = -ENOMEM; + goto free_bio; + } + + for (i = 0; i < payload->number_of_pages; i++) { + payload->page_io[i] = alloc_page(GFP_KERNEL); + if (!payload->page_io[i]) { + DMERR("alloc_page failed"); + err = -ENOMEM; + goto free_pages; + } + if (!bio_add_page(bio, payload->page_io[i], PAGE_SIZE, 0)) { + DMERR("bio_add_page error"); + err = -EIO; + goto free_pages; + } + } + + if (!submit_bio_wait(READ, bio)) + /* success */ + goto free_bio; + DMERR("bio read failed"); + err = -EIO; + +free_pages: + for (i = 0; i < payload->number_of_pages; i++) + if (payload->page_io[i]) + __free_page(payload->page_io[i]); + kfree(payload->page_io); +free_bio: + bio_put(bio); + return err; +} + +static inline u64 fec_div_round_up(u64 x, u64 y) +{ + u64 remainder; + + return div64_u64_rem(x, y, &remainder) + + (remainder > 0 ? 1 : 0); +} + +static inline void populate_fec_metadata(struct fec_header *header, + struct fec_ecc_metadata *ecc) +{ + ecc->blocks = fec_div_round_up(le64_to_cpu(header->inp_size), + FEC_BLOCK_SIZE); + ecc->roots = le32_to_cpu(header->roots); + ecc->start = le64_to_cpu(header->inp_size); +} + +static inline int validate_fec_header(struct fec_header *header, u64 offset) +{ + /* move offset to make the sanity check work for backup header + * as well. */ + offset -= offset % FEC_BLOCK_SIZE; + if (le32_to_cpu(header->magic) != FEC_MAGIC || + le32_to_cpu(header->version) != FEC_VERSION || + le32_to_cpu(header->size) != sizeof(struct fec_header) || + le32_to_cpu(header->roots) == 0 || + le32_to_cpu(header->roots) >= FEC_RSM || + offset < le32_to_cpu(header->fec_size) || + offset - le32_to_cpu(header->fec_size) != + le64_to_cpu(header->inp_size)) + return -EINVAL; + + return 0; +} + +static int extract_fec_header(dev_t dev, struct fec_header *fec, + struct fec_ecc_metadata *ecc) +{ + u64 device_size; + struct bio_read payload; + int i, err = 0; + struct block_device *bdev; + + bdev = blkdev_get_by_dev(dev, FMODE_READ, NULL); + + if (IS_ERR(bdev)) { + DMERR("bdev get error"); + return PTR_ERR(bdev); + } + + device_size = i_size_read(bdev->bd_inode); + + /* fec metadata size is a power of 2 and PAGE_SIZE + * is a power of 2 as well. + */ + BUG_ON(FEC_BLOCK_SIZE > PAGE_SIZE); + /* 512 byte sector alignment */ + BUG_ON(((device_size - FEC_BLOCK_SIZE) % (1 << SECTOR_SHIFT)) != 0); + + err = read_block_dev(&payload, bdev, (device_size - + FEC_BLOCK_SIZE) / (1 << SECTOR_SHIFT), FEC_BLOCK_SIZE); + if (err) { + DMERR("Error while reading verity metadata"); + goto error; + } + + BUG_ON(sizeof(struct fec_header) > PAGE_SIZE); + memcpy(fec, page_address(payload.page_io[0]), + sizeof(*fec)); + + ecc->valid = true; + if (validate_fec_header(fec, device_size - FEC_BLOCK_SIZE)) { + /* Try the backup header */ + memcpy(fec, page_address(payload.page_io[0]) + FEC_BLOCK_SIZE + - sizeof(*fec) , + sizeof(*fec)); + if (validate_fec_header(fec, device_size - + sizeof(struct fec_header))) + ecc->valid = false; + } + + if (ecc->valid) + populate_fec_metadata(fec, ecc); + + for (i = 0; i < payload.number_of_pages; i++) + __free_page(payload.page_io[i]); + kfree(payload.page_io); + +error: + blkdev_put(bdev, FMODE_READ); + return err; +} +static void find_metadata_offset(struct fec_header *fec, + struct block_device *bdev, u64 *metadata_offset) +{ + u64 device_size; + + device_size = i_size_read(bdev->bd_inode); + + if (le32_to_cpu(fec->magic) == FEC_MAGIC) + *metadata_offset = le64_to_cpu(fec->inp_size) - + VERITY_METADATA_SIZE; + else + *metadata_offset = device_size - VERITY_METADATA_SIZE; +} + +static struct android_metadata *extract_metadata(dev_t dev, + struct fec_header *fec) +{ + struct block_device *bdev; + struct android_metadata_header *header; + struct android_metadata *uninitialized_var(metadata); + int i; + u32 table_length, copy_length, offset; + u64 metadata_offset; + struct bio_read payload; + int err = 0; + + bdev = blkdev_get_by_dev(dev, FMODE_READ, NULL); + + if (IS_ERR(bdev)) { + DMERR("blkdev_get_by_dev failed"); + return ERR_CAST(bdev); + } + + find_metadata_offset(fec, bdev, &metadata_offset); + + /* Verity metadata size is a power of 2 and PAGE_SIZE + * is a power of 2 as well. + * PAGE_SIZE is also a multiple of 512 bytes. + */ + if (VERITY_METADATA_SIZE > PAGE_SIZE) + BUG_ON(VERITY_METADATA_SIZE % PAGE_SIZE != 0); + /* 512 byte sector alignment */ + BUG_ON(metadata_offset % (1 << SECTOR_SHIFT) != 0); + + err = read_block_dev(&payload, bdev, metadata_offset / + (1 << SECTOR_SHIFT), VERITY_METADATA_SIZE); + if (err) { + DMERR("Error while reading verity metadata"); + metadata = ERR_PTR(err); + goto blkdev_release; + } + + header = kzalloc(sizeof(*header), GFP_KERNEL); + if (!header) { + DMERR("kzalloc failed for header"); + err = -ENOMEM; + goto free_payload; + } + + memcpy(header, page_address(payload.page_io[0]), + sizeof(*header)); + + DMINFO("bio magic_number:%u protocol_version:%d table_length:%u", + le32_to_cpu(header->magic_number), + le32_to_cpu(header->protocol_version), + le32_to_cpu(header->table_length)); + + metadata = kzalloc(sizeof(*metadata), GFP_KERNEL); + if (!metadata) { + DMERR("kzalloc for metadata failed"); + err = -ENOMEM; + goto free_header; + } + + metadata->header = header; + table_length = le32_to_cpu(header->table_length); + + if (table_length == 0 || + table_length > (VERITY_METADATA_SIZE - + sizeof(struct android_metadata_header))) + goto free_metadata; + + metadata->verity_table = kzalloc(table_length + 1, GFP_KERNEL); + + if (!metadata->verity_table) { + DMERR("kzalloc verity_table failed"); + err = -ENOMEM; + goto free_metadata; + } + + if (sizeof(struct android_metadata_header) + + table_length <= PAGE_SIZE) { + memcpy(metadata->verity_table, page_address(payload.page_io[0]) + + sizeof(struct android_metadata_header), + table_length); + } else { + copy_length = PAGE_SIZE - + sizeof(struct android_metadata_header); + memcpy(metadata->verity_table, page_address(payload.page_io[0]) + + sizeof(struct android_metadata_header), + copy_length); + table_length -= copy_length; + offset = copy_length; + i = 1; + while (table_length != 0) { + if (table_length > PAGE_SIZE) { + memcpy(metadata->verity_table + offset, + page_address(payload.page_io[i]), + PAGE_SIZE); + offset += PAGE_SIZE; + table_length -= PAGE_SIZE; + } else { + memcpy(metadata->verity_table + offset, + page_address(payload.page_io[i]), + table_length); + table_length = 0; + } + i++; + } + } + metadata->verity_table[table_length] = '\0'; + + goto free_payload; + +free_metadata: + kfree(metadata); +free_header: + kfree(header); + metadata = ERR_PTR(err); +free_payload: + for (i = 0; i < payload.number_of_pages; i++) + if (payload.page_io[i]) + __free_page(payload.page_io[i]); + kfree(payload.page_io); + + DMINFO("verity_table: %s", metadata->verity_table); +blkdev_release: + blkdev_put(bdev, FMODE_READ); + return metadata; +} + +/* helper functions to extract properties from dts */ +const char *find_dt_value(const char *name) +{ + struct device_node *firmware; + const char *value; + + firmware = of_find_node_by_path("/firmware/android"); + if (!firmware) + return NULL; + value = of_get_property(firmware, name, NULL); + of_node_put(firmware); + + return value; +} + +static bool is_unlocked(void) +{ + static const char unlocked[] = "orange"; + static const char verified_boot_prop[] = "verifiedbootstate"; + const char *value; + + value = find_dt_value(verified_boot_prop); + if (!value) + value = verifiedbootstate; + + return !strncmp(value, unlocked, sizeof(unlocked) - 1); +} + +static int verity_mode(void) +{ + static const char enforcing[] = "enforcing"; + static const char verified_mode_prop[] = "veritymode"; + const char *value; + + value = find_dt_value(verified_mode_prop); + if (!value) + value = veritymode; + if (!strncmp(value, enforcing, sizeof(enforcing) - 1)) + return DM_VERITY_MODE_RESTART; + + return DM_VERITY_MODE_EIO; +} + +static int verify_header(struct android_metadata_header *header) +{ + int retval = -EINVAL; + + if (is_unlocked() && le32_to_cpu(header->magic_number) == + VERITY_METADATA_MAGIC_DISABLE) { + retval = VERITY_STATE_DISABLE; + return retval; + } + + if (!(le32_to_cpu(header->magic_number) == + VERITY_METADATA_MAGIC_NUMBER) || + (le32_to_cpu(header->magic_number) == + VERITY_METADATA_MAGIC_DISABLE)) { + DMERR("Incorrect magic number"); + return retval; + } + + if (le32_to_cpu(header->protocol_version) != + VERITY_METADATA_VERSION) { + DMERR("Unsupported version %u", + le32_to_cpu(header->protocol_version)); + return retval; + } + + return 0; +} + +static int verify_verity_signature(char *key_id, + struct android_metadata *metadata) +{ + key_ref_t key_ref; + struct key *key; + struct public_key_signature *pks = NULL; + int retval = -EINVAL; + + key_ref = keyring_search(make_key_ref(system_trusted_keyring, 1), + &key_type_asymmetric, key_id); + + if (IS_ERR(key_ref)) { + DMERR("keyring: key not found"); + return -ENOKEY; + } + + key = key_ref_to_ptr(key_ref); + + pks = table_make_digest(PKEY_HASH_SHA256, + (const void *)metadata->verity_table, + le32_to_cpu(metadata->header->table_length)); + + if (IS_ERR(pks)) { + DMERR("hashing failed"); + goto error; + } + + retval = table_extract_mpi_array(pks, &metadata->header->signature[0], + RSANUMBYTES); + if (retval < 0) { + DMERR("Error extracting mpi %d", retval); + goto error; + } + + retval = verify_signature(key, pks); + mpi_free(pks->rsa.s); +error: + kfree(pks); + key_put(key); + + return retval; +} + +static void handle_error(void) +{ + int mode = verity_mode(); + if (mode == DM_VERITY_MODE_RESTART) { + DMERR("triggering restart"); + kernel_restart("dm-verity device corrupted"); + } else { + DMERR("Mounting verity root failed"); + } +} + +static inline bool test_mult_overflow(sector_t a, u32 b) +{ + sector_t r = (sector_t)~0ULL; + + sector_div(r, b); + return a > r; +} + +/* + * Target parameters: + * Key id of the public key in the system keyring. + * Verity metadata's signature would be verified against + * this. If the key id contains spaces, replace them + * with '#'. + * The block device for which dm-verity is being setup. + */ +static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv) +{ + dev_t uninitialized_var(dev); + struct android_metadata *uninitialized_var(metadata); + int err = 0, i, mode; + char *key_id, *table_ptr, dummy, + *verity_table_args[VERITY_TABLE_ARGS + 2 + VERITY_TABLE_OPT_FEC_ARGS]; + /* One for specifying number of opt args and one for mode */ + sector_t data_sectors; + u32 data_block_size; + unsigned int major, minor, + no_of_args = VERITY_TABLE_ARGS + 2 + VERITY_TABLE_OPT_FEC_ARGS; + struct fec_header fec; + struct fec_ecc_metadata uninitialized_var(ecc); + char buf[FEC_ARG_LENGTH], *buf_ptr; + unsigned long long tmpll; + + if (argc != 2) { + DMERR("Incorrect number of arguments"); + handle_error(); + return -EINVAL; + } + + /* should come as one of the arguments for the verity target */ + key_id = argv[0]; + strreplace(argv[0], '#', ' '); + + if (sscanf(argv[1], "%u:%u%c", &major, &minor, &dummy) == 2) { + dev = MKDEV(major, minor); + if (MAJOR(dev) != major || MINOR(dev) != minor) { + DMERR("Incorrect bdev major minor number"); + handle_error(); + return -EOVERFLOW; + } + } + + DMINFO("key:%s dev:%s", argv[0], argv[1]); + + if (extract_fec_header(dev, &fec, &ecc)) { + DMERR("Error while extracting fec header"); + handle_error(); + return -EINVAL; + } + + metadata = extract_metadata(dev, &fec); + + if (IS_ERR(metadata)) { + DMERR("Error while extracting metadata"); + handle_error(); + return -EINVAL; + } + + err = verify_header(metadata->header); + + if (err == VERITY_STATE_DISABLE) { + DMERR("Mounting root with verity disabled"); + return -EINVAL; + } else if (err) { + DMERR("Verity header handle error"); + handle_error(); + goto free_metadata; + } + + err = verify_verity_signature(key_id, metadata); + + if (err) { + DMERR("Signature verification failed"); + handle_error(); + goto free_metadata; + } else + DMINFO("Signature verification success"); + + table_ptr = metadata->verity_table; + + for (i = 0; i < VERITY_TABLE_ARGS; i++) { + verity_table_args[i] = strsep(&table_ptr, " "); + if (verity_table_args[i] == NULL) + break; + } + + if (i != VERITY_TABLE_ARGS) { + DMERR("Verity table not in the expected format"); + err = -EINVAL; + handle_error(); + goto free_metadata; + } + + if (sscanf(verity_table_args[5], "%llu%c", &tmpll, &dummy) + != 1) { + DMERR("Verity table not in the expected format"); + handle_error(); + err = -EINVAL; + goto free_metadata; + } + + if (tmpll > ULONG_MAX) { + DMERR(" too large. Forgot to turn on CONFIG_LBDAF?"); + handle_error(); + err = -EINVAL; + goto free_metadata; + } + + data_sectors = tmpll; + + if (sscanf(verity_table_args[3], "%u%c", &data_block_size, &dummy) + != 1) { + DMERR("Verity table not in the expected format"); + handle_error(); + err = -EINVAL; + goto free_metadata; + } + + if (test_mult_overflow(data_sectors, data_block_size >> + SECTOR_SHIFT)) { + DMERR("data_sectors too large"); + handle_error(); + err = -EOVERFLOW; + goto free_metadata; + } + + data_sectors *= data_block_size >> SECTOR_SHIFT; + DMINFO("Data sectors %llu", (unsigned long long)data_sectors); + + /* update target length */ + ti->len = data_sectors; + + /*substitute data_dev and hash_dev*/ + verity_table_args[1] = argv[1]; + verity_table_args[2] = argv[1]; + + mode = verity_mode(); + + if (ecc.valid && IS_BUILTIN(CONFIG_DM_VERITY_FEC)) { + if (mode) { + err = snprintf(buf, FEC_ARG_LENGTH, + "%u %s " VERITY_TABLE_OPT_FEC_FORMAT, + 1 + VERITY_TABLE_OPT_FEC_ARGS, + mode == DM_VERITY_MODE_RESTART ? + VERITY_TABLE_OPT_RESTART : VERITY_TABLE_OPT_LOGGING, + argv[1], ecc.start / FEC_BLOCK_SIZE, ecc.blocks, + ecc.roots); + } else { + err = snprintf(buf, FEC_ARG_LENGTH, + "%u " VERITY_TABLE_OPT_FEC_FORMAT, + VERITY_TABLE_OPT_FEC_ARGS, argv[1], + ecc.start / FEC_BLOCK_SIZE, ecc.blocks, ecc.roots); + } + } else if (mode) { + err = snprintf(buf, FEC_ARG_LENGTH, + "2 " VERITY_TABLE_OPT_IGNZERO " %s", + mode == DM_VERITY_MODE_RESTART ? + VERITY_TABLE_OPT_RESTART : VERITY_TABLE_OPT_LOGGING); + } else { + err = snprintf(buf, FEC_ARG_LENGTH, "1 %s", + "ignore_zero_blocks"); + } + + if (err < 0 || err >= FEC_ARG_LENGTH) + goto free_metadata; + + buf_ptr = buf; + + for (i = VERITY_TABLE_ARGS; i < (VERITY_TABLE_ARGS + + VERITY_TABLE_OPT_FEC_ARGS + 2); i++) { + verity_table_args[i] = strsep(&buf_ptr, " "); + if (verity_table_args[i] == NULL) { + no_of_args = i; + break; + } + } + + err = verity_ctr(ti, no_of_args, verity_table_args); + +free_metadata: + kfree(metadata->header); + kfree(metadata->verity_table); + kfree(metadata); + return err; +} + +static struct target_type android_verity_target = { + .name = "android-verity", + .version = {1, 0, 0}, + .module = THIS_MODULE, + .ctr = android_verity_ctr, + .dtr = verity_dtr, + .map = verity_map, + .status = verity_status, + .ioctl = verity_ioctl, + .merge = verity_merge, + .iterate_devices = verity_iterate_devices, + .io_hints = verity_io_hints, +}; + +static int __init dm_android_verity_init(void) +{ + int r; + + r = dm_register_target(&android_verity_target); + if (r < 0) + DMERR("register failed %d", r); + + return r; +} + +static void __exit dm_android_verity_exit(void) +{ + dm_unregister_target(&android_verity_target); +} + +module_init(dm_android_verity_init); +module_exit(dm_android_verity_exit); diff --git a/drivers/md/dm-android-verity.h b/drivers/md/dm-android-verity.h new file mode 100644 index 0000000000000..11477ffd2243e --- /dev/null +++ b/drivers/md/dm-android-verity.h @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2015 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef DM_ANDROID_VERITY_H +#define DM_ANDROID_VERITY_H + +#include + +#define RSANUMBYTES 256 +#define VERITY_METADATA_MAGIC_NUMBER 0xb001b001 +#define VERITY_METADATA_MAGIC_DISABLE 0x46464f56 +#define VERITY_METADATA_VERSION 0 +#define VERITY_STATE_DISABLE 1 +#define DATA_BLOCK_SIZE (4 * 1024) +#define VERITY_METADATA_SIZE (8 * DATA_BLOCK_SIZE) +#define VERITY_TABLE_ARGS 10 +#define VERITY_COMMANDLINE_PARAM_LENGTH 20 + +#define FEC_MAGIC 0xFECFECFE +#define FEC_BLOCK_SIZE (4 * 1024) +#define FEC_VERSION 0 +#define FEC_RSM 255 +#define FEC_ARG_LENGTH 300 + +#define VERITY_TABLE_OPT_RESTART "restart_on_corruption" +#define VERITY_TABLE_OPT_LOGGING "ignore_corruption" +#define VERITY_TABLE_OPT_IGNZERO "ignore_zero_blocks" + +#define VERITY_TABLE_OPT_FEC_FORMAT \ + "use_fec_from_device %s fec_start %llu fec_blocks %llu fec_roots %u ignore_zero_blocks" +#define VERITY_TABLE_OPT_FEC_ARGS 9 + +#define VERITY_DEBUG 0 + +#define DM_MSG_PREFIX "android-verity" +/* + * There can be two formats. + * if fec is present + * + * if fec is not present + * + */ +/* TODO: rearrange structure to reduce memory holes + * depends on userspace change. + */ +struct fec_header { + __le32 magic; + __le32 version; + __le32 size; + __le32 roots; + __le32 fec_size; + __le64 inp_size; + u8 hash[SHA256_DIGEST_SIZE]; +}; + +struct android_metadata_header { + __le32 magic_number; + __le32 protocol_version; + char signature[RSANUMBYTES]; + __le32 table_length; +}; + +struct android_metadata { + struct android_metadata_header *header; + char *verity_table; +}; + +struct fec_ecc_metadata { + bool valid; + u32 roots; + u64 blocks; + u64 rounds; + u64 start; +}; + +struct bio_read { + struct page **page_io; + int number_of_pages; +}; + +#endif /* DM_ANDROID_VERITY_H */ diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 185b265a91803..8b747528b02d4 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -551,7 +551,7 @@ static void verity_submit_prefetch(struct dm_verity *v, struct dm_verity_io *io) * Bio map function. It allocates dm_verity_io structure and bio vector and * fills them. Then it issues prefetches and the I/O. */ -static int verity_map(struct dm_target *ti, struct bio *bio) +int verity_map(struct dm_target *ti, struct bio *bio) { struct dm_verity *v = ti->private; struct dm_verity_io *io; @@ -597,7 +597,7 @@ static int verity_map(struct dm_target *ti, struct bio *bio) /* * Status: V (valid) or C (corruption found) */ -static void verity_status(struct dm_target *ti, status_type_t type, +void verity_status(struct dm_target *ti, status_type_t type, unsigned status_flags, char *result, unsigned maxlen) { struct dm_verity *v = ti->private; @@ -657,7 +657,7 @@ static void verity_status(struct dm_target *ti, status_type_t type, } } -static int verity_ioctl(struct dm_target *ti, unsigned cmd, +int verity_ioctl(struct dm_target *ti, unsigned cmd, unsigned long arg) { struct dm_verity *v = ti->private; @@ -671,7 +671,7 @@ static int verity_ioctl(struct dm_target *ti, unsigned cmd, cmd, arg); } -static int verity_merge(struct dm_target *ti, struct bvec_merge_data *bvm, +int verity_merge(struct dm_target *ti, struct bvec_merge_data *bvm, struct bio_vec *biovec, int max_size) { struct dm_verity *v = ti->private; @@ -686,7 +686,7 @@ static int verity_merge(struct dm_target *ti, struct bvec_merge_data *bvm, return min(max_size, q->merge_bvec_fn(q, bvm, biovec)); } -static int verity_iterate_devices(struct dm_target *ti, +int verity_iterate_devices(struct dm_target *ti, iterate_devices_callout_fn fn, void *data) { struct dm_verity *v = ti->private; @@ -694,7 +694,7 @@ static int verity_iterate_devices(struct dm_target *ti, return fn(ti, v->data_dev, v->data_start, ti->len, data); } -static void verity_io_hints(struct dm_target *ti, struct queue_limits *limits) +void verity_io_hints(struct dm_target *ti, struct queue_limits *limits) { struct dm_verity *v = ti->private; @@ -707,7 +707,7 @@ static void verity_io_hints(struct dm_target *ti, struct queue_limits *limits) blk_limits_io_min(limits, limits->logical_block_size); } -static void verity_dtr(struct dm_target *ti) +void verity_dtr(struct dm_target *ti) { struct dm_verity *v = ti->private; @@ -834,7 +834,7 @@ static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v) * * Hex string or "-" if no salt. */ -static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) +int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) { struct dm_verity *v; struct dm_arg_set as; diff --git a/drivers/md/dm-verity.h b/drivers/md/dm-verity.h index 85735eb856471..47a96a56794bc 100644 --- a/drivers/md/dm-verity.h +++ b/drivers/md/dm-verity.h @@ -127,4 +127,16 @@ extern int verity_hash(struct dm_verity *v, struct shash_desc *desc, extern int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, sector_t block, u8 *digest, bool *is_zero); +extern void verity_status(struct dm_target *ti, status_type_t type, + unsigned status_flags, char *result, unsigned maxlen); +extern int verity_ioctl(struct dm_target *ti, unsigned cmd, + unsigned long arg); +extern int verity_merge(struct dm_target *ti, struct bvec_merge_data *bvm, + struct bio_vec *biovec, int max_size); +extern int verity_iterate_devices(struct dm_target *ti, + iterate_devices_callout_fn fn, void *data); +extern void verity_io_hints(struct dm_target *ti, struct queue_limits *limits); +extern void verity_dtr(struct dm_target *ti); +extern int verity_ctr(struct dm_target *ti, unsigned argc, char **argv); +extern int verity_map(struct dm_target *ti, struct bio *bio); #endif /* DM_VERITY_H */ From 537264b6be7a02ff3f715175b1c0127d68048bf6 Mon Sep 17 00:00:00 2001 From: Badhri Jagan Sridharan Date: Mon, 8 Feb 2016 16:28:43 -0800 Subject: [PATCH 0129/1015] ANDROID: dm-android-verity: Rebase on top of 4.1 Following CLs in upstream causes minor changes to dm-android-verity target. 1. keys: change asymmetric keys to use common hash definitions 2. block: Abstract out bvec iterator Rebase dm-android-verity on top of these changes. Bug: 27175947 Change-Id: I04915db3f32c2676b41f26176fdebb80e0d159fe Signed-off-by: Badhri Jagan Sridharan Git-commit: b707c9906de05512b629002aebcd3da3bd4ce27a Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/dm-android-verity.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/md/dm-android-verity.c b/drivers/md/dm-android-verity.c index c77c9fa7a962a..aeb5045830d96 100644 --- a/drivers/md/dm-android-verity.c +++ b/drivers/md/dm-android-verity.c @@ -75,7 +75,7 @@ static int table_extract_mpi_array(struct public_key_signature *pks, } static struct public_key_signature *table_make_digest( - enum pkey_hash_algo hash, + enum hash_algo hash, const void *table, unsigned long table_len) { @@ -88,7 +88,7 @@ static struct public_key_signature *table_make_digest( /* Allocate the hashing algorithm we're going to need and find out how * big the hash operational data will be. */ - tfm = crypto_alloc_shash(pkey_hash_algo[hash], 0, 0); + tfm = crypto_alloc_shash(hash_algo_name[hash], 0, 0); if (IS_ERR(tfm)) return ERR_CAST(tfm); @@ -143,7 +143,7 @@ static int read_block_dev(struct bio_read *payload, struct block_device *bdev, } bio->bi_bdev = bdev; - bio->bi_sector = offset; + bio->bi_iter.bi_sector = offset; payload->page_io = kzalloc(sizeof(struct page *) * payload->number_of_pages, GFP_KERNEL); @@ -505,7 +505,7 @@ static int verify_verity_signature(char *key_id, key = key_ref_to_ptr(key_ref); - pks = table_make_digest(PKEY_HASH_SHA256, + pks = table_make_digest(HASH_ALGO_SHA256, (const void *)metadata->verity_table, le32_to_cpu(metadata->header->table_length)); @@ -569,7 +569,7 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv) u32 data_block_size; unsigned int major, minor, no_of_args = VERITY_TABLE_ARGS + 2 + VERITY_TABLE_OPT_FEC_ARGS; - struct fec_header fec; + struct fec_header uninitialized_var(fec); struct fec_ecc_metadata uninitialized_var(ecc); char buf[FEC_ARG_LENGTH], *buf_ptr; unsigned long long tmpll; From 9a73e3fc4a9964cdc6832afeef0ea8fea1fcbad8 Mon Sep 17 00:00:00 2001 From: Badhri Jagan Sridharan Date: Mon, 21 Mar 2016 10:55:23 -0700 Subject: [PATCH 0130/1015] ANDROID: dm: Mounting root as linear device when verity disabled This CL makes android-verity target to be added as linear dm device if when bootloader is unlocked and verity is disabled. Bug: 27175947 Change-Id: I8c73f2b3597d8b33f6306e3e85da53fcaacade87 Signed-off-by: Badhri Jagan Sridharan Git-commit: 03a54be6f0ad98418ccb5fc90634beb0cf60b108 Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/dm-android-verity.c | 128 +++++++++++++++++++++++++++------ drivers/md/dm-android-verity.h | 5 ++ drivers/md/dm-linear.c | 2 +- 3 files changed, 112 insertions(+), 23 deletions(-) diff --git a/drivers/md/dm-android-verity.c b/drivers/md/dm-android-verity.c index aeb5045830d96..f6ddbee5e2d35 100644 --- a/drivers/md/dm-android-verity.c +++ b/drivers/md/dm-android-verity.c @@ -13,6 +13,7 @@ */ #include +#include #include #include #include @@ -43,6 +44,25 @@ static char verifiedbootstate[VERITY_COMMANDLINE_PARAM_LENGTH]; static char veritymode[VERITY_COMMANDLINE_PARAM_LENGTH]; +static bool target_added; +static bool verity_enabled = true; +struct dentry *debug_dir; +static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv); + +static struct target_type android_verity_target = { + .name = "android-verity", + .version = {1, 0, 0}, + .module = THIS_MODULE, + .ctr = android_verity_ctr, + .dtr = verity_dtr, + .map = verity_map, + .status = verity_status, + .ioctl = verity_ioctl, + .merge = verity_merge, + .iterate_devices = verity_iterate_devices, + .io_hints = verity_io_hints, +}; + static int __init verified_boot_state_param(char *line) { strlcpy(verifiedbootstate, line, sizeof(verifiedbootstate)); @@ -549,6 +569,32 @@ static inline bool test_mult_overflow(sector_t a, u32 b) return a > r; } +static int add_as_linear_device(struct dm_target *ti, char *dev) +{ + /*Move to linear mapping defines*/ + char *linear_table_args[DM_LINEAR_ARGS] = {dev, + DM_LINEAR_TARGET_OFFSET}; + int err = 0; + + android_verity_target.dtr = linear_target.dtr, + android_verity_target.map = linear_target.map, + android_verity_target.status = linear_target.status, + android_verity_target.ioctl = linear_target.ioctl, + android_verity_target.merge = linear_target.merge, + android_verity_target.iterate_devices = linear_target.iterate_devices, + android_verity_target.io_hints = NULL; + + err = linear_target.ctr(ti, DM_LINEAR_ARGS, linear_table_args); + + if (!err) { + DMINFO("Added android-verity as a linear target"); + target_added = true; + } else + DMERR("Failed to add android-verity as linear target"); + + return err; +} + /* * Target parameters: * Key id of the public key in the system keyring. @@ -613,21 +659,27 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv) if (err == VERITY_STATE_DISABLE) { DMERR("Mounting root with verity disabled"); - return -EINVAL; + verity_enabled = false; + /* we would still have to parse the args to figure out + * the data blocks size. Or may be could map the entire + * partition similar to mounting the device. + */ } else if (err) { DMERR("Verity header handle error"); handle_error(); goto free_metadata; } - err = verify_verity_signature(key_id, metadata); + if (!verity_enabled) { + err = verify_verity_signature(key_id, metadata); - if (err) { - DMERR("Signature verification failed"); - handle_error(); - goto free_metadata; - } else - DMINFO("Signature verification success"); + if (err) { + DMERR("Signature verification failed"); + handle_error(); + goto free_metadata; + } else + DMINFO("Signature verification success"); + } table_ptr = metadata->verity_table; @@ -683,6 +735,12 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv) /* update target length */ ti->len = data_sectors; + /* Setup linear target and free */ + if (!verity_enabled) { + err = add_as_linear_device(ti, argv[1]); + goto free_metadata; + } + /*substitute data_dev and hash_dev*/ verity_table_args[1] = argv[1]; verity_table_args[2] = argv[1]; @@ -730,6 +788,13 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv) err = verity_ctr(ti, no_of_args, verity_table_args); + if (err) + DMERR("android-verity failed to mount as verity target"); + else { + target_added = true; + DMINFO("android-verity mounted as verity target"); + } + free_metadata: kfree(metadata->header); kfree(metadata->verity_table); @@ -737,33 +802,52 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv) return err; } -static struct target_type android_verity_target = { - .name = "android-verity", - .version = {1, 0, 0}, - .module = THIS_MODULE, - .ctr = android_verity_ctr, - .dtr = verity_dtr, - .map = verity_map, - .status = verity_status, - .ioctl = verity_ioctl, - .merge = verity_merge, - .iterate_devices = verity_iterate_devices, - .io_hints = verity_io_hints, -}; - static int __init dm_android_verity_init(void) { int r; + struct dentry *file; r = dm_register_target(&android_verity_target); if (r < 0) DMERR("register failed %d", r); + /* Tracks the status of the last added target */ + debug_dir = debugfs_create_dir("android_verity", NULL); + + if (IS_ERR_OR_NULL(debug_dir)) { + DMERR("Cannot create android_verity debugfs directory: %ld", + PTR_ERR(debug_dir)); + goto end; + } + + file = debugfs_create_bool("target_added", S_IRUGO, debug_dir, + (u32 *)&target_added); + + if (IS_ERR_OR_NULL(file)) { + DMERR("Cannot create android_verity debugfs directory: %ld", + PTR_ERR(debug_dir)); + debugfs_remove_recursive(debug_dir); + goto end; + } + + file = debugfs_create_bool("verity_enabled", S_IRUGO, debug_dir, + (u32 *)&verity_enabled); + + if (IS_ERR_OR_NULL(file)) { + DMERR("Cannot create android_verity debugfs directory: %ld", + PTR_ERR(debug_dir)); + debugfs_remove_recursive(debug_dir); + } + +end: return r; } static void __exit dm_android_verity_exit(void) { + if (!IS_ERR_OR_NULL(debug_dir)) + debugfs_remove_recursive(debug_dir); + dm_unregister_target(&android_verity_target); } diff --git a/drivers/md/dm-android-verity.h b/drivers/md/dm-android-verity.h index 11477ffd2243e..fe53863c664b4 100644 --- a/drivers/md/dm-android-verity.h +++ b/drivers/md/dm-android-verity.h @@ -44,6 +44,10 @@ #define VERITY_DEBUG 0 #define DM_MSG_PREFIX "android-verity" + +#define DM_LINEAR_ARGS 2 +#define DM_LINEAR_TARGET_OFFSET "0" + /* * There can be two formats. * if fec is present @@ -89,4 +93,5 @@ struct bio_read { int number_of_pages; }; +extern struct target_type linear_target; #endif /* DM_ANDROID_VERITY_H */ diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c index 53e848c109393..73285561627a6 100644 --- a/drivers/md/dm-linear.c +++ b/drivers/md/dm-linear.c @@ -153,7 +153,7 @@ static int linear_iterate_devices(struct dm_target *ti, return fn(ti, lc->dev, lc->start, ti->len, data); } -static struct target_type linear_target = { +struct target_type linear_target = { .name = "linear", .version = {1, 2, 1}, .module = THIS_MODULE, From 47ebccdd28e7b8620695c458e8b1dafddc69440b Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Wed, 30 Mar 2016 14:10:13 -0700 Subject: [PATCH 0131/1015] ANDROID: dm verity fec: add sysfs attribute fec/corrected Add a sysfs entry that allows user space to determine whether dm-verity has come across correctable errors on the underlying block device. Bug: 22655252 Bug: 27928374 Signed-off-by: Sami Tolvanen (cherry picked from commit 7911fad5f0a2cf5afc2215657219a21e6630e001) Change-Id: I02d36bed1d54eaf1f1750a919fa91f66a7e9b96c Git-commit: 9cd83628e9447e2c4a0d13e7efa0b232b09c8930 Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/dm-verity-fec.c | 45 +++++++++++++++++++++++++++++++++++++- drivers/md/dm-verity-fec.h | 3 +++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c index 1cc10c4de7010..ad10d6d8ed28d 100644 --- a/drivers/md/dm-verity-fec.c +++ b/drivers/md/dm-verity-fec.c @@ -11,6 +11,7 @@ #include "dm-verity-fec.h" #include +#include #define DM_MSG_PREFIX "verity-fec" @@ -175,9 +176,11 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio, if (r < 0 && neras) DMERR_LIMIT("%s: FEC %llu: failed to correct: %d", v->data_dev->name, (unsigned long long)rsb, r); - else if (r > 0) + else if (r > 0) { DMWARN_LIMIT("%s: FEC %llu: corrected %d errors", v->data_dev->name, (unsigned long long)rsb, r); + atomic_add_unless(&v->fec->corrected, 1, INT_MAX); + } return r; } @@ -548,6 +551,7 @@ unsigned verity_fec_status_table(struct dm_verity *v, unsigned sz, void verity_fec_dtr(struct dm_verity *v) { struct dm_verity_fec *f = v->fec; + struct kobject *kobj = &f->kobj_holder.kobj; if (!verity_fec_is_enabled(v)) goto out; @@ -564,6 +568,12 @@ void verity_fec_dtr(struct dm_verity *v) if (f->dev) dm_put_device(v->ti, f->dev); + + if (kobj->state_initialized) { + kobject_put(kobj); + wait_for_completion(dm_get_completion_from_kobject(kobj)); + } + out: kfree(f); v->fec = NULL; @@ -652,6 +662,27 @@ int verity_fec_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v, return 0; } +static ssize_t corrected_show(struct kobject *kobj, struct kobj_attribute *attr, + char *buf) +{ + struct dm_verity_fec *f = container_of(kobj, struct dm_verity_fec, + kobj_holder.kobj); + + return sprintf(buf, "%d\n", atomic_read(&f->corrected)); +} + +static struct kobj_attribute attr_corrected = __ATTR_RO(corrected); + +static struct attribute *fec_attrs[] = { + &attr_corrected.attr, + NULL +}; + +static struct kobj_type fec_ktype = { + .sysfs_ops = &kobj_sysfs_ops, + .default_attrs = fec_attrs +}; + /* * Allocate dm_verity_fec for v->fec. Must be called before verity_fec_ctr. */ @@ -675,8 +706,10 @@ int verity_fec_ctr_alloc(struct dm_verity *v) */ int verity_fec_ctr(struct dm_verity *v) { + int r; struct dm_verity_fec *f = v->fec; struct dm_target *ti = v->ti; + struct mapped_device *md = dm_table_get_md(ti->table); u64 hash_blocks; if (!verity_fec_is_enabled(v)) { @@ -684,6 +717,16 @@ int verity_fec_ctr(struct dm_verity *v) return 0; } + /* Create a kobject and sysfs attributes */ + init_completion(&f->kobj_holder.completion); + + r = kobject_init_and_add(&f->kobj_holder.kobj, &fec_ktype, + &disk_to_dev(dm_disk(md))->kobj, "%s", "fec"); + if (r) { + ti->error = "Cannot create kobject"; + return r; + } + /* * FEC is computed over data blocks, possible metadata, and * hash blocks. In other words, FEC covers total of fec_blocks diff --git a/drivers/md/dm-verity-fec.h b/drivers/md/dm-verity-fec.h index 7fa0298b995e9..8c4bee052a735 100644 --- a/drivers/md/dm-verity-fec.h +++ b/drivers/md/dm-verity-fec.h @@ -12,6 +12,7 @@ #ifndef DM_VERITY_FEC_H #define DM_VERITY_FEC_H +#include "dm.h" #include "dm-verity.h" #include @@ -48,6 +49,8 @@ struct dm_verity_fec { mempool_t *extra_pool; /* mempool for extra buffers */ mempool_t *output_pool; /* mempool for output */ struct kmem_cache *cache; /* cache for buffers */ + atomic_t corrected; /* corrected errors */ + struct dm_kobject_holder kobj_holder; /* for sysfs attributes */ }; /* per-bio data */ From 3a7cd78c7e642306e2102e7c67fce7afb0fe6393 Mon Sep 17 00:00:00 2001 From: Badhri Jagan Sridharan Date: Tue, 5 Apr 2016 11:18:16 -0700 Subject: [PATCH 0132/1015] ANDROID: dm: rename dm-linear methods for dm-android-verity This keeps linear_target as static variable and just exposes the linear target methods for android-verity Cherry-picked: https://android-review.googlesource.com/#/c/212858 Change-Id: I0de4ad485ce3fd21402be2ca3af39fa0d11ccd17 Signed-off-by: Badhri Jagan Sridharan Git-commit: fd0e6dcfa733c997b518aa860f8e72995afcfe2d Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git Signed-off-by: Imran Khan --- drivers/md/dm-android-verity.c | 14 +++++++------- drivers/md/dm-android-verity.h | 12 ++++++++++++ drivers/md/dm-linear.c | 30 +++++++++++++++--------------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/drivers/md/dm-android-verity.c b/drivers/md/dm-android-verity.c index f6ddbee5e2d35..b7e059595f75d 100644 --- a/drivers/md/dm-android-verity.c +++ b/drivers/md/dm-android-verity.c @@ -576,15 +576,15 @@ static int add_as_linear_device(struct dm_target *ti, char *dev) DM_LINEAR_TARGET_OFFSET}; int err = 0; - android_verity_target.dtr = linear_target.dtr, - android_verity_target.map = linear_target.map, - android_verity_target.status = linear_target.status, - android_verity_target.ioctl = linear_target.ioctl, - android_verity_target.merge = linear_target.merge, - android_verity_target.iterate_devices = linear_target.iterate_devices, + android_verity_target.dtr = dm_linear_dtr, + android_verity_target.map = dm_linear_map, + android_verity_target.status = dm_linear_status, + android_verity_target.ioctl = dm_linear_ioctl, + android_verity_target.merge = dm_linear_merge, + android_verity_target.iterate_devices = dm_linear_iterate_devices, android_verity_target.io_hints = NULL; - err = linear_target.ctr(ti, DM_LINEAR_ARGS, linear_table_args); + err = dm_linear_ctr(ti, DM_LINEAR_ARGS, linear_table_args); if (!err) { DMINFO("Added android-verity as a linear target"); diff --git a/drivers/md/dm-android-verity.h b/drivers/md/dm-android-verity.h index fe53863c664b4..efb7965248968 100644 --- a/drivers/md/dm-android-verity.h +++ b/drivers/md/dm-android-verity.h @@ -94,4 +94,16 @@ struct bio_read { }; extern struct target_type linear_target; + +extern void dm_linear_dtr(struct dm_target *ti); +extern int dm_linear_map(struct dm_target *ti, struct bio *bio); +extern void dm_linear_status(struct dm_target *ti, status_type_t type, + unsigned status_flags, char *result, unsigned maxlen); +extern int dm_linear_ioctl(struct dm_target *ti, unsigned int cmd, + unsigned long arg); +extern int dm_linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, + struct bio_vec *biovec, int max_size); +extern int dm_linear_iterate_devices(struct dm_target *ti, + iterate_devices_callout_fn fn, void *data); +extern int dm_linear_ctr(struct dm_target *ti, unsigned int argc, char **argv); #endif /* DM_ANDROID_VERITY_H */ diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c index 73285561627a6..d42f1093ad60f 100644 --- a/drivers/md/dm-linear.c +++ b/drivers/md/dm-linear.c @@ -25,7 +25,7 @@ struct linear_c { /* * Construct a linear mapping: */ -static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv) +int dm_linear_ctr(struct dm_target *ti, unsigned int argc, char **argv) { struct linear_c *lc; unsigned long long tmp; @@ -64,7 +64,7 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv) return -EINVAL; } -static void linear_dtr(struct dm_target *ti) +void dm_linear_dtr(struct dm_target *ti) { struct linear_c *lc = (struct linear_c *) ti->private; @@ -89,14 +89,14 @@ static void linear_map_bio(struct dm_target *ti, struct bio *bio) linear_map_sector(ti, bio->bi_iter.bi_sector); } -static int linear_map(struct dm_target *ti, struct bio *bio) +int dm_linear_map(struct dm_target *ti, struct bio *bio) { linear_map_bio(ti, bio); return DM_MAPIO_REMAPPED; } -static void linear_status(struct dm_target *ti, status_type_t type, +void dm_linear_status(struct dm_target *ti, status_type_t type, unsigned status_flags, char *result, unsigned maxlen) { struct linear_c *lc = (struct linear_c *) ti->private; @@ -113,7 +113,7 @@ static void linear_status(struct dm_target *ti, status_type_t type, } } -static int linear_ioctl(struct dm_target *ti, unsigned int cmd, +int dm_linear_ioctl(struct dm_target *ti, unsigned int cmd, unsigned long arg) { struct linear_c *lc = (struct linear_c *) ti->private; @@ -130,7 +130,7 @@ static int linear_ioctl(struct dm_target *ti, unsigned int cmd, return r ? : __blkdev_driver_ioctl(dev->bdev, dev->mode, cmd, arg); } -static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, +int dm_linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, struct bio_vec *biovec, int max_size) { struct linear_c *lc = ti->private; @@ -145,7 +145,7 @@ static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, return min(max_size, q->merge_bvec_fn(q, bvm, biovec)); } -static int linear_iterate_devices(struct dm_target *ti, +int dm_linear_iterate_devices(struct dm_target *ti, iterate_devices_callout_fn fn, void *data) { struct linear_c *lc = ti->private; @@ -153,17 +153,17 @@ static int linear_iterate_devices(struct dm_target *ti, return fn(ti, lc->dev, lc->start, ti->len, data); } -struct target_type linear_target = { +static struct target_type linear_target = { .name = "linear", .version = {1, 2, 1}, .module = THIS_MODULE, - .ctr = linear_ctr, - .dtr = linear_dtr, - .map = linear_map, - .status = linear_status, - .ioctl = linear_ioctl, - .merge = linear_merge, - .iterate_devices = linear_iterate_devices, + .ctr = dm_linear_ctr, + .dtr = dm_linear_dtr, + .map = dm_linear_map, + .status = dm_linear_status, + .ioctl = dm_linear_ioctl, + .merge = dm_linear_merge, + .iterate_devices = dm_linear_iterate_devices, }; int __init dm_linear_init(void) From 908fcf1fb8b63e16b3d2da94d876282209ad81af Mon Sep 17 00:00:00 2001 From: Abhijit Kulkarni Date: Wed, 15 Jun 2016 10:30:50 -0700 Subject: [PATCH 0133/1015] msm: mdss: hide kernel addresses from unprevileged users for printing kernel pointers which should be hidden from unprivileged users, use %pK which evaluates whether kptr_restrict is set. CRs-Fixed: 987021 Change-Id: Ie49eee9478f4657cfb2a994ba60da1ec4c356339 Signed-off-by: Abhijit Kulkarni Signed-off-by: Jayant Shekhar --- drivers/video/msm/mdss/mdp3.c | 16 ++-- drivers/video/msm/mdss/mdp3_dma.c | 2 +- drivers/video/msm/mdss/mdp3_ppp_hwio.c | 6 +- drivers/video/msm/mdss/mdss_compat_utils.c | 18 ++-- drivers/video/msm/mdss/mdss_debug.c | 6 +- drivers/video/msm/mdss/mdss_debug_xlog.c | 12 +-- drivers/video/msm/mdss/mdss_dsi.c | 28 +++---- drivers/video/msm/mdss/mdss_dsi_clk.c | 6 +- drivers/video/msm/mdss/mdss_dsi_host.c | 2 +- drivers/video/msm/mdss/mdss_dsi_panel.c | 10 +-- drivers/video/msm/mdss/mdss_fb.c | 10 +-- drivers/video/msm/mdss/mdss_hdmi_tx.c | 6 +- drivers/video/msm/mdss/mdss_mdp.c | 12 +-- drivers/video/msm/mdss/mdss_mdp_debug.c | 2 +- drivers/video/msm/mdss/mdss_mdp_intf_cmd.c | 6 +- drivers/video/msm/mdss/mdss_mdp_intf_video.c | 10 +-- drivers/video/msm/mdss/mdss_mdp_layer.c | 4 +- drivers/video/msm/mdss/mdss_mdp_overlay.c | 10 +-- drivers/video/msm/mdss/mdss_mdp_pipe.c | 2 +- drivers/video/msm/mdss/mdss_mdp_pp.c | 74 ++++++++--------- .../video/msm/mdss/mdss_mdp_pp_cache_config.c | 66 +++++++-------- drivers/video/msm/mdss/mdss_mdp_pp_common.c | 4 +- drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c | 82 +++++++++---------- drivers/video/msm/mdss/mdss_mdp_pp_v3.c | 34 ++++---- drivers/video/msm/mdss/mdss_mdp_util.c | 9 +- drivers/video/msm/mdss/mdss_util.c | 2 +- drivers/video/msm/mdss/mhl3/mhl_linux_tx.c | 2 +- drivers/video/msm/mdss/mhl3/mhl_supp.c | 12 +-- drivers/video/msm/mdss/mhl3/platform.c | 6 +- drivers/video/msm/mdss/mhl3/si_8620_drv.c | 4 +- drivers/video/msm/mdss/mhl3/si_emsc_hid.c | 4 +- drivers/video/msm/mdss/mhl3/si_mdt_inputdev.c | 25 +++--- drivers/video/msm/mdss/mhl3/si_mhl2_edid_3d.c | 26 +++--- 33 files changed, 260 insertions(+), 258 deletions(-) diff --git a/drivers/video/msm/mdss/mdp3.c b/drivers/video/msm/mdss/mdp3.c index 0bfeb3b10f04d..3bd94c68d561a 100644 --- a/drivers/video/msm/mdss/mdp3.c +++ b/drivers/video/msm/mdss/mdp3.c @@ -1125,7 +1125,7 @@ static int mdp3_res_init(void) mdp3_res->ion_client = msm_ion_client_create(mdp3_res->pdev->name); if (IS_ERR_OR_NULL(mdp3_res->ion_client)) { - pr_err("msm_ion_client_create() return error (%p)\n", + pr_err("msm_ion_client_create() return error (%pK)\n", mdp3_res->ion_client); mdp3_res->ion_client = NULL; return -EINVAL; @@ -1555,7 +1555,7 @@ void mdp3_unmap_iommu(struct ion_client *client, struct ion_handle *handle) mutex_lock(&mdp3_res->iommu_lock); meta = mdp3_iommu_meta_lookup(table); if (!meta) { - WARN(1, "%s: buffer was never mapped for %p\n", __func__, + WARN(1, "%s: buffer was never mapped for %pK\n", __func__, handle); mutex_unlock(&mdp3_res->iommu_lock); return; @@ -1581,7 +1581,7 @@ static void mdp3_iommu_meta_add(struct mdp3_iommu_meta *meta) } else if (meta->table > entry->table) { p = &(*p)->rb_right; } else { - pr_err("%s: handle %p already exists\n", __func__, + pr_err("%s: handle %pK already exists\n", __func__, entry->handle); BUG(); } @@ -1644,7 +1644,7 @@ static int mdp3_iommu_map_iommu(struct mdp3_iommu_meta *meta, ret = iommu_map_range(domain, meta->iova_addr + padding, table->sgl, size, prot); if (ret) { - pr_err("%s: could not map %pa in domain %p\n", + pr_err("%s: could not map %pa in domain %pK\n", __func__, &meta->iova_addr, domain); unmap_size = padding; goto out2; @@ -1767,12 +1767,12 @@ int mdp3_self_map_iommu(struct ion_client *client, struct ion_handle *handle, } } else { if (iommu_meta->flags != iommu_flags) { - pr_err("%s: hndl %p already mapped with diff flag\n", + pr_err("%s: hndl %pK already mapped with diff flag\n", __func__, handle); ret = -EINVAL; goto out_unlock; } else if (iommu_meta->mapped_size != iova_length) { - pr_err("%s: hndl %p already mapped with diff len\n", + pr_err("%s: hndl %pK already mapped with diff len\n", __func__, handle); ret = -EINVAL; goto out_unlock; @@ -1806,7 +1806,7 @@ int mdp3_put_img(struct mdp3_img_data *data, int client) fdput(data->srcp_f); memset(&data->srcp_f, 0, sizeof(struct fd)); } else if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) { - pr_debug("ion hdl = %p buf=0x%pa\n", data->srcp_dma_buf, + pr_debug("ion hdl = %pK buf=0x%pa\n", data->srcp_dma_buf, &data->addr); if (!iclient) { pr_err("invalid ion client\n"); @@ -1909,7 +1909,7 @@ int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client) data->addr += img->offset; data->len -= img->offset; - pr_debug("mem=%d ihdl=%p buf=0x%pa len=0x%lx\n", + pr_debug("mem=%d ihdl=%pK buf=0x%pa len=0x%lx\n", img->memory_id, data->srcp_dma_buf, &data->addr, data->len); diff --git a/drivers/video/msm/mdss/mdp3_dma.c b/drivers/video/msm/mdss/mdp3_dma.c index d4c83d6e33f0d..8b382ea6fd95d 100644 --- a/drivers/video/msm/mdss/mdp3_dma.c +++ b/drivers/video/msm/mdss/mdp3_dma.c @@ -721,7 +721,7 @@ static int mdp3_dmap_update(struct mdp3_dma *dma, void *buf, retry_vsync: rc = wait_for_completion_timeout(&dma->vsync_comp, KOFF_TIMEOUT); - pr_err("%s VID DMA Buff Addr %p\n", __func__, buf); + pr_err("%s VID DMA Buff Addr %pK\n", __func__, buf); if (rc <= 0 && --retry_count) { int vsync = MDP3_REG_READ(MDP3_REG_INTR_STATUS) & (1 << MDP3_INTR_LCDC_START_OF_FRAME); diff --git a/drivers/video/msm/mdss/mdp3_ppp_hwio.c b/drivers/video/msm/mdss/mdp3_ppp_hwio.c index 5ba3fbdb62381..a4c66939bb184 100644 --- a/drivers/video/msm/mdss/mdp3_ppp_hwio.c +++ b/drivers/video/msm/mdss/mdp3_ppp_hwio.c @@ -1308,7 +1308,7 @@ int config_ppp_op_mode(struct ppp_blit_op *blit_op) pr_debug("ROI(x %d,y %d,w %d, h %d) ", blit_op->src.roi.x, blit_op->src.roi.y, blit_op->src.roi.width, blit_op->src.roi.height); - pr_debug("Addr_P0 %p, Stride S0 %d Addr_P1 %p, Stride S1 %d\n", + pr_debug("Addr_P0 %pK, Stride S0 %d Addr_P1 %pK, Stride S1 %d\n", blit_op->src.p0, blit_op->src.stride0, blit_op->src.p1, blit_op->src.stride1); @@ -1320,7 +1320,7 @@ int config_ppp_op_mode(struct ppp_blit_op *blit_op) pr_debug("ROI(x %d,y %d, w %d, h %d) ", blit_op->bg.roi.x, blit_op->bg.roi.y, blit_op->bg.roi.width, blit_op->bg.roi.height); - pr_debug("Addr %p, Stride S0 %d Addr_P1 %p, Stride S1 %d\n", + pr_debug("Addr %pK, Stride S0 %d Addr_P1 %pK, Stride S1 %d\n", blit_op->bg.p0, blit_op->bg.stride0, blit_op->bg.p1, blit_op->bg.stride1); } @@ -1331,7 +1331,7 @@ int config_ppp_op_mode(struct ppp_blit_op *blit_op) pr_debug("ROI(x %d,y %d, w %d, h %d) ", blit_op->dst.roi.x, blit_op->dst.roi.y, blit_op->dst.roi.width, blit_op->dst.roi.height); - pr_debug("Addr %p, Stride S0 %d Addr_P1 %p, Stride S1 %d\n", + pr_debug("Addr %pK, Stride S0 %d Addr_P1 %pK, Stride S1 %d\n", blit_op->dst.p0, blit_op->src.stride0, blit_op->dst.p1, blit_op->dst.stride1); diff --git a/drivers/video/msm/mdss/mdss_compat_utils.c b/drivers/video/msm/mdss/mdss_compat_utils.c index ad25b1f7a366b..d3eb3db48eb77 100644 --- a/drivers/video/msm/mdss/mdss_compat_utils.c +++ b/drivers/video/msm/mdss/mdss_compat_utils.c @@ -150,7 +150,7 @@ static struct mdp_input_layer32 *__create_layer_list32( compat_ptr(commit32->commit_v1.input_layers), sizeof(struct mdp_input_layer32) * layer_count); if (ret) { - pr_err("layer list32 copy from user failed, ptr %p\n", + pr_err("layer list32 copy from user failed, ptr %pK\n", compat_ptr(commit32->commit_v1.input_layers)); kfree(layer_list32); ret = -EFAULT; @@ -182,7 +182,7 @@ static int __copy_scale_params(struct mdp_input_layer *layer, sizeof(struct mdp_scale_data)); if (ret) { kfree(scale); - pr_err("scale param copy from user failed, ptr %p\n", + pr_err("scale param copy from user failed, ptr %pK\n", compat_ptr(layer32->scale)); ret = -EFAULT; } else { @@ -307,7 +307,7 @@ static int __compat_atomic_commit(struct fb_info *info, unsigned int cmd, ret = copy_from_user(&commit32, (void __user *)argp, sizeof(struct mdp_layer_commit32)); if (ret) { - pr_err("%s:copy_from_user failed, ptr %p\n", __func__, + pr_err("%s:copy_from_user failed, ptr %pK\n", __func__, (void __user *)argp); ret = -EFAULT; return ret; @@ -325,7 +325,7 @@ static int __compat_atomic_commit(struct fb_info *info, unsigned int cmd, compat_ptr(commit32.commit_v1.output_layer), buffer_size); if (ret) { - pr_err("fail to copy output layer from user, ptr %p\n", + pr_err("fail to copy output layer from user, ptr %pK\n", compat_ptr(commit32.commit_v1.output_layer)); ret = -EFAULT; goto layer_list_err; @@ -3418,7 +3418,7 @@ static int __copy_layer_igc_lut_data_v1_7( cfg_payload32, sizeof(struct mdp_igc_lut_data_v1_7_32)); if (ret) { - pr_err("copy from user failed, IGC cfg payload = %p\n", + pr_err("copy from user failed, IGC cfg payload = %pK\n", cfg_payload32); ret = -EFAULT; goto exit; @@ -3493,7 +3493,7 @@ static int __copy_layer_hist_lut_data_v1_7( cfg_payload32, sizeof(struct mdp_hist_lut_data_v1_7_32)); if (ret) { - pr_err("copy from user failed, hist lut cfg_payload = %p\n", + pr_err("copy from user failed, hist lut cfg_payload = %pK\n", cfg_payload32); ret = -EFAULT; goto exit; @@ -3565,7 +3565,7 @@ static int __copy_layer_pa_data_v1_7( cfg_payload32, sizeof(struct mdp_pa_data_v1_7_32)); if (ret) { - pr_err("copy from user failed, pa cfg_payload = %p\n", + pr_err("copy from user failed, pa cfg_payload = %pK\n", cfg_payload32); ret = -EFAULT; goto exit; @@ -3707,7 +3707,7 @@ static int __copy_layer_pp_info_pcc_params( compat_ptr(pp_info32->pcc_cfg_data.cfg_payload), sizeof(struct mdp_pcc_data_v1_7)); if (ret) { - pr_err("compat copy of PCC cfg payload failed, ptr %p\n", + pr_err("compat copy of PCC cfg payload failed, ptr %pK\n", compat_ptr( pp_info32->pcc_cfg_data.cfg_payload)); ret = -EFAULT; @@ -3741,7 +3741,7 @@ static int __copy_layer_pp_info_params(struct mdp_input_layer *layer, compat_ptr(layer32->pp_info), sizeof(struct mdp_overlay_pp_params32)); if (ret) { - pr_err("pp info copy from user failed, pp_info %p\n", + pr_err("pp info copy from user failed, pp_info %pK\n", compat_ptr(layer32->pp_info)); ret = -EFAULT; goto exit; diff --git a/drivers/video/msm/mdss/mdss_debug.c b/drivers/video/msm/mdss/mdss_debug.c index a1f15d9c94fa3..de64d10724911 100644 --- a/drivers/video/msm/mdss/mdss_debug.c +++ b/drivers/video/msm/mdss/mdss_debug.c @@ -1359,7 +1359,7 @@ static inline struct mdss_mdp_misr_map *mdss_misr_get_map(u32 block_id, return NULL; } - pr_debug("MISR Module(%d) CTRL(0x%x) SIG(0x%x) intf_base(0x%p)\n", + pr_debug("MISR Module(%d) CTRL(0x%x) SIG(0x%x) intf_base(0x%pK)\n", block_id, map->ctrl_reg, map->value_reg, intf_base); return map; } @@ -1432,7 +1432,7 @@ int mdss_misr_set(struct mdss_data_type *mdata, bool use_mdp_up_misr = false; if (!mdata || !req || !ctl) { - pr_err("Invalid input params: mdata = %p req = %p ctl = %p", + pr_err("Invalid input params: mdata = %pK req = %pK ctl = %pK", mdata, req, ctl); return -EINVAL; } @@ -1512,7 +1512,7 @@ int mdss_misr_set(struct mdss_data_type *mdata, writel_relaxed(config, mdata->mdp_base + map->ctrl_reg); - pr_debug("MISR_CTRL=0x%x [base:0x%p reg:0x%x config:0x%x]\n", + pr_debug("MISR_CTRL=0x%x [base:0x%pK reg:0x%x config:0x%x]\n", readl_relaxed(mdata->mdp_base + map->ctrl_reg), mdata->mdp_base, map->ctrl_reg, config); } diff --git a/drivers/video/msm/mdss/mdss_debug_xlog.c b/drivers/video/msm/mdss/mdss_debug_xlog.c index 431118980afc6..375dc47dd006d 100644 --- a/drivers/video/msm/mdss/mdss_debug_xlog.c +++ b/drivers/video/msm/mdss/mdss_debug_xlog.c @@ -253,7 +253,7 @@ static void mdss_dump_debug_bus(u32 bus_dump_flag, if (*dump_mem) { dump_addr = *dump_mem; - pr_info("%s: start_addr:0x%p end_addr:0x%p\n", + pr_info("%s: start_addr:0x%pK end_addr:0x%pK\n", __func__, dump_addr, dump_addr + list_size); } else { in_mem = false; @@ -371,7 +371,7 @@ static void mdss_dump_vbif_debug_bus(u32 bus_dump_flag, if (*dump_mem) { dump_addr = *dump_mem; - pr_info("%s: start_addr:0x%p end_addr:0x%p\n", + pr_info("%s: start_addr:0x%pK end_addr:0x%pK\n", __func__, dump_addr, dump_addr + list_size); } else { in_mem = false; @@ -431,7 +431,7 @@ void mdss_dump_reg(const char *dump_name, u32 reg_dump_flag, char *addr, if (*dump_mem) { dump_addr = *dump_mem; - pr_info("%s: start_addr:0x%p end_addr:0x%p reg_addr=0x%p\n", + pr_info("%s: start_addr:0x%pK end_addr:0x%pK reg_addr=0x%pK\n", dump_name, dump_addr, dump_addr + (u32)len * 16, addr); } else { @@ -452,7 +452,7 @@ void mdss_dump_reg(const char *dump_name, u32 reg_dump_flag, char *addr, xc = readl_relaxed(addr+0xc); if (in_log) - pr_info("%p : %08x %08x %08x %08x\n", addr, x0, x4, x8, + pr_info("%pK : %08x %08x %08x %08x\n", addr, x0, x4, x8, xc); if (dump_addr && in_mem) { @@ -490,7 +490,7 @@ static void mdss_dump_reg_by_ranges(struct mdss_debug_base *dbg, len = get_dump_range(&xlog_node->offset, dbg->max_offset); addr = dbg->base + xlog_node->offset.start; - pr_debug("%s: range_base=0x%p start=0x%x end=0x%x\n", + pr_debug("%s: range_base=0x%pK start=0x%x end=0x%x\n", xlog_node->range_name, addr, xlog_node->offset.start, xlog_node->offset.end); @@ -501,7 +501,7 @@ static void mdss_dump_reg_by_ranges(struct mdss_debug_base *dbg, } else { /* If there is no list to dump ranges, dump all registers */ pr_info("Ranges not found, will dump full registers"); - pr_info("base:0x%p len:0x%zu\n", dbg->base, dbg->max_offset); + pr_info("base:0x%pK len:0x%zu\n", dbg->base, dbg->max_offset); addr = dbg->base; len = dbg->max_offset; mdss_dump_reg((const char *)dbg->name, reg_dump_flag, addr, diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c index 8a1933709cf38..22a9ca7fc90b3 100644 --- a/drivers/video/msm/mdss/mdss_dsi.c +++ b/drivers/video/msm/mdss/mdss_dsi.c @@ -1129,7 +1129,7 @@ static int mdss_dsi_off(struct mdss_panel_data *pdata, int power_state) panel_info = &ctrl_pdata->panel_data.panel_info; - pr_debug("%s+: ctrl=%p ndx=%d power_state=%d\n", + pr_debug("%s+: ctrl=%pK ndx=%d power_state=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx, power_state); if (power_state == panel_info->panel_power_state) { @@ -1310,7 +1310,7 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) mdss_dsi_validate_debugfs_info(ctrl_pdata); cur_power_state = pdata->panel_info.panel_power_state; - pr_debug("%s+: ctrl=%p ndx=%d cur_power_state=%d\n", __func__, + pr_debug("%s+: ctrl=%pK ndx=%d cur_power_state=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx, cur_power_state); pinfo = &pdata->panel_info; @@ -1482,7 +1482,7 @@ static int mdss_dsi_unblank(struct mdss_panel_data *pdata) panel_data); mipi = &pdata->panel_info.mipi; - pr_debug("%s+: ctrl=%p ndx=%d cur_power_state=%d ctrl_state=%x\n", + pr_debug("%s+: ctrl=%pK ndx=%d cur_power_state=%d ctrl_state=%x\n", __func__, ctrl_pdata, ctrl_pdata->ndx, pdata->panel_info.panel_power_state, ctrl_pdata->ctrl_state); @@ -1555,7 +1555,7 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state) panel_data); mipi = &pdata->panel_info.mipi; - pr_debug("%s+: ctrl=%p ndx=%d power_state=%d\n", + pr_debug("%s+: ctrl=%pK ndx=%d power_state=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx, power_state); mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, @@ -1629,7 +1629,7 @@ static int mdss_dsi_post_panel_on(struct mdss_panel_data *pdata) ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); - pr_debug("%s+: ctrl=%p ndx=%d\n", __func__, + pr_debug("%s+: ctrl=%pK ndx=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx); mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, @@ -1663,7 +1663,7 @@ int mdss_dsi_cont_splash_on(struct mdss_panel_data *pdata) ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); - pr_debug("%s+: ctrl=%p ndx=%d\n", __func__, + pr_debug("%s+: ctrl=%pK ndx=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx); WARN((ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_INIT), @@ -2995,8 +2995,8 @@ static int mdss_dsi_get_bridge_chip_params(struct mdss_panel_info *pinfo, u32 temp_val = 0; if (!ctrl_pdata || !pdev || !pinfo) { - pr_err("%s: Invalid Params ctrl_pdata=%p, pdev=%p\n", __func__, - ctrl_pdata, pdev); + pr_err("%s: Invalid Params ctrl_pdata=%pK, pdev=%pK\n", + __func__, ctrl_pdata, pdev); rc = -EINVAL; goto end; } @@ -3318,7 +3318,7 @@ static int mdss_dsi_res_init(struct platform_device *pdev) mdss_dsi_res->shared_data = devm_kzalloc(&pdev->dev, sizeof(struct dsi_shared_data), GFP_KERNEL); - pr_debug("%s Allocated shared_data=%p\n", __func__, + pr_debug("%s Allocated shared_data=%pK\n", __func__, mdss_dsi_res->shared_data); if (!mdss_dsi_res->shared_data) { pr_err("%s Unable to alloc mem for shared_data\n", @@ -3384,7 +3384,7 @@ static int mdss_dsi_res_init(struct platform_device *pdev) rc = -ENOMEM; goto mem_fail; } - pr_debug("%s Allocated ctrl_pdata[%d]=%p\n", + pr_debug("%s Allocated ctrl_pdata[%d]=%pK\n", __func__, i, mdss_dsi_res->ctrl_pdata[i]); mdss_dsi_res->ctrl_pdata[i]->shared_data = mdss_dsi_res->shared_data; @@ -3394,7 +3394,7 @@ static int mdss_dsi_res_init(struct platform_device *pdev) } mdss_dsi_res->pdev = pdev; - pr_debug("%s: Setting up mdss_dsi_res=%p\n", __func__, mdss_dsi_res); + pr_debug("%s: Setting up mdss_dsi_res=%pK\n", __func__, mdss_dsi_res); return 0; @@ -3721,11 +3721,11 @@ int mdss_dsi_retrieve_ctrl_resources(struct platform_device *pdev, int mode, pr_debug("%s:%d unable to remap dsi phy regulator resources\n", __func__, __LINE__); else - pr_info("%s: phy_regulator_base=%p phy_regulator_size=%x\n", + pr_info("%s: phy_regulator_base=%pK phy_regulator_size=%x\n", __func__, ctrl->phy_regulator_io.base, ctrl->phy_regulator_io.len); - pr_info("%s: ctrl_base=%p ctrl_size=%x phy_base=%p phy_size=%x\n", + pr_info("%s: ctrl_base=%pK ctrl_size=%x phy_base=%pK phy_size=%x\n", __func__, ctrl->ctrl_base, ctrl->reg_size, ctrl->phy_io.base, ctrl->phy_io.len); @@ -3869,7 +3869,7 @@ static int mdss_dsi_parse_ctrl_params(struct platform_device *ctrl_pdev, data = of_get_property(ctrl_pdev->dev.of_node, "qcom,display-id", &len); if (!data || len <= 0) - pr_err("%s:%d Unable to read qcom,display-id, data=%p,len=%d\n", + pr_err("%s:%d Unable to read qcom,display-id, data=%pK,len=%d\n", __func__, __LINE__, data, len); else snprintf(ctrl_pdata->panel_data.panel_info.display_id, diff --git a/drivers/video/msm/mdss/mdss_dsi_clk.c b/drivers/video/msm/mdss/mdss_dsi_clk.c index 377aeb7cad47b..ec339ba735c7c 100644 --- a/drivers/video/msm/mdss/mdss_dsi_clk.c +++ b/drivers/video/msm/mdss/mdss_dsi_clk.c @@ -754,7 +754,7 @@ int mdss_dsi_clk_req_state(void *client, enum mdss_dsi_clk_type clk, if (!client || !clk || clk > (MDSS_DSI_CORE_CLK | MDSS_DSI_LINK_CLK) || state > MDSS_DSI_CLK_EARLY_GATE) { - pr_err("Invalid params, client = %p, clk = 0x%x, state = %d\n", + pr_err("Invalid params, client = %pK, clk = 0x%x, state = %d\n", client, clk, state); return -EINVAL; } @@ -852,7 +852,7 @@ int mdss_dsi_clk_set_link_rate(void *client, enum mdss_dsi_link_clk_type clk, struct mdss_dsi_clk_mngr *mngr; if (!client || (clk > MDSS_DSI_LINK_CLK_MAX)) { - pr_err("Invalid params, client = %p, clk = 0x%x", client, clk); + pr_err("Invalid params, client = %pK, clk = 0x%x", client, clk); return -EINVAL; } @@ -951,7 +951,7 @@ int mdss_dsi_clk_force_toggle(void *client, u32 clk) struct mdss_dsi_clk_mngr *mngr; if (!client || !clk || clk >= MDSS_DSI_CLKS_MAX) { - pr_err("Invalid params, client = %p, clk = 0x%x\n", + pr_err("Invalid params, client = %pK, clk = 0x%x\n", client, clk); return -EINVAL; } diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index 27ea8fa502633..f297dbc20c244 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -104,7 +104,7 @@ void mdss_dsi_ctrl_init(struct device *ctrl_dev, if (ctrl->mdss_util->register_irq(ctrl->dsi_hw)) pr_err("%s: mdss_register_irq failed.\n", __func__); - pr_debug("%s: ndx=%d base=%p\n", __func__, ctrl->ndx, ctrl->ctrl_base); + pr_debug("%s: ndx=%d base=%pK\n", __func__, ctrl->ndx, ctrl->ctrl_base); init_completion(&ctrl->dma_comp); init_completion(&ctrl->mdp_comp); diff --git a/drivers/video/msm/mdss/mdss_dsi_panel.c b/drivers/video/msm/mdss/mdss_dsi_panel.c index 6f75aa5a2ea5b..3fb879378bc86 100644 --- a/drivers/video/msm/mdss/mdss_dsi_panel.c +++ b/drivers/video/msm/mdss/mdss_dsi_panel.c @@ -762,7 +762,7 @@ static int mdss_dsi_post_panel_on(struct mdss_panel_data *pdata) ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); - pr_debug("%s: ctrl=%p ndx=%d\n", __func__, ctrl, ctrl->ndx); + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); pinfo = &pdata->panel_info; if (pinfo->dcs_cmd_by_left && ctrl->ndx != DSI_CTRL_LEFT) @@ -800,7 +800,7 @@ static int mdss_dsi_panel_off(struct mdss_panel_data *pdata) ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); - pr_debug("%s: ctrl=%p ndx=%d\n", __func__, ctrl, ctrl->ndx); + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); if (pinfo->dcs_cmd_by_left) { if (ctrl->ndx != DSI_CTRL_LEFT) @@ -835,7 +835,7 @@ static int mdss_dsi_panel_low_power_config(struct mdss_panel_data *pdata, ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); - pr_debug("%s: ctrl=%p ndx=%d enable=%d\n", __func__, ctrl, ctrl->ndx, + pr_debug("%s: ctrl=%pK ndx=%d enable=%d\n", __func__, ctrl, ctrl->ndx, enable); /* Any panel specific low power commands/config */ @@ -2191,7 +2191,7 @@ static int mdss_dsi_panel_timing_from_dt(struct device_node *np, if (np->name) { pt->timing.name = kstrdup(np->name, GFP_KERNEL); - pr_info("%s: found new timing \"%s\" (%p)\n", __func__, + pr_info("%s: found new timing \"%s\" (%pK)\n", __func__, np->name, &pt->timing); } @@ -2527,7 +2527,7 @@ static int mdss_panel_parse_dt(struct device_node *np, bridge_chip_name = of_get_property(np, "qcom,bridge-name", &len); if (!bridge_chip_name || len <= 0) { - pr_err("%s:%d Unable to read qcom,bridge_name, data=%p,len=%d\n", + pr_err("%s:%d Unable to read qcom,bridge_name, data=%pK,len=%d\n", __func__, __LINE__, bridge_chip_name, len); rc = -EINVAL; goto error; diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index a5ad5b6baf3ca..9778bb9f3d444 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -2042,7 +2042,7 @@ int mdss_fb_alloc_fb_ion_memory(struct msm_fb_data_type *mfd, size_t fb_size) rc = PTR_ERR(vaddr); goto err_unmap; } - pr_debug("alloc 0x%zuB vaddr = %p for fb%d\n", fb_size, + pr_debug("alloc 0x%zuB vaddr = %pK for fb%d\n", fb_size, vaddr, mfd->index); mfd->fbi->screen_base = (char *) vaddr; @@ -2141,7 +2141,7 @@ static int mdss_fb_fbmem_ion_mmap(struct fb_info *info, vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - pr_debug("vma=%p, addr=%x len=%ld\n", + pr_debug("vma=%pK, addr=%x len=%ld\n", vma, (unsigned int)addr, len); pr_debug("vm_start=%x vm_end=%x vm_page_prot=%ld\n", (unsigned int)vma->vm_start, @@ -2308,7 +2308,7 @@ static int mdss_fb_alloc_fbmem_iommu(struct msm_fb_data_type *mfd, int dom) return -ERANGE; } - pr_debug("alloc 0x%zxB @ (%pa phys) (0x%p virt) (%pa iova) for fb%d\n", + pr_debug("alloc 0x%zxB @ (%pa phys) (0x%pK virt) (%pa iova) for fb%d\n", size, &phys, virt, &mfd->iova, mfd->index); mfd->fbi->screen_base = virt; @@ -2596,7 +2596,7 @@ static int mdss_fb_open(struct fb_info *info, int user) } mfd->ref_cnt++; - pr_debug("mfd refcount:%d file:%p\n", mfd->ref_cnt, info->file); + pr_debug("mfd refcount:%d file:%pK\n", mfd->ref_cnt, info->file); return 0; @@ -2661,7 +2661,7 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all) pr_warn("file node not found or wrong ref cnt: release all:%d refcnt:%d\n", release_all, mfd->ref_cnt); - pr_debug("current process=%s pid=%d mfd->ref=%d file:%p\n", + pr_debug("current process=%s pid=%d mfd->ref=%d file:%pK\n", task->comm, current->tgid, mfd->ref_cnt, info->file); if (!mfd->ref_cnt || release_all) { diff --git a/drivers/video/msm/mdss/mdss_hdmi_tx.c b/drivers/video/msm/mdss/mdss_hdmi_tx.c index ebf20eaba1d2d..a76188ec3c098 100644 --- a/drivers/video/msm/mdss/mdss_hdmi_tx.c +++ b/drivers/video/msm/mdss/mdss_hdmi_tx.c @@ -1306,7 +1306,7 @@ static int hdmi_tx_sysfs_create(struct hdmi_tx_ctrl *hdmi_ctrl, return rc; } hdmi_ctrl->kobj = &fbi->dev->kobj; - DEV_DBG("%s: sysfs group %p\n", __func__, hdmi_ctrl->kobj); + DEV_DBG("%s: sysfs group %pK\n", __func__, hdmi_ctrl->kobj); return 0; } /* hdmi_tx_sysfs_create */ @@ -3858,7 +3858,7 @@ static int hdmi_tx_init_resource(struct hdmi_tx_ctrl *hdmi_ctrl) DEV_DBG("%s: '%s' remap failed or not available\n", __func__, hdmi_tx_io_name(i)); } - DEV_INFO("%s: '%s': start = 0x%p, len=0x%x\n", __func__, + DEV_INFO("%s: '%s': start = 0x%pK, len=0x%x\n", __func__, hdmi_tx_io_name(i), pdata->io[i].base, pdata->io[i].len); } @@ -4361,7 +4361,7 @@ static int hdmi_tx_get_dt_data(struct platform_device *pdev, data = of_get_property(pdev->dev.of_node, "qcom,display-id", &len); if (!data || len <= 0) - pr_err("%s:%d Unable to read qcom,display-id, data=%p,len=%d\n", + pr_err("%s:%d Unable to read qcom,display-id, data=%pK,len=%d\n", __func__, __LINE__, data, len); else snprintf(hdmi_ctrl->panel_data.panel_info.display_id, diff --git a/drivers/video/msm/mdss/mdss_mdp.c b/drivers/video/msm/mdss/mdss_mdp.c index ec4259ed6bdb3..6ee1f919c8a29 100644 --- a/drivers/video/msm/mdss/mdss_mdp.c +++ b/drivers/video/msm/mdss/mdss_mdp.c @@ -599,7 +599,7 @@ struct reg_bus_client *mdss_reg_bus_vote_client_create(char *client_name) strlcpy(client->name, client_name, MAX_CLIENT_NAME_LEN); client->usecase_ndx = VOTE_INDEX_DISABLE; client->id = id; - pr_debug("bus vote client %s created:%p id :%d\n", client_name, + pr_debug("bus vote client %s created:%pK id :%d\n", client_name, client, id); id++; list_add(&client->list, &mdss_res->reg_bus_clist); @@ -613,7 +613,7 @@ void mdss_reg_bus_vote_client_destroy(struct reg_bus_client *client) if (!client) { pr_err("reg bus vote: invalid client handle\n"); } else { - pr_debug("bus vote client %s destroyed:%p id:%u\n", + pr_debug("bus vote client %s destroyed:%pK id:%u\n", client->name, client, client->id); mutex_lock(&mdss_res->reg_bus_lock); list_del_init(&client->list); @@ -1980,7 +1980,7 @@ static u32 mdss_mdp_res_init(struct mdss_data_type *mdata) mdata->iclient = msm_ion_client_create(mdata->pdev->name); if (IS_ERR_OR_NULL(mdata->iclient)) { - pr_err("msm_ion_client_create() return error (%p)\n", + pr_err("msm_ion_client_create() return error (%pK)\n", mdata->iclient); mdata->iclient = NULL; } @@ -2592,7 +2592,7 @@ static int mdss_mdp_probe(struct platform_device *pdev) if (rc) pr_debug("unable to map MDSS VBIF non-realtime base\n"); else - pr_debug("MDSS VBIF NRT HW Base addr=%p len=0x%x\n", + pr_debug("MDSS VBIF NRT HW Base addr=%pK len=0x%x\n", mdata->vbif_nrt_io.base, mdata->vbif_nrt_io.len); res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); @@ -3414,7 +3414,7 @@ static int mdss_mdp_cdm_addr_setup(struct mdss_data_type *mdata, atomic_set(&head[i].kref.refcount, 0); mutex_init(&head[i].lock); init_completion(&head[i].free_comp); - pr_debug("%s: cdm off (%d) = %p\n", __func__, i, head[i].base); + pr_debug("%s: cdm off (%d) = %pK\n", __func__, i, head[i].base); } mdata->cdm_off = head; @@ -3481,7 +3481,7 @@ static int mdss_mdp_dsc_addr_setup(struct mdss_data_type *mdata, for (i = 0; i < len; i++) { head[i].num = i; head[i].base = (mdata->mdss_io.base) + dsc_offsets[i]; - pr_debug("dsc off (%d) = %p\n", i, head[i].base); + pr_debug("dsc off (%d) = %pK\n", i, head[i].base); } mdata->dsc_off = head; diff --git a/drivers/video/msm/mdss/mdss_mdp_debug.c b/drivers/video/msm/mdss/mdss_mdp_debug.c index 25702b54f91ae..7e0fd0f497009 100644 --- a/drivers/video/msm/mdss/mdss_mdp_debug.c +++ b/drivers/video/msm/mdss/mdss_mdp_debug.c @@ -988,7 +988,7 @@ void mdss_mdp_debug_mid(u32 mid) len = get_dump_range(&xlog_node->offset, blk_base->max_offset); addr = blk_base->base + xlog_node->offset.start; - pr_info("%s: mid:%d range_base=0x%p start=0x%x end=0x%x\n", + pr_info("%s: mid:%d range_base=0x%pK start=0x%x end=0x%x\n", xlog_node->range_name, mid, addr, xlog_node->offset.start, xlog_node->offset.end); diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c index d2205ff6cce20..aa70b44fdcb2b 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c @@ -1886,7 +1886,7 @@ static int mdss_mdp_cmd_wait4pingpong(struct mdss_mdp_ctl *ctl, void *arg) MDSS_XLOG(ctl->num, atomic_read(&ctx->koff_cnt), ctl->roi_bkup.w, ctl->roi_bkup.h); - pr_debug("%s: intf_num=%d ctx=%p koff_cnt=%d\n", __func__, + pr_debug("%s: intf_num=%d ctx=%pK koff_cnt=%d\n", __func__, ctl->intf_num, ctx, atomic_read(&ctx->koff_cnt)); rc = wait_event_timeout(ctx->pp_waitq, @@ -2122,7 +2122,7 @@ int mdss_mdp_cmd_set_autorefresh_mode(struct mdss_mdp_ctl *mctl, int frame_cnt) struct mdss_panel_info *pinfo; if (!mctl || !mctl->is_master || !mctl->panel_data) { - pr_err("invalid ctl mctl:%p pdata:%p\n", + pr_err("invalid ctl mctl:%pK pdata:%pK\n", mctl, mctl ? mctl->panel_data : 0); return -ENODEV; } @@ -3189,7 +3189,7 @@ static int mdss_mdp_cmd_ctx_setup(struct mdss_mdp_ctl *ctl, ctx->intf_stopped = 0; - pr_debug("%s: ctx=%p num=%d aux=%d\n", __func__, ctx, + pr_debug("%s: ctx=%pK num=%d aux=%d\n", __func__, ctx, default_pp_num, aux_pp_num); MDSS_XLOG(ctl->num, atomic_read(&ctx->koff_cnt)); diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_video.c b/drivers/video/msm/mdss/mdss_mdp_intf_video.c index b9988f6ce2646..262827b18a5f1 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_video.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_video.c @@ -297,7 +297,7 @@ int mdss_mdp_video_addr_setup(struct mdss_data_type *mdata, for (i = 0; i < count; i++) { head[i].base = mdata->mdss_io.base + offsets[i]; - pr_debug("adding Video Intf #%d offset=0x%x virt=%p\n", i, + pr_debug("adding Video Intf #%d offset=0x%x virt=%pK\n", i, offsets[i], head[i].base); head[i].ref_cnt = 0; head[i].intf_num = i + MDSS_MDP_INTF0; @@ -880,7 +880,7 @@ static int mdss_mdp_video_intfs_stop(struct mdss_mdp_ctl *ctl, pr_err("Intf %d not in use\n", (inum + MDSS_MDP_INTF0)); return -ENODEV; } - pr_debug("stop ctl=%d video Intf #%d base=%p", ctl->num, ctx->intf_num, + pr_debug("stop ctl=%d video Intf #%d base=%pK", ctl->num, ctx->intf_num, ctx->base); ret = mdss_mdp_video_ctx_stop(ctl, pinfo, ctx); @@ -898,7 +898,7 @@ static int mdss_mdp_video_intfs_stop(struct mdss_mdp_ctl *ctl, pr_err("Intf %d not in use\n", (inum + MDSS_MDP_INTF0)); return -ENODEV; } - pr_debug("stop ctl=%d video Intf #%d base=%p", ctl->num, + pr_debug("stop ctl=%d video Intf #%d base=%pK", ctl->num, sctx->intf_num, sctx->base); ret = mdss_mdp_video_ctx_stop(ctl, pinfo, sctx); @@ -1925,7 +1925,7 @@ static int mdss_mdp_video_intfs_setup(struct mdss_mdp_ctl *ctl, (inum + MDSS_MDP_INTF0)); return -EBUSY; } - pr_debug("video Intf #%d base=%p", ctx->intf_num, ctx->base); + pr_debug("video Intf #%d base=%pK", ctx->intf_num, ctx->base); ctx->ref_cnt++; } else { pr_err("Invalid intf number: %d\n", (inum + MDSS_MDP_INTF0)); @@ -1958,7 +1958,7 @@ static int mdss_mdp_video_intfs_setup(struct mdss_mdp_ctl *ctl, (inum + MDSS_MDP_INTF0)); return -EBUSY; } - pr_debug("video Intf #%d base=%p", ctx->intf_num, ctx->base); + pr_debug("video Intf #%d base=%pK", ctx->intf_num, ctx->base); ctx->ref_cnt++; ctl->intf_ctx[SLAVE_CTX] = ctx; diff --git a/drivers/video/msm/mdss/mdss_mdp_layer.c b/drivers/video/msm/mdss/mdss_mdp_layer.c index 989905444e652..e0a4a88dea09c 100644 --- a/drivers/video/msm/mdss/mdss_mdp_layer.c +++ b/drivers/video/msm/mdss/mdss_mdp_layer.c @@ -476,7 +476,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, mixer = mdss_mdp_mixer_get(mdp5_data->ctl, mixer_mux); pipe->src_fmt = mdss_mdp_get_format_params(layer->buffer.format); if (!pipe->src_fmt || !mixer) { - pr_err("invalid layer format:%d or mixer:%p\n", + pr_err("invalid layer format:%d or mixer:%pK\n", layer->buffer.format, pipe->mixer_left); ret = -EINVAL; goto end; @@ -1914,7 +1914,7 @@ static int __validate_layers(struct msm_fb_data_type *mfd, } } else { pipe->file = file; - pr_debug("file pointer attached with pipe is %p\n", + pr_debug("file pointer attached with pipe is %pK\n", file); } } diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index 25de560ed386e..bd3be5d0a906d 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -1081,7 +1081,7 @@ struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd, list_move_tail(&buf->buf_list, &mdp5_data->bufs_used); list_add_tail(&buf->pipe_list, &pipe->buf_queue); - pr_debug("buffer alloc: %p\n", buf); + pr_debug("buffer alloc: %pK\n", buf); return buf; } @@ -1135,7 +1135,7 @@ void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd, buf->last_freed = local_clock(); buf->state = MDP_BUF_STATE_UNUSED; - pr_debug("buffer freed: %p\n", buf); + pr_debug("buffer freed: %pK\n", buf); list_move_tail(&buf->buf_list, &mdp5_data->bufs_pool); } @@ -1516,7 +1516,7 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) if (buf) { switch (buf->state) { case MDP_BUF_STATE_READY: - pr_debug("pnum=%d buf=%p first buffer ready\n", + pr_debug("pnum=%d buf=%pK first buffer ready\n", pipe->num, buf); break; case MDP_BUF_STATE_ACTIVE: @@ -1536,7 +1536,7 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) } break; default: - pr_err("invalid state of buf %p=%d\n", + pr_err("invalid state of buf %pK=%d\n", buf, buf->state); BUG(); break; @@ -2237,7 +2237,7 @@ static int __mdss_mdp_overlay_release_all(struct msm_fb_data_type *mfd, u32 unset_ndx = 0; int cnt = 0; - pr_debug("releasing all resources for fb%d file:%p\n", + pr_debug("releasing all resources for fb%d file:%pK\n", mfd->index, file); mutex_lock(&mdp5_data->ov_lock); diff --git a/drivers/video/msm/mdss/mdss_mdp_pipe.c b/drivers/video/msm/mdss/mdss_mdp_pipe.c index 9a4e97722ad76..36983ddb127d1 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pipe.c +++ b/drivers/video/msm/mdss/mdss_mdp_pipe.c @@ -2730,7 +2730,7 @@ int mdss_mdp_pipe_queue_data(struct mdss_mdp_pipe *pipe, mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_MULTI_REC_OP_MODE, multirect_opmode); if (src_data == NULL) { - pr_debug("src_data=%p pipe num=%dx\n", + pr_debug("src_data=%pK pipe num=%dx\n", src_data, pipe->num); goto update_nobuf; } diff --git a/drivers/video/msm/mdss/mdss_mdp_pp.c b/drivers/video/msm/mdss/mdss_mdp_pp.c index fe8a1969389a3..95581ec66ec81 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp.c @@ -1158,7 +1158,7 @@ static int pp_rgb_pipe_setup(struct mdss_mdp_pipe *pipe, u32 *op) int ret = 0; if (!pipe) { - pr_err("invalid param pipe %p\n", pipe); + pr_err("invalid param pipe %pK\n", pipe); return -EINVAL; } if (pipe->flags & MDP_OVERLAY_PP_CFG_EN && @@ -1176,7 +1176,7 @@ static int pp_dma_pipe_setup(struct mdss_mdp_pipe *pipe, u32 *op) int ret = 0; if (!pipe) { - pr_err("invalid param pipe %p\n", pipe); + pr_err("invalid param pipe %pK\n", pipe); return -EINVAL; } if (pipe->flags & MDP_OVERLAY_PP_CFG_EN && @@ -1793,7 +1793,7 @@ void mdss_mdp_pipe_pp_clear(struct mdss_mdp_pipe *pipe) struct pp_hist_col_info *hist_info; if (!pipe) { - pr_err("Invalid pipe context passed, %p\n", + pr_err("Invalid pipe context passed, %pK\n", pipe); return; } @@ -1919,7 +1919,7 @@ static int pp_mixer_setup(struct mdss_mdp_mixer *mixer) struct mdss_data_type *mdata = mdss_mdp_get_mdata(); if (!mixer || !mixer->ctl || !mixer->ctl->mfd || !mdata) { - pr_err("invalid parameters, mixer %p ctl %p mfd %p mdata %p\n", + pr_err("invalid parameters, mixer %pK ctl %pK mfd %pK mdata %pK\n", mixer, (mixer ? mixer->ctl : NULL), (mixer ? (mixer->ctl ? mixer->ctl->mfd : NULL) : NULL), mdata); @@ -2568,7 +2568,7 @@ int mdss_mdp_pp_resume(struct msm_fb_data_type *mfd) struct mdp_pa_v2_cfg_data *pa_v2_cache_cfg = NULL; if (!mfd) { - pr_err("invalid input: mfd = 0x%p\n", mfd); + pr_err("invalid input: mfd = 0x%pK\n", mfd); return -EINVAL; } @@ -2658,7 +2658,7 @@ int mdss_mdp_pp_resume(struct msm_fb_data_type *mfd) mfd->index); return 0; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -2799,7 +2799,7 @@ static int mdss_mdp_pp_dt_parse(struct device *dev) ret = 0; } } else { - pr_err("invalid dev %p mdata %p\n", dev, mdata); + pr_err("invalid dev %pK mdata %pK\n", dev, mdata); ret = -EINVAL; } bail_out: @@ -2933,7 +2933,7 @@ int mdss_mdp_pp_overlay_init(struct msm_fb_data_type *mfd) struct mdss_data_type *mdata = mdss_mdp_get_mdata(); if (!mfd || !mdata) { - pr_err("Invalid mfd %p mdata %p\n", mfd, mdata); + pr_err("Invalid mfd %pK mdata %pK\n", mfd, mdata); return -EPERM; } if (mfd->index >= (MDP_BLOCK_MAX - MDP_LOGICAL_BLOCK_DISP_0)) @@ -2951,7 +2951,7 @@ int mdss_mdp_pp_default_overlay_config(struct msm_fb_data_type *mfd, int ret = 0; if (!mfd || !pdata) { - pr_err("Invalid parameters mfd %p pdata %p\n", mfd, pdata); + pr_err("Invalid parameters mfd %pK pdata %pK\n", mfd, pdata); return -EINVAL; } @@ -3004,7 +3004,7 @@ static int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out, mfd->index); return 0; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK.\n", ret, ad); return ret; } @@ -3023,7 +3023,7 @@ static int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out, if (!ad->bl_mfd || !ad->bl_mfd->panel_info || !ad->bl_att_lut) { - pr_err("Invalid ad info: bl_mfd = 0x%p, ad->bl_mfd->panel_info = 0x%p, bl_att_lut = 0x%p\n", + pr_err("Invalid ad info: bl_mfd = 0x%pK, ad->bl_mfd->panel_info = 0x%pK, bl_att_lut = 0x%pK\n", ad->bl_mfd, (!ad->bl_mfd) ? NULL : ad->bl_mfd->panel_info, ad->bl_att_lut); @@ -3520,7 +3520,7 @@ int mdss_mdp_pcc_config(struct msm_fb_data_type *mfd, if (pp_ops[PCC].pp_get_config) { addr = mdss_mdp_get_dspp_addr_off(disp_num); if (IS_ERR_OR_NULL(addr)) { - pr_err("invalid dspp base_addr %p\n", + pr_err("invalid dspp base_addr %pK\n", addr); ret = -EINVAL; goto pcc_clk_off; @@ -4208,7 +4208,7 @@ int mdss_mdp_hist_lut_config(struct msm_fb_data_type *mfd, mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); base_addr = mdss_mdp_get_dspp_addr_off(dspp_num); if (IS_ERR_OR_NULL(base_addr)) { - pr_err("invalid base addr %p\n", + pr_err("invalid base addr %pK\n", base_addr); ret = -EINVAL; goto hist_lut_clk_off; @@ -4462,7 +4462,7 @@ int mdss_mdp_gamut_config(struct msm_fb_data_type *mfd, if (pp_ops[GAMUT].pp_get_config) { addr = mdss_mdp_get_dspp_addr_off(disp_num); if (IS_ERR_OR_NULL(addr)) { - pr_err("invalid dspp base addr %p\n", + pr_err("invalid dspp base addr %pK\n", addr); ret = -EINVAL; goto gamut_clk_off; @@ -4648,7 +4648,7 @@ static int pp_hist_enable(struct pp_hist_col_info *hist_info, spin_lock_irqsave(&hist_info->hist_lock, flag); if (hist_info->col_en) { spin_unlock_irqrestore(&hist_info->hist_lock, flag); - pr_err("%s Hist collection has already been enabled %p\n", + pr_err("%s Hist collection has already been enabled %pK\n", __func__, hist_info->base); ret = -EBUSY; goto exit; @@ -4797,7 +4797,7 @@ static int pp_hist_disable(struct pp_hist_col_info *hist_info) spin_lock_irqsave(&hist_info->hist_lock, flag); if (hist_info->col_en == false) { spin_unlock_irqrestore(&hist_info->hist_lock, flag); - pr_debug("Histogram already disabled (%p)\n", hist_info->base); + pr_debug("Histogram already disabled (%pK)\n", hist_info->base); ret = -EINVAL; goto exit; } @@ -4894,7 +4894,7 @@ int mdss_mdp_hist_intr_req(struct mdss_intr *intr, u32 bits, bool en) unsigned long flag; int ret = 0; if (!intr) { - pr_err("NULL addr passed, %p\n", intr); + pr_err("NULL addr passed, %pK\n", intr); return -EINVAL; } @@ -5458,7 +5458,7 @@ static int mdss_mdp_get_ad(struct msm_fb_data_type *mfd, *ret_ad = NULL; if (!mfd) { - pr_err("invalid parameter mfd %p\n", mfd); + pr_err("invalid parameter mfd %pK\n", mfd); return -EINVAL; } mdata = mfd_to_mdata(mfd); @@ -5505,7 +5505,7 @@ static int pp_ad_invalidate_input(struct msm_fb_data_type *mfd) mfd->index); return 0; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -5540,7 +5540,7 @@ int mdss_mdp_ad_config(struct msm_fb_data_type *mfd, mfd->index); return ret; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -5657,7 +5657,7 @@ int mdss_mdp_ad_input(struct msm_fb_data_type *mfd, mfd->index); return ret; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -6016,7 +6016,7 @@ static int mdss_mdp_ad_ipc_reset(struct msm_fb_data_type *mfd) struct mdss_ad_info *ad; if (!mfd) { - pr_err("mfd = 0x%p\n", mfd); + pr_err("mfd = 0x%pK\n", mfd); return -EINVAL; } @@ -6026,7 +6026,7 @@ static int mdss_mdp_ad_ipc_reset(struct msm_fb_data_type *mfd) mfd->index); return 0; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -6050,13 +6050,13 @@ static int mdss_mdp_ad_setup(struct msm_fb_data_type *mfd) u32 width; if (!mfd) { - pr_err("mfd = 0x%p\n", mfd); + pr_err("mfd = 0x%pK\n", mfd); return -EINVAL; } ctl = mfd_to_ctl(mfd); if (!ctl) { - pr_err("ctl = 0x%p\n", ctl); + pr_err("ctl = 0x%pK\n", ctl); return -EINVAL; } sctl = mdss_mdp_get_split_ctl(ctl); @@ -6067,7 +6067,7 @@ static int mdss_mdp_ad_setup(struct msm_fb_data_type *mfd) mfd->index); return 0; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -6254,7 +6254,7 @@ static void pp_ad_calc_worker(struct work_struct *work) } mdp5_data = mfd_to_mdp5_data(ad->mfd); if (!mdp5_data) { - pr_err("mdp5_data = 0x%p\n", mdp5_data); + pr_err("mdp5_data = 0x%pK\n", mdp5_data); mutex_unlock(&ad->lock); return; } @@ -6262,7 +6262,7 @@ static void pp_ad_calc_worker(struct work_struct *work) ctl = mfd_to_ctl(ad->mfd); mdata = mfd_to_mdata(ad->mfd); if (!ctl || !mdata || ad->calc_hw_num >= mdata->nad_cfgs) { - pr_err("ctl = 0x%p, mdata = 0x%p, ad->calc_hw_num = %d, mdata->nad_cfg = %d\n", + pr_err("ctl = 0x%pK, mdata = 0x%pK, ad->calc_hw_num = %d, mdata->nad_cfg = %d\n", ctl, mdata, ad->calc_hw_num, (!mdata ? 0 : mdata->nad_cfgs)); mutex_unlock(&ad->lock); @@ -6873,7 +6873,7 @@ static int sspp_cache_location(u32 pipe_type, enum pp_config_block *block) int ret = 0; if (!block) { - pr_err("invalid params %p\n", block); + pr_err("invalid params %pK\n", block); return -EINVAL; } switch (pipe_type) { @@ -6902,7 +6902,7 @@ int mdss_mdp_pp_sspp_config(struct mdss_mdp_pipe *pipe) int ret = 0; if (!pipe) { - pr_err("invalid params, pipe %p\n", pipe); + pr_err("invalid params, pipe %pK\n", pipe); return -EINVAL; } @@ -7024,7 +7024,7 @@ static int pp_update_pcc_pipe_setup(struct mdss_mdp_pipe *pipe, u32 location) char __iomem *pipe_base = NULL; if (!pipe) { - pr_err("invalid param pipe %p\n", pipe); + pr_err("invalid param pipe %pK\n", pipe); return -EINVAL; } @@ -7076,7 +7076,7 @@ int mdss_mdp_pp_get_version(struct mdp_pp_feature_version *version) u32 ver_info = mdp_pp_legacy; if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); ret = -EINVAL; goto exit_version; } @@ -7157,7 +7157,7 @@ int mdss_mdp_copy_layer_pp_info(struct mdp_input_layer *layer) uint32_t ops; if (!layer) { - pr_err("invalid layer pointer passed %p\n", layer); + pr_err("invalid layer pointer passed %pK\n", layer); return -EFAULT; } @@ -7169,7 +7169,7 @@ int mdss_mdp_copy_layer_pp_info(struct mdp_input_layer *layer) ret = copy_from_user(pp_info, layer->pp_info, sizeof(struct mdp_overlay_pp_params)); if (ret) { - pr_err("layer list copy from user failed, pp_info = %p\n", + pr_err("layer list copy from user failed, pp_info = %pK\n", layer->pp_info); ret = -EFAULT; goto exit_pp_info; @@ -7278,7 +7278,7 @@ static int pp_mfd_release_all(struct msm_fb_data_type *mfd) struct mdss_data_type *mdata = mdss_mdp_get_mdata(); int ret = 0; if (!mfd || !mdata) { - pr_err("Invalid mfd %p mdata %p\n", mfd, mdata); + pr_err("Invalid mfd %pK mdata %pK\n", mfd, mdata); return -EPERM; } @@ -7309,7 +7309,7 @@ static int pp_mfd_ad_release_all(struct msm_fb_data_type *mfd) int ret = 0; if (!mdata || !mfd) { - pr_err("invalid params mdata %p mfd %p\n", mdata, mfd); + pr_err("invalid params mdata %pK mfd %pK\n", mdata, mfd); return -EINVAL; } if (!mdata->ad_calc_wq) @@ -7417,7 +7417,7 @@ static int pp_ppb_setup(struct mdss_mdp_mixer *mixer) int ret = 0; if (!mixer || !mixer->ctl || !mixer->ctl->mfd) { - pr_err("invalid parameters, mixer %p ctl %p mfd %p\n", + pr_err("invalid parameters, mixer %pK ctl %pK mfd %pK\n", mixer, (mixer ? mixer->ctl : NULL), (mixer ? (mixer->ctl ? mixer->ctl->mfd : NULL) : NULL)); return -EINVAL; diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c b/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c index d1b3f1a898125..ab178ae45cf86 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c @@ -103,7 +103,7 @@ static int pp_hist_lut_cache_params_v1_7(struct mdp_hist_lut_data *config, int ret = 0; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -113,7 +113,7 @@ static int pp_hist_lut_cache_params_v1_7(struct mdp_hist_lut_data *config, return -EINVAL; } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } @@ -165,7 +165,7 @@ static int pp_hist_lut_cache_params_pipe_v1_7(struct mdp_hist_lut_data *config, int ret = 0; if (!config || !pipe) { - pr_err("Invalid param config %p pipe %p\n", + pr_err("Invalid param config %pK pipe %pK\n", config, pipe); return -EINVAL; } @@ -236,7 +236,7 @@ int pp_hist_lut_cache_params(struct mdp_hist_lut_data *config, int ret = 0; if (!config || !res_cache) { - pr_err("invalid param config %p res_cache %p\n", + pr_err("invalid param config %pK res_cache %pK\n", config, res_cache); return -EINVAL; } @@ -245,7 +245,7 @@ int pp_hist_lut_cache_params(struct mdp_hist_lut_data *config, return -EINVAL; } if (!res_cache->mdss_pp_res && !res_cache->pipe_res) { - pr_err("NULL payload for block %d mdss_pp_res %p pipe_res %p\n", + pr_err("NULL payload for block %d mdss_pp_res %pK pipe_res %pK\n", res_cache->block, res_cache->mdss_pp_res, res_cache->pipe_res); return -EINVAL; @@ -286,7 +286,7 @@ int pp_dither_cache_params_v1_7(struct mdp_dither_cfg_data *config, struct mdp_dither_data_v1_7 *v17_cache_data = NULL, v17_usr_config; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -296,7 +296,7 @@ int pp_dither_cache_params_v1_7(struct mdp_dither_cfg_data *config, return -EINVAL; } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } @@ -358,7 +358,7 @@ int pp_dither_cache_params(struct mdp_dither_cfg_data *config, { int ret = 0; if (!config || !mdss_pp_res) { - pr_err("invalid param config %pi pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -387,7 +387,7 @@ static int pp_gamut_cache_params_v1_7(struct mdp_gamut_cfg_data *config, int ret = 0, i = 0; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -398,7 +398,7 @@ static int pp_gamut_cache_params_v1_7(struct mdp_gamut_cfg_data *config, return -EINVAL; } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } res_cache = mdss_pp_res->pp_data_v1_7; @@ -555,7 +555,7 @@ int pp_gamut_cache_params(struct mdp_gamut_cfg_data *config, { int ret = 0; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -578,7 +578,7 @@ static int pp_pcc_cache_params_pipe_v1_7(struct mdp_pcc_cfg_data *config, struct mdp_pcc_data_v1_7 *v17_cache_data = NULL, v17_usr_config; if (!pipe || !config) { - pr_err("invalid params pipe %p config %p\n", pipe, config); + pr_err("invalid params pipe %pK config %pK\n", pipe, config); return -EINVAL; } @@ -636,7 +636,7 @@ static int pp_pcc_cache_params_v1_7(struct mdp_pcc_cfg_data *config, struct mdp_pcc_data_v1_7 *v17_cache_data, v17_usr_config; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -647,7 +647,7 @@ static int pp_pcc_cache_params_v1_7(struct mdp_pcc_cfg_data *config, return -EINVAL; } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } @@ -687,7 +687,7 @@ int pp_pcc_cache_params(struct mdp_pcc_cfg_data *config, { int ret = 0; if (!config || !res_cache) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, res_cache); return -EINVAL; } @@ -696,7 +696,7 @@ int pp_pcc_cache_params(struct mdp_pcc_cfg_data *config, return -EINVAL; } if (!res_cache->mdss_pp_res && !res_cache->pipe_res) { - pr_err("NULL payload for block %d mdss_pp_res %p pipe_res %p\n", + pr_err("NULL payload for block %d mdss_pp_res %pK pipe_res %pK\n", res_cache->block, res_cache->mdss_pp_res, res_cache->pipe_res); return -EINVAL; @@ -735,7 +735,7 @@ static int pp_igc_lut_cache_params_v1_7(struct mdp_igc_lut_data *config, struct mdp_igc_lut_data_v1_7 *v17_cache_data, v17_usr_config; u32 disp_num; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -745,7 +745,7 @@ static int pp_igc_lut_cache_params_v1_7(struct mdp_igc_lut_data *config, return -EINVAL; } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } res_cache = mdss_pp_res->pp_data_v1_7; @@ -781,7 +781,7 @@ static int pp_igc_lut_cache_params_v1_7(struct mdp_igc_lut_data *config, } if (copy_from_kernel && (!v17_usr_config.c0_c1_data || !v17_usr_config.c2_data)) { - pr_err("copy from kernel invalid params c0_c1_data %p c2_data %p\n", + pr_err("copy from kernel invalid params c0_c1_data %pK c2_data %pK\n", v17_usr_config.c0_c1_data, v17_usr_config.c2_data); ret = -EINVAL; @@ -837,7 +837,7 @@ static int pp_igc_lut_cache_params_pipe_v1_7(struct mdp_igc_lut_data *config, struct mdp_igc_lut_data_v1_7 *v17_cache_data = NULL, v17_usr_config; int ret = 0, fix_up = 0, i = 0; if (!config || !pipe) { - pr_err("invalid param config %p pipe %p\n", + pr_err("invalid param config %pK pipe %pK\n", config, pipe); return -EINVAL; } @@ -865,7 +865,7 @@ static int pp_igc_lut_cache_params_pipe_v1_7(struct mdp_igc_lut_data *config, if (!v17_usr_config.c0_c1_data || !v17_usr_config.c2_data || v17_usr_config.len != IGC_LUT_ENTRIES) { - pr_err("invalid c0_c1data %p c2_data %p tbl len %d\n", + pr_err("invalid c0_c1data %pK c2_data %pK tbl len %d\n", v17_usr_config.c0_c1_data, v17_usr_config.c2_data, v17_usr_config.len); @@ -959,7 +959,7 @@ int pp_igc_lut_cache_params(struct mdp_igc_lut_data *config, { int ret = 0; if (!config || !res_cache) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, res_cache); return -EINVAL; } @@ -968,7 +968,7 @@ int pp_igc_lut_cache_params(struct mdp_igc_lut_data *config, return -EINVAL; } if (!res_cache->mdss_pp_res && !res_cache->pipe_res) { - pr_err("NULL payload for block %d mdss_pp_res %p pipe_res %p\n", + pr_err("NULL payload for block %d mdss_pp_res %pK pipe_res %pK\n", res_cache->block, res_cache->mdss_pp_res, res_cache->pipe_res); ret = -EINVAL; @@ -1103,7 +1103,7 @@ int pp_pgc_lut_cache_params(struct mdp_pgc_lut_data *config, { int ret = 0; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -1128,7 +1128,7 @@ static int pp_pa_cache_params_v1_7(struct mdp_pa_v2_cfg_data *config, int disp_num, ret = 0; if (!config || !mdss_pp_res) { - pr_err("Invalid param config %p pp_res %p\n", + pr_err("Invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -1140,7 +1140,7 @@ static int pp_pa_cache_params_v1_7(struct mdp_pa_v2_cfg_data *config, } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("Invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("Invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } @@ -1228,7 +1228,7 @@ static int pp_pa_cache_params_pipe_v1_7(struct mdp_pa_v2_cfg_data *config, int ret = 0; if (!config || !pipe) { - pr_err("Invalid param config %p pipe %p\n", + pr_err("Invalid param config %pK pipe %pK\n", config, pipe); return -EINVAL; } @@ -1284,7 +1284,7 @@ int pp_pa_cache_params(struct mdp_pa_v2_cfg_data *config, { int ret = 0; if (!config || !res_cache) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, res_cache); return -EINVAL; } @@ -1293,7 +1293,7 @@ int pp_pa_cache_params(struct mdp_pa_v2_cfg_data *config, return -EINVAL; } if (!res_cache->mdss_pp_res && !res_cache->pipe_res) { - pr_err("NULL payload for block %d mdss_pp_res %p pipe_res %p\n", + pr_err("NULL payload for block %d mdss_pp_res %pK pipe_res %pK\n", res_cache->block, res_cache->mdss_pp_res, res_cache->pipe_res); return -EINVAL; @@ -1344,7 +1344,7 @@ int pp_copy_layer_igc_payload(struct mdp_overlay_pp_params *pp_info) pp_info->igc_cfg.cfg_payload, sizeof(struct mdp_igc_lut_data_v1_7)); if (ret) { - pr_err("layer list copy from user failed, IGC cfg payload = %p\n", + pr_err("layer list copy from user failed, IGC cfg payload = %pK\n", pp_info->igc_cfg.cfg_payload); ret = -EFAULT; kfree(cfg_payload); @@ -1382,7 +1382,7 @@ int pp_copy_layer_hist_lut_payload(struct mdp_overlay_pp_params *pp_info) pp_info->hist_lut_cfg.cfg_payload, sizeof(struct mdp_hist_lut_data_v1_7)); if (ret) { - pr_err("layer list copy from user failed, Hist LUT cfg payload = %p\n", + pr_err("layer list copy from user failed, Hist LUT cfg payload = %pK\n", pp_info->hist_lut_cfg.cfg_payload); ret = -EFAULT; kfree(cfg_payload); @@ -1420,7 +1420,7 @@ int pp_copy_layer_pa_payload(struct mdp_overlay_pp_params *pp_info) pp_info->pa_v2_cfg_data.cfg_payload, sizeof(struct mdp_pa_data_v1_7)); if (ret) { - pr_err("layer list copy from user failed, PA cfg payload = %p\n", + pr_err("layer list copy from user failed, PA cfg payload = %pK\n", pp_info->pa_v2_cfg_data.cfg_payload); ret = -EFAULT; kfree(cfg_payload); @@ -1458,7 +1458,7 @@ int pp_copy_layer_pcc_payload(struct mdp_overlay_pp_params *pp_info) pp_info->pcc_cfg_data.cfg_payload, sizeof(struct mdp_pcc_data_v1_7)); if (ret) { - pr_err("layer list copy from user failed, PCC cfg payload = %p\n", + pr_err("layer list copy from user failed, PCC cfg payload = %pK\n", pp_info->pcc_cfg_data.cfg_payload); ret = -EFAULT; kfree(cfg_payload); diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_common.c b/drivers/video/msm/mdss/mdss_mdp_pp_common.c index 7742b5e4ad0c9..f3eccfe957f72 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_common.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_common.c @@ -20,7 +20,7 @@ void pp_pa_set_sts(struct pp_sts_type *pp_sts, int enable_flag, int block_type) { if (!pp_sts) { - pr_err("invalid input pp_sts %p\n", pp_sts); + pr_err("invalid input pp_sts %pK\n", pp_sts); return; } @@ -34,7 +34,7 @@ void pp_pa_set_sts(struct pp_sts_type *pp_sts, } if (!pa_data) { - pr_err("invalid input pa_data %p\n", pa_data); + pr_err("invalid input pa_data %pK\n", pa_data); return; } diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c b/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c index 1470915a12532..1e4adc9848022 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c @@ -246,7 +246,7 @@ static void pp_gamut_clock_gating_en(char __iomem *base_addr); void *pp_get_driver_ops_v1_7(struct mdp_pp_driver_ops *ops) { if (!ops) { - pr_err("PP driver ops invalid %p\n", ops); + pr_err("PP driver ops invalid %pK\n", ops); return ERR_PTR(-EINVAL); } @@ -308,7 +308,7 @@ static void pp_opmode_config(int location, struct pp_sts_type *pp_sts, u32 *opmode, int side) { if (!pp_sts || !opmode) { - pr_err("Invalid pp_sts %p or opmode %p\n", pp_sts, opmode); + pr_err("Invalid pp_sts %pK or opmode %pK\n", pp_sts, opmode); return; } switch (location) { @@ -362,7 +362,7 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, struct mdp_hist_lut_data *lut_cfg_data = NULL; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -374,7 +374,7 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, } if (lut_cfg_data->version != mdp_hist_lut_v1_7 || !lut_cfg_data->cfg_payload) { - pr_err("invalid hist_lut version %d payload %p\n", + pr_err("invalid hist_lut version %d payload %pK\n", lut_cfg_data->version, lut_cfg_data->cfg_payload); return -EINVAL; } @@ -439,7 +439,7 @@ static int pp_hist_lut_set_config(char __iomem *base_addr, char __iomem *hist_addr = NULL, *swap_addr = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -465,12 +465,12 @@ static int pp_hist_lut_set_config(char __iomem *base_addr, } lut_data = lut_cfg_data->cfg_payload; if (!lut_data) { - pr_err("invalid hist_lut cfg_payload %p\n", lut_data); + pr_err("invalid hist_lut cfg_payload %pK\n", lut_data); return -EINVAL; } if (lut_data->len != ENHIST_LUT_ENTRIES || !lut_data->data) { - pr_err("invalid hist_lut len %d data %p\n", + pr_err("invalid hist_lut len %d data %pK\n", lut_data->len, lut_data->data); return -EINVAL; } @@ -535,7 +535,7 @@ static int pp_dither_set_config(char __iomem *base_addr, uint32_t *pdata = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -563,7 +563,7 @@ static int pp_dither_set_config(char __iomem *base_addr, dither_data = dither_cfg_data->cfg_payload; if (!dither_data) { - pr_err("invalid payload for dither %p\n", dither_data); + pr_err("invalid payload for dither %pK\n", dither_data); return -EINVAL; } @@ -611,7 +611,7 @@ static int pp_hist_get_config(char __iomem *base_addr, void *cfg_data, struct pp_hist_col_info *hist_info = NULL; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -649,7 +649,7 @@ static int pp_get_hist_offset(u32 block, u32 *ctl_off) int ret = 0; if (!ctl_off) { - pr_err("invalid params ctl_off %p\n", ctl_off); + pr_err("invalid params ctl_off %pK\n", ctl_off); return -EINVAL; } switch (block) { @@ -670,7 +670,7 @@ static int pp_get_hist_offset(u32 block, u32 *ctl_off) static int pp_get_hist_isr(u32 *isr_mask) { if (!isr_mask) { - pr_err("invalid params isr_mask %p\n", isr_mask); + pr_err("invalid params isr_mask %pK\n", isr_mask); return -EINVAL; } @@ -696,7 +696,7 @@ static int pp_gamut_get_config(char __iomem *base_addr, void *cfg_data, u32 clk_gate_disable = 0; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -834,7 +834,7 @@ static int pp_gamut_set_config(char __iomem *base_addr, struct mdp_gamut_data_v1_7 *gamut_data = NULL; char __iomem *base_addr_scale = base_addr; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -856,7 +856,7 @@ static int pp_gamut_set_config(char __iomem *base_addr, gamut_data = (struct mdp_gamut_data_v1_7 *) gamut_cfg_data->cfg_payload; if (!gamut_data) { - pr_err("invalid payload for gamut %p\n", gamut_data); + pr_err("invalid payload for gamut %pK\n", gamut_data); return -EINVAL; } @@ -875,7 +875,7 @@ static int pp_gamut_set_config(char __iomem *base_addr, for (i = 0; i < MDP_GAMUT_TABLE_NUM_V1_7; i++) { if (!gamut_data->c0_data[i] || !gamut_data->c1_c2_data[i] || (gamut_data->tbl_size[i] != tbl_sz)) { - pr_err("invalid param for c0 %p c1c2 %p table %d size %d expected sz %d\n", + pr_err("invalid param for c0 %pK c1c2 %pK table %d size %d expected sz %d\n", gamut_data->c0_data[i], gamut_data->c1_c2_data[i], i, gamut_data->tbl_size[i], tbl_sz); @@ -886,7 +886,7 @@ static int pp_gamut_set_config(char __iomem *base_addr, (!gamut_data->scale_off_data[i] || (gamut_data->tbl_scale_off_sz[i] != MDP_GAMUT_SCALE_OFF_SZ))) { - pr_err("invalid param for scale table %p for c%d size %d expected size%d\n", + pr_err("invalid param for scale table %pK for c%d size %d expected size%d\n", gamut_data->scale_off_data[i], i, gamut_data->tbl_scale_off_sz[i], MDP_GAMUT_SCALE_OFF_SZ); @@ -951,7 +951,7 @@ static int pp_pcc_set_config(char __iomem *base_addr, u32 opmode = 0; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -966,7 +966,7 @@ static int pp_pcc_set_config(char __iomem *base_addr, } pcc_data = pcc_cfg_data->cfg_payload; if (!pcc_data) { - pr_err("invalid payload for pcc %p\n", pcc_data); + pr_err("invalid payload for pcc %pK\n", pcc_data); return -EINVAL; } @@ -1036,7 +1036,7 @@ static int pp_pcc_get_config(char __iomem *base_addr, void *cfg_data, struct mdp_pcc_data_v1_7 pcc_data; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -1233,7 +1233,7 @@ static void pp_pa_set_six_zone(char __iomem *base_addr, if (!pa_data->six_zone_len || !pa_data->six_zone_curve_p0 || !pa_data->six_zone_curve_p1) { - pr_err("Invalid six zone data: len %d curve_p0 %p curve_p1 %p\n", + pr_err("Invalid six zone data: len %d curve_p0 %pK curve_p1 %pK\n", pa_data->six_zone_len, pa_data->six_zone_curve_p0, pa_data->six_zone_curve_p1); @@ -1283,7 +1283,7 @@ static int pp_pa_set_config(char __iomem *base_addr, int ret = 0; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -1308,7 +1308,7 @@ static int pp_pa_set_config(char __iomem *base_addr, pa_data = pa_cfg_data->cfg_payload; if (!pa_data) { - pr_err("invalid payload for pa %p\n", pa_data); + pr_err("invalid payload for pa %pK\n", pa_data); return -EINVAL; } @@ -1557,7 +1557,7 @@ static int pp_pa_get_config(char __iomem *base_addr, void *cfg_data, char __iomem *pa_hold_addr = NULL; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -1690,7 +1690,7 @@ static int pp_igc_set_config(char __iomem *base_addr, u32 data; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -1698,7 +1698,7 @@ static int pp_igc_set_config(char __iomem *base_addr, lut_cfg_data = (struct mdp_igc_lut_data *) cfg_data; if (lut_cfg_data->version != mdp_igc_v1_7 || !lut_cfg_data->cfg_payload) { - pr_err_once("invalid igc version %d payload %p\n", + pr_err_once("invalid igc version %d payload %pK\n", lut_cfg_data->version, lut_cfg_data->cfg_payload); return -EINVAL; } @@ -1717,7 +1717,7 @@ static int pp_igc_set_config(char __iomem *base_addr, lut_data = lut_cfg_data->cfg_payload; if (lut_data->len != IGC_LUT_ENTRIES || !lut_data->c0_c1_data || !lut_data->c2_data) { - pr_err("invalid lut len %d c0_c1_data %p c2_data %p\n", + pr_err("invalid lut len %d c0_c1_data %pK c2_data %pK\n", lut_data->len, lut_data->c0_c1_data, lut_data->c2_data); return -EINVAL; } @@ -1784,7 +1784,7 @@ static int pp_igc_get_config(char __iomem *base_addr, void *cfg_data, u32 data = 0, sz = 0; if (!base_addr || !cfg_data || block_type != DSPP) { - pr_err("invalid params base_addr %p cfg_data %p block_type %d\n", + pr_err("invalid params base_addr %pK cfg_data %pK block_type %d\n", base_addr, cfg_data, block_type); return -EINVAL; } @@ -1796,7 +1796,7 @@ static int pp_igc_get_config(char __iomem *base_addr, void *cfg_data, if (lut_cfg_data->version != mdp_igc_v1_7 || !lut_cfg_data->cfg_payload || lut_cfg_data->block > IGC_MASK_MAX) { - pr_err("invalid igc version %d payload %p block %d\n", + pr_err("invalid igc version %d payload %pK block %d\n", lut_cfg_data->version, lut_cfg_data->cfg_payload, lut_cfg_data->block); ret = -EINVAL; @@ -1861,7 +1861,7 @@ static int pp_pgc_set_config(char __iomem *base_addr, struct mdp_pgc_lut_data_v1_7 *pgc_data_v17 = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -1887,13 +1887,13 @@ static int pp_pgc_set_config(char __iomem *base_addr, pgc_data_v17 = (struct mdp_pgc_lut_data_v1_7 *) pgc_data->cfg_payload; if (!pgc_data_v17) { - pr_err("invalid payload for GC %p\n", pgc_data_v17); + pr_err("invalid payload for GC %pK\n", pgc_data_v17); return -EINVAL; } if (pgc_data_v17->len != PGC_LUT_ENTRIES || !pgc_data_v17->c0_data || !pgc_data_v17->c1_data || !pgc_data_v17->c2_data) { - pr_err("Invalid params entries %d c0_data %p c1_data %p c2_data %p\n", + pr_err("Invalid params entries %d c0_data %pK c1_data %pK c2_data %pK\n", pgc_data_v17->len, pgc_data_v17->c0_data, pgc_data_v17->c1_data, pgc_data_v17->c2_data); return -EINVAL; @@ -1948,7 +1948,7 @@ static int pp_pgc_get_config(char __iomem *base_addr, void *cfg_data, struct mdp_pgc_lut_data *pgc_data = NULL; struct mdp_pgc_lut_data_v1_7 *pgc_data_v17 = NULL; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p block_type %d\n", + pr_err("invalid params base_addr %pK cfg_data %pK block_type %d\n", base_addr, cfg_data, block_type); return -EINVAL; } @@ -1956,7 +1956,7 @@ static int pp_pgc_get_config(char __iomem *base_addr, void *cfg_data, pgc_data_v17 = (struct mdp_pgc_lut_data_v1_7 *) pgc_data->cfg_payload; if (pgc_data->version != mdp_pgc_v1_7 || !pgc_data_v17) { - pr_err("invalid pgc version %d payload %p\n", + pr_err("invalid pgc version %d payload %pK\n", pgc_data->version, pgc_data_v17); return -EINVAL; } @@ -2018,7 +2018,7 @@ static int pp_pgc_get_config(char __iomem *base_addr, void *cfg_data, static int pp_pcc_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_pcc_v1_7; @@ -2028,7 +2028,7 @@ static int pp_pcc_get_version(u32 *version) static int pp_igc_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_igc_v1_7; @@ -2038,7 +2038,7 @@ static int pp_igc_get_version(u32 *version) static int pp_pgc_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_pgc_v1_7; @@ -2048,7 +2048,7 @@ static int pp_pgc_get_version(u32 *version) static int pp_pa_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_pa_v1_7; @@ -2058,7 +2058,7 @@ static int pp_pa_get_version(u32 *version) static int pp_gamut_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_gamut_v1_7; @@ -2068,7 +2068,7 @@ static int pp_gamut_get_version(u32 *version) static int pp_dither_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_dither_v1_7; @@ -2078,7 +2078,7 @@ static int pp_dither_get_version(u32 *version) static int pp_hist_lut_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_hist_lut_v1_7; diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_v3.c b/drivers/video/msm/mdss/mdss_mdp_pp_v3.c index 4920c5387e2c0..ce915e919caa3 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_v3.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_v3.c @@ -117,7 +117,7 @@ void *pp_get_driver_ops_v3(struct mdp_pp_driver_ops *ops) void *pp_cfg = NULL; if (!ops) { - pr_err("PP driver ops invalid %p\n", ops); + pr_err("PP driver ops invalid %pK\n", ops); return ERR_PTR(-EINVAL); } @@ -158,7 +158,7 @@ static int pp_get_hist_offset(u32 block, u32 *ctl_off) int ret = 0; if (!ctl_off) { - pr_err("invalid params ctl_off %p\n", ctl_off); + pr_err("invalid params ctl_off %pK\n", ctl_off); return -EINVAL; } @@ -184,7 +184,7 @@ static int pp_hist_set_config(char __iomem *base_addr, struct pp_hist_col_info *hist_info = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -220,7 +220,7 @@ static int pp_hist_get_config(char __iomem *base_addr, void *cfg_data, char __iomem *hist_addr; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -253,7 +253,7 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, struct mdp_hist_lut_data *lut_cfg_data = NULL; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -270,7 +270,7 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, } if (lut_cfg_data->version != mdp_hist_lut_v1_7 || !lut_cfg_data->cfg_payload) { - pr_err("invalid hist_lut version %d payload %p\n", + pr_err("invalid hist_lut version %d payload %pK\n", lut_cfg_data->version, lut_cfg_data->cfg_payload); return -EINVAL; } @@ -317,7 +317,7 @@ static int pp_hist_lut_set_config(char __iomem *base_addr, char __iomem *hist_lut_addr = NULL, *swap_addr = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -344,12 +344,12 @@ static int pp_hist_lut_set_config(char __iomem *base_addr, } lut_data = lut_cfg_data->cfg_payload; if (!lut_data) { - pr_err("invalid hist_lut cfg_payload %p\n", lut_data); + pr_err("invalid hist_lut cfg_payload %pK\n", lut_data); return -EINVAL; } if (lut_data->len != ENHIST_LUT_ENTRIES || !lut_data->data) { - pr_err("invalid hist_lut len %d data %p\n", + pr_err("invalid hist_lut len %d data %pK\n", lut_data->len, lut_data->data); return -EINVAL; } @@ -386,7 +386,7 @@ static int pp_hist_lut_set_config(char __iomem *base_addr, static int pp_hist_lut_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_hist_lut_v1_7; @@ -399,7 +399,7 @@ static void pp_hist_lut_opmode_config(char __iomem *base_addr, u32 opmode = 0; if (!base_addr || !pp_sts) { - pr_err("invalid params base_addr %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK pp_sts_type %pK\n", base_addr, pp_sts); return; } @@ -428,7 +428,7 @@ static int pp_pa_set_config(char __iomem *base_addr, char __iomem *block_addr = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -459,7 +459,7 @@ static int pp_pa_set_config(char __iomem *base_addr, pa_data = pa_cfg_data->cfg_payload; if (!pa_data) { - pr_err("invalid payload for pa %p\n", pa_data); + pr_err("invalid payload for pa %pK\n", pa_data); return -EINVAL; } @@ -508,7 +508,7 @@ static int pp_dither_set_config(char __iomem *base_addr, char __iomem *dither_opmode = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -537,7 +537,7 @@ static int pp_dither_set_config(char __iomem *base_addr, dither_data = dither_cfg_data->cfg_payload; if (!dither_data) { - pr_err("invalid payload for dither %p\n", dither_data); + pr_err("invalid payload for dither %pK\n", dither_data); return -EINVAL; } @@ -592,7 +592,7 @@ static void pp_opmode_config(int location, struct pp_sts_type *pp_sts, u32 *opmode, int side) { if (!pp_sts || !opmode) { - pr_err("Invalid pp_sts %p or opmode %p\n", pp_sts, opmode); + pr_err("Invalid pp_sts %pK or opmode %pK\n", pp_sts, opmode); return; } switch (location) { @@ -726,7 +726,7 @@ static void pp_pa_set_six_zone(char __iomem *base_addr, if (pa_data->six_zone_len != MDP_SIX_ZONE_LUT_SIZE || !pa_data->six_zone_curve_p0 || !pa_data->six_zone_curve_p1) { - pr_err("Invalid six zone data: len %d curve_p0 %p curve_p1 %p\n", + pr_err("Invalid six zone data: len %d curve_p0 %pK curve_p1 %pK\n", pa_data->six_zone_len, pa_data->six_zone_curve_p0, pa_data->six_zone_curve_p1); diff --git a/drivers/video/msm/mdss/mdss_mdp_util.c b/drivers/video/msm/mdss/mdss_mdp_util.c index 3a904b8242c42..c25a976de0ea1 100644 --- a/drivers/video/msm/mdss/mdss_mdp_util.c +++ b/drivers/video/msm/mdss/mdss_mdp_util.c @@ -931,7 +931,7 @@ static int mdss_mdp_put_img(struct mdss_mdp_img_data *data, bool rotator, pr_debug("pmem buf=0x%pa\n", &data->addr); memset(&data->srcp_f, 0, sizeof(struct fd)); } else if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) { - pr_debug("ion hdl=%p buf=0x%pa\n", data->srcp_dma_buf, + pr_debug("ion hdl=%pK buf=0x%pa\n", data->srcp_dma_buf, &data->addr); if (!iclient) { pr_err("invalid ion client\n"); @@ -1096,8 +1096,9 @@ static int mdss_mdp_get_img(struct msmfb_data *img, data->addr += data->offset; data->len -= data->offset; - pr_debug("mem=%d ihdl=%p buf=0x%pa len=0x%lx\n", img->memory_id, - data->srcp_dma_buf, &data->addr, data->len); + pr_debug("mem=%d ihdl=%pK buf=0x%pa len=0x%lx\n", + img->memory_id, data->srcp_dma_buf, &data->addr, + data->len); } else { mdss_mdp_put_img(data, rotator, dir); return ret ? : -EOVERFLOW; @@ -1161,7 +1162,7 @@ static int mdss_mdp_map_buffer(struct mdss_mdp_img_data *data, bool rotator, data->addr += data->offset; data->len -= data->offset; - pr_debug("ihdl=%p buf=0x%pa len=0x%lx\n", + pr_debug("ihdl=%pK buf=0x%pa len=0x%lx\n", data->srcp_dma_buf, &data->addr, data->len); } else { mdss_mdp_put_img(data, rotator, dir); diff --git a/drivers/video/msm/mdss/mdss_util.c b/drivers/video/msm/mdss/mdss_util.c index db318de6fc6d7..d2610ff808789 100644 --- a/drivers/video/msm/mdss/mdss_util.c +++ b/drivers/video/msm/mdss/mdss_util.c @@ -33,7 +33,7 @@ int mdss_register_irq(struct mdss_hw *hw) if (!mdss_irq_handlers[hw->hw_ndx]) mdss_irq_handlers[hw->hw_ndx] = hw; else - pr_err("panel %d's irq at %p is already registered\n", + pr_err("panel %d's irq at %pK is already registered\n", hw->hw_ndx, hw->irq_handler); spin_unlock_irqrestore(&mdss_lock, irq_flags); diff --git a/drivers/video/msm/mdss/mhl3/mhl_linux_tx.c b/drivers/video/msm/mdss/mhl3/mhl_linux_tx.c index 1514f021414ad..04ba7a00bb2bc 100644 --- a/drivers/video/msm/mdss/mhl3/mhl_linux_tx.c +++ b/drivers/video/msm/mdss/mhl3/mhl_linux_tx.c @@ -5599,7 +5599,7 @@ static int is_timer_handle_valid(struct mhl_dev_context *dev_context, } if (timer != timer_handle) { - MHL_TX_DBG_WARN("Invalid timer handle %p received\n", + MHL_TX_DBG_WARN("Invalid timer handle %pK received\n", timer_handle); return -EINVAL; } diff --git a/drivers/video/msm/mdss/mhl3/mhl_supp.c b/drivers/video/msm/mdss/mhl3/mhl_supp.c index 7055d8cd758dd..29de6d0b6401a 100644 --- a/drivers/video/msm/mdss/mhl3/mhl_supp.c +++ b/drivers/video/msm/mdss/mhl3/mhl_supp.c @@ -185,7 +185,7 @@ static struct cbus_req *get_free_cbus_queue_entry_impl( req->function = function; req->line = line; req->sequence = dev_context->sequence++; - /*MHL_TX_DBG_ERR(,"q %d get:0x%p %s:%d\n", + /*MHL_TX_DBG_ERR(,"q %d get:0x%pK %s:%d\n", req->sequence,req,function,line); */ return req; } @@ -197,7 +197,7 @@ static void return_cbus_queue_entry_impl(struct mhl_dev_context *dev_context, struct cbus_req *pReq, const char *function, int line) { - /* MHL_TX_DBG_ERR(,"q ret:0x%p %s:%d\n",pReq,function,line); */ + /* MHL_TX_DBG_ERR(,"q ret:0x%pK %s:%d\n",pReq,function,line); */ list_add(&pReq->link, &dev_context->cbus_free_list); } @@ -372,7 +372,7 @@ static struct block_req *start_new_block_marshalling_req_impl( sizeof(payload->as_bytes) - sizeof(struct SI_PACK_THIS_STRUCT standard_transport_header_t); dev_context->block_protocol.marshalling_req = req; - MHL_TX_DBG_WARN("q %d get:0x%p %s:%d\n", req->sequence, req, function, + MHL_TX_DBG_WARN("q %d get:0x%pK %s:%d\n", req->sequence, req, function, line); return req; } @@ -384,7 +384,7 @@ static void return_block_queue_entry_impl(struct mhl_dev_context *dev_context, struct block_req *pReq, const char *function, int line) { - /* MHL_TX_DBG_ERR(,"q ret:0x%p %s:%d\n",pReq,function,line); */ + /* MHL_TX_DBG_ERR(,"q ret:0x%pK %s:%d\n",pReq,function,line); */ list_add(&pReq->link, &dev_context->block_protocol.free_list); } @@ -1283,7 +1283,7 @@ void si_mhl_tx_drive_states(struct mhl_dev_context *dev_context) if (req == NULL) return; - MHL_TX_DBG_INFO("req: %p\n", req); + MHL_TX_DBG_INFO("req: %pK\n", req); /* coordinate write burst requests and grants. */ if (MHL_MSC_MSG == req->command) { dev_context->msc_msg_last_data = req->msg_data[1]; @@ -1298,7 +1298,7 @@ void si_mhl_tx_drive_states(struct mhl_dev_context *dev_context) } } - MHL_TX_DBG_INFO("req: %p\n", req); + MHL_TX_DBG_INFO("req: %pK\n", req); if (req) { uint8_t ret_val; dev_context->current_cbus_req = req; diff --git a/drivers/video/msm/mdss/mhl3/platform.c b/drivers/video/msm/mdss/mhl3/platform.c index c0e5174880b81..b0c7e8aabb236 100644 --- a/drivers/video/msm/mdss/mhl3/platform.c +++ b/drivers/video/msm/mdss/mhl3/platform.c @@ -1590,7 +1590,7 @@ static int __devinit si_8620_mhl_tx_i2c_probe(struct i2c_client *client, { int ret; - pr_info("%s(), i2c_device_id = %p\n", __func__, id); + pr_info("%s(), i2c_device_id = %pK\n", __func__, id); #if defined(SIMG_USE_DTS) /* @@ -1844,7 +1844,7 @@ static int __devinit si_8620_mhl_tx_spi_probe(struct spi_device *spi) { int ret; - pr_info("%s(), spi = %p\n", __func__, spi); + pr_info("%s(), spi = %pK\n", __func__, spi); spi->bits_per_word = 8; spi_dev = spi; spi_bus_num = spi->master->bus_num; @@ -2161,7 +2161,7 @@ static void __exit si_8620_exit(void) for (idx = 0; idx < ARRAY_SIZE(device_addresses); idx++) { MHL_TX_DBG_INFO("\n"); if (device_addresses[idx].client != NULL) { - MHL_TX_DBG_INFO("unregistering device:%p\n", + MHL_TX_DBG_INFO("unregistering device:%pK\n", device_addresses[idx].client); i2c_unregister_device(device_addresses[idx]. client); diff --git a/drivers/video/msm/mdss/mhl3/si_8620_drv.c b/drivers/video/msm/mdss/mhl3/si_8620_drv.c index dd71f1becd1eb..9d68f285d5816 100644 --- a/drivers/video/msm/mdss/mhl3/si_8620_drv.c +++ b/drivers/video/msm/mdss/mhl3/si_8620_drv.c @@ -2367,7 +2367,7 @@ int si_mhl_tx_drv_get_edid_fifo_partial_block(struct drv_hw_context *hw_context, offset = EDID_BLOCK_SIZE * (hw_context->edid_fifo_block_number & 0x01); offset += start; - MHL_TX_DBG_INFO("%p %p\n", hw_context, edid_buf); + MHL_TX_DBG_INFO("%pK %pK\n", hw_context, edid_buf); if (EDID_BLOCK_SIZE == (offset + length)) hw_context->edid_fifo_block_number++; @@ -2401,7 +2401,7 @@ int si_mhl_tx_drv_get_edid_fifo_next_block(struct drv_hw_context *hw_context, offset = EDID_BLOCK_SIZE * (hw_context->edid_fifo_block_number & 0x01); - MHL_TX_DBG_INFO("%p %p\n", hw_context, edid_buf); + MHL_TX_DBG_INFO("%pK %pK\n", hw_context, edid_buf); hw_context->edid_fifo_block_number++; #ifdef MANUAL_EDID_FETCH diff --git a/drivers/video/msm/mdss/mhl3/si_emsc_hid.c b/drivers/video/msm/mdss/mhl3/si_emsc_hid.c index 17d33c99ef549..51e2eda2827e7 100644 --- a/drivers/video/msm/mdss/mhl3/si_emsc_hid.c +++ b/drivers/video/msm/mdss/mhl3/si_emsc_hid.c @@ -461,7 +461,7 @@ static int mhl3_send_ack(struct mhl3_hid_data *mhid, uint8_t reason) return -ENODEV; MHL3_HID_DBG_WARN("%s - HID_ACK reason code: %02X\n", __func__, reason); - MHL3_HID_DBG_ERR("mhid->mdev: %p\n", mhid->mdev); + MHL3_HID_DBG_ERR("mhid->mdev: %pK\n", mhid->mdev); mhid->out_data[0] = MHL3_HID_ACK; mhid->out_data[1] = reason; @@ -1089,7 +1089,7 @@ static void mhid_add_work(struct work_struct *workdata) mhl3_send_ack(mhid, HID_ACK_NODEV); mhid->flags |= HID_FLAGS_WQ_CANCEL; - MHL3_HID_DBG_ERR("WORK QUEUE function FAIL - mhid: %p\n", mhid); + MHL3_HID_DBG_ERR("WORK QUEUE function FAIL - mhid: %pK\n", mhid); mhl3_disconnect_and_destroy_hid_device(mhid); /* diff --git a/drivers/video/msm/mdss/mhl3/si_mdt_inputdev.c b/drivers/video/msm/mdss/mhl3/si_mdt_inputdev.c index 13d2a08831afb..926ab6c53e74a 100644 --- a/drivers/video/msm/mdss/mhl3/si_mdt_inputdev.c +++ b/drivers/video/msm/mdss/mhl3/si_mdt_inputdev.c @@ -80,10 +80,11 @@ static void destroy_mouse(struct mhl_dev_context *dev_context) if (dev_context->mdt_devs.dev_mouse == NULL) return; - MHL_TX_DBG_INFO("Unregistering mouse: %p\n", + MHL_TX_DBG_INFO("Unregistering mouse: %pK\n", dev_context->mdt_devs.dev_mouse); input_unregister_device(dev_context->mdt_devs.dev_mouse); - MHL_TX_DBG_INFO("Freeing mouse: %p\n", dev_context->mdt_devs.dev_mouse); + MHL_TX_DBG_INFO("Freeing mouse: %pK\n", + dev_context->mdt_devs.dev_mouse); input_free_device(dev_context->mdt_devs.dev_mouse); dev_context->mdt_devs.dev_mouse = NULL; } @@ -93,10 +94,10 @@ static void destroy_keyboard(struct mhl_dev_context *dev_context) if (dev_context->mdt_devs.dev_keyboard == NULL) return; - MHL_TX_DBG_INFO("Unregistering keyboard: %p\n", + MHL_TX_DBG_INFO("Unregistering keyboard: %pK\n", dev_context->mdt_devs.dev_keyboard); input_unregister_device(dev_context->mdt_devs.dev_keyboard); - MHL_TX_DBG_INFO("Freeing keyboard: %p\n", + MHL_TX_DBG_INFO("Freeing keyboard: %pK\n", dev_context->mdt_devs.dev_keyboard); input_free_device(dev_context->mdt_devs.dev_keyboard); dev_context->mdt_devs.dev_keyboard = NULL; @@ -107,10 +108,10 @@ static void destroy_touchscreen(struct mhl_dev_context *dev_context) if (dev_context->mdt_devs.dev_touchscreen == NULL) return; - MHL_TX_DBG_INFO("Unregistering mouse: %p\n", + MHL_TX_DBG_INFO("Unregistering mouse: %pK\n", dev_context->mdt_devs.dev_touchscreen); input_unregister_device(dev_context->mdt_devs.dev_touchscreen); - MHL_TX_DBG_INFO("Freeing mouse: %p\n", + MHL_TX_DBG_INFO("Freeing mouse: %pK\n", dev_context->mdt_devs.dev_touchscreen); input_free_device(dev_context->mdt_devs.dev_touchscreen); dev_context->mdt_devs.dev_touchscreen = NULL; @@ -130,7 +131,7 @@ int init_mdt_keyboard(struct mhl_dev_context *dev_context) MHL_TX_DBG_ERR("Not enough memory\n"); return -ENOMEM; } - MHL_TX_DBG_INFO("Allocated keyboard: %p\n", dev_keyboard); + MHL_TX_DBG_INFO("Allocated keyboard: %pK\n", dev_keyboard); set_bit(EV_KEY, dev_keyboard->evbit); set_bit(EV_REP, dev_keyboard->evbit); @@ -158,7 +159,7 @@ int init_mdt_keyboard(struct mhl_dev_context *dev_context) return error; } - MHL_TX_DBG_INFO("Registered keyboard: %p\n", dev_keyboard); + MHL_TX_DBG_INFO("Registered keyboard: %pK\n", dev_keyboard); dev_context->mdt_devs.dev_keyboard = dev_keyboard; @@ -175,7 +176,7 @@ int init_mdt_mouse(struct mhl_dev_context *dev_context) MHL_TX_DBG_ERR("Not enough memory\n"); return -ENOMEM; } - MHL_TX_DBG_INFO("Allocated mouse: %p\n", dev_mouse); + MHL_TX_DBG_INFO("Allocated mouse: %pK\n", dev_mouse); set_bit(EV_REL, dev_mouse->evbit); set_bit(EV_KEY, dev_mouse->evbit); @@ -208,7 +209,7 @@ int init_mdt_mouse(struct mhl_dev_context *dev_context) return error; } - MHL_TX_DBG_INFO("Registered mouse: %p\n", dev_mouse); + MHL_TX_DBG_INFO("Registered mouse: %pK\n", dev_mouse); dev_context->mdt_devs.dev_mouse = dev_mouse; @@ -226,7 +227,7 @@ int init_mdt_touchscreen(struct mhl_dev_context *dev_context) return -ENOMEM; } - MHL_TX_DBG_INFO("Allocated touch screen: %p\n", dev_touchscreen); + MHL_TX_DBG_INFO("Allocated touch screen: %pK\n", dev_touchscreen); #if !defined(SINGLE_TOUCH) && defined(KERNEL_2_6_38_AND_LATER) input_mt_init_slots(dev_touchscreen, MAX_TOUCH_CONTACTS); @@ -301,7 +302,7 @@ int init_mdt_touchscreen(struct mhl_dev_context *dev_context) input_free_device(dev_touchscreen); return error; } - MHL_TX_DBG_INFO("Registered touchscreen: %p\n", dev_touchscreen); + MHL_TX_DBG_INFO("Registered touchscreen: %pK\n", dev_touchscreen); dev_context->mdt_devs.dev_touchscreen = dev_touchscreen; diff --git a/drivers/video/msm/mdss/mhl3/si_mhl2_edid_3d.c b/drivers/video/msm/mdss/mhl3/si_mhl2_edid_3d.c index fd6918fbf1ff8..f9ece54e5c432 100644 --- a/drivers/video/msm/mdss/mhl3/si_mhl2_edid_3d.c +++ b/drivers/video/msm/mdss/mhl3/si_mhl2_edid_3d.c @@ -1118,7 +1118,7 @@ static void tx_prune_dtd_list(struct edid_3d_data_t *mhl_edid_3d_data, if ((0 != p_desc->dtd.pixel_clock_low) || (0 != p_desc->dtd.pixel_clock_high)) { MHL_TX_EDID_INFO( - "pix clock non-zero p_desc:%p", p_desc) + "pix clock non-zero p_desc:%pK", p_desc) if ((0 == p_desc->dtd.horz_active_7_0) && (0 == p_desc->dtd.horz_active_blanking_high. horz_active_11_8)) { @@ -1133,7 +1133,7 @@ static void tx_prune_dtd_list(struct edid_3d_data_t *mhl_edid_3d_data, * one by one */ MHL_TX_EDID_INFO( - "p_desc:%p p_next_desc:%p\n", + "p_desc:%pK p_next_desc:%pK\n", p_desc, p_next_desc) *p_desc++ = *p_next_desc++; } @@ -1144,7 +1144,7 @@ static void tx_prune_dtd_list(struct edid_3d_data_t *mhl_edid_3d_data, p_desc = p_holder; } else { p_desc++; - MHL_TX_EDID_INFO("p_desc:%p\n", p_desc) + MHL_TX_EDID_INFO("p_desc:%pK\n", p_desc) } } } @@ -1446,7 +1446,7 @@ static bool si_mhl_tx_parse_detailed_timing_descriptor( * Mark this mode for pruning by setting * horizontal active to zero */ - MHL_TX_DBG_ERR("%smark for pruning%s %p\n", + MHL_TX_DBG_ERR("%smark for pruning%s %pK\n", ANSI_ESC_YELLOW_TEXT, ANSI_ESC_RESET_TEXT, p_desc); @@ -1500,7 +1500,7 @@ static uint8_t si_mhl_tx_parse_861_long_descriptors( ++mhl_edid_3d_data->parse_data. num_cea_861_timing_dtds; } else if (valid) { - MHL_TX_EDID_INFO("stopping at %p\n", + MHL_TX_EDID_INFO("stopping at %pK\n", p_data_u.p_long_descriptors) break; } @@ -1600,7 +1600,7 @@ static void prune_hdmi_vsdb_vic_list( HDMI_VIC_len = inner_loop_limit; p_CEA_extension->byte_offset_to_18_byte_descriptors -= num_HDMI_VICs_pruned; - MHL_TX_EDID_INFO("%p\n", mhl_edid_3d_data->parse_data.p_HDMI_vsdb); + MHL_TX_EDID_INFO("%pK\n", mhl_edid_3d_data->parse_data.p_HDMI_vsdb); if (mhl_edid_3d_data->parse_data.p_HDMI_vsdb) { mhl_edid_3d_data->parse_data.p_HDMI_vsdb-> header.fields.length_following_header -= @@ -1722,8 +1722,7 @@ static void prune_svd_list( ("\n\nInvalid extension size\n\n")); while (pb_src < pb_limit) { MHL_TX_EDID_INFO( - "moving data up %p(0x%02X) " - "<- %p(0x%02X)\n", + "moving data up %pK(0x%02X)<- %pK(0x%02X)\n", pb_dest, (uint16_t)*pb_dest, pb_src, (uint16_t)*pb_src); *pb_dest++ = *pb_src++; @@ -3123,7 +3122,7 @@ void si_mhl_tx_process_hev_vic_burst(struct edid_3d_data_t *mhl_edid_3d_data, ANSI_ESC_RED_TEXT, ANSI_ESC_RESET_TEXT); return; } else { - MHL_TX_DBG_WARN(" %d %p\n", hev_index, + MHL_TX_DBG_WARN(" %d %pK\n", hev_index, mhl_edid_3d_data->hev_vic_list) mhl_edid_3d_data->hev_vic_info. num_items_allocated = @@ -3136,7 +3135,7 @@ void si_mhl_tx_process_hev_vic_burst(struct edid_3d_data_t *mhl_edid_3d_data, MHL_TX_DBG_ERR("bogus write burst, no hev_vic_list\n") return; } - MHL_TX_DBG_WARN(" %d %p\n", hev_index, mhl_edid_3d_data->hev_vic_list) + MHL_TX_DBG_WARN(" %d %pK\n", hev_index, mhl_edid_3d_data->hev_vic_list) if (NULL == mhl_edid_3d_data->hev_vic_list) { MHL_TX_DBG_ERR("%s no place to put HEV_VIC burst%s\n", ANSI_ESC_RED_TEXT, ANSI_ESC_RESET_TEXT); @@ -3155,7 +3154,7 @@ void si_mhl_tx_process_hev_vic_burst(struct edid_3d_data_t *mhl_edid_3d_data, burst_id_HEV_VIC, (union video_burst_descriptor_u *) &p_burst-> video_descriptors[i])) { - MHL_TX_DBG_INFO(" %d %p\n", + MHL_TX_DBG_INFO(" %d %pK\n", hev_index, mhl_edid_3d_data->hev_vic_list) mhl_edid_3d_data->hev_vic_list[hev_index]. mhl3_hev_vic_descriptor = @@ -4036,7 +4035,8 @@ static uint8_t parse_861_block(struct edid_3d_data_t *mhl_edid_3d_data, mhl_edid_3d_data->parse_data.p_HDMI_vsdb = NULL; - MHL_TX_EDID_INFO("tag:place holder EDID block:%p\n", p_EDID_block_data); + MHL_TX_EDID_INFO("tag:place holder EDID block:%pK\n", + p_EDID_block_data); if (EDID_EXTENSION_BLOCK_MAP == p_CEA_extension->tag) { struct block_map_t *p_block_map; int i; @@ -4123,7 +4123,7 @@ void si_mhl_tx_handle_atomic_hw_edid_read_complete( mhl_edid_3d_data->parse_data.num_EDID_extensions; ++counter) { MHL_TX_EDID_INFO - (" counter:%d tag:place holder EDID block:%p\n", + (" counter:%d tag:place holder EDID block:%pK\n", counter, &mhl_edid_3d_data-> EDID_block_data[EDID_BLOCK_SIZE * counter]); From aa42766780be6a7dd78053abea8566aa5f849ad1 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Tue, 6 Sep 2016 19:00:53 +0530 Subject: [PATCH 0134/1015] ARM: dts: msm: Update DDR bandwidth voting for MSM8953 GPU Allow DDR min level bandwidth voting window to go only one step down. This will help bus DCVS to settle down at proper bus level to save power. CRs-Fixed: 1047948 Change-Id: Id387325fc2bf03e4a36402aa0eeeace7e07e5dd5 Signed-off-by: Hareesh Gundu --- arch/arm/boot/dts/qcom/msm8953-gpu.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm8953-gpu.dtsi b/arch/arm/boot/dts/qcom/msm8953-gpu.dtsi index 670abab448ddc..52830c459e08b 100644 --- a/arch/arm/boot/dts/qcom/msm8953-gpu.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-gpu.dtsi @@ -178,7 +178,7 @@ reg = <3>; qcom,gpu-freq = <400000000>; qcom,bus-freq = <7>; - qcom,bus-min = <4>; + qcom,bus-min = <5>; qcom,bus-max = <8>; }; From 92ca0baed7201224adc63a66fef5d63147da5cee Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Tue, 30 Aug 2016 10:35:49 +0800 Subject: [PATCH 0135/1015] ASoC: utils: initialize dummy_codec before use dummy_codec is not initialized before use, which could cause kernel panic. Initialize dummy_codec before use. Change-Id: Iedf7a3accbd14138ab7ed9e4e36a98fd7ca9a839 Signed-off-by: Meng Wang --- sound/soc/soc-utils.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/soc/soc-utils.c b/sound/soc/soc-utils.c index 7f22ca35a4131..9afc766065ab2 100644 --- a/sound/soc/soc-utils.c +++ b/sound/soc/soc-utils.c @@ -130,6 +130,9 @@ static int snd_soc_dummy_probe(struct platform_device *pdev) { int ret; + memset(&dummy_codec, 0, + sizeof(struct snd_soc_codec_driver)); + ret = snd_soc_register_codec(&pdev->dev, &dummy_codec, &dummy_dai, 1); if (ret < 0) return ret; From b6622acdfd05b95d314ad8ddc574fff7352bc092 Mon Sep 17 00:00:00 2001 From: Kiran Gunda Date: Tue, 30 Aug 2016 13:02:32 +0530 Subject: [PATCH 0136/1015] msm: msm_bus: fix memory allocation issues Memory for some of the fields in the rule structure is not allocated during the rule registration time. This patch addresses these memeory allocation issues and frees the same during the un-registration. Change-Id: I62e437d6c2cfa57d9f4b4afa86b99ecf383b36aa Signed-off-by: Kiran Gunda --- drivers/platform/msm/msm_bus/msm_bus_rules.c | 93 ++++++++++++++++---- include/linux/msm_bus_rules.h | 12 +-- 2 files changed, 83 insertions(+), 22 deletions(-) diff --git a/drivers/platform/msm/msm_bus/msm_bus_rules.c b/drivers/platform/msm/msm_bus/msm_bus_rules.c index 60b2b8b78bbe5..53886dcdd4ded 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_rules.c +++ b/drivers/platform/msm/msm_bus/msm_bus_rules.c @@ -501,17 +501,58 @@ static int copy_rule(struct bus_rule_type *src, struct rules_def *node_rule, __func__); return -ENOMEM; } - memcpy(node_rule->rule_ops.src_id, src->src_id, - sizeof(int) * src->num_src); + node_rule->rule_ops.thresh = kzalloc( + (sizeof(u64) * node_rule->rule_ops.num_thresh), + GFP_KERNEL); + if (!node_rule->rule_ops.thresh) { + pr_err("%s:Failed to allocate for thresh", + __func__); + kfree(node_rule->rule_ops.src_id); + return -ENOMEM; + } + node_rule->rule_ops.src_field = kzalloc( + (sizeof(int) * node_rule->rule_ops.num_thresh), + GFP_KERNEL); + if (!node_rule->rule_ops.src_field) { + pr_err("%s:Failed to allocate for src_field", + __func__); + kfree(node_rule->rule_ops.src_id); + kfree(node_rule->rule_ops.thresh); + return -ENOMEM; + } + node_rule->rule_ops.op = kzalloc( + (sizeof(int) * node_rule->rule_ops.num_thresh), + GFP_KERNEL); + + if (!node_rule->rule_ops.op) { + pr_err("%s:Failed to allocate for OP", + __func__); + kfree(node_rule->rule_ops.src_id); + kfree(node_rule->rule_ops.thresh); + kfree(node_rule->rule_ops.src_field); + return -ENOMEM; + } + memcpy(node_rule->rule_ops.thresh, src->thresh, + sizeof(u64) * src->num_thresh); + memcpy(node_rule->rule_ops.src_field, src->src_field, + sizeof(int) * src->num_thresh); + memcpy(node_rule->rule_ops.op, src->op, + sizeof(int) * src->num_thresh); + memcpy(node_rule->rule_ops.src_id, src->src_id, + sizeof(int) * src->num_src); if (!nb) { node_rule->rule_ops.dst_node = kzalloc( (sizeof(int) * node_rule->rule_ops.num_dst), GFP_KERNEL); if (!node_rule->rule_ops.dst_node) { - pr_err("%s:Failed to allocate for src_id", + pr_err("%s:Failed to allocate for dst_node", __func__); + kfree(node_rule->rule_ops.src_id); + kfree(node_rule->rule_ops.thresh); + kfree(node_rule->rule_ops.src_field); + kfree(node_rule->rule_ops.op); return -ENOMEM; } memcpy(node_rule->rule_ops.dst_node, src->dst_node, @@ -523,8 +564,14 @@ static int copy_rule(struct bus_rule_type *src, struct rules_def *node_rule, (sizeof(struct node_vote_info) * node_rule->rule_ops.num_src), GFP_KERNEL); if (!node_rule->src_info) { - pr_err("%s:Failed to allocate for src_id", + pr_err("%s:Failed to allocate for src_info", __func__); + kfree(node_rule->rule_ops.src_id); + kfree(node_rule->rule_ops.thresh); + kfree(node_rule->rule_ops.src_field); + kfree(node_rule->rule_ops.op); + if (!nb) + kfree(node_rule->rule_ops.dst_node); return -ENOMEM; } for (i = 0; i < src->num_src; i++) @@ -587,7 +634,8 @@ static bool __rule_register(int num_rules, struct bus_rule_type *rule, list_add_tail(&node_rule->link, &node->node_rules); } } - list_sort(NULL, &node->node_rules, node_rules_compare); + if (!nb) + list_sort(NULL, &node->node_rules, node_rules_compare); if (nb && nb != node->rule_notify_list.head) raw_notifier_chain_register(&node->rule_notify_list, nb); exit_rule_register: @@ -628,6 +676,20 @@ void msm_rule_register(int num_rules, struct bus_rule_type *rule, mutex_unlock(&msm_bus_rules_lock); } +static void free_rule_params(struct rules_def *node_rule) +{ + struct bus_rule_type *rule = &node_rule->rule_ops; + + kfree(rule->src_id); + kfree(rule->src_field); + kfree(rule->op); + kfree(rule->thresh); + kfree(rule->dst_node); + kfree(node_rule->src_info); + + list_del(&node_rule->link); +} + static bool __rule_unregister(int num_rules, struct bus_rule_type *rule, struct notifier_block *nb) { @@ -647,19 +709,18 @@ static bool __rule_unregister(int num_rules, struct bus_rule_type *rule, pr_err("%s: Can't find node", __func__); goto exit_unregister_rule; } - match_found = true; - list_for_each_entry_safe(node_rule, node_rule_tmp, + + for (i = 0; i < num_rules; i++) { + list_for_each_entry_safe(node_rule, node_rule_tmp, &node->node_rules, link) { - if (comp_rules(&node_rule->rule_ops, + if (comp_rules(&node_rule->rule_ops, &rule[i]) == 0) { - list_del(&node_rule->link); - kfree(node_rule); - match_found = true; - node->num_rules--; - list_sort(NULL, - &node->node_rules, - node_rules_compare); - break; + free_rule_params(node_rule); + kfree(node_rule); + match_found = true; + node->num_rules--; + break; + } } } if (!node->num_rules) diff --git a/include/linux/msm_bus_rules.h b/include/linux/msm_bus_rules.h index 5397afef06a11..dda8610bc58bd 100644 --- a/include/linux/msm_bus_rules.h +++ b/include/linux/msm_bus_rules.h @@ -39,18 +39,18 @@ struct rule_apply_rcm_info { struct bus_rule_type { int num_src; - int *src_id; - int *src_field; - int *op; int combo_op; int num_thresh; - u64 *thresh; int num_dst; - int *dst_node; u64 dst_bw; int mode; - void *client_data; u64 curr_bw; + void *client_data; + int *src_id; + int *src_field; + int *op; + u64 *thresh; + int *dst_node; }; #if (defined(CONFIG_BUS_TOPOLOGY_ADHOC)) From ac361f99d79cfdaba2f59d1fb7f3680df568aa05 Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Wed, 7 Sep 2016 15:21:09 +0530 Subject: [PATCH 0137/1015] ARM: dts: msm: Enable memory allocation for diag client for 8940 The new diag client requires additional memory from hlos. This patch caters to diag memory requirement. CRs-Fixed: 1063902 Change-Id: Ide08c477a4b0c382b015aa538b3975f4ed30ce81 Signed-off-by: Manoj Prabhu B --- arch/arm/boot/dts/qcom/msm8937.dtsi | 2 +- arch/arm/boot/dts/qcom/msm8940-mtp.dtsi | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm8937.dtsi b/arch/arm/boot/dts/qcom/msm8937.dtsi index b4d902228a67e..2fa44b391907a 100644 --- a/arch/arm/boot/dts/qcom/msm8937.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937.dtsi @@ -1805,7 +1805,7 @@ label = "modem"; }; - qcom,client_3 { + mem_client_3_size: qcom,client_3 { compatible = "qcom,memshare-peripheral"; qcom,peripheral-size = <0x0>; qcom,client-id = <1>; diff --git a/arch/arm/boot/dts/qcom/msm8940-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8940-mtp.dtsi index 62e89c895b68c..dff5233ec8c93 100644 --- a/arch/arm/boot/dts/qcom/msm8940-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940-mtp.dtsi @@ -14,5 +14,9 @@ #include "msm8937-mtp.dtsi" #include "msm8940-pinctrl.dtsi" +&mem_client_3_size { + qcom,peripheral-size = <0x500000>; +}; + &soc { }; From fa4d8bad0c30e2a2e9eab9b3ade06911a691c72d Mon Sep 17 00:00:00 2001 From: Karthik Reddy Katta Date: Wed, 7 Sep 2016 18:02:23 +0530 Subject: [PATCH 0138/1015] ASoC: msm: Add Buffer overflow check The overflow check is required to ensure that user space data in kernel may not go beyond buffer boundary. CRs-Fixed: 1064411 Change-Id: I54c28a8942cf1a6a47a4e8272f3159b35d753ead Signed-off-by: Karthik Reddy Katta --- drivers/misc/qcom/qdsp6v2/audio_utils.c | 13 +++++++++++++ include/sound/q6asm-v2.h | 2 +- sound/soc/msm/qdsp6v2/q6asm.c | 4 ++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils.c b/drivers/misc/qcom/qdsp6v2/audio_utils.c index 3a7aa5aebab4b..15d82d126df7d 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils.c @@ -24,6 +24,15 @@ #include #include "audio_utils.h" +/* + * Define maximum buffer size. Below values are chosen considering the higher + * values used among all native drivers. + */ +#define MAX_FRAME_SIZE 1536 +#define MAX_FRAMES 5 +#define META_SIZE (sizeof(struct meta_out_dsp)) +#define MAX_BUFFER_SIZE (1 + ((MAX_FRAME_SIZE + META_SIZE) * MAX_FRAMES)) + static int audio_in_pause(struct q6audio_in *audio) { int rc; @@ -329,6 +338,10 @@ long audio_in_ioctl(struct file *file, rc = -EINVAL; break; } + if (cfg.buffer_size > MAX_BUFFER_SIZE) { + rc = -EINVAL; + break; + } audio->str_cfg.buffer_size = cfg.buffer_size; audio->str_cfg.buffer_count = cfg.buffer_count; if (audio->opened) { diff --git a/include/sound/q6asm-v2.h b/include/sound/q6asm-v2.h index 679894f64f722..705acf810a104 100644 --- a/include/sound/q6asm-v2.h +++ b/include/sound/q6asm-v2.h @@ -227,7 +227,7 @@ struct audio_client *q6asm_get_audio_client(int session_id); int q6asm_audio_client_buf_alloc(unsigned int dir/* 1:Out,0:In */, struct audio_client *ac, unsigned int bufsz, - unsigned int bufcnt); + uint32_t bufcnt); int q6asm_audio_client_buf_alloc_contiguous(unsigned int dir /* 1:Out,0:In */, struct audio_client *ac, diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index 9efdc184ed789..f45630425308d 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -1172,7 +1172,7 @@ struct audio_client *q6asm_get_audio_client(int session_id) int q6asm_audio_client_buf_alloc(unsigned int dir, struct audio_client *ac, unsigned int bufsz, - unsigned int bufcnt) + uint32_t bufcnt) { int cnt = 0; int rc = 0; @@ -1199,7 +1199,7 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, return 0; } mutex_lock(&ac->cmd_lock); - if (bufcnt > (LONG_MAX/sizeof(struct audio_buffer))) { + if (bufcnt > (U32_MAX/sizeof(struct audio_buffer))) { pr_err("%s: Buffer size overflows", __func__); mutex_unlock(&ac->cmd_lock); goto fail; From ac2ad70b2c73b37a11736259b6fc25be97d12731 Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Wed, 7 Sep 2016 12:25:59 +0530 Subject: [PATCH 0139/1015] msm: mdss: clear BTA_DONE interrupt during DSI read operations In cases where DSI DMA done operation is performed but isr is not triggered due to CPU delays, we clear only the DMA_DONE interrupt. There is a possibility of a DSI read operation for DSI command mode panels where the DMA_DONE interrupt is cleared and DSI link clocks are turned off. After some time, the DSI isr gets triggered for BTA_DONE interrupt and since DSI link clocks are off, this causes an interrupt storm due to BTA_DONE interrupt not getting cleared. Clear the BTA_DONE interrupt as well for cases where DMA_DONE operation is done but isr not getting triggered. Change-Id: Iceb02e6dd78f4bbf313e2b4d252d6a30699619f0 Signed-off-by: Padmanabhan Komanduru --- drivers/video/msm/mdss/mdss_dsi_host.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index 27ea8fa502633..cfe1767c9e555 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -2061,8 +2061,8 @@ static int mdss_dsi_cmd_dma_tx(struct mdss_dsi_ctrl_pdata *ctrl, status = reg_val & DSI_INTR_CMD_DMA_DONE; if (status) { reg_val &= DSI_INTR_MASK_ALL; - /* clear CMD DMA isr only */ - reg_val |= DSI_INTR_CMD_DMA_DONE; + /* clear CMD DMA and BTA_DONE isr only */ + reg_val |= (DSI_INTR_CMD_DMA_DONE | DSI_INTR_BTA_DONE); MIPI_OUTP(ctrl->ctrl_base + 0x0110, reg_val); mdss_dsi_disable_irq_nosync(ctrl, DSI_CMD_TERM); complete(&ctrl->dma_comp); From 1de95942654430a2dd7360d3af1c548b55d56373 Mon Sep 17 00:00:00 2001 From: Yeleswarapu Nagaradhesh Date: Thu, 15 Sep 2016 17:27:21 +0530 Subject: [PATCH 0140/1015] ASoC: wcd-mbhc: correct cross connection check Schmitt trigger result is wrong if PA is enabled. So, don't check for cross connection when PA is enabled. CRs-Fixed: 1061507 Change-Id: Iad71abbed72aa40b5c839260f5c297a885f7d128 Signed-off-by: Yeleswarapu Nagaradhesh --- sound/soc/codecs/wcd-mbhc-v2.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sound/soc/codecs/wcd-mbhc-v2.c b/sound/soc/codecs/wcd-mbhc-v2.c index 19ac004cd3dc8..0faafde1b478b 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.c +++ b/sound/soc/codecs/wcd-mbhc-v2.c @@ -886,6 +886,11 @@ static int wcd_check_cross_conn(struct wcd_mbhc *mbhc) return -EINVAL; } + /* If PA is enabled, dont check for cross-connection */ + if (mbhc->mbhc_cb->hph_pa_on_status) + if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) + return false; + WCD_MBHC_REG_READ(WCD_MBHC_ELECT_SCHMT_ISRC, reg1); /* * Check if there is any cross connection, From ee50c94727a7fd3b75d503c25118b97907e29972 Mon Sep 17 00:00:00 2001 From: Tanvi Aggarwal Date: Mon, 12 Sep 2016 17:41:23 +0530 Subject: [PATCH 0141/1015] msm: camera: Fix KW issues in sensor code Fixing issue where we are dereferencing a NULL pointer. There is an issue where, if we have a failure in memory allocation for a mutex, we are not updating rc but freeing the allocated memory for i2c client. Hence this may lead to NULL pointer dereference for i2c client at next stage. Hence we are updating correct rc before freeing the i2c client memory and returning back to parent function. CRs-Fixed: 1066972 Change-Id: I7f9493344da2baddb88fd0db14b894fc242d9f9f Signed-off-by: Tanvi Aggarwal --- drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c index a21f3956c518b..80380fe8c399c 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c @@ -1107,6 +1107,7 @@ static int32_t msm_sensor_driver_parse(struct msm_sensor_ctrl_t *s_ctrl) if (!s_ctrl->msm_sensor_mutex) { pr_err("failed: no memory msm_sensor_mutex %pK", s_ctrl->msm_sensor_mutex); + rc = -ENOMEM; goto FREE_SENSOR_I2C_CLIENT; } From d016d655f54df0736fa8343e7d3dfb90d03cb9cc Mon Sep 17 00:00:00 2001 From: Nikhilesh Reddy Date: Tue, 6 Sep 2016 16:03:07 -0700 Subject: [PATCH 0142/1015] fuse: Grab the fc->lock for inode updates in shortcircuit The function fsstack_copy_inode_size uses the inode->i_lock to serialize the inode updates. This lock is not used in the FUSE filesystem and thus it is not enough to just grab this lock before updating a FUSE inode. Grab the fc->lock for inode updates in shortcircuit to ensure that there are no races between inode size updates in 32 bit architectures with SMP. Change-Id: I83cb2380b6ca56768c06e70ef1bf9ea3976b514a Signed-off-by: Nikhilesh Reddy --- fs/fuse/shortcircuit.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/fuse/shortcircuit.c b/fs/fuse/shortcircuit.c index 499e496005b5c..c657b170fb7e5 100644 --- a/fs/fuse/shortcircuit.c +++ b/fs/fuse/shortcircuit.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -58,10 +58,12 @@ static ssize_t fuse_shortcircuit_read_write_iter(struct kiocb *iocb, struct fuse_file *ff; struct file *fuse_file, *lower_file; struct inode *fuse_inode, *lower_inode; + struct fuse_conn *fc; ff = iocb->ki_filp->private_data; fuse_file = iocb->ki_filp; lower_file = ff->rw_lower_file; + fc = ff->fc; /* lock lower file to prevent it from being released */ get_file(lower_file); @@ -75,7 +77,9 @@ static ssize_t fuse_shortcircuit_read_write_iter(struct kiocb *iocb, ret_val = lower_file->f_op->write_iter(iocb, iter); if (ret_val >= 0 || ret_val == -EIOCBQUEUED) { + spin_lock(&fc->lock); fsstack_copy_inode_size(fuse_inode, lower_inode); + spin_unlock(&fc->lock); fsstack_copy_attr_times(fuse_inode, lower_inode); } } else { From 6bcdceaa2e3dedae0d8ed8ad248282605211688e Mon Sep 17 00:00:00 2001 From: Komal Seelam Date: Fri, 16 Sep 2016 14:37:10 +0530 Subject: [PATCH 0143/1015] cnss: Enable SECURE FIRMWARE Download Feature MAX_FIRMWARE_SIZE variable is shared between functional driver and platform driver. So, expose the variable as part of common header file. CRs-Fixed: 1067738 Change-Id: I7fb07528a0d5813364fca53ebb4ab98918ebcc57 Signed-off-by: Komal Seelam --- drivers/net/wireless/cnss/cnss_common.h | 1 - include/net/cnss.h | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/cnss/cnss_common.h b/drivers/net/wireless/cnss/cnss_common.h index 07ef9844b6db1..eb6796fc493f5 100644 --- a/drivers/net/wireless/cnss/cnss_common.h +++ b/drivers/net/wireless/cnss/cnss_common.h @@ -13,7 +13,6 @@ #ifndef _NET_CNSS_COMMON_H_ #define _NET_CNSS_COMMON_H_ -#define MAX_FIRMWARE_SIZE (1 * 1024 * 1024) /* max 20mhz channel count */ #define CNSS_MAX_CH_NUM 45 diff --git a/include/net/cnss.h b/include/net/cnss.h index 7d0e7be951c1f..bda4e57873d73 100644 --- a/include/net/cnss.h +++ b/include/net/cnss.h @@ -18,6 +18,7 @@ #include #ifdef CONFIG_CNSS +#define MAX_FIRMWARE_SIZE (1 * 1024 * 1024) #define CNSS_MAX_FILE_NAME 20 #define PINCTRL_SLEEP 0 #define PINCTRL_ACTIVE 1 From 9aa7b151d6032c890a2a18c48b190eff49546c2b Mon Sep 17 00:00:00 2001 From: "Raju P.L.S.S.S.N" Date: Mon, 19 Sep 2016 20:37:48 +0530 Subject: [PATCH 0144/1015] ARM: dts: msm: Add irqs to the mpm bypass list for msm8920 Add IRQs 260, 261, 262, 263 to mpm bypass list as these IRQs can block APSS XO shutdown. Change-Id: I829e37aa7447a522086a5ea36c1e713f4fe3282b Signed-off-by: Raju P.L.S.S.S.N --- arch/arm/boot/dts/qcom/msm8917-pm.dtsi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8917-pm.dtsi b/arch/arm/boot/dts/qcom/msm8917-pm.dtsi index 20b5af542202d..367bdee125249 100644 --- a/arch/arm/boot/dts/qcom/msm8917-pm.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-pm.dtsi @@ -235,6 +235,10 @@ <0xff 239>, /* crypto_bam_irq[1]*/ <0xff 240>, /* summary_irq_kpss */ <0xff 253>, /* sdcc_pwr_cmd_irq */ + <0xff 260>, /* ipa_irq[0] */ + <0xff 261>, /* ipa_irq[2] */ + <0xff 262>, /* ipa_bam_irq[0] */ + <0xff 263>, /* ipa_bam_irq[2] */ <0xff 269>, /* rpm_wdog_expired_irq */ <0xff 270>, /* blsp1_bam_irq[0] */ <0xff 272>, /* smmu_intr_bus[17] */ From b6443b0e4f1675c8bb06f283150ecad39314e293 Mon Sep 17 00:00:00 2001 From: Alok Kediya Date: Fri, 29 Jul 2016 20:07:47 +0530 Subject: [PATCH 0145/1015] msm:isp: add recovery method in case of pingpong mismatch. restart the VFE in case of pingpong mismatch. Change-Id: I38482aeb8d03c81a1ebe91ba895916fc5064e8aa Signed-off-by: Alok Kediya --- .../platform/msm/camera_v2/isp/msm_isp.h | 5 +++++ .../platform/msm/camera_v2/isp/msm_isp40.c | 4 ++-- .../platform/msm/camera_v2/isp/msm_isp44.c | 4 ++-- .../platform/msm/camera_v2/isp/msm_isp46.c | 4 ++-- .../platform/msm/camera_v2/isp/msm_isp47.c | 4 ++-- .../msm/camera_v2/isp/msm_isp_axi_util.c | 20 +++++++++++++++-- .../msm/camera_v2/isp/msm_isp_stats_util.c | 2 +- .../platform/msm/camera_v2/isp/msm_isp_util.c | 22 +++++++++++++++---- .../platform/msm/camera_v2/isp/msm_isp_util.h | 4 ++++ 9 files changed, 54 insertions(+), 15 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h index 6b82ee95dda65..1beb2c2943c92 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h @@ -64,6 +64,7 @@ #define MAX_BUFFERS_IN_HW 2 #define MAX_VFE 2 +#define MAX_RECOVERY_THRESHOLD 5 struct vfe_device; struct msm_vfe_axi_stream; @@ -514,6 +515,7 @@ struct msm_vfe_axi_shared_data { uint32_t event_mask; uint8_t enable_frameid_recovery; enum msm_vfe_camif_state camif_state; + uint32_t recovery_count; }; struct msm_vfe_stats_hardware_info { @@ -769,6 +771,9 @@ struct vfe_device { /* irq info */ uint32_t irq0_mask; uint32_t irq1_mask; + /* before halt irq info */ + uint32_t recovery_irq0_mask; + uint32_t recovery_irq1_mask; }; struct vfe_parent_device { diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index 18982f5230d64..1edaf323bc334 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -1841,8 +1841,8 @@ static int msm_vfe40_axi_restart(struct vfe_device *vfe_dev, /* Start AXI */ msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x2C0); - msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, - vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); + msm_vfe40_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); memset(&vfe_dev->error_info, 0, sizeof(vfe_dev->error_info)); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c index debd2f4714d3b..d42d769d892c0 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c @@ -1376,8 +1376,8 @@ static int msm_vfe44_axi_restart(struct vfe_device *vfe_dev, /* Start AXI */ msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x2C0); - msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask, - MSM_ISP_IRQ_SET); + msm_vfe44_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); memset(&vfe_dev->error_info, 0, sizeof(vfe_dev->error_info)); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c index ca75a47eddb28..d7883b6ee6298 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c @@ -1470,8 +1470,8 @@ static int msm_vfe46_axi_restart(struct vfe_device *vfe_dev, memset(&vfe_dev->error_info, 0, sizeof(vfe_dev->error_info)); atomic_set(&vfe_dev->error_info.overflow_state, NO_OVERFLOW); - msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, - vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); + msm_vfe46_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c index f08d6ededa94e..0665b28187c40 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c @@ -1847,8 +1847,8 @@ int msm_vfe47_axi_restart(struct vfe_device *vfe_dev, atomic_set(&vfe_dev->error_info.overflow_state, NO_OVERFLOW); /* reset the irq masks without camif violation and errors */ - msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, - vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); + msm_vfe47_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index a0869477bcfc8..627f9481c5be0 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -1528,6 +1528,22 @@ void msm_isp_halt_send_error(struct vfe_device *vfe_dev, uint32_t event) uint32_t i = 0; struct msm_isp_event_data error_event; struct msm_vfe_axi_halt_cmd halt_cmd; + uint32_t irq_status0, irq_status1; + + if (ISP_EVENT_PING_PONG_MISMATCH == event && + vfe_dev->axi_data.recovery_count < MAX_RECOVERY_THRESHOLD) { + vfe_dev->hw_info->vfe_ops.irq_ops. + read_irq_status(vfe_dev, &irq_status0, &irq_status1); + pr_err("%s:pingpong mismatch from vfe%d, core%d, recovery_count %d\n", + __func__, vfe_dev->pdev->id, smp_processor_id(), + vfe_dev->axi_data.recovery_count); + + vfe_dev->axi_data.recovery_count++; + + msm_isp_process_overflow_irq(vfe_dev, + &irq_status0, &irq_status1, 1); + return; + } memset(&halt_cmd, 0, sizeof(struct msm_vfe_axi_halt_cmd)); memset(&error_event, 0, sizeof(struct msm_isp_event_data)); @@ -1535,7 +1551,7 @@ void msm_isp_halt_send_error(struct vfe_device *vfe_dev, uint32_t event) halt_cmd.overflow_detected = 0; halt_cmd.blocking_halt = 0; - pr_err("%s: vfe%d fatal error!\n", __func__, vfe_dev->pdev->id); + pr_err("%s: vfe%d exiting camera!\n", __func__, vfe_dev->pdev->id); atomic_set(&vfe_dev->error_info.overflow_state, HALT_ENFORCED); @@ -3706,7 +3722,7 @@ void msm_isp_process_axi_irq_stream(struct vfe_device *vfe_dev, if (rc < 0) { spin_unlock_irqrestore(&stream_info->lock, flags); /* this usually means a serious scheduling error */ - msm_isp_halt_send_error(vfe_dev, ISP_EVENT_BUF_FATAL_ERROR); + msm_isp_halt_send_error(vfe_dev, ISP_EVENT_PING_PONG_MISMATCH); return; } /* diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c index 92ff59ca1468b..6f95d75ce58df 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c @@ -202,7 +202,7 @@ static int32_t msm_isp_stats_buf_divert(struct vfe_device *vfe_dev, if (rc < 0) { if (rc == -EFAULT) msm_isp_halt_send_error(vfe_dev, - ISP_EVENT_BUF_FATAL_ERROR); + ISP_EVENT_PING_PONG_MISMATCH); pr_err("stats_buf_divert: update put buf cnt fail\n"); return rc; } diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index 6e92463683cd6..3585ee5668103 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -1739,9 +1739,10 @@ static inline void msm_isp_update_error_info(struct vfe_device *vfe_dev, vfe_dev->error_info.error_count++; } -static void msm_isp_process_overflow_irq( +void msm_isp_process_overflow_irq( struct vfe_device *vfe_dev, - uint32_t *irq_status0, uint32_t *irq_status1) + uint32_t *irq_status0, uint32_t *irq_status1, + uint32_t force_overflow) { uint32_t overflow_mask; @@ -1764,7 +1765,8 @@ static void msm_isp_process_overflow_irq( /*Check if any overflow bit is set*/ vfe_dev->hw_info->vfe_ops.core_ops. get_overflow_mask(&overflow_mask); - overflow_mask &= *irq_status1; + if (!force_overflow) + overflow_mask &= *irq_status1; if (overflow_mask) { struct msm_isp_event_data error_event; @@ -1783,15 +1785,27 @@ static void msm_isp_process_overflow_irq( /* maks off irq for current vfe */ atomic_cmpxchg(&vfe_dev->error_info.overflow_state, NO_OVERFLOW, OVERFLOW_DETECTED); + vfe_dev->recovery_irq0_mask = vfe_dev->irq0_mask; + vfe_dev->recovery_irq1_mask = vfe_dev->irq1_mask; + vfe_dev->hw_info->vfe_ops.core_ops. set_halt_restart_mask(vfe_dev); /* mask off other vfe if dual vfe is used */ if (vfe_dev->is_split) { uint32_t other_vfe_id; + struct vfe_device *other_vfe_dev; other_vfe_id = (vfe_dev->pdev->id == ISP_VFE0) ? ISP_VFE1 : ISP_VFE0; + other_vfe_dev = vfe_dev->common_data-> + dual_vfe_res->vfe_dev[other_vfe_id]; + if (other_vfe_dev) { + other_vfe_dev->recovery_irq0_mask = + other_vfe_dev->irq0_mask; + other_vfe_dev->recovery_irq1_mask = + other_vfe_dev->irq1_mask; + } atomic_cmpxchg(&(vfe_dev->common_data->dual_vfe_res-> vfe_dev[other_vfe_id]-> @@ -1877,7 +1891,7 @@ irqreturn_t msm_isp_process_irq(int irq_num, void *data) ping_pong_status = vfe_dev->hw_info->vfe_ops.axi_ops. get_pingpong_status(vfe_dev); msm_isp_process_overflow_irq(vfe_dev, - &irq_status0, &irq_status1); + &irq_status0, &irq_status1, 0); vfe_dev->hw_info->vfe_ops.core_ops. get_error_mask(&error_mask0, &error_mask1); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h index a7b36c561f367..9d68fecafaa0a 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h @@ -74,4 +74,8 @@ void msm_isp_save_framedrop_values(struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src); void msm_isp_get_timestamp(struct msm_isp_timestamp *time_stamp, struct vfe_device *vfe_dev); +void msm_isp_process_overflow_irq( + struct vfe_device *vfe_dev, + uint32_t *irq_status0, uint32_t *irq_status1, + uint32_t force_overflow); #endif /* __MSM_ISP_UTIL_H__ */ From 25ac14af58e13cc4d6ef2915e45491bc9a019c54 Mon Sep 17 00:00:00 2001 From: Niraj Ghadiali Date: Mon, 12 Sep 2016 18:19:16 +0530 Subject: [PATCH 0146/1015] msm: isp: Initialize debug_state variable Initializing debug_state variable properly to avoid improper use of it. Change-Id: Ibe1da70f3b16681ee8138f829470be5c0ad39d59 Signed-off-by: Niraj Ghadiali --- drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c index 94e974529e568..0500face83bde 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c @@ -1318,7 +1318,7 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr, uint32_t debug_start_addr = 0; uint32_t debug_end_addr = 0; uint32_t debug_frame_id = 0; - enum msm_isp_buffer_state debug_state; + enum msm_isp_buffer_state debug_state = MSM_ISP_BUFFER_STATE_UNUSED; unsigned long flags; struct msm_isp_bufq *bufq = NULL; From 79978981e48ed0dff07bf8dcf643b57ddaa0efa8 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Mon, 19 Sep 2016 17:01:58 +0530 Subject: [PATCH 0147/1015] Revert "msm: kgsl: Add 1M and 8K pools to the allocator" This reverts commit 'eeaa9b10377afde8b41ae5c96db2dda6ed4f2833'. Remove upfront memory allocations to increase free memory after boot up. CRs-Fixed: 1064046 Change-Id: Ib94a0ee643d78a7a9171b6902103820ed90e40bb Signed-off-by: Hareesh Gundu --- drivers/gpu/msm/kgsl_pool.c | 158 ++++++------------------------- drivers/gpu/msm/kgsl_pool.h | 4 +- drivers/gpu/msm/kgsl_sharedmem.c | 85 +++++++++++++---- 3 files changed, 100 insertions(+), 147 deletions(-) diff --git a/drivers/gpu/msm/kgsl_pool.c b/drivers/gpu/msm/kgsl_pool.c index f5402fdc7e572..214bd50a6bb4e 100644 --- a/drivers/gpu/msm/kgsl_pool.c +++ b/drivers/gpu/msm/kgsl_pool.c @@ -21,21 +21,18 @@ #include "kgsl_device.h" #include "kgsl_pool.h" -/** - * struct kgsl_page_pool - Structure to hold information for the pool - * @pool_order: Page order describing the size of the page - * @page_count: Number of pages currently present in the pool - * @reserved_pages: Number of pages reserved at init for the pool - * @allocation_allowed: Tells if reserved pool gets exhausted, can we allocate - * from system memory - * @list_lock: Spinlock for page list in the pool - * @page_list: List of pages held/reserved in this pool +/* + * Maximum pool size in terms of pages + * = (Number of pools * Max size per pool) */ +#define KGSL_POOL_MAX_PAGES (2 * 4096) + +/* Set the max pool size to 8192 pages */ +static unsigned int kgsl_pool_max_pages = KGSL_POOL_MAX_PAGES; + struct kgsl_page_pool { unsigned int pool_order; int page_count; - unsigned int reserved_pages; - bool allocation_allowed; spinlock_t list_lock; struct list_head page_list; }; @@ -43,34 +40,15 @@ struct kgsl_page_pool { static struct kgsl_page_pool kgsl_pools[] = { { .pool_order = 0, - .reserved_pages = 2048, - .allocation_allowed = true, .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[0].list_lock), .page_list = LIST_HEAD_INIT(kgsl_pools[0].page_list), }, #ifndef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS { - .pool_order = 1, - .reserved_pages = 1024, - .allocation_allowed = true, + .pool_order = 4, .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[1].list_lock), .page_list = LIST_HEAD_INIT(kgsl_pools[1].page_list), }, - { - .pool_order = 4, - .reserved_pages = 256, - .allocation_allowed = false, - .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[2].list_lock), - .page_list = LIST_HEAD_INIT(kgsl_pools[2].page_list), - }, - { - .pool_order = 8, - .reserved_pages = 32, - .allocation_allowed = false, - .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[3].list_lock), - .page_list = LIST_HEAD_INIT(kgsl_pools[3].page_list), - }, - #endif }; @@ -90,28 +68,10 @@ _kgsl_get_pool_from_order(unsigned int order) return NULL; } -/* Map the page into kernel and zero it out */ -static void -_kgsl_pool_zero_page(struct page *p, unsigned int pool_order) -{ - int i; - - for (i = 0; i < (1 << pool_order); i++) { - struct page *page = nth_page(p, i); - void *addr = kmap_atomic(page); - - memset(addr, 0, PAGE_SIZE); - dmac_flush_range(addr, addr + PAGE_SIZE); - kunmap_atomic(addr); - } -} - /* Add a page to specified pool */ static void _kgsl_pool_add_page(struct kgsl_page_pool *pool, struct page *p) { - _kgsl_pool_zero_page(p, pool->pool_order); - spin_lock(&pool->list_lock); list_add_tail(&p->lru, &pool->page_list); pool->page_count++; @@ -196,28 +156,20 @@ _kgsl_pool_shrink(struct kgsl_page_pool *pool, int num_pages) * (current_pool_size - target_pages) pages from pool * starting from higher order pool. */ -static unsigned long -kgsl_pool_reduce(unsigned int target_pages, bool exit) +static int +kgsl_pool_reduce(unsigned int target_pages) { int total_pages = 0; int i; int nr_removed; struct kgsl_page_pool *pool; - unsigned long pcount = 0; + unsigned int pcount = 0; total_pages = kgsl_pool_size_total(); for (i = (KGSL_NUM_POOLS - 1); i >= 0; i--) { pool = &kgsl_pools[i]; - /* - * Only reduce the pool sizes for pools which are allowed to - * allocate memory unless we are at close, in which case the - * reserved memory for all pools needs to be freed - */ - if (!pool->allocation_allowed && !exit) - continue; - total_pages -= pcount; nr_removed = total_pages - target_pages; @@ -296,16 +248,6 @@ void kgsl_pool_free_pages(struct page **pages, unsigned int pcount) kgsl_pool_free_page(p); } } -static int kgsl_pool_idx_lookup(unsigned int order) -{ - int i; - - for (i = 0; i < KGSL_NUM_POOLS; i++) - if (order == kgsl_pools[i].pool_order) - return i; - - return -ENOMEM; -} /** * kgsl_pool_alloc_page() - Allocate a page of requested size @@ -316,56 +258,37 @@ static int kgsl_pool_idx_lookup(unsigned int order) * * Return total page count on success and negative value on failure */ -int kgsl_pool_alloc_page(int *page_size, struct page **pages, - unsigned int pages_len, unsigned int *align) +int kgsl_pool_alloc_page(int page_size, struct page **pages, + unsigned int pages_len) { int j; int pcount = 0; struct kgsl_page_pool *pool; struct page *page = NULL; struct page *p = NULL; - int order = get_order(*page_size); - int pool_idx; - if ((pages == NULL) || pages_len < (*page_size >> PAGE_SHIFT)) + if ((pages == NULL) || pages_len < (page_size >> PAGE_SHIFT)) return -EINVAL; - pool = _kgsl_get_pool_from_order(order); + pool = _kgsl_get_pool_from_order(get_order(page_size)); + if (pool == NULL) return -EINVAL; - pool_idx = kgsl_pool_idx_lookup(order); page = _kgsl_pool_get_page(pool); /* Allocate a new page if not allocated from pool */ if (page == NULL) { - gfp_t gfp_mask = kgsl_gfp_mask(order); - - /* Only allocate non-reserved memory for certain pools */ - if (!pool->allocation_allowed && pool_idx > 0) { - *page_size = PAGE_SIZE << - kgsl_pools[pool_idx-1].pool_order; - *align = ilog2(*page_size); - return -EAGAIN; - } + gfp_t gfp_mask = kgsl_gfp_mask(get_order(page_size)); - page = alloc_pages(gfp_mask, order); - - if (!page) { - if (pool_idx > 0) { - /* Retry with lower order pages */ - *page_size = PAGE_SIZE << - kgsl_pools[pool_idx-1].pool_order; - *align = ilog2(*page_size); - return -EAGAIN; - } else - return -ENOMEM; - } + page = alloc_pages(gfp_mask, + get_order(page_size)); - _kgsl_pool_zero_page(page, order); + if (!page) + return -ENOMEM; } - for (j = 0; j < (*page_size >> PAGE_SHIFT); j++) { + for (j = 0; j < (page_size >> PAGE_SHIFT); j++) { p = nth_page(page, j); pages[pcount] = p; pcount++; @@ -384,34 +307,18 @@ void kgsl_pool_free_page(struct page *page) page_order = compound_order(page); - pool = _kgsl_get_pool_from_order(page_order); - if (pool != NULL) { - _kgsl_pool_add_page(pool, page); - return; + if (kgsl_pool_size_total() < kgsl_pool_max_pages) { + pool = _kgsl_get_pool_from_order(page_order); + if (pool != NULL) { + _kgsl_pool_add_page(pool, page); + return; + } } /* Give back to system as not added to pool */ __free_pages(page, page_order); } -static void kgsl_pool_reserve_pages(void) -{ - int i, j; - - for (i = 0; i < KGSL_NUM_POOLS; i++) { - struct page *page; - - for (j = 0; j < kgsl_pools[i].reserved_pages; j++) { - int order = kgsl_pools[i].pool_order; - gfp_t gfp_mask = kgsl_gfp_mask(order); - - page = alloc_pages(gfp_mask, order); - if (page != NULL) - _kgsl_pool_add_page(&kgsl_pools[i], page); - } - } -} - /* Functions for the shrinker */ static unsigned long @@ -426,7 +333,7 @@ kgsl_pool_shrink_scan_objects(struct shrinker *shrinker, int target_pages = (nr > total_pages) ? 0 : (total_pages - nr); /* Reduce pool size to target_pages */ - return kgsl_pool_reduce(target_pages, false); + return kgsl_pool_reduce(target_pages); } static unsigned long @@ -447,9 +354,6 @@ static struct shrinker kgsl_pool_shrinker = { void kgsl_init_page_pools(void) { - /* Reserve the appropriate number of pages for each pool */ - kgsl_pool_reserve_pages(); - /* Initialize shrinker */ register_shrinker(&kgsl_pool_shrinker); } @@ -457,7 +361,7 @@ void kgsl_init_page_pools(void) void kgsl_exit_page_pools(void) { /* Release all pages in pools, if any.*/ - kgsl_pool_reduce(0, true); + kgsl_pool_reduce(0); /* Unregister shrinker */ unregister_shrinker(&kgsl_pool_shrinker); diff --git a/drivers/gpu/msm/kgsl_pool.h b/drivers/gpu/msm/kgsl_pool.h index 198e4fde74168..34ddbefa88cba 100644 --- a/drivers/gpu/msm/kgsl_pool.h +++ b/drivers/gpu/msm/kgsl_pool.h @@ -37,8 +37,8 @@ void kgsl_pool_free_sgt(struct sg_table *sgt); void kgsl_pool_free_pages(struct page **pages, unsigned int page_count); void kgsl_init_page_pools(void); void kgsl_exit_page_pools(void); -int kgsl_pool_alloc_page(int *page_size, struct page **pages, - unsigned int pages_len, unsigned int *align); +int kgsl_pool_alloc_page(int page_size, struct page **pages, + unsigned int pages_len); void kgsl_pool_free_page(struct page *p); #endif /* __KGSL_POOL_H */ diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 73edc3f7e1465..610a9abbf69d6 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -620,14 +620,8 @@ EXPORT_SYMBOL(kgsl_cache_range_op); #ifndef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS static inline int get_page_size(size_t size, unsigned int align) { - if (align >= ilog2(SZ_1M) && size >= SZ_1M) - return SZ_1M; - else if (align >= ilog2(SZ_64K) && size >= SZ_64K) - return SZ_64K; - else if (align >= ilog2(SZ_8K) && size >= SZ_8K) - return SZ_8K; - else - return PAGE_SIZE; + return (align >= ilog2(SZ_64K) && size >= SZ_64K) + ? SZ_64K : PAGE_SIZE; } #else static inline int get_page_size(size_t size, unsigned int align) @@ -636,6 +630,56 @@ static inline int get_page_size(size_t size, unsigned int align) } #endif +static void kgsl_zero_pages(struct page **pages, unsigned int pcount) +{ + unsigned int j; + unsigned int step = ((VMALLOC_END - VMALLOC_START)/8) >> PAGE_SHIFT; + pgprot_t page_prot = pgprot_writecombine(PAGE_KERNEL); + void *ptr; + + /* + * All memory that goes to the user has to be zeroed out before it gets + * exposed to userspace. This means that the memory has to be mapped in + * the kernel, zeroed (memset) and then unmapped. This also means that + * the dcache has to be flushed to ensure coherency between the kernel + * and user pages. We used to pass __GFP_ZERO to alloc_page which mapped + * zeroed and unmaped each individual page, and then we had to turn + * around and call flush_dcache_page() on that page to clear the caches. + * This was killing us for performance. Instead, we found it is much + * faster to allocate the pages without GFP_ZERO, map a chunk of the + * range ('step' pages), memset it, flush it and then unmap + * - this results in a factor of 4 improvement for speed for large + * buffers. There is a small decrease in speed for small buffers, + * but only on the order of a few microseconds at best. The 'step' + * size is based on a guess at the amount of free vmalloc space, but + * will scale down if there's not enough free space. + */ + for (j = 0; j < pcount; j += step) { + step = min(step, pcount - j); + + ptr = vmap(&pages[j], step, VM_IOREMAP, page_prot); + + if (ptr != NULL) { + memset(ptr, 0, step * PAGE_SIZE); + dmac_flush_range(ptr, ptr + step * PAGE_SIZE); + vunmap(ptr); + } else { + int k; + /* Very, very, very slow path */ + + for (k = j; k < j + step; k++) { + ptr = kmap_atomic(pages[k]); + memset(ptr, 0, PAGE_SIZE); + dmac_flush_range(ptr, ptr + PAGE_SIZE); + kunmap_atomic(ptr); + } + /* scale down the step size to avoid this path */ + if (step > 1) + step >>= 1; + } + } +} + int kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, @@ -660,10 +704,8 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, * larger however to accomodate hardware quirks */ - if (align < ilog2(page_size)) { + if (align < ilog2(page_size)) kgsl_memdesc_set_align(memdesc, ilog2(page_size)); - align = ilog2(page_size); - } /* * There needs to be enough room in the page array to be able to @@ -695,13 +737,18 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, while (len > 0) { int page_count; - page_count = kgsl_pool_alloc_page(&page_size, + /* don't waste space at the end of the allocation*/ + if (len < page_size) + page_size = PAGE_SIZE; + + page_count = kgsl_pool_alloc_page(page_size, memdesc->pages + pcount, - len_alloc - pcount, - &align); + len_alloc - pcount); if (page_count <= 0) { - if (page_count == -EAGAIN) + if (page_size != PAGE_SIZE) { + page_size = PAGE_SIZE; continue; + } /* * Update sglen and memdesc size,as requested allocation @@ -723,9 +770,6 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, len -= page_size; memdesc->size += page_size; memdesc->page_count += page_count; - - /* Get the needed page size for the next iteration */ - page_size = get_page_size(len, align); } /* Call to the hypervisor to lock any secure buffer allocations */ @@ -783,6 +827,11 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, KGSL_STATS_ADD(memdesc->size, &kgsl_driver.stats.page_alloc, &kgsl_driver.stats.page_alloc_max); + /* + * Zero out the pages. + */ + kgsl_zero_pages(memdesc->pages, pcount); + done: if (ret) { if (memdesc->pages) { From c9709600336dba7140660b65394fdc8bbd0dbb2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20H=2E=20Sch=C3=B6nherr?= Date: Wed, 12 Aug 2015 21:35:56 +0200 Subject: [PATCH 0148/1015] sched: Fix cpu_active_mask/cpu_online_mask race MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ Upstream commit dd9d3843755da95f63dd3a376f62b3e45c011210 ] There is a race condition in SMP bootup code, which may result in WARNING: CPU: 0 PID: 1 at kernel/workqueue.c:4418 workqueue_cpu_up_callback() or kernel BUG at kernel/smpboot.c:135! It can be triggered with a bit of luck in Linux guests running on busy hosts. CPU0 CPUn ==== ==== _cpu_up() __cpu_up() start_secondary() set_cpu_online() cpumask_set_cpu(cpu, to_cpumask(cpu_online_bits)); cpu_notify(CPU_ONLINE) cpumask_set_cpu(cpu, to_cpumask(cpu_active_bits)); During the various CPU_ONLINE callbacks CPUn is online but not active. Several things can go wrong at that point, depending on the scheduling of tasks on CPU0. Variant 1: cpu_notify(CPU_ONLINE) workqueue_cpu_up_callback() rebind_workers() set_cpus_allowed_ptr() This call fails because it requires an active CPU; rebind_workers() ends with a warning: WARNING: CPU: 0 PID: 1 at kernel/workqueue.c:4418 workqueue_cpu_up_callback() Variant 2: cpu_notify(CPU_ONLINE) smpboot_thread_call() smpboot_unpark_threads() .. __kthread_unpark() __kthread_bind() wake_up_state() .. select_task_rq() select_fallback_rq() The ->wake_cpu of the unparked thread is not allowed, making a call to select_fallback_rq() necessary. Then, select_fallback_rq() cannot find an allowed, active CPU and promptly resets the allowed CPUs, so that the task in question ends up on CPU0. When those unparked tasks are eventually executed, they run immediately into a BUG: kernel BUG at kernel/smpboot.c:135! Just changing the order in which the online/active bits are set (and adding some memory barriers), would solve the two issues above. However, it would change the order of operations back to the one before commit 6acbfb96976f ("sched: Fix hotplug vs. set_cpus_allowed_ptr()"), thus, reintroducing that particular problem. Going further back into history, we have at least the following commits touching this topic: - commit 2baab4e90495 ("sched: Fix select_fallback_rq() vs cpu_active/cpu_online") - commit 5fbd036b552f ("sched: Cleanup cpu_active madness") Together, these give us the following non-working solutions: - secondary CPU sets active before online, because active is assumed to be a subset of online; - secondary CPU sets online before active, because the primary CPU assumes that an online CPU is also active; - secondary CPU sets online and waits for primary CPU to set active, because it might deadlock. Commit 875ebe940d77 ("powerpc/smp: Wait until secondaries are active & online") introduces an arch-specific solution to this arch-independent problem. Now, go for a more general solution without explicit waiting and simply set active twice: once on the secondary CPU after online was set and once on the primary CPU after online was seen. set_cpus_allowed_ptr()") Change-Id: I4541760da1df1a12b46430d02da60bc3ea424986 Signed-off-by: Jan H. Schönherr Acked-by: Peter Zijlstra Cc: Cc: Anton Blanchard Cc: Borislav Petkov Cc: Joerg Roedel Cc: Linus Torvalds Cc: Matt Wilson Cc: Michael Ellerman Cc: Peter Zijlstra Cc: Thomas Gleixner Fixes: 6acbfb96976f ("sched: Fix hotplug vs. set_cpus_allowed_ptr()") Link: http://lkml.kernel.org/r/1439408156-18840-1-git-send-email-jschoenh@amazon.de Signed-off-by: Ingo Molnar Signed-off-by: Sasha Levin Git-commit: dd9d3843755da95f63dd3a376f62b3e45c011210 Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git [pkondeti@codeaurora.org: applied the fix for QHMP scheduler files as well] Signed-off-by: Pavankumar Kondeti --- kernel/sched/qhmp_core.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/kernel/sched/qhmp_core.c b/kernel/sched/qhmp_core.c index 9925058aab334..6095a74c107dd 100644 --- a/kernel/sched/qhmp_core.c +++ b/kernel/sched/qhmp_core.c @@ -7155,6 +7155,14 @@ static int sched_cpu_active(struct notifier_block *nfb, case CPU_STARTING: set_cpu_rq_start_time(); return NOTIFY_OK; + case CPU_ONLINE: + /* + * At this point a starting CPU has marked itself as online via + * set_cpu_online(). But it might not yet have marked itself + * as active, which is essential from here on. + * + * Thus, fall-through and help the starting CPU along. + */ case CPU_DOWN_FAILED: set_cpu_active((long)hcpu, true); return NOTIFY_OK; From 463522c9db3650b981ce4a632a44b60266416932 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Mon, 19 Sep 2016 20:17:10 +0530 Subject: [PATCH 0149/1015] ARM: dts: msm: Add initial-powerlevel for speedbin config of MSM8917 Initial powerlevel is not defined for speedbin configuration. This will cause GPU to wake up at default power level NOM+ instead of SVS+. Add initial-powerlevel for MSM8917 GPU to wakeup at SVS+. CRs-Fixed: 1068696 Change-Id: I1606667e3b36c0d1d4ffd5922459aad49612a8cf Signed-off-by: Hareesh Gundu --- arch/arm/boot/dts/qcom/msm8917.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index c55049aa1fbff..14e5c3b6e9aaa 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -1763,6 +1763,7 @@ #size-cells = <0>; qcom,speed-bin = <0>; + qcom,initial-pwrlevel = <3>; /* TURBO */ qcom,gpu-pwrlevel@0 { @@ -1824,6 +1825,7 @@ #size-cells = <0>; qcom,speed-bin = <1>; + qcom,initial-pwrlevel = <3>; /* TURBO */ qcom,gpu-pwrlevel@0 { From a287e1092c12f7ec57e762b90b3355f05960afc2 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Tue, 22 Mar 2016 18:02:49 +0100 Subject: [PATCH 0150/1015] netfilter: x_tables: validate e->target_offset early We should check that e->target_offset is sane before mark_source_chains gets called since it will fetch the target entry for loop detection. Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Dennis Cagle Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: bdf533de6968e9686df777dc178486f600c6e617 (cherry picked from commit bdf533de6968e9686df777dc178486f600c6e617) Change-Id: Id3ec56cdc333990d62c99d6c2e59dbcce633bcc1 --- net/ipv4/netfilter/arp_tables.c | 17 ++++++++--------- net/ipv4/netfilter/ip_tables.c | 17 ++++++++--------- net/ipv6/netfilter/ip6_tables.c | 17 ++++++++--------- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index c6a8e98dbe123..738e62d548ce7 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c @@ -470,14 +470,12 @@ static int mark_source_chains(const struct xt_table_info *newinfo, return 1; } -static inline int check_entry(const struct arpt_entry *e, const char *name) +static inline int check_entry(const struct arpt_entry *e) { const struct xt_entry_target *t; - if (!arp_checkentry(&e->arp)) { - duprintf("arp_tables: arp check failed %p %s.\n", e, name); + if (!arp_checkentry(&e->arp)) return -EINVAL; - } if (e->target_offset + sizeof(struct xt_entry_target) > e->next_offset) return -EINVAL; @@ -518,10 +516,6 @@ find_check_entry(struct arpt_entry *e, const char *name, unsigned int size) struct xt_target *target; int ret; - ret = check_entry(e, name); - if (ret) - return ret; - t = arpt_get_target(e); target = xt_request_find_target(NFPROTO_ARP, t->u.user.name, t->u.user.revision); @@ -566,6 +560,7 @@ static inline int check_entry_size_and_hooks(struct arpt_entry *e, unsigned int valid_hooks) { unsigned int h; + int err; if ((unsigned long)e % __alignof__(struct arpt_entry) != 0 || (unsigned char *)e + sizeof(struct arpt_entry) >= limit || @@ -581,6 +576,10 @@ static inline int check_entry_size_and_hooks(struct arpt_entry *e, return -EINVAL; } + err = check_entry(e); + if (err) + return err; + /* Check hooks & underflows */ for (h = 0; h < NF_ARP_NUMHOOKS; h++) { if (!(valid_hooks & (1 << h))) @@ -1239,7 +1238,7 @@ check_compat_entry_size_and_hooks(struct compat_arpt_entry *e, } /* For purposes of check_entry casting the compat entry is fine */ - ret = check_entry((struct arpt_entry *)e, name); + ret = check_entry((struct arpt_entry *)e); if (ret) return ret; diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 9bb6ca7cf5761..2c8fb724dde5d 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c @@ -564,14 +564,12 @@ static void cleanup_match(struct xt_entry_match *m, struct net *net) } static int -check_entry(const struct ipt_entry *e, const char *name) +check_entry(const struct ipt_entry *e) { const struct xt_entry_target *t; - if (!ip_checkentry(&e->ip)) { - duprintf("ip check failed %p %s.\n", e, name); + if (!ip_checkentry(&e->ip)) return -EINVAL; - } if (e->target_offset + sizeof(struct xt_entry_target) > e->next_offset) @@ -661,10 +659,6 @@ find_check_entry(struct ipt_entry *e, struct net *net, const char *name, struct xt_mtchk_param mtpar; struct xt_entry_match *ematch; - ret = check_entry(e, name); - if (ret) - return ret; - j = 0; mtpar.net = net; mtpar.table = name; @@ -728,6 +722,7 @@ check_entry_size_and_hooks(struct ipt_entry *e, unsigned int valid_hooks) { unsigned int h; + int err; if ((unsigned long)e % __alignof__(struct ipt_entry) != 0 || (unsigned char *)e + sizeof(struct ipt_entry) >= limit || @@ -743,6 +738,10 @@ check_entry_size_and_hooks(struct ipt_entry *e, return -EINVAL; } + err = check_entry(e); + if (err) + return err; + /* Check hooks & underflows */ for (h = 0; h < NF_INET_NUMHOOKS; h++) { if (!(valid_hooks & (1 << h))) @@ -1504,7 +1503,7 @@ check_compat_entry_size_and_hooks(struct compat_ipt_entry *e, } /* For purposes of check_entry casting the compat entry is fine */ - ret = check_entry((struct ipt_entry *)e, name); + ret = check_entry((struct ipt_entry *)e); if (ret) return ret; diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 2a0c4819e277a..bc0615b1cf63e 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c @@ -574,14 +574,12 @@ static void cleanup_match(struct xt_entry_match *m, struct net *net) } static int -check_entry(const struct ip6t_entry *e, const char *name) +check_entry(const struct ip6t_entry *e) { const struct xt_entry_target *t; - if (!ip6_checkentry(&e->ipv6)) { - duprintf("ip_tables: ip check failed %p %s.\n", e, name); + if (!ip6_checkentry(&e->ipv6)) return -EINVAL; - } if (e->target_offset + sizeof(struct xt_entry_target) > e->next_offset) @@ -672,10 +670,6 @@ find_check_entry(struct ip6t_entry *e, struct net *net, const char *name, struct xt_mtchk_param mtpar; struct xt_entry_match *ematch; - ret = check_entry(e, name); - if (ret) - return ret; - j = 0; mtpar.net = net; mtpar.table = name; @@ -739,6 +733,7 @@ check_entry_size_and_hooks(struct ip6t_entry *e, unsigned int valid_hooks) { unsigned int h; + int err; if ((unsigned long)e % __alignof__(struct ip6t_entry) != 0 || (unsigned char *)e + sizeof(struct ip6t_entry) >= limit || @@ -754,6 +749,10 @@ check_entry_size_and_hooks(struct ip6t_entry *e, return -EINVAL; } + err = check_entry(e); + if (err) + return err; + /* Check hooks & underflows */ for (h = 0; h < NF_INET_NUMHOOKS; h++) { if (!(valid_hooks & (1 << h))) @@ -1516,7 +1515,7 @@ check_compat_entry_size_and_hooks(struct compat_ip6t_entry *e, } /* For purposes of check_entry casting the compat entry is fine */ - ret = check_entry((struct ip6t_entry *)e, name); + ret = check_entry((struct ip6t_entry *)e); if (ret) return ret; From 2714f21d4b22fe89efb9cf24aed5adbc23dd1a3c Mon Sep 17 00:00:00 2001 From: Tatenda Chipeperekwa Date: Mon, 8 Aug 2016 17:33:15 -0700 Subject: [PATCH 0151/1015] msm: mdss: hdmi: check encryption status only when panel is on Check the encryption status only when the panel is on so that there is no potential for un-clocked register access. Furthermore, protect the read of the panel/hpd status variables by using the global lock since these variables change state in different threads. CRs-FIxed: 1045535 Change-Id: Ifd0edd0deef2d8336a0e867f636bce89bb0b57e1 Signed-off-by: Tatenda Chipeperekwa --- drivers/video/msm/mdss/mdss_hdmi_tx.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_hdmi_tx.c b/drivers/video/msm/mdss/mdss_hdmi_tx.c index a76188ec3c098..edde7857fb111 100644 --- a/drivers/video/msm/mdss/mdss_hdmi_tx.c +++ b/drivers/video/msm/mdss/mdss_hdmi_tx.c @@ -1443,6 +1443,8 @@ static void hdmi_tx_hdcp_cb_work(struct work_struct *work) return; } + mutex_lock(&hdmi_ctrl->tx_lock); + switch (hdmi_ctrl->hdcp_status) { case HDCP_STATE_AUTHENTICATED: hdmi_ctrl->auth_state = true; @@ -1464,14 +1466,15 @@ static void hdmi_tx_hdcp_cb_work(struct work_struct *work) hdmi_ctrl->auth_state = false; - if (hdmi_tx_is_encryption_set(hdmi_ctrl) || - !hdmi_tx_is_stream_shareable(hdmi_ctrl)) { - hdmi_tx_set_audio_switch_node(hdmi_ctrl, 0); - rc = hdmi_tx_config_avmute(hdmi_ctrl, true); - } - if (hdmi_tx_is_panel_on(hdmi_ctrl)) { DEV_DBG("%s: Reauthenticating\n", __func__); + + if (hdmi_tx_is_encryption_set(hdmi_ctrl) || + !hdmi_tx_is_stream_shareable(hdmi_ctrl)) { + hdmi_tx_set_audio_switch_node(hdmi_ctrl, 0); + rc = hdmi_tx_config_avmute(hdmi_ctrl, true); + } + rc = hdmi_ctrl->hdcp_ops->hdmi_hdcp_reauthenticate( hdmi_ctrl->hdcp_data); if (rc) @@ -1508,6 +1511,8 @@ static void hdmi_tx_hdcp_cb_work(struct work_struct *work) break; /* do nothing */ } + + mutex_unlock(&hdmi_ctrl->tx_lock); } static u32 hdmi_tx_ddc_read(struct hdmi_tx_ddc_ctrl *ddc_ctrl, @@ -3410,8 +3415,6 @@ static int hdmi_tx_hdcp_off(struct hdmi_tx_ctrl *hdmi_ctrl) hdmi_ctrl->hdcp_ops->hdmi_hdcp_off( hdmi_ctrl->hdcp_data); - flush_delayed_work(&hdmi_ctrl->hdcp_cb_work); - hdmi_ctrl->hdcp_ops = NULL; rc = hdmi_tx_enable_power(hdmi_ctrl, HDMI_TX_DDC_PM, From a2b87099d1e344820d24201ce14c65a285013ba2 Mon Sep 17 00:00:00 2001 From: Gaurav Kohli Date: Fri, 2 Sep 2016 18:03:22 +0530 Subject: [PATCH 0152/1015] soc: qcom: flush persistent kmaps and fixmap mappings for subsystem mdt On 32 bit architecture xpu violations are happening because of mappings in PK map regions. Flush the PKMAP and fixmap mappings to make sure that there are no duplicate mappings for any pil mdt region. On 64 bit architecture these functions are empty. Change-Id: Ie69fcf9044a89328e91ff8969044835f2a487a10 Signed-off-by: Gaurav Kohli --- drivers/soc/qcom/subsys-pil-tz.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/soc/qcom/subsys-pil-tz.c b/drivers/soc/qcom/subsys-pil-tz.c index f98cfbc8d9478..19a306d40511d 100644 --- a/drivers/soc/qcom/subsys-pil-tz.c +++ b/drivers/soc/qcom/subsys-pil-tz.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -613,6 +614,10 @@ static int pil_init_image_trusted(struct pil_desc *pil, return -ENOMEM; } + /* Make sure there are no mappings in PKMAP and fixmap */ + kmap_flush_unused(); + kmap_atomic_flush_unused(); + memcpy(mdata_buf, metadata, size); request.proc = d->pas_id; From ea0d8df179b3744edc8a24aad1e0b2a8e7d8ec24 Mon Sep 17 00:00:00 2001 From: Ashish Garg Date: Fri, 2 Sep 2016 17:11:04 +0530 Subject: [PATCH 0153/1015] defconfig: msm: enable mdss xlog support Enablement of xlog logging in MDSS by default. Change-Id: I38d2a605cb9dd188950ddd81a598bc43d646519f Signed-off-by: Ashish Garg --- arch/arm/configs/msmcortex-perf_defconfig | 1 + arch/arm/configs/msmcortex_defconfig | 1 + arch/arm64/configs/msmcortex-perf_defconfig | 1 + arch/arm64/configs/msmcortex_defconfig | 1 + 4 files changed, 4 insertions(+) diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index 7d210e2526dac..2a0eac14d1ecf 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -415,6 +415,7 @@ CONFIG_MSM_DBA_ADV7533=y CONFIG_FB_MSM_MDSS=y CONFIG_FB_MSM_MDSS_WRITEBACK=y CONFIG_FB_MSM_MDSS_HDMI_PANEL=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_SOUND=y CONFIG_SND=y diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index 1fd5b3a7f9d32..d87355e94b1c5 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -410,6 +410,7 @@ CONFIG_MSM_DBA_ADV7533=y CONFIG_FB_MSM_MDSS=y CONFIG_FB_MSM_MDSS_WRITEBACK=y CONFIG_FB_MSM_MDSS_HDMI_PANEL=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y CONFIG_BACKLIGHT_LCD_SUPPORT=y # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index 185cee2c9c99d..169afe3056338 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -419,6 +419,7 @@ CONFIG_MSM_DBA_ADV7533=y CONFIG_FB_MSM_MDSS=y CONFIG_FB_MSM_MDSS_WRITEBACK=y CONFIG_FB_MSM_MDSS_HDMI_PANEL=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_SOUND=y CONFIG_SND=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index 79313bf997906..2b97d9e4267ab 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -422,6 +422,7 @@ CONFIG_MSM_DBA_ADV7533=y CONFIG_FB_MSM_MDSS=y CONFIG_FB_MSM_MDSS_WRITEBACK=y CONFIG_FB_MSM_MDSS_HDMI_PANEL=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_SOUND=y CONFIG_SND=y From 9b72bdb78165f5c3c3ce03b196b2c281a54aa219 Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Thu, 21 Apr 2016 17:08:32 +0530 Subject: [PATCH 0154/1015] msm: mdss: do not report overflow errors during read commands During a DSI DMA read command transaction, it is expected to have DSI FIFO overflow if the read operation duration exceeds one BLLP line time frame. Make sure not to trigger DSI FIFO overflow recovery sequence for such cases where DSI FIFO overflow error is masked. Change-Id: I0762a0f51d580a44cfa24ffac60cc465c241c733 Signed-off-by: Padmanabhan Komanduru --- drivers/video/msm/mdss/mdss_dsi_host.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index 1fdea667db168..4293796472b45 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -2969,6 +2969,13 @@ static bool mdss_dsi_fifo_status(struct mdss_dsi_ctrl_pdata *ctrl) pr_err("%s: status=%x\n", __func__, status); + /* + * if DSI FIFO overflow is masked, + * do not report overflow error + */ + if (MIPI_INP(base + 0x10c) & 0xf0000) + status = status & 0xaaaaffff; + if (status & 0x44440000) {/* DLNx_HS_FIFO_OVERFLOW */ dsi_send_events(ctrl, DSI_EV_DLNx_FIFO_OVERFLOW, 0); /* Ignore FIFO EMPTY when overflow happens */ From 3c7b4c58d68bb56373cd408fdb58eb14e97d4242 Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Mon, 7 Sep 2015 16:04:32 +0530 Subject: [PATCH 0155/1015] msm: mdss: add return values to MDSS recovery events When the target is in suspend or when shutdown is pending, the DSI recovery need not be taken care of. Add change to handle this case based on the return value of the MDSS recovery events. Change-Id: I5a5cd6743c15cca7ca42a40db7dcd552c95b20b6 Signed-off-by: Padmanabhan Komanduru Signed-off-by: Ashish Garg --- drivers/video/msm/mdss/mdss_dsi_host.c | 22 ++++++++++++++++---- drivers/video/msm/mdss/mdss_mdp_intf_cmd.c | 20 ++++++++++-------- drivers/video/msm/mdss/mdss_mdp_intf_video.c | 14 ++++++------- drivers/video/msm/mdss/mdss_panel.h | 2 +- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index 1fdea667db168..5105752e5d8e0 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -746,6 +746,8 @@ static void mdss_dsi_ctl_phy_reset(struct mdss_dsi_ctrl_pdata *ctrl, u32 event) u32 data0, data1, mask = 0, data_lane_en = 0; struct mdss_dsi_ctrl_pdata *ctrl0, *ctrl1; u32 ln0, ln1, ln_ctrl0, ln_ctrl1, i; + int rc = 0; + /* * Add 2 ms delay suggested by HW team. * Check clk lane stop state after every 200 us @@ -767,9 +769,15 @@ static void mdss_dsi_ctl_phy_reset(struct mdss_dsi_ctrl_pdata *ctrl, u32 event) ctrl0 = mdss_dsi_get_ctrl_by_index(DSI_CTRL_0); ctrl1 = mdss_dsi_get_ctrl_by_index(DSI_CTRL_1); - if (ctrl0->recovery) - ctrl0->recovery->fxn(ctrl0->recovery->data, + if (ctrl0->recovery) { + rc = ctrl0->recovery->fxn(ctrl0->recovery->data, MDP_INTF_DSI_VIDEO_FIFO_OVERFLOW); + if (rc < 0) { + pr_debug("%s: Target is in suspend/shutdown\n", + __func__); + return; + } + } /* * Disable PHY contention detection and receive. * Configure the strength ctrl 1 register. @@ -859,9 +867,15 @@ static void mdss_dsi_ctl_phy_reset(struct mdss_dsi_ctrl_pdata *ctrl, u32 event) */ udelay(200); } else { - if (ctrl->recovery) - ctrl->recovery->fxn(ctrl->recovery->data, + if (ctrl->recovery) { + rc = ctrl->recovery->fxn(ctrl->recovery->data, MDP_INTF_DSI_VIDEO_FIFO_OVERFLOW); + if (rc < 0) { + pr_debug("%s: Target is in suspend/shutdown\n", + __func__); + return; + } + } /* Disable PHY contention detection and receive */ MIPI_OUTP((ctrl->phy_io.base) + 0x0188, 0); diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c index aa70b44fdcb2b..c75bc9ba13f2c 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c @@ -1025,7 +1025,7 @@ static int mdss_mdp_cmd_wait4readptr(struct mdss_mdp_cmd_ctx *ctx) return rc; } -static void mdss_mdp_cmd_intf_callback(void *data, int event) +static int mdss_mdp_cmd_intf_callback(void *data, int event) { struct mdss_mdp_cmd_ctx *ctx = data; struct mdss_mdp_pp_tear_check *te = NULL; @@ -1034,11 +1034,11 @@ static void mdss_mdp_cmd_intf_callback(void *data, int event) if (!data) { pr_err("%s: invalid ctx\n", __func__); - return; + return -EINVAL; } if (!ctx->ctl) - return; + return -EINVAL; switch (event) { case MDP_INTF_CALLBACK_DSI_WAIT: @@ -1050,7 +1050,7 @@ static void mdss_mdp_cmd_intf_callback(void *data, int event) * just return */ if (ctx->intf_stopped || !is_pingpong_split(ctx->ctl->mfd)) - return; + return -EINVAL; atomic_inc(&ctx->rdptr_cnt); /* enable clks and rd_ptr interrupt */ @@ -1059,7 +1059,7 @@ static void mdss_mdp_cmd_intf_callback(void *data, int event) mixer = mdss_mdp_mixer_get(ctx->ctl, MDSS_MDP_MIXER_MUX_LEFT); if (!mixer) { pr_err("%s: null mixer\n", __func__); - return; + return -EINVAL; } /* wait for read pointer */ @@ -1083,6 +1083,7 @@ static void mdss_mdp_cmd_intf_callback(void *data, int event) pr_debug("%s: unhandled event=%d\n", __func__, event); break; } + return 0; } static void mdss_mdp_cmd_lineptr_done(void *arg) @@ -1108,7 +1109,7 @@ static void mdss_mdp_cmd_lineptr_done(void *arg) spin_unlock(&ctx->clk_lock); } -static void mdss_mdp_cmd_intf_recovery(void *data, int event) +static int mdss_mdp_cmd_intf_recovery(void *data, int event) { struct mdss_mdp_cmd_ctx *ctx = data; unsigned long flags; @@ -1116,11 +1117,11 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event) if (!data) { pr_err("%s: invalid ctx\n", __func__); - return; + return -EINVAL; } if (!ctx->ctl) - return; + return -EINVAL; /* * Currently, only intf_fifo_underflow is @@ -1130,7 +1131,7 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event) if (event != MDP_INTF_DSI_CMD_FIFO_UNDERFLOW) { pr_warn("%s: unsupported recovery event:%d\n", __func__, event); - return; + return -EPERM; } if (atomic_read(&ctx->koff_cnt)) { @@ -1154,6 +1155,7 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event) if (notify_frame_timeout) mdss_mdp_ctl_notify(ctx->ctl, MDP_NOTIFY_FRAME_TIMEOUT); + return 0; } static void mdss_mdp_cmd_pingpong_done(void *arg) diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_video.c b/drivers/video/msm/mdss/mdss_mdp_intf_video.c index 262827b18a5f1..29325b6117dac 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_video.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_video.c @@ -310,7 +310,7 @@ int mdss_mdp_video_addr_setup(struct mdss_data_type *mdata, return 0; } -static void mdss_mdp_video_intf_recovery(void *data, int event) +static int mdss_mdp_video_intf_recovery(void *data, int event) { struct mdss_mdp_video_ctx *ctx; struct mdss_mdp_ctl *ctl = data; @@ -322,7 +322,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) if (!data) { pr_err("%s: invalid ctl\n", __func__); - return; + return -EINVAL; } /* @@ -333,7 +333,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) if (event != MDP_INTF_DSI_VIDEO_FIFO_OVERFLOW) { pr_warn("%s: unsupported recovery event:%d\n", __func__, event); - return; + return -EPERM; } ctx = ctl->intf_ctx[MASTER_CTX]; @@ -348,7 +348,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) clk_rate = DIV_ROUND_UP_ULL(clk_rate, 1000); /* in kHz */ if (!clk_rate) { pr_err("Unable to get proper clk_rate\n"); - return; + return -EINVAL; } /* * calculate clk_period as pico second to maintain good @@ -358,7 +358,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) clk_period = DIV_ROUND_UP_ULL(1000000000, clk_rate); if (!clk_period) { pr_err("Unable to calculate clock period\n"); - return; + return -EINVAL; } min_ln_cnt = pinfo->lcdc.v_back_porch + pinfo->lcdc.v_pulse_width; active_lns_cnt = pinfo->yres; @@ -384,7 +384,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) !ctx->timegen_en) { pr_warn("Target is in suspend or shutdown pending\n"); mutex_unlock(&ctl->offlock); - return; + return -EPERM; } line_cnt = mdss_mdp_video_line_count(ctl); @@ -394,7 +394,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) pr_debug("%s, Needed lines left line_cnt=%d\n", __func__, line_cnt); mutex_unlock(&ctl->offlock); - return; + return 0; } else { pr_warn("line count is less. line_cnt = %d\n", line_cnt); diff --git a/drivers/video/msm/mdss/mdss_panel.h b/drivers/video/msm/mdss/mdss_panel.h index 00ad560627b58..f9c0d9d901b4c 100644 --- a/drivers/video/msm/mdss/mdss_panel.h +++ b/drivers/video/msm/mdss/mdss_panel.h @@ -164,7 +164,7 @@ enum { }; struct mdss_intf_recovery { - void (*fxn)(void *ctx, int event); + int (*fxn)(void *ctx, int event); void *data; }; From 9f91db7803cd3d06a217021e56425bbdf12e363e Mon Sep 17 00:00:00 2001 From: Manikanta Sivapala Date: Wed, 14 Sep 2016 17:32:25 +0530 Subject: [PATCH 0156/1015] msm: vidc: Correct enum value for vpx colorspace extradata Change enum value of vpx colorspace extradata to align with the hfi value of vpx colorspace extradata Change-Id: I3f32842d3ed6d6aa427d5c80a9078efce6c11012 Signed-off-by: Manikanta Sivapala --- include/uapi/media/msm_vidc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/uapi/media/msm_vidc.h b/include/uapi/media/msm_vidc.h index b259bdef8a937..e9370cb660b29 100644 --- a/include/uapi/media/msm_vidc.h +++ b/include/uapi/media/msm_vidc.h @@ -245,7 +245,7 @@ enum msm_vidc_extradata_type { MSM_VIDC_EXTRADATA_DIGITAL_ZOOM = 0x07000010, #define MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO \ MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO - MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO = 0x070000011, + MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO = 0x00000014, MSM_VIDC_EXTRADATA_MULTISLICE_INFO = 0x7F100000, MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB = 0x7F100001, MSM_VIDC_EXTRADATA_INDEX = 0x7F100002, From dec8d440652d4111d90819c5c43cc8f4192dab5d Mon Sep 17 00:00:00 2001 From: Haynes Mathew George Date: Wed, 18 May 2016 14:24:18 -0700 Subject: [PATCH 0157/1015] ASoC: msm: qdsp6v2: Fix offload gapless transition Use smaller fragment sizes at DSP interface than at user space interface. This allows to write earlier to the DSP without waiting for a full user space fragement in case of underrun or gapless transition. Bug: 28545177 Change-Id: I47b36ba2fc882f494991f58c7edddd08e4bbbe8d Signed-off-by: Eric Laurent Git-commit: a2a46fd256f6730c03116b9cd03771e99d8d0a6c Git-repo: https://android.googlesource.com/kernel/msm Signed-off-by: Haynes Mathew George [satyak@codeaurora.org: allow runtime fragment sizes which are not multiples of dsp fragment sizes for direct pcm cases. Also fix linker error during compilation for 32 bit architectures using do_div() for division] Signed-off-by: Satya Krishna Pindiproli --- sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c | 80 ++++++++++++++++++---- 1 file changed, 66 insertions(+), 14 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c index e35ef5a87ca4b..d6c335a0770cd 100644 --- a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c @@ -63,6 +63,7 @@ #define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024) #define COMPR_PLAYBACK_MIN_NUM_FRAGMENTS (4) #define COMPR_PLAYBACK_MAX_NUM_FRAGMENTS (16 * 4) +#define COMPR_PLAYBACK_DSP_FRAGMENT_SIZE (32 * 1024) #define COMPRESSED_LR_VOL_MAX_STEPS 0x2000 const DECLARE_TLV_DB_LINEAR(msm_compr_vol_gain, 0, @@ -172,6 +173,11 @@ struct msm_compr_audio { wait_queue_head_t close_wait; wait_queue_head_t wait_for_stream_avail; + uint32_t dsp_fragment_size; + uint32_t dsp_fragments; + uint32_t dsp_fragment_ratio; + uint32_t dsp_fragments_sent; + spinlock_t lock; }; @@ -328,10 +334,22 @@ static int msm_compr_send_buffer(struct msm_compr_audio *prtd) prtd->gapless_state.initial_samples_drop, prtd->gapless_state.trailing_samples_drop); - buffer_length = prtd->codec_param.buffer.fragment_size; bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < prtd->codec_param.buffer.fragment_size) + + + if (bytes_available < prtd->dsp_fragment_size) buffer_length = bytes_available; + else if (bytes_available > prtd->cstream->runtime->fragment_size) + buffer_length = prtd->cstream->runtime->fragment_size; + else { + /* + * do_div divides in place and bytes_available is modified + * to the quotient after the division. Essentially, write + * the remaining data in dsp_fragment_size'd chunks + */ + do_div(bytes_available, prtd->dsp_fragment_size); + buffer_length = bytes_available * prtd->dsp_fragment_size; + } if (prtd->byte_offset + buffer_length > prtd->buffer_size) { buffer_length = (prtd->buffer_size - prtd->byte_offset); @@ -419,7 +437,11 @@ static void compr_event_handler(uint32_t opcode, if (prtd->byte_offset >= prtd->buffer_size) prtd->byte_offset -= prtd->buffer_size; - snd_compr_fragment_elapsed(cstream); + prtd->dsp_fragments_sent += token / prtd->dsp_fragment_size; + if (prtd->dsp_fragments_sent >= prtd->dsp_fragment_ratio) { + snd_compr_fragment_elapsed(cstream); + prtd->dsp_fragments_sent = 0; + } if (!atomic_read(&prtd->start)) { /* Writes must be restarted from _copy() */ @@ -430,7 +452,7 @@ static void compr_event_handler(uint32_t opcode, } bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < cstream->runtime->fragment_size) { + if (bytes_available < prtd->dsp_fragment_size) { pr_debug("WRITE_DONE Insufficient data to send. break out\n"); atomic_set(&prtd->xrun, 1); @@ -442,8 +464,8 @@ static void compr_event_handler(uint32_t opcode, wake_up(&prtd->drain_wait); atomic_set(&prtd->drain, 0); } - } else if ((bytes_available == cstream->runtime->fragment_size) - && atomic_read(&prtd->drain)) { + } else if ((bytes_available == prtd->dsp_fragment_size) + && atomic_read(&prtd->drain)) { prtd->last_buffer = 1; msm_compr_send_buffer(prtd); prtd->last_buffer = 0; @@ -507,7 +529,7 @@ static void compr_event_handler(uint32_t opcode, spin_lock_irqsave(&prtd->lock, flags); if (!prtd->bytes_sent) { bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < cstream->runtime->fragment_size) { + if (bytes_available < prtd->dsp_fragment_size) { pr_debug("CMD_RUN_V2 Insufficient data to send. break out\n"); atomic_set(&prtd->xrun, 1); } else @@ -1041,12 +1063,38 @@ static int msm_compr_configure_dsp(struct snd_compr_stream *cstream) runtime->fragments = prtd->codec_param.buffer.fragments; runtime->fragment_size = prtd->codec_param.buffer.fragment_size; + + /* use smaller DSP fragments to ease gapless transition by reducing the + * minimum amount of data necessary to start DSP decoding + */ + if (runtime->fragment_size < COMPR_PLAYBACK_DSP_FRAGMENT_SIZE) { + prtd->dsp_fragment_size = runtime->fragment_size; + } else if ((runtime->fragment_size % + COMPR_PLAYBACK_DSP_FRAGMENT_SIZE) != 0) { + prtd->dsp_fragment_size = runtime->fragment_size; + pr_debug("%s: runtime fragment size %d is not a multiple of %d\n", + __func__, runtime->fragment_size, + COMPR_PLAYBACK_DSP_FRAGMENT_SIZE); + } else { + prtd->dsp_fragment_size = COMPR_PLAYBACK_DSP_FRAGMENT_SIZE; + } + prtd->dsp_fragment_ratio = runtime->fragment_size / + prtd->dsp_fragment_size; + prtd->dsp_fragments = runtime->fragments * + prtd->dsp_fragment_ratio; + + if (prtd->dsp_fragments > COMPR_PLAYBACK_MAX_NUM_FRAGMENTS) { + pr_err("%s: Invalid fragment count: %d", __func__, + prtd->dsp_fragments); + return -EINVAL; + } + pr_debug("allocate %d buffers each of size %d\n", runtime->fragments, runtime->fragment_size); ret = q6asm_audio_client_buf_alloc_contiguous(dir, ac, - runtime->fragment_size, - runtime->fragments); + prtd->dsp_fragment_size, + prtd->dsp_fragments); if (ret < 0) { pr_err("Audio Start: Buffer Allocation failed rc = %d\n", ret); return -ENOMEM; @@ -1057,6 +1105,7 @@ static int msm_compr_configure_dsp(struct snd_compr_stream *cstream) prtd->app_pointer = 0; prtd->bytes_received = 0; prtd->bytes_sent = 0; + prtd->dsp_fragments_sent = 0; prtd->buffer = ac->port[dir].buf[0].data; prtd->buffer_paddr = ac->port[dir].buf[0].phys; prtd->buffer_size = runtime->fragments * runtime->fragment_size; @@ -1601,6 +1650,7 @@ static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) prtd->bytes_received = 0; prtd->bytes_sent = 0; prtd->marker_timestamp = 0; + prtd->dsp_fragments_sent = 0; atomic_set(&prtd->xrun, 0); spin_unlock_irqrestore(&prtd->lock, flags); @@ -1661,8 +1711,8 @@ static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) */ bytes_to_write = prtd->bytes_received - prtd->copied_total; - WARN(bytes_to_write > runtime->fragment_size, - "last write %d cannot be > than fragment_size", + WARN(bytes_to_write > prtd->dsp_fragment_size, + "last write %d cannot be > than dsp_fragment_size", bytes_to_write); if (bytes_to_write > 0) { @@ -1742,7 +1792,7 @@ static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) if (atomic_read(&prtd->eos)) prtd->gapless_state.gapless_transition = 1; prtd->marker_timestamp = 0; - + prtd->dsp_fragments_sent = 0; /* Don't reset these as these vars map to total_bytes_transferred and total_bytes_available @@ -1836,6 +1886,7 @@ static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) prtd->app_pointer = 0; prtd->first_buffer = 1; prtd->last_buffer = 0; + prtd->dsp_fragments_sent = 0; atomic_set(&prtd->drain, 0); atomic_set(&prtd->xrun, 1); spin_unlock_irqrestore(&prtd->lock, flags); @@ -2110,7 +2161,8 @@ static int msm_compr_copy(struct snd_compr_stream *cstream, /* * If stream is started and there has been an xrun, - * since the available bytes fits fragment_size, copy the data right away + * since the available bytes fits dsp_fragment_size, + * copy the data right away */ spin_lock_irqsave(&prtd->lock, flags); prtd->bytes_received += count; @@ -2118,7 +2170,7 @@ static int msm_compr_copy(struct snd_compr_stream *cstream, if (atomic_read(&prtd->xrun)) { pr_debug("%s: in xrun, count = %zd\n", __func__, count); bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available >= runtime->fragment_size) { + if (bytes_available >= prtd->dsp_fragment_size) { pr_debug("%s: handle xrun, bytes_to_write = %llu\n", __func__, bytes_available); From ab854ba1ef589ce705ef9b55221df252a633aa03 Mon Sep 17 00:00:00 2001 From: Sureshnaidu Laveti Date: Wed, 14 Sep 2016 07:03:44 -0700 Subject: [PATCH 0158/1015] msm: sensor: validate the i2c table index before use Verifying the i2c table index value before accessing the i2c table to avoid memory corruption issues. CRs-Fixed: 1065916 Change-Id: I0e31c22f90006f27a77cd420288334b8355cee95 Signed-off-by: Sureshnaidu Laveti --- .../msm/camera_v2/sensor/actuator/msm_actuator.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c index 0b3e4e1fcf049..bf39738885736 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c @@ -101,11 +101,6 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl, i2c_tbl = a_ctrl->i2c_reg_tbl; for (i = 0; i < size; i++) { - /* check that the index into i2c_tbl cannot grow larger that - the allocated size of i2c_tbl */ - if ((a_ctrl->total_steps + 1) < (a_ctrl->i2c_tbl_index)) - break; - if (write_arr[i].reg_write_type == MSM_ACTUATOR_WRITE_DAC) { value = (next_lens_position << write_arr[i].data_shift) | @@ -119,6 +114,11 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl, i2c_byte2 = value & 0xFF; CDBG("byte1:0x%x, byte2:0x%x\n", i2c_byte1, i2c_byte2); + if (a_ctrl->i2c_tbl_index > + a_ctrl->total_steps) { + pr_err("failed:i2c table index out of bound\n"); + break; + } i2c_tbl[a_ctrl->i2c_tbl_index]. reg_addr = i2c_byte1; i2c_tbl[a_ctrl->i2c_tbl_index]. @@ -139,6 +139,10 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl, i2c_byte2 = (hw_dword & write_arr[i].hw_mask) >> write_arr[i].hw_shift; } + if (a_ctrl->i2c_tbl_index > a_ctrl->total_steps) { + pr_err("failed: i2c table index out of bound\n"); + break; + } CDBG("i2c_byte1:0x%x, i2c_byte2:0x%x\n", i2c_byte1, i2c_byte2); i2c_tbl[a_ctrl->i2c_tbl_index].reg_addr = i2c_byte1; i2c_tbl[a_ctrl->i2c_tbl_index].reg_data = i2c_byte2; From f4034db5ca63ee37fd5c78d347d339b68e65b384 Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Fri, 2 Sep 2016 09:52:33 +0800 Subject: [PATCH 0159/1015] ASoC: msm: qdsp6v2: check if buf is null before using it buf returned from q6asm_shared_io_buf could be null and it could cause crash. Check if buf is null before using it to avoid crash. CRs-Fixed: 1046606 Change-Id: Ia988b11ff7d03edc4ddd959571da1378da62077c Signed-off-by: Meng Wang --- sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c b/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c index 05c5e1e8a50ac..06123184fc034 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c @@ -375,6 +375,11 @@ static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) q6asm_cmd(prtd->audio_client, CMD_PAUSE); q6asm_cmd(prtd->audio_client, CMD_FLUSH); buf = q6asm_shared_io_buf(prtd->audio_client, dir); + if (buf == NULL) { + pr_err("%s: shared IO buffer is null\n", __func__); + ret = -EINVAL; + break; + } memset(buf->data, 0, buf->actual_size); break; case SNDRV_PCM_TRIGGER_SUSPEND: From 5c38194957f826c206f2851f9de3947191087c2b Mon Sep 17 00:00:00 2001 From: Dhoat Harpal Date: Wed, 4 May 2016 17:02:04 +0530 Subject: [PATCH 0160/1015] soc: qcom: glink_ssr: Fix uninitialized variable Initialize ss_info_leaf variable in glink_ssr_probe. CRs-Fixed: 1067981 Change-Id: I82b08ff548a9abb0538a0ba24f699a99547ec7b7 Signed-off-by: Dhoat Harpal --- drivers/soc/qcom/glink_ssr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/soc/qcom/glink_ssr.c b/drivers/soc/qcom/glink_ssr.c index 4952e12ffe3c1..a14d912b7536f 100644 --- a/drivers/soc/qcom/glink_ssr.c +++ b/drivers/soc/qcom/glink_ssr.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -769,7 +769,7 @@ static int glink_ssr_probe(struct platform_device *pdev) struct device_node *phandle_node; struct restart_notifier_block *nb; struct subsys_info *ss_info; - struct subsys_info_leaf *ss_info_leaf; + struct subsys_info_leaf *ss_info_leaf = NULL; struct glink_link_info *link_info; char *key; const char *edge; From 6c7fbc2c02997c591ce0df35c27144103791113b Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Wed, 1 Jun 2016 11:55:07 +0200 Subject: [PATCH 0161/1015] sched: panic on corrupted stack end Until now, hitting this BUG_ON caused a recursive oops (because oops handling involves do_exit(), which calls into the scheduler, which in turn raises an oops), which caused stuff below the stack to be overwritten until a panic happened (e.g. via an oops in interrupt context, caused by the overwritten CPU index in the thread_info). Just panic directly. Change-Id: Id8d9bee96902bfefdc1d0d34cf98f3fd88f370f2 Signed-off-by: Jann Horn Signed-off-by: Linus Torvalds Signed-off-by: Dennis Cagle Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 29d6455178a09e1dc340380c582b13356227e8df [pkondeti@codeaurora.org: applied the fix for QHMP scheduler files] Signed-off-by: Pavankumar Kondeti --- kernel/sched/qhmp_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/sched/qhmp_core.c b/kernel/sched/qhmp_core.c index 6095a74c107dd..5d947612d347f 100644 --- a/kernel/sched/qhmp_core.c +++ b/kernel/sched/qhmp_core.c @@ -4526,7 +4526,8 @@ static noinline void __schedule_bug(struct task_struct *prev) static inline void schedule_debug(struct task_struct *prev) { #ifdef CONFIG_SCHED_STACK_END_CHECK - BUG_ON(unlikely(task_stack_end_corrupted(prev))); + if (unlikely(task_stack_end_corrupted(prev))) + panic("corrupted stack end detected inside scheduler\n"); #endif /* * Test if we are atomic. Since do_exit() needs to call into From 41e394cf1185883d5986e84ff68ded3f2ee7798d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= Date: Mon, 7 Mar 2016 21:15:36 +0100 Subject: [PATCH 0162/1015] cdc_ncm: do not call usbnet_link_change from cdc_ncm_bind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit usbnet_link_change will call schedule_work and should be avoided if bind is failing. Otherwise we will end up with scheduled work referring to a netdev which has gone away. Instead of making the call conditional, we can just defer it to usbnet_probe, using the driver_info flag made for this purpose. Conflicts: drivers/net/usb/cdc_ncm.c Fixes: 8a34b0ae8778 ("usbnet: cdc_ncm: apply usbnet_link_change") Reported-by: Andrey Konovalov Suggested-by: Linus Torvalds Signed-off-by: Bjørn Mork Signed-off-by: David S. Miller Signed-off-by: Dennis Cagle Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 4d06dd537f95683aba3651098ae288b7cbff8274 (cherry picked from commit 4d06dd537f95683aba3651098ae288b7cbff8274) Change-Id: I0052ab287e40bac491a55f324eca4917cf9980ae --- drivers/net/usb/cdc_ncm.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index 8067b8fbb0eea..ba31ecde1f72d 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c @@ -948,23 +948,15 @@ EXPORT_SYMBOL_GPL(cdc_ncm_select_altsetting); static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf) { - int ret; - /* MBIM backwards compatible function? */ if (cdc_ncm_select_altsetting(intf) != CDC_NCM_COMM_ALTSETTING_NCM) return -ENODEV; - /* The NCM data altsetting is fixed */ - ret = cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM); - - /* - * We should get an event when network connection is "connected" or - * "disconnected". Set network connection in "disconnected" state - * (carrier is OFF) during attach, so the IP network stack does not - * start IPv6 negotiation and more. + /* The NCM data altsetting is fixed, so we hard-coded it. + * Additionally, generic NCM devices are assumed to accept arbitrarily + * placed NDP. */ - usbnet_link_change(dev, 0, 0); - return ret; + return cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM); } static void cdc_ncm_align_tail(struct sk_buff *skb, size_t modulus, size_t remainder, size_t max) @@ -1506,7 +1498,8 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb) static const struct driver_info cdc_ncm_info = { .description = "CDC NCM", - .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET, + .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET + | FLAG_LINK_INTR, .bind = cdc_ncm_bind, .unbind = cdc_ncm_unbind, .manage_power = usbnet_manage_power, @@ -1519,7 +1512,7 @@ static const struct driver_info cdc_ncm_info = { static const struct driver_info wwan_info = { .description = "Mobile Broadband Network Device", .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET - | FLAG_WWAN, + | FLAG_LINK_INTR | FLAG_WWAN, .bind = cdc_ncm_bind, .unbind = cdc_ncm_unbind, .manage_power = usbnet_manage_power, @@ -1532,7 +1525,7 @@ static const struct driver_info wwan_info = { static const struct driver_info wwan_noarp_info = { .description = "Mobile Broadband Network Device (NO ARP)", .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET - | FLAG_WWAN | FLAG_NOARP, + | FLAG_LINK_INTR | FLAG_WWAN | FLAG_NOARP, .bind = cdc_ncm_bind, .unbind = cdc_ncm_unbind, .manage_power = usbnet_manage_power, From 4764e30e35e7fc20fc6bda6f3ea2282ae330abb0 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Mon, 19 Sep 2016 17:01:58 +0530 Subject: [PATCH 0163/1015] Revert "msm: kgsl: Add 1M and 8K pools to the allocator" This reverts commit 'eeaa9b10377afde8b41ae5c96db2dda6ed4f2833'. Remove upfront memory allocations to increase free memory after boot up. CRs-Fixed: 1064046 Change-Id: Ib94a0ee643d78a7a9171b6902103820ed90e40bb Signed-off-by: Hareesh Gundu --- drivers/gpu/msm/kgsl_pool.c | 158 ++++++------------------------- drivers/gpu/msm/kgsl_pool.h | 4 +- drivers/gpu/msm/kgsl_sharedmem.c | 85 +++++++++++++---- 3 files changed, 100 insertions(+), 147 deletions(-) diff --git a/drivers/gpu/msm/kgsl_pool.c b/drivers/gpu/msm/kgsl_pool.c index f5402fdc7e572..214bd50a6bb4e 100644 --- a/drivers/gpu/msm/kgsl_pool.c +++ b/drivers/gpu/msm/kgsl_pool.c @@ -21,21 +21,18 @@ #include "kgsl_device.h" #include "kgsl_pool.h" -/** - * struct kgsl_page_pool - Structure to hold information for the pool - * @pool_order: Page order describing the size of the page - * @page_count: Number of pages currently present in the pool - * @reserved_pages: Number of pages reserved at init for the pool - * @allocation_allowed: Tells if reserved pool gets exhausted, can we allocate - * from system memory - * @list_lock: Spinlock for page list in the pool - * @page_list: List of pages held/reserved in this pool +/* + * Maximum pool size in terms of pages + * = (Number of pools * Max size per pool) */ +#define KGSL_POOL_MAX_PAGES (2 * 4096) + +/* Set the max pool size to 8192 pages */ +static unsigned int kgsl_pool_max_pages = KGSL_POOL_MAX_PAGES; + struct kgsl_page_pool { unsigned int pool_order; int page_count; - unsigned int reserved_pages; - bool allocation_allowed; spinlock_t list_lock; struct list_head page_list; }; @@ -43,34 +40,15 @@ struct kgsl_page_pool { static struct kgsl_page_pool kgsl_pools[] = { { .pool_order = 0, - .reserved_pages = 2048, - .allocation_allowed = true, .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[0].list_lock), .page_list = LIST_HEAD_INIT(kgsl_pools[0].page_list), }, #ifndef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS { - .pool_order = 1, - .reserved_pages = 1024, - .allocation_allowed = true, + .pool_order = 4, .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[1].list_lock), .page_list = LIST_HEAD_INIT(kgsl_pools[1].page_list), }, - { - .pool_order = 4, - .reserved_pages = 256, - .allocation_allowed = false, - .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[2].list_lock), - .page_list = LIST_HEAD_INIT(kgsl_pools[2].page_list), - }, - { - .pool_order = 8, - .reserved_pages = 32, - .allocation_allowed = false, - .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[3].list_lock), - .page_list = LIST_HEAD_INIT(kgsl_pools[3].page_list), - }, - #endif }; @@ -90,28 +68,10 @@ _kgsl_get_pool_from_order(unsigned int order) return NULL; } -/* Map the page into kernel and zero it out */ -static void -_kgsl_pool_zero_page(struct page *p, unsigned int pool_order) -{ - int i; - - for (i = 0; i < (1 << pool_order); i++) { - struct page *page = nth_page(p, i); - void *addr = kmap_atomic(page); - - memset(addr, 0, PAGE_SIZE); - dmac_flush_range(addr, addr + PAGE_SIZE); - kunmap_atomic(addr); - } -} - /* Add a page to specified pool */ static void _kgsl_pool_add_page(struct kgsl_page_pool *pool, struct page *p) { - _kgsl_pool_zero_page(p, pool->pool_order); - spin_lock(&pool->list_lock); list_add_tail(&p->lru, &pool->page_list); pool->page_count++; @@ -196,28 +156,20 @@ _kgsl_pool_shrink(struct kgsl_page_pool *pool, int num_pages) * (current_pool_size - target_pages) pages from pool * starting from higher order pool. */ -static unsigned long -kgsl_pool_reduce(unsigned int target_pages, bool exit) +static int +kgsl_pool_reduce(unsigned int target_pages) { int total_pages = 0; int i; int nr_removed; struct kgsl_page_pool *pool; - unsigned long pcount = 0; + unsigned int pcount = 0; total_pages = kgsl_pool_size_total(); for (i = (KGSL_NUM_POOLS - 1); i >= 0; i--) { pool = &kgsl_pools[i]; - /* - * Only reduce the pool sizes for pools which are allowed to - * allocate memory unless we are at close, in which case the - * reserved memory for all pools needs to be freed - */ - if (!pool->allocation_allowed && !exit) - continue; - total_pages -= pcount; nr_removed = total_pages - target_pages; @@ -296,16 +248,6 @@ void kgsl_pool_free_pages(struct page **pages, unsigned int pcount) kgsl_pool_free_page(p); } } -static int kgsl_pool_idx_lookup(unsigned int order) -{ - int i; - - for (i = 0; i < KGSL_NUM_POOLS; i++) - if (order == kgsl_pools[i].pool_order) - return i; - - return -ENOMEM; -} /** * kgsl_pool_alloc_page() - Allocate a page of requested size @@ -316,56 +258,37 @@ static int kgsl_pool_idx_lookup(unsigned int order) * * Return total page count on success and negative value on failure */ -int kgsl_pool_alloc_page(int *page_size, struct page **pages, - unsigned int pages_len, unsigned int *align) +int kgsl_pool_alloc_page(int page_size, struct page **pages, + unsigned int pages_len) { int j; int pcount = 0; struct kgsl_page_pool *pool; struct page *page = NULL; struct page *p = NULL; - int order = get_order(*page_size); - int pool_idx; - if ((pages == NULL) || pages_len < (*page_size >> PAGE_SHIFT)) + if ((pages == NULL) || pages_len < (page_size >> PAGE_SHIFT)) return -EINVAL; - pool = _kgsl_get_pool_from_order(order); + pool = _kgsl_get_pool_from_order(get_order(page_size)); + if (pool == NULL) return -EINVAL; - pool_idx = kgsl_pool_idx_lookup(order); page = _kgsl_pool_get_page(pool); /* Allocate a new page if not allocated from pool */ if (page == NULL) { - gfp_t gfp_mask = kgsl_gfp_mask(order); - - /* Only allocate non-reserved memory for certain pools */ - if (!pool->allocation_allowed && pool_idx > 0) { - *page_size = PAGE_SIZE << - kgsl_pools[pool_idx-1].pool_order; - *align = ilog2(*page_size); - return -EAGAIN; - } + gfp_t gfp_mask = kgsl_gfp_mask(get_order(page_size)); - page = alloc_pages(gfp_mask, order); - - if (!page) { - if (pool_idx > 0) { - /* Retry with lower order pages */ - *page_size = PAGE_SIZE << - kgsl_pools[pool_idx-1].pool_order; - *align = ilog2(*page_size); - return -EAGAIN; - } else - return -ENOMEM; - } + page = alloc_pages(gfp_mask, + get_order(page_size)); - _kgsl_pool_zero_page(page, order); + if (!page) + return -ENOMEM; } - for (j = 0; j < (*page_size >> PAGE_SHIFT); j++) { + for (j = 0; j < (page_size >> PAGE_SHIFT); j++) { p = nth_page(page, j); pages[pcount] = p; pcount++; @@ -384,34 +307,18 @@ void kgsl_pool_free_page(struct page *page) page_order = compound_order(page); - pool = _kgsl_get_pool_from_order(page_order); - if (pool != NULL) { - _kgsl_pool_add_page(pool, page); - return; + if (kgsl_pool_size_total() < kgsl_pool_max_pages) { + pool = _kgsl_get_pool_from_order(page_order); + if (pool != NULL) { + _kgsl_pool_add_page(pool, page); + return; + } } /* Give back to system as not added to pool */ __free_pages(page, page_order); } -static void kgsl_pool_reserve_pages(void) -{ - int i, j; - - for (i = 0; i < KGSL_NUM_POOLS; i++) { - struct page *page; - - for (j = 0; j < kgsl_pools[i].reserved_pages; j++) { - int order = kgsl_pools[i].pool_order; - gfp_t gfp_mask = kgsl_gfp_mask(order); - - page = alloc_pages(gfp_mask, order); - if (page != NULL) - _kgsl_pool_add_page(&kgsl_pools[i], page); - } - } -} - /* Functions for the shrinker */ static unsigned long @@ -426,7 +333,7 @@ kgsl_pool_shrink_scan_objects(struct shrinker *shrinker, int target_pages = (nr > total_pages) ? 0 : (total_pages - nr); /* Reduce pool size to target_pages */ - return kgsl_pool_reduce(target_pages, false); + return kgsl_pool_reduce(target_pages); } static unsigned long @@ -447,9 +354,6 @@ static struct shrinker kgsl_pool_shrinker = { void kgsl_init_page_pools(void) { - /* Reserve the appropriate number of pages for each pool */ - kgsl_pool_reserve_pages(); - /* Initialize shrinker */ register_shrinker(&kgsl_pool_shrinker); } @@ -457,7 +361,7 @@ void kgsl_init_page_pools(void) void kgsl_exit_page_pools(void) { /* Release all pages in pools, if any.*/ - kgsl_pool_reduce(0, true); + kgsl_pool_reduce(0); /* Unregister shrinker */ unregister_shrinker(&kgsl_pool_shrinker); diff --git a/drivers/gpu/msm/kgsl_pool.h b/drivers/gpu/msm/kgsl_pool.h index 198e4fde74168..34ddbefa88cba 100644 --- a/drivers/gpu/msm/kgsl_pool.h +++ b/drivers/gpu/msm/kgsl_pool.h @@ -37,8 +37,8 @@ void kgsl_pool_free_sgt(struct sg_table *sgt); void kgsl_pool_free_pages(struct page **pages, unsigned int page_count); void kgsl_init_page_pools(void); void kgsl_exit_page_pools(void); -int kgsl_pool_alloc_page(int *page_size, struct page **pages, - unsigned int pages_len, unsigned int *align); +int kgsl_pool_alloc_page(int page_size, struct page **pages, + unsigned int pages_len); void kgsl_pool_free_page(struct page *p); #endif /* __KGSL_POOL_H */ diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 73edc3f7e1465..610a9abbf69d6 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -620,14 +620,8 @@ EXPORT_SYMBOL(kgsl_cache_range_op); #ifndef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS static inline int get_page_size(size_t size, unsigned int align) { - if (align >= ilog2(SZ_1M) && size >= SZ_1M) - return SZ_1M; - else if (align >= ilog2(SZ_64K) && size >= SZ_64K) - return SZ_64K; - else if (align >= ilog2(SZ_8K) && size >= SZ_8K) - return SZ_8K; - else - return PAGE_SIZE; + return (align >= ilog2(SZ_64K) && size >= SZ_64K) + ? SZ_64K : PAGE_SIZE; } #else static inline int get_page_size(size_t size, unsigned int align) @@ -636,6 +630,56 @@ static inline int get_page_size(size_t size, unsigned int align) } #endif +static void kgsl_zero_pages(struct page **pages, unsigned int pcount) +{ + unsigned int j; + unsigned int step = ((VMALLOC_END - VMALLOC_START)/8) >> PAGE_SHIFT; + pgprot_t page_prot = pgprot_writecombine(PAGE_KERNEL); + void *ptr; + + /* + * All memory that goes to the user has to be zeroed out before it gets + * exposed to userspace. This means that the memory has to be mapped in + * the kernel, zeroed (memset) and then unmapped. This also means that + * the dcache has to be flushed to ensure coherency between the kernel + * and user pages. We used to pass __GFP_ZERO to alloc_page which mapped + * zeroed and unmaped each individual page, and then we had to turn + * around and call flush_dcache_page() on that page to clear the caches. + * This was killing us for performance. Instead, we found it is much + * faster to allocate the pages without GFP_ZERO, map a chunk of the + * range ('step' pages), memset it, flush it and then unmap + * - this results in a factor of 4 improvement for speed for large + * buffers. There is a small decrease in speed for small buffers, + * but only on the order of a few microseconds at best. The 'step' + * size is based on a guess at the amount of free vmalloc space, but + * will scale down if there's not enough free space. + */ + for (j = 0; j < pcount; j += step) { + step = min(step, pcount - j); + + ptr = vmap(&pages[j], step, VM_IOREMAP, page_prot); + + if (ptr != NULL) { + memset(ptr, 0, step * PAGE_SIZE); + dmac_flush_range(ptr, ptr + step * PAGE_SIZE); + vunmap(ptr); + } else { + int k; + /* Very, very, very slow path */ + + for (k = j; k < j + step; k++) { + ptr = kmap_atomic(pages[k]); + memset(ptr, 0, PAGE_SIZE); + dmac_flush_range(ptr, ptr + PAGE_SIZE); + kunmap_atomic(ptr); + } + /* scale down the step size to avoid this path */ + if (step > 1) + step >>= 1; + } + } +} + int kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, @@ -660,10 +704,8 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, * larger however to accomodate hardware quirks */ - if (align < ilog2(page_size)) { + if (align < ilog2(page_size)) kgsl_memdesc_set_align(memdesc, ilog2(page_size)); - align = ilog2(page_size); - } /* * There needs to be enough room in the page array to be able to @@ -695,13 +737,18 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, while (len > 0) { int page_count; - page_count = kgsl_pool_alloc_page(&page_size, + /* don't waste space at the end of the allocation*/ + if (len < page_size) + page_size = PAGE_SIZE; + + page_count = kgsl_pool_alloc_page(page_size, memdesc->pages + pcount, - len_alloc - pcount, - &align); + len_alloc - pcount); if (page_count <= 0) { - if (page_count == -EAGAIN) + if (page_size != PAGE_SIZE) { + page_size = PAGE_SIZE; continue; + } /* * Update sglen and memdesc size,as requested allocation @@ -723,9 +770,6 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, len -= page_size; memdesc->size += page_size; memdesc->page_count += page_count; - - /* Get the needed page size for the next iteration */ - page_size = get_page_size(len, align); } /* Call to the hypervisor to lock any secure buffer allocations */ @@ -783,6 +827,11 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, KGSL_STATS_ADD(memdesc->size, &kgsl_driver.stats.page_alloc, &kgsl_driver.stats.page_alloc_max); + /* + * Zero out the pages. + */ + kgsl_zero_pages(memdesc->pages, pcount); + done: if (ret) { if (memdesc->pages) { From 057d0ee842fd9e14e362d19e312564b3a6f30d39 Mon Sep 17 00:00:00 2001 From: Nikhilesh Reddy Date: Tue, 6 Sep 2016 16:03:07 -0700 Subject: [PATCH 0164/1015] fuse: Grab the fc->lock for inode updates in shortcircuit The function fsstack_copy_inode_size uses the inode->i_lock to serialize the inode updates. This lock is not used in the FUSE filesystem and thus it is not enough to just grab this lock before updating a FUSE inode. Grab the fc->lock for inode updates in shortcircuit to ensure that there are no races between inode size updates in 32 bit architectures with SMP. Change-Id: I83cb2380b6ca56768c06e70ef1bf9ea3976b514a Signed-off-by: Nikhilesh Reddy --- fs/fuse/shortcircuit.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/fuse/shortcircuit.c b/fs/fuse/shortcircuit.c index 499e496005b5c..c657b170fb7e5 100644 --- a/fs/fuse/shortcircuit.c +++ b/fs/fuse/shortcircuit.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -58,10 +58,12 @@ static ssize_t fuse_shortcircuit_read_write_iter(struct kiocb *iocb, struct fuse_file *ff; struct file *fuse_file, *lower_file; struct inode *fuse_inode, *lower_inode; + struct fuse_conn *fc; ff = iocb->ki_filp->private_data; fuse_file = iocb->ki_filp; lower_file = ff->rw_lower_file; + fc = ff->fc; /* lock lower file to prevent it from being released */ get_file(lower_file); @@ -75,7 +77,9 @@ static ssize_t fuse_shortcircuit_read_write_iter(struct kiocb *iocb, ret_val = lower_file->f_op->write_iter(iocb, iter); if (ret_val >= 0 || ret_val == -EIOCBQUEUED) { + spin_lock(&fc->lock); fsstack_copy_inode_size(fuse_inode, lower_inode); + spin_unlock(&fc->lock); fsstack_copy_attr_times(fuse_inode, lower_inode); } } else { From 35b8157eeb555770454cc64a6152fa32ea37e601 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Mon, 19 Sep 2016 20:17:10 +0530 Subject: [PATCH 0165/1015] ARM: dts: msm: Add initial-powerlevel for speedbin config of MSM8917 Initial powerlevel is not defined for speedbin configuration. This will cause GPU to wake up at default power level NOM+ instead of SVS+. Add initial-powerlevel for MSM8917 GPU to wakeup at SVS+. CRs-Fixed: 1068696 Change-Id: I1606667e3b36c0d1d4ffd5922459aad49612a8cf Signed-off-by: Hareesh Gundu --- arch/arm/boot/dts/qcom/msm8917.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index c55049aa1fbff..14e5c3b6e9aaa 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -1763,6 +1763,7 @@ #size-cells = <0>; qcom,speed-bin = <0>; + qcom,initial-pwrlevel = <3>; /* TURBO */ qcom,gpu-pwrlevel@0 { @@ -1824,6 +1825,7 @@ #size-cells = <0>; qcom,speed-bin = <1>; + qcom,initial-pwrlevel = <3>; /* TURBO */ qcom,gpu-pwrlevel@0 { From e435cfc6acfa7c4c5cb428970b94254014077ed4 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Tue, 22 Mar 2016 18:02:49 +0100 Subject: [PATCH 0166/1015] netfilter: x_tables: validate e->target_offset early We should check that e->target_offset is sane before mark_source_chains gets called since it will fetch the target entry for loop detection. Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Dennis Cagle Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: bdf533de6968e9686df777dc178486f600c6e617 (cherry picked from commit bdf533de6968e9686df777dc178486f600c6e617) Change-Id: Id3ec56cdc333990d62c99d6c2e59dbcce633bcc1 --- net/ipv4/netfilter/arp_tables.c | 17 ++++++++--------- net/ipv4/netfilter/ip_tables.c | 17 ++++++++--------- net/ipv6/netfilter/ip6_tables.c | 17 ++++++++--------- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index c6a8e98dbe123..738e62d548ce7 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c @@ -470,14 +470,12 @@ static int mark_source_chains(const struct xt_table_info *newinfo, return 1; } -static inline int check_entry(const struct arpt_entry *e, const char *name) +static inline int check_entry(const struct arpt_entry *e) { const struct xt_entry_target *t; - if (!arp_checkentry(&e->arp)) { - duprintf("arp_tables: arp check failed %p %s.\n", e, name); + if (!arp_checkentry(&e->arp)) return -EINVAL; - } if (e->target_offset + sizeof(struct xt_entry_target) > e->next_offset) return -EINVAL; @@ -518,10 +516,6 @@ find_check_entry(struct arpt_entry *e, const char *name, unsigned int size) struct xt_target *target; int ret; - ret = check_entry(e, name); - if (ret) - return ret; - t = arpt_get_target(e); target = xt_request_find_target(NFPROTO_ARP, t->u.user.name, t->u.user.revision); @@ -566,6 +560,7 @@ static inline int check_entry_size_and_hooks(struct arpt_entry *e, unsigned int valid_hooks) { unsigned int h; + int err; if ((unsigned long)e % __alignof__(struct arpt_entry) != 0 || (unsigned char *)e + sizeof(struct arpt_entry) >= limit || @@ -581,6 +576,10 @@ static inline int check_entry_size_and_hooks(struct arpt_entry *e, return -EINVAL; } + err = check_entry(e); + if (err) + return err; + /* Check hooks & underflows */ for (h = 0; h < NF_ARP_NUMHOOKS; h++) { if (!(valid_hooks & (1 << h))) @@ -1239,7 +1238,7 @@ check_compat_entry_size_and_hooks(struct compat_arpt_entry *e, } /* For purposes of check_entry casting the compat entry is fine */ - ret = check_entry((struct arpt_entry *)e, name); + ret = check_entry((struct arpt_entry *)e); if (ret) return ret; diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 9bb6ca7cf5761..2c8fb724dde5d 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c @@ -564,14 +564,12 @@ static void cleanup_match(struct xt_entry_match *m, struct net *net) } static int -check_entry(const struct ipt_entry *e, const char *name) +check_entry(const struct ipt_entry *e) { const struct xt_entry_target *t; - if (!ip_checkentry(&e->ip)) { - duprintf("ip check failed %p %s.\n", e, name); + if (!ip_checkentry(&e->ip)) return -EINVAL; - } if (e->target_offset + sizeof(struct xt_entry_target) > e->next_offset) @@ -661,10 +659,6 @@ find_check_entry(struct ipt_entry *e, struct net *net, const char *name, struct xt_mtchk_param mtpar; struct xt_entry_match *ematch; - ret = check_entry(e, name); - if (ret) - return ret; - j = 0; mtpar.net = net; mtpar.table = name; @@ -728,6 +722,7 @@ check_entry_size_and_hooks(struct ipt_entry *e, unsigned int valid_hooks) { unsigned int h; + int err; if ((unsigned long)e % __alignof__(struct ipt_entry) != 0 || (unsigned char *)e + sizeof(struct ipt_entry) >= limit || @@ -743,6 +738,10 @@ check_entry_size_and_hooks(struct ipt_entry *e, return -EINVAL; } + err = check_entry(e); + if (err) + return err; + /* Check hooks & underflows */ for (h = 0; h < NF_INET_NUMHOOKS; h++) { if (!(valid_hooks & (1 << h))) @@ -1504,7 +1503,7 @@ check_compat_entry_size_and_hooks(struct compat_ipt_entry *e, } /* For purposes of check_entry casting the compat entry is fine */ - ret = check_entry((struct ipt_entry *)e, name); + ret = check_entry((struct ipt_entry *)e); if (ret) return ret; diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 2a0c4819e277a..bc0615b1cf63e 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c @@ -574,14 +574,12 @@ static void cleanup_match(struct xt_entry_match *m, struct net *net) } static int -check_entry(const struct ip6t_entry *e, const char *name) +check_entry(const struct ip6t_entry *e) { const struct xt_entry_target *t; - if (!ip6_checkentry(&e->ipv6)) { - duprintf("ip_tables: ip check failed %p %s.\n", e, name); + if (!ip6_checkentry(&e->ipv6)) return -EINVAL; - } if (e->target_offset + sizeof(struct xt_entry_target) > e->next_offset) @@ -672,10 +670,6 @@ find_check_entry(struct ip6t_entry *e, struct net *net, const char *name, struct xt_mtchk_param mtpar; struct xt_entry_match *ematch; - ret = check_entry(e, name); - if (ret) - return ret; - j = 0; mtpar.net = net; mtpar.table = name; @@ -739,6 +733,7 @@ check_entry_size_and_hooks(struct ip6t_entry *e, unsigned int valid_hooks) { unsigned int h; + int err; if ((unsigned long)e % __alignof__(struct ip6t_entry) != 0 || (unsigned char *)e + sizeof(struct ip6t_entry) >= limit || @@ -754,6 +749,10 @@ check_entry_size_and_hooks(struct ip6t_entry *e, return -EINVAL; } + err = check_entry(e); + if (err) + return err; + /* Check hooks & underflows */ for (h = 0; h < NF_INET_NUMHOOKS; h++) { if (!(valid_hooks & (1 << h))) @@ -1516,7 +1515,7 @@ check_compat_entry_size_and_hooks(struct compat_ip6t_entry *e, } /* For purposes of check_entry casting the compat entry is fine */ - ret = check_entry((struct ip6t_entry *)e, name); + ret = check_entry((struct ip6t_entry *)e); if (ret) return ret; From 72cbf5d1afe529c317b8fe3fa789a035819c37ce Mon Sep 17 00:00:00 2001 From: Alok Kediya Date: Fri, 29 Jul 2016 20:07:47 +0530 Subject: [PATCH 0167/1015] msm:isp: add recovery method in case of pingpong mismatch. restart the VFE in case of pingpong mismatch. Change-Id: I38482aeb8d03c81a1ebe91ba895916fc5064e8aa Signed-off-by: Alok Kediya --- .../platform/msm/camera_v2/isp/msm_isp.h | 5 +++++ .../platform/msm/camera_v2/isp/msm_isp40.c | 4 ++-- .../platform/msm/camera_v2/isp/msm_isp44.c | 4 ++-- .../platform/msm/camera_v2/isp/msm_isp46.c | 4 ++-- .../platform/msm/camera_v2/isp/msm_isp47.c | 4 ++-- .../msm/camera_v2/isp/msm_isp_axi_util.c | 20 +++++++++++++++-- .../msm/camera_v2/isp/msm_isp_stats_util.c | 2 +- .../platform/msm/camera_v2/isp/msm_isp_util.c | 22 +++++++++++++++---- .../platform/msm/camera_v2/isp/msm_isp_util.h | 4 ++++ 9 files changed, 54 insertions(+), 15 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h index 6b82ee95dda65..1beb2c2943c92 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h @@ -64,6 +64,7 @@ #define MAX_BUFFERS_IN_HW 2 #define MAX_VFE 2 +#define MAX_RECOVERY_THRESHOLD 5 struct vfe_device; struct msm_vfe_axi_stream; @@ -514,6 +515,7 @@ struct msm_vfe_axi_shared_data { uint32_t event_mask; uint8_t enable_frameid_recovery; enum msm_vfe_camif_state camif_state; + uint32_t recovery_count; }; struct msm_vfe_stats_hardware_info { @@ -769,6 +771,9 @@ struct vfe_device { /* irq info */ uint32_t irq0_mask; uint32_t irq1_mask; + /* before halt irq info */ + uint32_t recovery_irq0_mask; + uint32_t recovery_irq1_mask; }; struct vfe_parent_device { diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index 18982f5230d64..1edaf323bc334 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -1841,8 +1841,8 @@ static int msm_vfe40_axi_restart(struct vfe_device *vfe_dev, /* Start AXI */ msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x2C0); - msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, - vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); + msm_vfe40_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); memset(&vfe_dev->error_info, 0, sizeof(vfe_dev->error_info)); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c index debd2f4714d3b..d42d769d892c0 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c @@ -1376,8 +1376,8 @@ static int msm_vfe44_axi_restart(struct vfe_device *vfe_dev, /* Start AXI */ msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x2C0); - msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask, - MSM_ISP_IRQ_SET); + msm_vfe44_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); memset(&vfe_dev->error_info, 0, sizeof(vfe_dev->error_info)); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c index ca75a47eddb28..d7883b6ee6298 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c @@ -1470,8 +1470,8 @@ static int msm_vfe46_axi_restart(struct vfe_device *vfe_dev, memset(&vfe_dev->error_info, 0, sizeof(vfe_dev->error_info)); atomic_set(&vfe_dev->error_info.overflow_state, NO_OVERFLOW); - msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, - vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); + msm_vfe46_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c index f08d6ededa94e..0665b28187c40 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c @@ -1847,8 +1847,8 @@ int msm_vfe47_axi_restart(struct vfe_device *vfe_dev, atomic_set(&vfe_dev->error_info.overflow_state, NO_OVERFLOW); /* reset the irq masks without camif violation and errors */ - msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, - vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); + msm_vfe47_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index a0869477bcfc8..627f9481c5be0 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -1528,6 +1528,22 @@ void msm_isp_halt_send_error(struct vfe_device *vfe_dev, uint32_t event) uint32_t i = 0; struct msm_isp_event_data error_event; struct msm_vfe_axi_halt_cmd halt_cmd; + uint32_t irq_status0, irq_status1; + + if (ISP_EVENT_PING_PONG_MISMATCH == event && + vfe_dev->axi_data.recovery_count < MAX_RECOVERY_THRESHOLD) { + vfe_dev->hw_info->vfe_ops.irq_ops. + read_irq_status(vfe_dev, &irq_status0, &irq_status1); + pr_err("%s:pingpong mismatch from vfe%d, core%d, recovery_count %d\n", + __func__, vfe_dev->pdev->id, smp_processor_id(), + vfe_dev->axi_data.recovery_count); + + vfe_dev->axi_data.recovery_count++; + + msm_isp_process_overflow_irq(vfe_dev, + &irq_status0, &irq_status1, 1); + return; + } memset(&halt_cmd, 0, sizeof(struct msm_vfe_axi_halt_cmd)); memset(&error_event, 0, sizeof(struct msm_isp_event_data)); @@ -1535,7 +1551,7 @@ void msm_isp_halt_send_error(struct vfe_device *vfe_dev, uint32_t event) halt_cmd.overflow_detected = 0; halt_cmd.blocking_halt = 0; - pr_err("%s: vfe%d fatal error!\n", __func__, vfe_dev->pdev->id); + pr_err("%s: vfe%d exiting camera!\n", __func__, vfe_dev->pdev->id); atomic_set(&vfe_dev->error_info.overflow_state, HALT_ENFORCED); @@ -3706,7 +3722,7 @@ void msm_isp_process_axi_irq_stream(struct vfe_device *vfe_dev, if (rc < 0) { spin_unlock_irqrestore(&stream_info->lock, flags); /* this usually means a serious scheduling error */ - msm_isp_halt_send_error(vfe_dev, ISP_EVENT_BUF_FATAL_ERROR); + msm_isp_halt_send_error(vfe_dev, ISP_EVENT_PING_PONG_MISMATCH); return; } /* diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c index 92ff59ca1468b..6f95d75ce58df 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c @@ -202,7 +202,7 @@ static int32_t msm_isp_stats_buf_divert(struct vfe_device *vfe_dev, if (rc < 0) { if (rc == -EFAULT) msm_isp_halt_send_error(vfe_dev, - ISP_EVENT_BUF_FATAL_ERROR); + ISP_EVENT_PING_PONG_MISMATCH); pr_err("stats_buf_divert: update put buf cnt fail\n"); return rc; } diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index 6e92463683cd6..3585ee5668103 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -1739,9 +1739,10 @@ static inline void msm_isp_update_error_info(struct vfe_device *vfe_dev, vfe_dev->error_info.error_count++; } -static void msm_isp_process_overflow_irq( +void msm_isp_process_overflow_irq( struct vfe_device *vfe_dev, - uint32_t *irq_status0, uint32_t *irq_status1) + uint32_t *irq_status0, uint32_t *irq_status1, + uint32_t force_overflow) { uint32_t overflow_mask; @@ -1764,7 +1765,8 @@ static void msm_isp_process_overflow_irq( /*Check if any overflow bit is set*/ vfe_dev->hw_info->vfe_ops.core_ops. get_overflow_mask(&overflow_mask); - overflow_mask &= *irq_status1; + if (!force_overflow) + overflow_mask &= *irq_status1; if (overflow_mask) { struct msm_isp_event_data error_event; @@ -1783,15 +1785,27 @@ static void msm_isp_process_overflow_irq( /* maks off irq for current vfe */ atomic_cmpxchg(&vfe_dev->error_info.overflow_state, NO_OVERFLOW, OVERFLOW_DETECTED); + vfe_dev->recovery_irq0_mask = vfe_dev->irq0_mask; + vfe_dev->recovery_irq1_mask = vfe_dev->irq1_mask; + vfe_dev->hw_info->vfe_ops.core_ops. set_halt_restart_mask(vfe_dev); /* mask off other vfe if dual vfe is used */ if (vfe_dev->is_split) { uint32_t other_vfe_id; + struct vfe_device *other_vfe_dev; other_vfe_id = (vfe_dev->pdev->id == ISP_VFE0) ? ISP_VFE1 : ISP_VFE0; + other_vfe_dev = vfe_dev->common_data-> + dual_vfe_res->vfe_dev[other_vfe_id]; + if (other_vfe_dev) { + other_vfe_dev->recovery_irq0_mask = + other_vfe_dev->irq0_mask; + other_vfe_dev->recovery_irq1_mask = + other_vfe_dev->irq1_mask; + } atomic_cmpxchg(&(vfe_dev->common_data->dual_vfe_res-> vfe_dev[other_vfe_id]-> @@ -1877,7 +1891,7 @@ irqreturn_t msm_isp_process_irq(int irq_num, void *data) ping_pong_status = vfe_dev->hw_info->vfe_ops.axi_ops. get_pingpong_status(vfe_dev); msm_isp_process_overflow_irq(vfe_dev, - &irq_status0, &irq_status1); + &irq_status0, &irq_status1, 0); vfe_dev->hw_info->vfe_ops.core_ops. get_error_mask(&error_mask0, &error_mask1); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h index a7b36c561f367..9d68fecafaa0a 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h @@ -74,4 +74,8 @@ void msm_isp_save_framedrop_values(struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src); void msm_isp_get_timestamp(struct msm_isp_timestamp *time_stamp, struct vfe_device *vfe_dev); +void msm_isp_process_overflow_irq( + struct vfe_device *vfe_dev, + uint32_t *irq_status0, uint32_t *irq_status1, + uint32_t force_overflow); #endif /* __MSM_ISP_UTIL_H__ */ From 2ada5cd04bb7c9def302da1463c6e33493934359 Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Wed, 1 Jun 2016 11:55:07 +0200 Subject: [PATCH 0168/1015] sched: panic on corrupted stack end Until now, hitting this BUG_ON caused a recursive oops (because oops handling involves do_exit(), which calls into the scheduler, which in turn raises an oops), which caused stuff below the stack to be overwritten until a panic happened (e.g. via an oops in interrupt context, caused by the overwritten CPU index in the thread_info). Just panic directly. Change-Id: Id8d9bee96902bfefdc1d0d34cf98f3fd88f370f2 Signed-off-by: Jann Horn Signed-off-by: Linus Torvalds Signed-off-by: Dennis Cagle Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 29d6455178a09e1dc340380c582b13356227e8df [pkondeti@codeaurora.org: applied the fix for QHMP scheduler files] Signed-off-by: Pavankumar Kondeti --- kernel/sched/qhmp_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/sched/qhmp_core.c b/kernel/sched/qhmp_core.c index 9925058aab334..ac9d94d23b026 100644 --- a/kernel/sched/qhmp_core.c +++ b/kernel/sched/qhmp_core.c @@ -4526,7 +4526,8 @@ static noinline void __schedule_bug(struct task_struct *prev) static inline void schedule_debug(struct task_struct *prev) { #ifdef CONFIG_SCHED_STACK_END_CHECK - BUG_ON(unlikely(task_stack_end_corrupted(prev))); + if (unlikely(task_stack_end_corrupted(prev))) + panic("corrupted stack end detected inside scheduler\n"); #endif /* * Test if we are atomic. Since do_exit() needs to call into From 1071800e885c0cee4dba8c06fbf312a98d62781e Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Fri, 19 Aug 2016 12:16:03 +0530 Subject: [PATCH 0169/1015] regulator: cpr3: fix panic callback failure in interrupt context The kernel panic could happen in CPU interrupt context. CPR3 panic callback function does ioremap which cannot be executed in an interrupt context. Fix the issue by doing a ioremap during driver initialization. CRs-Fixed: 1056786 Change-Id: I191127fafb26bcf10ea25f972fe5af122debf292 Signed-off-by: Tirupathi Reddy --- drivers/regulator/cpr3-regulator.c | 5 +---- drivers/regulator/cpr3-regulator.h | 2 ++ drivers/regulator/cpr3-util.c | 6 ++++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/regulator/cpr3-regulator.c b/drivers/regulator/cpr3-regulator.c index 95069c02d4fbb..13f07ef784c81 100644 --- a/drivers/regulator/cpr3-regulator.c +++ b/drivers/regulator/cpr3-regulator.c @@ -5891,14 +5891,11 @@ static int cpr3_panic_callback(struct notifier_block *nfb, struct cpr3_controller, panic_notifier); struct cpr3_panic_regs_info *regs_info = ctrl->panic_regs_info; struct cpr3_reg_info *reg; - void __iomem *virt_addr; int i = 0; for (i = 0; i < regs_info->reg_count; i++) { reg = &(regs_info->regs[i]); - virt_addr = ioremap(reg->addr, 0x4); - reg->value = readl_relaxed(virt_addr); - iounmap(virt_addr); + reg->value = readl_relaxed(reg->virt_addr); pr_err("%s[0x%08x] = 0x%08x\n", reg->name, reg->addr, reg->value); } diff --git a/drivers/regulator/cpr3-regulator.h b/drivers/regulator/cpr3-regulator.h index 8bcbc67eecdc0..9861ecf2f7a20 100644 --- a/drivers/regulator/cpr3-regulator.h +++ b/drivers/regulator/cpr3-regulator.h @@ -498,6 +498,7 @@ struct cpr3_aging_sensor_info { * @name: Register name * @addr: Register physical address * @value: Register content + * @virt_addr: Register virtual address * * This data structure is used to dump some critical register contents * when the device crashes due to a kernel panic. @@ -506,6 +507,7 @@ struct cpr3_reg_info { const char *name; u32 addr; u32 value; + void __iomem *virt_addr; }; /** diff --git a/drivers/regulator/cpr3-util.c b/drivers/regulator/cpr3-util.c index 58226cd638550..69d9c7fff32b4 100644 --- a/drivers/regulator/cpr3-util.c +++ b/drivers/regulator/cpr3-util.c @@ -1087,6 +1087,12 @@ static int cpr3_panic_notifier_init(struct cpr3_controller *ctrl) rc); return rc; } + regs[i].virt_addr = devm_ioremap(ctrl->dev, regs[i].addr, 0x4); + if (!regs[i].virt_addr) { + pr_err("Unable to map panic register addr 0x%08x\n", + regs[i].addr); + return -EINVAL; + } regs[i].value = 0xFFFFFFFF; } From 5cf0a35dd79cb4c868fd66727487ed759ab68291 Mon Sep 17 00:00:00 2001 From: Vishnuvardhan Prodduturi Date: Fri, 23 Sep 2016 14:36:54 +0530 Subject: [PATCH 0170/1015] msm: msm_dba: Initialize edid_addr variable Initialize edid_addr variable to avoid potential uninitialized variable access and its side effects. Change-Id: I12b24f92c54c36029bbcc22a83b7eb78271781c4 Signed-off-by: Vishnuvardhan Prodduturi --- drivers/video/msm/msm_dba/adv7533.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/video/msm/msm_dba/adv7533.c b/drivers/video/msm/msm_dba/adv7533.c index 8d2fb69333352..a644a559fc7c5 100644 --- a/drivers/video/msm/msm_dba/adv7533.c +++ b/drivers/video/msm/msm_dba/adv7533.c @@ -728,7 +728,7 @@ static void adv7533_notify_clients(struct msm_dba_device_info *dev, u32 adv7533_read_edid(struct adv7533 *pdata, u32 size, char *edid_buf) { u32 ret = 0, read_size = size / 2; - u8 edid_addr; + u8 edid_addr = 0; int ndx; if (!pdata || !edid_buf) From d3b7979a83e2dd49c7f67a0c151945079a1601ec Mon Sep 17 00:00:00 2001 From: Sandeep Panda Date: Tue, 6 Sep 2016 21:58:38 +0530 Subject: [PATCH 0171/1015] msm: mdss: enable tearcheck while entering LP1 state In current implementation we disable tear check block when transitioning into ultra low power or power off state for doze mode. But it is not enabled back when moving from ultra low power state(LP2) to low power state(LP1), after which updates are expected. This change enables back tearcheck block when transitioning to LP1 from LP2 state. Change-Id: Ic0d8f97752ccf88470da2423f3f8d56a32de227f Signed-off-by: Sandeep Panda --- drivers/video/msm/mdss/mdss_mdp_intf_cmd.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c index aa70b44fdcb2b..1be38e27989a1 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c @@ -3008,7 +3008,11 @@ int mdss_mdp_cmd_stop(struct mdss_mdp_ctl *ctl, int panel_power_state) ctx->intf_stopped = 0; if (sctx) sctx->intf_stopped = 0; - + /* + * Tearcheck was disabled while entering LP2 state. + * Enable it back to allow updates in LP1 state. + */ + mdss_mdp_tearcheck_enable(ctl, true); goto end; } } From 4c1d6e4116d511cd377bdc4e999180000f76e705 Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Fri, 2 Sep 2016 15:58:21 +0530 Subject: [PATCH 0172/1015] msm: mdss: fix conditional check for panel LP configuration Add change to correct the conditional check for entering the panel in and out of LP configurations. Remove the unused enum structure related to panel blank status. Change-Id: Ic1140eafcc7cdd8d64c107bddc824eeca844462d Signed-off-by: Padmanabhan Komanduru --- drivers/video/msm/mdss/mdss_dsi.c | 9 +++++++-- drivers/video/msm/mdss/mdss_dsi.h | 1 + drivers/video/msm/mdss/mdss_panel.h | 6 ------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c index 22a9ca7fc90b3..b0ad043b2053e 100644 --- a/drivers/video/msm/mdss/mdss_dsi.c +++ b/drivers/video/msm/mdss/mdss_dsi.c @@ -1497,10 +1497,12 @@ static int mdss_dsi_unblank(struct mdss_panel_data *pdata) mdss_dsi_clk_ctrl(sctrl, sctrl->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); - if (mdss_dsi_is_panel_on_lp(pdata)) { + if (ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_LP) { pr_debug("%s: dsi_unblank with panel always on\n", __func__); if (ctrl_pdata->low_power_config) ret = ctrl_pdata->low_power_config(pdata, false); + if (!ret) + ctrl_pdata->ctrl_state &= ~CTRL_STATE_PANEL_LP; goto error; } @@ -1565,6 +1567,8 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state) pr_debug("%s: low power state requested\n", __func__); if (ctrl_pdata->low_power_config) ret = ctrl_pdata->low_power_config(pdata, true); + if (!ret) + ctrl_pdata->ctrl_state |= CTRL_STATE_PANEL_LP; goto error; } @@ -1607,7 +1611,8 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state) } ATRACE_END("dsi_panel_off"); } - ctrl_pdata->ctrl_state &= ~CTRL_STATE_PANEL_INIT; + ctrl_pdata->ctrl_state &= ~(CTRL_STATE_PANEL_INIT | + CTRL_STATE_PANEL_LP); } error: diff --git a/drivers/video/msm/mdss/mdss_dsi.h b/drivers/video/msm/mdss/mdss_dsi.h index e7683a3e49e99..38ed93f50047a 100644 --- a/drivers/video/msm/mdss/mdss_dsi.h +++ b/drivers/video/msm/mdss/mdss_dsi.h @@ -148,6 +148,7 @@ enum dsi_pm_type { #define CTRL_STATE_PANEL_INIT BIT(0) #define CTRL_STATE_MDP_ACTIVE BIT(1) #define CTRL_STATE_DSI_ACTIVE BIT(2) +#define CTRL_STATE_PANEL_LP BIT(3) #define DSI_NON_BURST_SYNCH_PULSE 0 #define DSI_NON_BURST_SYNCH_EVENT 1 diff --git a/drivers/video/msm/mdss/mdss_panel.h b/drivers/video/msm/mdss/mdss_panel.h index 00ad560627b58..af5f03c9bd1e7 100644 --- a/drivers/video/msm/mdss/mdss_panel.h +++ b/drivers/video/msm/mdss/mdss_panel.h @@ -106,12 +106,6 @@ enum { MDSS_PANEL_POWER_LP2, }; -enum { - MDSS_PANEL_BLANK_BLANK = 0, - MDSS_PANEL_BLANK_UNBLANK, - MDSS_PANEL_BLANK_LOW_POWER, -}; - enum { MODE_GPIO_NOT_VALID = 0, MODE_GPIO_HIGH, From 542baee907c5f1a4e94b369114787cad89328510 Mon Sep 17 00:00:00 2001 From: Sandeep Panda Date: Fri, 9 Sep 2016 17:03:30 +0530 Subject: [PATCH 0173/1015] msm: mdss: set interface stopped flag properly during suspend In current implementation while disabling interface, the interface stopped flag is not keeping the correct value. This is causing issues when later if we use this flag during command autorefresh feature disable. So update the flag properly after wiping out display context structure to store correct value. Change-Id: Id2cc64e3f10711b92f8b8f4f36f73f716c9ac831 Signed-off-by: Sandeep Panda --- drivers/video/msm/mdss/mdss_mdp_intf_cmd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c index aa70b44fdcb2b..964c1270e7d65 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c @@ -2866,6 +2866,8 @@ int mdss_mdp_cmd_ctx_stop(struct mdss_mdp_ctl *ctl, ctx->default_pp_num, NULL, NULL); memset(ctx, 0, sizeof(*ctx)); + /* intf stopped, no more kickoff */ + ctx->intf_stopped = 1; return 0; } From af786d4e2a026d800deaa9d2384a93aa4b123731 Mon Sep 17 00:00:00 2001 From: Sandeep Panda Date: Wed, 7 Sep 2016 15:23:30 +0530 Subject: [PATCH 0174/1015] msm: mdss: serialize wait for pingpong with kickoff Serialize wait for pingpong with kickoff when autorefresh feature is enabled. Change-Id: Ia51889dd86561e7513b4e7123a9fefb77a26d1ea Signed-off-by: Sandeep Panda --- drivers/video/msm/mdss/mdss_mdp_intf_cmd.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c index aa70b44fdcb2b..0b3ed35f082c5 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c @@ -2177,6 +2177,7 @@ int mdss_mdp_cmd_set_autorefresh_mode(struct mdss_mdp_ctl *mctl, int frame_cnt) */ ctx->autorefresh_state = MDP_AUTOREFRESH_ON_REQUESTED; ctx->autorefresh_frame_cnt = frame_cnt; + mctl->mdata->serialize_wait4pp = true; /* Cancel GATE Work Item */ if (cancel_work_sync(&ctx->gate_clk_work)) @@ -2190,8 +2191,10 @@ int mdss_mdp_cmd_set_autorefresh_mode(struct mdss_mdp_ctl *mctl, int frame_cnt) if (frame_cnt == 0) { ctx->autorefresh_state = MDP_AUTOREFRESH_OFF; ctx->autorefresh_frame_cnt = 0; + mctl->mdata->serialize_wait4pp = false; } else { ctx->autorefresh_frame_cnt = frame_cnt; + mctl->mdata->serialize_wait4pp = true; } break; case MDP_AUTOREFRESH_ON: @@ -2203,6 +2206,7 @@ int mdss_mdp_cmd_set_autorefresh_mode(struct mdss_mdp_ctl *mctl, int frame_cnt) ctx->autorefresh_state = MDP_AUTOREFRESH_OFF_REQUESTED; } else { ctx->autorefresh_frame_cnt = frame_cnt; + mctl->mdata->serialize_wait4pp = true; } break; case MDP_AUTOREFRESH_OFF_REQUESTED: @@ -2212,6 +2216,7 @@ int mdss_mdp_cmd_set_autorefresh_mode(struct mdss_mdp_ctl *mctl, int frame_cnt) pr_debug("cancelling autorefresh off request\n"); ctx->autorefresh_state = MDP_AUTOREFRESH_ON; ctx->autorefresh_frame_cnt = frame_cnt; + mctl->mdata->serialize_wait4pp = true; } break; default: @@ -2322,7 +2327,7 @@ static void mdss_mdp_cmd_wait4_autorefresh_pp(struct mdss_mdp_ctl *ctl) MDSS_XLOG(ctl->num, line_out, ctl->mixer_left->roi.h); - if (line_out < ctl->mixer_left->roi.h) { + if ((line_out < ctl->mixer_left->roi.h) && line_out) { reinit_completion(&ctx->autorefresh_ppdone); /* enable ping pong done */ @@ -2574,6 +2579,7 @@ static int mdss_mdp_disable_autorefresh(struct mdss_mdp_ctl *ctl, mdss_mdp_pingpong_write(pp_base, MDSS_MDP_REG_PP_SYNC_CONFIG_VSYNC, cfg); + ctl->mdata->serialize_wait4pp = false; return 0; } From 84eb52310eab3d950d867d3ef1c6689a7eb12e6f Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Fri, 23 Sep 2016 19:48:13 +0530 Subject: [PATCH 0175/1015] ASoC: msm: update uninitialized clk_val Avoid use of clk_val before initialize. Change-Id: I1a57fcc35a2d871dfb327dea16736e4e15c03fcc Signed-off-by: Laxminath Kasam --- sound/soc/msm/msm8952.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/msm/msm8952.c b/sound/soc/msm/msm8952.c index f4a96da417a8a..264e28d868c23 100644 --- a/sound/soc/msm/msm8952.c +++ b/sound/soc/msm/msm8952.c @@ -550,7 +550,7 @@ static bool is_mi2s_rx_port(int port_id) static uint32_t get_mi2s_rx_clk_val(int port_id) { - uint32_t clk_val; + uint32_t clk_val = 0; /* * Derive clock value based on sample rate, bits per sample and From 01a0d31cf9bc4834580053b9621f06dcdb1aadba Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Fri, 23 Sep 2016 19:51:08 +0530 Subject: [PATCH 0176/1015] ASoC: msm: qdsp6v2: update uninitialized ret Avoid use of ret before initialize. Change-Id: I4b5438dc5c92b6bebbe04d55cb2d000df8e39d1f Signed-off-by: Laxminath Kasam --- sound/soc/msm/qdsp6v2/q6afe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/msm/qdsp6v2/q6afe.c b/sound/soc/msm/qdsp6v2/q6afe.c index 3a32b14394051..6ee5db5f850d4 100644 --- a/sound/soc/msm/qdsp6v2/q6afe.c +++ b/sound/soc/msm/qdsp6v2/q6afe.c @@ -1521,7 +1521,7 @@ static int afe_send_codec_reg_page_config( static int afe_send_codec_reg_config( struct afe_param_cdc_reg_cfg_data *cdc_reg_cfg) { - int i, j, ret; + int i, j, ret = 0; int pkt_size, payload_size, reg_per_pkt, num_pkts, num_regs; struct afe_svc_cmd_cdc_reg_cfg *config; struct afe_svc_cmd_set_param *param; From 385e3281b84be23a12a66b70f76a8fa485eb03f7 Mon Sep 17 00:00:00 2001 From: Himanshu Aggarwal Date: Fri, 23 Sep 2016 14:56:40 +0530 Subject: [PATCH 0177/1015] input: touchscreen: fix issues found during static analysis Prevent a NULL pointer dereference and a suspicious dereference of a pointer before a NULL check. Also check the return value of devm_kzalloc, to fix NULL pointer check related issues found during static analysis. Change-Id: I3ba87e2491c70752ecb9c43b7143c71ec3326f08 Signed-off-by: Himanshu Aggarwal --- drivers/input/touchscreen/gt9xx/gt9xx.c | 29 ++++---- .../input/touchscreen/gt9xx/gt9xx_update.c | 68 +++---------------- 2 files changed, 22 insertions(+), 75 deletions(-) diff --git a/drivers/input/touchscreen/gt9xx/gt9xx.c b/drivers/input/touchscreen/gt9xx/gt9xx.c index d4dc15cea38ab..4d93bb8e05914 100644 --- a/drivers/input/touchscreen/gt9xx/gt9xx.c +++ b/drivers/input/touchscreen/gt9xx/gt9xx.c @@ -973,7 +973,8 @@ static int gtp_init_panel(struct goodix_ts_data *ts) } } /* !DRIVER NOT SEND CONFIG */ - if ((ts->abs_x_max == 0) && (ts->abs_y_max == 0)) { + if ((ts->abs_x_max == 0) && (ts->abs_y_max == 0) && + (config_data != NULL)) { ts->abs_x_max = (config_data[RESOLUTION_LOC + 1] << 8) + config_data[RESOLUTION_LOC]; ts->abs_y_max = (config_data[RESOLUTION_LOC + 3] << 8) @@ -2120,8 +2121,8 @@ static int goodix_ts_probe(struct i2c_client *client, flush_workqueue(ts->goodix_wq); destroy_workqueue(ts->goodix_wq); - input_unregister_device(ts->input_dev); if (ts->input_dev) { + input_unregister_device(ts->input_dev); input_free_device(ts->input_dev); ts->input_dev = NULL; } @@ -2155,28 +2156,26 @@ static int goodix_ts_remove(struct i2c_client *client) { struct goodix_ts_data *ts = i2c_get_clientdata(client); - sysfs_remove_group(&ts->input_dev->dev.kobj, >p_attr_grp); + if (ts) { + sysfs_remove_group(&ts->input_dev->dev.kobj, >p_attr_grp); #if defined(CONFIG_FB) - if (fb_unregister_client(&ts->fb_notif)) - dev_err(&client->dev, - "Error occurred while unregistering fb_notifier.\n"); + fb_unregister_client(&ts->fb_notif); #elif defined(CONFIG_HAS_EARLYSUSPEND) - unregister_early_suspend(&ts->early_suspend); + unregister_early_suspend(&ts->early_suspend); #endif - mutex_destroy(&ts->lock); + mutex_destroy(&ts->lock); #ifdef CONFIG_GT9XX_TOUCHPANEL_DEBUG - uninit_wr_node(); + uninit_wr_node(); #endif #if GTP_ESD_PROTECT - cancel_work_sync(gtp_esd_check_workqueue); - flush_workqueue(gtp_esd_check_workqueue); - destroy_workqueue(gtp_esd_check_workqueue); + cancel_work_sync(gtp_esd_check_workqueue); + flush_workqueue(gtp_esd_check_workqueue); + destroy_workqueue(gtp_esd_check_workqueue); #endif - if (ts) { if (ts->use_irq) free_irq(client->irq, ts); @@ -2184,8 +2183,8 @@ static int goodix_ts_remove(struct i2c_client *client) flush_workqueue(ts->goodix_wq); destroy_workqueue(ts->goodix_wq); - input_unregister_device(ts->input_dev); if (ts->input_dev) { + input_unregister_device(ts->input_dev); input_free_device(ts->input_dev); ts->input_dev = NULL; } @@ -2198,8 +2197,8 @@ static int goodix_ts_remove(struct i2c_client *client) goodix_power_off(ts); goodix_power_deinit(ts); i2c_set_clientdata(client, NULL); + debugfs_remove_recursive(ts->debug_base); } - debugfs_remove_recursive(ts->debug_base); return 0; } diff --git a/drivers/input/touchscreen/gt9xx/gt9xx_update.c b/drivers/input/touchscreen/gt9xx/gt9xx_update.c index 98f537b7a9b55..a9eee67342cac 100644 --- a/drivers/input/touchscreen/gt9xx/gt9xx_update.c +++ b/drivers/input/touchscreen/gt9xx/gt9xx_update.c @@ -953,27 +953,14 @@ static u8 gup_burn_dsp_isp(struct i2c_client *client) { s32 ret = 0; u8 *fw_dsp_isp = NULL; - u8 retry = 0; pr_debug("Begin burn dsp isp."); /* step1:alloc memory */ pr_debug("step1:alloc memory"); - while (retry++ < 5) { - fw_dsp_isp = devm_kzalloc(&client->dev, FW_DSP_ISP_LENGTH, - GFP_KERNEL); - if (fw_dsp_isp == NULL) { - continue; - } else { - pr_info("Alloc %dk byte memory success.", - (FW_DSP_ISP_LENGTH/1024)); - break; - } - } - if (retry == 5) { - pr_err("Alloc memory fail,exit."); + fw_dsp_isp = devm_kzalloc(&client->dev, FW_DSP_ISP_LENGTH, GFP_KERNEL); + if (fw_dsp_isp == NULL) return FAIL; - } /* step2:load dsp isp file data */ pr_debug("step2:load dsp isp file data"); @@ -1059,28 +1046,15 @@ static u8 gup_burn_dsp_isp(struct i2c_client *client) static u8 gup_burn_fw_ss51(struct i2c_client *client) { u8 *fw_ss51 = NULL; - u8 retry = 0; s32 ret = 0; pr_debug("Begin burn ss51 firmware."); /* step1:alloc memory */ pr_debug("step1:alloc memory"); - while (retry++ < 5) { - fw_ss51 = devm_kzalloc(&client->dev, FW_SECTION_LENGTH, - GFP_KERNEL); - if (fw_ss51 == NULL) { - continue; - } else { - pr_info("Alloc %dk byte memory success.", - (FW_SECTION_LENGTH/1024)); - break; - } - } - if (retry == 5) { - pr_err("Alloc memory fail,exit."); + fw_ss51 = devm_kzalloc(&client->dev, FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_ss51 == NULL) return FAIL; - } /* step2:load ss51 firmware section 1 file data */ pr_debug("step2:load ss51 firmware section 1 file data"); @@ -1164,27 +1138,14 @@ static u8 gup_burn_fw_dsp(struct i2c_client *client) { s32 ret = 0; u8 *fw_dsp = NULL; - u8 retry = 0; u8 rd_buf[5]; pr_debug("Begin burn dsp firmware."); /* step1:alloc memory */ pr_debug("step1:alloc memory"); - while (retry++ < 5) { - fw_dsp = devm_kzalloc(&client->dev, FW_DSP_LENGTH, - GFP_KERNEL); - if (fw_dsp == NULL) { - continue; - } else { - pr_info("Alloc %dk byte memory success.", - (FW_SECTION_LENGTH/1024)); - break; - } - } - if (retry == 5) { - pr_err("Alloc memory fail,exit."); + fw_dsp = devm_kzalloc(&client->dev, FW_DSP_LENGTH, GFP_KERNEL); + if (fw_dsp == NULL) return FAIL; - } /* step2:load firmware dsp */ pr_debug("step2:load firmware dsp"); @@ -1268,28 +1229,15 @@ static u8 gup_burn_fw_boot(struct i2c_client *client) { s32 ret = 0; u8 *fw_boot = NULL; - u8 retry = 0; u8 rd_buf[5]; pr_debug("Begin burn bootloader firmware."); /* step1:Alloc memory */ pr_debug("step1:Alloc memory"); - while (retry++ < 5) { - fw_boot = devm_kzalloc(&client->dev, FW_BOOT_LENGTH, - GFP_KERNEL); - if (fw_boot == NULL) { - continue; - } else { - pr_info("Alloc %dk byte memory success.", - (FW_BOOT_LENGTH/1024)); - break; - } - } - if (retry == 5) { - pr_err("Alloc memory fail,exit."); + fw_boot = devm_kzalloc(&client->dev, FW_BOOT_LENGTH, GFP_KERNEL); + if (fw_boot == NULL) return FAIL; - } /* step2:load firmware bootloader */ pr_debug("step2:load firmware bootloader"); From 93264c56bc06a3644193842073238e93eed1213a Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Wed, 21 Sep 2016 18:15:03 +0530 Subject: [PATCH 0178/1015] msm: msm_bus: Add Bandwidth Monitor driver Bandwidth Monitor driver is to create bandwidth sensor nodes (logical nodes), that pertains to different bus routes and registers them with the thermal core framework as thermal zone devices. So that clients can monitor these devices as any other thermal zone devices and can take actions based on requirement. Bandwidth Monitor driver is going to register with bus driver framework to get bandwidth vote notifications. As these bandwidth sensors nodes are exposed as thermal zone devices, limits management clients can set the thresholds to monitor whether bandwidth vote on a particular bus route is crossing the some predefined threshold or not. Upon receiving the notification for trigger threshold, client can initiate the mitigation using available bandwidth mitigation knobs like modem etc. and can clear it once bandwidth vote goes below clear threshold. This design have multi client support as well. Change-Id: I4197648fba7dc7b725b7511988cfca90d2a3df82 Signed-off-by: Manaf Meethalavalappu Pallikunhi --- .../arm/msm/msm_bandwidth_monitor.txt | 52 ++ drivers/platform/msm/Kconfig | 9 + drivers/platform/msm/msm_bus/Makefile | 1 + .../msm/msm_bus/msm_bandwidth_monitor.c | 637 ++++++++++++++++++ 4 files changed, 699 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/msm/msm_bandwidth_monitor.txt create mode 100644 drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c diff --git a/Documentation/devicetree/bindings/arm/msm/msm_bandwidth_monitor.txt b/Documentation/devicetree/bindings/arm/msm/msm_bandwidth_monitor.txt new file mode 100644 index 0000000000000..22ec10672687b --- /dev/null +++ b/Documentation/devicetree/bindings/arm/msm/msm_bandwidth_monitor.txt @@ -0,0 +1,52 @@ +Bandwidth Monitor driver(BW_MONITOR) +===================================== + +Bandwidth Monitor driver creates logical sensor nodes with thermal core +framework for the specified bus. This logical sensor will be used to monitor +and mitigate the bus bandwidth. This driver can be configured to register +any bus bandwidth as a sensor for it to be monitored. + +The device tree parameters for bandwidth monitor driver(BW_MONITOR) driver are: + +Properties: + +- compatible: + Usage: required + Value type: + Definition: shall be "qcom,bm-sensors" + +- + Usage: required + Definition: Each child node represents a bandwidth sensor and name of + the node will be used as bandwidth sensor name. Each + sensor can represent either single bus bandwidth or + aggregation of multiple bus bandwidth. + +Child node Properties: +- qcom,bm-sensor: + Usage: required + Value type: + Definition: This bandwidth sensor monitors aggregated bandwidth of + these bus bandwidth. + +- qcom,bm-sensor-field: + Usage: required + Value type: + Definition: This property defines the bandwidth to be monitored, + either average bandwidth(ab) or instantaneous + bandwidth(ib). + +Example: + qcom,bm-sensors { + compatible = "qcom,bm-sensors"; + + bw_mm { + qcom,bm-sensor = <&slv_snoc_bimc_0 &slv_snoc_bimc_2>; + qcom,bm-sensor-field = "ab"; + }; + + bw_apps { + qcom,bm-sensor = <&mas_apps_proc>; + qcom,bm-sensor-field = "ib"; + }; + }; diff --git a/drivers/platform/msm/Kconfig b/drivers/platform/msm/Kconfig index a0f9571dd20c1..0774fe4d29aaa 100644 --- a/drivers/platform/msm/Kconfig +++ b/drivers/platform/msm/Kconfig @@ -300,6 +300,15 @@ config MSM_11AD If you choose to build it as a module, it will be called msm_11ad_proxy. +config BW_MONITOR + bool "Bandwidth monitor driver" + depends on BUS_TOPOLOGY_ADHOC && THERMAL + help + Enable this module if any bandwidth of a bus needs to be + monitored and limited by thermal core framework. It does + it by registering the bus bandwidth as a sensor in + thermal core framework. + source "drivers/platform/msm/spmi/Kconfig" endmenu diff --git a/drivers/platform/msm/msm_bus/Makefile b/drivers/platform/msm/msm_bus/Makefile index a58994d6023b7..e88bd26d237a1 100644 --- a/drivers/platform/msm/msm_bus/Makefile +++ b/drivers/platform/msm/msm_bus/Makefile @@ -11,6 +11,7 @@ ifdef CONFIG_BUS_TOPOLOGY_ADHOC obj-$(CONFIG_OF) += msm_bus_of_adhoc.o obj-$(CONFIG_DEBUG_BUS_VOTER) += msm_bus_dbg_voter.o obj-$(CONFIG_CORESIGHT) += msm_buspm_coresight_adhoc.o + obj-$(CONFIG_BW_MONITOR) += msm_bandwidth_monitor.o else obj-y += msm_bus_fabric.o msm_bus_config.o msm_bus_arb.o \ msm_bus_bimc.o msm_bus_noc.o diff --git a/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c b/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c new file mode 100644 index 0000000000000..fd088a239ba6c --- /dev/null +++ b/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c @@ -0,0 +1,637 @@ +/* Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#define pr_fmt(fmt) "%s:%s " fmt, KBUILD_MODNAME, __func__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BM_SENSORS_DRIVER_NAME "bm_sensors" + +#define ALLOC_KMEM(dev, ptr, type, size, ret) \ + do { \ + ret = 0; \ + ptr = devm_kzalloc(dev, \ + sizeof(type) * size,\ + GFP_KERNEL); \ + if (!ptr) \ + ret = -ENOMEM; \ + } while (0) + +/* Trips: HIGH and LOW */ +enum bm_threshold_id { + BM_HIGH_THRESHOLD = 0, + BM_LOW_THRESHOLD, + MAX_BM_THRESHOLD, +}; +#define BM_WRITABLE_TRIPS_MASK ((1 << MAX_BM_THRESHOLD) - 1) + +struct bm_thresh_state { + enum thermal_trip_activation_mode state; + int trip_bw; +}; + +struct bm_tz_sensor { + /* Sensor info from dt */ + char bm_sensor[THERMAL_NAME_LENGTH]; + int src_cnt; + int *src_id; + int src_field; + int op; + /* bus rule interface struct */ + struct bus_rule_type thresh_bus_rule[MAX_BM_THRESHOLD]; + uint32_t bus_rule_action[MAX_BM_THRESHOLD]; + unsigned long triggered[BITS_TO_LONGS(MAX_BM_THRESHOLD)]; + bool bus_reg_done; + /* Common callback notifier*/ + struct notifier_block bm_nb; + /* thermal zone handling */ + struct thermal_zone_device *tz_dev; + enum thermal_device_mode mode; + struct bm_thresh_state thresh_state[MAX_BM_THRESHOLD]; +}; + +struct bm_sensors_drv_data { + struct platform_device *pdev; + /* Workqueue Related */ + struct work_struct bm_wq; + /* Serialize workqueue handling */ + struct mutex rule_lock; + struct bm_tz_sensor *bm_tz_sensors; + int bm_sensor_cnt; +}; + +static struct bm_sensors_drv_data *bmdev; + +static void notify_bw_threshold_event(struct bm_tz_sensor *sensor, + struct bus_rule_type *rule, uint32_t action) +{ + enum bm_threshold_id thresh_id; + u64 bw = 0; + int ret = 0; + + if (!sensor || !rule) { + pr_err("Invalid input parameters\n"); + return; + } + thresh_id = *(int *)(rule->client_data); + + if (action == RULE_STATE_APPLIED) { + sensor->thresh_state[thresh_id].state + = THERMAL_TRIP_ACTIVATION_DISABLED; + ret = msm_rule_query_bandwidth(rule, + &bw, &sensor->bm_nb); + if (ret < 0) { + pr_err("Error in reading curr bw, ret:%d\n", ret); + return; + } + thermal_sensor_trip(sensor->tz_dev, + (thresh_id == BM_HIGH_THRESHOLD) ? + THERMAL_TRIP_CONFIGURABLE_HI : + THERMAL_TRIP_CONFIGURABLE_LOW, + (long)bw); + } else if (action != RULE_STATE_NOT_APPLIED) { + pr_err_ratelimited("Error in high threshold interrupt\n"); + } +} + +static int create_bus_rule(struct bus_rule_type *rule, int src_cnt, + int *src_ids, int src_field, int op, u64 val, int thresh_id) +{ + int i = 0, ret = 0; + + if (!rule->src_id) { + ALLOC_KMEM(&bmdev->pdev->dev, rule->src_id, + int, src_cnt, ret); + if (ret) + goto rule_exit; + } + if (!rule->src_field) { + ALLOC_KMEM(&bmdev->pdev->dev, rule->src_field, + int, 1, ret); + if (ret) + goto rule_exit; + } + if (!rule->op) { + ALLOC_KMEM(&bmdev->pdev->dev, rule->op, + int, 1, ret); + if (ret) + goto rule_exit; + } + if (!rule->thresh) { + ALLOC_KMEM(&bmdev->pdev->dev, rule->thresh, + u64, 1, ret); + if (ret) + goto rule_exit; + } + if (!rule->client_data) { + ALLOC_KMEM(&bmdev->pdev->dev, rule->client_data, + int, 1, ret); + if (ret) + goto rule_exit; + } + + rule->num_src = src_cnt; + for (; i < src_cnt; i++) + rule->src_id[i] = src_ids[i]; + *(rule->src_field) = src_field; + *(rule->op) = op; + rule->num_thresh = 1; + *(rule->thresh) = val; + rule->num_dst = 0; + rule->dst_node = NULL; + rule->mode = THROTTLE_OFF; + *(int *)(rule->client_data) = thresh_id; + rule->dst_bw = 0; + rule->combo_op = 0; + +rule_exit: + if (ret) { + if (rule->src_id) + devm_kfree(&bmdev->pdev->dev, rule->src_id); + if (rule->src_field) + devm_kfree(&bmdev->pdev->dev, rule->src_field); + if (rule->op) + devm_kfree(&bmdev->pdev->dev, rule->op); + if (rule->thresh) + devm_kfree(&bmdev->pdev->dev, rule->thresh); + if (rule->client_data) + devm_kfree(&bmdev->pdev->dev, rule->client_data); + } + + return ret; +} + +static void bm_tz_notify_wq(struct work_struct *work) +{ + int i = 0, j = 0; + + mutex_lock(&bmdev->rule_lock); + + /* Notify bw threshold events to thermal zone */ + for (i = 0; i < bmdev->bm_sensor_cnt; i++) { + if (!bitmap_weight(bmdev->bm_tz_sensors[i].triggered, + MAX_BM_THRESHOLD)) + continue; + + for_each_set_bit(j, bmdev->bm_tz_sensors[i].triggered, + MAX_BM_THRESHOLD) { + notify_bw_threshold_event(&bmdev->bm_tz_sensors[i], + &bmdev->bm_tz_sensors[i].thresh_bus_rule[j], + bmdev->bm_tz_sensors[i].bus_rule_action[j]); + clear_bit(j, bmdev->bm_tz_sensors[i].triggered); + } + } + mutex_unlock(&bmdev->rule_lock); +} + +static int bm_threshold_cb(struct notifier_block *nb, unsigned long action, + void *data) +{ + struct bm_tz_sensor *bm_sensor = + container_of(nb, struct bm_tz_sensor, bm_nb); + struct bus_rule_type *rule = data; + enum bm_threshold_id thresh_id = *(int *)(rule->client_data); + + pr_debug( + "srcid:%d, srcfld:%d op:%d thresh:%llu threshid:%d action:%lu curr_bw:%llu\n", + *(rule->src_id), *(rule->src_field), *(rule->op), *(rule->thresh), + thresh_id, action, rule->curr_bw); + set_bit(thresh_id, bm_sensor->triggered); + bm_sensor->bus_rule_action[thresh_id] = action; + queue_work(system_freezable_wq, &bmdev->bm_wq); + + return 0; +} + +static int bm_tz_get_curr_bw(struct thermal_zone_device *bmdev, + unsigned long *bw) +{ + struct bm_tz_sensor *bm_sensor = bmdev->devdata; + int ret = 0; + + if (!bm_sensor || bm_sensor->mode != THERMAL_DEVICE_ENABLED || !bw) + return -EINVAL; + + ret = msm_rule_query_bandwidth( + &bm_sensor->thresh_bus_rule[BM_HIGH_THRESHOLD], + (u64 *)bw, + &bm_sensor->bm_nb); + if (ret < 0) { + pr_err("Error in reading curr bw, ret:%d\n", ret); + return -EINVAL; + } + pr_debug("bm sensor[%s] curr bw:%lu\n", bm_sensor->bm_sensor, *bw); + + return 0; +} + +static int bm_tz_get_mode(struct thermal_zone_device *bm, + enum thermal_device_mode *mode) +{ + struct bm_tz_sensor *bm_sensor = bm->devdata; + + if (!bm_sensor || !mode) + return -EINVAL; + + *mode = bm_sensor->mode; + + return 0; +} + +static int bm_tz_get_trip_type(struct thermal_zone_device *bm, + int trip, enum thermal_trip_type *type) +{ + struct bm_tz_sensor *bm_sensor = bm->devdata; + + if (!bm_sensor || trip < 0 || !type) + return -EINVAL; + + switch (trip) { + case BM_HIGH_THRESHOLD: + *type = THERMAL_TRIP_CONFIGURABLE_HI; + break; + case BM_LOW_THRESHOLD: + *type = THERMAL_TRIP_CONFIGURABLE_LOW; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int bm_tz_activate_trip_type(struct thermal_zone_device *bm, + int trip, enum thermal_trip_activation_mode mode) +{ + struct bm_tz_sensor *bm_sensor = bm->devdata; + struct bus_rule_type new_rule = {0}; + int op = -1; + int thresh, ret = 0; + + if (!bm_sensor || trip < 0) + return -EINVAL; + + switch (trip) { + case BM_HIGH_THRESHOLD: + bm_sensor->thresh_state[BM_HIGH_THRESHOLD].state = mode; + if (mode != THERMAL_TRIP_ACTIVATION_DISABLED) + thresh = + bm_sensor->thresh_state[BM_HIGH_THRESHOLD].trip_bw; + else + thresh = UINT_MAX; + op = OP_GT; + break; + case BM_LOW_THRESHOLD: + bm_sensor->thresh_state[BM_LOW_THRESHOLD].state = mode; + if (mode != THERMAL_TRIP_ACTIVATION_DISABLED) + thresh = + bm_sensor->thresh_state[BM_LOW_THRESHOLD].trip_bw; + else + thresh = 0; + op = OP_LT; + break; + default: + pr_err("Unknown trip %d\n", trip); + return -EINVAL; + } + + ret = create_bus_rule(&new_rule, + bm_sensor->src_cnt, bm_sensor->src_id, + bm_sensor->src_field, op, thresh, trip); + if (ret) + goto exit; + + bm_sensor->bm_nb.notifier_call = bm_threshold_cb; + msm_rule_update(&bm_sensor->thresh_bus_rule[trip], + &new_rule, &bm_sensor->bm_nb); + memcpy(&bm_sensor->thresh_bus_rule[trip], &new_rule, + sizeof(struct bus_rule_type)); + msm_rule_evaluate_rules(bm_sensor->thresh_bus_rule[trip].src_id[0]); + + pr_debug( + "srcid:%d, srcfld:%d op:%d thresh:%llu threshid:%d\n", + *(bm_sensor->thresh_bus_rule[trip].src_id), + *(bm_sensor->thresh_bus_rule[trip].src_field), + *(bm_sensor->thresh_bus_rule[trip].op), + *(bm_sensor->thresh_bus_rule[trip].thresh), + *(int *)(bm_sensor->thresh_bus_rule[trip].client_data)); + +exit: + return 0; +}; + +static int bm_tz_get_trip_bw(struct thermal_zone_device *bmdev, + int trip, unsigned long *bw) +{ + struct bm_tz_sensor *bm_sensor = bmdev->devdata; + + if (!bm_sensor || trip < 0 || trip >= MAX_BM_THRESHOLD || !bw) + return -EINVAL; + + *bw = bm_sensor->thresh_state[trip].trip_bw; + + return 0; +}; + +static int bm_tz_set_trip_bw(struct thermal_zone_device *bmdev, + int trip, unsigned long bw) +{ + struct bm_tz_sensor *bm_sensor = bmdev->devdata; + + if (!bm_sensor || trip < 0 || trip >= MAX_BM_THRESHOLD) + return -EINVAL; + + bm_sensor->thresh_state[trip].trip_bw = bw; + + return 0; +}; + +static struct thermal_zone_device_ops bm_sensor_thermal_zone_ops = { + .get_temp = bm_tz_get_curr_bw, + .get_mode = bm_tz_get_mode, + .get_trip_type = bm_tz_get_trip_type, + .activate_trip_type = bm_tz_activate_trip_type, + .get_trip_temp = bm_tz_get_trip_bw, + .set_trip_temp = bm_tz_set_trip_bw, +}; + +static int bm_sensors_register_thermal_zone(void) +{ + int i = 0, ret = 0; + + for (i = 0; i < bmdev->bm_sensor_cnt; i++) { + struct bm_tz_sensor *bm_sensor = + &bmdev->bm_tz_sensors[i]; + + bm_sensor->mode = THERMAL_DEVICE_ENABLED; + bm_sensor->tz_dev = + thermal_zone_device_register(bm_sensor->bm_sensor, + MAX_BM_THRESHOLD, BM_WRITABLE_TRIPS_MASK, + bm_sensor, &bm_sensor_thermal_zone_ops, + NULL, 0, 0); + if (IS_ERR(bm_sensor->tz_dev)) { + ret = PTR_ERR(bm_sensor->tz_dev); + pr_err( + "%s:thermal zone register failed. ret:%d\n", + __func__, ret); + goto fail; + } + } +fail: + return ret; +} + +static void bm_sensors_unregister_thermal_zone(void) +{ + int i = 0; + + for (i = 0; i < bmdev->bm_sensor_cnt; i++) { + struct bm_tz_sensor *bm_sensor = + &bmdev->bm_tz_sensors[i]; + if (bm_sensor->tz_dev) + thermal_zone_device_unregister(bm_sensor->tz_dev); + bm_sensor->mode = THERMAL_DEVICE_DISABLED; + } +} + +static int read_device_tree_data(struct platform_device *pdev, + struct bm_sensors_drv_data *bmdev) +{ + int bm_sensor_cnt = 0, i = 0, err = 0, idx = 0; + char *key = NULL; + const char *src_f = NULL; + struct device_node *node = pdev->dev.of_node, *child_node = NULL; + struct bm_tz_sensor *bm_tz_sensors = NULL; + struct device_node *bus_node = NULL; + + bm_sensor_cnt = of_get_child_count(node); + if (bm_sensor_cnt == 0) { + pr_err("No child node found\n"); + err = -ENODEV; + goto read_node_fail; + } + + ALLOC_KMEM(&pdev->dev, bm_tz_sensors, struct bm_tz_sensor, + bm_sensor_cnt, err); + if (err) + goto read_node_fail; + + for_each_child_of_node(node, child_node) { + + snprintf(bm_tz_sensors[i].bm_sensor, + THERMAL_NAME_LENGTH, child_node->name); + + key = "qcom,bm-sensor"; + if (!of_get_property(child_node, key, &bm_tz_sensors[i].src_cnt) + || bm_tz_sensors[i].src_cnt <= 0) { + pr_err("src id phandles are not defined\n"); + err = -ENODEV; + goto read_node_fail; + } + + bm_tz_sensors[i].src_cnt /= sizeof(__be32); + ALLOC_KMEM(&pdev->dev, bm_tz_sensors[i].src_id, int, + bm_tz_sensors[i].src_cnt, err); + if (err) + goto read_node_fail; + + for (idx = 0; idx < bm_tz_sensors[i].src_cnt; idx++) { + bus_node = of_parse_phandle(child_node, key, idx); + if (!bus_node) { + pr_err( + "No src id phandle is defined with index:%d\n", + idx); + err = -ENODEV; + goto read_node_fail; + } + err = of_property_read_u32(bus_node, "cell-id", + &bm_tz_sensors[i].src_id[idx]); + if (err) { + pr_err("Bus node is missing cell-id. err:%d\n", + err); + goto read_node_fail; + } + } + + key = "qcom,bm-sensor-field"; + err = of_property_read_string(child_node, + key, &src_f); + if (err) { + pr_err("No %s field is found. err:%d\n", key, err); + goto read_node_fail; + } + if (!strcmp(src_f, "ab")) { + bm_tz_sensors[i].src_field = FLD_AB; + } else if (!strcmp(src_f, "ib")) { + bm_tz_sensors[i].src_field = FLD_IB; + } else { + pr_err("Unknown src field\n"); + err = -EINVAL; + goto read_node_fail; + } + i++; + } + bmdev->bm_tz_sensors = bm_tz_sensors; + bmdev->bm_sensor_cnt = bm_sensor_cnt; + +read_node_fail: + return err; +} + +static void bus_rules_unregister(void) +{ + int i = 0; + + for (; i < bmdev->bm_sensor_cnt; i++) { + struct bm_tz_sensor *bm_sens = + &bmdev->bm_tz_sensors[i]; + + if (bm_sens->bus_reg_done) { + msm_rule_unregister(MAX_BM_THRESHOLD, + bm_sens->thresh_bus_rule, + &bm_sens->bm_nb); + bm_sens->bus_reg_done = false; + } + } +} + +static int init_bm_default_rules(void) +{ + int ret = 0, i = 0; + + for (i = 0; i < bmdev->bm_sensor_cnt; i++) { + struct bm_tz_sensor *bm_sens = &bmdev->bm_tz_sensors[i]; + + bitmap_zero(bm_sens->triggered, MAX_BM_THRESHOLD); + ret = create_bus_rule( + &bm_sens->thresh_bus_rule[BM_HIGH_THRESHOLD], + bm_sens->src_cnt, bm_sens->src_id, + bm_sens->src_field, OP_GT, ULLONG_MAX, + BM_HIGH_THRESHOLD); + if (ret) { + pr_err("Creating bus rule is failed. ret:%d\n", ret); + goto exit; + } + + ret = create_bus_rule( + &bm_sens->thresh_bus_rule[BM_LOW_THRESHOLD], + bm_sens->src_cnt, bm_sens->src_id, + bm_sens->src_field, OP_LT, 0, + BM_LOW_THRESHOLD); + if (ret) { + pr_err("Creating bus rule is failed. ret:%d\n", ret); + goto exit; + } + + bm_sens->bm_nb.notifier_call = bm_threshold_cb; + msm_rule_register(MAX_BM_THRESHOLD, bm_sens->thresh_bus_rule, + &bm_sens->bm_nb); + msm_rule_evaluate_rules( + bm_sens->thresh_bus_rule[BM_HIGH_THRESHOLD].src_id[0]); + bm_sens->bus_reg_done = true; + } +exit: + if (ret) + bus_rules_unregister(); + return ret; +} + +static void cleanup_drv_data(void) +{ + if (bmdev) { + bm_sensors_unregister_thermal_zone(); + bus_rules_unregister(); + flush_work(&bmdev->bm_wq); + } +} + +static int bm_tz_sensors_probe(struct platform_device *pdev) +{ + int ret = 0; + + ALLOC_KMEM(&pdev->dev, bmdev, struct bm_sensors_drv_data, + 1, ret); + if (ret) + goto probe_exit; + + bmdev->pdev = pdev; + ret = read_device_tree_data(pdev, bmdev); + if (ret) + goto probe_exit; + + mutex_init(&bmdev->rule_lock); + INIT_WORK(&bmdev->bm_wq, bm_tz_notify_wq); + + ret = init_bm_default_rules(); + if (ret) + goto probe_exit; + + ret = bm_sensors_register_thermal_zone(); + if (ret) + goto probe_exit; + + platform_set_drvdata(pdev, bmdev); +probe_exit: + if (ret) + cleanup_drv_data(); + + return ret; +} + +static int bm_tz_sensors_remove(struct platform_device *pdev) +{ + cleanup_drv_data(); + return 0; +} + +struct of_device_id bm_sensors_match[] = { + { + .compatible = "qcom,bm-sensors", + }, + {}, +}; + +static struct platform_driver bm_sensors_driver = { + .probe = bm_tz_sensors_probe, + .remove = bm_tz_sensors_remove, + .driver = { + .name = BM_SENSORS_DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = bm_sensors_match, + }, +}; + +int __init bm_sensors_driver_init(void) +{ + return platform_driver_register(&bm_sensors_driver); +} + +static void __exit bm_sensors_driver_exit(void) +{ + platform_driver_unregister(&bm_sensors_driver); +} + +late_initcall(bm_sensors_driver_init); +module_exit(bm_sensors_driver_exit); + +MODULE_DESCRIPTION("BANDWIDTH TZ SENSORS"); +MODULE_ALIAS("platform:" BM_SENSORS_DRIVER_NAME); +MODULE_LICENSE("GPL v2"); From 3f07a66243285ae569760b67502c65bd7d405cb7 Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Fri, 23 Sep 2016 20:09:38 +0530 Subject: [PATCH 0179/1015] defconfig: msm: Enable bandwidth monitor driver for msm8937 It enables clients to monitor bandwidth of particular source and do appropriate mitigation. Change-Id: I9ba24866b0729c98ecf18fd72d2feafbd067261f Signed-off-by: Manaf Meethalavalappu Pallikunhi --- arch/arm/configs/msm8937-perf_defconfig | 1 + arch/arm/configs/msm8937_defconfig | 1 + arch/arm64/configs/msm8937-perf_defconfig | 1 + arch/arm64/configs/msm8937_defconfig | 1 + 4 files changed, 4 insertions(+) diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index ff6e8d557e992..4539376f56db8 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -512,6 +512,7 @@ CONFIG_SPS_SUPPORT_NDP_BAM=y CONFIG_IPA=y CONFIG_RMNET_IPA=y CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y CONFIG_MSM_SPMI=y CONFIG_MSM_SPMI_PMIC_ARB=y CONFIG_MSM_QPNP_INT=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index a98017004bf50..7e2f8a15459b5 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -516,6 +516,7 @@ CONFIG_SPS_SUPPORT_NDP_BAM=y CONFIG_IPA=y CONFIG_RMNET_IPA=y CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y CONFIG_MSM_SPMI=y CONFIG_MSM_SPMI_PMIC_ARB=y CONFIG_MSM_QPNP_INT=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index 39a78af8bcfa2..518f94b24f4a4 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -514,6 +514,7 @@ CONFIG_SPS_SUPPORT_NDP_BAM=y CONFIG_IPA=y CONFIG_RMNET_IPA=y CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y CONFIG_MSM_SPMI=y CONFIG_MSM_SPMI_PMIC_ARB=y CONFIG_MSM_QPNP_INT=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 4bd79f2e67b27..5621b9aa28e8c 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -515,6 +515,7 @@ CONFIG_SPS_SUPPORT_NDP_BAM=y CONFIG_IPA=y CONFIG_RMNET_IPA=y CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y CONFIG_MSM_SPMI=y CONFIG_MSM_SPMI_PMIC_ARB=y CONFIG_MSM_QPNP_INT=y From 4c175f744b6686438b14eb5e76e5fa7165e52f35 Mon Sep 17 00:00:00 2001 From: Arun Kumar Neelakantam Date: Wed, 21 Sep 2016 18:34:01 +0530 Subject: [PATCH 0180/1015] net: ipc_router: fix NULL pointer de-reference issue Fail cases of accept() system call on AF_MSM_IPC socket family causes NULL pointer de-reference of sock structure variable in release operation. Validate the sock structure pointer before using it in release operation. CRs-Fixed: 1068888 Change-Id: I5637e52be59ea9504ea6ae317394bef0c28c7865 Signed-off-by: Arun Kumar Neelakantam --- net/ipc_router/ipc_router_socket.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/net/ipc_router/ipc_router_socket.c b/net/ipc_router/ipc_router_socket.c index 828797bd19e50..652531a8e592d 100644 --- a/net/ipc_router/ipc_router_socket.c +++ b/net/ipc_router/ipc_router_socket.c @@ -555,10 +555,18 @@ static unsigned int msm_ipc_router_poll(struct file *file, static int msm_ipc_router_close(struct socket *sock) { struct sock *sk = sock->sk; - struct msm_ipc_port *port_ptr = msm_ipc_sk_port(sk); + struct msm_ipc_port *port_ptr; int ret; + if (!sk) + return -EINVAL; + lock_sock(sk); + port_ptr = msm_ipc_sk_port(sk); + if (!port_ptr) { + release_sock(sk); + return -EINVAL; + } ret = msm_ipc_router_close_port(port_ptr); msm_ipc_unload_default_node(msm_ipc_sk(sk)->default_node_vote_info); release_sock(sk); From 895b744771c7f19ef910cbb8ee5f106254c8155a Mon Sep 17 00:00:00 2001 From: Mark Kuo Date: Mon, 11 Jan 2016 19:07:12 +0800 Subject: [PATCH 0181/1015] CHROMIUM: usb: gadget: f_accessory: add .raw_request callback After this upstream commit: 3c86726cfe38952f0366f86acfbbb025813ec1c2, .raw_request is mandatory in hid_ll_driver structure, hence add an empty raw_request() function. BUG=chrome-os-partner:49140 TEST=none Change-Id: Idd0bbe6960aad2c557376e4a24827d7e1df8e023 Signed-off-by: Mark Kuo Reviewed-on: https://chromium-review.googlesource.com/321038 Commit-Ready: Andrew Bresticker Tested-by: Andrew Bresticker Reviewed-by: Andrew Bresticker (cherry picked from commit aa1d916a3b462b0dc797b506b0a257935c1cef3f) Signed-off-by: Vijayavardhan Vennapusa --- drivers/usb/gadget/function/f_accessory.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/usb/gadget/function/f_accessory.c b/drivers/usb/gadget/function/f_accessory.c index 19f945b5e57f0..00a73f2316809 100644 --- a/drivers/usb/gadget/function/f_accessory.c +++ b/drivers/usb/gadget/function/f_accessory.c @@ -448,12 +448,19 @@ static void acc_hid_close(struct hid_device *hid) { } +static int acc_hid_raw_request(struct hid_device *hid, unsigned char reportnum, + __u8 *buf, size_t len, unsigned char rtype, int reqtype) +{ + return 0; +} + static struct hid_ll_driver acc_hid_ll_driver = { .parse = acc_hid_parse, .start = acc_hid_start, .stop = acc_hid_stop, .open = acc_hid_open, .close = acc_hid_close, + .raw_request = acc_hid_raw_request, }; static struct acc_hid_dev *acc_hid_new(struct acc_dev *dev, From 4373ab26544cbdfe36937bf8f179b19cc4fa4d1a Mon Sep 17 00:00:00 2001 From: Vijayavardhan Vennapusa Date: Fri, 9 Sep 2016 15:14:52 +0530 Subject: [PATCH 0182/1015] QUSB2PHY: Fix leakage current issue during wall charger disconnect It is required to disable QUSB2PHY level shifter by writing to TCSR_QUSB2PHY_CX2PX_LVL_SHIFT_KEEPER register during disconnect to avoid leakage current. Hence add support for the same. Change-Id: I666617d513314903533f2356b5db4b9ca3eac6e4 Signed-off-by: Vijayavardhan Vennapusa --- .../devicetree/bindings/usb/msm-phy.txt | 1 + drivers/usb/phy/phy-msm-qusb.c | 43 +++++++++++++------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Documentation/devicetree/bindings/usb/msm-phy.txt b/Documentation/devicetree/bindings/usb/msm-phy.txt index 38f0431a0efb9..f741d39cfe0be 100644 --- a/Documentation/devicetree/bindings/usb/msm-phy.txt +++ b/Documentation/devicetree/bindings/usb/msm-phy.txt @@ -163,6 +163,7 @@ Optional properties: "emu_phy_base" : phy base address used for programming emulation target phy. "ref_clk_addr" : ref_clk bcr address used for on/off ref_clk before reset. "tcsr_phy_clk_scheme_sel": address used to determine QUSB PHY clk source. + "tcsr_phy_level_shift_keeper": address used to clamp QUSB PHY level shifter. - reg-names: Should be "qscratch_base". The qscratch register bank allows us to manipulate QUSB PHY bits eg. to enable D+ pull-up using s/w control in device mode. The reg-names property is required if the diff --git a/drivers/usb/phy/phy-msm-qusb.c b/drivers/usb/phy/phy-msm-qusb.c index 86a213126cfa1..21cf09fc53548 100644 --- a/drivers/usb/phy/phy-msm-qusb.c +++ b/drivers/usb/phy/phy-msm-qusb.c @@ -124,6 +124,7 @@ struct qusb_phy { void __iomem *tune2_efuse_reg; void __iomem *ref_clk_base; void __iomem *tcsr_phy_clk_scheme_sel; + void __iomem *tcsr_phy_lvl_shift_keeper; struct clk *ref_clk_src; struct clk *ref_clk; @@ -402,13 +403,18 @@ static int qusb_phy_update_dpdm(struct usb_phy *phy, int value) case POWER_SUPPLY_DP_DM_DPF_DMF: dev_dbg(phy->dev, "POWER_SUPPLY_DP_DM_DPF_DMF\n"); if (!qphy->rm_pulldown) { + ret = qusb_phy_enable_power(qphy, true); + if (ret >= 0) { + qphy->rm_pulldown = true; + dev_dbg(phy->dev, "DP_DM_F: rm_pulldown:%d\n", + qphy->rm_pulldown); + } if (qphy->put_into_high_z_state) { + if (qphy->tcsr_phy_lvl_shift_keeper) + writel_relaxed(0x1, + qphy->tcsr_phy_lvl_shift_keeper); - /* Bring up DVDD */ - ret = qusb_phy_vdd(qphy, true); - if (ret < 0) - goto clk_error; qusb_phy_gdsc(qphy, true); qusb_phy_enable_clocks(qphy, true); @@ -438,16 +444,7 @@ static int qusb_phy_update_dpdm(struct usb_phy *phy, int value) qphy->base + QUSB2PHY_PORT_POWERDOWN); /* Make sure that above write is completed */ wmb(); - } - - ret = qusb_phy_enable_power(qphy, true); - if (ret >= 0) { - qphy->rm_pulldown = true; - dev_dbg(phy->dev, "DP_DM_F: rm_pulldown:%d\n", - qphy->rm_pulldown); - } - if (qphy->put_into_high_z_state) { qusb_phy_enable_clocks(qphy, false); qusb_phy_gdsc(qphy, false); } @@ -489,6 +486,9 @@ static int qusb_phy_update_dpdm(struct usb_phy *phy, int value) } if (!qphy->cable_connected) { + if (qphy->tcsr_phy_lvl_shift_keeper) + writel_relaxed(0x0, + qphy->tcsr_phy_lvl_shift_keeper); dev_dbg(phy->dev, "turn off for HVDCP case\n"); ret = qusb_phy_enable_power(qphy, false); } @@ -1002,6 +1002,9 @@ static int qusb_phy_set_suspend(struct usb_phy *phy, int suspend) wmb(); qusb_phy_enable_clocks(qphy, false); + if (qphy->tcsr_phy_lvl_shift_keeper) + writel_relaxed(0x0, + qphy->tcsr_phy_lvl_shift_keeper); qusb_phy_enable_power(qphy, false); /* * Set put_into_high_z_state to true so next USB @@ -1023,6 +1026,9 @@ static int qusb_phy_set_suspend(struct usb_phy *phy, int suspend) qphy->base + QUSB2PHY_PORT_INTR_CTRL); } else { qusb_phy_enable_power(qphy, true); + if (qphy->tcsr_phy_lvl_shift_keeper) + writel_relaxed(0x1, + qphy->tcsr_phy_lvl_shift_keeper); qusb_phy_enable_clocks(qphy, true); } qphy->suspended = false; @@ -1177,6 +1183,17 @@ static int qusb_phy_probe(struct platform_device *pdev) dev_dbg(dev, "err reading tcsr_phy_clk_scheme_sel\n"); } + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, + "tcsr_phy_level_shift_keeper"); + if (res) { + qphy->tcsr_phy_lvl_shift_keeper = devm_ioremap_nocache(dev, + res->start, resource_size(res)); + if (IS_ERR(qphy->tcsr_phy_lvl_shift_keeper)) { + dev_err(dev, "err reading tcsr_phy_lvl_shift_keeper\n"); + qphy->tcsr_phy_lvl_shift_keeper = NULL; + } + } + qphy->dpdm_pulsing_enabled = of_property_read_bool(dev->of_node, "qcom,enable-dpdm-pulsing"); From 554211c23eb14455edde5760bc59acc67ae7ec04 Mon Sep 17 00:00:00 2001 From: Vijayavardhan Vennapusa Date: Fri, 9 Sep 2016 15:23:35 +0530 Subject: [PATCH 0183/1015] ARM: dts: msm: Add TCSR_PHY_LVL_SHIFT_KEEPER resource for msm8953 Pass required TCSR_QUSB2PHY_CX2PX_LVL_SHIFT_KEEPER register address as resource for QUSB PHY device node for msm8953. Change-Id: Ib40689e1f6b087f0eafb3c570444e10e5408fd7e Signed-off-by: Vijayavardhan Vennapusa --- arch/arm/boot/dts/qcom/msm8953.dtsi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8953.dtsi b/arch/arm/boot/dts/qcom/msm8953.dtsi index 0997f053c8c32..83e6d8a2b058d 100644 --- a/arch/arm/boot/dts/qcom/msm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953.dtsi @@ -2103,11 +2103,13 @@ reg = <0x079000 0x180>, <0x070f8800 0x400>, <0x01841030 0x4>, - <0x0193f044 0x4>; + <0x0193f044 0x4>, + <0x0193f020 0x4>; reg-names = "qusb_phy_base", "qscratch_base", "ref_clk_addr", - "tcsr_phy_clk_scheme_sel"; + "tcsr_phy_clk_scheme_sel", + "tcsr_phy_level_shift_keeper"; USB3_GDSC-supply = <&gdsc_usb30>; vdd-supply = <&pm8953_l3>; From 29306c6230c5edbddba05e8b2d7dcf7280ba60ee Mon Sep 17 00:00:00 2001 From: Walter Yang Date: Wed, 7 Sep 2016 16:28:50 +0800 Subject: [PATCH 0184/1015] ASoC: msm: initialize the params array before using it The params array is used without initialization, which may cause security issues. Initialize it as all zero after the definition. CRs-Fixed: 1062271 Change-Id: If462fe3d82f139d72547f82dc7eb564f83cb35bf Signed-off-by: Walter Yang --- sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c index 26528e6a2bb83..58a4de5af145d 100644 --- a/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c @@ -1024,6 +1024,7 @@ static int msm_compr_ioctl_shared(struct snd_pcm_substream *substream, struct snd_dec_ddp *ddp = &compr->info.codec_param.codec.options.ddp; uint32_t params_length = 0; + memset(params_value, 0, MAX_AC3_PARAM_SIZE); /* check integer overflow */ if (ddp->params_length > UINT_MAX/sizeof(int)) { pr_err("%s: Integer overflow ddp->params_length %d\n", @@ -1064,6 +1065,7 @@ static int msm_compr_ioctl_shared(struct snd_pcm_substream *substream, struct snd_dec_ddp *ddp = &compr->info.codec_param.codec.options.ddp; uint32_t params_length = 0; + memset(params_value, 0, MAX_AC3_PARAM_SIZE); /* check integer overflow */ if (ddp->params_length > UINT_MAX/sizeof(int)) { pr_err("%s: Integer overflow ddp->params_length %d\n", From 5bc79426bdb20a0f8b5d2622cdd044a567b7386a Mon Sep 17 00:00:00 2001 From: Ashay Jaiswal Date: Thu, 22 Sep 2016 11:44:58 +0530 Subject: [PATCH 0185/1015] power: qpnp-typec: report POWER and DATA role for dual role typeC Userspace service expects dual_role_instance to report POWER and DATA role status in order to support role reversal. Add support to report mode, power and data role. While at it, enable uevent reporting to userspace for typeC detect and detach. CRs-Fixed: 1070388 Change-Id: I1cd394fb4951b758f73192f5a24e88442d4591ae Signed-off-by: Ashay Jaiswal --- drivers/power/qpnp-typec.c | 42 +++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/drivers/power/qpnp-typec.c b/drivers/power/qpnp-typec.c index 37d5db330b142..8fc721fc82588 100644 --- a/drivers/power/qpnp-typec.c +++ b/drivers/power/qpnp-typec.c @@ -57,7 +57,7 @@ #define QPNP_TYPEC_DEV_NAME "qcom,qpnp-typec" #define TYPEC_PSY_NAME "typec" -#define DUAL_ROLE_DESC_NAME "dual_role" +#define DUAL_ROLE_DESC_NAME "otg_default" enum cc_line_state { CC_1, @@ -385,6 +385,9 @@ static int qpnp_typec_handle_detach(struct qpnp_typec_chip *chip) pr_err("Failed to set DRP mode rc=%d\n", rc); } + if (chip->dr_inst) + dual_role_instance_changed(chip->dr_inst); + return rc; } @@ -460,6 +463,9 @@ static irqreturn_t ufp_detect_handler(int irq, void *_chip) if (rc) pr_err("failed to set TYPEC MODE on battery psy rc=%d\n", rc); + if (chip->dr_inst) + dual_role_instance_changed(chip->dr_inst); + pr_debug("UFP status reg = 0x%x current = %dma\n", reg, chip->current_ma); @@ -517,6 +523,9 @@ static irqreturn_t dfp_detect_handler(int irq, void *_chip) rc); } + if (chip->dr_inst) + dual_role_instance_changed(chip->dr_inst); + pr_debug("UFP status reg = 0x%x DFP status reg = 0x%x\n", reg[0], reg[1]); @@ -733,6 +742,8 @@ static void qpnp_typec_role_check_work(struct work_struct *work) enum dual_role_property qpnp_typec_dr_properties[] = { DUAL_ROLE_PROP_SUPPORTED_MODES, DUAL_ROLE_PROP_MODE, + DUAL_ROLE_PROP_PR, + DUAL_ROLE_PROP_DR, }; static int qpnp_typec_dr_is_writeable(struct dual_role_phy_instance *dual_role, @@ -816,19 +827,40 @@ static int qpnp_typec_dr_get_property(struct dual_role_phy_instance *dual_role, unsigned int *val) { struct qpnp_typec_chip *chip = dual_role_get_drvdata(dual_role); + unsigned int mode, power_role, data_role; if (!chip) return -EINVAL; + switch (chip->typec_state) { + case POWER_SUPPLY_TYPE_UFP: + mode = DUAL_ROLE_PROP_MODE_UFP; + power_role = DUAL_ROLE_PROP_PR_SNK; + data_role = DUAL_ROLE_PROP_DR_DEVICE; + break; + case POWER_SUPPLY_TYPE_DFP: + mode = DUAL_ROLE_PROP_MODE_DFP; + power_role = DUAL_ROLE_PROP_PR_SRC; + data_role = DUAL_ROLE_PROP_DR_HOST; + break; + default: + mode = DUAL_ROLE_PROP_MODE_NONE; + power_role = DUAL_ROLE_PROP_PR_NONE; + data_role = DUAL_ROLE_PROP_DR_NONE; + }; + switch (prop) { case DUAL_ROLE_PROP_SUPPORTED_MODES: *val = chip->dr_desc.supported_modes; break; case DUAL_ROLE_PROP_MODE: - *val = (chip->typec_state == POWER_SUPPLY_TYPE_UFP) - ? DUAL_ROLE_PROP_MODE_UFP - : (chip->typec_state == POWER_SUPPLY_TYPE_DFP) - ? DUAL_ROLE_PROP_MODE_DFP : DUAL_ROLE_PROP_MODE_NONE; + *val = mode; + break; + case DUAL_ROLE_PROP_PR: + *val = power_role; + break; + case DUAL_ROLE_PROP_DR: + *val = data_role; break; default: return -EINVAL; From a1f254461a5ef673e4eb42c501f9552d4b72695c Mon Sep 17 00:00:00 2001 From: Mayank Rana Date: Tue, 6 Sep 2016 13:45:08 -0700 Subject: [PATCH 0186/1015] dwc3-msm: Don't mark fatal error with IN_L2 for USB cable disconnect case In some cases, it has been observed that USB PHY is not going into IN_L2 state with USB cable disconnect case. This change marks seeing IN_L2 error as fatal with USB host mode or USB device bus suspend case only. USB cable disconnect functionality does power collapse USB controller and PHYs whereas performs POR sequence with USB cable connect. Hence going into USB LPM sequence with USB PHY not suspended properly should be no harm. This change also captures few important registers when IN_L2 error is seen. CRs-Fixed: 1063744 Change-Id: Ibe5a85ce4c78b7346e8840916f868cf8011e2b92 Signed-off-by: Mayank Rana --- drivers/usb/dwc3/dwc3-msm.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 32b0e90040bda..8df9c4470c612 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -97,6 +97,8 @@ MODULE_PARM_DESC(dcp_max_current, "max current drawn for DCP charger"); #define CGCTL_REG (QSCRATCH_REG_OFFSET + 0x28) #define PWR_EVNT_IRQ_STAT_REG (QSCRATCH_REG_OFFSET + 0x58) #define PWR_EVNT_IRQ_MASK_REG (QSCRATCH_REG_OFFSET + 0x5C) +#define QSCRATCH_USB30_STS_REG (QSCRATCH_REG_OFFSET + 0xF8) + #define PWR_EVNT_POWERDOWN_IN_P3_MASK BIT(2) #define PWR_EVNT_POWERDOWN_OUT_P3_MASK BIT(3) @@ -1879,6 +1881,7 @@ static int dwc3_msm_prepare_suspend(struct dwc3_msm *mdwc) { unsigned long timeout; u32 reg = 0; + struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3); if ((mdwc->in_host_mode || (mdwc->vbus_active && mdwc->otg_state == OTG_STATE_B_SUSPEND)) @@ -1908,8 +1911,17 @@ static int dwc3_msm_prepare_suspend(struct dwc3_msm *mdwc) if (!(reg & PWR_EVNT_LPM_IN_L2_MASK)) { dev_err(mdwc->dev, "could not transition HS PHY to L2\n"); - queue_delayed_work(mdwc->dwc3_wq, &mdwc->resume_work, 0); - return -EBUSY; + dbg_event(0xFF, "PWR_EVNT_LPM", + dwc3_msm_read_reg(mdwc->base, PWR_EVNT_IRQ_STAT_REG)); + dbg_event(0xFF, "QUSB_STS", + dwc3_msm_read_reg(mdwc->base, QSCRATCH_USB30_STS_REG)); + /* Mark fatal error for host mode or USB bus suspend case */ + if (mdwc->in_host_mode || (mdwc->vbus_active + && mdwc->otg_state == OTG_STATE_B_SUSPEND)) { + queue_delayed_work(mdwc->dwc3_wq, + &mdwc->resume_work, 0); + return -EBUSY; + } } /* Clear L2 event bit */ From fdca0b7c4964a60a351cfeceeed864d0b261230a Mon Sep 17 00:00:00 2001 From: Ashay Jaiswal Date: Tue, 9 Aug 2016 15:17:56 +0530 Subject: [PATCH 0187/1015] power: qpnp-smbcharger: add voting logic for enabling/disabling HVDCP HVDCP can be enabled from multiple location in the charger driver. Update HVDCP enable/disable logic to use voting mechanism. CRs-Fixed: 1050520 Change-Id: Ifa42d0d13a10ce803d5ce19e59659d56d0c92f43 Signed-off-by: Ashay Jaiswal --- drivers/power/qpnp-smbcharger.c | 67 ++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/drivers/power/qpnp-smbcharger.c b/drivers/power/qpnp-smbcharger.c index 16820ae2ad64c..b33904011ca31 100644 --- a/drivers/power/qpnp-smbcharger.c +++ b/drivers/power/qpnp-smbcharger.c @@ -279,6 +279,7 @@ struct smbchg_chip { struct votable *hw_aicl_rerun_disable_votable; struct votable *hw_aicl_rerun_enable_indirect_votable; struct votable *aicl_deglitch_short_votable; + struct votable *hvdcp_enable_votable; }; enum qpnp_schg { @@ -421,6 +422,12 @@ enum aicl_short_deglitch_voters { HVDCP_SHORT_DEGLITCH_VOTER, NUM_HW_SHORT_DEGLITCH_VOTERS, }; +enum hvdcp_voters { + HVDCP_PMIC_VOTER, + HVDCP_OTG_VOTER, + HVDCP_PULSING_VOTER, + NUM_HVDCP_VOTERS, +}; static int smbchg_debug_mask; module_param_named( debug_mask, smbchg_debug_mask, int, S_IRUSR | S_IWUSR @@ -2472,6 +2479,26 @@ static int dc_suspend_vote_cb(struct device *dev, int suspend, return rc; } +#define HVDCP_EN_BIT BIT(3) +static int smbchg_hvdcp_enable_cb(struct device *dev, int enable, + int client, int last_enable, + int last_client) +{ + int rc = 0; + struct smbchg_chip *chip = dev_get_drvdata(dev); + + pr_err("smbchg_hvdcp_enable_cb enable %d last_enable %d\n", + enable, last_enable); + rc = smbchg_sec_masked_write(chip, + chip->usb_chgpth_base + CHGPTH_CFG, + HVDCP_EN_BIT, enable ? HVDCP_EN_BIT : 0); + if (rc < 0) + dev_err(chip->dev, "Couldn't %s HVDCP rc=%d\n", + enable ? "enable" : "disable", rc); + + return rc; +} + static int set_fastchg_current_vote_cb(struct device *dev, int fcc_ma, int client, @@ -3836,7 +3863,6 @@ struct regulator_ops smbchg_otg_reg_ops = { #define USBIN_ADAPTER_9V 0x3 #define USBIN_ADAPTER_5V_9V_CONT 0x2 #define USBIN_ADAPTER_5V_UNREGULATED_9V 0x5 -#define HVDCP_EN_BIT BIT(3) static int smbchg_external_otg_regulator_enable(struct regulator_dev *rdev) { int rc = 0; @@ -3860,9 +3886,7 @@ static int smbchg_external_otg_regulator_enable(struct regulator_dev *rdev) * allowance to 9V, so that the audio boost operating in reverse never * gets detected as a valid input */ - rc = smbchg_sec_masked_write(chip, - chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, 0); + rc = vote(chip->hvdcp_enable_votable, HVDCP_OTG_VOTER, true, 0); if (rc < 0) { dev_err(chip->dev, "Couldn't disable HVDCP rc=%d\n", rc); return rc; @@ -3896,9 +3920,7 @@ static int smbchg_external_otg_regulator_disable(struct regulator_dev *rdev) * value in order to allow normal USBs to be recognized as a valid * input. */ - rc = smbchg_sec_masked_write(chip, - chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, HVDCP_EN_BIT); + rc = vote(chip->hvdcp_enable_votable, HVDCP_OTG_VOTER, false, 1); if (rc < 0) { dev_err(chip->dev, "Couldn't enable HVDCP rc=%d\n", rc); return rc; @@ -4636,9 +4658,7 @@ static void restore_from_hvdcp_detection(struct smbchg_chip *chip) pr_err("Couldn't configure HVDCP 9V rc=%d\n", rc); /* enable HVDCP */ - rc = smbchg_sec_masked_write(chip, - chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, HVDCP_EN_BIT); + rc = vote(chip->hvdcp_enable_votable, HVDCP_PULSING_VOTER, false, 1); if (rc < 0) pr_err("Couldn't enable HVDCP rc=%d\n", rc); @@ -5189,8 +5209,7 @@ static int smbchg_prepare_for_pulsing(struct smbchg_chip *chip) /* disable HVDCP */ pr_smb(PR_MISC, "Disable HVDCP\n"); - rc = smbchg_sec_masked_write(chip, chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, 0); + rc = vote(chip->hvdcp_enable_votable, HVDCP_PULSING_VOTER, true, 0); if (rc < 0) { pr_err("Couldn't disable HVDCP rc=%d\n", rc); goto out; @@ -5295,9 +5314,7 @@ static int smbchg_unprepare_for_pulsing(struct smbchg_chip *chip) /* enable HVDCP */ pr_smb(PR_MISC, "Enable HVDCP\n"); - rc = smbchg_sec_masked_write(chip, - chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, HVDCP_EN_BIT); + rc = vote(chip->hvdcp_enable_votable, HVDCP_PULSING_VOTER, false, 1); if (rc < 0) { pr_err("Couldn't enable HVDCP rc=%d\n", rc); return rc; @@ -6850,7 +6867,15 @@ static int smbchg_hw_init(struct smbchg_chip *chip) chip->revision[ANA_MAJOR], chip->revision[ANA_MINOR]); /* Setup 9V HVDCP */ - if (!chip->hvdcp_not_supported) { + if (chip->hvdcp_not_supported) { + rc = vote(chip->hvdcp_enable_votable, HVDCP_PMIC_VOTER, + true, 0); + if (rc < 0) { + dev_err(chip->dev, "Couldn't disable HVDCP rc=%d\n", + rc); + return rc; + } + } else { rc = smbchg_sec_masked_write(chip, chip->usb_chgpth_base + CHGPTH_CFG, HVDCP_ADAPTER_SEL_MASK, HVDCP_9V); @@ -8147,6 +8172,13 @@ static int smbchg_probe(struct spmi_device *spmi) if (IS_ERR(chip->aicl_deglitch_short_votable)) return PTR_ERR(chip->aicl_deglitch_short_votable); + chip->hvdcp_enable_votable = create_votable(&spmi->dev, + "SMBCHG: hvdcp_enable", + VOTE_MIN, NUM_HVDCP_VOTERS, 1, + smbchg_hvdcp_enable_cb); + if (IS_ERR(chip->hvdcp_enable_votable)) + return PTR_ERR(chip->hvdcp_enable_votable); + INIT_WORK(&chip->usb_set_online_work, smbchg_usb_update_online_work); INIT_DELAYED_WORK(&chip->parallel_en_work, smbchg_parallel_usb_en_work); @@ -8406,8 +8438,7 @@ static void smbchg_shutdown(struct spmi_device *spmi) /* disable HVDCP */ pr_smb(PR_MISC, "Disable HVDCP\n"); - rc = smbchg_sec_masked_write(chip, chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, 0); + rc = vote(chip->hvdcp_enable_votable, HVDCP_PMIC_VOTER, true, 0); if (rc < 0) pr_err("Couldn't disable HVDCP rc=%d\n", rc); From 7da98194c3eef8054c144eef9871b490e00b7bf3 Mon Sep 17 00:00:00 2001 From: Dhoat Harpal Date: Mon, 28 Mar 2016 19:25:27 +0530 Subject: [PATCH 0188/1015] soc: qcom: glink: Best Fit approach to find intent Using first fit algorithm to select the remote rx intent from the list is not optimal way. Optimize the selection of intent from list using the best fit algorithm. CRs-Fixed: 1058750 Change-Id: I7b2a70188975b75a0fbcd2a6cb26f28cc0258532 Signed-off-by: Dhoat Harpal --- drivers/soc/qcom/glink.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/drivers/soc/qcom/glink.c b/drivers/soc/qcom/glink.c index 277ab9786aa90..8b57e3bb9db8b 100644 --- a/drivers/soc/qcom/glink.c +++ b/drivers/soc/qcom/glink.c @@ -1146,6 +1146,7 @@ int ch_pop_remote_rx_intent(struct channel_ctx *ctx, size_t size, { struct glink_core_rx_intent *intent; struct glink_core_rx_intent *intent_tmp; + struct glink_core_rx_intent *best_intent = NULL; unsigned long flags; if (GLINK_MAX_PKT_SIZE < size) { @@ -1168,20 +1169,28 @@ int ch_pop_remote_rx_intent(struct channel_ctx *ctx, size_t size, list_for_each_entry_safe(intent, intent_tmp, &ctx->rmt_rx_intent_list, list) { if (intent->intent_size >= size) { - list_del(&intent->list); - GLINK_DBG_CH(ctx, - "%s: R[%u]:%zu Removed remote intent\n", - __func__, - intent->id, - intent->intent_size); - *riid_ptr = intent->id; - *intent_size = intent->intent_size; - kfree(intent); - spin_unlock_irqrestore( - &ctx->rmt_rx_intent_lst_lock_lhc2, flags); - return 0; + if (!best_intent) + best_intent = intent; + else if (best_intent->intent_size > intent->intent_size) + best_intent = intent; + if (best_intent->intent_size == size) + break; } } + if (best_intent) { + list_del(&best_intent->list); + GLINK_DBG_CH(ctx, + "%s: R[%u]:%zu Removed remote intent\n", + __func__, + best_intent->id, + best_intent->intent_size); + *riid_ptr = best_intent->id; + *intent_size = best_intent->intent_size; + kfree(best_intent); + spin_unlock_irqrestore( + &ctx->rmt_rx_intent_lst_lock_lhc2, flags); + return 0; + } spin_unlock_irqrestore(&ctx->rmt_rx_intent_lst_lock_lhc2, flags); return -EAGAIN; } @@ -2824,7 +2833,7 @@ static int glink_tx_common(void *handle, void *pkt_priv, tracer_pkt_log_event(data, GLINK_CORE_TX); } - /* find matching rx intent (first-fit algorithm for now) */ + /* find matching rx intent (best-fit algorithm for now) */ if (ch_pop_remote_rx_intent(ctx, size, &riid, &intent_size)) { if (!(tx_flags & GLINK_TX_REQ_INTENT)) { /* no rx intent available */ From 1dfdb787ade94d57682cb279258800893f9d1b18 Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Wed, 28 Sep 2016 16:53:59 +0530 Subject: [PATCH 0189/1015] msm: msm_bus: Clean up Bandwidth Monitor driver Clean up allocated memory once it's use is done. Use proper variable type for reporting trip threshold. Change-Id: I80a0250a546709ff8bd9296be65b6ec7f5081990 Signed-off-by: Manaf Meethalavalappu Pallikunhi --- .../msm/msm_bus/msm_bandwidth_monitor.c | 86 +++++++++++-------- 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c b/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c index fd088a239ba6c..355fdc94ff3fe 100644 --- a/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c +++ b/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c @@ -45,7 +45,7 @@ enum bm_threshold_id { struct bm_thresh_state { enum thermal_trip_activation_mode state; - int trip_bw; + u64 trip_bw; }; struct bm_tz_sensor { @@ -81,17 +81,17 @@ struct bm_sensors_drv_data { static struct bm_sensors_drv_data *bmdev; static void notify_bw_threshold_event(struct bm_tz_sensor *sensor, - struct bus_rule_type *rule, uint32_t action) + struct bus_rule_type *rule, uint32_t action, + enum bm_threshold_id thresh_id) { - enum bm_threshold_id thresh_id; u64 bw = 0; int ret = 0; - if (!sensor || !rule) { + if (!sensor || !rule || thresh_id < 0 || + thresh_id >= MAX_BM_THRESHOLD) { pr_err("Invalid input parameters\n"); return; } - thresh_id = *(int *)(rule->client_data); if (action == RULE_STATE_APPLIED) { sensor->thresh_state[thresh_id].state @@ -112,8 +112,26 @@ static void notify_bw_threshold_event(struct bm_tz_sensor *sensor, } } +static void cleanup_bus_rule(struct bus_rule_type *rule) +{ + if (!rule) { + pr_err("input is NULL\n"); + return; + } + + if (rule->src_id) + devm_kfree(&bmdev->pdev->dev, rule->src_id); + if (rule->src_field) + devm_kfree(&bmdev->pdev->dev, rule->src_field); + if (rule->op) + devm_kfree(&bmdev->pdev->dev, rule->op); + if (rule->thresh) + devm_kfree(&bmdev->pdev->dev, rule->thresh); +} + static int create_bus_rule(struct bus_rule_type *rule, int src_cnt, - int *src_ids, int src_field, int op, u64 val, int thresh_id) + int *src_ids, int src_field, int op, u64 val, + unsigned int *thresh_action) { int i = 0, ret = 0; @@ -141,12 +159,6 @@ static int create_bus_rule(struct bus_rule_type *rule, int src_cnt, if (ret) goto rule_exit; } - if (!rule->client_data) { - ALLOC_KMEM(&bmdev->pdev->dev, rule->client_data, - int, 1, ret); - if (ret) - goto rule_exit; - } rule->num_src = src_cnt; for (; i < src_cnt; i++) @@ -158,23 +170,13 @@ static int create_bus_rule(struct bus_rule_type *rule, int src_cnt, rule->num_dst = 0; rule->dst_node = NULL; rule->mode = THROTTLE_OFF; - *(int *)(rule->client_data) = thresh_id; + rule->client_data = (void *)thresh_action; rule->dst_bw = 0; rule->combo_op = 0; rule_exit: - if (ret) { - if (rule->src_id) - devm_kfree(&bmdev->pdev->dev, rule->src_id); - if (rule->src_field) - devm_kfree(&bmdev->pdev->dev, rule->src_field); - if (rule->op) - devm_kfree(&bmdev->pdev->dev, rule->op); - if (rule->thresh) - devm_kfree(&bmdev->pdev->dev, rule->thresh); - if (rule->client_data) - devm_kfree(&bmdev->pdev->dev, rule->client_data); - } + if (ret) + cleanup_bus_rule(rule); return ret; } @@ -195,7 +197,7 @@ static void bm_tz_notify_wq(struct work_struct *work) MAX_BM_THRESHOLD) { notify_bw_threshold_event(&bmdev->bm_tz_sensors[i], &bmdev->bm_tz_sensors[i].thresh_bus_rule[j], - bmdev->bm_tz_sensors[i].bus_rule_action[j]); + bmdev->bm_tz_sensors[i].bus_rule_action[j], j); clear_bit(j, bmdev->bm_tz_sensors[i].triggered); } } @@ -205,11 +207,20 @@ static void bm_tz_notify_wq(struct work_struct *work) static int bm_threshold_cb(struct notifier_block *nb, unsigned long action, void *data) { + int thresh_id = 0; struct bm_tz_sensor *bm_sensor = container_of(nb, struct bm_tz_sensor, bm_nb); struct bus_rule_type *rule = data; - enum bm_threshold_id thresh_id = *(int *)(rule->client_data); + unsigned int *bus_rule_action = (unsigned int *)(rule->client_data); + + for (; thresh_id < MAX_BM_THRESHOLD; thresh_id++) + if (&bm_sensor->bus_rule_action[thresh_id] == bus_rule_action) + break; + if (thresh_id >= MAX_BM_THRESHOLD) { + pr_err("No matching client data. id:%d\n", thresh_id); + return 0; + } pr_debug( "srcid:%d, srcfld:%d op:%d thresh:%llu threshid:%d action:%lu curr_bw:%llu\n", *(rule->src_id), *(rule->src_field), *(rule->op), *(rule->thresh), @@ -284,7 +295,8 @@ static int bm_tz_activate_trip_type(struct thermal_zone_device *bm, struct bm_tz_sensor *bm_sensor = bm->devdata; struct bus_rule_type new_rule = {0}; int op = -1; - int thresh, ret = 0; + int ret = 0; + u64 thresh = 0; if (!bm_sensor || trip < 0) return -EINVAL; @@ -296,7 +308,7 @@ static int bm_tz_activate_trip_type(struct thermal_zone_device *bm, thresh = bm_sensor->thresh_state[BM_HIGH_THRESHOLD].trip_bw; else - thresh = UINT_MAX; + thresh = ULLONG_MAX; op = OP_GT; break; case BM_LOW_THRESHOLD: @@ -315,24 +327,26 @@ static int bm_tz_activate_trip_type(struct thermal_zone_device *bm, ret = create_bus_rule(&new_rule, bm_sensor->src_cnt, bm_sensor->src_id, - bm_sensor->src_field, op, thresh, trip); + bm_sensor->src_field, op, thresh, + &bm_sensor->bus_rule_action[trip]); if (ret) goto exit; bm_sensor->bm_nb.notifier_call = bm_threshold_cb; + mutex_lock(&bmdev->rule_lock); msm_rule_update(&bm_sensor->thresh_bus_rule[trip], &new_rule, &bm_sensor->bm_nb); - memcpy(&bm_sensor->thresh_bus_rule[trip], &new_rule, - sizeof(struct bus_rule_type)); + *(bm_sensor->thresh_bus_rule[trip].thresh) = thresh; msm_rule_evaluate_rules(bm_sensor->thresh_bus_rule[trip].src_id[0]); + cleanup_bus_rule(&new_rule); + mutex_unlock(&bmdev->rule_lock); pr_debug( "srcid:%d, srcfld:%d op:%d thresh:%llu threshid:%d\n", *(bm_sensor->thresh_bus_rule[trip].src_id), *(bm_sensor->thresh_bus_rule[trip].src_field), *(bm_sensor->thresh_bus_rule[trip].op), - *(bm_sensor->thresh_bus_rule[trip].thresh), - *(int *)(bm_sensor->thresh_bus_rule[trip].client_data)); + *(bm_sensor->thresh_bus_rule[trip].thresh), trip); exit: return 0; @@ -525,7 +539,7 @@ static int init_bm_default_rules(void) &bm_sens->thresh_bus_rule[BM_HIGH_THRESHOLD], bm_sens->src_cnt, bm_sens->src_id, bm_sens->src_field, OP_GT, ULLONG_MAX, - BM_HIGH_THRESHOLD); + &bm_sens->bus_rule_action[BM_HIGH_THRESHOLD]); if (ret) { pr_err("Creating bus rule is failed. ret:%d\n", ret); goto exit; @@ -535,7 +549,7 @@ static int init_bm_default_rules(void) &bm_sens->thresh_bus_rule[BM_LOW_THRESHOLD], bm_sens->src_cnt, bm_sens->src_id, bm_sens->src_field, OP_LT, 0, - BM_LOW_THRESHOLD); + &bm_sens->bus_rule_action[BM_LOW_THRESHOLD]); if (ret) { pr_err("Creating bus rule is failed. ret:%d\n", ret); goto exit; From d30086314fc818c70d654c53b0de3735740cc4f9 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Thu, 25 Aug 2016 16:17:48 -0700 Subject: [PATCH 0190/1015] usb: dwc3: restart usb upon endpoint cmd timeout Sometime endpoint command timeout happening after usb device enumeration. Controller stops responding to any endpoint commands afterwards. To recover from this condition restart usb by simulating vbus off and on except for end transfer command. Also increase the command timeout from 1500us to 3000us. Change-Id: I7c1833d844fd432b33158686361e24e66a2fd92c Signed-off-by: Hemant Kumar --- drivers/usb/dwc3/core.h | 1 + drivers/usb/dwc3/dwc3-msm.c | 2 +- drivers/usb/dwc3/gadget.c | 7 ++++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 36073f29088ae..53b7ed0fad52d 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -975,6 +975,7 @@ struct dwc3 { int irq; struct tasklet_struct bh; unsigned long irq_cnt; + unsigned long ep_cmd_timeout_cnt; unsigned bh_completion_time[MAX_INTR_STATS]; unsigned bh_handled_evt_cnt[MAX_INTR_STATS]; unsigned bh_dbg_index; diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 32b0e90040bda..22409ea575e13 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -1797,7 +1797,7 @@ static void dwc3_msm_notify_event(struct dwc3 *dwc, unsigned event, break; case DWC3_CONTROLLER_RESTART_USB_SESSION: dev_dbg(mdwc->dev, "DWC3_CONTROLLER_RESTART_USB_SESSION received\n"); - dwc3_restart_usb_work(&mdwc->restart_usb_work); + schedule_work(&mdwc->restart_usb_work); break; case DWC3_CONTROLLER_NOTIFY_DISABLE_UPDXFER: dwc3_msm_dbm_disable_updxfer(dwc, value); diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 34935b3edeb84..9d394b2adb3f4 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -344,7 +344,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, unsigned cmd, struct dwc3_gadget_ep_cmd_params *params) { struct dwc3_ep *dep = dwc->eps[ep]; - u32 timeout = 1500; + u32 timeout = 3000; u32 reg; trace_dwc3_gadget_ep_cmd(dep, cmd, params); @@ -381,6 +381,11 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, if (!timeout) { dev_err(dwc->dev, "%s command timeout for %s\n", dwc3_gadget_ep_cmd_string(cmd), dep->name); + if (!(cmd & DWC3_DEPCMD_ENDTRANSFER)) { + dwc->ep_cmd_timeout_cnt++; + dwc3_notify_event(dwc, + DWC3_CONTROLLER_RESTART_USB_SESSION, 0); + } return -ETIMEDOUT; } From 875dd8f3cdab40ef883c0cade020555e7c4ca04a Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Wed, 28 Sep 2016 11:20:49 +0530 Subject: [PATCH 0191/1015] msm: kgsl: Fix dispatch_q NULL dereference Add a NULL check for dispatch_q which will avoid NULL pointer dereference in dispatcher_do_fault(). Change-Id: I429aa91f9c5fa92ce2e8b23cc4911454744f75c9 Signed-off-by: Hareesh Gundu --- drivers/gpu/msm/adreno_dispatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c index 5d3b2b8a72664..522c32743d3dd 100644 --- a/drivers/gpu/msm/adreno_dispatch.c +++ b/drivers/gpu/msm/adreno_dispatch.c @@ -1814,7 +1814,7 @@ static int dispatcher_do_fault(struct adreno_device *adreno_dev) } } - if (!adreno_cmdqueue_is_empty(dispatch_q)) { + if (dispatch_q && !adreno_cmdqueue_is_empty(dispatch_q)) { cmdbatch = dispatch_q->cmd_q[dispatch_q->head]; trace_adreno_cmdbatch_fault(cmdbatch, fault); } From c9897a642fbee4500b8d04d10719a7da91e7462e Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Tue, 6 Sep 2016 15:38:28 +0530 Subject: [PATCH 0192/1015] ARM: dts: msm: Add multimedia bandwidth monitor sensor for msm8920 Enable multimedia bandwidth monitor sensor for msm8920. It adds new thermal zone sensor for userspace client to monitor multimedia bandwidth. Change-Id: Ib87ac5464bedcc535afc7fb0143dc1a7d1f88e0f Signed-off-by: Manaf Meethalavalappu Pallikunhi --- arch/arm/boot/dts/qcom/msm8920.dtsi | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index f754e3cfe530d..95075d596a033 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -38,6 +38,15 @@ qcom,bus-dev = <&fab_snoc>; qcom,mas-rpm-id = ; }; + + qcom,bm-sensors { + compatible = "qcom,bm-sensors"; + + bw_mm { + qcom,bm-sensor = <&slv_snoc_bimc_2 &mas_vfe0 &mas_vfe1>; + qcom,bm-sensor-field = "ab"; + }; + }; }; &clock_gcc { From e034339384008015977e7fe09092b9a052f01719 Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Fri, 23 Sep 2016 20:28:18 +0530 Subject: [PATCH 0193/1015] ARM: dts: msm: Add multimedia bandwidth sensor info for msm8920 Add multimedia bandwidth monitor sensor info to KTM sensor info nodes for msm8920. It enables userspace thermal daemon to use this sensor. Change-Id: If8c7fac8f0795eed2398cf46d8feea2ed91f097d Signed-off-by: Manaf Meethalavalappu Pallikunhi --- arch/arm/boot/dts/qcom/msm8920.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 95075d596a033..1d09fbb259699 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -165,4 +165,12 @@ qcom,ipa-loaduC; qcom,ipa-advertise-sg-support; }; + + qcom,sensor-information { + sensor_information16: qcom,sensor-information-16 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "bw_mm"; + qcom,scaling-factor = <1000>; + }; + }; }; From a4a147b650b148dca63aaf427370dc20eaf7c81e Mon Sep 17 00:00:00 2001 From: Dhoat Harpal Date: Tue, 19 Apr 2016 15:52:10 +0530 Subject: [PATCH 0194/1015] soc: qcom: glink: Fix uninitialzed return value. Initialize the return value in function glink close. CRs-Fixed: 1067981 Change-Id: I3f78196927501f582c36d5815096581185d797b4 Signed-off-by: Dhoat Harpal --- drivers/soc/qcom/glink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/qcom/glink.c b/drivers/soc/qcom/glink.c index 277ab9786aa90..32a8593ff4ab1 100644 --- a/drivers/soc/qcom/glink.c +++ b/drivers/soc/qcom/glink.c @@ -2663,7 +2663,7 @@ int glink_close(void *handle) { struct glink_core_xprt_ctx *xprt_ctx = NULL; struct channel_ctx *ctx = (struct channel_ctx *)handle; - int ret; + int ret = 0; unsigned long flags; bool is_empty = false; From caba38cf031727ebf9546b24b61ee371a265d103 Mon Sep 17 00:00:00 2001 From: Shiraz Hashim Date: Tue, 6 Sep 2016 13:07:45 +0530 Subject: [PATCH 0195/1015] ARM: dts: msm: split adsp and wcnss f/w region for msm89{17,37,40,53} WCNSS is using more than what pil allocates for its firmware region. This extra usage is based on assumption that full carve-out region is available to it. The extra memory is used by wcnss and apps exclusive to allocated wcnss firmware region and is protected differently by TZ. This whole assumption is flawed and design should be fixed. Till then separate out wcnss region so that no one else can use it. Change-Id: Iafbcb6de2588c5cdc407470e5dcb0c6879eef2e3 Signed-off-by: Shiraz Hashim --- arch/arm/boot/dts/qcom/msm8917.dtsi | 14 ++++++++++---- arch/arm/boot/dts/qcom/msm8937.dtsi | 15 +++++++++++---- arch/arm/boot/dts/qcom/msm8940.dtsi | 8 ++++++-- arch/arm/boot/dts/qcom/msm8953.dtsi | 14 ++++++++++---- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index 14e5c3b6e9aaa..8e8f31dd3d0a1 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -64,10 +64,16 @@ reg = <0x0 0x86800000 0x0 0x5000000>; }; - reloc_mem: reloc_region@0 { + adsp_fw_mem: adsp_fw_region@0 { compatible = "removed-dma-pool"; no-map; - reg = <0x0 0x8b800000 0x0 0x1800000>; + reg = <0x0 0x8b800000 0x0 0x1100000>; + }; + + wcnss_fw_mem: wcnss_fw_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x8c900000 0x0 0x700000>; }; venus_mem: venus_region@0 { @@ -1591,7 +1597,7 @@ /* GPIO output to lpass */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_2_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&adsp_fw_mem>; }; qcom,pronto@a21b000 { @@ -1629,7 +1635,7 @@ /* GPIO output to wcnss */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_4_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&wcnss_fw_mem>; }; qcom,venus@1de0000 { diff --git a/arch/arm/boot/dts/qcom/msm8937.dtsi b/arch/arm/boot/dts/qcom/msm8937.dtsi index 2fa44b391907a..b3c684453a119 100644 --- a/arch/arm/boot/dts/qcom/msm8937.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937.dtsi @@ -42,12 +42,19 @@ reg = <0x0 0x86800000 0x0 0x5000000>; }; - reloc_mem: reloc_region@0 { + adsp_fw_mem: adsp_fw_region@0 { compatible = "removed-dma-pool"; no-map; - reg = <0x0 0x8b800000 0x0 0x1800000>; + reg = <0x0 0x8b800000 0x0 0x1100000>; }; + wcnss_fw_mem: wcnss_fw_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x8c900000 0x0 0x700000>; + }; + + venus_mem: venus_region@0 { compatible = "shared-dma-pool"; reusable; @@ -1849,7 +1856,7 @@ /* GPIO output to lpass */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_2_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&adsp_fw_mem>; }; qcom,pronto@a21b000 { @@ -1887,7 +1894,7 @@ /* GPIO output to wcnss */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_4_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&wcnss_fw_mem>; }; qcom,venus@1de0000 { diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index b163dfd984ce1..3acd12aef8417 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -261,8 +261,12 @@ reg = <0x0 0x86800000 0x0 0x6a00000>; }; -&reloc_mem { - reg = <0x0 0x8d200000 0x0 0x1800000>; +&adsp_fw_mem { + reg = <0x0 0x8d200000 0x0 0x1100000>; +}; + +&wcnss_fw_mem { + reg = <0x0 0x8e300000 0x0 0x700000>; }; &funnel_apss { diff --git a/arch/arm/boot/dts/qcom/msm8953.dtsi b/arch/arm/boot/dts/qcom/msm8953.dtsi index 83e6d8a2b058d..0dfc206c1f258 100644 --- a/arch/arm/boot/dts/qcom/msm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953.dtsi @@ -43,10 +43,16 @@ reg = <0x0 0x86c00000 0x0 0x6a00000>; }; - reloc_mem: reloc_region@0 { + adsp_fw_mem: adsp_fw_region@0 { compatible = "removed-dma-pool"; no-map; - reg = <0x0 0x8d600000 0x0 0x1800000>; + reg = <0x0 0x8d600000 0x0 0x1100000>; + }; + + wcnss_fw_mem: wcnss_fw_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x8e700000 0x0 0x700000>; }; venus_mem: venus_region@0 { @@ -1901,7 +1907,7 @@ /* GPIO output to lpass */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_2_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&adsp_fw_mem>; }; qcom,venus@1de0000 { @@ -1981,7 +1987,7 @@ /* GPIO output to wcnss */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_4_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&wcnss_fw_mem>; }; usb3: ssusb@7000000{ From 9c3b06b2f12641cf80a9152f70170132294c8836 Mon Sep 17 00:00:00 2001 From: Shiraz Hashim Date: Tue, 27 Sep 2016 11:59:03 +0530 Subject: [PATCH 0196/1015] ARM: dts: msm: Update memory map for msm8920 Update msm8920 memory map which is derived from msm8917 and needs 106MB of modem region. Change-Id: Ie0b2986cc2d2a078c7a962cf5bb5d8b6232fb31d Signed-off-by: Shiraz Hashim --- arch/arm/boot/dts/qcom/msm8920.dtsi | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 95075d596a033..7bddd58e33db5 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -23,6 +23,18 @@ soc: soc { }; }; +&modem_mem { + reg = <0x0 0x86800000 0x0 0x6a00000>; +}; + +&adsp_fw_mem { + reg = <0x0 0x8d200000 0x0 0x1100000>; +}; + +&wcnss_fw_mem { + reg = <0x0 0x8e300000 0x0 0x700000>; +}; + &ad_hoc_bus { mas_ipa: mas-ipa { cell-id = ; From a6a12d8b2beeb6b94b27c42dd3675989735518a1 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Fri, 30 Sep 2016 15:00:32 +0530 Subject: [PATCH 0197/1015] msm: kgsl: Fix potential device NULL pointer dereferences Ensure that device pointer isn't NULL before using it in kgsl_snapshot_save_frozen_objs(). Change-Id: I676dfa5567b1d09427e3e7691045fabc71b53d43 Signed-off-by: Hareesh Gundu --- drivers/gpu/msm/kgsl_snapshot.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/gpu/msm/kgsl_snapshot.c b/drivers/gpu/msm/kgsl_snapshot.c index cf4d77932e147..ea4dab4aea508 100644 --- a/drivers/gpu/msm/kgsl_snapshot.c +++ b/drivers/gpu/msm/kgsl_snapshot.c @@ -1060,6 +1060,9 @@ void kgsl_snapshot_save_frozen_objs(struct work_struct *work) size_t size = 0; void *ptr; + if (IS_ERR_OR_NULL(device)) + return; + kgsl_snapshot_process_ib_obj_list(snapshot); list_for_each_entry(obj, &snapshot->obj_list, node) { From 0a37e87a81492ef7063a934964381886d4dc3fce Mon Sep 17 00:00:00 2001 From: Ravi Kumar Siddojigari Date: Tue, 20 Sep 2016 14:27:36 +0530 Subject: [PATCH 0198/1015] input: synaptics_dsx: allocate heap memory for temp buf There is a possible stack overflow vulnerability in the rmidev_write function because the stack array size is from user space. changes to allocate heap memory for the temporary buffer instead of stack memory to prevent the stack overflow vulnerability. As discussed under CVE-2016-3865 and ANDROID-28799389. Change-Id: I20f639e09aaf3c533c98a12a2413570feae3d6d0 Signed-off-by: Ravi Kumar Siddojigari Signed-off-by: Shantanu Jain --- .../synaptics_dsx/synaptics_dsx_rmi_dev.c | 21 +++++++++++++------ drivers/input/touchscreen/synaptics_rmi_dev.c | 20 +++++++++++++----- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c index 4c341ffb60940..9d61eb110e2f1 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c @@ -347,7 +347,7 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { ssize_t retval; - unsigned char tmpbuf[count + 1]; + unsigned char *tmpbuf; struct rmidev_data *dev_data = filp->private_data; if (IS_ERR(dev_data)) { @@ -361,6 +361,10 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; + tmpbuf = kzalloc(count + 1, GFP_KERNEL); + if (!tmpbuf) + return -ENOMEM; + mutex_lock(&(dev_data->file_mutex)); retval = synaptics_rmi4_reg_read(rmidev->rmi4_data, @@ -377,7 +381,7 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, clean_up: mutex_unlock(&(dev_data->file_mutex)); - + kfree(tmpbuf); return retval; } @@ -393,7 +397,7 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { ssize_t retval; - unsigned char tmpbuf[count + 1]; + unsigned char *tmpbuf; struct rmidev_data *dev_data = filp->private_data; if (IS_ERR(dev_data)) { @@ -407,9 +411,14 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; - if (copy_from_user(tmpbuf, buf, count)) - return -EFAULT; + tmpbuf = kzalloc(count + 1, GFP_KERNEL); + if (!tmpbuf) + return -ENOMEM; + if (copy_from_user(tmpbuf, buf, count)) { + kfree(tmpbuf); + return -EFAULT; + } mutex_lock(&(dev_data->file_mutex)); retval = synaptics_rmi4_reg_write(rmidev->rmi4_data, @@ -420,7 +429,7 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, *f_pos += retval; mutex_unlock(&(dev_data->file_mutex)); - + kfree(tmpbuf); return retval; } diff --git a/drivers/input/touchscreen/synaptics_rmi_dev.c b/drivers/input/touchscreen/synaptics_rmi_dev.c index 839635d093063..06cf89ff7f6c3 100644 --- a/drivers/input/touchscreen/synaptics_rmi_dev.c +++ b/drivers/input/touchscreen/synaptics_rmi_dev.c @@ -299,7 +299,7 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { ssize_t retval; - unsigned char tmpbuf[count + 1]; + unsigned char *tmpbuf; struct rmidev_data *dev_data = filp->private_data; if (IS_ERR(dev_data)) { @@ -313,6 +313,10 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; + tmpbuf = kzalloc(count + 1, GFP_KERNEL); + if (!tmpbuf) + return -ENOMEM; + mutex_lock(&(dev_data->file_mutex)); retval = rmidev->fn_ptr->read(rmidev->rmi4_data, @@ -329,7 +333,7 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, clean_up: mutex_unlock(&(dev_data->file_mutex)); - + kfree(tmpbuf); return retval; } @@ -345,7 +349,7 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { ssize_t retval; - unsigned char tmpbuf[count + 1]; + unsigned char *tmpbuf; struct rmidev_data *dev_data = filp->private_data; if (IS_ERR(dev_data)) { @@ -359,8 +363,14 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; - if (copy_from_user(tmpbuf, buf, count)) + tmpbuf = kzalloc(count + 1, GFP_KERNEL); + if (!tmpbuf) + return -ENOMEM; + + if (copy_from_user(tmpbuf, buf, count)) { + kfree(tmpbuf); return -EFAULT; + } mutex_lock(&(dev_data->file_mutex)); @@ -372,7 +382,7 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, *f_pos += retval; mutex_unlock(&(dev_data->file_mutex)); - + free(tmpbuf); return retval; } From ee16fec1d0cda3727af6dbfd8bd43205d9b405eb Mon Sep 17 00:00:00 2001 From: "Suzuki K. Poulose" Date: Tue, 17 Mar 2015 18:14:59 +0000 Subject: [PATCH 0199/1015] arm64: perf: reject groups spanning multiple HW PMUs The perf core implicitly rejects events spanning multiple HW PMUs, as in these cases the event->ctx will differ. However this validation is performed after pmu::event_init() is called in perf_init_event(), and thus pmu::event_init() may be called with a group leader from a different HW PMU. The ARM64 PMU driver does not take this fact into account, and when validating groups assumes that it can call to_arm_pmu(event->pmu) for any HW event. When the event in question is from another HW PMU this is wrong, and results in dereferencing garbage. This patch updates the ARM64 PMU driver to first test for and reject events from other PMUs, moving the to_arm_pmu and related logic after this test. Fixes a crash triggered by perf_fuzzer on Linux-4.0-rc2, with a CCI PMU present: Bad mode in Synchronous Abort handler detected, code 0x86000006 -- IABT (current EL) CPU: 0 PID: 1371 Comm: perf_fuzzer Not tainted 3.19.0+ #249 Hardware name: V2F-1XV7 Cortex-A53x2 SMM (DT) task: ffffffc07c73a280 ti: ffffffc07b0a0000 task.ti: ffffffc07b0a0000 PC is at 0x0 LR is at validate_event+0x90/0xa8 pc : [<0000000000000000>] lr : [] pstate: 00000145 sp : ffffffc07b0a3ba0 [< (null)>] (null) [] armpmu_event_init+0x174/0x3cc [] perf_try_init_event+0x34/0x70 [] perf_init_event+0xe0/0x10c [] perf_event_alloc+0x288/0x358 [] SyS_perf_event_open+0x464/0x98c Code: bad PC value Also cleans up the code to use the arm_pmu only when we know that we are dealing with an arm pmu event. Cc: Will Deacon Acked-by: Mark Rutland Acked-by: Peter Ziljstra (Intel) Signed-off-by: Suzuki K. Poulose Signed-off-by: Will Deacon Git-commit: 8fff105e13041e49b82f92eef034f363a6b1c071 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Change-Id: I2ab941e9936726c6222975bdfc9f98e46284fe25 Signed-off-by: Patrick Fay --- arch/arm64/kernel/perf_event.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index 1a4a85e7fa9d2..6f7e143cdb860 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c @@ -330,22 +330,31 @@ armpmu_add(struct perf_event *event, int flags) } static int -validate_event(struct pmu_hw_events *hw_events, - struct perf_event *event) +validate_event(struct pmu *pmu, struct pmu_hw_events *hw_events, + struct perf_event *event) { - struct arm_pmu *armpmu = to_arm_pmu(event->pmu); + struct arm_pmu *armpmu; struct hw_perf_event fake_event = event->hw; struct pmu *leader_pmu = event->group_leader->pmu; if (is_software_event(event)) return 1; + /* + * Reject groups spanning multiple HW PMUs (e.g. CPU + CCI). The + * core perf code won't check that the pmu->ctx == leader->ctx + * until after pmu->event_init(event). + */ + if (event->pmu != pmu) + return 0; + if (event->pmu != leader_pmu || event->state < PERF_EVENT_STATE_OFF) return 1; if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec) return 1; + armpmu = to_arm_pmu(event->pmu); return armpmu->get_event_idx(hw_events, &fake_event) >= 0; } @@ -363,15 +372,15 @@ validate_group(struct perf_event *event) memset(fake_used_mask, 0, sizeof(fake_used_mask)); fake_pmu.used_mask = fake_used_mask; - if (!validate_event(&fake_pmu, leader)) + if (!validate_event(event->pmu, &fake_pmu, leader)) return -EINVAL; list_for_each_entry(sibling, &leader->sibling_list, group_entry) { - if (!validate_event(&fake_pmu, sibling)) + if (!validate_event(event->pmu, &fake_pmu, sibling)) return -EINVAL; } - if (!validate_event(&fake_pmu, event)) + if (!validate_event(event->pmu, &fake_pmu, event)) return -EINVAL; return 0; From 3217baebf4d74c583f81fb480fa06f5b9e6a736f Mon Sep 17 00:00:00 2001 From: Ashay Jaiswal Date: Fri, 5 Aug 2016 22:40:07 +0530 Subject: [PATCH 0200/1015] power: qpnp-smbcharger: Fix ICL voting on USB removal The voting logic fails to update ICL if USB is removed, this fails the ICL update for the applicable client. Fix this by requesting 0mA when USB is removed instead of removing the vote. CRs-Fixed: 1052814 Change-Id: Ib223d63d7cda22f3a79ddb6f0ef30df291339716 Signed-off-by: Ashay Jaiswal --- drivers/power/qpnp-smbcharger.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/power/qpnp-smbcharger.c b/drivers/power/qpnp-smbcharger.c index b33904011ca31..f23d95056b8c4 100644 --- a/drivers/power/qpnp-smbcharger.c +++ b/drivers/power/qpnp-smbcharger.c @@ -4538,8 +4538,7 @@ static int smbchg_change_usb_supply_type(struct smbchg_chip *chip, * and set type after the vote */ if (type == POWER_SUPPLY_TYPE_UNKNOWN) { - rc = vote(chip->usb_icl_votable, PSY_ICL_VOTER, false, - current_limit_ma); + rc = vote(chip->usb_icl_votable, PSY_ICL_VOTER, true, 0); if (rc < 0) pr_err("Couldn't remove ICL vote rc=%d\n", rc); From 36749eee679d27ba884220e82bff743b400b0bdb Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Thu, 15 Sep 2016 10:01:23 -0700 Subject: [PATCH 0201/1015] perf: Tighten (and fix) the grouping condition The fix from 9fc81d87420d ("perf: Fix events installation during moving group") was incomplete in that it failed to recognise that creating a group with events for different CPUs is semantically broken -- they cannot be co-scheduled. Furthermore, it leads to real breakage where, when we create an event for CPU Y and then migrate it to form a group on CPU X, the code gets confused where the counter is programmed -- triggered in practice as well by me via the perf fuzzer. Fix this by tightening the rules for creating groups. Only allow grouping of counters that can be co-scheduled in the same context. This means for the same task and/or the same cpu. Change-Id: I01d7b24b44fff039e72c80cca7f70158fa354470 Fixes: 9fc81d87420d ("perf: Fix events installation during moving group") Signed-off-by: Peter Zijlstra (Intel) Cc: Arnaldo Carvalho de Melo Cc: Jiri Olsa Cc: Linus Torvalds Link: http://lkml.kernel.org/r/20150123125834.090683288@infradead.org Signed-off-by: Ingo Molnar Signed-off-by: Kamal Mostafa Git-commit: c3c87e770458aa004bd7ed3f29945ff436fd6511 Git-repo: http://git.kernel.org/cgit/linux/kernel/git/tip/tip.git Signed-off-by: Patrick Fay --- include/linux/perf_event.h | 6 ------ kernel/events/core.c | 15 +++++++++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 120719973b7fb..c1a2bd14ff1bf 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -458,11 +458,6 @@ struct perf_event { #endif /* CONFIG_PERF_EVENTS */ }; -enum perf_event_context_type { - task_context, - cpu_context, -}; - /** * struct perf_event_context - event context structure * @@ -470,7 +465,6 @@ enum perf_event_context_type { */ struct perf_event_context { struct pmu *pmu; - enum perf_event_context_type type; /* * Protect the states of the events in the list, * nr_active, and the list: diff --git a/kernel/events/core.c b/kernel/events/core.c index 0b09d3967d75d..f9f8e283feabd 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -6816,7 +6816,6 @@ int perf_pmu_register(struct pmu *pmu, const char *name, int type) __perf_event_init_context(&cpuctx->ctx); lockdep_set_class(&cpuctx->ctx.mutex, &cpuctx_mutex); lockdep_set_class(&cpuctx->ctx.lock, &cpuctx_lock); - cpuctx->ctx.type = cpu_context; cpuctx->ctx.pmu = pmu; __perf_cpu_hrtimer_init(cpuctx, cpu); @@ -7464,7 +7463,19 @@ SYSCALL_DEFINE5(perf_event_open, * task or CPU context: */ if (move_group) { - if (group_leader->ctx->type != ctx->type) + /* + * Make sure we're both on the same task, or both + * per-cpu events. + */ + if (group_leader->ctx->task != ctx->task) + goto err_context; + + /* + * Make sure we're both events for the same CPU; + * grouping events for different CPUs is broken; since + * you can never concurrently schedule them anyhow. + */ + if (group_leader->cpu != event->cpu) goto err_context; } else { if (group_leader->ctx != ctx) From 363826d5477a5e88dde1f7df04aed5d86a2d0850 Mon Sep 17 00:00:00 2001 From: Vijayavardhan Vennapusa Date: Thu, 1 Sep 2016 12:05:50 +0530 Subject: [PATCH 0202/1015] USB: dwc3-msm: Fix issue related to error recovery for ERRATIC ERROR If ERRATIC event irq is triggered by USB controller, it requires to perform block reset USB controller as recovery mechanism as per SNPS data book. Error recovery happens through allowing USB entering low power mode and exit low power mode. We might see recovery failing as check for P3 state is true as part of suspend and results in USB not entering low power mode. Fix this issue by allowing USB enter low power mode in case of recovery flag mdwc->in_restart set. CRs-Fixed: 1060831 Change-Id: I41f935da3d4af1dd04eb4b3299e36a0f528633da Signed-off-by: Vijayavardhan Vennapusa --- drivers/usb/dwc3/dwc3-msm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 8df9c4470c612..3c232a12f6886 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -1885,7 +1885,7 @@ static int dwc3_msm_prepare_suspend(struct dwc3_msm *mdwc) if ((mdwc->in_host_mode || (mdwc->vbus_active && mdwc->otg_state == OTG_STATE_B_SUSPEND)) - && dwc3_msm_is_superspeed(mdwc)) { + && dwc3_msm_is_superspeed(mdwc) && !mdwc->in_restart) { if (!atomic_read(&mdwc->in_p3)) { dev_err(mdwc->dev, "Not in P3,aborting LPM sequence\n"); return -EBUSY; From 5a38df0dd88110a67e40787a36a77cc471a1bea8 Mon Sep 17 00:00:00 2001 From: Abdulla Anam Date: Mon, 26 Sep 2016 13:42:54 +0530 Subject: [PATCH 0203/1015] ARM: dts: msm: enable secure cma on 8917 Enabling back the secure memory region on 8917 as secure video usecases require more memory than the minimal one. Change-Id: I23258dcaa98c0e5bc7bbf8d1f4fbe80d1ddf198e Signed-off-by: Abdulla Anam --- arch/arm/boot/dts/qcom/msm8917.dtsi | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index 8e8f31dd3d0a1..a86779151b1e0 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -89,7 +89,6 @@ reusable; alignment = <0 0x400000>; size = <0 0x7000000>; - status = "disabled"; }; qseecom_mem: qseecom_region@0 { From 57d334dc02e0ecd696c4518886b886f8a4b46bb4 Mon Sep 17 00:00:00 2001 From: Satyajit Desai Date: Fri, 2 Sep 2016 14:18:13 -0700 Subject: [PATCH 0204/1015] ion: use %pK instead of %p which respects kptr_restrict sysctl Hide kernel pointers from unprivileged users by using %pK format-specifier instead of %p. This respects the kptr_restrict sysctl setting which is by default on. So by default %pK will print zeroes as address. echo 1 to kptr_restrict to print proper kernel address. Change-Id: Ia300e3e38b8662afac15edda28959564b05c9367 Signed-off-by: Satyajit Desai --- drivers/staging/android/ion/ion.c | 4 ++-- drivers/staging/android/ion/ion_cma_heap.c | 6 +++--- drivers/staging/android/ion/ion_cma_secure_heap.c | 12 ++++++------ drivers/staging/android/ion/msm/msm_ion.c | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index cb4a2f43e4fef..5b5d1ae9046bc 100755 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -1201,7 +1201,7 @@ static void ion_vm_open(struct vm_area_struct *vma) mutex_lock(&buffer->lock); list_add(&vma_list->list, &buffer->vmas); mutex_unlock(&buffer->lock); - pr_debug("%s: adding %p\n", __func__, vma); + pr_debug("%s: adding %pK\n", __func__, vma); } static void ion_vm_close(struct vm_area_struct *vma) @@ -1216,7 +1216,7 @@ static void ion_vm_close(struct vm_area_struct *vma) continue; list_del(&vma_list->list); kfree(vma_list); - pr_debug("%s: deleting %p\n", __func__, vma); + pr_debug("%s: deleting %pK\n", __func__, vma); break; } mutex_unlock(&buffer->lock); diff --git a/drivers/staging/android/ion/ion_cma_heap.c b/drivers/staging/android/ion/ion_cma_heap.c index aaea7bed36e1a..b2e1a4c1b170d 100644 --- a/drivers/staging/android/ion/ion_cma_heap.c +++ b/drivers/staging/android/ion/ion_cma_heap.c @@ -94,7 +94,7 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer, /* keep this for memory release */ buffer->priv_virt = info; - dev_dbg(dev, "Allocate buffer %p\n", buffer); + dev_dbg(dev, "Allocate buffer %pK\n", buffer); return 0; err: @@ -107,7 +107,7 @@ static void ion_cma_free(struct ion_buffer *buffer) struct device *dev = buffer->heap->priv; struct ion_cma_buffer_info *info = buffer->priv_virt; - dev_dbg(dev, "Release buffer %p\n", buffer); + dev_dbg(dev, "Release buffer %pK\n", buffer); /* release memory */ dma_free_coherent(dev, buffer->size, info->cpu_addr, info->handle); sg_free_table(info->table); @@ -123,7 +123,7 @@ static int ion_cma_phys(struct ion_heap *heap, struct ion_buffer *buffer, struct device *dev = heap->priv; struct ion_cma_buffer_info *info = buffer->priv_virt; - dev_dbg(dev, "Return buffer %p physical address %pa\n", buffer, + dev_dbg(dev, "Return buffer %pK physical address %pa\n", buffer, &info->handle); *addr = info->handle; diff --git a/drivers/staging/android/ion/ion_cma_secure_heap.c b/drivers/staging/android/ion/ion_cma_secure_heap.c index d945b92514379..90ae7eb65b659 100644 --- a/drivers/staging/android/ion/ion_cma_secure_heap.c +++ b/drivers/staging/android/ion/ion_cma_secure_heap.c @@ -3,7 +3,7 @@ * * Copyright (C) Linaro 2012 * Author: for ST-Ericsson. - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -501,7 +501,7 @@ static struct ion_secure_cma_buffer_info *__ion_secure_cma_allocate( /* keep this for memory release */ buffer->priv_virt = info; - dev_dbg(sheap->dev, "Allocate buffer %p\n", buffer); + dev_dbg(sheap->dev, "Allocate buffer %pK\n", buffer); return info; err: @@ -634,7 +634,7 @@ static struct ion_secure_cma_buffer_info *__ion_secure_cma_allocate_non_contig( sg = sg_next(sg); } buffer->priv_virt = info; - dev_dbg(sheap->dev, "Allocate buffer %p\n", buffer); + dev_dbg(sheap->dev, "Allocate buffer %pK\n", buffer); return info; err2: @@ -721,7 +721,7 @@ static void ion_secure_cma_free(struct ion_buffer *buffer) struct ion_secure_cma_buffer_info *info = buffer->priv_virt; int ret = 0; - dev_dbg(sheap->dev, "Release buffer %p\n", buffer); + dev_dbg(sheap->dev, "Release buffer %pK\n", buffer); if (msm_secure_v2_is_supported()) ret = msm_unsecure_table(info->table); atomic_sub(buffer->size, &sheap->total_allocated); @@ -743,8 +743,8 @@ static int ion_secure_cma_phys(struct ion_heap *heap, struct ion_buffer *buffer, container_of(heap, struct ion_cma_secure_heap, heap); struct ion_secure_cma_buffer_info *info = buffer->priv_virt; - dev_dbg(sheap->dev, "Return buffer %p physical address 0x%pa\n", buffer, - &info->phys); + dev_dbg(sheap->dev, "Return buffer %pK physical address 0x%pa\n", + buffer, &info->phys); *addr = info->phys; *len = buffer->size; diff --git a/drivers/staging/android/ion/msm/msm_ion.c b/drivers/staging/android/ion/msm/msm_ion.c index bbc027b0714fe..882e33e4c01c3 100644 --- a/drivers/staging/android/ion/msm/msm_ion.c +++ b/drivers/staging/android/ion/msm/msm_ion.c @@ -705,7 +705,7 @@ long msm_ion_custom_ioctl(struct ion_client *client, } else { handle = ion_import_dma_buf(client, data.flush_data.fd); if (IS_ERR(handle)) { - pr_info("%s: Could not import handle: %p\n", + pr_info("%s: Could not import handle: %pK\n", __func__, handle); return -EINVAL; } @@ -718,7 +718,7 @@ long msm_ion_custom_ioctl(struct ion_client *client, + data.flush_data.length; if (start && check_vaddr_bounds(start, end)) { - pr_err("%s: virtual address %p is out of bounds\n", + pr_err("%s: virtual address %pK is out of bounds\n", __func__, data.flush_data.vaddr); ret = -EINVAL; } else { From dfc0d15b49b6fd0fa584d1bf9a34f314e782dd78 Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Thu, 7 Apr 2016 12:44:35 +0530 Subject: [PATCH 0205/1015] soundwire: Add support for usecases without compander Some of the usecases without compander and with smart boost, VI sense are added in soundwire controller driver. Change-Id: Ia380ee6ad4584c29feb80fdc3b9247dd11e64a3e Signed-off-by: Laxminath Kasam --- drivers/soundwire/swr-wcd-ctrl.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/soundwire/swr-wcd-ctrl.c b/drivers/soundwire/swr-wcd-ctrl.c index 9a78a76b16936..357fc962019b4 100644 --- a/drivers/soundwire/swr-wcd-ctrl.c +++ b/drivers/soundwire/swr-wcd-ctrl.c @@ -61,6 +61,10 @@ struct usecase uc[] = { {6, 14, 6600}, /* UC11: 2*(Spkr + Comp + SB) */ {2, 3, 2700}, /* UC12: Spkr + SB */ {4, 6, 5400}, /* UC13: 2*(Spkr + SB) */ + {3, 5, 3900}, /* UC14: Spkr + SB + VI */ + {6, 10, 7800}, /* UC15: 2*(Spkr + SB + VI) */ + {2, 3, 3600}, /* UC16: Spkr + VI */ + {4, 6, 7200}, /* UC17: 2*(Spkr + VI) */ }; #define MAX_USECASE ARRAY_SIZE(uc) @@ -148,6 +152,33 @@ struct port_params pp[MAX_USECASE][SWR_MSTR_PORT_LEN] = { {7, 6, 0}, {63, 13, 31}, }, + /* UC 14 */ + { + {7, 1, 0}, + {63, 12, 31}, + {15, 7, 0}, + }, + /* UC 15 */ + { + {7, 1, 0}, + {63, 12, 31}, + {15, 7, 0}, + {7, 6, 0}, + {63, 13, 31}, + {15, 10, 0}, + }, + /* UC 16 */ + { + {7, 1, 0}, + {15, 7, 0}, + }, + /* UC 17 */ + { + {7, 1, 0}, + {15, 7, 0}, + {7, 6, 0}, + {15, 10, 0}, + }, }; enum { From ce4409faf815889ccc453ba19f5fe5bb2576177b Mon Sep 17 00:00:00 2001 From: Sheetal Sahasrabudhe Date: Fri, 18 Apr 2014 09:08:26 -0400 Subject: [PATCH 0206/1015] Perf: Enable pmuv3 on 32 bit kernel Add mechanism to detect and enable pmuv3 on 32 bit kernel. Change-Id: I56e0c5a0bb2dbc2dc1445fb578782ec5e8c98def Signed-off-by: Sheetal Sahasrabudhe --- arch/arm/kernel/perf_event_cpu.c | 1 + arch/arm/kernel/perf_event_v7.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index eb2c4d55666b4..e7418fe4cd9b3 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c @@ -230,6 +230,7 @@ static struct of_device_id cpu_pmu_of_device_ids[] = { {.compatible = "arm,arm1176-pmu", .data = armv6_1176_pmu_init}, {.compatible = "arm,arm1136-pmu", .data = armv6_1136_pmu_init}, {.compatible = "qcom,krait-pmu", .data = krait_pmu_init}, + {.compatible = "arm,armv8-pmuv3", .data = armv8_pmuv3_pmu_init}, {}, }; diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 65e626da1da10..e505f1ebc2ecb 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c @@ -1042,6 +1042,16 @@ static int armv7_a15_pmu_init(struct arm_pmu *cpu_pmu) return 0; } +static int armv8_pmuv3_pmu_init(struct arm_pmu *cpu_pmu) +{ + armv7pmu_init(cpu_pmu); + cpu_pmu->name = "ARMv8 Cortex-A53"; + cpu_pmu->map_event = armv7_a7_map_event; + cpu_pmu->num_events = armv7_read_num_pmnc_events(); + cpu_pmu->set_event_filter = armv7pmu_set_event_filter; + return 0; +} + static int armv7_a7_pmu_init(struct arm_pmu *cpu_pmu) { armv7pmu_init(cpu_pmu); From 6aaa3a71bfbcaf956c2bea9e8ba63823ffdb45ca Mon Sep 17 00:00:00 2001 From: Srinivas Ramana Date: Tue, 12 Jul 2016 15:50:39 +0530 Subject: [PATCH 0207/1015] soc: qcom: build kryo perf events only for MSM8996 kryo perf events are specific to MSM8996 soc. So build this file only when MSM8996 is enabled. Change-Id: I95aacab201d51ffb4eb8e94d2e400578cab37fc8 Signed-off-by: Srinivas Ramana --- arch/arm64/kernel/perf_event.c | 2 ++ drivers/soc/qcom/Makefile | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index 6f7e143cdb860..f2fe7c774732f 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c @@ -1623,7 +1623,9 @@ static struct notifier_block perf_cpu_idle_nb = { */ static const struct of_device_id armpmu_of_device_ids[] = { {.compatible = "arm,armv8-pmuv3"}, +#ifdef CONFIG_ARCH_MSM8996 {.compatible = "qcom,kryo-pmuv3", .data = kryo_pmu_init}, +#endif {}, }; diff --git a/drivers/soc/qcom/Makefile b/drivers/soc/qcom/Makefile index 4ada1bba0bc45..d61b4f8c9ed93 100644 --- a/drivers/soc/qcom/Makefile +++ b/drivers/soc/qcom/Makefile @@ -59,7 +59,11 @@ obj-$(CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG) += rpm_rbcpr_stats_v2.o obj-$(CONFIG_MEM_SHARE_QMI_SERVICE) += memshare/ obj-$(CONFIG_CP_ACCESS64) += cpaccess64.o obj-$(CONFIG_MSM_RPM_STATS_LOG) += rpm_stats.o rpm_master_stat.o rpm_rail_stats.o system_stats.o +ifdef CONFIG_ARCH_MSM8996 obj-$(CONFIG_HW_PERF_EVENTS) += perf_event_kryo.o perf_event_l2.o +else +obj-$(CONFIG_HW_PERF_EVENTS) += perf_event_l2.o +endif obj-$(CONFIG_MSM_RPM_LOG) += rpm_log.o obj-$(CONFIG_MSM_JTAG) += jtag-fuse.o jtag.o obj-$(CONFIG_MSM_JTAG_MM) += jtag-fuse.o jtag-mm.o From 3bd601ab927dc485df5b63f912a01197560c1a8d Mon Sep 17 00:00:00 2001 From: Gaurav Kohli Date: Thu, 15 Sep 2016 18:35:39 +0530 Subject: [PATCH 0208/1015] defconfig: msm: Enable Hardware perf event for 8937/8953 32 bit Enabling hardware perf event for 8937/8953 32 bit kernel Change-Id: I0c517aa76415c2fad3fda4f8b80e22324c3d4de6 Signed-off-by: Gaurav Kohli --- arch/arm/configs/msm8937-perf_defconfig | 1 - arch/arm/configs/msm8937_defconfig | 1 - arch/arm/configs/msmcortex-perf_defconfig | 1 - arch/arm/configs/msmcortex_defconfig | 1 - 4 files changed, 4 deletions(-) diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index 4539376f56db8..96923292e9917 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -53,7 +53,6 @@ CONFIG_ARM_PSCI=y CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y -# CONFIG_HW_PERF_EVENTS is not set CONFIG_CMA=y CONFIG_CMA_DEBUGFS=y CONFIG_ZSMALLOC=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index 7e2f8a15459b5..0ea4559cd56cd 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -54,7 +54,6 @@ CONFIG_ARM_PSCI=y CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y -# CONFIG_HW_PERF_EVENTS is not set CONFIG_CMA=y CONFIG_CMA_DEBUGFS=y CONFIG_ZSMALLOC=y diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index 2a0eac14d1ecf..2b42778b55eac 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -49,7 +49,6 @@ CONFIG_ARM_PSCI=y CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y -# CONFIG_HW_PERF_EVENTS is not set CONFIG_CMA=y CONFIG_CMA_DEBUGFS=y CONFIG_ZSMALLOC=y diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index d87355e94b1c5..99739dcdefef2 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -50,7 +50,6 @@ CONFIG_ARM_PSCI=y CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y -# CONFIG_HW_PERF_EVENTS is not set CONFIG_CMA=y CONFIG_CMA_DEBUGFS=y CONFIG_ZSMALLOC=y From 4ff10fcae7961235ee907d63bf0edfac2196b3d0 Mon Sep 17 00:00:00 2001 From: Krishna Chaitanya Devarakonda Date: Tue, 13 Sep 2016 18:00:00 +0530 Subject: [PATCH 0209/1015] msm: mdss: Allow WB to use first available control path WB timeouts are seen when WB is connected after 4k HDMI use case. This was seen when WB is using the same Mixer which was earlier used by HDMI, with 3D Mux enabled. Since 3D Mux registers are double buffered, the best way to clear control operations is to re-use the control path. Hence allowing WB to choose the first available control path. Change-Id: Ie599a6d58f461ee7905402bf0a948ac829d8de12 Signed-off-by: Krishna Chaitanya Devarakonda --- drivers/video/msm/mdss/mdss_mdp.h | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp.h b/drivers/video/msm/mdss/mdss_mdp.h index 98eed0a6b7bc0..d4a6ecbc9f441 100644 --- a/drivers/video/msm/mdss/mdss_mdp.h +++ b/drivers/video/msm/mdss/mdss_mdp.h @@ -1131,12 +1131,21 @@ static inline int mdss_mdp_get_wb_ctl_support(struct mdss_data_type *mdata, bool rotator_session) { /* - * Initial control paths are used for primary and external - * interfaces and remaining control paths are used for WB - * interfaces. + * Any control path can be routed to any of the hardware datapaths. + * But there is a HW restriction for 3D Mux block. As the 3D Mux + * settings in the CTL registers are double buffered, if an interface + * uses it and disconnects, then the subsequent interface which gets + * connected should use the same control path in order to clear the + * 3D MUX settings. + * To handle this restriction, we are allowing WB also, to loop through + * all the avialable control paths, so that it can reuse the control + * path left by the external interface, thereby clearing the 3D Mux + * settings. + * The initial control paths can be used by Primary, External and WB. + * The rotator can use the remaining available control paths. */ return rotator_session ? (mdata->nctl - mdata->nmixers_wb) : - (mdata->nctl - mdata->nwb); + MDSS_MDP_CTL0; } static inline bool mdss_mdp_is_nrt_vbif_client(struct mdss_data_type *mdata, From 20514da31bbaaac1513e1ce13b4ff8d32ba879c1 Mon Sep 17 00:00:00 2001 From: Srikanth Uyyala Date: Thu, 18 Aug 2016 15:32:05 +0530 Subject: [PATCH 0210/1015] msm: isp: buffer queue management specific flags 1. Define SVHDR buffer queue management specific flags 2. Fetch engine state need not be checked during READ_DONE, it is handled during buf_divert 3. Extend the framedrop logic to RDI path Change-Id: Ie3ed9fd8a4d58d4664fa71b2d3da320fabc6a05b Signed-off-by: Srikanth Uyyala --- drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c | 2 +- drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c | 3 --- include/uapi/media/msmb_isp.h | 3 +++ 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index 627f9481c5be0..f8680fb2d61c1 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -997,7 +997,7 @@ void msm_isp_notify(struct vfe_device *vfe_dev, uint32_t event_type, spin_unlock_irqrestore(&vfe_dev->common_data-> common_dev_data_lock, flags); } else { - if (frame_src == VFE_PIX_0) { + if (frame_src <= VFE_RAW_2) { msm_isp_check_for_output_error(vfe_dev, ts, &event_data.u.sof_info); } diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index 3585ee5668103..7f564f49134c7 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -412,9 +412,6 @@ void msm_isp_fetch_engine_done_notify(struct vfe_device *vfe_dev, struct msm_vfe_fetch_engine_info *fetch_engine_info) { struct msm_isp_event_data fe_rd_done_event; - if (!fetch_engine_info->is_busy) - return; - memset(&fe_rd_done_event, 0, sizeof(struct msm_isp_event_data)); fe_rd_done_event.frame_id = vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id; diff --git a/include/uapi/media/msmb_isp.h b/include/uapi/media/msmb_isp.h index 7eb81bb79aab3..e4d41d4072c58 100644 --- a/include/uapi/media/msmb_isp.h +++ b/include/uapi/media/msmb_isp.h @@ -18,6 +18,9 @@ #define ISP_META_CHANNEL_BIT (0x10000 << 3) #define ISP_SCRATCH_BUF_BIT (0x10000 << 4) #define ISP_OFFLINE_STATS_BIT (0x10000 << 5) +#define ISP_SVHDR_IN_BIT (0x10000 << 6) /* RDI hw stream for SVHDR */ +#define ISP_SVHDR_OUT_BIT (0x10000 << 7) /* SVHDR output bufq stream*/ + #define ISP_STATS_STREAM_BIT 0x80000000 struct msm_vfe_cfg_cmd_list; From 2175c54a38f15f02b6b59ff052e13dad0ca2466c Mon Sep 17 00:00:00 2001 From: Shantanu Jain Date: Wed, 5 Oct 2016 11:59:28 +0530 Subject: [PATCH 0211/1015] input: synaptics_rmi_dev: correct api call for releasing memory Correct API call for releasing the memory in the Synaptics touch driver. Change-Id: I6d6ec71aa12474652e99887a0427f03952e6fe80 Signed-off-by: Shantanu Jain --- drivers/input/touchscreen/synaptics_rmi_dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/input/touchscreen/synaptics_rmi_dev.c b/drivers/input/touchscreen/synaptics_rmi_dev.c index 06cf89ff7f6c3..27745ce726b36 100644 --- a/drivers/input/touchscreen/synaptics_rmi_dev.c +++ b/drivers/input/touchscreen/synaptics_rmi_dev.c @@ -382,7 +382,7 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, *f_pos += retval; mutex_unlock(&(dev_data->file_mutex)); - free(tmpbuf); + kfree(tmpbuf); return retval; } From 11741ee33b640d56d0b7e4761196b21ea8363ace Mon Sep 17 00:00:00 2001 From: Jonathan Wicks Date: Thu, 22 Sep 2016 09:29:28 -0600 Subject: [PATCH 0212/1015] msm: kgsl: Add sysfs control for pwrscale Add a sysfs entry to enable control of notifications from pwrscale to devfreq. Change-Id: Ife0a31e96975239bf4fefd59ac6266568c4db1a5 Signed-off-by: Jonathan Wicks --- drivers/gpu/msm/adreno.c | 2 +- drivers/gpu/msm/kgsl_pwrctrl.c | 45 +++++++++++++++++++++++++++++++++ drivers/gpu/msm/kgsl_pwrscale.c | 6 +++-- drivers/gpu/msm/kgsl_pwrscale.h | 4 +-- 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 9058c33aac6e0..3e0153cd7b9ae 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -2053,7 +2053,7 @@ static int adreno_setproperty(struct kgsl_device_private *dev_priv, KGSL_STATE_ACTIVE); device->pwrctrl.ctrl_flags = KGSL_PWR_ON; adreno_fault_detect_stop(adreno_dev); - kgsl_pwrscale_disable(device); + kgsl_pwrscale_disable(device, true); } mutex_unlock(&device->mutex); diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c index 2eb213db39d6c..23af2b9a6b487 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.c +++ b/drivers/gpu/msm/kgsl_pwrctrl.c @@ -1181,6 +1181,47 @@ static ssize_t kgsl_popp_show(struct device *dev, test_bit(POPP_ON, &device->pwrscale.popp_state)); } +static ssize_t kgsl_pwrctrl_pwrscale_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + int ret; + unsigned int enable = 0; + + if (device == NULL) + return 0; + + ret = kgsl_sysfs_store(buf, &enable); + if (ret) + return ret; + + mutex_lock(&device->mutex); + + if (enable) + kgsl_pwrscale_enable(device); + else + kgsl_pwrscale_disable(device, false); + + mutex_unlock(&device->mutex); + + return count; +} + +static ssize_t kgsl_pwrctrl_pwrscale_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + struct kgsl_pwrscale *psc; + + if (device == NULL) + return 0; + psc = &device->pwrscale; + + return snprintf(buf, PAGE_SIZE, "%u\n", psc->enabled); +} + static DEVICE_ATTR(gpuclk, 0644, kgsl_pwrctrl_gpuclk_show, kgsl_pwrctrl_gpuclk_store); static DEVICE_ATTR(max_gpuclk, 0644, kgsl_pwrctrl_max_gpuclk_show, @@ -1234,6 +1275,9 @@ static DEVICE_ATTR(popp, 0644, kgsl_popp_show, kgsl_popp_store); static DEVICE_ATTR(force_non_retention_on, 0644, kgsl_pwrctrl_force_non_retention_on_show, kgsl_pwrctrl_force_non_retention_on_store); +static DEVICE_ATTR(pwrscale, 0644, + kgsl_pwrctrl_pwrscale_show, + kgsl_pwrctrl_pwrscale_store); static const struct device_attribute *pwrctrl_attr_list[] = { &dev_attr_gpuclk, @@ -1256,6 +1300,7 @@ static const struct device_attribute *pwrctrl_attr_list[] = { &dev_attr_bus_split, &dev_attr_default_pwrlevel, &dev_attr_popp, + &dev_attr_pwrscale, NULL }; diff --git a/drivers/gpu/msm/kgsl_pwrscale.c b/drivers/gpu/msm/kgsl_pwrscale.c index ad01d43a9ef02..f79bb08f3e672 100644 --- a/drivers/gpu/msm/kgsl_pwrscale.c +++ b/drivers/gpu/msm/kgsl_pwrscale.c @@ -189,19 +189,21 @@ EXPORT_SYMBOL(kgsl_pwrscale_update); /* * kgsl_pwrscale_disable - temporarily disable the governor * @device: The device + * @turbo: Indicates if pwrlevel should be forced to turbo * * Temporarily disable the governor, to prevent interference * with profiling tools that expect a fixed clock frequency. * This function must be called with the device mutex locked. */ -void kgsl_pwrscale_disable(struct kgsl_device *device) +void kgsl_pwrscale_disable(struct kgsl_device *device, bool turbo) { BUG_ON(!mutex_is_locked(&device->mutex)); if (device->pwrscale.devfreqptr) queue_work(device->pwrscale.devfreq_wq, &device->pwrscale.devfreq_suspend_ws); device->pwrscale.enabled = false; - kgsl_pwrctrl_pwrlevel_change(device, KGSL_PWRLEVEL_TURBO); + if (turbo) + kgsl_pwrctrl_pwrlevel_change(device, KGSL_PWRLEVEL_TURBO); } EXPORT_SYMBOL(kgsl_pwrscale_disable); diff --git a/drivers/gpu/msm/kgsl_pwrscale.h b/drivers/gpu/msm/kgsl_pwrscale.h index c85317869f1db..0756a4490f22a 100644 --- a/drivers/gpu/msm/kgsl_pwrscale.h +++ b/drivers/gpu/msm/kgsl_pwrscale.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -123,7 +123,7 @@ void kgsl_pwrscale_sleep(struct kgsl_device *device); void kgsl_pwrscale_wake(struct kgsl_device *device); void kgsl_pwrscale_enable(struct kgsl_device *device); -void kgsl_pwrscale_disable(struct kgsl_device *device); +void kgsl_pwrscale_disable(struct kgsl_device *device, bool turbo); int kgsl_devfreq_target(struct device *dev, unsigned long *freq, u32 flags); int kgsl_devfreq_get_dev_status(struct device *, struct devfreq_dev_status *); From e63ef3900c068540d5b10180d24bed2a616f17a0 Mon Sep 17 00:00:00 2001 From: Sunil Khatri Date: Tue, 4 Oct 2016 18:53:22 +0530 Subject: [PATCH 0213/1015] msm: kgsl: Disable UCHE global filter Disable UCHE global filter for invalidate/flush, SP will handle the invalidate/flush for each SP independently on A5XX GPUs. CRs-Fixed: 1073853 Change-Id: I3daf3722cfbdfff080161f9a0248fd8096550328 Signed-off-by: Sunil Khatri --- drivers/gpu/msm/a5xx_reg.h | 1 + drivers/gpu/msm/adreno_a5xx.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/drivers/gpu/msm/a5xx_reg.h b/drivers/gpu/msm/a5xx_reg.h index e3974f0b0071f..f25b01823313f 100644 --- a/drivers/gpu/msm/a5xx_reg.h +++ b/drivers/gpu/msm/a5xx_reg.h @@ -640,6 +640,7 @@ /* UCHE registers */ #define A5XX_UCHE_ADDR_MODE_CNTL 0xE80 +#define A5XX_UCHE_MODE_CNTL 0xE81 #define A5XX_UCHE_WRITE_THRU_BASE_LO 0xE87 #define A5XX_UCHE_WRITE_THRU_BASE_HI 0xE88 #define A5XX_UCHE_TRAP_BASE_LO 0xE89 diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c index 7375eff7785d4..cc0b0cf9892de 100644 --- a/drivers/gpu/msm/adreno_a5xx.c +++ b/drivers/gpu/msm/adreno_a5xx.c @@ -1942,6 +1942,11 @@ static void a5xx_start(struct adreno_device *adreno_dev) */ kgsl_regrmw(device, A5XX_RB_DBG_ECO_CNT, 0, (1 << 9)); } + /* + * Disable UCHE global filter as SP can invalidate/flush + * independently + */ + kgsl_regwrite(device, A5XX_UCHE_MODE_CNTL, BIT(29)); /* Set the USE_RETENTION_FLOPS chicken bit */ kgsl_regwrite(device, A5XX_CP_CHICKEN_DBG, 0x02000000); From 4cb743728014d969a82286d11efac4c6916b0ef6 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Thu, 6 Oct 2016 14:09:54 +0530 Subject: [PATCH 0214/1015] ARM: dts: msm: operate APC CPR in open-loop mode for msm8920 Disable APC CPR closed-loop operation and use open-loop operation for msm8920. Closed-loop operation would be enabled after functional validation on silicon. CRs-Fixed: 1075013 Change-Id: I47d2e578743e771ad86aea850865dd7769841563 Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8920.dtsi | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index c9955cd7c127d..6fcccdbcb8242 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -186,3 +186,10 @@ }; }; }; + +&apc_vreg_corner { + /delete-property/ qcom,cpr-fuse-version-map; + /delete-property/ qcom,cpr-quotient-adjustment; + /delete-property/ qcom,cpr-init-voltage-adjustment; + /delete-property/ qcom,cpr-enable; +}; From 89f69999983066c2d2d68b02ae3c014e3ac3d973 Mon Sep 17 00:00:00 2001 From: Sivanesan Rajapupathi Date: Wed, 7 Sep 2016 18:21:55 -0400 Subject: [PATCH 0215/1015] crypto: msm: qce50: DMA-API buffers limitations Not all memory are DMA'able. See DMA-API-HOWTO.txt. The dummy hash request input buffer is changed to be acquired from coherent memory to kzalloc(). Change-Id: If6961217df08bcf0506eedacb07874dfafd7c1ca CRs-Fixed: 1064055 Acked-by: Che-Min Hsieh Signed-off-by: Sivanesan Rajapupathi --- drivers/crypto/msm/qce50.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/crypto/msm/qce50.c b/drivers/crypto/msm/qce50.c index 6b305d69b3025..b33d879d56a41 100644 --- a/drivers/crypto/msm/qce50.c +++ b/drivers/crypto/msm/qce50.c @@ -94,7 +94,6 @@ enum qce_owner { struct dummy_request { struct qce_sha_req sreq; - uint8_t *in_buf; struct scatterlist sg; struct ahash_request areq; }; @@ -154,6 +153,7 @@ struct qce_device { atomic_t bunch_cmd_seq; atomic_t last_intr_seq; bool cadence_flag; + uint8_t *dummyreq_in_buf; }; static void print_notify_debug(struct sps_event_notify *notify); @@ -4306,8 +4306,6 @@ static int qce_setup_ce_sps_data(struct qce_device *pce_dev) (uintptr_t)vaddr; vaddr += pce_dev->ce_bam_info.ce_burst_size * 2; } - pce_dev->dummyreq.in_buf = (uint8_t *)vaddr; - vaddr += DUMMY_REQ_DATA_LEN; if ((vaddr - pce_dev->coh_vmem) > pce_dev->memsize || iovec_memsize < 0) panic("qce50: Not enough coherent memory. Allocate %x , need %lx\n", @@ -5900,8 +5898,8 @@ static int setup_dummy_req(struct qce_device *pce_dev) "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopqopqrpqrs"; int len = DUMMY_REQ_DATA_LEN; - memcpy(pce_dev->dummyreq.in_buf, input, len); - sg_set_buf(&pce_dev->dummyreq.sg, pce_dev->dummyreq.in_buf, len); + memcpy(pce_dev->dummyreq_in_buf, input, len); + sg_set_buf(&pce_dev->dummyreq.sg, pce_dev->dummyreq_in_buf, len); sg_mark_end(&pce_dev->dummyreq.sg); pce_dev->dummyreq.sreq.alg = QCE_HASH_SHA1; @@ -5970,6 +5968,10 @@ void *qce_open(struct platform_device *pdev, int *rc) if (pce_dev->iovec_vmem == NULL) goto err_mem; + pce_dev->dummyreq_in_buf = kzalloc(DUMMY_REQ_DATA_LEN, GFP_KERNEL); + if (pce_dev->dummyreq_in_buf == NULL) + goto err_mem; + *rc = __qce_init_clk(pce_dev); if (*rc) goto err_mem; @@ -6009,6 +6011,7 @@ void *qce_open(struct platform_device *pdev, int *rc) __qce_deinit_clk(pce_dev); err_mem: + kfree(pce_dev->dummyreq_in_buf); kfree(pce_dev->iovec_vmem); if (pce_dev->coh_vmem) dma_free_coherent(pce_dev->pdev, pce_dev->memsize, @@ -6040,6 +6043,7 @@ int qce_close(void *handle) if (pce_dev->coh_vmem) dma_free_coherent(pce_dev->pdev, pce_dev->memsize, pce_dev->coh_vmem, pce_dev->coh_pmem); + kfree(pce_dev->dummyreq_in_buf); kfree(pce_dev->iovec_vmem); qce_disable_clk(pce_dev); From 52efd64251c6a321f7c23e368addb930c0c5cd32 Mon Sep 17 00:00:00 2001 From: David Howells Date: Tue, 23 Feb 2016 11:03:12 +0000 Subject: [PATCH 0216/1015] KEYS: Fix ASN.1 indefinite length object parsing This fixes CVE-2016-0758. In the ASN.1 decoder, when the length field of an ASN.1 value is extracted, it isn't validated against the remaining amount of data before being added to the cursor. With a sufficiently large size indicated, the check: datalen - dp < 2 may then fail due to integer overflow. Fix this by checking the length indicated against the amount of remaining data in both places a definite length is determined. Whilst we're at it, make the following changes: (1) Check the maximum size of extended length does not exceed the capacity of the variable it's being stored in (len) rather than the type that variable is assumed to be (size_t). (2) Compare the EOC tag to the symbolic constant ASN1_EOC rather than the integer 0. (3) To reduce confusion, move the initialisation of len outside of: for (len = 0; n > 0; n--) { since it doesn't have anything to do with the loop counter n. Change-Id: I13b15885df9dc0c17a3e1670ae9606bf3ce4ba05 Signed-off-by: David Howells Reviewed-by: Mimi Zohar Acked-by: David Woodhouse Acked-by: Peter Jones Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 23c8a812dc3c621009e4f0e5342aa4e2ede1ceaa Signed-off-by: Dennis Cagle --- lib/asn1_decoder.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/asn1_decoder.c b/lib/asn1_decoder.c index d60ce8a536503..806c5b6b4b3a0 100644 --- a/lib/asn1_decoder.c +++ b/lib/asn1_decoder.c @@ -69,7 +69,7 @@ static int asn1_find_indefinite_length(const unsigned char *data, size_t datalen /* Extract a tag from the data */ tag = data[dp++]; - if (tag == 0) { + if (tag == ASN1_EOC) { /* It appears to be an EOC. */ if (data[dp++] != 0) goto invalid_eoc; @@ -91,10 +91,8 @@ static int asn1_find_indefinite_length(const unsigned char *data, size_t datalen /* Extract the length */ len = data[dp++]; - if (len <= 0x7f) { - dp += len; - goto next_tag; - } + if (len <= 0x7f) + goto check_length; if (unlikely(len == ASN1_INDEFINITE_LENGTH)) { /* Indefinite length */ @@ -105,14 +103,18 @@ static int asn1_find_indefinite_length(const unsigned char *data, size_t datalen } n = len - 0x80; - if (unlikely(n > sizeof(size_t) - 1)) + if (unlikely(n > sizeof(len) - 1)) goto length_too_long; if (unlikely(n > datalen - dp)) goto data_overrun_error; - for (len = 0; n > 0; n--) { + len = 0; + for (; n > 0; n--) { len <<= 8; len |= data[dp++]; } +check_length: + if (len > datalen - dp) + goto data_overrun_error; dp += len; goto next_tag; From a2f8246b3f36ee6a77015c2b5cab76f1b80fbb93 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Wed, 7 Sep 2016 16:22:11 +0530 Subject: [PATCH 0217/1015] qseecom: Change whitelist_support flag to false if TZ failed to check The whitelist status is set default as true though TZ failed to check, which in turn causing the send_command fail by passing whitelist commnd id. So updating the support status flag to false when TZ fails to check. Change-Id: I78a7600506b4d2457bb1c38f8a39888a9cf9467c Signed-off-by: Mallikarjuna Reddy Amireddy Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index f210206b1471b..661824b9766f3 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -7139,8 +7139,10 @@ static int qseecom_open(struct inode *inode, struct file *file) atomic_set(&data->ioctl_count, 0); data->sglistinfo_ptr = kzalloc(SGLISTINFO_TABLE_SIZE, GFP_KERNEL); - if (!(data->sglistinfo_ptr)) + if (!(data->sglistinfo_ptr)) { + kzfree(data); return -ENOMEM; + } return ret; } @@ -8004,8 +8006,10 @@ static int qseecom_check_whitelist_feature(void) qseecom.whitelist_support = true; ret = 0; } else { - pr_err("Failed to check whitelist: ret = %d, result = 0x%x\n", + pr_info("Check whitelist with ret = %d, result = 0x%x\n", ret, resp.result); + qseecom.whitelist_support = false; + ret = 0; } kfree(buf); return ret; From aca6109442943ed04c3599a9e1e67f491b617d73 Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Mon, 14 Mar 2016 09:56:35 -0300 Subject: [PATCH 0218/1015] net: Fix use after free in the recvmmsg exit path The syzkaller fuzzer hit the following use-after-free: Call Trace: [] __asan_report_load8_noabort+0x3e/0x40 mm/kasan/report.c:295 [] __sys_recvmmsg+0x6fa/0x7f0 net/socket.c:2261 [< inline >] SYSC_recvmmsg net/socket.c:2281 [] SyS_recvmmsg+0x16f/0x180 net/socket.c:2270 [] entry_SYSCALL_64_fastpath+0x16/0x7a arch/x86/entry/entry_64.S:185 And, as Dmitry rightly assessed, that is because we can drop the reference and then touch it when the underlying recvmsg calls return some packets and then hit an error, which will make recvmmsg to set sock->sk->sk_err, oops, fix it. Reported-and-Tested-by: Dmitry Vyukov Cc: Alexander Potapenko Cc: Eric Dumazet Cc: Kostya Serebryany Cc: Sasha Levin Fixes: a2e2725541fa ("net: Introduce recvmmsg socket syscall") http://lkml.kernel.org/r/20160122211644.GC2470@redhat.com Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: David S. Miller Change-Id: I447302392f46841f31c374bdb560fe5ee9c2d687 Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 34b88a68f26a75e4fded796f1a49c40f82234b7d Signed-off-by: Dennis Cagle --- net/socket.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/net/socket.c b/net/socket.c index f457cc2e46fbf..6f886c4857da3 100644 --- a/net/socket.c +++ b/net/socket.c @@ -2449,31 +2449,31 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, break; } -out_put: - fput_light(sock->file, fput_needed); - if (err == 0) - return datagrams; + goto out_put; - if (datagrams != 0) { + if (datagrams == 0) { + datagrams = err; + goto out_put; + } + + /* + * We may return less entries than requested (vlen) if the + * sock is non block and there aren't enough datagrams... + */ + if (err != -EAGAIN) { /* - * We may return less entries than requested (vlen) if the - * sock is non block and there aren't enough datagrams... + * ... or if recvmsg returns an error after we + * received some datagrams, where we record the + * error to return on the next call or if the + * app asks about it using getsockopt(SO_ERROR). */ - if (err != -EAGAIN) { - /* - * ... or if recvmsg returns an error after we - * received some datagrams, where we record the - * error to return on the next call or if the - * app asks about it using getsockopt(SO_ERROR). - */ - sock->sk->sk_err = -err; - } - - return datagrams; + sock->sk->sk_err = -err; } +out_put: + fput_light(sock->file, fput_needed); - return err; + return datagrams; } SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg, From 3f80ea8bae19788e68ddee3e8fc132da39424d4a Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Sun, 10 Jul 2016 10:04:02 +0200 Subject: [PATCH 0219/1015] tcp: make challenge acks less predictable Yue Cao claims that current host rate limiting of challenge ACKS (RFC 5961) could leak enough information to allow a patient attacker to hijack TCP sessions. He will soon provide details in an academic paper. This patch increases the default limit from 100 to 1000, and adds some randomization so that the attacker can no longer hijack sessions without spending a considerable amount of probes. Based on initial analysis and patch from Linus. Note that we also have per socket rate limiting, so it is tempting to remove the host limit in the future. v2: randomize the count of challenge acks per second, not the period. Fixes: 282f23c6ee34 ("tcp: implement RFC 5961 3.2") Reported-by: Yue Cao Signed-off-by: Eric Dumazet Suggested-by: Linus Torvalds Cc: Yuchung Cheng Cc: Neal Cardwell Acked-by: Neal Cardwell Acked-by: Yuchung Cheng Signed-off-by: David S. Miller Change-Id: I1bf93d033e788c37899837f0c9e930bc4e20aa4c Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 75ff39ccc1bd5d3c455b6822ab09e533c551f758 [d-cagle@codeaurora.org: Resolve merge conflicts] Signed-off-by: Dennis Cagle --- net/ipv4/tcp_input.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 3bdea261141bb..cc7f940ca996e 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -88,7 +88,7 @@ int sysctl_tcp_adv_win_scale __read_mostly = 1; EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); /* rfc5961 challenge ack rate limiting */ -int sysctl_tcp_challenge_ack_limit = 100; +int sysctl_tcp_challenge_ack_limit = 1000; int sysctl_tcp_stdurg __read_mostly; int sysctl_tcp_rfc1337 __read_mostly; @@ -3325,13 +3325,20 @@ static void tcp_send_challenge_ack(struct sock *sk) /* unprotected vars, we dont care of overwrites */ static u32 challenge_timestamp; static unsigned int challenge_count; - u32 now = jiffies / HZ; + u32 count, now; + /* Check host-wide RFC 5961 rate limit. */ + now = jiffies / HZ; if (now != challenge_timestamp) { + u32 half = (sysctl_tcp_challenge_ack_limit + 1) >> 1; + challenge_timestamp = now; - challenge_count = 0; + WRITE_ONCE(challenge_count, half + + prandom_u32_max(sysctl_tcp_challenge_ack_limit)); } - if (++challenge_count <= sysctl_tcp_challenge_ack_limit) { + count = READ_ONCE(challenge_count); + if (count > 0) { + WRITE_ONCE(challenge_count, count - 1); NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK); tcp_send_ack(sk); } From eef65814f1d2f9e096aba3a80f952f5a894b8489 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Wed, 17 Aug 2016 16:00:08 -0700 Subject: [PATCH 0220/1015] binder: prevent kptr leak by using %pK format specifier Works in conjunction with kptr_restrict. Bug: 30143283 Change-Id: I2b3ce22f4e206e74614d51453a1d59b7080ab05a Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: b884cbf06200b18e660514a30293931a61126ef5 Signed-off-by: Dennis Cagle --- drivers/staging/android/binder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index 71476ca5fad71..94776abc0ac45 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -3355,7 +3355,7 @@ static void print_binder_node(struct seq_file *m, struct binder_node *node) static void print_binder_ref(struct seq_file *m, struct binder_ref *ref) { - seq_printf(m, " ref %d: desc %d %snode %d s %d w %d d %p\n", + seq_printf(m, " ref %d: desc %d %snode %d s %d w %d d %pK\n", ref->debug_id, ref->desc, ref->node->proc ? "" : "dead ", ref->node->debug_id, ref->strong, ref->weak, ref->death); } From 9a3375b3dd2d5d4e937891f652dda1b9f4e50e85 Mon Sep 17 00:00:00 2001 From: Jaganath Kanakkassery Date: Thu, 14 May 2015 12:58:08 +0530 Subject: [PATCH 0221/1015] BACKPORT: Bluetooth: Fix potential NULL dereference in RFCOMM bind callback (cherry picked from 951b6a0717db97ce420547222647bcc40bf1eacd) addr can be NULL and it should not be dereferenced before NULL checking. Signed-off-by: Jaganath Kanakkassery Signed-off-by: Marcel Holtmann Change-Id: I18bda54bb1427d9443a39a04a5c551720118dc26 Bug: 30149612 Git-repo: https://android.googlesource.com/kernel/common.git Git-commit: dfc1f470349cd079624d46880c3654709df9005b [d-cagle@codeaurora.org: Resolve merge conflicts] Signed-off-by: Dennis Cagle --- net/bluetooth/rfcomm/sock.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 128644c0cfe8f..a9e1e67bbbd7d 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c @@ -335,16 +335,21 @@ static int rfcomm_sock_create(struct net *net, struct socket *sock, static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len) { - struct sockaddr_rc *sa = (struct sockaddr_rc *) addr; + struct sockaddr_rc sa; struct sock *sk = sock->sk; - int chan = sa->rc_channel; - int err = 0; - - BT_DBG("sk %pK %pMR", sk, &sa->rc_bdaddr); + int chan; + int len, err = 0; if (!addr || addr->sa_family != AF_BLUETOOTH) return -EINVAL; + memset(&sa, 0, sizeof(sa)); + len = min_t(unsigned int, sizeof(sa), addr_len); + memcpy(&sa, addr, len); + chan = sa.rc_channel; + + BT_DBG("sk %pK %pMR", sk, &sa.rc_bdaddr); + lock_sock(sk); if (sk->sk_state != BT_OPEN) { @@ -359,11 +364,11 @@ static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr write_lock(&rfcomm_sk_list.lock); - if (chan && __rfcomm_get_listen_sock_by_addr(chan, &sa->rc_bdaddr)) { + if (chan && __rfcomm_get_listen_sock_by_addr(chan, &sa.rc_bdaddr)) { err = -EADDRINUSE; } else { /* Save source address */ - bacpy(&rfcomm_pi(sk)->src, &sa->rc_bdaddr); + bacpy(&rfcomm_pi(sk)->src, &sa.rc_bdaddr); rfcomm_pi(sk)->channel = chan; sk->sk_state = BT_BOUND; } From 89d4a511345f9ac637040ef41adaac70728d5fe5 Mon Sep 17 00:00:00 2001 From: Alok Kediya Date: Fri, 7 Oct 2016 15:47:20 +0530 Subject: [PATCH 0222/1015] msm: isp: check for the stream info state. check for the stream info state before access the structure. Change-Id: Id0d38b50ff0049c05ee5eb1ef489734c3c96c261 Signed-off-by: Alok Kediya --- drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index f8680fb2d61c1..b47fdb7d195da 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -452,6 +452,8 @@ int msm_isp_axi_check_stream_state( } stream_info = &axi_data->stream_info[ HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])]; + if (stream_info->state == AVAILABLE) + continue; spin_lock_irqsave(&stream_info->lock, flags); if (stream_info->state != valid_state) { if ((stream_info->state == PAUSING || From 489be753f02265ba87c58246cdf9d8d238f05bb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= Date: Fri, 12 Aug 2016 16:04:28 -0700 Subject: [PATCH 0223/1015] ANDROID: binder: Clear binder and cookie when setting handle in flat binder struct MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prevents leaking pointers between processes BUG: 30768347 Change-Id: Id898076926f658a1b8b27a3ccb848756b36de4ca Signed-off-by: Arve HjønnevÃ¥g Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: 11032d745836280574827bb1db5e64a94945180e Signed-off-by: Dennis Cagle --- drivers/staging/android/binder.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index 71476ca5fad71..beea2c6f1c694 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -1572,7 +1572,9 @@ static void binder_transaction(struct binder_proc *proc, fp->type = BINDER_TYPE_HANDLE; else fp->type = BINDER_TYPE_WEAK_HANDLE; + fp->binder = 0; fp->handle = ref->desc; + fp->cookie = 0; binder_inc_ref(ref, fp->type == BINDER_TYPE_HANDLE, &thread->todo); @@ -1618,7 +1620,9 @@ static void binder_transaction(struct binder_proc *proc, return_error = BR_FAILED_REPLY; goto err_binder_get_ref_for_node_failed; } + fp->binder = 0; fp->handle = new_ref->desc; + fp->cookie = 0; binder_inc_ref(new_ref, fp->type == BINDER_TYPE_HANDLE, NULL); trace_binder_transaction_ref_to_ref(t, ref, new_ref); @@ -1670,6 +1674,7 @@ static void binder_transaction(struct binder_proc *proc, binder_debug(BINDER_DEBUG_TRANSACTION, " fd %d -> %d\n", fp->handle, target_fd); /* TODO: fput? */ + fp->binder = 0; fp->handle = target_fd; } break; From b8c7ae0710ebb5c84ec531b242abefe12b5db3b9 Mon Sep 17 00:00:00 2001 From: Arumuga Durai A Date: Wed, 28 Sep 2016 10:44:21 +0530 Subject: [PATCH 0224/1015] USB: PHY: Avoid uninitialized variable error Fix to avoid static analysis tool reports uninitialized variable error in function set_msm_otg_perf_mode uses this variable. CRs-Fixed: 1070067 Change-Id: Ib5e26f2e67b4e741841fea9c211eb645b9e62f56 Signed-off-by: Arumuga Durai A --- drivers/usb/phy/phy-msm-usb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index d9c96cc1a8292..6a1437c157919 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c @@ -3756,10 +3756,11 @@ set_msm_otg_perf_mode(struct device *dev, struct device_attribute *attr, ret = clk_set_rate(motg->core_clk, clk_rate); if (ret) pr_err("sys_clk set_rate fail:%d %ld\n", ret, clk_rate); + msm_otg_dbg_log_event(&motg->phy, "OTG PERF SET", + clk_rate, ret); } else { pr_err("usb sys_clk rate is undefined\n"); } - msm_otg_dbg_log_event(&motg->phy, "OTG PERF SET", clk_rate, ret); return count; } From 26981da22717d6fd9af91a7d41fa80c5068a1e35 Mon Sep 17 00:00:00 2001 From: Arumuga Durai A Date: Wed, 28 Sep 2016 20:00:15 +0530 Subject: [PATCH 0225/1015] usb_bam: Avoid uninitialized variable errors Static analysis tool reports errors related to functions using uninitialized varibles. Fix these. CRS-Fixed: 1070067 Change-Id: I0d4b9f72a12e91b16f3844ac70db33b7de5e5263 Signed-off-by: Arumuga Durai A --- drivers/platform/msm/usb_bam.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/platform/msm/usb_bam.c b/drivers/platform/msm/usb_bam.c index b432b07412201..9cdebd1549dbe 100644 --- a/drivers/platform/msm/usb_bam.c +++ b/drivers/platform/msm/usb_bam.c @@ -1323,6 +1323,9 @@ static void usb_bam_finish_suspend(enum usb_ctrl cur_bam) __func__, ret); goto no_lpm; } + } else { + log_event_err("%s: pipe type is not B2B\n", __func__); + cons_empty = true; } spin_lock(&usb_bam_ipa_handshake_info_lock); @@ -1959,8 +1962,8 @@ static void usb_bam_finish_resume(struct work_struct *w) spin_unlock(&usb_bam_ipa_handshake_info_lock); mutex_unlock(&info[cur_bam].suspend_resume_mutex); - log_event_dbg("%s: done..PM Runtime PUT %d, count: %d\n", - __func__, idx, get_pm_runtime_counter(bam_dev)); + log_event_dbg("%s: done..PM Runtime PUT :%d\n", + __func__, get_pm_runtime_counter(bam_dev)); /* Put to match _get at the beginning of this routine */ pm_runtime_put(&ctx->usb_bam_pdev->dev); } @@ -2762,16 +2765,14 @@ static void usb_bam_sps_events(enum sps_callback_case sps_cb_case, void *user) log_event_dbg("%s: received SPS_CALLBACK_BAM_TIMER_IRQ\n", __func__); - spin_lock(&ctx->usb_bam_lock); - bam = get_bam_type_from_core_name((char *)user); if (bam < 0 || bam >= MAX_BAMS) { log_event_err("%s: Invalid bam, type=%d ,name=%s\n", __func__, bam, (char *)user); - spin_unlock(&ctx->usb_bam_lock); return; } ctx = &msm_usb_bam[bam]; + spin_lock(&ctx->usb_bam_lock); ctx->is_bam_inactivity = true; log_event_dbg("%s: Inactivity happened on bam=%s,%d\n", From 7994957e51ff818257d0f6ba3dc704653bab8196 Mon Sep 17 00:00:00 2001 From: Alok Kediya Date: Fri, 7 Oct 2016 15:47:20 +0530 Subject: [PATCH 0226/1015] msm: isp: check for the stream info state. check for the stream info state before access the structure. Change-Id: Id0d38b50ff0049c05ee5eb1ef489734c3c96c261 Signed-off-by: Alok Kediya --- drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index f8680fb2d61c1..b47fdb7d195da 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -452,6 +452,8 @@ int msm_isp_axi_check_stream_state( } stream_info = &axi_data->stream_info[ HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])]; + if (stream_info->state == AVAILABLE) + continue; spin_lock_irqsave(&stream_info->lock, flags); if (stream_info->state != valid_state) { if ((stream_info->state == PAUSING || From d5bc14378570e15f010299642d0fed8b1a461550 Mon Sep 17 00:00:00 2001 From: Arumuga Durai A Date: Wed, 28 Sep 2016 17:05:56 +0530 Subject: [PATCH 0227/1015] USB: dwc3: Avoid uninitialized variable error Fix to avoid static analysis tool reports uninitialized variable error in function dwc3_debugfs_init which uses this variable. CRs-Fixed: 1070067 Change-Id: I27d8adf3082c81f6859be2656ca93dddaef42ec6 Signed-off-by: Arumuga Durai A --- drivers/usb/dwc3/debugfs.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c index 76ad2bc464d02..717f59125a5cd 100644 --- a/drivers/usb/dwc3/debugfs.c +++ b/drivers/usb/dwc3/debugfs.c @@ -1068,26 +1068,23 @@ int dwc3_debugfs_init(struct dwc3 *dwc) { struct dentry *root; struct dentry *file; - int ret; if (count >= DWC_CTRL_COUNT) { dev_err(dwc->dev, "Err dwc instance %d >= %d available\n", count, DWC_CTRL_COUNT); - ret = -EINVAL; - return ret; + return -EINVAL; } root = debugfs_create_dir(dev_name(dwc->dev), NULL); if (!root) { - ret = -ENOMEM; - goto err0; + dev_err(dwc->dev, "Can't create debugfs root\n"); + return -ENOMEM; } dwc->root = root; dwc->regset = kzalloc(sizeof(*dwc->regset), GFP_KERNEL); if (!dwc->regset) { - ret = -ENOMEM; goto err1; } @@ -1097,7 +1094,7 @@ int dwc3_debugfs_init(struct dwc3 *dwc) file = debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs regdump\n"); goto err1; } @@ -1105,7 +1102,7 @@ int dwc3_debugfs_init(struct dwc3 *dwc) file = debugfs_create_file("mode", S_IRUGO | S_IWUSR, root, dwc, &dwc3_mode_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs mode\n"); goto err1; } } @@ -1115,14 +1112,14 @@ int dwc3_debugfs_init(struct dwc3 *dwc) file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root, dwc, &dwc3_testmode_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs testmode\n"); goto err1; } file = debugfs_create_file("link_state", S_IRUGO | S_IWUSR, root, dwc, &dwc3_link_state_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs linkstate\n"); goto err1; } } @@ -1130,28 +1127,28 @@ int dwc3_debugfs_init(struct dwc3 *dwc) file = debugfs_create_file("trbs", S_IRUGO | S_IWUSR, root, dwc, &dwc3_ep_trb_list_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs trbs\n"); goto err1; } file = debugfs_create_file("requests", S_IRUGO | S_IWUSR, root, dwc, &dwc3_ep_req_list_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs requests\n"); goto err1; } file = debugfs_create_file("queued_reqs", S_IRUGO | S_IWUSR, root, dwc, &dwc3_ep_req_queued_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs queued_reqs\n"); goto err1; } file = debugfs_create_file("int_events", S_IRUGO | S_IWUSR, root, dwc, &dwc3_gadget_dbg_events_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs int_events\n"); goto err1; } @@ -1170,9 +1167,7 @@ int dwc3_debugfs_init(struct dwc3 *dwc) kfree(dwc->regset); dwc->regset = NULL; debugfs_remove_recursive(root); - -err0: - return ret; + return -ENOMEM; } void dwc3_debugfs_exit(struct dwc3 *dwc) From 0babb3df7d94f13b56a507781301686d528af71b Mon Sep 17 00:00:00 2001 From: Trishansh Bhardwaj Date: Mon, 19 Sep 2016 10:52:58 +0530 Subject: [PATCH 0228/1015] msm: camera: Change %p into %pK Prevents kernel info leak by changing %p into %pK CRs-Fixed: 1052835 Change-Id: Iad411dbba05326aa2bce82aff5e8140fd0a31a08 Signed-off-by: Trishansh Bhardwaj Signed-off-by: Abhishek Ranjan --- drivers/media/platform/msm/camera_v2/isp/msm_isp40.c | 6 +++--- drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index 1edaf323bc334..2d3bf99b2f9e8 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -1015,8 +1015,8 @@ static int msm_vfe40_start_fetch_engine(struct vfe_device *vfe_dev, rc = vfe_dev->buf_mgr->ops->get_buf_by_index( vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf); if (rc < 0 || !buf) { - pr_err("%s: No fetch buffer rc= %d buf= %p\n", - __func__, rc, buf); + pr_err("%s: No fetch buffer rc= %d\n", + __func__, rc); return -EINVAL; } mapped_info = buf->mapped_info[0]; @@ -1072,7 +1072,7 @@ static int msm_vfe40_start_fetch_engine_multi_pass(struct vfe_device *vfe_dev, rc = vfe_dev->buf_mgr->ops->get_buf_by_index( vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf); if (rc < 0 || !buf) { - pr_err("%s: No fetch buffer rc= %d buf= %p\n", + pr_err("%s: No fetch buffer rc= %d buf= %pK\n", __func__, rc, buf); return -EINVAL; } diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index b47fdb7d195da..65561405fe74f 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -1690,8 +1690,8 @@ int msm_isp_cfg_offline_ping_pong_address(struct vfe_device *vfe_dev, rc = vfe_dev->buf_mgr->ops->get_buf_by_index( vfe_dev->buf_mgr, bufq_handle, buf_idx, &buf); if (rc < 0 || !buf) { - pr_err("%s: No fetch buffer rc= %d buf= %p\n", - __func__, rc, buf); + pr_err("%s: No fetch buffer rc= %d\n", + __func__, rc); return -EINVAL; } From 90fa311912fc9d53f02a519edec5399baf601341 Mon Sep 17 00:00:00 2001 From: Trishansh Bhardwaj Date: Tue, 13 Sep 2016 16:28:14 +0530 Subject: [PATCH 0229/1015] msm: camera: Change MAX_CID_CH macro to 3 Modify macro MAX_CID_CH to 3 as vfe can support maximum 3 CID_CH at an instance. CRs-Fixed: 1064689 Change-Id: Ibb993839c1057fb62f43e99df3bee8328a4c702f Signed-off-by: Trishansh Bhardwaj --- drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c | 4 ++-- include/uapi/media/msmb_ispif.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c index 97a003b2eae1f..39e451c0dccae 100644 --- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c +++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c @@ -837,7 +837,7 @@ static uint16_t msm_ispif_get_cids_mask_from_cfg( uint16_t cids_mask = 0; BUG_ON(!entry); - for (i = 0; i < entry->num_cids; i++) + for (i = 0; i < entry->num_cids && i < MAX_CID_CH_v2; i++) cids_mask |= (1 << entry->cids[i]); return cids_mask; @@ -967,7 +967,7 @@ static void msm_ispif_intf_cmd(struct ispif_device *ispif, uint32_t cmd_bits, pr_err("%s: invalid interface type\n", __func__); return; } - if (params->entries[i].num_cids > MAX_CID_CH) { + if (params->entries[i].num_cids > MAX_CID_CH_v2) { pr_err("%s: out of range of cid_num %d\n", __func__, params->entries[i].num_cids); return; diff --git a/include/uapi/media/msmb_ispif.h b/include/uapi/media/msmb_ispif.h index 7f4deaf126831..dd8bb44576af3 100644 --- a/include/uapi/media/msmb_ispif.h +++ b/include/uapi/media/msmb_ispif.h @@ -28,6 +28,7 @@ enum msm_ispif_intftype { }; #define MAX_PARAM_ENTRIES (INTF_MAX * 2) #define MAX_CID_CH 8 +#define MAX_CID_CH_v2 3 #define PIX0_MASK (1 << PIX0) #define PIX1_MASK (1 << PIX1) @@ -94,7 +95,7 @@ struct msm_ispif_params_entry { enum msm_ispif_vfe_intf vfe_intf; enum msm_ispif_intftype intftype; int num_cids; - enum msm_ispif_cid cids[3]; + enum msm_ispif_cid cids[MAX_CID_CH_v2]; enum msm_ispif_csid csid; int crop_enable; uint16_t crop_start_pixel; From 2a31d9c9e2407a4685b60f7a3c758bbfca4eec99 Mon Sep 17 00:00:00 2001 From: Sunid Wilson Date: Tue, 23 Aug 2016 14:41:47 -0700 Subject: [PATCH 0230/1015] msm: camera: cpp: Add validation for v4l2 ioctl arguments In CPP v4l2 ioctl command is made, if _IOC_DIR(cmd) is _IOC_NONE, then the user-supplied argument arg is not checked and an information disclosure is possible CRs-Fixed: 1042068 Change-Id: Iddb291b10cdcb5c42ab8497e06c2ce47885cd5ab Signed-off-by: Sunid Wilson --- .../media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index a4d1b667ccc5f..133be5d44ec33 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -2678,14 +2678,14 @@ static int msm_cpp_validate_input(unsigned int cmd, void *arg, break; default: { if (ioctl_ptr == NULL) { - pr_err("Wrong ioctl_ptr %pK\n", ioctl_ptr); + pr_err("Wrong ioctl_ptr for cmd %u\n", cmd); return -EINVAL; } *ioctl_ptr = arg; if ((*ioctl_ptr == NULL) || - ((*ioctl_ptr)->ioctl_ptr == NULL)) { - pr_err("Wrong arg %pK\n", arg); + (*ioctl_ptr)->ioctl_ptr == NULL) { + pr_err("Error invalid ioctl argument cmd %u", cmd); return -EINVAL; } break; @@ -2710,6 +2710,12 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, pr_err("cpp_dev is null\n"); return -EINVAL; } + + if (_IOC_DIR(cmd) == _IOC_NONE) { + pr_err("Invalid ioctl/subdev cmd %u", cmd); + return -EINVAL; + } + rc = msm_cpp_validate_input(cmd, arg, &ioctl_ptr); if (rc != 0) { pr_err("input validation failed\n"); From 54f4f57c6930ee7dcb36ca029de31a1f450c2e92 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Thu, 13 Oct 2016 14:47:30 +0530 Subject: [PATCH 0231/1015] ARM: dts: msm: update APC CPR configuration for msm8940 Modify APC CPR configuration to identify the correct corner max map index for msm8940. CRs-Fixed: 1077453 Change-Id: I9d576b32342f0d98e7ebe9204448debb6cba5d79 Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8940.dtsi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index 3acd12aef8417..ef7238f457257 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -235,6 +235,10 @@ /delete-property/ qcom,cpr-enable; qcom,pvs-version-fuse-sel = <37 40 3 0>; /* foundry */ + qcom,cpr-speed-bin-max-corners = + <0 (-1) 1 2 6>, + <1 (-1) 1 2 7>; + qcom,cpr-fuse-version-map = <(-1) 0 (-1) (-1) (-1) (-1)>, <(-1) 1 (-1) (-1) (-1) (-1)>, From 3036b220ef79277f448ed88ac0c57f18bb635341 Mon Sep 17 00:00:00 2001 From: vjitta Date: Tue, 27 Sep 2016 17:00:01 +0530 Subject: [PATCH 0232/1015] ARM: dts: msm: update coresight nodes for MSM 8953/8940/8920 Add the port information, CTI and ETM device nodes of scalar modem and update the register address for vector modem for msm8953, msm8940 and msm8920 targets. Change-Id: I66fc84c64145a456afe1fe62d5891914a478aba9 Signed-off-by: Vijayanand Jitta --- arch/arm/boot/dts/qcom/msm8920.dtsi | 108 ++++++++++++++++++ arch/arm/boot/dts/qcom/msm8940.dtsi | 19 ++- arch/arm/boot/dts/qcom/msm8953-coresight.dtsi | 8 +- 3 files changed, 129 insertions(+), 6 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 6fcccdbcb8242..f53f7adaf953a 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -193,3 +193,111 @@ /delete-property/ qcom,cpr-init-voltage-adjustment; /delete-property/ qcom,cpr-enable; }; + +&funnel_apss { + coresight-child-ports = <3>; +}; + +&soc { + /delete-node/ cti@6124000; + cti_modem_cpu0: cti@6128000 { + compatible = "arm,coresight-cti"; + reg = <0x6128000 0x1000>; + reg-names = "cti-base"; + + coresight-id = <51>; + coresight-name = "coresight-cti-modem-cpu0"; + coresight-nr-inports = <0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + /* MSS_SCL */ + modem_etm0 { + coresight-child-ports = <2>; + }; + + cti_modem_cpu1: cti@6124000 { + compatible = "arm,coresight-cti"; + reg = <0x6124000 0x1000>; + reg-names = "cti-base"; + + coresight-id = <52>; + coresight-name = "coresight-cti-modem-cpu1"; + coresight-nr-inports = <0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + /* MSS_VEC */ + modem_etm1 { + compatible = "qcom,coresight-remote-etm"; + + coresight-id = <53>; + coresight-name = "coresight-modem-etm1"; + coresight-nr-inports = <0>; + coresight-outports = <0>; + coresight-child-list = <&funnel_right>; + coresight-child-ports = <1>; + + qcom,inst-id = <11>; + }; +}; + +&funnel_apss { + coresight-child-ports = <3>; +}; + +&soc { + /delete-node/ cti@6124000; + cti_modem_cpu0: cti@6128000 { + compatible = "arm,coresight-cti"; + reg = <0x6128000 0x1000>; + reg-names = "cti-base"; + + coresight-id = <51>; + coresight-name = "coresight-cti-modem-cpu0"; + coresight-nr-inports = <0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + /* MSS_SCL */ + modem_etm0 { + coresight-child-ports = <2>; + }; + + cti_modem_cpu1: cti@6124000 { + compatible = "arm,coresight-cti"; + reg = <0x6124000 0x1000>; + reg-names = "cti-base"; + + coresight-id = <52>; + coresight-name = "coresight-cti-modem-cpu1"; + coresight-nr-inports = <0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + /* MSS_VEC */ + modem_etm1 { + compatible = "qcom,coresight-remote-etm"; + + coresight-id = <53>; + coresight-name = "coresight-modem-etm1"; + coresight-nr-inports = <0>; + coresight-outports = <0>; + coresight-child-list = <&funnel_right>; + coresight-child-ports = <1>; + + qcom,inst-id = <11>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index 3acd12aef8417..93e5bdbcf0c9a 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -283,12 +283,27 @@ }; &soc { - cti_modem_cpu1: cti@6128000{ + /delete-node/ cti@6124000; + cti_modem_cpu0: cti@6128000{ compatible = "arm,coresight-cti"; reg = <0x6128000 0x1000>; reg-names = "cti-base"; coresight-id = <59>; + coresight-name = "coresight-cti-modem-cpu0"; + coresight-nr-inports = <0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + cti_modem_cpu1: cti@6124000{ + compatible = "arm,coresight-cti"; + reg = <0x6124000 0x1000>; + reg-names = "cti-base"; + + coresight-id = <60>; coresight-name = "coresight-cti-modem-cpu1"; coresight-nr-inports = <0>; @@ -301,7 +316,7 @@ modem_etm1 { compatible = "qcom,coresight-remote-etm"; - coresight-id = <60>; + coresight-id = <61>; coresight-name = "coresight-modem-etm1"; coresight-nr-inports = <0>; coresight-outports = <0>; diff --git a/arch/arm/boot/dts/qcom/msm8953-coresight.dtsi b/arch/arm/boot/dts/qcom/msm8953-coresight.dtsi index 246c9c5027e33..d0e4cbc5f7fdd 100644 --- a/arch/arm/boot/dts/qcom/msm8953-coresight.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-coresight.dtsi @@ -751,9 +751,9 @@ clock-names = "core_clk", "core_a_clk"; }; - cti_modem_cpu0: cti@6124000 { + cti_modem_cpu0: cti@6128000 { compatible = "arm,coresight-cti"; - reg = <0x6124000 0x1000>; + reg = <0x6128000 0x1000>; reg-names = "cti-base"; coresight-id = <44>; @@ -765,9 +765,9 @@ clock-names = "core_clk", "core_a_clk"; }; - cti_modem_cpu1: cti@6128000{ + cti_modem_cpu1: cti@6124000{ compatible = "arm,coresight-cti"; - reg = <0x6128000 0x1000>; + reg = <0x6124000 0x1000>; reg-names = "cti-base"; coresight-id = <45>; From 4ccae465440dc750196882df75eebcebdcbe6677 Mon Sep 17 00:00:00 2001 From: Walter Yang Date: Wed, 28 Sep 2016 20:11:23 +0800 Subject: [PATCH 0233/1015] ASoC: msm: lock read/write when add/free audio ion memory As read/write get access to ion memory region as well, it's necessary to lock them when ion memory is about to be added/freed to avoid racing cases. CRs-Fixed: 1071809 Change-Id: I436ead23c93384961b38ca99b9312a40c50ad03a Signed-off-by: Walter Yang --- drivers/misc/qcom/qdsp6v2/audio_utils_aio.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c index 2b0af2ea7ae63..9ade5572cf791 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c @@ -570,6 +570,8 @@ int audio_aio_release(struct inode *inode, struct file *file) struct q6audio_aio *audio = file->private_data; pr_debug("%s[%pK]\n", __func__, audio); mutex_lock(&audio->lock); + mutex_lock(&audio->read_lock); + mutex_lock(&audio->write_lock); audio->wflush = 1; if (audio->wakelock_voted && (audio->audio_ws_mgr != NULL) && @@ -595,6 +597,8 @@ int audio_aio_release(struct inode *inode, struct file *file) wake_up(&audio->event_wait); audio_aio_reset_event_queue(audio); q6asm_audio_client_free(audio->ac); + mutex_unlock(&audio->write_lock); + mutex_unlock(&audio->read_lock); mutex_unlock(&audio->lock); mutex_destroy(&audio->lock); mutex_destroy(&audio->read_lock); @@ -1743,7 +1747,11 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, __func__); rc = -EFAULT; } else { + mutex_lock(&audio->read_lock); + mutex_lock(&audio->write_lock); rc = audio_aio_ion_add(audio, &info); + mutex_unlock(&audio->write_lock); + mutex_unlock(&audio->read_lock); } mutex_unlock(&audio->lock); break; @@ -1758,7 +1766,11 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, __func__); rc = -EFAULT; } else { + mutex_lock(&audio->read_lock); + mutex_lock(&audio->write_lock); rc = audio_aio_ion_remove(audio, &info); + mutex_unlock(&audio->write_lock); + mutex_unlock(&audio->read_lock); } mutex_unlock(&audio->lock); break; @@ -2062,7 +2074,11 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, } else { info.fd = info_32.fd; info.vaddr = compat_ptr(info_32.vaddr); + mutex_lock(&audio->read_lock); + mutex_lock(&audio->write_lock); rc = audio_aio_ion_add(audio, &info); + mutex_unlock(&audio->write_lock); + mutex_unlock(&audio->read_lock); } mutex_unlock(&audio->lock); break; @@ -2079,7 +2095,11 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, } else { info.fd = info_32.fd; info.vaddr = compat_ptr(info_32.vaddr); + mutex_lock(&audio->read_lock); + mutex_lock(&audio->write_lock); rc = audio_aio_ion_remove(audio, &info); + mutex_unlock(&audio->write_lock); + mutex_unlock(&audio->read_lock); } mutex_unlock(&audio->lock); break; From 1b81aa4cf82318e4a61ab566f15caf042cb4823f Mon Sep 17 00:00:00 2001 From: Harshdeep Dhatt Date: Wed, 29 Jun 2016 17:14:21 -0600 Subject: [PATCH 0234/1015] msm: kgsl: Trigger preemption from preemption complete interrupt If a high priority context submits while preemption to a lower context is underway, then preemption to higher context is not triggered until either we get a GPU command complete interrupt or another workload from the higher context is submitted. To avoid this latency, trigger preemption from the preemption complete interrupt. CRs-Fixed: 1058401 Signed-off-by: Harshdeep Dhatt Change-Id: I0a05df94e7bdd5daadfa0713371a595a06b7bda7 --- drivers/gpu/msm/adreno_a5xx_preempt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/msm/adreno_a5xx_preempt.c b/drivers/gpu/msm/adreno_a5xx_preempt.c index 27c3e85adeea5..6266d6d0ec368 100644 --- a/drivers/gpu/msm/adreno_a5xx_preempt.c +++ b/drivers/gpu/msm/adreno_a5xx_preempt.c @@ -311,6 +311,8 @@ void a5xx_preempt_callback(struct adreno_device *adreno_dev, int bit) adreno_dev->cur_rb->dispatch_q.expires); adreno_set_preempt_state(adreno_dev, ADRENO_PREEMPT_NONE); + + a5xx_preemption_trigger(adreno_dev); } void a5xx_preemption_schedule(struct adreno_device *adreno_dev) From a08640f2b5f8cdd422907d9ada3579c9b90597c8 Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Sat, 15 Oct 2016 15:39:23 +0530 Subject: [PATCH 0235/1015] regulator: msm_gfx_ldo: Fix invalid memory accesses A few gfx_ldo memory read/write calls use an invalid ldo base address leading to other corruptions in the system. Fix this by using the correct LDO base address. CRs-Fixed: 1078353 Change-Id: I034d473e86b3fe7164d1c9ddad326c9dd77a188f Signed-off-by: Anirudh Ghayal --- drivers/regulator/msm_gfx_ldo.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/regulator/msm_gfx_ldo.c b/drivers/regulator/msm_gfx_ldo.c index 5c97bc04ad87e..4bcfd8a07fc9e 100644 --- a/drivers/regulator/msm_gfx_ldo.c +++ b/drivers/regulator/msm_gfx_ldo.c @@ -319,23 +319,23 @@ static int enable_ldo_mode(struct msm_gfx_ldo *ldo_vreg) /* Move BHS under SW control */ ctl |= BHS_UNDER_SW_CTL; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* Set LDO under gdsc control */ ctl &= ~LDO_UNDER_SW_CTRL_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* enable hw_pre-on to gdsc */ ctl |= LDO_PREON_SW_OVR_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* remove LDO bypass */ ctl &= ~LDO_BYPASS_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* set power-source as LDO */ ctl |= PWR_SRC_SEL_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* clear fake-sw ack to gdsc */ ctl &= ~ACK_SW_OVR_BIT; @@ -343,7 +343,7 @@ static int enable_ldo_mode(struct msm_gfx_ldo *ldo_vreg) /* put CPR in bypass mode */ ctl |= CPR_BYPASS_IN_LDO_MODE_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* complete all writes */ mb(); @@ -535,7 +535,7 @@ static int switch_mode_to_ldo(struct msm_gfx_ldo *ldo_vreg, int new_corner) /* remove LDO bypass */ ctl &= ~LDO_BYPASS_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* expose LDO to gdsc */ ctl &= ~ACK_SW_OVR_BIT; From cbc9c4624801779f6e6a663c70489ed5d85e3b9c Mon Sep 17 00:00:00 2001 From: Vikram Mulukutla Date: Tue, 27 Sep 2016 15:18:28 +0530 Subject: [PATCH 0236/1015] sched: qhmp_core: Fix possible hotplug race in set_cpus_allowed_ptr Since a CPU may go offline after cpu_active_mask is used to query active CPUs, set_cpus_allowed_ptr might inadverntently pass an invalid cpu number to move_queued_task. Fix this by ensuring that the cpumask op that uses cpu_active_mask checks the return value. CRs-Fixed: 1029014 Change-Id: Iab49c8140a00b8b644f5b4f6c87e2e298a8bb107 Signed-off-by: Vikram Mulukutla Signed-off-by: Pavankumar Kondeti --- kernel/sched/qhmp_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/sched/qhmp_core.c b/kernel/sched/qhmp_core.c index 5d947612d347f..fe99dcdd3217c 100644 --- a/kernel/sched/qhmp_core.c +++ b/kernel/sched/qhmp_core.c @@ -6596,7 +6596,8 @@ int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) if (cpumask_equal(&p->cpus_allowed, new_mask)) goto out; - if (!cpumask_intersects(new_mask, cpu_active_mask)) { + dest_cpu = cpumask_any_and(cpu_active_mask, new_mask); + if (dest_cpu >= nr_cpu_ids) { ret = -EINVAL; goto out; } @@ -6607,7 +6608,6 @@ int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) if (cpumask_test_cpu(task_cpu(p), new_mask)) goto out; - dest_cpu = cpumask_any_and(cpu_active_mask, new_mask); if (task_running(rq, p) || p->state == TASK_WAKING) { struct migration_arg arg = { p, dest_cpu }; /* Need help from migration thread: drop lock and wait. */ From a2c59d4bc488e6d69bcb4209b82739f7c1410613 Mon Sep 17 00:00:00 2001 From: Siena Richard Date: Tue, 4 Oct 2016 12:24:28 -0700 Subject: [PATCH 0237/1015] drivers: soc: add size checks and update log messages Add size checks to validate minimum size is met. Update log messages to include only relevant information to ensure logs are accurate and useful. Change-Id: Idf76a7d964ec6989a0474d49895e54103f17938b CRs-fixed: 1073129 Signed-off-by: Siena Richard --- drivers/soc/qcom/qdsp6v2/voice_svc.c | 41 ++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/drivers/soc/qcom/qdsp6v2/voice_svc.c b/drivers/soc/qcom/qdsp6v2/voice_svc.c index 67c58d1e6d4cd..50dd9256b270f 100644 --- a/drivers/soc/qcom/qdsp6v2/voice_svc.c +++ b/drivers/soc/qcom/qdsp6v2/voice_svc.c @@ -223,8 +223,8 @@ static int voice_svc_send_req(struct voice_svc_cmd_request *apr_request, } else if (!strcmp(apr_request->svc_name, VOICE_SVC_MVM_STR)) { apr_handle = prtd->apr_q6_mvm; } else { - pr_err("%s: Invalid service %s\n", __func__, - apr_request->svc_name); + pr_err("%s: Invalid service %.*s\n", __func__, + MAX_APR_SERVICE_NAME_LEN, apr_request->svc_name); ret = -EINVAL; goto done; @@ -338,8 +338,8 @@ static int process_reg_cmd(struct voice_svc_register *apr_reg_svc, svc = VOICE_SVC_CVS_STR; handle = &prtd->apr_q6_cvs; } else { - pr_err("%s: Invalid Service: %s\n", __func__, - apr_reg_svc->svc_name); + pr_err("%s: Invalid Service: %.*s\n", __func__, + MAX_APR_SERVICE_NAME_LEN, apr_reg_svc->svc_name); ret = -EINVAL; goto done; } @@ -365,7 +365,17 @@ static ssize_t voice_svc_write(struct file *file, const char __user *buf, pr_debug("%s\n", __func__); - data = kmalloc(count, GFP_KERNEL); + /* + * Check if enough memory is allocated to parse the message type. + * Will check there is enough to hold the payload later. + */ + if (count >= sizeof(struct voice_svc_write_msg)) { + data = kmalloc(count, GFP_KERNEL); + } else { + pr_debug("%s: invalid data size\n", __func__); + ret = -EINVAL; + goto done; + } if (data == NULL) { pr_err("%s: data kmalloc failed.\n", __func__); @@ -383,7 +393,7 @@ static ssize_t voice_svc_write(struct file *file, const char __user *buf, } cmd = data->msg_type; - prtd = (struct voice_svc_prvt *)file->private_data; + prtd = (struct voice_svc_prvt *) file->private_data; if (prtd == NULL) { pr_err("%s: prtd is NULL\n", __func__); @@ -393,9 +403,13 @@ static ssize_t voice_svc_write(struct file *file, const char __user *buf, switch (cmd) { case MSG_REGISTER: - if (count >= - (sizeof(struct voice_svc_register) + - sizeof(*data))) { + /* + * Check that count reflects the expected size to ensure + * sufficient memory was allocated. Since voice_svc_register + * has a static size, this should be exact. + */ + if (count == (sizeof(struct voice_svc_write_msg) + + sizeof(struct voice_svc_register))) { ret = process_reg_cmd( (struct voice_svc_register *)data->payload, prtd); if (!ret) @@ -407,8 +421,13 @@ static ssize_t voice_svc_write(struct file *file, const char __user *buf, } break; case MSG_REQUEST: - if (count >= (sizeof(struct voice_svc_cmd_request) + - sizeof(*data))) { + /* + * Check that count reflects the expected size to ensure + * sufficient memory was allocated. Since voice_svc_cmd_request + * has a variable size, check the minimum value count must be. + */ + if (count >= (sizeof(struct voice_svc_write_msg) + + sizeof(struct voice_svc_cmd_request))) { ret = voice_svc_send_req( (struct voice_svc_cmd_request *)data->payload, prtd); if (!ret) From 6a6d81dd61be428b1d754f18243cd753103c8505 Mon Sep 17 00:00:00 2001 From: Anand Kumar Date: Thu, 6 Oct 2016 16:08:50 +0530 Subject: [PATCH 0238/1015] wcnss: Read multiple SMD Packet from SMD Channel It observe that sometime, there are multiple SMD packets in SMD channel. In current scenario, driver reading one packet at single event. Reading all SMD packets to avoid any packets miss. CRs-Fixed: 1074988 Change-Id: I9cd821f6369762151857e1bc2887895714262f54 Signed-off-by: Anand Kumar --- drivers/net/wireless/wcnss/wcnss_wlan.c | 45 ++++++++++++++++--------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c index 3f9eeabc54648..f32e5d2a0e9d0 100644 --- a/drivers/net/wireless/wcnss/wcnss_wlan.c +++ b/drivers/net/wireless/wcnss/wcnss_wlan.c @@ -2123,10 +2123,8 @@ void extract_cal_data(int len) return; } - -static void wcnssctrl_rx_handler(struct work_struct *worker) +static void wcnss_process_smd_msg(int len) { - int len = 0; int rc = 0; unsigned char buf[sizeof(struct wcnss_version)]; unsigned char build[WCNSS_MAX_BUILD_VER_LEN+1]; @@ -2136,17 +2134,6 @@ static void wcnssctrl_rx_handler(struct work_struct *worker) int hw_type; unsigned char fw_status = 0; - len = smd_read_avail(penv->smd_ch); - if (len > WCNSS_MAX_FRAME_SIZE) { - pr_err("wcnss: frame larger than the allowed size\n"); - smd_read(penv->smd_ch, NULL, len); - return; - } - if (len < sizeof(struct smd_msg_hdr)) { - pr_err("wcnss: incomplete header available len = %d\n", len); - return; - } - rc = smd_read(penv->smd_ch, buf, sizeof(struct smd_msg_hdr)); if (rc < sizeof(struct smd_msg_hdr)) { pr_err("wcnss: incomplete header read from smd\n"); @@ -2213,7 +2200,7 @@ static void wcnssctrl_rx_handler(struct work_struct *worker) case WCNSS_BUILD_VER_RSP: if (len > WCNSS_MAX_BUILD_VER_LEN) { pr_err("wcnss: invalid build version data from wcnss %d\n", - len); + len); return; } rc = smd_read(penv->smd_ch, build, len); @@ -2245,7 +2232,6 @@ static void wcnssctrl_rx_handler(struct work_struct *worker) penv->is_cbc_done = 1; pr_debug("wcnss: received WCNSS_CBC_COMPLETE_IND from FW\n"); break; - case WCNSS_CALDATA_UPLD_REQ: extract_cal_data(len); break; @@ -2256,6 +2242,33 @@ static void wcnssctrl_rx_handler(struct work_struct *worker) return; } +static void wcnssctrl_rx_handler(struct work_struct *worker) +{ + int len; + + while (1) { + len = smd_read_avail(penv->smd_ch); + if (0 == len) { + pr_debug("wcnss: No more data to be read\n"); + return; + } + + if (len > WCNSS_MAX_FRAME_SIZE) { + pr_err("wcnss: frame larger than the allowed size\n"); + smd_read(penv->smd_ch, NULL, len); + return; + } + + if (len < sizeof(struct smd_msg_hdr)) { + pr_err("wcnss: incomplete header available len = %d\n", + len); + return; + } + + wcnss_process_smd_msg(len); + } +} + static void wcnss_send_version_req(struct work_struct *worker) { struct smd_msg_hdr smd_msg; From 255b81c5cc7a63367cb7d74ed5a9a77464eaee75 Mon Sep 17 00:00:00 2001 From: Harshdeep Dhatt Date: Wed, 7 Oct 2015 16:10:36 -0600 Subject: [PATCH 0239/1015] msm: kgsl: Clear the interrupt immediately Sometimes an interrupt from GPU is ignored while we are still executing the previous interrupt. In order to service any interrupt that was fired while executing the interrupt handler, clear the interrupt register immediately. Also, clear the ADRENO_INT_RBBM_AHB_ERROR bit not before but after it's serviced in its respective handler. This will avoid firing the main interrupt handler a second time. CRs-Fixed: 1072781 Change-Id: Ie6b5a511f5b3077adae7d464de437f2aa893b0c9 Signed-off-by: Harshdeep Dhatt Signed-off-by: Hareesh Gundu --- drivers/gpu/msm/adreno.c | 21 ++++++++++++++++++--- drivers/gpu/msm/adreno.h | 28 ++++++++++++++++++++++++++++ drivers/gpu/msm/adreno_a3xx.c | 5 +++++ drivers/gpu/msm/adreno_a4xx.c | 5 +++++ drivers/gpu/msm/adreno_a5xx.c | 5 +++++ 5 files changed, 61 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 3e0153cd7b9ae..cd1c74365e204 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -588,11 +588,21 @@ static irqreturn_t adreno_irq_handler(struct kgsl_device *device) struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev); struct adreno_irq *irq_params = gpudev->irq; irqreturn_t ret = IRQ_NONE; - unsigned int status = 0, tmp; + unsigned int status = 0, tmp, int_bit; int i; adreno_readreg(adreno_dev, ADRENO_REG_RBBM_INT_0_STATUS, &status); + /* + * Clear all the interrupt bits but ADRENO_INT_RBBM_AHB_ERROR. Because + * even if we clear it here, it will stay high until it is cleared + * in its respective handler. Otherwise, the interrupt handler will + * fire again. + */ + int_bit = ADRENO_INT_BIT(adreno_dev, ADRENO_INT_RBBM_AHB_ERROR); + adreno_writereg(adreno_dev, ADRENO_REG_RBBM_INT_CLEAR_CMD, + status & ~int_bit); + /* Loop through all set interrupts and call respective handlers */ for (tmp = status; tmp != 0;) { i = fls(tmp) - 1; @@ -611,9 +621,14 @@ static irqreturn_t adreno_irq_handler(struct kgsl_device *device) gpudev->irq_trace(adreno_dev, status); - if (status) + /* + * Clear ADRENO_INT_RBBM_AHB_ERROR bit after this interrupt has been + * cleared in its respective handler + */ + if (status & int_bit) adreno_writereg(adreno_dev, ADRENO_REG_RBBM_INT_CLEAR_CMD, - status); + int_bit); + return ret; } diff --git a/drivers/gpu/msm/adreno.h b/drivers/gpu/msm/adreno.h index 40c1178c852dd..0a1629a6072af 100644 --- a/drivers/gpu/msm/adreno.h +++ b/drivers/gpu/msm/adreno.h @@ -196,6 +196,10 @@ struct adreno_gpudev; /* Time to allow preemption to complete (in ms) */ #define ADRENO_PREEMPT_TIMEOUT 10000 +#define ADRENO_INT_BIT(a, _bit) (((a)->gpucore->gpudev->int_bits) ? \ + (adreno_get_int(a, _bit) < 0 ? 0 : \ + BIT(adreno_get_int(a, _bit))) : 0) + /** * enum adreno_preempt_states * ADRENO_PREEMPT_NONE: No preemption is scheduled @@ -572,6 +576,11 @@ enum adreno_regs { ADRENO_REG_REGISTER_MAX, }; +enum adreno_int_bits { + ADRENO_INT_RBBM_AHB_ERROR, + ADRENO_INT_BITS_MAX, +}; + /** * adreno_reg_offsets: Holds array of register offsets * @offsets: Offset array of size defined by enum adreno_regs @@ -587,6 +596,7 @@ struct adreno_reg_offsets { #define ADRENO_REG_UNUSED 0xFFFFFFFF #define ADRENO_REG_SKIP 0xFFFFFFFE #define ADRENO_REG_DEFINE(_offset, _reg) [_offset] = _reg +#define ADRENO_INT_DEFINE(_offset, _val) ADRENO_REG_DEFINE(_offset, _val) /* * struct adreno_vbif_data - Describes vbif register value pair @@ -724,6 +734,7 @@ struct adreno_gpudev { * so define them in the structure and use them as variables. */ const struct adreno_reg_offsets *reg_offsets; + unsigned int *const int_bits; const struct adreno_ft_perf_counters *ft_perf_counters; unsigned int ft_perf_counters_count; @@ -1088,6 +1099,23 @@ static inline unsigned int adreno_getreg(struct adreno_device *adreno_dev, return gpudev->reg_offsets->offsets[offset_name]; } +/* + * adreno_get_int() - Returns the offset value of an interrupt bit from + * the interrupt bit array in the gpudev node + * @adreno_dev: Pointer to the the adreno device + * @bit_name: The interrupt bit enum whose bit is returned + */ +static inline unsigned int adreno_get_int(struct adreno_device *adreno_dev, + enum adreno_int_bits bit_name) +{ + struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev); + + if (bit_name >= ADRENO_INT_BITS_MAX) + return -ERANGE; + + return gpudev->int_bits[bit_name]; +} + /** * adreno_gpu_fault() - Return the current state of the GPU * @adreno_dev: A pointer to the adreno_device to query diff --git a/drivers/gpu/msm/adreno_a3xx.c b/drivers/gpu/msm/adreno_a3xx.c index 157f57bf80cd3..6a03a14c64451 100644 --- a/drivers/gpu/msm/adreno_a3xx.c +++ b/drivers/gpu/msm/adreno_a3xx.c @@ -1465,6 +1465,10 @@ static struct adreno_coresight a3xx_coresight = { .groups = a3xx_coresight_groups, }; +static unsigned int a3xx_int_bits[ADRENO_INT_BITS_MAX] = { + ADRENO_INT_DEFINE(ADRENO_INT_RBBM_AHB_ERROR, A3XX_INT_RBBM_AHB_ERROR), +}; + /* Register offset defines for A3XX */ static unsigned int a3xx_register_offsets[ADRENO_REG_REGISTER_MAX] = { ADRENO_REG_DEFINE(ADRENO_REG_CP_ME_RAM_WADDR, A3XX_CP_ME_RAM_WADDR), @@ -1893,6 +1897,7 @@ int a3xx_microcode_load(struct adreno_device *adreno_dev, struct adreno_gpudev adreno_a3xx_gpudev = { .reg_offsets = &a3xx_reg_offsets, + .int_bits = a3xx_int_bits, .ft_perf_counters = a3xx_ft_perf_counters, .ft_perf_counters_count = ARRAY_SIZE(a3xx_ft_perf_counters), .perfcounters = &a3xx_perfcounters, diff --git a/drivers/gpu/msm/adreno_a4xx.c b/drivers/gpu/msm/adreno_a4xx.c index b15d23cfbe0a9..7a8236fb95da9 100644 --- a/drivers/gpu/msm/adreno_a4xx.c +++ b/drivers/gpu/msm/adreno_a4xx.c @@ -727,6 +727,10 @@ static void a4xx_err_callback(struct adreno_device *adreno_dev, int bit) } } +static unsigned int a4xx_int_bits[ADRENO_INT_BITS_MAX] = { + ADRENO_INT_DEFINE(ADRENO_INT_RBBM_AHB_ERROR, A4XX_INT_RBBM_AHB_ERROR), +}; + /* Register offset defines for A4XX, in order of enum adreno_regs */ static unsigned int a4xx_register_offsets[ADRENO_REG_REGISTER_MAX] = { ADRENO_REG_DEFINE(ADRENO_REG_CP_ME_RAM_WADDR, A4XX_CP_ME_RAM_WADDR), @@ -1753,6 +1757,7 @@ static struct adreno_snapshot_data a4xx_snapshot_data = { struct adreno_gpudev adreno_a4xx_gpudev = { .reg_offsets = &a4xx_reg_offsets, + .int_bits = a4xx_int_bits, .ft_perf_counters = a4xx_ft_perf_counters, .ft_perf_counters_count = ARRAY_SIZE(a4xx_ft_perf_counters), .perfcounters = &a4xx_perfcounters, diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c index 7375eff7785d4..38d94c36ac4d8 100644 --- a/drivers/gpu/msm/adreno_a5xx.c +++ b/drivers/gpu/msm/adreno_a5xx.c @@ -2944,6 +2944,10 @@ static struct adreno_ft_perf_counters a5xx_ft_perf_counters[] = { {KGSL_PERFCOUNTER_GROUP_TSE, A5XX_TSE_INPUT_PRIM_NUM}, }; +static unsigned int a5xx_int_bits[ADRENO_INT_BITS_MAX] = { + ADRENO_INT_DEFINE(ADRENO_INT_RBBM_AHB_ERROR, A5XX_INT_RBBM_AHB_ERROR), +}; + /* Register offset defines for A5XX, in order of enum adreno_regs */ static unsigned int a5xx_register_offsets[ADRENO_REG_REGISTER_MAX] = { ADRENO_REG_DEFINE(ADRENO_REG_CP_WFI_PEND_CTR, A5XX_CP_WFI_PEND_CTR), @@ -3576,6 +3580,7 @@ static struct adreno_coresight a5xx_coresight = { struct adreno_gpudev adreno_a5xx_gpudev = { .reg_offsets = &a5xx_reg_offsets, + .int_bits = a5xx_int_bits, .ft_perf_counters = a5xx_ft_perf_counters, .ft_perf_counters_count = ARRAY_SIZE(a5xx_ft_perf_counters), .coresight = &a5xx_coresight, From b932e5506e39a945669ba3e5d86c44fb12d7e500 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Thu, 25 Aug 2016 12:09:13 +0530 Subject: [PATCH 0240/1015] clk: msm: gcc: Add efuse based fmax for GPU clk for MSM8940 MSM8940 requires to support the maximum frequency of 500MHz for GPU clock, so add support to read the efuse register and update the list of supported frequencies and fmax tables accordingly. Change-Id: I7b76a666663455413bab39c598a05a5d0b5feb51 Signed-off-by: Odelu Kukatla --- drivers/clk/msm/clock-gcc-8952.c | 33 ++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c index 76b25462c8add..5239ee25f6cd4 100644 --- a/drivers/clk/msm/clock-gcc-8952.c +++ b/drivers/clk/msm/clock-gcc-8952.c @@ -766,6 +766,27 @@ static struct clk_freq_tbl ftbl_gcc_oxili_gfx3d_clk_8937_475MHz[] = { F_END }; +static struct clk_freq_tbl ftbl_gcc_oxili_gfx3d_clk_8940_500MHz[] = { + F_SLEW( 19200000, FIXED_CLK_SRC, xo, 1, 0, 0), + F_SLEW( 50000000, FIXED_CLK_SRC, gpll0, 16, 0, 0), + F_SLEW( 80000000, FIXED_CLK_SRC, gpll0, 10, 0, 0), + F_SLEW( 100000000, FIXED_CLK_SRC, gpll0, 8, 0, 0), + F_SLEW( 160000000, FIXED_CLK_SRC, gpll0, 5, 0, 0), + F_SLEW( 200000000, FIXED_CLK_SRC, gpll0, 4, 0, 0), + F_SLEW( 216000000, FIXED_CLK_SRC, gpll6_aux, 5, 0, 0), + F_SLEW( 228570000, FIXED_CLK_SRC, gpll0, 3.5, 0, 0), + F_SLEW( 240000000, FIXED_CLK_SRC, gpll6_aux, 4.5, 0, 0), + F_SLEW( 266670000, FIXED_CLK_SRC, gpll0, 3, 0, 0), + F_SLEW( 300000000, 600000000, gpll3, 1, 0, 0), + F_SLEW( 320000000, FIXED_CLK_SRC, gpll0, 2.5, 0, 0), + F_SLEW( 375000000, 750000000, gpll3, 1, 0, 0), + F_SLEW( 400000000, FIXED_CLK_SRC, gpll0, 2, 0, 0), + F_SLEW( 450000000, 900000000, gpll3, 1, 0, 0), + F_SLEW( 475000000, 950000000, gpll3, 1, 0, 0), + F_SLEW( 500000000, 1000000000, gpll3, 1, 0, 0), + F_END +}; + static struct clk_freq_tbl ftbl_gcc_oxili_gfx3d_clk_8917[] = { F_SLEW( 19200000, FIXED_CLK_SRC, xo, 1, 0, 0), F_SLEW( 50000000, FIXED_CLK_SRC, gpll0, 16, 0, 0), @@ -4375,9 +4396,17 @@ static int msm_gcc_probe(struct platform_device *pdev) override_for_8937(speed_bin); if (compat_bin3) { - gfx3d_clk_src.freq_tbl = + if (speed_bin) { + gfx3d_clk_src.freq_tbl = + ftbl_gcc_oxili_gfx3d_clk_8940_500MHz; + gfx3d_clk_src.c.fmax[VDD_DIG_SUPER_TUR] = + 500000000; + } else { + gfx3d_clk_src.freq_tbl = ftbl_gcc_oxili_gfx3d_clk_8937_475MHz; - gfx3d_clk_src.c.fmax[VDD_DIG_SUPER_TUR] = 475000000; + gfx3d_clk_src.c.fmax[VDD_DIG_SUPER_TUR] = + 475000000; + } } } else if (compat_bin2 || compat_bin4) { gpll0_clk_src.c.parent = &gpll0_clk_src_8937.c; From f8742c63c8a1107438c2617f6e128a36bc44bd1b Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Mon, 10 Oct 2016 13:07:35 +0530 Subject: [PATCH 0241/1015] ARM: dts: msm: Add GPU fmax support for MSM8940 MSM8940 can support GPU fmax 500Mhz, add this new GPU fmax support for MSM8940 speed-bin variants. CRs-Fixed: 1078615 Change-Id: I11a7add1addd60bb31a2366e46f1e197276026f9 Signed-off-by: Hareesh Gundu --- arch/arm/boot/dts/qcom/msm8940.dtsi | 211 +++++++++++++++++++--------- 1 file changed, 147 insertions(+), 64 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index 93e5bdbcf0c9a..cf2535600cfe7 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -330,80 +330,163 @@ /* GPU overrides */ &msm_gpu { - /delete-property/qcom,initial-pwrlevel; - qcom,initial-pwrlevel = <3>; + /delete-property/qcom,gpu-speed-bin; + qcom,gpu-speed-bin = <0x0174 0x80000000 31>; + /delete-property/qcom,initial-pwrlevel; /delete-node/qcom,gpu-pwrlevel-bins; /delete-node/qcom,gpu-pwrlevels; - /* Power levels */ - qcom,gpu-pwrlevels { + + qcom,gpu-pwrlevel-bins { #address-cells = <1>; #size-cells = <0>; - compatible = "qcom,gpu-pwrlevels"; - - /* SUPER TURBO */ - qcom,gpu-pwrlevel@0 { - reg = <0>; - qcom,gpu-freq = <475000000>; - qcom,bus-freq = <10>; - qcom,bus-min = <10>; - qcom,bus-max = <10>; + compatible="qcom,gpu-pwrlevel-bins"; + + /* Power levels */ + qcom,gpu-pwrlevels-0 { + #address-cells = <1>; + #size-cells = <0>; + + qcom,speed-bin = <0>; + qcom,initial-pwrlevel = <3>; + + /* SUPER TURBO */ + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <475000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <10>; + qcom,bus-max = <10>; + }; + + /* TURBO */ + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <450000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <9>; + qcom,bus-max = <10>; + }; + + /* NOM+ */ + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <400000000>; + qcom,bus-freq = <7>; + qcom,bus-min = <6>; + qcom,bus-max = <9>; + }; + + /* NOM */ + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <375000000>; + qcom,bus-freq = <6>; + qcom,bus-min = <5>; + qcom,bus-max = <8>; + }; + + /* SVS+ */ + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <300000000>; + qcom,bus-freq = <5>; + qcom,bus-min = <4>; + qcom,bus-max = <7>; + }; + + /* SVS */ + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <216000000>; + qcom,bus-freq = <3>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + + /* XO */ + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <19200000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + qcom,bus-max = <0>; + }; }; - /* TURBO */ - qcom,gpu-pwrlevel@1 { - reg = <1>; - qcom,gpu-freq = <450000000>; - qcom,bus-freq = <9>; - qcom,bus-min = <9>; - qcom,bus-max = <10>; + /* Power levels */ + qcom,gpu-pwrlevels-1 { + #address-cells = <1>; + #size-cells = <0>; + + qcom,speed-bin = <1>; + qcom,initial-pwrlevel = <3>; + + /* SUPER TURBO */ + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <500000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <10>; + qcom,bus-max = <10>; + }; + + /* TURBO */ + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <450000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <9>; + qcom,bus-max = <10>; + }; + + /* NOM+ */ + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <400000000>; + qcom,bus-freq = <7>; + qcom,bus-min = <6>; + qcom,bus-max = <9>; + }; + + /* NOM */ + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <375000000>; + qcom,bus-freq = <6>; + qcom,bus-min = <5>; + qcom,bus-max = <8>; + }; + + /* SVS+ */ + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <300000000>; + qcom,bus-freq = <5>; + qcom,bus-min = <4>; + qcom,bus-max = <7>; + }; + + /* SVS */ + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <216000000>; + qcom,bus-freq = <3>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + + /* XO */ + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <19200000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + qcom,bus-max = <0>; + }; }; - /* NOM+ */ - qcom,gpu-pwrlevel@2 { - reg = <2>; - qcom,gpu-freq = <400000000>; - qcom,bus-freq = <7>; - qcom,bus-min = <6>; - qcom,bus-max = <9>; - }; - - /* NOM */ - qcom,gpu-pwrlevel@3 { - reg = <3>; - qcom,gpu-freq = <375000000>; - qcom,bus-freq = <6>; - qcom,bus-min = <5>; - qcom,bus-max = <8>; - }; - - /* SVS+ */ - qcom,gpu-pwrlevel@4 { - reg = <4>; - qcom,gpu-freq = <300000000>; - qcom,bus-freq = <5>; - qcom,bus-min = <4>; - qcom,bus-max = <7>; - }; - - /* SVS */ - qcom,gpu-pwrlevel@5 { - reg = <5>; - qcom,gpu-freq = <216000000>; - qcom,bus-freq = <3>; - qcom,bus-min = <1>; - qcom,bus-max = <4>; - }; - - /* XO */ - qcom,gpu-pwrlevel@6 { - reg = <6>; - qcom,gpu-freq = <19200000>; - qcom,bus-freq = <0>; - qcom,bus-min = <0>; - qcom,bus-max = <0>; - }; }; }; From d05331c1827c9c23e523962ed5462710e5e40643 Mon Sep 17 00:00:00 2001 From: Harshdeep Dhatt Date: Fri, 2 Sep 2016 10:48:58 -0600 Subject: [PATCH 0242/1015] msm: kgsl: Add and link gpu sysfs nodes Add new sysfs nodes which satisfy a generic format requested by customer. Also add a new node to track GPU temperature. Create links to these nodes at a generic location: /sys/kernel/gpu/ CRs-Fixed: 1064728 Change-Id: I414a07ff4f9ee14b8f882d15644b06a73d5fcf76 Signed-off-by: Harshdeep Dhatt Signed-off-by: Sunil Khatri --- .../devicetree/bindings/gpu/adreno.txt | 4 + drivers/gpu/msm/adreno.c | 13 + drivers/gpu/msm/kgsl.h | 15 + drivers/gpu/msm/kgsl_device.h | 3 + drivers/gpu/msm/kgsl_pwrctrl.c | 350 ++++++++++++++++-- drivers/gpu/msm/kgsl_pwrctrl.h | 2 + drivers/gpu/msm/kgsl_pwrscale.c | 8 + 7 files changed, 355 insertions(+), 40 deletions(-) diff --git a/Documentation/devicetree/bindings/gpu/adreno.txt b/Documentation/devicetree/bindings/gpu/adreno.txt index df1004161c604..abb66d6710b6b 100644 --- a/Documentation/devicetree/bindings/gpu/adreno.txt +++ b/Documentation/devicetree/bindings/gpu/adreno.txt @@ -148,6 +148,10 @@ Optional Properties: baseAddr - base address of the gpu channels in the qdss stm memory region size - size of the gpu stm region +- qcom,tsens-name: + Specify the name of GPU temperature sensor. This name will be used + to get the temperature from the thermal driver API. + GPU Quirks: - qcom,gpu-quirk-two-pass-use-wfi: Signal the GPU to set Set TWOPASSUSEWFI bit in diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 3e0153cd7b9ae..bcd35cd2f4ec0 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -2777,6 +2777,18 @@ static void adreno_regulator_disable_poll(struct kgsl_device *device) adreno_iommu_sync(device, false); } +static void adreno_gpu_model(struct kgsl_device *device, char *str, + size_t bufsz) +{ + struct adreno_device *adreno_dev = ADRENO_DEVICE(device); + + snprintf(str, bufsz, "Adreno%d%d%dv%d", + ADRENO_CHIPID_CORE(adreno_dev->chipid), + ADRENO_CHIPID_MAJOR(adreno_dev->chipid), + ADRENO_CHIPID_MINOR(adreno_dev->chipid), + ADRENO_CHIPID_PATCH(adreno_dev->chipid) + 1); +} + static const struct kgsl_functable adreno_functable = { /* Mandatory functions */ .regread = adreno_regread, @@ -2813,6 +2825,7 @@ static const struct kgsl_functable adreno_functable = { .regulator_disable = adreno_regulator_disable, .pwrlevel_change_settings = adreno_pwrlevel_change_settings, .regulator_disable_poll = adreno_regulator_disable_poll, + .gpu_model = adreno_gpu_model, }; static struct platform_driver adreno_platform_driver = { diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index ee7149e1fd41c..4c46af637f63c 100644 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -542,4 +542,19 @@ static inline void __user *to_user_ptr(uint64_t address) return (void __user *)(uintptr_t)address; } +static inline void kgsl_gpu_sysfs_add_link(struct kobject *dst, + struct kobject *src, const char *src_name, + const char *dst_name) +{ + struct kernfs_node *old; + + if (dst == NULL || src == NULL) + return; + + old = sysfs_get_dirent(src->sd, src_name); + if (IS_ERR_OR_NULL(old)) + return; + + kernfs_create_link(dst->sd, dst_name, old); +} #endif /* __KGSL_H */ diff --git a/drivers/gpu/msm/kgsl_device.h b/drivers/gpu/msm/kgsl_device.h index 8d7185f6b1cba..6240015f0e3c6 100644 --- a/drivers/gpu/msm/kgsl_device.h +++ b/drivers/gpu/msm/kgsl_device.h @@ -169,6 +169,8 @@ struct kgsl_functable { void (*pwrlevel_change_settings)(struct kgsl_device *device, unsigned int prelevel, unsigned int postlevel, bool post); void (*regulator_disable_poll)(struct kgsl_device *device); + void (*gpu_model)(struct kgsl_device *device, char *str, + size_t bufsz); }; struct kgsl_ioctl { @@ -284,6 +286,7 @@ struct kgsl_device { /* Number of active contexts seen globally for this device */ int active_context_count; + struct kobject *gpu_sysfs_kobj; }; #define KGSL_MMU_DEVICE(_mmu) \ diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c index 23af2b9a6b487..88c6eb25b3a5f 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.c +++ b/drivers/gpu/msm/kgsl_pwrctrl.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "kgsl.h" #include "kgsl_pwrscale.h" @@ -574,22 +575,10 @@ static ssize_t kgsl_pwrctrl_max_pwrlevel_show(struct device *dev, return snprintf(buf, PAGE_SIZE, "%u\n", pwr->max_pwrlevel); } -static ssize_t kgsl_pwrctrl_min_pwrlevel_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ struct kgsl_device *device = kgsl_device_from_dev(dev); - struct kgsl_pwrctrl *pwr; - int ret; - unsigned int level = 0; - - if (device == NULL) - return 0; - - pwr = &device->pwrctrl; - - ret = kgsl_sysfs_store(buf, &level); - if (ret) - return ret; +static void kgsl_pwrctrl_min_pwrlevel_set(struct kgsl_device *device, + int level) +{ + struct kgsl_pwrctrl *pwr = &device->pwrctrl; mutex_lock(&device->mutex); if (level > pwr->num_pwrlevels - 2) @@ -605,6 +594,24 @@ static ssize_t kgsl_pwrctrl_min_pwrlevel_store(struct device *dev, kgsl_pwrctrl_pwrlevel_change(device, pwr->active_pwrlevel); mutex_unlock(&device->mutex); +} + +static ssize_t kgsl_pwrctrl_min_pwrlevel_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + int ret; + unsigned int level = 0; + + if (device == NULL) + return 0; + + ret = kgsl_sysfs_store(buf, &level); + if (ret) + return ret; + + kgsl_pwrctrl_min_pwrlevel_set(device, level); return count; } @@ -648,24 +655,13 @@ static int _get_nearest_pwrlevel(struct kgsl_pwrctrl *pwr, unsigned int clock) return -ERANGE; } -static ssize_t kgsl_pwrctrl_max_gpuclk_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) +static void kgsl_pwrctrl_max_clock_set(struct kgsl_device *device, int val) { - struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr; - unsigned int val = 0; - int level, ret; - - if (device == NULL) - return 0; + int level; pwr = &device->pwrctrl; - ret = kgsl_sysfs_store(buf, &val); - if (ret) - return ret; - mutex_lock(&device->mutex); level = _get_nearest_pwrlevel(pwr, val); /* If the requested power level is not supported by hw, try cycling */ @@ -699,21 +695,37 @@ static ssize_t kgsl_pwrctrl_max_gpuclk_store(struct device *dev, if (pwr->sysfs_pwr_limit) kgsl_pwr_limits_set_freq(pwr->sysfs_pwr_limit, pwr->pwrlevels[level].gpu_freq); - return count; + return; err: mutex_unlock(&device->mutex); - return count; } -static ssize_t kgsl_pwrctrl_max_gpuclk_show(struct device *dev, - struct device_attribute *attr, - char *buf) +static ssize_t kgsl_pwrctrl_max_gpuclk_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) { - struct kgsl_device *device = kgsl_device_from_dev(dev); + unsigned int val = 0; + int ret; + + if (device == NULL) + return 0; + + ret = kgsl_sysfs_store(buf, &val); + if (ret) + return ret; + + kgsl_pwrctrl_max_clock_set(device, val); + + return count; +} + +static unsigned int kgsl_pwrctrl_max_clock_get(struct kgsl_device *device) +{ struct kgsl_pwrctrl *pwr; unsigned int freq; + if (device == NULL) return 0; pwr = &device->pwrctrl; @@ -727,7 +739,17 @@ static ssize_t kgsl_pwrctrl_max_gpuclk_show(struct device *dev, (TH_HZ - pwr->thermal_timeout) * (hfreq / TH_HZ); } - return snprintf(buf, PAGE_SIZE, "%d\n", freq); + return freq; +} + +static ssize_t kgsl_pwrctrl_max_gpuclk_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + + return snprintf(buf, PAGE_SIZE, "%d\n", + kgsl_pwrctrl_max_clock_get(device)); } static ssize_t kgsl_pwrctrl_gpuclk_store(struct device *dev, @@ -910,9 +932,14 @@ static ssize_t kgsl_pwrctrl_gpu_available_frequencies_show( if (device == NULL) return 0; pwr = &device->pwrctrl; - for (index = 0; index < pwr->num_pwrlevels - 1; index++) - num_chars += snprintf(buf + num_chars, PAGE_SIZE, "%d ", - pwr->pwrlevels[index].gpu_freq); + for (index = 0; index < pwr->num_pwrlevels - 1; index++) { + num_chars += scnprintf(buf + num_chars, + PAGE_SIZE - num_chars - 1, + "%d ", pwr->pwrlevels[index].gpu_freq); + /* One space for trailing null and another for the newline */ + if (num_chars >= PAGE_SIZE - 2) + break; + } buf[num_chars++] = '\n'; return num_chars; } @@ -1222,6 +1249,196 @@ static ssize_t kgsl_pwrctrl_pwrscale_show(struct device *dev, return snprintf(buf, PAGE_SIZE, "%u\n", psc->enabled); } +static ssize_t kgsl_pwrctrl_gpu_model_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + char model_str[32] = {0}; + + if (device == NULL) + return 0; + + device->ftbl->gpu_model(device, model_str, sizeof(model_str)); + + return snprintf(buf, PAGE_SIZE, "%s\n", model_str); +} + +static ssize_t kgsl_pwrctrl_gpu_busy_percentage_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + int ret; + struct kgsl_device *device = kgsl_device_from_dev(dev); + struct kgsl_clk_stats *stats; + unsigned int busy_percent = 0; + + if (device == NULL) + return 0; + stats = &device->pwrctrl.clk_stats; + + if (stats->total_old != 0) + busy_percent = (stats->busy_old * 100) / stats->total_old; + + ret = snprintf(buf, PAGE_SIZE, "%d %%\n", busy_percent); + + /* Reset the stats if GPU is OFF */ + if (!test_bit(KGSL_PWRFLAGS_AXI_ON, &device->pwrctrl.power_flags)) { + stats->busy_old = 0; + stats->total_old = 0; + } + return ret; +} + +static ssize_t kgsl_pwrctrl_min_clock_mhz_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + struct kgsl_pwrctrl *pwr; + + if (device == NULL) + return 0; + pwr = &device->pwrctrl; + + return snprintf(buf, PAGE_SIZE, "%d\n", + pwr->pwrlevels[pwr->min_pwrlevel].gpu_freq / 1000000); +} + +static ssize_t kgsl_pwrctrl_min_clock_mhz_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + int level, ret; + unsigned int freq; + struct kgsl_pwrctrl *pwr; + + if (device == NULL) + return 0; + + pwr = &device->pwrctrl; + + ret = kgsl_sysfs_store(buf, &freq); + if (ret) + return ret; + + freq *= 1000000; + level = _get_nearest_pwrlevel(pwr, freq); + + if (level >= 0) + kgsl_pwrctrl_min_pwrlevel_set(device, level); + + return count; +} + +static ssize_t kgsl_pwrctrl_max_clock_mhz_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + unsigned int freq; + + if (device == NULL) + return 0; + + freq = kgsl_pwrctrl_max_clock_get(device); + + return snprintf(buf, PAGE_SIZE, "%d\n", freq / 1000000); +} + +static ssize_t kgsl_pwrctrl_max_clock_mhz_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + unsigned int val = 0; + int ret; + + if (device == NULL) + return 0; + + ret = kgsl_sysfs_store(buf, &val); + if (ret) + return ret; + + val *= 1000000; + kgsl_pwrctrl_max_clock_set(device, val); + + return count; +} + +static ssize_t kgsl_pwrctrl_clock_mhz_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + + if (device == NULL) + return 0; + + return snprintf(buf, PAGE_SIZE, "%ld\n", + kgsl_pwrctrl_active_freq(&device->pwrctrl) / 1000000); +} + +static ssize_t kgsl_pwrctrl_freq_table_mhz_show( + struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + struct kgsl_pwrctrl *pwr; + int index, num_chars = 0; + + if (device == NULL) + return 0; + + pwr = &device->pwrctrl; + for (index = 0; index < pwr->num_pwrlevels - 1; index++) { + num_chars += scnprintf(buf + num_chars, + PAGE_SIZE - num_chars - 1, + "%d ", pwr->pwrlevels[index].gpu_freq / 1000000); + /* One space for trailing null and another for the newline */ + if (num_chars >= PAGE_SIZE - 2) + break; + } + + buf[num_chars++] = '\n'; + + return num_chars; +} + +static ssize_t kgsl_pwrctrl_temp_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + struct kgsl_pwrctrl *pwr; + int ret, id = 0; + long temperature = 0; + + if (device == NULL) + goto done; + + pwr = &device->pwrctrl; + + if (!pwr->tsens_name) + goto done; + + id = sensor_get_id((char *)pwr->tsens_name); + if (id < 0) + goto done; + + ret = sensor_get_temp(id, &temperature); + if (ret) + goto done; + + return snprintf(buf, PAGE_SIZE, "%ld\n", + temperature); +done: + return 0; +} + static DEVICE_ATTR(gpuclk, 0644, kgsl_pwrctrl_gpuclk_show, kgsl_pwrctrl_gpuclk_store); static DEVICE_ATTR(max_gpuclk, 0644, kgsl_pwrctrl_max_gpuclk_show, @@ -1278,6 +1495,17 @@ static DEVICE_ATTR(force_non_retention_on, 0644, static DEVICE_ATTR(pwrscale, 0644, kgsl_pwrctrl_pwrscale_show, kgsl_pwrctrl_pwrscale_store); +static DEVICE_ATTR(gpu_model, 0444, kgsl_pwrctrl_gpu_model_show, NULL); +static DEVICE_ATTR(gpu_busy_percentage, 0444, + kgsl_pwrctrl_gpu_busy_percentage_show, NULL); +static DEVICE_ATTR(min_clock_mhz, 0644, kgsl_pwrctrl_min_clock_mhz_show, + kgsl_pwrctrl_min_clock_mhz_store); +static DEVICE_ATTR(max_clock_mhz, 0644, kgsl_pwrctrl_max_clock_mhz_show, + kgsl_pwrctrl_max_clock_mhz_store); +static DEVICE_ATTR(clock_mhz, 0444, kgsl_pwrctrl_clock_mhz_show, NULL); +static DEVICE_ATTR(freq_table_mhz, 0444, + kgsl_pwrctrl_freq_table_mhz_show, NULL); +static DEVICE_ATTR(temp, 0444, kgsl_pwrctrl_temp_show, NULL); static const struct device_attribute *pwrctrl_attr_list[] = { &dev_attr_gpuclk, @@ -1301,12 +1529,50 @@ static const struct device_attribute *pwrctrl_attr_list[] = { &dev_attr_default_pwrlevel, &dev_attr_popp, &dev_attr_pwrscale, + &dev_attr_gpu_model, + &dev_attr_gpu_busy_percentage, + &dev_attr_min_clock_mhz, + &dev_attr_max_clock_mhz, + &dev_attr_clock_mhz, + &dev_attr_freq_table_mhz, + &dev_attr_temp, NULL }; +struct sysfs_link { + const char *src; + const char *dst; +}; + +static struct sysfs_link link_names[] = { + { "gpu_model", "gpu_model",}, + { "gpu_busy_percentage", "gpu_busy",}, + { "min_clock_mhz", "gpu_min_clock",}, + { "max_clock_mhz", "gpu_max_clock",}, + { "clock_mhz", "gpu_clock",}, + { "freq_table_mhz", "gpu_freq_table",}, + { "temp", "gpu_tmu",}, +}; + int kgsl_pwrctrl_init_sysfs(struct kgsl_device *device) { - return kgsl_create_device_sysfs_files(device->dev, pwrctrl_attr_list); + int i, ret; + + ret = kgsl_create_device_sysfs_files(device->dev, pwrctrl_attr_list); + if (ret) + return ret; + + device->gpu_sysfs_kobj = kobject_create_and_add("gpu", kernel_kobj); + if (IS_ERR_OR_NULL(device->gpu_sysfs_kobj)) + return (device->gpu_sysfs_kobj == NULL) ? + -ENOMEM : PTR_ERR(device->gpu_sysfs_kobj); + + for (i = 0; i < ARRAY_SIZE(link_names); i++) + kgsl_gpu_sysfs_add_link(device->gpu_sysfs_kobj, + &device->dev->kobj, link_names[i].src, + link_names[i].dst); + + return 0; } void kgsl_pwrctrl_uninit_sysfs(struct kgsl_device *device) @@ -1926,6 +2192,10 @@ int kgsl_pwrctrl_init(struct kgsl_device *device) (unsigned long) device); devfreq_vbif_register_callback(kgsl_get_bw); + /* temperature sensor name */ + of_property_read_string(pdev->dev.of_node, "qcom,tsens-name", + &pwr->tsens_name); + return result; } diff --git a/drivers/gpu/msm/kgsl_pwrctrl.h b/drivers/gpu/msm/kgsl_pwrctrl.h index a99fd4d3e1154..5f8bb88c6adbc 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.h +++ b/drivers/gpu/msm/kgsl_pwrctrl.h @@ -154,6 +154,7 @@ struct kgsl_regulator { * @deep_nap_timer - Timer struct for entering deep nap * @deep_nap_timeout - Timeout for entering deep nap * @gx_retention - true if retention voltage is allowed + * @tsens_name - pointer to temperature sensor name of GPU temperature sensor */ struct kgsl_pwrctrl { @@ -209,6 +210,7 @@ struct kgsl_pwrctrl { bool gx_retention; unsigned int gpu_bimc_int_clk_freq; bool gpu_bimc_interface_enabled; + const char *tsens_name; }; int kgsl_pwrctrl_init(struct kgsl_device *device); diff --git a/drivers/gpu/msm/kgsl_pwrscale.c b/drivers/gpu/msm/kgsl_pwrscale.c index f79bb08f3e672..1d0c72a66e16a 100644 --- a/drivers/gpu/msm/kgsl_pwrscale.c +++ b/drivers/gpu/msm/kgsl_pwrscale.c @@ -876,6 +876,14 @@ int kgsl_pwrscale_init(struct device *dev, const char *governor) pwrscale->history[i].type = i; } + /* Add links to the devfreq sysfs nodes */ + kgsl_gpu_sysfs_add_link(device->gpu_sysfs_kobj, + &pwrscale->devfreqptr->dev.kobj, "governor", + "gpu_governor"); + kgsl_gpu_sysfs_add_link(device->gpu_sysfs_kobj, + &pwrscale->devfreqptr->dev.kobj, + "available_governors", "gpu_available_governor"); + return 0; } EXPORT_SYMBOL(kgsl_pwrscale_init); From 820297c3a91ef9ae2d42eb1f8c1b3989789261c3 Mon Sep 17 00:00:00 2001 From: Sunil Khatri Date: Fri, 7 Oct 2016 15:08:05 +0530 Subject: [PATCH 0243/1015] ARM: dts: msm: Specify the temperature sensor name for msm8996 Specify the name of GPU temperature sensor in the device tree. This name is used to get the sensor's temperature by querying the thermal driver API. CRs-Fixed: 1064728 Change-Id: Ia93d93a442aa848cbd42a5fb8ecad5ef875f9abf Signed-off-by: Harshdeep Dhatt Signed-off-by: Sunil Khatri --- arch/arm/boot/dts/qcom/msm8996-gpu.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/boot/dts/qcom/msm8996-gpu.dtsi b/arch/arm/boot/dts/qcom/msm8996-gpu.dtsi index 07423a601b35c..868c5eea1fdb7 100644 --- a/arch/arm/boot/dts/qcom/msm8996-gpu.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-gpu.dtsi @@ -81,6 +81,7 @@ qcom,gpu-qdss-stm = <0x081c0000 0x40000>; // base addr, size + qcom,tsens-name = "tsens_tz_sensor14"; /* Trace bus */ coresight-id = <300>; coresight-name = "coresight-gfx"; From babc69ead489fa27e9a5e005628b2059e89b752b Mon Sep 17 00:00:00 2001 From: Devesh Jhunjhunwala Date: Fri, 26 Aug 2016 16:36:28 -0700 Subject: [PATCH 0244/1015] leds: qpnp-wled: Fix configuration of ovp register The OVP register should not be configured based on the ovp-mv device tree property if the disp-type-amoled property is specified. Add a check to fix this. CRs-Fixed: 1061297 Change-Id: Ibe42d1379af4f75377aec10eaa7bbaa1b4607605 Signed-off-by: Devesh Jhunjhunwala Signed-off-by: Subbaraman Narayanamurthy --- .../bindings/leds/leds-qpnp-wled.txt | 3 +- drivers/leds/leds-qpnp-wled.c | 53 +++++++++---------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/Documentation/devicetree/bindings/leds/leds-qpnp-wled.txt b/Documentation/devicetree/bindings/leds/leds-qpnp-wled.txt index 14066d613f0e6..be46d708a6ecf 100644 --- a/Documentation/devicetree/bindings/leds/leds-qpnp-wled.txt +++ b/Documentation/devicetree/bindings/leds/leds-qpnp-wled.txt @@ -25,7 +25,8 @@ Optional properties for WLED: are "wled1", "wled2", "wled3", "wled4" and "auto". default is "auto". - qcom,vref-mv : maximum reference voltage in mv. default is 350. - qcom,switch-freq-khz : switch frequency in khz. default is 800. -- qcom,ovp-mv : over voltage protection value in mv. default is 17800. +- qcom,ovp-mv : Over voltage protection threshold in mV. Default is + 29500. - qcom,ilim-ma : maximum current limiter in ma. default is 980. - qcom,boost-duty-ns : maximum boost duty cycle in ns. default is 104. - qcom,mod-freq-khz : modulation frequency in khz. default is 9600. diff --git a/drivers/leds/leds-qpnp-wled.c b/drivers/leds/leds-qpnp-wled.c index 9fcee2a9bc6dd..06b80c8d312f5 100644 --- a/drivers/leds/leds-qpnp-wled.c +++ b/drivers/leds/leds-qpnp-wled.c @@ -94,7 +94,7 @@ #define QPNP_WLED_SWITCH_FREQ_800_KHZ 800 #define QPNP_WLED_SWITCH_FREQ_1600_KHZ 1600 #define QPNP_WLED_SWITCH_FREQ_OVERWRITE 0x80 -#define QPNP_WLED_OVP_MASK 0xFC +#define QPNP_WLED_OVP_MASK GENMASK(1, 0) #define QPNP_WLED_OVP_17800_MV 17800 #define QPNP_WLED_OVP_19400_MV 19400 #define QPNP_WLED_OVP_29500_MV 29500 @@ -1100,31 +1100,28 @@ static int qpnp_wled_config(struct qpnp_wled *wled) if (rc) return rc; - /* Configure the OVP register */ - if (wled->ovp_mv <= QPNP_WLED_OVP_17800_MV) { - wled->ovp_mv = QPNP_WLED_OVP_17800_MV; - temp = 3; - } else if (wled->ovp_mv <= QPNP_WLED_OVP_19400_MV) { - wled->ovp_mv = QPNP_WLED_OVP_19400_MV; - temp = 2; - } else if (wled->ovp_mv <= QPNP_WLED_OVP_29500_MV) { - wled->ovp_mv = QPNP_WLED_OVP_29500_MV; - temp = 1; - } else { - wled->ovp_mv = QPNP_WLED_OVP_31000_MV; - temp = 0; - } + /* Configure the OVP register only if display type is not AMOLED */ + if (!wled->disp_type_amoled) { + if (wled->ovp_mv <= QPNP_WLED_OVP_17800_MV) { + wled->ovp_mv = QPNP_WLED_OVP_17800_MV; + temp = 3; + } else if (wled->ovp_mv <= QPNP_WLED_OVP_19400_MV) { + wled->ovp_mv = QPNP_WLED_OVP_19400_MV; + temp = 2; + } else if (wled->ovp_mv <= QPNP_WLED_OVP_29500_MV) { + wled->ovp_mv = QPNP_WLED_OVP_29500_MV; + temp = 1; + } else { + wled->ovp_mv = QPNP_WLED_OVP_31000_MV; + temp = 0; + } - rc = qpnp_wled_read_reg(wled, ®, - QPNP_WLED_OVP_REG(wled->ctrl_base)); - if (rc < 0) - return rc; - reg &= QPNP_WLED_OVP_MASK; - reg |= temp; - rc = qpnp_wled_write_reg(wled, ®, - QPNP_WLED_OVP_REG(wled->ctrl_base)); - if (rc) - return rc; + reg = (u8)temp; + rc = qpnp_wled_masked_write_reg(wled, QPNP_WLED_OVP_MASK, ®, + QPNP_WLED_OVP_REG(wled->ctrl_base)); + if (rc) + return rc; + } rc = qpnp_wled_read_reg(wled, ®, QPNP_WLED_CTRL_SPARE_REG(wled->ctrl_base)); @@ -1150,8 +1147,8 @@ static int qpnp_wled_config(struct qpnp_wled *wled) /* Update WLED_OVP register based on desired target voltage */ reg = qpnp_wled_ovp_reg_settings[i]; - rc = qpnp_wled_write_reg(wled, ®, - QPNP_WLED_OVP_REG(wled->ctrl_base)); + rc = qpnp_wled_masked_write_reg(wled, QPNP_WLED_OVP_MASK, ®, + QPNP_WLED_OVP_REG(wled->ctrl_base)); if (rc) return rc; @@ -1574,7 +1571,7 @@ static int qpnp_wled_parse_dt(struct qpnp_wled *wled) if (!rc) { wled->ovp_mv = temp_val; } else if (rc != -EINVAL) { - dev_err(&spmi->dev, "Unable to read vref\n"); + dev_err(&spmi->dev, "Unable to read ovp\n"); return rc; } From 964ecdd9c1cc3d1e76a52c5ada26b5e38d9254be Mon Sep 17 00:00:00 2001 From: Raviteja Tamatam Date: Thu, 29 Sep 2016 15:33:59 +0530 Subject: [PATCH 0245/1015] msm: mdss: Allow mdss driver to carry more lazy buffers SMMU Virtulization limit depends on the page table format for a 32bit table we can have 4GB as a limit. Increase the virtual map range for mdss driver so that it can allow more lazy buffers to be mapped. This will help in cases where apps which are queued once to display and are parked in background. Change-Id: I08f8cbff267630f0ade33299762c4900c04f611b Signed-off-by: Raviteja Tamatam --- drivers/video/msm/mdss/mdss_smmu.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_smmu.c b/drivers/video/msm/mdss/mdss_smmu.c index 4a99cf5cc5b3a..3ad9e6c6ed424 100644 --- a/drivers/video/msm/mdss/mdss_smmu.c +++ b/drivers/video/msm/mdss/mdss_smmu.c @@ -36,6 +36,8 @@ #include "mdss_smmu.h" #include "mdss_debug.h" +#define SZ_4G 0xF0000000 + static DEFINE_MUTEX(mdp_iommu_lock); void mdss_iommu_lock(void) @@ -537,13 +539,13 @@ int mdss_smmu_init(struct mdss_data_type *mdata, struct device *dev) } static struct mdss_smmu_domain mdss_mdp_unsec = { - "mdp_0", MDSS_IOMMU_DOMAIN_UNSECURE, SZ_128K, (SZ_1G - SZ_128K)}; + "mdp_0", MDSS_IOMMU_DOMAIN_UNSECURE, SZ_128K, (SZ_4G - SZ_128K)}; static struct mdss_smmu_domain mdss_rot_unsec = { - NULL, MDSS_IOMMU_DOMAIN_ROT_UNSECURE, SZ_128K, (SZ_1G - SZ_128K)}; + NULL, MDSS_IOMMU_DOMAIN_ROT_UNSECURE, SZ_128K, (SZ_4G - SZ_128K)}; static struct mdss_smmu_domain mdss_mdp_sec = { - "mdp_1", MDSS_IOMMU_DOMAIN_SECURE, SZ_1G, SZ_2G}; + "mdp_1", MDSS_IOMMU_DOMAIN_SECURE, SZ_128K, (SZ_4G - SZ_128K)}; static struct mdss_smmu_domain mdss_rot_sec = { - NULL, MDSS_IOMMU_DOMAIN_ROT_SECURE, SZ_1G, SZ_2G}; + NULL, MDSS_IOMMU_DOMAIN_ROT_SECURE, SZ_128K, (SZ_4G - SZ_128K)}; static const struct of_device_id mdss_smmu_dt_match[] = { { .compatible = "qcom,smmu_mdp_unsec", .data = &mdss_mdp_unsec}, From f3e56f7b7dca02bb2b18010dbd0d877ef386e9f6 Mon Sep 17 00:00:00 2001 From: Samyukta Mogily Date: Wed, 12 Oct 2016 18:13:50 +0530 Subject: [PATCH 0246/1015] msm: camera: Fixing NULL dereference in sensor code Fixing issue where we are referring to a null pointer. Changing the if condition so that it does not access the varibale when it is null. Change-Id: I2f96cd0d301f580c0e7019746bade4e125661a36 CRs-Fixed: 1076948 Signed-off-by: Samyukta Mogily --- .../msm/camera_v2/sensor/msm_sensor_driver.c | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c index 80380fe8c399c..16cacecb8ae59 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c @@ -1232,16 +1232,18 @@ static int32_t msm_sensor_driver_i2c_probe(struct i2c_client *client, if (s_ctrl->sensor_i2c_client != NULL) { s_ctrl->sensor_i2c_client->client = client; s_ctrl->sensordata->power_info.dev = &client->dev; - } - /* Get clocks information */ - rc = msm_camera_i2c_dev_get_clk_info( - &s_ctrl->sensor_i2c_client->client->dev, - &s_ctrl->sensordata->power_info.clk_info, - &s_ctrl->sensordata->power_info.clk_ptr, - &s_ctrl->sensordata->power_info.clk_info_size); - if (rc < 0) { - pr_err("failed: msm_camera_i2c_dev_get_clk_info rc %d", rc); - goto FREE_S_CTRL; + + /* Get clocks information */ + rc = msm_camera_i2c_dev_get_clk_info( + &s_ctrl->sensor_i2c_client->client->dev, + &s_ctrl->sensordata->power_info.clk_info, + &s_ctrl->sensordata->power_info.clk_ptr, + &s_ctrl->sensordata->power_info.clk_info_size); + if (rc < 0) { + pr_err("failed: msm_camera_i2c_dev_get_clk_info rc %d", + rc); + goto FREE_S_CTRL; + } } return rc; FREE_S_CTRL: From 5e2346244aaf2c85abdfeb320ce790381ee03e46 Mon Sep 17 00:00:00 2001 From: Samyukta Mogily Date: Wed, 12 Oct 2016 18:13:50 +0530 Subject: [PATCH 0247/1015] msm: camera: Fixing NULL dereference in sensor code Fixing issue where we are referring to a null pointer. Changing the if condition so that it does not access the varibale when it is null. Change-Id: I2f96cd0d301f580c0e7019746bade4e125661a36 CRs-Fixed: 1076948 Signed-off-by: Samyukta Mogily --- .../msm/camera_v2/sensor/msm_sensor_driver.c | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c index 80380fe8c399c..16cacecb8ae59 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c @@ -1232,16 +1232,18 @@ static int32_t msm_sensor_driver_i2c_probe(struct i2c_client *client, if (s_ctrl->sensor_i2c_client != NULL) { s_ctrl->sensor_i2c_client->client = client; s_ctrl->sensordata->power_info.dev = &client->dev; - } - /* Get clocks information */ - rc = msm_camera_i2c_dev_get_clk_info( - &s_ctrl->sensor_i2c_client->client->dev, - &s_ctrl->sensordata->power_info.clk_info, - &s_ctrl->sensordata->power_info.clk_ptr, - &s_ctrl->sensordata->power_info.clk_info_size); - if (rc < 0) { - pr_err("failed: msm_camera_i2c_dev_get_clk_info rc %d", rc); - goto FREE_S_CTRL; + + /* Get clocks information */ + rc = msm_camera_i2c_dev_get_clk_info( + &s_ctrl->sensor_i2c_client->client->dev, + &s_ctrl->sensordata->power_info.clk_info, + &s_ctrl->sensordata->power_info.clk_ptr, + &s_ctrl->sensordata->power_info.clk_info_size); + if (rc < 0) { + pr_err("failed: msm_camera_i2c_dev_get_clk_info rc %d", + rc); + goto FREE_S_CTRL; + } } return rc; FREE_S_CTRL: From d8df21b7d649672aa151036fcfab3dd3fe11d237 Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Fri, 21 Oct 2016 12:18:50 +0530 Subject: [PATCH 0248/1015] msm: mdss: hdmi: fix uninitialized pointer issue in HDCP driver Fix an issue related to an uninitialized pointer. Under certain conditions, it is possible that the driver tries to free memory whose reference is supposed to be held by this pointer and can lead to a crash since the pointer doesn't hold a valid reference. Change-Id: Ic2e16e1d67bc881bd2ae6d00a51ba12835c7a4f7 Signed-off-by: Padmanabhan Komanduru --- drivers/misc/hdcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/misc/hdcp.c b/drivers/misc/hdcp.c index 18fd4c2a9a31e..6f293e3a529d9 100644 --- a/drivers/misc/hdcp.c +++ b/drivers/misc/hdcp.c @@ -1193,7 +1193,7 @@ static void hdcp_lib_msg_recvd(struct hdcp_lib_handle *handle) struct hdcp_rcvd_msg_req *req_buf; struct hdcp_rcvd_msg_rsp *rsp_buf; uint32_t msglen; - char *msg; + char *msg = NULL; if (!handle || !handle->qseecom_handle || !handle->qseecom_handle->sbuf) { From b87c99da93f345fd1975201f801639fd18403384 Mon Sep 17 00:00:00 2001 From: Smriti Gupta Date: Fri, 23 Sep 2016 14:53:13 +0530 Subject: [PATCH 0249/1015] radio: initialize spacing to default value. Initialize spacing to default value 0 to avoid undefined behaviour in some code branches. Change-Id: I072e507b005236a4d08fa192135b37e32780d59c CRs-fixed: 1070487 Signed-off-by: Smriti Gupta Signed-off-by: Rupesh Tatiya --- drivers/media/radio/radio-iris.c | 8 ++++++-- drivers/media/radio/silabs/radio-silabs.c | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/media/radio/radio-iris.c b/drivers/media/radio/radio-iris.c index f2b430946e899..b3088eb9f5f43 100644 --- a/drivers/media/radio/radio-iris.c +++ b/drivers/media/radio/radio-iris.c @@ -628,11 +628,15 @@ int radio_hci_unregister_dev(void) struct iris_device *radio = video_get_drvdata(video_get_dev()); struct radio_hci_dev *hdev = NULL; - if (!radio && !radio->fm_hdev) { - FMDERR("radio/hdev is null"); + if (!radio) { + FMDERR("radio is null"); return -EINVAL; } hdev = radio->fm_hdev; + if (!hdev) { + FMDERR("hdev is null"); + return -EINVAL; + } tasklet_kill(&hdev->rx_task); tasklet_kill(&hdev->cmd_task); diff --git a/drivers/media/radio/silabs/radio-silabs.c b/drivers/media/radio/silabs/radio-silabs.c index af2e74688aa9f..53d557b53ad2c 100644 --- a/drivers/media/radio/silabs/radio-silabs.c +++ b/drivers/media/radio/silabs/radio-silabs.c @@ -1357,7 +1357,7 @@ static bool is_valid_freq(struct silabs_fm_device *radio, u32 freq) { u32 band_low_limit = radio->recv_conf.band_low_limit * TUNE_STEP_SIZE; u32 band_high_limit = radio->recv_conf.band_high_limit * TUNE_STEP_SIZE; - u8 spacing; + u8 spacing = 0; if (radio->recv_conf.ch_spacing == 0) spacing = CH_SPACING_200; @@ -1365,6 +1365,8 @@ static bool is_valid_freq(struct silabs_fm_device *radio, u32 freq) spacing = CH_SPACING_100; else if (radio->recv_conf.ch_spacing == 2) spacing = CH_SPACING_50; + else + return false; if ((freq >= band_low_limit) && (freq <= band_high_limit) && From a71cae94959c75399f51639bf5877dcad3c263bf Mon Sep 17 00:00:00 2001 From: Samyukta Mogily Date: Thu, 22 Sep 2016 16:37:46 +0530 Subject: [PATCH 0250/1015] ARM: dts: msm: Enable csiphy clk in csid for msm8937 and msm8953 Enable the csiphy clk in csid such that the csiphy clk initialization does not fail if a different csid core is initialized. CRs-Fixed: 1068576 Change-Id: Ice50cf8147fbfc1ee9bddb779678add6a5d08bbd Signed-off-by: Samyukta Mogily --- arch/arm/boot/dts/qcom/msm8937-camera.dtsi | 24 +++++++++-------- arch/arm/boot/dts/qcom/msm8953-camera.dtsi | 30 +++++++++++----------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8937-camera.dtsi b/arch/arm/boot/dts/qcom/msm8937-camera.dtsi index 00a7efd42dbb0..b66fd891667b5 100644 --- a/arch/arm/boot/dts/qcom/msm8937-camera.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-camera.dtsi @@ -35,13 +35,11 @@ <&clock_gcc clk_csi0phytimer_clk_src>, <&clock_gcc clk_gcc_camss_csi0phytimer_clk>, <&clock_gcc clk_camss_top_ahb_clk_src>, - <&clock_gcc clk_gcc_camss_csi0phy_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", - "camss_ahb_src", "csi_phy_clk", - "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 200000000 0 0 0 0>; + "camss_ahb_src", "camss_ahb_clk"; + qcom,clock-rates = <0 61540000 200000000 0 0 0>; }; qcom,csiphy@1b35000 { @@ -58,13 +56,11 @@ <&clock_gcc clk_csi1phytimer_clk_src>, <&clock_gcc clk_gcc_camss_csi1phytimer_clk>, <&clock_gcc clk_camss_top_ahb_clk_src>, - <&clock_gcc clk_gcc_camss_csi1phy_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", - "camss_ahb_src", "csi_phy_clk", - "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 200000000 0 0 0 0>; + "camss_ahb_src", "camss_ahb_clk"; + qcom,clock-rates = <0 61540000 200000000 0 0 0>; }; qcom,csid@1b30000 { @@ -81,15 +77,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi0_ahb_clk>, <&clock_gcc clk_csi0_clk_src>, + <&clock_gcc clk_gcc_camss_csi0phy_clk>, <&clock_gcc clk_gcc_camss_csi0_clk>, <&clock_gcc clk_gcc_camss_csi0pix_clk>, <&clock_gcc clk_gcc_camss_csi0rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi0_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,csid@1b30400 { @@ -106,15 +104,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi1_ahb_clk>, <&clock_gcc clk_csi1_clk_src>, + <&clock_gcc clk_gcc_camss_csi1phy_clk>, <&clock_gcc clk_gcc_camss_csi1_clk>, <&clock_gcc clk_gcc_camss_csi1pix_clk>, <&clock_gcc clk_gcc_camss_csi1rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi1_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,csid@1b30800 { @@ -131,15 +131,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi2_ahb_clk>, <&clock_gcc clk_csi2_clk_src>, + <&clock_gcc clk_gcc_camss_csi2phy_clk>, <&clock_gcc clk_gcc_camss_csi2_clk>, <&clock_gcc clk_gcc_camss_csi2pix_clk>, <&clock_gcc clk_gcc_camss_csi2rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi2_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,ispif@1b31000 { diff --git a/arch/arm/boot/dts/qcom/msm8953-camera.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera.dtsi index 27ee1e1f9ae37..860f7a8b13237 100644 --- a/arch/arm/boot/dts/qcom/msm8953-camera.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-camera.dtsi @@ -35,13 +35,11 @@ <&clock_gcc clk_csi0phytimer_clk_src>, <&clock_gcc clk_gcc_camss_csi0phytimer_clk>, <&clock_gcc clk_camss_top_ahb_clk_src>, - <&clock_gcc clk_gcc_camss_csi0phy_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", - "camss_ahb_src", "csi_phy_clk", - "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 200000000 0 0 0 0>; + "camss_ahb_src", "camss_ahb_clk"; + qcom,clock-rates = <0 61540000 200000000 0 0 0>; }; qcom,csiphy@1b35000 { @@ -58,13 +56,11 @@ <&clock_gcc clk_csi1phytimer_clk_src>, <&clock_gcc clk_gcc_camss_csi1phytimer_clk>, <&clock_gcc clk_camss_top_ahb_clk_src>, - <&clock_gcc clk_gcc_camss_csi1phy_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", - "camss_ahb_src", "csi_phy_clk", - "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 200000000 0 0 0 0>; + "camss_ahb_src", "camss_ahb_clk"; + qcom,clock-rates = <0 61540000 200000000 0 0 0>; }; qcom,csiphy@1b36000 { @@ -81,13 +77,11 @@ <&clock_gcc clk_csi2phytimer_clk_src>, <&clock_gcc clk_gcc_camss_csi2phytimer_clk>, <&clock_gcc clk_camss_top_ahb_clk_src>, - <&clock_gcc clk_gcc_camss_csi2phy_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", - "camss_ahb_src", "csi_phy_clk", - "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 200000000 0 0 0 0>; + "camss_ahb_src", "camss_ahb_clk"; + qcom,clock-rates = <0 61540000 200000000 0 0 0>; }; qcom,csid@1b30000 { @@ -104,15 +98,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi0_ahb_clk>, <&clock_gcc clk_csi0_clk_src>, + <&clock_gcc clk_gcc_camss_csi0phy_clk>, <&clock_gcc clk_gcc_camss_csi0_clk>, <&clock_gcc clk_gcc_camss_csi0pix_clk>, <&clock_gcc clk_gcc_camss_csi0rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi0_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,csid@1b30400 { @@ -129,15 +125,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi1_ahb_clk>, <&clock_gcc clk_csi1_clk_src>, + <&clock_gcc clk_gcc_camss_csi1phy_clk>, <&clock_gcc clk_gcc_camss_csi1_clk>, <&clock_gcc clk_gcc_camss_csi1pix_clk>, <&clock_gcc clk_gcc_camss_csi1rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi1_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,csid@1b30800 { @@ -154,15 +152,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi2_ahb_clk>, <&clock_gcc clk_csi2_clk_src>, + <&clock_gcc clk_gcc_camss_csi2phy_clk>, <&clock_gcc clk_gcc_camss_csi2_clk>, <&clock_gcc clk_gcc_camss_csi2pix_clk>, <&clock_gcc clk_gcc_camss_csi2rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi2_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,ispif@1b31000 { From eea6f34985313aa0296f74c8b69b018aeecd09aa Mon Sep 17 00:00:00 2001 From: Vivek Veenam Date: Wed, 9 Mar 2016 11:04:49 +0530 Subject: [PATCH 0251/1015] msm: camera: Enable (2+1) lane csiphy combo mode Changes to enable csiphy in combo mode for (2+1) lane sensors. CRs-Fixed: 1068576 Change-Id: Iaf03c1a6b13a19e8591ab3dbb462154130b41e5e Signed-off-by: Vivek Veenam --- .../msm/camera_v2/sensor/csiphy/msm_csiphy.c | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c index 03ecc26fc4815..9d6952eefe601 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c +++ b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c @@ -295,6 +295,11 @@ static int msm_csiphy_2phase_lane_config( csiphybase = csiphy_dev->base; lane_mask = csiphy_params->lane_mask & 0x1f; + + lane_enable = msm_camera_io_r(csiphybase + + csiphy_dev->ctrl_reg->csiphy_3ph_reg. + mipi_csiphy_3ph_cmn_ctrl5.addr); + for (i = 0; i < MAX_LANES; i++) { if (mask == 0x2) { if (lane_mask & mask) @@ -332,7 +337,11 @@ static int msm_csiphy_2phase_lane_config( clk_lane = 0; } - if (csiphy_params->combo_mode == 1) { + /* In combo mode setting the 4th lane + * as clk_lane for 1 lane sensor, checking + * the lane_mask == 0x18 for one lane sensor + */ + if ((csiphy_params->combo_mode == 1) && (lane_mask == 0x18)) { val |= 0xA; if (mask == csiphy_dev->ctrl_reg-> csiphy_reg.combo_clk_mask) { @@ -378,6 +387,12 @@ static int msm_csiphy_2phase_lane_config( mipi_csiphy_2ph_lnn_cfg4.data, csiphybase + csiphy_dev->ctrl_reg->csiphy_3ph_reg. mipi_csiphy_2ph_lnn_cfg4.addr + offset); + if (lane_mask == 0x18) + msm_camera_io_w(0x80, + csiphybase + + csiphy_dev->ctrl_reg->csiphy_3ph_reg. + mipi_csiphy_2ph_lnn_cfg1.addr + offset); + } else { msm_camera_io_w(csiphy_dev->ctrl_reg->csiphy_3ph_reg. mipi_csiphy_2ph_lnn_cfg1.data, @@ -399,7 +414,7 @@ static int msm_csiphy_2phase_lane_config( csiphy_dev->ctrl_reg->csiphy_3ph_reg. mipi_csiphy_2ph_lnn_cfg5.addr + offset); } - if (clk_lane == 1 && + if (clk_lane == 1 && lane_mask != 0x18 && (csiphy_dev->hw_version == CSIPHY_VERSION_V342 || csiphy_dev->hw_version == CSIPHY_VERSION_V342_1)) { msm_camera_io_w(0x1f, @@ -742,17 +757,17 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) } CDBG("%s:%d called\n", __func__, __LINE__); - if (csiphy_dev->csiphy_state == CSIPHY_POWER_UP) { - pr_err("%s: csiphy invalid state %d\n", __func__, - csiphy_dev->csiphy_state); - rc = -EINVAL; + if (csiphy_dev->ref_count++) { + CDBG("%s csiphy refcount = %d\n", __func__, + csiphy_dev->ref_count); return rc; } CDBG("%s:%d called\n", __func__, __LINE__); - if (csiphy_dev->ref_count++) { - CDBG("%s csiphy refcount = %d\n", __func__, - csiphy_dev->ref_count); + if (csiphy_dev->csiphy_state == CSIPHY_POWER_UP) { + pr_err("%s: csiphy invalid state %d\n", __func__, + csiphy_dev->csiphy_state); + rc = -EINVAL; return rc; } CDBG("%s:%d called\n", __func__, __LINE__); @@ -820,6 +835,12 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) } csiphy_dev->csiphy_sof_debug_count = 0; CDBG("%s:%d called\n", __func__, __LINE__); + if (csiphy_dev->ref_count++) { + CDBG("%s csiphy refcount = %d\n", __func__, + csiphy_dev->ref_count); + return rc; + } + CDBG("%s:%d called\n", __func__, __LINE__); if (csiphy_dev->csiphy_state == CSIPHY_POWER_UP) { pr_err("%s: csiphy invalid state %d\n", __func__, csiphy_dev->csiphy_state); @@ -828,12 +849,6 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) } CDBG("%s:%d called\n", __func__, __LINE__); - if (csiphy_dev->ref_count++) { - CDBG("%s csiphy refcount = %d\n", __func__, - csiphy_dev->ref_count); - return rc; - } - CDBG("%s:%d called\n", __func__, __LINE__); rc = cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, CAM_AHB_SVS_VOTE); if (rc < 0) { From ecd0a07161999e838367a082d5e2f6489c0bcafe Mon Sep 17 00:00:00 2001 From: Rama Krishna Phani A Date: Wed, 12 Oct 2016 14:17:40 +0530 Subject: [PATCH 0252/1015] thermal: tsens: Check pointer validity before accessing its variables Pointer is being dereferenced before its validity check. Make change to have a check on the pointer validity before accessing its member variables. Change-Id: I271ff94bfe59430e69ea246f7e6ef90f7e0d6ac6 Signed-off-by: Rama Krishna Phani A --- drivers/thermal/msm-tsens.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/thermal/msm-tsens.c b/drivers/thermal/msm-tsens.c index 906a7b3bb2569..f4b53b8eb3745 100644 --- a/drivers/thermal/msm-tsens.c +++ b/drivers/thermal/msm-tsens.c @@ -5841,6 +5841,11 @@ static int tsens_thermal_zone_register(struct tsens_tm_device *tmdev) const struct of_device_id *id; struct device_node *of_node; + if (tmdev == NULL) { + pr_err("Invalid tsens instance\n"); + return -EINVAL; + } + of_node = tmdev->pdev->dev.of_node; if (of_node == NULL) { pr_err("Invalid of_node??\n"); @@ -5858,11 +5863,6 @@ static int tsens_thermal_zone_register(struct tsens_tm_device *tmdev) return -ENODEV; } - if (tmdev == NULL) { - pr_err("Invalid tsens instance\n"); - return -EINVAL; - } - for (i = 0; i < tmdev->tsens_num_sensor; i++) { char name[18]; if ((!strcmp(id->compatible, "qcom,mdm9640-tsens")) || From 546204116277faf9b5e9971ea6c71945b85c9cf7 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Fri, 21 Oct 2016 16:44:05 +0530 Subject: [PATCH 0253/1015] PM/devfreq: Fix uninitialized use of stat variable Initialize stat variable to zero to avoid uninitialized use of stat.private_data in the devfreq_vbif_ev_handler(). Change-Id: Ie34fad548214f287b67a8413c8658ebac65a95d3 Signed-off-by: Hareesh Gundu --- drivers/devfreq/governor_bw_vbif.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/devfreq/governor_bw_vbif.c b/drivers/devfreq/governor_bw_vbif.c index d6498bb0f1c0a..83196e1b31d55 100644 --- a/drivers/devfreq/governor_bw_vbif.c +++ b/drivers/devfreq/governor_bw_vbif.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2014, 2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -74,6 +74,8 @@ static int devfreq_vbif_ev_handler(struct devfreq *devfreq, int ret; struct devfreq_dev_status stat; + memset(&stat, 0, sizeof(stat)); + switch (event) { case DEVFREQ_GOV_START: mutex_lock(&df_lock); From 545ae8e0e2cd96e0cb654861ea454e3e57afdcc7 Mon Sep 17 00:00:00 2001 From: "Suzuki K. Poulose" Date: Tue, 17 Mar 2015 18:14:58 +0000 Subject: [PATCH 0254/1015] ARM: perf: reject groups spanning multiple hardware PMUs The perf core implicitly rejects events spanning multiple HW PMUs, as in these cases the event->ctx will differ. However this validation is performed after pmu::event_init() is called in perf_init_event(), and thus pmu::event_init() may be called with a group leader from a different HW PMU. The ARM PMU driver does not take this fact into account, and when validating groups assumes that it can call to_arm_pmu(event->pmu) for any HW event. When the event in question is from another HW PMU this is wrong, and results in dereferencing garbage. This patch updates the ARM PMU driver to first test for and reject events from other PMUs, moving the to_arm_pmu and related logic after this test. Fixes a crash triggered by perf_fuzzer on Linux-4.0-rc2, with a CCI PMU present: --- CPU: 0 PID: 1527 Comm: perf_fuzzer Not tainted 4.0.0-rc2 #57 Hardware name: ARM-Versatile Express task: bd8484c0 ti: be676000 task.ti: be676000 PC is at 0xbf1bbc90 LR is at validate_event+0x34/0x5c pc : [] lr : [<80016060>] psr: 00000013 ... [<80016060>] (validate_event) from [<80016198>] (validate_group+0x28/0x90) [<80016198>] (validate_group) from [<80016398>] (armpmu_event_init+0x150/0x218) [<80016398>] (armpmu_event_init) from [<800882e4>] (perf_try_init_event+0x30/0x48) [<800882e4>] (perf_try_init_event) from [<8008f544>] (perf_init_event+0x5c/0xf4) [<8008f544>] (perf_init_event) from [<8008f8a8>] (perf_event_alloc+0x2cc/0x35c) [<8008f8a8>] (perf_event_alloc) from [<8009015c>] (SyS_perf_event_open+0x498/0xa70) [<8009015c>] (SyS_perf_event_open) from [<8000e420>] (ret_fast_syscall+0x0/0x34) Code: bf1be000 bf1bb380 802a2664 00000000 (00000002) ---[ end trace 01aff0ff00926a0a ]--- Also cleans up the code to use the arm_pmu only when we know that we are dealing with an arm pmu event. Cc: Will Deacon Acked-by: Mark Rutland Acked-by: Peter Ziljstra (Intel) Signed-off-by: Suzuki K. Poulose Signed-off-by: Will Deacon Git-commit: e429817b401f095ac483fcb02524b01faf45dad6 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Change-Id: I3b9a0078f7a4cd5370ed177c8bd1438c09425eb4 Signed-off-by: Patrick Fay --- arch/arm/kernel/perf_event.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 266cba46db3ef..b72a5f19c8b57 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c @@ -252,20 +252,29 @@ armpmu_add(struct perf_event *event, int flags) } static int -validate_event(struct pmu_hw_events *hw_events, - struct perf_event *event) +validate_event(struct pmu *pmu, struct pmu_hw_events *hw_events, + struct perf_event *event) { - struct arm_pmu *armpmu = to_arm_pmu(event->pmu); + struct arm_pmu *armpmu; if (is_software_event(event)) return 1; + /* + * Reject groups spanning multiple HW PMUs (e.g. CPU + CCI). The + * core perf code won't check that the pmu->ctx == leader->ctx + * until after pmu->event_init(event). + */ + if (event->pmu != pmu) + return 0; + if (event->state < PERF_EVENT_STATE_OFF) return 1; if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec) return 1; + armpmu = to_arm_pmu(event->pmu); return armpmu->get_event_idx(hw_events, event) >= 0; } @@ -283,15 +292,15 @@ validate_group(struct perf_event *event) memset(fake_used_mask, 0, sizeof(fake_used_mask)); fake_pmu.used_mask = fake_used_mask; - if (!validate_event(&fake_pmu, leader)) + if (!validate_event(event->pmu, &fake_pmu, leader)) return -EINVAL; list_for_each_entry(sibling, &leader->sibling_list, group_entry) { - if (!validate_event(&fake_pmu, sibling)) + if (!validate_event(event->pmu, &fake_pmu, sibling)) return -EINVAL; } - if (!validate_event(&fake_pmu, event)) + if (!validate_event(event->pmu, &fake_pmu, event)) return -EINVAL; return 0; From 653fc34a1b3bd6b12fbc5b7445c202f4defd2f78 Mon Sep 17 00:00:00 2001 From: Abdulla Anam Date: Mon, 3 Oct 2016 19:01:01 +0530 Subject: [PATCH 0255/1015] msm: vidc: Correct debugfs directory name Video instance pointer is used directly as a unique name for the instance's corresponding debugfs directory. %pK will remove the uniqueness and hence only first among any concurrent sessions will be able to create a corresponding debugfs directory. Use %p as the name is not directly revealed through prints. Change-Id: I3a79950b76c1c38e487471f21dc60590b032dd3f Signed-off-by: Abdulla Anam --- drivers/media/platform/msm/vidc/msm_vidc_debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.c b/drivers/media/platform/msm/vidc/msm_vidc_debug.c index 8b87cac2ff243..46e40b1b399ff 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_debug.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.c @@ -153,7 +153,7 @@ struct dentry *msm_vidc_debugfs_init_drv(void) struct dentry *f = debugfs_create_##__type(__name, S_IRUGO | S_IWUSR, \ dir, __value); \ if (IS_ERR_OR_NULL(f)) { \ - dprintk(VIDC_ERR, "Failed creating debugfs file '%pKd/%s'\n", \ + dprintk(VIDC_ERR, "Failed creating debugfs file '%pd/%s'\n", \ dir, __name); \ f = NULL; \ } \ @@ -352,7 +352,7 @@ struct dentry *msm_vidc_debugfs_init_inst(struct msm_vidc_inst *inst, dprintk(VIDC_ERR, "Invalid params, inst: %pK\n", inst); goto failed_create_dir; } - snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%pK", inst); + snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%p", inst); dir = debugfs_create_dir(debugfs_name, parent); if (!dir) { dprintk(VIDC_ERR, "Failed to create debugfs for msm_vidc\n"); From 6e5ddd315c8e1924bf0c59aef00c7f8ed6eb78f2 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Mon, 24 Oct 2016 12:35:55 +0530 Subject: [PATCH 0256/1015] clk: msm: gcc: Add support for 650MHz for GPU clock for MSM8920 MSM8920 requires to support the maximum frequnecy of 650MHz for GPU clock, so update the list of supported frequencies and fmax tables accordingly. Change-Id: I89defc0e832093b88bfbbfceeaf2f68dc98a9d19 Signed-off-by: Odelu Kukatla --- drivers/clk/msm/clock-gcc-8952.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c index 5239ee25f6cd4..1eea84cee4b5f 100644 --- a/drivers/clk/msm/clock-gcc-8952.c +++ b/drivers/clk/msm/clock-gcc-8952.c @@ -4417,6 +4417,12 @@ static int msm_gcc_probe(struct platform_device *pdev) vdd_hf_pll.cur_level = VDD_HF_PLL_NUM_8917; get_speed_bin(pdev, &speed_bin); override_for_8917(speed_bin); + + if (compat_bin4) { + gfx3d_clk_src.freq_tbl = + ftbl_gcc_oxili_gfx3d_clk_8917_650MHz; + gfx3d_clk_src.c.fmax[VDD_DIG_HIGH] = 650000000; + } } else { gpll0_clk_src.c.parent = &gpll0_clk_src_8952.c; gpll0_ao_clk_src.c.parent = &gpll0_ao_clk_src_8952.c; From 881a7b95b97158a67210680e78c23d24a85f200a Mon Sep 17 00:00:00 2001 From: Sureshnaidu Laveti Date: Mon, 3 Oct 2016 04:01:32 -0700 Subject: [PATCH 0257/1015] msm: sensor: Adding mutex for actuator power down operations Protecting operations performed during actuator powerdown from race condition by adding mutex. CRs-Fixed: 1071891 Change-Id: I7d6b2e8878788615c02678a4a28d31dca0ed6bca Signed-off-by: Sureshnaidu Laveti --- .../media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c index bf39738885736..a700f836061cd 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c @@ -1559,11 +1559,13 @@ static long msm_actuator_subdev_ioctl(struct v4l2_subdev *sd, pr_err("a_ctrl->i2c_client.i2c_func_tbl NULL\n"); return -EINVAL; } + mutex_lock(a_ctrl->actuator_mutex); rc = msm_actuator_power_down(a_ctrl); if (rc < 0) { pr_err("%s:%d Actuator Power down failed\n", __func__, __LINE__); } + mutex_unlock(a_ctrl->actuator_mutex); return msm_actuator_close(sd, NULL); default: return -ENOIOCTLCMD; From c7911334d031cb0073a045375e75670d695a0e03 Mon Sep 17 00:00:00 2001 From: Chris Lew Date: Thu, 15 Sep 2016 18:10:14 -0700 Subject: [PATCH 0258/1015] soc: qcom: glink: Fix uninitialized return value Initialize the return value in the glink tx scheduler function. CRs-Fixed: 1081425 Change-Id: I7cad7a724666f34bce73d40e4975373604fb1e87 Signed-off-by: Chris Lew --- drivers/soc/qcom/glink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/qcom/glink.c b/drivers/soc/qcom/glink.c index 32b1e75bd45fe..f41dca077ec8f 100644 --- a/drivers/soc/qcom/glink.c +++ b/drivers/soc/qcom/glink.c @@ -5237,7 +5237,7 @@ static int glink_scheduler_tx(struct channel_ctx *ctx, size_t txd_len = 0; size_t tx_len = 0; uint32_t num_pkts = 0; - int ret; + int ret = 0; spin_lock_irqsave(&ctx->tx_lists_lock_lhc3, flags); while (txd_len < xprt_ctx->mtu && From 1cde63dd7f7d171574a1748fa06677069ed66963 Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Wed, 28 Sep 2016 18:48:38 +0530 Subject: [PATCH 0259/1015] diag: Fix race condition while closing SMD This patch extends protection while closing SMD/socket while feature mask processing. CRs-Fixed: 1059771 Change-Id: Icdf27dce5b3eb7cfc4a7686f044195db13a81a58 Signed-off-by: Manoj Prabhu B --- drivers/char/diag/diagfwd_peripheral.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/char/diag/diagfwd_peripheral.c b/drivers/char/diag/diagfwd_peripheral.c index 2ef7319cc448c..7151771015938 100644 --- a/drivers/char/diag/diagfwd_peripheral.c +++ b/drivers/char/diag/diagfwd_peripheral.c @@ -640,13 +640,12 @@ void diagfwd_close_transport(uint8_t transport, uint8_t peripheral) break; default: return; - } + mutex_lock(&driver->diagfwd_channel_mutex); fwd_info = &early_init_info[transport][peripheral]; if (fwd_info->p_ops && fwd_info->p_ops->close) fwd_info->p_ops->close(fwd_info->ctxt); - mutex_lock(&driver->diagfwd_channel_mutex); fwd_info = &early_init_info[transport_open][peripheral]; dest_info = &peripheral_info[TYPE_CNTL][peripheral]; dest_info->inited = 1; From 91f830ce2e9107430789e18cc8adce867242debf Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Wed, 17 Aug 2016 10:45:10 +0530 Subject: [PATCH 0260/1015] ARM: dts: msm: Update APC CPR configuration for msm8940pro Update APC CPR static open-loop and closed-loop voltage margins for msm8940pro as per voltage characterization results. CRs-Fixed: 1083415 Change-Id: I83a955dc0dc23a689158121f2d7c787421a345ff Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8940.dtsi | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index 3eb8c2011bee3..2c778829764ff 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -240,19 +240,25 @@ <1 (-1) 1 2 7>; qcom,cpr-fuse-version-map = - <(-1) 0 (-1) (-1) (-1) (-1)>, - <(-1) 1 (-1) (-1) (-1) (-1)>, - <(-1) 5 (-1) (-1) (-1) (-1)>; + < 0 0 (-1) (-1) (-1) (-1)>, + < 0 1 (-1) (-1) (-1) (-1)>, + < 0 5 (-1) (-1) (-1) (-1)>, + < 1 0 (-1) (-1) (-1) (-1)>, + < 1 1 (-1) (-1) (-1) (-1)>; qcom,cpr-init-voltage-adjustment = <0 0 0>, <0 0 20000>, - <0 0 15000>; + <0 0 15000>, + <0 0 20000>, + <0 0 20000>; qcom,cpr-quotient-adjustment = <0 0 0>, <38 0 28>, /* SVSP(20mv); TURBO(15mv); KV(1.9) */ - <0 0 19>; /* TURBO(10mv); KV(1.9) */ + <0 0 19>, /* TURBO(10mv); KV(1.9) */ + <0 0 28>, /* TURBO(15mv); KV(1.9) */ + <38 0 28>; /* SVSP(20mv); TURBO(15mv); KV(1.9) */ qcom,cpr-enable; }; From afc241eb3ed9e98a6bd50cc6988174a338b14cfd Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Wed, 19 Oct 2016 15:24:54 +0530 Subject: [PATCH 0261/1015] ARM: dts: msm: Modify IPA poll parameters for MSM8940 Throughput KPI's are impacted with the current poll parameters. Make a change to use 2ms poll sleep and 5 empty poll iterations which satisfies both power and performance kpi's. Change-Id: Ic64f1e682de6fc0eb98ae28b7f9b27d086b5b3ed Acked-by: Chaitanya Pratapa Signed-off-by: Utkarsh Saxena --- arch/arm/boot/dts/qcom/msm8940.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index 3eb8c2011bee3..1cdb8daa70410 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -155,8 +155,8 @@ <90 512 100000 800000>, /* SVS (ab=100, ib=800 ~ 50MHz) */ <90 512 100000 1200000>; /* PERF (ab=100, ib=1200 ~ 75MHz) */ qcom,bus-vector-names = "MIN", "SVS", "PERF"; - qcom,rx-polling-sleep-ms = <3>; /* Polling sleep interval */ - qcom,ipa-polling-iteration = <15>; /* Polling Iteration */ + qcom,rx-polling-sleep-ms = <2>; /* Polling sleep interval */ + qcom,ipa-polling-iteration = <5>; /* Polling Iteration */ }; qcom,rmnet-ipa { From 9a212e061693ce816b2921ab644cf2790dbd1212 Mon Sep 17 00:00:00 2001 From: Rajakumar Govindaram Date: Thu, 15 Sep 2016 17:09:40 -0700 Subject: [PATCH 0262/1015] msm: camera: cpp: Validate frame message before manipulating it. CPP frame message is used to send all frame data to Microcontroller. It is sent every frame. CPP kernel driver has to add information to it before transfer it. The message has to be validated before manipulations. If it is not valid the message and corresponding frame are discarded. b/30074605 CRs-Fixed: 1049826 Change-Id: I3e11ca7f6df4bb0d928512f81f3e3dc40fed791a Signed-off-by: Rajakumar Govindaram --- .../msm/camera_v2/pproc/cpp/msm_cpp.c | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index 133be5d44ec33..964b43fb1e51d 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -2274,21 +2274,19 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev, return -EINVAL; } - if (!new_frame->partial_frame_indicator) { - if (cpp_frame_msg[new_frame->msg_len - 1] != - MSM_CPP_MSG_ID_TRAILER) { - pr_err("Invalid frame message\n"); - return -EINVAL; - } + if (cpp_frame_msg[new_frame->msg_len - 1] != + MSM_CPP_MSG_ID_TRAILER) { + pr_err("Invalid frame message\n"); + return -EINVAL; + } - if ((stripe_base + new_frame->num_strips * stripe_size + 1) != - new_frame->msg_len) { - pr_err("Invalid frame message,len=%d,expected=%d\n", - new_frame->msg_len, - (stripe_base + - new_frame->num_strips * stripe_size + 1)); - return -EINVAL; - } + if ((stripe_base + new_frame->num_strips * stripe_size + 1) != + new_frame->msg_len) { + pr_err("Invalid frame message,len=%d,expected=%d\n", + new_frame->msg_len, + (stripe_base + + new_frame->num_strips * stripe_size + 1)); + return -EINVAL; } if (cpp_dev->iommu_state != CPP_IOMMU_STATE_ATTACHED) { From a27d34318cec7e2ac94c5e8966b1b62378207e62 Mon Sep 17 00:00:00 2001 From: Krishna Chaitanya Devarakonda Date: Mon, 10 Oct 2016 15:59:58 +0530 Subject: [PATCH 0263/1015] msm: mdss: Set default fps for dedicated WB In targets with dedicated writeback paths, the FPS isn't set properly for BW calculations for WB cases. Setting the FPS to default frame rate, for such cases. Change-Id: I83c545f3344ee5fc3d356f0e08d3c20453e22b31 Signed-off-by: Krishna Chaitanya Devarakonda --- drivers/video/msm/mdss/mdss_mdp_ctl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_ctl.c b/drivers/video/msm/mdss/mdss_mdp_ctl.c index b7f6da0a68384..8534c5619f9eb 100644 --- a/drivers/video/msm/mdss/mdss_mdp_ctl.c +++ b/drivers/video/msm/mdss/mdss_mdp_ctl.c @@ -702,6 +702,7 @@ int mdss_mdp_get_panel_params(struct mdss_mdp_pipe *pipe, *v_total = mixer->height; *xres = mixer->width; *h_total = mixer->width; + *fps = DEFAULT_FRAME_RATE; } return 0; @@ -713,7 +714,8 @@ int mdss_mdp_get_pipe_overlap_bw(struct mdss_mdp_pipe *pipe, struct mdss_data_type *mdata = mdss_mdp_get_mdata(); struct mdss_mdp_mixer *mixer = pipe->mixer_left; struct mdss_rect src, dst; - u32 v_total, fps, h_total, xres, src_h; + u32 v_total = 0, h_total = 0, xres = 0, src_h = 0; + u32 fps = DEFAULT_FRAME_RATE; *quota = 0; *quota_nocr = 0; From 170548b18ba27d752e5c5088d8efb0edc46f3f81 Mon Sep 17 00:00:00 2001 From: Alok Kediya Date: Tue, 25 Oct 2016 11:01:59 +0530 Subject: [PATCH 0264/1015] msm: isp: check for the stream info state in stop stream. check for the stream info state before access the structure in axi stop stream. CRs-Fixed: 1082381 Change-Id: I7617798ece03908aec6dac60ad77e199ed306d47 Signed-off-by: Alok Kediya --- drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index 65561405fe74f..2b278503613f0 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -2864,6 +2864,8 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev, } stream_info = &axi_data->stream_info[ HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])]; + if (stream_info->state == AVAILABLE) + continue; /* set ping pong address to scratch before stream stop */ spin_lock_irqsave(&stream_info->lock, flags); msm_isp_cfg_stream_scratch(vfe_dev, stream_info, VFE_PING_FLAG); From 16f6f8b4dd21eea421fc3bd0efabde969fa50745 Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Wed, 19 Oct 2016 13:30:44 -0700 Subject: [PATCH 0265/1015] msm: ipa: fix ioctl input param validation Fix input parameter validation in order to avoid device crash because of incorrect parameter in IPA driver. Change-Id: Icbdb05aeb9211665420a872d3453dbbd24fd347b CRs-Fixed: 1069060 Acked-by: Ady Abraham Signed-off-by: Skylar Chang --- drivers/platform/msm/ipa/ipa_v2/ipa_flt.c | 36 +++++++++-- drivers/platform/msm/ipa/ipa_v2/ipa_i.h | 2 +- drivers/platform/msm/ipa/ipa_v2/ipa_nat.c | 77 ++++++++++++++++++++++- drivers/platform/msm/ipa/ipa_v2/ipa_rt.c | 26 ++++++-- drivers/platform/msm/ipa/ipa_v3/ipa_nat.c | 76 ++++++++++++++++++++++ 5 files changed, 205 insertions(+), 12 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c b/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c index c36ecfef66f14..d6e563b935b6a 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -235,7 +235,7 @@ static int ipa_generate_flt_hw_rule(enum ipa_ip_type ip, * @ip: the ip address family type * @hdr_sz: header size * - * Returns: 0 on success, negative on failure + * Returns: size on success, negative on failure * * caller needs to hold any needed locks to ensure integrity * @@ -373,7 +373,12 @@ static int ipa_generate_flt_hw_tbl_common(enum ipa_ip_type ip, u8 *base, ((long)body & IPA_FLT_ENTRY_MEMORY_ALLIGNMENT)); } else { - WARN_ON(tbl->sz == 0); + if (tbl->sz == 0) { + IPAERR("tbl size is 0\n"); + WARN_ON(1); + goto proc_err; + } + /* allocate memory for the flt tbl */ flt_tbl_mem.size = tbl->sz; flt_tbl_mem.base = @@ -460,7 +465,12 @@ static int ipa_generate_flt_hw_tbl_common(enum ipa_ip_type ip, u8 *base, ((long)body & IPA_FLT_ENTRY_MEMORY_ALLIGNMENT)); } else { - WARN_ON(tbl->sz == 0); + if (tbl->sz == 0) { + IPAERR("tbl size is 0\n"); + WARN_ON(1); + goto proc_err; + } + /* allocate memory for the flt tbl */ flt_tbl_mem.size = tbl->sz; flt_tbl_mem.base = @@ -534,8 +544,15 @@ static int ipa_generate_flt_hw_tbl_v1_1(enum ipa_ip_type ip, u8 *hdr; u8 *body; u8 *base; + int res; + + res = ipa_get_flt_hw_tbl_size(ip, &hdr_sz); + if (res < 0) { + IPAERR("ipa_get_flt_hw_tbl_size failed %d\n", res); + return res; + } - mem->size = ipa_get_flt_hw_tbl_size(ip, &hdr_sz); + mem->size = res; mem->size = IPA_HW_TABLE_ALIGNMENT(mem->size); if (mem->size == 0) { @@ -720,6 +737,7 @@ static int ipa_generate_flt_hw_tbl_v2(enum ipa_ip_type ip, u32 *entr; u32 body_start_offset; u32 hdr_top; + int res; if (ip == IPA_IP_v4) body_start_offset = IPA_MEM_PART(apps_v4_flt_ofst) - @@ -756,7 +774,13 @@ static int ipa_generate_flt_hw_tbl_v2(enum ipa_ip_type ip, entr++; } - mem->size = ipa_get_flt_hw_tbl_size(ip, &hdr_sz); + res = ipa_get_flt_hw_tbl_size(ip, &hdr_sz); + if (res < 0) { + IPAERR("ipa_get_flt_hw_tbl_size failed %d\n", res); + goto body_err; + } + + mem->size = res; mem->size -= hdr_sz; mem->size = IPA_HW_TABLE_ALIGNMENT(mem->size); diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h index 99bc8ff9541c2..73ff75ac0b5dd 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h @@ -134,7 +134,7 @@ #define IPA_HW_TABLE_ALIGNMENT(start_ofst) \ (((start_ofst) + 127) & ~127) -#define IPA_RT_FLT_HW_RULE_BUF_SIZE (128) +#define IPA_RT_FLT_HW_RULE_BUF_SIZE (256) #define IPA_HDR_PROC_CTX_TABLE_ALIGNMENT_BYTE 8 #define IPA_HDR_PROC_CTX_TABLE_ALIGNMENT(start_ofst) \ diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_nat.c b/drivers/platform/msm/ipa/ipa_v2/ipa_nat.c index 6202992c2c4e3..314b095930260 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_nat.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_nat.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -25,6 +25,16 @@ #define IPA_NAT_SHARED_MEMORY 1 #define IPA_NAT_TEMP_MEM_SIZE 128 +enum nat_table_type { + IPA_NAT_BASE_TBL = 0, + IPA_NAT_EXPN_TBL = 1, + IPA_NAT_INDX_TBL = 2, + IPA_NAT_INDEX_EXPN_TBL = 3, +}; + +#define NAT_TABLE_ENTRY_SIZE_BYTE 32 +#define NAT_INTEX_TABLE_ENTRY_SIZE_BYTE 4 + static int ipa_nat_vma_fault_remap( struct vm_area_struct *vma, struct vm_fault *vmf) { @@ -568,6 +578,71 @@ int ipa2_nat_dma_cmd(struct ipa_ioc_nat_dma_cmd *dma) goto bail; } + for (cnt = 0; cnt < dma->entries; cnt++) { + if (dma->dma[cnt].table_index >= 1) { + IPAERR("Invalid table index %d\n", + dma->dma[cnt].table_index); + ret = -EPERM; + goto bail; + } + + switch (dma->dma[cnt].base_addr) { + case IPA_NAT_BASE_TBL: + if (dma->dma[cnt].offset >= + (ipa_ctx->nat_mem.size_base_tables + 1) * + NAT_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_EXPN_TBL: + if (dma->dma[cnt].offset >= + ipa_ctx->nat_mem.size_expansion_tables * + NAT_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_INDX_TBL: + if (dma->dma[cnt].offset >= + (ipa_ctx->nat_mem.size_base_tables + 1) * + NAT_INTEX_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_INDEX_EXPN_TBL: + if (dma->dma[cnt].offset >= + ipa_ctx->nat_mem.size_expansion_tables * + NAT_INTEX_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + default: + IPAERR("Invalid base_addr %d\n", + dma->dma[cnt].base_addr); + ret = -EPERM; + goto bail; + } + } + size = sizeof(struct ipa_desc) * NUM_OF_DESC; desc = kzalloc(size, GFP_KERNEL); if (desc == NULL) { diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c index 4ec43dd662f9d..8efc2d825ea82 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c @@ -227,7 +227,7 @@ int __ipa_generate_rt_hw_rule_v2_6L(enum ipa_ip_type ip, * @hdr_sz: header size * @max_rt_idx: maximal index * - * Returns: 0 on success, negative on failure + * Returns: size on success, negative on failure * * caller needs to hold any needed locks to ensure integrity * @@ -356,7 +356,11 @@ static int ipa_generate_rt_hw_tbl_common(enum ipa_ip_type ip, u8 *base, u8 *hdr, ((long)body & IPA_RT_ENTRY_MEMORY_ALLIGNMENT)); } else { - WARN_ON(tbl->sz == 0); + if (tbl->sz == 0) { + IPAERR("cannot generate 0 size table\n"); + goto proc_err; + } + /* allocate memory for the RT tbl */ rt_tbl_mem.size = tbl->sz; rt_tbl_mem.base = @@ -429,8 +433,15 @@ static int ipa_generate_rt_hw_tbl_v1_1(enum ipa_ip_type ip, u8 *base; int max_rt_idx; int i; + int res; - mem->size = ipa_get_rt_hw_tbl_size(ip, &hdr_sz, &max_rt_idx); + res = ipa_get_rt_hw_tbl_size(ip, &hdr_sz, &max_rt_idx); + if (res < 0) { + IPAERR("ipa_get_rt_hw_tbl_size failed %d\n", res); + goto error; + } + + mem->size = res; mem->size = (mem->size + IPA_RT_TABLE_MEMORY_ALLIGNMENT) & ~IPA_RT_TABLE_MEMORY_ALLIGNMENT; @@ -603,6 +614,7 @@ static int ipa_generate_rt_hw_tbl_v2(enum ipa_ip_type ip, int num_index; u32 body_start_offset; u32 apps_start_idx; + int res; if (ip == IPA_IP_v4) { num_index = IPA_MEM_PART(v4_apps_rt_index_hi) - @@ -632,7 +644,13 @@ static int ipa_generate_rt_hw_tbl_v2(enum ipa_ip_type ip, entr++; } - mem->size = ipa_get_rt_hw_tbl_size(ip, &hdr_sz, &max_rt_idx); + res = ipa_get_rt_hw_tbl_size(ip, &hdr_sz, &max_rt_idx); + if (res < 0) { + IPAERR("ipa_get_rt_hw_tbl_size failed %d\n", res); + goto base_err; + } + + mem->size = res; mem->size -= hdr_sz; mem->size = (mem->size + IPA_RT_TABLE_MEMORY_ALLIGNMENT) & ~IPA_RT_TABLE_MEMORY_ALLIGNMENT; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c b/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c index 67e9b397a8b49..e7e5cf114242e 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c @@ -24,6 +24,17 @@ #define IPA_NAT_TEMP_MEM_SIZE 128 +enum nat_table_type { + IPA_NAT_BASE_TBL = 0, + IPA_NAT_EXPN_TBL = 1, + IPA_NAT_INDX_TBL = 2, + IPA_NAT_INDEX_EXPN_TBL = 3, +}; + +#define NAT_TABLE_ENTRY_SIZE_BYTE 32 +#define NAT_INTEX_TABLE_ENTRY_SIZE_BYTE 4 + + static int ipa3_nat_vma_fault_remap( struct vm_area_struct *vma, struct vm_fault *vmf) { @@ -571,6 +582,71 @@ int ipa3_nat_dma_cmd(struct ipa_ioc_nat_dma_cmd *dma) goto bail; } + for (cnt = 0; cnt < dma->entries; cnt++) { + if (dma->dma[cnt].table_index >= 1) { + IPAERR("Invalid table index %d\n", + dma->dma[cnt].table_index); + ret = -EPERM; + goto bail; + } + + switch (dma->dma[cnt].base_addr) { + case IPA_NAT_BASE_TBL: + if (dma->dma[cnt].offset >= + (ipa3_ctx->nat_mem.size_base_tables + 1) * + NAT_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_EXPN_TBL: + if (dma->dma[cnt].offset >= + ipa3_ctx->nat_mem.size_expansion_tables * + NAT_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_INDX_TBL: + if (dma->dma[cnt].offset >= + (ipa3_ctx->nat_mem.size_base_tables + 1) * + NAT_INTEX_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_INDEX_EXPN_TBL: + if (dma->dma[cnt].offset >= + ipa3_ctx->nat_mem.size_expansion_tables * + NAT_INTEX_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + default: + IPAERR("Invalid base_addr %d\n", + dma->dma[cnt].base_addr); + ret = -EPERM; + goto bail; + } + } + size = sizeof(struct ipa3_desc) * NUM_OF_DESC; desc = kzalloc(size, GFP_KERNEL); if (desc == NULL) { From 55dc0c3994cf19ed37d2299b94d9e76f19c03170 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Mon, 24 Oct 2016 13:52:04 -0700 Subject: [PATCH 0266/1015] msm: crypto: Fix integer over flow check in qce driver Integer overflow check is invalid when ULONG_MAX is used, as ULONG_MAX has typeof 'unsigned long', while areq->assoclen, q_req->crytlen, and qreq.ivsize are 'unsigned int'. Make change to use UINT_MAX instead of ULONG_MAX. Change-Id: If2bb1900c07af1ea162da362c913d4880b0bc755 Signed-off-by: Zhen Kong --- drivers/crypto/msm/qce.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/crypto/msm/qce.c b/drivers/crypto/msm/qce.c index 7ddbb1938400e..4cf95b90a2dfe 100644 --- a/drivers/crypto/msm/qce.c +++ b/drivers/crypto/msm/qce.c @@ -1,6 +1,6 @@ /* Qualcomm Crypto Engine driver. * - * Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1962,8 +1962,8 @@ int qce_aead_req(void *handle, struct qce_req *q_req) else q_req->cryptlen = areq->cryptlen - authsize; - if ((q_req->cryptlen > ULONG_MAX - ivsize) || - (q_req->cryptlen + ivsize > ULONG_MAX - areq->assoclen)) { + if ((q_req->cryptlen > UINT_MAX - ivsize) || + (q_req->cryptlen + ivsize > UINT_MAX - areq->assoclen)) { pr_err("Integer overflow on total aead req length.\n"); return -EINVAL; } From f69fde605242d5747ff5fd585922ecae0876cd60 Mon Sep 17 00:00:00 2001 From: Sudheer Papothi Date: Wed, 26 Oct 2016 01:07:04 +0530 Subject: [PATCH 0267/1015] drivers: qcom: ultrasound: Lock async driver calls Adds lock to ioctl and other external calls to driver. Adds missing null check in __usf_set_stream_param. Change-Id: I142f31c6bb46d6a394ad012077e1703875a120ad Signed-off-by: Sudheer Papothi --- drivers/misc/qcom/qdsp6v2/ultrasound/usf.c | 66 +++++++++++++++++++--- 1 file changed, 59 insertions(+), 7 deletions(-) diff --git a/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c b/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c index 7572374cc524d..3bb95f50bc137 100644 --- a/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c +++ b/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include "q6usm.h" @@ -135,6 +136,8 @@ struct usf_type { uint16_t conflicting_event_filters; /* The requested buttons bitmap */ uint16_t req_buttons_bitmap; + /* Mutex for exclusive operations (all public APIs) */ + struct mutex mutex; }; struct usf_input_dev_type { @@ -1403,9 +1406,22 @@ static int __usf_set_stream_param(struct usf_xx_type *usf_xx, int dir) { struct us_client *usc = usf_xx->usc; - struct us_port_data *port = &usc->port[dir]; + struct us_port_data *port; int rc = 0; + if (usc == NULL) { + pr_err("%s: usc is null\n", + __func__); + return -EFAULT; + } + + port = &usc->port[dir]; + if (port == NULL) { + pr_err("%s: port is null\n", + __func__); + return -EFAULT; + } + if (port->param_buf == NULL) { pr_err("%s: parameter buffer is null\n", __func__); @@ -1538,10 +1554,12 @@ static int usf_get_stream_param(struct usf_xx_type *usf_xx, return __usf_get_stream_param(usf_xx, &get_stream_param, dir); } /* usf_get_stream_param */ -static long usf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +static long __usf_ioctl(struct usf_type *usf, + unsigned int cmd, + unsigned long arg) { + int rc = 0; - struct usf_type *usf = file->private_data; struct usf_xx_type *usf_xx = NULL; switch (cmd) { @@ -1703,6 +1721,18 @@ static long usf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) (cmd == US_SET_RX_INFO))) release_xx(usf_xx); + return rc; +} /* __usf_ioctl */ + +static long usf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + struct usf_type *usf = file->private_data; + int rc = 0; + + mutex_lock(&usf->mutex); + rc = __usf_ioctl(usf, cmd, arg); + mutex_unlock(&usf->mutex); + return rc; } /* usf_ioctl */ @@ -2147,12 +2177,11 @@ static int usf_get_stream_param32(struct usf_xx_type *usf_xx, return __usf_get_stream_param(usf_xx, &get_stream_param, dir); } /* usf_get_stream_param32 */ -static long usf_compat_ioctl(struct file *file, +static long __usf_compat_ioctl(struct usf_type *usf, unsigned int cmd, unsigned long arg) { int rc = 0; - struct usf_type *usf = file->private_data; struct usf_xx_type *usf_xx = NULL; switch (cmd) { @@ -2160,7 +2189,7 @@ static long usf_compat_ioctl(struct file *file, case US_START_RX: case US_STOP_TX: case US_STOP_RX: { - return usf_ioctl(file, cmd, arg); + return __usf_ioctl(usf, cmd, arg); } case US_SET_TX_INFO32: { @@ -2268,6 +2297,20 @@ static long usf_compat_ioctl(struct file *file, (cmd == US_SET_RX_INFO))) release_xx(usf_xx); + return rc; +} /* __usf_compat_ioctl */ + +static long usf_compat_ioctl(struct file *file, + unsigned int cmd, + unsigned long arg) +{ + struct usf_type *usf = file->private_data; + int rc = 0; + + mutex_lock(&usf->mutex); + rc = __usf_compat_ioctl(usf, cmd, arg); + mutex_unlock(&usf->mutex); + return rc; } /* usf_compat_ioctl */ #endif /* CONFIG_COMPAT */ @@ -2277,13 +2320,17 @@ static int usf_mmap(struct file *file, struct vm_area_struct *vms) struct usf_type *usf = file->private_data; int dir = OUT; struct usf_xx_type *usf_xx = &usf->usf_tx; + int rc = 0; + mutex_lock(&usf->mutex); if (vms->vm_flags & USF_VM_WRITE) { /* RX buf mapping */ dir = IN; usf_xx = &usf->usf_rx; } + rc = q6usm_get_virtual_address(dir, usf_xx->usc, vms); + mutex_unlock(&usf->mutex); - return q6usm_get_virtual_address(dir, usf_xx->usc, vms); + return rc; } static uint16_t add_opened_dev(int minor) @@ -2336,6 +2383,8 @@ static int usf_open(struct inode *inode, struct file *file) usf->usf_tx.us_detect_type = USF_US_DETECT_UNDEF; usf->usf_rx.us_detect_type = USF_US_DETECT_UNDEF; + mutex_init(&usf->mutex); + pr_debug("%s:usf in open\n", __func__); return 0; } @@ -2346,6 +2395,7 @@ static int usf_release(struct inode *inode, struct file *file) pr_debug("%s: release entry\n", __func__); + mutex_lock(&usf->mutex); usf_release_input(usf); usf_disable(&usf->usf_tx); @@ -2354,6 +2404,8 @@ static int usf_release(struct inode *inode, struct file *file) s_opened_devs[usf->dev_ind] = 0; wakeup_source_trash(&usf_wakeup_source); + mutex_unlock(&usf->mutex); + mutex_destroy(&usf->mutex); kfree(usf); pr_debug("%s: release exit\n", __func__); return 0; From 1eeaabf4a8c2a9a0e2b2085a185186ba77af84e2 Mon Sep 17 00:00:00 2001 From: Raviteja Tamatam Date: Thu, 29 Sep 2016 15:33:59 +0530 Subject: [PATCH 0268/1015] msm: mdss: Allow mdss driver to carry more lazy buffers SMMU Virtulization limit depends on the page table format for a 32bit table we can have 4GB as a limit. Increase the virtual map range for mdss driver so that it can allow more lazy buffers to be mapped. This will help in cases where apps which are queued once to display and are parked in background. Change-Id: I08f8cbff267630f0ade33299762c4900c04f611b Signed-off-by: Raviteja Tamatam --- drivers/video/msm/mdss/mdss_smmu.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_smmu.c b/drivers/video/msm/mdss/mdss_smmu.c index 4a99cf5cc5b3a..3ad9e6c6ed424 100644 --- a/drivers/video/msm/mdss/mdss_smmu.c +++ b/drivers/video/msm/mdss/mdss_smmu.c @@ -36,6 +36,8 @@ #include "mdss_smmu.h" #include "mdss_debug.h" +#define SZ_4G 0xF0000000 + static DEFINE_MUTEX(mdp_iommu_lock); void mdss_iommu_lock(void) @@ -537,13 +539,13 @@ int mdss_smmu_init(struct mdss_data_type *mdata, struct device *dev) } static struct mdss_smmu_domain mdss_mdp_unsec = { - "mdp_0", MDSS_IOMMU_DOMAIN_UNSECURE, SZ_128K, (SZ_1G - SZ_128K)}; + "mdp_0", MDSS_IOMMU_DOMAIN_UNSECURE, SZ_128K, (SZ_4G - SZ_128K)}; static struct mdss_smmu_domain mdss_rot_unsec = { - NULL, MDSS_IOMMU_DOMAIN_ROT_UNSECURE, SZ_128K, (SZ_1G - SZ_128K)}; + NULL, MDSS_IOMMU_DOMAIN_ROT_UNSECURE, SZ_128K, (SZ_4G - SZ_128K)}; static struct mdss_smmu_domain mdss_mdp_sec = { - "mdp_1", MDSS_IOMMU_DOMAIN_SECURE, SZ_1G, SZ_2G}; + "mdp_1", MDSS_IOMMU_DOMAIN_SECURE, SZ_128K, (SZ_4G - SZ_128K)}; static struct mdss_smmu_domain mdss_rot_sec = { - NULL, MDSS_IOMMU_DOMAIN_ROT_SECURE, SZ_1G, SZ_2G}; + NULL, MDSS_IOMMU_DOMAIN_ROT_SECURE, SZ_128K, (SZ_4G - SZ_128K)}; static const struct of_device_id mdss_smmu_dt_match[] = { { .compatible = "qcom,smmu_mdp_unsec", .data = &mdss_mdp_unsec}, From 55b672e7350b565e23e817579048d5389b8e73b2 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Thu, 13 Oct 2016 13:07:36 -0700 Subject: [PATCH 0269/1015] UPSTREAM: mm: remove gup_flags FOLL_WRITE games from __get_user_pages() This is an ancient bug that was actually attempted to be fixed once (badly) by me eleven years ago in commit 4ceb5db9757a ("Fix get_user_pages() race for write access") but that was then undone due to problems on s390 by commit f33ea7f404e5 ("fix get_user_pages bug"). In the meantime, the s390 situation has long been fixed, and we can now fix it by checking the pte_dirty() bit properly (and do it better). The s390 dirty bit was implemented in abf09bed3cce ("s390/mm: implement software dirty bits") which made it into v3.9. Earlier kernels will have to look at the page state itself. Also, the VM has become more scalable, and what used a purely theoretical race back then has become easier to trigger. To fix it, we introduce a new internal FOLL_COW flag to mark the "yes, we already did a COW" rather than play racy games with FOLL_WRITE that is very fundamental, and then use the pte dirty flag to validate that the FOLL_COW flag is still valid. BUG=chromium:657609 TEST=None Change-Id: I42e448ecacad4781b460c4c989026307169ba1b5 Reported-and-tested-by: Phil "not Paul" Oester Acked-by: Hugh Dickins Reviewed-by: Michal Hocko Cc: Andy Lutomirski Cc: Kees Cook Cc: Oleg Nesterov Cc: Willy Tarreau Cc: Nick Piggin Cc: Greg Thelen Cc: stable@vger.kernel.org Signed-off-by: Linus Torvalds (cherry picked from commit 19be0eaffa3ac7d8eb6784ad9bdbc7d67ed8e619) Signed-off-by: Andrey Ulanov Reviewed-on: https://chromium-review.googlesource.com/401142 Reviewed-by: Guenter Roeck Git-repo: https://chromium.googlesource.com/chromiumos/third_party/kernel.git Git-commit: 575d2cce92dd173145e530fb35452ff8174023f0 Signed-off-by: Ravi Kumar Siddojigari --- include/linux/mm.h | 1 + mm/gup.c | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 7a345e6a04c6f..b6b3d75a1bde7 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2055,6 +2055,7 @@ static inline struct page *follow_page(struct vm_area_struct *vma, #define FOLL_NUMA 0x200 /* force NUMA hinting page fault */ #define FOLL_MIGRATION 0x400 /* wait for page to replace migration entry */ #define FOLL_TRIED 0x800 /* a retry, previous pass started an IO */ +#define FOLL_COW 0x4000 /* internal GUP flag */ typedef int (*pte_fn_t)(pte_t *pte, pgtable_t token, unsigned long addr, void *data); diff --git a/mm/gup.c b/mm/gup.c index 377a5a796242e..bef4bb0f79625 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -32,6 +32,16 @@ static struct page *no_page_table(struct vm_area_struct *vma, return NULL; } +/* + * FOLL_FORCE can write to even unwritable pte's, but only + * after we've gone through a COW cycle and they are dirty. + */ +static inline bool can_follow_write_pte(pte_t pte, unsigned int flags) +{ + return pte_write(pte) || + ((flags & FOLL_FORCE) && (flags & FOLL_COW) && pte_dirty(pte)); +} + static struct page *follow_page_pte(struct vm_area_struct *vma, unsigned long address, pmd_t *pmd, unsigned int flags) { @@ -66,7 +76,7 @@ static struct page *follow_page_pte(struct vm_area_struct *vma, } if ((flags & FOLL_NUMA) && pte_numa(pte)) goto no_page; - if ((flags & FOLL_WRITE) && !pte_write(pte)) { + if ((flags & FOLL_WRITE) && !can_follow_write_pte(pte, flags)) { pte_unmap_unlock(ptep, ptl); return NULL; } @@ -315,7 +325,7 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, * reCOWed by userspace write). */ if ((ret & VM_FAULT_WRITE) && !(vma->vm_flags & VM_WRITE)) - *flags &= ~FOLL_WRITE; + *flags |= FOLL_COW; return 0; } From aa6aa163593c9c8ff3f04dc3afd8ab1523769aaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= Date: Tue, 2 Aug 2016 15:40:39 -0700 Subject: [PATCH 0270/1015] ANDROID: binder: Add strong ref checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prevent using a binder_ref with only weak references where a strong reference is required. BUG: 30445380 Change-Id: I66c15b066808f28bd27bfe50fd0e03ff45a09fca Signed-off-by: Arve HjønnevÃ¥g Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: 5e2a2bc89956ae1c739854403408059144b23c28 [d-cagle@codeaurora.org: Resolve trivial merge conflicts] Signed-off-by: Dennis Cagle --- drivers/staging/android/binder.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index d486d36ad573e..6a29ad48e37ea 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -999,7 +999,7 @@ static int binder_dec_node(struct binder_node *node, int strong, int internal) static struct binder_ref *binder_get_ref(struct binder_proc *proc, - uint32_t desc) + uint32_t desc, bool need_strong_ref) { struct rb_node *n = proc->refs_by_desc.rb_node; struct binder_ref *ref; @@ -1007,12 +1007,16 @@ static struct binder_ref *binder_get_ref(struct binder_proc *proc, while (n) { ref = rb_entry(n, struct binder_ref, rb_node_desc); - if (desc < ref->desc) + if (desc < ref->desc) { n = n->rb_left; - else if (desc > ref->desc) + } else if (desc > ref->desc) { n = n->rb_right; - else + } else if (need_strong_ref && !ref->strong) { + binder_user_error("tried to use weak ref as strong ref\n"); + return NULL; + } else { return ref; + } } return NULL; } @@ -1282,8 +1286,8 @@ static void binder_transaction_buffer_release(struct binder_proc *proc, } break; case BINDER_TYPE_HANDLE: case BINDER_TYPE_WEAK_HANDLE: { - struct binder_ref *ref = binder_get_ref(proc, fp->handle); - + struct binder_ref *ref = binder_get_ref(proc, fp->handle, + fp->type == BINDER_TYPE_HANDLE); if (ref == NULL) { pr_err("transaction release %d bad handle %d\n", debug_id, fp->handle); @@ -1376,8 +1380,7 @@ static void binder_transaction(struct binder_proc *proc, } else { if (tr->target.handle) { struct binder_ref *ref; - - ref = binder_get_ref(proc, tr->target.handle); + ref = binder_get_ref(proc, tr->target.handle, true); if (ref == NULL) { binder_user_error("%d:%d got transaction to invalid handle\n", proc->pid, thread->pid); @@ -1586,8 +1589,8 @@ static void binder_transaction(struct binder_proc *proc, } break; case BINDER_TYPE_HANDLE: case BINDER_TYPE_WEAK_HANDLE: { - struct binder_ref *ref = binder_get_ref(proc, fp->handle); - + struct binder_ref *ref = binder_get_ref(proc, fp->handle, + fp->type == BINDER_TYPE_HANDLE); if (ref == NULL) { binder_user_error("%d:%d got transaction with invalid handle, %d\n", proc->pid, @@ -1805,7 +1808,9 @@ static int binder_thread_write(struct binder_proc *proc, ref->desc); } } else - ref = binder_get_ref(proc, target); + ref = binder_get_ref(proc, target, + cmd == BC_ACQUIRE || + cmd == BC_RELEASE); if (ref == NULL) { binder_user_error("%d:%d refcount change on invalid ref %d\n", proc->pid, thread->pid, target); @@ -2001,7 +2006,7 @@ static int binder_thread_write(struct binder_proc *proc, if (get_user(cookie, (binder_uintptr_t __user *)ptr)) return -EFAULT; ptr += sizeof(binder_uintptr_t); - ref = binder_get_ref(proc, target); + ref = binder_get_ref(proc, target, false); if (ref == NULL) { binder_user_error("%d:%d %s invalid ref %d\n", proc->pid, thread->pid, From ab87206f8a91e2caa3d29105f03288856fecbb76 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Thu, 3 Nov 2016 18:28:19 +0530 Subject: [PATCH 0271/1015] clk: msm: gcc: Update the number of bases for MSM8920 Number of hwio bases needs to be updated to correct value for MSM8920, so update the same. Change-Id: I9d1ab64b6e2da4cb1d271309697b3474f638ddba Signed-off-by: Odelu Kukatla --- drivers/clk/msm/clock-gcc-8952.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c index 1eea84cee4b5f..8cb91e7280ea9 100644 --- a/drivers/clk/msm/clock-gcc-8952.c +++ b/drivers/clk/msm/clock-gcc-8952.c @@ -4314,7 +4314,7 @@ static int msm_gcc_probe(struct platform_device *pdev) if (ret < 0) return ret; - if (compat_bin2) + if (compat_bin2 || compat_bin4) nbases = APCS_C0_PLL_BASE; ret = get_mmio_addr(pdev, nbases); From ca8d168250f787189cab8d4efae07af794695ec3 Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Wed, 26 Oct 2016 16:20:11 +0530 Subject: [PATCH 0272/1015] ARM: dts: msm: Enable memory allocation for diag client for 8920 The new diag client requires additional memory from hlos. This patch caters to diag memory requirement. CRs-Fixed: 1082450 Change-Id: Icde1959982ad83d202d8d19683f26e0d989b88c0 Signed-off-by: Manoj Prabhu B --- arch/arm/boot/dts/qcom/msm8917.dtsi | 2 +- arch/arm/boot/dts/qcom/msm8920-pmi8937-mtp.dts | 4 ++++ arch/arm/boot/dts/qcom/msm8920-pmi8950-mtp.dts | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index a86779151b1e0..298efe0bbb71a 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -913,7 +913,7 @@ label = "modem"; }; - qcom,client_3 { + mem_client_3_size: qcom,client_3 { compatible = "qcom,memshare-peripheral"; qcom,peripheral-size = <0x0>; qcom,client-id = <1>; diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8937-mtp.dts b/arch/arm/boot/dts/qcom/msm8920-pmi8937-mtp.dts index cc97f7acf35e4..2ddb86b22e35d 100644 --- a/arch/arm/boot/dts/qcom/msm8920-pmi8937-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8937-mtp.dts @@ -22,3 +22,7 @@ qcom,board-id= <8 0>; qcom,pmic-id = <0x10019 0x020037 0x0 0x0>; }; + +&mem_client_3_size { + qcom,peripheral-size = <0x500000>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8950-mtp.dts b/arch/arm/boot/dts/qcom/msm8920-pmi8950-mtp.dts index 4d9bdaaf20bac..be607e9425dbe 100644 --- a/arch/arm/boot/dts/qcom/msm8920-pmi8950-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8950-mtp.dts @@ -22,3 +22,7 @@ qcom,board-id= <8 0>; qcom,pmic-id = <0x10019 0x010011 0x0 0x0>; }; + +&mem_client_3_size { + qcom,peripheral-size = <0x500000>; +}; From 873bc3ba384de33b4ee43b989a017d0fd44271d1 Mon Sep 17 00:00:00 2001 From: Lijuan Gao Date: Mon, 24 Oct 2016 17:11:05 +0800 Subject: [PATCH 0273/1015] ARM: dts: msm: Add initial support for MSM8920 QRD SKU7 board Add initial set of device tree to build the MSM8920 QRD board. CRs-Fixed: 1081383 Change-Id: If15b8bc9c6953ff6d649bf7f48142c84b9be568a Signed-off-by: Lijuan Gao --- .../devicetree/bindings/arm/msm/msm.txt | 2 + arch/arm/boot/dts/qcom/Makefile | 3 +- .../dts/qcom/msm8920-pmi8940-qrd-sku7.dts | 26 +++ .../dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi | 197 ++++++++++++++++++ arch/arm/boot/dts/qcom/msm8920-qrd.dtsi | 174 ++++++++++++++++ 5 files changed, 401 insertions(+), 1 deletion(-) create mode 100644 arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts create mode 100644 arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8920-qrd.dtsi diff --git a/Documentation/devicetree/bindings/arm/msm/msm.txt b/Documentation/devicetree/bindings/arm/msm/msm.txt index 738ca1015380f..057d37ab5b320 100644 --- a/Documentation/devicetree/bindings/arm/msm/msm.txt +++ b/Documentation/devicetree/bindings/arm/msm/msm.txt @@ -223,6 +223,8 @@ compatible = "qcom,msm8917-qrd-sku5" compatible = "qcom,msm8917-qgp-tmo" compatible = "qcom,msm8920-cdp" compatible = "qcom,msm8920-mtp" +compatible = "qcom,msm8920-qrd" +compatible = "qcom,msm8920-qrd-sku7" compatible = "qcom,msm8940-cdp" compatible = "qcom,msm8940-mtp" compatible = "qcom,msm8940-rumi" diff --git a/arch/arm/boot/dts/qcom/Makefile b/arch/arm/boot/dts/qcom/Makefile index ff09bda32dcf4..aea344c391a28 100644 --- a/arch/arm/boot/dts/qcom/Makefile +++ b/arch/arm/boot/dts/qcom/Makefile @@ -193,7 +193,8 @@ dtb-$(CONFIG_ARCH_MSM8920) += msm8920-pmi8937-cdp.dtb \ msm8920-pmi8950-cdp.dtb \ msm8920-pmi8950-mtp.dtb \ msm8920-pmi8937-rcm.dtb \ - msm8920-pmi8950-rcm.dtb + msm8920-pmi8950-rcm.dtb \ + msm8920-pmi8940-qrd-sku7.dtb dtb-$(CONFIG_ARCH_MSM8940) += msm8940-pmi8937-cdp.dtb \ msm8940-pmi8937-mtp.dtb \ diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts new file mode 100644 index 0000000000000..0d8353297f1c5 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8920.dtsi" +#include "msm8920-pmi8940-qrd-sku7.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8920-PMI8940 QRD SKU7"; + compatible = "qcom,msm8920-qrd-sku7", "qcom,msm8920-qrd", + "qcom,msm8920", "qcom,qrd"; + qcom,board-id = <0x2000b 0>; + qcom,pmic-id = <0x10019 0x020040 0x0 0x0>; +}; + diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi new file mode 100644 index 0000000000000..9136fe1432ae1 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm-pmi8940.dtsi" +#include "msm8920-qrd.dtsi" +#include "msm8937-mdss-panels.dtsi" +#include "msm8940-camera-sensor-qrd.dtsi" + +/ { + qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-qrd-sku2-4v35-2590mah.dtsi" + }; +}; + +&spmi_bus { + qcom,pmi8940@2 { + qcom,leds@a100 { + status = "okay"; + qcom,led_mpp_2 { + label = "mpp"; + linux,name = "green"; + linux,default-trigger = "none"; + qcom,default-state = "off"; + qcom,max-current = <40>; + qcom,current-setting = <5>; + qcom,id = <6>; + qcom,mode = "manual"; + qcom,source-sel = <1>; + qcom,mode-ctrl = <0x60>; + }; + }; + }; +}; + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8940_flash0>; + qcom,torch-source = <&pmi8940_torch0>; + qcom,switch-source = <&pmi8940_switch>; + }; + + i2c@78b7000 { + status = "ok"; + focaltech@38 { + compatible = "focaltech,5x06"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2>; + vdd-supply = <&pm8937_l10>; + vcc_i2c-supply = <&pm8937_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active", + "pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + focaltech,name = "ft5436"; + focaltech,family-id = <0x06>; + focaltech,reset-gpio = <&tlmm 64 0x0>; + focaltech,irq-gpio = <&tlmm 65 0x2008>; + focaltech,display-coords = <0 0 720 1280>; + focaltech,panel-coords = <0 0 720 1400>; + focaltech,button-map= <139 102 158>; + focaltech,no-force-update; + focaltech,i2c-pull-up; + focaltech,group-id = <1>; + focaltech,hard-reset-delay-ms = <20>; + focaltech,soft-reset-delay-ms = <200>; + focaltech,num-max-touches = <5>; + focaltech,fw-delay-aa-ms = <30>; + focaltech,fw-delay-55-ms = <30>; + focaltech,fw-upgrade-id1 = <0x79>; + focaltech,fw-upgrade-id2 = <0x08>; + focaltech,fw-delay-readid-ms = <10>; + focaltech,fw-delay-era-flsh-ms = <2000>; + focaltech,fw-auto-cal; + focaltech,ignore-id-check; + /* Underlying clocks used by secure touch */ + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup3_i2c_apps_clk>; + }; + }; + + gen-vkeys { + compatible = "qcom,gen-vkeys"; + label = "ft5x06_ts"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <1400>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; +}; + +&sdc2_data_on { + config { + drive-strength = <12>; + }; +}; + +&flash_led { + /delete-node/ qcom,flash_1; + /delete-node/ qcom,torch_1; +}; + +&pmi_haptic { + qcom,actuator-type = "erm"; +}; + +&pmi8940_charger { + qcom,battery-data = <&qrd_batterydata>; + qcom,float-voltage-mv = <4350>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + status = "okay"; +}; + +&pmi8940_fg { + qcom,battery-data = <&qrd_batterydata>; + qcom,cold-bat-decidegc = <(-100)>; + qcom,cool-bat-decidegc = <(-100)>; + qcom,hot-bat-decidegc = <550>; + qcom,warm-bat-decidegc = <550>; + qcom,bad-battery-detection-enable; + qcom,hold-soc-while-full; +}; + +&soc { + sound { + qcom,model = "msm8920-sku7-snd-card"; + }; +}; + +&i2c_2 { + pericom-type-c@1d { + status = "disabled"; + }; +}; + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + /delete-property/ lab-supply; + /delete-property/ ibb-supply; + /delete-property/ qcom,platform-te-gpio; + + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,platform-reset-gpio = <&tlmm 60 0>; +}; + +&labibb { + status = "disabled"; +}; + +&dsi_panel_pwr_supply { + /delete-node/ qcom,panel-supply-entry@2; + /delete-node/ qcom,panel-supply-entry@3; +}; + +&dsi_hx8394f_720p_video { + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&usb_otg { + qcom,hsusb-otg-phy-init-seq = + <0x39 0x81 0x37 0x82 0xffffffff>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi new file mode 100644 index 0000000000000..d31ccddee96ff --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm8917-pinctrl.dtsi" +#include "msm8937-regulator.dtsi" + +&soc { + gpio_keys { + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend"; + pinctrl-0 = <&gpio_key_active>; + pinctrl-1 = <&gpio_key_suspend>; + + vol_up { + label = "volume_up"; + gpios = <&tlmm 91 0x1>; + linux,input-type = <1>; + linux,code = <115>; + debounce-interval = <15>; + }; + }; +}; + +&wled { + qcom,cons-sync-write-delay-us = <1000>; +}; + +&int_codec { + status = "okay"; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-gpios = + "pri_i2s"; + qcom,pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-0 = <&cdc_pdm_lines_sus &cdc_pdm_lines_2_sus>; + pinctrl-1 = <&cdc_pdm_lines_act &cdc_pdm_lines_2_act>; + qcom,cdc-us-euro-gpios; + qcom,msm-hs-micbias-type = "internal"; + qcom,audio-routing = + "RX_BIAS", "MCLK", + "SPK_RX_BIAS", "MCLK", + "INT_LDO_H", "MCLK", + "MIC BIAS External", "Handset Mic", + "MIC BIAS Internal2", "Headset Mic", + "MIC BIAS External", "Secondary Mic", + "AMIC1", "MIC BIAS External", + "AMIC2", "MIC BIAS Internal2", + "AMIC3", "MIC BIAS External"; +}; + + +&pm8937_cajon_dig { + status = "okay"; +}; + +&pm8937_cajon_analog { + status = "okay"; +}; + +&blsp1_uart2 { + status = "ok"; + pinctrl-names = "default"; + pinctrl-0 = <&uart_console_active>; +}; + +&sdhc_1 { + /* device core power supply */ + vdd-supply = <&pm8937_l8>; + qcom,vdd-voltage-level = <2900000 2900000>; + qcom,vdd-current-level = <200 570000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8937_l5>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <1800000 1800000>; + qcom,vdd-io-current-level = <200 325000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on &sdc1_rclk_on>; + pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off &sdc1_rclk_off>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 192000000 + 384000000>; + qcom,nonremovable; + qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v"; + + status = "ok"; +}; + +&sdhc_2 { + /* device core power supply */ + vdd-supply = <&pm8937_l11>; + qcom,vdd-voltage-level = <2950000 2950000>; + qcom,vdd-current-level = <15000 800000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8937_l12>; + qcom,vdd-io-voltage-level = <1800000 2950000>; + qcom,vdd-io-current-level = <200 22000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>; + pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>; + + #address-cells = <0>; + interrupt-parent = <&sdhc_2>; + interrupts = <0 1 2>; + #interrupt-cells = <1>; + interrupt-map-mask = <0xffffffff>; + interrupt-map = <0 &intc 0 125 0 + 1 &intc 0 221 0 + 2 &tlmm 67 0>; + interrupt-names = "hc_irq", "pwr_irq", "status_irq"; + cd-gpios = <&tlmm 67 0x1>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 + 200000000>; + qcom,bus-speed-mode = "SDR12", "SDR25", "SDR50", "DDR50", "SDR104"; + + status = "ok"; +}; + +&i2c_5 { /* BLSP2 QUP1 */ + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <&tlmm 17 0x00>; + qcom,nq-ven = <&tlmm 16 0x00>; + qcom,nq-firm = <&tlmm 130 0x00>; + qcom,nq-clkreq = <&pm8937_gpios 5 0x00>; + interrupt-parent = <&tlmm>; + qcom,clk-src = "BBCLK2"; + interrupts = <17 0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <&nfc_int_active &nfc_disable_active>; + pinctrl-1 = <&nfc_int_suspend &nfc_disable_suspend>; + clocks = <&clock_gcc clk_bb_clk2_pin>; + clock-names = "ref_clk"; + }; +}; + +&pm8937_gpios { + gpio@c400 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; + +&pm8937_vadc { + /delete-node/ chan@11; +}; From 4b1ffbb3cce73820e901680f8357d33e61e59896 Mon Sep 17 00:00:00 2001 From: Yeleswarapu Nagaradhesh Date: Wed, 26 Oct 2016 13:39:39 +0530 Subject: [PATCH 0274/1015] ASoC: msm: initiate mbhc_start only once MBHC init is called twice due to which some of the variables are re-initialised twice. Which is leading to crash during stability tests with headset connected. CRs-Fixed: 1080020 Change-Id: I48fddbcb846b578ceb39eadffdc067c798a48be6 Signed-off-by: Yeleswarapu Nagaradhesh --- sound/soc/msm/msm8952.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/msm/msm8952.c b/sound/soc/msm/msm8952.c index 264e28d868c23..5caf6075a6486 100644 --- a/sound/soc/msm/msm8952.c +++ b/sound/soc/msm/msm8952.c @@ -1598,7 +1598,7 @@ static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) return ret; } } - return msm8x16_wcd_hs_detect(codec, &mbhc_cfg); + return 0; } static struct snd_soc_ops msm8952_quat_mi2s_be_ops = { From 205ca1d03dc606fb315f36da000f051310421a11 Mon Sep 17 00:00:00 2001 From: Xiaojun Sang Date: Mon, 10 Oct 2016 15:44:23 +0800 Subject: [PATCH 0275/1015] ASoC: qdsp6v2: fix potential bug of infinite loop When variable bufsz equals to 0, there would be infinite loop at q6asm_audio_client_buf_alloc. Fix the potential bug by checking bufsz beforehand. CRs-Fixed: 1072280 Change-Id: I9640112b8945dc603e3af55fc1096bea9f7e6634 Signed-off-by: Xiaojun Sang --- sound/soc/msm/qdsp6v2/q6asm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index f45630425308d..be9356b98a7f2 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -1179,8 +1179,9 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, struct audio_buffer *buf; size_t len; - if (!(ac) || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); + if (!(ac) || !(bufsz) || ((dir != IN) && (dir != OUT))) { + pr_err("%s: ac %pK bufsz %d dir %d\n", __func__, ac, bufsz, + dir); return -EINVAL; } From 650fab9ffe701a48d16823df243d29b209eca545 Mon Sep 17 00:00:00 2001 From: Yeleswarapu Nagaradhesh Date: Thu, 20 Oct 2016 10:53:23 +0530 Subject: [PATCH 0276/1015] ASoC: wcd-mbhc: correct detection logic for headphone Report cable as headphone only if there is button 0 press interrupt. Otherwise SW cannot differentiate between normal GND-MIC swap and 3 pole extension cable. CRs-Fixed: 1063474 Change-Id: I63450a94ccbf6c25b935d06dc16b3a26b1d076e3 Signed-off-by: Yeleswarapu Nagaradhesh --- sound/soc/codecs/wcd-mbhc-v2.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/sound/soc/codecs/wcd-mbhc-v2.c b/sound/soc/codecs/wcd-mbhc-v2.c index 0faafde1b478b..2d44bf4565dbb 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.c +++ b/sound/soc/codecs/wcd-mbhc-v2.c @@ -1530,6 +1530,7 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) if (mbhc->mbhc_cb->enable_mb_source) mbhc->mbhc_cb->enable_mb_source(codec, true); mbhc->btn_press_intr = false; + mbhc->is_btn_press = false; wcd_mbhc_detect_plug_type(mbhc); } else if ((mbhc->current_plug != MBHC_PLUG_TYPE_NONE) && !detection_type) { @@ -1547,6 +1548,7 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) mbhc->mbhc_cb->set_cap_mode(codec, micbias1, false); mbhc->btn_press_intr = false; + mbhc->is_btn_press = false; if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) { wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, false); @@ -1741,6 +1743,7 @@ static irqreturn_t wcd_mbhc_hs_ins_irq(int irq, void *data) mic_trigerred = 0; mbhc->is_extn_cable = true; mbhc->btn_press_intr = false; + mbhc->is_btn_press = false; wcd_mbhc_detect_plug_type(mbhc); WCD_MBHC_RSC_UNLOCK(mbhc); pr_debug("%s: leave\n", __func__); @@ -1917,15 +1920,13 @@ static irqreturn_t wcd_mbhc_btn_press_handler(int irq, void *data) pr_debug("%s: enter\n", __func__); complete(&mbhc->btn_press_compl); WCD_MBHC_RSC_LOCK(mbhc); - /* send event to sw intr handler*/ - mbhc->is_btn_press = true; wcd_cancel_btn_work(mbhc); if (wcd_swch_level_remove(mbhc)) { pr_debug("%s: Switch level is low ", __func__); goto done; } - mbhc->btn_press_intr = true; + mbhc->is_btn_press = true; msec_val = jiffies_to_msecs(jiffies - mbhc->jiffies_atreport); pr_debug("%s: msec_val = %ld\n", __func__, msec_val); if (msec_val < MBHC_BUTTON_PRESS_THRESHOLD_MIN) { @@ -1939,12 +1940,15 @@ static irqreturn_t wcd_mbhc_btn_press_handler(int irq, void *data) __func__); goto done; } + mask = wcd_mbhc_get_button_mask(mbhc); + if (mask == SND_JACK_BTN_0) + mbhc->btn_press_intr = true; + if (mbhc->current_plug != MBHC_PLUG_TYPE_HEADSET) { pr_debug("%s: Plug isn't headset, ignore button press\n", __func__); goto done; } - mask = wcd_mbhc_get_button_mask(mbhc); mbhc->buttons_pressed |= mask; mbhc->mbhc_cb->lock_sleep(mbhc, true); if (schedule_delayed_work(&mbhc->mbhc_btn_dwork, @@ -1970,8 +1974,8 @@ static irqreturn_t wcd_mbhc_release_handler(int irq, void *data) goto exit; } - if (mbhc->btn_press_intr) { - mbhc->btn_press_intr = false; + if (mbhc->is_btn_press) { + mbhc->is_btn_press = false; } else { pr_debug("%s: This release is for fake btn press\n", __func__); goto exit; From 4752ebb85150044706f26d2fe05be0d2692b08bb Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Thu, 3 Nov 2016 22:40:51 +0530 Subject: [PATCH 0277/1015] ARM: dts: msm: Add bandwidth monitor devicetree under soc for msm8920 Currently bandwidth monitor devicetree entries are enabled under bus driver node. Update bandwidth monitor devicetree entries at appropriate place for msm8920. Change-Id: If66188f4d80b5f7b181f46fe1124b6049486c55b Signed-off-by: Manaf Meethalavalappu Pallikunhi --- arch/arm/boot/dts/qcom/msm8920.dtsi | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index f53f7adaf953a..3aaa696c897e6 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -50,15 +50,6 @@ qcom,bus-dev = <&fab_snoc>; qcom,mas-rpm-id = ; }; - - qcom,bm-sensors { - compatible = "qcom,bm-sensors"; - - bw_mm { - qcom,bm-sensor = <&slv_snoc_bimc_2 &mas_vfe0 &mas_vfe1>; - qcom,bm-sensor-field = "ab"; - }; - }; }; &clock_gcc { @@ -178,6 +169,15 @@ qcom,ipa-advertise-sg-support; }; + qcom,bm-sensors { + compatible = "qcom,bm-sensors"; + + bw_mm { + qcom,bm-sensor = <&slv_snoc_bimc_2 &mas_vfe0 &mas_vfe1>; + qcom,bm-sensor-field = "ab"; + }; + }; + qcom,sensor-information { sensor_information16: qcom,sensor-information-16 { qcom,sensor-type = "tsens"; From cc82fc1126ee9ca3be7acd430bf41f7fba3a5290 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Thu, 3 Nov 2016 18:28:19 +0530 Subject: [PATCH 0278/1015] clk: msm: gcc: Update the number of bases for MSM8920 Number of hwio bases needs to be updated to correct value for MSM8920, so update the same. Change-Id: I9d1ab64b6e2da4cb1d271309697b3474f638ddba Signed-off-by: Odelu Kukatla --- drivers/clk/msm/clock-gcc-8952.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c index 5239ee25f6cd4..170ae1c4853d1 100644 --- a/drivers/clk/msm/clock-gcc-8952.c +++ b/drivers/clk/msm/clock-gcc-8952.c @@ -4314,7 +4314,7 @@ static int msm_gcc_probe(struct platform_device *pdev) if (ret < 0) return ret; - if (compat_bin2) + if (compat_bin2 || compat_bin4) nbases = APCS_C0_PLL_BASE; ret = get_mmio_addr(pdev, nbases); From 783dde95da213339bf27d748e84231152d3fe534 Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Thu, 3 Nov 2016 22:40:51 +0530 Subject: [PATCH 0279/1015] ARM: dts: msm: Add bandwidth monitor devicetree under soc for msm8920 Currently bandwidth monitor devicetree entries are enabled under bus driver node. Update bandwidth monitor devicetree entries at appropriate place for msm8920. Change-Id: If66188f4d80b5f7b181f46fe1124b6049486c55b Signed-off-by: Manaf Meethalavalappu Pallikunhi --- arch/arm/boot/dts/qcom/msm8920.dtsi | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index f53f7adaf953a..3aaa696c897e6 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -50,15 +50,6 @@ qcom,bus-dev = <&fab_snoc>; qcom,mas-rpm-id = ; }; - - qcom,bm-sensors { - compatible = "qcom,bm-sensors"; - - bw_mm { - qcom,bm-sensor = <&slv_snoc_bimc_2 &mas_vfe0 &mas_vfe1>; - qcom,bm-sensor-field = "ab"; - }; - }; }; &clock_gcc { @@ -178,6 +169,15 @@ qcom,ipa-advertise-sg-support; }; + qcom,bm-sensors { + compatible = "qcom,bm-sensors"; + + bw_mm { + qcom,bm-sensor = <&slv_snoc_bimc_2 &mas_vfe0 &mas_vfe1>; + qcom,bm-sensor-field = "ab"; + }; + }; + qcom,sensor-information { sensor_information16: qcom,sensor-information-16 { qcom,sensor-type = "tsens"; From 313e0a3f51063a7870b46ebc536b2e2e0cb2dad0 Mon Sep 17 00:00:00 2001 From: Lijuan Gao Date: Mon, 24 Oct 2016 17:11:05 +0800 Subject: [PATCH 0280/1015] ARM: dts: msm: Add initial support for MSM8920 QRD SKU7 board Add initial set of device tree to build the MSM8920 QRD board. CRs-Fixed: 1081383 Change-Id: If15b8bc9c6953ff6d649bf7f48142c84b9be568a Signed-off-by: Lijuan Gao --- .../devicetree/bindings/arm/msm/msm.txt | 2 + arch/arm/boot/dts/qcom/Makefile | 3 +- .../dts/qcom/msm8920-pmi8940-qrd-sku7.dts | 26 +++ .../dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi | 197 ++++++++++++++++++ arch/arm/boot/dts/qcom/msm8920-qrd.dtsi | 174 ++++++++++++++++ 5 files changed, 401 insertions(+), 1 deletion(-) create mode 100644 arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts create mode 100644 arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8920-qrd.dtsi diff --git a/Documentation/devicetree/bindings/arm/msm/msm.txt b/Documentation/devicetree/bindings/arm/msm/msm.txt index 738ca1015380f..057d37ab5b320 100644 --- a/Documentation/devicetree/bindings/arm/msm/msm.txt +++ b/Documentation/devicetree/bindings/arm/msm/msm.txt @@ -223,6 +223,8 @@ compatible = "qcom,msm8917-qrd-sku5" compatible = "qcom,msm8917-qgp-tmo" compatible = "qcom,msm8920-cdp" compatible = "qcom,msm8920-mtp" +compatible = "qcom,msm8920-qrd" +compatible = "qcom,msm8920-qrd-sku7" compatible = "qcom,msm8940-cdp" compatible = "qcom,msm8940-mtp" compatible = "qcom,msm8940-rumi" diff --git a/arch/arm/boot/dts/qcom/Makefile b/arch/arm/boot/dts/qcom/Makefile index ff09bda32dcf4..aea344c391a28 100644 --- a/arch/arm/boot/dts/qcom/Makefile +++ b/arch/arm/boot/dts/qcom/Makefile @@ -193,7 +193,8 @@ dtb-$(CONFIG_ARCH_MSM8920) += msm8920-pmi8937-cdp.dtb \ msm8920-pmi8950-cdp.dtb \ msm8920-pmi8950-mtp.dtb \ msm8920-pmi8937-rcm.dtb \ - msm8920-pmi8950-rcm.dtb + msm8920-pmi8950-rcm.dtb \ + msm8920-pmi8940-qrd-sku7.dtb dtb-$(CONFIG_ARCH_MSM8940) += msm8940-pmi8937-cdp.dtb \ msm8940-pmi8937-mtp.dtb \ diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts new file mode 100644 index 0000000000000..0d8353297f1c5 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8920.dtsi" +#include "msm8920-pmi8940-qrd-sku7.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8920-PMI8940 QRD SKU7"; + compatible = "qcom,msm8920-qrd-sku7", "qcom,msm8920-qrd", + "qcom,msm8920", "qcom,qrd"; + qcom,board-id = <0x2000b 0>; + qcom,pmic-id = <0x10019 0x020040 0x0 0x0>; +}; + diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi new file mode 100644 index 0000000000000..9136fe1432ae1 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm-pmi8940.dtsi" +#include "msm8920-qrd.dtsi" +#include "msm8937-mdss-panels.dtsi" +#include "msm8940-camera-sensor-qrd.dtsi" + +/ { + qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-qrd-sku2-4v35-2590mah.dtsi" + }; +}; + +&spmi_bus { + qcom,pmi8940@2 { + qcom,leds@a100 { + status = "okay"; + qcom,led_mpp_2 { + label = "mpp"; + linux,name = "green"; + linux,default-trigger = "none"; + qcom,default-state = "off"; + qcom,max-current = <40>; + qcom,current-setting = <5>; + qcom,id = <6>; + qcom,mode = "manual"; + qcom,source-sel = <1>; + qcom,mode-ctrl = <0x60>; + }; + }; + }; +}; + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8940_flash0>; + qcom,torch-source = <&pmi8940_torch0>; + qcom,switch-source = <&pmi8940_switch>; + }; + + i2c@78b7000 { + status = "ok"; + focaltech@38 { + compatible = "focaltech,5x06"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2>; + vdd-supply = <&pm8937_l10>; + vcc_i2c-supply = <&pm8937_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active", + "pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + focaltech,name = "ft5436"; + focaltech,family-id = <0x06>; + focaltech,reset-gpio = <&tlmm 64 0x0>; + focaltech,irq-gpio = <&tlmm 65 0x2008>; + focaltech,display-coords = <0 0 720 1280>; + focaltech,panel-coords = <0 0 720 1400>; + focaltech,button-map= <139 102 158>; + focaltech,no-force-update; + focaltech,i2c-pull-up; + focaltech,group-id = <1>; + focaltech,hard-reset-delay-ms = <20>; + focaltech,soft-reset-delay-ms = <200>; + focaltech,num-max-touches = <5>; + focaltech,fw-delay-aa-ms = <30>; + focaltech,fw-delay-55-ms = <30>; + focaltech,fw-upgrade-id1 = <0x79>; + focaltech,fw-upgrade-id2 = <0x08>; + focaltech,fw-delay-readid-ms = <10>; + focaltech,fw-delay-era-flsh-ms = <2000>; + focaltech,fw-auto-cal; + focaltech,ignore-id-check; + /* Underlying clocks used by secure touch */ + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup3_i2c_apps_clk>; + }; + }; + + gen-vkeys { + compatible = "qcom,gen-vkeys"; + label = "ft5x06_ts"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <1400>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; +}; + +&sdc2_data_on { + config { + drive-strength = <12>; + }; +}; + +&flash_led { + /delete-node/ qcom,flash_1; + /delete-node/ qcom,torch_1; +}; + +&pmi_haptic { + qcom,actuator-type = "erm"; +}; + +&pmi8940_charger { + qcom,battery-data = <&qrd_batterydata>; + qcom,float-voltage-mv = <4350>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + status = "okay"; +}; + +&pmi8940_fg { + qcom,battery-data = <&qrd_batterydata>; + qcom,cold-bat-decidegc = <(-100)>; + qcom,cool-bat-decidegc = <(-100)>; + qcom,hot-bat-decidegc = <550>; + qcom,warm-bat-decidegc = <550>; + qcom,bad-battery-detection-enable; + qcom,hold-soc-while-full; +}; + +&soc { + sound { + qcom,model = "msm8920-sku7-snd-card"; + }; +}; + +&i2c_2 { + pericom-type-c@1d { + status = "disabled"; + }; +}; + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + /delete-property/ lab-supply; + /delete-property/ ibb-supply; + /delete-property/ qcom,platform-te-gpio; + + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,platform-reset-gpio = <&tlmm 60 0>; +}; + +&labibb { + status = "disabled"; +}; + +&dsi_panel_pwr_supply { + /delete-node/ qcom,panel-supply-entry@2; + /delete-node/ qcom,panel-supply-entry@3; +}; + +&dsi_hx8394f_720p_video { + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&usb_otg { + qcom,hsusb-otg-phy-init-seq = + <0x39 0x81 0x37 0x82 0xffffffff>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi new file mode 100644 index 0000000000000..d31ccddee96ff --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm8917-pinctrl.dtsi" +#include "msm8937-regulator.dtsi" + +&soc { + gpio_keys { + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend"; + pinctrl-0 = <&gpio_key_active>; + pinctrl-1 = <&gpio_key_suspend>; + + vol_up { + label = "volume_up"; + gpios = <&tlmm 91 0x1>; + linux,input-type = <1>; + linux,code = <115>; + debounce-interval = <15>; + }; + }; +}; + +&wled { + qcom,cons-sync-write-delay-us = <1000>; +}; + +&int_codec { + status = "okay"; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-gpios = + "pri_i2s"; + qcom,pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-0 = <&cdc_pdm_lines_sus &cdc_pdm_lines_2_sus>; + pinctrl-1 = <&cdc_pdm_lines_act &cdc_pdm_lines_2_act>; + qcom,cdc-us-euro-gpios; + qcom,msm-hs-micbias-type = "internal"; + qcom,audio-routing = + "RX_BIAS", "MCLK", + "SPK_RX_BIAS", "MCLK", + "INT_LDO_H", "MCLK", + "MIC BIAS External", "Handset Mic", + "MIC BIAS Internal2", "Headset Mic", + "MIC BIAS External", "Secondary Mic", + "AMIC1", "MIC BIAS External", + "AMIC2", "MIC BIAS Internal2", + "AMIC3", "MIC BIAS External"; +}; + + +&pm8937_cajon_dig { + status = "okay"; +}; + +&pm8937_cajon_analog { + status = "okay"; +}; + +&blsp1_uart2 { + status = "ok"; + pinctrl-names = "default"; + pinctrl-0 = <&uart_console_active>; +}; + +&sdhc_1 { + /* device core power supply */ + vdd-supply = <&pm8937_l8>; + qcom,vdd-voltage-level = <2900000 2900000>; + qcom,vdd-current-level = <200 570000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8937_l5>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <1800000 1800000>; + qcom,vdd-io-current-level = <200 325000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on &sdc1_rclk_on>; + pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off &sdc1_rclk_off>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 192000000 + 384000000>; + qcom,nonremovable; + qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v"; + + status = "ok"; +}; + +&sdhc_2 { + /* device core power supply */ + vdd-supply = <&pm8937_l11>; + qcom,vdd-voltage-level = <2950000 2950000>; + qcom,vdd-current-level = <15000 800000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8937_l12>; + qcom,vdd-io-voltage-level = <1800000 2950000>; + qcom,vdd-io-current-level = <200 22000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>; + pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>; + + #address-cells = <0>; + interrupt-parent = <&sdhc_2>; + interrupts = <0 1 2>; + #interrupt-cells = <1>; + interrupt-map-mask = <0xffffffff>; + interrupt-map = <0 &intc 0 125 0 + 1 &intc 0 221 0 + 2 &tlmm 67 0>; + interrupt-names = "hc_irq", "pwr_irq", "status_irq"; + cd-gpios = <&tlmm 67 0x1>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 + 200000000>; + qcom,bus-speed-mode = "SDR12", "SDR25", "SDR50", "DDR50", "SDR104"; + + status = "ok"; +}; + +&i2c_5 { /* BLSP2 QUP1 */ + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <&tlmm 17 0x00>; + qcom,nq-ven = <&tlmm 16 0x00>; + qcom,nq-firm = <&tlmm 130 0x00>; + qcom,nq-clkreq = <&pm8937_gpios 5 0x00>; + interrupt-parent = <&tlmm>; + qcom,clk-src = "BBCLK2"; + interrupts = <17 0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <&nfc_int_active &nfc_disable_active>; + pinctrl-1 = <&nfc_int_suspend &nfc_disable_suspend>; + clocks = <&clock_gcc clk_bb_clk2_pin>; + clock-names = "ref_clk"; + }; +}; + +&pm8937_gpios { + gpio@c400 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; + +&pm8937_vadc { + /delete-node/ chan@11; +}; From 30e790ad755c4ec30efeaf21c0abab9fc9284aa7 Mon Sep 17 00:00:00 2001 From: Krishna Chaitanya Devarakonda Date: Fri, 14 Oct 2016 00:44:08 +0530 Subject: [PATCH 0281/1015] msm: mdss: Add support for direct secure dispaly transition In the current implementation, during secure to non secure and non secure to secure transitions, a NULL commit will be issued by the framework to make sure that the previous settings are completely cleared. This is not required for command mode panels, as we can wait for the frame transfer when the transition happens. Adding support to wait for the previous frame transfer completion, during the non secure to secure and vice-versa transitions. Change-Id: Id17b456b5b0744cff2f53688b7857569e4d257d6 Signed-off-by: Krishna Chaitanya Devarakonda --- drivers/video/msm/mdss/mdss_mdp.c | 10 ++- drivers/video/msm/mdss/mdss_mdp.h | 13 +++- drivers/video/msm/mdss/mdss_mdp_layer.c | 54 +++++++++++++-- drivers/video/msm/mdss/mdss_mdp_overlay.c | 84 ++++++++++++++--------- 4 files changed, 119 insertions(+), 42 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp.c b/drivers/video/msm/mdss/mdss_mdp.c index 6ee1f919c8a29..b57ca77f4deb6 100644 --- a/drivers/video/msm/mdss/mdss_mdp.c +++ b/drivers/video/msm/mdss/mdss_mdp.c @@ -4788,7 +4788,8 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on) } } -int mdss_mdp_secure_display_ctrl(unsigned int enable) +int mdss_mdp_secure_display_ctrl(struct mdss_data_type *mdata, + unsigned int enable) { struct sd_ctrl_req { unsigned int enable; @@ -4797,6 +4798,12 @@ int mdss_mdp_secure_display_ctrl(unsigned int enable) int ret = 0; struct scm_desc desc; + if ((enable && (mdss_get_sd_client_cnt() > 0)) || + (!enable && (mdss_get_sd_client_cnt() > 1))) { + mdss_update_sd_client(mdata, enable); + return ret; + } + desc.args[0] = request.enable = enable; desc.arginfo = SCM_ARGS(1); @@ -4814,6 +4821,7 @@ int mdss_mdp_secure_display_ctrl(unsigned int enable) if (ret) return ret; + mdss_update_sd_client(mdata, enable); return resp; } diff --git a/drivers/video/msm/mdss/mdss_mdp.h b/drivers/video/msm/mdss/mdss_mdp.h index d4a6ecbc9f441..9dd4eaeb33388 100644 --- a/drivers/video/msm/mdss/mdss_mdp.h +++ b/drivers/video/msm/mdss/mdss_mdp.h @@ -114,6 +114,12 @@ enum mdss_mdp_mixer_mux { MDSS_MDP_MIXER_MUX_RIGHT, }; +enum mdss_sd_transition { + SD_TRANSITION_NONE, + SD_TRANSITION_SECURE_TO_NON_SECURE, + SD_TRANSITION_NON_SECURE_TO_SECURE +}; + static inline enum mdss_mdp_sspp_index get_pipe_num_from_ndx(u32 ndx) { u32 id; @@ -823,6 +829,8 @@ struct mdss_overlay_private { u32 ad_bl_events; bool allow_kickoff; + + u8 sd_transition_state; }; struct mdss_mdp_set_ot_params { @@ -1119,7 +1127,7 @@ static inline struct clk *mdss_mdp_get_clk(u32 clk_idx) } static inline void mdss_update_sd_client(struct mdss_data_type *mdata, - bool status) + unsigned int status) { if (status) atomic_inc(&mdata->sd_client_count); @@ -1418,7 +1426,8 @@ unsigned long mdss_mdp_get_clk_rate(u32 clk_idx, bool locked); int mdss_mdp_vsync_clk_enable(int enable, bool locked); void mdss_mdp_clk_ctrl(int enable); struct mdss_data_type *mdss_mdp_get_mdata(void); -int mdss_mdp_secure_display_ctrl(unsigned int enable); +int mdss_mdp_secure_display_ctrl(struct mdss_data_type *mdata, + unsigned int enable); int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd); int mdss_mdp_dfps_update_params(struct msm_fb_data_type *mfd, diff --git a/drivers/video/msm/mdss/mdss_mdp_layer.c b/drivers/video/msm/mdss/mdss_mdp_layer.c index e0a4a88dea09c..23bba6b46ff13 100644 --- a/drivers/video/msm/mdss/mdss_mdp_layer.c +++ b/drivers/video/msm/mdss/mdss_mdp_layer.c @@ -1107,6 +1107,40 @@ static struct mdss_mdp_pipe *__assign_pipe_for_layer( return pipe; } +/* + * __is_sd_state_valid() - validate secure display state + * + * This function checks if the current state of secrure display is valid, + * based on the new settings. + * For command mode panels, the sd state would be invalid if a non secure pipe + * comes and one of the below condition is met: + * 1) Secure Display is enabled for current client, and there is other + secure client. + * 2) Secure Display is disabled for current client, and there is other + secure client. + * 3) Secure pipes are already staged for the current client. + * For other panels, the sd state would be invalid if a non secure pipe comes + * and one of the below condition is met: + * 1) Secure Display is enabled for current or other client. + * 2) Secure pipes are already staged for the current client. + * + */ +static inline bool __is_sd_state_valid(uint32_t sd_pipes, uint32_t nonsd_pipes, + int panel_type, u32 sd_enabled) +{ + if (panel_type == MIPI_CMD_PANEL) { + if ((((mdss_get_sd_client_cnt() > 1) && sd_enabled) || + (mdss_get_sd_client_cnt() && !sd_enabled) || + sd_pipes) + && nonsd_pipes) + return false; + } else { + if ((sd_pipes || mdss_get_sd_client_cnt()) && nonsd_pipes) + return false; + } + return true; +} + /* * __validate_secure_display() - validate secure display * @@ -1119,6 +1153,8 @@ static int __validate_secure_display(struct mdss_overlay_private *mdp5_data) { struct mdss_mdp_pipe *pipe, *tmp; uint32_t sd_pipes = 0, nonsd_pipes = 0; + int panel_type = mdp5_data->ctl->panel_data->panel_info.type; + int ret = 0; mutex_lock(&mdp5_data->list_lock); list_for_each_entry_safe(pipe, tmp, &mdp5_data->pipes_used, list) { @@ -1132,14 +1168,21 @@ static int __validate_secure_display(struct mdss_overlay_private *mdp5_data) pr_debug("pipe count:: secure display:%d non-secure:%d\n", sd_pipes, nonsd_pipes); - if ((sd_pipes || mdss_get_sd_client_cnt()) && nonsd_pipes) { + mdp5_data->sd_transition_state = SD_TRANSITION_NONE; + if (!__is_sd_state_valid(sd_pipes, nonsd_pipes, panel_type, + mdp5_data->sd_enabled)) { pr_err("non-secure layer validation request during secure display session\n"); pr_err(" secure client cnt:%d secure pipe cnt:%d non-secure pipe cnt:%d\n", mdss_get_sd_client_cnt(), sd_pipes, nonsd_pipes); - return -EINVAL; - } else { - return 0; + ret = -EINVAL; + } else if (!mdp5_data->sd_enabled && sd_pipes) { + mdp5_data->sd_transition_state = + SD_TRANSITION_NON_SECURE_TO_SECURE; + } else if (mdp5_data->sd_enabled && !sd_pipes) { + mdp5_data->sd_transition_state = + SD_TRANSITION_SECURE_TO_NON_SECURE; } + return ret; } /* @@ -1963,7 +2006,8 @@ int mdss_mdp_layer_pre_commit(struct msm_fb_data_type *mfd, /* handle null commit */ if (!layer_count) { __handle_free_list(mdp5_data, NULL, layer_count); - return 0; + /* Check for secure state transition. */ + return __validate_secure_display(mdp5_data); } validate_info_list = kcalloc(layer_count, sizeof(*validate_info_list), diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index bd3be5d0a906d..08f4b9cd46f5a 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -1959,6 +1959,42 @@ static void __validate_and_set_roi(struct msm_fb_data_type *mfd, mdss_mdp_set_roi(ctl, &l_roi, &r_roi); } +static int __config_secure_display(struct mdss_overlay_private *mdp5_data) +{ + int panel_type = mdp5_data->ctl->panel_data->panel_info.type; + int sd_enable = -1; /* Since 0 is a valid state, initialize with -1 */ + int ret = 0; + + if (panel_type == MIPI_CMD_PANEL) + mdss_mdp_display_wait4pingpong(mdp5_data->ctl, true); + + /* + * Start secure display session if we are transitioning from non secure + * to secure display. + */ + if (mdp5_data->sd_transition_state == + SD_TRANSITION_NON_SECURE_TO_SECURE) + sd_enable = 1; + + /* + * For command mode panels, if we are trasitioning from secure to + * non secure session, disable the secure display, as we've already + * waited for the previous frame transfer. + */ + if ((panel_type == MIPI_CMD_PANEL) && + (mdp5_data->sd_transition_state == + SD_TRANSITION_SECURE_TO_NON_SECURE)) + sd_enable = 0; + + if (sd_enable != -1) { + ret = mdss_mdp_secure_display_ctrl(mdp5_data->mdata, sd_enable); + if (!ret) + mdp5_data->sd_enabled = sd_enable; + } + + return ret; +} + int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, struct mdp_display_commit *data) { @@ -1966,7 +2002,6 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, struct mdss_mdp_pipe *pipe, *tmp; struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd); int ret = 0; - int sd_in_pipe = 0; struct mdss_mdp_commit_cb commit_cb; if (!ctl) @@ -1999,30 +2034,6 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, } mutex_lock(&mdp5_data->list_lock); - /* - * check if there is a secure display session - */ - list_for_each_entry(pipe, &mdp5_data->pipes_used, list) { - if (pipe->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION) { - sd_in_pipe = 1; - pr_debug("Secure pipe: %u : %08X\n", - pipe->num, pipe->flags); - } - } - - /* - * start secure display session if there is secure display session and - * sd_enabled is not true. - */ - if (!mdp5_data->sd_enabled && sd_in_pipe) { - if (!mdss_get_sd_client_cnt()) - ret = mdss_mdp_secure_display_ctrl(1); - if (!ret) { - mdp5_data->sd_enabled = 1; - mdss_update_sd_client(mdp5_data->mdata, true); - } - } - if (!ctl->shared_lock) mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_BEGIN); @@ -2035,6 +2046,14 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, if (ctl->ops.wait_pingpong && mdp5_data->mdata->serialize_wait4pp) mdss_mdp_display_wait4pingpong(ctl, true); + if (mdp5_data->sd_transition_state != SD_TRANSITION_NONE) { + ret = __config_secure_display(mdp5_data); + if (IS_ERR_VALUE(ret)) { + pr_err("Secure session config failed\n"); + goto commit_fail; + } + } + /* * Setup pipe in solid fill before unstaging, * to ensure no fetches are happening after dettach or reattach. @@ -2111,17 +2130,14 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, mutex_lock(&mdp5_data->ov_lock); /* - * If there is no secure display session and sd_enabled, disable the - * secure display session + * If we are transitioning from secure to non-secure display, + * disable the secure display. */ - if (mdp5_data->sd_enabled && !sd_in_pipe && !ret) { - /* disable the secure display on last client */ - if (mdss_get_sd_client_cnt() == 1) - ret = mdss_mdp_secure_display_ctrl(0); - if (!ret) { - mdss_update_sd_client(mdp5_data->mdata, false); + if (mdp5_data->sd_enabled && (mdp5_data->sd_transition_state == + SD_TRANSITION_SECURE_TO_NON_SECURE)) { + ret = mdss_mdp_secure_display_ctrl(mdp5_data->mdata, 0); + if (!ret) mdp5_data->sd_enabled = 0; - } } mdss_fb_update_notify_update(mfd); From 7c22b71efeb3a2213ecc16783739183e9ba325c7 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Mon, 7 Nov 2016 21:40:39 +0530 Subject: [PATCH 0282/1015] Revert "clk: msm: gcc: Add support for 650MHz for GPU clock for MSM8920" MSM8920 requires to support the maximum frequency of 650MHz for GPU clock based on efuse value. The support for the same already exists so revert the below commit which added support for unconditional GPU clock fmax of 650MHz. 'commit e1f94d88433b ("clk: msm: gcc: Add support for 650MHz for GPU clock for MSM8920")'. Change-Id: I56862e5d0e75bc765158316028990d945cde0603 Signed-off-by: Odelu Kukatla --- drivers/clk/msm/clock-gcc-8952.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c index 8cb91e7280ea9..170ae1c4853d1 100644 --- a/drivers/clk/msm/clock-gcc-8952.c +++ b/drivers/clk/msm/clock-gcc-8952.c @@ -4417,12 +4417,6 @@ static int msm_gcc_probe(struct platform_device *pdev) vdd_hf_pll.cur_level = VDD_HF_PLL_NUM_8917; get_speed_bin(pdev, &speed_bin); override_for_8917(speed_bin); - - if (compat_bin4) { - gfx3d_clk_src.freq_tbl = - ftbl_gcc_oxili_gfx3d_clk_8917_650MHz; - gfx3d_clk_src.c.fmax[VDD_DIG_HIGH] = 650000000; - } } else { gpll0_clk_src.c.parent = &gpll0_clk_src_8952.c; gpll0_ao_clk_src.c.parent = &gpll0_ao_clk_src_8952.c; From 0011f57c1fd29a172bfac28e42c8aecc820806dc Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Fri, 28 Oct 2016 16:40:56 +0530 Subject: [PATCH 0283/1015] ARM: dts: msm: update APCC/GFX CPR regulator configuration for msm8996pro As per the hardware documentation, update the regulator configuration for apc0, apc1, gfx CPR regulators to support new speed bins in msm8996pro. CRs-Fixed: 1083423 Change-Id: I97b9b98305e3478012664b636df26299eca66f26 Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8996pro.dtsi | 288 +++++++++++++++++++++++-- 1 file changed, 265 insertions(+), 23 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8996pro.dtsi b/arch/arm/boot/dts/qcom/msm8996pro.dtsi index a9878d11d2e46..58da50b9a5e3a 100644 --- a/arch/arm/boot/dts/qcom/msm8996pro.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996pro.dtsi @@ -41,15 +41,18 @@ regulator-max-microvolt = <20>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <20 20>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <20 20 19>; qcom,cpr-corners = /* Speed bin 0 */ <20 20 20 20 20 20 20 20>, /* Speed bin 1 */ - <20 20 20 20 20 20 20 20>; + <20 20 20 20 20 20 20 20>, + + /* Speed bin 2 */ + <19 19 19 19 19 19 19 19>; qcom,cpr-corner-fmax-map = /* Speed bin 0 */ @@ -70,6 +73,16 @@ <3 6 9 14 19>, <3 6 9 14 19>, <3 6 9 14 19>, + <3 6 9 14 19>, + + /* Speed bin 2 */ + <1 6 9 14 19>, + <1 6 9 14 19>, + <3 6 9 14 19>, + <3 6 9 14 19>, + <3 6 9 14 19>, + <3 6 9 14 19>, + <3 6 9 14 19>, <3 6 9 14 19>; qcom,cpr-voltage-ceiling = @@ -81,7 +94,12 @@ /* Speed bin 1 */ <670000 670000 670000 670000 670000 670000 745000 745000 745000 905000 905000 905000 905000 905000 1140000 1140000 - 1140000 1140000 1140000 1140000>; + 1140000 1140000 1140000 1140000>, + + /* Speed bin 2 */ + <670000 670000 670000 670000 670000 670000 745000 745000 + 745000 905000 905000 905000 905000 905000 1140000 1140000 + 1140000 1140000 1140000>; qcom,cpr-voltage-floor = /* Speed bin 0 */ @@ -92,7 +110,12 @@ /* Speed bin 1 */ <470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 - 470000 470000 470000 470000>; + 470000 470000 470000 470000>, + + /* Speed bin 2 */ + <470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000>; qcom,cpr-floor-to-ceiling-max-range = /* Speed bin 0 */ @@ -103,7 +126,12 @@ /* Speed bin 1 */ <80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 - 80000 80000 80000 80000>; + 80000 80000 80000 80000>, + + /* Speed bin 2 */ + <80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000>; qcom,corner-frequencies = /* Speed bin 0 */ @@ -116,7 +144,13 @@ <307200000 384000000 460800000 537600000 614400000 691200000 768000000 844800000 902400000 979200000 1056000000 1132800000 1209600000 1286400000 1363200000 - 1440000000 1516800000 1593600000 1785600000 1996800000>; + 1440000000 1516800000 1593600000 1785600000 1996800000>, + + /* Speed bin 2 */ + <307200000 384000000 460800000 537600000 614400000 + 691200000 768000000 844800000 902400000 979200000 + 1056000000 1132800000 1209600000 1286400000 1363200000 + 1440000000 1516800000 1593600000 1785600000>; qcom,cpr-ro-scaling-factor = <0 0 3112 2666 2947 2543 2271 1979 2623 2317 2772 2450 0 0 0 0>, @@ -144,6 +178,16 @@ < 0 0 0 0 0 >, < 0 0 0 0 0 >, < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + + /* Speed bin 2 */ + <(-45000) 0 0 (-25000) 0 >, + < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + < 0 0 0 0 0 >, < 0 0 0 0 0 >; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -165,6 +209,16 @@ < 0 (-15000) (-15000) (-15000) (-15000)>, < 0 (-15000) (-15000) (-15000) (-15000)>, < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + + /* Speed bin 2 */ + <(-55000) (-25000) (-5000) (-20000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, < 0 (-15000) (-15000) (-15000) (-15000)>; qcom,cpr-open-loop-voltage-adjustment = @@ -176,14 +230,22 @@ /* Speed bin 1 */ <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) (-25000) - (-26000) (-27000) (-27000) (-28000) (-30000) 70000>; + (-26000) (-27000) (-27000) (-28000) (-30000) 70000>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) + (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) (-25000) + (-26000) (-27000) (-27000) (-28000) (-30000)>; qcom,cpr-open-loop-voltage-min-diff = /* Speed bin 0 */ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>, /* Speed bin 1 */ - <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>; + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>, + + /* Speed bin 2 */ + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0>; qcom,cpr-closed-loop-voltage-adjustment = /* Speed bin 0 */ @@ -194,10 +256,15 @@ /* Speed bin 1 */ <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) (-25000) - (-26000) (-27000) (-27000) (-28000) (-30000) 60000>; + (-26000) (-27000) (-27000) (-28000) (-30000) 60000>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) + (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) (-25000) + (-26000) (-27000) (-27000) (-28000) (-30000)>; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <14 14>; + qcom,cpr-aging-ref-corner = <14 14 14>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = <1>; qcom,allow-aging-open-loop-voltage-adjustment = <1>; @@ -213,14 +280,17 @@ qcom,proxy-consumer-voltage = <14 19>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <19 19>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <19 19 19>; qcom,cpr-corners = /* Speed bin 0 */ <19 19 19 19 19 19 19 19>, /* Speed bin 1 */ + <19 19 19 19 19 19 19 19>, + + /* Speed bin 2 */ <19 19 19 19 19 19 19 19>; qcom,cpr-corner-fmax-map = @@ -228,6 +298,9 @@ <1 4 7 14 19>, /* Speed bin 1 */ + <1 4 7 14 19>, + + /* Speed bin 2 */ <1 4 7 14 19>; qcom,cpr-voltage-ceiling = @@ -237,6 +310,11 @@ 1140000 1140000 1140000>, /* Speed bin 1 */ + <670000 670000 670000 670000 745000 745000 745000 905000 + 905000 905000 905000 905000 905000 905000 1140000 1140000 + 1140000 1140000 1140000>, + + /* Speed bin 2 */ <670000 670000 670000 670000 745000 745000 745000 905000 905000 905000 905000 905000 905000 905000 1140000 1140000 1140000 1140000 1140000>; @@ -248,6 +326,11 @@ 470000 470000 470000>, /* Speed bin 1 */ + <470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000>, + + /* Speed bin 2 */ <470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000>; @@ -259,6 +342,11 @@ 80000 80000 80000>, /* Speed bin 1 */ + <80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000>, + + /* Speed bin 2 */ <80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000>; @@ -271,6 +359,12 @@ 1363200000 1440000000 1516800000 1593600000>, /* Speed bin 1 */ + <192000000 307200000 384000000 441600000 537600000 + 614400000 691200000 768000000 844800000 902400000 + 979200000 1056000000 1132800000 1190400000 1286400000 + 1363200000 1440000000 1516800000 1593600000>, + + /* Speed bin 2 */ <192000000 307200000 384000000 441600000 537600000 614400000 691200000 768000000 844800000 902400000 979200000 1056000000 1132800000 1190400000 1286400000 @@ -302,6 +396,16 @@ < 0 0 0 15000 0 >, < 0 0 0 15000 0 >, < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, + + /* Speed bin 2 */ + <(-40000) 0 0 (-10000) (-50000)>, + < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, < 0 0 0 15000 0 >; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -323,10 +427,20 @@ <(-15000) (-10000) 5000 20000 0 >, <(-15000) (-10000) 5000 20000 0 >, <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, + + /* Speed bin 2 */ + <(-45000) (-25000) 10000 (-10000) (-40000)>, + <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, <(-15000) (-10000) 5000 20000 0 >; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <14 14>; + qcom,cpr-aging-ref-corner = <14 14 14>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = <1>; qcom,allow-aging-open-loop-voltage-adjustment = <1>; @@ -337,14 +451,17 @@ regulator-max-microvolt = <27>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <27 25>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <27 25 25>; qcom,cpr-corners = /* Speed bin 0 */ <27 27 27 27 27 27 27 27>, /* Speed bin 1 */ + <25 25 25 25 25 25 25 25>, + + /* Speed bin 2 */ <25 25 25 25 25 25 25 25>; qcom,cpr-corner-fmax-map = @@ -366,6 +483,16 @@ <4 7 10 15 25>, <4 7 10 15 25>, <4 7 10 15 25>, + <4 7 10 15 25>, + + /* Speed bin 2 */ + <1 7 10 15 25>, + <1 7 10 15 25>, + <4 7 10 15 25>, + <4 7 10 15 25>, + <4 7 10 15 25>, + <4 7 10 15 25>, + <4 7 10 15 25>, <4 7 10 15 25>; qcom,cpr-voltage-ceiling = @@ -379,6 +506,12 @@ <670000 670000 670000 670000 670000 670000 670000 745000 745000 745000 905000 905000 905000 905000 905000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 + 1140000>, + + /* Speed bin 2 */ + <670000 670000 670000 670000 670000 670000 670000 745000 + 745000 745000 905000 905000 905000 905000 905000 1140000 + 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000>; qcom,cpr-voltage-floor = @@ -389,6 +522,12 @@ 470000 470000 470000>, /* Speed bin 1 */ + <470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 470000 470000 470000 + 470000>, + + /* Speed bin 2 */ <470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 @@ -402,6 +541,12 @@ 80000 80000 80000>, /* Speed bin 1 */ + <80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 80000 80000 80000 + 80000>, + + /* Speed bin 2 */ <80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 @@ -421,6 +566,13 @@ 691200000 748800000 825600000 902400000 979200000 1056000000 1132800000 1209600000 1286400000 1363200000 1440000000 1516800000 1593600000 1670400000 1747200000 + 1824000000 1900800000 1977600000 2054400000 2150400000>, + + /* Speed bin 2 */ + <307200000 384000000 460800000 537600000 614400000 + 691200000 748800000 825600000 902400000 979200000 + 1056000000 1132800000 1209600000 1286400000 1363200000 + 1440000000 1516800000 1593600000 1670400000 1747200000 1824000000 1900800000 1977600000 2054400000 2150400000>; qcom,cpr-ro-scaling-factor = @@ -449,6 +601,16 @@ < 0 0 0 0 0 >, < 0 0 0 0 0 >, < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + + /* Speed bin 2 */ + <(-45000) 0 15000 (-20000) 0 >, + < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + < 0 0 0 0 0 >, < 0 0 0 0 0 >; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -470,6 +632,16 @@ < 0 (-10000) (-15000) 0 (-10000)>, < 0 (-10000) (-15000) 0 (-10000)>, < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + + /* Speed bin 2 */ + <(-55000) (-20000) 15000 (-15000) (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, < 0 (-10000) (-15000) 0 (-10000)>; qcom,cpr-open-loop-voltage-adjustment = @@ -480,6 +652,12 @@ (-28000) (-29000) (-29000) (-30000) (-30000) (-30000)>, /* Speed bin 1 */ + <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) + (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) + (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) + (-28000) (-29000) (-29000) (-30000)>, + + /* Speed bin 2 */ <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) @@ -490,6 +668,9 @@ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>, /* Speed bin 1 */ + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>, + + /* Speed bin 2 */ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>; qcom,cpr-closed-loop-voltage-adjustment = @@ -499,6 +680,12 @@ (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) (-28000) (-29000) (-29000) (-30000) (-30000) (-30000)>, + /* Speed bin 1 */ + <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) + (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) + (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) + (-28000) (-29000) (-29000) (-30000)>, + /* Speed bin 1 */ <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) @@ -506,7 +693,7 @@ (-28000) (-29000) (-29000) (-30000)>; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <15 15>; + qcom,cpr-aging-ref-corner = <15 15 15>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = <1>; qcom,allow-aging-open-loop-voltage-adjustment = <1>; @@ -532,14 +719,17 @@ regulator-max-microvolt = <9>; qcom,cpr-fuse-corners = <4>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <9 9>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <9 9 9>; qcom,cpr-corners = /* Speed bin 0 */ <9 9 9 9 9 9 9 9>, /* Speed bin 1 */ + <9 9 9 9 9 9 9 9>, + + /* Speed bin 2 */ <9 9 9 9 9 9 9 9>; qcom,cpr-corner-fmax-map = @@ -547,6 +737,9 @@ <2 4 6 9>, /* Speed bin 1 */ + <2 4 6 9>, + + /* Speed bin 2 */ <2 4 6 9>; qcom,cpr-voltage-ceiling = @@ -556,6 +749,10 @@ /* Speed bin 1 */ <400000 670000 670000 745000 825000 905000 960000 1015000 + 1065000>, + + /* Speed bin 2 */ + <400000 670000 670000 745000 825000 905000 960000 1015000 1065000>; qcom,cpr-voltage-floor = @@ -564,6 +761,10 @@ 520000>, /* Speed bin 1 */ + <400000 520000 520000 520000 520000 520000 520000 520000 + 520000>, + + /* Speed bin 2 */ <400000 520000 520000 520000 520000 520000 520000 520000 520000>; @@ -572,6 +773,9 @@ <1 1 1 1 2 2 2 2 2>, /* Speed bin 1 */ + <1 1 1 1 2 2 2 2 2>, + + /* Speed bin 2 */ <1 1 1 1 2 2 2 2 2>; qcom,corner-frequencies = @@ -580,6 +784,10 @@ 624000000 652800000>, /* Speed bin 1 */ + <0 133000000 214000000 315000000 401800000 510000000 560000000 + 624000000 652800000>, + + /* Speed bin 2 */ <0 133000000 214000000 315000000 401800000 510000000 560000000 624000000 652800000>; @@ -604,6 +812,17 @@ <0 0 0 0 0 0 577 543 798 768 823 810 0 0 0 0>, <0 0 0 0 0 0 669 629 886 864 924 911 0 0 0 0>, <0 0 0 0 0 0 771 725 984 970 1036 1024 0 0 0 0>, + <0 0 0 0 0 0 908 868 1118 1106 1179 1174 0 0 0 0>, + + /* Speed bin 2 */ + <0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>, + <0 0 0 0 0 0 185 179 291 299 304 319 0 0 0 0>, + <0 0 0 0 0 0 287 273 425 426 443 453 0 0 0 0>, + <0 0 0 0 0 0 414 392 584 576 608 612 0 0 0 0>, + <0 0 0 0 0 0 459 431 684 644 692 679 0 0 0 0>, + <0 0 0 0 0 0 577 543 798 768 823 810 0 0 0 0>, + <0 0 0 0 0 0 669 629 886 864 924 911 0 0 0 0>, + <0 0 0 0 0 0 771 725 984 970 1036 1024 0 0 0 0>, <0 0 0 0 0 0 908 868 1118 1106 1179 1174 0 0 0 0>; qcom,cpr-ro-scaling-factor = @@ -627,6 +846,17 @@ <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + + /* Speed bin 2 */ + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>; qcom,cpr-open-loop-voltage-fuse-adjustment = @@ -634,6 +864,9 @@ <(-85000) (-15000) (-15000) (-40000)>, /* Speed bin 1 */ + <(-85000) (-15000) (-15000) (-40000)>, + + /* Speed bin 2 */ <(-85000) (-15000) (-15000) (-40000)>; qcom,cpr-closed-loop-voltage-adjustment = @@ -641,6 +874,9 @@ <0 0 30000 10000 10000 45000 25000 25000 (-35000)>, /* Speed bin 1 */ + <0 0 30000 10000 10000 45000 25000 25000 (-35000)>, + + /* Speed bin 2 */ <0 0 30000 10000 10000 45000 25000 25000 (-35000)>; qcom,cpr-floor-to-ceiling-max-range = @@ -648,6 +884,9 @@ <0 70000 70000 75000 80000 90000 95000 100000 100000>, /* Speed bin 1 */ + <0 70000 70000 75000 80000 90000 95000 100000 100000>, + + /* Speed bin 2 */ <0 70000 70000 75000 80000 90000 95000 100000 100000>; qcom,cpr-fused-closed-loop-voltage-adjustment-map = @@ -655,6 +894,9 @@ <0 2 2 2 2 0 0 4 4>, /* Speed bin 1 */ + <0 2 2 2 2 0 0 4 4>, + + /* Speed bin 2 */ <0 2 2 2 2 0 0 4 4>; qcom,cpr-aging-max-voltage-adjustment = <15000>; From b2943efe4b6acd4fe88a6272db569411a593a180 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Mon, 7 Nov 2016 21:40:39 +0530 Subject: [PATCH 0284/1015] Revert "clk: msm: gcc: Add support for 650MHz for GPU clock for MSM8920" MSM8920 requires to support the maximum frequency of 650MHz for GPU clock based on efuse value. The support for the same already exists so revert the below commit which added support for unconditional GPU clock fmax of 650MHz. 'commit e1f94d88433b ("clk: msm: gcc: Add support for 650MHz for GPU clock for MSM8920")'. Change-Id: I56862e5d0e75bc765158316028990d945cde0603 Signed-off-by: Odelu Kukatla --- drivers/clk/msm/clock-gcc-8952.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c index 8cb91e7280ea9..170ae1c4853d1 100644 --- a/drivers/clk/msm/clock-gcc-8952.c +++ b/drivers/clk/msm/clock-gcc-8952.c @@ -4417,12 +4417,6 @@ static int msm_gcc_probe(struct platform_device *pdev) vdd_hf_pll.cur_level = VDD_HF_PLL_NUM_8917; get_speed_bin(pdev, &speed_bin); override_for_8917(speed_bin); - - if (compat_bin4) { - gfx3d_clk_src.freq_tbl = - ftbl_gcc_oxili_gfx3d_clk_8917_650MHz; - gfx3d_clk_src.c.fmax[VDD_DIG_HIGH] = 650000000; - } } else { gpll0_clk_src.c.parent = &gpll0_clk_src_8952.c; gpll0_ao_clk_src.c.parent = &gpll0_ao_clk_src_8952.c; From 7a22ec4e39a9fee6722881b862312cd01b85edb2 Mon Sep 17 00:00:00 2001 From: Shubhraprakash Das Date: Wed, 13 Apr 2016 12:41:56 -0700 Subject: [PATCH 0285/1015] msm: camera: isp: Add code for new request frame command Add code to handle the new request frame command that takes a buffer index CRs-Fixed: 1012335 Change-Id: I9dfdc185fda547eea8fccd8d463911a93e582931 Signed-off-by: Shubhraprakash Das Signed-off-by: Harsh Shah --- .../platform/msm/camera_v2/isp/msm_buf_mgr.c | 11 +++++-- .../platform/msm/camera_v2/isp/msm_buf_mgr.h | 7 ++-- .../platform/msm/camera_v2/isp/msm_isp.h | 1 + .../msm/camera_v2/isp/msm_isp_axi_util.c | 33 +++++++++++++++---- .../msm/camera_v2/isp/msm_isp_stats_util.c | 3 +- 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c index 0500face83bde..ed70cae333b2d 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c @@ -461,7 +461,8 @@ static int msm_isp_buf_unprepare(struct msm_isp_buf_mgr *buf_mgr, static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, - uint32_t bufq_handle, struct msm_isp_buffer **buf_info) + uint32_t bufq_handle, uint32_t buf_index, + struct msm_isp_buffer **buf_info) { int rc = -1; unsigned long flags; @@ -511,8 +512,12 @@ static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, } break; case MSM_ISP_BUFFER_SRC_HAL: - vb2_buf = buf_mgr->vb2_ops->get_buf( - bufq->session_id, bufq->stream_id); + if (MSM_ISP_INVALID_BUF_INDEX == buf_index) + vb2_buf = buf_mgr->vb2_ops->get_buf( + bufq->session_id, bufq->stream_id); + else + vb2_buf = buf_mgr->vb2_ops->get_buf_by_idx( + bufq->session_id, bufq->stream_id, buf_index); if (vb2_buf) { if (vb2_buf->v4l2_buf.index < bufq->num_bufs) { *buf_info = &bufq->bufs[vb2_buf diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h index eea7d2eaea3cc..0bbd480012c35 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -32,6 +32,8 @@ #define BUF_MGR_NUM_BUF_Q 28 #define MAX_IOMMU_CTX 2 +#define MSM_ISP_INVALID_BUF_INDEX 0xFFFFFFFF + struct msm_isp_buf_mgr; enum msm_isp_buffer_src_t { @@ -140,7 +142,8 @@ struct msm_isp_buf_ops { uint32_t bufq_handle, uint32_t *buf_src); int (*get_buf)(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, - uint32_t bufq_handle, struct msm_isp_buffer **buf_info); + uint32_t bufq_handle, uint32_t buf_index, + struct msm_isp_buffer **buf_info); int (*get_buf_by_index)(struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle, uint32_t buf_index, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h index 1beb2c2943c92..c8872cfb2cbdd 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h @@ -398,6 +398,7 @@ enum msm_vfe_axi_stream_type { struct msm_vfe_frame_request_queue { struct list_head list; enum msm_vfe_buff_queue_id buff_queue_id; + uint32_t buf_index; uint8_t cmd_used; }; diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index 2b278503613f0..2a64f86ab092e 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -1619,6 +1619,7 @@ static struct msm_isp_buffer *msm_isp_get_stream_buffer( struct msm_isp_buffer *buf = NULL; struct msm_vfe_axi_stream *temp_stream_info = NULL; struct msm_vfe_frame_request_queue *queue_req; + uint32_t buf_index = MSM_ISP_INVALID_BUF_INDEX; if (!stream_info->controllable_output) { bufq_handle = stream_info->bufq_handle @@ -1641,12 +1642,13 @@ static struct msm_isp_buffer *msm_isp_get_stream_buffer( __func__); return buf; } + buf_index = queue_req->buf_index; queue_req->cmd_used = 0; list_del(&queue_req->list); temp_stream_info->request_q_cnt--; } rc = vfe_dev->buf_mgr->ops->get_buf(vfe_dev->buf_mgr, - vfe_dev->pdev->id, bufq_handle, &buf); + vfe_dev->pdev->id, bufq_handle, buf_index, &buf); if (rc == -EFAULT) { msm_isp_halt_send_error(vfe_dev, @@ -3068,7 +3070,8 @@ int msm_isp_cfg_axi_stream(struct vfe_device *vfe_dev, void *arg) static int msm_isp_return_empty_buffer(struct vfe_device *vfe_dev, struct msm_vfe_axi_stream *stream_info, uint32_t user_stream_id, - uint32_t frame_id, enum msm_vfe_input_src frame_src) + uint32_t frame_id, uint32_t buf_index, + enum msm_vfe_input_src frame_src) { int rc = -1; struct msm_isp_buffer *buf = NULL; @@ -3104,7 +3107,7 @@ static int msm_isp_return_empty_buffer(struct vfe_device *vfe_dev, rc = vfe_dev->buf_mgr->ops->get_buf(vfe_dev->buf_mgr, - vfe_dev->pdev->id, bufq_handle, &buf); + vfe_dev->pdev->id, bufq_handle, buf_index, &buf); if (rc == -EFAULT) { msm_isp_halt_send_error(vfe_dev, ISP_EVENT_BUF_FATAL_ERROR); return rc; @@ -3142,7 +3145,7 @@ static int msm_isp_return_empty_buffer(struct vfe_device *vfe_dev, static int msm_isp_request_frame(struct vfe_device *vfe_dev, struct msm_vfe_axi_stream *stream_info, uint32_t user_stream_id, - uint32_t frame_id) + uint32_t frame_id, uint32_t buf_index) { struct msm_vfe_axi_stream_request_cmd stream_cfg_cmd; struct msm_vfe_frame_request_queue *queue_req; @@ -3195,7 +3198,7 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, vfe_dev->axi_data.src_info[VFE_PIX_0].active); rc = msm_isp_return_empty_buffer(vfe_dev, stream_info, - user_stream_id, frame_id, frame_src); + user_stream_id, frame_id, buf_index, frame_src); if (rc < 0) pr_err("%s:%d failed: return_empty_buffer src %d\n", __func__, __LINE__, frame_src); @@ -3210,7 +3213,7 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, stream_info->stream_id); rc = msm_isp_return_empty_buffer(vfe_dev, stream_info, - user_stream_id, frame_id, frame_src); + user_stream_id, frame_id, buf_index, frame_src); if (rc < 0) pr_err("%s:%d failed: return_empty_buffer src %d\n", __func__, __LINE__, frame_src); @@ -3240,6 +3243,7 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, user_stream_id, queue_req->buff_queue_id); return 0; } + queue_req->buf_index = buf_index; queue_req->cmd_used = 1; stream_info->request_q_idx = @@ -3577,7 +3581,8 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) update_info->stream_handle)]; rc = msm_isp_request_frame(vfe_dev, stream_info, update_info->user_stream_id, - update_info->frame_id); + update_info->frame_id, + MSM_ISP_INVALID_BUF_INDEX); if (rc) pr_err("%s failed to request frame!\n", __func__); @@ -3639,6 +3644,20 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) } break; } + case UPDATE_STREAM_REQUEST_FRAMES_VER2: { + struct msm_vfe_axi_stream_cfg_update_info_req_frm *req_frm = + &update_cmd->req_frm_ver2; + stream_info = &axi_data->stream_info[HANDLE_TO_IDX( + req_frm->stream_handle)]; + rc = msm_isp_request_frame(vfe_dev, stream_info, + req_frm->user_stream_id, + req_frm->frame_id, + req_frm->buf_index); + if (rc) + pr_err("%s failed to request frame!\n", + __func__); + break; + } default: pr_err("%s: Invalid update type\n", __func__); return -EINVAL; diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c index 6f95d75ce58df..d48c1a0b7eb3d 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c @@ -68,7 +68,8 @@ static int msm_isp_stats_cfg_ping_pong_address(struct vfe_device *vfe_dev, pingpong_bit = (~(pingpong_status >> stats_pingpong_offset) & 0x1); rc = vfe_dev->buf_mgr->ops->get_buf(vfe_dev->buf_mgr, - vfe_dev->pdev->id, bufq_handle, &buf); + vfe_dev->pdev->id, bufq_handle, + MSM_ISP_INVALID_BUF_INDEX, &buf); if (rc == -EFAULT) { msm_isp_halt_send_error(vfe_dev, ISP_EVENT_BUF_FATAL_ERROR); return rc; From e81d75a2cbc22815cf8a94f6642b01dab76a4417 Mon Sep 17 00:00:00 2001 From: Kamal Negi Date: Wed, 19 Oct 2016 18:59:11 +0530 Subject: [PATCH 0286/1015] radio-iris: check argument values before copying the data Check arguments passed in an ioctl before copying the data to kernel buffers. If user sends an erroneous data, data length more than expected, will lead to buffer overflow. Change-Id: I663e937806f38dc3b04c8d7662cd8b045facd12b Signed-off-by: Kamal Negi --- drivers/media/radio/radio-iris.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/media/radio/radio-iris.c b/drivers/media/radio/radio-iris.c index b3088eb9f5f43..bd4eb92bb4567 100644 --- a/drivers/media/radio/radio-iris.c +++ b/drivers/media/radio/radio-iris.c @@ -3884,8 +3884,20 @@ static int iris_vidioc_s_ext_ctrls(struct file *file, void *priv, bytes_to_copy = (ctrl->controls[0]).size; spur_tbl_req.mode = data[0]; spur_tbl_req.no_of_freqs_entries = data[1]; - spur_data = kmalloc((data[1] * SPUR_DATA_LEN) + 2, - GFP_ATOMIC); + + if (((spur_tbl_req.no_of_freqs_entries * SPUR_DATA_LEN) != + bytes_to_copy - 2) || + ((spur_tbl_req.no_of_freqs_entries * SPUR_DATA_LEN) > + 2 * FM_SPUR_TBL_SIZE)) { + FMDERR("Invalid data len: data[1] = %d, bytes = %zu", + spur_tbl_req.no_of_freqs_entries, + bytes_to_copy); + retval = -EINVAL; + goto END; + } + spur_data = + kmalloc((spur_tbl_req.no_of_freqs_entries * SPUR_DATA_LEN) + + 2, GFP_ATOMIC); if (!spur_data) { FMDERR("Allocation failed for Spur data"); retval = -EFAULT; @@ -3900,7 +3912,8 @@ static int iris_vidioc_s_ext_ctrls(struct file *file, void *priv, if (spur_tbl_req.no_of_freqs_entries <= ENTRIES_EACH_CMD) { memcpy(&spur_tbl_req.spur_data[0], spur_data, - (data[1] * SPUR_DATA_LEN)); + (spur_tbl_req.no_of_freqs_entries * + SPUR_DATA_LEN)); retval = radio_hci_request(radio->fm_hdev, hci_fm_set_spur_tbl_req, (unsigned long)&spur_tbl_req, From 0c116ac652f92a24d1bf93bc7b94db04a1f55928 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Tue, 8 Nov 2016 11:28:39 +0530 Subject: [PATCH 0287/1015] ARM: dts: msm: Add Rx buffer nodes for IPA HW on MSM8953 Add dtsi node for WAN Rx size and LAN Rx size. Assign a value 192 to wan-rx-size and lan-rx-size nodes to reduce the IPA memory usage in MSM8953. Change-Id: I40bd00f824693a10dd1356b9aef13992603e842b Acked-by: Chaitanya Pratapa Signed-off-by: Utkarsh Saxena --- arch/arm/boot/dts/qcom/msm8953.dtsi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8953.dtsi b/arch/arm/boot/dts/qcom/msm8953.dtsi index 0dfc206c1f258..4bd9f58c738ba 100644 --- a/arch/arm/boot/dts/qcom/msm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953.dtsi @@ -1311,6 +1311,8 @@ interrupt-names = "ipa-irq", "bam-irq"; qcom,ipa-hw-ver = <6>; /* IPA core version = IPAv2.6L */ qcom,ipa-hw-mode = <0>; /* IPA hw type = Normal */ + qcom,wan-rx-ring-size = <192>; /* IPA WAN-rx-ring-size*/ + qcom,lan-rx-ring-size = <192>; /* IPA LAN-rx-ring-size*/ clock-names = "core_clk"; clocks = <&clock_gcc clk_ipa_clk>; qcom,ee = <0>; From a2405a778f33cccff69cc0d1418f97aa902e36b3 Mon Sep 17 00:00:00 2001 From: Liam Mark Date: Wed, 12 Oct 2016 14:22:56 -0700 Subject: [PATCH 0288/1015] ion: disable system contig heap A malicious application can take advantage of the ION contig heap to create a specific memory chunk size to exercise a rowhammer attack on the physical hardware. So remove support for the ION contig heap. Change-Id: I9cb454cebb74df291479cecc3533d2c684363f77 Signed-off-by: Liam Mark Signed-off-by: Prakash Gupta --- arch/arm/boot/dts/qcom/msm8909-ion.dtsi | 5 ----- arch/arm/boot/dts/qcom/msm8917-ion.dtsi | 7 +------ arch/arm/boot/dts/qcom/msm8937-ion.dtsi | 7 +------ arch/arm/boot/dts/qcom/msm8952-ion.dtsi | 7 +------ arch/arm/boot/dts/qcom/msm8953-ion.dtsi | 5 ----- arch/arm/boot/dts/qcom/msm8996-ion.dtsi | 7 +------ arch/arm/boot/dts/qcom/msmcobalt-ion.dtsi | 5 ----- drivers/staging/android/ion/ion_heap.c | 10 ++++++---- 8 files changed, 10 insertions(+), 43 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8909-ion.dtsi b/arch/arm/boot/dts/qcom/msm8909-ion.dtsi index 662c14c484cf1..55be22bd454b7 100644 --- a/arch/arm/boot/dts/qcom/msm8909-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8909-ion.dtsi @@ -21,11 +21,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@27 { /* QSEECOM HEAP */ reg = <27>; memory-region = <&venus_qseecom_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8917-ion.dtsi b/arch/arm/boot/dts/qcom/msm8917-ion.dtsi index 0ee9575f8065c..5af5e39e6e5c8 100644 --- a/arch/arm/boot/dts/qcom/msm8917-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-ion.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -22,11 +22,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@8 { /* CP_MM HEAP */ reg = <8>; memory-region = <&secure_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8937-ion.dtsi b/arch/arm/boot/dts/qcom/msm8937-ion.dtsi index 0ee9575f8065c..5af5e39e6e5c8 100644 --- a/arch/arm/boot/dts/qcom/msm8937-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-ion.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -22,11 +22,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@8 { /* CP_MM HEAP */ reg = <8>; memory-region = <&secure_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8952-ion.dtsi b/arch/arm/boot/dts/qcom/msm8952-ion.dtsi index 937c56bba1577..3d56279108e58 100644 --- a/arch/arm/boot/dts/qcom/msm8952-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8952-ion.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -21,11 +21,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@8 { /* CP_MM HEAP */ reg = <8>; memory-region = <&secure_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8953-ion.dtsi b/arch/arm/boot/dts/qcom/msm8953-ion.dtsi index 4c8ef75038821..11d39ff5990ae 100644 --- a/arch/arm/boot/dts/qcom/msm8953-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-ion.dtsi @@ -21,11 +21,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@8 { /* CP_MM HEAP */ reg = <8>; memory-region = <&secure_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8996-ion.dtsi b/arch/arm/boot/dts/qcom/msm8996-ion.dtsi index 6b64e9b8976ad..9b287e3f23c5d 100644 --- a/arch/arm/boot/dts/qcom/msm8996-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-ion.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -21,11 +21,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - system_contig_heap: qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@22 { /* ADSP HEAP */ reg = <22>; memory-region = <&adsp_mem>; diff --git a/arch/arm/boot/dts/qcom/msmcobalt-ion.dtsi b/arch/arm/boot/dts/qcom/msmcobalt-ion.dtsi index 09a2b799d9aa3..efa90d047b67e 100644 --- a/arch/arm/boot/dts/qcom/msmcobalt-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msmcobalt-ion.dtsi @@ -21,11 +21,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - system_contig_heap: qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@22 { /* ADSP HEAP */ reg = <22>; memory-region = <&adsp_mem>; diff --git a/drivers/staging/android/ion/ion_heap.c b/drivers/staging/android/ion/ion_heap.c index 54d3bd98126e7..a48566ab41d87 100644 --- a/drivers/staging/android/ion/ion_heap.c +++ b/drivers/staging/android/ion/ion_heap.c @@ -2,7 +2,7 @@ * drivers/staging/android/ion/ion_heap.c * * Copyright (C) 2011 Google, Inc. - * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -325,8 +325,9 @@ struct ion_heap *ion_heap_create(struct ion_platform_heap *heap_data) switch (heap_data->type) { case ION_HEAP_TYPE_SYSTEM_CONTIG: - heap = ion_system_contig_heap_create(heap_data); - break; + pr_err("%s: Heap type is disabled: %d\n", __func__, + heap_data->type); + return ERR_PTR(-EINVAL); case ION_HEAP_TYPE_SYSTEM: heap = ion_system_heap_create(heap_data); break; @@ -365,7 +366,8 @@ void ion_heap_destroy(struct ion_heap *heap) switch (heap->type) { case ION_HEAP_TYPE_SYSTEM_CONTIG: - ion_system_contig_heap_destroy(heap); + pr_err("%s: Heap type is disabled: %d\n", __func__, + heap->type); break; case ION_HEAP_TYPE_SYSTEM: ion_system_heap_destroy(heap); From 26a335608d4ea416aafa0e04a3f95a2d02b78f36 Mon Sep 17 00:00:00 2001 From: Amey Telawane Date: Wed, 2 Nov 2016 12:28:22 +0530 Subject: [PATCH 0289/1015] coresight: fix spinlock corruption issue Spinlock corruption is observed on secure fuse enabled devices due to invalid data present in etmdrvdata array. Initialise the array to fix the issue. Change-Id: Ib16e3c3f6dc7d194af4eeca6f58c78483af71482 CRs-fixed: 1084892 Signed-off-by: Amey Telawane --- drivers/coresight/coresight-etmv4.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/coresight/coresight-etmv4.c b/drivers/coresight/coresight-etmv4.c index 2a6c793083148..8cfe242e665b0 100644 --- a/drivers/coresight/coresight-etmv4.c +++ b/drivers/coresight/coresight-etmv4.c @@ -3702,8 +3702,10 @@ static int etm_probe(struct platform_device *pdev) unregister_hotcpu_notifier(&etm_cpu_notifier); unregister_hotcpu_notifier(&etm_cpu_dying_notifier); } + etmdrvdata[cpu] = NULL; err0: wakeup_source_trash(&drvdata->ws); + platform_set_drvdata(pdev, NULL); return ret; } From 4cbc9c77fb8101940809e02d781817c8a1c8ae7b Mon Sep 17 00:00:00 2001 From: Ashay Jaiswal Date: Tue, 26 Apr 2016 13:50:26 +0530 Subject: [PATCH 0290/1015] spmi-pmic-arb: add support to dispatch interrupt based on IRQ status Current implementation of SPMI arbiter dispatches interrupt based on the Arbiter's accumulator status, in some cases the accumulator status may remain zero and the interrupt remains un-handled. Add logic to dispatch interrupts based Arbiter's IRQ status if the accumulator status is zero. CRs-Fixed: 1008665 Change-Id: I068f5c7d33758063878721d7cce1308fa803e3bd Signed-off-by: Ashay Jaiswal --- drivers/platform/msm/spmi/spmi-pmic-arb.c | 26 ++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/drivers/platform/msm/spmi/spmi-pmic-arb.c b/drivers/platform/msm/spmi/spmi-pmic-arb.c index a419ffe97d7e1..88961ae2bf7d0 100644 --- a/drivers/platform/msm/spmi/spmi-pmic-arb.c +++ b/drivers/platform/msm/spmi/spmi-pmic-arb.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -928,6 +928,10 @@ __pmic_arb_periph_irq(int irq, void *dev_id, bool show) int first = pmic_arb->min_intr_apid >> 5; int last = pmic_arb->max_intr_apid >> 5; int i, j; + /* status based dispatch */ + bool acc_valid = false; + u32 irq_status = 0; + dev_dbg(pmic_arb->dev, "Peripheral interrupt detected\n"); @@ -935,6 +939,8 @@ __pmic_arb_periph_irq(int irq, void *dev_id, bool show) for (i = first; i <= last; ++i) { status = readl_relaxed(pmic_arb->intr + pmic_arb->ver->owner_acc_status(ee, i)); + if (status) + acc_valid = true; if ((i == 0) && (status & pmic_arb->irq_acc0_init_val)) { dev_dbg(pmic_arb->dev, "Ignoring IRQ acc[0] mask:0x%x\n", @@ -951,6 +957,24 @@ __pmic_arb_periph_irq(int irq, void *dev_id, bool show) } } + /* ACC_STATUS is empty but IRQ fired check IRQ_STATUS */ + if (!acc_valid) { + for (i = pmic_arb->min_intr_apid; i <= pmic_arb->max_intr_apid; + i++) { + if (!is_apid_valid(pmic_arb, i)) + continue; + irq_status = readl_relaxed(pmic_arb->intr + + pmic_arb->ver->irq_status(i)); + if (irq_status) { + dev_dbg(pmic_arb->dev, + "Dispatching for IRQ_STATUS_REG:0x%lx IRQ_STATUS:0x%x\n", + (ulong) pmic_arb->ver->irq_status(i), + irq_status); + ret |= periph_interrupt(pmic_arb, i, show); + } + } + } + return ret; } From c2008ff3b6e3b549c3c4834f1c2cce3827dc52a9 Mon Sep 17 00:00:00 2001 From: Subbaraman Narayanamurthy Date: Thu, 29 Sep 2016 18:03:21 -0700 Subject: [PATCH 0291/1015] power: qpnp-fg: Enable FULL_SOC based on charging status Currently, FULL_SOC interrupt is enabled as a wakeup interrupt always. In some circumstances, it fires randomly after the charger is removed but the SOC remains high. This wakes up the device. Hence, keep it enabled only when the device is charging and keep it disabled during discharging. CRs-Fixed: 1075428 Change-Id: I575ba72030c3c453aac1118bceebe64a0445d138 Signed-off-by: Subbaraman Narayanamurthy --- drivers/power/qpnp-fg.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/drivers/power/qpnp-fg.c b/drivers/power/qpnp-fg.c index 5dcb0b4e321bb..cebcccfa59104 100644 --- a/drivers/power/qpnp-fg.c +++ b/drivers/power/qpnp-fg.c @@ -529,6 +529,7 @@ struct fg_chip { bool charge_done; bool resume_soc_lowered; bool vbat_low_irq_enabled; + bool full_soc_irq_enabled; bool charge_full; bool hold_soc_while_full; bool input_present; @@ -1332,8 +1333,11 @@ static void fg_enable_irqs(struct fg_chip *chip, bool enable) if (enable) { enable_irq(chip->soc_irq[DELTA_SOC].irq); enable_irq_wake(chip->soc_irq[DELTA_SOC].irq); - enable_irq(chip->soc_irq[FULL_SOC].irq); - enable_irq_wake(chip->soc_irq[FULL_SOC].irq); + if (!chip->full_soc_irq_enabled) { + enable_irq(chip->soc_irq[FULL_SOC].irq); + enable_irq_wake(chip->soc_irq[FULL_SOC].irq); + chip->full_soc_irq_enabled = true; + } enable_irq(chip->batt_irq[BATT_MISSING].irq); if (!chip->vbat_low_irq_enabled) { enable_irq(chip->batt_irq[VBATT_LOW].irq); @@ -1348,8 +1352,11 @@ static void fg_enable_irqs(struct fg_chip *chip, bool enable) } else { disable_irq_wake(chip->soc_irq[DELTA_SOC].irq); disable_irq_nosync(chip->soc_irq[DELTA_SOC].irq); - disable_irq_wake(chip->soc_irq[FULL_SOC].irq); - disable_irq_nosync(chip->soc_irq[FULL_SOC].irq); + if (chip->full_soc_irq_enabled) { + disable_irq_wake(chip->soc_irq[FULL_SOC].irq); + disable_irq_nosync(chip->soc_irq[FULL_SOC].irq); + chip->full_soc_irq_enabled = false; + } disable_irq(chip->batt_irq[BATT_MISSING].irq); if (chip->vbat_low_irq_enabled) { disable_irq_wake(chip->batt_irq[VBATT_LOW].irq); @@ -3950,6 +3957,13 @@ static void status_change_work(struct work_struct *work) enable_irq_wake(chip->batt_irq[VBATT_LOW].irq); chip->vbat_low_irq_enabled = true; } + + if (!chip->full_soc_irq_enabled) { + enable_irq(chip->soc_irq[FULL_SOC].irq); + enable_irq_wake(chip->soc_irq[FULL_SOC].irq); + chip->full_soc_irq_enabled = true; + } + if (!!(chip->wa_flag & PULSE_REQUEST_WA) && capacity == 100) fg_configure_soc(chip); } else if (chip->status == POWER_SUPPLY_STATUS_DISCHARGING) { @@ -3959,6 +3973,12 @@ static void status_change_work(struct work_struct *work) disable_irq_nosync(chip->batt_irq[VBATT_LOW].irq); chip->vbat_low_irq_enabled = false; } + + if (chip->full_soc_irq_enabled) { + disable_irq_wake(chip->soc_irq[FULL_SOC].irq); + disable_irq_nosync(chip->soc_irq[FULL_SOC].irq); + chip->full_soc_irq_enabled = false; + } } fg_cap_learning_check(chip); schedule_work(&chip->update_esr_work); @@ -7194,7 +7214,6 @@ static int fg_init_irqs(struct fg_chip *chip) } enable_irq_wake(chip->soc_irq[DELTA_SOC].irq); - enable_irq_wake(chip->soc_irq[FULL_SOC].irq); if (!chip->use_vbat_low_empty_soc) enable_irq_wake(chip->soc_irq[EMPTY_SOC].irq); break; From 977ed5b7cc9c6fe50e202e9a3963156f9464be3e Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Thu, 23 Oct 2014 10:50:41 -0700 Subject: [PATCH 0292/1015] rcu: Kick rcuo kthreads after their CPU goes offline If a no-CBs CPU were to post an RCU callback with interrupts disabled after it entered the idle loop for the last time, there might be no deferred wakeup for the corresponding rcuo kthreads. This commit therefore adds a set of calls to do_nocb_deferred_wakeup() after the CPU has gone completely offline. CRs-Fixed: 1088159 Change-Id: I97ed8092516d678b172d84fde8cf2958ddae9e45 Signed-off-by: Paul E. McKenney Git-commit: 776d680711f4836964f3005ee53794661ca74629 Git-repo: https://github.com/torvalds/linux.git Signed-off-by: Imran Khan --- kernel/rcu/tree.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 6c5eeee441e99..c8832a4091493 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -3476,8 +3476,10 @@ static int rcu_cpu_notify(struct notifier_block *self, case CPU_DEAD_FROZEN: case CPU_UP_CANCELED: case CPU_UP_CANCELED_FROZEN: - for_each_rcu_flavor(rsp) + for_each_rcu_flavor(rsp) { rcu_cleanup_dead_cpu(cpu, rsp); + do_nocb_deferred_wakeup(per_cpu_ptr(rsp->rda, cpu)); + } break; default: break; From 2b16ec4a31dd192c58ead8ee09c42ff5c4afeb9c Mon Sep 17 00:00:00 2001 From: Peter Hurley Date: Fri, 16 Jan 2015 15:05:37 -0500 Subject: [PATCH 0293/1015] BACKPORT: n_tty: Fix unordered accesses to lockless read buffer Add commit_head buffer index, which the producer-side publishes after input processing in non-canon mode. This ensures the consumer-side observes correctly-ordered writes in non-canonical mode (ie., the buffer data is written before the buffer index is advanced). Fix consumer-side uses of read_cnt() to use commit_head instead. Add required memory barriers to the tail index to guarantee the consumer-side has completed the loads before the producer-side begins writing new data. Open-code the producer-side receive_room() into the i/o loop. Remove no-longer-referenced receive_room(). Based on work by Christian Riesch Cc: Christian Riesch Signed-off-by: Peter Hurley Signed-off-by: Greg Kroah-Hartman [salidoa@google.com: Modied to keep receive_room() which is called in many places] BUG=b:29643166 TEST=smaug boots (cherry picked from commit 70aca71f92ca2c111978bf676287fab5580d2598) Signed-off-by: Adrian Salido Reviewed-on: https://chromium-review.googlesource.com/356730 Commit-Ready: Adrian Salido Tested-by: Adrian Salido Reviewed-by: Stephen Barber CRs-Fixed: 1073011 Change-Id: I002f3eda7b1b1d06f38ee69c613ef4e90da51615 Git-repo: https://chromium.googlesource.com/chromiumos/third_party/kernel Git-commit: 86f682dca64c3144cfcd92dce2e4423457fbf878 (kimran@codeaurora.org: resolved minor cherry-pick conflicts) Signed-off-by: Imran Khan --- drivers/tty/n_tty.c | 56 ++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 7b64a5fdd916f..4171774925dae 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c @@ -90,6 +90,7 @@ struct n_tty_data { /* producer-published */ size_t read_head; + size_t commit_head; size_t canon_head; size_t echo_head; size_t echo_commit; @@ -165,14 +166,16 @@ static int receive_room(struct tty_struct *tty) { struct n_tty_data *ldata = tty->disc_data; int left; + size_t tail = smp_load_acquire(&ldata->read_tail); + size_t head = ldata->read_head; if (I_PARMRK(tty)) { /* Multiply read_cnt by 3, since each byte might take up to * three times as many spaces when PARMRK is set (depending on * its flags, e.g. parity error). */ - left = N_TTY_BUF_SIZE - read_cnt(ldata) * 3 - 1; + left = N_TTY_BUF_SIZE - (head - tail) * 3 - 1; } else - left = N_TTY_BUF_SIZE - read_cnt(ldata) - 1; + left = N_TTY_BUF_SIZE - (head - tail) - 1; /* * If we are doing input canonicalization, and there are no @@ -181,7 +184,7 @@ static int receive_room(struct tty_struct *tty) * characters will be beeped. */ if (left <= 0) - left = ldata->icanon && ldata->canon_head == ldata->read_tail; + left = ldata->icanon && ldata->canon_head == tail; return left; } @@ -235,7 +238,7 @@ static ssize_t chars_in_buffer(struct tty_struct *tty) ssize_t n = 0; if (!ldata->icanon) - n = read_cnt(ldata); + n = ldata->commit_head - ldata->read_tail; else n = ldata->canon_head - ldata->read_tail; return n; @@ -319,10 +322,6 @@ static void n_tty_check_unthrottle(struct tty_struct *tty) * * n_tty_receive_buf()/producer path: * caller holds non-exclusive termios_rwsem - * modifies read_head - * - * read_head is only considered 'published' if canonical mode is - * not active. */ static inline void put_tty_queue(unsigned char c, struct n_tty_data *ldata) @@ -346,6 +345,7 @@ static void reset_buffer_flags(struct n_tty_data *ldata) { ldata->read_head = ldata->canon_head = ldata->read_tail = 0; ldata->echo_head = ldata->echo_tail = ldata->echo_commit = 0; + ldata->commit_head = 0; ldata->echo_mark = 0; ldata->line_start = 0; @@ -992,10 +992,6 @@ static inline void finish_erasing(struct n_tty_data *ldata) * * n_tty_receive_buf()/producer path: * caller holds non-exclusive termios_rwsem - * modifies read_head - * - * Modifying the read_head is not considered a publish in this context - * because canonical mode is active -- only canon_head publishes */ static void eraser(unsigned char c, struct tty_struct *tty) @@ -1144,7 +1140,6 @@ static void isig(int sig, struct tty_struct *tty) * * n_tty_receive_buf()/producer path: * caller holds non-exclusive termios_rwsem - * publishes read_head via put_tty_queue() * * Note: may get exclusive termios_rwsem if flushing input buffer */ @@ -1214,7 +1209,6 @@ static void n_tty_receive_overrun(struct tty_struct *tty) * * n_tty_receive_buf()/producer path: * caller holds non-exclusive termios_rwsem - * publishes read_head via put_tty_queue() */ static void n_tty_receive_parity_error(struct tty_struct *tty, unsigned char c) { @@ -1268,7 +1262,6 @@ n_tty_receive_signal_char(struct tty_struct *tty, int signal, unsigned char c) * n_tty_receive_buf()/producer path: * caller holds non-exclusive termios_rwsem * publishes canon_head if canonical mode is active - * otherwise, publishes read_head via put_tty_queue() * * Returns 1 if LNEXT was received, else returns 0 */ @@ -1381,7 +1374,7 @@ n_tty_receive_char_special(struct tty_struct *tty, unsigned char c) handle_newline: set_bit(ldata->read_head & (N_TTY_BUF_SIZE - 1), ldata->read_flags); put_tty_queue(c, ldata); - ldata->canon_head = ldata->read_head; + smp_store_release(&ldata->canon_head, ldata->read_head); kill_fasync(&tty->fasync, SIGIO, POLL_IN); wake_up_interruptible_poll(&tty->read_wait, POLLIN); return 0; @@ -1524,16 +1517,14 @@ n_tty_receive_buf_real_raw(struct tty_struct *tty, const unsigned char *cp, size_t n, head; head = ldata->read_head & (N_TTY_BUF_SIZE - 1); - n = N_TTY_BUF_SIZE - max(read_cnt(ldata), head); - n = min_t(size_t, count, n); + n = min_t(size_t, count, N_TTY_BUF_SIZE - head); memcpy(read_buf_addr(ldata, head), cp, n); ldata->read_head += n; cp += n; count -= n; head = ldata->read_head & (N_TTY_BUF_SIZE - 1); - n = N_TTY_BUF_SIZE - max(read_cnt(ldata), head); - n = min_t(size_t, count, n); + n = min_t(size_t, count, N_TTY_BUF_SIZE - head); memcpy(read_buf_addr(ldata, head), cp, n); ldata->read_head += n; } @@ -1663,8 +1654,13 @@ static void __receive_buf(struct tty_struct *tty, const unsigned char *cp, tty->ops->flush_chars(tty); } - if ((!ldata->icanon && (read_cnt(ldata) >= ldata->minimum_to_wake)) || - L_EXTPROC(tty)) { + if (ldata->icanon && !L_EXTPROC(tty)) + return; + + /* publish read_head to consumer */ + smp_store_release(&ldata->commit_head, ldata->read_head); + + if ((read_cnt(ldata) >= ldata->minimum_to_wake) || L_EXTPROC(tty)) { kill_fasync(&tty->fasync, SIGIO, POLL_IN); wake_up_interruptible_poll(&tty->read_wait, POLLIN); } @@ -1821,6 +1817,7 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) ldata->canon_head = ldata->read_head; ldata->push = 1; } + ldata->commit_head = ldata->read_head; ldata->erasing = 0; ldata->lnext = 0; } @@ -1960,7 +1957,7 @@ static inline int input_available_p(struct tty_struct *tty, int poll) if (ldata->icanon && !L_EXTPROC(tty)) return ldata->canon_head != ldata->read_tail; else - return read_cnt(ldata) >= amt; + return ldata->commit_head - ldata->read_tail >= amt; } /** @@ -1992,10 +1989,11 @@ static int copy_from_read_buf(struct tty_struct *tty, int retval; size_t n; bool is_eof; + size_t head = smp_load_acquire(&ldata->commit_head); size_t tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1); retval = 0; - n = min(read_cnt(ldata), N_TTY_BUF_SIZE - tail); + n = min(head - ldata->read_tail, N_TTY_BUF_SIZE - tail); n = min(*nr, n); if (n) { retval = copy_to_user(*b, read_buf_addr(ldata, tail), n); @@ -2003,9 +2001,10 @@ static int copy_from_read_buf(struct tty_struct *tty, is_eof = n == 1 && read_buf(ldata, tail) == EOF_CHAR(tty); tty_audit_add_data(tty, read_buf_addr(ldata, tail), n, ldata->icanon); - ldata->read_tail += n; + smp_store_release(&ldata->read_tail, ldata->read_tail + n); /* Turn single EOF into zero-length read */ - if (L_EXTPROC(tty) && ldata->icanon && is_eof && !read_cnt(ldata)) + if (L_EXTPROC(tty) && ldata->icanon && is_eof && + (head == ldata->read_tail)) n = 0; *b += n; *nr -= n; @@ -2048,7 +2047,7 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, bool eof_push = 0; /* N.B. avoid overrun if nr == 0 */ - n = min(*nr, read_cnt(ldata)); + n = min(*nr, smp_load_acquire(&ldata->canon_head) - ldata->read_tail); if (!n) return 0; @@ -2098,8 +2097,7 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, if (found) clear_bit(eol, ldata->read_flags); - smp_mb__after_atomic(); - ldata->read_tail += c; + smp_store_release(&ldata->read_tail, ldata->read_tail + c); if (found) { if (!ldata->push) From 5461b218c3fff0b5f4d82aadccf57ce356a8c882 Mon Sep 17 00:00:00 2001 From: Vivek Veenam Date: Fri, 24 Jun 2016 11:49:16 +0530 Subject: [PATCH 0294/1015] msm: camera: Add a driver to control IR LED device This driver is able to control a IR LED device. The interface to user space is: CFG_IR_LED_INIT CFG_IR_LED_OFF CFG_IR_LED_ON with intensity field CFG_IR_LED_RELEASE. Change-Id: I2e04fa47efd1454bb487eca67bd9ceaeab3e9edf Signed-off-by: Vivek Veenam --- .../bindings/media/video/msm-ir-led.txt | 26 + .../platform/msm/camera_v2/sensor/Makefile | 2 +- .../msm/camera_v2/sensor/ir_led/Makefile | 4 + .../msm/camera_v2/sensor/ir_led/msm_ir_led.c | 462 ++++++++++++++++++ .../msm/camera_v2/sensor/ir_led/msm_ir_led.h | 71 +++ include/media/msm_cam_sensor.h | 10 + include/uapi/media/msm_cam_sensor.h | 9 + include/uapi/media/msm_camsensor_sdk.h | 11 + include/uapi/media/msmb_camera.h | 3 +- 9 files changed, 596 insertions(+), 2 deletions(-) create mode 100644 Documentation/devicetree/bindings/media/video/msm-ir-led.txt create mode 100644 drivers/media/platform/msm/camera_v2/sensor/ir_led/Makefile create mode 100644 drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.c create mode 100644 drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.h diff --git a/Documentation/devicetree/bindings/media/video/msm-ir-led.txt b/Documentation/devicetree/bindings/media/video/msm-ir-led.txt new file mode 100644 index 0000000000000..7e66fa0cef5bf --- /dev/null +++ b/Documentation/devicetree/bindings/media/video/msm-ir-led.txt @@ -0,0 +1,26 @@ +* QTI MSM IR LED + +Required properties: +- cell-index : ir led hardware core index +- compatible : + - "qcom,ir-led" + +Optional properties: +- gpios : should specify the gpios to be used for the ir led. +- qcom,gpio-req-tbl-num : should contain index to gpios specific to ir led +- qcom,gpio-req-tbl-flags : should contain direction of gpios present in + qcom,gpio-req-tbl-num property (in the same order) +- qcom,gpio-req-tbl-label : should contain name of gpios present in + qcom,gpio-req-tbl-num property (in the same order) +- label : should contain unique ir led name +Example: + +qcom,ir-led { + cell-index = <0>; + compatible = "qcom,ir-led"; + label = "led-ir-label"; + gpios = <&tlmm 60 0>; + qcom,gpio-req-tbl-num = <0>; + qcom,gpio-req-tbl-flags = <0>; + qcom,gpio-req-tbl-label = "LED_IR_EN"; + }; diff --git a/drivers/media/platform/msm/camera_v2/sensor/Makefile b/drivers/media/platform/msm/camera_v2/sensor/Makefile index 539ba24e109b3..de6abd46c60e7 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/Makefile +++ b/drivers/media/platform/msm/camera_v2/sensor/Makefile @@ -4,5 +4,5 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2/msm_vb2 ccflags-y += -Idrivers/media/platform/msm/camera_v2/camera ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/cci -obj-$(CONFIG_MSMB_CAMERA) += cci/ io/ csiphy/ csid/ actuator/ eeprom/ ois/ flash/ +obj-$(CONFIG_MSMB_CAMERA) += cci/ io/ csiphy/ csid/ actuator/ eeprom/ ois/ flash/ ir_led/ obj-$(CONFIG_MSM_CAMERA_SENSOR) += msm_sensor_init.o msm_sensor_driver.o msm_sensor.o diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_led/Makefile b/drivers/media/platform/msm/camera_v2/sensor/ir_led/Makefile new file mode 100644 index 0000000000000..6e99ecc2c78d9 --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_led/Makefile @@ -0,0 +1,4 @@ +ccflags-y += -Idrivers/media/platform/msm/camera_v2 +ccflags-y += -Idrivers/media/platform/msm/camera_v2/common +ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io +obj-$(CONFIG_MSMB_CAMERA) += msm_ir_led.o diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.c b/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.c new file mode 100644 index 0000000000000..cfcdb124f44f3 --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.c @@ -0,0 +1,462 @@ +/* Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#define pr_fmt(fmt) "%s:%d " fmt, __func__, __LINE__ + +#include +#include +#include "msm_ir_led.h" +#include "msm_camera_dt_util.h" + +#undef CDBG +#define CDBG(fmt, args...) pr_debug(fmt, ##args) + +DEFINE_MSM_MUTEX(msm_ir_led_mutex); + +static struct v4l2_file_operations msm_ir_led_v4l2_subdev_fops; + +static const struct of_device_id msm_ir_led_dt_match[] = { + {.compatible = "qcom,ir-led", .data = NULL}, + {} +}; + +static struct msm_ir_led_table msm_default_ir_led_table; + +static struct msm_ir_led_table *ir_led_table[] = { + &msm_default_ir_led_table, +}; + +static int32_t msm_ir_led_get_subdev_id( + struct msm_ir_led_ctrl_t *ir_led_ctrl, void *arg) +{ + uint32_t *subdev_id = (uint32_t *)arg; + + CDBG("Enter\n"); + if (!subdev_id) { + pr_err("subdevice ID is not valid\n"); + return -EINVAL; + } + if (MSM_CAMERA_PLATFORM_DEVICE != ir_led_ctrl->ir_led_device_type) { + pr_err("device type is not matching\n"); + return -EINVAL; + } + + *subdev_id = ir_led_ctrl->pdev->id; + + CDBG("subdev_id %d\n", *subdev_id); + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_led_init( + struct msm_ir_led_ctrl_t *ir_led_ctrl, + struct msm_ir_led_cfg_data_t *ir_led_data) +{ + int32_t rc = 0; + + CDBG("Enter\n"); + + rc = ir_led_ctrl->func_tbl->camera_ir_led_off(ir_led_ctrl, ir_led_data); + + CDBG("Exit\n"); + return rc; +} + +static int32_t msm_ir_led_release( + struct msm_ir_led_ctrl_t *ir_led_ctrl) +{ + int32_t rc = 0; + + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_RELEASE) { + pr_err("Invalid ir_led state = %d\n", + ir_led_ctrl->ir_led_state); + return 0; + } + + rc = ir_led_ctrl->func_tbl->camera_ir_led_off(ir_led_ctrl, NULL); + if (rc < 0) { + pr_err("camera_ir_led_off failed (%d)\n", rc); + return rc; + } + ir_led_ctrl->ir_led_state = MSM_CAMERA_IR_LED_RELEASE; + return 0; +} + +static int32_t msm_ir_led_off(struct msm_ir_led_ctrl_t *ir_led_ctrl, + struct msm_ir_led_cfg_data_t *ir_led_data) +{ + CDBG("Enter\n"); + + if (ir_led_ctrl->pwm_dev) + pwm_disable(ir_led_ctrl->pwm_dev); + else + pr_err("pwm device is null\n"); + + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_led_on( + struct msm_ir_led_ctrl_t *ir_led_ctrl, + struct msm_ir_led_cfg_data_t *ir_led_data) +{ + int rc; + + CDBG("pwm duty on(ns) %d, pwm period(ns) %d\n", + ir_led_data->pwm_duty_on_ns, ir_led_data->pwm_period_ns); + + if (ir_led_ctrl->pwm_dev) { + rc = pwm_config(ir_led_ctrl->pwm_dev, + ir_led_data->pwm_duty_on_ns, + ir_led_data->pwm_period_ns); + if (rc) { + pr_err("PWM config failed (%d)\n", rc); + return rc; + } + + rc = pwm_enable(ir_led_ctrl->pwm_dev); + if (rc) { + pr_err("PWM enable failed(%d)\n", rc); + return rc; + } + } else + pr_err("pwm device is null\n"); + + return 0; +} + +static int32_t msm_ir_led_handle_init( + struct msm_ir_led_ctrl_t *ir_led_ctrl, + struct msm_ir_led_cfg_data_t *ir_led_data) +{ + uint32_t i = 0; + int32_t rc = -EFAULT; + enum msm_ir_led_driver_type ir_led_driver_type = + ir_led_ctrl->ir_led_driver_type; + + CDBG("Enter\n"); + + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_INIT) { + pr_err("Invalid ir_led state = %d\n", + ir_led_ctrl->ir_led_state); + return 0; + } + + for (i = 0; i < ARRAY_SIZE(ir_led_table); i++) { + if (ir_led_driver_type == ir_led_table[i]->ir_led_driver_type) { + ir_led_ctrl->func_tbl = &ir_led_table[i]->func_tbl; + rc = 0; + break; + } + } + + if (rc < 0) { + pr_err("failed invalid ir_led_driver_type %d\n", + ir_led_driver_type); + return -EINVAL; + } + + rc = ir_led_ctrl->func_tbl->camera_ir_led_init( + ir_led_ctrl, ir_led_data); + if (rc < 0) { + pr_err("camera_ir_led_init failed (%d)\n", rc); + return rc; + } + + ir_led_ctrl->ir_led_state = MSM_CAMERA_IR_LED_INIT; + + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_led_config(struct msm_ir_led_ctrl_t *ir_led_ctrl, + void __user *argp) +{ + int32_t rc = -EINVAL; + struct msm_ir_led_cfg_data_t *ir_led_data = + (struct msm_ir_led_cfg_data_t *) argp; + + mutex_lock(ir_led_ctrl->ir_led_mutex); + + CDBG("type %d\n", ir_led_data->cfg_type); + + switch (ir_led_data->cfg_type) { + case CFG_IR_LED_INIT: + rc = msm_ir_led_handle_init(ir_led_ctrl, ir_led_data); + break; + case CFG_IR_LED_RELEASE: + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_INIT) + rc = ir_led_ctrl->func_tbl->camera_ir_led_release( + ir_led_ctrl); + break; + case CFG_IR_LED_OFF: + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_INIT) + rc = ir_led_ctrl->func_tbl->camera_ir_led_off( + ir_led_ctrl, ir_led_data); + break; + case CFG_IR_LED_ON: + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_INIT) + rc = ir_led_ctrl->func_tbl->camera_ir_led_on( + ir_led_ctrl, ir_led_data); + break; + default: + rc = -EFAULT; + break; + } + + mutex_unlock(ir_led_ctrl->ir_led_mutex); + + CDBG("Exit: type %d\n", ir_led_data->cfg_type); + + return rc; +} + +static long msm_ir_led_subdev_ioctl(struct v4l2_subdev *sd, + unsigned int cmd, void *arg) +{ + struct msm_ir_led_ctrl_t *fctrl = NULL; + void __user *argp = (void __user *)arg; + + CDBG("Enter\n"); + + if (!sd) { + pr_err(" v4l2 ir led subdevice is NULL\n"); + return -EINVAL; + } + fctrl = v4l2_get_subdevdata(sd); + if (!fctrl) { + pr_err("fctrl NULL\n"); + return -EINVAL; + } + switch (cmd) { + case VIDIOC_MSM_SENSOR_GET_SUBDEV_ID: + return msm_ir_led_get_subdev_id(fctrl, argp); + case VIDIOC_MSM_IR_LED_CFG: + return msm_ir_led_config(fctrl, argp); + case MSM_SD_NOTIFY_FREEZE: + return 0; + case MSM_SD_SHUTDOWN: + if (!fctrl->func_tbl) { + pr_err("No call back funcions\n"); + return -EINVAL; + } else { + return fctrl->func_tbl->camera_ir_led_release(fctrl); + } + default: + pr_err_ratelimited("invalid cmd %d\n", cmd); + return -ENOIOCTLCMD; + } + CDBG("Exit\n"); +} + +static struct v4l2_subdev_core_ops msm_ir_led_subdev_core_ops = { + .ioctl = msm_ir_led_subdev_ioctl, +}; + +static struct v4l2_subdev_ops msm_ir_led_subdev_ops = { + .core = &msm_ir_led_subdev_core_ops, +}; + +static int msm_ir_led_close(struct v4l2_subdev *sd, + struct v4l2_subdev_fh *fh) { + + int rc = 0; + struct msm_ir_led_ctrl_t *ir_led_ctrl = v4l2_get_subdevdata(sd); + + if (!ir_led_ctrl) { + pr_err("v4l2 subdevice data read failed\n"); + return -EINVAL; + } + + CDBG("Enter\n"); + + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_INIT) + rc = ir_led_ctrl->func_tbl->camera_ir_led_release( + ir_led_ctrl); + + CDBG("Exit (%d)\n", rc); + + return rc; +} + +static const struct v4l2_subdev_internal_ops msm_ir_led_internal_ops = { + .close = msm_ir_led_close, +}; + +static int32_t msm_ir_led_get_dt_data(struct device_node *of_node, + struct msm_ir_led_ctrl_t *fctrl) +{ + int32_t rc = 0; + + CDBG("called\n"); + + /* Read the sub device */ + rc = of_property_read_u32(of_node, "cell-index", &fctrl->pdev->id); + if (rc < 0) { + pr_err("reading cell-index for ir-led node is failed(rc) %d\n", + rc); + return rc; + } + + fctrl->ir_led_driver_type = IR_LED_DRIVER_DEFAULT; + return rc; +} + +#ifdef CONFIG_COMPAT +static long msm_ir_led_subdev_do_ioctl( + struct file *file, unsigned int cmd, void *arg) +{ + int32_t rc = 0; + struct video_device *vdev = video_devdata(file); + struct v4l2_subdev *sd = vdev_to_v4l2_subdev(vdev); + struct msm_ir_led_cfg_data_t32 *u32 = + (struct msm_ir_led_cfg_data_t32 *)arg; + struct msm_ir_led_cfg_data_t ir_led_data; + + CDBG("Enter\n"); + ir_led_data.cfg_type = u32->cfg_type; + ir_led_data.pwm_duty_on_ns = u32->pwm_duty_on_ns; + ir_led_data.pwm_period_ns = u32->pwm_period_ns; + + switch (cmd) { + case VIDIOC_MSM_IR_LED_CFG32: + cmd = VIDIOC_MSM_IR_LED_CFG; + break; + default: + return msm_ir_led_subdev_ioctl(sd, cmd, arg); + } + + rc = msm_ir_led_subdev_ioctl(sd, cmd, &ir_led_data); + + CDBG("Exit\n"); + return rc; +} + +static long msm_ir_led_subdev_fops_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + return video_usercopy(file, cmd, arg, msm_ir_led_subdev_do_ioctl); +} +#endif + +static int32_t msm_ir_led_platform_probe(struct platform_device *pdev) +{ + int32_t rc = 0; + struct msm_ir_led_ctrl_t *ir_led_ctrl = NULL; + + CDBG("Enter\n"); + if (!pdev->dev.of_node) { + pr_err("IR LED device node is not present in device tree\n"); + return -EINVAL; + } + + ir_led_ctrl = devm_kzalloc(&pdev->dev, sizeof(struct msm_ir_led_ctrl_t), + GFP_KERNEL); + if (!ir_led_ctrl) + return -ENOMEM; + + ir_led_ctrl->pdev = pdev; + + /* Reading PWM device node */ + ir_led_ctrl->pwm_dev = of_pwm_get(pdev->dev.of_node, NULL); + + if (IS_ERR(ir_led_ctrl->pwm_dev)) { + rc = PTR_ERR(ir_led_ctrl->pwm_dev); + pr_err("Cannot get PWM device (%d)\n", rc); + ir_led_ctrl->pwm_dev = NULL; + } + + rc = msm_ir_led_get_dt_data(pdev->dev.of_node, ir_led_ctrl); + if (rc < 0) { + pr_err("msm_ir_led_get_dt_data failed\n"); + devm_kfree(&pdev->dev, ir_led_ctrl); + return -EINVAL; + } + + ir_led_ctrl->ir_led_state = MSM_CAMERA_IR_LED_RELEASE; + ir_led_ctrl->power_info.dev = &ir_led_ctrl->pdev->dev; + ir_led_ctrl->ir_led_device_type = MSM_CAMERA_PLATFORM_DEVICE; + ir_led_ctrl->ir_led_mutex = &msm_ir_led_mutex; + + /* Initialize sub device */ + v4l2_subdev_init(&ir_led_ctrl->msm_sd.sd, &msm_ir_led_subdev_ops); + v4l2_set_subdevdata(&ir_led_ctrl->msm_sd.sd, ir_led_ctrl); + + ir_led_ctrl->msm_sd.sd.internal_ops = &msm_ir_led_internal_ops; + ir_led_ctrl->msm_sd.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; + snprintf(ir_led_ctrl->msm_sd.sd.name, + ARRAY_SIZE(ir_led_ctrl->msm_sd.sd.name), + "msm_camera_ir_led"); + media_entity_init(&ir_led_ctrl->msm_sd.sd.entity, 0, NULL, 0); + ir_led_ctrl->msm_sd.sd.entity.type = MEDIA_ENT_T_V4L2_SUBDEV; + ir_led_ctrl->msm_sd.sd.entity.group_id = MSM_CAMERA_SUBDEV_IR_LED; + ir_led_ctrl->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x1; + msm_sd_register(&ir_led_ctrl->msm_sd); + + CDBG("ir_led sd name = %s\n", + ir_led_ctrl->msm_sd.sd.entity.name); + msm_ir_led_v4l2_subdev_fops = v4l2_subdev_fops; +#ifdef CONFIG_COMPAT + msm_ir_led_v4l2_subdev_fops.compat_ioctl32 = + msm_ir_led_subdev_fops_ioctl; +#endif + ir_led_ctrl->msm_sd.sd.devnode->fops = &msm_ir_led_v4l2_subdev_fops; + + CDBG("probe success\n"); + return rc; +} + +MODULE_DEVICE_TABLE(of, msm_ir_led_dt_match); + +static struct platform_driver msm_ir_led_platform_driver = { + .probe = msm_ir_led_platform_probe, + .driver = { + .name = "qcom,ir-led", + .owner = THIS_MODULE, + .of_match_table = msm_ir_led_dt_match, + }, +}; + +static int __init msm_ir_led_init_module(void) +{ + int32_t rc = 0; + + CDBG("Enter\n"); + rc = platform_driver_register(&msm_ir_led_platform_driver); + if (!rc) + return rc; + + pr_err("ir-led driver register failed (%d)\n", rc); + + return rc; +} + +static void __exit msm_ir_led_exit_module(void) +{ + platform_driver_unregister(&msm_ir_led_platform_driver); +} + +static struct msm_ir_led_table msm_default_ir_led_table = { + .ir_led_driver_type = IR_LED_DRIVER_DEFAULT, + .func_tbl = { + .camera_ir_led_init = msm_ir_led_init, + .camera_ir_led_release = msm_ir_led_release, + .camera_ir_led_off = msm_ir_led_off, + .camera_ir_led_on = msm_ir_led_on, + }, +}; + +module_init(msm_ir_led_init_module); +module_exit(msm_ir_led_exit_module); +MODULE_DESCRIPTION("MSM IR LED"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.h b/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.h new file mode 100644 index 0000000000000..a0923ffc81dad --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.h @@ -0,0 +1,71 @@ +/* Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef MSM_IR_LED_H +#define MSM_IR_LED_H + +#include +#include +#include +#include +#include +#include "msm_sd.h" + +#define DEFINE_MSM_MUTEX(mutexname) \ + static struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) + +enum msm_camera_ir_led_state_t { + MSM_CAMERA_IR_LED_INIT, + MSM_CAMERA_IR_LED_RELEASE, +}; + +enum msm_ir_led_driver_type { + IR_LED_DRIVER_GPIO, + IR_LED_DRIVER_DEFAULT, +}; + +struct msm_ir_led_ctrl_t; + +struct msm_ir_led_func_t { + int32_t (*camera_ir_led_init)(struct msm_ir_led_ctrl_t *, + struct msm_ir_led_cfg_data_t *); + int32_t (*camera_ir_led_release)(struct msm_ir_led_ctrl_t *); + int32_t (*camera_ir_led_off)(struct msm_ir_led_ctrl_t *, + struct msm_ir_led_cfg_data_t *); + int32_t (*camera_ir_led_on)(struct msm_ir_led_ctrl_t *, + struct msm_ir_led_cfg_data_t *); +}; + +struct msm_ir_led_table { + enum msm_ir_led_driver_type ir_led_driver_type; + struct msm_ir_led_func_t func_tbl; +}; + +struct msm_ir_led_ctrl_t { + struct msm_sd_subdev msm_sd; + struct platform_device *pdev; + struct pwm_device *pwm_dev; + struct msm_ir_led_func_t *func_tbl; + struct msm_camera_power_ctrl_t power_info; + + enum msm_camera_device_type_t ir_led_device_type; + struct mutex *ir_led_mutex; + + /* ir_led driver type */ + enum msm_ir_led_driver_type ir_led_driver_type; + + /* ir_led state */ + enum msm_camera_ir_led_state_t ir_led_state; +}; + +#endif diff --git a/include/media/msm_cam_sensor.h b/include/media/msm_cam_sensor.h index fb650ab2693f8..57cddbde7d0d2 100644 --- a/include/media/msm_cam_sensor.h +++ b/include/media/msm_cam_sensor.h @@ -2,6 +2,7 @@ #define __LINUX_MSM_CAM_SENSOR_H #include +#include #include @@ -72,6 +73,12 @@ struct csid_cfg_data32 { } cfg; }; +struct msm_ir_led_cfg_data_t32 { + enum msm_ir_led_cfg_type_t cfg_type; + int32_t pwm_duty_on_ns; + int32_t pwm_period_ns; +}; + struct eeprom_read_t32 { compat_uptr_t dbuffer; uint32_t num_bytes; @@ -258,6 +265,9 @@ struct msm_flash_cfg_data_t32 { #define VIDIOC_MSM_FLASH_CFG32 \ _IOWR('V', BASE_VIDIOC_PRIVATE + 13, struct msm_flash_cfg_data_t32) + +#define VIDIOC_MSM_IR_LED_CFG32 \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 14, struct msm_ir_led_cfg_data_t32) #endif #endif diff --git a/include/uapi/media/msm_cam_sensor.h b/include/uapi/media/msm_cam_sensor.h index 540a96c57e5b9..b35ee5070bd7f 100644 --- a/include/uapi/media/msm_cam_sensor.h +++ b/include/uapi/media/msm_cam_sensor.h @@ -286,6 +286,12 @@ struct msm_eeprom_info_t { struct msm_eeprom_memory_map_array *mem_map_array; }; +struct msm_ir_led_cfg_data_t { + enum msm_ir_led_cfg_type_t cfg_type; + int32_t pwm_duty_on_ns; + int32_t pwm_period_ns; +}; + struct msm_eeprom_cfg_data { enum eeprom_cfg_type_t cfgtype; uint8_t is_supported; @@ -586,5 +592,8 @@ struct sensor_init_cfg_data { #define VIDIOC_MSM_OIS_CFG_DOWNLOAD \ _IOWR('V', BASE_VIDIOC_PRIVATE + 14, struct msm_ois_cfg_download_data) +#define VIDIOC_MSM_IR_LED_CFG \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 15, struct msm_ir_led_cfg_data_t) + #endif diff --git a/include/uapi/media/msm_camsensor_sdk.h b/include/uapi/media/msm_camsensor_sdk.h index 01e52b6f7b44e..fb33c871f7841 100644 --- a/include/uapi/media/msm_camsensor_sdk.h +++ b/include/uapi/media/msm_camsensor_sdk.h @@ -182,6 +182,17 @@ enum msm_flash_cfg_type_t { CFG_FLASH_HIGH, }; +enum msm_ir_led_cfg_type_t { + CFG_IR_LED_INIT = 0, + CFG_IR_LED_RELEASE, + CFG_IR_LED_OFF, + CFG_IR_LED_ON, +}; +#define CFG_IR_LED_INIT CFG_IR_LED_INIT +#define CFG_IR_LED_RELEASE CFG_IR_LED_RELEASE +#define CFG_IR_LED_OFF CFG_IR_LED_OFF +#define CFG_IR_LED_ON CFG_IR_LED_ON + enum msm_sensor_output_format_t { MSM_SENSOR_BAYER, MSM_SENSOR_YCBCR, diff --git a/include/uapi/media/msmb_camera.h b/include/uapi/media/msmb_camera.h index fe70daa772df1..cd8e065318bb8 100644 --- a/include/uapi/media/msmb_camera.h +++ b/include/uapi/media/msmb_camera.h @@ -48,7 +48,8 @@ #define MSM_CAMERA_SUBDEV_SENSOR_INIT 14 #define MSM_CAMERA_SUBDEV_OIS 15 #define MSM_CAMERA_SUBDEV_FLASH 16 -#define MSM_CAMERA_SUBDEV_EXT 17 +#define MSM_CAMERA_SUBDEV_IR_LED 17 +#define MSM_CAMERA_SUBDEV_EXT 18 #define MSM_MAX_CAMERA_SENSORS 5 From 4b6740e894a6a630ea450c92c95c07bc8093a8e8 Mon Sep 17 00:00:00 2001 From: Vivek Veenam Date: Mon, 27 Jun 2016 16:50:33 +0530 Subject: [PATCH 0295/1015] msm: camera: Add a driver to control IR CUT device This driver is able to control a IR CUT device. The interface to user space is: CFG_IR_CUT_INIT CFG_IR_CUT_OFF CFG_IR_CUT_ON CFG_IR_CUT_RELEASE Change-Id: I30d1c4e6c40b8e58a70f06db9e05231b4c7f676f Signed-off-by: Vivek Veenam --- .../bindings/media/video/msm-ir-cut.txt | 26 + .../platform/msm/camera_v2/sensor/Makefile | 2 +- .../camera_v2/sensor/io/msm_camera_dt_util.c | 48 ++ .../msm/camera_v2/sensor/ir_cut/Makefile | 4 + .../msm/camera_v2/sensor/ir_cut/msm_ir_cut.c | 665 ++++++++++++++++++ .../msm/camera_v2/sensor/ir_cut/msm_ir_cut.h | 72 ++ include/media/msm_cam_sensor.h | 7 + include/uapi/media/msm_cam_sensor.h | 7 + include/uapi/media/msm_camsensor_sdk.h | 20 + include/uapi/media/msmb_camera.h | 3 +- 10 files changed, 852 insertions(+), 2 deletions(-) create mode 100644 Documentation/devicetree/bindings/media/video/msm-ir-cut.txt create mode 100644 drivers/media/platform/msm/camera_v2/sensor/ir_cut/Makefile create mode 100644 drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.c create mode 100644 drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.h diff --git a/Documentation/devicetree/bindings/media/video/msm-ir-cut.txt b/Documentation/devicetree/bindings/media/video/msm-ir-cut.txt new file mode 100644 index 0000000000000..96cb28d692c1e --- /dev/null +++ b/Documentation/devicetree/bindings/media/video/msm-ir-cut.txt @@ -0,0 +1,26 @@ +* QTI MSM IR CUT + +Required properties: +- cell-index : ir cut filter hardware core index +- compatible : + - "qcom,ir-cut" + +Optional properties: +- gpios : should specify the gpios to be used for the ir cut filter. +- qcom,gpio-req-tbl-num : should contain index to gpios specific to ir cut filter +- qcom,gpio-req-tbl-flags : should contain direction of gpios present in + qcom,gpio-req-tbl-num property (in the same order) +- qcom,gpio-req-tbl-label : should contain name of gpios present in + qcom,gpio-req-tbl-num property (in the same order) +- label : should contain unique ir cut filter name +Example: + +qcom,ir-cut@60 { + cell-index = <0>; + compatible = "qcom,ir-cut"; + label = "led-ir-label"; + gpios = <&tlmm 60 0>; + qcom,gpio-req-tbl-num = <0>; + qcom,gpio-req-tbl-flags = <0>; + qcom,gpio-req-tbl-label = "LED_IR_EN"; + }; diff --git a/drivers/media/platform/msm/camera_v2/sensor/Makefile b/drivers/media/platform/msm/camera_v2/sensor/Makefile index de6abd46c60e7..872dc59d218e0 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/Makefile +++ b/drivers/media/platform/msm/camera_v2/sensor/Makefile @@ -4,5 +4,5 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2/msm_vb2 ccflags-y += -Idrivers/media/platform/msm/camera_v2/camera ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/cci -obj-$(CONFIG_MSMB_CAMERA) += cci/ io/ csiphy/ csid/ actuator/ eeprom/ ois/ flash/ ir_led/ +obj-$(CONFIG_MSMB_CAMERA) += cci/ io/ csiphy/ csid/ actuator/ eeprom/ ois/ flash/ ir_led/ ir_cut/ obj-$(CONFIG_MSM_CAMERA_SENSOR) += msm_sensor_init.o msm_sensor_driver.o msm_sensor.o diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c index 34245063c0ba1..754556e01f81e 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c @@ -760,6 +760,54 @@ int msm_camera_init_gpio_pin_tbl(struct device_node *of_node, rc = -ENOMEM; return rc; } + + rc = of_property_read_u32(of_node, "qcom,gpio-ir-p", &val); + if (rc != -EINVAL) { + if (rc < 0) { + pr_err("%s:%d read qcom,gpio-ir-p failed rc %d\n", + __func__, __LINE__, rc); + goto ERROR; + } else if (val >= gpio_array_size) { + pr_err("%s:%d qcom,gpio-ir-p invalid %d\n", + __func__, __LINE__, val); + rc = -EINVAL; + goto ERROR; + } + + gconf->gpio_num_info->gpio_num[IR_CUT_FILTER_GPIO_P] = + gpio_array[val]; + gconf->gpio_num_info->valid[IR_CUT_FILTER_GPIO_P] = 1; + + CDBG("%s qcom,gpio-ir-p %d\n", __func__, + gconf->gpio_num_info->gpio_num[IR_CUT_FILTER_GPIO_P]); + } else { + rc = 0; + } + + rc = of_property_read_u32(of_node, "qcom,gpio-ir-m", &val); + if (rc != -EINVAL) { + if (rc < 0) { + pr_err("%s:%d read qcom,gpio-ir-m failed rc %d\n", + __func__, __LINE__, rc); + goto ERROR; + } else if (val >= gpio_array_size) { + pr_err("%s:%d qcom,gpio-ir-m invalid %d\n", + __func__, __LINE__, val); + rc = -EINVAL; + goto ERROR; + } + + gconf->gpio_num_info->gpio_num[IR_CUT_FILTER_GPIO_M] = + gpio_array[val]; + + gconf->gpio_num_info->valid[IR_CUT_FILTER_GPIO_M] = 1; + + CDBG("%s qcom,gpio-ir-m %d\n", __func__, + gconf->gpio_num_info->gpio_num[IR_CUT_FILTER_GPIO_M]); + } else { + rc = 0; + } + rc = of_property_read_u32(of_node, "qcom,gpio-vana", &val); if (rc != -EINVAL) { if (rc < 0) { diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_cut/Makefile b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/Makefile new file mode 100644 index 0000000000000..8950c1c83763f --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/Makefile @@ -0,0 +1,4 @@ +ccflags-y += -Idrivers/media/platform/msm/camera_v2 +ccflags-y += -Idrivers/media/platform/msm/camera_v2/common +ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io +obj-$(CONFIG_MSMB_CAMERA) += msm_ir_cut.o diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.c b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.c new file mode 100644 index 0000000000000..e8f74f8beb1bb --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.c @@ -0,0 +1,665 @@ +/* Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#define pr_fmt(fmt) "%s:%d " fmt, __func__, __LINE__ + +#include +#include +#include "msm_ir_cut.h" +#include "msm_camera_dt_util.h" + +#undef CDBG +#define CDBG(fmt, args...) pr_debug(fmt, ##args) + +DEFINE_MSM_MUTEX(msm_ir_cut_mutex); + +static struct v4l2_file_operations msm_ir_cut_v4l2_subdev_fops; + +static const struct of_device_id msm_ir_cut_dt_match[] = { + {.compatible = "qcom,ir-cut", .data = NULL}, + {} +}; + +static struct msm_ir_cut_table msm_gpio_ir_cut_table; + +static struct msm_ir_cut_table *ir_cut_table[] = { + &msm_gpio_ir_cut_table, +}; + +static int32_t msm_ir_cut_get_subdev_id( + struct msm_ir_cut_ctrl_t *ir_cut_ctrl, void *arg) +{ + uint32_t *subdev_id = (uint32_t *)arg; + + CDBG("Enter\n"); + if (!subdev_id) { + pr_err("failed\n"); + return -EINVAL; + } + if (MSM_CAMERA_PLATFORM_DEVICE != ir_cut_ctrl->ir_cut_device_type) { + pr_err("failed\n"); + return -EINVAL; + } + + *subdev_id = ir_cut_ctrl->pdev->id; + + CDBG("subdev_id %d\n", *subdev_id); + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_cut_init( + struct msm_ir_cut_ctrl_t *ir_cut_ctrl, + struct msm_ir_cut_cfg_data_t *ir_cut_data) +{ + int32_t rc = 0; + + CDBG("Enter"); + + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_on(ir_cut_ctrl, ir_cut_data); + + CDBG("Exit"); + return rc; +} + +static int32_t msm_ir_cut_release( + struct msm_ir_cut_ctrl_t *ir_cut_ctrl) +{ + int32_t rc = 0; + + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_RELEASE) { + pr_err("%s:%d Invalid ir_cut state = %d", + __func__, __LINE__, ir_cut_ctrl->ir_cut_state); + return 0; + } + + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_on(ir_cut_ctrl, NULL); + if (rc < 0) { + pr_err("%s:%d camera_ir_cut_on failed rc = %d", + __func__, __LINE__, rc); + return rc; + } + ir_cut_ctrl->ir_cut_state = MSM_CAMERA_IR_CUT_RELEASE; + return 0; +} + +static int32_t msm_ir_cut_off(struct msm_ir_cut_ctrl_t *ir_cut_ctrl, + struct msm_ir_cut_cfg_data_t *ir_cut_data) +{ + int rc = 0; + + CDBG("Enter cut off\n"); + + if (ir_cut_ctrl->gconf) { + rc = msm_camera_request_gpio_table( + ir_cut_ctrl->gconf->cam_gpio_req_tbl, + ir_cut_ctrl->gconf->cam_gpio_req_tbl_size, 1); + + if (rc < 0) { + pr_err("ERR:%s:Failed in selecting state: %d\n", + __func__, rc); + + return rc; + } + } else { + pr_err("%s: No IR CUT GPIOs\n", __func__); + return 0; + } + + if (ir_cut_ctrl->cam_pinctrl_status) { + rc = pinctrl_select_state( + ir_cut_ctrl->pinctrl_info.pinctrl, + ir_cut_ctrl->pinctrl_info.gpio_state_active); + + if (rc < 0) + pr_err("ERR:%s:%d cannot set pin to active state: %d", + __func__, __LINE__, rc); + } + + CDBG("ERR:%s:gpio_conf->gpio_num_info->gpio_num[0] = %d", + __func__, + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_P]); + + CDBG("ERR:%s:gpio_conf->gpio_num_info->gpio_num[1] = %d", + __func__, + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_M]); + + gpio_set_value_cansleep( + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_P], + 0); + + gpio_set_value_cansleep( + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_M], + 1); + + if (ir_cut_ctrl->gconf) { + rc = msm_camera_request_gpio_table( + ir_cut_ctrl->gconf->cam_gpio_req_tbl, + ir_cut_ctrl->gconf->cam_gpio_req_tbl_size, 0); + + if (rc < 0) { + pr_err("ERR:%s:Failed in selecting state: %d\n", + __func__, rc); + + return rc; + } + } else { + pr_err("%s: No IR CUT GPIOs\n", __func__); + return 0; + } + + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_cut_on( + struct msm_ir_cut_ctrl_t *ir_cut_ctrl, + struct msm_ir_cut_cfg_data_t *ir_cut_data) +{ + int rc = 0; + + CDBG("Enter ir cut on\n"); + + if (ir_cut_ctrl->gconf) { + rc = msm_camera_request_gpio_table( + ir_cut_ctrl->gconf->cam_gpio_req_tbl, + ir_cut_ctrl->gconf->cam_gpio_req_tbl_size, 1); + + if (rc < 0) { + pr_err("ERR:%s:Failed in selecting state: %d\n", + __func__, rc); + + return rc; + } + } else { + pr_err("%s: No IR CUT GPIOs\n", __func__); + return 0; + } + + if (ir_cut_ctrl->cam_pinctrl_status) { + rc = pinctrl_select_state( + ir_cut_ctrl->pinctrl_info.pinctrl, + ir_cut_ctrl->pinctrl_info.gpio_state_active); + + if (rc < 0) + pr_err("ERR:%s:%d cannot set pin to active state: %d", + __func__, __LINE__, rc); + } + + CDBG("ERR:%s: gpio_conf->gpio_num_info->gpio_num[0] = %d", + __func__, + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_P]); + + CDBG("ERR:%s: gpio_conf->gpio_num_info->gpio_num[1] = %d", + __func__, + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_M]); + + gpio_set_value_cansleep( + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_P], + 1); + + gpio_set_value_cansleep( + ir_cut_ctrl->gconf-> + gpio_num_info->gpio_num[IR_CUT_FILTER_GPIO_M], + 1); + + if (ir_cut_ctrl->gconf) { + rc = msm_camera_request_gpio_table( + ir_cut_ctrl->gconf->cam_gpio_req_tbl, + ir_cut_ctrl->gconf->cam_gpio_req_tbl_size, 0); + + if (rc < 0) { + pr_err("ERR:%s:Failed in selecting state: %d\n", + __func__, rc); + + return rc; + } + } else { + pr_err("%s: No IR CUT GPIOs\n", __func__); + return 0; + } + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_cut_handle_init( + struct msm_ir_cut_ctrl_t *ir_cut_ctrl, + struct msm_ir_cut_cfg_data_t *ir_cut_data) +{ + uint32_t i = 0; + int32_t rc = -EFAULT; + enum msm_ir_cut_driver_type ir_cut_driver_type = + ir_cut_ctrl->ir_cut_driver_type; + + CDBG("Enter"); + + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_INIT) { + pr_err("%s:%d Invalid ir_cut state = %d", + __func__, __LINE__, ir_cut_ctrl->ir_cut_state); + return 0; + } + + for (i = 0; i < ARRAY_SIZE(ir_cut_table); i++) { + if (ir_cut_driver_type == ir_cut_table[i]->ir_cut_driver_type) { + ir_cut_ctrl->func_tbl = &ir_cut_table[i]->func_tbl; + rc = 0; + break; + } + } + + if (rc < 0) { + pr_err("%s:%d failed invalid ir_cut_driver_type %d\n", + __func__, __LINE__, ir_cut_driver_type); + return -EINVAL; + } + + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_init( + ir_cut_ctrl, ir_cut_data); + if (rc < 0) { + pr_err("%s:%d camera_ir_cut_init failed rc = %d", + __func__, __LINE__, rc); + return rc; + } + + ir_cut_ctrl->ir_cut_state = MSM_CAMERA_IR_CUT_INIT; + + CDBG("Exit"); + return 0; +} + +static int32_t msm_ir_cut_config(struct msm_ir_cut_ctrl_t *ir_cut_ctrl, + void __user *argp) +{ + int32_t rc = -EINVAL; + struct msm_ir_cut_cfg_data_t *ir_cut_data = + (struct msm_ir_cut_cfg_data_t *) argp; + + mutex_lock(ir_cut_ctrl->ir_cut_mutex); + + CDBG("Enter %s type %d\n", __func__, ir_cut_data->cfg_type); + + switch (ir_cut_data->cfg_type) { + case CFG_IR_CUT_INIT: + rc = msm_ir_cut_handle_init(ir_cut_ctrl, ir_cut_data); + break; + case CFG_IR_CUT_RELEASE: + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_INIT) + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_release( + ir_cut_ctrl); + break; + case CFG_IR_CUT_OFF: + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_INIT) + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_off( + ir_cut_ctrl, ir_cut_data); + break; + case CFG_IR_CUT_ON: + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_INIT) + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_on( + ir_cut_ctrl, ir_cut_data); + break; + default: + rc = -EFAULT; + break; + } + + mutex_unlock(ir_cut_ctrl->ir_cut_mutex); + + CDBG("Exit %s type %d\n", __func__, ir_cut_data->cfg_type); + + return rc; +} + +static long msm_ir_cut_subdev_ioctl(struct v4l2_subdev *sd, + unsigned int cmd, void *arg) +{ + struct msm_ir_cut_ctrl_t *fctrl = NULL; + void __user *argp = (void __user *)arg; + + CDBG("Enter\n"); + + if (!sd) { + pr_err("sd NULL\n"); + return -EINVAL; + } + fctrl = v4l2_get_subdevdata(sd); + if (!fctrl) { + pr_err("fctrl NULL\n"); + return -EINVAL; + } + switch (cmd) { + case VIDIOC_MSM_SENSOR_GET_SUBDEV_ID: + return msm_ir_cut_get_subdev_id(fctrl, argp); + case VIDIOC_MSM_IR_CUT_CFG: + return msm_ir_cut_config(fctrl, argp); + case MSM_SD_NOTIFY_FREEZE: + return 0; + case MSM_SD_SHUTDOWN: + if (!fctrl->func_tbl) { + pr_err("fctrl->func_tbl NULL\n"); + return -EINVAL; + } else { + return fctrl->func_tbl->camera_ir_cut_release(fctrl); + } + default: + pr_err_ratelimited("invalid cmd %d\n", cmd); + return -ENOIOCTLCMD; + } + CDBG("Exit\n"); +} + +static struct v4l2_subdev_core_ops msm_ir_cut_subdev_core_ops = { + .ioctl = msm_ir_cut_subdev_ioctl, +}; + +static struct v4l2_subdev_ops msm_ir_cut_subdev_ops = { + .core = &msm_ir_cut_subdev_core_ops, +}; +static int msm_ir_cut_close(struct v4l2_subdev *sd, + struct v4l2_subdev_fh *fh) { + + int rc = 0; + struct msm_ir_cut_ctrl_t *ir_cut_ctrl = v4l2_get_subdevdata(sd); + + CDBG("Enter\n"); + + if (!ir_cut_ctrl) { + pr_err("%s: failed\n", __func__); + return -EINVAL; + } + + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_INIT) + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_release( + ir_cut_ctrl); + + CDBG("Exit\n"); + + return rc; +}; + +static const struct v4l2_subdev_internal_ops msm_ir_cut_internal_ops = { + .close = msm_ir_cut_close, +}; + +static int32_t msm_ir_cut_get_gpio_dt_data(struct device_node *of_node, + struct msm_ir_cut_ctrl_t *fctrl) +{ + int32_t rc = 0, i = 0; + uint16_t *gpio_array = NULL; + int16_t gpio_array_size = 0; + struct msm_camera_gpio_conf *gconf = NULL; + + gpio_array_size = of_gpio_count(of_node); + CDBG("%s gpio count %d\n", __func__, gpio_array_size); + + if (gpio_array_size > 0) { + fctrl->power_info.gpio_conf = + kzalloc(sizeof(struct msm_camera_gpio_conf), + GFP_KERNEL); + if (!fctrl->power_info.gpio_conf) { + pr_err("%s failed %d\n", __func__, __LINE__); + rc = -ENOMEM; + return rc; + } + gconf = fctrl->power_info.gpio_conf; + + gpio_array = kcalloc(gpio_array_size, sizeof(uint16_t), + GFP_KERNEL); + if (!gpio_array) + return -ENOMEM; + for (i = 0; i < gpio_array_size; i++) { + gpio_array[i] = of_get_gpio(of_node, i); + if (((int16_t)gpio_array[i]) < 0) { + pr_err("%s failed %d\n", __func__, __LINE__); + rc = -EINVAL; + goto free_gpio_array; + } + CDBG("%s gpio_array[%d] = %d\n", __func__, i, + gpio_array[i]); + } + + rc = msm_camera_get_dt_gpio_req_tbl(of_node, gconf, + gpio_array, gpio_array_size); + if (rc < 0) { + pr_err("%s failed %d\n", __func__, __LINE__); + goto free_gpio_array; + } + kfree(gpio_array); + + if (fctrl->ir_cut_driver_type == IR_CUT_DRIVER_DEFAULT) + fctrl->ir_cut_driver_type = IR_CUT_DRIVER_GPIO; + CDBG("%s:%d fctrl->ir_cut_driver_type = %d", __func__, __LINE__, + fctrl->ir_cut_driver_type); + } + + return rc; + +free_gpio_array: + kfree(gpio_array); + return rc; +} + +static int32_t msm_ir_cut_get_dt_data(struct device_node *of_node, + struct msm_ir_cut_ctrl_t *fctrl) +{ + int32_t rc = 0; + + CDBG("called\n"); + + if (!of_node) { + pr_err("of_node NULL\n"); + return -EINVAL; + } + + /* Read the sub device */ + rc = of_property_read_u32(of_node, "cell-index", &fctrl->pdev->id); + if (rc < 0) { + pr_err("failed rc %d\n", rc); + return rc; + } + + fctrl->ir_cut_driver_type = IR_CUT_DRIVER_DEFAULT; + + /* Read the gpio information from device tree */ + rc = msm_ir_cut_get_gpio_dt_data(of_node, fctrl); + if (rc < 0) { + pr_err("%s:%d msm_ir_cut_get_gpio_dt_data failed rc %d\n", + __func__, __LINE__, rc); + return rc; + } + + return rc; +} + +#ifdef CONFIG_COMPAT +static long msm_ir_cut_subdev_do_ioctl( + struct file *file, unsigned int cmd, void *arg) +{ + int32_t rc = 0; + struct video_device *vdev = video_devdata(file); + struct v4l2_subdev *sd = vdev_to_v4l2_subdev(vdev); + struct msm_ir_cut_cfg_data_t32 *u32 = + (struct msm_ir_cut_cfg_data_t32 *)arg; + struct msm_ir_cut_cfg_data_t ir_cut_data; + + CDBG("Enter"); + ir_cut_data.cfg_type = u32->cfg_type; + + switch (cmd) { + case VIDIOC_MSM_IR_CUT_CFG32: + cmd = VIDIOC_MSM_IR_CUT_CFG; + break; + default: + return msm_ir_cut_subdev_ioctl(sd, cmd, arg); + } + + rc = msm_ir_cut_subdev_ioctl(sd, cmd, &ir_cut_data); + + CDBG("Exit"); + return rc; +} + +static long msm_ir_cut_subdev_fops_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + return video_usercopy(file, cmd, arg, msm_ir_cut_subdev_do_ioctl); +} +#endif + +static int32_t msm_ir_cut_platform_probe(struct platform_device *pdev) +{ + int32_t rc = 0, i = 0; + struct msm_ir_cut_ctrl_t *ir_cut_ctrl = NULL; + + CDBG("Enter"); + if (!pdev->dev.of_node) { + pr_err("of_node NULL\n"); + return -EINVAL; + } + + ir_cut_ctrl = kzalloc(sizeof(struct msm_ir_cut_ctrl_t), GFP_KERNEL); + if (!ir_cut_ctrl) + return -ENOMEM; + + memset(ir_cut_ctrl, 0, sizeof(struct msm_ir_cut_ctrl_t)); + + ir_cut_ctrl->pdev = pdev; + + rc = msm_ir_cut_get_dt_data(pdev->dev.of_node, ir_cut_ctrl); + + if (rc < 0) { + pr_err("%s:%d msm_ir_cut_get_dt_data failed\n", + __func__, __LINE__); + kfree(ir_cut_ctrl); + return -EINVAL; + } + + rc = msm_sensor_driver_get_gpio_data(&(ir_cut_ctrl->gconf), + (&pdev->dev)->of_node); + + if ((rc < 0) || (ir_cut_ctrl->gconf == NULL)) { + pr_err("%s: No IR CUT GPIOs\n", __func__); + + kfree(ir_cut_ctrl); + return -EINVAL; + } + + CDBG("%s: gpio_request_table_size = %d\n", + __func__, + ir_cut_ctrl->gconf->cam_gpio_req_tbl_size); + + for (i = 0; + i < ir_cut_ctrl->gconf->cam_gpio_req_tbl_size; i++) { + CDBG("%s: gpio = %d\n", __func__, + ir_cut_ctrl->gconf->cam_gpio_req_tbl[i].gpio); + CDBG("%s: gpio-flags = %lu\n", __func__, + ir_cut_ctrl->gconf->cam_gpio_req_tbl[i].flags); + CDBG("%s: gconf->gpio_num_info->gpio_num[%d] = %d\n", + __func__, i, + ir_cut_ctrl->gconf->gpio_num_info->gpio_num[i]); + } + + ir_cut_ctrl->cam_pinctrl_status = 1; + + rc = msm_camera_pinctrl_init( + &(ir_cut_ctrl->pinctrl_info), &(pdev->dev)); + + if (rc < 0) { + pr_err("ERR:%s: Error in reading IR CUT pinctrl\n", + __func__); + ir_cut_ctrl->cam_pinctrl_status = 0; + } + + ir_cut_ctrl->ir_cut_state = MSM_CAMERA_IR_CUT_RELEASE; + ir_cut_ctrl->power_info.dev = &ir_cut_ctrl->pdev->dev; + ir_cut_ctrl->ir_cut_device_type = MSM_CAMERA_PLATFORM_DEVICE; + ir_cut_ctrl->ir_cut_mutex = &msm_ir_cut_mutex; + + /* Initialize sub device */ + v4l2_subdev_init(&ir_cut_ctrl->msm_sd.sd, &msm_ir_cut_subdev_ops); + v4l2_set_subdevdata(&ir_cut_ctrl->msm_sd.sd, ir_cut_ctrl); + + ir_cut_ctrl->msm_sd.sd.internal_ops = &msm_ir_cut_internal_ops; + ir_cut_ctrl->msm_sd.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; + snprintf(ir_cut_ctrl->msm_sd.sd.name, + ARRAY_SIZE(ir_cut_ctrl->msm_sd.sd.name), + "msm_camera_ir_cut"); + media_entity_init(&ir_cut_ctrl->msm_sd.sd.entity, 0, NULL, 0); + ir_cut_ctrl->msm_sd.sd.entity.type = MEDIA_ENT_T_V4L2_SUBDEV; + ir_cut_ctrl->msm_sd.sd.entity.group_id = MSM_CAMERA_SUBDEV_IR_CUT; + ir_cut_ctrl->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x1; + msm_sd_register(&ir_cut_ctrl->msm_sd); + + CDBG("%s:%d ir_cut sd name = %s", __func__, __LINE__, + ir_cut_ctrl->msm_sd.sd.entity.name); + msm_ir_cut_v4l2_subdev_fops = v4l2_subdev_fops; +#ifdef CONFIG_COMPAT + msm_ir_cut_v4l2_subdev_fops.compat_ioctl32 = + msm_ir_cut_subdev_fops_ioctl; +#endif + ir_cut_ctrl->msm_sd.sd.devnode->fops = &msm_ir_cut_v4l2_subdev_fops; + + CDBG("probe success\n"); + return rc; +} + +MODULE_DEVICE_TABLE(of, msm_ir_cut_dt_match); + +static struct platform_driver msm_ir_cut_platform_driver = { + .probe = msm_ir_cut_platform_probe, + .driver = { + .name = "qcom,ir-cut", + .owner = THIS_MODULE, + .of_match_table = msm_ir_cut_dt_match, + }, +}; + +static int __init msm_ir_cut_init_module(void) +{ + int32_t rc = 0; + + CDBG("Enter\n"); + rc = platform_driver_register(&msm_ir_cut_platform_driver); + if (!rc) + return rc; + + pr_err("platform probe for ir_cut failed"); + + return rc; +} + +static void __exit msm_ir_cut_exit_module(void) +{ + platform_driver_unregister(&msm_ir_cut_platform_driver); +} + +static struct msm_ir_cut_table msm_gpio_ir_cut_table = { + .ir_cut_driver_type = IR_CUT_DRIVER_GPIO, + .func_tbl = { + .camera_ir_cut_init = msm_ir_cut_init, + .camera_ir_cut_release = msm_ir_cut_release, + .camera_ir_cut_off = msm_ir_cut_off, + .camera_ir_cut_on = msm_ir_cut_on, + }, +}; + +module_init(msm_ir_cut_init_module); +module_exit(msm_ir_cut_exit_module); +MODULE_DESCRIPTION("MSM IR CUT"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.h b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.h new file mode 100644 index 0000000000000..23fd239525230 --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.h @@ -0,0 +1,72 @@ +/* Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef MSM_IR_CUT_H +#define MSM_IR_CUT_H + +#include +#include "msm_camera_dt_util.h" +#include "msm_camera_io_util.h" +#include "msm_sd.h" + +#define DEFINE_MSM_MUTEX(mutexname) \ + static struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) + +enum msm_camera_ir_cut_state_t { + MSM_CAMERA_IR_CUT_INIT, + MSM_CAMERA_IR_CUT_RELEASE, +}; + +enum msm_ir_cut_driver_type { + IR_CUT_DRIVER_GPIO, + IR_CUT_DRIVER_DEFAULT, +}; + +struct msm_ir_cut_ctrl_t; + +struct msm_ir_cut_func_t { + int32_t (*camera_ir_cut_init)(struct msm_ir_cut_ctrl_t *, + struct msm_ir_cut_cfg_data_t *); + int32_t (*camera_ir_cut_release)(struct msm_ir_cut_ctrl_t *); + int32_t (*camera_ir_cut_off)(struct msm_ir_cut_ctrl_t *, + struct msm_ir_cut_cfg_data_t *); + int32_t (*camera_ir_cut_on)(struct msm_ir_cut_ctrl_t *, + struct msm_ir_cut_cfg_data_t *); +}; + +struct msm_ir_cut_table { + enum msm_ir_cut_driver_type ir_cut_driver_type; + struct msm_ir_cut_func_t func_tbl; +}; + +struct msm_ir_cut_ctrl_t { + struct msm_sd_subdev msm_sd; + struct platform_device *pdev; + struct msm_ir_cut_func_t *func_tbl; + struct msm_camera_power_ctrl_t power_info; + + enum msm_camera_device_type_t ir_cut_device_type; + struct mutex *ir_cut_mutex; + + /* ir_cut driver type */ + enum msm_ir_cut_driver_type ir_cut_driver_type; + + /* ir_cut state */ + enum msm_camera_ir_cut_state_t ir_cut_state; + + struct msm_camera_gpio_conf *gconf; + struct msm_pinctrl_info pinctrl_info; + uint8_t cam_pinctrl_status; +}; + +#endif diff --git a/include/media/msm_cam_sensor.h b/include/media/msm_cam_sensor.h index 57cddbde7d0d2..75d0912aa459f 100644 --- a/include/media/msm_cam_sensor.h +++ b/include/media/msm_cam_sensor.h @@ -79,6 +79,10 @@ struct msm_ir_led_cfg_data_t32 { int32_t pwm_period_ns; }; +struct msm_ir_cut_cfg_data_t32 { + enum msm_ir_cut_cfg_type_t cfg_type; +}; + struct eeprom_read_t32 { compat_uptr_t dbuffer; uint32_t num_bytes; @@ -268,6 +272,9 @@ struct msm_flash_cfg_data_t32 { #define VIDIOC_MSM_IR_LED_CFG32 \ _IOWR('V', BASE_VIDIOC_PRIVATE + 14, struct msm_ir_led_cfg_data_t32) + +#define VIDIOC_MSM_IR_CUT_CFG32 \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 15, struct msm_ir_cut_cfg_data_t32) #endif #endif diff --git a/include/uapi/media/msm_cam_sensor.h b/include/uapi/media/msm_cam_sensor.h index b35ee5070bd7f..7ae0719972e47 100644 --- a/include/uapi/media/msm_cam_sensor.h +++ b/include/uapi/media/msm_cam_sensor.h @@ -292,6 +292,10 @@ struct msm_ir_led_cfg_data_t { int32_t pwm_period_ns; }; +struct msm_ir_cut_cfg_data_t { + enum msm_ir_cut_cfg_type_t cfg_type; +}; + struct msm_eeprom_cfg_data { enum eeprom_cfg_type_t cfgtype; uint8_t is_supported; @@ -595,5 +599,8 @@ struct sensor_init_cfg_data { #define VIDIOC_MSM_IR_LED_CFG \ _IOWR('V', BASE_VIDIOC_PRIVATE + 15, struct msm_ir_led_cfg_data_t) +#define VIDIOC_MSM_IR_CUT_CFG \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 15, struct msm_ir_cut_cfg_data_t) + #endif diff --git a/include/uapi/media/msm_camsensor_sdk.h b/include/uapi/media/msm_camsensor_sdk.h index fb33c871f7841..ad0825e332177 100644 --- a/include/uapi/media/msm_camsensor_sdk.h +++ b/include/uapi/media/msm_camsensor_sdk.h @@ -114,6 +114,15 @@ enum msm_sensor_power_seq_gpio_t { SENSOR_GPIO_MAX, }; +enum msm_ir_cut_filter_gpio_t { + IR_CUT_FILTER_GPIO_P = 0, + IR_CUT_FILTER_GPIO_M, + IR_CUT_FILTER_GPIO_MAX, +}; +#define IR_CUT_FILTER_GPIO_P IR_CUT_FILTER_GPIO_P +#define IR_CUT_FILTER_GPIO_M IR_CUT_FILTER_GPIO_M +#define R_CUT_FILTER_GPIO_MAX IR_CUT_FILTER_GPIO_MAX + enum msm_camera_vreg_name_t { CAM_VDIG, CAM_VIO, @@ -193,6 +202,17 @@ enum msm_ir_led_cfg_type_t { #define CFG_IR_LED_OFF CFG_IR_LED_OFF #define CFG_IR_LED_ON CFG_IR_LED_ON +enum msm_ir_cut_cfg_type_t { + CFG_IR_CUT_INIT = 0, + CFG_IR_CUT_RELEASE, + CFG_IR_CUT_OFF, + CFG_IR_CUT_ON, +}; +#define CFG_IR_CUT_INIT CFG_IR_CUT_INIT +#define CFG_IR_CUT_RELEASE CFG_IR_CUT_RELEASE +#define CFG_IR_CUT_OFF CFG_IR_CUT_OFF +#define CFG_IR_CUT_ON CFG_IR_CUT_ON + enum msm_sensor_output_format_t { MSM_SENSOR_BAYER, MSM_SENSOR_YCBCR, diff --git a/include/uapi/media/msmb_camera.h b/include/uapi/media/msmb_camera.h index cd8e065318bb8..071331ef68829 100644 --- a/include/uapi/media/msmb_camera.h +++ b/include/uapi/media/msmb_camera.h @@ -49,7 +49,8 @@ #define MSM_CAMERA_SUBDEV_OIS 15 #define MSM_CAMERA_SUBDEV_FLASH 16 #define MSM_CAMERA_SUBDEV_IR_LED 17 -#define MSM_CAMERA_SUBDEV_EXT 18 +#define MSM_CAMERA_SUBDEV_IR_CUT 18 +#define MSM_CAMERA_SUBDEV_EXT 19 #define MSM_MAX_CAMERA_SENSORS 5 From 568568b3564b34c387ec126f21f3745ed8f23507 Mon Sep 17 00:00:00 2001 From: Vivek Veenam Date: Thu, 23 Jun 2016 23:44:42 +0530 Subject: [PATCH 0296/1015] msm: camera: Export IR LED device to mm-qcamera-daemon Extend sensor_info structure with one more field to be able to export the LED IR device to mm-qcamera-daemon. Change-Id: Ibb8afffdc1e4780a48d085918cb6d6cf84cc0dba Signed-off-by: Vivek Veenam --- .../devicetree/bindings/media/video/msm-cci.txt | 2 ++ .../msm/camera_v2/sensor/io/msm_camera_dt_util.c | 16 ++++++++++++++++ include/uapi/media/msm_cam_sensor.h | 1 + 3 files changed, 19 insertions(+) diff --git a/Documentation/devicetree/bindings/media/video/msm-cci.txt b/Documentation/devicetree/bindings/media/video/msm-cci.txt index 009754132974f..2738ebf676bd7 100644 --- a/Documentation/devicetree/bindings/media/video/msm-cci.txt +++ b/Documentation/devicetree/bindings/media/video/msm-cci.txt @@ -166,6 +166,8 @@ Optional properties: property should contain phandle of respective eeprom nodes - qcom,ois-src : if optical image stabilization is supported by this sensor, this property should contain phandle of respective ois node +- qcom,ir-led-src : if ir led is supported by this sensor, this property + should contain phandle of respective ir-led node * Qualcomm MSM ACTUATOR diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c index 34245063c0ba1..299e910e5aa4a 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c @@ -282,6 +282,22 @@ int msm_sensor_get_sub_module_index(struct device_node *of_node, src_node = NULL; } + src_node = of_parse_phandle(of_node, "qcom,ir-led-src", 0); + if (!src_node) { + CDBG("%s:%d src_node NULL\n", __func__, __LINE__); + } else { + rc = of_property_read_u32(src_node, "cell-index", &val); + CDBG("%s qcom,ir led cell index %d, rc %d\n", __func__, + val, rc); + if (rc < 0) { + pr_err("%s:%d failed %d\n", __func__, __LINE__, rc); + goto ERROR; + } + sensor_info->subdev_id[SUB_MODULE_IR_LED] = val; + of_node_put(src_node); + src_node = NULL; + } + rc = of_property_read_u32(of_node, "qcom,strobe-flash-sd-index", &val); if (rc != -EINVAL) { CDBG("%s qcom,strobe-flash-sd-index %d, rc %d\n", __func__, diff --git a/include/uapi/media/msm_cam_sensor.h b/include/uapi/media/msm_cam_sensor.h index 540a96c57e5b9..a61bc18b490e8 100644 --- a/include/uapi/media/msm_cam_sensor.h +++ b/include/uapi/media/msm_cam_sensor.h @@ -83,6 +83,7 @@ enum sensor_sub_module_t { SUB_MODULE_CSIPHY_3D, SUB_MODULE_OIS, SUB_MODULE_EXT, + SUB_MODULE_IR_LED, SUB_MODULE_MAX, }; From 1cc301f1acfb50ffe58d972a23714aff73cfe30e Mon Sep 17 00:00:00 2001 From: Vivek Veenam Date: Fri, 24 Jun 2016 00:07:47 +0530 Subject: [PATCH 0297/1015] msm: camera: Export IR CUT device to mm-qcamera-daemon Extend sensor_info structure with one more field to be able to export the IR CUT device to mm-qcamera-daemon. Change-Id: I63da161f90bce2c33d1e7e9d5822c8635e307fd5 Signed-off-by: Vivek Veenam --- .../devicetree/bindings/media/video/msm-cci.txt | 2 ++ .../msm/camera_v2/sensor/io/msm_camera_dt_util.c | 16 ++++++++++++++++ include/uapi/media/msm_cam_sensor.h | 1 + 3 files changed, 19 insertions(+) diff --git a/Documentation/devicetree/bindings/media/video/msm-cci.txt b/Documentation/devicetree/bindings/media/video/msm-cci.txt index 2738ebf676bd7..3fdd91ca65382 100644 --- a/Documentation/devicetree/bindings/media/video/msm-cci.txt +++ b/Documentation/devicetree/bindings/media/video/msm-cci.txt @@ -168,6 +168,8 @@ Optional properties: this property should contain phandle of respective ois node - qcom,ir-led-src : if ir led is supported by this sensor, this property should contain phandle of respective ir-led node +- qcom,ir-cut-src : if ir cut is supported by this sensor, this property + should contain phandle of respective ir-cut node * Qualcomm MSM ACTUATOR diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c index 299e910e5aa4a..a2671ff3deac0 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c @@ -298,6 +298,22 @@ int msm_sensor_get_sub_module_index(struct device_node *of_node, src_node = NULL; } + src_node = of_parse_phandle(of_node, "qcom,ir-cut-src", 0); + if (!src_node) { + CDBG("%s:%d src_node NULL\n", __func__, __LINE__); + } else { + rc = of_property_read_u32(src_node, "cell-index", &val); + CDBG("%s qcom,ir cut cell index %d, rc %d\n", __func__, + val, rc); + if (rc < 0) { + pr_err("%s:%d failed %d\n", __func__, __LINE__, rc); + goto ERROR; + } + sensor_info->subdev_id[SUB_MODULE_IR_CUT] = val; + of_node_put(src_node); + src_node = NULL; + } + rc = of_property_read_u32(of_node, "qcom,strobe-flash-sd-index", &val); if (rc != -EINVAL) { CDBG("%s qcom,strobe-flash-sd-index %d, rc %d\n", __func__, diff --git a/include/uapi/media/msm_cam_sensor.h b/include/uapi/media/msm_cam_sensor.h index a61bc18b490e8..24c1fd9b6abed 100644 --- a/include/uapi/media/msm_cam_sensor.h +++ b/include/uapi/media/msm_cam_sensor.h @@ -84,6 +84,7 @@ enum sensor_sub_module_t { SUB_MODULE_OIS, SUB_MODULE_EXT, SUB_MODULE_IR_LED, + SUB_MODULE_IR_CUT, SUB_MODULE_MAX, }; From 691e626d2dcae91f2f6c9887acfc13b44ff84eb3 Mon Sep 17 00:00:00 2001 From: Vegard Nossum Date: Fri, 29 Jul 2016 10:40:31 +0200 Subject: [PATCH 0298/1015] block: fix use-after-free in seq file I got a KASAN report of use-after-free: ================================================================== BUG: KASAN: use-after-free in klist_iter_exit+0x61/0x70 at addr ffff8800b6581508 Read of size 8 by task trinity-c1/315 ============================================================================= BUG kmalloc-32 (Not tainted): kasan: bad access detected ----------------------------------------------------------------------------- Disabling lock debugging due to kernel taint INFO: Allocated in disk_seqf_start+0x66/0x110 age=144 cpu=1 pid=315 ___slab_alloc+0x4f1/0x520 __slab_alloc.isra.58+0x56/0x80 kmem_cache_alloc_trace+0x260/0x2a0 disk_seqf_start+0x66/0x110 traverse+0x176/0x860 seq_read+0x7e3/0x11a0 proc_reg_read+0xbc/0x180 do_loop_readv_writev+0x134/0x210 do_readv_writev+0x565/0x660 vfs_readv+0x67/0xa0 do_preadv+0x126/0x170 SyS_preadv+0xc/0x10 do_syscall_64+0x1a1/0x460 return_from_SYSCALL_64+0x0/0x6a INFO: Freed in disk_seqf_stop+0x42/0x50 age=160 cpu=1 pid=315 __slab_free+0x17a/0x2c0 kfree+0x20a/0x220 disk_seqf_stop+0x42/0x50 traverse+0x3b5/0x860 seq_read+0x7e3/0x11a0 proc_reg_read+0xbc/0x180 do_loop_readv_writev+0x134/0x210 do_readv_writev+0x565/0x660 vfs_readv+0x67/0xa0 do_preadv+0x126/0x170 SyS_preadv+0xc/0x10 do_syscall_64+0x1a1/0x460 return_from_SYSCALL_64+0x0/0x6a CPU: 1 PID: 315 Comm: trinity-c1 Tainted: G B 4.7.0+ #62 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014 ffffea0002d96000 ffff880119b9f918 ffffffff81d6ce81 ffff88011a804480 ffff8800b6581500 ffff880119b9f948 ffffffff8146c7bd ffff88011a804480 ffffea0002d96000 ffff8800b6581500 fffffffffffffff4 ffff880119b9f970 Call Trace: [] dump_stack+0x65/0x84 [] print_trailer+0x10d/0x1a0 [] object_err+0x2f/0x40 [] kasan_report_error+0x221/0x520 [] __asan_report_load8_noabort+0x3e/0x40 [] klist_iter_exit+0x61/0x70 [] class_dev_iter_exit+0x9/0x10 [] disk_seqf_stop+0x3a/0x50 [] seq_read+0x4b2/0x11a0 [] proc_reg_read+0xbc/0x180 [] do_loop_readv_writev+0x134/0x210 [] do_readv_writev+0x565/0x660 [] vfs_readv+0x67/0xa0 [] do_preadv+0x126/0x170 [] SyS_preadv+0xc/0x10 This problem can occur in the following situation: open() - pread() - .seq_start() - iter = kmalloc() // succeeds - seqf->private = iter - .seq_stop() - kfree(seqf->private) - pread() - .seq_start() - iter = kmalloc() // fails - .seq_stop() - class_dev_iter_exit(seqf->private) // boom! old pointer As the comment in disk_seqf_stop() says, stop is called even if start failed, so we need to reinitialise the private pointer to NULL when seq iteration stops. An alternative would be to set the private pointer to NULL when the kmalloc() in disk_seqf_start() fails. Change-Id: Ia3c791c6cf81a6c156561106230cbf5e8dfad0bc Cc: stable@vger.kernel.org Signed-off-by: Vegard Nossum Acked-by: Tejun Heo Signed-off-by: Jens Axboe Git-repo: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: 77da160530dd1dc94f6ae15a981f24e5f0021e84 Signed-off-by: Dennis Cagle --- block/genhd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/block/genhd.c b/block/genhd.c index c675ad1ad69b8..b529e5024d235 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -829,6 +829,7 @@ static void disk_seqf_stop(struct seq_file *seqf, void *v) if (iter) { class_dev_iter_exit(iter); kfree(iter); + seqf->private = NULL; } } From 2266c43303047038748b981fa0ade1aea1883f02 Mon Sep 17 00:00:00 2001 From: Omar Sandoval Date: Fri, 1 Jul 2016 00:39:35 -0700 Subject: [PATCH 0299/1015] block: fix use-after-free in sys_ioprio_get() get_task_ioprio() accesses the task->io_context without holding the task lock and thus can race with exit_io_context(), leading to a use-after-free. The reproducer below hits this within a few seconds on my 4-core QEMU VM: int main(int argc, char **argv) { pid_t pid, child; long nproc, i; /* ioprio_set(IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)); */ syscall(SYS_ioprio_set, 1, 0, 0x6000); nproc = sysconf(_SC_NPROCESSORS_ONLN); for (i = 0; i < nproc; i++) { pid = fork(); assert(pid != -1); if (pid == 0) { for (;;) { pid = fork(); assert(pid != -1); if (pid == 0) { _exit(0); } else { child = wait(NULL); assert(child == pid); } } } pid = fork(); assert(pid != -1); if (pid == 0) { for (;;) { /* ioprio_get(IOPRIO_WHO_PGRP, 0); */ syscall(SYS_ioprio_get, 2, 0); } } } for (;;) { /* ioprio_get(IOPRIO_WHO_PGRP, 0); */ syscall(SYS_ioprio_get, 2, 0); } return 0; } This gets us KASAN dumps like this: [ 35.526914] ================================================================== [ 35.530009] BUG: KASAN: out-of-bounds in get_task_ioprio+0x7b/0x90 at addr ffff880066f34e6c [ 35.530009] Read of size 2 by task ioprio-gpf/363 [ 35.530009] ============================================================================= [ 35.530009] BUG blkdev_ioc (Not tainted): kasan: bad access detected [ 35.530009] ----------------------------------------------------------------------------- [ 35.530009] Disabling lock debugging due to kernel taint [ 35.530009] INFO: Allocated in create_task_io_context+0x2b/0x370 age=0 cpu=0 pid=360 [ 35.530009] ___slab_alloc+0x55d/0x5a0 [ 35.530009] __slab_alloc.isra.20+0x2b/0x40 [ 35.530009] kmem_cache_alloc_node+0x84/0x200 [ 35.530009] create_task_io_context+0x2b/0x370 [ 35.530009] get_task_io_context+0x92/0xb0 [ 35.530009] copy_process.part.8+0x5029/0x5660 [ 35.530009] _do_fork+0x155/0x7e0 [ 35.530009] SyS_clone+0x19/0x20 [ 35.530009] do_syscall_64+0x195/0x3a0 [ 35.530009] return_from_SYSCALL_64+0x0/0x6a [ 35.530009] INFO: Freed in put_io_context+0xe7/0x120 age=0 cpu=0 pid=1060 [ 35.530009] __slab_free+0x27b/0x3d0 [ 35.530009] kmem_cache_free+0x1fb/0x220 [ 35.530009] put_io_context+0xe7/0x120 [ 35.530009] put_io_context_active+0x238/0x380 [ 35.530009] exit_io_context+0x66/0x80 [ 35.530009] do_exit+0x158e/0x2b90 [ 35.530009] do_group_exit+0xe5/0x2b0 [ 35.530009] SyS_exit_group+0x1d/0x20 [ 35.530009] entry_SYSCALL_64_fastpath+0x1a/0xa4 [ 35.530009] INFO: Slab 0xffffea00019bcd00 objects=20 used=4 fp=0xffff880066f34ff0 flags=0x1fffe0000004080 [ 35.530009] INFO: Object 0xffff880066f34e58 @offset=3672 fp=0x0000000000000001 [ 35.530009] ================================================================== Fix it by grabbing the task lock while we poke at the io_context. Change-Id: I02fda1eb5173f5cf4db999147c623720892da529 Cc: stable@vger.kernel.org Reported-by: Dmitry Vyukov Signed-off-by: Omar Sandoval Signed-off-by: Jens Axboe Git-repo: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: 8ba8682107ee2ca3347354e018865d8e1967c5f4 Signed-off-by: Dennis Cagle --- block/ioprio.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/block/ioprio.c b/block/ioprio.c index 31666c92b46af..563435684c3c1 100644 --- a/block/ioprio.c +++ b/block/ioprio.c @@ -149,8 +149,10 @@ static int get_task_ioprio(struct task_struct *p) if (ret) goto out; ret = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, IOPRIO_NORM); + task_lock(p); if (p->io_context) ret = p->io_context->ioprio; + task_unlock(p); out: return ret; } From 2752722662e09d474949b2af04c58081ffe1111f Mon Sep 17 00:00:00 2001 From: Lukas Czerner Date: Sat, 17 Oct 2015 22:57:06 -0400 Subject: [PATCH 0300/1015] ext4: fix potential use after free in __ext4_journal_stop There is a use-after-free possibility in __ext4_journal_stop() in the case that we free the handle in the first jbd2_journal_stop() because we're referencing handle->h_err afterwards. This was introduced in 9705acd63b125dee8b15c705216d7186daea4625 and it is wrong. Fix it by storing the handle->h_err value beforehand and avoid referencing potentially freed handle. Change-Id: I68f13ab93f017e4886d8cf1b5c6e234a138a3e34 Fixes: 9705acd63b125dee8b15c705216d7186daea4625 Signed-off-by: Lukas Czerner Reviewed-by: Andreas Dilger Cc: stable@vger.kernel.org Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 6934da9238da947628be83635e365df41064b09b Signed-off-by: Dennis Cagle --- fs/ext4/ext4_jbd2.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index d418431818187..e770c1ee4613e 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c @@ -88,13 +88,13 @@ int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle) return 0; } + err = handle->h_err; if (!handle->h_transaction) { - err = jbd2_journal_stop(handle); - return handle->h_err ? handle->h_err : err; + rc = jbd2_journal_stop(handle); + return err ? err : rc; } sb = handle->h_transaction->t_journal->j_private; - err = handle->h_err; rc = jbd2_journal_stop(handle); if (!err) From d973dfe9fc4275e018c4ddaed2eece68c120ec7e Mon Sep 17 00:00:00 2001 From: Xiaojun Sang Date: Fri, 4 Nov 2016 14:35:58 +0800 Subject: [PATCH 0301/1015] ASoC: soc: prevent risk of buffer overflow In case of large value for bufcnt_t or bufcnt, cmd_size may overflow. Buffer size allocated by cmd_size might be not as expected. Possible buffer overflow could happen. CRs-Fixed: 1084210 Change-Id: I9556f18dd6a9fdf3f76c133ae75c04ecce171f08 Signed-off-by: Xiaojun Sang --- sound/soc/msm/qdsp6v2/q6asm.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index be9356b98a7f2..83edfe3cad1f6 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -5373,7 +5373,7 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, struct asm_buffer_node *buffer_node = NULL; int rc = 0; int i = 0; - int cmd_size = 0; + uint32_t cmd_size = 0; uint32_t bufcnt_t; uint32_t bufsz_t; @@ -5395,10 +5395,25 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, bufsz_t = PAGE_ALIGN(bufsz_t); } + if (bufcnt_t > (UINT_MAX + - sizeof(struct avs_cmd_shared_mem_map_regions)) + / sizeof(struct avs_shared_map_region_payload)) { + pr_err("%s: Unsigned Integer Overflow. bufcnt_t = %u\n", + __func__, bufcnt_t); + return -EINVAL; + } + cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) + (sizeof(struct avs_shared_map_region_payload) * bufcnt_t); + + if (bufcnt > (UINT_MAX / sizeof(struct asm_buffer_node))) { + pr_err("%s: Unsigned Integer Overflow. bufcnt = %u\n", + __func__, bufcnt); + return -EINVAL; + } + buffer_node = kzalloc(sizeof(struct asm_buffer_node) * bufcnt, GFP_KERNEL); if (!buffer_node) { From 41dddf3dd8a03142e0b1455e00227e9b7b3ac6d8 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 17 Aug 2016 05:56:26 -0700 Subject: [PATCH 0302/1015] tcp: fix use after free in tcp_xmit_retransmit_queue() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When tcp_sendmsg() allocates a fresh and empty skb, it puts it at the tail of the write queue using tcp_add_write_queue_tail() Then it attempts to copy user data into this fresh skb. If the copy fails, we undo the work and remove the fresh skb. Unfortunately, this undo lacks the change done to tp->highest_sack and we can leave a dangling pointer (to a freed skb) Later, tcp_xmit_retransmit_queue() can dereference this pointer and access freed memory. For regular kernels where memory is not unmapped, this might cause SACK bugs because tcp_highest_sack_seq() is buggy, returning garbage instead of tp->snd_nxt, but with various debug features like CONFIG_DEBUG_PAGEALLOC, this can crash the kernel. This bug was found by Marco Grassi thanks to syzkaller. Change-Id: Iba5975e360eb2b2729b6f958b7cb00bfc469e51b Fixes: 6859d49475d4 ("[TCP]: Abstract tp->highest_sack accessing & point to next skb") Reported-by: Marco Grassi Signed-off-by: Eric Dumazet Cc: Ilpo Järvinen Cc: Yuchung Cheng Cc: Neal Cardwell Acked-by: Neal Cardwell Reviewed-by: Cong Wang Signed-off-by: David S. Miller Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: bb1fceca22492109be12640d49f5ea5a544c6bb4 Signed-off-by: Dennis Cagle --- include/net/tcp.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/net/tcp.h b/include/net/tcp.h index b35a773acf291..638d2fe5393db 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1448,6 +1448,8 @@ static inline void tcp_check_send_head(struct sock *sk, struct sk_buff *skb_unli { if (sk->sk_send_head == skb_unlinked) sk->sk_send_head = NULL; + if (tcp_sk(sk)->highest_sack == skb_unlinked) + tcp_sk(sk)->highest_sack = NULL; } static inline void tcp_init_send_head(struct sock *sk) From 39e2d1ff583f1178b59ebd57a52de29d11e2eaef Mon Sep 17 00:00:00 2001 From: Calvin Owens Date: Fri, 30 Oct 2015 16:57:00 -0700 Subject: [PATCH 0303/1015] sg: Fix double-free when drives detach during SG_IO In sg_common_write(), we free the block request and return -ENODEV if the device is detached in the middle of the SG_IO ioctl(). Unfortunately, sg_finish_rem_req() also tries to free srp->rq, so we end up freeing rq->cmd in the already free rq object, and then free the object itself out from under the current user. This ends up corrupting random memory via the list_head on the rq object. The most common crash trace I saw is this: ------------[ cut here ]------------ kernel BUG at block/blk-core.c:1420! Call Trace: [] blk_put_request+0x5b/0x80 [] sg_finish_rem_req+0x6b/0x120 [sg] [] sg_common_write.isra.14+0x459/0x5a0 [sg] [] ? selinux_file_alloc_security+0x48/0x70 [] sg_new_write.isra.17+0x195/0x2d0 [sg] [] sg_ioctl+0x644/0xdb0 [sg] [] do_vfs_ioctl+0x90/0x520 [] ? file_has_perm+0x97/0xb0 [] SyS_ioctl+0x91/0xb0 [] tracesys+0xdd/0xe2 RIP [] __blk_put_request+0x154/0x1a0 The solution is straightforward: just set srp->rq to NULL in the failure branch so that sg_finish_rem_req() doesn't attempt to re-free it. Additionally, since sg_rq_end_io() will never be called on the object when this happens, we need to free memory backing ->cmd if it isn't embedded in the object itself. KASAN was extremely helpful in finding the root cause of this bug. Change-Id: Ieb2715c26d4d65dece365099d8b7d59f397e5468 Signed-off-by: Calvin Owens Acked-by: Douglas Gilbert Signed-off-by: Martin K. Petersen Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: f3951a3709ff50990bf3e188c27d346792103432 Signed-off-by: Dennis Cagle --- drivers/scsi/sg.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 7c4903b618c9f..8a2a593c41e9d 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -788,8 +788,14 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, return k; /* probably out of space --> ENOMEM */ } if (atomic_read(&sdp->detaching)) { - if (srp->bio) + if (srp->bio) { + if (srp->rq->cmd != srp->rq->__cmd) + kfree(srp->rq->cmd); + blk_end_request_all(srp->rq, -EIO); + srp->rq = NULL; + } + sg_finish_rem_req(srp); return -ENODEV; } From ab5cc79ccc3219126e66fc50c0b2334849916bd7 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Thu, 28 Jan 2016 09:22:44 -0200 Subject: [PATCH 0304/1015] [media] xc2028: avoid use after free If struct xc2028_config is passed without a firmware name, the following trouble may happen: [11009.907205] xc2028 5-0061: type set to XCeive xc2028/xc3028 tuner [11009.907491] ================================================================== [11009.907750] BUG: KASAN: use-after-free in strcmp+0x96/0xb0 at addr ffff8803bd78ab40 [11009.907992] Read of size 1 by task modprobe/28992 [11009.907994] ============================================================================= [11009.907997] BUG kmalloc-16 (Tainted: G W ): kasan: bad access detected [11009.907999] ----------------------------------------------------------------------------- [11009.908008] INFO: Allocated in xhci_urb_enqueue+0x214/0x14c0 [xhci_hcd] age=0 cpu=3 pid=28992 [11009.908012] ___slab_alloc+0x581/0x5b0 [11009.908014] __slab_alloc+0x51/0x90 [11009.908017] __kmalloc+0x27b/0x350 [11009.908022] xhci_urb_enqueue+0x214/0x14c0 [xhci_hcd] [11009.908026] usb_hcd_submit_urb+0x1e8/0x1c60 [11009.908029] usb_submit_urb+0xb0e/0x1200 [11009.908032] usb_serial_generic_write_start+0xb6/0x4c0 [11009.908035] usb_serial_generic_write+0x92/0xc0 [11009.908039] usb_console_write+0x38a/0x560 [11009.908045] call_console_drivers.constprop.14+0x1ee/0x2c0 [11009.908051] console_unlock+0x40d/0x900 [11009.908056] vprintk_emit+0x4b4/0x830 [11009.908061] vprintk_default+0x1f/0x30 [11009.908064] printk+0x99/0xb5 [11009.908067] kasan_report_error+0x10a/0x550 [11009.908070] __asan_report_load1_noabort+0x43/0x50 [11009.908074] INFO: Freed in xc2028_set_config+0x90/0x630 [tuner_xc2028] age=1 cpu=3 pid=28992 [11009.908077] __slab_free+0x2ec/0x460 [11009.908080] kfree+0x266/0x280 [11009.908083] xc2028_set_config+0x90/0x630 [tuner_xc2028] [11009.908086] xc2028_attach+0x310/0x8a0 [tuner_xc2028] [11009.908090] em28xx_attach_xc3028.constprop.7+0x1f9/0x30d [em28xx_dvb] [11009.908094] em28xx_dvb_init.part.3+0x8e4/0x5cf4 [em28xx_dvb] [11009.908098] em28xx_dvb_init+0x81/0x8a [em28xx_dvb] [11009.908101] em28xx_register_extension+0xd9/0x190 [em28xx] [11009.908105] em28xx_dvb_register+0x10/0x1000 [em28xx_dvb] [11009.908108] do_one_initcall+0x141/0x300 [11009.908111] do_init_module+0x1d0/0x5ad [11009.908114] load_module+0x6666/0x9ba0 [11009.908117] SyS_finit_module+0x108/0x130 [11009.908120] entry_SYSCALL_64_fastpath+0x16/0x76 [11009.908123] INFO: Slab 0xffffea000ef5e280 objects=25 used=25 fp=0x (null) flags=0x2ffff8000004080 [11009.908126] INFO: Object 0xffff8803bd78ab40 @offset=2880 fp=0x0000000000000001 [11009.908130] Bytes b4 ffff8803bd78ab30: 01 00 00 00 2a 07 00 00 9d 28 00 00 01 00 00 00 ....*....(...... [11009.908133] Object ffff8803bd78ab40: 01 00 00 00 00 00 00 00 b0 1d c3 6a 00 88 ff ff ...........j.... [11009.908137] CPU: 3 PID: 28992 Comm: modprobe Tainted: G B W 4.5.0-rc1+ #43 [11009.908140] Hardware name: /NUC5i7RYB, BIOS RYBDWi35.86A.0350.2015.0812.1722 08/12/2015 [11009.908142] ffff8803bd78a000 ffff8802c273f1b8 ffffffff81932007 ffff8803c6407a80 [11009.908148] ffff8802c273f1e8 ffffffff81556759 ffff8803c6407a80 ffffea000ef5e280 [11009.908153] ffff8803bd78ab40 dffffc0000000000 ffff8802c273f210 ffffffff8155ccb4 [11009.908158] Call Trace: [11009.908162] [] dump_stack+0x4b/0x64 [11009.908165] [] print_trailer+0xf9/0x150 [11009.908168] [] object_err+0x34/0x40 [11009.908171] [] kasan_report_error+0x230/0x550 [11009.908175] [] ? trace_hardirqs_off_caller+0x21/0x290 [11009.908179] [] ? kasan_unpoison_shadow+0x36/0x50 [11009.908182] [] __asan_report_load1_noabort+0x43/0x50 [11009.908185] [] ? __asan_register_globals+0x50/0xa0 [11009.908189] [] ? strcmp+0x96/0xb0 [11009.908192] [] strcmp+0x96/0xb0 [11009.908196] [] xc2028_set_config+0x15c/0x630 [tuner_xc2028] [11009.908200] [] xc2028_attach+0x310/0x8a0 [tuner_xc2028] [11009.908203] [] ? memset+0x28/0x30 [11009.908206] [] ? xc2028_set_config+0x630/0x630 [tuner_xc2028] [11009.908211] [] em28xx_attach_xc3028.constprop.7+0x1f9/0x30d [em28xx_dvb] [11009.908215] [] ? em28xx_dvb_init.part.3+0x37c/0x5cf4 [em28xx_dvb] [11009.908219] [] ? hauppauge_hvr930c_init+0x487/0x487 [em28xx_dvb] [11009.908222] [] ? lgdt330x_attach+0x1cc/0x370 [lgdt330x] [11009.908226] [] ? i2c_read_demod_bytes.isra.2+0x210/0x210 [lgdt330x] [11009.908230] [] ? ref_module.part.15+0x10/0x10 [11009.908233] [] ? module_assert_mutex_or_preempt+0x80/0x80 [11009.908238] [] em28xx_dvb_init.part.3+0x8e4/0x5cf4 [em28xx_dvb] [11009.908242] [] ? em28xx_attach_xc3028.constprop.7+0x30d/0x30d [em28xx_dvb] [11009.908245] [] ? string+0x14d/0x1f0 [11009.908249] [] ? symbol_string+0xff/0x1a0 [11009.908253] [] ? uuid_string+0x6f0/0x6f0 [11009.908257] [] ? __kernel_text_address+0x7e/0xa0 [11009.908260] [] ? print_context_stack+0x7f/0xf0 [11009.908264] [] ? __module_address+0xb6/0x360 [11009.908268] [] ? is_ftrace_trampoline+0x99/0xe0 [11009.908271] [] ? __kernel_text_address+0x7e/0xa0 [11009.908275] [] ? debug_check_no_locks_freed+0x290/0x290 [11009.908278] [] ? dump_trace+0x11b/0x300 [11009.908282] [] ? em28xx_register_extension+0x23/0x190 [em28xx] [11009.908285] [] ? trace_hardirqs_off_caller+0x21/0x290 [11009.908289] [] ? trace_hardirqs_on_caller+0x16/0x590 [11009.908292] [] ? trace_hardirqs_on+0xd/0x10 [11009.908296] [] ? em28xx_register_extension+0x23/0x190 [em28xx] [11009.908299] [] ? mutex_trylock+0x400/0x400 [11009.908302] [] ? do_one_initcall+0x131/0x300 [11009.908306] [] ? call_rcu_sched+0x17/0x20 [11009.908309] [] ? put_object+0x48/0x70 [11009.908314] [] em28xx_dvb_init+0x81/0x8a [em28xx_dvb] [11009.908317] [] em28xx_register_extension+0xd9/0x190 [em28xx] [11009.908320] [] ? 0xffffffffa0150000 [11009.908324] [] em28xx_dvb_register+0x10/0x1000 [em28xx_dvb] [11009.908327] [] do_one_initcall+0x141/0x300 [11009.908330] [] ? try_to_run_init_process+0x40/0x40 [11009.908333] [] ? trace_hardirqs_on_caller+0x16/0x590 [11009.908337] [] ? kasan_unpoison_shadow+0x36/0x50 [11009.908340] [] ? kasan_unpoison_shadow+0x36/0x50 [11009.908343] [] ? kasan_unpoison_shadow+0x36/0x50 [11009.908346] [] ? __asan_register_globals+0x87/0xa0 [11009.908350] [] do_init_module+0x1d0/0x5ad [11009.908353] [] load_module+0x6666/0x9ba0 [11009.908356] [] ? symbol_put_addr+0x50/0x50 [11009.908361] [] ? em28xx_dvb_init.part.3+0x5989/0x5cf4 [em28xx_dvb] [11009.908366] [] ? module_frob_arch_sections+0x20/0x20 [11009.908369] [] ? open_exec+0x50/0x50 [11009.908374] [] ? ns_capable+0x5b/0xd0 [11009.908377] [] SyS_finit_module+0x108/0x130 [11009.908379] [] ? SyS_init_module+0x1f0/0x1f0 [11009.908383] [] ? lockdep_sys_exit_thunk+0x12/0x14 [11009.908394] [] entry_SYSCALL_64_fastpath+0x16/0x76 [11009.908396] Memory state around the buggy address: [11009.908398] ffff8803bd78aa00: 00 00 fc fc fc fc fc fc fc fc fc fc fc fc fc fc [11009.908401] ffff8803bd78aa80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [11009.908403] >ffff8803bd78ab00: fc fc fc fc fc fc fc fc 00 00 fc fc fc fc fc fc [11009.908405] ^ [11009.908407] ffff8803bd78ab80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [11009.908409] ffff8803bd78ac00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [11009.908411] ================================================================== In order to avoid it, let's set the cached value of the firmware name to NULL after freeing it. While here, return an error if the memory allocation fails. Change-Id: I24f0958f97ca04916b8c6845f3122732e1928e6c Signed-off-by: Mauro Carvalho Chehab Git-repo: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: 8dfbcc4351a0b6d2f2d77f367552f48ffefafe18 Signed-off-by: Dennis Cagle --- drivers/media/tuners/tuner-xc2028.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/media/tuners/tuner-xc2028.c b/drivers/media/tuners/tuner-xc2028.c index d12f5e4ad8bf4..36c7f2a077b48 100644 --- a/drivers/media/tuners/tuner-xc2028.c +++ b/drivers/media/tuners/tuner-xc2028.c @@ -1403,11 +1403,12 @@ static int xc2028_set_config(struct dvb_frontend *fe, void *priv_cfg) * in order to avoid troubles during device release. */ kfree(priv->ctrl.fname); + priv->ctrl.fname = NULL; memcpy(&priv->ctrl, p, sizeof(priv->ctrl)); if (p->fname) { priv->ctrl.fname = kstrdup(p->fname, GFP_KERNEL); if (priv->ctrl.fname == NULL) - rc = -ENOMEM; + return -ENOMEM; } /* From d40b6b1a47f1b508ffb403aaf71b234fc4c84690 Mon Sep 17 00:00:00 2001 From: Rainer Weikusat Date: Thu, 11 Feb 2016 19:37:27 +0000 Subject: [PATCH 0305/1015] af_unix: Guard against other == sk in unix_dgram_sendmsg The unix_dgram_sendmsg routine use the following test if (unlikely(unix_peer(other) != sk && unix_recvq_full(other))) { to determine if sk and other are in an n:1 association (either established via connect or by using sendto to send messages to an unrelated socket identified by address). This isn't correct as the specified address could have been bound to the sending socket itself or because this socket could have been connected to itself by the time of the unix_peer_get but disconnected before the unix_state_lock(other). In both cases, the if-block would be entered despite other == sk which might either block the sender unintentionally or lead to trying to unlock the same spin lock twice for a non-blocking send. Add a other != sk check to guard against this. Change-Id: I088f5d2bc9392cb3510bd1a65c96d45ad7b89cd6 Fixes: 7d267278a9ec ("unix: avoid use-after-free in ep_remove_wait_queue") Reported-By: Philipp Hahn Signed-off-by: Rainer Weikusat Tested-by: Philipp Hahn Signed-off-by: David S. Miller Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: a5527dda344fff0514b7989ef7a755729769daa1 Signed-off-by: Dennis Cagle --- net/unix/af_unix.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 67dc2175ff39e..3e2eec6437d5a 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1724,7 +1724,12 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, goto out_unlock; } - if (unlikely(unix_peer(other) != sk && unix_recvq_full(other))) { + /* other == sk && unix_peer(other) != sk if + * - unix_peer(sk) == NULL, destination address bound to sk + * - unix_peer(sk) == sk by time of get but disconnected before lock + */ + if (other != sk && + unlikely(unix_peer(other) != sk && unix_recvq_full(other))) { if (timeo) { timeo = unix_wait_for_peer(other, timeo); From b9c7d74a6f611d5ba1c86eb00d59af0a81974b12 Mon Sep 17 00:00:00 2001 From: Paul Moore Date: Tue, 19 Jul 2016 17:42:57 -0400 Subject: [PATCH 0306/1015] audit: fix a double fetch in audit_log_single_execve_arg() There is a double fetch problem in audit_log_single_execve_arg() where we first check the execve(2) argumnets for any "bad" characters which would require hex encoding and then re-fetch the arguments for logging in the audit record[1]. Of course this leaves a window of opportunity for an unsavory application to munge with the data. This patch reworks things by only fetching the argument data once[2] into a buffer where it is scanned and logged into the audit records(s). In addition to fixing the double fetch, this patch improves on the original code in a few other ways: better handling of large arguments which require encoding, stricter record length checking, and some performance improvements (completely unverified, but we got rid of some strlen() calls, that's got to be a good thing). As part of the development of this patch, I've also created a basic regression test for the audit-testsuite, the test can be tracked on GitHub at the following link: * https://github.com/linux-audit/audit-testsuite/issues/25 [1] If you pay careful attention, there is actually a triple fetch problem due to a strnlen_user() call at the top of the function. [2] This is a tiny white lie, we do make a call to strnlen_user() prior to fetching the argument data. I don't like it, but due to the way the audit record is structured we really have no choice unless we copy the entire argument at once (which would require a rather wasteful allocation). The good news is that with this patch the kernel no longer relies on this strnlen_user() value for anything beyond recording it in the log, we also update it with a trustworthy value whenever possible. Reported-by: Pengfei Wang Cc: Signed-off-by: Paul Moore Change-Id: Ie9848961d236739df5014474f2c2a781af9fb811 [d-cagle@codeaurora.org: Resolve trivial merge conflicts] Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 43761473c254b45883a64441dd0bc85a42f3645c Signed-off-by: Dennis Cagle --- kernel/auditsc.c | 333 +++++++++++++++++++++++------------------------ 1 file changed, 164 insertions(+), 169 deletions(-) diff --git a/kernel/auditsc.c b/kernel/auditsc.c index cc3416f0dedac..3a6e01013b34a 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -73,6 +73,7 @@ #include #include #include +#include #include #include "audit.h" @@ -82,7 +83,8 @@ #define AUDITSC_SUCCESS 1 #define AUDITSC_FAILURE 2 -/* no execve audit message should be longer than this (userspace limits) */ +/* no execve audit message should be longer than this (userspace limits), + * see the note near the top of audit_log_execve_info() about this value */ #define MAX_EXECVE_AUDIT_LEN 7500 /* max length to print of cmdline/proctitle value during audit */ @@ -1010,185 +1012,178 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, return rc; } -/* - * to_send and len_sent accounting are very loose estimates. We aren't - * really worried about a hard cap to MAX_EXECVE_AUDIT_LEN so much as being - * within about 500 bytes (next page boundary) - * - * why snprintf? an int is up to 12 digits long. if we just assumed when - * logging that a[%d]= was going to be 16 characters long we would be wasting - * space in every audit message. In one 7500 byte message we can log up to - * about 1000 min size arguments. That comes down to about 50% waste of space - * if we didn't do the snprintf to find out how long arg_num_len was. - */ -static int audit_log_single_execve_arg(struct audit_context *context, - struct audit_buffer **ab, - int arg_num, - size_t *len_sent, - const char __user *p, - char *buf) +static void audit_log_execve_info(struct audit_context *context, + struct audit_buffer **ab) { - char arg_num_len_buf[12]; - const char __user *tmp_p = p; - /* how many digits are in arg_num? 5 is the length of ' a=""' */ - size_t arg_num_len = snprintf(arg_num_len_buf, 12, "%d", arg_num) + 5; - size_t len, len_left, to_send; - size_t max_execve_audit_len = MAX_EXECVE_AUDIT_LEN; - unsigned int i, has_cntl = 0, too_long = 0; - int ret; - - /* strnlen_user includes the null we don't want to send */ - len_left = len = strnlen_user(p, MAX_ARG_STRLEN) - 1; - - /* - * We just created this mm, if we can't find the strings - * we just copied into it something is _very_ wrong. Similar - * for strings that are too long, we should not have created - * any. - */ - if (unlikely((len == -1) || len > MAX_ARG_STRLEN - 1)) { - WARN_ON(1); - send_sig(SIGKILL, current, 0); - return -1; + long len_max; + long len_rem; + long len_full; + long len_buf; + long len_abuf; + long len_tmp; + bool require_data; + bool encode; + unsigned int iter; + unsigned int arg; + char *buf_head; + char *buf; + const char __user *p = (const char __user *)current->mm->arg_start; + + /* NOTE: this buffer needs to be large enough to hold all the non-arg + * data we put in the audit record for this argument (see the + * code below) ... at this point in time 96 is plenty */ + char abuf[96]; + + /* NOTE: we set MAX_EXECVE_AUDIT_LEN to a rather arbitrary limit, the + * current value of 7500 is not as important as the fact that it + * is less than 8k, a setting of 7500 gives us plenty of wiggle + * room if we go over a little bit in the logging below */ + WARN_ON_ONCE(MAX_EXECVE_AUDIT_LEN > 7500); + len_max = MAX_EXECVE_AUDIT_LEN; + + /* scratch buffer to hold the userspace args */ + buf_head = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL); + if (!buf_head) { + audit_panic("out of memory for argv string"); + return; } + buf = buf_head; - /* walk the whole argument looking for non-ascii chars */ + audit_log_format(*ab, "argc=%d", context->execve.argc); + + len_rem = len_max; + len_buf = 0; + len_full = 0; + require_data = true; + encode = false; + iter = 0; + arg = 0; do { - if (len_left > MAX_EXECVE_AUDIT_LEN) - to_send = MAX_EXECVE_AUDIT_LEN; - else - to_send = len_left; - ret = copy_from_user(buf, tmp_p, to_send); - /* - * There is no reason for this copy to be short. We just - * copied them here, and the mm hasn't been exposed to user- - * space yet. - */ - if (ret) { - WARN_ON(1); - send_sig(SIGKILL, current, 0); - return -1; - } - buf[to_send] = '\0'; - has_cntl = audit_string_contains_control(buf, to_send); - if (has_cntl) { - /* - * hex messages get logged as 2 bytes, so we can only - * send half as much in each message - */ - max_execve_audit_len = MAX_EXECVE_AUDIT_LEN / 2; - break; - } - len_left -= to_send; - tmp_p += to_send; - } while (len_left > 0); - - len_left = len; - - if (len > max_execve_audit_len) - too_long = 1; - - /* rewalk the argument actually logging the message */ - for (i = 0; len_left > 0; i++) { - int room_left; - - if (len_left > max_execve_audit_len) - to_send = max_execve_audit_len; - else - to_send = len_left; - - /* do we have space left to send this argument in this ab? */ - room_left = MAX_EXECVE_AUDIT_LEN - arg_num_len - *len_sent; - if (has_cntl) - room_left -= (to_send * 2); - else - room_left -= to_send; - if (room_left < 0) { - *len_sent = 0; - audit_log_end(*ab); - *ab = audit_log_start(context, GFP_KERNEL, AUDIT_EXECVE); - if (!*ab) - return 0; - } + /* NOTE: we don't ever want to trust this value for anything + * serious, but the audit record format insists we + * provide an argument length for really long arguments, + * e.g. > MAX_EXECVE_AUDIT_LEN, so we have no choice but + * to use strncpy_from_user() to obtain this value for + * recording in the log, although we don't use it + * anywhere here to avoid a double-fetch problem */ + if (len_full == 0) + len_full = strnlen_user(p, MAX_ARG_STRLEN) - 1; + + /* read more data from userspace */ + if (require_data) { + /* can we make more room in the buffer? */ + if (buf != buf_head) { + memmove(buf_head, buf, len_buf); + buf = buf_head; + } + + /* fetch as much as we can of the argument */ + len_tmp = strncpy_from_user(&buf_head[len_buf], p, + len_max - len_buf); + if (len_tmp == -EFAULT) { + /* unable to copy from userspace */ + send_sig(SIGKILL, current, 0); + goto out; + } else if (len_tmp == (len_max - len_buf)) { + /* buffer is not large enough */ + require_data = true; + /* NOTE: if we are going to span multiple + * buffers force the encoding so we stand + * a chance at a sane len_full value and + * consistent record encoding */ + encode = true; + len_full = len_full * 2; + p += len_tmp; + } else { + require_data = false; + if (!encode) + encode = audit_string_contains_control( + buf, len_tmp); + /* try to use a trusted value for len_full */ + if (len_full < len_max) + len_full = (encode ? + len_tmp * 2 : len_tmp); + p += len_tmp + 1; + } + len_buf += len_tmp; + buf_head[len_buf] = '\0'; - /* - * first record needs to say how long the original string was - * so we can be sure nothing was lost. - */ - if ((i == 0) && (too_long)) - audit_log_format(*ab, " a%d_len=%zu", arg_num, - has_cntl ? 2*len : len); - - /* - * normally arguments are small enough to fit and we already - * filled buf above when we checked for control characters - * so don't bother with another copy_from_user - */ - if (len >= max_execve_audit_len) - ret = copy_from_user(buf, p, to_send); - else - ret = 0; - if (ret) { - WARN_ON(1); - send_sig(SIGKILL, current, 0); - return -1; + /* length of the buffer in the audit record? */ + len_abuf = (encode ? len_buf * 2 : len_buf + 2); } - buf[to_send] = '\0'; - - /* actually log it */ - audit_log_format(*ab, " a%d", arg_num); - if (too_long) - audit_log_format(*ab, "[%d]", i); - audit_log_format(*ab, "="); - if (has_cntl) - audit_log_n_hex(*ab, buf, to_send); - else - audit_log_string(*ab, buf); - - p += to_send; - len_left -= to_send; - *len_sent += arg_num_len; - if (has_cntl) - *len_sent += to_send * 2; - else - *len_sent += to_send; - } - /* include the null we didn't log */ - return len + 1; -} -static void audit_log_execve_info(struct audit_context *context, - struct audit_buffer **ab) -{ - int i, len; - size_t len_sent = 0; - const char __user *p; - char *buf; + /* write as much as we can to the audit log */ + if (len_buf > 0) { + /* NOTE: some magic numbers here - basically if we + * can't fit a reasonable amount of data into the + * existing audit buffer, flush it and start with + * a new buffer */ + if ((sizeof(abuf) + 8) > len_rem) { + len_rem = len_max; + audit_log_end(*ab); + *ab = audit_log_start(context, + GFP_KERNEL, AUDIT_EXECVE); + if (!*ab) + goto out; + } - p = (const char __user *)current->mm->arg_start; + /* create the non-arg portion of the arg record */ + len_tmp = 0; + if (require_data || (iter > 0) || + ((len_abuf + sizeof(abuf)) > len_rem)) { + if (iter == 0) { + len_tmp += snprintf(&abuf[len_tmp], + sizeof(abuf) - len_tmp, + " a%d_len=%lu", + arg, len_full); + } + len_tmp += snprintf(&abuf[len_tmp], + sizeof(abuf) - len_tmp, + " a%d[%d]=", arg, iter++); + } else + len_tmp += snprintf(&abuf[len_tmp], + sizeof(abuf) - len_tmp, + " a%d=", arg); + WARN_ON(len_tmp >= sizeof(abuf)); + abuf[sizeof(abuf) - 1] = '\0'; + + /* log the arg in the audit record */ + audit_log_format(*ab, "%s", abuf); + len_rem -= len_tmp; + len_tmp = len_buf; + if (encode) { + if (len_abuf > len_rem) + len_tmp = len_rem / 2; /* encoding */ + audit_log_n_hex(*ab, buf, len_tmp); + len_rem -= len_tmp * 2; + len_abuf -= len_tmp * 2; + } else { + if (len_abuf > len_rem) + len_tmp = len_rem - 2; /* quotes */ + audit_log_n_string(*ab, buf, len_tmp); + len_rem -= len_tmp + 2; + /* don't subtract the "2" because we still need + * to add quotes to the remaining string */ + len_abuf -= len_tmp; + } + len_buf -= len_tmp; + buf += len_tmp; + } - audit_log_format(*ab, "argc=%d", context->execve.argc); + /* ready to move to the next argument? */ + if ((len_buf == 0) && !require_data) { + arg++; + iter = 0; + len_full = 0; + require_data = true; + encode = false; + } + } while (arg < context->execve.argc); - /* - * we need some kernel buffer to hold the userspace args. Just - * allocate one big one rather than allocating one of the right size - * for every single argument inside audit_log_single_execve_arg() - * should be <8k allocation so should be pretty safe. - */ - buf = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL); - if (!buf) { - audit_panic("out of memory for argv string"); - return; - } + /* NOTE: the caller handles the final audit_log_end() call */ - for (i = 0; i < context->execve.argc; i++) { - len = audit_log_single_execve_arg(context, ab, i, - &len_sent, p, buf); - if (len <= 0) - break; - p += len; - } - kfree(buf); +out: + kfree(buf_head); } static void show_special(struct audit_context *context, int *call_panic) From 90b468c078bbaa383c97a9266fb20800f2832e49 Mon Sep 17 00:00:00 2001 From: Vladis Dronov Date: Thu, 31 Mar 2016 12:05:43 -0400 Subject: [PATCH 0307/1015] ALSA: usb-audio: Fix double-free in error paths after snd_usb_add_audio_stream() call create_fixed_stream_quirk(), snd_usb_parse_audio_interface() and create_uaxx_quirk() functions allocate the audioformat object by themselves and free it upon error before returning. However, once the object is linked to a stream, it's freed again in snd_usb_audio_pcm_free(), thus it'll be double-freed, eventually resulting in a memory corruption. This patch fixes these failures in the error paths by unlinking the audioformat object before freeing it. Based on a patch by Takashi Iwai [Note for stable backports: this patch requires the commit 902eb7fd1e4a ('ALSA: usb-audio: Minor code cleanup in create_fixed_stream_quirk()')] Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1283358 Reported-by: Ralf Spenneberg Cc: # see the note above Signed-off-by: Vladis Dronov Signed-off-by: Takashi Iwai Change-Id: I1e2f96f9d0874e0c42ddd1909f17dc4ccd936e0b [d-cagle@codeaurora.org: Resolve merge conflicts] Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 836b34a935abc91e13e63053d0a83b24dfb5ea78 Signed-off-by: Dennis Cagle --- sound/usb/quirks.c | 8 ++++++++ sound/usb/stream.c | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 7da345b0cdafe..4ab1e43b7a920 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -138,7 +138,9 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, usb_audio_err(chip, "cannot memdup\n"); return -ENOMEM; } + INIT_LIST_HEAD(&fp->list); if (fp->nr_rates > MAX_NR_RATES) { + list_del(&fp->list); kfree(fp); return -EINVAL; } @@ -146,6 +148,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, rate_table = kmemdup(fp->rate_table, sizeof(int) * fp->nr_rates, GFP_KERNEL); if (!rate_table) { + list_del(&fp->list); kfree(fp); return -ENOMEM; } @@ -156,12 +159,14 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; err = snd_usb_add_audio_stream(chip, stream, fp); if (err < 0) { + list_del(&fp->list); kfree(fp); kfree(rate_table); return err; } if (fp->iface != get_iface_desc(&iface->altsetting[0])->bInterfaceNumber || fp->altset_idx >= iface->num_altsetting) { + list_del(&fp->list); kfree(fp); kfree(rate_table); return -EINVAL; @@ -169,6 +174,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, alts = &iface->altsetting[fp->altset_idx]; altsd = get_iface_desc(alts); if (altsd->bNumEndpoints < 1) { + list_del(&fp->list); kfree(fp); kfree(rate_table); return -EINVAL; @@ -456,6 +462,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip, fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; fp->datainterval = 0; fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); + INIT_LIST_HEAD(&fp->list); switch (fp->maxpacksize) { case 0x120: @@ -479,6 +486,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip, ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; err = snd_usb_add_audio_stream(chip, stream, fp); if (err < 0) { + list_del(&fp->list); /* unlink for avoiding double-free */ kfree(fp); return err; } diff --git a/sound/usb/stream.c b/sound/usb/stream.c index 310a3822d2b72..25e8075f9ea3f 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -315,7 +315,9 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits, /* * add this endpoint to the chip instance. * if a stream with the same endpoint already exists, append to it. - * if not, create a new pcm stream. + * if not, create a new pcm stream. note, fp is added to the substream + * fmt_list and will be freed on the chip instance release. do not free + * fp or do remove it from the substream fmt_list to avoid double-free. */ int snd_usb_add_audio_stream(struct snd_usb_audio *chip, int stream, @@ -668,6 +670,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no) * (fp->maxpacksize & 0x7ff); fp->attributes = parse_uac_endpoint_attributes(chip, alts, protocol, iface_no); fp->clock = clock; + INIT_LIST_HEAD(&fp->list); /* some quirks for attributes here */ @@ -716,6 +719,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no) dev_dbg(&dev->dev, "%u:%d: add audio endpoint %#x\n", iface_no, altno, fp->endpoint); err = snd_usb_add_audio_stream(chip, stream, fp); if (err < 0) { + list_del(&fp->list); /* unlink for avoiding double-free */ kfree(fp->rate_table); kfree(fp->chmap); kfree(fp); From d6e9f921b0ea28d8a7c956568c65eba8fab5047c Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Thu, 14 Apr 2016 17:01:17 +0200 Subject: [PATCH 0308/1015] BACKPORT: usb: gadget: f_fs: Fix use-after-free (cherry picked from commit 38740a5b87d53ceb89eb2c970150f6e94e00373a) When using asynchronous read or write operations on the USB endpoints the issuer of the IO request is notified by calling the ki_complete() callback of the submitted kiocb when the URB has been completed. Calling this ki_complete() callback will free kiocb. Make sure that the structure is no longer accessed beyond that point, otherwise undefined behaviour might occur. Fixes: 2e4c7553cd6f ("usb: gadget: f_fs: add aio support") Cc: # v3.15+ Signed-off-by: Lars-Peter Clausen Signed-off-by: Felipe Balbi Change-Id: I3c7b643f6440c4fb6160a57c1058523030b46a6c Bug: 30950866 Git-repo: https://kernel.googlesource.com/pub/scm/linux/kernel/git/mhocko/mm.git Git-commit: 3846402f09e425009ae20f6f0f58be4227291cab Signed-off-by: Dennis Cagle --- drivers/usb/gadget/function/f_fs.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index e389c27d8e202..599a4273d29d4 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -689,7 +689,6 @@ static void ffs_user_copy_worker(struct work_struct *work) usb_ep_free_request(io_data->ep, io_data->req); - io_data->kiocb->private = NULL; if (io_data->read) kfree(io_data->iovec); kfree(io_data->buf); From aa8fac40fa1eebb033eb692cf0356983ed70bfd7 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Tue, 15 Dec 2015 13:49:05 +0100 Subject: [PATCH 0309/1015] perf: Fix race in swevent hash There's a race on CPU unplug where we free the swevent hash array while it can still have events on. This will result in a use-after-free which is BAD. Simply do not free the hash array on unplug. This leaves the thing around and no use-after-free takes place. When the last swevent dies, we do a for_each_possible_cpu() iteration anyway to clean these up, at which time we'll free it, so no leakage will occur. Change-Id: Ic189429d1cc1e292ad4f240643a92aec32638189 Reported-by: Sasha Levin Tested-by: Sasha Levin Signed-off-by: Peter Zijlstra (Intel) Cc: Arnaldo Carvalho de Melo Cc: Frederic Weisbecker Cc: Jiri Olsa Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Thomas Gleixner Cc: Vince Weaver Signed-off-by: Ingo Molnar Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 12ca6ad2e3a896256f086497a7c7406a547ee373 Signed-off-by: Dennis Cagle --- kernel/events/core.c | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index f9f8e283feabd..3cea606d9b92d 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -5731,9 +5731,6 @@ struct swevent_htable { /* Recursion avoidance in each contexts */ int recursion[PERF_NR_CONTEXTS]; - - /* Keeps track of cpu being initialized/exited */ - bool online; }; static DEFINE_PER_CPU(struct swevent_htable, swevent_htable); @@ -5980,14 +5977,8 @@ static int perf_swevent_add(struct perf_event *event, int flags) hwc->state = !(flags & PERF_EF_START); head = find_swevent_head(swhash, event); - if (!head) { - /* - * We can race with cpu hotplug code. Do not - * WARN if the cpu just got unplugged. - */ - WARN_ON_ONCE(swhash->online); + if (WARN_ON_ONCE(!head)) return -EINVAL; - } hlist_add_head_rcu(&event->hlist_entry, head); @@ -6054,7 +6045,6 @@ static int swevent_hlist_get_cpu(struct perf_event *event, int cpu) int err = 0; mutex_lock(&swhash->hlist_mutex); - if (!swevent_hlist_deref(swhash) && cpu_online(cpu)) { struct swevent_hlist *hlist; @@ -8190,7 +8180,6 @@ static void perf_event_init_cpu(int cpu) struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu); mutex_lock(&swhash->hlist_mutex); - swhash->online = true; if (swhash->hlist_refcount > 0) { struct swevent_hlist *hlist; @@ -8290,14 +8279,7 @@ static void perf_event_start_swclock(int cpu) static void perf_event_exit_cpu(int cpu) { - struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu); - perf_event_exit_cpu_context(cpu); - - mutex_lock(&swhash->hlist_mutex); - swhash->online = false; - swevent_hlist_release(swhash); - mutex_unlock(&swhash->hlist_mutex); } #else static inline void perf_event_exit_cpu(int cpu) { } From 70b125feb6dce8498f7e2139059e472548452961 Mon Sep 17 00:00:00 2001 From: Jerome Marchand Date: Wed, 6 Apr 2016 14:06:48 +0100 Subject: [PATCH 0310/1015] assoc_array: don't call compare_object() on a node Changes since V1: fixed the description and added KASan warning. In assoc_array_insert_into_terminal_node(), we call the compare_object() method on all non-empty slots, even when they're not leaves, passing a pointer to an unexpected structure to compare_object(). Currently it causes an out-of-bound read access in keyring_compare_object detected by KASan (see below). The issue is easily reproduced with keyutils testsuite. Only call compare_object() when the slot is a leave. KASan warning: ================================================================== BUG: KASAN: slab-out-of-bounds in keyring_compare_object+0x213/0x240 at addr ffff880060a6f838 Read of size 8 by task keyctl/1655 ============================================================================= BUG kmalloc-192 (Not tainted): kasan: bad access detected ----------------------------------------------------------------------------- Disabling lock debugging due to kernel taint INFO: Allocated in assoc_array_insert+0xfd0/0x3a60 age=69 cpu=1 pid=1647 ___slab_alloc+0x563/0x5c0 __slab_alloc+0x51/0x90 kmem_cache_alloc_trace+0x263/0x300 assoc_array_insert+0xfd0/0x3a60 __key_link_begin+0xfc/0x270 key_create_or_update+0x459/0xaf0 SyS_add_key+0x1ba/0x350 entry_SYSCALL_64_fastpath+0x12/0x76 INFO: Slab 0xffffea0001829b80 objects=16 used=8 fp=0xffff880060a6f550 flags=0x3fff8000004080 INFO: Object 0xffff880060a6f740 @offset=5952 fp=0xffff880060a6e5d1 Bytes b4 ffff880060a6f730: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Object ffff880060a6f740: d1 e5 a6 60 00 88 ff ff 0e 00 00 00 00 00 00 00 ...`............ Object ffff880060a6f750: 02 cf 8e 60 00 88 ff ff 02 c0 8e 60 00 88 ff ff ...`.......`.... Object ffff880060a6f760: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Object ffff880060a6f770: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Object ffff880060a6f780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Object ffff880060a6f790: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Object ffff880060a6f7a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Object ffff880060a6f7b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Object ffff880060a6f7c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Object ffff880060a6f7d0: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Object ffff880060a6f7e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Object ffff880060a6f7f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ CPU: 0 PID: 1655 Comm: keyctl Tainted: G B 4.5.0-rc4-kasan+ #291 Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 0000000000000000 000000001b2800b4 ffff880060a179e0 ffffffff81b60491 ffff88006c802900 ffff880060a6f740 ffff880060a17a10 ffffffff815e2969 ffff88006c802900 ffffea0001829b80 ffff880060a6f740 ffff880060a6e650 Call Trace: [] dump_stack+0x85/0xc4 [] print_trailer+0xf9/0x150 [] object_err+0x34/0x40 [] kasan_report_error+0x230/0x550 [] ? keyring_get_key_chunk+0x13e/0x210 [] __asan_report_load_n_noabort+0x5d/0x70 [] ? keyring_compare_object+0x213/0x240 [] keyring_compare_object+0x213/0x240 [] assoc_array_insert+0x86c/0x3a60 [] ? assoc_array_cancel_edit+0x70/0x70 [] ? __key_link_begin+0x20d/0x270 [] __key_link_begin+0xfc/0x270 [] key_create_or_update+0x459/0xaf0 [] ? trace_hardirqs_on+0xd/0x10 [] ? key_type_lookup+0xc0/0xc0 [] ? lookup_user_key+0x13d/0xcd0 [] ? memdup_user+0x53/0x80 [] SyS_add_key+0x1ba/0x350 [] ? key_get_type_from_user.constprop.6+0xa0/0xa0 [] ? retint_user+0x18/0x23 [] ? trace_hardirqs_on_caller+0x3fe/0x580 [] ? trace_hardirqs_on_thunk+0x17/0x19 [] entry_SYSCALL_64_fastpath+0x12/0x76 Memory state around the buggy address: ffff880060a6f700: fc fc fc fc fc fc fc fc 00 00 00 00 00 00 00 00 ffff880060a6f780: 00 00 00 00 00 00 00 00 00 00 00 fc fc fc fc fc >ffff880060a6f800: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc ^ ffff880060a6f880: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc ffff880060a6f900: fc fc fc fc fc fc 00 00 00 00 00 00 00 00 00 00 ================================================================== Change-Id: I456201ddb7d70c5efaf56ce7ec41ae3683f2a67c Signed-off-by: Jerome Marchand Signed-off-by: David Howells cc: stable@vger.kernel.org Git-repo: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: 8d4a2ec1e0b41b0cf9a0c5cd4511da7f8e4f3de2 Signed-off-by: Dennis Cagle --- lib/assoc_array.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/assoc_array.c b/lib/assoc_array.c index 2404d03e251a6..03a77f4740c12 100644 --- a/lib/assoc_array.c +++ b/lib/assoc_array.c @@ -523,7 +523,9 @@ static bool assoc_array_insert_into_terminal_node(struct assoc_array_edit *edit, free_slot = i; continue; } - if (ops->compare_object(assoc_array_ptr_to_leaf(ptr), index_key)) { + if (assoc_array_ptr_is_leaf(ptr) && + ops->compare_object(assoc_array_ptr_to_leaf(ptr), + index_key)) { pr_devel("replace in slot %d\n", i); edit->leaf_p = &node->slots[i]; edit->dead_leaf = node->slots[i]; From 8212cb20cc69d9c1327ba4eed6a38014d0fbbd40 Mon Sep 17 00:00:00 2001 From: Peter Hurley Date: Fri, 27 Nov 2015 14:30:21 -0500 Subject: [PATCH 0311/1015] tty: Prevent ldisc drivers from re-using stale tty fields Line discipline drivers may mistakenly misuse ldisc-related fields when initializing. For example, a failure to initialize tty->receive_room in the N_GIGASET_M101 line discipline was recently found and fixed [1]. Now, the N_X25 line discipline has been discovered accessing the previous line discipline's already-freed private data [2]. Harden the ldisc interface against misuse by initializing revelant tty fields before instancing the new line discipline. [1] commit fd98e9419d8d622a4de91f76b306af6aa627aa9c Author: Tilman Schmidt Date: Tue Jul 14 00:37:13 2015 +0200 isdn/gigaset: reset tty->receive_room when attaching ser_gigaset [2] Report from Sasha Levin [ 634.336761] ================================================================== [ 634.338226] BUG: KASAN: use-after-free in x25_asy_open_tty+0x13d/0x490 at addr ffff8800a743efd0 [ 634.339558] Read of size 4 by task syzkaller_execu/8981 [ 634.340359] ============================================================================= [ 634.341598] BUG kmalloc-512 (Not tainted): kasan: bad access detected ... [ 634.405018] Call Trace: [ 634.405277] dump_stack (lib/dump_stack.c:52) [ 634.405775] print_trailer (mm/slub.c:655) [ 634.406361] object_err (mm/slub.c:662) [ 634.406824] kasan_report_error (mm/kasan/report.c:138 mm/kasan/report.c:236) [ 634.409581] __asan_report_load4_noabort (mm/kasan/report.c:279) [ 634.411355] x25_asy_open_tty (drivers/net/wan/x25_asy.c:559 (discriminator 1)) [ 634.413997] tty_ldisc_open.isra.2 (drivers/tty/tty_ldisc.c:447) [ 634.414549] tty_set_ldisc (drivers/tty/tty_ldisc.c:567) [ 634.415057] tty_ioctl (drivers/tty/tty_io.c:2646 drivers/tty/tty_io.c:2879) [ 634.423524] do_vfs_ioctl (fs/ioctl.c:43 fs/ioctl.c:607) [ 634.427491] SyS_ioctl (fs/ioctl.c:622 fs/ioctl.c:613) [ 634.427945] entry_SYSCALL_64_fastpath (arch/x86/entry/entry_64.S:188) Change-Id: Idc6b27fb0b73b9057541ecc02c6c2aac46b50ffc Cc: Tilman Schmidt Cc: Sasha Levin Signed-off-by: Peter Hurley Signed-off-by: Greg Kroah-Hartman Git-repo: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: dd42bf1197144ede075a9d4793123f7689e164bc Signed-off-by: Dennis Cagle --- drivers/tty/tty_ldisc.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c index 2d822aa259b2f..2bf08366cd5b3 100644 --- a/drivers/tty/tty_ldisc.c +++ b/drivers/tty/tty_ldisc.c @@ -414,6 +414,10 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush); * they are not on hot paths so a little discipline won't do * any harm. * + * The line discipline-related tty_struct fields are reset to + * prevent the ldisc driver from re-using stale information for + * the new ldisc instance. + * * Locking: takes termios_rwsem */ @@ -422,6 +426,9 @@ static void tty_set_termios_ldisc(struct tty_struct *tty, int num) down_write(&tty->termios_rwsem); tty->termios.c_line = num; up_write(&tty->termios_rwsem); + + tty->disc_data = NULL; + tty->receive_room = 0; } /** From f72c30d3234bcdb76cdb302b2357bdea924a9f53 Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Tue, 19 Jan 2016 12:34:58 +0100 Subject: [PATCH 0312/1015] HID: core: prevent out-of-bound readings Plugging a Logitech DJ receiver with KASAN activated raises a bunch of out-of-bound readings. The fields are allocated up to MAX_USAGE, meaning that potentially, we do not have enough fields to fit the incoming values. Add checks and silence KASAN. Change-Id: I3b04131079a27f0b1cd60df03c793e8d9ffe5e91 Signed-off-by: Benjamin Tissoires Signed-off-by: Jiri Kosina Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 50220dead1650609206efe91f0cc116132d59b3f Signed-off-by: Dennis Cagle --- drivers/hid/hid-core.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index cb4bc0dadba55..94fdaeb856122 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -1213,6 +1213,7 @@ static void hid_input_field(struct hid_device *hid, struct hid_field *field, /* Ignore report if ErrorRollOver */ if (!(field->flags & HID_MAIN_ITEM_VARIABLE) && value[n] >= min && value[n] <= max && + value[n] - min < field->maxusage && field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1) goto exit; } @@ -1225,11 +1226,13 @@ static void hid_input_field(struct hid_device *hid, struct hid_field *field, } if (field->value[n] >= min && field->value[n] <= max + && field->value[n] - min < field->maxusage && field->usage[field->value[n] - min].hid && search(value, field->value[n], count)) hid_process_event(hid, field, &field->usage[field->value[n] - min], 0, interrupt); if (value[n] >= min && value[n] <= max + && value[n] - min < field->maxusage && field->usage[value[n] - min].hid && search(field->value, value[n], count)) hid_process_event(hid, field, &field->usage[value[n] - min], 1, interrupt); From fb19989e7307261803c1e5d56118fcd7a4dd1948 Mon Sep 17 00:00:00 2001 From: Mathias Krause Date: Thu, 5 May 2016 16:22:26 -0700 Subject: [PATCH 0313/1015] proc: prevent accessing /proc//environ until it's ready If /proc//environ gets read before the envp[] array is fully set up in create_{aout,elf,elf_fdpic,flat}_tables(), we might end up trying to read more bytes than are actually written, as env_start will already be set but env_end will still be zero, making the range calculation underflow, allowing to read beyond the end of what has been written. Fix this as it is done for /proc//cmdline by testing env_end for zero. It is, apparently, intentionally set last in create_*_tables(). This bug was found by the PaX size_overflow plugin that detected the arithmetic underflow of 'this_len = env_end - (env_start + src)' when env_end is still zero. The expected consequence is that userland trying to access /proc//environ of a not yet fully set up process may get inconsistent data as we're in the middle of copying in the environment variables. Change-Id: I95389e2cbeee5c47c6539d113a1bc2bb4f28bad0 Fixes: https://forums.grsecurity.net/viewtopic.php?f=3&t=4363 Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=116461 Signed-off-by: Mathias Krause Cc: Emese Revfy Cc: Pax Team Cc: Al Viro Cc: Mateusz Guzik Cc: Alexey Dobriyan Cc: Cyrill Gorcunov Cc: Jarod Wilson Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 8148a73c9901a8794a50f950083c00ccf97d43b3 Signed-off-by: Dennis Cagle --- fs/proc/base.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index 9dd8651960add..bfbeb596a576e 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -752,7 +752,8 @@ static ssize_t environ_read(struct file *file, char __user *buf, int ret = 0; struct mm_struct *mm = file->private_data; - if (!mm) + /* Ensure the process spawned far enough to have an environment. */ + if (!mm || !mm->env_end) return 0; page = (char *)__get_free_page(GFP_TEMPORARY); From 84097e075e436f404dd23b374d7d74de50f7195b Mon Sep 17 00:00:00 2001 From: Phil Turnbull Date: Tue, 2 Feb 2016 13:36:45 -0500 Subject: [PATCH 0314/1015] netfilter: nfnetlink: correctly validate length of batch messages If nlh->nlmsg_len is zero then an infinite loop is triggered because 'skb_pull(skb, msglen);' pulls zero bytes. The calculation in nlmsg_len() underflows if 'nlh->nlmsg_len < NLMSG_HDRLEN' which bypasses the length validation and will later trigger an out-of-bound read. If the length validation does fail then the malformed batch message is copied back to userspace. However, we cannot do this because the nlh->nlmsg_len can be invalid. This leads to an out-of-bounds read in netlink_ack: [ 41.455421] ================================================================== [ 41.456431] BUG: KASAN: slab-out-of-bounds in memcpy+0x1d/0x40 at addr ffff880119e79340 [ 41.456431] Read of size 4294967280 by task a.out/987 [ 41.456431] ============================================================================= [ 41.456431] BUG kmalloc-512 (Not tainted): kasan: bad access detected [ 41.456431] ----------------------------------------------------------------------------- ... [ 41.456431] Bytes b4 ffff880119e79310: 00 00 00 00 d5 03 00 00 b0 fb fe ff 00 00 00 00 ................ [ 41.456431] Object ffff880119e79320: 20 00 00 00 10 00 05 00 00 00 00 00 00 00 00 00 ............... [ 41.456431] Object ffff880119e79330: 14 00 0a 00 01 03 fc 40 45 56 11 22 33 10 00 05 .......@EV."3... [ 41.456431] Object ffff880119e79340: f0 ff ff ff 88 99 aa bb 00 14 00 0a 00 06 fe fb ................ ^^ start of batch nlmsg with nlmsg_len=4294967280 ... [ 41.456431] Memory state around the buggy address: [ 41.456431] ffff880119e79400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 41.456431] ffff880119e79480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 41.456431] >ffff880119e79500: 00 00 00 00 fc fc fc fc fc fc fc fc fc fc fc fc [ 41.456431] ^ [ 41.456431] ffff880119e79580: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 41.456431] ffff880119e79600: fc fc fc fc fc fc fc fc fc fc fb fb fb fb fb fb [ 41.456431] ================================================================== Fix this with better validation of nlh->nlmsg_len and by setting NFNL_BATCH_FAILURE if any batch message fails length validation. CAP_NET_ADMIN is required to trigger the bugs. Change-Id: I852df78e148c46f0d812a447c658b04234852117 Fixes: 9ea2aa8b7dba ("netfilter: nfnetlink: validate nfnetlink header from batch") Signed-off-by: Phil Turnbull Signed-off-by: Pablo Neira Ayuso Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: c58d6c93680f28ac58984af61d0a7ebf4319c241 Signed-off-by: Dennis Cagle --- net/netfilter/nfnetlink.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index e41bab38a3ca8..daec7d6957a94 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c @@ -321,10 +321,12 @@ static void nfnetlink_rcv_batch(struct sk_buff *skb, struct nlmsghdr *nlh, nlh = nlmsg_hdr(skb); err = 0; - if (nlmsg_len(nlh) < sizeof(struct nfgenmsg) || - skb->len < nlh->nlmsg_len) { - err = -EINVAL; - goto ack; + if (nlh->nlmsg_len < NLMSG_HDRLEN || + skb->len < nlh->nlmsg_len || + nlmsg_len(nlh) < sizeof(struct nfgenmsg)) { + nfnl_err_reset(&err_list); + success = false; + goto done; } /* Only requests are handled by the kernel */ From 38ee9c1b84016d9034e28da6f1795c29a81b7ae4 Mon Sep 17 00:00:00 2001 From: Subbaraman Narayanamurthy Date: Thu, 13 Oct 2016 12:46:50 -0700 Subject: [PATCH 0315/1015] regulator: cpr3-mmss: Increase fuse combo count To accommodate speed bin 2 and fuse revisions associated with it increase the fuse combo count from 16 to 24. At present, this is needed for msm8996proAU SOC. Change-Id: Ie781ffda433d491a38695caa5e55ec1ec7ff9b4a Signed-off-by: Subbaraman Narayanamurthy --- drivers/regulator/cpr3-mmss-regulator.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/regulator/cpr3-mmss-regulator.c b/drivers/regulator/cpr3-mmss-regulator.c index 6125a3b4a569c..2cca4acaf33b3 100644 --- a/drivers/regulator/cpr3-mmss-regulator.c +++ b/drivers/regulator/cpr3-mmss-regulator.c @@ -68,8 +68,9 @@ struct cpr3_msm8996_mmss_fuses { /* * Fuse combos 0 - 7 map to CPR fusing revision 0 - 7 with speed bin fuse = 0. * Fuse combos 8 - 15 map to CPR fusing revision 0 - 7 with speed bin fuse = 1. + * Fuse combos 16 - 23 map to CPR fusing revision 0 - 7 with speed bin fuse = 2. */ -#define CPR3_MSM8996PRO_MMSS_FUSE_COMBO_COUNT 16 +#define CPR3_MSM8996PRO_MMSS_FUSE_COMBO_COUNT 24 /* Fuse combos 0 - 7 map to CPR fusing revision 0 - 7 */ #define CPR3_MSMCOBALT_MMSS_FUSE_COMBO_COUNT 8 From 9be09283a30aa6d623c4cfaeb03842d70405ab70 Mon Sep 17 00:00:00 2001 From: Subbaraman Narayanamurthy Date: Thu, 13 Oct 2016 12:49:23 -0700 Subject: [PATCH 0316/1015] regulator: cpr3-hmss: Increase fuse combo count To accommodate speed bin 2 and fuse revisions associated with it increase the fuse combo count from 16 to 24. At present, this is needed for msm8996proAU SOC. Change-Id: I8555162eab2c6bfead2e0762f28525e0aa56cf10 Signed-off-by: Subbaraman Narayanamurthy --- drivers/regulator/cpr3-hmss-regulator.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/regulator/cpr3-hmss-regulator.c b/drivers/regulator/cpr3-hmss-regulator.c index afe9c21404d67..a9259058e0e23 100644 --- a/drivers/regulator/cpr3-hmss-regulator.c +++ b/drivers/regulator/cpr3-hmss-regulator.c @@ -87,8 +87,9 @@ struct cpr3_msm8996_hmss_fuses { /* * Fuse combos 0 - 7 map to CPR fusing revision 0 - 7 with speed bin fuse = 0. * Fuse combos 8 - 15 map to CPR fusing revision 0 - 7 with speed bin fuse = 1. + * Fuse combos 16 - 23 map to CPR fusing revision 0 - 7 with speed bin fuse = 2. */ -#define CPR3_MSM8996_HMSS_FUSE_COMBO_COUNT 16 +#define CPR3_MSM8996_HMSS_FUSE_COMBO_COUNT 24 /* * Constants which define the name of each fuse corner. Note that no actual From a95769a0fd4e722a1f0f7af2351566e76d5bab2b Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Mon, 14 Nov 2016 16:17:16 +0530 Subject: [PATCH 0317/1015] ARM: dts: msm: Add APC CPR configuration for MSM8996 speed-bin 2 Speed-bin 2 supports same CPR fusing scheme as speed-bin 0, add CPR configuration for all APC cpr regulators. Change-Id: I3a7c826b0dd6d73f877b4cd23288a820d85ba24d Signed-off-by: Anirudh Ghayal --- arch/arm/boot/dts/qcom/msm8996-regulator.dtsi | 374 ++++++++++++++++-- 1 file changed, 338 insertions(+), 36 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi index 6a20dac8e3f73..55a37c2798eb5 100644 --- a/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi @@ -623,15 +623,18 @@ qcom,cpr-pd-bypass-mask = <0x07>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <16 13>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <16 13 16>; qcom,cpr-corners = /* Speed bin 0 */ <16 16 16 16 16 16 16 16>, /* Speed bin 1 */ - <13 13 13 13 13 13 13 13>; + <13 13 13 13 13 13 13 13>, + + /* Speed bin 2 */ + <16 16 16 16 16 16 16 16>; qcom,ldo-min-headroom-voltage = <150000>; qcom,ldo-max-headroom-voltage = <470000>; @@ -643,7 +646,10 @@ <1 2 7 12 16>, /* Speed bin 1 */ - <1 2 7 12 13>; + <1 2 7 12 13>, + + /* Speed bin 2 */ + <1 2 7 12 16>; qcom,cpr-voltage-ceiling = /* Speed bin 0 */ @@ -655,7 +661,13 @@ /* Speed bin 1 */ <670000 670000 745000 745000 745000 745000 745000 905000 905000 905000 - 905000 905000 1140000>; + 905000 905000 1140000>, + + /* Speed bin 2 */ + <670000 670000 745000 745000 745000 + 745000 745000 905000 905000 905000 + 905000 905000 1140000 1140000 1140000 + 1140000>; qcom,cpr-voltage-floor = /* Speed bin 0 */ @@ -716,7 +728,41 @@ 470000 470000 470000>, <470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 - 470000 470000 470000>; + 470000 470000 470000>, + + /* Speed bin 2 */ + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000>; qcom,cpr-floor-to-ceiling-max-range = /* Speed bin 0 */ @@ -728,7 +774,13 @@ /* Speed bin 1 */ <50000 50000 80000 80000 80000 80000 80000 80000 80000 80000 - 80000 80000 80000>; + 80000 80000 80000>, + + /* Speed bin 2 */ + <50000 50000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000>; qcom,corner-frequencies = /* Speed bin 0 */ @@ -744,7 +796,15 @@ 556800000 652800000 729600000 844800000 960000000 1036800000 1113600000 1190400000 1228800000 - 1363200000>; + 1363200000>, + + /* Speed bin 2 */ + <307200000 422400000 480000000 + 556800000 652800000 729600000 + 844800000 960000000 1036800000 + 1113600000 1190400000 1228800000 + 1324800000 1401600000 1478400000 + 1593600000>; qcom,cpr-ro-scaling-factor = < 0 0 3112 2666 2947 2543 2271 1979 @@ -777,6 +837,16 @@ <35000 0 40000 10000 5000>, <35000 0 40000 10000 5000>, <35000 0 40000 10000 5000>, + <35000 0 40000 10000 5000>, + + /* Speed bin 2 */ + <20000 0 25000 (-5000) (-10000)>, + <20000 0 25000 (-5000) (-10000)>, + <20000 0 25000 (-5000) (-10000)>, + <35000 0 40000 10000 5000>, + <35000 0 40000 10000 5000>, + <35000 0 40000 10000 5000>, + <35000 0 40000 10000 5000>, <35000 0 40000 10000 5000>; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -798,6 +868,16 @@ <20000 10000 5000 (-5000) (-5000)>, <20000 10000 5000 (-5000) (-5000)>, <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, + + /* Speed bin 2 */ + <35000 35000 40000 40000 40000>, + <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, <20000 10000 5000 (-5000) (-5000)>; qcom,cpr-open-loop-voltage-adjustment = @@ -811,14 +891,23 @@ <(-15000) (-15000) (-15000) (-15000) (-13000) (-14000) (-15000) (-18000) (-20000) (-22000) (-24000) (-25000) - (-26000)>; + (-26000)>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) + (-13000) (-14000) (-15000) (-18000) + (-20000) (-22000) (-24000) (-25000) + (-26000) (-27000) (-28000) (-30000)>; qcom,cpr-open-loop-voltage-min-diff = /* Speed bin 0 */ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0>, /* Speed bin 1 */ - <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0>; + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0>, + + /* Speed bin 2 */ + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0>; qcom,cpr-closed-loop-voltage-adjustment = /* Speed bin 0 */ @@ -831,20 +920,29 @@ <(-15000) (-15000) (-15000) (-15000) (-13000) (-14000) (-15000) (-18000) (-20000) (-22000) (-24000) (-25000) - (-26000)>; + (-26000)>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) + (-13000) (-14000) (-15000) (-18000) + (-20000) (-22000) (-24000) (-25000) + (-26000) (-27000) (-28000) (-30000)>; qcom,allow-voltage-interpolation; qcom,allow-quotient-interpolation; qcom,cpr-scaled-open-loop-voltage-as-ceiling; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <12 12>; + qcom,cpr-aging-ref-corner = <12 12 12>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = /* Speed bin 0 */ <0 0 0 1 1 1 1 1>, /* Speed bin 1 */ + <0 0 0 1 1 1 1 1>, + + /* Speed bin 2 */ <0 0 0 1 1 1 1 1>; }; @@ -858,22 +956,28 @@ qcom,cpr-pd-bypass-mask = <0x18>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <19 15>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <19 15 19>; qcom,cpr-corners = /* Speed bin 0 */ <19 19 19 19 19 19 19 19>, /* Speed bin 1 */ - <15 15 15 15 15 15 15 15>; + <15 15 15 15 15 15 15 15>, + + /* Speed bin 2 */ + <19 19 19 19 19 19 19 19>; qcom,cpr-corner-fmax-map = /* Speed bin 0 */ <1 2 5 13 19>, /* Speed bin 1 */ - <1 2 5 13 15>; + <1 2 5 13 15>, + + /* Speed bin 2 */ + <1 2 5 13 19>; qcom,cpr-voltage-ceiling = /* Speed bin 0 */ @@ -885,7 +989,13 @@ /* Speed bin 1 */ <670000 670000 745000 745000 745000 905000 905000 905000 905000 905000 - 905000 905000 905000 1140000 1140000>; + 905000 905000 905000 1140000 1140000>, + + /* Speed bin 2 */ + <670000 670000 745000 745000 745000 + 905000 905000 905000 905000 905000 + 905000 905000 905000 1140000 1140000 + 1140000 1140000 1140000 1140000>; qcom,cpr-voltage-floor = /* Speed bin 0 */ @@ -946,7 +1056,41 @@ 470000 470000 470000 470000 470000>, <470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 - 470000 470000 470000 470000 470000>; + 470000 470000 470000 470000 470000>, + + /* Speed bin 2 */ + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000>; qcom,cpr-floor-to-ceiling-max-range = /* Speed bin 0 */ @@ -958,7 +1102,13 @@ /* Speed bin 1 */ <50000 50000 80000 80000 80000 80000 80000 80000 80000 80000 - 80000 80000 80000 80000 80000>; + 80000 80000 80000 80000 80000>, + + /* Speed bin 2 */ + <50000 50000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000>; qcom,corner-frequencies = /* Speed bin 0 */ @@ -975,7 +1125,16 @@ 537600000 595200000 672000000 748800000 825600000 902400000 979200000 1056000000 1132800000 - 1190400000 1228800000 1305600000>; + 1190400000 1228800000 1305600000>, + + /* Speed bin 2 */ + <307200000 384000000 460800000 + 537600000 595200000 672000000 + 748800000 825600000 902400000 + 979200000 1056000000 1132800000 + 1190400000 1228800000 1305600000 + 1382400000 1459200000 1536000000 + 1593600000>; qcom,cpr-ro-scaling-factor = < 0 0 3112 2666 2947 2543 2271 1979 @@ -1008,6 +1167,16 @@ <45000 0 5000 5000 (-25000)>, <45000 0 5000 5000 (-25000)>, <45000 0 5000 5000 (-25000)>, + <45000 0 5000 5000 (-25000)>, + + /* Speed bin 2 */ + <30000 0 (-10000) (-10000) (-40000)>, + <30000 0 (-10000) (-10000) (-40000)>, + <30000 0 (-10000) (-10000) (-40000)>, + <45000 0 5000 5000 (-25000)>, + <45000 0 5000 5000 (-25000)>, + <45000 0 5000 5000 (-25000)>, + <45000 0 5000 5000 (-25000)>, <45000 0 5000 5000 (-25000)>; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -1029,6 +1198,16 @@ <10000 5000 (-20000) 0 (-35000)>, <10000 5000 (-20000) 0 (-35000)>, <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, + + /* Speed bin 2 */ + <10000 5000 0 0 0>, + <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, <10000 5000 (-20000) 0 (-35000)>; qcom,allow-voltage-interpolation; @@ -1036,13 +1215,16 @@ qcom,cpr-scaled-open-loop-voltage-as-ceiling; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <13 13>; + qcom,cpr-aging-ref-corner = <13 13 13>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = /* Speed bin 0 */ <0 0 0 1 1 1 1 1>, /* Speed bin 1 */ + <0 0 0 1 1 1 1 1>, + + /* Speed bin 2 */ <0 0 0 1 1 1 1 1>; }; }; @@ -1061,15 +1243,18 @@ qcom,cpr-pd-bypass-mask = <0xe0>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <25 21>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <25 21 25>; qcom,cpr-corners = /* Speed bin 0 */ <25 25 25 25 25 25 25 25>, /* Speed bin 1 */ - <21 21 21 21 21 21 21 21>; + <21 21 21 21 21 21 21 21>, + + /* Speed bin 0 */ + <25 25 25 25 25 25 25 25>; qcom,ldo-min-headroom-voltage = <150000>; qcom,ldo-max-headroom-voltage = <470000>; @@ -1081,7 +1266,10 @@ <1 4 9 13 25>, /* Speed bin 1 */ - <1 4 9 13 21>; + <1 4 9 13 21>, + + /* Speed bin 2 */ + <1 4 9 13 25>; qcom,cpr-voltage-ceiling = /* Speed bin 0 */ @@ -1096,7 +1284,15 @@ 745000 745000 745000 745000 905000 905000 905000 905000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 - 1140000>; + 1140000>, + + /* Speed bin 2 */ + <670000 670000 670000 670000 745000 + 745000 745000 745000 745000 905000 + 905000 905000 905000 1140000 1140000 + 1140000 1140000 1140000 1140000 1140000 + 1140000 1140000 1140000 1140000 1140000>; + qcom,cpr-voltage-floor = /* Speed bin 0 */ @@ -1181,7 +1377,49 @@ 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 - 470000>; + 470000>, + + /* Speed bin 2 */ + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000>; qcom,cpr-floor-to-ceiling-max-range = /* Speed bin 0 */ @@ -1196,7 +1434,14 @@ 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 - 80000>; + 80000>, + + /* Speed bin 2 */ + <50000 50000 50000 50000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000>; qcom,corner-frequencies = /* Speed bin 0 */ @@ -1217,7 +1462,18 @@ 1036800000 1113600000 1190400000 1248000000 1324800000 1401600000 1478400000 1555200000 1632000000 - 1708800000 1785600000 1804800000>; + 1708800000 1785600000 1804800000>, + + /* Speed bin 2 */ + <307200000 403200000 480000000 + 556800000 652800000 729600000 + 806400000 883200000 940800000 + 1036800000 1113600000 1190400000 + 1248000000 1324800000 1401600000 + 1478400000 1555200000 1632000000 + 1708800000 1785600000 1824000000 + 1920000000 1996800000 2073600000 + 2150400000>; qcom,cpr-ro-scaling-factor = < 0 0 3112 2666 2947 2543 2271 1979 @@ -1250,6 +1506,16 @@ <35000 0 30000 15000 15000>, <35000 0 30000 15000 15000>, <35000 0 30000 15000 15000>, + <35000 0 30000 15000 15000>, + + /* Speed bin 2 */ + <20000 0 15000 (-55000) 0>, + <20000 0 15000 (-55000) 0>, + <20000 0 15000 0 0>, + <35000 0 30000 15000 15000>, + <35000 0 30000 15000 15000>, + <35000 0 30000 15000 15000>, + <35000 0 30000 15000 15000>, <35000 0 30000 15000 15000>; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -1271,6 +1537,16 @@ < 0 0 0 0 0>, < 0 0 0 0 0>, < 0 0 0 0 0>, + < 0 0 0 0 0>, + + /* Speed bin 2 */ + <35000 35000 40000 (-30000) 40000>, + < 0 0 0 (-70000) 0>, + < 0 0 0 0 0>, + < 0 0 0 0 0>, + < 0 0 0 0 0>, + < 0 0 0 0 0>, + < 0 0 0 0 0>, < 0 0 0 0 0>; qcom,cpr-open-loop-voltage-adjustment = @@ -1289,7 +1565,17 @@ (-15000) (-18000) (-21000) (-23000) (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) (-28000) - (-28000)>; + (-28000)>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) + (-11000) (-12000) (-13000) (-14000) + (-15000) (-18000) (-21000) (-23000) + (-25000) (-25000) (-26000) (-26000) + (-27000) (-27000) (-28000) (-28000) + (-28000) (-29000) (-29000) (-30000) + (-30000)>; + qcom,cpr-open-loop-voltage-min-diff = /* Speed bin 0 */ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 @@ -1297,7 +1583,11 @@ /* Speed bin 1 */ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0>; + 0 0 0 0 0>, + + /* Speed bin 2 */ + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0>; qcom,cpr-closed-loop-voltage-adjustment = /* Speed bin 0 */ @@ -1315,20 +1605,32 @@ (-15000) (-18000) (-21000) (-23000) (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) (-28000) - (-28000)>; + (-28000)>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) + (-11000) (-12000) (-13000) (-14000) + (-15000) (-18000) (-21000) (-23000) + (-25000) (-25000) (-26000) (-26000) + (-27000) (-27000) (-28000) (-28000) + (-28000) (-29000) (-29000) (-30000) + (-30000)>; qcom,allow-voltage-interpolation; qcom,allow-quotient-interpolation; qcom,cpr-scaled-open-loop-voltage-as-ceiling; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <13 13>; + qcom,cpr-aging-ref-corner = <13 13 13>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = /* Speed bin 0 */ <0 0 0 1 1 1 1 1>, /* Speed bin 1 */ + <0 0 0 1 1 1 1 1>, + + /* Speed bin 2 */ <0 0 0 1 1 1 1 1>; qcom,cpr-dynamic-floor-corner = <1>; From 284b6696bbb54022cc6f93d876f9c664714be53b Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Mon, 24 Oct 2016 19:50:08 +0530 Subject: [PATCH 0318/1015] ARM: dts: msm: Add GPU speed bin 2 support for MSM8996Pro Add GPU clock plan for speed bin 2 of MSM8996Pro target. This is initial change for supporting GPU speed bin 2. CRs-Fixed: 1082439 Change-Id: Ifb21ae3baa3df001d944aa2c9db36dffa2a29504 Signed-off-by: Hareesh Gundu --- arch/arm/boot/dts/qcom/msm8996pro.dtsi | 57 ++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8996pro.dtsi b/arch/arm/boot/dts/qcom/msm8996pro.dtsi index a9878d11d2e46..70d0ea775c952 100644 --- a/arch/arm/boot/dts/qcom/msm8996pro.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996pro.dtsi @@ -1182,6 +1182,63 @@ qcom,bus-max = <0>; }; }; + + qcom,gpu-pwrlevels-2 { + #address-cells = <1>; + #size-cells = <0>; + + qcom,speed-bin = <2>; + + qcom,initial-pwrlevel = <3>; + + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <510000000>; + qcom,bus-freq = <11>; + qcom,bus-min = <11>; + qcom,bus-max = <11>; + }; + + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <401800000>; + qcom,bus-freq = <8>; + qcom,bus-min = <7>; + qcom,bus-max = <9>; + }; + + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <315000000>; + qcom,bus-freq = <6>; + qcom,bus-min = <5>; + qcom,bus-max = <7>; + }; + + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <214000000>; + qcom,bus-freq = <4>; + qcom,bus-min = <3>; + qcom,bus-max = <5>; + }; + + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <133000000>; + qcom,bus-freq = <3>; + qcom,bus-min = <2>; + qcom,bus-max = <4>; + }; + + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <27000000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + qcom,bus-max = <0>; + }; + }; }; }; From 37cdd8f47bbd628669ab73d31d7a7a919c45146b Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Mon, 12 Sep 2016 15:47:42 -0700 Subject: [PATCH 0319/1015] cgroup: prefer %pK to %p Prevents leaking kernel pointers when using kptr_restrict. Bug: 30149174 Change-Id: I0fa3cd8d4a0d9ea76d085bba6020f1eda073c09b Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: 505e48f32f1321ed7cf80d49dd5f31b16da445a8 Signed-off-by: Dennis Cagle --- kernel/cgroup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cgroup.c b/kernel/cgroup.c index bf2543b6f3419..359a50e63e1e5 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -5566,7 +5566,7 @@ static int cgroup_css_links_read(struct seq_file *seq, void *v) struct task_struct *task; int count = 0; - seq_printf(seq, "css_set %p\n", cset); + seq_printf(seq, "css_set %pK\n", cset); list_for_each_entry(task, &cset->tasks, cg_list) { if (count++ > MAX_TASKS_SHOWN_PER_CSS) From b00a84f453fb71132f7a308678ed4a9dfb7f7550 Mon Sep 17 00:00:00 2001 From: Shilpa Mamidi Date: Tue, 8 Nov 2016 10:07:39 +0530 Subject: [PATCH 0320/1015] msm: isp: Clear irq status if irq is set again with same value Sometimes HW is giving same irq twice even after clearing irq. As workaround HW team suggested to read back irq after clearing and if read back irq is same as before clear then we need to clear register again. Change-Id: I79cecfa1c61c6224b8f9cef8146a2bb44a7522e8 Signed-off-by: Shilpa Mamidi --- drivers/media/platform/msm/camera_v2/isp/msm_isp40.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index 2d3bf99b2f9e8..61c7d5f0886ee 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -572,6 +572,11 @@ static void msm_vfe40_read_irq_status(struct vfe_device *vfe_dev, *irq_status0 &= vfe_dev->irq0_mask; *irq_status1 &= vfe_dev->irq1_mask; + if (*irq_status0 && + (*irq_status0 == msm_camera_io_r(vfe_dev->vfe_base + 0x38))) { + msm_camera_io_w(*irq_status0, vfe_dev->vfe_base + 0x30); + msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x24); + } if (*irq_status1 & (1 << 0)) { vfe_dev->error_info.camif_status = From 75871d873a94a2f63a8909dec9708cbfcf067ac1 Mon Sep 17 00:00:00 2001 From: Harsh Shah Date: Tue, 30 Aug 2016 18:45:10 -0700 Subject: [PATCH 0321/1015] msm: camera: isp: Update logic for assigning Master frame ID Existing logic for assigning Master frame ID when Slave is already active was causing frame ID jumps. These jumps would cause missing buffer issues. Update logic to accurately set frame ID on Master based on timestamp. Also compare requested frame id with eof to refuse frame request in a wrong time. Change-Id: I1dd42c55b2e8d92f4cbe81ebaa4c4225a9d83af8 Signed-off-by: Harsh Shah Signed-off-by: Junzhe Zou --- .../platform/msm/camera_v2/isp/msm_isp.h | 3 + .../platform/msm/camera_v2/isp/msm_isp40.c | 3 +- .../platform/msm/camera_v2/isp/msm_isp44.c | 3 +- .../platform/msm/camera_v2/isp/msm_isp46.c | 3 +- .../platform/msm/camera_v2/isp/msm_isp47.c | 12 +++- .../platform/msm/camera_v2/isp/msm_isp47.h | 2 + .../platform/msm/camera_v2/isp/msm_isp48.c | 1 + .../msm/camera_v2/isp/msm_isp_axi_util.c | 57 +++++++++++++------ .../platform/msm/camera_v2/isp/msm_isp_util.c | 4 ++ 9 files changed, 67 insertions(+), 21 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h index c8872cfb2cbdd..ad2b2e6d486b0 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h @@ -160,6 +160,8 @@ struct msm_vfe_irq_ops { void (*config_irq)(struct vfe_device *vfe_dev, uint32_t irq_status0, uint32_t irq_status1, enum msm_isp_irq_operation); + void (*process_eof_irq)(struct vfe_device *vfe_dev, + uint32_t irq_status0); }; struct msm_vfe_axi_ops { @@ -476,6 +478,7 @@ struct msm_vfe_src_info { struct timeval time_stamp; enum msm_vfe_dual_hw_type dual_hw_type; struct msm_vfe_dual_hw_ms_info dual_hw_ms_info; + uint32_t eof_id; }; struct msm_vfe_fetch_engine_info { diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index 2d3bf99b2f9e8..9c7f01d8d67d4 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -1439,7 +1439,7 @@ static void msm_vfe40_update_camif_state(struct vfe_device *vfe_dev, msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x30); msm_camera_io_w_mb(0x81, vfe_dev->vfe_base + 0x34); msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24); - msm_vfe40_config_irq(vfe_dev, 0xF7, 0x81, + msm_vfe40_config_irq(vfe_dev, 0x17, 0x81, MSM_ISP_IRQ_ENABLE); msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318); @@ -2259,6 +2259,7 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe40_process_epoch_irq, .config_irq = msm_vfe40_config_irq, + .process_eof_irq = msm_isp47_process_eof_irq, }, .axi_ops = { .reload_wm = msm_vfe40_axi_reload_wm, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c index d42d769d892c0..750b49bc2f5d2 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c @@ -1028,7 +1028,7 @@ static void msm_vfe44_update_camif_state(struct vfe_device *vfe_dev, msm_camera_io_w_mb(0x81, vfe_dev->vfe_base + 0x34); msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24); - msm_vfe44_config_irq(vfe_dev, 0xF7, 0x81, + msm_vfe44_config_irq(vfe_dev, 0x17, 0x81, MSM_ISP_IRQ_ENABLE); msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318); @@ -1832,6 +1832,7 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe44_process_epoch_irq, .config_irq = msm_vfe44_config_irq, + .process_eof_irq = msm_isp47_process_eof_irq, }, .axi_ops = { .reload_wm = msm_vfe44_axi_reload_wm, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c index d7883b6ee6298..cf68ff401d1d7 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c @@ -1104,7 +1104,7 @@ static void msm_vfe46_update_camif_state(struct vfe_device *vfe_dev, msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x64); msm_camera_io_w(0x81, vfe_dev->vfe_base + 0x68); msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58); - msm_vfe46_config_irq(vfe_dev, 0x15, 0x81, + msm_vfe46_config_irq(vfe_dev, 0x17, 0x81, MSM_ISP_IRQ_ENABLE); bus_en = @@ -1936,6 +1936,7 @@ struct msm_vfe_hardware_info vfe46_hw_info = { .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe46_process_epoch_irq, .config_irq = msm_vfe46_config_irq, + .process_eof_irq = msm_isp47_process_eof_irq, }, .axi_ops = { .reload_wm = msm_vfe46_axi_reload_wm, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c index 0665b28187c40..e422705b0c25a 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c @@ -179,7 +179,7 @@ static int32_t msm_vfe47_init_dt_parms(struct vfe_device *vfe_dev, struct msm_vfe_hw_init_parms *dt_parms, void __iomem *dev_mem_base) { struct device_node *of_node; - int32_t i = 0 , rc = 0; + int32_t i = 0, rc = 0; uint32_t *dt_settings = NULL, *dt_regs = NULL, num_dt_entries = 0; of_node = vfe_dev->pdev->dev.of_node; @@ -655,6 +655,13 @@ void msm_vfe47_process_epoch_irq(struct vfe_device *vfe_dev, } } +void msm_isp47_process_eof_irq(struct vfe_device *vfe_dev, + uint32_t irq_status0) +{ + if (irq_status0 & BIT(1)) + vfe_dev->axi_data.src_info[VFE_PIX_0].eof_id++; +} + void msm_vfe47_reg_update(struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src) { @@ -1456,7 +1463,7 @@ void msm_vfe47_update_camif_state(struct vfe_device *vfe_dev, msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x64); msm_camera_io_w(0x81, vfe_dev->vfe_base + 0x68); msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58); - msm_vfe47_config_irq(vfe_dev, 0x15, 0x81, + msm_vfe47_config_irq(vfe_dev, 0x17, 0x81, MSM_ISP_IRQ_ENABLE); if ((vfe_dev->hvx_cmd > HVX_DISABLE) && @@ -2667,6 +2674,7 @@ struct msm_vfe_hardware_info vfe47_hw_info = { .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe47_process_epoch_irq, .config_irq = msm_vfe47_config_irq, + .process_eof_irq = msm_isp47_process_eof_irq, }, .axi_ops = { .reload_wm = msm_vfe47_axi_reload_wm, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h index 58d4894398f50..7accf139bdf30 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h @@ -40,6 +40,8 @@ void msm_vfe47_process_reg_update(struct vfe_device *vfe_dev, void msm_vfe47_process_epoch_irq(struct vfe_device *vfe_dev, uint32_t irq_status0, uint32_t irq_status1, struct msm_isp_timestamp *ts); +void msm_isp47_process_eof_irq(struct vfe_device *vfe_dev, + uint32_t irq_status0); void msm_vfe47_reg_update(struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src); long msm_vfe47_reset_hardware(struct vfe_device *vfe_dev, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp48.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp48.c index be7c97fd34087..8f058a86b6155 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp48.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp48.c @@ -236,6 +236,7 @@ struct msm_vfe_hardware_info vfe48_hw_info = { .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe47_process_epoch_irq, .config_irq = msm_vfe47_config_irq, + .process_eof_irq = msm_isp47_process_eof_irq, }, .axi_ops = { .reload_wm = msm_vfe47_axi_reload_wm, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index 2a64f86ab092e..ab31845e825ed 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -20,7 +20,8 @@ static int msm_isp_update_dual_HW_ms_info_at_start( struct vfe_device *vfe_dev, - enum msm_vfe_input_src stream_src); + enum msm_vfe_input_src stream_src, + struct msm_isp_timestamp *ts); static int msm_isp_update_dual_HW_axi( struct vfe_device *vfe_dev, @@ -821,7 +822,8 @@ void msm_isp_increment_frame_id(struct vfe_device *vfe_dev, unsigned long flags; if (vfe_dev->axi_data.src_info[frame_src].frame_id == 0) - msm_isp_update_dual_HW_ms_info_at_start(vfe_dev, frame_src); + msm_isp_update_dual_HW_ms_info_at_start(vfe_dev, frame_src, + ts); spin_lock_irqsave(&vfe_dev->common_data->common_dev_data_lock, flags); dual_hw_type = @@ -2133,8 +2135,7 @@ static void msm_isp_get_camif_update_state_and_halt( *camif_update = DISABLE_CAMIF_IMMEDIATELY; else *camif_update = DISABLE_CAMIF; - } - else + } else *camif_update = NO_UPDATE; } else *camif_update = NO_UPDATE; @@ -2490,10 +2491,12 @@ static int msm_isp_axi_update_cgc_override(struct vfe_device *vfe_dev, static int msm_isp_update_dual_HW_ms_info_at_start( struct vfe_device *vfe_dev, - enum msm_vfe_input_src stream_src) + enum msm_vfe_input_src stream_src, + struct msm_isp_timestamp *ts) { int rc = 0; - uint32_t j, k, max_sof = 0; + uint32_t j, k, max_sof = 0, timestamp_ms = 0, cur_timestamp_ms = 0; + uint32_t delta; uint8_t slave_id; struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; struct msm_vfe_src_info *src_info = NULL; @@ -2531,7 +2534,8 @@ static int msm_isp_update_dual_HW_ms_info_at_start( common_dev_data_lock, flags); return rc; } - + cur_timestamp_ms = ts->buf_time.tv_sec * 1000 + + ts->buf_time.tv_usec / 1000; for (j = 0, k = 0; k < MS_NUM_SLAVE_MAX; k++) { if (!(vfe_dev->common_data->ms_resource. reserved_slave_mask & (1 << k))) @@ -2543,13 +2547,26 @@ static int msm_isp_update_dual_HW_ms_info_at_start( slave_sof_info[k].frame_id > max_sof)) { max_sof = vfe_dev->common_data->ms_resource. slave_sof_info[k].frame_id; + timestamp_ms = vfe_dev->common_data->ms_resource + .slave_sof_info[k].mono_timestamp_ms; } j++; if (j == vfe_dev->common_data->ms_resource.num_slave) break; } - vfe_dev->axi_data.src_info[stream_src].frame_id = - max_sof + 1; + if (cur_timestamp_ms > timestamp_ms) + delta = cur_timestamp_ms - timestamp_ms; + else + delta = timestamp_ms - cur_timestamp_ms; + if (delta > vfe_dev->common_data->ms_resource. + sof_delta_threshold) { + vfe_dev->axi_data.src_info[stream_src].frame_id = + max_sof; + } else { + vfe_dev->axi_data.src_info[stream_src].frame_id = + max_sof - vfe_dev->axi_data.src_info[ + stream_src].sof_counter_step; + } if (vfe_dev->is_split) { vfe_id = vfe_dev->pdev->id; vfe_id = (vfe_id == 0) ? 1 : 0; @@ -2721,6 +2738,7 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev, ISP_DBG("%s: vfe %d camif enable\n", __func__, vfe_dev->pdev->id); vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id = 0; + vfe_dev->axi_data.src_info[VFE_PIX_0].eof_id = 0; } for (i = 0; i < stream_cfg_cmd->num_streams; i++) { @@ -3182,15 +3200,25 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, } frame_src = SRC_TO_INTF(stream_info->stream_src); + pingpong_status = + vfe_dev->hw_info->vfe_ops.axi_ops.get_pingpong_status( + vfe_dev); /* * If PIX stream is active then RDI path uses SOF frame ID of PIX * In case of standalone RDI streaming, SOF are used from * individual intf. */ - if (((vfe_dev->axi_data.src_info[VFE_PIX_0].active) && (frame_id <= - vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id)) || - ((!vfe_dev->axi_data.src_info[VFE_PIX_0].active) && (frame_id <= - vfe_dev->axi_data.src_info[frame_src].frame_id)) || + /* + * If frame_id = 1 then no eof check is needed + */ + if (((vfe_dev->axi_data.src_info[VFE_PIX_0].active) && ((frame_id != + vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id + vfe_dev-> + axi_data.src_info[VFE_PIX_0].sof_counter_step) || + (frame_id <= vfe_dev-> + axi_data.src_info[VFE_PIX_0].eof_id + 1))) || + ((!vfe_dev->axi_data.src_info[VFE_PIX_0].active) && (frame_id != + vfe_dev->axi_data.src_info[frame_src].frame_id + vfe_dev-> + axi_data.src_info[frame_src].sof_counter_step)) || stream_info->undelivered_request_cnt >= MAX_BUFFERS_IN_HW) { pr_debug("%s:%d invalid request_frame %d cur frame id %d pix %d\n", __func__, __LINE__, frame_id, @@ -3297,9 +3325,6 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, } stream_info->sw_ping_pong_bit = 0; } else if (stream_info->undelivered_request_cnt == 2) { - pingpong_status = - vfe_dev->hw_info->vfe_ops.axi_ops.get_pingpong_status( - vfe_dev); rc = msm_isp_cfg_ping_pong_address(vfe_dev, stream_info, pingpong_status, 0); if (rc) { diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index 7f564f49134c7..6c848ca221db7 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -1887,6 +1887,10 @@ irqreturn_t msm_isp_process_irq(int irq_num, void *data) } ping_pong_status = vfe_dev->hw_info->vfe_ops.axi_ops. get_pingpong_status(vfe_dev); + if (vfe_dev->hw_info->vfe_ops.irq_ops.process_eof_irq) { + vfe_dev->hw_info->vfe_ops.irq_ops.process_eof_irq(vfe_dev, + irq_status0); + } msm_isp_process_overflow_irq(vfe_dev, &irq_status0, &irq_status1, 0); From 80b289a0480b9d87d2d6c37c4b009ee9739fef7c Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Wed, 19 Oct 2016 16:43:53 +0530 Subject: [PATCH 0322/1015] ARM: dts: msm: Add support for speed bin 2 for MSM8996Pro Add speed-bin 2 to support the fmax of 1.9GHz and 1.59GHz for perf and power clusters respectively. Also add speed-bin 2 to support the fmax of 510MHz for GPU clock. Change-Id: I085d816474fff3a6d76db1fdb969b6a762867df7 Signed-off-by: Odelu Kukatla --- arch/arm/boot/dts/qcom/msm8996pro.dtsi | 79 ++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8996pro.dtsi b/arch/arm/boot/dts/qcom/msm8996pro.dtsi index a9878d11d2e46..3273c21578e93 100644 --- a/arch/arm/boot/dts/qcom/msm8996pro.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996pro.dtsi @@ -716,6 +716,26 @@ < 1516800000 17 >, < 1593600000 18 >, < 1996800000 20 >; + qcom,pwrcl-speedbin2-v0 = + < 0 0 >, + < 307200000 1 >, + < 384000000 2 >, + < 460800000 3 >, + < 537600000 4 >, + < 614400000 5 >, + < 691200000 6 >, + < 768000000 7 >, + < 844800000 8 >, + < 902400000 9 >, + < 979200000 10 >, + < 1056000000 11 >, + < 1132800000 12 >, + < 1209600000 13 >, + < 1286400000 14 >, + < 1363200000 15 >, + < 1440000000 16 >, + < 1516800000 17 >, + < 1593600000 18 >; qcom,perfcl-speedbin0-v0 = < 0 0 >, < 307200000 1 >, @@ -772,6 +792,30 @@ < 1977600000 23 >, < 2054400000 24 >, < 2150400000 25 >; + qcom,perfcl-speedbin2-v0 = + < 0 0 >, + < 307200000 1 >, + < 384000000 2 >, + < 460800000 3 >, + < 537600000 4 >, + < 614400000 5 >, + < 691200000 6 >, + < 748800000 7 >, + < 825600000 8 >, + < 902400000 9 >, + < 979200000 10 >, + < 1056000000 11 >, + < 1132800000 12 >, + < 1209600000 13 >, + < 1286400000 14 >, + < 1363200000 15 >, + < 1440000000 16 >, + < 1516800000 17 >, + < 1593600000 18 >, + < 1670400000 19 >, + < 1747200000 20 >, + < 1824000000 21 >, + < 1900800000 22 >; qcom,cbf-speedbin0-v0 = < 0 0 >, < 192000000 1 >, @@ -814,6 +858,27 @@ < 1440000000 17 >, < 1516800000 18 >, < 1593600000 19 >; + qcom,cbf-speedbin2-v0 = + < 0 0 >, + < 192000000 1 >, + < 307200000 2 >, + < 384000000 3 >, + < 441600000 4 >, + < 537600000 5 >, + < 614400000 6 >, + < 691200000 7 >, + < 768000000 8 >, + < 844800000 9 >, + < 902400000 10 >, + < 979200000 11 >, + < 1056000000 12 >, + < 1132800000 13 >, + < 1190400000 14 >, + < 1286400000 15 >, + < 1363200000 16 >, + < 1440000000 17 >, + < 1516800000 18 >, + < 1593600000 19 >; }; &clock_mmss { @@ -864,6 +929,20 @@ < 510000000 5 >, < 560000000 7 >, < 624000000 7 >; + qcom,gfxfreq-speedbin2 = + < 0 0 0 >, + < 133000000 2 4 >, + < 214000000 3 4 >, + < 315000000 4 4 >, + < 401800000 5 5 >, + < 510000000 6 5 >; + qcom,gfxfreq-mx-speedbin2 = + < 0 0 >, + < 133000000 4 >, + < 214000000 4 >, + < 315000000 4 >, + < 401800000 5 >, + < 510000000 5 >; }; &msm_cpufreq { From 671313593191d65f2638d7fb3360272d2e985796 Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Fri, 16 Sep 2016 16:57:39 +0530 Subject: [PATCH 0323/1015] ARM: dts: msm: Change QOS latency value for 8917 l2_GDHS state is disabled. So to allow L2-retention, the QOS value needs to be changed to 651. Change-Id: I2d2f4f842bbfe8db204d3aef15d97eb99ba0eaf7 Signed-off-by: Vijay Viswanath --- arch/arm/boot/dts/qcom/msm8917.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index 298efe0bbb71a..1dcd6dc80156c 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -1394,12 +1394,12 @@ qcom,devfreq,freq-table = <50000000 200000000>; qcom,pm-qos-irq-type = "affine_irq"; - qcom,pm-qos-irq-latency = <13 281>; + qcom,pm-qos-irq-latency = <13 651>; qcom,pm-qos-cpu-groups = <0x0f>; - qcom,pm-qos-cmdq-latency-us = <13 281>; + qcom,pm-qos-cmdq-latency-us = <13 651>; - qcom,pm-qos-legacy-latency-us = <13 281>; + qcom,pm-qos-legacy-latency-us = <13 651>; qcom,msm-bus,name = "sdhc1"; qcom,msm-bus,num-cases = <9>; @@ -1438,10 +1438,10 @@ qcom,large-address-bus; qcom,pm-qos-irq-type = "affine_irq"; - qcom,pm-qos-irq-latency = <13 281>; + qcom,pm-qos-irq-latency = <13 651>; qcom,pm-qos-cpu-groups = <0x0f>; - qcom,pm-qos-legacy-latency-us = <13 281>; + qcom,pm-qos-legacy-latency-us = <13 651>; qcom,msm-bus,name = "sdhc2"; qcom,msm-bus,num-cases = <8>; From 0bb7551b65f67905150cd96d9f3c9636ed05d5e2 Mon Sep 17 00:00:00 2001 From: Deepak Kushwah Date: Wed, 26 Oct 2016 13:13:45 +0530 Subject: [PATCH 0324/1015] msm: vidc: Allow clients to suggest I-frame sizes Clients that want to influence the size I-frames emitted by the encoder can set V4L2_CID_MPEG_VIDC_VIDEO_VENC_IFRAMESIZE_TYPE. Change-Id: I4e6853022b558069304cde4cff7bc1445fd66213 Signed-off-by: Deepak Kushwah --- .../platform/msm/vidc/hfi_packetization.c | 27 ++++++++++++ drivers/media/platform/msm/vidc/msm_venc.c | 42 +++++++++++++++++++ .../media/platform/msm/vidc/vidc_hfi_api.h | 8 ++++ .../media/platform/msm/vidc/vidc_hfi_helper.h | 10 +++++ include/uapi/linux/v4l2-controls.h | 9 ++++ 5 files changed, 96 insertions(+) diff --git a/drivers/media/platform/msm/vidc/hfi_packetization.c b/drivers/media/platform/msm/vidc/hfi_packetization.c index c62ea5fd6adcf..b3eeb22214480 100644 --- a/drivers/media/platform/msm/vidc/hfi_packetization.c +++ b/drivers/media/platform/msm/vidc/hfi_packetization.c @@ -2153,6 +2153,33 @@ int create_pkt_cmd_session_set_property( pkt->size += sizeof(u32) + sizeof(struct hfi_enable); break; } + case HAL_PARAM_VENC_IFRAMESIZE_TYPE: + { + enum hal_iframesize_type hal = + *(enum hal_iframesize_type *)pdata; + struct hfi_iframe_size *hfi = (struct hfi_iframe_size *) + &pkt->rg_property_data[1]; + + switch (hal) { + case HAL_IFRAMESIZE_TYPE_DEFAULT: + hfi->type = HFI_IFRAME_SIZE_DEFAULT; + break; + case HAL_IFRAMESIZE_TYPE_MEDIUM: + hfi->type = HFI_IFRAME_SIZE_MEDIUM; + break; + case HAL_IFRAMESIZE_TYPE_HUGE: + hfi->type = HFI_IFRAME_SIZE_HIGH; + break; + case HAL_IFRAMESIZE_TYPE_UNLIMITED: + hfi->type = HFI_IFRAME_SIZE_UNLIMITED; + break; + default: + return -ENOTSUPP; + } + pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_VENC_IFRAMESIZE; + pkt->size += sizeof(u32) + sizeof(struct hfi_iframe_size); + break; + } /* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */ case HAL_CONFIG_BUFFER_REQUIREMENTS: case HAL_CONFIG_PRIORITY: diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c index aa7b9561fbeef..c2de902779650 100644 --- a/drivers/media/platform/msm/vidc/msm_venc.c +++ b/drivers/media/platform/msm/vidc/msm_venc.c @@ -185,6 +185,13 @@ static const char *const timestamp_mode[] = { "Ignore", }; +static const char *const iframe_sizes[] = { + "Default", + "Medium", + "Huge", + "Unlimited" +}; + static struct msm_vidc_ctrl msm_venc_ctrls[] = { { .id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD, @@ -1300,6 +1307,20 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .default_value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE, .step = 1, }, + { + .id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE, + .name = "Bounds of I-frame size", + .type = V4L2_CTRL_TYPE_MENU, + .minimum = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT, + .maximum = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED, + .default_value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT, + .menu_skip_mask = ~( + (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT) | + (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM) | + (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE) | + (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED)), + .qmenu = iframe_sizes, + }, }; static struct v4l2_ctrl *get_ctrl_from_cluster(int id, @@ -2142,6 +2163,19 @@ static inline int venc_v4l2_to_hal(int id, int value) default: goto unknown_value; } + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE: + switch (value) { + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT: + return HAL_IFRAMESIZE_TYPE_DEFAULT; + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM: + return HAL_IFRAMESIZE_TYPE_MEDIUM; + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE: + return HAL_IFRAMESIZE_TYPE_HUGE; + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED: + return HAL_IFRAMESIZE_TYPE_UNLIMITED; + default: + goto unknown_value; + } } unknown_value: @@ -2230,6 +2264,7 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) int frameqp = 0; int pic_order_cnt = 0; struct hal_video_signal_info signal_info = {0}; + enum hal_iframesize_type iframesize_type = HAL_IFRAMESIZE_TYPE_DEFAULT; if (!inst || !inst->core || !inst->core->device) { dprintk(VIDC_ERR, "%s invalid parameters\n", __func__); @@ -3319,6 +3354,13 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) } pdata = &enable; break; + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE: + property_id = HAL_PARAM_VENC_IFRAMESIZE_TYPE; + iframesize_type = venc_v4l2_to_hal( + V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE, + ctrl->val); + pdata = &iframesize_type; + break; default: dprintk(VIDC_ERR, "Unsupported index: %x\n", ctrl->id); rc = -ENOTSUPP; diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_api.h b/drivers/media/platform/msm/vidc/vidc_hfi_api.h index 57a49c66c7da5..b272ca4d99948 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_api.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_api.h @@ -242,6 +242,7 @@ enum hal_property { HAL_PARAM_VENC_VIDEO_SIGNAL_INFO, HAL_PARAM_VENC_SESSION_QP_RANGE_PACKED, HAL_PARAM_VENC_H264_TRANSFORM_8x8, + HAL_PARAM_VENC_IFRAMESIZE_TYPE, }; enum hal_domain { @@ -1002,6 +1003,13 @@ struct hal_video_signal_info { bool full_range; }; +enum hal_iframesize_type { + HAL_IFRAMESIZE_TYPE_DEFAULT, + HAL_IFRAMESIZE_TYPE_MEDIUM, + HAL_IFRAMESIZE_TYPE_HUGE, + HAL_IFRAMESIZE_TYPE_UNLIMITED, +}; + enum vidc_resource_id { VIDC_RESOURCE_NONE, VIDC_RESOURCE_OCMEM, diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h index 23240746baf16..6210dc4dc9f5c 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h @@ -384,6 +384,8 @@ struct hfi_buffer_info { (HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x031) #define HFI_PROPERTY_PARAM_VENC_VQZIP_SEI_TYPE \ (HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x033) +#define HFI_PROPERTY_PARAM_VENC_IFRAMESIZE \ + (HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x034) #define HFI_PROPERTY_CONFIG_VENC_COMMON_START \ (HFI_DOMAIN_BASE_VENC + HFI_ARCH_COMMON_OFFSET + 0x6000) @@ -882,6 +884,14 @@ struct hfi_aspect_ratio { u32 aspect_height; }; +#define HFI_IFRAME_SIZE_DEFAULT (HFI_COMMON_BASE + 0x1) +#define HFI_IFRAME_SIZE_MEDIUM (HFI_COMMON_BASE + 0x2) +#define HFI_IFRAME_SIZE_HIGH (HFI_COMMON_BASE + 0x3) +#define HFI_IFRAME_SIZE_UNLIMITED (HFI_COMMON_BASE + 0x4) +struct hfi_iframe_size { + u32 type; +}; + #define HFI_MVC_BUFFER_LAYOUT_TOP_BOTTOM (0) #define HFI_MVC_BUFFER_LAYOUT_SIDEBYSIDE (1) #define HFI_MVC_BUFFER_LAYOUT_SEQ (2) diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h index d207652370a2d..7d79484c8f3f9 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -1200,6 +1200,15 @@ enum v4l2_mpeg_vidc_video_h264_transform_8x8 { V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE = 1, }; +#define V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE \ + (V4L2_CID_MPEG_MSM_VIDC_BASE + 100) +enum v4l2_mpeg_vidc_video_venc_iframesize_type { + V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT, + V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM, + V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE, + V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED, +}; + /* Camera class control IDs */ #define V4L2_CID_CAMERA_CLASS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x900) From cea00f0d8955d4446b5b55078125c99e45a32d38 Mon Sep 17 00:00:00 2001 From: Chandana Kishori Chiluveru Date: Wed, 16 Nov 2016 12:39:51 +0530 Subject: [PATCH 0325/1015] usb: gadget: Enable/Disable USB_BAM based on composition BAM is used only in USB BAM mode. If platform has BAM enabled by default in peripheral mode then it may slow down DDR access by USB and also observing throughput degradation for software path transfers. Since, USB legacy mode doesn't use BAM2BAM mode disable the same for USB legacy mode and enable USB BAM based on composition. Change-Id: I564caea896fb6b7b7acef12dc72e1bf179977b3f Signed-off-by: Chandana Kishori Chiluveru --- .../bindings/platform/msm/usb-bam.txt | 1 - drivers/platform/msm/usb_bam.c | 110 ++++++++++++------ drivers/usb/gadget/ci13xxx_udc.c | 41 ++++--- drivers/usb/gadget/function/f_qc_rndis.c | 2 + drivers/usb/gadget/function/f_qdss.c | 4 + drivers/usb/gadget/function/f_rmnet.c | 4 +- drivers/usb/gadget/function/u_bam.c | 7 +- drivers/usb/gadget/function/u_bam_data.c | 1 - drivers/usb/gadget/function/u_data_ipa.c | 8 +- drivers/usb/gadget/function/u_data_ipa.h | 3 +- drivers/usb/gadget/function/u_qdss.c | 1 - drivers/usb/gadget/function/u_rmnet.h | 3 +- drivers/usb/phy/phy-msm-usb.c | 10 +- include/linux/usb_bam.h | 2 - 14 files changed, 129 insertions(+), 68 deletions(-) diff --git a/Documentation/devicetree/bindings/platform/msm/usb-bam.txt b/Documentation/devicetree/bindings/platform/msm/usb-bam.txt index 7d2e31ec84f58..9af22e2cbcbe9 100644 --- a/Documentation/devicetree/bindings/platform/msm/usb-bam.txt +++ b/Documentation/devicetree/bindings/platform/msm/usb-bam.txt @@ -36,7 +36,6 @@ Optional properties: - qcom,reset-bam-on-connect: If present then BAM is RESET before connecting pipe. This may be required if BAM peripheral is also reset before connect. - qcom,reset-bam-on-disconnect: If present then BAM is RESET after disconnecting pipes. -- qcom,enable-hsusb-bam-on-boot: If present then BAM is enabled at bootup itself. A number of USB BAM pipe parameters are represented as sub-nodes: diff --git a/drivers/platform/msm/usb_bam.c b/drivers/platform/msm/usb_bam.c index 9cdebd1549dbe..eaff4f3d59a04 100644 --- a/drivers/platform/msm/usb_bam.c +++ b/drivers/platform/msm/usb_bam.c @@ -2887,9 +2887,6 @@ static struct msm_usb_bam_platform_data *usb_bam_dt_to_pdata( else pdata->override_threshold = threshold; - pdata->enable_hsusb_bam_on_boot = of_property_read_bool(node, - "qcom,enable-hsusb-bam-on-boot"); - for_each_child_of_node(pdev->dev.of_node, node) max_connections++; @@ -3013,53 +3010,72 @@ static struct msm_usb_bam_platform_data *usb_bam_dt_to_pdata( return NULL; } -static int usb_bam_init(struct platform_device *pdev) +static void msm_usb_bam_update_props(struct sps_bam_props *props, + struct platform_device *pdev) { - int ret; struct msm_usb_bam_platform_data *pdata = pdev->dev.platform_data; enum usb_ctrl bam_type = pdata->bam_type; struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam_type]; - struct sps_bam_props props; - memset(&props, 0, sizeof(props)); - pr_debug("%s: usb_bam_init - %s\n", __func__, - bam_enable_strings[bam_type]); - - props.phys_addr = ctx->io_res->start; - props.virt_addr = ctx->regs; - props.virt_size = resource_size(ctx->io_res); - props.irq = ctx->irq; - props.summing_threshold = pdata->override_threshold; - props.event_threshold = pdata->override_threshold; - props.num_pipes = pdata->usb_bam_num_pipes; - props.callback = usb_bam_sps_events; - props.user = bam_enable_strings[bam_type]; + props->phys_addr = ctx->io_res->start; + props->virt_addr = NULL; + props->virt_size = resource_size(ctx->io_res); + props->irq = ctx->irq; + props->summing_threshold = pdata->override_threshold; + props->event_threshold = pdata->override_threshold; + props->num_pipes = pdata->usb_bam_num_pipes; + props->callback = usb_bam_sps_events; + props->user = bam_enable_strings[bam_type]; /* * HSUSB and HSIC Cores don't support RESET ACK signal to BAMs * Hence, let BAM to ignore acknowledge from USB while resetting PIPE */ if (pdata->ignore_core_reset_ack && bam_type != DWC3_CTRL) - props.options = SPS_BAM_NO_EXT_P_RST; + props->options = SPS_BAM_NO_EXT_P_RST; if (pdata->disable_clk_gating) - props.options |= SPS_BAM_NO_LOCAL_CLK_GATING; + props->options |= SPS_BAM_NO_LOCAL_CLK_GATING; /* - * HSUSB BAM is not NDP BAM and it must be enabled early before + * HSUSB BAM is not NDP BAM and it must be enabled before * starting peripheral controller to avoid switching USB core mode * from legacy to BAM with ongoing data transfers. */ - if (pdata->enable_hsusb_bam_on_boot && bam_type == CI_CTRL) { - pr_debug("Register and enable HSUSB BAM\n"); - props.options |= SPS_BAM_OPT_ENABLE_AT_BOOT; - props.options |= SPS_BAM_FORCE_RESET; + if (bam_type == CI_CTRL) { + log_event_dbg("Register and enable HSUSB BAM\n"); + props->options |= SPS_BAM_OPT_ENABLE_AT_BOOT; + props->options |= SPS_BAM_FORCE_RESET; } +} + +static int usb_bam_init(struct platform_device *pdev) +{ + int ret; + struct msm_usb_bam_platform_data *pdata = pdev->dev.platform_data; + enum usb_ctrl bam_type = pdata->bam_type; + struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam_type]; + struct sps_bam_props props; + + + pr_debug("%s: usb_bam_init - %s\n", __func__, + bam_enable_strings[bam_type]); + + /* + * CI USB2 BAM is registered before starting controller + * and only if bam2bam function is present in composition + */ + if (bam_type == CI_CTRL) + return 0; + + memset(&props, 0, sizeof(props)); + msm_usb_bam_update_props(&props, pdev); ret = sps_register_bam_device(&props, &ctx->h_bam); if (ret < 0) { - log_event_err("%s: register bam error %d\n", __func__, ret); + log_event_err("%s: register bam error %d\n", + __func__, ret); return -EFAULT; } @@ -3418,7 +3434,7 @@ int msm_do_bam_disable_enable(enum usb_ctrl bam) return 0; pdata = ctx->usb_bam_pdev->dev.platform_data; - if ((bam != CI_CTRL) || !pdata->enable_hsusb_bam_on_boot) + if (bam != CI_CTRL) return 0; if (!ctx->pipes_enabled_per_bam || info[bam].pipes_suspended) @@ -3520,20 +3536,44 @@ EXPORT_SYMBOL(msm_do_bam_disable_enable); bool msm_usb_bam_enable(enum usb_ctrl bam, bool bam_enable) { - struct msm_usb_bam_platform_data *pdata; struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam]; + static bool bam_enabled; + int ret; if (!ctx->usb_bam_pdev) return 0; - pdata = ctx->usb_bam_pdev->dev.platform_data; - if ((bam != CI_CTRL) || !(bam_enable || - pdata->enable_hsusb_bam_on_boot)) + if (bam != CI_CTRL) return 0; - msm_hw_bam_disable(1); - sps_device_reset(ctx->h_bam); - msm_hw_bam_disable(0); + if (bam_enabled == bam_enable) { + log_event_dbg("%s: USB BAM is already %s\n", __func__, + bam_enable ? "Registered" : "De-registered"); + return 0; + } + + if (bam_enable) { + struct sps_bam_props props; + + memset(&props, 0, sizeof(props)); + msm_usb_bam_update_props(&props, ctx->usb_bam_pdev); + msm_hw_bam_disable(1); + ret = sps_register_bam_device(&props, &ctx->h_bam); + bam_enabled = true; + if (ret < 0) { + log_event_err("%s: register bam error %d\n", + __func__, ret); + return -EFAULT; + } + log_event_dbg("%s: USB BAM Registered\n", __func__); + msm_hw_bam_disable(0); + } else { + msm_hw_bam_disable(1); + sps_device_reset(ctx->h_bam); + sps_deregister_bam_device(ctx->h_bam); + log_event_dbg("%s: USB BAM De-registered\n", __func__); + bam_enabled = false; + } return 0; } diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c index 25b421f9e6d55..829f09772cd0a 100644 --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c @@ -3427,21 +3427,28 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active) gadget_ready = 1; spin_unlock_irqrestore(udc->lock, flags); - if (gadget_ready) { - if (is_active) { - hw_device_reset(udc); - if (udc->udc_driver->notify_event) - udc->udc_driver->notify_event(udc, - CI13XXX_CONTROLLER_CONNECT_EVENT); - if (udc->softconnect) - hw_device_state(udc->ep0out.qh.dma); - } else { - hw_device_state(0); - _gadget_stop_activity(&udc->gadget); - if (udc->udc_driver->notify_event) - udc->udc_driver->notify_event(udc, - CI13XXX_CONTROLLER_DISCONNECT_EVENT); + if (!gadget_ready) + return 0; + + if (is_active) { + hw_device_reset(udc); + if (udc->udc_driver->notify_event) + udc->udc_driver->notify_event(udc, + CI13XXX_CONTROLLER_CONNECT_EVENT); + /* Enable BAM (if needed) before starting controller */ + if (udc->softconnect) { + dbg_event(0xFF, "BAM EN2", + _gadget->bam2bam_func_enabled); + msm_usb_bam_enable(CI_CTRL, + _gadget->bam2bam_func_enabled); + hw_device_state(udc->ep0out.qh.dma); } + } else { + hw_device_state(0); + _gadget_stop_activity(&udc->gadget); + if (udc->udc_driver->notify_event) + udc->udc_driver->notify_event(udc, + CI13XXX_CONTROLLER_DISCONNECT_EVENT); } return 0; @@ -3488,6 +3495,12 @@ static int ci13xxx_pullup(struct usb_gadget *_gadget, int is_active) pm_runtime_get_sync(&_gadget->dev); + /* Enable BAM (if needed) before starting controller */ + if (is_active) { + dbg_event(0xFF, "BAM EN1", _gadget->bam2bam_func_enabled); + msm_usb_bam_enable(CI_CTRL, _gadget->bam2bam_func_enabled); + } + spin_lock_irqsave(udc->lock, flags); if (!udc->vbus_active) { spin_unlock_irqrestore(udc->lock, flags); diff --git a/drivers/usb/gadget/function/f_qc_rndis.c b/drivers/usb/gadget/function/f_qc_rndis.c index 69d48b3e1a403..b74462750a4a1 100644 --- a/drivers/usb/gadget/function/f_qc_rndis.c +++ b/drivers/usb/gadget/function/f_qc_rndis.c @@ -1084,6 +1084,7 @@ rndis_qc_unbind(struct usb_configuration *c, struct usb_function *f) usb_free_descriptors(f->hs_descriptors); usb_free_descriptors(f->fs_descriptors); + c->cdev->gadget->bam2bam_func_enabled = false; kfree(rndis->notify_req->buf); usb_ep_free_request(rndis->notify, rndis->notify_req); @@ -1304,6 +1305,7 @@ rndis_qc_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], rndis_ipa_cleanup(rndis_ipa_params.private); goto fail; } + c->cdev->gadget->bam2bam_func_enabled = true; return 0; diff --git a/drivers/usb/gadget/function/f_qdss.c b/drivers/usb/gadget/function/f_qdss.c index 9b0f4e4a7dc70..476553322fcac 100644 --- a/drivers/usb/gadget/function/f_qdss.c +++ b/drivers/usb/gadget/function/f_qdss.c @@ -487,7 +487,10 @@ static void qdss_unbind(struct usb_configuration *c, struct usb_function *f) pr_debug("qdss_unbind\n"); flush_workqueue(qdss->wq); + ipa_data_flush_workqueue(); + + c->cdev->gadget->bam2bam_func_enabled = false; clear_eps(f); clear_desc(gadget, f); @@ -1040,6 +1043,7 @@ static int qdss_bind_config(struct usb_configuration *c, unsigned char portno) kfree(name); kfree(qdss); } + c->cdev->gadget->bam2bam_func_enabled = true; return status; } diff --git a/drivers/usb/gadget/function/f_rmnet.c b/drivers/usb/gadget/function/f_rmnet.c index df153571a9105..d282d55c91619 100644 --- a/drivers/usb/gadget/function/f_rmnet.c +++ b/drivers/usb/gadget/function/f_rmnet.c @@ -562,7 +562,8 @@ static void frmnet_unbind(struct usb_configuration *c, struct usb_function *f) usb_free_descriptors(f->fs_descriptors); frmnet_free_req(dev->notify, dev->notify_req); - + gbam_data_flush_workqueue(); + c->cdev->gadget->bam2bam_func_enabled = false; kfree(f->name); } @@ -1318,6 +1319,7 @@ static int frmnet_bind_config(struct usb_configuration *c, unsigned portno) kfree(f->name); return status; } + c->cdev->gadget->bam2bam_func_enabled = true; pr_debug("%s: complete\n", __func__); diff --git a/drivers/usb/gadget/function/u_bam.c b/drivers/usb/gadget/function/u_bam.c index b2bf5b560f41a..d3c27c30f2804 100644 --- a/drivers/usb/gadget/function/u_bam.c +++ b/drivers/usb/gadget/function/u_bam.c @@ -1385,7 +1385,6 @@ static void gbam2bam_connect_work(struct work_struct *w) spin_unlock_irqrestore(&port->port_lock, flags); usb_bam_alloc_fifos(d->usb_bam_type, d->src_connection_idx); usb_bam_alloc_fifos(d->usb_bam_type, d->dst_connection_idx); - gadget->bam2bam_func_enabled = true; spin_lock_irqsave(&port->port_lock, flags); /* check if USB cable is disconnected or not */ @@ -2355,6 +2354,12 @@ int gbam_connect(struct grmnet *gr, u8 port_num, return ret; } +void gbam_data_flush_workqueue(void) +{ + pr_debug("%s(): Flushing workqueue\n", __func__); + flush_workqueue(gbam_wq); +} + int gbam_setup(unsigned int no_bam_port) { int i; diff --git a/drivers/usb/gadget/function/u_bam_data.c b/drivers/usb/gadget/function/u_bam_data.c index c1d770f492b9d..5d6549e91fbd5 100644 --- a/drivers/usb/gadget/function/u_bam_data.c +++ b/drivers/usb/gadget/function/u_bam_data.c @@ -1021,7 +1021,6 @@ static void bam2bam_data_connect_work(struct work_struct *w) __func__, ret); goto free_fifos; } - gadget->bam2bam_func_enabled = true; spin_lock_irqsave(&port->port_lock, flags); if (port->last_event == U_BAM_DATA_DISCONNECT_E) { diff --git a/drivers/usb/gadget/function/u_data_ipa.c b/drivers/usb/gadget/function/u_data_ipa.c index 9f601239fc202..13d457bc9d968 100644 --- a/drivers/usb/gadget/function/u_data_ipa.c +++ b/drivers/usb/gadget/function/u_data_ipa.c @@ -422,7 +422,6 @@ static void ipa_data_connect_work(struct work_struct *w) pr_err("usb_bam_connect_ipa out failed err:%d\n", ret); goto unconfig_msm_ep_in; } - gadget->bam2bam_func_enabled = true; gport->ipa_consumer_ep = port->ipa_params.ipa_cons_ep_idx; is_ipa_disconnected = false; @@ -438,7 +437,6 @@ static void ipa_data_connect_work(struct work_struct *w) pr_err("usb_bam_connect_ipa IN failed err:%d\n", ret); goto disconnect_usb_bam_ipa_out; } - gadget->bam2bam_func_enabled = true; gport->ipa_producer_ep = port->ipa_params.ipa_prod_ep_idx; is_ipa_disconnected = false; @@ -821,6 +819,12 @@ void ipa_data_port_select(int portno, enum gadget_type gtype) port->gtype = gtype; }; +void ipa_data_flush_workqueue(void) +{ + pr_debug("%s(): Flushing workqueue\n", __func__); + flush_workqueue(ipa_data_wq); +} + /** * ipa_data_setup() - setup BAM2BAM IPA port * @no_ipa_port: total number of BAM2BAM IPA port to support diff --git a/drivers/usb/gadget/function/u_data_ipa.h b/drivers/usb/gadget/function/u_data_ipa.h index b7d47ab1bb044..f6bc961ec4383 100644 --- a/drivers/usb/gadget/function/u_data_ipa.h +++ b/drivers/usb/gadget/function/u_data_ipa.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014,2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -31,5 +31,6 @@ int ipa_data_connect(struct gadget_ipa_port *gp, u8 port_num, int ipa_data_setup(unsigned int no_ipa_port); void ipa_data_resume(struct gadget_ipa_port *gp, u8 port_num); void ipa_data_suspend(struct gadget_ipa_port *gp, u8 port_num); +void ipa_data_flush_workqueue(void); #endif diff --git a/drivers/usb/gadget/function/u_qdss.c b/drivers/usb/gadget/function/u_qdss.c index f44bf51e9e342..d29b0754ee97b 100644 --- a/drivers/usb/gadget/function/u_qdss.c +++ b/drivers/usb/gadget/function/u_qdss.c @@ -100,7 +100,6 @@ static int set_qdss_data_connection(struct usb_gadget *gadget, res = usb_bam_connect(usb_bam_type, idx, &(bam_info.usb_bam_pipe_idx)); - gadget->bam2bam_func_enabled = true; } else { kfree(bam_info.data_fifo); res = usb_bam_disconnect_pipe(usb_bam_type, idx); diff --git a/drivers/usb/gadget/function/u_rmnet.h b/drivers/usb/gadget/function/u_rmnet.h index 4336dbf26274e..c83aaae90a3e3 100644 --- a/drivers/usb/gadget/function/u_rmnet.h +++ b/drivers/usb/gadget/function/u_rmnet.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -76,4 +76,5 @@ int gsmd_ctrl_connect(struct grmnet *gr, int port_num); void gsmd_ctrl_disconnect(struct grmnet *gr, u8 port_num); int gsmd_ctrl_setup(enum ctrl_client client_num, unsigned int count, u8 *first_port_idx); +void gbam_data_flush_workqueue(void); #endif /* __U_RMNET_H*/ diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index 6a1437c157919..3985cb2a30712 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c @@ -805,15 +805,9 @@ static int msm_otg_reset(struct usb_phy *phy) USB_HS_APF_CTRL); /* - * Enable USB BAM if USB BAM is enabled already before block reset as - * block reset also resets USB BAM registers. + * Disable USB BAM as block reset resets USB BAM registers. */ - if (test_bit(ID, &motg->inputs)) { - msm_usb_bam_enable(CI_CTRL, - phy->otg->gadget->bam2bam_func_enabled); - } else { - dev_dbg(phy->dev, "host mode BAM not enabled\n"); - } + msm_usb_bam_enable(CI_CTRL, false); return 0; } diff --git a/include/linux/usb_bam.h b/include/linux/usb_bam.h index ebc2fe898bef2..80bbd8c8a6836 100644 --- a/include/linux/usb_bam.h +++ b/include/linux/usb_bam.h @@ -209,7 +209,6 @@ struct usb_bam_pipe_connect { * can work at in bam2bam mode when connected to HS host. * @max_mbps_superspeed: Maximum Mbits per seconds that the USB core * can work at in bam2bam mode when connected to SS host. - * @enable_hsusb_bam_on_boot: Enable HSUSB BAM (non-NDP) on bootup itself */ struct msm_usb_bam_platform_data { u8 max_connections; @@ -222,7 +221,6 @@ struct msm_usb_bam_platform_data { u32 override_threshold; u32 max_mbps_highspeed; u32 max_mbps_superspeed; - bool enable_hsusb_bam_on_boot; enum usb_ctrl bam_type; }; From 88a6732f70db9d7602b9338719c6dffa784e57d0 Mon Sep 17 00:00:00 2001 From: Chandana Kishori Chiluveru Date: Tue, 15 Nov 2016 16:12:09 +0530 Subject: [PATCH 0326/1015] ARM: dts: msm: Remove unused dtsi flag for MSM8920/MSM8940 Current code does not use "qcom,enable-hsusb-bam-on-boot" flag for selecting BAM on bootup. Now USB_BAM is enabled only for BAM2BAM function. Hence remove unused flag and enable BAM whenever BAM2BAM function is present in the composition. Change-Id: I831d6aa5af69d1cade561fd149b5a323f2888b05 Signed-off-by: Chandana Kishori Chiluveru --- arch/arm/boot/dts/qcom/msm8920.dtsi | 2 -- arch/arm/boot/dts/qcom/msm8940.dtsi | 2 -- 2 files changed, 4 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 3aaa696c897e6..0be7310bd90b6 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -78,8 +78,6 @@ <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { - qcom,enable-hsusb-bam-on-boot; - /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; qcom,pipe0 { diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index 8d319a73b662b..3a2f8623cd478 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -38,8 +38,6 @@ <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { - qcom,enable-hsusb-bam-on-boot; - /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; qcom,pipe0 { From 18a8ec63392851b75de1d7d99f14352435472b0e Mon Sep 17 00:00:00 2001 From: Abhishek Kondaveeti Date: Tue, 8 Nov 2016 12:38:24 +0530 Subject: [PATCH 0327/1015] msm: isp: Soft reset ISP before second pass Soft reset ISP before second pass to flush any remaining stale data in ISP. Change-Id: Ibd0aa3f409867f3d2cdb44569a5274364e871ab1 Signed-off-by: Abhishek Kondaveeti --- drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index 7f564f49134c7..5f0e865e0031c 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -384,7 +384,8 @@ static int msm_isp_start_fetch_engine_multi_pass(struct vfe_device *vfe_dev, fe_cfg->output_stream_id); return -EINVAL; } - + vfe_dev->hw_info->vfe_ops.core_ops.reset_hw(vfe_dev, + 0, 1); msm_isp_reset_framedrop(vfe_dev, stream_info); rc = msm_isp_cfg_offline_ping_pong_address(vfe_dev, stream_info, From 4a95337a918678cb52bbbf3bcc38e8c6bd7be6ad Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Tue, 15 Nov 2016 13:52:49 -0800 Subject: [PATCH 0328/1015] msm: camera: sensor: Validate eeprom_name string length Validate eeprom_name string length before copying into the userspace buffer. If more data than required is copied, userspace has the access to some of kernel data which is not intended. This change will fix the issue. CRs-Fixed: 1090007 Signed-off-by: Rajesh Bondugula Change-Id: Id40a287e0b1a93cc15d9b02c757fe9f347e285f2 --- .../msm/camera_v2/sensor/eeprom/msm_eeprom.c | 22 +++++++++++++++---- include/uapi/media/msm_cam_sensor.h | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c index 1f891ac76c965..037e8b52d0716 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c @@ -617,6 +617,7 @@ static int msm_eeprom_config(struct msm_eeprom_ctrl_t *e_ctrl, struct msm_eeprom_cfg_data *cdata = (struct msm_eeprom_cfg_data *)argp; int rc = 0; + size_t length = 0; CDBG("%s E\n", __func__); switch (cdata->cfgtype) { @@ -629,9 +630,15 @@ static int msm_eeprom_config(struct msm_eeprom_ctrl_t *e_ctrl, } CDBG("%s E CFG_EEPROM_GET_INFO\n", __func__); cdata->is_supported = e_ctrl->is_supported; + length = strlen(e_ctrl->eboard_info->eeprom_name) + 1; + if (length > MAX_EEPROM_NAME) { + pr_err("%s:%d invalid eeprom_name length %d\n", + __func__, __LINE__, (int)length); + rc = -EINVAL; + break; + } memcpy(cdata->cfg.eeprom_name, - e_ctrl->eboard_info->eeprom_name, - sizeof(cdata->cfg.eeprom_name)); + e_ctrl->eboard_info->eeprom_name, length); break; case CFG_EEPROM_GET_CAL_DATA: CDBG("%s E CFG_EEPROM_GET_CAL_DATA\n", __func__); @@ -1479,6 +1486,7 @@ static int msm_eeprom_config32(struct msm_eeprom_ctrl_t *e_ctrl, struct msm_eeprom_cfg_data32 *cdata = (struct msm_eeprom_cfg_data32 *)argp; int rc = 0; + size_t length = 0; CDBG("%s E\n", __func__); switch (cdata->cfgtype) { @@ -1491,9 +1499,15 @@ static int msm_eeprom_config32(struct msm_eeprom_ctrl_t *e_ctrl, } CDBG("%s E CFG_EEPROM_GET_INFO\n", __func__); cdata->is_supported = e_ctrl->is_supported; + length = strlen(e_ctrl->eboard_info->eeprom_name) + 1; + if (length > MAX_EEPROM_NAME) { + pr_err("%s:%d invalid eeprom_name length %d\n", + __func__, __LINE__, (int)length); + rc = -EINVAL; + break; + } memcpy(cdata->cfg.eeprom_name, - e_ctrl->eboard_info->eeprom_name, - sizeof(cdata->cfg.eeprom_name)); + e_ctrl->eboard_info->eeprom_name, length); break; case CFG_EEPROM_GET_CAL_DATA: CDBG("%s E CFG_EEPROM_GET_CAL_DATA\n", __func__); diff --git a/include/uapi/media/msm_cam_sensor.h b/include/uapi/media/msm_cam_sensor.h index 5b164a8fbf005..3f0e0f7596ab0 100644 --- a/include/uapi/media/msm_cam_sensor.h +++ b/include/uapi/media/msm_cam_sensor.h @@ -302,7 +302,7 @@ struct msm_eeprom_cfg_data { enum eeprom_cfg_type_t cfgtype; uint8_t is_supported; union { - char eeprom_name[MAX_SENSOR_NAME]; + char eeprom_name[MAX_EEPROM_NAME]; struct eeprom_get_t get_data; struct eeprom_read_t read_data; struct eeprom_write_t write_data; From fe596d6de6dfaab4411ba42e2a0e21180d873ab9 Mon Sep 17 00:00:00 2001 From: Sudeep Yedalapure Date: Fri, 4 Nov 2016 21:47:41 +0530 Subject: [PATCH 0329/1015] msm: kgsl: Fix overflow in sharedmem cache range operation function There could be possibility of integer overflow on adding size with maximum offset bytes and result in a value smaller than maximum memdesc size. CRs-Fixed: 1082914 Change-Id: Ie66b3a8ca2ca418a4a52f65987266b8d580c121f Signed-off-by: Sudeep Yedalapure --- drivers/gpu/msm/kgsl_sharedmem.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 610a9abbf69d6..735b1886682c8 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -574,12 +574,11 @@ int kgsl_cache_range_op(struct kgsl_memdesc *memdesc, uint64_t offset, void *addr = (memdesc->hostptr) ? memdesc->hostptr : (void *) memdesc->useraddr; - /* Make sure that size is non-zero */ - if (!size) + if (size == 0 || size > UINT_MAX) return -EINVAL; - /* Make sure that the offset + size isn't bigger than we can handle */ - if ((offset + size) > ULONG_MAX) + /* Make sure that the offset + size does not overflow */ + if ((offset + size < offset) || (offset + size < size)) return -ERANGE; /* Make sure the offset + size do not overflow the address */ From adcf7dab73b201e5fac39de35bd51513396be499 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Thu, 17 Nov 2016 08:48:32 +0530 Subject: [PATCH 0330/1015] ARM: dts: msm: Update APC CPR configuration for msm8920 Enable APC CPR closed-loop operation. Also, apply CPR open-loop and closed-loop voltage margins as per early voltage plan update. CRs-Fixed: 1091107 Change-Id: Icd802281859ea5a7d54ff9b24a3298ba272adf0a Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8920.dtsi | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 3aaa696c897e6..7ba42b4097d3b 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -192,6 +192,25 @@ /delete-property/ qcom,cpr-quotient-adjustment; /delete-property/ qcom,cpr-init-voltage-adjustment; /delete-property/ qcom,cpr-enable; + + qcom,cpr-speed-bin-max-corners = + <0 (-1) 1 2 4>, + <1 (-1) 1 2 5>; + + qcom,cpr-fuse-version-map = + /* Format: */ + < 0 0 (-1) (-1) (-1) (-1)>, + <(-1) (-1) (-1) (-1) (-1) (-1)>; + + qcom,cpr-init-voltage-adjustment = + <40000 15000 20000>, + <0 0 0>; + + qcom,cpr-quotient-adjustment = + <66 57 66>, /* SVSP(35mv); NOM(30mv); TUR(35mv); KV(1.9) */ + <0 0 0>; + + qcom,cpr-enable; }; &funnel_apss { From 75248c0fe012146652a451ee2bf4232bf4b64e8f Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Fri, 4 Nov 2016 17:35:19 -0700 Subject: [PATCH 0331/1015] qseecom: remove entry from qseecom_registered_app_list In an error handling case, the QSEECOM_IOCTL_LOAD_APP_REQ ioctl freed the entry for new TA, but didn't removed it from qseecom_registered_app_list. Make change to remove it. Change-Id: Id681fbf3c923027d3db875d506cbe3f971919a8d Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 661824b9766f3..ecc4a4abf1fed 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -2068,6 +2068,7 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) struct qseecom_load_app_64bit_ireq load_req_64bit; void *cmd_buf = NULL; size_t cmd_len; + bool first_time = false; /* Copy the relevant information needed for loading the image */ if (copy_from_user(&load_img_req, @@ -2139,6 +2140,7 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) &qseecom.registered_app_list_lock, flags); ret = 0; } else { + first_time = true; pr_warn("App (%s) does'nt exist, loading apps for first time\n", (char *)(load_img_req.img_name)); /* Get the handle of the shared fd */ @@ -2270,8 +2272,15 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) load_img_req.app_id = app_id; if (copy_to_user(argp, &load_img_req, sizeof(load_img_req))) { pr_err("copy_to_user failed\n"); - kzfree(entry); ret = -EFAULT; + if (first_time == true) { + spin_lock_irqsave( + &qseecom.registered_app_list_lock, flags); + list_del(&entry->list); + spin_unlock_irqrestore( + &qseecom.registered_app_list_lock, flags); + kzfree(entry); + } } loadapp_err: From c9ef869beb16dcde52efbe0fcf1f814ddff55c42 Mon Sep 17 00:00:00 2001 From: Karthikeyan Periasamy Date: Tue, 11 Oct 2016 12:21:42 -0700 Subject: [PATCH 0332/1015] msm: vidc: Check ion_handle for errors When ion imports dma buf, it will return negative error number in the case of failure like bad file number or invalid dma buf file. check ion_handle for error numbers. CRs-Fixed: 1071602 Change-Id: I1ea93161b85deb667cbb6f8515ff7c6943da6e3d Signed-off-by: Karthikeyan Periasamy --- drivers/media/platform/msm/vidc/msm_smem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/vidc/msm_smem.c b/drivers/media/platform/msm/vidc/msm_smem.c index bb2715654f45d..90047a608984e 100644 --- a/drivers/media/platform/msm/vidc/msm_smem.c +++ b/drivers/media/platform/msm/vidc/msm_smem.c @@ -475,7 +475,7 @@ bool msm_smem_compare_buffers(void *clt, int fd, void *priv) } handle = ion_import_dma_buf(client->clnt, fd); ret = handle == priv; - handle ? ion_free(client->clnt, handle) : 0; + (!IS_ERR_OR_NULL(handle)) ? ion_free(client->clnt, handle) : 0; return ret; } From 5b2bf8ba722c9c51512f9e7e8486f1a5ed3ae931 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Mon, 31 Oct 2016 15:23:19 -0700 Subject: [PATCH 0333/1015] msm: crypto: fix issues on digest buf and copy_from_user in qcedev.c Make the digest length not larger than the size of the buffer qcedev_areq.sha_op_req.digest; and use the checked variants of the copy_from/to_user() APIs to avoid small race window of their unchecked variants. Change-Id: I3db0c20ac5fa47ed278f3d60368c406f472430c1 Signed-off-by: Zhen Kong --- drivers/crypto/msm/qcedev.c | 120 ++++++++---------------------------- 1 file changed, 27 insertions(+), 93 deletions(-) diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index 1402d3ded9843..433e4783d1d1b 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -603,7 +603,7 @@ static int qcedev_sha_update_max_xfer(struct qcedev_async_req *qcedev_areq, while (len > 0) { user_src = (void __user *)qcedev_areq->sha_op_req.data[i].vaddr; - if (user_src && __copy_from_user(k_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[i].len)) return -EFAULT; @@ -639,7 +639,7 @@ static int qcedev_sha_update_max_xfer(struct qcedev_async_req *qcedev_areq, /* Copy data from user src(s) */ user_src = (void __user *)qcedev_areq->sha_op_req.data[0].vaddr; - if (user_src && __copy_from_user(k_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[0].len)) { kzfree(k_buf_src); @@ -648,7 +648,7 @@ static int qcedev_sha_update_max_xfer(struct qcedev_async_req *qcedev_areq, k_src += qcedev_areq->sha_op_req.data[0].len; for (i = 1; i < qcedev_areq->sha_op_req.entries; i++) { user_src = (void __user *)qcedev_areq->sha_op_req.data[i].vaddr; - if (user_src && __copy_from_user(k_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[i].len)) { kzfree(k_buf_src); @@ -702,13 +702,6 @@ static int qcedev_sha_update(struct qcedev_async_req *qcedev_areq, return -EINVAL; } - /* verify address src(s) */ - for (i = 0; i < qcedev_areq->sha_op_req.entries; i++) - if (!access_ok(VERIFY_READ, - (void __user *)qcedev_areq->sha_op_req.data[i].vaddr, - qcedev_areq->sha_op_req.data[i].len)) - return -EFAULT; - if (qcedev_areq->sha_op_req.data_len > QCE_MAX_OPER_DATA) { struct qcedev_sha_op_req *saved_req; @@ -868,19 +861,7 @@ static int qcedev_hash_cmac(struct qcedev_async_req *qcedev_areq, total = qcedev_areq->sha_op_req.data_len; - /* verify address src(s) */ - for (i = 0; i < qcedev_areq->sha_op_req.entries; i++) - if (!access_ok(VERIFY_READ, - (void __user *)qcedev_areq->sha_op_req.data[i].vaddr, - qcedev_areq->sha_op_req.data[i].len)) - return -EFAULT; - - /* Verify Source Address */ - if (!access_ok(VERIFY_READ, - (void __user *)qcedev_areq->sha_op_req.authkey, - qcedev_areq->sha_op_req.authklen)) - return -EFAULT; - if (__copy_from_user(&handle->sha_ctxt.authkey[0], + if (copy_from_user(&handle->sha_ctxt.authkey[0], (void __user *)qcedev_areq->sha_op_req.authkey, qcedev_areq->sha_op_req.authklen)) return -EFAULT; @@ -900,7 +881,7 @@ static int qcedev_hash_cmac(struct qcedev_async_req *qcedev_areq, for (i = 0; i < qcedev_areq->sha_op_req.entries; i++) { user_src = (void __user *)qcedev_areq->sha_op_req.data[i].vaddr; - if (user_src && __copy_from_user(k_src, (void __user *)user_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[i].len)) { kzfree(k_buf_src); return -EFAULT; @@ -928,12 +909,7 @@ static int qcedev_set_hmac_auth_key(struct qcedev_async_req *areq, if (areq->sha_op_req.authklen <= QCEDEV_MAX_KEY_SIZE) { qcedev_sha_init(areq, handle); - /* Verify Source Address */ - if (!access_ok(VERIFY_READ, - (void __user *)areq->sha_op_req.authkey, - areq->sha_op_req.authklen)) - return -EFAULT; - if (__copy_from_user(&handle->sha_ctxt.authkey[0], + if (copy_from_user(&handle->sha_ctxt.authkey[0], (void __user *)areq->sha_op_req.authkey, areq->sha_op_req.authklen)) return -EFAULT; @@ -1146,7 +1122,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, byteoffset = areq->cipher_op_req.byteoffset; user_src = (void __user *)areq->cipher_op_req.vbuf.src[0].vaddr; - if (user_src && __copy_from_user((k_align_src + byteoffset), + if (user_src && copy_from_user((k_align_src + byteoffset), (void __user *)user_src, areq->cipher_op_req.vbuf.src[0].len)) return -EFAULT; @@ -1156,7 +1132,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, for (i = 1; i < areq->cipher_op_req.entries; i++) { user_src = (void __user *)areq->cipher_op_req.vbuf.src[i].vaddr; - if (user_src && __copy_from_user(k_align_src, + if (user_src && copy_from_user(k_align_src, (void __user *)user_src, areq->cipher_op_req.vbuf.src[i].len)) { return -EFAULT; @@ -1188,7 +1164,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, while (creq->data_len > 0) { if (creq->vbuf.dst[dst_i].len <= creq->data_len) { - if (err == 0 && __copy_to_user( + if (err == 0 && copy_to_user( (void __user *)creq->vbuf.dst[dst_i].vaddr, (k_align_dst + byteoffset), creq->vbuf.dst[dst_i].len)) @@ -1199,7 +1175,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, creq->data_len -= creq->vbuf.dst[dst_i].len; dst_i++; } else { - if (err == 0 && __copy_to_user( + if (err == 0 && copy_to_user( (void __user *)creq->vbuf.dst[dst_i].vaddr, (k_align_dst + byteoffset), creq->data_len)) @@ -1531,36 +1507,6 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, __func__, total, req->data_len); goto error; } - /* Verify Source Address's */ - for (i = 0, total = 0; i < req->entries; i++) { - if (total < req->data_len) { - if (!access_ok(VERIFY_READ, - (void __user *)req->vbuf.src[i].vaddr, - req->vbuf.src[i].len)) { - pr_err("%s:SRC RD_VERIFY err %d=0x%lx\n", - __func__, i, (uintptr_t) - req->vbuf.src[i].vaddr); - goto error; - } - total += req->vbuf.src[i].len; - } - } - - /* Verify Destination Address's */ - for (i = 0, total = 0; i < QCEDEV_MAX_BUFFERS; i++) { - if ((req->vbuf.dst[i].vaddr != 0) && - (total < req->data_len)) { - if (!access_ok(VERIFY_WRITE, - (void __user *)req->vbuf.dst[i].vaddr, - req->vbuf.dst[i].len)) { - pr_err("%s:DST WR_VERIFY err %d=0x%lx\n", - __func__, i, (uintptr_t) - req->vbuf.dst[i].vaddr); - goto error; - } - total += req->vbuf.dst[i].len; - } - } return 0; error: return -EINVAL; @@ -1656,11 +1602,7 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) switch (cmd) { case QCEDEV_IOCTL_ENC_REQ: case QCEDEV_IOCTL_DEC_REQ: - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_cipher_op_req))) - return -EFAULT; - - if (__copy_from_user(&qcedev_areq.cipher_op_req, + if (copy_from_user(&qcedev_areq.cipher_op_req, (void __user *)arg, sizeof(struct qcedev_cipher_op_req))) return -EFAULT; @@ -1673,20 +1615,17 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) err = qcedev_vbuf_ablk_cipher(&qcedev_areq, handle); if (err) return err; - if (__copy_to_user((void __user *)arg, + if (copy_to_user((void __user *)arg, &qcedev_areq.cipher_op_req, sizeof(struct qcedev_cipher_op_req))) - return -EFAULT; + return -EFAULT; break; case QCEDEV_IOCTL_SHA_INIT_REQ: { struct scatterlist sg_src; - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1696,9 +1635,9 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) err = qcedev_hash_init(&qcedev_areq, handle, &sg_src); if (err) return err; - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) - return -EFAULT; + return -EFAULT; } handle->sha_ctxt.init_done = true; break; @@ -1708,11 +1647,8 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) case QCEDEV_IOCTL_SHA_UPDATE_REQ: { struct scatterlist sg_src; - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1734,10 +1670,15 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) return err; } + if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { + pr_err("Invalid sha_ctxt.diglen %d\n", + handle->sha_ctxt.diglen); + return -EINVAL; + } memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; } @@ -1749,11 +1690,7 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) pr_err("%s Init was not called\n", __func__); return -EINVAL; } - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1767,7 +1704,7 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; handle->sha_ctxt.init_done = false; @@ -1776,11 +1713,8 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) case QCEDEV_IOCTL_GET_SHA_REQ: { struct scatterlist sg_src; - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1798,7 +1732,7 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; } From b2555b966b5d1fe5417e16bbfc230d2c6dec96c7 Mon Sep 17 00:00:00 2001 From: Swetha Chikkaboraiah Date: Wed, 2 Nov 2016 16:49:41 +0530 Subject: [PATCH 0334/1015] qcom: scm: remove printing input arguments scm_call2 is printing the input arguments if TZ ret value is < 0 leading to information leak. Remove printing input arguments. Change-Id: I21dd6d83fa979aed2c79ebb2c9c8de63a247dded CRs-Fixed: 1076407 Signed-off-by: Swetha Chikkaboraiah Signed-off-by: Paresh Purabhiya --- drivers/soc/qcom/scm.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/drivers/soc/qcom/scm.c b/drivers/soc/qcom/scm.c index 16115619b9db5..f958d98ec9720 100644 --- a/drivers/soc/qcom/scm.c +++ b/drivers/soc/qcom/scm.c @@ -662,10 +662,6 @@ int scm_call2(u32 fn_id, struct scm_desc *desc) desc->ret[0] = desc->ret[1] = desc->ret[2] = 0; - pr_debug("scm_call: func id %#llx, args: %#x, %#llx, %#llx, %#llx, %#llx\n", - x0, desc->arginfo, desc->args[0], desc->args[1], - desc->args[2], desc->x5); - trace_scm_call_start(x0, desc); if (scm_version == SCM_ARMV8_64) @@ -695,10 +691,8 @@ int scm_call2(u32 fn_id, struct scm_desc *desc) } while (ret == SCM_V2_EBUSY && (retry_count++ < SCM_EBUSY_MAX_RETRY)); if (ret < 0) - pr_err("scm_call failed: func id %#llx, arginfo: %#x, args: %#llx, %#llx, %#llx, %#llx, ret: %d, syscall returns: %#llx, %#llx, %#llx\n", - x0, desc->arginfo, desc->args[0], desc->args[1], - desc->args[2], desc->x5, ret, desc->ret[0], - desc->ret[1], desc->ret[2]); + pr_err("scm_call failed: func id %#llx, ret: %d, syscall returns: %#llx, %#llx, %#llx\n", + x0, ret, desc->ret[0], desc->ret[1], desc->ret[2]); if (arglen > N_REGISTER_ARGS) kfree(desc->extra_arg_buf); From b075882337c03bd8183f3453be18afbc41693d03 Mon Sep 17 00:00:00 2001 From: Min Chong Date: Fri, 2 Sep 2016 11:36:37 -0700 Subject: [PATCH 0335/1015] input: synaptics_dsx: add checks of user input data Add checks of the user input count to avoid possible heap overflow Signed-off-by: Min Chong Bug: 30937462 Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: a6accafb252a76256f11c83e28c556c8ca4b8e1f Change-Id: I6fc8323cbcf395a2c24e49e65cc7012709d031a2 Signed-off-by: Dennis Cagle --- .../touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c index 2282fe005bc7e..f001706236ab0 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c @@ -1606,6 +1606,13 @@ static ssize_t fwu_sysfs_store_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) { + if (count > (fwu->image_size - fwu->data_pos)) { + dev_err(fwu->rmi4_data->pdev->dev.parent, + "%s: Not enough space in buffer\n", + __func__); + return -EINVAL; + } + memcpy((void *)(&fwu->ext_data_source[fwu->data_pos]), (const void *)buf, count); From a7814186d1d69c26c70eb1f22aa48177f93f56d3 Mon Sep 17 00:00:00 2001 From: Andrew Chant Date: Thu, 15 Sep 2016 16:19:50 -0700 Subject: [PATCH 0336/1015] Input: synaptics: check input, prevent sysfs races concurrent sysfs calls on the fw updater can cause ugly race conditions. Return EBUSY on concurrent sysfs calls. For sysfs calls which generate deferred work, prevent the deferred work from running concurrently with other sysfs calls. Also check that ext_data_source is appropriately sized and allocated, based on a patch by Gengjia Chen (chengjia4574@gmail.com). Signed-off-by: Andrew Chant Change-Id:I5bbe4992f3fd2d23db288296eaeb61f5831098e9 Bug: 30799828 Bug: 31252388 Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: 287ce2ccfefe68067c1f9f5175b6664bf7397fe6 Signed-off-by: Srinivasa Rao Kuppala Signed-off-by: Naveen Kumar --- .../synaptics_dsx/synaptics_dsx_fw_update.c | 91 ++++++++++++++-- .../input/touchscreen/synaptics_fw_update.c | 102 ++++++++++++++++-- 2 files changed, 172 insertions(+), 21 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c index f001706236ab0..0ec16e6065453 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c @@ -358,6 +358,7 @@ static struct device_attribute attrs[] = { static struct synaptics_rmi4_fwu_handle *fwu; DECLARE_COMPLETION(fwu_dsx_remove_complete); +DEFINE_MUTEX(dsx_fwu_sysfs_mutex); static unsigned int extract_uint_le(const unsigned char *ptr) { @@ -1589,28 +1590,49 @@ static ssize_t fwu_sysfs_show_image(struct file *data_file, char *buf, loff_t pos, size_t count) { struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + ssize_t retval; + + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; if (count < fwu->config_size) { dev_err(rmi4_data->pdev->dev.parent, "%s: Not enough space (%zu bytes) in buffer\n", __func__, count); - return -EINVAL; + retval = -EINVAL; + goto show_image_exit; } memcpy(buf, fwu->read_config_buf, fwu->config_size); - - return fwu->config_size; + retval = fwu->config_size; +show_image_exit: + mutex_unlock(&dsx_fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_store_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) { + ssize_t retval; + + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + if (count > (fwu->image_size - fwu->data_pos)) { dev_err(fwu->rmi4_data->pdev->dev.parent, "%s: Not enough space in buffer\n", __func__); - return -EINVAL; + retval = -EINVAL; + goto exit; + } + + if (!fwu->ext_data_source) { + dev_err(fwu->rmi4_data->pdev->dev.parent, + "%s: Need to set imagesize\n", + __func__); + retval = -EINVAL; + goto exit; } memcpy((void *)(&fwu->ext_data_source[fwu->data_pos]), @@ -1619,16 +1641,21 @@ static ssize_t fwu_sysfs_store_image(struct file *data_file, fwu->data_pos += count; +exit: + mutex_unlock(&dsx_fwu_sysfs_mutex); return count; } static ssize_t fwu_sysfs_force_reflash_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - int retval; + ssize_t retval; unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + if (sscanf(buf, "%u", &input) != 1) { retval = -EINVAL; goto exit; @@ -1657,6 +1684,9 @@ static ssize_t fwu_sysfs_force_reflash_store(struct device *dev, fwu->ext_data_source = NULL; fwu->force_update = FORCE_UPDATE; fwu->do_lockdown = DO_LOCKDOWN; + fwu->data_pos = 0; + fwu->image_size = 0; + mutex_unlock(&dsx_fwu_sysfs_mutex); return retval; } @@ -1667,6 +1697,9 @@ static ssize_t fwu_sysfs_do_reflash_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + if (sscanf(buf, "%u", &input) != 1) { retval = -EINVAL; goto exit; @@ -1700,6 +1733,9 @@ static ssize_t fwu_sysfs_do_reflash_store(struct device *dev, fwu->ext_data_source = NULL; fwu->force_update = FORCE_UPDATE; fwu->do_lockdown = DO_LOCKDOWN; + fwu->data_pos = 0; + fwu->image_size = 0; + mutex_unlock(&dsx_fwu_sysfs_mutex); return retval; } @@ -1710,6 +1746,9 @@ static ssize_t fwu_sysfs_write_config_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + if (sscanf(buf, "%u", &input) != 1) { retval = -EINVAL; goto exit; @@ -1733,6 +1772,9 @@ static ssize_t fwu_sysfs_write_config_store(struct device *dev, exit: kfree(fwu->ext_data_source); fwu->ext_data_source = NULL; + fwu->data_pos = 0; + fwu->image_size = 0; + mutex_unlock(&dsx_fwu_sysfs_mutex); return retval; } @@ -1749,7 +1791,11 @@ static ssize_t fwu_sysfs_read_config_store(struct device *dev, if (input != 1) return -EINVAL; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; retval = fwu_do_read_config(); + mutex_unlock(&dsx_fwu_sysfs_mutex); + if (retval < 0) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to read config\n", @@ -1770,7 +1816,10 @@ static ssize_t fwu_sysfs_config_area_store(struct device *dev, if (retval) return retval; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; fwu->config_area = config_area; + mutex_unlock(&dsx_fwu_sysfs_mutex); return count; } @@ -1778,17 +1827,30 @@ static ssize_t fwu_sysfs_config_area_store(struct device *dev, static ssize_t fwu_sysfs_image_name_show(struct device *dev, struct device_attribute *attr, char *buf) { + ssize_t retval; + + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; if (strnlen(fwu->rmi4_data->fw_name, SYNA_FW_NAME_MAX_LEN) > 0) - return snprintf(buf, PAGE_SIZE, "%s\n", + retval = snprintf(buf, PAGE_SIZE, "%s\n", fwu->rmi4_data->fw_name); else - return snprintf(buf, PAGE_SIZE, "No firmware name given\n"); + retval = snprintf(buf, PAGE_SIZE, "No firmware name given\n"); + mutex_unlock(&dsx_fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_image_name_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - if (sscanf(buf, "%s", fwu->image_name) != 1) + ssize_t retval; + + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + retval = sscanf(buf, "%49s", fwu->image_name); + mutex_unlock(&dsx_fwu_sysfs_mutex); + + if (retval != 1) return -EINVAL; return count; @@ -1801,9 +1863,12 @@ static ssize_t fwu_sysfs_image_size_store(struct device *dev, unsigned long size; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + retval = sstrtoul(buf, 10, &size); if (retval) - return retval; + goto exit; fwu->image_size = size; fwu->data_pos = 0; @@ -1814,10 +1879,14 @@ static ssize_t fwu_sysfs_image_size_store(struct device *dev, dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc mem for image data\n", __func__); - return -ENOMEM; + retval = -ENOMEM; + goto exit; } - return count; + retval = count; +exit: + mutex_unlock(&dsx_fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_block_size_show(struct device *dev, diff --git a/drivers/input/touchscreen/synaptics_fw_update.c b/drivers/input/touchscreen/synaptics_fw_update.c index f4abf16d28374..7d0dd3876890f 100644 --- a/drivers/input/touchscreen/synaptics_fw_update.c +++ b/drivers/input/touchscreen/synaptics_fw_update.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -296,6 +297,7 @@ struct synaptics_rmi4_fwu_handle { static struct synaptics_rmi4_fwu_handle *fwu; DECLARE_COMPLETION(fwu_remove_complete); +DEFINE_MUTEX(fwu_sysfs_mutex); static unsigned int extract_uint(const unsigned char *ptr) { @@ -1680,31 +1682,59 @@ static ssize_t fwu_sysfs_show_image(struct file *data_file, char *buf, loff_t pos, size_t count) { struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + ssize_t retval; + + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; if (count < fwu->config_size) { dev_err(&rmi4_data->i2c_client->dev, "%s: Not enough space (%zu bytes) in buffer\n", __func__, count); - return -EINVAL; + retval = -EINVAL; + goto show_image_exit; } memcpy(buf, fwu->read_config_buf, fwu->config_size); - - return fwu->config_size; + retval = fwu->config_size; +show_image_exit: + mutex_unlock(&fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_store_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) { + ssize_t retval; + + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + if (!fwu->ext_data_source) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "Cannot use this without setting imagesize!\n"); + retval = -EAGAIN; + goto exit; + } + if (count > fwu->image_size - fwu->data_pos) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "%s: Not enough space in buffer\n", + __func__); + + retval = -EINVAL; + goto exit; + } + memcpy((void *)(&fwu->ext_data_source[fwu->data_pos]), (const void *)buf, count); fwu->data_buffer = fwu->ext_data_source; fwu->data_pos += count; - - return count; + retval = count; +exit: + mutex_unlock(&fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_image_name_store(struct device *dev, @@ -1727,18 +1757,29 @@ static ssize_t fwu_sysfs_image_name_store(struct device *dev, return -EINVAL; } + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; strlcpy(rmi4_data->fw_image_name, buf, count); + mutex_unlock(&fwu_sysfs_mutex); + return count; } static ssize_t fwu_sysfs_image_name_show(struct device *dev, struct device_attribute *attr, char *buf) { + ssize_t retval; + + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + if (strnlen(fwu->rmi4_data->fw_image_name, NAME_BUFFER_SIZE) > 0) - return snprintf(buf, PAGE_SIZE, "%s\n", + retval = snprintf(buf, PAGE_SIZE, "%s\n", fwu->rmi4_data->fw_image_name); else - return snprintf(buf, PAGE_SIZE, "No firmware name given\n"); + retval = snprintf(buf, PAGE_SIZE, "No firmware name given\n"); + mutex_unlock(&fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_force_reflash_store(struct device *dev, @@ -1748,6 +1789,9 @@ static ssize_t fwu_sysfs_force_reflash_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + retval = kstrtouint(buf, 10, &input); if (retval) goto exit; @@ -1774,7 +1818,10 @@ static ssize_t fwu_sysfs_force_reflash_store(struct device *dev, kfree(fwu->ext_data_source); fwu->ext_data_source = NULL; fwu->force_update = FORCE_UPDATE; + fwu->image_size = 0; + fwu->data_pos = 0; fwu->do_lockdown = rmi4_data->board->do_lockdown; + mutex_unlock(&fwu_sysfs_mutex); return retval; } @@ -1785,6 +1832,9 @@ static ssize_t fwu_sysfs_do_reflash_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + retval = kstrtouint(buf, 10, &input); if (retval) goto exit; @@ -1815,8 +1865,11 @@ static ssize_t fwu_sysfs_do_reflash_store(struct device *dev, exit: kfree(fwu->ext_data_source); fwu->ext_data_source = NULL; + fwu->image_size = 0; + fwu->data_pos = 0; fwu->force_update = FORCE_UPDATE; fwu->do_lockdown = rmi4_data->board->do_lockdown; + mutex_unlock(&fwu_sysfs_mutex); return retval; } @@ -1827,6 +1880,9 @@ static ssize_t fwu_sysfs_write_lockdown_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + if (sscanf(buf, "%u", &input) != 1) { retval = -EINVAL; goto exit; @@ -1852,6 +1908,9 @@ static ssize_t fwu_sysfs_write_lockdown_store(struct device *dev, fwu->ext_data_source = NULL; fwu->force_update = FORCE_UPDATE; fwu->do_lockdown = rmi4_data->board->do_lockdown; + fwu->image_size = 0; + fwu->data_pos = 0; + mutex_unlock(&fwu_sysfs_mutex); return retval; } @@ -1862,6 +1921,9 @@ static ssize_t fwu_sysfs_write_config_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + retval = kstrtouint(buf, 10, &input); if (retval) goto exit; @@ -1884,6 +1946,9 @@ static ssize_t fwu_sysfs_write_config_store(struct device *dev, exit: kfree(fwu->ext_data_source); fwu->ext_data_source = NULL; + fwu->image_size = 0; + fwu->data_pos = 0; + mutex_unlock(&fwu_sysfs_mutex); return retval; } @@ -1901,7 +1966,11 @@ static ssize_t fwu_sysfs_read_config_store(struct device *dev, if (input != 1) return -EINVAL; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; retval = fwu_do_read_config(); + mutex_unlock(&fwu_sysfs_mutex); + if (retval < 0) { dev_err(&rmi4_data->i2c_client->dev, "%s: Failed to read config\n", @@ -1930,7 +1999,10 @@ static ssize_t fwu_sysfs_config_area_store(struct device *dev, return -EINVAL; } + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; fwu->config_area = config_area; + mutex_unlock(&fwu_sysfs_mutex); return count; } @@ -1945,15 +2017,23 @@ static ssize_t fwu_sysfs_image_size_store(struct device *dev, if (retval) return retval; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + fwu->image_size = size; fwu->data_pos = 0; kfree(fwu->ext_data_source); fwu->ext_data_source = kzalloc(fwu->image_size, GFP_KERNEL); - if (!fwu->ext_data_source) - return -ENOMEM; + if (!fwu->ext_data_source) { + retval = -ENOMEM; + goto exit; + } - return count; + retval = count; +exit: + mutex_unlock(&fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_block_size_show(struct device *dev, @@ -2117,7 +2197,9 @@ static struct device_attribute attrs[] = { static void synaptics_rmi4_fwu_work(struct work_struct *work) { + mutex_lock(&fwu_sysfs_mutex); fwu_start_reflash(); + mutex_unlock(&fwu_sysfs_mutex); } static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) From 5810759fd59a1b16f2192df497983aec6fb66829 Mon Sep 17 00:00:00 2001 From: Santhosh Punugu Date: Thu, 27 Oct 2016 15:12:42 +0530 Subject: [PATCH 0337/1015] msm: kgsl: use seq_file for mem_entry debugfs A process may have many kgsl mem entries in use. Outputing all of them as a single debugfs seq_file record takes twice as long as necessary because seq_file must retry higher order page allocations for the output buffer until it is large enough to hold all mem entries. Additionally, process_mem_print() currently holds the spinlock private->mem_lock during this process. This is too much time to disable interrupts, and prevents locking mutex in print_mem_entry. Change the kgsl_mem_entry debugfs functions to output one entry at a time. Then the seq_file only need to kmalloc one page regardless of the number of kgsl_mem_entries. CRs-Fixed: 1073673 Change-Id: I2907495b65e62d95a892741aed008048bb86aced Signed-off-by: Santhosh Punugu --- drivers/gpu/msm/kgsl_debugfs.c | 80 ++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/msm/kgsl_debugfs.c b/drivers/gpu/msm/kgsl_debugfs.c index 93ac790f3a551..0e28fd42f0ece 100644 --- a/drivers/gpu/msm/kgsl_debugfs.c +++ b/drivers/gpu/msm/kgsl_debugfs.c @@ -125,7 +125,7 @@ static char get_cacheflag(const struct kgsl_memdesc *m) } -static int print_mem_entry(int id, void *ptr, void *data) +static int print_mem_entry(void *data, void *ptr) { struct seq_file *s = data; struct kgsl_mem_entry *entry = ptr; @@ -160,25 +160,83 @@ static int print_mem_entry(int id, void *ptr, void *data) return 0; } -static int process_mem_print(struct seq_file *s, void *unused) +static struct kgsl_mem_entry *process_mem_seq_find(struct seq_file *s, + void *ptr, loff_t pos) { + struct kgsl_mem_entry *entry = ptr; struct kgsl_process_private *private = s->private; + int id = 0; + loff_t temp_pos = 1; - seq_printf(s, "%16s %16s %16s %5s %9s %10s %16s %5s %16s\n", - "gpuaddr", "useraddr", "size", "id", "flags", "type", - "usage", "sglen", "mapsize"); + if (entry != SEQ_START_TOKEN) + id = entry->id + 1; spin_lock(&private->mem_lock); - idr_for_each(&private->mem_idr, print_mem_entry, s); + for (entry = idr_get_next(&private->mem_idr, &id); entry; + id++, entry = idr_get_next(&private->mem_idr, &id), + temp_pos++) { + if (temp_pos == pos && kgsl_mem_entry_get(entry)) { + spin_unlock(&private->mem_lock); + goto found; + } + } spin_unlock(&private->mem_lock); - return 0; + entry = NULL; +found: + if (ptr != SEQ_START_TOKEN) + kgsl_mem_entry_put(ptr); + + return entry; +} + +static void *process_mem_seq_start(struct seq_file *s, loff_t *pos) +{ + loff_t seq_file_offset = *pos; + + if (seq_file_offset == 0) + return SEQ_START_TOKEN; + else + return process_mem_seq_find(s, SEQ_START_TOKEN, + seq_file_offset); +} + +static void process_mem_seq_stop(struct seq_file *s, void *ptr) +{ + if (ptr && ptr != SEQ_START_TOKEN) + kgsl_mem_entry_put(ptr); +} + +static void *process_mem_seq_next(struct seq_file *s, void *ptr, + loff_t *pos) +{ + ++*pos; + return process_mem_seq_find(s, ptr, 1); +} + +static int process_mem_seq_show(struct seq_file *s, void *ptr) +{ + if (ptr == SEQ_START_TOKEN) { + seq_printf(s, "%16s %16s %16s %5s %9s %10s %16s %5s %16s\n", + "gpuaddr", "useraddr", "size", "id", "flags", + "type", "usage", "sglen", "mapsize"); + return 0; + } else + return print_mem_entry(s, ptr); } +static const struct seq_operations process_mem_seq_fops = { + .start = process_mem_seq_start, + .stop = process_mem_seq_stop, + .next = process_mem_seq_next, + .show = process_mem_seq_show, +}; + static int process_mem_open(struct inode *inode, struct file *file) { int ret; pid_t pid = (pid_t) (unsigned long) inode->i_private; + struct seq_file *s = NULL; struct kgsl_process_private *private = NULL; private = kgsl_process_private_find(pid); @@ -186,9 +244,13 @@ static int process_mem_open(struct inode *inode, struct file *file) if (!private) return -ENODEV; - ret = single_open(file, process_mem_print, private); + ret = seq_open(file, &process_mem_seq_fops); if (ret) kgsl_process_private_put(private); + else { + s = file->private_data; + s->private = private; + } return ret; } @@ -201,7 +263,7 @@ static int process_mem_release(struct inode *inode, struct file *file) if (private) kgsl_process_private_put(private); - return single_release(inode, file); + return seq_release(inode, file); } static const struct file_operations process_mem_fops = { From 51fb23a3e1ae5c3a9cf78d541e03098603d91b28 Mon Sep 17 00:00:00 2001 From: Santhosh Punugu Date: Thu, 27 Oct 2016 15:19:57 +0530 Subject: [PATCH 0338/1015] msm: kgsl: add egl_surface/egl_image usage count in debugfs Add more information to the debugfs kgsl/proc//mem which will allow memtrack to correctly assign allocated ion buffer memory to a process. The additional columns show the number of kgsl_mem_entries which have a usage of egl_image (or) egl_surface. When attaching a dma_buf to kgsl, use the dma_buf_attachment's (void*)priv to point back to the kgsl_mem_entry. This makes it possible to iterate through all attachments on a dma_buf and gather statistics from each kgsl_mem_entry associated with the dma_buf. CRs-Fixed: 1073673 Change-Id: I1ef3bd0da3f74fa41074021699b2226c48bde9c3 Signed-off-by: Santhosh Punugu --- drivers/gpu/msm/kgsl.c | 41 ++++++++++++++++++++++++++++++++++ drivers/gpu/msm/kgsl.h | 3 +++ drivers/gpu/msm/kgsl_debugfs.c | 19 +++++++++++----- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index c06a9fdc48920..136eafe5b57d3 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -2434,6 +2434,8 @@ static int kgsl_setup_dma_buf(struct kgsl_device *device, meta->dmabuf = dmabuf; meta->attach = attach; + attach->priv = entry; + entry->priv_data = meta; entry->memdesc.pagetable = pagetable; entry->memdesc.size = 0; @@ -2484,6 +2486,45 @@ static int kgsl_setup_dma_buf(struct kgsl_device *device, } #endif +#ifdef CONFIG_DMA_SHARED_BUFFER +void kgsl_get_egl_counts(struct kgsl_mem_entry *entry, + int *egl_surface_count, int *egl_image_count) +{ + struct kgsl_dma_buf_meta *meta = entry->priv_data; + struct dma_buf *dmabuf = meta->dmabuf; + struct dma_buf_attachment *mem_entry_buf_attachment = meta->attach; + struct device *buf_attachment_dev = mem_entry_buf_attachment->dev; + struct dma_buf_attachment *attachment = NULL; + + mutex_lock(&dmabuf->lock); + list_for_each_entry(attachment, &dmabuf->attachments, node) { + struct kgsl_mem_entry *scan_mem_entry = NULL; + + if (attachment->dev != buf_attachment_dev) + continue; + + scan_mem_entry = attachment->priv; + if (!scan_mem_entry) + continue; + + switch (kgsl_memdesc_get_memtype(&scan_mem_entry->memdesc)) { + case KGSL_MEMTYPE_EGL_SURFACE: + (*egl_surface_count)++; + break; + case KGSL_MEMTYPE_EGL_IMAGE: + (*egl_image_count)++; + break; + } + } + mutex_unlock(&dmabuf->lock); +} +#else +void kgsl_get_egl_counts(struct kgsl_mem_entry *entry, + int *egl_surface_count, int *egl_image_count) +{ +} +#endif + long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data) { diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index 4c46af637f63c..367a5b79ec370 100644 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -379,6 +379,9 @@ long kgsl_ioctl_gpuobj_set_info(struct kgsl_device_private *dev_priv, void kgsl_mem_entry_destroy(struct kref *kref); +void kgsl_get_egl_counts(struct kgsl_mem_entry *entry, + int *egl_surface_count, int *egl_image_count); + struct kgsl_mem_entry * __must_check kgsl_sharedmem_find(struct kgsl_process_private *private, uint64_t gpuaddr); diff --git a/drivers/gpu/msm/kgsl_debugfs.c b/drivers/gpu/msm/kgsl_debugfs.c index 0e28fd42f0ece..4fada8edc1e5f 100644 --- a/drivers/gpu/msm/kgsl_debugfs.c +++ b/drivers/gpu/msm/kgsl_debugfs.c @@ -132,6 +132,8 @@ static int print_mem_entry(void *data, void *ptr) char flags[9]; char usage[16]; struct kgsl_memdesc *m = &entry->memdesc; + unsigned int usermem_type = kgsl_memdesc_usermem_type(m); + int egl_surface_count = 0, egl_image_count = 0; flags[0] = kgsl_memdesc_is_global(m) ? 'g' : '-'; flags[1] = '-'; @@ -145,12 +147,17 @@ static int print_mem_entry(void *data, void *ptr) kgsl_get_memory_usage(usage, sizeof(usage), m->flags); - seq_printf(s, "%pK %pK %16llu %5d %9s %10s %16s %5d %16llu", + if (usermem_type == KGSL_MEM_ENTRY_ION) + kgsl_get_egl_counts(entry, &egl_surface_count, + &egl_image_count); + + seq_printf(s, "%pK %pK %16llu %5d %9s %10s %16s %5d %16llu %6d %6d", (uint64_t *)(uintptr_t) m->gpuaddr, (unsigned long *) m->useraddr, m->size, entry->id, flags, - memtype_str(kgsl_memdesc_usermem_type(m)), - usage, (m->sgt ? m->sgt->nents : 0), m->mapsize); + memtype_str(usermem_type), + usage, (m->sgt ? m->sgt->nents : 0), m->mapsize, + egl_surface_count, egl_image_count); if (entry->metadata[0] != 0) seq_printf(s, " %s", entry->metadata); @@ -217,9 +224,9 @@ static void *process_mem_seq_next(struct seq_file *s, void *ptr, static int process_mem_seq_show(struct seq_file *s, void *ptr) { if (ptr == SEQ_START_TOKEN) { - seq_printf(s, "%16s %16s %16s %5s %9s %10s %16s %5s %16s\n", - "gpuaddr", "useraddr", "size", "id", "flags", - "type", "usage", "sglen", "mapsize"); + seq_printf(s, "%16s %16s %16s %5s %9s %10s %16s %5s %16s %6s %6s\n", + "gpuaddr", "useraddr", "size", "id", "flags", "type", + "usage", "sglen", "mapsize", "eglsrf", "eglimg"); return 0; } else return print_mem_entry(s, ptr); From 07fbf468f21b351f2e4088219001327385a3a84f Mon Sep 17 00:00:00 2001 From: chengengjia Date: Wed, 10 Aug 2016 17:34:43 +0800 Subject: [PATCH 0339/1015] input: synaptics: Add checks of user input data Add checks of the user input count to avoid possible heap overflow Bug: 30799828 Change-Id: I896492b18c4ace6565fb9edd5cbf51f363ce157b Signed-off-by: chengengjia Signed-off-by: Andrew Chant Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: f549796fb9da58586c5cfc31d07b243c87dcfbd5 Signed-off-by: Dennis Cagle Signed-off-by: Naveen Kumar From 43346e87870038e11c6145bdadd0596447e8a574 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Fri, 4 Nov 2016 17:35:19 -0700 Subject: [PATCH 0340/1015] qseecom: remove entry from qseecom_registered_app_list In an error handling case, the QSEECOM_IOCTL_LOAD_APP_REQ ioctl freed the entry for new TA, but didn't removed it from qseecom_registered_app_list. Make change to remove it. Change-Id: Id681fbf3c923027d3db875d506cbe3f971919a8d Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 661824b9766f3..ecc4a4abf1fed 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -2068,6 +2068,7 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) struct qseecom_load_app_64bit_ireq load_req_64bit; void *cmd_buf = NULL; size_t cmd_len; + bool first_time = false; /* Copy the relevant information needed for loading the image */ if (copy_from_user(&load_img_req, @@ -2139,6 +2140,7 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) &qseecom.registered_app_list_lock, flags); ret = 0; } else { + first_time = true; pr_warn("App (%s) does'nt exist, loading apps for first time\n", (char *)(load_img_req.img_name)); /* Get the handle of the shared fd */ @@ -2270,8 +2272,15 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) load_img_req.app_id = app_id; if (copy_to_user(argp, &load_img_req, sizeof(load_img_req))) { pr_err("copy_to_user failed\n"); - kzfree(entry); ret = -EFAULT; + if (first_time == true) { + spin_lock_irqsave( + &qseecom.registered_app_list_lock, flags); + list_del(&entry->list); + spin_unlock_irqrestore( + &qseecom.registered_app_list_lock, flags); + kzfree(entry); + } } loadapp_err: From b5074986d0352b6572d132933bc5f31c6fac0601 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Mon, 31 Oct 2016 15:23:19 -0700 Subject: [PATCH 0341/1015] msm: crypto: fix issues on digest buf and copy_from_user in qcedev.c Make the digest length not larger than the size of the buffer qcedev_areq.sha_op_req.digest; and use the checked variants of the copy_from/to_user() APIs to avoid small race window of their unchecked variants. Change-Id: I3db0c20ac5fa47ed278f3d60368c406f472430c1 Signed-off-by: Zhen Kong --- drivers/crypto/msm/qcedev.c | 120 ++++++++---------------------------- 1 file changed, 27 insertions(+), 93 deletions(-) diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index 1402d3ded9843..433e4783d1d1b 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -603,7 +603,7 @@ static int qcedev_sha_update_max_xfer(struct qcedev_async_req *qcedev_areq, while (len > 0) { user_src = (void __user *)qcedev_areq->sha_op_req.data[i].vaddr; - if (user_src && __copy_from_user(k_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[i].len)) return -EFAULT; @@ -639,7 +639,7 @@ static int qcedev_sha_update_max_xfer(struct qcedev_async_req *qcedev_areq, /* Copy data from user src(s) */ user_src = (void __user *)qcedev_areq->sha_op_req.data[0].vaddr; - if (user_src && __copy_from_user(k_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[0].len)) { kzfree(k_buf_src); @@ -648,7 +648,7 @@ static int qcedev_sha_update_max_xfer(struct qcedev_async_req *qcedev_areq, k_src += qcedev_areq->sha_op_req.data[0].len; for (i = 1; i < qcedev_areq->sha_op_req.entries; i++) { user_src = (void __user *)qcedev_areq->sha_op_req.data[i].vaddr; - if (user_src && __copy_from_user(k_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[i].len)) { kzfree(k_buf_src); @@ -702,13 +702,6 @@ static int qcedev_sha_update(struct qcedev_async_req *qcedev_areq, return -EINVAL; } - /* verify address src(s) */ - for (i = 0; i < qcedev_areq->sha_op_req.entries; i++) - if (!access_ok(VERIFY_READ, - (void __user *)qcedev_areq->sha_op_req.data[i].vaddr, - qcedev_areq->sha_op_req.data[i].len)) - return -EFAULT; - if (qcedev_areq->sha_op_req.data_len > QCE_MAX_OPER_DATA) { struct qcedev_sha_op_req *saved_req; @@ -868,19 +861,7 @@ static int qcedev_hash_cmac(struct qcedev_async_req *qcedev_areq, total = qcedev_areq->sha_op_req.data_len; - /* verify address src(s) */ - for (i = 0; i < qcedev_areq->sha_op_req.entries; i++) - if (!access_ok(VERIFY_READ, - (void __user *)qcedev_areq->sha_op_req.data[i].vaddr, - qcedev_areq->sha_op_req.data[i].len)) - return -EFAULT; - - /* Verify Source Address */ - if (!access_ok(VERIFY_READ, - (void __user *)qcedev_areq->sha_op_req.authkey, - qcedev_areq->sha_op_req.authklen)) - return -EFAULT; - if (__copy_from_user(&handle->sha_ctxt.authkey[0], + if (copy_from_user(&handle->sha_ctxt.authkey[0], (void __user *)qcedev_areq->sha_op_req.authkey, qcedev_areq->sha_op_req.authklen)) return -EFAULT; @@ -900,7 +881,7 @@ static int qcedev_hash_cmac(struct qcedev_async_req *qcedev_areq, for (i = 0; i < qcedev_areq->sha_op_req.entries; i++) { user_src = (void __user *)qcedev_areq->sha_op_req.data[i].vaddr; - if (user_src && __copy_from_user(k_src, (void __user *)user_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[i].len)) { kzfree(k_buf_src); return -EFAULT; @@ -928,12 +909,7 @@ static int qcedev_set_hmac_auth_key(struct qcedev_async_req *areq, if (areq->sha_op_req.authklen <= QCEDEV_MAX_KEY_SIZE) { qcedev_sha_init(areq, handle); - /* Verify Source Address */ - if (!access_ok(VERIFY_READ, - (void __user *)areq->sha_op_req.authkey, - areq->sha_op_req.authklen)) - return -EFAULT; - if (__copy_from_user(&handle->sha_ctxt.authkey[0], + if (copy_from_user(&handle->sha_ctxt.authkey[0], (void __user *)areq->sha_op_req.authkey, areq->sha_op_req.authklen)) return -EFAULT; @@ -1146,7 +1122,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, byteoffset = areq->cipher_op_req.byteoffset; user_src = (void __user *)areq->cipher_op_req.vbuf.src[0].vaddr; - if (user_src && __copy_from_user((k_align_src + byteoffset), + if (user_src && copy_from_user((k_align_src + byteoffset), (void __user *)user_src, areq->cipher_op_req.vbuf.src[0].len)) return -EFAULT; @@ -1156,7 +1132,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, for (i = 1; i < areq->cipher_op_req.entries; i++) { user_src = (void __user *)areq->cipher_op_req.vbuf.src[i].vaddr; - if (user_src && __copy_from_user(k_align_src, + if (user_src && copy_from_user(k_align_src, (void __user *)user_src, areq->cipher_op_req.vbuf.src[i].len)) { return -EFAULT; @@ -1188,7 +1164,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, while (creq->data_len > 0) { if (creq->vbuf.dst[dst_i].len <= creq->data_len) { - if (err == 0 && __copy_to_user( + if (err == 0 && copy_to_user( (void __user *)creq->vbuf.dst[dst_i].vaddr, (k_align_dst + byteoffset), creq->vbuf.dst[dst_i].len)) @@ -1199,7 +1175,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, creq->data_len -= creq->vbuf.dst[dst_i].len; dst_i++; } else { - if (err == 0 && __copy_to_user( + if (err == 0 && copy_to_user( (void __user *)creq->vbuf.dst[dst_i].vaddr, (k_align_dst + byteoffset), creq->data_len)) @@ -1531,36 +1507,6 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, __func__, total, req->data_len); goto error; } - /* Verify Source Address's */ - for (i = 0, total = 0; i < req->entries; i++) { - if (total < req->data_len) { - if (!access_ok(VERIFY_READ, - (void __user *)req->vbuf.src[i].vaddr, - req->vbuf.src[i].len)) { - pr_err("%s:SRC RD_VERIFY err %d=0x%lx\n", - __func__, i, (uintptr_t) - req->vbuf.src[i].vaddr); - goto error; - } - total += req->vbuf.src[i].len; - } - } - - /* Verify Destination Address's */ - for (i = 0, total = 0; i < QCEDEV_MAX_BUFFERS; i++) { - if ((req->vbuf.dst[i].vaddr != 0) && - (total < req->data_len)) { - if (!access_ok(VERIFY_WRITE, - (void __user *)req->vbuf.dst[i].vaddr, - req->vbuf.dst[i].len)) { - pr_err("%s:DST WR_VERIFY err %d=0x%lx\n", - __func__, i, (uintptr_t) - req->vbuf.dst[i].vaddr); - goto error; - } - total += req->vbuf.dst[i].len; - } - } return 0; error: return -EINVAL; @@ -1656,11 +1602,7 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) switch (cmd) { case QCEDEV_IOCTL_ENC_REQ: case QCEDEV_IOCTL_DEC_REQ: - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_cipher_op_req))) - return -EFAULT; - - if (__copy_from_user(&qcedev_areq.cipher_op_req, + if (copy_from_user(&qcedev_areq.cipher_op_req, (void __user *)arg, sizeof(struct qcedev_cipher_op_req))) return -EFAULT; @@ -1673,20 +1615,17 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) err = qcedev_vbuf_ablk_cipher(&qcedev_areq, handle); if (err) return err; - if (__copy_to_user((void __user *)arg, + if (copy_to_user((void __user *)arg, &qcedev_areq.cipher_op_req, sizeof(struct qcedev_cipher_op_req))) - return -EFAULT; + return -EFAULT; break; case QCEDEV_IOCTL_SHA_INIT_REQ: { struct scatterlist sg_src; - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1696,9 +1635,9 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) err = qcedev_hash_init(&qcedev_areq, handle, &sg_src); if (err) return err; - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) - return -EFAULT; + return -EFAULT; } handle->sha_ctxt.init_done = true; break; @@ -1708,11 +1647,8 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) case QCEDEV_IOCTL_SHA_UPDATE_REQ: { struct scatterlist sg_src; - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1734,10 +1670,15 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) return err; } + if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { + pr_err("Invalid sha_ctxt.diglen %d\n", + handle->sha_ctxt.diglen); + return -EINVAL; + } memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; } @@ -1749,11 +1690,7 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) pr_err("%s Init was not called\n", __func__); return -EINVAL; } - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1767,7 +1704,7 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; handle->sha_ctxt.init_done = false; @@ -1776,11 +1713,8 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) case QCEDEV_IOCTL_GET_SHA_REQ: { struct scatterlist sg_src; - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1798,7 +1732,7 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; } From ab87959261461e3e30222a76042cd31414d96cd1 Mon Sep 17 00:00:00 2001 From: Swetha Chikkaboraiah Date: Wed, 2 Nov 2016 16:49:41 +0530 Subject: [PATCH 0342/1015] qcom: scm: remove printing input arguments scm_call2 is printing the input arguments if TZ ret value is < 0 leading to information leak. Remove printing input arguments. Change-Id: I21dd6d83fa979aed2c79ebb2c9c8de63a247dded CRs-Fixed: 1076407 Signed-off-by: Swetha Chikkaboraiah Signed-off-by: Paresh Purabhiya --- drivers/soc/qcom/scm.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/drivers/soc/qcom/scm.c b/drivers/soc/qcom/scm.c index 16115619b9db5..f958d98ec9720 100644 --- a/drivers/soc/qcom/scm.c +++ b/drivers/soc/qcom/scm.c @@ -662,10 +662,6 @@ int scm_call2(u32 fn_id, struct scm_desc *desc) desc->ret[0] = desc->ret[1] = desc->ret[2] = 0; - pr_debug("scm_call: func id %#llx, args: %#x, %#llx, %#llx, %#llx, %#llx\n", - x0, desc->arginfo, desc->args[0], desc->args[1], - desc->args[2], desc->x5); - trace_scm_call_start(x0, desc); if (scm_version == SCM_ARMV8_64) @@ -695,10 +691,8 @@ int scm_call2(u32 fn_id, struct scm_desc *desc) } while (ret == SCM_V2_EBUSY && (retry_count++ < SCM_EBUSY_MAX_RETRY)); if (ret < 0) - pr_err("scm_call failed: func id %#llx, arginfo: %#x, args: %#llx, %#llx, %#llx, %#llx, ret: %d, syscall returns: %#llx, %#llx, %#llx\n", - x0, desc->arginfo, desc->args[0], desc->args[1], - desc->args[2], desc->x5, ret, desc->ret[0], - desc->ret[1], desc->ret[2]); + pr_err("scm_call failed: func id %#llx, ret: %d, syscall returns: %#llx, %#llx, %#llx\n", + x0, ret, desc->ret[0], desc->ret[1], desc->ret[2]); if (arglen > N_REGISTER_ARGS) kfree(desc->extra_arg_buf); From b79afbf107ae3230b45e7c1d7b48944b1a09ca04 Mon Sep 17 00:00:00 2001 From: Min Chong Date: Fri, 2 Sep 2016 11:36:37 -0700 Subject: [PATCH 0343/1015] input: synaptics_dsx: add checks of user input data Add checks of the user input count to avoid possible heap overflow Signed-off-by: Min Chong Bug: 30937462 Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: a6accafb252a76256f11c83e28c556c8ca4b8e1f Change-Id: I6fc8323cbcf395a2c24e49e65cc7012709d031a2 Signed-off-by: Dennis Cagle --- .../touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c index 2282fe005bc7e..f001706236ab0 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c @@ -1606,6 +1606,13 @@ static ssize_t fwu_sysfs_store_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) { + if (count > (fwu->image_size - fwu->data_pos)) { + dev_err(fwu->rmi4_data->pdev->dev.parent, + "%s: Not enough space in buffer\n", + __func__); + return -EINVAL; + } + memcpy((void *)(&fwu->ext_data_source[fwu->data_pos]), (const void *)buf, count); From b31576405e4887949809e66ef91cdf0b6eae4ec7 Mon Sep 17 00:00:00 2001 From: Chandana Kishori Chiluveru Date: Tue, 22 Nov 2016 12:13:16 +0530 Subject: [PATCH 0344/1015] USB: gadget: Enable BAM mode only for BAM2BAM transport commit ea3e4e39f6c9 ("usb: gadget: Enable/Disable USB_BAM based on composition") enabling USB_BAM irrespective of the transport used in the driver. Only USB_GADGET_XPORT_BAM2BAM transport was used for BAM mode. With this change other transports which does not use BAM also enabling BAM and calling flush_work in function unbind causing null pointer dereference crash. Hence fix this by adding transport check for enabling USB_BAM using bam2bam_func_enabled flag. Change-Id: Ib2b19e5e9276f2e89d054edda536b590f751cba7 Signed-off-by: Chandana Kishori Chiluveru --- drivers/usb/gadget/function/f_rmnet.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/usb/gadget/function/f_rmnet.c b/drivers/usb/gadget/function/f_rmnet.c index d282d55c91619..3a26cc2b4632e 100644 --- a/drivers/usb/gadget/function/f_rmnet.c +++ b/drivers/usb/gadget/function/f_rmnet.c @@ -553,6 +553,7 @@ static int gport_rmnet_disconnect(struct f_rmnet *dev) static void frmnet_unbind(struct usb_configuration *c, struct usb_function *f) { struct f_rmnet *dev = func_to_rmnet(f); + enum transport_type dxport = rmnet_ports[dev->port_num].data_xport; pr_debug("%s: portno:%d\n", __func__, dev->port_num); if (gadget_is_superspeed(c->cdev->gadget)) @@ -562,8 +563,10 @@ static void frmnet_unbind(struct usb_configuration *c, struct usb_function *f) usb_free_descriptors(f->fs_descriptors); frmnet_free_req(dev->notify, dev->notify_req); - gbam_data_flush_workqueue(); - c->cdev->gadget->bam2bam_func_enabled = false; + if (dxport == USB_GADGET_XPORT_BAM2BAM_IPA) { + gbam_data_flush_workqueue(); + c->cdev->gadget->bam2bam_func_enabled = false; + } kfree(f->name); } @@ -1319,7 +1322,9 @@ static int frmnet_bind_config(struct usb_configuration *c, unsigned portno) kfree(f->name); return status; } - c->cdev->gadget->bam2bam_func_enabled = true; + if (rmnet_ports[portno].data_xport == + USB_GADGET_XPORT_BAM2BAM_IPA) + c->cdev->gadget->bam2bam_func_enabled = true; pr_debug("%s: complete\n", __func__); From 1df418963b1c9edb29964bb11240cb6dbe2eb5f7 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Mon, 17 Oct 2016 16:10:11 +0530 Subject: [PATCH 0345/1015] msm: rndis_ipa: fix to debug file system init failure Do not consider debug file system init failure as functional failure. Modify the code to proceed further driver initialization. Change-Id: I821af8970b6c2ced55d6464b8a7b56a458fa7d79 Acked-by: Javid Mohammed Signed-off-by: Utkarsh Saxena --- drivers/net/ethernet/msm/ecm_ipa.c | 27 ++++++++++++++++----------- drivers/net/ethernet/msm/rndis_ipa.c | 25 +++++++++++++++---------- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/drivers/net/ethernet/msm/ecm_ipa.c b/drivers/net/ethernet/msm/ecm_ipa.c index c7c4da22139df..77490c3920c58 100644 --- a/drivers/net/ethernet/msm/ecm_ipa.c +++ b/drivers/net/ethernet/msm/ecm_ipa.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -188,7 +188,7 @@ static ssize_t ecm_ipa_debugfs_enable_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos); static ssize_t ecm_ipa_debugfs_atomic_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos); -static int ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx); +static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx); static void ecm_ipa_debugfs_destroy(struct ecm_ipa_dev *ecm_ipa_ctx); static int ecm_ipa_ep_registers_cfg(u32 usb_to_ipa_hdl, u32 ipa_to_usb_hdl); static int ecm_ipa_ep_registers_dma_cfg(u32 usb_to_ipa_hdl, @@ -301,10 +301,7 @@ int ecm_ipa_init(struct ecm_ipa_params *params) ECM_IPA_DEBUG("device_ready_notify() was not supplied"); ecm_ipa_ctx->device_ready_notify = params->device_ready_notify; - result = ecm_ipa_debugfs_init(ecm_ipa_ctx); - if (result) - goto fail_debugfs; - ECM_IPA_DEBUG("debugfs entries were created\n"); + ecm_ipa_debugfs_init(ecm_ipa_ctx); result = ecm_ipa_set_device_ethernet_addr(net->dev_addr, params->device_ethaddr); @@ -353,7 +350,6 @@ int ecm_ipa_init(struct ecm_ipa_params *params) fail_set_device_ethernet: fail_rules_cfg: ecm_ipa_debugfs_destroy(ecm_ipa_ctx); -fail_debugfs: fail_netdev_priv: free_netdev(net); fail_alloc_etherdev: @@ -1389,8 +1385,9 @@ static ssize_t ecm_ipa_debugfs_atomic_read(struct file *file, return simple_read_from_buffer(ubuf, count, ppos, atomic_str, nbytes); } +#ifdef CONFIG_DEBUG_FS -static int ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) +static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) { const mode_t flags_read_write = S_IRUGO | S_IWUGO; const mode_t flags_read_only = S_IRUGO; @@ -1400,7 +1397,7 @@ static int ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) ECM_IPA_LOG_ENTRY(); if (!ecm_ipa_ctx) - return -EINVAL; + return; ecm_ipa_ctx->directory = debugfs_create_dir("ecm_ipa", NULL); if (!ecm_ipa_ctx->directory) { @@ -1460,13 +1457,14 @@ static int ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) goto fail_file; } + ECM_IPA_DEBUG("debugfs entries were created\n"); ECM_IPA_LOG_EXIT(); - return 0; + return; fail_file: debugfs_remove_recursive(ecm_ipa_ctx->directory); fail_directory: - return -EFAULT; + return; } static void ecm_ipa_debugfs_destroy(struct ecm_ipa_dev *ecm_ipa_ctx) @@ -1474,6 +1472,13 @@ static void ecm_ipa_debugfs_destroy(struct ecm_ipa_dev *ecm_ipa_ctx) debugfs_remove_recursive(ecm_ipa_ctx->directory); } +#else /* !CONFIG_DEBUG_FS*/ + +static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) {} + +static void ecm_ipa_debugfs_destroy(struct ecm_ipa_dev *ecm_ipa_ctx) {} + +#endif /* CONFIG_DEBUG_FS */ /** * ecm_ipa_ep_cfg() - configure the USB endpoints for ECM * diff --git a/drivers/net/ethernet/msm/rndis_ipa.c b/drivers/net/ethernet/msm/rndis_ipa.c index 3e0b83f8ddaa6..e41169371df48 100644 --- a/drivers/net/ethernet/msm/rndis_ipa.c +++ b/drivers/net/ethernet/msm/rndis_ipa.c @@ -307,7 +307,7 @@ static ssize_t rndis_ipa_debugfs_loopback_read(struct file *file, static ssize_t rndis_ipa_debugfs_atomic_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos); static void rndis_ipa_dump_skb(struct sk_buff *skb); -static int rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx); +static void rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx); static void rndis_ipa_debugfs_destroy(struct rndis_ipa_dev *rndis_ipa_ctx); static int rndis_ipa_ep_registers_cfg(u32 usb_to_ipa_hdl, u32 ipa_to_usb_hdl, u32 max_xfer_size_bytes_to_dev, @@ -602,10 +602,7 @@ int rndis_ipa_init(struct ipa_usb_init_params *params) RNDIS_IPA_DEBUG("Needed headroom for RNDIS header set to %d\n", net->needed_headroom); - result = rndis_ipa_debugfs_init(rndis_ipa_ctx); - if (result) - goto fail_debugfs; - RNDIS_IPA_DEBUG("debugfs entries were created\n"); + rndis_ipa_debugfs_init(rndis_ipa_ctx); result = rndis_ipa_set_device_ethernet_addr(net->dev_addr, rndis_ipa_ctx->device_ethaddr); @@ -662,7 +659,6 @@ int rndis_ipa_init(struct ipa_usb_init_params *params) fail_set_device_ethernet: fail_hdrs_cfg: rndis_ipa_debugfs_destroy(rndis_ipa_ctx); -fail_debugfs: fail_netdev_priv: free_netdev(net); fail_alloc_etherdev: @@ -2182,10 +2178,11 @@ static void rndis_ipa_dump_skb(struct sk_buff *skb) skb->len); } +#ifdef CONFIG_DEBUG_FS /** * Creates the root folder for the driver */ -static int rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) +static void rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) { const mode_t flags_read_write = S_IRUGO | S_IWUGO; const mode_t flags_read_only = S_IRUGO; @@ -2196,7 +2193,7 @@ static int rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) RNDIS_IPA_LOG_ENTRY(); if (!rndis_ipa_ctx) - return -EINVAL; + return; rndis_ipa_ctx->directory = debugfs_create_dir(DEBUGFS_DIR_NAME, NULL); if (!rndis_ipa_ctx->directory) { @@ -2378,13 +2375,14 @@ static int rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) goto fail_file; } + RNDIS_IPA_DEBUG("debugfs entries were created\n"); RNDIS_IPA_LOG_EXIT(); - return 0; + return; fail_file: debugfs_remove_recursive(rndis_ipa_ctx->directory); fail_directory: - return -EFAULT; + return; } static void rndis_ipa_debugfs_destroy(struct rndis_ipa_dev *rndis_ipa_ctx) @@ -2392,6 +2390,13 @@ static void rndis_ipa_debugfs_destroy(struct rndis_ipa_dev *rndis_ipa_ctx) debugfs_remove_recursive(rndis_ipa_ctx->directory); } +#else /* !CONFIG_DEBUG_FS */ + +static void rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) {} + +static void rndis_ipa_debugfs_destroy(struct rndis_ipa_dev *rndis_ipa_ctx) {} + +#endif /* CONFIG_DEBUG_FS*/ static int rndis_ipa_debugfs_aggr_open(struct inode *inode, struct file *file) From cb5cdfe9278885710242adb0c7719bf020286330 Mon Sep 17 00:00:00 2001 From: Umesh Pandey Date: Tue, 16 Aug 2016 19:17:29 -0700 Subject: [PATCH 0346/1015] msm: vidc: Add Colorspace in sequence change event For HDR playback, the userspace needs info on the colorspace info for DPB decision. Venus firmware sends a color space info to the driver with the port settings changed event, which is triggered as an insufficient event to userpace if colorspace changes. CRs-Fixed: 1081102 Change-Id: I9665dfc1c52d77dc8953042101d726e7f7ba1807 Signed-off-by: Umesh Pandey --- .../platform/msm/vidc/hfi_response_handler.c | 13 +++++++++++++ drivers/media/platform/msm/vidc/msm_vidc.c | 1 + .../media/platform/msm/vidc/msm_vidc_common.c | 17 +++++++++++++++-- .../media/platform/msm/vidc/msm_vidc_internal.h | 1 + drivers/media/platform/msm/vidc/vidc_hfi_api.h | 1 + .../media/platform/msm/vidc/vidc_hfi_helper.h | 6 ++++++ include/uapi/linux/videodev2.h | 1 + 7 files changed, 38 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/vidc/hfi_response_handler.c b/drivers/media/platform/msm/vidc/hfi_response_handler.c index b4bcf2a614351..a3063818ef99b 100644 --- a/drivers/media/platform/msm/vidc/hfi_response_handler.c +++ b/drivers/media/platform/msm/vidc/hfi_response_handler.c @@ -112,6 +112,7 @@ static int hfi_process_sess_evt_seq_changed(u32 device_id, u8 *data_ptr; int prop_id; enum msm_vidc_pixel_depth luma_bit_depth, chroma_bit_depth; + struct hfi_colour_space *colour_info; if (sizeof(struct hfi_msg_event_notify_packet) > pkt->size) { dprintk(VIDC_ERR, @@ -205,6 +206,18 @@ static int hfi_process_sess_evt_seq_changed(u32 device_id, data_ptr += sizeof(struct hfi_pic_struct); break; + case HFI_PROPERTY_PARAM_VDEC_COLOUR_SPACE: + data_ptr = data_ptr + sizeof(u32); + colour_info = + (struct hfi_colour_space *) data_ptr; + event_notify.colour_space = + colour_info->colour_space; + dprintk(VIDC_DBG, + "Colour space value is: %d\n", + colour_info->colour_space); + data_ptr += + sizeof(struct hfi_colour_space); + break; default: dprintk(VIDC_ERR, "%s cmd: %#x not supported\n", diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c index 0cab4cc3ef11c..773312d86f370 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_vidc.c @@ -1186,6 +1186,7 @@ void *msm_vidc_open(int core_id, int session_type) inst->bit_depth = MSM_VIDC_BIT_DEPTH_8; inst->instant_bitrate = 0; inst->pic_struct = MSM_VIDC_PIC_STRUCT_PROGRESSIVE; + inst->colour_space = MSM_VIDC_BT601_6_525; for (i = SESSION_MSG_INDEX(SESSION_MSG_START); i <= SESSION_MSG_INDEX(SESSION_MSG_END); i++) { diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c index fb1851a239a2e..405b285119e37 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_common.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c @@ -1194,12 +1194,14 @@ static void handle_event_change(enum hal_command_response cmd, void *data) * ptr[2] = flag to indicate bit depth or/and pic struct changed * ptr[3] = bit depth * ptr[4] = pic struct (progressive or interlaced) + * ptr[5] = colour space */ ptr = (u32 *)seq_changed_event.u.data; ptr[2] = 0x0; ptr[3] = inst->bit_depth; ptr[4] = inst->pic_struct; + ptr[5] = inst->colour_space; if (inst->bit_depth != event_notify->bit_depth) { inst->bit_depth = event_notify->bit_depth; @@ -1207,7 +1209,7 @@ static void handle_event_change(enum hal_command_response cmd, void *data) ptr[3] = inst->bit_depth; event = V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT; dprintk(VIDC_DBG, - "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to bit-depth change\n"); + "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to bit-depth change\n"); } if (inst->fmts[CAPTURE_PORT]->fourcc == V4L2_PIX_FMT_NV12 && @@ -1217,7 +1219,18 @@ static void handle_event_change(enum hal_command_response cmd, void *data) ptr[2] |= V4L2_EVENT_PICSTRUCT_FLAG; ptr[4] = inst->pic_struct; dprintk(VIDC_DBG, - "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to pic-struct change\n"); + "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to pic-struct change\n"); + } + + if (inst->bit_depth == MSM_VIDC_BIT_DEPTH_10 + && inst->colour_space != + event_notify->colour_space) { + inst->colour_space = event_notify->colour_space; + event = V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT; + ptr[2] |= V4L2_EVENT_COLOUR_SPACE_FLAG; + ptr[5] = inst->colour_space; + dprintk(VIDC_DBG, + "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to colour space change\n"); } if (event == V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT) { diff --git a/drivers/media/platform/msm/vidc/msm_vidc_internal.h b/drivers/media/platform/msm/vidc/msm_vidc_internal.h index f83234ccfec4b..06106c8f85fbf 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_internal.h +++ b/drivers/media/platform/msm/vidc/msm_vidc_internal.h @@ -292,6 +292,7 @@ struct msm_vidc_inst { u32 buffers_held_in_driver; atomic_t in_flush; u32 pic_struct; + u32 colour_space; }; extern struct msm_vidc_drv *vidc_driver; diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_api.h b/drivers/media/platform/msm/vidc/vidc_hfi_api.h index b272ca4d99948..e2e47b9d6412e 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_api.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_api.h @@ -1365,6 +1365,7 @@ struct msm_vidc_cb_event { ion_phys_addr_t packet_buffer; ion_phys_addr_t extra_data_buffer; u32 pic_struct; + u32 colour_space; }; struct msm_vidc_cb_data_done { diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h index 6210dc4dc9f5c..bb9958b0a819a 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h @@ -293,6 +293,8 @@ struct hfi_buffer_info { (HFI_PROPERTY_PARAM_VDEC_COMMON_START + 0x007) #define HFI_PROPERTY_PARAM_VDEC_PIC_STRUCT \ (HFI_PROPERTY_PARAM_VDEC_COMMON_START + 0x009) +#define HFI_PROPERTY_PARAM_VDEC_COLOUR_SPACE \ + (HFI_PROPERTY_PARAM_VDEC_COMMON_START + 0x00A) #define HFI_PROPERTY_CONFIG_VDEC_COMMON_START \ @@ -437,6 +439,10 @@ struct hfi_bitrate { u32 layer_id; }; +struct hfi_colour_space { + u32 colour_space; +}; + #define HFI_CAPABILITY_FRAME_WIDTH (HFI_COMMON_BASE + 0x1) #define HFI_CAPABILITY_FRAME_HEIGHT (HFI_COMMON_BASE + 0x2) #define HFI_CAPABILITY_MBS_PER_FRAME (HFI_COMMON_BASE + 0x3) diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index d2cf8c2973d37..b9e7193a15e29 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -1902,6 +1902,7 @@ struct v4l2_streamparm { #define V4L2_EVENT_BITDEPTH_FLAG 0x1 #define V4L2_EVENT_PICSTRUCT_FLAG 0x2 +#define V4L2_EVENT_COLOUR_SPACE_FLAG 0x4 #define V4L2_EVENT_MSM_VIDC_START (V4L2_EVENT_PRIVATE_START + 0x00001000) #define V4L2_EVENT_MSM_VIDC_FLUSH_DONE (V4L2_EVENT_MSM_VIDC_START + 1) From a896bb8f32f18544e7a40e77dc998473c5248ace Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 7 Mar 2016 14:46:31 -0800 Subject: [PATCH 0347/1015] sound: usb: Add helper APIs to enable audio stream Adding helper API to find usb substream context information using card number, pcm device number and direction. This usb substream is used to enable/disable by issuing SET_ALT command to device. Also add disconnect call back to perform any clean up required. Change-Id: I252f5171bd94b5ab096eb1a2f053f29a8c049c3b Signed-off-by: Hemant Kumar --- sound/usb/card.c | 67 ++++++++++++++++++++++++++++++++++++++++++++ sound/usb/card.h | 4 +++ sound/usb/pcm.c | 58 ++++++++++++++++++++++++++++++++++++++ sound/usb/pcm.h | 3 +- sound/usb/usbaudio.h | 2 ++ 5 files changed, 133 insertions(+), 1 deletion(-) diff --git a/sound/usb/card.c b/sound/usb/card.c index 63868d36b3de5..a3c386b00cfcf 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -110,6 +110,71 @@ static DEFINE_MUTEX(register_mutex); static struct snd_usb_audio *usb_chip[SNDRV_CARDS]; static struct usb_driver usb_audio_driver; +struct snd_usb_substream *find_snd_usb_substream(unsigned int card_num, + unsigned int pcm_idx, unsigned int direction, struct snd_usb_audio + **uchip, void (*disconnect_cb)(struct snd_usb_audio *chip)) +{ + int idx; + struct snd_usb_stream *as; + struct snd_usb_substream *subs = NULL; + struct snd_usb_audio *chip = NULL; + + mutex_lock(®ister_mutex); + /* + * legacy audio snd card number assignment is dynamic. Hence + * search using chip->card->number + */ + for (idx = 0; idx < SNDRV_CARDS; idx++) { + if (!usb_chip[idx]) + continue; + if (usb_chip[idx]->card->number == card_num) { + chip = usb_chip[idx]; + break; + } + } + + if (!chip || chip->shutdown) { + pr_debug("%s: instance of usb crad # %d does not exist\n", + __func__, card_num); + goto err; + } + + if (pcm_idx >= chip->pcm_devs) { + pr_err("%s: invalid pcm dev number %u > %d\n", __func__, + pcm_idx, chip->pcm_devs); + goto err; + } + + if (direction > SNDRV_PCM_STREAM_CAPTURE) { + pr_err("%s: invalid direction %u\n", __func__, direction); + goto err; + } + + list_for_each_entry(as, &chip->pcm_list, list) { + if (as->pcm_index == pcm_idx) { + subs = &as->substream[direction]; + if (subs->interface < 0 && !subs->data_endpoint && + !subs->sync_endpoint) { + pr_debug("%s: stream disconnected, bail out\n", + __func__); + subs = NULL; + goto err; + } + goto done; + } + } + +done: + chip->card_num = card_num; + chip->disconnect_cb = disconnect_cb; +err: + *uchip = chip; + if (!subs) + pr_debug("%s: substream instance not found\n", __func__); + mutex_unlock(®ister_mutex); + return subs; +} + /* * disconnect streams * called from snd_usb_audio_disconnect() @@ -641,6 +706,8 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, if (chip->num_interfaces <= 0) { usb_chip[chip->index] = NULL; mutex_unlock(®ister_mutex); + if (chip->disconnect_cb) + chip->disconnect_cb(chip); snd_card_free_when_closed(card); } else { mutex_unlock(®ister_mutex); diff --git a/sound/usb/card.h b/sound/usb/card.h index 97acb906acc27..a04fd22302b49 100644 --- a/sound/usb/card.h +++ b/sound/usb/card.h @@ -164,4 +164,8 @@ struct snd_usb_stream { struct list_head list; }; +struct snd_usb_substream *find_snd_usb_substream(unsigned int card_num, + unsigned int pcm_idx, unsigned int direction, struct snd_usb_audio + **uchip, void (*disconnect_cb)(struct snd_usb_audio *chip)); + #endif /* __USBAUDIO_CARD_H */ diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 0d8aba5fe1a83..17b3507772fe4 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -524,6 +524,64 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) return 0; } +int snd_usb_enable_audio_stream(struct snd_usb_substream *subs, + bool enable) +{ + struct audioformat *fmt; + struct usb_host_interface *alts; + struct usb_interface *iface; + int ret; + + if (!enable) { + if (subs->interface >= 0) { + usb_set_interface(subs->dev, subs->interface, 0); + subs->altset_idx = 0; + subs->interface = -1; + subs->cur_audiofmt = NULL; + } + + snd_usb_autosuspend(subs->stream->chip); + return 0; + } + + snd_usb_autoresume(subs->stream->chip); + fmt = find_format(subs); + if (!fmt) { + dev_dbg(&subs->dev->dev, + "cannot set format: format = %#x, rate = %d, channels = %d\n", + subs->pcm_format, subs->cur_rate, subs->channels); + return -EINVAL; + } + + subs->altset_idx = 0; + subs->interface = -1; + if (subs->stream->chip->shutdown) { + ret = -ENODEV; + } else { + ret = set_format(subs, fmt); + if (ret < 0) + return ret; + + iface = usb_ifnum_to_if(subs->dev, subs->cur_audiofmt->iface); + alts = &iface->altsetting[subs->cur_audiofmt->altset_idx]; + ret = snd_usb_init_sample_rate(subs->stream->chip, + subs->cur_audiofmt->iface, + alts, + subs->cur_audiofmt, + subs->cur_rate); + if (ret < 0) { + dev_err(&subs->dev->dev, "failed to set rate %d\n", + subs->cur_rate); + return ret; + } + } + + subs->interface = fmt->iface; + subs->altset_idx = fmt->altset_idx; + + return 0; +} + /* * Return the score of matching two audioformats. * Veto the audioformat if: diff --git a/sound/usb/pcm.h b/sound/usb/pcm.h index df7a003682ad6..d581f94b3fbf1 100644 --- a/sound/usb/pcm.h +++ b/sound/usb/pcm.h @@ -9,6 +9,7 @@ void snd_usb_set_pcm_ops(struct snd_pcm *pcm, int stream); int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface, struct usb_host_interface *alts, struct audioformat *fmt); - +int snd_usb_enable_audio_stream(struct snd_usb_substream *subs, + bool enable); #endif /* __USBAUDIO_PCM_H */ diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 91d0380431b4f..9e46dc703ad91 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -59,6 +59,8 @@ struct snd_usb_audio { bool autoclock; /* from the 'autoclock' module param */ struct usb_host_interface *ctrl_intf; /* the audio control interface */ + int card_num; /* cache pcm card number to use upon disconnect */ + void (*disconnect_cb)(struct snd_usb_audio *chip); }; #define usb_audio_err(chip, fmt, args...) \ From e1789a45c2d8488b7e5a36810c4cff219b1ad3a1 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 22 Mar 2016 13:41:59 -0700 Subject: [PATCH 0348/1015] usb: xhci: Add support for secondary interrupters Implement APIs to dynamically allocate and free secondary event rings based upon interrupter number. Also add exported APIs in usb core layer which allows secondary event ring management via remote processor entity. Change-Id: I5ee7d44d6cad8e35e22d3c1a027a1eec5d208585 Signed-off-by: Hemant Kumar --- drivers/usb/core/hcd.c | 22 +++ drivers/usb/core/usb.c | 20 +++ drivers/usb/host/xhci-mem.c | 318 ++++++++++++++++++++++++++---------- drivers/usb/host/xhci.c | 2 + drivers/usb/host/xhci.h | 10 ++ include/linux/usb.h | 4 + include/linux/usb/hcd.h | 8 + 7 files changed, 294 insertions(+), 90 deletions(-) diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 701db5dffae0f..3ca50f5a8561b 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -2154,6 +2154,28 @@ int usb_hcd_get_frame_number (struct usb_device *udev) return hcd->driver->get_frame_number (hcd); } +int usb_hcd_sec_event_ring_setup(struct usb_device *udev, + unsigned intr_num) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!HCD_RH_RUNNING(hcd)) + return 0; + + return hcd->driver->sec_event_ring_setup(hcd, intr_num); +} + +int usb_hcd_sec_event_ring_cleanup(struct usb_device *udev, + unsigned intr_num) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!HCD_RH_RUNNING(hcd)) + return 0; + + return hcd->driver->sec_event_ring_cleanup(hcd, intr_num); +} + /*-------------------------------------------------------------------------*/ #ifdef CONFIG_PM diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 29ee9363faa51..fce4baaf061b4 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -655,6 +655,26 @@ int usb_get_current_frame_number(struct usb_device *dev) } EXPORT_SYMBOL_GPL(usb_get_current_frame_number); +int usb_sec_event_ring_setup(struct usb_device *dev, + unsigned intr_num) +{ + if (dev->state == USB_STATE_NOTATTACHED) + return 0; + + return usb_hcd_sec_event_ring_setup(dev, intr_num); +} +EXPORT_SYMBOL(usb_sec_event_ring_setup); + +int usb_sec_event_ring_cleanup(struct usb_device *dev, + unsigned intr_num) +{ + if (dev->state == USB_STATE_NOTATTACHED) + return 0; + + return usb_hcd_sec_event_ring_cleanup(dev, intr_num); +} +EXPORT_SYMBOL(usb_sec_event_ring_cleanup); + /*-------------------------------------------------------------------*/ /* * __usb_get_extra_descriptor() finds a descriptor of specific type in the diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index bf6693df523f7..f953c70a379f3 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1792,25 +1792,73 @@ void xhci_free_command(struct xhci_hcd *xhci, kfree(command); } -void xhci_mem_cleanup(struct xhci_hcd *xhci) +int xhci_sec_event_ring_cleanup(struct usb_hcd *hcd, unsigned intr_num) { + int size; + struct xhci_hcd *xhci = hcd_to_xhci(hcd); struct device *dev = xhci_to_hcd(xhci)->self.controller; + + if (intr_num > xhci->max_interrupters) { + xhci_err(xhci, "invalid secondary interrupter num %d\n", + intr_num); + return -EINVAL; + } + + size = + sizeof(struct xhci_erst_entry)*(xhci->sec_erst[intr_num].num_entries); + if (xhci->sec_erst[intr_num].entries) + dma_free_coherent(dev, size, xhci->sec_erst[intr_num].entries, + xhci->sec_erst[intr_num].erst_dma_addr); + xhci->sec_erst[intr_num].entries = NULL; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed SEC ERST#%d", + intr_num); + if (xhci->sec_event_ring[intr_num]) + xhci_ring_free(xhci, xhci->sec_event_ring[intr_num]); + xhci->sec_event_ring[intr_num] = NULL; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "Freed sec event ring"); + + return 0; +} + +void xhci_event_ring_cleanup(struct xhci_hcd *xhci) +{ int size; - int i, j, num_ports; + unsigned int i; + struct device *dev = xhci_to_hcd(xhci)->self.controller; - del_timer_sync(&xhci->cmd_timer); + /* sec event ring clean up */ + for (i = 1; i <= xhci->max_interrupters; i++) + xhci_sec_event_ring_cleanup(xhci_to_hcd(xhci), i); - /* Free the Event Ring Segment Table and the actual Event Ring */ + kfree(xhci->sec_ir_set); + xhci->sec_ir_set = NULL; + kfree(xhci->sec_erst); + xhci->sec_erst = NULL; + kfree(xhci->sec_event_ring); + xhci->sec_event_ring = NULL; + + /* primary event ring clean up */ size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); if (xhci->erst.entries) dma_free_coherent(dev, size, xhci->erst.entries, xhci->erst.erst_dma_addr); xhci->erst.entries = NULL; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed ERST"); + xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed primary ERST"); if (xhci->event_ring) xhci_ring_free(xhci, xhci->event_ring); xhci->event_ring = NULL; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed event ring"); + xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed priamry event ring"); +} + +void xhci_mem_cleanup(struct xhci_hcd *xhci) +{ + struct device *dev = xhci_to_hcd(xhci)->self.controller; + int i, j, num_ports; + + del_timer_sync(&xhci->cmd_timer); + + xhci_event_ring_cleanup(xhci); if (xhci->lpm_command) xhci_free_command(xhci, xhci->lpm_command); @@ -2049,30 +2097,6 @@ static int xhci_check_trb_in_td_math(struct xhci_hcd *xhci, gfp_t mem_flags) return 0; } -static void xhci_set_hc_event_deq(struct xhci_hcd *xhci) -{ - u64 temp; - dma_addr_t deq; - - deq = xhci_trb_virt_to_dma(xhci->event_ring->deq_seg, - xhci->event_ring->dequeue); - if (deq == 0 && !in_interrupt()) - xhci_warn(xhci, "WARN something wrong with SW event ring " - "dequeue ptr.\n"); - /* Update HC event ring dequeue pointer */ - temp = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); - temp &= ERST_PTR_MASK; - /* Don't clear the EHB bit (which is RW1C) because - * there might be more events to service. - */ - temp &= ~ERST_EHB; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Write event ring dequeue pointer, " - "preserving EHB bit"); - xhci_write_64(xhci, ((u64) deq & (u64) ~ERST_PTR_MASK) | temp, - &xhci->ir_set->erst_dequeue); -} - static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, __le32 __iomem *addr, u8 major_revision, int max_caps) { @@ -2314,13 +2338,184 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) return 0; } +int xhci_event_ring_setup(struct xhci_hcd *xhci, struct xhci_ring **er, + struct xhci_intr_reg __iomem *ir_set, struct xhci_erst *erst, + unsigned int intr_num, gfp_t flags) +{ + dma_addr_t dma, deq; + u64 val_64; + unsigned int val; + struct xhci_segment *seg; + struct device *dev = xhci_to_hcd(xhci)->self.controller; + + *er = xhci_ring_alloc(xhci, ERST_NUM_SEGS, 1, + TYPE_EVENT, flags); + if (!*er) + return -ENOMEM; + + erst->entries = dma_alloc_coherent(dev, + sizeof(struct xhci_erst_entry) * ERST_NUM_SEGS, &dma, + flags); + if (!erst->entries) { + xhci_ring_free(xhci, *er); + return -ENOMEM; + } + + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "intr# %d: Allocated event ring segment table at 0x%llx", + intr_num, (unsigned long long)dma); + + memset(erst->entries, 0, sizeof(struct xhci_erst_entry)*ERST_NUM_SEGS); + erst->num_entries = ERST_NUM_SEGS; + erst->erst_dma_addr = dma; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "intr# %d: num segs = %i, virt addr = %p, dma addr = 0x%llx", + intr_num, + erst->num_entries, + erst->entries, + (unsigned long long)erst->erst_dma_addr); + + /* set ring base address and size for each segment table entry */ + for (val = 0, seg = (*er)->first_seg; val < ERST_NUM_SEGS; val++) { + struct xhci_erst_entry *entry = &erst->entries[val]; + + entry->seg_addr = cpu_to_le64(seg->dma); + entry->seg_size = cpu_to_le32(TRBS_PER_SEGMENT); + entry->rsvd = 0; + seg = seg->next; + } + + /* set ERST count with the number of entries in the segment table */ + val = readl_relaxed(&ir_set->erst_size); + val &= ERST_SIZE_MASK; + val |= ERST_NUM_SEGS; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "Write ERST size = %i to ir_set %d (some bits preserved)", val, + intr_num); + writel_relaxed(val, &ir_set->erst_size); + + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "intr# %d: Set ERST entries to point to event ring.", + intr_num); + /* set the segment table base address */ + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "Set ERST base address for ir_set %d = 0x%llx", + intr_num, + (unsigned long long)erst->erst_dma_addr); + val_64 = xhci_read_64(xhci, &ir_set->erst_base); + val_64 &= ERST_PTR_MASK; + val_64 |= (erst->erst_dma_addr & (u64) ~ERST_PTR_MASK); + xhci_write_64(xhci, val_64, &ir_set->erst_base); + + /* Set the event ring dequeue address */ + deq = xhci_trb_virt_to_dma((*er)->deq_seg, (*er)->dequeue); + if (deq == 0 && !in_interrupt()) + xhci_warn(xhci, + "intr# %d:WARN something wrong with SW event ring deq ptr.\n", + intr_num); + /* Update HC event ring dequeue pointer */ + val_64 = xhci_read_64(xhci, &ir_set->erst_dequeue); + val_64 &= ERST_PTR_MASK; + /* Don't clear the EHB bit (which is RW1C) because + * there might be more events to service. + */ + val_64 &= ~ERST_EHB; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "intr# %d:Write event ring dequeue pointer, preserving EHB bit", + intr_num); + xhci_write_64(xhci, ((u64) deq & (u64) ~ERST_PTR_MASK) | val_64, + &ir_set->erst_dequeue); + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "Wrote ERST address to ir_set %d.", intr_num); + xhci_print_ir_set(xhci, intr_num); + + return 0; +} + +int xhci_sec_event_ring_setup(struct usb_hcd *hcd, unsigned intr_num) +{ + int ret; + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + if ((xhci->xhc_state & XHCI_STATE_HALTED) || !xhci->sec_ir_set + || !xhci->sec_event_ring || !xhci->sec_erst || + intr_num > xhci->max_interrupters) { + xhci_err(xhci, + "%s:state %x ir_set %p evt_ring %p erst %p intr# %d\n", + __func__, xhci->xhc_state, xhci->sec_ir_set, + xhci->sec_event_ring, xhci->sec_erst, intr_num); + return -EINVAL; + } + + if (xhci->sec_event_ring && xhci->sec_event_ring[intr_num] + && xhci->sec_event_ring[intr_num]->first_seg) + goto done; + + xhci->sec_ir_set[intr_num] = &xhci->run_regs->ir_set[intr_num]; + ret = xhci_event_ring_setup(xhci, + &xhci->sec_event_ring[intr_num], + xhci->sec_ir_set[intr_num], + &xhci->sec_erst[intr_num], + intr_num, GFP_KERNEL); + if (ret) { + xhci_err(xhci, "sec event ring setup failed inter#%d\n", + intr_num); + return ret; + } +done: + return 0; +} + +int xhci_event_ring_init(struct xhci_hcd *xhci, gfp_t flags) +{ + int ret = 0; + + /* primary + secondary */ + xhci->max_interrupters = HCS_MAX_INTRS(xhci->hcs_params1); + + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "// Allocating primary event ring"); + + /* Set ir_set to interrupt register set 0 */ + xhci->ir_set = &xhci->run_regs->ir_set[0]; + ret = xhci_event_ring_setup(xhci, &xhci->event_ring, xhci->ir_set, + &xhci->erst, 0, flags); + if (ret) { + xhci_err(xhci, "failed to setup primary event ring\n"); + goto fail; + } + + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "// Allocating sec event ring related pointers"); + + xhci->sec_ir_set = kcalloc(xhci->max_interrupters, + sizeof(*xhci->sec_ir_set), flags); + if (!xhci->sec_ir_set) { + ret = -ENOMEM; + goto fail; + } + + xhci->sec_event_ring = kcalloc(xhci->max_interrupters, + sizeof(*xhci->sec_event_ring), flags); + if (!xhci->sec_event_ring) { + ret = -ENOMEM; + goto fail; + } + + xhci->sec_erst = kcalloc(xhci->max_interrupters, + sizeof(*xhci->sec_erst), flags); + if (!xhci->sec_erst) + ret = -ENOMEM; +fail: + return ret; +} + int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) { dma_addr_t dma; struct device *dev = xhci_to_hcd(xhci)->self.controller; unsigned int val, val2; u64 val_64; - struct xhci_segment *seg; u32 page_size, temp; int i; @@ -2442,73 +2637,16 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) xhci->dba = (void __iomem *) xhci->cap_regs + val; xhci_dbg_regs(xhci); xhci_print_run_regs(xhci); - /* Set ir_set to interrupt register set 0 */ - xhci->ir_set = &xhci->run_regs->ir_set[0]; /* * Event ring setup: Allocate a normal ring, but also setup * the event ring segment table (ERST). Section 4.9.3. */ - xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Allocating event ring"); - xhci->event_ring = xhci_ring_alloc(xhci, ERST_NUM_SEGS, 1, TYPE_EVENT, - flags); - if (!xhci->event_ring) - goto fail; - if (xhci_check_trb_in_td_math(xhci, flags) < 0) + if (xhci_event_ring_init(xhci, GFP_KERNEL)) goto fail; - xhci->erst.entries = dma_alloc_coherent(dev, - sizeof(struct xhci_erst_entry) * ERST_NUM_SEGS, &dma, - GFP_KERNEL); - if (!xhci->erst.entries) + if (xhci_check_trb_in_td_math(xhci, flags) < 0) goto fail; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Allocated event ring segment table at 0x%llx", - (unsigned long long)dma); - - memset(xhci->erst.entries, 0, sizeof(struct xhci_erst_entry)*ERST_NUM_SEGS); - xhci->erst.num_entries = ERST_NUM_SEGS; - xhci->erst.erst_dma_addr = dma; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "Set ERST to 0; private num segs = %i, virt addr = %p, dma addr = 0x%llx", - xhci->erst.num_entries, - xhci->erst.entries, - (unsigned long long)xhci->erst.erst_dma_addr); - - /* set ring base address and size for each segment table entry */ - for (val = 0, seg = xhci->event_ring->first_seg; val < ERST_NUM_SEGS; val++) { - struct xhci_erst_entry *entry = &xhci->erst.entries[val]; - entry->seg_addr = cpu_to_le64(seg->dma); - entry->seg_size = cpu_to_le32(TRBS_PER_SEGMENT); - entry->rsvd = 0; - seg = seg->next; - } - - /* set ERST count with the number of entries in the segment table */ - val = readl(&xhci->ir_set->erst_size); - val &= ERST_SIZE_MASK; - val |= ERST_NUM_SEGS; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Write ERST size = %i to ir_set 0 (some bits preserved)", - val); - writel(val, &xhci->ir_set->erst_size); - - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Set ERST entries to point to event ring."); - /* set the segment table base address */ - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Set ERST base address for ir_set 0 = 0x%llx", - (unsigned long long)xhci->erst.erst_dma_addr); - val_64 = xhci_read_64(xhci, &xhci->ir_set->erst_base); - val_64 &= ERST_PTR_MASK; - val_64 |= (xhci->erst.erst_dma_addr & (u64) ~ERST_PTR_MASK); - xhci_write_64(xhci, val_64, &xhci->ir_set->erst_base); - - /* Set the event ring dequeue address */ - xhci_set_hc_event_deq(xhci); - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "Wrote ERST address to ir_set 0."); - xhci_print_ir_set(xhci, 0); /* init command timeout timer */ init_timer(&xhci->cmd_timer); diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 25f4283500b8d..274bd50ffe654 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -5039,6 +5039,8 @@ static const struct hc_driver xhci_hc_driver = { .enable_usb3_lpm_timeout = xhci_enable_usb3_lpm_timeout, .disable_usb3_lpm_timeout = xhci_disable_usb3_lpm_timeout, .find_raw_port_number = xhci_find_raw_port_number, + .sec_event_ring_setup = xhci_sec_event_ring_setup, + .sec_event_ring_cleanup = xhci_sec_event_ring_cleanup, }; void xhci_init_driver(struct hc_driver *drv, int (*setup_fn)(struct usb_hcd *)) diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index ad153d1f574d8..e4466af6136c8 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1452,6 +1452,9 @@ struct xhci_hcd { /* Our HCD's current interrupter register set */ struct xhci_intr_reg __iomem *ir_set; + /* secondary interrupter */ + struct xhci_intr_reg __iomem **sec_ir_set; + /* Cached register copies of read-only HC data */ __u32 hcs_params1; __u32 hcs_params2; @@ -1491,6 +1494,11 @@ struct xhci_hcd { struct xhci_command *current_cmd; struct xhci_ring *event_ring; struct xhci_erst erst; + + /* secondary event ring and erst */ + struct xhci_ring **sec_event_ring; + struct xhci_erst *sec_erst; + /* Scratchpad */ struct xhci_scratchpad *scratchpad; /* Store LPM test failed devices' information */ @@ -1738,6 +1746,8 @@ struct xhci_command *xhci_alloc_command(struct xhci_hcd *xhci, void xhci_urb_free_priv(struct xhci_hcd *xhci, struct urb_priv *urb_priv); void xhci_free_command(struct xhci_hcd *xhci, struct xhci_command *command); +int xhci_sec_event_ring_setup(struct usb_hcd *hcd, unsigned intr_num); +int xhci_sec_event_ring_cleanup(struct usb_hcd *hcd, unsigned intr_num); /* xHCI host controller glue */ typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); diff --git a/include/linux/usb.h b/include/linux/usb.h index 70a7dbf11de8f..2927a4583f847 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -735,6 +735,10 @@ static inline bool usb_device_no_sg_constraint(struct usb_device *udev) /* for drivers using iso endpoints */ extern int usb_get_current_frame_number(struct usb_device *usb_dev); +extern int usb_sec_event_ring_setup(struct usb_device *dev, + unsigned intr_num); +extern int usb_sec_event_ring_cleanup(struct usb_device *dev, + unsigned intr_num); /* Sets up a group of bulk endpoints to support multiple stream IDs. */ extern int usb_alloc_streams(struct usb_interface *interface, diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 9a30c1e01fb2b..457a00684ca7a 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -387,6 +387,10 @@ struct hc_driver { void (*dump_regs)(struct usb_hcd *); void (*set_autosuspend_delay)(struct usb_device *); void (*reset_sof_bug_handler)(struct usb_hcd *hcd, u32 val); + + int (*sec_event_ring_setup)(struct usb_hcd *hcd, unsigned intr_num); + int (*sec_event_ring_cleanup)(struct usb_hcd *hcd, + unsigned intr_num); }; static inline int hcd_giveback_urb_in_bh(struct usb_hcd *hcd) @@ -425,6 +429,10 @@ extern int usb_hcd_alloc_bandwidth(struct usb_device *udev, struct usb_host_interface *old_alt, struct usb_host_interface *new_alt); extern int usb_hcd_get_frame_number(struct usb_device *udev); +extern int usb_hcd_sec_event_ring_setup(struct usb_device *udev, + unsigned intr_num); +extern int usb_hcd_sec_event_ring_cleanup(struct usb_device *udev, + unsigned intr_num); extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, struct device *dev, const char *bus_name); From 256582571705128af09c3d0092374b5de52a9856 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 22 Mar 2016 19:34:20 -0700 Subject: [PATCH 0349/1015] usb: xhci: Add helper APIs to return xhci dma addresses dma address of secondary event ring, transfer ring and device context base address are required to pass to remote entity. Remote entity uses these addresses to program xhci controller registers. Change-Id: Ie0756d646a396a11b41b93e886bca9aff636ee5d Signed-off-by: Hemant Kumar --- drivers/usb/core/hcd.c | 35 +++++++++++++++++++++++++ drivers/usb/core/usb.c | 31 ++++++++++++++++++++++ drivers/usb/host/xhci.c | 58 +++++++++++++++++++++++++++++++++++++++++ include/linux/usb.h | 7 +++++ include/linux/usb/hcd.h | 18 ++++++++++--- 5 files changed, 146 insertions(+), 3 deletions(-) diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 3ca50f5a8561b..9c3578476bb16 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -2178,6 +2178,41 @@ int usb_hcd_sec_event_ring_cleanup(struct usb_device *udev, /*-------------------------------------------------------------------------*/ +dma_addr_t +usb_hcd_get_sec_event_ring_dma_addr(struct usb_device *udev, + unsigned intr_num) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!HCD_RH_RUNNING(hcd)) + return 0; + + return hcd->driver->get_sec_event_ring_dma_addr(hcd, intr_num); +} + +dma_addr_t +usb_hcd_get_dcba_dma_addr(struct usb_device *udev) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!HCD_RH_RUNNING(hcd)) + return 0; + + return hcd->driver->get_dcba_dma_addr(hcd, udev); +} + +dma_addr_t +usb_hcd_get_xfer_ring_dma_addr(struct usb_device *udev, + struct usb_host_endpoint *ep) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!HCD_RH_RUNNING(hcd)) + return 0; + + return hcd->driver->get_xfer_ring_dma_addr(hcd, udev, ep); +} + #ifdef CONFIG_PM int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg) diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index fce4baaf061b4..cb4bd7b4a4367 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -675,6 +675,37 @@ int usb_sec_event_ring_cleanup(struct usb_device *dev, } EXPORT_SYMBOL(usb_sec_event_ring_cleanup); +dma_addr_t +usb_get_sec_event_ring_dma_addr(struct usb_device *dev, + unsigned intr_num) +{ + if (dev->state == USB_STATE_NOTATTACHED) + return 0; + + return usb_hcd_get_sec_event_ring_dma_addr(dev, intr_num); +} +EXPORT_SYMBOL(usb_get_sec_event_ring_dma_addr); + +dma_addr_t +usb_get_dcba_dma_addr(struct usb_device *dev) +{ + if (dev->state == USB_STATE_NOTATTACHED) + return 0; + + return usb_hcd_get_dcba_dma_addr(dev); +} +EXPORT_SYMBOL(usb_get_dcba_dma_addr); + +dma_addr_t usb_get_xfer_ring_dma_addr(struct usb_device *dev, + struct usb_host_endpoint *ep) +{ + if (dev->state == USB_STATE_NOTATTACHED) + return 0; + + return usb_hcd_get_xfer_ring_dma_addr(dev, ep); +} +EXPORT_SYMBOL(usb_get_xfer_ring_dma_addr); + /*-------------------------------------------------------------------*/ /* * __usb_get_extra_descriptor() finds a descriptor of specific type in the diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 274bd50ffe654..a9216195061ab 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -4980,6 +4980,61 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) } EXPORT_SYMBOL_GPL(xhci_gen_setup); +dma_addr_t xhci_get_sec_event_ring_dma_addr(struct usb_hcd *hcd, + unsigned intr_num) +{ + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + if (intr_num > xhci->max_interrupters) { + xhci_err(xhci, "intr num %d > max intrs %d\n", intr_num, + xhci->max_interrupters); + return 0; + } + + if (!(xhci->xhc_state & XHCI_STATE_HALTED) && + xhci->sec_event_ring && xhci->sec_event_ring[intr_num] + && xhci->sec_event_ring[intr_num]->first_seg) + return xhci->sec_event_ring[intr_num]->first_seg->dma; + + return 0; +} + +dma_addr_t xhci_get_dcba_dma_addr(struct usb_hcd *hcd, + struct usb_device *udev) +{ + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + if (!(xhci->xhc_state & XHCI_STATE_HALTED) && xhci->dcbaa) + return xhci->dcbaa->dev_context_ptrs[udev->slot_id]; + + return 0; +} + +dma_addr_t xhci_get_xfer_ring_dma_addr(struct usb_hcd *hcd, + struct usb_device *udev, struct usb_host_endpoint *ep) +{ + int ret; + unsigned int ep_index; + struct xhci_virt_device *virt_dev; + + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + ret = xhci_check_args(hcd, udev, ep, 1, true, __func__); + if (ret <= 0) { + xhci_err(xhci, "%s: invalid args\n", __func__); + return 0; + } + + virt_dev = xhci->devs[udev->slot_id]; + ep_index = xhci_get_endpoint_index(&ep->desc); + + if (virt_dev->eps[ep_index].ring && + virt_dev->eps[ep_index].ring->first_seg) + return virt_dev->eps[ep_index].ring->first_seg->dma; + + return 0; +} + static const struct hc_driver xhci_hc_driver = { .description = "xhci-hcd", .product_desc = "xHCI Host Controller", @@ -5041,6 +5096,9 @@ static const struct hc_driver xhci_hc_driver = { .find_raw_port_number = xhci_find_raw_port_number, .sec_event_ring_setup = xhci_sec_event_ring_setup, .sec_event_ring_cleanup = xhci_sec_event_ring_cleanup, + .get_sec_event_ring_dma_addr = xhci_get_sec_event_ring_dma_addr, + .get_xfer_ring_dma_addr = xhci_get_xfer_ring_dma_addr, + .get_dcba_dma_addr = xhci_get_dcba_dma_addr, }; void xhci_init_driver(struct hc_driver *drv, int (*setup_fn)(struct usb_hcd *)) diff --git a/include/linux/usb.h b/include/linux/usb.h index 2927a4583f847..0f4f50926f14d 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -740,6 +740,13 @@ extern int usb_sec_event_ring_setup(struct usb_device *dev, extern int usb_sec_event_ring_cleanup(struct usb_device *dev, unsigned intr_num); +extern dma_addr_t +usb_get_sec_event_ring_dma_addr(struct usb_device *dev, + unsigned intr_num); +extern dma_addr_t usb_get_dcba_dma_addr(struct usb_device *dev); +extern dma_addr_t usb_get_xfer_ring_dma_addr(struct usb_device *dev, + struct usb_host_endpoint *ep); + /* Sets up a group of bulk endpoints to support multiple stream IDs. */ extern int usb_alloc_streams(struct usb_interface *interface, struct usb_host_endpoint **eps, unsigned int num_eps, diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 457a00684ca7a..80326fa9205a8 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -388,9 +388,14 @@ struct hc_driver { void (*set_autosuspend_delay)(struct usb_device *); void (*reset_sof_bug_handler)(struct usb_hcd *hcd, u32 val); - int (*sec_event_ring_setup)(struct usb_hcd *hcd, unsigned intr_num); - int (*sec_event_ring_cleanup)(struct usb_hcd *hcd, - unsigned intr_num); + int (*sec_event_ring_setup)(struct usb_hcd *hcd, unsigned intr_num); + int (*sec_event_ring_cleanup)(struct usb_hcd *hcd, unsigned intr_num); + dma_addr_t (*get_sec_event_ring_dma_addr)(struct usb_hcd *hcd, + unsigned intr_num); + dma_addr_t (*get_xfer_ring_dma_addr)(struct usb_hcd *hcd, + struct usb_device *udev, struct usb_host_endpoint *ep); + dma_addr_t (*get_dcba_dma_addr)(struct usb_hcd *hcd, + struct usb_device *udev); }; static inline int hcd_giveback_urb_in_bh(struct usb_hcd *hcd) @@ -433,6 +438,13 @@ extern int usb_hcd_sec_event_ring_setup(struct usb_device *udev, unsigned intr_num); extern int usb_hcd_sec_event_ring_cleanup(struct usb_device *udev, unsigned intr_num); +extern dma_addr_t +usb_hcd_get_sec_event_ring_dma_addr(struct usb_device *udev, + unsigned intr_num); +extern dma_addr_t usb_hcd_get_dcba_dma_addr(struct usb_device *udev); +extern dma_addr_t +usb_hcd_get_xfer_ring_dma_addr(struct usb_device *udev, + struct usb_host_endpoint *ep); extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, struct device *dev, const char *bus_name); From 4c09cf3e914fd01f9f1f54b1dcb6bb9c7973bfc7 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Thu, 28 Jan 2016 11:41:42 -0800 Subject: [PATCH 0350/1015] sound: usb: Add support for usb audio qmi service Upon usb audio device enumeration remote entity communicates with usb audio qmi server to enable or disable particular audio stream on usb audio device. This off loades ISOC data transfer operations to remote entity and allows APQ to go to power collapse more frequently for better power saving. Change-Id: I2c9b0ba0837f8fec5c320e3117aa3b2f553db6b2 Signed-off-by: Hemant Kumar --- sound/usb/Kconfig | 8 + sound/usb/Makefile | 1 + sound/usb/card.c | 2 + sound/usb/stream.c | 5 + sound/usb/usb_audio_qmi_svc.c | 449 +++++++++++++++++++++++++++ sound/usb/usb_audio_qmi_v01.c | 565 ++++++++++++++++++++++++++++++++++ sound/usb/usb_audio_qmi_v01.h | 103 +++++++ sound/usb/usbaudio.h | 2 + 8 files changed, 1135 insertions(+) create mode 100644 sound/usb/usb_audio_qmi_svc.c create mode 100644 sound/usb/usb_audio_qmi_v01.c create mode 100644 sound/usb/usb_audio_qmi_v01.h diff --git a/sound/usb/Kconfig b/sound/usb/Kconfig index d393153c474f2..b0887bd736b66 100644 --- a/sound/usb/Kconfig +++ b/sound/usb/Kconfig @@ -160,5 +160,13 @@ config SND_BCD2000 To compile this driver as a module, choose M here: the module will be called snd-bcd2000. +config SND_USB_AUDIO_QMI + tristate "USB Audio QMI Service driver" + depends on MSM_QMI_INTERFACE + help + Starts USB Audio QMI server to communicate with remote entity + to perform operations like enable or disable particular audio + stream on a connected USB device. + endif # SND_USB diff --git a/sound/usb/Makefile b/sound/usb/Makefile index 2b92f0dcbc4cc..db00376ac455b 100644 --- a/sound/usb/Makefile +++ b/sound/usb/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_SND_USB_USX2Y) += snd-usbmidi-lib.o obj-$(CONFIG_SND_USB_US122L) += snd-usbmidi-lib.o obj-$(CONFIG_SND) += misc/ usx2y/ caiaq/ 6fire/ hiface/ bcd2000/ +obj-$(CONFIG_SND_USB_AUDIO_QMI) += usb_audio_qmi_v01.o usb_audio_qmi_svc.o diff --git a/sound/usb/card.c b/sound/usb/card.c index a3c386b00cfcf..4c73602653490 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -389,6 +389,7 @@ static int snd_usb_audio_free(struct snd_usb_audio *chip) list_for_each_safe(p, n, &chip->ep_list) snd_usb_endpoint_free(p); + mutex_destroy(&chip->dev_lock); mutex_destroy(&chip->mutex); kfree(chip); return 0; @@ -455,6 +456,7 @@ static int snd_usb_audio_create(struct usb_interface *intf, mutex_init(&chip->mutex); init_rwsem(&chip->shutdown_rwsem); + mutex_init(&chip->dev_lock); chip->index = idx; chip->dev = dev; chip->card = card; diff --git a/sound/usb/stream.c b/sound/usb/stream.c index 25e8075f9ea3f..6b431e6b8e7eb 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -69,9 +69,14 @@ static void snd_usb_audio_stream_free(struct snd_usb_stream *stream) static void snd_usb_audio_pcm_free(struct snd_pcm *pcm) { struct snd_usb_stream *stream = pcm->private_data; + struct snd_usb_audio *chip; + if (stream) { + mutex_lock(&stream->chip->dev_lock); + chip = stream->chip; stream->pcm = NULL; snd_usb_audio_stream_free(stream); + mutex_unlock(&chip->dev_lock); } } diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c new file mode 100644 index 0000000000000..47e78c29f4034 --- /dev/null +++ b/sound/usb/usb_audio_qmi_svc.c @@ -0,0 +1,449 @@ +/* Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "usbaudio.h" +#include "card.h" +#include "helper.h" +#include "pcm.h" +#include "usb_audio_qmi_v01.h" + +#define SND_PCM_CARD_NUM_MASK 0xffff0000 +#define SND_PCM_DEV_NUM_MASK 0xff00 +#define SND_PCM_STREAM_DIRECTION 0xff + +struct uaudio_dev { + atomic_t in_use; + struct kref kref; + wait_queue_head_t disconnect_wq; +}; + +static struct uaudio_dev uadev[SNDRV_CARDS]; + +struct uaudio_qmi_svc { + struct qmi_handle *uaudio_svc_hdl; + void *curr_conn; + struct work_struct recv_msg_work; + struct workqueue_struct *uaudio_wq; + ktime_t t_request_recvd; + ktime_t t_resp_sent; +}; + +static struct uaudio_qmi_svc *uaudio_svc; + +static struct msg_desc uaudio_stream_req_desc = { + .max_msg_len = QMI_UAUDIO_STREAM_REQ_MSG_V01_MAX_MSG_LEN, + .msg_id = QMI_UAUDIO_STREAM_REQ_V01, + .ei_array = qmi_uaudio_stream_req_msg_v01_ei, +}; + +static struct msg_desc uaudio_stream_resp_desc = { + .max_msg_len = QMI_UAUDIO_STREAM_RESP_MSG_V01_MAX_MSG_LEN, + .msg_id = QMI_UAUDIO_STREAM_RESP_V01, + .ei_array = qmi_uaudio_stream_resp_msg_v01_ei, +}; + +static int prepare_qmi_response(struct snd_usb_substream *subs, + struct qmi_uaudio_stream_resp_msg_v01 *resp, int card_num) +{ + struct usb_interface *iface; + struct usb_host_interface *alts; + struct usb_interface_descriptor *altsd; + struct usb_host_endpoint *ep; + struct uac_format_type_i_continuous_descriptor *fmt; + struct uac_format_type_i_discrete_descriptor *fmt_v1; + struct uac_format_type_i_ext_descriptor *fmt_v2; + struct uac1_as_header_descriptor *as; + struct uac1_ac_header_descriptor *ac; + int protocol; + + iface = usb_ifnum_to_if(subs->dev, subs->interface); + if (!iface) { + pr_err("%s: interface # %d does not exist\n", __func__, + subs->interface); + goto err; + } + + alts = &iface->altsetting[subs->altset_idx]; + altsd = get_iface_desc(alts); + protocol = altsd->bInterfaceProtocol; + + /* get format type */ + fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, + UAC_FORMAT_TYPE); + if (!fmt) { + pr_err("%s: %u:%d : no UAC_FORMAT_TYPE desc\n", __func__, + subs->interface, subs->altset_idx); + goto err; + } + + if (protocol == UAC_VERSION_1) { + as = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, + UAC_AS_GENERAL); + if (!as) { + pr_err("%s: %u:%d : no UAC_AS_GENERAL desc\n", __func__, + subs->interface, subs->altset_idx); + goto err; + } + resp->bDelay = as->bDelay; + fmt_v1 = (struct uac_format_type_i_discrete_descriptor *)fmt; + resp->bSubslotSize = fmt_v1->bSubframeSize; + } else if (protocol == UAC_VERSION_2) { + fmt_v2 = (struct uac_format_type_i_ext_descriptor *)fmt; + resp->bSubslotSize = fmt_v2->bSubslotSize; + } else { + pr_err("%s: unknown protocol version %x\n", __func__, protocol); + goto err; + } + + ac = snd_usb_find_csint_desc(alts->extra, + alts->extralen, + NULL, UAC_HEADER); + if (!ac) { + pr_err("%s: %u:%d : no UAC_HEADER desc\n", __func__, + subs->interface, subs->altset_idx); + goto err; + } + resp->bcdADC = ac->bcdADC; + + resp->slot_id = subs->dev->slot_id; + + memcpy(&resp->std_as_opr_intf_desc, &alts->desc, sizeof(alts->desc)); + + ep = usb_pipe_endpoint(subs->dev, subs->data_endpoint->pipe); + if (!ep) { + pr_err("%s: data ep # %d context is null\n", __func__, + subs->data_endpoint->ep_num); + goto err; + } + memcpy(&resp->std_as_data_ep_desc, &ep->desc, sizeof(ep->desc)); + + if (subs->sync_endpoint) { + ep = usb_pipe_endpoint(subs->dev, subs->sync_endpoint->pipe); + if (!ep) { + pr_err("%s: sync ep # %d context is null\n", __func__, + subs->sync_endpoint->ep_num); + goto err; + } + memcpy(&resp->std_as_sync_ep_desc, &ep->desc, sizeof(ep->desc)); + } + + if (!atomic_read(&uadev[card_num].in_use)) { + kref_init(&uadev[card_num].kref); + init_waitqueue_head(&uadev[card_num].disconnect_wq); + atomic_set(&uadev[card_num].in_use, 1); + } else { + kref_get(&uadev[card_num].kref); + } + + return 0; +err: + return -ENODEV; +} + +void uaudio_disconnect_cb(struct snd_usb_audio *chip) +{ + int ret; + struct uaudio_dev *dev; + int card_num = chip->card_num; + + mutex_lock(&chip->dev_lock); + if (card_num >= SNDRV_CARDS) { + pr_err("%s: invalid card number\n", __func__); + goto done; + } + + dev = &uadev[card_num]; + if (atomic_read(&dev->in_use)) { + ret = wait_event_interruptible(dev->disconnect_wq, + !atomic_read(&dev->in_use)); + if (ret < 0) { + pr_debug("%s: failed with ret %d\n", __func__, ret); + goto done; + } + } +done: + mutex_unlock(&chip->dev_lock); +} + +static void uaudio_dev_release(struct kref *kref) +{ + struct uaudio_dev *dev = container_of(kref, struct uaudio_dev, kref); + + atomic_set(&dev->in_use, 0); + wake_up(&dev->disconnect_wq); +} + +static int handle_uaudio_stream_req(void *req_h, void *req) +{ + struct qmi_uaudio_stream_req_msg_v01 *req_msg; + struct qmi_uaudio_stream_resp_msg_v01 resp = {0}; + struct snd_usb_substream *subs; + struct snd_usb_audio *chip = NULL; + struct uaudio_qmi_svc *svc = uaudio_svc; + u8 pcm_card_num, pcm_dev_num, direction; + int ret = 0; + + req_msg = (struct qmi_uaudio_stream_req_msg_v01 *)req; + + direction = req_msg->usb_token & SND_PCM_STREAM_DIRECTION; + pcm_dev_num = (req_msg->usb_token & SND_PCM_DEV_NUM_MASK) >> 8; + pcm_card_num = (req_msg->usb_token & SND_PCM_CARD_NUM_MASK) >> 16; + + pr_debug("%s:card#:%d dev#:%d dir:%d en:%d fmt:%d rate:%d #ch:%d\n", + __func__, pcm_card_num, pcm_dev_num, direction, req_msg->enable, + req_msg->audio_format, req_msg->bit_rate, + req_msg->number_of_ch); + + if (pcm_card_num >= SNDRV_CARDS) { + pr_err("%s: invalid card # %u", __func__, pcm_card_num); + ret = -EINVAL; + goto response; + } + + subs = find_snd_usb_substream(pcm_card_num, pcm_dev_num, direction, + &chip, uaudio_disconnect_cb); + if (!subs || !chip || chip->shutdown) { + pr_err("%s: can't find substream for card# %u, dev# %u dir%u\n", + __func__, pcm_card_num, pcm_dev_num, direction); + ret = -ENODEV; + goto response; + } + + mutex_lock(&chip->dev_lock); + if (chip->shutdown || !subs->stream || !subs->stream->pcm + || !subs->stream->chip) { + ret = -ENODEV; + mutex_unlock(&chip->dev_lock); + goto response; + } + + subs->pcm_format = req_msg->audio_format; + subs->channels = req_msg->number_of_ch; + subs->cur_rate = req_msg->bit_rate; + + ret = snd_usb_enable_audio_stream(subs, req_msg->enable); + + if (!ret && req_msg->enable) + ret = prepare_qmi_response(subs, &resp, pcm_card_num); + + mutex_unlock(&chip->dev_lock); + +response: + if (!req_msg->enable && ret != -EINVAL) { + if (atomic_read(&uadev[pcm_card_num].in_use)) + kref_put(&uadev[pcm_card_num].kref, + uaudio_dev_release); + } + + resp.status = ret; + ret = qmi_send_resp_from_cb(svc->uaudio_svc_hdl, svc->curr_conn, req_h, + &uaudio_stream_resp_desc, &resp, sizeof(resp)); + + svc->t_resp_sent = ktime_get(); + + pr_debug("%s: t_resp sent - t_req recvd (in ms) %lld\n", __func__, + ktime_to_ms(ktime_sub(svc->t_resp_sent, svc->t_request_recvd))); + + return ret; +} + +static int uaudio_qmi_svc_connect_cb(struct qmi_handle *handle, + void *conn_h) +{ + struct uaudio_qmi_svc *svc = uaudio_svc; + + if (svc->uaudio_svc_hdl != handle || !conn_h) { + pr_err("%s: handle mismatch\n", __func__); + return -EINVAL; + } + if (svc->curr_conn) { + pr_err("%s: Service is busy\n", __func__); + return -ECONNREFUSED; + } + svc->curr_conn = conn_h; + return 0; +} + +static int uaudio_qmi_svc_disconnect_cb(struct qmi_handle *handle, + void *conn_h) +{ + struct uaudio_qmi_svc *svc = uaudio_svc; + + if (svc->uaudio_svc_hdl != handle || svc->curr_conn != conn_h) { + pr_err("%s: handle mismatch\n", __func__); + return -EINVAL; + } + + svc->curr_conn = NULL; + return 0; +} + +static int uaudio_qmi_svc_req_cb(struct qmi_handle *handle, void *conn_h, + void *req_h, unsigned int msg_id, void *req) +{ + int ret; + struct uaudio_qmi_svc *svc = uaudio_svc; + + if (svc->uaudio_svc_hdl != handle || svc->curr_conn != conn_h) { + pr_err("%s: handle mismatch\n", __func__); + return -EINVAL; + } + + switch (msg_id) { + case QMI_UAUDIO_STREAM_REQ_V01: + ret = handle_uaudio_stream_req(req_h, req); + break; + + default: + ret = -ENOTSUPP; + break; + } + return ret; +} + +static int uaudio_qmi_svc_req_desc_cb(unsigned int msg_id, + struct msg_desc **req_desc) +{ + int ret; + + pr_debug("%s: msg_id %d\n", __func__, msg_id); + + switch (msg_id) { + case QMI_UAUDIO_STREAM_REQ_V01: + *req_desc = &uaudio_stream_req_desc; + ret = sizeof(struct qmi_uaudio_stream_req_msg_v01); + break; + + default: + ret = -ENOTSUPP; + break; + } + return ret; +} + +static void uaudio_qmi_svc_recv_msg(struct work_struct *w) +{ + int ret; + struct uaudio_qmi_svc *svc = container_of(w, struct uaudio_qmi_svc, + recv_msg_work); + + do { + pr_debug("%s: Notified about a Receive Event", __func__); + } while ((ret = qmi_recv_msg(svc->uaudio_svc_hdl)) == 0); + + if (ret != -ENOMSG) + pr_err("%s: Error receiving message\n", __func__); +} + +static void uaudio_qmi_svc_ntfy(struct qmi_handle *handle, + enum qmi_event_type event, void *priv) +{ + struct uaudio_qmi_svc *svc = uaudio_svc; + + pr_debug("%s: event %d", __func__, event); + + svc->t_request_recvd = ktime_get(); + + switch (event) { + case QMI_RECV_MSG: + queue_work(svc->uaudio_wq, &svc->recv_msg_work); + break; + default: + break; + } +} + +static struct qmi_svc_ops_options uaudio_svc_ops_options = { + .version = 1, + .service_id = UAUDIO_STREAM_SERVICE_ID_V01, + .service_vers = UAUDIO_STREAM_SERVICE_VERS_V01, + .connect_cb = uaudio_qmi_svc_connect_cb, + .disconnect_cb = uaudio_qmi_svc_disconnect_cb, + .req_desc_cb = uaudio_qmi_svc_req_desc_cb, + .req_cb = uaudio_qmi_svc_req_cb, +}; + +static int __init uaudio_qmi_svc_init(void) +{ + int ret; + struct uaudio_qmi_svc *svc; + + svc = kzalloc(sizeof(struct uaudio_qmi_svc), GFP_KERNEL); + if (!svc) + return -ENOMEM; + + svc->uaudio_wq = create_singlethread_workqueue("uaudio_svc"); + if (!svc->uaudio_wq) { + ret = -ENOMEM; + goto free_svc; + } + + svc->uaudio_svc_hdl = qmi_handle_create(uaudio_qmi_svc_ntfy, NULL); + if (!svc->uaudio_svc_hdl) { + pr_err("%s: Error creating svc_hdl\n", __func__); + ret = -EFAULT; + goto destroy_uaudio_wq; + } + + ret = qmi_svc_register(svc->uaudio_svc_hdl, &uaudio_svc_ops_options); + if (ret < 0) { + pr_err("%s:Error registering uaudio svc %d\n", __func__, ret); + goto destroy_svc_handle; + } + + INIT_WORK(&svc->recv_msg_work, uaudio_qmi_svc_recv_msg); + + uaudio_svc = svc; + + return 0; + +destroy_svc_handle: + qmi_handle_destroy(svc->uaudio_svc_hdl); +destroy_uaudio_wq: + destroy_workqueue(svc->uaudio_wq); +free_svc: + kfree(svc); + return ret; +} + +static void __exit uaudio_qmi_svc_exit(void) +{ + struct uaudio_qmi_svc *svc = uaudio_svc; + + qmi_svc_unregister(svc->uaudio_svc_hdl); + flush_workqueue(svc->uaudio_wq); + qmi_handle_destroy(svc->uaudio_svc_hdl); + destroy_workqueue(svc->uaudio_wq); + kfree(svc); + uaudio_svc = NULL; +} + +module_init(uaudio_qmi_svc_init); +module_exit(uaudio_qmi_svc_exit); + +MODULE_DESCRIPTION("USB AUDIO QMI Service Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/sound/usb/usb_audio_qmi_v01.c b/sound/usb/usb_audio_qmi_v01.c new file mode 100644 index 0000000000000..31b1ba74d5c73 --- /dev/null +++ b/sound/usb/usb_audio_qmi_v01.c @@ -0,0 +1,565 @@ + /* Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#include + +#include + +#include "usb_audio_qmi_v01.h" + +static struct elem_info mem_info_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_8_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint64_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct mem_info_v01, + va), + }, + { + .data_type = QMI_UNSIGNED_8_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint64_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct mem_info_v01, + pa), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct mem_info_v01, + size), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +static struct elem_info apps_mem_info_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct apps_mem_info_v01, + evt_ring), + .ei_array = mem_info_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct apps_mem_info_v01, + tr_data), + .ei_array = mem_info_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct apps_mem_info_v01, + tr_sync), + .ei_array = mem_info_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct apps_mem_info_v01, + xfer_buff), + .ei_array = mem_info_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct apps_mem_info_v01, + dcba), + .ei_array = mem_info_v01_ei, + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +static struct elem_info usb_endpoint_descriptor_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bLength), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bDescriptorType), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bEndpointAddress), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bmAttributes), + }, + { + .data_type = QMI_UNSIGNED_2_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint16_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + wMaxPacketSize), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bInterval), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bRefresh), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bSynchAddress), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +static struct elem_info usb_interface_descriptor_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bLength), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bDescriptorType), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bInterfaceNumber), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bAlternateSetting), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bNumEndpoints), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bInterfaceClass), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bInterfaceSubClass), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bInterfaceProtocol), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + iInterface), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +struct elem_info qmi_uaudio_stream_req_msg_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x01, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + priv_data), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x02, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + enable), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x03, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + usb_token), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x04, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + audio_format), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x05, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + number_of_ch), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x06, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + bit_rate), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x07, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + xfer_buff_size), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +struct elem_info qmi_uaudio_stream_resp_msg_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x01, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + priv_data), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x02, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + status), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x03, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + slot_id), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x04, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + bSubslotSize), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_interface_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x05, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_opr_intf_desc), + .ei_array = usb_interface_descriptor_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_endpoint_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x06, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_data_ep_desc), + .ei_array = usb_endpoint_descriptor_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_endpoint_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x07, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_sync_ep_desc), + .ei_array = usb_endpoint_descriptor_v01_ei, + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x08, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + bDelay), + }, + { + .data_type = QMI_UNSIGNED_2_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint16_t), + .is_array = NO_ARRAY, + .tlv_type = 0x09, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + bcdADC), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct apps_mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x0A, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + xhci_mem_info), + .ei_array = apps_mem_info_v01_ei, + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x0B, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + interrupter_num), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +struct elem_info qmi_uaudio_stream_ind_msg_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x01, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_token), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x02, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + priv_data), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x03, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + status), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x04, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + slot_id), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x05, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + bSubslotSize), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_interface_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x06, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_opr_intf_desc), + .ei_array = usb_interface_descriptor_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_endpoint_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x07, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_data_ep_desc), + .ei_array = usb_endpoint_descriptor_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_endpoint_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x08, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_sync_ep_desc), + .ei_array = usb_endpoint_descriptor_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct apps_mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x09, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + xhci_mem_info), + .ei_array = apps_mem_info_v01_ei, + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; diff --git a/sound/usb/usb_audio_qmi_v01.h b/sound/usb/usb_audio_qmi_v01.h new file mode 100644 index 0000000000000..7ad1ab8a61a92 --- /dev/null +++ b/sound/usb/usb_audio_qmi_v01.h @@ -0,0 +1,103 @@ + /* Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#ifndef USB_QMI_V01_H +#define USB_QMI_V01_H + +#define UAUDIO_STREAM_SERVICE_ID_V01 0x41C +#define UAUDIO_STREAM_SERVICE_VERS_V01 0x01 + +#define QMI_UAUDIO_STREAM_RESP_V01 0x0001 +#define QMI_UAUDIO_STREAM_REQ_V01 0x0001 +#define QMI_UADUIO_STREAM_IND_V01 0x0001 + + +struct mem_info_v01 { + uint64_t va; + uint64_t pa; + uint32_t size; +}; + +struct apps_mem_info_v01 { + struct mem_info_v01 evt_ring; + struct mem_info_v01 tr_data; + struct mem_info_v01 tr_sync; + struct mem_info_v01 xfer_buff; + struct mem_info_v01 dcba; +}; + +struct usb_endpoint_descriptor_v01 { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; + uint8_t bRefresh; + uint8_t bSynchAddress; +}; + +struct usb_interface_descriptor_v01 { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +}; + +struct qmi_uaudio_stream_req_msg_v01 { + uint32_t priv_data; + uint8_t enable; + uint32_t usb_token; + uint32_t audio_format; + uint32_t number_of_ch; + uint32_t bit_rate; + uint32_t xfer_buff_size; +}; +#define QMI_UAUDIO_STREAM_REQ_MSG_V01_MAX_MSG_LEN 46 +extern struct elem_info qmi_uaudio_stream_req_msg_v01_ei[]; + +struct qmi_uaudio_stream_resp_msg_v01 { + uint32_t priv_data; + uint32_t status; + uint32_t slot_id; + uint8_t bSubslotSize; + struct usb_interface_descriptor_v01 std_as_opr_intf_desc; + struct usb_endpoint_descriptor_v01 std_as_data_ep_desc; + struct usb_endpoint_descriptor_v01 std_as_sync_ep_desc; + uint8_t bDelay; + uint16_t bcdADC; + struct apps_mem_info_v01 xhci_mem_info; + uint8_t interrupter_num; +}; +#define QMI_UAUDIO_STREAM_RESP_MSG_V01_MAX_MSG_LEN 177 +extern struct elem_info qmi_uaudio_stream_resp_msg_v01_ei[]; + +struct qmi_uaudio_stream_ind_msg_v01 { + uint32_t usb_token; + uint32_t priv_data; + uint32_t status; + uint32_t slot_id; + uint8_t bSubslotSize; + struct usb_interface_descriptor_v01 std_as_opr_intf_desc; + struct usb_endpoint_descriptor_v01 std_as_data_ep_desc; + struct usb_endpoint_descriptor_v01 std_as_sync_ep_desc; + struct apps_mem_info_v01 xhci_mem_info; +}; +#define QMI_UAUDIO_STREAM_IND_MSG_V01_MAX_MSG_LEN 171 +extern struct elem_info qmi_uaudio_stream_ind_msg_v01_ei[]; + +#endif diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 9e46dc703ad91..11fb928a87dda 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -59,6 +59,8 @@ struct snd_usb_audio { bool autoclock; /* from the 'autoclock' module param */ struct usb_host_interface *ctrl_intf; /* the audio control interface */ + + struct mutex dev_lock; /* to protect any race with disconnect */ int card_num; /* cache pcm card number to use upon disconnect */ void (*disconnect_cb)(struct snd_usb_audio *chip); }; From 0938eea26b1a30122b5f5f86a74991191824a60a Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 22 Mar 2016 16:35:16 -0700 Subject: [PATCH 0351/1015] sound: usb: Add support to share iova with remote processor ISOC data transfer for audio device is offloaded to remote usb audio driver entity. This requires remote entity to access device context info, event ring, transfer rings and transfer buffers allocated by APPS XHCI device. Hence add a platform device which maps the XHCI device physical memory to virtual memory and shares with remote processor's iommu. All the memory info is then sent over QMI to remote entity. Change-Id: I1abc80652a167cefa667b914b3a80a87326c3d44 Signed-off-by: Hemant Kumar --- .../bindings/sound/qcom-usb-audio-qmi-dev.txt | 26 + sound/usb/usb_audio_qmi_svc.c | 691 +++++++++++++++++- 2 files changed, 708 insertions(+), 9 deletions(-) create mode 100644 Documentation/devicetree/bindings/sound/qcom-usb-audio-qmi-dev.txt diff --git a/Documentation/devicetree/bindings/sound/qcom-usb-audio-qmi-dev.txt b/Documentation/devicetree/bindings/sound/qcom-usb-audio-qmi-dev.txt new file mode 100644 index 0000000000000..9d3fb78f96a77 --- /dev/null +++ b/Documentation/devicetree/bindings/sound/qcom-usb-audio-qmi-dev.txt @@ -0,0 +1,26 @@ +QTI USB Audio QMI Device + +USB Audio QMI device is used to attach to remote processor IOMMU and +map USB Audio driver specific memory to iova to share with remote +processor. + +Required Properties: + +- compatible : "qcom,usb-audio-qmi-dev" + +- iommus : A list of phandle and IOMMU specifier pairs that describe the + IOMMU master interfaces of the device. + +- qcom,usb-audio-stream-id : Stream id is prepended to iova before passing + iova to remote processor. This allows remote processor to access iova. + +- qcom,usb-audio-intr-num : Interrupter number for external sub system + destination. + +Example: + usb_audio_qmi_dev { + compatible = "qcom,usb-audio-qmi-dev"; + iommus = <&lpass_q6_smmu 12>; + qcom,usb-audio-stream-id = <12>; + qcom,usb-audio-intr-num = <1>; + }; diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index 47e78c29f4034..9e3c7b94bee82 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -24,6 +24,9 @@ #include #include #include +#include +#include +#include #include "usbaudio.h" #include "card.h" @@ -35,14 +38,79 @@ #define SND_PCM_DEV_NUM_MASK 0xff00 #define SND_PCM_STREAM_DIRECTION 0xff +#define PREPEND_SID_TO_IOVA(iova, sid) (u64)(((u64)(iova)) | \ + (((u64)sid) << 32)) + +/* event ring iova base address */ +#define IOVA_BASE 0x1000 + +#define IOVA_DCBA_BASE 0x2000 +#define IOVA_XFER_RING_BASE (IOVA_DCBA_BASE + PAGE_SIZE * (SNDRV_CARDS + 1)) +#define IOVA_XFER_BUF_BASE (IOVA_XFER_RING_BASE + PAGE_SIZE * SNDRV_CARDS * 32) +#define IOVA_XFER_RING_MAX (IOVA_XFER_BUF_BASE - PAGE_SIZE) +#define IOVA_XFER_BUF_MAX (0xfffff000 - PAGE_SIZE) + +#define MAX_XFER_BUFF_LEN (2 * PAGE_SIZE) + +struct iova_info { + struct list_head list; + unsigned long start_iova; + size_t size; + bool in_use; +}; + +struct intf_info { + unsigned long data_xfer_ring_va; + size_t data_xfer_ring_size; + unsigned long sync_xfer_ring_va; + size_t sync_xfer_ring_size; + unsigned long xfer_buf_va; + size_t xfer_buf_size; + phys_addr_t xfer_buf_pa; + u8 *xfer_buf; + bool in_use; +}; + struct uaudio_dev { + struct usb_device *udev; + unsigned int card_num; atomic_t in_use; struct kref kref; + unsigned long dcba_iova; + size_t dcba_size; wait_queue_head_t disconnect_wq; + + /* interface specific */ + int num_intf; + struct intf_info *info; }; static struct uaudio_dev uadev[SNDRV_CARDS]; +struct uaudio_qmi_dev { + struct device *dev; + u32 sid; + u32 intr_num; + struct iommu_domain *domain; + + /* list to keep track of available iova */ + struct list_head dcba_list; + size_t dcba_iova_size; + unsigned long curr_dcba_iova; + struct list_head xfer_ring_list; + size_t xfer_ring_iova_size; + unsigned long curr_xfer_ring_iova; + struct list_head xfer_buf_list; + size_t xfer_buf_iova_size; + unsigned long curr_xfer_buf_iova; + /* bit fields representing pcm card enabled */ + unsigned long card_slot; + /* cache event ring phys addr */ + u64 er_phys_addr; +}; + +static struct uaudio_qmi_dev *uaudio_qdev; + struct uaudio_qmi_svc { struct qmi_handle *uaudio_svc_hdl; void *curr_conn; @@ -66,9 +134,233 @@ static struct msg_desc uaudio_stream_resp_desc = { .ei_array = qmi_uaudio_stream_resp_msg_v01_ei, }; +enum mem_type { + MEM_EVENT_RING, + MEM_DCBA, + MEM_XFER_RING, + MEM_XFER_BUF, +}; + +static unsigned long uaudio_get_iova(unsigned long *curr_iova, + size_t *curr_iova_size, struct list_head *head, size_t size) +{ + struct iova_info *info, *new_info = NULL; + struct list_head *curr_head; + unsigned long va = 0; + size_t tmp_size = size; + bool found = false; + + if (size % PAGE_SIZE) { + pr_err("%s: size %zu is not page size multiple\n", __func__, + size); + goto done; + } + + if (size > *curr_iova_size) { + pr_err("%s: size %zu > curr size %zu\n", __func__, size, + *curr_iova_size); + goto done; + } + if (*curr_iova_size == 0) { + pr_err("%s: iova mapping is full\n", __func__); + goto done; + } + + list_for_each_entry(info, head, list) { + /* exact size iova_info */ + if (!info->in_use && info->size == size) { + info->in_use = true; + va = info->start_iova; + *curr_iova_size -= size; + found = true; + pr_debug("%s: exact size :%zu found\n", __func__, size); + goto done; + } else if (!info->in_use && tmp_size >= info->size) { + if (!new_info) + new_info = info; + pr_debug("%s: partial size: %zu found\n", __func__, + info->size); + tmp_size -= info->size; + if (tmp_size) + continue; + + va = new_info->start_iova; + for (curr_head = &new_info->list; curr_head != + &info->list; curr_head = curr_head->next) { + new_info = list_entry(curr_head, struct + iova_info, list); + new_info->in_use = true; + } + info->in_use = true; + *curr_iova_size -= size; + found = true; + goto done; + } else { + /* iova region in use */ + new_info = NULL; + tmp_size = size; + } + } + + info = kzalloc(sizeof(struct iova_info), GFP_KERNEL); + if (!info) { + va = 0; + goto done; + } + + va = info->start_iova = *curr_iova; + info->size = size; + info->in_use = true; + *curr_iova += size; + *curr_iova_size -= size; + found = true; + list_add_tail(&info->list, head); + +done: + if (!found) + pr_err("%s: unable to find %zu size iova\n", __func__, size); + else + pr_debug("%s: va:%lu curr_iova:%lu curr_iova_size:%zu\n", + __func__, va, *curr_iova, *curr_iova_size); + + return va; +} + +static unsigned long uaudio_iommu_map(enum mem_type mtype, phys_addr_t pa, + size_t size) +{ + unsigned long va = 0; + bool map = true; + int ret; + + switch (mtype) { + case MEM_EVENT_RING: + va = IOVA_BASE; + /* er already mapped */ + if (uaudio_qdev->er_phys_addr == pa) + map = false; + break; + case MEM_DCBA: + va = uaudio_get_iova(&uaudio_qdev->curr_dcba_iova, + &uaudio_qdev->dcba_iova_size, &uaudio_qdev->dcba_list, size); + break; + case MEM_XFER_RING: + va = uaudio_get_iova(&uaudio_qdev->curr_xfer_ring_iova, + &uaudio_qdev->xfer_ring_iova_size, &uaudio_qdev->xfer_ring_list, + size); + break; + case MEM_XFER_BUF: + va = uaudio_get_iova(&uaudio_qdev->curr_xfer_buf_iova, + &uaudio_qdev->xfer_buf_iova_size, &uaudio_qdev->xfer_buf_list, + size); + break; + default: + pr_err("%s: unknown mem type %d\n", __func__, mtype); + } + + if (!va) + map = false; + + if (!map) + goto done; + + pr_debug("%s: map pa %pa to iova %lu for memtype %d\n", __func__, &pa, + va, mtype); + ret = iommu_map(uaudio_qdev->domain, va, pa, size, + IOMMU_READ | IOMMU_WRITE | IOMMU_DEVICE); + if (ret) + pr_err("%s:failed to map pa:%pa iova:%lu memtype:%d ret:%d\n", + __func__, &pa, va, mtype, ret); +done: + return va; +} + +static void uaudio_put_iova(unsigned long va, size_t size, struct list_head + *head, size_t *curr_iova_size) +{ + struct iova_info *info; + size_t tmp_size = size; + bool found = false; + + list_for_each_entry(info, head, list) { + if (info->start_iova == va) { + if (!info->in_use) { + pr_err("%s: va %lu is not in use\n", __func__, + va); + return; + } + found = true; + info->in_use = false; + if (info->size == size) + goto done; + } + + if (found && tmp_size >= info->size) { + info->in_use = false; + tmp_size -= info->size; + if (!tmp_size) + goto done; + } + } + + if (!found) { + pr_err("%s: unable to find the va %lu\n", __func__, va); + return; + } +done: + *curr_iova_size += size; + pr_debug("%s: curr_iova_size %zu\n", __func__, *curr_iova_size); +} + +static void uaudio_iommu_unmap(enum mem_type mtype, unsigned long va, + size_t size) +{ + size_t umap_size; + bool unmap = true; + + if (!va || !size) + return; + + switch (mtype) { + case MEM_EVENT_RING: + if (uaudio_qdev->er_phys_addr) + uaudio_qdev->er_phys_addr = 0; + else + unmap = false; + break; + case MEM_DCBA: + uaudio_put_iova(va, size, &uaudio_qdev->dcba_list, + &uaudio_qdev->dcba_iova_size); + break; + case MEM_XFER_RING: + uaudio_put_iova(va, size, &uaudio_qdev->xfer_ring_list, + &uaudio_qdev->xfer_ring_iova_size); + break; + case MEM_XFER_BUF: + uaudio_put_iova(va, size, &uaudio_qdev->xfer_buf_list, + &uaudio_qdev->xfer_buf_iova_size); + break; + default: + pr_err("%s: unknown mem type %d\n", __func__, mtype); + unmap = false; + } + + if (!unmap) + return; + + pr_debug("%s: unmap iova %lu for memtype %d\n", __func__, va, mtype); + + umap_size = iommu_unmap(uaudio_qdev->domain, va, size); + if (umap_size != size) + pr_err("%s: unmapped size %zu for iova %lu\n", __func__, + umap_size, va); +} + static int prepare_qmi_response(struct snd_usb_substream *subs, - struct qmi_uaudio_stream_resp_msg_v01 *resp, int card_num) + struct qmi_uaudio_stream_resp_msg_v01 *resp, u32 xfer_buf_len, + int card_num) { + int ret = -ENODEV; struct usb_interface *iface; struct usb_host_interface *alts; struct usb_interface_descriptor *altsd; @@ -79,6 +371,11 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, struct uac1_as_header_descriptor *as; struct uac1_ac_header_descriptor *ac; int protocol; + u8 *xfer_buf; + u32 len, mult, remainder; + unsigned long va, tr_data_va = 0, tr_sync_va = 0, dcba_va = 0, + xfer_buf_va = 0; + phys_addr_t xhci_pa, xfer_buf_pa; iface = usb_ifnum_to_if(subs->dev, subs->interface); if (!iface) { @@ -141,6 +438,14 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, } memcpy(&resp->std_as_data_ep_desc, &ep->desc, sizeof(ep->desc)); + xhci_pa = usb_get_xfer_ring_dma_addr(subs->dev, ep); + if (!xhci_pa) { + pr_err("%s:failed to get data ep ring dma address\n", __func__); + goto err; + } + + resp->xhci_mem_info.tr_data.pa = xhci_pa; + if (subs->sync_endpoint) { ep = usb_pipe_endpoint(subs->dev, subs->sync_endpoint->pipe); if (!ep) { @@ -149,27 +454,186 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, goto err; } memcpy(&resp->std_as_sync_ep_desc, &ep->desc, sizeof(ep->desc)); + xhci_pa = usb_get_xfer_ring_dma_addr(subs->dev, ep); + if (!xhci_pa) { + pr_err("%s:failed to get sync ep ring dma address\n", + __func__); + goto err; + } + resp->xhci_mem_info.tr_sync.pa = xhci_pa; } + resp->interrupter_num = uaudio_qdev->intr_num; + + /* map xhci data structures PA memory to iova */ + + /* event ring */ + ret = usb_sec_event_ring_setup(subs->dev, resp->interrupter_num); + if (ret) { + pr_err("%s: failed to setup sec event ring ret %d\n", __func__, + ret); + goto err; + } + xhci_pa = usb_get_sec_event_ring_dma_addr(subs->dev, + resp->interrupter_num); + if (!xhci_pa) { + pr_err("%s: failed to get sec event ring dma address\n", + __func__); + goto err; + } + + va = uaudio_iommu_map(MEM_EVENT_RING, xhci_pa, PAGE_SIZE); + if (!va) + goto err; + + resp->xhci_mem_info.evt_ring.va = PREPEND_SID_TO_IOVA(va, + uaudio_qdev->sid); + resp->xhci_mem_info.evt_ring.pa = xhci_pa; + resp->xhci_mem_info.evt_ring.size = PAGE_SIZE; + uaudio_qdev->er_phys_addr = xhci_pa; + + /* dcba */ + xhci_pa = usb_get_dcba_dma_addr(subs->dev); + if (!xhci_pa) { + pr_err("%s:failed to get dcba dma address\n", __func__); + goto unmap_er; + } + + if (!uadev[card_num].dcba_iova) { /* mappped per usb device */ + va = uaudio_iommu_map(MEM_DCBA, xhci_pa, PAGE_SIZE); + if (!va) + goto unmap_er; + + uadev[card_num].dcba_iova = va; + uadev[card_num].dcba_size = PAGE_SIZE; + } + + dcba_va = uadev[card_num].dcba_iova; + resp->xhci_mem_info.dcba.va = PREPEND_SID_TO_IOVA(dcba_va, + uaudio_qdev->sid); + resp->xhci_mem_info.dcba.pa = xhci_pa; + resp->xhci_mem_info.dcba.size = PAGE_SIZE; + + /* data transfer ring */ + xhci_pa = resp->xhci_mem_info.tr_data.pa; + va = uaudio_iommu_map(MEM_XFER_RING, xhci_pa, PAGE_SIZE); + if (!va) + goto unmap_dcba; + + tr_data_va = va; + resp->xhci_mem_info.tr_data.va = PREPEND_SID_TO_IOVA(va, + uaudio_qdev->sid); + resp->xhci_mem_info.tr_data.size = PAGE_SIZE; + + /* sync transfer ring */ + if (!resp->xhci_mem_info.tr_sync.pa) + goto skip_sync; + + xhci_pa = resp->xhci_mem_info.tr_sync.pa; + va = uaudio_iommu_map(MEM_XFER_RING, xhci_pa, PAGE_SIZE); + if (!va) + goto unmap_data; + + tr_sync_va = va; + resp->xhci_mem_info.tr_sync.va = PREPEND_SID_TO_IOVA(va, + uaudio_qdev->sid); + resp->xhci_mem_info.tr_sync.size = PAGE_SIZE; + +skip_sync: + /* xfer buffer, multiple of 4K only */ + if (!xfer_buf_len) + xfer_buf_len = PAGE_SIZE; + + mult = xfer_buf_len / PAGE_SIZE; + remainder = xfer_buf_len % PAGE_SIZE; + len = mult * PAGE_SIZE; + len += remainder ? PAGE_SIZE : 0; + + if (len > MAX_XFER_BUFF_LEN) { + pr_err("%s: req buf len %d > max buf len %lu, setting %lu\n", + __func__, len, MAX_XFER_BUFF_LEN, MAX_XFER_BUFF_LEN); + len = MAX_XFER_BUFF_LEN; + } + + xfer_buf = usb_alloc_coherent(subs->dev, len, GFP_KERNEL, &xfer_buf_pa); + if (!xfer_buf) + goto unmap_sync; + + resp->xhci_mem_info.xfer_buff.pa = xfer_buf_pa; + resp->xhci_mem_info.xfer_buff.size = len; + + va = uaudio_iommu_map(MEM_XFER_BUF, xfer_buf_pa, len); + if (!va) + goto unmap_sync; + + xfer_buf_va = va; + resp->xhci_mem_info.xfer_buff.va = PREPEND_SID_TO_IOVA(va, + uaudio_qdev->sid); + if (!atomic_read(&uadev[card_num].in_use)) { kref_init(&uadev[card_num].kref); init_waitqueue_head(&uadev[card_num].disconnect_wq); + uadev[card_num].num_intf = + subs->dev->config->desc.bNumInterfaces; + uadev[card_num].info = + kzalloc(sizeof(struct intf_info) * + uadev[card_num].num_intf, GFP_KERNEL); + if (!uadev[card_num].info) { + ret = -ENOMEM; + goto unmap_xfer_buf; + } + uadev[card_num].udev = subs->dev; atomic_set(&uadev[card_num].in_use, 1); } else { kref_get(&uadev[card_num].kref); } + if (uadev[card_num].info[subs->interface].in_use) { + pr_err("%s interface# %d already in use card# %d\n", __func__, + subs->interface, card_num); + goto unmap_xfer_buf; + } + + uadev[card_num].card_num = card_num; + + /* cache intf specific info to use it for unmap and free xfer buf */ + uadev[card_num].info[subs->interface].data_xfer_ring_va = tr_data_va; + uadev[card_num].info[subs->interface].data_xfer_ring_size = PAGE_SIZE; + uadev[card_num].info[subs->interface].sync_xfer_ring_va = tr_sync_va; + uadev[card_num].info[subs->interface].sync_xfer_ring_size = PAGE_SIZE; + uadev[card_num].info[subs->interface].xfer_buf_va = xfer_buf_va; + uadev[card_num].info[subs->interface].xfer_buf_pa = xfer_buf_pa; + uadev[card_num].info[subs->interface].xfer_buf_size = len; + uadev[card_num].info[subs->interface].xfer_buf = xfer_buf; + uadev[card_num].info[subs->interface].in_use = true; + + set_bit(card_num, &uaudio_qdev->card_slot); + return 0; + +unmap_xfer_buf: + uaudio_iommu_unmap(MEM_XFER_BUF, xfer_buf_va, len); +unmap_sync: + usb_free_coherent(subs->dev, len, xfer_buf, xfer_buf_pa); + uaudio_iommu_unmap(MEM_XFER_RING, tr_sync_va, PAGE_SIZE); +unmap_data: + uaudio_iommu_unmap(MEM_XFER_RING, tr_data_va, PAGE_SIZE); +unmap_dcba: + uaudio_iommu_unmap(MEM_DCBA, dcba_va, PAGE_SIZE); +unmap_er: + uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE); err: - return -ENODEV; + return ret; } void uaudio_disconnect_cb(struct snd_usb_audio *chip) { - int ret; + int ret, if_idx; struct uaudio_dev *dev; int card_num = chip->card_num; + pr_debug("%s: for card# %d\n", __func__, card_num); + mutex_lock(&chip->dev_lock); if (card_num >= SNDRV_CARDS) { pr_err("%s: invalid card number\n", __func__); @@ -185,6 +649,64 @@ void uaudio_disconnect_cb(struct snd_usb_audio *chip) goto done; } } + + /* clean up */ + if (!dev->udev) { + pr_debug("%s: no clean up required\n", __func__); + goto done; + } + + /* free xfer buffer and unmap xfer ring and buf per interface */ + for (if_idx = 0; if_idx < dev->num_intf; if_idx++) { + if (!dev->info[if_idx].in_use) + continue; + usb_free_coherent(dev->udev, + dev->info[if_idx].xfer_buf_size, + dev->info[if_idx].xfer_buf, + dev->info[if_idx].xfer_buf_pa); + + uaudio_iommu_unmap(MEM_XFER_RING, + dev->info[if_idx].data_xfer_ring_va, + dev->info[if_idx].data_xfer_ring_size); + dev->info[if_idx].data_xfer_ring_va = 0; + dev->info[if_idx].data_xfer_ring_size = 0; + + uaudio_iommu_unmap(MEM_XFER_RING, + dev->info[if_idx].sync_xfer_ring_va, + dev->info[if_idx].sync_xfer_ring_size); + dev->info[if_idx].sync_xfer_ring_va = 0; + dev->info[if_idx].sync_xfer_ring_size = 0; + + uaudio_iommu_unmap(MEM_XFER_BUF, + dev->info[if_idx].xfer_buf_va, + dev->info[if_idx].xfer_buf_size); + dev->info[if_idx].xfer_buf_va = 0; + dev->info[if_idx].xfer_buf_size = 0; + pr_debug("%s: release resources: intf# %d card# %d\n", __func__, + if_idx, card_num); + } + + /* iommu_unmap dcba iova for a usb device */ + uaudio_iommu_unmap(MEM_DCBA, dev->dcba_iova, dev->dcba_size); + + dev->dcba_iova = 0; + dev->dcba_size = 0; + dev->num_intf = 0; + + /* free interface info */ + kfree(dev->info); + dev->info = NULL; + + clear_bit(card_num, &uaudio_qdev->card_slot); + + /* all audio devices are disconnected */ + if (!uaudio_qdev->card_slot) { + uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE); + usb_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); + pr_debug("%s: all audio devices disconnected\n", __func__); + } + + dev->udev = NULL; done: mutex_unlock(&chip->dev_lock); } @@ -193,7 +715,19 @@ static void uaudio_dev_release(struct kref *kref) { struct uaudio_dev *dev = container_of(kref, struct uaudio_dev, kref); + pr_debug("%s for dev %p\n", __func__, dev); + atomic_set(&dev->in_use, 0); + + clear_bit(dev->card_num, &uaudio_qdev->card_slot); + + /* all audio devices are disconnected */ + if (!uaudio_qdev->card_slot) { + usb_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); + uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE); + pr_debug("%s: all audio devices disconnected\n", __func__); + } + wake_up(&dev->disconnect_wq); } @@ -204,8 +738,9 @@ static int handle_uaudio_stream_req(void *req_h, void *req) struct snd_usb_substream *subs; struct snd_usb_audio *chip = NULL; struct uaudio_qmi_svc *svc = uaudio_svc; + struct intf_info *info; u8 pcm_card_num, pcm_dev_num, direction; - int ret = 0; + int intf_num = -1, ret = 0; req_msg = (struct qmi_uaudio_stream_req_msg_v01 *)req; @@ -234,6 +769,7 @@ static int handle_uaudio_stream_req(void *req_h, void *req) } mutex_lock(&chip->dev_lock); + intf_num = subs->interface; if (chip->shutdown || !subs->stream || !subs->stream->pcm || !subs->stream->chip) { ret = -ENODEV; @@ -248,12 +784,45 @@ static int handle_uaudio_stream_req(void *req_h, void *req) ret = snd_usb_enable_audio_stream(subs, req_msg->enable); if (!ret && req_msg->enable) - ret = prepare_qmi_response(subs, &resp, pcm_card_num); + ret = prepare_qmi_response(subs, &resp, req_msg->xfer_buff_size, + pcm_card_num); mutex_unlock(&chip->dev_lock); response: if (!req_msg->enable && ret != -EINVAL) { + if (intf_num >= 0) { + mutex_lock(&chip->dev_lock); + info = &uadev[pcm_card_num].info[intf_num]; + uaudio_iommu_unmap(MEM_XFER_RING, + info->data_xfer_ring_va, + info->data_xfer_ring_size); + info->data_xfer_ring_va = 0; + info->data_xfer_ring_size = 0; + + uaudio_iommu_unmap(MEM_XFER_RING, + info->sync_xfer_ring_va, + info->sync_xfer_ring_size); + info->sync_xfer_ring_va = 0; + info->sync_xfer_ring_size = 0; + + uaudio_iommu_unmap(MEM_XFER_BUF, + info->xfer_buf_va, + info->xfer_buf_size); + info->xfer_buf_va = 0; + + usb_free_coherent(uadev[pcm_card_num].udev, + info->xfer_buf_size, + info->xfer_buf, + info->xfer_buf_pa); + info->xfer_buf_size = 0; + info->xfer_buf = NULL; + info->xfer_buf_pa = 0; + info->in_use = false; + pr_debug("%s:release resources: intf# %d card# %d\n", + __func__, intf_num, pcm_card_num); + mutex_unlock(&chip->dev_lock); + } if (atomic_read(&uadev[pcm_card_num].in_use)) kref_put(&uadev[pcm_card_num].kref, uaudio_dev_release); @@ -387,7 +956,94 @@ static struct qmi_svc_ops_options uaudio_svc_ops_options = { .req_cb = uaudio_qmi_svc_req_cb, }; -static int __init uaudio_qmi_svc_init(void) +static int uaudio_qmi_plat_probe(struct platform_device *pdev) +{ + int ret; + struct device_node *node = pdev->dev.of_node; + + uaudio_qdev = devm_kzalloc(&pdev->dev, sizeof(struct uaudio_qmi_dev), + GFP_KERNEL); + if (!uaudio_qdev) + return -ENOMEM; + + uaudio_qdev->dev = &pdev->dev; + + ret = of_property_read_u32(node, "qcom,usb-audio-stream-id", + &uaudio_qdev->sid); + if (ret) { + dev_err(&pdev->dev, "failed to read sid.\n"); + return -ENODEV; + } + + ret = of_property_read_u32(node, "qcom,usb-audio-intr-num", + &uaudio_qdev->intr_num); + if (ret) { + dev_err(&pdev->dev, "failed to read intr num.\n"); + return -ENODEV; + } + + uaudio_qdev->domain = iommu_domain_alloc(msm_iommu_get_bus(&pdev->dev)); + if (!uaudio_qdev) { + dev_err(&pdev->dev, "failed to callocate iommu domin\n"); + return -ENODEV; + } + + /* attach to external processor iommu */ + ret = iommu_attach_device(uaudio_qdev->domain, &pdev->dev); + if (ret) { + dev_err(&pdev->dev, "failed to attach device ret = %d\n", ret); + goto free_domain; + } + + /* initialize dcba, xfer ring and xfer buf iova list */ + INIT_LIST_HEAD(&uaudio_qdev->dcba_list); + uaudio_qdev->curr_dcba_iova = IOVA_DCBA_BASE; + uaudio_qdev->dcba_iova_size = SNDRV_CARDS * PAGE_SIZE; + + INIT_LIST_HEAD(&uaudio_qdev->xfer_ring_list); + uaudio_qdev->curr_xfer_ring_iova = IOVA_XFER_RING_BASE; + uaudio_qdev->xfer_ring_iova_size = + IOVA_XFER_RING_MAX - IOVA_XFER_RING_BASE; + + INIT_LIST_HEAD(&uaudio_qdev->xfer_buf_list); + uaudio_qdev->curr_xfer_buf_iova = IOVA_XFER_BUF_BASE; + uaudio_qdev->xfer_buf_iova_size = + IOVA_XFER_BUF_MAX - IOVA_XFER_BUF_BASE; + + return 0; + +free_domain: + iommu_domain_free(uaudio_qdev->domain); + return ret; +} + +static int uaudio_qmi_plat_remove(struct platform_device *pdev) +{ + iommu_detach_device(uaudio_qdev->domain, &pdev->dev); + iommu_domain_free(uaudio_qdev->domain); + uaudio_qdev->domain = NULL; + + return 0; +} + +static const struct of_device_id of_uaudio_matach[] = { + { + .compatible = "qcom,usb-audio-qmi-dev", + }, + { }, +}; +MODULE_DEVICE_TABLE(of, of_uaudio_matach); + +static struct platform_driver uaudio_qmi_driver = { + .probe = uaudio_qmi_plat_probe, + .remove = uaudio_qmi_plat_remove, + .driver = { + .name = "uaudio-qmi", + .of_match_table = of_uaudio_matach, + }, +}; + +static int uaudio_qmi_svc_init(void) { int ret; struct uaudio_qmi_svc *svc; @@ -430,7 +1086,7 @@ static int __init uaudio_qmi_svc_init(void) return ret; } -static void __exit uaudio_qmi_svc_exit(void) +static void uaudio_qmi_svc_exit(void) { struct uaudio_qmi_svc *svc = uaudio_svc; @@ -442,8 +1098,25 @@ static void __exit uaudio_qmi_svc_exit(void) uaudio_svc = NULL; } -module_init(uaudio_qmi_svc_init); -module_exit(uaudio_qmi_svc_exit); +static int __init uaudio_qmi_plat_init(void) +{ + int ret; + + ret = platform_driver_register(&uaudio_qmi_driver); + if (ret) + return ret; + + return uaudio_qmi_svc_init(); +} + +static void __exit uaudio_qmi_plat_exit(void) +{ + uaudio_qmi_svc_exit(); + platform_driver_unregister(&uaudio_qmi_driver); +} + +module_init(uaudio_qmi_plat_init); +module_exit(uaudio_qmi_plat_exit); MODULE_DESCRIPTION("USB AUDIO QMI Service Driver"); MODULE_LICENSE("GPL v2"); From 2a46617d15d0fff22e7da7ba512ad92a10e00735 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Thu, 7 Jul 2016 14:16:41 -0700 Subject: [PATCH 0352/1015] defconfig: msmcortex: Enable USB audio QMI service driver This allows APPS USB XHCI driver to offload the USB audio ISOC data transfer to remote processor. USB audio QMI driver starts a QMI service to communicate with remote processor to exchange audio stream related information. Change-Id: Ib771c685b3245878413cd78d20451a0dcfdfda63 Signed-off-by: Hemant Kumar --- arch/arm64/configs/msmcortex-perf_defconfig | 1 + arch/arm64/configs/msmcortex_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index 169afe3056338..8174763b125ec 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -424,6 +424,7 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_USB_AUDIO=y +CONFIG_SND_USB_AUDIO_QMI=y CONFIG_SND_SOC=y CONFIG_SND_SOC_MSM8X16=y CONFIG_HIDRAW=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index 2b97d9e4267ab..b1f58db2bbc87 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -427,6 +427,7 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_USB_AUDIO=y +CONFIG_SND_USB_AUDIO_QMI=y CONFIG_SND_SOC=y CONFIG_SND_SOC_MSM8X16=y CONFIG_HIDRAW=y From ab7e042b563799f42f7881ceedfb0e25591e8d82 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 18 Jul 2016 16:26:48 -0700 Subject: [PATCH 0353/1015] sound: usb: Update USB audio QMI data structure Updating USB audio qmi data structure as per new definitions. Also update the USB audio QMI driver appropriately. Change-Id: I93ed98a17daa1c65944dd260c7004f7198741aad Signed-off-by: Hemant Kumar --- sound/usb/usb_audio_qmi_svc.c | 36 +++- sound/usb/usb_audio_qmi_v01.c | 368 +++++++++++++++++++++++++++++----- sound/usb/usb_audio_qmi_v01.h | 75 +++++-- 3 files changed, 409 insertions(+), 70 deletions(-) diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index 9e3c7b94bee82..398238e757a4d 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -405,12 +405,15 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, subs->interface, subs->altset_idx); goto err; } - resp->bDelay = as->bDelay; + resp->data_path_delay = as->bDelay; + resp->data_path_delay_valid = 1; fmt_v1 = (struct uac_format_type_i_discrete_descriptor *)fmt; - resp->bSubslotSize = fmt_v1->bSubframeSize; + resp->usb_audio_subslot_size = fmt_v1->bSubframeSize; + resp->usb_audio_subslot_size_valid = 1; } else if (protocol == UAC_VERSION_2) { fmt_v2 = (struct uac_format_type_i_ext_descriptor *)fmt; - resp->bSubslotSize = fmt_v2->bSubslotSize; + resp->usb_audio_subslot_size = fmt_v2->bSubslotSize; + resp->usb_audio_subslot_size_valid = 1; } else { pr_err("%s: unknown protocol version %x\n", __func__, protocol); goto err; @@ -424,11 +427,14 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, subs->interface, subs->altset_idx); goto err; } - resp->bcdADC = ac->bcdADC; + resp->usb_audio_spec_revision = ac->bcdADC; + resp->usb_audio_spec_revision_valid = 1; resp->slot_id = subs->dev->slot_id; + resp->slot_id_valid = 1; memcpy(&resp->std_as_opr_intf_desc, &alts->desc, sizeof(alts->desc)); + resp->std_as_opr_intf_desc_valid = 1; ep = usb_pipe_endpoint(subs->dev, subs->data_endpoint->pipe); if (!ep) { @@ -437,6 +443,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, goto err; } memcpy(&resp->std_as_data_ep_desc, &ep->desc, sizeof(ep->desc)); + resp->std_as_data_ep_desc_valid = 1; xhci_pa = usb_get_xfer_ring_dma_addr(subs->dev, ep); if (!xhci_pa) { @@ -454,6 +461,8 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, goto err; } memcpy(&resp->std_as_sync_ep_desc, &ep->desc, sizeof(ep->desc)); + resp->std_as_sync_ep_desc_valid = 1; + xhci_pa = usb_get_xfer_ring_dma_addr(subs->dev, ep); if (!xhci_pa) { pr_err("%s:failed to get sync ep ring dma address\n", @@ -464,6 +473,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, } resp->interrupter_num = uaudio_qdev->intr_num; + resp->interrupter_num_valid = 1; /* map xhci data structures PA memory to iova */ @@ -570,6 +580,8 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, resp->xhci_mem_info.xfer_buff.va = PREPEND_SID_TO_IOVA(va, uaudio_qdev->sid); + resp->xhci_mem_info_valid = 1; + if (!atomic_read(&uadev[card_num].in_use)) { kref_init(&uadev[card_num].kref); init_waitqueue_head(&uadev[card_num].disconnect_wq); @@ -734,7 +746,7 @@ static void uaudio_dev_release(struct kref *kref) static int handle_uaudio_stream_req(void *req_h, void *req) { struct qmi_uaudio_stream_req_msg_v01 *req_msg; - struct qmi_uaudio_stream_resp_msg_v01 resp = {0}; + struct qmi_uaudio_stream_resp_msg_v01 resp = {{0}, 0}; struct snd_usb_substream *subs; struct snd_usb_audio *chip = NULL; struct uaudio_qmi_svc *svc = uaudio_svc; @@ -744,6 +756,13 @@ static int handle_uaudio_stream_req(void *req_h, void *req) req_msg = (struct qmi_uaudio_stream_req_msg_v01 *)req; + if (!req_msg->audio_format_valid || !req_msg->bit_rate_valid || + !req_msg->number_of_ch_valid || !req_msg->xfer_buff_size_valid) { + pr_err("%s: invalid request msg\n", __func__); + ret = -EINVAL; + goto response; + } + direction = req_msg->usb_token & SND_PCM_STREAM_DIRECTION; pcm_dev_num = (req_msg->usb_token & SND_PCM_DEV_NUM_MASK) >> 8; pcm_card_num = (req_msg->usb_token & SND_PCM_CARD_NUM_MASK) >> 16; @@ -828,7 +847,12 @@ static int handle_uaudio_stream_req(void *req_h, void *req) uaudio_dev_release); } - resp.status = ret; + resp.usb_token = req_msg->usb_token; + resp.usb_token_valid = 1; + resp.internal_status = ret; + resp.internal_status_valid = 1; + resp.status = ret ? USB_AUDIO_STREAM_REQ_FAILURE_V01 : ret; + resp.status_valid = 1; ret = qmi_send_resp_from_cb(svc->uaudio_svc_hdl, svc->curr_conn, req_h, &uaudio_stream_resp_desc, &resp, sizeof(resp)); diff --git a/sound/usb/usb_audio_qmi_v01.c b/sound/usb/usb_audio_qmi_v01.c index 31b1ba74d5c73..6f6f194e89fba 100644 --- a/sound/usb/usb_audio_qmi_v01.c +++ b/sound/usb/usb_audio_qmi_v01.c @@ -280,65 +280,92 @@ static struct elem_info usb_interface_descriptor_v01_ei[] = { struct elem_info qmi_uaudio_stream_req_msg_v01_ei[] = { { - .data_type = QMI_UNSIGNED_4_BYTE, + .data_type = QMI_UNSIGNED_1_BYTE, .elem_len = 1, - .elem_size = sizeof(uint32_t), + .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, .tlv_type = 0x01, .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, - priv_data), + enable), }, { - .data_type = QMI_UNSIGNED_1_BYTE, + .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, - .elem_size = sizeof(uint8_t), + .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, .tlv_type = 0x02, .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, - enable), + usb_token), }, { - .data_type = QMI_UNSIGNED_4_BYTE, + .data_type = QMI_OPT_FLAG, .elem_len = 1, - .elem_size = sizeof(uint32_t), + .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, - .tlv_type = 0x03, + .tlv_type = 0x10, .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, - usb_token), + audio_format_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, - .tlv_type = 0x04, + .tlv_type = 0x10, .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, audio_format), }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x11, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + number_of_ch_valid), + }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, - .tlv_type = 0x05, + .tlv_type = 0x11, .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, number_of_ch), }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x12, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + bit_rate_valid), + }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, - .tlv_type = 0x06, + .tlv_type = 0x12, .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, bit_rate), }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x13, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + xfer_buff_size_valid), + }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, - .tlv_type = 0x07, + .tlv_type = 0x13, .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, xfer_buff_size), }, @@ -350,116 +377,257 @@ struct elem_info qmi_uaudio_stream_req_msg_v01_ei[] = { }; struct elem_info qmi_uaudio_stream_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct qmi_response_type_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x02, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + resp), + .ei_array = get_qmi_response_type_v01_ei(), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x10, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + status_valid), + }, + { + .data_type = QMI_SIGNED_4_BYTE_ENUM, + .elem_len = 1, + .elem_size = sizeof(enum usb_audio_stream_status_enum_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x10, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + status), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x11, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + internal_status_valid), + }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, - .tlv_type = 0x01, + .tlv_type = 0x11, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + internal_status), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x12, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, - priv_data), + slot_id_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, - .tlv_type = 0x02, + .tlv_type = 0x12, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, - status), + slot_id), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x13, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + usb_token_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, - .tlv_type = 0x03, + .tlv_type = 0x13, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, - slot_id), + usb_token), }, { - .data_type = QMI_UNSIGNED_1_BYTE, + .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, - .tlv_type = 0x04, + .tlv_type = 0x14, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, - bSubslotSize), + std_as_opr_intf_desc_valid), }, { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct usb_interface_descriptor_v01), .is_array = NO_ARRAY, - .tlv_type = 0x05, + .tlv_type = 0x14, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, std_as_opr_intf_desc), .ei_array = usb_interface_descriptor_v01_ei, }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x15, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_data_ep_desc_valid), + }, { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct usb_endpoint_descriptor_v01), .is_array = NO_ARRAY, - .tlv_type = 0x06, + .tlv_type = 0x15, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, std_as_data_ep_desc), .ei_array = usb_endpoint_descriptor_v01_ei, }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x16, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_sync_ep_desc_valid), + }, { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct usb_endpoint_descriptor_v01), .is_array = NO_ARRAY, - .tlv_type = 0x07, + .tlv_type = 0x16, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, std_as_sync_ep_desc), .ei_array = usb_endpoint_descriptor_v01_ei, }, { - .data_type = QMI_UNSIGNED_1_BYTE, + .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, - .tlv_type = 0x08, + .tlv_type = 0x17, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, - bDelay), + usb_audio_spec_revision_valid), }, { .data_type = QMI_UNSIGNED_2_BYTE, .elem_len = 1, .elem_size = sizeof(uint16_t), .is_array = NO_ARRAY, - .tlv_type = 0x09, + .tlv_type = 0x17, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, - bcdADC), + usb_audio_spec_revision), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x18, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + data_path_delay_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x18, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + data_path_delay), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x19, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + usb_audio_subslot_size_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x19, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + usb_audio_subslot_size), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x1A, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + xhci_mem_info_valid), }, { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct apps_mem_info_v01), .is_array = NO_ARRAY, - .tlv_type = 0x0A, + .tlv_type = 0x1A, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, xhci_mem_info), .ei_array = apps_mem_info_v01_ei, }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x1B, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + interrupter_num_valid), + }, { .data_type = QMI_UNSIGNED_1_BYTE, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, - .tlv_type = 0x0B, + .tlv_type = 0x1B, .offset = offsetof( struct qmi_uaudio_stream_resp_msg_v01, interrupter_num), @@ -473,13 +641,14 @@ struct elem_info qmi_uaudio_stream_resp_msg_v01_ei[] = { struct elem_info qmi_uaudio_stream_ind_msg_v01_ei[] = { { - .data_type = QMI_UNSIGNED_4_BYTE, + .data_type = QMI_SIGNED_4_BYTE_ENUM, .elem_len = 1, - .elem_size = sizeof(uint32_t), + .elem_size = sizeof( + enum usb_audio_device_indication_enum_v01), .is_array = NO_ARRAY, .tlv_type = 0x01, .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, - usb_token), + dev_event), }, { .data_type = QMI_UNSIGNED_4_BYTE, @@ -488,75 +657,174 @@ struct elem_info qmi_uaudio_stream_ind_msg_v01_ei[] = { .is_array = NO_ARRAY, .tlv_type = 0x02, .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, - priv_data), + slot_id), }, { - .data_type = QMI_UNSIGNED_4_BYTE, + .data_type = QMI_OPT_FLAG, .elem_len = 1, - .elem_size = sizeof(uint32_t), + .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, - .tlv_type = 0x03, + .tlv_type = 0x10, .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, - status), + usb_token_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(uint32_t), .is_array = NO_ARRAY, - .tlv_type = 0x04, + .tlv_type = 0x10, .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, - slot_id), + usb_token), }, { - .data_type = QMI_UNSIGNED_1_BYTE, + .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(uint8_t), .is_array = NO_ARRAY, - .tlv_type = 0x05, + .tlv_type = 0x11, .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, - bSubslotSize), + std_as_opr_intf_desc_valid), }, { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct usb_interface_descriptor_v01), .is_array = NO_ARRAY, - .tlv_type = 0x06, + .tlv_type = 0x11, .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, std_as_opr_intf_desc), .ei_array = usb_interface_descriptor_v01_ei, }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x12, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_data_ep_desc_valid), + }, { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct usb_endpoint_descriptor_v01), .is_array = NO_ARRAY, - .tlv_type = 0x07, + .tlv_type = 0x12, .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, std_as_data_ep_desc), .ei_array = usb_endpoint_descriptor_v01_ei, }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x13, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_sync_ep_desc_valid), + }, { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct usb_endpoint_descriptor_v01), .is_array = NO_ARRAY, - .tlv_type = 0x08, + .tlv_type = 0x13, .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, std_as_sync_ep_desc), .ei_array = usb_endpoint_descriptor_v01_ei, }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x14, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_audio_spec_revision_valid), + }, + { + .data_type = QMI_UNSIGNED_2_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint16_t), + .is_array = NO_ARRAY, + .tlv_type = 0x14, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_audio_spec_revision), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x15, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + data_path_delay_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x15, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + data_path_delay), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x16, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_audio_subslot_size_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x16, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_audio_subslot_size), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x17, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + xhci_mem_info_valid), + }, { .data_type = QMI_STRUCT, .elem_len = 1, .elem_size = sizeof(struct apps_mem_info_v01), .is_array = NO_ARRAY, - .tlv_type = 0x09, + .tlv_type = 0x17, .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, xhci_mem_info), .ei_array = apps_mem_info_v01_ei, }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x18, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + interrupter_num_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x18, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + interrupter_num), + }, { .data_type = QMI_EOTI, .is_array = NO_ARRAY, diff --git a/sound/usb/usb_audio_qmi_v01.h b/sound/usb/usb_audio_qmi_v01.h index 7ad1ab8a61a92..aa1018a22105b 100644 --- a/sound/usb/usb_audio_qmi_v01.h +++ b/sound/usb/usb_audio_qmi_v01.h @@ -13,7 +13,7 @@ #ifndef USB_QMI_V01_H #define USB_QMI_V01_H -#define UAUDIO_STREAM_SERVICE_ID_V01 0x41C +#define UAUDIO_STREAM_SERVICE_ID_V01 0x41D #define UAUDIO_STREAM_SERVICE_VERS_V01 0x01 #define QMI_UAUDIO_STREAM_RESP_V01 0x0001 @@ -58,46 +58,93 @@ struct usb_interface_descriptor_v01 { uint8_t iInterface; }; +enum usb_audio_stream_status_enum_v01 { + USB_AUDIO_STREAM_STATUS_ENUM_MIN_VAL_V01 = INT_MIN, + USB_AUDIO_STREAM_REQ_SUCCESS_V01 = 0, + USB_AUDIO_STREAM_REQ_FAILURE_V01 = 1, + USB_AUDIO_STREAM_REQ_FAILURE_NOT_FOUND_V01 = 2, + USB_AUDIO_STREAM_REQ_FAILURE_INVALID_PARAM_V01 = 3, + USB_AUDIO_STREAM_REQ_FAILURE_MEMALLOC_V01 = 4, + USB_AUDIO_STREAM_STATUS_ENUM_MAX_VAL_V01 = INT_MAX, +}; + +enum usb_audio_device_indication_enum_v01 { + USB_AUDIO_DEVICE_INDICATION_ENUM_MIN_VAL_V01 = INT_MIN, + USB_AUDIO_DEV_CONNECT_V01 = 0, + USB_AUDIO_DEV_DISCONNECT_V01 = 1, + USB_AUDIO_DEV_SUSPEND_V01 = 2, + USB_AUDIO_DEV_RESUME_V01 = 3, + USB_AUDIO_DEVICE_INDICATION_ENUM_MAX_VAL_V01 = INT_MAX, +}; + struct qmi_uaudio_stream_req_msg_v01 { - uint32_t priv_data; uint8_t enable; uint32_t usb_token; + uint8_t audio_format_valid; uint32_t audio_format; + uint8_t number_of_ch_valid; uint32_t number_of_ch; + uint8_t bit_rate_valid; uint32_t bit_rate; + uint8_t xfer_buff_size_valid; uint32_t xfer_buff_size; }; -#define QMI_UAUDIO_STREAM_REQ_MSG_V01_MAX_MSG_LEN 46 +#define QMI_UAUDIO_STREAM_REQ_MSG_V01_MAX_MSG_LEN 39 extern struct elem_info qmi_uaudio_stream_req_msg_v01_ei[]; struct qmi_uaudio_stream_resp_msg_v01 { - uint32_t priv_data; - uint32_t status; + struct qmi_response_type_v01 resp; + uint8_t status_valid; + enum usb_audio_stream_status_enum_v01 status; + uint8_t internal_status_valid; + uint32_t internal_status; + uint8_t slot_id_valid; uint32_t slot_id; - uint8_t bSubslotSize; + uint8_t usb_token_valid; + uint32_t usb_token; + uint8_t std_as_opr_intf_desc_valid; struct usb_interface_descriptor_v01 std_as_opr_intf_desc; + uint8_t std_as_data_ep_desc_valid; struct usb_endpoint_descriptor_v01 std_as_data_ep_desc; + uint8_t std_as_sync_ep_desc_valid; struct usb_endpoint_descriptor_v01 std_as_sync_ep_desc; - uint8_t bDelay; - uint16_t bcdADC; + uint8_t usb_audio_spec_revision_valid; + uint16_t usb_audio_spec_revision; + uint8_t data_path_delay_valid; + uint8_t data_path_delay; + uint8_t usb_audio_subslot_size_valid; + uint8_t usb_audio_subslot_size; + uint8_t xhci_mem_info_valid; struct apps_mem_info_v01 xhci_mem_info; + uint8_t interrupter_num_valid; uint8_t interrupter_num; }; -#define QMI_UAUDIO_STREAM_RESP_MSG_V01_MAX_MSG_LEN 177 +#define QMI_UAUDIO_STREAM_RESP_MSG_V01_MAX_MSG_LEN 191 extern struct elem_info qmi_uaudio_stream_resp_msg_v01_ei[]; struct qmi_uaudio_stream_ind_msg_v01 { - uint32_t usb_token; - uint32_t priv_data; - uint32_t status; + enum usb_audio_device_indication_enum_v01 dev_event; uint32_t slot_id; - uint8_t bSubslotSize; + uint8_t usb_token_valid; + uint32_t usb_token; + uint8_t std_as_opr_intf_desc_valid; struct usb_interface_descriptor_v01 std_as_opr_intf_desc; + uint8_t std_as_data_ep_desc_valid; struct usb_endpoint_descriptor_v01 std_as_data_ep_desc; + uint8_t std_as_sync_ep_desc_valid; struct usb_endpoint_descriptor_v01 std_as_sync_ep_desc; + uint8_t usb_audio_spec_revision_valid; + uint16_t usb_audio_spec_revision; + uint8_t data_path_delay_valid; + uint8_t data_path_delay; + uint8_t usb_audio_subslot_size_valid; + uint8_t usb_audio_subslot_size; + uint8_t xhci_mem_info_valid; struct apps_mem_info_v01 xhci_mem_info; + uint8_t interrupter_num_valid; + uint8_t interrupter_num; }; -#define QMI_UAUDIO_STREAM_IND_MSG_V01_MAX_MSG_LEN 171 +#define QMI_UAUDIO_STREAM_IND_MSG_V01_MAX_MSG_LEN 177 extern struct elem_info qmi_uaudio_stream_ind_msg_v01_ei[]; #endif From 094eb3937f4d1a682fb9f1949cf200c3572f4d4b Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 16 Aug 2016 15:17:08 -0700 Subject: [PATCH 0354/1015] sound: usb: Treat find format failure as error This allows to check if requested format is supported by usb audio headset by looking at dmesg log. Change-Id: I3051dd49a1289e4ab46bb59b3537c664a37c3ee5 Signed-off-by: Hemant Kumar --- sound/usb/pcm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 17b3507772fe4..ec214f8e68036 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -547,7 +547,7 @@ int snd_usb_enable_audio_stream(struct snd_usb_substream *subs, snd_usb_autoresume(subs->stream->chip); fmt = find_format(subs); if (!fmt) { - dev_dbg(&subs->dev->dev, + dev_err(&subs->dev->dev, "cannot set format: format = %#x, rate = %d, channels = %d\n", subs->pcm_format, subs->cur_rate, subs->channels); return -EINVAL; From fb1bc69c82e9959412f47cfa9985b500441e6de7 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 22 Aug 2016 19:31:35 -0700 Subject: [PATCH 0355/1015] sound: usb: Add NULL check on return value of iommu_domain_alloc() Upon allocation failure iommu_domain_alloc() returns NULL. Driver is not checking for NULL value, which leads to NULL pointer dereference later. Change-Id: I9788412af3a34aca8fa8519e7ae6f3349f263a1e Signed-off-by: Hemant Kumar --- sound/usb/usb_audio_qmi_svc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index 398238e757a4d..3c45ef413bea1 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -1007,8 +1007,8 @@ static int uaudio_qmi_plat_probe(struct platform_device *pdev) } uaudio_qdev->domain = iommu_domain_alloc(msm_iommu_get_bus(&pdev->dev)); - if (!uaudio_qdev) { - dev_err(&pdev->dev, "failed to callocate iommu domin\n"); + if (!uaudio_qdev->domain) { + dev_err(&pdev->dev, "failed to callocate iommu domain\n"); return -ENODEV; } From 1a00ee0ca191722e378aa9261bb52a24d1b52274 Mon Sep 17 00:00:00 2001 From: Vamsi Krishna Samavedam Date: Tue, 13 Sep 2016 14:09:37 -0700 Subject: [PATCH 0356/1015] sound: usb: Send explicit device disconnect to clients Explicitly send device disconnect notification to client so that client can disable audio streams. This will in turn enable sound usb driver to release usb device and notify device removal to user-space. User-space will clean up audio session. Without this change sound usb driver is blocking usb device release till audio streams are disabled. However, audio streams are only disabled when user-space cleans up audio session on usb device removal which is blocked. This change is trying to fix this deadlock condition by notifying device disconnect to clients explicitly. Change-Id: I7e5a8aca84a7a620bb61eb0ace8a6b6c622f89de Signed-off-by: Vamsi Krishna Samavedam --- sound/usb/card.c | 5 +++-- sound/usb/usb_audio_qmi_svc.c | 42 +++++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/sound/usb/card.c b/sound/usb/card.c index 4c73602653490..b2d3a9801693c 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -681,6 +681,9 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, chip->shutdown = 1; up_write(&chip->shutdown_rwsem); + if (chip->disconnect_cb) + chip->disconnect_cb(chip); + mutex_lock(®ister_mutex); if (!was_shutdown) { struct snd_usb_endpoint *ep; @@ -708,8 +711,6 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, if (chip->num_interfaces <= 0) { usb_chip[chip->index] = NULL; mutex_unlock(®ister_mutex); - if (chip->disconnect_cb) - chip->disconnect_cb(chip); snd_card_free_when_closed(card); } else { mutex_unlock(®ister_mutex); diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index 3c45ef413bea1..2bba4ebdba973 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -134,6 +134,12 @@ static struct msg_desc uaudio_stream_resp_desc = { .ei_array = qmi_uaudio_stream_resp_msg_v01_ei, }; +static struct msg_desc uaudio_stream_ind_desc = { + .max_msg_len = QMI_UAUDIO_STREAM_IND_MSG_V01_MAX_MSG_LEN, + .msg_id = QMI_UADUIO_STREAM_IND_V01, + .ei_array = qmi_uaudio_stream_ind_msg_v01_ei, +}; + enum mem_type { MEM_EVENT_RING, MEM_DCBA, @@ -643,29 +649,47 @@ void uaudio_disconnect_cb(struct snd_usb_audio *chip) int ret, if_idx; struct uaudio_dev *dev; int card_num = chip->card_num; + struct uaudio_qmi_svc *svc = uaudio_svc; + struct qmi_uaudio_stream_ind_msg_v01 disconnect_ind = {0}; pr_debug("%s: for card# %d\n", __func__, card_num); - mutex_lock(&chip->dev_lock); if (card_num >= SNDRV_CARDS) { pr_err("%s: invalid card number\n", __func__); - goto done; + return; } + mutex_lock(&chip->dev_lock); dev = &uadev[card_num]; + + /* clean up */ + if (!dev->udev) { + pr_debug("%s: no clean up required\n", __func__); + goto done; + } + if (atomic_read(&dev->in_use)) { + mutex_unlock(&chip->dev_lock); + + pr_debug("%s: sending qmi indication disconnect\n", __func__); + disconnect_ind.dev_event = USB_AUDIO_DEV_DISCONNECT_V01; + disconnect_ind.slot_id = dev->udev->slot_id; + ret = qmi_send_ind(svc->uaudio_svc_hdl, svc->curr_conn, + &uaudio_stream_ind_desc, &disconnect_ind, + sizeof(disconnect_ind)); + if (ret < 0) { + pr_err("%s: qmi send failed wiht err: %d\n", + __func__, ret); + return; + } + ret = wait_event_interruptible(dev->disconnect_wq, !atomic_read(&dev->in_use)); if (ret < 0) { pr_debug("%s: failed with ret %d\n", __func__, ret); - goto done; + return; } - } - - /* clean up */ - if (!dev->udev) { - pr_debug("%s: no clean up required\n", __func__); - goto done; + mutex_lock(&chip->dev_lock); } /* free xfer buffer and unmap xfer ring and buf per interface */ From 90c8d0f13c54ecedcd8b8a4e900f996569dde74e Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 10 Oct 2016 16:49:34 -0700 Subject: [PATCH 0357/1015] sound: usb: Increase maximum transfer buffer limit In order to support higher bit rate like 384Khz higher buffer sizes are required. Hence change the max limit from 2 * PAGE_SIZE to 24 * PAGE_SIZE. Change-Id: I9d57f3011fee086b2d54997d85bc9a37ccc07e4a Signed-off-by: Hemant Kumar --- sound/usb/usb_audio_qmi_svc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index 2bba4ebdba973..39b71ef7a2392 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -50,7 +50,7 @@ #define IOVA_XFER_RING_MAX (IOVA_XFER_BUF_BASE - PAGE_SIZE) #define IOVA_XFER_BUF_MAX (0xfffff000 - PAGE_SIZE) -#define MAX_XFER_BUFF_LEN (2 * PAGE_SIZE) +#define MAX_XFER_BUFF_LEN (24 * PAGE_SIZE) struct iova_info { struct list_head list; From 7e66766ef23a80a07ca26c728d1a1bb4afe966f6 Mon Sep 17 00:00:00 2001 From: Ajay Agarwal Date: Tue, 25 Oct 2016 16:34:35 +0530 Subject: [PATCH 0358/1015] sound: usb: Remove IOMMU support from USB Audio QMI Service Driver Most targets using 3.18 kernel do not require IOMMU support. In this particular case, LPASS can access the DDR region allocated by the APSS. Thus, this change removes the IOMMU support from the USB Audio QMI Service Driver. Change-Id: Ifd213b9a4b20c21a81078f43cfeab56dde802648 Signed-off-by: Ajay Agarwal --- arch/arm/boot/dts/qcom/msm8953.dtsi | 5 + sound/usb/usb_audio_qmi_svc.c | 429 +--------------------------- 2 files changed, 19 insertions(+), 415 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8953.dtsi b/arch/arm/boot/dts/qcom/msm8953.dtsi index 4bd9f58c738ba..d5596f34b23eb 100644 --- a/arch/arm/boot/dts/qcom/msm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953.dtsi @@ -2261,6 +2261,11 @@ }; + usb_audio_qmi_dev { + compatible = "qcom,usb-audio-qmi-dev"; + qcom,usb-audio-intr-num = <2>; + }; + dbm_1p5: dbm@70f8000 { compatible = "qcom,usb-dbm-1p5"; reg = <0x070f8000 0x300>; diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index 39b71ef7a2392..9944c8713e2d4 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -23,9 +23,8 @@ #include #include #include +#include #include -#include -#include #include #include "usbaudio.h" @@ -38,33 +37,9 @@ #define SND_PCM_DEV_NUM_MASK 0xff00 #define SND_PCM_STREAM_DIRECTION 0xff -#define PREPEND_SID_TO_IOVA(iova, sid) (u64)(((u64)(iova)) | \ - (((u64)sid) << 32)) - -/* event ring iova base address */ -#define IOVA_BASE 0x1000 - -#define IOVA_DCBA_BASE 0x2000 -#define IOVA_XFER_RING_BASE (IOVA_DCBA_BASE + PAGE_SIZE * (SNDRV_CARDS + 1)) -#define IOVA_XFER_BUF_BASE (IOVA_XFER_RING_BASE + PAGE_SIZE * SNDRV_CARDS * 32) -#define IOVA_XFER_RING_MAX (IOVA_XFER_BUF_BASE - PAGE_SIZE) -#define IOVA_XFER_BUF_MAX (0xfffff000 - PAGE_SIZE) - #define MAX_XFER_BUFF_LEN (24 * PAGE_SIZE) -struct iova_info { - struct list_head list; - unsigned long start_iova; - size_t size; - bool in_use; -}; - struct intf_info { - unsigned long data_xfer_ring_va; - size_t data_xfer_ring_size; - unsigned long sync_xfer_ring_va; - size_t sync_xfer_ring_size; - unsigned long xfer_buf_va; size_t xfer_buf_size; phys_addr_t xfer_buf_pa; u8 *xfer_buf; @@ -76,8 +51,6 @@ struct uaudio_dev { unsigned int card_num; atomic_t in_use; struct kref kref; - unsigned long dcba_iova; - size_t dcba_size; wait_queue_head_t disconnect_wq; /* interface specific */ @@ -89,20 +62,8 @@ static struct uaudio_dev uadev[SNDRV_CARDS]; struct uaudio_qmi_dev { struct device *dev; - u32 sid; u32 intr_num; - struct iommu_domain *domain; - - /* list to keep track of available iova */ - struct list_head dcba_list; - size_t dcba_iova_size; - unsigned long curr_dcba_iova; - struct list_head xfer_ring_list; - size_t xfer_ring_iova_size; - unsigned long curr_xfer_ring_iova; - struct list_head xfer_buf_list; - size_t xfer_buf_iova_size; - unsigned long curr_xfer_buf_iova; + /* bit fields representing pcm card enabled */ unsigned long card_slot; /* cache event ring phys addr */ @@ -140,228 +101,6 @@ static struct msg_desc uaudio_stream_ind_desc = { .ei_array = qmi_uaudio_stream_ind_msg_v01_ei, }; -enum mem_type { - MEM_EVENT_RING, - MEM_DCBA, - MEM_XFER_RING, - MEM_XFER_BUF, -}; - -static unsigned long uaudio_get_iova(unsigned long *curr_iova, - size_t *curr_iova_size, struct list_head *head, size_t size) -{ - struct iova_info *info, *new_info = NULL; - struct list_head *curr_head; - unsigned long va = 0; - size_t tmp_size = size; - bool found = false; - - if (size % PAGE_SIZE) { - pr_err("%s: size %zu is not page size multiple\n", __func__, - size); - goto done; - } - - if (size > *curr_iova_size) { - pr_err("%s: size %zu > curr size %zu\n", __func__, size, - *curr_iova_size); - goto done; - } - if (*curr_iova_size == 0) { - pr_err("%s: iova mapping is full\n", __func__); - goto done; - } - - list_for_each_entry(info, head, list) { - /* exact size iova_info */ - if (!info->in_use && info->size == size) { - info->in_use = true; - va = info->start_iova; - *curr_iova_size -= size; - found = true; - pr_debug("%s: exact size :%zu found\n", __func__, size); - goto done; - } else if (!info->in_use && tmp_size >= info->size) { - if (!new_info) - new_info = info; - pr_debug("%s: partial size: %zu found\n", __func__, - info->size); - tmp_size -= info->size; - if (tmp_size) - continue; - - va = new_info->start_iova; - for (curr_head = &new_info->list; curr_head != - &info->list; curr_head = curr_head->next) { - new_info = list_entry(curr_head, struct - iova_info, list); - new_info->in_use = true; - } - info->in_use = true; - *curr_iova_size -= size; - found = true; - goto done; - } else { - /* iova region in use */ - new_info = NULL; - tmp_size = size; - } - } - - info = kzalloc(sizeof(struct iova_info), GFP_KERNEL); - if (!info) { - va = 0; - goto done; - } - - va = info->start_iova = *curr_iova; - info->size = size; - info->in_use = true; - *curr_iova += size; - *curr_iova_size -= size; - found = true; - list_add_tail(&info->list, head); - -done: - if (!found) - pr_err("%s: unable to find %zu size iova\n", __func__, size); - else - pr_debug("%s: va:%lu curr_iova:%lu curr_iova_size:%zu\n", - __func__, va, *curr_iova, *curr_iova_size); - - return va; -} - -static unsigned long uaudio_iommu_map(enum mem_type mtype, phys_addr_t pa, - size_t size) -{ - unsigned long va = 0; - bool map = true; - int ret; - - switch (mtype) { - case MEM_EVENT_RING: - va = IOVA_BASE; - /* er already mapped */ - if (uaudio_qdev->er_phys_addr == pa) - map = false; - break; - case MEM_DCBA: - va = uaudio_get_iova(&uaudio_qdev->curr_dcba_iova, - &uaudio_qdev->dcba_iova_size, &uaudio_qdev->dcba_list, size); - break; - case MEM_XFER_RING: - va = uaudio_get_iova(&uaudio_qdev->curr_xfer_ring_iova, - &uaudio_qdev->xfer_ring_iova_size, &uaudio_qdev->xfer_ring_list, - size); - break; - case MEM_XFER_BUF: - va = uaudio_get_iova(&uaudio_qdev->curr_xfer_buf_iova, - &uaudio_qdev->xfer_buf_iova_size, &uaudio_qdev->xfer_buf_list, - size); - break; - default: - pr_err("%s: unknown mem type %d\n", __func__, mtype); - } - - if (!va) - map = false; - - if (!map) - goto done; - - pr_debug("%s: map pa %pa to iova %lu for memtype %d\n", __func__, &pa, - va, mtype); - ret = iommu_map(uaudio_qdev->domain, va, pa, size, - IOMMU_READ | IOMMU_WRITE | IOMMU_DEVICE); - if (ret) - pr_err("%s:failed to map pa:%pa iova:%lu memtype:%d ret:%d\n", - __func__, &pa, va, mtype, ret); -done: - return va; -} - -static void uaudio_put_iova(unsigned long va, size_t size, struct list_head - *head, size_t *curr_iova_size) -{ - struct iova_info *info; - size_t tmp_size = size; - bool found = false; - - list_for_each_entry(info, head, list) { - if (info->start_iova == va) { - if (!info->in_use) { - pr_err("%s: va %lu is not in use\n", __func__, - va); - return; - } - found = true; - info->in_use = false; - if (info->size == size) - goto done; - } - - if (found && tmp_size >= info->size) { - info->in_use = false; - tmp_size -= info->size; - if (!tmp_size) - goto done; - } - } - - if (!found) { - pr_err("%s: unable to find the va %lu\n", __func__, va); - return; - } -done: - *curr_iova_size += size; - pr_debug("%s: curr_iova_size %zu\n", __func__, *curr_iova_size); -} - -static void uaudio_iommu_unmap(enum mem_type mtype, unsigned long va, - size_t size) -{ - size_t umap_size; - bool unmap = true; - - if (!va || !size) - return; - - switch (mtype) { - case MEM_EVENT_RING: - if (uaudio_qdev->er_phys_addr) - uaudio_qdev->er_phys_addr = 0; - else - unmap = false; - break; - case MEM_DCBA: - uaudio_put_iova(va, size, &uaudio_qdev->dcba_list, - &uaudio_qdev->dcba_iova_size); - break; - case MEM_XFER_RING: - uaudio_put_iova(va, size, &uaudio_qdev->xfer_ring_list, - &uaudio_qdev->xfer_ring_iova_size); - break; - case MEM_XFER_BUF: - uaudio_put_iova(va, size, &uaudio_qdev->xfer_buf_list, - &uaudio_qdev->xfer_buf_iova_size); - break; - default: - pr_err("%s: unknown mem type %d\n", __func__, mtype); - unmap = false; - } - - if (!unmap) - return; - - pr_debug("%s: unmap iova %lu for memtype %d\n", __func__, va, mtype); - - umap_size = iommu_unmap(uaudio_qdev->domain, va, size); - if (umap_size != size) - pr_err("%s: unmapped size %zu for iova %lu\n", __func__, - umap_size, va); -} - static int prepare_qmi_response(struct snd_usb_substream *subs, struct qmi_uaudio_stream_resp_msg_v01 *resp, u32 xfer_buf_len, int card_num) @@ -379,8 +118,6 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, int protocol; u8 *xfer_buf; u32 len, mult, remainder; - unsigned long va, tr_data_va = 0, tr_sync_va = 0, dcba_va = 0, - xfer_buf_va = 0; phys_addr_t xhci_pa, xfer_buf_pa; iface = usb_ifnum_to_if(subs->dev, subs->interface); @@ -497,13 +234,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, __func__); goto err; } - - va = uaudio_iommu_map(MEM_EVENT_RING, xhci_pa, PAGE_SIZE); - if (!va) - goto err; - - resp->xhci_mem_info.evt_ring.va = PREPEND_SID_TO_IOVA(va, - uaudio_qdev->sid); + resp->xhci_mem_info.evt_ring.va = xhci_pa; resp->xhci_mem_info.evt_ring.pa = xhci_pa; resp->xhci_mem_info.evt_ring.size = PAGE_SIZE; uaudio_qdev->er_phys_addr = xhci_pa; @@ -512,33 +243,15 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, xhci_pa = usb_get_dcba_dma_addr(subs->dev); if (!xhci_pa) { pr_err("%s:failed to get dcba dma address\n", __func__); - goto unmap_er; - } - - if (!uadev[card_num].dcba_iova) { /* mappped per usb device */ - va = uaudio_iommu_map(MEM_DCBA, xhci_pa, PAGE_SIZE); - if (!va) - goto unmap_er; - - uadev[card_num].dcba_iova = va; - uadev[card_num].dcba_size = PAGE_SIZE; + goto err; } - - dcba_va = uadev[card_num].dcba_iova; - resp->xhci_mem_info.dcba.va = PREPEND_SID_TO_IOVA(dcba_va, - uaudio_qdev->sid); + resp->xhci_mem_info.dcba.va = xhci_pa; resp->xhci_mem_info.dcba.pa = xhci_pa; resp->xhci_mem_info.dcba.size = PAGE_SIZE; /* data transfer ring */ xhci_pa = resp->xhci_mem_info.tr_data.pa; - va = uaudio_iommu_map(MEM_XFER_RING, xhci_pa, PAGE_SIZE); - if (!va) - goto unmap_dcba; - - tr_data_va = va; - resp->xhci_mem_info.tr_data.va = PREPEND_SID_TO_IOVA(va, - uaudio_qdev->sid); + resp->xhci_mem_info.tr_data.va = xhci_pa; resp->xhci_mem_info.tr_data.size = PAGE_SIZE; /* sync transfer ring */ @@ -546,13 +259,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, goto skip_sync; xhci_pa = resp->xhci_mem_info.tr_sync.pa; - va = uaudio_iommu_map(MEM_XFER_RING, xhci_pa, PAGE_SIZE); - if (!va) - goto unmap_data; - - tr_sync_va = va; - resp->xhci_mem_info.tr_sync.va = PREPEND_SID_TO_IOVA(va, - uaudio_qdev->sid); + resp->xhci_mem_info.tr_sync.va = xhci_pa; resp->xhci_mem_info.tr_sync.size = PAGE_SIZE; skip_sync: @@ -573,19 +280,11 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, xfer_buf = usb_alloc_coherent(subs->dev, len, GFP_KERNEL, &xfer_buf_pa); if (!xfer_buf) - goto unmap_sync; + goto free_xfer_buf; resp->xhci_mem_info.xfer_buff.pa = xfer_buf_pa; resp->xhci_mem_info.xfer_buff.size = len; - - va = uaudio_iommu_map(MEM_XFER_BUF, xfer_buf_pa, len); - if (!va) - goto unmap_sync; - - xfer_buf_va = va; - resp->xhci_mem_info.xfer_buff.va = PREPEND_SID_TO_IOVA(va, - uaudio_qdev->sid); - + resp->xhci_mem_info.xfer_buff.va = xfer_buf_pa; resp->xhci_mem_info_valid = 1; if (!atomic_read(&uadev[card_num].in_use)) { @@ -598,7 +297,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, uadev[card_num].num_intf, GFP_KERNEL); if (!uadev[card_num].info) { ret = -ENOMEM; - goto unmap_xfer_buf; + goto free_xfer_buf; } uadev[card_num].udev = subs->dev; atomic_set(&uadev[card_num].in_use, 1); @@ -609,17 +308,12 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, if (uadev[card_num].info[subs->interface].in_use) { pr_err("%s interface# %d already in use card# %d\n", __func__, subs->interface, card_num); - goto unmap_xfer_buf; + goto free_xfer_buf; } uadev[card_num].card_num = card_num; - /* cache intf specific info to use it for unmap and free xfer buf */ - uadev[card_num].info[subs->interface].data_xfer_ring_va = tr_data_va; - uadev[card_num].info[subs->interface].data_xfer_ring_size = PAGE_SIZE; - uadev[card_num].info[subs->interface].sync_xfer_ring_va = tr_sync_va; - uadev[card_num].info[subs->interface].sync_xfer_ring_size = PAGE_SIZE; - uadev[card_num].info[subs->interface].xfer_buf_va = xfer_buf_va; + /* cache intf specific info to use it for free xfer buf */ uadev[card_num].info[subs->interface].xfer_buf_pa = xfer_buf_pa; uadev[card_num].info[subs->interface].xfer_buf_size = len; uadev[card_num].info[subs->interface].xfer_buf = xfer_buf; @@ -629,17 +323,8 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, return 0; -unmap_xfer_buf: - uaudio_iommu_unmap(MEM_XFER_BUF, xfer_buf_va, len); -unmap_sync: +free_xfer_buf: usb_free_coherent(subs->dev, len, xfer_buf, xfer_buf_pa); - uaudio_iommu_unmap(MEM_XFER_RING, tr_sync_va, PAGE_SIZE); -unmap_data: - uaudio_iommu_unmap(MEM_XFER_RING, tr_data_va, PAGE_SIZE); -unmap_dcba: - uaudio_iommu_unmap(MEM_DCBA, dcba_va, PAGE_SIZE); -unmap_er: - uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE); err: return ret; } @@ -692,7 +377,7 @@ void uaudio_disconnect_cb(struct snd_usb_audio *chip) mutex_lock(&chip->dev_lock); } - /* free xfer buffer and unmap xfer ring and buf per interface */ + /* free xfer buffer */ for (if_idx = 0; if_idx < dev->num_intf; if_idx++) { if (!dev->info[if_idx].in_use) continue; @@ -700,33 +385,10 @@ void uaudio_disconnect_cb(struct snd_usb_audio *chip) dev->info[if_idx].xfer_buf_size, dev->info[if_idx].xfer_buf, dev->info[if_idx].xfer_buf_pa); - - uaudio_iommu_unmap(MEM_XFER_RING, - dev->info[if_idx].data_xfer_ring_va, - dev->info[if_idx].data_xfer_ring_size); - dev->info[if_idx].data_xfer_ring_va = 0; - dev->info[if_idx].data_xfer_ring_size = 0; - - uaudio_iommu_unmap(MEM_XFER_RING, - dev->info[if_idx].sync_xfer_ring_va, - dev->info[if_idx].sync_xfer_ring_size); - dev->info[if_idx].sync_xfer_ring_va = 0; - dev->info[if_idx].sync_xfer_ring_size = 0; - - uaudio_iommu_unmap(MEM_XFER_BUF, - dev->info[if_idx].xfer_buf_va, - dev->info[if_idx].xfer_buf_size); - dev->info[if_idx].xfer_buf_va = 0; dev->info[if_idx].xfer_buf_size = 0; pr_debug("%s: release resources: intf# %d card# %d\n", __func__, if_idx, card_num); } - - /* iommu_unmap dcba iova for a usb device */ - uaudio_iommu_unmap(MEM_DCBA, dev->dcba_iova, dev->dcba_size); - - dev->dcba_iova = 0; - dev->dcba_size = 0; dev->num_intf = 0; /* free interface info */ @@ -737,7 +399,6 @@ void uaudio_disconnect_cb(struct snd_usb_audio *chip) /* all audio devices are disconnected */ if (!uaudio_qdev->card_slot) { - uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE); usb_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); pr_debug("%s: all audio devices disconnected\n", __func__); } @@ -760,7 +421,6 @@ static void uaudio_dev_release(struct kref *kref) /* all audio devices are disconnected */ if (!uaudio_qdev->card_slot) { usb_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); - uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE); pr_debug("%s: all audio devices disconnected\n", __func__); } @@ -837,23 +497,6 @@ static int handle_uaudio_stream_req(void *req_h, void *req) if (intf_num >= 0) { mutex_lock(&chip->dev_lock); info = &uadev[pcm_card_num].info[intf_num]; - uaudio_iommu_unmap(MEM_XFER_RING, - info->data_xfer_ring_va, - info->data_xfer_ring_size); - info->data_xfer_ring_va = 0; - info->data_xfer_ring_size = 0; - - uaudio_iommu_unmap(MEM_XFER_RING, - info->sync_xfer_ring_va, - info->sync_xfer_ring_size); - info->sync_xfer_ring_va = 0; - info->sync_xfer_ring_size = 0; - - uaudio_iommu_unmap(MEM_XFER_BUF, - info->xfer_buf_va, - info->xfer_buf_size); - info->xfer_buf_va = 0; - usb_free_coherent(uadev[pcm_card_num].udev, info->xfer_buf_size, info->xfer_buf, @@ -1016,61 +659,17 @@ static int uaudio_qmi_plat_probe(struct platform_device *pdev) uaudio_qdev->dev = &pdev->dev; - ret = of_property_read_u32(node, "qcom,usb-audio-stream-id", - &uaudio_qdev->sid); - if (ret) { - dev_err(&pdev->dev, "failed to read sid.\n"); - return -ENODEV; - } - ret = of_property_read_u32(node, "qcom,usb-audio-intr-num", &uaudio_qdev->intr_num); if (ret) { dev_err(&pdev->dev, "failed to read intr num.\n"); return -ENODEV; } - - uaudio_qdev->domain = iommu_domain_alloc(msm_iommu_get_bus(&pdev->dev)); - if (!uaudio_qdev->domain) { - dev_err(&pdev->dev, "failed to callocate iommu domain\n"); - return -ENODEV; - } - - /* attach to external processor iommu */ - ret = iommu_attach_device(uaudio_qdev->domain, &pdev->dev); - if (ret) { - dev_err(&pdev->dev, "failed to attach device ret = %d\n", ret); - goto free_domain; - } - - /* initialize dcba, xfer ring and xfer buf iova list */ - INIT_LIST_HEAD(&uaudio_qdev->dcba_list); - uaudio_qdev->curr_dcba_iova = IOVA_DCBA_BASE; - uaudio_qdev->dcba_iova_size = SNDRV_CARDS * PAGE_SIZE; - - INIT_LIST_HEAD(&uaudio_qdev->xfer_ring_list); - uaudio_qdev->curr_xfer_ring_iova = IOVA_XFER_RING_BASE; - uaudio_qdev->xfer_ring_iova_size = - IOVA_XFER_RING_MAX - IOVA_XFER_RING_BASE; - - INIT_LIST_HEAD(&uaudio_qdev->xfer_buf_list); - uaudio_qdev->curr_xfer_buf_iova = IOVA_XFER_BUF_BASE; - uaudio_qdev->xfer_buf_iova_size = - IOVA_XFER_BUF_MAX - IOVA_XFER_BUF_BASE; - return 0; - -free_domain: - iommu_domain_free(uaudio_qdev->domain); - return ret; } static int uaudio_qmi_plat_remove(struct platform_device *pdev) { - iommu_detach_device(uaudio_qdev->domain, &pdev->dev); - iommu_domain_free(uaudio_qdev->domain); - uaudio_qdev->domain = NULL; - return 0; } From 48d8248e066a99043b7957dfdf5682868b68ec52 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 7 Nov 2016 22:13:41 +0530 Subject: [PATCH 0359/1015] sound: usb: Map audio format received from QMI client Audio format received from QMI client is not one to one mapped to pcm format defined by ALSA driver. This causes format mismatch when QMI client request a format not defined by ALSA driver. Fix this by creating a mapping between two formats. Change-Id: I0f08dd57fa39d385369ef4886d12e8ea77c6ebc0 Signed-off-by: Hemant Kumar --- sound/usb/usb_audio_qmi_svc.c | 77 ++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index 9944c8713e2d4..b1adbcc6035d8 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -101,6 +101,27 @@ static struct msg_desc uaudio_stream_ind_desc = { .ei_array = qmi_uaudio_stream_ind_msg_v01_ei, }; +enum usb_qmi_audio_format { + USB_QMI_PCM_FORMAT_S8 = 0, + USB_QMI_PCM_FORMAT_U8, + USB_QMI_PCM_FORMAT_S16_LE, + USB_QMI_PCM_FORMAT_S16_BE, + USB_QMI_PCM_FORMAT_U16_LE, + USB_QMI_PCM_FORMAT_U16_BE, + USB_QMI_PCM_FORMAT_S24_LE, + USB_QMI_PCM_FORMAT_S24_BE, + USB_QMI_PCM_FORMAT_U24_LE, + USB_QMI_PCM_FORMAT_U24_BE, + USB_QMI_PCM_FORMAT_S24_3LE, + USB_QMI_PCM_FORMAT_S24_3BE, + USB_QMI_PCM_FORMAT_U24_3LE, + USB_QMI_PCM_FORMAT_U24_3BE, + USB_QMI_PCM_FORMAT_S32_LE, + USB_QMI_PCM_FORMAT_S32_BE, + USB_QMI_PCM_FORMAT_U32_LE, + USB_QMI_PCM_FORMAT_U32_BE, +}; + static int prepare_qmi_response(struct snd_usb_substream *subs, struct qmi_uaudio_stream_resp_msg_v01 *resp, u32 xfer_buf_len, int card_num) @@ -427,6 +448,51 @@ static void uaudio_dev_release(struct kref *kref) wake_up(&dev->disconnect_wq); } +/* maps audio format received over QMI to asound.h based pcm format */ +int map_pcm_format(unsigned int fmt_received) +{ + switch (fmt_received) { + case USB_QMI_PCM_FORMAT_S8: + return SNDRV_PCM_FORMAT_S8; + case USB_QMI_PCM_FORMAT_U8: + return SNDRV_PCM_FORMAT_U8; + case USB_QMI_PCM_FORMAT_S16_LE: + return SNDRV_PCM_FORMAT_S16_LE; + case USB_QMI_PCM_FORMAT_S16_BE: + return SNDRV_PCM_FORMAT_S16_BE; + case USB_QMI_PCM_FORMAT_U16_LE: + return SNDRV_PCM_FORMAT_U16_LE; + case USB_QMI_PCM_FORMAT_U16_BE: + return SNDRV_PCM_FORMAT_U16_BE; + case USB_QMI_PCM_FORMAT_S24_LE: + return SNDRV_PCM_FORMAT_S24_LE; + case USB_QMI_PCM_FORMAT_S24_BE: + return SNDRV_PCM_FORMAT_S24_BE; + case USB_QMI_PCM_FORMAT_U24_LE: + return SNDRV_PCM_FORMAT_U24_LE; + case USB_QMI_PCM_FORMAT_U24_BE: + return SNDRV_PCM_FORMAT_U24_BE; + case USB_QMI_PCM_FORMAT_S24_3LE: + return SNDRV_PCM_FORMAT_S24_3LE; + case USB_QMI_PCM_FORMAT_S24_3BE: + return SNDRV_PCM_FORMAT_S24_3BE; + case USB_QMI_PCM_FORMAT_U24_3LE: + return SNDRV_PCM_FORMAT_U24_3LE; + case USB_QMI_PCM_FORMAT_U24_3BE: + return SNDRV_PCM_FORMAT_U24_3BE; + case USB_QMI_PCM_FORMAT_S32_LE: + return SNDRV_PCM_FORMAT_S32_LE; + case USB_QMI_PCM_FORMAT_S32_BE: + return SNDRV_PCM_FORMAT_S32_BE; + case USB_QMI_PCM_FORMAT_U32_LE: + return SNDRV_PCM_FORMAT_U32_LE; + case USB_QMI_PCM_FORMAT_U32_BE: + return SNDRV_PCM_FORMAT_U32_BE; + default: + return -EINVAL; + } +} + static int handle_uaudio_stream_req(void *req_h, void *req) { struct qmi_uaudio_stream_req_msg_v01 *req_msg; @@ -435,6 +501,7 @@ static int handle_uaudio_stream_req(void *req_h, void *req) struct snd_usb_audio *chip = NULL; struct uaudio_qmi_svc *svc = uaudio_svc; struct intf_info *info; + int pcm_format; u8 pcm_card_num, pcm_dev_num, direction; int intf_num = -1, ret = 0; @@ -462,6 +529,14 @@ static int handle_uaudio_stream_req(void *req_h, void *req) goto response; } + pcm_format = map_pcm_format(req_msg->audio_format); + if (pcm_format == -EINVAL) { + pr_err("%s: unsupported pcm format received %d\n", + __func__, req_msg->audio_format); + ret = -EINVAL; + goto response; + } + subs = find_snd_usb_substream(pcm_card_num, pcm_dev_num, direction, &chip, uaudio_disconnect_cb); if (!subs || !chip || chip->shutdown) { @@ -480,7 +555,7 @@ static int handle_uaudio_stream_req(void *req_h, void *req) goto response; } - subs->pcm_format = req_msg->audio_format; + subs->pcm_format = pcm_format; subs->channels = req_msg->number_of_ch; subs->cur_rate = req_msg->bit_rate; From 8acf55649abff5120352a3fe9c772cbf3ebc6888 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 31 Oct 2016 19:22:47 -0700 Subject: [PATCH 0360/1015] usb: xhci: Clear event handler busy flag upon event ring cleanup There is a possibility of unacknowledged pending interrupt at the time of secondary event ring cleanup. As a result xHC does not generate any interrupt further because event handler busy flag is set. Hence disable interrupter to prevent any further interrupt, acknowledge any pending interrupt and clear event handler busy flag. This allows xHC to generate interrupt after setting up new event ring. Change-Id: I1b1791eacbf7afffd101d56d0ae06fe237b8c076 Signed-off-by: Hemant Kumar --- drivers/usb/host/xhci-mem.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index f953c70a379f3..447c2177e1636 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1795,6 +1795,8 @@ void xhci_free_command(struct xhci_hcd *xhci, int xhci_sec_event_ring_cleanup(struct usb_hcd *hcd, unsigned intr_num) { int size; + u32 iman_reg; + u64 erdp_reg; struct xhci_hcd *xhci = hcd_to_xhci(hcd); struct device *dev = xhci_to_hcd(xhci)->self.controller; @@ -1806,14 +1808,38 @@ int xhci_sec_event_ring_cleanup(struct usb_hcd *hcd, unsigned intr_num) size = sizeof(struct xhci_erst_entry)*(xhci->sec_erst[intr_num].num_entries); - if (xhci->sec_erst[intr_num].entries) + if (xhci->sec_erst[intr_num].entries) { + /* + * disable irq, ack pending interrupt and clear EHB for xHC to + * generate interrupt again when new event ring is setup + */ + iman_reg = + readl_relaxed(&xhci->sec_ir_set[intr_num]->irq_pending); + iman_reg &= ~IMAN_IE; + writel_relaxed(iman_reg, + &xhci->sec_ir_set[intr_num]->irq_pending); + iman_reg = + readl_relaxed(&xhci->sec_ir_set[intr_num]->irq_pending); + if (iman_reg & IMAN_IP) + writel_relaxed(iman_reg, + &xhci->sec_ir_set[intr_num]->irq_pending); + /* make sure IP gets cleared before clearing EHB */ + mb(); + + erdp_reg = xhci_read_64(xhci, + &xhci->sec_ir_set[intr_num]->erst_dequeue); + xhci_write_64(xhci, erdp_reg | ERST_EHB, + &xhci->sec_ir_set[intr_num]->erst_dequeue); + dma_free_coherent(dev, size, xhci->sec_erst[intr_num].entries, xhci->sec_erst[intr_num].erst_dma_addr); - xhci->sec_erst[intr_num].entries = NULL; + xhci->sec_erst[intr_num].entries = NULL; + } xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed SEC ERST#%d", intr_num); if (xhci->sec_event_ring[intr_num]) xhci_ring_free(xhci, xhci->sec_event_ring[intr_num]); + xhci->sec_event_ring[intr_num] = NULL; xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed sec event ring"); From 07068676ca39d389f62fbba0efbb707a0e6c0884 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Wed, 9 Nov 2016 17:06:05 +0530 Subject: [PATCH 0361/1015] sound: usb: Add support to handle QMI client disconnect In case of remote QMI client restart, QMI client disconnect is notified to qmi server. Handle this notification by going over all the active usb audio devices and issue set alt 0 on corresponding active interfaces of device. After this perform usb audio device clean up to unmap xfer buffer. Change-Id: Ie89b06d821c1f968ecc30333654bc3a1466f74e3 Signed-off-by: Hemant Kumar --- sound/usb/usb_audio_qmi_svc.c | 147 +++++++++++++++++++++++----------- 1 file changed, 102 insertions(+), 45 deletions(-) diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index b1adbcc6035d8..bf1600dbf24bd 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -43,6 +43,9 @@ struct intf_info { size_t xfer_buf_size; phys_addr_t xfer_buf_pa; u8 *xfer_buf; + u8 pcm_card_num; + u8 pcm_dev_num; + u8 direction; bool in_use; }; @@ -76,6 +79,7 @@ struct uaudio_qmi_svc { struct qmi_handle *uaudio_svc_hdl; void *curr_conn; struct work_struct recv_msg_work; + struct work_struct qmi_disconnect_work; struct workqueue_struct *uaudio_wq; ktime_t t_request_recvd; ktime_t t_resp_sent; @@ -124,7 +128,7 @@ enum usb_qmi_audio_format { static int prepare_qmi_response(struct snd_usb_substream *subs, struct qmi_uaudio_stream_resp_msg_v01 *resp, u32 xfer_buf_len, - int card_num) + int card_num, int pcm_dev_num) { int ret = -ENODEV; struct usb_interface *iface; @@ -148,6 +152,14 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, goto err; } + if (uadev[card_num].info && + uadev[card_num].info[subs->interface].in_use) { + pr_err("%s interface# %d already in use card# %d\n", __func__, + subs->interface, card_num); + ret = -EBUSY; + goto err; + } + alts = &iface->altsetting[subs->altset_idx]; altsd = get_iface_desc(alts); protocol = altsd->bInterfaceProtocol; @@ -326,18 +338,15 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, kref_get(&uadev[card_num].kref); } - if (uadev[card_num].info[subs->interface].in_use) { - pr_err("%s interface# %d already in use card# %d\n", __func__, - subs->interface, card_num); - goto free_xfer_buf; - } - uadev[card_num].card_num = card_num; /* cache intf specific info to use it for free xfer buf */ uadev[card_num].info[subs->interface].xfer_buf_pa = xfer_buf_pa; uadev[card_num].info[subs->interface].xfer_buf_size = len; uadev[card_num].info[subs->interface].xfer_buf = xfer_buf; + uadev[card_num].info[subs->interface].pcm_card_num = card_num; + uadev[card_num].info[subs->interface].pcm_dev_num = pcm_dev_num; + uadev[card_num].info[subs->interface].direction = subs->direction; uadev[card_num].info[subs->interface].in_use = true; set_bit(card_num, &uaudio_qdev->card_slot); @@ -350,9 +359,50 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, return ret; } +static void uaudio_dev_intf_cleanup(struct usb_device *udev, + struct intf_info *info) +{ + usb_free_coherent(udev, info->xfer_buf_size, + info->xfer_buf, info->xfer_buf_pa); + info->xfer_buf_size = 0; + info->xfer_buf = NULL; + info->xfer_buf_pa = 0; + + info->in_use = false; +} + +static void uaudio_dev_cleanup(struct uaudio_dev *dev) +{ + int if_idx; + + /* free xfer buffer */ + for (if_idx = 0; if_idx < dev->num_intf; if_idx++) { + if (!dev->info[if_idx].in_use) + continue; + uaudio_dev_intf_cleanup(dev->udev, &dev->info[if_idx]); + pr_debug("%s: release resources: intf# %d card# %d\n", __func__, + if_idx, dev->card_num); + } + dev->num_intf = 0; + + /* free interface info */ + kfree(dev->info); + dev->info = NULL; + + clear_bit(dev->card_num, &uaudio_qdev->card_slot); + + /* all audio devices are disconnected */ + if (!uaudio_qdev->card_slot) { + usb_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); + pr_debug("%s: all audio devices disconnected\n", __func__); + } + + dev->udev = NULL; +} + void uaudio_disconnect_cb(struct snd_usb_audio *chip) { - int ret, if_idx; + int ret; struct uaudio_dev *dev; int card_num = chip->card_num; struct uaudio_qmi_svc *svc = uaudio_svc; @@ -398,33 +448,7 @@ void uaudio_disconnect_cb(struct snd_usb_audio *chip) mutex_lock(&chip->dev_lock); } - /* free xfer buffer */ - for (if_idx = 0; if_idx < dev->num_intf; if_idx++) { - if (!dev->info[if_idx].in_use) - continue; - usb_free_coherent(dev->udev, - dev->info[if_idx].xfer_buf_size, - dev->info[if_idx].xfer_buf, - dev->info[if_idx].xfer_buf_pa); - dev->info[if_idx].xfer_buf_size = 0; - pr_debug("%s: release resources: intf# %d card# %d\n", __func__, - if_idx, card_num); - } - dev->num_intf = 0; - - /* free interface info */ - kfree(dev->info); - dev->info = NULL; - - clear_bit(card_num, &uaudio_qdev->card_slot); - - /* all audio devices are disconnected */ - if (!uaudio_qdev->card_slot) { - usb_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); - pr_debug("%s: all audio devices disconnected\n", __func__); - } - - dev->udev = NULL; + uaudio_dev_cleanup(dev); done: mutex_unlock(&chip->dev_lock); } @@ -449,7 +473,7 @@ static void uaudio_dev_release(struct kref *kref) } /* maps audio format received over QMI to asound.h based pcm format */ -int map_pcm_format(unsigned int fmt_received) +static int map_pcm_format(unsigned int fmt_received) { switch (fmt_received) { case USB_QMI_PCM_FORMAT_S8: @@ -563,7 +587,7 @@ static int handle_uaudio_stream_req(void *req_h, void *req) if (!ret && req_msg->enable) ret = prepare_qmi_response(subs, &resp, req_msg->xfer_buff_size, - pcm_card_num); + pcm_card_num, pcm_dev_num); mutex_unlock(&chip->dev_lock); @@ -572,14 +596,7 @@ static int handle_uaudio_stream_req(void *req_h, void *req) if (intf_num >= 0) { mutex_lock(&chip->dev_lock); info = &uadev[pcm_card_num].info[intf_num]; - usb_free_coherent(uadev[pcm_card_num].udev, - info->xfer_buf_size, - info->xfer_buf, - info->xfer_buf_pa); - info->xfer_buf_size = 0; - info->xfer_buf = NULL; - info->xfer_buf_pa = 0; - info->in_use = false; + uaudio_dev_intf_cleanup(uadev[pcm_card_num].udev, info); pr_debug("%s:release resources: intf# %d card# %d\n", __func__, intf_num, pcm_card_num); mutex_unlock(&chip->dev_lock); @@ -623,6 +640,43 @@ static int uaudio_qmi_svc_connect_cb(struct qmi_handle *handle, return 0; } +static void uaudio_qmi_disconnect_work(struct work_struct *w) +{ + struct intf_info *info; + int idx, if_idx; + struct snd_usb_substream *subs; + struct snd_usb_audio *chip = NULL; + + /* find all active intf for set alt 0 and cleanup usb audio dev */ + for (idx = 0; idx < SNDRV_CARDS; idx++) { + if (!atomic_read(&uadev[idx].in_use)) + continue; + + for (if_idx = 0; if_idx < uadev[idx].num_intf; if_idx++) { + if (!uadev[idx].info || !uadev[idx].info[if_idx].in_use) + continue; + info = &uadev[idx].info[if_idx]; + subs = find_snd_usb_substream(info->pcm_card_num, + info->pcm_dev_num, + info->direction, + &chip, + uaudio_disconnect_cb); + if (!subs || !chip || chip->shutdown) { + pr_debug("%s:no subs for c#%u, dev#%u dir%u\n", + __func__, info->pcm_card_num, + info->pcm_dev_num, + info->direction); + continue; + } + snd_usb_enable_audio_stream(subs, 0); + } + atomic_set(&uadev[idx].in_use, 0); + mutex_lock(&chip->dev_lock); + uaudio_dev_cleanup(&uadev[idx]); + mutex_unlock(&chip->dev_lock); + } +} + static int uaudio_qmi_svc_disconnect_cb(struct qmi_handle *handle, void *conn_h) { @@ -634,6 +688,8 @@ static int uaudio_qmi_svc_disconnect_cb(struct qmi_handle *handle, } svc->curr_conn = NULL; + queue_work(svc->uaudio_wq, &svc->qmi_disconnect_work); + return 0; } @@ -794,6 +850,7 @@ static int uaudio_qmi_svc_init(void) } INIT_WORK(&svc->recv_msg_work, uaudio_qmi_svc_recv_msg); + INIT_WORK(&svc->qmi_disconnect_work, uaudio_qmi_disconnect_work); uaudio_svc = svc; From 23275824dfff494f42286aa7595ef85115d8fea7 Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Tue, 15 Nov 2016 14:55:35 -0800 Subject: [PATCH 0362/1015] msm: camera: eeprom: Validate the power setting size Validate the power setting size before copying. If userspace sends a value which is greater than MAX_POWER_CONFIG, then the driver accesses unintended memory. This change will fix the issue. Crs-Fixed: 1089433 Signed-off-by: Rajesh Bondugula Change-Id: Iaaa6f5b3c1c2ac5b5b38b3ac407d6ae394bba780 --- .../msm/camera_v2/sensor/eeprom/msm_eeprom.c | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c index 1f891ac76c965..32d2e07111551 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c @@ -1402,6 +1402,16 @@ static int eeprom_init_config32(struct msm_eeprom_ctrl_t *e_ctrl, power_info = &(e_ctrl->eboard_info->power_info); + if ((power_setting_array32->size > MAX_POWER_CONFIG) || + (power_setting_array32->size_down > MAX_POWER_CONFIG) || + (!power_setting_array32->size) || + (!power_setting_array32->size_down)) { + pr_err("%s:%d invalid power setting size=%d size_down=%d\n", + __func__, __LINE__, power_setting_array32->size, + power_setting_array32->size_down); + rc = -EINVAL; + goto free_mem; + } msm_eeprom_copy_power_settings_compat( power_setting_array, power_setting_array32); @@ -1416,20 +1426,6 @@ static int eeprom_init_config32(struct msm_eeprom_ctrl_t *e_ctrl, power_info->power_down_setting_size = power_setting_array->size_down; - if ((power_info->power_setting_size > - MAX_POWER_CONFIG) || - (power_info->power_down_setting_size > - MAX_POWER_CONFIG) || - (!power_info->power_down_setting_size) || - (!power_info->power_setting_size)) { - rc = -EINVAL; - pr_err("%s:%d Invalid power setting size :%d, %d\n", - __func__, __LINE__, - power_info->power_setting_size, - power_info->power_down_setting_size); - goto free_mem; - } - if (e_ctrl->i2c_client.cci_client) { e_ctrl->i2c_client.cci_client->i2c_freq_mode = cdata32->cfg.eeprom_info.i2c_freq_mode; From 01efe0852b4affbc6a14bf36c765d40a46b76e35 Mon Sep 17 00:00:00 2001 From: Sudeep Yedalapure Date: Mon, 21 Nov 2016 19:51:15 +0530 Subject: [PATCH 0363/1015] adreno_tz: Fix divide by zero problem in gpu_load_show() If the acc_total value is zero then kernel would crash on div-by-zero. Add better input validation in gpu_load_show() to avoid divide by zero problem. CRs-Fixed: 1092584 Change-Id: I7affbd797bf4b0025f718c757043b36f392dae5b Signed-off-by: Sudeep Yedalapure --- drivers/devfreq/governor_msm_adreno_tz.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/devfreq/governor_msm_adreno_tz.c b/drivers/devfreq/governor_msm_adreno_tz.c index f6a45318239a9..f24a504c3f484 100644 --- a/drivers/devfreq/governor_msm_adreno_tz.c +++ b/drivers/devfreq/governor_msm_adreno_tz.c @@ -92,14 +92,15 @@ static ssize_t gpu_load_show(struct device *dev, struct device_attribute *attr, char *buf) { - unsigned long sysfs_busy_perc; + unsigned long sysfs_busy_perc = 0; /* * Average out the samples taken since last read * This will keep the average value in sync with * with the client sampling duration. */ spin_lock(&sample_lock); - sysfs_busy_perc = (acc_relative_busy * 100) / acc_total; + if (acc_total) + sysfs_busy_perc = (acc_relative_busy * 100) / acc_total; /* Reset the parameters */ acc_total = 0; From 2f9c3b46cddee7287eb26ad65b8fc60fbaffaaad Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Tue, 15 Nov 2016 12:26:47 -0800 Subject: [PATCH 0364/1015] msm: camera: sensor: Add boundary check for cci master Add boundary check for cci master in i2c_read. This value is passed from userpsace. If user sends an invalid number for master there is a possibility of accessing unintended buffer. This change addresses the issue. Crs-Fixed: 1086764 Signed-off-by: Rajesh Bondugula Change-Id: Ice3bde902aea96382ceb4dfddfd28a5ea89c183d --- .../msm/camera_v2/sensor/cci/msm_cci.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c index df12fa3066ce6..30ceed2f439f5 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c +++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c @@ -781,10 +781,18 @@ static int32_t msm_cci_i2c_read(struct v4l2_subdev *sd, enum cci_i2c_queue_t queue = QUEUE_1; struct cci_device *cci_dev = NULL; struct msm_camera_cci_i2c_read_cfg *read_cfg = NULL; + CDBG("%s line %d\n", __func__, __LINE__); cci_dev = v4l2_get_subdevdata(sd); master = c_ctrl->cci_info->cci_i2c_master; read_cfg = &c_ctrl->cfg.cci_i2c_read_cfg; + + if (master >= MASTER_MAX || master < 0) { + pr_err("%s:%d Invalid I2C master %d\n", + __func__, __LINE__, master); + return -EINVAL; + } + mutex_lock(&cci_dev->cci_master_info[master].mutex_q[queue]); /* Set the I2C Frequency */ @@ -1009,11 +1017,6 @@ static int32_t msm_cci_i2c_write(struct v4l2_subdev *sd, enum cci_i2c_master_t master; cci_dev = v4l2_get_subdevdata(sd); - if (c_ctrl->cci_info->cci_i2c_master >= MASTER_MAX - || c_ctrl->cci_info->cci_i2c_master < 0) { - pr_err("%s:%d Invalid I2C master addr\n", __func__, __LINE__); - return -EINVAL; - } if (cci_dev->cci_state != CCI_STATE_ENABLED) { pr_err("%s invalid cci state %d\n", __func__, cci_dev->cci_state); @@ -1544,6 +1547,11 @@ static int32_t msm_cci_write(struct v4l2_subdev *sd, return rc; } + if (c_ctrl->cci_info->cci_i2c_master >= MASTER_MAX + || c_ctrl->cci_info->cci_i2c_master < 0) { + pr_err("%s:%d Invalid I2C master addr\n", __func__, __LINE__); + return -EINVAL; + } master = c_ctrl->cci_info->cci_i2c_master; cci_master_info = &cci_dev->cci_master_info[master]; From 00aaa6e17f6c163d7af5daec7efe412f2fad32f9 Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Tue, 8 Nov 2016 11:52:55 -0800 Subject: [PATCH 0365/1015] msm: camera: sensor: Validate i2c_frq_mode in msm_cci_get_clk_rates i2c_freq_mode in msm_cci_get_clk_rates is populated from userspace. Validate to make sure it has valid values. If a large number is sent from userspace to avoid a buffer over read. Crs-Fixed: 1086833 Change-Id: I237f60dca3e3dbad4e6188bf047cf7ec5163d159 Signed-off-by: Rajesh Bondugula --- .../platform/msm/camera_v2/sensor/cci/msm_cci.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c index df12fa3066ce6..23b2be8eea353 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c +++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c @@ -115,15 +115,16 @@ static int32_t msm_cci_set_clk_param(struct cci_device *cci_dev, enum cci_i2c_master_t master = c_ctrl->cci_info->cci_i2c_master; enum i2c_freq_mode_t i2c_freq_mode = c_ctrl->cci_info->i2c_freq_mode; - clk_params = &cci_dev->cci_clk_params[i2c_freq_mode]; - if ((i2c_freq_mode >= I2C_MAX_MODES) || (i2c_freq_mode < 0)) { pr_err("%s:%d invalid i2c_freq_mode = %d", __func__, __LINE__, i2c_freq_mode); return -EINVAL; } + if (cci_dev->i2c_freq_mode[master] == i2c_freq_mode) return 0; + + clk_params = &cci_dev->cci_clk_params[i2c_freq_mode]; if (MASTER_0 == master) { msm_camera_io_w_mb(clk_params->hw_thigh << 16 | clk_params->hw_tlow, @@ -1201,6 +1202,13 @@ static uint32_t *msm_cci_get_clk_rates(struct cci_device *cci_dev, struct msm_cci_clk_params_t *clk_params = NULL; enum i2c_freq_mode_t i2c_freq_mode = c_ctrl->cci_info->i2c_freq_mode; struct device_node *of_node = cci_dev->pdev->dev.of_node; + + if ((i2c_freq_mode >= I2C_MAX_MODES) || (i2c_freq_mode < 0)) { + pr_err("%s:%d invalid i2c_freq_mode %d\n", + __func__, __LINE__, i2c_freq_mode); + return NULL; + } + clk_params = &cci_dev->cci_clk_params[i2c_freq_mode]; cci_clk_src = clk_params->cci_clk_src; From ce79d9f2b4f4721db9f2cb410a1e81766e8745b9 Mon Sep 17 00:00:00 2001 From: Ashwanth Goli Date: Mon, 28 Nov 2016 12:16:55 +0530 Subject: [PATCH 0366/1015] defconfig: Enable config IP_NF_MATCH_RPFILTER Enable config IP_NF_MATCH_RPFILTER. This option allows you to match packets whose replies would go out via the interface the packet came in Change-Id: I2a23346e726a8df8487aeb664d6316b3cf2b9d77 Signed-off-by: Ashwanth Goli --- arch/arm64/configs/msm-perf_defconfig | 2 ++ arch/arm64/configs/msm_defconfig | 2 ++ 2 files changed, 4 insertions(+) diff --git a/arch/arm64/configs/msm-perf_defconfig b/arch/arm64/configs/msm-perf_defconfig index 368382dda99a1..0dc32620d9cae 100644 --- a/arch/arm64/configs/msm-perf_defconfig +++ b/arch/arm64/configs/msm-perf_defconfig @@ -160,6 +160,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -175,6 +176,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index 974c3c0f21b49..257f650f74fb1 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -161,6 +161,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -176,6 +177,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y From 5a706dc69aea2079991dea9369c9c26d754f40c1 Mon Sep 17 00:00:00 2001 From: Ingrid Gallardo Date: Thu, 29 Sep 2016 19:46:47 -0700 Subject: [PATCH 0367/1015] fbdev: use unsigned integers to prevent overflow Use unsigned integers to make sure there is no data overflow. Also modify the size check for zero in order to make sure this code is not optimized by the compiler. CRs-Fixed: 1071271 Change-Id: I35d8cbbd5914f82bef80c8f3d874fedb0b7c74c0 Signed-off-by: Ingrid Gallardo --- drivers/video/fbdev/core/fbcmap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/video/fbdev/core/fbcmap.c b/drivers/video/fbdev/core/fbcmap.c index 6bf80e43cac52..021755f7f32d3 100644 --- a/drivers/video/fbdev/core/fbcmap.c +++ b/drivers/video/fbdev/core/fbcmap.c @@ -187,8 +187,8 @@ int fb_copy_cmap(const struct fb_cmap *from, struct fb_cmap *to) int fb_cmap_to_user(const struct fb_cmap *from, struct fb_cmap_user *to) { - int tooff = 0, fromoff = 0; - int size; + u32 tooff = 0, fromoff = 0; + u32 size; if (to->start > from->start) fromoff = to->start - from->start; @@ -198,10 +198,10 @@ int fb_cmap_to_user(const struct fb_cmap *from, struct fb_cmap_user *to) return -EINVAL; size = to->len - tooff; - if (size > (int) (from->len - fromoff)) + if (size > (from->len - fromoff)) size = from->len - fromoff; size *= sizeof(u16); - if (!size) + if (size == 0) return -EINVAL; if (copy_to_user(to->red+tooff, from->red+fromoff, size)) From de89be6cac3ee838d6764bd553f8409868779c89 Mon Sep 17 00:00:00 2001 From: Benet Clark Date: Thu, 10 Nov 2016 17:49:09 -0800 Subject: [PATCH 0368/1015] msm: mdss: Clear compat structures before copying to user In the compat layer, the temporary structures used to convert data from 32bit to 64bit structures need to be set to 0 before being assigned values. CRs-Fixed: 1088206 Change-Id: I04497bc11e01c3df4beadfd6d9b06ab4321f1723 Signed-off-by: Benet Clark --- drivers/video/msm/mdss/mdss_compat_utils.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_compat_utils.c b/drivers/video/msm/mdss/mdss_compat_utils.c index d3eb3db48eb77..9f1a24431de92 100644 --- a/drivers/video/msm/mdss/mdss_compat_utils.c +++ b/drivers/video/msm/mdss/mdss_compat_utils.c @@ -846,6 +846,7 @@ static int __from_user_pcc_coeff_v17( return -EFAULT; } + memset(&pcc_cfg_payload, 0, sizeof(pcc_cfg_payload)); pcc_cfg_payload.r.b = pcc_cfg_payload32.r.b; pcc_cfg_payload.r.g = pcc_cfg_payload32.r.g; pcc_cfg_payload.r.c = pcc_cfg_payload32.r.c; @@ -1127,6 +1128,8 @@ static int __from_user_igc_lut_data_v17( pr_err("failed to copy payload from user for igc\n"); return -EFAULT; } + + memset(&igc_cfg_payload, 0, sizeof(igc_cfg_payload)); igc_cfg_payload.c0_c1_data = compat_ptr(igc_cfg_payload_32.c0_c1_data); igc_cfg_payload.c2_data = compat_ptr(igc_cfg_payload_32.c2_data); igc_cfg_payload.len = igc_cfg_payload_32.len; @@ -1261,6 +1264,7 @@ static int __from_user_pgc_lut_data_v1_7( pr_err("failed to copy from user the pgc32 payload\n"); return -EFAULT; } + memset(&pgc_cfg_payload, 0, sizeof(pgc_cfg_payload)); pgc_cfg_payload.c0_data = compat_ptr(pgc_cfg_payload_32.c0_data); pgc_cfg_payload.c1_data = compat_ptr(pgc_cfg_payload_32.c1_data); pgc_cfg_payload.c2_data = compat_ptr(pgc_cfg_payload_32.c2_data); @@ -1470,6 +1474,7 @@ static int __from_user_hist_lut_data_v1_7( return -EFAULT; } + memset(&hist_lut_cfg_payload, 0, sizeof(hist_lut_cfg_payload)); hist_lut_cfg_payload.len = hist_lut_cfg_payload32.len; hist_lut_cfg_payload.data = compat_ptr(hist_lut_cfg_payload32.data); @@ -2024,6 +2029,7 @@ static int __from_user_pa_data_v1_7( return -EFAULT; } + memset(&pa_cfg_payload, 0, sizeof(pa_cfg_payload)); pa_cfg_payload.mode = pa_cfg_payload32.mode; pa_cfg_payload.global_hue_adj = pa_cfg_payload32.global_hue_adj; pa_cfg_payload.global_sat_adj = pa_cfg_payload32.global_sat_adj; @@ -2280,6 +2286,8 @@ static int __from_user_gamut_cfg_data_v17( pr_err("failed to copy the gamut payload from userspace\n"); return -EFAULT; } + + memset(&gamut_cfg_payload, 0, sizeof(gamut_cfg_payload)); gamut_cfg_payload.mode = gamut_cfg_payload32.mode; for (i = 0; i < MDP_GAMUT_TABLE_NUM_V1_7; i++) { gamut_cfg_payload.tbl_size[i] = From 45122fd91471589a3d4f1467e7b0af9634b0e6f3 Mon Sep 17 00:00:00 2001 From: Avaneesh Kumar Dwivedi Date: Wed, 26 Oct 2016 14:06:34 +0530 Subject: [PATCH 0369/1015] soc: qcom: Replace ARRAY_SIZE macro with strlen ARRAY_SIZE returns size of array. While sending command string we need to only pass size of actual command string, hence use strlen in place of ARRAY_SIZE. Change-Id: If0afc6b1209b03ae17472a17b34d9d403757bfd0 Signed-off-by: Avaneesh Kumar Dwivedi --- drivers/soc/qcom/sysmon.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/soc/qcom/sysmon.c b/drivers/soc/qcom/sysmon.c index 8a12341a6f912..b43da8c82a737 100644 --- a/drivers/soc/qcom/sysmon.c +++ b/drivers/soc/qcom/sysmon.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -206,7 +206,7 @@ int sysmon_send_shutdown_no_qmi(struct subsys_desc *dest_desc) return -ENODEV; mutex_lock(&ss->lock); - ret = sysmon_send_msg(ss, tx_buf, ARRAY_SIZE(tx_buf)); + ret = sysmon_send_msg(ss, tx_buf, strlen(tx_buf)); if (ret) { pr_err("Message sending failed %d\n", ret); goto out; @@ -257,7 +257,7 @@ int sysmon_get_reason_no_qmi(struct subsys_desc *dest_desc, return -ENODEV; mutex_lock(&ss->lock); - ret = sysmon_send_msg(ss, tx_buf, ARRAY_SIZE(tx_buf)); + ret = sysmon_send_msg(ss, tx_buf, strlen(tx_buf)); if (ret) { pr_err("Message sending failed %d\n", ret); goto out; From dc53d6f6205f39732e151daa84e0bfc29be70b25 Mon Sep 17 00:00:00 2001 From: Imran Khan Date: Wed, 17 Aug 2016 21:18:14 +0530 Subject: [PATCH 0370/1015] arm64: Add support for 32 bit app specific settings Add support to enable app specific settings, whenever a 32 bit application is running. Change-Id: I0cf40e8ea6e3f9e62258a44ccdd959e9eae09d88 Signed-off-by: Imran Khan --- arch/arm64/include/asm/app_api.h | 7 +++++++ arch/arm64/kernel/app_api.c | 35 ++++++++++++++++++++++++++++++++ arch/arm64/kernel/app_setting.c | 15 ++++++++++++++ kernel/sched/core.c | 3 +++ 4 files changed, 60 insertions(+) diff --git a/arch/arm64/include/asm/app_api.h b/arch/arm64/include/asm/app_api.h index 2162400fde13b..7032d636dab60 100644 --- a/arch/arm64/include/asm/app_api.h +++ b/arch/arm64/include/asm/app_api.h @@ -27,16 +27,23 @@ #ifdef CONFIG_MSM_APP_API extern void set_app_setting_bit(uint32_t bit); extern void clear_app_setting_bit(uint32_t bit); +extern void set_app_setting_bit_for_32bit_apps(void); +extern void clear_app_setting_bit_for_32bit_apps(void); #else static inline void set_app_setting_bit(uint32_t bit) {} static inline void clear_app_setting_bit(uint32_t bit) {} +static inline void set_app_setting_bit_for_32bit_apps(void) {} +static inline void clear_app_setting_bit_for_32bit_apps(void) {} #endif #ifdef CONFIG_MSM_APP_SETTINGS extern void switch_app_setting_bit(struct task_struct *prev, struct task_struct *next); +extern void switch_32bit_app_setting_bit(struct task_struct *prev, + struct task_struct *next); extern void apply_app_setting_bit(struct file *file); extern bool use_app_setting; +extern bool use_32bit_app_setting; #endif #endif diff --git a/arch/arm64/kernel/app_api.c b/arch/arm64/kernel/app_api.c index 39eeee1a9029b..1b3732accd4b0 100644 --- a/arch/arm64/kernel/app_api.c +++ b/arch/arm64/kernel/app_api.c @@ -18,6 +18,7 @@ #include static spinlock_t spinlock; +static spinlock_t spinlock_32bit_app; static DEFINE_PER_CPU(int, app_config_applied); static unsigned long app_config_set[NR_CPUS]; static unsigned long app_config_clear[NR_CPUS]; @@ -67,9 +68,43 @@ void clear_app_setting_bit(uint32_t bit) } EXPORT_SYMBOL(clear_app_setting_bit); +void set_app_setting_bit_for_32bit_apps(void) +{ + unsigned long flags; + uint64_t reg; + + spin_lock_irqsave(&spinlock_32bit_app, flags); + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg | BIT(18); + reg = reg & ~BIT(2); + reg = reg | 0x3; + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + spin_unlock_irqrestore(&spinlock_32bit_app, flags); +} +EXPORT_SYMBOL(set_app_setting_bit_for_32bit_apps); + +void clear_app_setting_bit_for_32bit_apps(void) +{ + unsigned long flags; + uint64_t reg; + + spin_lock_irqsave(&spinlock_32bit_app, flags); + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg & ~BIT(18); + reg = reg & ~0x3; + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + spin_unlock_irqrestore(&spinlock_32bit_app, flags); +} +EXPORT_SYMBOL(clear_app_setting_bit_for_32bit_apps); + static int __init init_app_api(void) { spin_lock_init(&spinlock); + spin_lock_init(&spinlock_32bit_app); return 0; } early_initcall(init_app_api); diff --git a/arch/arm64/kernel/app_setting.c b/arch/arm64/kernel/app_setting.c index 6b4eb28d0e244..8e7aeab39eddb 100644 --- a/arch/arm64/kernel/app_setting.c +++ b/arch/arm64/kernel/app_setting.c @@ -35,6 +35,10 @@ bool use_app_setting = true; module_param(use_app_setting, bool, 0644); MODULE_PARM_DESC(use_app_setting, "control use of app specific settings"); +bool use_32bit_app_setting = true; +module_param(use_32bit_app_setting, bool, 0644); +MODULE_PARM_DESC(use_32bit_app_setting, "control use of 32 bit app specific settings"); + static int set_name(const char *str, struct kernel_param *kp) { int len = strlen(str); @@ -87,6 +91,17 @@ void switch_app_setting_bit(struct task_struct *prev, struct task_struct *next) } EXPORT_SYMBOL(switch_app_setting_bit); +void switch_32bit_app_setting_bit(struct task_struct *prev, + struct task_struct *next) +{ + if (prev->mm && unlikely(is_compat_thread(task_thread_info(prev)))) + clear_app_setting_bit_for_32bit_apps(); + + if (next->mm && unlikely(is_compat_thread(task_thread_info(next)))) + set_app_setting_bit_for_32bit_apps(); +} +EXPORT_SYMBOL(switch_32bit_app_setting_bit); + void apply_app_setting_bit(struct file *file) { bool found = false; diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 96d3e2740ca78..254c85cf4a784 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5636,6 +5636,9 @@ prepare_task_switch(struct rq *rq, struct task_struct *prev, #ifdef CONFIG_MSM_APP_SETTINGS if (use_app_setting) switch_app_setting_bit(prev, next); + + if (use_32bit_app_setting) + switch_32bit_app_setting_bit(prev, next); #endif } From 014c1f86e8d9716d4ce4cfa0befda831fd6fbf82 Mon Sep 17 00:00:00 2001 From: Krishnankutty Kolathappilly Date: Wed, 16 Nov 2016 18:22:58 -0800 Subject: [PATCH 0371/1015] msm: cpp: Fix for buffer overflow in cpp. Fix for buffer overflow while handling ioctl. Instead of checking for length boundary, fix checks for exact length. CRs-Fixed: 518731 Change-Id: I9002f84b219e8b06ae0672d87c2d999e728a75aa Signed-off-by: Krishnankutty Kolathappilly --- drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index 964b43fb1e51d..e02188510bff9 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -2949,8 +2949,7 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, uint32_t identity; struct msm_cpp_buff_queue_info_t *buff_queue_info; CPP_DBG("VIDIOC_MSM_CPP_DEQUEUE_STREAM_BUFF_INFO\n"); - if ((ioctl_ptr->len == 0) || - (ioctl_ptr->len > sizeof(uint32_t))) { + if (ioctl_ptr->len != sizeof(uint32_t)) { mutex_unlock(&cpp_dev->mutex); return -EINVAL; } From 1de713abce8edfb6e42657487b258f12d224be19 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Tue, 31 May 2016 11:24:22 -0600 Subject: [PATCH 0372/1015] msm: kgsl: Reserve a context ID slot but don't populate immediately When creating a context allocate an ID but don't populate the slot with the context pointer until we are done setup up the rest of the process. This avoids a race if somebody tries to free the same identifier before the create operation is complete. Change-Id: Ic0dedbadca5b4cc4ce567afad48a33078b549439 Signed-off-by: Jordan Crouse --- drivers/gpu/msm/kgsl.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 136eafe5b57d3..1426af7bead9f 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -525,21 +525,18 @@ void kgsl_context_dump(struct kgsl_context *context) EXPORT_SYMBOL(kgsl_context_dump); /* Allocate a new context ID */ -static int _kgsl_get_context_id(struct kgsl_device *device, - struct kgsl_context *context) +static int _kgsl_get_context_id(struct kgsl_device *device) { int id; idr_preload(GFP_KERNEL); write_lock(&device->context_lock); - id = idr_alloc(&device->context_idr, context, 1, + /* Allocate the slot but don't put a pointer in it yet */ + id = idr_alloc(&device->context_idr, NULL, 1, KGSL_MEMSTORE_MAX, GFP_NOWAIT); write_unlock(&device->context_lock); idr_preload_end(); - if (id > 0) - context->id = id; - return id; } @@ -563,7 +560,7 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv, char name[64]; int ret = 0, id; - id = _kgsl_get_context_id(device, context); + id = _kgsl_get_context_id(device); if (id == -ENOSPC) { /* * Before declaring that there are no contexts left try @@ -572,7 +569,7 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv, */ flush_workqueue(device->events_wq); - id = _kgsl_get_context_id(device, context); + id = _kgsl_get_context_id(device); } if (id < 0) { @@ -584,6 +581,8 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv, return id; } + context->id = id; + kref_init(&context->refcount); /* * Get a refernce to the process private so its not destroyed, until @@ -1713,6 +1712,12 @@ long kgsl_ioctl_drawctxt_create(struct kgsl_device_private *dev_priv, goto done; } trace_kgsl_context_create(dev_priv->device, context, param->flags); + + /* Commit the pointer to the context in context_idr */ + write_lock(&device->context_lock); + idr_replace(&device->context_idr, context, context->id); + write_unlock(&device->context_lock); + param->drawctxt_id = context->id; done: return result; From 301aa627509e8e1eeaa3ee22ecc64f8e148dc2c6 Mon Sep 17 00:00:00 2001 From: Raviteja Tamatam Date: Wed, 23 Nov 2016 19:31:58 +0530 Subject: [PATCH 0373/1015] msm: mdss: Align start address and size to 1MB Targets having slave side security through xpu/mpu are expected to have 1 MB aligned buffer start address and size. Change-Id: Id95030da049ebd155ca871be7ff2f34cb7fc6151 Signed-off-by: Raviteja Tamatam --- drivers/video/msm/mdss/mdss_smmu.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_smmu.c b/drivers/video/msm/mdss/mdss_smmu.c index 3ad9e6c6ed424..40b0d1de793ab 100644 --- a/drivers/video/msm/mdss/mdss_smmu.c +++ b/drivers/video/msm/mdss/mdss_smmu.c @@ -539,13 +539,13 @@ int mdss_smmu_init(struct mdss_data_type *mdata, struct device *dev) } static struct mdss_smmu_domain mdss_mdp_unsec = { - "mdp_0", MDSS_IOMMU_DOMAIN_UNSECURE, SZ_128K, (SZ_4G - SZ_128K)}; + "mdp_0", MDSS_IOMMU_DOMAIN_UNSECURE, SZ_1M, (SZ_4G - SZ_1M)}; static struct mdss_smmu_domain mdss_rot_unsec = { - NULL, MDSS_IOMMU_DOMAIN_ROT_UNSECURE, SZ_128K, (SZ_4G - SZ_128K)}; + NULL, MDSS_IOMMU_DOMAIN_ROT_UNSECURE, SZ_1M, (SZ_4G - SZ_1M)}; static struct mdss_smmu_domain mdss_mdp_sec = { - "mdp_1", MDSS_IOMMU_DOMAIN_SECURE, SZ_128K, (SZ_4G - SZ_128K)}; + "mdp_1", MDSS_IOMMU_DOMAIN_SECURE, SZ_1M, (SZ_4G - SZ_1M)}; static struct mdss_smmu_domain mdss_rot_sec = { - NULL, MDSS_IOMMU_DOMAIN_ROT_SECURE, SZ_128K, (SZ_4G - SZ_128K)}; + NULL, MDSS_IOMMU_DOMAIN_ROT_SECURE, SZ_1M, (SZ_4G - SZ_1M)}; static const struct of_device_id mdss_smmu_dt_match[] = { { .compatible = "qcom,smmu_mdp_unsec", .data = &mdss_mdp_unsec}, From 55a79c1742724e8729d2c0bd40c4dc3c55d50558 Mon Sep 17 00:00:00 2001 From: Dumpeti Sathish Kumar Date: Mon, 5 Dec 2016 16:09:41 +0530 Subject: [PATCH 0374/1015] msm: kgsl: Improve logs for pagefaults on global buffers Log the nearby allocations for pagefaults on global buffers. Print the names of the allocations that fall around the faulting address on a global buffer. Also add a new debugfs file to list all the global pagetable entries. Useful for debugging pagefaults and other issues with "global" objects. CRs-Fixed: 985631 Change-Id: Ifbbdc69044fc64d7ea02509bf8113ed94eeece1e Signed-off-by: Sushmita Susheelendra Signed-off-by: Dumpeti Sathish Kumar --- drivers/gpu/msm/adreno.c | 3 +- drivers/gpu/msm/adreno_a3xx.c | 2 +- drivers/gpu/msm/adreno_a4xx.c | 2 +- drivers/gpu/msm/adreno_a5xx.c | 11 ++- drivers/gpu/msm/adreno_a5xx_preempt.c | 9 +- drivers/gpu/msm/adreno_a5xx_snapshot.c | 4 +- drivers/gpu/msm/adreno_profile.c | 3 +- drivers/gpu/msm/adreno_ringbuffer.c | 6 +- drivers/gpu/msm/kgsl.c | 4 +- drivers/gpu/msm/kgsl_debugfs.c | 26 ++++++ drivers/gpu/msm/kgsl_iommu.c | 123 ++++++++++++++++++++----- drivers/gpu/msm/kgsl_mmu.c | 6 +- drivers/gpu/msm/kgsl_mmu.h | 5 +- drivers/gpu/msm/kgsl_sharedmem.h | 4 +- 14 files changed, 160 insertions(+), 48 deletions(-) diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index e20e9f8da999d..d4767ab4e91f4 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -1211,7 +1211,8 @@ static int adreno_init(struct kgsl_device *device) if (!adreno_is_a3xx(adreno_dev)) { int r = kgsl_allocate_global(device, - &adreno_dev->cmdbatch_profile_buffer, PAGE_SIZE, 0, 0); + &adreno_dev->cmdbatch_profile_buffer, PAGE_SIZE, + 0, 0, "alwayson"); adreno_dev->cmdbatch_profile_index = 0; diff --git a/drivers/gpu/msm/adreno_a3xx.c b/drivers/gpu/msm/adreno_a3xx.c index 6a03a14c64451..423071811b43b 100644 --- a/drivers/gpu/msm/adreno_a3xx.c +++ b/drivers/gpu/msm/adreno_a3xx.c @@ -211,7 +211,7 @@ static int _a3xx_pwron_fixup(struct adreno_device *adreno_dev) ret = kgsl_allocate_global(KGSL_DEVICE(adreno_dev), &adreno_dev->pwron_fixup, PAGE_SIZE, - KGSL_MEMFLAGS_GPUREADONLY, 0); + KGSL_MEMFLAGS_GPUREADONLY, 0, "pwron_fixup"); if (ret) return ret; diff --git a/drivers/gpu/msm/adreno_a4xx.c b/drivers/gpu/msm/adreno_a4xx.c index 7a8236fb95da9..41042b0fd7e10 100644 --- a/drivers/gpu/msm/adreno_a4xx.c +++ b/drivers/gpu/msm/adreno_a4xx.c @@ -1364,7 +1364,7 @@ static int _a4xx_pwron_fixup(struct adreno_device *adreno_dev) ret = kgsl_allocate_global(KGSL_DEVICE(adreno_dev), &adreno_dev->pwron_fixup, PAGE_SIZE, - KGSL_MEMFLAGS_GPUREADONLY, 0); + KGSL_MEMFLAGS_GPUREADONLY, 0, "pwron_fixup"); if (ret) return ret; diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c index 01bbcecc822e1..b09e998bac02c 100644 --- a/drivers/gpu/msm/adreno_a5xx.c +++ b/drivers/gpu/msm/adreno_a5xx.c @@ -244,7 +244,8 @@ static int a5xx_critical_packet_construct(struct adreno_device *adreno_dev) ret = kgsl_allocate_global(&adreno_dev->dev, &crit_pkts, PAGE_SIZE, - KGSL_MEMFLAGS_GPUREADONLY, 0); + KGSL_MEMFLAGS_GPUREADONLY, + 0, "crit_pkts"); if (ret) return ret; @@ -258,19 +259,19 @@ static int a5xx_critical_packet_construct(struct adreno_device *adreno_dev) ret = kgsl_allocate_global(&adreno_dev->dev, &crit_pkts_refbuf1, - PAGE_SIZE, 0, 0); + PAGE_SIZE, 0, 0, "crit_pkts_refbuf1"); if (ret) return ret; ret = kgsl_allocate_global(&adreno_dev->dev, &crit_pkts_refbuf2, - PAGE_SIZE, 0, 0); + PAGE_SIZE, 0, 0, "crit_pkts_refbuf2"); if (ret) return ret; ret = kgsl_allocate_global(&adreno_dev->dev, &crit_pkts_refbuf3, - PAGE_SIZE, 0, 0); + PAGE_SIZE, 0, 0, "crit_pkts_refbuf3"); if (ret) return ret; @@ -2461,7 +2462,7 @@ static int _load_firmware(struct kgsl_device *device, const char *fwfile, } ret = kgsl_allocate_global(device, ucode, fw->size - 4, - KGSL_MEMFLAGS_GPUREADONLY, 0); + KGSL_MEMFLAGS_GPUREADONLY, 0, "ucode"); if (ret) goto done; diff --git a/drivers/gpu/msm/adreno_a5xx_preempt.c b/drivers/gpu/msm/adreno_a5xx_preempt.c index 6266d6d0ec368..4883a5e94a8fa 100644 --- a/drivers/gpu/msm/adreno_a5xx_preempt.c +++ b/drivers/gpu/msm/adreno_a5xx_preempt.c @@ -492,7 +492,8 @@ static int a5xx_preemption_ringbuffer_init(struct adreno_device *adreno_dev, int ret; ret = kgsl_allocate_global(device, &rb->preemption_desc, - A5XX_CP_CTXRECORD_SIZE_IN_BYTES, 0, KGSL_MEMDESC_PRIVILEGED); + A5XX_CP_CTXRECORD_SIZE_IN_BYTES, 0, KGSL_MEMDESC_PRIVILEGED, + "preemption_desc"); if (ret) return ret; @@ -527,7 +528,8 @@ static int a5xx_preemption_iommu_init(struct adreno_device *adreno_dev) /* Allocate mem for storing preemption smmu record */ return kgsl_allocate_global(device, &iommu->smmu_info, PAGE_SIZE, - KGSL_MEMFLAGS_GPUREADONLY, KGSL_MEMDESC_PRIVILEGED); + KGSL_MEMFLAGS_GPUREADONLY, KGSL_MEMDESC_PRIVILEGED, + "smmu_info"); } #else static int a5xx_preemption_iommu_init(struct adreno_device *adreno_dev) @@ -557,7 +559,8 @@ int a5xx_preemption_init(struct adreno_device *adreno_dev) /* Allocate mem for storing preemption counters */ ret = kgsl_allocate_global(device, &preempt->counters, adreno_dev->num_ringbuffers * - A5XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE, 0, 0); + A5XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE, 0, 0, + "preemption_counters"); if (ret) return ret; diff --git a/drivers/gpu/msm/adreno_a5xx_snapshot.c b/drivers/gpu/msm/adreno_a5xx_snapshot.c index 04d82844a5e9b..aeffeab2f6dc0 100644 --- a/drivers/gpu/msm/adreno_a5xx_snapshot.c +++ b/drivers/gpu/msm/adreno_a5xx_snapshot.c @@ -1033,11 +1033,11 @@ void a5xx_crashdump_init(struct adreno_device *adreno_dev) /* The script buffers needs 2 extra qwords on the end */ if (kgsl_allocate_global(device, &capturescript, script_size + 16, KGSL_MEMFLAGS_GPUREADONLY, - KGSL_MEMDESC_PRIVILEGED)) + KGSL_MEMDESC_PRIVILEGED, "capturescript")) return; if (kgsl_allocate_global(device, ®isters, data_size, 0, - KGSL_MEMDESC_PRIVILEGED)) { + KGSL_MEMDESC_PRIVILEGED, "capturescript_regs")) { kgsl_free_global(KGSL_DEVICE(adreno_dev), &capturescript); return; } diff --git a/drivers/gpu/msm/adreno_profile.c b/drivers/gpu/msm/adreno_profile.c index c4fab8a5528ab..d8af520b2fe60 100644 --- a/drivers/gpu/msm/adreno_profile.c +++ b/drivers/gpu/msm/adreno_profile.c @@ -1071,7 +1071,8 @@ void adreno_profile_init(struct adreno_device *adreno_dev) /* allocate shared_buffer, which includes pre_ib and post_ib */ profile->shared_size = ADRENO_PROFILE_SHARED_BUF_SIZE_DWORDS; ret = kgsl_allocate_global(device, &profile->shared_buffer, - profile->shared_size * sizeof(unsigned int), 0, 0); + profile->shared_size * sizeof(unsigned int), + 0, 0, "profile"); if (ret) { profile->shared_size = 0; diff --git a/drivers/gpu/msm/adreno_ringbuffer.c b/drivers/gpu/msm/adreno_ringbuffer.c index dbcf9fc02a976..e601bf2c0fb8d 100644 --- a/drivers/gpu/msm/adreno_ringbuffer.c +++ b/drivers/gpu/msm/adreno_ringbuffer.c @@ -256,12 +256,12 @@ static int _adreno_ringbuffer_probe(struct adreno_device *adreno_dev, * switch pagetable */ ret = kgsl_allocate_global(KGSL_DEVICE(adreno_dev), &rb->pagetable_desc, - PAGE_SIZE, 0, KGSL_MEMDESC_PRIVILEGED); + PAGE_SIZE, 0, KGSL_MEMDESC_PRIVILEGED, "pagetable_desc"); if (ret) return ret; - return kgsl_allocate_global(KGSL_DEVICE(adreno_dev), &rb->buffer_desc, - KGSL_RB_SIZE, KGSL_MEMFLAGS_GPUREADONLY, 0); + KGSL_RB_SIZE, KGSL_MEMFLAGS_GPUREADONLY, + 0, "ringbuffer"); } int adreno_ringbuffer_probe(struct adreno_device *adreno_dev, bool nopreempt) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 136eafe5b57d3..13ddd44aaf5ce 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -3948,13 +3948,13 @@ int kgsl_device_platform_probe(struct kgsl_device *device) goto error_close_mmu; status = kgsl_allocate_global(device, &device->memstore, - KGSL_MEMSTORE_SIZE, 0, KGSL_MEMDESC_CONTIG); + KGSL_MEMSTORE_SIZE, 0, KGSL_MEMDESC_CONTIG, "memstore"); if (status != 0) goto error_close_mmu; status = kgsl_allocate_global(device, &device->scratch, - PAGE_SIZE, 0, 0); + PAGE_SIZE, 0, 0, "scratch"); if (status != 0) goto error_free_memstore; diff --git a/drivers/gpu/msm/kgsl_debugfs.c b/drivers/gpu/msm/kgsl_debugfs.c index 4fada8edc1e5f..b7ca9f0e86ca1 100644 --- a/drivers/gpu/msm/kgsl_debugfs.c +++ b/drivers/gpu/msm/kgsl_debugfs.c @@ -281,6 +281,29 @@ static const struct file_operations process_mem_fops = { }; +static int globals_print(struct seq_file *s, void *unused) +{ + kgsl_print_global_pt_entries(s); + return 0; +} + +static int globals_open(struct inode *inode, struct file *file) +{ + return single_open(file, globals_print, NULL); +} + +static int globals_release(struct inode *inode, struct file *file) +{ + return single_release(inode, file); +} + +static const struct file_operations global_fops = { + .open = globals_open, + .read = seq_read, + .llseek = seq_lseek, + .release = globals_release, +}; + /** * kgsl_process_init_debugfs() - Initialize debugfs for a process * @private: Pointer to process private structure created for the process @@ -328,6 +351,9 @@ void kgsl_core_debugfs_init(void) kgsl_debugfs_dir = debugfs_create_dir("kgsl", NULL); + debugfs_create_file("globals", 0444, kgsl_debugfs_dir, NULL, + &global_fops); + debug_dir = debugfs_create_dir("debug", kgsl_debugfs_dir); debugfs_create_file("strict_memory", 0644, debug_dir, NULL, diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c index fb25c2ae3869a..0d207494c9e80 100644 --- a/drivers/gpu/msm/kgsl_iommu.c +++ b/drivers/gpu/msm/kgsl_iommu.c @@ -38,6 +38,10 @@ #define _IOMMU_PRIV(_mmu) (&((_mmu)->priv.iommu)) +#define ADDR_IN_GLOBAL(_a) \ + (((_a) >= KGSL_IOMMU_GLOBAL_MEM_BASE) && \ + ((_a) < (KGSL_IOMMU_GLOBAL_MEM_BASE + KGSL_IOMMU_GLOBAL_MEM_SIZE))) + static struct kgsl_mmu_pt_ops iommu_pt_ops; static bool need_iommu_sync; @@ -92,19 +96,41 @@ static struct kmem_cache *addr_entry_cache; #define GLOBAL_PT_ENTRIES 32 -static struct kgsl_memdesc *global_pt_entries[GLOBAL_PT_ENTRIES]; +struct global_pt_entry { + struct kgsl_memdesc *memdesc; + char name[32]; +}; + +static struct global_pt_entry global_pt_entries[GLOBAL_PT_ENTRIES]; static struct kgsl_memdesc *kgsl_global_secure_pt_entry; static int global_pt_count; uint64_t global_pt_alloc; static struct kgsl_memdesc gpu_qdss_desc; +void kgsl_print_global_pt_entries(struct seq_file *s) +{ + int i; + + for (i = 0; i < global_pt_count; i++) { + struct kgsl_memdesc *memdesc = global_pt_entries[i].memdesc; + + if (memdesc == NULL) + continue; + + seq_printf(s, "0x%16.16llX-0x%16.16llX %16llu %s\n", + memdesc->gpuaddr, memdesc->gpuaddr + memdesc->size - 1, + memdesc->size, global_pt_entries[i].name); + } +} + static void kgsl_iommu_unmap_globals(struct kgsl_pagetable *pagetable) { unsigned int i; for (i = 0; i < global_pt_count; i++) { - if (global_pt_entries[i] != NULL) - kgsl_mmu_unmap(pagetable, global_pt_entries[i]); + if (global_pt_entries[i].memdesc != NULL) + kgsl_mmu_unmap(pagetable, + global_pt_entries[i].memdesc); } } @@ -113,8 +139,9 @@ static void kgsl_iommu_map_globals(struct kgsl_pagetable *pagetable) unsigned int i; for (i = 0; i < global_pt_count; i++) { - if (global_pt_entries[i] != NULL) { - int ret = kgsl_mmu_map(pagetable, global_pt_entries[i]); + if (global_pt_entries[i].memdesc != NULL) { + int ret = kgsl_mmu_map(pagetable, + global_pt_entries[i].memdesc); BUG_ON(ret); } @@ -152,17 +179,17 @@ static void kgsl_iommu_remove_global(struct kgsl_mmu *mmu, return; for (i = 0; i < global_pt_count; i++) { - if (global_pt_entries[i] == memdesc) { + if (global_pt_entries[i].memdesc == memdesc) { memdesc->gpuaddr = 0; memdesc->priv &= ~KGSL_MEMDESC_GLOBAL; - global_pt_entries[i] = NULL; + global_pt_entries[i].memdesc = NULL; return; } } } static void kgsl_iommu_add_global(struct kgsl_mmu *mmu, - struct kgsl_memdesc *memdesc) + struct kgsl_memdesc *memdesc, const char *name) { if (memdesc->gpuaddr != 0) return; @@ -174,7 +201,10 @@ static void kgsl_iommu_add_global(struct kgsl_mmu *mmu, memdesc->priv |= KGSL_MEMDESC_GLOBAL; global_pt_alloc += memdesc->size; - global_pt_entries[global_pt_count++] = memdesc; + global_pt_entries[global_pt_count].memdesc = memdesc; + strlcpy(global_pt_entries[global_pt_count].name, name, + sizeof(global_pt_entries[global_pt_count].name)); + global_pt_count++; } void kgsl_add_global_secure_entry(struct kgsl_device *device, @@ -220,7 +250,7 @@ static void kgsl_setup_qdss_desc(struct kgsl_device *device) return; } - kgsl_mmu_add_global(device, &gpu_qdss_desc); + kgsl_mmu_add_global(device, &gpu_qdss_desc, "gpu-qdss"); } static inline void kgsl_cleanup_qdss_desc(struct kgsl_mmu *mmu) @@ -485,8 +515,62 @@ struct _mem_entry { unsigned int priv; int pending_free; pid_t pid; + char name[32]; }; +static void _get_global_entries(uint64_t faultaddr, + struct _mem_entry *prev, + struct _mem_entry *next) +{ + int i; + uint64_t prevaddr = 0; + struct global_pt_entry *p = NULL; + + uint64_t nextaddr = (uint64_t) -1; + struct global_pt_entry *n = NULL; + + for (i = 0; i < global_pt_count; i++) { + uint64_t addr; + + if (global_pt_entries[i].memdesc == NULL) + continue; + + addr = global_pt_entries[i].memdesc->gpuaddr; + if ((addr < faultaddr) && (addr > prevaddr)) { + prevaddr = addr; + p = &global_pt_entries[i]; + } + + if ((addr > faultaddr) && (addr < nextaddr)) { + nextaddr = addr; + n = &global_pt_entries[i]; + } + } + + if (p != NULL) { + prev->gpuaddr = p->memdesc->gpuaddr; + prev->size = p->memdesc->size; + prev->flags = p->memdesc->flags; + prev->priv = p->memdesc->priv; + prev->pid = 0; + strlcpy(prev->name, p->name, sizeof(prev->name)); + } + + if (n != NULL) { + next->gpuaddr = n->memdesc->gpuaddr; + next->size = n->memdesc->size; + next->flags = n->memdesc->flags; + next->priv = n->memdesc->priv; + next->pid = 0; + strlcpy(next->name, n->name, sizeof(next->name)); + } +} + +void __kgsl_get_memory_usage(struct _mem_entry *entry) +{ + kgsl_get_memory_usage(entry->name, sizeof(entry->name), entry->flags); +} + static void _get_entries(struct kgsl_process_private *private, uint64_t faultaddr, struct _mem_entry *prev, struct _mem_entry *next) @@ -521,6 +605,7 @@ static void _get_entries(struct kgsl_process_private *private, prev->priv = p->memdesc.priv; prev->pending_free = p->pending_free; prev->pid = private->pid; + __kgsl_get_memory_usage(prev); } if (n != NULL) { @@ -530,6 +615,7 @@ static void _get_entries(struct kgsl_process_private *private, next->priv = n->memdesc.priv; next->pending_free = n->pending_free; next->pid = private->pid; + __kgsl_get_memory_usage(next); } } @@ -545,7 +631,9 @@ static void _find_mem_entries(struct kgsl_mmu *mmu, uint64_t faultaddr, /* Set the maximum possible size as an initial value */ nextentry->gpuaddr = (uint64_t) -1; - if (context) { + if (ADDR_IN_GLOBAL(faultaddr)) { + _get_global_entries(faultaddr, preventry, nextentry); + } else if (context) { private = context->proc_priv; spin_lock(&private->mem_lock); _get_entries(private, faultaddr, preventry, nextentry); @@ -555,18 +643,13 @@ static void _find_mem_entries(struct kgsl_mmu *mmu, uint64_t faultaddr, static void _print_entry(struct kgsl_device *device, struct _mem_entry *entry) { - char name[32]; - memset(name, 0, sizeof(name)); - - kgsl_get_memory_usage(name, sizeof(name) - 1, entry->flags); - KGSL_LOG_DUMP(device, "[%016llX - %016llX] %s %s (pid = %d) (%s)\n", entry->gpuaddr, entry->gpuaddr + entry->size, entry->priv & KGSL_MEMDESC_GUARD_PAGE ? "(+guard)" : "", entry->pending_free ? "(pending free)" : "", - entry->pid, name); + entry->pid, entry->name); } static void _check_if_freed(struct kgsl_iommu_context *ctx, @@ -1382,7 +1465,7 @@ static int kgsl_iommu_init(struct kgsl_mmu *mmu) } } - kgsl_iommu_add_global(mmu, &iommu->setstate); + kgsl_iommu_add_global(mmu, &iommu->setstate, "setstate"); kgsl_setup_qdss_desc(device); done: @@ -2106,10 +2189,6 @@ static uint64_t kgsl_iommu_find_svm_region(struct kgsl_pagetable *pagetable, return addr; } -#define ADDR_IN_GLOBAL(_a) \ - (((_a) >= KGSL_IOMMU_GLOBAL_MEM_BASE) && \ - ((_a) < (KGSL_IOMMU_GLOBAL_MEM_BASE + KGSL_IOMMU_GLOBAL_MEM_SIZE))) - static int kgsl_iommu_set_svm_region(struct kgsl_pagetable *pagetable, uint64_t gpuaddr, uint64_t size) { diff --git a/drivers/gpu/msm/kgsl_mmu.c b/drivers/gpu/msm/kgsl_mmu.c index 75ce0795436c8..d0c5dc71401c8 100644 --- a/drivers/gpu/msm/kgsl_mmu.c +++ b/drivers/gpu/msm/kgsl_mmu.c @@ -512,12 +512,12 @@ void kgsl_mmu_remove_global(struct kgsl_device *device, EXPORT_SYMBOL(kgsl_mmu_remove_global); void kgsl_mmu_add_global(struct kgsl_device *device, - struct kgsl_memdesc *memdesc) + struct kgsl_memdesc *memdesc, const char *name) { struct kgsl_mmu *mmu = &device->mmu; if (MMU_OP_VALID(mmu, mmu_add_global)) - mmu->mmu_ops->mmu_add_global(mmu, memdesc); + mmu->mmu_ops->mmu_add_global(mmu, memdesc, name); } EXPORT_SYMBOL(kgsl_mmu_add_global); @@ -589,7 +589,7 @@ static struct kgsl_mmu_pt_ops nommu_pt_ops = { }; static void nommu_add_global(struct kgsl_mmu *mmu, - struct kgsl_memdesc *memdesc) + struct kgsl_memdesc *memdesc, const char *name) { memdesc->gpuaddr = (uint64_t) sg_phys(memdesc->sgt->sgl); } diff --git a/drivers/gpu/msm/kgsl_mmu.h b/drivers/gpu/msm/kgsl_mmu.h index 99d096f497bfc..93b1f9d2e40fd 100644 --- a/drivers/gpu/msm/kgsl_mmu.h +++ b/drivers/gpu/msm/kgsl_mmu.h @@ -75,7 +75,7 @@ struct kgsl_mmu_ops { (struct kgsl_mmu *mmu); int (*mmu_init_pt)(struct kgsl_mmu *mmu, struct kgsl_pagetable *); void (*mmu_add_global)(struct kgsl_mmu *mmu, - struct kgsl_memdesc *memdesc); + struct kgsl_memdesc *memdesc, const char *name); void (*mmu_remove_global)(struct kgsl_mmu *mmu, struct kgsl_memdesc *memdesc); struct kgsl_pagetable * (*mmu_getpagetable)(struct kgsl_mmu *mmu, @@ -171,6 +171,7 @@ struct kgsl_pagetable *kgsl_mmu_getpagetable_ptbase(struct kgsl_mmu *, void kgsl_add_global_secure_entry(struct kgsl_device *device, struct kgsl_memdesc *memdesc); +void kgsl_print_global_pt_entries(struct seq_file *s); void kgsl_mmu_putpagetable(struct kgsl_pagetable *pagetable); int kgsl_mmu_get_gpuaddr(struct kgsl_pagetable *pagetable, @@ -195,7 +196,7 @@ int kgsl_mmu_find_region(struct kgsl_pagetable *pagetable, uint64_t *gpuaddr, uint64_t size, unsigned int align); void kgsl_mmu_add_global(struct kgsl_device *device, - struct kgsl_memdesc *memdesc); + struct kgsl_memdesc *memdesc, const char *name); void kgsl_mmu_remove_global(struct kgsl_device *device, struct kgsl_memdesc *memdesc); diff --git a/drivers/gpu/msm/kgsl_sharedmem.h b/drivers/gpu/msm/kgsl_sharedmem.h index c05aaecb52841..aae79adcef7ff 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.h +++ b/drivers/gpu/msm/kgsl_sharedmem.h @@ -263,7 +263,7 @@ kgsl_memdesc_footprint(const struct kgsl_memdesc *memdesc) */ static inline int kgsl_allocate_global(struct kgsl_device *device, struct kgsl_memdesc *memdesc, uint64_t size, uint64_t flags, - unsigned int priv) + unsigned int priv, const char *name) { int ret; @@ -281,7 +281,7 @@ static inline int kgsl_allocate_global(struct kgsl_device *device, } if (ret == 0) - kgsl_mmu_add_global(device, memdesc); + kgsl_mmu_add_global(device, memdesc, name); return ret; } From 851a169104e598f366c18f5c9da05df5a48da899 Mon Sep 17 00:00:00 2001 From: Neeraj Soni Date: Thu, 1 Dec 2016 11:01:06 +0530 Subject: [PATCH 0375/1015] ARM: dts: msm: flag to control encryption key size on msm8996 This is required to control the FDE/FBE key size from kernel. Same TZ image can now be used for different encryption key sizes. The key size will not be fixed and will be controlled with this flag in qseecom driver. Change-Id: I45db0edd8f30bec8aff7d026e32029a97c2409c1 Signed-off-by: Neeraj Soni --- arch/arm/boot/dts/qcom/msm8996.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/boot/dts/qcom/msm8996.dtsi b/arch/arm/boot/dts/qcom/msm8996.dtsi index b342288737848..5f004511cc8ec 100644 --- a/arch/arm/boot/dts/qcom/msm8996.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996.dtsi @@ -2495,6 +2495,7 @@ qcom,support-fde; qcom,no-clock-support; qcom,appsbl-qseecom-support; + qcom,fde-key-size; qcom,msm-bus,name = "qseecom-noc"; qcom,msm-bus,num-cases = <4>; qcom,msm-bus,num-paths = <1>; From f1416f88e167e762108dcdcae43c276cb3eee6bf Mon Sep 17 00:00:00 2001 From: Neeraj Soni Date: Fri, 25 Nov 2016 12:18:25 +0530 Subject: [PATCH 0376/1015] qseecom: configurable encryption key size ICE crypto engine key size can now be configured using dtsi flag. This was required to facilitate usage of common TZ image with variable key sizes and also provides flexibility in handling different key sizes requirment in future. dtsi flag is parsed in driver and depending upon the value corresponding key size is passed to TZ. Change-Id: If40f83a943e5ae8333d171c21823a16816d7ddd4 Signed-off-by: Neeraj Soni --- .../devicetree/bindings/qseecom/qseecom.txt | 3 +++ drivers/misc/qseecom.c | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/Documentation/devicetree/bindings/qseecom/qseecom.txt b/Documentation/devicetree/bindings/qseecom/qseecom.txt index a6bf4147460ea..dfc62b78f58dc 100644 --- a/Documentation/devicetree/bindings/qseecom/qseecom.txt +++ b/Documentation/devicetree/bindings/qseecom/qseecom.txt @@ -26,6 +26,7 @@ Optional properties: - vdd-hba-supply : handle for fixed power regulator - qcom,qsee-reentrancy-support: indicates the qsee reentrancy phase supported by the target - qcom,commonlib64-loaded-by-uefi: indicates commonlib64 is loaded by uefi already + - qcom,fde-key-size: indicates which FDE key size is used in device. Example: qcom,qseecom@fe806000 { @@ -46,6 +47,7 @@ Example: qcom,msm_bus,num_paths = <1>; qcom,no-clock-support; qcom,appsbl-qseecom-support; + qcom,fde-key-size; qcom,msm_bus,vectors = <55 512 0 0>, <55 512 3936000000 393600000>, @@ -72,6 +74,7 @@ Example: The following dts setup is the same as the example above. qcom,msm_bus,num_paths = <1>; qcom,no-clock-support; qcom,appsbl-qseecom-support; + qcom,fde-key-size; qcom,msm_bus,vectors = <55 512 0 0>, <55 512 3936000000 393600000>, diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index ecc4a4abf1fed..861cdba7c94bc 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -95,6 +95,7 @@ #define QSEECOM_STATE_NOT_READY 0 #define QSEECOM_STATE_SUSPEND 1 #define QSEECOM_STATE_READY 2 +#define QSEECOM_ICE_FDE_KEY_SIZE_MASK 2 /* * default ce info unit to 0 for @@ -110,6 +111,12 @@ enum qseecom_clk_definitions { CLK_SFPB, }; +enum qseecom_ice_key_size_type{ + QSEECOM_ICE_FDE_KEY_SIZE_16_BYTE = (0 << QSEECOM_ICE_FDE_KEY_SIZE_MASK), + QSEECOM_ICE_FDE_KEY_SIZE_32_BYTE = (1 << QSEECOM_ICE_FDE_KEY_SIZE_MASK), + QSEE_ICE_FDE_KEY_SIZE_UNDEFINED = (0xF << QSEECOM_ICE_FDE_KEY_SIZE_MASK), +}; + enum qseecom_client_handle_type { QSEECOM_CLIENT_APP = 1, QSEECOM_LISTENER_SERVICE, @@ -221,6 +228,7 @@ struct qseecom_control { bool support_bus_scaling; bool support_fde; bool support_pfe; + bool fde_key_size; uint32_t cumulative_mode; enum qseecom_bandwidth_request_mode current_mode; struct timer_list bw_scale_down_timer; @@ -5451,6 +5459,11 @@ static int qseecom_create_key(struct qseecom_dev_handle *data, goto free_buf; } + if (qseecom.fde_key_size) + flags |= QSEECOM_ICE_FDE_KEY_SIZE_32_BYTE; + else + flags |= QSEECOM_ICE_FDE_KEY_SIZE_16_BYTE; + generate_key_ireq.flags = flags; generate_key_ireq.qsee_command_id = QSEOS_GENERATE_KEY; memset((void *)generate_key_ireq.key_id, @@ -5669,6 +5682,12 @@ static int qseecom_update_key_user_info(struct qseecom_dev_handle *data, } ireq.qsee_command_id = QSEOS_UPDATE_KEY_USERINFO; + + if (qseecom.fde_key_size) + flags |= QSEECOM_ICE_FDE_KEY_SIZE_32_BYTE; + else + flags |= QSEECOM_ICE_FDE_KEY_SIZE_16_BYTE; + ireq.flags = flags; memset(ireq.key_id, 0, QSEECOM_KEY_ID_SIZE); memset((void *)ireq.current_hash32, 0, QSEECOM_HASH_SIZE); @@ -8138,6 +8157,8 @@ static int qseecom_probe(struct platform_device *pdev) "qcom,commonlib64-loaded-by-uefi"); pr_debug("qseecom.commonlib64-loaded-by-uefi = 0x%x", qseecom.commonlib64_loaded); + qseecom.fde_key_size = of_property_read_bool((&pdev->dev)->of_node, + "qcom,fde-key-size"); qseecom.no_clock_support = of_property_read_bool((&pdev->dev)->of_node, "qcom,no-clock-support"); From 12895349181eee37f58049a5f6c6872bf585e81c Mon Sep 17 00:00:00 2001 From: Ramesh V Date: Tue, 6 Dec 2016 11:34:34 +0530 Subject: [PATCH 0377/1015] msm: camera: isp: Handle standby mode for B+M Handle the Sleep and awake call from backend to remove ab/ib voting for Mono. Change-Id: I14d3c81f5d1adf8466a612ba872fc062a65fe3c8 Signed-off-by: Ramesh V --- .../msm/camera_v2/isp/msm_isp_axi_util.c | 27 ++++++++++++------- .../msm/camera_v2/isp/msm_isp_axi_util.h | 2 ++ .../platform/msm/camera_v2/isp/msm_isp_util.c | 6 +++++ include/uapi/media/msmb_isp.h | 12 +++++++++ 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index 2a64f86ab092e..f29ce4120aef5 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -17,7 +17,6 @@ #define HANDLE_TO_IDX(handle) (handle & 0xFF) #define ISP_SOF_DEBUG_COUNT 0 - static int msm_isp_update_dual_HW_ms_info_at_start( struct vfe_device *vfe_dev, enum msm_vfe_input_src stream_src); @@ -2185,9 +2184,10 @@ static void msm_isp_update_camif_output_count( /*Factor in Q2 format*/ #define ISP_DEFAULT_FORMAT_FACTOR 6 #define ISP_BUS_UTILIZATION_FACTOR 6 -static int msm_isp_update_stream_bandwidth(struct vfe_device *vfe_dev) +int msm_isp_update_stream_bandwidth(struct vfe_device *vfe_dev, + enum msm_vfe_hw_state hw_state) { - int i, rc = 0; + int i, rc = 0, frame_src, ms_type; struct msm_vfe_axi_stream *stream_info; struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; uint64_t total_pix_bandwidth = 0, total_rdi_bandwidth = 0; @@ -2196,6 +2196,15 @@ static int msm_isp_update_stream_bandwidth(struct vfe_device *vfe_dev) for (i = 0; i < VFE_AXI_SRC_MAX; i++) { stream_info = &axi_data->stream_info[i]; + frame_src = SRC_TO_INTF(stream_info->stream_src); + ms_type = vfe_dev->axi_data.src_info[frame_src]. + dual_hw_ms_info.dual_hw_ms_type; + if (hw_state == HW_STATE_SLEEP) { + rc = msm_isp_update_bandwidth( + ISP_VFE0 + vfe_dev->pdev->id, 0, 0); + return rc; + } + if (stream_info->state == ACTIVE || stream_info->state == START_PENDING) { if (stream_info->stream_src < RDI_INTF_0) { @@ -2206,11 +2215,11 @@ static int msm_isp_update_stream_bandwidth(struct vfe_device *vfe_dev) } } } - total_bandwidth = total_pix_bandwidth + total_rdi_bandwidth; - rc = msm_isp_update_bandwidth(ISP_VFE0 + vfe_dev->pdev->id, - (total_bandwidth + vfe_dev->hw_info->min_ab), - (total_bandwidth + vfe_dev->hw_info->min_ib)); + total_bandwidth = total_pix_bandwidth + total_rdi_bandwidth; + rc = msm_isp_update_bandwidth(ISP_VFE0 + vfe_dev->pdev->id, + (total_bandwidth + vfe_dev->hw_info->min_ab), + (total_bandwidth + vfe_dev->hw_info->min_ib)); if (rc < 0) pr_err("%s: update failed\n", __func__); @@ -2804,7 +2813,7 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev, } } } - msm_isp_update_stream_bandwidth(vfe_dev); + msm_isp_update_stream_bandwidth(vfe_dev, stream_cfg_cmd->hw_state); vfe_dev->hw_info->vfe_ops.axi_ops.reload_wm(vfe_dev, vfe_dev->vfe_base, wm_reload_mask); msm_isp_update_camif_output_count(vfe_dev, stream_cfg_cmd); @@ -2983,7 +2992,7 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev, } msm_isp_update_camif_output_count(vfe_dev, stream_cfg_cmd); - msm_isp_update_stream_bandwidth(vfe_dev); + msm_isp_update_stream_bandwidth(vfe_dev, stream_cfg_cmd->hw_state); for (i = 0; i < stream_cfg_cmd->num_streams; i++) { stream_info = &axi_data->stream_info[ diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.h index 4f036374a8b1c..1fb9f4e0b49a7 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.h @@ -51,6 +51,8 @@ void msm_isp_reset_framedrop(struct vfe_device *vfe_dev, int msm_isp_request_axi_stream(struct vfe_device *vfe_dev, void *arg); void msm_isp_get_avtimer_ts(struct msm_isp_timestamp *time_stamp); int msm_isp_cfg_axi_stream(struct vfe_device *vfe_dev, void *arg); +int msm_isp_update_stream_bandwidth(struct vfe_device *vfe_dev, + enum msm_vfe_hw_state hw_state); int msm_isp_release_axi_stream(struct vfe_device *vfe_dev, void *arg); int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg); void msm_isp_axi_cfg_update(struct vfe_device *vfe_dev, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index 5f0e865e0031c..a653fe68f4a6d 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -829,6 +829,12 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd, rc = msm_isp_cfg_axi_stream(vfe_dev, arg); mutex_unlock(&vfe_dev->core_mutex); break; + case VIDIOC_MSM_ISP_CFG_HW_STATE: + mutex_lock(&vfe_dev->core_mutex); + rc = msm_isp_update_stream_bandwidth(vfe_dev, + *(enum msm_vfe_hw_state *)arg); + mutex_unlock(&vfe_dev->core_mutex); + break; case VIDIOC_MSM_ISP_AXI_HALT: mutex_lock(&vfe_dev->core_mutex); rc = msm_isp_axi_halt(vfe_dev, arg); diff --git a/include/uapi/media/msmb_isp.h b/include/uapi/media/msmb_isp.h index e4d41d4072c58..9fbcacac4930b 100644 --- a/include/uapi/media/msmb_isp.h +++ b/include/uapi/media/msmb_isp.h @@ -330,11 +330,18 @@ enum msm_vfe_axi_stream_cmd { STOP_IMMEDIATELY, }; +enum msm_vfe_hw_state { + HW_STATE_NONE, + HW_STATE_SLEEP, + HW_STATE_AWAKE, +}; + struct msm_vfe_axi_stream_cfg_cmd { uint8_t num_streams; uint32_t stream_handle[VFE_AXI_SRC_MAX]; enum msm_vfe_axi_stream_cmd cmd; uint8_t sync_frame_id_src; + enum msm_vfe_hw_state hw_state; }; enum msm_vfe_axi_stream_update_type { @@ -876,6 +883,7 @@ enum msm_isp_ioctl_cmd_code { MSM_ISP_UNMAP_BUF, MSM_ISP_FETCH_ENG_MULTI_PASS_START, MSM_ISP_MAP_BUF_START_MULTI_PASS_FE, + MSM_ISP_CFG_HW_STATE, }; #define VIDIOC_MSM_VFE_REG_CFG \ @@ -988,4 +996,8 @@ enum msm_isp_ioctl_cmd_code { #define VIDIOC_MSM_ISP_MAP_BUF_START_MULTI_PASS_FE \ _IOWR('V', MSM_ISP_MAP_BUF_START_MULTI_PASS_FE, \ struct msm_vfe_fetch_eng_multi_pass_start) + +#define VIDIOC_MSM_ISP_CFG_HW_STATE \ + _IOWR('V', MSM_ISP_CFG_HW_STATE, \ + struct msm_vfe_axi_stream_cfg_cmd) #endif /* __MSMB_ISP__ */ From d70c8b3313abe80e14b923ef67ff8ec1a8e3ebee Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Fri, 21 Oct 2016 12:18:50 +0530 Subject: [PATCH 0378/1015] msm: mdss: hdmi: fix uninitialized pointer issue in HDCP driver Fix an issue related to an uninitialized pointer. Under certain conditions, it is possible that the driver tries to free memory whose reference is supposed to be held by this pointer and can lead to a crash since the pointer doesn't hold a valid reference. Change-Id: Ic2e16e1d67bc881bd2ae6d00a51ba12835c7a4f7 Signed-off-by: Padmanabhan Komanduru --- drivers/misc/hdcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/misc/hdcp.c b/drivers/misc/hdcp.c index 18fd4c2a9a31e..6f293e3a529d9 100644 --- a/drivers/misc/hdcp.c +++ b/drivers/misc/hdcp.c @@ -1193,7 +1193,7 @@ static void hdcp_lib_msg_recvd(struct hdcp_lib_handle *handle) struct hdcp_rcvd_msg_req *req_buf; struct hdcp_rcvd_msg_rsp *rsp_buf; uint32_t msglen; - char *msg; + char *msg = NULL; if (!handle || !handle->qseecom_handle || !handle->qseecom_handle->sbuf) { From 35b8486b4752bfef66d77b102ef1d7a30ab11841 Mon Sep 17 00:00:00 2001 From: Shiraz Hashim Date: Thu, 3 Nov 2016 20:44:14 +0530 Subject: [PATCH 0379/1015] arm: dma-mapping: page align size before flush tlb start and end must be page aligned while calling flush_tlb_kernel_range else the last page may get missed while invalidation. Change-Id: Ibaab202c47a475623e197a13191b2fed638ce20b Signed-off-by: Shiraz Hashim --- arch/arm/mm/dma-mapping.c | 1 + arch/arm64/mm/dma-mapping.c | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index b8c6ab8f2c15a..b46dc09b3a645 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -808,6 +808,7 @@ static void arm_dma_unremap(struct device *dev, void *remapped_addr, unsigned int flags = VM_ARM_DMA_CONSISTENT | VM_USERMAP; struct vm_struct *area; + size = PAGE_ALIGN(size); remapped_addr = (void *)((unsigned long)remapped_addr & PAGE_MASK); area = find_vm_area(remapped_addr); diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 264fdd42e84e3..5d340f5098e1b 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c @@ -448,6 +448,7 @@ static void arm64_dma_unremap(struct device *dev, void *remapped_addr, { struct vm_struct *area; + size = PAGE_ALIGN(size); remapped_addr = (void *)((unsigned long)remapped_addr & PAGE_MASK); area = find_vm_area(remapped_addr); From 7695bc223ab79fbb01d507cf79ca5691fac5b0a7 Mon Sep 17 00:00:00 2001 From: Vijayavardhan Vennapusa Date: Fri, 2 Dec 2016 16:32:58 +0530 Subject: [PATCH 0380/1015] USB: android: Call PM APIs if configured and suspended are true Currently android driver is calling PM APIs in android_disbable() without having proper check. This leads calling PM APIs when wall charger/ quick charger is conneced, which impacts charging. Hence have a check to allow calling PM APIs only if cdev->configured and cdev->suspended is true to avoid the issue of charging affected. Change-Id: I8f24497432650e01756b635671927da2ddb002fa Signed-off-by: Vijayavardhan Vennapusa --- drivers/usb/gadget/android.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c index e5d8899b19ebc..baf7c19510985 100644 --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -530,9 +530,13 @@ static void android_disable(struct android_dev *dev) { struct usb_composite_dev *cdev = dev->cdev; struct android_configuration *conf; + bool do_put = false; if (dev->disable_depth++ == 0) { - usb_gadget_autopm_get(cdev->gadget); + if (cdev->suspended && cdev->config) { + usb_gadget_autopm_get(cdev->gadget); + do_put = true; + } if (gadget_is_dwc3(cdev->gadget)) { /* Cancel pending control requests */ usb_ep_dequeue(cdev->gadget->ep0, cdev->req); @@ -551,7 +555,8 @@ static void android_disable(struct android_dev *dev) list_for_each_entry(conf, &dev->configs, list_item) usb_remove_config(cdev, &conf->usb_config); } - usb_gadget_autopm_put_async(cdev->gadget); + if (do_put) + usb_gadget_autopm_put_async(cdev->gadget); } } From 53cdb34225ed204937d2ab6d1c02c21a20497adf Mon Sep 17 00:00:00 2001 From: Benet Clark Date: Thu, 10 Nov 2016 17:49:09 -0800 Subject: [PATCH 0381/1015] msm: mdss: Clear compat structures before copying to user. In the compat layer, the temporary structures used to convert data from 32bit to 64bit structures need to be set to 0 before being assigned values. CRs-Fixed: 1088206 Change-Id: I04497bc11e01c3df4beadfd6d9b06ab4321f1723 Signed-off-by: Benet Clark --- drivers/video/msm/mdss/mdss_compat_utils.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_compat_utils.c b/drivers/video/msm/mdss/mdss_compat_utils.c index d3eb3db48eb77..9f1a24431de92 100644 --- a/drivers/video/msm/mdss/mdss_compat_utils.c +++ b/drivers/video/msm/mdss/mdss_compat_utils.c @@ -846,6 +846,7 @@ static int __from_user_pcc_coeff_v17( return -EFAULT; } + memset(&pcc_cfg_payload, 0, sizeof(pcc_cfg_payload)); pcc_cfg_payload.r.b = pcc_cfg_payload32.r.b; pcc_cfg_payload.r.g = pcc_cfg_payload32.r.g; pcc_cfg_payload.r.c = pcc_cfg_payload32.r.c; @@ -1127,6 +1128,8 @@ static int __from_user_igc_lut_data_v17( pr_err("failed to copy payload from user for igc\n"); return -EFAULT; } + + memset(&igc_cfg_payload, 0, sizeof(igc_cfg_payload)); igc_cfg_payload.c0_c1_data = compat_ptr(igc_cfg_payload_32.c0_c1_data); igc_cfg_payload.c2_data = compat_ptr(igc_cfg_payload_32.c2_data); igc_cfg_payload.len = igc_cfg_payload_32.len; @@ -1261,6 +1264,7 @@ static int __from_user_pgc_lut_data_v1_7( pr_err("failed to copy from user the pgc32 payload\n"); return -EFAULT; } + memset(&pgc_cfg_payload, 0, sizeof(pgc_cfg_payload)); pgc_cfg_payload.c0_data = compat_ptr(pgc_cfg_payload_32.c0_data); pgc_cfg_payload.c1_data = compat_ptr(pgc_cfg_payload_32.c1_data); pgc_cfg_payload.c2_data = compat_ptr(pgc_cfg_payload_32.c2_data); @@ -1470,6 +1474,7 @@ static int __from_user_hist_lut_data_v1_7( return -EFAULT; } + memset(&hist_lut_cfg_payload, 0, sizeof(hist_lut_cfg_payload)); hist_lut_cfg_payload.len = hist_lut_cfg_payload32.len; hist_lut_cfg_payload.data = compat_ptr(hist_lut_cfg_payload32.data); @@ -2024,6 +2029,7 @@ static int __from_user_pa_data_v1_7( return -EFAULT; } + memset(&pa_cfg_payload, 0, sizeof(pa_cfg_payload)); pa_cfg_payload.mode = pa_cfg_payload32.mode; pa_cfg_payload.global_hue_adj = pa_cfg_payload32.global_hue_adj; pa_cfg_payload.global_sat_adj = pa_cfg_payload32.global_sat_adj; @@ -2280,6 +2286,8 @@ static int __from_user_gamut_cfg_data_v17( pr_err("failed to copy the gamut payload from userspace\n"); return -EFAULT; } + + memset(&gamut_cfg_payload, 0, sizeof(gamut_cfg_payload)); gamut_cfg_payload.mode = gamut_cfg_payload32.mode; for (i = 0; i < MDP_GAMUT_TABLE_NUM_V1_7; i++) { gamut_cfg_payload.tbl_size[i] = From 539399acbaecba7af7c411f6f28ac0189e459bb5 Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Tue, 15 Nov 2016 14:55:35 -0800 Subject: [PATCH 0382/1015] msm: camera: eeprom: Validate the power setting size. Validate the power setting size before copying. If userspace sends a value which is greater than MAX_POWER_CONFIG, then the driver accesses unintended memory. This change will fix the issue. Crs-Fixed: 1089433 Signed-off-by: Rajesh Bondugula Change-Id: Iaaa6f5b3c1c2ac5b5b38b3ac407d6ae394bba780 --- .../msm/camera_v2/sensor/eeprom/msm_eeprom.c | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c index 1f891ac76c965..32d2e07111551 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c @@ -1402,6 +1402,16 @@ static int eeprom_init_config32(struct msm_eeprom_ctrl_t *e_ctrl, power_info = &(e_ctrl->eboard_info->power_info); + if ((power_setting_array32->size > MAX_POWER_CONFIG) || + (power_setting_array32->size_down > MAX_POWER_CONFIG) || + (!power_setting_array32->size) || + (!power_setting_array32->size_down)) { + pr_err("%s:%d invalid power setting size=%d size_down=%d\n", + __func__, __LINE__, power_setting_array32->size, + power_setting_array32->size_down); + rc = -EINVAL; + goto free_mem; + } msm_eeprom_copy_power_settings_compat( power_setting_array, power_setting_array32); @@ -1416,20 +1426,6 @@ static int eeprom_init_config32(struct msm_eeprom_ctrl_t *e_ctrl, power_info->power_down_setting_size = power_setting_array->size_down; - if ((power_info->power_setting_size > - MAX_POWER_CONFIG) || - (power_info->power_down_setting_size > - MAX_POWER_CONFIG) || - (!power_info->power_down_setting_size) || - (!power_info->power_setting_size)) { - rc = -EINVAL; - pr_err("%s:%d Invalid power setting size :%d, %d\n", - __func__, __LINE__, - power_info->power_setting_size, - power_info->power_down_setting_size); - goto free_mem; - } - if (e_ctrl->i2c_client.cci_client) { e_ctrl->i2c_client.cci_client->i2c_freq_mode = cdata32->cfg.eeprom_info.i2c_freq_mode; From 7e713e85ea053f053f4869a3f07a0ae4b5b287b8 Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Tue, 15 Nov 2016 13:52:49 -0800 Subject: [PATCH 0383/1015] msm: camera: sensor: Validate eeprom_name string length. Validate eeprom_name string length before copying into the userspace buffer. If more data than required is copied, userspace has the access to some of kernel data which is not intended. This change will fix the issue. CRs-Fixed: 1090007 Signed-off-by: Rajesh Bondugula Change-Id: Id40a287e0b1a93cc15d9b02c757fe9f347e285f2 --- .../msm/camera_v2/sensor/eeprom/msm_eeprom.c | 22 +++++++++++++++---- include/uapi/media/msm_cam_sensor.h | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c index 32d2e07111551..dd2f9192e32f7 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c @@ -617,6 +617,7 @@ static int msm_eeprom_config(struct msm_eeprom_ctrl_t *e_ctrl, struct msm_eeprom_cfg_data *cdata = (struct msm_eeprom_cfg_data *)argp; int rc = 0; + size_t length = 0; CDBG("%s E\n", __func__); switch (cdata->cfgtype) { @@ -629,9 +630,15 @@ static int msm_eeprom_config(struct msm_eeprom_ctrl_t *e_ctrl, } CDBG("%s E CFG_EEPROM_GET_INFO\n", __func__); cdata->is_supported = e_ctrl->is_supported; + length = strlen(e_ctrl->eboard_info->eeprom_name) + 1; + if (length > MAX_EEPROM_NAME) { + pr_err("%s:%d invalid eeprom_name length %d\n", + __func__, __LINE__, (int)length); + rc = -EINVAL; + break; + } memcpy(cdata->cfg.eeprom_name, - e_ctrl->eboard_info->eeprom_name, - sizeof(cdata->cfg.eeprom_name)); + e_ctrl->eboard_info->eeprom_name, length); break; case CFG_EEPROM_GET_CAL_DATA: CDBG("%s E CFG_EEPROM_GET_CAL_DATA\n", __func__); @@ -1475,6 +1482,7 @@ static int msm_eeprom_config32(struct msm_eeprom_ctrl_t *e_ctrl, struct msm_eeprom_cfg_data32 *cdata = (struct msm_eeprom_cfg_data32 *)argp; int rc = 0; + size_t length = 0; CDBG("%s E\n", __func__); switch (cdata->cfgtype) { @@ -1487,9 +1495,15 @@ static int msm_eeprom_config32(struct msm_eeprom_ctrl_t *e_ctrl, } CDBG("%s E CFG_EEPROM_GET_INFO\n", __func__); cdata->is_supported = e_ctrl->is_supported; + length = strlen(e_ctrl->eboard_info->eeprom_name) + 1; + if (length > MAX_EEPROM_NAME) { + pr_err("%s:%d invalid eeprom_name length %d\n", + __func__, __LINE__, (int)length); + rc = -EINVAL; + break; + } memcpy(cdata->cfg.eeprom_name, - e_ctrl->eboard_info->eeprom_name, - sizeof(cdata->cfg.eeprom_name)); + e_ctrl->eboard_info->eeprom_name, length); break; case CFG_EEPROM_GET_CAL_DATA: CDBG("%s E CFG_EEPROM_GET_CAL_DATA\n", __func__); diff --git a/include/uapi/media/msm_cam_sensor.h b/include/uapi/media/msm_cam_sensor.h index 5b164a8fbf005..3f0e0f7596ab0 100644 --- a/include/uapi/media/msm_cam_sensor.h +++ b/include/uapi/media/msm_cam_sensor.h @@ -302,7 +302,7 @@ struct msm_eeprom_cfg_data { enum eeprom_cfg_type_t cfgtype; uint8_t is_supported; union { - char eeprom_name[MAX_SENSOR_NAME]; + char eeprom_name[MAX_EEPROM_NAME]; struct eeprom_get_t get_data; struct eeprom_read_t read_data; struct eeprom_write_t write_data; From bd9a8fc6d7f6bd1a0b936994630006de450df657 Mon Sep 17 00:00:00 2001 From: Neeraj Soni Date: Mon, 28 Nov 2016 18:23:33 +0530 Subject: [PATCH 0384/1015] qcrypto: protect potential integer overflow. Adding user passed parameters without check might lead to Integer overflow and unpredictable system behaviour. Change-Id: Iaf8259e3c4a157e1790f1447b1b62a646988b7c4 Signed-off-by: Neeraj Soni --- drivers/crypto/msm/qce50.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/crypto/msm/qce50.c b/drivers/crypto/msm/qce50.c index b33d879d56a41..9788e0e09d8b8 100644 --- a/drivers/crypto/msm/qce50.c +++ b/drivers/crypto/msm/qce50.c @@ -4913,6 +4913,12 @@ int qce_aead_req(void *handle, struct qce_req *q_req) else q_req->cryptlen = areq->cryptlen - authsize; + if ((q_req->cryptlen > UINT_MAX - areq->assoclen) || + (q_req->cryptlen + areq->assoclen > UINT_MAX - ivsize)) { + pr_err("Integer overflow on total aead req length.\n"); + return -EINVAL; + } + totallen = q_req->cryptlen + areq->assoclen + ivsize; if (pce_dev->support_cmd_dscr) { From 09761a91c93bf9b6f6d991b36770c52b034875a7 Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Wed, 23 Nov 2016 21:44:50 +0530 Subject: [PATCH 0385/1015] power: qpnp-smbcharger: Enable parallel charger if input is present The parallel charger check in the fast-chg handler is only needed in the enable parallel-charging path. Handle this by checking for the input presence before configuring the parallel charger. CRs-Fixed: 1089991 Change-Id: I7a12f62de0b8c36797511bac97ecbb9fbc1caf26 Signed-off-by: Anirudh Ghayal --- drivers/power/qpnp-smbcharger.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/power/qpnp-smbcharger.c b/drivers/power/qpnp-smbcharger.c index f23d95056b8c4..f21ff61867e24 100644 --- a/drivers/power/qpnp-smbcharger.c +++ b/drivers/power/qpnp-smbcharger.c @@ -6254,8 +6254,12 @@ static irqreturn_t fastchg_handler(int irq, void *_chip) struct smbchg_chip *chip = _chip; pr_smb(PR_INTERRUPT, "p2f triggered\n"); - smbchg_detect_parallel_charger(chip); - smbchg_parallel_usb_check_ok(chip); + + if (is_usb_present(chip) || is_dc_present(chip)) { + smbchg_detect_parallel_charger(chip); + smbchg_parallel_usb_check_ok(chip); + } + if (chip->psy_registered) power_supply_changed(&chip->batt_psy); smbchg_charging_status_change(chip); From 0f9d3397d2facc67f146262a84f119e2338fbd85 Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Thu, 24 Nov 2016 08:55:04 +0530 Subject: [PATCH 0386/1015] power: smb135x-charger: Add mutex locking in parallel enable path Add locking in the parallel charger present callback to avoid a race while configuring it from the primary charger. CRs-Fixed: 1089991 Change-Id: Ice7f234dcf406f12dadb561d46e049efd9d6ad88 Signed-off-by: Anirudh Ghayal --- drivers/power/smb1351-charger.c | 9 ++++++++- drivers/power/smb135x-charger.c | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/power/smb1351-charger.c b/drivers/power/smb1351-charger.c index 411b85fe9f409..2894ea823648e 100644 --- a/drivers/power/smb1351-charger.c +++ b/drivers/power/smb1351-charger.c @@ -529,6 +529,7 @@ struct smb1351_charger { int slave_fcc_ma_before_esr; int workaround_flags; + struct mutex parallel_config_lock; int parallel_pin_polarity_setting; bool is_slave; bool use_external_fg; @@ -2559,10 +2560,12 @@ static int smb1351_parallel_set_property(struct power_supply *psy, } break; case POWER_SUPPLY_PROP_PRESENT: + mutex_lock(&chip->parallel_config_lock); rc = smb1351_parallel_set_chg_present(chip, val->intval); if (rc) pr_err("Set charger %spresent failed\n", val->intval ? "" : "un-"); + mutex_unlock(&chip->parallel_config_lock); break; case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: if (chip->parallel_charger_present) { @@ -4658,6 +4661,7 @@ static int smb1351_parallel_slave_probe(struct i2c_client *client, EN_BY_PIN_HIGH_ENABLE : EN_BY_PIN_LOW_ENABLE; i2c_set_clientdata(client, chip); + mutex_init(&chip->parallel_config_lock); chip->parallel_psy.name = "usb-parallel"; chip->parallel_psy.type = POWER_SUPPLY_TYPE_USB_PARALLEL; @@ -4690,6 +4694,7 @@ static int smb1351_parallel_slave_probe(struct i2c_client *client, wakeup_source_trash(&chip->smb1351_ws.source); mutex_destroy(&chip->irq_complete); mutex_destroy(&chip->fcc_lock); + mutex_destroy(&chip->parallel_config_lock); return rc; } @@ -4712,8 +4717,10 @@ static int smb1351_charger_remove(struct i2c_client *client) wakeup_source_trash(&chip->smb1351_ws.source); mutex_destroy(&chip->irq_complete); mutex_destroy(&chip->fcc_lock); - if (is_parallel_slave(client)) + if (is_parallel_slave(client)) { + mutex_destroy(&chip->parallel_config_lock); mutex_destroy(&chip->parallel.lock); + } debugfs_remove_recursive(chip->debug_root); return 0; } diff --git a/drivers/power/smb135x-charger.c b/drivers/power/smb135x-charger.c index 7f970066fe07d..9d680155492ab 100644 --- a/drivers/power/smb135x-charger.c +++ b/drivers/power/smb135x-charger.c @@ -375,6 +375,7 @@ struct smb135x_chg { struct mutex otg_oc_count_lock; struct delayed_work hvdcp_det_work; + struct mutex parallel_config_lock; bool parallel_charger; bool parallel_charger_present; bool bms_controlled_charging; @@ -1954,7 +1955,9 @@ static int smb135x_parallel_set_property(struct power_supply *psy, chip->chg_enabled = val->intval; break; case POWER_SUPPLY_PROP_PRESENT: + mutex_lock(&chip->parallel_config_lock); rc = smb135x_parallel_set_chg_present(chip, val->intval); + mutex_unlock(&chip->parallel_config_lock); break; case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: if (chip->parallel_charger_present) { @@ -4391,6 +4394,7 @@ static int smb135x_parallel_charger_probe(struct i2c_client *client, mutex_init(&chip->path_suspend_lock); mutex_init(&chip->current_change_lock); mutex_init(&chip->read_write_lock); + mutex_init(&chip->parallel_config_lock); wakeup_source_init(&chip->wake_source.source, "smb_wake_source"); match = of_match_node(smb135x_match_table, node); @@ -4449,6 +4453,7 @@ static int smb135x_charger_remove(struct i2c_client *client) if (chip->parallel_charger) { power_supply_unregister(&chip->parallel_psy); + mutex_destroy(&chip->parallel_config_lock); goto mutex_destroy; } From 27532cef54faecbf084d3f5e19c14d460d30740e Mon Sep 17 00:00:00 2001 From: Deepak Kushwah Date: Thu, 1 Dec 2016 13:59:38 +0530 Subject: [PATCH 0387/1015] msm: vidc: Fix kw issues Currently we are using the argument passed to the function to fill the array values as is without checking for the sanity. This commit will add a sanity check on function argument to avoid array index out of bound access. Change-Id: I5f23f036441a67a3f3828cc432ea57c1c06bc8ae CRs-Fixed: 1096134 Signed-off-by: Deepak Kushwah --- drivers/media/platform/msm/vidc/msm_vidc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c index 0cab4cc3ef11c..2c0629415bf19 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_vidc.c @@ -316,6 +316,10 @@ struct buffer_info *device_to_uvaddr(struct msm_vidc_list *buf_list, static inline void populate_buf_info(struct buffer_info *binfo, struct v4l2_buffer *b, u32 i) { + if (i >= VIDEO_MAX_PLANES) { + dprintk(VIDC_ERR, "%s: Invalid input\n", __func__); + return; + } binfo->type = b->type; binfo->fd[i] = b->m.planes[i].reserved[0]; binfo->buff_off[i] = b->m.planes[i].reserved[1]; From a1f5380e5d62d75aa656d0cded2b0947300d7de7 Mon Sep 17 00:00:00 2001 From: Sathish Kumar Date: Tue, 15 Nov 2016 12:14:36 +0530 Subject: [PATCH 0388/1015] ARM: dts: msm: Add GPU speed bin 2 support for MSM8996v3 GPU speed-bin 2 supports fmax of 560MHz and DDR 1555MHz. Add this config to MSM8996v3 to support required GPU fmax. Change-Id: Ibdf9bb63c7d8f0e980fbf3c192d536adeaeec52d Signed-off-by: Dumpeti Sathish Kumar --- arch/arm/boot/dts/qcom/msm8996-v3.dtsi | 65 ++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8996-v3.dtsi b/arch/arm/boot/dts/qcom/msm8996-v3.dtsi index c30e19eacc69f..8daa7441a6eda 100644 --- a/arch/arm/boot/dts/qcom/msm8996-v3.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-v3.dtsi @@ -242,6 +242,71 @@ }; }; + qcom,gpu-pwrlevels-2 { + #address-cells = <1>; + #size-cells = <0>; + + qcom,speed-bin = <2>; + + qcom,initial-pwrlevel = <4>; + + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <560000000>; + qcom,bus-freq = <11>; + qcom,bus-min = <11>; + qcom,bus-max = <11>; + }; + + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <510000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <8>; + qcom,bus-max = <10>; + }; + + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <401800000>; + qcom,bus-freq = <8>; + qcom,bus-min = <7>; + qcom,bus-max = <9>; + }; + + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <315000000>; + qcom,bus-freq = <6>; + qcom,bus-min = <5>; + qcom,bus-max = <7>; + }; + + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <214000000>; + qcom,bus-freq = <4>; + qcom,bus-min = <3>; + qcom,bus-max = <5>; + }; + + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <133000000>; + qcom,bus-freq = <3>; + qcom,bus-min = <2>; + qcom,bus-max = <4>; + }; + + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <27000000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + qcom,bus-max = <0>; + + }; + }; }; }; From 2429bb1d98abde600038647cc93be1a649ec3f33 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Thu, 8 Dec 2016 12:46:39 +0530 Subject: [PATCH 0389/1015] ARM: dts: msm: Update APC CPR voltage margins for msm8920 Update APC CPR static open-loop and closed-loop voltage margins for msm8920 as per voltage characterization results. CRs-Fixed: 1098408 Change-Id: Ibfe82d6b261aae9f1540ad025990d397e8925403 Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8920.dtsi | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 7307b60edd3e8..31f8d5d0a550e 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -197,16 +197,19 @@ qcom,cpr-fuse-version-map = /* Format: */ + < 0 0 1 (-1) (-1) (-1)>, < 0 0 (-1) (-1) (-1) (-1)>, <(-1) (-1) (-1) (-1) (-1) (-1)>; qcom,cpr-init-voltage-adjustment = - <40000 15000 20000>, - <0 0 0>; + <0 0 0>, + <10000 0 0>, + <0 0 0>; qcom,cpr-quotient-adjustment = - <66 57 66>, /* SVSP(35mv); NOM(30mv); TUR(35mv); KV(1.9) */ - <0 0 0>; + <(-19) (-28) (-19)>, /* SVSP(-10) NOM(-15) TUR(-10); KV(1.9) */ + < 0 0 0 >, + < 0 0 0 >; qcom,cpr-enable; }; From 071e2e2fa9870652c0c478ace206e68d4592f670 Mon Sep 17 00:00:00 2001 From: Rohit Kumar Date: Mon, 28 Nov 2016 12:23:18 +0530 Subject: [PATCH 0390/1015] ASoC: msm: qdsp6v2: Add mutex in afe_map_cal_data Add mutex_lock in afe_map_cal_data around afe_cmd_memory_map to avoid update of this_afe.status by afe_set_lpass_clk_cfg afe callback. This fixes the failure of afe_cmd_memory_map waitqueue to enter into sleep when wait_event_timeout is called as this_afe.status is already zero leading to invalid map_handle. CRs-Fixed: 1094151 Change-Id: I4833253803c162c98578ba7ce599ea1edafc1724 Signed-off-by: Rohit Kumar --- sound/soc/msm/qdsp6v2/q6afe.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/soc/msm/qdsp6v2/q6afe.c b/sound/soc/msm/qdsp6v2/q6afe.c index 6ee5db5f850d4..866a727796863 100644 --- a/sound/soc/msm/qdsp6v2/q6afe.c +++ b/sound/soc/msm/qdsp6v2/q6afe.c @@ -6018,6 +6018,7 @@ static int afe_map_cal_data(int32_t cal_type, } + mutex_lock(&this_afe.afe_cmd_lock); atomic_set(&this_afe.mem_map_cal_index, cal_index); ret = afe_cmd_memory_map(cal_block->cal_data.paddr, cal_block->map_data.map_size); @@ -6030,10 +6031,12 @@ static int afe_map_cal_data(int32_t cal_type, __func__, &cal_block->cal_data.paddr, cal_block->map_data.map_size); + mutex_unlock(&this_afe.afe_cmd_lock); goto done; } cal_block->map_data.q6map_handle = atomic_read(&this_afe. mem_map_cal_handles[cal_index]); + mutex_unlock(&this_afe.afe_cmd_lock); done: return ret; } From 4794ca33eca0b9d90546d968458a309391e16965 Mon Sep 17 00:00:00 2001 From: Krishnankutty Kolathappilly Date: Wed, 16 Nov 2016 18:22:58 -0800 Subject: [PATCH 0391/1015] msm: cpp: Fix for buffer overflow in cpp. Fix for buffer overflow while handling ioctl. Instead of checking for length boundary, fix checks for exact length. CRs-Fixed: 518731 Change-Id: I9002f84b219e8b06ae0672d87c2d999e728a75aa Signed-off-by: Krishnankutty Kolathappilly --- drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index 964b43fb1e51d..e02188510bff9 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -2949,8 +2949,7 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, uint32_t identity; struct msm_cpp_buff_queue_info_t *buff_queue_info; CPP_DBG("VIDIOC_MSM_CPP_DEQUEUE_STREAM_BUFF_INFO\n"); - if ((ioctl_ptr->len == 0) || - (ioctl_ptr->len > sizeof(uint32_t))) { + if (ioctl_ptr->len != sizeof(uint32_t)) { mutex_unlock(&cpp_dev->mutex); return -EINVAL; } From 757a5fdddab5857e617bc2b64e838ad88ddb1f6b Mon Sep 17 00:00:00 2001 From: Neeraj Soni Date: Mon, 28 Nov 2016 18:23:33 +0530 Subject: [PATCH 0392/1015] qcrypto: protect potential integer overflow. Adding user passed parameters without check might lead to Integer overflow and unpredictable system behaviour. Change-Id: Iaf8259e3c4a157e1790f1447b1b62a646988b7c4 Signed-off-by: Neeraj Soni --- drivers/crypto/msm/qce50.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/crypto/msm/qce50.c b/drivers/crypto/msm/qce50.c index b33d879d56a41..9788e0e09d8b8 100644 --- a/drivers/crypto/msm/qce50.c +++ b/drivers/crypto/msm/qce50.c @@ -4913,6 +4913,12 @@ int qce_aead_req(void *handle, struct qce_req *q_req) else q_req->cryptlen = areq->cryptlen - authsize; + if ((q_req->cryptlen > UINT_MAX - areq->assoclen) || + (q_req->cryptlen + areq->assoclen > UINT_MAX - ivsize)) { + pr_err("Integer overflow on total aead req length.\n"); + return -EINVAL; + } + totallen = q_req->cryptlen + areq->assoclen + ivsize; if (pce_dev->support_cmd_dscr) { From 952aff627448f16f5fabaa30fd7ea8e4fdd4140c Mon Sep 17 00:00:00 2001 From: Xiaoyu Ye Date: Tue, 22 Nov 2016 13:51:51 -0800 Subject: [PATCH 0393/1015] ASoC: msm: qdsp6v2: Fix an incorrect string comparison logic A conditional branch is skipped due to incorrect string comparison. It is fixed by using "strcmp" to perform string comparison. CRs-fixed: 1085889 Change-Id: I12be44ac272fc5079230feb6ae24c68ccde99cf2 Signed-off-by: Xiaoyu Ye Signed-off-by: Bhalchandra Gajare --- sound/soc/msm/qdsp6v2/q6afe.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/q6afe.c b/sound/soc/msm/qdsp6v2/q6afe.c index 6ee5db5f850d4..0c5a85cccd77a 100644 --- a/sound/soc/msm/qdsp6v2/q6afe.c +++ b/sound/soc/msm/qdsp6v2/q6afe.c @@ -4277,7 +4277,7 @@ static ssize_t afe_debug_write(struct file *filp, lbuf[cnt] = '\0'; - if (!strncmp(lb_str, "afe_loopback", 12)) { + if (!strcmp(lb_str, "afe_loopback")) { rc = afe_get_parameters(lbuf, param, 3); if (!rc) { pr_info("%s: %lu %lu %lu\n", lb_str, param[0], param[1], @@ -4306,7 +4306,7 @@ static ssize_t afe_debug_write(struct file *filp, rc = -EINVAL; } - } else if (!strncmp(lb_str, "afe_loopback_gain", 17)) { + } else if (!strcmp(lb_str, "afe_loopback_gain")) { rc = afe_get_parameters(lbuf, param, 2); if (!rc) { pr_info("%s: %s %lu %lu\n", From ef2063b591d84792999d18be8b4f4bc72b836622 Mon Sep 17 00:00:00 2001 From: Sureshnaidu Laveti Date: Wed, 23 Nov 2016 07:08:56 -0800 Subject: [PATCH 0394/1015] msm: sensor: correcting return value for get actuator info Correcting the return value for getting the actuator information IOCTL. CRs-Fixed: 1084177 Change-Id: I2bbe7be3daedef45a5990c23168df5185e72e82f Signed-off-by: Sureshnaidu Laveti --- .../media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c index a700f836061cd..b3623d9258f77 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c @@ -1418,6 +1418,7 @@ static int32_t msm_actuator_config(struct msm_actuator_ctrl_t *a_ctrl, case CFG_GET_ACTUATOR_INFO: cdata->is_af_supported = 1; cdata->cfg.cam_name = a_ctrl->cam_name; + rc = 0; break; case CFG_SET_ACTUATOR_INFO: From de725b21534e8bca53619a5c63b2a178eb4b5c50 Mon Sep 17 00:00:00 2001 From: Sureshnaidu Laveti Date: Fri, 4 Nov 2016 04:36:27 -0700 Subject: [PATCH 0395/1015] msm: sensor: Validationg function pointers before using them Since IOCTLS can come in any order, validating the actuator function table and methods before accessing them. CRs-Fixed: 1084177 Change-Id: Ic6fce52fdf4d1420c2b707ec9bc9cba045066a13 Signed-off-by: Sureshnaidu Laveti --- .../camera_v2/sensor/actuator/msm_actuator.c | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c index a700f836061cd..b413bf3855b86 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c @@ -1396,7 +1396,7 @@ static int32_t msm_actuator_config(struct msm_actuator_ctrl_t *a_ctrl, { struct msm_actuator_cfg_data *cdata = (struct msm_actuator_cfg_data *)argp; - int32_t rc = 0; + int32_t rc = -EINVAL; mutex_lock(a_ctrl->actuator_mutex); CDBG("Enter\n"); CDBG("%s type %d\n", __func__, cdata->cfgtype); @@ -1406,7 +1406,7 @@ static int32_t msm_actuator_config(struct msm_actuator_ctrl_t *a_ctrl, a_ctrl->actuator_state == ACT_DISABLE_STATE) { pr_err("actuator disabled %d\n", rc); mutex_unlock(a_ctrl->actuator_mutex); - return -EINVAL; + return rc; } switch (cdata->cfgtype) { @@ -1427,15 +1427,19 @@ static int32_t msm_actuator_config(struct msm_actuator_ctrl_t *a_ctrl, break; case CFG_SET_DEFAULT_FOCUS: - rc = a_ctrl->func_tbl->actuator_set_default_focus(a_ctrl, - &cdata->cfg.move); + if (a_ctrl->func_tbl && + a_ctrl->func_tbl->actuator_set_default_focus) + rc = a_ctrl->func_tbl->actuator_set_default_focus( + a_ctrl, &cdata->cfg.move); if (rc < 0) pr_err("move focus failed %d\n", rc); break; case CFG_MOVE_FOCUS: - rc = a_ctrl->func_tbl->actuator_move_focus(a_ctrl, - &cdata->cfg.move); + if (a_ctrl->func_tbl && + a_ctrl->func_tbl->actuator_move_focus) + rc = a_ctrl->func_tbl->actuator_move_focus(a_ctrl, + &cdata->cfg.move); if (rc < 0) pr_err("move focus failed %d\n", rc); break; @@ -1446,8 +1450,10 @@ static int32_t msm_actuator_config(struct msm_actuator_ctrl_t *a_ctrl, break; case CFG_SET_POSITION: - rc = a_ctrl->func_tbl->actuator_set_position(a_ctrl, - &cdata->cfg.setpos); + if (a_ctrl->func_tbl && + a_ctrl->func_tbl->actuator_set_position) + rc = a_ctrl->func_tbl->actuator_set_position(a_ctrl, + &cdata->cfg.setpos); if (rc < 0) pr_err("actuator_set_position failed %d\n", rc); break; From dbf2d717a3cb3d4bb8c40483f2a2cde746d90239 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Wed, 25 May 2016 11:48:25 -0400 Subject: [PATCH 0396/1015] percpu: fix synchronization between synchronous map extension and chunk destruction For non-atomic allocations, pcpu_alloc() can try to extend the area map synchronously after dropping pcpu_lock; however, the extension wasn't synchronized against chunk destruction and the chunk might get freed while extension is in progress. This patch fixes the bug by putting most of non-atomic allocations under pcpu_alloc_mutex to synchronize against pcpu_balance_work which is responsible for async chunk management including destruction. Change-Id: I79e7a5ebca297f69e562649edc41ccfa4c6de3bd Signed-off-by: Tejun Heo Reported-and-tested-by: Alexei Starovoitov Reported-by: Vlastimil Babka Reported-by: Sasha Levin Cc: stable@vger.kernel.org # v3.18+ Fixes: 1a4d76076cda ("percpu: implement asynchronous chunk population") Git-repo: http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: 6710e594f71ccaad8101bc64321152af7cd9ea28 Signed-off-by: Dennis Cagle --- mm/percpu.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mm/percpu.c b/mm/percpu.c index 88bb6c92d83a9..ae2288fe88382 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -160,7 +160,7 @@ static struct pcpu_chunk *pcpu_reserved_chunk; static int pcpu_reserved_chunk_limit; static DEFINE_SPINLOCK(pcpu_lock); /* all internal data structures */ -static DEFINE_MUTEX(pcpu_alloc_mutex); /* chunk create/destroy, [de]pop */ +static DEFINE_MUTEX(pcpu_alloc_mutex); /* chunk create/destroy, [de]pop, map ext */ static struct list_head *pcpu_slot __read_mostly; /* chunk list slots */ @@ -437,6 +437,8 @@ static int pcpu_extend_area_map(struct pcpu_chunk *chunk, int new_alloc) size_t old_size = 0, new_size = new_alloc * sizeof(new[0]); unsigned long flags; + lockdep_assert_held(&pcpu_alloc_mutex); + new = pcpu_mem_zalloc(new_size); if (!new) return -ENOMEM; @@ -897,6 +899,9 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, return NULL; } + if (!is_atomic) + mutex_lock(&pcpu_alloc_mutex); + spin_lock_irqsave(&pcpu_lock, flags); /* serve reserved allocations from the reserved chunk if available */ @@ -969,12 +974,9 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, if (is_atomic) goto fail; - mutex_lock(&pcpu_alloc_mutex); - if (list_empty(&pcpu_slot[pcpu_nr_slots - 1])) { chunk = pcpu_create_chunk(); if (!chunk) { - mutex_unlock(&pcpu_alloc_mutex); err = "failed to allocate new chunk"; goto fail; } @@ -985,7 +987,6 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, spin_lock_irqsave(&pcpu_lock, flags); } - mutex_unlock(&pcpu_alloc_mutex); goto restart; area_found: @@ -995,8 +996,6 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, if (!is_atomic) { int page_start, page_end, rs, re; - mutex_lock(&pcpu_alloc_mutex); - page_start = PFN_DOWN(off); page_end = PFN_UP(off + size); @@ -1007,7 +1006,6 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, spin_lock_irqsave(&pcpu_lock, flags); if (ret) { - mutex_unlock(&pcpu_alloc_mutex); pcpu_free_area(chunk, off, &occ_pages); err = "failed to populate"; goto fail_unlock; @@ -1047,6 +1045,8 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, /* see the flag handling in pcpu_blance_workfn() */ pcpu_atomic_alloc_failed = true; pcpu_schedule_balance_work(); + } else { + mutex_unlock(&pcpu_alloc_mutex); } return NULL; } From 452df6d2ccc0a7694e51cfe8a3e54493891a44d0 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Wed, 25 May 2016 11:48:25 -0400 Subject: [PATCH 0397/1015] percpu: fix synchronization between chunk->map_extend_work and chunk destruction Atomic allocations can trigger async map extensions which is serviced by chunk->map_extend_work. pcpu_balance_work which is responsible for destroying idle chunks wasn't synchronizing properly against chunk->map_extend_work and may end up freeing the chunk while the work item is still in flight. This patch fixes the bug by rolling async map extension operations into pcpu_balance_work. Change-Id: Id41817a5c5f2c9ed9b19022df0c0ff7daacf6a71 Signed-off-by: Tejun Heo Reported-and-tested-by: Alexei Starovoitov Reported-by: Vlastimil Babka Reported-by: Sasha Levin Cc: stable@vger.kernel.org # v3.18+ Fixes: 9c824b6a172c ("percpu: make sure chunk->map array has available space") Git-repo: http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: 4f996e234dad488e5d9ba0858bc1bae12eff82c3 Signed-off-by: Dennis Cagle --- mm/percpu.c | 57 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/mm/percpu.c b/mm/percpu.c index ae2288fe88382..5ae6e02849670 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -110,7 +110,7 @@ struct pcpu_chunk { int map_used; /* # of map entries used before the sentry */ int map_alloc; /* # of map entries allocated */ int *map; /* allocation map */ - struct work_struct map_extend_work;/* async ->map[] extension */ + struct list_head map_extend_list;/* on pcpu_map_extend_chunks */ void *data; /* chunk data */ int first_free; /* no free below this */ @@ -164,6 +164,9 @@ static DEFINE_MUTEX(pcpu_alloc_mutex); /* chunk create/destroy, [de]pop, map ext static struct list_head *pcpu_slot __read_mostly; /* chunk list slots */ +/* chunks which need their map areas extended, protected by pcpu_lock */ +static LIST_HEAD(pcpu_map_extend_chunks); + /* * The number of empty populated pages, protected by pcpu_lock. The * reserved chunk doesn't contribute to the count. @@ -397,13 +400,19 @@ static int pcpu_need_to_extend(struct pcpu_chunk *chunk, bool is_atomic) { int margin, new_alloc; + lockdep_assert_held(&pcpu_lock); + if (is_atomic) { margin = 3; if (chunk->map_alloc < - chunk->map_used + PCPU_ATOMIC_MAP_MARGIN_LOW && - pcpu_async_enabled) - schedule_work(&chunk->map_extend_work); + chunk->map_used + PCPU_ATOMIC_MAP_MARGIN_LOW) { + if (list_empty(&chunk->map_extend_list)) { + list_add_tail(&chunk->map_extend_list, + &pcpu_map_extend_chunks); + pcpu_schedule_balance_work(); + } + } } else { margin = PCPU_ATOMIC_MAP_MARGIN_HIGH; } @@ -471,20 +480,6 @@ static int pcpu_extend_area_map(struct pcpu_chunk *chunk, int new_alloc) return 0; } -static void pcpu_map_extend_workfn(struct work_struct *work) -{ - struct pcpu_chunk *chunk = container_of(work, struct pcpu_chunk, - map_extend_work); - int new_alloc; - - spin_lock_irq(&pcpu_lock); - new_alloc = pcpu_need_to_extend(chunk, false); - spin_unlock_irq(&pcpu_lock); - - if (new_alloc) - pcpu_extend_area_map(chunk, new_alloc); -} - /** * pcpu_fit_in_area - try to fit the requested allocation in a candidate area * @chunk: chunk the candidate area belongs to @@ -744,7 +739,7 @@ static struct pcpu_chunk *pcpu_alloc_chunk(void) chunk->map_used = 1; INIT_LIST_HEAD(&chunk->list); - INIT_WORK(&chunk->map_extend_work, pcpu_map_extend_workfn); + INIT_LIST_HEAD(&chunk->map_extend_list); chunk->free_size = pcpu_unit_size; chunk->contig_hint = pcpu_unit_size; @@ -1131,6 +1126,7 @@ static void pcpu_balance_workfn(struct work_struct *work) if (chunk == list_first_entry(free_head, struct pcpu_chunk, list)) continue; + list_del_init(&chunk->map_extend_list); list_move(&chunk->list, &to_free); } @@ -1148,6 +1144,25 @@ static void pcpu_balance_workfn(struct work_struct *work) pcpu_destroy_chunk(chunk); } + /* service chunks which requested async area map extension */ + do { + int new_alloc = 0; + + spin_lock_irq(&pcpu_lock); + + chunk = list_first_entry_or_null(&pcpu_map_extend_chunks, + struct pcpu_chunk, map_extend_list); + if (chunk) { + list_del_init(&chunk->map_extend_list); + new_alloc = pcpu_need_to_extend(chunk, false); + } + + spin_unlock_irq(&pcpu_lock); + + if (new_alloc) + pcpu_extend_area_map(chunk, new_alloc); + } while (chunk); + /* * Ensure there are certain number of free populated pages for * atomic allocs. Fill up from the most packed so that atomic @@ -1648,7 +1663,7 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai, */ schunk = memblock_virt_alloc(pcpu_chunk_struct_size, 0); INIT_LIST_HEAD(&schunk->list); - INIT_WORK(&schunk->map_extend_work, pcpu_map_extend_workfn); + INIT_LIST_HEAD(&schunk->map_extend_list); schunk->base_addr = base_addr; schunk->map = smap; schunk->map_alloc = ARRAY_SIZE(smap); @@ -1678,7 +1693,7 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai, if (dyn_size) { dchunk = memblock_virt_alloc(pcpu_chunk_struct_size, 0); INIT_LIST_HEAD(&dchunk->list); - INIT_WORK(&dchunk->map_extend_work, pcpu_map_extend_workfn); + INIT_LIST_HEAD(&dchunk->map_extend_list); dchunk->base_addr = base_addr; dchunk->map = dmap; dchunk->map_alloc = ARRAY_SIZE(dmap); From 20a13f4e98d1cc0c5001aad1a13e38769033404a Mon Sep 17 00:00:00 2001 From: Al Viro Date: Mon, 28 Dec 2015 20:47:08 -0500 Subject: [PATCH 0398/1015] [PATCH] arm: fix handling of F_OFD_... in oabi_fcntl64() Change-Id: I59a55778446e5f68ba36668b47498e361b6a64f1 Cc: stable@vger.kernel.org # 3.15+ Reviewed-by: Jeff Layton Signed-off-by: Al Viro Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 76cc404bfdc0d419c720de4daaf2584542734f42 Signed-off-by: Dennis Cagle --- arch/arm/kernel/sys_oabi-compat.c | 73 ++++++++++++++++--------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/arch/arm/kernel/sys_oabi-compat.c b/arch/arm/kernel/sys_oabi-compat.c index e90a3148f3854..eb821e7b80f94 100644 --- a/arch/arm/kernel/sys_oabi-compat.c +++ b/arch/arm/kernel/sys_oabi-compat.c @@ -193,15 +193,44 @@ struct oabi_flock64 { pid_t l_pid; } __attribute__ ((packed,aligned(4))); -asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd, +static long do_locks(unsigned int fd, unsigned int cmd, unsigned long arg) { - struct oabi_flock64 user; struct flock64 kernel; - mm_segment_t fs = USER_DS; /* initialized to kill a warning */ - unsigned long local_arg = arg; - int ret; + struct oabi_flock64 user; + mm_segment_t fs; + long ret; + + if (copy_from_user(&user, (struct oabi_flock64 __user *)arg, + sizeof(user))) + return -EFAULT; + kernel.l_type = user.l_type; + kernel.l_whence = user.l_whence; + kernel.l_start = user.l_start; + kernel.l_len = user.l_len; + kernel.l_pid = user.l_pid; + + fs = get_fs(); + set_fs(KERNEL_DS); + ret = sys_fcntl64(fd, cmd, (unsigned long)&kernel); + set_fs(fs); + + if (!ret && (cmd == F_GETLK64 || cmd == F_OFD_GETLK)) { + user.l_type = kernel.l_type; + user.l_whence = kernel.l_whence; + user.l_start = kernel.l_start; + user.l_len = kernel.l_len; + user.l_pid = kernel.l_pid; + if (copy_to_user((struct oabi_flock64 __user *)arg, + &user, sizeof(user))) + ret = -EFAULT; + } + return ret; +} +asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd, + unsigned long arg) +{ switch (cmd) { case F_OFD_GETLK: case F_OFD_SETLK: @@ -209,39 +238,11 @@ asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd, case F_GETLK64: case F_SETLK64: case F_SETLKW64: - if (copy_from_user(&user, (struct oabi_flock64 __user *)arg, - sizeof(user))) - return -EFAULT; - kernel.l_type = user.l_type; - kernel.l_whence = user.l_whence; - kernel.l_start = user.l_start; - kernel.l_len = user.l_len; - kernel.l_pid = user.l_pid; - local_arg = (unsigned long)&kernel; - fs = get_fs(); - set_fs(KERNEL_DS); - } - - ret = sys_fcntl64(fd, cmd, local_arg); + return do_locks(fd, cmd, arg); - switch (cmd) { - case F_GETLK64: - if (!ret) { - user.l_type = kernel.l_type; - user.l_whence = kernel.l_whence; - user.l_start = kernel.l_start; - user.l_len = kernel.l_len; - user.l_pid = kernel.l_pid; - if (copy_to_user((struct oabi_flock64 __user *)arg, - &user, sizeof(user))) - ret = -EFAULT; - } - case F_SETLK64: - case F_SETLKW64: - set_fs(fs); + default: + return sys_fcntl64(fd, cmd, arg); } - - return ret; } struct oabi_epoll_event { From c724b16bb4ceddb048e3f5e8225eec6575f639a7 Mon Sep 17 00:00:00 2001 From: Mark Rutland Date: Thu, 8 Jan 2015 11:42:59 +0000 Subject: [PATCH 0399/1015] arm64: make sys_call_table const As with x86, mark the sys_call_table const such that it will be placed in the .rodata section. This will cause attempts to modify the table (accidental or deliberate) to fail when strict page permissions are in place. In the absence of strict page permissions, there should be no functional change. Change-Id: I26873ff2d80bad1b94919d73c0f88ad31084495d Signed-off-by: Mark Rutland Acked-by: Will Deacon Signed-off-by: Catalin Marinas Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: c623b33b4e9599c6ac5076f7db7369eb9869aa04 Signed-off-by: Dennis Cagle --- arch/arm64/kernel/sys.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kernel/sys.c b/arch/arm64/kernel/sys.c index 3fa98ff14f0ee..df20b79188549 100644 --- a/arch/arm64/kernel/sys.c +++ b/arch/arm64/kernel/sys.c @@ -50,7 +50,7 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len, * The sys_call_table array must be 4K aligned to be accessible from * kernel/entry.S. */ -void *sys_call_table[__NR_syscalls] __aligned(4096) = { +void * const sys_call_table[__NR_syscalls] __aligned(4096) = { [0 ... __NR_syscalls - 1] = sys_ni_syscall, #include }; From d91cb84915dabffb3f7e15c326a0016c272e01d1 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Fri, 23 Jan 2015 12:24:14 +0100 Subject: [PATCH 0400/1015] perf: Fix event->ctx locking There have been a few reported issues wrt. the lack of locking around changing event->ctx. This patch tries to address those. It avoids the whole rwsem thing; and while it appears to work, please give it some thought in review. What I did fail at is sensible runtime checks on the use of event->ctx, the RCU use makes it very hard. Change-Id: Iae2467f342a62fffe01796ea812cd42e8461c348 Signed-off-by: Peter Zijlstra (Intel) Cc: Paul E. McKenney Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Linus Torvalds Link: http://lkml.kernel.org/r/20150123125834.209535886@infradead.org Signed-off-by: Ingo Molnar Git-repo: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: f63a8daa5812afef4f06c962351687e1ff9ccb2b Signed-off-by: Dennis Cagle --- kernel/events/core.c | 244 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 207 insertions(+), 37 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index 3cea606d9b92d..c40451a9273ae 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -914,6 +914,77 @@ static void put_ctx(struct perf_event_context *ctx) } } +/* + * Because of perf_event::ctx migration in sys_perf_event_open::move_group and + * perf_pmu_migrate_context() we need some magic. + * + * Those places that change perf_event::ctx will hold both + * perf_event_ctx::mutex of the 'old' and 'new' ctx value. + * + * Lock ordering is by mutex address. There is one other site where + * perf_event_context::mutex nests and that is put_event(). But remember that + * that is a parent<->child context relation, and migration does not affect + * children, therefore these two orderings should not interact. + * + * The change in perf_event::ctx does not affect children (as claimed above) + * because the sys_perf_event_open() case will install a new event and break + * the ctx parent<->child relation, and perf_pmu_migrate_context() is only + * concerned with cpuctx and that doesn't have children. + * + * The places that change perf_event::ctx will issue: + * + * perf_remove_from_context(); + * synchronize_rcu(); + * perf_install_in_context(); + * + * to affect the change. The remove_from_context() + synchronize_rcu() should + * quiesce the event, after which we can install it in the new location. This + * means that only external vectors (perf_fops, prctl) can perturb the event + * while in transit. Therefore all such accessors should also acquire + * perf_event_context::mutex to serialize against this. + * + * However; because event->ctx can change while we're waiting to acquire + * ctx->mutex we must be careful and use the below perf_event_ctx_lock() + * function. + * + * Lock order: + * task_struct::perf_event_mutex + * perf_event_context::mutex + * perf_event_context::lock + * perf_event::child_mutex; + * perf_event::mmap_mutex + * mmap_sem + */ +static struct perf_event_context *perf_event_ctx_lock(struct perf_event *event) +{ + struct perf_event_context *ctx; + +again: + rcu_read_lock(); + ctx = ACCESS_ONCE(event->ctx); + if (!atomic_inc_not_zero(&ctx->refcount)) { + rcu_read_unlock(); + goto again; + } + rcu_read_unlock(); + + mutex_lock(&ctx->mutex); + if (event->ctx != ctx) { + mutex_unlock(&ctx->mutex); + put_ctx(ctx); + goto again; + } + + return ctx; +} + +static void perf_event_ctx_unlock(struct perf_event *event, + struct perf_event_context *ctx) +{ + mutex_unlock(&ctx->mutex); + put_ctx(ctx); +} + /* * This must be done under the ctx->lock, such as to serialize against * context_equiv(), therefore we cannot call put_ctx() since that might end up @@ -1664,7 +1735,7 @@ int __perf_event_disable(void *info) * is the current context on this CPU and preemption is disabled, * hence we can't get into perf_event_task_sched_out for this context. */ -void perf_event_disable(struct perf_event *event) +static void _perf_event_disable(struct perf_event *event) { struct perf_event_context *ctx = event->ctx; struct task_struct *task = ctx->task; @@ -1705,6 +1776,19 @@ void perf_event_disable(struct perf_event *event) } raw_spin_unlock_irq(&ctx->lock); } + +/* + * Strictly speaking kernel users cannot create groups and therefore this + * interface does not need the perf_event_ctx_lock() magic. + */ +void perf_event_disable(struct perf_event *event) +{ + struct perf_event_context *ctx; + + ctx = perf_event_ctx_lock(event); + _perf_event_disable(event); + perf_event_ctx_unlock(event, ctx); +} EXPORT_SYMBOL_GPL(perf_event_disable); static void perf_set_shadow_time(struct perf_event *event, @@ -2168,7 +2252,7 @@ static int __perf_event_enable(void *info) * perf_event_for_each_child or perf_event_for_each as described * for perf_event_disable. */ -void perf_event_enable(struct perf_event *event) +static void _perf_event_enable(struct perf_event *event) { struct perf_event_context *ctx = event->ctx; struct task_struct *task = ctx->task; @@ -2224,9 +2308,21 @@ void perf_event_enable(struct perf_event *event) out: raw_spin_unlock_irq(&ctx->lock); } + +/* + * See perf_event_disable(); + */ +void perf_event_enable(struct perf_event *event) +{ + struct perf_event_context *ctx; + + ctx = perf_event_ctx_lock(event); + _perf_event_enable(event); + perf_event_ctx_unlock(event, ctx); +} EXPORT_SYMBOL_GPL(perf_event_enable); -int perf_event_refresh(struct perf_event *event, int refresh) +static int _perf_event_refresh(struct perf_event *event, int refresh) { /* * not supported on inherited events @@ -2235,10 +2331,25 @@ int perf_event_refresh(struct perf_event *event, int refresh) return -EINVAL; atomic_add(refresh, &event->event_limit); - perf_event_enable(event); + _perf_event_enable(event); return 0; } + +/* + * See perf_event_disable() + */ +int perf_event_refresh(struct perf_event *event, int refresh) +{ + struct perf_event_context *ctx; + int ret; + + ctx = perf_event_ctx_lock(event); + ret = _perf_event_refresh(event, refresh); + perf_event_ctx_unlock(event, ctx); + + return ret; +} EXPORT_SYMBOL_GPL(perf_event_refresh); static void ctx_sched_out(struct perf_event_context *ctx, @@ -3436,7 +3547,16 @@ static void perf_remove_from_owner(struct perf_event *event) rcu_read_unlock(); if (owner) { - mutex_lock(&owner->perf_event_mutex); + /* + * If we're here through perf_event_exit_task() we're already + * holding ctx->mutex which would be an inversion wrt. the + * normal lock order. + * + * However we can safely take this lock because its the child + * ctx->mutex. + */ + mutex_lock_nested(&owner->perf_event_mutex, SINGLE_DEPTH_NESTING); + /* * We have to re-check the event->owner field, if it is cleared * we raced with perf_event_exit_task(), acquiring the mutex @@ -3571,12 +3691,13 @@ static int perf_event_read_group(struct perf_event *event, u64 read_format, char __user *buf) { struct perf_event *leader = event->group_leader, *sub; - int n = 0, size = 0, ret = -EFAULT; struct perf_event_context *ctx = leader->ctx; - u64 values[5]; + int n = 0, size = 0, ret; u64 count, enabled, running; + u64 values[5]; + + lockdep_assert_held(&ctx->mutex); - mutex_lock(&ctx->mutex); count = perf_event_read_value(leader, &enabled, &running); values[n++] = 1 + leader->nr_siblings; @@ -3591,7 +3712,7 @@ static int perf_event_read_group(struct perf_event *event, size = n * sizeof(u64); if (copy_to_user(buf, values, size)) - goto unlock; + return -EFAULT; ret = size; @@ -3605,14 +3726,11 @@ static int perf_event_read_group(struct perf_event *event, size = n * sizeof(u64); if (copy_to_user(buf + ret, values, size)) { - ret = -EFAULT; - goto unlock; + return -EFAULT; } ret += size; } -unlock: - mutex_unlock(&ctx->mutex); return ret; } @@ -3684,8 +3802,14 @@ static ssize_t perf_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct perf_event *event = file->private_data; + struct perf_event_context *ctx; + int ret; - return perf_read_hw(event, buf, count); + ctx = perf_event_ctx_lock(event); + ret = perf_read_hw(event, buf, count); + perf_event_ctx_unlock(event, ctx); + + return ret; } static unsigned int perf_poll(struct file *file, poll_table *wait) @@ -3711,7 +3835,7 @@ static unsigned int perf_poll(struct file *file, poll_table *wait) return events; } -static void perf_event_reset(struct perf_event *event) +static void _perf_event_reset(struct perf_event *event) { (void)perf_event_read(event); local64_set(&event->count, 0); @@ -3730,6 +3854,7 @@ static void perf_event_for_each_child(struct perf_event *event, struct perf_event *child; WARN_ON_ONCE(event->ctx->parent_ctx); + mutex_lock(&event->child_mutex); func(event); list_for_each_entry(child, &event->child_list, child_list) @@ -3743,14 +3868,13 @@ static void perf_event_for_each(struct perf_event *event, struct perf_event_context *ctx = event->ctx; struct perf_event *sibling; - WARN_ON_ONCE(ctx->parent_ctx); - mutex_lock(&ctx->mutex); + lockdep_assert_held(&ctx->mutex); + event = event->group_leader; perf_event_for_each_child(event, func); list_for_each_entry(sibling, &event->sibling_list, group_entry) perf_event_for_each_child(sibling, func); - mutex_unlock(&ctx->mutex); } struct period_event { @@ -3855,25 +3979,24 @@ static int perf_event_set_output(struct perf_event *event, struct perf_event *output_event); static int perf_event_set_filter(struct perf_event *event, void __user *arg); -static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned long arg) { - struct perf_event *event = file->private_data; void (*func)(struct perf_event *); u32 flags = arg; switch (cmd) { case PERF_EVENT_IOC_ENABLE: - func = perf_event_enable; + func = _perf_event_enable; break; case PERF_EVENT_IOC_DISABLE: - func = perf_event_disable; + func = _perf_event_disable; break; case PERF_EVENT_IOC_RESET: - func = perf_event_reset; + func = _perf_event_reset; break; case PERF_EVENT_IOC_REFRESH: - return perf_event_refresh(event, arg); + return _perf_event_refresh(event, arg); case PERF_EVENT_IOC_PERIOD: return perf_event_period(event, (u64 __user *)arg); @@ -3920,6 +4043,19 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) return 0; } +static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + struct perf_event *event = file->private_data; + struct perf_event_context *ctx; + long ret; + + ctx = perf_event_ctx_lock(event); + ret = _perf_ioctl(event, cmd, arg); + perf_event_ctx_unlock(event, ctx); + + return ret; +} + #ifdef CONFIG_COMPAT static long perf_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) @@ -3942,11 +4078,15 @@ static long perf_compat_ioctl(struct file *file, unsigned int cmd, int perf_event_task_enable(void) { + struct perf_event_context *ctx; struct perf_event *event; mutex_lock(¤t->perf_event_mutex); - list_for_each_entry(event, ¤t->perf_event_list, owner_entry) - perf_event_for_each_child(event, perf_event_enable); + list_for_each_entry(event, ¤t->perf_event_list, owner_entry) { + ctx = perf_event_ctx_lock(event); + perf_event_for_each_child(event, _perf_event_enable); + perf_event_ctx_unlock(event, ctx); + } mutex_unlock(¤t->perf_event_mutex); return 0; @@ -3954,11 +4094,15 @@ int perf_event_task_enable(void) int perf_event_task_disable(void) { + struct perf_event_context *ctx; struct perf_event *event; mutex_lock(¤t->perf_event_mutex); - list_for_each_entry(event, ¤t->perf_event_list, owner_entry) - perf_event_for_each_child(event, perf_event_disable); + list_for_each_entry(event, ¤t->perf_event_list, owner_entry) { + ctx = perf_event_ctx_lock(event); + perf_event_for_each_child(event, _perf_event_disable); + perf_event_ctx_unlock(event, ctx); + } mutex_unlock(¤t->perf_event_mutex); return 0; @@ -7274,6 +7418,15 @@ perf_event_set_output(struct perf_event *event, struct perf_event *output_event) return ret; } +static void mutex_lock_double(struct mutex *a, struct mutex *b) +{ + if (b < a) + swap(a, b); + + mutex_lock(a); + mutex_lock_nested(b, SINGLE_DEPTH_NESTING); +} + /** * sys_perf_event_open - open a performance event, associate it to a task/cpu * @@ -7289,7 +7442,7 @@ SYSCALL_DEFINE5(perf_event_open, struct perf_event *group_leader = NULL, *output_event = NULL; struct perf_event *event, *sibling; struct perf_event_attr attr; - struct perf_event_context *ctx; + struct perf_event_context *ctx, *uninitialized_var(gctx); struct file *event_file = NULL; struct fd group = {NULL, 0}; struct task_struct *task = NULL; @@ -7493,9 +7646,14 @@ SYSCALL_DEFINE5(perf_event_open, } if (move_group) { - struct perf_event_context *gctx = group_leader->ctx; + gctx = group_leader->ctx; + + /* + * See perf_event_ctx_lock() for comments on the details + * of swizzling perf_event::ctx. + */ + mutex_lock_double(&gctx->mutex, &ctx->mutex); - mutex_lock(&gctx->mutex); perf_remove_from_context(group_leader, false); /* @@ -7510,15 +7668,19 @@ SYSCALL_DEFINE5(perf_event_open, perf_event__state_init(sibling); put_ctx(gctx); } - mutex_unlock(&gctx->mutex); - put_ctx(gctx); + } else { + mutex_lock(&ctx->mutex); } WARN_ON_ONCE(ctx->parent_ctx); - mutex_lock(&ctx->mutex); if (move_group) { + /* + * Wait for everybody to stop referencing the events through + * the old lists, before installing it on new lists. + */ synchronize_rcu(); + perf_install_in_context(ctx, group_leader, group_leader->cpu); get_ctx(ctx); list_for_each_entry(sibling, &group_leader->sibling_list, @@ -7530,6 +7692,11 @@ SYSCALL_DEFINE5(perf_event_open, perf_install_in_context(ctx, event, event->cpu); perf_unpin_context(ctx); + + if (move_group) { + mutex_unlock(&gctx->mutex); + put_ctx(gctx); + } mutex_unlock(&ctx->mutex); put_online_cpus(); @@ -7637,7 +7804,11 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu) src_ctx = &per_cpu_ptr(pmu->pmu_cpu_context, src_cpu)->ctx; dst_ctx = &per_cpu_ptr(pmu->pmu_cpu_context, dst_cpu)->ctx; - mutex_lock(&src_ctx->mutex); + /* + * See perf_event_ctx_lock() for comments on the details + * of swizzling perf_event::ctx. + */ + mutex_lock_double(&src_ctx->mutex, &dst_ctx->mutex); list_for_each_entry_safe(event, tmp, &src_ctx->event_list, event_entry) { perf_remove_from_context(event, false); @@ -7645,11 +7816,9 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu) put_ctx(src_ctx); list_add(&event->migrate_entry, &events); } - mutex_unlock(&src_ctx->mutex); synchronize_rcu(); - mutex_lock(&dst_ctx->mutex); list_for_each_entry_safe(event, tmp, &events, migrate_entry) { list_del(&event->migrate_entry); if (event->state >= PERF_EVENT_STATE_OFF) @@ -7659,6 +7828,7 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu) get_ctx(dst_ctx); } mutex_unlock(&dst_ctx->mutex); + mutex_unlock(&src_ctx->mutex); } EXPORT_SYMBOL_GPL(perf_pmu_migrate_context); From bad8fd714d3a9e95d07fb359d868d70546b220d6 Mon Sep 17 00:00:00 2001 From: John Dias Date: Mon, 10 Oct 2016 14:44:30 -0700 Subject: [PATCH 0401/1015] perf: protect group_leader from races that cause ctx double-free When moving a group_leader perf event from a software-context to a hardware-context, there's a race in checking and updating that context. The existing locking solution doesn't work; note that it tries to grab a lock inside the group_leader's context object, which you can only get at by going through a pointer that should be protected from these races. To avoid that problem, and to produce a simple solution, we can just use a lock per group_leader to protect all checks on the group_leader's context. The new lock is grabbed and released when no context locks are held. Bug: 30955111 Bug: 31095224 Change-Id: If37124c100ca6f4aa962559fba3bd5dbbec8e052 Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 5b87e00be9ca28ea32cab49b92c0386e4a91f730 Signed-off-by: Dennis Cagle --- include/linux/perf_event.h | 6 ++++++ kernel/events/core.c | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index c1a2bd14ff1bf..93474a4d9247d 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -339,6 +339,12 @@ struct perf_event { int nr_siblings; int group_flags; struct perf_event *group_leader; + + /* + * Protect the pmu, attributes and context of a group leader. + * Note: does not protect the pointer to the group_leader. + */ + struct mutex group_leader_mutex; struct pmu *pmu; enum perf_event_active_state state; diff --git a/kernel/events/core.c b/kernel/events/core.c index 3cea606d9b92d..401af31e48692 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -6998,6 +6998,7 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, if (!group_leader) group_leader = event; + mutex_init(&event->group_leader_mutex); mutex_init(&event->child_mutex); INIT_LIST_HEAD(&event->child_list); @@ -7353,6 +7354,16 @@ SYSCALL_DEFINE5(perf_event_open, group_leader = NULL; } + /* + * Take the group_leader's group_leader_mutex before observing + * anything in the group leader that leads to changes in ctx, + * many of which may be changing on another thread. + * In particular, we want to take this lock before deciding + * whether we need to move_group. + */ + if (group_leader) + mutex_lock(&group_leader->group_leader_mutex); + if (pid != -1 && !(flags & PERF_FLAG_PID_CGROUP)) { task = find_lively_task_by_vpid(pid); if (IS_ERR(task)) { @@ -7531,6 +7542,8 @@ SYSCALL_DEFINE5(perf_event_open, perf_install_in_context(ctx, event, event->cpu); perf_unpin_context(ctx); mutex_unlock(&ctx->mutex); + if (group_leader) + mutex_unlock(&group_leader->group_leader_mutex); put_online_cpus(); @@ -7567,6 +7580,8 @@ SYSCALL_DEFINE5(perf_event_open, if (task) put_task_struct(task); err_group_fd: + if (group_leader) + mutex_unlock(&group_leader->group_leader_mutex); fdput(group); err_fd: put_unused_fd(event_fd); From 3b7b984e781df35f0c57344b52ababbe434f0c06 Mon Sep 17 00:00:00 2001 From: Jeff Mahoney Date: Tue, 5 Jul 2016 17:32:29 -0400 Subject: [PATCH 0402/1015] Revert "ecryptfs: forbid opening files without mmap handler" This reverts commit 2f36db71009304b3f0b95afacd8eba1f9f046b87. It fixed a local root exploit but also introduced a dependency on the lower file system implementing an mmap operation just to open a file, which is a bit of a heavy hammer. The right fix is to have mmap depend on the existence of the mmap handler instead. Change-Id: I78753c9cadef7b43cd277d4827a096b45697c288 Signed-off-by: Jeff Mahoney Cc: stable@vger.kernel.org Signed-off-by: Tyler Hicks Git-repo: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: 78c4e172412de5d0456dc00d2b34050aa0b683b5 Signed-off-by: Dennis Cagle --- fs/ecryptfs/kthread.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/fs/ecryptfs/kthread.c b/fs/ecryptfs/kthread.c index 9b661a4ccee73..f1ea610362c6c 100644 --- a/fs/ecryptfs/kthread.c +++ b/fs/ecryptfs/kthread.c @@ -25,7 +25,6 @@ #include #include #include -#include #include "ecryptfs_kernel.h" struct ecryptfs_open_req { @@ -148,7 +147,7 @@ int ecryptfs_privileged_open(struct file **lower_file, flags |= IS_RDONLY(lower_dentry->d_inode) ? O_RDONLY : O_RDWR; (*lower_file) = dentry_open(&req.path, flags, cred); if (!IS_ERR(*lower_file)) - goto have_file; + goto out; if ((flags & O_ACCMODE) == O_RDONLY) { rc = PTR_ERR((*lower_file)); goto out; @@ -166,16 +165,8 @@ int ecryptfs_privileged_open(struct file **lower_file, mutex_unlock(&ecryptfs_kthread_ctl.mux); wake_up(&ecryptfs_kthread_ctl.wait); wait_for_completion(&req.done); - if (IS_ERR(*lower_file)) { + if (IS_ERR(*lower_file)) rc = PTR_ERR(*lower_file); - goto out; - } -have_file: - if ((*lower_file)->f_op->mmap == NULL) { - fput(*lower_file); - *lower_file = NULL; - rc = -EMEDIUMTYPE; - } out: return rc; } From 4a5bee168b809380c3c66ccc67c6cd57415e1136 Mon Sep 17 00:00:00 2001 From: Jeff Mahoney Date: Tue, 5 Jul 2016 17:32:30 -0400 Subject: [PATCH 0403/1015] ecryptfs: don't allow mmap when the lower fs doesn't support it There are legitimate reasons to disallow mmap on certain files, notably in sysfs or procfs. We shouldn't emulate mmap support on file systems that don't offer support natively. CVE-2016-1583 Change-Id: I4087f557641756192a33749e9f14afe685b5d660 Signed-off-by: Jeff Mahoney Cc: stable@vger.kernel.org [tyhicks: clean up f_op check by using ecryptfs_file_to_lower()] Signed-off-by: Tyler Hicks Git-repo: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: f0fe970df3838c202ef6c07a4c2b36838ef0a88b Signed-off-by: Dennis Cagle --- fs/ecryptfs/file.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index d68eb1b838c07..e83d404df6d16 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -178,6 +178,19 @@ static int read_or_initialize_metadata(struct dentry *dentry) return rc; } +static int ecryptfs_mmap(struct file *file, struct vm_area_struct *vma) +{ + struct file *lower_file = ecryptfs_file_to_lower(file); + /* + * Don't allow mmap on top of file systems that don't support it + * natively. If FILESYSTEM_MAX_STACK_DEPTH > 2 or ecryptfs + * allows recursive mounting, this will need to be extended. + */ + if (!lower_file->f_op->mmap) + return -ENODEV; + return generic_file_mmap(file, vma); +} + /** * ecryptfs_open * @inode: inode speciying file to open @@ -398,7 +411,7 @@ const struct file_operations ecryptfs_main_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = ecryptfs_compat_ioctl, #endif - .mmap = generic_file_mmap, + .mmap = ecryptfs_mmap, .open = ecryptfs_open, .flush = ecryptfs_flush, .release = ecryptfs_release, From fe89d09aa303cd4d6b98cb11a7d5a4093f3d0128 Mon Sep 17 00:00:00 2001 From: Qidan He Date: Thu, 13 Oct 2016 16:27:46 -0700 Subject: [PATCH 0404/1015] net: ping: Fix stack buffer overflow in ping_common_sendmsg() In ping_common_sendmsg(), when len < icmph_len, memcpy_fromiovec() will access invalid memory because msg->msg_iov only has 1 element and memcpy_fromiovec() attempts to increment it. KASAN report: BUG: KASAN: stack-out-of-bounds in memcpy_fromiovec+0x60/0x114 at addr ffffffc071077da0 Read of size 8 by task trinity-c2/9623 page:ffffffbe034b9a08 count:0 mapcount:0 mapping: (null) index:0x0 flags: 0x0() page dumped because: kasan: bad access detected CPU: 0 PID: 9623 Comm: trinity-c2 Tainted: G BU 3.18.0-dirty #15 Hardware name: Google Tegra210 Smaug Rev 1,3+ (DT) Call trace: [] dump_backtrace+0x0/0x1ac arch/arm64/kernel/traps.c:90 [] show_stack+0x10/0x1c arch/arm64/kernel/traps.c:171 [< inline >] __dump_stack lib/dump_stack.c:15 [] dump_stack+0x7c/0xd0 lib/dump_stack.c:50 [< inline >] print_address_description mm/kasan/report.c:147 [< inline >] kasan_report_error mm/kasan/report.c:236 [] kasan_report+0x380/0x4b8 mm/kasan/report.c:259 [< inline >] check_memory_region mm/kasan/kasan.c:264 [] __asan_load8+0x20/0x70 mm/kasan/kasan.c:507 [] memcpy_fromiovec+0x5c/0x114 lib/iovec.c:15 [< inline >] memcpy_from_msg include/linux/skbuff.h:2667 [] ping_common_sendmsg+0x50/0x108 net/ipv4/ping.c:674 [] ping_v4_sendmsg+0xd8/0x698 net/ipv4/ping.c:714 [] inet_sendmsg+0xe0/0x12c net/ipv4/af_inet.c:749 [< inline >] __sock_sendmsg_nosec net/socket.c:624 [< inline >] __sock_sendmsg net/socket.c:632 [] sock_sendmsg+0x124/0x164 net/socket.c:643 [< inline >] SYSC_sendto net/socket.c:1797 [] SyS_sendto+0x178/0x1d8 net/socket.c:1761 Memory state around the buggy address: ffffffc071077c80: f3 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 f1 f1 ffffffc071077d00: f1 f1 04 f4 f4 f4 f2 f2 f2 f2 04 f4 f4 f4 f2 f2 >ffffffc071077d80: f2 f2 00 00 f4 f4 f2 f2 f2 f2 00 00 00 00 00 00 ^ ffffffc071077e00: 00 f4 f2 f2 f2 f2 00 00 00 00 00 00 00 00 00 00 ffffffc071077e80: 00 00 00 00 00 00 f3 f3 f3 f3 00 00 00 00 00 00 Bug: 31349935 Change-Id: Ib7385fc26dfe7e07e9bab42a10ff65a37cbaab54 Signed-off-by: Siqi Lin Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 5459140fb7c8cbb588e06dadb4dc721f0d115c53 Signed-off-by: Dennis Cagle --- net/ipv4/ping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index 59f8d47bffe42..f65379c4d86db 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c @@ -656,7 +656,7 @@ int ping_common_sendmsg(int family, struct msghdr *msg, size_t len, void *user_icmph, size_t icmph_len) { u8 type, code; - if (len > 0xFFFF) + if (len > 0xFFFF || len < icmph_len) return -EMSGSIZE; /* From ec8e1ca43852031fa3b1db429ffc586153e421a2 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Fri, 7 Oct 2016 10:56:13 -0700 Subject: [PATCH 0405/1015] binder: blacklist %p kptr_restrict Bug: 31495231 Change-Id: Iebc150f6bc939b56e021424ee44fb30ce8d732fd Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 0804d7840364fc1a93652632bd43a93c055c658e Signed-off-by: Dennis Cagle --- drivers/staging/android/binder.c | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index 6a29ad48e37ea..3134e2006996a 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -473,7 +473,7 @@ static void binder_insert_free_buffer(struct binder_proc *proc, new_buffer_size = binder_buffer_size(proc, new_buffer); binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: add free buffer, size %zd, at %p\n", + "%d: add free buffer, size %zd, at %pK\n", proc->pid, new_buffer_size, new_buffer); while (*p) { @@ -551,7 +551,7 @@ static int binder_update_page_range(struct binder_proc *proc, int allocate, struct mm_struct *mm; binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: %s pages %p-%p\n", proc->pid, + "%d: %s pages %pK-%pK\n", proc->pid, allocate ? "allocate" : "free", start, end); if (end <= start) @@ -591,7 +591,7 @@ static int binder_update_page_range(struct binder_proc *proc, int allocate, BUG_ON(*page); *page = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO); if (*page == NULL) { - pr_err("%d: binder_alloc_buf failed for page at %p\n", + pr_err("%d: binder_alloc_buf failed for page at %pK\n", proc->pid, page_addr); goto err_alloc_page_failed; } @@ -600,7 +600,7 @@ static int binder_update_page_range(struct binder_proc *proc, int allocate, flush_cache_vmap((unsigned long)page_addr, (unsigned long)page_addr + PAGE_SIZE); if (ret != 1) { - pr_err("%d: binder_alloc_buf failed to map page at %p in kernel\n", + pr_err("%d: binder_alloc_buf failed to map page at %pK in kernel\n", proc->pid, page_addr); goto err_map_kernel_failed; } @@ -704,7 +704,7 @@ static struct binder_buffer *binder_alloc_buf(struct binder_proc *proc, } binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_alloc_buf size %zd got buffer %p size %zd\n", + "%d: binder_alloc_buf size %zd got buffer %pK size %zd\n", proc->pid, size, buffer, buffer_size); has_page_addr = @@ -734,7 +734,7 @@ static struct binder_buffer *binder_alloc_buf(struct binder_proc *proc, binder_insert_free_buffer(proc, new_buffer); } binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_alloc_buf size %zd got %p\n", + "%d: binder_alloc_buf size %zd got %pK\n", proc->pid, size, buffer); buffer->data_size = data_size; buffer->offsets_size = offsets_size; @@ -774,7 +774,7 @@ static void binder_delete_free_buffer(struct binder_proc *proc, if (buffer_end_page(prev) == buffer_end_page(buffer)) free_page_end = 0; binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: merge free, buffer %p share page with %p\n", + "%d: merge free, buffer %pK share page with %pK\n", proc->pid, buffer, prev); } @@ -787,14 +787,14 @@ static void binder_delete_free_buffer(struct binder_proc *proc, buffer_start_page(buffer)) free_page_start = 0; binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: merge free, buffer %p share page with %p\n", + "%d: merge free, buffer %pK share page with %pK\n", proc->pid, buffer, prev); } } list_del(&buffer->entry); if (free_page_start || free_page_end) { binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: merge free, buffer %p do not share page%s%s with %p or %p\n", + "%d: merge free, buffer %pK do not share page%s%s with %pK or %pK\n", proc->pid, buffer, free_page_start ? "" : " end", free_page_end ? "" : " start", prev, next); binder_update_page_range(proc, 0, free_page_start ? @@ -815,7 +815,7 @@ static void binder_free_buf(struct binder_proc *proc, ALIGN(buffer->offsets_size, sizeof(void *)); binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_free_buf %p size %zd buffer_size %zd\n", + "%d: binder_free_buf %pK size %zd buffer_size %zd\n", proc->pid, buffer, size, buffer_size); BUG_ON(buffer->free); @@ -1245,7 +1245,7 @@ static void binder_transaction_buffer_release(struct binder_proc *proc, int debug_id = buffer->debug_id; binder_debug(BINDER_DEBUG_TRANSACTION, - "%d buffer release %d, size %zd-%zd, failed at %p\n", + "%d buffer release %d, size %zd-%zd, failed at %pK\n", proc->pid, buffer->debug_id, buffer->data_size, buffer->offsets_size, failed_at); @@ -2100,7 +2100,7 @@ static int binder_thread_write(struct binder_proc *proc, } } binder_debug(BINDER_DEBUG_DEAD_BINDER, - "%d:%d BC_DEAD_BINDER_DONE %016llx found %p\n", + "%d:%d BC_DEAD_BINDER_DONE %016llx found %pK\n", proc->pid, thread->pid, (u64)cookie, death); if (death == NULL) { @@ -2903,7 +2903,7 @@ static int binder_mmap(struct file *filp, struct vm_area_struct *vma) #ifdef CONFIG_CPU_CACHE_VIPT if (cache_is_vipt_aliasing()) { while (CACHE_COLOUR((vma->vm_start ^ (uint32_t)proc->buffer))) { - pr_info("binder_mmap: %d %lx-%lx maps %p bad alignment\n", proc->pid, vma->vm_start, vma->vm_end, proc->buffer); + pr_info("binder_mmap: %d %lx-%lx maps %pK bad alignment\n", proc->pid, vma->vm_start, vma->vm_end, proc->buffer); vma->vm_start += PAGE_SIZE; } } @@ -2935,7 +2935,7 @@ static int binder_mmap(struct file *filp, struct vm_area_struct *vma) proc->vma = vma; proc->vma_vm_mm = vma->vm_mm; - /*pr_info("binder_mmap: %d %lx-%lx maps %p\n", + /*pr_info("binder_mmap: %d %lx-%lx maps %pK\n", proc->pid, vma->vm_start, vma->vm_end, proc->buffer);*/ return 0; @@ -3161,7 +3161,7 @@ static void binder_deferred_release(struct binder_proc *proc) page_addr = proc->buffer + i * PAGE_SIZE; binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%s: %d: page %d at %p not freed\n", + "%s: %d: page %d at %pK not freed\n", __func__, proc->pid, i, page_addr); unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE); __free_page(proc->pages[i]); @@ -3240,7 +3240,7 @@ static void print_binder_transaction(struct seq_file *m, const char *prefix, struct binder_transaction *t) { seq_printf(m, - "%s %d: %p from %d:%d to %d:%d code %x flags %x pri %ld r%d", + "%s %d: %pK from %d:%d to %d:%d code %x flags %x pri %ld r%d", prefix, t->debug_id, t, t->from ? t->from->proc->pid : 0, t->from ? t->from->pid : 0, @@ -3254,7 +3254,7 @@ static void print_binder_transaction(struct seq_file *m, const char *prefix, if (t->buffer->target_node) seq_printf(m, " node %d", t->buffer->target_node->debug_id); - seq_printf(m, " size %zd:%zd data %p\n", + seq_printf(m, " size %zd:%zd data %pK\n", t->buffer->data_size, t->buffer->offsets_size, t->buffer->data); } @@ -3262,7 +3262,7 @@ static void print_binder_transaction(struct seq_file *m, const char *prefix, static void print_binder_buffer(struct seq_file *m, const char *prefix, struct binder_buffer *buffer) { - seq_printf(m, "%s %d: %p size %zd:%zd %s\n", + seq_printf(m, "%s %d: %pK size %zd:%zd %s\n", prefix, buffer->debug_id, buffer->data, buffer->data_size, buffer->offsets_size, buffer->transaction ? "active" : "delivered"); From 766eecf861af0d983ba9cf061aece010c6a4ac7c Mon Sep 17 00:00:00 2001 From: Min Chong Date: Thu, 13 Oct 2016 17:18:40 -0700 Subject: [PATCH 0406/1015] netfilter: Change %p to %pK in debug messages The format specifier %p can leak kernel addresses while not valuing the kptr_restrict system settings. Use %pK instead of %p, which also evaluates whether kptr_restrict is set. Bug: 31796940 Change-Id: Ia2946d6b493126d68281f97778faf578247f088e Signed-off-by: Min Chong Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 89220e920f99b7d87c086d6ea250c9f492712c3b Signed-off-by: Dennis Cagle --- net/netfilter/nf_conntrack_core.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 63745440403b0..e8c0cb51bd436 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -235,7 +235,7 @@ EXPORT_SYMBOL_GPL(nf_ct_invert_tuple); static void clean_from_lists(struct nf_conn *ct) { - pr_debug("clean_from_lists(%p)\n", ct); + pr_debug("clean_from_lists(%pK)\n", ct); hlist_nulls_del_rcu(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode); hlist_nulls_del_rcu(&ct->tuplehash[IP_CT_DIR_REPLY].hnnode); @@ -301,7 +301,7 @@ destroy_conntrack(struct nf_conntrack *nfct) struct list_head *sip_node_save_list; void (*delete_entry)(struct nf_conn *ct); - pr_debug("destroy_conntrack(%p)\n", ct); + pr_debug("destroy_conntrack(%pK)\n", ct); NF_CT_ASSERT(atomic_read(&nfct->use) == 0); NF_CT_ASSERT(!timer_pending(&ct->timeout)); @@ -346,7 +346,7 @@ destroy_conntrack(struct nf_conntrack *nfct) if (ct->master) nf_ct_put(ct->master); - pr_debug("destroy_conntrack: returning ct=%p to slab\n", ct); + pr_debug("destroy_conntrack: returning ct=%pK to slab\n", ct); nf_conntrack_free(ct); } @@ -635,7 +635,7 @@ __nf_conntrack_confirm(struct sk_buff *skb) * confirmed us. */ NF_CT_ASSERT(!nf_ct_is_confirmed(ct)); - pr_debug("Confirming conntrack %p\n", ct); + pr_debug("Confirming conntrack %pK\n", ct); /* We have to check the DYING flag after unlink to prevent * a race against nf_ct_get_next_corpse() possibly called from * user context, else we insert an already 'dead' hash, blocking @@ -981,7 +981,7 @@ init_conntrack(struct net *net, struct nf_conn *tmpl, spin_lock(&nf_conntrack_expect_lock); exp = nf_ct_find_expectation(net, zone, tuple); if (exp) { - pr_debug("conntrack: expectation arrives ct=%p exp=%p\n", + pr_debug("conntrack: expectation arrives ct=%pK exp=%pK\n", ct, exp); /* Welcome, Mr. Bond. We've been expecting you... */ __set_bit(IPS_EXPECTED_BIT, &ct->status); @@ -1074,14 +1074,14 @@ resolve_normal_ct(struct net *net, struct nf_conn *tmpl, } else { /* Once we've had two way comms, always ESTABLISHED. */ if (test_bit(IPS_SEEN_REPLY_BIT, &ct->status)) { - pr_debug("nf_conntrack_in: normal packet for %p\n", ct); + pr_debug("nf_conntrack_in: normal packet for %pK\n", ct); *ctinfo = IP_CT_ESTABLISHED; } else if (test_bit(IPS_EXPECTED_BIT, &ct->status)) { - pr_debug("nf_conntrack_in: related packet for %p\n", + pr_debug("nf_conntrack_in: related packet for %pK\n", ct); *ctinfo = IP_CT_RELATED; } else { - pr_debug("nf_conntrack_in: new packet for %p\n", ct); + pr_debug("nf_conntrack_in: new packet for %pK\n", ct); *ctinfo = IP_CT_NEW; } *set_reply = 0; @@ -1223,7 +1223,7 @@ void nf_conntrack_alter_reply(struct nf_conn *ct, /* Should be unconfirmed, so not in hash table yet */ NF_CT_ASSERT(!nf_ct_is_confirmed(ct)); - pr_debug("Altering reply tuple of %p to ", ct); + pr_debug("Altering reply tuple of %pK to ", ct); nf_ct_dump_tuple(newreply); ct->tuplehash[IP_CT_DIR_REPLY].tuple = *newreply; @@ -1800,7 +1800,7 @@ int nf_conntrack_init_net(struct net *net) if (!net->ct.stat) goto err_pcpu_lists; - net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%p", net); + net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%pK", net); if (!net->ct.slabname) goto err_slabname; From a0629d2aacf29716457387d45f887b707df2ce86 Mon Sep 17 00:00:00 2001 From: Sathish Ambley Date: Wed, 12 Oct 2016 11:38:42 -0700 Subject: [PATCH 0407/1015] msm: ADSPRPC: Check for valid file list node Ensure that the file list node retrieved from the list is valid before it is accessed. Change-Id: Ic43243c309f0fac1bcfbcaaa0ec2527d96938cd4 Signed-off-by: Sathish Ambley --- drivers/char/adsprpc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index 23e1e8b7d04a4..e141926181a7f 100644 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -1854,7 +1854,8 @@ static void file_free_work_handler(struct work_struct *w) break; } mutex_unlock(&me->flfree_mutex); - fastrpc_file_free(freefl->fl); + if (freefl) + fastrpc_file_free(freefl->fl); mutex_lock(&me->flfree_mutex); if (hlist_empty(&me->fls)) { From 1b64b0aff689e4bac19e4cd23752fd508bec02fd Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 3 Oct 2016 11:32:10 -0700 Subject: [PATCH 0408/1015] usb: host: Flush hub workqueue before stopping controller When xhci platform driver is removed with a usb device connected there is a possibility of race between xhci platform driver remove context and device disconnect hub event work context. This results into use after free: xhci_mem_clean() called from xhci_plat_remove() freeing the xhci virtual device when a structure member is being accessed by xhci_alloc_virt_device() after virtual device allocation as part of connect hub event. deadlock: Upon device disconnect if stop endpoint command remains pending xhci_mem_cleanup() frees xhci virtual device which also frees up endpoint stop_cmd_timer. udev->dev lock is held until cancelled urb is not given back to class driver. In a different context xhci platform remove calls usb_disconnect() on children of root hub which tries to acquire the same udev->dev lock this results into a dead lock condition. Fix issues by making sure hub events are flushed before xhci is stopped. Change-Id: I86d414bca17464d1dff3346ec668d8b3efec1652 Signed-off-by: Hemant Kumar --- drivers/usb/core/hcd.c | 3 +++ drivers/usb/core/hub.c | 6 ++++++ include/linux/usb/hcd.h | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 9c3578476bb16..45906a9f2d238 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -2926,6 +2926,9 @@ void usb_remove_hcd(struct usb_hcd *hcd) cancel_work_sync(&hcd->wakeup_work); #endif + /* handle any pending hub events before XHCI stops */ + usb_flush_hub_wq(); + mutex_lock(&usb_bus_list_lock); usb_disconnect(&rhdev); /* Sets rhdev to NULL */ mutex_unlock(&usb_bus_list_lock); diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index ab53405bac00a..bfa67e133af09 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -606,6 +606,12 @@ void usb_kick_hub_wq(struct usb_device *hdev) kick_hub_wq(hub); } +void usb_flush_hub_wq(void) +{ + flush_workqueue(hub_wq); +} +EXPORT_SYMBOL(usb_flush_hub_wq); + /* * Let the USB core know that a USB 3.0 device has sent a Function Wake Device * Notification, which indicates it had initiated remote wakeup. diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 80326fa9205a8..65cd72c7686af 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -494,7 +494,7 @@ extern void usb_hc_died(struct usb_hcd *hcd); extern void usb_hcd_poll_rh_status(struct usb_hcd *hcd); extern void usb_wakeup_notification(struct usb_device *hdev, unsigned int portnum); - +extern void usb_flush_hub_wq(void); extern void usb_hcd_start_port_resume(struct usb_bus *bus, int portnum); extern void usb_hcd_end_port_resume(struct usb_bus *bus, int portnum); From 08647a9f65fd2dab0309a83b19addf81e38b3cc0 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 8 Nov 2016 15:46:44 -0800 Subject: [PATCH 0409/1015] usb: host: xhci: Replace msleep with usleep_range Since usleep_range provides better accuracy in comparison to msleep. This helps in reducing the latency of host bus resume. Change-Id: Id22104b9e5b63153731df9eb55759de9a86128c6 Signed-off-by: Hemant Kumar --- drivers/usb/host/xhci-hub.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index f88c049ea0e03..09a1e1a3f0178 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c @@ -1176,7 +1176,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, xhci_set_link_state(xhci, port_array, wIndex, XDEV_RESUME); spin_unlock_irqrestore(&xhci->lock, flags); - msleep(20); + usleep_range(21000, 21500); spin_lock_irqsave(&xhci->lock, flags); xhci_set_link_state(xhci, port_array, wIndex, XDEV_U0); @@ -1412,7 +1412,7 @@ int xhci_bus_resume(struct usb_hcd *hcd) port_index, XDEV_RESUME); spin_unlock_irqrestore(&xhci->lock, flags); - msleep(20); + usleep_range(21000, 21500); spin_lock_irqsave(&xhci->lock, flags); xhci_set_link_state(xhci, port_array, From fe190b1a950cb7cb5689d624b9fc441109bbe6aa Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Fri, 14 Oct 2016 09:37:37 +0530 Subject: [PATCH 0410/1015] mmc: core: Avoid frequent enable/disable of Auto BKOPS During suspend/resume, the driver writes to AUTOBKOPS_EN bit in EXT_CSD register of eMMC which is R/W/E. Even after power off R/W/E bit will retain it's value, as it will be stored in NAND flash. Multiple writes can wear out the specific NAND block which store the system data(AUTO BKOPS bit in this case). So to avoid this, enabling/disabling of autobkops has been removed from suspend and resume. The background operations, if any, will stop when sleep command is sent during suspend process. Change-Id: I8aa7eda86beafacb3337be81c5a7f1f1e86f4998 Signed-off-by: Vijay Viswanath --- drivers/mmc/core/mmc.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 13ff833012167..231b63318bd3d 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -2378,12 +2378,6 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend) goto out; } - if (mmc_card_doing_auto_bkops(host->card)) { - err = mmc_set_auto_bkops(host->card, false); - if (err) - goto out; - } - err = mmc_flush_cache(host->card); if (err) goto out; @@ -2463,9 +2457,6 @@ static int mmc_partial_init(struct mmc_host *host) pr_debug("%s: %s: reading and comparing ext_csd successful\n", mmc_hostname(host), __func__); - if (mmc_card_support_auto_bkops(host->card)) - (void)mmc_set_auto_bkops(host->card, true); - if (card->ext_csd.cmdq_support && (card->host->caps2 & MMC_CAP2_CMD_QUEUE)) { err = mmc_select_cmdq(card); From 6dc3051a64615df326f086057c48a3be0fc17564 Mon Sep 17 00:00:00 2001 From: Krishnankutty Kolathappilly Date: Mon, 14 Nov 2016 18:46:12 -0800 Subject: [PATCH 0411/1015] msm: camera: fix bound check of offset to avoid overread overwrite fix bound check of hw_cmd_p->offset in msm_jpeg_hw_exec_cmds to avoid overread overwrite. CRs-Fixed: 1088824 Change-Id: Ifaa4b5387d4285ddce16d8e745aa0500c64c568b Signed-off-by: Krishnankutty Kolathappilly --- drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_hw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_hw.c b/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_hw.c index 071ce0a41ed9b..e40869d41a5d0 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_hw.c +++ b/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_hw.c @@ -847,7 +847,7 @@ int msm_jpeg_hw_exec_cmds(struct msm_jpeg_hw_cmd *hw_cmd_p, uint32_t m_cmds, uint32_t data; while (m_cmds--) { - if (hw_cmd_p->offset > max_size) { + if (hw_cmd_p->offset >= max_size) { JPEG_PR_ERR("%s:%d] %d exceed hw region %d\n", __func__, __LINE__, hw_cmd_p->offset, max_size); return -EFAULT; From 687ecc26d6cf690f8d1628e0dc44a81a9e9c9221 Mon Sep 17 00:00:00 2001 From: Sandeep Panda Date: Wed, 30 Nov 2016 11:18:36 +0530 Subject: [PATCH 0412/1015] mdss: remove panic due to excessive interrupt errors Mdss clock pll is in bad state which leads to excessive interrupt errors. Remove force panic in this scenario to avoid crashing the target. Change-Id: Ic21744b97900060418629ae75455a293cb828476 Signed-off-by: Sandeep Panda --- drivers/video/msm/mdss/mdss_dsi_host.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index 2a2a7c97bf93a..49a80d045471c 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -3068,7 +3068,7 @@ static void __dsi_error_counter(struct dsi_err_container *err_container) pr_err("%s: panic in WQ as dsi error intrs within:%dms\n", __func__, err_container->err_time_delta); MDSS_XLOG_TOUT_HANDLER_WQ("mdp", "dsi0_ctrl", "dsi0_phy", - "dsi1_ctrl", "dsi1_phy", "panic"); + "dsi1_ctrl", "dsi1_phy"); } } From d408163324ee92841b212922c052b03b3dfd4a60 Mon Sep 17 00:00:00 2001 From: "Raju P.L.S.S.S.N" Date: Wed, 12 Oct 2016 11:23:55 +0530 Subject: [PATCH 0413/1015] lpm-levels: Change _WARN_printf to pr_err when residency < 0 Change _WARN_printf to pr_err as former prints stack and register dump in logs which is not necessary. Change-Id: Ib0323014017818668a4a634e463f751fd5e9d24a Signed-off-by: Raju P.L.S.S.S.N --- drivers/cpuidle/lpm-levels-of.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/cpuidle/lpm-levels-of.c b/drivers/cpuidle/lpm-levels-of.c index 057b00bdd5a2a..adfabeeb3577a 100644 --- a/drivers/cpuidle/lpm-levels-of.c +++ b/drivers/cpuidle/lpm-levels-of.c @@ -720,7 +720,7 @@ static int calculate_residency(struct power_params *base_pwr, residency /= (int32_t)(base_pwr->ss_power - next_pwr->ss_power); if (residency < 0) { - __WARN_printf("%s: Incorrect power attributes for LPM\n", + pr_err("%s: residency < 0 for LPM\n", __func__); return next_pwr->time_overhead_us; } From 7bc594b1eeba5acd75e621260a766210bab9922e Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Mon, 7 Nov 2016 21:36:30 +0530 Subject: [PATCH 0414/1015] ARM: dts: msm: Modify IPA poll parameters for MSM8920 Throughput KPI's are impacted with the current poll parameters. Make a change to use 2ms poll sleep and 5 empty poll iterations which satisfies both power and performance kpi's. Change-Id: I7f74a33d165c3ba0999b75bd1f21e03870c852e5 Acked-by: Chaitanya Pratapa Signed-off-by: Utkarsh Saxena --- arch/arm/boot/dts/qcom/msm8920.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 7307b60edd3e8..2e8cd77dc433f 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -156,8 +156,8 @@ <90 512 100000 800000>, /* SVS (ab=100, ib=800 ~ 50MHz) */ <90 512 100000 1200000>; /* PERF (ab=100, ib=1200 ~ 75MHz) */ qcom,bus-vector-names = "MIN", "SVS", "PERF"; - qcom,rx-polling-sleep-ms = <3>; /* Polling sleep interval */ - qcom,ipa-polling-iteration = <15>; /* Polling Iteration */ + qcom,rx-polling-sleep-ms = <2>; /* Polling sleep interval */ + qcom,ipa-polling-iteration = <5>; /* Polling Iteration */ }; qcom,rmnet-ipa { From 21aa41dba7053f026b38111340b3c22b6a24e013 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Wed, 9 Nov 2016 16:25:24 -0800 Subject: [PATCH 0415/1015] msm: crypto: set CLR_CNTXT bit for crypto operations HLOS Crypto driver needs to set CLR_CNTXT bit for operations with legacy software key registers Change-Id: Iff482f726d106e99a4006f7077a171da3c7ca9c3 Signed-off-by: Zhen Kong --- drivers/crypto/msm/qce50.c | 47 +++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/drivers/crypto/msm/qce50.c b/drivers/crypto/msm/qce50.c index 9788e0e09d8b8..3519a356a5c89 100644 --- a/drivers/crypto/msm/qce50.c +++ b/drivers/crypto/msm/qce50.c @@ -1360,7 +1360,8 @@ static int _ce_setup_hash_direct(struct qce_device *pce_dev, CRYPTO_CONFIG_REG)); /* issue go to crypto */ if (use_hw_key == false) { - QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), + QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), pce_dev->iobase + CRYPTO_GOPROC_REG); } else { QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), @@ -1541,7 +1542,8 @@ static int _ce_setup_aead_direct(struct qce_device *pce_dev, CRYPTO_CONFIG_REG)); /* issue go to crypto */ - QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), + QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), pce_dev->iobase + CRYPTO_GOPROC_REG); /* * Ensure previous instructions (setting the GO register) @@ -1860,7 +1862,8 @@ static int _ce_setup_cipher_direct(struct qce_device *pce_dev, CRYPTO_CONFIG_REG)); /* issue go to crypto */ if (use_hw_key == false) { - QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), + QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), pce_dev->iobase + CRYPTO_GOPROC_REG); } else { QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), @@ -1948,7 +1951,8 @@ static int _ce_f9_setup_direct(struct qce_device *pce_dev, QCE_WRITE_REG(pce_dev->reg.crypto_cfg_le, (pce_dev->iobase + CRYPTO_CONFIG_REG)); /* write go */ - QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), + QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), pce_dev->iobase + CRYPTO_GOPROC_REG); /* * Ensure previous instructions (setting the GO register) @@ -2025,7 +2029,8 @@ static int _ce_f8_setup_direct(struct qce_device *pce_dev, QCE_WRITE_REG(pce_dev->reg.crypto_cfg_le, (pce_dev->iobase + CRYPTO_CONFIG_REG)); /* write go */ - QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), + QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), pce_dev->iobase + CRYPTO_GOPROC_REG); /* * Ensure previous instructions (setting the GO register) @@ -3278,8 +3283,8 @@ static int _setup_cipher_aes_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -3392,8 +3397,8 @@ static int _setup_cipher_des_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -3436,8 +3441,8 @@ static int _setup_cipher_null_cmdlistptrs(struct qce_device *pdev, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -3614,8 +3619,8 @@ static int _setup_auth_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -3831,8 +3836,8 @@ static int _setup_aead_cmdlistptrs(struct qce_device *pdev, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -3964,8 +3969,8 @@ static int _setup_aead_ccm_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -4050,8 +4055,8 @@ static int _setup_f8_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -4132,8 +4137,8 @@ static int _setup_f9_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; From 81e08038b3db947e2e098c0f772a121c3d7a6e8d Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Tue, 25 Oct 2016 10:21:22 -0700 Subject: [PATCH 0416/1015] qseecom: check error return value of ion_map_kernel ion_map_kernel() is called without checking for or acting upon the possible error conditions this function may return, make change to check its error return value. CRs-fixed: 1081637 Change-Id: I0a34f0bbc9f2049b826777a31e14d2cf62cdc211 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 861cdba7c94bc..5d0d1866d0a43 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -1073,6 +1073,10 @@ static int __qseecom_set_sb_memory(struct qseecom_registered_listener_list *svc, } /* Populate the structure for sending scm call to load image */ svc->sb_virt = (char *) ion_map_kernel(qseecom.ion_clnt, svc->ihandle); + if (IS_ERR_OR_NULL(svc->sb_virt)) { + pr_err("ION memory mapping for listener shared buffer failed\n"); + return -ENOMEM; + } svc->sb_phys = (phys_addr_t)pa; if (qseecom.qsee_version < QSEE_VERSION_40) { @@ -1530,6 +1534,10 @@ static int qseecom_set_client_mem_param(struct qseecom_dev_handle *data, /* Populate the structure for sending scm call to load image */ data->client.sb_virt = (char *) ion_map_kernel(qseecom.ion_clnt, data->client.ihandle); + if (IS_ERR_OR_NULL(data->client.sb_virt)) { + pr_err("ION memory mapping for client shared buf failed\n"); + return -ENOMEM; + } data->client.sb_phys = (phys_addr_t)pa; data->client.sb_length = req.sb_len; data->client.user_virt_sb_base = (uintptr_t)req.virt_sb_base; @@ -4195,6 +4203,11 @@ int qseecom_start_app(struct qseecom_handle **handle, /* Populate the structure for sending scm call to load image */ data->client.sb_virt = (char *) ion_map_kernel(qseecom.ion_clnt, data->client.ihandle); + if (IS_ERR_OR_NULL(data->client.sb_virt)) { + pr_err("ION memory mapping for client shared buf failed\n"); + ret = -ENOMEM; + goto err; + } data->client.user_virt_sb_base = (uintptr_t)data->client.sb_virt; data->client.sb_phys = (phys_addr_t)pa; (*handle)->dev = (void *)data; From 88973129397dc94ab1598856d95a149bb0962d79 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Mon, 24 Oct 2016 10:06:45 -0700 Subject: [PATCH 0417/1015] qseecom: improve error checks in qseecom_probe() Make change in qseecom_probe() to improve the error return value checks on some subfunctions, and free memory allocated within qseecom_retrieve_ce_data. CRs-fixed: 1075082 Change-Id: I971e555ec8d02ccf4382e83132a696b065a8ff12 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 47 +++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 861cdba7c94bc..c9c4c1ae66e26 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -8046,11 +8046,12 @@ static int qseecom_check_whitelist_feature(void) static int qseecom_probe(struct platform_device *pdev) { int rc; - int ret = 0; + int i; uint32_t feature = 10; struct device *class_dev; struct msm_bus_scale_pdata *qseecom_platform_support = NULL; struct qseecom_command_scm_resp resp; + struct qseecom_ce_info_use *pce_info_use = NULL; qseecom.qsee_bw_count = 0; qseecom.qsee_perf_client = 0; @@ -8092,7 +8093,7 @@ static int qseecom_probe(struct platform_device *pdev) class_dev = device_create(driver_class, NULL, qseecom_device_no, NULL, QSEECOM_DEV); - if (!class_dev) { + if (IS_ERR(class_dev)) { pr_err("class_device_create failed %d\n", rc); rc = -ENOMEM; goto exit_destroy_class; @@ -8131,7 +8132,7 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.pdev = class_dev; /* Create ION msm client */ qseecom.ion_clnt = msm_ion_client_create("qseecom-kernel"); - if (qseecom.ion_clnt == NULL) { + if (IS_ERR_OR_NULL(qseecom.ion_clnt)) { pr_err("Ion client cannot be created\n"); rc = -ENOMEM; goto exit_del_cdev; @@ -8195,14 +8196,14 @@ static int qseecom_probe(struct platform_device *pdev) pr_debug("CE operating frequency is not defined, setting to default 100MHZ\n"); qseecom.ce_opp_freq_hz = QSEE_CE_CLK_100MHZ; } - ret = __qseecom_init_clk(CLK_QSEE); - if (ret) + rc = __qseecom_init_clk(CLK_QSEE); + if (rc) goto exit_destroy_ion_client; if ((qseecom.qsee.instance != qseecom.ce_drv.instance) && (qseecom.support_pfe || qseecom.support_fde)) { - ret = __qseecom_init_clk(CLK_CE_DRV); - if (ret) { + rc = __qseecom_init_clk(CLK_CE_DRV); + if (rc) { __qseecom_deinit_clk(CLK_QSEE); goto exit_destroy_ion_client; } @@ -8256,9 +8257,14 @@ static int qseecom_probe(struct platform_device *pdev) } else { pr_err("Fail to get secure app region info\n"); rc = -EINVAL; - goto exit_destroy_ion_client; + goto exit_deinit_clock; + } + rc = __qseecom_enable_clk(CLK_QSEE); + if (rc) { + pr_err("CLK_QSEE enabling failed (%d)\n", rc); + rc = -EIO; + goto exit_deinit_clock; } - __qseecom_enable_clk(CLK_QSEE); rc = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, &resp, sizeof(resp)); @@ -8267,7 +8273,7 @@ static int qseecom_probe(struct platform_device *pdev) pr_err("send secapp reg fail %d resp.res %d\n", rc, resp.result); rc = -EINVAL; - goto exit_destroy_ion_client; + goto exit_deinit_clock; } } /* @@ -8307,7 +8313,28 @@ static int qseecom_probe(struct platform_device *pdev) atomic_set(&qseecom.qseecom_state, QSEECOM_STATE_READY); return 0; +exit_deinit_clock: + __qseecom_deinit_clk(CLK_QSEE); + if ((qseecom.qsee.instance != qseecom.ce_drv.instance) && + (qseecom.support_pfe || qseecom.support_fde)) + __qseecom_deinit_clk(CLK_CE_DRV); exit_destroy_ion_client: + if (qseecom.ce_info.fde) { + pce_info_use = qseecom.ce_info.fde; + for (i = 0; i < qseecom.ce_info.num_fde; i++) { + kzfree(pce_info_use->ce_pipe_entry); + pce_info_use++; + } + kfree(qseecom.ce_info.fde); + } + if (qseecom.ce_info.pfe) { + pce_info_use = qseecom.ce_info.pfe; + for (i = 0; i < qseecom.ce_info.num_pfe; i++) { + kzfree(pce_info_use->ce_pipe_entry); + pce_info_use++; + } + kfree(qseecom.ce_info.pfe); + } ion_client_destroy(qseecom.ion_clnt); exit_del_cdev: cdev_del(&qseecom.cdev); From d1460ac706fd3dda24afc1f1a2c5acf62b82667d Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Thu, 20 Oct 2016 17:34:20 -0700 Subject: [PATCH 0418/1015] qseecom: check buffer size when loading firmware images Make change in __qseecom_load_fw() and qseecom_load_commonlib_image() to check buffer size before copying img to buffer. CRs-fixed: 1080290 Change-Id: I0f48666ac948a9571e249598ae7cc19df9036b1d Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 861cdba7c94bc..ee4408411a60c 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -3605,7 +3605,7 @@ static bool __qseecom_is_fw_image_valid(const struct firmware *fw_entry) return true; } -static int __qseecom_get_fw_size(char *appname, uint32_t *fw_size, +static int __qseecom_get_fw_size(const char *appname, uint32_t *fw_size, uint32_t *app_arch) { int ret = -1; @@ -3643,14 +3643,21 @@ static int __qseecom_get_fw_size(char *appname, uint32_t *fw_size, } pr_debug("QSEE %s app, arch %u\n", appname, *app_arch); release_firmware(fw_entry); + fw_entry = NULL; for (i = 0; i < num_images; i++) { memset(fw_name, 0, sizeof(fw_name)); snprintf(fw_name, ARRAY_SIZE(fw_name), "%s.b%02d", appname, i); ret = request_firmware(&fw_entry, fw_name, qseecom.pdev); if (ret) goto err; + if (*fw_size > U32_MAX - fw_entry->size) { + pr_err("QSEE %s app file size overflow\n", appname); + ret = -EINVAL; + goto err; + } *fw_size += fw_entry->size; release_firmware(fw_entry); + fw_entry = NULL; } return ret; @@ -3661,8 +3668,9 @@ static int __qseecom_get_fw_size(char *appname, uint32_t *fw_size, return ret; } -static int __qseecom_get_fw_data(char *appname, u8 *img_data, - struct qseecom_load_app_ireq *load_req) +static int __qseecom_get_fw_data(const char *appname, u8 *img_data, + uint32_t fw_size, + struct qseecom_load_app_ireq *load_req) { int ret = -1; int i = 0, rc = 0; @@ -3682,6 +3690,12 @@ static int __qseecom_get_fw_data(char *appname, u8 *img_data, } load_req->img_len = fw_entry->size; + if (load_req->img_len > fw_size) { + pr_err("app %s size %zu is larger than buf size %u\n", + appname, fw_entry->size, fw_size); + ret = -EINVAL; + goto err; + } memcpy(img_data_ptr, fw_entry->data, fw_entry->size); img_data_ptr = img_data_ptr + fw_entry->size; load_req->mdt_len = fw_entry->size; /*Get MDT LEN*/ @@ -3700,6 +3714,7 @@ static int __qseecom_get_fw_data(char *appname, u8 *img_data, goto err; } release_firmware(fw_entry); + fw_entry = NULL; for (i = 0; i < num_images; i++) { snprintf(fw_name, ARRAY_SIZE(fw_name), "%s.b%02d", appname, i); ret = request_firmware(&fw_entry, fw_name, qseecom.pdev); @@ -3707,10 +3722,17 @@ static int __qseecom_get_fw_data(char *appname, u8 *img_data, pr_err("Failed to locate blob %s\n", fw_name); goto err; } + if ((fw_entry->size > U32_MAX - load_req->img_len) || + (fw_entry->size + load_req->img_len > fw_size)) { + pr_err("Invalid file size for %s\n", fw_name); + ret = -EINVAL; + goto err; + } memcpy(img_data_ptr, fw_entry->data, fw_entry->size); img_data_ptr = img_data_ptr + fw_entry->size; load_req->img_len += fw_entry->size; release_firmware(fw_entry); + fw_entry = NULL; } return ret; err: @@ -3815,7 +3837,7 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname) if (ret) return ret; - ret = __qseecom_get_fw_data(appname, img_data, &load_req); + ret = __qseecom_get_fw_data(appname, img_data, fw_size, &load_req); if (ret) { ret = -EIO; goto exit_free_img_data; @@ -3936,7 +3958,7 @@ static int qseecom_load_commonlib_image(struct qseecom_dev_handle *data, if (ret) return -EIO; - ret = __qseecom_get_fw_data(cmnlib_name, img_data, &load_req); + ret = __qseecom_get_fw_data(cmnlib_name, img_data, fw_size, &load_req); if (ret) { ret = -EIO; goto exit_free_img_data; From 79fee4f281825605dd35ee2614c27dbf297b2e30 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 8 Nov 2016 15:42:13 -0800 Subject: [PATCH 0419/1015] usb: core: Replace msleep with usleep_range Since usleep_range provides better accuracy in comparison to msleep. This helps in reducing the latency of host bus resume. Change-Id: Ie8d5231327fcc27ab2a28542e0d96687abb9aace Signed-off-by: Hemant Kumar --- drivers/usb/core/hub.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index bfa67e133af09..b7990085a34b7 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -3403,7 +3403,8 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) /* drive resume for USB_RESUME_TIMEOUT msec */ dev_dbg(&udev->dev, "usb %sresume\n", (PMSG_IS_AUTO(msg) ? "auto-" : "")); - msleep(USB_RESUME_TIMEOUT); + usleep_range(USB_RESUME_TIMEOUT * 1000, + (USB_RESUME_TIMEOUT + 1) * 1000); /* Virtual root hubs can trigger on GET_PORT_STATUS to * stop resume signaling. Then finish the resume @@ -3412,7 +3413,7 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) status = hub_port_status(hub, port1, &portstatus, &portchange); /* TRSMRCY = 10 msec */ - msleep(10); + usleep_range(10000, 10500); } SuspendCleared: From c32a38e98960c27076a67c65c14b38d0397d0328 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 8 Nov 2016 15:25:25 -0800 Subject: [PATCH 0420/1015] usb: core: Add support to skip extended bus resume delay By default skip_extended_resume_delay module parameter allows to skip extra 40ms delay upon usb bus resume. This delay was added on top of host bus resume which is driven for 20ms. Skipping extra delay reduces over all bus resume latency. Change-Id: I31a83abc057c345f29d204a63e7571b880678e69 Signed-off-by: Hemant Kumar --- drivers/usb/core/hub.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index b7990085a34b7..5e2ea5997677e 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -48,6 +48,11 @@ static void hub_event(struct work_struct *work); /* synchronize hub-port add/remove and peering operations */ DEFINE_MUTEX(usb_port_peer_mutex); +static bool skip_extended_resume_delay = 1; +module_param(skip_extended_resume_delay, bool, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(skip_extended_resume_delay, + "removes extra delay added to finish bus resume"); + /* cycle leds on hubs that aren't blinking for attention */ static bool blinkenlights = 0; module_param (blinkenlights, bool, S_IRUGO); @@ -3403,8 +3408,9 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) /* drive resume for USB_RESUME_TIMEOUT msec */ dev_dbg(&udev->dev, "usb %sresume\n", (PMSG_IS_AUTO(msg) ? "auto-" : "")); - usleep_range(USB_RESUME_TIMEOUT * 1000, - (USB_RESUME_TIMEOUT + 1) * 1000); + if (!skip_extended_resume_delay) + usleep_range(USB_RESUME_TIMEOUT * 1000, + (USB_RESUME_TIMEOUT + 1) * 1000); /* Virtual root hubs can trigger on GET_PORT_STATUS to * stop resume signaling. Then finish the resume From 121fea62608e5a0df30c020d3d2d016f26dfa64e Mon Sep 17 00:00:00 2001 From: Ashwanth Goli Date: Mon, 28 Nov 2016 12:16:55 +0530 Subject: [PATCH 0421/1015] defconfig: Enable config IP_NF_MATCH_RPFILTER Enable config IP_NF_MATCH_RPFILTER. This option allows you to match packets whose replies would go out via the interface the packet came in Change-Id: I2a23346e726a8df8487aeb664d6316b3cf2b9d77 Signed-off-by: Ashwanth Goli --- arch/arm64/configs/msm-perf_defconfig | 2 ++ arch/arm64/configs/msm_defconfig | 2 ++ 2 files changed, 4 insertions(+) diff --git a/arch/arm64/configs/msm-perf_defconfig b/arch/arm64/configs/msm-perf_defconfig index 368382dda99a1..0dc32620d9cae 100644 --- a/arch/arm64/configs/msm-perf_defconfig +++ b/arch/arm64/configs/msm-perf_defconfig @@ -160,6 +160,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -175,6 +176,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index 974c3c0f21b49..257f650f74fb1 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -161,6 +161,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -176,6 +177,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y From b698cf1e7bffb93f37ed76cbeb591e45c23e8def Mon Sep 17 00:00:00 2001 From: Walter Yang Date: Sat, 10 Dec 2016 11:13:54 +0800 Subject: [PATCH 0422/1015] ASoC: wcd-mbhc: check HPH PA status before impedance detection If HPH PA is on, the result of impedance detection is not reliable. So check the HPH PA status before impedance detection. CRs-Fixed: 1100622 Change-Id: I9c2063011247cca8105b39c913633cd7619a89eb Signed-off-by: Walter Yang --- sound/soc/codecs/wcd-mbhc-v2.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sound/soc/codecs/wcd-mbhc-v2.c b/sound/soc/codecs/wcd-mbhc-v2.c index 2d44bf4565dbb..43ea0351699db 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.c +++ b/sound/soc/codecs/wcd-mbhc-v2.c @@ -553,6 +553,9 @@ static void wcd_mbhc_hs_elec_irq(struct wcd_mbhc *mbhc, int irq_type, static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, enum snd_jack_types jack_type) { + struct snd_soc_codec *codec = mbhc->codec; + bool is_pa_on = false; + WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); pr_debug("%s: enter insertion %d hph_status %x\n", @@ -578,14 +581,14 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, if (mbhc->micbias_enable) { if (mbhc->mbhc_cb->mbhc_micbias_control) mbhc->mbhc_cb->mbhc_micbias_control( - mbhc->codec, MIC_BIAS_2, + codec, MIC_BIAS_2, MICB_DISABLE); if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - mbhc->codec, + codec, MIC_BIAS_2, false); if (mbhc->mbhc_cb->set_micbias_value) { - mbhc->mbhc_cb->set_micbias_value(mbhc->codec); + mbhc->mbhc_cb->set_micbias_value(codec); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); } mbhc->micbias_enable = false; @@ -616,15 +619,15 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) { if (mbhc->mbhc_cb->mbhc_micbias_control) mbhc->mbhc_cb->mbhc_micbias_control( - mbhc->codec, MIC_BIAS_2, + codec, MIC_BIAS_2, MICB_DISABLE); if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - mbhc->codec, + codec, MIC_BIAS_2, false); if (mbhc->mbhc_cb->set_micbias_value) { mbhc->mbhc_cb->set_micbias_value( - mbhc->codec); + codec); WCD_MBHC_REG_UPDATE_BITS( WCD_MBHC_MICB_CTRL, 0); } @@ -675,9 +678,13 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, } else if (jack_type == SND_JACK_ANC_HEADPHONE) mbhc->current_plug = MBHC_PLUG_TYPE_ANC_HEADPHONE; + if (mbhc->mbhc_cb->hph_pa_on_status) + is_pa_on = mbhc->mbhc_cb->hph_pa_on_status(codec); + if (mbhc->impedance_detect && mbhc->mbhc_cb->compute_impedance && - (mbhc->mbhc_cfg->linein_th != 0)) { + (mbhc->mbhc_cfg->linein_th != 0) && + (!is_pa_on)) { mbhc->mbhc_cb->compute_impedance(mbhc, &mbhc->zl, &mbhc->zr); if ((mbhc->zl > mbhc->mbhc_cfg->linein_th && From b5acd1cddc1f99177605f53268ea15bc48b597fa Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Wed, 30 Nov 2016 14:41:24 -0800 Subject: [PATCH 0423/1015] msm: ipa: fix the potential heap overflow on wan-driver Add the check on rmnet_ipa3_set_tether_client_pipe API to make sure not accessing move than QMI_IPA_MAX_PIPES_V01 entries when user-space module compromised. Change-Id: I59d39c7e5743dfea17853b6c4709605d4ebae962 Signed-off-by: Skylar Chang --- drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c | 19 ++++++++++++++++++- drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c | 17 +++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c index 7b16b51ff72c1..64dc2164d9ce6 100644 --- a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c @@ -2500,7 +2500,7 @@ int rmnet_ipa_set_data_quota(struct wan_ioctl_set_data_quota *data) * * Return codes: * 0: Success - * -EFAULT: Invalid interface name provided + * -EFAULT: Invalid src/dst pipes provided * other: See ipa_qmi_set_data_quota */ int rmnet_ipa_set_tether_client_pipe( @@ -2508,6 +2508,23 @@ int rmnet_ipa_set_tether_client_pipe( { int number, i; + /* error checking if ul_src_pipe_len valid or not*/ + if (data->ul_src_pipe_len > QMI_IPA_MAX_PIPES_V01 || + data->ul_src_pipe_len < 0) { + IPAWANERR("UL src pipes %d exceeding max %d\n", + data->ul_src_pipe_len, + QMI_IPA_MAX_PIPES_V01); + return -EFAULT; + } + /* error checking if dl_dst_pipe_len valid or not*/ + if (data->dl_dst_pipe_len > QMI_IPA_MAX_PIPES_V01 || + data->dl_dst_pipe_len < 0) { + IPAWANERR("DL dst pipes %d exceeding max %d\n", + data->dl_dst_pipe_len, + QMI_IPA_MAX_PIPES_V01); + return -EFAULT; + } + IPAWANDBG("client %d, UL %d, DL %d, reset %d\n", data->ipa_client, data->ul_src_pipe_len, diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index f3b2f379ff4a4..cc11f2d10fb94 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -2599,6 +2599,23 @@ int rmnet_ipa3_set_tether_client_pipe( { int number, i; + /* error checking if ul_src_pipe_len valid or not*/ + if (data->ul_src_pipe_len > QMI_IPA_MAX_PIPES_V01 || + data->ul_src_pipe_len < 0) { + IPAWANERR("UL src pipes %d exceeding max %d\n", + data->ul_src_pipe_len, + QMI_IPA_MAX_PIPES_V01); + return -EFAULT; + } + /* error checking if dl_dst_pipe_len valid or not*/ + if (data->dl_dst_pipe_len > QMI_IPA_MAX_PIPES_V01 || + data->dl_dst_pipe_len < 0) { + IPAWANERR("DL dst pipes %d exceeding max %d\n", + data->dl_dst_pipe_len, + QMI_IPA_MAX_PIPES_V01); + return -EFAULT; + } + IPAWANDBG("client %d, UL %d, DL %d, reset %d\n", data->ipa_client, data->ul_src_pipe_len, From 66b31c60917df183d543711d7cc5d92dc0e42279 Mon Sep 17 00:00:00 2001 From: Manu Gautam Date: Thu, 15 Dec 2016 11:39:46 +0530 Subject: [PATCH 0424/1015] usb: phy: qusb: Keep LDOs ON during disconnect if PMI voted for it PMI software requests PHY driver to turn-ON LDOs before running charger detection. This is needed to have USB data lines in hi-Z state. If there is race between USB driver processing disconnect and next rm_pulldown request, then there is a possibility of PHY driver turning-off LDOs even if PMI voted for it. This can cause charger detection to fail. To fix this add a check in PHY driver to check PMI vote in disconnect handling. Change-Id: I6e873207aeee60e8e933430fc4e755aef81ab447 CRs-fixed: 1097343 Signed-off-by: Manu Gautam --- drivers/usb/phy/phy-msm-qusb.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/usb/phy/phy-msm-qusb.c b/drivers/usb/phy/phy-msm-qusb.c index 21cf09fc53548..99f4c68c81959 100644 --- a/drivers/usb/phy/phy-msm-qusb.c +++ b/drivers/usb/phy/phy-msm-qusb.c @@ -1005,7 +1005,12 @@ static int qusb_phy_set_suspend(struct usb_phy *phy, int suspend) if (qphy->tcsr_phy_lvl_shift_keeper) writel_relaxed(0x0, qphy->tcsr_phy_lvl_shift_keeper); - qusb_phy_enable_power(qphy, false); + /* Do not disable power rails if there is vote for it */ + if (!qphy->rm_pulldown) + qusb_phy_enable_power(qphy, false); + else + dev_dbg(phy->dev, "race with rm_pulldown. Keep ldo ON\n"); + /* * Set put_into_high_z_state to true so next USB * cable connect, DPF_DMF request performs PHY From 5f7e9869bb62d17ee7e9e9bbf0bf85baf22c7300 Mon Sep 17 00:00:00 2001 From: Sayali Lokhande Date: Fri, 18 Nov 2016 16:05:50 +0530 Subject: [PATCH 0425/1015] mmc: sdhci-msm: Disable controller clocks in suspend Generally, during card suspend we call mmc_power_off and disable controller clocks. Now consider below sequence of events : suspend -> resume -> suspend. 1) During first platform suspend, mmc_power_off will be called and clocks would be disabled. 2) As a part of platform resume, we enable controller clocks and defer card resume when MMC_BUSRESUME_NEEDS_RESUME flag is set. 3) During next suspend we check if card is already suspended (i.e MMC_BUSRESUME_NEEDS_RESUME is set) and return without doing actual suspend (where we call mmc_power_off and disable controller clocks). So in this scenario, controller clocks will remain ON even though card state is SUSPENDED. Fix this by disabling controller clocks during suspend if controller clock was ON. CRs-Fixed: 1088893 Change-Id: Id54a15d7f6a7131dab609eec1db158c64ada83ce Signed-off-by: Sayali Lokhande --- drivers/mmc/host/sdhci-msm.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index e079f494bbd49..8a12214dc0d5b 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -2706,7 +2706,24 @@ static int sdhci_msm_enable_controller_clock(struct sdhci_host *host) return rc; } +static void sdhci_msm_disable_controller_clock(struct sdhci_host *host) +{ + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_msm_host *msm_host = pltfm_host->priv; + if (atomic_read(&msm_host->controller_clock)) { + if (!IS_ERR(msm_host->clk)) + clk_disable_unprepare(msm_host->clk); + if (!IS_ERR(msm_host->pclk)) + clk_disable_unprepare(msm_host->pclk); + if (!IS_ERR(msm_host->ice_clk)) + clk_disable_unprepare(msm_host->ice_clk); + sdhci_msm_bus_voting(host, 0); + atomic_set(&msm_host->controller_clock, 0); + pr_debug("%s: %s: disabled controller clock\n", + mmc_hostname(host->mmc), __func__); + } +} static int sdhci_msm_prepare_clocks(struct sdhci_host *host, bool enable) { @@ -4564,7 +4581,7 @@ static int sdhci_msm_suspend(struct device *dev) } ret = sdhci_msm_runtime_suspend(dev); out: - + sdhci_msm_disable_controller_clock(host); if (host->mmc->card && mmc_card_sdio(host->mmc->card)) { sdio_cfg = sdhci_msm_cfg_sdio_wakeup(host, true); if (sdio_cfg) From 2142e22f03dd60b699fa11ac3c860eaee756b95a Mon Sep 17 00:00:00 2001 From: Satya Durga Srinivasu Prabhala Date: Tue, 25 Oct 2016 16:35:23 -0700 Subject: [PATCH 0426/1015] soc: qcom: scm: add check to avoid buffer overflow There is a posibility of a buffer overflow in scm_call, add check to avoid the same. Change-Id: Iee908c56ec530569b35dafa060139e0428efc781 Signed-off-by: Satya Durga Srinivasu Prabhala --- drivers/soc/qcom/scm.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/soc/qcom/scm.c b/drivers/soc/qcom/scm.c index f958d98ec9720..045a5001fc9fb 100644 --- a/drivers/soc/qcom/scm.c +++ b/drivers/soc/qcom/scm.c @@ -56,9 +56,16 @@ DEFINE_MUTEX(scm_lmh_lock); #define SMC_ATOMIC_MASK 0x80000000 #define IS_CALL_AVAIL_CMD 1 -#define SCM_BUF_LEN(__cmd_size, __resp_size) \ - (sizeof(struct scm_command) + sizeof(struct scm_response) + \ - __cmd_size + __resp_size) +#define SCM_BUF_LEN(__cmd_size, __resp_size) ({ \ + size_t x = __cmd_size + __resp_size; \ + size_t y = sizeof(struct scm_command) + sizeof(struct scm_response); \ + size_t result; \ + if (x < __cmd_size || (x + y) < x) \ + result = 0; \ + else \ + result = x + y; \ + result; \ + }) /** * struct scm_command - one SCM command buffer * @len: total available memory for command and response @@ -357,8 +364,7 @@ int scm_call_noalloc(u32 svc_id, u32 cmd_id, const void *cmd_buf, int ret; size_t len = SCM_BUF_LEN(cmd_len, resp_len); - if (cmd_len > scm_buf_len || resp_len > scm_buf_len || - len > scm_buf_len) + if (len == 0) return -EINVAL; if (!IS_ALIGNED((unsigned long)scm_buf, PAGE_SIZE)) @@ -777,7 +783,7 @@ int scm_call(u32 svc_id, u32 cmd_id, const void *cmd_buf, size_t cmd_len, int ret; size_t len = SCM_BUF_LEN(cmd_len, resp_len); - if (cmd_len > len || resp_len > len) + if (len == 0 || PAGE_ALIGN(len) < len) return -EINVAL; cmd = kzalloc(PAGE_ALIGN(len), GFP_KERNEL); From df86fc0e1ba4bfb5190ccdfc329bf2c0431592e3 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Thu, 15 Dec 2016 13:46:07 +0530 Subject: [PATCH 0427/1015] ARM: dts: msm: Update APC CPR static voltage margins for msm8920 Update APC CPR static open-loop and closed-loop voltage margins for msm8920 as per latest voltage characterization results. CRs-Fixed: 1100321 Change-Id: I8a55db4d173ffb4c01ba25d79f07dddd9e0029c7 Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8920.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index f5f5e7a2cc370..4cb8f4a28a726 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -202,14 +202,14 @@ <(-1) (-1) (-1) (-1) (-1) (-1)>; qcom,cpr-init-voltage-adjustment = - <0 0 0>, - <10000 0 0>, - <0 0 0>; + < 0 0 0 >, + <10000 5000 0 >, + < 0 0 0 >; qcom,cpr-quotient-adjustment = <(-19) (-28) (-19)>, /* SVSP(-10) NOM(-15) TUR(-10); KV(1.9) */ - < 0 0 0 >, - < 0 0 0 >; + <(-9) (-19) (-9)>, /* SVSP(-5) NOM(-10) TUR(-5); KV(1.9) */ + <0 0 0 >; qcom,cpr-enable; }; From d232b7ece8669a187eff825e42754989e0f96f6b Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Thu, 1 Dec 2016 11:32:09 +0530 Subject: [PATCH 0428/1015] ARM: dts: msm: Update APC CPR voltage margins for msm8940 Update APC CPR static voltage margins for msm8940 and msm8940pro as per voltage characterization data. CRs-Fixed: 1102963 Change-Id: I6a3a7addeb2e45699a363727c79416ce48ec1f1a Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8940.dtsi | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index 3a2f8623cd478..40f34119cfaa5 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -242,21 +242,24 @@ < 0 1 (-1) (-1) (-1) (-1)>, < 0 5 (-1) (-1) (-1) (-1)>, < 1 0 (-1) (-1) (-1) (-1)>, - < 1 1 (-1) (-1) (-1) (-1)>; + < 1 1 (-1) (-1) (-1) (-1)>, + < 1 5 (-1) (-1) (-1) (-1)>; qcom,cpr-init-voltage-adjustment = <0 0 0>, <0 0 20000>, - <0 0 15000>, <0 0 20000>, - <0 0 20000>; + <0 0 20000>, + <0 0 20000>, + <0 0 25000>; qcom,cpr-quotient-adjustment = <0 0 0>, <38 0 28>, /* SVSP(20mv); TURBO(15mv); KV(1.9) */ - <0 0 19>, /* TURBO(10mv); KV(1.9) */ <0 0 28>, /* TURBO(15mv); KV(1.9) */ - <38 0 28>; /* SVSP(20mv); TURBO(15mv); KV(1.9) */ + <0 0 28>, /* TURBO(15mv); KV(1.9) */ + <38 0 28>, /* SVSP(20mv); TURBO(15mv); KV(1.9) */ + <0 0 38>; /* TURBO(20mv); KV(1.9) */ qcom,cpr-enable; }; From beeed2ce751359c9bc47019041863fb2d542eeb6 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Tue, 20 Dec 2016 13:11:00 +0530 Subject: [PATCH 0429/1015] ARM: dts: msm: Set 1x DDR BW vote for MSM8920 GPU Currently GPU is voting 2X DDR BW vote which is resulting DDR to run at higher clock. Modify DDR BW vote 1x to keep DDR clock at required level. CRs-Fixed: 1094304 Change-Id: Ib5085e89bf16198a1fd0f555a9fd5dc9b0e486c1 Signed-off-by: Hareesh Gundu --- arch/arm/boot/dts/qcom/msm8920.dtsi | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 4cb8f4a28a726..79f4eec7f8262 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -321,3 +321,34 @@ qcom,inst-id = <11>; }; }; + +/* gpubw overrides */ +&gpubw { + /delete-property/ qcom,bw-tbl; + qcom,bw-tbl = + < 0 >, /* Off */ + < 769 >, /* 1. DDR:100.80 MHz BIMC: 201.60 MHz */ + < 1611>, /* 2. DDR:211.20 MHz BIMC: 422.40 MHz */ + < 2270>, /* 3. DDR:297.60 MHz BIMC: 595.20 MHz */ + < 2929>, /* 4. DDR:384.00 MHz BIMC: 768.00 MHz */ + < 4248>, /* 5. DDR:556.80 MHz BIMC: 1113.60 MHz */ + < 4541>, /* 6. DDR:595.20 MHz BIMC: 1190.40 MHz */ + < 5126>, /* 7. DDR:672.00 MHz BIMC: 1344.00 MHz */ + < 5639>; /* 8. DDR:739.20 MHz BIMC: 1478.40 MHz */ +}; + +/* GPU overrides */ +&msm_gpu { + + /delete-property/ qcom,msm-bus,vectors-KBps; + qcom,msm-bus,vectors-KBps = + <26 512 0 0>, /* off */ + <26 512 0 806400>, /* 1. 100.80 MHz */ + <26 512 0 1689600>, /* 2. 211.20 MHz */ + <26 512 0 2380800>, /* 3. 297.60 MHz */ + <26 512 0 3072000>, /* 4. 384.00 MHz */ + <26 512 0 4454400>, /* 5. 556.80 MHz */ + <26 512 0 4761600>, /* 6. 595.20 MHz */ + <26 512 0 5376000>, /* 7. 672.00 MHz */ + <26 512 0 5913600>; /* 8. 739.20 MHz */ +}; From 2b29863ce12a54a00226a8fd329ef3055fdc1854 Mon Sep 17 00:00:00 2001 From: Neeraj Soni Date: Thu, 22 Dec 2016 17:24:28 +0530 Subject: [PATCH 0430/1015] Revert "ARM: dts: msm: flag to control encryption key size on msm8996" This reverts commit 851a169104e598f366c18f5c9da05df5a48da899 Change-Id: I2ba89331e63d44eaa4148205e7f90c3723acdce9 Signed-off-by: Neeraj Soni --- arch/arm/boot/dts/qcom/msm8996.dtsi | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm8996.dtsi b/arch/arm/boot/dts/qcom/msm8996.dtsi index 5f004511cc8ec..b342288737848 100644 --- a/arch/arm/boot/dts/qcom/msm8996.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996.dtsi @@ -2495,7 +2495,6 @@ qcom,support-fde; qcom,no-clock-support; qcom,appsbl-qseecom-support; - qcom,fde-key-size; qcom,msm-bus,name = "qseecom-noc"; qcom,msm-bus,num-cases = <4>; qcom,msm-bus,num-paths = <1>; From 85ab8dada7857d0a34d5bc64f76cea21e3eb6114 Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Wed, 14 Dec 2016 12:16:15 +0530 Subject: [PATCH 0431/1015] memshare: Listen to SUBSYS_BEFORE_POWERUP to collect ramdump Currently the XPU lock on memory allocated for memshare clients may not be unlocked by MBA during SUBSYS_RAMDUMP_NOTIFICATION event and can result in XPU violation while collecting ramdump. This patch collects the ramdump on listening to SUBSYS_BEFORE_POWERUP event. CRs-Fixed: 1099029 Change-Id: I51732d5adc60ad106a44ba554818c18947e2e803 Signed-off-by: Manoj Prabhu B --- drivers/soc/qcom/memshare/msm_memshare.c | 32 +++++++++++------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/drivers/soc/qcom/memshare/msm_memshare.c b/drivers/soc/qcom/memshare/msm_memshare.c index 6f1f375534316..30cc27d6406d8 100644 --- a/drivers/soc/qcom/memshare/msm_memshare.c +++ b/drivers/soc/qcom/memshare/msm_memshare.c @@ -305,6 +305,21 @@ static int modem_notifier_cb(struct notifier_block *this, unsigned long code, bootup_request++; break; + case SUBSYS_BEFORE_POWERUP: + if (_cmd) + notifdata = (struct notif_data *) _cmd; + else + break; + + if (notifdata->enable_ramdump) { + pr_info("memshare: %s, Ramdump collection is enabled\n", + __func__); + ret = mem_share_do_ramdump(); + if (ret) + pr_err("Ramdump collection failed\n"); + } + break; + case SUBSYS_AFTER_POWERUP: pr_debug("memshare: Modem has booted up\n"); for (i = 0; i < MAX_CLIENTS; i++) { @@ -355,23 +370,6 @@ static int modem_notifier_cb(struct notifier_block *this, unsigned long code, bootup_request++; break; - case SUBSYS_RAMDUMP_NOTIFICATION: - - if (_cmd) - notifdata = (struct notif_data *) _cmd; - else - break; - - if (!(notifdata->enable_ramdump)) { - pr_err("In %s, Ramdump collection is disabled\n", - __func__); - } else { - ret = mem_share_do_ramdump(); - if (ret) - pr_err("Ramdump collection failed\n"); - } - break; - default: pr_debug("Memshare: code: %lu\n", code); break; From c40e16a807ba700260477164b7e2e5b052c6e2b4 Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Tue, 20 Dec 2016 09:41:04 +0530 Subject: [PATCH 0432/1015] sched: drop related_thread_group_lock before calling call_rcu() When the last task is removed from a related thread group, the group is freed by invoking an asynchronous RCU callback. The call_rcu() can wakeup rcu, kswapd tasks. Hence drop the related thread group lock, otherwise the wakeup path tries to acquire the same lock and results in deadlock. Change-Id: Idfb38a0276edbf6816369b3bab7f21bef5ccc556 Signed-off-by: Pavankumar Kondeti --- kernel/sched/core.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 96d3e2740ca78..984f9244d4b7e 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -3964,7 +3964,14 @@ static void remove_task_from_group(struct task_struct *p) if (empty_group) { list_del(&grp->list); + /* + * RCU, kswapd etc tasks can get woken up from + * call_rcu(). As the wakeup path also acquires + * the related_thread_group_lock, drop it here. + */ + write_unlock(&related_thread_group_lock); call_rcu(&grp->rcu, free_related_thread_group); + write_lock(&related_thread_group_lock); } } From 54cf212fc4099bedf3bd6f801edaf1dece7fe4c9 Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Thu, 22 Dec 2016 19:21:42 +0530 Subject: [PATCH 0433/1015] sched: Fix deadlock between cpu hotplug and upmigrate change There is a circular dependency between cpu_hotplug.lock and HMP scheduler policy mutex. Prevent this by enforcing the same lock order. Here CPU0 and CPU2 are governed by different cpufreq policies. ---------------- -------------------- CPU 0 CPU 2 --------------- -------------------- proc_sys_call_handler() cpu_up() --> acquired cpu_hotplug.lock sched_hmp_proc_update_handler() cpufreq_cpu_callback() --> acquired policy_mutex cpufreq_governor_interactive() get_online_cpus() sched_set_window() --> waiting for cpu_hotplug.lock --> waiting for policy_mutex Change-Id: I39efc394f4f00815b72adc975021fdb16fe6e30a Signed-off-by: Pavankumar Kondeti --- kernel/sched/fair.c | 29 ++++++++++++++++++++--------- kernel/sched/qhmp_fair.c | 30 ++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 063d882bf600b..33f1ba0fc2059 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -3805,7 +3805,21 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, int ret; unsigned int old_val; unsigned int *data = (unsigned int *)table->data; - int update_min_nice = 0; + int update_task_count = 0; + + if (!sched_enable_hmp) + return 0; + + /* + * The policy mutex is acquired with cpu_hotplug.lock + * held from cpu_up()->cpufreq_governor_interactive()-> + * sched_set_window(). So enforce the same order here. + */ + if (write && (data == &sysctl_sched_upmigrate_pct || + data == (unsigned int *)&sysctl_sched_upmigrate_min_nice)) { + update_task_count = 1; + get_online_cpus(); + } mutex_lock(&policy_mutex); @@ -3813,7 +3827,7 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); - if (ret || !write || !sched_enable_hmp) + if (ret || !write) goto done; if (write && (old_val == *data)) @@ -3828,7 +3842,6 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, ret = -EINVAL; goto done; } - update_min_nice = 1; } else if (data != &sysctl_sched_select_prev_cpu_us) { /* * all tunables other than min_nice and prev_cpu_us are @@ -3850,19 +3863,17 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, * includes taking runqueue lock of all online cpus and re-initiatizing * their big counter values based on changed criteria. */ - if ((data == &sysctl_sched_upmigrate_pct || update_min_nice)) { - get_online_cpus(); + if (update_task_count) pre_big_task_count_change(cpu_online_mask); - } set_hmp_defaults(); - if ((data == &sysctl_sched_upmigrate_pct || update_min_nice)) { + if (update_task_count) post_big_task_count_change(cpu_online_mask); - put_online_cpus(); - } done: + if (update_task_count) + put_online_cpus(); mutex_unlock(&policy_mutex); return ret; } diff --git a/kernel/sched/qhmp_fair.c b/kernel/sched/qhmp_fair.c index ebcc53f69c376..d9f03c3c917d6 100644 --- a/kernel/sched/qhmp_fair.c +++ b/kernel/sched/qhmp_fair.c @@ -3883,7 +3883,22 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, int ret; unsigned int old_val; unsigned int *data = (unsigned int *)table->data; - int update_min_nice = 0; + int update_task_count = 0; + + if (!sched_enable_hmp) + return 0; + + /* + * The policy mutex is acquired with cpu_hotplug.lock + * held from cpu_up()->cpufreq_governor_interactive()-> + * sched_set_window(). So enforce the same order here. + */ + if (write && (data == &sysctl_sched_upmigrate_pct || + data == &sysctl_sched_small_task_pct || + data == (unsigned int *)&sysctl_sched_upmigrate_min_nice)) { + update_task_count = 1; + get_online_cpus(); + } mutex_lock(&policy_mutex); @@ -3908,7 +3923,6 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, ret = -EINVAL; goto done; } - update_min_nice = 1; } else { /* all tunables other than min_nice are in percentage */ if (sysctl_sched_downmigrate_pct > @@ -3927,21 +3941,17 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, * includes taking runqueue lock of all online cpus and re-initiatizing * their big/small counter values based on changed criteria. */ - if ((data == &sysctl_sched_upmigrate_pct || - data == &sysctl_sched_small_task_pct || update_min_nice)) { - get_online_cpus(); + if (update_task_count) pre_big_small_task_count_change(cpu_online_mask); - } set_hmp_defaults(); - if ((data == &sysctl_sched_upmigrate_pct || - data == &sysctl_sched_small_task_pct || update_min_nice)) { + if (update_task_count) post_big_small_task_count_change(cpu_online_mask); - put_online_cpus(); - } done: + if (update_task_count) + put_online_cpus(); mutex_unlock(&policy_mutex); return ret; } From 78516b08cb7ab53717bd8e05047740472cd956ca Mon Sep 17 00:00:00 2001 From: Tanvi Aggarwal Date: Tue, 20 Dec 2016 14:52:25 +0530 Subject: [PATCH 0434/1015] ARM: dts: msm: Add AF support for rear aux camera on msm8953 Adding new eeprom node to support focus for back aux camera node 1 on msm8953 CDP. Change-Id: I0bfd4e6f0e62e5832bf5eb346d9c5c7e9f11d65a CRs-Fixed: 1103372 Signed-off-by: Tanvi Aggarwal --- .../dts/qcom/msm8953-camera-sensor-cdp.dtsi | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi index ab43d3d4cde62..13e93c1fcaf97 100644 --- a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi @@ -165,6 +165,42 @@ qcom,clock-rates = <19200000 0>; }; + eeprom2: qcom,eeprom@2 { + cell-index = <2>; + compatible = "qcom,eeprom"; + qcom,cci-master = <1>; + reg = <0x2>; + cam_vdig-supply = <&pm8953_l23>; + cam_vana-supply = <&pm8953_l22>; + cam_vio-supply = <&pm8953_l6>; + cam_vaf-supply = <&pm8953_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 0 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 131 0>, + <&tlmm 132 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1", + "CAM_STANDBY1"; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + qcom,camera@0 { cell-index = <0>; compatible = "qcom,camera"; @@ -218,6 +254,8 @@ qcom,csiphy-sd-index = <1>; qcom,csid-sd-index = <1>; qcom,mount-angle = <90>; + qcom,eeprom-src = <&eeprom2>; + qcom,actuator-src = <&actuator1>; cam_vdig-supply = <&pm8953_l23>; cam_vana-supply = <&pm8953_l22>; cam_vio-supply = <&pm8953_l6>; From 6e0f26637f10a0971ac1446d3fb10601103bf83b Mon Sep 17 00:00:00 2001 From: Santosh Mardi Date: Thu, 24 Nov 2016 17:11:36 +0530 Subject: [PATCH 0435/1015] cpufreq_stats: fix to process policy exit in notifier In the cpufreq framework before issuing notifier call with policy exit event policy table is made NULL and cpufreq stat driver policy notifier function is being called for policy exit event, in the notifier call policy table is retrieved before proceding with the policy exit event as cpufreq FW marked policy table as NULL, notifier call returns without processing policy exit events. Moving policy exit event handling prior to policy table NULL check to address this issue. CRs-Fixed: 1093951 Change-Id: I9540ce8089c4035c13f7ffa8522d4a179657a254 Signed-off-by: Santosh Mardi --- drivers/cpufreq/cpufreq_stats.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index 25dee6fc0abe6..8e093a5d48f90 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c @@ -602,6 +602,9 @@ static int cpufreq_stat_notifier_policy(struct notifier_block *nb, if (val == CPUFREQ_UPDATE_POLICY_CPU) { cpufreq_stats_update_policy_cpu(policy); return 0; + } else if (val == CPUFREQ_REMOVE_POLICY) { + __cpufreq_stats_free_table(policy); + return 0; } table = cpufreq_frequency_get_table(cpu); @@ -621,8 +624,6 @@ static int cpufreq_stat_notifier_policy(struct notifier_block *nb, if (val == CPUFREQ_CREATE_POLICY) ret = __cpufreq_stats_create_table(policy, table, count); - else if (val == CPUFREQ_REMOVE_POLICY) - __cpufreq_stats_free_table(policy); return ret; } From 85b17185282748c1f7991e9fda6b0c84784ea570 Mon Sep 17 00:00:00 2001 From: Sahitya Tummala Date: Wed, 30 Nov 2016 09:00:53 +0530 Subject: [PATCH 0436/1015] mmc: block: Fix issue with deferred resume when CQ is enabled In CQ mode, the legacy commands will be sent after CQ is put in halt state. But when deferred resume is enabled, the resume happens in mmc_wait_for_req(), which will enable CQ again overiding the caller's state. This causes legacy commands to fail. Fix this by moving the deferred resume from all the places to mmc_get_card() which is always the first step done in both CQ/legacy commands and thus avoids the above issue scneario. Change-Id: I432e89f3221615dd644412f481d17f840c75e407 Signed-off-by: Sahitya Tummala --- drivers/mmc/card/block.c | 8 -------- drivers/mmc/core/core.c | 8 ++++---- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index db111eb27474c..2c7bd98b067dc 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -3490,10 +3490,6 @@ static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req) mmc_get_card(card); -#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME - if (mmc_bus_needs_resume(card->host)) - mmc_resume_bus(card->host); -#endif if (!card->host->cmdq_ctx.active_reqs && mmc_card_doing_bkops(card)) { ret = mmc_cmdq_halt(card->host, true); if (ret) @@ -3580,10 +3576,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) /* claim host only for the first request */ mmc_get_card(card); -#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME - if (mmc_bus_needs_resume(card->host)) - mmc_resume_bus(card->host); -#endif if (mmc_card_doing_bkops(host->card)) { ret = mmc_stop_bkops(host->card); if (ret) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index b07abf8661705..9b69cfe4b7942 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1646,10 +1646,6 @@ EXPORT_SYMBOL(mmc_start_req); */ void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq) { -#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME - if (mmc_bus_needs_resume(host)) - mmc_resume_bus(host); -#endif __mmc_start_req(host, mrq); mmc_wait_for_req_done(host, mrq); } @@ -2046,6 +2042,10 @@ void mmc_get_card(struct mmc_card *card) { pm_runtime_get_sync(&card->dev); mmc_claim_host(card->host); +#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME + if (mmc_bus_needs_resume(card->host)) + mmc_resume_bus(card->host); +#endif } EXPORT_SYMBOL(mmc_get_card); From 8a084bed54b1c98c3beb517ff2a83494b5834300 Mon Sep 17 00:00:00 2001 From: Krishna Chaitanya Devarakonda Date: Fri, 9 Dec 2016 14:25:08 +0530 Subject: [PATCH 0437/1015] msm: mdss: Fix race condition during secure display transitions When we release the ov_lock in kickoff after the commit sequence, there is a chance that validate call for the next commit updates the secure display transition state. This might result in early secure display configuration (enable/disable), which will cause SMMU faults. To avoid this, store the secure display transition state at the start of kickoff locally, and use it for secure display configurations. Change-Id: Ib7bfe23be30d3ee70e346e388bf112bc1d0c4e99 Signed-off-by: Krishna Chaitanya Devarakonda --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index 08f4b9cd46f5a..bd6c02e8b4a7f 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -2003,6 +2003,7 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd); int ret = 0; struct mdss_mdp_commit_cb commit_cb; + u8 sd_transition_state = 0; if (!ctl) return -ENODEV; @@ -2046,7 +2047,8 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, if (ctl->ops.wait_pingpong && mdp5_data->mdata->serialize_wait4pp) mdss_mdp_display_wait4pingpong(ctl, true); - if (mdp5_data->sd_transition_state != SD_TRANSITION_NONE) { + sd_transition_state = mdp5_data->sd_transition_state; + if (sd_transition_state != SD_TRANSITION_NONE) { ret = __config_secure_display(mdp5_data); if (IS_ERR_VALUE(ret)) { pr_err("Secure session config failed\n"); @@ -2133,7 +2135,7 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, * If we are transitioning from secure to non-secure display, * disable the secure display. */ - if (mdp5_data->sd_enabled && (mdp5_data->sd_transition_state == + if (mdp5_data->sd_enabled && (sd_transition_state == SD_TRANSITION_SECURE_TO_NON_SECURE)) { ret = mdss_mdp_secure_display_ctrl(mdp5_data->mdata, 0); if (!ret) From 190bb9dcbfc61b01821967dca4f1f248a5f18df5 Mon Sep 17 00:00:00 2001 From: Yan He Date: Wed, 2 Nov 2016 11:51:10 -0700 Subject: [PATCH 0438/1015] msm: sps: add the checking of userspace input length Add the checking of the input length from userspace so kernel space will not copy any content outside the input buffer. Change-Id: I3cef834ed1df836356ba40e6e950a534ec49819d Signed-off-by: Yan He --- drivers/platform/msm/sps/sps.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/platform/msm/sps/sps.c b/drivers/platform/msm/sps/sps.c index eab0e47e7cd23..2f11c6dd7e05c 100644 --- a/drivers/platform/msm/sps/sps.c +++ b/drivers/platform/msm/sps/sps.c @@ -131,9 +131,10 @@ static ssize_t sps_set_info(struct file *file, const char __user *buf, int i; u32 buf_size_kb = 0; u32 new_buf_size; + u32 size = sizeof(str) < count ? sizeof(str) : count; memset(str, 0, sizeof(str)); - missing = copy_from_user(str, buf, sizeof(str)); + missing = copy_from_user(str, buf, size); if (missing) return -EFAULT; @@ -221,9 +222,10 @@ static ssize_t sps_set_logging_option(struct file *file, const char __user *buf, char str[MAX_MSG_LEN]; int i; u8 option = 0; + u32 size = sizeof(str) < count ? sizeof(str) : count; memset(str, 0, sizeof(str)); - missing = copy_from_user(str, buf, sizeof(str)); + missing = copy_from_user(str, buf, size); if (missing) return -EFAULT; @@ -270,9 +272,10 @@ static ssize_t sps_set_bam_addr(struct file *file, const char __user *buf, struct sps_bam *bam; u32 num_pipes = 0; void *vir_addr; + u32 size = sizeof(str) < count ? sizeof(str) : count; memset(str, 0, sizeof(str)); - missing = copy_from_user(str, buf, sizeof(str)); + missing = copy_from_user(str, buf, size); if (missing) return -EFAULT; From 8fd496e57da85edaab31b0ee939248f550ca1c9d Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Thu, 15 Dec 2016 13:46:07 +0530 Subject: [PATCH 0439/1015] ARM: dts: msm: Update APC CPR static voltage margins for msm8920. Update APC CPR static open-loop and closed-loop voltage margins for msm8920 as per latest voltage characterization results. CRs-Fixed: 1100321 Change-Id: I8a55db4d173ffb4c01ba25d79f07dddd9e0029c7 Signed-off-by: Tirupathi Reddy Signed-off-by: Naveen Kumar --- arch/arm/boot/dts/qcom/msm8920.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index f5f5e7a2cc370..4cb8f4a28a726 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -202,14 +202,14 @@ <(-1) (-1) (-1) (-1) (-1) (-1)>; qcom,cpr-init-voltage-adjustment = - <0 0 0>, - <10000 0 0>, - <0 0 0>; + < 0 0 0 >, + <10000 5000 0 >, + < 0 0 0 >; qcom,cpr-quotient-adjustment = <(-19) (-28) (-19)>, /* SVSP(-10) NOM(-15) TUR(-10); KV(1.9) */ - < 0 0 0 >, - < 0 0 0 >; + <(-9) (-19) (-9)>, /* SVSP(-5) NOM(-10) TUR(-5); KV(1.9) */ + <0 0 0 >; qcom,cpr-enable; }; From 476754df80ac4ff9e7c37cff1054fc795f943287 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Mon, 26 Dec 2016 14:20:17 +0530 Subject: [PATCH 0440/1015] ARM: dts: msm: Update APC CPR voltage margins for msm8920 Update APC CPR static open-loop and closed-loop voltage margins for msm8920 as per voltage characterization data. CRs-Fixed: 1105224 Change-Id: Ia0f83d7ac5486b42ff58a48ecb405e864f57cfa3 Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8920.dtsi | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 79f4eec7f8262..d0efa7e19bbba 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -199,16 +199,22 @@ /* Format: */ < 0 0 1 (-1) (-1) (-1)>, < 0 0 (-1) (-1) (-1) (-1)>, + < 0 1 1 (-1) (-1) (-1)>, + < 0 1 (-1) (-1) (-1) (-1)>, <(-1) (-1) (-1) (-1) (-1) (-1)>; qcom,cpr-init-voltage-adjustment = < 0 0 0 >, <10000 5000 0 >, + < 0 0 0 >, + <15000 5000 0 >, < 0 0 0 >; qcom,cpr-quotient-adjustment = <(-19) (-28) (-19)>, /* SVSP(-10) NOM(-15) TUR(-10); KV(1.9) */ <(-9) (-19) (-9)>, /* SVSP(-5) NOM(-10) TUR(-5); KV(1.9) */ + <(-38) (-28) (-38)>, /* SVSP(-20) NOM(-15) TUR(-20); KV(1.9) */ + <0 0 0 >, <0 0 0 >; qcom,cpr-enable; From 0350a321473a77f23cb2394948f51fb36403d3a0 Mon Sep 17 00:00:00 2001 From: Brahmaji K Date: Tue, 13 Dec 2016 20:32:24 +0530 Subject: [PATCH 0441/1015] msm-3.18: drivers : added validation of input/output buffer sizes This change fixes issues reagrding the ioctl QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ uncovered by fuzzy tests. Modified handler of above ioctl, not to allow input/output buffer sizes greater than a fixed defined size. Change-Id: I69f94a29d939341564f6f3ebfda48fceaa934542 Signed-off-by: Brahmaji K --- drivers/misc/qseecom.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 83c951bbf1b35..587887bb51f51 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -80,6 +80,9 @@ /* Encrypt/Decrypt Data Integrity Partition (DIP) for MDTP */ #define SCM_MDTP_CIPHER_DIP 0x01 +/* Maximum Allowed Size (128K) of Data Integrity Partition (DIP) for MDTP */ +#define MAX_DIP 0x20000 + #define RPMB_SERVICE 0x2000 #define SSD_SERVICE 0x3000 @@ -5842,7 +5845,8 @@ static int qseecom_mdtp_cipher_dip(void __user *argp) } if (req.in_buf == NULL || req.out_buf == NULL || - req.in_buf_size == 0 || req.out_buf_size == 0 || + req.in_buf_size == 0 || req.in_buf_size > MAX_DIP || + req.out_buf_size == 0 || req.out_buf_size > MAX_DIP || req.direction > 1) { pr_err("invalid parameters\n"); ret = -EINVAL; From ab384ed5ec9f71da9dc74cc8b312566bf8bce036 Mon Sep 17 00:00:00 2001 From: Veerabhadrarao Badiganti Date: Tue, 27 Dec 2016 13:13:59 +0530 Subject: [PATCH 0442/1015] ARM: config: Enable DEFERRED RESUME flag Enabling deferred resume feature by default. With this feature enabled, eMMC device won't be resumed as part of the system resume. It will be resumed only when there's a request to be processed. Change-Id: I57ded7a50d2e648dfd1c9348fa22d1ade942c6c1 Signed-off-by: Veerabhadrarao Badiganti --- arch/arm/configs/msm8937-perf_defconfig | 1 + arch/arm/configs/msm8937_defconfig | 1 + arch/arm64/configs/msm8937-perf_defconfig | 1 + arch/arm64/configs/msm8937_defconfig | 1 + 4 files changed, 4 insertions(+) diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index 96923292e9917..6eb9a9914a00d 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -471,6 +471,7 @@ CONFIG_MMC_PERF_PROFILING=y CONFIG_MMC_CLKGATE=y CONFIG_MMC_PARANOID_SD_INIT=y CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y CONFIG_MMC_TEST=m CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index 0ea4559cd56cd..025ff0ddb4c43 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -475,6 +475,7 @@ CONFIG_MMC_PERF_PROFILING=y CONFIG_MMC_CLKGATE=y CONFIG_MMC_PARANOID_SD_INIT=y CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y CONFIG_MMC_TEST=m CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index 518f94b24f4a4..838700b79edbe 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -471,6 +471,7 @@ CONFIG_MMC_PERF_PROFILING=y CONFIG_MMC_CLKGATE=y CONFIG_MMC_PARANOID_SD_INIT=y CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y CONFIG_MMC_TEST=m CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 5621b9aa28e8c..e345fee560ea4 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -472,6 +472,7 @@ CONFIG_MMC_PERF_PROFILING=y CONFIG_MMC_CLKGATE=y CONFIG_MMC_PARANOID_SD_INIT=y CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y CONFIG_MMC_TEST=m CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y From 6ba9b5b881c5c33ba6f46c1c6f6def6f481a26b2 Mon Sep 17 00:00:00 2001 From: Ramesh V Date: Tue, 20 Dec 2016 12:02:07 +0530 Subject: [PATCH 0443/1015] msm: camera: isp: Reserve unified buffer(ub) space for rdi Rdi and pix interfaces can operate on different camera and they can start/stop independently. If once camera uses entire ub then another camera will not get any ub resulting in overflow. Fix this problem by reserving space for rdi interface in ub. Change-Id: I66f03cec28d7e3ecda42c06f01eb18fd869c913b Signed-off-by: Ramesh V --- .../platform/msm/camera_v2/isp/msm_isp.h | 10 +- .../platform/msm/camera_v2/isp/msm_isp32.c | 83 ++---------- .../platform/msm/camera_v2/isp/msm_isp40.c | 116 +++-------------- .../platform/msm/camera_v2/isp/msm_isp44.c | 75 ++--------- .../platform/msm/camera_v2/isp/msm_isp46.c | 95 +++----------- .../platform/msm/camera_v2/isp/msm_isp47.c | 121 ++++++++++++------ .../platform/msm/camera_v2/isp/msm_isp47.h | 5 +- .../msm/camera_v2/isp/msm_isp_axi_util.c | 50 +++++--- 8 files changed, 180 insertions(+), 375 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h index ad2b2e6d486b0..bccaf348f02d0 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h @@ -197,15 +197,12 @@ struct msm_vfe_axi_ops { uint8_t plane_idx); void (*clear_wm_xbar_reg)(struct vfe_device *vfe_dev, struct msm_vfe_axi_stream *stream_info, uint8_t plane_idx); - - void (*cfg_ub)(struct vfe_device *vfe_dev); - + void (*cfg_ub)(struct vfe_device *vfe_dev, + enum msm_vfe_input_src frame_src); void (*read_wm_ping_pong_addr)(struct vfe_device *vfe_dev); - void (*update_ping_pong_addr)(void __iomem *vfe_base, uint8_t wm_idx, uint32_t pingpong_bit, dma_addr_t paddr, int32_t buf_size); - uint32_t (*get_wm_mask)(uint32_t irq_status0, uint32_t irq_status1); uint32_t (*get_comp_mask)(uint32_t irq_status0, uint32_t irq_status1); uint32_t (*get_pingpong_status)(struct vfe_device *vfe_dev); @@ -214,6 +211,8 @@ struct msm_vfe_axi_ops { uint32_t enable_camif); void (*update_cgc_override)(struct vfe_device *vfe_dev, uint8_t wm_idx, uint8_t cgc_override); + uint32_t (*ub_reg_offset)(struct vfe_device *vfe_dev, int idx); + uint32_t (*get_ub_size)(struct vfe_device *vfe_dev); }; struct msm_vfe_core_ops { @@ -467,6 +466,7 @@ struct msm_vfe_src_info { uint32_t frame_id; uint32_t reg_update_frame_id; uint8_t active; + uint8_t flag; uint8_t pix_stream_count; uint8_t raw_stream_count; enum msm_vfe_inputmux input_mux; diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c index 9481bede6417c..a0195a934c83e 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c @@ -60,6 +60,16 @@ static struct msm_cam_clk_info msm_vfe32_2_clk_info[] = { {"csi_vfe_clk", -1}, }; +static uint32_t msm_vfe32_ub_reg_offset(struct vfe_device *vfe_dev, int idx) +{ + return (VFE32_WM_BASE(idx) + 0xC); +} + +static uint32_t msm_vfe32_get_ub_size(struct vfe_device *vfe_dev) +{ + return MSM_ISP32_TOTAL_WM_UB; +} + static int32_t msm_vfe32_init_qos_parms(struct vfe_device *vfe_dev, struct msm_vfe_hw_init_parms *qos_parms, struct msm_vfe_hw_init_parms *ds_parms) @@ -1088,75 +1098,6 @@ static void msm_vfe32_axi_clear_wm_xbar_reg( msm_camera_io_w(xbar_reg_cfg, vfe_dev->vfe_base + VFE32_XBAR_BASE(wm)); } -static void msm_vfe32_cfg_axi_ub_equal_default(struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - uint32_t total_image_size = 0; - uint32_t num_used_wms = 0; - uint32_t prop_size = 0; - uint32_t wm_ub_size; - uint64_t delta; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i] > 0) { - num_used_wms++; - total_image_size += axi_data->wm_image_size[i]; - } - } - prop_size = MSM_ISP32_TOTAL_WM_UB - - axi_data->hw_info->min_wm_ub * num_used_wms; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i]) { - delta = - (uint64_t)(axi_data->wm_image_size[i] * - prop_size); - do_div(delta, total_image_size); - wm_ub_size = axi_data->hw_info->min_wm_ub + - (uint32_t)delta; - msm_camera_io_w(ub_offset << 16 | - (wm_ub_size - 1), vfe_dev->vfe_base + - VFE32_WM_BASE(i) + 0xC); - ub_offset += wm_ub_size; - } else { - msm_camera_io_w(0, - vfe_dev->vfe_base + VFE32_WM_BASE(i) + 0xC); - } - } -} - -static void msm_vfe32_cfg_axi_ub_equal_slicing(struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - uint32_t final_ub_slice_size; - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (ub_offset + VFE32_EQUAL_SLICE_UB > VFE32_AXI_SLICE_UB) { - final_ub_slice_size = VFE32_AXI_SLICE_UB - ub_offset; - msm_camera_io_w(ub_offset << 16 | - (final_ub_slice_size - 1), vfe_dev->vfe_base + - VFE32_WM_BASE(i) + 0xC); - ub_offset += final_ub_slice_size; - } else { - msm_camera_io_w(ub_offset << 16 | - (VFE32_EQUAL_SLICE_UB - 1), vfe_dev->vfe_base + - VFE32_WM_BASE(i) + 0xC); - ub_offset += VFE32_EQUAL_SLICE_UB; - } - } -} - -static void msm_vfe32_cfg_axi_ub(struct vfe_device *vfe_dev) -{ - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - axi_data->wm_ub_cfg_policy = MSM_WM_UB_CFG_DEFAULT; - if (axi_data->wm_ub_cfg_policy == MSM_WM_UB_EQUAL_SLICING) - msm_vfe32_cfg_axi_ub_equal_slicing(vfe_dev); - else - msm_vfe32_cfg_axi_ub_equal_default(vfe_dev); -} - static void msm_vfe32_update_ping_pong_addr(void __iomem *vfe_base, uint8_t wm_idx, uint32_t pingpong_bit, dma_addr_t paddr, int32_t buf_size) @@ -1489,13 +1430,15 @@ struct msm_vfe_hardware_info vfe32_hw_info = { .clear_wm_reg = msm_vfe32_axi_clear_wm_reg, .cfg_wm_xbar_reg = msm_vfe32_axi_cfg_wm_xbar_reg, .clear_wm_xbar_reg = msm_vfe32_axi_clear_wm_xbar_reg, - .cfg_ub = msm_vfe32_cfg_axi_ub, + .cfg_ub = msm_vfe47_cfg_axi_ub, .update_ping_pong_addr = msm_vfe32_update_ping_pong_addr, .get_comp_mask = msm_vfe32_get_comp_mask, .get_wm_mask = msm_vfe32_get_wm_mask, .get_pingpong_status = msm_vfe32_get_pingpong_status, .halt = msm_vfe32_axi_halt, + .ub_reg_offset = msm_vfe32_ub_reg_offset, + .get_ub_size = msm_vfe32_get_ub_size, }, .core_ops = { .reg_update = msm_vfe32_reg_update, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index fb3c58ba077a8..3ae71b59b8b75 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -96,6 +96,20 @@ static uint8_t stats_pingpong_offset_map[] = { #define VFE40_CLK_IDX 2 +static uint32_t msm_vfe40_ub_reg_offset(struct vfe_device *vfe_dev, int idx) +{ + return (VFE40_WM_BASE(idx) + 0x10); +} + +static uint32_t msm_vfe40_get_ub_size(struct vfe_device *vfe_dev) +{ + if (vfe_dev->vfe_hw_version == VFE40_8916_VERSION) { + vfe_dev->ub_info->wm_ub = VFE40_TOTAL_WM_UB_8916; + return VFE40_TOTAL_WM_UB_8916; + } + return VFE40_TOTAL_WM_UB; +} + static void msm_vfe40_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, enum msm_isp_irq_operation oper) @@ -1659,104 +1673,6 @@ static void msm_vfe40_axi_clear_wm_xbar_reg( vfe_dev->vfe_base + VFE40_XBAR_BASE(wm)); } -static void msm_vfe40_cfg_axi_ub_equal_default( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = - &vfe_dev->axi_data; - uint32_t total_image_size = 0; - uint8_t num_used_wms = 0; - uint32_t prop_size = 0; - uint32_t wm_ub_size; - uint32_t total_wm_ub; - - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i] > 0) { - num_used_wms++; - total_image_size += axi_data->wm_image_size[i]; - } - } - - if (vfe_dev->vfe_hw_version == VFE40_8916_VERSION) { - vfe_dev->ub_info->wm_ub = VFE40_TOTAL_WM_UB_8916; - total_wm_ub = VFE40_TOTAL_WM_UB_8916; - } else { - vfe_dev->ub_info->wm_ub = VFE40_TOTAL_WM_UB; - total_wm_ub = VFE40_TOTAL_WM_UB; - } - vfe_dev->ub_info->num_wm = axi_data->hw_info->num_wm; - prop_size = total_wm_ub - - axi_data->hw_info->min_wm_ub * num_used_wms; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i]) { - uint64_t delta = 0; - uint64_t temp = (uint64_t)axi_data->wm_image_size[i] * - (uint64_t)prop_size; - do_div(temp, total_image_size); - delta = temp; - wm_ub_size = axi_data->hw_info->min_wm_ub + delta; - msm_camera_io_w(ub_offset << 16 | (wm_ub_size - 1), - vfe_dev->vfe_base + VFE40_WM_BASE(i) + 0x10); - - vfe_dev->ub_info->data[i] = - ub_offset << 16 | (wm_ub_size - 1); - vfe_dev->ub_info->addr[i] = VFE40_WM_BASE(i) + 0x10; - ub_offset += wm_ub_size; - } else { - msm_camera_io_w(0, - vfe_dev->vfe_base + VFE40_WM_BASE(i) + 0x10); - vfe_dev->ub_info->data[i] = 0; - vfe_dev->ub_info->addr[i] = VFE40_WM_BASE(i) + 0x10; - } - } -} - -static void msm_vfe40_cfg_axi_ub_equal_slicing( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - uint32_t equal_slice_ub; - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - - if (vfe_dev->vfe_hw_version == VFE40_8916_VERSION || - vfe_dev->vfe_hw_version == VFE40_8952_VERSION) { - vfe_dev->ub_info->wm_ub = VFE40_EQUAL_SLICE_UB_8916; - equal_slice_ub = VFE40_EQUAL_SLICE_UB_8916; - } else { - vfe_dev->ub_info->wm_ub = VFE40_EQUAL_SLICE_UB; - equal_slice_ub = VFE40_EQUAL_SLICE_UB; - } - - vfe_dev->ub_info->num_wm = axi_data->hw_info->num_wm; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - msm_camera_io_w(ub_offset << 16 | (equal_slice_ub - 1), - vfe_dev->vfe_base + VFE40_WM_BASE(i) + 0x10); - vfe_dev->ub_info->data[i] = - ub_offset << 16 | (equal_slice_ub - 1); - vfe_dev->ub_info->addr[i] = VFE40_WM_BASE(i) + 0x10; - ub_offset += equal_slice_ub; - } -} - -static void msm_vfe40_cfg_axi_ub(struct vfe_device *vfe_dev) -{ - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - axi_data->wm_ub_cfg_policy = - (enum msm_wm_ub_cfg_type)vfe_dev->vfe_ub_policy; - ISP_DBG("%s: ub_policy %d\n", __func__, axi_data->wm_ub_cfg_policy); - - if (axi_data->wm_ub_cfg_policy == MSM_WM_UB_EQUAL_SLICING) { - vfe_dev->ub_info->policy = MSM_WM_UB_EQUAL_SLICING; - msm_vfe40_cfg_axi_ub_equal_slicing(vfe_dev); - } else { - vfe_dev->ub_info->policy = MSM_WM_UB_CFG_DEFAULT; - msm_vfe40_cfg_axi_ub_equal_default(vfe_dev); - } -} - static void msm_vfe40_read_wm_ping_pong_addr( struct vfe_device *vfe_dev) { @@ -2280,7 +2196,7 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .clear_wm_reg = msm_vfe40_axi_clear_wm_reg, .cfg_wm_xbar_reg = msm_vfe40_axi_cfg_wm_xbar_reg, .clear_wm_xbar_reg = msm_vfe40_axi_clear_wm_xbar_reg, - .cfg_ub = msm_vfe40_cfg_axi_ub, + .cfg_ub = msm_vfe47_cfg_axi_ub, .read_wm_ping_pong_addr = msm_vfe40_read_wm_ping_pong_addr, .update_ping_pong_addr = @@ -2292,6 +2208,8 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .restart = msm_vfe40_axi_restart, .update_cgc_override = msm_vfe40_axi_update_cgc_override, + .ub_reg_offset = msm_vfe40_ub_reg_offset, + .get_ub_size = msm_vfe40_get_ub_size, }, .core_ops = { .reg_update = msm_vfe40_reg_update, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c index 750b49bc2f5d2..e422d35a2e488 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c @@ -65,6 +65,16 @@ static uint8_t stats_pingpong_offset_map[] = { #define VFE44_CLK_IDX 2 +static uint32_t msm_vfe44_ub_reg_offset(struct vfe_device *vfe_dev, int wm_idx) +{ + return (VFE44_WM_BASE(wm_idx) + 0x10); +} + +static uint32_t msm_vfe44_get_ub_size(struct vfe_device *vfe_dev) +{ + return MSM_ISP44_TOTAL_IMAGE_UB; +} + static void msm_vfe44_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, enum msm_isp_irq_operation oper) @@ -1218,67 +1228,6 @@ static void msm_vfe44_axi_clear_wm_xbar_reg( vfe_dev->vfe_base + VFE44_XBAR_BASE(wm)); } -static void msm_vfe44_cfg_axi_ub_equal_default( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = - &vfe_dev->axi_data; - uint32_t total_image_size = 0; - uint8_t num_used_wms = 0; - uint32_t prop_size = 0; - uint32_t wm_ub_size; - uint64_t delta; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i] > 0) { - num_used_wms++; - total_image_size += axi_data->wm_image_size[i]; - } - } - prop_size = MSM_ISP44_TOTAL_IMAGE_UB - - axi_data->hw_info->min_wm_ub * num_used_wms; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i]) { - delta = (uint64_t)axi_data->wm_image_size[i] * - (uint64_t)prop_size; - do_div(delta, total_image_size); - wm_ub_size = axi_data->hw_info->min_wm_ub + - (uint32_t)delta; - msm_camera_io_w(ub_offset << 16 | (wm_ub_size - 1), - vfe_dev->vfe_base + VFE44_WM_BASE(i) + 0x10); - ub_offset += wm_ub_size; - } else - msm_camera_io_w(0, - vfe_dev->vfe_base + VFE44_WM_BASE(i) + 0x10); - } -} - -static void msm_vfe44_cfg_axi_ub_equal_slicing( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - uint32_t ub_equal_slice = MSM_ISP44_TOTAL_IMAGE_UB / - axi_data->hw_info->num_wm; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - msm_camera_io_w(ub_offset << 16 | (ub_equal_slice - 1), - vfe_dev->vfe_base + VFE44_WM_BASE(i) + 0x10); - ub_offset += ub_equal_slice; - } -} - -static void msm_vfe44_cfg_axi_ub(struct vfe_device *vfe_dev) -{ - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - axi_data->wm_ub_cfg_policy = MSM_WM_UB_CFG_DEFAULT; - if (axi_data->wm_ub_cfg_policy == MSM_WM_UB_EQUAL_SLICING) - msm_vfe44_cfg_axi_ub_equal_slicing(vfe_dev); - else - msm_vfe44_cfg_axi_ub_equal_default(vfe_dev); -} - static void msm_vfe44_read_wm_ping_pong_addr( struct vfe_device *vfe_dev) { @@ -1848,7 +1797,7 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .clear_wm_reg = msm_vfe44_axi_clear_wm_reg, .cfg_wm_xbar_reg = msm_vfe44_axi_cfg_wm_xbar_reg, .clear_wm_xbar_reg = msm_vfe44_axi_clear_wm_xbar_reg, - .cfg_ub = msm_vfe44_cfg_axi_ub, + .cfg_ub = msm_vfe47_cfg_axi_ub, .read_wm_ping_pong_addr = msm_vfe44_read_wm_ping_pong_addr, .update_ping_pong_addr = @@ -1860,6 +1809,8 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .restart = msm_vfe44_axi_restart, .update_cgc_override = msm_vfe44_axi_update_cgc_override, + .ub_reg_offset = msm_vfe44_ub_reg_offset, + .get_ub_size = msm_vfe44_get_ub_size, }, .core_ops = { .reg_update = msm_vfe44_reg_update, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c index cf68ff401d1d7..7217dedd9292c 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c @@ -87,6 +87,18 @@ static uint8_t stats_pingpong_offset_map[] = { #define VFE46_CLK_IDX 2 +uint32_t msm_vfe46_ub_reg_offset(struct vfe_device *vfe_dev, int wm_idx) +{ + return (VFE46_WM_BASE(wm_idx) + 0x10); +} + +uint32_t msm_vfe46_get_ub_size(struct vfe_device *vfe_dev) +{ + if (vfe_dev->pdev->id == ISP_VFE0) + return MSM_ISP46_TOTAL_IMAGE_UB_VFE0; + return MSM_ISP46_TOTAL_IMAGE_UB_VFE1; +} + static void msm_vfe46_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, enum msm_isp_irq_operation oper) @@ -1290,85 +1302,6 @@ static void msm_vfe46_axi_clear_wm_xbar_reg( vfe_dev->vfe_base + VFE46_XBAR_BASE(wm)); } - -static void msm_vfe46_cfg_axi_ub_equal_default( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = - &vfe_dev->axi_data; - uint32_t total_image_size = 0; - uint8_t num_used_wms = 0; - uint32_t prop_size = 0; - uint32_t wm_ub_size; - uint64_t delta; - - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i] > 0) { - num_used_wms++; - total_image_size += axi_data->wm_image_size[i]; - } - } - if (vfe_dev->pdev->id == ISP_VFE0) { - prop_size = MSM_ISP46_TOTAL_IMAGE_UB_VFE0 - - axi_data->hw_info->min_wm_ub * num_used_wms; - } else if (vfe_dev->pdev->id == ISP_VFE1) { - prop_size = MSM_ISP46_TOTAL_IMAGE_UB_VFE1 - - axi_data->hw_info->min_wm_ub * num_used_wms; - } else { - pr_err("%s: incorrect VFE device\n", __func__); - } - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i]) { - delta = (uint64_t)axi_data->wm_image_size[i] * - (uint64_t)prop_size; - do_div(delta, total_image_size); - wm_ub_size = axi_data->hw_info->min_wm_ub + - (uint32_t)delta; - msm_camera_io_w(ub_offset << 16 | (wm_ub_size - 1), - vfe_dev->vfe_base + VFE46_WM_BASE(i) + 0x10); - ub_offset += wm_ub_size; - } else - msm_camera_io_w(0, - vfe_dev->vfe_base + VFE46_WM_BASE(i) + 0x10); - } -} - -static void msm_vfe46_cfg_axi_ub_equal_slicing( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - uint32_t ub_equal_slice = 0; - if (vfe_dev->pdev->id == ISP_VFE0) { - ub_equal_slice = MSM_ISP46_TOTAL_IMAGE_UB_VFE0 / - axi_data->hw_info->num_wm; - } else if (vfe_dev->pdev->id == ISP_VFE1) { - ub_equal_slice = MSM_ISP46_TOTAL_IMAGE_UB_VFE1 / - axi_data->hw_info->num_wm; - } else { - pr_err("%s: incorrect VFE device\n ", __func__); - } - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - msm_camera_io_w(ub_offset << 16 | (ub_equal_slice - 1), - vfe_dev->vfe_base + VFE46_WM_BASE(i) + 0x10); - ub_offset += ub_equal_slice; - } -} - -static void msm_vfe46_cfg_axi_ub(struct vfe_device *vfe_dev) -{ - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - - axi_data->wm_ub_cfg_policy = MSM_WM_UB_CFG_DEFAULT; - if (axi_data->wm_ub_cfg_policy == MSM_WM_UB_EQUAL_SLICING) - msm_vfe46_cfg_axi_ub_equal_slicing(vfe_dev); - else - msm_vfe46_cfg_axi_ub_equal_default(vfe_dev); -} - static void msm_vfe46_read_wm_ping_pong_addr( struct vfe_device *vfe_dev) { @@ -1952,7 +1885,7 @@ struct msm_vfe_hardware_info vfe46_hw_info = { .clear_wm_reg = msm_vfe46_axi_clear_wm_reg, .cfg_wm_xbar_reg = msm_vfe46_axi_cfg_wm_xbar_reg, .clear_wm_xbar_reg = msm_vfe46_axi_clear_wm_xbar_reg, - .cfg_ub = msm_vfe46_cfg_axi_ub, + .cfg_ub = msm_vfe47_cfg_axi_ub, .read_wm_ping_pong_addr = msm_vfe46_read_wm_ping_pong_addr, .update_ping_pong_addr = @@ -1964,6 +1897,8 @@ struct msm_vfe_hardware_info vfe46_hw_info = { .restart = msm_vfe46_axi_restart, .update_cgc_override = msm_vfe46_axi_update_cgc_override, + .ub_reg_offset = msm_vfe46_ub_reg_offset, + .get_ub_size = msm_vfe46_get_ub_size, }, .core_ops = { .reg_update = msm_vfe46_reg_update, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c index e422705b0c25a..2895781747f0b 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c @@ -98,6 +98,7 @@ static uint8_t stats_irq_map_comp_mask[] = { (~(ping_pong >> (stats_pingpong_offset_map[idx])) & 0x1) * 2) #define VFE47_SRC_CLK_DTSI_IDX 5 +#define HANDLE_TO_IDX(handle) (handle & 0xFF) static struct msm_bus_vectors msm_isp_init_vectors[] = { { @@ -151,6 +152,18 @@ static struct msm_bus_scale_pdata msm_isp_bus_client_pdata = { .name = "msm_camera_isp", }; +uint32_t msm_vfe47_ub_reg_offset(struct vfe_device *vfe_dev, int wm_idx) +{ + return (VFE47_WM_BASE(wm_idx) + 0x18); +} + +uint32_t msm_vfe47_get_ub_size(struct vfe_device *vfe_dev) +{ + if (vfe_dev->pdev->id == ISP_VFE0) + return MSM_ISP47_TOTAL_IMAGE_UB_VFE0; + return MSM_ISP47_TOTAL_IMAGE_UB_VFE1; +} + void msm_vfe47_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, enum msm_isp_irq_operation oper) @@ -1660,7 +1673,7 @@ void msm_vfe47_axi_clear_wm_xbar_reg( void msm_vfe47_cfg_axi_ub_equal_default( - struct vfe_device *vfe_dev) + struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src) { int i; uint32_t ub_offset = 0; @@ -1671,35 +1684,71 @@ void msm_vfe47_cfg_axi_ub_equal_default( uint32_t prop_size = 0; uint32_t wm_ub_size; uint64_t delta; - - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i] > 0) { - num_used_wms++; - total_image_size += axi_data->wm_image_size[i]; + uint32_t rdi_ub_offset; + int plane; + struct msm_vfe_axi_stream *stream_info; + + if (frame_src == VFE_PIX_0) { + for (i = 0; i < axi_data->hw_info->num_wm; i++) { + if (axi_data->free_wm[i] && + SRC_TO_INTF( + HANDLE_TO_IDX(axi_data->free_wm[i])) == + VFE_PIX_0) { + num_used_wms++; + total_image_size += + axi_data->wm_image_size[i]; + } } - } - if (vfe_dev->pdev->id == ISP_VFE0) { - prop_size = MSM_ISP47_TOTAL_IMAGE_UB_VFE0 - - axi_data->hw_info->min_wm_ub * num_used_wms; - } else if (vfe_dev->pdev->id == ISP_VFE1) { - prop_size = MSM_ISP47_TOTAL_IMAGE_UB_VFE1 - - axi_data->hw_info->min_wm_ub * num_used_wms; - } else { - pr_err("%s: incorrect VFE device\n", __func__); + ub_offset = (axi_data->hw_info->num_rdi * 2) * + axi_data->hw_info->min_wm_ub; + prop_size = vfe_dev->hw_info->vfe_ops.axi_ops. + get_ub_size(vfe_dev) - + axi_data->hw_info->min_wm_ub * (num_used_wms + + axi_data->hw_info->num_rdi * 2); } for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i]) { + if (!axi_data->free_wm[i]) { + msm_camera_io_w(0, + vfe_dev->vfe_base + + vfe_dev->hw_info->vfe_ops.axi_ops. + ub_reg_offset(vfe_dev, i)); + } + if (frame_src != SRC_TO_INTF( + HANDLE_TO_IDX(axi_data->free_wm[i]))) + continue; + + if (frame_src == VFE_PIX_0) { delta = (uint64_t)axi_data->wm_image_size[i] * - (uint64_t)prop_size; - do_div(delta, total_image_size); - wm_ub_size = axi_data->hw_info->min_wm_ub + + (uint64_t)prop_size; + do_div(delta, total_image_size); + wm_ub_size = axi_data->hw_info->min_wm_ub + (uint32_t)delta; msm_camera_io_w(ub_offset << 16 | (wm_ub_size - 1), - vfe_dev->vfe_base + VFE47_WM_BASE(i) + 0x18); + vfe_dev->vfe_base + + vfe_dev->hw_info->vfe_ops.axi_ops. + ub_reg_offset(vfe_dev, i)); ub_offset += wm_ub_size; - } else - msm_camera_io_w(0, - vfe_dev->vfe_base + VFE47_WM_BASE(i) + 0x18); + } else { + + stream_info = &axi_data->stream_info[ + HANDLE_TO_IDX(axi_data->free_wm[i])]; + for (plane = 0; plane < stream_info->num_planes; + plane++) + if (stream_info->wm[plane] == + axi_data->free_wm[i]) + break; + + rdi_ub_offset = ((SRC_TO_INTF( + HANDLE_TO_IDX(axi_data->free_wm[i])) - + VFE_RAW_0 * 2) + plane) * + axi_data->hw_info->min_wm_ub; + wm_ub_size = axi_data->hw_info->min_wm_ub * 2; + msm_camera_io_w((rdi_ub_offset << 16 | + (wm_ub_size - 1)), + vfe_dev->vfe_base + + vfe_dev->hw_info->vfe_ops.axi_ops. + ub_reg_offset(vfe_dev, i)); + } } } @@ -1710,31 +1759,29 @@ void msm_vfe47_cfg_axi_ub_equal_slicing( uint32_t ub_offset = 0; struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; uint32_t ub_equal_slice = 0; - if (vfe_dev->pdev->id == ISP_VFE0) { - ub_equal_slice = MSM_ISP47_TOTAL_IMAGE_UB_VFE0 / - axi_data->hw_info->num_wm; - } else if (vfe_dev->pdev->id == ISP_VFE1) { - ub_equal_slice = MSM_ISP47_TOTAL_IMAGE_UB_VFE1 / - axi_data->hw_info->num_wm; - } else { - pr_err("%s: incorrect VFE device\n ", __func__); - } + + ub_equal_slice = vfe_dev->hw_info->vfe_ops.axi_ops. + get_ub_size(vfe_dev) / + axi_data->hw_info->num_wm; for (i = 0; i < axi_data->hw_info->num_wm; i++) { msm_camera_io_w(ub_offset << 16 | (ub_equal_slice - 1), - vfe_dev->vfe_base + VFE47_WM_BASE(i) + 0x18); + vfe_dev->vfe_base + + vfe_dev->hw_info->vfe_ops.axi_ops. + ub_reg_offset(vfe_dev, i)); ub_offset += ub_equal_slice; } } -void msm_vfe47_cfg_axi_ub(struct vfe_device *vfe_dev) +void msm_vfe47_cfg_axi_ub(struct vfe_device *vfe_dev, + enum msm_vfe_input_src frame_src) { struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - axi_data->wm_ub_cfg_policy = UB_CFG_POLICY; + axi_data->wm_ub_cfg_policy = MSM_WM_UB_CFG_DEFAULT; if (axi_data->wm_ub_cfg_policy == MSM_WM_UB_EQUAL_SLICING) msm_vfe47_cfg_axi_ub_equal_slicing(vfe_dev); else - msm_vfe47_cfg_axi_ub_equal_default(vfe_dev); + msm_vfe47_cfg_axi_ub_equal_default(vfe_dev, frame_src); } void msm_vfe47_read_wm_ping_pong_addr( @@ -2702,6 +2749,8 @@ struct msm_vfe_hardware_info vfe47_hw_info = { .restart = msm_vfe47_axi_restart, .update_cgc_override = msm_vfe47_axi_update_cgc_override, + .ub_reg_offset = msm_vfe47_ub_reg_offset, + .get_ub_size = msm_vfe47_get_ub_size, }, .core_ops = { .reg_update = msm_vfe47_reg_update, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h index 7accf139bdf30..282808250193c 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h @@ -97,10 +97,11 @@ void msm_vfe47_axi_clear_wm_xbar_reg( struct vfe_device *vfe_dev, struct msm_vfe_axi_stream *stream_info, uint8_t plane_idx); void msm_vfe47_cfg_axi_ub_equal_default( - struct vfe_device *vfe_dev); + struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src); void msm_vfe47_cfg_axi_ub_equal_slicing( struct vfe_device *vfe_dev); -void msm_vfe47_cfg_axi_ub(struct vfe_device *vfe_dev); +void msm_vfe47_cfg_axi_ub(struct vfe_device *vfe_dev, + enum msm_vfe_input_src frame_src); void msm_vfe47_read_wm_ping_pong_addr( struct vfe_device *vfe_dev); void msm_vfe47_update_ping_pong_addr( diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index ab31845e825ed..b392144e86077 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -2160,25 +2160,31 @@ static void msm_isp_update_camif_output_count( stream_info = &axi_data->stream_info[ HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])]; - if (stream_info->stream_src >= RDI_INTF_0) - continue; if (stream_info->stream_src == PIX_ENCODER || stream_info->stream_src == PIX_VIEWFINDER || stream_info->stream_src == PIX_VIDEO || stream_info->stream_src == IDEAL_RAW) { if (stream_cfg_cmd->cmd == START_STREAM) - vfe_dev->axi_data.src_info[VFE_PIX_0]. - pix_stream_count++; + vfe_dev->axi_data.src_info[ + SRC_TO_INTF(stream_info->stream_src)]. + pix_stream_count++; else - vfe_dev->axi_data.src_info[VFE_PIX_0]. - pix_stream_count--; - } else if (stream_info->stream_src == CAMIF_RAW) { + vfe_dev->axi_data.src_info[ + SRC_TO_INTF(stream_info->stream_src)]. + pix_stream_count--; + } else if (stream_info->stream_src == CAMIF_RAW || + stream_info->stream_src == RDI_INTF_0 || + stream_info->stream_src == RDI_INTF_1 || + stream_info->stream_src == RDI_INTF_2) { if (stream_cfg_cmd->cmd == START_STREAM) - vfe_dev->axi_data.src_info[VFE_PIX_0]. - raw_stream_count++; + vfe_dev->axi_data.src_info[ + SRC_TO_INTF(stream_info->stream_src)]. + raw_stream_count++; else - vfe_dev->axi_data.src_info[VFE_PIX_0]. - raw_stream_count--; + vfe_dev->axi_data.src_info[ + SRC_TO_INTF(stream_info->stream_src)]. + raw_stream_count--; + } } } @@ -2826,7 +2832,18 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev, vfe_dev->hw_info->vfe_ops.axi_ops.reload_wm(vfe_dev, vfe_dev->vfe_base, wm_reload_mask); msm_isp_update_camif_output_count(vfe_dev, stream_cfg_cmd); - + for (i = 0; i < VFE_SRC_MAX; i++) { + if ((vfe_dev->axi_data.src_info[i].pix_stream_count || + vfe_dev->axi_data.src_info[i].raw_stream_count) && + !vfe_dev->axi_data.src_info[i].flag) { + /*Configure UB*/ + vfe_dev->hw_info->vfe_ops.axi_ops.cfg_ub(vfe_dev, i); + /*when start reset overflow state*/ + atomic_set(&vfe_dev->error_info.overflow_state, + NO_OVERFLOW); + vfe_dev->axi_data.src_info[i].flag = 1; + } + } if (camif_update == ENABLE_CAMIF) { vfe_dev->hw_info->vfe_ops.core_ops. update_camif_state(vfe_dev, camif_update); @@ -2901,7 +2918,6 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev, clear_wm_irq_mask(vfe_dev, stream_info); stream_info->state = STOP_PENDING; - if (!halt && !ext_read && !(stream_info->stream_type == BURST_STREAM && stream_info->runtime_num_burst_capture == 0)) @@ -3042,14 +3058,6 @@ int msm_isp_cfg_axi_stream(struct vfe_device *vfe_dev, void *arg) pr_err("%s: Invalid stream state\n", __func__); return rc; } - - if (axi_data->num_active_stream == 0) { - /*Configure UB*/ - vfe_dev->hw_info->vfe_ops.axi_ops.cfg_ub(vfe_dev); - /*when start reset overflow state*/ - atomic_set(&vfe_dev->error_info.overflow_state, - NO_OVERFLOW); - } msm_isp_get_camif_update_state_and_halt(vfe_dev, stream_cfg_cmd, &camif_update, &halt); if (camif_update == DISABLE_CAMIF) From 246425db62a0e2172d444e777ecc9839c1c1931d Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Mon, 7 Nov 2016 15:39:43 -0800 Subject: [PATCH 0444/1015] qseecom: fix incomplete error handling for several functions Perform a complete or adequate check of return codes for several functions, including __qseecom_enable_clk, ion_do_cache_op and ion_sg_table(), used by qseecom. Change-Id: Ib1682bdc6d3034a22586af62a3d8986c54d369d5 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 217 ++++++++++++++++++++++++++++++----------- 1 file changed, 162 insertions(+), 55 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 83c951bbf1b35..826c649fe57d2 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -1265,9 +1265,11 @@ static int __qseecom_set_msm_bus_request(uint32_t mode) pr_err("Bandwidth req failed(%d) MODE (%d)\n", ret, mode); if (qclk->ce_core_src_clk != NULL) { - if (mode == INACTIVE) - __qseecom_enable_clk(CLK_QSEE); - else + if (mode == INACTIVE) { + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + pr_err("CLK enable failed\n"); + } else __qseecom_disable_clk(CLK_QSEE); } } @@ -1575,12 +1577,21 @@ static int __qseecom_qseos_fail_return_resp_tz(struct qseecom_dev_handle *data, if (ptr_svc) pr_warn("listener_id:%x, lstnr: %x\n", ptr_svc->svc.listener_id, lstnr); - if (ptr_svc && ptr_svc->ihandle) - msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle, + if (ptr_svc && ptr_svc->ihandle) { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle, ptr_svc->sb_virt, ptr_svc->sb_length, ION_IOC_CLEAN_INV_CACHES); - if (lstnr == RPMB_SERVICE) - __qseecom_enable_clk(CLK_QSEE); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } + } + + if (lstnr == RPMB_SERVICE) { + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; + } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, send_data_rsp, sizeof(send_data_rsp), resp, sizeof(*resp)); if (ret) { @@ -1693,13 +1704,21 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, ptr_svc->send_resp_flag = 0; send_data_rsp.qsee_cmd_id = QSEOS_LISTENER_DATA_RSP_COMMAND; send_data_rsp.listener_id = lstnr; - if (ptr_svc) - msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle, - ptr_svc->sb_virt, ptr_svc->sb_length, - ION_IOC_CLEAN_INV_CACHES); + if (ptr_svc) { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, + ptr_svc->ihandle, ptr_svc->sb_virt, + ptr_svc->sb_length, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } + } - if ((lstnr == RPMB_SERVICE) || (lstnr == SSD_SERVICE)) - __qseecom_enable_clk(CLK_QSEE); + if ((lstnr == RPMB_SERVICE) || (lstnr == SSD_SERVICE)) { + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; + } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, (const void *)&send_data_rsp, @@ -1903,13 +1922,20 @@ static int __qseecom_reentrancy_process_incomplete_cmd( send_data_rsp.qsee_cmd_id = QSEOS_LISTENER_DATA_RSP_COMMAND; send_data_rsp.listener_id = lstnr; - if (ptr_svc) - msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle, - ptr_svc->sb_virt, ptr_svc->sb_length, - ION_IOC_CLEAN_INV_CACHES); - - if (lstnr == RPMB_SERVICE) - __qseecom_enable_clk(CLK_QSEE); + if (ptr_svc) { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, + ptr_svc->ihandle, ptr_svc->sb_virt, + ptr_svc->sb_length, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } + } + if (lstnr == RPMB_SERVICE) { + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; + } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, (const void *)&send_data_rsp, @@ -2197,8 +2223,12 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) cmd_len = sizeof(struct qseecom_load_app_64bit_ireq); } - msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto loadapp_err; + } /* SCM_CALL to load the app and get the app_id back */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, @@ -2676,15 +2706,16 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, } } - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, data->client.sb_length, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto exit; + } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, (const void *)send_req_ptr, req_buf_size, &resp, sizeof(resp)); - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, - data->client.sb_virt, data->client.sb_length, - ION_IOC_INV_CACHES); if (ret) { pr_err("qseecom_scm_call failed with err: %d\n", ret); if (!qseecom.support_bus_scaling) { @@ -2696,7 +2727,13 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, } goto exit; } - + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + data->client.sb_virt, data->client.sb_length, + ION_IOC_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto exit; + } switch (resp.result) { case QSEOS_RESULT_SUCCESS: break; @@ -2929,10 +2966,14 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, else *(uint32_t *)cmd_buf = QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST; - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, reqd_len_sb_in, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } __qseecom_reentrancy_check_if_this_app_blocked(ptr_app); @@ -2963,9 +3004,11 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, } } } - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, data->client.sb_length, ION_IOC_INV_CACHES); + if (ret) + pr_err("cache operation failed %d\n", ret); return ret; } @@ -3076,7 +3119,7 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, } /* Populate the cmd data structure with the phys_addr */ sg_ptr = ion_sg_table(qseecom.ion_clnt, ihandle); - if (sg_ptr == NULL) { + if (IS_ERR_OR_NULL(sg_ptr)) { pr_err("IOn client could not retrieve sg table\n"); goto err; } @@ -3184,13 +3227,21 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, } if (cleanup) { - msm_ion_do_cache_op(qseecom.ion_clnt, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } } else { - msm_ion_do_cache_op(qseecom.ion_clnt, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } if (data->type == QSEECOM_CLIENT_APP) { data->sglistinfo_ptr[i].indexAndFlags = SGLISTINFO_SET_INDEX_FLAG( @@ -3319,7 +3370,7 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, } /* Populate the cmd data structure with the phys_addr */ sg_ptr = ion_sg_table(qseecom.ion_clnt, ihandle); - if (sg_ptr == NULL) { + if (IS_ERR_OR_NULL(sg_ptr)) { pr_err("IOn client could not retrieve sg table\n"); goto err; } @@ -3402,13 +3453,21 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, } cleanup: if (cleanup) { - msm_ion_do_cache_op(qseecom.ion_clnt, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } } else { - msm_ion_do_cache_op(qseecom.ion_clnt, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } if (data->type == QSEECOM_CLIENT_APP) { data->sglistinfo_ptr[i].indexAndFlags = SGLISTINFO_SET_INDEX_FLAG( @@ -3886,9 +3945,13 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname) goto exit_unregister_bus_bw_need; } - msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, img_data, fw_size, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto exit_disable_clk_vote; + } /* SCM_CALL to load the image */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, @@ -4002,9 +4065,13 @@ static int qseecom_load_commonlib_image(struct qseecom_dev_handle *data, goto exit_unregister_bus_bw_need; } - msm_ion_do_cache_op(qseecom.ion_clnt, qseecom.cmnlib_ion_handle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, qseecom.cmnlib_ion_handle, img_data, fw_size, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto exit_disable_clk_vote; + } /* SCM_CALL to load the image */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, @@ -4578,9 +4645,10 @@ static int __qseecom_enable_clk(enum qseecom_ce_hw_instance ce) } mutex_lock(&clk_access_lock); - if (qclk->clk_access_cnt == ULONG_MAX) + if (qclk->clk_access_cnt == ULONG_MAX) { + pr_err("clk_access_cnt beyond limitation\n"); goto err; - + } if (qclk->clk_access_cnt > 0) { qclk->clk_access_cnt++; mutex_unlock(&clk_access_lock); @@ -4893,9 +4961,12 @@ static int qseecom_load_external_elf(struct qseecom_dev_handle *data, ret = -EIO; goto exit_register_bus_bandwidth_needs; } - msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_CLEAN_INV_CACHES); - + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto exit_disable_clock; + } /* SCM_CALL to load the external elf */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, &resp, sizeof(resp)); @@ -5141,7 +5212,9 @@ static int __qseecom_generate_and_save_key(struct qseecom_dev_handle *data, pr_err("Error:: unsupported usage %d\n", usage); return -EFAULT; } - __qseecom_enable_clk(CLK_QSEE); + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, ireq, sizeof(struct qseecom_key_generate_ireq), @@ -5199,7 +5272,9 @@ static int __qseecom_delete_saved_key(struct qseecom_dev_handle *data, pr_err("Error:: unsupported usage %d\n", usage); return -EFAULT; } - __qseecom_enable_clk(CLK_QSEE); + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, ireq, sizeof(struct qseecom_key_delete_ireq), @@ -5258,10 +5333,15 @@ static int __qseecom_set_clear_ce_key(struct qseecom_dev_handle *data, pr_err("Error:: unsupported usage %d\n", usage); return -EFAULT; } + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; - __qseecom_enable_clk(CLK_QSEE); - if (qseecom.qsee.instance != qseecom.ce_drv.instance) - __qseecom_enable_clk(CLK_CE_DRV); + if (qseecom.qsee.instance != qseecom.ce_drv.instance) { + ret = __qseecom_enable_clk(CLK_CE_DRV); + if (ret) + return ret; + } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, ireq, sizeof(struct qseecom_key_select_ireq), @@ -5336,8 +5416,9 @@ static int __qseecom_update_current_key_user_info( pr_err("Error:: unsupported usage %d\n", usage); return -EFAULT; } - - __qseecom_enable_clk(CLK_QSEE); + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, ireq, sizeof(struct qseecom_key_userinfo_update_ireq), @@ -5885,7 +5966,9 @@ static int qseecom_mdtp_cipher_dip(void __user *argp) desc.args[3] = req.out_buf_size; desc.args[4] = req.direction; - __qseecom_enable_clk(CLK_QSEE); + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + break; ret = scm_call2(TZ_MDTP_CIPHER_DIP_ID, &desc); @@ -6072,7 +6155,7 @@ static int __qseecom_update_qteec_req_buf(struct qseecom_qteec_modfd_req *req, } /* Populate the cmd data structure with the phys_addr */ sg_ptr = ion_sg_table(qseecom.ion_clnt, ihandle); - if (sg_ptr == NULL) { + if (IS_ERR_OR_NULL(sg_ptr)) { pr_err("IOn client could not retrieve sg table\n"); goto err; } @@ -6128,13 +6211,21 @@ static int __qseecom_update_qteec_req_buf(struct qseecom_qteec_modfd_req *req, } clean: if (cleanup) { - msm_ion_do_cache_op(qseecom.ion_clnt, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, sg->length, ION_IOC_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } } else { - msm_ion_do_cache_op(qseecom.ion_clnt, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, sg->length, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } data->sglistinfo_ptr[i].indexAndFlags = SGLISTINFO_SET_INDEX_FLAG( (sg_ptr->nents == 1), 0, @@ -6247,10 +6338,14 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, *(uint32_t *)cmd_buf = cmd_id; reqd_len_sb_in = req->req_len + req->resp_len; - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, reqd_len_sb_in, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } __qseecom_reentrancy_check_if_this_app_blocked(ptr_app); @@ -6281,9 +6376,13 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, } } } - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, data->client.sb_length, ION_IOC_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } if ((cmd_id == QSEOS_TEE_OPEN_SESSION) || (cmd_id == QSEOS_TEE_REQUEST_CANCELLATION)) { @@ -6427,10 +6526,14 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data, else *(uint32_t *)cmd_buf = QSEOS_TEE_INVOKE_COMMAND; - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, reqd_len_sb_in, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } __qseecom_reentrancy_check_if_this_app_blocked(ptr_app); @@ -6465,9 +6568,13 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data, if (ret) return ret; - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, data->client.sb_length, ION_IOC_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } return 0; } From 7cdf03ef6d0c8d7249cbd6f632bcd0ee27e8a813 Mon Sep 17 00:00:00 2001 From: Ashwanth Goli Date: Tue, 27 Dec 2016 14:35:32 +0530 Subject: [PATCH 0445/1015] defconfig: Enable config IP_NF_MATCH_RPFILTER Enable config IP_NF_MATCH_RPFILTER. This option allows you to match packets whose replies would go out via the interface the packet came in. Change-Id: I7410391e233799be6bc373db145f412445482d3e Signed-off-by: Ashwanth Goli --- arch/arm/configs/msm8937-perf_defconfig | 2 ++ arch/arm/configs/msm8937_defconfig | 2 ++ arch/arm/configs/msmcortex-perf_defconfig | 2 ++ arch/arm/configs/msmcortex_defconfig | 2 ++ arch/arm64/configs/msm8937-perf_defconfig | 2 ++ arch/arm64/configs/msm8937_defconfig | 2 ++ arch/arm64/configs/msmcortex-perf_defconfig | 2 ++ arch/arm64/configs/msmcortex_defconfig | 2 ++ 8 files changed, 16 insertions(+) diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index 96923292e9917..9e1dbe0710a1f 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -170,6 +170,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -186,6 +187,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index 0ea4559cd56cd..3d4ab6ce710f2 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -171,6 +171,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -187,6 +188,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index 2b42778b55eac..c8084ffbbfe4a 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -164,6 +164,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -180,6 +181,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index 99739dcdefef2..cdd8b9500b290 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -163,6 +163,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -179,6 +180,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index 518f94b24f4a4..50e74326f8812 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -167,6 +167,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -183,6 +184,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 5621b9aa28e8c..4554956052306 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -166,6 +166,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -182,6 +183,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index 8174763b125ec..47afae9fda81e 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -164,6 +164,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -180,6 +181,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index b1f58db2bbc87..d1882cc69c49f 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -163,6 +163,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -179,6 +180,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y From 7d5e232880ed5c83ef0e2938aeadddb73b1fad94 Mon Sep 17 00:00:00 2001 From: Amir Samuelov Date: Tue, 6 Dec 2016 16:42:14 +0200 Subject: [PATCH 0446/1015] spcom: check buf_size validity for user send command Check command buf size before allocating kernel buffer. CRs-Fixed: 1094078 Change-Id: Ib03cd8c79966ff35863c1bde99089cac018ab45c Signed-off-by: Amir Samuelov --- drivers/soc/qcom/spcom.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/soc/qcom/spcom.c b/drivers/soc/qcom/spcom.c index a5e17991f122e..51e16dde0a958 100644 --- a/drivers/soc/qcom/spcom.c +++ b/drivers/soc/qcom/spcom.c @@ -1310,6 +1310,16 @@ static int spcom_handle_send_command(struct spcom_channel *ch, pr_debug("send req/resp ch [%s] size [%d] .\n", ch->name, size); + /* + * check that cmd buf size is at least struct size, + * to allow access to struct fields. + */ + if (size < sizeof(*cmd)) { + pr_err("ch [%s] invalid cmd buf.\n", + ch->name); + return -EINVAL; + } + /* Check if remote side connect */ if (!spcom_is_channel_connected(ch)) { pr_err("ch [%s] remote side not connect.\n", ch->name); @@ -1321,6 +1331,18 @@ static int spcom_handle_send_command(struct spcom_channel *ch, buf_size = cmd->buf_size; timeout_msec = cmd->timeout_msec; + /* Check param validity */ + if (buf_size > SPCOM_MAX_RESPONSE_SIZE) { + pr_err("ch [%s] invalid buf size [%d].\n", + ch->name, buf_size); + return -EINVAL; + } + if (size != sizeof(*cmd) + buf_size) { + pr_err("ch [%s] invalid cmd size [%d].\n", + ch->name, size); + return -EINVAL; + } + /* Allocate Buffers*/ tx_buf_size = sizeof(*hdr) + buf_size; tx_buf = kzalloc(tx_buf_size, GFP_KERNEL); From 2960f8e8b13eae0d4e8808ed3c30e29a4e7b69d7 Mon Sep 17 00:00:00 2001 From: Amir Samuelov Date: Sat, 26 Nov 2016 18:44:06 +0200 Subject: [PATCH 0447/1015] spcom: check size before calling copy_to_user() Calling copy_to_user(to, from, size) with negative value might cause heap overflow since size is unsigned parameter and negative value is cast to big unsigned value. CRs-Fixed: 1092683 Change-Id: I9b4a0710aa33942de2976f7ee158a8025dd6a20e Signed-off-by: Amir Samuelov --- drivers/soc/qcom/spcom.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/soc/qcom/spcom.c b/drivers/soc/qcom/spcom.c index a5e17991f122e..7c164cf89c109 100644 --- a/drivers/soc/qcom/spcom.c +++ b/drivers/soc/qcom/spcom.c @@ -2018,6 +2018,11 @@ static ssize_t spcom_device_read(struct file *filp, char __user *user_buff, return -ENOMEM; actual_size = spcom_handle_read(ch, buf, size); + if ((actual_size <= 0) || (actual_size > size)) { + pr_err("invalid actual_size [%d].\n", actual_size); + kfree(buf); + return -EFAULT; + } ret = copy_to_user(user_buff, buf, actual_size); From 640c66479d5ed2de305ea0cb79cb2d0972ef30bd Mon Sep 17 00:00:00 2001 From: Amir Samuelov Date: Tue, 6 Dec 2016 18:18:16 +0200 Subject: [PATCH 0448/1015] spcom: check buf size for send modified command Check buffer size validity before allocating kernel buffer. CRs-Fixed: 1094140 Change-Id: I8c280b60f316d7bae87644104d18aa7df4af9efe Signed-off-by: Amir Samuelov --- drivers/soc/qcom/spcom.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/drivers/soc/qcom/spcom.c b/drivers/soc/qcom/spcom.c index a5e17991f122e..ed524c307fde6 100644 --- a/drivers/soc/qcom/spcom.c +++ b/drivers/soc/qcom/spcom.c @@ -1383,6 +1383,11 @@ static int modify_ion_addr(void *buf, return -ENODEV; } + if (buf_size < sizeof(uint64_t)) { + pr_err("buf size too small [%d].\n", buf_size); + return -ENODEV; + } + if (buf_offset > buf_size - sizeof(uint64_t)) { pr_err("invalid buf_offset [%d].\n", buf_offset); return -ENODEV; @@ -1444,6 +1449,16 @@ static int spcom_handle_send_modified_command(struct spcom_channel *ch, pr_debug("send req/resp ch [%s] size [%d] .\n", ch->name, size); + /* + * check that cmd buf size is at least struct size, + * to allow access to struct fields. + */ + if (size < sizeof(*cmd)) { + pr_err("ch [%s] invalid cmd buf.\n", + ch->name); + return -EINVAL; + } + /* Check if remote side connect */ if (!spcom_is_channel_connected(ch)) { pr_err("ch [%s] remote side not connect.\n", ch->name); @@ -1456,6 +1471,18 @@ static int spcom_handle_send_modified_command(struct spcom_channel *ch, timeout_msec = cmd->timeout_msec; memcpy(ion_info, cmd->ion_info, sizeof(ion_info)); + /* Check param validity */ + if (buf_size > SPCOM_MAX_RESPONSE_SIZE) { + pr_err("ch [%s] invalid buf size [%d].\n", + ch->name, buf_size); + return -EINVAL; + } + if (size != sizeof(*cmd) + buf_size) { + pr_err("ch [%s] invalid cmd size [%d].\n", + ch->name, size); + return -EINVAL; + } + /* Allocate Buffers*/ tx_buf_size = sizeof(*hdr) + buf_size; tx_buf = kzalloc(tx_buf_size, GFP_KERNEL); @@ -1716,6 +1743,13 @@ static int spcom_handle_read_req_resp(struct spcom_channel *ch, return -ENOTCONN; } + /* Check param validity */ + if (size > SPCOM_MAX_RESPONSE_SIZE) { + pr_err("ch [%s] inavlid size [%d].\n", + ch->name, size); + return -EINVAL; + } + /* Allocate Buffers*/ rx_buf_size = sizeof(*hdr) + size; rx_buf = kzalloc(rx_buf_size, GFP_KERNEL); From b4bbe731301d78767405dada1474feaa5630fe31 Mon Sep 17 00:00:00 2001 From: Amir Samuelov Date: Sat, 24 Dec 2016 10:38:55 +0200 Subject: [PATCH 0449/1015] spcom: check user space command size The user space spcomlib provides command buffer for various commands. Verify that the command buffer size matches the expected command struct size. CRs-Fixed: 1094143 Change-Id: If3ead54bd03368fa9338921e299b2ad8fb078297 Signed-off-by: Amir Samuelov --- drivers/soc/qcom/spcom.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/soc/qcom/spcom.c b/drivers/soc/qcom/spcom.c index a5e17991f122e..f157f5ca5a271 100644 --- a/drivers/soc/qcom/spcom.c +++ b/drivers/soc/qcom/spcom.c @@ -1514,6 +1514,12 @@ static int spcom_handle_lock_ion_buf_command(struct spcom_channel *ch, struct ion_handle *ion_handle; int i; + if (size != sizeof(*cmd)) { + pr_err("cmd size [%d] , expected [%d].\n", + (int) size, (int) sizeof(*cmd)); + return -EINVAL; + } + /* Check ION client */ if (spcom_dev->ion_client == NULL) { pr_err("invalid ion client.\n"); @@ -1561,6 +1567,12 @@ static int spcom_handle_unlock_ion_buf_command(struct spcom_channel *ch, struct ion_client *ion_client = spcom_dev->ion_client; int i; + if (size != sizeof(*cmd)) { + pr_err("cmd size [%d] , expected [%d].\n", + (int) size, (int) sizeof(*cmd)); + return -EINVAL; + } + /* Check ION client */ if (ion_client == NULL) { pr_err("fail to create ion client.\n"); From 10a4f9cb7189bba5cb9c166dc4899d10d8d2d1b4 Mon Sep 17 00:00:00 2001 From: Vinayak Menon Date: Tue, 8 Nov 2016 11:49:15 +0530 Subject: [PATCH 0450/1015] arm64: avoid segfault on el0 cache maintenance It is found that "dc civac" from el0 on a non-COW RO VA results in a segmentation fault, while as per ARM ARM, for el0 only read access permission is needed on a VA to perform clean and invalidate. This bug was introduced by commit 3fbe6bc28a6b ("arm64: Allow cache maintenance operations to trigger write faults"), which enabled write faults on all cache maintenance faults. The original intention of the above commit was to trigger write faults only for cache maintenance operations performed by EL1 on user VA. But it introduced this side effect of generating a write fault on EL0 cache maintenance ops also when a read permission is sufficient for operation to succeed. This results in a segmentation fault when the VA is part of region marked as PROT_READ. So trigger write faults only when the cache maintenance fault is generated in non-user mode. Still, there can be a case where kernel performs a cache maintenance op on a PROT_READ mapped VA which will result in a kernel fault. But that looks invalid since there is no need for a kernel driver to perform a cache maintenance on a RO buffer and such cases if they exist need to be fixed. Change-Id: I001ca0473c37fcf713201386b5ed6a6244f6b37d Signed-off-by: Vinayak Menon --- arch/arm64/mm/fault.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index bc3556c118a2d..0820cd98fbba4 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -226,7 +226,8 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, if (esr & ESR_LNX_EXEC) { vm_flags = VM_EXEC; - } else if (esr & ESR_EL1_WRITE) { + } else if (((esr & ESR_EL1_WRITE) && !(esr & ESR_EL1_CM)) || + ((esr & ESR_EL1_CM) && !(mm_flags & FAULT_FLAG_USER))) { vm_flags = VM_WRITE; mm_flags |= FAULT_FLAG_WRITE; } From fd816e421541d4961a1448aaf689cdf6a53e80b1 Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Tue, 30 Aug 2016 14:54:41 +0530 Subject: [PATCH 0451/1015] msm: mdss: clear previous DSI_VIDEO_DONE interrupt For DSI DMA command transfer in video mode panels, we need to wait for DSI video done interrupt to make sure that the commands are queued at the beginning of next active region. Make sure that the previous DSI_VIDEO_DONE is cleared before waiting for the next VIDEO_DONE interrupt. Otherwise, the h/w triggers a false interrupt for the previous DSI_VIDEO_DONE interrupt immediately after the DSI_VIDEO_DONE_MASK is enabled. Change-Id: Ie024e44dff89caf51164490a59b6613d5e4e01ea Signed-off-by: Padmanabhan Komanduru --- drivers/video/msm/mdss/mdss_dsi_host.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index 49a80d045471c..a03aa349cbc1e 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -2320,7 +2320,8 @@ void mdss_dsi_wait4video_done(struct mdss_dsi_ctrl_pdata *ctrl) /* DSI_INTL_CTRL */ data = MIPI_INP((ctrl->ctrl_base) + 0x0110); - data &= DSI_INTR_TOTAL_MASK; + /* clear previous VIDEO_DONE interrupt as well */ + data &= (DSI_INTR_TOTAL_MASK | DSI_INTR_VIDEO_DONE); data |= DSI_INTR_VIDEO_DONE_MASK; MIPI_OUTP((ctrl->ctrl_base) + 0x0110, data); From 08da8941a5d45c1fb23f63a568c984d2f947d5a2 Mon Sep 17 00:00:00 2001 From: Rajesh Yadav Date: Fri, 18 Nov 2016 12:35:19 +0530 Subject: [PATCH 0452/1015] msm: mdss: Add Rec2020 YUV conversion to CSC tables Rec2020 CSC type will be set by hwcomposer when incoming YUV data is of the same type. CRs-Fixed: 1081779 Change-Id: I321bd79d04e135030764dcdf83a58fee3c4e72c8 Signed-off-by: Benet Clark Signed-off-by: Rajesh Yadav --- drivers/video/msm/mdss/mdss_mdp.h | 8 +++ drivers/video/msm/mdss/mdss_mdp_pp.c | 96 ++++++++++++++++++++++++++++ include/uapi/linux/msm_mdp.h | 9 +++ 3 files changed, 113 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_mdp.h b/drivers/video/msm/mdss/mdss_mdp.h index 9dd4eaeb33388..7595978506f9d 100644 --- a/drivers/video/msm/mdss/mdss_mdp.h +++ b/drivers/video/msm/mdss/mdss_mdp.h @@ -195,9 +195,13 @@ enum mdss_mdp_csc_type { MDSS_MDP_CSC_YUV2RGB_601L, MDSS_MDP_CSC_YUV2RGB_601FR, MDSS_MDP_CSC_YUV2RGB_709L, + MDSS_MDP_CSC_YUV2RGB_2020L, + MDSS_MDP_CSC_YUV2RGB_2020FR, MDSS_MDP_CSC_RGB2YUV_601L, MDSS_MDP_CSC_RGB2YUV_601FR, MDSS_MDP_CSC_RGB2YUV_709L, + MDSS_MDP_CSC_RGB2YUV_2020L, + MDSS_MDP_CSC_RGB2YUV_2020FR, MDSS_MDP_CSC_YUV2YUV, MDSS_MDP_CSC_RGB2RGB, MDSS_MDP_MAX_CSC @@ -1273,6 +1277,10 @@ static inline uint8_t pp_vig_csc_pipe_val(struct mdss_mdp_pipe *pipe) return MDSS_MDP_CSC_YUV2RGB_601L; case MDP_CSC_ITU_R_601_FR: return MDSS_MDP_CSC_YUV2RGB_601FR; + case MDP_CSC_ITU_R_2020: + return MDSS_MDP_CSC_YUV2RGB_2020L; + case MDP_CSC_ITU_R_2020_FR: + return MDSS_MDP_CSC_YUV2RGB_2020FR; case MDP_CSC_ITU_R_709: default: return MDSS_MDP_CSC_YUV2RGB_709L; diff --git a/drivers/video/msm/mdss/mdss_mdp_pp.c b/drivers/video/msm/mdss/mdss_mdp_pp.c index 95581ec66ec81..9dbbcbfff3ffb 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp.c @@ -60,6 +60,30 @@ struct mdp_csc_cfg mdp_csc_8bit_convert[MDSS_MDP_MAX_CSC] = { { 0x10, 0xeb, 0x10, 0xf0, 0x10, 0xf0,}, { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, }, + [MDSS_MDP_CSC_YUV2RGB_2020L] = { + 0, + { + 0x0256, 0x0000, 0x035e, + 0x0256, 0xffa0, 0xfeb2, + 0x0256, 0x044c, 0x0000, + }, + { 0xfff0, 0xff80, 0xff80,}, + { 0x0, 0x0, 0x0,}, + { 0x10, 0xeb, 0x10, 0xf0, 0x10, 0xf0,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + }, + [MDSS_MDP_CSC_YUV2RGB_2020FR] = { + 0, + { + 0x0200, 0x0000, 0x02f3, + 0x0200, 0xffac, 0xfedb, + 0x0200, 0x03c3, 0x0000, + }, + { 0x0000, 0xff80, 0xff80,}, + { 0x0, 0x0, 0x0,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + }, [MDSS_MDP_CSC_RGB2YUV_601L] = { 0, { @@ -96,6 +120,30 @@ struct mdp_csc_cfg mdp_csc_8bit_convert[MDSS_MDP_MAX_CSC] = { { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, { 0x0010, 0x00eb, 0x0010, 0x00f0, 0x0010, 0x00f0,}, }, + [MDSS_MDP_CSC_RGB2YUV_2020L] = { + 0, + { + 0x0073, 0x0129, 0x001a, + 0xffc1, 0xff5e, 0x00e0, + 0x00e0, 0xff32, 0xffee + }, + { 0x0, 0x0, 0x0,}, + { 0x0010, 0x0080, 0x0080,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + { 0x0010, 0x00eb, 0x0010, 0x00f0, 0x0010, 0x00f0,}, + }, + [MDSS_MDP_CSC_RGB2YUV_2020FR] = { + 0, + { + 0x0086, 0x015b, 0x001e, + 0xffb9, 0xff47, 0x0100, + 0x0100, 0xff15, 0xffeb + }, + { 0x0, 0x0, 0x0,}, + { 0x0, 0x0080, 0x0080,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + }, [MDSS_MDP_CSC_YUV2YUV] = { 0, { @@ -159,6 +207,30 @@ struct mdp_csc_cfg mdp_csc_10bit_convert[MDSS_MDP_MAX_CSC] = { { 0x40, 0x3ac, 0x40, 0x3c0, 0x40, 0x3c0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, + [MDSS_MDP_CSC_YUV2RGB_2020L] = { + 0, + { + 0x0256, 0x0000, 0x035e, + 0x0256, 0xffa0, 0xfeb2, + 0x0256, 0x044c, 0x0000, + }, + { 0xffc0, 0xfe00, 0xfe00,}, + { 0x0, 0x0, 0x0,}, + { 0x40, 0x3ac, 0x40, 0x3c0, 0x40, 0x3c0,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + }, + [MDSS_MDP_CSC_YUV2RGB_2020FR] = { + 0, + { + 0x0200, 0x0000, 0x02f3, + 0x0200, 0xffac, 0xfedb, + 0x0200, 0x03c3, 0x0000, + }, + { 0x0000, 0xfe00, 0xfe00,}, + { 0x0, 0x0, 0x0,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + }, [MDSS_MDP_CSC_RGB2YUV_601L] = { 0, { @@ -195,6 +267,30 @@ struct mdp_csc_cfg mdp_csc_10bit_convert[MDSS_MDP_MAX_CSC] = { { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0040, 0x03ac, 0x0040, 0x03c0, 0x0040, 0x03c0,}, }, + [MDSS_MDP_CSC_RGB2YUV_2020L] = { + 0, + { + 0x0073, 0x0129, 0x001a, + 0xffc1, 0xff5e, 0x00e0, + 0x00e0, 0xff32, 0xffee + }, + { 0x0, 0x0, 0x0,}, + { 0x0040, 0x0200, 0x0200,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + { 0x0040, 0x03ac, 0x0040, 0x03c0, 0x0040, 0x03c0,}, + }, + [MDSS_MDP_CSC_RGB2YUV_2020FR] = { + 0, + { + 0x0086, 0x015b, 0x001e, + 0xffb9, 0xff47, 0x0100, + 0x0100, 0xff15, 0xffeb + }, + { 0x0, 0x0, 0x0,}, + { 0x0, 0x0200, 0x0200,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + }, [MDSS_MDP_CSC_YUV2YUV] = { 0, { diff --git a/include/uapi/linux/msm_mdp.h b/include/uapi/linux/msm_mdp.h index 62efc33a2e048..1fc1e39fd9704 100644 --- a/include/uapi/linux/msm_mdp.h +++ b/include/uapi/linux/msm_mdp.h @@ -1368,12 +1368,21 @@ enum { MDP_WRITEBACK_MIRROR_RESUME, }; +/* + * The enum values are continued below as preprocessor macro definitions + */ enum mdp_color_space { MDP_CSC_ITU_R_601, MDP_CSC_ITU_R_601_FR, MDP_CSC_ITU_R_709, }; +/* + * These definitions are a continuation of the mdp_color_space enum above + */ +#define MDP_CSC_ITU_R_2020 (MDP_CSC_ITU_R_709 + 1) +#define MDP_CSC_ITU_R_2020_FR (MDP_CSC_ITU_R_2020 + 1) + enum { mdp_igc_v1_7 = 1, mdp_igc_vmax, From 8e9256a36285a49c6a3a3e53b74d31ddc2e02f92 Mon Sep 17 00:00:00 2001 From: Rajesh Yadav Date: Fri, 18 Nov 2016 20:18:41 +0530 Subject: [PATCH 0453/1015] msm: mdss: Optimize Gamut Mapping programming sequence Gamut mapping feature has a huge size 3D LUT table, which consumes a lot of time to program LUT. This patch optimizes the programming of the 3D LUT to reduce about half of the register writes. CRs-Fixed: 1095227 Change-Id: I4a9fcee6c1cd70d9c04426c394e480c11a6f4648 Signed-off-by: Ping Li Signed-off-by: Rajesh Yadav --- drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c b/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c index 1e4adc9848022..5921d286dc77b 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c @@ -833,6 +833,8 @@ static int pp_gamut_set_config(char __iomem *base_addr, struct mdp_gamut_cfg_data *gamut_cfg_data = NULL; struct mdp_gamut_data_v1_7 *gamut_data = NULL; char __iomem *base_addr_scale = base_addr; + uint64_t gamut_val; + if (!base_addr || !cfg_data || !pp_sts) { pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); @@ -900,12 +902,18 @@ static int pp_gamut_set_config(char __iomem *base_addr, val = index_start; val |= GAMUT_TABLE_SELECT(i); writel_relaxed(val, (base_addr + GAMUT_TABLE_INDEX)); - for (j = 0; j < gamut_data->tbl_size[i]; j++) { - writel_relaxed(gamut_data->c1_c2_data[i][j], - base_addr + GAMUT_TABLE_LOWER_GB); - writel_relaxed(gamut_data->c0_data[i][j], - base_addr + GAMUT_TABLE_UPPER_R); + + writel_relaxed(gamut_data->c1_c2_data[i][0], + base_addr + GAMUT_TABLE_LOWER_GB); + for (j = 0; j < gamut_data->tbl_size[i] - 1; j++) { + gamut_val = gamut_data->c1_c2_data[i][j + 1]; + gamut_val = (gamut_val << 32) | + gamut_data->c0_data[i][j]; + writeq_relaxed(gamut_val, + base_addr + GAMUT_TABLE_UPPER_R); } + writel_relaxed(gamut_data->c0_data[i][j], + base_addr + GAMUT_TABLE_UPPER_R); if ((i >= MDP_GAMUT_SCALE_OFF_TABLE_NUM) || (!gamut_data->map_en)) continue; From 9e575799008d2cb12fcc3aed18d2efcc04eb9106 Mon Sep 17 00:00:00 2001 From: Rajesh Yadav Date: Mon, 5 Dec 2016 19:30:43 +0530 Subject: [PATCH 0454/1015] msm: mdss: dsi: Add chromaticity values for HDR support Add WRGB chromaticity values, peak brightness and blackness level to panel information. This change also adds method to parse afore mentioned parameters from device tree and exposes these properties on sysfs node to read. CRs-Fixed: 1095347 Change-Id: I039732d8c2a5fa98233647928283df8d9d3f3123 Signed-off-by: Rajesh Yadav Signed-off-by: Shashank Babu Chinta Venkata --- .../devicetree/bindings/fb/mdss-dsi-panel.txt | 22 ++++++++ drivers/video/msm/mdss/mdss_dsi_panel.c | 55 +++++++++++++++++++ drivers/video/msm/mdss/mdss_fb.c | 21 ++++++- drivers/video/msm/mdss/mdss_panel.h | 19 +++++++ 4 files changed, 115 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt b/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt index 924ebeacecfbf..27785e73bd013 100644 --- a/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt +++ b/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt @@ -326,6 +326,28 @@ Optional properties: 2A/2B command. - qcom,dcs-cmd-by-left: Boolean to indicate that dcs command are sent through the left DSI controller only in a dual-dsi configuration +- qcom,mdss-dsi-panel-hdr-enabled: Boolean to indicate HDR support in panel. +- qcom,mdss-dsi-panel-hdr-color-primaries: + Array of 8 unsigned integers denoting chromaticity of panel.These + values are specified in nits units. The value range is 0 through 50000. + To obtain real chromacity, these values should be divided by factor of + 50000. The structure of array is defined in below order + value 1: x value of white chromaticity of display panel + value 2: y value of white chromaticity of display panel + value 3: x value of red chromaticity of display panel + value 4: y value of red chromaticity of display panel + value 5: x value of green chromaticity of display panel + value 6: y value of green chromaticity of display panel + value 7: x value of blue chromaticity of display panel + value 8: y value of blue chromaticity of display panel +- qcom,mdss-dsi-panel-peak-brightness: Maximum brightness supported by panel.In absence of maximum value + typical value becomes peak brightness. Value is specified in nits units. + To obtail real peak brightness, this value should be divided by factor of + 10000. +- qcom,mdss-dsi-panel-blackness-level: Blackness level supported by panel. Blackness level is defined as + ratio of peak brightness to contrast. Value is specified in nits units. + To obtail real blackness level, this value should be divided by factor of + 10000. - qcom,mdss-dsi-lp11-init: Boolean used to enable the DSI clocks and data lanes (low power 11) before issuing hardware reset line. - qcom,mdss-dsi-init-delay-us: Delay in microseconds(us) before performing any DSI activity in lp11 diff --git a/drivers/video/msm/mdss/mdss_dsi_panel.c b/drivers/video/msm/mdss/mdss_dsi_panel.c index 3fb879378bc86..c694db751a2a4 100644 --- a/drivers/video/msm/mdss/mdss_dsi_panel.c +++ b/drivers/video/msm/mdss/mdss_dsi_panel.c @@ -1115,6 +1115,58 @@ void mdss_dsi_panel_dsc_pps_send(struct mdss_dsi_ctrl_pdata *ctrl, mdss_dsi_panel_cmds_send(ctrl, &pcmds, CMD_REQ_COMMIT); } +static int mdss_dsi_parse_hdr_settings(struct device_node *np, + struct mdss_panel_info *pinfo) +{ + int rc = 0; + struct mdss_panel_hdr_properties *hdr_prop; + + if (!np) { + pr_err("%s: device node pointer is NULL\n", __func__); + return -EINVAL; + } + + if (!pinfo) { + pr_err("%s: panel info is NULL\n", __func__); + return -EINVAL; + } + + hdr_prop = &pinfo->hdr_properties; + hdr_prop->hdr_enabled = of_property_read_bool(np, + "qcom,mdss-dsi-panel-hdr-enabled"); + + if (hdr_prop->hdr_enabled) { + rc = of_property_read_u32_array(np, + "qcom,mdss-dsi-panel-hdr-color-primaries", + hdr_prop->display_primaries, + DISPLAY_PRIMARIES_COUNT); + if (rc) { + pr_info("%s:%d, Unable to read color primaries,rc:%u", + __func__, __LINE__, + hdr_prop->hdr_enabled = false); + } + + rc = of_property_read_u32(np, + "qcom,mdss-dsi-panel-peak-brightness", + &(hdr_prop->peak_brightness)); + if (rc) { + pr_info("%s:%d, Unable to read hdr brightness, rc:%u", + __func__, __LINE__, rc); + hdr_prop->hdr_enabled = false; + } + + rc = of_property_read_u32(np, + "qcom,mdss-dsi-panel-blackness-level", + &(hdr_prop->blackness_level)); + if (rc) { + pr_info("%s:%d, Unable to read hdr brightness, rc:%u", + __func__, __LINE__, rc); + hdr_prop->hdr_enabled = false; + } + } + return 0; +} + static int mdss_dsi_parse_dsc_version(struct device_node *np, struct mdss_panel_timing *timing) { @@ -2460,6 +2512,9 @@ static int mdss_panel_parse_dt(struct device_node *np, "qcom,mdss-dsi-lane-3-state"); rc = mdss_panel_parse_display_timings(np, &ctrl_pdata->panel_data); + if (rc) + return rc; + rc = mdss_dsi_parse_hdr_settings(np, pinfo); if (rc) return rc; diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index 9778bb9f3d444..b0e1ea9c54f2f 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -550,7 +550,13 @@ static ssize_t mdss_fb_get_panel_info(struct device *dev, "min_w=%d\nmin_h=%d\nroi_merge=%d\ndyn_fps_en=%d\n" "min_fps=%d\nmax_fps=%d\npanel_name=%s\n" "primary_panel=%d\nis_pluggable=%d\ndisplay_id=%s\n" - "is_cec_supported=%d\nis_pingpong_split=%d\n", + "is_cec_supported=%d\nis_pingpong_split=%d\n" + "is_hdr_enabled=%d\n" + "peak_brightness=%d\nblackness_level=%d\n" + "white_chromaticity_x=%d\nwhite_chromaticity_y=%d\n" + "red_chromaticity_x=%d\nred_chromaticity_y=%d\n" + "green_chromaticity_x=%d\ngreen_chromaticity_y=%d\n" + "blue_chromaticity_x=%d\nblue_chromaticity_y=%d\n", pinfo->partial_update_enabled, pinfo->roi_alignment.xstart_pix_align, pinfo->roi_alignment.width_pix_align, @@ -562,7 +568,18 @@ static ssize_t mdss_fb_get_panel_info(struct device *dev, pinfo->dynamic_fps, pinfo->min_fps, pinfo->max_fps, pinfo->panel_name, pinfo->is_prim_panel, pinfo->is_pluggable, pinfo->display_id, - pinfo->is_cec_supported, is_pingpong_split(mfd)); + pinfo->is_cec_supported, is_pingpong_split(mfd), + pinfo->hdr_properties.hdr_enabled, + pinfo->hdr_properties.peak_brightness, + pinfo->hdr_properties.blackness_level, + pinfo->hdr_properties.display_primaries[0], + pinfo->hdr_properties.display_primaries[1], + pinfo->hdr_properties.display_primaries[2], + pinfo->hdr_properties.display_primaries[3], + pinfo->hdr_properties.display_primaries[4], + pinfo->hdr_properties.display_primaries[5], + pinfo->hdr_properties.display_primaries[6], + pinfo->hdr_properties.display_primaries[7]); return ret; } diff --git a/drivers/video/msm/mdss/mdss_panel.h b/drivers/video/msm/mdss/mdss_panel.h index 81d72ac5abf5e..38b0fc222227e 100644 --- a/drivers/video/msm/mdss/mdss_panel.h +++ b/drivers/video/msm/mdss/mdss_panel.h @@ -55,6 +55,9 @@ struct panel_id { #define DSC_PPS_LEN 128 +/* HDR propeties count */ +#define DISPLAY_PRIMARIES_COUNT 8 /* WRGB x and y values*/ + static inline const char *mdss_panel2str(u32 panel) { static const char const *names[] = { @@ -582,6 +585,19 @@ struct mdss_panel_roi_alignment { u32 min_height; }; +struct mdss_panel_hdr_properties { + bool hdr_enabled; + + /* WRGB X and y values arrayed in format */ + /* [WX, WY, RX, RY, GX, GY, BX, BY] */ + u32 display_primaries[DISPLAY_PRIMARIES_COUNT]; + + /* peak brightness supported by panel */ + u32 peak_brightness; + /* Blackness level supported by panel */ + u32 blackness_level; +}; + struct mdss_panel_info { u32 xres; u32 yres; @@ -715,6 +731,9 @@ struct mdss_panel_info { /* debugfs structure for the panel */ struct mdss_panel_debugfs_info *debugfs_info; + + /* HDR properties of display panel*/ + struct mdss_panel_hdr_properties hdr_properties; }; struct mdss_panel_timing { From def3a76c921b427e9e48eefee5593713aefd7369 Mon Sep 17 00:00:00 2001 From: Rajesh Yadav Date: Mon, 5 Dec 2016 19:23:42 +0530 Subject: [PATCH 0455/1015] ARM: dts: msm: Add HDR support for sharp panel Add chromaticity, peak brightness and blackness level information for panel. These values are needed for HDR support. CRs-Fixed: 1095347 Change-Id: Ic3c10b6f8c80f68fec953fd4f0b4616eac7edee3 Signed-off-by: Rajesh Yadav Signed-off-by: Shashank Babu Chinta Venkata --- .../dts/qcom/dsi-panel-sharp-dualmipi-wqxga-video.dtsi | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/qcom/dsi-panel-sharp-dualmipi-wqxga-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-sharp-dualmipi-wqxga-video.dtsi index 2a5b8a2487305..8e0c1ba2f1b39 100644 --- a/arch/arm/boot/dts/qcom/dsi-panel-sharp-dualmipi-wqxga-video.dtsi +++ b/arch/arm/boot/dts/qcom/dsi-panel-sharp-dualmipi-wqxga-video.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -64,7 +64,11 @@ qcom,mdss-dsi-panel-status-check-mode = "bta_check"; qcom,mdss-dsi-tx-eot-append; qcom,esd-check-enabled; - + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <14880 15935 32435 + 16555 14945 30910 7790 3415>; + qcom,mdss-dsi-panel-peak-brightness = <5643000>; + qcom,mdss-dsi-panel-blackness-level = <6134>; qcom,config-select = <&dsi_dual_sharp_video_config0>; dsi_dual_sharp_video_config0: config0 { From 6bdf36b2f6b84603d77ec5b64002dbd665542b2e Mon Sep 17 00:00:00 2001 From: Rajesh Yadav Date: Wed, 7 Dec 2016 15:03:24 +0530 Subject: [PATCH 0456/1015] msm: mdss: Advertize hdr support on msm8996 This change advertizes hdr feature support to user space driver on msm8996. CRs-Fixed: 1100253 Change-Id: I6b81f64d14e472b563e2ee3ea86198be82c58920 Signed-off-by: Rajesh Yadav Signed-off-by: Abhijit Kulkarni --- drivers/video/msm/mdss/mdss.h | 1 + drivers/video/msm/mdss/mdss_mdp.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/drivers/video/msm/mdss/mdss.h b/drivers/video/msm/mdss/mdss.h index 9bd7e29a8aba0..705c18eaf31f7 100644 --- a/drivers/video/msm/mdss/mdss.h +++ b/drivers/video/msm/mdss/mdss.h @@ -161,6 +161,7 @@ enum mdss_hw_quirk { MDSS_QUIRK_FMT_PACK_PATTERN, MDSS_QUIRK_NEED_SECURE_MAP, MDSS_QUIRK_SRC_SPLIT_ALWAYS, + MDSS_QUIRK_HDR_SUPPORT_ENABLED, MDSS_QUIRK_MAX, }; diff --git a/drivers/video/msm/mdss/mdss_mdp.c b/drivers/video/msm/mdss/mdss_mdp.c index b57ca77f4deb6..c85ec6f6c96e2 100644 --- a/drivers/video/msm/mdss/mdss_mdp.c +++ b/drivers/video/msm/mdss/mdss_mdp.c @@ -1796,6 +1796,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdss_mdp_init_default_prefill_factors(mdata); mdss_set_quirk(mdata, MDSS_QUIRK_DSC_RIGHT_ONLY_PU); mdss_set_quirk(mdata, MDSS_QUIRK_DSC_2SLICE_PU_THRPUT); + mdss_set_quirk(mdata, MDSS_QUIRK_HDR_SUPPORT_ENABLED); break; case MDSS_MDP_HW_REV_105: case MDSS_MDP_HW_REV_109: @@ -2401,6 +2402,8 @@ ssize_t mdss_mdp_show_capabilities(struct device *dev, SPRINT(" dest_scaler"); if (mdata->has_separate_rotator) SPRINT(" separate_rotator"); + if (mdss_has_quirk(mdata, MDSS_QUIRK_HDR_SUPPORT_ENABLED)) + SPRINT(" hdr"); SPRINT("\n"); #undef SPRINT From be348aad165ec2c5e317cb8ed9a4aed1cba99557 Mon Sep 17 00:00:00 2001 From: Sayali Lokhande Date: Thu, 24 Nov 2016 18:08:26 +0530 Subject: [PATCH 0457/1015] mmc: host: Add Ring buffer logging for MMC. Add ring buffer to enable tracing of significant events of eMMC in both CQ and Legacy mode for debug purpose. CONFIG_MMC_SDHCI_RING_BUFFER is added to enable ring buffer logging. Change-Id: Iceb404d77fca19e133c319bc66ec15b2d77c7c54 Signed-off-by: Sayali Lokhande --- drivers/mmc/core/Kconfig | 11 +++ drivers/mmc/core/Makefile | 1 + drivers/mmc/core/host.c | 3 + drivers/mmc/core/ring_buffer.c | 123 ++++++++++++++++++++++++++++++++ include/linux/mmc/host.h | 2 + include/linux/mmc/ring_buffer.h | 55 ++++++++++++++ 6 files changed, 195 insertions(+) create mode 100644 drivers/mmc/core/ring_buffer.c create mode 100644 include/linux/mmc/ring_buffer.h diff --git a/drivers/mmc/core/Kconfig b/drivers/mmc/core/Kconfig index f771bc3496a4a..61222fb07da5e 100644 --- a/drivers/mmc/core/Kconfig +++ b/drivers/mmc/core/Kconfig @@ -12,6 +12,17 @@ config MMC_CLKGATE If unsure, say N. +config MMC_RING_BUFFER + bool "MMC_RING_BUFFER" + depends on MMC + default n + help + This enables the ring buffer tracing of significant + events for mmc driver to provide command history for + debugging purpose. + + If unsure, say N. + config MMC_EMBEDDED_SDIO boolean "MMC embedded SDIO device support (EXPERIMENTAL)" help diff --git a/drivers/mmc/core/Makefile b/drivers/mmc/core/Makefile index 38ed210ce2f3b..84c7ceac50de0 100644 --- a/drivers/mmc/core/Makefile +++ b/drivers/mmc/core/Makefile @@ -10,3 +10,4 @@ mmc_core-y := core.o bus.o host.o \ quirks.o slot-gpio.o mmc_core-$(CONFIG_DEBUG_FS) += debugfs.o +obj-$(CONFIG_MMC_RING_BUFFER) += ring_buffer.o diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index fc96c9a9ec062..ccaffd2b7ebd8 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -26,6 +26,8 @@ #include #include +#include + #include #include "core.h" @@ -787,6 +789,7 @@ int mmc_add_host(struct mmc_host *host) mmc_add_host_debugfs(host); #endif mmc_host_clk_sysfs_init(host); + mmc_trace_init(host); err = sysfs_create_group(&host->class_dev.kobj, &clk_scaling_attr_grp); if (err) diff --git a/drivers/mmc/core/ring_buffer.c b/drivers/mmc/core/ring_buffer.c new file mode 100644 index 0000000000000..55b820de2722f --- /dev/null +++ b/drivers/mmc/core/ring_buffer.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include + +void mmc_stop_tracing(struct mmc_host *mmc) +{ + mmc->trace_buf.stop_tracing = true; +} + +void mmc_trace_write(struct mmc_host *mmc, + const char *fmt, ...) +{ + unsigned int idx; + va_list args; + char *event; + unsigned long flags; + char str[MMC_TRACE_EVENT_SZ]; + + if (unlikely(!mmc->trace_buf.data) || + unlikely(mmc->trace_buf.stop_tracing)) + return; + + /* + * Here an increment and modulus is used to keep + * index within array bounds. The cast to unsigned is + * necessary so increment and rolover wraps to 0 correctly + */ + spin_lock_irqsave(&mmc->trace_buf.trace_lock, flags); + mmc->trace_buf.wr_idx += 1; + idx = ((unsigned int)mmc->trace_buf.wr_idx) & + (MMC_TRACE_RBUF_NUM_EVENTS - 1); + spin_unlock_irqrestore(&mmc->trace_buf.trace_lock, flags); + + /* Catch some unlikely machine specific wrap-around bug */ + if (unlikely(idx > (MMC_TRACE_RBUF_NUM_EVENTS - 1))) { + pr_err("%s: %s: Invalid idx:%d for mmc trace, tracing stopped !\n", + mmc_hostname(mmc), __func__, idx); + mmc_stop_tracing(mmc); + return; + } + + event = &mmc->trace_buf.data[idx * MMC_TRACE_EVENT_SZ]; + va_start(args, fmt); + snprintf(str, MMC_TRACE_EVENT_SZ, "<%d> %lld: %s: %s", + raw_smp_processor_id(), + ktime_to_ns(ktime_get()), + mmc_hostname(mmc), fmt); + memset(event, '\0', MMC_TRACE_EVENT_SZ); + vscnprintf(event, MMC_TRACE_EVENT_SZ, str, args); + va_end(args); +} + +void mmc_trace_init(struct mmc_host *mmc) +{ + BUILD_BUG_ON_NOT_POWER_OF_2(MMC_TRACE_RBUF_NUM_EVENTS); + + mmc->trace_buf.data = (char *) + __get_free_pages(GFP_KERNEL|__GFP_ZERO, + MMC_TRACE_RBUF_SZ_ORDER); + + if (!mmc->trace_buf.data) { + pr_err("%s: %s: Unable to allocate trace for mmc\n", + __func__, mmc_hostname(mmc)); + return; + } + + spin_lock_init(&mmc->trace_buf.trace_lock); + mmc->trace_buf.wr_idx = -1; +} + +void mmc_trace_free(struct mmc_host *mmc) +{ + if (mmc->trace_buf.data) + free_pages((unsigned long)mmc->trace_buf.data, + MMC_TRACE_RBUF_SZ_ORDER); +} + +void mmc_dump_trace_buffer(struct mmc_host *mmc, struct seq_file *s) +{ + unsigned int idx, cur_idx; + unsigned int N = MMC_TRACE_RBUF_NUM_EVENTS - 1; + char *event; + unsigned long flags; + + if (!mmc->trace_buf.data) + return; + + spin_lock_irqsave(&mmc->trace_buf.trace_lock, flags); + idx = ((unsigned int)mmc->trace_buf.wr_idx) & N; + cur_idx = (idx + 1) & N; + + do { + event = &mmc->trace_buf.data[cur_idx * MMC_TRACE_EVENT_SZ]; + if (s) + seq_printf(s, "%s", (char *)event); + else + pr_err("%s", (char *)event); + cur_idx = (cur_idx + 1) & N; + if (cur_idx == idx) { + event = + &mmc->trace_buf.data[cur_idx * MMC_TRACE_EVENT_SZ]; + if (s) + seq_printf(s, "latest_event: %s", + (char *)event); + else + pr_err("latest_event: %s", (char *)event); + break; + } + } while (1); + spin_unlock_irqrestore(&mmc->trace_buf.trace_lock, flags); +} diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index a110beb96773a..cf2a50c380667 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -20,6 +20,7 @@ #include #include #include +#include #define MMC_AUTOSUSPEND_DELAY_MS 3000 @@ -557,6 +558,7 @@ struct mmc_host { } perf; bool perf_enable; #endif + struct mmc_trace_buffer trace_buf; enum dev_state dev_status; bool wakeup_on_idle; struct mmc_cmdq_context_info cmdq_ctx; diff --git a/include/linux/mmc/ring_buffer.h b/include/linux/mmc/ring_buffer.h new file mode 100644 index 0000000000000..1bf564df7939d --- /dev/null +++ b/include/linux/mmc/ring_buffer.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __MMC_RING_BUFFER__ +#define __MMC_RING_BUFFER__ + +#include +#include + +#include "core.h" + +#define MMC_TRACE_RBUF_SZ_ORDER 2 /* 2^2 pages */ +#define MMC_TRACE_RBUF_SZ (PAGE_SIZE * (1 << MMC_TRACE_RBUF_SZ_ORDER)) +#define MMC_TRACE_EVENT_SZ 256 +#define MMC_TRACE_RBUF_NUM_EVENTS (MMC_TRACE_RBUF_SZ / MMC_TRACE_EVENT_SZ) + +struct mmc_host; +struct mmc_trace_buffer { + int wr_idx; + bool stop_tracing; + spinlock_t trace_lock; + char *data; +}; + +#ifdef CONFIG_MMC_RING_BUFFER +void mmc_stop_tracing(struct mmc_host *mmc); +void mmc_trace_write(struct mmc_host *mmc, const char *fmt, ...); +void mmc_trace_init(struct mmc_host *mmc); +void mmc_trace_free(struct mmc_host *mmc); +void mmc_dump_trace_buffer(struct mmc_host *mmc, struct seq_file *s); +#else +static inline void mmc_stop_tracing(struct mmc_host *mmc) {} +static inline void mmc_trace_write(struct mmc_host *mmc, + const char *fmt, ...) {} +static inline void mmc_trace_init(struct mmc_host *mmc) {} +static inline void mmc_trace_free(struct mmc_host *mmc) {} +static inline void mmc_dump_trace_buffer(struct mmc_host *mmc, + struct seq_file *s) {} +#endif + +#define MMC_TRACE(mmc, fmt, ...) \ + mmc_trace_write(mmc, fmt, ##__VA_ARGS__) + +#endif /* __MMC_RING_BUFFER__ */ From 9894abc069e08e933a139963895499abb094025b Mon Sep 17 00:00:00 2001 From: Sayali Lokhande Date: Wed, 30 Nov 2016 11:35:22 +0530 Subject: [PATCH 0458/1015] mmc: sdhci: Add mmc tracing events for legacy mode. Add ring buffer tracing events in legacy mode for debug purpose. Tracing events include cpu, timestamp, legacy command opcode, argument, response, interrupts. Example: <5> 171912889412: sdhci_prepare_data: mmc0: 0x28=0x0000003c 0x3E=0x00000000 <5> 171912901235: sdhci_set_transfer_mode: mmc0: 0x00=0x00000000 <5> 171912908579: sdhci_send_command: mmc0: updated 0x8=0x00000000 0xC=0x00000013 0xE=0x0000083a <5> 171912920922: sdhci_irq: mmc0: resp 0: 0x00000900 resp 1: 0x00000000 resp 2: 0x00000000 resp 3: 0x00000000 <5> 171912931339: sdhci_irq: mmc0: intmask: 0x1 <5> 171912938839: sdhci_irq: mmc0: intmask: 0x2 <5> 171912945766: sdhci_finish_data: mmc0: 0x24=0x01f80000 Change-Id: I26d2de3ddf72a74dd84199a9772d48da128796f4 Signed-off-by: Sayali Lokhande --- drivers/mmc/host/sdhci-msm.c | 13 ++++++++++++- drivers/mmc/host/sdhci.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 8a12214dc0d5b..dfb8c5f2fd4c2 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -2582,9 +2582,17 @@ static void sdhci_msm_check_power_status(struct sdhci_host *host, u32 req_type) if (done) init_completion(&msm_host->pwr_irq_completion); else if (!wait_for_completion_timeout(&msm_host->pwr_irq_completion, - msecs_to_jiffies(MSM_PWR_IRQ_TIMEOUT_MS))) + msecs_to_jiffies(MSM_PWR_IRQ_TIMEOUT_MS))) { __WARN_printf("%s: request(%d) timed out waiting for pwr_irq\n", mmc_hostname(host->mmc), req_type); + MMC_TRACE(host->mmc, + "request(%d) timed out waiting for pwr_irq, 0xDC: 0x%08x | 0xE0: 0x%08x | 0xE8: 0x%08x\n", + req_type, + readl_relaxed(msm_host->core_mem + CORE_PWRCTL_STATUS), + readl_relaxed(msm_host->core_mem + CORE_PWRCTL_MASK), + readl_relaxed(msm_host->core_mem + CORE_PWRCTL_CTL)); + mmc_stop_tracing(host->mmc); + } pr_debug("%s: %s: request %d done\n", mmc_hostname(host->mmc), __func__, req_type); @@ -3089,6 +3097,9 @@ void sdhci_msm_dump_vendor_regs(struct sdhci_host *host) if (host->cq_host) sdhci_msm_cmdq_dump_debug_ram(host); + MMC_TRACE(host->mmc, "Data cnt: 0x%08x | Fifo cnt: 0x%08x\n", + readl_relaxed(msm_host->core_mem + CORE_MCI_DATA_CNT), + readl_relaxed(msm_host->core_mem + CORE_MCI_FIFO_CNT)); pr_info("Data cnt: 0x%08x | Fifo cnt: 0x%08x | Int sts: 0x%08x\n", readl_relaxed(msm_host->core_mem + CORE_MCI_DATA_CNT), readl_relaxed(msm_host->core_mem + CORE_MCI_FIFO_CNT), diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index c6582b0f4c160..9f6dfdf4d45c4 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -105,6 +105,17 @@ static void sdhci_dump_state(struct sdhci_host *host) static void sdhci_dumpregs(struct sdhci_host *host) { + MMC_TRACE(host->mmc, + "%s: 0x04=0x%08x 0x06=0x%08x 0x0E=0x%08x 0x30=0x%08x 0x34=0x%08x 0x38=0x%08x\n", + __func__, + sdhci_readw(host, SDHCI_BLOCK_SIZE), + sdhci_readw(host, SDHCI_BLOCK_COUNT), + sdhci_readw(host, SDHCI_COMMAND), + sdhci_readl(host, SDHCI_INT_STATUS), + sdhci_readl(host, SDHCI_INT_ENABLE), + sdhci_readl(host, SDHCI_SIGNAL_ENABLE)); + mmc_stop_tracing(host->mmc); + pr_info(DRIVER_NAME ": =========== REGISTER DUMP (%s)===========\n", mmc_hostname(host->mmc)); @@ -1046,6 +1057,11 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) /* Set the DMA boundary value and block size */ sdhci_set_blk_size_reg(host, data->blksz, SDHCI_DEFAULT_BOUNDARY_ARG); sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT); + MMC_TRACE(host->mmc, + "%s: 0x28=0x%08x 0x3E=0x%08x 0x06=0x%08x\n", __func__, + sdhci_readb(host, SDHCI_HOST_CONTROL), + sdhci_readw(host, SDHCI_HOST_CONTROL2), + sdhci_readw(host, SDHCI_BLOCK_COUNT)); } static void sdhci_set_transfer_mode(struct sdhci_host *host, @@ -1096,6 +1112,9 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host, mode |= SDHCI_TRNS_DMA; sdhci_writew(host, mode, SDHCI_TRANSFER_MODE); + MMC_TRACE(host->mmc, "%s: 0x00=0x%08x 0x0C=0x%08x\n", __func__, + sdhci_readw(host, SDHCI_ARGUMENT2), + sdhci_readw(host, SDHCI_TRANSFER_MODE)); } static void sdhci_finish_data(struct sdhci_host *host) @@ -1107,6 +1126,8 @@ static void sdhci_finish_data(struct sdhci_host *host) data = host->data; host->data = NULL; + MMC_TRACE(host->mmc, "%s: 0x24=0x%08x\n", __func__, + sdhci_readl(host, SDHCI_PRESENT_STATE)); if (host->flags & SDHCI_REQ_USE_DMA) { if (host->flags & SDHCI_USE_ADMA) sdhci_adma_table_post(host, data); @@ -1233,6 +1254,11 @@ void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) if (cmd->data) host->data_start_time = ktime_get(); trace_mmc_cmd_rw_start(cmd->opcode, cmd->arg, cmd->flags); + MMC_TRACE(host->mmc, + "%s: updated 0x8=0x%08x 0xC=0x%08x 0xE=0x%08x\n", __func__, + sdhci_readl(host, SDHCI_ARGUMENT), + sdhci_readw(host, SDHCI_TRANSFER_MODE), + sdhci_readw(host, SDHCI_COMMAND)); sdhci_writew(host, SDHCI_MAKE_CMD(cmd->opcode, flags), SDHCI_COMMAND); } EXPORT_SYMBOL_GPL(sdhci_send_command); @@ -1254,8 +1280,14 @@ static void sdhci_finish_command(struct sdhci_host *host) sdhci_readb(host, SDHCI_RESPONSE + (3-i)*4-1); } + MMC_TRACE(host->mmc, + "%s: resp 0: 0x%08x resp 1: 0x%08x resp 2: 0x%08x resp 3: 0x%08x\n", + __func__, host->cmd->resp[0], host->cmd->resp[1], + host->cmd->resp[2], host->cmd->resp[3]); } else { host->cmd->resp[0] = sdhci_readl(host, SDHCI_RESPONSE); + MMC_TRACE(host->mmc, "%s: resp 0: 0x%08x\n", + __func__, host->cmd->resp[0]); } } @@ -3187,6 +3219,9 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) goto out; } + MMC_TRACE(host->mmc, + "%s: intmask: 0x%x\n", __func__, intmask); + if (intmask & SDHCI_INT_AUTO_CMD_ERR) host->auto_cmd_err_sts = sdhci_readw(host, SDHCI_AUTO_CMD_ERR); From 5dbb0b351ed622391b0d78b7d744ad41502b75c4 Mon Sep 17 00:00:00 2001 From: Sayali Lokhande Date: Mon, 12 Dec 2016 08:48:37 +0530 Subject: [PATCH 0459/1015] mmc: core: Add mmc tracing events in suspend and resume Add mmc tracing events in suspend and resume. Change-Id: I5ca1c3f667003c4b4224b65d2a5db50766b44d75 Signed-off-by: Sayali Lokhande --- drivers/mmc/core/mmc.c | 5 ++++- drivers/mmc/core/sd.c | 4 ++++ drivers/mmc/core/sdio.c | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 231b63318bd3d..27b88e9fbc34a 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -2483,6 +2483,7 @@ static int mmc_suspend(struct mmc_host *host) int err; ktime_t start = ktime_get(); + MMC_TRACE(host, "%s: Enter\n", __func__); err = _mmc_suspend(host, true); if (!err) { pm_runtime_disable(&host->card->dev); @@ -2491,6 +2492,7 @@ static int mmc_suspend(struct mmc_host *host) trace_mmc_suspend(mmc_hostname(host), err, ktime_to_us(ktime_sub(ktime_get(), start))); + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; } @@ -2566,6 +2568,7 @@ static int mmc_resume(struct mmc_host *host) int err = 0; ktime_t start = ktime_get(); + MMC_TRACE(host, "%s: Enter\n", __func__); if (!(host->caps & MMC_CAP_RUNTIME_RESUME)) { err = _mmc_resume(host); pm_runtime_set_active(&host->card->dev); @@ -2575,7 +2578,7 @@ static int mmc_resume(struct mmc_host *host) trace_mmc_resume(mmc_hostname(host), err, ktime_to_us(ktime_sub(ktime_get(), start))); - + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; } diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 28943172809c8..ebf77c887bbd3 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -1224,11 +1224,13 @@ static int mmc_sd_suspend(struct mmc_host *host) { int err; + MMC_TRACE(host, "%s: Enter\n", __func__); err = _mmc_sd_suspend(host); if (!err) { pm_runtime_disable(&host->card->dev); pm_runtime_set_suspended(&host->card->dev); } + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; } @@ -1294,12 +1296,14 @@ static int mmc_sd_resume(struct mmc_host *host) { int err = 0; + MMC_TRACE(host, "%s: Enter\n", __func__); if (!(host->caps & MMC_CAP_RUNTIME_RESUME)) { err = _mmc_sd_resume(host); pm_runtime_set_active(&host->card->dev); pm_runtime_mark_last_busy(&host->card->dev); } pm_runtime_enable(&host->card->dev); + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; } diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index ab541e6591374..889588d416821 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -1036,6 +1036,7 @@ static int mmc_sdio_pre_suspend(struct mmc_host *host) */ static int mmc_sdio_suspend(struct mmc_host *host) { + MMC_TRACE(host, "%s: Enter\n", __func__); if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) { mmc_claim_host(host); sdio_disable_wide(host->card); @@ -1046,6 +1047,7 @@ static int mmc_sdio_suspend(struct mmc_host *host) mmc_power_off(host); else if (host->ios.clock) mmc_gate_clock(host); + MMC_TRACE(host, "%s: Exit\n", __func__); return 0; } @@ -1057,6 +1059,7 @@ static int mmc_sdio_resume(struct mmc_host *host) BUG_ON(!host); BUG_ON(!host->card); + MMC_TRACE(host, "%s: Enter\n", __func__); /* Basic card reinitialization. */ mmc_claim_host(host); @@ -1108,6 +1111,7 @@ static int mmc_sdio_resume(struct mmc_host *host) host->pm_flags &= ~MMC_PM_KEEP_POWER; host->pm_flags &= ~MMC_PM_WAKE_SDIO_IRQ; + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; } From 2caa6d23df18b0ffabd95fe7176ddf68683e3726 Mon Sep 17 00:00:00 2001 From: Sayali Lokhande Date: Wed, 30 Nov 2016 10:01:59 +0530 Subject: [PATCH 0460/1015] mmc: cmdq_hci: Add tracing events for CQ mode. Add ring buffer tracing events in CQ for debugging purpose. Tracing events includes cpu, timestamp, CQ metadata per tag(task descripter, tag, CQIS ,halt-unhalt, enable-disable). Example: <6> 1211721243963: cmdq_request : tag: 0 <6> 1211721856723: cmdq_irq: mmc0: CQIS: 0x2 err: 0 <6> 1211721863286: cmdq_irq: mmc0: completing tag -> 0 <6> 1211722496046: cmdq_prep_dcmd_desc: mmc0: DCMD: Task: 0x0163402f | Args: 0x015f2538 <6> 1211722505994: cmdq_request : tag: 31 <6> 1211722538025: cmdq_irq: mmc0: CQIS: 0x2 err: 0 <6> 1211722544588: cmdq_irq: mmc0: completing tag -> 31 Change-Id: I7642bfc33513fa6b09da03220fd4dd12f47bbac5 Signed-off-by: Sayali Lokhande --- drivers/mmc/host/cmdq_hci.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/cmdq_hci.c b/drivers/mmc/host/cmdq_hci.c index 108753ada43c7..87df7c102ecff 100644 --- a/drivers/mmc/host/cmdq_hci.c +++ b/drivers/mmc/host/cmdq_hci.c @@ -199,6 +199,14 @@ static void cmdq_dumpregs(struct cmdq_host *cq_host) { struct mmc_host *mmc = cq_host->mmc; + MMC_TRACE(mmc, + "%s: 0x0C=0x%08x 0x10=0x%08x 0x14=0x%08x 0x18=0x%08x 0x28=0x%08x 0x2C=0x%08x 0x30=0x%08x 0x34=0x%08x 0x54=0x%08x 0x58=0x%08x 0x5C=0x%08x 0x48=0x%08x\n", + __func__, cmdq_readl(cq_host, CQCTL), cmdq_readl(cq_host, CQIS), + cmdq_readl(cq_host, CQISTE), cmdq_readl(cq_host, CQISGE), + cmdq_readl(cq_host, CQTDBR), cmdq_readl(cq_host, CQTCN), + cmdq_readl(cq_host, CQDQS), cmdq_readl(cq_host, CQDPT), + cmdq_readl(cq_host, CQTERRI), cmdq_readl(cq_host, CQCRI), + cmdq_readl(cq_host, CQCRA), cmdq_readl(cq_host, CQCRDCT)); pr_err(DRV_NAME ": ========== REGISTER DUMP (%s)==========\n", mmc_hostname(mmc)); @@ -427,6 +435,7 @@ static int cmdq_enable(struct mmc_host *mmc) pm_ref_count: cmdq_runtime_pm_put(cq_host); out: + MMC_TRACE(mmc, "%s: CQ enabled err: %d\n", __func__, err); return err; } @@ -444,6 +453,7 @@ static void cmdq_disable_nosync(struct mmc_host *mmc, bool soft) cq_host->enabled = false; mmc_host_set_cq_disable(mmc); + MMC_TRACE(mmc, "%s: CQ disabled\n", __func__); } static void cmdq_disable(struct mmc_host *mmc, bool soft) @@ -526,6 +536,12 @@ static void cmdq_prep_task_desc(struct mmc_request *mrq, REL_WRITE(!!(req_flags & REL_WR)) | BLK_COUNT(mrq->cmdq_req->data.blocks) | BLK_ADDR((u64)mrq->cmdq_req->blk_addr); + + MMC_TRACE(mrq->host, + "%s: Task: 0x%08x | Args: 0x%08x | cnt: 0x%08x\n", __func__, + lower_32_bits(*data), + upper_32_bits(*data), + mrq->cmdq_req->data.blocks); } static int cmdq_dma_map(struct mmc_host *host, struct mmc_request *mrq) @@ -666,6 +682,11 @@ static void cmdq_prep_dcmd_desc(struct mmc_host *mmc, dataddr = (__le64 __force *)(desc + 4); dataddr[0] = cpu_to_le64((u64)mrq->cmd->arg); cmdq_log_task_desc_history(cq_host, *task_desc, true); + MMC_TRACE(mrq->host, + "%s: DCMD: Task: 0x%08x | Args: 0x%08x\n", + __func__, + lower_32_bits(*task_desc), + upper_32_bits(*task_desc)); } static void cmdq_pm_qos_vote(struct sdhci_host *host, struct mmc_request *mrq) @@ -744,6 +765,7 @@ static int cmdq_request(struct mmc_host *mmc, struct mmc_request *mrq) cmdq_dumpregs(cq_host); BUG_ON(1); } + MMC_TRACE(mmc, "%s: tag: %d\n", __func__, tag); cmdq_writel(cq_host, 1 << tag, CQTDBR); /* Commit the doorbell write immediately */ wmb(); @@ -786,6 +808,8 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) if (!status && !err) return IRQ_NONE; + MMC_TRACE(mmc, "%s: CQIS: 0x%x err: %d\n", + __func__, status, err); if (err || (status & CQIS_RED)) { err_info = cmdq_readl(cq_host, CQTERRI); @@ -921,7 +945,9 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) /* complete the corresponding mrq */ pr_debug("%s: completing tag -> %lu\n", mmc_hostname(mmc), tag); - cmdq_finish_data(mmc, tag); + MMC_TRACE(mmc, "%s: completing tag -> %lu\n", + __func__, tag); + cmdq_finish_data(mmc, tag); } } @@ -998,6 +1024,8 @@ static int cmdq_halt(struct mmc_host *mmc, bool halt) retries--; continue; } else { + MMC_TRACE(mmc, "%s: halt done , retries: %d\n", + __func__, retries); /* halt done: re-enable legacy interrupts */ if (cq_host->ops->clear_set_irqs) cq_host->ops->clear_set_irqs(mmc, @@ -1015,6 +1043,7 @@ static int cmdq_halt(struct mmc_host *mmc, bool halt) cq_host->ops->set_data_timeout(mmc, 0xf); if (cq_host->ops->clear_set_irqs) cq_host->ops->clear_set_irqs(mmc, true); + MMC_TRACE(mmc, "%s: unhalt done\n", __func__); cmdq_writel(cq_host, cmdq_readl(cq_host, CQCTL) & ~HALT, CQCTL); } From 7320835d3433ffac30898e6ce9d55b879b65d9af Mon Sep 17 00:00:00 2001 From: Sayali Lokhande Date: Thu, 24 Nov 2016 17:43:12 +0530 Subject: [PATCH 0461/1015] mmc: core: Add sysfs entry to print ring buffer Add sysfs entry to print MMC ring buffer events. usage: cat /sys/kernel/debug/mmc0/ring_buffer Change-Id: I1fb6b0f65a11cd574e56df9937a96acd74a84341 Signed-off-by: Sayali Lokhande --- drivers/mmc/core/debugfs.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/mmc/core/debugfs.c b/drivers/mmc/core/debugfs.c index 03b0c7ee9561e..aa8dcc87f31a7 100644 --- a/drivers/mmc/core/debugfs.c +++ b/drivers/mmc/core/debugfs.c @@ -32,6 +32,26 @@ module_param(fail_request, charp, 0); #endif /* CONFIG_FAIL_MMC_REQUEST */ /* The debugfs functions are optimized away when CONFIG_DEBUG_FS isn't set. */ +static int mmc_ring_buffer_show(struct seq_file *s, void *data) +{ + struct mmc_host *mmc = s->private; + + mmc_dump_trace_buffer(mmc, s); + return 0; +} + +static int mmc_ring_buffer_open(struct inode *inode, struct file *file) +{ + return single_open(file, mmc_ring_buffer_show, inode->i_private); +} + +static const struct file_operations mmc_ring_buffer_fops = { + .open = mmc_ring_buffer_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + static int mmc_ios_show(struct seq_file *s, void *data) { static const char *vdd_str[] = { @@ -343,6 +363,12 @@ void mmc_add_host_debugfs(struct mmc_host *host) &host->cmdq_thist_enabled)) goto err_node; +#ifdef CONFIG_MMC_RING_BUFFER + if (!debugfs_create_file("ring_buffer", S_IRUSR, + root, host, &mmc_ring_buffer_fops)) + goto err_node; +#endif + #ifdef CONFIG_MMC_CLKGATE if (!debugfs_create_u32("clk_delay", (S_IRUSR | S_IWUSR), root, &host->clk_delay)) From 6251cfce8757a66c0153016a9fde83996858ee1e Mon Sep 17 00:00:00 2001 From: David Collins Date: Tue, 13 Sep 2016 11:47:23 -0700 Subject: [PATCH 0462/1015] regulator: cpr3-regulator: fix potential aging uninitialized variable usage If cpr3_ctrl_clear_cpr4_config() returns an error at the beginning of the cpr3_regulator_measure_aging() function, then goto cleanup is called. After that, the *_restore values are written back into hardware registers. Unfortunately, these *_restore variables are uninitialized in this code path. Correct this issue. Change-Id: I906613a00137925c9903ac6c01771c459594864f CRs-Fixed: 1066407 Signed-off-by: David Collins --- drivers/regulator/cpr3-regulator.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/regulator/cpr3-regulator.c b/drivers/regulator/cpr3-regulator.c index 13f07ef784c81..ba354472ac89b 100644 --- a/drivers/regulator/cpr3-regulator.c +++ b/drivers/regulator/cpr3-regulator.c @@ -3341,7 +3341,8 @@ static int cpr3_regulator_measure_aging(struct cpr3_controller *ctrl, if (rc) { cpr3_err(ctrl, "failed to clear CPR4 configuration,rc=%d\n", rc); - goto cleanup; + kfree(quot_delta_results); + return rc; } } From 36d539dcea6b126dcfaf89f8299de28836ee67cb Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Tue, 22 Nov 2016 11:04:04 -0800 Subject: [PATCH 0463/1015] msm: camera: flash: Validate the power setting size Validate the power setting size before copying. If userspace sends a value which is greater than MAX_POWER_CONFIG, then the driver accesses unintended memory. This change will fix the issue. CRs-Fixed: 1093232 Signed-off-by: Rajesh Bondugula Change-Id: Ia49963248a94765baa19695294b197ea6f3bb8e2 --- .../platform/msm/camera_v2/sensor/flash/msm_flash.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c index b1e0cf83faa17..3b278128b782e 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c +++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c @@ -268,6 +268,16 @@ static int32_t msm_flash_i2c_init( flash_ctrl->power_info.power_down_setting_size = flash_ctrl->power_setting_array.size_down; + if ((flash_ctrl->power_info.power_setting_size > MAX_POWER_CONFIG) || + (flash_ctrl->power_info.power_down_setting_size > MAX_POWER_CONFIG)) { + pr_err("%s:%d invalid power setting size=%d size_down=%d\n", + __func__, __LINE__, + flash_ctrl->power_info.power_setting_size, + flash_ctrl->power_info.power_down_setting_size); + rc = -EINVAL; + goto msm_flash_i2c_init_fail; + } + rc = msm_camera_power_up(&flash_ctrl->power_info, flash_ctrl->flash_device_type, &flash_ctrl->flash_i2c_client); From 484c3b74fefbc60eb5835c64c7e9150ad3ee2d1f Mon Sep 17 00:00:00 2001 From: Xiaoyu Ye Date: Wed, 7 Dec 2016 16:35:07 -0800 Subject: [PATCH 0464/1015] drivers: soc: qcom: Add error handling in function avtimer_ioctl Error handling is added to prevent garbage value being passed to user space by the uninitialized local variable avtimer_tick. CRs-Fixed: 1097878 Change-Id: I3f895deaae3acf329088cf8135859cc41e781763 Signed-off-by: Xiaoyu Ye --- drivers/platform/msm/avtimer.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/platform/msm/avtimer.c b/drivers/platform/msm/avtimer.c index 2bded5e83cce2..4331af8890c0b 100644 --- a/drivers/platform/msm/avtimer.c +++ b/drivers/platform/msm/avtimer.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -331,9 +331,17 @@ static long avtimer_ioctl(struct file *file, unsigned int ioctl_num, switch (ioctl_num) { case IOCTL_GET_AVTIMER_TICK: { - uint64_t avtimer_tick; + uint64_t avtimer_tick = 0; + int rc; + + rc = avcs_core_query_timer(&avtimer_tick); + + if (rc) { + pr_err("%s: Error: Invalid AV Timer tick, rc = %d\n", + __func__, rc); + return rc; + } - avcs_core_query_timer(&avtimer_tick); pr_debug_ratelimited("%s: AV Timer tick: time %llx\n", __func__, avtimer_tick); if (copy_to_user((void *) ioctl_param, &avtimer_tick, From 86a5b72ad14e47f28aa79f17f312cb19d5558ea0 Mon Sep 17 00:00:00 2001 From: Sharad Sangle Date: Tue, 13 Dec 2016 14:35:39 +0530 Subject: [PATCH 0465/1015] ASoC: msm: qdsp6v2: DAP: Add check to validate param length To avoid buffer overflow, validate input length used to fetch visualizer data. CRs-fixed: 1096672 Change-Id: I224bc2f20d94182713c565972fb0bd52cad6f3fd Signed-off-by: Sharad Sangle --- sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c b/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c index bb0f890d300f5..5866e46cc6a20 100644 --- a/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c +++ b/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2014, 2016, The Linux Foundation. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. @@ -18,6 +18,10 @@ #include "msm-dolby-dap-config.h" +#ifndef DOLBY_PARAM_VCNB_MAX_LENGTH +#define DOLBY_PARAM_VCNB_MAX_LENGTH 40 +#endif + /* dolby endp based parameters */ struct dolby_dap_endp_params_s { int device; @@ -896,6 +900,11 @@ int msm_dolby_dap_param_visualizer_control_get(struct snd_kcontrol *kcontrol, uint32_t param_payload_len = DOLBY_PARAM_PAYLOAD_SIZE * sizeof(uint32_t); int port_id, copp_idx, idx; + if (length > DOLBY_PARAM_VCNB_MAX_LENGTH || length <= 0) { + pr_err("%s Incorrect VCNB length", __func__); + ucontrol->value.integer.value[0] = 0; + return -EINVAL; + } for (idx = 0; idx < AFE_MAX_PORTS; idx++) { port_id = dolby_dap_params_states.port_id[idx]; copp_idx = dolby_dap_params_states.copp_idx[idx]; From 735853c68b38afa4994f242c15a29e6f06a8978f Mon Sep 17 00:00:00 2001 From: Satya Durga Srinivasu Prabhala Date: Fri, 16 Dec 2016 10:01:58 -0800 Subject: [PATCH 0466/1015] soc: qcom: pil/ssr: fix issue with logs The drivers uses %p to print the Kernel pointers. Replace %p with appropriate format to stop revealing Kernel pointers. Change-Id: Ic7d77e920ccfe779b979f732d506d59dcdfe885a Signed-off-by: Satya Durga Srinivasu Prabhala --- drivers/soc/qcom/pil-q6v5.c | 4 ++-- drivers/soc/qcom/subsystem_notif.c | 6 +++--- drivers/soc/qcom/subsystem_restart.c | 27 +++++++++++++++------------ 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/drivers/soc/qcom/pil-q6v5.c b/drivers/soc/qcom/pil-q6v5.c index 369d165bd6920..f96bd81c4d42f 100644 --- a/drivers/soc/qcom/pil-q6v5.c +++ b/drivers/soc/qcom/pil-q6v5.c @@ -203,9 +203,9 @@ void pil_q6v5_halt_axi_port(struct pil_desc *pil, void __iomem *halt_base) ret = readl_poll_timeout(halt_base + AXI_HALTACK, status, status != 0, 50, HALT_ACK_TIMEOUT_US); if (ret) - dev_warn(pil->dev, "Port %p halt timeout\n", halt_base); + dev_warn(pil->dev, "Port %pK halt timeout\n", halt_base); else if (!readl_relaxed(halt_base + AXI_IDLE)) - dev_warn(pil->dev, "Port %p halt failed\n", halt_base); + dev_warn(pil->dev, "Port %pK halt failed\n", halt_base); /* Clear halt request (port will remain halted until reset) */ writel_relaxed(0, halt_base + AXI_HALTREQ); diff --git a/drivers/soc/qcom/subsystem_notif.c b/drivers/soc/qcom/subsystem_notif.c index 431bbd8cee6f9..8b24008b5abec 100644 --- a/drivers/soc/qcom/subsystem_notif.c +++ b/drivers/soc/qcom/subsystem_notif.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011, 2013, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011, 2013, 2016 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -196,7 +196,7 @@ static int subsys_notifier_test_call(struct notifier_block *this, switch (code) { default: - printk(KERN_WARNING "%s: Notification %s from subsystem %p\n", + pr_warn("%s: Notification %s from subsystem %pK\n", __func__, notif_to_string(code), data); break; @@ -212,7 +212,7 @@ static struct notifier_block nb = { static void subsys_notif_reg_test_notifier(const char *subsys_name) { void *handle = subsys_notif_register_notifier(subsys_name, &nb); - printk(KERN_WARNING "%s: Registered test notifier, handle=%p", + pr_warn("%s: Registered test notifier, handle=%pK", __func__, handle); } #endif diff --git a/drivers/soc/qcom/subsystem_restart.c b/drivers/soc/qcom/subsystem_restart.c index 5fc22ce2ca40d..4de596cb78516 100644 --- a/drivers/soc/qcom/subsystem_restart.c +++ b/drivers/soc/qcom/subsystem_restart.c @@ -599,10 +599,11 @@ static void subsystem_shutdown(struct subsys_device *dev, void *data) { const char *name = dev->desc->name; - pr_info("[%p]: Shutting down %s\n", current, name); + pr_info("[%s:%d]: Shutting down %s\n", + current->comm, current->pid, name); if (dev->desc->shutdown(dev->desc, true) < 0) - panic("subsys-restart: [%p]: Failed to shutdown %s!", - current, name); + panic("subsys-restart: [%s:%d]: Failed to shutdown %s!", + current->comm, current->pid, name); dev->crash_count++; subsys_set_state(dev, SUBSYS_OFFLINE); disable_all_irqs(dev); @@ -614,7 +615,8 @@ static void subsystem_ramdump(struct subsys_device *dev, void *data) if (dev->desc->ramdump) if (dev->desc->ramdump(is_ramdump_enabled(dev), dev->desc) < 0) - pr_warn("%s[%p]: Ramdump failed.\n", name, current); + pr_warn("%s[%s:%d]: Ramdump failed.\n", + name, current->comm, current->pid); dev->do_ramdump_on_put = false; } @@ -629,13 +631,14 @@ static void subsystem_powerup(struct subsys_device *dev, void *data) const char *name = dev->desc->name; int ret; - pr_info("[%p]: Powering up %s\n", current, name); + pr_info("[%s:%d]: Powering up %s\n", current->comm, current->pid, name); init_completion(&dev->err_ready); if (dev->desc->powerup(dev->desc) < 0) { notify_each_subsys_device(&dev, 1, SUBSYS_POWERUP_FAILURE, NULL); - panic("[%p]: Powerup error: %s!", current, name); + panic("[%s:%d]: Powerup error: %s!", + current->comm, current->pid, name); } enable_all_irqs(dev); @@ -643,8 +646,8 @@ static void subsystem_powerup(struct subsys_device *dev, void *data) if (ret) { notify_each_subsys_device(&dev, 1, SUBSYS_POWERUP_FAILURE, NULL); - panic("[%p]: Timed out waiting for error ready: %s!", - current, name); + panic("[%s:%d]: Timed out waiting for error ready: %s!", + current->comm, current->pid, name); } subsys_set_state(dev, SUBSYS_ONLINE); subsys_set_crash_status(dev, false); @@ -931,8 +934,8 @@ static void subsystem_restart_wq_func(struct work_struct *work) */ mutex_lock(&soc_order_reg_lock); - pr_debug("[%p]: Starting restart sequence for %s\n", current, - desc->name); + pr_debug("[%s:%d]: Starting restart sequence for %s\n", + current->comm, current->pid, desc->name); notify_each_subsys_device(list, count, SUBSYS_BEFORE_SHUTDOWN, NULL); for_each_subsys_device(list, count, NULL, subsystem_shutdown); notify_each_subsys_device(list, count, SUBSYS_AFTER_SHUTDOWN, NULL); @@ -953,8 +956,8 @@ static void subsystem_restart_wq_func(struct work_struct *work) for_each_subsys_device(list, count, NULL, subsystem_powerup); notify_each_subsys_device(list, count, SUBSYS_AFTER_POWERUP, NULL); - pr_info("[%p]: Restart sequence for %s completed.\n", - current, desc->name); + pr_info("[%s:%d]: Restart sequence for %s completed.\n", + current->comm, current->pid, desc->name); mutex_unlock(&soc_order_reg_lock); mutex_unlock(&track->lock); From 83ab342bf832623553cd90945ed04d613d53cf4c Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Mon, 2 Jan 2017 13:45:19 +0530 Subject: [PATCH 0467/1015] regulator: msm_gfx_ldo: fix null pointer dereference Fix a possible null dereference after a runtime memory allocation made for volt_adjust local variable. CRs-Fixed: 1106624 Change-Id: I45eedc24e98dede75e7e4bf1374f582d95c3e9b2 Signed-off-by: Tirupathi Reddy --- drivers/regulator/msm_gfx_ldo.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/regulator/msm_gfx_ldo.c b/drivers/regulator/msm_gfx_ldo.c index 4bcfd8a07fc9e..b6a78a390d623 100644 --- a/drivers/regulator/msm_gfx_ldo.c +++ b/drivers/regulator/msm_gfx_ldo.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -755,6 +755,9 @@ static int msm_gfx_ldo_adjust_init_voltage(struct msm_gfx_ldo *ldo_vreg) volt_adjust = devm_kcalloc(ldo_vreg->dev, size, sizeof(*volt_adjust), GFP_KERNEL); + if (!volt_adjust) + return -ENOMEM; + rc = of_property_read_u32_array(of_node, prop_name, volt_adjust, size); if (rc) { pr_err("failed to read %s property rc=%d\n", prop_name, rc); From 4b8dbdc15efcd86425f6724d13319c0afb66d693 Mon Sep 17 00:00:00 2001 From: Karthikeyan Ramasubramanian Date: Thu, 15 Dec 2016 08:13:20 -0700 Subject: [PATCH 0468/1015] net: ipc_router: Register services only on client port Allowing services to be registered on a non-client port will cause either an existing service or a control port to be over-written. This will cause undefined functional behavior. Allow the services to be registered only on client ports. CRs-Fixed: 1101792 Change-Id: If6cfc75e9314204b7b44957f1598a8a2e1a45325 Signed-off-by: Karthikeyan Ramasubramanian --- net/ipc_router/ipc_router_core.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/ipc_router/ipc_router_core.c b/net/ipc_router/ipc_router_core.c index fae41583d0e98..b0317b688d75e 100644 --- a/net/ipc_router/ipc_router_core.c +++ b/net/ipc_router/ipc_router_core.c @@ -2808,6 +2808,9 @@ int msm_ipc_router_register_server(struct msm_ipc_port *port_ptr, if (!port_ptr || !name) return -EINVAL; + if (port_ptr->type != CLIENT_PORT) + return -EINVAL; + if (name->addrtype != MSM_IPC_ADDR_NAME) return -EINVAL; From 70cc0e3f9d8689a145740760662c87c42d4b9851 Mon Sep 17 00:00:00 2001 From: Karthikeyan Mani Date: Wed, 7 Dec 2016 18:19:31 -0800 Subject: [PATCH 0469/1015] ASoC: wcd9320: Fix out of bounds for mad input value Add check in taiko_mad_input_put function to return error on out of bounds access using mad input value CRs-fixed: 1096799 Change-Id: I75ce9e881cf05a50e874a555b2f8bd3286cdaed4 Signed-off-by: Karthikeyan Mani --- sound/soc/codecs/wcd9320.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sound/soc/codecs/wcd9320.c b/sound/soc/codecs/wcd9320.c index cb91030a8ef81..ff199c14ec7d5 100644 --- a/sound/soc/codecs/wcd9320.c +++ b/sound/soc/codecs/wcd9320.c @@ -1208,6 +1208,14 @@ static int taiko_mad_input_put(struct snd_kcontrol *kcontrol, taiko_mad_input = ucontrol->value.integer.value[0]; + if (taiko_mad_input >= ARRAY_SIZE(taiko_conn_mad_text)) { + dev_err(codec->dev, + "%s: taiko_mad_input = %d out of bounds\n", + __func__, taiko_mad_input); + return -EINVAL; + } + + micb_4_int_reg = taiko->resmgr.reg_addr->micb_4_int_rbias; pr_debug("%s: taiko_mad_input = %s\n", __func__, taiko_conn_mad_text[taiko_mad_input]); From 34d5583bf5310688c943c93854009f75aca2bbb6 Mon Sep 17 00:00:00 2001 From: Karthikeyan Mani Date: Wed, 14 Dec 2016 11:33:18 -0800 Subject: [PATCH 0470/1015] ASoC: wcd9330: Fix out of bounds for mad input value Add check in tomtom_mad_input_put function to return error on out of bounds access using mad input value CRs-fixed: 1096799 Change-Id: I16f8627b29c7b14a8dc0433b21aa21bf96e98905 Signed-off-by: Karthikeyan Mani --- sound/soc/codecs/wcd9330.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sound/soc/codecs/wcd9330.c b/sound/soc/codecs/wcd9330.c index 22f3f85e564b7..7fb10966b1f2b 100644 --- a/sound/soc/codecs/wcd9330.c +++ b/sound/soc/codecs/wcd9330.c @@ -1377,6 +1377,13 @@ static int tomtom_mad_input_put(struct snd_kcontrol *kcontrol, tomtom_mad_input = ucontrol->value.integer.value[0]; micb_4_int_reg = tomtom->resmgr.reg_addr->micb_4_int_rbias; + if (tomtom_mad_input >= ARRAY_SIZE(tomtom_conn_mad_text)) { + dev_err(codec->dev, + "%s: tomtom_mad_input = %d out of bounds\n", + __func__, tomtom_mad_input); + return -EINVAL; + } + pr_debug("%s: tomtom_mad_input = %s\n", __func__, tomtom_conn_mad_text[tomtom_mad_input]); From 104d88c4b2d19b6ba0094b673aa204091c193476 Mon Sep 17 00:00:00 2001 From: Karthikeyan Mani Date: Wed, 14 Dec 2016 11:46:35 -0800 Subject: [PATCH 0471/1015] ASoC: wcd9335: Fix out of bounds for mad input value Add check in tasha_mad_input_put function to return error on out of bounds access using mad input value. CRs-fixed: 1096799 Change-Id: Iddaa3fef362f7cb1919aa3bd8dd4b83133fe7c97 Signed-off-by: Karthikeyan Mani --- sound/soc/codecs/wcd9335.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c index 6d40f70ce51b8..7896f7370ce05 100644 --- a/sound/soc/codecs/wcd9335.c +++ b/sound/soc/codecs/wcd9335.c @@ -7563,6 +7563,13 @@ static int tasha_mad_input_put(struct snd_kcontrol *kcontrol, tasha_mad_input = ucontrol->value.integer.value[0]; + if (tasha_mad_input >= ARRAY_SIZE(tasha_conn_mad_text)) { + dev_err(codec->dev, + "%s: tasha_mad_input = %d out of bounds\n", + __func__, tasha_mad_input); + return -EINVAL; + } + if (!strcmp(tasha_conn_mad_text[tasha_mad_input], "NOTUSED1") || !strcmp(tasha_conn_mad_text[tasha_mad_input], "NOTUSED2") || !strcmp(tasha_conn_mad_text[tasha_mad_input], "NOTUSED3") || From 8d0111fd5429c61ad4f1739e4358b77b8dd789ab Mon Sep 17 00:00:00 2001 From: Shay Nachmani Date: Wed, 23 Nov 2016 12:04:29 +0200 Subject: [PATCH 0472/1015] msm: ion: Modified Secure Display buffer permissions Made Secure Display buffer permissions RO instead of RW. Change-Id: I617a3bb5cbb80ac3967ab14f37452c461bb4df77 Signed-off-by: Shay Nachmani --- drivers/staging/android/ion/ion_cma_heap.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/staging/android/ion/ion_cma_heap.c b/drivers/staging/android/ion/ion_cma_heap.c index b2e1a4c1b170d..b5905fc81147b 100644 --- a/drivers/staging/android/ion/ion_cma_heap.c +++ b/drivers/staging/android/ion/ion_cma_heap.c @@ -274,11 +274,16 @@ static int ion_secure_cma_allocate(struct ion_heap *heap, source_vm = VMID_HLOS; dest_vm = get_secure_vmid(flags); + if (dest_vm < 0) { pr_err("%s: Failed to get secure vmid\n", __func__); return -EINVAL; } - dest_perms = PERM_READ | PERM_WRITE; + + if (dest_vm == VMID_CP_SEC_DISPLAY) + dest_perms = PERM_READ; + else + dest_perms = PERM_READ | PERM_WRITE; ret = ion_cma_allocate(heap, buffer, len, align, flags); if (ret) { From ff1379a1d438e34931eef941aa4f500bf726f500 Mon Sep 17 00:00:00 2001 From: Manu Gautam Date: Fri, 12 Aug 2016 14:14:03 +0530 Subject: [PATCH 0473/1015] usb: android: f_uvc: Add support for UVC function Integrate USB video class function driver with android gadget. User can run below sample commands to enumerate UVC as webcam on hosts: ->setprop sys.usb.config none ->echo 0 > /sys/class/android_usb/android0/enable ->echo $PID > /sys/class/android_usb/android0/idProduct ->echo video > /sys/class/android_usb/android0/functions ->echo 1 > /sys/class/android_usb/android0/enable After above commands user should start userspace application to open video device and handle v4l2 control requests. USB enumeration is disabled until then. CRs-fixed: 1097684 Change-Id: Ib147959dd8ca4bf6230b1a6adbed67198e0c56bb Signed-off-by: Manu Gautam Signed-off-by: Sriharsha Allenki --- drivers/usb/gadget/Kconfig | 2 + drivers/usb/gadget/android.c | 139 +++++++++++++++- drivers/usb/gadget/function/f_uvc.c | 13 +- drivers/usb/gadget/function/f_uvc.h | 242 ++++++++++++++++++++++++++++ drivers/usb/gadget/function/u_uvc.h | 18 +++ 5 files changed, 407 insertions(+), 7 deletions(-) diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index da01358193072..099a340650932 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -188,6 +188,7 @@ config USB_F_UAC2 tristate config USB_F_UVC + select VIDEOBUF2_VMALLOC tristate config USB_F_MTP @@ -422,6 +423,7 @@ config USB_G_ANDROID select USB_F_NCM select USB_F_MASS_STORAGE select USB_F_UAC1 if SND_PCM + select USB_F_UVC if MEDIA_SUPPORT help The Android Composite Gadget supports multiple USB functions: adb, acm, mass storage, mtp, accessory diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c index baf7c19510985..8d6f9f64d2d0f 100644 --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -36,6 +36,10 @@ #include "gadget_chips.h" +#ifdef CONFIG_MEDIA_SUPPORT +#include "f_uvc.h" +#include "u_uvc.h" +#endif #include "u_fs.h" #include "u_ecm.h" #include "u_ncm.h" @@ -71,6 +75,9 @@ #include "f_mass_storage.h" USB_ETHERNET_MODULE_PARAMETERS(); +#ifdef CONFIG_MEDIA_SUPPORT +USB_VIDEO_MODULE_PARAMETERS(); +#endif #include "debug.h" MODULE_AUTHOR("Mike Lockwood"); @@ -238,6 +245,8 @@ static struct android_configuration *alloc_android_config static void free_android_config(struct android_dev *dev, struct android_configuration *conf); +static bool video_enabled; + /* string IDs are assigned dynamically */ #define STRING_MANUFACTURER_IDX 0 #define STRING_PRODUCT_IDX 1 @@ -520,7 +529,11 @@ static int android_enable(struct android_dev *dev) if (ktime_to_ms(diff) < MIN_DISCONNECT_DELAY_MS) msleep(MIN_DISCONNECT_DELAY_MS - ktime_to_ms(diff)); - usb_gadget_connect(cdev->gadget); + /* Userspace UVC driver will trigger connect for video */ + if (!video_enabled) + usb_gadget_connect(cdev->gadget); + else + pr_debug("defer gadget connect until usersapce opens video device\n"); } return err; @@ -1501,6 +1514,127 @@ static struct android_usb_function audio_function = { }; #endif +#ifdef CONFIG_MEDIA_SUPPORT +/* PERIPHERAL VIDEO */ +struct video_function_config { + struct usb_function *func; + struct usb_function_instance *fi; +}; + +static int video_function_init(struct android_usb_function *f, + struct usb_composite_dev *cdev) +{ + struct f_uvc_opts *uvc_opts; + struct video_function_config *config; + + f->config = kzalloc(sizeof(*config), GFP_KERNEL); + if (!f->config) + return -ENOMEM; + + config = f->config; + + config->fi = usb_get_function_instance("uvc"); + if (IS_ERR(config->fi)) + return PTR_ERR(config->fi); + + uvc_opts = container_of(config->fi, struct f_uvc_opts, func_inst); + + uvc_opts->streaming_interval = streaming_interval; + uvc_opts->streaming_maxpacket = streaming_maxpacket; + uvc_opts->streaming_maxburst = streaming_maxburst; + uvc_set_trace_param(trace); + + uvc_opts->fs_control = uvc_fs_control_cls; + uvc_opts->ss_control = uvc_ss_control_cls; + uvc_opts->fs_streaming = uvc_fs_streaming_cls; + uvc_opts->hs_streaming = uvc_hs_streaming_cls; + uvc_opts->ss_streaming = uvc_ss_streaming_cls; + + config->func = usb_get_function(config->fi); + if (IS_ERR(config->func)) { + usb_put_function_instance(config->fi); + return PTR_ERR(config->func); + } + + return 0; +} + +static void video_function_cleanup(struct android_usb_function *f) +{ + struct video_function_config *config = f->config; + + if (config) { + usb_put_function(config->func); + usb_put_function_instance(config->fi); + } + + kfree(f->config); + f->config = NULL; +} + +static int video_function_bind_config(struct android_usb_function *f, + struct usb_configuration *c) +{ + struct video_function_config *config = f->config; + + return usb_add_function(c, config->func); +} + +static void video_function_enable(struct android_usb_function *f) +{ + video_enabled = true; +} + +static void video_function_disable(struct android_usb_function *f) +{ + video_enabled = false; +} + +static struct android_usb_function video_function = { + .name = "video", + .init = video_function_init, + .cleanup = video_function_cleanup, + .bind_config = video_function_bind_config, + .enable = video_function_enable, + .disable = video_function_disable, +}; + +int video_ready_callback(struct usb_function *function) +{ + struct android_dev *dev = video_function.android_dev; + struct usb_composite_dev *cdev; + + if (!dev) { + pr_err("%s: dev is NULL\n", __func__); + return -ENODEV; + } + + cdev = dev->cdev; + + pr_debug("%s: connect\n", __func__); + usb_gadget_connect(cdev->gadget); + + return 0; +} + +int video_closed_callback(struct usb_function *function) +{ + struct android_dev *dev = video_function.android_dev; + struct usb_composite_dev *cdev; + + if (!dev) { + pr_err("%s: dev is NULL\n", __func__); + return -ENODEV; + } + + cdev = dev->cdev; + + pr_debug("%s: disconnect\n", __func__); + usb_gadget_disconnect(cdev->gadget); + + return 0; +} +#endif /* DIAG */ static char diag_clients[32]; /*enabled DIAG clients- "diag[,diag_mdm]" */ @@ -3088,6 +3222,9 @@ static struct android_usb_function *default_functions[] = { &ecm_qc_function, #ifdef CONFIG_SND_PCM &audio_function, +#endif +#ifdef CONFIG_MEDIA_SUPPORT + &video_function, #endif &rmnet_function, &gps_function, diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c index 945b3bd2ca98a..ac3fea8627caf 100644 --- a/drivers/usb/gadget/function/f_uvc.c +++ b/drivers/usb/gadget/function/f_uvc.c @@ -31,6 +31,7 @@ #include "uvc_v4l2.h" #include "uvc_video.h" #include "u_uvc.h" +#include "f_uvc.h" unsigned int uvc_gadget_trace_param; @@ -412,7 +413,8 @@ uvc_function_connect(struct uvc_device *uvc) struct usb_composite_dev *cdev = uvc->func.config->cdev; int ret; - if ((ret = usb_function_activate(&uvc->func)) < 0) + ret = video_ready_callback(&uvc->func); + if (ret < 0) INFO(cdev, "UVC connect failed with %d\n", ret); } @@ -422,7 +424,8 @@ uvc_function_disconnect(struct uvc_device *uvc) struct usb_composite_dev *cdev = uvc->func.config->cdev; int ret; - if ((ret = usb_function_deactivate(&uvc->func)) < 0) + ret = video_closed_callback(&uvc->func); + if (ret < 0) INFO(cdev, "UVC disconnect failed with %d\n", ret); } @@ -717,11 +720,9 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f) uvc->control_req->complete = uvc_function_ep0_complete; uvc->control_req->context = uvc; - /* Avoid letting this gadget enumerate until the userspace server is - * active. + /* Gadget drivers avoids enumerattion until the userspace server is + * active - when it opens uvc video device node. */ - if ((ret = usb_function_deactivate(f)) < 0) - goto error; if (v4l2_device_register(&cdev->gadget->dev, &uvc->v4l2_dev)) { printk(KERN_INFO "v4l2_device_register failed\n"); diff --git a/drivers/usb/gadget/function/f_uvc.h b/drivers/usb/gadget/function/f_uvc.h index d0a73bdcbba10..8aef0b3aaf6c4 100644 --- a/drivers/usb/gadget/function/f_uvc.h +++ b/drivers/usb/gadget/function/f_uvc.h @@ -24,5 +24,247 @@ void uvc_function_connect(struct uvc_device *uvc); void uvc_function_disconnect(struct uvc_device *uvc); +int video_ready_callback(struct usb_function *function); +int video_closed_callback(struct usb_function *function); + +DECLARE_UVC_HEADER_DESCRIPTOR(1); + +static const struct UVC_HEADER_DESCRIPTOR(1) uvc_control_header = { + .bLength = UVC_DT_HEADER_SIZE(1), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VC_HEADER, + .bcdUVC = cpu_to_le16(0x0100), + .wTotalLength = 0, /* dynamic */ + .dwClockFrequency = cpu_to_le32(48000000), + .bInCollection = 0, /* dynamic */ + .baInterfaceNr[0] = 0, /* dynamic */ +}; + +static const struct uvc_camera_terminal_descriptor uvc_camera_terminal = { + .bLength = UVC_DT_CAMERA_TERMINAL_SIZE(3), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VC_INPUT_TERMINAL, + .bTerminalID = 1, + .wTerminalType = cpu_to_le16(0x0201), + .bAssocTerminal = 0, + .iTerminal = 0, + .wObjectiveFocalLengthMin = cpu_to_le16(0), + .wObjectiveFocalLengthMax = cpu_to_le16(0), + .wOcularFocalLength = cpu_to_le16(0), + .bControlSize = 3, + .bmControls[0] = 2, + .bmControls[1] = 0, + .bmControls[2] = 0, +}; + +static const struct uvc_processing_unit_descriptor uvc_processing = { + .bLength = UVC_DT_PROCESSING_UNIT_SIZE(2), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VC_PROCESSING_UNIT, + .bUnitID = 2, + .bSourceID = 1, + .wMaxMultiplier = cpu_to_le16(16*1024), + .bControlSize = 2, + .bmControls[0] = 1, + .bmControls[1] = 0, + .iProcessing = 0, +}; + +static const struct uvc_output_terminal_descriptor uvc_output_terminal = { + .bLength = UVC_DT_OUTPUT_TERMINAL_SIZE, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VC_OUTPUT_TERMINAL, + .bTerminalID = 3, + .wTerminalType = cpu_to_le16(0x0101), + .bAssocTerminal = 0, + .bSourceID = 2, + .iTerminal = 0, +}; + +DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(1, 2); + +static const struct UVC_INPUT_HEADER_DESCRIPTOR(1, 2) uvc_input_header = { + .bLength = UVC_DT_INPUT_HEADER_SIZE(1, 2), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_INPUT_HEADER, + .bNumFormats = 2, + .wTotalLength = 0, /* dynamic */ + .bEndpointAddress = 0, /* dynamic */ + .bmInfo = 0, + .bTerminalLink = 3, + .bStillCaptureMethod = 0, + .bTriggerSupport = 0, + .bTriggerUsage = 0, + .bControlSize = 1, + .bmaControls[0][0] = 0, + .bmaControls[1][0] = 4, +}; + +static const struct uvc_format_uncompressed uvc_format_yuv = { + .bLength = UVC_DT_FORMAT_UNCOMPRESSED_SIZE, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FORMAT_UNCOMPRESSED, + .bFormatIndex = 1, + .bNumFrameDescriptors = 2, + .guidFormat = { + 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}, + .bBitsPerPixel = 16, + .bDefaultFrameIndex = 1, + .bAspectRatioX = 0, + .bAspectRatioY = 0, + .bmInterfaceFlags = 0, + .bCopyProtect = 0, +}; + +DECLARE_UVC_FRAME_UNCOMPRESSED(1); +DECLARE_UVC_FRAME_UNCOMPRESSED(3); + +static const struct UVC_FRAME_UNCOMPRESSED(3) uvc_frame_yuv_360p = { + .bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE(3), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_UNCOMPRESSED, + .bFrameIndex = 1, + .bmCapabilities = 0, + .wWidth = cpu_to_le16(640), + .wHeight = cpu_to_le16(360), + .dwMinBitRate = cpu_to_le32(18432000), + .dwMaxBitRate = cpu_to_le32(55296000), + .dwMaxVideoFrameBufferSize = cpu_to_le32(460800), + .dwDefaultFrameInterval = cpu_to_le32(666666), + .bFrameIntervalType = 3, + .dwFrameInterval[0] = cpu_to_le32(666666), + .dwFrameInterval[1] = cpu_to_le32(1000000), + .dwFrameInterval[2] = cpu_to_le32(5000000), +}; + +static const struct UVC_FRAME_UNCOMPRESSED(1) uvc_frame_yuv_720p = { + .bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE(1), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_UNCOMPRESSED, + .bFrameIndex = 2, + .bmCapabilities = 0, + .wWidth = cpu_to_le16(1280), + .wHeight = cpu_to_le16(720), + .dwMinBitRate = cpu_to_le32(29491200), + .dwMaxBitRate = cpu_to_le32(29491200), + .dwMaxVideoFrameBufferSize = cpu_to_le32(1843200), + .dwDefaultFrameInterval = cpu_to_le32(5000000), + .bFrameIntervalType = 1, + .dwFrameInterval[0] = cpu_to_le32(5000000), +}; + +static const struct uvc_format_mjpeg uvc_format_mjpg = { + .bLength = UVC_DT_FORMAT_MJPEG_SIZE, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FORMAT_MJPEG, + .bFormatIndex = 2, + .bNumFrameDescriptors = 2, + .bmFlags = 0, + .bDefaultFrameIndex = 1, + .bAspectRatioX = 0, + .bAspectRatioY = 0, + .bmInterfaceFlags = 0, + .bCopyProtect = 0, +}; + +DECLARE_UVC_FRAME_MJPEG(1); +DECLARE_UVC_FRAME_MJPEG(3); + +static const struct UVC_FRAME_MJPEG(3) uvc_frame_mjpg_360p = { + .bLength = UVC_DT_FRAME_MJPEG_SIZE(3), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_MJPEG, + .bFrameIndex = 1, + .bmCapabilities = 0, + .wWidth = cpu_to_le16(640), + .wHeight = cpu_to_le16(360), + .dwMinBitRate = cpu_to_le32(18432000), + .dwMaxBitRate = cpu_to_le32(55296000), + .dwMaxVideoFrameBufferSize = cpu_to_le32(460800), + .dwDefaultFrameInterval = cpu_to_le32(666666), + .bFrameIntervalType = 3, + .dwFrameInterval[0] = cpu_to_le32(666666), + .dwFrameInterval[1] = cpu_to_le32(1000000), + .dwFrameInterval[2] = cpu_to_le32(5000000), +}; + +static const struct UVC_FRAME_MJPEG(1) uvc_frame_mjpg_720p = { + .bLength = UVC_DT_FRAME_MJPEG_SIZE(1), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_MJPEG, + .bFrameIndex = 2, + .bmCapabilities = 0, + .wWidth = cpu_to_le16(1280), + .wHeight = cpu_to_le16(720), + .dwMinBitRate = cpu_to_le32(29491200), + .dwMaxBitRate = cpu_to_le32(29491200), + .dwMaxVideoFrameBufferSize = cpu_to_le32(1843200), + .dwDefaultFrameInterval = cpu_to_le32(5000000), + .bFrameIntervalType = 1, + .dwFrameInterval[0] = cpu_to_le32(5000000), +}; + +static const struct uvc_color_matching_descriptor uvc_color_matching = { + .bLength = UVC_DT_COLOR_MATCHING_SIZE, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_COLORFORMAT, + .bColorPrimaries = 1, + .bTransferCharacteristics = 1, + .bMatrixCoefficients = 4, +}; + +static const struct uvc_descriptor_header * const uvc_fs_control_cls[] = { + (const struct uvc_descriptor_header *) &uvc_control_header, + (const struct uvc_descriptor_header *) &uvc_camera_terminal, + (const struct uvc_descriptor_header *) &uvc_processing, + (const struct uvc_descriptor_header *) &uvc_output_terminal, + NULL, +}; + +static const struct uvc_descriptor_header * const uvc_ss_control_cls[] = { + (const struct uvc_descriptor_header *) &uvc_control_header, + (const struct uvc_descriptor_header *) &uvc_camera_terminal, + (const struct uvc_descriptor_header *) &uvc_processing, + (const struct uvc_descriptor_header *) &uvc_output_terminal, + NULL, +}; + +static const struct uvc_descriptor_header * const uvc_fs_streaming_cls[] = { + (const struct uvc_descriptor_header *) &uvc_input_header, + (const struct uvc_descriptor_header *) &uvc_format_yuv, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_360p, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_720p, + (const struct uvc_descriptor_header *) &uvc_format_mjpg, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p, + (const struct uvc_descriptor_header *) &uvc_color_matching, + NULL, +}; + +static const struct uvc_descriptor_header * const uvc_hs_streaming_cls[] = { + (const struct uvc_descriptor_header *) &uvc_input_header, + (const struct uvc_descriptor_header *) &uvc_format_yuv, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_360p, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_720p, + (const struct uvc_descriptor_header *) &uvc_format_mjpg, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p, + (const struct uvc_descriptor_header *) &uvc_color_matching, + NULL, +}; + +static const struct uvc_descriptor_header * const uvc_ss_streaming_cls[] = { + (const struct uvc_descriptor_header *) &uvc_input_header, + (const struct uvc_descriptor_header *) &uvc_format_yuv, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_360p, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_720p, + (const struct uvc_descriptor_header *) &uvc_format_mjpg, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p, + (const struct uvc_descriptor_header *) &uvc_color_matching, + NULL, +}; + #endif /* _F_UVC_H_ */ diff --git a/drivers/usb/gadget/function/u_uvc.h b/drivers/usb/gadget/function/u_uvc.h index 2a8dfdff03325..824f2ba8874d3 100644 --- a/drivers/usb/gadget/function/u_uvc.h +++ b/drivers/usb/gadget/function/u_uvc.h @@ -18,6 +18,24 @@ #include +/* module parameters specific to the Video streaming endpoint */ +#define USB_VIDEO_MODULE_PARAMETERS() \ + static unsigned int streaming_interval = 1; \ + module_param(streaming_interval, uint, S_IRUGO|S_IWUSR); \ + MODULE_PARM_DESC(streaming_interval, "1 - 16"); \ + \ + static unsigned int streaming_maxpacket = 1024; \ + module_param(streaming_maxpacket, uint, S_IRUGO|S_IWUSR); \ + MODULE_PARM_DESC(streaming_maxpacket, "1-1023 (FS), 1-3072 (hs/ss)"); \ + \ + static unsigned int streaming_maxburst; \ + module_param(streaming_maxburst, uint, S_IRUGO|S_IWUSR); \ + MODULE_PARM_DESC(streaming_maxburst, "0 - 15 (ss only)"); \ + \ + static unsigned int trace; \ + module_param(trace, uint, S_IRUGO|S_IWUSR); \ + MODULE_PARM_DESC(trace, "Trace level bitmask") + #define to_f_uvc_opts(f) container_of(f, struct f_uvc_opts, func_inst) struct f_uvc_opts { From cf545298e37e577867e59f1d6cff7ae3ce2b9100 Mon Sep 17 00:00:00 2001 From: Manu Gautam Date: Tue, 6 Dec 2016 12:42:49 +0530 Subject: [PATCH 0474/1015] usb: android: f_uac2: Add support for UAC2 function Integrate USB Audio class (UAC2) function driver with android gadget. Unlike UAC1 driver, this exposes sound card to allow playback/capture control from userspace. While at it also fix issues related to composition switch, and composite device enumeration that requires updating bFirstIface for IAD descriptor CRs-fixed: 1097689 Change-Id: I6ac8f3b5d9036a81bd2e82c558ff0f93090ce5a9 Signed-off-by: Manu Gautam --- drivers/usb/gadget/Kconfig | 1 + drivers/usb/gadget/android.c | 59 ++++++++++++++++++++++++++++ drivers/usb/gadget/function/f_uac2.c | 51 +++++++++++++++++++++++- drivers/usb/gadget/function/u_uac2.h | 2 +- 4 files changed, 111 insertions(+), 2 deletions(-) diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 099a340650932..5e88699105bc4 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -423,6 +423,7 @@ config USB_G_ANDROID select USB_F_NCM select USB_F_MASS_STORAGE select USB_F_UAC1 if SND_PCM + select USB_F_UAC2 if SND_PCM select USB_F_UVC if MEDIA_SUPPORT help The Android Composite Gadget supports multiple USB diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c index 8d6f9f64d2d0f..44e0b70cbe878 100644 --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -1514,6 +1514,64 @@ static struct android_usb_function audio_function = { }; #endif +/* PERIPHERAL uac2 */ +struct uac2_function_config { + struct usb_function *func; + struct usb_function_instance *fi; +}; + +static int uac2_function_init(struct android_usb_function *f, + struct usb_composite_dev *cdev) +{ + struct uac2_function_config *config; + + f->config = kzalloc(sizeof(*config), GFP_KERNEL); + if (!f->config) + return -ENOMEM; + + config = f->config; + + config->fi = usb_get_function_instance("uac2"); + if (IS_ERR(config->fi)) + return PTR_ERR(config->fi); + + config->func = usb_get_function(config->fi); + if (IS_ERR(config->func)) { + usb_put_function_instance(config->fi); + return PTR_ERR(config->func); + } + + return 0; +} + +static void uac2_function_cleanup(struct android_usb_function *f) +{ + struct uac2_function_config *config = f->config; + + if (config) { + usb_put_function(config->func); + usb_put_function_instance(config->fi); + } + + kfree(f->config); + f->config = NULL; +} + +static int uac2_function_bind_config(struct android_usb_function *f, + struct usb_configuration *c) +{ + struct uac2_function_config *config = f->config; + + return usb_add_function(c, config->func); +} + +static struct android_usb_function uac2_function = { + .name = "uac2_func", + .init = uac2_function_init, + .cleanup = uac2_function_cleanup, + .bind_config = uac2_function_bind_config, +}; + #ifdef CONFIG_MEDIA_SUPPORT /* PERIPHERAL VIDEO */ struct video_function_config { @@ -3222,6 +3280,7 @@ static struct android_usb_function *default_functions[] = { &ecm_qc_function, #ifdef CONFIG_SND_PCM &audio_function, + &uac2_function, #endif #ifdef CONFIG_MEDIA_SUPPORT &video_function, diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index 33e16658e5cfe..8c2f1a37c98a5 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c @@ -522,6 +522,7 @@ static int alsa_uac2_init(struct audio_dev *agdev) struct snd_uac2_chip *uac2 = &agdev->uac2; int err; + memset(&uac2->pdev, 0, sizeof(uac2->pdev)); uac2->pdrv.probe = snd_uac2_probe; uac2->pdrv.remove = snd_uac2_remove; uac2->pdrv.driver.name = uac2_name; @@ -791,6 +792,13 @@ struct usb_endpoint_descriptor hs_epout_desc = { .bInterval = 4, }; +static struct usb_ss_ep_comp_descriptor ss_epout_comp_desc = { + .bLength = sizeof(ss_epout_comp_desc), + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, + + .wBytesPerInterval = cpu_to_le16(1024), +}; + /* CS AS ISO OUT Endpoint */ static struct uac2_iso_endpoint_descriptor as_iso_out_desc = { .bLength = sizeof as_iso_out_desc, @@ -868,6 +876,13 @@ struct usb_endpoint_descriptor hs_epin_desc = { .bInterval = 4, }; +static struct usb_ss_ep_comp_descriptor ss_epin_comp_desc = { + .bLength = sizeof(ss_epin_comp_desc), + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, + + .wBytesPerInterval = cpu_to_le16(1024), +}; + /* CS AS ISO IN Endpoint */ static struct uac2_iso_endpoint_descriptor as_iso_in_desc = { .bLength = sizeof as_iso_in_desc, @@ -940,6 +955,38 @@ static struct usb_descriptor_header *hs_audio_desc[] = { NULL, }; +static struct usb_descriptor_header *ss_audio_desc[] = { + (struct usb_descriptor_header *)&iad_desc, + (struct usb_descriptor_header *)&std_ac_if_desc, + + (struct usb_descriptor_header *)&ac_hdr_desc, + (struct usb_descriptor_header *)&in_clk_src_desc, + (struct usb_descriptor_header *)&out_clk_src_desc, + (struct usb_descriptor_header *)&usb_out_it_desc, + (struct usb_descriptor_header *)&io_in_it_desc, + (struct usb_descriptor_header *)&usb_in_ot_desc, + (struct usb_descriptor_header *)&io_out_ot_desc, + + (struct usb_descriptor_header *)&std_as_out_if0_desc, + (struct usb_descriptor_header *)&std_as_out_if1_desc, + + (struct usb_descriptor_header *)&as_out_hdr_desc, + (struct usb_descriptor_header *)&as_out_fmt1_desc, + (struct usb_descriptor_header *)&hs_epout_desc, + (struct usb_descriptor_header *)&ss_epout_comp_desc, + (struct usb_descriptor_header *)&as_iso_out_desc, + + (struct usb_descriptor_header *)&std_as_in_if0_desc, + (struct usb_descriptor_header *)&std_as_in_if1_desc, + + (struct usb_descriptor_header *)&as_in_hdr_desc, + (struct usb_descriptor_header *)&as_in_fmt1_desc, + (struct usb_descriptor_header *)&hs_epin_desc, + (struct usb_descriptor_header *)&ss_epin_comp_desc, + (struct usb_descriptor_header *)&as_iso_in_desc, + NULL, +}; + struct cntrl_cur_lay3 { __u32 dCUR; }; @@ -1030,6 +1077,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) return ret; } std_ac_if_desc.bInterfaceNumber = ret; + iad_desc.bFirstInterface = ret; agdev->ac_intf = ret; agdev->ac_alt = 0; @@ -1075,7 +1123,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress; hs_epin_desc.wMaxPacketSize = fs_epin_desc.wMaxPacketSize; - ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, NULL); + ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, + ss_audio_desc); if (ret) goto err; diff --git a/drivers/usb/gadget/function/u_uac2.h b/drivers/usb/gadget/function/u_uac2.h index 78dd37279bd45..9c4f4bdf05493 100644 --- a/drivers/usb/gadget/function/u_uac2.h +++ b/drivers/usb/gadget/function/u_uac2.h @@ -18,7 +18,7 @@ #include -#define UAC2_DEF_PCHMASK 0x3 +#define UAC2_DEF_PCHMASK 0x1 #define UAC2_DEF_PSRATE 48000 #define UAC2_DEF_PSSIZE 2 #define UAC2_DEF_CCHMASK 0x3 From 1eb63b17ee60021f5602272fd09662d3e78a9b12 Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Fri, 9 Dec 2016 17:09:32 +0530 Subject: [PATCH 0475/1015] usb: gadget: Support H264 format for f_uvc driver Added support for H264 payload format and UVC 1.5 specification for existing f_uvc driver. Change-Id: I2bad365dc6af7473bb2a62cc013da6e83c209811 Signed-off-by: Sriharsha Allenki --- drivers/usb/gadget/function/f_uvc.c | 6 +- drivers/usb/gadget/function/f_uvc.h | 110 ++++++++++++++++++++++++++-- include/uapi/linux/usb/video.h | 93 +++++++++++++++++++++++ 3 files changed, 198 insertions(+), 11 deletions(-) diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c index ac3fea8627caf..80c4f51ae1754 100644 --- a/drivers/usb/gadget/function/f_uvc.c +++ b/drivers/usb/gadget/function/f_uvc.c @@ -84,7 +84,7 @@ static struct usb_interface_descriptor uvc_control_intf = { .bNumEndpoints = 1, .bInterfaceClass = USB_CLASS_VIDEO, .bInterfaceSubClass = UVC_SC_VIDEOCONTROL, - .bInterfaceProtocol = 0x00, + .bInterfaceProtocol = 0x01, .iInterface = 0, }; @@ -121,7 +121,7 @@ static struct usb_interface_descriptor uvc_streaming_intf_alt0 = { .bNumEndpoints = 0, .bInterfaceClass = USB_CLASS_VIDEO, .bInterfaceSubClass = UVC_SC_VIDEOSTREAMING, - .bInterfaceProtocol = 0x00, + .bInterfaceProtocol = 0x01, .iInterface = 0, }; @@ -133,7 +133,7 @@ static struct usb_interface_descriptor uvc_streaming_intf_alt1 = { .bNumEndpoints = 1, .bInterfaceClass = USB_CLASS_VIDEO, .bInterfaceSubClass = UVC_SC_VIDEOSTREAMING, - .bInterfaceProtocol = 0x00, + .bInterfaceProtocol = 0x01, .iInterface = 0, }; diff --git a/drivers/usb/gadget/function/f_uvc.h b/drivers/usb/gadget/function/f_uvc.h index 8aef0b3aaf6c4..f263c805288a8 100644 --- a/drivers/usb/gadget/function/f_uvc.h +++ b/drivers/usb/gadget/function/f_uvc.h @@ -33,7 +33,7 @@ static const struct UVC_HEADER_DESCRIPTOR(1) uvc_control_header = { .bLength = UVC_DT_HEADER_SIZE(1), .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VC_HEADER, - .bcdUVC = cpu_to_le16(0x0100), + .bcdUVC = cpu_to_le16(0x0150), .wTotalLength = 0, /* dynamic */ .dwClockFrequency = cpu_to_le32(48000000), .bInCollection = 0, /* dynamic */ @@ -52,7 +52,7 @@ static const struct uvc_camera_terminal_descriptor uvc_camera_terminal = { .wObjectiveFocalLengthMax = cpu_to_le16(0), .wOcularFocalLength = cpu_to_le16(0), .bControlSize = 3, - .bmControls[0] = 2, + .bmControls[0] = 14, .bmControls[1] = 0, .bmControls[2] = 0, }; @@ -65,8 +65,8 @@ static const struct uvc_processing_unit_descriptor uvc_processing = { .bSourceID = 1, .wMaxMultiplier = cpu_to_le16(16*1024), .bControlSize = 2, - .bmControls[0] = 1, - .bmControls[1] = 0, + .bmControls[0] = 64, + .bmControls[1] = 16, .iProcessing = 0, }; @@ -81,13 +81,13 @@ static const struct uvc_output_terminal_descriptor uvc_output_terminal = { .iTerminal = 0, }; -DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(1, 2); +DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(1, 3); -static const struct UVC_INPUT_HEADER_DESCRIPTOR(1, 2) uvc_input_header = { - .bLength = UVC_DT_INPUT_HEADER_SIZE(1, 2), +static const struct UVC_INPUT_HEADER_DESCRIPTOR(1, 3) uvc_input_header = { + .bLength = UVC_DT_INPUT_HEADER_SIZE(1, 3), .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VS_INPUT_HEADER, - .bNumFormats = 2, + .bNumFormats = 3, .wTotalLength = 0, /* dynamic */ .bEndpointAddress = 0, /* dynamic */ .bmInfo = 0, @@ -98,6 +98,7 @@ static const struct UVC_INPUT_HEADER_DESCRIPTOR(1, 2) uvc_input_header = { .bControlSize = 1, .bmaControls[0][0] = 0, .bmaControls[1][0] = 4, + .bmaControls[2][0] = 0, }; static const struct uvc_format_uncompressed uvc_format_yuv = { @@ -205,6 +206,90 @@ static const struct UVC_FRAME_MJPEG(1) uvc_frame_mjpg_720p = { .dwFrameInterval[0] = cpu_to_le32(5000000), }; +static const struct uvc_format_h264 uvc_fmt_h264 = { + .bLength = UVC_DT_FORMAT_H264_SIZE, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FORMAT_H264, + .bFormatIndex = 3, + .bNumFrameDescriptors = 2, + .bDefaultFrameIndex = 1, + .bMaxCodecConfigDelay = 0x4, + .bmSupportedSliceModes = 0, + .bmSupportedSyncFrameTypes = 0x76, + .bResolutionScaling = 0, + .Reserved1 = 0, + .bmSupportedRateControlModes = 0x3F, + .wMaxMBperSecOneResNoScalability = cpu_to_le16(972), + .wMaxMBperSecTwoResNoScalability = 0, + .wMaxMBperSecThreeResNoScalability = 0, + .wMaxMBperSecFourResNoScalability = 0, + .wMaxMBperSecOneResTemporalScalability = cpu_to_le16(972), + .wMaxMBperSecTwoResTemporalScalability = 0, + .wMaxMBperSecThreeResTemporalScalability = 0, + .wMaxMBperSecFourResTemporalScalability = 0, + .wMaxMBperSecOneResTemporalQualityScalability = cpu_to_le16(972), + .wMaxMBperSecTwoResTemporalQualityScalability = 0, + .wMaxMBperSecThreeResTemporalQualityScalability = 0, + .wMaxMBperSecFourResTemporalQualityScalability = 0, + .wMaxMBperSecOneResTemporalSpatialScalability = 0, + .wMaxMBperSecTwoResTemporalSpatialScalability = 0, + .wMaxMBperSecThreeResTemporalSpatialScalability = 0, + .wMaxMBperSecFourResTemporalSpatialScalability = 0, + .wMaxMBperSecOneResFullScalability = 0, + .wMaxMBperSecTwoResFullScalability = 0, + .wMaxMBperSecThreeResFullScalability = 0, + .wMaxMBperSecFourResFullScalability = 0, +}; + +DECLARE_UVC_FRAME_H264(1); +DECLARE_UVC_FRAME_H264(3); + +static const struct UVC_FRAME_H264(1) uvc_frame_h264_1920p = { + .bLength = UVC_DT_FRAME_H264_SIZE(1), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_H264, + .bFrameIndex = 1, + .wWidth = cpu_to_le16(3840), + .wHeight = cpu_to_le16(1920), + .wSARwidth = 0, + .wSARheight = 0, + .wProfile = 0x6400, + .bLevelIDC = 0x33, + .bmSupportedUsages = 0x70003, + .wConstrainedToolset = cpu_to_le16(0), + .bmCapabilities = 0x47, + .bmSVCCapabilities = 0x4, + .bmMVCCapabilities = 0, + .dwMinBitRate = cpu_to_le16(29491200), + .dwMaxBitRate = cpu_to_le16(100000000), + .dwDefaultFrameInterval = cpu_to_le16(333667), + .bNumFrameIntervals = 1, + .dwFrameInterval[0] = cpu_to_le16(333667), +}; + +static const struct UVC_FRAME_H264(3) uvc_frame_h264_960p = { + .bLength = UVC_DT_FRAME_H264_SIZE(3), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_H264, + .bFrameIndex = 2, + .wWidth = cpu_to_le16(1920), + .wHeight = cpu_to_le16(960), + .wSARwidth = 0, + .wSARheight = 0, + .wProfile = 0x6400, + .bLevelIDC = 0x28, + .bmSupportedUsages = 0x70003, + .wConstrainedToolset = cpu_to_le16(0), + .bmCapabilities = 0x47, + .bmSVCCapabilities = 0x4, + .bmMVCCapabilities = 0, + .dwMinBitRate = cpu_to_le16(29491200), + .dwMaxBitRate = cpu_to_le16(100000000), + .dwDefaultFrameInterval = cpu_to_le16(333667), + .bNumFrameIntervals = 1, + .dwFrameInterval[0] = cpu_to_le16(333667), +}; + static const struct uvc_color_matching_descriptor uvc_color_matching = { .bLength = UVC_DT_COLOR_MATCHING_SIZE, .bDescriptorType = USB_DT_CS_INTERFACE, @@ -238,6 +323,9 @@ static const struct uvc_descriptor_header * const uvc_fs_streaming_cls[] = { (const struct uvc_descriptor_header *) &uvc_format_mjpg, (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p, (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p, + (const struct uvc_descriptor_header *) &uvc_fmt_h264, + (const struct uvc_descriptor_header *) &uvc_frame_h264_960p, + (const struct uvc_descriptor_header *) &uvc_frame_h264_1920p, (const struct uvc_descriptor_header *) &uvc_color_matching, NULL, }; @@ -250,6 +338,9 @@ static const struct uvc_descriptor_header * const uvc_hs_streaming_cls[] = { (const struct uvc_descriptor_header *) &uvc_format_mjpg, (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p, (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p, + (const struct uvc_descriptor_header *) &uvc_fmt_h264, + (const struct uvc_descriptor_header *) &uvc_frame_h264_960p, + (const struct uvc_descriptor_header *) &uvc_frame_h264_1920p, (const struct uvc_descriptor_header *) &uvc_color_matching, NULL, }; @@ -262,6 +353,9 @@ static const struct uvc_descriptor_header * const uvc_ss_streaming_cls[] = { (const struct uvc_descriptor_header *) &uvc_format_mjpg, (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p, (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p, + (const struct uvc_descriptor_header *) &uvc_fmt_h264, + (const struct uvc_descriptor_header *) &uvc_frame_h264_960p, + (const struct uvc_descriptor_header *) &uvc_frame_h264_1920p, (const struct uvc_descriptor_header *) &uvc_color_matching, NULL, }; diff --git a/include/uapi/linux/usb/video.h b/include/uapi/linux/usb/video.h index 3b3b95e01f71b..b3e408dc062c1 100644 --- a/include/uapi/linux/usb/video.h +++ b/include/uapi/linux/usb/video.h @@ -53,6 +53,8 @@ #define UVC_VS_FORMAT_FRAME_BASED 0x10 #define UVC_VS_FRAME_FRAME_BASED 0x11 #define UVC_VS_FORMAT_STREAM_BASED 0x12 +#define UVC_VS_FORMAT_H264 0x13 +#define UVC_VS_FRAME_H264 0x14 /* A.7. Video Class-Specific Endpoint Descriptor Subtypes */ #define UVC_EP_UNDEFINED 0x00 @@ -564,5 +566,96 @@ struct UVC_FRAME_MJPEG(n) { \ __u32 dwFrameInterval[n]; \ } __attribute__ ((packed)) +/* H264 Payload - 3.1.1. H264 Video Format Descriptor */ +struct uvc_format_h264 { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bFormatIndex; + __u8 bNumFrameDescriptors; + __u8 bDefaultFrameIndex; + __u8 bMaxCodecConfigDelay; + __u8 bmSupportedSliceModes; + __u8 bmSupportedSyncFrameTypes; + __u8 bResolutionScaling; + __u8 Reserved1; + __u8 bmSupportedRateControlModes; + __u16 wMaxMBperSecOneResNoScalability; + __u16 wMaxMBperSecTwoResNoScalability; + __u16 wMaxMBperSecThreeResNoScalability; + __u16 wMaxMBperSecFourResNoScalability; + __u16 wMaxMBperSecOneResTemporalScalability; + __u16 wMaxMBperSecTwoResTemporalScalability; + __u16 wMaxMBperSecThreeResTemporalScalability; + __u16 wMaxMBperSecFourResTemporalScalability; + __u16 wMaxMBperSecOneResTemporalQualityScalability; + __u16 wMaxMBperSecTwoResTemporalQualityScalability; + __u16 wMaxMBperSecThreeResTemporalQualityScalability; + __u16 wMaxMBperSecFourResTemporalQualityScalability; + __u16 wMaxMBperSecOneResTemporalSpatialScalability; + __u16 wMaxMBperSecTwoResTemporalSpatialScalability; + __u16 wMaxMBperSecThreeResTemporalSpatialScalability; + __u16 wMaxMBperSecFourResTemporalSpatialScalability; + __u16 wMaxMBperSecOneResFullScalability; + __u16 wMaxMBperSecTwoResFullScalability; + __u16 wMaxMBperSecThreeResFullScalability; + __u16 wMaxMBperSecFourResFullScalability; +} __attribute__((__packed__)); + +#define UVC_DT_FORMAT_H264_SIZE 52 + +/* H264 Payload - 3.1.2. H264 Video Frame Descriptor */ +struct uvc_frame_h264 { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bFrameIndex; + __u16 wWidth; + __u16 wHeight; + __u16 wSARwidth; + __u16 wSARheight; + __u16 wProfile; + __u8 bLevelIDC; + __u16 wConstrainedToolset; + __u32 bmSupportedUsages; + __u16 bmCapabilities; + __u32 bmSVCCapabilities; + __u32 bmMVCCapabilities; + __u32 dwMinBitRate; + __u32 dwMaxBitRate; + __u32 dwDefaultFrameInterval; + __u8 bNumFrameIntervals; + __u32 dwFrameInterval[]; +} __attribute__((__packed__)); + +#define UVC_DT_FRAME_H264_SIZE(n) (44+4*(n)) + +#define UVC_FRAME_H264(n) \ + uvc_frame_h264_##n + +#define DECLARE_UVC_FRAME_H264(n) \ +struct UVC_FRAME_H264(n) { \ + __u8 bLength; \ + __u8 bDescriptorType; \ + __u8 bDescriptorSubType; \ + __u8 bFrameIndex; \ + __u16 wWidth; \ + __u16 wHeight; \ + __u16 wSARwidth; \ + __u16 wSARheight; \ + __u16 wProfile; \ + __u8 bLevelIDC; \ + __u16 wConstrainedToolset; \ + __u32 bmSupportedUsages; \ + __u16 bmCapabilities; \ + __u32 bmSVCCapabilities; \ + __u32 bmMVCCapabilities; \ + __u32 dwMinBitRate; \ + __u32 dwMaxBitRate; \ + __u32 dwDefaultFrameInterval; \ + __u8 bNumFrameIntervals; \ + __u32 dwFrameInterval[n]; \ +} __attribute__ ((packed)) + #endif /* __LINUX_USB_VIDEO_H */ From 5495002b70afd77865befe9a02ba5649854c0853 Mon Sep 17 00:00:00 2001 From: Trishansh Bhardwaj Date: Thu, 15 Dec 2016 10:58:13 +0530 Subject: [PATCH 0476/1015] msm: isp: Prevents interrupt storm on ISPIF overflow. Prevents interrupt storm by masking overflow interrupt in overflow handling. CRs-Fixed: 1100241 Change-Id: I30cefb14e7562ede3257d227ed4baf892b9fdadd Signed-off-by: Trishansh Bhardwaj --- drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c index 39e451c0dccae..31d366c41aa44 100644 --- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c +++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c @@ -1323,6 +1323,12 @@ static inline void msm_ispif_read_irq_status(struct ispif_irq_status *out, pr_err_ratelimited("%s: fatal error, stop ispif immediately\n", __func__); for (i = 0; i < ispif->vfe_info.num_vfe; i++) { + msm_camera_io_w(0x0, + ispif->base + ISPIF_VFE_m_IRQ_MASK_0(i)); + msm_camera_io_w(0x0, + ispif->base + ISPIF_VFE_m_IRQ_MASK_1(i)); + msm_camera_io_w(0x0, + ispif->base + ISPIF_VFE_m_IRQ_MASK_2(i)); msm_camera_io_w(ISPIF_STOP_INTF_IMMEDIATELY, ispif->base + ISPIF_VFE_m_INTF_CMD_0(i)); msm_camera_io_w(ISPIF_STOP_INTF_IMMEDIATELY, From 7bba7010a70a418612419d533baa59b1ab7d0c61 Mon Sep 17 00:00:00 2001 From: Ramesh V Date: Sat, 24 Dec 2016 16:58:22 +0530 Subject: [PATCH 0477/1015] msm: camera: Fix frame ID jump in dualcam. In B+M there is no guarantee in order for B first then M,if order reverse then we see frame id jump to fix this, reset frameid when isp decide master/slave. Change-Id: Ic403fdc93af1157e00f024a9cacb375de1ee4d7e Signed-off-by: Ramesh V --- .../platform/msm/camera_v2/isp/msm_isp_axi_util.c | 12 +----------- .../media/platform/msm/camera_v2/isp/msm_isp_util.c | 8 ++++++++ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index b392144e86077..672aa6e6c5013 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -821,11 +821,10 @@ void msm_isp_increment_frame_id(struct vfe_device *vfe_dev, uint32_t sof_incr = 0; unsigned long flags; + spin_lock_irqsave(&vfe_dev->common_data->common_dev_data_lock, flags); if (vfe_dev->axi_data.src_info[frame_src].frame_id == 0) msm_isp_update_dual_HW_ms_info_at_start(vfe_dev, frame_src, ts); - - spin_lock_irqsave(&vfe_dev->common_data->common_dev_data_lock, flags); dual_hw_type = vfe_dev->axi_data.src_info[frame_src].dual_hw_type; ms_type = @@ -2507,7 +2506,6 @@ static int msm_isp_update_dual_HW_ms_info_at_start( struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; struct msm_vfe_src_info *src_info = NULL; uint32_t vfe_id = 0; - unsigned long flags; if (stream_src >= VFE_SRC_MAX) { pr_err("%s: Error! Invalid src %u\n", __func__, stream_src); @@ -2518,12 +2516,9 @@ static int msm_isp_update_dual_HW_ms_info_at_start( if (src_info->dual_hw_type != DUAL_HW_MASTER_SLAVE) return rc; - spin_lock_irqsave(&vfe_dev->common_data->common_dev_data_lock, flags); if (src_info->dual_hw_ms_info.dual_hw_ms_type == MS_TYPE_MASTER) { if (vfe_dev->common_data->ms_resource.master_active == 1) { - spin_unlock_irqrestore(&vfe_dev->common_data-> - common_dev_data_lock, flags); return rc; } @@ -2536,8 +2531,6 @@ static int msm_isp_update_dual_HW_ms_info_at_start( * without repeating. */ if (!vfe_dev->common_data->ms_resource.slave_active_mask) { - spin_unlock_irqrestore(&vfe_dev->common_data-> - common_dev_data_lock, flags); return rc; } cur_timestamp_ms = ts->buf_time.tv_sec * 1000 + @@ -2589,9 +2582,6 @@ static int msm_isp_update_dual_HW_ms_info_at_start( (1 << slave_id); } } - spin_unlock_irqrestore(&vfe_dev->common_data->common_dev_data_lock, - flags); - return rc; } diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index 6d5350c2bbc76..a21205d4209c5 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -564,6 +564,14 @@ static int msm_isp_set_dual_HW_master_slave_mode( } /* No lock needed here since ioctl lock protects 2 session from race */ + /* reset master SOF which refer slave in increment_frame_id function + * + */ + vfe_dev->common_data->ms_resource.master_sof_info.frame_id = 0; + vfe_dev->common_data->ms_resource.master_sof_info.mono_timestamp_ms = 0; + /* we have only 1 slave so reset it frame_id so that master will + * not jump*/ + vfe_dev->common_data->ms_resource.slave_sof_info[0].frame_id = 0; if (src_info != NULL && dual_hw_ms_cmd->dual_hw_ms_type == MS_TYPE_MASTER) { src_info->dual_hw_type = DUAL_HW_MASTER_SLAVE; From 88eb1b307dfd164ea80aa0d0d57ee0b178cbb786 Mon Sep 17 00:00:00 2001 From: Krishna Manikandan Date: Fri, 18 Nov 2016 16:09:19 +0530 Subject: [PATCH 0478/1015] msm: mdss: Add check to fix null pointer dereference In mdss_mdp_overlay_kickoff, the mixer_left can be accessed without checking whether it is allocated or not which can result in null pointer dereference. This is fixed by adding a check to decide if mixer_left is NULL or not. CRs-Fixed: 1070611 Change-Id: I4b5c71de1a568ba9a39a4e84bde4bf03a044ed7c Signed-off-by: Krishna Manikandan --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index bd6c02e8b4a7f..7e9a14e0401d3 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -2005,7 +2005,7 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, struct mdss_mdp_commit_cb commit_cb; u8 sd_transition_state = 0; - if (!ctl) + if (!ctl || !ctl->mixer_left) return -ENODEV; ATRACE_BEGIN(__func__); From 03786bc15621b0c9398ea2ae976ef85f3203658b Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 6 Dec 2016 18:34:40 -0800 Subject: [PATCH 0479/1015] sound: usb: Handle implicit feedback data endpoint properly For the devices supporting implicit feedback over data endpoint usb audio driver instantiates snd_usb_endpoint as sync_endpoint even though there is no real usb sync endpoint exists. QMI driver looks for usb endpoint if sync_endpoint is instantiated and bails out if endpoint related context does not exist. This causes such devices to not work. Hence do not bail out if sync ep context does not exist and continue preparing the QMI response. Change-Id: I7d96555573cfd6cca1ca56c877d78fde943f8100 Signed-off-by: Hemant Kumar --- sound/usb/usb_audio_qmi_svc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index bf1600dbf24bd..8e6a1903a1540 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -232,9 +232,8 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, if (subs->sync_endpoint) { ep = usb_pipe_endpoint(subs->dev, subs->sync_endpoint->pipe); if (!ep) { - pr_err("%s: sync ep # %d context is null\n", __func__, - subs->sync_endpoint->ep_num); - goto err; + pr_debug("%s: implicit fb on data ep\n", __func__); + goto skip_sync_ep; } memcpy(&resp->std_as_sync_ep_desc, &ep->desc, sizeof(ep->desc)); resp->std_as_sync_ep_desc_valid = 1; @@ -248,6 +247,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, resp->xhci_mem_info.tr_sync.pa = xhci_pa; } +skip_sync_ep: resp->interrupter_num = uaudio_qdev->intr_num; resp->interrupter_num_valid = 1; From a005caec0c3402011860d389c437871afb277ea8 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Fri, 9 Dec 2016 19:35:26 -0800 Subject: [PATCH 0480/1015] usb: xhci: Acknowledge pending events in secondary event ring As part of bus suspend if xHC is halted when there are pending events in the event ring, xHC stops responding to xhci commands upon host or device initiated bus resume. Fix this issue by going over all the pending events and writing address of xHC event ring enqueue pointer to ERDP register. This indicates to xHC that system software has processed all Events in the ring. Change-Id: I0c1fafb03c9848d043599fcee19e9bf07c3a3acd Signed-off-by: Hemant Kumar --- drivers/usb/host/xhci-mem.c | 100 +++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 24 deletions(-) diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 447c2177e1636..42dcb732ad99a 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1792,11 +1792,84 @@ void xhci_free_command(struct xhci_hcd *xhci, kfree(command); } +void xhci_handle_sec_intr_events(struct xhci_hcd *xhci, int intr_num) +{ + union xhci_trb *erdp_trb, *current_trb; + struct xhci_segment *seg; + u64 erdp_reg; + u32 iman_reg; + dma_addr_t deq; + unsigned long segment_offset; + + /* disable irq, ack pending interrupt and ack all pending events */ + + iman_reg = + readl_relaxed(&xhci->sec_ir_set[intr_num]->irq_pending); + iman_reg &= ~IMAN_IE; + writel_relaxed(iman_reg, + &xhci->sec_ir_set[intr_num]->irq_pending); + iman_reg = + readl_relaxed(&xhci->sec_ir_set[intr_num]->irq_pending); + if (iman_reg & IMAN_IP) + writel_relaxed(iman_reg, + &xhci->sec_ir_set[intr_num]->irq_pending); + + /* last acked event trb is in erdp reg */ + erdp_reg = + xhci_read_64(xhci, &xhci->sec_ir_set[intr_num]->erst_dequeue); + deq = (dma_addr_t)(erdp_reg & ~ERST_PTR_MASK); + if (!deq) { + pr_debug("%s: event ring handling not required\n", __func__); + return; + } + + seg = xhci->sec_event_ring[intr_num]->first_seg; + segment_offset = deq - seg->dma; + + /* find out virtual address of the last acked event trb */ + erdp_trb = current_trb = &seg->trbs[0] + + (segment_offset/sizeof(*current_trb)); + + /* read cycle state of the last acked trb to find out CCS */ + xhci->sec_event_ring[intr_num]->cycle_state = + (current_trb->event_cmd.flags & TRB_CYCLE); + + while (1) { + /* last trb of the event ring: toggle cycle state */ + if (current_trb == &seg->trbs[TRBS_PER_SEGMENT - 1]) { + xhci->sec_event_ring[intr_num]->cycle_state ^= 1; + current_trb = &seg->trbs[0]; + } else { + current_trb++; + } + + /* cycle state transition */ + if ((le32_to_cpu(current_trb->event_cmd.flags) & TRB_CYCLE) != + xhci->sec_event_ring[intr_num]->cycle_state) + break; + } + + if (erdp_trb != current_trb) { + deq = + xhci_trb_virt_to_dma(xhci->sec_event_ring[intr_num]->deq_seg, + current_trb); + if (deq == 0) + xhci_warn(xhci, + "WARN ivalid SW event ring dequeue ptr.\n"); + /* Update HC event ring dequeue pointer */ + erdp_reg &= ERST_PTR_MASK; + erdp_reg |= ((u64) deq & (u64) ~ERST_PTR_MASK); + } + + /* Clear the event handler busy flag (RW1C); event ring is empty. */ + erdp_reg |= ERST_EHB; + xhci_write_64(xhci, erdp_reg, + &xhci->sec_ir_set[intr_num]->erst_dequeue); +} + int xhci_sec_event_ring_cleanup(struct usb_hcd *hcd, unsigned intr_num) { int size; - u32 iman_reg; - u64 erdp_reg; struct xhci_hcd *xhci = hcd_to_xhci(hcd); struct device *dev = xhci_to_hcd(xhci)->self.controller; @@ -1809,28 +1882,7 @@ int xhci_sec_event_ring_cleanup(struct usb_hcd *hcd, unsigned intr_num) size = sizeof(struct xhci_erst_entry)*(xhci->sec_erst[intr_num].num_entries); if (xhci->sec_erst[intr_num].entries) { - /* - * disable irq, ack pending interrupt and clear EHB for xHC to - * generate interrupt again when new event ring is setup - */ - iman_reg = - readl_relaxed(&xhci->sec_ir_set[intr_num]->irq_pending); - iman_reg &= ~IMAN_IE; - writel_relaxed(iman_reg, - &xhci->sec_ir_set[intr_num]->irq_pending); - iman_reg = - readl_relaxed(&xhci->sec_ir_set[intr_num]->irq_pending); - if (iman_reg & IMAN_IP) - writel_relaxed(iman_reg, - &xhci->sec_ir_set[intr_num]->irq_pending); - /* make sure IP gets cleared before clearing EHB */ - mb(); - - erdp_reg = xhci_read_64(xhci, - &xhci->sec_ir_set[intr_num]->erst_dequeue); - xhci_write_64(xhci, erdp_reg | ERST_EHB, - &xhci->sec_ir_set[intr_num]->erst_dequeue); - + xhci_handle_sec_intr_events(xhci, intr_num); dma_free_coherent(dev, size, xhci->sec_erst[intr_num].entries, xhci->sec_erst[intr_num].erst_dma_addr); xhci->sec_erst[intr_num].entries = NULL; From e0f91810815e698e32718c040d2276ecc1539693 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Fri, 9 Dec 2016 20:37:53 -0800 Subject: [PATCH 0481/1015] usb: core: Allow secondary event ring clean upon disconnect If device is disconnected in the middle of data transfer there is a possibility of pending events in the secondary event ring. As a result when xHC is halted as part of device disconnect, device is not getting detected upon re-connect. Fix the issue by acknowledging the pending events upon device disconnect. Also this allows to finish the clean up of event ring otherwise this results into a memory leak. Change-Id: I2ec3d74867e0129dad395d1dbe920b468ac5949d Signed-off-by: Hemant Kumar --- drivers/usb/core/usb.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index cb4bd7b4a4367..aae67e0e94db5 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -668,9 +668,6 @@ EXPORT_SYMBOL(usb_sec_event_ring_setup); int usb_sec_event_ring_cleanup(struct usb_device *dev, unsigned intr_num) { - if (dev->state == USB_STATE_NOTATTACHED) - return 0; - return usb_hcd_sec_event_ring_cleanup(dev, intr_num); } EXPORT_SYMBOL(usb_sec_event_ring_cleanup); From 86556dd4ff68463225abc3e0fb5e2ba9815847b6 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 13 Dec 2016 18:13:56 -0800 Subject: [PATCH 0482/1015] sound: usb: auto suspend device only if it supports remote wakeup Some usb headsets which do not support remote wakeup when suspended and resumed by host resulting device disconnect. Hence do not suspend device if it not remote wake up capable. Change-Id: Ia2462116582b6e22c44cff88df2872e4127e5e29 Signed-off-by: Hemant Kumar --- sound/usb/card.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/usb/card.c b/sound/usb/card.c index b2d3a9801693c..b51db0fb9ea19 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -647,6 +647,7 @@ snd_usb_audio_probe(struct usb_device *dev, usb_chip[chip->index] = chip; chip->num_interfaces++; chip->probing = 0; + intf->needs_remote_wakeup = 1; mutex_unlock(®ister_mutex); return chip; From 0e9f920024ece04a19372c92f0976b6ca0ed7136 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Wed, 14 Dec 2016 13:19:40 -0800 Subject: [PATCH 0483/1015] sound: usb: Handle audio control interface descriptor properly usb audio qmi driver is incorrectly passing non-zero alternate interface related class specific buffer to parse the UAC header. This is causing driver to respond with incorrect bcdADC value. Fix this issue by reading the cached audio control interface context which is saved upon driver probe for the first audio interface. Also differentiate UAC version of header when type casting the UAC header descriptor. Change-Id: Ice62887451e91901cb16a6356b64f554b95eacc4 Signed-off-by: Hemant Kumar --- sound/usb/usb_audio_qmi_svc.c | 38 ++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index 8e6a1903a1540..eb44d31f5a244 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,8 @@ struct intf_info { struct uaudio_dev { struct usb_device *udev; + /* audio control interface */ + struct usb_host_interface *ctrl_intf; unsigned int card_num; atomic_t in_use; struct kref kref; @@ -139,8 +142,8 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, struct uac_format_type_i_discrete_descriptor *fmt_v1; struct uac_format_type_i_ext_descriptor *fmt_v2; struct uac1_as_header_descriptor *as; - struct uac1_ac_header_descriptor *ac; int protocol; + void *hdr_ptr; u8 *xfer_buf; u32 len, mult, remainder; phys_addr_t xhci_pa, xfer_buf_pa; @@ -173,6 +176,19 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, goto err; } + if (!uadev[card_num].ctrl_intf) { + pr_err("%s: audio ctrl intf info not cached\n", __func__); + goto err; + } + + hdr_ptr = snd_usb_find_csint_desc(uadev[card_num].ctrl_intf->extra, + uadev[card_num].ctrl_intf->extralen, + NULL, UAC_HEADER); + if (!hdr_ptr) { + pr_err("%s: no UAC_HEADER desc\n", __func__); + goto err; + } + if (protocol == UAC_VERSION_1) { as = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL); @@ -186,26 +202,23 @@ static int prepare_qmi_response(struct snd_usb_substream *subs, fmt_v1 = (struct uac_format_type_i_discrete_descriptor *)fmt; resp->usb_audio_subslot_size = fmt_v1->bSubframeSize; resp->usb_audio_subslot_size_valid = 1; + + resp->usb_audio_spec_revision = + ((struct uac1_ac_header_descriptor *)hdr_ptr)->bcdADC; + resp->usb_audio_spec_revision_valid = 1; } else if (protocol == UAC_VERSION_2) { fmt_v2 = (struct uac_format_type_i_ext_descriptor *)fmt; resp->usb_audio_subslot_size = fmt_v2->bSubslotSize; resp->usb_audio_subslot_size_valid = 1; + + resp->usb_audio_spec_revision = + ((struct uac2_ac_header_descriptor *)hdr_ptr)->bcdADC; + resp->usb_audio_spec_revision_valid = 1; } else { pr_err("%s: unknown protocol version %x\n", __func__, protocol); goto err; } - ac = snd_usb_find_csint_desc(alts->extra, - alts->extralen, - NULL, UAC_HEADER); - if (!ac) { - pr_err("%s: %u:%d : no UAC_HEADER desc\n", __func__, - subs->interface, subs->altset_idx); - goto err; - } - resp->usb_audio_spec_revision = ac->bcdADC; - resp->usb_audio_spec_revision_valid = 1; - resp->slot_id = subs->dev->slot_id; resp->slot_id_valid = 1; @@ -582,6 +595,7 @@ static int handle_uaudio_stream_req(void *req_h, void *req) subs->pcm_format = pcm_format; subs->channels = req_msg->number_of_ch; subs->cur_rate = req_msg->bit_rate; + uadev[pcm_card_num].ctrl_intf = chip->ctrl_intf; ret = snd_usb_enable_audio_stream(subs, req_msg->enable); From 5c389707fbd94d0a28c51a642a2b3118969a5f1c Mon Sep 17 00:00:00 2001 From: Hamad Kadmany Date: Sun, 18 Dec 2016 15:03:11 +0200 Subject: [PATCH 0484/1015] wil6210: Block write ioctl to the card by default The ability to write to the card is used for debug purposes. The ability is disabled by default to prevent misuse of this functionality. CRs-Fixed: 1096945 Change-Id: I8fc3f646a0127ec705239be6a7de858a4f805acc Signed-off-by: Hamad Kadmany --- drivers/net/wireless/ath/wil6210/Kconfig | 11 +++++++++++ drivers/net/wireless/ath/wil6210/ioctl.c | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/drivers/net/wireless/ath/wil6210/Kconfig b/drivers/net/wireless/ath/wil6210/Kconfig index 5d0e03694e511..4507003862a6d 100644 --- a/drivers/net/wireless/ath/wil6210/Kconfig +++ b/drivers/net/wireless/ath/wil6210/Kconfig @@ -41,6 +41,17 @@ config WIL6210_TRACING If unsure, say Y to make it easier to debug problems. +config WIL6210_WRITE_IOCTL + bool "wil6210 write ioctl to the device" + depends on WIL6210 + default n + ---help--- + Say Y here to allow write-access from user-space to + the device memory through ioctl. This is useful for + debugging purposes only. + + If unsure, say N. + config WIL6210_PLATFORM_MSM bool "wil6210 MSM platform specific support" depends on WIL6210 diff --git a/drivers/net/wireless/ath/wil6210/ioctl.c b/drivers/net/wireless/ath/wil6210/ioctl.c index 47058ccccb5bc..bbdd232df3b76 100644 --- a/drivers/net/wireless/ath/wil6210/ioctl.c +++ b/drivers/net/wireless/ath/wil6210/ioctl.c @@ -87,10 +87,12 @@ static int wil_ioc_memio_dword(struct wil6210_priv *wil, void __user *data) io.val = readl(a); need_copy = true; break; +#if defined(CONFIG_WIL6210_WRITE_IOCTL) case wil_mmio_write: writel(io.val, a); wmb(); /* make sure write propagated to HW */ break; +#endif default: wil_err(wil, "Unsupported operation, op = 0x%08x\n", io.op); return -EINVAL; @@ -147,6 +149,7 @@ static int wil_ioc_memio_block(struct wil6210_priv *wil, void __user *data) goto out_free; } break; +#if defined(CONFIG_WIL6210_WRITE_IOCTL) case wil_mmio_write: if (copy_from_user(block, io.block, io.size)) { rc = -EFAULT; @@ -156,6 +159,7 @@ static int wil_ioc_memio_block(struct wil6210_priv *wil, void __user *data) wmb(); /* make sure write propagated to HW */ wil_hex_dump_ioctl("Write ", block, io.size); break; +#endif default: wil_err(wil, "Unsupported operation, op = 0x%08x\n", io.op); rc = -EINVAL; From 5a0347c0f1eecec95cd0c398b389568b3667733b Mon Sep 17 00:00:00 2001 From: Srinivas Rao L Date: Thu, 29 Dec 2016 18:49:54 +0530 Subject: [PATCH 0485/1015] lpm-levels: Do not consider cluster residency in suspend If cluster deepest low power mode is disabled in idle path, the residencies are recalculated and the max_residency for the shallower mode becomes ~0 even if deepest mode is not disabled in suspend path. Because of this while the cluster mode is selected during suspend, it selects shallower mode instead of deepest mode available. During suspend ignore the residency to select the cluster level low power mode. Change-Id: I812e33ad45e563b88c478d5d70296d5bd488438f Signed-off-by: Srinivas Rao L --- drivers/cpuidle/lpm-levels.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/cpuidle/lpm-levels.c b/drivers/cpuidle/lpm-levels.c index 9015b0bae7a39..7efa1b9482974 100644 --- a/drivers/cpuidle/lpm-levels.c +++ b/drivers/cpuidle/lpm-levels.c @@ -607,7 +607,7 @@ static int cluster_select(struct lpm_cluster *cluster, bool from_idle) best_level = i; - if (sleep_us <= pwr_params->max_residency) + if (from_idle && sleep_us <= pwr_params->max_residency) break; } From dc0d3afc7e40ab7d03de3b7fd8ed3cc82e42a508 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Fri, 2 Sep 2016 22:09:23 -0700 Subject: [PATCH 0486/1015] qseecom: whitelist support for kernel client and listener -- Add whitelist support for listener to send modified resp to TZ; -- support whitelist for kernel client; -- Change the method to check whitelist feature. Change-Id: I0030b0008d6224cda3fdc1f80308a7e9bcfe4405 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 325 +++++++++++++++++++++--------------- include/soc/qcom/qseecomi.h | 19 +++ 2 files changed, 210 insertions(+), 134 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index f939c35d8e11c..8839e6ed99b52 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -141,6 +141,35 @@ static DEFINE_MUTEX(qsee_bw_mutex); static DEFINE_MUTEX(app_access_lock); static DEFINE_MUTEX(clk_access_lock); +struct sglist_info { + uint32_t indexAndFlags; + uint32_t sizeOrCount; +}; + +/* + * The 31th bit indicates only one or multiple physical address inside + * the request buffer. If it is set, the index locates a single physical addr + * inside the request buffer, and `sizeOrCount` is the size of the memory being + * shared at that physical address. + * Otherwise, the index locates an array of {start, len} pairs (a + * "scatter/gather list"), and `sizeOrCount` gives the number of entries in + * that array. + * + * The 30th bit indicates 64 or 32bit address; when it is set, physical addr + * and scatter gather entry sizes are 64-bit values. Otherwise, 32-bit values. + * + * The bits [0:29] of `indexAndFlags` hold an offset into the request buffer. + */ +#define SGLISTINFO_SET_INDEX_FLAG(c, s, i) \ + ((uint32_t)(((c & 1) << 31) | ((s & 1) << 30) | (i & 0x3fffffff))) + +#define SGLISTINFO_TABLE_SIZE (sizeof(struct sglist_info) * MAX_ION_FD) + +#define FEATURE_ID_WHITELIST 15 /*whitelist feature id*/ + +#define MAKE_WHITELIST_VERSION(major, minor, patch) \ + (((major & 0x3FF) << 22) | ((minor & 0x3FF) << 12) | (patch & 0xFFF)) + struct qseecom_registered_listener_list { struct list_head list; struct qseecom_register_listener_req svc; @@ -155,6 +184,8 @@ struct qseecom_registered_listener_list { bool listener_in_use; /* wq for thread blocked on this listener*/ wait_queue_head_t listener_block_app_wq; + struct sglist_info sglistinfo_ptr[MAX_ION_FD]; + uint32_t sglist_cnt; }; struct qseecom_registered_app_list { @@ -279,30 +310,6 @@ struct qseecom_listener_handle { static struct qseecom_control qseecom; -struct sglist_info { - uint32_t indexAndFlags; - uint32_t sizeOrCount; -}; - -/* - * The 31th bit indicates only one or multiple physical address inside - * the request buffer. If it is set, the index locates a single physical addr - * inside the request buffer, and `sizeOrCount` is the size of the memory being - * shared at that physical address. - * Otherwise, the index locates an array of {start, len} pairs (a - * "scatter/gather list"), and `sizeOrCount` gives the number of entries in - * that array. - * - * The 30th bit indicates 64 or 32bit address; when it is set, physical addr - * and scatter gather entry sizes are 64-bit values. Otherwise, 32-bit values. - * - * The bits [0:29] of `indexAndFlags` hold an offset into the request buffer. - */ -#define SGLISTINFO_SET_INDEX_FLAG(c, s, i) \ - ((uint32_t)(((c & 1) << 31) | ((s & 1) << 30) | (i & 0x3fffffff))) - -#define SGLISTINFO_TABLE_SIZE (sizeof(struct sglist_info) * MAX_ION_FD) - struct qseecom_dev_handle { enum qseecom_client_handle_type type; union { @@ -316,8 +323,9 @@ struct qseecom_dev_handle { bool perf_enabled; bool fast_load_enabled; enum qseecom_bandwidth_request_mode mode; - struct sglist_info *sglistinfo_ptr; + struct sglist_info sglistinfo_ptr[MAX_ION_FD]; uint32_t sglist_cnt; + bool use_legacy_cmd; }; struct qseecom_key_id_usage_desc { @@ -595,6 +603,34 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } + case QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST: { + struct qseecom_client_listener_data_irsp *req; + struct qseecom_client_listener_data_64bit_irsp *req_64; + + smc_id = + TZ_OS_LISTENER_RESPONSE_HANDLER_WITH_WHITELIST_ID; + desc.arginfo = + TZ_OS_LISTENER_RESPONSE_HANDLER_WITH_WHITELIST_PARAM_ID; + if (qseecom.qsee_version < QSEE_VERSION_40) { + req = + (struct qseecom_client_listener_data_irsp *) + req_buf; + desc.args[0] = req->listener_id; + desc.args[1] = req->status; + desc.args[2] = req->sglistinfo_ptr; + desc.args[3] = req->sglistinfo_len; + } else { + req_64 = + (struct qseecom_client_listener_data_64bit_irsp *) + req_buf; + desc.args[0] = req_64->listener_id; + desc.args[1] = req_64->status; + desc.args[2] = req_64->sglistinfo_ptr; + desc.args[3] = req_64->sglistinfo_len; + } + ret = scm_call2(smc_id, &desc); + break; + } case QSEOS_LOAD_EXTERNAL_ELF_COMMAND: { struct qseecom_load_app_ireq *req; struct qseecom_load_app_64bit_ireq *req_64bit; @@ -1139,7 +1175,7 @@ static int qseecom_register_listener(struct qseecom_dev_handle *data, return -EBUSY; } - new_entry = kmalloc(sizeof(*new_entry), GFP_KERNEL); + new_entry = kzalloc(sizeof(*new_entry), GFP_KERNEL); if (!new_entry) { pr_err("kmalloc failed\n"); return -ENOMEM; @@ -1615,6 +1651,16 @@ static int __qseecom_qseos_fail_return_resp_tz(struct qseecom_dev_handle *data, return ret; } +static void __qseecom_clean_listener_sglistinfo( + struct qseecom_registered_listener_list *ptr_svc) +{ + if (ptr_svc->sglist_cnt) { + memset(ptr_svc->sglistinfo_ptr, 0, + SGLISTINFO_TABLE_SIZE); + ptr_svc->sglist_cnt = 0; + } +} + static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, struct qseecom_command_scm_resp *resp) { @@ -1623,9 +1669,14 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, uint32_t lstnr; unsigned long flags; struct qseecom_client_listener_data_irsp send_data_rsp; + struct qseecom_client_listener_data_64bit_irsp send_data_rsp_64bit; struct qseecom_registered_listener_list *ptr_svc = NULL; sigset_t new_sigset; sigset_t old_sigset; + uint32_t status; + void *cmd_buf = NULL; + size_t cmd_len; + struct sglist_info *table = NULL; while (resp->result == QSEOS_RESULT_INCOMPLETE) { lstnr = resp->data; @@ -1698,15 +1749,42 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, pr_err("Abort clnt %d waiting on lstnr svc %d, ret %d", data->client.app_id, lstnr, ret); rc = -ENODEV; - send_data_rsp.status = QSEOS_RESULT_FAILURE; + status = QSEOS_RESULT_FAILURE; } else { - send_data_rsp.status = QSEOS_RESULT_SUCCESS; + status = QSEOS_RESULT_SUCCESS; } qseecom.send_resp_flag = 0; ptr_svc->send_resp_flag = 0; - send_data_rsp.qsee_cmd_id = QSEOS_LISTENER_DATA_RSP_COMMAND; - send_data_rsp.listener_id = lstnr; + table = ptr_svc->sglistinfo_ptr; + if (qseecom.qsee_version < QSEE_VERSION_40) { + send_data_rsp.listener_id = lstnr; + send_data_rsp.status = status; + send_data_rsp.sglistinfo_ptr = + (uint32_t)virt_to_phys(table); + send_data_rsp.sglistinfo_len = + SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); + cmd_buf = (void *)&send_data_rsp; + cmd_len = sizeof(send_data_rsp); + } else { + send_data_rsp_64bit.listener_id = lstnr; + send_data_rsp_64bit.status = status; + send_data_rsp_64bit.sglistinfo_ptr = + virt_to_phys(table); + send_data_rsp_64bit.sglistinfo_len = + SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); + cmd_buf = (void *)&send_data_rsp_64bit; + cmd_len = sizeof(send_data_rsp_64bit); + } + if (qseecom.whitelist_support == false) + *(uint32_t *)cmd_buf = QSEOS_LISTENER_DATA_RSP_COMMAND; + else + *(uint32_t *)cmd_buf = + QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST; if (ptr_svc) { ret = msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle, ptr_svc->sb_virt, @@ -1724,9 +1802,9 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, - (const void *)&send_data_rsp, - sizeof(send_data_rsp), resp, - sizeof(*resp)); + cmd_buf, cmd_len, resp, sizeof(*resp)); + ptr_svc->listener_in_use = false; + __qseecom_clean_listener_sglistinfo(ptr_svc); if (ret) { pr_err("scm_call() failed with err: %d (app_id = %d)\n", ret, data->client.app_id); @@ -1853,9 +1931,14 @@ static int __qseecom_reentrancy_process_incomplete_cmd( uint32_t lstnr = 0; unsigned long flags; struct qseecom_client_listener_data_irsp send_data_rsp; + struct qseecom_client_listener_data_64bit_irsp send_data_rsp_64bit; struct qseecom_registered_listener_list *ptr_svc = NULL; sigset_t new_sigset; sigset_t old_sigset; + uint32_t status; + void *cmd_buf = NULL; + size_t cmd_len; + struct sglist_info *table = NULL; while (resp->result == QSEOS_RESULT_INCOMPLETE) { lstnr = resp->data; @@ -1918,13 +2001,42 @@ static int __qseecom_reentrancy_process_incomplete_cmd( pr_err("Abort clnt %d waiting on lstnr svc %d, ret %d", data->client.app_id, lstnr, ret); rc = -ENODEV; - send_data_rsp.status = QSEOS_RESULT_FAILURE; + status = QSEOS_RESULT_FAILURE; } else { - send_data_rsp.status = QSEOS_RESULT_SUCCESS; + status = QSEOS_RESULT_SUCCESS; } + table = ptr_svc->sglistinfo_ptr; + if (qseecom.qsee_version < QSEE_VERSION_40) { + send_data_rsp.listener_id = lstnr; + send_data_rsp.status = status; + send_data_rsp.sglistinfo_ptr = + (uint32_t)virt_to_phys(table); + send_data_rsp.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); + cmd_buf = (void *)&send_data_rsp; + cmd_len = sizeof(send_data_rsp); + } else { + send_data_rsp_64bit.listener_id = lstnr; + send_data_rsp_64bit.status = status; + send_data_rsp_64bit.sglistinfo_ptr = + virt_to_phys(table); + send_data_rsp_64bit.sglistinfo_len = + SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); + cmd_buf = (void *)&send_data_rsp_64bit; + cmd_len = sizeof(send_data_rsp_64bit); + } + if (qseecom.whitelist_support == false) + *(uint32_t *)cmd_buf = QSEOS_LISTENER_DATA_RSP_COMMAND; + else + *(uint32_t *)cmd_buf = + QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST; + + if (lstnr == RPMB_SERVICE) + __qseecom_enable_clk(CLK_QSEE); - send_data_rsp.qsee_cmd_id = QSEOS_LISTENER_DATA_RSP_COMMAND; - send_data_rsp.listener_id = lstnr; if (ptr_svc) { ret = msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle, ptr_svc->sb_virt, @@ -1941,11 +2053,9 @@ static int __qseecom_reentrancy_process_incomplete_cmd( } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, - (const void *)&send_data_rsp, - sizeof(send_data_rsp), resp, - sizeof(*resp)); - + cmd_buf, cmd_len, resp, sizeof(*resp)); ptr_svc->listener_in_use = false; + __qseecom_clean_listener_sglistinfo(ptr_svc); wake_up_interruptible(&ptr_svc->listener_block_app_wq); if (ret) { @@ -2964,7 +3074,7 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, cmd_len = sizeof(struct qseecom_client_send_data_64bit_ireq); } - if (qseecom.whitelist_support == false) + if (qseecom.whitelist_support == false || data->use_legacy_cmd == true) *(uint32_t *)cmd_buf = QSEOS_CLIENT_SEND_DATA_COMMAND; else *(uint32_t *)cmd_buf = QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST; @@ -3075,6 +3185,8 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, struct qseecom_send_modfd_cmd_req *req = NULL; struct qseecom_send_modfd_listener_resp *lstnr_resp = NULL; struct qseecom_registered_listener_list *this_lstnr = NULL; + uint32_t offset; + struct sg_table *sg_ptr; if ((data->type != QSEECOM_LISTENER_SERVICE) && (data->type != QSEECOM_CLIENT_APP)) @@ -3096,7 +3208,6 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, } for (i = 0; i < MAX_ION_FD; i++) { - struct sg_table *sg_ptr = NULL; if ((data->type != QSEECOM_LISTENER_SERVICE) && (req->ifd_data[i].fd > 0)) { ihandle = ion_import_dma_buf(qseecom.ion_clnt, @@ -3246,14 +3357,25 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, goto err; } if (data->type == QSEECOM_CLIENT_APP) { + offset = req->ifd_data[i].cmd_buf_offset; data->sglistinfo_ptr[i].indexAndFlags = SGLISTINFO_SET_INDEX_FLAG( - (sg_ptr->nents == 1), 0, - req->ifd_data[i].cmd_buf_offset); + (sg_ptr->nents == 1), 0, offset); data->sglistinfo_ptr[i].sizeOrCount = (sg_ptr->nents == 1) ? sg->length : sg_ptr->nents; data->sglist_cnt = i + 1; + } else { + offset = (lstnr_resp->ifd_data[i].cmd_buf_offset + + (uintptr_t)lstnr_resp->resp_buf_ptr - + (uintptr_t)this_lstnr->sb_virt); + this_lstnr->sglistinfo_ptr[i].indexAndFlags = + SGLISTINFO_SET_INDEX_FLAG( + (sg_ptr->nents == 1), 0, offset); + this_lstnr->sglistinfo_ptr[i].sizeOrCount = + (sg_ptr->nents == 1) ? + sg->length : sg_ptr->nents; + this_lstnr->sglist_cnt = i + 1; } } /* Deallocate the handle */ @@ -3326,6 +3448,8 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, struct qseecom_send_modfd_cmd_req *req = NULL; struct qseecom_send_modfd_listener_resp *lstnr_resp = NULL; struct qseecom_registered_listener_list *this_lstnr = NULL; + uint32_t offset; + struct sg_table *sg_ptr; if ((data->type != QSEECOM_LISTENER_SERVICE) && (data->type != QSEECOM_CLIENT_APP)) @@ -3347,7 +3471,6 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, } for (i = 0; i < MAX_ION_FD; i++) { - struct sg_table *sg_ptr = NULL; if ((data->type != QSEECOM_LISTENER_SERVICE) && (req->ifd_data[i].fd > 0)) { ihandle = ion_import_dma_buf(qseecom.ion_clnt, @@ -3472,14 +3595,25 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, goto err; } if (data->type == QSEECOM_CLIENT_APP) { + offset = req->ifd_data[i].cmd_buf_offset; data->sglistinfo_ptr[i].indexAndFlags = SGLISTINFO_SET_INDEX_FLAG( - (sg_ptr->nents == 1), 1, - req->ifd_data[i].cmd_buf_offset); + (sg_ptr->nents == 1), 1, offset); data->sglistinfo_ptr[i].sizeOrCount = (sg_ptr->nents == 1) ? sg->length : sg_ptr->nents; data->sglist_cnt = i + 1; + } else { + offset = (lstnr_resp->ifd_data[i].cmd_buf_offset + + (uintptr_t)lstnr_resp->resp_buf_ptr - + (uintptr_t)this_lstnr->sb_virt); + this_lstnr->sglistinfo_ptr[i].indexAndFlags = + SGLISTINFO_SET_INDEX_FLAG( + (sg_ptr->nents == 1), 1, offset); + this_lstnr->sglistinfo_ptr[i].sizeOrCount = + (sg_ptr->nents == 1) ? + sg->length : sg_ptr->nents; + this_lstnr->sglist_cnt = i + 1; } } /* Deallocate the handle */ @@ -4206,21 +4340,12 @@ int qseecom_start_app(struct qseecom_handle **handle, data->client.user_virt_sb_base = 0; data->client.ihandle = NULL; - /* Allocate sglistinfo buffer for kernel client */ - data->sglistinfo_ptr = kzalloc(SGLISTINFO_TABLE_SIZE, GFP_KERNEL); - if (!(data->sglistinfo_ptr)) { - kfree(data); - kfree(*handle); - *handle = NULL; - return -ENOMEM; - } init_waitqueue_head(&data->abort_wq); data->client.ihandle = ion_alloc(qseecom.ion_clnt, size, 4096, ION_HEAP(ION_QSECOM_HEAP_ID), 0); if (IS_ERR_OR_NULL(data->client.ihandle)) { pr_err("Ion client could not retrieve the handle\n"); - kfree(data->sglistinfo_ptr); kfree(data); kfree(*handle); *handle = NULL; @@ -4323,7 +4448,6 @@ int qseecom_start_app(struct qseecom_handle **handle, return 0; err: - kfree(data->sglistinfo_ptr); kfree(data); kfree(*handle); *handle = NULL; @@ -4371,7 +4495,6 @@ int qseecom_shutdown_app(struct qseecom_handle **handle) mutex_unlock(&app_access_lock); if (ret == 0) { - kzfree(data->sglistinfo_ptr); kzfree(data); kzfree(*handle); kzfree(kclient); @@ -4437,8 +4560,11 @@ int qseecom_send_command(struct qseecom_handle *handle, void *send_buf, } perf_enabled = true; } + if (!strcmp(data->client.app_name, "securemm")) + data->use_legacy_cmd = true; ret = __qseecom_send_cmd(data, &req); + data->use_legacy_cmd = false; if (qseecom.support_bus_scaling) __qseecom_add_bw_scale_down_timer( QSEECOM_SEND_CMD_CRYPTO_TIMEOUT); @@ -7162,6 +7288,7 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) wake_up_all(&data->abort_wq); if (ret) pr_err("failed qseecom_send_mod_resp: %d\n", ret); + __qseecom_clean_data_sglistinfo(data); break; } case QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ: { @@ -7311,12 +7438,6 @@ static int qseecom_open(struct inode *inode, struct file *file) data->mode = INACTIVE; init_waitqueue_head(&data->abort_wq); atomic_set(&data->ioctl_count, 0); - - data->sglistinfo_ptr = kzalloc(SGLISTINFO_TABLE_SIZE, GFP_KERNEL); - if (!(data->sglistinfo_ptr)) { - kzfree(data); - return -ENOMEM; - } return ret; } @@ -7371,7 +7492,6 @@ static int qseecom_release(struct inode *inode, struct file *file) if (data->perf_enabled == true) qsee_disable_clock_vote(data, CLK_DFAB); } - kfree(data->sglistinfo_ptr); kfree(data); return ret; @@ -8120,73 +8240,14 @@ static int qseecom_query_ce_info(struct qseecom_dev_handle *data, } /* - * Check if whitelist feature is supported by making a test scm_call - * to send a whitelist command to an invalid app ID 0 + * Check whitelist feature, and if TZ feature version is < 1.0.0, + * then whitelist feature is not supported. */ static int qseecom_check_whitelist_feature(void) { - struct qseecom_client_send_data_ireq send_data_req = {0}; - struct qseecom_client_send_data_64bit_ireq send_data_req_64bit = {0}; - struct qseecom_command_scm_resp resp; - uint32_t buf_size = 128; - void *buf = NULL; - void *cmd_buf = NULL; - size_t cmd_len; - int ret = 0; - phys_addr_t pa; + int version = scm_get_feat_version(FEATURE_ID_WHITELIST); - buf = kzalloc(buf_size, GFP_KERNEL); - if (!buf) - return -ENOMEM; - pa = virt_to_phys(buf); - if (qseecom.qsee_version < QSEE_VERSION_40) { - send_data_req.qsee_cmd_id = - QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST; - send_data_req.app_id = 0; - send_data_req.req_ptr = (uint32_t)pa; - send_data_req.req_len = buf_size; - send_data_req.rsp_ptr = (uint32_t)pa; - send_data_req.rsp_len = buf_size; - send_data_req.sglistinfo_ptr = (uint32_t)pa; - send_data_req.sglistinfo_len = buf_size; - cmd_buf = (void *)&send_data_req; - cmd_len = sizeof(struct qseecom_client_send_data_ireq); - } else { - send_data_req_64bit.qsee_cmd_id = - QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST; - send_data_req_64bit.app_id = 0; - send_data_req_64bit.req_ptr = (uint64_t)pa; - send_data_req_64bit.req_len = buf_size; - send_data_req_64bit.rsp_ptr = (uint64_t)pa; - send_data_req_64bit.rsp_len = buf_size; - send_data_req_64bit.sglistinfo_ptr = (uint64_t)pa; - send_data_req_64bit.sglistinfo_len = buf_size; - cmd_buf = (void *)&send_data_req_64bit; - cmd_len = sizeof(struct qseecom_client_send_data_64bit_ireq); - } - ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, - cmd_buf, cmd_len, - &resp, sizeof(resp)); -/* - * If this cmd exists and whitelist is supported, scm_call return -2 (scm - * driver remap it to -EINVAL) and resp.result 0xFFFFFFED(-19); Otherwise, - * scm_call return -1 (remap to -EIO). - */ - if (ret == -EIO) { - qseecom.whitelist_support = false; - ret = 0; - } else if (ret == -EINVAL && - resp.result == QSEOS_RESULT_FAIL_SEND_CMD_NO_THREAD) { - qseecom.whitelist_support = true; - ret = 0; - } else { - pr_info("Check whitelist with ret = %d, result = 0x%x\n", - ret, resp.result); - qseecom.whitelist_support = false; - ret = 0; - } - kfree(buf); - return ret; + return version >= MAKE_WHITELIST_VERSION(1, 0, 0); } static int qseecom_probe(struct platform_device *pdev) @@ -8445,11 +8506,7 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.qsee_perf_client = msm_bus_scale_register_client( qseecom_platform_support); - rc = qseecom_check_whitelist_feature(); - if (rc) { - rc = -EINVAL; - goto exit_destroy_ion_client; - } + qseecom.whitelist_support = qseecom_check_whitelist_feature(); pr_warn("qseecom.whitelist_support = %d\n", qseecom.whitelist_support); diff --git a/include/soc/qcom/qseecomi.h b/include/soc/qcom/qseecomi.h index b0a8d67f50fa3..e33fd9fc1841a 100644 --- a/include/soc/qcom/qseecomi.h +++ b/include/soc/qcom/qseecomi.h @@ -68,6 +68,7 @@ enum qseecom_qceos_cmd_id { QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST = 0x1C, QSEOS_TEE_OPEN_SESSION_WHITELIST = 0x1D, QSEOS_TEE_INVOKE_COMMAND_WHITELIST = 0x1E, + QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST = 0x1F, QSEOS_FSM_LTEOTA_REQ_CMD = 0x109, QSEOS_FSM_LTEOTA_REQ_RSP_CMD = 0x110, QSEOS_FSM_IKE_REQ_CMD = 0x203, @@ -217,6 +218,16 @@ __packed struct qseecom_client_listener_data_irsp { uint32_t qsee_cmd_id; uint32_t listener_id; uint32_t status; + uint32_t sglistinfo_ptr; + uint32_t sglistinfo_len; +}; + +__packed struct qseecom_client_listener_data_64bit_irsp { + uint32_t qsee_cmd_id; + uint32_t listener_id; + uint32_t status; + uint64_t sglistinfo_ptr; + uint32_t sglistinfo_len; }; /* @@ -703,4 +714,12 @@ __packed struct qseecom_continue_blocked_request_ireq { TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ TZ_SYSCALL_PARAM_TYPE_VAL) +#define TZ_OS_LISTENER_RESPONSE_HANDLER_WITH_WHITELIST_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_QSEE_OS, TZ_SVC_LISTENER, 0x05) + +#define TZ_OS_LISTENER_RESPONSE_HANDLER_WITH_WHITELIST_PARAM_ID \ + TZ_SYSCALL_CREATE_PARAM_ID_4( \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_VAL, \ + TZ_SYSCALL_PARAM_TYPE_BUF_RW, TZ_SYSCALL_PARAM_TYPE_VAL) + #endif /* __QSEECOMI_H_ */ From e4768963e1d91f6e67ba88c50d8a43fedf74f3e1 Mon Sep 17 00:00:00 2001 From: Walter Yang Date: Wed, 21 Dec 2016 14:43:46 +0800 Subject: [PATCH 0487/1015] ASoC: msm-cpe-lsm: cleanup ioctl functions Some of the ioctl command handling is not properly using the copy_from_user interface. Fix these issues and cleanup the ioctl functions to make sure there is no illegal memory access. CRs-Fixed: 1090482 Change-Id: Ib18e4b132d3487a3103335768aad5df2ebe13f2d Signed-off-by: Walter Yang --- sound/soc/msm/msm-cpe-lsm.c | 51 ++++++++++--------------------------- 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/sound/soc/msm/msm-cpe-lsm.c b/sound/soc/msm/msm-cpe-lsm.c index b2071d67c4a8c..0784502512774 100644 --- a/sound/soc/msm/msm-cpe-lsm.c +++ b/sound/soc/msm/msm-cpe-lsm.c @@ -1190,13 +1190,6 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, dev_dbg(rtd->dev, "%s: %s\n", __func__, "SNDRV_LSM_REG_SND_MODEL_V2"); - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid argument to ioctl %s\n", - __func__, - "SNDRV_LSM_REG_SND_MODEL_V2"); - return -EINVAL; - } memcpy(&snd_model, arg, sizeof(struct snd_lsm_sound_model_v2)); @@ -1339,13 +1332,6 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, dev_dbg(rtd->dev, "%s: %s\n", __func__, "SNDRV_LSM_EVENT_STATUS"); - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid argument to ioctl %s\n", - __func__, - "SNDRV_LSM_EVENT_STATUS"); - return -EINVAL; - } user = arg; @@ -1448,12 +1434,6 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, break; case SNDRV_LSM_SET_PARAMS: - if (!arg) { - dev_err(rtd->dev, - "%s: %s Invalid argument\n", - __func__, "SNDRV_LSM_SET_PARAMS"); - return -EINVAL; - } memcpy(&det_params, arg, sizeof(det_params)); if (det_params.num_confidence_levels <= 0) { @@ -2300,12 +2280,6 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, } #ifdef CONFIG_COMPAT -struct snd_lsm_event_status32 { - u16 status; - u16 payload_size; - u8 payload[0]; -}; - struct snd_lsm_sound_model_v2_32 { compat_uptr_t data; compat_uptr_t confidence_level; @@ -2337,8 +2311,6 @@ struct snd_lsm_module_params_32 { }; enum { - SNDRV_LSM_EVENT_STATUS32 = - _IOW('U', 0x02, struct snd_lsm_event_status32), SNDRV_LSM_REG_SND_MODEL_V2_32 = _IOW('U', 0x07, struct snd_lsm_sound_model_v2_32), SNDRV_LSM_SET_PARAMS32 = @@ -2432,7 +2404,7 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, err); } break; - case SNDRV_LSM_EVENT_STATUS32: { + case SNDRV_LSM_EVENT_STATUS: { struct snd_lsm_event_status *event_status = NULL; struct snd_lsm_event_status u_event_status32; struct snd_lsm_event_status *udata_32 = NULL; @@ -2474,7 +2446,6 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, } else { event_status->payload_size = u_event_status32.payload_size; - cmd = SNDRV_LSM_EVENT_STATUS; err = msm_cpe_lsm_ioctl_shared(substream, cmd, event_status); if (err) @@ -2574,13 +2545,6 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, return -EINVAL; } - if (!arg) { - dev_err(rtd->dev, - "%s: %s: No Param data to set\n", - __func__, "SET_MODULE_PARAMS_32"); - return -EINVAL; - } - if (copy_from_user(&p_data_32, arg, sizeof(p_data_32))) { dev_err(rtd->dev, @@ -2658,6 +2622,19 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, kfree(params32); break; } + case SNDRV_LSM_REG_SND_MODEL_V2: + case SNDRV_LSM_SET_PARAMS: + case SNDRV_LSM_SET_MODULE_PARAMS: + /* + * In ideal cases, the compat_ioctl should never be called + * with the above unlocked ioctl commands. Print error + * and return error if it does. + */ + dev_err(rtd->dev, + "%s: Invalid cmd for compat_ioctl\n", + __func__); + err = -EINVAL; + break; default: err = msm_cpe_lsm_ioctl_shared(substream, cmd, arg); break; From cc6b3cb7875eff9c907b31059ead205e78b5528b Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Tue, 15 Nov 2016 11:02:03 +0530 Subject: [PATCH 0488/1015] scsi: ufs: Add clock ungating to a separate workqueue UFS driver can receive a request during memory reclaim by kswapd. So when ufs driver puts the ungate work in queue, and if there are no idle workers, kthreadd is invoked to create a new kworker. Since kswapd task holds a mutex which kthreadd also needs, this can cause a deadlock situation. So ungate work must be done in a separate work queue with WQ__RECLAIM flag enabled.Such a workqueue will have a rescue thread which will be called when the above deadlock condition is possible. Change-Id: I6b50e32a12c0279d12e82b278af9b2c2da82ff54 Signed-off-by: Vijay Viswanath --- drivers/scsi/ufs/ufshcd.c | 9 ++++++++- drivers/scsi/ufs/ufshcd.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 4feb372515d73..5445ba892170d 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -1273,7 +1273,8 @@ int ufshcd_hold(struct ufs_hba *hba, bool async) hba->clk_gating.state = REQ_CLKS_ON; trace_ufshcd_clk_gating(dev_name(hba->dev), hba->clk_gating.state); - schedule_work(&hba->clk_gating.ungate_work); + queue_work(hba->clk_gating.ungating_workq, + &hba->clk_gating.ungate_work); /* * fall through to check if we should wait for this * work to be done or not. @@ -1522,6 +1523,7 @@ static ssize_t ufshcd_clkgate_enable_store(struct device *dev, static void ufshcd_init_clk_gating(struct ufs_hba *hba) { struct ufs_clk_gating *gating = &hba->clk_gating; + char wq_name[sizeof("ufs_clk_ungating_00")]; hba->clk_gating.state = CLKS_ON; @@ -1531,6 +1533,10 @@ static void ufshcd_init_clk_gating(struct ufs_hba *hba) INIT_DELAYED_WORK(&gating->gate_work, ufshcd_gate_work); INIT_WORK(&gating->ungate_work, ufshcd_ungate_work); + snprintf(wq_name, ARRAY_SIZE(wq_name), "ufs_clk_ungating_%d", + hba->host->host_no); + hba->clk_gating.ungating_workq = create_singlethread_workqueue(wq_name); + gating->is_enabled = true; /* @@ -1607,6 +1613,7 @@ static void ufshcd_exit_clk_gating(struct ufs_hba *hba) device_remove_file(hba->dev, &hba->clk_gating.enable_attr); cancel_work_sync(&hba->clk_gating.ungate_work); cancel_delayed_work_sync(&hba->clk_gating.gate_work); + destroy_workqueue(hba->clk_gating.ungating_workq); } /** diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 3ba141c6e1a7f..7a3d13500d6fe 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -421,6 +421,7 @@ struct ufs_clk_gating { struct device_attribute enable_attr; bool is_enabled; int active_reqs; + struct workqueue_struct *ungating_workq; }; /* Hibern8 state */ From d08ed987166f141e3fe83b36e4420288b3cdfe54 Mon Sep 17 00:00:00 2001 From: Rohit Kumar Date: Tue, 3 Jan 2017 16:36:17 +0530 Subject: [PATCH 0489/1015] Asoc: msm: qdsp6v2: Fix Out-of-bounds memory access in adm_get_params_v2 Update size of memory allocated for param to avoid out of bound memory access in adm_get_params_v2. CRs-Fixed: 1104324 Change-Id: I8cecc7312975ff82d780216b9ba622787c8a09b3 Signed-off-by: Rohit Kumar --- sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c | 7 +++---- sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c | 5 +++-- sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c | 4 ++-- sound/soc/msm/qdsp6v2/msm-qti-pp-config.c | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c b/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c index 5866e46cc6a20..fb68ff3190c94 100644 --- a/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c +++ b/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2014, 2016-2017,The Linux Foundation. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. @@ -803,7 +803,7 @@ int msm_dolby_dap_param_to_get_control_get(struct snd_kcontrol *kcontrol, __func__, copp_idx); return -EINVAL; } - params_value = kzalloc(params_length, GFP_KERNEL); + params_value = kzalloc(params_length + param_payload_len, GFP_KERNEL); if (!params_value) { pr_err("%s, params memory alloc failed\n", __func__); return -ENOMEM; @@ -822,8 +822,7 @@ int msm_dolby_dap_param_to_get_control_get(struct snd_kcontrol *kcontrol, pr_err("%s: invalid param id to set", __func__); rc = -EINVAL; } else { - params_length = (dolby_dap_params_length[i] + - DOLBY_PARAM_PAYLOAD_SIZE) * + params_length = dolby_dap_params_length[i] * sizeof(uint32_t); rc = adm_get_params(port_id, copp_idx, DOLBY_BUNDLE_MODULE_ID, diff --git a/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c b/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c index ad2f2e9865c3e..992b617a2ea0e 100644 --- a/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c +++ b/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. @@ -198,7 +198,8 @@ static void msm_ds2_dap_check_and_update_ramp_wait(int port_id, int copp_idx, uint32_t param_payload_len = PARAM_PAYLOAD_SIZE * sizeof(uint32_t); int rc = 0; - update_params_value = kzalloc(params_length, GFP_KERNEL); + update_params_value = kzalloc(params_length + param_payload_len, + GFP_KERNEL); if (!update_params_value) { pr_err("%s: params memory alloc failed\n", __func__); goto end; diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c index 1f534f565f3bb..8db421c5633f0 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -6118,7 +6118,7 @@ int msm_routing_get_rms_value_control(struct snd_kcontrol *kcontrol, int *update_param_value; uint32_t param_length = sizeof(uint32_t); uint32_t param_payload_len = RMS_PAYLOAD_LEN * sizeof(uint32_t); - param_value = kzalloc(param_length, GFP_KERNEL); + param_value = kzalloc(param_length + param_payload_len, GFP_KERNEL); if (!param_value) { pr_err("%s, param memory alloc failed\n", __func__); return -ENOMEM; diff --git a/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c b/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c index 5887c1f72ade4..73e6311d96d69 100644 --- a/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c +++ b/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -341,7 +341,7 @@ static int msm_qti_pp_get_rms_value_control(struct snd_kcontrol *kcontrol, uint32_t param_length = sizeof(uint32_t); uint32_t param_payload_len = RMS_PAYLOAD_LEN * sizeof(uint32_t); struct msm_pcm_routing_bdai_data msm_bedai; - param_value = kzalloc(param_length, GFP_KERNEL); + param_value = kzalloc(param_length + param_payload_len, GFP_KERNEL); if (!param_value) { pr_err("%s, param memory alloc failed\n", __func__); return -ENOMEM; From c1cf325288347d3a77b346390c7a7b1941cbdb08 Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Mon, 24 Oct 2016 16:38:56 +0530 Subject: [PATCH 0490/1015] ASoC: msm: qdsp6v2: Fix gapless session open fail During gapless playback, next track open write command is triggered to DSP. At the same time, for current track, volume change or some PP command is triggered to DSP. Due to race condition, the track open write fails since the second command is triggered asynchronously. Use separate cmd state for PP command to handle this. CRs-Fixed: 1080766 Change-Id: Ia80766394e4933800b72be2bf3296cd5de4e3159 Signed-off-by: Laxminath Kasam --- include/sound/q6asm-v2.h | 1 + sound/soc/msm/qdsp6v2/q6asm.c | 123 +++++++++++++++++++--------------- 2 files changed, 71 insertions(+), 53 deletions(-) diff --git a/include/sound/q6asm-v2.h b/include/sound/q6asm-v2.h index 705acf810a104..2ede9701be704 100644 --- a/include/sound/q6asm-v2.h +++ b/include/sound/q6asm-v2.h @@ -184,6 +184,7 @@ struct audio_client { int session; app_cb cb; atomic_t cmd_state; + atomic_t cmd_state_pp; /* Relative or absolute TS */ atomic_t time_flag; atomic_t nowait_cmd_cnt; diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index 83edfe3cad1f6..276ce3ad94de6 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -1124,6 +1124,7 @@ struct audio_client *q6asm_audio_client_alloc(app_cb cb, void *priv) spin_lock_init(&ac->port[lcnt].dsp_lock); } atomic_set(&ac->cmd_state, 0); + atomic_set(&ac->cmd_state_pp, 0); atomic_set(&ac->nowait_cmd_cnt, 0); atomic_set(&ac->mem_state, 0); @@ -1629,6 +1630,7 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) ac->apr = NULL; atomic_set(&ac->time_flag, 0); atomic_set(&ac->cmd_state, 0); + atomic_set(&ac->cmd_state_pp, 0); wake_up(&ac->time_wait); wake_up(&ac->cmd_wait); mutex_unlock(&ac->cmd_lock); @@ -1691,14 +1693,29 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) pr_err("%s: cmd = 0x%x returned error = 0x%x\n", __func__, payload[0], payload[1]); if (wakeup_flag) { - atomic_set(&ac->cmd_state, payload[1]); + if (payload[0] == + ASM_STREAM_CMD_SET_PP_PARAMS_V2) + atomic_set(&ac->cmd_state_pp, + payload[1]); + else + atomic_set(&ac->cmd_state, + payload[1]); wake_up(&ac->cmd_wait); } return 0; } - if (atomic_read(&ac->cmd_state) && wakeup_flag) { - atomic_set(&ac->cmd_state, 0); - wake_up(&ac->cmd_wait); + if (payload[0] == ASM_STREAM_CMD_SET_PP_PARAMS_V2) { + if (atomic_read(&ac->cmd_state_pp) && + wakeup_flag) { + atomic_set(&ac->cmd_state_pp, 0); + wake_up(&ac->cmd_wait); + } + } else { + if (atomic_read(&ac->cmd_state) && + wakeup_flag) { + atomic_set(&ac->cmd_state, 0); + wake_up(&ac->cmd_wait); + } } if (ac->cb) ac->cb(data->opcode, data->token, @@ -5613,7 +5630,7 @@ int q6asm_set_lrgain(struct audio_client *ac, int left_gain, int right_gain) memset(&multi_ch_gain, 0, sizeof(multi_ch_gain)); sz = sizeof(struct asm_volume_ctrl_multichannel_gain); q6asm_add_hdr_async(ac, &multi_ch_gain.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); multi_ch_gain.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; multi_ch_gain.param.data_payload_addr_lsw = 0; multi_ch_gain.param.data_payload_addr_msw = 0; @@ -5639,20 +5656,20 @@ int q6asm_set_lrgain(struct audio_client *ac, int left_gain, int right_gain) } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, multi_ch_gain.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] , set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), multi_ch_gain.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -5707,7 +5724,7 @@ int q6asm_set_multich_gain(struct audio_client *ac, uint32_t channels, memset(&multich_gain, 0, sizeof(multich_gain)); sz = sizeof(struct asm_volume_ctrl_multichannel_gain); q6asm_add_hdr_async(ac, &multich_gain.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, 1); + atomic_set(&ac->cmd_state_pp, -1); multich_gain.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; multich_gain.param.data_payload_addr_lsw = 0; multich_gain.param.data_payload_addr_msw = 0; @@ -5745,17 +5762,17 @@ int q6asm_set_multich_gain(struct audio_client *ac, uint32_t channels, } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) <= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, multich_gain.data.param_id); rc = -EINVAL; goto done; } - if (atomic_read(&ac->cmd_state) < 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%d] , set-params paramid[0x%x]\n", - __func__, atomic_read(&ac->cmd_state), - multich_gain.data.param_id); + __func__, atomic_read(&ac->cmd_state_pp), + multich_gain.data.param_id); rc = -EINVAL; goto done; } @@ -5783,7 +5800,7 @@ int q6asm_set_mute(struct audio_client *ac, int muteflag) sz = sizeof(struct asm_volume_ctrl_mute_config); q6asm_add_hdr_async(ac, &mute.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); mute.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; mute.param.data_payload_addr_lsw = 0; mute.param.data_payload_addr_msw = 0; @@ -5805,20 +5822,20 @@ int q6asm_set_mute(struct audio_client *ac, int muteflag) } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, mute.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), mute.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -5859,7 +5876,7 @@ int q6asm_dts_eagle_set(struct audio_client *ac, int param_id, uint32_t size, ad->data.param_id = param_id; ad->data.param_size = size; ad->data.reserved = 0; - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); if (po) { struct list_head *ptr, *next; @@ -5910,7 +5927,7 @@ int q6asm_dts_eagle_set(struct audio_client *ac, int param_id, uint32_t size, } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 1*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 1*HZ); if (!rc) { pr_err("DTS_EAGLE_ASM - %s: timeout, set-params paramid[0x%x]\n", __func__, ad->data.param_id); @@ -5918,12 +5935,12 @@ int q6asm_dts_eagle_set(struct audio_client *ac, int param_id, uint32_t size, goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); + atomic_read(&ac->cmd_state_pp))); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -6083,7 +6100,7 @@ static int __q6asm_set_volume(struct audio_client *ac, int volume, int instance) sz = sizeof(struct asm_volume_ctrl_master_gain); q6asm_add_hdr_async(ac, &vol.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); vol.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; vol.param.data_payload_addr_lsw = 0; vol.param.data_payload_addr_msw = 0; @@ -6105,20 +6122,20 @@ static int __q6asm_set_volume(struct audio_client *ac, int volume, int instance) } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, vol.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), vol.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } @@ -6157,7 +6174,7 @@ int q6asm_set_softpause(struct audio_client *ac, sz = sizeof(struct asm_soft_pause_params); q6asm_add_hdr_async(ac, &softpause.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); softpause.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; softpause.param.data_payload_addr_lsw = 0; @@ -6184,20 +6201,20 @@ int q6asm_set_softpause(struct audio_client *ac, } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, softpause.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), softpause.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -6237,7 +6254,7 @@ static int __q6asm_set_softvolume(struct audio_client *ac, sz = sizeof(struct asm_soft_step_volume_params); q6asm_add_hdr_async(ac, &softvol.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); softvol.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; softvol.param.data_payload_addr_lsw = 0; softvol.param.data_payload_addr_msw = 0; @@ -6262,20 +6279,20 @@ static int __q6asm_set_softvolume(struct audio_client *ac, } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, softvol.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), softvol.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -6324,7 +6341,7 @@ int q6asm_equalizer(struct audio_client *ac, void *eq_p) sz = sizeof(struct asm_eq_params); eq_params = (struct msm_audio_eq_stream_config *) eq_p; q6asm_add_hdr(ac, &eq.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); eq.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; eq.param.data_payload_addr_lsw = 0; @@ -6369,20 +6386,20 @@ int q6asm_equalizer(struct audio_client *ac, void *eq_p) } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, eq.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), eq.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -6971,7 +6988,7 @@ int q6asm_send_audio_effects_params(struct audio_client *ac, char *params, q6asm_add_hdr_async(ac, &hdr, (sizeof(struct apr_hdr) + sizeof(struct asm_stream_cmd_set_pp_params_v2) + params_length), TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; payload_params.data_payload_addr_lsw = 0; payload_params.data_payload_addr_msw = 0; @@ -6990,18 +7007,18 @@ int q6asm_send_audio_effects_params(struct audio_client *ac, char *params, goto fail_send_param; } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 1*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 1*HZ); if (!rc) { pr_err("%s: timeout, audio effects set-params\n", __func__); rc = -ETIMEDOUT; goto fail_send_param; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); + atomic_read(&ac->cmd_state_pp))); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_send_param; } @@ -7673,7 +7690,7 @@ int q6asm_send_cal(struct audio_client *ac) q6asm_add_hdr_async(ac, &hdr, (sizeof(struct apr_hdr) + sizeof(struct asm_stream_cmd_set_pp_params_v2)), TRUE); - atomic_set(&ac->cmd_state, 1); + atomic_set(&ac->cmd_state_pp, -1); hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; payload_params.data_payload_addr_lsw = lower_32_bits(cal_block->cal_data.paddr); @@ -7699,15 +7716,15 @@ int q6asm_send_cal(struct audio_client *ac) goto free; } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) <= 0), 5 * HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5 * HZ); if (!rc) { pr_err("%s: timeout, audio audstrm cal send\n", __func__); rc = -ETIMEDOUT; goto free; } - if (atomic_read(&ac->cmd_state) < 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%d] audio audstrm cal send\n", - __func__, atomic_read(&ac->cmd_state)); + __func__, atomic_read(&ac->cmd_state_pp)); rc = -EINVAL; goto free; } From b63c153cf01f585bbd1c46eb65ceb82e2a315a0c Mon Sep 17 00:00:00 2001 From: Santosh Mardi Date: Tue, 29 Nov 2016 18:21:08 +0530 Subject: [PATCH 0491/1015] ARM: dts: msm: add 740MHz DDR frequency on 8920 target 8920 target supports DDR frequency upto 740MHz, Add support for 740MHz DDR frequency for bandwidth mon and devfreq cpufreq governor. Change-Id: I0f41117e0e29647ed2d6a221aefdd5e25410674f Signed-off-by: Santosh Mardi --- arch/arm/boot/dts/qcom/msm8920.dtsi | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index d0efa7e19bbba..f8da37ab310a2 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -183,6 +183,41 @@ qcom,scaling-factor = <1000>; }; }; + + cpubw: qcom,cpubw { + qcom,bw-tbl = + < 769 /* 100.8 MHz */ >, + < 1611 /* 211.2 MHz */ >, + < 2270 /* 297.6 MHz */ >, /*SVS */ + < 2929 /* 384 MHz */ >, + < 4248 /* 556.8 MHz */ >, /*SVS+*/ + < 4541 /* 595.2 MHz */ >, /*NOM*/ + < 5126 /* 672 MHz */ >, /*NOM+*/ + < 5645 /* 740 MHz */ >; /*TURBO*/ + }; + + mincpubw: qcom,mincpubw { + qcom,bw-tbl = + < 769 /* 100.8 MHz */ >, + < 1611 /* 211.2 MHz */ >, + < 2270 /* 297.6 MHz */ >, + < 2929 /* 384 MHz */ >, + < 4248 /* 556.8 MHz */ >, + < 4541 /* 595.2 MHz */ >, + < 5126 /* 672 MHz */ >, + < 5645 /* 740 MHz */ >; + }; + + devfreq-cpufreq { + cpubw-cpufreq { + cpu-to-dev-map = + < 998400 4248 >, + < 1094400 4541 >, + < 1497600 5645 >; + }; + + }; + }; &apc_vreg_corner { From 3ab15bf56f1ed33fca640b99497236b147b4d342 Mon Sep 17 00:00:00 2001 From: Ramesh V Date: Tue, 3 Jan 2017 18:14:11 +0530 Subject: [PATCH 0492/1015] msm: camera: handle error case for B+M dualcam varibles are getting reset during streamoff, in case daemon get died during streamon then we need to reset during close call, to avoid next streamon failure. Change-Id: I8ee7d58d91912a456587523f541f010a3273df52 Signed-off-by: Ramesh V --- .../platform/msm/camera_v2/isp/msm_isp_util.c | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index 6d5350c2bbc76..9b2f181bcf9fe 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2124,6 +2124,7 @@ int msm_isp_close_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) { long rc = 0; int wm; + unsigned long flags; struct vfe_device *vfe_dev = v4l2_get_subdevdata(sd); ISP_DBG("%s E open_cnt %u\n", __func__, vfe_dev->vfe_open_cnt); mutex_lock(&vfe_dev->realtime_mutex); @@ -2137,6 +2138,27 @@ int msm_isp_close_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) return -EINVAL; } + /* reset master and slave mask in case daemon died */ + if (vfe_dev->axi_data.src_info[VFE_PIX_0].dual_hw_ms_info. + dual_hw_ms_type == MS_TYPE_MASTER) { + spin_lock_irqsave( + &vfe_dev->common_data->common_dev_data_lock, + flags); + vfe_dev->common_data->ms_resource.master_active = 0; + spin_unlock_irqrestore( + &vfe_dev->common_data->common_dev_data_lock, + flags); + } else if (vfe_dev->axi_data.src_info[VFE_PIX_0].dual_hw_ms_info. + dual_hw_ms_type == MS_TYPE_SLAVE) { + spin_lock_irqsave( + &vfe_dev->common_data->common_dev_data_lock, + flags); + vfe_dev->common_data->ms_resource.slave_active_mask = 0; + vfe_dev->common_data->ms_resource.reserved_slave_mask = 0; + spin_unlock_irqrestore( + &vfe_dev->common_data->common_dev_data_lock, + flags); + } if (vfe_dev->vfe_open_cnt > 1) { vfe_dev->vfe_open_cnt--; mutex_unlock(&vfe_dev->core_mutex); From 16c5995623fb37b836ccd998a61d1a28805146b8 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Fri, 6 Jan 2017 11:29:57 +0530 Subject: [PATCH 0493/1015] ARM: dts: msm: Update APC CPR voltage adjustments for msm8920 Update APC CPR static open-loop and closed-loop voltage margins for msm8920 parts as per recent voltage characterization results. CRs-Fixed: 1107840 Change-Id: Ibebbf1417a8a00c6c740e60dde17be903b2a6685 Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8920.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index d0efa7e19bbba..75c40731507ca 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -205,14 +205,14 @@ qcom,cpr-init-voltage-adjustment = < 0 0 0 >, - <10000 5000 0 >, + <15000 15000 25000>, < 0 0 0 >, <15000 5000 0 >, < 0 0 0 >; qcom,cpr-quotient-adjustment = <(-19) (-28) (-19)>, /* SVSP(-10) NOM(-15) TUR(-10); KV(1.9) */ - <(-9) (-19) (-9)>, /* SVSP(-5) NOM(-10) TUR(-5); KV(1.9) */ + <0 0 19 >, /* SVSP(-5) NOM(-10) TUR(-5); KV(1.9) */ <(-38) (-28) (-38)>, /* SVSP(-20) NOM(-15) TUR(-20); KV(1.9) */ <0 0 0 >, <0 0 0 >; From 07a2a5a0e5496d264ef74200c19f62de6259107b Mon Sep 17 00:00:00 2001 From: kumarn Date: Thu, 5 Jan 2017 17:58:33 -0800 Subject: [PATCH 0494/1015] Revert "arm64: Add support for 32 bit app specific settings" This reverts commit dc53d6f6205f39732e151daa84e0bfc29be70b25 Change-Id: Ie8bc4dcd7643ccc8186b9b25f9be253c12aae3e6 Signed-off-by: Naveen Kumar --- arch/arm64/include/asm/app_api.h | 7 ------- arch/arm64/kernel/app_api.c | 35 -------------------------------- arch/arm64/kernel/app_setting.c | 15 -------------- kernel/sched/core.c | 3 --- 4 files changed, 60 deletions(-) diff --git a/arch/arm64/include/asm/app_api.h b/arch/arm64/include/asm/app_api.h index 7032d636dab60..2162400fde13b 100644 --- a/arch/arm64/include/asm/app_api.h +++ b/arch/arm64/include/asm/app_api.h @@ -27,23 +27,16 @@ #ifdef CONFIG_MSM_APP_API extern void set_app_setting_bit(uint32_t bit); extern void clear_app_setting_bit(uint32_t bit); -extern void set_app_setting_bit_for_32bit_apps(void); -extern void clear_app_setting_bit_for_32bit_apps(void); #else static inline void set_app_setting_bit(uint32_t bit) {} static inline void clear_app_setting_bit(uint32_t bit) {} -static inline void set_app_setting_bit_for_32bit_apps(void) {} -static inline void clear_app_setting_bit_for_32bit_apps(void) {} #endif #ifdef CONFIG_MSM_APP_SETTINGS extern void switch_app_setting_bit(struct task_struct *prev, struct task_struct *next); -extern void switch_32bit_app_setting_bit(struct task_struct *prev, - struct task_struct *next); extern void apply_app_setting_bit(struct file *file); extern bool use_app_setting; -extern bool use_32bit_app_setting; #endif #endif diff --git a/arch/arm64/kernel/app_api.c b/arch/arm64/kernel/app_api.c index 1b3732accd4b0..39eeee1a9029b 100644 --- a/arch/arm64/kernel/app_api.c +++ b/arch/arm64/kernel/app_api.c @@ -18,7 +18,6 @@ #include static spinlock_t spinlock; -static spinlock_t spinlock_32bit_app; static DEFINE_PER_CPU(int, app_config_applied); static unsigned long app_config_set[NR_CPUS]; static unsigned long app_config_clear[NR_CPUS]; @@ -68,43 +67,9 @@ void clear_app_setting_bit(uint32_t bit) } EXPORT_SYMBOL(clear_app_setting_bit); -void set_app_setting_bit_for_32bit_apps(void) -{ - unsigned long flags; - uint64_t reg; - - spin_lock_irqsave(&spinlock_32bit_app, flags); - asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); - reg = reg | BIT(18); - reg = reg & ~BIT(2); - reg = reg | 0x3; - isb(); - asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); - isb(); - spin_unlock_irqrestore(&spinlock_32bit_app, flags); -} -EXPORT_SYMBOL(set_app_setting_bit_for_32bit_apps); - -void clear_app_setting_bit_for_32bit_apps(void) -{ - unsigned long flags; - uint64_t reg; - - spin_lock_irqsave(&spinlock_32bit_app, flags); - asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); - reg = reg & ~BIT(18); - reg = reg & ~0x3; - isb(); - asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); - isb(); - spin_unlock_irqrestore(&spinlock_32bit_app, flags); -} -EXPORT_SYMBOL(clear_app_setting_bit_for_32bit_apps); - static int __init init_app_api(void) { spin_lock_init(&spinlock); - spin_lock_init(&spinlock_32bit_app); return 0; } early_initcall(init_app_api); diff --git a/arch/arm64/kernel/app_setting.c b/arch/arm64/kernel/app_setting.c index 8e7aeab39eddb..6b4eb28d0e244 100644 --- a/arch/arm64/kernel/app_setting.c +++ b/arch/arm64/kernel/app_setting.c @@ -35,10 +35,6 @@ bool use_app_setting = true; module_param(use_app_setting, bool, 0644); MODULE_PARM_DESC(use_app_setting, "control use of app specific settings"); -bool use_32bit_app_setting = true; -module_param(use_32bit_app_setting, bool, 0644); -MODULE_PARM_DESC(use_32bit_app_setting, "control use of 32 bit app specific settings"); - static int set_name(const char *str, struct kernel_param *kp) { int len = strlen(str); @@ -91,17 +87,6 @@ void switch_app_setting_bit(struct task_struct *prev, struct task_struct *next) } EXPORT_SYMBOL(switch_app_setting_bit); -void switch_32bit_app_setting_bit(struct task_struct *prev, - struct task_struct *next) -{ - if (prev->mm && unlikely(is_compat_thread(task_thread_info(prev)))) - clear_app_setting_bit_for_32bit_apps(); - - if (next->mm && unlikely(is_compat_thread(task_thread_info(next)))) - set_app_setting_bit_for_32bit_apps(); -} -EXPORT_SYMBOL(switch_32bit_app_setting_bit); - void apply_app_setting_bit(struct file *file) { bool found = false; diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 5d5f0496700bd..984f9244d4b7e 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5643,9 +5643,6 @@ prepare_task_switch(struct rq *rq, struct task_struct *prev, #ifdef CONFIG_MSM_APP_SETTINGS if (use_app_setting) switch_app_setting_bit(prev, next); - - if (use_32bit_app_setting) - switch_32bit_app_setting_bit(prev, next); #endif } From 55b43669e0b30a06fe9d805c627428452a670efd Mon Sep 17 00:00:00 2001 From: Lijuan Gao Date: Thu, 5 Jan 2017 18:04:00 +0800 Subject: [PATCH 0495/1015] ARM: dts: msm: Correct the regulator handles for MSM8920 QRD board The later inclusion of msm8937-regulator.dtsi file in msm8920-qrd.dtsi overrides the 8920 specific MEM ACC and CPR configuration with that of 8937 specific configuration which eventually result in device under-volt scenarios and cause devices to crash. So remove the msm8937-regulator.dtsi file inclusion and update the regulator handles used in msm8920-qrd specific dtsi files. CRs-Fixed: 1107872 Change-Id: I27179afa9e535c89ee89bbd7e697da750b2e7f9f Signed-off-by: Lijuan Gao --- arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi | 8 ++++---- arch/arm/boot/dts/qcom/msm8920-qrd.dtsi | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi index 9136fe1432ae1..e2f7a8666dcbe 100644 --- a/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,7 +14,7 @@ #include "msm-pmi8940.dtsi" #include "msm8920-qrd.dtsi" #include "msm8937-mdss-panels.dtsi" -#include "msm8940-camera-sensor-qrd.dtsi" +#include "msm8917-camera-sensor-qrd.dtsi" / { qrd_batterydata: qcom,battery-data { @@ -60,8 +60,8 @@ reg = <0x38>; interrupt-parent = <&tlmm>; interrupts = <65 0x2>; - vdd-supply = <&pm8937_l10>; - vcc_i2c-supply = <&pm8937_l5>; + vdd-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; /* pins used by touchscreen */ pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", diff --git a/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi index d31ccddee96ff..4a91431f0472e 100644 --- a/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -12,7 +12,6 @@ */ #include "msm8917-pinctrl.dtsi" -#include "msm8937-regulator.dtsi" &soc { gpio_keys { @@ -80,12 +79,12 @@ &sdhc_1 { /* device core power supply */ - vdd-supply = <&pm8937_l8>; + vdd-supply = <&pm8917_l8>; qcom,vdd-voltage-level = <2900000 2900000>; qcom,vdd-current-level = <200 570000>; /* device communication power supply */ - vdd-io-supply = <&pm8937_l5>; + vdd-io-supply = <&pm8917_l5>; qcom,vdd-io-always-on; qcom,vdd-io-lpm-sup; qcom,vdd-io-voltage-level = <1800000 1800000>; @@ -105,12 +104,12 @@ &sdhc_2 { /* device core power supply */ - vdd-supply = <&pm8937_l11>; + vdd-supply = <&pm8917_l11>; qcom,vdd-voltage-level = <2950000 2950000>; qcom,vdd-current-level = <15000 800000>; /* device communication power supply */ - vdd-io-supply = <&pm8937_l12>; + vdd-io-supply = <&pm8917_l12>; qcom,vdd-io-voltage-level = <1800000 2950000>; qcom,vdd-io-current-level = <200 22000>; From 0e0e366cfff2fedb9adc4ca381776dd57b5880b9 Mon Sep 17 00:00:00 2001 From: Vijayavardhan Vennapusa Date: Tue, 3 Jan 2017 12:25:36 +0530 Subject: [PATCH 0496/1015] usb: phy: qusb2: Enable phy auto-resume phy auto-resume allows phy to automatically drive bus resume right after device driving bus resume for at least 1ms due to remote wake up, before host XHCI driver gets a chance to drive bus resume. Change-Id: Ifbd2d8212fe5ed1bdad32418300ac615091f0226 Signed-off-by: Vijayavardhan Vennapusa --- drivers/usb/phy/phy-msm-qusb.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/usb/phy/phy-msm-qusb.c b/drivers/usb/phy/phy-msm-qusb.c index 21cf09fc53548..e47002f585f52 100644 --- a/drivers/usb/phy/phy-msm-qusb.c +++ b/drivers/usb/phy/phy-msm-qusb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -63,6 +63,8 @@ #define FREEZIO_N BIT(1) #define POWER_DOWN BIT(0) +#define QUSB2PHY_PORT_TEST_CTRL 0xB8 + #define QUSB2PHY_PORT_UTMI_CTRL1 0xC0 #define SUSPEND_N BIT(5) #define TERM_SELECT BIT(4) @@ -992,6 +994,21 @@ static int qusb_phy_set_suspend(struct usb_phy *phy, int suspend) writel_relaxed(intr_mask, qphy->base + QUSB2PHY_PORT_INTR_CTRL); + /* enable phy auto-resume */ + writel_relaxed(0x0C, + qphy->base + QUSB2PHY_PORT_TEST_CTRL); + /* flush the previous write before next write */ + wmb(); + writel_relaxed(0x04, + qphy->base + QUSB2PHY_PORT_TEST_CTRL); + + + dev_dbg(phy->dev, "%s: intr_mask = %x\n", + __func__, intr_mask); + + /* Makes sure that above write goes through */ + wmb(); + qusb_phy_enable_clocks(qphy, false); } else { /* Disconnect case */ /* Disable all interrupts */ From fc404a1d187a66f767e487af5ce163af648f67f8 Mon Sep 17 00:00:00 2001 From: Imran Khan Date: Tue, 10 Jan 2017 11:10:57 +0530 Subject: [PATCH 0497/1015] arm64: Disable 32bit app specific setting For 32bit apps disable the app specific setting by default, as the kernel change is not covering all soc variants. Change-Id: Ic6ddb0b153b43ff7cdcf2b3200496b7152b7c06d Signed-off-by: Imran Khan --- arch/arm64/kernel/app_setting.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kernel/app_setting.c b/arch/arm64/kernel/app_setting.c index 8e7aeab39eddb..afb7e39dd68a0 100644 --- a/arch/arm64/kernel/app_setting.c +++ b/arch/arm64/kernel/app_setting.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -35,7 +35,7 @@ bool use_app_setting = true; module_param(use_app_setting, bool, 0644); MODULE_PARM_DESC(use_app_setting, "control use of app specific settings"); -bool use_32bit_app_setting = true; +bool use_32bit_app_setting = false; module_param(use_32bit_app_setting, bool, 0644); MODULE_PARM_DESC(use_32bit_app_setting, "control use of 32 bit app specific settings"); From 1dc21eac8660660f1c83e2975c13c1bc69660767 Mon Sep 17 00:00:00 2001 From: Santosh Mardi Date: Fri, 16 Dec 2016 11:51:28 +0530 Subject: [PATCH 0498/1015] ARM: dts: msm: add 740MHz DDR frequency on 8917-pro target 8917-pro target supports DDR frequency upto 740MHz. Add support for 740MHz DDR frequency for bandwidth mon and devfreq cpufreq governor. Change-Id: Ia5a75a121e3cbf7de312b259161e47257cf900fe Signed-off-by: Santosh Mardi --- arch/arm/boot/dts/qcom/msm8917.dtsi | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index 1dcd6dc80156c..cd233ccbb99e8 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -839,7 +839,8 @@ < 2929 /* 384 MHz */ >, < 4248 /* 556.8 MHz */ >, /*SVS+*/ < 4541 /* 595.2 MHz */ >, /*NOM*/ - < 5126 /* 672 MHz */ >; /*TURBO*/ + < 5126 /* 672 MHz */ >, /*NOM+*/ + < 5645 /* 740 MHz */ >; /*TURBO*/ }; mincpubw: qcom,mincpubw { @@ -854,7 +855,8 @@ < 2929 /* 384 MHz */ >, < 4248 /* 556.8 MHz */ >, < 4541 /* 595.2 MHz */ >, - < 5126 /* 672 MHz */ >; + < 5126 /* 672 MHz */ >, + < 5645 /* 740 MHz */ >; }; qcom,cpu-bwmon { @@ -872,7 +874,7 @@ cpu-to-dev-map = < 998400 4248 >, < 1094400 4541 >, - < 1497600 5126 >; + < 1497600 5645 >; }; mincpubw-cpufreq { From 9687dc5e7398a4ae9c1e027d12bf394da476d3f8 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Fri, 6 Jan 2017 14:13:14 +0530 Subject: [PATCH 0499/1015] ARM: dts: msm: Update APC MEM ACC settings for msm8920 Add a new fuse combination for applying a different set of MEM ACC settings for msm8920. CRs-Fixed: 1108277 Change-Id: I676c5915f2649b10da4bb092717728360199b61d Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8917-regulator.dtsi | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi index e7d66affb6ce8..43c11113423e7 100644 --- a/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -372,7 +372,8 @@ qcom,override-acc-fuse-sel = <71 17 3 0>; qcom,override-fuse-version-map = <1>, <2>, - <3>; + <3>, + <4>; qcom,override-corner1-addr-val-map = /* 1st fuse version tuple matched */ /* SVS+ => SVS+ */ @@ -405,6 +406,17 @@ <(-1) (-1)>, /* SVS+ => TURBO/NOM+ */ < 3 0x1041041>, < 4 0x1041>, < 3 0x0>, + < 4 0x0>, + + /* 4th fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 3 0x1041043>, < 4 0x1041>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 3 0x1041041>, < 4 0x1041>, < 3 0x1>, < 4 0x0>; qcom,override-corner2-addr-val-map = @@ -430,7 +442,15 @@ /* NOM => NOM */ <(-1) (-1)>, <(-1) (-1)>, /* NOM => TURBO/NOM+ */ - < 3 0x0>, < 4 0x0>; + < 3 0x0>, < 4 0x0>, + + /* 4th fuse version tuple matched */ + /* NOM => SVS+ */ + < 3 0x30c30c3>, < 4 0x30c3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 3 0x1>, < 4 0x0>; qcom,override-corner3-addr-val-map = /* 1st fuse version tuple matched */ @@ -464,6 +484,17 @@ <(-1) (-1)>, /* TURBO/NOM+ => TURBO/NOM+ */ <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + + /* 4th fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 3 0x1041041>, < 4 0x1041>, < 3 0x30c30c3>, + < 4 0x30c3>, + /* TURBO/NOM+ => NOM */ + < 3 0x1041043>, < 4 0x1041>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>; }; From a1198512affff56934c9130af0944d831214db09 Mon Sep 17 00:00:00 2001 From: Lijuan Gao Date: Thu, 5 Jan 2017 18:04:00 +0800 Subject: [PATCH 0500/1015] ARM: dts: msm: Correct the regulator handles for MSM8920 QRD board The later inclusion of msm8937-regulator.dtsi file in msm8920-qrd.dtsi overrides the 8920 specific MEM ACC and CPR configuration with that of 8937 specific configuration which eventually result in device under-volt scenarios and cause devices to crash. So remove the msm8937-regulator.dtsi file inclusion and update the regulator handles used in msm8920-qrd specific dtsi files. CRs-Fixed: 1107872 Change-Id: I27179afa9e535c89ee89bbd7e697da750b2e7f9f Signed-off-by: Lijuan Gao --- arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi | 8 ++++---- arch/arm/boot/dts/qcom/msm8920-qrd.dtsi | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi index 9136fe1432ae1..e2f7a8666dcbe 100644 --- a/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,7 +14,7 @@ #include "msm-pmi8940.dtsi" #include "msm8920-qrd.dtsi" #include "msm8937-mdss-panels.dtsi" -#include "msm8940-camera-sensor-qrd.dtsi" +#include "msm8917-camera-sensor-qrd.dtsi" / { qrd_batterydata: qcom,battery-data { @@ -60,8 +60,8 @@ reg = <0x38>; interrupt-parent = <&tlmm>; interrupts = <65 0x2>; - vdd-supply = <&pm8937_l10>; - vcc_i2c-supply = <&pm8937_l5>; + vdd-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; /* pins used by touchscreen */ pinctrl-names = "pmx_ts_active", "pmx_ts_suspend", diff --git a/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi index d31ccddee96ff..4a91431f0472e 100644 --- a/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -12,7 +12,6 @@ */ #include "msm8917-pinctrl.dtsi" -#include "msm8937-regulator.dtsi" &soc { gpio_keys { @@ -80,12 +79,12 @@ &sdhc_1 { /* device core power supply */ - vdd-supply = <&pm8937_l8>; + vdd-supply = <&pm8917_l8>; qcom,vdd-voltage-level = <2900000 2900000>; qcom,vdd-current-level = <200 570000>; /* device communication power supply */ - vdd-io-supply = <&pm8937_l5>; + vdd-io-supply = <&pm8917_l5>; qcom,vdd-io-always-on; qcom,vdd-io-lpm-sup; qcom,vdd-io-voltage-level = <1800000 1800000>; @@ -105,12 +104,12 @@ &sdhc_2 { /* device core power supply */ - vdd-supply = <&pm8937_l11>; + vdd-supply = <&pm8917_l11>; qcom,vdd-voltage-level = <2950000 2950000>; qcom,vdd-current-level = <15000 800000>; /* device communication power supply */ - vdd-io-supply = <&pm8937_l12>; + vdd-io-supply = <&pm8917_l12>; qcom,vdd-io-voltage-level = <1800000 2950000>; qcom,vdd-io-current-level = <200 22000>; From efa7d42f55f8d61d777ce47e16e5b2376aa881c5 Mon Sep 17 00:00:00 2001 From: Anand Kumar Date: Thu, 28 Jul 2016 12:26:36 +0530 Subject: [PATCH 0501/1015] wcnss: Dump WCNSS registers during SSR Timeout Dump required WCNSS registers which help to debug WCNSS failure during SSR timeout callback. Change-Id: Ie8f97043266fbc83d76c85449825539a14801f13 CRs-Fixed: 1045584 Signed-off-by: Anand Kumar --- drivers/net/wireless/wcnss/wcnss_wlan.c | 40 ++++++++++++++++++++----- include/linux/wcnss_wlan.h | 3 +- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c index f32e5d2a0e9d0..438d63b2952d7 100644 --- a/drivers/net/wireless/wcnss/wcnss_wlan.c +++ b/drivers/net/wireless/wcnss/wcnss_wlan.c @@ -589,13 +589,12 @@ void wcnss_pronto_is_a2xb_bus_stall(void *tst_addr, u32 fifo_mask, char *type) } } -/* Log pronto debug registers before sending reset interrupt */ +/* Log pronto debug registers during SSR Timeout CB */ void wcnss_pronto_log_debug_regs(void) { void __iomem *reg_addr, *tst_addr, *tst_ctrl_addr; u32 reg = 0, reg2 = 0, reg3 = 0, reg4 = 0; - reg_addr = penv->msm_wcnss_base + PRONTO_PMU_SPARE_OFFSET; reg = readl_relaxed(reg_addr); pr_err("PRONTO_PMU_SPARE %08x\n", reg); @@ -799,6 +798,33 @@ void wcnss_pronto_log_debug_regs(void) reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_AHB_CBCR_OFFSET; reg3 = readl_relaxed(reg_addr); pr_err("PMU_WLAN_AHB_CBCR %08x\n", reg3); +} +EXPORT_SYMBOL(wcnss_pronto_log_debug_regs); + +/* Log pronto debug registers before sending reset interrupt */ +void wcnss_pronto_dump_regs(void) +{ + void __iomem *reg_addr; + u32 reg = 0, reg2 = 0, reg3 = 0, reg4 = 0; + + if (!penv || !penv->triggered || !penv->msm_wcnss_base) { + pr_info(DEVICE " WCNSS driver is not triggered by userspace\n"); + return; + } + + wcnss_pronto_log_debug_regs(); + + reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_BCR_OFFSET; + reg = readl_relaxed(reg_addr); + + reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_GDSCR_OFFSET; + reg2 = readl_relaxed(reg_addr); + + reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_AHB_CBCR_OFFSET; + reg3 = readl_relaxed(reg_addr); + + reg_addr = penv->msm_wcnss_base + PRONTO_PMU_CPU_AHB_CMD_RCGR_OFFSET; + reg4 = readl_relaxed(reg_addr); msleep(50); @@ -878,7 +904,7 @@ void wcnss_pronto_log_debug_regs(void) reg = readl_relaxed(penv->alarms_tactl); pr_err("ALARMS_TACTL %08x\n", reg); } -EXPORT_SYMBOL(wcnss_pronto_log_debug_regs); +EXPORT_SYMBOL(wcnss_pronto_dump_regs); #ifdef CONFIG_WCNSS_REGISTER_DUMP_ON_BITE @@ -1095,7 +1121,7 @@ void wcnss_log_debug_regs_on_bite(void) pr_debug("wcnss: clock frequency is: %luHz\n", clk_rate); if (clk_rate) { - wcnss_pronto_log_debug_regs(); + wcnss_pronto_dump_regs(); if (wcnss_get_mux_control()) wcnss_log_iris_regs(); } else { @@ -1115,7 +1141,7 @@ void wcnss_reset_fiq(bool clk_chk_en) if (clk_chk_en) { wcnss_log_debug_regs_on_bite(); } else { - wcnss_pronto_log_debug_regs(); + wcnss_pronto_dump_regs(); if (wcnss_get_mux_control()) wcnss_log_iris_regs(); } @@ -3161,7 +3187,7 @@ wcnss_trigger_config(struct platform_device *pdev) dev_err(&pdev->dev, "Peripheral Loader failed on WCNSS.\n"); ret = PTR_ERR(penv->pil); wcnss_disable_pc_add_req(); - wcnss_pronto_log_debug_regs(); + wcnss_pronto_dump_regs(); } } while (pil_retry++ < WCNSS_MAX_PIL_RETRY && IS_ERR(penv->pil)); @@ -3413,7 +3439,7 @@ static int wcnss_notif_cb(struct notifier_block *this, unsigned long code, if (pdev && pwlanconfig) wcnss_wlan_power(&pdev->dev, pwlanconfig, WCNSS_WLAN_SWITCH_OFF, NULL); - wcnss_pronto_log_debug_regs(); + wcnss_pronto_dump_regs(); wcnss_disable_pc_remove_req(); } else if (SUBSYS_BEFORE_SHUTDOWN == code) { wcnss_disable_pc_add_req(); diff --git a/include/linux/wcnss_wlan.h b/include/linux/wcnss_wlan.h index c93364b861d9e..4363485c5e4be 100644 --- a/include/linux/wcnss_wlan.h +++ b/include/linux/wcnss_wlan.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -124,6 +124,7 @@ void wcnss_suspend_notify(void); void wcnss_resume_notify(void); void wcnss_riva_log_debug_regs(void); void wcnss_pronto_log_debug_regs(void); +void wcnss_pronto_dump_regs(void); int wcnss_is_hw_pronto_ver3(void); int wcnss_device_ready(void); bool wcnss_cbc_complete(void); From 42295c2d04c297a22d866fd4128dbbed79852132 Mon Sep 17 00:00:00 2001 From: Ghanim Fodi Date: Tue, 27 Dec 2016 13:32:35 +0200 Subject: [PATCH 0502/1015] msm: rndis_ipa: Remove rndis_ipa loopback functionality Rndis_ipa loopback functionality at rndis_ipa driver is a debug functionality that is not used. Change-Id: Ibbcb26d3871cffeb46b028efcf4d428e88eb9e10 CRs-fixed: 1104431 Signed-off-by: Ghanim Fodi --- drivers/net/ethernet/msm/rndis_ipa.c | 430 --------------------------- 1 file changed, 430 deletions(-) diff --git a/drivers/net/ethernet/msm/rndis_ipa.c b/drivers/net/ethernet/msm/rndis_ipa.c index e41169371df48..179e7081cb40d 100644 --- a/drivers/net/ethernet/msm/rndis_ipa.c +++ b/drivers/net/ethernet/msm/rndis_ipa.c @@ -135,29 +135,6 @@ enum rndis_ipa_operation { RNDIS_IPA_DEBUG("Driver state: %s\n",\ rndis_ipa_state_string(ctx->state)); -/** - * struct rndis_loopback_pipe - hold all information needed for - * pipe loopback logic - */ -struct rndis_loopback_pipe { - struct sps_pipe *ipa_sps; - struct ipa_sps_params ipa_sps_connect; - struct ipa_connect_params ipa_connect_params; - - struct sps_pipe *dma_sps; - struct sps_connect dma_connect; - - struct sps_alloc_dma_chan dst_alloc; - struct sps_dma_chan ipa_sps_channel; - enum sps_mode mode; - u32 ipa_peer_bam_hdl; - u32 peer_pipe_index; - u32 ipa_drv_ep_hdl; - u32 ipa_pipe_index; - enum ipa_client_type ipa_client; - ipa_notify_cb ipa_callback; - struct ipa_ep_cfg *ipa_ep_cfg; -}; /** * struct rndis_ipa_dev - main driver context parameters @@ -172,13 +149,9 @@ struct rndis_loopback_pipe { * @rx_dump_enable: dump all Rx packets * @icmp_filter: allow all ICMP packet to pass through the filters * @rm_enable: flag that enable/disable Resource manager request prior to Tx - * @loopback_enable: flag that enable/disable USB stub loopback * @deaggregation_enable: enable/disable IPA HW deaggregation logic * @during_xmit_error: flags that indicate that the driver is in a middle * of error handling in Tx path - * @usb_to_ipa_loopback_pipe: usb to ipa (Rx) pipe representation for loopback - * @ipa_to_usb_loopback_pipe: ipa to usb (Tx) pipe representation for loopback - * @bam_dma_hdl: handle representing bam-dma, used for loopback logic * @directory: holds all debug flags used by the driver to allow cleanup * for driver unload * @eth_ipv4_hdr_hdl: saved handle for ipv4 header-insertion table @@ -209,12 +182,8 @@ struct rndis_ipa_dev { u32 rx_dump_enable; u32 icmp_filter; u32 rm_enable; - bool loopback_enable; u32 deaggregation_enable; u32 during_xmit_error; - struct rndis_loopback_pipe usb_to_ipa_loopback_pipe; - struct rndis_loopback_pipe ipa_to_usb_loopback_pipe; - u32 bam_dma_hdl; struct dentry *directory; uint32_t eth_ipv4_hdr_hdl; uint32_t eth_ipv6_hdr_hdl; @@ -279,31 +248,12 @@ static int resource_request(struct rndis_ipa_dev *rndis_ipa_ctx); static void resource_release(struct rndis_ipa_dev *rndis_ipa_ctx); static netdev_tx_t rndis_ipa_start_xmit(struct sk_buff *skb, struct net_device *net); -static int rndis_ipa_loopback_pipe_create( - struct rndis_ipa_dev *rndis_ipa_ctx, - struct rndis_loopback_pipe *loopback_pipe); -static void rndis_ipa_destroy_loopback_pipe( - struct rndis_loopback_pipe *loopback_pipe); -static int rndis_ipa_create_loopback(struct rndis_ipa_dev *rndis_ipa_ctx); -static void rndis_ipa_destroy_loopback(struct rndis_ipa_dev *rndis_ipa_ctx); -static int rndis_ipa_setup_loopback(bool enable, - struct rndis_ipa_dev *rndis_ipa_ctx); -static int rndis_ipa_debugfs_loopback_open(struct inode *inode, - struct file *file); static int rndis_ipa_debugfs_atomic_open(struct inode *inode, struct file *file); static int rndis_ipa_debugfs_aggr_open(struct inode *inode, struct file *file); static ssize_t rndis_ipa_debugfs_aggr_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos); -static ssize_t rndis_ipa_debugfs_loopback_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); -static ssize_t rndis_ipa_debugfs_enable_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); -static ssize_t rndis_ipa_debugfs_enable_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos); -static ssize_t rndis_ipa_debugfs_loopback_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos); static ssize_t rndis_ipa_debugfs_atomic_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos); static void rndis_ipa_dump_skb(struct sk_buff *skb); @@ -338,12 +288,6 @@ const struct file_operations rndis_ipa_debugfs_atomic_ops = { .read = rndis_ipa_debugfs_atomic_read, }; -const struct file_operations rndis_ipa_loopback_ops = { - .open = rndis_ipa_debugfs_loopback_open, - .read = rndis_ipa_debugfs_loopback_read, - .write = rndis_ipa_debugfs_loopback_write, -}; - const struct file_operations rndis_ipa_aggr_ops = { .open = rndis_ipa_debugfs_aggr_open, .write = rndis_ipa_debugfs_aggr_write, @@ -2253,14 +2197,6 @@ static void rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) goto fail_file; } - file = debugfs_create_file("loopback_enable", flags_read_write, - rndis_ipa_ctx->directory, - rndis_ipa_ctx, &rndis_ipa_loopback_ops); - if (!file) { - RNDIS_IPA_ERROR("could not create outstanding file\n"); - goto fail_file; - } - file = debugfs_create_u8("state", flags_read_only, rndis_ipa_ctx->directory, (u8 *)&rndis_ipa_ctx->state); if (!file) { @@ -2424,59 +2360,6 @@ static ssize_t rndis_ipa_debugfs_aggr_write(struct file *file, return count; } -static int rndis_ipa_debugfs_loopback_open(struct inode *inode, - struct file *file) -{ - struct rndis_ipa_dev *rndis_ipa_ctx = inode->i_private; - file->private_data = rndis_ipa_ctx; - - return 0; -} - -static ssize_t rndis_ipa_debugfs_loopback_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos) -{ - int cnt; - struct rndis_ipa_dev *rndis_ipa_ctx = file->private_data; - - file->private_data = &rndis_ipa_ctx->loopback_enable; - - cnt = rndis_ipa_debugfs_enable_read(file, - ubuf, count, ppos); - - return cnt; -} - -static ssize_t rndis_ipa_debugfs_loopback_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - int retval; - int cnt; - struct rndis_ipa_dev *rndis_ipa_ctx = file->private_data; - bool old_state = rndis_ipa_ctx->loopback_enable; - - file->private_data = &rndis_ipa_ctx->loopback_enable; - - cnt = rndis_ipa_debugfs_enable_write(file, - buf, count, ppos); - - RNDIS_IPA_DEBUG("loopback_enable was set to:%d->%d\n", - old_state, rndis_ipa_ctx->loopback_enable); - - if (old_state == rndis_ipa_ctx->loopback_enable) { - RNDIS_IPA_ERROR("NOP - same state\n"); - return cnt; - } - - retval = rndis_ipa_setup_loopback( - rndis_ipa_ctx->loopback_enable, - rndis_ipa_ctx); - if (retval) - rndis_ipa_ctx->loopback_enable = old_state; - - return cnt; -} - static int rndis_ipa_debugfs_atomic_open(struct inode *inode, struct file *file) { struct rndis_ipa_dev *rndis_ipa_ctx = inode->i_private; @@ -2507,319 +2390,6 @@ static ssize_t rndis_ipa_debugfs_atomic_read(struct file *file, return simple_read_from_buffer(ubuf, count, ppos, atomic_str, nbytes); } -static ssize_t rndis_ipa_debugfs_enable_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos) -{ - int nbytes; - int size = 0; - int ret; - loff_t pos; - u8 enable_str[sizeof(char)*3] = {0}; - bool *enable = file->private_data; - pos = *ppos; - nbytes = scnprintf(enable_str, sizeof(enable_str), "%d\n", *enable); - ret = simple_read_from_buffer(ubuf, count, ppos, enable_str, nbytes); - if (ret < 0) { - RNDIS_IPA_ERROR("simple_read_from_buffer problem\n"); - return ret; - } - size += ret; - count -= nbytes; - *ppos = pos + size; - return size; -} - -static ssize_t rndis_ipa_debugfs_enable_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - unsigned long missing; - char input; - bool *enable = file->private_data; - if (count != sizeof(input) + 1) { - RNDIS_IPA_ERROR("wrong input length(%zd)\n", count); - return -EINVAL; - } - if (!buf) { - RNDIS_IPA_ERROR("Bad argument\n"); - return -EINVAL; - } - missing = copy_from_user(&input, buf, 1); - if (missing) - return -EFAULT; - RNDIS_IPA_DEBUG("input received %c\n", input); - *enable = input - '0'; - RNDIS_IPA_DEBUG("value was set to %d\n", *enable); - return count; -} - -/** - * Connects IPA->BAMDMA - * This shall simulate the path from IPA to USB - * Allowing the driver TX path - */ -static int rndis_ipa_loopback_pipe_create( - struct rndis_ipa_dev *rndis_ipa_ctx, - struct rndis_loopback_pipe *loopback_pipe) -{ - int retval; - - RNDIS_IPA_LOG_ENTRY(); - - /* SPS pipe has two side handshake - * This is the first handshake of IPA->BAMDMA, - * This is the IPA side - */ - loopback_pipe->ipa_connect_params.client = loopback_pipe->ipa_client; - loopback_pipe->ipa_connect_params.client_bam_hdl = - rndis_ipa_ctx->bam_dma_hdl; - loopback_pipe->ipa_connect_params.client_ep_idx = - loopback_pipe->peer_pipe_index; - loopback_pipe->ipa_connect_params.desc_fifo_sz = BAM_DMA_DESC_FIFO_SIZE; - loopback_pipe->ipa_connect_params.data_fifo_sz = BAM_DMA_DATA_FIFO_SIZE; - loopback_pipe->ipa_connect_params.notify = loopback_pipe->ipa_callback; - loopback_pipe->ipa_connect_params.priv = rndis_ipa_ctx; - loopback_pipe->ipa_connect_params.ipa_ep_cfg = - *(loopback_pipe->ipa_ep_cfg); - - /* loopback_pipe->ipa_sps_connect is out param */ - retval = ipa_connect(&loopback_pipe->ipa_connect_params, - &loopback_pipe->ipa_sps_connect, - &loopback_pipe->ipa_drv_ep_hdl); - if (retval) { - RNDIS_IPA_ERROR("ipa_connect() fail (%d)", retval); - return retval; - } - RNDIS_IPA_DEBUG("ipa_connect() succeeded, ipa_drv_ep_hdl=%d", - loopback_pipe->ipa_drv_ep_hdl); - - /* SPS pipe has two side handshake - * This is the second handshake of IPA->BAMDMA, - * This is the BAMDMA side - */ - loopback_pipe->dma_sps = sps_alloc_endpoint(); - if (!loopback_pipe->dma_sps) { - RNDIS_IPA_ERROR("sps_alloc_endpoint() failed "); - retval = -ENOMEM; - goto fail_sps_alloc; - } - - retval = sps_get_config(loopback_pipe->dma_sps, - &loopback_pipe->dma_connect); - if (retval) { - RNDIS_IPA_ERROR("sps_get_config() failed (%d)", retval); - goto fail_get_cfg; - } - - /* Start setting the non IPA ep for SPS driver*/ - loopback_pipe->dma_connect.mode = loopback_pipe->mode; - - /* SPS_MODE_DEST: DMA end point is the dest (consumer) IPA->DMA */ - if (loopback_pipe->mode == SPS_MODE_DEST) { - - loopback_pipe->dma_connect.source = - loopback_pipe->ipa_sps_connect.ipa_bam_hdl; - loopback_pipe->dma_connect.src_pipe_index = - loopback_pipe->ipa_sps_connect.ipa_ep_idx; - loopback_pipe->dma_connect.destination = - rndis_ipa_ctx->bam_dma_hdl; - loopback_pipe->dma_connect.dest_pipe_index = - loopback_pipe->peer_pipe_index; - - /* SPS_MODE_SRC: DMA end point is the source (producer) DMA->IPA */ - } else { - - loopback_pipe->dma_connect.source = - rndis_ipa_ctx->bam_dma_hdl; - loopback_pipe->dma_connect.src_pipe_index = - loopback_pipe->peer_pipe_index; - loopback_pipe->dma_connect.destination = - loopback_pipe->ipa_sps_connect.ipa_bam_hdl; - loopback_pipe->dma_connect.dest_pipe_index = - loopback_pipe->ipa_sps_connect.ipa_ep_idx; - - } - - loopback_pipe->dma_connect.desc = loopback_pipe->ipa_sps_connect.desc; - loopback_pipe->dma_connect.data = loopback_pipe->ipa_sps_connect.data; - loopback_pipe->dma_connect.event_thresh = 0x10; - /* BAM-to-BAM */ - loopback_pipe->dma_connect.options = SPS_O_AUTO_ENABLE; - - RNDIS_IPA_DEBUG("doing sps_connect() with - "); - RNDIS_IPA_DEBUG("src bam_hdl:0x%lx, src_pipe#:%d", - loopback_pipe->dma_connect.source, - loopback_pipe->dma_connect.src_pipe_index); - RNDIS_IPA_DEBUG("dst bam_hdl:0x%lx, dst_pipe#:%d", - loopback_pipe->dma_connect.destination, - loopback_pipe->dma_connect.dest_pipe_index); - - retval = sps_connect(loopback_pipe->dma_sps, - &loopback_pipe->dma_connect); - if (retval) { - RNDIS_IPA_ERROR("sps_connect() fail for BAMDMA side (%d)", - retval); - goto fail_sps_connect; - } - - RNDIS_IPA_LOG_EXIT(); - - return 0; - -fail_sps_connect: -fail_get_cfg: - sps_free_endpoint(loopback_pipe->dma_sps); -fail_sps_alloc: - ipa_disconnect(loopback_pipe->ipa_drv_ep_hdl); - return retval; -} - -static void rndis_ipa_destroy_loopback_pipe( - struct rndis_loopback_pipe *loopback_pipe) -{ - sps_disconnect(loopback_pipe->dma_sps); - sps_free_endpoint(loopback_pipe->dma_sps); -} - -/** - * rndis_ipa_create_loopback() - create a BAM-DMA loopback - * in order to replace the USB core - */ -static int rndis_ipa_create_loopback(struct rndis_ipa_dev *rndis_ipa_ctx) -{ - /* The BAM handle should be use as - * source/destination in the sps_connect() - */ - int retval; - - RNDIS_IPA_LOG_ENTRY(); - - - retval = sps_ctrl_bam_dma_clk(true); - if (retval) { - RNDIS_IPA_ERROR("fail on enabling BAM-DMA clocks"); - return -ENODEV; - } - - /* Get BAM handle instead of USB handle */ - rndis_ipa_ctx->bam_dma_hdl = sps_dma_get_bam_handle(); - if (!rndis_ipa_ctx->bam_dma_hdl) { - RNDIS_IPA_ERROR("sps_dma_get_bam_handle() failed"); - return -ENODEV; - } - RNDIS_IPA_DEBUG("sps_dma_get_bam_handle() succeeded (0x%x)", - rndis_ipa_ctx->bam_dma_hdl); - - /* IPA<-BAMDMA, NetDev Rx path (BAMDMA is the USB stub) */ - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.ipa_client = - IPA_CLIENT_USB_PROD; - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.peer_pipe_index = - FROM_USB_TO_IPA_BAMDMA; - /*DMA EP mode*/ - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.mode = SPS_MODE_SRC; - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.ipa_ep_cfg = - &usb_to_ipa_ep_cfg_deaggr_en; - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.ipa_callback = - rndis_ipa_packet_receive_notify; - RNDIS_IPA_DEBUG("setting up IPA<-BAMDAM pipe (RNDIS_IPA RX path)"); - retval = rndis_ipa_loopback_pipe_create(rndis_ipa_ctx, - &rndis_ipa_ctx->usb_to_ipa_loopback_pipe); - if (retval) { - RNDIS_IPA_ERROR("fail to close IPA->BAMDAM pipe"); - goto fail_to_usb; - } - RNDIS_IPA_DEBUG("IPA->BAMDAM pipe successfully connected (TX path)"); - - /* IPA->BAMDMA, NetDev Tx path (BAMDMA is the USB stub)*/ - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.ipa_client = - IPA_CLIENT_USB_CONS; - /*DMA EP mode*/ - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.mode = SPS_MODE_DEST; - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.ipa_ep_cfg = &ipa_to_usb_ep_cfg; - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.peer_pipe_index = - FROM_IPA_TO_USB_BAMDMA; - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.ipa_callback = - rndis_ipa_tx_complete_notify; - RNDIS_IPA_DEBUG("setting up IPA->BAMDAM pipe (RNDIS_IPA TX path)"); - retval = rndis_ipa_loopback_pipe_create(rndis_ipa_ctx, - &rndis_ipa_ctx->ipa_to_usb_loopback_pipe); - if (retval) { - RNDIS_IPA_ERROR("fail to close IPA<-BAMDAM pipe"); - goto fail_from_usb; - } - RNDIS_IPA_DEBUG("IPA<-BAMDAM pipe successfully connected(RX path)"); - - RNDIS_IPA_LOG_EXIT(); - - return 0; - -fail_from_usb: - rndis_ipa_destroy_loopback_pipe( - &rndis_ipa_ctx->usb_to_ipa_loopback_pipe); -fail_to_usb: - - return retval; -} - -static void rndis_ipa_destroy_loopback(struct rndis_ipa_dev *rndis_ipa_ctx) -{ - rndis_ipa_destroy_loopback_pipe( - &rndis_ipa_ctx->ipa_to_usb_loopback_pipe); - rndis_ipa_destroy_loopback_pipe( - &rndis_ipa_ctx->usb_to_ipa_loopback_pipe); - sps_dma_free_bam_handle(rndis_ipa_ctx->bam_dma_hdl); - if (sps_ctrl_bam_dma_clk(false)) - RNDIS_IPA_ERROR("fail to disable BAM-DMA clocks"); -} - -/** - * rndis_ipa_setup_loopback() - create/destroy a loopback on IPA HW - * (as USB pipes loopback) and notify RNDIS_IPA netdev for pipe connected - * @enable: flag that determines if the loopback should be created or destroyed - * @rndis_ipa_ctx: driver main context - * - * This function is the main loopback logic. - * It shall create/destory the loopback by using BAM-DMA and notify - * the netdev accordingly. - */ -static int rndis_ipa_setup_loopback(bool enable, - struct rndis_ipa_dev *rndis_ipa_ctx) -{ - int retval; - - if (!enable) { - rndis_ipa_destroy_loopback(rndis_ipa_ctx); - RNDIS_IPA_DEBUG("loopback destroy done"); - retval = rndis_ipa_pipe_disconnect_notify(rndis_ipa_ctx); - if (retval) { - RNDIS_IPA_ERROR("connect notify fail"); - return -ENODEV; - } - return 0; - } - - RNDIS_IPA_DEBUG("creating loopback (instead of USB core)"); - retval = rndis_ipa_create_loopback(rndis_ipa_ctx); - RNDIS_IPA_DEBUG("creating loopback- %s", (retval ? "FAIL" : "OK")); - if (retval) { - RNDIS_IPA_ERROR("Fail to connect loopback"); - return -ENODEV; - } - retval = rndis_ipa_pipe_connect_notify( - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.ipa_drv_ep_hdl, - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.ipa_drv_ep_hdl, - BAM_DMA_DATA_FIFO_SIZE, - 15, - BAM_DMA_DATA_FIFO_SIZE - rndis_ipa_ctx->net->mtu, - rndis_ipa_ctx); - if (retval) { - RNDIS_IPA_ERROR("connect notify fail"); - return -ENODEV; - } - - return 0; - -} - static int rndis_ipa_init_module(void) { pr_info("RNDIS_IPA module is loaded."); From c24938d1c23dcb90bc7c6df06e982f715db0d0e6 Mon Sep 17 00:00:00 2001 From: Xiaojun Sang Date: Fri, 16 Dec 2016 16:25:27 +0800 Subject: [PATCH 0503/1015] ASoC: soc: msm: initialize buffer to prevent kernel data leakage To prevent potential kernel stack data leakage, initialize channel_map[]. CRs-Fixed: 1100878 Change-Id: I7b81cea20485bc7514551672bb54c7fd455049e3 Signed-off-by: Xiaojun Sang --- sound/soc/msm/qdsp6v2/msm-qti-pp-config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c b/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c index 73e6311d96d69..da82df8e4b110 100644 --- a/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c +++ b/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c @@ -573,7 +573,7 @@ static int msm_qti_pp_set_sec_auxpcm_lb_vol_mixer( static int msm_qti_pp_get_channel_map_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL]; + char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL] = {0}; int i; adm_get_multi_ch_map(channel_map, ADM_PATH_PLAYBACK); From abfc34ce7f6b7ef6ad6197c89b0fcbfadfd4efbd Mon Sep 17 00:00:00 2001 From: Kumar Behera Date: Fri, 9 Dec 2016 09:55:00 -0800 Subject: [PATCH 0504/1015] msm: cpp: Fix for integer overflow in cpp Due to integer overflow ,the bound check in config frame function may pass and this may allow user to access invalid buffer. This fix takes care of proper bound and don't allow integer overflow. CRs-Fxied: 1097709 Change-Id: I504ad591633afaba82268b5ee27a321691d75c80 Signed-off-by: Kumar Behera --- drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index e02188510bff9..cd3201396a815 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -2245,7 +2245,7 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev, struct msm_buf_mngr_info buff_mgr_info, dup_buff_mgr_info; int32_t in_fd; int32_t num_output_bufs = 1; - int32_t stripe_base = 0; + uint32_t stripe_base = 0; uint32_t stripe_size; uint8_t tnr_enabled; enum msm_camera_buf_mngr_buf_type buf_type = @@ -2280,6 +2280,13 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev, return -EINVAL; } + if (stripe_base == UINT_MAX || new_frame->num_strips > + (UINT_MAX - 1 - stripe_base) / stripe_size) { + pr_err("Invalid frame message,num_strips %d is large\n", + new_frame->num_strips); + return -EINVAL; + } + if ((stripe_base + new_frame->num_strips * stripe_size + 1) != new_frame->msg_len) { pr_err("Invalid frame message,len=%d,expected=%d\n", From e2ebd879e43906f8b01e80572dde99a05afb313b Mon Sep 17 00:00:00 2001 From: Aditya Bavanari Date: Thu, 22 Dec 2016 16:41:27 +0530 Subject: [PATCH 0505/1015] ASoC: msm8996: Fix kernel crash in "Speaker Function" mixer control Use snd_soc_kcontrol_codec instead of snd_kcontrol_chip to obtain the codec information from the kcontrol. CRs-Fixed: 1099607 Change-Id: Iba3004c2745e5f0bbe778e44c803826351b3b939 Signed-off-by: Aditya Bavanari --- sound/soc/msm/msm8996.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/msm/msm8996.c b/sound/soc/msm/msm8996.c index 5fa5d552d5ab2..c54c30a6c2220 100644 --- a/sound/soc/msm/msm8996.c +++ b/sound/soc/msm/msm8996.c @@ -353,7 +353,7 @@ static int msm8996_get_spk(struct snd_kcontrol *kcontrol, static int msm8996_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s() ucontrol->value.integer.value[0] = %ld\n", __func__, ucontrol->value.integer.value[0]); From 1505f3b5ee92ace4785f119ab33e0a6540fd3422 Mon Sep 17 00:00:00 2001 From: Arumuga Durai A Date: Tue, 27 Dec 2016 19:50:06 +0530 Subject: [PATCH 0506/1015] USB: gadget: mbim: Avoid copying uninitialized data to userspace A race condition bug in function 'mbim_bind_config' allows to change 'mbim->xport' type to invalid value. This allows mbim_ioctl() to copy the uninitialized data to userspace. Fix this by avoiding copy_to_user() call when transport type is invalid. Change-Id: If8e8b6d4e2c347e1aff529bed0a798128eaea07c CRs-Fixed: 1102418 Signed-off-by: Arumuga Durai A --- drivers/usb/gadget/function/f_mbim.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_mbim.c b/drivers/usb/gadget/function/f_mbim.c index 017a2a9cb6ea6..499174555154e 100644 --- a/drivers/usb/gadget/function/f_mbim.c +++ b/drivers/usb/gadget/function/f_mbim.c @@ -2030,7 +2030,7 @@ static long mbim_ioctl(struct file *fp, unsigned cmd, unsigned long arg) default: ret = -ENODEV; pr_err("unknown transport\n"); - break; + goto fail; } ret = copy_to_user((void __user *)arg, &info, @@ -2046,6 +2046,7 @@ static long mbim_ioctl(struct file *fp, unsigned cmd, unsigned long arg) ret = -EINVAL; } +fail: mbim_unlock(&mbim->ioctl_excl); return ret; From 2e3e4457fc17fe12b58665d9682dfc9c78fe89b3 Mon Sep 17 00:00:00 2001 From: Karthik Reddy Katta Date: Wed, 28 Dec 2016 11:24:33 +0530 Subject: [PATCH 0507/1015] drivers: soc: qcom: Add overflow check for sound model size Overflow check is added for sound model size to prevent heap overflow while allocating memory for sound model data. CRs-Fixed: 1100682 Change-Id: Id38523a5e79028c692670e84d5fe924a855a5a10 Signed-off-by: Karthik Reddy Katta --- sound/soc/msm/msm-cpe-lsm.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sound/soc/msm/msm-cpe-lsm.c b/sound/soc/msm/msm-cpe-lsm.c index 0784502512774..e652fc6647470 100644 --- a/sound/soc/msm/msm-cpe-lsm.c +++ b/sound/soc/msm/msm-cpe-lsm.c @@ -1869,6 +1869,13 @@ static int msm_cpe_lsm_reg_model(struct snd_pcm_substream *substream, lsm_ops->lsm_get_snd_model_offset(cpe->core_handle, session, &offset); + /* Check if 'p_info->param_size + offset' crosses U32_MAX. */ + if (p_info->param_size > U32_MAX - offset) { + dev_err(rtd->dev, + "%s: Invalid param_size %d\n", + __func__, p_info->param_size); + return -EINVAL; + } session->snd_model_size = p_info->param_size + offset; session->snd_model_data = vzalloc(session->snd_model_size); From 90fbbe0c6a9da25121a55208e7855a1672fe70e6 Mon Sep 17 00:00:00 2001 From: Mohit Aggarwal Date: Thu, 24 Nov 2016 13:48:12 +0530 Subject: [PATCH 0508/1015] diag: Set in_busy only after initialization of read buffers Currently, there is a possibility that read buffers are not initialized but diag ends up marking buffers busy and stops reading from peripheral, which leads to port loss. Also reset the in_busy variable for the buffer that reads the data from smd channel when diag smd state is closed. CRs-Fixed: 1093989 Change-Id: I1990d0ded5a212c9185c149ac297a3630d64bc59 Signed-off-by: Mohit Aggarwal --- drivers/char/diag/diagfwd_peripheral.c | 12 ++++++++---- drivers/char/diag/diagfwd_smd.c | 5 ++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/char/diag/diagfwd_peripheral.c b/drivers/char/diag/diagfwd_peripheral.c index 7151771015938..b8dea63a427ed 100644 --- a/drivers/char/diag/diagfwd_peripheral.c +++ b/drivers/char/diag/diagfwd_peripheral.c @@ -908,8 +908,6 @@ void diagfwd_channel_read(struct diagfwd_info *fwd_info) } if (fwd_info->buf_1 && !atomic_read(&fwd_info->buf_1->in_busy)) { - temp_buf = fwd_info->buf_1; - atomic_set(&temp_buf->in_busy, 1); if (driver->feature[fwd_info->peripheral].encode_hdlc && (fwd_info->type == TYPE_DATA || fwd_info->type == TYPE_CMD)) { @@ -919,9 +917,11 @@ void diagfwd_channel_read(struct diagfwd_info *fwd_info) read_buf = fwd_info->buf_1->data; read_len = fwd_info->buf_1->len; } + if (read_buf) { + temp_buf = fwd_info->buf_1; + atomic_set(&temp_buf->in_busy, 1); + } } else if (fwd_info->buf_2 && !atomic_read(&fwd_info->buf_2->in_busy)) { - temp_buf = fwd_info->buf_2; - atomic_set(&temp_buf->in_busy, 1); if (driver->feature[fwd_info->peripheral].encode_hdlc && (fwd_info->type == TYPE_DATA || fwd_info->type == TYPE_CMD)) { @@ -931,6 +931,10 @@ void diagfwd_channel_read(struct diagfwd_info *fwd_info) read_buf = fwd_info->buf_2->data; read_len = fwd_info->buf_2->len; } + if (read_buf) { + temp_buf = fwd_info->buf_2; + atomic_set(&temp_buf->in_busy, 1); + } } else { pr_debug("diag: In %s, both buffers are empty for p: %d, t: %d\n", __func__, fwd_info->peripheral, fwd_info->type); diff --git a/drivers/char/diag/diagfwd_smd.c b/drivers/char/diag/diagfwd_smd.c index 3ee21101e2f22..0654e7eedc5eb 100644 --- a/drivers/char/diag/diagfwd_smd.c +++ b/drivers/char/diag/diagfwd_smd.c @@ -740,14 +740,13 @@ static int diag_smd_read(void *ctxt, unsigned char *buf, int buf_len) } /* - * In this case don't reset the buffers as there is no need to further - * read over peripherals. Also release the wake source hold earlier. + * Reset the buffers. Also release the wake source hold earlier. */ if (atomic_read(&smd_info->diag_state) == 0) { DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s closing read thread. diag state is closed\n", smd_info->name); - diag_ws_release(); + diagfwd_channel_read_done(smd_info->fwd_ctxt, buf, 0); return 0; } From 24155364640f51b4928c3dcd7270fa4d813cc25b Mon Sep 17 00:00:00 2001 From: "Kirill A. Shutemov" Date: Mon, 6 Jul 2015 23:18:37 +0300 Subject: [PATCH 0509/1015] mm: avoid setting up anonymous pages into file mapping Reading page fault handler code I've noticed that under right circumstances kernel would map anonymous pages into file mappings: if the VMA doesn't have vm_ops->fault() and the VMA wasn't fully populated on ->mmap(), kernel would handle page fault to not populated pte with do_anonymous_page(). Let's change page fault handler to use do_anonymous_page() only on anonymous VMA (->vm_ops == NULL) and make sure that the VMA is not shared. For file mappings without vm_ops->fault() or shred VMA without vm_ops, page fault on pte_none() entry would lead to SIGBUS. Change-Id: I009546fba24e76be86f7de2e411e0be72145812f Signed-off-by: Kirill A. Shutemov Acked-by: Oleg Nesterov Cc: Andrew Morton Cc: Willy Tarreau Cc: stable@vger.kernel.org Signed-off-by: Linus Torvalds [d-cagle@codeaurora.org: Resolve trivial merge conflicts] Git-repo: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 6b7339f4c31ad69c8e9c0b2859276e22cf72176d Signed-off-by: Dennis Cagle --- mm/memory.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index 62b30f222c092..276a433c20c59 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -2630,6 +2630,10 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, pte_unmap(page_table); + /* File mapping without ->vm_ops ? */ + if (vma->vm_flags & VM_SHARED) + return VM_FAULT_SIGBUS; + /* Check if we need to add a guard page to the stack */ if (check_stack_guard_page(vma, address) < 0) return VM_FAULT_SIGSEGV; @@ -3034,6 +3038,9 @@ static int do_linear_fault(struct mm_struct *mm, struct vm_area_struct *vma, - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; pte_unmap(page_table); + /* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND */ + if (!vma->vm_ops->fault) + return VM_FAULT_SIGBUS; if (!(flags & FAULT_FLAG_WRITE)) return do_read_fault(mm, vma, address, pmd, pgoff, flags, orig_pte); @@ -3199,13 +3206,12 @@ static int handle_pte_fault(struct mm_struct *mm, entry = ACCESS_ONCE(*pte); if (!pte_present(entry)) { if (pte_none(entry)) { - if (vma->vm_ops) { - if (likely(vma->vm_ops->fault)) - return do_linear_fault(mm, vma, address, - pte, pmd, flags, entry); - } - return do_anonymous_page(mm, vma, address, - pte, pmd, flags); + if (vma->vm_ops) + return do_linear_fault(mm, vma, address, pte, + pmd, flags, entry); + + return do_anonymous_page(mm, vma, address, pte, pmd, + flags); } if (pte_file(entry)) return do_nonlinear_fault(mm, vma, address, From a8b56a135dabda609ca12c1ca483c88ff2e5085e Mon Sep 17 00:00:00 2001 From: Daniel Rosenberg Date: Wed, 2 Nov 2016 17:43:51 -0700 Subject: [PATCH 0510/1015] ion: Fix use after free during ION_IOC_ALLOC If a user happens to call ION_IOC_FREE during an ION_IOC_ALLOC on the just allocated id, and the copy_to_user fails, the cleanup code will attempt to free an already freed handle. This adds a wrapper for ion_alloc that adds an ion_handle_get to avoid this. Bug: 31568617 Change-Id: I476e5bd5372b5178a213f1fea143d270cf9361ed Signed-off-by: Daniel Rosenberg Git-repo: https://android.googlesource.com/kernel/msm/ Git-commit: 20a5411d0115b16826f3d327b6abb0192c8a2001 Signed-off-by: Dennis Cagle --- drivers/staging/android/ion/ion.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index 5b5d1ae9046bc..92f9f447df87f 100755 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -507,9 +507,9 @@ static int ion_handle_add(struct ion_client *client, struct ion_handle *handle) return 0; } -struct ion_handle *ion_alloc(struct ion_client *client, size_t len, +static struct ion_handle *__ion_alloc(struct ion_client *client, size_t len, size_t align, unsigned int heap_id_mask, - unsigned int flags) + unsigned int flags, bool grab_handle) { struct ion_handle *handle; struct ion_device *dev = client->dev; @@ -604,6 +604,8 @@ struct ion_handle *ion_alloc(struct ion_client *client, size_t len, return handle; mutex_lock(&client->lock); + if (grab_handle) + ion_handle_get(handle); ret = ion_handle_add(client, handle); mutex_unlock(&client->lock); if (ret) { @@ -613,6 +615,13 @@ struct ion_handle *ion_alloc(struct ion_client *client, size_t len, return handle; } + +struct ion_handle *ion_alloc(struct ion_client *client, size_t len, + size_t align, unsigned int heap_id_mask, + unsigned int flags) +{ + return __ion_alloc(client, len, align, heap_id_mask, flags, false); +} EXPORT_SYMBOL(ion_alloc); static void ion_free_nolock(struct ion_client *client, struct ion_handle *handle) @@ -1488,10 +1497,10 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct ion_handle *handle; - handle = ion_alloc(client, data.allocation.len, + handle = __ion_alloc(client, data.allocation.len, data.allocation.align, data.allocation.heap_id_mask, - data.allocation.flags); + data.allocation.flags, true); if (IS_ERR(handle)) return PTR_ERR(handle); @@ -1568,11 +1577,15 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) if (dir & _IOC_READ) { if (copy_to_user((void __user *)arg, &data, _IOC_SIZE(cmd))) { - if (cleanup_handle) + if (cleanup_handle) { ion_free(client, cleanup_handle); + ion_handle_put(cleanup_handle); + } return -EFAULT; } } + if (cleanup_handle) + ion_handle_put(cleanup_handle); return ret; } From ddbf2256c9280d436bdee2c68f4a6cc5d2a42f61 Mon Sep 17 00:00:00 2001 From: David Howells Date: Wed, 26 Oct 2016 15:01:54 +0100 Subject: [PATCH 0511/1015] KEYS: Fix short sprintf buffer in /proc/keys show function This fixes CVE-2016-7042. Fix a short sprintf buffer in proc_keys_show(). If the gcc stack protector is turned on, this can cause a panic due to stack corruption. The problem is that xbuf[] is not big enough to hold a 64-bit timeout rendered as weeks: (gdb) p 0xffffffffffffffffULL/(60*60*24*7) $2 = 30500568904943 That's 14 chars plus NUL, not 11 chars plus NUL. Expand the buffer to 16 chars. I think the unpatched code apparently works if the stack-protector is not enabled because on a 32-bit machine the buffer won't be overflowed and on a 64-bit machine there's a 64-bit aligned pointer at one side and an int that isn't checked again on the other side. The panic incurred looks something like: Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: ffffffff81352ebe CPU: 0 PID: 1692 Comm: reproducer Not tainted 4.7.2-201.fc24.x86_64 #1 Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 0000000000000086 00000000fbbd2679 ffff8800a044bc00 ffffffff813d941f ffffffff81a28d58 ffff8800a044bc98 ffff8800a044bc88 ffffffff811b2cb6 ffff880000000010 ffff8800a044bc98 ffff8800a044bc30 00000000fbbd2679 Call Trace: [] dump_stack+0x63/0x84 [] panic+0xde/0x22a [] ? proc_keys_show+0x3ce/0x3d0 [] __stack_chk_fail+0x19/0x30 [] proc_keys_show+0x3ce/0x3d0 [] ? key_validate+0x50/0x50 [] ? key_default_cmp+0x20/0x20 [] seq_read+0x2cc/0x390 [] proc_reg_read+0x42/0x70 [] __vfs_read+0x37/0x150 [] ? security_file_permission+0xa0/0xc0 [] vfs_read+0x96/0x130 [] SyS_read+0x55/0xc0 [] entry_SYSCALL_64_fastpath+0x1a/0xa4 Change-Id: I23554b54eb9b82f44554a3ef620200de9f6ea55a Reported-by: Ondrej Kozina Signed-off-by: David Howells Tested-by: Ondrej Kozina cc: stable@vger.kernel.org Signed-off-by: James Morris Git-repo: http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: 03dab869b7b239c4e013ec82aea22e181e441cfc Signed-off-by: Dennis Cagle --- security/keys/proc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security/keys/proc.c b/security/keys/proc.c index 972eeb336b814..9962535ef9ad8 100644 --- a/security/keys/proc.c +++ b/security/keys/proc.c @@ -187,7 +187,7 @@ static int proc_keys_show(struct seq_file *m, void *v) struct timespec now; unsigned long timo; key_ref_t key_ref, skey_ref; - char xbuf[12]; + char xbuf[16]; int rc; struct keyring_search_context ctx = { From 9e2103cabe4470ecfb5013ca915627f3d6a94393 Mon Sep 17 00:00:00 2001 From: John Dias Date: Wed, 9 Nov 2016 11:03:57 -0800 Subject: [PATCH 0512/1015] perf: don't leave group_entry on sibling list (use-after-free) When perf_group_detach is called on a group leader, it should empty its sibling list. Otherwise, when a sibling is later deallocated, list_del_event() removes the sibling's group_entry from its current list, which can be the now-deallocated group leader's sibling list (use-after-free bug). Bug: 32402548 Change-Id: I99f6bc97c8518df1cb0035814368012ba72ab1f1 Signed-off-by: John Dias Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 6b6cfb2362f09553b46b3b7e5684b16b6e53e373 Signed-off-by: Dennis Cagle --- kernel/events/core.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/events/core.c b/kernel/events/core.c index edef27d91c7ac..94a2c9dca1a87 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -1451,10 +1451,17 @@ static void perf_group_detach(struct perf_event *event) * If this was a group event with sibling events then * upgrade the siblings to singleton events by adding them * to whatever list we are on. + * If this isn't on a list, make sure we still remove the sibling's + * group_entry from this sibling_list; otherwise, when that sibling + * is later deallocated, it will try to remove itself from this + * sibling_list, which may well have been deallocated already, + * resulting in a use-after-free. */ list_for_each_entry_safe(sibling, tmp, &event->sibling_list, group_entry) { if (list) list_move_tail(&sibling->group_entry, list); + else + list_del_init(&sibling->group_entry); sibling->group_leader = sibling; /* Inherit group flags from the previous leader */ From a5da1de7dd0b21076badaf0d7b3a5638d3127733 Mon Sep 17 00:00:00 2001 From: Siqi Lin Date: Wed, 2 Nov 2016 16:51:08 -0700 Subject: [PATCH 0513/1015] ALSA: info: Check for integer overflow in snd_info_entry_write() snd_info_entry_write() resizes the buffer with an unsigned long size argument that gets truncated because resize_info_buffer() takes the size parameter as an unsigned int. On 64-bit kernels, this causes the following copy_to_user() to write out-of-bounds if (pos + count) can't be represented by an unsigned int. Bug: 32510733 Change-Id: I9e8b55f93f2bd606b4a73b5a4525b71ee88c7c23 Signed-off-by: Siqi Lin Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 600c59f1f58bf30716d4a072add85f8da77c145c Signed-off-by: Dennis Cagle --- sound/core/info.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sound/core/info.c b/sound/core/info.c index 418b4ec43cadb..a4af0ba92d30f 100644 --- a/sound/core/info.c +++ b/sound/core/info.c @@ -253,6 +253,7 @@ static ssize_t snd_info_entry_write(struct file *file, const char __user *buffer struct snd_info_buffer *buf; ssize_t size = 0; loff_t pos; + unsigned long realloc_size; data = file->private_data; if (snd_BUG_ON(!data)) @@ -261,7 +262,8 @@ static ssize_t snd_info_entry_write(struct file *file, const char __user *buffer pos = *offset; if (pos < 0 || (long) pos != pos || (ssize_t) count < 0) return -EIO; - if ((unsigned long) pos + (unsigned long) count < (unsigned long) pos) + realloc_size = (unsigned long) pos + (unsigned long) count; + if (realloc_size < (unsigned long) pos || realloc_size > UINT_MAX) return -EIO; switch (entry->content) { case SNDRV_INFO_CONTENT_TEXT: From acfa1a6374805886d8d1061ec3bd645ddaf03482 Mon Sep 17 00:00:00 2001 From: "Steven Rostedt (Red Hat)" Date: Fri, 13 May 2016 09:34:12 -0400 Subject: [PATCH 0514/1015] ring-buffer: Prevent overflow of size in ring_buffer_resize() If the size passed to ring_buffer_resize() is greater than MAX_LONG - BUF_PAGE_SIZE then the DIV_ROUND_UP() will return zero. Here's the details: # echo 18014398509481980 > /sys/kernel/debug/tracing/buffer_size_kb tracing_entries_write() processes this and converts kb to bytes. 18014398509481980 << 10 = 18446744073709547520 and this is passed to ring_buffer_resize() as unsigned long size. size = DIV_ROUND_UP(size, BUF_PAGE_SIZE); Where DIV_ROUND_UP(a, b) is (a + b - 1)/b BUF_PAGE_SIZE is 4080 and here 18446744073709547520 + 4080 - 1 = 18446744073709551599 where 18446744073709551599 is still smaller than 2^64 2^64 - 18446744073709551599 = 17 But now 18446744073709551599 / 4080 = 4521260802379792 and size = size * 4080 = 18446744073709551360 This is checked to make sure its still greater than 2 * 4080, which it is. Then we convert to the number of buffer pages needed. nr_page = DIV_ROUND_UP(size, BUF_PAGE_SIZE) but this time size is 18446744073709551360 and 2^64 - (18446744073709551360 + 4080 - 1) = -3823 Thus it overflows and the resulting number is less than 4080, which makes 3823 / 4080 = 0 an nr_pages is set to this. As we already checked against the minimum that nr_pages may be, this causes the logic to fail as well, and we crash the kernel. There's no reason to have the two DIV_ROUND_UP() (that's just result of historical code changes), clean up the code and fix this bug. Change-Id: I32ce227e37d34578c38769e4db7f283cc1215a22 Cc: stable@vger.kernel.org # 3.5+ Fixes: 83f40318dab00 ("ring-buffer: Make removal of ring buffer pages atomic") Signed-off-by: Steven Rostedt Git-repo: http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: 59643d1535eb220668692a5359de22545af579f6 Signed-off-by: Dennis Cagle --- kernel/trace/ring_buffer.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 0fc5cfedcc8c7..7d370a6ebf181 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -1693,14 +1693,13 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size, !cpumask_test_cpu(cpu_id, buffer->cpumask)) return size; - size = DIV_ROUND_UP(size, BUF_PAGE_SIZE); - size *= BUF_PAGE_SIZE; + nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE); /* we need a minimum of two pages */ - if (size < BUF_PAGE_SIZE * 2) - size = BUF_PAGE_SIZE * 2; + if (nr_pages < 2) + nr_pages = 2; - nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE); + size = nr_pages * BUF_PAGE_SIZE; /* * Don't succeed if resizing is disabled, as a reader might be From 82e43ba7044d8e29f872b1cf99c4d1720cde9e78 Mon Sep 17 00:00:00 2001 From: Andrew Chant Date: Sun, 13 Nov 2016 17:03:13 -0800 Subject: [PATCH 0515/1015] input: synaptics_dsx: add update bounds checks. Firmware updates contain offsets that are parsed by the kernel driver. Ensure all offsets are within the bounds of the firmware update. TESTED: successfully parsed update firmware on device boot. Bug: 31525965 Bug: 31968442 Change-Id: I074d3f26d33f723a0b239b59ebc3a680d991cdae Signed-off-by: Andrew Chant Git-repo: https://android.googlesource.com/kernel/msm Git-commit: ac2afe08221e0d077befd2e6f216598640af2d51 Signed-off-by: Dennis Cagle --- .../input/touchscreen/synaptics_fw_update.c | 70 ++++++++++++++++--- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_fw_update.c b/drivers/input/touchscreen/synaptics_fw_update.c index 7d0dd3876890f..0683f60165066 100644 --- a/drivers/input/touchscreen/synaptics_fw_update.c +++ b/drivers/input/touchscreen/synaptics_fw_update.c @@ -260,6 +260,7 @@ struct synaptics_rmi4_fwu_handle { bool interrupt_flag; bool polling_mode; char product_id[SYNAPTICS_RMI4_PRODUCT_ID_SIZE + 1]; + unsigned int full_update_size; unsigned int image_size; unsigned int data_pos; unsigned char intr_mask; @@ -299,6 +300,22 @@ static struct synaptics_rmi4_fwu_handle *fwu; DECLARE_COMPLETION(fwu_remove_complete); DEFINE_MUTEX(fwu_sysfs_mutex); +/* Check offset + size <= bound. 1 if in bounds, 0 otherwise. */ +static bool in_bounds(unsigned long offset, + unsigned long size, + unsigned long bound) +{ + if (offset > bound || size > bound) { + pr_err("%s: %lu or %lu > %lu\n", __func__, offset, size, bound); + return 0; + } + if (offset > (bound - size)) { + pr_err("%s: %lu > %lu - %lu\n", __func__, offset, size, bound); + return 0; + } + return 1; +} + static unsigned int extract_uint(const unsigned char *ptr) { return (unsigned int)ptr[0] + @@ -335,11 +352,17 @@ static void synaptics_rmi4_update_debug_info(void) pkg_id[3] << 8 | pkg_id[2], build_id); } -static void parse_header(void) +static int parse_header(void) { struct image_content *img = &fwu->image_content; struct image_header_data *data = (struct image_header_data *)fwu->data_buffer; + if (fwu->full_update_size < sizeof(*data)) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "Provided update too small"); + return -EINVAL; + } + img->checksum = extract_uint(data->file_checksum); img->bootloader_version = data->bootloader_version; img->image_size = extract_uint(data->firmware_size); @@ -376,12 +399,29 @@ static void parse_header(void) img->config_size); /* get UI firmware offset */ - if (img->image_size) + if (img->image_size) { + if (!in_bounds(FW_IMAGE_OFFSET, img->image_size, + fwu->full_update_size)) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "%s: image size out of bounds\n", + __func__); + return -EINVAL; + } img->firmware_data = fwu->data_buffer + FW_IMAGE_OFFSET; + } /* get config offset*/ - if (img->config_size) + if (img->config_size) { + // FW_IMAGE_OFFSET + image_size was ok as above + if (!in_bounds(FW_IMAGE_OFFSET + img->image_size, + img->config_size, fwu->full_update_size)) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "%s: config size out of bounds\n", + __func__); + return -EINVAL; + } img->config_data = fwu->data_buffer + FW_IMAGE_OFFSET + img->image_size; + } /* get lockdown offset*/ switch (img->bootloader_version) { case 3: @@ -400,6 +440,14 @@ static void parse_header(void) img->lockdown_data = NULL; } + if (img->lockdown_block_count * fwu->block_size > FW_IMAGE_OFFSET) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "%s: lockdown size too big\n", + __func__); + return -EINVAL; + } + if (fwu->full_update_size < FW_IMAGE_OFFSET) + return -EINVAL; img->lockdown_data = fwu->data_buffer + FW_IMAGE_OFFSET - img->lockdown_block_count * fwu->block_size; @@ -408,7 +456,7 @@ static void parse_header(void) fwu->lockdown_data = img->lockdown_data; fwu->config_data = img->config_data; fwu->firmware_data = img->firmware_data; - return; + return 0; } static int fwu_read_f01_device_status(struct f01_device_status *status) @@ -1290,8 +1338,8 @@ static int fwu_start_write_config(void) "%s: write config from config file\n", __func__); fwu->config_data = fwu->data_buffer; - } else { - parse_header(); + } else if (parse_header()) { + return -EINVAL; } pr_notice("%s: Start of write config process\n", __func__); @@ -1358,7 +1406,8 @@ static int fwu_do_write_lockdown(bool reset) static int fwu_start_write_lockdown(void) { - parse_header(); + if (parse_header()) + return -EINVAL; return fwu_do_write_lockdown(true); } @@ -1578,9 +1627,13 @@ static int fwu_start_reflash(void) __func__, fw_entry->size); fwu->data_buffer = fw_entry->data; + fwu->full_update_size = fw_entry->size; } - parse_header(); + if (parse_header()) { + retval = -EINVAL; + goto exit; + } flash_area = fwu_go_nogo(); if (fwu->rmi4_data->sensor_sleep) { @@ -2020,6 +2073,7 @@ static ssize_t fwu_sysfs_image_size_store(struct device *dev, if (!mutex_trylock(&fwu_sysfs_mutex)) return -EBUSY; + fwu->full_update_size = size; fwu->image_size = size; fwu->data_pos = 0; From 72fb075695b336cebb8d7dbb0c812d9276f7a518 Mon Sep 17 00:00:00 2001 From: Martijn Coenen Date: Tue, 8 Nov 2016 20:12:16 +0100 Subject: [PATCH 0516/1015] Android: binder: check set_context_mgr permission on time. Bug: 32394425 Change-Id: I860c6aab97850bff05a56e96cd3f4b41691bfd96 Signed-off-by: Martijn Coenen Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 0d37d64f02e18a301867ae7684c3801bd99c5df2 Signed-off-by: Dennis Cagle --- drivers/staging/android/binder.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index 3134e2006996a..4bcab3a89acce 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -2714,6 +2714,9 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp) ret = -EBUSY; goto out; } + ret = security_binder_set_context_mgr(proc->tsk); + if (ret < 0) + goto out; if (uid_valid(binder_context_mgr_uid)) { if (!uid_eq(binder_context_mgr_uid, curr_euid)) { pr_err("BINDER_SET_CONTEXT_MGR bad uid %d != %d\n", @@ -2779,9 +2782,6 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ret = binder_ioctl_set_ctx_mgr(filp); if (ret) goto err; - ret = security_binder_set_context_mgr(proc->tsk); - if (ret < 0) - goto err; break; case BINDER_THREAD_EXIT: binder_debug(BINDER_DEBUG_THREADS, "%d:%d exit\n", From a2569e2afe998151b98becc4f7f0f9823b6e4be8 Mon Sep 17 00:00:00 2001 From: Abhishek Kondaveeti Date: Thu, 29 Dec 2016 15:35:52 +0530 Subject: [PATCH 0517/1015] msm: isp: Fix ping pong recovery Ignore future ping pong mismatch recovery requests if recovery is in progress. Change-Id: I046270ba16618718d657c9c56be87184de2f09fa Signed-off-by: Abhishek Kondaveeti --- drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index 0072fafad579c..d4536e4320084 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -1533,6 +1533,11 @@ void msm_isp_halt_send_error(struct vfe_device *vfe_dev, uint32_t event) struct msm_vfe_axi_halt_cmd halt_cmd; uint32_t irq_status0, irq_status1; + if (atomic_read(&vfe_dev->error_info.overflow_state) != + NO_OVERFLOW) + /* Recovery is already in Progress */ + return; + if (ISP_EVENT_PING_PONG_MISMATCH == event && vfe_dev->axi_data.recovery_count < MAX_RECOVERY_THRESHOLD) { vfe_dev->hw_info->vfe_ops.irq_ops. From fec533dd77377517bbc91129cda0d7c4f9107f4e Mon Sep 17 00:00:00 2001 From: Veerabhadrarao Badiganti Date: Thu, 13 Oct 2016 17:18:06 +0530 Subject: [PATCH 0518/1015] mmc: core: Enable HS mode first in the device and then in the host While switching to HS mode, high speed mode timing should be selected in the device before changing the clock frequency in the host. But present driver first updates the frequency in host and then selects HS mode in device while selecting HS400 mode. This is a spec violation. Updated the sequence to comply with spec. Change-Id: I5b2c1f724d820daf9c0bca8651cf85bd0ff67655 Signed-off-by: Veerabhadrarao Badiganti --- drivers/mmc/core/mmc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 27b88e9fbc34a..d4e867fbd497e 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -1160,9 +1160,6 @@ static int mmc_select_hs400(struct mmc_card *card) * Before switching to dual data rate operation for HS400, * it is required to convert from HS200 mode to HS mode. */ - mmc_set_timing(card->host, MMC_TIMING_MMC_HS); - mmc_set_bus_speed(card); - err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, card->ext_csd.generic_cmd6_time, @@ -1173,6 +1170,9 @@ static int mmc_select_hs400(struct mmc_card *card) return err; } + mmc_set_timing(card->host, MMC_TIMING_MMC_HS); + mmc_set_bus_speed(card); + val = EXT_CSD_DDR_BUS_WIDTH_8; if (card->ext_csd.strobe_support) { err = mmc_select_bus_width(card); From c9f53d51f1452263c57e5b697afc399d2ee403b6 Mon Sep 17 00:00:00 2001 From: Ritesh Harjani Date: Tue, 29 Nov 2016 20:06:03 +0530 Subject: [PATCH 0519/1015] mmc: mmc_ops: Factor out mmc_switch_status from __mmc_switch Factor out mmc_switch_status from __mmc_switch. And also add mmc_switch_status api to be used to check mmc_switch cmd status. Change-Id: Ic5691ccb7bebe6c5d62df7b4ad7c4b0f7e6de61a Signed-off-by: Ritesh Harjani Signed-off-by: Veerabhadrarao Badiganti --- drivers/mmc/core/mmc_ops.c | 40 +++++++++++++++++++++++++++----------- drivers/mmc/core/mmc_ops.h | 1 + 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c index 52340abf9f98c..bd4ece00dfbfe 100644 --- a/drivers/mmc/core/mmc_ops.c +++ b/drivers/mmc/core/mmc_ops.c @@ -57,6 +57,33 @@ int mmc_send_status(struct mmc_card *card, u32 *status) return __mmc_send_status(card, status, false); } +static int mmc_switch_status_error(struct mmc_host *host, u32 status) +{ + if (mmc_host_is_spi(host)) { + if (status & R1_SPI_ILLEGAL_COMMAND) + return -EBADMSG; + } else { + if (status & 0xFDFFA000) + pr_warn("%s: unexpected status %#x after switch\n", + mmc_hostname(host), status); + if (status & R1_SWITCH_ERROR) + return -EBADMSG; + } + return 0; +} + +int mmc_switch_status(struct mmc_card *card, bool ignore_crc) +{ + u32 status; + int err; + + err = __mmc_send_status(card, &status, ignore_crc); + if (err) + return err; + + return mmc_switch_status_error(card->host, status); +} + static int _mmc_select_card(struct mmc_host *host, struct mmc_card *card) { int err; @@ -564,18 +591,9 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, } } while (R1_CURRENT_STATE(status) == R1_STATE_PRG); - if (mmc_host_is_spi(host)) { - if (status & R1_SPI_ILLEGAL_COMMAND) - return -EBADMSG; - } else { - if (status & 0xFDFFA000) - pr_warn("%s: unexpected status %#x after switch\n", - mmc_hostname(host), status); - if (status & R1_SWITCH_ERROR) - return -EBADMSG; - } + err = mmc_switch_status_error(host, status); - return 0; + return err; } EXPORT_SYMBOL_GPL(__mmc_switch); diff --git a/drivers/mmc/core/mmc_ops.h b/drivers/mmc/core/mmc_ops.h index b3f6df521c6de..4eb52c88ec4ab 100644 --- a/drivers/mmc/core/mmc_ops.h +++ b/drivers/mmc/core/mmc_ops.h @@ -29,6 +29,7 @@ int mmc_bus_test(struct mmc_card *card, u8 bus_width); int mmc_send_hpi_cmd(struct mmc_card *card, u32 *status); int mmc_can_ext_csd(struct mmc_card *card); int mmc_discard_queue(struct mmc_host *host, u32 tasks); +int mmc_switch_status(struct mmc_card *card, bool ignore_crc); #endif From 44e3eb771429404bf4cc66c87b5d6df2356d6b88 Mon Sep 17 00:00:00 2001 From: Ritesh Harjani Date: Thu, 1 Dec 2016 10:12:22 +0530 Subject: [PATCH 0520/1015] mmc: mmc: Don't send CMD13 after switch command while switching speed modes Do not send CMD13 after sending switch command for HS, HS_DDR, HS200 and HS400 modes. It seems that below problem can occur - 1. After sending switch CMD6, card will switch to mentioned bus speed mode. 2. At this moment the controller will be in different bus speed mode, unless the timing of the controller is switched to match with that of card. During this time, if CMD13 follows CMD6 to switch the bus speed mode in card. Then it may cause timeouts or other errors because of mismatch in timing of controller and card. Thus send CMD13 to see the status once both controller and card are switched to same timings. Change-Id: If796c8cfce2cbdc1bce460460e3276886ae1be0c Signed-off-by: Ritesh Harjani Signed-off-by: Veerabhadrarao Badiganti --- drivers/mmc/core/mmc.c | 46 +++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index d4e867fbd497e..9e2c4f46b2338 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -1046,9 +1046,11 @@ static int mmc_select_hs(struct mmc_card *card) err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, card->ext_csd.generic_cmd6_time, - true, true, true); - if (!err) + true, false, true); + if (!err) { mmc_set_timing(card->host, MMC_TIMING_MMC_HS); + err = mmc_switch_status(card, false); + } return err; } @@ -1072,10 +1074,11 @@ static int mmc_select_hs_ddr(struct mmc_card *card) ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4; - err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, + err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, ext_csd_bits, - card->ext_csd.generic_cmd6_time); + card->ext_csd.generic_cmd6_time, + true, false, false); if (err) { pr_warn("%s: switch to bus width %d ddr failed\n", mmc_hostname(host), 1 << bus_width); @@ -1118,8 +1121,10 @@ static int mmc_select_hs_ddr(struct mmc_card *card) if (err) err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330); - if (!err) + if (!err) { mmc_set_timing(host, MMC_TIMING_MMC_DDR52); + err = mmc_switch_status(card, false); + } return err; } @@ -1163,7 +1168,7 @@ static int mmc_select_hs400(struct mmc_card *card) err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, card->ext_csd.generic_cmd6_time, - true, true, true); + true, false, true); if (err) { pr_warn("%s: switch to high-speed from hs200 failed, err:%d\n", mmc_hostname(host), err); @@ -1173,6 +1178,10 @@ static int mmc_select_hs400(struct mmc_card *card) mmc_set_timing(card->host, MMC_TIMING_MMC_HS); mmc_set_bus_speed(card); + err = mmc_switch_status(card, false); + if (err) + goto out_err; + val = EXT_CSD_DDR_BUS_WIDTH_8; if (card->ext_csd.strobe_support) { err = mmc_select_bus_width(card); @@ -1193,7 +1202,7 @@ static int mmc_select_hs400(struct mmc_card *card) err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS400, card->ext_csd.generic_cmd6_time, - true, true, true); + true, false, true); if (err) { pr_warn("%s: switch to hs400 failed, err:%d\n", mmc_hostname(host), err); @@ -1219,6 +1228,17 @@ static int mmc_select_hs400(struct mmc_card *card) mmc_hostname(host)); } + /* + * Sending of CMD13 should be done after the host calibration + * for enhanced_strobe or HS400 mode is completed. + * Otherwise may see CMD13 timeouts or CRC errors. + */ + err = mmc_switch_status(card, false); + +out_err: + if (err) + pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), + __func__, err); return err; } @@ -1253,9 +1273,17 @@ static int mmc_select_hs200(struct mmc_card *card) err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200, card->ext_csd.generic_cmd6_time, - true, true, true); - if (!err) + true, false, true); + if (!err) { mmc_set_timing(host, MMC_TIMING_MMC_HS200); + /* + * Since after switching to hs200, crc errors might + * occur for commands send before tuning. + * So ignore crc error for cmd13. + */ + err = mmc_switch_status(card, true); + + } } err: return err; From 0bcecd38073fa4a0bf624c41e6b07b6598580da0 Mon Sep 17 00:00:00 2001 From: kunleiz Date: Thu, 22 Dec 2016 18:03:37 +0800 Subject: [PATCH 0521/1015] ASoC: msm: qdspv2: add mutex lock when access output buffer length Add mutex protection to avoid access output_len in parallel. CRs-Fixed: 1104067 Change-Id: I4e17258e2abee9cd68152f4b79520b00003aa80d Signed-off-by: kunleiz --- drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c index 940fd08654d24..9889d9c4723ba 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c +++ b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -29,6 +29,8 @@ struct q6audio_effects { struct audio_client *ac; struct msm_hwacc_effects_config config; + struct mutex lock; + atomic_t in_count; atomic_t out_count; @@ -230,8 +232,11 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, uint32_t idx = 0; uint32_t size = 0; + mutex_lock(&effects->lock); + if (!effects->started) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } @@ -241,11 +246,13 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, if (!rc) { pr_err("%s: write wait_event_timeout\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } if (!atomic_read(&effects->out_count)) { pr_err("%s: pcm stopped out_count 0\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } @@ -255,6 +262,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, copy_from_user(bufptr, (void *)arg, effects->config.buf_cfg.output_len)) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } rc = q6asm_write(effects->ac, @@ -262,6 +270,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, 0, 0, NO_TIMESTAMP); if (rc < 0) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } atomic_dec(&effects->out_count); @@ -269,6 +278,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, pr_err("%s: AUDIO_EFFECTS_WRITE: Buffer dropped\n", __func__); } + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_READ: { @@ -466,6 +476,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_EFFECTS_SET_BUF_LEN: { + mutex_lock(&effects->lock); if (copy_from_user(&effects->config.buf_cfg, (void *)arg, sizeof(effects->config.buf_cfg))) { pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n", @@ -475,6 +486,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, pr_debug("%s: write buf len: %d, read buf len: %d\n", __func__, effects->config.buf_cfg.output_len, effects->config.buf_cfg.input_len); + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_GET_BUF_AVAIL: { @@ -719,6 +731,7 @@ static int audio_effects_release(struct inode *inode, struct file *file) } q6asm_audio_client_free(effects->ac); + mutex_destroy(&effects->lock); kfree(effects); pr_debug("%s: close session success\n", __func__); @@ -749,6 +762,7 @@ static int audio_effects_open(struct inode *inode, struct file *file) init_waitqueue_head(&effects->read_wait); init_waitqueue_head(&effects->write_wait); + mutex_init(&effects->lock); effects->opened = 0; effects->started = 0; From f5665d9ae660236ace29d02b4a4b30c754497cb3 Mon Sep 17 00:00:00 2001 From: Siena Richard Date: Mon, 5 Dec 2016 12:26:52 -0800 Subject: [PATCH 0522/1015] ASoC: msm: qdsp6v2: return error when copy from userspace fails A copy_from_user is not always expected to succeed. Therefore, check for an error before operating on the buffer post copy. Change-Id: Ibba9a47c84e735d30e32eeac5b80d51044b7a9e8 CRs-Fixed: 1094852 Signed-off-by: Siena Richard --- sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c index 65c24973036ef..c1493a46123eb 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c @@ -823,6 +823,11 @@ static int msm_pcm_playback_copy(struct snd_pcm_substream *substream, int a, (sizeof(buf_node->frame.frm_hdr) + sizeof(buf_node->frame.pktlen)); } + if (ret) { + pr_err("%s: copy from user failed %d\n", + __func__, ret); + return -EFAULT; + } spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); list_add_tail(&buf_node->list, &prtd->in_queue); spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); From c292a9571573ce1c92858fcfdc0838f4fe253be2 Mon Sep 17 00:00:00 2001 From: "Sravan Kumar D.V.N" Date: Wed, 11 Jan 2017 15:30:51 +0530 Subject: [PATCH 0523/1015] msm: mdss: Fix potential deferencing of null pointer While servicing display post processing ioctl for calib data the driver checks if the calibration addr is valid. During this check it deferences the base address for all pipes without checking if the pipe pointer is NULL. This fix adds this check. CRs-Fixed: 1082568 Change-Id: I4114d5491313b311c8907a91148be6606d0f4227 Signed-off-by: Sravan Kumar D.V.N --- drivers/video/msm/mdss/mdss_mdp_pp.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_pp.c b/drivers/video/msm/mdss/mdss_mdp_pp.c index 9dbbcbfff3ffb..3960595c2547c 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -6804,9 +6804,6 @@ static int is_valid_calib_addr(void *addr, u32 operation) int ret = 0; char __iomem *ptr = addr; char __iomem *mixer_base = mdss_res->mixer_intf->base; - char __iomem *rgb_base = mdss_res->rgb_pipes->base; - char __iomem *dma_base = mdss_res->dma_pipes->base; - char __iomem *vig_base = mdss_res->vig_pipes->base; char __iomem *ctl_base = mdss_res->ctl_off->base; char __iomem *dspp_base = mdss_res->mixer_intf->dspp_base; @@ -6838,17 +6835,20 @@ static int is_valid_calib_addr(void *addr, u32 operation) if (ret) goto valid_addr; } - if (ptr >= vig_base) { + if (mdss_res->vig_pipes && + ptr >= mdss_res->vig_pipes->base) { ret = is_valid_calib_vig_addr(ptr); if (ret) goto valid_addr; } - if (ptr >= rgb_base) { + if (mdss_res->rgb_pipes && + ptr >= mdss_res->rgb_pipes->base) { ret = is_valid_calib_rgb_addr(ptr); if (ret) goto valid_addr; } - if (ptr >= dma_base) { + if (mdss_res->dma_pipes && + ptr >= mdss_res->dma_pipes->base) { ret = is_valid_calib_dma_addr(ptr); if (ret) goto valid_addr; From 6b08b1b1193e6172a4e6760442d1ecef7f8e87a8 Mon Sep 17 00:00:00 2001 From: Banajit Goswami Date: Thu, 3 Nov 2016 19:18:07 -0700 Subject: [PATCH 0524/1015] ASoC: msm: q6dspv2: use correct variable type to store ION buff size The size of the physical memory allocated for ION buffers are of type size_t. Change updates the type of variables sent to ION drivers to size_t to avoid any mismatch. Change-Id: I3d33ed922b979652c64027e6f1c6f0a8ed4850a3 Signed-off-by: Banajit Goswami --- sound/soc/msm/qdsp6v2/q6asm.c | 10 ++++++---- sound/soc/msm/qdsp6v2/q6voice.h | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index 276ce3ad94de6..06e31cbdc55cc 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -2942,7 +2942,8 @@ int q6asm_set_shared_circ_buff(struct audio_client *ac, int dir) { struct audio_buffer *buf_circ; - int bytes_to_alloc, rc, len; + int bytes_to_alloc, rc; + size_t len; buf_circ = kzalloc(sizeof(struct audio_buffer), GFP_KERNEL); @@ -2961,7 +2962,7 @@ int q6asm_set_shared_circ_buff(struct audio_client *ac, rc = msm_audio_ion_alloc("audio_client", &buf_circ->client, &buf_circ->handle, bytes_to_alloc, (ion_phys_addr_t *)&buf_circ->phys, - (size_t *)&len, &buf_circ->data); + &len, &buf_circ->data); if (rc) { pr_err("%s: Audio ION alloc is failed, rc = %d\n", __func__, @@ -3003,7 +3004,8 @@ int q6asm_set_shared_pos_buff(struct audio_client *ac, int dir) { struct audio_buffer *buf_pos = &ac->shared_pos_buf; - int len, rc; + int rc; + size_t len; int bytes_to_alloc = sizeof(struct asm_shared_position_buffer); mutex_lock(&ac->cmd_lock); @@ -3012,7 +3014,7 @@ int q6asm_set_shared_pos_buff(struct audio_client *ac, rc = msm_audio_ion_alloc("audio_client", &buf_pos->client, &buf_pos->handle, bytes_to_alloc, - (ion_phys_addr_t *)&buf_pos->phys, (size_t *)&len, + (ion_phys_addr_t *)&buf_pos->phys, &len, &buf_pos->data); if (rc) { diff --git a/sound/soc/msm/qdsp6v2/q6voice.h b/sound/soc/msm/qdsp6v2/q6voice.h index 73e02d0fd37d6..a4c3a4be19ee5 100644 --- a/sound/soc/msm/qdsp6v2/q6voice.h +++ b/sound/soc/msm/qdsp6v2/q6voice.h @@ -141,7 +141,7 @@ struct share_mem_buf { struct mem_map_table { dma_addr_t phys; void *data; - uint32_t size; /* size of buffer */ + size_t size; /* size of buffer */ struct ion_handle *handle; struct ion_client *client; }; From c0a8e61526ab180af43afe9826d0c2698dbd182f Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Wed, 9 Nov 2016 11:00:56 +0800 Subject: [PATCH 0525/1015] ASoC: msm: q6dspv2: fix potentional information leak The heap buffer pointed to out_buffer and in_buffer are allocated but uninitlalized. It may cause information leak. Change to kzalloc instead of kmalloc when allocating kernel buffers to avoid information leak. CRs-Fixed: 1087020 Change-Id: I6f9b7a630158355a7f920dcf9cfffe537b1c6a85 Signed-off-by: Meng Wang --- sound/soc/msm/qdsp6v2/q6asm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index 276ce3ad94de6..892c8689b1202 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -317,12 +317,12 @@ static void config_debug_fs_write(struct audio_buffer *ab) } static void config_debug_fs_init(void) { - out_buffer = kmalloc(OUT_BUFFER_SIZE, GFP_KERNEL); + out_buffer = kzalloc(OUT_BUFFER_SIZE, GFP_KERNEL); if (out_buffer == NULL) { pr_err("%s: kmalloc() for out_buffer failed\n", __func__); goto outbuf_fail; } - in_buffer = kmalloc(IN_BUFFER_SIZE, GFP_KERNEL); + in_buffer = kzalloc(IN_BUFFER_SIZE, GFP_KERNEL); if (in_buffer == NULL) { pr_err("%s: kmalloc() for in_buffer failed\n", __func__); goto inbuf_fail; From fc25dc4b0ac99ac116ab9fce66fc1bcb52489d7a Mon Sep 17 00:00:00 2001 From: Weiyin Jiang Date: Tue, 15 Nov 2016 14:30:57 +0800 Subject: [PATCH 0526/1015] ASoC: msm: Fix memory leakage in dts eagle Ensure to free heap variable as to avoid memory leakage in dts eagle driver. Change-Id: I3c3c9b967ab6717a4129798ef0bdc1270a5cffee CRs-Fixed: 1089129 Signed-off-by: Weiyin Jiang --- sound/soc/msm/qdsp6v2/msm-dts-eagle.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/msm-dts-eagle.c b/sound/soc/msm/qdsp6v2/msm-dts-eagle.c index 7a23a170be67d..6b2038572eaa2 100644 --- a/sound/soc/msm/qdsp6v2/msm-dts-eagle.c +++ b/sound/soc/msm/qdsp6v2/msm-dts-eagle.c @@ -1301,9 +1301,9 @@ int msm_dts_eagle_ioctl(unsigned int cmd, unsigned long arg) if (((u32 *)_sec_blob[target[0]])[1] != target[1]) { eagle_ioctl_dbg("%s: request new size for already allocated license index %u", __func__, target[0]); - kfree(_sec_blob[target[0]]); - _sec_blob[target[0]] = NULL; } + kfree(_sec_blob[target[0]]); + _sec_blob[target[0]] = NULL; } eagle_ioctl_dbg("%s: allocating %u bytes for license index %u", __func__, target[1], target[0]); From 8bdaed2f49dea1cdd673dfb48586aa42b59369d8 Mon Sep 17 00:00:00 2001 From: Xiaojun Sang Date: Wed, 16 Nov 2016 15:10:20 +0800 Subject: [PATCH 0527/1015] ASoC: qdsp6v2: prevent null pointer dereference for _vol_cmds In case of memory allocation failure, _vol_cmd_cnt is not reset. In _volume_cmds_free, null pointer dereference would happen for _vol_cmds[i]. To prevent it, reset _vol_cmd_cnt when memory allocation fails. CRs-Fixed: 1089598 Change-Id: Icb998549cdb999c6db2fd52aef505f200e630da5 Signed-off-by: Xiaojun Sang --- sound/soc/msm/qdsp6v2/msm-dts-eagle.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sound/soc/msm/qdsp6v2/msm-dts-eagle.c b/sound/soc/msm/qdsp6v2/msm-dts-eagle.c index 7a23a170be67d..dfa4bb23c45d7 100644 --- a/sound/soc/msm/qdsp6v2/msm-dts-eagle.c +++ b/sound/soc/msm/qdsp6v2/msm-dts-eagle.c @@ -234,7 +234,8 @@ static s32 _volume_cmds_alloc1(s32 size) if (_vol_cmds) { _vol_cmds_d = kzalloc(_vol_cmd_cnt * sizeof(struct vol_cmds_d), GFP_KERNEL); - } + } else + _vol_cmd_cnt = 0; if (_vol_cmds_d) return 0; _volume_cmds_free(); From 6d87c0240b205bdffb030f7cb2d780cfb04a4168 Mon Sep 17 00:00:00 2001 From: Trilokesh Rangam Date: Tue, 10 Jan 2017 09:36:07 +0530 Subject: [PATCH 0528/1015] msm-camera: Validation of input parameter The input array pointer cam_vreg and its associated length num_vreg_seq is checked to avoid accessing the array if the pointer is NULL and the associated length is non-zero. When cam_vreg is NULL and num_vreg_seq is 0 the array does not get accessed. CRs-Fixed: 897259 Change-Id: I2f93955ec9a21c329290ead9706a7eeb1d640d3c Signed-off-by: Trilokesh Rangam --- .../platform/msm/camera_v2/common/msm_camera_io_util.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/common/msm_camera_io_util.c b/drivers/media/platform/msm/camera_v2/common/msm_camera_io_util.c index 51a9ea85d1f30..d82b2eb602f9a 100644 --- a/drivers/media/platform/msm/camera_v2/common/msm_camera_io_util.c +++ b/drivers/media/platform/msm/camera_v2/common/msm_camera_io_util.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2014, The Linux Foundataion. All rights reserved. +/* Copyright (c) 2011-2014, 2017 The Linux Foundataion. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -394,9 +394,15 @@ int msm_camera_config_vreg(struct device *dev, struct camera_vreg_t *cam_vreg, pr_err("%s:%d vreg sequence invalid\n", __func__, __LINE__); return -EINVAL; } + if (!num_vreg_seq) num_vreg_seq = num_vreg; + if ((cam_vreg == NULL) && num_vreg_seq) { + pr_err("%s:%d cam_vreg NULL\n", __func__, __LINE__); + return -EINVAL; + } + if (config) { for (i = 0; i < num_vreg_seq; i++) { if (vreg_seq) { From fe3be552397f85c33b83d457ed95419348e82caa Mon Sep 17 00:00:00 2001 From: Krishnankutty Kolathappilly Date: Tue, 8 Nov 2016 17:55:01 -0800 Subject: [PATCH 0529/1015] msm: camera: Print kernel pointer using correct specifier Print kernel pointer using correct specifier %pK CRs-Fixed: 1084188 Change-Id: I41410f1e4916fadc8d1dc5c08f088e0fe71405e1 Signed-off-by: Krishnankutty Kolathappilly --- .../msm/camera_v2/jpeg_10/msm_jpeg_dev.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_dev.c b/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_dev.c index 437af72a6a556..de27e585f63df 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_dev.c +++ b/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_dev.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -71,8 +71,8 @@ static long msm_jpeg_compat_ioctl(struct file *filp, unsigned int cmd, int rc; struct msm_jpeg_device *pgmn_dev = filp->private_data; - JPEG_DBG("%s:%d] cmd=%d pgmn_dev=0x%lx arg=0x%lx\n", __func__, - __LINE__, _IOC_NR(cmd), (unsigned long)pgmn_dev, + JPEG_DBG("%s:%d] cmd=%d pgmn_dev=0x%pK arg=0x%lx\n", __func__, + __LINE__, _IOC_NR(cmd), pgmn_dev, (unsigned long)arg); rc = __msm_jpeg_compat_ioctl(pgmn_dev, cmd, arg); @@ -87,8 +87,8 @@ static long msm_jpeg_ioctl(struct file *filp, unsigned int cmd, int rc; struct msm_jpeg_device *pgmn_dev = filp->private_data; - JPEG_DBG("%s:%d] cmd=%d pgmn_dev=0x%lx arg=0x%lx\n", __func__, - __LINE__, _IOC_NR(cmd), (unsigned long)pgmn_dev, + JPEG_DBG("%s:%d] cmd=%d pgmn_dev=0x%pK arg=0x%lx\n", __func__, + __LINE__, _IOC_NR(cmd), pgmn_dev, (unsigned long)arg); rc = __msm_jpeg_ioctl(pgmn_dev, cmd, arg); @@ -114,9 +114,9 @@ int msm_jpeg_subdev_init(struct v4l2_subdev *jpeg_sd) struct msm_jpeg_device *pgmn_dev = (struct msm_jpeg_device *)jpeg_sd->host_priv; - JPEG_DBG("%s:%d: jpeg_sd=0x%lx pgmn_dev=0x%lx\n", + JPEG_DBG("%s:%d: jpeg_sd=0x%lx pgmn_dev=0x%pK\n", __func__, __LINE__, (unsigned long)jpeg_sd, - (unsigned long)pgmn_dev); + pgmn_dev); rc = __msm_jpeg_open(pgmn_dev); JPEG_DBG("%s:%d: rc=%d\n", __func__, __LINE__, rc); @@ -132,7 +132,7 @@ static long msm_jpeg_subdev_ioctl(struct v4l2_subdev *sd, JPEG_DBG("%s: cmd=%d\n", __func__, cmd); - JPEG_DBG("%s: pgmn_dev 0x%lx", __func__, (unsigned long)pgmn_dev); + JPEG_DBG("%s: pgmn_dev 0x%pK", __func__, pgmn_dev); JPEG_DBG("%s: Calling __msm_jpeg_ioctl\n", __func__); @@ -146,7 +146,7 @@ void msm_jpeg_subdev_release(struct v4l2_subdev *jpeg_sd) int rc; struct msm_jpeg_device *pgmn_dev = (struct msm_jpeg_device *)jpeg_sd->host_priv; - JPEG_DBG("%s:pgmn_dev=0x%lx", __func__, (unsigned long)pgmn_dev); + JPEG_DBG("%s:pgmn_dev=0x%pK", __func__, pgmn_dev); rc = __msm_jpeg_release(pgmn_dev); JPEG_DBG("%s:rc=%d", __func__, rc); } From 3add031a94da8fe746af139f5b764d8ae5829539 Mon Sep 17 00:00:00 2001 From: Taniya Das Date: Fri, 9 Dec 2016 12:55:29 +0530 Subject: [PATCH 0530/1015] clk: msm: gcc: Add support for active clients of SNOC/BIMC WCNSS would require to directly vote on the snoc & bimc active only clocks. Add new instances of voter clocks to support the same. Change-Id: Ib2fd2565676c1007be514b548c881bfe87463e52 Signed-off-by: Taniya Das --- drivers/clk/msm/clock-gcc-8952.c | 6 ++++++ include/dt-bindings/clock/msm-clocks-8952.h | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c index 170ae1c4853d1..75d225df33d8a 100644 --- a/drivers/clk/msm/clock-gcc-8952.c +++ b/drivers/clk/msm/clock-gcc-8952.c @@ -91,6 +91,9 @@ static DEFINE_CLK_VOTER(pnoc_usb_clk, &pnoc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(snoc_usb_clk, &snoc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(bimc_usb_clk, &bimc_clk.c, LONG_MAX); +static DEFINE_CLK_VOTER(snoc_wcnss_a_clk, &snoc_a_clk.c, LONG_MAX); +static DEFINE_CLK_VOTER(bimc_wcnss_a_clk, &bimc_a_clk.c, LONG_MAX); + /* Branch Voter clocks */ static DEFINE_CLK_BRANCH_VOTER(xo_gcc, &xo_clk_src.c); static DEFINE_CLK_BRANCH_VOTER(xo_otg_clk, &xo_clk_src.c); @@ -3782,6 +3785,9 @@ static struct clk_lookup msm_clocks_lookup_common[] = { CLK_LIST(snoc_usb_clk), CLK_LIST(bimc_usb_clk), + CLK_LIST(snoc_wcnss_a_clk), + CLK_LIST(bimc_wcnss_a_clk), + CLK_LIST(qdss_clk), CLK_LIST(qdss_a_clk), diff --git a/include/dt-bindings/clock/msm-clocks-8952.h b/include/dt-bindings/clock/msm-clocks-8952.h index 6e2fe580a14fa..fc88dac5bc4c8 100644 --- a/include/dt-bindings/clock/msm-clocks-8952.h +++ b/include/dt-bindings/clock/msm-clocks-8952.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -261,6 +261,7 @@ #define clk_snoc_clk 0x2c341aa0 #define clk_snoc_a_clk 0x8fcef2af #define clk_snoc_usb_a_clk 0x34b7821b +#define clk_snoc_wcnss_a_clk 0xd3949ebc #define clk_snoc_usb_clk 0x29f9d73d #define clk_snoc_msmbus_clk 0xe6900bb6 #define clk_snoc_msmbus_a_clk 0x5d4683bd @@ -276,6 +277,7 @@ #define clk_bimc_msmbus_clk 0xd212feea #define clk_bimc_msmbus_a_clk 0x71d1a499 #define clk_bimc_usb_a_clk 0xea410834 +#define clk_bimc_wcnss_a_clk 0x5a6df715 #define clk_bimc_usb_clk 0x9bd2b2bf #define clk_bimc_gpu_clk 0xd3e0a327 #define clk_bimc_gpu_a_clk 0x67f0e9a5 From 5bc1232e9eec8eddf156304d78489e3d3f7b18fc Mon Sep 17 00:00:00 2001 From: Catalin Marinas Date: Wed, 7 Dec 2016 15:10:41 +0530 Subject: [PATCH 0531/1015] arm64: cache: change ARCH_DMA_MINALIGN and L1_CACHE_SHIFT values This reverts commit 2f1c27479e8a641d654d7f6696bd326ad80e109e and also sets ARM_DMA_MINALIGN to 128. ARCH_DMA_MINALIGN is dependent on L1_CACHE_SHIFT but it should be set to maximum *known* cache line size on ARMv8 systems to avoid DMA coherecy issues. So setting ARM_DMA_MINALIGN to 128. Signed-off-by: Catalin Marinas Change-Id: I3fcdba32d0bf574f0af7c924ae926dd47df75e07 Patch-mainline: linux-kernel @ 21/03/16, 17:14:03 Signed-off-by: Imran Khan --- arch/arm64/include/asm/cache.h | 12 ++++++------ arch/arm64/kernel/setup.c | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/arch/arm64/include/asm/cache.h b/arch/arm64/include/asm/cache.h index 7bdbfe85b0bf6..82e822bbb0e04 100644 --- a/arch/arm64/include/asm/cache.h +++ b/arch/arm64/include/asm/cache.h @@ -18,17 +18,17 @@ #include -#define L1_CACHE_SHIFT 7 +#define L1_CACHE_SHIFT 6 #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) /* * Memory returned by kmalloc() may be used for DMA, so we must make - * sure that all such allocations are cache aligned. Otherwise, - * unrelated code may cause parts of the buffer to be read into the - * cache before the transfer is done, causing old data to be seen by - * the CPU. + * sure that all such allocations are aligned to the maximum *known* + * cache line size on ARMv8 systems. Otherwise, unrelated code may cause + * parts of the buffer to be read into the cache before the transfer is + * done, causing old data to be seen by the CPU. */ -#define ARCH_DMA_MINALIGN L1_CACHE_BYTES +#define ARCH_DMA_MINALIGN (128) #ifndef __ASSEMBLY__ diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 52b19aee51b52..d594ce9d5875f 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -246,9 +246,9 @@ static void __init setup_processor(void) if (!cwg) pr_warn("No Cache Writeback Granule information, assuming cache line size %d\n", cls); - if (L1_CACHE_BYTES < cls) - pr_warn("L1_CACHE_BYTES smaller than the Cache Writeback Granule (%d < %d)\n", - L1_CACHE_BYTES, cls); + if (ARCH_DMA_MINALIGN < cls) + pr_warn("ARCH_DMA_MINALIGN smaller than the Cache Writeback Granule (%d < %d)\n", + ARCH_DMA_MINALIGN, cls); /* * ID_AA64ISAR0_EL1 contains 4-bit wide signed feature blocks. From da28d9efdd407c1fed1d2601bb4e6d7d5cfdb12f Mon Sep 17 00:00:00 2001 From: yidongh Date: Tue, 13 Dec 2016 19:19:01 +0800 Subject: [PATCH 0532/1015] ASOC: msm: Restrict loop index to avoid buffer overread Add restriction in msm_dolby_dap_param_to_get_control_get to avoid reading buffer data with index over buffer size. Change-Id: I2bd443d4db1a272d20341fbb5b15891a8acf0bc8 CRs-Fixed: 1096076 Signed-off-by: Yidong Huang --- sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c b/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c index fb68ff3190c94..009e3348b0eec 100644 --- a/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c +++ b/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c @@ -1,4 +1,6 @@ -/* Copyright (c) 2013-2014, 2016-2017,The Linux Foundation. All rights reserved. +/* +* Copyright (c) 2013-2014, 2016-2017, The Linux Foundation. All rights reserved. +* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. @@ -803,6 +805,10 @@ int msm_dolby_dap_param_to_get_control_get(struct snd_kcontrol *kcontrol, __func__, copp_idx); return -EINVAL; } + if (dolby_dap_params_get.length > 128 - DOLBY_PARAM_PAYLOAD_SIZE) { + pr_err("%s: Incorrect parameter length", __func__); + return -EINVAL; + } params_value = kzalloc(params_length + param_payload_len, GFP_KERNEL); if (!params_value) { pr_err("%s, params memory alloc failed\n", __func__); From 54fce36ff806920b7077219ee6b3c7111a4e6953 Mon Sep 17 00:00:00 2001 From: Ramesh V Date: Tue, 17 Jan 2017 20:23:00 +0530 Subject: [PATCH 0533/1015] msm: camera: isp: handle frame id out of sync for B+M when frames are out of sync of Bayer and Mono, in ISP we will hadle in such way that not to skip sof. send the same sof to backend when it comes,in such case clear snapshot failure is expected due to buffer mismatch. Change-Id: Ieef7e8b9df4f554fe671f50bc4a29116e12d0f24 Signed-off-by: Ramesh V --- .../platform/msm/camera_v2/isp/msm_isp.h | 1 + .../msm/camera_v2/isp/msm_isp_axi_util.c | 22 ++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h index bccaf348f02d0..3c602d119c5da 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h @@ -778,6 +778,7 @@ struct vfe_device { /* before halt irq info */ uint32_t recovery_irq0_mask; uint32_t recovery_irq1_mask; + uint32_t ms_frame_id; }; struct vfe_parent_device { diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index d4536e4320084..ce1301e71bfaa 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -818,6 +818,8 @@ void msm_isp_increment_frame_id(struct vfe_device *vfe_dev, struct msm_vfe_sof_info *master_sof_info = NULL; int32_t time, master_time, delta; uint32_t sof_incr = 0; + uint32_t master_last_slave_diff = 0; + uint32_t last_curr_diff = 0; unsigned long flags; if (vfe_dev->axi_data.src_info[frame_src].frame_id == 0) @@ -866,6 +868,25 @@ void msm_isp_increment_frame_id(struct vfe_device *vfe_dev, */ vfe_dev->axi_data.src_info[frame_src].frame_id = master_sof_info->frame_id + sof_incr; + /* handle frame id out of sync */ + if (sof_incr) { + last_curr_diff = + vfe_dev->axi_data.src_info[frame_src].frame_id - + vfe_dev->ms_frame_id; + master_last_slave_diff = master_sof_info->frame_id - + vfe_dev->ms_frame_id; + if (last_curr_diff > 1 && + master_last_slave_diff == 1) { + pr_err("%s: frame id %d out of sync !!!\n", + __func__, + vfe_dev->axi_data.src_info[frame_src]. + frame_id - sof_incr); + vfe_dev->axi_data.src_info[frame_src]. + frame_id = master_sof_info->frame_id; + } + } + vfe_dev->ms_frame_id = + vfe_dev->axi_data.src_info[frame_src].frame_id; } else { if (frame_src == VFE_PIX_0) { vfe_dev->axi_data.src_info[frame_src].frame_id += @@ -895,7 +916,6 @@ void msm_isp_increment_frame_id(struct vfe_device *vfe_dev, } else vfe_dev->axi_data.src_info[frame_src].frame_id++; } - sof_info = vfe_dev->axi_data.src_info[frame_src]. dual_hw_ms_info.sof_info; if (dual_hw_type == DUAL_HW_MASTER_SLAVE && From a2a6a334d1919ed7e662a401e4c8b3eb82dba304 Mon Sep 17 00:00:00 2001 From: Imran Khan Date: Tue, 10 Jan 2017 17:31:53 +0530 Subject: [PATCH 0534/1015] arm64: Modify support for 32bit app specfic settings Change support for 32bit app specific settings. The change made earlier was not correct for 8996pro devices so correct it to include all variants of 8996. Change-Id: Id6afad04ad316dd7a41743821b7cfd513db227e5 Signed-off-by: Imran Khan --- arch/arm64/include/asm/app_api.h | 3 +- arch/arm64/kernel/app_api.c | 53 +++++++++++++++++++++++--------- arch/arm64/kernel/app_setting.c | 4 +++ kernel/sched/core.c | 2 +- 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/arch/arm64/include/asm/app_api.h b/arch/arm64/include/asm/app_api.h index 7032d636dab60..0e6a469cd6836 100644 --- a/arch/arm64/include/asm/app_api.h +++ b/arch/arm64/include/asm/app_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -44,6 +44,7 @@ extern void switch_32bit_app_setting_bit(struct task_struct *prev, extern void apply_app_setting_bit(struct file *file); extern bool use_app_setting; extern bool use_32bit_app_setting; +extern bool use_32bit_app_setting_pro; #endif #endif diff --git a/arch/arm64/kernel/app_api.c b/arch/arm64/kernel/app_api.c index 1b3732accd4b0..e995bbf3c7b4b 100644 --- a/arch/arm64/kernel/app_api.c +++ b/arch/arm64/kernel/app_api.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -74,13 +74,24 @@ void set_app_setting_bit_for_32bit_apps(void) uint64_t reg; spin_lock_irqsave(&spinlock_32bit_app, flags); - asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); - reg = reg | BIT(18); - reg = reg & ~BIT(2); - reg = reg | 0x3; - isb(); - asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); - isb(); + if (use_32bit_app_setting) { + asm volatile("mrs %0, S3_0_c15_c15_0 " : "=r" (reg)); + reg = reg | BIT(24); + isb(); + asm volatile("msr S3_0_c15_c15_0, %0" : : "r" (reg)); + isb(); + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg | BIT(18) | BIT(2) | BIT(0); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } else if (use_32bit_app_setting_pro) { + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg | BIT(18); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } spin_unlock_irqrestore(&spinlock_32bit_app, flags); } EXPORT_SYMBOL(set_app_setting_bit_for_32bit_apps); @@ -91,12 +102,26 @@ void clear_app_setting_bit_for_32bit_apps(void) uint64_t reg; spin_lock_irqsave(&spinlock_32bit_app, flags); - asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); - reg = reg & ~BIT(18); - reg = reg & ~0x3; - isb(); - asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); - isb(); + if (use_32bit_app_setting) { + asm volatile("mrs %0, S3_0_c15_c15_0 " : "=r" (reg)); + reg = reg & ~BIT(24); + isb(); + asm volatile("msr S3_0_c15_c15_0, %0" : : "r" (reg)); + isb(); + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg & ~BIT(18); + reg = reg & ~BIT(2); + reg = reg & ~BIT(0); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } else if (use_32bit_app_setting_pro) { + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg & ~BIT(18); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } spin_unlock_irqrestore(&spinlock_32bit_app, flags); } EXPORT_SYMBOL(clear_app_setting_bit_for_32bit_apps); diff --git a/arch/arm64/kernel/app_setting.c b/arch/arm64/kernel/app_setting.c index afb7e39dd68a0..f45220c99404d 100644 --- a/arch/arm64/kernel/app_setting.c +++ b/arch/arm64/kernel/app_setting.c @@ -39,6 +39,10 @@ bool use_32bit_app_setting = false; module_param(use_32bit_app_setting, bool, 0644); MODULE_PARM_DESC(use_32bit_app_setting, "control use of 32 bit app specific settings"); +bool use_32bit_app_setting_pro = false; +module_param(use_32bit_app_setting_pro, bool, 0644); +MODULE_PARM_DESC(use_32bit_app_setting_pro, "control use of 32 bit app specific settings"); + static int set_name(const char *str, struct kernel_param *kp) { int len = strlen(str); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 5d5f0496700bd..e7d336760583a 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5644,7 +5644,7 @@ prepare_task_switch(struct rq *rq, struct task_struct *prev, if (use_app_setting) switch_app_setting_bit(prev, next); - if (use_32bit_app_setting) + if (use_32bit_app_setting || use_32bit_app_setting_pro) switch_32bit_app_setting_bit(prev, next); #endif } From b73883ee9cfe721fe97912dd1e81c4269b151128 Mon Sep 17 00:00:00 2001 From: Lingutla Chandrasekhar Date: Tue, 17 Jan 2017 14:10:27 +0530 Subject: [PATCH 0535/1015] defconfig: arm64: Enable app specific setting on MSM8996 Enable support for app specific setting on MSM8996. This is required for providing an interface so that app specific settings can be applied / cleared. Change-Id: I2dc533aae99b3898db2d61f99c4c99877eb575d0 Signed-off-by: Sanrio Alvares Signed-off-by: Lingutla Chandrasekhar --- arch/arm64/configs/msm-auto-perf_defconfig | 1 + arch/arm64/configs/msm-auto_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/msm-auto-perf_defconfig b/arch/arm64/configs/msm-auto-perf_defconfig index 9305988308c9e..7a6c5cd59984d 100644 --- a/arch/arm64/configs/msm-auto-perf_defconfig +++ b/arch/arm64/configs/msm-auto-perf_defconfig @@ -40,6 +40,7 @@ CONFIG_ARCH_MSM=y CONFIG_ARCH_MSM8996=y CONFIG_PCI_MSM=y CONFIG_ENABLE_FP_SIMD_SETTINGS=y +CONFIG_MSM_APP_SETTINGS=y CONFIG_SMP=y CONFIG_SCHED_MC=y CONFIG_PREEMPT=y diff --git a/arch/arm64/configs/msm-auto_defconfig b/arch/arm64/configs/msm-auto_defconfig index 52bef4d27c3b1..57dcb9b175601 100644 --- a/arch/arm64/configs/msm-auto_defconfig +++ b/arch/arm64/configs/msm-auto_defconfig @@ -39,6 +39,7 @@ CONFIG_ARCH_MSM8996=y CONFIG_ARCH_MSMCOBALT=y CONFIG_PCI_MSM=y CONFIG_ENABLE_FP_SIMD_SETTINGS=y +CONFIG_MSM_APP_SETTINGS=y CONFIG_SMP=y CONFIG_SCHED_MC=y CONFIG_PREEMPT=y From c720640477b00a1f8c3a742093614c4e3c8ab480 Mon Sep 17 00:00:00 2001 From: Mohammed Khajapasha Date: Wed, 11 Jan 2017 17:05:51 +0530 Subject: [PATCH 0536/1015] ARM: dts: msm: Add use_32bit_app_setting in bootargs for msm8996 Enable 32 bit app settings, using bootargs, for msm8996 and msm8996pro to set app specific settings. Change-Id: I9537e8022fb550e94fcba21709572372d024a701 Signed-off-by: Mohammed Khajapasha --- arch/arm/boot/dts/qcom/msm8996.dtsi | 4 ++-- arch/arm/boot/dts/qcom/msm8996pro.dtsi | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8996.dtsi b/arch/arm/boot/dts/qcom/msm8996.dtsi index b342288737848..cb6ebd12297b0 100644 --- a/arch/arm/boot/dts/qcom/msm8996.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -21,7 +21,7 @@ interrupt-parent = <&intc>; chosen { - bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1"; + bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1 app_setting.use_32bit_app_setting=1"; }; aliases { diff --git a/arch/arm/boot/dts/qcom/msm8996pro.dtsi b/arch/arm/boot/dts/qcom/msm8996pro.dtsi index 758f40e1d6a51..d4b3ae3a0a58b 100644 --- a/arch/arm/boot/dts/qcom/msm8996pro.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996pro.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -20,6 +20,10 @@ / { model = "Qualcomm Technologies, Inc. MSM 8996pro"; qcom,msm-id = <305 0x10000>; + + chosen { + bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1 app_setting.use_32bit_app_setting_pro=1"; + }; }; &apc_apm { From 3f369f883b4dc05cd963ca41f8251d29ee8a7878 Mon Sep 17 00:00:00 2001 From: Surajit Podder Date: Mon, 19 Dec 2016 16:20:57 +0530 Subject: [PATCH 0537/1015] ARM: dts: msm: add efuse register information on msm8953 Add efuse2 register information for clients to read to know the capability information. Change-Id: Ib28fd03a482975e0a8ab48110cb67c3db52e2a9e Signed-off-by: Surajit Podder --- arch/arm/boot/dts/qcom/msm8953-vidc.dtsi | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8953-vidc.dtsi b/arch/arm/boot/dts/qcom/msm8953-vidc.dtsi index c66313e0f5147..4e68f4a2a16e0 100644 --- a/arch/arm/boot/dts/qcom/msm8953-vidc.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-vidc.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,9 +14,11 @@ qcom,vidc@1d00000 { compatible = "qcom,msm-vidc"; reg = <0x01d00000 0xff000>, - <0x000a4124 0x4>; - reg-names = "vidc", "efuse"; + <0x000a4124 0x4>, + <0x000a0164 0x4>; + reg-names = "vidc", "efuse", "efuse2"; qcom,platform-version = <0x00180000 0x13>; + qcom,capability-version = <0x00002000 0x0d>; interrupts = <0 44 0>; /* Regulators */ venus-supply = <&gdsc_venus>; From b27110114de21a6c522b96328aebfa29fe459c8f Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Tue, 31 May 2016 11:24:23 -0600 Subject: [PATCH 0538/1015] msm: kgsl: Fix pagetable member of struct kgsl_memdesc memdesc->pagetable is supposed to help ensure that memory gets unmapped before it is freed, but the pagetable member is being populated at create time not when the buffer gets mapped. This forces the developer to ensure that the same pagetable is used for both the create and map step. Instead, assign the pagetable member when it is first used (to get a GPU address) and put it away when the GPU address is released. Change-Id: Ic0dedbad372fd9029b932dd99633a650049751ed Signed-off-by: Jordan Crouse Signed-off-by: Sudeep Yedalapure --- drivers/gpu/msm/adreno_a5xx.c | 4 ++-- drivers/gpu/msm/kgsl.c | 33 +++++++----------------------- drivers/gpu/msm/kgsl_iommu.c | 35 +++++++++++++++++--------------- drivers/gpu/msm/kgsl_mmu.c | 29 ++++++++++++++++++++------ drivers/gpu/msm/kgsl_mmu.h | 7 +++---- drivers/gpu/msm/kgsl_sharedmem.c | 27 ++++++++---------------- drivers/gpu/msm/kgsl_sharedmem.h | 11 ++++------ 7 files changed, 66 insertions(+), 80 deletions(-) diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c index b09e998bac02c..9c287d553c74d 100644 --- a/drivers/gpu/msm/adreno_a5xx.c +++ b/drivers/gpu/msm/adreno_a5xx.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -250,7 +250,7 @@ static int a5xx_critical_packet_construct(struct adreno_device *adreno_dev) return ret; ret = kgsl_allocate_user(&adreno_dev->dev, &crit_pkts_refbuf0, - NULL, PAGE_SIZE, KGSL_MEMFLAGS_SECURE); + PAGE_SIZE, KGSL_MEMFLAGS_SECURE); if (ret) return ret; diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 8bfff1b438150..2a561beaebbf0 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -370,24 +370,6 @@ kgsl_mem_entry_track_gpuaddr(struct kgsl_process_private *process, return kgsl_mmu_get_gpuaddr(pagetable, &entry->memdesc); } -/** - * kgsl_mem_entry_untrack_gpuaddr() - Untrack memory that is previously tracked - * process - Pointer to process private to which memory belongs - * entry - Memory entry to untrack - * - * Function just does the opposite of kgsl_mem_entry_track_gpuaddr. Needs to be - * called with processes spin lock held - */ -static void -kgsl_mem_entry_untrack_gpuaddr(struct kgsl_process_private *process, - struct kgsl_mem_entry *entry) -{ - struct kgsl_pagetable *pagetable = entry->memdesc.pagetable; - - if (entry->memdesc.gpuaddr) - kgsl_mmu_put_gpuaddr(pagetable, &entry->memdesc); -} - /* Commit the entry to the process so it can be accessed by other operations */ static void kgsl_mem_entry_commit_process(struct kgsl_mem_entry *entry) { @@ -436,7 +418,7 @@ kgsl_mem_entry_attach_process(struct kgsl_mem_entry *entry, if (id < 0) { ret = id; - kgsl_mem_entry_untrack_gpuaddr(process, entry); + kgsl_mmu_put_gpuaddr(&entry->memdesc); goto err_put_proc_priv; } @@ -472,6 +454,7 @@ kgsl_mem_entry_attach_process(struct kgsl_mem_entry *entry, static void kgsl_mem_entry_detach_process(struct kgsl_mem_entry *entry) { unsigned int type; + if (entry == NULL) return; @@ -488,9 +471,7 @@ static void kgsl_mem_entry_detach_process(struct kgsl_mem_entry *entry) entry->priv->stats[type].cur -= entry->memdesc.size; spin_unlock(&entry->priv->mem_lock); - kgsl_mmu_unmap(entry->memdesc.pagetable, &entry->memdesc); - - kgsl_mem_entry_untrack_gpuaddr(entry->priv, entry); + kgsl_mmu_put_gpuaddr(&entry->memdesc); kgsl_process_private_put(entry->priv); @@ -3021,7 +3002,7 @@ static struct kgsl_mem_entry *gpumem_alloc_entry( entry->memdesc.priv |= KGSL_MEMDESC_SECURE; ret = kgsl_allocate_user(dev_priv->device, &entry->memdesc, - private->pagetable, size, flags); + size, flags); if (ret != 0) goto err; @@ -3442,11 +3423,11 @@ static unsigned long _gpu_set_svm_region(struct kgsl_process_private *private, return ret; entry->memdesc.gpuaddr = (uint64_t) addr; + entry->memdesc.pagetable = private->pagetable; ret = kgsl_mmu_map(private->pagetable, &entry->memdesc); if (ret) { - kgsl_mmu_put_gpuaddr(private->pagetable, - &entry->memdesc); + kgsl_mmu_put_gpuaddr(&entry->memdesc); return ret; } diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c index 0d207494c9e80..724d129aab1a8 100644 --- a/drivers/gpu/msm/kgsl_iommu.c +++ b/drivers/gpu/msm/kgsl_iommu.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1402,17 +1402,16 @@ static int _setstate_alloc(struct kgsl_device *device, { int ret; - ret = kgsl_sharedmem_alloc_contig(device, &iommu->setstate, NULL, - PAGE_SIZE); - if (ret) - return ret; + ret = kgsl_sharedmem_alloc_contig(device, &iommu->setstate, PAGE_SIZE); - /* Mark the setstate memory as read only */ - iommu->setstate.flags |= KGSL_MEMFLAGS_GPUREADONLY; + if (!ret) { + /* Mark the setstate memory as read only */ + iommu->setstate.flags |= KGSL_MEMFLAGS_GPUREADONLY; - kgsl_sharedmem_set(device, &iommu->setstate, 0, 0, PAGE_SIZE); + kgsl_sharedmem_set(device, &iommu->setstate, 0, 0, PAGE_SIZE); + } - return 0; + return ret; } static int kgsl_iommu_init(struct kgsl_mmu *mmu) @@ -1663,7 +1662,7 @@ static int _iommu_map_guard_page(struct kgsl_pagetable *pt, if (!kgsl_secure_guard_page_memdesc.sgt) { if (kgsl_allocate_user(KGSL_MMU_DEVICE(pt->mmu), - &kgsl_secure_guard_page_memdesc, pt, + &kgsl_secure_guard_page_memdesc, sgp_size, KGSL_MEMFLAGS_SECURE)) { KGSL_CORE_ERR( "Secure guard page alloc failed\n"); @@ -2264,23 +2263,27 @@ static int kgsl_iommu_get_gpuaddr(struct kgsl_pagetable *pagetable, } ret = _insert_gpuaddr(pagetable, addr, size); - if (ret == 0) + if (ret == 0) { memdesc->gpuaddr = addr; + memdesc->pagetable = pagetable; + } out: spin_unlock(&pagetable->lock); return ret; } -static void kgsl_iommu_put_gpuaddr(struct kgsl_pagetable *pagetable, - struct kgsl_memdesc *memdesc) +static void kgsl_iommu_put_gpuaddr(struct kgsl_memdesc *memdesc) { - spin_lock(&pagetable->lock); + if (memdesc->pagetable == NULL) + return; + + spin_lock(&memdesc->pagetable->lock); - if (_remove_gpuaddr(pagetable, memdesc->gpuaddr)) + if (_remove_gpuaddr(memdesc->pagetable, memdesc->gpuaddr)) BUG(); - spin_unlock(&pagetable->lock); + spin_unlock(&memdesc->pagetable->lock); } static int kgsl_iommu_svm_range(struct kgsl_pagetable *pagetable, diff --git a/drivers/gpu/msm/kgsl_mmu.c b/drivers/gpu/msm/kgsl_mmu.c index d0c5dc71401c8..99dff79bf03f0 100644 --- a/drivers/gpu/msm/kgsl_mmu.c +++ b/drivers/gpu/msm/kgsl_mmu.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -419,17 +419,29 @@ EXPORT_SYMBOL(kgsl_mmu_map); * @pagetable: Pagetable to release the memory from * @memdesc: Memory descriptor containing the GPU address to free */ -void kgsl_mmu_put_gpuaddr(struct kgsl_pagetable *pagetable, - struct kgsl_memdesc *memdesc) +void kgsl_mmu_put_gpuaddr(struct kgsl_memdesc *memdesc) { + struct kgsl_pagetable *pagetable = memdesc->pagetable; + int unmap_fail = 0; + if (memdesc->size == 0 || memdesc->gpuaddr == 0) return; - if (PT_OP_VALID(pagetable, put_gpuaddr)) - pagetable->pt_ops->put_gpuaddr(pagetable, memdesc); + if (!kgsl_memdesc_is_global(memdesc)) + unmap_fail = kgsl_mmu_unmap(pagetable, memdesc); + + /* + * Do not free the gpuaddr/size if unmap fails. Because if we + * try to map this range in future, the iommu driver will throw + * a BUG_ON() because it feels we are overwriting a mapping. + */ + if (PT_OP_VALID(pagetable, put_gpuaddr) && (unmap_fail == 0)) + pagetable->pt_ops->put_gpuaddr(memdesc); if (!kgsl_memdesc_is_global(memdesc)) memdesc->gpuaddr = 0; + + memdesc->pagetable = NULL; } EXPORT_SYMBOL(kgsl_mmu_put_gpuaddr); @@ -580,7 +592,12 @@ static int nommu_get_gpuaddr(struct kgsl_pagetable *pagetable, memdesc->gpuaddr = (uint64_t) sg_phys(memdesc->sgt->sgl); - return memdesc->gpuaddr != 0 ? 0 : -ENOMEM; + if (memdesc->gpuaddr) { + memdesc->pagetable = pagetable; + return 0; + } + + return -ENOMEM; } static struct kgsl_mmu_pt_ops nommu_pt_ops = { diff --git a/drivers/gpu/msm/kgsl_mmu.h b/drivers/gpu/msm/kgsl_mmu.h index 93b1f9d2e40fd..d191b1ca4b3fb 100644 --- a/drivers/gpu/msm/kgsl_mmu.h +++ b/drivers/gpu/msm/kgsl_mmu.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -92,7 +92,7 @@ struct kgsl_mmu_pt_ops { u64 (*get_ttbr0)(struct kgsl_pagetable *); u32 (*get_contextidr)(struct kgsl_pagetable *); int (*get_gpuaddr)(struct kgsl_pagetable *, struct kgsl_memdesc *); - void (*put_gpuaddr)(struct kgsl_pagetable *, struct kgsl_memdesc *); + void (*put_gpuaddr)(struct kgsl_memdesc *); uint64_t (*find_svm_region)(struct kgsl_pagetable *, uint64_t, uint64_t, uint64_t, uint64_t); int (*set_svm_region)(struct kgsl_pagetable *, uint64_t, uint64_t); @@ -180,8 +180,7 @@ int kgsl_mmu_map(struct kgsl_pagetable *pagetable, struct kgsl_memdesc *memdesc); int kgsl_mmu_unmap(struct kgsl_pagetable *pagetable, struct kgsl_memdesc *memdesc); -void kgsl_mmu_put_gpuaddr(struct kgsl_pagetable *pagetable, - struct kgsl_memdesc *memdesc); +void kgsl_mmu_put_gpuaddr(struct kgsl_memdesc *memdesc); unsigned int kgsl_virtaddr_to_physaddr(void *virtaddr); unsigned int kgsl_mmu_log_fault_addr(struct kgsl_mmu *mmu, u64 ttbr0, uint64_t addr); diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 735b1886682c8..12a6ac97e0303 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -318,12 +318,11 @@ static int kgsl_cma_alloc_secure(struct kgsl_device *device, static int kgsl_allocate_secure(struct kgsl_device *device, struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size) { int ret; if (MMU_FEATURE(&device->mmu, KGSL_MMU_HYP_SECURE_ALLOC)) - ret = kgsl_sharedmem_page_alloc_user(memdesc, pagetable, size); + ret = kgsl_sharedmem_page_alloc_user(memdesc, size); else ret = kgsl_cma_alloc_secure(device, memdesc, size); @@ -332,7 +331,6 @@ static int kgsl_allocate_secure(struct kgsl_device *device, int kgsl_allocate_user(struct kgsl_device *device, struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size, uint64_t flags) { int ret; @@ -340,12 +338,11 @@ int kgsl_allocate_user(struct kgsl_device *device, memdesc->flags = flags; if (kgsl_mmu_get_mmutype(device) == KGSL_MMU_TYPE_NONE) - ret = kgsl_sharedmem_alloc_contig(device, memdesc, - pagetable, size); + ret = kgsl_sharedmem_alloc_contig(device, memdesc, size); else if (flags & KGSL_MEMFLAGS_SECURE) - ret = kgsl_allocate_secure(device, memdesc, pagetable, size); + ret = kgsl_allocate_secure(device, memdesc, size); else - ret = kgsl_sharedmem_page_alloc_user(memdesc, pagetable, size); + ret = kgsl_sharedmem_page_alloc_user(memdesc, size); return ret; } @@ -681,7 +678,6 @@ static void kgsl_zero_pages(struct page **pages, unsigned int pcount) int kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size) { int ret = 0; @@ -713,7 +709,6 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, len_alloc = PAGE_ALIGN(size) >> PAGE_SHIFT; - memdesc->pagetable = pagetable; memdesc->ops = &kgsl_page_alloc_ops; /* @@ -854,10 +849,8 @@ void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc) if (memdesc == NULL || memdesc->size == 0) return; - if (memdesc->gpuaddr) { - kgsl_mmu_unmap(memdesc->pagetable, memdesc); - kgsl_mmu_put_gpuaddr(memdesc->pagetable, memdesc); - } + /* Make sure the memory object has been unmapped */ + kgsl_mmu_put_gpuaddr(memdesc); if (memdesc->ops && memdesc->ops->free) memdesc->ops->free(memdesc); @@ -1037,8 +1030,7 @@ void kgsl_get_memory_usage(char *name, size_t name_size, uint64_t memflags) EXPORT_SYMBOL(kgsl_get_memory_usage); int kgsl_sharedmem_alloc_contig(struct kgsl_device *device, - struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size) + struct kgsl_memdesc *memdesc, uint64_t size) { int result = 0; @@ -1047,7 +1039,6 @@ int kgsl_sharedmem_alloc_contig(struct kgsl_device *device, return -EINVAL; memdesc->size = size; - memdesc->pagetable = pagetable; memdesc->ops = &kgsl_cma_ops; memdesc->dev = device->dev->parent; @@ -1138,7 +1129,6 @@ static int kgsl_cma_alloc_secure(struct kgsl_device *device, { struct kgsl_iommu *iommu = KGSL_IOMMU_PRIV(device); int result = 0; - struct kgsl_pagetable *pagetable = device->mmu.securepagetable; size_t aligned; /* Align size to 1M boundaries */ @@ -1158,7 +1148,6 @@ static int kgsl_cma_alloc_secure(struct kgsl_device *device, memdesc->priv &= ~KGSL_MEMDESC_GUARD_PAGE; memdesc->size = aligned; - memdesc->pagetable = pagetable; memdesc->ops = &kgsl_cma_ops; memdesc->dev = iommu->ctx[KGSL_IOMMU_CONTEXT_SECURE].dev; diff --git a/drivers/gpu/msm/kgsl_sharedmem.h b/drivers/gpu/msm/kgsl_sharedmem.h index aae79adcef7ff..19477f57812ca 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.h +++ b/drivers/gpu/msm/kgsl_sharedmem.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -26,7 +26,7 @@ struct kgsl_process_private; int kgsl_sharedmem_alloc_contig(struct kgsl_device *device, struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size); + uint64_t size); void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc); @@ -66,13 +66,11 @@ void kgsl_sharedmem_uninit_sysfs(void); int kgsl_allocate_user(struct kgsl_device *device, struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size, uint64_t flags); void kgsl_get_memory_usage(char *str, size_t len, uint64_t memflags); int kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size); #define MEMFLAGS(_flags, _mask, _shift) \ @@ -271,11 +269,10 @@ static inline int kgsl_allocate_global(struct kgsl_device *device, memdesc->priv = priv; if ((memdesc->priv & KGSL_MEMDESC_CONTIG) != 0) - ret = kgsl_sharedmem_alloc_contig(device, memdesc, NULL, + ret = kgsl_sharedmem_alloc_contig(device, memdesc, (size_t) size); else { - ret = kgsl_sharedmem_page_alloc_user(memdesc, NULL, - (size_t) size); + ret = kgsl_sharedmem_page_alloc_user(memdesc, (size_t) size); if (ret == 0) kgsl_memdesc_map(memdesc); } From d2df6c984fbf1686c82d96f50a3896d3628b8c23 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Tue, 31 May 2016 11:24:24 -0600 Subject: [PATCH 0539/1015] msm: kgsl: Make sure USE_CPU_MAP + MAP_USER_MEM work together If one is mapping anonyomous user memory in the GPU with SVM enabled we want to try to accommodate that request if possible. The memory address was being set up correctly in the memory descriptor but the GPU address was getting tripped up when getting mapped in the process. This is because the memory should be treated like SVM memory so it needs to be registered in the memory tree and the rest of the path needs to accept the address. Change-Id: Ic0dedbad661143977a226d50263c26b5af579ce3 Signed-off-by: Jordan Crouse Signed-off-by: Sudeep Yedalapure --- drivers/gpu/msm/kgsl.c | 134 ++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 77 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 2a561beaebbf0..3098fc603b3f5 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -166,9 +166,10 @@ int kgsl_memfree_find_entry(pid_t ptname, uint64_t *gpuaddr, return 0; } -static void kgsl_memfree_purge(pid_t ptname, uint64_t gpuaddr, - uint64_t size) +static void kgsl_memfree_purge(struct kgsl_pagetable *pagetable, + uint64_t gpuaddr, uint64_t size) { + pid_t ptname = pagetable ? pagetable->name : 0; int i; if (memfree.list == NULL) @@ -332,40 +333,22 @@ kgsl_mem_entry_destroy(struct kref *kref) } EXPORT_SYMBOL(kgsl_mem_entry_destroy); -/** - * kgsl_mem_entry_track_gpuaddr - Insert a mem_entry in the address tree and - * assign it with a gpu address space before insertion - * @process: the process that owns the memory - * @entry: the memory entry - * - * @returns - 0 on succcess else error code - * - * Insert the kgsl_mem_entry in to the rb_tree for searching by GPU address. - * The assignment of gpu address and insertion into list needs to - * happen with the memory lock held to avoid race conditions between - * gpu address being selected and some other thread looking through the - * rb list in search of memory based on gpuaddr - * This function should be called with processes memory spinlock held - */ -static int -kgsl_mem_entry_track_gpuaddr(struct kgsl_process_private *process, - struct kgsl_mem_entry *entry) +/* Allocate a IOVA for memory objects that don't use SVM */ +static int kgsl_mem_entry_track_gpuaddr(struct kgsl_device *device, + struct kgsl_process_private *process, + struct kgsl_mem_entry *entry) { - struct kgsl_pagetable *pagetable = process->pagetable; + struct kgsl_pagetable *pagetable; /* - * If cpu=gpu map is used then caller needs to set the - * gpu address + * If SVM is enabled for this object then the address needs to be + * assigned elsewhere */ - if (kgsl_memdesc_use_cpu_map(&entry->memdesc)) { - if (!entry->memdesc.gpuaddr) - return 0; - } else if (entry->memdesc.gpuaddr) { - WARN_ONCE(1, "gpuaddr assigned w/o holding memory lock\n"); - return -EINVAL; - } - if (kgsl_memdesc_is_secured(&entry->memdesc)) - pagetable = pagetable->mmu->securepagetable; + if (kgsl_memdesc_use_cpu_map(&entry->memdesc)) + return 0; + + pagetable = kgsl_memdesc_is_secured(&entry->memdesc) ? + device->mmu.securepagetable : process->pagetable; return kgsl_mmu_get_gpuaddr(pagetable, &entry->memdesc); } @@ -381,33 +364,25 @@ static void kgsl_mem_entry_commit_process(struct kgsl_mem_entry *entry) spin_unlock(&entry->priv->mem_lock); } -/** - * kgsl_mem_entry_attach_process - Attach a mem_entry to its owner process - * @entry: the memory entry - * @process: the owner process - * - * Attach a newly created mem_entry to its owner process so that - * it can be found later. The mem_entry will be added to mem_idr and have - * its 'id' field assigned. - * - * @returns - 0 on success or error code on failure. +/* + * Attach the memory object to a process by (possibly) getting a GPU address and + * (possibly) mapping it */ -int -kgsl_mem_entry_attach_process(struct kgsl_mem_entry *entry, - struct kgsl_device_private *dev_priv) +static int kgsl_mem_entry_attach_process(struct kgsl_device *device, + struct kgsl_process_private *process, + struct kgsl_mem_entry *entry) { - int id; - int ret; - struct kgsl_process_private *process = dev_priv->process_priv; - struct kgsl_pagetable *pagetable = NULL; + int id, ret; ret = kgsl_process_private_get(process); if (!ret) return -EBADF; - ret = kgsl_mem_entry_track_gpuaddr(process, entry); - if (ret) - goto err_put_proc_priv; + ret = kgsl_mem_entry_track_gpuaddr(device, process, entry); + if (ret) { + kgsl_process_private_put(process); + return ret; + } idr_preload(GFP_KERNEL); spin_lock(&process->mem_lock); @@ -417,40 +392,33 @@ kgsl_mem_entry_attach_process(struct kgsl_mem_entry *entry, idr_preload_end(); if (id < 0) { - ret = id; - kgsl_mmu_put_gpuaddr(&entry->memdesc); - goto err_put_proc_priv; + if (!kgsl_memdesc_use_cpu_map(&entry->memdesc)) + kgsl_mmu_put_gpuaddr(&entry->memdesc); + kgsl_process_private_put(process); + return id; } entry->id = id; entry->priv = process; - /* map the memory after unlocking if gpuaddr has been assigned */ + /* + * Map the memory if a GPU address is already assigned, either through + * kgsl_mem_entry_track_gpuaddr() or via some other SVM process + */ if (entry->memdesc.gpuaddr) { - /* if a secured buffer map it to secure global pagetable */ - if (kgsl_memdesc_is_secured(&entry->memdesc)) - pagetable = process->pagetable->mmu->securepagetable; - else - pagetable = process->pagetable; + ret = kgsl_mmu_map(entry->memdesc.pagetable, &entry->memdesc); - entry->memdesc.pagetable = pagetable; - ret = kgsl_mmu_map(pagetable, &entry->memdesc); if (ret) kgsl_mem_entry_detach_process(entry); } - kgsl_memfree_purge(pagetable ? pagetable->name : 0, - entry->memdesc.gpuaddr, entry->memdesc.size); - - return ret; + kgsl_memfree_purge(entry->memdesc.pagetable, entry->memdesc.gpuaddr, + entry->memdesc.size); -err_put_proc_priv: - kgsl_process_private_put(process); return ret; } /* Detach a memory entry from a process and unmap it from the MMU */ - static void kgsl_mem_entry_detach_process(struct kgsl_mem_entry *entry) { unsigned int type; @@ -2052,10 +2020,21 @@ static int kgsl_setup_anon_useraddr(struct kgsl_pagetable *pagetable, entry->memdesc.pagetable = pagetable; entry->memdesc.size = (uint64_t) size; entry->memdesc.useraddr = hostptr; - if (kgsl_memdesc_use_cpu_map(&entry->memdesc)) - entry->memdesc.gpuaddr = (uint64_t) entry->memdesc.useraddr; entry->memdesc.flags |= KGSL_MEMFLAGS_USERMEM_ADDR; + if (kgsl_memdesc_use_cpu_map(&entry->memdesc)) { + int ret; + + /* Register the address in the database */ + ret = kgsl_mmu_set_svm_region(pagetable, + (uint64_t) entry->memdesc.useraddr, (uint64_t) size); + + if (ret) + return ret; + + entry->memdesc.gpuaddr = (uint64_t) entry->memdesc.useraddr; + } + return memdesc_sg_virt(&entry->memdesc, NULL); } @@ -2305,7 +2284,7 @@ long kgsl_ioctl_gpuobj_import(struct kgsl_device_private *dev_priv, param->flags = entry->memdesc.flags; - ret = kgsl_mem_entry_attach_process(entry, dev_priv); + ret = kgsl_mem_entry_attach_process(dev_priv->device, private, entry); if (ret) goto unmap; @@ -2609,7 +2588,8 @@ long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv, /* echo back flags */ param->flags = (unsigned int) entry->memdesc.flags; - result = kgsl_mem_entry_attach_process(entry, dev_priv); + result = kgsl_mem_entry_attach_process(dev_priv->device, private, + entry); if (result) goto error_attach; @@ -3006,7 +2986,7 @@ static struct kgsl_mem_entry *gpumem_alloc_entry( if (ret != 0) goto err; - ret = kgsl_mem_entry_attach_process(entry, dev_priv); + ret = kgsl_mem_entry_attach_process(dev_priv->device, private, entry); if (ret != 0) { kgsl_sharedmem_free(&entry->memdesc); goto err; @@ -3431,8 +3411,8 @@ static unsigned long _gpu_set_svm_region(struct kgsl_process_private *private, return ret; } - kgsl_memfree_purge(private->pagetable ? private->pagetable->name : 0, - entry->memdesc.gpuaddr, entry->memdesc.size); + kgsl_memfree_purge(private->pagetable, entry->memdesc.gpuaddr, + entry->memdesc.size); return addr; } From f647ed40b5d2a91538ee7a388b801fea384a27fd Mon Sep 17 00:00:00 2001 From: Dhoat Harpal Date: Mon, 9 Jan 2017 17:31:54 +0530 Subject: [PATCH 0540/1015] soc: qcom: smem: Fix uninitialized usage of a stack variable variable size is output variable and is not initialized, printing it can lead to information leak. variable size is removed from log message. CRs-Fixed: 1093837 Change-Id: I95cf227bb82a2ee7c6f43db151f75a942e8e55ce Signed-off-by: Dhoat Harpal --- drivers/soc/qcom/smem.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/soc/qcom/smem.c b/drivers/soc/qcom/smem.c index 76018d84b9c95..ee0bade506d91 100644 --- a/drivers/soc/qcom/smem.c +++ b/drivers/soc/qcom/smem.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2015,2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -367,7 +367,7 @@ static void *__smem_get_entry_secure(unsigned id, uint32_t a_hdr_size; int rc; - SMEM_DBG("%s(%u, %u, %u, %u, %d, %d)\n", __func__, id, *size, to_proc, + SMEM_DBG("%s(%u, %u, %u, %d, %d)\n", __func__, id, to_proc, flags, skip_init_check, use_rspinlock); if (!skip_init_check && !smem_initialized_check()) @@ -788,7 +788,7 @@ EXPORT_SYMBOL(smem_alloc); void *smem_get_entry(unsigned id, unsigned *size, unsigned to_proc, unsigned flags) { - SMEM_DBG("%s(%u, %u, %u, %u)\n", __func__, id, *size, to_proc, flags); + SMEM_DBG("%s(%u, %u, %u)\n", __func__, id, to_proc, flags); /* * Handle the circular dependecy between SMEM and software implemented From d85427c4f1ef56406af552787337cb4deae9b138 Mon Sep 17 00:00:00 2001 From: Dhoat Harpal Date: Tue, 8 Nov 2016 15:00:20 +0530 Subject: [PATCH 0541/1015] soc: qcom: glink: add NULL check for edge_ctx In function edge_name_to_ctx_create, NULL check is missing after kzalloc for edge_ctx variable. NULL check validation is added. CRs-Fixed: 1086686 Change-Id: Icbffbd9d02df97bda531353c41a7025b95a53991 Signed-off-by: Dhoat Harpal --- drivers/soc/qcom/glink.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/soc/qcom/glink.c b/drivers/soc/qcom/glink.c index f41dca077ec8f..d8102ff006ff0 100644 --- a/drivers/soc/qcom/glink.c +++ b/drivers/soc/qcom/glink.c @@ -1022,7 +1022,8 @@ static void glink_edge_ctx_release(struct rwref_lock *ch_st_lock) * it is not found. * @xprt_ctx: Transport to search for a matching edge. * - * Return: The edge ctx corresponding to edge of @xprt_ctx. + * Return: The edge ctx corresponding to edge of @xprt_ctx or + * NULL if memory allocation fails. */ static struct glink_core_edge_ctx *edge_name_to_ctx_create( struct glink_core_xprt_ctx *xprt_ctx) @@ -1038,6 +1039,10 @@ static struct glink_core_edge_ctx *edge_name_to_ctx_create( } } edge_ctx = kzalloc(sizeof(struct glink_core_edge_ctx), GFP_KERNEL); + if (!edge_ctx) { + mutex_unlock(&edge_list_lock_lhd0); + return NULL; + } strlcpy(edge_ctx->name, xprt_ctx->edge, GLINK_NAME_SIZE); rwref_lock_init(&edge_ctx->edge_ref_lock_lhd1, glink_edge_ctx_release); mutex_init(&edge_ctx->edge_migration_lock_lhd2); @@ -3814,6 +3819,10 @@ int glink_core_register_transport(struct glink_transport_if *if_ptr, xprt_ptr->local_version_idx = cfg->versions_entries - 1; xprt_ptr->remote_version_idx = cfg->versions_entries - 1; xprt_ptr->edge_ctx = edge_name_to_ctx_create(xprt_ptr); + if (!xprt_ptr->edge_ctx) { + kfree(xprt_ptr); + return -ENOMEM; + } xprt_ptr->l_features = cfg->versions[cfg->versions_entries - 1].features; if (!if_ptr->poll) From 3157b1ac5a20569b74d72cc06aedcae1c95e5177 Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Tue, 10 Jan 2017 20:19:28 +0530 Subject: [PATCH 0542/1015] diag: Synchronize threads to fix possible deadlock This patch fixes the possible deadlock during processing of feature mask between different peripherals. CRs-Fixed: 1101672 Change-Id: I4d4223275c03017ef367bafa8e55be1803b9a750 Signed-off-by: Manoj Prabhu B --- drivers/char/diag/diagchar.h | 4 ++-- drivers/char/diag/diagchar_core.c | 7 ++++--- drivers/char/diag/diagfwd_peripheral.c | 6 +++--- drivers/char/diag/diagfwd_socket.c | 18 +++++++++--------- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/drivers/char/diag/diagchar.h b/drivers/char/diag/diagchar.h index fb86f6e246b16..ebb91890db0d4 100644 --- a/drivers/char/diag/diagchar.h +++ b/drivers/char/diag/diagchar.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -503,7 +503,7 @@ struct diagchar_dev { struct list_head cmd_reg_list; struct mutex cmd_reg_mutex; uint32_t cmd_reg_count; - struct mutex diagfwd_channel_mutex; + struct mutex diagfwd_channel_mutex[NUM_PERIPHERALS]; /* Sizes that reflect memory pool sizes */ unsigned int poolsize; unsigned int poolsize_hdlc; diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index ee11ba0a5dccc..616ed72d55140 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -3312,7 +3312,7 @@ static int diagchar_cleanup(void) static int __init diagchar_init(void) { dev_t dev; - int error, ret; + int error, ret, i; pr_debug("diagfwd initializing ..\n"); ret = 0; @@ -3357,7 +3357,8 @@ static int __init diagchar_init(void) mutex_init(&driver->diag_file_mutex); mutex_init(&driver->delayed_rsp_mutex); mutex_init(&apps_data_mutex); - mutex_init(&driver->diagfwd_channel_mutex); + for (i = 0; i < NUM_PERIPHERALS; i++) + mutex_init(&driver->diagfwd_channel_mutex[i]); init_waitqueue_head(&driver->wait_q); INIT_WORK(&(driver->diag_drain_work), diag_drain_work_fn); INIT_WORK(&(driver->update_user_clients), diff --git a/drivers/char/diag/diagfwd_peripheral.c b/drivers/char/diag/diagfwd_peripheral.c index 7151771015938..cfa4b271ed645 100644 --- a/drivers/char/diag/diagfwd_peripheral.c +++ b/drivers/char/diag/diagfwd_peripheral.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -642,7 +642,7 @@ void diagfwd_close_transport(uint8_t transport, uint8_t peripheral) return; } - mutex_lock(&driver->diagfwd_channel_mutex); + mutex_lock(&driver->diagfwd_channel_mutex[peripheral]); fwd_info = &early_init_info[transport][peripheral]; if (fwd_info->p_ops && fwd_info->p_ops->close) fwd_info->p_ops->close(fwd_info->ctxt); @@ -664,7 +664,7 @@ void diagfwd_close_transport(uint8_t transport, uint8_t peripheral) diagfwd_late_open(dest_info); diagfwd_cntl_open(dest_info); init_fn(peripheral); - mutex_unlock(&driver->diagfwd_channel_mutex); + mutex_unlock(&driver->diagfwd_channel_mutex[peripheral]); diagfwd_queue_read(&peripheral_info[TYPE_DATA][peripheral]); diagfwd_queue_read(&peripheral_info[TYPE_CMD][peripheral]); } diff --git a/drivers/char/diag/diagfwd_socket.c b/drivers/char/diag/diagfwd_socket.c index 8a53b02b06702..93553d1e0882d 100644 --- a/drivers/char/diag/diagfwd_socket.c +++ b/drivers/char/diag/diagfwd_socket.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -925,9 +925,9 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len) (info->data_ready > 0) || (!info->hdl) || (atomic_read(&info->diag_state) == 0)); if (err) { - mutex_lock(&driver->diagfwd_channel_mutex); + mutex_lock(&driver->diagfwd_channel_mutex[info->peripheral]); diagfwd_channel_read_done(info->fwd_ctxt, buf, 0); - mutex_unlock(&driver->diagfwd_channel_mutex); + mutex_unlock(&driver->diagfwd_channel_mutex[info->peripheral]); return -ERESTARTSYS; } @@ -939,9 +939,9 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len) DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s closing read thread. diag state is closed\n", info->name); - mutex_lock(&driver->diagfwd_channel_mutex); + mutex_lock(&driver->diagfwd_channel_mutex[info->peripheral]); diagfwd_channel_read_done(info->fwd_ctxt, buf, 0); - mutex_unlock(&driver->diagfwd_channel_mutex); + mutex_unlock(&driver->diagfwd_channel_mutex[info->peripheral]); return 0; } @@ -1008,10 +1008,10 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len) if (total_recd > 0) { DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s read total bytes: %d\n", info->name, total_recd); - mutex_lock(&driver->diagfwd_channel_mutex); + mutex_lock(&driver->diagfwd_channel_mutex[info->peripheral]); err = diagfwd_channel_read_done(info->fwd_ctxt, buf, total_recd); - mutex_unlock(&driver->diagfwd_channel_mutex); + mutex_unlock(&driver->diagfwd_channel_mutex[info->peripheral]); if (err) goto fail; } else { @@ -1024,9 +1024,9 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len) return 0; fail: - mutex_lock(&driver->diagfwd_channel_mutex); + mutex_lock(&driver->diagfwd_channel_mutex[info->peripheral]); diagfwd_channel_read_done(info->fwd_ctxt, buf, 0); - mutex_unlock(&driver->diagfwd_channel_mutex); + mutex_unlock(&driver->diagfwd_channel_mutex[info->peripheral]); return -EIO; } From b737ad30d58b416f39f7d8e98cbd36e2c55f15b6 Mon Sep 17 00:00:00 2001 From: Imran Khan Date: Wed, 5 Oct 2016 17:40:05 +0530 Subject: [PATCH 0543/1015] defconfig: msm: Use RCU_BOOST option for msm8917/37/53 Use RCU_BOOST option to expedite completion of RCU read critical sections. We are using RCU_BOOST in conjunction with RCU_NOCB approach. The RCU_NOCB approach makes sure that the call back processing does not starve other tasks which are in need of CPU, while RCU_BOOST option ensures that we don't suffer from long grace periods. Change-Id: If82bd890eda71f0850ebb294b52f86cc42b3ff97 Signed-off-by: Imran Khan --- arch/arm/configs/msm8937-perf_defconfig | 1 + arch/arm/configs/msm8937_defconfig | 1 + arch/arm/configs/msmcortex-perf_defconfig | 1 + arch/arm/configs/msmcortex_defconfig | 1 + arch/arm64/configs/msm8937-perf_defconfig | 1 + arch/arm64/configs/msm8937_defconfig | 1 + arch/arm64/configs/msmcortex-perf_defconfig | 1 + arch/arm64/configs/msmcortex_defconfig | 1 + 8 files changed, 8 insertions(+) diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index 207babad45baa..9df84f1574904 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -4,6 +4,7 @@ CONFIG_AUDIT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index a4ce4312e9f20..9c5bae1dc62f4 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -3,6 +3,7 @@ CONFIG_AUDIT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index c8084ffbbfe4a..be71a873c5f39 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -5,6 +5,7 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index cdd8b9500b290..f93fdc01a034a 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -4,6 +4,7 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index eb5b3320f11d4..2f0480e828f53 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -3,6 +3,7 @@ CONFIG_AUDIT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 07d124a4fb095..160573147d378 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -2,6 +2,7 @@ CONFIG_AUDIT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index 47afae9fda81e..c082c100ee2b0 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -4,6 +4,7 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index d1882cc69c49f..47a1a5993ffcc 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -3,6 +3,7 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y From 33011c3a511039f146371d193cf6708c603d01cb Mon Sep 17 00:00:00 2001 From: kumarn Date: Sun, 22 Jan 2017 23:41:17 -0800 Subject: [PATCH 0544/1015] Revert "Revert "arm64: Add support for 32 bit app specific settings"" This reverts commit 07a2a5a0e5496d264ef74200c19f62de6259107b. Change-Id: Idfdd49c6855e922e7e8ac2b2d17e4165cb196573 Signed-off-by: Naveen Kumar --- arch/arm64/include/asm/app_api.h | 7 +++++++ arch/arm64/kernel/app_api.c | 35 ++++++++++++++++++++++++++++++++ arch/arm64/kernel/app_setting.c | 15 ++++++++++++++ kernel/sched/core.c | 3 +++ 4 files changed, 60 insertions(+) diff --git a/arch/arm64/include/asm/app_api.h b/arch/arm64/include/asm/app_api.h index 2162400fde13b..7032d636dab60 100644 --- a/arch/arm64/include/asm/app_api.h +++ b/arch/arm64/include/asm/app_api.h @@ -27,16 +27,23 @@ #ifdef CONFIG_MSM_APP_API extern void set_app_setting_bit(uint32_t bit); extern void clear_app_setting_bit(uint32_t bit); +extern void set_app_setting_bit_for_32bit_apps(void); +extern void clear_app_setting_bit_for_32bit_apps(void); #else static inline void set_app_setting_bit(uint32_t bit) {} static inline void clear_app_setting_bit(uint32_t bit) {} +static inline void set_app_setting_bit_for_32bit_apps(void) {} +static inline void clear_app_setting_bit_for_32bit_apps(void) {} #endif #ifdef CONFIG_MSM_APP_SETTINGS extern void switch_app_setting_bit(struct task_struct *prev, struct task_struct *next); +extern void switch_32bit_app_setting_bit(struct task_struct *prev, + struct task_struct *next); extern void apply_app_setting_bit(struct file *file); extern bool use_app_setting; +extern bool use_32bit_app_setting; #endif #endif diff --git a/arch/arm64/kernel/app_api.c b/arch/arm64/kernel/app_api.c index 39eeee1a9029b..1b3732accd4b0 100644 --- a/arch/arm64/kernel/app_api.c +++ b/arch/arm64/kernel/app_api.c @@ -18,6 +18,7 @@ #include static spinlock_t spinlock; +static spinlock_t spinlock_32bit_app; static DEFINE_PER_CPU(int, app_config_applied); static unsigned long app_config_set[NR_CPUS]; static unsigned long app_config_clear[NR_CPUS]; @@ -67,9 +68,43 @@ void clear_app_setting_bit(uint32_t bit) } EXPORT_SYMBOL(clear_app_setting_bit); +void set_app_setting_bit_for_32bit_apps(void) +{ + unsigned long flags; + uint64_t reg; + + spin_lock_irqsave(&spinlock_32bit_app, flags); + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg | BIT(18); + reg = reg & ~BIT(2); + reg = reg | 0x3; + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + spin_unlock_irqrestore(&spinlock_32bit_app, flags); +} +EXPORT_SYMBOL(set_app_setting_bit_for_32bit_apps); + +void clear_app_setting_bit_for_32bit_apps(void) +{ + unsigned long flags; + uint64_t reg; + + spin_lock_irqsave(&spinlock_32bit_app, flags); + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg & ~BIT(18); + reg = reg & ~0x3; + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + spin_unlock_irqrestore(&spinlock_32bit_app, flags); +} +EXPORT_SYMBOL(clear_app_setting_bit_for_32bit_apps); + static int __init init_app_api(void) { spin_lock_init(&spinlock); + spin_lock_init(&spinlock_32bit_app); return 0; } early_initcall(init_app_api); diff --git a/arch/arm64/kernel/app_setting.c b/arch/arm64/kernel/app_setting.c index 6b4eb28d0e244..8e7aeab39eddb 100644 --- a/arch/arm64/kernel/app_setting.c +++ b/arch/arm64/kernel/app_setting.c @@ -35,6 +35,10 @@ bool use_app_setting = true; module_param(use_app_setting, bool, 0644); MODULE_PARM_DESC(use_app_setting, "control use of app specific settings"); +bool use_32bit_app_setting = true; +module_param(use_32bit_app_setting, bool, 0644); +MODULE_PARM_DESC(use_32bit_app_setting, "control use of 32 bit app specific settings"); + static int set_name(const char *str, struct kernel_param *kp) { int len = strlen(str); @@ -87,6 +91,17 @@ void switch_app_setting_bit(struct task_struct *prev, struct task_struct *next) } EXPORT_SYMBOL(switch_app_setting_bit); +void switch_32bit_app_setting_bit(struct task_struct *prev, + struct task_struct *next) +{ + if (prev->mm && unlikely(is_compat_thread(task_thread_info(prev)))) + clear_app_setting_bit_for_32bit_apps(); + + if (next->mm && unlikely(is_compat_thread(task_thread_info(next)))) + set_app_setting_bit_for_32bit_apps(); +} +EXPORT_SYMBOL(switch_32bit_app_setting_bit); + void apply_app_setting_bit(struct file *file) { bool found = false; diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 984f9244d4b7e..5d5f0496700bd 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5643,6 +5643,9 @@ prepare_task_switch(struct rq *rq, struct task_struct *prev, #ifdef CONFIG_MSM_APP_SETTINGS if (use_app_setting) switch_app_setting_bit(prev, next); + + if (use_32bit_app_setting) + switch_32bit_app_setting_bit(prev, next); #endif } From afd7809e9c0a18c92d8e9350ef3b847744d0f981 Mon Sep 17 00:00:00 2001 From: Ram Chandrasekar Date: Wed, 14 Dec 2016 16:28:31 -0700 Subject: [PATCH 0545/1015] msm: thermal: Update error handling of device offline When device enters suspend, the suspend framework disables CPU hotplug functionality. During the suspend, any attempt from KTM to hotplug CPU will return error and in this case, KTM wont clear the cpus_offlined mask. In this case, the device framework assumes the core is still online. Next time the device resumes from suspend the core online attempt will be nacked by KTM. Thus the core will be offlined and subsequent attempts to bring the core online using device framework will fail. Update KTM error handling to remove the CPUs from the cpus_offlined mask, when device offline APIs return error. Thus KTM wont block suspend framework from bringing the core online. Also, update KTM not to evaluate new request to offline or online a core when the device is in suspend entry or exit. The re-evaluation will be triggered when the device exits suspend. Change-Id: I334fd782a2c5d604cafb94f44832d9c700891ba2 Signed-off-by: Ram Chandrasekar --- drivers/thermal/msm_thermal.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/thermal/msm_thermal.c b/drivers/thermal/msm_thermal.c index b28da9d3e8827..7592ce6d2814d 100644 --- a/drivers/thermal/msm_thermal.c +++ b/drivers/thermal/msm_thermal.c @@ -2822,7 +2822,7 @@ static void __ref do_core_control(long temp) cpu_dev = get_cpu_device(i); trace_thermal_pre_core_offline(i); ret = device_offline(cpu_dev); - if (ret) + if (ret < 0) pr_err("Error %d offline core %d\n", ret, i); trace_thermal_post_core_offline(i, @@ -2895,7 +2895,8 @@ static int __ref update_offline_cores(int val) cpu_dev = get_cpu_device(cpu); trace_thermal_pre_core_offline(cpu); ret = device_offline(cpu_dev); - if (ret) { + if (ret < 0) { + cpus_offlined &= ~BIT(cpu); pr_err_ratelimited( "Unable to offline CPU%d. err:%d\n", cpu, ret); @@ -2965,6 +2966,14 @@ static __ref int do_hotplug(void *data) &hotplug_notify_complete) != 0) ; reinit_completion(&hotplug_notify_complete); + + /* + * Suspend framework will have disabled the + * hotplug functionality. So wait till the suspend exits + * and then re-evaluate. + */ + if (in_suspend) + continue; mask = 0; mutex_lock(&core_control_mutex); From ece54866065ad10a8c2fa80593a6b50cc466eae7 Mon Sep 17 00:00:00 2001 From: Ramakant Singh Date: Thu, 8 Dec 2016 12:00:58 +0530 Subject: [PATCH 0546/1015] msm: mdss: avoid removing wrong multirect on validate failures During atomic commit - validate failures, the newly allocated pipes and pipes taken from the destroy list are cleaned up. Currently pipe ndx is checked which can lead to cleaning up the already in use multirect instead of the rect allocated in the current validate. Add checks to include checking based on multirect to avoid such cases. Change-Id: Icbc7e390110ccfbbe65645711b47d1eff8f60fa2 Signed-off-by: Ramakant Singh --- drivers/video/msm/mdss/mdss_mdp_layer.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_layer.c b/drivers/video/msm/mdss/mdss_mdp_layer.c index 23bba6b46ff13..20031e0400d3c 100644 --- a/drivers/video/msm/mdss/mdss_mdp_layer.c +++ b/drivers/video/msm/mdss/mdss_mdp_layer.c @@ -1936,16 +1936,20 @@ static int __validate_layers(struct msm_fb_data_type *mfd, mutex_lock(&mdp5_data->list_lock); list_for_each_entry_safe(pipe, tmp, &mdp5_data->pipes_used, list) { if (IS_ERR_VALUE(ret)) { - if ((pipe->ndx & rec_release_ndx[0]) || - (pipe->ndx & rec_release_ndx[1])) { + if (((pipe->ndx & rec_release_ndx[0]) && + (pipe->multirect.num == 0)) || + ((pipe->ndx & rec_release_ndx[1]) && + (pipe->multirect.num == 1))) { mdss_mdp_smp_unreserve(pipe); pipe->params_changed = 0; pipe->dirty = true; if (!list_empty(&pipe->list)) list_del_init(&pipe->list); mdss_mdp_pipe_destroy(pipe); - } else if ((pipe->ndx & rec_destroy_ndx[0]) || - (pipe->ndx & rec_destroy_ndx[1])) { + } else if (((pipe->ndx & rec_destroy_ndx[0]) && + (pipe->multirect.num == 0)) || + ((pipe->ndx & rec_destroy_ndx[1]) && + (pipe->multirect.num == 1))) { /* * cleanup/destroy list pipes should move back * to destroy list. Next/current kickoff cycle From 9ed1e02c0f13d58a4fc1085c9c6d1c0eeb538cbd Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Mon, 23 Jan 2017 16:09:46 +0530 Subject: [PATCH 0547/1015] usb: gadget: f_uvc: Fixed wrong length of H.264 frame descriptor Corrected the length of the H.264 frame descriptor and used the correct functions to cast the frame descriptor parameters. Change-Id: I5895ebbf81a2a29d31962142c92836cc0a15ae4e Signed-off-by: Sriharsha Allenki --- drivers/usb/gadget/function/f_uvc.h | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/drivers/usb/gadget/function/f_uvc.h b/drivers/usb/gadget/function/f_uvc.h index f263c805288a8..034a977322222 100644 --- a/drivers/usb/gadget/function/f_uvc.h +++ b/drivers/usb/gadget/function/f_uvc.h @@ -242,7 +242,6 @@ static const struct uvc_format_h264 uvc_fmt_h264 = { }; DECLARE_UVC_FRAME_H264(1); -DECLARE_UVC_FRAME_H264(3); static const struct UVC_FRAME_H264(1) uvc_frame_h264_1920p = { .bLength = UVC_DT_FRAME_H264_SIZE(1), @@ -260,15 +259,15 @@ static const struct UVC_FRAME_H264(1) uvc_frame_h264_1920p = { .bmCapabilities = 0x47, .bmSVCCapabilities = 0x4, .bmMVCCapabilities = 0, - .dwMinBitRate = cpu_to_le16(29491200), - .dwMaxBitRate = cpu_to_le16(100000000), - .dwDefaultFrameInterval = cpu_to_le16(333667), + .dwMinBitRate = cpu_to_le32(29491200), + .dwMaxBitRate = cpu_to_le32(100000000), + .dwDefaultFrameInterval = cpu_to_le32(333667), .bNumFrameIntervals = 1, - .dwFrameInterval[0] = cpu_to_le16(333667), + .dwFrameInterval[0] = cpu_to_le32(333667), }; -static const struct UVC_FRAME_H264(3) uvc_frame_h264_960p = { - .bLength = UVC_DT_FRAME_H264_SIZE(3), +static const struct UVC_FRAME_H264(1) uvc_frame_h264_960p = { + .bLength = UVC_DT_FRAME_H264_SIZE(1), .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VS_FRAME_H264, .bFrameIndex = 2, @@ -283,11 +282,11 @@ static const struct UVC_FRAME_H264(3) uvc_frame_h264_960p = { .bmCapabilities = 0x47, .bmSVCCapabilities = 0x4, .bmMVCCapabilities = 0, - .dwMinBitRate = cpu_to_le16(29491200), - .dwMaxBitRate = cpu_to_le16(100000000), - .dwDefaultFrameInterval = cpu_to_le16(333667), + .dwMinBitRate = cpu_to_le32(29491200), + .dwMaxBitRate = cpu_to_le32(100000000), + .dwDefaultFrameInterval = cpu_to_le32(333667), .bNumFrameIntervals = 1, - .dwFrameInterval[0] = cpu_to_le16(333667), + .dwFrameInterval[0] = cpu_to_le32(333667), }; static const struct uvc_color_matching_descriptor uvc_color_matching = { From e42135778ee3b12089e2cb35cf96dc26f941fe9b Mon Sep 17 00:00:00 2001 From: Abhishek Kondaveeti Date: Mon, 23 Jan 2017 18:03:05 +0530 Subject: [PATCH 0548/1015] ARM: dts: msm: Add VFE efuse support for 8953 Add efuse register to be read for VFE resolution update. Change-Id: I5e37964a3993ccbf27916d37f2b2db19d07388c8 Signed-off-by: Abhishek Kondaveeti --- arch/arm/boot/dts/qcom/msm8953-camera.dtsi | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8953-camera.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera.dtsi index 860f7a8b13237..3d4852966e95d 100644 --- a/arch/arm/boot/dts/qcom/msm8953-camera.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-camera.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -232,8 +232,9 @@ cell-index = <0>; compatible = "qcom,vfe40"; reg = <0x1b10000 0x1000>, - <0x1b40000 0x200>; - reg-names = "vfe", "vfe_vbif"; + <0x1b40000 0x200>, + <0x00a4174 0x8>; + reg-names = "vfe", "vfe_vbif", "vfe_fuse"; interrupts = <0 57 0>; interrupt-names = "vfe"; vdd-supply = <&gdsc_vfe>; @@ -282,8 +283,9 @@ cell-index = <1>; compatible = "qcom,vfe40"; reg = <0x1b14000 0x1000>, - <0x1ba0000 0x200>; - reg-names = "vfe", "vfe_vbif"; + <0x1ba0000 0x200>, + <0x00a4174 0x8>; + reg-names = "vfe", "vfe_vbif", "vfe_fuse"; interrupts = <0 29 0>; interrupt-names = "vfe"; vdd-supply = <&gdsc_vfe1>; From 27fdbcb35ed8390491f9834d60ea0b2f3cf2eb93 Mon Sep 17 00:00:00 2001 From: Surajit Podder Date: Mon, 19 Dec 2016 16:14:39 +0530 Subject: [PATCH 0549/1015] msm: vidc: read capability version from efuse register Read platform version through efuse register for clients to know the underlying capability version. Change-Id: Ic0bed929cb81eac79b0481aa395495b81a098dd8 Signed-off-by: Surajit Podder --- .../bindings/media/video/msm-vidc.txt | 2 + .../media/platform/msm/vidc/msm_v4l2_vidc.c | 85 ++++++++++++------- .../platform/msm/vidc/msm_vidc_internal.h | 3 +- .../platform/msm/vidc/msm_vidc_res_parse.c | 41 ++++++++- .../platform/msm/vidc/msm_vidc_resources.h | 7 +- 5 files changed, 104 insertions(+), 34 deletions(-) diff --git a/Documentation/devicetree/bindings/media/video/msm-vidc.txt b/Documentation/devicetree/bindings/media/video/msm-vidc.txt index 1c90f98c29549..378a26e143b1d 100644 --- a/Documentation/devicetree/bindings/media/video/msm-vidc.txt +++ b/Documentation/devicetree/bindings/media/video/msm-vidc.txt @@ -17,6 +17,8 @@ Optional properties: - interrupts : should contain the vidc interrupt. - qcom,platform-version : mask and shift of the platform version bits in efuse register. +- qcom,capability-version : mask and shift of the capability version bits + in efuse register. - qcom,load-freq-tbl : load (in macroblocks/sec) and corresponding vcodec clock required along with codec's config, which is a bitmap that describes what the clock is used for. The bitmaps are as follows: diff --git a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c index 9d6f325d5a367..319df5e37af25 100644 --- a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -416,10 +416,29 @@ static ssize_t store_platform_version(struct device *dev, static DEVICE_ATTR(platform_version, S_IRUGO, show_platform_version, store_platform_version); +static ssize_t show_capability_version(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%d", + vidc_driver->capability_version); +} + +static ssize_t store_capability_version(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + dprintk(VIDC_WARN, "store capability version is not allowed\n"); + return count; +} + +static DEVICE_ATTR(capability_version, S_IRUGO, show_capability_version, + store_capability_version); + static struct attribute *msm_vidc_core_attrs[] = { &dev_attr_pwr_collapse_delay.attr, &dev_attr_thermal_level.attr, &dev_attr_platform_version.attr, + &dev_attr_capability_version.attr, NULL }; @@ -434,11 +453,38 @@ static const struct of_device_id msm_vidc_dt_match[] = { {} }; -static int msm_vidc_probe_vidc_device(struct platform_device *pdev) +static u32 msm_vidc_read_efuse_version(struct platform_device *pdev, + struct version_table *table, const char *fuse_name) { - int rc = 0; void __iomem *base; struct resource *res; + u32 ret = 0; + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, fuse_name); + if (!res) { + dprintk(VIDC_DBG, "Failed to get resource %s\n", fuse_name); + goto exit; + } + base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); + if (!base) { + dprintk(VIDC_ERR, + "failed ioremap: res->start %#x, size %d\n", + (u32)res->start, (u32)resource_size(res)); + goto exit; + } else { + ret = readl_relaxed(base); + ret = (ret & table->version_mask) >> + table->version_shift; + + devm_iounmap(&pdev->dev, base); + } +exit: + return ret; +} + +static int msm_vidc_probe_vidc_device(struct platform_device *pdev) +{ + int rc = 0; struct msm_vidc_core *core; struct device *dev; int nr = BASE_DEVICE_NUMBER; @@ -553,32 +599,13 @@ static int msm_vidc_probe_vidc_device(struct platform_device *pdev) core->debugfs_root = msm_vidc_debugfs_init_core( core, vidc_driver->debugfs_root); - vidc_driver->platform_version = 0; - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "efuse"); - if (!res) { - dprintk(VIDC_DBG, "failed to get efuse resource\n"); - } else { - base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); - if (!base) { - dprintk(VIDC_ERR, - "failed efuse ioremap: res->start %#x, size %d\n", - (u32)res->start, (u32)resource_size(res)); - } else { - u32 efuse = 0; - struct platform_version_table *pf_ver_tbl = - core->resources.pf_ver_tbl; - - efuse = readl_relaxed(base); - vidc_driver->platform_version = - (efuse & pf_ver_tbl->version_mask) >> - pf_ver_tbl->version_shift; - dprintk(VIDC_DBG, - "efuse 0x%x, platform version 0x%x\n", - efuse, vidc_driver->platform_version); - - devm_iounmap(&pdev->dev, base); - } - } + vidc_driver->platform_version = + msm_vidc_read_efuse_version(pdev, + core->resources.pf_ver_tbl, "efuse"); + + vidc_driver->capability_version = + msm_vidc_read_efuse_version( + pdev, core->resources.pf_cap_tbl, "efuse2"); dprintk(VIDC_DBG, "populating sub devices\n"); /* diff --git a/drivers/media/platform/msm/vidc/msm_vidc_internal.h b/drivers/media/platform/msm/vidc/msm_vidc_internal.h index 06106c8f85fbf..22ab79eef75f3 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_internal.h +++ b/drivers/media/platform/msm/vidc/msm_vidc_internal.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -149,6 +149,7 @@ struct msm_vidc_drv { struct dentry *debugfs_root; int thermal_level; u32 platform_version; + u32 capability_version; }; struct msm_video_device { diff --git a/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c b/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c index cddcb6fb045e5..b40eb827fe3c0 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -83,6 +83,12 @@ static inline void msm_vidc_free_platform_version_table( res->pf_ver_tbl = NULL; } +static inline void msm_vidc_free_capability_version_table( + struct msm_vidc_platform_resources *res) +{ + res->pf_cap_tbl = NULL; +} + static inline void msm_vidc_free_freq_table( struct msm_vidc_platform_resources *res) { @@ -162,6 +168,7 @@ void msm_vidc_free_platform_resources( msm_vidc_free_regulator_table(res); msm_vidc_free_freq_table(res); msm_vidc_free_platform_version_table(res); + msm_vidc_free_capability_version_table(res); msm_vidc_free_dcvs_table(res); msm_vidc_free_dcvs_limit(res); msm_vidc_free_cycles_per_mb_table(res); @@ -392,6 +399,33 @@ static int msm_vidc_load_platform_version_table( return 0; } +static int msm_vidc_load_capability_version_table( + struct msm_vidc_platform_resources *res) +{ + int rc = 0; + struct platform_device *pdev = res->pdev; + + if (!of_find_property(pdev->dev.of_node, + "qcom,capability-version", NULL)) { + dprintk(VIDC_DBG, "qcom,capability-version not found\n"); + return 0; + } + + rc = msm_vidc_load_u32_table(pdev, pdev->dev.of_node, + "qcom,capability-version", + sizeof(*res->pf_cap_tbl), + (u32 **)&res->pf_cap_tbl, + NULL); + if (rc) { + dprintk(VIDC_ERR, + "%s: failed to read platform version table\n", + __func__); + return rc; + } + + return 0; +} + static int msm_vidc_load_allowed_clocks_table( struct msm_vidc_platform_resources *res) { @@ -1007,6 +1041,11 @@ int read_platform_resources_from_dt( if (rc) dprintk(VIDC_ERR, "Failed to load pf version table: %d\n", rc); + rc = msm_vidc_load_capability_version_table(res); + if (rc) + dprintk(VIDC_ERR, + "Failed to load pf capability table: %d\n", rc); + rc = msm_vidc_load_freq_table(res); if (rc) { dprintk(VIDC_ERR, "Failed to load freq table: %d\n", rc); diff --git a/drivers/media/platform/msm/vidc/msm_vidc_resources.h b/drivers/media/platform/msm/vidc/msm_vidc_resources.h index 1fc1888e81c62..792091a6f3804 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_resources.h +++ b/drivers/media/platform/msm/vidc/msm_vidc_resources.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -19,7 +19,7 @@ #include #define MAX_BUFFER_TYPES 32 -struct platform_version_table { +struct version_table { u32 version_mask; u32 version_shift; }; @@ -155,7 +155,8 @@ struct msm_vidc_platform_resources { phys_addr_t register_base; uint32_t register_size; uint32_t irq; - struct platform_version_table *pf_ver_tbl; + struct version_table *pf_ver_tbl; + struct version_table *pf_cap_tbl; struct allowed_clock_rates_table *allowed_clks_tbl; u32 allowed_clks_tbl_size; struct clock_freq_table clock_freq_tbl; From ebdc70c8efc13e523fcc42bb0a582f0f0febafdc Mon Sep 17 00:00:00 2001 From: Abhishek Kondaveeti Date: Thu, 15 Dec 2016 18:34:46 +0530 Subject: [PATCH 0550/1015] msm: isp: Add support for VFE resolution limit Read VFE resolution limitation from VFE fuse register and restrict sensor output accordingly. Change-Id: I735016e8fa2f2cb54754301f1c0c66757d8579c5 Signed-off-by: Abhishek Kondaveeti --- .../devicetree/bindings/media/video/msm-vfe.txt | 15 +++++++++------ .../media/platform/msm/camera_v2/isp/msm_isp.h | 1 + .../platform/msm/camera_v2/isp/msm_isp47.c | 17 +++++++++++++++-- .../platform/msm/camera_v2/isp/msm_isp_util.c | 14 ++++++++++++++ include/uapi/media/msmb_isp.h | 10 +++++++--- 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/Documentation/devicetree/bindings/media/video/msm-vfe.txt b/Documentation/devicetree/bindings/media/video/msm-vfe.txt index 39a4bd1601e6d..c41bd4ed86ed4 100644 --- a/Documentation/devicetree/bindings/media/video/msm-vfe.txt +++ b/Documentation/devicetree/bindings/media/video/msm-vfe.txt @@ -23,6 +23,7 @@ Required properties for child node: Only needed for child node. - "vfe" - Required. - "vfe_vbif" - Optional for "vfe32". Required for "vfe40". + - "vfe_fuse" - Optional. - interrupts : should contain the vfe interrupt. - interrupt-names : should specify relevant names to each interrupts property defined. @@ -52,9 +53,10 @@ Example: vfe0: qcom,vfe0@fda10000 { cell-index = <0>; compatible = "qcom,vfe44"; - reg = <0xfda10000 0x1000>; - <0xfda40000 0x200>; - reg-names = "vfe", "vfe_vbif"; + reg = <0xfda10000 0x1000>, + <0xfda40000 0x200>, + <0xa4174 0x8>; + reg-names = "vfe", "vfe_vbif", "vfe_fuse"; interrupts = <0 57 0>; interrupt-names = "vfe"; vdd-supply = <&gdsc_vfe>; @@ -105,9 +107,10 @@ vfe0: qcom,vfe0@fda10000 { vfe1: qcom,vfe1@fda14000 { cell-index = <1>; compatible = "qcom,vfe44"; - reg = <0xfda14000 0x1000>; - <0xfda40000 0x200>; - reg-names = "vfe", "vfe_vbif"; + reg = <0xfda14000 0x1000>, + <0xfda40000 0x200>, + <0xa4174 0x8>; + reg-names = "vfe", "vfe_vbif", "vfe_fuse"; interrupts = <0 58 0>; interrupt-names = "vfe"; vdd-supply = <&gdsc_vfe>; diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h index 3c602d119c5da..da09b8379f59c 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h @@ -759,6 +759,7 @@ struct vfe_device { uint32_t is_split; uint32_t dual_vfe_enable; unsigned long page_fault_addr; + uint32_t vfe_hw_limit; /* Debug variables */ int dump_reg; diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c index 2895781747f0b..2b472185c2bca 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2584,6 +2584,8 @@ int msm_vfe47_enable_regulators(struct vfe_device *vfe_dev, int enable) int msm_vfe47_get_platform_data(struct vfe_device *vfe_dev) { int rc = 0; + void __iomem *vfe_fuse_base; + uint32_t vfe_fuse_base_size; vfe_dev->vfe_base = msm_camera_get_reg_base(vfe_dev->pdev, "vfe", 0); if (!vfe_dev->vfe_base) @@ -2608,7 +2610,18 @@ int msm_vfe47_get_platform_data(struct vfe_device *vfe_dev) rc = -ENOMEM; goto get_res_fail; } - + vfe_dev->vfe_hw_limit = 0; + vfe_fuse_base = msm_camera_get_reg_base(vfe_dev->pdev, + "vfe_fuse", 0); + vfe_fuse_base_size = msm_camera_get_res_size(vfe_dev->pdev, + "vfe_fuse"); + if (vfe_fuse_base) { + if (vfe_fuse_base_size) + vfe_dev->vfe_hw_limit = + (msm_camera_io_r(vfe_fuse_base) >> 7) & 0x3; + msm_camera_put_reg_base(vfe_dev->pdev, vfe_fuse_base, + "vfe_fuse", 0); + } rc = vfe_dev->hw_info->vfe_ops.platform_ops.get_regulators(vfe_dev); if (rc) goto get_regulator_fail; diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index e04a4ae17e030..658953e7a03ec 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -1360,6 +1360,20 @@ static int msm_isp_send_hw_cmd(struct vfe_device *vfe_dev, vfe_dev->vfe_ub_policy = *cfg_data; break; } + case GET_VFE_HW_LIMIT: { + uint32_t *hw_limit = NULL; + + if (cmd_len < sizeof(uint32_t)) { + pr_err("%s:%d failed: invalid cmd len %u exp %zu\n", + __func__, __LINE__, cmd_len, + sizeof(uint32_t)); + return -EINVAL; + } + + hw_limit = (uint32_t *)cfg_data; + *hw_limit = vfe_dev->vfe_hw_limit; + break; + } } return 0; } diff --git a/include/uapi/media/msmb_isp.h b/include/uapi/media/msmb_isp.h index 9fbcacac4930b..364f6544a35ad 100644 --- a/include/uapi/media/msmb_isp.h +++ b/include/uapi/media/msmb_isp.h @@ -23,6 +23,8 @@ #define ISP_STATS_STREAM_BIT 0x80000000 +#define VFE_HW_LIMIT 1 + struct msm_vfe_cfg_cmd_list; enum ISP_START_PIXEL_PATTERN { @@ -461,6 +463,7 @@ enum msm_vfe_reg_cfg_type { VFE_HW_UPDATE_UNLOCK, SET_WM_UB_SIZE, SET_UB_POLICY, + GET_VFE_HW_LIMIT, }; struct msm_vfe_cfg_cmd2 { @@ -884,6 +887,7 @@ enum msm_isp_ioctl_cmd_code { MSM_ISP_FETCH_ENG_MULTI_PASS_START, MSM_ISP_MAP_BUF_START_MULTI_PASS_FE, MSM_ISP_CFG_HW_STATE, + MSM_ISP_AHB_CLK_CFG, }; #define VIDIOC_MSM_VFE_REG_CFG \ @@ -986,9 +990,6 @@ enum msm_isp_ioctl_cmd_code { _IOWR('V', MSM_ISP_UNMAP_BUF, \ struct msm_isp_unmap_buf_req) -#define VIDIOC_MSM_ISP_AHB_CLK_CFG \ - _IOWR('V', BASE_VIDIOC_PRIVATE+25, struct msm_isp_ahb_clk_cfg) - #define VIDIOC_MSM_ISP_FETCH_ENG_MULTI_PASS_START \ _IOWR('V', MSM_ISP_FETCH_ENG_MULTI_PASS_START, \ struct msm_vfe_fetch_eng_multi_pass_start) @@ -1000,4 +1001,7 @@ enum msm_isp_ioctl_cmd_code { #define VIDIOC_MSM_ISP_CFG_HW_STATE \ _IOWR('V', MSM_ISP_CFG_HW_STATE, \ struct msm_vfe_axi_stream_cfg_cmd) + +#define VIDIOC_MSM_ISP_AHB_CLK_CFG \ + _IOWR('V', MSM_ISP_AHB_CLK_CFG, struct msm_isp_ahb_clk_cfg) #endif /* __MSMB_ISP__ */ From 796a7153c26b630f912367a6817f9788cd8c58d3 Mon Sep 17 00:00:00 2001 From: Imran Khan Date: Tue, 10 Jan 2017 17:31:53 +0530 Subject: [PATCH 0551/1015] arm64: Modify support for 32bit app specfic settings Change support for 32bit app specific settings. The change made earlier was not correct for 8996pro devices so correct it to include all variants of 8996. Change-Id: Id6afad04ad316dd7a41743821b7cfd513db227e5 Signed-off-by: Imran Khan --- arch/arm64/include/asm/app_api.h | 3 +- arch/arm64/kernel/app_api.c | 53 +++++++++++++++++++++++--------- arch/arm64/kernel/app_setting.c | 4 +++ kernel/sched/core.c | 2 +- 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/arch/arm64/include/asm/app_api.h b/arch/arm64/include/asm/app_api.h index 7032d636dab60..0e6a469cd6836 100644 --- a/arch/arm64/include/asm/app_api.h +++ b/arch/arm64/include/asm/app_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -44,6 +44,7 @@ extern void switch_32bit_app_setting_bit(struct task_struct *prev, extern void apply_app_setting_bit(struct file *file); extern bool use_app_setting; extern bool use_32bit_app_setting; +extern bool use_32bit_app_setting_pro; #endif #endif diff --git a/arch/arm64/kernel/app_api.c b/arch/arm64/kernel/app_api.c index 1b3732accd4b0..e995bbf3c7b4b 100644 --- a/arch/arm64/kernel/app_api.c +++ b/arch/arm64/kernel/app_api.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -74,13 +74,24 @@ void set_app_setting_bit_for_32bit_apps(void) uint64_t reg; spin_lock_irqsave(&spinlock_32bit_app, flags); - asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); - reg = reg | BIT(18); - reg = reg & ~BIT(2); - reg = reg | 0x3; - isb(); - asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); - isb(); + if (use_32bit_app_setting) { + asm volatile("mrs %0, S3_0_c15_c15_0 " : "=r" (reg)); + reg = reg | BIT(24); + isb(); + asm volatile("msr S3_0_c15_c15_0, %0" : : "r" (reg)); + isb(); + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg | BIT(18) | BIT(2) | BIT(0); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } else if (use_32bit_app_setting_pro) { + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg | BIT(18); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } spin_unlock_irqrestore(&spinlock_32bit_app, flags); } EXPORT_SYMBOL(set_app_setting_bit_for_32bit_apps); @@ -91,12 +102,26 @@ void clear_app_setting_bit_for_32bit_apps(void) uint64_t reg; spin_lock_irqsave(&spinlock_32bit_app, flags); - asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); - reg = reg & ~BIT(18); - reg = reg & ~0x3; - isb(); - asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); - isb(); + if (use_32bit_app_setting) { + asm volatile("mrs %0, S3_0_c15_c15_0 " : "=r" (reg)); + reg = reg & ~BIT(24); + isb(); + asm volatile("msr S3_0_c15_c15_0, %0" : : "r" (reg)); + isb(); + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg & ~BIT(18); + reg = reg & ~BIT(2); + reg = reg & ~BIT(0); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } else if (use_32bit_app_setting_pro) { + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg & ~BIT(18); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } spin_unlock_irqrestore(&spinlock_32bit_app, flags); } EXPORT_SYMBOL(clear_app_setting_bit_for_32bit_apps); diff --git a/arch/arm64/kernel/app_setting.c b/arch/arm64/kernel/app_setting.c index afb7e39dd68a0..f45220c99404d 100644 --- a/arch/arm64/kernel/app_setting.c +++ b/arch/arm64/kernel/app_setting.c @@ -39,6 +39,10 @@ bool use_32bit_app_setting = false; module_param(use_32bit_app_setting, bool, 0644); MODULE_PARM_DESC(use_32bit_app_setting, "control use of 32 bit app specific settings"); +bool use_32bit_app_setting_pro = false; +module_param(use_32bit_app_setting_pro, bool, 0644); +MODULE_PARM_DESC(use_32bit_app_setting_pro, "control use of 32 bit app specific settings"); + static int set_name(const char *str, struct kernel_param *kp) { int len = strlen(str); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 5d5f0496700bd..e7d336760583a 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5644,7 +5644,7 @@ prepare_task_switch(struct rq *rq, struct task_struct *prev, if (use_app_setting) switch_app_setting_bit(prev, next); - if (use_32bit_app_setting) + if (use_32bit_app_setting || use_32bit_app_setting_pro) switch_32bit_app_setting_bit(prev, next); #endif } From 26fb3ff301433dd0e5b3360b7fc7ad9261e1d5ca Mon Sep 17 00:00:00 2001 From: Mohammed Khajapasha Date: Wed, 11 Jan 2017 17:05:51 +0530 Subject: [PATCH 0552/1015] ARM: dts: msm: Add use_32bit_app_setting in bootargs for msm8996 Enable 32 bit app settings, using bootargs, for msm8996 and msm8996pro to set app specific settings. Change-Id: I9537e8022fb550e94fcba21709572372d024a701 Signed-off-by: Mohammed Khajapasha --- arch/arm/boot/dts/qcom/msm8996.dtsi | 4 ++-- arch/arm/boot/dts/qcom/msm8996pro.dtsi | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8996.dtsi b/arch/arm/boot/dts/qcom/msm8996.dtsi index b342288737848..cb6ebd12297b0 100644 --- a/arch/arm/boot/dts/qcom/msm8996.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -21,7 +21,7 @@ interrupt-parent = <&intc>; chosen { - bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1"; + bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1 app_setting.use_32bit_app_setting=1"; }; aliases { diff --git a/arch/arm/boot/dts/qcom/msm8996pro.dtsi b/arch/arm/boot/dts/qcom/msm8996pro.dtsi index 758f40e1d6a51..d4b3ae3a0a58b 100644 --- a/arch/arm/boot/dts/qcom/msm8996pro.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996pro.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -20,6 +20,10 @@ / { model = "Qualcomm Technologies, Inc. MSM 8996pro"; qcom,msm-id = <305 0x10000>; + + chosen { + bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1 app_setting.use_32bit_app_setting_pro=1"; + }; }; &apc_apm { From a6c2bbb9e058589630a6ee14e62e91cac5a9508c Mon Sep 17 00:00:00 2001 From: Lingutla Chandrasekhar Date: Tue, 17 Jan 2017 14:10:27 +0530 Subject: [PATCH 0553/1015] defconfig: arm64: Enable app specific setting on MSM8996 Enable support for app specific setting on MSM8996. This is required for providing an interface so that app specific settings can be applied / cleared. Change-Id: I2dc533aae99b3898db2d61f99c4c99877eb575d0 Signed-off-by: Sanrio Alvares Signed-off-by: Lingutla Chandrasekhar --- arch/arm64/configs/msm-auto-perf_defconfig | 1 + arch/arm64/configs/msm-auto_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/arm64/configs/msm-auto-perf_defconfig b/arch/arm64/configs/msm-auto-perf_defconfig index 9305988308c9e..7a6c5cd59984d 100644 --- a/arch/arm64/configs/msm-auto-perf_defconfig +++ b/arch/arm64/configs/msm-auto-perf_defconfig @@ -40,6 +40,7 @@ CONFIG_ARCH_MSM=y CONFIG_ARCH_MSM8996=y CONFIG_PCI_MSM=y CONFIG_ENABLE_FP_SIMD_SETTINGS=y +CONFIG_MSM_APP_SETTINGS=y CONFIG_SMP=y CONFIG_SCHED_MC=y CONFIG_PREEMPT=y diff --git a/arch/arm64/configs/msm-auto_defconfig b/arch/arm64/configs/msm-auto_defconfig index 52bef4d27c3b1..57dcb9b175601 100644 --- a/arch/arm64/configs/msm-auto_defconfig +++ b/arch/arm64/configs/msm-auto_defconfig @@ -39,6 +39,7 @@ CONFIG_ARCH_MSM8996=y CONFIG_ARCH_MSMCOBALT=y CONFIG_PCI_MSM=y CONFIG_ENABLE_FP_SIMD_SETTINGS=y +CONFIG_MSM_APP_SETTINGS=y CONFIG_SMP=y CONFIG_SCHED_MC=y CONFIG_PREEMPT=y From 32ed501de1fdf662ebee96a7a55ee5946779b40f Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Mon, 23 Jan 2017 15:43:40 +0530 Subject: [PATCH 0554/1015] msm: qpnp-haptic: Manage the state of PON regulator Control the PON regulator (required to force MBG_ON) based on the current state of haptic and maintain the regulator state to avoid frequent enable/disable. CRs-Fixed: 1111145 Change-Id: Ic7238a7828d1694192e890433d4247b25b5b15e1 Signed-off-by: Anirudh Ghayal --- drivers/platform/msm/qpnp-haptic.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/drivers/platform/msm/qpnp-haptic.c b/drivers/platform/msm/qpnp-haptic.c index cae90457bb923..618b96ec715c8 100644 --- a/drivers/platform/msm/qpnp-haptic.c +++ b/drivers/platform/msm/qpnp-haptic.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -350,6 +350,7 @@ struct qpnp_hap { u8 lra_res_cal_period; u8 sc_duration; u8 ext_pwm_dtest_line; + bool vcc_pon_enabled; bool state; bool use_play_irq; bool use_sc_irq; @@ -1736,13 +1737,15 @@ static void qpnp_hap_worker(struct work_struct *work) struct qpnp_hap *hap = container_of(work, struct qpnp_hap, work); u8 val = 0x00; - int rc, reg_en; + int rc; - if (hap->vcc_pon) { - reg_en = regulator_enable(hap->vcc_pon); - if (reg_en) - pr_err("%s: could not enable vcc_pon regulator\n", - __func__); + if (hap->vcc_pon && hap->state && !hap->vcc_pon_enabled) { + rc = regulator_enable(hap->vcc_pon); + if (rc < 0) + pr_err("%s: could not enable vcc_pon regulator rc=%d\n", + __func__, rc); + else + hap->vcc_pon_enabled = true; } /* Disable haptics module if the duration of short circuit @@ -1757,11 +1760,13 @@ static void qpnp_hap_worker(struct work_struct *work) qpnp_hap_set(hap, hap->state); } - if (hap->vcc_pon && !reg_en) { + if (hap->vcc_pon && !hap->state && hap->vcc_pon_enabled) { rc = regulator_disable(hap->vcc_pon); if (rc) - pr_err("%s: could not disable vcc_pon regulator\n", - __func__); + pr_err("%s: could not disable vcc_pon regulator rc=%d\n", + __func__, rc); + else + hap->vcc_pon_enabled = false; } } From 691ea3cc5a5d08663999e61487a74fc6be4bacf1 Mon Sep 17 00:00:00 2001 From: Taniya Das Date: Fri, 9 Dec 2016 11:18:12 +0530 Subject: [PATCH 0555/1015] ARM: dts: msm: Update frequency to 1804.8MHz for MSM8953 Add new speed bin-6 and update the frequencies. While at it, update the CPR configuration for speed-bin 6. Change-Id: I2b5a4393024fec2ca4a0db171398494ee87b0fa3 Signed-off-by: Taniya Das Signed-off-by: Anirudh Ghayal --- arch/arm/boot/dts/qcom/msm8953-regulator.dtsi | 88 +++++++++++++++---- arch/arm/boot/dts/qcom/msm8953.dtsi | 30 +++++-- 2 files changed, 94 insertions(+), 24 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi index c4f606e896597..30c6d6791677d 100644 --- a/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi @@ -400,7 +400,7 @@ qcom,cpr-fuse-combos = <64>; qcom,cpr-speed-bins = <8>; qcom,cpr-speed-bin-corners = - <9 0 7 0 0 0 0 9>; + <9 0 7 0 0 0 7 9>; qcom,cpr-corners = /* Speed bin 0 */ <9 9 9 9 9 9 9 9>, @@ -411,12 +411,14 @@ /* Speed bin 2 */ <7 7 7 7 7 7 7 7>, - /* Speed bin 3..6 */ - <0 0 0 0 0 0 0 0>, + /* Speed bin 3..5 */ <0 0 0 0 0 0 0 0>, <0 0 0 0 0 0 0 0>, <0 0 0 0 0 0 0 0>, + /* Speed bin 6 */ + <7 7 7 7 7 7 7 7>, + /* Speed bin 7 */ <9 9 9 9 9 9 9 9>; @@ -430,12 +432,14 @@ /* Speed bin 2 */ <1 2 4 7>, - /* Speed bin 3..6 */ - <0 0 0 0>, + /* Speed bin 3..5 */ <0 0 0 0>, <0 0 0 0>, <0 0 0 0>, + /* Speed bin 6 */ + <1 2 4 7>, + /* Speed bin 7 */ <1 2 4 9>; @@ -448,6 +452,10 @@ <715000 790000 860000 865000 920000 990000 1065000>, + /* Speed bin 6 */ + <715000 790000 860000 865000 920000 + 990000 1065000>, + /* Speed bin 7 */ <715000 790000 860000 865000 920000 990000 1065000 1065000 1065000>; @@ -461,6 +469,10 @@ <500000 500000 500000 500000 500000 500000 500000>, + /* Speed bin 6 */ + <500000 500000 500000 500000 500000 + 500000 500000>, + /* Speed bin 7 */ <500000 500000 500000 500000 500000 500000 500000 500000 500000>; @@ -502,6 +514,24 @@ <50000 50000 50000 50000 50000 50000 50000>, + /* Speed bin 6; CPR rev 0..7 */ + < 0 0 0 0 0 + 0 0>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + /* Speed bin 7; CPR rev 0..7 */ < 0 0 0 0 0 0 0 0 0>, @@ -533,6 +563,12 @@ < 0 0 30000 0 0 0 0>, + /* Speed bin 6; misc fuse 0..1 */ + < 0 0 0 0 0 + 0 0>, + < 0 0 30000 0 0 + 0 0>, + /* Speed bin 7; misc fuse 0..1 */ < 0 0 0 0 0 0 0 0 0>, @@ -546,23 +582,31 @@ /* Speed bin 2 */ <1 1 2 2 2 2 2>, + /* Speed bin 6 */ + <1 1 2 2 2 2 2>, + /* Speed bin 7 */ <1 1 2 2 2 2 2 2 2>; qcom,corner-frequencies = /* Speed bin 0 */ <652800000 1036800000 1401600000 - 1689600000 1843200000 1958400000 + 1689600000 1804800000 1958400000 2016000000 2150400000 2208000000>, /* Speed bin 2 */ <652800000 1036800000 1401600000 - 1689600000 1843200000 1958400000 + 1689600000 1804800000 1958400000 + 2016000000>, + + /* Speed bin 6 */ + <652800000 1036800000 1401600000 + 1689600000 1804800000 1958400000 2016000000>, /* Speed bin 7 */ <652800000 1036800000 1401600000 - 1689600000 1843200000 1958400000 + 1689600000 1804800000 1958400000 2016000000 2150400000 2208000000>; qcom,cpr-open-loop-voltage-fuse-adjustment = @@ -628,9 +672,9 @@ /* Speed bin 6; CPR rev 0..7 */ < 0 0 0 0>, - < 0 0 0 0>, - < 0 0 0 0>, - < 0 0 0 0>, + < 25000 0 5000 40000>, + < 25000 0 5000 40000>, + < 25000 0 5000 40000>, < 0 0 0 0>, < 0 0 0 0>, < 0 0 0 0>, @@ -709,9 +753,9 @@ /* Speed bin 6; CPR rev 0..7 */ < 0 0 0 0>, - < 0 0 0 0>, - < 0 0 0 0>, - < 0 0 0 0>, + < 10000 (-15000) 0 25000>, + < 10000 (-15000) 0 25000>, + <(-5000) (-30000) (-15000) 10000>, < 0 0 0 0>, < 0 0 0 0>, < 0 0 0 0>, @@ -762,6 +806,16 @@ <1 1 1 1 0 0 0>, <1 1 1 1 0 0 0>, + /* Speed bin 6; CPR rev 0..7 */ + <0 0 0 0 0 0 0>, + <0 0 0 0 0 0 0>, + <0 0 0 0 0 0 0>, + <1 1 1 1 0 0 0>, + <1 1 1 1 0 0 0>, + <1 1 1 1 0 0 0>, + <1 1 1 1 0 0 0>, + <1 1 1 1 0 0 0>, + /* Speed bin 7; CPR rev 0..7 */ <0 0 0 0 0 0 0 0 0>, <0 0 0 0 0 0 0 0 0>, @@ -797,12 +851,14 @@ /* Speed bin 2 */ <0 0 0 1 1 1 1 1>, - /* Speed bin 3..6 */ - <0 0 0 0 0 0 0 0>, + /* Speed bin 3..5 */ <0 0 0 0 0 0 0 0>, <0 0 0 0 0 0 0 0>, <0 0 0 0 0 0 0 0>, + /* Speed bin 6 */ + <0 0 0 1 1 1 1 1>, + /* Speed bin 7 */ <0 0 0 1 1 1 1 1>; }; diff --git a/arch/arm/boot/dts/qcom/msm8953.dtsi b/arch/arm/boot/dts/qcom/msm8953.dtsi index d5596f34b23eb..f0fec6afd3afd 100644 --- a/arch/arm/boot/dts/qcom/msm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953.dtsi @@ -871,7 +871,7 @@ < 1036800000 2>, < 1401600000 3>, < 1689600000 4>, - < 1843200000 5>, + < 1804800000 5>, < 1958400000 6>, < 2016000000 7>; qcom,speed0-bin-v0-cci = @@ -880,7 +880,7 @@ < 414720000 2>, < 560640000 3>, < 675840000 4>, - < 737280000 5>, + < 721920000 5>, < 783360000 6>, < 806400000 7>; qcom,speed2-bin-v0-cl = @@ -889,7 +889,7 @@ < 1036800000 2>, < 1401600000 3>, < 1689600000 4>, - < 1843200000 5>, + < 1804800000 5>, < 1958400000 6>, < 2016000000 7>; qcom,speed2-bin-v0-cci = @@ -898,7 +898,7 @@ < 414720000 2>, < 560640000 3>, < 675840000 4>, - < 737280000 5>, + < 721920000 5>, < 783360000 6>, < 806400000 7>; qcom,speed7-bin-v0-cl = @@ -907,7 +907,7 @@ < 1036800000 2>, < 1401600000 3>, < 1689600000 4>, - < 1843200000 5>, + < 1804800000 5>, < 1958400000 6>, < 2016000000 7>, < 2150400000 8>, @@ -918,11 +918,25 @@ < 414720000 2>, < 560640000 3>, < 675840000 4>, - < 737280000 5>, + < 721920000 5>, < 783360000 6>, < 806400000 7>, < 860160000 8>, < 883200000 9>; + qcom,speed6-bin-v0-cl = + < 0 0>, + < 652800000 1>, + < 1036800000 2>, + < 1401600000 3>, + < 1689600000 4>, + < 1804800000 5>; + qcom,speed6-bin-v0-cci = + < 0 0>, + < 261120000 1>, + < 414720000 2>, + < 560640000 3>, + < 675840000 4>, + < 721920000 5>; #clock-cells = <1>; }; @@ -946,7 +960,7 @@ < 1036800 >, < 1401600 >, < 1689600 >, - < 1843200 >, + < 1804800 >, < 1958400 >, < 2016000 >, < 2150400 >, @@ -1008,7 +1022,7 @@ < 1036800 3221>, < 1401600 5859>, < 1689600 6445>, - < 1843200 7104>, + < 1804800 7104>, < 1958400 7104>, < 2208000 7104>; }; From 6c78f468e4a6316c989cfa033b1f52d79129f70c Mon Sep 17 00:00:00 2001 From: Arumuga Durai A Date: Thu, 12 Jan 2017 16:07:48 +0530 Subject: [PATCH 0556/1015] USB: gadget: qdss: Fix null pointer dereference Unless bam_to_bam_ipa transport is used ipa_data_wq won't allocate. During unbind of qdss function checks the completion of ipa_data_wq leads to NULL pointer dereference. Fix this by add proper check. CRs-Fixed: 1110001 Change-Id: Iaf11a2b7575fa31f984b572d6bfffa44a38d9f8d Signed-off-by: Arumuga Durai A --- drivers/usb/gadget/function/f_qdss.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/usb/gadget/function/f_qdss.c b/drivers/usb/gadget/function/f_qdss.c index 476553322fcac..f557c16c6ea16 100644 --- a/drivers/usb/gadget/function/f_qdss.c +++ b/drivers/usb/gadget/function/f_qdss.c @@ -1,7 +1,7 @@ /* * f_qdss.c -- QDSS function Driver * - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -482,13 +482,14 @@ static void qdss_unbind(struct usb_configuration *c, struct usb_function *f) { struct f_qdss *qdss = func_to_qdss(f); struct usb_gadget *gadget = c->cdev->gadget; + enum transport_type dxport = qdss_ports[qdss->port_num].data_xport; int i; pr_debug("qdss_unbind\n"); flush_workqueue(qdss->wq); - ipa_data_flush_workqueue(); - + if (dxport == USB_GADGET_XPORT_BAM2BAM_IPA) + ipa_data_flush_workqueue(); c->cdev->gadget->bam2bam_func_enabled = false; clear_eps(f); @@ -1043,7 +1044,9 @@ static int qdss_bind_config(struct usb_configuration *c, unsigned char portno) kfree(name); kfree(qdss); } - c->cdev->gadget->bam2bam_func_enabled = true; + if (dxport == USB_GADGET_XPORT_BAM2BAM_IPA || + dxport == USB_GADGET_XPORT_BAM2BAM) + c->cdev->gadget->bam2bam_func_enabled = true; return status; } From d4800e69f75e376bb8156b3f689ec5713e7f0d06 Mon Sep 17 00:00:00 2001 From: Sharad Sangle Date: Mon, 19 Dec 2016 17:00:25 +0530 Subject: [PATCH 0557/1015] ASoC: msm: qdsp6v2: DAP: Add check to validate param length To avoid buffer overflow, validate input length used to set Dolby params. Change-Id: I3f9d6040f118f63b60c20c83b0d8cae638f4a530 CRs-Fixed: 1095947 Signed-off-by: Sharad Sangle --- sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c b/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c index 009e3348b0eec..8fc1825b903df 100644 --- a/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c +++ b/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c @@ -683,7 +683,7 @@ int msm_dolby_dap_param_to_set_control_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0, port_id, copp_idx; - uint32_t idx, j; + uint32_t idx, j, current_offset; uint32_t device = ucontrol->value.integer.value[0]; uint32_t param_id = ucontrol->value.integer.value[1]; uint32_t offset = ucontrol->value.integer.value[2]; @@ -760,6 +760,19 @@ int msm_dolby_dap_param_to_set_control_put(struct snd_kcontrol *kcontrol, default: { /* cache the parameters */ dolby_dap_params_modified[idx] += 1; + current_offset = dolby_dap_params_offset[idx] + offset; + if (current_offset >= TOTAL_LENGTH_DOLBY_PARAM) { + pr_err("%s: invalid offset %d at idx %d\n", + __func__, offset, idx); + return -EINVAL; + } + if ((0 == length) || (current_offset + length - 1 + < current_offset) || (current_offset + length + > TOTAL_LENGTH_DOLBY_PARAM)) { + pr_err("%s: invalid length %d at idx %d\n", + __func__, length, idx); + return -EINVAL; + } dolby_dap_params_length[idx] = length; pr_debug("%s: param recvd deviceId=0x%x paramId=0x%x offset=%d length=%d\n", __func__, device, param_id, offset, length); From 965f76bad7f90dba5e3efbcd073e4793dbd6385b Mon Sep 17 00:00:00 2001 From: Karthik Reddy Katta Date: Tue, 3 Jan 2017 11:09:05 +0530 Subject: [PATCH 0558/1015] drivers: soc: qcom: Add overflow check in ADM driver Add overflow check for param length to prevent heap overflow while allocating memory for ADM parameters. CRs-Fixed: 1103334 Change-Id: I1163aeaabbc84dba4cd0739a35ecbdee18b42717 Signed-off-by: Karthik Reddy Katta --- sound/soc/msm/qdsp6v2/q6adm.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/q6adm.c b/sound/soc/msm/qdsp6v2/q6adm.c index 418aad964b35a..34d509304ae49 100644 --- a/sound/soc/msm/qdsp6v2/q6adm.c +++ b/sound/soc/msm/qdsp6v2/q6adm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -967,9 +967,10 @@ int adm_get_params_v2(int port_id, int copp_idx, uint32_t module_id, char *params, uint32_t client_id) { struct adm_cmd_get_pp_params_v5 *adm_params = NULL; - int sz, rc = 0, i = 0; + int rc = 0, i = 0; int port_idx, idx; int *params_data = (int *)params; + uint64_t sz = 0; port_id = afe_convert_virtual_to_portid(port_id); port_idx = adm_validate_and_get_port_index(port_id); @@ -978,7 +979,16 @@ int adm_get_params_v2(int port_id, int copp_idx, uint32_t module_id, return -EINVAL; } - sz = sizeof(struct adm_cmd_get_pp_params_v5) + params_length; + sz = (uint64_t)sizeof(struct adm_cmd_get_pp_params_v5) + + (uint64_t)params_length; + /* + * Check if the value of "sz" (which is ultimately assigned to + * "hdr.pkt_size") crosses U16_MAX. + */ + if (sz > U16_MAX) { + pr_err("%s: Invalid params_length\n", __func__); + return -EINVAL; + } adm_params = kzalloc(sz, GFP_KERNEL); if (!adm_params) { pr_err("%s: adm params memory alloc failed", __func__); From ede4bb53da7e3a2e875863edde22c76c28bb16e5 Mon Sep 17 00:00:00 2001 From: Andrey Markovytch Date: Wed, 28 Dec 2016 19:34:55 +0200 Subject: [PATCH 0559/1015] security: switched to stackable model for PFT/PFK module Moved hooks from SELINUX framework to general SECURITY framework Change-Id: I37e701b4925c4993f724c32b258c5088f4dcbe4d Signed-off-by: Andrey Markovytch --- include/linux/security.h | 7 ---- security/pfe/Kconfig | 1 + security/pfe/pfk.c | 56 ++----------------------------- security/pfe/pft.c | 7 ++-- security/security.c | 15 +++------ security/selinux/hooks.c | 71 +++------------------------------------- 6 files changed, 17 insertions(+), 140 deletions(-) diff --git a/include/linux/security.h b/include/linux/security.h index c0855c22e3105..2ef9ed4e6317f 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -1572,7 +1572,6 @@ struct security_operations { struct fown_struct *fown, int sig); int (*file_receive) (struct file *file); int (*file_open) (struct file *file, const struct cred *cred); - int (*file_close)(struct file *file); bool (*allow_merge_bio)(struct bio *bio1, struct bio *bio2); int (*task_create) (unsigned long clone_flags); @@ -1855,7 +1854,6 @@ int security_file_send_sigiotask(struct task_struct *tsk, struct fown_struct *fown, int sig); int security_file_receive(struct file *file); int security_file_open(struct file *file, const struct cred *cred); -int security_file_close(struct file *file); bool security_allow_merge_bio(struct bio *bio1, struct bio *bio2); int security_task_create(unsigned long clone_flags); @@ -2381,11 +2379,6 @@ static inline int security_file_open(struct file *file, return 0; } -static inline int security_file_close(struct file *file) -{ - return 0; -} - static inline bool security_allow_merge_bio(struct bio *bio1, struct bio *bio2) { return true; diff --git a/security/pfe/Kconfig b/security/pfe/Kconfig index ac248c950448b..64c4c22f203c9 100644 --- a/security/pfe/Kconfig +++ b/security/pfe/Kconfig @@ -16,6 +16,7 @@ config PFK bool "Per-File-Key driver" depends on SECURITY depends on ECRYPT_FS + depends on SECURITY_SELINUX default n help This driver is used for storing eCryptfs information diff --git a/security/pfe/pfk.c b/security/pfe/pfk.c index 7af2c7d1381fc..e6db86f2f2dc2 100644 --- a/security/pfe/pfk.c +++ b/security/pfe/pfk.c @@ -88,61 +88,11 @@ static char *inode_to_filename(struct inode *inode) return filename; } -static int pfk_inode_alloc_security(struct inode *inode) -{ - struct inode_security_struct *i_sec = NULL; - - if (inode == NULL) - return -EINVAL; - - i_sec = kzalloc(sizeof(*i_sec), GFP_KERNEL); - - if (i_sec == NULL) - return -ENOMEM; - - inode->i_security = i_sec; - - return 0; -} - -static void pfk_inode_free_security(struct inode *inode) -{ - if (inode == NULL) - return; - - kzfree(inode->i_security); -} - -static struct security_operations pfk_security_ops = { - .name = "pfk", - - .inode_alloc_security = pfk_inode_alloc_security, - .inode_free_security = pfk_inode_free_security, - - .allow_merge_bio = pfk_allow_merge_bio, -}; - static int __init pfk_lsm_init(void) { - int ret; - - /* Check if PFK is the chosen lsm via security_module_enable() */ - if (security_module_enable(&pfk_security_ops)) { - /* replace null callbacks with empty callbacks */ - security_fixup_ops(&pfk_security_ops); - ret = register_security(&pfk_security_ops); - if (ret != 0) { - pr_err("pfk lsm registeration failed, ret=%d.\n", ret); - return ret; - } - pr_debug("pfk is the chosen lsm, registered successfully !\n"); - } else { - pr_debug("pfk is not the chosen lsm.\n"); - if (!selinux_is_enabled()) { - pr_err("se linux is not enabled.\n"); - return -ENODEV; - } - + if (!selinux_is_enabled()) { + pr_err("se linux is not enabled.\n"); + return -ENODEV; } return 0; diff --git a/security/pfe/pft.c b/security/pfe/pft.c index 8b4f6631cd61a..d9e6b89a07c03 100644 --- a/security/pfe/pft.c +++ b/security/pfe/pft.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -216,12 +216,13 @@ static int __init pft_lsm_init(struct pft_device *dev) ret = register_security(&pft_security_ops); if (ret) { pr_err("pft lsm registeration failed, ret=%d.\n", ret); - return 0; + return ret; } dev->is_chosen_lsm = true; pr_debug("pft is the chosen lsm, registered successfully !\n"); } else { - pr_debug("pft is not the chosen lsm.\n"); + pr_err("pft is not the chosen lsm.\n"); + return -ENODEV; } return 0; diff --git a/security/security.c b/security/security.c index 6db0967852d6f..0ef8a38e2673e 100644 --- a/security/security.c +++ b/security/security.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #define MAX_LSM_EVM_XATTR 2 @@ -832,20 +833,14 @@ int security_file_open(struct file *file, const struct cred *cred) return fsnotify_perm(file, MAY_OPEN); } -int security_file_close(struct file *file) -{ - if (security_ops->file_close) - return security_ops->file_close(file); - - return 0; -} - bool security_allow_merge_bio(struct bio *bio1, struct bio *bio2) { + bool ret = pfk_allow_merge_bio(bio1, bio2); + if (security_ops->allow_merge_bio) - return security_ops->allow_merge_bio(bio1, bio2); + ret = ret && security_ops->allow_merge_bio(bio1, bio2); - return true; + return ret; } int security_task_create(unsigned long clone_flags) diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index d2ae32d3fe0d2..a6fc6c0024934 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -84,7 +84,6 @@ #include #include #include -#include #include #include "avc.h" @@ -1735,15 +1734,9 @@ static int may_create(struct inode *dir, if (rc) return rc; - rc = avc_has_perm(newsid, sbsec->sid, - SECCLASS_FILESYSTEM, - FILESYSTEM__ASSOCIATE, &ad); - if (rc) - return rc; - - rc = pft_inode_mknod(dir, dentry, 0, 0); - - return rc; + return avc_has_perm(newsid, sbsec->sid, + SECCLASS_FILESYSTEM, + FILESYSTEM__ASSOCIATE, &ad); } /* Check whether a task can create a key. */ @@ -1799,14 +1792,7 @@ static int may_link(struct inode *dir, return 0; } - rc = avc_has_perm(sid, isec->sid, isec->sclass, av, &ad); - if (rc) - return rc; - - if (kind == MAY_UNLINK) - rc = pft_inode_unlink(dir, dentry); - - return rc; + return avc_has_perm(sid, isec->sid, isec->sclass, av, &ad); } static inline int may_rename(struct inode *old_dir, @@ -2831,24 +2817,9 @@ static int selinux_inode_init_security(struct inode *inode, struct inode *dir, static int selinux_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode) { - int ret; - - ret = pft_inode_create(dir, dentry, mode); - if (ret < 0) - return ret; return may_create(dir, dentry, SECCLASS_FILE); } -static int selinux_inode_post_create(struct inode *dir, struct dentry *dentry, - umode_t mode) -{ - int ret; - - ret = pft_inode_post_create(dir, dentry, mode); - - return ret; -} - static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry) { return may_link(dir, old_dentry, MAY_LINK); @@ -2882,12 +2853,6 @@ static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry, struct inode *new_inode, struct dentry *new_dentry) { - int rc; - - rc = pft_inode_rename(old_inode, old_dentry, new_inode, new_dentry); - if (rc) - return rc; - return may_rename(old_inode, old_dentry, new_inode, new_dentry); } @@ -3006,9 +2971,6 @@ static int selinux_inode_setotherxattr(struct dentry *dentry, const char *name) { const struct cred *cred = current_cred(); - if (pft_inode_set_xattr(dentry, name, NULL, 0, 0) < 0) - return -EACCES; - if (!strncmp(name, XATTR_SECURITY_PREFIX, sizeof XATTR_SECURITY_PREFIX - 1)) { if (!strcmp(name, XATTR_NAME_CAPS)) { @@ -3256,16 +3218,11 @@ static int selinux_file_permission(struct file *file, int mask) struct file_security_struct *fsec = file->f_security; struct inode_security_struct *isec = inode->i_security; u32 sid = current_sid(); - int ret; if (!mask) /* No permission to check. Existence test. */ return 0; - ret = pft_file_permission(file, mask); - if (ret < 0) - return ret; - if (sid == fsec->sid && fsec->isid == isec->sid && fsec->pseqno == avc_policy_seqno()) /* No change since file_open check. */ @@ -3560,11 +3517,6 @@ static int selinux_file_open(struct file *file, const struct cred *cred) { struct file_security_struct *fsec; struct inode_security_struct *isec; - int ret; - - ret = pft_file_open(file, cred); - if (ret < 0) - return ret; fsec = file->f_security; isec = file_inode(file)->i_security; @@ -3588,18 +3540,6 @@ static int selinux_file_open(struct file *file, const struct cred *cred) return file_path_has_perm(cred, file, open_file_to_av(file)); } -static int selinux_file_close(struct file *file) -{ - return pft_file_close(file); -} - - -static bool selinux_allow_merge_bio(struct bio *bio1, struct bio *bio2) -{ - return pft_allow_merge_bio(bio1, bio2) && - pfk_allow_merge_bio(bio1, bio2); -} - /* task security operations */ static int selinux_task_create(unsigned long clone_flags) @@ -6040,7 +5980,6 @@ static struct security_operations selinux_ops = { .inode_free_security = selinux_inode_free_security, .inode_init_security = selinux_inode_init_security, .inode_create = selinux_inode_create, - .inode_post_create = selinux_inode_post_create, .inode_link = selinux_inode_link, .inode_unlink = selinux_inode_unlink, .inode_symlink = selinux_inode_symlink, @@ -6077,8 +6016,6 @@ static struct security_operations selinux_ops = { .file_receive = selinux_file_receive, .file_open = selinux_file_open, - .file_close = selinux_file_close, - .allow_merge_bio = selinux_allow_merge_bio, .task_create = selinux_task_create, .cred_alloc_blank = selinux_cred_alloc_blank, From 36719de3d012902a23a6ea6a00bb0525d9f9d2d3 Mon Sep 17 00:00:00 2001 From: Xiaoyu Ye Date: Mon, 19 Dec 2016 18:38:53 -0800 Subject: [PATCH 0560/1015] ASoC: msm: qdsp6v2: Add range checking in msm_dai_q6_set_channel_map Range checking is added to prevent buffer overflow that due to inputs can be set by user space. CRs-Fixed: 1098363 Change-Id: I057261291806240ee6d7b8106a5e83a7665e013d Signed-off-by: Xiaoyu Ye --- sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c index 76bce5fff50d6..f5c265e139792 100644 --- a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1714,6 +1714,11 @@ static int msm_dai_q6_set_channel_map(struct snd_soc_dai *dai, pr_err("%s: rx slot not found\n", __func__); return -EINVAL; } + if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { + pr_err("%s: invalid rx num %d\n", __func__, rx_num); + return -EINVAL; + } + for (i = 0; i < rx_num; i++) { dai_data->port_config.slim_sch.shared_ch_mapping[i] = rx_slot[i]; @@ -1744,6 +1749,11 @@ static int msm_dai_q6_set_channel_map(struct snd_soc_dai *dai, pr_err("%s: tx slot not found\n", __func__); return -EINVAL; } + if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { + pr_err("%s: invalid tx num %d\n", __func__, tx_num); + return -EINVAL; + } + for (i = 0; i < tx_num; i++) { dai_data->port_config.slim_sch.shared_ch_mapping[i] = tx_slot[i]; From 88e85317ad4f8b8334e032e28e8a1e3dffb54ef6 Mon Sep 17 00:00:00 2001 From: Subash Abhinov Kasiviswanathan Date: Tue, 15 Nov 2016 18:12:34 -0700 Subject: [PATCH 0561/1015] xt_qtaguid: Fix kmemleak error in TIME_WAIT sockets This reverts commit 4335ab135ed54a4 ("xt_qtaguid: check xt_sock socket before releasing"). This commit causes kmemleak errors with the following trace - unreferenced object (size 184): comm "softirq", pid 0, jiffies 14724 (age 4906.640s) hex dump (first 32 bytes): 3d 6e f5 25 0a be 6e 8a c9 d8 bb c2 00 50 72 cb =n.%..n......Pr. 02 00 06 80 00 00 00 00 00 00 00 00 58 8a 42 c5 ............X.B. backtrace: inet_twsk_alloc+0x40/0x1e8 tcp_time_wait+0x48/0x1fc tcp_rcv_state_process+0xa74/0xc10 tcp_v4_do_rcv+0x2c8/0x338 tcp_v4_rcv+0x4f8/0x8fc ip_local_deliver_finish+0x130/0x2c0 ip_rcv_finish+0x2d0/0x348 __netif_receive_skb_core+0x710/0x7c4 netif_receive_skb_internal+0x60/0xac __rmnet_deliver_skb+0x1ec/0x3f8 __netif_receive_skb_core+0x588/0x7c4 process_backlog+0x90/0x14c net_rx_action+0xb4/0x234 __do_softirq+0x14c/0x370 irq_exit+0x84/0xe0 handle_IPI+0x120/0x354 This is because xt_qtaguid holds on to references incorrectly and never releases the slab cache even after the time wait socket timer expiry. inet_twsk_alloc TCP created tw atomic_read(&tw->tw_refcnt) 0, called from tcp_time_wait+0x48/0x1fc inet_twsk_alloc tw tw->tw_daddr 61.110.245.37 tw->tw_rcv_saddr 10.190.110.138 tw->tw_sport 29387 tw->tw_dport 20480 tcp_time_wait tw atomic_read(&tw->tw_refcnt) 3, called from tcp_rcv_state_process+0xa74/0xc10 tcp_time_wait inet_twsk_schedule tw atomic_read (&tw->tw_refcnt) 4, called from tcp_rcv_state_process+0xa74/0xc10 inet_twsk_put tw atomic_read(&tw->tw_refcnt) 4, called from tcp_time_wait+0x1b0/0x1fc xt_socket: xt_socket_get4_sk tw atomic_read(&tw->tw_refcnt) 4, called from qtaguid_mt+0x568/0x8bc xt_socket: xt_socket_get4_sk tw if (sk) atomic_read (&tw->tw_refcnt) 5, called from qtaguid_mt+0x568/0x8bc xt_socket: xt_socket_get4_sk tw atomic_read(&tw->tw_refcnt) 5, called from qtaguid_mt+0x568/0x8bc xt_socket: xt_socket_get4_sk tw if (sk) atomic_read (&tw->tw_refcnt) 6, called from qtaguid_mt+0x568/0x8bc xt_socket: xt_socket_get4_sk tw atomic_read(&tw->tw_refcnt) 6, called from qtaguid_mt+0x568/0x8bc xt_socket: xt_socket_get4_sk tw if (sk) atomic_read (&tw->tw_refcnt) 7, called from qtaguid_mt+0x568/0x8bc xt_socket: xt_socket_get4_sk tw atomic_read(&tw->tw_refcnt) 7, called from qtaguid_mt+0x568/0x8bc xt_socket: xt_socket_get4_sk tw if (sk) atomic_read (&tw->tw_refcnt) 8, called from qtaguid_mt+0x568/0x8bc xt_socket: xt_socket_get4_sk tw atomic_read(&tw->tw_refcnt) 8, called from qtaguid_mt+0x568/0x8bc xt_socket: xt_socket_get4_sk tw if (sk) atomic_read (&tw->tw_refcnt) 9, called from qtaguid_mt+0x568/0x8bc inet_twsk_put tw atomic_read(&tw->tw_refcnt) 9, called from tcp_v4_rcv+0x8e0/0x8fc tw_timer_handler tw atomic_read(&tw->tw_refcnt) 8, called from call_timer_fn+0x98/0x1e4 inet_twsk_kill tw atomic_read(&tw->tw_refcnt) 8, called from call_timer_fn+0x98/0x1e4 __sock_put tw atomic_read(&tw->tw_refcnt) 8, called from call_timer_fn+0x98/0x1e4 __sock_put tw atomic_read(&tw->tw_refcnt) 7, called from inet_twsk_kill+0x104/0x148 inet_twsk_put tw atomic_read(&tw->tw_refcnt) 6, called from call_timer_fn+0x98/0x1e4 CRs-Fixed: 1090436 Change-Id: Ib53c51baf351d851c33c196564be43508f531996 Signed-off-by: Subash Abhinov Kasiviswanathan --- net/netfilter/xt_qtaguid.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/net/netfilter/xt_qtaguid.c b/net/netfilter/xt_qtaguid.c index 8cc1d3bc96e02..0f559e2e337f8 100644 --- a/net/netfilter/xt_qtaguid.c +++ b/net/netfilter/xt_qtaguid.c @@ -1615,8 +1615,7 @@ static struct sock *qtaguid_find_sk(const struct sk_buff *skb, * "struct inet_timewait_sock" which is missing fields. */ if (sk->sk_state == TCP_TIME_WAIT) { - if (sk != skb->sk) - sock_gen_put(sk); + sock_gen_put(sk); sk = NULL; } } From 56b4fb7c09f256ea56feaf781c7d61b586f7d982 Mon Sep 17 00:00:00 2001 From: kunleiz Date: Tue, 27 Dec 2016 16:15:51 +0800 Subject: [PATCH 0562/1015] ASoC: msm: qdsp6v2: DAP: Add check to validate param length Return an error code to ensure valid length value is valid. CRs-fixed: 1102987 Change-Id: I6a679d08342d1da58c20b5c3d4e436dd335764ae Signed-off-by: kunleiz --- sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c b/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c index 992b617a2ea0e..c10bfaf071620 100644 --- a/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c +++ b/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c @@ -1643,6 +1643,7 @@ static int msm_ds2_dap_param_visualizer_control_get(u32 cmd, void *arg) ret = 0; dolby_data->length = 0; pr_err("%s Incorrect VCNB length", __func__); + return -EINVAL; } params_length = (2*length + DOLBY_VIS_PARAM_HEADER_SIZE) * From 02fab88dd0144977819262836db2560f1a816a4e Mon Sep 17 00:00:00 2001 From: Manu Gautam Date: Fri, 27 Jan 2017 14:26:44 +0530 Subject: [PATCH 0563/1015] usb: replace %p with %pK Format specifier %p can leak kernel addresses while not valuing the kptr_restrict system settings. When kptr_restrict is set to (1), kernel pointers printed using the %pK format specifier will be replaced with 0's. Debugging Note : &pK prints only Zeros as address. If you need actual address information, write 0 to kptr_restrict. echo 0 > /proc/sys/kernel/kptr_restrict Change-Id: I0e98145730380ea983fa8f46a28d15dd6c2c31df CRs-fixed: 1052849 Signed-off-by: Manu Gautam --- drivers/net/usb/cdc_ether.c | 4 +- drivers/net/usb/cdc_mbim.c | 2 +- drivers/net/usb/cdc_ncm.c | 4 +- drivers/net/usb/usbnet.c | 2 +- drivers/platform/msm/usb_bam.c | 14 ++-- drivers/usb/core/devio.c | 4 +- drivers/usb/core/hcd.c | 4 +- drivers/usb/core/urb.c | 2 +- drivers/usb/dwc3/core.c | 2 +- drivers/usb/dwc3/debugfs.c | 6 +- drivers/usb/dwc3/dwc3-msm.c | 10 +-- drivers/usb/dwc3/ep0.c | 4 +- drivers/usb/dwc3/gadget.c | 18 ++--- drivers/usb/dwc3/io.h | 4 +- drivers/usb/dwc3/trace.h | 4 +- drivers/usb/early/ehci-dbgp.c | 2 +- drivers/usb/gadget/android.c | 4 +- drivers/usb/gadget/ci13xxx_msm_hsic.c | 4 +- drivers/usb/gadget/ci13xxx_udc.c | 76 +++++++++---------- drivers/usb/gadget/composite.c | 18 ++--- drivers/usb/gadget/configfs.c | 4 +- drivers/usb/gadget/function/f_accessory.c | 10 +-- drivers/usb/gadget/function/f_acm.c | 6 +- drivers/usb/gadget/function/f_fs.c | 4 +- drivers/usb/gadget/function/f_gps.c | 20 ++--- drivers/usb/gadget/function/f_gsi.c | 22 +++--- drivers/usb/gadget/function/f_mbim.c | 18 ++--- drivers/usb/gadget/function/f_mtp.c | 10 +-- drivers/usb/gadget/function/f_obex.c | 2 +- drivers/usb/gadget/function/f_qc_ecm.c | 2 +- drivers/usb/gadget/function/f_qc_rndis.c | 2 +- drivers/usb/gadget/function/f_qdss.c | 4 +- drivers/usb/gadget/function/f_rmnet.c | 30 ++++---- drivers/usb/gadget/function/f_serial.c | 8 +- drivers/usb/gadget/function/u_bam.c | 24 +++--- drivers/usb/gadget/function/u_bam_data.c | 24 +++--- drivers/usb/gadget/function/u_ctrl_hsic.c | 6 +- drivers/usb/gadget/function/u_ctrl_qti.c | 10 +-- drivers/usb/gadget/function/u_data_bridge.c | 40 +++++----- drivers/usb/gadget/function/u_data_hsic.c | 22 +++--- drivers/usb/gadget/function/u_data_ipa.c | 16 ++-- drivers/usb/gadget/function/u_ether.c | 10 +-- drivers/usb/gadget/function/u_qc_ether.c | 4 +- .../usb/gadget/function/u_rmnet_ctrl_smd.c | 10 +-- drivers/usb/gadget/function/u_serial.c | 18 ++--- drivers/usb/gadget/function/u_smd.c | 44 +++++------ drivers/usb/gadget/legacy/inode.c | 4 +- drivers/usb/host/ehci-dbg.c | 22 +++--- drivers/usb/host/ehci-hcd.c | 2 +- drivers/usb/host/ehci-msm-hsic.c | 12 +-- drivers/usb/host/ehci-q.c | 8 +- drivers/usb/host/ehci-sched.c | 22 +++--- drivers/usb/host/xhci-dbg.c | 74 +++++++++--------- drivers/usb/host/xhci-mem.c | 30 ++++---- drivers/usb/host/xhci-ring.c | 18 ++--- drivers/usb/host/xhci-trace.h | 4 +- drivers/usb/host/xhci.c | 22 +++--- drivers/usb/mon/mon_text.c | 2 +- drivers/usb/phy/phy-msm-usb.c | 2 +- drivers/usb/storage/scsiglue.c | 2 +- sound/usb/endpoint.c | 4 +- sound/usb/pcm.c | 12 +-- sound/usb/usb_audio_qmi_svc.c | 2 +- 63 files changed, 400 insertions(+), 400 deletions(-) diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index d3920b54a92ce..a1b47ea877fbf 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -217,7 +217,7 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) info->u->bSlaveInterface0); if (!info->control || !info->data) { dev_dbg(&intf->dev, - "master #%u/%p slave #%u/%p\n", + "master #%u/%pK slave #%u/%pK\n", info->u->bMasterInterface0, info->control, info->u->bSlaveInterface0, @@ -317,7 +317,7 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) info->data = usb_ifnum_to_if(dev->udev, 1); if (!info->control || !info->data || info->control != intf) { dev_dbg(&intf->dev, - "rndis: master #0/%p slave #1/%p\n", + "rndis: master #0/%pK slave #1/%pK\n", info->control, info->data); goto bad_desc; diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c index 96fc8a5bde841..d11415bb9bb1d 100644 --- a/drivers/net/usb/cdc_mbim.c +++ b/drivers/net/usb/cdc_mbim.c @@ -473,7 +473,7 @@ static int cdc_mbim_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in) /* sanity checking */ if (((offset + len) > skb_in->len) || (len > ctx->rx_max)) { netif_dbg(dev, rx_err, dev->net, - "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%p\n", + "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%pK\n", x, offset, len, skb_in); if (!x) goto err_ndp; diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index ba31ecde1f72d..d15220fed3c0f 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c @@ -849,7 +849,7 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ dev_dbg(&intf->dev, "failed to get mac address\n"); goto error2; } - dev_info(&intf->dev, "MAC-Address: %pM\n", dev->net->dev_addr); + dev_info(&intf->dev, "MAC-Address: %pKM\n", dev->net->dev_addr); } /* finish setting up the device specific data */ @@ -1391,7 +1391,7 @@ int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in) if (((offset + len) > skb_in->len) || (len > ctx->rx_max) || (len < ETH_HLEN)) { netif_dbg(dev, rx_err, dev->net, - "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%p\n", + "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%pK\n", x, offset, len, skb_in); if (!x) goto err_ndp; diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 2516b45cd08ae..d1be46bbdd80f 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -2211,7 +2211,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) if (status) goto free_padding_pkt; netif_info(dev, probe, dev->net, - "register '%s' at usb-%s-%s, %s, %pM\n", + "register '%s' at usb-%s-%s, %s, %pKM\n", udev->dev.driver->name, xdev->bus->bus_name, xdev->devpath, dev->driver_info->description, diff --git a/drivers/platform/msm/usb_bam.c b/drivers/platform/msm/usb_bam.c index eaff4f3d59a04..7683b200f8e6b 100644 --- a/drivers/platform/msm/usb_bam.c +++ b/drivers/platform/msm/usb_bam.c @@ -235,10 +235,10 @@ void msm_bam_set_hsic_host_dev(struct device *dev) if (dev) { /* Hold the device until allowing lpm */ info[HSIC_CTRL].in_lpm = false; - log_event_dbg("%s: Getting hsic device %p\n", __func__, dev); + log_event_dbg("%s: Getting hsic device %pK\n", __func__, dev); pm_runtime_get(dev); } else if (host_info[HSIC_CTRL].dev) { - log_event_dbg("%s: Try Putting hsic device %p, lpm:%d\n", + log_event_dbg("%s: Try Putting hsic device %pK, lpm:%d\n", __func__, host_info[HSIC_CTRL].dev, info[HSIC_CTRL].in_lpm); /* Just release previous device if not already done */ @@ -825,7 +825,7 @@ static bool _hsic_host_bam_resume_core(void) /* Exit from "full suspend" in case of hsic host */ if (host_info[HSIC_CTRL].dev && info[HSIC_CTRL].in_lpm) { - log_event_dbg("%s: Getting hsic device %p\n", __func__, + log_event_dbg("%s: Getting hsic device %pK\n", __func__, host_info[HSIC_CTRL].dev); pm_runtime_get(host_info[HSIC_CTRL].dev); info[HSIC_CTRL].in_lpm = false; @@ -839,7 +839,7 @@ static void _hsic_host_bam_suspend_core(void) log_event_dbg("%s: enter\n", __func__); if (host_info[HSIC_CTRL].dev && !info[HSIC_CTRL].in_lpm) { - log_event_dbg("%s: Putting hsic host device %p\n", __func__, + log_event_dbg("%s: Putting hsic host device %pK\n", __func__, host_info[HSIC_CTRL].dev); pm_runtime_put(host_info[HSIC_CTRL].dev); info[HSIC_CTRL].in_lpm = true; @@ -1724,7 +1724,7 @@ static bool check_pipes_empty(enum usb_ctrl bam_type, u8 src_idx, u8 dst_idx) /* If we have any remaints in the pipes we don't go to sleep */ prod_pipe = ctx->usb_bam_sps.sps_pipes[src_idx]; cons_pipe = ctx->usb_bam_sps.sps_pipes[dst_idx]; - log_event_dbg("prod_pipe=%p, cons_pipe=%p\n", prod_pipe, cons_pipe); + log_event_dbg("prod_pipe=%pK, cons_pipe=%pK\n", prod_pipe, cons_pipe); if (!cons_pipe || (!prod_pipe && prod_pipe_connect->pipe_type == USB_BAM_PIPE_BAM2BAM)) { @@ -2091,7 +2091,7 @@ static bool msm_bam_host_lpm_ok(enum usb_ctrl bam_type) } /* HSIC host will go now to lpm */ - log_event_dbg("%s: vote for suspend hsic %p\n", + log_event_dbg("%s: vote for suspend hsic %pK\n", __func__, host_info[bam_type].dev); for (i = 0; i < ctx->max_connections; i++) { @@ -2454,7 +2454,7 @@ static void usb_bam_work(struct work_struct *w) if (pipe_iter->bam_type == pipe_connect->bam_type && pipe_iter->dir == PEER_PERIPHERAL_TO_USB && pipe_iter->enabled) { - log_event_dbg("%s: Register wakeup on pipe %p\n", + log_event_dbg("%s: Register wakeup on pipe %pK\n", __func__, pipe_iter); __usb_bam_register_wake_cb( pipe_connect->bam_type, i, diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index dfcb5f8b8f18f..877578fd58ffb 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -373,11 +373,11 @@ static void snoop_urb(struct usb_device *udev, if (userurb) { /* Async */ if (when == SUBMIT) - dev_info(&udev->dev, "userurb %p, ep%d %s-%s, " + dev_info(&udev->dev, "userurb %pK, ep%d %s-%s, " "length %u\n", userurb, ep, t, d, length); else - dev_info(&udev->dev, "userurb %p, ep%d %s-%s, " + dev_info(&udev->dev, "userurb %pK, ep%d %s-%s, " "actual_length %u status %d\n", userurb, ep, t, d, length, timeout_or_status); diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 45906a9f2d238..c462e3bb0d2de 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -1643,7 +1643,7 @@ int usb_hcd_unlink_urb (struct urb *urb, int status) if (retval == 0) retval = -EINPROGRESS; else if (retval != -EIDRM && retval != -EBUSY) - dev_dbg(&udev->dev, "hcd_unlink_urb %p fail %d\n", + dev_dbg(&udev->dev, "hcd_unlink_urb %pK fail %d\n", urb, retval); usb_put_dev(udev); } @@ -1812,7 +1812,7 @@ void usb_hcd_flush_endpoint(struct usb_device *udev, /* kick hcd */ unlink1(hcd, urb, -ESHUTDOWN); dev_dbg (hcd->self.controller, - "shutdown urb %p ep%d%s%s\n", + "shutdown urb %pK ep%d%s%s\n", urb, usb_endpoint_num(&ep->desc), is_in ? "in" : "out", ({ char *s; diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index c9e8ee81b6b74..188819aedb43f 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c @@ -336,7 +336,7 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) if (!urb || !urb->complete) return -EINVAL; if (urb->hcpriv) { - WARN_ONCE(1, "URB %p submitted while active\n", urb); + WARN_ONCE(1, "URB %pK submitted while active\n", urb); return -EBUSY; } diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 98bf050660ae7..c62a79d3eb074 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -274,7 +274,7 @@ int dwc3_event_buffers_setup(struct dwc3 *dwc) for (n = 0; n < dwc->num_event_buffers; n++) { evt = dwc->ev_buffs[n]; - dev_dbg(dwc->dev, "Event buf %p dma %08llx length %d\n", + dev_dbg(dwc->dev, "Event buf %pK dma %08llx length %d\n", evt->buf, (unsigned long long) evt->dma, evt->length); diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c index 717f59125a5cd..f5c9a4b5bfbfd 100644 --- a/drivers/usb/dwc3/debugfs.c +++ b/drivers/usb/dwc3/debugfs.c @@ -673,7 +673,7 @@ static int dwc3_ep_req_list_show(struct seq_file *s, void *unused) req = list_entry(ptr, struct dwc3_request, list); seq_printf(s, - "req:0x%p len: %d sts: %d dma:0x%pa num_sgs: %d\n", + "req:0x%pK len: %d sts: %d dma:0x%pKa num_sgs: %d\n", req, req->request.length, req->request.status, &req->request.dma, req->request.num_sgs); } @@ -712,7 +712,7 @@ static int dwc3_ep_queued_req_show(struct seq_file *s, void *unused) req = list_entry(ptr, struct dwc3_request, list); seq_printf(s, - "req:0x%p len:%d sts:%d dma:%pa nsg:%d trb:0x%p\n", + "req:0x%pK len:%d sts:%d dma:%pKa nsg:%d trb:0x%pK\n", req, req->request.length, req->request.status, &req->request.dma, req->request.num_sgs, req->trb); } @@ -756,7 +756,7 @@ static int dwc3_ep_trbs_show(struct seq_file *s, void *unused) dep->name, dep->flags, dep->free_slot, dep->busy_slot); for (j = 0; j < DWC3_TRB_NUM; j++) { trb = &dep->trb_pool[j]; - seq_printf(s, "trb:0x%p bph:0x%x bpl:0x%x size:0x%x ctrl: %x\n", + seq_printf(s, "trb:0x%pK bph:0x%x bpl:0x%x size:0x%x ctrl: %x\n", trb, trb->bph, trb->bpl, trb->size, trb->ctrl); } spin_unlock_irqrestore(&dwc->lock, flags); diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 939fd97e5c09a..f5f18b0bb5ed7 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -670,7 +670,7 @@ static int dwc3_msm_ep_queue(struct usb_ep *ep, spin_lock_irqsave(&dwc->lock, flags); if (!dep->endpoint.desc) { dev_err(mdwc->dev, - "%s: trying to queue request %p to disabled ep %s\n", + "%s: trying to queue request %pK to disabled ep %s\n", __func__, request, ep->name); spin_unlock_irqrestore(&dwc->lock, flags); return -EPERM; @@ -707,7 +707,7 @@ static int dwc3_msm_ep_queue(struct usb_ep *ep, if (dep->number == 0 || dep->number == 1) { dev_err(mdwc->dev, - "%s: trying to queue dbm request %p to control ep %s\n", + "%s: trying to queue dbm request %pK to control ep %s\n", __func__, request, ep->name); spin_unlock_irqrestore(&dwc->lock, flags); return -EPERM; @@ -716,7 +716,7 @@ static int dwc3_msm_ep_queue(struct usb_ep *ep, if (dep->busy_slot != dep->free_slot || !list_empty(&dep->request_list) || !list_empty(&dep->req_queued)) { dev_err(mdwc->dev, - "%s: trying to queue dbm request %p tp ep %s\n", + "%s: trying to queue dbm request %pK tp ep %s\n", __func__, request, ep->name); spin_unlock_irqrestore(&dwc->lock, flags); return -EPERM; @@ -739,7 +739,7 @@ static int dwc3_msm_ep_queue(struct usb_ep *ep, list_add_tail(&req_complete->list_item, &mdwc->req_complete_list); request->complete = dwc3_msm_req_complete_func; - dev_vdbg(dwc->dev, "%s: queing request %p to ep %s length %d\n", + dev_vdbg(dwc->dev, "%s: queing request %pK to ep %s length %d\n", __func__, request, ep->name, request->length); size = dwc3_msm_read_reg(mdwc->base, DWC3_GEVNTSIZ(0)); dbm_event_buffer_config(mdwc->dbm, @@ -925,7 +925,7 @@ static void gsi_ring_in_db(struct usb_ep *ep, struct usb_gsi_request *request) dev_dbg(mdwc->dev, "Failed to get GSI DBL address MSB\n"); offset = dwc3_trb_dma_offset(dep, &dep->trb_pool[num_trbs-1]); - dev_dbg(mdwc->dev, "Writing link TRB addr: %pa to %p (%x)\n", + dev_dbg(mdwc->dev, "Writing link TRB addr: %pKa to %pK (%x)\n", &offset, gsi_dbl_address_lsb, dbl_lo_addr); writel_relaxed(offset, gsi_dbl_address_lsb); diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index c481351469cf6..ef76e379ad823 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -228,7 +228,7 @@ int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, spin_lock_irqsave(&dwc->lock, flags); if (!dep->endpoint.desc) { dwc3_trace(trace_dwc3_ep0, - "trying to queue request %p to disabled %s", + "trying to queue request %pK to disabled %s", request, dep->name); ret = -ESHUTDOWN; goto out; @@ -241,7 +241,7 @@ int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, } dwc3_trace(trace_dwc3_ep0, - "queueing request %p to %s length %d state '%s'", + "queueing request %pK to %s length %d state '%s'", request, dep->name, request->length, dwc3_ep0_state_string(dwc->ep0state)); diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 9d394b2adb3f4..559210864fc99 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -298,7 +298,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, usb_gadget_unmap_request(&dwc->gadget, &req->request, req->direction); - dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n", + dev_dbg(dwc->dev, "request %pK from %s completed %d/%d ===> %d\n", req, dep->name, req->request.actual, req->request.length, status); trace_dwc3_gadget_giveback(req); @@ -704,7 +704,7 @@ static int dwc3_gadget_ep_enable(struct usb_ep *ep, int ret; if (!ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) { - pr_debug("dwc3: invalid parameters. ep=%p, desc=%p, DT=%d\n", + pr_debug("dwc3: invalid parameters. ep=%pK, desc=%pK, DT=%d\n", ep, desc, desc ? desc->bDescriptorType : 0); return -EINVAL; } @@ -833,7 +833,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, bool zlp_appended = false; unsigned rlen; - dev_vdbg(dwc->dev, "%s: req %p dma %08llx length %d%s%s\n", + dev_vdbg(dwc->dev, "%s: req %pK dma %08llx length %d%s%s\n", dep->name, req, (unsigned long long) dma, length, last ? " last" : "", chain ? " chain" : ""); @@ -1299,7 +1299,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) if (req->request.status == -EINPROGRESS) { ret = -EBUSY; - dev_err(dwc->dev, "%s: %p request already in queue", + dev_err(dwc->dev, "%s: %pK request already in queue", dep->name, req); return ret; } @@ -1444,7 +1444,7 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request, spin_lock_irqsave(&dwc->lock, flags); if (!dep->endpoint.desc) { - dev_dbg(dwc->dev, "trying to queue request %p to disabled %s\n", + dev_dbg(dwc->dev, "trying to queue request %pK to disabled %s\n", request, ep->name); spin_unlock_irqrestore(&dwc->lock, flags); return -ESHUTDOWN; @@ -1455,7 +1455,7 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request, * API should not be allowed. */ if (dep->endpoint.endless) { - dev_dbg(dwc->dev, "trying to queue endless request %p to %s\n", + dev_dbg(dwc->dev, "trying to queue endless request %pK to %s\n", request, ep->name); spin_unlock_irqrestore(&dwc->lock, flags); return -EPERM; @@ -1468,7 +1468,7 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request, return dwc->gadget.remote_wakeup ? -EAGAIN : -ENOTSUPP; } - dev_vdbg(dwc->dev, "queing request %p to %s length %d\n", + dev_vdbg(dwc->dev, "queing request %pK to %s length %d\n", request, ep->name, request->length); trace_dwc3_ep_queue(req); @@ -1518,7 +1518,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, dwc3_stop_active_transfer(dwc, dep->number, true); goto out1; } - dev_err(dwc->dev, "request %p was not queued to %s\n", + dev_err(dwc->dev, "request %pK was not queued to %s\n", request, ep->name); ret = -EINVAL; goto out0; @@ -2430,7 +2430,7 @@ static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, struct dwc3_ep *dep, * would help. Lets hope that if this occurs, someone * fixes the root cause instead of looking away :) */ - dev_err(dwc->dev, "%s's TRB (%p) still owned by HW\n", + dev_err(dwc->dev, "%s's TRB (%pK) still owned by HW\n", dep->name, trb); count = trb->size & DWC3_TRB_SIZE_MASK; diff --git a/drivers/usb/dwc3/io.h b/drivers/usb/dwc3/io.h index 6a79c8e66bbcc..d797eb8728de8 100644 --- a/drivers/usb/dwc3/io.h +++ b/drivers/usb/dwc3/io.h @@ -41,7 +41,7 @@ static inline u32 dwc3_readl(void __iomem *base, u32 offset) * documentation, so we revert it back to the proper addresses, the * same way they are described on SNPS documentation */ - dwc3_trace(trace_dwc3_readl, "addr %p value %08x", + dwc3_trace(trace_dwc3_readl, "addr %pK value %08x", base - DWC3_GLOBALS_REGS_START + offset, value); return value; @@ -63,7 +63,7 @@ static inline void dwc3_writel(void __iomem *base, u32 offset, u32 value) * documentation, so we revert it back to the proper addresses, the * same way they are described on SNPS documentation */ - dwc3_trace(trace_dwc3_writel, "addr %p value %08x", + dwc3_trace(trace_dwc3_writel, "addr %pK value %08x", base - DWC3_GLOBALS_REGS_START + offset, value); } diff --git a/drivers/usb/dwc3/trace.h b/drivers/usb/dwc3/trace.h index 60b0f41eafc40..88f18814907bb 100644 --- a/drivers/usb/dwc3/trace.h +++ b/drivers/usb/dwc3/trace.h @@ -115,7 +115,7 @@ DECLARE_EVENT_CLASS(dwc3_log_request, __entry->length = req->request.length; __entry->status = req->request.status; ), - TP_printk("%s: req %p length %u/%u ==> %d", + TP_printk("%s: req %pK length %u/%u ==> %d", __get_str(name), __entry->req, __entry->actual, __entry->length, __entry->status ) @@ -214,7 +214,7 @@ DECLARE_EVENT_CLASS(dwc3_log_trb, __entry->size = trb->size; __entry->ctrl = trb->ctrl; ), - TP_printk("%s: trb %p bph %08x bpl %08x size %08x ctrl %08x\n", + TP_printk("%s: trb %pK bph %08x bpl %08x size %08x ctrl %08x\n", __get_str(name), __entry->trb, __entry->bph, __entry->bpl, __entry->size, __entry->ctrl ) diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c index 8cfc3191be50a..482995c10fc32 100644 --- a/drivers/usb/early/ehci-dbgp.c +++ b/drivers/usb/early/ehci-dbgp.c @@ -888,7 +888,7 @@ int __init early_dbgp_init(char *s) set_fixmap_nocache(FIX_DBGP_BASE, bar_val & PAGE_MASK); ehci_bar = (void __iomem *)__fix_to_virt(FIX_DBGP_BASE); ehci_bar += bar_val & ~PAGE_MASK; - dbgp_printk("ehci_bar: %p\n", ehci_bar); + dbgp_printk("ehci_bar: %pK\n", ehci_bar); ehci_caps = ehci_bar; ehci_regs = ehci_bar + EARLY_HC_LENGTH(readl(&ehci_caps->hc_capbase)); diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c index baf7c19510985..678a88e50deac 100644 --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -481,7 +481,7 @@ static void android_work(struct work_struct *data) } pr_info("%s: sent uevent %s\n", __func__, uevent_envp[0]); } else { - pr_info("%s: did not send uevent (%d %d %p)\n", __func__, + pr_info("%s: did not send uevent (%d %d %pK)\n", __func__, dev->connected, dev->sw_connected, cdev->config); } } @@ -4047,7 +4047,7 @@ static int usb_diag_update_pid_and_serial_num(u32 pid, const char *snum) return -ENODEV; } - pr_debug("%s: dload:%p pid:%x serial_num:%s\n", + pr_debug("%s: dload:%pK pid:%x serial_num:%s\n", __func__, diag_dload, pid, snum); /* update pid */ diff --git a/drivers/usb/gadget/ci13xxx_msm_hsic.c b/drivers/usb/gadget/ci13xxx_msm_hsic.c index 02ebd75092b46..3a861cf320113 100644 --- a/drivers/usb/gadget/ci13xxx_msm_hsic.c +++ b/drivers/usb/gadget/ci13xxx_msm_hsic.c @@ -379,7 +379,7 @@ static void msm_hsic_start(void) while (seq[0] >= 0 && seq_count > 0) { val = readl_relaxed(mhsic->tlmm_regs + seq[0]); val |= seq[1]; - dev_dbg(mhsic->dev, "%s: writing %x to %p\n", + dev_dbg(mhsic->dev, "%s: writing %x to %pK\n", __func__, val, mhsic->tlmm_regs + seq[0]); writel_relaxed(val, mhsic->tlmm_regs + seq[0]); seq += 2; @@ -948,7 +948,7 @@ static int msm_hsic_probe(struct platform_device *pdev) ret = -ENOMEM; goto error; } - dev_info(&pdev->dev, "HSIC Peripheral regs = %p\n", mhsic->regs); + dev_info(&pdev->dev, "HSIC Peripheral regs = %pK\n", mhsic->regs); res = platform_get_resource(pdev, IORESOURCE_MEM, 1); if (!res && pdata->tlmm_init_seq) { diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c index 829f09772cd0a..550f16d89aceb 100644 --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c @@ -859,7 +859,7 @@ static ssize_t show_device(struct device *dev, struct device_attribute *attr, struct usb_gadget *gadget = &udc->gadget; int n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -901,7 +901,7 @@ static ssize_t show_driver(struct device *dev, struct device_attribute *attr, struct usb_gadget_driver *driver = udc->driver; int n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1116,7 +1116,7 @@ static void dbg_usb_op_fail(u8 addr, const char *name, list_for_each(ptr, &mep->qh.queue) { req = list_entry(ptr, struct ci13xxx_req, queue); scnprintf(msg, sizeof(msg), - "%pa:%08X:%08X\n", + "%pKa:%08X:%08X\n", &req->dma, req->ptr->next, req->ptr->token); dbg_print(addr, "REQ", 0, msg); @@ -1139,7 +1139,7 @@ static ssize_t show_events(struct device *dev, struct device_attribute *attr, unsigned long flags; unsigned i, j, n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1174,7 +1174,7 @@ static ssize_t store_events(struct device *dev, struct device_attribute *attr, { unsigned tty; - dbg_trace("[%s] %p, %d\n", __func__, buf, count); + dbg_trace("[%s] %pK, %d\n", __func__, buf, count); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); goto done; @@ -1206,7 +1206,7 @@ static ssize_t show_inters(struct device *dev, struct device_attribute *attr, u32 intr; unsigned i, j, n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1279,7 +1279,7 @@ static ssize_t store_inters(struct device *dev, struct device_attribute *attr, unsigned long flags; unsigned en, bit; - dbg_trace("[%s] %p, %d\n", __func__, buf, count); + dbg_trace("[%s] %pK, %d\n", __func__, buf, count); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); goto done; @@ -1319,7 +1319,7 @@ static ssize_t show_port_test(struct device *dev, unsigned long flags; unsigned mode; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1345,7 +1345,7 @@ static ssize_t store_port_test(struct device *dev, unsigned long flags; unsigned mode; - dbg_trace("[%s] %p, %d\n", __func__, buf, count); + dbg_trace("[%s] %pK, %d\n", __func__, buf, count); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); goto done; @@ -1379,7 +1379,7 @@ static ssize_t show_qheads(struct device *dev, struct device_attribute *attr, unsigned long flags; unsigned i, j, n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1419,7 +1419,7 @@ static ssize_t show_registers(struct device *dev, u32 *dump; unsigned i, k, n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1457,7 +1457,7 @@ static ssize_t store_registers(struct device *dev, struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev); unsigned long addr, data, flags; - dbg_trace("[%s] %p, %d\n", __func__, buf, count); + dbg_trace("[%s] %pK, %d\n", __func__, buf, count); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); goto done; @@ -1493,7 +1493,7 @@ static ssize_t show_requests(struct device *dev, struct device_attribute *attr, struct ci13xxx_req *req = NULL; unsigned i, j, n = 0, qSize = sizeof(struct ci13xxx_td)/sizeof(u32); - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1603,7 +1603,7 @@ static ssize_t print_dtds(struct device *dev, list_for_each(ptr, &mEp->qh.queue) { req = list_entry(ptr, struct ci13xxx_req, queue); - pr_info("\treq:%pa next:%08x token:%08x page0:%08x status:%d\n", + pr_info("\treq:%pKa next:%08x token:%08x page0:%08x status:%d\n", &req->dma, req->ptr->next, req->ptr->token, req->ptr->page[0], req->req.status); } @@ -1827,7 +1827,7 @@ static void ep_prime_timer_func(unsigned long data) mep->qh.ptr->td.next, mep->qh.ptr->td.token); list_for_each(ptr, &mep->qh.queue) { req = list_entry(ptr, struct ci13xxx_req, queue); - pr_info("\treq:%pa:%08xtkn:%08xpage0:%08xsts:%d\n", + pr_info("\treq:%pKa:%08xtkn:%08xpage0:%08xsts:%d\n", &req->dma, req->ptr->next, req->ptr->token, req->ptr->page[0], req->req.status); @@ -1861,7 +1861,7 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq) unsigned length = mReq->req.length; struct ci13xxx *udc = _udc; - trace("%p, %p", mEp, mReq); + trace("%pK, %pK", mEp, mReq); /* don't queue twice */ if (mReq->req.status == -EALREADY) @@ -2079,7 +2079,7 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq) */ static int _hardware_dequeue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq) { - trace("%p, %p", mEp, mReq); + trace("%pK, %pK", mEp, mReq); if (mReq->req.status != -EALREADY) return -EINVAL; @@ -2281,7 +2281,7 @@ static int _ep_nuke(struct ci13xxx_ep *mEp) __releases(mEp->lock) __acquires(mEp->lock) { - trace("%p", mEp); + trace("%pK", mEp); if (mEp == NULL) return -EINVAL; @@ -2328,7 +2328,7 @@ static int _gadget_stop_activity(struct usb_gadget *gadget) struct ci13xxx *udc = container_of(gadget, struct ci13xxx, gadget); unsigned long flags; - trace("%p", gadget); + trace("%pK", gadget); if (gadget == NULL) return -EINVAL; @@ -2372,7 +2372,7 @@ __acquires(udc->lock) { int retval; - trace("%p", udc); + trace("%pK", udc); if (udc == NULL) { err("EINVAL"); @@ -2474,7 +2474,7 @@ static void isr_suspend_handler(struct ci13xxx *udc) */ static void isr_get_status_complete(struct usb_ep *ep, struct usb_request *req) { - trace("%p, %p", ep, req); + trace("%pK, %pK", ep, req); if (ep == NULL || req == NULL) { err("EINVAL"); @@ -2501,7 +2501,7 @@ __acquires(mEp->lock) struct usb_request *req = udc->status; int dir, num, retval; - trace("%p, %p", mEp, setup); + trace("%pK, %pK", mEp, setup); if (mEp == NULL || setup == NULL) return -EINVAL; @@ -2543,7 +2543,7 @@ isr_setup_status_complete(struct usb_ep *ep, struct usb_request *req) struct ci13xxx *udc = req->context; unsigned long flags; - trace("%p, %p", ep, req); + trace("%pK, %pK", ep, req); spin_lock_irqsave(udc->lock, flags); if (udc->test_mode) @@ -2564,7 +2564,7 @@ __acquires(mEp->lock) int retval; struct ci13xxx_ep *mEp; - trace("%p", udc); + trace("%pK", udc); mEp = (udc->ep0_dir == TX) ? &udc->ep0out : &udc->ep0in; udc->status->context = udc; @@ -2595,7 +2595,7 @@ __acquires(mEp->lock) int req_dequeue = 1; struct ci13xxx *udc = _udc; - trace("%p", mEp); + trace("%pK", mEp); if (list_empty(&mEp->qh.queue)) return 0; @@ -2693,7 +2693,7 @@ __acquires(udc->lock) unsigned i; u8 tmode = 0; - trace("%p", udc); + trace("%pK", udc); if (udc == NULL) { err("EINVAL"); @@ -2896,7 +2896,7 @@ static int ep_enable(struct usb_ep *ep, unsigned long flags; unsigned mult = 0; - trace("ep = %p, desc = %p", ep, desc); + trace("ep = %pK, desc = %pK", ep, desc); if (ep == NULL || desc == NULL) return -EINVAL; @@ -2959,7 +2959,7 @@ static int ep_disable(struct usb_ep *ep) int direction, retval = 0; unsigned long flags; - trace("%p", ep); + trace("%pK", ep); if (ep == NULL) return -EINVAL; @@ -3006,7 +3006,7 @@ static struct usb_request *ep_alloc_request(struct usb_ep *ep, gfp_t gfp_flags) struct ci13xxx_ep *mEp = container_of(ep, struct ci13xxx_ep, ep); struct ci13xxx_req *mReq = NULL; - trace("%p, %i", ep, gfp_flags); + trace("%pK, %i", ep, gfp_flags); if (ep == NULL) { err("EINVAL"); @@ -3042,7 +3042,7 @@ static void ep_free_request(struct usb_ep *ep, struct usb_request *req) struct ci13xxx_req *mReq = container_of(req, struct ci13xxx_req, req); unsigned long flags; - trace("%p, %p", ep, req); + trace("%pK, %pK", ep, req); if (ep == NULL || req == NULL) { err("EINVAL"); @@ -3077,7 +3077,7 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req, unsigned long flags; struct ci13xxx *udc = _udc; - trace("%p, %p, %X", ep, req, gfp_flags); + trace("%pK, %pK, %X", ep, req, gfp_flags); spin_lock_irqsave(mEp->lock, flags); if (ep == NULL || req == NULL || mEp->desc == NULL) { @@ -3210,7 +3210,7 @@ static int ep_dequeue(struct usb_ep *ep, struct usb_request *req) struct ci13xxx *udc = _udc; unsigned long flags; - trace("%p, %p", ep, req); + trace("%pK, %pK", ep, req); if (udc->udc_driver->in_lpm && udc->udc_driver->in_lpm(udc)) { dev_err(udc->transceiver->dev, @@ -3288,7 +3288,7 @@ static int ep_set_halt(struct usb_ep *ep, int value) int direction, retval = 0; unsigned long flags; - trace("%p, %i", ep, value); + trace("%pK, %i", ep, value); if (ep == NULL || mEp->desc == NULL) return -EINVAL; @@ -3339,7 +3339,7 @@ static int ep_set_wedge(struct usb_ep *ep) struct ci13xxx_ep *mEp = container_of(ep, struct ci13xxx_ep, ep); unsigned long flags; - trace("%p", ep); + trace("%pK", ep); if (ep == NULL || mEp->desc == NULL) return -EINVAL; @@ -3365,7 +3365,7 @@ static void ep_fifo_flush(struct usb_ep *ep) struct ci13xxx_ep *mEp = container_of(ep, struct ci13xxx_ep, ep); unsigned long flags; - trace("%p", ep); + trace("%pK", ep); if (ep == NULL) { err("%02X: -EINVAL", _usb_addr(mEp)); @@ -3558,7 +3558,7 @@ static int ci13xxx_start(struct usb_gadget *gadget, unsigned long flags; int retval = -ENOMEM; - trace("%p", driver); + trace("%pK", driver); if (driver == NULL || driver->setup == NULL || @@ -3646,7 +3646,7 @@ static int ci13xxx_stop(struct usb_gadget *gadget, struct ci13xxx *udc = _udc; unsigned long flags; - trace("%p", driver); + trace("%pK", driver); if (driver == NULL || driver->unbind == NULL || @@ -3776,7 +3776,7 @@ static int udc_probe(struct ci13xxx_udc_driver *driver, struct device *dev, struct ci13xxx_platform_data *pdata; int retval = 0, i, j; - trace("%p, %p, %p", dev, regs, driver->name); + trace("%pK, %pK, %pK", dev, regs, driver->name); if (dev == NULL || regs == NULL || driver == NULL || driver->name == NULL) diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 006f1ea4662c6..928899e3e3f77 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -208,7 +208,7 @@ int usb_add_function(struct usb_configuration *config, { int value = -EINVAL; - DBG(config->cdev, "adding '%s'/%p to config '%s'/%p\n", + DBG(config->cdev, "adding '%s'/%pK to config '%s'/%pK\n", function->name, function, config->label, config); @@ -243,7 +243,7 @@ int usb_add_function(struct usb_configuration *config, done: if (value) - DBG(config->cdev, "adding '%s'/%p --> %d\n", + DBG(config->cdev, "adding '%s'/%pK --> %d\n", function->name, function, value); return value; } @@ -847,7 +847,7 @@ static int set_config(struct usb_composite_dev *cdev, result = f->set_alt(f, tmp, 0); if (result < 0) { - DBG(cdev, "interface %d (%s/%p) alt 0 --> %d\n", + DBG(cdev, "interface %d (%s/%pK) alt 0 --> %d\n", tmp, f->name, f, result); reset_config(cdev); @@ -926,7 +926,7 @@ int usb_add_config(struct usb_composite_dev *cdev, if (!bind) goto done; - DBG(cdev, "adding config #%u '%s'/%p\n", + DBG(cdev, "adding config #%u '%s'/%pK\n", config->bConfigurationValue, config->label, config); @@ -943,7 +943,7 @@ int usb_add_config(struct usb_composite_dev *cdev, struct usb_function, list); list_del(&f->list); if (f->unbind) { - DBG(cdev, "unbind function '%s'/%p\n", + DBG(cdev, "unbind function '%s'/%pK\n", f->name, f); f->unbind(config, f); /* may free memory for "f" */ @@ -954,7 +954,7 @@ int usb_add_config(struct usb_composite_dev *cdev, } else { unsigned i; - DBG(cdev, "cfg %d/%p speeds:%s%s%s\n", + DBG(cdev, "cfg %d/%pK speeds:%s%s%s\n", config->bConfigurationValue, config, config->superspeed ? " super" : "", config->highspeed ? " high" : "", @@ -969,7 +969,7 @@ int usb_add_config(struct usb_composite_dev *cdev, if (!f) continue; - DBG(cdev, " interface %d = %s/%p\n", + DBG(cdev, " interface %d = %s/%pK\n", i, f->name, f); } } @@ -997,13 +997,13 @@ static void unbind_config(struct usb_composite_dev *cdev, struct usb_function, list); list_del(&f->list); if (f->unbind) { - DBG(cdev, "unbind function '%s'/%p\n", f->name, f); + DBG(cdev, "unbind function '%s'/%pK\n", f->name, f); f->unbind(config, f); /* may free memory for "f" */ } } if (config->unbind) { - DBG(cdev, "unbind config '%s'/%p\n", config->label, config); + DBG(cdev, "unbind config '%s'/%pK\n", config->label, config); config->unbind(config); /* may free memory for "c" */ } diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 77b2ea7431f0b..c2d631b1cd520 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -1326,7 +1326,7 @@ static void purge_configs_funcs(struct gadget_info *gi) list_move_tail(&f->list, &cfg->func_list); if (f->unbind) { dev_err(&gi->cdev.gadget->dev, "unbind function" - " '%s'/%p\n", f->name, f); + " '%s'/%pK\n", f->name, f); f->unbind(c, f); } } @@ -1511,7 +1511,7 @@ static void android_work(struct work_struct *data) } if (!uevent_sent) { - pr_info("%s: did not send uevent (%d %d %p)\n", __func__, + pr_info("%s: did not send uevent (%d %d %pK)\n", __func__, gi->connected, gi->sw_connected, cdev->config); } } diff --git a/drivers/usb/gadget/function/f_accessory.c b/drivers/usb/gadget/function/f_accessory.c index 00a73f2316809..27b2926f16bec 100644 --- a/drivers/usb/gadget/function/f_accessory.c +++ b/drivers/usb/gadget/function/f_accessory.c @@ -555,7 +555,7 @@ static int create_bulk_endpoints(struct acc_dev *dev, struct usb_ep *ep; int i; - DBG(cdev, "create_bulk_endpoints dev: %p\n", dev); + DBG(cdev, "create_bulk_endpoints dev: %pK\n", dev); ep = usb_ep_autoconfig(cdev->gadget, in_desc); if (!ep) { @@ -658,7 +658,7 @@ static ssize_t acc_read(struct file *fp, char __user *buf, r = -EIO; goto done; } else { - pr_debug("rx %p queue\n", req); + pr_debug("rx %pK queue\n", req); } /* wait for a request to complete */ @@ -681,7 +681,7 @@ static ssize_t acc_read(struct file *fp, char __user *buf, if (req->actual == 0) goto requeue_req; - pr_debug("rx %p %u\n", req, req->actual); + pr_debug("rx %pK %u\n", req, req->actual); xfer = (req->actual < count) ? req->actual : count; r = xfer; if (copy_to_user(buf, req->buf, xfer)) @@ -981,7 +981,7 @@ __acc_function_bind(struct usb_configuration *c, int id; int ret; - DBG(cdev, "acc_function_bind dev: %p\n", dev); + DBG(cdev, "acc_function_bind dev: %pK\n", dev); if (configfs) { if (acc_string_defs[INTERFACE_STRING_INDEX].id == 0) { @@ -1168,7 +1168,7 @@ static void acc_hid_work(struct work_struct *data) list_for_each_safe(entry, temp, &new_list) { hid = list_entry(entry, struct acc_hid_dev, list); if (acc_hid_init(hid)) { - pr_err("can't add HID device %p\n", hid); + pr_err("can't add HID device %pK\n", hid); acc_hid_delete(hid); } else { spin_lock_irqsave(&dev->lock, flags); diff --git a/drivers/usb/gadget/function/f_acm.c b/drivers/usb/gadget/function/f_acm.c index ba830348ad4d4..2126b5e1f753d 100644 --- a/drivers/usb/gadget/function/f_acm.c +++ b/drivers/usb/gadget/function/f_acm.c @@ -137,7 +137,7 @@ static int acm_port_connect(struct f_acm *acm) port_num = gacm_ports[acm->port_num].client_port_num; - pr_debug("%s: transport:%s f_acm:%p gserial:%p port_num:%d cl_port_no:%d\n", + pr_debug("%s: transport:%s f_acm:%pK gserial:%pK port_num:%d cl_port_no:%d\n", __func__, xport_to_str(acm->transport), acm, &acm->port, acm->port_num, port_num); @@ -163,7 +163,7 @@ static int acm_port_disconnect(struct f_acm *acm) port_num = gacm_ports[acm->port_num].client_port_num; - pr_debug("%s: transport:%s f_acm:%p gserial:%p port_num:%d cl_pno:%d\n", + pr_debug("%s: transport:%s f_acm:%pK gserial:%pK port_num:%d cl_pno:%d\n", __func__, xport_to_str(acm->transport), acm, &acm->port, acm->port_num, port_num); @@ -833,7 +833,7 @@ acm_bind(struct usb_configuration *c, struct usb_function *f) if (acm->port.in) acm->port.in->driver_data = NULL; - ERROR(cdev, "%s/%p: can't bind, err %d\n", f->name, f, status); + ERROR(cdev, "%s/%pK: can't bind, err %d\n", f->name, f, status); return status; } diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 599a4273d29d4..efa6ec31c08e2 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -1578,14 +1578,14 @@ static void ffs_data_clear(struct ffs_data *ffs) { ENTER(); - pr_debug("%s: ffs->gadget= %p, ffs->flags= %lu\n", __func__, + pr_debug("%s: ffs->gadget= %pK, ffs->flags= %lu\n", __func__, ffs->gadget, ffs->flags); ffs_closed(ffs); /* Dump ffs->gadget and ffs->flags */ if (ffs->gadget) - pr_err("%s: ffs:%p ffs->gadget= %p, ffs->flags= %lu\n", + pr_err("%s: ffs:%pK ffs->gadget= %pK, ffs->flags= %lu\n", __func__, ffs, ffs->gadget, ffs->flags); BUG_ON(ffs->gadget); diff --git a/drivers/usb/gadget/function/f_gps.c b/drivers/usb/gadget/function/f_gps.c index 075a152141358..1e0cfd33ff398 100644 --- a/drivers/usb/gadget/function/f_gps.c +++ b/drivers/usb/gadget/function/f_gps.c @@ -292,7 +292,7 @@ gps_set_alt(struct usb_function *f, unsigned intf, unsigned alt) int ret; struct list_head *cpkt; - pr_debug("%s:dev:%p\n", __func__, dev); + pr_debug("%s:dev:%pK\n", __func__, dev); if (dev->notify->driver_data) usb_ep_disable(dev->notify); @@ -333,7 +333,7 @@ static void gps_ctrl_response_available(struct f_gps *dev) int ret; struct rmnet_ctrl_pkt *cpkt; - pr_debug("%s:dev:%p\n", __func__, dev); + pr_debug("%s:dev:%pK\n", __func__, dev); spin_lock_irqsave(&dev->lock, flags); if (!atomic_read(&dev->online) || !req || !req->buf) { @@ -380,7 +380,7 @@ static void gps_connect(struct grmnet *gr) struct f_gps *dev; if (!gr) { - pr_err("%s: Invalid grmnet:%p\n", __func__, gr); + pr_err("%s: Invalid grmnet:%pK\n", __func__, gr); return; } @@ -394,7 +394,7 @@ static void gps_disconnect(struct grmnet *gr) struct f_gps *dev; if (!gr) { - pr_err("%s: Invalid grmnet:%p\n", __func__, gr); + pr_err("%s: Invalid grmnet:%pK\n", __func__, gr); return; } @@ -420,7 +420,7 @@ gps_send_cpkt_response(void *gr, void *buf, size_t len) unsigned long flags; if (!gr || !buf) { - pr_err("%s: Invalid grmnet/buf, grmnet:%p buf:%p\n", + pr_err("%s: Invalid grmnet/buf, grmnet:%pK buf:%pK\n", __func__, gr, buf); return -ENODEV; } @@ -434,7 +434,7 @@ gps_send_cpkt_response(void *gr, void *buf, size_t len) dev = port_to_gps(gr); - pr_debug("%s: dev:%p\n", __func__, dev); + pr_debug("%s: dev:%pK\n", __func__, dev); if (!atomic_read(&dev->online) || !atomic_read(&dev->ctrl_online)) { gps_free_ctrl_pkt(cpkt); @@ -461,7 +461,7 @@ gps_cmd_complete(struct usb_ep *ep, struct usb_request *req) return; } - pr_debug("%s: dev:%p\n", __func__, dev); + pr_debug("%s: dev:%pK\n", __func__, dev); cdev = dev->cdev; @@ -476,7 +476,7 @@ static void gps_notify_complete(struct usb_ep *ep, struct usb_request *req) unsigned long flags; struct rmnet_ctrl_pkt *cpkt; - pr_debug("%s: dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s: dev:%pK port#%d\n", __func__, dev, dev->port_num); switch (status) { case -ECONNRESET: @@ -529,7 +529,7 @@ gps_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) u16 w_length = le16_to_cpu(ctrl->wLength); int ret = -EOPNOTSUPP; - pr_debug("%s:dev:%p\n", __func__, dev); + pr_debug("%s:dev:%pK\n", __func__, dev); if (!atomic_read(&dev->online)) { pr_debug("%s: usb cable is not connected\n", __func__); @@ -700,7 +700,7 @@ static int gps_bind_config(struct usb_configuration *c) struct usb_function *f; unsigned long flags; - pr_debug("%s: usb config:%p\n", __func__, c); + pr_debug("%s: usb config:%pK\n", __func__, c); if (gps_string_defs[0].id == 0) { status = usb_string_id(c->cdev); diff --git a/drivers/usb/gadget/function/f_gsi.c b/drivers/usb/gadget/function/f_gsi.c index 380f62f529496..30686a29e9fca 100644 --- a/drivers/usb/gadget/function/f_gsi.c +++ b/drivers/usb/gadget/function/f_gsi.c @@ -1053,7 +1053,7 @@ static int gsi_ctrl_dev_open(struct inode *ip, struct file *fp) ctrl_device); if (!c_port) { - log_event_err("%s: gsi ctrl port %p", __func__, c_port); + log_event_err("%s: gsi ctrl port %pK", __func__, c_port); return -ENODEV; } @@ -1076,7 +1076,7 @@ static int gsi_ctrl_dev_release(struct inode *ip, struct file *fp) ctrl_device); if (!c_port) { - log_event_err("%s: gsi ctrl port %p", __func__, c_port); + log_event_err("%s: gsi ctrl port %pK", __func__, c_port); return -ENODEV; } @@ -1101,7 +1101,7 @@ gsi_ctrl_dev_read(struct file *fp, char __user *buf, size_t count, loff_t *pos) log_event_dbg("%s: Enter %zu", __func__, count); if (!c_port) { - log_event_err("%s: gsi ctrl port %p", __func__, c_port); + log_event_err("%s: gsi ctrl port %pK", __func__, c_port); return -ENODEV; } @@ -1173,7 +1173,7 @@ static ssize_t gsi_ctrl_dev_write(struct file *fp, const char __user *buf, log_event_dbg("Enter %zu", count); if (!c_port || !req || !req->buf) { - log_event_err("%s: c_port %p req %p req->buf %p", + log_event_err("%s: c_port %pK req %pK req->buf %pK", __func__, c_port, req, req ? req->buf : req); return -ENODEV; } @@ -1233,7 +1233,7 @@ static long gsi_ctrl_dev_ioctl(struct file *fp, unsigned cmd, int val, ret = 0; if (!c_port) { - log_event_err("%s: gsi ctrl port %p", __func__, c_port); + log_event_err("%s: gsi ctrl port %pK", __func__, c_port); return -ENODEV; } @@ -1350,7 +1350,7 @@ static unsigned int gsi_ctrl_dev_poll(struct file *fp, poll_table *wait) unsigned int mask = 0; if (!c_port) { - log_event_err("%s: gsi ctrl port %p", __func__, c_port); + log_event_err("%s: gsi ctrl port %pK", __func__, c_port); return -ENODEV; } @@ -1469,7 +1469,7 @@ void gsi_rndis_ipa_reset_trigger(void) unsigned long flags; if (!rndis) { - log_event_err("%s: gsi prot ctx is %p", __func__, rndis); + log_event_err("%s: gsi prot ctx is %pK", __func__, rndis); return; } @@ -1490,7 +1490,7 @@ void gsi_rndis_flow_ctrl_enable(bool enable) struct gsi_data_port *d_port; if (!rndis) { - log_event_err("%s: gsi prot ctx is %p", __func__, rndis); + log_event_err("%s: gsi prot ctx is %pK", __func__, rndis); return; } @@ -1746,7 +1746,7 @@ gsi_ctrl_set_ntb_cmd_complete(struct usb_ep *ep, struct usb_request *req) struct f_gsi *gsi = req->context; struct gsi_ntb_info *ntb = NULL; - log_event_dbg("dev:%p", gsi); + log_event_dbg("dev:%pK", gsi); req->context = NULL; if (req->status || req->actual != req->length) { @@ -2689,7 +2689,7 @@ static int gsi_bind(struct usb_configuration *c, struct usb_function *f) /* export host's Ethernet address in CDC format */ random_ether_addr(gsi->d_port.ipa_init_params.device_ethaddr); random_ether_addr(gsi->d_port.ipa_init_params.host_ethaddr); - log_event_dbg("setting host_ethaddr=%pM, device_ethaddr = %pM", + log_event_dbg("setting host_ethaddr=%pKM, device_ethaddr = %pKM", gsi->d_port.ipa_init_params.host_ethaddr, gsi->d_port.ipa_init_params.device_ethaddr); memcpy(gsi->ethaddr, &gsi->d_port.ipa_init_params.host_ethaddr, @@ -2821,7 +2821,7 @@ static int gsi_bind(struct usb_configuration *c, struct usb_function *f) /* export host's Ethernet address in CDC format */ random_ether_addr(gsi->d_port.ipa_init_params.device_ethaddr); random_ether_addr(gsi->d_port.ipa_init_params.host_ethaddr); - log_event_dbg("setting host_ethaddr=%pM, device_ethaddr = %pM", + log_event_dbg("setting host_ethaddr=%pKM, device_ethaddr = %pKM", gsi->d_port.ipa_init_params.host_ethaddr, gsi->d_port.ipa_init_params.device_ethaddr); diff --git a/drivers/usb/gadget/function/f_mbim.c b/drivers/usb/gadget/function/f_mbim.c index 499174555154e..84c0066823bc5 100644 --- a/drivers/usb/gadget/function/f_mbim.c +++ b/drivers/usb/gadget/function/f_mbim.c @@ -741,7 +741,7 @@ static void mbim_notify_complete(struct usb_ep *ep, struct usb_request *req) struct f_mbim *mbim = req->context; struct usb_cdc_notification *event = req->buf; - pr_debug("dev:%p\n", mbim); + pr_debug("dev:%pK\n", mbim); spin_lock(&mbim->lock); switch (req->status) { @@ -771,7 +771,7 @@ static void mbim_notify_complete(struct usb_ep *ep, struct usb_request *req) mbim_do_notify(mbim); spin_unlock(&mbim->lock); - pr_debug("dev:%p Exit\n", mbim); + pr_debug("dev:%pK Exit\n", mbim); } static void mbim_ep0out_complete(struct usb_ep *ep, struct usb_request *req) @@ -782,7 +782,7 @@ static void mbim_ep0out_complete(struct usb_ep *ep, struct usb_request *req) struct f_mbim *mbim = func_to_mbim(f); struct mbim_ntb_input_size *ntb = NULL; - pr_debug("dev:%p\n", mbim); + pr_debug("dev:%pK\n", mbim); req->context = NULL; if (req->status || req->actual != req->length) { @@ -820,7 +820,7 @@ static void mbim_ep0out_complete(struct usb_ep *ep, struct usb_request *req) invalid: usb_ep_set_halt(ep); - pr_err("dev:%p Failed\n", mbim); + pr_err("dev:%pK Failed\n", mbim); return; } @@ -855,7 +855,7 @@ fmbim_cmd_complete(struct usb_ep *ep, struct usb_request *req) if (!first_command_sent) first_command_sent = true; - pr_debug("dev:%p port#%d\n", dev, dev->port_num); + pr_debug("dev:%pK port#%d\n", dev, dev->port_num); cpkt = mbim_alloc_ctrl_pkt(len, GFP_ATOMIC); if (!cpkt) { @@ -1195,7 +1195,7 @@ static int mbim_set_alt(struct usb_function *f, unsigned intf, unsigned alt) return ret; } - pr_info("Set mbim port in_desc = 0x%p\n", + pr_info("Set mbim port in_desc = 0x%pK\n", mbim->bam_port.in->desc); ret = config_ep_by_speed(cdev->gadget, f, @@ -1207,7 +1207,7 @@ static int mbim_set_alt(struct usb_function *f, unsigned intf, unsigned alt) return ret; } - pr_info("Set mbim port out_desc = 0x%p\n", + pr_info("Set mbim port out_desc = 0x%pK\n", mbim->bam_port.out->desc); pr_debug("Activate mbim\n"); @@ -1832,7 +1832,7 @@ mbim_write(struct file *fp, const char __user *buf, size_t count, loff_t *pos) pr_debug("Enter(%zu)\n", count); if (!dev || !req || !req->buf) { - pr_err("%s: dev %p req %p req->buf %p\n", + pr_err("%s: dev %pK req %pK req->buf %pK\n", __func__, dev, req, req ? req->buf : req); return -ENODEV; } @@ -1854,7 +1854,7 @@ mbim_write(struct file *fp, const char __user *buf, size_t count, loff_t *pos) } if (dev->not_port.notify_state != MBIM_NOTIFY_RESPONSE_AVAILABLE) { - pr_err("dev:%p state=%d error\n", dev, + pr_err("dev:%pK state=%d error\n", dev, dev->not_port.notify_state); mbim_unlock(&dev->write_excl); return -EINVAL; diff --git a/drivers/usb/gadget/function/f_mtp.c b/drivers/usb/gadget/function/f_mtp.c index a11fdcd848441..36cfda1a21944 100644 --- a/drivers/usb/gadget/function/f_mtp.c +++ b/drivers/usb/gadget/function/f_mtp.c @@ -519,7 +519,7 @@ static int mtp_create_bulk_endpoints(struct mtp_dev *dev, size_t extra_buf_alloc = cdev->gadget->extra_buf_alloc; int i; - DBG(cdev, "create_bulk_endpoints dev: %p\n", dev); + DBG(cdev, "create_bulk_endpoints dev: %pK\n", dev); ep = usb_ep_autoconfig(cdev->gadget, in_desc); if (!ep) { @@ -654,7 +654,7 @@ static ssize_t mtp_read(struct file *fp, char __user *buf, r = -EIO; goto done; } else { - DBG(cdev, "rx %p queue\n", req); + DBG(cdev, "rx %pK queue\n", req); } /* wait for a request to complete */ @@ -679,7 +679,7 @@ static ssize_t mtp_read(struct file *fp, char __user *buf, if (req->actual == 0) goto requeue_req; - DBG(cdev, "rx %p %d\n", req, req->actual); + DBG(cdev, "rx %pK %d\n", req, req->actual); xfer = (req->actual < count) ? req->actual : count; r = xfer; if (copy_to_user(buf, req->buf, xfer)) @@ -959,7 +959,7 @@ static void receive_file_work(struct work_struct *data) } if (write_req) { - DBG(cdev, "rx %p %d\n", write_req, write_req->actual); + DBG(cdev, "rx %pK %d\n", write_req, write_req->actual); start_time = ktime_get(); ret = vfs_write(filp, write_req->buf, write_req->actual, &offset); @@ -1393,7 +1393,7 @@ mtp_function_bind(struct usb_configuration *c, struct usb_function *f) int ret; dev->cdev = cdev; - DBG(cdev, "mtp_function_bind dev: %p\n", dev); + DBG(cdev, "mtp_function_bind dev: %pK\n", dev); /* allocate interface ID(s) */ id = usb_interface_id(c, f); diff --git a/drivers/usb/gadget/function/f_obex.c b/drivers/usb/gadget/function/f_obex.c index a1b79c53499c2..a28459d209e5d 100644 --- a/drivers/usb/gadget/function/f_obex.c +++ b/drivers/usb/gadget/function/f_obex.c @@ -403,7 +403,7 @@ static int obex_bind(struct usb_configuration *c, struct usb_function *f) if (obex->port.in) obex->port.in->driver_data = NULL; - ERROR(cdev, "%s/%p: can't bind, err %d\n", f->name, f, status); + ERROR(cdev, "%s/%pK: can't bind, err %d\n", f->name, f, status); return status; } diff --git a/drivers/usb/gadget/function/f_qc_ecm.c b/drivers/usb/gadget/function/f_qc_ecm.c index 847eb953ec61c..6b7a3a87b97e4 100644 --- a/drivers/usb/gadget/function/f_qc_ecm.c +++ b/drivers/usb/gadget/function/f_qc_ecm.c @@ -1133,7 +1133,7 @@ ecm_qc_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], if (ecm->xport != USB_GADGET_XPORT_BAM2BAM_IPA) return status; - pr_debug("setting ecm_ipa, host_ethaddr=%pM, device_ethaddr=%pM", + pr_debug("setting ecm_ipa, host_ethaddr=%pKM, device_ethaddr=%pKM", ipa_params.host_ethaddr, ipa_params.device_ethaddr); status = ecm_ipa_init(&ipa_params); if (status) { diff --git a/drivers/usb/gadget/function/f_qc_rndis.c b/drivers/usb/gadget/function/f_qc_rndis.c index b74462750a4a1..f2553f52ebfe1 100644 --- a/drivers/usb/gadget/function/f_qc_rndis.c +++ b/drivers/usb/gadget/function/f_qc_rndis.c @@ -1234,7 +1234,7 @@ rndis_qc_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], if (rndis->xport == USB_GADGET_XPORT_BAM2BAM_IPA) { gether_qc_get_macs(rndis_ipa_params.device_ethaddr, rndis_ipa_params.host_ethaddr); - pr_debug("setting host_ethaddr=%pM, device_ethaddr=%pM\n", + pr_debug("setting host_ethaddr=%pKM, device_ethaddr=%pKM\n", rndis_ipa_params.host_ethaddr, rndis_ipa_params.device_ethaddr); rndis_ipa_supported = true; diff --git a/drivers/usb/gadget/function/f_qdss.c b/drivers/usb/gadget/function/f_qdss.c index 476553322fcac..bc9783fb32d67 100644 --- a/drivers/usb/gadget/function/f_qdss.c +++ b/drivers/usb/gadget/function/f_qdss.c @@ -719,7 +719,7 @@ static void usb_qdss_connect_work(struct work_struct *work) dxport = qdss_ports[qdss->port_num].data_xport; ctrl_xport = qdss_ports[qdss->port_num].ctrl_xport; port_num = qdss_ports[qdss->port_num].data_xport_num; - pr_debug("%s: data xport: %s dev: %p portno: %d\n", + pr_debug("%s: data xport: %s dev: %pK portno: %d\n", __func__, xport_to_str(dxport), qdss, qdss->port_num); if (qdss->port_num >= nr_qdss_ports) { @@ -825,7 +825,7 @@ static int qdss_set_alt(struct usb_function *f, unsigned intf, unsigned alt) dxport = qdss_ports[qdss->port_num].data_xport; - pr_debug("qdss_set_alt qdss pointer = %p\n", qdss); + pr_debug("qdss_set_alt qdss pointer = %pK\n", qdss); qdss->gadget = gadget; diff --git a/drivers/usb/gadget/function/f_rmnet.c b/drivers/usb/gadget/function/f_rmnet.c index 3a26cc2b4632e..1b3f0940b7de8 100644 --- a/drivers/usb/gadget/function/f_rmnet.c +++ b/drivers/usb/gadget/function/f_rmnet.c @@ -383,7 +383,7 @@ static int gport_rmnet_connect(struct f_rmnet *dev, unsigned intf) enum usb_ctrl usb_bam_type; void *net; - pr_debug("%s: ctrl xport: %s data xport: %s dev: %p portno: %d\n", + pr_debug("%s: ctrl xport: %s data xport: %s dev: %pK portno: %d\n", __func__, xport_to_str(cxport), xport_to_str(dxport), dev, dev->port_num); @@ -504,7 +504,7 @@ static int gport_rmnet_disconnect(struct f_rmnet *dev) enum transport_type cxport = rmnet_ports[dev->port_num].ctrl_xport; enum transport_type dxport = rmnet_ports[dev->port_num].data_xport; - pr_debug("%s: ctrl xport: %s data xport: %s dev: %p portno: %d\n", + pr_debug("%s: ctrl xport: %s data xport: %s dev: %pK portno: %d\n", __func__, xport_to_str(cxport), xport_to_str(dxport), dev, dev->port_num); @@ -601,7 +601,7 @@ static void frmnet_suspend(struct usb_function *f) else remote_wakeup_allowed = f->config->cdev->gadget->remote_wakeup; - pr_debug("%s: data xport: %s dev: %p portno: %d remote_wakeup: %d\n", + pr_debug("%s: data xport: %s dev: %pK portno: %d remote_wakeup: %d\n", __func__, xport_to_str(dxport), dev, dev->port_num, remote_wakeup_allowed); @@ -625,7 +625,7 @@ static void frmnet_suspend(struct usb_function *f) */ dev->in_ep_desc_backup = dev->port.in->desc; dev->out_ep_desc_backup = dev->port.out->desc; - pr_debug("in_ep_desc_bkup = %p, out_ep_desc_bkup = %p", + pr_debug("in_ep_desc_bkup = %pK, out_ep_desc_bkup = %pK", dev->in_ep_desc_backup, dev->out_ep_desc_backup); pr_debug("%s(): Disconnecting\n", __func__); if (gadget_is_dwc3(f->config->cdev->gadget)) { @@ -662,7 +662,7 @@ static void frmnet_resume(struct usb_function *f) else remote_wakeup_allowed = f->config->cdev->gadget->remote_wakeup; - pr_debug("%s: data xport: %s dev: %p portno: %d remote_wakeup: %d\n", + pr_debug("%s: data xport: %s dev: %pK portno: %d remote_wakeup: %d\n", __func__, xport_to_str(dxport), dev, dev->port_num, remote_wakeup_allowed); @@ -729,7 +729,7 @@ frmnet_set_alt(struct usb_function *f, unsigned intf, unsigned alt) int ret; struct list_head *cpkt; - pr_debug("%s:dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s:dev:%pK port#%d\n", __func__, dev, dev->port_num); if (dev->notify->driver_data) { pr_debug("%s: reset port:%d\n", __func__, dev->port_num); @@ -795,7 +795,7 @@ static void frmnet_ctrl_response_available(struct f_rmnet *dev) int ret; struct rmnet_ctrl_pkt *cpkt; - pr_debug("%s:dev:%p portno#%d\n", __func__, dev, dev->port_num); + pr_debug("%s:dev:%pK portno#%d\n", __func__, dev, dev->port_num); spin_lock_irqsave(&dev->lock, flags); if (!atomic_read(&dev->online) || !req || !req->buf) { @@ -844,7 +844,7 @@ static void frmnet_connect(struct grmnet *gr) struct f_rmnet *dev; if (!gr) { - pr_err("%s: Invalid grmnet:%p\n", __func__, gr); + pr_err("%s: Invalid grmnet:%pK\n", __func__, gr); return; } @@ -860,7 +860,7 @@ static void frmnet_disconnect(struct grmnet *gr) int status; if (!gr) { - pr_err("%s: Invalid grmnet:%p\n", __func__, gr); + pr_err("%s: Invalid grmnet:%pK\n", __func__, gr); return; } @@ -902,7 +902,7 @@ frmnet_send_cpkt_response(void *gr, void *buf, size_t len) unsigned long flags; if (!gr || !buf) { - pr_err("%s: Invalid grmnet/buf, grmnet:%p buf:%p\n", + pr_err("%s: Invalid grmnet/buf, grmnet:%pK buf:%pK\n", __func__, gr, buf); return -ENODEV; } @@ -916,7 +916,7 @@ frmnet_send_cpkt_response(void *gr, void *buf, size_t len) dev = port_to_rmnet(gr); - pr_debug("%s: dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s: dev:%pK port#%d\n", __func__, dev, dev->port_num); if (!atomic_read(&dev->online) || !atomic_read(&dev->ctrl_online)) { rmnet_free_ctrl_pkt(cpkt); @@ -944,7 +944,7 @@ frmnet_cmd_complete(struct usb_ep *ep, struct usb_request *req) return; } - pr_debug("%s: dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s: dev:%pK port#%d\n", __func__, dev, dev->port_num); cdev = dev->cdev; @@ -961,7 +961,7 @@ static void frmnet_notify_complete(struct usb_ep *ep, struct usb_request *req) unsigned long flags; struct rmnet_ctrl_pkt *cpkt; - pr_debug("%s: dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s: dev:%pK port#%d\n", __func__, dev, dev->port_num); switch (status) { case -ECONNRESET: @@ -1030,7 +1030,7 @@ frmnet_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) u16 w_length = le16_to_cpu(ctrl->wLength); int ret = -EOPNOTSUPP; - pr_debug("%s:dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s:dev:%pK port#%d\n", __func__, dev, dev->port_num); if (!atomic_read(&dev->online)) { pr_warning("%s: usb cable is not connected\n", __func__); @@ -1256,7 +1256,7 @@ static int frmnet_bind_config(struct usb_configuration *c, unsigned portno) struct usb_function *f; unsigned long flags; - pr_debug("%s: usb config:%p\n", __func__, c); + pr_debug("%s: usb config:%pK\n", __func__, c); if (portno >= nr_rmnet_ports) { pr_err("%s: supporting ports#%u port_id:%u\n", __func__, diff --git a/drivers/usb/gadget/function/f_serial.c b/drivers/usb/gadget/function/f_serial.c index 25963de5777e3..71a5d71372c76 100644 --- a/drivers/usb/gadget/function/f_serial.c +++ b/drivers/usb/gadget/function/f_serial.c @@ -379,7 +379,7 @@ static int gport_connect(struct f_gser *gser) unsigned port_num; int ret; - pr_debug("%s: transport: %s f_gser: %p gserial: %p port_num: %d\n", + pr_debug("%s: transport: %s f_gser: %pK gserial: %pK port_num: %d\n", __func__, xport_to_str(gser->transport), gser, &gser->port, gser->port_num); @@ -425,7 +425,7 @@ static int gport_disconnect(struct f_gser *gser) port_num = gserial_ports[gser->port_num].client_port_num; - pr_debug("%s: transport: %s f_gser: %p gserial: %p port_num: %d\n", + pr_debug("%s: transport: %s f_gser: %pK gserial: %pK port_num: %d\n", __func__, xport_to_str(gser->transport), gser, &gser->port, gser->port_num); @@ -626,7 +626,7 @@ static void gser_suspend(struct usb_function *f) port_num = gserial_ports[gser->port_num].client_port_num; - pr_debug("%s: transport: %s f_gser: %p gserial: %p port_num: %d\n", + pr_debug("%s: transport: %s f_gser: %pK gserial: %pK port_num: %d\n", __func__, xport_to_str(gser->transport), gser, &gser->port, gser->port_num); @@ -648,7 +648,7 @@ static void gser_resume(struct usb_function *f) port_num = gserial_ports[gser->port_num].client_port_num; - pr_debug("%s: transport: %s f_gser: %p gserial: %p port_num: %d\n", + pr_debug("%s: transport: %s f_gser: %pK gserial: %pK port_num: %d\n", __func__, xport_to_str(gser->transport), gser, &gser->port, gser->port_num); /* diff --git a/drivers/usb/gadget/function/u_bam.c b/drivers/usb/gadget/function/u_bam.c index d3c27c30f2804..3093017c21028 100644 --- a/drivers/usb/gadget/function/u_bam.c +++ b/drivers/usb/gadget/function/u_bam.c @@ -230,7 +230,7 @@ static int gbam_alloc_requests(struct usb_ep *ep, struct list_head *head, { int i; struct usb_request *req; - pr_debug("%s: ep:%p head:%p num:%d cb:%p", __func__, + pr_debug("%s: ep:%pK head:%pK num:%d cb:%pK", __func__, ep, head, num, cb); for (i = 0; i < num; i++) { @@ -492,7 +492,7 @@ void gbam_data_recv_cb(void *p, struct sk_buff *skb) if (!skb) return; - pr_debug("%s: p:%p#%d d:%p skb_len:%d\n", __func__, + pr_debug("%s: p:%pK#%d d:%pK skb_len:%d\n", __func__, port, port->port_num, d, skb->len); spin_lock_irqsave(&port->port_lock_dl, flags); @@ -533,7 +533,7 @@ void gbam_data_write_done(void *p, struct sk_buff *skb) d->pending_bytes_with_bam -= skb->len; gbam_free_skb_to_pool(port, skb); - pr_debug("%s:port:%p d:%p tom:%lu ppkt:%u pbytes:%u pno:%d\n", __func__, + pr_debug("%s:port:%pK d:%pK tom:%lu ppkt:%u pbytes:%u pno:%d\n", __func__, port, d, d->to_modem, d->pending_pkts_with_bam, d->pending_bytes_with_bam, port->port_num); @@ -609,7 +609,7 @@ static void gbam_data_write_tobam(struct work_struct *w) d->pending_bytes_with_bam += skb->len; d->to_modem++; - pr_debug("%s: port:%p d:%p tom:%lu ppkts:%u pbytes:%u pno:%d\n", + pr_debug("%s: port:%pK d:%pK tom:%lu ppkts:%u pbytes:%u pno:%d\n", __func__, port, d, d->to_modem, d->pending_pkts_with_bam, d->pending_bytes_with_bam, port->port_num); @@ -1098,7 +1098,7 @@ static void gbam_start_io(struct gbam_port *port) { unsigned long flags; - pr_debug("%s: port:%p\n", __func__, port); + pr_debug("%s: port:%pK\n", __func__, port); if (_gbam_start_io(port, true)) return; @@ -1829,7 +1829,7 @@ static int gbam_port_alloc(int portno) pdrv->driver.owner = THIS_MODULE; platform_driver_register(pdrv); - pr_debug("%s: port:%p portno:%d\n", __func__, port, portno); + pr_debug("%s: port:%pK portno:%d\n", __func__, port, portno); return 0; } @@ -1869,7 +1869,7 @@ static int gbam2bam_port_alloc(int portno) INIT_LIST_HEAD(&d->rx_idle); INIT_WORK(&d->write_tobam_w, gbam_data_write_tobam); - pr_debug("%s: port:%p portno:%d\n", __func__, port, portno); + pr_debug("%s: port:%pK portno:%d\n", __func__, port, portno); return 0; } @@ -1901,7 +1901,7 @@ static ssize_t gbam_read_stats(struct file *file, char __user *ubuf, d = &port->data_ch; temp += scnprintf(buf + temp, DEBUG_BUF_SIZE - temp, - "#PORT:%d port:%p data_ch:%p#\n" + "#PORT:%d port:%pK data_ch:%pK#\n" "dpkts_to_usbhost: %lu\n" "dpkts_to_modem: %lu\n" "dpkts_pwith_bam: %u\n" @@ -2024,7 +2024,7 @@ void gbam_disconnect(struct grmnet *gr, u8 port_num, enum transport_type trans) unsigned long flags, flags_ul, flags_dl; struct bam_ch_info *d; - pr_debug("%s: grmnet:%p port#%d\n", __func__, gr, port_num); + pr_debug("%s: grmnet:%pK port#%d\n", __func__, gr, port_num); if (trans == USB_GADGET_XPORT_BAM2BAM) { pr_err("%s: invalid xport#%d\n", __func__, trans); @@ -2152,7 +2152,7 @@ int gbam_connect(struct grmnet *gr, u8 port_num, int ret; unsigned long flags, flags_ul; - pr_debug("%s: grmnet:%p port#%d\n", __func__, gr, port_num); + pr_debug("%s: grmnet:%pK port#%d\n", __func__, gr, port_num); if (!gr) { pr_err("%s: grmnet port is null\n", __func__); @@ -2297,7 +2297,7 @@ int gbam_connect(struct grmnet *gr, u8 port_num, ret = usb_ep_enable(gr->in); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:IN ep:%p", + pr_err("%s: usb_ep_enable failed eptype:IN ep:%pK", __func__, gr->in); usb_ep_free_request(port->port_usb->out, d->rx_req); d->rx_req = NULL; @@ -2320,7 +2320,7 @@ int gbam_connect(struct grmnet *gr, u8 port_num, if (gr->out) { ret = usb_ep_enable(gr->out); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:OUT ep:%p", + pr_err("%s: usb_ep_enable failed eptype:OUT ep:%pK", __func__, gr->out); gr->in->driver_data = 0; usb_ep_disable(gr->in); diff --git a/drivers/usb/gadget/function/u_bam_data.c b/drivers/usb/gadget/function/u_bam_data.c index 5d6549e91fbd5..9199adc38eb3a 100644 --- a/drivers/usb/gadget/function/u_bam_data.c +++ b/drivers/usb/gadget/function/u_bam_data.c @@ -166,7 +166,7 @@ static int bam_data_alloc_requests(struct usb_ep *ep, struct list_head *head, struct bam_data_ch_info *d = &port->data_ch; struct usb_request *req; - pr_debug("%s: ep:%p head:%p num:%d cb:%p", __func__, + pr_debug("%s: ep:%pK head:%pK num:%d cb:%pK", __func__, ep, head, num, cb); if (d->alloc_rx_reqs) { @@ -292,7 +292,7 @@ static void bam_data_write_done(void *p, struct sk_buff *skb) d->pending_with_bam--; - pr_debug("%s: port:%p d:%p pbam:%u, pno:%d\n", __func__, + pr_debug("%s: port:%pK d:%pK pbam:%u, pno:%d\n", __func__, port, d, d->pending_with_bam, port->port_num); spin_unlock_irqrestore(&port->port_lock, flags); @@ -528,7 +528,7 @@ static void bam_data_write_toipa(struct work_struct *w) d->pending_with_bam++; - pr_debug("%s: port:%p d:%p pbam:%u pno:%d\n", __func__, + pr_debug("%s: port:%pK d:%pK pbam:%u pno:%d\n", __func__, port, d, d->pending_with_bam, port->port_num); spin_unlock_irqrestore(&port->port_lock, flags); @@ -811,7 +811,7 @@ static void bam2bam_data_disconnect_work(struct work_struct *w) usb_gadget_autopm_put_async(port->gadget); spin_unlock_irqrestore(&port->port_lock, flags); - pr_debug("Disconnect workqueue done (port %p)\n", port); + pr_debug("Disconnect workqueue done (port %pK)\n", port); } /* * This function configured data fifo based on index passed to get bam2bam @@ -1153,7 +1153,7 @@ static void bam2bam_data_connect_work(struct work_struct *w) bam_data_start_rx_transfers(d, port); bam_data_start_endless_tx(port); - pr_debug("Connect workqueue done (port %p)", port); + pr_debug("Connect workqueue done (port %pK)", port); return; disconnect_ipa: @@ -1196,7 +1196,7 @@ void bam_data_start_rx_tx(u8 port_num) } if (!d->rx_req || !d->tx_req) { - pr_err("%s: No request d->rx_req=%p, d->tx_req=%p", __func__, + pr_err("%s: No request d->rx_req=%pK, d->tx_req=%pK", __func__, d->rx_req, d->tx_req); goto out; } @@ -1368,7 +1368,7 @@ void bam_data_disconnect(struct data_port *gr, enum function_type func, return; } - pr_debug("dev:%p port number:%d\n", gr, port_num); + pr_debug("dev:%pK port number:%d\n", gr, port_num); if (!gr) { pr_err("data port is null\n"); @@ -1515,7 +1515,7 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans, return -EINVAL; } - pr_debug("dev:%p port#%d\n", gr, port_num); + pr_debug("dev:%pK port#%d\n", gr, port_num); usb_bam_type = usb_bam_get_bam_type(gr->cdev->gadget->name); @@ -1592,7 +1592,7 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans, ret = usb_ep_enable(gr->in); if (ret) { - pr_err("usb_ep_enable failed eptype:IN ep:%p", gr->in); + pr_err("usb_ep_enable failed eptype:IN ep:%pK", gr->in); goto exit; } @@ -1600,7 +1600,7 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans, ret = usb_ep_enable(gr->out); if (ret) { - pr_err("usb_ep_enable failed eptype:OUT ep:%p", gr->out); + pr_err("usb_ep_enable failed eptype:OUT ep:%pK", gr->out); goto disable_in_ep; } @@ -1871,7 +1871,7 @@ void bam_data_suspend(struct data_port *port_usb, u8 dev_port_num, port_usb->in_ep_desc_backup = port_usb->in->desc; port_usb->out_ep_desc_backup = port_usb->out->desc; - pr_debug("in_ep_desc_backup = %p, out_ep_desc_backup = %p", + pr_debug("in_ep_desc_backup = %pK, out_ep_desc_backup = %pK", port_usb->in_ep_desc_backup, port_usb->out_ep_desc_backup); @@ -1912,7 +1912,7 @@ void bam_data_resume(struct data_port *port_usb, u8 dev_port_num, port_usb->in->desc = port_usb->in_ep_desc_backup; port_usb->out->desc = port_usb->out_ep_desc_backup; - pr_debug("in_ep_desc_backup = %p, out_ep_desc_backup = %p", + pr_debug("in_ep_desc_backup = %pK, out_ep_desc_backup = %pK", port_usb->in_ep_desc_backup, port_usb->out_ep_desc_backup); diff --git a/drivers/usb/gadget/function/u_ctrl_hsic.c b/drivers/usb/gadget/function/u_ctrl_hsic.c index 7bbf4e4705fa0..e5dfb74d9b75c 100644 --- a/drivers/usb/gadget/function/u_ctrl_hsic.c +++ b/drivers/usb/gadget/function/u_ctrl_hsic.c @@ -185,7 +185,7 @@ static void ghsic_ctrl_connect_w(struct work_struct *w) if (!port || !test_bit(CH_READY, &port->bridge_sts)) return; - pr_debug("%s: port:%p port type =%u\n", __func__, port, port->gtype); + pr_debug("%s: port:%pK port type =%u\n", __func__, port, port->gtype); retval = ctrl_bridge_open(&port->brdg); if (retval) { @@ -482,7 +482,7 @@ static int gctrl_port_alloc(int portno, enum gadget_type gtype) platform_driver_register(pdrv); - pr_debug("%s: port:%p portno:%d\n", __func__, port, portno); + pr_debug("%s: port:%pK portno:%d\n", __func__, port, portno); return 0; } @@ -574,7 +574,7 @@ static ssize_t gctrl_read_stats(struct file *file, char __user *ubuf, temp += scnprintf(buf + temp, DEBUG_BUF_SIZE - temp, "\nName: %s\n" - "#PORT:%d port: %p\n" + "#PORT:%d port: %pK\n" "to_usbhost: %lu\n" "to_modem: %lu\n" "cpkt_drp_cnt: %lu\n" diff --git a/drivers/usb/gadget/function/u_ctrl_qti.c b/drivers/usb/gadget/function/u_ctrl_qti.c index a9a8ab4618e89..2e16f0a324bc9 100644 --- a/drivers/usb/gadget/function/u_ctrl_qti.c +++ b/drivers/usb/gadget/function/u_ctrl_qti.c @@ -88,7 +88,7 @@ static void qti_ctrl_queue_notify(struct qti_ctrl_port *port) spin_lock_irqsave(&port->lock, flags); if (!port->is_open) { - pr_err("%s: rmnet ctrl file handler %p is not open", + pr_err("%s: rmnet ctrl file handler %pK is not open", __func__, port); spin_unlock_irqrestore(&port->lock, flags); return; @@ -141,7 +141,7 @@ static int gqti_ctrl_send_cpkt_tomodem(u8 portno, void *buf, size_t len) /* drop cpkt if port is not open */ if (!port->is_open) { - pr_debug("rmnet file handler %p(index=%d) is not open", + pr_debug("rmnet file handler %pK(index=%d) is not open", port, port->index); port->drp_cpkt_cnt++; spin_unlock_irqrestore(&port->lock, flags); @@ -185,7 +185,7 @@ int gqti_ctrl_connect(void *gr, u8 port_num, unsigned intf, struct gqdss *g_dpl = NULL; unsigned long flags; - pr_debug("%s: gtype:%d gadget:%p\n", __func__, gtype, gr); + pr_debug("%s: gtype:%d gadget:%pK\n", __func__, gtype, gr); if (port_num >= NR_QTI_PORTS) { pr_err("%s: Invalid QTI port %d\n", __func__, port_num); return -ENODEV; @@ -261,7 +261,7 @@ void gqti_ctrl_disconnect(void *gr, u8 port_num) struct grmnet *g_rmnet = NULL; struct gqdss *g_dpl = NULL; - pr_debug("%s: gadget:%p\n", __func__, gr); + pr_debug("%s: gadget:%pK\n", __func__, gr); if (port_num >= NR_QTI_PORTS) { pr_err("%s: Invalid QTI port %d\n", __func__, port_num); @@ -659,7 +659,7 @@ static int qti_ctrl_read_stats(struct seq_file *s, void *unused) continue; spin_lock_irqsave(&port->lock, flags); - seq_printf(s, "\n#PORT:%d port: %p\n", i, port); + seq_printf(s, "\n#PORT:%d port: %pK\n", i, port); seq_printf(s, "name: %s\n", port->name); seq_printf(s, "host_to_modem: %d\n", port->host_to_modem); diff --git a/drivers/usb/gadget/function/u_data_bridge.c b/drivers/usb/gadget/function/u_data_bridge.c index 1cc7350ed13a7..2d55fdd710d4a 100644 --- a/drivers/usb/gadget/function/u_data_bridge.c +++ b/drivers/usb/gadget/function/u_data_bridge.c @@ -138,7 +138,7 @@ static int gbridge_alloc_requests(struct usb_ep *ep, struct list_head *head, int i; struct usb_request *req; - pr_debug("ep:%p head:%p num:%d size:%d cb:%p", + pr_debug("ep:%pK head:%pK num:%d size:%d cb:%pK", ep, head, num, size, cb); for (i = 0; i < num; i++) { @@ -188,7 +188,7 @@ static void gbridge_start_rx(struct gbridge_port *port) ret = usb_ep_queue(ep, req, GFP_KERNEL); spin_lock_irqsave(&port->port_lock, flags); if (ret) { - pr_err("port(%d):%p usb ep(%s) queue failed\n", + pr_err("port(%d):%pK usb ep(%s) queue failed\n", port->port_num, port, ep->name); list_add(&req->list, pool); break; @@ -203,7 +203,7 @@ static void gbridge_read_complete(struct usb_ep *ep, struct usb_request *req) struct gbridge_port *port = ep->driver_data; unsigned long flags; - pr_debug("ep:(%p)(%s) port:%p req_status:%d req->actual:%u\n", + pr_debug("ep:(%pK)(%s) port:%pK req_status:%d req->actual:%u\n", ep, ep->name, port, req->status, req->actual); if (!port) { pr_err("port is null\n"); @@ -230,7 +230,7 @@ static void gbridge_write_complete(struct usb_ep *ep, struct usb_request *req) unsigned long flags; struct gbridge_port *port = ep->driver_data; - pr_debug("ep:(%p)(%s) port:%p req_stats:%d\n", + pr_debug("ep:(%pK)(%s) port:%pK req_stats:%d\n", ep, ep->name, port, req->status); spin_lock_irqsave(&port->port_lock, flags); @@ -266,7 +266,7 @@ static void gbridge_start_io(struct gbridge_port *port) int ret = -ENODEV; unsigned long flags; - pr_debug("port: %p\n", port); + pr_debug("port: %pK\n", port); spin_lock_irqsave(&port->port_lock, flags); if (!port->port_usb) @@ -309,7 +309,7 @@ static void gbridge_stop_io(struct gbridge_port *port) struct usb_ep *out; unsigned long flags; - pr_debug("port:%p\n", port); + pr_debug("port:%pK\n", port); spin_lock_irqsave(&port->port_lock, flags); if (!port->port_usb) { spin_unlock_irqrestore(&port->port_lock, flags); @@ -358,7 +358,7 @@ int gbridge_port_open(struct inode *inode, struct file *file) } file->private_data = port; - pr_debug("opening port(%p)\n", port); + pr_debug("opening port(%pK)\n", port); ret = wait_event_interruptible(port->open_wq, port->is_connected); if (ret) { @@ -371,7 +371,7 @@ int gbridge_port_open(struct inode *inode, struct file *file) spin_unlock_irqrestore(&port->port_lock, flags); gbridge_start_rx(port); - pr_debug("port(%p) open is success\n", port); + pr_debug("port(%pK) open is success\n", port); return 0; } @@ -387,12 +387,12 @@ int gbridge_port_release(struct inode *inode, struct file *file) return -EINVAL; } - pr_debug("closing port(%p)\n", port); + pr_debug("closing port(%pK)\n", port); spin_lock_irqsave(&port->port_lock, flags); port->port_open = false; port->cbits_updated = false; spin_unlock_irqrestore(&port->port_lock, flags); - pr_debug("port(%p) is closed.\n", port); + pr_debug("port(%pK) is closed.\n", port); return 0; } @@ -416,7 +416,7 @@ ssize_t gbridge_port_read(struct file *file, return -EINVAL; } - pr_debug("read on port(%p) count:%zu\n", port, count); + pr_debug("read on port(%pK) count:%zu\n", port, count); spin_lock_irqsave(&port->port_lock, flags); current_rx_req = port->current_rx_req; pending_rx_bytes = port->pending_rx_bytes; @@ -517,7 +517,7 @@ ssize_t gbridge_port_write(struct file *file, } spin_lock_irqsave(&port->port_lock, flags); - pr_debug("write on port(%p)\n", port); + pr_debug("write on port(%pK)\n", port); if (!port->is_connected || !port->port_usb) { spin_unlock_irqrestore(&port->port_lock, flags); @@ -705,7 +705,7 @@ static long gbridge_port_ioctl(struct file *fp, unsigned cmd, case TIOCMBIC: case TIOCMBIS: case TIOCMSET: - pr_debug("TIOCMSET on port:%p\n", port); + pr_debug("TIOCMSET on port:%pK\n", port); i = get_user(val, (uint32_t *)arg); if (i) { pr_err("Error getting TIOCMSET value\n"); @@ -714,7 +714,7 @@ static long gbridge_port_ioctl(struct file *fp, unsigned cmd, ret = gbridge_port_tiocmset(port, val, ~val); break; case TIOCMGET: - pr_debug("TIOCMGET on port:%p\n", port); + pr_debug("TIOCMGET on port:%pK\n", port); ret = gbridge_port_tiocmget(port); if (ret >= 0) { ret = put_user(ret, (uint32_t *)arg); @@ -887,7 +887,7 @@ static void gbridge_debugfs_init(void) {} int gbridge_setup(void *gptr, u8 no_ports) { - pr_debug("gptr:%p, no_bridge_ports:%d\n", gptr, no_ports); + pr_debug("gptr:%pK, no_bridge_ports:%d\n", gptr, no_ports); if (no_ports >= num_of_instance) { pr_err("More ports are requested\n"); return -EINVAL; @@ -910,7 +910,7 @@ int gbridge_connect(void *gptr, u8 portno) return -EINVAL; } - pr_debug("gbridge:%p portno:%u\n", gptr, portno); + pr_debug("gbridge:%pK portno:%u\n", gptr, portno); port = ports[portno]; gser = gptr; @@ -921,7 +921,7 @@ int gbridge_connect(void *gptr, u8 portno) ret = usb_ep_enable(gser->in); if (ret) { - pr_err("usb_ep_enable failed eptype:IN ep:%p, err:%d", + pr_err("usb_ep_enable failed eptype:IN ep:%pK, err:%d", gser->in, ret); port->port_usb = 0; return ret; @@ -930,7 +930,7 @@ int gbridge_connect(void *gptr, u8 portno) ret = usb_ep_enable(gser->out); if (ret) { - pr_err("usb_ep_enable failed eptype:OUT ep:%p, err: %d", + pr_err("usb_ep_enable failed eptype:OUT ep:%pK, err: %d", gser->out, ret); port->port_usb = 0; gser->in->driver_data = 0; @@ -958,7 +958,7 @@ void gbridge_disconnect(void *gptr, u8 portno) return; } - pr_debug("gptr:%p portno:%u\n", gptr, portno); + pr_debug("gptr:%pK portno:%u\n", gptr, portno); if (portno >= num_of_instance) { pr_err("Wrong port no %d\n", portno); return; @@ -1010,7 +1010,7 @@ static int gbridge_port_alloc(int portno) INIT_LIST_HEAD(&ports[portno]->read_pool); INIT_LIST_HEAD(&ports[portno]->read_queued); INIT_LIST_HEAD(&ports[portno]->write_pool); - pr_debug("port:%p portno:%d\n", ports[portno], portno); + pr_debug("port:%pK portno:%d\n", ports[portno], portno); return 0; } diff --git a/drivers/usb/gadget/function/u_data_hsic.c b/drivers/usb/gadget/function/u_data_hsic.c index 07bb5a8fac5f1..c02c798a82ae7 100644 --- a/drivers/usb/gadget/function/u_data_hsic.c +++ b/drivers/usb/gadget/function/u_data_hsic.c @@ -156,7 +156,7 @@ static int ghsic_data_alloc_requests(struct usb_ep *ep, struct list_head *head, struct usb_request *req; unsigned long flags; - pr_debug("%s: ep:%s head:%p num:%d cb:%p", __func__, + pr_debug("%s: ep:%s head:%pK num:%d cb:%pK", __func__, ep->name, head, num, cb); for (i = 0; i < num; i++) { @@ -272,7 +272,7 @@ static int ghsic_data_receive(void *p, void *data, size_t len) return -ENOTCONN; } - pr_debug("%s: p:%p#%d skb_len:%d\n", __func__, + pr_debug("%s: p:%pK#%d skb_len:%d\n", __func__, port, port->port_num, skb->len); spin_lock_irqsave(&port->tx_lock, flags); @@ -316,7 +316,7 @@ static void ghsic_data_write_tomdm(struct work_struct *w) } while ((skb = __skb_dequeue(&port->rx_skb_q))) { - pr_debug("%s: port:%p tom:%lu pno:%d\n", __func__, + pr_debug("%s: port:%pK tom:%lu pno:%d\n", __func__, port, port->to_modem, port->port_num); info = (struct timestamp_info *)skb->cb; @@ -424,7 +424,7 @@ static void ghsic_data_start_rx(struct gdata_port *port) struct timestamp_info *info; unsigned int created; - pr_debug("%s: port:%p\n", __func__, port); + pr_debug("%s: port:%pK\n", __func__, port); if (!port) return; @@ -481,7 +481,7 @@ static void ghsic_data_start_io(struct gdata_port *port) struct usb_ep *ep_out, *ep_in; int ret; - pr_debug("%s: port:%p\n", __func__, port); + pr_debug("%s: port:%pK\n", __func__, port); if (!port) return; @@ -508,7 +508,7 @@ static void ghsic_data_start_io(struct gdata_port *port) spin_lock_irqsave(&port->tx_lock, flags); ep_in = port->in; spin_unlock_irqrestore(&port->tx_lock, flags); - pr_debug("%s: ep_in:%p\n", __func__, ep_in); + pr_debug("%s: ep_in:%pK\n", __func__, ep_in); if (!ep_in) { spin_lock_irqsave(&port->rx_lock, flags); @@ -543,7 +543,7 @@ static void ghsic_data_connect_w(struct work_struct *w) !test_bit(CH_READY, &port->bridge_sts)) return; - pr_debug("%s: port:%p\n", __func__, port); + pr_debug("%s: port:%pK\n", __func__, port); ret = data_bridge_open(&port->brdg); if (ret) { @@ -855,14 +855,14 @@ int ghsic_data_connect(void *gptr, int port_num) ret = usb_ep_enable(port->in); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:IN ep:%p", + pr_err("%s: usb_ep_enable failed eptype:IN ep:%pK", __func__, port->in); goto fail; } if (port->out) { ret = usb_ep_enable(port->out); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:OUT ep:%p", + pr_err("%s: usb_ep_enable failed eptype:OUT ep:%pK", __func__, port->out); usb_ep_disable(port->in); goto fail; @@ -939,7 +939,7 @@ static void dbg_timestamp(char *event, struct sk_buff * skb) write_lock_irqsave(&dbg_data.lck, flags); scnprintf(dbg_data.buf[dbg_data.idx], DBG_DATA_MSG, - "%p %u[%s] %u %u %u %u %u %u\n", + "%pK %u[%s] %u %u %u %u %u %u\n", skb, skb->len, event, info->created, info->rx_queued, info->rx_done, info->rx_done_sent, info->tx_queued, get_timestamp()); @@ -1013,7 +1013,7 @@ static ssize_t ghsic_data_read_stats(struct file *file, spin_lock_irqsave(&port->rx_lock, flags); temp += scnprintf(buf + temp, DEBUG_DATA_BUF_SIZE - temp, "\nName: %s\n" - "#PORT:%d port#: %p\n" + "#PORT:%d port#: %pK\n" "data_ch_open: %d\n" "data_ch_ready: %d\n" "\n******UL INFO*****\n\n" diff --git a/drivers/usb/gadget/function/u_data_ipa.c b/drivers/usb/gadget/function/u_data_ipa.c index 13d457bc9d968..de17c3b4f821c 100644 --- a/drivers/usb/gadget/function/u_data_ipa.c +++ b/drivers/usb/gadget/function/u_data_ipa.c @@ -192,7 +192,7 @@ void ipa_data_disconnect(struct gadget_ipa_port *gp, u8 port_num) unsigned long flags; struct usb_gadget *gadget = NULL; - pr_debug("dev:%p port number:%d\n", gp, port_num); + pr_debug("dev:%pK port number:%d\n", gp, port_num); if (port_num >= n_ipa_ports) { pr_err("invalid ipa portno#%d\n", port_num); return; @@ -458,7 +458,7 @@ static void ipa_data_connect_work(struct work_struct *w) if (gport->in) ipa_data_start_endless_xfer(port, true); - pr_debug("Connect workqueue done (port %p)", port); + pr_debug("Connect workqueue done (port %pK)", port); return; disconnect_usb_bam_ipa_out: @@ -507,7 +507,7 @@ int ipa_data_connect(struct gadget_ipa_port *gp, u8 port_num, unsigned long flags; int ret; - pr_debug("dev:%p port#%d src_connection_idx:%d dst_connection_idx:%d\n", + pr_debug("dev:%pK port#%d src_connection_idx:%d dst_connection_idx:%d\n", gp, port_num, src_connection_idx, dst_connection_idx); if (port_num >= n_ipa_ports) { @@ -545,7 +545,7 @@ int ipa_data_connect(struct gadget_ipa_port *gp, u8 port_num, port->port_usb->in->endless = true; ret = usb_ep_enable(port->port_usb->in); if (ret) { - pr_err("usb_ep_enable failed eptype:IN ep:%p", + pr_err("usb_ep_enable failed eptype:IN ep:%pK", port->port_usb->in); port->port_usb->in->endless = false; goto err_usb_in; @@ -556,7 +556,7 @@ int ipa_data_connect(struct gadget_ipa_port *gp, u8 port_num, port->port_usb->out->endless = true; ret = usb_ep_enable(port->port_usb->out); if (ret) { - pr_err("usb_ep_enable failed eptype:OUT ep:%p", + pr_err("usb_ep_enable failed eptype:OUT ep:%pK", port->port_usb->out); port->port_usb->out->endless = false; goto err_usb_out; @@ -659,7 +659,7 @@ void ipa_data_suspend(struct gadget_ipa_port *gp, u8 port_num) struct ipa_data_ch_info *port; int ret; - pr_debug("dev:%p port number:%d\n", gp, port_num); + pr_debug("dev:%pK port number:%d\n", gp, port_num); if (port_num >= n_ipa_ports) { pr_err("invalid ipa portno#%d\n", port_num); @@ -707,7 +707,7 @@ void ipa_data_resume(struct gadget_ipa_port *gp, u8 port_num) struct usb_gadget *gadget = NULL; int ret; - pr_debug("dev:%p port number:%d\n", gp, port_num); + pr_debug("dev:%pK port number:%d\n", gp, port_num); if (port_num >= n_ipa_ports) { pr_err("invalid ipa portno#%d\n", port_num); @@ -783,7 +783,7 @@ static int ipa_data_port_alloc(int portno) ipa_data_ports[portno] = port; - pr_debug("port:%p with portno:%d allocated\n", port, portno); + pr_debug("port:%pK with portno:%d allocated\n", port, portno); return 0; } diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c index 0b3bc8c19c3a8..0ded969cd8149 100644 --- a/drivers/usb/gadget/function/u_ether.c +++ b/drivers/usb/gadget/function/u_ether.c @@ -1757,8 +1757,8 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g, free_netdev(net); dev = ERR_PTR(status); } else { - INFO(dev, "MAC %pM\n", net->dev_addr); - INFO(dev, "HOST MAC %pM\n", dev->host_mac); + INFO(dev, "MAC %pKM\n", net->dev_addr); + INFO(dev, "HOST MAC %pKM\n", dev->host_mac); /* * two kinds of host-initiated state changes: @@ -1839,7 +1839,7 @@ int gether_register_netdev(struct net_device *net) dev_dbg(&g->dev, "register_netdev failed, %d\n", status); return status; } else { - INFO(dev, "HOST MAC %pM\n", dev->host_mac); + INFO(dev, "HOST MAC %pKM\n", dev->host_mac); /* two kinds of host-initiated state changes: * - iff DATA transfer is active, carrier is "on" @@ -1855,7 +1855,7 @@ int gether_register_netdev(struct net_device *net) if (status) pr_warn("cannot set self ethernet address: %d\n", status); else - INFO(dev, "MAC %pM\n", dev->dev_mac); + INFO(dev, "MAC %pKM\n", dev->dev_mac); return status; } @@ -1923,7 +1923,7 @@ int gether_get_host_addr_cdc(struct net_device *net, char *host_addr, int len) return -EINVAL; dev = netdev_priv(net); - snprintf(host_addr, len, "%pm", dev->host_mac); + snprintf(host_addr, len, "%pKm", dev->host_mac); return strlen(host_addr); } diff --git a/drivers/usb/gadget/function/u_qc_ether.c b/drivers/usb/gadget/function/u_qc_ether.c index 118bab4477ce1..377fd50b0f3a8 100644 --- a/drivers/usb/gadget/function/u_qc_ether.c +++ b/drivers/usb/gadget/function/u_qc_ether.c @@ -317,8 +317,8 @@ int gether_qc_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN], dev_dbg(&g->dev, "register_netdev failed, %d\n", status); free_netdev(net); } else { - INFO(dev, "MAC %pM\n", net->dev_addr); - INFO(dev, "HOST MAC %pM\n", dev->host_mac); + INFO(dev, "MAC %pKM\n", net->dev_addr); + INFO(dev, "HOST MAC %pKM\n", dev->host_mac); } diff --git a/drivers/usb/gadget/function/u_rmnet_ctrl_smd.c b/drivers/usb/gadget/function/u_rmnet_ctrl_smd.c index 1fa27b0ed522b..b667eb416a2b1 100644 --- a/drivers/usb/gadget/function/u_rmnet_ctrl_smd.c +++ b/drivers/usb/gadget/function/u_rmnet_ctrl_smd.c @@ -142,7 +142,7 @@ static void grmnet_ctrl_smd_read_w(struct work_struct *w) (c->ch == 0))); if (read_avail < 0 || c->ch == 0) { - pr_err("%s:smd read_avail failure:%d or channel closed ch=%p", + pr_err("%s:smd read_avail failure:%d or channel closed ch=%pK", __func__, read_avail, c->ch); kfree(buf); return; @@ -435,7 +435,7 @@ int gsmd_ctrl_connect(struct grmnet *gr, int port_num) struct smd_ch_info *c; unsigned long flags; - pr_debug("%s: grmnet:%p port#%d\n", __func__, gr, port_num); + pr_debug("%s: grmnet:%pK port#%d\n", __func__, gr, port_num); if (!is_legal_port_num(port_num)) { pr_err("%s: Invalid port_num#%d\n", __func__, port_num); @@ -491,7 +491,7 @@ void gsmd_ctrl_disconnect(struct grmnet *gr, u8 port_num) struct rmnet_ctrl_pkt *cpkt; int clear_bits; - pr_debug("%s: grmnet:%p port#%d\n", __func__, gr, port_num); + pr_debug("%s: grmnet:%pK port#%d\n", __func__, gr, port_num); if (!is_legal_port_num(port_num)) { pr_err("%s: Invalid port_num#%d\n", __func__, port_num); @@ -646,7 +646,7 @@ static int grmnet_ctrl_smd_port_alloc(int portno) pdrv->driver.name = c->name; pdrv->driver.owner = THIS_MODULE; - pr_debug("%s: port:%p portno:%d\n", __func__, port, portno); + pr_debug("%s: port:%pK portno:%d\n", __func__, port, portno); return 0; } @@ -735,7 +735,7 @@ static ssize_t gsmd_ctrl_read_stats(struct file *file, char __user *ubuf, c = &port->ctrl_ch; temp += scnprintf(buf + temp, DEBUG_BUF_SIZE - temp, - "#PORT:%d port:%p ctrl_ch:%p#\n" + "#PORT:%d port:%pK ctrl_ch:%pK#\n" "to_usbhost: %lu\n" "to_modem: %lu\n" "DTR: %s\n" diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c index 2610e220d32e5..ef7885a8f2ee1 100644 --- a/drivers/usb/gadget/function/u_serial.c +++ b/drivers/usb/gadget/function/u_serial.c @@ -871,7 +871,7 @@ static int gs_open(struct tty_struct *tty, struct file *file) spin_lock_irq(&port->port_lock); if (status) { - pr_debug("gs_open: ttyGS%d (%p,%p) no buffer\n", + pr_debug("gs_open: ttyGS%d (%pK,%pK) no buffer\n", port->port_num, tty, file); port->openclose = false; goto exit_unlock_port; @@ -906,7 +906,7 @@ static int gs_open(struct tty_struct *tty, struct file *file) gser->connect(gser); } - pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file); + pr_debug("gs_open: ttyGS%d (%pK,%pK)\n", port->port_num, tty, file); status = 0; @@ -942,7 +942,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) goto exit; } - pr_debug("gs_close: ttyGS%d (%p,%p) ...\n", port->port_num, tty, file); + pr_debug("gs_close: ttyGS%d (%pK,%pK) ...\n", port->port_num, tty, file); /* mark port as closing but in use; we can drop port lock * and sleep if necessary @@ -980,7 +980,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) port->openclose = false; - pr_debug("gs_close: ttyGS%d (%p,%p) done!\n", + pr_debug("gs_close: ttyGS%d (%pK,%pK) done!\n", port->port_num, tty, file); wake_up(&port->port.close_wait); @@ -996,7 +996,7 @@ static int gs_write(struct tty_struct *tty, const unsigned char *buf, int count) if (!port) return 0; - pr_vdebug("gs_write: ttyGS%d (%p) writing %d bytes\n", + pr_vdebug("gs_write: ttyGS%d (%pK) writing %d bytes\n", port->port_num, tty, count); spin_lock_irqsave(&port->port_lock, flags); @@ -1018,7 +1018,7 @@ static int gs_put_char(struct tty_struct *tty, unsigned char ch) if (!port) return 0; - pr_vdebug("gs_put_char: (%d,%p) char=0x%x, called from %pf\n", + pr_vdebug("gs_put_char: (%d,%pK) char=0x%x, called from %pKf\n", port->port_num, tty, ch, __builtin_return_address(0)); spin_lock_irqsave(&port->port_lock, flags); @@ -1035,7 +1035,7 @@ static void gs_flush_chars(struct tty_struct *tty) if (!port) return; - pr_vdebug("gs_flush_chars: (%d,%p)\n", port->port_num, tty); + pr_vdebug("gs_flush_chars: (%d,%pK)\n", port->port_num, tty); spin_lock_irqsave(&port->port_lock, flags); if (port->port_usb) @@ -1056,7 +1056,7 @@ static int gs_write_room(struct tty_struct *tty) room = gs_buf_space_avail(&port->port_write_buf); spin_unlock_irqrestore(&port->port_lock, flags); - pr_vdebug("gs_write_room: (%d,%p) room=%d\n", + pr_vdebug("gs_write_room: (%d,%pK) room=%d\n", port->port_num, tty, room); return room; @@ -1074,7 +1074,7 @@ static int gs_chars_in_buffer(struct tty_struct *tty) chars = gs_buf_data_avail(&port->port_write_buf); spin_unlock_irqrestore(&port->port_lock, flags); - pr_vdebug("gs_chars_in_buffer: (%d,%p) chars=%d\n", + pr_vdebug("gs_chars_in_buffer: (%d,%pK) chars=%d\n", port->port_num, tty, chars); return chars; diff --git a/drivers/usb/gadget/function/u_smd.c b/drivers/usb/gadget/function/u_smd.c index 6ebdd206bb454..2164775a975cd 100644 --- a/drivers/usb/gadget/function/u_smd.c +++ b/drivers/usb/gadget/function/u_smd.c @@ -149,7 +149,7 @@ static int gsmd_alloc_requests(struct usb_ep *ep, struct list_head *head, int i; struct usb_request *req; - pr_debug("%s: ep:%p head:%p num:%d size:%d cb:%p", __func__, + pr_debug("%s: ep:%pK head:%pK num:%d size:%d cb:%pK", __func__, ep, head, num, size, cb); for (i = 0; i < num; i++) { @@ -199,7 +199,7 @@ static void gsmd_start_rx(struct gsmd_port *port) spin_lock_irqsave(&port->port_lock, flags); if (ret) { pr_err("%s: usb ep out queue failed" - "port:%p, port#%d\n", + "port:%pK, port#%d\n", __func__, port, port->port_num); list_add_tail(&req->list, pool); break; @@ -215,7 +215,7 @@ static void gsmd_rx_push(struct work_struct *w) struct smd_port_info *pi = port->pi; struct list_head *q; - pr_debug("%s: port:%p port#%d", __func__, port, port->port_num); + pr_debug("%s: port:%pK port#%d", __func__, port, port->port_num); spin_lock_irq(&port->port_lock); @@ -228,11 +228,11 @@ static void gsmd_rx_push(struct work_struct *w) switch (req->status) { case -ESHUTDOWN: - pr_debug("%s: req status shutdown portno#%d port:%p\n", + pr_debug("%s: req status shutdown portno#%d port:%pK\n", __func__, port->port_num, port); goto rx_push_end; default: - pr_warning("%s: port:%p port#%d" + pr_warning("%s: port:%pK port#%d" " Unexpected Rx Status:%d\n", __func__, port, port->port_num, req->status); case 0: @@ -305,7 +305,7 @@ static void gsmd_tx_pull(struct work_struct *w) struct usb_ep *in; int ret; - pr_debug("%s: port:%p port#%d pool:%p\n", __func__, + pr_debug("%s: port:%pK port#%d pool:%pK\n", __func__, port, port->port_num, pool); spin_lock_irq(&port->port_lock); @@ -365,7 +365,7 @@ static void gsmd_tx_pull(struct work_struct *w) spin_lock_irq(&port->port_lock); if (ret) { pr_err("%s: usb ep in queue failed" - "port:%p, port#%d err:%d\n", + "port:%pK, port#%d err:%d\n", __func__, port, port->port_num, ret); /* could be usb disconnected */ if (!port->port_usb) @@ -392,7 +392,7 @@ static void gsmd_read_complete(struct usb_ep *ep, struct usb_request *req) { struct gsmd_port *port = ep->driver_data; - pr_debug("%s: ep:%p port:%p\n", __func__, ep, port); + pr_debug("%s: ep:%pK port:%pK\n", __func__, ep, port); if (!port) { pr_err("%s: port is null\n", __func__); @@ -418,7 +418,7 @@ static void gsmd_write_complete(struct usb_ep *ep, struct usb_request *req) { struct gsmd_port *port = ep->driver_data; - pr_debug("%s: ep:%p port:%p\n", __func__, ep, port); + pr_debug("%s: ep:%pK port:%pK\n", __func__, ep, port); if (!port) { pr_err("%s: port is null\n", __func__); @@ -434,7 +434,7 @@ static void gsmd_write_complete(struct usb_ep *ep, struct usb_request *req) } if (req->status) - pr_warning("%s: port:%p port#%d unexpected %s status %d\n", + pr_warning("%s: port:%pK port#%d unexpected %s status %d\n", __func__, port, port->port_num, ep->name, req->status); @@ -449,7 +449,7 @@ static void gsmd_start_io(struct gsmd_port *port) { int ret = -ENODEV; - pr_debug("%s: port: %p\n", __func__, port); + pr_debug("%s: port: %pK\n", __func__, port); spin_lock(&port->port_lock); @@ -604,7 +604,7 @@ static void gsmd_connect_work(struct work_struct *w) port = container_of(w, struct gsmd_port, connect_work.work); pi = port->pi; - pr_debug("%s: port:%p port#%d\n", __func__, port, port->port_num); + pr_debug("%s: port:%pK port#%d\n", __func__, port, port->port_num); if (!test_bit(CH_READY, &pi->flags)) return; @@ -633,7 +633,7 @@ static void gsmd_disconnect_work(struct work_struct *w) port = container_of(w, struct gsmd_port, disconnect_work); pi = port->pi; - pr_debug("%s: port:%p port#%d\n", __func__, port, port->port_num); + pr_debug("%s: port:%pK port#%d\n", __func__, port, port->port_num); smd_close(port->pi->ch); port->pi->ch = NULL; @@ -701,7 +701,7 @@ int gsmd_connect(struct gserial *gser, u8 portno) int ret; struct gsmd_port *port; - pr_debug("%s: gserial:%p portno:%u\n", __func__, gser, portno); + pr_debug("%s: gserial:%pK portno:%u\n", __func__, gser, portno); if (portno >= n_smd_ports) { pr_err("%s: Invalid port no#%d", __func__, portno); @@ -725,7 +725,7 @@ int gsmd_connect(struct gserial *gser, u8 portno) ret = usb_ep_enable(gser->in); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:IN ep:%p, err:%d", + pr_err("%s: usb_ep_enable failed eptype:IN ep:%pK, err:%d", __func__, gser->in, ret); port->port_usb = 0; return ret; @@ -734,7 +734,7 @@ int gsmd_connect(struct gserial *gser, u8 portno) ret = usb_ep_enable(gser->out); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:OUT ep:%p, err: %d", + pr_err("%s: usb_ep_enable failed eptype:OUT ep:%pK, err: %d", __func__, gser->out, ret); port->port_usb = 0; gser->in->driver_data = 0; @@ -752,7 +752,7 @@ void gsmd_disconnect(struct gserial *gser, u8 portno) unsigned long flags; struct gsmd_port *port; - pr_debug("%s: gserial:%p portno:%u\n", __func__, gser, portno); + pr_debug("%s: gserial:%pK portno:%u\n", __func__, gser, portno); if (portno >= n_smd_ports) { pr_err("%s: invalid portno#%d\n", __func__, portno); @@ -890,7 +890,7 @@ static int gsmd_port_alloc(int portno, struct usb_cdc_line_coding *coding) pdrv->driver.owner = THIS_MODULE; platform_driver_register(pdrv); - pr_debug("%s: port:%p portno:%d\n", __func__, port, portno); + pr_debug("%s: port:%pK portno:%d\n", __func__, port, portno); return 0; } @@ -994,10 +994,10 @@ int gsmd_setup(struct usb_gadget *g, unsigned count) int ret; int i; - pr_debug("%s: g:%p count: %d\n", __func__, g, count); + pr_debug("%s: g:%pK count: %d\n", __func__, g, count); if (!count || count > SMD_N_PORTS) { - pr_err("%s: Invalid num of ports count:%d gadget:%p\n", + pr_err("%s: Invalid num of ports count:%d gadget:%pK\n", __func__, count, g); return -EINVAL; } @@ -1042,7 +1042,7 @@ void gsmd_suspend(struct gserial *gser, u8 portno) { struct gsmd_port *port; - pr_debug("%s: gserial:%p portno:%u\n", __func__, gser, portno); + pr_debug("%s: gserial:%pK portno:%u\n", __func__, gser, portno); port = smd_ports[portno].port; spin_lock(&port->port_lock); @@ -1054,7 +1054,7 @@ void gsmd_resume(struct gserial *gser, u8 portno) { struct gsmd_port *port; - pr_debug("%s: gserial:%p portno:%u\n", __func__, gser, portno); + pr_debug("%s: gserial:%pK portno:%u\n", __func__, gser, portno); port = smd_ports[portno].port; spin_lock(&port->port_lock); diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index db2becd31a51e..8b862fe869f92 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c @@ -309,7 +309,7 @@ get_ready_ep (unsigned f_flags, struct ep_data *epdata) // case STATE_EP_DISABLED: /* "can't happen" */ // case STATE_EP_READY: /* "can't happen" */ default: /* error! */ - pr_debug ("%s: ep %p not available, state %d\n", + pr_debug ("%s: ep %pK not available, state %d\n", shortname, epdata, epdata->state); // FALLTHROUGH case STATE_EP_UNBOUND: /* clean disconnect */ @@ -1940,7 +1940,7 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) fail: spin_unlock_irq (&dev->lock); - pr_debug ("%s: %s fail %Zd, %p\n", shortname, __func__, value, dev); + pr_debug ("%s: %s fail %Zd, %pK\n", shortname, __func__, value, dev); kfree (dev->buf); dev->buf = NULL; return value; diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index 524cbf26d9925..e5a4bd495fec8 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c @@ -106,7 +106,7 @@ static inline void dbg_hcc_params (struct ehci_hcd *ehci, char *label) {} static void __maybe_unused dbg_qtd (const char *label, struct ehci_hcd *ehci, struct ehci_qtd *qtd) { - ehci_dbg(ehci, "%s td %p n%08x %08x t%08x p0=%08x\n", label, qtd, + ehci_dbg(ehci, "%s td %pK n%08x %08x t%08x p0=%08x\n", label, qtd, hc32_to_cpup(ehci, &qtd->hw_next), hc32_to_cpup(ehci, &qtd->hw_alt_next), hc32_to_cpup(ehci, &qtd->hw_token), @@ -124,7 +124,7 @@ dbg_qh (const char *label, struct ehci_hcd *ehci, struct ehci_qh *qh) { struct ehci_qh_hw *hw = qh->hw; - ehci_dbg (ehci, "%s qh %p n%08x info %x %x qtd %x\n", label, + ehci_dbg (ehci, "%s qh %pK n%08x info %x %x qtd %x\n", label, qh, hw->hw_next, hw->hw_info1, hw->hw_info2, hw->hw_current); dbg_qtd("overlay", ehci, (struct ehci_qtd *) &hw->hw_qtd_next); } @@ -132,7 +132,7 @@ dbg_qh (const char *label, struct ehci_hcd *ehci, struct ehci_qh *qh) static void __maybe_unused dbg_itd (const char *label, struct ehci_hcd *ehci, struct ehci_itd *itd) { - ehci_dbg (ehci, "%s [%d] itd %p, next %08x, urb %p\n", + ehci_dbg (ehci, "%s [%d] itd %pK, next %08x, urb %pK\n", label, itd->frame, itd, hc32_to_cpu(ehci, itd->hw_next), itd->urb); ehci_dbg (ehci, @@ -163,7 +163,7 @@ dbg_itd (const char *label, struct ehci_hcd *ehci, struct ehci_itd *itd) static void __maybe_unused dbg_sitd (const char *label, struct ehci_hcd *ehci, struct ehci_sitd *sitd) { - ehci_dbg (ehci, "%s [%d] sitd %p, next %08x, urb %p\n", + ehci_dbg (ehci, "%s [%d] sitd %pK, next %08x, urb %pK\n", label, sitd->frame, sitd, hc32_to_cpu(ehci, sitd->hw_next), sitd->urb); ehci_dbg (ehci, @@ -436,7 +436,7 @@ static void qh_lines ( scratch = hc32_to_cpup(ehci, &hw->hw_info1); hw_curr = (mark == '*') ? hc32_to_cpup(ehci, &hw->hw_current) : 0; temp = scnprintf (next, size, - "qh/%p dev%d %cs ep%d %08x %08x (%08x%c %s nak%d)", + "qh/%pK dev%d %cs ep%d %08x %08x (%08x%c %s nak%d)", qh, scratch & 0x007f, speed_char (scratch), (scratch >> 8) & 0x000f, @@ -464,7 +464,7 @@ static void qh_lines ( mark = '/'; } temp = snprintf (next, size, - "\n\t%p%c%s len=%d %08x urb %p", + "\n\t%pK%c%s len=%d %08x urb %pK", td, mark, ({ char *tmp; switch ((scratch>>8)&0x03) { case 0: tmp = "out"; break; @@ -661,7 +661,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) switch (hc32_to_cpu(ehci, tag)) { case Q_TYPE_QH: hw = p.qh->hw; - temp = scnprintf (next, size, " qh%d-%04x/%p", + temp = scnprintf (next, size, " qh%d-%04x/%pK", p.qh->ps.period, hc32_to_cpup(ehci, &hw->hw_info2) @@ -723,20 +723,20 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) break; case Q_TYPE_FSTN: temp = scnprintf (next, size, - " fstn-%8x/%p", p.fstn->hw_prev, + " fstn-%8x/%pK", p.fstn->hw_prev, p.fstn); tag = Q_NEXT_TYPE(ehci, p.fstn->hw_next); p = p.fstn->fstn_next; break; case Q_TYPE_ITD: temp = scnprintf (next, size, - " itd/%p", p.itd); + " itd/%pK", p.itd); tag = Q_NEXT_TYPE(ehci, p.itd->hw_next); p = p.itd->itd_next; break; case Q_TYPE_SITD: temp = scnprintf (next, size, - " sitd%d-%04x/%p", + " sitd%d-%04x/%pK", p.sitd->stream->ps.period, hc32_to_cpup(ehci, &p.sitd->hw_uframe) & 0x0000ffff, @@ -908,7 +908,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) } if (!list_empty(&ehci->async_unlink)) { - temp = scnprintf(next, size, "async unlink qh %p\n", + temp = scnprintf(next, size, "async unlink qh %pK\n", list_first_entry(&ehci->async_unlink, struct ehci_qh, unlink_node)); size -= temp; diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 9ac96f3656004..7725563bfb177 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1006,7 +1006,7 @@ ehci_endpoint_disable (struct usb_hcd *hcd, struct usb_host_endpoint *ep) /* caller was supposed to have unlinked any requests; * that's not our job. just leak this memory. */ - ehci_err (ehci, "qh %p (#%02x) state %d%s\n", + ehci_err (ehci, "qh %pK (#%02x) state %d%s\n", qh, ep->desc.bEndpointAddress, qh->qh_state, list_empty (&qh->qtd_list) ? "" : "(has tds)"); break; diff --git a/drivers/usb/host/ehci-msm-hsic.c b/drivers/usb/host/ehci-msm-hsic.c index 2bbffda01effc..5a3ca6ae71743 100644 --- a/drivers/usb/host/ehci-msm-hsic.c +++ b/drivers/usb/host/ehci-msm-hsic.c @@ -271,7 +271,7 @@ static void dbg_log_event(struct urb *urb, char * event, unsigned extra) if (!str_to_event(event)) { write_lock_irqsave(&dbg_hsic_ctrl.lck, flags); scnprintf(dbg_hsic_ctrl.buf[dbg_hsic_ctrl.idx], - DBG_MSG_LEN, "%s: [%s : %p]:[%s] " + DBG_MSG_LEN, "%s: [%s : %pK]:[%s] " "%02x %02x %04x %04x %04x %u %d %s", get_timestamp(tbuf), event, urb, usb_urb_dir_in(urb) ? "in" : "out", @@ -291,7 +291,7 @@ static void dbg_log_event(struct urb *urb, char * event, unsigned extra) } else { write_lock_irqsave(&dbg_hsic_ctrl.lck, flags); scnprintf(dbg_hsic_ctrl.buf[dbg_hsic_ctrl.idx], - DBG_MSG_LEN, "%s: [%s : %p]:[%s] %u %d %s", + DBG_MSG_LEN, "%s: [%s : %pK]:[%s] %u %d %s", get_timestamp(tbuf), event, urb, usb_urb_dir_in(urb) ? "in" : "out", urb->actual_length, extra, @@ -304,7 +304,7 @@ static void dbg_log_event(struct urb *urb, char * event, unsigned extra) } else { write_lock_irqsave(&dbg_hsic_data.lck, flags); scnprintf(dbg_hsic_data.buf[dbg_hsic_data.idx], DBG_MSG_LEN, - "%s: [%s : %p]:ep%d[%s] %u %d %s", + "%s: [%s : %pK]:ep%d[%s] %u %d %s", get_timestamp(tbuf), event, urb, ep_addr & 0x0f, usb_urb_dir_in(urb) ? "in" : "out", str_to_event(event) ? urb->actual_length : @@ -336,7 +336,7 @@ static void dump_hsic_regs(struct usb_hcd *hcd) return; for (i = USB_REG_START_OFFSET; i <= USB_REG_END_OFFSET; i += 0x10) - pr_info("%p: %08x\t%08x\t%08x\t%08x\n", hcd->regs + i, + pr_info("%pK: %08x\t%08x\t%08x\t%08x\n", hcd->regs + i, readl_relaxed(hcd->regs + i), readl_relaxed(hcd->regs + i + 4), readl_relaxed(hcd->regs + i + 8), @@ -690,7 +690,7 @@ static int msm_hsic_start(struct msm_hsic_hcd *mehci) while (seq[0] >= 0 && seq_count > 0) { val = readl_relaxed(mehci->tlmm_regs + seq[0]); val |= seq[1]; - dev_dbg(mehci->dev, "%s: writing %x to %p\n", + dev_dbg(mehci->dev, "%s: writing %x to %pK\n", __func__, val, mehci->tlmm_regs + seq[0]); writel_relaxed(val, mehci->tlmm_regs + seq[0]); @@ -1677,7 +1677,7 @@ static irqreturn_t hsic_peripheral_status_change(int irq, void *dev_id) { struct msm_hsic_hcd *mehci = dev_id; - pr_debug("%s: mehci:%p dev_id:%p\n", __func__, mehci, dev_id); + pr_debug("%s: mehci:%pK dev_id:%pK\n", __func__, mehci, dev_id); if (mehci) msm_hsic_config_gpios(mehci, 0); diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 54f5332f814dd..ed4a20a7ca200 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c @@ -264,7 +264,7 @@ ehci_urb_done(struct ehci_hcd *ehci, struct urb *urb, int status) #ifdef EHCI_URB_TRACE ehci_dbg (ehci, - "%s %s urb %p ep%d%s status %d len %d/%d\n", + "%s %s urb %pK ep%d%s status %d len %d/%d\n", __func__, urb->dev->devpath, urb, usb_pipeendpoint (urb->pipe), usb_pipein (urb->pipe) ? "in" : "out", @@ -350,7 +350,7 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) /* Report Data Buffer Error: non-fatal but useful */ if (token & QTD_STS_DBE) ehci_dbg(ehci, - "detected DataBufferErr for urb %p ep%d%s len %d, qtd %p [qh %p]\n", + "detected DataBufferErr for urb %pK ep%d%s len %d, qtd %pK [qh %pK]\n", urb, usb_endpoint_num(&urb->ep->desc), usb_endpoint_dir_in(&urb->ep->desc) ? "in" : "out", @@ -924,7 +924,7 @@ qh_make ( } break; default: - ehci_dbg(ehci, "bogus dev %p speed %d\n", urb->dev, + ehci_dbg(ehci, "bogus dev %pK speed %d\n", urb->dev, urb->dev->speed); done: qh_destroy(ehci, qh); @@ -1112,7 +1112,7 @@ submit_async ( struct ehci_qtd *qtd; qtd = list_entry(qtd_list->next, struct ehci_qtd, qtd_list); ehci_dbg(ehci, - "%s %s urb %p ep%d%s len %d, qtd %p [qh %p]\n", + "%s %s urb %pK ep%d%s len %d, qtd %pK [qh %pK]\n", __func__, urb->dev->devpath, urb, epnum & 0x0f, (epnum & USB_DIR_IN) ? "in" : "out", urb->transfer_buffer_length, diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index c399606f154e4..fc62964e659e9 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c @@ -548,7 +548,7 @@ static void qh_link_periodic(struct ehci_hcd *ehci, struct ehci_qh *qh) unsigned period = qh->ps.period; dev_dbg(&qh->ps.udev->dev, - "link qh%d-%04x/%p start %d [%d/%d us]\n", + "link qh%d-%04x/%pK start %d [%d/%d us]\n", period, hc32_to_cpup(ehci, &qh->hw->hw_info2) & (QH_CMASK | QH_SMASK), qh, qh->ps.phase, qh->ps.usecs, qh->ps.c_usecs); @@ -641,7 +641,7 @@ static void qh_unlink_periodic(struct ehci_hcd *ehci, struct ehci_qh *qh) : (qh->ps.usecs * 8); dev_dbg(&qh->ps.udev->dev, - "unlink qh%d-%04x/%p start %d [%d/%d us]\n", + "unlink qh%d-%04x/%pK start %d [%d/%d us]\n", qh->ps.period, hc32_to_cpup(ehci, &qh->hw->hw_info2) & (QH_CMASK | QH_SMASK), qh, qh->ps.phase, qh->ps.usecs, qh->ps.c_usecs); @@ -751,7 +751,7 @@ static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh) * FIXME kill the now-dysfunctional queued urbs */ else { - ehci_err(ehci, "can't reschedule qh %p, err %d\n", + ehci_err(ehci, "can't reschedule qh %pK, err %d\n", qh, rc); } } @@ -869,7 +869,7 @@ static int qh_schedule(struct ehci_hcd *ehci, struct ehci_qh *qh) /* reuse the previous schedule slots, if we can */ if (qh->ps.phase != NO_FRAME) { - ehci_dbg(ehci, "reused qh %p schedule\n", qh); + ehci_dbg(ehci, "reused qh %pK schedule\n", qh); return 0; } @@ -1552,7 +1552,7 @@ iso_stream_schedule ( /* no room in the schedule */ if (!done) { - ehci_dbg(ehci, "iso sched full %p", urb); + ehci_dbg(ehci, "iso sched full %pK", urb); status = -ENOSPC; goto fail; } @@ -1606,7 +1606,7 @@ iso_stream_schedule ( /* Is the schedule already full? */ if (unlikely(!empty && start < period)) { - ehci_dbg(ehci, "iso sched full %p (%u-%u < %u mod %u)\n", + ehci_dbg(ehci, "iso sched full %pK (%u-%u < %u mod %u)\n", urb, stream->next_uframe, base, period, mod); status = -ENOSPC; goto fail; @@ -1635,7 +1635,7 @@ iso_stream_schedule ( /* How many uframes and packets do we need to skip? */ skip = (now2 - start + period - 1) & -period; if (skip >= span) { /* Entirely in the past? */ - ehci_dbg(ehci, "iso underrun %p (%u+%u < %u) [%u]\n", + ehci_dbg(ehci, "iso underrun %pK (%u+%u < %u) [%u]\n", urb, start + base, span - period, now2 + base, base); @@ -1662,7 +1662,7 @@ iso_stream_schedule ( use_start: /* Tried to schedule too far into the future? */ if (unlikely(start + span - period >= mod + wrap)) { - ehci_dbg(ehci, "request %p would overflow (%u+%u >= %u)\n", + ehci_dbg(ehci, "request %pK would overflow (%u+%u >= %u)\n", urb, start, span - period, mod + wrap); status = -EFBIG; goto fail; @@ -1957,7 +1957,7 @@ static int itd_submit (struct ehci_hcd *ehci, struct urb *urb, #ifdef EHCI_URB_TRACE ehci_dbg (ehci, - "%s %s urb %p ep%d%s len %d, %d pkts %d uframes [%p]\n", + "%s %s urb %pK ep%d%s len %d, %d pkts %d uframes [%pK]\n", __func__, urb->dev->devpath, urb, usb_pipeendpoint (urb->pipe), usb_pipein (urb->pipe) ? "in" : "out", @@ -2337,7 +2337,7 @@ static int sitd_submit (struct ehci_hcd *ehci, struct urb *urb, #ifdef EHCI_URB_TRACE ehci_dbg (ehci, - "submit %p dev%s ep%d%s-iso len %d\n", + "submit %pK dev%s ep%d%s-iso len %d\n", urb, urb->dev->devpath, usb_pipeendpoint (urb->pipe), usb_pipein (urb->pipe) ? "in" : "out", @@ -2490,7 +2490,7 @@ static void scan_isoc(struct ehci_hcd *ehci) q = *q_p; break; default: - ehci_dbg(ehci, "corrupt type %d frame %d shadow %p\n", + ehci_dbg(ehci, "corrupt type %d frame %d shadow %pK\n", type, frame, q.ptr); // BUG (); /* FALL THROUGH */ diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c index bb89175ca6e5d..092a9997aa0fa 100644 --- a/drivers/usb/host/xhci-dbg.c +++ b/drivers/usb/host/xhci-dbg.c @@ -30,10 +30,10 @@ void xhci_dbg_regs(struct xhci_hcd *xhci) { u32 temp; - xhci_dbg(xhci, "// xHCI capability registers at %p:\n", + xhci_dbg(xhci, "// xHCI capability registers at %pK:\n", xhci->cap_regs); temp = readl(&xhci->cap_regs->hc_capbase); - xhci_dbg(xhci, "// @%p = 0x%x (CAPLENGTH AND HCIVERSION)\n", + xhci_dbg(xhci, "// @%pK = 0x%x (CAPLENGTH AND HCIVERSION)\n", &xhci->cap_regs->hc_capbase, temp); xhci_dbg(xhci, "// CAPLENGTH: 0x%x\n", (unsigned int) HC_LENGTH(temp)); @@ -42,24 +42,24 @@ void xhci_dbg_regs(struct xhci_hcd *xhci) (unsigned int) HC_VERSION(temp)); #endif - xhci_dbg(xhci, "// xHCI operational registers at %p:\n", xhci->op_regs); + xhci_dbg(xhci, "// xHCI operational registers at %pK:\n", xhci->op_regs); temp = readl(&xhci->cap_regs->run_regs_off); - xhci_dbg(xhci, "// @%p = 0x%x RTSOFF\n", + xhci_dbg(xhci, "// @%pK = 0x%x RTSOFF\n", &xhci->cap_regs->run_regs_off, (unsigned int) temp & RTSOFF_MASK); - xhci_dbg(xhci, "// xHCI runtime registers at %p:\n", xhci->run_regs); + xhci_dbg(xhci, "// xHCI runtime registers at %pK:\n", xhci->run_regs); temp = readl(&xhci->cap_regs->db_off); - xhci_dbg(xhci, "// @%p = 0x%x DBOFF\n", &xhci->cap_regs->db_off, temp); - xhci_dbg(xhci, "// Doorbell array at %p:\n", xhci->dba); + xhci_dbg(xhci, "// @%pK = 0x%x DBOFF\n", &xhci->cap_regs->db_off, temp); + xhci_dbg(xhci, "// Doorbell array at %pK:\n", xhci->dba); } static void xhci_print_cap_regs(struct xhci_hcd *xhci) { u32 temp; - xhci_dbg(xhci, "xHCI capability registers at %p:\n", xhci->cap_regs); + xhci_dbg(xhci, "xHCI capability registers at %pK:\n", xhci->cap_regs); temp = readl(&xhci->cap_regs->hc_capbase); xhci_dbg(xhci, "CAPLENGTH AND HCIVERSION 0x%x:\n", @@ -140,7 +140,7 @@ static void xhci_print_status(struct xhci_hcd *xhci) static void xhci_print_op_regs(struct xhci_hcd *xhci) { - xhci_dbg(xhci, "xHCI operational registers at %p:\n", xhci->op_regs); + xhci_dbg(xhci, "xHCI operational registers at %pK:\n", xhci->op_regs); xhci_print_command_reg(xhci); xhci_print_status(xhci); } @@ -161,7 +161,7 @@ static void xhci_print_ports(struct xhci_hcd *xhci) addr = &xhci->op_regs->port_status_base; for (i = 0; i < ports; i++) { for (j = 0; j < NUM_PORT_REGS; ++j) { - xhci_dbg(xhci, "%p port %s reg = 0x%x\n", + xhci_dbg(xhci, "%pK port %s reg = 0x%x\n", addr, names[j], (unsigned int) readl(addr)); addr++; @@ -181,35 +181,35 @@ void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num) if (temp == XHCI_INIT_VALUE) return; - xhci_dbg(xhci, " %p: ir_set[%i]\n", ir_set, set_num); + xhci_dbg(xhci, " %pK: ir_set[%i]\n", ir_set, set_num); - xhci_dbg(xhci, " %p: ir_set.pending = 0x%x\n", addr, + xhci_dbg(xhci, " %pK: ir_set.pending = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->irq_control; temp = readl(addr); - xhci_dbg(xhci, " %p: ir_set.control = 0x%x\n", addr, + xhci_dbg(xhci, " %pK: ir_set.control = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->erst_size; temp = readl(addr); - xhci_dbg(xhci, " %p: ir_set.erst_size = 0x%x\n", addr, + xhci_dbg(xhci, " %pK: ir_set.erst_size = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->rsvd; temp = readl(addr); if (temp != XHCI_INIT_VALUE) - xhci_dbg(xhci, " WARN: %p: ir_set.rsvd = 0x%x\n", + xhci_dbg(xhci, " WARN: %pK: ir_set.rsvd = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->erst_base; temp_64 = xhci_read_64(xhci, addr); - xhci_dbg(xhci, " %p: ir_set.erst_base = @%08llx\n", + xhci_dbg(xhci, " %pK: ir_set.erst_base = @%08llx\n", addr, temp_64); addr = &ir_set->erst_dequeue; temp_64 = xhci_read_64(xhci, addr); - xhci_dbg(xhci, " %p: ir_set.erst_dequeue = @%08llx\n", + xhci_dbg(xhci, " %pK: ir_set.erst_dequeue = @%08llx\n", addr, temp_64); } @@ -218,15 +218,15 @@ void xhci_print_run_regs(struct xhci_hcd *xhci) u32 temp; int i; - xhci_dbg(xhci, "xHCI runtime registers at %p:\n", xhci->run_regs); + xhci_dbg(xhci, "xHCI runtime registers at %pK:\n", xhci->run_regs); temp = readl(&xhci->run_regs->microframe_index); - xhci_dbg(xhci, " %p: Microframe index = 0x%x\n", + xhci_dbg(xhci, " %pK: Microframe index = 0x%x\n", &xhci->run_regs->microframe_index, (unsigned int) temp); for (i = 0; i < 7; ++i) { temp = readl(&xhci->run_regs->rsvd[i]); if (temp != XHCI_INIT_VALUE) - xhci_dbg(xhci, " WARN: %p: Rsvd[%i] = 0x%x\n", + xhci_dbg(xhci, " WARN: %pK: Rsvd[%i] = 0x%x\n", &xhci->run_regs->rsvd[i], i, (unsigned int) temp); } @@ -328,13 +328,13 @@ void xhci_debug_segment(struct xhci_hcd *xhci, struct xhci_segment *seg) void xhci_dbg_ring_ptrs(struct xhci_hcd *xhci, struct xhci_ring *ring) { - xhci_dbg(xhci, "Ring deq = %p (virt), 0x%llx (dma)\n", + xhci_dbg(xhci, "Ring deq = %pK (virt), 0x%llx (dma)\n", ring->dequeue, (unsigned long long)xhci_trb_virt_to_dma(ring->deq_seg, ring->dequeue)); xhci_dbg(xhci, "Ring deq updated %u times\n", ring->deq_updates); - xhci_dbg(xhci, "Ring enq = %p (virt), 0x%llx (dma)\n", + xhci_dbg(xhci, "Ring enq = %pK (virt), 0x%llx (dma)\n", ring->enqueue, (unsigned long long)xhci_trb_virt_to_dma(ring->enq_seg, ring->enqueue)); @@ -424,7 +424,7 @@ static void dbg_rsvd64(struct xhci_hcd *xhci, u64 *ctx, dma_addr_t dma) { int i; for (i = 0; i < 4; ++i) { - xhci_dbg(xhci, "@%p (virt) @%08llx " + xhci_dbg(xhci, "@%pK (virt) @%08llx " "(dma) %#08llx - rsvd64[%d]\n", &ctx[4 + i], (unsigned long long)dma, ctx[4 + i], i); @@ -463,24 +463,24 @@ static void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx * int csz = HCC_64BYTE_CONTEXT(xhci->hcc_params); xhci_dbg(xhci, "Slot Context:\n"); - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - dev_info\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - dev_info\n", &slot_ctx->dev_info, (unsigned long long)dma, slot_ctx->dev_info); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - dev_info2\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - dev_info2\n", &slot_ctx->dev_info2, (unsigned long long)dma, slot_ctx->dev_info2); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - tt_info\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - tt_info\n", &slot_ctx->tt_info, (unsigned long long)dma, slot_ctx->tt_info); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - dev_state\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - dev_state\n", &slot_ctx->dev_state, (unsigned long long)dma, slot_ctx->dev_state); dma += field_size; for (i = 0; i < 4; ++i) { - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - rsvd[%d]\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - rsvd[%d]\n", &slot_ctx->reserved[i], (unsigned long long)dma, slot_ctx->reserved[i], i); dma += field_size; @@ -511,24 +511,24 @@ static void xhci_dbg_ep_ctx(struct xhci_hcd *xhci, xhci_dbg(xhci, "%s Endpoint %02d Context (ep_index %02d):\n", usb_endpoint_out(epaddr) ? "OUT" : "IN", epaddr & USB_ENDPOINT_NUMBER_MASK, i); - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - ep_info\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - ep_info\n", &ep_ctx->ep_info, (unsigned long long)dma, ep_ctx->ep_info); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - ep_info2\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - ep_info2\n", &ep_ctx->ep_info2, (unsigned long long)dma, ep_ctx->ep_info2); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08llx - deq\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08llx - deq\n", &ep_ctx->deq, (unsigned long long)dma, ep_ctx->deq); dma += 2*field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - tx_info\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - tx_info\n", &ep_ctx->tx_info, (unsigned long long)dma, ep_ctx->tx_info); dma += field_size; for (j = 0; j < 3; ++j) { - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - rsvd[%d]\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - rsvd[%d]\n", &ep_ctx->reserved[j], (unsigned long long)dma, ep_ctx->reserved[j], j); @@ -558,16 +558,16 @@ void xhci_dbg_ctx(struct xhci_hcd *xhci, return; } - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - drop flags\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - drop flags\n", &ctrl_ctx->drop_flags, (unsigned long long)dma, ctrl_ctx->drop_flags); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - add flags\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - add flags\n", &ctrl_ctx->add_flags, (unsigned long long)dma, ctrl_ctx->add_flags); dma += field_size; for (i = 0; i < 6; ++i) { - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - rsvd2[%d]\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - rsvd2[%d]\n", &ctrl_ctx->rsvd2[i], (unsigned long long)dma, ctrl_ctx->rsvd2[i], i); dma += field_size; @@ -590,7 +590,7 @@ void xhci_dbg_trace(struct xhci_hcd *xhci, void (*trace)(struct va_format *), va_start(args, fmt); vaf.fmt = fmt; vaf.va = &args; - xhci_dbg(xhci, "%pV\n", &vaf); + xhci_dbg(xhci, "%pKV\n", &vaf); trace(&vaf); va_end(args); } diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 42dcb732ad99a..0f56b597fae07 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1024,7 +1024,7 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, /* Point to output device context in dcbaa. */ xhci->dcbaa->dev_context_ptrs[slot_id] = cpu_to_le64(dev->out_ctx->dma); - xhci_dbg(xhci, "Set slot id %d dcbaa entry %p to 0x%llx\n", + xhci_dbg(xhci, "Set slot id %d dcbaa entry %pK to 0x%llx\n", slot_id, &xhci->dcbaa->dev_context_ptrs[slot_id], le64_to_cpu(xhci->dcbaa->dev_context_ptrs[slot_id])); @@ -1185,7 +1185,7 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud if (udev->tt->multi) slot_ctx->dev_info |= cpu_to_le32(DEV_MTT); } - xhci_dbg(xhci, "udev->tt = %p\n", udev->tt); + xhci_dbg(xhci, "udev->tt = %pK\n", udev->tt); xhci_dbg(xhci, "udev->ttport = 0x%x\n", udev->ttport); /* Step 4 - ring already allocated */ @@ -2036,15 +2036,15 @@ static int xhci_test_trb_in_td(struct xhci_hcd *xhci, if (seg != result_seg) { xhci_warn(xhci, "WARN: %s TRB math test %d failed!\n", test_name, test_number); - xhci_warn(xhci, "Tested TRB math w/ seg %p and " + xhci_warn(xhci, "Tested TRB math w/ seg %pK and " "input DMA 0x%llx\n", input_seg, (unsigned long long) input_dma); - xhci_warn(xhci, "starting TRB %p (0x%llx DMA), " - "ending TRB %p (0x%llx DMA)\n", + xhci_warn(xhci, "starting TRB %pK (0x%llx DMA), " + "ending TRB %pK (0x%llx DMA)\n", start_trb, start_dma, end_trb, end_dma); - xhci_warn(xhci, "Expected seg %p, got seg %p\n", + xhci_warn(xhci, "Expected seg %pK, got seg %pK\n", result_seg, seg); trb_in_td(xhci, input_seg, start_trb, end_trb, input_dma, true); @@ -2183,7 +2183,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, if (major_revision > 0x03) { xhci_warn(xhci, "Ignoring unknown port speed, " - "Ext Cap %p, revision = 0x%x\n", + "Ext Cap %pK, revision = 0x%x\n", addr, major_revision); /* Ignoring port protocol we can't understand. FIXME */ return; @@ -2194,7 +2194,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, port_offset = XHCI_EXT_PORT_OFF(temp); port_count = XHCI_EXT_PORT_COUNT(temp); xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "Ext Cap %p, port offset = %u, " + "Ext Cap %pK, port offset = %u, " "count = %u, revision = 0x%x", addr, port_offset, port_count, major_revision); /* Port count includes the current port offset */ @@ -2229,7 +2229,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, for (i = port_offset; i < (port_offset + port_count); i++) { /* Duplicate entry. Ignore the port if the revisions differ. */ if (xhci->port_array[i] != 0) { - xhci_warn(xhci, "Duplicate port entry, Ext Cap %p," + xhci_warn(xhci, "Duplicate port entry, Ext Cap %pK," " port %u\n", addr, i); xhci_warn(xhci, "Port was marked as USB %u, " "duplicated as USB %u\n", @@ -2385,7 +2385,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) NUM_PORT_REGS*i; xhci_dbg_trace(xhci, trace_xhci_dbg_init, "USB 2.0 port at index %u, " - "addr = %p", i, + "addr = %pK", i, xhci->usb2_ports[port_index]); port_index++; if (port_index == xhci->num_usb2_ports) @@ -2406,7 +2406,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) NUM_PORT_REGS*i; xhci_dbg_trace(xhci, trace_xhci_dbg_init, "USB 3.0 port at index %u, " - "addr = %p", i, + "addr = %pK", i, xhci->usb3_ports[port_index]); port_index++; if (port_index == xhci->num_usb3_ports) @@ -2447,7 +2447,7 @@ int xhci_event_ring_setup(struct xhci_hcd *xhci, struct xhci_ring **er, erst->num_entries = ERST_NUM_SEGS; erst->erst_dma_addr = dma; xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "intr# %d: num segs = %i, virt addr = %p, dma addr = 0x%llx", + "intr# %d: num segs = %i, virt addr = %pK, dma addr = 0x%llx", intr_num, erst->num_entries, erst->entries, @@ -2519,7 +2519,7 @@ int xhci_sec_event_ring_setup(struct usb_hcd *hcd, unsigned intr_num) || !xhci->sec_event_ring || !xhci->sec_erst || intr_num > xhci->max_interrupters) { xhci_err(xhci, - "%s:state %x ir_set %p evt_ring %p erst %p intr# %d\n", + "%s:state %x ir_set %pK evt_ring %pK erst %pK intr# %d\n", __func__, xhci->xhc_state, xhci->sec_ir_set, xhci->sec_event_ring, xhci->sec_erst, intr_num); return -EINVAL; @@ -2642,7 +2642,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) memset(xhci->dcbaa, 0, sizeof *(xhci->dcbaa)); xhci->dcbaa->dma = dma; xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Device context base array address = 0x%llx (DMA), %p (virt)", + "// Device context base array address = 0x%llx (DMA), %pK (virt)", (unsigned long long)xhci->dcbaa->dma, xhci->dcbaa); xhci_write_64(xhci, dma, &xhci->op_regs->dcbaa_ptr); @@ -2683,7 +2683,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) if (!xhci->cmd_ring) goto fail; xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "Allocated command ring at %p", xhci->cmd_ring); + "Allocated command ring at %pK", xhci->cmd_ring); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "First segment DMA is 0x%llx", (unsigned long long)xhci->cmd_ring->first_seg->dma); diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 7216fd2d7196e..0afcc33a4d7fd 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -507,7 +507,7 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, "Cycle state = 0x%x", state->new_cycle_state); xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, - "New dequeue segment = %p (virtual)", + "New dequeue segment = %pK (virtual)", state->new_deq_seg); addr = xhci_trb_virt_to_dma(state->new_deq_seg, state->new_deq_ptr); xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, @@ -542,8 +542,8 @@ static void td_to_noop(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, "Cancel (unchain) link TRB"); xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, - "Address = %p (0x%llx dma); " - "in seg %p (0x%llx dma)", + "Address = %pK (0x%llx dma); " + "in seg %pK (0x%llx dma)", cur_trb, (unsigned long long)xhci_trb_virt_to_dma(cur_seg, cur_trb), cur_seg, @@ -679,7 +679,7 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id, * short, don't muck with the stream ID after * submission. */ - xhci_warn(xhci, "WARN Cancelled URB %p " + xhci_warn(xhci, "WARN Cancelled URB %pK " "has invalid stream ID %u.\n", cur_td->urb, cur_td->urb->stream_id); @@ -1024,7 +1024,7 @@ static void xhci_handle_cmd_set_deq(struct xhci_hcd *xhci, int slot_id, ep_ring, ep_index); } else { xhci_warn(xhci, "Mismatch between completed Set TR Deq Ptr command & xHCI internal state.\n"); - xhci_warn(xhci, "ep deq seg = %p, deq ptr = %p\n", + xhci_warn(xhci, "ep deq seg = %pK, deq ptr = %pK\n", ep->queued_deq_seg, ep->queued_deq_ptr); } } @@ -1208,7 +1208,7 @@ static void xhci_handle_stopped_cmd_ring(struct xhci_hcd *xhci, i_cmd->status = COMP_CMD_STOP; - xhci_dbg(xhci, "Turn aborted command %p to no-op\n", + xhci_dbg(xhci, "Turn aborted command %pK to no-op\n", i_cmd->command_trb); /* get cycle state from the original cmd trb */ cycle_state = le32_to_cpu( @@ -2527,7 +2527,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, URB_SHORT_NOT_OK)) || (status != 0 && !usb_endpoint_xfer_isoc(&urb->ep->desc))) - xhci_dbg(xhci, "Giveback URB %p, len = %d, " + xhci_dbg(xhci, "Giveback URB %pK, len = %d, " "expected = %d, status = %d\n", urb, urb->actual_length, urb->transfer_buffer_length, @@ -4062,7 +4062,7 @@ void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci, int ret; xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, - "Set TR Deq Ptr cmd, new deq seg = %p (0x%llx dma), new deq ptr = %p (0x%llx dma), new cycle = %u", + "Set TR Deq Ptr cmd, new deq seg = %pK (0x%llx dma), new deq ptr = %pK (0x%llx dma), new cycle = %u", deq_state->new_deq_seg, (unsigned long long)deq_state->new_deq_seg->dma, deq_state->new_deq_ptr, @@ -4074,7 +4074,7 @@ void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci, deq_state->new_deq_ptr); if (addr == 0) { xhci_warn(xhci, "WARN Cannot submit Set TR Deq Ptr\n"); - xhci_warn(xhci, "WARN deq seg = %p, deq pt = %p\n", + xhci_warn(xhci, "WARN deq seg = %pK, deq pt = %pK\n", deq_state->new_deq_seg, deq_state->new_deq_ptr); return; } diff --git a/drivers/usb/host/xhci-trace.h b/drivers/usb/host/xhci-trace.h index dde3959b7a33a..6a673fc45d420 100644 --- a/drivers/usb/host/xhci-trace.h +++ b/drivers/usb/host/xhci-trace.h @@ -96,7 +96,7 @@ DECLARE_EVENT_CLASS(xhci_log_ctx, ((HCC_64BYTE_CONTEXT(xhci->hcc_params) + 1) * 32) * ((ctx->type == XHCI_CTX_TYPE_INPUT) + ep_num + 1)); ), - TP_printk("\nctx_64=%d, ctx_type=%u, ctx_dma=@%llx, ctx_va=@%p", + TP_printk("\nctx_64=%d, ctx_type=%u, ctx_dma=@%llx, ctx_va=@%pK", __entry->ctx_64, __entry->ctx_type, (unsigned long long) __entry->ctx_dma, __entry->ctx_va ) @@ -127,7 +127,7 @@ DECLARE_EVENT_CLASS(xhci_log_event, memcpy(__get_dynamic_array(trb), trb_va, sizeof(struct xhci_generic_trb)); ), - TP_printk("\ntrb_dma=@%llx, trb_va=@%p, status=%08x, flags=%08x", + TP_printk("\ntrb_dma=@%llx, trb_va=@%pK, status=%08x, flags=%08x", (unsigned long long) __entry->dma, __entry->va, __entry->status, __entry->flags ) diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index a9216195061ab..4eb4657e7974d 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -654,7 +654,7 @@ int xhci_run(struct usb_hcd *hcd) temp = readl(&xhci->ir_set->irq_pending); xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Enabling event ring interrupter %p by writing 0x%x to irq_pending", + "// Enabling event ring interrupter %pK by writing 0x%x to irq_pending", xhci->ir_set, (unsigned int) ER_IRQ_ENABLE(temp)); writel(ER_IRQ_ENABLE(temp), &xhci->ir_set->irq_pending); xhci_print_ir_set(xhci, 0); @@ -1485,7 +1485,7 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) exit: return ret; dying: - xhci_dbg(xhci, "Ep 0x%x: URB %p submitted for " + xhci_dbg(xhci, "Ep 0x%x: URB %pK submitted for " "non-responsive xHCI host.\n", urb->ep->desc.bEndpointAddress, urb); ret = -ESHUTDOWN; @@ -1609,7 +1609,7 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) if ((xhci->xhc_state & XHCI_STATE_DYING) || (xhci->xhc_state & XHCI_STATE_HALTED)) { xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, - "Ep 0x%x: URB %p to be canceled on " + "Ep 0x%x: URB %pK to be canceled on " "non-responsive xHCI host.", urb->ep->desc.bEndpointAddress, urb); /* Let the stop endpoint command watchdog timer (which set this @@ -1632,7 +1632,7 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) i = urb_priv->td_cnt; if (i < urb_priv->length) xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, - "Cancel URB %p, dev %s, ep 0x%x, " + "Cancel URB %pK, dev %s, ep 0x%x, " "starting at offset 0x%llx", urb, urb->dev->devpath, urb->ep->desc.bEndpointAddress, @@ -1700,7 +1700,7 @@ int xhci_drop_endpoint(struct usb_hcd *hcd, struct usb_device *udev, if (xhci->xhc_state & XHCI_STATE_DYING) return -ENODEV; - xhci_dbg(xhci, "%s called for udev %p\n", __func__, udev); + xhci_dbg(xhci, "%s called for udev %pK\n", __func__, udev); drop_flag = xhci_get_endpoint_flag(&ep->desc); if (drop_flag == SLOT_FLAG || drop_flag == EP0_FLAG) { xhci_dbg(xhci, "xHCI %s - can't drop slot or ep 0 %#x\n", @@ -1726,7 +1726,7 @@ int xhci_drop_endpoint(struct usb_hcd *hcd, struct usb_device *udev, cpu_to_le32(EP_STATE_DISABLED)) || le32_to_cpu(ctrl_ctx->drop_flags) & xhci_get_endpoint_flag(&ep->desc)) { - xhci_warn(xhci, "xHCI %s called with disabled ep %p\n", + xhci_warn(xhci, "xHCI %s called with disabled ep %pK\n", __func__, ep); return 0; } @@ -1821,7 +1821,7 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, */ if (le32_to_cpu(ctrl_ctx->add_flags) & xhci_get_endpoint_flag(&ep->desc)) { - xhci_warn(xhci, "xHCI %s called with enabled ep %p\n", + xhci_warn(xhci, "xHCI %s called with enabled ep %pK\n", __func__, ep); return 0; } @@ -2799,7 +2799,7 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) (xhci->xhc_state & XHCI_STATE_REMOVING)) return -ENODEV; - xhci_dbg(xhci, "%s called for udev %p\n", __func__, udev); + xhci_dbg(xhci, "%s called for udev %pK\n", __func__, udev); virt_dev = xhci->devs[udev->slot_id]; command = xhci_alloc_command(xhci, false, true, GFP_KERNEL); @@ -2896,7 +2896,7 @@ void xhci_reset_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) return; xhci = hcd_to_xhci(hcd); - xhci_dbg(xhci, "%s called for udev %p\n", __func__, udev); + xhci_dbg(xhci, "%s called for udev %pK\n", __func__, udev); virt_dev = xhci->devs[udev->slot_id]; /* Free any rings allocated for added endpoints */ for (i = 0; i < 31; ++i) { @@ -2949,7 +2949,7 @@ static void xhci_setup_input_ctx_for_quirk(struct xhci_hcd *xhci, if (addr == 0) { xhci_warn(xhci, "WARN Cannot submit config ep after " "reset ep command\n"); - xhci_warn(xhci, "WARN deq seg = %p, deq ptr = %p\n", + xhci_warn(xhci, "WARN deq seg = %pK, deq ptr = %pK\n", deq_state->new_deq_seg, deq_state->new_deq_ptr); return; @@ -3970,7 +3970,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, xhci_dbg_trace(xhci, trace_xhci_dbg_address, "Op regs DCBAA ptr = %#016llx", temp_64); xhci_dbg_trace(xhci, trace_xhci_dbg_address, - "Slot ID %d dcbaa entry @%p = %#016llx", + "Slot ID %d dcbaa entry @%pK = %#016llx", udev->slot_id, &xhci->dcbaa->dev_context_ptrs[udev->slot_id], (unsigned long long) diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c index ad408251d9557..060d78d531181 100644 --- a/drivers/usb/mon/mon_text.c +++ b/drivers/usb/mon/mon_text.c @@ -347,7 +347,7 @@ static int mon_text_open(struct inode *inode, struct file *file) rp->r.rnf_error = mon_text_error; rp->r.rnf_complete = mon_text_complete; - snprintf(rp->slab_name, SLAB_NAME_SZ, "mon_text_%p", rp); + snprintf(rp->slab_name, SLAB_NAME_SZ, "mon_text_%pK", rp); rp->e_slab = kmem_cache_create(rp->slab_name, sizeof(struct mon_event_text), sizeof(long), 0, mon_text_ctor); diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index 3985cb2a30712..95386a2f38e92 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c @@ -4516,7 +4516,7 @@ static int msm_otg_probe(struct platform_device *pdev) ret = -ENOMEM; goto devote_bus_bw; } - dev_info(&pdev->dev, "OTG regs = %p\n", motg->regs); + dev_info(&pdev->dev, "OTG regs = %pK\n", motg->regs); if (pdata->enable_sec_phy) { res = platform_get_resource_byname(pdev, diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index 0e400f382f3a8..d28adc350fb92 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -328,7 +328,7 @@ static int queuecommand_lck(struct scsi_cmnd *srb, /* check for state-transition errors */ if (us->srb != NULL) { - printk(KERN_ERR USB_STORAGE "Error in %s: us->srb = %p\n", + printk(KERN_ERR USB_STORAGE "Error in %s: us->srb = %pK\n", __func__, us->srb); return SCSI_MLQUEUE_HOST_BUSY; } diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 38520f818b19d..f3a78254b3078 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -334,7 +334,7 @@ static void queue_pending_output_urbs(struct snd_usb_endpoint *ep) err = usb_submit_urb(ctx->urb, GFP_ATOMIC); if (err < 0) usb_audio_err(ep->chip, - "Unable to submit urb #%d: %d (urb %p)\n", + "Unable to submit urb #%d: %d (urb %pK)\n", ctx->index, err, ctx->urb); else set_bit(ctx->index, &ep->active_mask); @@ -434,7 +434,7 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip, ep->iface == alts->desc.bInterfaceNumber && ep->altsetting == alts->desc.bAlternateSetting) { usb_audio_dbg(ep->chip, - "Re-using EP %x in iface %d,%d @%p\n", + "Re-using EP %x in iface %d,%d @%pK\n", ep_num, ep->iface, ep->altsetting, ep); goto __exit_unlock; } diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index ec214f8e68036..9d5a4b2231da8 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -226,7 +226,7 @@ static int start_endpoints(struct snd_usb_substream *subs, bool can_sleep) if (!test_and_set_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) { struct snd_usb_endpoint *ep = subs->data_endpoint; - dev_dbg(&subs->dev->dev, "Starting data EP @%p\n", ep); + dev_dbg(&subs->dev->dev, "Starting data EP @%pK\n", ep); ep->data_subs = subs; err = snd_usb_endpoint_start(ep, can_sleep); @@ -255,7 +255,7 @@ static int start_endpoints(struct snd_usb_substream *subs, bool can_sleep) } } - dev_dbg(&subs->dev->dev, "Starting sync EP @%p\n", ep); + dev_dbg(&subs->dev->dev, "Starting sync EP @%pK\n", ep); ep->sync_slave = subs->data_endpoint; err = snd_usb_endpoint_start(ep, can_sleep); @@ -599,13 +599,13 @@ static int match_endpoint_audioformats(struct snd_usb_substream *subs, if (fp->channels < 1) { dev_dbg(&subs->dev->dev, - "%s: (fmt @%p) no channels\n", __func__, fp); + "%s: (fmt @%pK) no channels\n", __func__, fp); return 0; } if (!(fp->formats & pcm_format_to_bits(pcm_format))) { dev_dbg(&subs->dev->dev, - "%s: (fmt @%p) no match for format %d\n", __func__, + "%s: (fmt @%pK) no match for format %d\n", __func__, fp, pcm_format); return 0; } @@ -618,7 +618,7 @@ static int match_endpoint_audioformats(struct snd_usb_substream *subs, } if (!score) { dev_dbg(&subs->dev->dev, - "%s: (fmt @%p) no match for rate %d\n", __func__, + "%s: (fmt @%pK) no match for rate %d\n", __func__, fp, rate); return 0; } @@ -627,7 +627,7 @@ static int match_endpoint_audioformats(struct snd_usb_substream *subs, score++; dev_dbg(&subs->dev->dev, - "%s: (fmt @%p) score %d\n", __func__, fp, score); + "%s: (fmt @%pK) score %d\n", __func__, fp, score); return score; } diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index eb44d31f5a244..5b710bb12b444 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -470,7 +470,7 @@ static void uaudio_dev_release(struct kref *kref) { struct uaudio_dev *dev = container_of(kref, struct uaudio_dev, kref); - pr_debug("%s for dev %p\n", __func__, dev); + pr_debug("%s for dev %pK\n", __func__, dev); atomic_set(&dev->in_use, 0); From 1cf0666077a139f0d161e3881b9299132e3e8640 Mon Sep 17 00:00:00 2001 From: Surajit Podder Date: Sat, 21 Jan 2017 02:12:36 +0530 Subject: [PATCH 0564/1015] msm: vidc: Enable WARN_ON based on debug level Enable WARN_ON only when VIDC_INFO debug level is enabled. Change-Id: I39ccb69e0809614c4d85c3e9e13bb6faa8ffd6eb Signed-off-by: Surajit Podder --- .../msm/vidc/governors/msm_vidc_dyn_gov.c | 4 ++-- drivers/media/platform/msm/vidc/msm_vidc.c | 8 +++++-- .../media/platform/msm/vidc/msm_vidc_debug.h | 3 ++- drivers/media/platform/msm/vidc/venus_hfi.c | 24 ++++++++++++------- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/drivers/media/platform/msm/vidc/governors/msm_vidc_dyn_gov.c b/drivers/media/platform/msm/vidc/governors/msm_vidc_dyn_gov.c index 782b0eaa3648e..78d3dd9d752aa 100644 --- a/drivers/media/platform/msm/vidc/governors/msm_vidc_dyn_gov.c +++ b/drivers/media/platform/msm/vidc/governors/msm_vidc_dyn_gov.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -298,7 +298,7 @@ static unsigned long __calculate_vmem_plus_ab(struct vidc_bus_vote_data *d) vmem_plus = 1; dprintk(VIDC_WARN, "could not calculate vmem ab value due to core freq mismatch\n"); - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); } exit: diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c index 157e28c122e83..c08d46fc81cc6 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_vidc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1308,7 +1308,11 @@ static void cleanup_instance(struct msm_vidc_inst *inst) debugfs_remove_recursive(inst->debugfs_root); mutex_lock(&inst->pending_getpropq.lock); - WARN_ON(!list_empty(&inst->pending_getpropq.list)); + if (!list_empty(&inst->pending_getpropq.list)) { + dprintk(VIDC_ERR, + "pending_getpropq not empty\n"); + WARN_ON(VIDC_DBG_WARN_ENABLE); + } mutex_unlock(&inst->pending_getpropq.lock); } } diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.h b/drivers/media/platform/msm/vidc/msm_vidc_debug.h index 557ecee1b4709..55485c673f84d 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_debug.h +++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -23,6 +23,7 @@ #endif #define VIDC_DBG_TAG VIDC_DBG_LABEL ": %4s: " +#define VIDC_DBG_WARN_ENABLE (msm_vidc_debug & VIDC_INFO) /* To enable messages OR these values and * echo the result to debugfs file. diff --git a/drivers/media/platform/msm/vidc/venus_hfi.c b/drivers/media/platform/msm/vidc/venus_hfi.c index 5ff5b17ac8f2d..081459df9016c 100644 --- a/drivers/media/platform/msm/vidc/venus_hfi.c +++ b/drivers/media/platform/msm/vidc/venus_hfi.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -105,7 +105,11 @@ static int __tzbsp_set_video_state(enum tzbsp_video_state state); */ static inline void __strict_check(struct venus_hfi_device *device) { - WARN_ON(!mutex_is_locked(&device->lock)); + if (!mutex_is_locked(&device->lock)) { + dprintk(VIDC_WARN, + "device->lock mutex is not locked\n"); + WARN_ON(VIDC_DBG_WARN_ENABLE); + } } static inline void __set_state(struct venus_hfi_device *device, @@ -267,7 +271,7 @@ static int __acquire_regulator(struct regulator_info *rinfo) if (!regulator_is_enabled(rinfo->regulator)) { dprintk(VIDC_WARN, "Regulator is not enabled %s\n", rinfo->name); - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); } return rc; @@ -617,7 +621,7 @@ static void __write_register(struct venus_hfi_device *device, if (!device->power_enabled) { dprintk(VIDC_WARN, "HFI Write register failed : Power is OFF\n"); - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); return; } @@ -643,7 +647,7 @@ static int __read_register(struct venus_hfi_device *device, u32 reg) if (!device->power_enabled) { dprintk(VIDC_WARN, "HFI Read register failed : Power is OFF\n"); - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); return -EINVAL; } @@ -1346,7 +1350,7 @@ static int __halt_axi(struct venus_hfi_device *device) if (!device->power_enabled) { dprintk(VIDC_WARN, "Clocks are OFF, skipping AXI HALT\n"); - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); return -EINVAL; } @@ -3532,7 +3536,11 @@ static int __response_handler(struct venus_hfi_device *device) if (session_id) { struct hal_session *session = NULL; - WARN_ON(upper_32_bits((uintptr_t)*session_id) != 0); + if (upper_32_bits((uintptr_t)*session_id) != 0) { + dprintk(VIDC_WARN, + "Upper 32 bits of session_id != 0\n"); + WARN_ON(VIDC_DBG_WARN_ENABLE); + } session = __get_session(device, (u32)(uintptr_t)*session_id); if (!session) { @@ -4072,7 +4080,7 @@ static int __disable_regulator(struct regulator_info *rinfo) disable_regulator_failed: /* Bring attention to this issue */ - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); return rc; } From 5bc15f75960108959b065900dd8b9cb411b55d6f Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Tue, 20 Dec 2016 12:23:57 +0530 Subject: [PATCH 0565/1015] clk: msm: gcc: Add support for 19.2MHz for MCLK clocks MCLK clocks require to support 19.2MHz frequency, so add support for the same. Change-Id: If398a74af2359a4c81ff19e8716f72452a0b7fc4 Signed-off-by: Odelu Kukatla --- drivers/clk/msm/clock-gcc-8952.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c index 75d225df33d8a..9d149ddd58585 100644 --- a/drivers/clk/msm/clock-gcc-8952.c +++ b/drivers/clk/msm/clock-gcc-8952.c @@ -1299,6 +1299,7 @@ static struct rcg_clk jpeg0_clk_src = { }; static struct clk_freq_tbl ftbl_gcc_camss_mclk0_2_clk[] = { + F( 19200000, xo, 1, 0, 0), F( 24000000, gpll6, 1, 1, 45), F( 66670000, gpll0, 12, 0, 0), F_END From 02b1a65cb27f548c48ec89439cca21f50443bfdf Mon Sep 17 00:00:00 2001 From: Xiaoyu Ye Date: Tue, 20 Dec 2016 10:56:59 -0800 Subject: [PATCH 0566/1015] mfd: wcd9xxx: Add range checking in function wcd9xxx_init_slimslave Range checking is added to prevent buffer overflow. CRs-Fixed: 1098363 Change-Id: I5871a3a11ec5f5106a386bf149d7ec22605f3db8 Signed-off-by: Xiaoyu Ye --- drivers/mfd/wcd9xxx-slimslave.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/mfd/wcd9xxx-slimslave.c b/drivers/mfd/wcd9xxx-slimslave.c index 30fd0dedd6099..d768506f52604 100644 --- a/drivers/mfd/wcd9xxx-slimslave.c +++ b/drivers/mfd/wcd9xxx-slimslave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -62,6 +62,10 @@ int wcd9xxx_init_slimslave(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la, goto err; } + if (!rx_num || rx_num > wcd9xxx->num_rx_port) { + pr_err("%s: invalid rx num %d\n", __func__, rx_num); + return -EINVAL; + } if (wcd9xxx->rx_chs) { wcd9xxx->num_rx_port = rx_num; for (i = 0; i < rx_num; i++) { @@ -84,6 +88,10 @@ int wcd9xxx_init_slimslave(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la, wcd9xxx->num_rx_port); } + if (!tx_num || tx_num > wcd9xxx->num_tx_port) { + pr_err("%s: invalid tx num %d\n", __func__, tx_num); + return -EINVAL; + } if (wcd9xxx->tx_chs) { wcd9xxx->num_tx_port = tx_num; for (i = 0; i < tx_num; i++) { From 63a46cf240f136e22fb1f405845c7e6544059693 Mon Sep 17 00:00:00 2001 From: Karthikeyan Mani Date: Tue, 3 Jan 2017 14:46:23 -0800 Subject: [PATCH 0567/1015] ASoC: msm: qdsp6v2: Fix out-of-bounds access in put functions Add out of bounds check in routing put functions for the mux value before accessing the texts pointer of soc_enum struct with mux as index. CRs-fixed: 1097569 Change-Id: Ib9ef8d398f0765754b0f79666963fac043b66077 Signed-off-by: Karthikeyan Mani --- sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c index 8db421c5633f0..058340fd42ff0 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c @@ -1978,6 +1978,11 @@ static int msm_routing_ec_ref_rx_put(struct snd_kcontrol *kcontrol, struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; struct snd_soc_dapm_update *update = NULL; + if (mux >= e->items) { + pr_err("%s: Invalid mux value %d\n", __func__, mux); + return -EINVAL; + } + mutex_lock(&routing_lock); switch (ucontrol->value.integer.value[0]) { case 0: @@ -2137,6 +2142,11 @@ static int msm_routing_ext_ec_put(struct snd_kcontrol *kcontrol, uint16_t ext_ec_ref_port_id; struct snd_soc_dapm_update *update = NULL; + if (mux >= e->items) { + pr_err("%s: Invalid mux value %d\n", __func__, mux); + return -EINVAL; + } + mutex_lock(&routing_lock); msm_route_ext_ec_ref = ucontrol->value.integer.value[0]; From 796af26f9c14328be0a8d4cf5d4647c76b3c2f65 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Wed, 25 Jan 2017 13:50:52 +0530 Subject: [PATCH 0568/1015] ARM: dts: msm: Update APC CPR voltage margins for msm8920 Update APC CPR static open-loop and closed-loop voltage margins for msm8920 as per new voltage characterization results. CRs-Fixed: 1115776 Change-Id: Ief25d4eab816faccdd9e2d97ee1a5477867415cf Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8920.dtsi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 6a1232f9b7aa6..f8cc7d9a48f75 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -236,6 +236,7 @@ < 0 0 (-1) (-1) (-1) (-1)>, < 0 1 1 (-1) (-1) (-1)>, < 0 1 (-1) (-1) (-1) (-1)>, + < 0 5 (-1) (-1) (-1) (-1)>, <(-1) (-1) (-1) (-1) (-1) (-1)>; qcom,cpr-init-voltage-adjustment = @@ -243,6 +244,7 @@ <15000 15000 25000>, < 0 0 0 >, <15000 5000 0 >, + < 5000 10000 5000>, < 0 0 0 >; qcom,cpr-quotient-adjustment = @@ -250,6 +252,7 @@ <0 0 19 >, /* SVSP(-5) NOM(-10) TUR(-5); KV(1.9) */ <(-38) (-28) (-38)>, /* SVSP(-20) NOM(-15) TUR(-20); KV(1.9) */ <0 0 0 >, + <(-28) 0 10 >, /* SVSP(-15) TUR(5); KV(1.9) */ <0 0 0 >; qcom,cpr-enable; From af03135b422506b336bd12b1adc43cad2e7220f1 Mon Sep 17 00:00:00 2001 From: Ghanim Fodi Date: Thu, 12 Jan 2017 15:14:15 +0200 Subject: [PATCH 0569/1015] msm: ipa: Prevent multiple header deletion from user space An IPA header or processing context can be added once and later deleted once from user space. Multiple deletion may cause invalid state of the headers software cache. Change-Id: Ic0b8472b7fd8a76233a007d90c832af726184574 CRs-fixed: 1097714 Signed-off-by: Ghanim Fodi --- drivers/platform/msm/ipa/ipa_v2/ipa.c | 13 ++-- drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c | 79 ++++++++++++++++++----- drivers/platform/msm/ipa/ipa_v2/ipa_i.h | 13 +++- drivers/platform/msm/ipa/ipa_v3/ipa.c | 11 ++-- drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c | 79 ++++++++++++++++++----- drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 11 +++- 6 files changed, 162 insertions(+), 44 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa.c b/drivers/platform/msm/ipa/ipa_v2/ipa.c index d35140e138bcd..6c842a46296a5 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -734,7 +734,8 @@ static long ipa_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) retval = -EINVAL; break; } - if (ipa2_del_hdr((struct ipa_ioc_del_hdr *)param)) { + if (ipa2_del_hdr_by_user((struct ipa_ioc_del_hdr *)param, + true)) { retval = -EFAULT; break; } @@ -1418,8 +1419,8 @@ static long ipa_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) retval = -EINVAL; break; } - if (ipa2_del_hdr_proc_ctx( - (struct ipa_ioc_del_hdr_proc_ctx *)param)) { + if (ipa2_del_hdr_proc_ctx_by_user( + (struct ipa_ioc_del_hdr_proc_ctx *)param, true)) { retval = -EFAULT; break; } @@ -2801,7 +2802,7 @@ static int ipa_setup_apps_pipes(void) if (ipa_ctx->dflt_v4_rt_rule_hdl) __ipa_del_rt_rule(ipa_ctx->dflt_v4_rt_rule_hdl); if (ipa_ctx->excp_hdr_hdl) - __ipa_del_hdr(ipa_ctx->excp_hdr_hdl); + __ipa_del_hdr(ipa_ctx->excp_hdr_hdl, false); ipa2_teardown_sys_pipe(ipa_ctx->clnt_hdl_cmd); fail_cmd: return result; @@ -2813,7 +2814,7 @@ static void ipa_teardown_apps_pipes(void) ipa2_teardown_sys_pipe(ipa_ctx->clnt_hdl_data_in); __ipa_del_rt_rule(ipa_ctx->dflt_v6_rt_rule_hdl); __ipa_del_rt_rule(ipa_ctx->dflt_v4_rt_rule_hdl); - __ipa_del_hdr(ipa_ctx->excp_hdr_hdl); + __ipa_del_hdr(ipa_ctx->excp_hdr_hdl, false); ipa2_teardown_sys_pipe(ipa_ctx->clnt_hdl_cmd); } diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c b/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c index ee4ddbb9b926d..6a66b0b12254c 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -805,7 +805,8 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) return -EPERM; } -static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) +static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, + bool release_hdr, bool by_user) { struct ipa_hdr_proc_ctx_entry *entry; struct ipa_hdr_proc_ctx_tbl *htbl = &ipa_ctx->hdr_proc_ctx_tbl; @@ -819,6 +820,14 @@ static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) IPADBG("del ctx proc cnt=%d ofst=%d\n", htbl->proc_ctx_cnt, entry->offset_entry->offset); + if (by_user && entry->user_deleted) { + IPAERR("proc_ctx already deleted by user\n"); + return -EINVAL; + } + + if (by_user) + entry->user_deleted = true; + if (--entry->ref_cnt) { IPADBG("proc_ctx_hdl %x ref_cnt %d\n", proc_ctx_hdl, entry->ref_cnt); @@ -826,7 +835,7 @@ static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) } if (release_hdr) - __ipa_del_hdr(entry->hdr->id); + __ipa_del_hdr(entry->hdr->id, false); /* move the offset entry to appropriate free list */ list_move(&entry->offset_entry->link, @@ -843,7 +852,7 @@ static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) } -int __ipa_del_hdr(u32 hdr_hdl) +int __ipa_del_hdr(u32 hdr_hdl, bool by_user) { struct ipa_hdr_entry *entry; struct ipa_hdr_tbl *htbl = &ipa_ctx->hdr_tbl; @@ -854,7 +863,7 @@ int __ipa_del_hdr(u32 hdr_hdl) return -EINVAL; } - if (!entry || (entry->cookie != IPA_COOKIE)) { + if (entry->cookie != IPA_COOKIE) { IPAERR("bad parm\n"); return -EINVAL; } @@ -866,6 +875,14 @@ int __ipa_del_hdr(u32 hdr_hdl) IPADBG("del hdr of sz=%d hdr_cnt=%d ofst=%d\n", entry->hdr_len, htbl->hdr_cnt, entry->offset_entry->offset); + if (by_user && entry->user_deleted) { + IPAERR("hdr already deleted by user\n"); + return -EINVAL; + } + + if (by_user) + entry->user_deleted = true; + if (--entry->ref_cnt) { IPADBG("hdr_hdl %x ref_cnt %d\n", hdr_hdl, entry->ref_cnt); return 0; @@ -876,7 +893,7 @@ int __ipa_del_hdr(u32 hdr_hdl) entry->phys_base, entry->hdr_len, DMA_TO_DEVICE); - __ipa_del_hdr_proc_ctx(entry->proc_ctx->id, false); + __ipa_del_hdr_proc_ctx(entry->proc_ctx->id, false, false); } else { /* move the offset entry to appropriate free list */ list_move(&entry->offset_entry->link, @@ -943,15 +960,16 @@ int ipa2_add_hdr(struct ipa_ioc_add_hdr *hdrs) } /** - * ipa2_del_hdr() - Remove the specified headers from SW and optionally commit them - * to IPA HW + * ipa2_del_hdr_by_user() - Remove the specified headers + * from SW and optionally commit them to IPA HW * @hdls: [inout] set of headers to delete + * @by_user: Operation requested by user? * * Returns: 0 on success, negative on failure * * Note: Should not be called from atomic context */ -int ipa2_del_hdr(struct ipa_ioc_del_hdr *hdls) +int ipa2_del_hdr_by_user(struct ipa_ioc_del_hdr *hdls, bool by_user) { int i; int result = -EFAULT; @@ -968,7 +986,7 @@ int ipa2_del_hdr(struct ipa_ioc_del_hdr *hdls) mutex_lock(&ipa_ctx->lock); for (i = 0; i < hdls->num_hdls; i++) { - if (__ipa_del_hdr(hdls->hdl[i].hdl)) { + if (__ipa_del_hdr(hdls->hdl[i].hdl, by_user)) { IPAERR("failed to del hdr %i\n", i); hdls->hdl[i].status = -1; } else { @@ -988,6 +1006,20 @@ int ipa2_del_hdr(struct ipa_ioc_del_hdr *hdls) return result; } +/** + * ipa2_del_hdr() - Remove the specified headers from SW and optionally commit them + * to IPA HW + * @hdls: [inout] set of headers to delete + * + * Returns: 0 on success, negative on failure + * + * Note: Should not be called from atomic context + */ +int ipa2_del_hdr(struct ipa_ioc_del_hdr *hdls) +{ + return ipa2_del_hdr_by_user(hdls, false); +} + /** * ipa2_add_hdr_proc_ctx() - add the specified headers to SW * and optionally commit them to IPA HW @@ -1040,16 +1072,18 @@ int ipa2_add_hdr_proc_ctx(struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs) } /** - * ipa2_del_hdr_proc_ctx() - + * ipa2_del_hdr_proc_ctx_by_user() - * Remove the specified processing context headers from SW and * optionally commit them to IPA HW. * @hdls: [inout] set of processing context headers to delete + * @by_user: Operation requested by user? * * Returns: 0 on success, negative on failure * * Note: Should not be called from atomic context */ -int ipa2_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) +int ipa2_del_hdr_proc_ctx_by_user(struct ipa_ioc_del_hdr_proc_ctx *hdls, + bool by_user) { int i; int result; @@ -1068,7 +1102,7 @@ int ipa2_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) mutex_lock(&ipa_ctx->lock); for (i = 0; i < hdls->num_hdls; i++) { - if (__ipa_del_hdr_proc_ctx(hdls->hdl[i].hdl, true)) { + if (__ipa_del_hdr_proc_ctx(hdls->hdl[i].hdl, true, by_user)) { IPAERR("failed to del hdr %i\n", i); hdls->hdl[i].status = -1; } else { @@ -1088,6 +1122,21 @@ int ipa2_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) return result; } +/** + * ipa2_del_hdr_proc_ctx() - + * Remove the specified processing context headers from SW and + * optionally commit them to IPA HW. + * @hdls: [inout] set of processing context headers to delete + * + * Returns: 0 on success, negative on failure + * + * Note: Should not be called from atomic context + */ +int ipa2_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) +{ + return ipa2_del_hdr_proc_ctx_by_user(hdls, false); +} + /** * ipa2_commit_hdr() - commit to IPA HW the current header table in SW * @@ -1316,7 +1365,7 @@ int __ipa_release_hdr(u32 hdr_hdl) { int result = 0; - if (__ipa_del_hdr(hdr_hdl)) { + if (__ipa_del_hdr(hdr_hdl, false)) { IPADBG("fail to del hdr %x\n", hdr_hdl); result = -EFAULT; goto bail; @@ -1344,7 +1393,7 @@ int __ipa_release_hdr_proc_ctx(u32 proc_ctx_hdl) { int result = 0; - if (__ipa_del_hdr_proc_ctx(proc_ctx_hdl, true)) { + if (__ipa_del_hdr_proc_ctx(proc_ctx_hdl, true, false)) { IPADBG("fail to del hdr %x\n", proc_ctx_hdl); result = -EFAULT; goto bail; diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h index 73ff75ac0b5dd..fb0de21028bed 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -251,6 +251,7 @@ struct ipa_rt_tbl { * @id: header entry id * @is_eth2_ofst_valid: is eth2_ofst field valid? * @eth2_ofst: offset to start of Ethernet-II/802.3 header + * @user_deleted: is the header deleted by the user? */ struct ipa_hdr_entry { struct list_head link; @@ -268,6 +269,7 @@ struct ipa_hdr_entry { int id; u8 is_eth2_ofst_valid; u16 eth2_ofst; + bool user_deleted; }; /** @@ -331,6 +333,7 @@ struct ipa_hdr_proc_ctx_add_hdr_cmd_seq { * @cookie: cookie used for validity check * @ref_cnt: reference counter of routing table * @id: processing context header entry id + * @user_deleted: is the hdr processing context deleted by the user? */ struct ipa_hdr_proc_ctx_entry { struct list_head link; @@ -340,6 +343,7 @@ struct ipa_hdr_proc_ctx_entry { u32 cookie; u32 ref_cnt; int id; + bool user_deleted; }; /** @@ -1347,6 +1351,8 @@ int ipa2_add_hdr(struct ipa_ioc_add_hdr *hdrs); int ipa2_del_hdr(struct ipa_ioc_del_hdr *hdls); +int ipa2_del_hdr_by_user(struct ipa_ioc_del_hdr *hdls, bool by_user); + int ipa2_commit_hdr(void); int ipa2_reset_hdr(void); @@ -1364,6 +1370,9 @@ int ipa2_add_hdr_proc_ctx(struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs); int ipa2_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls); +int ipa2_del_hdr_proc_ctx_by_user(struct ipa_ioc_del_hdr_proc_ctx *hdls, + bool by_user); + /* * Routing */ @@ -1655,7 +1664,7 @@ int ipa2_active_clients_log_print_table(char *buf, int size); void ipa2_active_clients_log_clear(void); int ipa_interrupts_init(u32 ipa_irq, u32 ee, struct device *ipa_dev); int __ipa_del_rt_rule(u32 rule_hdl); -int __ipa_del_hdr(u32 hdr_hdl); +int __ipa_del_hdr(u32 hdr_hdl, bool by_user); int __ipa_release_hdr(u32 hdr_hdl); int __ipa_release_hdr_proc_ctx(u32 proc_ctx_hdl); int _ipa_read_gen_reg_v1_1(char *buff, int max_len); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 3f0d982857b28..63870cf4d2012 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -759,7 +759,8 @@ static long ipa3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) retval = -EINVAL; break; } - if (ipa3_del_hdr((struct ipa_ioc_del_hdr *)param)) { + if (ipa3_del_hdr_by_user((struct ipa_ioc_del_hdr *)param, + true)) { retval = -EFAULT; break; } @@ -1528,8 +1529,8 @@ static long ipa3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) retval = -EINVAL; break; } - if (ipa3_del_hdr_proc_ctx( - (struct ipa_ioc_del_hdr_proc_ctx *)param)) { + if (ipa3_del_hdr_proc_ctx_by_user( + (struct ipa_ioc_del_hdr_proc_ctx *)param, true)) { retval = -EFAULT; break; } @@ -2978,7 +2979,7 @@ static int ipa3_setup_apps_pipes(void) if (ipa3_ctx->dflt_v4_rt_rule_hdl) __ipa3_del_rt_rule(ipa3_ctx->dflt_v4_rt_rule_hdl); if (ipa3_ctx->excp_hdr_hdl) - __ipa3_del_hdr(ipa3_ctx->excp_hdr_hdl); + __ipa3_del_hdr(ipa3_ctx->excp_hdr_hdl, false); ipa3_teardown_sys_pipe(ipa3_ctx->clnt_hdl_cmd); fail_cmd: return result; @@ -2990,7 +2991,7 @@ static void ipa3_teardown_apps_pipes(void) ipa3_teardown_sys_pipe(ipa3_ctx->clnt_hdl_data_in); __ipa3_del_rt_rule(ipa3_ctx->dflt_v6_rt_rule_hdl); __ipa3_del_rt_rule(ipa3_ctx->dflt_v4_rt_rule_hdl); - __ipa3_del_hdr(ipa3_ctx->excp_hdr_hdl); + __ipa3_del_hdr(ipa3_ctx->excp_hdr_hdl, false); ipa3_teardown_sys_pipe(ipa3_ctx->clnt_hdl_cmd); } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c index a2e77648f23dd..ecb4b8773b1e1 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -566,7 +566,8 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) return -EPERM; } -static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) +static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, + bool release_hdr, bool by_user) { struct ipa3_hdr_proc_ctx_entry *entry; struct ipa3_hdr_proc_ctx_tbl *htbl = &ipa3_ctx->hdr_proc_ctx_tbl; @@ -580,6 +581,14 @@ static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) IPADBG("del ctx proc cnt=%d ofst=%d\n", htbl->proc_ctx_cnt, entry->offset_entry->offset); + if (by_user && entry->user_deleted) { + IPAERR("proc_ctx already deleted by user\n"); + return -EINVAL; + } + + if (by_user) + entry->user_deleted = true; + if (--entry->ref_cnt) { IPADBG("proc_ctx_hdl %x ref_cnt %d\n", proc_ctx_hdl, entry->ref_cnt); @@ -587,7 +596,7 @@ static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) } if (release_hdr) - __ipa3_del_hdr(entry->hdr->id); + __ipa3_del_hdr(entry->hdr->id, false); /* move the offset entry to appropriate free list */ list_move(&entry->offset_entry->link, @@ -604,7 +613,7 @@ static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) } -int __ipa3_del_hdr(u32 hdr_hdl) +int __ipa3_del_hdr(u32 hdr_hdl, bool by_user) { struct ipa3_hdr_entry *entry; struct ipa3_hdr_tbl *htbl = &ipa3_ctx->hdr_tbl; @@ -615,7 +624,7 @@ int __ipa3_del_hdr(u32 hdr_hdl) return -EINVAL; } - if (!entry || (entry->cookie != IPA_COOKIE)) { + if (entry->cookie != IPA_COOKIE) { IPAERR("bad parm\n"); return -EINVAL; } @@ -627,6 +636,14 @@ int __ipa3_del_hdr(u32 hdr_hdl) IPADBG("del hdr of sz=%d hdr_cnt=%d ofst=%d\n", entry->hdr_len, htbl->hdr_cnt, entry->offset_entry->offset); + if (by_user && entry->user_deleted) { + IPAERR("proc_ctx already deleted by user\n"); + return -EINVAL; + } + + if (by_user) + entry->user_deleted = true; + if (--entry->ref_cnt) { IPADBG("hdr_hdl %x ref_cnt %d\n", hdr_hdl, entry->ref_cnt); return 0; @@ -637,7 +654,7 @@ int __ipa3_del_hdr(u32 hdr_hdl) entry->phys_base, entry->hdr_len, DMA_TO_DEVICE); - __ipa3_del_hdr_proc_ctx(entry->proc_ctx->id, false); + __ipa3_del_hdr_proc_ctx(entry->proc_ctx->id, false, false); } else { /* move the offset entry to appropriate free list */ list_move(&entry->offset_entry->link, @@ -699,15 +716,16 @@ int ipa3_add_hdr(struct ipa_ioc_add_hdr *hdrs) } /** - * ipa3_del_hdr() - Remove the specified headers from SW and optionally commit them - * to IPA HW + * ipa3_del_hdr_by_user() - Remove the specified headers + * from SW and optionally commit them to IPA HW * @hdls: [inout] set of headers to delete + * @by_user: Operation requested by user? * * Returns: 0 on success, negative on failure * * Note: Should not be called from atomic context */ -int ipa3_del_hdr(struct ipa_ioc_del_hdr *hdls) +int ipa3_del_hdr_by_user(struct ipa_ioc_del_hdr *hdls, bool by_user) { int i; int result = -EFAULT; @@ -719,7 +737,7 @@ int ipa3_del_hdr(struct ipa_ioc_del_hdr *hdls) mutex_lock(&ipa3_ctx->lock); for (i = 0; i < hdls->num_hdls; i++) { - if (__ipa3_del_hdr(hdls->hdl[i].hdl)) { + if (__ipa3_del_hdr(hdls->hdl[i].hdl, by_user)) { IPAERR("failed to del hdr %i\n", i); hdls->hdl[i].status = -1; } else { @@ -739,6 +757,20 @@ int ipa3_del_hdr(struct ipa_ioc_del_hdr *hdls) return result; } +/** + * ipa3_del_hdr() - Remove the specified headers from SW and optionally commit them + * to IPA HW + * @hdls: [inout] set of headers to delete + * + * Returns: 0 on success, negative on failure + * + * Note: Should not be called from atomic context + */ +int ipa3_del_hdr(struct ipa_ioc_del_hdr *hdls) +{ + return ipa3_del_hdr_by_user(hdls, false); +} + /** * ipa3_add_hdr_proc_ctx() - add the specified headers to SW * and optionally commit them to IPA HW @@ -784,16 +816,18 @@ int ipa3_add_hdr_proc_ctx(struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs) } /** - * ipa3_del_hdr_proc_ctx() - + * ipa3_del_hdr_proc_ctx_by_user() - * Remove the specified processing context headers from SW and * optionally commit them to IPA HW. * @hdls: [inout] set of processing context headers to delete + * @by_user: Operation requested by user? * * Returns: 0 on success, negative on failure * * Note: Should not be called from atomic context */ -int ipa3_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) +int ipa3_del_hdr_proc_ctx_by_user(struct ipa_ioc_del_hdr_proc_ctx *hdls, + bool by_user) { int i; int result; @@ -805,7 +839,7 @@ int ipa3_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) mutex_lock(&ipa3_ctx->lock); for (i = 0; i < hdls->num_hdls; i++) { - if (__ipa3_del_hdr_proc_ctx(hdls->hdl[i].hdl, true)) { + if (__ipa3_del_hdr_proc_ctx(hdls->hdl[i].hdl, true, by_user)) { IPAERR("failed to del hdr %i\n", i); hdls->hdl[i].status = -1; } else { @@ -825,6 +859,21 @@ int ipa3_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) return result; } +/** + * ipa3_del_hdr_proc_ctx() - + * Remove the specified processing context headers from SW and + * optionally commit them to IPA HW. + * @hdls: [inout] set of processing context headers to delete + * + * Returns: 0 on success, negative on failure + * + * Note: Should not be called from atomic context + */ +int ipa3_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) +{ + return ipa3_del_hdr_proc_ctx_by_user(hdls, false); +} + /** * ipa3_commit_hdr() - commit to IPA HW the current header table in SW * @@ -1053,7 +1102,7 @@ int __ipa3_release_hdr(u32 hdr_hdl) { int result = 0; - if (__ipa3_del_hdr(hdr_hdl)) { + if (__ipa3_del_hdr(hdr_hdl, false)) { IPADBG("fail to del hdr %x\n", hdr_hdl); result = -EFAULT; goto bail; @@ -1081,7 +1130,7 @@ int __ipa3_release_hdr_proc_ctx(u32 proc_ctx_hdl) { int result = 0; - if (__ipa3_del_hdr_proc_ctx(proc_ctx_hdl, true)) { + if (__ipa3_del_hdr_proc_ctx(proc_ctx_hdl, true, false)) { IPADBG("fail to del hdr %x\n", proc_ctx_hdl); result = -EFAULT; goto bail; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index cb0adc3aa8ed6..50386a6b0770d 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -316,6 +316,7 @@ struct ipa3_rt_tbl { * @id: header entry id * @is_eth2_ofst_valid: is eth2_ofst field valid? * @eth2_ofst: offset to start of Ethernet-II/802.3 header + * @user_deleted: is the header deleted by the user? */ struct ipa3_hdr_entry { struct list_head link; @@ -333,6 +334,7 @@ struct ipa3_hdr_entry { int id; u8 is_eth2_ofst_valid; u16 eth2_ofst; + bool user_deleted; }; /** @@ -372,6 +374,7 @@ struct ipa3_hdr_proc_ctx_offset_entry { * @cookie: cookie used for validity check * @ref_cnt: reference counter of routing table * @id: processing context header entry id + * @user_deleted: is the hdr processing context deleted by the user? */ struct ipa3_hdr_proc_ctx_entry { struct list_head link; @@ -381,6 +384,7 @@ struct ipa3_hdr_proc_ctx_entry { u32 cookie; u32 ref_cnt; int id; + bool user_deleted; }; /** @@ -1512,6 +1516,8 @@ int ipa3_add_hdr(struct ipa_ioc_add_hdr *hdrs); int ipa3_del_hdr(struct ipa_ioc_del_hdr *hdls); +int ipa3_del_hdr_by_user(struct ipa_ioc_del_hdr *hdls, bool by_user); + int ipa3_commit_hdr(void); int ipa3_reset_hdr(void); @@ -1529,6 +1535,9 @@ int ipa3_add_hdr_proc_ctx(struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs); int ipa3_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls); +int ipa3_del_hdr_proc_ctx_by_user(struct ipa_ioc_del_hdr_proc_ctx *hdls, + bool by_user); + /* * Routing */ @@ -1833,7 +1842,7 @@ int ipa3_active_clients_log_print_table(char *buf, int size); void ipa3_active_clients_log_clear(void); int ipa3_interrupts_init(u32 ipa_irq, u32 ee, struct device *ipa_dev); int __ipa3_del_rt_rule(u32 rule_hdl); -int __ipa3_del_hdr(u32 hdr_hdl); +int __ipa3_del_hdr(u32 hdr_hdl, bool by_user); int __ipa3_release_hdr(u32 hdr_hdl); int __ipa3_release_hdr_proc_ctx(u32 proc_ctx_hdl); int _ipa_read_ep_reg_v3_0(char *buf, int max_len, int pipe); From c35a81e03c1342b86399c94ab4a7332bd66c313a Mon Sep 17 00:00:00 2001 From: Puja Gupta Date: Mon, 16 Jan 2017 15:56:27 -0800 Subject: [PATCH 0570/1015] soc: qcom: pil: Fix kernel pointer leak Replace WARN with pr_warn so that stack trace is not printed with the message. CRs-Fixed: 1111653 Change-Id: Id1c7bbe8a528199261455ba7901e9df81913aef8 Signed-off-by: Puja Gupta --- drivers/soc/qcom/subsystem_restart.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/soc/qcom/subsystem_restart.c b/drivers/soc/qcom/subsystem_restart.c index 4de596cb78516..34ff85ecef465 100644 --- a/drivers/soc/qcom/subsystem_restart.c +++ b/drivers/soc/qcom/subsystem_restart.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1042,8 +1042,9 @@ int subsystem_restart_dev(struct subsys_device *dev) pr_info("Restart sequence requested for %s, restart_level = %s.\n", name, restart_levels[dev->restart_level]); - if (WARN(disable_restart_work == DISABLE_SSR, - "subsys-restart: Ignoring restart request for %s.\n", name)) { + if (disable_restart_work == DISABLE_SSR) { + pr_warn("subsys-restart: Ignoring restart request for %s.\n", + name); return 0; } From e22c58eeaa35e9fa0555021644ea547d6663d85d Mon Sep 17 00:00:00 2001 From: "Sravan Kumar D.V.N" Date: Fri, 6 Jan 2017 13:50:04 +0530 Subject: [PATCH 0571/1015] msm: mdss: Clear compat structures before copying to user In the compat layer, the temporary structures used to convert data from 32bit to 64bit structures need to be set to 0 before being assigned values. CRs-Fixed: 1103689 Change-Id: I405500f427f3f4dc4d38a9fb188fece9a31614ca Signed-off-by: Sravan Kumar D.V.N --- drivers/video/msm/mdss/mdss_compat_utils.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_compat_utils.c b/drivers/video/msm/mdss/mdss_compat_utils.c index 9f1a24431de92..e86c087d13a5f 100644 --- a/drivers/video/msm/mdss/mdss_compat_utils.c +++ b/drivers/video/msm/mdss/mdss_compat_utils.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * Copyright (C) 1994 Martin Schaller * * 2001 - Documented with DocBook @@ -935,6 +935,7 @@ static int __to_user_pcc_coeff_v1_7( struct mdp_pcc_data_v1_7_32 pcc_cfg_payload32; struct mdp_pcc_data_v1_7 pcc_cfg_payload; + memset(&pcc_cfg_payload32, 0, sizeof(pcc_cfg_payload32)); if (copy_from_user(&pcc_cfg_payload, pcc_cfg->cfg_payload, sizeof(struct mdp_pcc_data_v1_7))) { @@ -2130,6 +2131,7 @@ static int __to_user_pa_data_v1_7( struct mdp_pa_data_v1_7_32 pa_cfg_payload32; struct mdp_pa_data_v1_7 pa_cfg_payload; + memset(&pa_cfg_payload32, 0, sizeof(pa_cfg_payload32)); if (copy_from_user(&pa_cfg_payload, pa_v2_cfg->cfg_payload, sizeof(pa_cfg_payload))) { From 17b37501db36fb1723e31ea17961b66df7432fc7 Mon Sep 17 00:00:00 2001 From: Ping Li Date: Tue, 3 Jan 2017 13:19:32 -0800 Subject: [PATCH 0572/1015] msm: mdss: Add sanity check for Gamut LUT size The Gamut LUT size passed from user space needs to go through a sanity check to avoid heap overflow. This patch adds the missing sanity check in the Gamut LUT config write path. Change-Id: I365938e06dbc6ca01961c9be01db10a5a9c863e4 Signed-off-by: Ping Li --- drivers/video/msm/mdss/mdss_mdp_pp.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_mdp_pp.c b/drivers/video/msm/mdss/mdss_mdp_pp.c index 3960595c2547c..029fad1834e78 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp.c @@ -4671,6 +4671,11 @@ int mdss_mdp_gamut_config(struct msm_fb_data_type *mfd, goto gamut_set_dirty; } } + if (pp_gm_has_invalid_lut_size(config)) { + pr_err("invalid lut size for gamut\n"); + ret = -EINVAL; + goto gamut_config_exit; + } local_cfg = *config; tbl_off = mdss_pp_res->gamut_tbl[disp_num]; for (i = 0; i < MDP_GAMUT_TABLE_NUM; i++) { From a873a99d652628c83896e86ae71e36b5413ca1ff Mon Sep 17 00:00:00 2001 From: Sachin Bhayare Date: Fri, 23 Dec 2016 11:22:44 +0530 Subject: [PATCH 0573/1015] msm: mdss: Fix invalid dma attachment during fb shutdown If DMA attachment fail during fb_mmap, all ION memory will get free. It is necessary to reset the fbmem and fb_attachemnt pointer to NULL, otherwise during shutdown will perform another free and causing issue. CRs-Fixed: 1090244 Change-Id: I92affcf2ce039eecfc72b7c191e058f37815c726 Signed-off-by: Benjamin Chan Signed-off-by: Sachin Bhayare --- drivers/video/msm/mdss/mdss_fb.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index b0e1ea9c54f2f..a7abb6c258349 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -2076,6 +2076,10 @@ int mdss_fb_alloc_fb_ion_memory(struct msm_fb_data_type *mfd, size_t fb_size) dma_buf_put(mfd->fbmem_buf); fb_mmap_failed: ion_free(mfd->fb_ion_client, mfd->fb_ion_handle); + mfd->fb_attachment = NULL; + mfd->fb_table = NULL; + mfd->fb_ion_handle = NULL; + mfd->fbmem_buf = NULL; return rc; } From f09a69e9d4f555d3c26fe35e731f3a58cadca8db Mon Sep 17 00:00:00 2001 From: Conner Huff Date: Thu, 12 Jan 2017 22:09:16 -0700 Subject: [PATCH 0574/1015] net: rmnet_data: Fix incorrect netlink handling rmnet_data netlink handler currently does not check for the incoming process pid and instead just loops back the pid. A malicious root user could potentially send a message with source pid 0 and this could cause rmnet_data to loop the message back till an out of memory situation occurs. rmnet_data also does not check for the message length of the incoming netlink messages and instead casts the netlink message without checking for the boundary. Fix these two scenarios by adding the pid and message length checks respectively. Bug: 31252965 CRs-Fixed: 1098801 Change-Id: I172c1a7112e67e82959b397af7ddfd963d819bdc Signed-off-by: Conner Huff --- net/rmnet_data/rmnet_data_config.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/net/rmnet_data/rmnet_data_config.c b/net/rmnet_data/rmnet_data_config.c index 9f5a2ccbb7cd2..7876b74162094 100644 --- a/net/rmnet_data/rmnet_data_config.c +++ b/net/rmnet_data/rmnet_data_config.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2015, 2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -531,6 +531,11 @@ void rmnet_config_netlink_msg_handler(struct sk_buff *skb) nlmsg_header = (struct nlmsghdr *) skb->data; rmnet_header = (struct rmnet_nl_msg_s *) nlmsg_data(nlmsg_header); + if (!nlmsg_header->nlmsg_pid || + (nlmsg_header->nlmsg_len < sizeof(struct nlmsghdr) + + sizeof(struct rmnet_nl_msg_s))) + return; + LOGL("Netlink message pid=%d, seq=%d, length=%d, rmnet_type=%d", nlmsg_header->nlmsg_pid, nlmsg_header->nlmsg_seq, From 349109a41a514e0aa31b788f3793a3b38fa027ab Mon Sep 17 00:00:00 2001 From: Banajit Goswami Date: Wed, 6 Jan 2016 12:13:17 -0800 Subject: [PATCH 0575/1015] mfd: wcd9xxx: send down notification to devices before cleaning-up IRQs IRQ clean up should be done only after codec devices have been notified with device down. Without this, there are chances of race-condition where some of the resources like locks used for safe handling of the IRQs would be used after those are freed. CRs-Fixed: 1102353 Change-Id: I276571a7e50fcf227febd86494589b14988e3d41 Signed-off-by: Banajit Goswami Signed-off-by: Bhalchandra Gajare --- drivers/mfd/wcd9xxx-core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/mfd/wcd9xxx-core.c b/drivers/mfd/wcd9xxx-core.c index 4cead8fb38cd3..a446376650f01 100644 --- a/drivers/mfd/wcd9xxx-core.c +++ b/drivers/mfd/wcd9xxx-core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -3224,9 +3224,9 @@ static int wcd9xxx_slim_device_down(struct slim_device *sldev) return 0; wcd9xxx->dev_up = false; - wcd9xxx_irq_exit(&wcd9xxx->core_res); if (wcd9xxx->dev_down) wcd9xxx->dev_down(wcd9xxx); + wcd9xxx_irq_exit(&wcd9xxx->core_res); return 0; } From d89b1507299a01139e68618e5be48c0e0942edf2 Mon Sep 17 00:00:00 2001 From: Banajit Goswami Date: Wed, 6 Jan 2016 12:21:13 -0800 Subject: [PATCH 0576/1015] Revert "ASoC: wcd_cpe_core: Perform irq cleanup once the bus is up" This reverts commit 74041210be67 ("ASoC: wcd_cpe_core: Perform irq cleanup once the bus is up") CRs-Fixed: 1102353 Change-Id: I7883615b009051c20e11b95b7fca0ef82225e6f5 Signed-off-by: Banajit Goswami Signed-off-by: Bhalchandra Gajare --- sound/soc/codecs/wcd_cpe_core.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/sound/soc/codecs/wcd_cpe_core.c b/sound/soc/codecs/wcd_cpe_core.c index 04a06d1426d48..276947970ed1d 100644 --- a/sound/soc/codecs/wcd_cpe_core.c +++ b/sound/soc/codecs/wcd_cpe_core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -891,14 +891,7 @@ static int wcd_cpe_enable(struct wcd_cpe_core *core, * instead SSR handler will control CPE. */ wcd_cpe_enable_cpe_clks(core, false); - /* - * During BUS_DOWN event, possibly the - * irq driver is under cleanup, do not request - * cleanup of irqs here, rather cleanup irqs - * once BUS_UP event is received. - */ - if (core->ssr_type != WCD_CPE_BUS_DOWN_EVENT) - wcd_cpe_cleanup_irqs(core); + wcd_cpe_cleanup_irqs(core); goto done; } @@ -1149,7 +1142,6 @@ int wcd_cpe_ssr_event(void *core_handle, break; case WCD_CPE_BUS_UP_EVENT: - wcd_cpe_cleanup_irqs(core); wcd_cpe_set_and_complete(core, WCD_CPE_BUS_READY); /* * In case of bus up event ssr_type will be changed From df1985e747d946a2a19f435204be4403095f60af Mon Sep 17 00:00:00 2001 From: ahmedsh Date: Wed, 4 Jan 2017 16:00:27 -0500 Subject: [PATCH 0577/1015] seemp: use local stack mem when encoding params Avoid race condition in driver when encoding param by reading contents from a local copy instead of msg buffer itself which can be mapped to user space. Change-Id: I9f111c078baefca6e6f1fcda30af1044891a3356 Signed-off-by: Ahmed Sheikh --- .../msm/seemp_core/seemp_event_encoder.c | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/platform/msm/seemp_core/seemp_event_encoder.c b/drivers/platform/msm/seemp_core/seemp_event_encoder.c index df56a84bc6676..36901f5fbee7e 100644 --- a/drivers/platform/msm/seemp_core/seemp_event_encoder.c +++ b/drivers/platform/msm/seemp_core/seemp_event_encoder.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -48,9 +48,15 @@ static void check_param_range(char *section_eq, bool param, void encode_seemp_params(struct seemp_logk_blk *blk) { - char *s = blk->payload.msg + 1; + struct seemp_logk_blk tmp; + char *s = 0; + char *msg_section_start = 0; + char *msg_section_eq = 0; + char *msg_s = 0; - blk->payload.msg[BLK_MAX_MSG_SZ - 1] = 0; /* zero-terminate */ + memcpy(tmp.payload.msg, blk->payload.msg, BLK_MAX_MSG_SZ); + s = tmp.payload.msg + 1; + tmp.payload.msg[BLK_MAX_MSG_SZ - 1] = 0; /* zero-terminate */ while (true) { char *section_start = s; @@ -105,8 +111,13 @@ void encode_seemp_params(struct seemp_logk_blk *blk) } } - encode_seemp_section(section_start, section_eq, s, param, - numeric, id, numeric_value); + msg_section_start = blk->payload.msg + (section_start - + tmp.payload.msg); + msg_section_eq = blk->payload.msg + (section_eq - + tmp.payload.msg); + msg_s = blk->payload.msg + (s - tmp.payload.msg); + encode_seemp_section(msg_section_start, msg_section_eq, + msg_s, param, numeric, id, numeric_value); if (*s == 0) break; From fc3c34651cb5cd6a9cfb8998b9726eb8e1454dc4 Mon Sep 17 00:00:00 2001 From: Bhalchandra Gajare Date: Thu, 15 Dec 2016 16:43:45 -0800 Subject: [PATCH 0578/1015] ASoC: msm-lsm-client: cleanup ioctl functions Some of the ioctl command handling is not properly using the copy_from_user interface. Fix these issues and cleanup the ioctl functions to make sure there is no illegal memory access. CRs-Fixed: 1087469 Change-Id: Ieb1beb92e7854a05b8045de0ce179d12c9a6da74 Signed-off-by: Bhalchandra Gajare --- sound/soc/msm/qdsp6v2/msm-lsm-client.c | 132 ++++++++----------------- 1 file changed, 41 insertions(+), 91 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/msm-lsm-client.c b/sound/soc/msm/qdsp6v2/msm-lsm-client.c index c5c75a0495e92..c610ec3c0ba68 100644 --- a/sound/soc/msm/qdsp6v2/msm-lsm-client.c +++ b/sound/soc/msm/qdsp6v2/msm-lsm-client.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016, Linux Foundation. All rights reserved. + * Copyright (c) 2013-2017, Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -730,8 +730,13 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, switch (cmd) { case SNDRV_LSM_SET_SESSION_DATA: dev_dbg(rtd->dev, "%s: set session data\n", __func__); - memcpy(&session_data, arg, - sizeof(struct snd_lsm_session_data)); + if (copy_from_user(&session_data, arg, + sizeof(session_data))) { + dev_err(rtd->dev, "%s: %s: copy_from_user failed\n", + __func__, "LSM_SET_SESSION_DATA"); + return -EFAULT; + } + if (session_data.app_id != LSM_VOICE_WAKEUP_APP_ID_V2) { dev_err(rtd->dev, "%s:Invalid App id %d for Listen client\n", @@ -820,13 +825,6 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, break; case SNDRV_LSM_SET_PARAMS: - if (!arg) { - dev_err(rtd->dev, - "%s: %s Invalid argument\n", - __func__, "SNDRV_LSM_SET_PARAMS"); - return -EINVAL; - } - dev_dbg(rtd->dev, "%s: set_params\n", __func__); memcpy(&det_params, arg, sizeof(det_params)); @@ -978,45 +976,43 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, break; } case SNDRV_LSM_LAB_CONTROL: { - u32 *enable = NULL; - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid param arg for ioctl %s session %d\n", - __func__, "SNDRV_LSM_LAB_CONTROL", - prtd->lsm_client->session); - rc = -EINVAL; - break; + u32 enable; + + if (copy_from_user(&enable, arg, sizeof(enable))) { + dev_err(rtd->dev, "%s: %s: copy_frm_user failed\n", + __func__, "LSM_LAB_CONTROL"); + return -EFAULT; } - enable = (int *)arg; + dev_dbg(rtd->dev, "%s: ioctl %s, enable = %d\n", - __func__, "SNDRV_LSM_LAB_CONTROL", *enable); + __func__, "SNDRV_LSM_LAB_CONTROL", enable); if (!prtd->lsm_client->started) { - if (prtd->lsm_client->lab_enable == *enable) { + if (prtd->lsm_client->lab_enable == enable) { dev_dbg(rtd->dev, "%s: Lab for session %d already %s\n", __func__, prtd->lsm_client->session, - ((*enable) ? "enabled" : "disabled")); + enable ? "enabled" : "disabled"); rc = 0; break; } - rc = q6lsm_lab_control(prtd->lsm_client, *enable); + rc = q6lsm_lab_control(prtd->lsm_client, enable); if (rc) { dev_err(rtd->dev, "%s: ioctl %s failed rc %d to %s lab for session %d\n", __func__, "SNDRV_LAB_CONTROL", rc, - ((*enable) ? "enable" : "disable"), + enable ? "enable" : "disable", prtd->lsm_client->session); } else { rc = msm_lsm_lab_buffer_alloc(prtd, - ((*enable) ? LAB_BUFFER_ALLOC - : LAB_BUFFER_DEALLOC)); + enable ? LAB_BUFFER_ALLOC + : LAB_BUFFER_DEALLOC); if (rc) dev_err(rtd->dev, "%s: msm_lsm_lab_buffer_alloc failed rc %d for %s", __func__, rc, - ((*enable) ? "ALLOC" : "DEALLOC")); + enable ? "ALLOC" : "DEALLOC"); if (!rc) - prtd->lsm_client->lab_enable = *enable; + prtd->lsm_client->lab_enable = enable; } } else { dev_err(rtd->dev, "%s: ioctl %s issued after start", @@ -1057,11 +1053,6 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, return rc; } #ifdef CONFIG_COMPAT -struct snd_lsm_event_status32 { - u16 status; - u16 payload_size; - u8 payload[0]; -}; struct snd_lsm_sound_model_v2_32 { compat_uptr_t data; @@ -1094,8 +1085,6 @@ struct snd_lsm_module_params_32 { }; enum { - SNDRV_LSM_EVENT_STATUS32 = - _IOW('U', 0x02, struct snd_lsm_event_status32), SNDRV_LSM_REG_SND_MODEL_V2_32 = _IOW('U', 0x07, struct snd_lsm_sound_model_v2_32), SNDRV_LSM_SET_PARAMS_32 = @@ -1126,12 +1115,12 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, prtd = runtime->private_data; switch (cmd) { - case SNDRV_LSM_EVENT_STATUS32: { - struct snd_lsm_event_status32 userarg32, *user32 = NULL; - struct snd_lsm_event_status *user = NULL; + case SNDRV_LSM_EVENT_STATUS: { + struct snd_lsm_event_status *user = NULL, userarg32; + struct snd_lsm_event_status *user32 = NULL; if (copy_from_user(&userarg32, arg, sizeof(userarg32))) { dev_err(rtd->dev, "%s: err copyuser ioctl %s\n", - __func__, "SNDRV_LSM_EVENT_STATUS32"); + __func__, "SNDRV_LSM_EVENT_STATUS"); return -EFAULT; } @@ -1285,13 +1274,6 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, return -EINVAL; } - if (!arg) { - dev_err(rtd->dev, - "%s: %s: No Param data to set\n", - __func__, "SET_MODULE_PARAMS_32"); - return -EINVAL; - } - if (copy_from_user(&p_data_32, arg, sizeof(p_data_32))) { dev_err(rtd->dev, @@ -1376,6 +1358,19 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, kfree(params32); break; } + case SNDRV_LSM_REG_SND_MODEL_V2: + case SNDRV_LSM_SET_PARAMS: + case SNDRV_LSM_SET_MODULE_PARAMS: + /* + * In ideal cases, the compat_ioctl should never be called + * with the above unlocked ioctl commands. Print error + * and return error if it does. + */ + dev_err(rtd->dev, + "%s: Invalid cmd for compat_ioctl\n", + __func__); + err = -EINVAL; + break; default: err = msm_lsm_ioctl_shared(substream, cmd, arg); break; @@ -1391,7 +1386,6 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, { int err = 0; u32 size = 0; - struct snd_lsm_session_data session_data; struct snd_pcm_runtime *runtime; struct snd_soc_pcm_runtime *rtd; struct lsm_priv *prtd; @@ -1406,26 +1400,6 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, rtd = substream->private_data; switch (cmd) { - case SNDRV_LSM_SET_SESSION_DATA: - dev_dbg(rtd->dev, - "%s: SNDRV_LSM_SET_SESSION_DATA\n", - __func__); - if (copy_from_user(&session_data, (void *)arg, - sizeof(struct snd_lsm_session_data))) { - err = -EFAULT; - dev_err(rtd->dev, - "%s: copy from user failed, size %zd\n", - __func__, sizeof(struct snd_lsm_session_data)); - break; - } - if (!err) - err = msm_lsm_ioctl_shared(substream, - cmd, &session_data); - if (err) - dev_err(rtd->dev, - "%s REG_SND_MODEL failed err %d\n", - __func__, err); - break; case SNDRV_LSM_REG_SND_MODEL_V2: { struct snd_lsm_sound_model_v2 snd_model_v2; @@ -1436,11 +1410,6 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, return -EINVAL; } - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid params snd_model\n", __func__); - return -EINVAL; - } if (copy_from_user(&snd_model_v2, arg, sizeof(snd_model_v2))) { err = -EFAULT; dev_err(rtd->dev, @@ -1469,12 +1438,6 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, } pr_debug("%s: SNDRV_LSM_SET_PARAMS\n", __func__); - if (!arg) { - dev_err(rtd->dev, - "%s: %s, Invalid params\n", - __func__, "SNDRV_LSM_SET_PARAMS"); - return -EINVAL; - } if (copy_from_user(&det_params, arg, sizeof(det_params))) { @@ -1507,13 +1470,6 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, return -EINVAL; } - if (!arg) { - dev_err(rtd->dev, - "%s: %s: No Param data to set\n", - __func__, "SET_MODULE_PARAMS"); - return -EINVAL; - } - if (copy_from_user(&p_data, arg, sizeof(p_data))) { dev_err(rtd->dev, @@ -1571,12 +1527,6 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, struct snd_lsm_event_status *user = NULL, userarg; dev_dbg(rtd->dev, "%s: SNDRV_LSM_EVENT_STATUS\n", __func__); - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid params event status\n", - __func__); - return -EINVAL; - } if (copy_from_user(&userarg, arg, sizeof(userarg))) { dev_err(rtd->dev, "%s: err copyuser event_status\n", From d911373c689355afea07a480b57fbb17eaa8cb9c Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Thu, 19 Jan 2017 14:59:44 -0800 Subject: [PATCH 0579/1015] crypto: msm: check integer overflow on total data len in qcedev.c qcedev_vbuf_ablk_cipher will calculate total data length. It starts with the value of "areq->cipher_op_req.byteoffset", which is controlled by the user. Make change to check if this total data length has integer overflow issue in qcedev_check_cipher_params. Change-Id: Ice42dca6d47eb8febfe8a34e566c69e4799fab57 Signed-off-by: Zhen Kong --- drivers/crypto/msm/qcedev.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index 433e4783d1d1b..5da0c86d47ca2 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -1445,6 +1445,15 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, pr_err("%s: Invalid byte offset\n", __func__); goto error; } + total = req->byteoffset; + for (i = 0; i < req->entries; i++) { + if (total > U32_MAX - req->vbuf.src[i].len) { + pr_err("%s:Integer overflow on total src len\n", + __func__); + goto error; + } + total += req->vbuf.src[i].len; + } } if (req->data_len < req->byteoffset) { @@ -1480,7 +1489,7 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, } } /* Check for sum of all dst length is equal to data_len */ - for (i = 0; i < req->entries; i++) { + for (i = 0, total = 0; i < req->entries; i++) { if (req->vbuf.dst[i].len >= U32_MAX - total) { pr_err("%s: Integer overflow on total req dst vbuf length\n", __func__); From 52190da21866ceadb7e1a56c50670aaa752b596b Mon Sep 17 00:00:00 2001 From: Fenglin Wu Date: Fri, 20 Jan 2017 15:59:39 +0800 Subject: [PATCH 0580/1015] platform: msm: spmi: Add flag to make SPMI debugfs write optional Currently, the SPMI debugfs entries support peek/poke functionality to access PMIC register directly. This is a possible way to access the PMIC and change some unexpected setting which is very dangerous. Add a flag CONFIG_MSM_SPMI_DEBUGFS_RO to make the write operation through debugfs optional, it can be defined if SPMI debugfs write is not desired. CRs-Fixed: 1103178 Change-Id: Iedbbf57a4a24a18f755a8b304591cc151b10bd4c Signed-off-by: Fenglin Wu --- drivers/platform/msm/spmi/Kconfig | 7 +++++++ drivers/platform/msm/spmi/spmi-dbgfs.c | 18 +++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/platform/msm/spmi/Kconfig b/drivers/platform/msm/spmi/Kconfig index 4ea9dd597fd42..0d8246045ce2f 100644 --- a/drivers/platform/msm/spmi/Kconfig +++ b/drivers/platform/msm/spmi/Kconfig @@ -27,4 +27,11 @@ config MSM_QPNP_INT help Say 'y' here to include support for the Qualcomm QPNP interrupt support. QPNP is a SPMI based PMIC implementation. + +config MSM_SPMI_DEBUGFS_RO + depends on DEBUG_FS + depends on MSM_SPMI + bool "Disable SPMI debugfs write" + help + Say 'y' here to disable the SPMI debugfs register write operation. endif diff --git a/drivers/platform/msm/spmi/spmi-dbgfs.c b/drivers/platform/msm/spmi/spmi-dbgfs.c index b0a354b59a502..586bd7ad75c05 100644 --- a/drivers/platform/msm/spmi/spmi-dbgfs.c +++ b/drivers/platform/msm/spmi/spmi-dbgfs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2014, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -46,6 +46,12 @@ static const char *DFS_ROOT_NAME = "spmi"; static const mode_t DFS_MODE = S_IRUSR | S_IWUSR; +#ifndef CONFIG_MSM_SPMI_DEBUGFS_RO +static const mode_t DFS_DATA_MODE = S_IRUSR | S_IWUSR; +#else +static const mode_t DFS_DATA_MODE = S_IRUSR; +#endif + /* Log buffer */ struct spmi_log_buffer { size_t rpos; /* Current 'read' position in buffer */ @@ -241,6 +247,7 @@ spmi_read_data(struct spmi_controller *ctrl, uint8_t *buf, int offset, int cnt) return ret; } +#ifndef CONFIG_MSM_SPMI_DEBUGFS_RO /** * spmi_write_data: writes data across the SPMI bus * @ctrl: The SPMI controller @@ -277,6 +284,7 @@ spmi_write_data(struct spmi_controller *ctrl, uint8_t *buf, int offset, int cnt) done: return ret; } +#endif /** * print_to_log: format a string and place into the log buffer @@ -456,6 +464,7 @@ static int get_log_data(struct spmi_trans *trans) return total_items_read; } +#ifndef CONFIG_MSM_SPMI_DEBUGFS_RO /** * spmi_dfs_reg_write: write user's byte array (coded as string) over SPMI. * @file: file pointer @@ -519,6 +528,9 @@ static ssize_t spmi_dfs_reg_write(struct file *file, const char __user *buf, kfree(kbuf); return ret; } +#else +#define spmi_dfs_reg_write NULL +#endif /** * spmi_dfs_reg_read: reads value(s) over SPMI and fill user's buffer a @@ -671,14 +683,14 @@ int spmi_dfs_add_controller(struct spmi_controller *ctrl) goto err_remove_fs; } - file = debugfs_create_file("data", DFS_MODE, dir, ctrl_data, + file = debugfs_create_file("data", DFS_DATA_MODE, dir, ctrl_data, &spmi_dfs_reg_fops); if (!file) { pr_err("error creating 'data' entry\n"); goto err_remove_fs; } - file = debugfs_create_file("data_raw", DFS_MODE, dir, ctrl_data, + file = debugfs_create_file("data_raw", DFS_DATA_MODE, dir, ctrl_data, &spmi_dfs_raw_data_fops); if (!file) { pr_err("error creating 'data' entry\n"); From a03cd43b859b6d10c046350155f5e0cefe9cc2c1 Mon Sep 17 00:00:00 2001 From: Gidon Studinski Date: Mon, 23 Jan 2017 11:55:53 +0200 Subject: [PATCH 0581/1015] ecm_ipa: remove redundant code Remove ECM_IPA debugging capabilities which are no longer needed, nor used. CRs-Fixed: 1112912 Change-Id: I20765d84ca7351c436d39d0f10b7f7a819bcc40b Signed-off-by: Gidon Studinski --- drivers/net/ethernet/msm/ecm_ipa.c | 268 +---------------------------- 1 file changed, 3 insertions(+), 265 deletions(-) diff --git a/drivers/net/ethernet/msm/ecm_ipa.c b/drivers/net/ethernet/msm/ecm_ipa.c index 77490c3920c58..80ea7ef497cb0 100644 --- a/drivers/net/ethernet/msm/ecm_ipa.c +++ b/drivers/net/ethernet/msm/ecm_ipa.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -9,7 +9,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ - #include #include #include @@ -106,10 +105,6 @@ enum ecm_ipa_operation { * struct ecm_ipa_dev - main driver context parameters * @net: network interface struct implemented by this driver * @directory: debugfs directory for various debuging switches - * @tx_enable: flag that enable/disable Tx path to continue to IPA - * @rx_enable: flag that enable/disable Rx path to continue to IPA - * @rm_enable: flag that enable/disable Resource manager request prior to Tx - * @dma_enable: flag that allow on-the-fly DMA mode for IPA * @eth_ipv4_hdr_hdl: saved handle for ipv4 header-insertion table * @eth_ipv6_hdr_hdl: saved handle for ipv6 header-insertion table * @usb_to_ipa_hdl: save handle for IPA pipe operations @@ -129,10 +124,6 @@ enum ecm_ipa_operation { */ struct ecm_ipa_dev { struct net_device *net; - u32 tx_enable; - u32 rx_enable; - u32 rm_enable; - bool dma_enable; struct dentry *directory; uint32_t eth_ipv4_hdr_hdl; uint32_t eth_ipv6_hdr_hdl; @@ -167,32 +158,16 @@ static void ecm_ipa_rm_notify(void *user_data, enum ipa_rm_event event, static struct net_device_stats *ecm_ipa_get_stats(struct net_device *net); static int ecm_ipa_create_rm_resource(struct ecm_ipa_dev *ecm_ipa_ctx); static void ecm_ipa_destory_rm_resource(struct ecm_ipa_dev *ecm_ipa_ctx); -static bool rx_filter(struct sk_buff *skb); -static bool tx_filter(struct sk_buff *skb); -static bool rm_enabled(struct ecm_ipa_dev *ecm_ipa_ctx); static int resource_request(struct ecm_ipa_dev *ecm_ipa_ctx); static void resource_release(struct ecm_ipa_dev *ecm_ipa_ctx); static netdev_tx_t ecm_ipa_start_xmit(struct sk_buff *skb, struct net_device *net); -static int ecm_ipa_debugfs_stall_open(struct inode *inode, - struct file *file); -static ssize_t ecm_ipa_debugfs_stall_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); static int ecm_ipa_debugfs_atomic_open(struct inode *inode, struct file *file); -static ssize_t ecm_ipa_debugfs_enable_write_dma(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); -static int ecm_ipa_debugfs_dma_open(struct inode *inode, struct file *file); -static ssize_t ecm_ipa_debugfs_enable_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); -static ssize_t ecm_ipa_debugfs_enable_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos); static ssize_t ecm_ipa_debugfs_atomic_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos); static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx); static void ecm_ipa_debugfs_destroy(struct ecm_ipa_dev *ecm_ipa_ctx); static int ecm_ipa_ep_registers_cfg(u32 usb_to_ipa_hdl, u32 ipa_to_usb_hdl); -static int ecm_ipa_ep_registers_dma_cfg(u32 usb_to_ipa_hdl, - enum ipa_client_type prod_client); static int ecm_ipa_set_device_ethernet_addr(u8 *dev_ethaddr, u8 device_ethaddr[]); static enum ecm_ipa_state ecm_ipa_next_state(enum ecm_ipa_state current_state, @@ -210,22 +185,11 @@ static const struct net_device_ops ecm_ipa_netdev_ops = { .ndo_get_stats = ecm_ipa_get_stats, }; -const struct file_operations ecm_ipa_debugfs_dma_ops = { - .open = ecm_ipa_debugfs_dma_open, - .read = ecm_ipa_debugfs_enable_read, - .write = ecm_ipa_debugfs_enable_write_dma, -}; - const struct file_operations ecm_ipa_debugfs_atomic_ops = { .open = ecm_ipa_debugfs_atomic_open, .read = ecm_ipa_debugfs_atomic_read, }; -const struct file_operations ecm_ipa_debugfs_stall_ops = { - .open = ecm_ipa_debugfs_stall_open, - .write = ecm_ipa_debugfs_stall_write, -}; - static void ecm_ipa_msg_free_cb(void *buff, u32 len, u32 type) { kfree(buff); @@ -286,9 +250,6 @@ int ecm_ipa_init(struct ecm_ipa_params *params) ECM_IPA_DEBUG("ecm_ipa_ctx (private) = %p\n", ecm_ipa_ctx); ecm_ipa_ctx->net = net; - ecm_ipa_ctx->tx_enable = true; - ecm_ipa_ctx->rx_enable = true; - ecm_ipa_ctx->rm_enable = true; ecm_ipa_ctx->outstanding_high = DEFAULT_OUTSTANDING_HIGH; ecm_ipa_ctx->outstanding_low = DEFAULT_OUTSTANDING_LOW; atomic_set(&ecm_ipa_ctx->outstanding_pkts, 0); @@ -600,12 +561,6 @@ static netdev_tx_t ecm_ipa_start_xmit(struct sk_buff *skb, return NETDEV_TX_BUSY; } - if (unlikely(tx_filter(skb))) { - dev_kfree_skb_any(skb); - ECM_IPA_DEBUG("packet got filtered out on Tx path\n"); - status = NETDEV_TX_OK; - goto out; - } ret = resource_request(ecm_ipa_ctx); if (ret) { ECM_IPA_DEBUG("Waiting to resource\n"); @@ -679,11 +634,6 @@ static void ecm_ipa_packet_receive_notify(void *priv, skb->dev = ecm_ipa_ctx->net; skb->protocol = eth_type_trans(skb, ecm_ipa_ctx->net); - if (rx_filter(skb)) { - ECM_IPA_DEBUG("packet got filtered out on Rx path\n"); - dev_kfree_skb_any(skb); - return; - } result = netif_rx(skb); if (result) @@ -1146,42 +1096,15 @@ static void ecm_ipa_destory_rm_resource(struct ecm_ipa_dev *ecm_ipa_ctx) ECM_IPA_LOG_EXIT(); } -static bool rx_filter(struct sk_buff *skb) -{ - struct ecm_ipa_dev *ecm_ipa_ctx = netdev_priv(skb->dev); - return !ecm_ipa_ctx->rx_enable; -} - -static bool tx_filter(struct sk_buff *skb) -{ - struct ecm_ipa_dev *ecm_ipa_ctx = netdev_priv(skb->dev); - return !ecm_ipa_ctx->tx_enable; -} - -static bool rm_enabled(struct ecm_ipa_dev *ecm_ipa_ctx) -{ - return ecm_ipa_ctx->rm_enable; -} - static int resource_request(struct ecm_ipa_dev *ecm_ipa_ctx) { - int result = 0; - - if (!rm_enabled(ecm_ipa_ctx)) - goto out; - result = ipa_rm_inactivity_timer_request_resource( - IPA_RM_RESOURCE_STD_ECM_PROD); -out: - return result; + return ipa_rm_inactivity_timer_request_resource( + IPA_RM_RESOURCE_STD_ECM_PROD); } static void resource_release(struct ecm_ipa_dev *ecm_ipa_ctx) { - if (!rm_enabled(ecm_ipa_ctx)) - goto out; ipa_rm_inactivity_timer_release_resource(IPA_RM_RESOURCE_STD_ECM_PROD); -out: - return; } /** @@ -1254,45 +1177,6 @@ static void ecm_ipa_tx_timeout(struct net_device *net) net->stats.tx_errors++; } -static int ecm_ipa_debugfs_stall_open(struct inode *inode, - struct file *file) -{ - ECM_IPA_LOG_ENTRY(); - - ECM_IPA_LOG_EXIT(); - - return 0; -} - -static ssize_t ecm_ipa_debugfs_stall_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - u32 cmdq_cfg_mmio_phy = 0xFD4E3038; - void *cmdq_cfg_mmio_virt; - int result; - bool val = 0; - - ECM_IPA_LOG_ENTRY(); - - file->private_data = &val; - result = ecm_ipa_debugfs_enable_write(file, buf, count, ppos); - - cmdq_cfg_mmio_virt = ioremap(cmdq_cfg_mmio_phy, sizeof(u32)); - if (!cmdq_cfg_mmio_virt) { - ECM_IPA_ERROR("fail on mmio for cmdq_cfg_mmio_phy=0x%x", - cmdq_cfg_mmio_phy); - return result; - } - - iowrite32(val, cmdq_cfg_mmio_virt); - ECM_IPA_DEBUG("Value %d was written to cfgq", val); - - ECM_IPA_LOG_EXIT(); - - return result; - -} - static int ecm_ipa_debugfs_atomic_open(struct inode *inode, struct file *file) { struct ecm_ipa_dev *ecm_ipa_ctx = inode->i_private; @@ -1302,78 +1186,6 @@ static int ecm_ipa_debugfs_atomic_open(struct inode *inode, struct file *file) return 0; } -static ssize_t ecm_ipa_debugfs_enable_write_dma(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - struct ecm_ipa_dev *ecm_ipa_ctx = file->private_data; - int result; - ECM_IPA_LOG_ENTRY(); - file->private_data = &ecm_ipa_ctx->dma_enable; - result = ecm_ipa_debugfs_enable_write(file, buf, count, ppos); - if (ecm_ipa_ctx->dma_enable) - ecm_ipa_ep_registers_dma_cfg(ecm_ipa_ctx->usb_to_ipa_hdl, - ecm_ipa_ctx->ipa_to_usb_client); - else - ecm_ipa_ep_registers_cfg(ecm_ipa_ctx->usb_to_ipa_hdl, - ecm_ipa_ctx->usb_to_ipa_hdl); - ECM_IPA_LOG_EXIT(); - return result; -} - -static int ecm_ipa_debugfs_dma_open(struct inode *inode, struct file *file) -{ - struct ecm_ipa_dev *ecm_ipa_ctx = inode->i_private; - ECM_IPA_LOG_ENTRY(); - file->private_data = ecm_ipa_ctx; - ECM_IPA_LOG_EXIT(); - return 0; -} - -static ssize_t ecm_ipa_debugfs_enable_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - unsigned long missing; - char input; - bool *enable = file->private_data; - if (count != sizeof(input) + 1) { - ECM_IPA_ERROR("wrong input length(%zd)\n", count); - return -EINVAL; - } - if (!buf) { - ECM_IPA_ERROR("Bad argument\n"); - return -EINVAL; - } - missing = copy_from_user(&input, buf, 1); - if (missing) - return -EFAULT; - ECM_IPA_DEBUG("input received %c\n", input); - *enable = input - '0'; - ECM_IPA_DEBUG("value was set to %d\n", *enable); - return count; -} - -static ssize_t ecm_ipa_debugfs_enable_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos) -{ - int nbytes; - int size = 0; - int ret; - loff_t pos; - u8 enable_str[sizeof(char)*3] = {0}; - bool *enable = file->private_data; - pos = *ppos; - nbytes = scnprintf(enable_str, sizeof(enable_str), "%d\n", *enable); - ret = simple_read_from_buffer(ubuf, count, ppos, enable_str, nbytes); - if (ret < 0) { - ECM_IPA_ERROR("simple_read_from_buffer problem\n"); - return ret; - } - size += ret; - count -= nbytes; - *ppos = pos + size; - return size; -} - static ssize_t ecm_ipa_debugfs_atomic_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos) { @@ -1391,7 +1203,6 @@ static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) { const mode_t flags_read_write = S_IRUGO | S_IWUGO; const mode_t flags_read_only = S_IRUGO; - const mode_t flags_write_only = S_IWUGO; struct dentry *file; ECM_IPA_LOG_ENTRY(); @@ -1404,24 +1215,6 @@ static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) ECM_IPA_ERROR("could not create debugfs directory entry\n"); goto fail_directory; } - file = debugfs_create_bool("tx_enable", flags_read_write, - ecm_ipa_ctx->directory, &ecm_ipa_ctx->tx_enable); - if (!file) { - ECM_IPA_ERROR("could not create debugfs tx file\n"); - goto fail_file; - } - file = debugfs_create_bool("rx_enable", flags_read_write, - ecm_ipa_ctx->directory, &ecm_ipa_ctx->rx_enable); - if (!file) { - ECM_IPA_ERROR("could not create debugfs rx file\n"); - goto fail_file; - } - file = debugfs_create_bool("rm_enable", flags_read_write, - ecm_ipa_ctx->directory, &ecm_ipa_ctx->rm_enable); - if (!file) { - ECM_IPA_ERROR("could not create debugfs rm file\n"); - goto fail_file; - } file = debugfs_create_u8("outstanding_high", flags_read_write, ecm_ipa_ctx->directory, &ecm_ipa_ctx->outstanding_high); if (!file) { @@ -1434,13 +1227,6 @@ static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) ECM_IPA_ERROR("could not create outstanding_low file\n"); goto fail_file; } - file = debugfs_create_file("dma_enable", flags_read_write, - ecm_ipa_ctx->directory, - ecm_ipa_ctx, &ecm_ipa_debugfs_dma_ops); - if (!file) { - ECM_IPA_ERROR("could not create debugfs dma file\n"); - goto fail_file; - } file = debugfs_create_file("outstanding", flags_read_only, ecm_ipa_ctx->directory, ecm_ipa_ctx, &ecm_ipa_debugfs_atomic_ops); @@ -1449,14 +1235,6 @@ static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) goto fail_file; } - file = debugfs_create_file("stall_ipa_rx_proc", flags_write_only, - ecm_ipa_ctx->directory, - ecm_ipa_ctx, &ecm_ipa_debugfs_stall_ops); - if (!file) { - ECM_IPA_ERROR("could not create stall_ipa_rx_proc file\n"); - goto fail_file; - } - ECM_IPA_DEBUG("debugfs entries were created\n"); ECM_IPA_LOG_EXIT(); @@ -1527,46 +1305,6 @@ static int ecm_ipa_ep_registers_cfg(u32 usb_to_ipa_hdl, u32 ipa_to_usb_hdl) return result; } -/** - * ecm_ipa_ep_registers_dma_cfg() - configure the USB endpoints for ECM - * DMA - * @usb_to_ipa_hdl: handle received from ipa_connect - * - * This function will override the previous configuration - * which is needed for cores that does not support blocks logic - * Note that client handles are the actual pipe index - */ -static int ecm_ipa_ep_registers_dma_cfg(u32 usb_to_ipa_hdl, - enum ipa_client_type prod_client) -{ - int result = 0; - struct ipa_ep_cfg_mode cfg_mode; - u32 apps_to_ipa_hdl = 2; - - ECM_IPA_LOG_ENTRY(); - - memset(&cfg_mode, 0 , sizeof(cfg_mode)); - cfg_mode.mode = IPA_DMA; - cfg_mode.dst = prod_client; - result = ipa_cfg_ep_mode(apps_to_ipa_hdl, &cfg_mode); - if (result) { - ECM_IPA_ERROR("failed to configure Apps to IPA\n"); - goto out; - } - memset(&cfg_mode, 0 , sizeof(cfg_mode)); - cfg_mode.mode = IPA_DMA; - cfg_mode.dst = IPA_CLIENT_A5_LAN_WAN_CONS; - result = ipa_cfg_ep_mode(usb_to_ipa_hdl, &cfg_mode); - if (result) { - ECM_IPA_ERROR("failed to configure USB to IPA\n"); - goto out; - } - ECM_IPA_DEBUG("end-point registers successfully configured\n"); -out: - ECM_IPA_LOG_EXIT(); - return result; -} - /** * ecm_ipa_set_device_ethernet_addr() - set device etherenet address * @dev_ethaddr: device etherenet address From bc5697ffe2ac49b6364384d9293ac9f9e4a94c49 Mon Sep 17 00:00:00 2001 From: ansharma Date: Wed, 18 Jan 2017 16:46:38 +0530 Subject: [PATCH 0582/1015] power: qpnp-fg: Fix possible race condition in FG debugfs There is a possible race condition when FG debugfs files are concurrently accessed by multiple threads. Fix this. CRs-Fixed: 1105481 Change-Id: I154e7f3cdd8d51cf67ef1dfd9d78f423f183cb64 Signed-off-by: ansharma --- drivers/power/qpnp-fg.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/drivers/power/qpnp-fg.c b/drivers/power/qpnp-fg.c index cebcccfa59104..cc2021d45859a 100644 --- a/drivers/power/qpnp-fg.c +++ b/drivers/power/qpnp-fg.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -669,6 +669,7 @@ struct fg_trans { struct fg_chip *chip; struct fg_log_buffer *log; /* log buffer */ u8 *data; /* fg data that is read */ + struct mutex memif_dfs_lock; /* Prevent thread concurrency */ }; struct fg_dbgfs { @@ -7460,6 +7461,7 @@ static int fg_memif_data_open(struct inode *inode, struct file *file) trans->addr = dbgfs_data.addr; trans->chip = dbgfs_data.chip; trans->offset = trans->addr; + mutex_init(&trans->memif_dfs_lock); file->private_data = trans; return 0; @@ -7471,6 +7473,7 @@ static int fg_memif_dfs_close(struct inode *inode, struct file *file) if (trans && trans->log && trans->data) { file->private_data = NULL; + mutex_destroy(&trans->memif_dfs_lock); kfree(trans->log); kfree(trans->data); kfree(trans); @@ -7628,10 +7631,13 @@ static ssize_t fg_memif_dfs_reg_read(struct file *file, char __user *buf, size_t ret; size_t len; + mutex_lock(&trans->memif_dfs_lock); /* Is the the log buffer empty */ if (log->rpos >= log->wpos) { - if (get_log_data(trans) <= 0) - return 0; + if (get_log_data(trans) <= 0) { + len = 0; + goto unlock_mutex; + } } len = min(count, log->wpos - log->rpos); @@ -7639,7 +7645,8 @@ static ssize_t fg_memif_dfs_reg_read(struct file *file, char __user *buf, ret = copy_to_user(buf, &log->data[log->rpos], len); if (ret == len) { pr_err("error copy sram register values to user\n"); - return -EFAULT; + len = -EFAULT; + goto unlock_mutex; } /* 'ret' is the number of bytes not copied */ @@ -7647,6 +7654,9 @@ static ssize_t fg_memif_dfs_reg_read(struct file *file, char __user *buf, *ppos += len; log->rpos += len; + +unlock_mutex: + mutex_unlock(&trans->memif_dfs_lock); return len; } @@ -7667,14 +7677,20 @@ static ssize_t fg_memif_dfs_reg_write(struct file *file, const char __user *buf, int cnt = 0; u8 *values; size_t ret = 0; + char *kbuf; + u32 offset; struct fg_trans *trans = file->private_data; - u32 offset = trans->offset; + + mutex_lock(&trans->memif_dfs_lock); + offset = trans->offset; /* Make a copy of the user data */ - char *kbuf = kmalloc(count + 1, GFP_KERNEL); - if (!kbuf) - return -ENOMEM; + kbuf = kmalloc(count + 1, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + goto unlock_mutex; + } ret = copy_from_user(kbuf, buf, count); if (ret == count) { @@ -7713,6 +7729,8 @@ static ssize_t fg_memif_dfs_reg_write(struct file *file, const char __user *buf, free_buf: kfree(kbuf); +unlock_mutex: + mutex_unlock(&trans->memif_dfs_lock); return ret; } From 30b85ecbe7fb316b31dd8f2f695df2c3fa599905 Mon Sep 17 00:00:00 2001 From: ansharma Date: Thu, 19 Jan 2017 20:22:14 +0530 Subject: [PATCH 0583/1015] leds: qpnp-flash: Fix possible race condition in debugfs There is a possible race condition when debugfs files are concurrently accessed by multiple threads. Fix this. CRs-Fixed: 1109420, 1109326 Change-Id: I19e9107079ac8d039b12a37ae612727f824552d4 Signed-off-by: ansharma --- drivers/leds/leds-qpnp-flash.c | 80 ++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 23 deletions(-) diff --git a/drivers/leds/leds-qpnp-flash.c b/drivers/leds/leds-qpnp-flash.c index 63f7cdf7ff7c2..8924575f0c7d5 100644 --- a/drivers/leds/leds-qpnp-flash.c +++ b/drivers/leds/leds-qpnp-flash.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -222,6 +222,7 @@ struct flash_led_platform_data { }; struct qpnp_flash_led_buffer { + struct mutex debugfs_lock; /* Prevent thread concurrency */ size_t rpos; size_t wpos; size_t len; @@ -277,6 +278,7 @@ static int flash_led_dbgfs_file_open(struct qpnp_flash_led *led, log->rpos = 0; log->wpos = 0; log->len = logbufsize - sizeof(*log); + mutex_init(&log->debugfs_lock); led->log = log; led->buffer_cnt = 1; @@ -298,20 +300,26 @@ static int flash_led_dfs_close(struct inode *inode, struct file *file) if (led && led->log) { file->private_data = NULL; + mutex_destroy(&led->log->debugfs_lock); kfree(led->log); } return 0; } +#define MIN_BUFFER_WRITE_LEN 20 static int print_to_log(struct qpnp_flash_led_buffer *log, const char *fmt, ...) { va_list args; int cnt; - char *log_buf = &log->data[log->wpos]; + char *log_buf; size_t size = log->len - log->wpos; + if (size < MIN_BUFFER_WRITE_LEN) + return 0; /* not enough buffer left */ + + log_buf = &log->data[log->wpos]; va_start(args, fmt); cnt = vscnprintf(log_buf, size, fmt, args); va_end(args); @@ -325,12 +333,14 @@ static ssize_t flash_led_dfs_latched_reg_read(struct file *fp, char __user *buf, struct qpnp_flash_led *led = fp->private_data; struct qpnp_flash_led_buffer *log = led->log; u8 val; - int rc; + int rc = 0; size_t len; size_t ret; - if (log->rpos >= log->wpos && led->buffer_cnt == 0) - return 0; + mutex_lock(&log->debugfs_lock); + if ((log->rpos >= log->wpos && led->buffer_cnt == 0) || + ((log->len - log->wpos) < MIN_BUFFER_WRITE_LEN)) + goto unlock_mutex; rc = spmi_ext_register_readl(led->spmi_dev->ctrl, led->spmi_dev->sid, INT_LATCHED_STS(led->base), &val, 1); @@ -338,17 +348,17 @@ static ssize_t flash_led_dfs_latched_reg_read(struct file *fp, char __user *buf, dev_err(&led->spmi_dev->dev, "Unable to read from address %x, rc(%d)\n", INT_LATCHED_STS(led->base), rc); - return -EINVAL; + goto unlock_mutex; } led->buffer_cnt--; rc = print_to_log(log, "0x%05X ", INT_LATCHED_STS(led->base)); if (rc == 0) - return rc; + goto unlock_mutex; rc = print_to_log(log, "0x%02X ", val); if (rc == 0) - return rc; + goto unlock_mutex; if (log->wpos > 0 && log->data[log->wpos - 1] == ' ') log->data[log->wpos - 1] = '\n'; @@ -358,36 +368,43 @@ static ssize_t flash_led_dfs_latched_reg_read(struct file *fp, char __user *buf, ret = copy_to_user(buf, &log->data[log->rpos], len); if (ret) { pr_err("error copy register value to user\n"); - return -EFAULT; + rc = -EFAULT; + goto unlock_mutex; } len -= ret; *ppos += len; log->rpos += len; - return len; + rc = len; + +unlock_mutex: + mutex_unlock(&log->debugfs_lock); + return rc; } static ssize_t flash_led_dfs_fault_reg_read(struct file *fp, char __user *buf, size_t count, loff_t *ppos) { struct qpnp_flash_led *led = fp->private_data; struct qpnp_flash_led_buffer *log = led->log; - int rc; + int rc = 0; size_t len; size_t ret; - if (log->rpos >= log->wpos && led->buffer_cnt == 0) - return 0; + mutex_lock(&log->debugfs_lock); + if ((log->rpos >= log->wpos && led->buffer_cnt == 0) || + ((log->len - log->wpos) < MIN_BUFFER_WRITE_LEN)) + goto unlock_mutex; led->buffer_cnt--; rc = print_to_log(log, "0x%05X ", FLASH_LED_FAULT_STATUS(led->base)); if (rc == 0) - return rc; + goto unlock_mutex; rc = print_to_log(log, "0x%02X ", led->fault_reg); if (rc == 0) - return rc; + goto unlock_mutex; if (log->wpos > 0 && log->data[log->wpos - 1] == ' ') log->data[log->wpos - 1] = '\n'; @@ -397,14 +414,19 @@ static ssize_t flash_led_dfs_fault_reg_read(struct file *fp, char __user *buf, ret = copy_to_user(buf, &log->data[log->rpos], len); if (ret) { pr_err("error copy register value to user\n"); - return -EFAULT; + rc = -EFAULT; + goto unlock_mutex; } len -= ret; *ppos += len; log->rpos += len; - return len; + rc = len; + +unlock_mutex: + mutex_unlock(&log->debugfs_lock); + return rc; } static ssize_t flash_led_dfs_fault_reg_enable(struct file *file, @@ -417,10 +439,14 @@ static ssize_t flash_led_dfs_fault_reg_enable(struct file *file, size_t ret = 0; struct qpnp_flash_led *led = file->private_data; - char *kbuf = kmalloc(count + 1, GFP_KERNEL); + char *kbuf; - if (!kbuf) - return -ENOMEM; + mutex_lock(&led->log->debugfs_lock); + kbuf = kmalloc(count + 1, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + goto unlock_mutex; + } ret = copy_from_user(kbuf, buf, count); if (!ret) { @@ -449,6 +475,8 @@ static ssize_t flash_led_dfs_fault_reg_enable(struct file *file, free_buf: kfree(kbuf); +unlock_mutex: + mutex_unlock(&led->log->debugfs_lock); return ret; } @@ -461,10 +489,14 @@ static ssize_t flash_led_dfs_dbg_enable(struct file *file, int data; size_t ret = 0; struct qpnp_flash_led *led = file->private_data; - char *kbuf = kmalloc(count + 1, GFP_KERNEL); + char *kbuf; - if (!kbuf) - return -ENOMEM; + mutex_lock(&led->log->debugfs_lock); + kbuf = kmalloc(count + 1, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + goto unlock_mutex; + } ret = copy_from_user(kbuf, buf, count); if (ret == count) { @@ -492,6 +524,8 @@ static ssize_t flash_led_dfs_dbg_enable(struct file *file, free_buf: kfree(kbuf); +unlock_mutex: + mutex_unlock(&led->log->debugfs_lock); return ret; } From c72bac06dbe82348df993189e3c3bcda5bad4d75 Mon Sep 17 00:00:00 2001 From: ansharma Date: Fri, 20 Jan 2017 14:43:57 +0530 Subject: [PATCH 0584/1015] platform: msm: spmi: Fix possible race condition in debugfs There is a possible race condition when debugfs files are concurrently accessed by multiple threads. Fix this. CRs-Fixed: 1106842 Change-Id: Ifd092143f428db3cf73c45ec4f0aaa96318ae165 Signed-off-by: ansharma --- drivers/platform/msm/spmi/spmi-dbgfs.c | 37 +++++++++++++++++++------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/drivers/platform/msm/spmi/spmi-dbgfs.c b/drivers/platform/msm/spmi/spmi-dbgfs.c index b0a354b59a502..86f1b0d889a74 100644 --- a/drivers/platform/msm/spmi/spmi-dbgfs.c +++ b/drivers/platform/msm/spmi/spmi-dbgfs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2014, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -69,6 +69,7 @@ struct spmi_trans { u32 addr; /* 20-bit address: SID + PID + Register offset */ u32 offset; /* Offset of last read data */ bool raw_data; /* Set to true for raw data dump */ + struct mutex spmi_dfs_lock; /* Prevent thread concurrency */ struct spmi_controller *ctrl; struct spmi_log_buffer *log; /* log buffer */ }; @@ -168,6 +169,7 @@ static int spmi_dfs_open(struct spmi_ctrl_data *ctrl_data, struct file *file) trans->addr = ctrl_data->addr; trans->ctrl = ctrl_data->ctrl; trans->offset = trans->addr; + mutex_init(&trans->spmi_dfs_lock); file->private_data = trans; return 0; @@ -197,6 +199,7 @@ static int spmi_dfs_close(struct inode *inode, struct file *file) if (trans && trans->log) { file->private_data = NULL; + mutex_destroy(&trans->spmi_dfs_lock); kfree(trans->log); kfree(trans); } @@ -473,14 +476,21 @@ static ssize_t spmi_dfs_reg_write(struct file *file, const char __user *buf, int cnt = 0; u8 *values; size_t ret = 0; - + u32 offset; + char *kbuf; struct spmi_trans *trans = file->private_data; - u32 offset = trans->offset; + + mutex_lock(&trans->spmi_dfs_lock); + + trans = file->private_data; + offset = trans->offset; /* Make a copy of the user data */ - char *kbuf = kmalloc(count + 1, GFP_KERNEL); - if (!kbuf) - return -ENOMEM; + kbuf = kmalloc(count + 1, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + goto unlock_mutex; + } ret = copy_from_user(kbuf, buf, count); if (ret == count) { @@ -517,6 +527,8 @@ static ssize_t spmi_dfs_reg_write(struct file *file, const char __user *buf, free_buf: kfree(kbuf); +unlock_mutex: + mutex_unlock(&trans->spmi_dfs_lock); return ret; } @@ -537,10 +549,13 @@ static ssize_t spmi_dfs_reg_read(struct file *file, char __user *buf, size_t ret; size_t len; + mutex_lock(&trans->spmi_dfs_lock); /* Is the the log buffer empty */ if (log->rpos >= log->wpos) { - if (get_log_data(trans) <= 0) - return 0; + if (get_log_data(trans) <= 0) { + len = 0; + goto unlock_mutex; + } } len = min(count, log->wpos - log->rpos); @@ -548,7 +563,8 @@ static ssize_t spmi_dfs_reg_read(struct file *file, char __user *buf, ret = copy_to_user(buf, &log->data[log->rpos], len); if (ret == len) { pr_err("error copy SPMI register values to user\n"); - return -EFAULT; + len = -EFAULT; + goto unlock_mutex; } /* 'ret' is the number of bytes not copied */ @@ -556,6 +572,9 @@ static ssize_t spmi_dfs_reg_read(struct file *file, char __user *buf, *ppos += len; log->rpos += len; + +unlock_mutex: + mutex_unlock(&trans->spmi_dfs_lock); return len; } From 0e59a90ad5f9171e514822edbf5414a8d0fdfd8e Mon Sep 17 00:00:00 2001 From: Arumuga Durai A Date: Fri, 9 Dec 2016 19:07:40 +0530 Subject: [PATCH 0585/1015] USB: android: Fix gsmd_setup() error path cleanup on sigkill gsmd_setup might fail if userspace kills adbd while usb_add_config was executed in its context. This results in alloc_workqueue failure followed by gport_setup bailing out without proper cleanup. Due to this next time when adbd starts no_smd_ports exceeds the allow limit so serial function bind_config fails. Fix this by perform cleanup when gport_setup fails. CRs-Fixed: 1098860 Change-Id: Ic54a588b5232029b3598f38645afdbe70b70f927 Signed-off-by: Arumuga Durai A --- drivers/usb/gadget/android.c | 1 + drivers/usb/gadget/function/f_serial.c | 8 ++++++++ include/linux/usb/android.h | 1 + 3 files changed, 10 insertions(+) diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c index 44e0b70cbe878..4156f22151a2d 100644 --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -2122,6 +2122,7 @@ static int serial_function_bind_config(struct android_usb_function *f, err = gport_setup(c); if (err) { pr_err("serial: Cannot setup transports"); + gserial_deinit_port(); goto out; } diff --git a/drivers/usb/gadget/function/f_serial.c b/drivers/usb/gadget/function/f_serial.c index 25963de5777e3..a9eeea8946a99 100644 --- a/drivers/usb/gadget/function/f_serial.c +++ b/drivers/usb/gadget/function/f_serial.c @@ -1211,6 +1211,14 @@ int gserial_init_port(int port_num, const char *name, return ret; } +void gserial_deinit_port(void) +{ + no_char_bridge_ports = 0; + no_tty_ports = 0; + no_smd_ports = 0; + no_hsic_sports = 0; + nr_ports = 0; +} bool gserial_is_connected(void) { diff --git a/include/linux/usb/android.h b/include/linux/usb/android.h index a28182c8d54bb..8ce93e39d6050 100644 --- a/include/linux/usb/android.h +++ b/include/linux/usb/android.h @@ -132,6 +132,7 @@ extern int gport_setup(struct usb_configuration *c); extern void gport_cleanup(void); extern int gserial_init_port(int port_num, const char *name, const char *port_name); +extern void gserial_deinit_port(void); extern bool gserial_is_connected(void); extern bool gserial_is_dun_w_softap_enabled(void); extern void gserial_dun_w_softap_enable(bool enable); From 6c41eb78dc21c0d12f4c7367d3e3f934d9998178 Mon Sep 17 00:00:00 2001 From: Kaushal Kumar Date: Fri, 20 Jan 2017 15:23:40 +0530 Subject: [PATCH 0586/1015] soc: qcom: make debugfs support configurable for kryo l2 accessors driver Add config option to enable/disable l2 indirect access debug capability. The driver exposes l2 indirect access debugfs interface to get/set data, address, and target cpus so keep it disabled by default. Change-Id: I22f84d16a3bf12a78295f2d052bb50e90d6f2a8b Signed-off-by: Kaushal Kumar --- drivers/soc/qcom/Kconfig | 10 ++++++++++ drivers/soc/qcom/kryo-l2-accessors.c | 6 +++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig index 7b512edb7e75c..a4852719085b3 100644 --- a/drivers/soc/qcom/Kconfig +++ b/drivers/soc/qcom/Kconfig @@ -292,6 +292,16 @@ config MSM_CACHE_M4M_ERP64_PANIC_ON_UE Say 'Y' here to cause kernel panic when uncorrectable cache/M4M errors are detected. +config MSM_L2_IA_DEBUG + bool "Enable MSM L2 Indirect Access Debug" + depends on DEBUG_FS + default n + help + This option enables L2 indirect access debug + capability. It exposes L2 indirect access + debugfs interface to get/set data, address, + and target cpus. + config MSM_RPM_SMD bool "RPM driver using SMD protocol" help diff --git a/drivers/soc/qcom/kryo-l2-accessors.c b/drivers/soc/qcom/kryo-l2-accessors.c index a945f9e0ba40f..1d81074d7b817 100644 --- a/drivers/soc/qcom/kryo-l2-accessors.c +++ b/drivers/soc/qcom/kryo-l2-accessors.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -80,7 +80,7 @@ u64 get_l2_indirect_reg(u64 reg) } EXPORT_SYMBOL(get_l2_indirect_reg); -#if defined(CONFIG_DEBUG_FS) +#if defined(CONFIG_MSM_L2_IA_DEBUG) static u32 debug_addr; static int debug_target_cpu; @@ -180,4 +180,4 @@ static int l2_ia_debug_init(void) } late_initcall(l2_ia_debug_init); -#endif /* CONFIG_DEBUG_FS */ +#endif /* CONFIG_MSM_L2_IA_DEBUG */ From 13b21495230a8c8d3820be269425ce5c32e2473a Mon Sep 17 00:00:00 2001 From: Puja Gupta Date: Tue, 6 Dec 2016 16:08:27 -0800 Subject: [PATCH 0587/1015] soc: qcom: pil: Initialize variable to avoid invalid access Initialize dp_fw to NULL so that we don't try to release it in the error path err_invalid_fw. CRs-Fixed: 1095243 Change-Id: I18f549102e626dc788e8fa56d6bb1ea28efe4f88 Signed-off-by: Puja Gupta --- drivers/soc/qcom/pil-msa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/qcom/pil-msa.c b/drivers/soc/qcom/pil-msa.c index 7a12c3220cad4..4eb59ed549628 100644 --- a/drivers/soc/qcom/pil-msa.c +++ b/drivers/soc/qcom/pil-msa.c @@ -527,7 +527,7 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) { struct q6v5_data *drv = container_of(pil, struct q6v5_data, desc); struct modem_data *md = dev_get_drvdata(pil->dev); - const struct firmware *fw, *dp_fw; + const struct firmware *fw, *dp_fw = NULL; char fw_name_legacy[10] = "mba.b00"; char fw_name[10] = "mba.mbn"; char *dp_name = "msadp"; From 41aa72552c6c693391950df3e83c012f47536ea3 Mon Sep 17 00:00:00 2001 From: Ramakant Singh Date: Thu, 8 Dec 2016 20:04:20 +0530 Subject: [PATCH 0588/1015] msm: mdss: fix to handle multi-rect configuration in error cases In case of an error when configuring a pipe during kickoff, driver unstages from HW the pipe that had the error, so it makes sure this dirty pipe is not used by HW. This is a problem if the pipe is configured in multi-rect mode and we only fail one of the two multi-rect pipes since in this case HW is expecting both multi-rect pipes that represent the two HW rectangles and we are only configuring one due the error that happened. Fix this problem by making sure that if the configuration of one multi-rect fail, we unstage both multi-rect pipes. Change-Id: I78e7f89c19ee018eadba22a2ad71cf007c0874fb Signed-off-by: Ramakant Singh --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 52 +++++++++++++++++++---- drivers/video/msm/mdss/mdss_mdp_pipe.c | 10 +++-- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index 7e9a14e0401d3..e0861124efe83 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -1456,6 +1456,21 @@ static void mdss_mdp_overlay_update_pm(struct mdss_overlay_private *mdp5_data) activate_event_timer(mdp5_data->cpu_pm_hdl, wakeup_time); } +static void __unstage_pipe_and_clean_buf(struct msm_fb_data_type *mfd, + struct mdss_mdp_pipe *pipe, struct mdss_mdp_data *buf) +{ + + pr_debug("unstaging pipe:%d rect:%d buf:%d\n", + pipe->num, pipe->multirect.num, !buf); + MDSS_XLOG(pipe->num, pipe->multirect.num, !buf); + mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); + mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_right); + pipe->dirty = true; + + if (buf) + __pipe_buf_mark_cleanup(mfd, buf); +} + static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); @@ -1567,7 +1582,6 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) pipe->num); ret = -EINVAL; } - /* * if we reach here without errors and buf == NULL * then solid fill will be set @@ -1576,14 +1590,36 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) ret = mdss_mdp_pipe_queue_data(pipe, buf); if (IS_ERR_VALUE(ret)) { - pr_warn("Unable to queue data for pnum=%d\n", - pipe->num); - mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); - mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_right); - pipe->dirty = true; + pr_warn("Unable to queue data for pnum=%d rect=%d\n", + pipe->num, pipe->multirect.num); + + /* + * If we fail for a multi-rect pipe, unstage both rects + * so we don't leave the pipe configured in multi-rect + * mode with only one rectangle staged. + */ + if (pipe->multirect.mode != + MDSS_MDP_PIPE_MULTIRECT_NONE) { + struct mdss_mdp_pipe *next_pipe = + (struct mdss_mdp_pipe *) + pipe->multirect.next; + + if (next_pipe) { + struct mdss_mdp_data *next_buf = + list_first_entry_or_null( + &next_pipe->buf_queue, + struct mdss_mdp_data, + pipe_list); + + __unstage_pipe_and_clean_buf(mfd, + next_pipe, next_buf); + } else { + pr_warn("cannot find rect pnum=%d\n", + pipe->num); + } + } - if (buf) - __pipe_buf_mark_cleanup(mfd, buf); + __unstage_pipe_and_clean_buf(mfd, pipe, buf); } } diff --git a/drivers/video/msm/mdss/mdss_mdp_pipe.c b/drivers/video/msm/mdss/mdss_mdp_pipe.c index 36983ddb127d1..1f03763b197a2 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pipe.c +++ b/drivers/video/msm/mdss/mdss_mdp_pipe.c @@ -2664,20 +2664,22 @@ int mdss_mdp_pipe_queue_data(struct mdss_mdp_pipe *pipe, pipe->params_changed = 0; mdss_mdp_pipe_solidfill_setup(pipe); - MDSS_XLOG(pipe->num, pipe->mixer_left->num, pipe->play_cnt, - 0x111); + MDSS_XLOG(pipe->num, pipe->multirect.num, + pipe->mixer_left->num, pipe->play_cnt, 0x111); goto update_nobuf; } - MDSS_XLOG(pipe->num, pipe->mixer_left->num, pipe->play_cnt, 0x222); + MDSS_XLOG(pipe->num, pipe->multirect.num, pipe->mixer_left->num, + pipe->play_cnt, 0x222); if (params_changed) { pipe->params_changed = 0; ret = mdss_mdp_pipe_pp_setup(pipe, &opmode); if (ret) { - pr_err("pipe pp setup error for pnum=%d\n", pipe->num); + pr_err("pipe pp setup error for pnum=%d rect=%d\n", + pipe->num, pipe->multirect.num); goto done; } From 0e1a0edc9da8f9990075bf499bef011d624fe8ce Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Fri, 20 Jan 2017 14:04:18 +0530 Subject: [PATCH 0589/1015] memshare: Fix parameters to collect ramdump This patch defines condition for collecting ramdump only when ramdump collection is enabled, modem is crashed and memshare notified of SUBSYS_RAMDUMP_NOTIFICATION. CRs-Fixed: 1114015 Change-Id: I7e3ca0794980fd21cc0a5d890df4aeadfd5fbbbb Signed-off-by: Manoj Prabhu B --- drivers/soc/qcom/memshare/msm_memshare.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/soc/qcom/memshare/msm_memshare.c b/drivers/soc/qcom/memshare/msm_memshare.c index 30cc27d6406d8..67a902f81368c 100644 --- a/drivers/soc/qcom/memshare/msm_memshare.c +++ b/drivers/soc/qcom/memshare/msm_memshare.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -38,6 +38,7 @@ static void mem_share_svc_recv_msg(struct work_struct *work); static DECLARE_DELAYED_WORK(work_recv_msg, mem_share_svc_recv_msg); static struct workqueue_struct *mem_share_svc_workqueue; static uint64_t bootup_request; +static bool ramdump_event; static void *memshare_ramdump_dev[MAX_CLIENTS]; /* Memshare Driver Structure */ @@ -305,18 +306,25 @@ static int modem_notifier_cb(struct notifier_block *this, unsigned long code, bootup_request++; break; + case SUBSYS_RAMDUMP_NOTIFICATION: + ramdump_event = 1; + break; + case SUBSYS_BEFORE_POWERUP: - if (_cmd) + if (_cmd) { notifdata = (struct notif_data *) _cmd; - else + } else { + ramdump_event = 0; break; + } - if (notifdata->enable_ramdump) { + if (notifdata->enable_ramdump && ramdump_event) { pr_info("memshare: %s, Ramdump collection is enabled\n", __func__); ret = mem_share_do_ramdump(); if (ret) pr_err("Ramdump collection failed\n"); + ramdump_event = 0; } break; From dd61d28bf293e599ce8b33a31b4a4d61ef5a8992 Mon Sep 17 00:00:00 2001 From: Ashwini Rao Date: Tue, 15 Mar 2016 13:09:55 -0700 Subject: [PATCH 0590/1015] msm: jpeg: DMA V4L2 driver changes Fixed issues in jpeg DMA v4l2 driver, related to incorrect clock index, incorrect buffer offset, incorrect dtsi node names for VBIF, QOS and mmu prefetch. CRs-Fixed: 1083323 Change-Id: Ice15afd63e006401a469376277b50a129ef177b4 Signed-off-by: Krupal Divvela --- .../bindings/media/video/msm-jpegdma.txt | 31 +++-- .../msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c | 107 ++++++++++++++---- .../msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h | 7 +- .../msm/camera_v2/jpeg_dma/msm_jpeg_dma_hw.c | 85 ++++++++++---- include/uapi/media/msm_jpeg_dma.h | 8 +- 5 files changed, 180 insertions(+), 58 deletions(-) diff --git a/Documentation/devicetree/bindings/media/video/msm-jpegdma.txt b/Documentation/devicetree/bindings/media/video/msm-jpegdma.txt index 2b05659da7628..bc0eb14b38d3c 100644 --- a/Documentation/devicetree/bindings/media/video/msm-jpegdma.txt +++ b/Documentation/devicetree/bindings/media/video/msm-jpegdma.txt @@ -19,13 +19,18 @@ Required properties: - clocks : clocks required for the device. - qcom,clock-rates: should specify clock rates in Hz to each clocks property defined. +- Refer to "Documentation/devicetree/bindings/arm/msm/msm_bus.txt" for + below optional properties: + - qcom,msm-bus,name + - qcom,msm-bus,num-cases + - qcom,msm-bus,num-paths + - qcom,msm-bus,vectors-KBps + Optional properties: -- qcom,qos-regs: relative address offsets of QoS registers. -- qcom,qos-settings: QoS values to be written to QoS registers. -- qcom,vbif-regs: relative address offsets of VBIF registers. -- qcom,vbif-settings: VBIF values to be written to VBIF registers. -- qcom,prefetch-regs: relative address offsets of MMU prefetch registers. -- qcom,prefetch-settings: values to be written to MMU Prefetch registers. +- qcom,vbif-reg-settings: relative address offsets and value pairs for VBIF registers. +- qcom,qos-reg-settings: relative address offsets and value pairs for QoS registers. +- qcom,prefetch-reg-settings: relative address offsets and value pairs for + MMU prefetch registers. Example: qcom,jpegdma@aa0000 { @@ -53,10 +58,14 @@ Example: <&clock_gcc clk_mmssnoc_axi_clk>, <&clock_mmss clk_mmagic_camss_axi_clk>; qcom,clock-rates = <266670000 0 0 0 0 0 0 0 0>, - <400000000 0 0 0 0 0 0 0 0>; - qcom,vbif-regs = <0x4 0xDC 0x124 0x160>; - qcom,vbif-settings = <0x1 0x7 0x1 0x22222222>; - qcom,prefetch-regs = <0x18C 0x1A0 0x1B0>; - qcom,prefetch-settings = <0x11 0x31 0x31>; + qcom,vbif-reg-settings = <0x4 0x1>; + qcom,prefetch-reg-settings = <0x18c 0x11>, + <0x1a0 0x31>, + <0x1b0 0x31>; + qcom,msm-bus,name = "msm_camera_jpeg_dma"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = <62 512 0 0>, + <62 512 666675 666675>; status = "ok"; }; diff --git a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c index 080eb2ca43a9b..b49644f3dc122 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c +++ b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include #include @@ -70,18 +72,31 @@ static struct msm_jpegdma_format formats[] = { .planes[1] = JPEGDMA_PLANE_TYPE_CBCR, }, { - .name = "YUV 4:2:0 planar, YCbCr", - .fourcc = V4L2_PIX_FMT_YUV420, + .name = "YVU 4:2:0 planar, YCrCb", + .fourcc = V4L2_PIX_FMT_YVU420, .depth = 12, .num_planes = 3, - .colplane_h = 2, - .colplane_v = 2, + .colplane_h = 1, + .colplane_v = 4, .h_align = 2, .v_align = 2, .planes[0] = JPEGDMA_PLANE_TYPE_Y, .planes[1] = JPEGDMA_PLANE_TYPE_CR, .planes[2] = JPEGDMA_PLANE_TYPE_CB, }, + { + .name = "YUV 4:2:0 planar, YCbCr", + .fourcc = V4L2_PIX_FMT_YUV420, + .depth = 12, + .num_planes = 3, + .colplane_h = 1, + .colplane_v = 4, + .h_align = 2, + .v_align = 2, + .planes[0] = JPEGDMA_PLANE_TYPE_Y, + .planes[1] = JPEGDMA_PLANE_TYPE_CB, + .planes[2] = JPEGDMA_PLANE_TYPE_CR, + }, }; /* @@ -196,7 +211,8 @@ static void msm_jpegdma_align_format(struct v4l2_format *f, int format_idx) if (formats[format_idx].num_planes > 1) for (i = 1; i < formats[format_idx].num_planes; i++) size_image += (f->fmt.pix.bytesperline * - (f->fmt.pix.height / formats[format_idx].colplane_v)); + (f->fmt.pix.height / + formats[format_idx].colplane_v)); f->fmt.pix.sizeimage = size_image; f->fmt.pix.field = V4L2_FIELD_NONE; @@ -250,6 +266,9 @@ static int msm_jpegdma_update_hw_config(struct jpegdma_ctx *ctx) size.fps = ctx->timeperframe.denominator / ctx->timeperframe.numerator; + size.in_offset = ctx->in_offset; + size.out_offset = ctx->out_offset; + size.format = formats[ctx->format_idx]; msm_jpegdma_fill_size_from_ctx(ctx, &size); @@ -362,7 +381,9 @@ static void msm_jpegdma_stop_streaming(struct vb2_queue *q) dev_err(ctx->jdma_device->dev, "Ctx wait timeout\n"); ret = -ETIME; } - msm_jpegdma_hw_put(ctx->jdma_device); + + if (ctx->jdma_device->ref_count > 0) + msm_jpegdma_hw_put(ctx->jdma_device); } /* Videobuf2 queue callbacks. */ @@ -385,13 +406,29 @@ static void *msm_jpegdma_get_userptr(void *alloc_ctx, { struct msm_jpegdma_device *dma = alloc_ctx; struct msm_jpegdma_buf_handle *buf; + struct msm_jpeg_dma_buff __user *up_buff = compat_ptr(vaddr); + struct msm_jpeg_dma_buff kp_buff; int ret; + if (!access_ok(VERIFY_READ, up_buff, + sizeof(struct msm_jpeg_dma_buff)) || + get_user(kp_buff.fd, &up_buff->fd)) { + dev_err(dma->dev, "Error getting user data\n"); + return ERR_PTR(-ENOMEM); + } + + if (!access_ok(VERIFY_WRITE, up_buff, + sizeof(struct msm_jpeg_dma_buff)) || + put_user(kp_buff.fd, &up_buff->fd)) { + dev_err(dma->dev, "Error putting user data\n"); + return ERR_PTR(-ENOMEM); + } + buf = kzalloc(sizeof(*buf), GFP_KERNEL); if (!buf) return ERR_PTR(-ENOMEM); - ret = msm_jpegdma_hw_map_buffer(dma, vaddr, buf); + ret = msm_jpegdma_hw_map_buffer(dma, kp_buff.fd, buf); if (ret < 0 || buf->size < size) goto error; @@ -479,7 +516,6 @@ static int msm_jpegdma_open(struct file *file) if (!ctx) return -ENOMEM; - mutex_init(&ctx->lock); ctx->jdma_device = device; dev_dbg(ctx->jdma_device->dev, "Jpeg v4l2 dma open\n"); /* Set ctx defaults */ @@ -528,7 +564,9 @@ static int msm_jpegdma_release(struct file *file) struct jpegdma_ctx *ctx = msm_jpegdma_ctx_from_fh(file->private_data); /* release all the resources */ - msm_jpegdma_hw_put(ctx->jdma_device); + if (ctx->jdma_device->ref_count > 0) + msm_jpegdma_hw_put(ctx->jdma_device); + atomic_set(&ctx->active, 0); complete_all(&ctx->completion); v4l2_m2m_ctx_release(ctx->m2m_ctx); @@ -771,16 +809,46 @@ static int msm_jpegdma_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf) { struct jpegdma_ctx *ctx = msm_jpegdma_ctx_from_fh(fh); + struct msm_jpeg_dma_buff __user *up_buff = compat_ptr(buf->m.userptr); + struct msm_jpeg_dma_buff kp_buff; int ret; - mutex_lock(&ctx->lock); + if (!access_ok(VERIFY_READ, up_buff, + sizeof(struct msm_jpeg_dma_buff)) || + get_user(kp_buff.fd, &up_buff->fd) || + get_user(kp_buff.offset, &up_buff->offset)) { + dev_err(ctx->jdma_device->dev, "Error getting user data\n"); + return -EFAULT; + } + + if (!access_ok(VERIFY_WRITE, up_buff, + sizeof(struct msm_jpeg_dma_buff)) || + put_user(kp_buff.fd, &up_buff->fd) || + put_user(kp_buff.offset, &up_buff->offset)) { + dev_err(ctx->jdma_device->dev, "Error putting user data\n"); + return -EFAULT; + } + + switch (buf->type) { + case V4L2_BUF_TYPE_VIDEO_OUTPUT: + ctx->in_offset = kp_buff.offset; + dev_dbg(ctx->jdma_device->dev, "input buf offset %d\n", + ctx->in_offset); + break; + case V4L2_BUF_TYPE_VIDEO_CAPTURE: + ctx->out_offset = kp_buff.offset; + dev_dbg(ctx->jdma_device->dev, "output buf offset %d\n", + ctx->out_offset); + break; + } + + if (atomic_read(&ctx->active)) + ret = msm_jpegdma_update_hw_config(ctx); ret = v4l2_m2m_qbuf(file, ctx->m2m_ctx, buf); if (ret < 0) dev_err(ctx->jdma_device->dev, "QBuf fail\n"); - mutex_unlock(&ctx->lock); - return ret; } @@ -813,14 +881,10 @@ static int msm_jpegdma_streamon(struct file *file, if (!msm_jpegdma_config_ok(ctx)) return -EINVAL; - mutex_lock(&ctx->lock); - ret = v4l2_m2m_streamon(file, ctx->m2m_ctx, buf_type); if (ret < 0) dev_err(ctx->jdma_device->dev, "Stream on fail\n"); - mutex_unlock(&ctx->lock); - return ret; } @@ -951,14 +1015,10 @@ static int msm_jpegdma_s_crop(struct file *file, void *fh, if (crop->c.top % formats[ctx->format_idx].v_align) return -EINVAL; - mutex_lock(&ctx->lock); - ctx->crop = crop->c; if (atomic_read(&ctx->active)) ret = msm_jpegdma_update_hw_config(ctx); - mutex_unlock(&ctx->lock); - return ret; } @@ -1001,7 +1061,7 @@ static int msm_jpegdma_s_parm(struct file *file, void *fh, return -EINVAL; if (!a->parm.output.timeperframe.numerator || - !a->parm.output.timeperframe.denominator) + !a->parm.output.timeperframe.denominator) return -EINVAL; /* Frame rate is not supported during streaming */ @@ -1135,16 +1195,15 @@ void msm_jpegdma_isr_processing_done(struct msm_jpegdma_device *dma) struct jpegdma_ctx *ctx; mutex_lock(&dma->lock); + ctx = v4l2_m2m_get_curr_priv(dma->m2m_dev); if (ctx) { - mutex_lock(&ctx->lock); ctx->plane_idx++; if (ctx->plane_idx >= formats[ctx->format_idx].num_planes) { src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx); dst_buf = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx); if (src_buf == NULL || dst_buf == NULL) { dev_err(ctx->jdma_device->dev, "Error, buffer list empty\n"); - mutex_unlock(&ctx->lock); mutex_unlock(&dma->lock); return; } @@ -1160,13 +1219,11 @@ void msm_jpegdma_isr_processing_done(struct msm_jpegdma_device *dma) src_buf = v4l2_m2m_next_src_buf(ctx->m2m_ctx); if (src_buf == NULL || dst_buf == NULL) { dev_err(ctx->jdma_device->dev, "Error, buffer list empty\n"); - mutex_unlock(&ctx->lock); mutex_unlock(&dma->lock); return; } msm_jpegdma_process_buffers(ctx, src_buf, dst_buf); } - mutex_unlock(&ctx->lock); } mutex_unlock(&dma->lock); } diff --git a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h index adb8b94f098c2..0a9cab6e4322b 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h +++ b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h @@ -22,7 +22,7 @@ /* Max number of clocks defined in device tree */ #define MSM_JPEGDMA_MAX_CLK 10 /* Core clock index */ -#define MSM_JPEGDMA_CORE_CLK 0 +#define MSM_JPEGDMA_CORE_CLK "core_clk" /* Max number of regulators defined in device tree */ #define MSM_JPEGDMA_MAX_REGULATOR_NUM 3 /* Max number of planes supported */ @@ -109,6 +109,8 @@ struct msm_jpegdma_size_config { struct msm_jpegdma_size out_size; struct msm_jpegdma_format format; unsigned int fps; + unsigned int in_offset; + unsigned int out_offset; }; /* @@ -252,7 +254,6 @@ struct msm_jpegdma_buf_handle { * @format_idx: Current format index. */ struct jpegdma_ctx { - struct mutex lock; struct msm_jpegdma_device *jdma_device; atomic_t active; struct completion completion; @@ -262,6 +263,8 @@ struct jpegdma_ctx { struct v4l2_format format_out; struct v4l2_rect crop; struct v4l2_fract timeperframe; + unsigned int in_offset; + unsigned int out_offset; unsigned int config_idx; struct msm_jpegdma_plane_config plane_config[MSM_JPEGDMA_MAX_CONFIGS]; diff --git a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_hw.c b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_hw.c index f3ceaad21bf5a..a1b814b5f4756 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_hw.c +++ b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_hw.c @@ -165,6 +165,23 @@ static int msm_jpegdma_hw_get_num_pipes(struct msm_jpegdma_device *dma) return num_pipes; } +/* + * msm_jpegdma_hw_get_clock_index - Get clock index by name + * @dma: Pointer to dma device. + * @clk_name: clock name. + */ +int msm_jpegdma_hw_get_clock_index(struct msm_jpegdma_device *dma, + const char *clk_name) +{ + uint32_t i = 0; + + for (i = 0; i < dma->num_clk; i++) { + if (!strcmp(clk_name, dma->jpeg_clk_info[i].clk_name)) + return i; + } + return -EINVAL; +} + /* * msm_jpegdma_hw_reset - Reset jpeg dma core. * @dma: Pointer to dma device. @@ -782,12 +799,20 @@ static int msm_jpegdma_hw_calc_speed(struct msm_jpegdma_device *dma, u64 height; u64 real_clock; u64 calc_rate; + int core_clk_idx; width = size->in_size.width + size->in_size.left; height = size->in_size.height + size->in_size.top; calc_rate = (width * height * size->format.depth * size->fps) / 16; - real_clock = clk_round_rate(dma->clk[MSM_JPEGDMA_CORE_CLK], calc_rate); + core_clk_idx = msm_jpegdma_hw_get_clock_index(dma, + MSM_JPEGDMA_CORE_CLK); + if (core_clk_idx < 0) { + dev_err(dma->dev, "Can get clock index for dma %s\n", + MSM_JPEGDMA_CORE_CLK); + } + + real_clock = clk_round_rate(dma->clk[core_clk_idx], calc_rate); if (real_clock < 0) { dev_err(dma->dev, "Can not round core clock\n"); return -EINVAL; @@ -817,6 +842,7 @@ static int msm_jpegdma_hw_set_speed(struct msm_jpegdma_device *dma, struct msm_jpegdma_speed new_sp; struct msm_jpegdma_size_config new_size; int ret; + int core_clk_idx; if (dma->active_clock_rate >= speed->core_clock) return 0; @@ -830,7 +856,14 @@ static int msm_jpegdma_hw_set_speed(struct msm_jpegdma_device *dma, return -EINVAL; } - ret = clk_set_rate(dma->clk[MSM_JPEGDMA_CORE_CLK], new_sp.core_clock); + core_clk_idx = msm_jpegdma_hw_get_clock_index(dma, + MSM_JPEGDMA_CORE_CLK); + if (core_clk_idx < 0) { + dev_err(dma->dev, "Can get clock index for dma %s\n", + MSM_JPEGDMA_CORE_CLK); + } + + ret = clk_set_rate(dma->clk[core_clk_idx], new_sp.core_clock); if (ret < 0) { dev_err(dma->dev, "Fail Core clock rate %d\n", ret); return -EINVAL; @@ -1022,13 +1055,20 @@ int msm_jpegdma_hw_set_config(struct msm_jpegdma_device *dma, plane_cfg->plane[0].active_pipes = dma->hw_num_pipes; plane_cfg->plane[0].type = size_cfg->format.planes[0]; msm_jpegdma_hw_calc_config(size_cfg, &plane_cfg->plane[0]); + + in_offset = size_cfg->in_offset; + out_offset = size_cfg->out_offset; + + msm_jpegdma_hw_add_plane_offset(&plane_cfg->plane[0], + in_offset, out_offset); + if (size_cfg->format.num_planes == 1) return 0; - in_offset = size_cfg->in_size.scanline * - size_cfg->in_size.stride; - out_offset = size_cfg->out_size.scanline * - size_cfg->out_size.stride; + in_offset += (size_cfg->in_size.scanline * + size_cfg->in_size.stride); + out_offset += (size_cfg->out_size.scanline * + size_cfg->out_size.stride); memset(&plane_size, 0x00, sizeof(plane_size)); for (i = 1; i < size_cfg->format.num_planes; i++) { @@ -1336,7 +1376,8 @@ int msm_jpegdma_hw_get_qos(struct msm_jpegdma_device *dma) unsigned int cnt; const void *property; - property = of_get_property(dma->dev->of_node, "qcom,qos-regs", &cnt); + property = of_get_property(dma->dev->of_node, + "qcom,qos-reg-settings", &cnt); if (!property || !cnt) { dev_dbg(dma->dev, "Missing qos settings\n"); return 0; @@ -1347,9 +1388,9 @@ int msm_jpegdma_hw_get_qos(struct msm_jpegdma_device *dma) if (!dma->qos_regs) return -ENOMEM; - for (i = 0; i < cnt; i++) { + for (i = 0; i < cnt; i = i + 2) { ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,qos-regs", i, + "qcom,qos-reg-settings", i, &dma->qos_regs[i].reg); if (ret < 0) { dev_err(dma->dev, "can not read qos reg %d\n", i); @@ -1357,7 +1398,7 @@ int msm_jpegdma_hw_get_qos(struct msm_jpegdma_device *dma) } ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,qos-settings", i, + "qcom,qos-reg-settings", i + 1, &dma->qos_regs[i].val); if (ret < 0) { dev_err(dma->dev, "can not read qos setting %d\n", i); @@ -1397,7 +1438,8 @@ int msm_jpegdma_hw_get_vbif(struct msm_jpegdma_device *dma) unsigned int cnt; const void *property; - property = of_get_property(dma->dev->of_node, "qcom,vbif-regs", &cnt); + property = of_get_property(dma->dev->of_node, "qcom,vbif-reg-settings", + &cnt); if (!property || !cnt) { dev_dbg(dma->dev, "Missing vbif settings\n"); return 0; @@ -1408,9 +1450,9 @@ int msm_jpegdma_hw_get_vbif(struct msm_jpegdma_device *dma) if (!dma->vbif_regs) return -ENOMEM; - for (i = 0; i < cnt; i++) { + for (i = 0; i < cnt; i = i + 2) { ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,vbif-regs", i, + "qcom,vbif-reg-settings", i, &dma->vbif_regs[i].reg); if (ret < 0) { dev_err(dma->dev, "can not read vbif reg %d\n", i); @@ -1418,7 +1460,7 @@ int msm_jpegdma_hw_get_vbif(struct msm_jpegdma_device *dma) } ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,vbif-settings", i, + "qcom,vbif-reg-settings", i + 1, &dma->vbif_regs[i].val); if (ret < 0) { dev_err(dma->dev, "can not read vbif setting %d\n", i); @@ -1459,8 +1501,8 @@ int msm_jpegdma_hw_get_prefetch(struct msm_jpegdma_device *dma) unsigned int cnt; const void *property; - property = of_get_property(dma->dev->of_node, "qcom,prefetch-regs", - &cnt); + property = of_get_property(dma->dev->of_node, + "qcom,prefetch-reg-settings", &cnt); if (!property || !cnt) { dev_dbg(dma->dev, "Missing prefetch settings\n"); return 0; @@ -1472,9 +1514,9 @@ int msm_jpegdma_hw_get_prefetch(struct msm_jpegdma_device *dma) if (!dma->prefetch_regs) return -ENOMEM; - for (i = 0; i < cnt; i++) { + for (i = 0; i < cnt; i = i + 2) { ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,prefetch-regs", i, + "qcom,prefetch-reg-settings", i, &dma->prefetch_regs[i].reg); if (ret < 0) { dev_err(dma->dev, "can not read prefetch reg %d\n", i); @@ -1482,7 +1524,7 @@ int msm_jpegdma_hw_get_prefetch(struct msm_jpegdma_device *dma) } ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,prefetch-settings", i, + "qcom,prefetch-reg-settings", i + 1, &dma->prefetch_regs[i].val); if (ret < 0) { dev_err(dma->dev, "can not read prefetch setting %d\n", @@ -1598,6 +1640,9 @@ int msm_jpegdma_hw_get(struct msm_jpegdma_device *dma) msm_jpegdma_hw_config_qos(dma); msm_jpegdma_hw_config_vbif(dma); + msm_camera_register_threaded_irq(dma->pdev, dma->irq, NULL, + msm_jpegdma_hw_irq, IRQF_ONESHOT | IRQF_TRIGGER_RISING, + dev_name(&dma->pdev->dev), dma); msm_jpegdma_hw_enable_irq(dma); ret = msm_jpegdma_hw_reset(dma); @@ -1710,6 +1755,7 @@ static int msm_jpegdma_hw_attach_iommu(struct msm_jpegdma_device *dma) static void msm_jpegdma_hw_detach_iommu(struct msm_jpegdma_device *dma) { mutex_lock(&dma->lock); + if (dma->iommu_attached_cnt == 0) { dev_err(dma->dev, "There is no attached device\n"); mutex_unlock(&dma->lock); @@ -1720,6 +1766,7 @@ static void msm_jpegdma_hw_detach_iommu(struct msm_jpegdma_device *dma) cam_smmu_ops(dma->iommu_hndl, CAM_SMMU_DETACH); cam_smmu_destroy_handle(dma->iommu_hndl); } + mutex_unlock(&dma->lock); } diff --git a/include/uapi/media/msm_jpeg_dma.h b/include/uapi/media/msm_jpeg_dma.h index 44fa4ed8af520..df3c7ee5b7cfc 100644 --- a/include/uapi/media/msm_jpeg_dma.h +++ b/include/uapi/media/msm_jpeg_dma.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -18,4 +18,10 @@ /* msm jpeg dma control ID's */ #define V4L2_CID_JPEG_DMA_SPEED (V4L2_CID_PRIVATE_BASE) +/* msm_jpeg_dma_buf */ +struct msm_jpeg_dma_buff { + int32_t fd; + uint32_t offset; +}; + #endif /* __UAPI_MSM_JPEG_DMA__ */ From 1ad8a7ee3c9fbd9bc3e5fbdb4c88a86bf45ba6fe Mon Sep 17 00:00:00 2001 From: Gautham Mayyuri Date: Tue, 8 Nov 2016 14:55:14 -0800 Subject: [PATCH 0591/1015] msm: camera: jpegdma: Check for compat config Check if compat config is defined before converting user pointer to compat pointer. CRs-Fixed: 1083323 Change-Id: Ia8495790b031ae69dd8d9f36cdd2408de9aed29b Signed-off-by: Krupal Divvela --- .../msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c index b49644f3dc122..18cdc1f29e6ea 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c +++ b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c @@ -126,6 +126,21 @@ static inline void msm_jpegdma_schedule_next_config(struct jpegdma_ctx *ctx) ctx->config_idx = (ctx->config_idx + 1) % MSM_JPEGDMA_MAX_CONFIGS; } +/* + * msm_jpegdma_cast_long_to_buff_ptr - Cast long to buffer pointer. + * @vaddr: vaddr as long + * @buff_ptr_head: buffer pointer head + */ +static inline void msm_jpegdma_cast_long_to_buff_ptr(unsigned long vaddr, + struct msm_jpeg_dma_buff **buff_ptr_head) +{ +#ifdef CONFIG_COMPAT + *buff_ptr_head = compat_ptr(vaddr); +#else + *buff_ptr_head = (struct msm_jpeg_dma_buff *) vaddr; +#endif +} + /* * msm_jpegdma_get_format_idx - Get jpeg dma format lookup index. * @ctx: Pointer to dma ctx. @@ -406,10 +421,12 @@ static void *msm_jpegdma_get_userptr(void *alloc_ctx, { struct msm_jpegdma_device *dma = alloc_ctx; struct msm_jpegdma_buf_handle *buf; - struct msm_jpeg_dma_buff __user *up_buff = compat_ptr(vaddr); + struct msm_jpeg_dma_buff __user *up_buff; struct msm_jpeg_dma_buff kp_buff; int ret; + msm_jpegdma_cast_long_to_buff_ptr(vaddr, &up_buff); + if (!access_ok(VERIFY_READ, up_buff, sizeof(struct msm_jpeg_dma_buff)) || get_user(kp_buff.fd, &up_buff->fd)) { @@ -809,10 +826,12 @@ static int msm_jpegdma_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf) { struct jpegdma_ctx *ctx = msm_jpegdma_ctx_from_fh(fh); - struct msm_jpeg_dma_buff __user *up_buff = compat_ptr(buf->m.userptr); + struct msm_jpeg_dma_buff __user *up_buff; struct msm_jpeg_dma_buff kp_buff; int ret; + msm_jpegdma_cast_long_to_buff_ptr(buf->m.userptr, &up_buff); + if (!access_ok(VERIFY_READ, up_buff, sizeof(struct msm_jpeg_dma_buff)) || get_user(kp_buff.fd, &up_buff->fd) || From 4b20c7d0125320ebec73e1f168503653caf47c86 Mon Sep 17 00:00:00 2001 From: Krishnankutty Kolathappilly Date: Wed, 16 Nov 2016 15:10:18 -0800 Subject: [PATCH 0592/1015] msm: camera: Synchronize jpeg ISR and userspace call This will fix the race between jpeg dma ISR and userspace call. Without this fix jpeg dma may randomly crash due to invalid pointer access. Change-Id: I559ae08b9a46d5d3c35f8be509976a25faa967f9 CRs-Fixed: 1083323 Signed-off-by: Krupal Divvela --- .../msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c | 14 +++++++++++--- .../msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c index 18cdc1f29e6ea..2e641bcea09b8 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c +++ b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c @@ -533,6 +533,7 @@ static int msm_jpegdma_open(struct file *file) if (!ctx) return -ENOMEM; + mutex_init(&ctx->lock); ctx->jdma_device = device; dev_dbg(ctx->jdma_device->dev, "Jpeg v4l2 dma open\n"); /* Set ctx defaults */ @@ -831,12 +832,13 @@ static int msm_jpegdma_qbuf(struct file *file, void *fh, int ret; msm_jpegdma_cast_long_to_buff_ptr(buf->m.userptr, &up_buff); - + mutex_lock(&ctx->lock); if (!access_ok(VERIFY_READ, up_buff, sizeof(struct msm_jpeg_dma_buff)) || get_user(kp_buff.fd, &up_buff->fd) || get_user(kp_buff.offset, &up_buff->offset)) { dev_err(ctx->jdma_device->dev, "Error getting user data\n"); + mutex_unlock(&ctx->lock); return -EFAULT; } @@ -845,6 +847,7 @@ static int msm_jpegdma_qbuf(struct file *file, void *fh, put_user(kp_buff.fd, &up_buff->fd) || put_user(kp_buff.offset, &up_buff->offset)) { dev_err(ctx->jdma_device->dev, "Error putting user data\n"); + mutex_unlock(&ctx->lock); return -EFAULT; } @@ -867,7 +870,7 @@ static int msm_jpegdma_qbuf(struct file *file, void *fh, ret = v4l2_m2m_qbuf(file, ctx->m2m_ctx, buf); if (ret < 0) dev_err(ctx->jdma_device->dev, "QBuf fail\n"); - + mutex_unlock(&ctx->lock); return ret; } @@ -1034,10 +1037,11 @@ static int msm_jpegdma_s_crop(struct file *file, void *fh, if (crop->c.top % formats[ctx->format_idx].v_align) return -EINVAL; + mutex_lock(&ctx->lock); ctx->crop = crop->c; if (atomic_read(&ctx->active)) ret = msm_jpegdma_update_hw_config(ctx); - + mutex_unlock(&ctx->lock); return ret; } @@ -1217,12 +1221,14 @@ void msm_jpegdma_isr_processing_done(struct msm_jpegdma_device *dma) ctx = v4l2_m2m_get_curr_priv(dma->m2m_dev); if (ctx) { + mutex_lock(&ctx->lock); ctx->plane_idx++; if (ctx->plane_idx >= formats[ctx->format_idx].num_planes) { src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx); dst_buf = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx); if (src_buf == NULL || dst_buf == NULL) { dev_err(ctx->jdma_device->dev, "Error, buffer list empty\n"); + mutex_unlock(&ctx->lock); mutex_unlock(&dma->lock); return; } @@ -1238,11 +1244,13 @@ void msm_jpegdma_isr_processing_done(struct msm_jpegdma_device *dma) src_buf = v4l2_m2m_next_src_buf(ctx->m2m_ctx); if (src_buf == NULL || dst_buf == NULL) { dev_err(ctx->jdma_device->dev, "Error, buffer list empty\n"); + mutex_unlock(&ctx->lock); mutex_unlock(&dma->lock); return; } msm_jpegdma_process_buffers(ctx, src_buf, dst_buf); } + mutex_unlock(&ctx->lock); } mutex_unlock(&dma->lock); } diff --git a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h index 0a9cab6e4322b..98ae6977d8960 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h +++ b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h @@ -254,6 +254,7 @@ struct msm_jpegdma_buf_handle { * @format_idx: Current format index. */ struct jpegdma_ctx { + struct mutex lock; struct msm_jpegdma_device *jdma_device; atomic_t active; struct completion completion; From c66fd21a87ccc88807968abc605dde39c7d6a45d Mon Sep 17 00:00:00 2001 From: Manu Gautam Date: Mon, 30 Jan 2017 10:29:01 +0530 Subject: [PATCH 0593/1015] USB: gadget: midi: Replace snd_card_free with snd_card_free_closed snd_card_free is a blocking function which waits for ALSA device to be closed before freeing it. This could be blocked forever if userspace has device node opened when midi function is unbound. Replace it with snd_card_free_when_closed which can be safely used if userspce has the device node opened. It is not a blocking function and defers freeing of the card until userspace closes the ALSA device. Change-Id: I6becc44dc0f0c1131f9b7dcd1e4a151d830dde2b CRs-fixed: 1116790 Signed-off-by: Manu Gautam --- drivers/usb/gadget/function/f_midi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c index a3d9831b71857..02800dce980c3 100644 --- a/drivers/usb/gadget/function/f_midi.c +++ b/drivers/usb/gadget/function/f_midi.c @@ -406,7 +406,7 @@ static void f_midi_unbind(struct usb_configuration *c, struct usb_function *f) card = midi->card; midi->card = NULL; if (card) - snd_card_free(card); + snd_card_free_when_closed(card); kfree(midi->id); midi->id = NULL; From aa998a3f73b230dad6d1d9d5086e7e7db9be8c04 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Wed, 11 Jan 2017 12:12:31 -0800 Subject: [PATCH 0594/1015] qseecom: improve input validatation for qseecom_send_service_cmd Make change to improve input validation on request and response buffers' address and length for qseecom_send_service_cmd. Change-Id: I047e3264333d767541e43b7dadd1727232fd48ef Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 152 ++++++++++++++++++++++++----------------- 1 file changed, 88 insertions(+), 64 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 8839e6ed99b52..f96fc1669a717 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -1,6 +1,6 @@ /*Qualcomm Secure Execution Environment Communicator (QSEECOM) driver * - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2631,11 +2631,6 @@ int __qseecom_process_rpmb_svc_cmd(struct qseecom_dev_handle *data_ptr, return -EINVAL; } - if ((!req_ptr->cmd_req_buf) || (!req_ptr->resp_buf)) { - pr_err("Invalid req/resp buffer, exiting\n"); - return -EINVAL; - } - /* Clients need to ensure req_buf is at base offset of shared buffer */ if ((uintptr_t)req_ptr->cmd_req_buf != data_ptr->client.user_virt_sb_base) { @@ -2643,15 +2638,11 @@ int __qseecom_process_rpmb_svc_cmd(struct qseecom_dev_handle *data_ptr, return -EINVAL; } - if (((uintptr_t)req_ptr->resp_buf < - data_ptr->client.user_virt_sb_base) || - ((uintptr_t)req_ptr->resp_buf >= - (data_ptr->client.user_virt_sb_base + - data_ptr->client.sb_length))){ - pr_err("response buffer address not within shared bufffer\n"); + if (data_ptr->client.sb_length < + sizeof(struct qseecom_rpmb_provision_key)) { + pr_err("shared buffer is too small to hold key type\n"); return -EINVAL; } - req_buf = data_ptr->client.sb_virt; send_svc_ireq_ptr->qsee_cmd_id = req_ptr->cmd_id; @@ -2678,36 +2669,6 @@ int __qseecom_process_fsm_key_svc_cmd(struct qseecom_dev_handle *data_ptr, return -EINVAL; } - if (((uintptr_t)req_ptr->cmd_req_buf < - data_ptr->client.user_virt_sb_base) || - ((uintptr_t)req_ptr->cmd_req_buf >= - (data_ptr->client.user_virt_sb_base + - data_ptr->client.sb_length))) { - pr_err("cmd buffer address not within shared bufffer\n"); - return -EINVAL; - } - - if (((uintptr_t)req_ptr->resp_buf < - data_ptr->client.user_virt_sb_base) || - ((uintptr_t)req_ptr->resp_buf >= - (data_ptr->client.user_virt_sb_base + - data_ptr->client.sb_length))){ - pr_err("response buffer address not within shared bufffer\n"); - return -EINVAL; - } - - if ((req_ptr->cmd_req_len == 0) || (req_ptr->resp_len == 0) || - req_ptr->cmd_req_len > data_ptr->client.sb_length || - req_ptr->resp_len > data_ptr->client.sb_length) { - pr_err("cmd buffer length or response buffer length not valid\n"); - return -EINVAL; - } - - if (req_ptr->cmd_req_len > UINT_MAX - req_ptr->resp_len) { - pr_err("Integer overflow detected in req_len & rsp_len, exiting now\n"); - return -EINVAL; - } - reqd_len_sb_in = req_ptr->cmd_req_len + req_ptr->resp_len; if (reqd_len_sb_in > data_ptr->client.sb_length) { pr_err("Not enough memory to fit cmd_buf and resp_buf. "); @@ -2729,28 +2690,11 @@ int __qseecom_process_fsm_key_svc_cmd(struct qseecom_dev_handle *data_ptr, return ret; } -static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, - void __user *argp) +static int __validate_send_service_cmd_inputs(struct qseecom_dev_handle *data, + struct qseecom_send_svc_cmd_req *req) { - int ret = 0; - struct qseecom_client_send_service_ireq send_svc_ireq; - struct qseecom_client_send_fsm_key_req send_fsm_key_svc_ireq; - struct qseecom_command_scm_resp resp; - struct qseecom_send_svc_cmd_req req; - void *send_req_ptr; - size_t req_buf_size; - - /*struct qseecom_command_scm_resp resp;*/ - - if (copy_from_user(&req, - (void __user *)argp, - sizeof(req))) { - pr_err("copy_from_user failed\n"); - return -EFAULT; - } - - if ((req.resp_buf == NULL) || (req.cmd_req_buf == NULL)) { - pr_err("cmd buffer or response buffer is null\n"); + if (!req || !req->resp_buf || !req->cmd_req_buf) { + pr_err("req or cmd buffer or response buffer is null\n"); return -EINVAL; } @@ -2774,6 +2718,86 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, return -EINVAL; } + if (((uintptr_t)req->cmd_req_buf < + data->client.user_virt_sb_base) || + ((uintptr_t)req->cmd_req_buf >= + (data->client.user_virt_sb_base + data->client.sb_length))) { + pr_err("cmd buffer address not within shared bufffer\n"); + return -EINVAL; + } + if (((uintptr_t)req->resp_buf < + data->client.user_virt_sb_base) || + ((uintptr_t)req->resp_buf >= + (data->client.user_virt_sb_base + data->client.sb_length))) { + pr_err("response buffer address not within shared bufffer\n"); + return -EINVAL; + } + if ((req->cmd_req_len == 0) || (req->resp_len == 0) || + (req->cmd_req_len > data->client.sb_length) || + (req->resp_len > data->client.sb_length)) { + pr_err("cmd buf length or response buf length not valid\n"); + return -EINVAL; + } + if (req->cmd_req_len > UINT_MAX - req->resp_len) { + pr_err("Integer overflow detected in req_len & rsp_len\n"); + return -EINVAL; + } + + if ((req->cmd_req_len + req->resp_len) > data->client.sb_length) { + pr_debug("Not enough memory to fit cmd_buf.\n"); + pr_debug("resp_buf. Required: %u, Available: %zu\n", + (req->cmd_req_len + req->resp_len), + data->client.sb_length); + return -ENOMEM; + } + if ((uintptr_t)req->cmd_req_buf > (ULONG_MAX - req->cmd_req_len)) { + pr_err("Integer overflow in req_len & cmd_req_buf\n"); + return -EINVAL; + } + if ((uintptr_t)req->resp_buf > (ULONG_MAX - req->resp_len)) { + pr_err("Integer overflow in resp_len & resp_buf\n"); + return -EINVAL; + } + if (data->client.user_virt_sb_base > + (ULONG_MAX - data->client.sb_length)) { + pr_err("Integer overflow in user_virt_sb_base & sb_length\n"); + return -EINVAL; + } + if ((((uintptr_t)req->cmd_req_buf + req->cmd_req_len) > + ((uintptr_t)data->client.user_virt_sb_base + + data->client.sb_length)) || + (((uintptr_t)req->resp_buf + req->resp_len) > + ((uintptr_t)data->client.user_virt_sb_base + + data->client.sb_length))) { + pr_err("cmd buf or resp buf is out of shared buffer region\n"); + return -EINVAL; + } + return 0; +} + +static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, + void __user *argp) +{ + int ret = 0; + struct qseecom_client_send_service_ireq send_svc_ireq; + struct qseecom_client_send_fsm_key_req send_fsm_key_svc_ireq; + struct qseecom_command_scm_resp resp; + struct qseecom_send_svc_cmd_req req; + void *send_req_ptr; + size_t req_buf_size; + + /*struct qseecom_command_scm_resp resp;*/ + + if (copy_from_user(&req, + (void __user *)argp, + sizeof(req))) { + pr_err("copy_from_user failed\n"); + return -EFAULT; + } + + if (__validate_send_service_cmd_inputs(data, &req)) + return -EINVAL; + data->type = QSEECOM_SECURE_SERVICE; switch (req.cmd_id) { From dfbd21576d88854bfd78139d5fdb51d6a2dfe62d Mon Sep 17 00:00:00 2001 From: Chandana Kishori Chiluveru Date: Tue, 24 Jan 2017 12:15:31 +0530 Subject: [PATCH 0595/1015] usb: gadget: Fix ep_flush issue on composition switch Currently if composition switch happens from BAM composition to NON BAM composition. USB driver tries to flush USB endpoint as part of composition switch, which is failing. Fix the issue by performing usb core soft reset before disabling bam for NON BAM composition. Change-Id: I60d008341ab2788b2eeae5cc4671bb97ef5b792d Signed-off-by: Chandana Kishori Chiluveru --- drivers/platform/msm/usb_bam.c | 3 ++- drivers/usb/gadget/ci13xxx_msm.c | 9 ++++++++- include/linux/usb/msm_hsusb.h | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/platform/msm/usb_bam.c b/drivers/platform/msm/usb_bam.c index 7683b200f8e6b..5641f451021b6 100644 --- a/drivers/platform/msm/usb_bam.c +++ b/drivers/platform/msm/usb_bam.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -3568,6 +3568,7 @@ bool msm_usb_bam_enable(enum usb_ctrl bam, bool bam_enable) log_event_dbg("%s: USB BAM Registered\n", __func__); msm_hw_bam_disable(0); } else { + msm_hw_soft_reset(); msm_hw_bam_disable(1); sps_device_reset(ctx->h_bam); sps_deregister_bam_device(ctx->h_bam); diff --git a/drivers/usb/gadget/ci13xxx_msm.c b/drivers/usb/gadget/ci13xxx_msm.c index 4fb191177ac17..6ba3c16ca3009 100644 --- a/drivers/usb/gadget/ci13xxx_msm.c +++ b/drivers/usb/gadget/ci13xxx_msm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -470,6 +470,13 @@ void ci13xxx_msm_shutdown(struct platform_device *pdev) ci13xxx_pullup(&_udc->gadget, 0); } +void msm_hw_soft_reset(void) +{ + struct ci13xxx *udc = _udc; + + hw_device_reset(udc); +} + void msm_hw_bam_disable(bool bam_disable) { u32 val; diff --git a/include/linux/usb/msm_hsusb.h b/include/linux/usb/msm_hsusb.h index 507ad809802e7..c6a75ff91e64e 100644 --- a/include/linux/usb/msm_hsusb.h +++ b/include/linux/usb/msm_hsusb.h @@ -2,7 +2,7 @@ * * Copyright (C) 2008 Google, Inc. * Author: Brian Swetland - * Copyright (c) 2009-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -654,9 +654,13 @@ static inline bool msm_usb_bam_enable(enum usb_ctrl ctrl, bool bam_enable) int msm_do_bam_disable_enable(enum usb_ctrl ctrl) { return true; } #endif #ifdef CONFIG_USB_CI13XXX_MSM +void msm_hw_soft_reset(void); void msm_hw_bam_disable(bool bam_disable); void msm_usb_irq_disable(bool disable); #else +static inline void msm_hw_soft_reset(void) +{ +} static inline void msm_hw_bam_disable(bool bam_disable) { } From aad0070487797863fb484474cbc895f9babdec91 Mon Sep 17 00:00:00 2001 From: Deepak Kumar Date: Tue, 3 Jan 2017 21:49:03 +0530 Subject: [PATCH 0596/1015] msm: kgsl: refcount irq to avoid racing against idle check Current irq handler clears the pending interrupt bits in interrupt status register before serving the interrupts. This leads to a race condition with the idle check which checks the interrupt status register to determine whether any interrupt is pending or not. As the interrupt status register is already cleared, idle check goes ahead and switch off the GPU clocks even when irq is yet to be served causing NOC errors. This change refcounts each irq handler call and uses this reference count to determine if any irq is still pending or not along with interrupt status register to avoid this race condition. Change-Id: I030d52c52055f836ea4c7519ce2d8db94a2a09a0 Signed-off-by: Deepak Kumar --- drivers/gpu/msm/adreno.c | 22 ++++++++++++++++++++-- drivers/gpu/msm/adreno.h | 4 +++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index d4767ab4e91f4..99654dcec4aed 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -591,6 +591,9 @@ static irqreturn_t adreno_irq_handler(struct kgsl_device *device) unsigned int status = 0, tmp, int_bit; int i; + atomic_inc(&adreno_dev->pending_irq_refcnt); + smp_mb__after_atomic(); + adreno_readreg(adreno_dev, ADRENO_REG_RBBM_INT_0_STATUS, &status); /* @@ -629,6 +632,10 @@ static irqreturn_t adreno_irq_handler(struct kgsl_device *device) adreno_writereg(adreno_dev, ADRENO_REG_RBBM_INT_CLEAR_CMD, int_bit); + smp_mb__before_atomic(); + atomic_dec(&adreno_dev->pending_irq_refcnt); + smp_mb__after_atomic(); + return ret; } @@ -2121,7 +2128,18 @@ inline unsigned int adreno_irq_pending(struct adreno_device *adreno_dev) adreno_readreg(adreno_dev, ADRENO_REG_RBBM_INT_0_STATUS, &status); - return (status & gpudev->irq->mask) ? 1 : 0; + /* + * IRQ handler clears the RBBM INT0 status register immediately + * entering the ISR before actually serving the interrupt because + * of this we can't rely only on RBBM INT0 status only. + * Use pending_irq_refcnt along with RBBM INT0 to correctly + * determine whether any IRQ is pending or not. + */ + if ((status & gpudev->irq->mask) || + atomic_read(&adreno_dev->pending_irq_refcnt)) + return 1; + else + return 0; } diff --git a/drivers/gpu/msm/adreno.h b/drivers/gpu/msm/adreno.h index 0a1629a6072af..bace2cb4cd07f 100644 --- a/drivers/gpu/msm/adreno.h +++ b/drivers/gpu/msm/adreno.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -346,6 +346,7 @@ struct adreno_gpu_core { * @ram_cycles_lo: Number of DDR clock cycles for the monitor session * @perfctr_pwr_lo: Number of cycles VBIF is stalled by DDR * @halt: Atomic variable to check whether the GPU is currently halted + * @pending_irq_refcnt: Atomic variable to keep track of running IRQ handlers * @ctx_d_debugfs: Context debugfs node * @pwrctrl_flag: Flag to hold adreno specific power attributes * @cmdbatch_profile_buffer: Memdesc holding the cmdbatch profiling buffer @@ -403,6 +404,7 @@ struct adreno_device { unsigned int starved_ram_lo; unsigned int perfctr_pwr_lo; atomic_t halt; + atomic_t pending_irq_refcnt; struct dentry *ctx_d_debugfs; unsigned long pwrctrl_flag; From 9429e9b069fa92f47bf30c819f44cf6618c8b5d8 Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Fri, 27 Jan 2017 14:40:13 +0530 Subject: [PATCH 0597/1015] MMC: core: sd: Check for return value of sd_card init In mmc_sd_power_restore, the return value of mmc_init_card was not checked and the return value was getting overwritten. Added changes to prevent loss of error information and return the error value to calling function of mmc_sd_power_restore. Change-Id: I170290cddb43e5ca729dc690e232e52b901ce228 Signed-off-by: Vijay Viswanath --- drivers/mmc/core/sd.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index ebf77c887bbd3..9ef31b0d8d458 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -1359,6 +1359,11 @@ static int mmc_sd_power_restore(struct mmc_host *host) mmc_claim_host(host); ret = mmc_sd_init_card(host, host->card->ocr, host->card); mmc_release_host(host); + if (ret) { + pr_err("%s: %s: mmc_sd_init_card_failed (%d)\n", + mmc_hostname(host), __func__, ret); + return ret; + } ret = mmc_resume_clk_scaling(host); if (ret) From 03e27ddfba24f64c15340177f96c36bd5d5cf71e Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Tue, 10 Jan 2017 17:19:19 +0530 Subject: [PATCH 0598/1015] MMC: core: Check for return value of card init In mmc_power_restore, the return value of mmc_init_card was not checked and the return value was getting overwritten. Added changes to prevent loss of error information and return the error value to calling function of mmc_power_restore. Change-Id: Ie7886f64a81553b2f8690790c5338f65ab7e6b8c Signed-off-by: Vijay Viswanath --- drivers/mmc/core/mmc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 9e2c4f46b2338..317c666fa436f 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -2735,6 +2735,11 @@ static int mmc_power_restore(struct mmc_host *host) } ret = mmc_init_card(host, host->card->ocr, host->card); + if (ret) { + pr_err("%s: %s: mmc_init_card failed (%d)\n", + mmc_hostname(host), __func__, ret); + return ret; + } ret = mmc_resume_clk_scaling(host); if (ret) From d5640ac5e7cb1d332e3d228656ce9d4d9f52dc22 Mon Sep 17 00:00:00 2001 From: Brahmaji K Date: Mon, 24 Oct 2016 20:28:18 +0530 Subject: [PATCH 0599/1015] crypto: ice: Fix NULL pointer exception in ice. While enabling ICE setup and on error conditions, the regulator is disabled. Before disabling the regulator, check if the regulator is up and able to access the registers of regulator. Change-Id: I94dd2b3e25444818f7bdf2f791f4fa9efaefce15 Signed-off-by: Brahmaji K --- drivers/crypto/msm/ice.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/crypto/msm/ice.c b/drivers/crypto/msm/ice.c index fb7590b6c7a62..9d9719fa2e54b 100644 --- a/drivers/crypto/msm/ice.c +++ b/drivers/crypto/msm/ice.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1601,7 +1601,18 @@ static int enable_ice_setup(struct ice_device *ice_dev) out_clocks: qcom_ice_enable_clocks(ice_dev, false); out_reg: - regulator_disable(ice_dev->reg); + if (ice_dev->is_regulator_available) { + if (qcom_ice_get_vreg(ice_dev)) { + pr_err("%s: Could not get regulator\n", __func__); + goto out; + } + ret = regulator_disable(ice_dev->reg); + if (ret) { + pr_err("%s:%pK: Could not disable regulator\n", + __func__, ice_dev); + goto out; + } + } out: return ret; } From 2f255b54e1b314c04917aee4c6979b3a882afcb0 Mon Sep 17 00:00:00 2001 From: Abdulla Anam Date: Wed, 25 Jan 2017 16:20:37 +0530 Subject: [PATCH 0600/1015] msm: vidc: Check for sanity of size while mapping buffers Fail map if dmabuffer size doesn't match expected buffersize. This is to avoid faults in firmware while accessing buffers. Change-Id: Ie41a93979696299a8b2fc3c548cb6574a21313db Signed-off-by: Abdulla Anam --- drivers/media/platform/msm/vidc/msm_smem.c | 22 ++++++++++++++++------ drivers/media/platform/msm/vidc/msm_vidc.c | 8 +++++--- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/msm/vidc/msm_smem.c b/drivers/media/platform/msm/vidc/msm_smem.c index 90047a608984e..c97b1e59a423e 100644 --- a/drivers/media/platform/msm/vidc/msm_smem.c +++ b/drivers/media/platform/msm/vidc/msm_smem.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -75,6 +75,14 @@ static int get_device_address(struct smem_client *smem_client, goto mem_map_failed; } + /* Check if the dmabuf size matches expected size */ + if (buf->size < *buffer_size) { + rc = -EINVAL; + dprintk(VIDC_ERR, + "Size mismatch! Dmabuf size: %zu Expected Size: %lu", + buf->size, *buffer_size); + goto mem_buf_size_mismatch; + } /* Prepare a dma buf for dma on the given device */ attach = dma_buf_attach(buf, cb->dev); if (IS_ERR_OR_NULL(attach)) { @@ -143,6 +151,7 @@ static int get_device_address(struct smem_client *smem_client, dma_buf_unmap_attachment(attach, table, DMA_BIDIRECTIONAL); mem_map_table_failed: dma_buf_detach(buf, attach); +mem_buf_size_mismatch: mem_buf_attach_failed: dma_buf_put(buf); mem_map_failed: @@ -193,12 +202,12 @@ static void put_device_address(struct smem_client *smem_client, } } -static int ion_user_to_kernel(struct smem_client *client, int fd, u32 offset, +static int ion_user_to_kernel(struct smem_client *client, int fd, u32 size, struct msm_smem *mem, enum hal_buffer buffer_type) { struct ion_handle *hndl; ion_phys_addr_t iova = 0; - unsigned long buffer_size = 0; + unsigned long buffer_size = size; int rc = 0; unsigned long align = SZ_4K; unsigned long ion_flags = 0; @@ -207,10 +216,11 @@ static int ion_user_to_kernel(struct smem_client *client, int fd, u32 offset, dprintk(VIDC_DBG, "%s ion handle: %pK\n", __func__, hndl); if (IS_ERR_OR_NULL(hndl)) { dprintk(VIDC_ERR, "Failed to get handle: %pK, %d, %d, %pK\n", - client, fd, offset, hndl); + client, fd, size, hndl); rc = -ENOMEM; goto fail_import_fd; } + mem->kvaddr = NULL; rc = ion_handle_get_flags(client->clnt, hndl, &ion_flags); if (rc) { @@ -430,7 +440,7 @@ static void ion_delete_client(struct smem_client *client) ion_client_destroy(client->clnt); } -struct msm_smem *msm_smem_user_to_kernel(void *clt, int fd, u32 offset, +struct msm_smem *msm_smem_user_to_kernel(void *clt, int fd, u32 size, enum hal_buffer buffer_type) { struct smem_client *client = clt; @@ -447,7 +457,7 @@ struct msm_smem *msm_smem_user_to_kernel(void *clt, int fd, u32 offset, } switch (client->mem_type) { case SMEM_ION: - rc = ion_user_to_kernel(clt, fd, offset, mem, buffer_type); + rc = ion_user_to_kernel(clt, fd, size, mem, buffer_type); break; default: dprintk(VIDC_ERR, "Mem type not supported\n"); diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c index c08d46fc81cc6..48b6e92b7d95c 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_vidc.c @@ -362,7 +362,7 @@ static struct msm_smem *map_buffer(struct msm_vidc_inst *inst, struct msm_smem *handle = NULL; handle = msm_comm_smem_user_to_kernel(inst, p->reserved[0], - p->reserved[1], + p->length, buffer_type); if (!handle) { dprintk(VIDC_ERR, @@ -438,8 +438,10 @@ int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b) goto exit; } - dprintk(VIDC_DBG, "[MAP] Create binfo = %pK fd = %d type = %d\n", - binfo, b->m.planes[0].reserved[0], b->type); + dprintk(VIDC_DBG, + "[MAP] Create binfo = %pK fd = %d size = %d type = %d\n", + binfo, b->m.planes[0].reserved[0], + b->m.planes[0].length, b->type); for (i = 0; i < b->length; ++i) { rc = 0; From 95076f65c22cd67ca99e9015c68b59c8a26eb44e Mon Sep 17 00:00:00 2001 From: Venkat Gopalakrishnan Date: Mon, 23 Jan 2017 17:34:52 -0800 Subject: [PATCH 0601/1015] scsi: ufs: check for err state when polling for doorbell As part of polling for doorbell during clk scaling, we need to make sure the host is in good state before polling. In case error handler is running at the same time, that could reset the clocks as part of recovery causing unclocked register access when polling for doorbell. Change-Id: I715932e9bffd51956d3a24aa2aec66c2c9a4652b Signed-off-by: Venkat Gopalakrishnan --- drivers/scsi/ufs/ufshcd.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 5445ba892170d..bbb3e068ad25a 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -3897,17 +3897,17 @@ int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba, u64 wait_timeout_us) ufshcd_hold_all(hba); spin_lock_irqsave(hba->host->host_lock, flags); - if (hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL) { - ret = -EBUSY; - goto out; - } - /* * Wait for all the outstanding tasks/transfer requests. * Verify by checking the doorbell registers are clear. */ start = ktime_get(); do { + if (hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL) { + ret = -EBUSY; + goto out; + } + tm_doorbell = ufshcd_readl(hba, REG_UTP_TASK_REQ_DOOR_BELL); tr_doorbell = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL); if (!tm_doorbell && !tr_doorbell) { From 5673cc45a6d4b7cf1623b94968328764dec15523 Mon Sep 17 00:00:00 2001 From: Lior Barenboim Date: Mon, 11 Jul 2016 16:17:03 +0300 Subject: [PATCH 0602/1015] QBT1000: copy qseecom handle to user when loading/unloading app QBT1000 provides IOCTLs for loading and unloading a QSEE app. In the input structure for these IOCTLs there is a pointer to a qseecom handle which serves as an output parameter for the IOCTLs. That is, the given handle (in client address space) should be set to a valid handle value on load, and should be set to 0 on unload. The driver was missing a proper copy_to_user() call for this handle, which sometimes resulted in unload not setting the handle to 0. Signed-off-by: Lior Barenboim Change-Id: I31f205afb1f9bf0b6243e3f20f54022525c93b28 --- drivers/soc/qcom/qbt1000.c | 59 +++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/drivers/soc/qcom/qbt1000.c b/drivers/soc/qcom/qbt1000.c index 135e2b834db30..71ad9d986ad6e 100644 --- a/drivers/soc/qcom/qbt1000.c +++ b/drivers/soc/qcom/qbt1000.c @@ -772,6 +772,7 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) case QBT1000_LOAD_APP: { struct qbt1000_app app; + struct qseecom_handle *app_handle; if (copy_from_user(&app, priv_arg, sizeof(app)) != 0) { @@ -782,8 +783,15 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) goto end; } + if (!app.app_handle) { + dev_err(drvdata->dev, "%s: LOAD app_handle is null\n", + __func__); + rc = -EINVAL; + goto end; + } + /* start the TZ app */ - rc = qseecom_start_app(app.app_handle, app.name, app.size); + rc = qseecom_start_app(&app_handle, app.name, app.size); if (rc == 0) { g_app_buf_size = app.size; } else { @@ -792,36 +800,79 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) goto end; } + /* copy the app handle to user */ + rc = copy_to_user((void __user *)app.app_handle, &app_handle, + sizeof(*app.app_handle)); + + if (rc != 0) { + dev_err(drvdata->dev, + "%s: Failed copy 2us LOAD rc:%d\n", + __func__, rc); + rc = -ENOMEM; + goto end; + } + break; } case QBT1000_UNLOAD_APP: { struct qbt1000_app app; + struct qseecom_handle *app_handle; if (copy_from_user(&app, priv_arg, sizeof(app)) != 0) { rc = -ENOMEM; dev_err(drvdata->dev, - "%s: Failed copy from user space-LOAD\n", + "%s: Failed copy from user space-UNLOAD\n", __func__); goto end; } - /* if the app hasn't been loaded already, return err */ if (!app.app_handle) { + dev_err(drvdata->dev, "%s: UNLOAD app_handle is null\n", + __func__); + rc = -EINVAL; + goto end; + } + + rc = copy_from_user(&app_handle, app.app_handle, + sizeof(app_handle)); + + if (rc != 0) { + dev_err(drvdata->dev, + "%s: Failed copy from user space-UNLOAD handle rc:%d\n", + __func__, rc); + rc = -ENOMEM; + goto end; + } + + /* if the app hasn't been loaded already, return err */ + if (!app_handle) { dev_err(drvdata->dev, "%s: App not loaded\n", __func__); rc = -EINVAL; goto end; } - rc = qseecom_shutdown_app(app.app_handle); + rc = qseecom_shutdown_app(&app_handle); if (rc != 0) { dev_err(drvdata->dev, "%s: App failed to shutdown\n", __func__); goto end; } + /* copy the app handle (should be null) to user */ + rc = copy_to_user((void __user *)app.app_handle, &app_handle, + sizeof(*app.app_handle)); + + if (rc != 0) { + dev_err(drvdata->dev, + "%s: Failed copy 2us UNLOAD rc:%d\n", + __func__, rc); + rc = -ENOMEM; + goto end; + } + break; } case QBT1000_SEND_TZCMD: From 6154ef09ae947941ca4187a9be4e2f7378f5a819 Mon Sep 17 00:00:00 2001 From: Lior Barenboim Date: Fri, 21 Oct 2016 20:23:42 -0700 Subject: [PATCH 0603/1015] QBT1000: check for null pointer before copying command A null command buffer will cause a null pointer crash. Check for it Change-Id: I37a0c8b9fe2c144fb4e75036509bf7ec07604ea7 Signed-off-by: Lior Barenboim --- drivers/soc/qcom/qbt1000.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/soc/qcom/qbt1000.c b/drivers/soc/qcom/qbt1000.c index 71ad9d986ad6e..961800e2f963f 100644 --- a/drivers/soc/qcom/qbt1000.c +++ b/drivers/soc/qcom/qbt1000.c @@ -913,6 +913,13 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) if (rc != 0) goto end; + if (!aligned_cmd) { + dev_err(drvdata->dev, "%s: Null command buffer\n", + __func__); + rc = -EINVAL; + goto end; + } + rc = copy_from_user(aligned_cmd, (void __user *)tzcmd.req_buf, tzcmd.req_buf_len); if (rc != 0) { From 34c3eeba420e23d003e04bded3e8415ed195fe94 Mon Sep 17 00:00:00 2001 From: Lior Barenboim Date: Wed, 9 Nov 2016 19:15:10 -0800 Subject: [PATCH 0604/1015] soc: qcom: fingerprint: keep QSEE handle in kernel space Move the QSEE handle from user space to kernel space. In addition, fix possible overflow when checking that the command and response buffers fit in the shared buffer Change-Id: I21b1866546a2825fe348a260c60e341bbe9600ea Signed-off-by: Lior Barenboim Signed-off-by: Biswajit Paul --- drivers/soc/qcom/qbt1000.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/drivers/soc/qcom/qbt1000.c b/drivers/soc/qcom/qbt1000.c index 961800e2f963f..4fbff8c87db80 100644 --- a/drivers/soc/qcom/qbt1000.c +++ b/drivers/soc/qcom/qbt1000.c @@ -86,6 +86,7 @@ struct qbt1000_drvdata { uint32_t ssc_spi_port; uint32_t ssc_spi_port_slave_index; struct wakeup_source w_lock; + struct qseecom_handle *app_handle; }; #define W_LOCK_DELAY_MS (2000) @@ -110,7 +111,8 @@ static int get_cmd_rsp_buffers(struct qseecom_handle *hdl, *cmd_len = ALIGN(*cmd_len, 64); *rsp_len = ALIGN(*rsp_len, 64); - if ((*rsp_len + *cmd_len) > g_app_buf_size) + if (((uint64_t)*rsp_len + (uint64_t)*cmd_len) + > (uint64_t)g_app_buf_size) return -ENOMEM; *cmd = hdl->sbuf; @@ -790,8 +792,20 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) goto end; } + if (drvdata->app_handle) { + dev_err(drvdata->dev, "%s: LOAD app already loaded, unloading first\n", + __func__); + rc = qseecom_shutdown_app(&drvdata->app_handle); + if (rc != 0) { + dev_err(drvdata->dev, "%s: LOAD current app failed to shutdown\n", + __func__); + goto end; + } + } + /* start the TZ app */ - rc = qseecom_start_app(&app_handle, app.name, app.size); + rc = qseecom_start_app(&drvdata->app_handle, + app.name, app.size); if (rc == 0) { g_app_buf_size = app.size; } else { @@ -800,7 +814,9 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) goto end; } - /* copy the app handle to user */ + /* copy a fake app handle to user */ + app_handle = drvdata->app_handle ? + (struct qseecom_handle *)123456 : 0; rc = copy_to_user((void __user *)app.app_handle, &app_handle, sizeof(*app.app_handle)); @@ -817,7 +833,7 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) case QBT1000_UNLOAD_APP: { struct qbt1000_app app; - struct qseecom_handle *app_handle; + struct qseecom_handle *app_handle = 0; if (copy_from_user(&app, priv_arg, sizeof(app)) != 0) { @@ -847,14 +863,14 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* if the app hasn't been loaded already, return err */ - if (!app_handle) { + if (!drvdata->app_handle) { dev_err(drvdata->dev, "%s: App not loaded\n", __func__); rc = -EINVAL; goto end; } - rc = qseecom_shutdown_app(&app_handle); + rc = qseecom_shutdown_app(&drvdata->app_handle); if (rc != 0) { dev_err(drvdata->dev, "%s: App failed to shutdown\n", __func__); @@ -895,7 +911,7 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* if the app hasn't been loaded already, return err */ - if (!tzcmd.app_handle) { + if (!drvdata->app_handle) { dev_err(drvdata->dev, "%s: App not loaded\n", __func__); rc = -EINVAL; @@ -905,7 +921,7 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) /* init command and response buffers and align lengths */ aligned_cmd_len = tzcmd.req_buf_len; aligned_rsp_len = tzcmd.rsp_buf_len; - rc = get_cmd_rsp_buffers(tzcmd.app_handle, + rc = get_cmd_rsp_buffers(drvdata->app_handle, (void **)&aligned_cmd, &aligned_cmd_len, (void **)&aligned_rsp, @@ -930,7 +946,7 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* send cmd to TZ */ - rc = qseecom_send_command(tzcmd.app_handle, + rc = qseecom_send_command(drvdata->app_handle, aligned_cmd, aligned_cmd_len, aligned_rsp, From 5ff829c56ea27f1420808e41d660ec0c270c3b3f Mon Sep 17 00:00:00 2001 From: Yeleswarapu Nagaradhesh Date: Tue, 31 Jan 2017 11:44:12 +0530 Subject: [PATCH 0605/1015] ASoc: wcd-mbhc: correct handling of electrical interrupts When 5 pole headset is removed, electrical interrupts are disabled but intr_status bit is not set properly. Due to which interrupts are not enabled when extension cable is connected. So, corrrect handling on electrical interrupts. CRs-Fixed: 1111164 Change-Id: I6d1c667ae6c44e7f0767df3e5450e99614717cc6 Signed-off-by: Yeleswarapu Nagaradhesh --- sound/soc/codecs/wcd-mbhc-v2.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/sound/soc/codecs/wcd-mbhc-v2.c b/sound/soc/codecs/wcd-mbhc-v2.c index 43ea0351699db..9c1cb21c7f005 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.c +++ b/sound/soc/codecs/wcd-mbhc-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1593,12 +1593,8 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); wcd_mbhc_report_plug(mbhc, 0, SND_JACK_LINEOUT); } else if (mbhc->current_plug == MBHC_PLUG_TYPE_ANC_HEADPHONE) { - mbhc->mbhc_cb->irq_control(codec, - mbhc->intr_ids->mbhc_hs_rem_intr, - false); - mbhc->mbhc_cb->irq_control(codec, - mbhc->intr_ids->mbhc_hs_ins_intr, - false); + wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, false); + wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, 0); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); From 7e50889f280fab5c72735d778dc517e40db7049d Mon Sep 17 00:00:00 2001 From: Ramesh V Date: Wed, 18 Jan 2017 15:54:01 +0530 Subject: [PATCH 0606/1015] msm: camera: avoid race condition while configuring ping pong buffer Issue) Deadlock occur when cfg_ping_pong function called from two different cores, since one core is trying to acquire the lock for vfe1 which is hold by anoter core and another core is trying to acquire the vfe0 lock hold by actual core, which leads deadlock. Resolution) To avoid this will make a common lock for both vfe. Change-Id: I2d2480154f1c9e00910620e1a749bb49b5eca955 Signed-off-by: Ramesh V --- drivers/media/platform/msm/camera_v2/isp/msm_isp.c | 3 ++- drivers/media/platform/msm/camera_v2/isp/msm_isp.h | 1 + .../platform/msm/camera_v2/isp/msm_isp_axi_util.c | 12 ++++-------- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp.c index d3c2d77b01077..608805569f28b 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -499,6 +499,7 @@ static int vfe_probe(struct platform_device *pdev) vfe_parent_dev->common_sd->common_data = &vfe_common_data; memset(&vfe_common_data, 0, sizeof(vfe_common_data)); spin_lock_init(&vfe_common_data.common_dev_data_lock); + spin_lock_init(&vfe_common_data.common_dev_axi_lock); of_property_read_u32(pdev->dev.of_node, "num_child", &vfe_parent_dev->num_hw_sd); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h index da09b8379f59c..63a36a1b23989 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h @@ -679,6 +679,7 @@ struct master_slave_resource_info { struct msm_vfe_common_dev_data { spinlock_t common_dev_data_lock; + spinlock_t common_dev_axi_lock; struct dual_vfe_resource *dual_vfe_res; struct master_slave_resource_info ms_resource; }; diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index e5bbf7e9f2620..f0ce8958a6a4a 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -1850,10 +1850,8 @@ static int msm_isp_cfg_ping_pong_address(struct vfe_device *vfe_dev, for (vfe_id = 0; vfe_id < MAX_VFE; vfe_id++) { if (vfe_id != vfe_dev->pdev->id) spin_lock_irqsave( - &dual_vfe_res-> - axi_data[vfe_id]-> - stream_info[stream_idx]. - lock, flags); + &vfe_dev->common_data-> + common_dev_axi_lock, flags); if (buf) vfe_dev->hw_info->vfe_ops.axi_ops. @@ -1882,10 +1880,8 @@ static int msm_isp_cfg_ping_pong_address(struct vfe_device *vfe_dev, } if (vfe_id != vfe_dev->pdev->id) spin_unlock_irqrestore( - &dual_vfe_res-> - axi_data[vfe_id]-> - stream_info[stream_idx]. - lock, flags); + &vfe_dev->common_data-> + common_dev_axi_lock, flags); } } else { if (buf) From 2ac005475b4a3210adc71cd199ff6349b77630ef Mon Sep 17 00:00:00 2001 From: Vevek Venkatesan Date: Fri, 23 Dec 2016 11:34:32 +0530 Subject: [PATCH 0607/1015] input: misc: fix heap overflow issue in hbtp_input.c Add the boundary check for ABS code before setting ABS params, to avoid heap overflow. Change-Id: I6aad9916c92d2f775632406374dbb803063148de Signed-off-by: Vevek Venkatesan --- drivers/input/misc/hbtp_input.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/input/misc/hbtp_input.c b/drivers/input/misc/hbtp_input.c index adca5e8bddde7..ee9ded91cded9 100644 --- a/drivers/input/misc/hbtp_input.c +++ b/drivers/input/misc/hbtp_input.c @@ -415,9 +415,13 @@ static int hbtp_input_create_input_dev(struct hbtp_input_absinfo *absinfo) input_mt_init_slots(input_dev, HBTP_MAX_FINGER, 0); for (i = 0; i <= ABS_MT_LAST - ABS_MT_FIRST; i++) { abs = absinfo + i; - if (abs->active) - input_set_abs_params(input_dev, abs->code, + if (abs->active) { + if (abs->code >= 0 && abs->code < ABS_CNT) + input_set_abs_params(input_dev, abs->code, abs->minimum, abs->maximum, 0, 0); + else + pr_err("%s: ABS code out of bound\n", __func__); + } } if (hbtp->override_disp_coords) { From 2046ec837525257c13ec171b78cbda608038e62b Mon Sep 17 00:00:00 2001 From: Ghanim Fodi Date: Tue, 24 Jan 2017 15:42:30 +0200 Subject: [PATCH 0608/1015] msm: ipa3: Validate IPA and GSI firmwares before loading IPA and GSI firmwares are saved on the file-system as an ELF file. IPA driver extracts the firmwares and load them during driver initialization. This change adds validation steps to each firmware before loading: load addresses, memory sizes, firmware sizes and more... Change-Id: I7d7f66e8e8a9ca0efae08b1e57b25ae4e44cc5bb CRs-fixed: 1110522 Signed-off-by: Ghanim Fodi --- drivers/platform/msm/gsi/gsi.c | 10 + drivers/platform/msm/gsi/gsi_reg.h | 4 +- drivers/platform/msm/ipa/ipa_v3/ipa.c | 2 +- drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 2 +- drivers/platform/msm/ipa/ipa_v3/ipa_utils.c | 187 +++++++++++++----- .../platform/msm/ipa/ipa_v3/ipahal/ipahal.c | 18 +- .../platform/msm/ipa/ipa_v3/ipahal/ipahal.h | 12 +- .../platform/msm/ipa/ipa_v3/ipahal/ipahal_i.h | 6 +- .../msm/ipa/ipa_v3/ipahal/ipahal_reg.c | 6 + .../msm/ipa/ipa_v3/ipahal/ipahal_reg.h | 4 +- include/linux/msm_gsi.h | 21 +- 11 files changed, 215 insertions(+), 57 deletions(-) diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index a858aac57acf9..194f1bebad336 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -2568,6 +2568,16 @@ int gsi_enable_fw(phys_addr_t gsi_base_addr, u32 gsi_size) } EXPORT_SYMBOL(gsi_enable_fw); +void gsi_get_inst_ram_offset_and_size(unsigned long *base_offset, + unsigned long *size) +{ + if (base_offset) + *base_offset = GSI_GSI_INST_RAM_BASE_OFFS; + if (size) + *size = GSI_GSI_INST_RAM_SIZE; +} +EXPORT_SYMBOL(gsi_get_inst_ram_offset_and_size); + static int msm_gsi_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; diff --git a/drivers/platform/msm/gsi/gsi_reg.h b/drivers/platform/msm/gsi/gsi_reg.h index 36a74105b4901..e0e51bb52fe8f 100644 --- a/drivers/platform/msm/gsi/gsi_reg.h +++ b/drivers/platform/msm/gsi/gsi_reg.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1687,5 +1687,7 @@ #define GSI_INTER_EE_n_SRC_EV_CH_IRQ_CLR_EV_CH_BIT_MAP_BMSK 0xffffffff #define GSI_INTER_EE_n_SRC_EV_CH_IRQ_CLR_EV_CH_BIT_MAP_SHFT 0x0 +#define GSI_GSI_INST_RAM_BASE_OFFS 0x4000 +#define GSI_GSI_INST_RAM_SIZE 0x4000 #endif /* __GSI_REG_H__ */ diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 63870cf4d2012..e5e1f7250b860 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -4066,7 +4066,7 @@ static int ipa3_trigger_fw_loading_mdms(void) IPADBG("FWs are available for loading\n"); - result = ipa3_load_fws(fw); + result = ipa3_load_fws(fw, ipa3_res.transport_mem_base); if (result) { IPAERR("IPA FWs loading has failed\n"); release_firmware(fw); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index 50386a6b0770d..4dbb908d09b6a 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -2005,7 +2005,7 @@ int ipa3_uc_panic_notifier(struct notifier_block *this, unsigned long event, void *ptr); void ipa3_inc_acquire_wakelock(void); void ipa3_dec_release_wakelock(void); -int ipa3_load_fws(const struct firmware *firmware); +int ipa3_load_fws(const struct firmware *firmware, phys_addr_t gsi_mem_base); int ipa3_register_ipa_ready_cb(void (*ipa_ready_cb)(void *), void *user_data); const char *ipa_hw_error_str(enum ipa3_hw_errors err_type); int ipa_gsi_ch20_wa(void); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 2f0052da7e1ce..632d9c1988e28 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -5262,74 +5262,163 @@ int ipa3_generate_eq_from_hw_rule( return 0; } +static int ipa3_load_single_fw(const struct firmware *firmware, + const struct elf32_phdr *phdr) +{ + uint32_t *fw_mem_base; + int index; + const uint32_t *elf_data_ptr; + + if (phdr->p_offset > firmware->size) { + IPAERR("Invalid ELF: offset=%u is beyond elf_size=%zu\n", + phdr->p_offset, firmware->size); + return -EINVAL; + } + if ((firmware->size - phdr->p_offset) < phdr->p_filesz) { + IPAERR("Invalid ELF: offset=%u filesz=%u elf_size=%zu\n", + phdr->p_offset, phdr->p_filesz, firmware->size); + return -EINVAL; + } + + if (phdr->p_memsz % sizeof(uint32_t)) { + IPAERR("FW mem size %u doesn't align to 32bit\n", + phdr->p_memsz); + return -EFAULT; + } + + if (phdr->p_filesz > phdr->p_memsz) { + IPAERR("FW image too big src_size=%u dst_size=%u\n", + phdr->p_filesz, phdr->p_memsz); + return -EFAULT; + } + + fw_mem_base = ioremap(phdr->p_vaddr, phdr->p_memsz); + if (!fw_mem_base) { + IPAERR("Failed to map 0x%x for the size of %u\n", + phdr->p_vaddr, phdr->p_memsz); + return -ENOMEM; + } + + /* Set the entire region to 0s */ + memset(fw_mem_base, 0, phdr->p_memsz); + + elf_data_ptr = (uint32_t *)(firmware->data + phdr->p_offset); + + /* Write the FW */ + for (index = 0; index < phdr->p_filesz/sizeof(uint32_t); index++) { + writel_relaxed(*elf_data_ptr, &fw_mem_base[index]); + elf_data_ptr++; + } + + iounmap(fw_mem_base); + + return 0; +} + /** * ipa3_load_fws() - Load the IPAv3 FWs into IPA&GSI SRAM. * * @firmware: Structure which contains the FW data from the user space. + * @gsi_mem_base: GSI base address * * Return value: 0 on success, negative otherwise * */ -int ipa3_load_fws(const struct firmware *firmware) +int ipa3_load_fws(const struct firmware *firmware, phys_addr_t gsi_mem_base) { const struct elf32_hdr *ehdr; const struct elf32_phdr *phdr; - const uint8_t *elf_phdr_ptr; - uint32_t *elf_data_ptr; - int phdr_idx, index; - uint32_t *fw_mem_base; - - ehdr = (struct elf32_hdr *) firmware->data; - - elf_phdr_ptr = firmware->data + sizeof(*ehdr); + unsigned long gsi_iram_ofst; + unsigned long gsi_iram_size; + phys_addr_t ipa_reg_mem_base; + u32 ipa_reg_ofst; + int rc; + + if (!gsi_mem_base) { + IPAERR("Invalid GSI base address\n"); + return -EINVAL; + } - for (phdr_idx = 0; phdr_idx < ehdr->e_phnum; phdr_idx++) { - /* - * The ELF program header will contain the starting - * address to which the firmware needs to copied. - */ - phdr = (struct elf32_phdr *)elf_phdr_ptr; + ipa_assert_on(!firmware); + /* One program header per FW image: GSI, DPS and HPS */ + if (firmware->size < (sizeof(*ehdr) + 3 * sizeof(*phdr))) { + IPAERR("Missing ELF and Program headers firmware size=%zu\n", + firmware->size); + return -EINVAL; + } - /* - * p_vaddr will contain the starting address to which the - * FW needs to be loaded. - * p_memsz will contain the size of the IRAM. - * p_filesz will contain the size of the FW image. - */ - fw_mem_base = ioremap(phdr->p_vaddr, phdr->p_memsz); - if (!fw_mem_base) { - IPAERR("Failed to map 0x%x for the size of %u\n", - phdr->p_vaddr, phdr->p_memsz); - return -ENOMEM; - } + ehdr = (struct elf32_hdr *) firmware->data; + ipa_assert_on(!ehdr); + if (ehdr->e_phnum != 3) { + IPAERR("Unexpected number of ELF program headers\n"); + return -EINVAL; + } + phdr = (struct elf32_phdr *)(firmware->data + sizeof(*ehdr)); - /* Set the entire region to 0s */ - memset(fw_mem_base, 0, phdr->p_memsz); + /* + * Each ELF program header represents a FW image and contains: + * p_vaddr : The starting address to which the FW needs to loaded. + * p_memsz : The size of the IRAM (where the image loaded) + * p_filesz: The size of the FW image embedded inside the ELF + * p_offset: Absolute offset to the image from the head of the ELF + */ - /* - * p_offset will contain and absolute offset from the beginning - * of the ELF file. - */ - elf_data_ptr = (uint32_t *) - ((uint8_t *)firmware->data + phdr->p_offset); + /* Load GSI FW image */ + gsi_get_inst_ram_offset_and_size(&gsi_iram_ofst, &gsi_iram_size); + if (phdr->p_vaddr != (gsi_mem_base + gsi_iram_ofst)) { + IPAERR( + "Invalid GSI FW img load addr vaddr=0x%x gsi_mem_base=%pa gsi_iram_ofst=0x%lx\n" + , phdr->p_vaddr, &gsi_mem_base, gsi_iram_ofst); + return -EINVAL; + } + if (phdr->p_memsz > gsi_iram_size) { + IPAERR("Invalid GSI FW img size memsz=%d gsi_iram_size=%lu\n", + phdr->p_memsz, gsi_iram_size); + return -EINVAL; + } + rc = ipa3_load_single_fw(firmware, phdr); + if (rc) + return rc; - if (phdr->p_memsz % sizeof(uint32_t)) { - IPAERR("FW size %u doesn't align to 32bit\n", - phdr->p_memsz); - return -EFAULT; - } + phdr++; + ipa_reg_mem_base = ipa3_ctx->ipa_wrapper_base + ipahal_get_reg_base(); - /* Write the FW */ - for (index = 0; index < phdr->p_filesz/sizeof(uint32_t); - index++) { - writel_relaxed(*elf_data_ptr, &fw_mem_base[index]); - elf_data_ptr++; - } + /* Load IPA DPS FW image */ + ipa_reg_ofst = ipahal_get_reg_ofst(IPA_DPS_SEQUENCER_FIRST); + if (phdr->p_vaddr != (ipa_reg_mem_base + ipa_reg_ofst)) { + IPAERR( + "Invalid IPA DPS img load addr vaddr=0x%x ipa_reg_mem_base=%pa ipa_reg_ofst=%u\n" + , phdr->p_vaddr, &ipa_reg_mem_base, ipa_reg_ofst); + return -EINVAL; + } + if (phdr->p_memsz > ipahal_get_dps_img_mem_size()) { + IPAERR("Invalid IPA DPS img size memsz=%d dps_mem_size=%u\n", + phdr->p_memsz, ipahal_get_dps_img_mem_size()); + return -EINVAL; + } + rc = ipa3_load_single_fw(firmware, phdr); + if (rc) + return rc; - iounmap(fw_mem_base); + phdr++; - elf_phdr_ptr = elf_phdr_ptr + sizeof(*phdr); + /* Load IPA HPS FW image */ + ipa_reg_ofst = ipahal_get_reg_ofst(IPA_HPS_SEQUENCER_FIRST); + if (phdr->p_vaddr != (ipa_reg_mem_base + ipa_reg_ofst)) { + IPAERR( + "Invalid IPA HPS img load addr vaddr=0x%x ipa_reg_mem_base=%pa ipa_reg_ofst=%u\n" + , phdr->p_vaddr, &ipa_reg_mem_base, ipa_reg_ofst); + return -EINVAL; + } + if (phdr->p_memsz > ipahal_get_hps_img_mem_size()) { + IPAERR("Invalid IPA HPS img size memsz=%d dps_mem_size=%u\n", + phdr->p_memsz, ipahal_get_hps_img_mem_size()); + return -EINVAL; } - IPADBG("IPA FWs (GSI FW, HPS and DPS) were loaded\n"); + rc = ipa3_load_single_fw(firmware, phdr); + if (rc) + return rc; + + IPADBG("IPA FWs (GSI FW, DPS and HPS) loaded successfully\n"); return 0; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c index aca6aedfa6e53..585a2db9146c6 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1253,6 +1253,22 @@ int ipahal_get_proc_ctx_needed_len(enum ipa_hdr_proc_type type) return res; } +/* + * Get IPA Data Processing Star image memory size at IPA SRAM + */ +u32 ipahal_get_dps_img_mem_size(void) +{ + return IPA_HW_DPS_IMG_MEM_SIZE_V3_0; +} + +/* + * Get IPA Header Processing Star image memory size at IPA SRAM + */ +u32 ipahal_get_hps_img_mem_size(void) +{ + return IPA_HW_HPS_IMG_MEM_SIZE_V3_0; +} + int ipahal_init(enum ipa_hw_type ipa_hw_type, void __iomem *base) { int result; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h index 00b205807b477..746bc30fc1090 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -634,6 +634,16 @@ void ipahal_cp_proc_ctx_to_hw_buff(enum ipa_hdr_proc_type type, */ int ipahal_get_proc_ctx_needed_len(enum ipa_hdr_proc_type type); +/* + * Get IPA Data Processing Star image memory size at IPA SRAM + */ +u32 ipahal_get_dps_img_mem_size(void); + +/* + * Get IPA Header Processing Star image memory size at IPA SRAM + */ +u32 ipahal_get_hps_img_mem_size(void); + int ipahal_init(enum ipa_hw_type ipa_hw_type, void __iomem *base); void ipahal_destroy(void); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_i.h b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_i.h index 6a22240e951b9..5f02b4df589f5 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_i.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -542,4 +542,8 @@ struct ipa_hw_hdr_proc_ctx_add_hdr_cmd_seq { struct ipa_hw_hdr_proc_ctx_tlv end; }; +/* IPA HW DPS/HPS image memory sizes */ +#define IPA_HW_DPS_IMG_MEM_SIZE_V3_0 128 +#define IPA_HW_HPS_IMG_MEM_SIZE_V3_0 320 + #endif /* _IPAHAL_I_H_ */ diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c index 2d2ca2831fb9b..3262e7548802b 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c @@ -1037,6 +1037,12 @@ static struct ipahal_reg_obj ipahal_reg_objs[IPA_HW_MAX][IPA_REG_MAX] = { [IPA_HW_v3_0][IPA_QSB_MAX_READS] = { ipareg_construct_qsb_max_reads, ipareg_parse_dummy, 0x00000078, 0}, + [IPA_HW_v3_0][IPA_DPS_SEQUENCER_FIRST] = { + ipareg_construct_dummy, ipareg_parse_dummy, + 0x0001e000, 0}, + [IPA_HW_v3_0][IPA_HPS_SEQUENCER_FIRST] = { + ipareg_construct_dummy, ipareg_parse_dummy, + 0x0001e080, 0}, /* IPAv3.1 */ diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h index f1acab2e2db6e..38e2236a12dfc 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -83,6 +83,8 @@ enum ipahal_reg_name { IPA_RX_HPS_CLIENTS_MAX_DEPTH_1, IPA_QSB_MAX_WRITES, IPA_QSB_MAX_READS, + IPA_DPS_SEQUENCER_FIRST, + IPA_HPS_SEQUENCER_FIRST, IPA_REG_MAX, }; diff --git a/include/linux/msm_gsi.h b/include/linux/msm_gsi.h index c95a529b029bf..95ad6f96bcd05 100644 --- a/include/linux/msm_gsi.h +++ b/include/linux/msm_gsi.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1030,6 +1030,19 @@ int gsi_configure_regs(phys_addr_t gsi_base_addr, u32 gsi_size, */ int gsi_enable_fw(phys_addr_t gsi_base_addr, u32 gsi_size); +/** + * gsi_get_inst_ram_offset_and_size - Peripheral should call this function + * to get instruction RAM base address offset and size. Peripheral typically + * uses this info to load GSI FW into the IRAM. + * + * @base_offset:[OUT] - IRAM base offset address + * @size: [OUT] - IRAM size + + * @Return none + */ +void gsi_get_inst_ram_offset_and_size(unsigned long *base_offset, + unsigned long *size); + /* * Here is a typical sequence of calls * @@ -1217,9 +1230,15 @@ static inline int gsi_configure_regs(phys_addr_t gsi_base_addr, u32 gsi_size, { return -GSI_STATUS_UNSUPPORTED_OP; } + static inline int gsi_enable_fw(phys_addr_t gsi_base_addr, u32 gsi_size) { return -GSI_STATUS_UNSUPPORTED_OP; } + +static inline void gsi_get_inst_ram_offset_and_size(unsigned long *base_offset, + unsigned long *size) +{ +} #endif #endif From 9a9f38b42436c36e64e7baf9682f31caf38b6817 Mon Sep 17 00:00:00 2001 From: Krishna Chaitanya Devarakonda Date: Mon, 2 Jan 2017 20:36:59 +0530 Subject: [PATCH 0609/1015] msm: mdss: Avoid unnecessary warnings during pipe unstaging In some cases, when the pipe is being unstaged from right mixer, some unnecessary processing is done and warning messages are being printed. This can be avoided by updating the right stage information after unstaging the pipe. Change-Id: Ibeaa1c4bee29d7ac3ae34140bea8d5b7468dbc85 Signed-off-by: Krishna Chaitanya Devarakonda --- drivers/video/msm/mdss/mdss_mdp_layer.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_layer.c b/drivers/video/msm/mdss/mdss_mdp_layer.c index 20031e0400d3c..2aaeed8324f61 100644 --- a/drivers/video/msm/mdss/mdss_mdp_layer.c +++ b/drivers/video/msm/mdss/mdss_mdp_layer.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -467,6 +467,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, int ret = 0; u32 left_lm_w = left_lm_w_from_mfd(mfd); u32 flags; + bool is_right_blend = false; struct mdss_mdp_mixer *mixer = NULL; struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); @@ -574,6 +575,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, * staging, same pipe will be stagged on both layer mixers. */ if (mdata->has_src_split) { + is_right_blend = pipe->is_right_blend; if (left_blend_pipe) { if (pipe->priority <= left_blend_pipe->priority) { pr_err("priority limitation. left:%d right%d\n", @@ -583,7 +585,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, goto end; } else { pr_debug("pipe%d is a right_pipe\n", pipe->num); - pipe->is_right_blend = true; + is_right_blend = true; } } else if (pipe->is_right_blend) { /* @@ -592,7 +594,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, */ mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_right); - pipe->is_right_blend = false; + is_right_blend = false; } if (is_split_lm(mfd) && __layer_needs_src_split(layer)) { @@ -618,6 +620,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, } pipe->src_split_req = false; } + pipe->is_right_blend = is_right_blend; } pipe->multirect.mode = vinfo->multirect.mode; From ee3a4efaded4501fe3135f5e88913a053ee2e999 Mon Sep 17 00:00:00 2001 From: Sathish Ambley Date: Wed, 25 Jan 2017 10:51:55 -0800 Subject: [PATCH 0610/1015] msm: ADSPRPC: Check for buffer overflow condition The buffer length that is being passed could result in overflow condition causing invalid memory to be accessed. Change-Id: I3e23f31b8cb61f8e77d09a39fab4a2d4c222cf25 Signed-off-by: Sathish Ambley --- drivers/char/adsprpc.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index e141926181a7f..03157619947b2 100644 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -706,9 +706,9 @@ static int overlap_ptr_cmp(const void *a, const void *b) return st == 0 ? ed : st; } -static void context_build_overlap(struct smq_invoke_ctx *ctx) +static int context_build_overlap(struct smq_invoke_ctx *ctx) { - int i; + int i, err = 0; remote_arg_t *lpra = ctx->lpra; int inbufs = REMOTE_SCALARS_INBUFS(ctx->sc); int outbufs = REMOTE_SCALARS_OUTBUFS(ctx->sc); @@ -717,6 +717,11 @@ static void context_build_overlap(struct smq_invoke_ctx *ctx) for (i = 0; i < nbufs; ++i) { ctx->overs[i].start = (uintptr_t)lpra[i].buf.pv; ctx->overs[i].end = ctx->overs[i].start + lpra[i].buf.len; + if (lpra[i].buf.len) { + VERIFY(err, ctx->overs[i].end > ctx->overs[i].start); + if (err) + goto bail; + } ctx->overs[i].raix = i; ctx->overps[i] = &ctx->overs[i]; } @@ -742,6 +747,8 @@ static void context_build_overlap(struct smq_invoke_ctx *ctx) max = *ctx->overps[i]; } } +bail: + return err; } #define K_COPY_FROM_USER(err, kernel, dst, src, size) \ @@ -805,8 +812,11 @@ static int context_alloc(struct fastrpc_file *fl, uint32_t kernel, goto bail; } ctx->sc = invoke->sc; - if (bufs) - context_build_overlap(ctx); + if (bufs) { + VERIFY(err, 0 == context_build_overlap(ctx)); + if (err) + goto bail; + } ctx->retval = -1; ctx->pid = current->pid; ctx->tgid = current->tgid; From 8567ef3176041511e0b3c7d0d22ce3e3676bc3bf Mon Sep 17 00:00:00 2001 From: Shiraz Hashim Date: Thu, 3 Nov 2016 15:24:35 +0530 Subject: [PATCH 0611/1015] mm: cma: check the max limit for cma allocation CMA allocation request size is represented by size_t that gets truncated when same is passed as int to bitmap_find_next_zero_area_off. We observe that during fuzz testing when cma allocation request is too high, bitmap_find_next_zero_area_off still returns success due to the truncation. This leads to kernel crash, as subsequent code assumes that requested memory is available. Fail cma allocation in case the request breaches the corresponding cma region size. Change-Id: Ieb5fd8429726efd7686387bccb55952fb053280a Signed-off-by: Shiraz Hashim --- mm/cma.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mm/cma.c b/mm/cma.c index e1218e26656cd..878c54bb0813a 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -367,6 +367,9 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align) bitmap_maxno = cma_bitmap_maxno(cma); bitmap_count = cma_bitmap_pages_to_bits(cma, count); + if (bitmap_count > bitmap_maxno) + return NULL; + for (;;) { mutex_lock(&cma->lock); bitmap_no = bitmap_find_next_zero_area(cma->bitmap, From cda4910812738ce797bc247fafa63a75f43a6262 Mon Sep 17 00:00:00 2001 From: Harshdeep Dhatt Date: Thu, 3 Nov 2016 14:43:27 -0600 Subject: [PATCH 0612/1015] msm: kgsl: Increase fault detection threshold value The current value is leading to spurious fault interrupts from the GPU. Increase the threshold 4 times so that hardware fault detection won't be triggered as quickly. CRs-Fixed: 1073836 Change-Id: Ie780cec4de818c94a407461580f9d80de7e4ec84 Signed-off-by: Harshdeep Dhatt Signed-off-by: Archana Sriram --- drivers/gpu/msm/adreno_a5xx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c index 9c287d553c74d..7ae9d16ff1bf4 100644 --- a/drivers/gpu/msm/adreno_a5xx.c +++ b/drivers/gpu/msm/adreno_a5xx.c @@ -1844,11 +1844,11 @@ static void a5xx_start(struct adreno_device *adreno_dev) set_bit(ADRENO_DEVICE_HANG_INTR, &adreno_dev->priv); gpudev->irq->mask |= (1 << A5XX_INT_MISC_HANG_DETECT); /* - * Set hang detection threshold to 1 million cycles - * (0xFFFF*16) + * Set hang detection threshold to 4 million cycles + * (0x3FFFF*16) */ kgsl_regwrite(device, A5XX_RBBM_INTERFACE_HANG_INT_CNTL, - (1 << 30) | 0xFFFF); + (1 << 30) | 0x3FFFF); } From 6b3b4f3c28d04a4cd17c633f11c310b8dd43e5dd Mon Sep 17 00:00:00 2001 From: Agrawal Ashish Date: Thu, 9 Feb 2017 13:22:33 +0530 Subject: [PATCH 0613/1015] msm: wlan: update regulatory database Incorporate the 2016-10-31 updates to the internal regulatory database. Update countries Bahrain, Belize, Chile, Egypt, Honduras, India, S Korea, Nepal, Panama, Russia, Senegal, TT and UAE. Also update St. Kitts&Navis and St. Lucia dfs region. Change-Id: Ia151b2dd5229f07790ac961af298305b24e098fb CRs-Fixed: 1091511 Signed-off-by: Amar Singhal Signed-off-by: Agrawal Ashish --- net/wireless/db.txt | 98 ++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 51 deletions(-) diff --git a/net/wireless/db.txt b/net/wireless/db.txt index bfa4c7f12586c..a8bb6177bc904 100644 --- a/net/wireless/db.txt +++ b/net/wireless/db.txt @@ -16,7 +16,7 @@ country 00: (57240 - 63720 @ 2160), (0) -country AE: DFS-FCC +country AE: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (24), AUTO-BW (5250 - 5330 @ 80), (24), DFS, AUTO-BW @@ -52,13 +52,12 @@ country AN: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS -country AR: DFS-FCC - (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5590 @ 80), (24), DFS - (5650 - 5730 @ 80), (24), DFS - (5735 - 5835 @ 80), (30) +country AR: + (2402 - 2482 @ 40), (36) + (5170 - 5330 @ 160), (23) + (5490 - 5590 @ 80), (36) + (5650 - 5730 @ 80), (36) + (5735 - 5835 @ 80), (36) country AS: DFS-FCC (2402 - 2472 @ 40), (30) @@ -162,11 +161,10 @@ country BG: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country BH: DFS-ETSI +country BH: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 20), (20) - (5250 - 5330 @ 20), (20), DFS - (5735 - 5835 @ 20), (20) + (5170 - 5330 @ 20), (23) + (5735 - 5835 @ 20), (33) country BL: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -219,8 +217,10 @@ country BY: DFS-ETSI (5490 - 5710 @ 160), (27), DFS country BZ: - (2402 - 2482 @ 40), (30) - (5735 - 5835 @ 80), (30) + (2402 - 2482 @ 40), (36) + (5170 - 5330 @ 160), (27) + (5490 - 5730 @ 160), (36) + (5735 - 5835 @ 80), (36) country CA: DFS-FCC (2402 - 2472 @ 40), (30) @@ -259,10 +259,9 @@ country CI: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) -country CL: DFS-ETSI +country CL: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5170 - 5330 @ 160), (20) (5735 - 5835 @ 80), (20) country CN: DFS-FCC @@ -426,8 +425,8 @@ country EE: DFS-ETSI country EG: DFS-ETSI (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 40), (20) - (5250 - 5330 @ 40), (20), DFS + (5170 - 5250 @ 40), (23) + (5250 - 5330 @ 40), (23), DFS country ES: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -590,11 +589,10 @@ country HK: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) -country HN: DFS-FCC +country HN: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5730 @ 160), (24), DFS + (5170 - 5330 @ 160), (24) + (5490 - 5730 @ 160), (24) (5735 - 5835 @ 80), (30) country HR: DFS-ETSI @@ -666,11 +664,10 @@ country IL: DFS-ETSI (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW -country IN: DFS-ETSI +country IN: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW - (5735 - 5835 @ 80), (20) + (5170 - 5330 @ 160), (23) + (5735 - 5835 @ 80), (30) country IR: (2402 - 2482 @ 40), (20) @@ -744,7 +741,7 @@ country KH: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS -country KN: DFS-ETSI +country KN: DFS-FCC (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW @@ -755,8 +752,11 @@ country KR: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW - (5490 - 5630 @ 80), (30), DFS - (5735 - 5815 @ 80), (30) + (5490 - 5710 @ 80), (30), DFS + (5735 - 5835 @ 80), (30) + # 60 GHz band channels 1-4, + # ref: http://www.law.go.kr/%ED%96%89%EC%A0%95%EA%B7%9C%EC%B9%99/%EB%AC%B4%EC%84%A0%EC%84%A4%EB%B9%84%EA%B7%9C%EC%B9%99 + (57000 - 66000 @ 2160), (43) country KP: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -787,7 +787,7 @@ country LB: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) -country LC: DFS-ETSI +country LC: DFS-FCC (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW @@ -1046,10 +1046,9 @@ country NO: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country NP: DFS-ETSI +country NP: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5170 - 5330 @ 160), (20) (5735 - 5835 @ 80), (20) country NZ: DFS-FCC @@ -1065,11 +1064,11 @@ country OM: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS -country PA: DFS-FCC +country PA: (2402 - 2472 @ 40), (30) - (5170 - 5250 @ 80), (17), AUTO-BW - (5250 - 5330 @ 80), (23), DFS, AUTO-BW - (5735 - 5835 @ 80), (30) + (5170 - 5250 @ 80), (23), AUT0-BW + (5250 - 5330 @ 80), (30), AUTO-BW + (5735 - 5835 @ 80), (36) country PE: DFS-FCC (2402 - 2482 @ 40), (20) @@ -1207,11 +1206,10 @@ country RS: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country RU: DFS-ETSI +country RU: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW - (5650 - 5710 @ 40), (30), DFS + (5170 - 5330 @ 160), (23) + (5490 - 5730 @ 160), (30) (5735 - 5835 @ 80), (30) country RW: DFS-FCC @@ -1285,11 +1283,10 @@ country SK: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country SN: DFS-FCC +country SN: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5730 @ 160), (24), DFS + (5170 - 5330 @ 160), (24) + (5490 - 5730 @ 160), (24) (5735 - 5835 @ 80), (30) country SR: DFS-ETSI @@ -1346,12 +1343,11 @@ country TR: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country TT: DFS-FCC +country TT: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5730 @ 160), (24), DFS - (5735 - 5835 @ 80), (30) + (5170 - 5330 @ 160), (27) + (5490 - 5730 @ 160), (36) + (5735 - 5835 @ 80), (36) country TW: DFS-FCC (2402 - 2472 @ 40), (30) From 92141888f1b5e92270e34f39c3ed6f76fa363e23 Mon Sep 17 00:00:00 2001 From: Yeleswarapu Nagaradhesh Date: Thu, 2 Feb 2017 19:56:58 +0530 Subject: [PATCH 0614/1015] ASoC: wcd9xxx: fix out of bound access Somtimes index can be more than array size of imped_index. which can lead to out of bound access. Fix this by checking for valid value of index. CRs-Fixed: 2000364 Change-Id: Ie571992f7a0b8156b02e09bb3adb0f9c9a370df7 Signed-off-by: Yeleswarapu Nagaradhesh --- sound/soc/codecs/wcd9xxx-common-v2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/codecs/wcd9xxx-common-v2.c b/sound/soc/codecs/wcd9xxx-common-v2.c index 600062187e07e..b3ced47e9e8eb 100644 --- a/sound/soc/codecs/wcd9xxx-common-v2.c +++ b/sound/soc/codecs/wcd9xxx-common-v2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -194,7 +194,7 @@ void wcd_clsh_imped_config(struct snd_soc_codec *codec, int imped, bool reset) return; } index = get_impedance_index(imped); - if (index >= ARRAY_SIZE(imped_index)) { + if (index >= (ARRAY_SIZE(imped_index) - 1)) { pr_debug("%s, impedance not in range = %d\n", __func__, imped); return; } From f8927e66964c19c62180f280de311e4b34910d7a Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Thu, 9 Feb 2017 16:52:07 +0530 Subject: [PATCH 0615/1015] usb: android: f_uac2: Fix audio quality issues The existing f_uac2 driver has audio quality issues. The isochronous packet drops are reduced by increasing the number of USB tranfers that can be queued. And thus improving the audio quality. Change-Id: I2979c1c0a0301c96cd18ba1ae4c9d6eeb7799a27 Signed-off-by: Sriharsha Allenki --- drivers/usb/gadget/function/f_uac2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index 8c2f1a37c98a5..fb84bc30c830a 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c @@ -23,7 +23,7 @@ #include "u_uac2.h" /* Keep everyone on toes */ -#define USB_XFERS 2 +#define USB_XFERS 8 /* * The driver implements a simple UAC_2 topology. From 6ff4a74f25d5038b183aa664023a79d5beeb448a Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Fri, 27 Jan 2017 10:46:38 +0530 Subject: [PATCH 0616/1015] usb: gadget: Fixes enumeration failure on Windows 10 Fixes USB Video function(UVC 1.5) enumeartion failure on Windows 10 by updating the processing unit descriptor of UVC class from 1.1 to 1.5. Changes the SAR width and SAR height attributes of H.264 frame descriptors to a non zero value as Windows 10 expects a non-zero value without which the video function enumeration fails. Change-Id: I5e1f0bd10e94b3a081d6607a1287f3cb4d3b5c41 Signed-off-by: Sriharsha Allenki --- drivers/usb/gadget/function/f_uvc.h | 13 +++++++------ include/uapi/linux/usb/video.h | 5 +++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/usb/gadget/function/f_uvc.h b/drivers/usb/gadget/function/f_uvc.h index 034a977322222..afbb422da3a97 100644 --- a/drivers/usb/gadget/function/f_uvc.h +++ b/drivers/usb/gadget/function/f_uvc.h @@ -58,15 +58,16 @@ static const struct uvc_camera_terminal_descriptor uvc_camera_terminal = { }; static const struct uvc_processing_unit_descriptor uvc_processing = { - .bLength = UVC_DT_PROCESSING_UNIT_SIZE(2), + .bLength = UVC_DT_PROCESSING_UNIT_SIZE(3), .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubType = UVC_VC_PROCESSING_UNIT, .bUnitID = 2, .bSourceID = 1, .wMaxMultiplier = cpu_to_le16(16*1024), - .bControlSize = 2, + .bControlSize = 3, .bmControls[0] = 64, .bmControls[1] = 16, + .bmControls[2] = 1, .iProcessing = 0, }; @@ -250,8 +251,8 @@ static const struct UVC_FRAME_H264(1) uvc_frame_h264_1920p = { .bFrameIndex = 1, .wWidth = cpu_to_le16(3840), .wHeight = cpu_to_le16(1920), - .wSARwidth = 0, - .wSARheight = 0, + .wSARwidth = 1, + .wSARheight = 1, .wProfile = 0x6400, .bLevelIDC = 0x33, .bmSupportedUsages = 0x70003, @@ -273,8 +274,8 @@ static const struct UVC_FRAME_H264(1) uvc_frame_h264_960p = { .bFrameIndex = 2, .wWidth = cpu_to_le16(1920), .wHeight = cpu_to_le16(960), - .wSARwidth = 0, - .wSARheight = 0, + .wSARwidth = 1, + .wSARheight = 1, .wProfile = 0x6400, .bLevelIDC = 0x28, .bmSupportedUsages = 0x70003, diff --git a/include/uapi/linux/usb/video.h b/include/uapi/linux/usb/video.h index b3e408dc062c1..b638f016aa214 100644 --- a/include/uapi/linux/usb/video.h +++ b/include/uapi/linux/usb/video.h @@ -300,11 +300,12 @@ struct uvc_processing_unit_descriptor { __u8 bSourceID; __u16 wMaxMultiplier; __u8 bControlSize; - __u8 bmControls[2]; + __u8 bmControls[3]; __u8 iProcessing; + __u8 bmVideoStandards; } __attribute__((__packed__)); -#define UVC_DT_PROCESSING_UNIT_SIZE(n) (9+(n)) +#define UVC_DT_PROCESSING_UNIT_SIZE(n) (10+(n)) /* 3.7.2.6. Extension Unit Descriptor */ struct uvc_extension_unit_descriptor { From f68f72743b2484bbd1e698264c8dfe3855648f26 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Tue, 24 Jan 2017 20:22:23 +0530 Subject: [PATCH 0617/1015] msm: kgsl: Add facility to limit max GPU power level jump Some devices are not stable in below two scenarios i) Previous power level is below restrict-pwrlevel and new level is max pwrlevel ii) Wake up gpu at max power level Add a facility to overwrite max power level value with the restrict_pwrlevel, if it is enabled through device tree property. CRs-Fixed: 1110516 Change-Id: I02391d656450d850e603e94d3538522318e413a9 Signed-off-by: Hareesh Gundu --- .../devicetree/bindings/gpu/adreno.txt | 3 ++ drivers/gpu/msm/kgsl_pwrctrl.c | 34 +++++++++++++++++-- drivers/gpu/msm/kgsl_pwrctrl.h | 4 ++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/gpu/adreno.txt b/Documentation/devicetree/bindings/gpu/adreno.txt index abb66d6710b6b..8c10323053258 100644 --- a/Documentation/devicetree/bindings/gpu/adreno.txt +++ b/Documentation/devicetree/bindings/gpu/adreno.txt @@ -80,6 +80,9 @@ DCVS Core info Optional Properties: - qcom,initial-powerlevel: This value indicates which qcom,gpu-pwrlevel should be used at start time and when coming back out of resume +- qcom,restrict-powerlevel: This value to limit max GPU power level jump during the clock switch and + while coming back out of slumber. Max GPU power level jump still allowed + from the restricted-pwerlevel. - qcom,bus-control: Boolean. Enables an independent bus vote from the gpu frequency - qcom,bus-width: Bus width in number of bytes. This enables dynamic AB bus voting based on bus width and actual bus transactions. diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c index 88c6eb25b3a5f..5f11f74d3cb80 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.c +++ b/drivers/gpu/msm/kgsl_pwrctrl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -34,6 +34,7 @@ #define KGSL_PWRFLAGS_AXI_ON 2 #define KGSL_PWRFLAGS_IRQ_ON 3 #define KGSL_PWRFLAGS_RETENTION_ON 4 +#define KGSL_PWRFLAGS_RESTRICT_MAX_LEVEL_JUMP 6 #define UPDATE_BUSY_VAL 1000000 @@ -344,6 +345,16 @@ void kgsl_pwrctrl_pwrlevel_change(struct kgsl_device *device, */ kgsl_pwrctrl_set_thermal_cycle(pwr, new_level); + /* Check any restriction over new level jump */ + if (test_bit(KGSL_PWRFLAGS_RESTRICT_MAX_LEVEL_JUMP, + &device->pwrctrl.ctrl_flags)) { + if (new_level == 0 && + old_level > device->pwrctrl.restrict_pwrlevel) + new_level = device->pwrctrl.restrict_pwrlevel; + else if (new_level == 0 && old_level == 0) + new_level = device->pwrctrl.restrict_pwrlevel; + } + if (new_level == old_level) return; @@ -2049,6 +2060,11 @@ int kgsl_pwrctrl_init(struct kgsl_device *device) pwr->power_flags = BIT(KGSL_PWRFLAGS_RETENTION_ON); + if (!of_property_read_u32(pdev->dev.of_node, "qcom,restrict-pwrlevel", + &pwr->restrict_pwrlevel)) + device->pwrctrl.ctrl_flags |= + BIT(KGSL_PWRFLAGS_RESTRICT_MAX_LEVEL_JUMP); + if (pwr->num_pwrlevels == 0) { KGSL_PWR_ERR(device, "No power levels are defined\n"); return -EINVAL; @@ -2394,6 +2410,7 @@ static int _wake(struct kgsl_device *device) { struct kgsl_pwrctrl *pwr = &device->pwrctrl; int status = 0; + bool limit_max_pwrlevel = false; switch (device->state) { case KGSL_STATE_SUSPEND: @@ -2416,6 +2433,16 @@ static int _wake(struct kgsl_device *device) kgsl_pwrctrl_axi(device, KGSL_PWRFLAGS_ON); kgsl_pwrscale_wake(device); kgsl_pwrctrl_irq(device, KGSL_PWRFLAGS_ON); + /* + * Check any restriction on max power level, clk_set_rate() + * wil set based on the active_pwrlevel. + */ + if (test_bit(KGSL_PWRFLAGS_RESTRICT_MAX_LEVEL_JUMP, + &pwr->ctrl_flags) && + (pwr->active_pwrlevel == 0)) { + pwr->active_pwrlevel = pwr->restrict_pwrlevel; + limit_max_pwrlevel = true; + } /* fall through */ case KGSL_STATE_DEEP_NAP: pm_qos_update_request(&device->pwrctrl.pm_qos_req_dma, @@ -2441,7 +2468,10 @@ static int _wake(struct kgsl_device *device) kgsl_pwrctrl_pwrlevel_change_settings(device, 0); kgsl_pwrctrl_pwrlevel_change_settings(device, 1); /* All settings for power level transitions are complete*/ - pwr->previous_pwrlevel = pwr->active_pwrlevel; + if (limit_max_pwrlevel) + pwr->previous_pwrlevel = 0; + else + pwr->previous_pwrlevel = pwr->active_pwrlevel; mod_timer(&device->idle_timer, jiffies + device->pwrctrl.interval_timeout); del_timer_sync(&device->pwrctrl.deep_nap_timer); diff --git a/drivers/gpu/msm/kgsl_pwrctrl.h b/drivers/gpu/msm/kgsl_pwrctrl.h index 5f8bb88c6adbc..a1b75cb76170e 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.h +++ b/drivers/gpu/msm/kgsl_pwrctrl.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -116,6 +116,7 @@ struct kgsl_regulator { * @previous_pwrlevel - The power level before transition * @thermal_pwrlevel - maximum powerlevel constraint from thermal * @default_pwrlevel - device wake up power level + * @restrict_pwrlevel - maximum power level jump to restrict * @max_pwrlevel - maximum allowable powerlevel per the user * @min_pwrlevel - minimum allowable powerlevel per the user * @num_pwrlevels - number of available power levels @@ -169,6 +170,7 @@ struct kgsl_pwrctrl { unsigned int previous_pwrlevel; unsigned int thermal_pwrlevel; unsigned int default_pwrlevel; + unsigned int restrict_pwrlevel; unsigned int wakeup_maxpwrlevel; unsigned int max_pwrlevel; unsigned int min_pwrlevel; From 16b68256c1473c198f5d292c01aeeecb12aa4a24 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Wed, 25 Jan 2017 19:06:46 +0530 Subject: [PATCH 0618/1015] ARM: dts: msm: Limit max gpu power level jump for MSM8940 Restrict max power level jump to 1, during the GPU clock switch and while coming out from slumber. This will address the device stability issue. CRs-Fixed: 1110516 Change-Id: I93f0e3022832c25c0fe1a48c5709ebfbd07249a0 Signed-off-by: Hareesh Gundu --- arch/arm/boot/dts/qcom/msm8940.dtsi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index 40f34119cfaa5..d9d2f28c3783e 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -341,6 +341,7 @@ /* GPU overrides */ &msm_gpu { + qcom,restrict-pwrlevel = <1>; /delete-property/qcom,gpu-speed-bin; qcom,gpu-speed-bin = <0x0174 0x80000000 31>; From 2740c5a9c59d67fd91f358ea8cdcbc5c2a34a5c0 Mon Sep 17 00:00:00 2001 From: Yeleswarapu Nagaradhesh Date: Fri, 6 Jan 2017 18:47:07 +0530 Subject: [PATCH 0619/1015] ASoC: msm8x16-wcd: modify interrupt handling In current SW, if multiple interrupts occurs at same time, all the interrupts are handled in first interrupt context and each interrupt is handled again in its own context. Due to which single interrupt is handled twice which is inturn configuring HW wrongly. Hence donot handle an interrupt in other interrupt context. CRs-Fixed: 1072485 Change-Id: I5bf7b69f39d903aa5ebb31d63d181b3f0785684a Signed-off-by: Yeleswarapu Nagaradhesh --- sound/soc/codecs/msm8916-wcd-irq.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/sound/soc/codecs/msm8916-wcd-irq.c b/sound/soc/codecs/msm8916-wcd-irq.c index 66b21d7ba1131..a4e3c7d87a6a4 100644 --- a/sound/soc/codecs/msm8916-wcd-irq.c +++ b/sound/soc/codecs/msm8916-wcd-irq.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015,2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -210,14 +210,9 @@ static int get_irq_bit(int linux_irq) return i; } -static int get_order_irq(int i) -{ - return order[i]; -} - static irqreturn_t wcd9xxx_spmi_irq_handler(int linux_irq, void *data) { - int irq, i, j; + int irq, i; unsigned long status[NUM_IRQ_REGS] = {0}; if (unlikely(wcd9xxx_spmi_lock_sleep() == false)) { @@ -236,16 +231,8 @@ static irqreturn_t wcd9xxx_spmi_irq_handler(int linux_irq, void *data) MSM8X16_WCD_A_DIGITAL_INT_LATCHED_STS); status[i] &= ~map.mask[i]; } - for (i = 0; i < MAX_NUM_IRQS; i++) { - j = get_order_irq(i); - if ((status[BIT_BYTE(j)] & BYTE_BIT_MASK(j)) && - ((map.handled[BIT_BYTE(j)] & - BYTE_BIT_MASK(j)) == 0)) { - map.handler[j](irq, data); - map.handled[BIT_BYTE(j)] |= - BYTE_BIT_MASK(j); - } - } + + map.handler[irq](irq, data); map.handled[BIT_BYTE(irq)] &= ~BYTE_BIT_MASK(irq); wcd9xxx_spmi_unlock_sleep(); From f81bccbceded0d9e6d727a4703f2dbc2ba6aa3e7 Mon Sep 17 00:00:00 2001 From: Andrew Chant Date: Fri, 2 Dec 2016 20:49:26 -0800 Subject: [PATCH 0620/1015] input: synaptics_dsx: reallocate buffer under lock. Prevent concurrent usage & re-allocation of the wr_buf variable. Based off patch by chengengjia . BUG: 33001936 Change-Id: I88d78e1ec0fc9e88b1e6824c06161b67d01136ec Signed-off-by: Andrew Chant Git-commit: d740e7228bd1578ed01762998b2a86e7df56e608 Git-repo: https://android.googlesource.com/kernel/msm Signed-off-by: Dennis Cagle --- .../input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_i2c.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_i2c.c b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_i2c.c index f936f3c2ebb1c..563ce16885b32 100644 --- a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_i2c.c +++ b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_i2c.c @@ -445,11 +445,11 @@ static int synaptics_rmi4_i2c_write(struct synaptics_rmi4_data *rmi4_data, struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent); struct i2c_msg msg[1]; + mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex); + retval = synaptics_rmi4_i2c_alloc_buf(rmi4_data, length + 1); if (retval < 0) - return retval; - - mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex); + goto exit; retval = synaptics_rmi4_i2c_set_page(rmi4_data, addr); if (retval != PAGE_SELECT_LEN) { From 9b01816fb4918a9e1362542202a3e2ffd573c2b3 Mon Sep 17 00:00:00 2001 From: Siena Richard Date: Wed, 11 Jan 2017 11:09:24 -0800 Subject: [PATCH 0621/1015] ASoC: msm: qdsp6v2: extend validation of virtual address Validate a buffer virtual address is fully within the region before returning the region to ensure functionality for an extended edge case. Change-Id: Iba3e080889980f393d6a9f0afe0231408b92d654 Signed-off-by: Siena Richard CRs-fixed: 1108461 --- drivers/misc/qcom/qdsp6v2/audio_utils_aio.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c index 9ade5572cf791..c12f791a1739c 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c @@ -1,6 +1,6 @@ /* Copyright (C) 2008 Google, Inc. * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -119,7 +119,10 @@ static int audio_aio_ion_lookup_vaddr(struct q6audio_aio *audio, void *addr, list_for_each_entry(region_elt, &audio->ion_region_queue, list) { if (addr >= region_elt->vaddr && addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) { + addr + len <= region_elt->vaddr + region_elt->len && + addr + len > addr) { + /* to avoid integer addition overflow */ + /* offset since we could pass vaddr inside a registerd * ion buffer */ From 1af0d6b2aa63cd65b40bed19d4b30a4a8256d111 Mon Sep 17 00:00:00 2001 From: Abdulla Anam Date: Wed, 25 Jan 2017 16:20:37 +0530 Subject: [PATCH 0622/1015] msm: vidc: Check for sanity of size while mapping buffers Fail map if dmabuffer size doesn't match expected buffersize. This is to avoid faults in firmware while accessing buffers. Change-Id: Ie41a93979696299a8b2fc3c548cb6574a21313db Signed-off-by: Abdulla Anam --- drivers/media/platform/msm/vidc/msm_smem.c | 22 ++++++++++++++++------ drivers/media/platform/msm/vidc/msm_vidc.c | 8 +++++--- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/msm/vidc/msm_smem.c b/drivers/media/platform/msm/vidc/msm_smem.c index 90047a608984e..c97b1e59a423e 100644 --- a/drivers/media/platform/msm/vidc/msm_smem.c +++ b/drivers/media/platform/msm/vidc/msm_smem.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -75,6 +75,14 @@ static int get_device_address(struct smem_client *smem_client, goto mem_map_failed; } + /* Check if the dmabuf size matches expected size */ + if (buf->size < *buffer_size) { + rc = -EINVAL; + dprintk(VIDC_ERR, + "Size mismatch! Dmabuf size: %zu Expected Size: %lu", + buf->size, *buffer_size); + goto mem_buf_size_mismatch; + } /* Prepare a dma buf for dma on the given device */ attach = dma_buf_attach(buf, cb->dev); if (IS_ERR_OR_NULL(attach)) { @@ -143,6 +151,7 @@ static int get_device_address(struct smem_client *smem_client, dma_buf_unmap_attachment(attach, table, DMA_BIDIRECTIONAL); mem_map_table_failed: dma_buf_detach(buf, attach); +mem_buf_size_mismatch: mem_buf_attach_failed: dma_buf_put(buf); mem_map_failed: @@ -193,12 +202,12 @@ static void put_device_address(struct smem_client *smem_client, } } -static int ion_user_to_kernel(struct smem_client *client, int fd, u32 offset, +static int ion_user_to_kernel(struct smem_client *client, int fd, u32 size, struct msm_smem *mem, enum hal_buffer buffer_type) { struct ion_handle *hndl; ion_phys_addr_t iova = 0; - unsigned long buffer_size = 0; + unsigned long buffer_size = size; int rc = 0; unsigned long align = SZ_4K; unsigned long ion_flags = 0; @@ -207,10 +216,11 @@ static int ion_user_to_kernel(struct smem_client *client, int fd, u32 offset, dprintk(VIDC_DBG, "%s ion handle: %pK\n", __func__, hndl); if (IS_ERR_OR_NULL(hndl)) { dprintk(VIDC_ERR, "Failed to get handle: %pK, %d, %d, %pK\n", - client, fd, offset, hndl); + client, fd, size, hndl); rc = -ENOMEM; goto fail_import_fd; } + mem->kvaddr = NULL; rc = ion_handle_get_flags(client->clnt, hndl, &ion_flags); if (rc) { @@ -430,7 +440,7 @@ static void ion_delete_client(struct smem_client *client) ion_client_destroy(client->clnt); } -struct msm_smem *msm_smem_user_to_kernel(void *clt, int fd, u32 offset, +struct msm_smem *msm_smem_user_to_kernel(void *clt, int fd, u32 size, enum hal_buffer buffer_type) { struct smem_client *client = clt; @@ -447,7 +457,7 @@ struct msm_smem *msm_smem_user_to_kernel(void *clt, int fd, u32 offset, } switch (client->mem_type) { case SMEM_ION: - rc = ion_user_to_kernel(clt, fd, offset, mem, buffer_type); + rc = ion_user_to_kernel(clt, fd, size, mem, buffer_type); break; default: dprintk(VIDC_ERR, "Mem type not supported\n"); diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c index c08d46fc81cc6..48b6e92b7d95c 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_vidc.c @@ -362,7 +362,7 @@ static struct msm_smem *map_buffer(struct msm_vidc_inst *inst, struct msm_smem *handle = NULL; handle = msm_comm_smem_user_to_kernel(inst, p->reserved[0], - p->reserved[1], + p->length, buffer_type); if (!handle) { dprintk(VIDC_ERR, @@ -438,8 +438,10 @@ int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b) goto exit; } - dprintk(VIDC_DBG, "[MAP] Create binfo = %pK fd = %d type = %d\n", - binfo, b->m.planes[0].reserved[0], b->type); + dprintk(VIDC_DBG, + "[MAP] Create binfo = %pK fd = %d size = %d type = %d\n", + binfo, b->m.planes[0].reserved[0], + b->m.planes[0].length, b->type); for (i = 0; i < b->length; ++i) { rc = 0; From 6bad2875b4d092f4522630b7952470f00eb37990 Mon Sep 17 00:00:00 2001 From: "Raju P.L.S.S.S.N" Date: Tue, 31 Jan 2017 23:00:00 +0530 Subject: [PATCH 0623/1015] msm: pm: Add mutex lock for shared data The buffer allocated in file open operations need to be protected as there can be a possiblity of use-after-free scenario. Process A B | | open | | | read started | | close Add mutex lock to protect the buffer to avoid this. Change-Id: I1e066fd0a047bcec2af7829015089d5c882fb2f3 Signed-off-by: Raju P.L.S.S.S.N Signed-off-by: Naresh Malladi --- drivers/power/qcom/msm-pm.c | 45 +++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/drivers/power/qcom/msm-pm.c b/drivers/power/qcom/msm-pm.c index df894c4c36c0c..7ff56b93af02b 100644 --- a/drivers/power/qcom/msm-pm.c +++ b/drivers/power/qcom/msm-pm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -87,6 +87,7 @@ static long *msm_pc_debug_counters; static cpumask_t retention_cpus; static DEFINE_SPINLOCK(retention_lock); +static DEFINE_MUTEX(msm_pc_debug_mutex); static bool msm_pm_is_L1_writeback(void) { @@ -678,33 +679,48 @@ static ssize_t msm_pc_debug_counters_file_read(struct file *file, char __user *bufu, size_t count, loff_t *ppos) { struct msm_pc_debug_counters_buffer *data; + ssize_t ret; + mutex_lock(&msm_pc_debug_mutex); data = file->private_data; - if (!data) - return -EINVAL; + if (!data) { + ret = -EINVAL; + goto exit; + } - if (!bufu) - return -EINVAL; + if (!bufu) { + ret = -EINVAL; + goto exit; + } - if (!access_ok(VERIFY_WRITE, bufu, count)) - return -EFAULT; + if (!access_ok(VERIFY_WRITE, bufu, count)) { + ret = -EFAULT; + goto exit; + } if (*ppos >= data->len && data->len == 0) data->len = msm_pc_debug_counters_copy(data); - return simple_read_from_buffer(bufu, count, ppos, + ret = simple_read_from_buffer(bufu, count, ppos, data->buf, data->len); +exit: + mutex_unlock(&msm_pc_debug_mutex); + return ret; } static int msm_pc_debug_counters_file_open(struct inode *inode, struct file *file) { struct msm_pc_debug_counters_buffer *buf; + int ret = 0; + mutex_lock(&msm_pc_debug_mutex); - if (!inode->i_private) - return -EINVAL; + if (!inode->i_private) { + ret = -EINVAL; + goto exit; + } file->private_data = kzalloc( sizeof(struct msm_pc_debug_counters_buffer), GFP_KERNEL); @@ -713,19 +729,24 @@ static int msm_pc_debug_counters_file_open(struct inode *inode, pr_err("%s: ERROR kmalloc failed to allocate %zu bytes\n", __func__, sizeof(struct msm_pc_debug_counters_buffer)); - return -ENOMEM; + ret = -ENOMEM; + goto exit; } buf = file->private_data; buf->reg = (long *)inode->i_private; - return 0; +exit: + mutex_unlock(&msm_pc_debug_mutex); + return ret; } static int msm_pc_debug_counters_file_close(struct inode *inode, struct file *file) { + mutex_lock(&msm_pc_debug_mutex); kfree(file->private_data); + mutex_unlock(&msm_pc_debug_mutex); return 0; } From eecbf231547484adf9734e092090a40b05a1b268 Mon Sep 17 00:00:00 2001 From: Rahul Sharma Date: Thu, 19 Jan 2017 17:01:57 +0530 Subject: [PATCH 0624/1015] msm: ba: Fix race conditions in debug writes Use dynamic allocation for debug buffer instead of static. This is to avoid race condition which can cause buffer overflows. Change-Id: I1b4eecb4280843064712ee3b7b52e23f55ab53c3 Signed-off-by: Rahul Sharma --- drivers/video/msm/ba/msm_ba_debug.c | 58 +++++++++++++++++++---------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/drivers/video/msm/ba/msm_ba_debug.c b/drivers/video/msm/ba/msm_ba_debug.c index a39a0d3ef714b..d41d1ab8a6fee 100644 --- a/drivers/video/msm/ba/msm_ba_debug.c +++ b/drivers/video/msm/ba/msm_ba_debug.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2015,2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -13,7 +13,7 @@ #include "msm_ba_debug.h" -#define MAX_DBG_BUF_SIZE 4096 +#define MAX_DBG_BUF_SIZE 1008 int msm_ba_debug = BA_ERR | BA_WARN; int msm_ba_debug_out = BA_OUT_PRINTK; @@ -24,11 +24,9 @@ struct debug_buffer { u32 filled_size; }; -static struct debug_buffer dbg_buf; - #define INIT_DBG_BUF(__buf) ({ \ - __buf.curr = __buf.ptr;\ - __buf.filled_size = 0; \ + __buf->curr = __buf->ptr;\ + __buf->filled_size = 0; \ }) static int dev_info_open(struct inode *inode, struct file *file) @@ -58,19 +56,30 @@ static ssize_t dev_info_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct msm_ba_dev *dev_ctxt = file->private_data; + struct debug_buffer *dbg_buf = NULL; + ssize_t size = 0; if (!dev_ctxt) { dprintk(BA_ERR, "Invalid params, dev: 0x%p", dev_ctxt); return 0; } + + dbg_buf = kmalloc(sizeof(struct debug_buffer), GFP_KERNEL); + if (NULL == dbg_buf) + return 0; + INIT_DBG_BUF(dbg_buf); - write_str(&dbg_buf, "==============================="); - write_str(&dbg_buf, "DEV: 0x%p", dev_ctxt); - write_str(&dbg_buf, "==============================="); - write_str(&dbg_buf, "state: %d", dev_ctxt->state); + write_str(dbg_buf, "==============================="); + write_str(dbg_buf, "DEV: 0x%p", dev_ctxt); + write_str(dbg_buf, "==============================="); + write_str(dbg_buf, "state: %d", dev_ctxt->state); - return simple_read_from_buffer(buf, count, ppos, - dbg_buf.ptr, dbg_buf.filled_size); + size = simple_read_from_buffer(buf, count, ppos, + dbg_buf->ptr, dbg_buf->filled_size); + + kfree(dbg_buf); + + return size; } static const struct file_operations dev_info_fops = { @@ -155,21 +164,32 @@ static ssize_t inst_info_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct msm_ba_inst *inst = file->private_data; + struct debug_buffer *dbg_buf = NULL; + ssize_t size = 0; if (!inst) { dprintk(BA_ERR, "Invalid params, dev: %p", inst); return 0; } + + dbg_buf = kmalloc(sizeof(struct debug_buffer), GFP_KERNEL); + if (NULL == dbg_buf) + return 0; + INIT_DBG_BUF(dbg_buf); - write_str(&dbg_buf, "==============================="); - write_str(&dbg_buf, "INSTANCE: %p (%s)", inst, + write_str(dbg_buf, "==============================="); + write_str(dbg_buf, "INSTANCE: %p (%s)", inst, "BA device"); - write_str(&dbg_buf, "==============================="); - write_str(&dbg_buf, "dev: %p", inst->dev_ctxt); - write_str(&dbg_buf, "state: %d", inst->state); + write_str(dbg_buf, "==============================="); + write_str(dbg_buf, "dev: %p", inst->dev_ctxt); + write_str(dbg_buf, "state: %d", inst->state); - return simple_read_from_buffer(buf, count, ppos, - dbg_buf.ptr, dbg_buf.filled_size); + size = simple_read_from_buffer(buf, count, ppos, + dbg_buf->ptr, dbg_buf->filled_size); + + kfree(dbg_buf); + + return size; } static const struct file_operations inst_info_fops = { From 9862275b6aa0b1694afb867e072b6670d7c4ce93 Mon Sep 17 00:00:00 2001 From: Adrian Salido Date: Thu, 1 Dec 2016 18:07:42 -0800 Subject: [PATCH 0625/1015] fs/proc/array.c: make safe access to group_leader As mentioned in commit 52ee2dfdd4f51cf422ea6a96a0846dc94244aa37 ("pids: refactor vnr/nr_ns helpers to make them safe"). *_nr_ns helpers used to be buggy. The commit addresses most of the helpers but is missing task_tgid_xxx() Without this protection there is a possible use after free reported by kasan instrumented kernel: ================================================================== BUG: KASAN: use-after-free in task_tgid_nr_ns+0x2c/0x44 at addr *** Read of size 8 by task cat/2472 CPU: 1 PID: 2472 Comm: cat Tainted: **** Hardware name: Google Tegra210 Smaug Rev 1,3+ (DT) Call trace: [] dump_backtrace+0x0/0x17c [] show_stack+0x18/0x24 [] dump_stack+0x94/0x100 [] kasan_report+0x308/0x554 [] __asan_load8+0x20/0x7c [] task_tgid_nr_ns+0x28/0x44 [] proc_pid_status+0x444/0x1080 [] proc_single_show+0x8c/0xdc [] seq_read+0x2e8/0x6f0 [] vfs_read+0xd8/0x1e0 [] SyS_read+0x68/0xd4 Accessing group_leader while holding rcu_lock and using the now safe helpers introduced in the commit mentioned, this race condition is addressed. Signed-off-by: Adrian Salido Change-Id: I4315217922dda375a30a3581c0c1740dda7b531b Bug: 31495866 Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 1d6d364ee174676a225a77dc7ca8dac887199718 Signed-off-by: Dennis Cagle --- fs/proc/array.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/proc/array.c b/fs/proc/array.c index 864f2e52cf1bc..6307f8774a11d 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -159,16 +159,16 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, int g; struct fdtable *fdt = NULL; const struct cred *cred; - pid_t ppid, tpid; + pid_t ppid = 0, tpid = 0; + struct task_struct *leader = NULL; rcu_read_lock(); - ppid = pid_alive(p) ? - task_tgid_nr_ns(rcu_dereference(p->real_parent), ns) : 0; - tpid = 0; if (pid_alive(p)) { struct task_struct *tracer = ptrace_parent(p); if (tracer) tpid = task_pid_nr_ns(tracer, ns); + ppid = task_tgid_nr_ns(rcu_dereference(p->real_parent), ns); + leader = p->group_leader; } cred = get_task_cred(p); seq_printf(m, @@ -181,7 +181,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, "Gid:\t%d\t%d\t%d\t%d\n" "Ngid:\t%d\n", get_task_state(p), - task_tgid_nr_ns(p, ns), + leader ? task_pid_nr_ns(leader, ns) : 0, pid_nr_ns(pid, ns), ppid, tpid, from_kuid_munged(user_ns, cred->uid), From a115f47fd988043f8fd3e0a051365ddc5f7ffa78 Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Mon, 7 Nov 2016 14:34:44 -0800 Subject: [PATCH 0626/1015] BACKPORT: aio: mark AIO pseudo-fs noexec This ensures that do_mmap() won't implicitly make AIO memory mappings executable if the READ_IMPLIES_EXEC personality flag is set. Such behavior is problematic because the security_mmap_file LSM hook doesn't catch this case, potentially permitting an attacker to bypass a W^X policy enforced by SELinux. I have tested the patch on my machine. To test the behavior, compile and run this: #define _GNU_SOURCE #include #include #include #include #include #include #include int main(void) { personality(READ_IMPLIES_EXEC); aio_context_t ctx = 0; if (syscall(__NR_io_setup, 1, &ctx)) err(1, "io_setup"); char cmd[1000]; sprintf(cmd, "cat /proc/%d/maps | grep -F '/[aio]'", (int)getpid()); system(cmd); return 0; } In the output, "rw-s" is good, "rwxs" is bad. Signed-off-by: Jann Horn Signed-off-by: Linus Torvalds (cherry picked from commit 22f6b4d34fcf039c63a94e7670e0da24f8575a5a) Bug: 31711619 Change-Id: Ib4ffd30b61f1d9ba629049f65a21afbf94e25cfd Git-commit: 689ea150ab61cb193268d4b7f68de68acf207db4 Git-repo: https://android.googlesource.com/kernel/msm Signed-off-by: Dennis Cagle --- fs/aio.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/aio.c b/fs/aio.c index d9912555aacc8..3eec984704441 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -229,6 +229,7 @@ static int __init aio_setup(void) aio_mnt = kern_mount(&aio_fs); if (IS_ERR(aio_mnt)) panic("Failed to create aio fs mount."); + aio_mnt->mnt_flags |= MNT_NOEXEC; if (bdi_init(&aio_fs_backing_dev_info)) panic("Failed to init aio fs backing dev info."); From 0707065e4595e2449caaa3c9933b3ee42675ee05 Mon Sep 17 00:00:00 2001 From: Vevek Venkatesan Date: Mon, 23 Jan 2017 18:04:53 +0530 Subject: [PATCH 0627/1015] input: touchscreen: gt9xx: fix memory corruption in Goodix driver Fix memory corruption in Goodix touchscreen driver, by resetting the global structure cmd_head to zero (except *data and wr flag) in goodix_tool_write handler on error case. Change-Id: I4f7f8f464b93571627b922b10c10a65826228e42 Signed-off-by: Vevek Venkatesan --- drivers/input/touchscreen/gt9xx/goodix_tool.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/input/touchscreen/gt9xx/goodix_tool.c b/drivers/input/touchscreen/gt9xx/goodix_tool.c index 898110fe882c8..8f80c38a7d065 100644 --- a/drivers/input/touchscreen/gt9xx/goodix_tool.c +++ b/drivers/input/touchscreen/gt9xx/goodix_tool.c @@ -1,7 +1,7 @@ /* drivers/input/touchscreen/goodix_tool.c * * 2010 - 2012 Goodix Technology. - * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -309,6 +309,7 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) { s32 ret = 0; + u8 *dataptr = NULL; mutex_lock(&lock); ret = copy_from_user(&cmd_head, userbuf, CMD_HEAD_LENGTH); @@ -462,6 +463,11 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, ret = CMD_HEAD_LENGTH; exit: + dataptr = cmd_head.data; + memset(&cmd_head, 0, sizeof(cmd_head)); + cmd_head.wr = 0xFF; + cmd_head.data = dataptr; + mutex_unlock(&lock); return ret; } From e741ee698ecd32e5754e7461164bffee7d5acd98 Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Fri, 26 Aug 2016 11:56:13 +0530 Subject: [PATCH 0628/1015] diag: Clear masks upon logging exit This patch clears the peripheral masks upon the mdlog exit and USB disconnection. This enables to keep the data and cmd channel open for read. CRs-Fixed: 1057143 Change-Id: Ie6f19319b75f3bf389ddd5a8168fd3bcd3efbc8b Signed-off-by: Manoj Prabhu B --- drivers/char/diag/diag_masks.c | 9 ++++++++ drivers/char/diag/diag_usb.c | 6 ++++++ drivers/char/diag/diagchar.h | 3 +++ drivers/char/diag/diagchar_core.c | 35 ++++++++++++++++++++++++++++++- drivers/char/diag/diagfwd.c | 17 +++++++-------- 5 files changed, 60 insertions(+), 10 deletions(-) diff --git a/drivers/char/diag/diag_masks.c b/drivers/char/diag/diag_masks.c index 9f694a052cb8f..f6709faa2d77c 100644 --- a/drivers/char/diag/diag_masks.c +++ b/drivers/char/diag/diag_masks.c @@ -1779,6 +1779,15 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count, if (!mask_info) return -EIO; + mutex_lock(&driver->diag_maskclear_mutex); + if (driver->mask_clear) { + DIAG_LOG(DIAG_DEBUG_PERIPHERALS, + "diag:%s: count = %zu\n", __func__, count); + mutex_unlock(&driver->diag_maskclear_mutex); + return -EIO; + } + mutex_unlock(&driver->diag_maskclear_mutex); + mutex_lock(&mask_info->lock); mask = (struct diag_msg_mask_t *)(mask_info->ptr); for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { diff --git a/drivers/char/diag/diag_usb.c b/drivers/char/diag/diag_usb.c index eb715cc8501c0..ca54b24ec6042 100644 --- a/drivers/char/diag/diag_usb.c +++ b/drivers/char/diag/diag_usb.c @@ -215,6 +215,12 @@ static void usb_connect_work_fn(struct work_struct *work) */ static void usb_disconnect(struct diag_usb_info *ch) { + if (!ch) + return; + + if (!atomic_read(&ch->connected) && driver->usb_connected) + diag_clear_masks(NULL); + if (ch && ch->ops && ch->ops->close) ch->ops->close(ch->ctxt, DIAG_USB_MODE); } diff --git a/drivers/char/diag/diagchar.h b/drivers/char/diag/diagchar.h index ebb91890db0d4..8a2c2546d7c2f 100644 --- a/drivers/char/diag/diagchar.h +++ b/drivers/char/diag/diagchar.h @@ -463,6 +463,8 @@ struct diagchar_dev { struct class *diagchar_class; struct device *diag_dev; int ref_count; + int mask_clear; + struct mutex diag_maskclear_mutex; struct mutex diagchar_mutex; struct mutex diag_file_mutex; wait_queue_head_t wait_q; @@ -622,6 +624,7 @@ void diag_cmd_remove_reg(struct diag_cmd_reg_entry_t *entry, uint8_t proc); void diag_cmd_remove_reg_by_pid(int pid); void diag_cmd_remove_reg_by_proc(int proc); int diag_cmd_chk_polling(struct diag_cmd_reg_entry_t *entry); +void diag_clear_masks(struct diag_md_session_t *info); void diag_record_stats(int type, int flag); diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index 616ed72d55140..0fddd1e41d239 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -387,6 +387,27 @@ static uint32_t diag_translate_kernel_to_user_mask(uint32_t peripheral_mask) return ret; } +void diag_clear_masks(struct diag_md_session_t *info) +{ + int ret; + char cmd_disable_log_mask[] = { 0x73, 0, 0, 0, 0, 0, 0, 0}; + char cmd_disable_msg_mask[] = { 0x7D, 0x05, 0, 0, 0, 0, 0, 0}; + char cmd_disable_event_mask[] = { 0x60, 0}; + + DIAG_LOG(DIAG_DEBUG_PERIPHERALS, + "diag: %s: masks clear request upon %s\n", __func__, + ((info) ? "ODL exit" : "USB Disconnection")); + + ret = diag_process_apps_masks(cmd_disable_log_mask, + sizeof(cmd_disable_log_mask), info); + ret = diag_process_apps_masks(cmd_disable_msg_mask, + sizeof(cmd_disable_msg_mask), info); + ret = diag_process_apps_masks(cmd_disable_event_mask, + sizeof(cmd_disable_event_mask), info); + DIAG_LOG(DIAG_DEBUG_PERIPHERALS, + "diag:%s: masks cleared successfully\n", __func__); +} + static void diag_close_logging_process(const int pid) { int i; @@ -398,6 +419,12 @@ static void diag_close_logging_process(const int pid) if (!session_info) return; + diag_clear_masks(session_info); + + mutex_lock(&driver->diag_maskclear_mutex); + driver->mask_clear = 1; + mutex_unlock(&driver->diag_maskclear_mutex); + session_peripheral_mask = session_info->peripheral_mask; diag_md_session_close(session_info); for (i = 0; i < NUM_MD_SESSIONS; i++) @@ -473,9 +500,14 @@ static int diag_remove_client_entry(struct file *file) } static int diagchar_close(struct inode *inode, struct file *file) { + int ret; DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: process exit %s\n", current->comm); - return diag_remove_client_entry(file); + ret = diag_remove_client_entry(file); + mutex_lock(&driver->diag_maskclear_mutex); + driver->mask_clear = 0; + mutex_unlock(&driver->diag_maskclear_mutex); + return ret; } void diag_record_stats(int type, int flag) @@ -3354,6 +3386,7 @@ static int __init diagchar_init(void) non_hdlc_data.len = 0; mutex_init(&driver->hdlc_disable_mutex); mutex_init(&driver->diagchar_mutex); + mutex_init(&driver->diag_maskclear_mutex); mutex_init(&driver->diag_file_mutex); mutex_init(&driver->delayed_rsp_mutex); mutex_init(&apps_data_mutex); diff --git a/drivers/char/diag/diagfwd.c b/drivers/char/diag/diagfwd.c index 2fd19e8d219ac..0b94244bafb28 100644 --- a/drivers/char/diag/diagfwd.c +++ b/drivers/char/diag/diagfwd.c @@ -1225,8 +1225,6 @@ static int diagfwd_mux_open(int id, int mode) static int diagfwd_mux_close(int id, int mode) { - uint8_t i; - switch (mode) { case DIAG_USB_MODE: driver->usb_connected = 0; @@ -1241,15 +1239,16 @@ static int diagfwd_mux_close(int id, int mode) driver->md_session_mode == DIAG_MD_NONE) || (driver->md_session_mode == DIAG_MD_PERIPHERAL)) { /* - * In this case the channel must not be closed. This case - * indicates that the USB is removed but there is a client - * running in background with Memory Device mode + * This case indicates that the USB is removed + * but there is a client running in background + * with Memory Device mode. */ } else { - for (i = 0; i < NUM_PERIPHERALS; i++) { - diagfwd_close(i, TYPE_DATA); - diagfwd_close(i, TYPE_CMD); - } + /* + * With clearing of masks on ODL exit and + * USB disconnection, closing of the channel is + * not needed.This enables read and drop of stale packets. + */ /* Re enable HDLC encoding */ pr_debug("diag: In %s, re-enabling HDLC encoding\n", __func__); From 8d05975259aeb84dd08f4abf0defca607e5c3d46 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Tue, 31 Jan 2017 12:07:10 -0800 Subject: [PATCH 0629/1015] crypto: msm: check length before copying to buf in _debug_stats_read Make sure that `len` is not larger than `count` before copying data to userspace `buf` in _debug_stats_read(). Change-Id: Iafb7cfa3828653f8c28183c812797c3d9a183da1 Signed-off-by: Zhen Kong --- drivers/crypto/msm/ota_crypto.c | 6 +++--- drivers/crypto/msm/qcedev.c | 4 ++-- drivers/crypto/msm/qcrypto.c | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/crypto/msm/ota_crypto.c b/drivers/crypto/msm/ota_crypto.c index 8aa0d04f14fd5..416623fb0883c 100644 --- a/drivers/crypto/msm/ota_crypto.c +++ b/drivers/crypto/msm/ota_crypto.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -884,8 +884,8 @@ static ssize_t _debug_stats_read(struct file *file, char __user *buf, int len; len = _disp_stats(); - - rc = simple_read_from_buffer((void __user *) buf, len, + if (len <= count) + rc = simple_read_from_buffer((void __user *) buf, len, ppos, (void *) _debug_read_buf, len); return rc; diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index 5da0c86d47ca2..ef4b5e15b4fad 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -1987,9 +1987,9 @@ static ssize_t _debug_stats_read(struct file *file, char __user *buf, len = _disp_stats(qcedev); - rc = simple_read_from_buffer((void __user *) buf, len, + if (len <= count) + rc = simple_read_from_buffer((void __user *) buf, len, ppos, (void *) _debug_read_buf, len); - return rc; } diff --git a/drivers/crypto/msm/qcrypto.c b/drivers/crypto/msm/qcrypto.c index 3324c9d164c41..dd4443f4458de 100644 --- a/drivers/crypto/msm/qcrypto.c +++ b/drivers/crypto/msm/qcrypto.c @@ -1,6 +1,6 @@ /* Qualcomm Crypto driver * - * Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -5742,9 +5742,9 @@ static ssize_t _debug_stats_read(struct file *file, char __user *buf, len = _disp_stats(qcrypto); - rc = simple_read_from_buffer((void __user *) buf, len, + if (len <= count) + rc = simple_read_from_buffer((void __user *) buf, len, ppos, (void *) _debug_read_buf, len); - return rc; } From db99abef0b94f44552e28ff68c6bf44de178b167 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Fri, 20 Jan 2017 12:22:23 -0800 Subject: [PATCH 0630/1015] qseecom: release memory when failed to get fw size release app list entry when __qseecom_get_fw_size() returns error. Change-Id: I82406c39a2def87395811f442f39b57201766091 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index f96fc1669a717..e3293d3a46e8f 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -4422,6 +4422,7 @@ int qseecom_start_app(struct qseecom_handle **handle, strlcpy(entry->app_name, app_name, MAX_APP_NAME_SIZE); if (__qseecom_get_fw_size(app_name, &fw_size, &app_arch)) { ret = -EIO; + kfree(entry); goto err; } entry->app_arch = app_arch; From 4a20082fee36ff15c4118f6d0b41a7b55f70bbdc Mon Sep 17 00:00:00 2001 From: Sahitya Tummala Date: Fri, 3 Feb 2017 13:24:19 +0530 Subject: [PATCH 0631/1015] uio: fix potential use after free issue when accessing debug_buffer The variable debug_buffer is a global variable which is allocated and free'd when open/close is called on debugfs file - "/sys/kernel/debug/rmt_storage/info". The current code doesn't have locks to handle concurrent accesses to the above file. This results into use after free issue when debug_buffer is accessed by two threads at the same time. Fix this by adding a mutex lock to protect this global variable. Change-Id: I6bc3f0ae2d7fca3ca9fe8561612f5863b6c3268a Signed-off-by: Sahitya Tummala --- drivers/uio/msm_sharedmem/sharedmem_qmi.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/uio/msm_sharedmem/sharedmem_qmi.c b/drivers/uio/msm_sharedmem/sharedmem_qmi.c index 48fb17ecdd957..fd95deeb61332 100644 --- a/drivers/uio/msm_sharedmem/sharedmem_qmi.c +++ b/drivers/uio/msm_sharedmem/sharedmem_qmi.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -223,6 +223,7 @@ static int sharedmem_qmi_req_cb(struct qmi_handle *handle, void *conn_h, #define DEBUG_BUF_SIZE (2048) static char *debug_buffer; static u32 debug_data_size; +static struct mutex dbg_buf_lock; /* mutex for debug_buffer */ static ssize_t debug_read(struct file *file, char __user *buf, size_t count, loff_t *file_pos) @@ -279,21 +280,29 @@ static int debug_open(struct inode *inode, struct file *file) { u32 buffer_size; - if (debug_buffer != NULL) + mutex_lock(&dbg_buf_lock); + if (debug_buffer != NULL) { + mutex_unlock(&dbg_buf_lock); return -EBUSY; + } buffer_size = DEBUG_BUF_SIZE; debug_buffer = kzalloc(buffer_size, GFP_KERNEL); - if (debug_buffer == NULL) + if (debug_buffer == NULL) { + mutex_unlock(&dbg_buf_lock); return -ENOMEM; + } debug_data_size = fill_debug_info(debug_buffer, buffer_size); + mutex_unlock(&dbg_buf_lock); return 0; } static int debug_close(struct inode *inode, struct file *file) { + mutex_lock(&dbg_buf_lock); kfree(debug_buffer); debug_buffer = NULL; debug_data_size = 0; + mutex_unlock(&dbg_buf_lock); return 0; } @@ -324,6 +333,7 @@ static void debugfs_init(void) { struct dentry *f_ent; + mutex_init(&dbg_buf_lock); dir_ent = debugfs_create_dir("rmt_storage", NULL); if (IS_ERR(dir_ent)) { pr_err("Failed to create debug_fs directory\n"); @@ -352,6 +362,7 @@ static void debugfs_init(void) static void debugfs_exit(void) { debugfs_remove_recursive(dir_ent); + mutex_destroy(&dbg_buf_lock); } static void sharedmem_qmi_svc_recv_msg(struct work_struct *work) From 2bc3ef6832407fef4914441e1a4a2dbd878124b1 Mon Sep 17 00:00:00 2001 From: Siena Richard Date: Mon, 23 Jan 2017 13:15:58 -0800 Subject: [PATCH 0632/1015] ASoC: msm: qdsp6v2: completely deallocate on cal block creation failure Completely deallocate the cal block if creation fails to ensure no memory leaks are present. CRs-Fixed: 1112751 Change-Id: I76916c8b3f7e8e9b864dc39dab96f7d330774473 Signed-off-by: Siena Richard --- sound/soc/msm/qdsp6v2/audio_cal_utils.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/audio_cal_utils.c b/sound/soc/msm/qdsp6v2/audio_cal_utils.c index 9b76b4892eb15..7b803712f6877 100644 --- a/sound/soc/msm/qdsp6v2/audio_cal_utils.c +++ b/sound/soc/msm/qdsp6v2/audio_cal_utils.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -601,7 +601,6 @@ static struct cal_block_data *create_cal_block(struct cal_type_data *cal_type, } INIT_LIST_HEAD(&cal_block->list); - list_add_tail(&cal_block->list, &cal_type->cal_blocks); cal_block->map_data.ion_map_handle = basic_cal->cal_data.mem_handle; if (basic_cal->cal_data.mem_handle > 0) { @@ -633,6 +632,7 @@ static struct cal_block_data *create_cal_block(struct cal_type_data *cal_type, goto err; } cal_block->buffer_number = basic_cal->cal_hdr.buffer_number; + list_add_tail(&cal_block->list, &cal_type->cal_blocks); pr_debug("%s: created block for cal type %d, buf num %d, map handle %d, map size %zd paddr 0x%pK!\n", __func__, cal_type->info.reg.cal_type, cal_block->buffer_number, @@ -642,6 +642,8 @@ static struct cal_block_data *create_cal_block(struct cal_type_data *cal_type, done: return cal_block; err: + kfree(cal_block->cal_info); + kfree(cal_block->client_info); kfree(cal_block); cal_block = NULL; return cal_block; From e939c4cafcd39d333d557710239250dbb3ae224e Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Wed, 22 Feb 2017 15:24:44 +0530 Subject: [PATCH 0633/1015] usb: gadget: f_uac2: Fix sound card registration failure Sound card registration fails when adb is rerun as root. The cause is the limitation in kernel/ALSA in proper cleaning up of the the parent of sound card when the sound card is removed. Fix this by pointing to a parent that will not be removed during sound card free. Change-Id: Id9354be1c2dc459fbd0a88be4ff3f167dff8f4d9 Signed-off-by: Sriharsha Allenki --- drivers/usb/gadget/function/f_uac2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index 8c2f1a37c98a5..6f5d1fbdc40b3 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c @@ -128,6 +128,7 @@ struct audio_dev { /* The ALSA Sound Card it represents on the USB-Client side */ struct snd_uac2_chip uac2; + struct device *gdev; }; static inline @@ -457,7 +458,7 @@ static int snd_uac2_probe(struct platform_device *pdev) c_chmask = opts->c_chmask; /* Choose any slot, with no id */ - err = snd_card_new(&pdev->dev, -1, NULL, THIS_MODULE, 0, &card); + err = snd_card_new(audio_dev->gdev, -1, NULL, THIS_MODULE, 0, &card); if (err < 0) return err; @@ -1144,6 +1145,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) goto err_free_descs; } + agdev->gdev = &gadget->dev; ret = alsa_uac2_init(agdev); if (ret) goto err_free_descs; From b0aad6dbfa155cd30589cc1b33969465dcd553b3 Mon Sep 17 00:00:00 2001 From: Sathish Ambley Date: Tue, 13 Dec 2016 15:27:30 -0800 Subject: [PATCH 0634/1015] msm: ADSPRPC: Buffer length to be copied is truncated The buffer length that is being used to allocate gets truncated due to it being assigned to wrong type causing a much smaller buffer to be allocated than what is required for copying. Change-Id: I30818acd42bd282837c7c7aa16d56d3b95d4dfe7 Signed-off-by: Sathish Ambley --- drivers/char/adsprpc.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index 03157619947b2..4c2172f995366 100644 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -982,6 +982,7 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx) /* calculate len requreed for copying */ for (oix = 0; oix < inbufs + outbufs; ++oix) { int i = ctx->overps[oix]->raix; + uintptr_t mstart, mend; ssize_t len = lpra[i].buf.len; if (!len) continue; @@ -989,7 +990,15 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx) continue; if (ctx->overps[oix]->offset == 0) copylen = ALIGN(copylen, BALIGN); - copylen += ctx->overps[oix]->mend - ctx->overps[oix]->mstart; + mstart = ctx->overps[oix]->mstart; + mend = ctx->overps[oix]->mend; + VERIFY(err, (mend - mstart) <= LONG_MAX); + if (err) + goto bail; + copylen += mend - mstart; + VERIFY(err, copylen >= 0); + if (err) + goto bail; } ctx->used = copylen; @@ -1054,7 +1063,7 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx) for (oix = 0; oix < inbufs + outbufs; ++oix) { int i = ctx->overps[oix]->raix; struct fastrpc_mmap *map = ctx->maps[i]; - int mlen = ctx->overps[oix]->mend - ctx->overps[oix]->mstart; + ssize_t mlen; uint64_t buf; ssize_t len = lpra[i].buf.len; if (!len) @@ -1065,6 +1074,7 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx) rlen -= ALIGN(args, BALIGN) - args; args = ALIGN(args, BALIGN); } + mlen = ctx->overps[oix]->mend - ctx->overps[oix]->mstart; VERIFY(err, rlen >= mlen); if (err) goto bail; From e024c8d97d347c05948e8741e33e2fd970e78c21 Mon Sep 17 00:00:00 2001 From: Krishnankutty Kolathappilly Date: Thu, 2 Feb 2017 11:26:40 -0800 Subject: [PATCH 0635/1015] msm: cpp: Check for validity of processed frame in cpp timeout Device crash seen from cpp timeout when process frame is invalid. Check for validity of processed frame in timeout when queue length is valid. Clear and release the buffers once the scenario is detected. CRs-Fixed: 2001828 Change-Id: If4fdfc993576e44e866aa30afd83d6236b3de276 Signed-off-by: Krishnankutty Kolathappilly --- .../platform/msm/camera_v2/pproc/cpp/msm_cpp.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index cd3201396a815..07fb130bc4fc9 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -1536,6 +1536,17 @@ static void msm_cpp_do_timeout_work(struct work_struct *work) goto end; } + for (i = 0; i < queue_len; i++) { + processed_frame[i] = cpp_timer.data.processed_frame[i]; + if (!processed_frame[i]) { + pr_warn("process frame null , queue len %d", queue_len); + msm_cpp_flush_queue_and_release_buffer(cpp_dev, + queue_len); + msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8); + goto end; + } + } + atomic_set(&cpp_timer.used, 1); pr_warn("Starting timer to fire in %d ms. (jiffies=%lu)\n", CPP_CMD_TIMEOUT_MS, jiffies); @@ -1544,9 +1555,6 @@ static void msm_cpp_do_timeout_work(struct work_struct *work) msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8); - for (i = 0; i < MAX_CPP_PROCESSING_FRAME; i++) - processed_frame[i] = cpp_timer.data.processed_frame[i]; - for (i = 0; i < queue_len; i++) { pr_warn("Rescheduling for identity=0x%x, frame_id=%03d\n", processed_frame[i]->identity, From 92367fe08965d811630b9f60682dded0ea53898a Mon Sep 17 00:00:00 2001 From: Krishnankutty Kolathappilly Date: Wed, 8 Feb 2017 15:07:51 -0800 Subject: [PATCH 0636/1015] cpp: Reset vbif and load firmware on poll failures CPP poll failure can happen if vbif reset is not proper. Reset vbif and load firmware on poll failures to recover from error scenario. CRs-Fixed: 1098549 Change-Id: I38ef1c9478450c98c8379d8b1c085b31209cb48e Signed-off-by: Krishnankutty Kolathappilly --- .../msm/camera_v2/pproc/cpp/msm_cpp.c | 81 ++++++++++++++----- 1 file changed, 60 insertions(+), 21 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index cd3201396a815..8bd36f84d3261 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -115,6 +115,12 @@ static int msm_cpp_update_gdscr_status(struct cpp_device *cpp_dev, bool status); static int msm_cpp_buffer_private_ops(struct cpp_device *cpp_dev, uint32_t buff_mgr_ops, uint32_t id, void *arg); +static void msm_cpp_set_micro_irq_mask(struct cpp_device *cpp_dev, + uint8_t enable, uint32_t irq_mask); +static void msm_cpp_flush_queue_and_release_buffer(struct cpp_device *cpp_dev, + int queue_len); +static int msm_cpp_dump_frame_cmd(struct msm_cpp_frame_info_t *frame_info); +static int32_t msm_cpp_reset_vbif_and_load_fw(struct cpp_device *cpp_dev); #if CONFIG_MSM_CPP_DBG #define CPP_DBG(fmt, args...) pr_err(fmt, ##args) @@ -883,11 +889,16 @@ static int cpp_init_hardware(struct cpp_device *cpp_dev) if (cpp_dev->fw_name_bin) { msm_camera_enable_irq(cpp_dev->irq, false); rc = cpp_load_fw(cpp_dev, cpp_dev->fw_name_bin); - msm_camera_enable_irq(cpp_dev->irq, true); if (rc < 0) { - pr_err("%s: load firmware failure %d\n", __func__, rc); - goto pwr_collapse_reset; + pr_err("%s: load firmware failure %d-retry\n", + __func__, rc); + rc = msm_cpp_reset_vbif_and_load_fw(cpp_dev); + if (rc < 0) { + msm_camera_enable_irq(cpp_dev->irq, true); + goto pwr_collapse_reset; + } } + msm_camera_enable_irq(cpp_dev->irq, true); msm_camera_io_w_mb(0x7C8, cpp_dev->base + MSM_CPP_MICRO_IRQGEN_MASK); msm_camera_io_w_mb(0xFFFF, cpp_dev->base + @@ -899,6 +910,7 @@ static int cpp_init_hardware(struct cpp_device *cpp_dev) pwr_collapse_reset: msm_cpp_update_gdscr_status(cpp_dev, false); + msm_camera_unregister_irq(cpp_dev->pdev, cpp_dev->irq, cpp_dev); req_irq_fail: msm_camera_clk_enable(&cpp_dev->pdev->dev, cpp_dev->clk_info, cpp_dev->cpp_clk, cpp_dev->num_clks, false); @@ -1063,6 +1075,34 @@ static int32_t cpp_load_fw(struct cpp_device *cpp_dev, char *fw_name_bin) return rc; } +int32_t msm_cpp_reset_vbif_clients(struct cpp_device *cpp_dev) +{ + uint32_t i; + + pr_warn("%s: handle vbif hang...\n", __func__); + for (i = 0; i < VBIF_CLIENT_MAX; i++) { + if (cpp_dev->vbif_data->err_handler[i] == NULL) + continue; + + cpp_dev->vbif_data->err_handler[i]( + cpp_dev->vbif_data->dev[i], CPP_VBIF_ERROR_HANG); + } + return 0; +} + +int32_t msm_cpp_reset_vbif_and_load_fw(struct cpp_device *cpp_dev) +{ + int32_t rc = 0; + + msm_cpp_reset_vbif_clients(cpp_dev); + + rc = cpp_load_fw(cpp_dev, cpp_dev->fw_name_bin); + if (rc < 0) + pr_err("Reset and load fw failed %d\n", rc); + + return rc; +} + int cpp_vbif_error_handler(void *dev, uint32_t vbif_error) { struct cpp_device *cpp_dev = NULL; @@ -1128,6 +1168,10 @@ static int cpp_open_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) CPP_DBG("open %d %pK\n", i, &fh->vfh); cpp_dev->cpp_open_cnt++; + + msm_cpp_vbif_register_error_handler(cpp_dev, + VBIF_CLIENT_CPP, cpp_vbif_error_handler); + if (cpp_dev->cpp_open_cnt == 1) { rc = cpp_init_hardware(cpp_dev); if (rc < 0) { @@ -1150,9 +1194,6 @@ static int cpp_open_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) cpp_dev->state = CPP_STATE_IDLE; } - msm_cpp_vbif_register_error_handler(cpp_dev, - VBIF_CLIENT_CPP, cpp_vbif_error_handler); - mutex_unlock(&cpp_dev->mutex); return 0; } @@ -1501,21 +1542,16 @@ static void msm_cpp_do_timeout_work(struct work_struct *work) goto end; } - pr_err("%s: handle vbif hang...\n", __func__); - for (i = 0; i < VBIF_CLIENT_MAX; i++) { - if (cpp_dev->vbif_data->err_handler[i] == NULL) - continue; - - cpp_dev->vbif_data->err_handler[i]( - cpp_dev->vbif_data->dev[i], CPP_VBIF_ERROR_HANG); - } - pr_debug("Reloading firmware %d\n", queue_len); rc = cpp_load_fw(cpp_timer.data.cpp_dev, cpp_timer.data.cpp_dev->fw_name_bin); if (rc) { - pr_warn("Firmware loading failed\n"); - goto error; + pr_warn("Firmware loading failed-retry\n"); + rc = msm_cpp_reset_vbif_and_load_fw(cpp_dev); + if (rc < 0) { + pr_err("Firmware loading failed\n"); + goto error; + } } else { pr_debug("Firmware loading done\n"); } @@ -2801,11 +2837,14 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, msm_camera_enable_irq(cpp_dev->irq, false); rc = cpp_load_fw(cpp_dev, cpp_dev->fw_name_bin); if (rc < 0) { - pr_err("%s: load firmware failure %d\n", + pr_err("%s: load firmware failure %d-retry\n", __func__, rc); - enable_irq(cpp_dev->irq->start); - mutex_unlock(&cpp_dev->mutex); - return rc; + rc = msm_cpp_reset_vbif_and_load_fw(cpp_dev); + if (rc < 0) { + enable_irq(cpp_dev->irq->start); + mutex_unlock(&cpp_dev->mutex); + return rc; + } } rc = msm_cpp_fw_version(cpp_dev); if (rc < 0) { From 36a2a7619f172cd7ead299ec4ca07ad18556795d Mon Sep 17 00:00:00 2001 From: Andrey Markovytch Date: Mon, 26 Dec 2016 09:14:47 +0200 Subject: [PATCH 0637/1015] ice: fix security issue with validating error in pointer get_ice_device_from_storage_type can return error pointer which is not NULL in case of error, this was not checked, changes fix this. Change-Id: I7dd8a068454a7bd250189ff9467c685af449f81b Signed-off-by: Andrey Markovytch --- drivers/crypto/msm/ice.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/crypto/msm/ice.c b/drivers/crypto/msm/ice.c index 9d9719fa2e54b..233dbeed2af59 100644 --- a/drivers/crypto/msm/ice.c +++ b/drivers/crypto/msm/ice.c @@ -1662,6 +1662,9 @@ int qcom_ice_setup_ice_hw(const char *storage_type, int enable) struct ice_device *ice_dev = NULL; ice_dev = get_ice_device_from_storage_type(storage_type); + if (ice_dev == ERR_PTR(-EPROBE_DEFER)) + return -EPROBE_DEFER; + if (!ice_dev) return ret; From c14c17ba3a218398b7f2cc8b25ccd975bad3a9aa Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Thu, 27 Oct 2016 20:16:59 +0530 Subject: [PATCH 0638/1015] regulator: msm_gfx_ldo: Fix the CX voting logic Vote on the CX rail only if the gfx_ldo regulator is enabled. CRs-Fixed: 1078568 Change-Id: Ice3a527b9952c0fdee813d8ad152d4c1deea7ecd Signed-off-by: Anirudh Ghayal --- drivers/regulator/msm_gfx_ldo.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/drivers/regulator/msm_gfx_ldo.c b/drivers/regulator/msm_gfx_ldo.c index b6a78a390d623..988e99c26575c 100644 --- a/drivers/regulator/msm_gfx_ldo.c +++ b/drivers/regulator/msm_gfx_ldo.c @@ -398,6 +398,15 @@ static int msm_gfx_ldo_enable(struct regulator_dev *rdev) ldo_vreg->corner + MIN_CORNER_OFFSET); if (ldo_vreg->vdd_cx) { + rc = regulator_set_voltage(ldo_vreg->vdd_cx, + ldo_vreg->vdd_cx_corner_map[ldo_vreg->corner], + INT_MAX); + if (rc) { + pr_err("Unable to set CX for corner %d rc=%d\n", + ldo_vreg->corner + MIN_CORNER_OFFSET, rc); + goto fail; + } + rc = regulator_enable(ldo_vreg->vdd_cx); if (rc) { pr_err("regulator_enable: vdd_cx: failed rc=%d\n", rc); @@ -646,17 +655,6 @@ static int msm_gfx_ldo_set_voltage(struct regulator_dev *rdev, else if (corner < ldo_vreg->corner) dir = DOWN; - if (ldo_vreg->vdd_cx) { - rc = regulator_set_voltage(ldo_vreg->vdd_cx, - ldo_vreg->vdd_cx_corner_map[corner], - INT_MAX); - if (rc) { - pr_err("Unable to set CX for corner %d rc=%d\n", - corner + MIN_CORNER_OFFSET, rc); - goto done; - } - } - if (ldo_vreg->mem_acc_vreg && dir == DOWN) { mem_acc_corner = ldo_vreg->mem_acc_corner_map[corner]; rc = regulator_set_voltage(ldo_vreg->mem_acc_vreg, @@ -668,6 +666,17 @@ static int msm_gfx_ldo_set_voltage(struct regulator_dev *rdev, goto done; } + if (ldo_vreg->vdd_cx) { + rc = regulator_set_voltage(ldo_vreg->vdd_cx, + ldo_vreg->vdd_cx_corner_map[corner], + INT_MAX); + if (rc) { + pr_err("Unable to set CX for corner %d rc=%d\n", + corner + MIN_CORNER_OFFSET, rc); + goto done; + } + } + new_mode = get_operating_mode(ldo_vreg, corner); if (new_mode == BHS) { From 683576918fd5a3acd6dfcf73682a887b391e803e Mon Sep 17 00:00:00 2001 From: Pratap Nirujogi Date: Mon, 26 Dec 2016 20:44:52 +0530 Subject: [PATCH 0639/1015] msm: camera: cpp: Avoid exposing kernel information to user space Avoid copy_to_user for the cases that are not required. CRs-Fixed: 1099731 Change-Id: Id7d94d26fc662f406f55fbe2f8703b3632809802 Signed-off-by: Pratap Nirujogi --- .../msm/camera_v2/pproc/cpp/msm_cpp.c | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index cd3201396a815..05db27cd01422 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -3535,6 +3535,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, struct msm_cpp_frame_info32_t k32_frame_info; struct msm_cpp_frame_info_t k64_frame_info; uint32_t identity_k = 0; + bool is_copytouser_req = true; void __user *up = (void __user *)arg; if (sd == NULL) { @@ -3668,9 +3669,8 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, break; } } - if (copy_to_user( - (void __user *)kp_ioctl.ioctl_ptr, &inst_info, - sizeof(struct msm_cpp_frame_info32_t))) { + if (copy_to_user((void __user *)kp_ioctl.ioctl_ptr, + &inst_info, sizeof(struct msm_cpp_frame_info32_t))) { mutex_unlock(&cpp_dev->mutex); return -EFAULT; } @@ -3706,6 +3706,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, sizeof(struct msm_cpp_stream_buff_info_t); } } + is_copytouser_req = false; if (cmd == VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO32) cmd = VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO; else if (cmd == VIDIOC_MSM_CPP_DELETE_STREAM_BUFF32) @@ -3720,6 +3721,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, get_user(identity_k, identity_u); kp_ioctl.ioctl_ptr = (void *)&identity_k; kp_ioctl.len = sizeof(uint32_t); + is_copytouser_req = false; cmd = VIDIOC_MSM_CPP_DEQUEUE_STREAM_BUFF_INFO; break; } @@ -3778,6 +3780,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, sizeof(struct msm_cpp_clock_settings_t); } } + is_copytouser_req = false; cmd = VIDIOC_MSM_CPP_SET_CLOCK; break; } @@ -3803,6 +3806,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, kp_ioctl.ioctl_ptr = (void *)&k_queue_buf; kp_ioctl.len = sizeof(struct msm_pproc_queue_buf_info); + is_copytouser_req = false; cmd = VIDIOC_MSM_CPP_QUEUE_BUF; break; } @@ -3827,6 +3831,8 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, k64_frame_info.frame_id = k32_frame_info.frame_id; kp_ioctl.ioctl_ptr = (void *)&k64_frame_info; + + is_copytouser_req = false; cmd = VIDIOC_MSM_CPP_POP_STREAM_BUFFER; break; } @@ -3880,13 +3886,16 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, break; } - up32_ioctl.id = kp_ioctl.id; - up32_ioctl.len = kp_ioctl.len; - up32_ioctl.trans_code = kp_ioctl.trans_code; - up32_ioctl.ioctl_ptr = ptr_to_compat(kp_ioctl.ioctl_ptr); + if (is_copytouser_req) { + up32_ioctl.id = kp_ioctl.id; + up32_ioctl.len = kp_ioctl.len; + up32_ioctl.trans_code = kp_ioctl.trans_code; + up32_ioctl.ioctl_ptr = ptr_to_compat(kp_ioctl.ioctl_ptr); - if (copy_to_user((void __user *)up, &up32_ioctl, sizeof(up32_ioctl))) - return -EFAULT; + if (copy_to_user((void __user *)up, &up32_ioctl, + sizeof(up32_ioctl))) + return -EFAULT; + } return rc; } From 49f67019d0367f68bf6ad39c3328dd3dd05af6e7 Mon Sep 17 00:00:00 2001 From: Xiaoyu Ye Date: Thu, 12 Jan 2017 13:43:38 -0800 Subject: [PATCH 0640/1015] misc: qcom: qdsp6v2: Add range check in function aac_in_ioctl_shared Add range check for cfg->sample_rate to prevent the user space from providing an invalid sample rate. CRs-Fixed: 1108109 Change-Id: I17ccda0901aa4ad84d6e2f78679d71aa327f42eb Signed-off-by: Xiaoyu Ye --- drivers/misc/qcom/qdsp6v2/aac_in.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/misc/qcom/qdsp6v2/aac_in.c b/drivers/misc/qcom/qdsp6v2/aac_in.c index 7176c114f85b2..ef963451a3f96 100644 --- a/drivers/misc/qcom/qdsp6v2/aac_in.c +++ b/drivers/misc/qcom/qdsp6v2/aac_in.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -34,6 +34,8 @@ #define AAC_FORMAT_ADTS 65535 +#define MAX_SAMPLE_RATE_384K 384000 + static long aac_in_ioctl_shared(struct file *file, unsigned int cmd, void *arg) { struct q6audio_in *audio = file->private_data; @@ -233,6 +235,13 @@ static long aac_in_ioctl_shared(struct file *file, unsigned int cmd, void *arg) break; } + if (cfg->sample_rate > MAX_SAMPLE_RATE_384K) { + pr_err("%s: ERROR: invalid sample rate = %u", + __func__, cfg->sample_rate); + rc = -EINVAL; + break; + } + min_bitrate = ((cfg->sample_rate)*(cfg->channels))/2; /* This calculation should be based on AAC mode. But we cannot * get AAC mode in this setconfig. min_bitrate's logical max From 64358542999132dd41191f0e87c320176536a6b2 Mon Sep 17 00:00:00 2001 From: VijayaKumar T M Date: Mon, 13 Feb 2017 18:11:17 +0530 Subject: [PATCH 0641/1015] msm: camera: Validate size param before allocating memory When ever i2c write is initiated check size param for NULL and in case of sequence write check for maximun allowed size per i2c sequence write. CRs-Fixed: 779253 Change-Id: Ib9fa1d620e888ba8410b241d08895af993b6d960 Signed-off-by: VijayaKumar T M Signed-off-by: Ravi Kishore Tanuku --- drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c index 3f4fb9be51d29..5cec427213917 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c +++ b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -452,7 +452,8 @@ static int32_t msm_ois_config(struct msm_ois_ctrl_t *o_ctrl, break; } - if (!conf_array.size) { + if (!conf_array.size || + conf_array.size > I2C_SEQ_REG_DATA_MAX) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; From 28bd334b4a17f9b9e5a2c9e9c1b6dfb2729f6350 Mon Sep 17 00:00:00 2001 From: Shantanu Jain Date: Thu, 16 Feb 2017 11:39:44 +0530 Subject: [PATCH 0642/1015] input: touchscreen: remove msg21xx mstar touch driver Remove msg21xx mstar touch driver from the kernel code as it has never been used in any of the recent platforms. Change-Id: I0ac1f93d9736c402732b6c4a8d22b1bf3500e4c4 Signed-off-by: Vevek Venkatesan Signed-off-by: Shantanu Jain --- .../bindings/input/touchscreen/msg21xx-ts.txt | 71 - drivers/input/touchscreen/Kconfig | 11 - drivers/input/touchscreen/Makefile | 1 - drivers/input/touchscreen/msg21xx_ts.c | 2168 ----------------- 4 files changed, 2251 deletions(-) delete mode 100644 Documentation/devicetree/bindings/input/touchscreen/msg21xx-ts.txt delete mode 100644 drivers/input/touchscreen/msg21xx_ts.c diff --git a/Documentation/devicetree/bindings/input/touchscreen/msg21xx-ts.txt b/Documentation/devicetree/bindings/input/touchscreen/msg21xx-ts.txt deleted file mode 100644 index 0d6289779d8cc..0000000000000 --- a/Documentation/devicetree/bindings/input/touchscreen/msg21xx-ts.txt +++ /dev/null @@ -1,71 +0,0 @@ -Mstar touch controller - -The mstar controller is connected to host processor -via i2c. The controller generates interrupts when the -user touches the panel. The host controller is expected -to read the touch coordinates over i2c and pass the coordinates -to the rest of the system. - -Required properties: - - - compatible : should be "mstar,msg21xx" - - reg : i2c slave address of the device - - interrupt-parent : parent of interrupt - - interrupts : touch sample interrupt to indicate presense or release - of fingers on the panel. - - vdd-supply : Power supply needed to power up the device - - vcc_i2c-supply : Power source required to power up i2c bus - - mstar,irq-gpio : irq gpio which is to provide interrupts to host, - same as "interrupts" node. It will also - contain active low or active high information. - - mstar,reset-gpio : reset gpio to control the reset of chip - - mstar,display-coords : display coords in pixels. It is a four - tuple consisting of min x, min y, max x and - max y values - - pinctrl-names : This should be defined if a target uses pinctrl framework. - See "pinctrl" in Documentation/devicetree/bindings/pinctrl/msm-pinctrl.txt. - Specify the names of the configs that pinctrl can install in driver. - Following are the pinctrl configs that can be installed: - "pmx_ts_active" : Active configuration of pins, this should specify active - config defined in pin groups of interrupt and reset gpio. - "pmx_ts_suspend" : Disabled configuration of pins, this should specify sleep - config defined in pin groups of interrupt and reset gpio. - "pmx_ts_release" : Release configuration of pins, this should specify - release config defined in pin groups of interrupt and reset gpio. - - mstar,num-max-touches: It defines the maximum number of touch supported by the controller. - - mstar,hard-reset-delay-ms : hard reset delay in ms - - mstar,post-hard-reset-delay-ms : post hard reset delay in ms - -Optional properties: - - - mstar,button-map : button map of key codes. It is a three tuple consisting of key codes. - - mstar,panel-coords : panel coords for the chip in pixels. - It is a four tuple consisting of min x, - min y, max x and max y values - - mstar,ic-type : It defines the ic-type of the controller. Values are as folows: - 1 -> msg2133. - 2 -> msg21xxA. - 3 -> msg26xxM. - -Example: - i2c@78b9000 { /* BLSP1 QUP5 */ - mstar@26 { - compatible = "mstar,msg21xx"; - reg = <0x26>; - interrupt-parent = <&msm_gpio>; - interrupts = <13 0x2008>; - mstar,irq-gpio = <&msm_gpio 13 0x00000001>; - mstar,reset-gpio = <&msm_gpio 12 0x0>; - vdd-supply = <&pm8916_l17>; - vcc_i2c-supply = <&pm8916_l6>; - mstar,display-coords = <0 0 480 854>; - pinctrl-names = "pmx_ts_active","pmx_ts_suspend"; - pinctrl-0 = <&ts_int_active &ts_reset_active>; - pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; - mstar,button-map = <172 139 158>; - mstar,ic-type = <2>; - mstar,num_max_touches = <2>; - mstar,hard-reset-delay-ms = <100>; - mstar,post-hard-reset-delay-ms = <100>; - }; - }; diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 3cc1d6cbb0368..0a4753ce8f383 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -995,17 +995,6 @@ config TOUCHSCREEN_FT5X06_GESTURE If unsure, say N. -config TOUCHSCREEN_MSTAR21XX - tristate "mstar touchscreens" - depends on I2C - help - Say Y here if you have a mstar touchscreen. - - If unsure, say N. - - To compile this driver as a module, choose M here: the - module will be called msg21xx_ts. - config SECURE_TOUCH bool "Secure Touch" depends on (TOUCHSCREEN_SYNAPTICS_I2C_RMI4 || \ diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 8dacb2ef0e187..be0eb9b34f5b6 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -86,7 +86,6 @@ obj-$(CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE) += zylonite-wm97xx.o obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o obj-$(CONFIG_TOUCHSCREEN_TPS6507X) += tps6507x-ts.o obj-$(CONFIG_TOUCHSCREEN_ZFORCE) += zforce_ts.o -obj-$(CONFIG_TOUCHSCREEN_MSTAR21XX) += msg21xx_ts.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4) += synaptics_i2c_rmi4.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI4_DEV) += synaptics_rmi_dev.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE) += synaptics_fw_update.o diff --git a/drivers/input/touchscreen/msg21xx_ts.c b/drivers/input/touchscreen/msg21xx_ts.c deleted file mode 100644 index 8e8d9ec6b15cc..0000000000000 --- a/drivers/input/touchscreen/msg21xx_ts.c +++ /dev/null @@ -1,2168 +0,0 @@ -/* - * MStar MSG21XX touchscreen driver - * - * Copyright (c) 2006-2012 MStar Semiconductor, Inc. - * - * Copyright (C) 2012 Bruce Ding - * - * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(CONFIG_FB) -#include -#include -#endif -#ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR -#include -#endif - -/* Constant Value & Variable Definition*/ - -#define MSTAR_VTG_MIN_UV 2800000 -#define MSTAR_VTG_MAX_UV 3300000 -#define MSTAR_I2C_VTG_MIN_UV 1800000 -#define MSTAR_I2C_VTG_MAX_UV 1800000 - -#define MAX_BUTTONS 4 -#define FT_COORDS_ARR_SIZE 4 -#define MSTAR_FW_NAME_MAX_LEN 50 - -#define MSTAR_CHIPTOP_REGISTER_BANK 0x1E -#define MSTAR_CHIPTOP_REGISTER_ICTYPE 0xCC -#define MSTAR_INIT_SW_ID 0x7FF -#define MSTAR_DEBUG_DIR_NAME "ts_debug" - -#define MSG_FW_FILE_MAJOR_VERSION(x) \ - (((x)->data[0x7f4f] << 8) + ((x)->data[0x7f4e])) - -#define MSG_FW_FILE_MINOR_VERSION(x) \ - (((x)->data[0x7f51] << 8) + ((x)->data[0x7f50])) - -/* - * Note. - * Please do not change the below setting. - */ -#define TPD_WIDTH (2048) -#define TPD_HEIGHT (2048) - -#define PINCTRL_STATE_ACTIVE "pmx_ts_active" -#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" -#define PINCTRL_STATE_RELEASE "pmx_ts_release" - -#define SLAVE_I2C_ID_DBBUS (0xC4>>1) - -#define DEMO_MODE_PACKET_LENGTH (8) - -#define TP_PRINT - -/*store the frimware binary data*/ -static unsigned char fw_bin_data[94][1024]; -static unsigned int crc32_table[256]; - -static unsigned short fw_file_major, fw_file_minor; -static unsigned short main_sw_id = MSTAR_INIT_SW_ID; -static unsigned short info_sw_id = MSTAR_INIT_SW_ID; -static unsigned int bin_conf_crc32; - -struct msg21xx_ts_platform_data { - const char *name; - char fw_name[MSTAR_FW_NAME_MAX_LEN]; - u8 fw_version_major; - u8 fw_version_minor; - u32 irq_gpio; - u32 irq_gpio_flags; - u32 reset_gpio; - u32 reset_gpio_flags; - u32 x_max; - u32 y_max; - u32 x_min; - u32 y_min; - u32 panel_minx; - u32 panel_miny; - u32 panel_maxx; - u32 panel_maxy; - u32 num_max_touches; - u8 ic_type; - u32 button_map[MAX_BUTTONS]; - u32 num_buttons; - u32 hard_reset_delay_ms; - u32 post_hard_reset_delay_ms; - bool updating_fw; -}; - -/* Touch Data Type Definition */ -struct touchPoint_t { - unsigned short x; - unsigned short y; -}; - -struct touchInfo_t { - struct touchPoint_t *point; - unsigned char count; - unsigned char keycode; -}; - -struct msg21xx_ts_data { - struct i2c_client *client; - struct input_dev *input_dev; - struct msg21xx_ts_platform_data *pdata; - struct regulator *vdd; - struct regulator *vcc_i2c; - bool suspended; -#if defined(CONFIG_FB) - struct notifier_block fb_notif; -#endif - struct pinctrl *ts_pinctrl; - struct pinctrl_state *pinctrl_state_active; - struct pinctrl_state *pinctrl_state_suspend; - struct pinctrl_state *pinctrl_state_release; - struct mutex ts_mutex; - struct touchInfo_t info; -}; - -#if defined(CONFIG_FB) -static int fb_notifier_callback(struct notifier_block *self, - unsigned long event, void *data); -#endif - -#ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR -static unsigned char bEnableTpProximity; -static unsigned char bFaceClosingTp; -#endif - -#ifdef TP_PRINT -static int tp_print_proc_read(struct msg21xx_ts_data *ts_data); -static void tp_print_create_entry(struct msg21xx_ts_data *ts_data); -#endif - -static void _ReadBinConfig(struct msg21xx_ts_data *ts_data); -static unsigned int _CalMainCRC32(struct msg21xx_ts_data *ts_data); - -static struct mutex msg21xx_mutex; - -enum EMEM_TYPE_t { - EMEM_ALL = 0, - EMEM_MAIN, - EMEM_INFO, -}; - -/* Function Definition */ - -static unsigned int _CRC_doReflect(unsigned int ref, signed char ch) -{ - unsigned int value = 0; - unsigned int i = 0; - - for (i = 1; i < (ch + 1); i++) { - if (ref & 1) - value |= 1 << (ch - i); - ref >>= 1; - } - - return value; -} - -static unsigned int _CRC_getValue(unsigned int text, unsigned int prevCRC) -{ - unsigned int ulCRC = prevCRC; - - ulCRC = (ulCRC >> 8) ^ crc32_table[(ulCRC & 0xFF) ^ text]; - - return ulCRC; -} - -static void _CRC_initTable(void) -{ - unsigned int magic_number = 0x04c11db7; - unsigned int i, j; - - for (i = 0; i <= 0xFF; i++) { - crc32_table[i] = _CRC_doReflect(i, 8) << 24; - for (j = 0; j < 8; j++) - crc32_table[i] = (crc32_table[i] << 1) ^ - (crc32_table[i] & (0x80000000L) ? - magic_number : 0); - crc32_table[i] = _CRC_doReflect(crc32_table[i], 32); - } -} - -static void msg21xx_reset_hw(struct msg21xx_ts_platform_data *pdata) -{ - unsigned int delay; - - gpio_direction_output(pdata->reset_gpio, 1); - gpio_set_value_cansleep(pdata->reset_gpio, 0); - /* Note that the RST must be in LOW 10ms at least */ - delay = pdata->hard_reset_delay_ms * 1000; - usleep_range(delay, delay + 1); - gpio_set_value_cansleep(pdata->reset_gpio, 1); - /* Enable the interrupt service thread/routine for INT after 50ms */ - delay = pdata->post_hard_reset_delay_ms * 1000; - usleep_range(delay, delay + 1); -} - -static int read_i2c_seq(struct msg21xx_ts_data *ts_data, unsigned char addr, - unsigned char *buf, unsigned short size) -{ - int rc = 0; - struct i2c_msg msgs[] = { - { - .addr = addr, - .flags = I2C_M_RD, /* read flag */ - .len = size, - .buf = buf, - }, - }; - - /* If everything went ok (i.e. 1 msg transmitted), return #bytes - transmitted, else error code. */ - if (ts_data->client != NULL) { - rc = i2c_transfer(ts_data->client->adapter, msgs, 1); - if (rc < 0) - dev_err(&ts_data->client->dev, - "%s error %d\n", __func__, rc); - } else { - dev_err(&ts_data->client->dev, "ts_data->client is NULL\n"); - } - - return rc; -} - -static int write_i2c_seq(struct msg21xx_ts_data *ts_data, unsigned char addr, - unsigned char *buf, unsigned short size) -{ - int rc = 0; - struct i2c_msg msgs[] = { - { - .addr = addr, - /* - * if read flag is undefined, - * then it means write flag. - */ - .flags = 0, - .len = size, - .buf = buf, - }, - }; - - /* - * If everything went ok (i.e. 1 msg transmitted), return #bytes - * transmitted, else error code. - */ - if (ts_data->client != NULL) { - rc = i2c_transfer(ts_data->client->adapter, msgs, 1); - if (rc < 0) - dev_err(&ts_data->client->dev, - "%s error %d\n", __func__, rc); - } else { - dev_err(&ts_data->client->dev, "ts_data->client is NULL\n"); - } - - return rc; -} - -static unsigned short read_reg(struct msg21xx_ts_data *ts_data, - unsigned char bank, unsigned char addr) -{ - unsigned char tx_data[3] = {0x10, bank, addr}; - unsigned char rx_data[2] = {0}; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, tx_data, sizeof(tx_data)); - read_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, rx_data, sizeof(rx_data)); - - return rx_data[1] << 8 | rx_data[0]; -} - -static void write_reg(struct msg21xx_ts_data *ts_data, unsigned char bank, - unsigned char addr, - unsigned short data) -{ - unsigned char tx_data[5] = {0x10, bank, addr, data & 0xFF, data >> 8}; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, tx_data, sizeof(tx_data)); -} - -static void write_reg_8bit(struct msg21xx_ts_data *ts_data, unsigned char bank, - unsigned char addr, - unsigned char data) -{ - unsigned char tx_data[4] = {0x10, bank, addr, data}; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, tx_data, sizeof(tx_data)); -} - -static void dbbusDWIICEnterSerialDebugMode(struct msg21xx_ts_data *ts_data) -{ - unsigned char data[5]; - - /* Enter the Serial Debug Mode */ - data[0] = 0x53; - data[1] = 0x45; - data[2] = 0x52; - data[3] = 0x44; - data[4] = 0x42; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, data, sizeof(data)); -} - -static void dbbusDWIICStopMCU(struct msg21xx_ts_data *ts_data) -{ - unsigned char data[1]; - - /* Stop the MCU */ - data[0] = 0x37; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, data, sizeof(data)); -} - -static void dbbusDWIICIICUseBus(struct msg21xx_ts_data *ts_data) -{ - unsigned char data[1]; - - /* IIC Use Bus */ - data[0] = 0x35; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, data, sizeof(data)); -} - -static void dbbusDWIICIICReshape(struct msg21xx_ts_data *ts_data) -{ - unsigned char data[1]; - - /* IIC Re-shape */ - data[0] = 0x71; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, data, sizeof(data)); -} - -static unsigned char msg21xx_get_ic_type(struct msg21xx_ts_data *ts_data) -{ - unsigned char ic_type = 0; - unsigned char bank; - unsigned char addr; - - msg21xx_reset_hw(ts_data->pdata); - dbbusDWIICEnterSerialDebugMode(ts_data); - dbbusDWIICStopMCU(ts_data); - dbbusDWIICIICUseBus(ts_data); - dbbusDWIICIICReshape(ts_data); - msleep(300); - - /* stop mcu */ - write_reg_8bit(ts_data, 0x0F, 0xE6, 0x01); - /* disable watch dog */ - write_reg(ts_data, 0x3C, 0x60, 0xAA55); - /* get ic type */ - bank = MSTAR_CHIPTOP_REGISTER_BANK; - addr = MSTAR_CHIPTOP_REGISTER_ICTYPE; - ic_type = (0xff)&(read_reg(ts_data, bank, addr)); - - if (ic_type != ts_data->pdata->ic_type) - ic_type = 0; - - msg21xx_reset_hw(ts_data->pdata); - - return ic_type; -} - -static int msg21xx_read_firmware_id(struct msg21xx_ts_data *ts_data) -{ - unsigned char command[3] = { 0x53, 0x00, 0x2A}; - unsigned char response[4] = { 0 }; - - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data, ts_data->client->addr, command, sizeof(command)); - read_i2c_seq(ts_data, ts_data->client->addr, response, - sizeof(response)); - mutex_unlock(&msg21xx_mutex); - ts_data->pdata->fw_version_major = (response[1]<<8) + response[0]; - ts_data->pdata->fw_version_minor = (response[3]<<8) + response[2]; - - dev_info(&ts_data->client->dev, "major num = %d, minor num = %d\n", - ts_data->pdata->fw_version_major, - ts_data->pdata->fw_version_minor); - - return 0; -} - -static int firmware_erase_c33(struct msg21xx_ts_data *ts_data, - enum EMEM_TYPE_t emem_type) -{ - /* stop mcu */ - write_reg(ts_data, 0x0F, 0xE6, 0x0001); - - /* disable watch dog */ - write_reg_8bit(ts_data, 0x3C, 0x60, 0x55); - write_reg_8bit(ts_data, 0x3C, 0x61, 0xAA); - - /* set PROGRAM password */ - write_reg_8bit(ts_data, 0x16, 0x1A, 0xBA); - write_reg_8bit(ts_data, 0x16, 0x1B, 0xAB); - - write_reg_8bit(ts_data, 0x16, 0x18, 0x80); - - if (emem_type == EMEM_ALL) - write_reg_8bit(ts_data, 0x16, 0x08, 0x10); - - write_reg_8bit(ts_data, 0x16, 0x18, 0x40); - msleep(20); - - /* clear pce */ - write_reg_8bit(ts_data, 0x16, 0x18, 0x80); - - /* erase trigger */ - if (emem_type == EMEM_MAIN) - write_reg_8bit(ts_data, 0x16, 0x0E, 0x04); /* erase main */ - else - write_reg_8bit(ts_data, 0x16, 0x0E, 0x08); /* erase all block */ - - return 0; -} - -static ssize_t firmware_update_c33(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size, - enum EMEM_TYPE_t emem_type, - bool isForce) { - unsigned int i, j; - unsigned int crc_main, crc_main_tp; - unsigned int crc_info, crc_info_tp; - unsigned short reg_data = 0; - int update_pass = 1; - bool fw_upgrade = false; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - crc_main = 0xffffffff; - crc_info = 0xffffffff; - - msg21xx_reset_hw(ts_data->pdata); - - msg21xx_read_firmware_id(ts_data); - _ReadBinConfig(ts_data); - if ((main_sw_id == info_sw_id) && - (_CalMainCRC32(ts_data) == bin_conf_crc32) && - (fw_file_major == ts_data->pdata->fw_version_major) && - (fw_file_minor > ts_data->pdata->fw_version_minor)) { - fw_upgrade = true; - } - - if (!fw_upgrade && !isForce) { - dev_dbg(dev, "no need to update\n"); - msg21xx_reset_hw(ts_data->pdata); - return size; - } - msg21xx_reset_hw(ts_data->pdata); - msleep(300); - - dbbusDWIICEnterSerialDebugMode(ts_data); - dbbusDWIICStopMCU(ts_data); - dbbusDWIICIICUseBus(ts_data); - dbbusDWIICIICReshape(ts_data); - msleep(300); - - /* erase main */ - firmware_erase_c33(ts_data, EMEM_MAIN); - msleep(1000); - - msg21xx_reset_hw(ts_data->pdata); - dbbusDWIICEnterSerialDebugMode(ts_data); - dbbusDWIICStopMCU(ts_data); - dbbusDWIICIICUseBus(ts_data); - dbbusDWIICIICReshape(ts_data); - msleep(300); - - /* - * Program - */ - - /* polling 0x3CE4 is 0x1C70 */ - if ((emem_type == EMEM_ALL) || (emem_type == EMEM_MAIN)) { - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0x1C70); - } - - switch (emem_type) { - case EMEM_ALL: - write_reg(ts_data, 0x3C, 0xE4, 0xE38F); /* for all-blocks */ - break; - case EMEM_MAIN: - write_reg(ts_data, 0x3C, 0xE4, 0x7731); /* for main block */ - break; - case EMEM_INFO: - write_reg(ts_data, 0x3C, 0xE4, 0x7731); /* for info block */ - - write_reg_8bit(ts_data, 0x0F, 0xE6, 0x01); - - write_reg_8bit(ts_data, 0x3C, 0xE4, 0xC5); - write_reg_8bit(ts_data, 0x3C, 0xE5, 0x78); - - write_reg_8bit(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, - 0x04, 0x9F); - write_reg_8bit(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, - 0x05, 0x82); - - write_reg_8bit(ts_data, 0x0F, 0xE6, 0x00); - msleep(100); - break; - } - - /* polling 0x3CE4 is 0x2F43 */ - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0x2F43); - - /* calculate CRC 32 */ - _CRC_initTable(); - - /* total 32 KB : 2 byte per R/W */ - for (i = 0; i < 32; i++) { - if (i == 31) { - fw_bin_data[i][1014] = 0x5A; - fw_bin_data[i][1015] = 0xA5; - - for (j = 0; j < 1016; j++) - crc_main = _CRC_getValue(fw_bin_data[i][j], - crc_main); - } else { - for (j = 0; j < 1024; j++) - crc_main = _CRC_getValue(fw_bin_data[i][j], - crc_main); - } - - for (j = 0; j < 8; j++) - write_i2c_seq(ts_data, ts_data->client->addr, - &fw_bin_data[i][j * 128], 128); - msleep(100); - - /* polling 0x3CE4 is 0xD0BC */ - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0xD0BC); - - write_reg(ts_data, 0x3C, 0xE4, 0x2F43); - } - - if ((emem_type == EMEM_ALL) || (emem_type == EMEM_MAIN)) { - /* write file done and check crc */ - write_reg(ts_data, 0x3C, 0xE4, 0x1380); - } - msleep(20); - - if ((emem_type == EMEM_ALL) || (emem_type == EMEM_MAIN)) { - /* polling 0x3CE4 is 0x9432 */ - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0x9432); - } - - crc_main = crc_main ^ 0xffffffff; - crc_info = crc_info ^ 0xffffffff; - - if ((emem_type == EMEM_ALL) || (emem_type == EMEM_MAIN)) { - /* CRC Main from TP */ - crc_main_tp = read_reg(ts_data, 0x3C, 0x80); - crc_main_tp = (crc_main_tp << 16) | - read_reg(ts_data, 0x3C, 0x82); - - /* CRC Info from TP */ - crc_info_tp = read_reg(ts_data, 0x3C, 0xA0); - crc_info_tp = (crc_info_tp << 16) | - read_reg(ts_data, 0x3C, 0xA2); - } - - update_pass = 1; - if ((emem_type == EMEM_ALL) || (emem_type == EMEM_MAIN)) { - if (crc_main_tp != crc_main) - update_pass = 0; - } - - if (!update_pass) { - dev_err(dev, "update_C33 failed\n"); - msg21xx_reset_hw(ts_data->pdata); - return 0; - } - - dev_dbg(dev, "update_C33 OK\n"); - msg21xx_reset_hw(ts_data->pdata); - return size; -} - -static unsigned int _CalMainCRC32(struct msg21xx_ts_data *ts_data) -{ - unsigned int ret = 0; - unsigned short reg_data = 0; - - msg21xx_reset_hw(ts_data->pdata); - - dbbusDWIICEnterSerialDebugMode(ts_data); - dbbusDWIICStopMCU(ts_data); - dbbusDWIICIICUseBus(ts_data); - dbbusDWIICIICReshape(ts_data); - msleep(100); - - /* Stop MCU */ - write_reg(ts_data, 0x0F, 0xE6, 0x0001); - - /* Stop Watchdog */ - write_reg_8bit(ts_data, 0x3C, 0x60, 0x55); - write_reg_8bit(ts_data, 0x3C, 0x61, 0xAA); - - /* cmd */ - write_reg(ts_data, 0x3C, 0xE4, 0xDF4C); - write_reg(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, 0x04, 0x7d60); - /* TP SW reset */ - write_reg(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, 0x04, 0x829F); - - /* MCU run */ - write_reg(ts_data, 0x0F, 0xE6, 0x0000); - - /* polling 0x3CE4 */ - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0x9432); - - /* Cal CRC Main from TP */ - ret = read_reg(ts_data, 0x3C, 0x80); - ret = (ret << 16) | read_reg(ts_data, 0x3C, 0x82); - - dev_dbg(&ts_data->client->dev, - "[21xxA]:Current main crc32=0x%x\n", ret); - return ret; -} - -static void _ReadBinConfig(struct msg21xx_ts_data *ts_data) -{ - unsigned char dbbus_tx_data[5] = {0}; - unsigned char dbbus_rx_data[4] = {0}; - unsigned short reg_data = 0; - - msg21xx_reset_hw(ts_data->pdata); - - dbbusDWIICEnterSerialDebugMode(ts_data); - dbbusDWIICStopMCU(ts_data); - dbbusDWIICIICUseBus(ts_data); - dbbusDWIICIICReshape(ts_data); - msleep(100); - - /* Stop MCU */ - write_reg(ts_data, 0x0F, 0xE6, 0x0001); - - /* Stop Watchdog */ - write_reg_8bit(ts_data, 0x3C, 0x60, 0x55); - write_reg_8bit(ts_data, 0x3C, 0x61, 0xAA); - - /* cmd */ - write_reg(ts_data, 0x3C, 0xE4, 0xA4AB); - write_reg(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, 0x04, 0x7d60); - - /* TP SW reset */ - write_reg(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, 0x04, 0x829F); - - /* MCU run */ - write_reg(ts_data, 0x0F, 0xE6, 0x0000); - - /* polling 0x3CE4 */ - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0x5B58); - - dbbus_tx_data[0] = 0x72; - dbbus_tx_data[1] = 0x7F; - dbbus_tx_data[2] = 0x55; - dbbus_tx_data[3] = 0x00; - dbbus_tx_data[4] = 0x04; - write_i2c_seq(ts_data, ts_data->client->addr, &dbbus_tx_data[0], 5); - read_i2c_seq(ts_data, ts_data->client->addr, &dbbus_rx_data[0], 4); - if ((dbbus_rx_data[0] >= 0x30 && dbbus_rx_data[0] <= 0x39) - && (dbbus_rx_data[1] >= 0x30 && dbbus_rx_data[1] <= 0x39) - && (dbbus_rx_data[2] >= 0x31 && dbbus_rx_data[2] <= 0x39)) { - main_sw_id = (dbbus_rx_data[0] - 0x30) * 100 + - (dbbus_rx_data[1] - 0x30) * 10 + - (dbbus_rx_data[2] - 0x30); - } - - dbbus_tx_data[0] = 0x72; - dbbus_tx_data[1] = 0x7F; - dbbus_tx_data[2] = 0xFC; - dbbus_tx_data[3] = 0x00; - dbbus_tx_data[4] = 0x04; - write_i2c_seq(ts_data, ts_data->client->addr, &dbbus_tx_data[0], 5); - read_i2c_seq(ts_data, ts_data->client->addr, &dbbus_rx_data[0], 4); - bin_conf_crc32 = (dbbus_rx_data[0] << 24) | - (dbbus_rx_data[1] << 16) | - (dbbus_rx_data[2] << 8) | - (dbbus_rx_data[3]); - - dbbus_tx_data[0] = 0x72; - dbbus_tx_data[1] = 0x83; - dbbus_tx_data[2] = 0x00; - dbbus_tx_data[3] = 0x00; - dbbus_tx_data[4] = 0x04; - write_i2c_seq(ts_data, ts_data->client->addr, &dbbus_tx_data[0], 5); - read_i2c_seq(ts_data, ts_data->client->addr, &dbbus_rx_data[0], 4); - if ((dbbus_rx_data[0] >= 0x30 && dbbus_rx_data[0] <= 0x39) - && (dbbus_rx_data[1] >= 0x30 && dbbus_rx_data[1] <= 0x39) - && (dbbus_rx_data[2] >= 0x31 && dbbus_rx_data[2] <= 0x39)) { - info_sw_id = (dbbus_rx_data[0] - 0x30) * 100 + - (dbbus_rx_data[1] - 0x30) * 10 + - (dbbus_rx_data[2] - 0x30); - } - - dev_dbg(&ts_data->client->dev, - "[21xxA]:main_sw_id = %d, info_sw_id = %d, bin_conf_crc32 = 0x%x\n", - main_sw_id, info_sw_id, bin_conf_crc32); -} - -static ssize_t firmware_update_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - return snprintf(buf, 3, "%d\n", ts_data->pdata->updating_fw); -} - -static ssize_t firmware_update_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t size) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - ts_data->pdata->updating_fw = true; - disable_irq(ts_data->client->irq); - - size = firmware_update_c33(dev, attr, buf, size, EMEM_MAIN, false); - - enable_irq(ts_data->client->irq); - ts_data->pdata->updating_fw = false; - - return size; -} - -static DEVICE_ATTR(update, (S_IRUGO | S_IWUSR), - firmware_update_show, - firmware_update_store); - -static int prepare_fw_data(struct device *dev) -{ - int count; - int i; - int ret; - const struct firmware *fw = NULL; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - ret = request_firmware(&fw, ts_data->pdata->fw_name, dev); - if (ret < 0) { - dev_err(dev, "Request firmware failed - %s (%d)\n", - ts_data->pdata->fw_name, ret); - return ret; - } - - count = fw->size / 1024; - - for (i = 0; i < count; i++) - memcpy(fw_bin_data[i], fw->data + (i * 1024), 1024); - - fw_file_major = MSG_FW_FILE_MAJOR_VERSION(fw); - fw_file_minor = MSG_FW_FILE_MINOR_VERSION(fw); - dev_dbg(dev, "New firmware: %d.%d", - fw_file_major, fw_file_minor); - - return fw->size; -} - -static ssize_t firmware_update_smart_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t size) -{ - int ret; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - ret = prepare_fw_data(dev); - if (ret < 0) { - dev_err(dev, "Request firmware failed -(%d)\n", ret); - return ret; - } - ts_data->pdata->updating_fw = true; - disable_irq(ts_data->client->irq); - - ret = firmware_update_c33(dev, attr, buf, size, EMEM_MAIN, false); - if (ret == 0) - dev_err(dev, "firmware_update_c33 ret = %d\n", ret); - - enable_irq(ts_data->client->irq); - ts_data->pdata->updating_fw = false; - - return ret; -} - -static ssize_t firmware_force_update_smart_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t size) -{ - int ret; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - ret = prepare_fw_data(dev); - if (ret < 0) { - dev_err(dev, "Request firmware failed -(%d)\n", ret); - return ret; - } - ts_data->pdata->updating_fw = true; - disable_irq(ts_data->client->irq); - - ret = firmware_update_c33(dev, attr, buf, size, EMEM_MAIN, true); - if (ret == 0) - dev_err(dev, "firmware_update_c33 et = %d\n", ret); - - enable_irq(ts_data->client->irq); - ts_data->pdata->updating_fw = false; - - return ret; -} - -static DEVICE_ATTR(update_fw, (S_IRUGO | S_IWUSR), - firmware_update_show, - firmware_update_smart_store); - -static DEVICE_ATTR(force_update_fw, (S_IRUGO | S_IWUSR), - firmware_update_show, - firmware_force_update_smart_store); - -static ssize_t firmware_version_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - msg21xx_read_firmware_id(ts_data); - return snprintf(buf, sizeof(char) * 8, "%03d%03d\n", - ts_data->pdata->fw_version_major, - ts_data->pdata->fw_version_minor); -} - -static DEVICE_ATTR(version, S_IRUGO, - firmware_version_show, - NULL); - - -static ssize_t msg21xx_fw_name_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - return snprintf(buf, MSTAR_FW_NAME_MAX_LEN - 1, - "%s\n", ts_data->pdata->fw_name); -} - -static ssize_t msg21xx_fw_name_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - if (size > MSTAR_FW_NAME_MAX_LEN - 1) - return -EINVAL; - - strlcpy(ts_data->pdata->fw_name, buf, size); - if (ts_data->pdata->fw_name[size - 1] == '\n') - ts_data->pdata->fw_name[size - 1] = 0; - - return size; -} - -static DEVICE_ATTR(fw_name, (S_IRUGO | S_IWUSR), - msg21xx_fw_name_show, msg21xx_fw_name_store); - -static ssize_t firmware_data_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t size) -{ - int count = size / 1024; - int i; - - for (i = 0; i < count; i++) - memcpy(fw_bin_data[i], buf + (i * 1024), 1024); - - if (buf != NULL) - dev_dbg(dev, "buf[0] = %c\n", buf[0]); - - return size; -} - -static DEVICE_ATTR(data, S_IWUSR, NULL, firmware_data_store); - -static ssize_t tp_print_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - tp_print_proc_read(ts_data); - - return snprintf(buf, 3, "%d\n", ts_data->suspended); -} - -static ssize_t tp_print_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t size) -{ - return size; -} - -static DEVICE_ATTR(tpp, (S_IRUGO | S_IWUSR), - tp_print_show, tp_print_store); - -#ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR -static void _msg_enable_proximity(void) -{ - unsigned char tx_data[4] = {0}; - - tx_data[0] = 0x52; - tx_data[1] = 0x00; - tx_data[2] = 0x47; - tx_data[3] = 0xa0; - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data->client->addr, &tx_data[0], 4); - mutex_unlock(&msg21xx_mutex); - - bEnableTpProximity = 1; -} - -static void _msg_disable_proximity(void) -{ - unsigned char tx_data[4] = {0}; - - tx_data[0] = 0x52; - tx_data[1] = 0x00; - tx_data[2] = 0x47; - tx_data[3] = 0xa1; - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data->client->addr, &tx_data[0], 4); - mutex_unlock(&msg21xx_mutex); - - bEnableTpProximity = 0; - bFaceClosingTp = 0; -} - -static void tsps_msg21xx_enable(int en) -{ - if (en) - _msg_enable_proximity(); - else - _msg_disable_proximity(); -} - -static int tsps_msg21xx_data(void) -{ - return bFaceClosingTp; -} -#endif - -static int msg21xx_pinctrl_init(struct msg21xx_ts_data *ts_data) -{ - int retval; - - /* Get pinctrl if target uses pinctrl */ - ts_data->ts_pinctrl = devm_pinctrl_get(&(ts_data->client->dev)); - if (IS_ERR_OR_NULL(ts_data->ts_pinctrl)) { - retval = PTR_ERR(ts_data->ts_pinctrl); - dev_dbg(&ts_data->client->dev, - "Target does not use pinctrl %d\n", retval); - goto err_pinctrl_get; - } - - ts_data->pinctrl_state_active = pinctrl_lookup_state( - ts_data->ts_pinctrl, PINCTRL_STATE_ACTIVE); - if (IS_ERR_OR_NULL(ts_data->pinctrl_state_active)) { - retval = PTR_ERR(ts_data->pinctrl_state_active); - dev_dbg(&ts_data->client->dev, - "Can't lookup %s pinstate %d\n", - PINCTRL_STATE_ACTIVE, retval); - goto err_pinctrl_lookup; - } - - ts_data->pinctrl_state_suspend = pinctrl_lookup_state( - ts_data->ts_pinctrl, PINCTRL_STATE_SUSPEND); - if (IS_ERR_OR_NULL(ts_data->pinctrl_state_suspend)) { - retval = PTR_ERR(ts_data->pinctrl_state_suspend); - dev_dbg(&ts_data->client->dev, - "Can't lookup %s pinstate %d\n", - PINCTRL_STATE_SUSPEND, retval); - goto err_pinctrl_lookup; - } - - ts_data->pinctrl_state_release = pinctrl_lookup_state( - ts_data->ts_pinctrl, PINCTRL_STATE_RELEASE); - if (IS_ERR_OR_NULL(ts_data->pinctrl_state_release)) { - retval = PTR_ERR(ts_data->pinctrl_state_release); - dev_dbg(&ts_data->client->dev, - "Can't lookup %s pinstate %d\n", - PINCTRL_STATE_RELEASE, retval); - } - - return 0; - -err_pinctrl_lookup: - devm_pinctrl_put(ts_data->ts_pinctrl); -err_pinctrl_get: - ts_data->ts_pinctrl = NULL; - return retval; -} - -static unsigned char calculate_checksum(unsigned char *msg, int length) -{ - int checksum = 0, i; - - for (i = 0; i < length; i++) - checksum += msg[i]; - - return (unsigned char)((-checksum) & 0xFF); -} - -static int parse_info(struct msg21xx_ts_data *ts_data) -{ - unsigned char data[DEMO_MODE_PACKET_LENGTH] = {0}; - unsigned char checksum = 0; - unsigned int x = 0, y = 0; - unsigned int x2 = 0, y2 = 0; - unsigned int delta_x = 0, delta_y = 0; - - mutex_lock(&msg21xx_mutex); - read_i2c_seq(ts_data, ts_data->client->addr, &data[0], - DEMO_MODE_PACKET_LENGTH); - mutex_unlock(&msg21xx_mutex); - checksum = calculate_checksum(&data[0], (DEMO_MODE_PACKET_LENGTH-1)); - dev_dbg(&ts_data->client->dev, "check sum: [%x] == [%x]?\n", - data[DEMO_MODE_PACKET_LENGTH-1], checksum); - - if (data[DEMO_MODE_PACKET_LENGTH-1] != checksum) { - dev_err(&ts_data->client->dev, "WRONG CHECKSUM\n"); - return -EINVAL; - } - - if (data[0] != 0x52) { - dev_err(&ts_data->client->dev, "WRONG HEADER\n"); - return -EINVAL; - } - - ts_data->info.keycode = 0xFF; - if ((data[1] == 0xFF) && (data[2] == 0xFF) && - (data[3] == 0xFF) && (data[4] == 0xFF) && - (data[6] == 0xFF)) { - if ((data[5] == 0xFF) || (data[5] == 0)) { - ts_data->info.keycode = 0xFF; - } else if ((data[5] == 1) || (data[5] == 2) || - (data[5] == 4) || (data[5] == 8)) { - ts_data->info.keycode = data[5] >> 1; - - dev_dbg(&ts_data->client->dev, - "ts_data->info.keycode index %d\n", - ts_data->info.keycode); - } - #ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR - else if (bEnableTpProximity && ((data[5] == 0x80) || - (data[5] == 0x40))) { - if (data[5] == 0x80) - bFaceClosingTp = 1; - else if (data[5] == 0x40) - bFaceClosingTp = 0; - - return -EINVAL; - } - #endif - else { - dev_err(&ts_data->client->dev, "WRONG KEY\n"); - return -EINVAL; - } - } else { - x = (((data[1] & 0xF0) << 4) | data[2]); - y = (((data[1] & 0x0F) << 8) | data[3]); - delta_x = (((data[4] & 0xF0) << 4) | data[5]); - delta_y = (((data[4] & 0x0F) << 8) | data[6]); - - if ((delta_x == 0) && (delta_y == 0)) { - ts_data->info.point[0].x = - x * ts_data->pdata->x_max / TPD_WIDTH; - ts_data->info.point[0].y = - y * ts_data->pdata->y_max / TPD_HEIGHT; - ts_data->info.count = 1; - } else { - if (delta_x > 2048) - delta_x -= 4096; - - if (delta_y > 2048) - delta_y -= 4096; - - x2 = (unsigned int)((signed short)x + - (signed short)delta_x); - y2 = (unsigned int)((signed short)y + - (signed short)delta_y); - ts_data->info.point[0].x = - x * ts_data->pdata->x_max / TPD_WIDTH; - ts_data->info.point[0].y = - y * ts_data->pdata->y_max / TPD_HEIGHT; - ts_data->info.point[1].x = - x2 * ts_data->pdata->x_max / TPD_WIDTH; - ts_data->info.point[1].y = - y2 * ts_data->pdata->y_max / TPD_HEIGHT; - ts_data->info.count = ts_data->pdata->num_max_touches; - } - } - - return 0; -} - -static void touch_driver_touch_released(struct msg21xx_ts_data *ts_data) -{ - int i; - - for (i = 0; i < ts_data->pdata->num_max_touches; i++) { - input_mt_slot(ts_data->input_dev, i); - input_mt_report_slot_state(ts_data->input_dev, - MT_TOOL_FINGER, 0); - } - - input_report_key(ts_data->input_dev, BTN_TOUCH, 0); - input_report_key(ts_data->input_dev, BTN_TOOL_FINGER, 0); - input_sync(ts_data->input_dev); -} - -/* read data through I2C then report data to input -sub-system when interrupt occurred */ -static irqreturn_t msg21xx_ts_interrupt(int irq, void *dev_id) -{ - int i = 0; - static int last_keycode = 0xFF; - static int last_count; - struct msg21xx_ts_data *ts_data = dev_id; - - ts_data->info.count = 0; - if (0 == parse_info(ts_data)) { - if (ts_data->info.keycode != 0xFF) { /* key touch pressed */ - if (ts_data->info.keycode < - ts_data->pdata->num_buttons) { - if (ts_data->info.keycode != last_keycode) { - dev_dbg(&ts_data->client->dev, - "key touch pressed"); - - input_report_key(ts_data->input_dev, - BTN_TOUCH, 1); - input_report_key(ts_data->input_dev, - ts_data->pdata->button_map[ - ts_data->info.keycode], 1); - - last_keycode = ts_data->info.keycode; - } else { - /* pass duplicate key-pressing */ - dev_dbg(&ts_data->client->dev, - "REPEATED KEY\n"); - } - } else { - dev_dbg(&ts_data->client->dev, "WRONG KEY\n"); - } - } else { /* key touch released */ - if (last_keycode != 0xFF) { - dev_dbg(&ts_data->client->dev, "key touch released"); - - input_report_key(ts_data->input_dev, - BTN_TOUCH, 0); - input_report_key(ts_data->input_dev, - ts_data->pdata->button_map[last_keycode], - 0); - - last_keycode = 0xFF; - } - } - - if (ts_data->info.count > 0) { /* point touch pressed */ - for (i = 0; i < ts_data->info.count; i++) { - input_mt_slot(ts_data->input_dev, i); - input_mt_report_slot_state(ts_data->input_dev, - MT_TOOL_FINGER, 1); - input_report_abs(ts_data->input_dev, - ABS_MT_TOUCH_MAJOR, 1); - input_report_abs(ts_data->input_dev, - ABS_MT_POSITION_X, - ts_data->info.point[i].x); - input_report_abs(ts_data->input_dev, - ABS_MT_POSITION_Y, - ts_data->info.point[i].y); - } - } - - if (last_count > ts_data->info.count) { - for (i = ts_data->info.count; - i < ts_data->pdata->num_max_touches; - i++) { - input_mt_slot(ts_data->input_dev, i); - input_mt_report_slot_state(ts_data->input_dev, - MT_TOOL_FINGER, 0); - } - } - last_count = ts_data->info.count; - - input_report_key(ts_data->input_dev, BTN_TOUCH, - ts_data->info.count > 0); - input_report_key(ts_data->input_dev, BTN_TOOL_FINGER, - ts_data->info.count > 0); - - input_sync(ts_data->input_dev); - } - - return IRQ_HANDLED; -} - -static int msg21xx_ts_power_init(struct msg21xx_ts_data *ts_data, bool init) -{ - int rc; - - if (init) { - ts_data->vdd = regulator_get(&ts_data->client->dev, - "vdd"); - if (IS_ERR(ts_data->vdd)) { - rc = PTR_ERR(ts_data->vdd); - dev_err(&ts_data->client->dev, - "Regulator get failed vdd rc=%d\n", rc); - return rc; - } - - if (regulator_count_voltages(ts_data->vdd) > 0) { - rc = regulator_set_voltage(ts_data->vdd, - MSTAR_VTG_MIN_UV, - MSTAR_VTG_MAX_UV); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator set_vtg failed vdd rc=%d\n", - rc); - goto reg_vdd_put; - } - } - - ts_data->vcc_i2c = regulator_get(&ts_data->client->dev, - "vcc_i2c"); - if (IS_ERR(ts_data->vcc_i2c)) { - rc = PTR_ERR(ts_data->vcc_i2c); - dev_err(&ts_data->client->dev, - "Regulator get failed vcc_i2c rc=%d\n", rc); - goto reg_vdd_set_vtg; - } - - if (regulator_count_voltages(ts_data->vcc_i2c) > 0) { - rc = regulator_set_voltage(ts_data->vcc_i2c, - MSTAR_I2C_VTG_MIN_UV, - MSTAR_I2C_VTG_MAX_UV); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator set_vtg failed vcc_i2c rc=%d\n", rc); - goto reg_vcc_i2c_put; - } - } - } else { - if (regulator_count_voltages(ts_data->vdd) > 0) - regulator_set_voltage(ts_data->vdd, 0, - MSTAR_VTG_MAX_UV); - - regulator_put(ts_data->vdd); - - if (regulator_count_voltages(ts_data->vcc_i2c) > 0) - regulator_set_voltage(ts_data->vcc_i2c, 0, - MSTAR_I2C_VTG_MAX_UV); - - regulator_put(ts_data->vcc_i2c); - } - - return 0; - -reg_vcc_i2c_put: - regulator_put(ts_data->vcc_i2c); -reg_vdd_set_vtg: - if (regulator_count_voltages(ts_data->vdd) > 0) - regulator_set_voltage(ts_data->vdd, 0, MSTAR_VTG_MAX_UV); -reg_vdd_put: - regulator_put(ts_data->vdd); - return rc; -} - -static int msg21xx_ts_power_on(struct msg21xx_ts_data *ts_data, bool on) -{ - int rc; - - if (!on) - goto power_off; - - rc = regulator_enable(ts_data->vdd); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator vdd enable failed rc=%d\n", rc); - return rc; - } - - rc = regulator_enable(ts_data->vcc_i2c); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator vcc_i2c enable failed rc=%d\n", rc); - regulator_disable(ts_data->vdd); - } - - return rc; - -power_off: - rc = regulator_disable(ts_data->vdd); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator vdd disable failed rc=%d\n", rc); - return rc; - } - - rc = regulator_disable(ts_data->vcc_i2c); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator vcc_i2c disable failed rc=%d\n", rc); - rc = regulator_enable(ts_data->vdd); - } - - return rc; -} - -static int msg21xx_ts_gpio_configure(struct msg21xx_ts_data *ts_data, bool on) -{ - int ret = 0; - - if (!on) - goto pwr_deinit; - - if (gpio_is_valid(ts_data->pdata->irq_gpio)) { - ret = gpio_request(ts_data->pdata->irq_gpio, - "msg21xx_irq_gpio"); - if (ret) { - dev_err(&ts_data->client->dev, - "Failed to request GPIO[%d], %d\n", - ts_data->pdata->irq_gpio, ret); - goto err_irq_gpio_req; - } - ret = gpio_direction_input(ts_data->pdata->irq_gpio); - if (ret) { - dev_err(&ts_data->client->dev, - "Failed to set direction for gpio[%d], %d\n", - ts_data->pdata->irq_gpio, ret); - goto err_irq_gpio_dir; - } - gpio_set_value_cansleep(ts_data->pdata->irq_gpio, 1); - } else { - dev_err(&ts_data->client->dev, "irq gpio not provided\n"); - goto err_irq_gpio_req; - } - - if (gpio_is_valid(ts_data->pdata->reset_gpio)) { - ret = gpio_request(ts_data->pdata->reset_gpio, - "msg21xx_reset_gpio"); - if (ret) { - dev_err(&ts_data->client->dev, - "Failed to request GPIO[%d], %d\n", - ts_data->pdata->reset_gpio, ret); - goto err_reset_gpio_req; - } - - /* power on TP */ - ret = gpio_direction_output( - ts_data->pdata->reset_gpio, 1); - if (ret) { - dev_err(&ts_data->client->dev, - "Failed to set direction for GPIO[%d], %d\n", - ts_data->pdata->reset_gpio, ret); - goto err_reset_gpio_dir; - } - msleep(100); - gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); - msleep(20); - gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 1); - msleep(200); - } else { - dev_err(&ts_data->client->dev, "reset gpio not provided\n"); - goto err_reset_gpio_req; - } - - return 0; - -err_reset_gpio_dir: - if (gpio_is_valid(ts_data->pdata->reset_gpio)) - gpio_free(ts_data->pdata->irq_gpio); -err_reset_gpio_req: -err_irq_gpio_dir: - if (gpio_is_valid(ts_data->pdata->irq_gpio)) - gpio_free(ts_data->pdata->irq_gpio); -err_irq_gpio_req: - return ret; - -pwr_deinit: - if (gpio_is_valid(ts_data->pdata->irq_gpio)) - gpio_free(ts_data->pdata->irq_gpio); - if (gpio_is_valid(ts_data->pdata->reset_gpio)) { - gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); - ret = gpio_direction_input(ts_data->pdata->reset_gpio); - if (ret) - dev_err(&ts_data->client->dev, - "Unable to set direction for gpio [%d]\n", - ts_data->pdata->reset_gpio); - gpio_free(ts_data->pdata->reset_gpio); - } - return 0; -} - -#ifdef CONFIG_PM -static int msg21xx_ts_resume(struct device *dev) -{ - int retval; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - if (!ts_data->suspended) { - dev_info(dev, "msg21xx_ts already in resume\n"); - return 0; - } - - mutex_lock(&ts_data->ts_mutex); - - retval = msg21xx_ts_power_on(ts_data, true); - if (retval) { - dev_err(dev, "msg21xx_ts power on failed"); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - - if (ts_data->ts_pinctrl) { - retval = pinctrl_select_state(ts_data->ts_pinctrl, - ts_data->pinctrl_state_active); - if (retval < 0) { - dev_err(dev, "Cannot get active pinctrl state\n"); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - } - - retval = msg21xx_ts_gpio_configure(ts_data, true); - if (retval) { - dev_err(dev, "Failed to put gpios in active state %d", - retval); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - - enable_irq(ts_data->client->irq); - ts_data->suspended = false; - - mutex_unlock(&ts_data->ts_mutex); - - return 0; -} - -static int msg21xx_ts_suspend(struct device *dev) -{ - int retval; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - if (ts_data->pdata->updating_fw) { - dev_info(dev, "Firmware loading in progress\n"); - return 0; - } - - if (ts_data->suspended) { - dev_info(dev, "msg21xx_ts already in suspend\n"); - return 0; - } - -#ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR - if (bEnableTpProximity) { - dev_dbg(dev, "suspend bEnableTpProximity=%d\n", - bEnableTpProximity); - return 0; - } -#endif - - mutex_lock(&ts_data->ts_mutex); - - disable_irq(ts_data->client->irq); - - touch_driver_touch_released(ts_data); - - if (ts_data->ts_pinctrl) { - retval = pinctrl_select_state(ts_data->ts_pinctrl, - ts_data->pinctrl_state_suspend); - if (retval < 0) { - dev_err(dev, "Cannot get idle pinctrl state %d\n", - retval); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - } - - retval = msg21xx_ts_gpio_configure(ts_data, false); - if (retval) { - dev_err(dev, "Failed to put gpios in idle state %d", - retval); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - - retval = msg21xx_ts_power_on(ts_data, false); - if (retval) { - dev_err(dev, "msg21xx_ts power off failed"); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - - ts_data->suspended = true; - - mutex_unlock(&ts_data->ts_mutex); - - return 0; -} -#else -static int msg21xx_ts_resume(struct device *dev) -{ - return 0; -} -static int msg21xx_ts_suspend(struct device *dev) -{ - return 0; -} -#endif - -static int msg21xx_debug_suspend_set(void *_data, u64 val) -{ - struct msg21xx_ts_data *data = _data; - - mutex_lock(&data->input_dev->mutex); - - if (val) - msg21xx_ts_suspend(&data->client->dev); - else - msg21xx_ts_resume(&data->client->dev); - - mutex_unlock(&data->input_dev->mutex); - - return 0; -} - -static int msg21xx_debug_suspend_get(void *_data, u64 *val) -{ - struct msg21xx_ts_data *data = _data; - - mutex_lock(&data->input_dev->mutex); - *val = data->suspended; - mutex_unlock(&data->input_dev->mutex); - - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(debug_suspend_fops, msg21xx_debug_suspend_get, - msg21xx_debug_suspend_set, "%lld\n"); - - -#if defined(CONFIG_FB) -static int fb_notifier_callback(struct notifier_block *self, - unsigned long event, void *data) -{ - struct fb_event *evdata = data; - int *blank; - struct msg21xx_ts_data *ts_data = - container_of(self, struct msg21xx_ts_data, fb_notif); - - if (evdata && evdata->data && event == FB_EVENT_BLANK) { - blank = evdata->data; - if (*blank == FB_BLANK_UNBLANK) - msg21xx_ts_resume(&ts_data->client->dev); - else if (*blank == FB_BLANK_POWERDOWN) - msg21xx_ts_suspend(&ts_data->client->dev); - } - - return 0; -} -#endif - -static int msg21xx_get_dt_coords(struct device *dev, char *name, - struct msg21xx_ts_platform_data *pdata) -{ - u32 coords[FT_COORDS_ARR_SIZE]; - struct property *prop; - struct device_node *np = dev->of_node; - int coords_size, rc; - - prop = of_find_property(np, name, NULL); - if (!prop) - return -EINVAL; - if (!prop->value) - return -ENODATA; - - coords_size = prop->length / sizeof(u32); - if (coords_size != FT_COORDS_ARR_SIZE) { - dev_err(dev, "invalid %s\n", name); - return -EINVAL; - } - - rc = of_property_read_u32_array(np, name, coords, coords_size); - if (rc && (rc != -EINVAL)) { - dev_err(dev, "Unable to read %s\n", name); - return rc; - } - - if (!strcmp(name, "mstar,panel-coords")) { - pdata->panel_minx = coords[0]; - pdata->panel_miny = coords[1]; - pdata->panel_maxx = coords[2]; - pdata->panel_maxy = coords[3]; - } else if (!strcmp(name, "mstar,display-coords")) { - pdata->x_min = coords[0]; - pdata->y_min = coords[1]; - pdata->x_max = coords[2]; - pdata->y_max = coords[3]; - } else { - dev_err(dev, "unsupported property %s\n", name); - return -EINVAL; - } - - return 0; -} - -static int msg21xx_parse_dt(struct device *dev, - struct msg21xx_ts_platform_data *pdata) -{ - int rc; - struct device_node *np = dev->of_node; - struct property *prop; - u32 temp_val; - - rc = msg21xx_get_dt_coords(dev, "mstar,panel-coords", pdata); - if (rc && (rc != -EINVAL)) - return rc; - - rc = msg21xx_get_dt_coords(dev, "mstar,display-coords", pdata); - if (rc) - return rc; - - rc = of_property_read_u32(np, "mstar,hard-reset-delay-ms", - &temp_val); - if (!rc) - pdata->hard_reset_delay_ms = temp_val; - else - return rc; - - rc = of_property_read_u32(np, "mstar,post-hard-reset-delay-ms", - &temp_val); - if (!rc) - pdata->post_hard_reset_delay_ms = temp_val; - else - return rc; - - /* reset, irq gpio info */ - pdata->reset_gpio = of_get_named_gpio_flags(np, "mstar,reset-gpio", - 0, &pdata->reset_gpio_flags); - if (pdata->reset_gpio < 0) - return pdata->reset_gpio; - - pdata->irq_gpio = of_get_named_gpio_flags(np, "mstar,irq-gpio", - 0, &pdata->irq_gpio_flags); - if (pdata->irq_gpio < 0) - return pdata->irq_gpio; - - rc = of_property_read_u32(np, "mstar,ic-type", &temp_val); - if (rc && (rc != -EINVAL)) - return rc; - - pdata->ic_type = temp_val; - - rc = of_property_read_u32(np, "mstar,num-max-touches", &temp_val); - if (!rc) - pdata->num_max_touches = temp_val; - else - return rc; - - prop = of_find_property(np, "mstar,button-map", NULL); - if (prop) { - pdata->num_buttons = prop->length / sizeof(temp_val); - if (pdata->num_buttons > MAX_BUTTONS) - return -EINVAL; - - rc = of_property_read_u32_array(np, - "mstar,button-map", pdata->button_map, - pdata->num_buttons); - if (rc) { - dev_err(dev, "Unable to read key codes\n"); - return rc; - } - } - - return 0; -} - -/* probe function is used for matching and initializing input device */ -static int msg21xx_ts_probe(struct i2c_client *client, - const struct i2c_device_id *id) { - - int ret = 0, i; - struct dentry *temp, *dir; - struct input_dev *input_dev; - struct msg21xx_ts_data *ts_data; - struct msg21xx_ts_platform_data *pdata; - - if (client->dev.of_node) { - pdata = devm_kzalloc(&client->dev, - sizeof(struct msg21xx_ts_platform_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - ret = msg21xx_parse_dt(&client->dev, pdata); - if (ret) { - dev_err(&client->dev, "DT parsing failed\n"); - return ret; - } - } else - pdata = client->dev.platform_data; - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - dev_err(&client->dev, "I2C not supported\n"); - return -ENODEV; - } - - ts_data = devm_kzalloc(&client->dev, - sizeof(struct msg21xx_ts_data), GFP_KERNEL); - if (!ts_data) - return -ENOMEM; - - ts_data->client = client; - ts_data->info.point = devm_kzalloc(&client->dev, - sizeof(struct touchPoint_t) * pdata->num_max_touches, - GFP_KERNEL); - if (!ts_data->info.point) { - dev_err(&client->dev, "Not enough memory\n"); - return -ENOMEM; - } - - /* allocate an input device */ - input_dev = input_allocate_device(); - if (!input_dev) { - ret = -ENOMEM; - dev_err(&client->dev, "input device allocation failed\n"); - goto err_input_allocate_dev; - } - - input_dev->name = client->name; - input_dev->phys = "I2C"; - input_dev->dev.parent = &client->dev; - input_dev->id.bustype = BUS_I2C; - - ts_data->input_dev = input_dev; - ts_data->client = client; - ts_data->pdata = pdata; - - input_set_drvdata(input_dev, ts_data); - i2c_set_clientdata(client, ts_data); - - ret = msg21xx_ts_power_init(ts_data, true); - if (ret) { - dev_err(&client->dev, "Mstar power init failed\n"); - return ret; - } - - ret = msg21xx_ts_power_on(ts_data, true); - if (ret) { - dev_err(&client->dev, "Mstar power on failed\n"); - goto exit_deinit_power; - } - - ret = msg21xx_pinctrl_init(ts_data); - if (!ret && ts_data->ts_pinctrl) { - /* - * Pinctrl handle is optional. If pinctrl handle is found - * let pins to be configured in active state. If not - * found continue further without error. - */ - ret = pinctrl_select_state(ts_data->ts_pinctrl, - ts_data->pinctrl_state_active); - if (ret < 0) - dev_err(&client->dev, - "Failed to select %s pinatate %d\n", - PINCTRL_STATE_ACTIVE, ret); - } - - ret = msg21xx_ts_gpio_configure(ts_data, true); - if (ret) { - dev_err(&client->dev, "Failed to configure gpio %d\n", ret); - goto exit_gpio_config; - } - - if (msg21xx_get_ic_type(ts_data) == 0) { - dev_err(&client->dev, "The current IC is not Mstar\n"); - ret = -1; - goto err_wrong_ic_type; - } - - mutex_init(&msg21xx_mutex); - mutex_init(&ts_data->ts_mutex); - - /* set the supported event type for input device */ - set_bit(EV_ABS, input_dev->evbit); - set_bit(EV_SYN, input_dev->evbit); - set_bit(EV_KEY, input_dev->evbit); - set_bit(BTN_TOUCH, input_dev->keybit); - set_bit(BTN_TOOL_FINGER, input_dev->keybit); - set_bit(INPUT_PROP_DIRECT, input_dev->propbit); - - for (i = 0; i < pdata->num_buttons; i++) - input_set_capability(input_dev, EV_KEY, pdata->button_map[i]); - - input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 2, 0, 0); - input_set_abs_params(input_dev, ABS_MT_POSITION_X, - 0, pdata->x_max, 0, 0); - input_set_abs_params(input_dev, ABS_MT_POSITION_Y, - 0, pdata->y_max, 0, 0); - ret = input_mt_init_slots(input_dev, pdata->num_max_touches, 0); - if (ret) { - dev_err(&client->dev, - "Error %d initialising slots\n", ret); - goto err_free_mem; - } - - /* register the input device to input sub-system */ - ret = input_register_device(input_dev); - if (ret < 0) { - dev_err(&client->dev, - "Unable to register ms-touchscreen input device\n"); - goto err_input_reg_dev; - } - - /* version */ - if (device_create_file(&client->dev, &dev_attr_version) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_version.attr.name); - goto err_create_fw_ver_file; - } - /* update */ - if (device_create_file(&client->dev, &dev_attr_update) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_update.attr.name); - goto err_create_fw_update_file; - } - /* data */ - if (device_create_file(&client->dev, &dev_attr_data) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_data.attr.name); - goto err_create_fw_data_file; - } - /* fw name */ - if (device_create_file(&client->dev, &dev_attr_fw_name) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_fw_name.attr.name); - goto err_create_fw_name_file; - } - /* smart fw update */ - if (device_create_file(&client->dev, &dev_attr_update_fw) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_update_fw.attr.name); - goto err_create_update_fw_file; - } - /* smart fw force update */ - if (device_create_file(&client->dev, - &dev_attr_force_update_fw) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_force_update_fw.attr.name); - goto err_create_force_update_fw_file; - } - dir = debugfs_create_dir(MSTAR_DEBUG_DIR_NAME, NULL); - temp = debugfs_create_file("suspend", S_IRUSR | S_IWUSR, dir, - ts_data, &debug_suspend_fops); - if (temp == NULL || IS_ERR(temp)) { - dev_err(&client->dev, - "debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); - goto free_debug_dir; - } - -#ifdef TP_PRINT - tp_print_create_entry(ts_data); -#endif - - ret = request_threaded_irq(client->irq, NULL, - msg21xx_ts_interrupt, - pdata->irq_gpio_flags | IRQF_ONESHOT, - "msg21xx", ts_data); - if (ret) - goto err_req_irq; - - disable_irq(client->irq); - -#if defined(CONFIG_FB) - ts_data->fb_notif.notifier_call = fb_notifier_callback; - ret = fb_register_client(&ts_data->fb_notif); -#endif - -#ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR - tsps_assist_register_callback("msg21xx", &tsps_msg21xx_enable, - &tsps_msg21xx_data); -#endif - - dev_dbg(&client->dev, "mstar touch screen registered\n"); - enable_irq(client->irq); - return 0; - -err_req_irq: - free_irq(client->irq, ts_data); - device_remove_file(&client->dev, &dev_attr_data); -free_debug_dir: - debugfs_remove_recursive(dir); -err_create_fw_data_file: - device_remove_file(&client->dev, &dev_attr_update); -err_create_fw_update_file: - device_remove_file(&client->dev, &dev_attr_version); -err_create_fw_name_file: - device_remove_file(&client->dev, &dev_attr_fw_name); -err_create_update_fw_file: - device_remove_file(&client->dev, &dev_attr_update_fw); -err_create_force_update_fw_file: - device_remove_file(&client->dev, &dev_attr_force_update_fw); -err_create_fw_ver_file: - input_unregister_device(input_dev); - -err_input_reg_dev: - input_free_device(input_dev); - input_dev = NULL; -err_input_allocate_dev: - mutex_destroy(&msg21xx_mutex); - mutex_destroy(&ts_data->ts_mutex); - -err_wrong_ic_type: - msg21xx_ts_gpio_configure(ts_data, false); -exit_gpio_config: - if (ts_data->ts_pinctrl) { - if (IS_ERR_OR_NULL(ts_data->pinctrl_state_release)) { - devm_pinctrl_put(ts_data->ts_pinctrl); - ts_data->ts_pinctrl = NULL; - } else { - ret = pinctrl_select_state(ts_data->ts_pinctrl, - ts_data->pinctrl_state_release); - if (ret < 0) - dev_err(&ts_data->client->dev, - "Cannot get release pinctrl state\n"); - } - } - msg21xx_ts_power_on(ts_data, false); -exit_deinit_power: - msg21xx_ts_power_init(ts_data, false); -err_free_mem: - input_free_device(input_dev); - - return ret; -} - -/* remove function is triggered when the input device is removed -from input sub-system */ -static int touch_driver_remove(struct i2c_client *client) -{ - int retval = 0; - struct msg21xx_ts_data *ts_data = i2c_get_clientdata(client); - - free_irq(ts_data->client->irq, ts_data); - gpio_free(ts_data->pdata->irq_gpio); - gpio_free(ts_data->pdata->reset_gpio); - - if (ts_data->ts_pinctrl) { - if (IS_ERR_OR_NULL(ts_data->pinctrl_state_release)) { - devm_pinctrl_put(ts_data->ts_pinctrl); - ts_data->ts_pinctrl = NULL; - } else { - retval = pinctrl_select_state(ts_data->ts_pinctrl, - ts_data->pinctrl_state_release); - if (retval < 0) - dev_err(&ts_data->client->dev, - "Cannot get release pinctrl state\n"); - } - } - - input_unregister_device(ts_data->input_dev); - mutex_destroy(&msg21xx_mutex); - mutex_destroy(&ts_data->ts_mutex); - - return retval; -} - -/* The I2C device list is used for matching I2C device -and I2C device driver. */ -static const struct i2c_device_id touch_device_id[] = { - {"msg21xx", 0}, - {}, /* should not omitted */ -}; - -static struct of_device_id msg21xx_match_table[] = { - { .compatible = "mstar,msg21xx", }, - { }, -}; - -MODULE_DEVICE_TABLE(i2c, touch_device_id); - -static struct i2c_driver touch_device_driver = { - .driver = { - .name = "ms-msg21xx", - .owner = THIS_MODULE, - .of_match_table = msg21xx_match_table, - }, - .probe = msg21xx_ts_probe, - .remove = touch_driver_remove, - .id_table = touch_device_id, -}; - -module_i2c_driver(touch_device_driver); - -#ifdef TP_PRINT -#include - -static unsigned short InfoAddr = 0x0F, PoolAddr = 0x10, TransLen = 256; -static unsigned char row, units, cnt; - -static int tp_print_proc_read(struct msg21xx_ts_data *ts_data) -{ - unsigned short i, j; - unsigned short left, offset = 0; - unsigned char dbbus_tx_data[3] = {0}; - unsigned char u8Data; - signed short s16Data; - int s32Data; - char *buf = NULL; - - left = cnt*row*units; - if ((ts_data->suspended == 0) && - (InfoAddr != 0x0F) && - (PoolAddr != 0x10) && - (left > 0)) { - buf = kmalloc(left, GFP_KERNEL); - if (buf != NULL) { - - while (left > 0) { - dbbus_tx_data[0] = 0x53; - dbbus_tx_data[1] = ((PoolAddr + offset) >> 8) - & 0xFF; - dbbus_tx_data[2] = (PoolAddr + offset) & 0xFF; - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data, ts_data->client->addr, - &dbbus_tx_data[0], 3); - read_i2c_seq(ts_data, ts_data->client->addr, - &buf[offset], - left > TransLen ? TransLen : left); - mutex_unlock(&msg21xx_mutex); - - if (left > TransLen) { - left -= TransLen; - offset += TransLen; - } else { - left = 0; - } - } - - for (i = 0; i < cnt; i++) { - for (j = 0; j < row; j++) { - if (units == 1) { - u8Data = buf[i * row * units + - j * units]; - } else if (units == 2) { - s16Data = buf[i * row * units + - j * units] + - (buf[i * row * units + - j * units + 1] << 8); - } else if (units == 4) { - s32Data = buf[i * row * units + - j * units] + - (buf[i * row * units + - j * units + 1] << 8) + - (buf[i * row * units + - j * units + 2] << 16) + - (buf[i * row * units + - j * units + 3] << 24); - } - } - } - - kfree(buf); - } - } - - return 0; -} - -static void tp_print_create_entry(struct msg21xx_ts_data *ts_data) -{ - unsigned char dbbus_tx_data[3] = {0}; - unsigned char dbbus_rx_data[8] = {0}; - - dbbus_tx_data[0] = 0x53; - dbbus_tx_data[1] = 0x00; - dbbus_tx_data[2] = 0x58; - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data, ts_data->client->addr, &dbbus_tx_data[0], 3); - read_i2c_seq(ts_data, ts_data->client->addr, &dbbus_rx_data[0], 4); - mutex_unlock(&msg21xx_mutex); - InfoAddr = (dbbus_rx_data[1]<<8) + dbbus_rx_data[0]; - PoolAddr = (dbbus_rx_data[3]<<8) + dbbus_rx_data[2]; - - if ((InfoAddr != 0x0F) && (PoolAddr != 0x10)) { - msleep(20); - dbbus_tx_data[0] = 0x53; - dbbus_tx_data[1] = (InfoAddr >> 8) & 0xFF; - dbbus_tx_data[2] = InfoAddr & 0xFF; - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data, ts_data->client->addr, - &dbbus_tx_data[0], 3); - read_i2c_seq(ts_data, ts_data->client->addr, - &dbbus_rx_data[0], 8); - mutex_unlock(&msg21xx_mutex); - - units = dbbus_rx_data[0]; - row = dbbus_rx_data[1]; - cnt = dbbus_rx_data[2]; - TransLen = (dbbus_rx_data[7]<<8) + dbbus_rx_data[6]; - - if (device_create_file(&ts_data->client->dev, - &dev_attr_tpp) < 0) - dev_err(&ts_data->client->dev, "Failed to create device file(%s)!\n", - dev_attr_tpp.attr.name); - } -} -#endif - -MODULE_AUTHOR("MStar Semiconductor, Inc."); -MODULE_LICENSE("GPL v2"); From 18f49d30507e0479281cd75b4ba5125b776a7c72 Mon Sep 17 00:00:00 2001 From: Siena Richard Date: Thu, 26 Jan 2017 15:02:42 -0800 Subject: [PATCH 0643/1015] drivers: soc: add mutex to prevent response being processed twice Add a mutex to prevent two threads from processing the same response at the same time. This ensures responses are processed completely and sequentially. CRs-Fixed: 1116015 Change-Id: Id2ef32edb939f8af2850b54bd6f6f447939c0732 Signed-off-by: Siena Richard --- drivers/soc/qcom/qdsp6v2/voice_svc.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/soc/qcom/qdsp6v2/voice_svc.c b/drivers/soc/qcom/qdsp6v2/voice_svc.c index 50dd9256b270f..10f71b85a15b9 100644 --- a/drivers/soc/qcom/qdsp6v2/voice_svc.c +++ b/drivers/soc/qcom/qdsp6v2/voice_svc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -42,6 +42,12 @@ struct voice_svc_prvt { struct list_head response_queue; wait_queue_head_t response_wait; spinlock_t response_lock; + /* + * This mutex ensures responses are processed in sequential order and + * that no two threads access and free the same response at the same + * time. + */ + struct mutex response_mutex_lock; }; struct apr_data { @@ -467,6 +473,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, goto done; } + mutex_lock(&prtd->response_mutex_lock); spin_lock_irqsave(&prtd->response_lock, spin_flags); if (list_empty(&prtd->response_queue)) { @@ -480,7 +487,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, pr_debug("%s: Read timeout\n", __func__); ret = -ETIMEDOUT; - goto done; + goto unlock; } else if (ret > 0 && !list_empty(&prtd->response_queue)) { pr_debug("%s: Interrupt recieved for response\n", __func__); @@ -488,7 +495,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, pr_debug("%s: Interrupted by SIGNAL %d\n", __func__, ret); - goto done; + goto unlock; } spin_lock_irqsave(&prtd->response_lock, spin_flags); @@ -507,7 +514,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, __func__, count, size); ret = -ENOMEM; - goto done; + goto unlock; } if (!access_ok(VERIFY_WRITE, arg, size)) { @@ -515,7 +522,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, __func__); ret = -EPERM; - goto done; + goto unlock; } ret = copy_to_user(arg, &resp->resp, @@ -525,7 +532,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, pr_err("%s: copy_to_user failed %d\n", __func__, ret); ret = -EPERM; - goto done; + goto unlock; } spin_lock_irqsave(&prtd->response_lock, spin_flags); @@ -539,6 +546,8 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, ret = count; +unlock: + mutex_unlock(&prtd->response_mutex_lock); done: return ret; } @@ -594,6 +603,7 @@ static int voice_svc_open(struct inode *inode, struct file *file) INIT_LIST_HEAD(&prtd->response_queue); init_waitqueue_head(&prtd->response_wait); spin_lock_init(&prtd->response_lock); + mutex_init(&prtd->response_mutex_lock); file->private_data = (void *)prtd; /* Current APR implementation doesn't support session based @@ -644,6 +654,7 @@ static int voice_svc_release(struct inode *inode, struct file *file) pr_err("%s: Failed to dereg MVM %d\n", __func__, ret); } + mutex_lock(&prtd->response_mutex_lock); spin_lock_irqsave(&prtd->response_lock, spin_flags); while (!list_empty(&prtd->response_queue)) { @@ -657,6 +668,9 @@ static int voice_svc_release(struct inode *inode, struct file *file) } spin_unlock_irqrestore(&prtd->response_lock, spin_flags); + mutex_unlock(&prtd->response_mutex_lock); + + mutex_destroy(&prtd->response_mutex_lock); kfree(file->private_data); file->private_data = NULL; From 4b5893db9b6081d9d1eed449b2523cb518745eaf Mon Sep 17 00:00:00 2001 From: Arumuga Durai A Date: Thu, 9 Feb 2017 13:19:17 +0530 Subject: [PATCH 0644/1015] USB: gadget: Replace %pK with %pM commit 7d08f0c4e3b7c35e ("usb: gadget: replace %p with %pK") modifies the %pM (MAC address format specifier) as %pKM in usb drivers. when usb composition switch happens ecm function bind_config() access the invalid host's ethernet address and leads usb enumeration failure. Fix this by replace %pKM with %pM only for usb-eth module. Change-Id: I29364891fbdf381b5a6ea360ecdbe3ef237f24bd Signed-off-by: Arumuga Durai A --- drivers/usb/gadget/function/f_gsi.c | 4 ++-- drivers/usb/gadget/function/f_qc_ecm.c | 2 +- drivers/usb/gadget/function/f_qc_rndis.c | 2 +- drivers/usb/gadget/function/u_ether.c | 10 +++++----- drivers/usb/gadget/function/u_qc_ether.c | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/usb/gadget/function/f_gsi.c b/drivers/usb/gadget/function/f_gsi.c index 30686a29e9fca..51110b1a16e0d 100644 --- a/drivers/usb/gadget/function/f_gsi.c +++ b/drivers/usb/gadget/function/f_gsi.c @@ -2689,7 +2689,7 @@ static int gsi_bind(struct usb_configuration *c, struct usb_function *f) /* export host's Ethernet address in CDC format */ random_ether_addr(gsi->d_port.ipa_init_params.device_ethaddr); random_ether_addr(gsi->d_port.ipa_init_params.host_ethaddr); - log_event_dbg("setting host_ethaddr=%pKM, device_ethaddr = %pKM", + log_event_dbg("setting host_ethaddr=%pM, device_ethaddr = %pM", gsi->d_port.ipa_init_params.host_ethaddr, gsi->d_port.ipa_init_params.device_ethaddr); memcpy(gsi->ethaddr, &gsi->d_port.ipa_init_params.host_ethaddr, @@ -2821,7 +2821,7 @@ static int gsi_bind(struct usb_configuration *c, struct usb_function *f) /* export host's Ethernet address in CDC format */ random_ether_addr(gsi->d_port.ipa_init_params.device_ethaddr); random_ether_addr(gsi->d_port.ipa_init_params.host_ethaddr); - log_event_dbg("setting host_ethaddr=%pKM, device_ethaddr = %pKM", + log_event_dbg("setting host_ethaddr=%pM, device_ethaddr = %pM", gsi->d_port.ipa_init_params.host_ethaddr, gsi->d_port.ipa_init_params.device_ethaddr); diff --git a/drivers/usb/gadget/function/f_qc_ecm.c b/drivers/usb/gadget/function/f_qc_ecm.c index 6b7a3a87b97e4..847eb953ec61c 100644 --- a/drivers/usb/gadget/function/f_qc_ecm.c +++ b/drivers/usb/gadget/function/f_qc_ecm.c @@ -1133,7 +1133,7 @@ ecm_qc_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], if (ecm->xport != USB_GADGET_XPORT_BAM2BAM_IPA) return status; - pr_debug("setting ecm_ipa, host_ethaddr=%pKM, device_ethaddr=%pKM", + pr_debug("setting ecm_ipa, host_ethaddr=%pM, device_ethaddr=%pM", ipa_params.host_ethaddr, ipa_params.device_ethaddr); status = ecm_ipa_init(&ipa_params); if (status) { diff --git a/drivers/usb/gadget/function/f_qc_rndis.c b/drivers/usb/gadget/function/f_qc_rndis.c index f2553f52ebfe1..b74462750a4a1 100644 --- a/drivers/usb/gadget/function/f_qc_rndis.c +++ b/drivers/usb/gadget/function/f_qc_rndis.c @@ -1234,7 +1234,7 @@ rndis_qc_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], if (rndis->xport == USB_GADGET_XPORT_BAM2BAM_IPA) { gether_qc_get_macs(rndis_ipa_params.device_ethaddr, rndis_ipa_params.host_ethaddr); - pr_debug("setting host_ethaddr=%pKM, device_ethaddr=%pKM\n", + pr_debug("setting host_ethaddr=%pM, device_ethaddr=%pM\n", rndis_ipa_params.host_ethaddr, rndis_ipa_params.device_ethaddr); rndis_ipa_supported = true; diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c index 0ded969cd8149..5458b6b6d8158 100644 --- a/drivers/usb/gadget/function/u_ether.c +++ b/drivers/usb/gadget/function/u_ether.c @@ -1757,8 +1757,8 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g, free_netdev(net); dev = ERR_PTR(status); } else { - INFO(dev, "MAC %pKM\n", net->dev_addr); - INFO(dev, "HOST MAC %pKM\n", dev->host_mac); + INFO(dev, "MAC %pM\n", net->dev_addr); + INFO(dev, "HOST MAC %pM\n", dev->host_mac); /* * two kinds of host-initiated state changes: @@ -1839,7 +1839,7 @@ int gether_register_netdev(struct net_device *net) dev_dbg(&g->dev, "register_netdev failed, %d\n", status); return status; } else { - INFO(dev, "HOST MAC %pKM\n", dev->host_mac); + INFO(dev, "HOST MAC %pM\n", dev->host_mac); /* two kinds of host-initiated state changes: * - iff DATA transfer is active, carrier is "on" @@ -1855,7 +1855,7 @@ int gether_register_netdev(struct net_device *net) if (status) pr_warn("cannot set self ethernet address: %d\n", status); else - INFO(dev, "MAC %pKM\n", dev->dev_mac); + INFO(dev, "MAC %pM\n", dev->dev_mac); return status; } @@ -1923,7 +1923,7 @@ int gether_get_host_addr_cdc(struct net_device *net, char *host_addr, int len) return -EINVAL; dev = netdev_priv(net); - snprintf(host_addr, len, "%pKm", dev->host_mac); + snprintf(host_addr, len, "%pM", dev->host_mac); return strlen(host_addr); } diff --git a/drivers/usb/gadget/function/u_qc_ether.c b/drivers/usb/gadget/function/u_qc_ether.c index 377fd50b0f3a8..118bab4477ce1 100644 --- a/drivers/usb/gadget/function/u_qc_ether.c +++ b/drivers/usb/gadget/function/u_qc_ether.c @@ -317,8 +317,8 @@ int gether_qc_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN], dev_dbg(&g->dev, "register_netdev failed, %d\n", status); free_netdev(net); } else { - INFO(dev, "MAC %pKM\n", net->dev_addr); - INFO(dev, "HOST MAC %pKM\n", dev->host_mac); + INFO(dev, "MAC %pM\n", net->dev_addr); + INFO(dev, "HOST MAC %pM\n", dev->host_mac); } From 891b176839f3defdd56b274f224b8095861da34f Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Tue, 7 Feb 2017 10:17:25 -0800 Subject: [PATCH 0645/1015] msm: camera: sensor: Validate destination step position dest_step_position is sent from userspace and is used in kernel to calculate the final DAC value. dest_step_position must be validated against total steps. Actuator will have an unexpected behavior if lens value is programed to actuator based on invalid dest_step_position. CRs-Fixed: 1102580 Change-Id: Idcd97043d3bd583d8577233d446a99d1829a4ee6 Signed-off-by: Rajesh Bondugula --- .../platform/msm/camera_v2/sensor/actuator/msm_actuator.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c index 4b6005b9af46e..0641eb7fe5b7a 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -528,6 +528,12 @@ static int32_t msm_actuator_piezo_move_focus( return -EFAULT; } + if (dest_step_position > a_ctrl->total_steps) { + pr_err("Step pos greater than total steps = %d\n", + dest_step_position); + return -EFAULT; + } + a_ctrl->i2c_tbl_index = 0; a_ctrl->func_tbl->actuator_parse_i2c_params(a_ctrl, (num_steps * From 1070e575b5d0f092b12ada7d6ca7c2f41aa8daaa Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Wed, 25 Jan 2017 16:38:48 +0530 Subject: [PATCH 0646/1015] msm: mdss: handle synchronization issues during DSI debugfs read/write Handle race condition during read/write operations to DSI debugfs nodes related to DSI panel ON/OFF commands. Change-Id: I29c4ad74bf21d4cb5362565e902a682fe7263147 Signed-off-by: Padmanabhan Komanduru --- drivers/video/msm/mdss/mdss_dsi.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c index b0ad043b2053e..5261d635e20eb 100644 --- a/drivers/video/msm/mdss/mdss_dsi.c +++ b/drivers/video/msm/mdss/mdss_dsi.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -625,6 +625,7 @@ struct buf_data { char *string_buf; /* cmd buf as string, 3 bytes per number */ int sblen; /* string buffer length */ int sync_flag; + struct mutex dbg_mutex; /* mutex to synchronize read/write/flush */ }; struct mdss_dsi_debugfs_info { @@ -714,6 +715,7 @@ static ssize_t mdss_dsi_cmd_read(struct file *file, char __user *buf, char *bp; ssize_t ret = 0; + mutex_lock(&pcmds->dbg_mutex); if (*ppos == 0) { kfree(pcmds->string_buf); pcmds->string_buf = NULL; @@ -732,6 +734,7 @@ static ssize_t mdss_dsi_cmd_read(struct file *file, char __user *buf, buffer = kmalloc(bsize, GFP_KERNEL); if (!buffer) { pr_err("%s: Failed to allocate memory\n", __func__); + mutex_unlock(&pcmds->dbg_mutex); return -ENOMEM; } @@ -767,10 +770,12 @@ static ssize_t mdss_dsi_cmd_read(struct file *file, char __user *buf, kfree(pcmds->string_buf); pcmds->string_buf = NULL; pcmds->sblen = 0; + mutex_unlock(&pcmds->dbg_mutex); return 0; /* the end */ } ret = simple_read_from_buffer(buf, count, ppos, pcmds->string_buf, pcmds->sblen); + mutex_unlock(&pcmds->dbg_mutex); return ret; } @@ -782,6 +787,7 @@ static ssize_t mdss_dsi_cmd_write(struct file *file, const char __user *p, int blen = 0; char *string_buf; + mutex_lock(&pcmds->dbg_mutex); if (*ppos == 0) { kfree(pcmds->string_buf); pcmds->string_buf = NULL; @@ -793,6 +799,7 @@ static ssize_t mdss_dsi_cmd_write(struct file *file, const char __user *p, string_buf = krealloc(pcmds->string_buf, blen + 1, GFP_KERNEL); if (!string_buf) { pr_err("%s: Failed to allocate memory\n", __func__); + mutex_unlock(&pcmds->dbg_mutex); return -ENOMEM; } @@ -802,6 +809,7 @@ static ssize_t mdss_dsi_cmd_write(struct file *file, const char __user *p, string_buf[blen] = '\0'; pcmds->string_buf = string_buf; pcmds->sblen = blen; + mutex_unlock(&pcmds->dbg_mutex); return ret; } @@ -812,8 +820,12 @@ static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id) char *buf, *bufp, *bp; struct dsi_ctrl_hdr *dchdr; - if (!pcmds->string_buf) + mutex_lock(&pcmds->dbg_mutex); + + if (!pcmds->string_buf) { + mutex_unlock(&pcmds->dbg_mutex); return 0; + } /* * Allocate memory for command buffer @@ -826,6 +838,7 @@ static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id) kfree(pcmds->string_buf); pcmds->string_buf = NULL; pcmds->sblen = 0; + mutex_unlock(&pcmds->dbg_mutex); return -ENOMEM; } @@ -850,6 +863,7 @@ static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id) pr_err("%s: dtsi cmd=%x error, len=%d\n", __func__, dchdr->dtype, dchdr->dlen); kfree(buf); + mutex_unlock(&pcmds->dbg_mutex); return -EINVAL; } bp += sizeof(*dchdr); @@ -861,6 +875,7 @@ static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id) pr_err("%s: dcs_cmd=%x len=%d error!\n", __func__, bp[0], len); kfree(buf); + mutex_unlock(&pcmds->dbg_mutex); return -EINVAL; } @@ -873,6 +888,7 @@ static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id) pcmds->buf = buf; pcmds->blen = blen; } + mutex_unlock(&pcmds->dbg_mutex); return 0; } @@ -887,6 +903,7 @@ struct dentry *dsi_debugfs_create_dcs_cmd(const char *name, umode_t mode, struct dentry *parent, struct buf_data *cmd, struct dsi_panel_cmds ctrl_cmds) { + mutex_init(&cmd->dbg_mutex); cmd->buf = ctrl_cmds.buf; cmd->blen = ctrl_cmds.blen; cmd->string_buf = NULL; From 930ccf906d4874f2dd66e4796a8468b4bbcd3c5b Mon Sep 17 00:00:00 2001 From: Ankit Sharma Date: Thu, 9 Feb 2017 16:23:09 +0530 Subject: [PATCH 0647/1015] leds: qpnp-flash: Fix Use-after-free(UAF) for debugfs Fix UAF where two threads can open and close the same file. Second open will cause the private data for the first file to be overwritten. When the first file is closed and the private data is freed, this makes the now-shared private data OOB for the second thread. CRs-Fixed: 1109763 Change-Id: I1c4618d5be99e140abf0f3ea0d7f485897db5ab2 Signed-off-by: Ankit Sharma --- drivers/leds/leds-qpnp-flash.c | 82 ++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/drivers/leds/leds-qpnp-flash.c b/drivers/leds/leds-qpnp-flash.c index 8924575f0c7d5..26a99c5869565 100644 --- a/drivers/leds/leds-qpnp-flash.c +++ b/drivers/leds/leds-qpnp-flash.c @@ -222,11 +222,13 @@ struct flash_led_platform_data { }; struct qpnp_flash_led_buffer { - struct mutex debugfs_lock; /* Prevent thread concurrency */ - size_t rpos; - size_t wpos; - size_t len; - char data[0]; + struct mutex debugfs_lock; /* Prevent thread concurrency */ + size_t rpos; + size_t wpos; + size_t len; + struct qpnp_flash_led *led; + u32 buffer_cnt; + char data[0]; }; /* @@ -244,10 +246,8 @@ struct qpnp_flash_led { struct workqueue_struct *ordered_workq; struct qpnp_vadc_chip *vadc_dev; struct mutex flash_led_lock; - struct qpnp_flash_led_buffer *log; struct dentry *dbgfs_root; int num_leds; - u32 buffer_cnt; u16 base; u16 current_addr; u16 current2_addr; @@ -279,10 +279,10 @@ static int flash_led_dbgfs_file_open(struct qpnp_flash_led *led, log->wpos = 0; log->len = logbufsize - sizeof(*log); mutex_init(&log->debugfs_lock); - led->log = log; + log->led = led; - led->buffer_cnt = 1; - file->private_data = led; + log->buffer_cnt = 1; + file->private_data = log; return 0; } @@ -296,12 +296,12 @@ static int flash_led_dfs_open(struct inode *inode, struct file *file) static int flash_led_dfs_close(struct inode *inode, struct file *file) { - struct qpnp_flash_led *led = file->private_data; + struct qpnp_flash_led_buffer *log = file->private_data; - if (led && led->log) { + if (log) { file->private_data = NULL; - mutex_destroy(&led->log->debugfs_lock); - kfree(led->log); + mutex_destroy(&log->debugfs_lock); + kfree(log); } return 0; @@ -330,15 +330,21 @@ static int print_to_log(struct qpnp_flash_led_buffer *log, static ssize_t flash_led_dfs_latched_reg_read(struct file *fp, char __user *buf, size_t count, loff_t *ppos) { - struct qpnp_flash_led *led = fp->private_data; - struct qpnp_flash_led_buffer *log = led->log; + struct qpnp_flash_led_buffer *log = fp->private_data; + struct qpnp_flash_led *led; u8 val; int rc = 0; size_t len; size_t ret; + if (!log) { + pr_err("error: file private data is NULL\n"); + return -EFAULT; + } + led = log->led; + mutex_lock(&log->debugfs_lock); - if ((log->rpos >= log->wpos && led->buffer_cnt == 0) || + if ((log->rpos >= log->wpos && log->buffer_cnt == 0) || ((log->len - log->wpos) < MIN_BUFFER_WRITE_LEN)) goto unlock_mutex; @@ -350,7 +356,7 @@ static ssize_t flash_led_dfs_latched_reg_read(struct file *fp, char __user *buf, INT_LATCHED_STS(led->base), rc); goto unlock_mutex; } - led->buffer_cnt--; + log->buffer_cnt--; rc = print_to_log(log, "0x%05X ", INT_LATCHED_STS(led->base)); if (rc == 0) @@ -385,18 +391,24 @@ static ssize_t flash_led_dfs_latched_reg_read(struct file *fp, char __user *buf, static ssize_t flash_led_dfs_fault_reg_read(struct file *fp, char __user *buf, size_t count, loff_t *ppos) { - struct qpnp_flash_led *led = fp->private_data; - struct qpnp_flash_led_buffer *log = led->log; + struct qpnp_flash_led_buffer *log = fp->private_data; + struct qpnp_flash_led *led; int rc = 0; size_t len; size_t ret; + if (!log) { + pr_err("error: file private data is NULL\n"); + return -EFAULT; + } + led = log->led; + mutex_lock(&log->debugfs_lock); - if ((log->rpos >= log->wpos && led->buffer_cnt == 0) || + if ((log->rpos >= log->wpos && log->buffer_cnt == 0) || ((log->len - log->wpos) < MIN_BUFFER_WRITE_LEN)) goto unlock_mutex; - led->buffer_cnt--; + log->buffer_cnt--; rc = print_to_log(log, "0x%05X ", FLASH_LED_FAULT_STATUS(led->base)); if (rc == 0) @@ -438,10 +450,17 @@ static ssize_t flash_led_dfs_fault_reg_enable(struct file *file, int data; size_t ret = 0; - struct qpnp_flash_led *led = file->private_data; + struct qpnp_flash_led_buffer *log = file->private_data; + struct qpnp_flash_led *led; char *kbuf; - mutex_lock(&led->log->debugfs_lock); + if (!log) { + pr_err("error: file private data is NULL\n"); + return -EFAULT; + } + led = log->led; + + mutex_lock(&log->debugfs_lock); kbuf = kmalloc(count + 1, GFP_KERNEL); if (!kbuf) { ret = -ENOMEM; @@ -476,7 +495,7 @@ static ssize_t flash_led_dfs_fault_reg_enable(struct file *file, free_buf: kfree(kbuf); unlock_mutex: - mutex_unlock(&led->log->debugfs_lock); + mutex_unlock(&log->debugfs_lock); return ret; } @@ -488,10 +507,17 @@ static ssize_t flash_led_dfs_dbg_enable(struct file *file, int cnt = 0; int data; size_t ret = 0; - struct qpnp_flash_led *led = file->private_data; + struct qpnp_flash_led_buffer *log = file->private_data; + struct qpnp_flash_led *led; char *kbuf; - mutex_lock(&led->log->debugfs_lock); + if (!log) { + pr_err("error: file private data is NULL\n"); + return -EFAULT; + } + led = log->led; + + mutex_lock(&log->debugfs_lock); kbuf = kmalloc(count + 1, GFP_KERNEL); if (!kbuf) { ret = -ENOMEM; @@ -525,7 +551,7 @@ static ssize_t flash_led_dfs_dbg_enable(struct file *file, free_buf: kfree(kbuf); unlock_mutex: - mutex_unlock(&led->log->debugfs_lock); + mutex_unlock(&log->debugfs_lock); return ret; } From 042ec275586f0f9a99655626a4dd0096e10f1e5a Mon Sep 17 00:00:00 2001 From: Sandeep Panda Date: Mon, 23 Jan 2017 16:48:23 +0530 Subject: [PATCH 0648/1015] msm: mdss: ensure proper state transition during ULPS exit During stress environment, sometimes DSI ULPS exit sequence does not work properly. Add memory barriers while programing DSI lane register to ensure proper state transition of DSI lane during ULPS exit. Change-Id: Ib50958cf342bf23ab44f5a9d3bdf60adad824145 Signed-off-by: Sandeep Panda --- drivers/video/msm/mdss/msm_mdss_io_8974.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/msm_mdss_io_8974.c b/drivers/video/msm/mdss/msm_mdss_io_8974.c index 0e11453c15f2b..348a699dced35 100644 --- a/drivers/video/msm/mdss/msm_mdss_io_8974.c +++ b/drivers/video/msm/mdss/msm_mdss_io_8974.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1796,8 +1796,10 @@ static int mdss_dsi_ulps_config(struct mdss_dsi_ctrl_pdata *ctrl, * to be in stop state. */ MIPI_OUTP(ctrl->ctrl_base + 0x0AC, active_lanes << 16); + wmb(); /* ensure lanes are put to stop state */ MIPI_OUTP(ctrl->ctrl_base + 0x0AC, 0x0); + wmb(); /* ensure lanes are in proper state */ /* * Wait for a short duration before enabling From 430deb1a0956295834e5c4d00f053812e18fd92d Mon Sep 17 00:00:00 2001 From: Agrawal Ashish Date: Thu, 9 Feb 2017 13:22:33 +0530 Subject: [PATCH 0649/1015] msm: wlan: update regulatory database Incorporate the 2016-10-31 updates to the internal regulatory database. Update countries Bahrain, Belize, Chile, Egypt, Honduras, India, S Korea, Nepal, Panama, Russia, Senegal, TT and UAE. Also update St. Kitts&Navis and St. Lucia dfs region. Change-Id: Ia151b2dd5229f07790ac961af298305b24e098fb CRs-Fixed: 1091511 Signed-off-by: Amar Singhal Signed-off-by: Agrawal Ashish --- net/wireless/db.txt | 98 ++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 51 deletions(-) diff --git a/net/wireless/db.txt b/net/wireless/db.txt index bfa4c7f12586c..a8bb6177bc904 100644 --- a/net/wireless/db.txt +++ b/net/wireless/db.txt @@ -16,7 +16,7 @@ country 00: (57240 - 63720 @ 2160), (0) -country AE: DFS-FCC +country AE: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (24), AUTO-BW (5250 - 5330 @ 80), (24), DFS, AUTO-BW @@ -52,13 +52,12 @@ country AN: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS -country AR: DFS-FCC - (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5590 @ 80), (24), DFS - (5650 - 5730 @ 80), (24), DFS - (5735 - 5835 @ 80), (30) +country AR: + (2402 - 2482 @ 40), (36) + (5170 - 5330 @ 160), (23) + (5490 - 5590 @ 80), (36) + (5650 - 5730 @ 80), (36) + (5735 - 5835 @ 80), (36) country AS: DFS-FCC (2402 - 2472 @ 40), (30) @@ -162,11 +161,10 @@ country BG: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country BH: DFS-ETSI +country BH: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 20), (20) - (5250 - 5330 @ 20), (20), DFS - (5735 - 5835 @ 20), (20) + (5170 - 5330 @ 20), (23) + (5735 - 5835 @ 20), (33) country BL: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -219,8 +217,10 @@ country BY: DFS-ETSI (5490 - 5710 @ 160), (27), DFS country BZ: - (2402 - 2482 @ 40), (30) - (5735 - 5835 @ 80), (30) + (2402 - 2482 @ 40), (36) + (5170 - 5330 @ 160), (27) + (5490 - 5730 @ 160), (36) + (5735 - 5835 @ 80), (36) country CA: DFS-FCC (2402 - 2472 @ 40), (30) @@ -259,10 +259,9 @@ country CI: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) -country CL: DFS-ETSI +country CL: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5170 - 5330 @ 160), (20) (5735 - 5835 @ 80), (20) country CN: DFS-FCC @@ -426,8 +425,8 @@ country EE: DFS-ETSI country EG: DFS-ETSI (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 40), (20) - (5250 - 5330 @ 40), (20), DFS + (5170 - 5250 @ 40), (23) + (5250 - 5330 @ 40), (23), DFS country ES: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -590,11 +589,10 @@ country HK: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) -country HN: DFS-FCC +country HN: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5730 @ 160), (24), DFS + (5170 - 5330 @ 160), (24) + (5490 - 5730 @ 160), (24) (5735 - 5835 @ 80), (30) country HR: DFS-ETSI @@ -666,11 +664,10 @@ country IL: DFS-ETSI (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW -country IN: DFS-ETSI +country IN: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW - (5735 - 5835 @ 80), (20) + (5170 - 5330 @ 160), (23) + (5735 - 5835 @ 80), (30) country IR: (2402 - 2482 @ 40), (20) @@ -744,7 +741,7 @@ country KH: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS -country KN: DFS-ETSI +country KN: DFS-FCC (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW @@ -755,8 +752,11 @@ country KR: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW - (5490 - 5630 @ 80), (30), DFS - (5735 - 5815 @ 80), (30) + (5490 - 5710 @ 80), (30), DFS + (5735 - 5835 @ 80), (30) + # 60 GHz band channels 1-4, + # ref: http://www.law.go.kr/%ED%96%89%EC%A0%95%EA%B7%9C%EC%B9%99/%EB%AC%B4%EC%84%A0%EC%84%A4%EB%B9%84%EA%B7%9C%EC%B9%99 + (57000 - 66000 @ 2160), (43) country KP: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -787,7 +787,7 @@ country LB: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) -country LC: DFS-ETSI +country LC: DFS-FCC (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW @@ -1046,10 +1046,9 @@ country NO: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country NP: DFS-ETSI +country NP: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5170 - 5330 @ 160), (20) (5735 - 5835 @ 80), (20) country NZ: DFS-FCC @@ -1065,11 +1064,11 @@ country OM: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS -country PA: DFS-FCC +country PA: (2402 - 2472 @ 40), (30) - (5170 - 5250 @ 80), (17), AUTO-BW - (5250 - 5330 @ 80), (23), DFS, AUTO-BW - (5735 - 5835 @ 80), (30) + (5170 - 5250 @ 80), (23), AUT0-BW + (5250 - 5330 @ 80), (30), AUTO-BW + (5735 - 5835 @ 80), (36) country PE: DFS-FCC (2402 - 2482 @ 40), (20) @@ -1207,11 +1206,10 @@ country RS: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country RU: DFS-ETSI +country RU: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW - (5650 - 5710 @ 40), (30), DFS + (5170 - 5330 @ 160), (23) + (5490 - 5730 @ 160), (30) (5735 - 5835 @ 80), (30) country RW: DFS-FCC @@ -1285,11 +1283,10 @@ country SK: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country SN: DFS-FCC +country SN: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5730 @ 160), (24), DFS + (5170 - 5330 @ 160), (24) + (5490 - 5730 @ 160), (24) (5735 - 5835 @ 80), (30) country SR: DFS-ETSI @@ -1346,12 +1343,11 @@ country TR: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country TT: DFS-FCC +country TT: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5730 @ 160), (24), DFS - (5735 - 5835 @ 80), (30) + (5170 - 5330 @ 160), (27) + (5490 - 5730 @ 160), (36) + (5735 - 5835 @ 80), (36) country TW: DFS-FCC (2402 - 2472 @ 40), (30) From f991ded7ef0622cf99166d647203850dafdbb00a Mon Sep 17 00:00:00 2001 From: Mohammed Khajapasha Date: Mon, 20 Feb 2017 11:38:14 +0530 Subject: [PATCH 0650/1015] ARM: dts: msm: Update L1 D/I cache dump ids for msm8917 Update L1 D/I cache dump table ids for msm8917 target. Change-Id: I72225d87f8c57aeb79ee5d441d8dbef3eb643f64 Signed-off-by: Mohammed Khajapasha --- arch/arm/boot/dts/qcom/msm8917-cpu.dtsi | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8917-cpu.dtsi b/arch/arm/boot/dts/qcom/msm8917-cpu.dtsi index 4cba7fbeec939..c825df3cb7b05 100644 --- a/arch/arm/boot/dts/qcom/msm8917-cpu.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-cpu.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -162,35 +162,35 @@ }; qcom,l1_i_cache100 { qcom,dump-node = <&L1_I_100>; - qcom,dump-id = <0x64>; + qcom,dump-id = <0x60>; }; qcom,l1_i_cache101 { qcom,dump-node = <&L1_I_101>; - qcom,dump-id = <0x65>; + qcom,dump-id = <0x61>; }; qcom,l1_i_cache102 { qcom,dump-node = <&L1_I_102>; - qcom,dump-id = <0x66>; + qcom,dump-id = <0x62>; }; qcom,l1_i_cache103 { qcom,dump-node = <&L1_I_103>; - qcom,dump-id = <0x67>; + qcom,dump-id = <0x63>; }; qcom,l1_d_cache100 { qcom,dump-node = <&L1_D_100>; - qcom,dump-id = <0x84>; + qcom,dump-id = <0x80>; }; qcom,l1_d_cache101 { qcom,dump-node = <&L1_D_101>; - qcom,dump-id = <0x85>; + qcom,dump-id = <0x81>; }; qcom,l1_d_cache102 { qcom,dump-node = <&L1_D_102>; - qcom,dump-id = <0x86>; + qcom,dump-id = <0x82>; }; qcom,l1_d_cache103 { qcom,dump-node = <&L1_D_103>; - qcom,dump-id = <0x87>; + qcom,dump-id = <0x83>; }; }; }; From 79f371d93ba0e2b3cefb69536cc11bc92a0f7186 Mon Sep 17 00:00:00 2001 From: Thierry Strudel Date: Mon, 20 Feb 2017 13:22:40 +0530 Subject: [PATCH 0651/1015] ANDROID: cpu: send KOBJ_ONLINE event when enabling cpus In case some sysfs nodes needs to be labeled with a different label than sysfs then user needs to be notified when a core is brought back online. Change-Id: I1ad7445fb3067f063eeb2a976efe894aaae705a6 Signed-off-by: Thierry Strudel Bug: 29359497 Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: 872e24621a63b75b3b644f6369b04bfb092264b1 CRs-FIXED: 2002167 Signed-off-by: Swetha Chikkaboraiah --- kernel/cpu.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/cpu.c b/kernel/cpu.c index cd9c5c65ebe1f..8503e5eaa4585 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -598,6 +598,7 @@ void __weak arch_enable_nonboot_cpus_end(void) void __ref enable_nonboot_cpus(void) { int cpu, error; + struct device *cpu_device; /* Allow everyone to use the CPU hotplug again */ cpu_maps_update_begin(); @@ -615,6 +616,12 @@ void __ref enable_nonboot_cpus(void) trace_suspend_resume(TPS("CPU_ON"), cpu, false); if (!error) { pr_info("CPU%d is up\n", cpu); + cpu_device = get_cpu_device(cpu); + if (!cpu_device) + pr_err("%s: failed to get cpu%d device\n", + __func__, cpu); + else + kobject_uevent(&cpu_device->kobj, KOBJ_ONLINE); continue; } pr_warn("Error taking CPU%d up: %d\n", cpu, error); From 1120652067cc78f9325aab0a7c322e2a67a1d9e4 Mon Sep 17 00:00:00 2001 From: VijayaKumar T M Date: Wed, 8 Feb 2017 14:16:58 +0530 Subject: [PATCH 0652/1015] msm: camera: Add check to ensure task wont hog CPU In case the userspace code manipulates the list to be circular This way the task will hog the CPU in while loop. CRs-Fixed: 1064608 Change-Id: Ie896fd3da326e5e972266d8004baecf8681aea6d Signed-off-by: VijayaKumar T M Signed-off-by: Lokesh Kumar Aakulu --- .../platform/msm/camera_v2/isp/msm_isp_util.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index 658953e7a03ec..dd9e48e85e086 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -22,6 +22,7 @@ #include "cam_smmu_api.h" #define MAX_ISP_V4l2_EVENTS 100 +#define MAX_ISP_REG_LIST 100 static DEFINE_MUTEX(bandwidth_mgr_mutex); static struct msm_isp_bandwidth_mgr isp_bandwidth_mgr; @@ -640,6 +641,7 @@ static int msm_isp_set_dual_HW_master_slave_mode( static int msm_isp_proc_cmd_list_unlocked(struct vfe_device *vfe_dev, void *arg) { int rc = 0; + uint32_t count = 0; struct msm_vfe_cfg_cmd_list *proc_cmd = (struct msm_vfe_cfg_cmd_list *)arg; struct msm_vfe_cfg_cmd_list cmd, cmd_next; @@ -663,6 +665,12 @@ static int msm_isp_proc_cmd_list_unlocked(struct vfe_device *vfe_dev, void *arg) sizeof(struct msm_vfe_cfg_cmd_list)); break; } + if (++count >= MAX_ISP_REG_LIST) { + pr_err("%s:%d Error exceeding the max register count:%u\n", + __func__, __LINE__, count); + rc = -EFAULT; + break; + } if (copy_from_user(&cmd_next, (void __user *)cmd.next, sizeof(struct msm_vfe_cfg_cmd_list))) { rc = -EFAULT; @@ -709,6 +717,7 @@ static void msm_isp_compat_to_proc_cmd(struct msm_vfe_cfg_cmd2 *proc_cmd, static int msm_isp_proc_cmd_list_compat(struct vfe_device *vfe_dev, void *arg) { int rc = 0; + uint32_t count = 0; struct msm_vfe_cfg_cmd_list_32 *proc_cmd = (struct msm_vfe_cfg_cmd_list_32 *)arg; struct msm_vfe_cfg_cmd_list_32 cmd, cmd_next; @@ -733,6 +742,12 @@ static int msm_isp_proc_cmd_list_compat(struct vfe_device *vfe_dev, void *arg) sizeof(struct msm_vfe_cfg_cmd_list)); break; } + if (++count >= MAX_ISP_REG_LIST) { + pr_err("%s:%d Error exceeding the max register count:%u\n", + __func__, __LINE__, count); + rc = -EFAULT; + break; + } if (copy_from_user(&cmd_next, compat_ptr(cmd.next), sizeof(struct msm_vfe_cfg_cmd_list_32))) { rc = -EFAULT; From 9d5a0bc7f6318821fddf9fc0ac9a05e58bb00a6b Mon Sep 17 00:00:00 2001 From: Sungjun Park Date: Mon, 23 Jan 2017 13:28:44 -0800 Subject: [PATCH 0653/1015] bluetooth: Fix free data pointer routine Data pointer has been reused after freed it. So, it has been moved to after using the data pointer to clean up resource and freed it. Change-Id: Ibc94e092134ff1f36e896c679ade7f639254a24d Signed-off-by: Sungjun Park --- drivers/bluetooth/btfm_slim.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/bluetooth/btfm_slim.c b/drivers/bluetooth/btfm_slim.c index 5fb00b96a9d3c..1c6e256673e29 100644 --- a/drivers/bluetooth/btfm_slim.c +++ b/drivers/bluetooth/btfm_slim.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -509,7 +509,6 @@ static int btfm_slim_remove(struct slim_device *slim) BTFMSLIM_DBG(""); mutex_destroy(&btfm_slim->io_lock); mutex_destroy(&btfm_slim->xfer_lock); - kfree(btfm_slim); snd_soc_unregister_codec(&slim->dev); BTFMSLIM_DBG("slim_remove_device() - btfm_slim->slim_ifd"); @@ -517,6 +516,8 @@ static int btfm_slim_remove(struct slim_device *slim) BTFMSLIM_DBG("slim_remove_device() - btfm_slim->slim_pgd"); slim_remove_device(slim); + + kfree(btfm_slim); return 0; } From e08ea92d5f7fa0004d29f0ca818a2b57551af05e Mon Sep 17 00:00:00 2001 From: Sathish Ambley Date: Fri, 10 Feb 2017 10:25:36 -0800 Subject: [PATCH 0654/1015] msm: ADSPRPC: Fix leak that happens while the list gets empty When the list that holds the open file handles gets empty, the node does not get freed causing a leak. Change-Id: I611387abd27033d4ded63b3bf271162c5d95653d Acked-by: Chenna Kesava Raju Signed-off-by: Sathish Ambley --- drivers/char/adsprpc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index 4c2172f995366..72c9a7fdffcc5 100644 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -1874,8 +1874,10 @@ static void file_free_work_handler(struct work_struct *w) break; } mutex_unlock(&me->flfree_mutex); - if (freefl) + if (freefl) { fastrpc_file_free(freefl->fl); + kfree(freefl); + } mutex_lock(&me->flfree_mutex); if (hlist_empty(&me->fls)) { @@ -1885,7 +1887,6 @@ static void file_free_work_handler(struct work_struct *w) break; } mutex_unlock(&me->flfree_mutex); - kfree(freefl); } return; } From 37c554bc664f0f1ceeab2712b5627085e094eea0 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Fri, 3 Mar 2017 13:27:54 +0530 Subject: [PATCH 0655/1015] msm: ipa: Modify IPAERR to IPADBG Update IPADBG in place of IPAERR. It is not an error, use IPADBG instead of IPAERR. Change-Id: I2d2cf04014006329abee022faeb18cc98cfdf19a Acked-by: Mohammed Javid Signed-off-by: Utkarsh Saxena --- drivers/platform/msm/ipa/ipa_v2/ipa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa.c b/drivers/platform/msm/ipa/ipa_v2/ipa.c index 6c842a46296a5..8647a31ea0e8b 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa.c @@ -3419,7 +3419,7 @@ void ipa_inc_acquire_wakelock(enum ipa_wakelock_ref_client ref_client) return; spin_lock_irqsave(&ipa_ctx->wakelock_ref_cnt.spinlock, flags); if (ipa_ctx->wakelock_ref_cnt.cnt & (1 << ref_client)) - IPAERR("client enum %d mask already set. ref cnt = %d\n", + IPADBG("client enum %d mask already set. ref cnt = %d\n", ref_client, ipa_ctx->wakelock_ref_cnt.cnt); ipa_ctx->wakelock_ref_cnt.cnt |= (1 << ref_client); if (ipa_ctx->wakelock_ref_cnt.cnt) From 1c51538696b39cec71058ed7750e1bb3906b6b36 Mon Sep 17 00:00:00 2001 From: Yeleswarapu Nagaradhesh Date: Tue, 14 Feb 2017 14:27:56 +0530 Subject: [PATCH 0656/1015] ASoC: msm: acquire lock in ioctl If two ioctls are triggered with different commands, there is a possibility to access freed confidence level memory. To resolve this acquire lock in ioctl. Also release mutex lock properly in error cases. CRs-Fixed: 1103085 Change-Id: I7d6b2eff21c8297e5f0755a0c141254be32f777d Signed-off-by: Yeleswarapu Nagaradhesh --- sound/soc/msm/msm-cpe-lsm.c | 61 +++++++++++------ sound/soc/msm/qdsp6v2/msm-lsm-client.c | 91 +++++++++++++++++++------- 2 files changed, 107 insertions(+), 45 deletions(-) diff --git a/sound/soc/msm/msm-cpe-lsm.c b/sound/soc/msm/msm-cpe-lsm.c index e652fc6647470..8e867ac62d1ed 100644 --- a/sound/soc/msm/msm-cpe-lsm.c +++ b/sound/soc/msm/msm-cpe-lsm.c @@ -2110,7 +2110,8 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "LSM_REG_SND_MODEL_V2"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&snd_model, (void *)arg, @@ -2190,7 +2191,8 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "SNDRV_LSM_SET_PARAMS"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&det_params, (void *) arg, @@ -2217,14 +2219,16 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if not using topology\n", __func__, "SET_MODULE_PARAMS"); - return -EINVAL; + err = -EINVAL; + goto done; } if (!arg) { dev_err(rtd->dev, "%s: %s: No Param data to set\n", __func__, "SET_MODULE_PARAMS"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&p_data, arg, @@ -2232,7 +2236,8 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: copy_from_user failed, size = %zd\n", __func__, "p_data", sizeof(p_data)); - return -EFAULT; + err = -EFAULT; + goto done; } if (p_data.num_params > LSM_PARAMS_MAX) { @@ -2240,7 +2245,8 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: Invalid num_params %d\n", __func__, "SET_MODULE_PARAMS", p_data.num_params); - return -EINVAL; + err = -EINVAL; + goto done; } p_size = p_data.num_params * @@ -2251,12 +2257,15 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: Invalid size %zd\n", __func__, "SET_MODULE_PARAMS", p_size); - return -EFAULT; + err = -EFAULT; + goto done; } params = kzalloc(p_size, GFP_KERNEL); - if (!params) - return -ENOMEM; + if (!params) { + err = -ENOMEM; + goto done; + } if (copy_from_user(params, p_data.params, p_data.data_size)) { @@ -2264,7 +2273,8 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: copy_from_user failed, size = %d\n", __func__, "params", p_data.data_size); kfree(params); - return -EFAULT; + err = -EFAULT; + goto done; } err = msm_cpe_lsm_process_params(substream, &p_data, params); @@ -2375,7 +2385,8 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "LSM_REG_SND_MODEL_V2_32"); - return -EINVAL; + err = -EINVAL; + goto done; } dev_dbg(rtd->dev, @@ -2505,7 +2516,9 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "SNDRV_LSM_SET_PARAMS32"); - return -EINVAL; + + err = -EINVAL; + goto done; } if (copy_from_user(&det_params32, arg, @@ -2549,7 +2562,8 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if not using topology\n", __func__, "SET_MODULE_PARAMS_32"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&p_data_32, arg, @@ -2558,7 +2572,8 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: copy_from_user failed, size = %zd\n", __func__, "SET_MODULE_PARAMS_32", sizeof(p_data_32)); - return -EFAULT; + err = -EFAULT; + goto done; } p_data.params = compat_ptr(p_data_32.params); @@ -2570,7 +2585,8 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: Invalid num_params %d\n", __func__, "SET_MODULE_PARAMS_32", p_data.num_params); - return -EINVAL; + err = -EINVAL; + goto done; } if (p_data.data_size != @@ -2579,21 +2595,25 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: Invalid size %d\n", __func__, "SET_MODULE_PARAMS_32", p_data.data_size); - return -EINVAL; + err = -EINVAL; + goto done; } p_size = sizeof(struct lsm_params_info_32) * p_data.num_params; params32 = kzalloc(p_size, GFP_KERNEL); - if (!params32) - return -ENOMEM; + if (!params32) { + err = -ENOMEM; + goto done; + } p_size = sizeof(struct lsm_params_info) * p_data.num_params; params = kzalloc(p_size, GFP_KERNEL); if (!params) { kfree(params32); - return -ENOMEM; + err = -ENOMEM; + goto done; } if (copy_from_user(params32, p_data.params, @@ -2603,7 +2623,8 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, __func__, "params32", p_data.data_size); kfree(params32); kfree(params); - return -EFAULT; + err = -EFAULT; + goto done; } p_info_32 = (struct lsm_params_info_32 *) params32; diff --git a/sound/soc/msm/qdsp6v2/msm-lsm-client.c b/sound/soc/msm/qdsp6v2/msm-lsm-client.c index c610ec3c0ba68..f7a9d4626661f 100644 --- a/sound/soc/msm/qdsp6v2/msm-lsm-client.c +++ b/sound/soc/msm/qdsp6v2/msm-lsm-client.c @@ -84,6 +84,7 @@ struct lsm_priv { atomic_t buf_count; atomic_t read_abort; wait_queue_head_t period_wait; + struct mutex lsm_api_lock; int appl_cnt; int dma_write; }; @@ -872,10 +873,18 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, case SNDRV_LSM_EVENT_STATUS: dev_dbg(rtd->dev, "%s: Get event status\n", __func__); atomic_set(&prtd->event_wait_stop, 0); + + /* + * Release the api lock before wait to allow + * other IOCTLs to be invoked while waiting + * for event + */ + mutex_unlock(&prtd->lsm_api_lock); rc = wait_event_freezable(prtd->event_wait, (cmpxchg(&prtd->event_avail, 1, 0) || (xchg = atomic_cmpxchg(&prtd->event_wait_stop, 1, 0)))); + mutex_lock(&prtd->lsm_api_lock); dev_dbg(rtd->dev, "%s: wait_event_freezable %d event_wait_stop %d\n", __func__, rc, xchg); if (!rc && !xchg) { @@ -1114,6 +1123,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, rtd = substream->private_data; prtd = runtime->private_data; + mutex_lock(&prtd->lsm_api_lock); + switch (cmd) { case SNDRV_LSM_EVENT_STATUS: { struct snd_lsm_event_status *user = NULL, userarg32; @@ -1121,7 +1132,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, if (copy_from_user(&userarg32, arg, sizeof(userarg32))) { dev_err(rtd->dev, "%s: err copyuser ioctl %s\n", __func__, "SNDRV_LSM_EVENT_STATUS"); - return -EFAULT; + err = -EFAULT; + goto done; } if (userarg32.payload_size > @@ -1129,7 +1141,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, pr_err("%s: payload_size %d is invalid, max allowed = %d\n", __func__, userarg32.payload_size, LISTEN_MAX_STATUS_PAYLOAD_SIZE); - return -EINVAL; + err = -EINVAL; + goto done; } size = sizeof(*user) + userarg32.payload_size; @@ -1138,7 +1151,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: Allocation failed event status size %d\n", __func__, size); - return -EFAULT; + err = -EFAULT; + goto done; } else { cmd = SNDRV_LSM_EVENT_STATUS; user->payload_size = userarg32.payload_size; @@ -1187,7 +1201,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "REG_SND_MODEL_V2"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&snd_modelv232, arg, @@ -1228,7 +1243,7 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "SET_PARAMS_32"); - return -EINVAL; + err = -EINVAL; } if (copy_from_user(&det_params32, arg, @@ -1271,7 +1286,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if not using topology\n", __func__, "SET_MODULE_PARAMS_32"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&p_data_32, arg, @@ -1280,7 +1296,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: copy_from_user failed, size = %zd\n", __func__, "SET_MODULE_PARAMS_32", sizeof(p_data_32)); - return -EFAULT; + err = -EFAULT; + goto done; } p_data.params = compat_ptr(p_data_32.params); @@ -1292,7 +1309,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: Invalid num_params %d\n", __func__, "SET_MODULE_PARAMS_32", p_data.num_params); - return -EINVAL; + err = -EINVAL; + goto done; } if (p_data.data_size != @@ -1301,7 +1319,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: Invalid size %d\n", __func__, "SET_MODULE_PARAMS_32", p_data.data_size); - return -EINVAL; + err = -EINVAL; + goto done; } p_size = sizeof(struct lsm_params_info_32) * @@ -1312,7 +1331,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: no memory for params32, size = %zd\n", __func__, p_size); - return -ENOMEM; + err = -ENOMEM; + goto done; } p_size = sizeof(struct lsm_params_info) * p_data.num_params; @@ -1322,7 +1342,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: no memory for params, size = %zd\n", __func__, p_size); kfree(params32); - return -ENOMEM; + err = -ENOMEM; + goto done; } if (copy_from_user(params32, p_data.params, @@ -1332,7 +1353,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, __func__, "params32", p_data.data_size); kfree(params32); kfree(params); - return -EFAULT; + err = -EFAULT; + goto done; } p_info_32 = (struct lsm_params_info_32 *) params32; @@ -1375,6 +1397,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, err = msm_lsm_ioctl_shared(substream, cmd, arg); break; } +done: + mutex_unlock(&prtd->lsm_api_lock); return err; } #else @@ -1399,6 +1423,7 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, prtd = runtime->private_data; rtd = substream->private_data; + mutex_lock(&prtd->lsm_api_lock); switch (cmd) { case SNDRV_LSM_REG_SND_MODEL_V2: { struct snd_lsm_sound_model_v2 snd_model_v2; @@ -1407,7 +1432,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "REG_SND_MODEL_V2"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&snd_model_v2, arg, sizeof(snd_model_v2))) { @@ -1434,7 +1460,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "SET_PARAMS"); - return -EINVAL; + err = -EINVAL; + goto done; } pr_debug("%s: SNDRV_LSM_SET_PARAMS\n", __func__); @@ -1455,7 +1482,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: LSM_SET_PARAMS failed, err %d\n", __func__, err); - return err; + + goto done; } case SNDRV_LSM_SET_MODULE_PARAMS: { @@ -1467,7 +1495,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if not using topology\n", __func__, "SET_MODULE_PARAMS"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&p_data, arg, @@ -1475,7 +1504,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: copy_from_user failed, size = %zd\n", __func__, "p_data", sizeof(p_data)); - return -EFAULT; + err = -EFAULT; + goto done; } if (p_data.num_params > LSM_PARAMS_MAX) { @@ -1483,7 +1513,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: Invalid num_params %d\n", __func__, "SET_MODULE_PARAMS", p_data.num_params); - return -EINVAL; + err = -EINVAL; + goto done; } p_size = p_data.num_params * @@ -1494,7 +1525,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: Invalid size %zd\n", __func__, "SET_MODULE_PARAMS", p_size); - return -EFAULT; + err = -EFAULT; + goto done; } params = kzalloc(p_size, GFP_KERNEL); @@ -1502,7 +1534,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: no memory for params\n", __func__); - return -ENOMEM; + err = -ENOMEM; + goto done; } if (copy_from_user(params, p_data.params, @@ -1511,7 +1544,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: copy_from_user failed, size = %d\n", __func__, "params", p_data.data_size); kfree(params); - return -EFAULT; + err = -EFAULT; + goto done; } err = msm_lsm_process_params(substream, &p_data, params); @@ -1531,7 +1565,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: err copyuser event_status\n", __func__); - return -EFAULT; + err = -EFAULT; + goto done; } if (userarg.payload_size > @@ -1539,7 +1574,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, pr_err("%s: payload_size %d is invalid, max allowed = %d\n", __func__, userarg.payload_size, LISTEN_MAX_STATUS_PAYLOAD_SIZE); - return -EINVAL; + err = -EINVAL; + goto done; } size = sizeof(struct snd_lsm_event_status) + @@ -1549,7 +1585,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: Allocation failed event status size %d\n", __func__, size); - return -EFAULT; + err = -EFAULT; + goto done; } else { user->payload_size = userarg.payload_size; err = msm_lsm_ioctl_shared(substream, cmd, user); @@ -1572,12 +1609,14 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, if (err) dev_err(rtd->dev, "%s: lsmevent failed %d", __func__, err); - return err; + goto done; } default: err = msm_lsm_ioctl_shared(substream, cmd, arg); break; } +done: + mutex_unlock(&prtd->lsm_api_lock); return err; } @@ -1594,6 +1633,7 @@ static int msm_lsm_open(struct snd_pcm_substream *substream) __func__); return -ENOMEM; } + mutex_init(&prtd->lsm_api_lock); spin_lock_init(&prtd->event_lock); init_waitqueue_head(&prtd->event_wait); init_waitqueue_head(&prtd->period_wait); @@ -1723,6 +1763,7 @@ static int msm_lsm_close(struct snd_pcm_substream *substream) kfree(prtd->event_status); prtd->event_status = NULL; spin_unlock_irqrestore(&prtd->event_lock, flags); + mutex_destroy(&prtd->lsm_api_lock); kfree(prtd); runtime->private_data = NULL; From 3a7fdf9304ec974761b42beb82d66d8d1fd56845 Mon Sep 17 00:00:00 2001 From: Hemant Gupta Date: Fri, 3 Mar 2017 20:01:00 +0530 Subject: [PATCH 0657/1015] HID: Remove playstation4 as special driver Playstation4 needs to be removed as having special hid driver and needs to be used as generic hid driver because special hid driver support is not working well. CRs-Fixed: 2014640 Change-Id: Ibf053717adf043274ad3c4f889e5a88abf17e387 Signed-off-by: Hemant Gupta --- drivers/hid/hid-core.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 94fdaeb856122..a24ef10ae2ba4 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -1933,7 +1933,6 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) }, { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) }, From ad524d5771ddf48288304ac8874652e10d07d649 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 7 Feb 2017 11:50:13 -0800 Subject: [PATCH 0658/1015] usb: host: xhci: Fix bound check for interrupter number Since max_interrupters flag includes primary interrupter as well, update the bound check when this flag is being used for secondary event ring clean-up/allocation. Change-Id: I044c5a89fe17779eb847981cbf27e99b97e37d80 Signed-off-by: Hemant Kumar --- drivers/usb/host/xhci-mem.c | 6 +++--- drivers/usb/host/xhci.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 0f56b597fae07..3720cd7917ea6 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1873,7 +1873,7 @@ int xhci_sec_event_ring_cleanup(struct usb_hcd *hcd, unsigned intr_num) struct xhci_hcd *xhci = hcd_to_xhci(hcd); struct device *dev = xhci_to_hcd(xhci)->self.controller; - if (intr_num > xhci->max_interrupters) { + if (intr_num >= xhci->max_interrupters) { xhci_err(xhci, "invalid secondary interrupter num %d\n", intr_num); return -EINVAL; @@ -1906,7 +1906,7 @@ void xhci_event_ring_cleanup(struct xhci_hcd *xhci) struct device *dev = xhci_to_hcd(xhci)->self.controller; /* sec event ring clean up */ - for (i = 1; i <= xhci->max_interrupters; i++) + for (i = 1; i < xhci->max_interrupters; i++) xhci_sec_event_ring_cleanup(xhci_to_hcd(xhci), i); kfree(xhci->sec_ir_set); @@ -2517,7 +2517,7 @@ int xhci_sec_event_ring_setup(struct usb_hcd *hcd, unsigned intr_num) if ((xhci->xhc_state & XHCI_STATE_HALTED) || !xhci->sec_ir_set || !xhci->sec_event_ring || !xhci->sec_erst || - intr_num > xhci->max_interrupters) { + intr_num >= xhci->max_interrupters) { xhci_err(xhci, "%s:state %x ir_set %pK evt_ring %pK erst %pK intr# %d\n", __func__, xhci->xhc_state, xhci->sec_ir_set, diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 4eb4657e7974d..c09ca565fd0b1 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -4985,8 +4985,8 @@ dma_addr_t xhci_get_sec_event_ring_dma_addr(struct usb_hcd *hcd, { struct xhci_hcd *xhci = hcd_to_xhci(hcd); - if (intr_num > xhci->max_interrupters) { - xhci_err(xhci, "intr num %d > max intrs %d\n", intr_num, + if (intr_num >= xhci->max_interrupters) { + xhci_err(xhci, "intr num %d >= max intrs %d\n", intr_num, xhci->max_interrupters); return 0; } From a83b96924bc556f7244c77ed65aadb36a22d873b Mon Sep 17 00:00:00 2001 From: Subbaraman Narayanamurthy Date: Fri, 13 Jan 2017 15:24:44 -0800 Subject: [PATCH 0659/1015] power: qpnp-fg: fix unbalanced irq enable warning for FULL_SOC irq FULL_SOC irq is dynamically enabled or disabled by the driver and a flag is used for that. Since the interrupt is enabled during bootup and flag is not set, there is a warning printed out for unbalanced irq enable. Also interrupt was not configured wakeup capable. Fix it. Change-Id: I4f3394aebca41c862746232ed560e0e13a508081 Signed-off-by: Subbaraman Narayanamurthy --- drivers/power/qpnp-fg.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/power/qpnp-fg.c b/drivers/power/qpnp-fg.c index cc2021d45859a..d50cf2c1e36f8 100644 --- a/drivers/power/qpnp-fg.c +++ b/drivers/power/qpnp-fg.c @@ -7179,6 +7179,8 @@ static int fg_init_irqs(struct fg_chip *chip) chip->soc_irq[FULL_SOC].irq, rc); return rc; } + enable_irq_wake(chip->soc_irq[FULL_SOC].irq); + chip->full_soc_irq_enabled = true; if (!chip->use_vbat_low_empty_soc) { rc = devm_request_irq(chip->dev, From e7481ca4a8d133f125086b897d918dc175862d2d Mon Sep 17 00:00:00 2001 From: Manish Poddar Date: Fri, 9 Dec 2016 11:25:31 +0530 Subject: [PATCH 0660/1015] msm: camera: fix Information leak In msm_buf_mngr_sd_shutdown bufs is a pointer defined in kernel, and it is printed to userspace using %lx. changed it to %pK. Change-Id: Ic2cb1a2ff109364ac2da1bbb3253a2253a0c6be9 Signed-off-by: Manish Poddar --- .../platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c b/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c index 6b07f16ccec73..882ab03dcf9a7 100644 --- a/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c +++ b/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c @@ -297,8 +297,8 @@ static void msm_buf_mngr_sd_shutdown(struct msm_buf_mngr_device *dev, if (!list_empty(&dev->buf_qhead)) { list_for_each_entry_safe(bufs, save, &dev->buf_qhead, entry) { - pr_info("%s: Delete invalid bufs =%lx, session_id=%u, bufs->ses_id=%d, str_id=%d, idx=%d\n", - __func__, (unsigned long)bufs, session->session, + pr_info("%s: Delete invalid bufs =%pK, session_id=%u, bufs->ses_id=%d, str_id=%d, idx=%d\n", + __func__, (void *)bufs, session->session, bufs->session_id, bufs->stream_id, bufs->index); if (session->session == bufs->session_id) { From 0bc6c357e916aac50404695745bdfbef36554c5d Mon Sep 17 00:00:00 2001 From: Shantanu Jain Date: Tue, 7 Mar 2017 15:12:20 +0530 Subject: [PATCH 0661/1015] input: touchscreen: remove data pointer from driver structure Remove data pointer from the driver structure which is obtained from user-space. Exclude it from driver structure and move it outside as another global data pointer. The definition of CMD_HEAD_LENGTH is meant to exclude the last member (*data) from the copy from userspace. This change is meant to keep the definition of CMD_HEAD_LENGTH simple, and handle the data separately. Change-Id: I62f14c744e5c331718b6d84f67a4e89b511c9f44 Signed-off-by: Shantanu Jain --- drivers/input/touchscreen/gt9xx/goodix_tool.c | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/drivers/input/touchscreen/gt9xx/goodix_tool.c b/drivers/input/touchscreen/gt9xx/goodix_tool.c index 8f80c38a7d065..55f257d2ad702 100644 --- a/drivers/input/touchscreen/gt9xx/goodix_tool.c +++ b/drivers/input/touchscreen/gt9xx/goodix_tool.c @@ -27,7 +27,7 @@ #include #define DATA_LENGTH_UINT 512 -#define CMD_HEAD_LENGTH (sizeof(struct st_cmd_head) - sizeof(u8 *)) +#define CMD_HEAD_LENGTH (sizeof(struct st_cmd_head)) static char procname[20] = {0}; struct st_cmd_head { @@ -44,10 +44,10 @@ struct st_cmd_head { u8 addr_len; /* address length */ u8 addr[2]; /* address */ u8 res[3]; /* reserved */ - u8 *data; /* data pointer */ } __packed; static struct st_cmd_head cmd_head; +static u8 *cmd_data; static struct i2c_client *gt_client; @@ -192,7 +192,7 @@ static void unregister_i2c_func(void) void uninit_wr_node(void) { - cmd_head.data = NULL; + cmd_data = NULL; unregister_i2c_func(); proc_remove(goodix_proc_entry); } @@ -309,7 +309,6 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) { s32 ret = 0; - u8 *dataptr = NULL; mutex_lock(&lock); ret = copy_from_user(&cmd_head, userbuf, CMD_HEAD_LENGTH); @@ -341,14 +340,14 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, } if (cmd_head.wr == GTP_RW_WRITE) { - ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], + ret = copy_from_user(&cmd_data[GTP_ADDR_LENGTH], &userbuf[CMD_HEAD_LENGTH], cmd_head.data_len); if (ret) { dev_err(>_client->dev, "copy_from_user failed."); goto exit; } - memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + memcpy(&cmd_data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); if (cmd_head.flag == GTP_NEED_FLAG) { @@ -361,7 +360,7 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, /* Need interrupt! */ } if (tool_i2c_write( - &cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + &cmd_data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.data_len + cmd_head.addr_len) <= 0) { dev_err(>_client->dev, "Write data failed!"); ret = -EIO; @@ -374,7 +373,7 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, ret = cmd_head.data_len + CMD_HEAD_LENGTH; goto exit; } else if (cmd_head.wr == GTP_RW_WRITE_IC_TYPE) { /* Write ic type */ - ret = copy_from_user(&cmd_head.data[0], + ret = copy_from_user(&cmd_data[0], &userbuf[CMD_HEAD_LENGTH], cmd_head.data_len); if (ret) { @@ -389,7 +388,7 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, ret = -EINVAL; goto exit; } - memcpy(ic_type, cmd_head.data, cmd_head.data_len); + memcpy(ic_type, cmd_data, cmd_head.data_len); register_i2c_func(); @@ -417,13 +416,13 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, } else if (cmd_head.wr == GTP_RW_CHECK_RAWDIFF_MODE) { struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); - ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], + ret = copy_from_user(&cmd_data[GTP_ADDR_LENGTH], &userbuf[CMD_HEAD_LENGTH], cmd_head.data_len); if (ret) { pr_debug("copy_from_user failed."); goto exit; } - if (cmd_head.data[GTP_ADDR_LENGTH]) { + if (cmd_data[GTP_ADDR_LENGTH]) { pr_debug("gtp enter rawdiff."); ts->gtp_rawdiff_mode = true; } else { @@ -451,11 +450,11 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, ret = -EINVAL; goto exit; } - memset(cmd_head.data, 0, cmd_head.data_len + 1); - memcpy(cmd_head.data, &userbuf[CMD_HEAD_LENGTH], + memset(cmd_data, 0, cmd_head.data_len + 1); + memcpy(cmd_data, &userbuf[CMD_HEAD_LENGTH], cmd_head.data_len); - if (gup_update_proc((void *)cmd_head.data) == FAIL) { + if (gup_update_proc((void *)cmd_data) == FAIL) { ret = -EBUSY; goto exit; } @@ -463,10 +462,8 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, ret = CMD_HEAD_LENGTH; exit: - dataptr = cmd_head.data; memset(&cmd_head, 0, sizeof(cmd_head)); cmd_head.wr = 0xFF; - cmd_head.data = dataptr; mutex_unlock(&lock); return ret; @@ -506,10 +503,10 @@ static s32 goodix_tool_read(struct file *file, char __user *user_buf, /* Need interrupt! */ } - memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + memcpy(cmd_data, cmd_head.addr, cmd_head.addr_len); - pr_debug("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], - cmd_head.data[1]); + pr_debug("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_data[0], + cmd_data[1]); pr_debug("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); @@ -526,13 +523,13 @@ static s32 goodix_tool_read(struct file *file, char __user *user_buf, if (data_len > count) data_len = count; - if (tool_i2c_read(cmd_head.data, data_len) <= 0) { + if (tool_i2c_read(cmd_data, data_len) <= 0) { dev_err(>_client->dev, "Read data failed!\n"); ret = -EIO; goto exit; } ret = simple_read_from_buffer(user_buf, count, ppos, - &cmd_head.data[GTP_ADDR_LENGTH], data_len); + &cmd_data[GTP_ADDR_LENGTH], data_len); break; case GTP_RW_FILL_INFO: ret = fill_update_info(user_buf, count, ppos); @@ -567,13 +564,13 @@ s32 init_wr_node(struct i2c_client *client) gt_client = client; memset(&cmd_head, 0, sizeof(cmd_head)); - cmd_head.data = NULL; + cmd_data = NULL; i = GTP_I2C_RETRY_5; - while ((!cmd_head.data) && i) { - cmd_head.data = devm_kzalloc(&client->dev, + while ((!cmd_data) && i) { + cmd_data = devm_kzalloc(&client->dev, i * DATA_LENGTH_UINT, GFP_KERNEL); - if (cmd_head.data) + if (cmd_data) break; i--; } From 828703cc2830b2a9335610328955512b95ebf22d Mon Sep 17 00:00:00 2001 From: Shantanu Jain Date: Mon, 6 Mar 2017 19:14:09 +0530 Subject: [PATCH 0662/1015] input: touchscreen: fix buffer overflow issue in synaptics driver Fix buffer overflow issue in synaptics touch driver while copying the contents of "strptr" into "firmware_id". This code change is meant to fix the same. Change-Id: I8ea96af558eff540a37fb8e7da730c74502622aa Signed-off-by: Shantanu Jain --- .../touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c index 52bd5cfc37c82..168318f85e538 100644 --- a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c +++ b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c @@ -2218,10 +2218,12 @@ static int fwu_get_image_firmware_id(unsigned int *fw_id) __func__); return -ENOMEM; } - while (strptr[index] >= '0' && strptr[index] <= '9') { + while ((index < MAX_FIRMWARE_ID_LEN - 1) && strptr[index] >= '0' + && strptr[index] <= '9') { firmware_id[index] = strptr[index]; index++; } + firmware_id[index] = '\0'; retval = sstrtoul(firmware_id, 10, (unsigned long *)fw_id); kfree(firmware_id); From c774f63c4b4cc7ec8c6defbcaca564e5843b0413 Mon Sep 17 00:00:00 2001 From: Krishna Manikandan Date: Tue, 24 Jan 2017 18:22:51 +0530 Subject: [PATCH 0663/1015] msm: mdss: Trigger idle fallback when no update due to touch Trigger an idle fallback with a reasonable timeout value when there is no update despite of a touch event and idle_time is 0. This will reset the refresh rate to minimum fps. CRs-Fixed: 2003247 Change-Id: I4a2964038f23984bf1ea39c63bf679d80ad12cba Signed-off-by: Krishna Manikandan --- drivers/video/msm/mdss/mdss_mdp_intf_video.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_video.c b/drivers/video/msm/mdss/mdss_mdp_intf_video.c index 29325b6117dac..74dc2f3454d99 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_video.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_video.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2109,10 +2109,21 @@ static int mdss_mdp_video_early_wake_up(struct mdss_mdp_ctl *ctl) * lot of latency rendering the input events useless in preventing the * idle time out. */ - if (ctl->mfd->idle_state == MDSS_FB_IDLE_TIMER_RUNNING) { - if (ctl->mfd->idle_time) + if ((ctl->mfd->idle_state == MDSS_FB_IDLE_TIMER_RUNNING) || + (ctl->mfd->idle_state == MDSS_FB_IDLE)) { + /* + * Modify the idle time so that an idle fallback can be + * triggered for those cases, where we have no update + * despite of a touch event and idle time is 0. + */ + if (!ctl->mfd->idle_time) { + ctl->mfd->idle_time = 70; + schedule_delayed_work(&ctl->mfd->idle_notify_work, + msecs_to_jiffies(200)); + } else { mod_delayed_work(system_wq, &ctl->mfd->idle_notify_work, msecs_to_jiffies(ctl->mfd->idle_time)); + } pr_debug("Delayed idle time\n"); } else { pr_debug("Nothing to done for this state (%d)\n", From ed066a11dfd8241499254e96d0807feaf66b5a69 Mon Sep 17 00:00:00 2001 From: Siena Richard Date: Tue, 28 Feb 2017 12:52:30 -0800 Subject: [PATCH 0664/1015] drivers: soc: add size check Add size check to ensure the payload fits inside the declared payload size to prevent loss of data when copying. CRs-Fixed: 2009224 Signed-off-by: Siena Richard Change-Id: I4275c626605272941143b54a7b8861b25f8e750a --- drivers/soc/qcom/qdsp6v2/voice_svc.c | 57 +++++++++++++++++++++------- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/drivers/soc/qcom/qdsp6v2/voice_svc.c b/drivers/soc/qcom/qdsp6v2/voice_svc.c index 10f71b85a15b9..fe54589744061 100644 --- a/drivers/soc/qcom/qdsp6v2/voice_svc.c +++ b/drivers/soc/qcom/qdsp6v2/voice_svc.c @@ -368,6 +368,9 @@ static ssize_t voice_svc_write(struct file *file, const char __user *buf, struct voice_svc_prvt *prtd; struct voice_svc_write_msg *data = NULL; uint32_t cmd; + struct voice_svc_register *register_data = NULL; + struct voice_svc_cmd_request *request_data = NULL; + uint32_t request_payload_size; pr_debug("%s\n", __func__); @@ -416,12 +419,19 @@ static ssize_t voice_svc_write(struct file *file, const char __user *buf, */ if (count == (sizeof(struct voice_svc_write_msg) + sizeof(struct voice_svc_register))) { - ret = process_reg_cmd( - (struct voice_svc_register *)data->payload, prtd); + register_data = + (struct voice_svc_register *)data->payload; + if (register_data == NULL) { + pr_err("%s: register data is NULL", __func__); + ret = -EINVAL; + goto done; + } + ret = process_reg_cmd(register_data, prtd); if (!ret) ret = count; } else { - pr_err("%s: invalid payload size\n", __func__); + pr_err("%s: invalid data payload size for register command\n", + __func__); ret = -EINVAL; goto done; } @@ -430,19 +440,40 @@ static ssize_t voice_svc_write(struct file *file, const char __user *buf, /* * Check that count reflects the expected size to ensure * sufficient memory was allocated. Since voice_svc_cmd_request - * has a variable size, check the minimum value count must be. + * has a variable size, check the minimum value count must be to + * parse the message request then check the minimum size to hold + * the payload of the message request. */ if (count >= (sizeof(struct voice_svc_write_msg) + sizeof(struct voice_svc_cmd_request))) { - ret = voice_svc_send_req( - (struct voice_svc_cmd_request *)data->payload, prtd); - if (!ret) - ret = count; - } else { - pr_err("%s: invalid payload size\n", __func__); - ret = -EINVAL; - goto done; - } + request_data = + (struct voice_svc_cmd_request *)data->payload; + if (request_data == NULL) { + pr_err("%s: request data is NULL", __func__); + ret = -EINVAL; + goto done; + } + + request_payload_size = request_data->payload_size; + + if (count >= (sizeof(struct voice_svc_write_msg) + + sizeof(struct voice_svc_cmd_request) + + request_payload_size)) { + ret = voice_svc_send_req(request_data, prtd); + if (!ret) + ret = count; + } else { + pr_err("%s: invalid request payload size\n", + __func__); + ret = -EINVAL; + goto done; + } + } else { + pr_err("%s: invalid data payload size for request command\n", + __func__); + ret = -EINVAL; + goto done; + } break; default: pr_debug("%s: Invalid command: %u\n", __func__, cmd); From 884e81cbb729246c50de7ee1366c60564fb72553 Mon Sep 17 00:00:00 2001 From: Pratap Nirujogi Date: Mon, 20 Feb 2017 17:29:33 +0530 Subject: [PATCH 0665/1015] msm: camera: cpp: Fixing Heap overflow in output buffer Issue: Missing bound check when writing into the output array buffer, which can lead to out-of-bound heap write. Fix: Addding hardcoded constant 8 in the MSM_OUTPUT_BUF_CNT macro and size check to the place where the array is accessed. Returning '0' if exceeds MSM_OUTPUT_BUF_CNT. Caller will return -EINVAL for '0'. Change-Id: Ic03f86e3e47ece9ca7069527e741a75ad9a0f83f CRs-Fixed: 2004036 Signed-off-by: Pratap Nirujogi --- drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c | 2 ++ include/uapi/media/msmb_pproc.h | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index 05db27cd01422..19aa019848a8e 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -1865,6 +1865,8 @@ static int msm_cpp_check_buf_type(struct msm_buf_mngr_info *buff_mgr_info, /* More or equal bufs as Input buffer */ num_output_bufs = new_frame->batch_info.batch_size; } + if (num_output_bufs > MSM_OUTPUT_BUF_CNT) + return 0; for (i = 0; i < num_output_bufs; i++) { new_frame->output_buffer_info[i].index = buff_mgr_info->user_buf.buf_idx[i]; diff --git a/include/uapi/media/msmb_pproc.h b/include/uapi/media/msmb_pproc.h index b65669b87a21d..8f454571e69de 100644 --- a/include/uapi/media/msmb_pproc.h +++ b/include/uapi/media/msmb_pproc.h @@ -16,6 +16,7 @@ #define MSM_CPP_MAX_FRAME_LENGTH 4096 #define MSM_CPP_MAX_FW_NAME_LEN 32 #define MAX_FREQ_TBL 10 +#define MSM_OUTPUT_BUF_CNT 8 enum msm_cpp_frame_type { MSM_CPP_OFFLINE_FRAME, @@ -76,7 +77,7 @@ struct msm_cpp_frame_info_t { uint32_t feature_mask; uint8_t we_disable; struct msm_cpp_buffer_info_t input_buffer_info; - struct msm_cpp_buffer_info_t output_buffer_info[8]; + struct msm_cpp_buffer_info_t output_buffer_info[MSM_OUTPUT_BUF_CNT]; struct msm_cpp_buffer_info_t duplicate_buffer_info; struct msm_cpp_buffer_info_t tnr_scratch_buffer_info[2]; uint32_t reserved; From 92f93dbe544f1d9fa71e87c7814d8b18815e7557 Mon Sep 17 00:00:00 2001 From: Liangliang Lu Date: Tue, 21 Feb 2017 12:03:32 +0800 Subject: [PATCH 0666/1015] usb: dwc3: Replace sscanf with kstrtou8_from_user Variable "ubuf " may point to kernel address, a malicious user could use code logic to get kernel information. Use kstrtou8_from_user() which take care of copying buffer, and finding u8 value here. Change-Id: I7228d893ef757c814b26745663270b8a461b1728 Signed-off-by: Liangliang Lu --- drivers/usb/dwc3/debugfs.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c index f5c9a4b5bfbfd..f040026fe8448 100644 --- a/drivers/usb/dwc3/debugfs.c +++ b/drivers/usb/dwc3/debugfs.c @@ -897,21 +897,30 @@ void dwc3_dbg_print_reg(struct dwc3 *dwc, const char *name, int reg) static ssize_t dwc3_store_int_events(struct file *file, const char __user *ubuf, size_t count, loff_t *ppos) { - int clear_stats, i; + int i, ret; unsigned long flags; struct seq_file *s = file->private_data; struct dwc3 *dwc = s->private; struct dwc3_ep *dep; struct timespec ts; + u8 clear_stats; if (ubuf == NULL) { pr_err("[%s] EINVAL\n", __func__); - goto done; + ret = -EINVAL; + return ret; } - if (sscanf(ubuf, "%u", &clear_stats) != 1 || clear_stats != 0) { + ret = kstrtou8_from_user(ubuf, count, 0, &clear_stats); + if (ret < 0) { + pr_err("can't get enter value.\n"); + return ret; + } + + if (clear_stats != 0) { pr_err("Wrong value. To clear stats, enter value as 0.\n"); - goto done; + ret = -EINVAL; + return ret; } spin_lock_irqsave(&dwc->lock, flags); @@ -928,7 +937,6 @@ static ssize_t dwc3_store_int_events(struct file *file, spin_unlock_irqrestore(&dwc->lock, flags); -done: return count; } From 31a19db39397adc1044cb1b482bc4a55054e6754 Mon Sep 17 00:00:00 2001 From: Walter Yang Date: Thu, 2 Mar 2017 12:13:34 +0800 Subject: [PATCH 0667/1015] ASoC: Add backend user count checking Add backend user count checking to protect the index boundary. Change-Id: Ic1b61d1f7130252cc54da0b16553858714988dbd CRs-Fixed: 2009216 Signed-off-by: Walter Yang --- sound/soc/soc-compress.c | 5 +++++ sound/soc/soc-pcm.c | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c index 42683715fe321..5cee1733e0134 100644 --- a/sound/soc/soc-compress.c +++ b/sound/soc/soc-compress.c @@ -531,6 +531,11 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream, cstream, &async_domain); } else { be_list[j++] = be; + if (j == DPCM_MAX_BE_USERS) { + dev_dbg(fe->dev, + "ASoC: MAX backend users!\n"); + break; + } } } for (i = 0; i < j; i++) { diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 6c44757f17bf5..e6de6ad04a0c3 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -2320,6 +2320,10 @@ void dpcm_be_dai_prepare_async(struct snd_soc_pcm_runtime *fe, int stream, dpcm, domain); } else { dpcm_async[i++] = dpcm; + if (i == DPCM_MAX_BE_USERS) { + dev_dbg(fe->dev, "ASoC: MAX backend users!\n"); + break; + } } } From c848c28fa77df9695c47d813a1748a740f4ebae6 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Mon, 27 Feb 2017 13:41:07 -0800 Subject: [PATCH 0668/1015] qseecom: add mutex around qseecom_set_client_mem_param Add mutex around qseecom_set_client_mem_param to prevent an ioctl thread modifying and corrupting data which is being processed by another ioctl in the other thread Change-Id: I0cfb8afab4001c2913be693dfe44c761b9568893 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index e3293d3a46e8f..122314830d293 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -6987,7 +6987,11 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) break; } pr_debug("SET_MEM_PARAM: qseecom addr = 0x%pK\n", data); + mutex_lock(&app_access_lock); + atomic_inc(&data->ioctl_count); ret = qseecom_set_client_mem_param(data, argp); + atomic_dec(&data->ioctl_count); + mutex_unlock(&app_access_lock); if (ret) pr_err("failed Qqseecom_set_mem_param request: %d\n", ret); From cb1c0d3f418b65a501803b0adb43d9df1095537f Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Wed, 1 Mar 2017 16:08:27 -0800 Subject: [PATCH 0669/1015] msm: IPA: add the check on intf query The ipa_ioc_query_intf_rx_props structure comes from the ioctl handler, and it is verified that the size of rx buffer does not exceed the IPA_NUM_PROPS_MAX elements. It is also verified that the "entry->rx" buffer does not exceed IPA_NUM_PROPS_MAX when "entry" is allocated. However, the sizes of the buffer "rx->rx" and the buffer "entry->rx" are not guaranteed to be the same and will lead memory corruption issue. The fix is to add the check before memcpy. Change-Id: Idf5c2d32f47c1a1cffeaa5607193855188893ddb Signed-off-by: Skylar Chang --- drivers/platform/msm/ipa/ipa_v2/ipa_intf.c | 24 +++++++++++++++++++ drivers/platform/msm/ipa/ipa_v3/ipa_intf.c | 28 +++++++++++++++++++--- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c b/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c index a1c927c5ec0f5..9d13bc7662dd3 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c @@ -272,6 +272,14 @@ int ipa_query_intf_tx_props(struct ipa_ioc_query_intf_tx_props *tx) mutex_lock(&ipa_ctx->lock); list_for_each_entry(entry, &ipa_ctx->intf_list, link) { if (!strncmp(entry->name, tx->name, IPA_RESOURCE_NAME_MAX)) { + /* add the entry check */ + if (entry->num_tx_props != tx->num_tx_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_tx_props, + tx->num_tx_props); + mutex_unlock(&ipa_ctx->lock); + return result; + } memcpy(tx->tx, entry->tx, entry->num_tx_props * sizeof(struct ipa_ioc_tx_intf_prop)); result = 0; @@ -305,6 +313,14 @@ int ipa_query_intf_rx_props(struct ipa_ioc_query_intf_rx_props *rx) mutex_lock(&ipa_ctx->lock); list_for_each_entry(entry, &ipa_ctx->intf_list, link) { if (!strncmp(entry->name, rx->name, IPA_RESOURCE_NAME_MAX)) { + /* add the entry check */ + if (entry->num_rx_props != rx->num_rx_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_rx_props, + rx->num_rx_props); + mutex_unlock(&ipa_ctx->lock); + return result; + } memcpy(rx->rx, entry->rx, entry->num_rx_props * sizeof(struct ipa_ioc_rx_intf_prop)); result = 0; @@ -338,6 +354,14 @@ int ipa_query_intf_ext_props(struct ipa_ioc_query_intf_ext_props *ext) mutex_lock(&ipa_ctx->lock); list_for_each_entry(entry, &ipa_ctx->intf_list, link) { if (!strcmp(entry->name, ext->name)) { + /* add the entry check */ + if (entry->num_ext_props != ext->num_ext_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_ext_props, + ext->num_ext_props); + mutex_unlock(&ipa_ctx->lock); + return result; + } memcpy(ext->ext, entry->ext, entry->num_ext_props * sizeof(struct ipa_ioc_ext_intf_prop)); result = 0; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c b/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c index 32c5004dda954..8e13a2fee4674 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -275,6 +275,14 @@ int ipa3_query_intf_tx_props(struct ipa_ioc_query_intf_tx_props *tx) mutex_lock(&ipa3_ctx->lock); list_for_each_entry(entry, &ipa3_ctx->intf_list, link) { if (!strcmp(entry->name, tx->name)) { + /* add the entry check */ + if (entry->num_tx_props != tx->num_tx_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_tx_props, + tx->num_tx_props); + mutex_unlock(&ipa3_ctx->lock); + return result; + } memcpy(tx->tx, entry->tx, entry->num_tx_props * sizeof(struct ipa_ioc_tx_intf_prop)); result = 0; @@ -282,7 +290,6 @@ int ipa3_query_intf_tx_props(struct ipa_ioc_query_intf_tx_props *tx) } } mutex_unlock(&ipa3_ctx->lock); - return result; } @@ -314,6 +321,14 @@ int ipa3_query_intf_rx_props(struct ipa_ioc_query_intf_rx_props *rx) mutex_lock(&ipa3_ctx->lock); list_for_each_entry(entry, &ipa3_ctx->intf_list, link) { if (!strcmp(entry->name, rx->name)) { + /* add the entry check */ + if (entry->num_rx_props != rx->num_rx_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_rx_props, + rx->num_rx_props); + mutex_unlock(&ipa3_ctx->lock); + return result; + } memcpy(rx->rx, entry->rx, entry->num_rx_props * sizeof(struct ipa_ioc_rx_intf_prop)); result = 0; @@ -321,7 +336,6 @@ int ipa3_query_intf_rx_props(struct ipa_ioc_query_intf_rx_props *rx) } } mutex_unlock(&ipa3_ctx->lock); - return result; } @@ -348,6 +362,14 @@ int ipa3_query_intf_ext_props(struct ipa_ioc_query_intf_ext_props *ext) mutex_lock(&ipa3_ctx->lock); list_for_each_entry(entry, &ipa3_ctx->intf_list, link) { if (!strcmp(entry->name, ext->name)) { + /* add the entry check */ + if (entry->num_ext_props != ext->num_ext_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_ext_props, + ext->num_ext_props); + mutex_unlock(&ipa3_ctx->lock); + return result; + } memcpy(ext->ext, entry->ext, entry->num_ext_props * sizeof(struct ipa_ioc_ext_intf_prop)); result = 0; From 6a65eef28ead7acd7532915069999e011a960093 Mon Sep 17 00:00:00 2001 From: Manish Poddar Date: Fri, 9 Dec 2016 11:54:37 +0530 Subject: [PATCH 0670/1015] msm: camera: Lack of copy_from_user in camera driver. In msm_copy_camera_private_ioctl_args function in msm_buf_mgr camera driver arg is pointing to an address in userspace and not kernel. Done changes to use copy_from_user to fix it. Change-Id: Ia9b747dcf86b448656a5d3676455ccb4eccd4e5a Signed-off-by: Manish Poddar --- drivers/media/platform/msm/camera_v2/msm.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index 4126818776772..19f8dc72724b9 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -1104,17 +1104,21 @@ long msm_copy_camera_private_ioctl_args(unsigned long arg, struct msm_camera_private_ioctl_arg *k_ioctl, void __user **tmp_compat_ioctl_ptr) { - struct msm_camera_private_ioctl_arg *up_ioctl_ptr = - (struct msm_camera_private_ioctl_arg *)arg; + struct msm_camera_private_ioctl_arg up_ioctl; if (WARN_ON(!arg || !k_ioctl || !tmp_compat_ioctl_ptr)) return -EIO; - k_ioctl->id = up_ioctl_ptr->id; - k_ioctl->size = up_ioctl_ptr->size; - k_ioctl->result = up_ioctl_ptr->result; - k_ioctl->reserved = up_ioctl_ptr->reserved; - *tmp_compat_ioctl_ptr = compat_ptr(up_ioctl_ptr->ioctl_ptr); + if (copy_from_user(&up_ioctl, + (struct msm_camera_private_ioctl_arg *)arg, + sizeof(struct msm_camera_private_ioctl_arg))) + return -EFAULT; + + k_ioctl->id = up_ioctl.id; + k_ioctl->size = up_ioctl.size; + k_ioctl->result = up_ioctl.result; + k_ioctl->reserved = up_ioctl.reserved; + *tmp_compat_ioctl_ptr = compat_ptr(up_ioctl.ioctl_ptr); return 0; } From e5e728dbbb5d857b925595e1b5efa1cb05f9b706 Mon Sep 17 00:00:00 2001 From: Rajesh Yadav Date: Wed, 8 Feb 2017 21:05:18 +0530 Subject: [PATCH 0671/1015] msm: mdss: Fix DSPP usage inconsistency issue Dither and IGC blocks in DSPP HW are getting enabled irrespective of left and right mixers being attached to DSPP blocks. Ensure that DSPP Dither and IGC blocks are enabled only when ctrl path either has single mixer or both mixers are attached to DSPP. Disable default IGC and Dither configuration on ctrl destroy. Change-Id: I98d1b356856886cef296e6e4d300fc2dd9cad314 CRs-Fixed: 2001867 Signed-off-by: Rajesh Yadav --- drivers/video/msm/mdss/mdss_mdp.h | 5 +- drivers/video/msm/mdss/mdss_mdp_ctl.c | 90 +++++++++++---------- drivers/video/msm/mdss/mdss_mdp_pp.c | 112 ++++++++++++++------------ 3 files changed, 111 insertions(+), 96 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp.h b/drivers/video/msm/mdss/mdss_mdp.h index 7595978506f9d..5767fd07a2e8b 100644 --- a/drivers/video/msm/mdss/mdss_mdp.h +++ b/drivers/video/msm/mdss/mdss_mdp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1609,7 +1609,8 @@ int mdss_mdp_argc_config(struct msm_fb_data_type *mfd, int mdss_mdp_hist_lut_config(struct msm_fb_data_type *mfd, struct mdp_hist_lut_data *config, u32 *copyback); int mdss_mdp_pp_default_overlay_config(struct msm_fb_data_type *mfd, - struct mdss_panel_data *pdata); + struct mdss_panel_data *pdata, + bool enable); int mdss_mdp_dither_config(struct msm_fb_data_type *mfd, struct mdp_dither_cfg_data *config, u32 *copyback, int copy_from_kernel); diff --git a/drivers/video/msm/mdss/mdss_mdp_ctl.c b/drivers/video/msm/mdss/mdss_mdp_ctl.c index 8534c5619f9eb..db382a79c2f46 100644 --- a/drivers/video/msm/mdss/mdss_mdp_ctl.c +++ b/drivers/video/msm/mdss/mdss_mdp_ctl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -3497,57 +3497,58 @@ int mdss_mdp_ctl_setup(struct mdss_mdp_ctl *ctl) ctl->mixer_left->valid_roi = true; ctl->mixer_left->roi_changed = true; - rc = mdss_mdp_pp_default_overlay_config(ctl->mfd, ctl->panel_data); - /* - * Ignore failure of PP config, ctl set-up can succeed. - */ - if (rc) { - pr_err("failed to set the pp config rc %dfb %d\n", rc, - ctl->mfd->index); - rc = 0; - } - if (ctl->mfd->split_mode == MDP_DUAL_LM_DUAL_DISPLAY) { pr_debug("dual display detected\n"); - return 0; - } - - if (split_fb) - width = ctl->mfd->split_fb_right; + } else { + if (split_fb) + width = ctl->mfd->split_fb_right; - if (width < ctl->width) { - if (ctl->mixer_right == NULL) { - ctl->mixer_right = mdss_mdp_mixer_alloc(ctl, + if (width < ctl->width) { + if (ctl->mixer_right == NULL) { + ctl->mixer_right = mdss_mdp_mixer_alloc(ctl, MDSS_MDP_MIXER_TYPE_INTF, true, 0); - if (!ctl->mixer_right) { - pr_err("unable to allocate right mixer\n"); - if (ctl->mixer_left) - mdss_mdp_mixer_free(ctl->mixer_left); - return -ENOMEM; + if (!ctl->mixer_right) { + pr_err("unable to allocate right mixer\n"); + if (ctl->mixer_left) + mdss_mdp_mixer_free( + ctl->mixer_left); + return -ENOMEM; + } } - } - ctl->mixer_right->is_right_mixer = true; - ctl->mixer_right->width = width; - ctl->mixer_right->height = height; - ctl->mixer_right->roi = (struct mdss_rect) + ctl->mixer_right->is_right_mixer = true; + ctl->mixer_right->width = width; + ctl->mixer_right->height = height; + ctl->mixer_right->roi = (struct mdss_rect) {0, 0, width, height}; - ctl->mixer_right->valid_roi = true; - ctl->mixer_right->roi_changed = true; - } else if (ctl->mixer_right) { - ctl->mixer_right->valid_roi = false; - ctl->mixer_right->roi_changed = false; - mdss_mdp_mixer_free(ctl->mixer_right); - ctl->mixer_right = NULL; - } + ctl->mixer_right->valid_roi = true; + ctl->mixer_right->roi_changed = true; + } else if (ctl->mixer_right) { + ctl->mixer_right->valid_roi = false; + ctl->mixer_right->roi_changed = false; + mdss_mdp_mixer_free(ctl->mixer_right); + ctl->mixer_right = NULL; + } - if (ctl->mixer_right) { - if (!is_dsc_compression(pinfo) || - (pinfo->dsc_enc_total == 1)) - ctl->opmode |= MDSS_MDP_CTL_OP_PACK_3D_ENABLE | + if (ctl->mixer_right) { + if (!is_dsc_compression(pinfo) || + (pinfo->dsc_enc_total == 1)) + ctl->opmode |= MDSS_MDP_CTL_OP_PACK_3D_ENABLE | MDSS_MDP_CTL_OP_PACK_3D_H_ROW_INT; - } else { - ctl->opmode &= ~(MDSS_MDP_CTL_OP_PACK_3D_ENABLE | + } else { + ctl->opmode &= ~(MDSS_MDP_CTL_OP_PACK_3D_ENABLE | MDSS_MDP_CTL_OP_PACK_3D_H_ROW_INT); + } + } + + rc = mdss_mdp_pp_default_overlay_config(ctl->mfd, ctl->panel_data, + true); + /* + * Ignore failure of PP config, ctl set-up can succeed. + */ + if (rc) { + pr_err("failed to set the pp config rc %dfb %d\n", rc, + ctl->mfd->index); + rc = 0; } return 0; } @@ -3908,6 +3909,9 @@ int mdss_mdp_ctl_destroy(struct mdss_mdp_ctl *ctl) CTL_INTF_EVENT_FLAG_DEFAULT); WARN(rc, "unable to close panel for intf=%d\n", ctl->intf_num); + (void) mdss_mdp_pp_default_overlay_config(ctl->mfd, ctl->panel_data, + false); + sctl = mdss_mdp_get_split_ctl(ctl); if (sctl) { pr_debug("destroying split display ctl=%d\n", sctl->num); diff --git a/drivers/video/msm/mdss/mdss_mdp_pp.c b/drivers/video/msm/mdss/mdss_mdp_pp.c index 029fad1834e78..474f240847043 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp.c @@ -596,8 +596,9 @@ static void mdss_mdp_hist_irq_set_mask(u32 irq); static void mdss_mdp_hist_irq_clear_mask(u32 irq); static void mdss_mdp_hist_intr_notify(u32 disp); static int mdss_mdp_panel_default_dither_config(struct msm_fb_data_type *mfd, - u32 panel_bpp); -static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd); + u32 panel_bpp, bool enable); +static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd, + bool enable); static inline int pp_validate_dspp_mfd_block(struct msm_fb_data_type *mfd, int block); static int pp_mfd_release_all(struct msm_fb_data_type *mfd); @@ -3042,7 +3043,8 @@ int mdss_mdp_pp_overlay_init(struct msm_fb_data_type *mfd) } int mdss_mdp_pp_default_overlay_config(struct msm_fb_data_type *mfd, - struct mdss_panel_data *pdata) + struct mdss_panel_data *pdata, + bool enable) { int ret = 0; @@ -3051,13 +3053,14 @@ int mdss_mdp_pp_default_overlay_config(struct msm_fb_data_type *mfd, return -EINVAL; } - ret = mdss_mdp_panel_default_dither_config(mfd, pdata->panel_info.bpp); + ret = mdss_mdp_panel_default_dither_config(mfd, pdata->panel_info.bpp, + enable); if (ret) pr_err("Unable to configure default dither on fb%d ret %d\n", mfd->index, ret); if (pdata->panel_info.type == DTV_PANEL) { - ret = mdss_mdp_limited_lut_igc_config(mfd); + ret = mdss_mdp_limited_lut_igc_config(mfd, enable); if (ret) pr_err("Unable to configure DTV panel default IGC ret %d\n", ret); @@ -3747,7 +3750,8 @@ static void pp_update_igc_lut(struct mdp_igc_lut_data *cfg, writel_relaxed((cfg->c2_data[i] & 0xFFF) | data, addr); } -static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd) +static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd, + bool enable) { int ret = 0; u32 copyback = 0; @@ -3772,7 +3776,10 @@ static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd) pr_err("failed to get default IGC version, ret %d\n", ret); config.version = igc_version.version_info; - config.ops = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE; + if (enable) + config.ops = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE; + else + config.ops = MDP_PP_OPS_DISABLE; config.block = (mfd->index) + MDP_LOGICAL_BLOCK_DISP_0; switch (config.version) { case mdp_igc_v1_7: @@ -4363,7 +4370,7 @@ int mdss_mdp_hist_lut_config(struct msm_fb_data_type *mfd, } static int mdss_mdp_panel_default_dither_config(struct msm_fb_data_type *mfd, - u32 panel_bpp) + u32 panel_bpp, bool enable) { int ret = 0; struct mdp_dither_cfg_data dither; @@ -4388,55 +4395,58 @@ static int mdss_mdp_panel_default_dither_config(struct msm_fb_data_type *mfd, return ret; } dither.version = dither_version.version_info; - - switch (panel_bpp) { - case 24: - dither.flags = MDP_PP_OPS_ENABLE | MDP_PP_OPS_WRITE; - switch (dither.version) { - case mdp_dither_v1_7: - dither_data.g_y_depth = 8; - dither_data.r_cr_depth = 8; - dither_data.b_cb_depth = 8; - /* - * Use default dither table by setting len to 0 - */ - dither_data.len = 0; - dither.cfg_payload = &dither_data; - break; - case mdp_pp_legacy: - default: - dither.g_y_depth = 8; - dither.r_cr_depth = 8; - dither.b_cb_depth = 8; - dither.cfg_payload = NULL; + dither.cfg_payload = NULL; + + if (enable) { + switch (panel_bpp) { + case 24: + dither.flags = MDP_PP_OPS_ENABLE | MDP_PP_OPS_WRITE; + switch (dither.version) { + case mdp_dither_v1_7: + dither_data.g_y_depth = 8; + dither_data.r_cr_depth = 8; + dither_data.b_cb_depth = 8; + /* + * Use default dither table by setting len to 0 + */ + dither_data.len = 0; + dither.cfg_payload = &dither_data; + break; + case mdp_pp_legacy: + default: + dither.g_y_depth = 8; + dither.r_cr_depth = 8; + dither.b_cb_depth = 8; + dither.cfg_payload = NULL; + break; + } break; - } - break; - case 18: - dither.flags = MDP_PP_OPS_ENABLE | MDP_PP_OPS_WRITE; - switch (dither.version) { - case mdp_dither_v1_7: - dither_data.g_y_depth = 6; - dither_data.r_cr_depth = 6; - dither_data.b_cb_depth = 6; - /* - * Use default dither table by setting len to 0 - */ - dither_data.len = 0; - dither.cfg_payload = &dither_data; + case 18: + dither.flags = MDP_PP_OPS_ENABLE | MDP_PP_OPS_WRITE; + switch (dither.version) { + case mdp_dither_v1_7: + dither_data.g_y_depth = 6; + dither_data.r_cr_depth = 6; + dither_data.b_cb_depth = 6; + /* + * Use default dither table by setting len to 0 + */ + dither_data.len = 0; + dither.cfg_payload = &dither_data; + break; + case mdp_pp_legacy: + default: + dither.g_y_depth = 6; + dither.r_cr_depth = 6; + dither.b_cb_depth = 6; + dither.cfg_payload = NULL; + break; + } break; - case mdp_pp_legacy: default: - dither.g_y_depth = 6; - dither.r_cr_depth = 6; - dither.b_cb_depth = 6; dither.cfg_payload = NULL; break; } - break; - default: - dither.cfg_payload = NULL; - break; } ret = mdss_mdp_dither_config(mfd, &dither, NULL, true); if (ret) From 70fac83a71ef93ed208ecf1238901c842ce8e31e Mon Sep 17 00:00:00 2001 From: Anand Kumar Date: Mon, 2 Jan 2017 13:05:12 +0530 Subject: [PATCH 0672/1015] wcnss: Dump WCNSS registers during reset FIQ Dump required WCNSS registers which help to debug WCNSS failure during reset FIQ. CRs-Fixed: 1105771 Change-Id: Icba111bd2786c744e30ad83f1f935abf06102ae3 Signed-off-by: Anand Kumar --- drivers/net/wireless/wcnss/wcnss_wlan.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c index 438d63b2952d7..e93fd7d83b8c9 100644 --- a/drivers/net/wireless/wcnss/wcnss_wlan.c +++ b/drivers/net/wireless/wcnss/wcnss_wlan.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1121,7 +1121,7 @@ void wcnss_log_debug_regs_on_bite(void) pr_debug("wcnss: clock frequency is: %luHz\n", clk_rate); if (clk_rate) { - wcnss_pronto_dump_regs(); + wcnss_pronto_log_debug_regs(); if (wcnss_get_mux_control()) wcnss_log_iris_regs(); } else { @@ -1141,7 +1141,7 @@ void wcnss_reset_fiq(bool clk_chk_en) if (clk_chk_en) { wcnss_log_debug_regs_on_bite(); } else { - wcnss_pronto_dump_regs(); + wcnss_pronto_log_debug_regs(); if (wcnss_get_mux_control()) wcnss_log_iris_regs(); } From b3be44414369983f84ec45458ffe461e67ed932d Mon Sep 17 00:00:00 2001 From: Xiaojun Sang Date: Fri, 24 Feb 2017 16:13:20 +0800 Subject: [PATCH 0673/1015] ASoC: msm: qdsp6v2: set pointer to NULL after free Pointer after kfree is not sanitized. Set pointer to NULL. CRs-Fixed: 2008031 Change-Id: Ia59a57fcd142a6ed18d168992b8da4019314afa4 Signed-off-by: Xiaojun Sang --- sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c | 1 + sound/soc/msm/qdsp6v2/msm-pcm-afe-v2.c | 3 ++- sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c | 3 ++- sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c | 4 +++- sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.c | 5 ++++- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c index d6c335a0770cd..a0cc3ad2ddbc6 100644 --- a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c @@ -1302,6 +1302,7 @@ static int msm_compr_free(struct snd_compr_stream *cstream) kfree(pdata->dec_params[soc_prtd->dai_link->be_id]); pdata->dec_params[soc_prtd->dai_link->be_id] = NULL; kfree(prtd); + runtime->private_data = NULL; return 0; } diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-afe-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-afe-v2.c index d65108e04e0bd..b1a1ea54a73e7 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-afe-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-afe-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -684,6 +684,7 @@ static int msm_afe_close(struct snd_pcm_substream *substream) mutex_unlock(&prtd->lock); prtd->prepared--; kfree(prtd); + runtime->private_data = NULL; return 0; } static int msm_afe_prepare(struct snd_pcm_substream *substream) diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c index 65c0e51e47636..a7619fdae5460 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -478,6 +478,7 @@ static int msm_pcm_playback_close(struct snd_pcm_substream *substream) pr_debug("%s\n", __func__); kfree(prtd); + runtime->private_data = NULL; return 0; } diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c b/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c index 06123184fc034..289049c7fac2d 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -544,6 +544,8 @@ static int msm_pcm_close(struct snd_pcm_substream *substream) SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE); kfree(prtd); + runtime->private_data = NULL; + return 0; } diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.c index e6cf312009ad9..07aca5cb5eca9 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -738,6 +738,8 @@ static int msm_pcm_playback_close(struct snd_pcm_substream *substream) msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->be_id, SNDRV_PCM_STREAM_PLAYBACK); kfree(prtd); + runtime->private_data = NULL; + return 0; } @@ -841,6 +843,7 @@ static int msm_pcm_capture_close(struct snd_pcm_substream *substream) msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->be_id, SNDRV_PCM_STREAM_CAPTURE); kfree(prtd); + runtime->private_data = NULL; return 0; } From b031e38092d586f2beefd822230f253aadf674fc Mon Sep 17 00:00:00 2001 From: Dmitry Shmidt Date: Mon, 25 Apr 2016 14:28:30 -0700 Subject: [PATCH 0674/1015] Revert "mm: vmscan: Add a debug file for shrinkers" Kernel panic when type "cat /sys/kernel/debug/shrinker" Unable to handle kernel paging request at virtual address 0af37d40 pgd = d4dec000 [0af37d40] *pgd=00000000 Internal error: Oops: 5 [#1] PREEMPT SMP ARM [] (_raw_spin_lock) from [] (list_lru_count_one+0x14/0x28) [] (list_lru_count_one) from [] (super_cache_count+0x40/0xa0) [] (super_cache_count) from [] (debug_shrinker_show+0x50/0x90) [] (debug_shrinker_show) from [] (seq_read+0x1ec/0x48c) [] (seq_read) from [] (__vfs_read+0x20/0xd0) [] (__vfs_read) from [] (vfs_read+0x7c/0x104) [] (vfs_read) from [] (SyS_read+0x44/0x9c) [] (SyS_read) from [] (ret_fast_syscall+0x0/0x3c) Code: e1a04000 e3a00001 ebd66b39 f594f000 (e1943f9f) ---[ end trace 60c74014a63a9688 ]--- Kernel panic - not syncing: Fatal exception shrink_control.nid is used but not initialzed, same for shrink_control.memcg. This reverts commit b0e7a582b2264cdf75874dcd8df915b6b4427755. Change-Id: I108de88fa4baaef99a53c4e4c6a1d8c4b4804157 Reported-by: Xiaowen Liu Signed-off-by: Dmitry Shmidt Git-commit: ad95c12f66df9efae04b15d5c4d0d0ba56ab2620 Git-repo: https://source.codeaurora.org/quic/la/kernel/msm-4.4.git Signed-off-by: Vinayak Menon --- mm/vmscan.c | 43 ------------------------------------------- 1 file changed, 43 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index fc1c933b73d3c..0e7f752f779ef 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -46,7 +46,6 @@ #include #include #include -#include #include #include @@ -200,39 +199,6 @@ static unsigned long get_lru_size(struct lruvec *lruvec, enum lru_list lru) return zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru); } -struct dentry *debug_file; - -static int debug_shrinker_show(struct seq_file *s, void *unused) -{ - struct shrinker *shrinker; - struct shrink_control sc; - - sc.gfp_mask = -1; - sc.nr_to_scan = 0; - - down_read(&shrinker_rwsem); - list_for_each_entry(shrinker, &shrinker_list, list) { - int num_objs; - - num_objs = shrinker->count_objects(shrinker, &sc); - seq_printf(s, "%pf %d\n", shrinker->scan_objects, num_objs); - } - up_read(&shrinker_rwsem); - return 0; -} - -static int debug_shrinker_open(struct inode *inode, struct file *file) -{ - return single_open(file, debug_shrinker_show, inode->i_private); -} - -static const struct file_operations debug_shrinker_fops = { - .open = debug_shrinker_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - /* * Add a shrinker callback to be called from the vm. */ @@ -262,15 +228,6 @@ int register_shrinker(struct shrinker *shrinker) } EXPORT_SYMBOL(register_shrinker); -static int __init add_shrinker_debug(void) -{ - debugfs_create_file("shrinker", 0644, NULL, NULL, - &debug_shrinker_fops); - return 0; -} - -late_initcall(add_shrinker_debug); - /* * Remove one */ From f1af7d18da010542c5dd7e034ffca14c5a03f6b6 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Mon, 13 Mar 2017 17:49:58 +0530 Subject: [PATCH 0675/1015] msm: msm_bus: Set current index to default value When a client unregisters with bus driver after registering with it, without a bandwidth update request in-between, the current index is not having valid value, so update it to default value of 0. Change-Id: I03d691fd4bbfc557e580233cc9075c027a8ef177 Signed-off-by: Odelu Kukatla --- drivers/platform/msm/msm_bus/msm_bus_arb_adhoc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/msm/msm_bus/msm_bus_arb_adhoc.c b/drivers/platform/msm/msm_bus/msm_bus_arb_adhoc.c index 6d66be3dcebfa..ec9b56026caa5 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_arb_adhoc.c +++ b/drivers/platform/msm/msm_bus/msm_bus_arb_adhoc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is Mree software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -871,7 +871,7 @@ static void unregister_client_adhoc(uint32_t cl) } curr = client->curr; - if (curr >= pdata->num_usecases) { + if ((curr < 0) || (curr >= pdata->num_usecases)) { MSM_BUS_ERR("Invalid index Defaulting curr to 0"); curr = 0; } From af37375834fe1dd7a7a08c6042664ffc2a1a3beb Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Thu, 22 Dec 2016 14:57:44 +0530 Subject: [PATCH 0676/1015] hid: usbhid: Changes to prevent buffer overflow Moved some value checks to right positions to prevent buffer flow, which may be possible before. Previously these value checks are in an else statement which may not be executed. Change-Id: I02dbecd074183581a6bdae6377097bc004bd3d3c CRs-fixed: 1102936 Signed-off-by: Sriharsha Allenki --- drivers/hid/usbhid/hiddev.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index 2f1ddca6f2e0a..602f16373179c 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c @@ -510,18 +510,19 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd, goto inval; field = report->field[uref->field_index]; + } - if (cmd == HIDIOCGCOLLECTIONINDEX) { - if (uref->usage_index >= field->maxusage) - goto inval; - } else if (uref->usage_index >= field->report_count) + if (cmd == HIDIOCGCOLLECTIONINDEX) { + if (uref->usage_index >= field->maxusage) goto inval; + } else if (uref->usage_index >= field->report_count) + goto inval; - else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && - (uref_multi->num_values > HID_MAX_MULTI_USAGES || - uref->usage_index + uref_multi->num_values > field->report_count)) - goto inval; - } + else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && + (uref_multi->num_values > HID_MAX_MULTI_USAGES || + uref->usage_index + uref_multi->num_values > + field->report_count)) + goto inval; switch (cmd) { case HIDIOCGUSAGE: From a2e932cce9b0eef35525cf40a55d82ec577350c9 Mon Sep 17 00:00:00 2001 From: gopikrishnaiah Anand Date: Fri, 13 Jan 2017 10:59:37 -0800 Subject: [PATCH 0677/1015] msm: mdss: fix check for igc read IGC length is same for all versions of igc. Remove the check for igc version in igc read function Change-Id: Iaa3cc91db0b2ba6a3e3fb00eb0b1ea5405e0ef9b CRs-fixed: 1109117 Signed-off-by: Gopikrishnaiah Anand --- drivers/video/msm/mdss/mdss_mdp_pp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_pp.c b/drivers/video/msm/mdss/mdss_mdp_pp.c index 474f240847043..32fed5027f492 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp.c @@ -3831,8 +3831,7 @@ int mdss_mdp_igc_lut_config(struct msm_fb_data_type *mfd, disp_num = config->block - MDP_LOGICAL_BLOCK_DISP_0; if (config->ops & MDP_PP_OPS_READ) { - if (config->len != IGC_LUT_ENTRIES && - !pp_ops[IGC].pp_get_config) { + if (config->len != IGC_LUT_ENTRIES) { pr_err("invalid len for IGC table for read %d\n", config->len); return -EINVAL; From ad49cf6615981be130bfa1518cdbcb06dabf25b7 Mon Sep 17 00:00:00 2001 From: Daniel Rosenberg Date: Mon, 5 Dec 2016 16:28:28 -0800 Subject: [PATCH 0678/1015] ANDROID: ion: check for kref overflow Userspace can cause the kref to handles to increment arbitrarily high. Ensure it does not overflow. Signed-off-by: Daniel Rosenberg Bug: 31992382 Test: See bug for poc Change-Id: I6bff1df385742b1d836d43180dc87fadcea80782 Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 0c702db4d90de88df11057bcf0d8fb2dfe741605 Signed-off-by: Dennis Cagle --- drivers/staging/android/ion/ion.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index 92f9f447df87f..8d03897b6c9d6 100755 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -16,6 +16,7 @@ * */ +#include #include #include #include @@ -406,6 +407,15 @@ static void ion_handle_get(struct ion_handle *handle) kref_get(&handle->ref); } +/* Must hold the client lock */ +static struct ion_handle* ion_handle_get_check_overflow(struct ion_handle *handle) +{ + if (atomic_read(&handle->ref.refcount) + 1 == 0) + return ERR_PTR(-EOVERFLOW); + ion_handle_get(handle); + return handle; +} + static int ion_handle_put_nolock(struct ion_handle *handle) { int ret; @@ -452,9 +462,9 @@ static struct ion_handle *ion_handle_get_by_id_nolock(struct ion_client *client, handle = idr_find(&client->idr, id); if (handle) - ion_handle_get(handle); + return ion_handle_get_check_overflow(handle); - return handle ? handle : ERR_PTR(-EINVAL); + return ERR_PTR(-EINVAL); } struct ion_handle *ion_handle_get_by_id(struct ion_client *client, @@ -1407,7 +1417,7 @@ struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd) /* if a handle exists for this buffer just take a reference to it */ handle = ion_handle_lookup(client, buffer); if (!IS_ERR(handle)) { - ion_handle_get(handle); + handle = ion_handle_get_check_overflow(handle); mutex_unlock(&client->lock); goto end; } From 84be7883955fe21b022243daf577570e0ca07985 Mon Sep 17 00:00:00 2001 From: Sandeep Panda Date: Tue, 7 Feb 2017 14:55:56 +0530 Subject: [PATCH 0679/1015] msm: mdss: mask DSI FIFO overflow errors during BTA operation For some DSI panels where porch values are less, if BTA operation does not finish in BLLP period, then fake overflow errors are expected. So disable DSI FIFO overflow errors before triggering BTA and enable it back once BTA acknowledgment is received for video mode panels. Change-Id: If63ac6435f5786c834fe797478c38a9a2f51076b Signed-off-by: Sandeep Panda --- drivers/video/msm/mdss/mdss_dsi_host.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index a03aa349cbc1e..ac7b259eb3b93 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -1424,6 +1424,7 @@ int mdss_dsi_bta_status_check(struct mdss_dsi_ctrl_pdata *ctrl_pdata) { int ret = 0; unsigned long flag; + int ignore_underflow = 0; if (ctrl_pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); @@ -1438,6 +1439,9 @@ int mdss_dsi_bta_status_check(struct mdss_dsi_ctrl_pdata *ctrl_pdata) mutex_lock(&ctrl_pdata->cmd_mutex); + if (ctrl_pdata->panel_mode == DSI_VIDEO_MODE) + ignore_underflow = 1; + pr_debug("%s: Checking BTA status\n", __func__); mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, @@ -1446,6 +1450,9 @@ int mdss_dsi_bta_status_check(struct mdss_dsi_ctrl_pdata *ctrl_pdata) reinit_completion(&ctrl_pdata->bta_comp); mdss_dsi_enable_irq(ctrl_pdata, DSI_BTA_TERM); spin_unlock_irqrestore(&ctrl_pdata->mdp_lock, flag); + /* mask out overflow errors */ + if (ignore_underflow) + mdss_dsi_set_reg(ctrl_pdata, 0x10c, 0x0f0000, 0x0f0000); MIPI_OUTP(ctrl_pdata->ctrl_base + 0x098, 0x01); /* trigger */ wmb(); @@ -1456,6 +1463,13 @@ int mdss_dsi_bta_status_check(struct mdss_dsi_ctrl_pdata *ctrl_pdata) pr_err("%s: DSI BTA error: %i\n", __func__, ret); } + if (ignore_underflow) { + /* clear pending overflow status */ + mdss_dsi_set_reg(ctrl_pdata, 0xc, 0xffffffff, 0x44440000); + /* restore overflow isr */ + mdss_dsi_set_reg(ctrl_pdata, 0x10c, 0x0f0000, 0); + } + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); pr_debug("%s: BTA done with ret: %d\n", __func__, ret); From 8bc3aaf42b8a1feaaa2a3726454b9cde75ba540f Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Tue, 20 Dec 2016 15:59:19 -0800 Subject: [PATCH 0680/1015] android: fiq_debugger: restrict access to critical commands. Sysrq must be enabled via /proc/sys/kernel/sysrq as a security measure to enable various critical fiq debugger commands that either leak information or can be used as a system attack. Default disabled, this will leave the reboot, reset, irqs, sleep, nosleep, console and ps commands. Reboot and reset commands will be restricted from taking any parameters. We will also switch to showing the limited command set in this mode. Signed-off-by: Mark Salyzyn Bug: 32402555 Change-Id: I3f74b1ff5e4971d619bcb37a911fed68fbb538d5 [d-cagle@codeaurora.org: Resolve merge conflict] Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 1031836c0895f1f5a05c25efec83bfa11aa08ca9 Signed-off-by: Dennis Cagle --- .../android/fiq_debugger/fiq_debugger.c | 86 ++++++++++++------- drivers/tty/sysrq.c | 3 +- include/linux/sysrq.h | 1 + 3 files changed, 57 insertions(+), 33 deletions(-) diff --git a/drivers/staging/android/fiq_debugger/fiq_debugger.c b/drivers/staging/android/fiq_debugger/fiq_debugger.c index 52f681674c539..0abced1ec6221 100644 --- a/drivers/staging/android/fiq_debugger/fiq_debugger.c +++ b/drivers/staging/android/fiq_debugger/fiq_debugger.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -395,7 +396,7 @@ static void fiq_debugger_work(struct work_struct *work) cmd += 6; while (*cmd == ' ') cmd++; - if (cmd != '\0') + if ((cmd != '\0') && sysrq_on()) kernel_restart(cmd); else kernel_restart(NULL); @@ -425,29 +426,39 @@ static void fiq_debugger_irq_exec(struct fiq_debugger_state *state, char *cmd) static void fiq_debugger_help(struct fiq_debugger_state *state) { fiq_debugger_printf(&state->output, - "FIQ Debugger commands:\n" - " pc PC status\n" - " regs Register dump\n" - " allregs Extended Register dump\n" - " bt Stack trace\n" - " reboot [] Reboot with command \n" - " reset [] Hard reset with command \n" - " irqs Interupt status\n" - " kmsg Kernel log\n" - " version Kernel version\n"); - fiq_debugger_printf(&state->output, - " sleep Allow sleep while in FIQ\n" - " nosleep Disable sleep while in FIQ\n" - " console Switch terminal to console\n" - " cpu Current CPU\n" - " cpu Switch to CPU\n"); + "FIQ Debugger commands:\n"); + if (sysrq_on()) { + fiq_debugger_printf(&state->output, + " pc PC status\n" + " regs Register dump\n" + " allregs Extended Register dump\n" + " bt Stack trace\n"); + fiq_debugger_printf(&state->output, + " reboot [] Reboot with command \n" + " reset [] Hard reset with command \n" + " irqs Interrupt status\n" + " kmsg Kernel log\n" + " version Kernel version\n"); + fiq_debugger_printf(&state->output, + " cpu Current CPU\n" + " cpu Switch to CPU\n" + " sysrq sysrq options\n" + " sysrq Execute sysrq with \n"); + } else { + fiq_debugger_printf(&state->output, + " reboot Reboot\n" + " reset Hard reset\n" + " irqs Interrupt status\n"); + } fiq_debugger_printf(&state->output, - " ps Process list\n" - " sysrq sysrq options\n" - " sysrq Execute sysrq with \n"); + " sleep Allow sleep while in FIQ\n" + " nosleep Disable sleep while in FIQ\n" + " console Switch terminal to console\n" + " ps Process list\n"); #ifdef CONFIG_KGDB - fiq_debugger_printf(&state->output, - " kgdb Enter kernel debugger\n"); + if (fiq_kgdb_enable) { + fiq_debugger_printf(&state->output, + " kgdb Enter kernel debugger\n"); #endif } @@ -479,18 +490,23 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, if (!strcmp(cmd, "help") || !strcmp(cmd, "?")) { fiq_debugger_help(state); } else if (!strcmp(cmd, "pc")) { - fiq_debugger_dump_pc(&state->output, regs); + if (sysrq_on()) + fiq_debugger_dump_pc(&state->output, regs); } else if (!strcmp(cmd, "regs")) { - fiq_debugger_dump_regs(&state->output, regs); + if (sysrq_on()) + fiq_debugger_dump_regs(&state->output, regs); } else if (!strcmp(cmd, "allregs")) { - fiq_debugger_dump_allregs(&state->output, regs); + if (sysrq_on()) + fiq_debugger_dump_allregs(&state->output, regs); } else if (!strcmp(cmd, "bt")) { - fiq_debugger_dump_stacktrace(&state->output, regs, 100, svc_sp); + if (sysrq_on()) + fiq_debugger_dump_stacktrace(&state->output, regs, + 100, svc_sp); } else if (!strncmp(cmd, "reset", 5)) { cmd += 5; while (*cmd == ' ') cmd++; - if (*cmd) { + if (*cmd && sysrq_on()) { char tmp_cmd[32]; strlcpy(tmp_cmd, cmd, sizeof(tmp_cmd)); machine_restart(tmp_cmd); @@ -500,9 +516,12 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, } else if (!strcmp(cmd, "irqs")) { fiq_debugger_dump_irqs(state); } else if (!strcmp(cmd, "kmsg")) { - fiq_debugger_dump_kernel_log(state); + if (sysrq_on()) + fiq_debugger_dump_kernel_log(state); } else if (!strcmp(cmd, "version")) { - fiq_debugger_printf(&state->output, "%s\n", linux_banner); + if (sysrq_on()) + fiq_debugger_printf(&state->output, "%s\n", + linux_banner); } else if (!strcmp(cmd, "sleep")) { state->no_sleep = false; fiq_debugger_printf(&state->output, "enabling sleep\n"); @@ -514,14 +533,17 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, fiq_debugger_uart_flush(state); state->console_enable = true; } else if (!strcmp(cmd, "cpu")) { - fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); - } else if (!strncmp(cmd, "cpu ", 4)) { + if (sysrq_on()) + fiq_debugger_printf(&state->output, "cpu %d\n", + state->current_cpu); + } else if (!strncmp(cmd, "cpu ", 4) && sysrq_on()) { unsigned long cpu = 0; if (kstrtoul(cmd + 4, 10, &cpu) == 0) fiq_debugger_switch_cpu(state, cpu); else fiq_debugger_printf(&state->output, "invalid cpu\n"); - fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); + fiq_debugger_printf(&state->output, "cpu %d\n", + state->current_cpu); } else { if (state->debug_busy) { fiq_debugger_printf(&state->output, diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c index d0c19b1944af2..2ecb3631bc811 100644 --- a/drivers/tty/sysrq.c +++ b/drivers/tty/sysrq.c @@ -58,10 +58,11 @@ static bool __read_mostly sysrq_always_enabled; unsigned short platform_sysrq_reset_seq[] __weak = { KEY_RESERVED }; int sysrq_reset_downtime_ms __weak; -static bool sysrq_on(void) +bool sysrq_on(void) { return sysrq_enabled || sysrq_always_enabled; } +EXPORT_SYMBOL(sysrq_on); /* * A value of 1 means 'all', other nonzero values are an op mask: diff --git a/include/linux/sysrq.h b/include/linux/sysrq.h index 387fa7d05c982..d802692acb539 100644 --- a/include/linux/sysrq.h +++ b/include/linux/sysrq.h @@ -42,6 +42,7 @@ struct sysrq_key_op { * are available -- else NULL's). */ +bool sysrq_on(void); void handle_sysrq(int key); void __handle_sysrq(int key, bool check_mask); int register_sysrq_key(int key, struct sysrq_key_op *op); From 61c5e5a5c7ad0e7891d7b823935b4f8ccd65498d Mon Sep 17 00:00:00 2001 From: Guillaume Nault Date: Fri, 18 Nov 2016 22:13:00 +0100 Subject: [PATCH 0681/1015] l2tp: fix racy SOCK_ZAPPED flag check in l2tp_ip{,6}_bind() Lock socket before checking the SOCK_ZAPPED flag in l2tp_ip6_bind(). Without lock, a concurrent call could modify the socket flags between the sock_flag(sk, SOCK_ZAPPED) test and the lock_sock() call. This way, a socket could be inserted twice in l2tp_ip6_bind_table. Releasing it would then leave a stale pointer there, generating use-after-free errors when walking through the list or modifying adjacent entries. BUG: KASAN: use-after-free in l2tp_ip6_close+0x22e/0x290 at addr ffff8800081b0ed8 Write of size 8 by task syz-executor/10987 CPU: 0 PID: 10987 Comm: syz-executor Not tainted 4.8.0+ #39 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.8.2-0-g33fbe13 by qemu-project.org 04/01/2014 ffff880031d97838 ffffffff829f835b ffff88001b5a1640 ffff8800081b0ec0 ffff8800081b15a0 ffff8800081b6d20 ffff880031d97860 ffffffff8174d3cc ffff880031d978f0 ffff8800081b0e80 ffff88001b5a1640 ffff880031d978e0 Call Trace: [] dump_stack+0xb3/0x118 lib/dump_stack.c:15 [] kasan_object_err+0x1c/0x70 mm/kasan/report.c:156 [< inline >] print_address_description mm/kasan/report.c:194 [] kasan_report_error+0x1f6/0x4d0 mm/kasan/report.c:283 [< inline >] kasan_report mm/kasan/report.c:303 [] __asan_report_store8_noabort+0x3e/0x40 mm/kasan/report.c:329 [< inline >] __write_once_size ./include/linux/compiler.h:249 [< inline >] __hlist_del ./include/linux/list.h:622 [< inline >] hlist_del_init ./include/linux/list.h:637 [] l2tp_ip6_close+0x22e/0x290 net/l2tp/l2tp_ip6.c:239 [] inet_release+0xed/0x1c0 net/ipv4/af_inet.c:415 [] inet6_release+0x50/0x70 net/ipv6/af_inet6.c:422 [] sock_release+0x8d/0x1d0 net/socket.c:570 [] sock_close+0x16/0x20 net/socket.c:1017 [] __fput+0x28c/0x780 fs/file_table.c:208 [] ____fput+0x15/0x20 fs/file_table.c:244 [] task_work_run+0xf9/0x170 [] do_exit+0x85e/0x2a00 [] do_group_exit+0x108/0x330 [] get_signal+0x617/0x17a0 kernel/signal.c:2307 [] do_signal+0x7f/0x18f0 [] exit_to_usermode_loop+0xbf/0x150 arch/x86/entry/common.c:156 [< inline >] prepare_exit_to_usermode arch/x86/entry/common.c:190 [] syscall_return_slowpath+0x1a0/0x1e0 arch/x86/entry/common.c:259 [] entry_SYSCALL_64_fastpath+0xc4/0xc6 Object at ffff8800081b0ec0, in cache L2TP/IPv6 size: 1448 Allocated: PID = 10987 [ 1116.897025] [] save_stack_trace+0x16/0x20 [ 1116.897025] [] save_stack+0x46/0xd0 [ 1116.897025] [] kasan_kmalloc+0xad/0xe0 [ 1116.897025] [] kasan_slab_alloc+0x12/0x20 [ 1116.897025] [< inline >] slab_post_alloc_hook mm/slab.h:417 [ 1116.897025] [< inline >] slab_alloc_node mm/slub.c:2708 [ 1116.897025] [< inline >] slab_alloc mm/slub.c:2716 [ 1116.897025] [] kmem_cache_alloc+0xc8/0x2b0 mm/slub.c:2721 [ 1116.897025] [] sk_prot_alloc+0x69/0x2b0 net/core/sock.c:1326 [ 1116.897025] [] sk_alloc+0x38/0xae0 net/core/sock.c:1388 [ 1116.897025] [] inet6_create+0x2d7/0x1000 net/ipv6/af_inet6.c:182 [ 1116.897025] [] __sock_create+0x37b/0x640 net/socket.c:1153 [ 1116.897025] [< inline >] sock_create net/socket.c:1193 [ 1116.897025] [< inline >] SYSC_socket net/socket.c:1223 [ 1116.897025] [] SyS_socket+0xef/0x1b0 net/socket.c:1203 [ 1116.897025] [] entry_SYSCALL_64_fastpath+0x23/0xc6 Freed: PID = 10987 [ 1116.897025] [] save_stack_trace+0x16/0x20 [ 1116.897025] [] save_stack+0x46/0xd0 [ 1116.897025] [] kasan_slab_free+0x71/0xb0 [ 1116.897025] [< inline >] slab_free_hook mm/slub.c:1352 [ 1116.897025] [< inline >] slab_free_freelist_hook mm/slub.c:1374 [ 1116.897025] [< inline >] slab_free mm/slub.c:2951 [ 1116.897025] [] kmem_cache_free+0xc8/0x330 mm/slub.c:2973 [ 1116.897025] [< inline >] sk_prot_free net/core/sock.c:1369 [ 1116.897025] [] __sk_destruct+0x32b/0x4f0 net/core/sock.c:1444 [ 1116.897025] [] sk_destruct+0x44/0x80 net/core/sock.c:1452 [ 1116.897025] [] __sk_free+0x53/0x220 net/core/sock.c:1460 [ 1116.897025] [] sk_free+0x23/0x30 net/core/sock.c:1471 [ 1116.897025] [] sk_common_release+0x28c/0x3e0 ./include/net/sock.h:1589 [ 1116.897025] [] l2tp_ip6_close+0x1fe/0x290 net/l2tp/l2tp_ip6.c:243 [ 1116.897025] [] inet_release+0xed/0x1c0 net/ipv4/af_inet.c:415 [ 1116.897025] [] inet6_release+0x50/0x70 net/ipv6/af_inet6.c:422 [ 1116.897025] [] sock_release+0x8d/0x1d0 net/socket.c:570 [ 1116.897025] [] sock_close+0x16/0x20 net/socket.c:1017 [ 1116.897025] [] __fput+0x28c/0x780 fs/file_table.c:208 [ 1116.897025] [] ____fput+0x15/0x20 fs/file_table.c:244 [ 1116.897025] [] task_work_run+0xf9/0x170 [ 1116.897025] [] do_exit+0x85e/0x2a00 [ 1116.897025] [] do_group_exit+0x108/0x330 [ 1116.897025] [] get_signal+0x617/0x17a0 kernel/signal.c:2307 [ 1116.897025] [] do_signal+0x7f/0x18f0 [ 1116.897025] [] exit_to_usermode_loop+0xbf/0x150 arch/x86/entry/common.c:156 [ 1116.897025] [< inline >] prepare_exit_to_usermode arch/x86/entry/common.c:190 [ 1116.897025] [] syscall_return_slowpath+0x1a0/0x1e0 arch/x86/entry/common.c:259 [ 1116.897025] [] entry_SYSCALL_64_fastpath+0xc4/0xc6 Memory state around the buggy address: ffff8800081b0d80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc ffff8800081b0e00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc >ffff8800081b0e80: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb ^ ffff8800081b0f00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff8800081b0f80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ================================================================== The same issue exists with l2tp_ip_bind() and l2tp_ip_bind_table. Fixes: c51ce49735c1 ("l2tp: fix oops in L2TP IP sockets for connect() AF_UNSPEC case") Reported-by: Baozeng Ding Reported-by: Andrey Konovalov Tested-by: Baozeng Ding Signed-off-by: Guillaume Nault Signed-off-by: David S. Miller Change-Id: I628eb58c6bc4415e31021e92793d4475b8c8bca5 Git-repo: git://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Git-commit: 32c231164b762dddefa13af5a0101032c70b50ef Signed-off-by: Dennis Cagle --- net/l2tp/l2tp_ip.c | 5 +++-- net/l2tp/l2tp_ip6.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index 369a9822488c4..142f036aa6114 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c @@ -249,8 +249,6 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) int ret; int chk_addr_ret; - if (!sock_flag(sk, SOCK_ZAPPED)) - return -EINVAL; if (addr_len < sizeof(struct sockaddr_l2tpip)) return -EINVAL; if (addr->l2tp_family != AF_INET) @@ -265,6 +263,9 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) read_unlock_bh(&l2tp_ip_lock); lock_sock(sk); + if (!sock_flag(sk, SOCK_ZAPPED)) + goto out; + if (sk->sk_state != TCP_CLOSE || addr_len < sizeof(struct sockaddr_l2tpip)) goto out; diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c index 38658826175ca..17b74814afa66 100644 --- a/net/l2tp/l2tp_ip6.c +++ b/net/l2tp/l2tp_ip6.c @@ -264,8 +264,6 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) int addr_type; int err; - if (!sock_flag(sk, SOCK_ZAPPED)) - return -EINVAL; if (addr->l2tp_family != AF_INET6) return -EINVAL; if (addr_len < sizeof(*addr)) @@ -291,6 +289,9 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) lock_sock(sk); err = -EINVAL; + if (!sock_flag(sk, SOCK_ZAPPED)) + goto out_unlock; + if (sk->sk_state != TCP_CLOSE) goto out_unlock; From 0e8cc58a3cf747a276690085370191f29f879011 Mon Sep 17 00:00:00 2001 From: Philip Pettersson Date: Wed, 30 Nov 2016 14:55:36 -0800 Subject: [PATCH 0682/1015] packet: fix race condition in packet_set_ring When packet_set_ring creates a ring buffer it will initialize a struct timer_list if the packet version is TPACKET_V3. This value can then be raced by a different thread calling setsockopt to set the version to TPACKET_V1 before packet_set_ring has finished. This leads to a use-after-free on a function pointer in the struct timer_list when the socket is closed as the previously initialized timer will not be deleted. The bug is fixed by taking lock_sock(sk) in packet_setsockopt when changing the packet version while also taking the lock at the start of packet_set_ring. Fixes: f6fb8f100b80 ("af-packet: TPACKET_V3 flexible buffer implementation.") Signed-off-by: Philip Pettersson Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller Change-Id: Ia910f64aff0ce7487ac05a7caae5c406e06ec9fd Git-repo: git://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: 84ac7260236a49c79eede91617700174c2c19b0c Signed-off-by: Dennis Cagle --- net/packet/af_packet.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 2c932c9db96f2..a710a6cf265ef 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -3283,19 +3283,25 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv if (optlen != sizeof(val)) return -EINVAL; - if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) - return -EBUSY; if (copy_from_user(&val, optval, sizeof(val))) return -EFAULT; switch (val) { case TPACKET_V1: case TPACKET_V2: case TPACKET_V3: - po->tp_version = val; - return 0; + break; default: return -EINVAL; } + lock_sock(sk); + if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) { + ret = -EBUSY; + } else { + po->tp_version = val; + ret = 0; + } + release_sock(sk); + return ret; } case PACKET_RESERVE: { @@ -3758,6 +3764,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, /* Added to avoid minimal code churn */ struct tpacket_req *req = &req_u->req; + lock_sock(sk); /* Opening a Tx-ring is NOT supported in TPACKET_V3 */ if (!closing && tx_ring && (po->tp_version > TPACKET_V2)) { WARN(1, "Tx-ring is not supported.\n"); @@ -3839,7 +3846,6 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, goto out; } - lock_sock(sk); /* Detach socket from network */ spin_lock(&po->bind_lock); @@ -3888,11 +3894,11 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, if (!tx_ring) prb_shutdown_retire_blk_timer(po, tx_ring, rb_queue); } - release_sock(sk); if (pg_vec) free_pg_vec(pg_vec, order, req->tp_block_nr); out: + release_sock(sk); return err; } From 384722a7fddc6aa93817a2ff197e265a404c765b Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Fri, 2 Dec 2016 09:44:53 -0800 Subject: [PATCH 0683/1015] net: avoid signed overflows for SO_{SND|RCV}BUFFORCE CAP_NET_ADMIN users should not be allowed to set negative sk_sndbuf or sk_rcvbuf values, as it can lead to various memory corruptions, crashes, OOM... Note that before commit 82981930125a ("net: cleanups in sock_setsockopt()"), the bug was even more serious, since SO_SNDBUF and SO_RCVBUF were vulnerable. This needs to be backported to all known linux kernels. Again, many thanks to syzkaller team for discovering this gem. Signed-off-by: Eric Dumazet Reported-by: Andrey Konovalov Signed-off-by: David S. Miller Change-Id: Ie9ac0290d8a8866b1144e2241cb2d77db163a8e1 Git-repo: git://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: b98b0bc8c431e3ceb4b26b0dfc8db509518fb290 Signed-off-by: Dennis Cagle --- net/core/sock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/core/sock.c b/net/core/sock.c index b1a6ff0a9041c..29ec4ed8bbaaf 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -733,7 +733,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, val = min_t(u32, val, sysctl_wmem_max); set_sndbuf: sk->sk_userlocks |= SOCK_SNDBUF_LOCK; - sk->sk_sndbuf = max_t(u32, val * 2, SOCK_MIN_SNDBUF); + sk->sk_sndbuf = max_t(int, val * 2, SOCK_MIN_SNDBUF); /* Wake up sending tasks if we upped the value. */ sk->sk_write_space(sk); break; @@ -769,7 +769,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, * returning the value we actually used in getsockopt * is the most desirable behavior. */ - sk->sk_rcvbuf = max_t(u32, val * 2, SOCK_MIN_RCVBUF); + sk->sk_rcvbuf = max_t(int, val * 2, SOCK_MIN_RCVBUF); break; case SO_RCVBUFFORCE: From 19899b3883842fedb98e80fe0b27524d8dee1bc3 Mon Sep 17 00:00:00 2001 From: Andrew Chant Date: Tue, 17 Jan 2017 07:37:52 -0800 Subject: [PATCH 0684/1015] input: synaptics: put offset checks under mutex. Place file offset validity checks under mutex. BUG: 33555878 BUG: 33002026 Change-Id: I1945cfc8af7d1a310ae0d7bbb85002d4c448f30b Git-repo: https://android.googlesource.com/kernel/msm Git-commit: e1fb1600fc222337989e3084d68df929882deae5 Signed-off-by: Andrew Chant Signed-off-by: Dennis Cagle --- drivers/input/touchscreen/synaptics_rmi_dev.c | 52 +++++++++++++------ 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_rmi_dev.c b/drivers/input/touchscreen/synaptics_rmi_dev.c index 27745ce726b36..1b69d53b9bddf 100644 --- a/drivers/input/touchscreen/synaptics_rmi_dev.c +++ b/drivers/input/touchscreen/synaptics_rmi_dev.c @@ -307,18 +307,26 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, return -EBADF; } - if (count == 0) - return 0; + mutex_lock(&(dev_data->file_mutex)); if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; - tmpbuf = kzalloc(count + 1, GFP_KERNEL); - if (!tmpbuf) - return -ENOMEM; + if (count == 0) { + retval = 0; + goto unlock; + } - mutex_lock(&(dev_data->file_mutex)); + if (*f_pos > REG_ADDR_LIMIT) { + retval = -EFAULT; + goto unlock; + } + tmpbuf = kzalloc(count + 1, GFP_KERNEL); + if (!tmpbuf) { + retval = -ENOMEM; + goto unlock; + } retval = rmidev->fn_ptr->read(rmidev->rmi4_data, *f_pos, tmpbuf, @@ -332,8 +340,9 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, *f_pos += retval; clean_up: - mutex_unlock(&(dev_data->file_mutex)); kfree(tmpbuf); +unlock: + mutex_unlock(&(dev_data->file_mutex)); return retval; } @@ -357,23 +366,32 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, return -EBADF; } - if (count == 0) - return 0; + mutex_lock(&(dev_data->file_mutex)); + + if (*f_pos > REG_ADDR_LIMIT) { + retval = -EFAULT; + goto unlock; + } if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; + if (count == 0) { + retval = 0; + goto unlock; + } + tmpbuf = kzalloc(count + 1, GFP_KERNEL); - if (!tmpbuf) - return -ENOMEM; + if (!tmpbuf) { + retval = -ENOMEM; + goto unlock; + } if (copy_from_user(tmpbuf, buf, count)) { - kfree(tmpbuf); - return -EFAULT; + retval = -EFAULT; + goto clean_up; } - mutex_lock(&(dev_data->file_mutex)); - retval = rmidev->fn_ptr->write(rmidev->rmi4_data, *f_pos, tmpbuf, @@ -381,8 +399,10 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, if (retval >= 0) *f_pos += retval; - mutex_unlock(&(dev_data->file_mutex)); +clean_up: kfree(tmpbuf); +unlock: + mutex_unlock(&(dev_data->file_mutex)); return retval; } From 00bfaa0c2c126a3b6a6620bce0309dfbda3100a5 Mon Sep 17 00:00:00 2001 From: Andrey Ryabinin Date: Thu, 24 Nov 2016 13:23:10 +0000 Subject: [PATCH 0685/1015] mpi: Fix NULL ptr dereference in mpi_powm() [ver #3] This fixes CVE-2016-8650. If mpi_powm() is given a zero exponent, it wants to immediately return either 1 or 0, depending on the modulus. However, if the result was initalised with zero limb space, no limbs space is allocated and a NULL-pointer exception ensues. Fix this by allocating a minimal amount of limb space for the result when the 0-exponent case when the result is 1 and not touching the limb space when the result is 0. This affects the use of RSA keys and X.509 certificates that carry them. BUG: unable to handle kernel NULL pointer dereference at (null) IP: [] mpi_powm+0x32/0x7e6 PGD 0 Oops: 0002 [#1] SMP Modules linked in: CPU: 3 PID: 3014 Comm: keyctl Not tainted 4.9.0-rc6-fscache+ #278 Hardware name: ASUS All Series/H97-PLUS, BIOS 2306 10/09/2014 task: ffff8804011944c0 task.stack: ffff880401294000 RIP: 0010:[] [] mpi_powm+0x32/0x7e6 RSP: 0018:ffff880401297ad8 EFLAGS: 00010212 RAX: 0000000000000000 RBX: ffff88040868bec0 RCX: ffff88040868bba0 RDX: ffff88040868b260 RSI: ffff88040868bec0 RDI: ffff88040868bee0 RBP: ffff880401297ba8 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000047 R11: ffffffff8183b210 R12: 0000000000000000 R13: ffff8804087c7600 R14: 000000000000001f R15: ffff880401297c50 FS: 00007f7a7918c700(0000) GS:ffff88041fb80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000000 CR3: 0000000401250000 CR4: 00000000001406e0 Stack: ffff88040868bec0 0000000000000020 ffff880401297b00 ffffffff81376cd4 0000000000000100 ffff880401297b10 ffffffff81376d12 ffff880401297b30 ffffffff81376f37 0000000000000100 0000000000000000 ffff880401297ba8 Call Trace: [] ? __sg_page_iter_next+0x43/0x66 [] ? sg_miter_get_next_page+0x1b/0x5d [] ? sg_miter_next+0x17/0xbd [] ? mpi_read_raw_from_sgl+0xf2/0x146 [] rsa_verify+0x9d/0xee [] ? pkcs1pad_sg_set_buf+0x2e/0xbb [] pkcs1pad_verify+0xc0/0xe1 [] public_key_verify_signature+0x1b0/0x228 [] x509_check_for_self_signed+0xa1/0xc4 [] x509_cert_parse+0x167/0x1a1 [] x509_key_preparse+0x21/0x1a1 [] asymmetric_key_preparse+0x34/0x61 [] key_create_or_update+0x145/0x399 [] SyS_add_key+0x154/0x19e [] do_syscall_64+0x80/0x191 [] entry_SYSCALL64_slow_path+0x25/0x25 Code: 56 41 55 41 54 53 48 81 ec a8 00 00 00 44 8b 71 04 8b 42 04 4c 8b 67 18 45 85 f6 89 45 80 0f 84 b4 06 00 00 85 c0 75 2f 41 ff ce <49> c7 04 24 01 00 00 00 b0 01 75 0b 48 8b 41 18 48 83 38 01 0f RIP [] mpi_powm+0x32/0x7e6 RSP CR2: 0000000000000000 ---[ end trace d82015255d4a5d8d ]--- Basically, this is a backport of a libgcrypt patch: http://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=patch;h=6e1adb05d290aeeb1c230c763970695f4a538526 Fixes: cdec9cb5167a ("crypto: GnuPG based MPI lib - source files (part 1)") Signed-off-by: Andrey Ryabinin Signed-off-by: David Howells cc: Dmitry Kasatkin cc: linux-ima-devel@lists.sourceforge.net cc: stable@vger.kernel.org Signed-off-by: James Morris Change-Id: I6923933270a657da75ae06acddc71d4b278164df Git-repo: git://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Git-commit: f5527fffff3f002b0a6b376163613b82f69de073 Signed-off-by: Dennis Cagle --- lib/mpi/mpi-pow.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/mpi/mpi-pow.c b/lib/mpi/mpi-pow.c index 5464c8744ea95..e24388a863a76 100644 --- a/lib/mpi/mpi-pow.c +++ b/lib/mpi/mpi-pow.c @@ -64,8 +64,13 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod) if (!esize) { /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 * depending on if MOD equals 1. */ - rp[0] = 1; res->nlimbs = (msize == 1 && mod->d[0] == 1) ? 0 : 1; + if (res->nlimbs) { + if (mpi_resize(res, 1) < 0) + goto enomem; + rp = res->d; + rp[0] = 1; + } res->sign = 0; goto leave; } From 44c96334a60ef1d9cc8a4cbb1b2b1a41c4de95ed Mon Sep 17 00:00:00 2001 From: Jim Lin Date: Fri, 13 Jan 2017 16:07:58 +0800 Subject: [PATCH 0686/1015] CHROMIUM: usb: gadget: configfs: Fix KASAN use-after-free When gadget is disconnected, running sequence is like this. . composite_disconnect . Call trace: usb_string_copy+0xd0/0x128 gadget_config_name_configuration_store+0x4 gadget_config_name_attr_store+0x40/0x50 configfs_write_file+0x198/0x1f4 vfs_write+0x100/0x220 SyS_write+0x58/0xa8 . configfs_composite_unbind . configfs_composite_bind In configfs_composite_bind, it has "cn->strings.s = cn->configuration;" When usb_string_copy is invoked. it would allocate memory, copy input string, release previous pointed memory space, and use new allocated memory. When gadget is connected, host sends down request to get information. Call trace: usb_gadget_get_string+0xec/0x168 lookup_string+0x64/0x98 composite_setup+0xa34/0x1ee8 If gadget is disconnected and connected quickly, in the failed case, cn->configuration memory has been released by usb_string_copy kfree but configfs_composite_bind hasn't been run in time to assign new allocated "cn->configuration" pointer to "cn->strings.s". When "strlen(s->s) of usb_gadget_get_string is being executed, the dangling memory is accessed, "BUG: KASAN: use-after-free" error occurs. BUG=chrome-os-partner:58412 TEST=After smaug device was connected to ubuntu PC host, detached and attached type-C cable quickly several times without seeing "BUG: KASAN: use-after-free in usb_gadget_get_string". Change-Id: I58240ee7c55ae8f8fb8597d14f09c5ac07abb032 Signed-off-by: Jim Lin Reviewed-on: https://chromium-review.googlesource.com/428059 Commit-Ready: Jim Lin Tested-by: Jim Lin Reviewed-by: Adrian Salido Reviewed-by: Benson Leung Git-repo: https://chromium.googlesource.com/chromiumos/third_party/kernel Git-commit: a7b597d255d70f6f0c6bfdfb7e4e04f67fcebf9d Signed-off-by: Dennis Cagle --- drivers/usb/gadget/configfs.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index c2d631b1cd520..29cbc5e0fe7fd 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -130,21 +130,28 @@ struct gadget_config_name { struct list_head list; }; +#define MAX_USB_STRING_LEN 126 +#define MAX_USB_STRING_WITH_NULL_LEN (MAX_USB_STRING_LEN+1) + static int usb_string_copy(const char *s, char **s_copy) { int ret; char *str; char *copy = *s_copy; ret = strlen(s); - if (ret > 126) + if (ret > MAX_USB_STRING_LEN) return -EOVERFLOW; - str = kstrdup(s, GFP_KERNEL); - if (!str) - return -ENOMEM; + if (copy) { + str = copy; + } else { + str = kmalloc(MAX_USB_STRING_WITH_NULL_LEN, GFP_KERNEL); + if (!str) + return -ENOMEM; + } + strncpy(str, s, MAX_USB_STRING_WITH_NULL_LEN); if (str[ret - 1] == '\n') str[ret - 1] = '\0'; - kfree(copy); *s_copy = str; return 0; } From 2faff53a741112ab3270a775b29e94edb54aa799 Mon Sep 17 00:00:00 2001 From: Pratap Nirujogi Date: Sun, 19 Mar 2017 12:10:25 +0530 Subject: [PATCH 0687/1015] msm: camera: cpp: Replace const by macro Replace hardcoded constant 8 with MSM_OUTPUT_BUF_CNT macro. Change-Id: Ia77847fcf4ead7a77fbdedc1b96031ee4f5687dd CRs-Fixed: 2004036 Signed-off-by: Pratap Nirujogi --- include/media/msmb_pproc.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/media/msmb_pproc.h b/include/media/msmb_pproc.h index 623fbfce6c675..1e677f95a375e 100644 --- a/include/media/msmb_pproc.h +++ b/include/media/msmb_pproc.h @@ -5,6 +5,8 @@ #include +#define MSM_OUTPUT_BUF_CNT 8 + #ifdef CONFIG_COMPAT struct msm_cpp_frame_info32_t { int32_t frame_id; @@ -26,7 +28,7 @@ struct msm_cpp_frame_info32_t { uint32_t feature_mask; uint8_t we_disable; struct msm_cpp_buffer_info_t input_buffer_info; - struct msm_cpp_buffer_info_t output_buffer_info[8]; + struct msm_cpp_buffer_info_t output_buffer_info[MSM_OUTPUT_BUF_CNT]; struct msm_cpp_buffer_info_t duplicate_buffer_info; struct msm_cpp_buffer_info_t tnr_scratch_buffer_info[2]; uint32_t reserved; From f06f0295d192279adfc13b34b9dbdbef5c28f5d8 Mon Sep 17 00:00:00 2001 From: Senthil Kumar Rajagopal Date: Wed, 15 Feb 2017 15:08:09 +0530 Subject: [PATCH 0688/1015] msm: isp: fix for potentitial array out of bound access There is no bound check on dual_hw_ms_cmd->num_src, which is coming from userspace num_src is used as the index for the input_src array which has a size of 5. The current code did not check the num_src to make sure that it never exceeds the input_src array size. CRs-Fixed: 2006169 Change-Id: If5927e06e70cce4afb0ae9f2cdfec80f76f83771 Signed-off-by: Senthil Kumar Rajagopal --- drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index dd9e48e85e086..7d1882c2c271c 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -616,6 +616,11 @@ static int msm_isp_set_dual_HW_master_slave_mode( } ISP_DBG("%s: vfe %d num_src %d\n", __func__, vfe_dev->pdev->id, dual_hw_ms_cmd->num_src); + if (dual_hw_ms_cmd->num_src > VFE_SRC_MAX) { + pr_err("%s: Error! Invalid num_src %d\n", __func__, + dual_hw_ms_cmd->num_src); + return -EINVAL; + } /* This for loop is for non-primary intf to be marked with Master/Slave * in order for frame id sync. But their timestamp is not saved. * So no sof_info resource is allocated */ From 2d5874c6fc6a2e7b4a3a9c0932127b6c2017e3ad Mon Sep 17 00:00:00 2001 From: Senthil Kumar Rajagopal Date: Sat, 4 Mar 2017 12:05:44 +0530 Subject: [PATCH 0689/1015] msm: camera: isp: fix for out of bound access array There is no bound check in stream_cfg_cmd->num_streams, in functions msm_isp_check_stream_cfg_cmd and msm_isp_stats_update_cgc_override num_streams is used as the index for stream_cfg_cmd->stream_handle array which has a size of 15. Current code did not check the num_streams to make sure that did not exceed the array size CRs-Fixed: 2006015 Change-Id: I7f195c764a4e6c12e4f7c680bc3c9aa7b078e625 Signed-off-by: Senthil Kumar Rajagopal --- .../platform/msm/camera_v2/isp/msm_isp_stats_util.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c index d48c1a0b7eb3d..d4d2c82559847 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c @@ -598,6 +598,12 @@ static int msm_isp_stats_update_cgc_override(struct vfe_device *vfe_dev, int i; uint32_t stats_mask = 0, idx; + if (stream_cfg_cmd->num_streams > MSM_ISP_STATS_MAX) { + pr_err("%s invalid num_streams %d\n", __func__, + stream_cfg_cmd->num_streams); + return -EINVAL; + } + for (i = 0; i < stream_cfg_cmd->num_streams; i++) { idx = STATS_IDX(stream_cfg_cmd->stream_handle[i]); @@ -668,12 +674,19 @@ static int msm_isp_start_stats_stream(struct vfe_device *vfe_dev, uint32_t num_stats_comp_mask = 0; struct msm_vfe_stats_stream *stream_info; struct msm_vfe_stats_shared_data *stats_data = &vfe_dev->stats_data; + + if (stream_cfg_cmd->num_streams > MSM_ISP_STATS_MAX) { + pr_err("%s invalid num_streams %d\n", __func__, + stream_cfg_cmd->num_streams); + return -EINVAL; + } num_stats_comp_mask = vfe_dev->hw_info->stats_hw_info->num_stats_comp_mask; rc = vfe_dev->hw_info->vfe_ops.stats_ops.check_streams( stats_data->stream_info); if (rc < 0) return rc; + for (i = 0; i < stream_cfg_cmd->num_streams; i++) { idx = STATS_IDX(stream_cfg_cmd->stream_handle[i]); From 5dc87fc72b18203f13047ea66c9a770602cd77ac Mon Sep 17 00:00:00 2001 From: Naseer Ahmed Date: Wed, 11 Jan 2017 12:57:48 -0500 Subject: [PATCH 0690/1015] msm: mdss: Validate cursor image size Check size of cursor image provided by userspace and return error appropriately. Bug: 34125463 CRs-Fixed: 1115406 Change-Id: I31aee3c9219921cf5c4306b36f8708582b838c38 Signed-off-by: Naseer Ahmed --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index e0861124efe83..9ae84b977e5eb 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -3903,6 +3903,12 @@ static int mdss_mdp_hw_cursor_pipe_update(struct msm_fb_data_type *mfd, req->transp_mask = img->bg_color & ~(0xff << var->transp.offset); if (mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) { + if (img->width * img->height * 4 > cursor_frame_size) { + pr_err("cursor image size is too large\n"); + ret = -EINVAL; + goto done; + } + ret = copy_from_user(mfd->cursor_buf, img->data, img->width * img->height * 4); if (ret) { From ff31baf227611c4edc3c74b4ead96349da6f5c32 Mon Sep 17 00:00:00 2001 From: Naseer Ahmed Date: Wed, 1 Feb 2017 16:24:01 -0500 Subject: [PATCH 0691/1015] msm: mdss: Install sync fences after user copy If userspace closes the fd after an error on copying to userspace, the fences may be freed incorrectly. Make sure fences are installed after all checks pass. Bug: 32402303 Change-Id: Ieb50296c87e09549db2734bd70bb6ee8d311ad40 CRs-Fixed: 2000664 Signed-off-by: Naseer Ahmed --- drivers/video/msm/mdss/mdss_fb.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index a7abb6c258349..2f65a082918ef 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -2,7 +2,7 @@ * Core MDSS framebuffer driver. * * Copyright (C) 2007 Google Incorporated - * Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -4135,8 +4135,6 @@ static int mdss_fb_handle_buf_sync_ioctl(struct msm_sync_pt_data *sync_pt_data, goto buf_sync_err_2; } - sync_fence_install(rel_fence, rel_fen_fd); - ret = copy_to_user(buf_sync->rel_fen_fd, &rel_fen_fd, sizeof(int)); if (ret) { pr_err("%s: copy_to_user failed\n", sync_pt_data->fence_name); @@ -4173,8 +4171,6 @@ static int mdss_fb_handle_buf_sync_ioctl(struct msm_sync_pt_data *sync_pt_data, goto buf_sync_err_3; } - sync_fence_install(retire_fence, retire_fen_fd); - ret = copy_to_user(buf_sync->retire_fen_fd, &retire_fen_fd, sizeof(int)); if (ret) { @@ -4185,6 +4181,9 @@ static int mdss_fb_handle_buf_sync_ioctl(struct msm_sync_pt_data *sync_pt_data, goto buf_sync_err_3; } + sync_fence_install(rel_fence, rel_fen_fd); + sync_fence_install(retire_fence, retire_fen_fd); + skip_retire_fence: mutex_unlock(&sync_pt_data->sync_mutex); From 17597b44bea067c48bf4046c6740009b2b9e9dac Mon Sep 17 00:00:00 2001 From: Ingrid Gallardo Date: Wed, 1 Mar 2017 12:24:06 -0800 Subject: [PATCH 0692/1015] msm: mdss: fix race condition in mdp debugfs Fix race condition in mdp debugfs properties during the read and write of the panel and mdp registers. This race condition can cause accessing memory out of boundaries. Change-Id: I97a90a154237343d4aaf237c11f525bcc2c3a8e3 Signed-off-by: Ingrid Gallardo --- drivers/video/msm/mdss/mdss_debug.c | 48 ++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_debug.c b/drivers/video/msm/mdss/mdss_debug.c index de64d10724911..3dc2c2bc14c9e 100644 --- a/drivers/video/msm/mdss/mdss_debug.c +++ b/drivers/video/msm/mdss/mdss_debug.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -44,6 +44,8 @@ #define INVALID_XIN_ID 0xFF +static DEFINE_MUTEX(mdss_debug_lock); + static char panel_reg[2] = {DEFAULT_READ_PANEL_POWER_MODE_REG, 0x00}; static int panel_debug_base_open(struct inode *inode, struct file *file) @@ -93,8 +95,10 @@ static ssize_t panel_debug_base_offset_write(struct file *file, if (cnt > (dbg->max_offset - off)) cnt = dbg->max_offset - off; + mutex_lock(&mdss_debug_lock); dbg->off = off; dbg->cnt = cnt; + mutex_unlock(&mdss_debug_lock); pr_debug("offset=%x cnt=%d\n", off, cnt); @@ -114,15 +118,21 @@ static ssize_t panel_debug_base_offset_read(struct file *file, if (*ppos) return 0; /* the end */ + mutex_lock(&mdss_debug_lock); len = snprintf(buf, sizeof(buf), "0x%02zx %zx\n", dbg->off, dbg->cnt); - if (len < 0 || len >= sizeof(buf)) + if (len < 0 || len >= sizeof(buf)) { + mutex_unlock(&mdss_debug_lock); return 0; + } - if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) + if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) { + mutex_unlock(&mdss_debug_lock); return -EFAULT; + } *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; } @@ -220,11 +230,16 @@ static ssize_t panel_debug_base_reg_read(struct file *file, if (!dbg) return -ENODEV; - if (!dbg->cnt) + mutex_lock(&mdss_debug_lock); + if (!dbg->cnt) { + mutex_unlock(&mdss_debug_lock); return 0; + } - if (*ppos) + if (*ppos) { + mutex_unlock(&mdss_debug_lock); return 0; /* the end */ + } /* '0x' + 2 digit + blank = 5 bytes for each number */ reg_buf_len = (dbg->cnt * PANEL_REG_FORMAT_LEN) @@ -265,11 +280,13 @@ static ssize_t panel_debug_base_reg_read(struct file *file, kfree(panel_reg_buf); *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; read_reg_fail: kfree(rx_buf); kfree(panel_reg_buf); + mutex_unlock(&mdss_debug_lock); return rc; } @@ -403,8 +420,10 @@ static ssize_t mdss_debug_base_offset_write(struct file *file, if (cnt > (dbg->max_offset - off)) cnt = dbg->max_offset - off; + mutex_lock(&mdss_debug_lock); dbg->off = off; dbg->cnt = cnt; + mutex_unlock(&mdss_debug_lock); pr_debug("offset=%x cnt=%x\n", off, cnt); @@ -424,15 +443,21 @@ static ssize_t mdss_debug_base_offset_read(struct file *file, if (*ppos) return 0; /* the end */ + mutex_lock(&mdss_debug_lock); len = snprintf(buf, sizeof(buf), "0x%08zx %zx\n", dbg->off, dbg->cnt); - if (len < 0 || len >= sizeof(buf)) + if (len < 0 || len >= sizeof(buf)) { + mutex_unlock(&mdss_debug_lock); return 0; + } - if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) + if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) { + mutex_unlock(&mdss_debug_lock); return -EFAULT; + } *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; } @@ -489,6 +514,8 @@ static ssize_t mdss_debug_base_reg_read(struct file *file, return -ENODEV; } + mutex_lock(&mdss_debug_lock); + if (!dbg->buf) { char dump_buf[64]; char *ptr; @@ -500,6 +527,7 @@ static ssize_t mdss_debug_base_reg_read(struct file *file, if (!dbg->buf) { pr_err("not enough memory to hold reg dump\n"); + mutex_unlock(&mdss_debug_lock); return -ENOMEM; } @@ -530,17 +558,21 @@ static ssize_t mdss_debug_base_reg_read(struct file *file, dbg->buf_len = tot; } - if (*ppos >= dbg->buf_len) + if (*ppos >= dbg->buf_len) { + mutex_unlock(&mdss_debug_lock); return 0; /* done reading */ + } len = min(count, dbg->buf_len - (size_t) *ppos); if (copy_to_user(user_buf, dbg->buf + *ppos, len)) { pr_err("failed to copy to user\n"); + mutex_unlock(&mdss_debug_lock); return -EFAULT; } *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; } From ac76086e0d83a7ffe902d431cccfb14a02a60df8 Mon Sep 17 00:00:00 2001 From: Benjamin Chan Date: Mon, 6 Mar 2017 11:48:27 -0500 Subject: [PATCH 0693/1015] msm: mdss: Add lock to avoid release of active session in rotator Add mutex lock to protect an active rotator session from being closed. Without the lock, this can happen if a rotator closing IOCTL is called from a separate thread. CRs-Fixed: 2006159 Change-Id: I927a0c626bdae5ef149e12979ec4befdbac1b7f7 Signed-off-by: Benjamin Chan --- drivers/video/msm/mdss/mdss_rotator.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_rotator.c b/drivers/video/msm/mdss/mdss_rotator.c index ea7bc7bbec3f5..055c5d22b2d2d 100644 --- a/drivers/video/msm/mdss/mdss_rotator.c +++ b/drivers/video/msm/mdss/mdss_rotator.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2059,10 +2059,12 @@ static int mdss_rotator_config_session(struct mdss_rot_mgr *mgr, return ret; } + mutex_lock(&mgr->lock); perf = mdss_rotator_find_session(private, config.session_id); if (!perf) { pr_err("No session with id=%u could be found\n", config.session_id); + mutex_unlock(&mgr->lock); return -EINVAL; } @@ -2085,6 +2087,7 @@ static int mdss_rotator_config_session(struct mdss_rot_mgr *mgr, config.output.format); done: ATRACE_END(__func__); + mutex_unlock(&mgr->lock); return ret; } From d1d99f0e5192f547ab0fe8680d44cabfb56a6147 Mon Sep 17 00:00:00 2001 From: Trishansh Bhardwaj Date: Sat, 18 Mar 2017 12:00:46 +0530 Subject: [PATCH 0694/1015] msm: camera: Add error check for cmd in IOCTL. Return EINVAL if cmd is not v4l2 PRIVATE_IOCTL_CMD. Change-Id: Iaffa0f2062ea9832dfbaf58a5477185721ff0046 Signed-off-by: Trishansh Bhardwaj --- drivers/media/platform/msm/camera_v2/camera/camera.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/camera/camera.c b/drivers/media/platform/msm/camera_v2/camera/camera.c index 1ec55bf8244de..5bfcf282f5630 100644 --- a/drivers/media/platform/msm/camera_v2/camera/camera.c +++ b/drivers/media/platform/msm/camera_v2/camera/camera.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -485,6 +485,9 @@ static long camera_v4l2_vidioc_private_ioctl(struct file *filep, void *fh, if (WARN_ON(!k_ioctl || !pvdev)) return -EIO; + if (cmd != VIDIOC_MSM_CAMERA_PRIVATE_IOCTL_CMD) + return -EINVAL; + switch (k_ioctl->id) { case MSM_CAMERA_PRIV_IOCTL_ID_RETURN_BUF: { struct msm_camera_return_buf ptr, *tmp = NULL; From 7570ff3bd1274bd0c2f74b104827fd0fc8794469 Mon Sep 17 00:00:00 2001 From: Ajay Agarwal Date: Mon, 20 Mar 2017 14:18:42 +0530 Subject: [PATCH 0695/1015] usb: f_serial: Check port_num before allocating serial instance Maximum number of allowed gadget serial ports is GSERIAL_NO_PORTS = 3. There is a chance that we try to access index >=3 of gser_port array, which is a bug. Add this check before accessing the gser_port. If violated, unbind the configuration. Change-Id: I42cd2847fd2d681b4f8b614048ad54e7fe096092 Signed-off-by: Ajay Agarwal --- drivers/usb/gadget/function/f_serial.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/usb/gadget/function/f_serial.c b/drivers/usb/gadget/function/f_serial.c index 702aa52cf2bd2..bf73196c16c33 100644 --- a/drivers/usb/gadget/function/f_serial.c +++ b/drivers/usb/gadget/function/f_serial.c @@ -1111,17 +1111,22 @@ static struct usb_function *gser_alloc(struct usb_function_instance *fi) struct f_gser *gser; struct f_serial_opts *opts; + opts = container_of(fi, struct f_serial_opts, func_inst); + if (nr_ports) { + opts->port_num = gser_next_free_port++; + if(opts->port_num >= GSERIAL_NO_PORTS) { + pr_err("%s: No serial allowed for port %d\n", + __func__, opts->port_num); + return ERR_PTR(-EINVAL); + } + } + /* allocate and initialize one new instance */ gser = kzalloc(sizeof(*gser), GFP_KERNEL); if (!gser) return ERR_PTR(-ENOMEM); - opts = container_of(fi, struct f_serial_opts, func_inst); - spin_lock_init(&gser->lock); - if (nr_ports) - opts->port_num = gser_next_free_port++; - gser->port_num = opts->port_num; gser->port.func.name = "gser"; From c745937c7e90a879b6137a4f61fca383f2b4f4cc Mon Sep 17 00:00:00 2001 From: "Sravan Kumar D.V.N" Date: Tue, 17 Jan 2017 12:11:56 +0530 Subject: [PATCH 0696/1015] msm: mdss: Fix possible integer overflow Avoid possible integer overflow while validating mdp3 lut config parameters. Change-Id: Ie3f59748e613fbbf755a98dcc688491a8c4e2cca CRs-Fixed: 1104664 Signed-off-by: Sravan Kumar D.V.N --- drivers/video/msm/mdss/mdp3_ctrl.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdp3_ctrl.c b/drivers/video/msm/mdss/mdp3_ctrl.c index 31c0cd86df4b5..5d47ba3d1fd24 100644 --- a/drivers/video/msm/mdss/mdp3_ctrl.c +++ b/drivers/video/msm/mdss/mdp3_ctrl.c @@ -2153,8 +2153,10 @@ static int mdp3_ctrl_lut_config(struct msm_fb_data_type *mfd, dma = mdp3_session->dma; - if (cfg->cmap.start + cfg->cmap.len > MDP_LUT_SIZE) { - pr_err("Invalid arguments\n"); + if ((cfg->cmap.start > MDP_LUT_SIZE) || + (cfg->cmap.len > MDP_LUT_SIZE) || + (cfg->cmap.start + cfg->cmap.len > MDP_LUT_SIZE)) { + pr_err("Invalid arguments.\n"); return -EINVAL; } From 7b9264cc40e1647c65961755aaa0e1e5c1f6261e Mon Sep 17 00:00:00 2001 From: Senthil Kumar Rajagopal Date: Fri, 10 Feb 2017 15:07:54 +0530 Subject: [PATCH 0697/1015] msm: camera: isp: Handle array out of bounds The pointer qbuf_buf comes from userspace. qbuf_buf->num_planes is used with no bound check, which if set to a large value, it will overflow buf_info->mapped_info and qbuf_buf->planes CRs-Fixed: 2003798 Change-Id: I332e0424e57bb14b481a740604a09350e6f029a8 Signed-off-by: Senthil Kumar Rajagopal --- .../media/platform/msm/camera_v2/isp/msm_buf_mgr.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c index ed70cae333b2d..cf3af6396972b 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -189,6 +189,12 @@ static int msm_isp_prepare_v4l2_buf(struct msm_isp_buf_mgr *buf_mgr, struct msm_isp_buffer_mapped_info *mapped_info; uint32_t accu_length = 0; + if (qbuf_buf->num_planes > MAX_PLANES_PER_STREAM) { + pr_err("%s: Invalid num_planes %d , stream id %x\n", + __func__, qbuf_buf->num_planes, stream_id); + return -EINVAL; + } + for (i = 0; i < qbuf_buf->num_planes; i++) { mapped_info = &buf_info->mapped_info[i]; mapped_info->buf_fd = qbuf_buf->planes[i].addr; @@ -233,6 +239,12 @@ static void msm_isp_unprepare_v4l2_buf( return; } + if (buf_info->num_planes > VIDEO_MAX_PLANES) { + pr_err("%s: Invalid num_planes %d , stream id %x\n", + __func__, buf_info->num_planes, stream_id); + return; + } + bufq = msm_isp_get_bufq(buf_mgr, buf_info->bufq_handle); if (!bufq) { pr_err("%s: Invalid bufq, stream id %x\n", From a9cccfcf76a27f9207a1e86df5c8fa88c1bcfb76 Mon Sep 17 00:00:00 2001 From: Manu Gautam Date: Fri, 17 Mar 2017 14:53:59 +0530 Subject: [PATCH 0698/1015] USB: gadget: midi: Fix use-after-free after midi_unbind If midi composition is unbound while streaming is going on then there is a possibility of in/out_trigger pcm routines accessing midi structure after it is already freed on function unbind. CRs-fixed: 2020461 Change-Id: Ifb3141f3a26f073f6df7c4ae7e821c828d723a4f Signed-off-by: Manu Gautam --- drivers/usb/gadget/function/f_midi.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c index 02800dce980c3..f46c980718c7d 100644 --- a/drivers/usb/gadget/function/f_midi.c +++ b/drivers/usb/gadget/function/f_midi.c @@ -92,6 +92,8 @@ struct f_midi { unsigned int buflen, qlen; }; +static struct f_midi *the_midi; + static inline struct f_midi *func_to_midi(struct usb_function *f) { return container_of(f, struct f_midi, func); @@ -413,6 +415,7 @@ static void f_midi_unbind(struct usb_configuration *c, struct usb_function *f) usb_free_all_descriptors(f); kfree(midi); + the_midi = NULL; } static int f_midi_snd_free(struct snd_device *device) @@ -586,6 +589,10 @@ static int f_midi_in_open(struct snd_rawmidi_substream *substream) { struct f_midi *midi = substream->rmidi->private_data; + /* check if midi got disabled or re-enabled quickly */ + if (midi != the_midi) + return -ENODEV; + if (!midi->in_port[substream->number]) return -EINVAL; @@ -607,6 +614,10 @@ static void f_midi_in_trigger(struct snd_rawmidi_substream *substream, int up) { struct f_midi *midi = substream->rmidi->private_data; + /* check if midi got disabled or re-enabled quickly */ + if (midi != the_midi) + return; + if (!midi->in_port[substream->number]) return; @@ -620,6 +631,10 @@ static int f_midi_out_open(struct snd_rawmidi_substream *substream) { struct f_midi *midi = substream->rmidi->private_data; + /* check if midi got disabled or re-enabled quickly */ + if (midi != the_midi) + return -ENODEV; + if (substream->number >= MAX_PORTS) return -EINVAL; @@ -640,6 +655,10 @@ static void f_midi_out_trigger(struct snd_rawmidi_substream *substream, int up) { struct f_midi *midi = substream->rmidi->private_data; + /* check if midi got disabled or re-enabled quickly */ + if (midi != the_midi) + return; + VDBG(midi, "%s()\n", __func__); if (up) @@ -985,6 +1004,7 @@ int /* __init */ f_midi_bind_config(struct usb_configuration *c, if (status) goto setup_fail; + the_midi = midi; if (config) { config->card = midi->rmidi->card->number; From a36c7f48bed473a0d0844a273b1c42f171129c51 Mon Sep 17 00:00:00 2001 From: Naseer Ahmed Date: Wed, 1 Feb 2017 16:24:01 -0500 Subject: [PATCH 0699/1015] msm: mdss: Install sync fences after user copy If userspace closes the fd after an error on copying to userspace, the fences may be freed incorrectly. Make sure fences are installed after all checks pass. Bug: 32402303 Change-Id: Ieb50296c87e09549db2734bd70bb6ee8d311ad40 CRs-Fixed: 2000664 Signed-off-by: Naseer Ahmed --- drivers/video/msm/mdss/mdss_fb.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index a7abb6c258349..2f65a082918ef 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -2,7 +2,7 @@ * Core MDSS framebuffer driver. * * Copyright (C) 2007 Google Incorporated - * Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -4135,8 +4135,6 @@ static int mdss_fb_handle_buf_sync_ioctl(struct msm_sync_pt_data *sync_pt_data, goto buf_sync_err_2; } - sync_fence_install(rel_fence, rel_fen_fd); - ret = copy_to_user(buf_sync->rel_fen_fd, &rel_fen_fd, sizeof(int)); if (ret) { pr_err("%s: copy_to_user failed\n", sync_pt_data->fence_name); @@ -4173,8 +4171,6 @@ static int mdss_fb_handle_buf_sync_ioctl(struct msm_sync_pt_data *sync_pt_data, goto buf_sync_err_3; } - sync_fence_install(retire_fence, retire_fen_fd); - ret = copy_to_user(buf_sync->retire_fen_fd, &retire_fen_fd, sizeof(int)); if (ret) { @@ -4185,6 +4181,9 @@ static int mdss_fb_handle_buf_sync_ioctl(struct msm_sync_pt_data *sync_pt_data, goto buf_sync_err_3; } + sync_fence_install(rel_fence, rel_fen_fd); + sync_fence_install(retire_fence, retire_fen_fd); + skip_retire_fence: mutex_unlock(&sync_pt_data->sync_mutex); From 7aec5d74c301fa9df54ce1d17be8b4aeef37b06b Mon Sep 17 00:00:00 2001 From: Naseer Ahmed Date: Wed, 11 Jan 2017 12:57:48 -0500 Subject: [PATCH 0700/1015] msm: mdss: Validate cursor image size Check size of cursor image provided by userspace and return error appropriately. Bug: 34125463 CRs-Fixed: 1115406 Change-Id: I31aee3c9219921cf5c4306b36f8708582b838c38 Signed-off-by: Naseer Ahmed --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index e0861124efe83..9ae84b977e5eb 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -3903,6 +3903,12 @@ static int mdss_mdp_hw_cursor_pipe_update(struct msm_fb_data_type *mfd, req->transp_mask = img->bg_color & ~(0xff << var->transp.offset); if (mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) { + if (img->width * img->height * 4 > cursor_frame_size) { + pr_err("cursor image size is too large\n"); + ret = -EINVAL; + goto done; + } + ret = copy_from_user(mfd->cursor_buf, img->data, img->width * img->height * 4); if (ret) { From e2db8562a83d14b09eafba45f0d6e80e9e7fcb6f Mon Sep 17 00:00:00 2001 From: Ingrid Gallardo Date: Wed, 1 Mar 2017 12:24:06 -0800 Subject: [PATCH 0701/1015] msm: mdss: fix race condition in mdp debugfs Fix race condition in mdp debugfs properties during the read and write of the panel and mdp registers. This race condition can cause accessing memory out of boundaries. Change-Id: I97a90a154237343d4aaf237c11f525bcc2c3a8e3 Signed-off-by: Ingrid Gallardo --- drivers/video/msm/mdss/mdss_debug.c | 48 ++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_debug.c b/drivers/video/msm/mdss/mdss_debug.c index de64d10724911..3dc2c2bc14c9e 100644 --- a/drivers/video/msm/mdss/mdss_debug.c +++ b/drivers/video/msm/mdss/mdss_debug.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -44,6 +44,8 @@ #define INVALID_XIN_ID 0xFF +static DEFINE_MUTEX(mdss_debug_lock); + static char panel_reg[2] = {DEFAULT_READ_PANEL_POWER_MODE_REG, 0x00}; static int panel_debug_base_open(struct inode *inode, struct file *file) @@ -93,8 +95,10 @@ static ssize_t panel_debug_base_offset_write(struct file *file, if (cnt > (dbg->max_offset - off)) cnt = dbg->max_offset - off; + mutex_lock(&mdss_debug_lock); dbg->off = off; dbg->cnt = cnt; + mutex_unlock(&mdss_debug_lock); pr_debug("offset=%x cnt=%d\n", off, cnt); @@ -114,15 +118,21 @@ static ssize_t panel_debug_base_offset_read(struct file *file, if (*ppos) return 0; /* the end */ + mutex_lock(&mdss_debug_lock); len = snprintf(buf, sizeof(buf), "0x%02zx %zx\n", dbg->off, dbg->cnt); - if (len < 0 || len >= sizeof(buf)) + if (len < 0 || len >= sizeof(buf)) { + mutex_unlock(&mdss_debug_lock); return 0; + } - if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) + if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) { + mutex_unlock(&mdss_debug_lock); return -EFAULT; + } *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; } @@ -220,11 +230,16 @@ static ssize_t panel_debug_base_reg_read(struct file *file, if (!dbg) return -ENODEV; - if (!dbg->cnt) + mutex_lock(&mdss_debug_lock); + if (!dbg->cnt) { + mutex_unlock(&mdss_debug_lock); return 0; + } - if (*ppos) + if (*ppos) { + mutex_unlock(&mdss_debug_lock); return 0; /* the end */ + } /* '0x' + 2 digit + blank = 5 bytes for each number */ reg_buf_len = (dbg->cnt * PANEL_REG_FORMAT_LEN) @@ -265,11 +280,13 @@ static ssize_t panel_debug_base_reg_read(struct file *file, kfree(panel_reg_buf); *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; read_reg_fail: kfree(rx_buf); kfree(panel_reg_buf); + mutex_unlock(&mdss_debug_lock); return rc; } @@ -403,8 +420,10 @@ static ssize_t mdss_debug_base_offset_write(struct file *file, if (cnt > (dbg->max_offset - off)) cnt = dbg->max_offset - off; + mutex_lock(&mdss_debug_lock); dbg->off = off; dbg->cnt = cnt; + mutex_unlock(&mdss_debug_lock); pr_debug("offset=%x cnt=%x\n", off, cnt); @@ -424,15 +443,21 @@ static ssize_t mdss_debug_base_offset_read(struct file *file, if (*ppos) return 0; /* the end */ + mutex_lock(&mdss_debug_lock); len = snprintf(buf, sizeof(buf), "0x%08zx %zx\n", dbg->off, dbg->cnt); - if (len < 0 || len >= sizeof(buf)) + if (len < 0 || len >= sizeof(buf)) { + mutex_unlock(&mdss_debug_lock); return 0; + } - if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) + if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) { + mutex_unlock(&mdss_debug_lock); return -EFAULT; + } *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; } @@ -489,6 +514,8 @@ static ssize_t mdss_debug_base_reg_read(struct file *file, return -ENODEV; } + mutex_lock(&mdss_debug_lock); + if (!dbg->buf) { char dump_buf[64]; char *ptr; @@ -500,6 +527,7 @@ static ssize_t mdss_debug_base_reg_read(struct file *file, if (!dbg->buf) { pr_err("not enough memory to hold reg dump\n"); + mutex_unlock(&mdss_debug_lock); return -ENOMEM; } @@ -530,17 +558,21 @@ static ssize_t mdss_debug_base_reg_read(struct file *file, dbg->buf_len = tot; } - if (*ppos >= dbg->buf_len) + if (*ppos >= dbg->buf_len) { + mutex_unlock(&mdss_debug_lock); return 0; /* done reading */ + } len = min(count, dbg->buf_len - (size_t) *ppos); if (copy_to_user(user_buf, dbg->buf + *ppos, len)) { pr_err("failed to copy to user\n"); + mutex_unlock(&mdss_debug_lock); return -EFAULT; } *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; } From bf68a576ec045627362918a06423cfae838773b2 Mon Sep 17 00:00:00 2001 From: Benjamin Chan Date: Mon, 6 Mar 2017 11:48:27 -0500 Subject: [PATCH 0702/1015] msm: mdss: Add lock to avoid release of active session in rotator Add mutex lock to protect an active rotator session from being closed. Without the lock, this can happen if a rotator closing IOCTL is called from a separate thread. CRs-Fixed: 2006159 Change-Id: I927a0c626bdae5ef149e12979ec4befdbac1b7f7 Signed-off-by: Benjamin Chan --- drivers/video/msm/mdss/mdss_rotator.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_rotator.c b/drivers/video/msm/mdss/mdss_rotator.c index ea7bc7bbec3f5..055c5d22b2d2d 100644 --- a/drivers/video/msm/mdss/mdss_rotator.c +++ b/drivers/video/msm/mdss/mdss_rotator.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2059,10 +2059,12 @@ static int mdss_rotator_config_session(struct mdss_rot_mgr *mgr, return ret; } + mutex_lock(&mgr->lock); perf = mdss_rotator_find_session(private, config.session_id); if (!perf) { pr_err("No session with id=%u could be found\n", config.session_id); + mutex_unlock(&mgr->lock); return -EINVAL; } @@ -2085,6 +2087,7 @@ static int mdss_rotator_config_session(struct mdss_rot_mgr *mgr, config.output.format); done: ATRACE_END(__func__); + mutex_unlock(&mgr->lock); return ret; } From b1987fe48bbf6130aaeb0889c05336de2b344081 Mon Sep 17 00:00:00 2001 From: Dmitry Shmidt Date: Mon, 25 Apr 2016 14:28:30 -0700 Subject: [PATCH 0703/1015] Revert "mm: vmscan: Add a debug file for shrinkers" Kernel panic when type "cat /sys/kernel/debug/shrinker" Unable to handle kernel paging request at virtual address 0af37d40 pgd = d4dec000 [0af37d40] *pgd=00000000 Internal error: Oops: 5 [#1] PREEMPT SMP ARM [] (_raw_spin_lock) from [] (list_lru_count_one+0x14/0x28) [] (list_lru_count_one) from [] (super_cache_count+0x40/0xa0) [] (super_cache_count) from [] (debug_shrinker_show+0x50/0x90) [] (debug_shrinker_show) from [] (seq_read+0x1ec/0x48c) [] (seq_read) from [] (__vfs_read+0x20/0xd0) [] (__vfs_read) from [] (vfs_read+0x7c/0x104) [] (vfs_read) from [] (SyS_read+0x44/0x9c) [] (SyS_read) from [] (ret_fast_syscall+0x0/0x3c) Code: e1a04000 e3a00001 ebd66b39 f594f000 (e1943f9f) ---[ end trace 60c74014a63a9688 ]--- Kernel panic - not syncing: Fatal exception shrink_control.nid is used but not initialzed, same for shrink_control.memcg. This reverts commit b0e7a582b2264cdf75874dcd8df915b6b4427755. Change-Id: I108de88fa4baaef99a53c4e4c6a1d8c4b4804157 Reported-by: Xiaowen Liu Signed-off-by: Dmitry Shmidt Git-commit: ad95c12f66df9efae04b15d5c4d0d0ba56ab2620 Git-repo: https://source.codeaurora.org/quic/la/kernel/msm-4.4.git Signed-off-by: Vinayak Menon --- mm/vmscan.c | 43 ------------------------------------------- 1 file changed, 43 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index fc1c933b73d3c..0e7f752f779ef 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -46,7 +46,6 @@ #include #include #include -#include #include #include @@ -200,39 +199,6 @@ static unsigned long get_lru_size(struct lruvec *lruvec, enum lru_list lru) return zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru); } -struct dentry *debug_file; - -static int debug_shrinker_show(struct seq_file *s, void *unused) -{ - struct shrinker *shrinker; - struct shrink_control sc; - - sc.gfp_mask = -1; - sc.nr_to_scan = 0; - - down_read(&shrinker_rwsem); - list_for_each_entry(shrinker, &shrinker_list, list) { - int num_objs; - - num_objs = shrinker->count_objects(shrinker, &sc); - seq_printf(s, "%pf %d\n", shrinker->scan_objects, num_objs); - } - up_read(&shrinker_rwsem); - return 0; -} - -static int debug_shrinker_open(struct inode *inode, struct file *file) -{ - return single_open(file, debug_shrinker_show, inode->i_private); -} - -static const struct file_operations debug_shrinker_fops = { - .open = debug_shrinker_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - /* * Add a shrinker callback to be called from the vm. */ @@ -262,15 +228,6 @@ int register_shrinker(struct shrinker *shrinker) } EXPORT_SYMBOL(register_shrinker); -static int __init add_shrinker_debug(void) -{ - debugfs_create_file("shrinker", 0644, NULL, NULL, - &debug_shrinker_fops); - return 0; -} - -late_initcall(add_shrinker_debug); - /* * Remove one */ From 91f1795cb9021fec432163a483af36fee4f204f7 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Mon, 20 Mar 2017 10:51:32 -0700 Subject: [PATCH 0704/1015] qseecom: check img_len and mdt_len against ion buf len Variable "load_img_req.img_len" and "load_img_req.mdt_len" are from user land, so check their values against ion buf length to avoid buffer overread on QSEE side. Change-Id: I9e8bfe32d3b0cd5b441ad724543c56467fa5e4da Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 122314830d293..2e744def56db6 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -2314,7 +2314,13 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) ret); goto loadapp_err; } - + if (load_img_req.mdt_len > len || load_img_req.img_len > len) { + pr_err("ion len %zu is smaller than mdt_len %u or img_len %u\n", + len, load_img_req.mdt_len, + load_img_req.img_len); + ret = -EINVAL; + goto loadapp_err; + } /* Populate the structure for sending scm call to load image */ if (qseecom.qsee_version < QSEE_VERSION_40) { load_req.qsee_cmd_id = QSEOS_APP_START_COMMAND; @@ -5082,6 +5088,12 @@ static int qseecom_load_external_elf(struct qseecom_dev_handle *data, ret); return ret; } + if (load_img_req.mdt_len > len || load_img_req.img_len > len) { + pr_err("ion len %zu is smaller than mdt_len %u or img_len %u\n", + len, load_img_req.mdt_len, + load_img_req.img_len); + return ret; + } /* Populate the structure for sending scm call to load image */ if (qseecom.qsee_version < QSEE_VERSION_40) { load_req.qsee_cmd_id = QSEOS_LOAD_EXTERNAL_ELF_COMMAND; From 6f7b1e99c3d16700ebfa88d9be0280257ef524c5 Mon Sep 17 00:00:00 2001 From: Junzhe Zou Date: Wed, 15 Mar 2017 15:06:04 -0700 Subject: [PATCH 0705/1015] msm: ispif: fix a bug in checking the validity of vfe intf Parse the whole length of vfe intf to the validate function to avoid the situation that the lower 8bits pass the validation while intf is crafted to a large value which can cause buffer overflow later. CRs-Fixed: 2008469 Change-Id: I0de19ec36d73918ab2f38eb7ba1f833c02a3face Signed-off-by: Junzhe Zou --- drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c index 31d366c41aa44..4a1ea20192cba 100644 --- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c +++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c @@ -73,7 +73,7 @@ static void msm_ispif_io_dump_reg(struct ispif_device *ispif) static inline int msm_ispif_is_intf_valid(uint32_t csid_version, - uint8_t intf_type) + enum msm_ispif_vfe_intf intf_type) { return ((csid_version <= CSID_VERSION_V22 && intf_type != VFE0) || (intf_type >= VFE_MAX)) ? false : true; From cef330b96bd25b8192e44be4168e108aae5661b5 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Tue, 10 Jan 2017 12:19:08 -0800 Subject: [PATCH 0706/1015] qseecom: fix potential memory leak in __qseecom_update_cmd_buf_64 __qseecom_update_cmd_buf_64() called __qseecom_allocate_sg_list_buffer() to allocate memory from within a for loop. Should it fail on any other than the first time through the loop, the prior allocations will not be deallocated, make change to deallocate memory in this error case. Change-Id: I8cb71a3b141249d8266aec4890632f200d147405 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 122314830d293..e25d2e3c5813d 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -3646,6 +3646,13 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, } return ret; err: + for (i = 0; i < MAX_ION_FD; i++) + if (data->client.sec_buf_fd[i].is_sec_buf_fd && + data->client.sec_buf_fd[i].vbase) + dma_free_coherent(qseecom.pdev, + data->client.sec_buf_fd[i].size, + data->client.sec_buf_fd[i].vbase, + data->client.sec_buf_fd[i].pbase); if (!IS_ERR_OR_NULL(ihandle)) ion_free(qseecom.ion_clnt, ihandle); return -ENOMEM; From e1dcdc759ea44fd1ff4f626ffc3c387a08f85e5d Mon Sep 17 00:00:00 2001 From: Andrew Chant Date: Fri, 10 Mar 2017 12:17:47 +0530 Subject: [PATCH 0707/1015] input: touchscreen: synaptics_dsx: Remove fw_update sysfs entries Remove the sysfs entrypoints to fw_update of synaptics_dsx touch driver. BUG: 32769717 Change-Id: I1b2ea28e6a8c5c6c583077fbc6801ebb17447a38 Git-commit: 2615c5f302441568e6dd20007bc5246d72837e80 Git-repo: https://android.googlesource.com/kernel/msm.git Signed-off-by: Andrew Chant Signed-off-by: Shantanu Jain --- drivers/input/touchscreen/Kconfig | 10 ++++++++++ .../synaptics_dsx/synaptics_dsx_fw_update.c | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 0a4753ce8f383..64a9c1f62e44a 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -1005,6 +1005,16 @@ config SECURE_TOUCH If unsure, say N. +config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS + bool "Synaptics DSX firmware update extra sysfs attributes" + depends on TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE + help + Say Y here to enable support for extra sysfs attributes + supporting firmware update in a development environment. + This does not affect the core or other subsystem attributes. + + If unsure, say N. + config TOUCHSCREEN_IT7260_I2C tristate "IT7260 Touchscreen Driver" depends on I2C diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c index 0ec16e6065453..4787f2bcd768f 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c @@ -102,6 +102,7 @@ (fwu->config_data[2] == config_id[2]) && \ (fwu->config_data[3] == config_id[3])) +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static ssize_t fwu_sysfs_show_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count); @@ -157,6 +158,7 @@ static ssize_t fwu_sysfs_config_id_show(struct device *dev, static ssize_t fwu_sysfs_package_id_show(struct device *dev, struct device_attribute *attr, char *buf); +#endif enum bl_version { V5 = 5, @@ -296,6 +298,7 @@ struct synaptics_rmi4_fwu_handle { struct synaptics_rmi4_data *rmi4_data; }; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static struct bin_attribute dev_attr_data = { .attr = { .name = "data", @@ -305,9 +308,11 @@ static struct bin_attribute dev_attr_data = { .read = fwu_sysfs_show_image, .write = fwu_sysfs_store_image, }; +#endif static struct device_attribute attrs[] = { +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS __ATTR(force_update_fw, S_IWUSR | S_IWGRP, NULL, fwu_sysfs_force_reflash_store), @@ -353,6 +358,7 @@ static struct device_attribute attrs[] = { __ATTR(package_id, S_IRUGO, fwu_sysfs_package_id_show, synaptics_rmi4_store_error), +#endif }; static struct synaptics_rmi4_fwu_handle *fwu; @@ -1220,6 +1226,7 @@ static int fwu_do_write_config(void) return retval; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_start_write_config(void) { int retval; @@ -1395,6 +1402,7 @@ static int fwu_do_read_config(void) return retval; } +#endif static int fwu_do_lockdown(void) { @@ -1585,6 +1593,7 @@ int synaptics_dsx_fw_updater(unsigned char *fw_data) } EXPORT_SYMBOL(synaptics_dsx_fw_updater); +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static ssize_t fwu_sysfs_show_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) @@ -1972,6 +1981,7 @@ static ssize_t fwu_sysfs_package_id_show(struct device *dev, (package_id[1] << 8) | package_id[0], (package_id[3] << 8) | package_id[2]); } +#endif static void synaptics_rmi4_fwu_attn(struct synaptics_rmi4_data *rmi4_data, unsigned char intr_mask) @@ -2045,6 +2055,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) fwu->do_lockdown = DO_LOCKDOWN; fwu->initialized = true; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS retval = sysfs_create_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); if (retval < 0) { @@ -2053,6 +2064,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) __func__); goto exit_free_fwu; } +#endif for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj, @@ -2074,7 +2086,9 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) &attrs[attr_count].attr); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif exit_free_fwu: kfree(fwu); @@ -2096,7 +2110,9 @@ static void synaptics_rmi4_fwu_remove(struct synaptics_rmi4_data *rmi4_data) &attrs[attr_count].attr); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif kfree(fwu->read_config_buf); kfree(fwu); From abaf996b4f26e1a7934a035dfe0aed468bfd8699 Mon Sep 17 00:00:00 2001 From: Andrew Chant Date: Wed, 22 Feb 2017 20:21:27 +0530 Subject: [PATCH 0708/1015] input: touchscreen: synaptics: Remove fw_update sysfs entries Remove the sysfs entrypoints to fw_update of synaptics driver. BUG: 32769717 Change-Id: I710cb37a8b5382dce7aa6a1d8748be5853a18a7a Git-commit: 2615c5f302441568e6dd20007bc5246d72837e80 Git-repo: https://android.googlesource.com/kernel/msm.git Signed-off-by: Andrew Chant [shjain@codeaurora.org: picked those lines that are applying cleanly to the driver. Some of the lines as per googlesource.com git commit is not applying cleanly.] Signed-off-by: Shantanu Jain --- drivers/input/touchscreen/Kconfig | 10 ++++++++++ drivers/input/touchscreen/synaptics_fw_update.c | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 0a4753ce8f383..2b4ad04a61fd5 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -995,6 +995,16 @@ config TOUCHSCREEN_FT5X06_GESTURE If unsure, say N. +config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS + bool "Synaptics DSX firmware update extra sysfs attributes" + depends on TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE + help + Say Y here to enable support for extra sysfs attributes + supporting firmware update in a development environment. + This does not affect the core or other subsystem attributes. + + If unsure, say N. + config SECURE_TOUCH bool "Secure Touch" depends on (TOUCHSCREEN_SYNAPTICS_I2C_RMI4 || \ diff --git a/drivers/input/touchscreen/synaptics_fw_update.c b/drivers/input/touchscreen/synaptics_fw_update.c index 0683f60165066..98e25339c0b72 100644 --- a/drivers/input/touchscreen/synaptics_fw_update.c +++ b/drivers/input/touchscreen/synaptics_fw_update.c @@ -1305,6 +1305,7 @@ static int fwu_do_write_config(void) return retval; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_start_write_config(void) { int retval; @@ -1357,6 +1358,7 @@ static int fwu_start_write_config(void) return retval; } +#endif static int fwu_do_write_lockdown(bool reset) { @@ -1404,6 +1406,7 @@ static int fwu_do_write_lockdown(bool reset) return retval; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_start_write_lockdown(void) { if (parse_header()) @@ -1505,6 +1508,7 @@ static int fwu_do_read_config(void) exit: return retval; } +#endif static int fwu_do_reflash(void) { @@ -1730,6 +1734,7 @@ int synaptics_fw_updater(void) } EXPORT_SYMBOL(synaptics_fw_updater); +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static ssize_t fwu_sysfs_show_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) @@ -2154,6 +2159,7 @@ static ssize_t fwu_sysfs_package_id_show(struct device *dev, (pkg_id[1] << 8) | pkg_id[0], (pkg_id[3] << 8) | pkg_id[2]); } +#endif static int synaptics_rmi4_debug_dump_info(struct seq_file *m, void *v) { @@ -2187,6 +2193,7 @@ static void synaptics_rmi4_fwu_attn(struct synaptics_rmi4_data *rmi4_data, return; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static struct bin_attribute dev_attr_data = { .attr = { .name = "data", @@ -2196,8 +2203,10 @@ static struct bin_attribute dev_attr_data = { .read = fwu_sysfs_show_image, .write = fwu_sysfs_store_image, }; +#endif static struct device_attribute attrs[] = { +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS __ATTR(fw_name, S_IRUGO | S_IWUSR | S_IWGRP, fwu_sysfs_image_name_show, fwu_sysfs_image_name_store), @@ -2246,6 +2255,7 @@ static struct device_attribute attrs[] = { __ATTR(package_id, S_IRUGO, fwu_sysfs_package_id_show, synaptics_rmi4_store_error), +#endif }; @@ -2325,6 +2335,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) fwu->initialized = true; fwu->polling_mode = false; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS retval = sysfs_create_bin_file(&rmi4_data->i2c_client->dev.kobj, &dev_attr_data); if (retval < 0) { @@ -2333,6 +2344,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) __func__); goto exit_free_mem; } +#endif for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { retval = sysfs_create_file(&rmi4_data->i2c_client->dev.kobj, @@ -2380,7 +2392,9 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) &attrs[attr_count].attr); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif exit_free_mem: kfree(fwu->fn_ptr); @@ -2397,7 +2411,9 @@ static void synaptics_rmi4_fwu_remove(struct synaptics_rmi4_data *rmi4_data) { unsigned char attr_count; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { sysfs_remove_file(&rmi4_data->input_dev->dev.kobj, From 1f48d8771d2999b371275fd8d6abbf02a3ee02a0 Mon Sep 17 00:00:00 2001 From: Puja Gupta Date: Mon, 6 Mar 2017 15:04:11 -0800 Subject: [PATCH 0709/1015] soc: qcom: Avoid possible buffer overflow in service-locator Fix possible buffer overflow by reading 'resp->total_domains' from the qmi response message since 'resp->total_domains' indicate total number of matching domains found by servreg. 'resp->domain_list_len' indicates the domains that could be sent in one response which should not be greater than 'resp->total_domains'. CRs-Fixed: 2009016 Change-Id: I614561c5f9bc996689129bc098baaffc9b59c377 Signed-off-by: Puja Gupta --- drivers/soc/qcom/service-locator.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/soc/qcom/service-locator.c b/drivers/soc/qcom/service-locator.c index f6e7486bebf7c..b16ae02c86db8 100644 --- a/drivers/soc/qcom/service-locator.c +++ b/drivers/soc/qcom/service-locator.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -300,10 +300,9 @@ static int service_locator_send_msg(struct pd_qmi_client_data *pd) if (!domains_read) { db_rev_count = pd->db_rev_count = resp->db_rev_count; pd->total_domains = resp->total_domains; - if (!pd->total_domains && resp->domain_list_len) { - pr_err("total domains not set\n"); - pd->total_domains = resp->domain_list_len; - } + if (!resp->total_domains) + pr_info("No matching domains found\n"); + pd->domain_list = kmalloc( sizeof(struct servreg_loc_entry_v01) * resp->total_domains, GFP_KERNEL); @@ -320,6 +319,10 @@ static int service_locator_send_msg(struct pd_qmi_client_data *pd) rc = -EAGAIN; goto out; } + if (resp->domain_list_len > resp->total_domains) { + /* Always read total_domains from the response msg */ + resp->domain_list_len = resp->total_domains; + } /* Copy the response*/ store_get_domain_list_response(pd, resp, domains_read); domains_read += resp->domain_list_len; From 65803905274ab8850c7f589867f784203096df47 Mon Sep 17 00:00:00 2001 From: Deepak Kumar Date: Fri, 24 Mar 2017 16:19:20 +0530 Subject: [PATCH 0710/1015] msm: kgsl: Increase memstore size Increase the memstore size to increase the number of the kgsl context that can be supported simultaneously. Change-Id: I9de0ba1669a7c93073e364dec31649fd89c7a0eb Signed-off-by: Deepak Kumar --- drivers/gpu/msm/kgsl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index 367a5b79ec370..d5a40e841b3f7 100644 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -31,7 +31,7 @@ /* The number of memstore arrays limits the number of contexts allowed. * If more contexts are needed, update multiple for MEMSTORE_SIZE */ -#define KGSL_MEMSTORE_SIZE ((int)(PAGE_SIZE * 2)) +#define KGSL_MEMSTORE_SIZE ((int)(PAGE_SIZE * 8)) #define KGSL_MEMSTORE_GLOBAL (0) #define KGSL_PRIORITY_MAX_RB_LEVELS 4 #define KGSL_MEMSTORE_MAX (KGSL_MEMSTORE_SIZE / \ From 722c01a441b8b748de1762e44563fdd071ef367d Mon Sep 17 00:00:00 2001 From: Rajkumar Subbiah Date: Fri, 17 Mar 2017 11:06:01 -0400 Subject: [PATCH 0711/1015] msm: mdss: Fix integer overflow in cursor validaton The calculation of cursor image size has a potential integer overflow issue. Modifing the validation logic to avoid overflow. Change-Id: If21eff9623d71e11d116741de3a349a95dbc54bd Signed-off-by: Rajkumar Subbiah --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index 9ae84b977e5eb..dbbaef7efcb4f 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -3867,12 +3867,21 @@ static int mdss_mdp_hw_cursor_pipe_update(struct msm_fb_data_type *mfd, start_y = 0; } + if ((img->width > mdata->max_cursor_size) || + (img->height > mdata->max_cursor_size) || + (img->depth != 32) || (start_x >= xres) || + (start_y >= yres)) { + pr_err("Invalid cursor image coordinates\n"); + ret = -EINVAL; + goto done; + } + roi.w = min(xres - start_x, img->width - roi.x); roi.h = min(yres - start_y, img->height - roi.y); if ((roi.w > mdata->max_cursor_size) || - (roi.h > mdata->max_cursor_size) || - (img->depth != 32) || (start_x >= xres) || (start_y >= yres)) { + (roi.h > mdata->max_cursor_size)) { + pr_err("Invalid cursor ROI size\n"); ret = -EINVAL; goto done; } @@ -3903,12 +3912,6 @@ static int mdss_mdp_hw_cursor_pipe_update(struct msm_fb_data_type *mfd, req->transp_mask = img->bg_color & ~(0xff << var->transp.offset); if (mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) { - if (img->width * img->height * 4 > cursor_frame_size) { - pr_err("cursor image size is too large\n"); - ret = -EINVAL; - goto done; - } - ret = copy_from_user(mfd->cursor_buf, img->data, img->width * img->height * 4); if (ret) { From 951037da8dd4f300add00d49136ae69e17df84e9 Mon Sep 17 00:00:00 2001 From: Rajesh Bondugula Date: Fri, 27 Jan 2017 11:31:21 -0800 Subject: [PATCH 0712/1015] msm: camera: sensor: Validate csid lane count Validate the CSID lane count value received from userspace. User will see an undefined behavior for camera if a value is 0 or greater than 4. Crs-Fixed: 1110793 Signed-off-by: Rajesh Bondugula Change-Id: If0253a6ee695c9d3d62b4b9882898a86eeee52a9 --- .../media/platform/msm/camera_v2/sensor/csid/msm_csid.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c b/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c index 1c30b105ef98d..bcac5592c193f 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c +++ b/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -61,6 +61,7 @@ #define TRUE 1 #define FALSE 0 +#define MAX_LANE_COUNT 4 #define CSID_TIMEOUT msecs_to_jiffies(100) #undef CDBG @@ -287,6 +288,12 @@ static int msm_csid_config(struct csid_device *csid_dev, csid_params->lane_assign); CDBG("%s csid_params phy_sel = %d\n", __func__, csid_params->phy_sel); + if ((csid_params->lane_cnt == 0) || + (csid_params->lane_cnt > MAX_LANE_COUNT)) { + pr_err("%s:%d invalid lane count = %d\n", + __func__, __LINE__, csid_params->lane_cnt); + return -EINVAL; + } csid_dev->csid_lane_cnt = csid_params->lane_cnt; rc = msm_csid_reset(csid_dev); From 9ad79cd1087405469e083d69decdad2199e6a47a Mon Sep 17 00:00:00 2001 From: Ram Chandrasekar Date: Thu, 23 Mar 2017 16:33:58 -0600 Subject: [PATCH 0713/1015] msm: thermal-dev: Protect IOCTL from race condition There is a possibility that the thermal ioctl interface can be accessed simultaneously in a multi-threaded environment. In those cases the calls to fetch the frequency and voltage table can result in an undefined behavior due to race condition. Use mutex to protect the IOCTL interface from multi-thread access race condition. Change-Id: I325695f38753a4d4bc732987cf514e8616273aca Signed-off-by: Ram Chandrasekar --- drivers/thermal/msm_thermal-dev.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/thermal/msm_thermal-dev.c b/drivers/thermal/msm_thermal-dev.c index e6af6b884e99c..ead9765666c84 100644 --- a/drivers/thermal/msm_thermal-dev.c +++ b/drivers/thermal/msm_thermal-dev.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -35,6 +35,7 @@ static unsigned int freq_table_len[NR_CPUS], freq_table_set[NR_CPUS]; static unsigned int voltage_table_set[NR_CPUS]; static unsigned int *freq_table_ptr[NR_CPUS]; static uint32_t *voltage_table_ptr[NR_CPUS]; +static DEFINE_MUTEX(ioctl_access_mutex); static int msm_thermal_ioctl_open(struct inode *node, struct file *filep) { @@ -291,8 +292,9 @@ static long msm_thermal_ioctl_process(struct file *filep, unsigned int cmd, ret = validate_and_copy(&cmd, &arg, &query); if (ret) - goto process_exit; + return ret; + mutex_lock(&ioctl_access_mutex); switch (cmd) { case MSM_THERMAL_SET_CPU_MAX_FREQUENCY: ret = msm_thermal_set_frequency(query.cpu_freq.cpu_num, @@ -321,6 +323,7 @@ static long msm_thermal_ioctl_process(struct file *filep, unsigned int cmd, goto process_exit; } process_exit: + mutex_unlock(&ioctl_access_mutex); return ret; } From 9725197919222ca6ebb33c6d83a4e53e3defce56 Mon Sep 17 00:00:00 2001 From: Willem de Bruijn Date: Tue, 15 Nov 2016 14:43:27 -0700 Subject: [PATCH 0714/1015] rose: limit sk_filter trim to payload Sockets can have a filter program attached that drops or trims incoming packets based on the filter program return value. Rose requires data packets to have at least ROSE_MIN_LEN bytes. It verifies this on arrival in rose_route_frame and unconditionally pulls the bytes in rose_recvmsg. The filter can trim packets to below this value in-between, causing pull to fail, leaving the partial header at the time of skb_copy_datagram_msg. Place a lower bound on the size to which sk_filter may trim packets by introducing sk_filter_trim_cap and call this for rose packets. CRs-Fixed: 1089895 Change-Id: Idc52737bc96097a9220dfe47bb76e94ff1026a05 Signed-off-by: Willem de Bruijn Acked-by: Daniel Borkmann Signed-off-by: David S. Miller Git-commit: f4979fcea7fd36d8e2f556abef86f80e0d5af1ba Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git [subashab@codeaurora.org: resolve trivial merge conflicts] Signed-off-by: Subash Abhinov Kasiviswanathan --- include/linux/filter.h | 6 +++++- net/core/filter.c | 9 +++++---- net/rose/rose_in.c | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/include/linux/filter.h b/include/linux/filter.h index c80b1a9d07152..954f6dfdd0a5c 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -358,7 +358,11 @@ static inline void bpf_prog_unlock_ro(struct bpf_prog *fp) } #endif /* CONFIG_DEBUG_SET_MODULE_RONX */ -int sk_filter(struct sock *sk, struct sk_buff *skb); +int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap); +static inline int sk_filter(struct sock *sk, struct sk_buff *skb) +{ + return sk_filter_trim_cap(sk, skb, 1); +} void bpf_prog_select_runtime(struct bpf_prog *fp); void bpf_prog_free(struct bpf_prog *fp); diff --git a/net/core/filter.c b/net/core/filter.c index e6cde173851d0..905224b23cb55 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -46,9 +46,10 @@ #include /** - * sk_filter - run a packet through a socket filter + * sk_filter_trim_cap - run a packet through a socket filter * @sk: sock associated with &sk_buff * @skb: buffer to filter + * @cap: limit on how short the eBPF program may trim the packet * * Run the filter code and then cut skb->data to correct size returned by * SK_RUN_FILTER. If pkt_len is 0 we toss packet. If skb->len is smaller @@ -57,7 +58,7 @@ * be accepted or -EPERM if the packet should be tossed. * */ -int sk_filter(struct sock *sk, struct sk_buff *skb) +int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap) { int err; struct sk_filter *filter; @@ -79,13 +80,13 @@ int sk_filter(struct sock *sk, struct sk_buff *skb) if (filter) { unsigned int pkt_len = SK_RUN_FILTER(filter, skb); - err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM; + err = pkt_len ? pskb_trim(skb, max(cap, pkt_len)) : -EPERM; } rcu_read_unlock(); return err; } -EXPORT_SYMBOL(sk_filter); +EXPORT_SYMBOL(sk_filter_trim_cap); static u64 __skb_get_pay_offset(u64 ctx, u64 a, u64 x, u64 r4, u64 r5) { diff --git a/net/rose/rose_in.c b/net/rose/rose_in.c index 79c4abcfa6b4e..fb31d2ea5a814 100644 --- a/net/rose/rose_in.c +++ b/net/rose/rose_in.c @@ -164,7 +164,8 @@ static int rose_state3_machine(struct sock *sk, struct sk_buff *skb, int framety rose_frames_acked(sk, nr); if (ns == rose->vr) { rose_start_idletimer(sk); - if (sock_queue_rcv_skb(sk, skb) == 0) { + if (sk_filter_trim_cap(sk, skb, ROSE_MIN_LEN) == 0 && + sock_queue_rcv_skb(sk, skb) == 0) { rose->vr = (rose->vr + 1) % ROSE_MODULUS; queued = 1; } else { From efc484ec07ea049361bc57b62fa0a9ae3e4a27d9 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 15 Nov 2016 13:26:28 -0700 Subject: [PATCH 0715/1015] tcp: take care of truncations done by sk_filter() With syzkaller help, Marco Grassi found a bug in TCP stack, crashing in tcp_collapse() Root cause is that sk_filter() can truncate the incoming skb, but TCP stack was not really expecting this to happen. It probably was expecting a simple DROP or ACCEPT behavior. We first need to make sure no part of TCP header could be removed. Then we need to adjust TCP_SKB_CB(skb)->end_seq Many thanks to syzkaller team and Marco for giving us a reproducer. CRs-Fixed: 1089895 Change-Id: I84185558fa6e80b13d7d0078bda9d75143680941 Signed-off-by: Eric Dumazet Reported-by: Marco Grassi Reported-by: Vladis Dronov Signed-off-by: David S. Miller Git-commit: ac6e780070e30e4c35bd395acfe9191e6268bdd3 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git [subashab@codeaurora.org: resolve trivial merge conflicts] Signed-off-by: Subash Abhinov Kasiviswanathan --- include/net/tcp.h | 1 + net/ipv4/tcp_ipv4.c | 19 ++++++++++++++++++- net/ipv6/tcp_ipv6.c | 6 ++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index 638d2fe5393db..919428932e92f 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1085,6 +1085,7 @@ static inline void tcp_prequeue_init(struct tcp_sock *tp) } bool tcp_prequeue(struct sock *sk, struct sk_buff *skb); +int tcp_filter(struct sock *sk, struct sk_buff *skb); #undef STATE_TRACE diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 81c3261dd7806..b1f3a7dd8fb1b 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1581,6 +1581,21 @@ bool tcp_prequeue(struct sock *sk, struct sk_buff *skb) } EXPORT_SYMBOL(tcp_prequeue); +int tcp_filter(struct sock *sk, struct sk_buff *skb) +{ + struct tcphdr *th = (struct tcphdr *)skb->data; + unsigned int eaten = skb->len; + int err; + + err = sk_filter_trim_cap(sk, skb, th->doff * 4); + if (!err) { + eaten -= skb->len; + TCP_SKB_CB(skb)->end_seq -= eaten; + } + return err; +} +EXPORT_SYMBOL(tcp_filter); + /* * From tcp_input.c */ @@ -1664,8 +1679,10 @@ int tcp_v4_rcv(struct sk_buff *skb) nf_reset(skb); - if (sk_filter(sk, skb)) + if (tcp_filter(sk, skb)) goto discard_and_relse; + th = (const struct tcphdr *)skb->data; + iph = ip_hdr(skb); sk_mark_napi_id(sk, skb); skb->dev = NULL; diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 205430708a92d..f29d510072c7d 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1256,7 +1256,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) if (skb->protocol == htons(ETH_P_IP)) return tcp_v4_do_rcv(sk, skb); - if (sk_filter(sk, skb)) + if (tcp_filter(sk, skb)) goto discard; /* @@ -1460,8 +1460,10 @@ static int tcp_v6_rcv(struct sk_buff *skb) goto discard_and_relse; #endif - if (sk_filter(sk, skb)) + if (tcp_filter(sk, skb)) goto discard_and_relse; + th = (const struct tcphdr *)skb->data; + hdr = ipv6_hdr(skb); sk_mark_napi_id(sk, skb); skb->dev = NULL; From e1c1d3f8f94166dc9c9316f3fcb1a9605e14cdab Mon Sep 17 00:00:00 2001 From: Maulik Shah Date: Thu, 6 Apr 2017 15:41:07 +0530 Subject: [PATCH 0716/1015] msm-core: Fix uninitialized sampling work Sampling work can be accessed by do_sampling kthread before init. Fix this by initializing sampling work before using. Change-Id: I790ce50fcddbcd08861e31fea9bde839d6fbb7cc Signed-off-by: Maulik Shah --- drivers/power/qcom/msm-core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/power/qcom/msm-core.c b/drivers/power/qcom/msm-core.c index fa46b507ab30e..a8c5650d50d9b 100644 --- a/drivers/power/qcom/msm-core.c +++ b/drivers/power/qcom/msm-core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1069,6 +1069,7 @@ static int msm_core_dev_probe(struct platform_device *pdev) if (ret) goto failed; + INIT_DEFERRABLE_WORK(&sampling_work, samplequeue_handle); ret = msm_core_task_init(&pdev->dev); if (ret) goto failed; @@ -1076,7 +1077,6 @@ static int msm_core_dev_probe(struct platform_device *pdev) for_each_possible_cpu(cpu) set_threshold(&activity[cpu]); - INIT_DEFERRABLE_WORK(&sampling_work, samplequeue_handle); schedule_delayed_work(&sampling_work, msecs_to_jiffies(0)); cpufreq_register_notifier(&cpu_policy, CPUFREQ_POLICY_NOTIFIER); pm_notifier(system_suspend_handler, 0); From d1dd6f54ea8820abc88f03d1db213db0990fa631 Mon Sep 17 00:00:00 2001 From: Ravi Kishore Tanuku Date: Wed, 22 Feb 2017 20:00:13 +0530 Subject: [PATCH 0717/1015] msm: camera: Add regulator enable and disable independent of CSID Regulator enable and disable of CSIPHY depends on the CSID module. Make the enable and disable of clk regulator independent of CSIPHY. CRs-Fixed: 1107702 Change-Id: Iabb5eb28d63b34a4c3201c53be17054a1907f4fe Signed-off-by: Ravi Kishore Tanuku --- arch/arm/boot/dts/qcom/msm8996-camera.dtsi | 38 ++++++-- .../msm/camera_v2/sensor/csiphy/msm_csiphy.c | 94 +++++++++++++++++-- .../msm/camera_v2/sensor/csiphy/msm_csiphy.h | 6 +- 3 files changed, 120 insertions(+), 18 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8996-camera.dtsi b/arch/arm/boot/dts/qcom/msm8996-camera.dtsi index 3e1a8891dfc60..e4960d0580ea7 100644 --- a/arch/arm/boot/dts/qcom/msm8996-camera.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-camera.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -28,18 +28,24 @@ reg-names = "csiphy", "csiphy_clk_mux"; interrupts = <0 78 0>; interrupt-names = "csiphy"; - clocks = <&clock_mmss clk_camss_top_ahb_clk>, + qcom,csi-vdd-voltage = <1250000>; + qcom,mipi-csi-vdd-supply = <&pm8994_l2>; + mmagic-supply = <&gdsc_mmagic_camss>; + gdscr-supply = <&gdsc_camss_top>; + qcom,cam-vreg-name = "mmagic", "gdscr"; + clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>, + <&clock_mmss clk_camss_top_ahb_clk>, <&clock_mmss clk_camss_ispif_ahb_clk>, <&clock_mmss clk_csi0phytimer_clk_src>, <&clock_mmss clk_camss_csi0phytimer_clk>, <&clock_mmss clk_camss_ahb_clk>, <&clock_mmss clk_csiphy0_3p_clk_src>, <&clock_mmss clk_camss_csiphy0_3p_clk>; - clock-names = "camss_top_ahb_clk", + clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", "camss_ahb_clk", "csiphy_3p_clk_src", "csi_phy_3p_clk"; - qcom,clock-rates = <0 0 200000000 0 0 100000000 0>; + qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>; }; qcom,csiphy@a35000 { @@ -49,18 +55,24 @@ reg-names = "csiphy", "csiphy_clk_mux"; interrupts = <0 79 0>; interrupt-names = "csiphy"; - clocks = <&clock_mmss clk_camss_top_ahb_clk>, + qcom,csi-vdd-voltage = <1250000>; + qcom,mipi-csi-vdd-supply = <&pm8994_l2>; + mmagic-supply = <&gdsc_mmagic_camss>; + gdscr-supply = <&gdsc_camss_top>; + qcom,cam-vreg-name = "mmagic", "gdscr"; + clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>, + <&clock_mmss clk_camss_top_ahb_clk>, <&clock_mmss clk_camss_ispif_ahb_clk>, <&clock_mmss clk_csi1phytimer_clk_src>, <&clock_mmss clk_camss_csi1phytimer_clk>, <&clock_mmss clk_camss_ahb_clk>, <&clock_mmss clk_csiphy1_3p_clk_src>, <&clock_mmss clk_camss_csiphy1_3p_clk>; - clock-names = "camss_top_ahb_clk", + clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", "camss_ahb_clk", "csiphy_3p_clk_src", "csi_phy_3p_clk"; - qcom,clock-rates = <0 0 200000000 0 0 100000000 0>; + qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>; }; qcom,csiphy@a36000 { @@ -70,18 +82,24 @@ reg-names = "csiphy", "csiphy_clk_mux"; interrupts = <0 80 0>; interrupt-names = "csiphy"; - clocks = <&clock_mmss clk_camss_top_ahb_clk>, + qcom,csi-vdd-voltage = <1250000>; + qcom,mipi-csi-vdd-supply = <&pm8994_l2>; + mmagic-supply = <&gdsc_mmagic_camss>; + gdscr-supply = <&gdsc_camss_top>; + qcom,cam-vreg-name = "mmagic", "gdscr"; + clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>, + <&clock_mmss clk_camss_top_ahb_clk>, <&clock_mmss clk_camss_ispif_ahb_clk>, <&clock_mmss clk_csi2phytimer_clk_src>, <&clock_mmss clk_camss_csi2phytimer_clk>, <&clock_mmss clk_camss_ahb_clk>, <&clock_mmss clk_csiphy2_3p_clk_src>, <&clock_mmss clk_camss_csiphy2_3p_clk>; - clock-names = "camss_top_ahb_clk", + clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", "camss_ahb_clk", "csiphy_3p_clk_src", "csi_phy_3p_clk"; - qcom,clock-rates = <0 0 200000000 0 0 100000000 0>; + qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>; }; qcom,csid@a30000 { diff --git a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c index 9d6952eefe601..d1bb9af3d8da2 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c +++ b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -782,6 +782,25 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) CDBG("%s:%d called\n", __func__, __LINE__); + rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy config_vreg failed\n", + __func__, __LINE__); + goto csiphy_vreg_config_fail; + } + rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy enable_vreg failed\n", + __func__, __LINE__); + goto top_vreg_enable_failed; + } + rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev, csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk, csiphy_dev->num_clk, true); @@ -790,7 +809,7 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) if (rc < 0) { pr_err("%s: csiphy clk enable failed\n", __func__); csiphy_dev->ref_count--; - goto csiphy_resource_fail; + goto csiphy_enable_clk_fail; } CDBG("%s:%d called\n", __func__, __LINE__); @@ -818,7 +837,17 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) csiphy_dev->csiphy_state = CSIPHY_POWER_UP; return 0; -csiphy_resource_fail: +csiphy_enable_clk_fail: + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +top_vreg_enable_failed: + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +csiphy_vreg_config_fail: if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, CAM_AHB_SUSPEND_VOTE) < 0) pr_err("%s: failed to vote for AHB\n", __func__); @@ -856,6 +885,24 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) pr_err("%s: failed to vote for AHB\n", __func__); return rc; } + rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy config_vreg failed\n", + __func__, __LINE__); + goto csiphy_vreg_config_fail; + } + rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy enable_vreg failed\n", + __func__, __LINE__); + goto top_vreg_enable_failed; + } rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev, csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk, @@ -865,9 +912,9 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) if (rc < 0) { pr_err("%s: csiphy clk enable failed\n", __func__); csiphy_dev->ref_count--; - goto csiphy_resource_fail; + goto csiphy_enable_clk_fail; } - CDBG("%s:%d called\n", __func__, __LINE__); + CDBG("%s:%d clk enable success\n", __func__, __LINE__); if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW) msm_csiphy_3ph_reset(csiphy_dev); @@ -890,7 +937,17 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) csiphy_dev->csiphy_state = CSIPHY_POWER_UP; return 0; -csiphy_resource_fail: +csiphy_enable_clk_fail: + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +top_vreg_enable_failed: + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +csiphy_vreg_config_fail: if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, CAM_AHB_SUSPEND_VOTE) < 0) pr_err("%s: failed to vote for AHB\n", __func__); @@ -998,6 +1055,14 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg) csiphy_dev->csiphy_3p_clk, 2, false); } + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count, + NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0); + csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN; if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, @@ -1104,6 +1169,13 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg) csiphy_dev->csiphy_3p_clk, 2, false); } + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count, + NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0); + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count, + NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0); + csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN; if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, @@ -1419,6 +1491,14 @@ static int csiphy_probe(struct platform_device *pdev) goto csiphy_no_resource; } + rc = msm_camera_get_dt_vreg_data(pdev->dev.of_node, + &(new_csiphy_dev->csiphy_vreg), + &(new_csiphy_dev->regulator_count)); + if (rc < 0) { + pr_err("%s: get vreg data from dtsi fail\n", __func__); + rc = -EFAULT; + goto csiphy_no_resource; + } /* ToDo: Enable 3phase clock for dynamic clock enable/disable */ rc = msm_csiphy_get_clk_info(new_csiphy_dev, pdev); if (rc < 0) { @@ -1493,7 +1573,7 @@ static int msm_csiphy_exit(struct platform_device *pdev) &csiphy_dev->csiphy_all_clk, csiphy_dev->num_all_clk); - msm_camera_put_reg_base(pdev, csiphy_dev->base, "csid", true); + msm_camera_put_reg_base(pdev, csiphy_dev->base, "csiphy", true); if (csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V30) { msm_camera_put_reg_base(pdev, csiphy_dev->clk_mux_base, "csiphy_clk_mux", true); diff --git a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h index 4b3c40772517a..07a08110885b4 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h +++ b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -20,6 +20,7 @@ #include #include "msm_sd.h" #include "msm_camera_io_util.h" +#include "msm_camera_dt_util.h" #include "cam_soc_api.h" #define MAX_CSIPHY 3 @@ -168,6 +169,9 @@ struct csiphy_device { uint8_t num_irq_registers; uint32_t csiphy_sof_debug; uint32_t csiphy_sof_debug_count; + struct camera_vreg_t *csiphy_vreg; + struct regulator *csiphy_reg_ptr[MAX_REGULATOR]; + int32_t regulator_count; }; #define VIDIOC_MSM_CSIPHY_RELEASE \ From 1139bd7eecef15eef1af5c9d02326d6524325a17 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Wed, 30 Sep 2015 17:44:13 +0200 Subject: [PATCH 0718/1015] sched/core: Fix task and run queue sched_info::run_delay inconsistencies Mike Meyer reported the following bug: > During evaluation of some performance data, it was discovered thread > and run queue run_delay accounting data was inconsistent with the other > accounting data that was collected. Further investigation found under > certain circumstances execution time was leaking into the task and > run queue accounting of run_delay. > > Consider the following sequence: > > a. thread is running. > b. thread moves beween cgroups, changes scheduling class or priority. > c. thread sleeps OR > d. thread involuntarily gives up cpu. > > a. implies: > > thread->sched_info.last_queued = 0 > > a. and b. results in the following: > > 1. dequeue_task(rq, thread) > > sched_info_dequeued(rq, thread) > delta = 0 > > sched_info_reset_dequeued(thread) > thread->sched_info.last_queued = 0 > > thread->sched_info.run_delay += delta > > 2. enqueue_task(rq, thread) > > sched_info_queued(rq, thread) > > /* thread is still on cpu at this point. */ > thread->sched_info.last_queued = task_rq(thread)->clock; > > c. results in: > > dequeue_task(rq, thread) > > sched_info_dequeued(rq, thread) > > /* delta is execution time not run_delay. */ > delta = task_rq(thread)->clock - thread->sched_info.last_queued > > sched_info_reset_dequeued(thread) > thread->sched_info.last_queued = 0 > > thread->sched_info.run_delay += delta > > Since thread was running between enqueue_task(rq, thread) and > dequeue_task(rq, thread), the delta above is really execution > time and not run_delay. > > d. results in: > > __sched_info_switch(thread, next_thread) > > sched_info_depart(rq, thread) > > sched_info_queued(rq, thread) > > /* last_queued not updated due to being non-zero */ > return > > Since thread was running between enqueue_task(rq, thread) and > __sched_info_switch(thread, next_thread), the execution time > between enqueue_task(rq, thread) and > __sched_info_switch(thread, next_thread) now will become > associated with run_delay due to when last_queued was last updated. > This alternative patch solves the problem by not calling sched_info_{de,}queued() in {de,en}queue_task(). Therefore the sched_info state is preserved and things work as expected. By inlining the {de,en}queue_task() functions the new condition becomes (mostly) a compile-time constant and we'll not emit any new branch instructions. It even shrinks the code (due to inlining {en,de}queue_task()): $ size defconfig-build/kernel/sched/core.o defconfig-build/kernel/sched/core.o.orig text data bss dec hex filename 64019 23378 2344 89741 15e8d defconfig-build/kernel/sched/core.o 64149 23378 2344 89871 15f0f defconfig-build/kernel/sched/core.o.orig Change-Id: I47c12ae431fe32eb370ba491917c9083cd6ce440 Reported-by: Mike Meyer Signed-off-by: Peter Zijlstra (Intel) Cc: Linus Torvalds Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: linux-kernel@vger.kernel.org Link: http://lkml.kernel.org/r/20150930154413.GO3604@twins.programming.kicks-ass.net Signed-off-by: Ingo Molnar [pkondeti@codeaurora.org: Resolved merge conflicts and applied the fixes to QHMP scheduler files] Git-commit: 1de64443d755f83af8ba8b558fded0c61afaef47 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Signed-off-by: Pavankumar Kondeti --- kernel/sched/core.c | 40 ++++++++++++++++++++++----------------- kernel/sched/qhmp_core.c | 40 ++++++++++++++++++++++----------------- kernel/sched/qhmp_sched.h | 18 ++++++++++-------- kernel/sched/sched.h | 18 ++++++++++-------- 4 files changed, 66 insertions(+), 50 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index e7d336760583a..4c48d2d2de457 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -963,18 +963,20 @@ static void set_load_weight(struct task_struct *p) load->inv_weight = prio_to_wmult[prio]; } -static void enqueue_task(struct rq *rq, struct task_struct *p, int flags) +static inline void enqueue_task(struct rq *rq, struct task_struct *p, int flags) { update_rq_clock(rq); - sched_info_queued(rq, p); + if (!(flags & ENQUEUE_RESTORE)) + sched_info_queued(rq, p); p->sched_class->enqueue_task(rq, p, flags); trace_sched_enq_deq_task(p, 1, cpumask_bits(&p->cpus_allowed)[0]); } -static void dequeue_task(struct rq *rq, struct task_struct *p, int flags) +static inline void dequeue_task(struct rq *rq, struct task_struct *p, int flags) { update_rq_clock(rq); - sched_info_dequeued(rq, p); + if (!(flags & DEQUEUE_SAVE)) + sched_info_dequeued(rq, p); p->sched_class->dequeue_task(rq, p, flags); trace_sched_enq_deq_task(p, 0, cpumask_bits(&p->cpus_allowed)[0]); } @@ -4777,7 +4779,7 @@ ttwu_stat(struct task_struct *p, int cpu, int wake_flags) #endif /* CONFIG_SCHEDSTATS */ } -static void ttwu_activate(struct rq *rq, struct task_struct *p, int en_flags) +static inline void ttwu_activate(struct rq *rq, struct task_struct *p, int en_flags) { activate_task(rq, p, en_flags); p->on_rq = TASK_ON_RQ_QUEUED; @@ -6530,7 +6532,7 @@ EXPORT_SYMBOL(default_wake_function); */ void rt_mutex_setprio(struct task_struct *p, int prio) { - int oldprio, queued, running, enqueue_flag = 0; + int oldprio, queued, running, enqueue_flag = ENQUEUE_RESTORE; struct rq *rq; const struct sched_class *prev_class; @@ -6562,7 +6564,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); if (running) put_prev_task(rq, p); @@ -6581,7 +6583,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) (pi_task && dl_entity_preempt(&pi_task->dl, &p->dl))) { p->dl.dl_boosted = 1; p->dl.dl_throttled = 0; - enqueue_flag = ENQUEUE_REPLENISH; + enqueue_flag |= ENQUEUE_REPLENISH; } else p->dl.dl_boosted = 0; p->sched_class = &dl_sched_class; @@ -6589,7 +6591,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) if (dl_prio(oldprio)) p->dl.dl_boosted = 0; if (oldprio < prio) - enqueue_flag = ENQUEUE_HEAD; + enqueue_flag |= ENQUEUE_HEAD; p->sched_class = &rt_sched_class; } else { if (dl_prio(oldprio)) @@ -6637,7 +6639,7 @@ void set_user_nice(struct task_struct *p, long nice) } queued = task_on_rq_queued(p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); p->static_prio = NICE_TO_PRIO(nice); set_load_weight(p); @@ -6646,7 +6648,7 @@ void set_user_nice(struct task_struct *p, long nice) delta = p->prio - old_prio; if (queued) { - enqueue_task(rq, p, 0); + enqueue_task(rq, p, ENQUEUE_RESTORE); /* * If the task increased its priority or is running and * lowered its priority, then reschedule its CPU: @@ -7119,7 +7121,7 @@ static int __sched_setscheduler(struct task_struct *p, queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); if (running) put_prev_task(rq, p); @@ -7129,11 +7131,15 @@ static int __sched_setscheduler(struct task_struct *p, if (running) p->sched_class->set_curr_task(rq); if (queued) { + int enqueue_flags = ENQUEUE_RESTORE; /* * We enqueue to tail when the priority of a task is * increased (user space view). */ - enqueue_task(rq, p, oldprio <= p->prio ? ENQUEUE_HEAD : 0); + if (oldprio <= p->prio) + enqueue_flags |= ENQUEUE_HEAD; + + enqueue_task(rq, p, enqueue_flags); } check_class_changed(rq, p, prev_class, oldprio); @@ -8369,7 +8375,7 @@ void sched_setnuma(struct task_struct *p, int nid) running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); if (running) put_prev_task(rq, p); @@ -8378,7 +8384,7 @@ void sched_setnuma(struct task_struct *p, int nid) if (running) p->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, p, 0); + enqueue_task(rq, p, ENQUEUE_RESTORE); task_rq_unlock(rq, p, &flags); } #endif @@ -11043,7 +11049,7 @@ void sched_move_task(struct task_struct *tsk) queued = task_on_rq_queued(tsk); if (queued) - dequeue_task(rq, tsk, 0); + dequeue_task(rq, tsk, DEQUEUE_SAVE); if (unlikely(running)) put_prev_task(rq, tsk); @@ -11067,7 +11073,7 @@ void sched_move_task(struct task_struct *tsk) if (unlikely(running)) tsk->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, tsk, 0); + enqueue_task(rq, tsk, ENQUEUE_RESTORE); task_rq_unlock(rq, tsk, &flags); } diff --git a/kernel/sched/qhmp_core.c b/kernel/sched/qhmp_core.c index fe99dcdd3217c..4db8f7004598e 100644 --- a/kernel/sched/qhmp_core.c +++ b/kernel/sched/qhmp_core.c @@ -889,18 +889,20 @@ static void set_load_weight(struct task_struct *p) load->inv_weight = prio_to_wmult[prio]; } -static void enqueue_task(struct rq *rq, struct task_struct *p, int flags) +static inline void enqueue_task(struct rq *rq, struct task_struct *p, int flags) { update_rq_clock(rq); - sched_info_queued(rq, p); + if (!(flags & ENQUEUE_RESTORE)) + sched_info_queued(rq, p); p->sched_class->enqueue_task(rq, p, flags); trace_sched_enq_deq_task(p, 1, cpumask_bits(&p->cpus_allowed)[0]); } -static void dequeue_task(struct rq *rq, struct task_struct *p, int flags) +static inline void dequeue_task(struct rq *rq, struct task_struct *p, int flags) { update_rq_clock(rq); - sched_info_dequeued(rq, p); + if (!(flags & DEQUEUE_SAVE)) + sched_info_dequeued(rq, p); p->sched_class->dequeue_task(rq, p, flags); trace_sched_enq_deq_task(p, 0, cpumask_bits(&p->cpus_allowed)[0]); } @@ -3211,7 +3213,7 @@ ttwu_stat(struct task_struct *p, int cpu, int wake_flags) #endif /* CONFIG_SCHEDSTATS */ } -static void ttwu_activate(struct rq *rq, struct task_struct *p, int en_flags) +static inline void ttwu_activate(struct rq *rq, struct task_struct *p, int en_flags) { activate_task(rq, p, en_flags); p->on_rq = TASK_ON_RQ_QUEUED; @@ -4886,7 +4888,7 @@ EXPORT_SYMBOL(default_wake_function); */ void rt_mutex_setprio(struct task_struct *p, int prio) { - int oldprio, queued, running, enqueue_flag = 0; + int oldprio, queued, running, enqueue_flag = ENQUEUE_RESTORE; struct rq *rq; const struct sched_class *prev_class; @@ -4918,7 +4920,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); if (running) put_prev_task(rq, p); @@ -4937,7 +4939,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) (pi_task && dl_entity_preempt(&pi_task->dl, &p->dl))) { p->dl.dl_boosted = 1; p->dl.dl_throttled = 0; - enqueue_flag = ENQUEUE_REPLENISH; + enqueue_flag |= ENQUEUE_REPLENISH; } else p->dl.dl_boosted = 0; p->sched_class = &dl_sched_class; @@ -4945,7 +4947,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) if (dl_prio(oldprio)) p->dl.dl_boosted = 0; if (oldprio < prio) - enqueue_flag = ENQUEUE_HEAD; + enqueue_flag |= ENQUEUE_HEAD; p->sched_class = &rt_sched_class; } else { if (dl_prio(oldprio)) @@ -4993,7 +4995,7 @@ void set_user_nice(struct task_struct *p, long nice) } queued = task_on_rq_queued(p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); p->static_prio = NICE_TO_PRIO(nice); set_load_weight(p); @@ -5002,7 +5004,7 @@ void set_user_nice(struct task_struct *p, long nice) delta = p->prio - old_prio; if (queued) { - enqueue_task(rq, p, 0); + enqueue_task(rq, p, ENQUEUE_RESTORE); /* * If the task increased its priority or is running and * lowered its priority, then reschedule its CPU: @@ -5475,7 +5477,7 @@ static int __sched_setscheduler(struct task_struct *p, queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); if (running) put_prev_task(rq, p); @@ -5485,11 +5487,15 @@ static int __sched_setscheduler(struct task_struct *p, if (running) p->sched_class->set_curr_task(rq); if (queued) { + int enqueue_flags = ENQUEUE_RESTORE; /* * We enqueue to tail when the priority of a task is * increased (user space view). */ - enqueue_task(rq, p, oldprio <= p->prio ? ENQUEUE_HEAD : 0); + if (oldprio <= p->prio) + enqueue_flags |= ENQUEUE_HEAD; + + enqueue_task(rq, p, enqueue_flags); } check_class_changed(rq, p, prev_class, oldprio); @@ -6719,7 +6725,7 @@ void sched_setnuma(struct task_struct *p, int nid) running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); if (running) put_prev_task(rq, p); @@ -6728,7 +6734,7 @@ void sched_setnuma(struct task_struct *p, int nid) if (running) p->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, p, 0); + enqueue_task(rq, p, ENQUEUE_RESTORE); task_rq_unlock(rq, p, &flags); } #endif @@ -9391,7 +9397,7 @@ void sched_move_task(struct task_struct *tsk) queued = task_on_rq_queued(tsk); if (queued) - dequeue_task(rq, tsk, 0); + dequeue_task(rq, tsk, DEQUEUE_SAVE); if (unlikely(running)) put_prev_task(rq, tsk); @@ -9415,7 +9421,7 @@ void sched_move_task(struct task_struct *tsk) if (unlikely(running)) tsk->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, tsk, 0); + enqueue_task(rq, tsk, ENQUEUE_RESTORE); task_rq_unlock(rq, tsk, &flags); } diff --git a/kernel/sched/qhmp_sched.h b/kernel/sched/qhmp_sched.h index 91d0dffaf9090..126daccf71e2c 100644 --- a/kernel/sched/qhmp_sched.h +++ b/kernel/sched/qhmp_sched.h @@ -1431,18 +1431,20 @@ static const u32 prio_to_wmult[40] = { /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, }; -#define ENQUEUE_WAKEUP 1 -#define ENQUEUE_HEAD 2 +#define ENQUEUE_WAKEUP 0x01 +#define ENQUEUE_HEAD 0x02 #ifdef CONFIG_SMP -#define ENQUEUE_WAKING 4 /* sched_class::task_waking was called */ +#define ENQUEUE_WAKING 0x04 /* sched_class::task_waking was called */ #else -#define ENQUEUE_WAKING 0 +#define ENQUEUE_WAKING 0x00 #endif -#define ENQUEUE_REPLENISH 8 -#define ENQUEUE_MIGRATING 16 +#define ENQUEUE_REPLENISH 0x08 +#define ENQUEUE_RESTORE 0x10 +#define ENQUEUE_MIGRATING 0x20 -#define DEQUEUE_SLEEP 1 -#define DEQUEUE_MIGRATING 2 +#define DEQUEUE_SLEEP 0x01 +#define DEQUEUE_SAVE 0x02 +#define DEQUEUE_MIGRATING 0x04 #define RETRY_TASK ((void *)-1UL) diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index e84a1d16b0e96..41dd243d9020f 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1671,18 +1671,20 @@ static const u32 prio_to_wmult[40] = { /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, }; -#define ENQUEUE_WAKEUP 1 -#define ENQUEUE_HEAD 2 +#define ENQUEUE_WAKEUP 0x01 +#define ENQUEUE_HEAD 0x02 #ifdef CONFIG_SMP -#define ENQUEUE_WAKING 4 /* sched_class::task_waking was called */ +#define ENQUEUE_WAKING 0x04 /* sched_class::task_waking was called */ #else -#define ENQUEUE_WAKING 0 +#define ENQUEUE_WAKING 0x00 #endif -#define ENQUEUE_REPLENISH 8 -#define ENQUEUE_MIGRATING 16 +#define ENQUEUE_REPLENISH 0x08 +#define ENQUEUE_RESTORE 0x10 +#define ENQUEUE_MIGRATING 0x20 -#define DEQUEUE_SLEEP 1 -#define DEQUEUE_MIGRATING 2 +#define DEQUEUE_SLEEP 0x01 +#define DEQUEUE_SAVE 0x02 +#define DEQUEUE_MIGRATING 0x04 #define RETRY_TASK ((void *)-1UL) From e05807be51b11ed90743d4145cdaab66b22f3cd6 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Mon, 18 Jan 2016 15:27:07 +0100 Subject: [PATCH 0719/1015] sched/rt: Fix PI handling vs. sched_setscheduler() Andrea Parri reported: > I found that the following scenario (with CONFIG_RT_GROUP_SCHED=y) is not > handled correctly: > > T1 (prio = 20) > lock(rtmutex); > > T2 (prio = 20) > blocks on rtmutex (rt_nr_boosted = 0 on T1's rq) > > T1 (prio = 20) > sys_set_scheduler(prio = 0) > [new_effective_prio == oldprio] > T1 prio = 20 (rt_nr_boosted = 0 on T1's rq) > > The last step is incorrect as T1 is now boosted (c.f., rt_se_boosted()); > in particular, if we continue with > > T1 (prio = 20) > unlock(rtmutex) > wakeup(T2) > adjust_prio(T1) > [prio != rt_mutex_getprio(T1)] > dequeue(T1) > rt_nr_boosted = (unsigned long)(-1) > ... > T1 prio = 0 > > then we end up leaving rt_nr_boosted in an "inconsistent" state. > > The simple program attached could reproduce the previous scenario; note > that, as a consequence of the presence of this state, the "assertion" > > WARN_ON(!rt_nr_running && rt_nr_boosted) > > from dec_rt_group() may trigger. So normally we dequeue/enqueue tasks in sched_setscheduler(), which would ensure the accounting stays correct. However in the early PI path we fail to do so. So this was introduced at around v3.14, by: c365c292d059 ("sched: Consider pi boosting in setscheduler()") which fixed another problem exactly because that dequeue/enqueue, joy. Fix this by teaching rt about DEQUEUE_SAVE/ENQUEUE_RESTORE and have it preserve runqueue location with that option. This requires decoupling the on_rt_rq() state from being on the list. In order to allow for explicit movement during the SAVE/RESTORE, introduce {DE,EN}QUEUE_MOVE. We still must use SAVE/RESTORE in these cases to preserve other invariants. Respecting the SAVE/RESTORE flags also has the (nice) side-effect that things like sys_nice()/sys_sched_setaffinity() also do not reorder FIFO tasks (whereas they used to before this patch). Change-Id: I1450923252f55dba19f450008db813113eb06c76 Reported-by: Andrea Parri Tested-by: Andrea Parri Signed-off-by: Peter Zijlstra (Intel) Cc: Juri Lelli Cc: Linus Torvalds Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Steven Rostedt Cc: Thomas Gleixner Signed-off-by: Ingo Molnar [pkondeti@codeaurora.org: Resolved merge conflicts and applied the fixes to QHMP scheduler files] Git-commit: ff77e468535987b3d21b7bd4da15608ea3ce7d0b Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Signed-off-by: Pavankumar Kondeti --- include/linux/sched.h | 2 + kernel/sched/core.c | 39 ++++++++++-------- kernel/sched/qhmp_core.c | 39 ++++++++++-------- kernel/sched/qhmp_rt.c | 86 +++++++++++++++++++++++++++------------ kernel/sched/qhmp_sched.h | 40 ++++++++++++++---- kernel/sched/rt.c | 86 +++++++++++++++++++++++++++------------ kernel/sched/sched.h | 40 ++++++++++++++---- 7 files changed, 228 insertions(+), 104 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index 27caaaa7289a0..1cb810887a371 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1227,6 +1227,8 @@ struct sched_rt_entity { unsigned long timeout; unsigned long watchdog_stamp; unsigned int time_slice; + unsigned short on_rq; + unsigned short on_list; struct sched_rt_entity *back; #ifdef CONFIG_RT_GROUP_SCHED diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 4c48d2d2de457..81ce793db58ee 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5255,6 +5255,10 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) __dl_clear_params(p); INIT_LIST_HEAD(&p->rt.run_list); + p->rt.timeout = 0; + p->rt.time_slice = sched_rr_timeslice; + p->rt.on_rq = 0; + p->rt.on_list = 0; #ifdef CONFIG_PREEMPT_NOTIFIERS INIT_HLIST_HEAD(&p->preempt_notifiers); @@ -6532,7 +6536,7 @@ EXPORT_SYMBOL(default_wake_function); */ void rt_mutex_setprio(struct task_struct *p, int prio) { - int oldprio, queued, running, enqueue_flag = ENQUEUE_RESTORE; + int oldprio, queued, running, queue_flag = DEQUEUE_SAVE | DEQUEUE_MOVE; struct rq *rq; const struct sched_class *prev_class; @@ -6560,11 +6564,15 @@ void rt_mutex_setprio(struct task_struct *p, int prio) trace_sched_pi_setprio(p, prio); oldprio = p->prio; + + if (oldprio == prio) + queue_flag &= ~DEQUEUE_MOVE; + prev_class = p->sched_class; queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, DEQUEUE_SAVE); + dequeue_task(rq, p, queue_flag); if (running) put_prev_task(rq, p); @@ -6583,7 +6591,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) (pi_task && dl_entity_preempt(&pi_task->dl, &p->dl))) { p->dl.dl_boosted = 1; p->dl.dl_throttled = 0; - enqueue_flag |= ENQUEUE_REPLENISH; + queue_flag |= ENQUEUE_REPLENISH; } else p->dl.dl_boosted = 0; p->sched_class = &dl_sched_class; @@ -6591,7 +6599,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) if (dl_prio(oldprio)) p->dl.dl_boosted = 0; if (oldprio < prio) - enqueue_flag |= ENQUEUE_HEAD; + queue_flag |= ENQUEUE_HEAD; p->sched_class = &rt_sched_class; } else { if (dl_prio(oldprio)) @@ -6606,7 +6614,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) if (running) p->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, p, enqueue_flag); + enqueue_task(rq, p, queue_flag); check_class_changed(rq, p, prev_class, oldprio); out_unlock: @@ -6928,6 +6936,7 @@ static int __sched_setscheduler(struct task_struct *p, const struct sched_class *prev_class; struct rq *rq; int reset_on_fork; + int queue_flags = DEQUEUE_SAVE | DEQUEUE_MOVE; /* may grab non-irq protected spin_locks */ BUG_ON(in_interrupt()); @@ -7112,16 +7121,13 @@ static int __sched_setscheduler(struct task_struct *p, * itself. */ new_effective_prio = rt_mutex_get_effective_prio(p, newprio); - if (new_effective_prio == oldprio) { - __setscheduler_params(p, attr); - task_rq_unlock(rq, p, &flags); - return 0; - } + if (new_effective_prio == oldprio) + queue_flags &= ~DEQUEUE_MOVE; queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, DEQUEUE_SAVE); + dequeue_task(rq, p, queue_flags); if (running) put_prev_task(rq, p); @@ -7131,15 +7137,14 @@ static int __sched_setscheduler(struct task_struct *p, if (running) p->sched_class->set_curr_task(rq); if (queued) { - int enqueue_flags = ENQUEUE_RESTORE; /* * We enqueue to tail when the priority of a task is * increased (user space view). */ - if (oldprio <= p->prio) - enqueue_flags |= ENQUEUE_HEAD; + if (oldprio < p->prio) + queue_flags |= ENQUEUE_HEAD; - enqueue_task(rq, p, enqueue_flags); + enqueue_task(rq, p, queue_flags); } check_class_changed(rq, p, prev_class, oldprio); @@ -11049,7 +11054,7 @@ void sched_move_task(struct task_struct *tsk) queued = task_on_rq_queued(tsk); if (queued) - dequeue_task(rq, tsk, DEQUEUE_SAVE); + dequeue_task(rq, tsk, DEQUEUE_SAVE | DEQUEUE_MOVE); if (unlikely(running)) put_prev_task(rq, tsk); @@ -11073,7 +11078,7 @@ void sched_move_task(struct task_struct *tsk) if (unlikely(running)) tsk->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, tsk, ENQUEUE_RESTORE); + enqueue_task(rq, tsk, ENQUEUE_RESTORE | ENQUEUE_MOVE); task_rq_unlock(rq, tsk, &flags); } diff --git a/kernel/sched/qhmp_core.c b/kernel/sched/qhmp_core.c index 4db8f7004598e..ce2c0c3dc1a12 100644 --- a/kernel/sched/qhmp_core.c +++ b/kernel/sched/qhmp_core.c @@ -3678,6 +3678,10 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) __dl_clear_params(p); INIT_LIST_HEAD(&p->rt.run_list); + p->rt.timeout = 0; + p->rt.time_slice = sched_rr_timeslice; + p->rt.on_rq = 0; + p->rt.on_list = 0; #ifdef CONFIG_PREEMPT_NOTIFIERS INIT_HLIST_HEAD(&p->preempt_notifiers); @@ -4888,7 +4892,7 @@ EXPORT_SYMBOL(default_wake_function); */ void rt_mutex_setprio(struct task_struct *p, int prio) { - int oldprio, queued, running, enqueue_flag = ENQUEUE_RESTORE; + int oldprio, queued, running, queue_flag = DEQUEUE_SAVE | DEQUEUE_MOVE; struct rq *rq; const struct sched_class *prev_class; @@ -4916,11 +4920,15 @@ void rt_mutex_setprio(struct task_struct *p, int prio) trace_sched_pi_setprio(p, prio); oldprio = p->prio; + + if (oldprio == prio) + queue_flag &= ~DEQUEUE_MOVE; + prev_class = p->sched_class; queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, DEQUEUE_SAVE); + dequeue_task(rq, p, queue_flag); if (running) put_prev_task(rq, p); @@ -4939,7 +4947,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) (pi_task && dl_entity_preempt(&pi_task->dl, &p->dl))) { p->dl.dl_boosted = 1; p->dl.dl_throttled = 0; - enqueue_flag |= ENQUEUE_REPLENISH; + queue_flag |= ENQUEUE_REPLENISH; } else p->dl.dl_boosted = 0; p->sched_class = &dl_sched_class; @@ -4947,7 +4955,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) if (dl_prio(oldprio)) p->dl.dl_boosted = 0; if (oldprio < prio) - enqueue_flag |= ENQUEUE_HEAD; + queue_flag |= ENQUEUE_HEAD; p->sched_class = &rt_sched_class; } else { if (dl_prio(oldprio)) @@ -4962,7 +4970,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) if (running) p->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, p, enqueue_flag); + enqueue_task(rq, p, queue_flag); check_class_changed(rq, p, prev_class, oldprio); out_unlock: @@ -5284,6 +5292,7 @@ static int __sched_setscheduler(struct task_struct *p, const struct sched_class *prev_class; struct rq *rq; int reset_on_fork; + int queue_flags = DEQUEUE_SAVE | DEQUEUE_MOVE; /* may grab non-irq protected spin_locks */ BUG_ON(in_interrupt()); @@ -5468,16 +5477,13 @@ static int __sched_setscheduler(struct task_struct *p, * itself. */ new_effective_prio = rt_mutex_get_effective_prio(p, newprio); - if (new_effective_prio == oldprio) { - __setscheduler_params(p, attr); - task_rq_unlock(rq, p, &flags); - return 0; - } + if (new_effective_prio == oldprio) + queue_flags &= ~DEQUEUE_MOVE; queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, DEQUEUE_SAVE); + dequeue_task(rq, p, queue_flags); if (running) put_prev_task(rq, p); @@ -5487,15 +5493,14 @@ static int __sched_setscheduler(struct task_struct *p, if (running) p->sched_class->set_curr_task(rq); if (queued) { - int enqueue_flags = ENQUEUE_RESTORE; /* * We enqueue to tail when the priority of a task is * increased (user space view). */ - if (oldprio <= p->prio) - enqueue_flags |= ENQUEUE_HEAD; + if (oldprio < p->prio) + queue_flags |= ENQUEUE_HEAD; - enqueue_task(rq, p, enqueue_flags); + enqueue_task(rq, p, queue_flags); } check_class_changed(rq, p, prev_class, oldprio); @@ -9397,7 +9402,7 @@ void sched_move_task(struct task_struct *tsk) queued = task_on_rq_queued(tsk); if (queued) - dequeue_task(rq, tsk, DEQUEUE_SAVE); + dequeue_task(rq, tsk, DEQUEUE_SAVE | DEQUEUE_MOVE); if (unlikely(running)) put_prev_task(rq, tsk); @@ -9421,7 +9426,7 @@ void sched_move_task(struct task_struct *tsk) if (unlikely(running)) tsk->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, tsk, ENQUEUE_RESTORE); + enqueue_task(rq, tsk, ENQUEUE_RESTORE | ENQUEUE_MOVE); task_rq_unlock(rq, tsk, &flags); } diff --git a/kernel/sched/qhmp_rt.c b/kernel/sched/qhmp_rt.c index 6f2a5c297f493..201cadeca1537 100644 --- a/kernel/sched/qhmp_rt.c +++ b/kernel/sched/qhmp_rt.c @@ -412,7 +412,7 @@ static void dequeue_top_rt_rq(struct rt_rq *rt_rq); static inline int on_rt_rq(struct sched_rt_entity *rt_se) { - return !list_empty(&rt_se->run_list); + return rt_se->on_rq; } #ifdef CONFIG_RT_GROUP_SCHED @@ -458,8 +458,8 @@ static inline struct rt_rq *group_rt_rq(struct sched_rt_entity *rt_se) return rt_se->my_q; } -static void enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head); -static void dequeue_rt_entity(struct sched_rt_entity *rt_se); +static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags); +static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags); static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) { @@ -475,7 +475,7 @@ static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) if (!rt_se) enqueue_top_rt_rq(rt_rq); else if (!on_rt_rq(rt_se)) - enqueue_rt_entity(rt_se, false); + enqueue_rt_entity(rt_se, 0); if (rt_rq->highest_prio.curr < curr->prio) resched_curr(rq); @@ -492,7 +492,7 @@ static void sched_rt_rq_dequeue(struct rt_rq *rt_rq) if (!rt_se) dequeue_top_rt_rq(rt_rq); else if (on_rt_rq(rt_se)) - dequeue_rt_entity(rt_se); + dequeue_rt_entity(rt_se, 0); } static inline int rt_rq_throttled(struct rt_rq *rt_rq) @@ -1231,7 +1231,30 @@ void dec_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) dec_rt_group(rt_se, rt_rq); } -static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) +/* + * Change rt_se->run_list location unless SAVE && !MOVE + * + * assumes ENQUEUE/DEQUEUE flags match + */ +static inline bool move_entity(unsigned int flags) +{ + if ((flags & (DEQUEUE_SAVE | DEQUEUE_MOVE)) == DEQUEUE_SAVE) + return false; + + return true; +} + +static void __delist_rt_entity(struct sched_rt_entity *rt_se, struct rt_prio_array *array) +{ + list_del_init(&rt_se->run_list); + + if (list_empty(array->queue + rt_se_prio(rt_se))) + __clear_bit(rt_se_prio(rt_se), array->bitmap); + + rt_se->on_list = 0; +} + +static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rt_rq *rt_rq = rt_rq_of_se(rt_se); struct rt_prio_array *array = &rt_rq->active; @@ -1244,26 +1267,37 @@ static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) * get throttled and the current group doesn't have any other * active members. */ - if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) + if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) { + if (rt_se->on_list) + __delist_rt_entity(rt_se, array); return; + } - if (head) - list_add(&rt_se->run_list, queue); - else - list_add_tail(&rt_se->run_list, queue); - __set_bit(rt_se_prio(rt_se), array->bitmap); + if (move_entity(flags)) { + WARN_ON_ONCE(rt_se->on_list); + if (flags & ENQUEUE_HEAD) + list_add(&rt_se->run_list, queue); + else + list_add_tail(&rt_se->run_list, queue); + + __set_bit(rt_se_prio(rt_se), array->bitmap); + rt_se->on_list = 1; + } + rt_se->on_rq = 1; inc_rt_tasks(rt_se, rt_rq); } -static void __dequeue_rt_entity(struct sched_rt_entity *rt_se) +static void __dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rt_rq *rt_rq = rt_rq_of_se(rt_se); struct rt_prio_array *array = &rt_rq->active; - list_del_init(&rt_se->run_list); - if (list_empty(array->queue + rt_se_prio(rt_se))) - __clear_bit(rt_se_prio(rt_se), array->bitmap); + if (move_entity(flags)) { + WARN_ON_ONCE(!rt_se->on_list); + __delist_rt_entity(rt_se, array); + } + rt_se->on_rq = 0; dec_rt_tasks(rt_se, rt_rq); } @@ -1272,7 +1306,7 @@ static void __dequeue_rt_entity(struct sched_rt_entity *rt_se) * Because the prio of an upper entry depends on the lower * entries, we must remove entries top - down. */ -static void dequeue_rt_stack(struct sched_rt_entity *rt_se) +static void dequeue_rt_stack(struct sched_rt_entity *rt_se, unsigned int flags) { struct sched_rt_entity *back = NULL; @@ -1285,31 +1319,31 @@ static void dequeue_rt_stack(struct sched_rt_entity *rt_se) for (rt_se = back; rt_se; rt_se = rt_se->back) { if (on_rt_rq(rt_se)) - __dequeue_rt_entity(rt_se); + __dequeue_rt_entity(rt_se, flags); } } -static void enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) +static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rq *rq = rq_of_rt_se(rt_se); - dequeue_rt_stack(rt_se); + dequeue_rt_stack(rt_se, flags); for_each_sched_rt_entity(rt_se) - __enqueue_rt_entity(rt_se, head); + __enqueue_rt_entity(rt_se, flags); enqueue_top_rt_rq(&rq->rt); } -static void dequeue_rt_entity(struct sched_rt_entity *rt_se) +static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rq *rq = rq_of_rt_se(rt_se); - dequeue_rt_stack(rt_se); + dequeue_rt_stack(rt_se, flags); for_each_sched_rt_entity(rt_se) { struct rt_rq *rt_rq = group_rt_rq(rt_se); if (rt_rq && rt_rq->rt_nr_running) - __enqueue_rt_entity(rt_se, false); + __enqueue_rt_entity(rt_se, flags); } enqueue_top_rt_rq(&rq->rt); } @@ -1325,7 +1359,7 @@ enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags) if (flags & ENQUEUE_WAKEUP) rt_se->timeout = 0; - enqueue_rt_entity(rt_se, flags & ENQUEUE_HEAD); + enqueue_rt_entity(rt_se, flags); inc_hmp_sched_stats_rt(rq, p); if (!task_current(rq, p) && p->nr_cpus_allowed > 1) @@ -1337,7 +1371,7 @@ static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags) struct sched_rt_entity *rt_se = &p->rt; update_curr_rt(rq); - dequeue_rt_entity(rt_se); + dequeue_rt_entity(rt_se, flags); dec_hmp_sched_stats_rt(rq, p); dequeue_pushable_task(rq, p); diff --git a/kernel/sched/qhmp_sched.h b/kernel/sched/qhmp_sched.h index 126daccf71e2c..3a3a048b01e5b 100644 --- a/kernel/sched/qhmp_sched.h +++ b/kernel/sched/qhmp_sched.h @@ -1431,20 +1431,42 @@ static const u32 prio_to_wmult[40] = { /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, }; +/* + * {de,en}queue flags: + * + * DEQUEUE_SLEEP - task is no longer runnable + * ENQUEUE_WAKEUP - task just became runnable + * + * SAVE/RESTORE - an otherwise spurious dequeue/enqueue, done to ensure tasks + * are in a known state which allows modification. Such pairs + * should preserve as much state as possible. + * + * MOVE - paired with SAVE/RESTORE, explicitly does not preserve the location + * in the runqueue. + * + * ENQUEUE_HEAD - place at front of runqueue (tail if not specified) + * ENQUEUE_REPLENISH - CBS (replenish runtime and postpone deadline) + * ENQUEUE_WAKING - sched_class::task_waking was called + * + */ + +#define DEQUEUE_SLEEP 0x01 +#define DEQUEUE_SAVE 0x02 /* matches ENQUEUE_RESTORE */ +#define DEQUEUE_MOVE 0x04 /* matches ENQUEUE_MOVE */ +#define DEQUEUE_MIGRATING 0x08 + #define ENQUEUE_WAKEUP 0x01 -#define ENQUEUE_HEAD 0x02 +#define ENQUEUE_RESTORE 0x02 +#define ENQUEUE_MOVE 0x04 + +#define ENQUEUE_HEAD 0x08 +#define ENQUEUE_REPLENISH 0x10 #ifdef CONFIG_SMP -#define ENQUEUE_WAKING 0x04 /* sched_class::task_waking was called */ +#define ENQUEUE_WAKING 0x20 #else #define ENQUEUE_WAKING 0x00 #endif -#define ENQUEUE_REPLENISH 0x08 -#define ENQUEUE_RESTORE 0x10 -#define ENQUEUE_MIGRATING 0x20 - -#define DEQUEUE_SLEEP 0x01 -#define DEQUEUE_SAVE 0x02 -#define DEQUEUE_MIGRATING 0x04 +#define ENQUEUE_MIGRATING 0x40 #define RETRY_TASK ((void *)-1UL) diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 083b45a9de5b3..ce5fe4aa091b1 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -412,7 +412,7 @@ static void dequeue_top_rt_rq(struct rt_rq *rt_rq); static inline int on_rt_rq(struct sched_rt_entity *rt_se) { - return !list_empty(&rt_se->run_list); + return rt_se->on_rq; } #ifdef CONFIG_RT_GROUP_SCHED @@ -458,8 +458,8 @@ static inline struct rt_rq *group_rt_rq(struct sched_rt_entity *rt_se) return rt_se->my_q; } -static void enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head); -static void dequeue_rt_entity(struct sched_rt_entity *rt_se); +static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags); +static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags); static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) { @@ -475,7 +475,7 @@ static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) if (!rt_se) enqueue_top_rt_rq(rt_rq); else if (!on_rt_rq(rt_se)) - enqueue_rt_entity(rt_se, false); + enqueue_rt_entity(rt_se, 0); if (rt_rq->highest_prio.curr < curr->prio) resched_curr(rq); @@ -492,7 +492,7 @@ static void sched_rt_rq_dequeue(struct rt_rq *rt_rq) if (!rt_se) dequeue_top_rt_rq(rt_rq); else if (on_rt_rq(rt_se)) - dequeue_rt_entity(rt_se); + dequeue_rt_entity(rt_se, 0); } static inline int rt_rq_throttled(struct rt_rq *rt_rq) @@ -1244,7 +1244,30 @@ void dec_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) dec_rt_group(rt_se, rt_rq); } -static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) +/* + * Change rt_se->run_list location unless SAVE && !MOVE + * + * assumes ENQUEUE/DEQUEUE flags match + */ +static inline bool move_entity(unsigned int flags) +{ + if ((flags & (DEQUEUE_SAVE | DEQUEUE_MOVE)) == DEQUEUE_SAVE) + return false; + + return true; +} + +static void __delist_rt_entity(struct sched_rt_entity *rt_se, struct rt_prio_array *array) +{ + list_del_init(&rt_se->run_list); + + if (list_empty(array->queue + rt_se_prio(rt_se))) + __clear_bit(rt_se_prio(rt_se), array->bitmap); + + rt_se->on_list = 0; +} + +static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rt_rq *rt_rq = rt_rq_of_se(rt_se); struct rt_prio_array *array = &rt_rq->active; @@ -1257,26 +1280,37 @@ static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) * get throttled and the current group doesn't have any other * active members. */ - if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) + if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) { + if (rt_se->on_list) + __delist_rt_entity(rt_se, array); return; + } - if (head) - list_add(&rt_se->run_list, queue); - else - list_add_tail(&rt_se->run_list, queue); - __set_bit(rt_se_prio(rt_se), array->bitmap); + if (move_entity(flags)) { + WARN_ON_ONCE(rt_se->on_list); + if (flags & ENQUEUE_HEAD) + list_add(&rt_se->run_list, queue); + else + list_add_tail(&rt_se->run_list, queue); + + __set_bit(rt_se_prio(rt_se), array->bitmap); + rt_se->on_list = 1; + } + rt_se->on_rq = 1; inc_rt_tasks(rt_se, rt_rq); } -static void __dequeue_rt_entity(struct sched_rt_entity *rt_se) +static void __dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rt_rq *rt_rq = rt_rq_of_se(rt_se); struct rt_prio_array *array = &rt_rq->active; - list_del_init(&rt_se->run_list); - if (list_empty(array->queue + rt_se_prio(rt_se))) - __clear_bit(rt_se_prio(rt_se), array->bitmap); + if (move_entity(flags)) { + WARN_ON_ONCE(!rt_se->on_list); + __delist_rt_entity(rt_se, array); + } + rt_se->on_rq = 0; dec_rt_tasks(rt_se, rt_rq); } @@ -1285,7 +1319,7 @@ static void __dequeue_rt_entity(struct sched_rt_entity *rt_se) * Because the prio of an upper entry depends on the lower * entries, we must remove entries top - down. */ -static void dequeue_rt_stack(struct sched_rt_entity *rt_se) +static void dequeue_rt_stack(struct sched_rt_entity *rt_se, unsigned int flags) { struct sched_rt_entity *back = NULL; @@ -1298,31 +1332,31 @@ static void dequeue_rt_stack(struct sched_rt_entity *rt_se) for (rt_se = back; rt_se; rt_se = rt_se->back) { if (on_rt_rq(rt_se)) - __dequeue_rt_entity(rt_se); + __dequeue_rt_entity(rt_se, flags); } } -static void enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) +static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rq *rq = rq_of_rt_se(rt_se); - dequeue_rt_stack(rt_se); + dequeue_rt_stack(rt_se, flags); for_each_sched_rt_entity(rt_se) - __enqueue_rt_entity(rt_se, head); + __enqueue_rt_entity(rt_se, flags); enqueue_top_rt_rq(&rq->rt); } -static void dequeue_rt_entity(struct sched_rt_entity *rt_se) +static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rq *rq = rq_of_rt_se(rt_se); - dequeue_rt_stack(rt_se); + dequeue_rt_stack(rt_se, flags); for_each_sched_rt_entity(rt_se) { struct rt_rq *rt_rq = group_rt_rq(rt_se); if (rt_rq && rt_rq->rt_nr_running) - __enqueue_rt_entity(rt_se, false); + __enqueue_rt_entity(rt_se, flags); } enqueue_top_rt_rq(&rq->rt); } @@ -1338,7 +1372,7 @@ enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags) if (flags & ENQUEUE_WAKEUP) rt_se->timeout = 0; - enqueue_rt_entity(rt_se, flags & ENQUEUE_HEAD); + enqueue_rt_entity(rt_se, flags); inc_hmp_sched_stats_rt(rq, p); if (!task_current(rq, p) && p->nr_cpus_allowed > 1) @@ -1350,7 +1384,7 @@ static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags) struct sched_rt_entity *rt_se = &p->rt; update_curr_rt(rq); - dequeue_rt_entity(rt_se); + dequeue_rt_entity(rt_se, flags); dec_hmp_sched_stats_rt(rq, p); dequeue_pushable_task(rq, p); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 41dd243d9020f..63f2797109da7 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1671,20 +1671,42 @@ static const u32 prio_to_wmult[40] = { /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, }; +/* + * {de,en}queue flags: + * + * DEQUEUE_SLEEP - task is no longer runnable + * ENQUEUE_WAKEUP - task just became runnable + * + * SAVE/RESTORE - an otherwise spurious dequeue/enqueue, done to ensure tasks + * are in a known state which allows modification. Such pairs + * should preserve as much state as possible. + * + * MOVE - paired with SAVE/RESTORE, explicitly does not preserve the location + * in the runqueue. + * + * ENQUEUE_HEAD - place at front of runqueue (tail if not specified) + * ENQUEUE_REPLENISH - CBS (replenish runtime and postpone deadline) + * ENQUEUE_WAKING - sched_class::task_waking was called + * + */ + +#define DEQUEUE_SLEEP 0x01 +#define DEQUEUE_SAVE 0x02 /* matches ENQUEUE_RESTORE */ +#define DEQUEUE_MOVE 0x04 /* matches ENQUEUE_MOVE */ +#define DEQUEUE_MIGRATING 0x08 + #define ENQUEUE_WAKEUP 0x01 -#define ENQUEUE_HEAD 0x02 +#define ENQUEUE_RESTORE 0x02 +#define ENQUEUE_MOVE 0x04 + +#define ENQUEUE_HEAD 0x08 +#define ENQUEUE_REPLENISH 0x10 #ifdef CONFIG_SMP -#define ENQUEUE_WAKING 0x04 /* sched_class::task_waking was called */ +#define ENQUEUE_WAKING 0x20 #else #define ENQUEUE_WAKING 0x00 #endif -#define ENQUEUE_REPLENISH 0x08 -#define ENQUEUE_RESTORE 0x10 -#define ENQUEUE_MIGRATING 0x20 - -#define DEQUEUE_SLEEP 0x01 -#define DEQUEUE_SAVE 0x02 -#define DEQUEUE_MIGRATING 0x04 +#define ENQUEUE_MIGRATING 0x40 #define RETRY_TASK ((void *)-1UL) From 8a37fc803386d4f8fe2bd293b4c0f04f35457cee Mon Sep 17 00:00:00 2001 From: Andrew Chant Date: Tue, 4 Apr 2017 15:04:17 +0530 Subject: [PATCH 0720/1015] input: touchscreen: synaptics_dsx_2.6: Remove fw_update sysfs entries Remove the sysfs entrypoints to fw_update of synaptics_dsx_2.6 touch driver. BUG: 32769717 Change-Id: If12093e51f92f98e9c719127fbd01f7b2dcd0eb1 Git-commit: 2615c5f302441568e6dd20007bc5246d72837e80 Git-repo: https://android.googlesource.com/kernel/msm.git Signed-off-by: Andrew Chant [shjain@codeaurora.org: kconfig change already cherry-picked as part of commit 663f06e13d9e506af328e433c6904e45ef0d8410.] Signed-off-by: Shantanu Jain --- .../synaptics_dsx_fw_update.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c index 168318f85e538..f4854a93a4460 100644 --- a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c +++ b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c @@ -127,6 +127,7 @@ static int fwu_do_reflash(void); static int fwu_recovery_check_status(void); +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static ssize_t fwu_sysfs_show_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count); @@ -179,6 +180,7 @@ static ssize_t fwu_sysfs_guest_code_block_count_show(struct device *dev, static ssize_t fwu_sysfs_write_guest_code_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +#endif enum f34_version { F34_V0 = 0, @@ -650,6 +652,7 @@ struct synaptics_rmi4_fwu_handle { struct work_struct fwu_work; }; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static struct bin_attribute dev_attr_data = { .attr = { .name = "data", @@ -659,8 +662,10 @@ static struct bin_attribute dev_attr_data = { .read = fwu_sysfs_show_image, .write = fwu_sysfs_store_image, }; +#endif static struct device_attribute attrs[] = { +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS __ATTR(dorecovery, S_IWUSR | S_IWGRP, NULL, fwu_sysfs_do_recovery_store), @@ -706,6 +711,7 @@ static struct device_attribute attrs[] = { __ATTR(writeguestcode, S_IWUSR | S_IWGRP, NULL, fwu_sysfs_write_guest_code_store), +#endif }; static struct synaptics_rmi4_fwu_handle *fwu; @@ -2610,6 +2616,7 @@ static int fwu_check_dp_configuration_size(void) return 0; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_check_pm_configuration_size(void) { unsigned short block_count; @@ -2626,6 +2633,7 @@ static int fwu_check_pm_configuration_size(void) return 0; } +#endif static int fwu_check_bl_configuration_size(void) { @@ -2825,6 +2833,7 @@ static int fwu_write_dp_configuration(void) return fwu_write_configuration(); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_write_pm_configuration(void) { fwu->config_area = PM_CONFIG_AREA; @@ -2834,6 +2843,7 @@ static int fwu_write_pm_configuration(void) return fwu_write_configuration(); } +#endif static int fwu_write_flash_configuration(void) { @@ -3041,6 +3051,7 @@ static int fwu_do_reflash(void) return retval; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_do_read_config(void) { int retval; @@ -3118,6 +3129,7 @@ static int fwu_do_read_config(void) return retval; } +#endif static int fwu_do_lockdown_v7(void) { @@ -3192,6 +3204,7 @@ static int fwu_do_lockdown_v5v6(void) return retval; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_start_write_guest_code(void) { int retval; @@ -3397,6 +3410,7 @@ static int fwu_start_write_config(void) return retval; } +#endif static int fwu_start_reflash(void) { @@ -3598,6 +3612,7 @@ static int fwu_recovery_check_status(void) return 0; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_recovery_erase_all(void) { int retval; @@ -3791,6 +3806,7 @@ static int fwu_start_recovery(void) return retval; } +#endif int synaptics_fw_updater(const unsigned char *fw_data) { @@ -3849,6 +3865,7 @@ static void fwu_startup_fw_update_work(struct work_struct *work) } #endif +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static ssize_t fwu_sysfs_show_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) @@ -4220,6 +4237,7 @@ static ssize_t fwu_sysfs_write_guest_code_store(struct device *dev, fwu->image = NULL; return retval; } +#endif static void synaptics_rmi4_fwu_attn(struct synaptics_rmi4_data *rmi4_data, unsigned char intr_mask) @@ -4304,6 +4322,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) fwu->do_lockdown = DO_LOCKDOWN; fwu->initialized = true; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS retval = sysfs_create_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); if (retval < 0) { @@ -4312,6 +4331,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) __func__); goto exit_free_mem; } +#endif for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj, @@ -4340,7 +4360,9 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) &attrs[attr_count].attr); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif exit_free_mem: kfree(fwu->image_name); @@ -4371,7 +4393,9 @@ static void synaptics_rmi4_fwu_remove(struct synaptics_rmi4_data *rmi4_data) &attrs[attr_count].attr); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif kfree(fwu->read_config_buf); kfree(fwu->image_name); From f357ab14dcc4b6054625f554b5017ee9ebae3edc Mon Sep 17 00:00:00 2001 From: Amey Telawane Date: Mon, 1 Aug 2016 16:50:43 +0530 Subject: [PATCH 0721/1015] trace: resolve stack corruption due to string copy Strcpy has no limit on string being copied which causes stack corruption leading to kernel panic. Use strlcpy to resolve the issue by providing length of string to be copied. CRs-fixed: 1048480 Change-Id: Ib290b25f7e0ff96927b8530e5c078869441d409f Signed-off-by: Amey Telawane --- kernel/trace/trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 445f12467b6bc..b4c923afd410b 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1551,7 +1551,7 @@ static void __trace_find_cmdline(int pid, char comm[]) map = savedcmd->map_pid_to_cmdline[pid]; if (map != NO_CMDLINE_MAP) - strcpy(comm, get_saved_cmdlines(map)); + strlcpy(comm, get_saved_cmdlines(map), TASK_COMM_LEN - 1); else strcpy(comm, "<...>"); } From 3b6d0f503920797bee98026b17a5a57f0a1c7103 Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Wed, 22 Mar 2017 15:04:24 +0530 Subject: [PATCH 0722/1015] mmc: sd: return error information of sd_init_card incase of failure During _mmc_sd_resume, if sd card initialization fails, the error information is getting overwritten by mmc_resume_clk_scaling and the error is not passed to caller function. Change-Id: Id173e2db65024f12a714ec623668e47c540a56c3 Signed-off-by: Vijay Viswanath --- drivers/mmc/core/sd.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 9ef31b0d8d458..08c3144adb27a 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -1275,6 +1275,11 @@ static int _mmc_sd_resume(struct mmc_host *host) #else err = mmc_sd_init_card(host, host->card->ocr, host->card); #endif + if (err) { + pr_err("%s: %s: mmc_sd_init_card_failed (%d)\n", + mmc_hostname(host), __func__, err); + goto out; + } mmc_card_clr_suspended(host->card); err = mmc_resume_clk_scaling(host); From 1efc82cce6353b9e30295150847a774eb59e9a8e Mon Sep 17 00:00:00 2001 From: Willem de Bruijn Date: Tue, 15 Nov 2016 14:43:27 -0700 Subject: [PATCH 0723/1015] rose: limit sk_filter trim to payload Sockets can have a filter program attached that drops or trims incoming packets based on the filter program return value. Rose requires data packets to have at least ROSE_MIN_LEN bytes. It verifies this on arrival in rose_route_frame and unconditionally pulls the bytes in rose_recvmsg. The filter can trim packets to below this value in-between, causing pull to fail, leaving the partial header at the time of skb_copy_datagram_msg. Place a lower bound on the size to which sk_filter may trim packets by introducing sk_filter_trim_cap and call this for rose packets. CRs-Fixed: 1089895 Change-Id: Idc52737bc96097a9220dfe47bb76e94ff1026a05 Signed-off-by: Willem de Bruijn Acked-by: Daniel Borkmann Signed-off-by: David S. Miller Git-commit: f4979fcea7fd36d8e2f556abef86f80e0d5af1ba Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git [subashab@codeaurora.org: resolve trivial merge conflicts] Signed-off-by: Subash Abhinov Kasiviswanathan --- include/linux/filter.h | 6 +++++- net/core/filter.c | 9 +++++---- net/rose/rose_in.c | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/include/linux/filter.h b/include/linux/filter.h index c80b1a9d07152..954f6dfdd0a5c 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -358,7 +358,11 @@ static inline void bpf_prog_unlock_ro(struct bpf_prog *fp) } #endif /* CONFIG_DEBUG_SET_MODULE_RONX */ -int sk_filter(struct sock *sk, struct sk_buff *skb); +int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap); +static inline int sk_filter(struct sock *sk, struct sk_buff *skb) +{ + return sk_filter_trim_cap(sk, skb, 1); +} void bpf_prog_select_runtime(struct bpf_prog *fp); void bpf_prog_free(struct bpf_prog *fp); diff --git a/net/core/filter.c b/net/core/filter.c index e6cde173851d0..905224b23cb55 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -46,9 +46,10 @@ #include /** - * sk_filter - run a packet through a socket filter + * sk_filter_trim_cap - run a packet through a socket filter * @sk: sock associated with &sk_buff * @skb: buffer to filter + * @cap: limit on how short the eBPF program may trim the packet * * Run the filter code and then cut skb->data to correct size returned by * SK_RUN_FILTER. If pkt_len is 0 we toss packet. If skb->len is smaller @@ -57,7 +58,7 @@ * be accepted or -EPERM if the packet should be tossed. * */ -int sk_filter(struct sock *sk, struct sk_buff *skb) +int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap) { int err; struct sk_filter *filter; @@ -79,13 +80,13 @@ int sk_filter(struct sock *sk, struct sk_buff *skb) if (filter) { unsigned int pkt_len = SK_RUN_FILTER(filter, skb); - err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM; + err = pkt_len ? pskb_trim(skb, max(cap, pkt_len)) : -EPERM; } rcu_read_unlock(); return err; } -EXPORT_SYMBOL(sk_filter); +EXPORT_SYMBOL(sk_filter_trim_cap); static u64 __skb_get_pay_offset(u64 ctx, u64 a, u64 x, u64 r4, u64 r5) { diff --git a/net/rose/rose_in.c b/net/rose/rose_in.c index 79c4abcfa6b4e..fb31d2ea5a814 100644 --- a/net/rose/rose_in.c +++ b/net/rose/rose_in.c @@ -164,7 +164,8 @@ static int rose_state3_machine(struct sock *sk, struct sk_buff *skb, int framety rose_frames_acked(sk, nr); if (ns == rose->vr) { rose_start_idletimer(sk); - if (sock_queue_rcv_skb(sk, skb) == 0) { + if (sk_filter_trim_cap(sk, skb, ROSE_MIN_LEN) == 0 && + sock_queue_rcv_skb(sk, skb) == 0) { rose->vr = (rose->vr + 1) % ROSE_MODULUS; queued = 1; } else { From 233ced315c3365acc26f9f34843c2f2806771218 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 15 Nov 2016 13:26:28 -0700 Subject: [PATCH 0724/1015] tcp: take care of truncations done by sk_filter() With syzkaller help, Marco Grassi found a bug in TCP stack, crashing in tcp_collapse() Root cause is that sk_filter() can truncate the incoming skb, but TCP stack was not really expecting this to happen. It probably was expecting a simple DROP or ACCEPT behavior. We first need to make sure no part of TCP header could be removed. Then we need to adjust TCP_SKB_CB(skb)->end_seq Many thanks to syzkaller team and Marco for giving us a reproducer. CRs-Fixed: 1089895 Change-Id: I84185558fa6e80b13d7d0078bda9d75143680941 Signed-off-by: Eric Dumazet Reported-by: Marco Grassi Reported-by: Vladis Dronov Signed-off-by: David S. Miller Git-commit: ac6e780070e30e4c35bd395acfe9191e6268bdd3 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git [subashab@codeaurora.org: resolve trivial merge conflicts] Signed-off-by: Subash Abhinov Kasiviswanathan --- include/net/tcp.h | 1 + net/ipv4/tcp_ipv4.c | 19 ++++++++++++++++++- net/ipv6/tcp_ipv6.c | 6 ++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index 638d2fe5393db..919428932e92f 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1085,6 +1085,7 @@ static inline void tcp_prequeue_init(struct tcp_sock *tp) } bool tcp_prequeue(struct sock *sk, struct sk_buff *skb); +int tcp_filter(struct sock *sk, struct sk_buff *skb); #undef STATE_TRACE diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 81c3261dd7806..b1f3a7dd8fb1b 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1581,6 +1581,21 @@ bool tcp_prequeue(struct sock *sk, struct sk_buff *skb) } EXPORT_SYMBOL(tcp_prequeue); +int tcp_filter(struct sock *sk, struct sk_buff *skb) +{ + struct tcphdr *th = (struct tcphdr *)skb->data; + unsigned int eaten = skb->len; + int err; + + err = sk_filter_trim_cap(sk, skb, th->doff * 4); + if (!err) { + eaten -= skb->len; + TCP_SKB_CB(skb)->end_seq -= eaten; + } + return err; +} +EXPORT_SYMBOL(tcp_filter); + /* * From tcp_input.c */ @@ -1664,8 +1679,10 @@ int tcp_v4_rcv(struct sk_buff *skb) nf_reset(skb); - if (sk_filter(sk, skb)) + if (tcp_filter(sk, skb)) goto discard_and_relse; + th = (const struct tcphdr *)skb->data; + iph = ip_hdr(skb); sk_mark_napi_id(sk, skb); skb->dev = NULL; diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 205430708a92d..f29d510072c7d 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1256,7 +1256,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) if (skb->protocol == htons(ETH_P_IP)) return tcp_v4_do_rcv(sk, skb); - if (sk_filter(sk, skb)) + if (tcp_filter(sk, skb)) goto discard; /* @@ -1460,8 +1460,10 @@ static int tcp_v6_rcv(struct sk_buff *skb) goto discard_and_relse; #endif - if (sk_filter(sk, skb)) + if (tcp_filter(sk, skb)) goto discard_and_relse; + th = (const struct tcphdr *)skb->data; + hdr = ipv6_hdr(skb); sk_mark_napi_id(sk, skb); skb->dev = NULL; From cef2142151b8e49bb2fde31b6fdd9dc85077807f Mon Sep 17 00:00:00 2001 From: Taniya Das Date: Tue, 11 Apr 2017 14:55:41 +0530 Subject: [PATCH 0725/1015] clk: msm: gcc: Add support for active clients of SNOC/BIMC WCNSS would require to directly vote on the snoc & bimc active only clocks. Add new instances of voter clocks to support the same. Change-Id: I447edd0b4ff6811e8e96c981ef47e3371baf8165 Signed-off-by: Taniya Das --- drivers/clk/msm/clock-gcc-8953.c | 4 ++++ include/dt-bindings/clock/msm-clocks-8953.h | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/clk/msm/clock-gcc-8953.c b/drivers/clk/msm/clock-gcc-8953.c index 1d420d1bb7661..bf0696d700bd2 100644 --- a/drivers/clk/msm/clock-gcc-8953.c +++ b/drivers/clk/msm/clock-gcc-8953.c @@ -66,6 +66,7 @@ static DEFINE_CLK_VOTER(bimc_msmbus_clk, &bimc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(bimc_msmbus_a_clk, &bimc_a_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(bimc_usb_clk, &bimc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(bimc_usb_a_clk, &bimc_a_clk.c, LONG_MAX); +static DEFINE_CLK_VOTER(bimc_wcnss_a_clk, &bimc_a_clk.c, LONG_MAX); /* PCNOC Voter */ static DEFINE_CLK_VOTER(pcnoc_keepalive_a_clk, &pcnoc_a_clk.c, LONG_MAX); @@ -79,6 +80,7 @@ static DEFINE_CLK_VOTER(snoc_msmbus_clk, &snoc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(snoc_msmbus_a_clk, &snoc_a_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(snoc_usb_clk, &snoc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(snoc_usb_a_clk, &snoc_a_clk.c, LONG_MAX); +static DEFINE_CLK_VOTER(snoc_wcnss_a_clk, &snoc_a_clk.c, LONG_MAX); /* SYSMMNOC Voter */ static DEFINE_CLK_VOTER(sysmmnoc_msmbus_clk, &sysmmnoc_clk.c, LONG_MAX); @@ -3438,6 +3440,7 @@ static struct clk_lookup msm_clocks_lookup[] = { CLK_LIST(bimc_msmbus_a_clk), CLK_LIST(bimc_usb_clk), CLK_LIST(bimc_usb_a_clk), + CLK_LIST(bimc_wcnss_a_clk), CLK_LIST(pcnoc_keepalive_a_clk), CLK_LIST(pcnoc_msmbus_clk), CLK_LIST(pcnoc_msmbus_a_clk), @@ -3447,6 +3450,7 @@ static struct clk_lookup msm_clocks_lookup[] = { CLK_LIST(snoc_msmbus_a_clk), CLK_LIST(snoc_usb_clk), CLK_LIST(snoc_usb_a_clk), + CLK_LIST(snoc_wcnss_a_clk), CLK_LIST(sysmmnoc_msmbus_clk), CLK_LIST(sysmmnoc_msmbus_a_clk), CLK_LIST(xo_dwc3_clk), diff --git a/include/dt-bindings/clock/msm-clocks-8953.h b/include/dt-bindings/clock/msm-clocks-8953.h index bb624ba084ffc..ac7136cf66b33 100644 --- a/include/dt-bindings/clock/msm-clocks-8953.h +++ b/include/dt-bindings/clock/msm-clocks-8953.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -52,6 +52,7 @@ #define clk_bimc_msmbus_a_clk 0x71d1a499 #define clk_bimc_usb_clk 0x9bd2b2bf #define clk_bimc_usb_a_clk 0xea410834 +#define clk_bimc_wcnss_a_clk 0x5a6df715 #define clk_pcnoc_keepalive_a_clk 0x9464f720 #define clk_pcnoc_msmbus_clk 0x2b53b688 #define clk_pcnoc_msmbus_a_clk 0x9753a54f @@ -61,6 +62,7 @@ #define clk_snoc_msmbus_a_clk 0x5d4683bd #define clk_snoc_usb_clk 0x29f9d73d #define clk_snoc_usb_a_clk 0x34b7821b +#define clk_snoc_wcnss_a_clk 0xd3949ebc #define clk_sysmmnoc_msmbus_a_clk 0x50600f1b #define clk_sysmmnoc_msmbus_clk 0xd61e5721 #define clk_xo_dwc3_clk 0xfad488ce From c3924eebddadb11304e85b3277c92d083e85bd83 Mon Sep 17 00:00:00 2001 From: kunleiz Date: Sun, 26 Mar 2017 20:07:43 +0800 Subject: [PATCH 0726/1015] ASoC: msm: qdspv2: add mutex to prevent access same memory simultaneously Add mutex protection to avoid simultaneous access the same memory by multiple threads. CRs-Fixed: 2013494 Change-Id: I440ea633ceb7312637c9a3b29d22236166d21a39 Signed-off-by: kunleiz --- .../misc/qcom/qdsp6v2/audio_hwacc_effects.c | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c index 9889d9c4723ba..84761747f1296 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c +++ b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c @@ -148,6 +148,8 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, case AUDIO_START: { pr_debug("%s: AUDIO_START\n", __func__); + mutex_lock(&effects->lock); + rc = q6asm_open_read_write_v2(effects->ac, FORMAT_LINEAR_PCM, FORMAT_MULTI_CHANNEL_LINEAR_PCM, @@ -159,6 +161,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, pr_err("%s: Open failed for hw accelerated effects:rc=%d\n", __func__, rc); rc = -EINVAL; + mutex_unlock(&effects->lock); goto ioctl_fail; } effects->opened = 1; @@ -175,6 +178,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, pr_err("%s: Write buffer Allocation failed rc = %d\n", __func__, rc); rc = -ENOMEM; + mutex_unlock(&effects->lock); goto ioctl_fail; } atomic_set(&effects->in_count, effects->config.input.num_buf); @@ -185,6 +189,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, pr_err("%s: Read buffer Allocation failed rc = %d\n", __func__, rc); rc = -ENOMEM; + mutex_unlock(&effects->lock); goto readbuf_fail; } atomic_set(&effects->out_count, effects->config.output.num_buf); @@ -199,6 +204,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, if (rc < 0) { pr_err("%s: pcm read block config failed\n", __func__); rc = -EINVAL; + mutex_unlock(&effects->lock); goto cfg_fail; } pr_debug("%s: dec: sample_rate: %d, num_channels: %d, bit_width: %d\n", @@ -213,6 +219,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, pr_err("%s: pcm write format block config failed\n", __func__); rc = -EINVAL; + mutex_unlock(&effects->lock); goto cfg_fail; } @@ -225,6 +232,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, effects->started = 0; pr_err("%s: ASM run state failed\n", __func__); } + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_WRITE: { @@ -286,8 +294,11 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, uint32_t idx = 0; uint32_t size = 0; + mutex_lock(&effects->lock); + if (!effects->started) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } @@ -304,11 +315,13 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, if (!rc) { pr_err("%s: read wait_event_timeout\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } if (!atomic_read(&effects->in_count)) { pr_err("%s: pcm stopped in_count 0\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } @@ -316,15 +329,18 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, if (bufptr) { if (!((void *)arg)) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } if ((effects->config.buf_cfg.input_len > size) || copy_to_user((void *)arg, bufptr, effects->config.buf_cfg.input_len)) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } } + mutex_unlock(&effects->lock); break; } default: @@ -456,6 +472,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, switch (cmd) { case AUDIO_SET_EFFECTS_CONFIG: { pr_debug("%s: AUDIO_SET_EFFECTS_CONFIG\n", __func__); + mutex_lock(&effects->lock); memset(&effects->config, 0, sizeof(effects->config)); if (copy_from_user(&effects->config, (void *)arg, sizeof(effects->config))) { @@ -473,6 +490,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, effects->config.input.num_buf, effects->config.input.sample_rate, effects->config.input.num_channels); + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_SET_BUF_LEN: { @@ -494,6 +512,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, buf_avail.input_num_avail = atomic_read(&effects->in_count); buf_avail.output_num_avail = atomic_read(&effects->out_count); + mutex_lock(&effects->lock); pr_debug("%s: write buf avail: %d, read buf avail: %d\n", __func__, buf_avail.output_num_avail, buf_avail.input_num_avail); @@ -503,16 +522,20 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, __func__); rc = -EFAULT; } + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_SET_PP_PARAMS: { + mutex_lock(&effects->lock); if (copy_from_user(argvalues, (void *)arg, MAX_PP_PARAMS_SZ*sizeof(long))) { pr_err("%s: copy from user for pp params failed\n", __func__); + mutex_unlock(&effects->lock); return -EFAULT; } rc = audio_effects_set_pp_param(effects, argvalues); + mutex_unlock(&effects->lock); break; } default: @@ -578,12 +601,14 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, case AUDIO_SET_EFFECTS_CONFIG32: { struct msm_hwacc_effects_config32 config32; struct msm_hwacc_effects_config *config = &effects->config; + mutex_lock(&effects->lock); memset(&effects->config, 0, sizeof(effects->config)); if (copy_from_user(&config32, (void *)arg, sizeof(config32))) { pr_err("%s: copy to user for AUDIO_SET_EFFECTS_CONFIG failed\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); break; } config->input.buf_size = config32.input.buf_size; @@ -620,16 +645,19 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, effects->config.input.num_buf, effects->config.input.sample_rate, effects->config.input.num_channels); + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_SET_BUF_LEN32: { struct msm_hwacc_buf_cfg32 buf_cfg32; struct msm_hwacc_effects_config *config = &effects->config; + mutex_lock(&effects->lock); if (copy_from_user(&buf_cfg32, (void *)arg, sizeof(buf_cfg32))) { pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); break; } config->buf_cfg.input_len = buf_cfg32.input_len; @@ -637,6 +665,7 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, pr_debug("%s: write buf len: %d, read buf len: %d\n", __func__, effects->config.buf_cfg.output_len, effects->config.buf_cfg.input_len); + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_GET_BUF_AVAIL32: { @@ -644,6 +673,7 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, memset(&buf_avail, 0, sizeof(buf_avail)); + mutex_lock(&effects->lock); buf_avail.input_num_avail = atomic_read(&effects->in_count); buf_avail.output_num_avail = atomic_read(&effects->out_count); pr_debug("%s: write buf avail: %d, read buf avail: %d\n", @@ -655,22 +685,26 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, __func__); rc = -EFAULT; } + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_SET_PP_PARAMS32: { long argvalues[MAX_PP_PARAMS_SZ] = {0}; int argvalues32[MAX_PP_PARAMS_SZ] = {0}; + mutex_lock(&effects->lock); if (copy_from_user(argvalues32, (void *)arg, MAX_PP_PARAMS_SZ*sizeof(int))) { pr_err("%s: copy from user failed for pp params\n", __func__); + mutex_unlock(&effects->lock); return -EFAULT; } for (i = 0; i < MAX_PP_PARAMS_SZ; i++) argvalues[i] = argvalues32[i]; rc = audio_effects_set_pp_param(effects, argvalues); + mutex_unlock(&effects->lock); break; } case AUDIO_START32: { From 13993d6e8777c88b2e583482b805dff4ab4682e1 Mon Sep 17 00:00:00 2001 From: Prasad Malisetty Date: Tue, 11 Apr 2017 23:03:43 +0530 Subject: [PATCH 0727/1015] mhi: core: remove unused dbgfs function Remove unused debug function that trigger MSI Change-Id: Ib747e579c732ece892f8695f2fdfbf107012c9c8 CRs-Fixed: 1116611 Signed-off-by: Prasad Malisetty --- drivers/platform/msm/mhi/mhi_sys.c | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/drivers/platform/msm/mhi/mhi_sys.c b/drivers/platform/msm/mhi/mhi_sys.c index 3a13e6a51609c..bc078859bb263 100644 --- a/drivers/platform/msm/mhi/mhi_sys.c +++ b/drivers/platform/msm/mhi/mhi_sys.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -207,23 +207,6 @@ static const struct file_operations mhi_dbgfs_ev_fops = { .write = NULL, }; -static ssize_t mhi_dbgfs_trigger_msi(struct file *fp, const char __user *buf, - size_t count, loff_t *offp) -{ - u32 msi_nr = 0; - void *irq_ctxt = &((mhi_devices.device_list[0]).pcie_device->dev); - - if (copy_from_user(&msi_nr, buf, sizeof(msi_nr))) - return -ENOMEM; - mhi_msi_handlr(msi_nr, irq_ctxt); - return 0; -} - -static const struct file_operations mhi_dbgfs_trigger_msi_fops = { - .read = NULL, - .write = mhi_dbgfs_trigger_msi, -}; - static ssize_t mhi_dbgfs_state_read(struct file *fp, char __user *buf, size_t count, loff_t *offp) { @@ -279,7 +262,6 @@ int mhi_init_debugfs(struct mhi_device_ctxt *mhi_dev_ctxt) { struct dentry *mhi_chan_stats; struct dentry *mhi_state_stats; - struct dentry *mhi_msi_trigger; struct dentry *mhi_ev_stats; mhi_dev_ctxt->mhi_parent_folder = @@ -309,21 +291,12 @@ int mhi_init_debugfs(struct mhi_device_ctxt *mhi_dev_ctxt) &mhi_dbgfs_state_fops); if (mhi_state_stats == NULL) goto clean_ev_stats; - mhi_msi_trigger = debugfs_create_file("mhi_msi_trigger", - 0444, - mhi_dev_ctxt->mhi_parent_folder, - mhi_dev_ctxt, - &mhi_dbgfs_trigger_msi_fops); - if (mhi_msi_trigger == NULL) - goto clean_state; mhi_dev_ctxt->chan_info = kmalloc(MHI_LOG_SIZE, GFP_KERNEL); if (mhi_dev_ctxt->chan_info == NULL) goto clean_all; return 0; clean_all: - debugfs_remove(mhi_msi_trigger); -clean_state: debugfs_remove(mhi_state_stats); clean_ev_stats: debugfs_remove(mhi_ev_stats); From d2e225477824e91e680090dbf6dfd750ad4873ce Mon Sep 17 00:00:00 2001 From: Abdulla Anam Date: Wed, 22 Mar 2017 14:00:10 +0530 Subject: [PATCH 0728/1015] msmi : vidc: Protect debug_buffer access in core_info_read with lock. Serialize core_info_read with lock so that multiple concurrent threads do not cause the write to overflow. Also have the bound check to avoid overflow in write_str function. CRs-Fixed: 2013361 Change-Id: Ia18a4b94cafd69af1d367861f2499fc202f18e9f Signed-off-by: Abdulla Anam --- .../media/platform/msm/vidc/msm_v4l2_vidc.c | 3 ++ .../media/platform/msm/vidc/msm_vidc_debug.c | 37 ++++++++++++++++--- .../media/platform/msm/vidc/msm_vidc_debug.h | 1 + 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c index 319df5e37af25..f77b94323d224 100644 --- a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c @@ -789,6 +789,8 @@ static int __init msm_vidc_init(void) if (rc) { dprintk(VIDC_ERR, "Failed to register platform driver\n"); + msm_vidc_debugfs_deinit_drv(); + debugfs_remove_recursive(vidc_driver->debugfs_root); kfree(vidc_driver); vidc_driver = NULL; } @@ -799,6 +801,7 @@ static int __init msm_vidc_init(void) static void __exit msm_vidc_exit(void) { platform_driver_unregister(&msm_vidc_driver); + msm_vidc_debugfs_deinit_drv(); debugfs_remove_recursive(vidc_driver->debugfs_root); kfree(vidc_driver); vidc_driver = NULL; diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.c b/drivers/media/platform/msm/vidc/msm_vidc_debug.c index 46e40b1b399ff..0980fa594950f 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_debug.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -34,6 +34,7 @@ int msm_vidc_debug_timeout = 0; #define MAX_DBG_BUF_SIZE 4096 struct debug_buffer { + struct mutex lock; char ptr[MAX_DBG_BUF_SIZE]; char *curr; u32 filled_size; @@ -60,8 +61,12 @@ static u32 write_str(struct debug_buffer *buffer, const char *fmt, ...) { va_list args; u32 size; + + char *curr = buffer->curr; + char *end = buffer->ptr + MAX_DBG_BUF_SIZE; + va_start(args, fmt); - size = vscnprintf(buffer->curr, MAX_DBG_BUF_SIZE - 1, fmt, args); + size = vscnprintf(curr, end - curr, fmt, args); va_end(args); buffer->curr += size; buffer->filled_size += size; @@ -75,12 +80,15 @@ static ssize_t core_info_read(struct file *file, char __user *buf, struct hfi_device *hdev; struct hal_fw_info fw_info = { {0} }; int i = 0, rc = 0; + ssize_t len = 0; if (!core || !core->device) { dprintk(VIDC_ERR, "Invalid params, core: %pK\n", core); return 0; } hdev = core->device; + + mutex_lock(&dbg_buf.lock); INIT_DBG_BUF(dbg_buf); write_str(&dbg_buf, "===============================\n"); write_str(&dbg_buf, "CORE %d: %pK\n", core->id, core); @@ -104,8 +112,11 @@ static ssize_t core_info_read(struct file *file, char __user *buf, completion_done(&core->completions[SYS_MSG_INDEX(i)]) ? "pending" : "done"); } - return simple_read_from_buffer(buf, count, ppos, + len = simple_read_from_buffer(buf, count, ppos, dbg_buf.ptr, dbg_buf.filled_size); + + mutex_unlock(&dbg_buf.lock); + return len; } static const struct file_operations core_info_fops = { @@ -143,7 +154,10 @@ static const struct file_operations ssr_fops = { struct dentry *msm_vidc_debugfs_init_drv(void) { bool ok = false; - struct dentry *dir = debugfs_create_dir("msm_vidc", NULL); + struct dentry *dir = NULL; + + mutex_init(&dbg_buf.lock); + dir = debugfs_create_dir("msm_vidc", NULL); if (IS_ERR_OR_NULL(dir)) { dir = NULL; goto failed_create_dir; @@ -212,6 +226,7 @@ struct dentry *msm_vidc_debugfs_init_core(struct msm_vidc_core *core, dprintk(VIDC_ERR, "Failed to create debugfs for msm_vidc\n"); goto failed_create_dir; } + if (!debugfs_create_file("info", S_IRUGO, dir, core, &core_info_fops)) { dprintk(VIDC_ERR, "debugfs_create_file: fail\n"); goto failed_create_dir; @@ -266,6 +281,7 @@ static ssize_t inst_info_read(struct file *file, char __user *buf, struct msm_vidc_inst *inst = file->private_data; struct msm_vidc_core *core = inst ? inst->core : NULL; int i, j; + ssize_t len = 0; if (!inst || !core) { dprintk(VIDC_ERR, "Invalid params, core: %pK inst %pK\n", @@ -277,6 +293,7 @@ static ssize_t inst_info_read(struct file *file, char __user *buf, return 0; } + mutex_lock(&dbg_buf.lock); INIT_DBG_BUF(dbg_buf); write_str(&dbg_buf, "===============================\n"); write_str(&dbg_buf, "INSTANCE: %pK (%s)\n", inst, @@ -333,9 +350,12 @@ static ssize_t inst_info_read(struct file *file, char __user *buf, write_str(&dbg_buf, "FBD Count: %d\n", inst->count.fbd); publish_unreleased_reference(inst); - put_inst(inst); - return simple_read_from_buffer(buf, count, ppos, + len = simple_read_from_buffer(buf, count, ppos, dbg_buf.ptr, dbg_buf.filled_size); + + mutex_unlock(&dbg_buf.lock); + put_inst(inst); + return len; } static const struct file_operations inst_info_fops = { @@ -416,3 +436,8 @@ void msm_vidc_debugfs_update(struct msm_vidc_inst *inst, } } +void msm_vidc_debugfs_deinit_drv(void) +{ + mutex_destroy(&dbg_buf.lock); +} + diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.h b/drivers/media/platform/msm/vidc/msm_vidc_debug.h index 55485c673f84d..abf8d3a8a1737 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_debug.h +++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.h @@ -126,6 +126,7 @@ struct dentry *msm_vidc_debugfs_init_inst(struct msm_vidc_inst *inst, struct dentry *parent); void msm_vidc_debugfs_update(struct msm_vidc_inst *inst, enum msm_vidc_debugfs_event e); +void msm_vidc_debugfs_deinit_drv(void); static inline void tic(struct msm_vidc_inst *i, enum profiling_points p, char *b) From 8db6988f5d8d34958244caf6611ed1c00df53c9b Mon Sep 17 00:00:00 2001 From: Swetha Chikkaboraiah Date: Mon, 27 Mar 2017 15:00:17 +0530 Subject: [PATCH 0729/1015] soci : qcom: socinfo: Protect current_image using semaphore lock. Variable current_image can be modified by multiple threads. This change will protect current_image getting modified by multiple threads. Change-Id: I33df463311b24f73b1ba124d388731a72bd13263 CRs-Fixed: 2016485 Signed-off-by: Swetha Chikkaboraiah --- drivers/soc/qcom/socinfo.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c index 1ff591dbe1864..19b2e9075b44e 100644 --- a/drivers/soc/qcom/socinfo.c +++ b/drivers/soc/qcom/socinfo.c @@ -46,6 +46,7 @@ #define SMEM_IMAGE_VERSION_OEM_OFFSET 96 #define SMEM_IMAGE_VERSION_PARTITION_APPS 10 +static DECLARE_RWSEM(current_image_rwsem); enum { HW_PLATFORM_UNKNOWN = 0, HW_PLATFORM_SURF = 1, @@ -948,7 +949,9 @@ msm_get_image_version(struct device *dev, pr_err("Failed to get image version base address"); return snprintf(buf, SMEM_IMAGE_VERSION_NAME_SIZE, "Unknown"); } + down_read(¤t_image_rwsem); string_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); return snprintf(buf, SMEM_IMAGE_VERSION_NAME_SIZE, "%-.75s\n", string_address); } @@ -961,14 +964,19 @@ msm_set_image_version(struct device *dev, { char *store_address; - if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) + down_read(¤t_image_rwsem); + if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) { + up_read(¤t_image_rwsem); return count; + } store_address = socinfo_get_image_version_base_address(); if (IS_ERR_OR_NULL(store_address)) { pr_err("Failed to get image version base address"); + up_read(¤t_image_rwsem); return count; } store_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); snprintf(store_address, SMEM_IMAGE_VERSION_NAME_SIZE, "%-.75s", buf); return count; } @@ -986,7 +994,9 @@ msm_get_image_variant(struct device *dev, return snprintf(buf, SMEM_IMAGE_VERSION_VARIANT_SIZE, "Unknown"); } + down_read(¤t_image_rwsem); string_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); string_address += SMEM_IMAGE_VERSION_VARIANT_OFFSET; return snprintf(buf, SMEM_IMAGE_VERSION_VARIANT_SIZE, "%-.20s\n", string_address); @@ -1000,14 +1010,19 @@ msm_set_image_variant(struct device *dev, { char *store_address; - if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) + down_read(¤t_image_rwsem); + if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) { + up_read(¤t_image_rwsem); return count; + } store_address = socinfo_get_image_version_base_address(); if (IS_ERR_OR_NULL(store_address)) { pr_err("Failed to get image version base address"); + up_read(¤t_image_rwsem); return count; } store_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); store_address += SMEM_IMAGE_VERSION_VARIANT_OFFSET; snprintf(store_address, SMEM_IMAGE_VERSION_VARIANT_SIZE, "%-.20s", buf); return count; @@ -1025,7 +1040,9 @@ msm_get_image_crm_version(struct device *dev, pr_err("Failed to get image version base address"); return snprintf(buf, SMEM_IMAGE_VERSION_OEM_SIZE, "Unknown"); } + down_read(¤t_image_rwsem); string_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); string_address += SMEM_IMAGE_VERSION_OEM_OFFSET; return snprintf(buf, SMEM_IMAGE_VERSION_OEM_SIZE, "%-.32s\n", string_address); @@ -1039,14 +1056,19 @@ msm_set_image_crm_version(struct device *dev, { char *store_address; - if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) + down_read(¤t_image_rwsem); + if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) { + up_read(¤t_image_rwsem); return count; + } store_address = socinfo_get_image_version_base_address(); if (IS_ERR_OR_NULL(store_address)) { pr_err("Failed to get image version base address"); + up_read(¤t_image_rwsem); return count; } store_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); store_address += SMEM_IMAGE_VERSION_OEM_OFFSET; snprintf(store_address, SMEM_IMAGE_VERSION_OEM_SIZE, "%-.32s", buf); return count; @@ -1057,8 +1079,14 @@ msm_get_image_number(struct device *dev, struct device_attribute *attr, char *buf) { - return snprintf(buf, PAGE_SIZE, "%d\n", + int ret; + + down_read(¤t_image_rwsem); + ret = snprintf(buf, PAGE_SIZE, "%d\n", current_image); + up_read(¤t_image_rwsem); + return ret; + } static ssize_t @@ -1070,10 +1098,12 @@ msm_select_image(struct device *dev, struct device_attribute *attr, ret = kstrtoint(buf, 10, &digit); if (ret) return ret; + down_write(¤t_image_rwsem); if (0 <= digit && digit < SMEM_IMAGE_VERSION_BLOCKS_COUNT) current_image = digit; else current_image = 0; + up_write(¤t_image_rwsem); return count; } From 3f2e0d907c5a86153c01f3d42f49e4145df88af2 Mon Sep 17 00:00:00 2001 From: Alexy Joseph Date: Fri, 3 Mar 2017 18:50:21 -0800 Subject: [PATCH 0730/1015] ASoC: qdsp6v2: Remove Eagle code Eagle driver is not in use any more. Remove the code and associated calls to it. CRs-Fixed: 1103106 Change-Id: Ice5333861beda9538f0783b70b3267523d16fd2b Signed-off-by: Alexy Joseph --- .../misc/qcom/qdsp6v2/audio_hwacc_effects.c | 65 +- include/sound/msm-dts-eagle.h | 148 -- include/sound/q6adm-v2.h | 3 +- sound/soc/msm/qdsp6v2/Makefile | 1 - sound/soc/msm/qdsp6v2/audio_cal_utils.c | 6 - .../soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c | 31 +- sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c | 76 - sound/soc/msm/qdsp6v2/msm-dts-eagle.c | 1625 ----------------- sound/soc/msm/qdsp6v2/msm-dts-srs-tm-config.c | 4 +- .../soc/msm/qdsp6v2/msm-pcm-routing-devdep.c | 41 +- sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c | 11 - sound/soc/msm/qdsp6v2/q6adm.c | 267 +-- sound/soc/msm/qdsp6v2/q6asm.c | 245 +-- sound/soc/msm/qdsp6v2/q6core.c | 111 +- 14 files changed, 20 insertions(+), 2614 deletions(-) delete mode 100644 include/sound/msm-dts-eagle.h delete mode 100644 sound/soc/msm/qdsp6v2/msm-dts-eagle.c diff --git a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c index 84761747f1296..e602650c4cb51 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c +++ b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c @@ -17,7 +17,6 @@ #include "q6audio_common.h" #include "audio_utils_aio.h" #include -#include #define MAX_CHANNELS_SUPPORTED 8 #define WAIT_TIMEDOUT_DURATION_SECS 1 @@ -53,31 +52,11 @@ static void audio_effects_init_pp(struct audio_client *ac) pr_err("%s: audio client null to init pp\n", __func__); return; } - switch (ac->topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER: - - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_1); - if (ret < 0) - pr_err("%s: Send SoftVolume1 Param failed ret=%d\n", - __func__, ret); - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_2); - if (ret < 0) - pr_err("%s: Send SoftVolume2 Param failed ret=%d\n", - __func__, ret); - - msm_dts_eagle_init_master_module(ac); - - break; - default: - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_1); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); - break; - } + ret = q6asm_set_softvolume_v2(ac, &softvol, + SOFT_VOLUME_INSTANCE_1); + if (ret < 0) + pr_err("%s: Send SoftVolume Param failed ret=%d\n", + __func__, ret); } static void audio_effects_deinit_pp(struct audio_client *ac) @@ -86,13 +65,6 @@ static void audio_effects_deinit_pp(struct audio_client *ac) pr_err("%s: audio client null to deinit pp\n", __func__); return; } - switch (ac->topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER: - msm_dts_eagle_deinit_master_module(ac); - break; - default: - break; - } } static void audio_effects_event_handler(uint32_t opcode, uint32_t token, @@ -428,33 +400,6 @@ static long audio_effects_set_pp_param(struct q6audio_effects *effects, &(effects->audio_effects.topo_switch_vol), (long *)&values[1], SOFT_VOLUME_INSTANCE_2); break; - case DTS_EAGLE_MODULE_ENABLE: - pr_debug("%s: DTS_EAGLE_MODULE_ENABLE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) { - /* - * HPX->OFF: first disable HPX and then - * enable SA+ - * HPX->ON: first disable SA+ and then - * enable HPX - */ - bool hpx_state = (bool)values[1]; - if (hpx_state) - msm_audio_effects_enable_extn(effects->ac, - &(effects->audio_effects), - false); - msm_dts_eagle_enable_asm(effects->ac, - hpx_state, - AUDPROC_MODULE_ID_DTS_HPX_PREMIX); - msm_dts_eagle_enable_asm(effects->ac, - hpx_state, - AUDPROC_MODULE_ID_DTS_HPX_POSTMIX); - if (!hpx_state) - msm_audio_effects_enable_extn(effects->ac, - &(effects->audio_effects), - true); - } - break; default: pr_err("%s: Invalid effects config module\n", __func__); rc = -EINVAL; diff --git a/include/sound/msm-dts-eagle.h b/include/sound/msm-dts-eagle.h deleted file mode 100644 index 2ef01136b7ced..0000000000000 --- a/include/sound/msm-dts-eagle.h +++ /dev/null @@ -1,148 +0,0 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MSM_DTS_EAGLE_H__ -#define __MSM_DTS_EAGLE_H__ - -#include -#include -#include -#include - -#ifdef CONFIG_COMPAT -enum { - DTS_EAGLE_IOCTL_GET_CACHE_SIZE32 = _IOR(0xF2, 0, __s32), - DTS_EAGLE_IOCTL_SET_CACHE_SIZE32 = _IOW(0xF2, 1, __s32), - DTS_EAGLE_IOCTL_GET_PARAM32 = _IOR(0xF2, 2, compat_uptr_t), - DTS_EAGLE_IOCTL_SET_PARAM32 = _IOW(0xF2, 3, compat_uptr_t), - DTS_EAGLE_IOCTL_SET_CACHE_BLOCK32 = - _IOW(0xF2, 4, compat_uptr_t), - DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE32 = - _IOW(0xF2, 5, compat_uptr_t), - DTS_EAGLE_IOCTL_GET_LICENSE32 = - _IOR(0xF2, 6, compat_uptr_t), - DTS_EAGLE_IOCTL_SET_LICENSE32 = - _IOW(0xF2, 7, compat_uptr_t), - DTS_EAGLE_IOCTL_SEND_LICENSE32 = _IOW(0xF2, 8, __s32), - DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS32 = _IOW(0xF2, 9, - compat_uptr_t), -}; -#endif - -#ifdef CONFIG_DTS_EAGLE -void msm_dts_ion_memmap(struct param_outband *po_); -int msm_dts_eagle_enable_asm(struct audio_client *ac, u32 enable, int module); -int msm_dts_eagle_enable_adm(int port_id, int copp_idx, u32 enable); -void msm_dts_eagle_add_controls(struct snd_soc_platform *platform); -int msm_dts_eagle_set_stream_gain(struct audio_client *ac, - int lgain, int rgain); -int msm_dts_eagle_handle_asm(struct dts_eagle_param_desc *depd, char *buf, - bool for_pre, bool get, struct audio_client *ac, - struct param_outband *po); -int msm_dts_eagle_handle_adm(struct dts_eagle_param_desc *depd, char *buf, - bool for_pre, bool get); -int msm_dts_eagle_ioctl(unsigned int cmd, unsigned long arg); -int msm_dts_eagle_is_hpx_on(void); -int msm_dts_eagle_init_pre(struct audio_client *ac); -int msm_dts_eagle_deinit_pre(struct audio_client *ac); -int msm_dts_eagle_init_post(int port_id, int copp_id); -int msm_dts_eagle_deinit_post(int port_id, int topology); -int msm_dts_eagle_init_master_module(struct audio_client *ac); -int msm_dts_eagle_deinit_master_module(struct audio_client *ac); -int msm_dts_eagle_pcm_new(struct snd_soc_pcm_runtime *runtime); -void msm_dts_eagle_pcm_free(struct snd_pcm *pcm); -int msm_dts_eagle_compat_ioctl(unsigned int cmd, unsigned long arg); -#else -static inline void msm_dts_ion_memmap(struct param_outband *po_) -{ - pr_debug("%s\n", __func__); -} -static inline int msm_dts_eagle_enable_asm(struct audio_client *ac, - u32 enable, int module) -{ - return 0; -} -static inline int msm_dts_eagle_enable_adm(int port_id, int copp_idx, - u32 enable) -{ - return 0; -} -static inline void msm_dts_eagle_add_controls(struct snd_soc_platform *platform) -{ -} -static inline int msm_dts_eagle_set_stream_gain(struct audio_client *ac, - int lgain, int rgain) -{ - pr_debug("%s\n", __func__); - return 0; -} -static inline int msm_dts_eagle_handle_asm(struct dts_eagle_param_desc *depd, - char *buf, bool for_pre, bool get, - struct audio_client *ac, - struct param_outband *po) -{ - return 0; -} -static inline int msm_dts_eagle_handle_adm(struct dts_eagle_param_desc *depd, - char *buf, bool for_pre, bool get) -{ - return 0; -} -static inline int msm_dts_eagle_ioctl(unsigned int cmd, unsigned long arg) -{ - return -EPERM; -} -static inline int msm_dts_eagle_is_hpx_on(void) -{ - return 0; -} -static inline int msm_dts_eagle_init_pre(struct audio_client *ac) -{ - return 0; -} -static inline int msm_dts_eagle_deinit_pre(struct audio_client *ac) -{ - return 0; -} -static inline int msm_dts_eagle_init_post(int port_id, int coppid) -{ - return 0; -} -static inline int msm_dts_eagle_deinit_post(int port_id, int topology) -{ - return 0; -} -static inline int msm_dts_eagle_init_master_module(struct audio_client *ac) -{ - return 0; -} -static inline int msm_dts_eagle_deinit_master_module(struct audio_client *ac) -{ - return 0; -} -static inline int msm_dts_eagle_pcm_new(struct snd_soc_pcm_runtime *runtime) -{ - pr_debug("%s\n", __func__); - return 0; -} -static inline void msm_dts_eagle_pcm_free(struct snd_pcm *pcm) -{ - pr_debug("%s\n", __func__); -} -static inline int msm_dts_eagle_compat_ioctl(unsigned int cmd, - unsigned long arg) -{ - return 0; -} -#endif - -#endif diff --git a/include/sound/q6adm-v2.h b/include/sound/q6adm-v2.h index 47e8e2a739201..222071da9b7f3 100644 --- a/include/sound/q6adm-v2.h +++ b/include/sound/q6adm-v2.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -34,7 +34,6 @@ enum { ADM_AUDVOL_CAL, ADM_RTAC_INFO_CAL, ADM_RTAC_APR_CAL, - ADM_DTS_EAGLE, ADM_SRS_TRUMEDIA, ADM_RTAC_AUDVOL_CAL, ADM_MAX_CAL_TYPES diff --git a/sound/soc/msm/qdsp6v2/Makefile b/sound/soc/msm/qdsp6v2/Makefile index 3472e080c9328..8e1aa309cef3c 100644 --- a/sound/soc/msm/qdsp6v2/Makefile +++ b/sound/soc/msm/qdsp6v2/Makefile @@ -10,7 +10,6 @@ obj-$(CONFIG_SLIMBUS) += msm-dai-slim.o audio_slimslave.o obj-$(CONFIG_SND_SOC_QDSP6V2) += snd-soc-qdsp6v2.o msm-pcm-dtmf-v2.o \ msm-dai-stub-v2.o obj-$(CONFIG_SND_HWDEP) += msm-pcm-routing-devdep.o -obj-$(CONFIG_DTS_EAGLE) += msm-dts-eagle.o obj-$(CONFIG_DOLBY_DAP) += msm-dolby-dap-config.o obj-$(CONFIG_DOLBY_DS2) += msm-ds2-dap-config.o obj-$(CONFIG_DTS_SRS_TM) += msm-dts-srs-tm-config.o diff --git a/sound/soc/msm/qdsp6v2/audio_cal_utils.c b/sound/soc/msm/qdsp6v2/audio_cal_utils.c index 7b803712f6877..cd5a9c5863f82 100644 --- a/sound/soc/msm/qdsp6v2/audio_cal_utils.c +++ b/sound/soc/msm/qdsp6v2/audio_cal_utils.c @@ -155,9 +155,6 @@ size_t get_cal_info_size(int32_t cal_type) case ULP_LSM_CAL_TYPE: size = sizeof(struct audio_cal_info_lsm); break; - case DTS_EAGLE_CAL_TYPE: - size = 0; - break; case AUDIO_CORE_METAINFO_CAL_TYPE: size = sizeof(struct audio_cal_info_metainfo); break; @@ -301,9 +298,6 @@ size_t get_user_cal_type_size(int32_t cal_type) case ULP_LSM_CAL_TYPE: size = sizeof(struct audio_cal_type_lsm); break; - case DTS_EAGLE_CAL_TYPE: - size = 0; - break; case AUDIO_CORE_METAINFO_CAL_TYPE: size = sizeof(struct audio_cal_type_metainfo); break; diff --git a/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c index 1c08842c78400..e312a879b86a5 100644 --- a/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -15,7 +15,6 @@ #include #include #include -#include #include #define MAX_ENABLE_CMD_SIZE 32 @@ -49,26 +48,6 @@ bool msm_audio_effects_is_effmodule_supp_in_top(int effect_module, case EQ_MODULE: switch (topology) { case ASM_STREAM_POSTPROC_TOPO_ID_SA_PLUS: - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS: - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER: - return true; - default: - return false; - } - case DTS_EAGLE_MODULE: - switch (topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX: - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS: - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER: - return true; - default: - return false; - } - case SOFT_VOLUME2_MODULE: - case DTS_EAGLE_MODULE_ENABLE: - switch (topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS: - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER: return true; default: return false; @@ -276,7 +255,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac, break; } } - if (params_length && !msm_dts_eagle_is_hpx_on() && (rc == 0)) + if (params_length && (rc == 0)) q6asm_send_audio_effects_params(ac, params, params_length); else @@ -747,7 +726,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, break; } } - if (params_length && !msm_dts_eagle_is_hpx_on() && (rc == 0)) + if (params_length && (rc == 0)) q6asm_send_audio_effects_params(ac, params, params_length); else @@ -883,7 +862,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac, break; } } - if (params_length && !msm_dts_eagle_is_hpx_on() && (rc == 0)) + if (params_length && (rc == 0)) q6asm_send_audio_effects_params(ac, params, params_length); else @@ -1223,7 +1202,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac, break; } } - if (params_length && !msm_dts_eagle_is_hpx_on() && (rc == 0)) + if (params_length && (rc == 0)) q6asm_send_audio_effects_params(ac, params, params_length); else diff --git a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c index a0cc3ad2ddbc6..3dd0ea1692db2 100644 --- a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c @@ -42,8 +42,6 @@ #include #include #include -#include - #include "msm-pcm-routing-v2.h" #define DSP_PP_BUFFERING_IN_MSEC 25 @@ -82,15 +80,6 @@ const DECLARE_TLV_DB_LINEAR(msm_compr_vol_gain, 0, #define MAX_NUMBER_OF_STREAMS 2 -/* - * Max size for getting DTS EAGLE Param through kcontrol - * Safe for both 32 and 64 bit platforms - * 64 = size of kcontrol value array on 64 bit platform - * 4 = size of parameters Eagle expects before cast to 64 bits - * 40 = size of dts_eagle_param_desc + module_id cast to 64 bits - */ -#define DTS_EAGLE_MAX_PARAM_SIZE_FOR_ALSA ((64 * 4) - 40) - struct msm_compr_gapless_state { bool set_next_stream_id; int32_t stream_opened[MAX_NUMBER_OF_STREAMS]; @@ -280,11 +269,6 @@ static int msm_compr_set_volume(struct snd_compr_stream *cstream, if (rc < 0) pr_err("%s: Send vol gain command failed rc=%d\n", __func__, rc); - else - if (msm_dts_eagle_set_stream_gain(prtd->audio_client, - volume_l, volume_r)) - pr_debug("%s: DTS_EAGLE send stream gain failed\n", - __func__); return rc; } @@ -921,26 +905,6 @@ static int msm_compr_init_pp_params(struct snd_compr_stream *cstream, }; switch (ac->topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS: /* HPX + SA+ topology */ - - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_1); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); - - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_2); - if (ret < 0) - pr_err("%s: Send SoftVolume2 Param failed ret=%d\n", - __func__, ret); - /* - * HPX module init is trigerred from HAL using ioctl - * DTS_EAGLE_MODULE_ENABLE when stream starts - */ - break; - case ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX: /* HPX topology */ - break; default: ret = q6asm_set_softvolume_v2(ac, &softvol, SOFT_VOLUME_INSTANCE_1); @@ -2477,23 +2441,6 @@ static int msm_compr_audio_effects_config_put(struct snd_kcontrol *kcontrol, &(audio_effects->equalizer), values); break; - case DTS_EAGLE_MODULE: - pr_debug("%s: DTS_EAGLE_MODULE\n", __func__); - if (!msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - return 0; - msm_dts_eagle_handle_asm(NULL, (void *)values, true, - false, prtd->audio_client, NULL); - break; - case DTS_EAGLE_MODULE_ENABLE: - pr_debug("%s: DTS_EAGLE_MODULE_ENABLE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_dts_eagle_enable_asm(prtd->audio_client, - (bool)values[0], - AUDPROC_MODULE_ID_DTS_HPX_PREMIX); - - break; case SOFT_VOLUME_MODULE: pr_debug("%s: SOFT_VOLUME_MODULE\n", __func__); break; @@ -2522,7 +2469,6 @@ static int msm_compr_audio_effects_config_get(struct snd_kcontrol *kcontrol, struct msm_compr_audio_effects *audio_effects = NULL; struct snd_compr_stream *cstream = NULL; struct msm_compr_audio *prtd = NULL; - long *values = &(ucontrol->value.integer.value[0]); pr_debug("%s\n", __func__); if (fe_id >= MSM_FRONTEND_DAI_MAX) { @@ -2542,28 +2488,6 @@ static int msm_compr_audio_effects_config_get(struct snd_kcontrol *kcontrol, return -EINVAL; } - switch (audio_effects->query.mod_id) { - case DTS_EAGLE_MODULE: - pr_debug("%s: DTS_EAGLE_MODULE handling queued get\n", - __func__); - values[0] = (long)audio_effects->query.mod_id; - values[1] = (long)audio_effects->query.parm_id; - values[2] = (long)audio_effects->query.size; - values[3] = (long)audio_effects->query.offset; - values[4] = (long)audio_effects->query.device; - if (values[2] > DTS_EAGLE_MAX_PARAM_SIZE_FOR_ALSA) { - pr_err("%s: DTS_EAGLE_MODULE parameter's requested size (%li) too large (max size is %i)\n", - __func__, values[2], - DTS_EAGLE_MAX_PARAM_SIZE_FOR_ALSA); - return -EINVAL; - } - msm_dts_eagle_handle_asm(NULL, (void *)&values[1], - true, true, prtd->audio_client, NULL); - break; - default: - pr_err("%s: Invalid effects config module\n", __func__); - return -EINVAL; - } return 0; } diff --git a/sound/soc/msm/qdsp6v2/msm-dts-eagle.c b/sound/soc/msm/qdsp6v2/msm-dts-eagle.c deleted file mode 100644 index 15845b2e6dc9e..0000000000000 --- a/sound/soc/msm/qdsp6v2/msm-dts-eagle.c +++ /dev/null @@ -1,1625 +0,0 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-routing-v2.h" - -#define ION_MEM_SIZE 131072 -#define DEPC_MAX_SIZE 524288 - -#define MPST AUDPROC_MODULE_ID_DTS_HPX_POSTMIX -#define MPRE AUDPROC_MODULE_ID_DTS_HPX_PREMIX - -#define eagle_vol_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_VOLUME: " fmt "\n", ##__VA_ARGS__) -#define eagle_vol_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_VOLUME: " fmt "\n", ##__VA_ARGS__) -#define eagle_drv_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER: " fmt "\n", ##__VA_ARGS__) -#define eagle_drv_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER: " fmt "\n", ##__VA_ARGS__) -#define eagle_precache_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_SENDCACHE_PRE: " fmt "\n", ##__VA_ARGS__) -#define eagle_precache_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_SENDCACHE_PRE: " fmt "\n", ##__VA_ARGS__) -#define eagle_postcache_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_SENDCACHE_POST: " fmt "\n", ##__VA_ARGS__) -#define eagle_postcache_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_SENDCACHE_POST: " fmt "\n", ##__VA_ARGS__) -#define eagle_ioctl_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_IOCTL: " fmt "\n", ##__VA_ARGS__) -#define eagle_ioctl_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_IOCTL: " fmt "\n", ##__VA_ARGS__) -#define eagle_asm_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_ASM: " fmt "\n", ##__VA_ARGS__) -#define eagle_asm_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_ASM: " fmt "\n", ##__VA_ARGS__) -#define eagle_adm_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_ADM: " fmt "\n", ##__VA_ARGS__) -#define eagle_adm_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_ADM: " fmt "\n", ##__VA_ARGS__) -#define eagle_enable_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_ENABLE: " fmt "\n", ##__VA_ARGS__) -#define eagle_enable_err(fmt, ...) \ - pr_err("DTS_EAGLE_ENABLE: " fmt "\n", ##__VA_ARGS__) -#define eagle_ioctl_info(fmt, ...) \ - pr_err("DTS_EAGLE_IOCTL: " fmt "\n", ##__VA_ARGS__) - -enum { - AUDIO_DEVICE_OUT_EARPIECE = 0, - AUDIO_DEVICE_OUT_SPEAKER, - AUDIO_DEVICE_OUT_WIRED_HEADSET, - AUDIO_DEVICE_OUT_WIRED_HEADPHONE, - AUDIO_DEVICE_OUT_BLUETOOTH_SCO, - AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET, - AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, - AUDIO_DEVICE_OUT_BLUETOOTH_A2DP, - AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, - AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, - AUDIO_DEVICE_OUT_AUX_DIGITAL, - AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET, - AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET, - AUDIO_DEVICE_OUT_USB_ACCESSORY, - AUDIO_DEVICE_OUT_USB_DEVICE, - AUDIO_DEVICE_OUT_REMOTE_SUBMIX, - AUDIO_DEVICE_OUT_ANC_HEADSET, - AUDIO_DEVICE_OUT_ANC_HEADPHONE, - AUDIO_DEVICE_OUT_PROXY, - AUDIO_DEVICE_OUT_FM, - AUDIO_DEVICE_OUT_FM_TX, - - AUDIO_DEVICE_OUT_COUNT -}; - -#define AUDIO_DEVICE_COMBO 0x400000 /* bit 23 */ - -enum { /* cache block */ - CB_0 = 0, - CB_1, - CB_2, - CB_3, - CB_4, - CB_5, - CB_6, - CB_7, - - CB_COUNT -}; - -enum { /* cache block description */ - CBD_DEV_MASK = 0, - CBD_OFFSG, - CBD_CMD0, - CBD_SZ0, - CBD_OFFS1, - CBD_CMD1, - CBD_SZ1, - CBD_OFFS2, - CBD_CMD2, - CBD_SZ2, - CBD_OFFS3, - CBD_CMD3, - CBD_SZ3, - - CBD_COUNT, -}; - -static s32 _fx_logN(s32 x) -{ - s32 t, y = 0xa65af; - if (x < 0x00008000) { - x <<= 16; y -= 0xb1721; } - if (x < 0x00800000) { - x <<= 8; y -= 0x58b91; } - if (x < 0x08000000) { - x <<= 4; y -= 0x2c5c8; } - if (x < 0x20000000) { - x <<= 2; y -= 0x162e4; } - if (x < 0x40000000) { - x <<= 1; y -= 0x0b172; } - t = x + (x >> 1); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x067cd; } - t = x + (x >> 2); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x03920; } - t = x + (x >> 3); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x01e27; } - t = x + (x >> 4); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x00f85; } - t = x + (x >> 5); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x007e1; } - t = x + (x >> 6); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x003f8; } - t = x + (x >> 7); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x001fe; } - x = 0x80000000 - x; - y -= x >> 15; - return y; -} - -static inline void *_getd(struct dts_eagle_param_desc *depd) -{ - return (void *)(((char *)depd) + sizeof(struct dts_eagle_param_desc)); -} - -static int _ref_cnt; -/* dts eagle parameter cache */ -static char *_depc; -static u32 _depc_size; -static s32 _c_bl[CB_COUNT][CBD_COUNT]; -static u32 _device_primary; -static u32 _device_all; -/* ION states */ -static struct ion_client *_ion_client; -static struct ion_handle *_ion_handle; -static struct param_outband _po; -static struct audio_client *_ac_NT; -static struct ion_client *_ion_client_NT; -static struct ion_handle *_ion_handle_NT; -static struct param_outband _po_NT; - -#define SEC_BLOB_MAX_CNT 10 -#define SEC_BLOB_MAX_SIZE 0x4004 /*extra 4 for size*/ -static char *_sec_blob[SEC_BLOB_MAX_CNT]; - -/* multi-copp support */ -static int _cidx[AFE_MAX_PORTS] = {-1}; - -/* volume controls */ -#define VOL_CMD_CNT_MAX 10 -static u32 _vol_cmd_cnt; -static s32 **_vol_cmds; -struct vol_cmds_d { - s32 d[4]; -}; -static struct vol_cmds_d *_vol_cmds_d; -static const s32 _log10_10_inv_x20 = 0x0008af84; - -/* hpx master control */ -static u32 _is_hpx_enabled; - -static void _volume_cmds_free(void) -{ - int i; - for (i = 0; i < _vol_cmd_cnt; i++) - kfree(_vol_cmds[i]); - _vol_cmd_cnt = 0; - kfree(_vol_cmds); - kfree(_vol_cmds_d); - _vol_cmds = NULL; - _vol_cmds_d = NULL; -} - -static s32 _volume_cmds_alloc1(s32 size) -{ - _volume_cmds_free(); - _vol_cmd_cnt = size; - _vol_cmds = kzalloc(_vol_cmd_cnt * sizeof(int *), GFP_KERNEL); - if (_vol_cmds) { - _vol_cmds_d = kzalloc(_vol_cmd_cnt * sizeof(struct vol_cmds_d), - GFP_KERNEL); - } else - _vol_cmd_cnt = 0; - if (_vol_cmds_d) - return 0; - _volume_cmds_free(); - return -ENOMEM; -} - -/* assumes size is equal or less than 0xFFF */ -static s32 _volume_cmds_alloc2(s32 idx, s32 size) -{ - kfree(_vol_cmds[idx]); - _vol_cmds[idx] = kzalloc(size, GFP_KERNEL); - if (_vol_cmds[idx]) - return 0; - _vol_cmds_d[idx].d[0] = 0; - return -ENOMEM; -} - -static void _init_cb_descs(void) -{ - int i; - for (i = 0; i < CB_COUNT; i++) { - _c_bl[i][CBD_DEV_MASK] = 0; - _c_bl[i][CBD_OFFSG] = _c_bl[i][CBD_OFFS1] = - _c_bl[i][CBD_OFFS2] = _c_bl[i][CBD_OFFS3] = - 0xFFFFFFFF; - _c_bl[i][CBD_CMD0] = _c_bl[i][CBD_SZ0] = - _c_bl[i][CBD_CMD1] = _c_bl[i][CBD_SZ1] = - _c_bl[i][CBD_CMD2] = _c_bl[i][CBD_SZ2] = - _c_bl[i][CBD_CMD3] = _c_bl[i][CBD_SZ3] = 0; - } -} - -static u32 _get_dev_mask_for_pid(int pid) -{ - switch (pid) { - case SLIMBUS_0_RX: - return (1 << AUDIO_DEVICE_OUT_EARPIECE) | - (1 << AUDIO_DEVICE_OUT_SPEAKER) | - (1 << AUDIO_DEVICE_OUT_WIRED_HEADSET) | - (1 << AUDIO_DEVICE_OUT_WIRED_HEADPHONE) | - (1 << AUDIO_DEVICE_OUT_ANC_HEADSET) | - (1 << AUDIO_DEVICE_OUT_ANC_HEADPHONE); - case INT_BT_SCO_RX: - return (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT); - case RT_PROXY_PORT_001_RX: - return (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER) | - (1 << AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) | - (1 << AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) | - (1 << AUDIO_DEVICE_OUT_USB_ACCESSORY) | - (1 << AUDIO_DEVICE_OUT_USB_DEVICE) | - (1 << AUDIO_DEVICE_OUT_PROXY); - case HDMI_RX: - return 1 << AUDIO_DEVICE_OUT_AUX_DIGITAL; - case INT_FM_RX: - return 1 << AUDIO_DEVICE_OUT_FM; - case INT_FM_TX: - return 1 << AUDIO_DEVICE_OUT_FM_TX; - default: - return 0; - } -} - -static int _get_pid_from_dev(u32 device) -{ - if (device & (1 << AUDIO_DEVICE_OUT_EARPIECE) || - device & (1 << AUDIO_DEVICE_OUT_SPEAKER) || - device & (1 << AUDIO_DEVICE_OUT_WIRED_HEADSET) || - device & (1 << AUDIO_DEVICE_OUT_WIRED_HEADPHONE) || - device & (1 << AUDIO_DEVICE_OUT_ANC_HEADSET) || - device & (1 << AUDIO_DEVICE_OUT_ANC_HEADPHONE)) { - return SLIMBUS_0_RX; - } else if (device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO) || - device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) || - device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT)) { - return INT_BT_SCO_RX; - } else if (device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) || - device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) || - device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER) || - device & (1 << AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) || - device & (1 << AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) || - device & (1 << AUDIO_DEVICE_OUT_USB_ACCESSORY) || - device & (1 << AUDIO_DEVICE_OUT_USB_DEVICE) || - device & (1 << AUDIO_DEVICE_OUT_PROXY)) { - return RT_PROXY_PORT_001_RX; - } else if (device & (1 << AUDIO_DEVICE_OUT_AUX_DIGITAL)) { - return HDMI_RX; - } else if (device & (1 << AUDIO_DEVICE_OUT_FM)) { - return INT_FM_RX; - } else if (device & (1 << AUDIO_DEVICE_OUT_FM_TX)) { - return INT_FM_TX; - } - return 0; -} - -static s32 _get_cb_for_dev(int device) -{ - s32 i; - if (device & AUDIO_DEVICE_COMBO) { - for (i = 0; i < CB_COUNT; i++) { - if ((_c_bl[i][CBD_DEV_MASK] & device) == device) - return i; - } - } else { - for (i = 0; i < CB_COUNT; i++) { - if ((_c_bl[i][CBD_DEV_MASK] & device) && - !(_c_bl[i][CBD_DEV_MASK] & AUDIO_DEVICE_COMBO)) - return i; - } - } - eagle_drv_err("%s: device %i not found", __func__, device); - return -EINVAL; -} - -static int _is_port_open_and_eagle(int pid) -{ - if (msm_routing_check_backend_enabled(pid)) - return 1; - return 1; -} - -static int _isNTDevice(u32 device) -{ - if (device & - ((1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER) | - (1 << AUDIO_DEVICE_OUT_AUX_DIGITAL))) - return 1; - return 0; -} - -static void _reg_ion_mem(void) -{ - int rc; - rc = msm_audio_ion_alloc("DTS_EAGLE", &_ion_client, &_ion_handle, - ION_MEM_SIZE, &_po.paddr, &_po.size, &_po.kvaddr); - if (rc) - eagle_drv_err("%s: msm audio ion alloc failed with %i", - __func__, rc); -} - -static void _unreg_ion_mem(void) -{ - int rc; - rc = msm_audio_ion_free(_ion_client, _ion_handle); - if (rc) - eagle_drv_err("%s: msm audio ion alloc failed with %i", - __func__, rc); -} - -static void _reg_ion_mem_NT(void) -{ - int rc; - eagle_drv_dbg("%s: NT ion mem", __func__); - rc = msm_audio_ion_alloc("DTS_EAGLE", &_ion_client_NT, - &_ion_handle_NT, ION_MEM_SIZE, - &_po_NT.paddr, &_po_NT.size, &_po_NT.kvaddr); - if (rc) { - eagle_drv_err("%s: msm audio ion alloc failed", __func__); - return; - } - rc = q6asm_memory_map(_ac_NT, _po_NT.paddr, - IN, _po_NT.size, 1); - if (rc < 0) { - eagle_drv_err("%s: memory map failed", __func__); - msm_audio_ion_free(_ion_client_NT, _ion_handle_NT); - _ion_client_NT = NULL; - _ion_handle_NT = NULL; - } -} - -static void _unreg_ion_mem_NT(void) -{ - int rc; - rc = q6asm_memory_unmap(_ac_NT, _po_NT.paddr, IN); - if (rc < 0) - eagle_drv_err("%s: mem unmap failed", __func__); - rc = msm_audio_ion_free(_ion_client_NT, _ion_handle_NT); - if (rc < 0) - eagle_drv_err("%s: mem free failed", __func__); - - _ion_client_NT = NULL; - _ion_handle_NT = NULL; -} - -static struct audio_client *_getNTDeviceAC(void) -{ - return _ac_NT; -} - -static void _set_audioclient(struct audio_client *ac) -{ - _ac_NT = ac; - _reg_ion_mem_NT(); -} - -static void _clear_audioclient(void) -{ - _unreg_ion_mem_NT(); - _ac_NT = NULL; -} - - -static int _sendcache_pre(struct audio_client *ac) -{ - uint32_t offset, size; - int32_t cidx, cmd, err = 0; - cidx = _get_cb_for_dev(_device_primary); - if (cidx < 0) { - eagle_precache_err("%s: no cache for primary device %i found", - __func__, _device_primary); - return -EINVAL; - } - offset = _c_bl[cidx][CBD_OFFSG]; - cmd = _c_bl[cidx][CBD_CMD0]; - size = _c_bl[cidx][CBD_SZ0]; - /* check for integer overflow */ - if (offset > (UINT_MAX - size)) - err = -EINVAL; - if ((_depc_size == 0) || !_depc || (size == 0) || - cmd == 0 || ((offset + size) > _depc_size) || (err != 0)) { - eagle_precache_err("%s: primary device %i cache index %i general error - cache size = %u, cache ptr = %pK, offset = %u, size = %u, cmd = %i", - __func__, _device_primary, cidx, _depc_size, _depc, - offset, size, cmd); - return -EINVAL; - } - - if ((offset < (UINT_MAX - 124)) && ((offset + 124) < _depc_size)) - eagle_precache_dbg("%s: first 6 integers %i %i %i %i %i %i (30th %i)", - __func__, *((int *)&_depc[offset]), - *((int *)&_depc[offset+4]), - *((int *)&_depc[offset+8]), - *((int *)&_depc[offset+12]), - *((int *)&_depc[offset+16]), - *((int *)&_depc[offset+20]), - *((int *)&_depc[offset+120])); - eagle_precache_dbg("%s: sending full data block to port, with cache index = %d device mask 0x%X, param = 0x%X, offset = %u, and size = %u", - __func__, cidx, _c_bl[cidx][CBD_DEV_MASK], cmd, offset, size); - - if (q6asm_dts_eagle_set(ac, cmd, size, (void *)&_depc[offset], - NULL, MPRE)) - eagle_precache_err("%s: q6asm_dts_eagle_set failed with id = %d and size = %u", - __func__, cmd, size); - else - eagle_precache_dbg("%s: q6asm_dts_eagle_set succeeded with id = %d and size = %u", - __func__, cmd, size); - return 0; -} - -static int _sendcache_post(int port_id, int copp_idx, int topology) -{ - int cidx = -1, cmd, mask, index, err = 0; - uint32_t offset, size; - - if (port_id == -1) { - cidx = _get_cb_for_dev(_device_primary); - if (cidx < 0) { - eagle_postcache_err("%s: no cache for primary device %i found. Port id was 0x%X", - __func__, _device_primary, port_id); - return -EINVAL; - } - goto NT_MODE_GOTO; - } - - index = adm_validate_and_get_port_index(port_id); - if (index < 0) { - eagle_postcache_err("%s: Invalid port idx %d port_id %#x", - __func__, index, port_id); - return -EINVAL; - } - eagle_postcache_dbg("%s: valid port idx %d for port_id %#x set to %i", - __func__, index, port_id, copp_idx); - _cidx[index] = copp_idx; - - mask = _get_dev_mask_for_pid(port_id); - if (mask & _device_primary) { - cidx = _get_cb_for_dev(_device_primary); - if (cidx < 0) { - eagle_postcache_err("%s: no cache for primary device %i found. Port id was 0x%X", - __func__, _device_primary, port_id); - return -EINVAL; - } - } else if (mask & _device_all) { - cidx = _get_cb_for_dev(_device_all); - if (cidx < 0) { - eagle_postcache_err("%s: no cache for combo device %i found. Port id was 0x%X", - __func__, _device_all, port_id); - return -EINVAL; - } - } else { - eagle_postcache_err("%s: port id 0x%X not for primary or combo device %i", - __func__, port_id, _device_primary); - return -EINVAL; - } - -NT_MODE_GOTO: - offset = _c_bl[cidx][CBD_OFFSG] + _c_bl[cidx][CBD_OFFS2]; - cmd = _c_bl[cidx][CBD_CMD2]; - size = _c_bl[cidx][CBD_SZ2]; - - /* check for integer overflow */ - if (offset > (UINT_MAX - size)) - err = -EINVAL; - if ((_depc_size == 0) || !_depc || (err != 0) || (size == 0) || - (cmd == 0) || (offset + size) > _depc_size) { - eagle_postcache_err("%s: primary device %i cache index %i port_id 0x%X general error - cache size = %u, cache ptr = %pK, offset = %u, size = %u, cmd = %i", - __func__, _device_primary, cidx, port_id, - _depc_size, _depc, offset, size, cmd); - return -EINVAL; - } - - if ((offset < (UINT_MAX - 24)) && ((offset + 24) < _depc_size)) - eagle_postcache_dbg("%s: first 6 integers %i %i %i %i %i %i", - __func__, *((int *)&_depc[offset]), - *((int *)&_depc[offset+4]), - *((int *)&_depc[offset+8]), - *((int *)&_depc[offset+12]), - *((int *)&_depc[offset+16]), - *((int *)&_depc[offset+20])); - eagle_postcache_dbg("%s: sending full data block to port, with cache index = %d device mask 0x%X, port_id = 0x%X, param = 0x%X, offset = %u, and size = %u", - __func__, cidx, _c_bl[cidx][CBD_DEV_MASK], port_id, cmd, - offset, size); - - if (_ac_NT) { - eagle_postcache_dbg("%s: NT Route detected", __func__); - if (q6asm_dts_eagle_set(_getNTDeviceAC(), cmd, size, - (void *)&_depc[offset], - &_po_NT, MPST)) - eagle_postcache_err("%s: q6asm_dts_eagle_set failed with id = 0x%X and size = %u", - __func__, cmd, size); - } else if (adm_dts_eagle_set(port_id, copp_idx, cmd, - (void *)&_depc[offset], size) < 0) - eagle_postcache_err("%s: adm_dts_eagle_set failed with id = 0x%X and size = %u", - __func__, cmd, size); - else - eagle_postcache_dbg("%s: adm_dts_eagle_set succeeded with id = 0x%X and size = %u", - __func__, cmd, size); - return 0; -} - -static int _enable_post_get_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = _is_hpx_enabled; - return 0; -} - -static int _enable_post_put_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = 0, be_index = 0, port_id, topology; - int flag = ucontrol->value.integer.value[0]; - struct msm_pcm_routing_bdai_data msm_bedai; - eagle_drv_dbg("%s: flag %d", __func__, flag); - - _is_hpx_enabled = flag ? true : false; - msm_pcm_routing_acquire_lock(); - /* send cache postmix params when hpx is set On */ - for (be_index = 0; be_index < MSM_BACKEND_DAI_MAX; be_index++) { - msm_pcm_routing_get_bedai_info(be_index, &msm_bedai); - port_id = msm_bedai.port_id; - if (!(((port_id == SLIMBUS_0_RX) || - (port_id == RT_PROXY_PORT_001_RX)) && - msm_bedai.active)) - continue; - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - topology = adm_get_topology_for_port_copp_idx( - port_id, idx); - if (topology == - ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX) { - msm_dts_eagle_enable_adm(port_id, idx, - _is_hpx_enabled); - } - } - } - msm_pcm_routing_release_lock(); - return 0; -} - -static const struct snd_kcontrol_new _hpx_enabled_controls[] = { - SOC_SINGLE_EXT("Set HPX OnOff", SND_SOC_NOPM, 0, 1, 0, - _enable_post_get_control, _enable_post_put_control) -}; - -/** - * msm_dts_ion_memmap() - helper function to map ION memory - * @po_: Out of band memory structure used as memory. - * - * Assign already allocated ION memory for mapping it to dsp. - * - * Return: No return value. - */ -void msm_dts_ion_memmap(struct param_outband *po_) -{ - po_->size = ION_MEM_SIZE; - po_->kvaddr = _po.kvaddr; - po_->paddr = _po.paddr; -} - -/** - * msm_dts_eagle_enable_asm() - Enable/disable dts module - * @ac: Enable/disable module in ASM session associated with this audio client. - * @enable: Enable/disable the dts module. - * @module: module id. - * - * Enable/disable specified dts module id in asm. - * - * Return: Return failure if any. - */ -int msm_dts_eagle_enable_asm(struct audio_client *ac, u32 enable, int module) -{ - int ret = 0; - eagle_enable_dbg("%s: enable = %i on module %i", - __func__, enable, module); - _is_hpx_enabled = enable; - ret = q6asm_dts_eagle_set(ac, AUDPROC_PARAM_ID_ENABLE, - sizeof(enable), &enable, - NULL, module); - if (_is_hpx_enabled) { - if (module == MPRE) - _sendcache_pre(ac); - else if (module == MPST) - _sendcache_post(-1, 0, 0); - } - return ret; -} - -/** - * msm_dts_eagle_enable_adm() - Enable/disable dts module in adm - * @port_id: Send enable/disable param to this port id. - * @copp_idx: Send enable/disable param to the relevant copp. - * @enable: Enable/disable the dts module. - * - * Enable/disable dts module in adm. - * - * Return: Return failure if any. - */ -int msm_dts_eagle_enable_adm(int port_id, int copp_idx, u32 enable) -{ - int ret = 0; - eagle_enable_dbg("%s: enable = %i", __func__, enable); - _is_hpx_enabled = enable; - ret = adm_dts_eagle_set(port_id, copp_idx, AUDPROC_PARAM_ID_ENABLE, - (char *)&enable, sizeof(enable)); - if (_is_hpx_enabled) - _sendcache_post(port_id, copp_idx, MPST); - return ret; -} - -/** - * msm_dts_eagle_add_controls() - Add mixer control to Enable/Disable DTS HPX - * @platform: Add mixer controls to this platform. - * - * Add mixer control to Enable/Disable DTS HPX module in ADM. - * - * Return: No return value. - */ -void msm_dts_eagle_add_controls(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, _hpx_enabled_controls, - ARRAY_SIZE(_hpx_enabled_controls)); -} - -/** - * msm_dts_eagle_set_stream_gain() - Set stream gain to DTS Premix module - * @ac: Set stream gain to ASM session associated with this audio client. - * @lgain: Left gain value. - * @rgain: Right gain value. - * - * Set stream gain to DTS Premix module in ASM. - * - * Return: failure or success. - */ -int msm_dts_eagle_set_stream_gain(struct audio_client *ac, int lgain, int rgain) -{ - u32 i, val; - s32 idx, err = 0; - - eagle_vol_dbg("%s: - entry: vol_cmd_cnt = %u, lgain = %i, rgain = %i", - __func__, _vol_cmd_cnt, lgain, rgain); - - if (_depc_size == 0) { - eagle_vol_dbg("%s: driver cache not initialized", __func__); - return -EINVAL; - } - - for (i = 0; i < _vol_cmd_cnt; i++) { - if (_vol_cmds_d[i].d[0] & 0x8000) { - idx = (sizeof(struct dts_eagle_param_desc)/sizeof(int)) - + (_vol_cmds_d[i].d[0] & 0x3FF); - val = _fx_logN(((s32)(lgain+rgain)) << 2); - val = ((long long)val * _log10_10_inv_x20) >> 16; - _vol_cmds[i][idx] = (s32)clamp((int)(((long long)val * - _vol_cmds_d[i].d[1]) >> 16), - _vol_cmds_d[i].d[2], - _vol_cmds_d[i].d[3]); - eagle_vol_dbg("%s: loop %u cmd desc found %i, idx = %i. volume info: lgain = %i, rgain = %i, volume = %i (scale %i, min %i, max %i)", - __func__, i, _vol_cmds_d[i].d[0], idx, lgain, - rgain, _vol_cmds[i][idx], _vol_cmds_d[i].d[1], - _vol_cmds_d[i].d[2], _vol_cmds_d[i].d[3]); - } - idx = _get_cb_for_dev(_device_primary); - if (idx < 0) { - eagle_vol_err("%s: no cache for primary device %i found", - __func__, _device_primary); - return -EINVAL; - } - val = _c_bl[idx][CBD_OFFSG] + _vol_cmds[i][2]; - /* check for integer overflow */ - if (val > (UINT_MAX - _vol_cmds[i][1])) - err = -EINVAL; - if ((err != 0) || ((val + _vol_cmds[i][1]) > _depc_size)) { - eagle_vol_err("%s: volume size (%u) + offset (%i) out of bounds %i", - __func__, val, _vol_cmds[i][1], _depc_size); - return -EINVAL; - } - memcpy((void *)&_depc[val], &_vol_cmds[i][4], _vol_cmds[i][1]); - if (q6asm_dts_eagle_set(ac, _vol_cmds[i][0], - _vol_cmds[i][1], (void *)&_depc[val], NULL, MPRE)) - eagle_vol_err("%s: loop %u - volume set failed with id 0x%X, size %i, offset %i, cmd_desc %i, scale %i, min %i, max %i, data(...) %i", - __func__, i, _vol_cmds[i][0], _vol_cmds[i][1], - _vol_cmds[i][2], _vol_cmds_d[i].d[0], - _vol_cmds_d[i].d[1], _vol_cmds_d[i].d[2], - _vol_cmds_d[i].d[3], _vol_cmds[i][4]); - else - eagle_vol_dbg("%s: loop %u - volume set succeeded with id 0x%X, size %i, offset %i, cmd_desc %i, scale %i, min %i, max %i, data(...) %i", - __func__, i, _vol_cmds[i][0], _vol_cmds[i][1], - _vol_cmds[i][2], _vol_cmds_d[i].d[0], - _vol_cmds_d[i].d[1], _vol_cmds_d[i].d[2], - _vol_cmds_d[i].d[3], _vol_cmds[i][4]); - } - return 0; -} - -/** - * msm_dts_eagle_handle_asm() - Set or Get params from ASM - * @depd: DTS Eagle Params structure. - * @buf: Buffer to get queried param value. - * @for_pre: For premix module or postmix module. - * @get: Getting param from DSP or setting param. - * @ac: Set/Get from ASM session associated with this audio client. - * @po: Out of band memory to set or get postmix params. - * - * Set or Get params from modules in ASM session. - * - * Return: Return failure if any. - */ -int msm_dts_eagle_handle_asm(struct dts_eagle_param_desc *depd, char *buf, - bool for_pre, bool get, struct audio_client *ac, - struct param_outband *po) -{ - struct dts_eagle_param_desc depd_ = {0}; - s32 ret = 0, isALSA = 0, err = 0, i, mod = for_pre ? MPRE : MPST; - u32 offset; - - eagle_asm_dbg("%s: set/get asm", __func__); - - /* special handling for ALSA route, to accommodate 64 bit platforms */ - if (depd == NULL) { - long *arg_ = (long *)buf; - depd = &depd_; - depd->id = (u32)*arg_++; - depd->size = (u32)*arg_++; - depd->offset = (s32)*arg_++; - depd->device = (u32)*arg_++; - buf = (char *)arg_; - isALSA = 1; - } - - if (depd->size & 1) { - eagle_asm_err("%s: parameter size %u is not a multiple of 2", - __func__, depd->size); - return -EINVAL; - } - - if (get) { - void *buf_, *buf_m = NULL; - eagle_asm_dbg("%s: get requested", __func__); - if (depd->offset == -1) { - eagle_asm_dbg("%s: get from dsp requested", __func__); - if (depd->size > 0 && depd->size <= DEPC_MAX_SIZE) { - buf_ = buf_m = vzalloc(depd->size); - } else { - eagle_asm_err("%s: get size %u invalid", - __func__, depd->size); - return -EINVAL; - } - if (!buf_m) { - eagle_asm_err("%s: out of memory", __func__); - return -ENOMEM; - } else if (q6asm_dts_eagle_get(ac, depd->id, - depd->size, buf_m, - po, mod) < 0) { - eagle_asm_err("%s: asm get failed", __func__); - ret = -EFAULT; - goto DTS_EAGLE_IOCTL_GET_PARAM_PRE_EXIT; - } - eagle_asm_dbg("%s: get result: param id 0x%x value %d size %u", - __func__, depd->id, *(int *)buf_m, depd->size); - } else { - s32 tgt = _get_cb_for_dev(depd->device); - if (tgt < 0) { - eagle_asm_err("%s: no cache for device %u found", - __func__, depd->device); - return -EINVAL; - } - offset = _c_bl[tgt][CBD_OFFSG] + depd->offset; - /* check for integer overflow */ - if (offset > (UINT_MAX - depd->size)) - err = -EINVAL; - if ((err != 0) || (offset + depd->size) > _depc_size) { - eagle_asm_err("%s: invalid size %u and/or offset %u", - __func__, depd->size, offset); - return -EINVAL; - } - buf_ = (u32 *)&_depc[offset]; - } - if (isALSA) { - if (depd->size == 2) { - *(long *)buf = (long)*(__u16 *)buf_; - eagle_asm_dbg("%s: asm out 16 bit value %li", - __func__, *(long *)buf); - } else { - s32 *pbuf = (s32 *)buf_; - long *bufl = (long *)buf; - for (i = 0; i < (depd->size >> 2); i++) { - *bufl++ = (long)*pbuf++; - eagle_asm_dbg("%s: asm out value %li", - __func__, *(bufl-1)); - } - } - } else { - memcpy(buf, buf_, depd->size); - } -DTS_EAGLE_IOCTL_GET_PARAM_PRE_EXIT: - vfree(buf_m); - return (int)ret; - } else { - s32 tgt = _get_cb_for_dev(depd->device); - if (tgt < 0) { - eagle_asm_err("%s: no cache for device %u found", - __func__, depd->device); - return -EINVAL; - } - offset = _c_bl[tgt][CBD_OFFSG] + depd->offset; - /* check for integer overflow */ - if (offset > (UINT_MAX - depd->size)) - err = -EINVAL; - if ((err != 0) || ((offset + depd->size) > _depc_size)) { - eagle_asm_err("%s: invalid size %u and/or offset %u for parameter (cache is size %u)", - __func__, depd->size, offset, _depc_size); - return -EINVAL; - } - if (isALSA) { - if (depd->size == 2) { - *(__u16 *)&_depc[offset] = (__u16)*(long *)buf; - eagle_asm_dbg("%s: asm in 16 bit value %li", - __func__, *(long *)buf); - } else { - s32 *pbuf = (s32 *)&_depc[offset]; - long *bufl = (long *)buf; - for (i = 0; i < (depd->size >> 2); i++) { - *pbuf++ = (s32)*bufl++; - eagle_asm_dbg("%s: asm in value %i", - __func__, *(pbuf-1)); - } - } - } else { - memcpy(&_depc[offset], buf, depd->size); - } - eagle_asm_dbg("%s: param info: param = 0x%X, size = %u, offset = %i, device = %u, cache block %i, global offset = %u, first bytes as integer = %i", - __func__, depd->id, depd->size, depd->offset, - depd->device, - tgt, offset, *(int *)&_depc[offset]); - if (q6asm_dts_eagle_set(ac, depd->id, depd->size, - (void *)&_depc[offset], po, mod)) - eagle_asm_err("%s: q6asm_dts_eagle_set failed with id = 0x%X, size = %u, offset = %d", - __func__, depd->id, depd->size, depd->offset); - else - eagle_asm_dbg("%s: q6asm_dts_eagle_set succeeded with id = 0x%X, size = %u, offset = %d", - __func__, depd->id, depd->size, depd->offset); - } - return (int)ret; -} - -/** - * msm_dts_eagle_handle_adm() - Set or Get params from ADM - * @depd: DTS Eagle Params structure used to set or get. - * @buf: Buffer to get queried param value in NT mode. - * @for_pre: For premix module or postmix module. - * @get: Getting param from DSP or setting param. - * - * Set or Get params from modules in ADM session. - * - * Return: Return failure if any. - */ -int msm_dts_eagle_handle_adm(struct dts_eagle_param_desc *depd, char *buf, - bool for_pre, bool get) -{ - u32 pid = _get_pid_from_dev(depd->device), cidx; - s32 ret = 0; - - eagle_adm_dbg("%s: set/get adm", __func__); - - if (_isNTDevice(depd->device)) { - eagle_adm_dbg("%s: NT Route detected", __func__); - ret = msm_dts_eagle_handle_asm(depd, buf, for_pre, get, - _getNTDeviceAC(), &_po_NT); - if (ret < 0) - eagle_adm_err("%s: NT Route set failed with id = 0x%X, size = %u, offset = %i, device = %u", - __func__, depd->id, depd->size, depd->offset, - depd->device); - } else if (get) { - cidx = adm_validate_and_get_port_index(pid); - eagle_adm_dbg("%s: get from qdsp requested (port id 0x%X)", - __func__, pid); - if (adm_dts_eagle_get(pid, _cidx[cidx], depd->id, - buf, depd->size) < 0) { - eagle_adm_err("%s: get from qdsp via adm with port id 0x%X failed", - __func__, pid); - return -EFAULT; - } - } else if (_is_port_open_and_eagle(pid)) { - cidx = adm_validate_and_get_port_index(pid); - eagle_adm_dbg("%s: adm_dts_eagle_set called with id = 0x%X, size = %u, offset = %i, device = %u, port id = %u, copp index = %u", - __func__, depd->id, depd->size, depd->offset, - depd->device, pid, cidx); - ret = adm_dts_eagle_set(pid, _cidx[cidx], depd->id, - (void *)buf, depd->size); - if (ret < 0) - eagle_adm_err("%s: adm_dts_eagle_set failed", __func__); - else - eagle_adm_dbg("%s: adm_dts_eagle_set succeeded", - __func__); - } else { - ret = -EINVAL; - eagle_adm_dbg("%s: port id 0x%X not active or not Eagle", - __func__, pid); - } - return (int)ret; -} - -/** - * msm_dts_eagle_ioctl() - ioctl handler function - * @cmd: cmd to handle. - * @arg: argument to the cmd. - * - * Handle DTS Eagle ioctl cmds. - * - * Return: Return failure if any. - */ -int msm_dts_eagle_ioctl(unsigned int cmd, unsigned long arg) -{ - s32 ret = 0; - switch (cmd) { - case DTS_EAGLE_IOCTL_GET_CACHE_SIZE: { - eagle_ioctl_info("%s: called with control 0x%X (get param cache size)", - __func__, cmd); - if (copy_to_user((void *)arg, &_depc_size, - sizeof(_depc_size))) { - eagle_ioctl_err("%s: error writing size", __func__); - return -EFAULT; - } - break; - } - case DTS_EAGLE_IOCTL_SET_CACHE_SIZE: { - u32 size = 0; - eagle_ioctl_info("%s: called with control 0x%X (allocate param cache)", - __func__, cmd); - if (copy_from_user((void *)&size, (void *)arg, sizeof(size))) { - eagle_ioctl_err("%s: error copying size (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &size, sizeof(size)); - return -EFAULT; - } else if (size > DEPC_MAX_SIZE) { - eagle_ioctl_err("%s: cache size %u not allowed (min 0, max %u)", - __func__, size, DEPC_MAX_SIZE); - return -EINVAL; - } - if (_depc) { - eagle_ioctl_dbg("%s: previous param cache of size %u freed", - __func__, _depc_size); - _depc_size = 0; - vfree(_depc); - _depc = NULL; - } - if (size) - _depc = vzalloc(size); - else - eagle_ioctl_dbg("%s: %u bytes requested for param cache, nothing allocated", - __func__, size); - if (_depc) { - eagle_ioctl_dbg("%s: %u bytes allocated for param cache", - __func__, size); - _depc_size = size; - } else { - eagle_ioctl_err("%s: error allocating param cache (vzalloc failed on %u bytes)", - __func__, size); - _depc_size = 0; - return -ENOMEM; - } - break; - } - case DTS_EAGLE_IOCTL_GET_PARAM: { - struct dts_eagle_param_desc depd; - s32 for_pre = 0, get_from_core = 0, err = 0; - u32 offset; - void *buf, *buf_m = NULL; - eagle_ioctl_info("%s: control 0x%X (get param)", - __func__, cmd); - if (copy_from_user((void *)&depd, (void *)arg, sizeof(depd))) { - eagle_ioctl_err("%s: error copying dts_eagle_param_desc (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &depd, sizeof(depd)); - return -EFAULT; - } - if (depd.device & DTS_EAGLE_FLAG_IOCTL_PRE) { - eagle_ioctl_dbg("%s: using for premix", __func__); - for_pre = 1; - } - if (depd.device & DTS_EAGLE_FLAG_IOCTL_GETFROMCORE) { - eagle_ioctl_dbg("%s: 'get from core' requested", - __func__); - get_from_core = 1; - depd.offset = -1; - } - depd.device &= DTS_EAGLE_FLAG_IOCTL_MASK; - if (depd.offset == -1) { - if (depd.size > 0 && depd.size <= DEPC_MAX_SIZE) { - buf = buf_m = vzalloc(depd.size); - } else { - eagle_ioctl_err("%s: get size %u invalid", - __func__, depd.size); - return -EINVAL; - } - if (!buf_m) { - eagle_ioctl_err("%s: out of memory", __func__); - return -ENOMEM; - } - if (get_from_core) - ret = core_dts_eagle_get(depd.id, depd.size, - buf); - else - ret = msm_dts_eagle_handle_adm(&depd, buf, - for_pre, true); - } else { - s32 cb = _get_cb_for_dev(depd.device); - if (cb < 0) { - eagle_ioctl_err("%s: no cache for device %u found", - __func__, depd.device); - return -EINVAL; - } - offset = _c_bl[cb][CBD_OFFSG] + depd.offset; - /* check for integer overflow */ - if (offset > (UINT_MAX - depd.size)) - err = -EINVAL; - if ((err != 0) || - ((offset + depd.size) > _depc_size)) { - eagle_ioctl_err("%s: invalid size %u and/or offset %u", - __func__, depd.size, offset); - return -EINVAL; - } - buf = (void *)&_depc[offset]; - } - if (ret < 0) - eagle_ioctl_err("%s: error %i getting data", __func__, - ret); - else if (copy_to_user((void *)(((char *)arg)+sizeof(depd)), - buf, depd.size)) { - eagle_ioctl_err("%s: error copying get data", __func__); - ret = -EFAULT; - } - vfree(buf_m); - break; - } - case DTS_EAGLE_IOCTL_SET_PARAM: { - struct dts_eagle_param_desc depd; - s32 just_set_cache = 0, for_pre = 0, err = 0; - u32 offset; - s32 tgt; - eagle_ioctl_info("%s: control 0x%X (set param)", - __func__, cmd); - if (copy_from_user((void *)&depd, (void *)arg, sizeof(depd))) { - eagle_ioctl_err("%s: error copying dts_eagle_param_desc (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &depd, sizeof(depd)); - return -EFAULT; - } - if (depd.device & DTS_EAGLE_FLAG_IOCTL_PRE) { - eagle_ioctl_dbg("%s: using for premix", __func__); - for_pre = 1; - } - if (depd.device & DTS_EAGLE_FLAG_IOCTL_JUSTSETCACHE) { - eagle_ioctl_dbg("%s: 'just set cache' requested", - __func__); - just_set_cache = 1; - } - depd.device &= DTS_EAGLE_FLAG_IOCTL_MASK; - tgt = _get_cb_for_dev(depd.device); - if (tgt < 0) { - eagle_ioctl_err("%s: no cache for device %u found", - __func__, depd.device); - return -EINVAL; - } - offset = _c_bl[tgt][CBD_OFFSG] + depd.offset; - /* check for integer overflow */ - if (offset > (UINT_MAX - depd.size)) - err = -EINVAL; - if ((err != 0) || ((offset + depd.size) > _depc_size)) { - eagle_ioctl_err("%s: invalid size %u and/or offset %u for parameter (target cache block %i with offset %i, global cache is size %u)", - __func__, depd.size, offset, tgt, - _c_bl[tgt][CBD_OFFSG], _depc_size); - return -EINVAL; - } - if (copy_from_user((void *)&_depc[offset], - (void *)(((char *)arg)+sizeof(depd)), - depd.size)) { - eagle_ioctl_err("%s: error copying param to cache (src:%pK, tgt:%pK, size:%u)", - __func__, ((char *)arg)+sizeof(depd), - &_depc[offset], depd.size); - return -EFAULT; - } - eagle_ioctl_dbg("%s: param info: param = 0x%X, size = %u, offset = %i, device = %u, cache block %i, global offset = %u, first bytes as integer = %i", - __func__, depd.id, depd.size, depd.offset, - depd.device, tgt, offset, *(int *)&_depc[offset]); - if (!just_set_cache) { - ret = msm_dts_eagle_handle_adm(&depd, &_depc[offset], - for_pre, false); - } - break; - } - case DTS_EAGLE_IOCTL_SET_CACHE_BLOCK: { - u32 b_[CBD_COUNT+1], *b = &b_[1], cb; - eagle_ioctl_info("%s: with control 0x%X (set param cache block)", - __func__, cmd); - if (copy_from_user((void *)b_, (void *)arg, sizeof(b_))) { - eagle_ioctl_err("%s: error copying cache block data (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, b_, sizeof(b_)); - return -EFAULT; - } - cb = b_[0]; - if (cb >= CB_COUNT) { - eagle_ioctl_err("%s: cache block %u out of range (max %u)", - __func__, cb, CB_COUNT-1); - return -EINVAL; - } - eagle_ioctl_dbg("%s: cache block %i set: devices 0x%X, global offset %i, offsets 1:%u 2:%u 3:%u, cmds/sizes 0:0x%X %u 1:0x%X %u 2:0x%X %u 3:0x%X %u", - __func__, cb, _c_bl[cb][CBD_DEV_MASK], _c_bl[cb][CBD_OFFSG], - _c_bl[cb][CBD_OFFS1], _c_bl[cb][CBD_OFFS2], - _c_bl[cb][CBD_OFFS3], _c_bl[cb][CBD_CMD0], _c_bl[cb][CBD_SZ0], - _c_bl[cb][CBD_CMD1], _c_bl[cb][CBD_SZ1], _c_bl[cb][CBD_CMD2], - _c_bl[cb][CBD_SZ2], _c_bl[cb][CBD_CMD3], _c_bl[cb][CBD_SZ3]); - if ((b[CBD_OFFSG]+b[CBD_OFFS1]+b[CBD_SZ1]) > _depc_size || - (b[CBD_OFFSG]+b[CBD_OFFS2]+b[CBD_SZ2]) > _depc_size || - (b[CBD_OFFSG]+b[CBD_OFFS3]+b[CBD_SZ3]) > _depc_size) { - eagle_ioctl_err("%s: cache block bounds out of range", - __func__); - return -EINVAL; - } - memcpy(_c_bl[cb], b, sizeof(_c_bl[cb])); - break; - } - case DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE: { - u32 data[2]; - eagle_ioctl_dbg("%s: with control 0x%X (set active device)", - __func__, cmd); - if (copy_from_user((void *)data, (void *)arg, sizeof(data))) { - eagle_ioctl_err("%s: error copying active device data (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, data, sizeof(data)); - return -EFAULT; - } - if (data[1] != 0) { - _device_primary = data[0]; - eagle_ioctl_dbg("%s: primary device %i", __func__, - data[0]); - } else { - _device_all = data[0]; - eagle_ioctl_dbg("%s: all devices 0x%X", __func__, - data[0]); - } - break; - } - case DTS_EAGLE_IOCTL_GET_LICENSE: { - u32 target = 0, size = 0; - s32 size_only; - eagle_ioctl_dbg("%s: with control 0x%X (get license)", - __func__, cmd); - if (copy_from_user((void *)&target, (void *)arg, - sizeof(target))) { - eagle_ioctl_err("%s: error reading license index. (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &target, sizeof(target)); - return -EFAULT; - } - size_only = target & (1<<31) ? 1 : 0; - target &= 0x7FFFFFFF; - if (target >= SEC_BLOB_MAX_CNT) { - eagle_ioctl_err("%s: license index %u out of bounds (max index is %i)", - __func__, target, SEC_BLOB_MAX_CNT); - return -EINVAL; - } - if (_sec_blob[target] == NULL) { - eagle_ioctl_err("%s: license index %u never initialized", - __func__, target); - return -EINVAL; - } - size = ((u32 *)_sec_blob[target])[0]; - if ((size == 0) || (size > SEC_BLOB_MAX_SIZE)) { - eagle_ioctl_err("%s: license size %u for index %u invalid (min size is 1, max size is %u)", - __func__, size, target, SEC_BLOB_MAX_SIZE); - return -EINVAL; - } - if (size_only) { - eagle_ioctl_dbg("%s: reporting size of license data only", - __func__); - if (copy_to_user((void *)(((char *)arg)+sizeof(target)), - (void *)&size, sizeof(size))) { - eagle_ioctl_err("%s: error copying license size", - __func__); - return -EFAULT; - } - } else if (copy_to_user((void *)(((char *)arg)+sizeof(target)), - (void *)&(((s32 *)_sec_blob[target])[1]), size)) { - eagle_ioctl_err("%s: error copying license data", - __func__); - return -EFAULT; - } else - eagle_ioctl_info("%s: license file %u bytes long from license index %u returned to user", - __func__, size, target); - break; - } - case DTS_EAGLE_IOCTL_SET_LICENSE: { - u32 target[2] = {0, 0}; - eagle_ioctl_dbg("%s: control 0x%X (set license)", __func__, - cmd); - if (copy_from_user((void *)target, (void *)arg, - sizeof(target))) { - eagle_ioctl_err("%s: error reading license index (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, target, sizeof(target)); - return -EFAULT; - } - if (target[0] >= SEC_BLOB_MAX_CNT) { - eagle_ioctl_err("%s: license index %u out of bounds (max index is %u)", - __func__, target[0], SEC_BLOB_MAX_CNT-1); - return -EINVAL; - } - if (target[1] == 0) { - eagle_ioctl_dbg("%s: request to free license index %u", - __func__, target[0]); - kfree(_sec_blob[target[0]]); - _sec_blob[target[0]] = NULL; - break; - } - if ((target[1] == 0) || (target[1] >= SEC_BLOB_MAX_SIZE)) { - eagle_ioctl_err("%s: license size %u for index %u invalid (min size is 1, max size is %u)", - __func__, target[1], target[0], - SEC_BLOB_MAX_SIZE); - return -EINVAL; - } - if (_sec_blob[target[0]] != NULL) { - if (((u32 *)_sec_blob[target[0]])[1] != target[1]) { - eagle_ioctl_dbg("%s: request new size for already allocated license index %u", - __func__, target[0]); - } - kfree(_sec_blob[target[0]]); - _sec_blob[target[0]] = NULL; - } - eagle_ioctl_dbg("%s: allocating %u bytes for license index %u", - __func__, target[1], target[0]); - _sec_blob[target[0]] = kzalloc(target[1] + 4, GFP_KERNEL); - if (!_sec_blob[target[0]]) { - eagle_ioctl_err("%s: error allocating license index %u (kzalloc failed on %u bytes)", - __func__, target[0], target[1]); - return -ENOMEM; - } - ((u32 *)_sec_blob[target[0]])[0] = target[1]; - if (copy_from_user( - (void *)&(((u32 *)_sec_blob[target[0]])[1]), - (void *)(((char *)arg)+sizeof(target)), - target[1])) { - eagle_ioctl_err("%s: error copying license to index %u, size %u (src:%pK, tgt:%pK, size:%u)", - __func__, target[0], target[1], - ((char *)arg)+sizeof(target), - &(((u32 *)_sec_blob[target[0]])[1]), - target[1]); - return -EFAULT; - } else - eagle_ioctl_info("%s: license file %u bytes long copied to index license index %u", - __func__, target[1], target[0]); - break; - } - case DTS_EAGLE_IOCTL_SEND_LICENSE: { - u32 target = 0; - eagle_ioctl_dbg("%s: control 0x%X (send license)", __func__, - cmd); - if (copy_from_user((void *)&target, (void *)arg, - sizeof(target))) { - eagle_ioctl_err("%s: error reading license index (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &target, sizeof(target)); - return -EFAULT; - } - if (target >= SEC_BLOB_MAX_CNT) { - eagle_ioctl_err("%s: license index %u out of bounds (max index is %i)", - __func__, target, SEC_BLOB_MAX_CNT-1); - return -EINVAL; - } - if (!_sec_blob[target] || - ((u32 *)_sec_blob[target])[0] == 0) { - eagle_ioctl_err("%s: license index %u is invalid", - __func__, target); - return -EINVAL; - } - if (core_dts_eagle_set(((s32 *)_sec_blob[target])[0], - (char *)&((s32 *)_sec_blob[target])[1]) < 0) - eagle_ioctl_err("%s: core_dts_eagle_set failed with id = %u", - __func__, target); - else - eagle_ioctl_info("%s: core_dts_eagle_set succeeded with id = %u", - __func__, target); - break; - } - case DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS: { - s32 spec = 0; - eagle_ioctl_info("%s: control 0x%X (set volume commands)", - __func__, cmd); - if (copy_from_user((void *)&spec, (void *)arg, - sizeof(spec))) { - eagle_ioctl_err("%s: error reading volume command specifier (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &spec, sizeof(spec)); - return -EFAULT; - } - if (spec & 0x80000000) { - u32 idx = (spec & 0x0000F000) >> 12; - s32 size = spec & 0x00000FFF; - eagle_ioctl_dbg("%s: setting volume command %i size: %i", - __func__, idx, size); - if (idx >= _vol_cmd_cnt) { - eagle_ioctl_err("%s: volume command index %u out of bounds (only %u allocated)", - __func__, idx, _vol_cmd_cnt); - return -EINVAL; - } - if (_volume_cmds_alloc2(idx, size) < 0) { - eagle_ioctl_err("%s: error allocating memory for volume controls", - __func__); - return -ENOMEM; - } - if (copy_from_user((void *)&_vol_cmds_d[idx], - (void *)(((char *)arg) + sizeof(int)), - sizeof(struct vol_cmds_d))) { - eagle_ioctl_err("%s: error reading volume command descriptor (src:%pK, tgt:%pK, size:%zu)", - __func__, ((char *)arg) + sizeof(int), - &_vol_cmds_d[idx], - sizeof(struct vol_cmds_d)); - return -EFAULT; - } - eagle_ioctl_dbg("%s: setting volume command %i spec (size %zu): %i %i %i %i", - __func__, idx, sizeof(struct vol_cmds_d), - _vol_cmds_d[idx].d[0], _vol_cmds_d[idx].d[1], - _vol_cmds_d[idx].d[2], _vol_cmds_d[idx].d[3]); - if (copy_from_user((void *)_vol_cmds[idx], - (void *)(((char *)arg) + (sizeof(int) + - sizeof(struct vol_cmds_d))), size)) { - eagle_ioctl_err("%s: error reading volume command string (src:%pK, tgt:%pK, size:%i)", - __func__, ((char *)arg) + (sizeof(int) + - sizeof(struct vol_cmds_d)), - _vol_cmds[idx], size); - return -EFAULT; - } - } else { - eagle_ioctl_dbg("%s: setting volume command size", - __func__); - if (spec < 0 || spec > VOL_CMD_CNT_MAX) { - eagle_ioctl_err("%s: volume command count %i out of bounds (min 0, max %i)", - __func__, spec, VOL_CMD_CNT_MAX); - return -EINVAL; - } else if (spec == 0) { - eagle_ioctl_dbg("%s: request to free volume commands", - __func__); - _volume_cmds_free(); - break; - } - eagle_ioctl_dbg("%s: setting volume command size requested = %i", - __func__, spec); - if (_volume_cmds_alloc1(spec) < 0) { - eagle_ioctl_err("%s: error allocating memory for volume controls", - __func__); - return -ENOMEM; - } - } - break; - } - default: { - eagle_ioctl_err("%s: control 0x%X (invalid control)", - __func__, cmd); - ret = -EINVAL; - } - } - return (int)ret; -} - -/** - * msm_dts_eagle_compat_ioctl() - To handle 32bit to 64bit ioctl compatibility - * @cmd: cmd to handle. - * @arg: argument to the cmd. - * - * Handle DTS Eagle ioctl cmds from 32bit userspace. - * - * Return: Return failure if any. - */ -#ifdef CONFIG_COMPAT -int msm_dts_eagle_compat_ioctl(unsigned int cmd, unsigned long arg) -{ - switch (cmd) { - case DTS_EAGLE_IOCTL_GET_CACHE_SIZE32: - cmd = DTS_EAGLE_IOCTL_GET_CACHE_SIZE; - break; - case DTS_EAGLE_IOCTL_SET_CACHE_SIZE32: - cmd = DTS_EAGLE_IOCTL_SET_CACHE_SIZE; - break; - case DTS_EAGLE_IOCTL_GET_PARAM32: - cmd = DTS_EAGLE_IOCTL_GET_PARAM; - break; - case DTS_EAGLE_IOCTL_SET_PARAM32: - cmd = DTS_EAGLE_IOCTL_SET_PARAM; - break; - case DTS_EAGLE_IOCTL_SET_CACHE_BLOCK32: - cmd = DTS_EAGLE_IOCTL_SET_CACHE_BLOCK; - break; - case DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE32: - cmd = DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE; - break; - case DTS_EAGLE_IOCTL_GET_LICENSE32: - cmd = DTS_EAGLE_IOCTL_GET_LICENSE; - break; - case DTS_EAGLE_IOCTL_SET_LICENSE32: - cmd = DTS_EAGLE_IOCTL_SET_LICENSE; - break; - case DTS_EAGLE_IOCTL_SEND_LICENSE32: - cmd = DTS_EAGLE_IOCTL_SEND_LICENSE; - break; - case DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS32: - cmd = DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS; - break; - default: - break; - } - return msm_dts_eagle_ioctl(cmd, arg); -} -#endif -/** - * msm_dts_eagle_init_pre() - Initialize DTS premix module - * @ac: Initialize premix module in the ASM session. - * - * Initialize DTS premix module on provided ASM session - * - * Return: Return failure if any. - */ -int msm_dts_eagle_init_pre(struct audio_client *ac) -{ - return msm_dts_eagle_enable_asm(ac, _is_hpx_enabled, - AUDPROC_MODULE_ID_DTS_HPX_PREMIX); -} - -/** - * msm_dts_eagle_deinit_pre() - Deinitialize DTS premix module - * @ac: Deinitialize premix module in the ASM session. - * - * Deinitialize DTS premix module on provided ASM session - * - * Return: Currently does nothing so 0. - */ -int msm_dts_eagle_deinit_pre(struct audio_client *ac) -{ - return 0; -} - -/** - * msm_dts_eagle_init_post() - Initialize DTS postmix module - * @port_id: Port id for the ADM session. - * @copp_idx: Copp idx for the ADM session. - * - * Initialize DTS postmix module on ADM session - * - * Return: Return failure if any. - */ -int msm_dts_eagle_init_post(int port_id, int copp_idx) -{ - return msm_dts_eagle_enable_adm(port_id, copp_idx, _is_hpx_enabled); -} - -/** - * msm_dts_eagle_deinit_post() - Deinitialize DTS postmix module - * @port_id: Port id for the ADM session. - * @topology: Topology in use. - * - * Deinitialize DTS postmix module on ADM session - * - * Return: Currently does nothing so 0. - */ -int msm_dts_eagle_deinit_post(int port_id, int topology) -{ - return 0; -} - -/** - * msm_dts_eagle_init_master_module() - Initialize both DTS modules - * @ac: Initialize modules in the ASM session. - * - * Initialize DTS modules on ASM session - * - * Return: Success. - */ -int msm_dts_eagle_init_master_module(struct audio_client *ac) -{ - _set_audioclient(ac); - msm_dts_eagle_enable_asm(ac, _is_hpx_enabled, - AUDPROC_MODULE_ID_DTS_HPX_PREMIX); - msm_dts_eagle_enable_asm(ac, _is_hpx_enabled, - AUDPROC_MODULE_ID_DTS_HPX_POSTMIX); - return 0; -} - -/** - * msm_dts_eagle_deinit_master_module() - Deinitialize both DTS modules - * @ac: Deinitialize modules in the ASM session. - * - * Deinitialize DTS modules on ASM session - * - * Return: Success. - */ -int msm_dts_eagle_deinit_master_module(struct audio_client *ac) -{ - msm_dts_eagle_deinit_pre(ac); - msm_dts_eagle_deinit_post(-1, 0); - _clear_audioclient(); - return 0; -} - -/** - * msm_dts_eagle_is_hpx_on() - Check if HPX effects are On - * - * Check if HPX effects are On - * - * Return: On/Off. - */ -int msm_dts_eagle_is_hpx_on(void) -{ - return _is_hpx_enabled; -} - -/** - * msm_dts_eagle_pcm_new() - Create hwdep node - * @runtime: snd_soc_pcm_runtime structure. - * - * Create hwdep node - * - * Return: Success. - */ -int msm_dts_eagle_pcm_new(struct snd_soc_pcm_runtime *runtime) -{ - if (!_ref_cnt++) { - _init_cb_descs(); - _reg_ion_mem(); - } - return 0; -} - -/** - * msm_dts_eagle_pcm_free() - remove hwdep node - * @runtime: snd_soc_pcm_runtime structure. - * - * Remove hwdep node - * - * Return: void. - */ -void msm_dts_eagle_pcm_free(struct snd_pcm *pcm) -{ - if (!--_ref_cnt) - _unreg_ion_mem(); - vfree(_depc); -} - -MODULE_DESCRIPTION("DTS EAGLE platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/msm/qdsp6v2/msm-dts-srs-tm-config.c b/sound/soc/msm/qdsp6v2/msm-dts-srs-tm-config.c index 7c35d19bb6103..8fc49b29000cc 100644 --- a/sound/soc/msm/qdsp6v2/msm-dts-srs-tm-config.c +++ b/sound/soc/msm/qdsp6v2/msm-dts-srs-tm-config.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2012-2014, 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2014, 2016-2017, The Linux Foundation. All + * rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -19,7 +20,6 @@ #include #include #include -#include #include "msm-dts-srs-tm-config.h" #include "msm-pcm-routing-v2.h" diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-devdep.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-devdep.c index e57db7d9c4945..da177c99763b6 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-devdep.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-devdep.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014, 2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,8 +14,6 @@ #include #include #include -#include - #include "msm-pcm-routing-devdep.h" #include "msm-ds2-dap-config.h" @@ -53,23 +51,6 @@ static int msm_pcm_routing_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER: ret = msm_ds2_dap_ioctl(hw, file, cmd, argp); break; - case DTS_EAGLE_IOCTL_GET_CACHE_SIZE: - case DTS_EAGLE_IOCTL_SET_CACHE_SIZE: - case DTS_EAGLE_IOCTL_GET_PARAM: - case DTS_EAGLE_IOCTL_SET_PARAM: - case DTS_EAGLE_IOCTL_SET_CACHE_BLOCK: - case DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE: - case DTS_EAGLE_IOCTL_GET_LICENSE: - case DTS_EAGLE_IOCTL_SET_LICENSE: - case DTS_EAGLE_IOCTL_SEND_LICENSE: - case DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS: - ret = msm_dts_eagle_ioctl(cmd, arg); - if (ret == -EPERM) { - pr_err("%s called with invalid control 0x%X\n", - __func__, cmd); - ret = -EINVAL; - } - break; default: pr_err("%s called with invalid control 0x%X\n", __func__, cmd); ret = -EINVAL; @@ -81,7 +62,6 @@ static int msm_pcm_routing_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, void msm_pcm_routing_hwdep_free(struct snd_pcm *pcm) { pr_debug("%s\n", __func__); - msm_dts_eagle_pcm_free(pcm); } #ifdef CONFIG_COMPAT @@ -105,23 +85,6 @@ static int msm_pcm_routing_hwdep_compat_ioctl(struct snd_hwdep *hw, case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER32: ret = msm_ds2_dap_compat_ioctl(hw, file, cmd, argp); break; - case DTS_EAGLE_IOCTL_GET_CACHE_SIZE32: - case DTS_EAGLE_IOCTL_SET_CACHE_SIZE32: - case DTS_EAGLE_IOCTL_GET_PARAM32: - case DTS_EAGLE_IOCTL_SET_PARAM32: - case DTS_EAGLE_IOCTL_SET_CACHE_BLOCK32: - case DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE32: - case DTS_EAGLE_IOCTL_GET_LICENSE32: - case DTS_EAGLE_IOCTL_SET_LICENSE32: - case DTS_EAGLE_IOCTL_SEND_LICENSE32: - case DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS32: - ret = msm_dts_eagle_compat_ioctl(cmd, arg); - if (ret == -EPERM) { - pr_err("%s called with invalid control 0x%X\n", - __func__, cmd); - ret = -EINVAL; - } - break; default: pr_err("%s called with invalid control 0x%X\n", __func__, cmd); ret = -EINVAL; @@ -167,6 +130,6 @@ int msm_pcm_routing_hwdep_new(struct snd_soc_pcm_runtime *runtime, #ifdef CONFIG_COMPAT hwdep->ops.ioctl_compat = msm_pcm_routing_hwdep_compat_ioctl; #endif - return msm_dts_eagle_pcm_new(runtime); + return rc; } #endif diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c index 058340fd42ff0..b6684bcc61ac4 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include @@ -170,10 +169,6 @@ static void msm_pcm_routing_cfg_pp(int port_id, int copp_idx, int topology, __func__, topology, port_id, rc); } break; - case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX: - pr_debug("%s: DTS_EAGLE_COPP_TOPOLOGY_ID\n", __func__); - msm_dts_eagle_init_post(port_id, copp_idx); - break; case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE: pr_debug("%s: TOPOLOGY_ID_AUDIOSPHERE\n", __func__); msm_qti_pp_asphere_init(port_id, copp_idx); @@ -205,10 +200,6 @@ static void msm_pcm_routing_deinit_pp(int port_id, int topology) msm_dolby_dap_deinit(port_id); } break; - case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX: - pr_debug("%s: DTS_EAGLE_COPP_TOPOLOGY_ID\n", __func__); - msm_dts_eagle_deinit_post(port_id, topology); - break; case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE: pr_debug("%s: TOPOLOGY_ID_AUDIOSPHERE\n", __func__); msm_qti_pp_asphere_deinit(port_id); @@ -9519,8 +9510,6 @@ static int msm_routing_probe(struct snd_soc_platform *platform) device_pp_params_mixer_controls, ARRAY_SIZE(device_pp_params_mixer_controls)); - msm_dts_eagle_add_controls(platform); - snd_soc_add_platform_controls(platform, msm_source_tracking_controls, ARRAY_SIZE(msm_source_tracking_controls)); return 0; diff --git a/sound/soc/msm/qdsp6v2/q6adm.c b/sound/soc/msm/qdsp6v2/q6adm.c index 34d509304ae49..6ba2c7e9ffec4 100644 --- a/sound/soc/msm/qdsp6v2/q6adm.c +++ b/sound/soc/msm/qdsp6v2/q6adm.c @@ -23,7 +23,6 @@ #include #include #include -#include #include "msm-dts-srs-tm-config.h" #include @@ -251,222 +250,6 @@ static int adm_get_next_available_copp(int port_idx) return idx; } -int adm_dts_eagle_set(int port_id, int copp_idx, int param_id, - void *data, uint32_t size) -{ - struct adm_cmd_set_pp_params_v5 admp; - int p_idx, ret = 0, *ob_params; - - pr_debug("DTS_EAGLE_ADM: %s - port id %i, copp idx %i, param id 0x%X size %u\n", - __func__, port_id, copp_idx, param_id, size); - - port_id = afe_convert_virtual_to_portid(port_id); - p_idx = adm_validate_and_get_port_index(port_id); - pr_debug("DTS_EAGLE_ADM: %s - after lookup, port id %i, port idx %i\n", - __func__, port_id, p_idx); - - if (p_idx < 0) { - pr_err("DTS_EAGLE_ADM: %s: invalid port index 0x%x, port id 0x%x\n", - __func__, p_idx, port_id); - return -EINVAL; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("DTS_EAGLE_ADM: %s: Invalid copp_idx: %d\n", __func__, - copp_idx); - return -EINVAL; - } - - ob_params = (int *)this_adm.outband_memmap.kvaddr; - if (ob_params == NULL) { - pr_err("DTS_EAGLE_ADM: %s - NULL memmap. Non Eagle topology selected?\n", - __func__); - ret = -EINVAL; - goto fail_cmd; - } - /* check for integer overflow */ - if (size > (UINT_MAX - APR_CMD_OB_HDR_SZ)) - ret = -EINVAL; - if ((ret < 0) || - (size + APR_CMD_OB_HDR_SZ > this_adm.outband_memmap.size)) { - pr_err("DTS_EAGLE_ADM - %s: ion alloc of size %zu too small for size requested %u\n", - __func__, this_adm.outband_memmap.size, - size + APR_CMD_OB_HDR_SZ); - ret = -EINVAL; - goto fail_cmd; - } - *ob_params++ = AUDPROC_MODULE_ID_DTS_HPX_POSTMIX; - *ob_params++ = param_id; - *ob_params++ = size; - memcpy(ob_params, data, size); - - admp.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - admp.hdr.pkt_size = sizeof(admp); - admp.hdr.src_svc = APR_SVC_ADM; - admp.hdr.src_domain = APR_DOMAIN_APPS; - admp.hdr.src_port = port_id; - admp.hdr.dest_svc = APR_SVC_ADM; - admp.hdr.dest_domain = APR_DOMAIN_ADSP; - admp.hdr.dest_port = atomic_read(&this_adm.copp.id[p_idx][copp_idx]); - admp.hdr.token = p_idx << 16 | copp_idx; - admp.hdr.opcode = ADM_CMD_SET_PP_PARAMS_V5; - admp.payload_addr_lsw = lower_32_bits(this_adm.outband_memmap.paddr); - admp.payload_addr_msw = msm_audio_populate_upper_32_bits( - this_adm.outband_memmap.paddr); - admp.mem_map_handle = atomic_read(&this_adm.mem_map_handles[ - ADM_DTS_EAGLE]); - admp.payload_size = size + sizeof(struct adm_param_data_v5); - - pr_debug("DTS_EAGLE_ADM: %s - Command was sent now check Q6 - port id = %d, size %d, module id %x, param id %x.\n", - __func__, admp.hdr.dest_port, - admp.payload_size, AUDPROC_MODULE_ID_DTS_HPX_POSTMIX, - param_id); - atomic_set(&this_adm.copp.stat[p_idx][copp_idx], -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *)&admp); - if (ret < 0) { - pr_err("DTS_EAGLE_ADM: %s - ADM enable for port %d failed\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } - ret = wait_event_timeout(this_adm.copp.wait[p_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("DTS_EAGLE_ADM: %s - set params timed out port = %d\n", - __func__, port_id); - ret = -EINVAL; - } else if (atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx])); - } else { - ret = 0; - } - -fail_cmd: - return ret; -} - -int adm_dts_eagle_get(int port_id, int copp_idx, int param_id, - void *data, uint32_t size) -{ - struct adm_cmd_get_pp_params_v5 admp; - int p_idx, ret = 0, *ob_params; - uint32_t orig_size = size; - pr_debug("DTS_EAGLE_ADM: %s - port id %i, copp idx %i, param id 0x%X\n", - __func__, port_id, copp_idx, param_id); - - port_id = afe_convert_virtual_to_portid(port_id); - p_idx = adm_validate_and_get_port_index(port_id); - if (p_idx < 0) { - pr_err("DTS_EAGLE_ADM: %s - invalid port index %i, port id %i, copp idx %i\n", - __func__, p_idx, port_id, copp_idx); - return -EINVAL; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("DTS_EAGLE_ADM: %s: Invalid copp_idx: %d\n", __func__, - copp_idx); - return -EINVAL; - } - - if ((size == 0) || !data) { - pr_err("DTS_EAGLE_ADM: %s - invalid size %u or pointer %pK.\n", - __func__, size, data); - return -EINVAL; - } - - size = (size+3) & 0xFFFFFFFC; - - ob_params = (int *)(this_adm.outband_memmap.kvaddr); - if (ob_params == NULL) { - pr_err("DTS_EAGLE_ADM: %s - NULL memmap. Non Eagle topology selected?", - __func__); - ret = -EINVAL; - goto fail_cmd; - } - /* check for integer overflow */ - if (size > (UINT_MAX - APR_CMD_OB_HDR_SZ)) - ret = -EINVAL; - if ((ret < 0) || - (size + APR_CMD_OB_HDR_SZ > this_adm.outband_memmap.size)) { - pr_err("DTS_EAGLE_ADM - %s: ion alloc of size %zu too small for size requested %u\n", - __func__, this_adm.outband_memmap.size, - size + APR_CMD_OB_HDR_SZ); - ret = -EINVAL; - goto fail_cmd; - } - *ob_params++ = AUDPROC_MODULE_ID_DTS_HPX_POSTMIX; - *ob_params++ = param_id; - *ob_params++ = size; - - admp.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - admp.hdr.pkt_size = sizeof(admp); - admp.hdr.src_svc = APR_SVC_ADM; - admp.hdr.src_domain = APR_DOMAIN_APPS; - admp.hdr.src_port = port_id; - admp.hdr.dest_svc = APR_SVC_ADM; - admp.hdr.dest_domain = APR_DOMAIN_ADSP; - admp.hdr.dest_port = atomic_read(&this_adm.copp.id[p_idx][copp_idx]); - admp.hdr.token = p_idx << 16 | copp_idx; - admp.hdr.opcode = ADM_CMD_GET_PP_PARAMS_V5; - admp.data_payload_addr_lsw = - lower_32_bits(this_adm.outband_memmap.paddr); - admp.data_payload_addr_msw = - msm_audio_populate_upper_32_bits( - this_adm.outband_memmap.paddr); - admp.mem_map_handle = atomic_read(&this_adm.mem_map_handles[ - ADM_DTS_EAGLE]); - admp.module_id = AUDPROC_MODULE_ID_DTS_HPX_POSTMIX; - admp.param_id = param_id; - admp.param_max_size = size + sizeof(struct adm_param_data_v5); - admp.reserved = 0; - - atomic_set(&this_adm.copp.stat[p_idx][copp_idx], -1); - - ret = apr_send_pkt(this_adm.apr, (uint32_t *)&admp); - if (ret < 0) { - pr_err("DTS_EAGLE_ADM: %s - Failed to get EAGLE Params on port %d\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } - ret = wait_event_timeout(this_adm.copp.wait[p_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("DTS_EAGLE_ADM: %s - EAGLE get params timed out port = %d\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } else if (atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx])); - goto fail_cmd; - } - - memcpy(data, ob_params, orig_size); - ret = 0; -fail_cmd: - return ret; -} - int srs_trumedia_open(int port_id, int copp_idx, __s32 srs_tech_id, void *srs_params) { @@ -2322,13 +2105,6 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, __func__, port_id, path, rate, channel_mode, perf_mode, topology); - /* For DTS EAGLE only, force 24 bit */ - if ((topology == ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX) && - (perf_mode == LEGACY_PCM_MODE)) { - bit_width = 24; - pr_debug("%s: Force open adm in 24-bit for DTS HPX topology 0x%x\n", - __func__, topology); - } port_id = q6audio_convert_virtual_to_portid(port_id); port_idx = adm_validate_and_get_port_index(port_id); if (port_idx < 0) { @@ -2350,8 +2126,7 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, flags = ADM_ULL_POST_PROCESSING_DEVICE_SESSION; if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID) || (topology == DS2_ADM_COPP_TOPOLOGY_ID) || - (topology == SRS_TRUMEDIA_TOPOLOGY_ID) || - (topology == ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX)) + (topology == SRS_TRUMEDIA_TOPOLOGY_ID)) topology = DEFAULT_COPP_TOPOLOGY; } else if (perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) { flags = ADM_ULTRA_LOW_LATENCY_DEVICE_SESSION; @@ -2362,8 +2137,7 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, flags = ADM_LOW_LATENCY_DEVICE_SESSION; if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID) || (topology == DS2_ADM_COPP_TOPOLOGY_ID) || - (topology == SRS_TRUMEDIA_TOPOLOGY_ID) || - (topology == ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX)) + (topology == SRS_TRUMEDIA_TOPOLOGY_ID)) topology = DEFAULT_COPP_TOPOLOGY; } else { if (path == ADM_PATH_COMPRESSED_RX) @@ -2433,20 +2207,6 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, (uint32_t)this_adm.outband_memmap.size); } } - if ((topology == ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX) && - (perf_mode == LEGACY_PCM_MODE)) { - int res = 0; - atomic_set(&this_adm.mem_map_index, ADM_DTS_EAGLE); - msm_dts_ion_memmap(&this_adm.outband_memmap); - res = adm_memory_map_regions( - &this_adm.outband_memmap.paddr, - 0, - (uint32_t *)&this_adm.outband_memmap.size, - 1); - if (res < 0) - pr_err("%s: DTS_EAGLE mmap did not work!", - __func__); - } open.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); @@ -2774,10 +2534,6 @@ int adm_matrix_map(int path, struct route_payload payload_map, int perf_mode) for (i = 0; i < payload_map.num_copps; i++) { port_idx = afe_get_port_index(payload_map.port_id[i]); copp_idx = payload_map.copp_idx[i]; - if (atomic_read( - &this_adm.copp.topology[port_idx][copp_idx]) == - ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX) - continue; rtac_add_adm_device(payload_map.port_id[i], atomic_read(&this_adm.copp.id [port_idx][copp_idx]), @@ -2891,21 +2647,6 @@ int adm_close(int port_id, int perf_mode, int copp_idx) } } - if ((perf_mode == LEGACY_PCM_MODE) && - (this_adm.outband_memmap.paddr != 0) && - (atomic_read( - &this_adm.copp.topology[port_idx][copp_idx]) == - ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX)) { - atomic_set(&this_adm.mem_map_index, ADM_DTS_EAGLE); - ret = adm_memory_unmap_regions(); - if (ret < 0) { - pr_err("%s: adm mem unmmap err %d", - __func__, ret); - } else { - atomic_set(&this_adm.mem_map_handles - [ADM_DTS_EAGLE], 0); - } - } if ((afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_TX) && this_adm.sourceTrackingData.memmap.paddr) { @@ -3377,10 +3118,6 @@ static int adm_init_cal_data(void) {NULL, NULL, NULL, NULL, NULL, NULL} }, {NULL, NULL, cal_utils_match_buf_num} }, - {{DTS_EAGLE_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - {{SRS_TRUMEDIA_CAL_TYPE, {NULL, NULL, NULL, NULL, NULL, NULL} }, {NULL, NULL, cal_utils_match_buf_num} }, diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index cf9092d6e50d5..07f0c473be9d5 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -38,8 +38,8 @@ #include #include #include -#include #include +#include #define TRUE 0x01 #define FALSE 0x00 @@ -2243,9 +2243,6 @@ static int __q6asm_open_read(struct audio_client *ac, open.src_endpointype = ASM_END_POINT_DEVICE_MATRIX; open.preprocopo_id = q6asm_get_asm_topology_cal(); - if ((open.preprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX) || - (open.preprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS)) - open.preprocopo_id = ASM_STREAM_POSTPROCOPO_ID_NONE; open.bits_per_sample = bits_per_sample; open.mode_flags = 0x0; @@ -2497,16 +2494,9 @@ static int __q6asm_open_write(struct audio_client *ac, uint32_t format, open.bits_per_sample = bits_per_sample; open.postprocopo_id = q6asm_get_asm_topology_cal(); - if ((ac->perf_mode != LEGACY_PCM_MODE) && - ((open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX) || - (open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS))) + if (ac->perf_mode != LEGACY_PCM_MODE) open.postprocopo_id = ASM_STREAM_POSTPROCOPO_ID_NONE; - /* For DTS EAGLE only, force 24 bit */ - if ((open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX) || - (open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS)) - open.bits_per_sample = 24; - pr_debug("%s: perf_mode %d asm_topology 0x%x bps %d\n", __func__, ac->perf_mode, open.postprocopo_id, open.bits_per_sample); @@ -2690,10 +2680,6 @@ static int __q6asm_open_read_write(struct audio_client *ac, uint32_t rd_format, ac->topology = open.postprocopo_id; ac->app_type = q6asm_get_asm_app_type_cal(); - /* For DTS EAGLE only, force 24 bit */ - if ((open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX) || - (open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER)) - open.bits_per_sample = 24; switch (wr_format) { case FORMAT_LINEAR_PCM: @@ -5845,233 +5831,6 @@ int q6asm_set_mute(struct audio_client *ac, int muteflag) return rc; } -int q6asm_dts_eagle_set(struct audio_client *ac, int param_id, uint32_t size, - void *data, struct param_outband *po, int m_id) -{ - int rc = 0, *ob_params = NULL; - uint32_t sz = sizeof(struct asm_dts_eagle_param) + (po ? 0 : size); - struct asm_dts_eagle_param *ad; - - if (!ac || ac->apr == NULL || (size == 0) || !data) { - pr_err("DTS_EAGLE_ASM - %s: APR handle NULL, invalid size %u or pointer %pK.\n", - __func__, size, data); - return -EINVAL; - } - - ad = kzalloc(sz, GFP_KERNEL); - if (!ad) { - pr_err("DTS_EAGLE_ASM - %s: error allocating mem of size %u\n", - __func__, sz); - return -ENOMEM; - } - pr_debug("DTS_EAGLE_ASM - %s: ac %pK param_id 0x%x size %u data %pK m_id 0x%x\n", - __func__, ac, param_id, size, data, m_id); - q6asm_add_hdr_async(ac, &ad->hdr, sz, 1); - ad->hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; - ad->param.data_payload_addr_lsw = 0; - ad->param.data_payload_addr_msw = 0; - - ad->param.mem_map_handle = 0; - ad->param.data_payload_size = size + - sizeof(struct asm_stream_param_data_v2); - ad->data.module_id = m_id; - ad->data.param_id = param_id; - ad->data.param_size = size; - ad->data.reserved = 0; - atomic_set(&ac->cmd_state_pp, -1); - - if (po) { - struct list_head *ptr, *next; - struct asm_buffer_node *node; - pr_debug("DTS_EAGLE_ASM - %s: using out of band memory (virtual %pK, physical %pK)\n", - __func__, po->kvaddr, &po->paddr); - ad->param.data_payload_addr_lsw = lower_32_bits(po->paddr); - ad->param.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(po->paddr); - list_for_each_safe(ptr, next, &ac->port[IN].mem_map_handle) { - node = list_entry(ptr, struct asm_buffer_node, list); - if (node->buf_phys_addr == po->paddr) { - ad->param.mem_map_handle = node->mmap_hdl; - break; - } - } - if (ad->param.mem_map_handle == 0) { - pr_err("DTS_EAGLE_ASM - %s: mem map handle not found\n", - __func__); - rc = -EINVAL; - goto fail_cmd; - } - /* check for integer overflow */ - if (size > (UINT_MAX - APR_CMD_OB_HDR_SZ)) - rc = -EINVAL; - if ((rc < 0) || (size + APR_CMD_OB_HDR_SZ > po->size)) { - pr_err("DTS_EAGLE_ASM - %s: ion alloc of size %zu too small for size requested %u\n", - __func__, po->size, size + APR_CMD_OB_HDR_SZ); - rc = -EINVAL; - goto fail_cmd; - } - ob_params = (int *)po->kvaddr; - *ob_params++ = m_id; - *ob_params++ = param_id; - *ob_params++ = size; - memcpy(ob_params, data, size); - } else { - pr_debug("DTS_EAGLE_ASM - %s: using in band\n", __func__); - memcpy(((char *)ad) + sizeof(struct asm_dts_eagle_param), - data, size); - } - rc = apr_send_pkt(ac->apr, (uint32_t *)ad); - if (rc < 0) { - pr_err("DTS_EAGLE_ASM - %s: set-params send failed paramid[0x%x]\n", - __func__, ad->data.param_id); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state_pp) >= 0), 1*HZ); - if (!rc) { - pr_err("DTS_EAGLE_ASM - %s: timeout, set-params paramid[0x%x]\n", - __func__, ad->data.param_id); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state_pp) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state_pp))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state_pp)); - goto fail_cmd; - } - rc = 0; -fail_cmd: - kfree(ad); - return rc; -} - -int q6asm_dts_eagle_get(struct audio_client *ac, int param_id, uint32_t size, - void *data, struct param_outband *po, int m_id) -{ - struct asm_dts_eagle_param_get *ad; - int rc = 0, *ob_params = NULL; - uint32_t sz = sizeof(struct asm_dts_eagle_param) + APR_CMD_GET_HDR_SZ + - (po ? 0 : size); - - if (!ac || ac->apr == NULL || (size == 0) || !data) { - pr_err("DTS_EAGLE_ASM - %s: APR handle NULL, invalid size %u or pointer %pK\n", - __func__, size, data); - return -EINVAL; - } - ad = kzalloc(sz, GFP_KERNEL); - if (!ad) { - pr_err("DTS_EAGLE_ASM - %s: error allocating memory of size %u\n", - __func__, sz); - return -ENOMEM; - } - pr_debug("DTS_EAGLE_ASM - %s: ac %pK param_id 0x%x size %u data %pK m_id 0x%x\n", - __func__, ac, param_id, size, data, m_id); - q6asm_add_hdr(ac, &ad->hdr, sz, TRUE); - ad->hdr.opcode = ASM_STREAM_CMD_GET_PP_PARAMS_V2; - ad->param.data_payload_addr_lsw = 0; - ad->param.data_payload_addr_msw = 0; - ad->param.mem_map_handle = 0; - ad->param.module_id = m_id; - ad->param.param_id = param_id; - ad->param.param_max_size = size + APR_CMD_GET_HDR_SZ; - ad->param.reserved = 0; - atomic_set(&ac->cmd_state, -1); - - generic_get_data = kzalloc(size + sizeof(struct generic_get_data_), - GFP_KERNEL); - if (!generic_get_data) { - pr_err("DTS_EAGLE_ASM - %s: error allocating mem of size %u\n", - __func__, size); - rc = -ENOMEM; - goto fail_cmd; - } - - if (po) { - struct list_head *ptr, *next; - struct asm_buffer_node *node; - pr_debug("DTS_EAGLE_ASM - %s: using out of band memory (virtual %pK, physical %pK)\n", - __func__, po->kvaddr, &po->paddr); - ad->param.data_payload_addr_lsw = lower_32_bits(po->paddr); - ad->param.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(po->paddr); - list_for_each_safe(ptr, next, &ac->port[IN].mem_map_handle) { - node = list_entry(ptr, struct asm_buffer_node, list); - if (node->buf_phys_addr == po->paddr) { - ad->param.mem_map_handle = node->mmap_hdl; - break; - } - } - if (ad->param.mem_map_handle == 0) { - pr_err("DTS_EAGLE_ASM - %s: mem map handle not found\n", - __func__); - rc = -EINVAL; - goto fail_cmd; - } - /* check for integer overflow */ - if (size > (UINT_MAX - APR_CMD_OB_HDR_SZ)) - rc = -EINVAL; - if ((rc < 0) || (size + APR_CMD_OB_HDR_SZ > po->size)) { - pr_err("DTS_EAGLE_ASM - %s: ion alloc of size %zu too small for size requested %u\n", - __func__, po->size, size + APR_CMD_OB_HDR_SZ); - rc = -EINVAL; - goto fail_cmd; - } - ob_params = (int *)po->kvaddr; - *ob_params++ = m_id; - *ob_params++ = param_id; - *ob_params++ = size; - generic_get_data->is_inband = 0; - } else { - pr_debug("DTS_EAGLE_ASM - %s: using in band\n", __func__); - generic_get_data->is_inband = 1; - } - - rc = apr_send_pkt(ac->apr, (uint32_t *)ad); - if (rc < 0) { - pr_err("DTS_EAGLE_ASM - %s: Commmand 0x%x failed\n", __func__, - ad->hdr.opcode); - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 1*HZ); - if (!rc) { - pr_err("DTS_EAGLE_ASM - %s: timeout in get\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - if (generic_get_data->valid) { - rc = 0; - memcpy(data, po ? ob_params : generic_get_data->ints, size); - } else { - rc = -EINVAL; - pr_err("DTS_EAGLE_ASM - %s: EAGLE get params problem getting data - check callback error value\n", - __func__); - } -fail_cmd: - kfree(ad); - kfree(generic_get_data); - generic_get_data = NULL; - return rc; -} - static int __q6asm_set_volume(struct audio_client *ac, int volume, int instance) { struct asm_volume_ctrl_master_gain vol; diff --git a/sound/soc/msm/qdsp6v2/q6core.c b/sound/soc/msm/qdsp6v2/q6core.c index cc26af528abaf..d4e4819340345 100644 --- a/sound/soc/msm/qdsp6v2/q6core.c +++ b/sound/soc/msm/qdsp6v2/q6core.c @@ -169,7 +169,7 @@ static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv) generic_get_data->valid = 1; generic_get_data->size_in_ints = data->payload_size/sizeof(int); - pr_debug("DTS_EAGLE_CORE callback size = %i\n", + pr_debug("callback size = %i\n", data->payload_size); memcpy(generic_get_data->ints, data->payload, data->payload_size); @@ -344,115 +344,6 @@ int32_t core_get_license_status(uint32_t module_id) return ret; } -int core_dts_eagle_set(int size, char *data) -{ - struct adsp_dts_eagle *payload = NULL; - int rc = 0, size_aligned4byte; - - pr_debug("DTS_EAGLE_CORE - %s\n", __func__); - if (size <= 0 || !data) { - pr_err("DTS_EAGLE_CORE - %s: invalid size %i or pointer %pK.\n", - __func__, size, data); - return -EINVAL; - } - - size_aligned4byte = (size+3) & 0xFFFFFFFC; - ocm_core_open(); - if (q6core_lcl.core_handle_q) { - payload = kzalloc(sizeof(struct adsp_dts_eagle) + - size_aligned4byte, GFP_KERNEL); - if (!payload) { - pr_err("DTS_EAGLE_CORE - %s: out of memory (aligned size %i).\n", - __func__, size_aligned4byte); - return -ENOMEM; - } - payload->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - payload->hdr.pkt_size = sizeof(struct adsp_dts_eagle) + - size_aligned4byte; - payload->hdr.src_port = 0; - payload->hdr.dest_port = 0; - payload->hdr.token = 0; - payload->hdr.opcode = ADSP_CMD_SET_DTS_EAGLE_DATA_ID; - payload->id = DTS_EAGLE_LICENSE_ID; - payload->overwrite = 1; - payload->size = size; - memcpy(payload->data, data, size); - rc = apr_send_pkt(q6core_lcl.core_handle_q, - (uint32_t *)payload); - if (rc < 0) { - pr_err("DTS_EAGLE_CORE - %s: failed op[0x%x]rc[%d]\n", - __func__, payload->hdr.opcode, rc); - } - kfree(payload); - } - return rc; -} - -int core_dts_eagle_get(int id, int size, char *data) -{ - struct apr_hdr ah; - int rc = 0; - - pr_debug("DTS_EAGLE_CORE - %s\n", __func__); - if (size <= 0 || !data) { - pr_err("DTS_EAGLE_CORE - %s: invalid size %i or pointer %pK.\n", - __func__, size, data); - return -EINVAL; - } - ocm_core_open(); - if (q6core_lcl.core_handle_q) { - ah.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - ah.pkt_size = sizeof(struct apr_hdr); - ah.src_port = 0; - ah.dest_port = 0; - ah.token = 0; - ah.opcode = id; - - q6core_lcl.bus_bw_resp_received = 0; - generic_get_data = kzalloc(sizeof(struct generic_get_data_) - + size, GFP_KERNEL); - if (!generic_get_data) { - pr_err("DTS_EAGLE_CORE - %s: error allocating memory of size %i\n", - __func__, size); - return -ENOMEM; - } - - rc = apr_send_pkt(q6core_lcl.core_handle_q, - (uint32_t *)&ah); - if (rc < 0) { - pr_err("DTS_EAGLE_CORE - %s: failed op[0x%x]rc[%d]\n", - __func__, ah.opcode, rc); - goto fail_cmd_2; - } - - rc = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("DTS_EAGLE_CORE - %s: EAGLE get params timed out\n", - __func__); - rc = -EINVAL; - goto fail_cmd_2; - } - if (generic_get_data->valid) { - rc = 0; - memcpy(data, generic_get_data->ints, size); - } else { - rc = -EINVAL; - pr_err("DTS_EAGLE_CORE - %s: EAGLE get params problem getting data - check callback error value\n", - __func__); - } - } - -fail_cmd_2: - kfree(generic_get_data); - generic_get_data = NULL; - return rc; -} - uint32_t core_set_dolby_manufacturer_id(int manufacturer_id) { struct adsp_dolby_manufacturer_id payload; From 21b5dbd7fd44f7faedc4e7776c5b6ace6cc8fd48 Mon Sep 17 00:00:00 2001 From: Senthil Kumar Rajagopal Date: Mon, 10 Apr 2017 17:00:42 +0530 Subject: [PATCH 0731/1015] msm: camera: isp: Handle array out of bound access. The pointer req_frm is coming from userspace, It may overflow stream_info. Adding a bound check to prevent the same. CRs-fixed: 2008683 Change-Id: I098df899324a8d5561a5754330b89e532ba8d5d8 Signed-off-by: Senthil Kumar Rajagopal --- drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index f0ce8958a6a4a..4159808db8fe6 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -3700,6 +3700,11 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) case UPDATE_STREAM_REQUEST_FRAMES_VER2: { struct msm_vfe_axi_stream_cfg_update_info_req_frm *req_frm = &update_cmd->req_frm_ver2; + if (HANDLE_TO_IDX(req_frm->stream_handle) >= VFE_AXI_SRC_MAX) { + pr_err("%s: Invalid stream handle\n", __func__); + rc = -EINVAL; + break; + } stream_info = &axi_data->stream_info[HANDLE_TO_IDX( req_frm->stream_handle)]; rc = msm_isp_request_frame(vfe_dev, stream_info, From 8b5e1d0989ea6e6d73f85fb6b1c56ca738c9c79f Mon Sep 17 00:00:00 2001 From: Harsh Sahu Date: Fri, 27 Jan 2017 17:49:40 -0800 Subject: [PATCH 0732/1015] msm: mdss: avoid overflow in mdp clock rate calculation for rotator The width and height in calculation of the clk_rate comes from user. This change checks these values against its maximum value allowed. In case of overflow it returns immediately with invalid argument. Change-Id: Idbf7cf0c425769ab7b672b781aa791bbfd77916d Signed-off-by: Harsh Sahu --- drivers/video/msm/mdss/mdss_rotator.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_rotator.c b/drivers/video/msm/mdss/mdss_rotator.c index 055c5d22b2d2d..eddfa4977070e 100644 --- a/drivers/video/msm/mdss/mdss_rotator.c +++ b/drivers/video/msm/mdss/mdss_rotator.c @@ -1034,8 +1034,16 @@ static int mdss_rotator_calc_perf(struct mdss_rot_perf *perf) pr_err("invalid output format\n"); return -EINVAL; } + if (!config->input.width || + (0xffffffff/config->input.width < config->input.height)) + return -EINVAL; perf->clk_rate = config->input.width * config->input.height; + + if (!perf->clk_rate || + (0xffffffff/perf->clk_rate < config->frame_rate)) + return -EINVAL; + perf->clk_rate *= config->frame_rate; /* rotator processes 4 pixels per clock */ perf->clk_rate /= 4; From 596c08c3f496875a7f6cf5ce8e34d7cad2e466bb Mon Sep 17 00:00:00 2001 From: Harsh Sahu Date: Fri, 17 Feb 2017 18:37:17 -0800 Subject: [PATCH 0733/1015] msm: mdss: Handling possible integer overflow fudge_factor calculation can suffer from integer overflow as numer and denom are user controlled. Hence this change will first check for the overflow and return immediately. CRs-Fixed: 1110860 Change-Id: I3fab3edd4515d7a4c67f29d68b2039f234b03612 Signed-off-by: Harsh Sahu --- drivers/video/msm/mdss/mdss_mdp_ctl.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_ctl.c b/drivers/video/msm/mdss/mdss_mdp_ctl.c index db382a79c2f46..ae46dd2141740 100644 --- a/drivers/video/msm/mdss/mdss_mdp_ctl.c +++ b/drivers/video/msm/mdss/mdss_mdp_ctl.c @@ -73,8 +73,18 @@ static void __mdss_mdp_mixer_write_cfg(struct mdss_mdp_mixer *mixer, static inline u64 fudge_factor(u64 val, u32 numer, u32 denom) { - u64 result = (val * (u64)numer); - do_div(result, denom); + u64 result = val; + + if (val) { + u64 temp = -1UL; + + do_div(temp, val); + if (temp > numer) { + /* no overflow, so we can do the operation*/ + result = (val * (u64)numer); + do_div(result, denom); + } + } return result; } From 421f08171cd429ec85659099061fff6cbef5acab Mon Sep 17 00:00:00 2001 From: Gaurav Kohli Date: Tue, 21 Feb 2017 12:08:50 +0530 Subject: [PATCH 0734/1015] soc: qcom: pil: Clear elf region on authentication failure In existing implementation elf region was being cleared before memory access to firmware region assigned to HLOS. Avoid this by using separate function which will be called only when HLOS is the owner. Change-Id: I8bb22e4dbe3e1f898678d0c0f6e60268b88fc150 Signed-off-by: Gaurav Kohli Signed-off-by: Srinivasarao P --- drivers/soc/qcom/peripheral-loader.c | 40 ++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index eb25733a7838d..2d73ca96c2726 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -579,6 +579,13 @@ static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt) return pil_init_entry_addr(priv, mdt); } +struct pil_map_fw_info { + void *region; + struct dma_attrs attrs; + phys_addr_t base_addr; + struct device *dev; +}; + static void pil_release_mmap(struct pil_desc *desc) { struct pil_priv *priv = desc->priv; @@ -597,14 +604,30 @@ static void pil_release_mmap(struct pil_desc *desc) } } -#define IOMAP_SIZE SZ_1M +static void pil_clear_segment(struct pil_desc *desc) +{ + struct pil_priv *priv = desc->priv; + u8 __iomem *buf; -struct pil_map_fw_info { - void *region; - struct dma_attrs attrs; - phys_addr_t base_addr; - struct device *dev; -}; + struct pil_map_fw_info map_fw_info = { + .attrs = desc->attrs, + .region = priv->region, + .base_addr = priv->region_start, + .dev = desc->dev, + }; + + void *map_data = desc->map_data ? desc->map_data : &map_fw_info; + + /* Clear memory so that unauthorized ELF code is not left behind */ + buf = desc->map_fw_mem(priv->region_start, (priv->region_end - + priv->region_start), map_data); + pil_memset_io(buf, 0, (priv->region_end - priv->region_start)); + desc->unmap_fw_mem(buf, (priv->region_end - priv->region_start), + map_data); + +} + +#define IOMAP_SIZE SZ_1M static void *map_fw_mem(phys_addr_t paddr, size_t size, void *data) { @@ -890,6 +913,7 @@ int pil_boot(struct pil_desc *desc) &desc->attrs); priv->region = NULL; } + pil_clear_segment(desc); pil_release_mmap(desc); } return ret; From 46a044c32f32d6345ff5ac004c5dd3aa04aff737 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Fri, 7 Oct 2016 11:51:15 -0700 Subject: [PATCH 0735/1015] ion: blacklist %p kptr_restrict Bug: 31494725 Change-Id: I10a0c2aae883dfaa6c235c38689a704064557008 Git-repo: https://android.googlesource.com/kernel/msm.git Git-commit: b57e736e9991b3d0f85c0870b1eff6310a4baa64 [d-cagle@codeaurora.org: Automatic resolve of merge conflicts] Signed-off-by: Dennis Cagle --- drivers/staging/android/ion/ion.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index 8d03897b6c9d6..73fc9fd4c3e82 100755 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -821,7 +821,7 @@ static int ion_debug_client_show(struct seq_file *s, void *unused) struct ion_handle *handle = rb_entry(n, struct ion_handle, node); - seq_printf(s, "%16.16s: %16zx : %16d : %12p", + seq_printf(s, "%16.16s: %16zx : %16d : %12pK", handle->buffer->heap->name, handle->buffer->size, atomic_read(&handle->ref.refcount), From 9094b39181cce7de860307a0c10f51f4134b0091 Mon Sep 17 00:00:00 2001 From: Sarada Prasanna Garnayak Date: Mon, 17 Apr 2017 14:29:57 +0530 Subject: [PATCH 0736/1015] wcnss: fix the potential memory leak and heap overflow The wcnss platform driver update the wlan calibration data by the user space wlan daemon. The wlan user space daemon store the updated wlan calibration data reported by wlan firmware in user space and write it back to the wcnss platform calibration data buffer for the calibration data download and update. During the wlan calibration data store and retrieve operation there are some potential race condition which leads to memory leak and buffer overflow during the context switch. Fix the above issue by adding protection code and avoid usage of global pointer during the device file read and write operation. CRs-Fixed: 2015858 Change-Id: Ib5b57eb86dcb4e6ed799b5222d06396eaabfaad3 Signed-off-by: Sarada Prasanna Garnayak --- drivers/net/wireless/wcnss/wcnss_wlan.c | 87 +++++++++++++++---------- 1 file changed, 51 insertions(+), 36 deletions(-) diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c index e93fd7d83b8c9..93ae26b1533bc 100644 --- a/drivers/net/wireless/wcnss/wcnss_wlan.c +++ b/drivers/net/wireless/wcnss/wcnss_wlan.c @@ -396,7 +396,6 @@ static struct { int user_cal_available; u32 user_cal_rcvd; int user_cal_exp_size; - int device_opened; int iris_xo_mode_set; int fw_vbatt_state; char wlan_nv_macAddr[WLAN_MAC_ADDR_SIZE]; @@ -3297,14 +3296,6 @@ static int wcnss_node_open(struct inode *inode, struct file *file) return -EFAULT; } - mutex_lock(&penv->dev_lock); - penv->user_cal_rcvd = 0; - penv->user_cal_read = 0; - penv->user_cal_available = false; - penv->user_cal_data = NULL; - penv->device_opened = 1; - mutex_unlock(&penv->dev_lock); - return rc; } @@ -3313,7 +3304,7 @@ static ssize_t wcnss_wlan_read(struct file *fp, char __user { int rc = 0; - if (!penv || !penv->device_opened) + if (!penv) return -EFAULT; rc = wait_event_interruptible(penv->read_wait, penv->fw_cal_rcvd @@ -3350,55 +3341,66 @@ static ssize_t wcnss_wlan_write(struct file *fp, const char __user *user_buffer, size_t count, loff_t *position) { int rc = 0; - u32 size = 0; + char *cal_data = NULL; - if (!penv || !penv->device_opened || penv->user_cal_available) + if (!penv || penv->user_cal_available) return -EFAULT; - if (penv->user_cal_rcvd == 0 && count >= 4 - && !penv->user_cal_data) { - rc = copy_from_user((void *)&size, user_buffer, 4); - if (!size || size > MAX_CALIBRATED_DATA_SIZE) { - pr_err(DEVICE " invalid size to write %d\n", size); + if (!penv->user_cal_rcvd && count >= 4 && !penv->user_cal_exp_size) { + mutex_lock(&penv->dev_lock); + rc = copy_from_user((void *)&penv->user_cal_exp_size, + user_buffer, 4); + if (!penv->user_cal_exp_size || + penv->user_cal_exp_size > MAX_CALIBRATED_DATA_SIZE) { + pr_err(DEVICE " invalid size to write %d\n", + penv->user_cal_exp_size); + penv->user_cal_exp_size = 0; + mutex_unlock(&penv->dev_lock); return -EFAULT; } - - rc += count; - count -= 4; - penv->user_cal_exp_size = size; - penv->user_cal_data = kmalloc(size, GFP_KERNEL); - if (penv->user_cal_data == NULL) { - pr_err(DEVICE " no memory to write\n"); - return -ENOMEM; - } - if (0 == count) - goto exit; - - } else if (penv->user_cal_rcvd == 0 && count < 4) + mutex_unlock(&penv->dev_lock); + return count; + } else if (!penv->user_cal_rcvd && count < 4) { return -EFAULT; + } + mutex_lock(&penv->dev_lock); if ((UINT32_MAX - count < penv->user_cal_rcvd) || (penv->user_cal_exp_size < count + penv->user_cal_rcvd)) { pr_err(DEVICE " invalid size to write %zu\n", count + penv->user_cal_rcvd); - rc = -ENOMEM; - goto exit; + mutex_unlock(&penv->dev_lock); + return -ENOMEM; } - rc = copy_from_user((void *)penv->user_cal_data + - penv->user_cal_rcvd, user_buffer, count); - if (0 == rc) { + + cal_data = kmalloc(count, GFP_KERNEL); + if (!cal_data) { + mutex_unlock(&penv->dev_lock); + return -ENOMEM; + } + + rc = copy_from_user(cal_data, user_buffer, count); + if (!rc) { + memcpy(penv->user_cal_data + penv->user_cal_rcvd, + cal_data, count); penv->user_cal_rcvd += count; rc += count; } + + kfree(cal_data); if (penv->user_cal_rcvd == penv->user_cal_exp_size) { penv->user_cal_available = true; pr_info_ratelimited("wcnss: user cal written"); } + mutex_unlock(&penv->dev_lock); -exit: return rc; } +static int wcnss_node_release(struct inode *inode, struct file *file) +{ + return 0; +} static int wcnss_notif_cb(struct notifier_block *this, unsigned long code, void *ss_handle) @@ -3457,6 +3459,7 @@ static const struct file_operations wcnss_node_fops = { .open = wcnss_node_open, .read = wcnss_wlan_read, .write = wcnss_wlan_write, + .release = wcnss_node_release, }; static struct miscdevice wcnss_misc = { @@ -3484,6 +3487,13 @@ wcnss_wlan_probe(struct platform_device *pdev) } penv->pdev = pdev; + penv->user_cal_data = + devm_kzalloc(&pdev->dev, MAX_CALIBRATED_DATA_SIZE, GFP_KERNEL); + if (!penv->user_cal_data) { + dev_err(&pdev->dev, "Failed to alloc memory for cal data.\n"); + return -ENOMEM; + } + /* register sysfs entries */ ret = wcnss_create_sysfs(&pdev->dev); if (ret) { @@ -3504,6 +3514,11 @@ wcnss_wlan_probe(struct platform_device *pdev) mutex_init(&penv->pm_qos_mutex); init_waitqueue_head(&penv->read_wait); + penv->user_cal_rcvd = 0; + penv->user_cal_read = 0; + penv->user_cal_exp_size = 0; + penv->user_cal_available = false; + /* Since we were built into the kernel we'll be called as part * of kernel initialization. We don't know if userspace * applications are available to service PIL at this time From d700e67d33162f1b653e970b15676cc5484d4606 Mon Sep 17 00:00:00 2001 From: Kui Wang Date: Tue, 25 Apr 2017 09:35:54 +0800 Subject: [PATCH 0737/1015] msm: isp: increase UB size for isp40 The current UB size may cause axi bus overflow when do stability test. Increase it from 64 to 96 to fix this issue. Change-Id: Ia506ca49546383ffee2aa363a4de33e824e91b92 Signed-off-by: Kui Wang --- drivers/media/platform/msm/camera_v2/isp/msm_isp40.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index 3ae71b59b8b75..100c8e89d8e0b 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -2146,7 +2146,7 @@ static struct msm_vfe_axi_hardware_info msm_vfe40_axi_hw_info = { .num_comp_mask = 3, .num_rdi = 3, .num_rdi_master = 3, - .min_wm_ub = 64, + .min_wm_ub = 96, .scratch_buf_range = SZ_32M + SZ_4M, }; From 7c635e3169c50981417d19e7ca31a7785cb9784f Mon Sep 17 00:00:00 2001 From: Divya Ojha Date: Thu, 30 Mar 2017 10:25:15 +0530 Subject: [PATCH 0738/1015] drivers: qcom: ultrasound: check concurrent device open operations Make opened device count atomic variable to avoid probable race condition. Race condition leads to memory leak and list corruption. Change-Id: I4da98f27d36f616bc8fa7b1a848c20cc7eea04e5 Signed-off-by: Divya Ojha --- drivers/misc/qcom/qdsp6v2/ultrasound/usf.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c b/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c index 3bb95f50bc137..52f7d3d2f2685 100644 --- a/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c +++ b/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -179,7 +179,7 @@ static const int s_button_map[] = { }; /* The opened devices container */ -static int s_opened_devs[MAX_DEVS_NUMBER]; +static atomic_t s_opened_devs[MAX_DEVS_NUMBER]; static struct wakeup_source usf_wakeup_source; @@ -2338,14 +2338,11 @@ static uint16_t add_opened_dev(int minor) uint16_t ind = 0; for (ind = 0; ind < MAX_DEVS_NUMBER; ++ind) { - if (minor == s_opened_devs[ind]) { + if (minor == atomic_cmpxchg(&s_opened_devs[ind], 0, minor)) { pr_err("%s: device %d is already opened\n", __func__, minor); return USF_UNDEF_DEV_ID; - } - - if (s_opened_devs[ind] == 0) { - s_opened_devs[ind] = minor; + } else { pr_debug("%s: device %d is added; ind=%d\n", __func__, minor, ind); return ind; @@ -2401,7 +2398,7 @@ static int usf_release(struct inode *inode, struct file *file) usf_disable(&usf->usf_tx); usf_disable(&usf->usf_rx); - s_opened_devs[usf->dev_ind] = 0; + atomic_set(&s_opened_devs[usf->dev_ind], 0); wakeup_source_trash(&usf_wakeup_source); mutex_unlock(&usf->mutex); From 2d25fadf9e9c3e3a28f0e840b58c997ff019a001 Mon Sep 17 00:00:00 2001 From: Satya Durga Srinivasu Prabhala Date: Tue, 4 Apr 2017 13:07:03 -0700 Subject: [PATCH 0739/1015] soc: qcom: remove debugfs interface from ssr, service locator & notifier As debugfs interface is intended to test the respective framework, remove from the driver to make sure it won't be available by default. CRs-Fixed: 2025661 Change-Id: I6af9a8333c8028611f889cc2f9b0beb37ef12c9b Signed-off-by: Satya Durga Srinivasu Prabhala --- drivers/soc/qcom/service-locator.c | 122 ------------------ drivers/soc/qcom/service-notifier.c | 179 +-------------------------- drivers/soc/qcom/subsystem_restart.c | 105 +--------------- include/soc/qcom/subsystem_restart.h | 1 + 4 files changed, 4 insertions(+), 403 deletions(-) diff --git a/drivers/soc/qcom/service-locator.c b/drivers/soc/qcom/service-locator.c index b16ae02c86db8..76d754d5edfc5 100644 --- a/drivers/soc/qcom/service-locator.c +++ b/drivers/soc/qcom/service-locator.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include @@ -68,48 +67,6 @@ struct pd_qmi_data { DEFINE_MUTEX(service_init_mutex); struct pd_qmi_data service_locator; -/* Please refer soc/qcom/service-locator.h for use about APIs defined here */ - -static ssize_t show_service_locator_status(struct class *cl, - struct class_attribute *attr, - char *buf) -{ - return scnprintf(buf, PAGE_SIZE, "%x\n", locator_status); -} - -static ssize_t store_service_locator_status(struct class *cl, - struct class_attribute *attr, - const char *buf, size_t size) -{ - u32 val; - - if (kstrtos32(buf, 10, &val) < 0) - goto err; - if (val != LOCATOR_NOT_PRESENT && val != LOCATOR_PRESENT) - goto err; - - mutex_lock(&service_init_mutex); - locator_status = val; - complete_all(&locator_status_known); - mutex_unlock(&service_init_mutex); - return size; -err: - pr_err("Invalid input parameters\n"); - return -EINVAL; -} - -static struct class_attribute service_locator_class_attr[] = { - __ATTR(service_locator_status, S_IRUGO | S_IWUSR, - show_service_locator_status, - store_service_locator_status), - __ATTR_NULL, -}; - -static struct class service_locator_class = { - .name = "service_locator", - .owner = THIS_MODULE, - .class_attrs = service_locator_class_attr, -}; static int service_locator_svc_event_notify(struct notifier_block *this, unsigned long code, @@ -453,82 +410,3 @@ int find_subsys(const char *pd_path, char *subsys) return 0; } EXPORT_SYMBOL(find_subsys); - -static struct pd_qmi_client_data test_data; - -static ssize_t show_servloc(struct seq_file *f, void *unused) -{ - int rc = 0, i = 0; - char subsys[QMI_SERVREG_LOC_NAME_LENGTH_V01]; - - rc = get_service_location(&test_data); - if (rc) { - seq_printf(f, "Failed to get process domain!, rc = %d\n", rc); - return -EIO; - } - - seq_printf(f, "Service Name: %s\tTotal Domains: %d\n", - test_data.service_name, test_data.total_domains); - for (i = 0; i < test_data.total_domains; i++) { - seq_printf(f, "Instance ID: %d\t ", - test_data.domain_list[i].instance_id); - seq_printf(f, "Domain Name: %s\n", - test_data.domain_list[i].name); - rc = find_subsys(test_data.domain_list[i].name, subsys); - if (rc < 0) - seq_printf(f, "No valid subsys found for %s!\n", - test_data.domain_list[i].name); - else - seq_printf(f, "Subsys: %s\n", subsys); - } - return 0; -} - -static ssize_t store_servloc(struct file *fp, const char __user *buf, - size_t count, loff_t *unused) -{ - if (!buf) - return -EIO; - snprintf(test_data.service_name, sizeof(test_data.service_name), - "%.*s", (int) min((size_t)count - 1, - (sizeof(test_data.service_name) - 1)), buf); - return count; -} - -static int servloc_open(struct inode *inode, struct file *file) -{ - return single_open(file, (void *)show_servloc, inode->i_private); -} - -static const struct file_operations servloc_fops = { - .open = servloc_open, - .read = seq_read, - .write = store_servloc, - .llseek = seq_lseek, - .release = seq_release, -}; - -static struct dentry *test_servloc_file; - -static int __init service_locator_init(void) -{ - if (!enable) - locator_status = LOCATOR_NOT_PRESENT; - - class_register(&service_locator_class); - test_servloc_file = debugfs_create_file("test_servloc", - S_IRUGO | S_IWUSR, NULL, NULL, - &servloc_fops); - if (!test_servloc_file) - pr_err("Could not create test_servloc debugfs entry!"); - return 0; -} - -static void __exit service_locator_exit(void) -{ - class_unregister(&service_locator_class); - debugfs_remove(test_servloc_file); -} - -module_init(service_locator_init); -module_exit(service_locator_exit); diff --git a/drivers/soc/qcom/service-notifier.c b/drivers/soc/qcom/service-notifier.c index fc0ea0cf0706d..c2a5442f4e129 100644 --- a/drivers/soc/qcom/service-notifier.c +++ b/drivers/soc/qcom/service-notifier.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -662,179 +661,3 @@ int service_notif_unregister_notifier(void *service_notif_handle, &service_notif->service_notif_rcvr_list, nb); } EXPORT_SYMBOL(service_notif_unregister_notifier); - -struct service_notifier_test_data { - char service_path[MAX_STRING_LEN]; - int instance_id; - struct notifier_block nb; - void *service_notif_handle; -}; - -static struct service_notifier_test_data test_data; - -static void print_service_provider_state(int notification, char *type) -{ - if (notification == SERVREG_NOTIF_SERVICE_STATE_DOWN_V01) - pr_info("%s: Service %s down!\n", type, test_data.service_path); - else if (notification == SERVREG_NOTIF_SERVICE_STATE_UP_V01) - pr_info("%s: Service %s up!\n", type, test_data.service_path); - else if (notification == SERVREG_NOTIF_SERVICE_STATE_UNINIT_V01) - pr_info("%s: Service %s state uninit!\n", type, - test_data.service_path); - else - pr_info("%s: Service %s state Unknown 0x%x!\n", type, - test_data.service_path, notification); -} - -static int nb_callback(struct notifier_block *nb, - unsigned long notification, - void *data) -{ - print_service_provider_state((int)notification, "Notification:"); - return 0; -} - -static ssize_t show_service_path(struct seq_file *f, void *unused) -{ - if (test_data.service_notif_handle) - seq_printf(f, "Service Path: %s\n", test_data.service_path); - else - seq_puts(f, "No existing notifier\n"); - return 0; -} - - -static ssize_t set_service_notifier_register(struct file *fp, - const char __user *buf, - size_t count, loff_t *ppos) -{ - int curr_state = INT_MAX, rc; - - if (!buf) - return -EIO; - if (test_data.service_notif_handle) { - service_notif_unregister_notifier( - test_data.service_notif_handle, - &test_data.nb); - test_data.service_notif_handle = NULL; - pr_info("Unregistering existing notifier for %s\n", - test_data.service_path); - } - rc = simple_write_to_buffer(test_data.service_path, MAX_STRING_LEN, - ppos, buf, count - 1); - if (rc != count - 1) { - pr_err("Unable to read data into kernel buffer\n"); - goto err; - } - test_data.nb.notifier_call = nb_callback; - test_data.service_notif_handle = service_notif_register_notifier( - test_data.service_path, - test_data.instance_id, &test_data.nb, - &curr_state); - if (!IS_ERR(test_data.service_notif_handle)) { - pr_info("Notifier Registered for service %s\n", - test_data.service_path); - print_service_provider_state(curr_state, "Initial State"); - return count; - } -err: - test_data.service_notif_handle = NULL; - pr_err("Unable to register notifier for %s\n", test_data.service_path); - return -EIO; -} - -static int open_service_notifier_register(struct inode *inode, struct file *f) -{ - return single_open(f, (void *) show_service_path, - inode->i_private); -} - -static const struct file_operations service_notifier_register_fops = { - .open = open_service_notifier_register, - .read = seq_read, - .write = set_service_notifier_register, - .llseek = seq_lseek, - .release = seq_release, -}; - -static ssize_t show_service_notifier_id(struct seq_file *f, void *unused) -{ - seq_printf(f, "Service instance ID: %d\n", test_data.instance_id); - return 0; -} - -static ssize_t set_service_notifier_id(struct file *fp, - const char __user *buf, - size_t count, loff_t *unused) -{ - int val, rc; - char kbuf[MAX_STRING_LEN]; - - if (MAX_STRING_LEN < count) { - rc = -EIO; - goto err; - } - rc = copy_from_user(kbuf, buf, count); - if (rc != 0) { - rc = -EFAULT; - goto err; - } - - kbuf[count - 1] = '\0'; - rc = kstrtoint(kbuf, 0, &val); - if (rc < 0) - goto err; - - test_data.instance_id = val; - return count; -err: - pr_err("Invalid input parameters: rc = %d\n", rc); - return rc; -} - -static int open_service_notifier_id(struct inode *inode, struct file *f) -{ - return single_open(f, (void *) show_service_notifier_id, - inode->i_private); -} - -static const struct file_operations service_notifier_id_fops = { - .open = open_service_notifier_id, - .read = seq_read, - .write = set_service_notifier_id, - .llseek = seq_lseek, - .release = seq_release, -}; - -static struct dentry *service_notifier_dir; -static struct dentry *service_path_file; -static struct dentry *service_id_file; - -static int __init service_notifier_init(void) -{ - service_notifier_dir = debugfs_create_dir("service_notifier", NULL); - if (service_notifier_dir) { - service_path_file = debugfs_create_file("service_path", - S_IRUGO | S_IWUSR, service_notifier_dir, NULL, - &service_notifier_register_fops); - if (!service_path_file) - goto err; - service_id_file = debugfs_create_file("service_id", - S_IRUGO | S_IWUSR, service_notifier_dir, NULL, - &service_notifier_id_fops); - if (!service_id_file) - goto err; - } - return 0; -err: - debugfs_remove_recursive(service_notifier_dir); - return 0; -} - -static void __exit service_notifier_exit(void) -{ - debugfs_remove_recursive(service_notifier_dir); - test_data.nb.notifier_call = nb_callback; -} -module_init(service_notifier_init); -module_exit(service_notifier_exit); diff --git a/drivers/soc/qcom/subsystem_restart.c b/drivers/soc/qcom/subsystem_restart.c index 34ff85ecef465..fa9f9fc335b40 100644 --- a/drivers/soc/qcom/subsystem_restart.c +++ b/drivers/soc/qcom/subsystem_restart.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -150,7 +149,6 @@ struct restart_log { * @restart_level: restart level (0 - panic, 1 - related, 2 - independent, etc.) * @restart_order: order of other devices this devices restarts with * @crash_count: number of times the device has crashed - * @dentry: debugfs directory for this device * @do_ramdump_on_put: ramdump on subsystem_put() if true * @err_ready: completion variable to record error ready from subsystem * @crashed: indicates if subsystem has crashed @@ -172,9 +170,6 @@ struct subsys_device { int restart_level; int crash_count; struct subsys_soc_restart_order *restart_order; -#ifdef CONFIG_DEBUG_FS - struct dentry *dentry; -#endif bool do_ramdump_on_put; struct cdev char_dev; dev_t dev_no; @@ -353,10 +348,11 @@ static struct device_attribute subsys_attrs[] = { __ATTR_NULL, }; -static struct bus_type subsys_bus_type = { +struct bus_type subsys_bus_type = { .name = "msm_subsys", .dev_attrs = subsys_attrs, }; +EXPORT_SYMBOL(subsys_bus_type); static DEFINE_IDA(subsys_ida); @@ -1147,87 +1143,6 @@ void notify_proxy_unvote(struct device *device) notify_each_subsys_device(&dev, 1, SUBSYS_PROXY_UNVOTE, NULL); } -#ifdef CONFIG_DEBUG_FS -static ssize_t subsys_debugfs_read(struct file *filp, char __user *ubuf, - size_t cnt, loff_t *ppos) -{ - int r; - char buf[40]; - struct subsys_device *subsys = filp->private_data; - - r = snprintf(buf, sizeof(buf), "%d\n", subsys->count); - return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); -} - -static ssize_t subsys_debugfs_write(struct file *filp, - const char __user *ubuf, size_t cnt, loff_t *ppos) -{ - struct subsys_device *subsys = filp->private_data; - char buf[10]; - char *cmp; - - cnt = min(cnt, sizeof(buf) - 1); - if (copy_from_user(&buf, ubuf, cnt)) - return -EFAULT; - buf[cnt] = '\0'; - cmp = strstrip(buf); - - if (!strcmp(cmp, "restart")) { - if (subsystem_restart_dev(subsys)) - return -EIO; - } else if (!strcmp(cmp, "get")) { - if (subsystem_get(subsys->desc->name)) - return -EIO; - } else if (!strcmp(cmp, "put")) { - subsystem_put(subsys); - } else { - return -EINVAL; - } - - return cnt; -} - -static const struct file_operations subsys_debugfs_fops = { - .open = simple_open, - .read = subsys_debugfs_read, - .write = subsys_debugfs_write, -}; - -static struct dentry *subsys_base_dir; - -static int __init subsys_debugfs_init(void) -{ - subsys_base_dir = debugfs_create_dir("msm_subsys", NULL); - return !subsys_base_dir ? -ENOMEM : 0; -} - -static void subsys_debugfs_exit(void) -{ - debugfs_remove_recursive(subsys_base_dir); -} - -static int subsys_debugfs_add(struct subsys_device *subsys) -{ - if (!subsys_base_dir) - return -ENOMEM; - - subsys->dentry = debugfs_create_file(subsys->desc->name, - S_IRUGO | S_IWUSR, subsys_base_dir, - subsys, &subsys_debugfs_fops); - return !subsys->dentry ? -ENOMEM : 0; -} - -static void subsys_debugfs_remove(struct subsys_device *subsys) -{ - debugfs_remove(subsys->dentry); -} -#else -static int __init subsys_debugfs_init(void) { return 0; }; -static void subsys_debugfs_exit(void) { } -static int subsys_debugfs_add(struct subsys_device *subsys) { return 0; } -static void subsys_debugfs_remove(struct subsys_device *subsys) { } -#endif - static int subsys_device_open(struct inode *inode, struct file *file) { struct subsys_device *device, *subsys_dev = 0; @@ -1664,17 +1579,8 @@ struct subsys_device *subsys_register(struct subsys_desc *desc) mutex_init(&subsys->track.lock); - ret = subsys_debugfs_add(subsys); - if (ret) { - ida_simple_remove(&subsys_ida, subsys->id); - wakeup_source_trash(&subsys->ssr_wlock); - kfree(subsys); - return ERR_PTR(ret); - } - ret = device_register(&subsys->dev); if (ret) { - subsys_debugfs_remove(subsys); put_device(&subsys->dev); return ERR_PTR(ret); } @@ -1736,7 +1642,6 @@ struct subsys_device *subsys_register(struct subsys_desc *desc) if (ofnode) subsys_remove_restart_order(ofnode); err_register: - subsys_debugfs_remove(subsys); device_unregister(&subsys->dev); return ERR_PTR(ret); } @@ -1765,7 +1670,6 @@ void subsys_unregister(struct subsys_device *subsys) WARN_ON(subsys->count); device_unregister(&subsys->dev); mutex_unlock(&subsys->track.lock); - subsys_debugfs_remove(subsys); subsys_char_device_remove(subsys); sysmon_notifier_unregister(subsys->desc); if (subsys->desc->edge) @@ -1805,9 +1709,6 @@ static int __init subsys_restart_init(void) ret = bus_register(&subsys_bus_type); if (ret) goto err_bus; - ret = subsys_debugfs_init(); - if (ret) - goto err_debugfs; char_class = class_create(THIS_MODULE, "subsys"); if (IS_ERR(char_class)) { @@ -1826,8 +1727,6 @@ static int __init subsys_restart_init(void) err_soc: class_destroy(char_class); err_class: - subsys_debugfs_exit(); -err_debugfs: bus_unregister(&subsys_bus_type); err_bus: destroy_workqueue(ssr_wq); diff --git a/include/soc/qcom/subsystem_restart.h b/include/soc/qcom/subsystem_restart.h index 3a5f6e678b4f8..88492e62972e4 100644 --- a/include/soc/qcom/subsystem_restart.h +++ b/include/soc/qcom/subsystem_restart.h @@ -18,6 +18,7 @@ #include struct subsys_device; +extern struct bus_type subsys_bus_type; enum { RESET_SOC = 0, From 907f9f6c1c629431dc18f51174750931bc5571da Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Mon, 3 Apr 2017 13:21:58 +0530 Subject: [PATCH 0740/1015] msm: ipa: Fix memory leak in ipa driver Free the memory pointed by msg pointer if copy_to_user fails. Change-Id: I628e089d844a3e1818a1a550e77ac10f33640ac9 Acked-by: Mohammed Javid Signed-off-by: Utkarsh Saxena --- drivers/platform/msm/ipa/ipa_v2/ipa_intf.c | 4 ++++ drivers/platform/msm/ipa/ipa_v3/ipa_intf.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c b/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c index 9d13bc7662dd3..1ffbf38238782 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c @@ -547,6 +547,8 @@ ssize_t ipa_read(struct file *filp, char __user *buf, size_t count, mutex_unlock(&ipa_ctx->msg_lock); if (copy_to_user(buf, &msg->meta, sizeof(struct ipa_msg_meta))) { + kfree(msg); + msg = NULL; ret = -EFAULT; break; } @@ -555,6 +557,8 @@ ssize_t ipa_read(struct file *filp, char __user *buf, size_t count, if (msg->buff) { if (copy_to_user(buf, msg->buff, msg->meta.msg_len)) { + kfree(msg); + msg = NULL; ret = -EFAULT; break; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c b/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c index 8e13a2fee4674..2f640943c483f 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c @@ -553,6 +553,8 @@ ssize_t ipa3_read(struct file *filp, char __user *buf, size_t count, if (copy_to_user(buf, &msg->meta, sizeof(struct ipa_msg_meta))) { ret = -EFAULT; + kfree(msg); + msg = NULL; break; } buf += sizeof(struct ipa_msg_meta); @@ -561,6 +563,8 @@ ssize_t ipa3_read(struct file *filp, char __user *buf, size_t count, if (copy_to_user(buf, msg->buff, msg->meta.msg_len)) { ret = -EFAULT; + kfree(msg); + msg = NULL; break; } buf += msg->meta.msg_len; From 7a140fc5693cceede12e410a5efc649d1402dcc2 Mon Sep 17 00:00:00 2001 From: Sunil Khatri Date: Thu, 6 Apr 2017 18:28:31 +0530 Subject: [PATCH 0741/1015] msm: kgsl: Fix the race between context create and destroy Hold the context lock before updating the context id in param->drawctxt_id to avoid race condition between context creation and context destroy. Change-Id: Ic26d3e5b68078c02d15c38080b1a262ea4b1f7fe Signed-off-by: Sunil Khatri --- drivers/gpu/msm/kgsl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 3098fc603b3f5..c086dde1c45fa 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1665,9 +1665,9 @@ long kgsl_ioctl_drawctxt_create(struct kgsl_device_private *dev_priv, /* Commit the pointer to the context in context_idr */ write_lock(&device->context_lock); idr_replace(&device->context_idr, context, context->id); + param->drawctxt_id = context->id; write_unlock(&device->context_lock); - param->drawctxt_id = context->id; done: return result; } From 1a29b73f7d536cbc5374f2f067d48a8fc0b3f85a Mon Sep 17 00:00:00 2001 From: Sudarshan Rajagopalan Date: Thu, 6 Apr 2017 16:15:48 -0700 Subject: [PATCH 0742/1015] ashmem: remove cache maintenance support The cache maintenance routines in ashmem were causing several security issues. Since they are not being used anymore by any drivers, its well to remove them entirely. CRs-Fixed: 1107034, 2001129, 2007786 Change-Id: I955e33d90b888d58db5cf6bb490905283374425b Signed-off-by: Sudarshan Rajagopalan --- drivers/staging/android/ashmem.c | 41 -------------------------------- include/uapi/linux/ashmem.h | 3 --- 2 files changed, 44 deletions(-) diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c index 411072fc8d2dd..8cb5d4e4d45b5 100644 --- a/drivers/staging/android/ashmem.c +++ b/drivers/staging/android/ashmem.c @@ -32,7 +32,6 @@ #include #include #include -#include #include "ashmem.h" @@ -744,37 +743,6 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd, return ret; } -static int ashmem_cache_op(struct ashmem_area *asma, - void (*cache_func)(const void *vstart, const void *vend)) -{ - int ret = 0; - struct vm_area_struct *vma; - if (!asma->vm_start) - return -EINVAL; - - down_read(¤t->mm->mmap_sem); - vma = find_vma(current->mm, asma->vm_start); - if (!vma) { - ret = -EINVAL; - goto done; - } - if (vma->vm_file != asma->file) { - ret = -EINVAL; - goto done; - } - if ((asma->vm_start + asma->size) > vma->vm_end) { - ret = -EINVAL; - goto done; - } - cache_func((void *)asma->vm_start, - (void *)(asma->vm_start + asma->size)); -done: - up_read(¤t->mm->mmap_sem); - if (ret) - asma->vm_start = 0; - return ret; -} - static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct ashmem_area *asma = file->private_data; @@ -820,15 +788,6 @@ static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ashmem_shrink_scan(&ashmem_shrinker, &sc); } break; - case ASHMEM_CACHE_FLUSH_RANGE: - ret = ashmem_cache_op(asma, &dmac_flush_range); - break; - case ASHMEM_CACHE_CLEAN_RANGE: - ret = ashmem_cache_op(asma, &dmac_clean_range); - break; - case ASHMEM_CACHE_INV_RANGE: - ret = ashmem_cache_op(asma, &dmac_inv_range); - break; } return ret; diff --git a/include/uapi/linux/ashmem.h b/include/uapi/linux/ashmem.h index c8d93499d8b2e..8861e960c221c 100644 --- a/include/uapi/linux/ashmem.h +++ b/include/uapi/linux/ashmem.h @@ -34,9 +34,6 @@ struct ashmem_pin { #define ASHMEM_UNPIN _IOW(__ASHMEMIOC, 8, struct ashmem_pin) #define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9) #define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10) -#define ASHMEM_CACHE_FLUSH_RANGE _IO(__ASHMEMIOC, 11) -#define ASHMEM_CACHE_CLEAN_RANGE _IO(__ASHMEMIOC, 12) -#define ASHMEM_CACHE_INV_RANGE _IO(__ASHMEMIOC, 13) #endif /* _UAPI_LINUX_ASHMEM_H */ From 46e6165784d58be4cc523b57e108935645a8c6cd Mon Sep 17 00:00:00 2001 From: Sunil Khatri Date: Thu, 6 Apr 2017 16:56:47 +0530 Subject: [PATCH 0743/1015] msm: kgsl: Fix kgsl memory allocation and free race condition When allocating userspace memory keep reference to memory allocation till it is completely initialized and info is sent back to userspace. Change-Id: Id72c82bf98c094ecbd4722813c732a998dcbb188 Signed-off-by: Tarun Karra Signed-off-by: Sunil Khatri --- drivers/gpu/msm/kgsl.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 3098fc603b3f5..ed500dee7b056 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -250,8 +250,11 @@ kgsl_mem_entry_create(void) { struct kgsl_mem_entry *entry = kzalloc(sizeof(*entry), GFP_KERNEL); - if (entry != NULL) + if (entry != NULL) { kref_init(&entry->refcount); + /* put this ref in the caller functions after init */ + kref_get(&entry->refcount); + } return entry; } @@ -2300,6 +2303,9 @@ long kgsl_ioctl_gpuobj_import(struct kgsl_device_private *dev_priv, trace_kgsl_mem_map(entry, fd); kgsl_mem_entry_commit_process(entry); + + /* put the extra refcount for kgsl_mem_entry_create() */ + kgsl_mem_entry_put(entry); return 0; unmap: @@ -2606,6 +2612,9 @@ long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv, trace_kgsl_mem_map(entry, param->fd); kgsl_mem_entry_commit_process(entry); + + /* put the extra refcount for kgsl_mem_entry_create() */ + kgsl_mem_entry_put(entry); return result; error_attach: @@ -3044,6 +3053,8 @@ long kgsl_ioctl_gpuobj_alloc(struct kgsl_device_private *dev_priv, param->mmapsize = kgsl_memdesc_footprint(&entry->memdesc); param->id = entry->id; + /* put the extra refcount for kgsl_mem_entry_create() */ + kgsl_mem_entry_put(entry); return 0; } @@ -3067,6 +3078,8 @@ long kgsl_ioctl_gpumem_alloc(struct kgsl_device_private *dev_priv, param->size = (size_t) entry->memdesc.size; param->flags = (unsigned int) entry->memdesc.flags; + /* put the extra refcount for kgsl_mem_entry_create() */ + kgsl_mem_entry_put(entry); return 0; } @@ -3090,6 +3103,8 @@ long kgsl_ioctl_gpumem_alloc_id(struct kgsl_device_private *dev_priv, param->mmapsize = (size_t) kgsl_memdesc_footprint(&entry->memdesc); param->gpuaddr = (unsigned long) entry->memdesc.gpuaddr; + /* put the extra refcount for kgsl_mem_entry_create() */ + kgsl_mem_entry_put(entry); return 0; } From f41f1358711197c052a2e86775a808b49b859021 Mon Sep 17 00:00:00 2001 From: AnilKumar Chimata Date: Mon, 13 Mar 2017 16:13:47 +0530 Subject: [PATCH 0744/1015] crypto: msm: Fix buffer overflow issue In multi-threaded environment diglen variable could be modified by multiple threads at the same time. Buffer overflow might happen in current thread if another thread changes the diglen variable. So add mutex locks to avoid this issue. Change-Id: I62c63c55c028dedb1dd0eec862851bd8e818a5d3 Signed-off-by: AnilKumar Chimata --- drivers/crypto/msm/qcedev.c | 51 +++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index ef4b5e15b4fad..50e67b5db0e7a 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -56,6 +56,7 @@ static uint8_t _std_init_vector_sha256_uint8[] = { static DEFINE_MUTEX(send_cmd_lock); static DEFINE_MUTEX(qcedev_sent_bw_req); +static DEFINE_MUTEX(hash_access_lock); static void qcedev_ce_high_bw_req(struct qcedev_control *podev, bool high_bw_req) @@ -1638,12 +1639,18 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) + mutex_lock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { + mutex_unlock(&hash_access_lock); return -EINVAL; + } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; err = qcedev_hash_init(&qcedev_areq, handle, &sg_src); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } + mutex_unlock(&hash_access_lock); if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1661,32 +1668,42 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) + mutex_lock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { + mutex_unlock(&hash_access_lock); return -EINVAL; + } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; if (qcedev_areq.sha_op_req.alg == QCEDEV_ALG_AES_CMAC) { err = qcedev_hash_cmac(&qcedev_areq, handle, &sg_src); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } } else { if (handle->sha_ctxt.init_done == false) { pr_err("%s Init was not called\n", __func__); + mutex_unlock(&hash_access_lock); return -EINVAL; } err = qcedev_hash_update(&qcedev_areq, handle, &sg_src); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } } if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { pr_err("Invalid sha_ctxt.diglen %d\n", handle->sha_ctxt.diglen); + mutex_unlock(&hash_access_lock); return -EINVAL; } memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); + mutex_unlock(&hash_access_lock); if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1703,16 +1720,22 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) + mutex_lock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { + mutex_unlock(&hash_access_lock); return -EINVAL; + } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; err = qcedev_hash_final(&qcedev_areq, handle); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } qcedev_areq.sha_op_req.diglen = handle->sha_ctxt.diglen; memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); + mutex_unlock(&hash_access_lock); if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1727,20 +1750,28 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) + mutex_lock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { + mutex_unlock(&hash_access_lock); return -EINVAL; + } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; qcedev_hash_init(&qcedev_areq, handle, &sg_src); err = qcedev_hash_update(&qcedev_areq, handle, &sg_src); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } err = qcedev_hash_final(&qcedev_areq, handle); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } qcedev_areq.sha_op_req.diglen = handle->sha_ctxt.diglen; memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); + mutex_unlock(&hash_access_lock); if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; From 5c7251c708443915f1ca61be1334888561f05ce4 Mon Sep 17 00:00:00 2001 From: Harsh Sahu Date: Thu, 13 Apr 2017 15:38:46 -0700 Subject: [PATCH 0745/1015] msm: mdss: fix race condition during mdp debugfs release Fix race condition in the release of the mdp debugfs functions panel_debug_base_release and mdss_debug_base_release by adding the lock for unpreempted freeing of the buffer so that multiple concurrent processes cannot affect the release which can possibly lead to use-after-free operation on the buffer. Change-Id: I9586081b65ae2eb0e7f6e30c606ee748ae9ef7e8 Signed-off-by: Harsh Sahu --- drivers/video/msm/mdss/mdss_debug.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_debug.c b/drivers/video/msm/mdss/mdss_debug.c index 3dc2c2bc14c9e..0a13956078bb4 100644 --- a/drivers/video/msm/mdss/mdss_debug.c +++ b/drivers/video/msm/mdss/mdss_debug.c @@ -59,11 +59,13 @@ static int panel_debug_base_open(struct inode *inode, struct file *file) static int panel_debug_base_release(struct inode *inode, struct file *file) { struct mdss_debug_base *dbg = file->private_data; + mutex_lock(&mdss_debug_lock); if (dbg && dbg->buf) { kfree(dbg->buf); dbg->buf_len = 0; dbg->buf = NULL; } + mutex_unlock(&mdss_debug_lock); return 0; } @@ -385,11 +387,13 @@ static int mdss_debug_base_open(struct inode *inode, struct file *file) static int mdss_debug_base_release(struct inode *inode, struct file *file) { struct mdss_debug_base *dbg = file->private_data; + mutex_lock(&mdss_debug_lock); if (dbg && dbg->buf) { kfree(dbg->buf); dbg->buf_len = 0; dbg->buf = NULL; } + mutex_unlock(&mdss_debug_lock); return 0; } From fec375919486a7a503137185887711adbbac254d Mon Sep 17 00:00:00 2001 From: Petar Sivenov Date: Mon, 13 Feb 2017 22:36:22 +0200 Subject: [PATCH 0746/1015] msm: camera: isp: fix various issues in reseving ub UB buffers need to be reallocated after interface restart RDI UB buffers offset was incorrectly calculated and overlapped Change-Id: I3e66100bf9ac700f4f66f5fdc86acf825d3b8987 Signed-off-by: Petar Sivenov --- .../platform/msm/camera_v2/isp/msm_isp47.c | 17 ++++------------- .../msm/camera_v2/isp/msm_isp_axi_util.c | 3 +++ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c index 2b472185c2bca..8bc46c8b3f563 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c @@ -1514,6 +1514,7 @@ void msm_vfe47_update_camif_state(struct vfe_device *vfe_dev, msm_camera_io_w_mb((update_state == DISABLE_CAMIF ? 0x0 : 0x6), vfe_dev->vfe_base + 0x478); vfe_dev->axi_data.src_info[VFE_PIX_0].active = 0; + vfe_dev->axi_data.src_info[VFE_PIX_0].flag = 0; /* testgen OFF*/ if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN) msm_camera_io_w(1 << 1, vfe_dev->vfe_base + 0xC58); @@ -1685,8 +1686,6 @@ void msm_vfe47_cfg_axi_ub_equal_default( uint32_t wm_ub_size; uint64_t delta; uint32_t rdi_ub_offset; - int plane; - struct msm_vfe_axi_stream *stream_info; if (frame_src == VFE_PIX_0) { for (i = 0; i < axi_data->hw_info->num_wm; i++) { @@ -1713,7 +1712,7 @@ void msm_vfe47_cfg_axi_ub_equal_default( vfe_dev->hw_info->vfe_ops.axi_ops. ub_reg_offset(vfe_dev, i)); } - if (frame_src != SRC_TO_INTF( + if (!axi_data->free_wm[i] || frame_src != SRC_TO_INTF( HANDLE_TO_IDX(axi_data->free_wm[i]))) continue; @@ -1730,17 +1729,9 @@ void msm_vfe47_cfg_axi_ub_equal_default( ub_offset += wm_ub_size; } else { - stream_info = &axi_data->stream_info[ - HANDLE_TO_IDX(axi_data->free_wm[i])]; - for (plane = 0; plane < stream_info->num_planes; - plane++) - if (stream_info->wm[plane] == - axi_data->free_wm[i]) - break; - - rdi_ub_offset = ((SRC_TO_INTF( + rdi_ub_offset = (SRC_TO_INTF( HANDLE_TO_IDX(axi_data->free_wm[i])) - - VFE_RAW_0 * 2) + plane) * + VFE_RAW_0) * 2 * axi_data->hw_info->min_wm_ub; wm_ub_size = axi_data->hw_info->min_wm_ub * 2; msm_camera_io_w((rdi_ub_offset << 16 | diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index 4159808db8fe6..1e1b5af4b12f3 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -2969,6 +2969,8 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev, if (intf >= VFE_RAW_0 && intf < VFE_SRC_MAX) { vfe_dev->axi_data.src_info[intf].active = 0; + vfe_dev->axi_data.src_info[intf].flag = 0; + } } else src_mask |= (1 << intf); @@ -3013,6 +3015,7 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev, for (i = VFE_RAW_0; i < VFE_SRC_MAX; i++) { if (src_mask & (1 << i)) { vfe_dev->axi_data.src_info[i].active = 0; + vfe_dev->axi_data.src_info[i].flag = 0; } } } From 987185dcd1f61dbe34a7c27922019e7dbc0b8cc8 Mon Sep 17 00:00:00 2001 From: kunleiz Date: Fri, 14 Apr 2017 10:28:42 +0800 Subject: [PATCH 0747/1015] ASoC: msm: qdspv2: add result check when audio process fail A audio_process_event_req is not always to success. Therefore, check the return value for audio_process_event_req, and initializ usr_evt before using it. CRs-Fixed: 2029798 Change-Id: I4adf682575f5f9233a1a1a533f9c6361af8a5bcf Signed-off-by: kunleiz --- drivers/misc/qcom/qdsp6v2/audio_utils_aio.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c index c12f791a1739c..1633383991efc 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c @@ -851,6 +851,7 @@ static long audio_aio_process_event_req_compat(struct q6audio_aio *audio, long rc; struct msm_audio_event32 usr_evt_32; struct msm_audio_event usr_evt; + memset(&usr_evt, 0, sizeof(struct msm_audio_event)); if (copy_from_user(&usr_evt_32, arg, sizeof(struct msm_audio_event32))) { @@ -860,6 +861,11 @@ static long audio_aio_process_event_req_compat(struct q6audio_aio *audio, usr_evt.timeout_ms = usr_evt_32.timeout_ms; rc = audio_aio_process_event_req_common(audio, &usr_evt); + if (rc < 0) { + pr_err("%s: audio process event failed, rc = %ld", + __func__, rc); + return rc; + } usr_evt_32.event_type = usr_evt.event_type; switch (usr_evt_32.event_type) { From 8576feebaf688dadf0548b9a16d2b90b76ed714c Mon Sep 17 00:00:00 2001 From: Trishansh Bhardwaj Date: Tue, 18 Apr 2017 14:44:43 +0530 Subject: [PATCH 0748/1015] msm: camera: Fix kernel overwrite GET_BUF_BY_IDX ioctl Assign address of buf_info into ioctl_ptr. Previously we were copying first 8 bytes of buf_info (content) into ioctl_ptr. Which is dereferenced and written later causing kernel overwrite vulnerability. Change-Id: Ie5deae249da8208523027f8ec5632f960757e9bd Signed-off-by: Trishansh Bhardwaj --- .../platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c b/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c index 882ab03dcf9a7..d0b265a787979 100644 --- a/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c +++ b/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c @@ -554,8 +554,7 @@ static long msm_buf_mngr_subdev_ioctl(struct v4l2_subdev *sd, sizeof(struct msm_buf_mngr_info))) { return -EFAULT; } - MSM_CAM_GET_IOCTL_ARG_PTR(&k_ioctl.ioctl_ptr, - &buf_info, sizeof(void *)); + k_ioctl.ioctl_ptr = (uintptr_t)&buf_info; argp = &k_ioctl; rc = msm_cam_buf_mgr_ops(cmd, argp); } From f1c121b78e68c03f7fe5e9fa7319e53ad29392f3 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 30 Dec 2015 08:51:12 -0500 Subject: [PATCH 0749/1015] udp: properly support MSG_PEEK with truncated buffers Backport of this upstream commit into stable kernels : 89c22d8c3b27 ("net: Fix skb csum races when peeking") exposed a bug in udp stack vs MSG_PEEK support, when user provides a buffer smaller than skb payload. In this case, skb_copy_and_csum_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov); returns -EFAULT. This bug does not happen in upstream kernels since Al Viro did a great job to replace this into : skb_copy_and_csum_datagram_msg(skb, sizeof(struct udphdr), msg); This variant is safe vs short buffers. For the time being, instead reverting Herbert Xu patch and add back skb->ip_summed invalid changes, simply store the result of udp_lib_checksum_complete() so that we avoid computing the checksum a second time, and avoid the problematic skb_copy_and_csum_datagram_iovec() call. This patch can be applied on recent kernels as it avoids a double checksumming, then backported to stable kernels as a bug fix. Signed-off-by: Eric Dumazet Acked-by: Herbert Xu Signed-off-by: David S. Miller [d-cagle@codeaurora.org: Resolve trivial merge conflicts] Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git Git-commit: 197c949e7798fbf28cfadc69d9ca0c2abbf93191 Change-Id: I70f19a362f627bd2d9d8e10e31bbcdb4b0600792 Signed-off-by: Dennis Cagle --- net/ipv4/udp.c | 6 ++++-- net/ipv6/udp.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 44a7c83d1a363..9f8f9ae5e36d1 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1258,6 +1258,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, int peeked, off = 0; int err; int is_udplite = IS_UDPLITE(sk); + bool checksum_valid = false; bool slow; if (flags & MSG_ERRQUEUE) @@ -1283,11 +1284,12 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, */ if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) { - if (udp_lib_checksum_complete(skb)) + checksum_valid = !udp_lib_checksum_complete(skb); + if (!checksum_valid) goto csum_copy_err; } - if (skb_csum_unnecessary(skb)) + if (checksum_valid || skb_csum_unnecessary(skb)) err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov, copied); else { diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 978641648951e..c48441d67d491 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -388,6 +388,7 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, int peeked, off = 0; int err; int is_udplite = IS_UDPLITE(sk); + bool checksum_valid = false; int is_udp4; bool slow; @@ -419,11 +420,12 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, */ if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) { - if (udp_lib_checksum_complete(skb)) + checksum_valid = !udp_lib_checksum_complete(skb); + if (!checksum_valid) goto csum_copy_err; } - if (skb_csum_unnecessary(skb)) + if (checksum_valid || skb_csum_unnecessary(skb)) err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov, copied); else { From 0f598753e1434ce15233b203cc4da66747f7e040 Mon Sep 17 00:00:00 2001 From: Daniel Rosenberg Date: Fri, 3 Feb 2017 20:37:06 -0800 Subject: [PATCH 0750/1015] ANDROID: ion: Protect kref from userspace manipulation This separates the kref for ion handles into two components. Userspace requests through the ioctl will hold at most one reference to the internally used kref. All additional requests will increment a separate counter, and the original reference is only put once that counter hits 0. This protects the kernel from a poorly behaving userspace. Bug: 34276203 Change-Id: Ibc36bc4405788ed0fea7337b541cad3be2b934c0 Signed-off-by: Daniel Rosenberg Git-repo: https://android.googlesource.com/kernel/msm/ Git-commit: 20abfcc16884a5af973a5e91dd013ddd789c44f4 [d-cagle@codeaurora.org: Resolve style issues] Signed-off-by: Dennis Cagle --- drivers/staging/android/ion/ion.c | 84 ++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index 73fc9fd4c3e82..7dd9b9037dc8e 100755 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -114,6 +114,7 @@ struct ion_client { */ struct ion_handle { struct kref ref; + unsigned int user_ref_count; struct ion_client *client; struct ion_buffer *buffer; struct rb_node node; @@ -437,6 +438,49 @@ int ion_handle_put(struct ion_handle *handle) return ret; } +/* Must hold the client lock */ +static void user_ion_handle_get(struct ion_handle *handle) +{ + if (handle->user_ref_count++ == 0) + kref_get(&handle->ref); +} + +/* Must hold the client lock */ +static struct ion_handle *user_ion_handle_get_check_overflow( + struct ion_handle *handle) +{ + if (handle->user_ref_count + 1 == 0) + return ERR_PTR(-EOVERFLOW); + user_ion_handle_get(handle); + return handle; +} + +/* passes a kref to the user ref count. + * We know we're holding a kref to the object before and + * after this call, so no need to reverify handle. */ +static struct ion_handle *pass_to_user(struct ion_handle *handle) +{ + struct ion_client *client = handle->client; + struct ion_handle *ret; + + mutex_lock(&client->lock); + ret = user_ion_handle_get_check_overflow(handle); + ion_handle_put_nolock(handle); + mutex_unlock(&client->lock); + return ret; +} + +/* Must hold the client lock */ +static int user_ion_handle_put_nolock(struct ion_handle *handle) +{ + int ret; + + if (--handle->user_ref_count == 0) + ret = ion_handle_put_nolock(handle); + + return ret; +} + static struct ion_handle *ion_handle_lookup(struct ion_client *client, struct ion_buffer *buffer) { @@ -648,6 +692,25 @@ static void ion_free_nolock(struct ion_client *client, struct ion_handle *handle ion_handle_put_nolock(handle); } +static void user_ion_free_nolock(struct ion_client *client, + struct ion_handle *handle) +{ + bool valid_handle; + + BUG_ON(client != handle->client); + + valid_handle = ion_handle_validate(client, handle); + if (!valid_handle) { + WARN(1, "%s: invalid handle passed to free.\n", __func__); + return; + } + if (!handle->user_ref_count > 0) { + WARN(1, "%s: User does not have access!\n", __func__); + return; + } + user_ion_handle_put_nolock(handle); +} + void ion_free(struct ion_client *client, struct ion_handle *handle) { BUG_ON(client != handle->client); @@ -1513,7 +1576,7 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) data.allocation.flags, true); if (IS_ERR(handle)) return PTR_ERR(handle); - + pass_to_user(handle); data.allocation.handle = handle->id; cleanup_handle = handle; @@ -1529,7 +1592,7 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) mutex_unlock(&client->lock); return PTR_ERR(handle); } - ion_free_nolock(client, handle); + user_ion_free_nolock(client, handle); ion_handle_put_nolock(handle); mutex_unlock(&client->lock); break; @@ -1553,10 +1616,15 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) struct ion_handle *handle; handle = ion_import_dma_buf(client, data.fd.fd); - if (IS_ERR(handle)) + if (IS_ERR(handle)) { ret = PTR_ERR(handle); - else - data.handle.handle = handle->id; + } else { + handle = pass_to_user(handle); + if (IS_ERR(handle)) + ret = PTR_ERR(handle); + else + data.handle.handle = handle->id; + } break; } case ION_IOC_SYNC: @@ -1588,8 +1656,10 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) if (dir & _IOC_READ) { if (copy_to_user((void __user *)arg, &data, _IOC_SIZE(cmd))) { if (cleanup_handle) { - ion_free(client, cleanup_handle); - ion_handle_put(cleanup_handle); + mutex_lock(&client->lock); + user_ion_free_nolock(client, cleanup_handle); + ion_handle_put_nolock(cleanup_handle); + mutex_unlock(&client->lock); } return -EFAULT; } From 8a98b495b7ac39451878dccf02ce8480450748b5 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Mon, 19 Sep 2016 17:39:09 +0200 Subject: [PATCH 0751/1015] posix_acl: Clear SGID bit when setting file permissions When file permissions are modified via chmod(2) and the user is not in the owning group or capable of CAP_FSETID, the setgid bit is cleared in inode_change_ok(). Setting a POSIX ACL via setxattr(2) sets the file permissions as well as the new ACL, but doesn't clear the setgid bit in a similar way; this allows to bypass the check in chmod(2). Fix that. References: CVE-2016-7097 Reviewed-by: Christoph Hellwig Reviewed-by: Jeff Layton Signed-off-by: Jan Kara Signed-off-by: Andreas Gruenbacher Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/ linux.git Git-commit: 073931017b49d9458aa351605b43a7e34598caef Change-Id: Idf7cd8d0fb030fedeabd46254e4c4a9c08bce8b5 [d-cagle@codeaurora.org: Resolve merge conflicts and style] Signed-off-by: Dennis Cagle --- fs/9p/acl.c | 41 +++++++++++++++++---------------------- fs/btrfs/acl.c | 7 +++---- fs/ceph/acl.c | 6 ++---- fs/ext2/acl.c | 13 +++++-------- fs/ext4/acl.c | 13 +++++-------- fs/f2fs/acl.c | 7 +++---- fs/gfs2/acl.c | 12 +++--------- fs/hfsplus/posix_acl.c | 5 +++-- fs/jffs2/acl.c | 9 ++++----- fs/jfs/acl.c | 6 ++---- fs/ocfs2/acl.c | 8 ++++---- fs/posix_acl.c | 31 +++++++++++++++++++++++++++++ fs/reiserfs/xattr_acl.c | 9 +++------ fs/xfs/xfs_acl.c | 13 ++++--------- include/linux/posix_acl.h | 2 ++ 15 files changed, 92 insertions(+), 90 deletions(-) diff --git a/fs/9p/acl.c b/fs/9p/acl.c index 8482f2d116066..5cffa5169c973 100644 --- a/fs/9p/acl.c +++ b/fs/9p/acl.c @@ -320,32 +320,27 @@ static int v9fs_xattr_set_acl(struct dentry *dentry, const char *name, case ACL_TYPE_ACCESS: name = POSIX_ACL_XATTR_ACCESS; if (acl) { - umode_t mode = inode->i_mode; - retval = posix_acl_equiv_mode(acl, &mode); - if (retval < 0) + struct iattr iattr; + + retval = posix_acl_update_mode(inode, + &iattr.ia_mode, &acl); + if (retval) goto err_out; - else { - struct iattr iattr; - if (retval == 0) { - /* - * ACL can be represented - * by the mode bits. So don't - * update ACL. - */ - acl = NULL; - value = NULL; - size = 0; - } - /* Updte the mode bits */ - iattr.ia_mode = ((mode & S_IALLUGO) | - (inode->i_mode & ~S_IALLUGO)); - iattr.ia_valid = ATTR_MODE; - /* FIXME should we update ctime ? - * What is the following setxattr update the - * mode ? + if (!acl) { + /* + * ACL can be represented + * by the mode bits. So don't + * update ACL. */ - v9fs_vfs_setattr_dotl(dentry, &iattr); + value = NULL; + size = 0; } + iattr.ia_valid = ATTR_MODE; + /* FIXME should we update ctime ? + * What is the following setxattr update the + * mode ? + */ + v9fs_vfs_setattr_dotl(dentry, &iattr); } break; case ACL_TYPE_DEFAULT: diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index 9a0124a958510..664d50579fcf9 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c @@ -83,11 +83,10 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans, case ACL_TYPE_ACCESS: name = POSIX_ACL_XATTR_ACCESS; if (acl) { - ret = posix_acl_equiv_mode(acl, &inode->i_mode); - if (ret < 0) + ret = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (ret) return ret; - if (ret == 0) - acl = NULL; } ret = 0; break; diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c index 5bd853ba44ffc..6a4a3e2a46cf2 100644 --- a/fs/ceph/acl.c +++ b/fs/ceph/acl.c @@ -108,11 +108,9 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type) case ACL_TYPE_ACCESS: name = POSIX_ACL_XATTR_ACCESS; if (acl) { - ret = posix_acl_equiv_mode(acl, &new_mode); - if (ret < 0) + ret = posix_acl_update_mode(inode, &new_mode, &acl); + if (ret) goto out; - if (ret == 0) - acl = NULL; } break; case ACL_TYPE_DEFAULT: diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c index 27695e6f4e466..ec67e1a6dbeb0 100644 --- a/fs/ext2/acl.c +++ b/fs/ext2/acl.c @@ -193,15 +193,12 @@ ext2_set_acl(struct inode *inode, struct posix_acl *acl, int type) case ACL_TYPE_ACCESS: name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS; if (acl) { - error = posix_acl_equiv_mode(acl, &inode->i_mode); - if (error < 0) + error = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (error) return error; - else { - inode->i_ctime = CURRENT_TIME_SEC; - mark_inode_dirty(inode); - if (error == 0) - acl = NULL; - } + inode->i_ctime = CURRENT_TIME_SEC; + mark_inode_dirty(inode); } break; diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c index d40c8dbbb0d66..90c3a50104555 100644 --- a/fs/ext4/acl.c +++ b/fs/ext4/acl.c @@ -201,15 +201,12 @@ __ext4_set_acl(handle_t *handle, struct inode *inode, int type, case ACL_TYPE_ACCESS: name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS; if (acl) { - error = posix_acl_equiv_mode(acl, &inode->i_mode); - if (error < 0) + error = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (error) return error; - else { - inode->i_ctime = ext4_current_time(inode); - ext4_mark_inode_dirty(handle, inode); - if (error == 0) - acl = NULL; - } + inode->i_ctime = ext4_current_time(inode); + ext4_mark_inode_dirty(handle, inode); } break; diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c index 83b9b5a8d1120..9151e70348dcd 100644 --- a/fs/f2fs/acl.c +++ b/fs/f2fs/acl.c @@ -207,12 +207,11 @@ static int __f2fs_set_acl(struct inode *inode, int type, case ACL_TYPE_ACCESS: name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS; if (acl) { - error = posix_acl_equiv_mode(acl, &inode->i_mode); - if (error < 0) + error = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (error) return error; set_acl_inode(fi, inode->i_mode); - if (error == 0) - acl = NULL; } break; diff --git a/fs/gfs2/acl.c b/fs/gfs2/acl.c index 7b3143064af11..88e66aa516c47 100644 --- a/fs/gfs2/acl.c +++ b/fs/gfs2/acl.c @@ -79,17 +79,11 @@ int gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) if (type == ACL_TYPE_ACCESS) { umode_t mode = inode->i_mode; - error = posix_acl_equiv_mode(acl, &mode); - if (error < 0) + error = posix_acl_update_mode(inode, &inode->i_mode, &acl); + if (error) return error; - - if (error == 0) - acl = NULL; - - if (mode != inode->i_mode) { - inode->i_mode = mode; + if (mode != inode->i_mode) mark_inode_dirty(inode); - } } if (acl) { diff --git a/fs/hfsplus/posix_acl.c b/fs/hfsplus/posix_acl.c index df0c9af68d05e..6c71990020264 100644 --- a/fs/hfsplus/posix_acl.c +++ b/fs/hfsplus/posix_acl.c @@ -68,8 +68,9 @@ int hfsplus_set_posix_acl(struct inode *inode, struct posix_acl *acl, case ACL_TYPE_ACCESS: xattr_name = POSIX_ACL_XATTR_ACCESS; if (acl) { - err = posix_acl_equiv_mode(acl, &inode->i_mode); - if (err < 0) + err = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (err) return err; } err = 0; diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c index 2f7a3c0904899..f9f86f87d32b8 100644 --- a/fs/jffs2/acl.c +++ b/fs/jffs2/acl.c @@ -235,9 +235,10 @@ int jffs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) case ACL_TYPE_ACCESS: xprefix = JFFS2_XPREFIX_ACL_ACCESS; if (acl) { - umode_t mode = inode->i_mode; - rc = posix_acl_equiv_mode(acl, &mode); - if (rc < 0) + umode_t mode; + + rc = posix_acl_update_mode(inode, &mode, &acl); + if (rc) return rc; if (inode->i_mode != mode) { struct iattr attr; @@ -249,8 +250,6 @@ int jffs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) if (rc < 0) return rc; } - if (rc == 0) - acl = NULL; } break; case ACL_TYPE_DEFAULT: diff --git a/fs/jfs/acl.c b/fs/jfs/acl.c index 0c8ca830b113e..9fad9f4fe8830 100644 --- a/fs/jfs/acl.c +++ b/fs/jfs/acl.c @@ -84,13 +84,11 @@ static int __jfs_set_acl(tid_t tid, struct inode *inode, int type, case ACL_TYPE_ACCESS: ea_name = POSIX_ACL_XATTR_ACCESS; if (acl) { - rc = posix_acl_equiv_mode(acl, &inode->i_mode); - if (rc < 0) + rc = posix_acl_update_mode(inode, &inode->i_mode, &acl); + if (rc) return rc; inode->i_ctime = CURRENT_TIME; mark_inode_dirty(inode); - if (rc == 0) - acl = NULL; } break; case ACL_TYPE_DEFAULT: diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c index 7e8282dcea2a9..b3600c705528a 100644 --- a/fs/ocfs2/acl.c +++ b/fs/ocfs2/acl.c @@ -241,9 +241,10 @@ int ocfs2_set_acl(handle_t *handle, case ACL_TYPE_ACCESS: name_index = OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS; if (acl) { - umode_t mode = inode->i_mode; - ret = posix_acl_equiv_mode(acl, &mode); - if (ret < 0) + umode_t mode; + + ret = posix_acl_update_mode(inode, &mode, &acl); + if (ret) return ret; else { if (ret == 0) @@ -253,7 +254,6 @@ int ocfs2_set_acl(handle_t *handle, handle, mode); if (ret) return ret; - } } break; diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 0855f772cd415..73aad912314e2 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -594,6 +594,37 @@ posix_acl_create(struct inode *dir, umode_t *mode, } EXPORT_SYMBOL_GPL(posix_acl_create); +/** + * posix_acl_update_mode - update mode in set_acl + * + * Update the file mode when setting an ACL: compute the new file permission + * bits based on the ACL. In addition, if the ACL is equivalent to the new + * file mode, set *acl to NULL to indicate that no ACL should be set. + * + * As with chmod, clear the setgit bit if the caller is not in the owning group + * or capable of CAP_FSETID (see inode_change_ok). + * + * Called from set_acl inode operations. + */ +int posix_acl_update_mode(struct inode *inode, umode_t *mode_p, + struct posix_acl **acl) +{ + umode_t mode = inode->i_mode; + int error; + + error = posix_acl_equiv_mode(*acl, &mode); + if (error < 0) + return error; + if (error == 0) + *acl = NULL; + if (!in_group_p(inode->i_gid) && + !capable_wrt_inode_uidgid(inode, CAP_FSETID)) + mode &= ~S_ISGID; + *mode_p = mode; + return 0; +} +EXPORT_SYMBOL(posix_acl_update_mode); + /* * Fix up the uids and gids in posix acl extended attributes in place. */ diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c index 4b34b9dc03dda..97c462e0178c3 100644 --- a/fs/reiserfs/xattr_acl.c +++ b/fs/reiserfs/xattr_acl.c @@ -246,13 +246,10 @@ __reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, case ACL_TYPE_ACCESS: name = POSIX_ACL_XATTR_ACCESS; if (acl) { - error = posix_acl_equiv_mode(acl, &inode->i_mode); - if (error < 0) + error = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (error) return error; - else { - if (error == 0) - acl = NULL; - } } break; case ACL_TYPE_DEFAULT: diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index a65fa5dde6e9c..e0406717edbc6 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -286,16 +286,11 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) return error; if (type == ACL_TYPE_ACCESS) { - umode_t mode = inode->i_mode; - error = posix_acl_equiv_mode(acl, &mode); - - if (error <= 0) { - acl = NULL; - - if (error < 0) - return error; - } + umode_t mode; + error = posix_acl_update_mode(inode, &mode, &acl); + if (error) + return error; error = xfs_set_mode(inode, mode); if (error) return error; diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 3e96a6a761033..33ddf915462e5 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h @@ -95,6 +95,8 @@ extern int set_posix_acl(struct inode *, int, struct posix_acl *); extern int posix_acl_chmod(struct inode *, umode_t); extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **, struct posix_acl **); +extern int posix_acl_update_mode(struct inode *, umode_t *, + struct posix_acl **); extern int simple_set_acl(struct inode *, struct posix_acl *, int); extern int simple_acl_create(struct inode *, struct inode *); From 4ab38419aa4132878b89d3f24648345f116662c3 Mon Sep 17 00:00:00 2001 From: Cong Wang Date: Tue, 13 Dec 2016 10:33:34 -0800 Subject: [PATCH 0752/1015] FROMLIST: 9p: fix a potential acl leak (https://lkml.org/lkml/2016/12/13/579) posix_acl_update_mode() could possibly clear 'acl', if so we leak the memory pointed by 'acl'. Save this pointer before calling posix_acl_update_mode() and release the memory if 'acl' really gets cleared. Reported-by: Mark Salyzyn Reviewed-by: Jan Kara Reviewed-by: Greg Kurz Cc: Eric Van Hensbergen Cc: Ron Minnich Cc: Latchesar Ionkov Signed-off-by: Cong Wang Bug: 32458736 Change-Id: Ia78da401e6fd1bfd569653bd2cd0ebd3f9c737a0 Git-repo: https://android.googlesource.com/kernel/msm/ Git-commit: 7c780387c931f63fe67830c817f65c1272512bb1 Signed-off-by: Dennis Cagle --- fs/9p/acl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/9p/acl.c b/fs/9p/acl.c index 5cffa5169c973..9ebe8d5c0c20a 100644 --- a/fs/9p/acl.c +++ b/fs/9p/acl.c @@ -321,6 +321,7 @@ static int v9fs_xattr_set_acl(struct dentry *dentry, const char *name, name = POSIX_ACL_XATTR_ACCESS; if (acl) { struct iattr iattr; + struct posix_acl *old_acl = acl; retval = posix_acl_update_mode(inode, &iattr.ia_mode, &acl); @@ -332,6 +333,7 @@ static int v9fs_xattr_set_acl(struct dentry *dentry, const char *name, * by the mode bits. So don't * update ACL. */ + posix_acl_release(old_acl); value = NULL; size = 0; } From c9fc44b7c4565418215917cb1056cace6ec7ae32 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Mon, 23 Jan 2017 12:56:41 -0800 Subject: [PATCH 0753/1015] ANDROID: fix acl leaks Fixes regressions associated with commit 073931017b49d9458aa351605b43a7e34598caef Signed-off-by: Mark Salyzyn Bug: 32458736 Change-Id: I6ee127dfdf3594d24ccd8560541ac554c5b05eb6 [d-cagle@codeaurora.org: Resolve merge conflicts] Git-repo: https://android.googlesource.com/kernel/msm/ Git-commit: 74d0e4d3d96d0ca82d39635318a69d55e966b767 Signed-off-by: Dennis Cagle --- fs/gfs2/acl.c | 5 ++++- fs/xfs/xfs_acl.c | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/gfs2/acl.c b/fs/gfs2/acl.c index 88e66aa516c47..6282f3de36e64 100644 --- a/fs/gfs2/acl.c +++ b/fs/gfs2/acl.c @@ -78,8 +78,11 @@ int gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) if (type == ACL_TYPE_ACCESS) { umode_t mode = inode->i_mode; - + struct posix_acl *old_acl = acl; error = posix_acl_update_mode(inode, &inode->i_mode, &acl); + + if (!acl) + posix_acl_release(old_acl); if (error) return error; if (mode != inode->i_mode) diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index e0406717edbc6..c5bda4bf69c70 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -287,8 +287,10 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) if (type == ACL_TYPE_ACCESS) { umode_t mode; - + struct posix_acl *old_acl = acl; error = posix_acl_update_mode(inode, &mode, &acl); + if (!acl) + posix_acl_release(old_acl); if (error) return error; error = xfs_set_mode(inode, mode); From e0726342d9a3393c5ab6fa8ca141c1fed9392421 Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Fri, 17 Mar 2017 18:56:18 +0530 Subject: [PATCH 0754/1015] mmc: queue: Remove BUG_ON() in cmdq_thread If any discard requests fails, the mmc driver should not cause kernel panic. The error handling and informing block layer about error will be done by completion context. Change-Id: I0c88ad851ad12c392a557bcb94d3b21dfc62d1f8 Signed-off-by: Vijay Viswanath --- drivers/mmc/card/queue.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index f3ac99d7b7ebd..ef71d57a08c65 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c @@ -127,14 +127,11 @@ static int mmc_cmdq_thread(void *d) ret = mq->cmdq_issue_fn(mq, mq->cmdq_req_peeked); /* - * Don't requeue if issue_fn fails, just bug on. - * We don't expect failure here and there is no recovery other - * than fixing the actual issue if there is any. + * Don't requeue if issue_fn fails. + * Recovery will be come by completion softirq * Also we end the request if there is a partition switch error, * so we should not requeue the request here. */ - if (ret) - BUG_ON(1); } /* loop */ return 0; From 8812c0db4fdabb5c2d52304bb267cf13b2b93b4d Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Thu, 27 Apr 2017 15:09:45 +0530 Subject: [PATCH 0755/1015] mmc: cmdq_hci: Avoid releasing clock twice during DCMD error When erase DCMD commands fail, a completion notification may get raised by host controller for the task in addition to error interrupt. This can result in the done function of mmc request getting called twice and release the clock twice and mess up the clock request counter. The done function should be called only once for DCMD commands except flush commands. Change-Id: Ie3a96e48ca98872cf686049eb5caa060f143f9cb Signed-off-by: Vijay Viswanath --- drivers/mmc/host/cmdq_hci.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/host/cmdq_hci.c b/drivers/mmc/host/cmdq_hci.c index 87df7c102ecff..b759613efe2c8 100644 --- a/drivers/mmc/host/cmdq_hci.c +++ b/drivers/mmc/host/cmdq_hci.c @@ -942,12 +942,17 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) * before setting doorbell, hence one is not needed here. */ for_each_set_bit(tag, &comp_status, cq_host->num_slots) { - /* complete the corresponding mrq */ - pr_debug("%s: completing tag -> %lu\n", - mmc_hostname(mmc), tag); - MMC_TRACE(mmc, "%s: completing tag -> %lu\n", - __func__, tag); + mrq = get_req_by_tag(cq_host, tag); + if (!((mrq->cmd && mrq->cmd->error) || + mrq->cmdq_req->resp_err || + (mrq->data && mrq->data->error))) { + /* complete the corresponding mrq */ + pr_debug("%s: completing tag -> %lu\n", + mmc_hostname(mmc), tag); + MMC_TRACE(mmc, "%s: completing tag -> %lu\n", + __func__, tag); cmdq_finish_data(mmc, tag); + } } } From 8dc6f45625620360685e1841613bb4f4a04df12d Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Tue, 21 Feb 2017 11:35:37 -0800 Subject: [PATCH 0756/1015] crypto: msm: check invalid src and dst vbuf in qcedev.c src and dst vbuf address and length are provided from userspace, and they are invalid if vbuf address is NULL but length is not zero. Add additional checks in qcedev_check_cipher_params to prevent it. Change-Id: Iadc1a0c1c5b2f7a56acd03a23c08e45b5a671b19 Signed-off-by: Zhen Kong --- drivers/crypto/msm/qcedev.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index 50e67b5db0e7a..2a539d80385de 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -1491,6 +1491,11 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, } /* Check for sum of all dst length is equal to data_len */ for (i = 0, total = 0; i < req->entries; i++) { + if (!req->vbuf.dst[i].vaddr && req->vbuf.dst[i].len) { + pr_err("%s: NULL req dst vbuf[%d] with length %d\n", + __func__, i, req->vbuf.dst[i].len); + goto error; + } if (req->vbuf.dst[i].len >= U32_MAX - total) { pr_err("%s: Integer overflow on total req dst vbuf length\n", __func__); @@ -1505,6 +1510,11 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, } /* Check for sum of all src length is equal to data_len */ for (i = 0, total = 0; i < req->entries; i++) { + if (!req->vbuf.src[i].vaddr && req->vbuf.src[i].len) { + pr_err("%s: NULL req src vbuf[%d] with length %d\n", + __func__, i, req->vbuf.src[i].len); + goto error; + } if (req->vbuf.src[i].len > U32_MAX - total) { pr_err("%s: Integer overflow on total req src vbuf length\n", __func__); From 28e1c1cb4f0839cecc5ed28c178f1f6fd253667c Mon Sep 17 00:00:00 2001 From: Siba Prasad Date: Thu, 27 Apr 2017 20:05:30 +0530 Subject: [PATCH 0757/1015] mmc: card: block: check the user controlled parameters to avoid overflow According to specs, some commands require a delay after issuing the command. idata->ic struct is received from user in mmc_blk_ioctl_cmd(). So idata->ic.postsleep_min_us, idata->ic.postsleep_max_us are user controlled. If the min and max values are set such as max < min, then operation in the function do_usleep_range will overflow. For avoiding this, put a condition for checking max < min. If the condition is true, then print the error message with respective values and return error. Change-Id: I3722b8527a7caa6a76dafb9fd23187e77f2478ee Signed-off-by: Siba Prasad --- drivers/mmc/card/block.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 2c7bd98b067dc..eb54463893c89 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -620,6 +620,15 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, idata = mmc_blk_ioctl_copy_from_user(ic_ptr); if (IS_ERR_OR_NULL(idata)) return PTR_ERR(idata); + if (idata->ic.postsleep_max_us < idata->ic.postsleep_min_us) { + pr_err("%s: min value: %u must not be greater than max value: %u\n", + __func__, idata->ic.postsleep_min_us, + idata->ic.postsleep_max_us); + WARN_ON(1); + err = -EPERM; + goto cmd_err; + } + md = mmc_blk_get(bdev->bd_disk); if (!md) { err = -EINVAL; From 838df261432e32b6ff44bdc9026eaa8a69fb60a0 Mon Sep 17 00:00:00 2001 From: Alok Kediya Date: Thu, 2 Mar 2017 14:06:06 +0530 Subject: [PATCH 0758/1015] msm: camera: Prevent info leak in kernel driver. -Use %pK for kernel address to avoid the information leak. CRs-Fixed: 2009672 Change-Id: Ib0631d5578aba033510babe4f43e2a63bb959747 Signed-off-by: Alok Kediya --- .../platform/msm/camera_v2/isp/msm_buf_mgr.c | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c index cf3af6396972b..583e3f67ad413 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c @@ -212,8 +212,8 @@ static int msm_isp_prepare_v4l2_buf(struct msm_isp_buf_mgr *buf_mgr, mapped_info->paddr += accu_length; accu_length += qbuf_buf->planes[i].length; - CDBG("%s: plane: %d addr:%lu\n", - __func__, i, (unsigned long)mapped_info->paddr); + CDBG("%s: plane: %d addr:%pK\n", + __func__, i, (void *)mapped_info->paddr); } buf_info->num_planes = qbuf_buf->num_planes; @@ -282,8 +282,8 @@ static int msm_isp_map_buf(struct msm_isp_buf_mgr *buf_mgr, pr_err_ratelimited("%s: cannot map address", __func__); goto smmu_map_error; } - CDBG("%s: addr:%lu\n", - __func__, (unsigned long)mapped_info->paddr); + CDBG("%s: addr:%pK\n", + __func__, (void *)mapped_info->paddr); return rc; smmu_map_error: @@ -1326,14 +1326,15 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr, struct msm_isp_buffer *bufs = NULL; uint32_t i = 0, j = 0, k = 0, rc = 0; char *print_buf = NULL, temp_buf[100]; - uint32_t start_addr = 0, end_addr = 0, print_buf_size = 2000; + uint32_t print_buf_size = 2000; + unsigned long start_addr = 0, end_addr = 0; int buf_addr_delta = -1; int temp_delta = 0; uint32_t debug_stream_id = 0; uint32_t debug_buf_idx = 0; uint32_t debug_buf_plane = 0; - uint32_t debug_start_addr = 0; - uint32_t debug_end_addr = 0; + unsigned long debug_start_addr = 0; + unsigned long debug_end_addr = 0; uint32_t debug_frame_id = 0; enum msm_isp_buffer_state debug_state = MSM_ISP_BUFFER_STATE_UNUSED; unsigned long flags; @@ -1392,8 +1393,8 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr, debug_stream_id, debug_frame_id); pr_err("%s: nearby buf index %d, plane %d, state %d\n", __func__, debug_buf_idx, debug_buf_plane, debug_state); - pr_err("%s: buf address 0x%x -- 0x%x\n", __func__, - debug_start_addr, debug_end_addr); + pr_err("%s: buf address %pK -- %pK\n", __func__, + (void *)debug_start_addr, (void *)debug_end_addr); if (BUF_DEBUG_FULL) { print_buf = kzalloc(print_buf_size, GFP_ATOMIC); @@ -1428,9 +1429,10 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr, mapped_info[k].len; snprintf(temp_buf, sizeof(temp_buf), - " buf %d plane %d start_addr %x end_addr %x\n", - j, k, start_addr, - end_addr); + " buf %d plane %d start_addr %pK end_addr %pK\n", + j, k, + (void *)start_addr, + (void *)end_addr); strlcat(print_buf, temp_buf, print_buf_size); } From 98d58c75d63bf63bd7b48eae639f8c4255057e12 Mon Sep 17 00:00:00 2001 From: Avaneesh Kumar Dwivedi Date: Fri, 17 Mar 2017 16:41:13 +0530 Subject: [PATCH 0759/1015] soc: qcom: Skip clearing modem FW region post load failure In existing implementation, we are clearing fw region when loading fails midway. This is not in consonance with MBA design so differentiate between modem and other PIL modules. While at it, rectify the data type of subsys_state in qmi_client_info as well. Change-Id: I985456fca42346947eac24df5bf66599dcbf4c53 Signed-off-by: Avaneesh Kumar Dwivedi Signed-off-by: Srinivasarao P --- drivers/soc/qcom/peripheral-loader.c | 3 ++- drivers/soc/qcom/peripheral-loader.h | 4 +++- drivers/soc/qcom/pil-q6v5.c | 3 ++- drivers/soc/qcom/subsys-pil-tz.c | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 2d73ca96c2726..4edad39970504 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -913,7 +913,8 @@ int pil_boot(struct pil_desc *desc) &desc->attrs); priv->region = NULL; } - pil_clear_segment(desc); + if (desc->clear_fw_region) + pil_clear_segment(desc); pil_release_mmap(desc); } return ret; diff --git a/drivers/soc/qcom/peripheral-loader.h b/drivers/soc/qcom/peripheral-loader.h index 802abe26a9606..b0c83150dad9d 100644 --- a/drivers/soc/qcom/peripheral-loader.h +++ b/drivers/soc/qcom/peripheral-loader.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -38,6 +38,7 @@ struct pil_priv; * @shutdown_fail: Set if PIL op for shutting down subsystem fails. * @modem_ssr: true if modem is restarting, false if booting for first time. * @subsys_vmid: memprot id for the subsystem. + * @clear_fw_region: Clear fw region on failure in loading. */ struct pil_desc { const char *name; @@ -57,6 +58,7 @@ struct pil_desc { bool shutdown_fail; bool modem_ssr; u32 subsys_vmid; + bool clear_fw_region; }; /** diff --git a/drivers/soc/qcom/pil-q6v5.c b/drivers/soc/qcom/pil-q6v5.c index f96bd81c4d42f..fa6566c94bd22 100644 --- a/drivers/soc/qcom/pil-q6v5.c +++ b/drivers/soc/qcom/pil-q6v5.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -584,6 +584,7 @@ struct q6v5_data *pil_q6v5_init(struct platform_device *pdev) if (ret) return ERR_PTR(ret); + desc->clear_fw_region = false; desc->dev = &pdev->dev; drv->qdsp6v5_2_0 = of_device_is_compatible(pdev->dev.of_node, diff --git a/drivers/soc/qcom/subsys-pil-tz.c b/drivers/soc/qcom/subsys-pil-tz.c index 19a306d40511d..c8d6150494879 100644 --- a/drivers/soc/qcom/subsys-pil-tz.c +++ b/drivers/soc/qcom/subsys-pil-tz.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1000,6 +1000,7 @@ static int pil_tz_driver_probe(struct platform_device *pdev) d->desc.ops = &pil_ops_trusted; d->desc.proxy_timeout = PROXY_TIMEOUT_MS; + d->desc.clear_fw_region = true; rc = of_property_read_u32(pdev->dev.of_node, "qcom,proxy-timeout-ms", &proxy_timeout); From 86e5f06e101197063fa309a0cc651fb729a83fdf Mon Sep 17 00:00:00 2001 From: Kishor PK Date: Thu, 30 Mar 2017 14:23:37 +0530 Subject: [PATCH 0760/1015] soc: qcom: pil: Avoid possible buffer overflow during Modem boot Buffer overflow can occur if MBA firmware size exceeds 1MB. So validate size before copying the firmware. Change-Id: I2d5ffc1b9c6db7fd978cb1e4dbd07d283b186a80 CRs-Fixed: 2001803 Signed-off-by: Kishor PK --- drivers/soc/qcom/pil-msa.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/soc/qcom/pil-msa.c b/drivers/soc/qcom/pil-msa.c index 4eb59ed549628..a61ecc14dc2d5 100644 --- a/drivers/soc/qcom/pil-msa.c +++ b/drivers/soc/qcom/pil-msa.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -595,7 +595,15 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) /* Load the MBA image into memory */ count = fw->size; - memcpy(mba_dp_virt, data, count); + if (count <= SZ_1M) { + /* Ensures memcpy is done for max 1MB fw size */ + memcpy(mba_dp_virt, data, count); + } else { + dev_err(pil->dev, "%s fw image loading into memory is failed due to fw size overflow\n", + __func__); + ret = -EINVAL; + goto err_mba_data; + } /* Ensure memcpy of the MBA memory is done before loading the DP */ wmb(); From a3b381a3acb3b79969cb191915545ba11c0df6fa Mon Sep 17 00:00:00 2001 From: Shubhraprakash Das Date: Wed, 7 Dec 2016 15:25:27 -0800 Subject: [PATCH 0761/1015] msm: camera: isp: Check userspace parameters Check the user parameters passed to prevent buffer overflow. Change-Id: Ia8adc88d993db9e4314f3aa85ff5bbb6d7cef31e CRs-Fixed: 1097390 Signed-off-by: Shubhraprakash Das Signed-off-by: Meera Gande --- .../media/platform/msm/camera_v2/ispif/msm_ispif.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c index 4a1ea20192cba..649a363bc05dd 100644 --- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c +++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c @@ -132,7 +132,7 @@ static void msm_ispif_get_pack_mask_from_cfg( pack_mask[0] |= temp; CDBG("%s:num %d cid %d mode %d pack_mask %x %x\n", __func__, entry->num_cids, entry->cids[i], - pack_cfg[i].pack_mode, + pack_cfg[entry->cids[i]].pack_mode, pack_mask[0], pack_mask[1]); } @@ -164,6 +164,16 @@ static int msm_ispif_config2(struct ispif_device *ispif, return rc; } + for (i = 0; i < params->num; i++) { + int j; + + if (params->entries[i].num_cids > MAX_CID_CH_v2) + return -EINVAL; + for (j = 0; j < params->entries[i].num_cids; j++) + if (params->entries[i].cids[j] >= CID_MAX) + return -EINVAL; + } + for (i = 0; i < params->num; i++) { intftype = params->entries[i].intftype; vfe_intf = params->entries[i].vfe_intf; From 5f65969ef5d27295c3ab7b479ad3eb9e390b4976 Mon Sep 17 00:00:00 2001 From: Harsh Sahu Date: Thu, 16 Feb 2017 20:25:39 -0800 Subject: [PATCH 0762/1015] msm: mdss: Validating data values before passing on as operand mdss_mdp_dfps_update_params uses data as operand. Hence the values are validated against their max values allowed to avoid any overflow in this change. Change-Id: I630b9390a18446cd461154e31e08642a8ff06ed8 Signed-off-by: Harsh Sahu --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index dbbaef7efcb4f..2b9c15f6a5d6b 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -48,6 +48,12 @@ #define BUF_POOL_SIZE 32 +#define DFPS_DATA_MAX_HFP 8192 +#define DFPS_DATA_MAX_HBP 8192 +#define DFPS_DATA_MAX_HPW 8192 +#define DFPS_DATA_MAX_FPS 0x7fffffff +#define DFPS_DATA_MAX_CLK_RATE 250000 + static int mdss_mdp_overlay_free_fb_pipe(struct msm_fb_data_type *mfd); static int mdss_mdp_overlay_fb_parse_dt(struct msm_fb_data_type *mfd); static int mdss_mdp_overlay_off(struct msm_fb_data_type *mfd); @@ -3081,6 +3087,13 @@ static ssize_t dynamic_fps_sysfs_wta_dfps(struct device *dev, return count; } + if (data.hfp > DFPS_DATA_MAX_HFP || data.hbp > DFPS_DATA_MAX_HBP || + data.hpw > DFPS_DATA_MAX_HPW || data.fps > DFPS_DATA_MAX_FPS || + data.clk_rate > DFPS_DATA_MAX_CLK_RATE){ + pr_err("Data values out of bound.\n"); + return -EINVAL; + } + rc = mdss_mdp_dfps_update_params(mfd, pdata, &data); if (rc) { pr_err("failed to set dfps params\n"); From 2ada554f1f84b250e5606988fe0146db63839768 Mon Sep 17 00:00:00 2001 From: Avaneesh Kumar Dwivedi Date: Mon, 20 Mar 2017 15:53:15 +0530 Subject: [PATCH 0763/1015] soc: qcom: Do not clear segments if pil boot failed in memory allocation PIL boot failure if happened due to memory allocation failure then skip clearing segments as there is nothing loaded in fw region. Change-Id: If0c09dd47941be0d9fe42496db43365ece32f3e9 Signed-off-by: Avaneesh Kumar Dwivedi Signed-off-by: Srinivasarao P --- drivers/soc/qcom/peripheral-loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 4edad39970504..8bba4fc2404dd 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -913,7 +913,7 @@ int pil_boot(struct pil_desc *desc) &desc->attrs); priv->region = NULL; } - if (desc->clear_fw_region) + if (desc->clear_fw_region && priv->region_start) pil_clear_segment(desc); pil_release_mmap(desc); } From 0b4daa529e1da64ad5e412b6eb4664a8281ea99f Mon Sep 17 00:00:00 2001 From: Shadab Naseem Date: Tue, 11 Apr 2017 15:06:44 +0530 Subject: [PATCH 0764/1015] ARM: dts: msm: Add initial support for sdm450 Add initial set of device tree and board files to build the sdm450 target. Change-Id: I0aab674b761c2b5db4551c8d5b56b435384d0515 Signed-off-by: Shadab Naseem --- .../devicetree/bindings/arm/msm/msm.txt | 5 +++ arch/arm/boot/dts/qcom/Makefile | 4 +++ arch/arm/boot/dts/qcom/sdm450-cdp.dts | 23 +++++++++++++ arch/arm/boot/dts/qcom/sdm450-mtp.dts | 23 +++++++++++++ arch/arm/boot/dts/qcom/sdm450-rcm.dts | 23 +++++++++++++ arch/arm/boot/dts/qcom/sdm450.dtsi | 24 ++++++++++++++ arch/arm/mach-msm/Kconfig | 32 +++++++++++++++++++ arch/arm/mach-msm/Makefile | 1 + arch/arm/mach-msm/board-sdm450.c | 32 +++++++++++++++++++ arch/arm64/Kconfig | 8 +++++ drivers/soc/qcom/socinfo.c | 7 ++++ include/soc/qcom/socinfo.h | 4 +++ 12 files changed, 186 insertions(+) create mode 100644 arch/arm/boot/dts/qcom/sdm450-cdp.dts create mode 100644 arch/arm/boot/dts/qcom/sdm450-mtp.dts create mode 100644 arch/arm/boot/dts/qcom/sdm450-rcm.dts create mode 100644 arch/arm/boot/dts/qcom/sdm450.dtsi create mode 100644 arch/arm/mach-msm/board-sdm450.c diff --git a/Documentation/devicetree/bindings/arm/msm/msm.txt b/Documentation/devicetree/bindings/arm/msm/msm.txt index 057d37ab5b320..eece752a6709c 100644 --- a/Documentation/devicetree/bindings/arm/msm/msm.txt +++ b/Documentation/devicetree/bindings/arm/msm/msm.txt @@ -101,6 +101,9 @@ SoCs: - MSM8953 compatible = "qcom,msm8953" +- SDM450 + compatible = "qcom,sdm450" + - MSM8937 compatible = "qcom,msm8937" @@ -291,6 +294,8 @@ compatible = "qcom,msm8953-cdp" compatible = "qcom,msm8953-mtp" compatible = "qcom,msm8953-qrd" compatible = "qcom,msm8953-qrd-sku3" +compatible = "qcom,sdm450-cdp" +compatible = "qcom,sdm450-mtp" compatible = "qcom,mdm9640-cdp" compatible = "qcom,mdm9640-mtp" compatible = "qcom,mdm9640-rumi" diff --git a/arch/arm/boot/dts/qcom/Makefile b/arch/arm/boot/dts/qcom/Makefile index aea344c391a28..440682b22e391 100644 --- a/arch/arm/boot/dts/qcom/Makefile +++ b/arch/arm/boot/dts/qcom/Makefile @@ -225,6 +225,10 @@ dtb-$(CONFIG_ARCH_MSM8953) += msm8953-sim.dtb \ msm8953-iot-mtp.dtb \ apq8053-iot-mtp.dtb +dtb-$(CONFIG_ARCH_SDM450) += sdm450-rcm.dtb \ + sdm450-cdp.dtb \ + sdm450-mtp.dtb + dtb-$(CONFIG_ARCH_MDM9607) += mdm9607-rumi.dtb \ mdm9607-cdp.dtb \ mdm9607-mtp.dtb \ diff --git a/arch/arm/boot/dts/qcom/sdm450-cdp.dts b/arch/arm/boot/dts/qcom/sdm450-cdp.dts new file mode 100644 index 0000000000000..5ec13bcf80e41 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-cdp.dts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "sdm450.dtsi" +#include "msm8953-cdp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 CDP"; + compatible = "qcom,sdm450-cdp", "qcom,sdm450", "qcom,cdp"; + qcom,board-id= <1 0>; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-mtp.dts b/arch/arm/boot/dts/qcom/sdm450-mtp.dts new file mode 100644 index 0000000000000..b86c7e304b021 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-mtp.dts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "sdm450.dtsi" +#include "msm8953-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 MTP"; + compatible = "qcom,sdm450-mtp", "qcom,sdm450", "qcom,mtp"; + qcom,board-id= <8 0>; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-rcm.dts b/arch/arm/boot/dts/qcom/sdm450-rcm.dts new file mode 100644 index 0000000000000..1f96a2d2c4c7b --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-rcm.dts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "sdm450.dtsi" +#include "msm8953-cdp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 RCM"; + compatible = "qcom,sdm450-cdp", "qcom,sdm450", "qcom,cdp"; + qcom,board-id= <21 0>; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450.dtsi b/arch/arm/boot/dts/qcom/sdm450.dtsi new file mode 100644 index 0000000000000..9cabb44a8d184 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450.dtsi @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "skeleton64.dtsi" +#include "msm8953.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450"; + compatible = "qcom,sdm450"; + qcom,msm-id = <338 0x0>; + interrupt-parent = <&intc>; + + soc: soc { }; +}; diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig index a79e021c9008c..5ced75c31e8c5 100644 --- a/arch/arm/mach-msm/Kconfig +++ b/arch/arm/mach-msm/Kconfig @@ -254,6 +254,38 @@ config ARCH_MSM8953 select ARCH_WANT_KMAP_ATOMIC_FLUSH select ARCH_MSM8953_SOC_SETTINGS +config ARCH_SDM450 + bool "SDM450" + select MSM_CORTEX_A53 + select ARCH_MSM_CORTEXMP + select CPU_V7 + select HAVE_SMP + select ARM_GIC + select MSM_IRQ + select SPARSE_IRQ + select MULTI_IRQ_HANDLER + select HAVE_ARM_ARCH_TIMER + select MAY_HAVE_SPARSE_IRQ + select PINCTRL + select PINCTRL_MSM_TLMM + select USE_PINCTRL_IRQ + select MSM_PM if PM + select QMI_ENCDEC + select CPU_FREQ + select CPU_FREQ_MSM + select PM_DEVFREQ + select MSM_DEVFREQ_DEVBW + select DEVFREQ_SIMPLE_DEV + select DEVFREQ_GOV_MSM_BW_HWMON + select MSM_BIMC_BWMON + select MSM_QDSP6V2_CODECS + select MSM_AUDIO_QDSP6V2 if SND_SOC + select ARM_HAS_SG_CHAIN + select MSM_RPM_SMD + select MSM_JTAGV8 if CORESIGHT_ETMV4 + select ARCH_WANT_KMAP_ATOMIC_FLUSH + select ARCH_MSM8953_SOC_SETTINGS + config ARCH_MSM8909 bool "MSM8909" select ARCH_MSM_CORTEXMP diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile index 3e1a2b391af00..530c79e1a8726 100644 --- a/arch/arm/mach-msm/Makefile +++ b/arch/arm/mach-msm/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_ARCH_MSM8920) += board-8920.o obj-$(CONFIG_ARCH_MSM8937) += board-8937.o obj-$(CONFIG_ARCH_MSM8940) += board-8940.o obj-$(CONFIG_ARCH_MSM8953) += board-8953.o +obj-$(CONFIG_ARCH_SDM450) += board-sdm450.o obj-$(CONFIG_ARCH_MSM8909) += board-8909.o #SMP diff --git a/arch/arm/mach-msm/board-sdm450.c b/arch/arm/mach-msm/board-sdm450.c new file mode 100644 index 0000000000000..92bc036325781 --- /dev/null +++ b/arch/arm/mach-msm/board-sdm450.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include "board-dt.h" + +static const char *sdm450_dt_match[] __initconst = { + "qcom,sdm450", + NULL +}; + +static void __init sdm450_init(void) +{ + board_dt_populate(NULL); +} + +DT_MACHINE_START(SDM450_DT, + "Qualcomm Technologies, Inc. SDM450 (Flattened Device Tree)") + .init_machine = sdm450_init, + .dt_compat = sdm450_dt_match, +MACHINE_END diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index c8a4162311848..26a5e8aab8202 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -309,6 +309,14 @@ config ARCH_MSM8953 This enables support for the MSM8953 chipset. If you don't know what to do here, say N +config ARCH_SDM450 + bool "Enable Support for Qualcomm Technologies Inc SDM450" + depends on ARCH_MSM + select ARCH_MSM8953_SOC_SETTINGS + help + This enables support for the SDM450 chipset. If you don't + know what to do here, say N + config ARCH_MSM8937 bool "Enable Support for Qualcomm Technologies Inc MSM8937" depends on ARCH_MSM diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c index 19b2e9075b44e..29ff385bf8a16 100644 --- a/drivers/soc/qcom/socinfo.c +++ b/drivers/soc/qcom/socinfo.c @@ -557,6 +557,9 @@ static struct msm_soc_info cpu_of_id[] = { [293] = {MSM_CPU_8953, "MSM8953"}, [304] = {MSM_CPU_8953, "APQ8053"}, + /* SDM450 ID */ + [338] = {MSM_CPU_SDM450, "SDM450"}, + /* 9607 IDs */ [290] = {MSM_CPU_9607, "MDM9607"}, [296] = {MSM_CPU_9607, "MDM8207"}, @@ -1285,6 +1288,10 @@ static void * __init setup_dummy_socinfo(void) dummy_socinfo.id = 293; strlcpy(dummy_socinfo.build_id, "msm8953 - ", sizeof(dummy_socinfo.build_id)); + } else if (early_machine_is_sdm450()) { + dummy_socinfo.id = 338; + strlcpy(dummy_socinfo.build_id, "sdm450 - ", + sizeof(dummy_socinfo.build_id)); } else if (early_machine_is_mdm9607()) { dummy_socinfo.id = 290; strlcpy(dummy_socinfo.build_id, "mdm9607 - ", diff --git a/include/soc/qcom/socinfo.h b/include/soc/qcom/socinfo.h index a146c32785e2d..48e169aa939d4 100644 --- a/include/soc/qcom/socinfo.h +++ b/include/soc/qcom/socinfo.h @@ -92,6 +92,8 @@ of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,msm8952") #define early_machine_is_msm8953() \ of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,msm8953") +#define early_machine_is_sdm450() \ + of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,sdm450") #define early_machine_is_msm8937() \ of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,msm8937") #define early_machine_is_msm8996() \ @@ -136,6 +138,7 @@ #define early_machine_is_fsm9010() 0 #define early_machine_is_msm8952() 0 #define early_machine_is_msm8953() 0 +#define early_machine_is_sdm450() 0 #define early_machine_is_msm8937() 0 #define early_machine_is_msm8996() 0 #define early_machine_is_msm8976() 0 @@ -200,6 +203,7 @@ enum msm_cpu { FSM_CPU_9010, MSM_CPU_8952, MSM_CPU_8953, + MSM_CPU_SDM450, MSM_CPU_8937, MSM_CPU_8996, MSM_CPU_8976, From 0c0d96a11fb323731626f6e037fd25c4764cee48 Mon Sep 17 00:00:00 2001 From: Rama Krishna Phani A Date: Fri, 31 Mar 2017 20:01:05 +0530 Subject: [PATCH 0765/1015] thermal: tsens: Update sensor ID index tsens_get_hw_id_mapping() API is used by thermal client to obtain the logical ID or HW ID mapping for the available temperature sensors (TSENS) controller with sensor ID details. Clients currently query the driver on a per sensor basis. The API update allows the clients to get the sensor ID information at once for the available number of sensors. Change-Id: I8f9aabe6eda58baa05bf079f04ef8167a5a05400 Signed-off-by: Rama Krishna Phani A --- drivers/thermal/msm-tsens.c | 79 ++++++++++++++++++----------------- drivers/thermal/msm_thermal.c | 20 +++------ 2 files changed, 45 insertions(+), 54 deletions(-) diff --git a/drivers/thermal/msm-tsens.c b/drivers/thermal/msm-tsens.c index f4b53b8eb3745..321b1eca7a3b0 100644 --- a/drivers/thermal/msm-tsens.c +++ b/drivers/thermal/msm-tsens.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -981,6 +981,7 @@ static int32_t get_tsens_sensor_for_client_id(struct tsens_tm_device *tmdev, } if (!strcmp(id->compatible, "qcom,msm8996-tsens") || + (!strcmp(id->compatible, "qcom,msm8953-tsens")) || (!strcmp(id->compatible, "qcom,msmcobalt-tsens"))) { while (i < tmdev->tsens_num_sensor && !id_found) { if (tmdev->sensor[i].sensor_client_id == @@ -1108,67 +1109,68 @@ static int tsens_get_sw_id_mapping_for_controller( return 0; } -int tsens_get_hw_id_mapping(int sensor_sw_id, int *sensor_client_id) +int tsens_get_hw_id_mapping(int thermal_sensor_num, int *sensor_client_id) { - int i = 0; - bool id_found = false; struct tsens_tm_device *tmdev = NULL; struct device_node *of_node = NULL; const struct of_device_id *id; + uint32_t tsens_max_sensors = 0, idx = 0, i = 0; - tmdev = get_tsens_controller_for_client_id(sensor_sw_id); - if (tmdev == NULL) { - pr_debug("TSENS early init not done\n"); + if (list_empty(&tsens_device_list)) { + pr_debug("%s: TSENS controller not available\n", __func__); return -EPROBE_DEFER; } - of_node = tmdev->pdev->dev.of_node; - if (of_node == NULL) { - pr_err("Invalid of_node??\n"); + list_for_each_entry(tmdev, &tsens_device_list, list) + tsens_max_sensors += tmdev->tsens_num_sensor; + + if (tsens_max_sensors != thermal_sensor_num) { + pr_err("TSENS total sensors is %d, thermal expects:%d\n", + tsens_max_sensors, thermal_sensor_num); return -EINVAL; } - if (!of_match_node(tsens_match, of_node)) { - pr_err("Need to read SoC specific fuse map\n"); - return -ENODEV; - } + list_for_each_entry(tmdev, &tsens_device_list, list) { + of_node = tmdev->pdev->dev.of_node; + if (of_node == NULL) { + pr_err("Invalid of_node??\n"); + return -EINVAL; + } - id = of_match_node(tsens_match, of_node); - if (id == NULL) { - pr_err("can not find tsens_match of_node\n"); - return -ENODEV; - } + if (!of_match_node(tsens_match, of_node)) { + pr_err("Need to read SoC specific fuse map\n"); + return -ENODEV; + } + + id = of_match_node(tsens_match, of_node); + if (id == NULL) { + pr_err("can not find tsens_match of_node\n"); + return -ENODEV; + } if (!strcmp(id->compatible, "qcom,msm8996-tsens") || + (!strcmp(id->compatible, "qcom,msm8953-tsens")) || (!strcmp(id->compatible, "qcom,msmcobalt-tsens"))) { /* Assign a client id which will be used to get the * controller and hw_sensor details */ - while (i < tmdev->tsens_num_sensor && !id_found) { - if (sensor_sw_id == tmdev->sensor[i].sensor_client_id) { - *sensor_client_id = + for (i = 0; i < tmdev->tsens_num_sensor; i++) { + sensor_client_id[idx] = tmdev->sensor[i].sensor_client_id; - id_found = true; + idx++; } - i++; - } - } else { - /* Assign the corresponding hw sensor number which is done - * prior to support for multiple controllres - */ - while (i < tmdev->tsens_num_sensor && !id_found) { - if (sensor_sw_id == tmdev->sensor[i].sensor_sw_id) { - *sensor_client_id = + } else { + /* Assign the corresponding hw sensor number + * prior to support for multiple controllres + */ + for (i = 0; i < tmdev->tsens_num_sensor; i++) { + sensor_client_id[idx] = tmdev->sensor[i].sensor_hw_num; - id_found = true; + idx++; } - i++; } } - if (!id_found) - return -EINVAL; - return 0; } EXPORT_SYMBOL(tsens_get_hw_id_mapping); @@ -5871,7 +5873,7 @@ static int tsens_thermal_zone_register(struct tsens_tm_device *tmdev) tmdev->sensor[i].sensor_hw_num); else snprintf(name, sizeof(name), "tsens_tz_sensor%d", - tsens_sensor_sw_idx); + tmdev->sensor[i].sensor_client_id); tmdev->sensor[i].mode = THERMAL_DEVICE_ENABLED; tmdev->sensor[i].tm = tmdev; @@ -5898,7 +5900,6 @@ static int tsens_thermal_zone_register(struct tsens_tm_device *tmdev) goto fail; } } - tsens_sensor_sw_idx++; } if (tmdev->tsens_type == TSENS_TYPE3) { diff --git a/drivers/thermal/msm_thermal.c b/drivers/thermal/msm_thermal.c index 7592ce6d2814d..95ca8540500d7 100644 --- a/drivers/thermal/msm_thermal.c +++ b/drivers/thermal/msm_thermal.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2360,7 +2360,6 @@ static int create_sensor_zone_id_map(void) static int create_sensor_id_map(struct device *dev) { - int i = 0; int ret = 0; tsens_id_map = devm_kzalloc(dev, @@ -2371,19 +2370,10 @@ static int create_sensor_id_map(struct device *dev) return -ENOMEM; } - for (i = 0; i < max_tsens_num; i++) { - ret = tsens_get_hw_id_mapping(i, &tsens_id_map[i]); - /* If return -ENXIO, hw_id is default in sequence */ - if (ret) { - if (ret == -ENXIO) { - tsens_id_map[i] = i; - ret = 0; - } else { - pr_err("Failed to get hw id for id:%d.err:%d\n", - i, ret); - goto fail; - } - } + ret = tsens_get_hw_id_mapping(max_tsens_num, tsens_id_map); + if (ret) { + pr_err("Failed to get tsens id's:%d\n", ret); + goto fail; } return ret; From e5f1511364eba58d12f1efda086c97406bd8a891 Mon Sep 17 00:00:00 2001 From: Rama Krishna Phani A Date: Fri, 10 Mar 2017 19:54:47 +0530 Subject: [PATCH 0766/1015] ARM: dts: msm: Update Temperature sensor support for MSM8953 Update sensor id mapping and total number of temperature sensors (TSENS) supported for MSM8953 target. Remove support to read from TSENS sensor 0. Change-Id: I39fe87b30a339b91e342744db50faa188ce27d57 Signed-off-by: Rama Krishna Phani A --- arch/arm/boot/dts/qcom/msm8953.dtsi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8953.dtsi b/arch/arm/boot/dts/qcom/msm8953.dtsi index f0fec6afd3afd..e5ad555c11eae 100644 --- a/arch/arm/boot/dts/qcom/msm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953.dtsi @@ -287,8 +287,10 @@ reg-names = "tsens_physical", "tsens_eeprom_physical"; interrupts = <0 184 0>, <0 314 0>; interrupt-names = "tsens-upper-lower", "tsens-critical"; - qcom,sensors = <16>; - qcom,slope = <3200 3200 3200 3200 3200 3200 3200 3200 3200 + qcom,client-id = <1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>; + qcom,sensor-id = <1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>; + qcom,sensors = <15>; + qcom,slope = <3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 3200>; qcom,valid-status-check; }; From 3cf6d5d78fc3c7db697f6ece37475ea4c9405960 Mon Sep 17 00:00:00 2001 From: Shadab Naseem Date: Tue, 11 Apr 2017 15:50:51 +0530 Subject: [PATCH 0767/1015] defconfig: msm: Enable sdm450 support in msmcortex defconfigs Enable sdm450 SoC support in msmcortex_defconfig and msmcortex-perf_defconfig files for 32bit and 64bit mode. Change-Id: I83fe4bc3b93ae6dacd53435d0b85b6f52bc938b0 Signed-off-by: Shadab Naseem --- arch/arm/configs/msmcortex-perf_defconfig | 1 + arch/arm/configs/msmcortex_defconfig | 1 + arch/arm64/configs/msmcortex-perf_defconfig | 1 + arch/arm64/configs/msmcortex_defconfig | 1 + 4 files changed, 4 insertions(+) diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index be71a873c5f39..34652e364366f 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -43,6 +43,7 @@ CONFIG_ARCH_MSM8916=y CONFIG_ARCH_MSM8937=y CONFIG_ARCH_MSM8940=y CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_SDM450=y CONFIG_SMP=y CONFIG_SCHED_MC=y CONFIG_NR_CPUS=8 diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index f93fdc01a034a..fb8466f99a22a 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -44,6 +44,7 @@ CONFIG_ARCH_MSM8916=y CONFIG_ARCH_MSM8937=y CONFIG_ARCH_MSM8940=y CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_SDM450=y CONFIG_SMP=y CONFIG_SCHED_MC=y CONFIG_NR_CPUS=8 diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index c082c100ee2b0..6a0125c35a34c 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -41,6 +41,7 @@ CONFIG_ARCH_MSM=y CONFIG_ARCH_MSM8916=y CONFIG_ARCH_MSM8940=y CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_SDM450=y CONFIG_ARCH_MSM8937=y CONFIG_ARCH_MSMCOBALT=y CONFIG_PCI_MSM=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index 47a1a5993ffcc..0dd481b413643 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -40,6 +40,7 @@ CONFIG_ARCH_MSM=y CONFIG_ARCH_MSM8916=y CONFIG_ARCH_MSM8940=y CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_SDM450=y CONFIG_ARCH_MSM8937=y CONFIG_ARCH_MSMCOBALT=y CONFIG_PCI_MSM=y From 4d22ed9ae54d41537345b793c8ddce01dc1b2baa Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Fri, 14 Apr 2017 19:23:05 -0700 Subject: [PATCH 0768/1015] msm: rmnet_ipa: fix security issue Fix the security issue where mux channel name might not be null-terminated in ipa wan driver. Change-Id: I3ef440b62cf3861464fb60c1e7f65f2be5e39ed0 Acked-by: Shihuan Liu Signed-off-by: Skylar Chang --- drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c | 3 +++ drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c index 64dc2164d9ce6..716330afb6e73 100644 --- a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c @@ -1419,6 +1419,9 @@ static int ipa_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) memcpy(mux_channel[rmnet_index].vchannel_name, extend_ioctl_data.u.rmnet_mux_val.vchannel_name, sizeof(mux_channel[rmnet_index].vchannel_name)); + mux_channel[rmnet_index].vchannel_name[ + IFNAMSIZ - 1] = '\0'; + IPAWANDBG("cashe device[%s:%d] in IPA_wan[%d]\n", mux_channel[rmnet_index].vchannel_name, mux_channel[rmnet_index].mux_id, diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index cc11f2d10fb94..03e7d5ea39fb0 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -1442,6 +1442,9 @@ static int ipa3_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) extend_ioctl_data.u.rmnet_mux_val.vchannel_name, sizeof(mux_channel[rmnet_index] .vchannel_name)); + mux_channel[rmnet_index].vchannel_name[ + IFNAMSIZ - 1] = '\0'; + IPAWANDBG("cashe device[%s:%d] in IPA_wan[%d]\n", mux_channel[rmnet_index].vchannel_name, mux_channel[rmnet_index].mux_id, From 816d040a037ca14e6344cf00a25c3e7c378e4eda Mon Sep 17 00:00:00 2001 From: Abir Ghosh Date: Tue, 11 Apr 2017 10:01:15 +0530 Subject: [PATCH 0769/1015] qbt1000: Terminate fingerprint TA name with null Terminate the string, coming from userspace and containing the name of fingerprint trusted app, with null character, to make sure kernel memory does not leak into logs Change-Id: I1668a64fcb6747ce3ef3b1ee6321fa5fa4a1798a CRs-Fixed: 2029409 Signed-off-by: Abir Ghosh --- drivers/soc/qcom/qbt1000.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/soc/qcom/qbt1000.c b/drivers/soc/qcom/qbt1000.c index 4fbff8c87db80..b24978cc617f4 100644 --- a/drivers/soc/qcom/qbt1000.c +++ b/drivers/soc/qcom/qbt1000.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -803,14 +803,16 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) } } + app.name[MAX_NAME_SIZE - 1] = '\0'; + /* start the TZ app */ rc = qseecom_start_app(&drvdata->app_handle, app.name, app.size); if (rc == 0) { g_app_buf_size = app.size; } else { - dev_err(drvdata->dev, "%s: App %s failed to load\n", - __func__, app.name); + dev_err(drvdata->dev, "%s: Fingerprint Trusted App failed to load\n", + __func__); goto end; } From dcf2dc410a4200228aeb4e4a720de4ea96046b1f Mon Sep 17 00:00:00 2001 From: Abir Ghosh Date: Tue, 11 Apr 2017 10:10:23 +0530 Subject: [PATCH 0770/1015] qbt1000: Initialize drvdata structure before usage Fix uninitialized local variable error which might have lead to crash Change-Id: I3fd95cb343c3175e4190c8ebfe209399db0602a6 CRs-Fixed: 2030137 Signed-off-by: Abir Ghosh --- drivers/soc/qcom/qbt1000.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/soc/qcom/qbt1000.c b/drivers/soc/qcom/qbt1000.c index b24978cc617f4..7f99c86368358 100644 --- a/drivers/soc/qcom/qbt1000.c +++ b/drivers/soc/qcom/qbt1000.c @@ -753,13 +753,14 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) void __user *priv_arg = (void __user *)arg; struct qbt1000_drvdata *drvdata; + drvdata = file->private_data; + if (IS_ERR(priv_arg)) { dev_err(drvdata->dev, "%s: invalid user space pointer %lu\n", __func__, arg); return -EINVAL; } - drvdata = file->private_data; pm_runtime_get_sync(drvdata->dev); mutex_lock(&drvdata->mutex); if (((drvdata->sensor_conn_type == SPI) && (!drvdata->clock_state)) || From 47318975fa9aa6c57f41cada72cbf10722695735 Mon Sep 17 00:00:00 2001 From: Ashay Jaiswal Date: Tue, 28 Mar 2017 15:50:37 +0530 Subject: [PATCH 0771/1015] power: qpnp-smbcharger: handle charger removal during APSD re-run During APSD re-run software ignores all USB insertion/removal interrupts, there could be a possibility of actual removal of USB during APSD re-run which will be missed by software. Fix this by checking and updating USB status after APSD re-run. Change-Id: I25248ffd5b5a4c2831460605fed402381961f41d Signed-off-by: Ashay Jaiswal --- drivers/power/qpnp-smbcharger.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/power/qpnp-smbcharger.c b/drivers/power/qpnp-smbcharger.c index f21ff61867e24..51cc5b96cca5d 100644 --- a/drivers/power/qpnp-smbcharger.c +++ b/drivers/power/qpnp-smbcharger.c @@ -8320,6 +8320,7 @@ static int smbchg_probe(struct spmi_device *spmi) rerun_hvdcp_det_if_necessary(chip); + update_usb_status(chip, is_usb_present(chip), false); dump_regs(chip); create_debugfs_entries(chip); dev_info(chip->dev, From 0af1b1c7cf4e68971574a97c7975b33674357cdd Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Tue, 2 May 2017 18:03:10 +0530 Subject: [PATCH 0772/1015] msm: msm_bus: Fix inconsistent type casting in bandwidth monitor driver There is a mismatch in size of variable types in different kernel platform modes like 32bit, 64bit etc. Use proper variable type in bus bandwidth monitor driver compatible for both platform modes. Change-Id: Ic69f0eaf6bb02a7b8ef8eae888ddf82ffcc17b26 Signed-off-by: Manaf Meethalavalappu Pallikunhi --- drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c b/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c index 355fdc94ff3fe..6764695c8ccef 100644 --- a/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c +++ b/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -237,18 +237,20 @@ static int bm_tz_get_curr_bw(struct thermal_zone_device *bmdev, { struct bm_tz_sensor *bm_sensor = bmdev->devdata; int ret = 0; + u64 bus_bw = 0; if (!bm_sensor || bm_sensor->mode != THERMAL_DEVICE_ENABLED || !bw) return -EINVAL; ret = msm_rule_query_bandwidth( &bm_sensor->thresh_bus_rule[BM_HIGH_THRESHOLD], - (u64 *)bw, + &bus_bw, &bm_sensor->bm_nb); if (ret < 0) { pr_err("Error in reading curr bw, ret:%d\n", ret); return -EINVAL; } + *bw = (unsigned long)bus_bw; pr_debug("bm sensor[%s] curr bw:%lu\n", bm_sensor->bm_sensor, *bw); return 0; @@ -360,7 +362,7 @@ static int bm_tz_get_trip_bw(struct thermal_zone_device *bmdev, if (!bm_sensor || trip < 0 || trip >= MAX_BM_THRESHOLD || !bw) return -EINVAL; - *bw = bm_sensor->thresh_state[trip].trip_bw; + *bw = (unsigned long)bm_sensor->thresh_state[trip].trip_bw; return 0; }; From 292cebda57fd4f72ab14d791a591de7cdc35d6bd Mon Sep 17 00:00:00 2001 From: Avaneesh Kumar Dwivedi Date: Mon, 24 Apr 2017 21:51:42 +0530 Subject: [PATCH 0773/1015] soc: qcom: Clear the memory before freeing it up It is a case of write after free, this is causing page allocation failure due to corruption. This is due to freeing up of segments allocated for venus subsystem, when venus fw loading fail midway. Change-Id: I0019a05b1d1336dcf361264607597430e5f1625a Signed-off-by: Avaneesh Kumar Dwivedi --- drivers/soc/qcom/peripheral-loader.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 8bba4fc2404dd..b91c1c7b324e2 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -908,13 +908,13 @@ int pil_boot(struct pil_desc *desc) priv->region_start), VMID_HLOS); } + if (desc->clear_fw_region && priv->region_start) + pil_clear_segment(desc); dma_free_attrs(desc->dev, priv->region_size, priv->region, priv->region_start, &desc->attrs); priv->region = NULL; } - if (desc->clear_fw_region && priv->region_start) - pil_clear_segment(desc); pil_release_mmap(desc); } return ret; From 36acd063d3183ebd61b28b06b03495c24c3d6af7 Mon Sep 17 00:00:00 2001 From: Benjamin Chan Date: Wed, 19 Apr 2017 16:24:40 -0400 Subject: [PATCH 0774/1015] msm: mdss: Add plane_count range check in mdss WFD For any given output buffer to the MDSS WFD, it is necessary to check the range of the plane_count against the MAX_PLANES definition, in order to avoid any out of bound access. CRs-Fixed: 2028702 Change-Id: I4f1497a3a2e4ca2d30fc268e68cfdacc0d8539ea Signed-off-by: Benjamin Chan --- drivers/video/msm/mdss/mdss_mdp_layer.c | 6 ++++++ drivers/video/msm/mdss/mdss_mdp_wfd.c | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_layer.c b/drivers/video/msm/mdss/mdss_mdp_layer.c index 2aaeed8324f61..bbd97006ec297 100644 --- a/drivers/video/msm/mdss/mdss_mdp_layer.c +++ b/drivers/video/msm/mdss/mdss_mdp_layer.c @@ -2158,6 +2158,12 @@ int mdss_mdp_layer_pre_commit_wfd(struct msm_fb_data_type *mfd, wfd = mdp5_data->wfd; output_layer = commit->output_layer; + if (output_layer->buffer.plane_count > MAX_PLANES) { + pr_err("Output buffer plane_count exceeds MAX_PLANES limit:%d\n", + output_layer->buffer.plane_count); + return -EINVAL; + } + data = mdss_mdp_wfd_add_data(wfd, output_layer); if (IS_ERR_OR_NULL(data)) return PTR_ERR(data); diff --git a/drivers/video/msm/mdss/mdss_mdp_wfd.c b/drivers/video/msm/mdss/mdss_mdp_wfd.c index 398f5406cdf39..7c02238f68e44 100644 --- a/drivers/video/msm/mdss/mdss_mdp_wfd.c +++ b/drivers/video/msm/mdss/mdss_mdp_wfd.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -300,6 +300,12 @@ static int mdss_mdp_wfd_import_data(struct device *device, if (wfd_data->layer.flags & MDP_LAYER_SECURE_SESSION) flags = MDP_SECURE_OVERLAY_SESSION; + if (buffer->plane_count > MAX_PLANES) { + pr_err("buffer plane_count exceeds MAX_PLANES limit:%d", + buffer->plane_count); + return -EINVAL; + } + memset(planes, 0, sizeof(planes)); for (i = 0; i < buffer->plane_count; i++) { From 7730dc22f1c12a4360837d2edf4ba5d9699c8ec7 Mon Sep 17 00:00:00 2001 From: Benjamin Chan Date: Wed, 19 Apr 2017 15:52:07 -0400 Subject: [PATCH 0775/1015] msm: mdss: Add plane_count limit check for mdss_rotator buffer For each input and output buffer given to mdss rotator, it is necessary to check the range of the plane_count value against the MAX_PLANES definition, in order to avoid any plane array out of bound access. CRs-Fixed: 2028681 Change-Id: I117bf5daead17e5e97c62c6dc8e21d1fcc9d8e74 Signed-off-by: Benjamin Chan --- drivers/video/msm/mdss/mdss_rotator.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_rotator.c b/drivers/video/msm/mdss/mdss_rotator.c index eddfa4977070e..fd38196e1caca 100644 --- a/drivers/video/msm/mdss/mdss_rotator.c +++ b/drivers/video/msm/mdss/mdss_rotator.c @@ -501,6 +501,12 @@ static int mdss_rotator_import_buffer(struct mdp_layer_buffer *buffer, memset(planes, 0, sizeof(planes)); + if (buffer->plane_count > MAX_PLANES) { + pr_err("buffer plane_count exceeds MAX_PLANES limit:%d\n", + buffer->plane_count); + return -EINVAL; + } + for (i = 0; i < buffer->plane_count; i++) { planes[i].memory_id = buffer->planes[i].fd; planes[i].offset = buffer->planes[i].offset; @@ -2106,6 +2112,20 @@ struct mdss_rot_entry_container *mdss_rotator_req_init( struct mdss_rot_entry_container *req; int size, i; + /* + * Check input and output plane_count from each given item + * are within the MAX_PLANES limit + */ + for (i = 0 ; i < count; i++) { + if ((items[i].input.plane_count > MAX_PLANES) || + (items[i].output.plane_count > MAX_PLANES)) { + pr_err("Input/Output plane_count exceeds MAX_PLANES limit, input:%d, output:%d\n", + items[i].input.plane_count, + items[i].output.plane_count); + return ERR_PTR(-EINVAL); + } + } + size = sizeof(struct mdss_rot_entry_container); size += sizeof(struct mdss_rot_entry) * count; req = devm_kzalloc(&mgr->pdev->dev, size, GFP_KERNEL); From a9e66c800ee941360373633e711296f70e32762e Mon Sep 17 00:00:00 2001 From: Trishansh Bhardwaj Date: Fri, 7 Apr 2017 11:16:29 +0530 Subject: [PATCH 0776/1015] msm: camera: Allow driver file to be opend only once. Use proper synchronization to ensure driver file is opened only once. CRs-Fixed: 2023513 Change-Id: I71e55e2d487fe561d3f596590b3e8102c5e921b5 Signed-off-by: Trishansh Bhardwaj --- drivers/media/platform/msm/camera_v2/msm.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index 19f8dc72724b9..4160c61c76e0c 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -997,11 +997,9 @@ static int msm_open(struct file *filep) BUG_ON(!pvdev); /* !!! only ONE open is allowed !!! */ - if (atomic_read(&pvdev->opened)) + if (atomic_cmpxchg(&pvdev->opened, 0, 1)) return -EBUSY; - atomic_set(&pvdev->opened, 1); - spin_lock_irqsave(&msm_pid_lock, flags); msm_pid = get_pid(task_pid(current)); spin_unlock_irqrestore(&msm_pid_lock, flags); From f050e8977673c2d1e1b6f29147b68f12de0ac120 Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Fri, 21 Apr 2017 10:42:57 -0700 Subject: [PATCH 0777/1015] msm: ipa: fix IPC low priority logging Allocate IPC low priority on first usage only. Change-Id: Icea7f0fad9ed34c93641296f68736bbaf2e6eaa9 CRs-Fixed: 2016076 Acked-by: Ady Abraham Signed-off-by: Skylar Chang --- drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c index 0436ff8cf9d5a..2534df7e871cf 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c @@ -106,6 +106,7 @@ static char dbg_buff[IPA_MAX_MSG_LEN]; static char *active_clients_buf; static s8 ep_reg_idx; +static void *ipa_ipc_low_buff; static ssize_t ipa3_read_gen_reg(struct file *file, char __user *ubuf, @@ -1715,22 +1716,20 @@ static ssize_t ipa3_enable_ipc_low(struct file *file, if (kstrtos8(dbg_buff, 0, &option)) return -EFAULT; + mutex_lock(&ipa3_ctx->lock); if (option) { - if (!ipa3_ctx->logbuf_low) { - ipa3_ctx->logbuf_low = + if (!ipa_ipc_low_buff) { + ipa_ipc_low_buff = ipc_log_context_create(IPA_IPC_LOG_PAGES, "ipa_low", 0); } - - if (ipa3_ctx->logbuf_low == NULL) { - IPAERR("failed to get logbuf_low\n"); - return -EFAULT; - } + if (ipa_ipc_low_buff == NULL) + IPAERR("failed to get logbuf_low\n"); + ipa3_ctx->logbuf_low = ipa_ipc_low_buff; } else { - if (ipa3_ctx->logbuf_low) - ipc_log_context_destroy(ipa3_ctx->logbuf_low); ipa3_ctx->logbuf_low = NULL; } + mutex_unlock(&ipa3_ctx->lock); return count; } From 930be7b3305f7832dd0ef20309efb8b19108e2af Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Tue, 2 May 2017 18:03:10 +0530 Subject: [PATCH 0778/1015] msm: msm_bus: Fix inconsistent type casting in bandwidth monitor driver There is a mismatch in size of variable types in different kernel platform modes like 32bit, 64bit etc. Use proper variable type in bus bandwidth monitor driver compatible for both platform modes. Change-Id: Ic69f0eaf6bb02a7b8ef8eae888ddf82ffcc17b26 Signed-off-by: Manaf Meethalavalappu Pallikunhi --- drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c b/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c index 355fdc94ff3fe..6764695c8ccef 100644 --- a/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c +++ b/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -237,18 +237,20 @@ static int bm_tz_get_curr_bw(struct thermal_zone_device *bmdev, { struct bm_tz_sensor *bm_sensor = bmdev->devdata; int ret = 0; + u64 bus_bw = 0; if (!bm_sensor || bm_sensor->mode != THERMAL_DEVICE_ENABLED || !bw) return -EINVAL; ret = msm_rule_query_bandwidth( &bm_sensor->thresh_bus_rule[BM_HIGH_THRESHOLD], - (u64 *)bw, + &bus_bw, &bm_sensor->bm_nb); if (ret < 0) { pr_err("Error in reading curr bw, ret:%d\n", ret); return -EINVAL; } + *bw = (unsigned long)bus_bw; pr_debug("bm sensor[%s] curr bw:%lu\n", bm_sensor->bm_sensor, *bw); return 0; @@ -360,7 +362,7 @@ static int bm_tz_get_trip_bw(struct thermal_zone_device *bmdev, if (!bm_sensor || trip < 0 || trip >= MAX_BM_THRESHOLD || !bw) return -EINVAL; - *bw = bm_sensor->thresh_state[trip].trip_bw; + *bw = (unsigned long)bm_sensor->thresh_state[trip].trip_bw; return 0; }; From cca9cd08861541bfdef9350b4a14d216684896dc Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Fri, 17 Mar 2017 18:56:18 +0530 Subject: [PATCH 0779/1015] mmc: queue: Remove BUG_ON() in cmdq_thread If any discard requests fails, the mmc driver should not cause kernel panic. The error handling and informing block layer about error will be done by completion context. Change-Id: I0c88ad851ad12c392a557bcb94d3b21dfc62d1f8 Signed-off-by: Vijay Viswanath --- drivers/mmc/card/queue.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index f3ac99d7b7ebd..ef71d57a08c65 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c @@ -127,14 +127,11 @@ static int mmc_cmdq_thread(void *d) ret = mq->cmdq_issue_fn(mq, mq->cmdq_req_peeked); /* - * Don't requeue if issue_fn fails, just bug on. - * We don't expect failure here and there is no recovery other - * than fixing the actual issue if there is any. + * Don't requeue if issue_fn fails. + * Recovery will be come by completion softirq * Also we end the request if there is a partition switch error, * so we should not requeue the request here. */ - if (ret) - BUG_ON(1); } /* loop */ return 0; From be231d96561194180e5be35baeb0ac571260dd58 Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Thu, 27 Apr 2017 15:09:45 +0530 Subject: [PATCH 0780/1015] mmc: cmdq_hci: Avoid releasing clock twice during DCMD error When erase DCMD commands fail, a completion notification may get raised by host controller for the task in addition to error interrupt. This can result in the done function of mmc request getting called twice and release the clock twice and mess up the clock request counter. The done function should be called only once for DCMD commands except flush commands. Change-Id: Ie3a96e48ca98872cf686049eb5caa060f143f9cb Signed-off-by: Vijay Viswanath --- drivers/mmc/host/cmdq_hci.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/host/cmdq_hci.c b/drivers/mmc/host/cmdq_hci.c index 87df7c102ecff..b759613efe2c8 100644 --- a/drivers/mmc/host/cmdq_hci.c +++ b/drivers/mmc/host/cmdq_hci.c @@ -942,12 +942,17 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) * before setting doorbell, hence one is not needed here. */ for_each_set_bit(tag, &comp_status, cq_host->num_slots) { - /* complete the corresponding mrq */ - pr_debug("%s: completing tag -> %lu\n", - mmc_hostname(mmc), tag); - MMC_TRACE(mmc, "%s: completing tag -> %lu\n", - __func__, tag); + mrq = get_req_by_tag(cq_host, tag); + if (!((mrq->cmd && mrq->cmd->error) || + mrq->cmdq_req->resp_err || + (mrq->data && mrq->data->error))) { + /* complete the corresponding mrq */ + pr_debug("%s: completing tag -> %lu\n", + mmc_hostname(mmc), tag); + MMC_TRACE(mmc, "%s: completing tag -> %lu\n", + __func__, tag); cmdq_finish_data(mmc, tag); + } } } From 8687d9e4f53d3439a4af5945bb072c0c2d5187a6 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Tue, 21 Feb 2017 11:35:37 -0800 Subject: [PATCH 0781/1015] crypto: msm: check invalid src and dst vbuf in qcedev.c src and dst vbuf address and length are provided from userspace, and they are invalid if vbuf address is NULL but length is not zero. Add additional checks in qcedev_check_cipher_params to prevent it. Change-Id: Iadc1a0c1c5b2f7a56acd03a23c08e45b5a671b19 Signed-off-by: Zhen Kong --- drivers/crypto/msm/qcedev.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index 50e67b5db0e7a..2a539d80385de 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -1491,6 +1491,11 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, } /* Check for sum of all dst length is equal to data_len */ for (i = 0, total = 0; i < req->entries; i++) { + if (!req->vbuf.dst[i].vaddr && req->vbuf.dst[i].len) { + pr_err("%s: NULL req dst vbuf[%d] with length %d\n", + __func__, i, req->vbuf.dst[i].len); + goto error; + } if (req->vbuf.dst[i].len >= U32_MAX - total) { pr_err("%s: Integer overflow on total req dst vbuf length\n", __func__); @@ -1505,6 +1510,11 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, } /* Check for sum of all src length is equal to data_len */ for (i = 0, total = 0; i < req->entries; i++) { + if (!req->vbuf.src[i].vaddr && req->vbuf.src[i].len) { + pr_err("%s: NULL req src vbuf[%d] with length %d\n", + __func__, i, req->vbuf.src[i].len); + goto error; + } if (req->vbuf.src[i].len > U32_MAX - total) { pr_err("%s: Integer overflow on total req src vbuf length\n", __func__); From bfd8ffc65e6e82de2adceba58bd67137fb3b2024 Mon Sep 17 00:00:00 2001 From: Shubhraprakash Das Date: Wed, 7 Dec 2016 15:25:27 -0800 Subject: [PATCH 0782/1015] msm: camera: isp: Check userspace parameters Check the user parameters passed to prevent buffer overflow. Change-Id: Ia8adc88d993db9e4314f3aa85ff5bbb6d7cef31e CRs-Fixed: 1097390 Signed-off-by: Shubhraprakash Das Signed-off-by: Meera Gande --- .../media/platform/msm/camera_v2/ispif/msm_ispif.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c index 4a1ea20192cba..649a363bc05dd 100644 --- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c +++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c @@ -132,7 +132,7 @@ static void msm_ispif_get_pack_mask_from_cfg( pack_mask[0] |= temp; CDBG("%s:num %d cid %d mode %d pack_mask %x %x\n", __func__, entry->num_cids, entry->cids[i], - pack_cfg[i].pack_mode, + pack_cfg[entry->cids[i]].pack_mode, pack_mask[0], pack_mask[1]); } @@ -164,6 +164,16 @@ static int msm_ispif_config2(struct ispif_device *ispif, return rc; } + for (i = 0; i < params->num; i++) { + int j; + + if (params->entries[i].num_cids > MAX_CID_CH_v2) + return -EINVAL; + for (j = 0; j < params->entries[i].num_cids; j++) + if (params->entries[i].cids[j] >= CID_MAX) + return -EINVAL; + } + for (i = 0; i < params->num; i++) { intftype = params->entries[i].intftype; vfe_intf = params->entries[i].vfe_intf; From 53c6b89349730765a71722d274fc3fa41287d21f Mon Sep 17 00:00:00 2001 From: Ravi Kishore Tanuku Date: Wed, 22 Feb 2017 20:00:13 +0530 Subject: [PATCH 0783/1015] msm: camera: Add regulator enable and disable independent of CSID Regulator enable and disable of CSIPHY depends on the CSID module. Make the enable and disable of clk regulator independent of CSIPHY. CRs-Fixed: 1107702 Change-Id: Iabb5eb28d63b34a4c3201c53be17054a1907f4fe Signed-off-by: Ravi Kishore Tanuku --- arch/arm/boot/dts/qcom/msm8996-camera.dtsi | 38 ++++++-- .../msm/camera_v2/sensor/csiphy/msm_csiphy.c | 94 +++++++++++++++++-- .../msm/camera_v2/sensor/csiphy/msm_csiphy.h | 6 +- 3 files changed, 120 insertions(+), 18 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msm8996-camera.dtsi b/arch/arm/boot/dts/qcom/msm8996-camera.dtsi index 3e1a8891dfc60..e4960d0580ea7 100644 --- a/arch/arm/boot/dts/qcom/msm8996-camera.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-camera.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -28,18 +28,24 @@ reg-names = "csiphy", "csiphy_clk_mux"; interrupts = <0 78 0>; interrupt-names = "csiphy"; - clocks = <&clock_mmss clk_camss_top_ahb_clk>, + qcom,csi-vdd-voltage = <1250000>; + qcom,mipi-csi-vdd-supply = <&pm8994_l2>; + mmagic-supply = <&gdsc_mmagic_camss>; + gdscr-supply = <&gdsc_camss_top>; + qcom,cam-vreg-name = "mmagic", "gdscr"; + clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>, + <&clock_mmss clk_camss_top_ahb_clk>, <&clock_mmss clk_camss_ispif_ahb_clk>, <&clock_mmss clk_csi0phytimer_clk_src>, <&clock_mmss clk_camss_csi0phytimer_clk>, <&clock_mmss clk_camss_ahb_clk>, <&clock_mmss clk_csiphy0_3p_clk_src>, <&clock_mmss clk_camss_csiphy0_3p_clk>; - clock-names = "camss_top_ahb_clk", + clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", "camss_ahb_clk", "csiphy_3p_clk_src", "csi_phy_3p_clk"; - qcom,clock-rates = <0 0 200000000 0 0 100000000 0>; + qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>; }; qcom,csiphy@a35000 { @@ -49,18 +55,24 @@ reg-names = "csiphy", "csiphy_clk_mux"; interrupts = <0 79 0>; interrupt-names = "csiphy"; - clocks = <&clock_mmss clk_camss_top_ahb_clk>, + qcom,csi-vdd-voltage = <1250000>; + qcom,mipi-csi-vdd-supply = <&pm8994_l2>; + mmagic-supply = <&gdsc_mmagic_camss>; + gdscr-supply = <&gdsc_camss_top>; + qcom,cam-vreg-name = "mmagic", "gdscr"; + clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>, + <&clock_mmss clk_camss_top_ahb_clk>, <&clock_mmss clk_camss_ispif_ahb_clk>, <&clock_mmss clk_csi1phytimer_clk_src>, <&clock_mmss clk_camss_csi1phytimer_clk>, <&clock_mmss clk_camss_ahb_clk>, <&clock_mmss clk_csiphy1_3p_clk_src>, <&clock_mmss clk_camss_csiphy1_3p_clk>; - clock-names = "camss_top_ahb_clk", + clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", "camss_ahb_clk", "csiphy_3p_clk_src", "csi_phy_3p_clk"; - qcom,clock-rates = <0 0 200000000 0 0 100000000 0>; + qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>; }; qcom,csiphy@a36000 { @@ -70,18 +82,24 @@ reg-names = "csiphy", "csiphy_clk_mux"; interrupts = <0 80 0>; interrupt-names = "csiphy"; - clocks = <&clock_mmss clk_camss_top_ahb_clk>, + qcom,csi-vdd-voltage = <1250000>; + qcom,mipi-csi-vdd-supply = <&pm8994_l2>; + mmagic-supply = <&gdsc_mmagic_camss>; + gdscr-supply = <&gdsc_camss_top>; + qcom,cam-vreg-name = "mmagic", "gdscr"; + clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>, + <&clock_mmss clk_camss_top_ahb_clk>, <&clock_mmss clk_camss_ispif_ahb_clk>, <&clock_mmss clk_csi2phytimer_clk_src>, <&clock_mmss clk_camss_csi2phytimer_clk>, <&clock_mmss clk_camss_ahb_clk>, <&clock_mmss clk_csiphy2_3p_clk_src>, <&clock_mmss clk_camss_csiphy2_3p_clk>; - clock-names = "camss_top_ahb_clk", + clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", "camss_ahb_clk", "csiphy_3p_clk_src", "csi_phy_3p_clk"; - qcom,clock-rates = <0 0 200000000 0 0 100000000 0>; + qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>; }; qcom,csid@a30000 { diff --git a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c index 9d6952eefe601..d1bb9af3d8da2 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c +++ b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -782,6 +782,25 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) CDBG("%s:%d called\n", __func__, __LINE__); + rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy config_vreg failed\n", + __func__, __LINE__); + goto csiphy_vreg_config_fail; + } + rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy enable_vreg failed\n", + __func__, __LINE__); + goto top_vreg_enable_failed; + } + rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev, csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk, csiphy_dev->num_clk, true); @@ -790,7 +809,7 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) if (rc < 0) { pr_err("%s: csiphy clk enable failed\n", __func__); csiphy_dev->ref_count--; - goto csiphy_resource_fail; + goto csiphy_enable_clk_fail; } CDBG("%s:%d called\n", __func__, __LINE__); @@ -818,7 +837,17 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) csiphy_dev->csiphy_state = CSIPHY_POWER_UP; return 0; -csiphy_resource_fail: +csiphy_enable_clk_fail: + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +top_vreg_enable_failed: + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +csiphy_vreg_config_fail: if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, CAM_AHB_SUSPEND_VOTE) < 0) pr_err("%s: failed to vote for AHB\n", __func__); @@ -856,6 +885,24 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) pr_err("%s: failed to vote for AHB\n", __func__); return rc; } + rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy config_vreg failed\n", + __func__, __LINE__); + goto csiphy_vreg_config_fail; + } + rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy enable_vreg failed\n", + __func__, __LINE__); + goto top_vreg_enable_failed; + } rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev, csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk, @@ -865,9 +912,9 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) if (rc < 0) { pr_err("%s: csiphy clk enable failed\n", __func__); csiphy_dev->ref_count--; - goto csiphy_resource_fail; + goto csiphy_enable_clk_fail; } - CDBG("%s:%d called\n", __func__, __LINE__); + CDBG("%s:%d clk enable success\n", __func__, __LINE__); if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW) msm_csiphy_3ph_reset(csiphy_dev); @@ -890,7 +937,17 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) csiphy_dev->csiphy_state = CSIPHY_POWER_UP; return 0; -csiphy_resource_fail: +csiphy_enable_clk_fail: + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +top_vreg_enable_failed: + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +csiphy_vreg_config_fail: if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, CAM_AHB_SUSPEND_VOTE) < 0) pr_err("%s: failed to vote for AHB\n", __func__); @@ -998,6 +1055,14 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg) csiphy_dev->csiphy_3p_clk, 2, false); } + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count, + NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0); + csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN; if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, @@ -1104,6 +1169,13 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg) csiphy_dev->csiphy_3p_clk, 2, false); } + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count, + NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0); + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count, + NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0); + csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN; if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, @@ -1419,6 +1491,14 @@ static int csiphy_probe(struct platform_device *pdev) goto csiphy_no_resource; } + rc = msm_camera_get_dt_vreg_data(pdev->dev.of_node, + &(new_csiphy_dev->csiphy_vreg), + &(new_csiphy_dev->regulator_count)); + if (rc < 0) { + pr_err("%s: get vreg data from dtsi fail\n", __func__); + rc = -EFAULT; + goto csiphy_no_resource; + } /* ToDo: Enable 3phase clock for dynamic clock enable/disable */ rc = msm_csiphy_get_clk_info(new_csiphy_dev, pdev); if (rc < 0) { @@ -1493,7 +1573,7 @@ static int msm_csiphy_exit(struct platform_device *pdev) &csiphy_dev->csiphy_all_clk, csiphy_dev->num_all_clk); - msm_camera_put_reg_base(pdev, csiphy_dev->base, "csid", true); + msm_camera_put_reg_base(pdev, csiphy_dev->base, "csiphy", true); if (csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V30) { msm_camera_put_reg_base(pdev, csiphy_dev->clk_mux_base, "csiphy_clk_mux", true); diff --git a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h index 4b3c40772517a..07a08110885b4 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h +++ b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -20,6 +20,7 @@ #include #include "msm_sd.h" #include "msm_camera_io_util.h" +#include "msm_camera_dt_util.h" #include "cam_soc_api.h" #define MAX_CSIPHY 3 @@ -168,6 +169,9 @@ struct csiphy_device { uint8_t num_irq_registers; uint32_t csiphy_sof_debug; uint32_t csiphy_sof_debug_count; + struct camera_vreg_t *csiphy_vreg; + struct regulator *csiphy_reg_ptr[MAX_REGULATOR]; + int32_t regulator_count; }; #define VIDIOC_MSM_CSIPHY_RELEASE \ From a72568c2c35211f68ae5262805a96f0113fc9fb8 Mon Sep 17 00:00:00 2001 From: Siba Prasad Date: Thu, 27 Apr 2017 20:05:30 +0530 Subject: [PATCH 0784/1015] mmc: card: block: check the user controlled parameters to avoid overflow According to specs, some commands require a delay after issuing the command. idata->ic struct is received from user in mmc_blk_ioctl_cmd(). So idata->ic.postsleep_min_us, idata->ic.postsleep_max_us are user controlled. If the min and max values are set such as max < min, then operation in the function do_usleep_range will overflow. For avoiding this, put a condition for checking max < min. If the condition is true, then print the error message with respective values and return error. Change-Id: I3722b8527a7caa6a76dafb9fd23187e77f2478ee Signed-off-by: Siba Prasad --- drivers/mmc/card/block.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 2c7bd98b067dc..eb54463893c89 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -620,6 +620,15 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, idata = mmc_blk_ioctl_copy_from_user(ic_ptr); if (IS_ERR_OR_NULL(idata)) return PTR_ERR(idata); + if (idata->ic.postsleep_max_us < idata->ic.postsleep_min_us) { + pr_err("%s: min value: %u must not be greater than max value: %u\n", + __func__, idata->ic.postsleep_min_us, + idata->ic.postsleep_max_us); + WARN_ON(1); + err = -EPERM; + goto cmd_err; + } + md = mmc_blk_get(bdev->bd_disk); if (!md) { err = -EINVAL; From 6fbd9ea5ab657d87f0b944d099d7955715f6881e Mon Sep 17 00:00:00 2001 From: Harsh Sahu Date: Thu, 16 Feb 2017 20:25:39 -0800 Subject: [PATCH 0785/1015] msm: mdss: Validating data values before passing on as operand mdss_mdp_dfps_update_params uses data as operand. Hence the values are validated against their max values allowed to avoid any overflow in this change. Change-Id: I630b9390a18446cd461154e31e08642a8ff06ed8 Signed-off-by: Harsh Sahu --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index 2350bf6b8df6d..a619a7bea0cba 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -48,6 +48,12 @@ #define BUF_POOL_SIZE 32 +#define DFPS_DATA_MAX_HFP 8192 +#define DFPS_DATA_MAX_HBP 8192 +#define DFPS_DATA_MAX_HPW 8192 +#define DFPS_DATA_MAX_FPS 0x7fffffff +#define DFPS_DATA_MAX_CLK_RATE 250000 + static int mdss_mdp_overlay_free_fb_pipe(struct msm_fb_data_type *mfd); static int mdss_mdp_overlay_fb_parse_dt(struct msm_fb_data_type *mfd); static int mdss_mdp_overlay_off(struct msm_fb_data_type *mfd); @@ -3081,6 +3087,13 @@ static ssize_t dynamic_fps_sysfs_wta_dfps(struct device *dev, return count; } + if (data.hfp > DFPS_DATA_MAX_HFP || data.hbp > DFPS_DATA_MAX_HBP || + data.hpw > DFPS_DATA_MAX_HPW || data.fps > DFPS_DATA_MAX_FPS || + data.clk_rate > DFPS_DATA_MAX_CLK_RATE){ + pr_err("Data values out of bound.\n"); + return -EINVAL; + } + rc = mdss_mdp_dfps_update_params(mfd, pdata, &data); if (rc) { pr_err("failed to set dfps params\n"); From 06f55e52ba965ddc9fab4c3b0109e680668a77f5 Mon Sep 17 00:00:00 2001 From: Kishor PK Date: Thu, 30 Mar 2017 14:23:37 +0530 Subject: [PATCH 0786/1015] soc: qcom: pil: Avoid possible buffer overflow during Modem boot Buffer overflow can occur if MBA firmware size exceeds 1MB. So validate size before copying the firmware. Change-Id: I2d5ffc1b9c6db7fd978cb1e4dbd07d283b186a80 CRs-Fixed: 2001803 Signed-off-by: Kishor PK --- drivers/soc/qcom/pil-msa.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/soc/qcom/pil-msa.c b/drivers/soc/qcom/pil-msa.c index 4eb59ed549628..a61ecc14dc2d5 100644 --- a/drivers/soc/qcom/pil-msa.c +++ b/drivers/soc/qcom/pil-msa.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -595,7 +595,15 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) /* Load the MBA image into memory */ count = fw->size; - memcpy(mba_dp_virt, data, count); + if (count <= SZ_1M) { + /* Ensures memcpy is done for max 1MB fw size */ + memcpy(mba_dp_virt, data, count); + } else { + dev_err(pil->dev, "%s fw image loading into memory is failed due to fw size overflow\n", + __func__); + ret = -EINVAL; + goto err_mba_data; + } /* Ensure memcpy of the MBA memory is done before loading the DP */ wmb(); From 5fca64479cdae41f1e4038593a5dde3ff2c9dfe6 Mon Sep 17 00:00:00 2001 From: Harsh Sahu Date: Thu, 13 Apr 2017 15:38:46 -0700 Subject: [PATCH 0787/1015] msm: mdss: fix race condition during mdp debugfs release Fix race condition in the release of the mdp debugfs functions panel_debug_base_release and mdss_debug_base_release by adding the lock for unpreempted freeing of the buffer so that multiple concurrent processes cannot affect the release which can possibly lead to use-after-free operation on the buffer. Change-Id: I9586081b65ae2eb0e7f6e30c606ee748ae9ef7e8 Signed-off-by: Harsh Sahu --- drivers/video/msm/mdss/mdss_debug.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_debug.c b/drivers/video/msm/mdss/mdss_debug.c index 3dc2c2bc14c9e..0a13956078bb4 100644 --- a/drivers/video/msm/mdss/mdss_debug.c +++ b/drivers/video/msm/mdss/mdss_debug.c @@ -59,11 +59,13 @@ static int panel_debug_base_open(struct inode *inode, struct file *file) static int panel_debug_base_release(struct inode *inode, struct file *file) { struct mdss_debug_base *dbg = file->private_data; + mutex_lock(&mdss_debug_lock); if (dbg && dbg->buf) { kfree(dbg->buf); dbg->buf_len = 0; dbg->buf = NULL; } + mutex_unlock(&mdss_debug_lock); return 0; } @@ -385,11 +387,13 @@ static int mdss_debug_base_open(struct inode *inode, struct file *file) static int mdss_debug_base_release(struct inode *inode, struct file *file) { struct mdss_debug_base *dbg = file->private_data; + mutex_lock(&mdss_debug_lock); if (dbg && dbg->buf) { kfree(dbg->buf); dbg->buf_len = 0; dbg->buf = NULL; } + mutex_unlock(&mdss_debug_lock); return 0; } From b41684d02b060172abad684f85c1523724628ca6 Mon Sep 17 00:00:00 2001 From: Avaneesh Kumar Dwivedi Date: Fri, 17 Mar 2017 16:41:13 +0530 Subject: [PATCH 0788/1015] soc: qcom: Skip clearing modem FW region post load failure In existing implementation, we are clearing fw region when loading fails midway. This is not in consonance with MBA design so differentiate between modem and other PIL modules. While at it rectify the data type of subsys_state in qmi_client_info as well. Change-Id: I985456fca42346947eac24df5bf66599dcbf4c53 Signed-off-by: Avaneesh Kumar Dwivedi Signed-off-by: Srinivasarao P --- drivers/soc/qcom/peripheral-loader.c | 3 ++- drivers/soc/qcom/peripheral-loader.h | 4 +++- drivers/soc/qcom/pil-q6v5.c | 3 ++- drivers/soc/qcom/subsys-pil-tz.c | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 2d73ca96c2726..4edad39970504 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -913,7 +913,8 @@ int pil_boot(struct pil_desc *desc) &desc->attrs); priv->region = NULL; } - pil_clear_segment(desc); + if (desc->clear_fw_region) + pil_clear_segment(desc); pil_release_mmap(desc); } return ret; diff --git a/drivers/soc/qcom/peripheral-loader.h b/drivers/soc/qcom/peripheral-loader.h index 802abe26a9606..b0c83150dad9d 100644 --- a/drivers/soc/qcom/peripheral-loader.h +++ b/drivers/soc/qcom/peripheral-loader.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -38,6 +38,7 @@ struct pil_priv; * @shutdown_fail: Set if PIL op for shutting down subsystem fails. * @modem_ssr: true if modem is restarting, false if booting for first time. * @subsys_vmid: memprot id for the subsystem. + * @clear_fw_region: Clear fw region on failure in loading. */ struct pil_desc { const char *name; @@ -57,6 +58,7 @@ struct pil_desc { bool shutdown_fail; bool modem_ssr; u32 subsys_vmid; + bool clear_fw_region; }; /** diff --git a/drivers/soc/qcom/pil-q6v5.c b/drivers/soc/qcom/pil-q6v5.c index f96bd81c4d42f..fa6566c94bd22 100644 --- a/drivers/soc/qcom/pil-q6v5.c +++ b/drivers/soc/qcom/pil-q6v5.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -584,6 +584,7 @@ struct q6v5_data *pil_q6v5_init(struct platform_device *pdev) if (ret) return ERR_PTR(ret); + desc->clear_fw_region = false; desc->dev = &pdev->dev; drv->qdsp6v5_2_0 = of_device_is_compatible(pdev->dev.of_node, diff --git a/drivers/soc/qcom/subsys-pil-tz.c b/drivers/soc/qcom/subsys-pil-tz.c index 19a306d40511d..c8d6150494879 100644 --- a/drivers/soc/qcom/subsys-pil-tz.c +++ b/drivers/soc/qcom/subsys-pil-tz.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1000,6 +1000,7 @@ static int pil_tz_driver_probe(struct platform_device *pdev) d->desc.ops = &pil_ops_trusted; d->desc.proxy_timeout = PROXY_TIMEOUT_MS; + d->desc.clear_fw_region = true; rc = of_property_read_u32(pdev->dev.of_node, "qcom,proxy-timeout-ms", &proxy_timeout); From b5e927eb4cc1fde7e5c63abaa18c98d4914f897c Mon Sep 17 00:00:00 2001 From: Avaneesh Kumar Dwivedi Date: Mon, 20 Mar 2017 15:53:15 +0530 Subject: [PATCH 0789/1015] soc: qcom: Do not clear segments if pil boot failed in memory allocation PIL boot failure if happened due to memory allocation failure then skip clearing segments as there is nothing loaded in fw region Change-Id: If0c09dd47941be0d9fe42496db43365ece32f3e9 Signed-off-by: Avaneesh Kumar Dwivedi Signed-off-by: Srinivasarao P --- drivers/soc/qcom/peripheral-loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 4edad39970504..8bba4fc2404dd 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -913,7 +913,7 @@ int pil_boot(struct pil_desc *desc) &desc->attrs); priv->region = NULL; } - if (desc->clear_fw_region) + if (desc->clear_fw_region && priv->region_start) pil_clear_segment(desc); pil_release_mmap(desc); } From 9ba289ad72f2b66c87f4923986f49ff215583419 Mon Sep 17 00:00:00 2001 From: Gaurav Kohli Date: Sat, 25 Mar 2017 17:36:30 +0530 Subject: [PATCH 0790/1015] soc: qcom: pil: Explicitly clear the subsystem loading address Explicitly clear the subsystem loading address in case of any memory failure. It will help to avoid any platform dependency Change-Id: I3be8f6318d68f02c02e637fc34f4a868e9fafa45 Signed-off-by: Gaurav Kohli --- drivers/soc/qcom/peripheral-loader.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 8bba4fc2404dd..9e7007da7ed42 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -461,6 +461,8 @@ static int pil_alloc_region(struct pil_priv *priv, phys_addr_t min_addr, if (region == NULL) { pil_err(priv->desc, "Failed to allocate relocatable region of size %zx\n", size); + priv->region_start = 0; + priv->region_end = 0; return -ENOMEM; } From c378b47fc46d909d89f37d6ee3e4737b0c98cdb1 Mon Sep 17 00:00:00 2001 From: Gaurav Kohli Date: Sat, 25 Mar 2017 17:36:30 +0530 Subject: [PATCH 0791/1015] soc: qcom: pil: Explicitly clear the subsystem loading address Explicitly clear the subsystem loading address in case of any memory failure. It will help to avoid any platform dependency. Change-Id: I3be8f6318d68f02c02e637fc34f4a868e9fafa45 Signed-off-by: Gaurav Kohli --- drivers/soc/qcom/peripheral-loader.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 8bba4fc2404dd..9e7007da7ed42 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -461,6 +461,8 @@ static int pil_alloc_region(struct pil_priv *priv, phys_addr_t min_addr, if (region == NULL) { pil_err(priv->desc, "Failed to allocate relocatable region of size %zx\n", size); + priv->region_start = 0; + priv->region_end = 0; return -ENOMEM; } From be5c7c077ce0a4f2be9bf8d2559232a464519186 Mon Sep 17 00:00:00 2001 From: Manu Gautam Date: Mon, 1 May 2017 16:06:49 +0530 Subject: [PATCH 0792/1015] USB: dwc3: Add support for ISOC high bandwidth transfer in HS mode Program ISOC TRB so that DWC3 can initiate more than one data transfer in a micro frame. Change-Id: I9465faf7f0e88c05bfb2c013772d2ea3b43c93d7 Signed-off-by: Manu Gautam --- drivers/usb/dwc3/gadget.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 559210864fc99..973535041e111 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -832,6 +832,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb; bool zlp_appended = false; unsigned rlen; + int isoc_maxp; dev_vdbg(dwc->dev, "%s: req %pK dma %08llx length %d%s%s\n", dep->name, req, (unsigned long long) dma, @@ -865,6 +866,8 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, break; case USB_ENDPOINT_XFER_ISOC: + isoc_maxp = usb_endpoint_maxp(dep->endpoint.desc); + trb->size |= DWC3_TRB_SIZE_PCM1(isoc_maxp >> 11); if (!node) trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST; else From 7e2578952e753b61cd92094bf0c73578e224d48f Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Mon, 1 May 2017 16:01:06 +0530 Subject: [PATCH 0793/1015] usb: gadget: Add support for fifo resize of user specified IN endpoint Add support for high bandwidth transfer on Isochronous IN endpoint by allowing fifo_resize on a particular endpoint using high_bw_ep_in_num module parameter. To enable fifo resize so as to support high bandwidth transfers on Isoc IN endpoint: 1. echo 0 > /sys/class/android_usb/android0/enable 2. echo > /sys/module/dwc3/parameters/high_bw_ep_in_num 3. echo 1 > /sys/class/android_usb/android0/enable CRs-fixed: 2043149 Change-Id: I2bae02cb5e33ccd15622acf4a4e160452b670d96 Signed-off-by: Sriharsha Allenki --- drivers/usb/dwc3/gadget.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 973535041e111..534d2d7d39e4e 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -17,6 +17,8 @@ */ #include +#include +#include #include #include #include @@ -41,6 +43,16 @@ static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc, bool remote_wakeup); static int dwc3_gadget_wakeup_int(struct dwc3 *dwc); +/* + * Some USB functions' endpoints are not enabled at set config stage. + * So fifo_resize cannot happen for these endpoints. + * So, user can specify Isochronous IN endpoint using high_bw_ep_in_num + * to enable fifo_resize to support high bandwidth transfers. + */ +static int high_bw_ep_in_num; +module_param(high_bw_ep_in_num, int, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(high_bw_ep_in_num, + "Isoc ep number to support for HS high bandwidth transfer"); /** * dwc3_gadget_set_test_mode - Enables USB2 Test Modes * @dwc: pointer to our context structure @@ -215,6 +227,9 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc) if (dep->endpoint.ep_type == EP_TYPE_GSI) mult = 3; + if (num == high_bw_ep_in_num) + mult = 3; + if (!(dep->flags & DWC3_EP_ENABLED)) { dev_dbg(dwc->dev, "ep%dIn not enabled", num); goto resize_fifo; From 66526fcfc38b6cddde518e865f1663ea595303bc Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Mon, 1 May 2017 16:01:06 +0530 Subject: [PATCH 0794/1015] usb: gadget: f_uvc: Enable high bandwidth transfers Enable high bandwidth transfers on Video Streaming Isoc IN endpoint for f_uvc driver by setting the module parameter streaming_maxpacket to 3072. This will enable mult transactions on the Video Streaming Isoc IN endpoint. Fix the buffer size calculation of each USB request as the earlier calculation doesn't work for endpoints with mult transactions enabled. CRs-fixed: 2043149 Change-Id: Id7d4a5aeb73c0152e4e41ce8d7c71956ea290ebc Signed-off-by: Sriharsha Allenki --- drivers/usb/gadget/function/u_uvc.h | 2 +- drivers/usb/gadget/function/uvc_video.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/usb/gadget/function/u_uvc.h b/drivers/usb/gadget/function/u_uvc.h index 824f2ba8874d3..96d3f39441c9a 100644 --- a/drivers/usb/gadget/function/u_uvc.h +++ b/drivers/usb/gadget/function/u_uvc.h @@ -24,7 +24,7 @@ module_param(streaming_interval, uint, S_IRUGO|S_IWUSR); \ MODULE_PARM_DESC(streaming_interval, "1 - 16"); \ \ - static unsigned int streaming_maxpacket = 1024; \ + static unsigned int streaming_maxpacket = 3072; \ module_param(streaming_maxpacket, uint, S_IRUGO|S_IWUSR); \ MODULE_PARM_DESC(streaming_maxpacket, "1-1023 (FS), 1-3072 (hs/ss)"); \ \ diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c index 9cb86bc1a9a54..ee09ae7c07cbd 100644 --- a/drivers/usb/gadget/function/uvc_video.c +++ b/drivers/usb/gadget/function/uvc_video.c @@ -240,9 +240,11 @@ uvc_video_alloc_requests(struct uvc_video *video) BUG_ON(video->req_size); - req_size = video->ep->maxpacket + req_size = (video->ep->maxpacket & 0x7FF) * max_t(unsigned int, video->ep->maxburst, 1) - * (video->ep->mult + 1); + * (max_t(unsigned int, + (video->ep->maxpacket >> 11) & 0x3, + video->ep->mult) + 1); for (i = 0; i < UVC_NUM_REQUESTS; ++i) { video->req_buffer[i] = kmalloc(req_size, GFP_KERNEL); From 0a2001fa3bd39d68dbddce10e6b38933d3b9948b Mon Sep 17 00:00:00 2001 From: Kamal Negi Date: Tue, 2 May 2017 12:44:32 +0530 Subject: [PATCH 0795/1015] radio-iris: Use copy_from_user API to access userspace memory Directly accessing userspace memory pointer in kernel space without checking validity of pointer. This can lead to security vulnerability. Use copy_from_user API's to make sure there is no illegal memory access. Change-Id: I66a0b1931814ee19634a30dee02a5600066aa70b Signed-off-by: Kamal Negi --- drivers/media/radio/radio-iris.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/media/radio/radio-iris.c b/drivers/media/radio/radio-iris.c index bd4eb92bb4567..eb364e8d95ddb 100644 --- a/drivers/media/radio/radio-iris.c +++ b/drivers/media/radio/radio-iris.c @@ -3745,6 +3745,7 @@ static int iris_vidioc_s_ext_ctrls(struct file *file, void *priv, struct hci_fm_set_cal_req_proc proc_cal_req; struct hci_fm_set_spur_table_req spur_tbl_req; char *spur_data; + char tmp_buf[2]; struct iris_device *radio = video_get_drvdata(video_devdata(file)); char *data = NULL; @@ -3881,9 +3882,18 @@ static int iris_vidioc_s_ext_ctrls(struct file *file, void *priv, case V4L2_CID_PRIVATE_IRIS_SET_SPURTABLE: memset(&spur_tbl_req, 0, sizeof(spur_tbl_req)); data = (ctrl->controls[0]).string; - bytes_to_copy = (ctrl->controls[0]).size; - spur_tbl_req.mode = data[0]; - spur_tbl_req.no_of_freqs_entries = data[1]; + if (copy_from_user(&bytes_to_copy, &((ctrl->controls[0]).size), + sizeof(bytes_to_copy))) { + retval = -EFAULT; + goto END; + } + if (copy_from_user(&tmp_buf[0], &data[0], + sizeof(tmp_buf))) { + retval = -EFAULT; + goto END; + } + spur_tbl_req.mode = tmp_buf[0]; + spur_tbl_req.no_of_freqs_entries = tmp_buf[1]; if (((spur_tbl_req.no_of_freqs_entries * SPUR_DATA_LEN) != bytes_to_copy - 2) || From 81bb19694b54cae1781dc3da87ce8c354c380ac2 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Tue, 25 Apr 2017 17:39:41 +0530 Subject: [PATCH 0796/1015] msm: ipa: Fix for missing int overflow check in the refcount library Overflow of reference counter can lead to memory leak. Before incrementing the reference count, check with U32_MAX and return for error check. Change-Id: Ib96d36574ee086ec73c9836110cb2c98e8ae3d66 Acked-by: Mohammed Javid Signed-off-by: Utkarsh Saxena --- drivers/platform/msm/ipa/ipa_v2/ipa_rt.c | 6 ++++++ drivers/platform/msm/ipa/ipa_v3/ipa_rt.c | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c index 8efc2d825ea82..ca27488c52055 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c @@ -1349,6 +1349,10 @@ int ipa2_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup) mutex_lock(&ipa_ctx->lock); entry = __ipa_find_rt_tbl(lookup->ip, lookup->name); if (entry && entry->cookie == IPA_COOKIE) { + if (entry->ref_cnt == U32_MAX) { + IPAERR("fail: ref count crossed limit\n"); + goto ret; + } entry->ref_cnt++; lookup->hdl = entry->id; @@ -1358,6 +1362,8 @@ int ipa2_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup) result = 0; } + +ret: mutex_unlock(&ipa_ctx->lock); return result; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c index 4ee0a3e06ebf5..43d0a372166e2 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1611,6 +1611,10 @@ int ipa3_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup) mutex_lock(&ipa3_ctx->lock); entry = __ipa3_find_rt_tbl(lookup->ip, lookup->name); if (entry && entry->cookie == IPA_COOKIE) { + if (entry->ref_cnt == U32_MAX) { + IPAERR("fail: ref count crossed limit\n"); + goto ret; + } entry->ref_cnt++; lookup->hdl = entry->id; @@ -1620,6 +1624,8 @@ int ipa3_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup) result = 0; } + +ret: mutex_unlock(&ipa3_ctx->lock); return result; From a3576fb031f58fa75c9675830d07346a8a492146 Mon Sep 17 00:00:00 2001 From: Ravi kumar Koyyana Date: Mon, 27 Mar 2017 17:44:36 -0700 Subject: [PATCH 0797/1015] msm: camera2: cpp: Fix iommu_attach/detach compat_ioctl issue When the Camera application exercises the V4L2 ioctl operations, CPP driver would attempt to the copy user space buffer contents into the internal kernel buffer. If an invalid length of the user space buffer is passed onto the driver, it could trigger buffer overflow condition. Thus, fix this by copying user space buffer contents into kernel space buffer of the driver for further processing, only after checking for proper length of user space buffer. CRs-fixed: 2025367 Change-Id: I85cf4a961884c7bb0d036299b886044aef7baf7c Signed-off-by: Ravi kumar Koyyana --- .../msm/camera_v2/pproc/cpp/msm_cpp.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index aa8b8abe2879c..f83753612cb4a 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -2719,13 +2719,15 @@ static int32_t msm_cpp_fw_version(struct cpp_device *cpp_dev) return rc; } -static int msm_cpp_validate_input(unsigned int cmd, void *arg, +static int msm_cpp_validate_ioctl_input(unsigned int cmd, void *arg, struct msm_camera_v4l2_ioctl_t **ioctl_ptr) { switch (cmd) { case MSM_SD_SHUTDOWN: case MSM_SD_NOTIFY_FREEZE: case MSM_SD_UNNOTIFY_FREEZE: + case VIDIOC_MSM_CPP_IOMMU_ATTACH: + case VIDIOC_MSM_CPP_IOMMU_DETACH: break; default: { if (ioctl_ptr == NULL) { @@ -2734,8 +2736,9 @@ static int msm_cpp_validate_input(unsigned int cmd, void *arg, } *ioctl_ptr = arg; - if ((*ioctl_ptr == NULL) || - (*ioctl_ptr)->ioctl_ptr == NULL) { + if (((*ioctl_ptr) == NULL) || + ((*ioctl_ptr)->ioctl_ptr == NULL) || + ((*ioctl_ptr)->len == 0)) { pr_err("Error invalid ioctl argument cmd %u", cmd); return -EINVAL; } @@ -2767,7 +2770,7 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, return -EINVAL; } - rc = msm_cpp_validate_input(cmd, arg, &ioctl_ptr); + rc = msm_cpp_validate_ioctl_input(cmd, arg, &ioctl_ptr); if (rc != 0) { pr_err("input validation failed\n"); return rc; @@ -3260,7 +3263,7 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, (cpp_dev->stream_cnt == 0)) { rc = cam_smmu_ops(cpp_dev->iommu_hdl, CAM_SMMU_DETACH); if (rc < 0) { - pr_err("%s:%dError iommu atach failed\n", + pr_err("%s:%dError iommu detach failed\n", __func__, __LINE__); rc = -EINVAL; break; @@ -3269,6 +3272,7 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, } else { pr_err("%s:%d IOMMMU attach triggered in invalid state\n", __func__, __LINE__); + rc = -EINVAL; } break; } @@ -3901,7 +3905,8 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, default: pr_err_ratelimited("%s: unsupported compat type :%x LOAD %lu\n", __func__, cmd, VIDIOC_MSM_CPP_LOAD_FIRMWARE); - break; + mutex_unlock(&cpp_dev->mutex); + return -EINVAL; } mutex_unlock(&cpp_dev->mutex); @@ -3932,7 +3937,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, default: pr_err_ratelimited("%s: unsupported compat type :%d\n", __func__, cmd); - break; + return -EINVAL; } if (is_copytouser_req) { From 736e7697dec50dc280ac4d7269375b9dc17c2c4b Mon Sep 17 00:00:00 2001 From: Ravi kumar Koyyana Date: Tue, 11 Apr 2017 18:47:44 -0700 Subject: [PATCH 0798/1015] msm: camera2: cpp: Fix out-of-bounds frame or command buffer access When user application provides invalid (out of range) stripe size and stripe indices, while submitting requests for the stripe based image processing by the CPP kernel driver, the driver could perform out of bounds access of the internal buffers. This fix ensures that stripe size and indices of frame/command buffer are properly validated during the configuration and before processing such requests through the CPP hardware block. CRs-fixed: 2002207 Change-Id: Ib79e36fb507d8e75d8fc28afb990020a0e1bf845 Signed-off-by: Ravi kumar Koyyana --- .../msm/camera_v2/pproc/cpp/msm_cpp.c | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index f83753612cb4a..6f644d870b2c6 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -2326,9 +2326,29 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev, return -EINVAL; } - if (stripe_base == UINT_MAX || new_frame->num_strips > - (UINT_MAX - 1 - stripe_base) / stripe_size) { - pr_err("Invalid frame message,num_strips %d is large\n", + /* Stripe index starts at zero */ + if ((!new_frame->num_strips) || + (new_frame->first_stripe_index >= new_frame->num_strips) || + (new_frame->last_stripe_index >= new_frame->num_strips) || + (new_frame->first_stripe_index > + new_frame->last_stripe_index)) { + pr_err("Invalid frame message, #stripes=%d, stripe indices=[%d,%d]\n", + new_frame->num_strips, + new_frame->first_stripe_index, + new_frame->last_stripe_index); + return -EINVAL; + } + + if (!stripe_size) { + pr_err("Invalid frame message, invalid stripe_size (%d)!\n", + stripe_size); + return -EINVAL; + } + + if ((stripe_base == UINT_MAX) || + (new_frame->num_strips > + (UINT_MAX - 1 - stripe_base) / stripe_size)) { + pr_err("Invalid frame message, num_strips %d is large\n", new_frame->num_strips); return -EINVAL; } @@ -2568,13 +2588,14 @@ static int msm_cpp_cfg(struct cpp_device *cpp_dev, struct msm_cpp_frame_info_t *frame = NULL; struct msm_cpp_frame_info_t k_frame_info; int32_t rc = 0; - int32_t i = 0; - int32_t num_buff = sizeof(k_frame_info.output_buffer_info)/ - sizeof(struct msm_cpp_buffer_info_t); + uint32_t i = 0; + uint32_t num_buff = sizeof(k_frame_info.output_buffer_info) / + sizeof(struct msm_cpp_buffer_info_t); + if (copy_from_user(&k_frame_info, (void __user *)ioctl_ptr->ioctl_ptr, sizeof(k_frame_info))) - return -EFAULT; + return -EFAULT; frame = msm_cpp_get_frame(ioctl_ptr); if (!frame) { From 0a25e65c0b8f1c9dfcfd48299e3f8207a12938cf Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 12 Dec 2016 17:33:06 +0100 Subject: [PATCH 0799/1015] ALSA: pcm : Call kill_fasync() in stream lock Currently kill_fasync() is called outside the stream lock in snd_pcm_period_elapsed(). This is potentially racy, since the stream may get released even during the irq handler is running. Although snd_pcm_release_substream() calls snd_pcm_drop(), this doesn't guarantee that the irq handler finishes, thus the kill_fasync() call outside the stream spin lock may be invoked after the substream is detached, as recently reported by KASAN. As a quick workaround, move kill_fasync() call inside the stream lock. The fasync is rarely used interface, so this shouldn't have a big impact from the performance POV. Ideally, we should implement some sync mechanism for the proper finish of stream and irq handler. But this oneliner should suffice for most cases, so far. Change-Id: I6e50dfd91d6f8888a089d8bc29e1331c5e013a66 Reported-by: Baozeng Ding Signed-off-by: Takashi Iwai Signed-off-by: Willy Tarreau Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git Git-commit: a27178e05b7c332522df40904f27674e36ee3757 Signed-off-by: Dennis Cagle --- sound/core/pcm_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 55c89bb323ebd..cace4de9ca110 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -1877,10 +1877,10 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream) if (substream->timer_running) snd_timer_interrupt(substream->timer, 1); _end: + kill_fasync(&runtime->fasync, SIGIO, POLL_IN); snd_pcm_stream_unlock_irqrestore(substream, flags); if (runtime->transfer_ack_end) runtime->transfer_ack_end(substream); - kill_fasync(&runtime->fasync, SIGIO, POLL_IN); } EXPORT_SYMBOL(snd_pcm_period_elapsed); From cd176b4952608b54d88496eca451ce6e51064f9e Mon Sep 17 00:00:00 2001 From: Andy Whitcroft Date: Wed, 22 Mar 2017 07:29:31 +0000 Subject: [PATCH 0800/1015] xfrm_user: validate XFRM_MSG_NEWAE XFRMA_REPLAY_ESN_VAL replay_window When a new xfrm state is created during an XFRM_MSG_NEWSA call we validate the user supplied replay_esn to ensure that the size is valid and to ensure that the replay_window size is within the allocated buffer. However later it is possible to update this replay_esn via a XFRM_MSG_NEWAE call. There we again validate the size of the supplied buffer matches the existing state and if so inject the contents. We do not at this point check that the replay_window is within the allocated memory. This leads to out-of-bounds reads and writes triggered by netlink packets. This leads to memory corruption and the potential for privilege escalation. We already attempt to validate the incoming replay information in xfrm_new_ae() via xfrm_replay_verify_len(). This confirms that the user is not trying to change the size of the replay state buffer which includes the replay_esn. It however does not check the replay_window remains within that buffer. Add validation of the contained replay_window. CVE-2017-7184 Signed-off-by: Andy Whitcroft Acked-by: Steffen Klassert Signed-off-by: Linus Torvalds Change-Id: Ifc8055e9d3ee94c3e017f1f9b0be06cd171844a6 Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Git-commit: 677e806da4d916052585301785d847c3b3e6186a Signed-off-by: Dennis Cagle --- net/xfrm/xfrm_user.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index e812e988c111b..acf615be00db1 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -389,6 +389,9 @@ static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_es if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen) return -EINVAL; + if (up->replay_window > up->bmp_len * sizeof(__u32) * 8) + return -EINVAL; + return 0; } From d684876cf2701113e59230166cab561a11bdfe58 Mon Sep 17 00:00:00 2001 From: Andy Whitcroft Date: Thu, 23 Mar 2017 07:45:44 +0000 Subject: [PATCH 0801/1015] xfrm_user: validate XFRM_MSG_NEWAE incoming ESN size harder Kees Cook has pointed out that xfrm_replay_state_esn_len() is subject to wrapping issues. To ensure we are correctly ensuring that the two ESN structures are the same size compare both the overall size as reported by xfrm_replay_state_esn_len() and the internal length are the same. CVE-2017-7184 Signed-off-by: Andy Whitcroft Acked-by: Steffen Klassert Signed-off-by: Linus Torvalds Change-Id: I035fb0bbb9449fc999d83302c8343b0700316229 Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Git-commit: f843ee6dd019bcece3e74e76ad9df0155655d0df Signed-off-by: Dennis Cagle --- net/xfrm/xfrm_user.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index acf615be00db1..d5b9ded40216b 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -386,7 +386,12 @@ static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_es up = nla_data(rp); ulen = xfrm_replay_state_esn_len(up); - if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen) + /* Check the overall length and the internal bitmap length to avoid + * potential overflow. + */ + if (nla_len(rp) < ulen || + xfrm_replay_state_esn_len(replay_esn) != ulen || + replay_esn->bmp_len != up->bmp_len) return -EINVAL; if (up->replay_window > up->bmp_len * sizeof(__u32) * 8) From 83db66f442f1bd404459fbce74e706eaa9742c43 Mon Sep 17 00:00:00 2001 From: Robb Glasser Date: Tue, 14 Feb 2017 13:25:46 -0800 Subject: [PATCH 0802/1015] Prevent heap overflow in uvc driver The size of uvc_control_mapping is user controlled leading to a potential heap overflow in the uvc driver. This adds a check to verify the user provided size fits within the bounds of the defined buffer size. Bug: 33300353 Change-Id: If29c1b396633b6137966a12e38f6fd1841b045bd Signed-off-by: Robb Glasser Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 8bc3ec72a02052187397d0de1a7b8bbe7340451c Signed-off-by: Dennis Cagle --- drivers/media/usb/uvc/uvc_ctrl.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index 3e59b288b8a89..57d2f89350d26 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1991,6 +1991,9 @@ int uvc_ctrl_add_mapping(struct uvc_video_chain *chain, if (!found) return -ENOENT; + if (ctrl->info.size < mapping->size) + return -EINVAL; + if (mutex_lock_interruptible(&chain->ctrl_mutex)) return -ERESTARTSYS; From 95dbc0618c6d07f4d57e6c4933c8e62f1b0c7db9 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Fri, 3 Mar 2017 15:40:12 -0800 Subject: [PATCH 0803/1015] tracing: do not leak kernel addresses This likely breaks tracing tools like trace-cmd. It logs in the same format but now addresses are all 0x0. Bug: 34277115 Change-Id: Ifb0d4d2a184bf0d95726de05b1acee0287a375d9 Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 9ad8f2cc1bb73a3e2255dff4ee9c45c909869225 Signed-off-by: Dennis Cagle --- kernel/trace/trace_printk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c index 14ffaa59a9e9e..50f750036ab29 100644 --- a/kernel/trace/trace_printk.c +++ b/kernel/trace/trace_printk.c @@ -294,7 +294,7 @@ static int t_show(struct seq_file *m, void *v) if (!*fmt) return 0; - seq_printf(m, "0x%lx : \"", *(unsigned long *)fmt); + seq_printf(m, "0x%lx : \"", 0L); /* * Tabs and new lines need to be converted. From d652a4f3674ed807ad2d448b21f4fc425d56b12a Mon Sep 17 00:00:00 2001 From: Gopikrishna Mogasati Date: Thu, 20 Apr 2017 16:25:20 +0530 Subject: [PATCH 0804/1015] diag: Fix to check for command length size Fix to validate payload length size while forwarding commands to remote processor. CRs-Fixed: 2004417 Change-Id: Ia047f7895002409e176eeb9e1ddfef69849636ea Signed-off-by: Sreelakshmi Gownipalli Signed-off-by: Gopikrishna Mogasati --- drivers/char/diag/diagchar_core.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index 616ed72d55140..8b1a67f9e491e 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -921,6 +921,11 @@ static int diag_send_raw_data_remote(int proc, void *buf, int len, hdlc_disabled = driver->hdlc_disabled; if (hdlc_disabled) { payload = *(uint16_t *)(buf + 2); + if (payload > DIAG_MAX_HDLC_BUF_SIZE) { + pr_err("diag: Dropping packet, payload size is %d\n", + payload); + return -EBADMSG; + } driver->hdlc_encode_buf_len = payload; /* * Adding 4 bytes for start (1 byte), version (1 byte) and From 3e11e562e39529d7a40fabf7f4c8981f0c58ff5f Mon Sep 17 00:00:00 2001 From: Harsh Sahu Date: Fri, 21 Apr 2017 16:12:22 -0700 Subject: [PATCH 0805/1015] msm: mdss: fix memcpy source and dest memory buffer size mismatch Currently memcpy is copying from a bigger memory size to a smaller memory size. This change corrects this issue by performing the memcopy restricted to the smaller of the src or dest memory buffer. Change-Id: Ibbe5665083799a4262d3cfbb06f94f3e35e03748 Signed-off-by: Harsh Sahu --- drivers/video/msm/mdss/mdss_compat_utils.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_compat_utils.c b/drivers/video/msm/mdss/mdss_compat_utils.c index e86c087d13a5f..f599bb5b445fa 100644 --- a/drivers/video/msm/mdss/mdss_compat_utils.c +++ b/drivers/video/msm/mdss/mdss_compat_utils.c @@ -119,6 +119,9 @@ static unsigned int __do_compat_ioctl_nr(unsigned int cmd32) static void __copy_atomic_commit_struct(struct mdp_layer_commit *commit, struct mdp_layer_commit32 *commit32) { + unsigned int destsize = sizeof(commit->commit_v1.reserved); + unsigned int srcsize = sizeof(commit32->commit_v1.reserved); + unsigned int count = (destsize <= srcsize ? destsize : srcsize); commit->version = commit32->version; commit->commit_v1.flags = commit32->commit_v1.flags; commit->commit_v1.input_layer_cnt = @@ -126,7 +129,7 @@ static void __copy_atomic_commit_struct(struct mdp_layer_commit *commit, commit->commit_v1.left_roi = commit32->commit_v1.left_roi; commit->commit_v1.right_roi = commit32->commit_v1.right_roi; memcpy(&commit->commit_v1.reserved, &commit32->commit_v1.reserved, - sizeof(commit32->commit_v1.reserved)); + count); } static struct mdp_input_layer32 *__create_layer_list32( From b431335f4a89569987daa9abc95d78e04b07b5b3 Mon Sep 17 00:00:00 2001 From: Archana Sathyakumar Date: Tue, 13 Sep 2016 14:36:04 -0600 Subject: [PATCH 0806/1015] power: qcom: ea: Fix uninitialized temperature and cpu variable In trigger_cpu_pwr_stats_calc(), if the local variable 'prev_temp' is already updated with the latest temperature then temp might be used uninitialized. When scheduler's power data snapshot updates in the sampling thread, update the temperature as well if the temperature has been the same for some duration such that temp is used only when the sensor is read. In update_userspace_power, incorrect cpumask could cause the function to use uninitialized cpu variable. Initialize it to -1 at the beginning of the function and treat unmodified value as error condition. Change-Id: Ieccdc3f54f9c9f2cecc6b8578400c6fe44333177 Signed-off-by: Archana Sathyakumar --- drivers/power/qcom/msm-core.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/power/qcom/msm-core.c b/drivers/power/qcom/msm-core.c index a8c5650d50d9b..6951d23337d4f 100644 --- a/drivers/power/qcom/msm-core.c +++ b/drivers/power/qcom/msm-core.c @@ -240,10 +240,10 @@ void trigger_cpu_pwr_stats_calc(void) if (cpu_node->sensor_id < 0) continue; - if (cpu_node->temp == prev_temp[cpu]) + if (cpu_node->temp == prev_temp[cpu]) { sensor_get_temp(cpu_node->sensor_id, &temp); - - cpu_node->temp = temp / scaling_factor; + cpu_node->temp = temp / scaling_factor; + } prev_temp[cpu] = cpu_node->temp; @@ -373,7 +373,7 @@ static int update_userspace_power(struct sched_params __user *argp) { int i; int ret; - int cpu; + int cpu = -1; struct cpu_activity_info *node; struct cpu_static_info *sp, *clear_sp; int cpumask, cluster, mpidr; @@ -396,7 +396,7 @@ static int update_userspace_power(struct sched_params __user *argp) } } - if (cpu >= num_possible_cpus()) + if ((cpu < 0) || (cpu >= num_possible_cpus())) return -EINVAL; node = &activity[cpu]; From c61c8535499e42e5db9bf38364edd6cd51ff8245 Mon Sep 17 00:00:00 2001 From: Maulik Shah Date: Fri, 12 May 2017 10:20:57 +0530 Subject: [PATCH 0807/1015] power: qcom: Fix issue with power table notifications Power table notifications are not sent even if cpu is having valid power data. Fix this by correcting condition to send notifications. Change-Id: I77d00e328e9ed780e0b7434d3642bb44b3c9cc7f Signed-off-by: Maulik Shah --- drivers/power/qcom/msm-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/power/qcom/msm-core.c b/drivers/power/qcom/msm-core.c index a8c5650d50d9b..5294c1331c285 100644 --- a/drivers/power/qcom/msm-core.c +++ b/drivers/power/qcom/msm-core.c @@ -455,7 +455,7 @@ static int update_userspace_power(struct sched_params __user *argp) spin_unlock(&update_lock); for_each_possible_cpu(cpu) { - if (pdata_valid[cpu]) + if (!pdata_valid[cpu]) continue; blocking_notifier_call_chain( From 9c871b603dc12823c576dbb0100a005857b49586 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena Date: Mon, 24 Apr 2017 22:56:31 +0530 Subject: [PATCH 0808/1015] msm: ipa: Add mutext protection when updating notify req cache IOCTL interface to send QMI NOTIFY REQ messages can be called from multiple contexts which can result into buffer overflow of msg cache. Make a change to add mutext protection to prevent buffer overflow. Change-Id: Ib6d879e29971ae40398a9dc8759fb4dbbf166429 Acked-by: Chaitanya Pratapa Signed-off-by: Utkarsh Saxena --- .../platform/msm/ipa/ipa_v3/ipa_qmi_service.c | 49 +++++++++++++------ .../platform/msm/ipa/ipa_v3/ipa_qmi_service.h | 14 +++++- drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c | 4 ++ 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c index 11d196e23bf35..09c4dfb04962d 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -52,6 +52,8 @@ struct ipa3_qmi_context *ipa3_qmi_ctx; static bool workqueues_stopped; static bool ipa3_modem_init_cmplt; static bool first_time_handshake; +struct mutex ipa3_qmi_lock; + /* QMI A5 service */ static struct msg_desc ipa3_indication_reg_req_desc = { @@ -597,12 +599,17 @@ int ipa3_qmi_filter_request_send(struct ipa_install_fltr_rule_req_msg_v01 *req) req->filter_spec_ex_list_len); } - /* cache the qmi_filter_request */ - memcpy(&(ipa3_qmi_ctx->ipa_install_fltr_rule_req_msg_cache[ - ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg]), - req, sizeof(struct ipa_install_fltr_rule_req_msg_v01)); - ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg++; - ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg %= 10; + mutex_lock(&ipa3_qmi_lock); + if (ipa3_qmi_ctx != NULL) { + /* cache the qmi_filter_request */ + memcpy(&(ipa3_qmi_ctx->ipa_install_fltr_rule_req_msg_cache[ + ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg]), + req, + sizeof(struct ipa_install_fltr_rule_req_msg_v01)); + ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg++; + ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg %= 10; + } + mutex_unlock(&ipa3_qmi_lock); req_desc.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INSTALL_FILTER_RULE_REQ_V01; @@ -624,7 +631,6 @@ int ipa3_qmi_filter_request_send(struct ipa_install_fltr_rule_req_msg_v01 *req) resp.resp.error, "ipa_install_filter"); } - int ipa3_qmi_enable_force_clear_datapath_send( struct ipa_enable_force_clear_datapath_req_msg_v01 *req) { @@ -733,12 +739,17 @@ int ipa3_qmi_filter_notify_send( return -EINVAL; } - /* cache the qmi_filter_request */ - memcpy(&(ipa3_qmi_ctx->ipa_fltr_installed_notif_req_msg_cache[ - ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg]), - req, sizeof(struct ipa_fltr_installed_notif_req_msg_v01)); - ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg++; - ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg %= 10; + mutex_lock(&ipa3_qmi_lock); + if (ipa3_qmi_ctx != NULL) { + /* cache the qmi_filter_request */ + memcpy(&(ipa3_qmi_ctx->ipa_fltr_installed_notif_req_msg_cache[ + ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg]), + req, + sizeof(struct ipa_fltr_installed_notif_req_msg_v01)); + ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg++; + ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg %= 10; + } + mutex_unlock(&ipa3_qmi_lock); req_desc.max_msg_len = QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_MAX_MSG_LEN_V01; @@ -1267,3 +1278,13 @@ int ipa3_qmi_stop_data_qouta(void) resp.resp.error, "ipa_stop_data_usage_quota_req_msg_v01"); } +void ipa3_qmi_init(void) +{ + mutex_init(&ipa3_qmi_lock); +} + +void ipa3_qmi_cleanup(void) +{ + mutex_destroy(&ipa3_qmi_lock); +} + diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h index 0f641204cc77a..707c21aaa139d 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -193,6 +193,10 @@ int ipa3_qmi_stop_data_qouta(void); void ipa3_q6_handshake_complete(bool ssr_bootup); +void ipa3_qmi_init(void); + +void ipa3_qmi_cleanup(void); + #else /* CONFIG_RMNET_IPA3 */ static inline int ipa3_qmi_service_init(uint32_t wan_platform_type) @@ -298,6 +302,14 @@ static inline int ipa3_qmi_stop_data_qouta(void) static inline void ipa3_q6_handshake_complete(bool ssr_bootup) { } +static inline void ipa3_qmi_init(void) +{ +} + +static inline void ipa3_qmi_cleanup(void) +{ +} + #endif /* CONFIG_RMNET_IPA3 */ #endif /* IPA_QMI_SERVICE_H */ diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index 03e7d5ea39fb0..fcec90383463f 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -2893,6 +2893,9 @@ static int __init ipa3_wwan_init(void) mutex_init(&rmnet_ipa3_ctx->ipa_to_apps_pipe_handle_guard); rmnet_ipa3_ctx->ipa3_to_apps_hdl = -1; + + ipa3_qmi_init(); + /* Register for Modem SSR */ rmnet_ipa3_ctx->subsys_notify_handle = subsys_notif_register_notifier( SUBSYS_MODEM, @@ -2906,6 +2909,7 @@ static int __init ipa3_wwan_init(void) static void __exit ipa3_wwan_cleanup(void) { int ret; + ipa3_qmi_cleanup(); mutex_destroy(&rmnet_ipa3_ctx->ipa_to_apps_pipe_handle_guard); ret = subsys_notif_unregister_notifier( rmnet_ipa3_ctx->subsys_notify_handle, &ipa3_ssr_notifier); From 87191a568362cdd8f4a94c051c9ab56bc9a4fc37 Mon Sep 17 00:00:00 2001 From: Bhalchandra Gajare Date: Tue, 25 Apr 2017 18:37:56 -0700 Subject: [PATCH 0809/1015] ASoC: msm-lsm-client: use kzalloc instead of kmalloc In the ioctl function, driver allocates memory to store data internally before calling copy_to_user to copy data to user-space. It is possible that kernel internal information can be leaked to user space through this if the allocated memory is not completely overwritten with valid data. Use kzalloc to fix this. CRs-fixed: 2026045 Change-Id: I754ae2157034a135aaca4a15badf10d2567b7ed6 Signed-off-by: Bhalchandra Gajare --- sound/soc/msm/qdsp6v2/msm-lsm-client.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/msm-lsm-client.c b/sound/soc/msm/qdsp6v2/msm-lsm-client.c index f7a9d4626661f..0557e0ebf33b3 100644 --- a/sound/soc/msm/qdsp6v2/msm-lsm-client.c +++ b/sound/soc/msm/qdsp6v2/msm-lsm-client.c @@ -1146,7 +1146,7 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, } size = sizeof(*user) + userarg32.payload_size; - user = kmalloc(size, GFP_KERNEL); + user = kzalloc(size, GFP_KERNEL); if (!user) { dev_err(rtd->dev, "%s: Allocation failed event status size %d\n", @@ -1167,7 +1167,7 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, err = -EFAULT; } if (!err) { - user32 = kmalloc(size, GFP_KERNEL); + user32 = kzalloc(size, GFP_KERNEL); if (!user32) { dev_err(rtd->dev, "%s: Allocation event user status size %d\n", @@ -1580,7 +1580,7 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, size = sizeof(struct snd_lsm_event_status) + userarg.payload_size; - user = kmalloc(size, GFP_KERNEL); + user = kzalloc(size, GFP_KERNEL); if (!user) { dev_err(rtd->dev, "%s: Allocation failed event status size %d\n", From 8712e48ad62b272077beea9ea4690e5e79e03601 Mon Sep 17 00:00:00 2001 From: Ashish Garg Date: Mon, 24 Apr 2017 18:10:07 +0530 Subject: [PATCH 0810/1015] clk: msm: mdss: add support for chip serial number in dfps info Dfps info is calculated for a specific msm part and needs to be used for the same. Add a chip serial number for the dfps info so that the PLL trim codes are used for the same msm part on which they are generated. Change-Id: I6f1e519c1e9278b35dfbdf3d9ba4a2ed0e1a6a78 Signed-off-by: Ashish Garg --- drivers/clk/msm/mdss/mdss-pll.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/clk/msm/mdss/mdss-pll.h b/drivers/clk/msm/mdss/mdss-pll.h index 50c1fcf5b9fe5..35d8c74d543fc 100644 --- a/drivers/clk/msm/mdss/mdss-pll.h +++ b/drivers/clk/msm/mdss/mdss-pll.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -70,6 +70,7 @@ struct dfps_info { struct dfps_panel_info panel_dfps; struct dfps_codes_info codes_dfps[DFPS_MAX_NUM_OF_FRAME_RATES]; void *dfps_fb_base; + uint32_t chip_serial; }; struct mdss_pll_resources { From 7cc88af03fa33c4eee1e1bf854e34d7a9df11778 Mon Sep 17 00:00:00 2001 From: Shantanu Jain Date: Tue, 9 May 2017 18:29:22 +0530 Subject: [PATCH 0811/1015] input: synaptics_dsx_2.6: protect tmpbuf allocation Protect tmpbuf from concurrent access by mutex. BUG: 33555878 BUG: 33002026 Git-repo: https://android.googlesource.com/kernel/msm Git-commit: e6430a4da1fb0212a546379eadbe986f629c3ae9 Change-Id: Ia7eeb59ca7b626f416e2298b4b9ffd960fe909e4 Signed-off-by: Andrew Chant [shjain@codeaurora.org: apply the similar code change to synaptics v2.6 driver, as it was not applying cleanly.] Signed-off-by: Shantanu Jain --- .../synaptics_dsx_2.6/synaptics_dsx_rmi_dev.c | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_rmi_dev.c b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_rmi_dev.c index 111b26c7b7597..1cea2fc415f18 100644 --- a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_rmi_dev.c +++ b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_rmi_dev.c @@ -562,18 +562,24 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, return -EBADF; } - if (count == 0) - return 0; + mutex_lock(&(dev_data->file_mutex)); + + if (*f_pos > REG_ADDR_LIMIT) { + retval = -EFAULT; + goto clean_up; + } if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; + if (count == 0) { + retval = 0; + goto clean_up; + } address = (unsigned short)(*f_pos); rmidev_allocate_buffer(count); - mutex_lock(&(dev_data->file_mutex)); - retval = synaptics_rmi4_reg_read(rmidev->rmi4_data, *f_pos, rmidev->tmpbuf, @@ -633,18 +639,26 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, return -EBADF; } - if (count == 0) - return 0; + mutex_lock(&(dev_data->file_mutex)); + + if (*f_pos > REG_ADDR_LIMIT) { + retval = -EFAULT; + goto unlock; + } if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; + if (count == 0) { + retval = 0; + goto unlock; + } rmidev_allocate_buffer(count); - if (copy_from_user(rmidev->tmpbuf, buf, count)) + if (copy_from_user(rmidev->tmpbuf, buf, count)) { return -EFAULT; - - mutex_lock(&(dev_data->file_mutex)); + goto unlock; + } retval = synaptics_rmi4_reg_write(rmidev->rmi4_data, *f_pos, @@ -653,6 +667,7 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, if (retval >= 0) *f_pos += retval; +unlock: mutex_unlock(&(dev_data->file_mutex)); return retval; From c38be27cee534f6bdeb8a974b639211aab162425 Mon Sep 17 00:00:00 2001 From: Sandeep Panda Date: Fri, 12 May 2017 10:56:32 +0530 Subject: [PATCH 0812/1015] msm: mdss: remove client from device list if failed to register If there is any failure while registering a DBA client with MDSS driver, then remove the client from device client list first and then free the client. Otherwise driver might crash when traversing the device client list in later stage, because of an uninitialized entry in the list. Change-Id: I60666f4c3dea5c7ea7b7c77bcb14b080ee25b54d Signed-off-by: Sandeep Panda --- drivers/video/msm/msm_dba/msm_dba.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/msm_dba/msm_dba.c b/drivers/video/msm/msm_dba/msm_dba.c index 7a5c9d9d873a0..cc6512a4af9b2 100644 --- a/drivers/video/msm/msm_dba/msm_dba.c +++ b/drivers/video/msm/msm_dba/msm_dba.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015,2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -80,6 +80,11 @@ void *msm_dba_register_client(struct msm_dba_reg_info *info, if (rc) { pr_err("%s: Client register failed (%s, %d)\n", __func__, info->chip_name, info->instance_id); + /* remove the client from list before freeing */ + mutex_lock_nested(&device->dev_mutex, + SINGLE_DEPTH_NESTING); + list_del(&client->list); + mutex_unlock(&device->dev_mutex); kfree(client); mutex_unlock(®ister_mutex); return ERR_PTR(rc); From 17c31f3f3438c9f3e05b0d92c70b2b65d430d6cd Mon Sep 17 00:00:00 2001 From: Haibin Liu Date: Wed, 17 May 2017 18:52:30 +0800 Subject: [PATCH 0813/1015] msm: camera: fix untrusted pointer for power down setting When getting power down setting, there is an untrusted pointer from a user space pointer.Need to copy to the kernel space first. CRs-Fixed: 2037398 Change-Id: I64032a96e62ddfeec85eebe984d8ba52754f6148 Signed-off-by: Haibin Liu --- .../msm/camera_v2/sensor/msm_sensor_driver.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) mode change 100644 => 100755 drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c old mode 100644 new mode 100755 index 16cacecb8ae59..1f76654e9dba9 --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c @@ -420,17 +420,11 @@ static int32_t msm_sensor_create_pd_settings(void *setting, #ifdef CONFIG_COMPAT if (is_compat_task()) { - int i = 0; - struct msm_sensor_power_setting32 *power_setting_iter = - (struct msm_sensor_power_setting32 *)compat_ptr(( - (struct msm_camera_sensor_slave_info32 *)setting)-> - power_setting_array.power_setting); - - for (i = 0; i < size_down; i++) { - pd[i].config_val = power_setting_iter[i].config_val; - pd[i].delay = power_setting_iter[i].delay; - pd[i].seq_type = power_setting_iter[i].seq_type; - pd[i].seq_val = power_setting_iter[i].seq_val; + rc = msm_sensor_get_pw_settings_compat( + pd, pu, size_down); + if (rc < 0) { + pr_err("failed"); + return -EFAULT; } } else #endif From 85ac1c03a9838d7aeb6638decc6687722297483e Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Tue, 16 May 2017 09:49:47 +0530 Subject: [PATCH 0814/1015] usb: gadget: f_uvc: Fix crash on disconnect/connect during streaming The driver does a BUG_ON after cable connect if the previous session of streaming is not closed. Fix this by returning an error if the previous session of streaming is not closed. The user space application needs to close the streaming after cable disconnect. Change-Id: Ide47378efb0cdd0bef30ff7aa142a628eb1c962e Signed-off-by: Sriharsha Allenki --- drivers/usb/gadget/function/uvc_video.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c index ee09ae7c07cbd..5cd4a2e506fb2 100644 --- a/drivers/usb/gadget/function/uvc_video.c +++ b/drivers/usb/gadget/function/uvc_video.c @@ -238,7 +238,11 @@ uvc_video_alloc_requests(struct uvc_video *video) unsigned int i; int ret = -ENOMEM; - BUG_ON(video->req_size); + if (video->req_size) { + pr_err("%s: close the video node and reopen it\n", + __func__); + return -EBUSY; + } req_size = (video->ep->maxpacket & 0x7FF) * max_t(unsigned int, video->ep->maxburst, 1) From b1374e63e9f0c360899dc393b124d14d9b7e63b4 Mon Sep 17 00:00:00 2001 From: David Dai Date: Wed, 26 Apr 2017 14:52:24 -0700 Subject: [PATCH 0815/1015] msm: msm_bus: Add mutex to protect node_list Static variable node_list list need to be protected with a mutex to prevent race conditions and use after free cases. Change-Id: I4790b06712b8a8b401f43418cfcc53b415fb0019 Signed-off-by: David Dai --- drivers/platform/msm/msm_bus/msm_bus_rules.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/platform/msm/msm_bus/msm_bus_rules.c b/drivers/platform/msm/msm_bus/msm_bus_rules.c index 53886dcdd4ded..d9b7d3c214ff5 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_rules.c +++ b/drivers/platform/msm/msm_bus/msm_bus_rules.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -435,8 +435,10 @@ void print_all_rules(void) { struct rule_node_info *node_it = NULL; + mutex_lock(&msm_bus_rules_lock); list_for_each_entry(node_it, &node_list, link) print_rules(node_it); + mutex_unlock(&msm_bus_rules_lock); } void print_rules_buf(char *buf, int max_buf) @@ -446,6 +448,7 @@ void print_rules_buf(char *buf, int max_buf) int i; int cnt = 0; + mutex_lock(&msm_bus_rules_lock); list_for_each_entry(node_it, &node_list, link) { cnt += scnprintf(buf + cnt, max_buf - cnt, "\n Now printing rules for Node %d cur_rule %d\n", @@ -483,6 +486,7 @@ void print_rules_buf(char *buf, int max_buf) node_rule->rule_ops.combo_op); } } + mutex_unlock(&msm_bus_rules_lock); } static int copy_rule(struct bus_rule_type *src, struct rules_def *node_rule, @@ -870,11 +874,12 @@ bool msm_rule_are_rules_registered(void) { bool ret = false; + mutex_lock(&msm_bus_rules_lock); if (list_empty(&node_list)) ret = false; else ret = true; - + mutex_unlock(&msm_bus_rules_lock); return ret; } From 7c55b36d94ae220eeb76c56750b8878b7223217c Mon Sep 17 00:00:00 2001 From: Maria Yu Date: Fri, 21 Apr 2017 16:06:14 +0800 Subject: [PATCH 0816/1015] soc: qcom: msm_bus: add mutex lock for cllist data Cldata needed to be protected by lock since crash happened when synchronous update and free. CRs-Fixed: 2034222 Change-Id: Ied86461b784d69d9758dc3fc793a8a0de86e7f9c Signed-off-by: Maria Yu --- drivers/platform/msm/msm_bus/msm_bus_dbg.c | 102 +++++++++++++++------ 1 file changed, 76 insertions(+), 26 deletions(-) diff --git a/drivers/platform/msm/msm_bus/msm_bus_dbg.c b/drivers/platform/msm/msm_bus/msm_bus_dbg.c index 88ba18653cf5e..8db3a62a1263a 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_dbg.c +++ b/drivers/platform/msm/msm_bus/msm_bus_dbg.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2012, 2014-2015, The Linux Foundation. All rights +/* Copyright (c) 2010-2012, 2014-2015, 2017 The Linux Foundation. All rights * reserved. * * This program is free software; you can redistribute it and/or modify @@ -38,6 +38,7 @@ static struct dentry *clients; static struct dentry *dir; static DEFINE_MUTEX(msm_bus_dbg_fablist_lock); +static DEFINE_RT_MUTEX(msm_bus_dbg_cllist_lock); struct msm_bus_dbg_state { uint32_t cl; uint8_t enable; @@ -289,7 +290,9 @@ static ssize_t client_data_read(struct file *file, char __user *buf, struct msm_bus_cldata *cldata = NULL; const struct msm_bus_client_handle *handle = file->private_data; int found = 0; + ssize_t ret; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if ((cldata->clid == cl) || (cldata->handle && (cldata->handle == handle))) { @@ -298,12 +301,17 @@ static ssize_t client_data_read(struct file *file, char __user *buf, } } - if (!found) + if (!found) { + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return 0; + } bsize = cldata->size; - return simple_read_from_buffer(buf, count, ppos, + ret = simple_read_from_buffer(buf, count, ppos, cldata->buffer, bsize); + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); + + return ret; } static int client_data_open(struct inode *inode, struct file *file) @@ -339,7 +347,9 @@ int msm_bus_dbg_add_client(const struct msm_bus_client_handle *pdata) return -ENOMEM; } cldata->handle = pdata; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_add_tail(&cldata->list, &cl_list); + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return 0; } @@ -352,6 +362,7 @@ int msm_bus_dbg_rec_transaction(const struct msm_bus_client_handle *pdata, bool found = false; char *buf = NULL; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (cldata->handle == pdata) { found = true; @@ -359,12 +370,15 @@ int msm_bus_dbg_rec_transaction(const struct msm_bus_client_handle *pdata, } } - if (!found) + if (!found) { + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return -ENOENT; + } if (cldata->file == NULL) { if (pdata->name == NULL) { MSM_BUS_DBG("Client doesn't have a name\n"); + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return -EINVAL; } cldata->file = debugfs_create_file(pdata->name, S_IRUGO, @@ -393,6 +407,7 @@ int msm_bus_dbg_rec_transaction(const struct msm_bus_client_handle *pdata, i += scnprintf(buf + i, MAX_BUFF_SIZE - i, "%llu ", ib); i += scnprintf(buf + i, MAX_BUFF_SIZE - i, "\n"); cldata->size = i; + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); trace_bus_update_request((int)ts.tv_sec, (int)ts.tv_nsec, pdata->name, pdata->mas, pdata->slv, ab, ib); @@ -404,6 +419,7 @@ void msm_bus_dbg_remove_client(const struct msm_bus_client_handle *pdata) { struct msm_bus_cldata *cldata = NULL; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (cldata->handle == pdata) { debugfs_remove(cldata->file); @@ -412,6 +428,7 @@ void msm_bus_dbg_remove_client(const struct msm_bus_client_handle *pdata) break; } } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); } static int msm_bus_dbg_record_client(const struct msm_bus_scale_pdata *pdata, @@ -429,7 +446,9 @@ static int msm_bus_dbg_record_client(const struct msm_bus_scale_pdata *pdata, cldata->clid = clid; cldata->file = file; cldata->size = 0; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_add_tail(&cldata->list, &cl_list); + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return 0; } @@ -437,6 +456,7 @@ static void msm_bus_dbg_free_client(uint32_t clid) { struct msm_bus_cldata *cldata = NULL; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (cldata->clid == clid) { debugfs_remove(cldata->file); @@ -445,6 +465,7 @@ static void msm_bus_dbg_free_client(uint32_t clid) break; } } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); } static int msm_bus_dbg_fill_cl_buffer(const struct msm_bus_scale_pdata *pdata, @@ -456,6 +477,7 @@ static int msm_bus_dbg_fill_cl_buffer(const struct msm_bus_scale_pdata *pdata, struct timespec ts; int found = 0; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (cldata->clid == clid) { found = 1; @@ -463,11 +485,14 @@ static int msm_bus_dbg_fill_cl_buffer(const struct msm_bus_scale_pdata *pdata, } } - if (!found) + if (!found) { + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return -ENOENT; + } if (cldata->file == NULL) { if (pdata->name == NULL) { + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); MSM_BUS_DBG("Client doesn't have a name\n"); return -EINVAL; } @@ -515,19 +540,9 @@ static int msm_bus_dbg_fill_cl_buffer(const struct msm_bus_scale_pdata *pdata, cldata->index = index; cldata->size = i; - return i; -} - -static int msm_bus_dbg_update_request(struct msm_bus_cldata *cldata, int index) -{ - int ret = 0; + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); - if ((index < 0) || (index > cldata->pdata->num_usecases)) { - MSM_BUS_DBG("Invalid index!\n"); - return -EINVAL; - } - ret = msm_bus_scale_client_update_request(cldata->clid, index); - return ret; + return i; } static ssize_t msm_bus_dbg_update_request_write(struct file *file, @@ -539,19 +554,26 @@ static ssize_t msm_bus_dbg_update_request_write(struct file *file, char *chid; char *buf = kmalloc((sizeof(char) * (cnt + 1)), GFP_KERNEL); int found = 0; + uint32_t clid; + ssize_t res = cnt; if (!buf || IS_ERR(buf)) { MSM_BUS_ERR("Memory allocation for buffer failed\n"); return -ENOMEM; } - if (cnt == 0) - return 0; - if (copy_from_user(buf, ubuf, cnt)) - return -EFAULT; + if (cnt == 0) { + res = 0; + goto out; + } + if (copy_from_user(buf, ubuf, cnt)) { + res = -EFAULT; + goto out; + } buf[cnt] = '\0'; chid = buf; MSM_BUS_DBG("buffer: %s\n size: %zu\n", buf, sizeof(ubuf)); + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (strnstr(chid, cldata->pdata->name, cnt)) { found = 1; @@ -562,21 +584,35 @@ static ssize_t msm_bus_dbg_update_request_write(struct file *file, if (ret) { MSM_BUS_DBG("Index conversion" " failed\n"); - return -EFAULT; + rt_mutex_unlock( + &msm_bus_dbg_cllist_lock); + res = -EFAULT; + goto out; } } else { MSM_BUS_DBG("Error parsing input. Index not" " found\n"); found = 0; } + if ((index < 0) || + (index > cldata->pdata->num_usecases)) { + MSM_BUS_DBG("Invalid index!\n"); + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); + res = -EINVAL; + goto out; + } + clid = cldata->clid; break; } } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); if (found) - msm_bus_dbg_update_request(cldata, index); + msm_bus_scale_client_update_request(clid, index); + +out: kfree(buf); - return cnt; + return res; } /** @@ -599,8 +635,10 @@ static ssize_t fabric_data_read(struct file *file, char __user *buf, break; } } - if (!found) + if (!found) { + mutex_unlock(&msm_bus_dbg_fablist_lock); return -ENOENT; + } bsize = fablist->size; ret = simple_read_from_buffer(buf, count, ppos, fablist->buffer, bsize); @@ -689,8 +727,10 @@ static int msm_bus_dbg_fill_fab_buffer(const char *fabname, break; } } - if (!found) + if (!found) { + mutex_unlock(&msm_bus_dbg_fablist_lock); return -ENOENT; + } if (fablist->file == NULL) { MSM_BUS_DBG("Fabric dbg entry does not exist\n"); @@ -741,6 +781,8 @@ static ssize_t msm_bus_dbg_dump_clients_read(struct file *file, "\nDumping curent client votes to trace log\n"); if (*ppos) goto exit_dump_clients_read; + + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (IS_ERR_OR_NULL(cldata->pdata)) continue; @@ -756,6 +798,7 @@ static ssize_t msm_bus_dbg_dump_clients_read(struct file *file, cldata->pdata->active_only); } } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); exit_dump_clients_read: return simple_read_from_buffer(buf, count, ppos, msg, cnt); } @@ -880,6 +923,7 @@ static int __init msm_bus_debugfs_init(void) goto err; } + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (cldata->pdata) { if (cldata->pdata->name == NULL) { @@ -899,6 +943,7 @@ static int __init msm_bus_debugfs_init(void) &client_data_fops); } } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); if (debugfs_create_file("dump_clients", S_IRUGO | S_IWUSR, clients, NULL, &msm_bus_dbg_dump_clients_fops) == NULL) @@ -911,6 +956,7 @@ static int __init msm_bus_debugfs_init(void) if (fablist->file == NULL) { MSM_BUS_DBG("Cannot create files for commit data\n"); kfree(rules_buf); + mutex_unlock(&msm_bus_dbg_fablist_lock); goto err; } } @@ -930,10 +976,14 @@ static void __exit msm_bus_dbg_teardown(void) struct msm_bus_cldata *cldata = NULL, *cldata_temp; debugfs_remove_recursive(dir); + + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry_safe(cldata, cldata_temp, &cl_list, list) { list_del(&cldata->list); kfree(cldata); } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); + mutex_lock(&msm_bus_dbg_fablist_lock); list_for_each_entry_safe(fablist, fablist_temp, &fabdata_list, list) { list_del(&fablist->list); From b5c1a7510a1c4661d1883f2c51fdde4bd58b5a66 Mon Sep 17 00:00:00 2001 From: Xiaojun Sang Date: Thu, 27 Apr 2017 14:44:25 +0800 Subject: [PATCH 0817/1015] ASoC: msm: remove unused msm-compr-q6-v2 msm-compr-q6-v2.c and msm-compr-q6-v2.h are no longer used. CRs-Fixed: 2022953 Change-Id: I856d90a212a3e123a2c8b80092aff003f7c608c7 Signed-off-by: Xiaojun Sang --- sound/soc/msm/qdsp6v2/Makefile | 2 +- sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c | 1694 ----------------------- sound/soc/msm/qdsp6v2/msm-compr-q6-v2.h | 36 - 3 files changed, 1 insertion(+), 1731 deletions(-) delete mode 100644 sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c delete mode 100644 sound/soc/msm/qdsp6v2/msm-compr-q6-v2.h diff --git a/sound/soc/msm/qdsp6v2/Makefile b/sound/soc/msm/qdsp6v2/Makefile index 8e1aa309cef3c..7abaaadc0e06a 100644 --- a/sound/soc/msm/qdsp6v2/Makefile +++ b/sound/soc/msm/qdsp6v2/Makefile @@ -1,5 +1,5 @@ snd-soc-qdsp6v2-objs += msm-dai-q6-v2.o msm-pcm-q6-v2.o msm-pcm-routing-v2.o \ - msm-compress-q6-v2.o msm-compr-q6-v2.o \ + msm-compress-q6-v2.o \ msm-pcm-lpa-v2.o \ msm-pcm-afe-v2.o msm-pcm-voip-v2.o \ msm-pcm-voice-v2.o msm-dai-q6-hdmi-v2.o \ diff --git a/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c deleted file mode 100644 index 58a4de5af145d..0000000000000 --- a/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c +++ /dev/null @@ -1,1694 +0,0 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "msm-compr-q6-v2.h" -#include "msm-pcm-routing-v2.h" -#include - -#define COMPRE_CAPTURE_NUM_PERIODS 16 -/* Allocate the worst case frame size for compressed audio */ -#define COMPRE_CAPTURE_HEADER_SIZE (sizeof(struct snd_compr_audio_info)) -/* Changing period size to 4032. 4032 will make sure COMPRE_CAPTURE_PERIOD_SIZE - * is 4096 with meta data size of 64 and MAX_NUM_FRAMES_PER_BUFFER 1 - */ -#define COMPRE_CAPTURE_MAX_FRAME_SIZE (4032) -#define COMPRE_CAPTURE_PERIOD_SIZE ((COMPRE_CAPTURE_MAX_FRAME_SIZE + \ - COMPRE_CAPTURE_HEADER_SIZE) * \ - MAX_NUM_FRAMES_PER_BUFFER) -#define COMPRE_OUTPUT_METADATA_SIZE (sizeof(struct output_meta_data_st)) -#define COMPRESSED_LR_VOL_MAX_STEPS 0x20002000 - -#define MAX_AC3_PARAM_SIZE (18*2*sizeof(int)) -#define AMR_WB_BAND_MODE 8 -#define AMR_WB_DTX_MODE 0 - - -const DECLARE_TLV_DB_LINEAR(compr_rx_vol_gain, 0, - COMPRESSED_LR_VOL_MAX_STEPS); - -static struct audio_locks the_locks; - -static struct snd_pcm_hardware msm_compr_hardware_capture = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rates = SNDRV_PCM_RATE_8000_48000, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 8, - .buffer_bytes_max = - COMPRE_CAPTURE_PERIOD_SIZE * COMPRE_CAPTURE_NUM_PERIODS , - .period_bytes_min = COMPRE_CAPTURE_PERIOD_SIZE, - .period_bytes_max = COMPRE_CAPTURE_PERIOD_SIZE, - .periods_min = COMPRE_CAPTURE_NUM_PERIODS, - .periods_max = COMPRE_CAPTURE_NUM_PERIODS, - .fifo_size = 0, -}; - -static struct snd_pcm_hardware msm_compr_hardware_playback = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, - .rates = SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_KNOT, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 8, - .buffer_bytes_max = 1024 * 1024, - .period_bytes_min = 128 * 1024, - .period_bytes_max = 256 * 1024, - .periods_min = 4, - .periods_max = 8, - .fifo_size = 0, -}; - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 -}; - -/* Add supported codecs for compress capture path */ -static uint32_t supported_compr_capture_codecs[] = { - SND_AUDIOCODEC_AMRWB -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static bool msm_compr_capture_codecs(uint32_t req_codec) -{ - int i; - pr_debug("%s req_codec:%d\n", __func__, req_codec); - if (req_codec == 0) - return false; - for (i = 0; i < ARRAY_SIZE(supported_compr_capture_codecs); i++) { - if (req_codec == supported_compr_capture_codecs[i]) - return true; - } - return false; -} - -static void compr_event_handler(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv) -{ - struct compr_audio *compr = priv; - struct msm_audio *prtd = &compr->prtd; - struct snd_pcm_substream *substream = prtd->substream; - struct snd_pcm_runtime *runtime = substream->runtime; - struct audio_aio_write_param param; - struct audio_aio_read_param read_param; - struct audio_buffer *buf = NULL; - phys_addr_t temp; - struct output_meta_data_st output_meta_data; - uint32_t *ptrmem = (uint32_t *)payload; - int i = 0; - int time_stamp_flag = 0; - int buffer_length = 0; - int stop_playback = 0; - - pr_debug("%s opcode =%08x\n", __func__, opcode); - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: { - uint32_t *ptrmem = (uint32_t *)¶m; - pr_debug("ASM_DATA_EVENT_WRITE_DONE\n"); - pr_debug("Buffer Consumed = 0x%08x\n", *ptrmem); - prtd->pcm_irq_pos += prtd->pcm_count; - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - else - if (substream->timer_running) - snd_timer_interrupt(substream->timer, 1); - atomic_inc(&prtd->out_count); - wake_up(&the_locks.write_wait); - if (!atomic_read(&prtd->start)) { - atomic_set(&prtd->pending_buffer, 1); - break; - } else - atomic_set(&prtd->pending_buffer, 0); - - /* - * check for underrun - */ - snd_pcm_stream_lock_irq(substream); - if (runtime->status->hw_ptr >= runtime->control->appl_ptr) { - runtime->render_flag |= SNDRV_RENDER_STOPPED; - stop_playback = 1; - } - snd_pcm_stream_unlock_irq(substream); - - if (stop_playback) { - pr_err("underrun! render stopped\n"); - break; - } - - buf = prtd->audio_client->port[IN].buf; - pr_debug("%s:writing %d bytes of buffer[%d] to dsp 2\n", - __func__, prtd->pcm_count, prtd->out_head); - temp = buf[0].phys + (prtd->out_head * prtd->pcm_count); - pr_debug("%s:writing buffer[%d] from 0x%pK\n", - __func__, prtd->out_head, &temp); - - if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) - time_stamp_flag = SET_TIMESTAMP; - else - time_stamp_flag = NO_TIMESTAMP; - memcpy(&output_meta_data, (char *)(buf->data + - prtd->out_head * prtd->pcm_count), - COMPRE_OUTPUT_METADATA_SIZE); - - buffer_length = output_meta_data.frame_size; - pr_debug("meta_data_length: %d, frame_length: %d\n", - output_meta_data.meta_data_length, - output_meta_data.frame_size); - pr_debug("timestamp_msw: %d, timestamp_lsw: %d\n", - output_meta_data.timestamp_msw, - output_meta_data.timestamp_lsw); - if (buffer_length == 0) { - pr_debug("Recieved a zero length buffer-break out"); - break; - } - param.paddr = temp + output_meta_data.meta_data_length; - param.len = buffer_length; - param.msw_ts = output_meta_data.timestamp_msw; - param.lsw_ts = output_meta_data.timestamp_lsw; - param.flags = time_stamp_flag; - param.uid = prtd->session_id; - for (i = 0; i < sizeof(struct audio_aio_write_param)/4; - i++, ++ptrmem) - pr_debug("cmd[%d]=0x%08x\n", i, *ptrmem); - if (q6asm_async_write(prtd->audio_client, - ¶m) < 0) - pr_err("%s:q6asm_async_write failed\n", - __func__); - else - prtd->out_head = - (prtd->out_head + 1) & (runtime->periods - 1); - break; - } - case ASM_DATA_EVENT_RENDERED_EOS: - pr_debug("ASM_DATA_CMDRSP_EOS\n"); - if (atomic_read(&prtd->eos)) { - pr_debug("ASM_DATA_CMDRSP_EOS wake up\n"); - prtd->cmd_ack = 1; - wake_up(&the_locks.eos_wait); - atomic_set(&prtd->eos, 0); - } - break; - case ASM_DATA_EVENT_READ_DONE_V2: { - pr_debug("ASM_DATA_EVENT_READ_DONE\n"); - pr_debug("buf = %pK, data = 0x%X, *data = %pK,\n" - "prtd->pcm_irq_pos = %d\n", - prtd->audio_client->port[OUT].buf, - *(uint32_t *)prtd->audio_client->port[OUT].buf->data, - prtd->audio_client->port[OUT].buf->data, - prtd->pcm_irq_pos); - - memcpy(prtd->audio_client->port[OUT].buf->data + - prtd->pcm_irq_pos, (ptrmem + READDONE_IDX_SIZE), - COMPRE_CAPTURE_HEADER_SIZE); - pr_debug("buf = %pK, updated data = 0x%X, *data = %pK\n", - prtd->audio_client->port[OUT].buf, - *(uint32_t *)(prtd->audio_client->port[OUT].buf->data + - prtd->pcm_irq_pos), - prtd->audio_client->port[OUT].buf->data); - if (!atomic_read(&prtd->start)) - break; - pr_debug("frame size=%d, buffer = 0x%X\n", - ptrmem[READDONE_IDX_SIZE], - ptrmem[READDONE_IDX_BUFADD_LSW]); - if (ptrmem[READDONE_IDX_SIZE] > COMPRE_CAPTURE_MAX_FRAME_SIZE) { - pr_err("Frame length exceeded the max length"); - break; - } - buf = prtd->audio_client->port[OUT].buf; - - pr_debug("pcm_irq_pos=%d, buf[0].phys = 0x%pK\n", - prtd->pcm_irq_pos, &buf[0].phys); - read_param.len = prtd->pcm_count - COMPRE_CAPTURE_HEADER_SIZE; - read_param.paddr = buf[0].phys + - prtd->pcm_irq_pos + COMPRE_CAPTURE_HEADER_SIZE; - prtd->pcm_irq_pos += prtd->pcm_count; - - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - - q6asm_async_read(prtd->audio_client, &read_param); - break; - } - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: { - if (substream->stream - != SNDRV_PCM_STREAM_PLAYBACK) { - atomic_set(&prtd->start, 1); - break; - } - if (!atomic_read(&prtd->pending_buffer)) - break; - pr_debug("%s: writing %d bytes of buffer[%d] to dsp\n", - __func__, prtd->pcm_count, prtd->out_head); - buf = prtd->audio_client->port[IN].buf; - pr_debug("%s: writing buffer[%d] from 0x%pK head %d count %d\n", - __func__, prtd->out_head, &buf[0].phys, - prtd->pcm_count, prtd->out_head); - if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) - time_stamp_flag = SET_TIMESTAMP; - else - time_stamp_flag = NO_TIMESTAMP; - memcpy(&output_meta_data, (char *)(buf->data + - prtd->out_head * prtd->pcm_count), - COMPRE_OUTPUT_METADATA_SIZE); - buffer_length = output_meta_data.frame_size; - pr_debug("meta_data_length: %d, frame_length: %d\n", - output_meta_data.meta_data_length, - output_meta_data.frame_size); - pr_debug("timestamp_msw: %d, timestamp_lsw: %d\n", - output_meta_data.timestamp_msw, - output_meta_data.timestamp_lsw); - param.paddr = buf[prtd->out_head].phys - + output_meta_data.meta_data_length; - param.len = buffer_length; - param.msw_ts = output_meta_data.timestamp_msw; - param.lsw_ts = output_meta_data.timestamp_lsw; - param.flags = time_stamp_flag; - param.uid = prtd->session_id; - param.metadata_len = COMPRE_OUTPUT_METADATA_SIZE; - if (q6asm_async_write(prtd->audio_client, - ¶m) < 0) - pr_err("%s:q6asm_async_write failed\n", - __func__); - else - prtd->out_head = - (prtd->out_head + 1) - & (runtime->periods - 1); - atomic_set(&prtd->pending_buffer, 0); - } - break; - case ASM_STREAM_CMD_FLUSH: - pr_debug("ASM_STREAM_CMD_FLUSH\n"); - prtd->cmd_ack = 1; - wake_up(&the_locks.flush_wait); - break; - default: - break; - } - break; - } - default: - pr_debug("Not Supported Event opcode[0x%x]\n", opcode); - break; - } -} - -static int msm_compr_send_ddp_cfg(struct audio_client *ac, - struct snd_dec_ddp *ddp) -{ - int i, rc; - pr_debug("%s\n", __func__); - - if (ddp->params_length / 2 > SND_DEC_DDP_MAX_PARAMS) { - pr_err("%s: Invalid number of params %u, max allowed %u\n", - __func__, ddp->params_length / 2, - SND_DEC_DDP_MAX_PARAMS); - return -EINVAL; - } - - for (i = 0; i < ddp->params_length/2; i++) { - rc = q6asm_ds1_set_endp_params(ac, ddp->params_id[i], - ddp->params_value[i]); - if (rc) { - pr_err("sending params_id: %d failed\n", - ddp->params_id[i]); - return rc; - } - } - return 0; -} - -static int msm_compr_playback_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = &compr->prtd; - struct snd_pcm_hw_params *params; - struct asm_aac_cfg aac_cfg; - uint16_t bits_per_sample = 16; - int ret; - - struct asm_softpause_params softpause = { - .enable = SOFT_PAUSE_ENABLE, - .period = SOFT_PAUSE_PERIOD, - .step = SOFT_PAUSE_STEP, - .rampingcurve = SOFT_PAUSE_CURVE_LINEAR, - }; - struct asm_softvolume_params softvol = { - .period = SOFT_VOLUME_PERIOD, - .step = SOFT_VOLUME_STEP, - .rampingcurve = SOFT_VOLUME_CURVE_LINEAR, - }; - - pr_debug("%s\n", __func__); - - params = &soc_prtd->dpcm[substream->stream].hw_params; - if (runtime->format == SNDRV_PCM_FORMAT_S24_LE) - bits_per_sample = 24; - - ret = q6asm_open_write_v2(prtd->audio_client, - compr->codec, bits_per_sample); - if (ret < 0) { - pr_err("%s: Session out open failed\n", - __func__); - return -ENOMEM; - } - msm_pcm_routing_reg_phy_stream( - soc_prtd->dai_link->be_id, - prtd->audio_client->perf_mode, - prtd->session_id, - substream->stream); - /* - * the number of channels are required to call volume api - * accoridngly. So, get channels from hw params - */ - if ((params_channels(params) > 0) && - (params_periods(params) <= runtime->hw.channels_max)) - prtd->channel_mode = params_channels(params); - - ret = q6asm_set_softpause(prtd->audio_client, &softpause); - if (ret < 0) - pr_err("%s: Send SoftPause Param failed ret=%d\n", - __func__, ret); - ret = q6asm_set_softvolume(prtd->audio_client, &softvol); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); - - ret = q6asm_set_io_mode(prtd->audio_client, - (COMPRESSED_IO | ASYNC_IO_MODE)); - if (ret < 0) { - pr_err("%s: Set IO mode failed\n", __func__); - return -ENOMEM; - } - - prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_irq_pos = 0; - /* rate and channels are sent to audio driver */ - prtd->samp_rate = runtime->rate; - prtd->channel_mode = runtime->channels; - prtd->out_head = 0; - atomic_set(&prtd->out_count, runtime->periods); - - if (prtd->enabled) - return 0; - - switch (compr->info.codec_param.codec.id) { - case SND_AUDIOCODEC_MP3: - /* No media format block for mp3 */ - break; - case SND_AUDIOCODEC_AAC: - pr_debug("%s: SND_AUDIOCODEC_AAC\n", __func__); - memset(&aac_cfg, 0x0, sizeof(struct asm_aac_cfg)); - aac_cfg.aot = AAC_ENC_MODE_EAAC_P; - aac_cfg.format = 0x03; - aac_cfg.ch_cfg = runtime->channels; - aac_cfg.sample_rate = runtime->rate; - ret = q6asm_media_format_block_aac(prtd->audio_client, - &aac_cfg); - if (ret < 0) - pr_err("%s: CMD Format block failed\n", __func__); - break; - case SND_AUDIOCODEC_AC3: { - struct snd_dec_ddp *ddp = - &compr->info.codec_param.codec.options.ddp; - pr_debug("%s: SND_AUDIOCODEC_AC3\n", __func__); - ret = msm_compr_send_ddp_cfg(prtd->audio_client, ddp); - if (ret < 0) - pr_err("%s: DDP CMD CFG failed\n", __func__); - break; - } - case SND_AUDIOCODEC_EAC3: { - struct snd_dec_ddp *ddp = - &compr->info.codec_param.codec.options.ddp; - pr_debug("%s: SND_AUDIOCODEC_EAC3\n", __func__); - ret = msm_compr_send_ddp_cfg(prtd->audio_client, ddp); - if (ret < 0) - pr_err("%s: DDP CMD CFG failed\n", __func__); - break; - } - default: - return -EINVAL; - } - - prtd->enabled = 1; - prtd->cmd_ack = 0; - prtd->cmd_interrupt = 0; - - return 0; -} - -static int msm_compr_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - struct audio_buffer *buf = prtd->audio_client->port[OUT].buf; - struct snd_codec *codec = &compr->info.codec_param.codec; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct audio_aio_read_param read_param; - uint16_t bits_per_sample = 16; - int ret = 0; - int i; - - prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_irq_pos = 0; - - if (runtime->format == SNDRV_PCM_FORMAT_S24_LE) - bits_per_sample = 24; - - if (!msm_compr_capture_codecs( - compr->info.codec_param.codec.id)) { - /* - * request codec invalid or not supported, - * use default compress format - */ - compr->info.codec_param.codec.id = - SND_AUDIOCODEC_AMRWB; - } - switch (compr->info.codec_param.codec.id) { - case SND_AUDIOCODEC_AMRWB: - pr_debug("q6asm_open_read(FORMAT_AMRWB)\n"); - ret = q6asm_open_read(prtd->audio_client, - FORMAT_AMRWB); - if (ret < 0) { - pr_err("%s: compressed Session out open failed\n", - __func__); - return -ENOMEM; - } - pr_debug("msm_pcm_routing_reg_phy_stream\n"); - msm_pcm_routing_reg_phy_stream( - soc_prtd->dai_link->be_id, - prtd->audio_client->perf_mode, - prtd->session_id, substream->stream); - break; - default: - pr_debug("q6asm_open_read_compressed(COMPRESSED_META_DATA_MODE)\n"); - /* - ret = q6asm_open_read_compressed(prtd->audio_client, - MAX_NUM_FRAMES_PER_BUFFER, - COMPRESSED_META_DATA_MODE); - */ - ret = -EINVAL; - break; - } - - if (ret < 0) { - pr_err("%s: compressed Session out open failed\n", - __func__); - return -ENOMEM; - } - - ret = q6asm_set_io_mode(prtd->audio_client, - (COMPRESSED_IO | ASYNC_IO_MODE)); - if (ret < 0) { - pr_err("%s: Set IO mode failed\n", __func__); - return -ENOMEM; - } - - if (!msm_compr_capture_codecs(codec->id)) { - /* - * request codec invalid or not supported, - * use default compress format - */ - codec->id = SND_AUDIOCODEC_AMRWB; - } - /* rate and channels are sent to audio driver */ - prtd->samp_rate = runtime->rate; - prtd->channel_mode = runtime->channels; - - if (prtd->enabled) - return ret; - read_param.len = prtd->pcm_count; - - switch (codec->id) { - case SND_AUDIOCODEC_AMRWB: - pr_debug("SND_AUDIOCODEC_AMRWB\n"); - ret = q6asm_enc_cfg_blk_amrwb(prtd->audio_client, - MAX_NUM_FRAMES_PER_BUFFER, - /* - * use fixed band mode and dtx mode - * band mode - 23.85 kbps - */ - AMR_WB_BAND_MODE, - /* dtx mode - disable */ - AMR_WB_DTX_MODE); - if (ret < 0) - pr_err("%s: CMD Format block failed: %d\n", - __func__, ret); - break; - default: - pr_debug("No config for codec %d\n", codec->id); - } - pr_debug("%s: Samp_rate = %d, Channel = %d, pcm_size = %d,\n" - "pcm_count = %d, periods = %d\n", - __func__, prtd->samp_rate, prtd->channel_mode, - prtd->pcm_size, prtd->pcm_count, runtime->periods); - - for (i = 0; i < runtime->periods; i++) { - read_param.uid = i; - switch (codec->id) { - case SND_AUDIOCODEC_AMRWB: - read_param.len = prtd->pcm_count - - COMPRE_CAPTURE_HEADER_SIZE; - read_param.paddr = buf[i].phys - + COMPRE_CAPTURE_HEADER_SIZE; - pr_debug("Push buffer [%d] to DSP, paddr: %pK, vaddr: %pK\n", - i, &read_param.paddr, - buf[i].data); - q6asm_async_read(prtd->audio_client, &read_param); - break; - default: - read_param.paddr = buf[i].phys; - /*q6asm_async_read_compressed(prtd->audio_client, - &read_param);*/ - pr_debug("%s: To add support for read compressed\n", - __func__); - ret = -EINVAL; - break; - } - } - prtd->periods = runtime->periods; - - prtd->enabled = 1; - - return ret; -} - -static int msm_compr_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - - pr_debug("%s\n", __func__); - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - prtd->pcm_irq_pos = 0; - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (!msm_compr_capture_codecs( - compr->info.codec_param.codec.id)) { - /* - * request codec invalid or not supported, - * use default compress format - */ - compr->info.codec_param.codec.id = - SND_AUDIOCODEC_AMRWB; - } - switch (compr->info.codec_param.codec.id) { - case SND_AUDIOCODEC_AMRWB: - break; - default: - msm_pcm_routing_reg_psthr_stream( - soc_prtd->dai_link->be_id, - prtd->session_id, substream->stream); - break; - } - } - atomic_set(&prtd->pending_buffer, 1); - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("%s: Trigger start\n", __func__); - q6asm_run_nowait(prtd->audio_client, 0, 0, 0); - atomic_set(&prtd->start, 1); - break; - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - switch (compr->info.codec_param.codec.id) { - case SND_AUDIOCODEC_AMRWB: - break; - default: - msm_pcm_routing_reg_psthr_stream( - soc_prtd->dai_link->be_id, - prtd->session_id, substream->stream); - break; - } - } - atomic_set(&prtd->start, 0); - runtime->render_flag &= ~SNDRV_RENDER_STOPPED; - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("SNDRV_PCM_TRIGGER_PAUSE\n"); - q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); - atomic_set(&prtd->start, 0); - runtime->render_flag &= ~SNDRV_RENDER_STOPPED; - break; - default: - ret = -EINVAL; - break; - } - - return ret; -} - -static void populate_codec_list(struct compr_audio *compr, - struct snd_pcm_runtime *runtime) -{ - pr_debug("%s\n", __func__); - /* MP3 Block */ - compr->info.compr_cap.num_codecs = 5; - compr->info.compr_cap.min_fragment_size = runtime->hw.period_bytes_min; - compr->info.compr_cap.max_fragment_size = runtime->hw.period_bytes_max; - compr->info.compr_cap.min_fragments = runtime->hw.periods_min; - compr->info.compr_cap.max_fragments = runtime->hw.periods_max; - compr->info.compr_cap.codecs[0] = SND_AUDIOCODEC_MP3; - compr->info.compr_cap.codecs[1] = SND_AUDIOCODEC_AAC; - compr->info.compr_cap.codecs[2] = SND_AUDIOCODEC_AC3; - compr->info.compr_cap.codecs[3] = SND_AUDIOCODEC_EAC3; - compr->info.compr_cap.codecs[4] = SND_AUDIOCODEC_AMRWB; - /* Add new codecs here */ -} - -static int msm_compr_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr; - struct msm_audio *prtd; - int ret = 0; - - pr_debug("%s\n", __func__); - compr = kzalloc(sizeof(struct compr_audio), GFP_KERNEL); - if (compr == NULL) { - pr_err("Failed to allocate memory for msm_audio\n"); - return -ENOMEM; - } - prtd = &compr->prtd; - prtd->substream = substream; - runtime->render_flag = SNDRV_DMA_MODE; - prtd->audio_client = q6asm_audio_client_alloc( - (app_cb)compr_event_handler, compr); - if (!prtd->audio_client) { - pr_info("%s: Could not allocate memory\n", __func__); - kfree(prtd); - return -ENOMEM; - } - - prtd->audio_client->perf_mode = false; - pr_info("%s: session ID %d\n", __func__, prtd->audio_client->session); - - prtd->session_id = prtd->audio_client->session; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - runtime->hw = msm_compr_hardware_playback; - prtd->cmd_ack = 1; - } else { - runtime->hw = msm_compr_hardware_capture; - } - - - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_info("snd_pcm_hw_constraint_list failed\n"); - /* Ensure that buffer size is a multiple of period size */ - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - pr_info("snd_pcm_hw_constraint_integer failed\n"); - - prtd->dsp_cnt = 0; - atomic_set(&prtd->pending_buffer, 1); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - compr->codec = FORMAT_MP3; - populate_codec_list(compr, runtime); - runtime->private_data = compr; - atomic_set(&prtd->eos, 0); - return 0; -} - -static int compressed_set_volume(struct msm_audio *prtd, uint32_t volume) -{ - int rc = 0; - int avg_vol = 0; - int lgain = (volume >> 16) & 0xFFFF; - int rgain = volume & 0xFFFF; - if (prtd && prtd->audio_client) { - pr_debug("%s: channels %d volume 0x%x\n", __func__, - prtd->channel_mode, volume); - if ((prtd->channel_mode == 2) && - (lgain != rgain)) { - pr_debug("%s: call q6asm_set_lrgain\n", __func__); - rc = q6asm_set_lrgain(prtd->audio_client, lgain, rgain); - } else { - avg_vol = (lgain + rgain)/2; - pr_debug("%s: call q6asm_set_volume\n", __func__); - rc = q6asm_set_volume(prtd->audio_client, avg_vol); - } - if (rc < 0) { - pr_err("%s: Send Volume command failed rc=%d\n", - __func__, rc); - } - } - return rc; -} - -static int msm_compr_playback_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - int dir = 0; - - pr_debug("%s\n", __func__); - - dir = IN; - atomic_set(&prtd->pending_buffer, 0); - - prtd->pcm_irq_pos = 0; - q6asm_cmd(prtd->audio_client, CMD_CLOSE); - q6asm_audio_client_buf_free_contiguous(dir, - prtd->audio_client); - msm_pcm_routing_dereg_phy_stream( - soc_prtd->dai_link->be_id, - SNDRV_PCM_STREAM_PLAYBACK); - q6asm_audio_client_free(prtd->audio_client); - kfree(prtd); - return 0; -} - -static int msm_compr_capture_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - int dir = OUT; - - pr_debug("%s\n", __func__); - atomic_set(&prtd->pending_buffer, 0); - q6asm_cmd(prtd->audio_client, CMD_CLOSE); - q6asm_audio_client_buf_free_contiguous(dir, - prtd->audio_client); - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->be_id, - SNDRV_PCM_STREAM_CAPTURE); - q6asm_audio_client_free(prtd->audio_client); - kfree(prtd); - return 0; -} - -static int msm_compr_close(struct snd_pcm_substream *substream) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_compr_playback_close(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_compr_capture_close(substream); - return ret; -} - -static int msm_compr_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_compr_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_compr_capture_prepare(substream); - return ret; -} - -static snd_pcm_uframes_t msm_compr_pointer(struct snd_pcm_substream *substream) -{ - - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - - if (prtd->pcm_irq_pos >= prtd->pcm_size) - prtd->pcm_irq_pos = 0; - - pr_debug("%s: pcm_irq_pos = %d, pcm_size = %d, sample_bits = %d,\n" - "frame_bits = %d\n", __func__, prtd->pcm_irq_pos, - prtd->pcm_size, runtime->sample_bits, - runtime->frame_bits); - return bytes_to_frames(runtime, (prtd->pcm_irq_pos)); -} - -static int msm_compr_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct audio_client *ac = prtd->audio_client; - struct audio_port_data *apd = ac->port; - struct audio_buffer *ab; - int dir = -1; - - prtd->mmap_flag = 1; - runtime->render_flag = SNDRV_NON_DMA_MODE; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - ab = &(apd[dir].buf[0]); - - return msm_audio_ion_mmap(ab, vma); -} - -static int msm_compr_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct audio_buffer *buf; - int dir, ret; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - /* Modifying kernel hardware params based on userspace config */ - if (params_periods(params) > 0 && - (params_periods(params) != runtime->hw.periods_max)) { - runtime->hw.periods_max = params_periods(params); - } - if (params_period_bytes(params) > 0 && - (params_period_bytes(params) != runtime->hw.period_bytes_min)) { - runtime->hw.period_bytes_min = params_period_bytes(params); - } - runtime->hw.buffer_bytes_max = - runtime->hw.period_bytes_min * runtime->hw.periods_max; - pr_debug("allocate %zd buffers each of size %d\n", - runtime->hw.period_bytes_min, - runtime->hw.periods_max); - ret = q6asm_audio_client_buf_alloc_contiguous(dir, - prtd->audio_client, - runtime->hw.period_bytes_min, - runtime->hw.periods_max); - if (ret < 0) { - pr_err("Audio Start: Buffer Allocation failed rc = %d\n", - ret); - return -ENOMEM; - } - buf = prtd->audio_client->port[dir].buf; - - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = buf[0].data; - dma_buf->addr = buf[0].phys; - dma_buf->bytes = runtime->hw.buffer_bytes_max; - - pr_debug("%s: buf[%pK]dma_buf->area[%pK]dma_buf->addr[%pK]\n" - "dma_buf->bytes[%zd]\n", __func__, - (void *)buf, (void *)dma_buf->area, - &dma_buf->addr, dma_buf->bytes); - if (!dma_buf->area) - return -ENOMEM; - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - return 0; -} - -static int msm_compr_ioctl_shared(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - int rc = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - uint64_t timestamp; - uint64_t temp; - - switch (cmd) { - case SNDRV_COMPRESS_TSTAMP: { - struct snd_compr_tstamp *tstamp; - pr_debug("SNDRV_COMPRESS_TSTAMP\n"); - tstamp = arg; - memset(tstamp, 0x0, sizeof(*tstamp)); - rc = q6asm_get_session_time(prtd->audio_client, ×tamp); - if (rc < 0) { - pr_err("%s: Get Session Time return value =%lld\n", - __func__, timestamp); - return -EAGAIN; - } - temp = (timestamp * 2 * runtime->channels); - temp = temp * (runtime->rate/1000); - temp = div_u64(temp, 1000); - tstamp->sampling_rate = runtime->rate; - tstamp->timestamp = timestamp; - pr_debug("%s: bytes_consumed:,timestamp = %lld,\n", - __func__, - tstamp->timestamp); - return 0; - } - case SNDRV_COMPRESS_GET_CAPS: { - struct snd_compr_caps *caps; - caps = arg; - memset(caps, 0, sizeof(*caps)); - pr_debug("SNDRV_COMPRESS_GET_CAPS\n"); - memcpy(caps, &compr->info.compr_cap, sizeof(*caps)); - return 0; - } - case SNDRV_COMPRESS_SET_PARAMS: - pr_debug("SNDRV_COMPRESS_SET_PARAMS:\n"); - memcpy(&compr->info.codec_param, (void *) arg, - sizeof(struct snd_compr_params)); - switch (compr->info.codec_param.codec.id) { - case SND_AUDIOCODEC_MP3: - /* For MP3 we dont need any other parameter */ - pr_debug("SND_AUDIOCODEC_MP3\n"); - compr->codec = FORMAT_MP3; - break; - case SND_AUDIOCODEC_AAC: - pr_debug("SND_AUDIOCODEC_AAC\n"); - compr->codec = FORMAT_MPEG4_AAC; - break; - case SND_AUDIOCODEC_AC3: { - char params_value[MAX_AC3_PARAM_SIZE]; - int *params_value_data = (int *)params_value; - /* 36 is the max param length for ddp */ - int i; - struct snd_dec_ddp *ddp = - &compr->info.codec_param.codec.options.ddp; - uint32_t params_length = 0; - memset(params_value, 0, MAX_AC3_PARAM_SIZE); - /* check integer overflow */ - if (ddp->params_length > UINT_MAX/sizeof(int)) { - pr_err("%s: Integer overflow ddp->params_length %d\n", - __func__, ddp->params_length); - return -EINVAL; - } - params_length = ddp->params_length*sizeof(int); - if (params_length > MAX_AC3_PARAM_SIZE) { - /*MAX is 36*sizeof(int) this should not happen*/ - pr_err("%s: params_length(%d) is greater than %zd\n", - __func__, params_length, MAX_AC3_PARAM_SIZE); - return -EINVAL; - } - pr_debug("SND_AUDIOCODEC_AC3\n"); - compr->codec = FORMAT_AC3; - pr_debug("params_length: %d\n", ddp->params_length); - for (i = 0; i < params_length/sizeof(int); i++) - pr_debug("params_value[%d]: %x\n", i, - params_value_data[i]); - for (i = 0; i < ddp->params_length/2; i++) { - ddp->params_id[i] = params_value_data[2*i]; - ddp->params_value[i] = params_value_data[2*i+1]; - } - if (atomic_read(&prtd->start)) { - rc = msm_compr_send_ddp_cfg(prtd->audio_client, - ddp); - if (rc < 0) - pr_err("%s: DDP CMD CFG failed\n", - __func__); - } - break; - } - case SND_AUDIOCODEC_EAC3: { - char params_value[MAX_AC3_PARAM_SIZE]; - int *params_value_data = (int *)params_value; - /* 36 is the max param length for ddp */ - int i; - struct snd_dec_ddp *ddp = - &compr->info.codec_param.codec.options.ddp; - uint32_t params_length = 0; - memset(params_value, 0, MAX_AC3_PARAM_SIZE); - /* check integer overflow */ - if (ddp->params_length > UINT_MAX/sizeof(int)) { - pr_err("%s: Integer overflow ddp->params_length %d\n", - __func__, ddp->params_length); - return -EINVAL; - } - params_length = ddp->params_length*sizeof(int); - if (params_length > MAX_AC3_PARAM_SIZE) { - /*MAX is 36*sizeof(int) this should not happen*/ - pr_err("%s: params_length(%d) is greater than %zd\n", - __func__, params_length, MAX_AC3_PARAM_SIZE); - return -EINVAL; - } - pr_debug("SND_AUDIOCODEC_EAC3\n"); - compr->codec = FORMAT_EAC3; - pr_debug("params_length: %d\n", ddp->params_length); - for (i = 0; i < ddp->params_length; i++) - pr_debug("params_value[%d]: %x\n", i, - params_value_data[i]); - for (i = 0; i < ddp->params_length/2; i++) { - ddp->params_id[i] = params_value_data[2*i]; - ddp->params_value[i] = params_value_data[2*i+1]; - } - if (atomic_read(&prtd->start)) { - rc = msm_compr_send_ddp_cfg(prtd->audio_client, - ddp); - if (rc < 0) - pr_err("%s: DDP CMD CFG failed\n", - __func__); - } - break; - } - default: - pr_debug("FORMAT_LINEAR_PCM\n"); - compr->codec = FORMAT_LINEAR_PCM; - break; - } - return 0; - case SNDRV_PCM_IOCTL1_RESET: - pr_debug("SNDRV_PCM_IOCTL1_RESET\n"); - /* Flush only when session is started during CAPTURE, - while PLAYBACK has no such restriction. */ - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || - (substream->stream == SNDRV_PCM_STREAM_CAPTURE && - atomic_read(&prtd->start))) { - if (atomic_read(&prtd->eos)) { - prtd->cmd_interrupt = 1; - wake_up(&the_locks.eos_wait); - atomic_set(&prtd->eos, 0); - } - - /* A unlikely race condition possible with FLUSH - DRAIN if ack is set by flush and reset by drain */ - prtd->cmd_ack = 0; - rc = q6asm_cmd(prtd->audio_client, CMD_FLUSH); - if (rc < 0) { - pr_err("%s: flush cmd failed rc=%d\n", - __func__, rc); - return rc; - } - rc = wait_event_timeout(the_locks.flush_wait, - prtd->cmd_ack, 5 * HZ); - if (!rc) - pr_err("Flush cmd timeout\n"); - prtd->pcm_irq_pos = 0; - } - break; - case SNDRV_COMPRESS_DRAIN: - pr_debug("%s: SNDRV_COMPRESS_DRAIN\n", __func__); - if (atomic_read(&prtd->pending_buffer)) { - pr_debug("%s: no pending writes, drain would block\n", - __func__); - return -EWOULDBLOCK; - } - - atomic_set(&prtd->eos, 1); - atomic_set(&prtd->pending_buffer, 0); - prtd->cmd_ack = 0; - q6asm_cmd_nowait(prtd->audio_client, CMD_EOS); - /* Wait indefinitely for DRAIN. Flush can also signal this*/ - rc = wait_event_interruptible(the_locks.eos_wait, - (prtd->cmd_ack || prtd->cmd_interrupt)); - - if (rc < 0) - pr_err("EOS cmd interrupted\n"); - pr_debug("%s: SNDRV_COMPRESS_DRAIN out of wait\n", __func__); - - if (prtd->cmd_interrupt) - rc = -EINTR; - - prtd->cmd_interrupt = 0; - return rc; - default: - break; - } - return snd_pcm_lib_ioctl(substream, cmd, arg); -} -#ifdef CONFIG_COMPAT -struct snd_enc_wma32 { - u32 super_block_align; /* WMA Type-specific data */ - u32 encodeopt1; - u32 encodeopt2; -}; - -struct snd_enc_vorbis32 { - s32 quality; - u32 managed; - u32 max_bit_rate; - u32 min_bit_rate; - u32 downmix; -}; - -struct snd_enc_real32 { - u32 quant_bits; - u32 start_region; - u32 num_regions; -}; - -struct snd_enc_flac32 { - u32 num; - u32 gain; -}; - -struct snd_enc_generic32 { - u32 bw; /* encoder bandwidth */ - s32 reserved[15]; -}; -struct snd_dec_ddp32 { - u32 params_length; - u32 params_id[18]; - u32 params_value[18]; -}; - -union snd_codec_options32 { - struct snd_enc_wma32 wma; - struct snd_enc_vorbis32 vorbis; - struct snd_enc_real32 real; - struct snd_enc_flac32 flac; - struct snd_enc_generic32 generic; - struct snd_dec_ddp32 ddp; -}; - -struct snd_codec32 { - u32 id; - u32 ch_in; - u32 ch_out; - u32 sample_rate; - u32 bit_rate; - u32 rate_control; - u32 profile; - u32 level; - u32 ch_mode; - u32 format; - u32 align; - union snd_codec_options32 options; - u32 reserved[3]; -}; - -struct snd_compressed_buffer32 { - u32 fragment_size; - u32 fragments; -}; - -struct snd_compr_params32 { - struct snd_compressed_buffer32 buffer; - struct snd_codec32 codec; - u8 no_wake_mode; -}; - -struct snd_compr_caps32 { - u32 num_codecs; - u32 direction; - u32 min_fragment_size; - u32 max_fragment_size; - u32 min_fragments; - u32 max_fragments; - u32 codecs[MAX_NUM_CODECS]; - u32 reserved[11]; -}; -struct snd_compr_tstamp32 { - u32 byte_offset; - u32 copied_total; - compat_ulong_t pcm_frames; - compat_ulong_t pcm_io_frames; - u32 sampling_rate; - compat_u64 timestamp; -}; -enum { - SNDRV_COMPRESS_TSTAMP32 = _IOR('C', 0x20, struct snd_compr_tstamp32), - SNDRV_COMPRESS_GET_CAPS32 = _IOWR('C', 0x10, struct snd_compr_caps32), - SNDRV_COMPRESS_SET_PARAMS32 = - _IOW('C', 0x12, struct snd_compr_params32), -}; -static int msm_compr_compat_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - int err = 0; - switch (cmd) { - case SNDRV_COMPRESS_TSTAMP32: { - struct snd_compr_tstamp tstamp; - struct snd_compr_tstamp32 tstamp32; - memset(&tstamp, 0, sizeof(tstamp)); - memset(&tstamp32, 0, sizeof(tstamp32)); - cmd = SNDRV_COMPRESS_TSTAMP; - err = msm_compr_ioctl_shared(substream, cmd, &tstamp); - if (err) { - pr_err("%s: COMPRESS_TSTAMP failed rc %d\n", - __func__, err); - goto bail_out; - } - tstamp32.byte_offset = tstamp.byte_offset; - tstamp32.copied_total = tstamp.copied_total; - tstamp32.pcm_frames = tstamp.pcm_frames; - tstamp32.pcm_io_frames = tstamp.pcm_io_frames; - tstamp32.sampling_rate = tstamp.sampling_rate; - tstamp32.timestamp = tstamp.timestamp; - if (copy_to_user(arg, &tstamp32, sizeof(tstamp32))) { - pr_err("%s: copytouser failed COMPRESS_TSTAMP32\n", - __func__); - err = -EFAULT; - } - break; - } - case SNDRV_COMPRESS_GET_CAPS32: { - struct snd_compr_caps caps; - struct snd_compr_caps32 caps32; - u32 i; - memset(&caps, 0, sizeof(caps)); - memset(&caps32, 0, sizeof(caps32)); - cmd = SNDRV_COMPRESS_GET_CAPS; - err = msm_compr_ioctl_shared(substream, cmd, &caps); - if (err) { - pr_err("%s: GET_CAPS failed rc %d\n", - __func__, err); - goto bail_out; - } - pr_debug("SNDRV_COMPRESS_GET_CAPS_32\n"); - if (!err && caps.num_codecs >= MAX_NUM_CODECS) { - pr_err("%s: Invalid number of codecs\n", __func__); - err = -EINVAL; - goto bail_out; - } - caps32.direction = caps.direction; - caps32.max_fragment_size = caps.max_fragment_size; - caps32.max_fragments = caps.max_fragments; - caps32.min_fragment_size = caps.min_fragment_size; - caps32.num_codecs = caps.num_codecs; - for (i = 0; i < caps.num_codecs; i++) - caps32.codecs[i] = caps.codecs[i]; - if (copy_to_user(arg, &caps32, sizeof(caps32))) { - pr_err("%s: copytouser failed COMPRESS_GETCAPS32\n", - __func__); - err = -EFAULT; - } - break; - } - case SNDRV_COMPRESS_SET_PARAMS32: { - struct snd_compr_params32 params32; - struct snd_compr_params params; - memset(¶ms32, 0 , sizeof(params32)); - memset(¶ms, 0 , sizeof(params)); - cmd = SNDRV_COMPRESS_SET_PARAMS; - if (copy_from_user(¶ms32, arg, sizeof(params32))) { - pr_err("%s: copyfromuser failed SET_PARAMS32\n", - __func__); - err = -EFAULT; - goto bail_out; - } - params.no_wake_mode = params32.no_wake_mode; - params.codec.id = params32.codec.id; - params.codec.ch_in = params32.codec.ch_in; - params.codec.ch_out = params32.codec.ch_out; - params.codec.sample_rate = params32.codec.sample_rate; - params.codec.bit_rate = params32.codec.bit_rate; - params.codec.rate_control = params32.codec.rate_control; - params.codec.profile = params32.codec.profile; - params.codec.level = params32.codec.level; - params.codec.ch_mode = params32.codec.ch_mode; - params.codec.format = params32.codec.format; - params.codec.align = params32.codec.align; - - switch (params.codec.id) { - case SND_AUDIOCODEC_WMA: - case SND_AUDIOCODEC_WMA_PRO: - params.codec.options.wma.encodeopt1 = - params32.codec.options.wma.encodeopt1; - params.codec.options.wma.encodeopt2 = - params32.codec.options.wma.encodeopt2; - params.codec.options.wma.super_block_align = - params32.codec.options.wma.super_block_align; - break; - case SND_AUDIOCODEC_VORBIS: - params.codec.options.vorbis.downmix = - params32.codec.options.vorbis.downmix; - params.codec.options.vorbis.managed = - params32.codec.options.vorbis.managed; - params.codec.options.vorbis.max_bit_rate = - params32.codec.options.vorbis.max_bit_rate; - params.codec.options.vorbis.min_bit_rate = - params32.codec.options.vorbis.min_bit_rate; - params.codec.options.vorbis.quality = - params32.codec.options.vorbis.quality; - break; - case SND_AUDIOCODEC_REAL: - params.codec.options.real.num_regions = - params32.codec.options.real.num_regions; - params.codec.options.real.quant_bits = - params32.codec.options.real.quant_bits; - params.codec.options.real.start_region = - params32.codec.options.real.start_region; - break; - case SND_AUDIOCODEC_FLAC: - params.codec.options.flac.gain = - params32.codec.options.flac.gain; - params.codec.options.flac.num = - params32.codec.options.flac.num; - break; - case SND_AUDIOCODEC_DTS: - case SND_AUDIOCODEC_DTS_PASS_THROUGH: - case SND_AUDIOCODEC_DTS_LBR: - case SND_AUDIOCODEC_DTS_LBR_PASS_THROUGH: - case SND_AUDIOCODEC_DTS_TRANSCODE_LOOPBACK: - break; - case SND_AUDIOCODEC_AC3: - case SND_AUDIOCODEC_EAC3: - params.codec.options.ddp.params_length = - params32.codec.options.ddp.params_length; - memcpy(params.codec.options.ddp.params_value, - params32.codec.options.ddp.params_value, - sizeof(params32.codec.options.ddp.params_value)); - memcpy(params.codec.options.ddp.params_id, - params32.codec.options.ddp.params_id, - sizeof(params32.codec.options.ddp.params_id)); - break; - default: - params.codec.options.generic.bw = - params32.codec.options.generic.bw; - break; - } - if (!err) - err = msm_compr_ioctl_shared(substream, cmd, ¶ms); - break; - } - default: - err = msm_compr_ioctl_shared(substream, cmd, arg); - } -bail_out: - return err; - -} -#endif -static int msm_compr_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - int err = 0; - if (!substream) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - pr_debug("%s called with cmd = %d\n", __func__, cmd); - switch (cmd) { - case SNDRV_COMPRESS_TSTAMP: { - struct snd_compr_tstamp tstamp; - if (!arg) { - pr_err("%s: Invalid params Tstamp\n", __func__); - return -EINVAL; - } - err = msm_compr_ioctl_shared(substream, cmd, &tstamp); - if (err) - pr_err("%s: COMPRESS_TSTAMP failed rc %d\n", - __func__, err); - if (!err && copy_to_user(arg, &tstamp, sizeof(tstamp))) { - pr_err("%s: copytouser failed COMPRESS_TSTAMP\n", - __func__); - err = -EFAULT; - } - break; - } - case SNDRV_COMPRESS_GET_CAPS: { - struct snd_compr_caps cap; - if (!arg) { - pr_err("%s: Invalid params getcaps\n", __func__); - return -EINVAL; - } - pr_debug("SNDRV_COMPRESS_GET_CAPS\n"); - err = msm_compr_ioctl_shared(substream, cmd, &cap); - if (err) - pr_err("%s: GET_CAPS failed rc %d\n", - __func__, err); - if (!err && copy_to_user(arg, &cap, sizeof(cap))) { - pr_err("%s: copytouser failed GET_CAPS\n", - __func__); - err = -EFAULT; - } - break; - } - case SNDRV_COMPRESS_SET_PARAMS: { - struct snd_compr_params params; - if (!arg) { - pr_err("%s: Invalid params setparam\n", __func__); - return -EINVAL; - } - if (copy_from_user(¶ms, arg, - sizeof(struct snd_compr_params))) { - pr_err("%s: SET_PARAMS\n", __func__); - return -EFAULT; - } - err = msm_compr_ioctl_shared(substream, cmd, ¶ms); - if (err) - pr_err("%s: SET_PARAMS failed rc %d\n", - __func__, err); - break; - } - default: - err = msm_compr_ioctl_shared(substream, cmd, arg); - } - return err; -} - -static int msm_compr_restart(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - struct audio_aio_write_param param; - struct audio_buffer *buf = NULL; - struct output_meta_data_st output_meta_data; - int time_stamp_flag = 0; - int buffer_length = 0; - - pr_debug("%s, trigger restart\n", __func__); - - if (runtime->render_flag & SNDRV_RENDER_STOPPED) { - buf = prtd->audio_client->port[IN].buf; - pr_debug("%s:writing %d bytes of buffer[%d] to dsp 2\n", - __func__, prtd->pcm_count, prtd->out_head); - pr_debug("%s:writing buffer[%d] from 0x%08x\n", - __func__, prtd->out_head, - ((unsigned int)buf[0].phys - + (prtd->out_head * prtd->pcm_count))); - - if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) - time_stamp_flag = SET_TIMESTAMP; - else - time_stamp_flag = NO_TIMESTAMP; - memcpy(&output_meta_data, (char *)(buf->data + - prtd->out_head * prtd->pcm_count), - COMPRE_OUTPUT_METADATA_SIZE); - - buffer_length = output_meta_data.frame_size; - pr_debug("meta_data_length: %d, frame_length: %d\n", - output_meta_data.meta_data_length, - output_meta_data.frame_size); - pr_debug("timestamp_msw: %d, timestamp_lsw: %d\n", - output_meta_data.timestamp_msw, - output_meta_data.timestamp_lsw); - - param.paddr = (unsigned long)buf[0].phys - + (prtd->out_head * prtd->pcm_count) - + output_meta_data.meta_data_length; - param.len = buffer_length; - param.msw_ts = output_meta_data.timestamp_msw; - param.lsw_ts = output_meta_data.timestamp_lsw; - param.flags = time_stamp_flag; - param.uid = prtd->session_id; - if (q6asm_async_write(prtd->audio_client, - ¶m) < 0) - pr_err("%s:q6asm_async_write failed\n", - __func__); - else - prtd->out_head = - (prtd->out_head + 1) & (runtime->periods - 1); - - runtime->render_flag &= ~SNDRV_RENDER_STOPPED; - return 0; - } - return 0; -} - -static int msm_compr_volume_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct snd_pcm_substream *substream = - vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - struct msm_audio *prtd; - int volume = ucontrol->value.integer.value[0]; - - pr_debug("%s: volume : %x\n", __func__, volume); - if (!substream) - return -ENODEV; - if (!substream->runtime) - return 0; - prtd = substream->runtime->private_data; - if (prtd) - rc = compressed_set_volume(prtd, volume); - - return rc; -} - -static int msm_compr_volume_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct snd_pcm_substream *substream = - vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - struct msm_audio *prtd; - - pr_debug("%s\n", __func__); - if (!substream) - return -ENODEV; - if (!substream->runtime) - return 0; - prtd = substream->runtime->private_data; - if (prtd) - ucontrol->value.integer.value[0] = prtd->volume; - return 0; -} - -static int msm_compr_add_controls(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_volume *volume_info; - struct snd_kcontrol *kctl; - - dev_dbg(rtd->dev, "%s, Volume cntrl add\n", __func__); - ret = snd_pcm_add_volume_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, rtd->dai_link->be_id, - &volume_info); - if (ret < 0) - return ret; - kctl = volume_info->kctl; - kctl->put = msm_compr_volume_ctl_put; - kctl->get = msm_compr_volume_ctl_get; - kctl->tlv.p = compr_rx_vol_gain; - return 0; -} - -static struct snd_pcm_ops msm_compr_ops = { - .open = msm_compr_open, - .hw_params = msm_compr_hw_params, - .close = msm_compr_close, - .ioctl = msm_compr_ioctl, - .prepare = msm_compr_prepare, - .trigger = msm_compr_trigger, - .pointer = msm_compr_pointer, - .mmap = msm_compr_mmap, - .restart = msm_compr_restart, -#ifdef CONFIG_COMPAT - .compat_ioctl = msm_compr_compat_ioctl, -#endif -}; - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - ret = msm_compr_add_controls(rtd); - if (ret) - pr_err("%s, kctl add failed\n", __func__); - return ret; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_compr_ops, - .pcm_new = msm_asoc_pcm_new, -}; - -static int msm_compr_probe(struct platform_device *pdev) -{ - - dev_info(&pdev->dev, "%s: dev name %s\n", - __func__, dev_name(&pdev->dev)); - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_compr_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_compr_dt_match[] = { - {.compatible = "qcom,msm-compr-dsp"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_compr_dt_match); - -static struct platform_driver msm_compr_driver = { - .driver = { - .name = "msm-compr-dsp", - .owner = THIS_MODULE, - .of_match_table = msm_compr_dt_match, - }, - .probe = msm_compr_probe, - .remove = msm_compr_remove, -}; - -static int __init msm_soc_platform_init(void) -{ - init_waitqueue_head(&the_locks.enable_wait); - init_waitqueue_head(&the_locks.eos_wait); - init_waitqueue_head(&the_locks.write_wait); - init_waitqueue_head(&the_locks.read_wait); - init_waitqueue_head(&the_locks.flush_wait); - - return platform_driver_register(&msm_compr_driver); -} -module_init(msm_soc_platform_init); - -static void __exit msm_soc_platform_exit(void) -{ - platform_driver_unregister(&msm_compr_driver); -} -module_exit(msm_soc_platform_exit); - -MODULE_DESCRIPTION("PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.h b/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.h deleted file mode 100644 index d6e3ec6956b1b..0000000000000 --- a/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2012, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MSM_COMPR_H -#define _MSM_COMPR_H -#include -#include -#include -#include -#include - -#include "msm-pcm-q6-v2.h" - -struct compr_info { - struct snd_compr_caps compr_cap; - struct snd_compr_codec_caps codec_caps; - struct snd_compr_params codec_param; -}; - -struct compr_audio { - struct msm_audio prtd; - struct compr_info info; - uint32_t codec; -}; - -#endif /*_MSM_COMPR_H*/ From 23752f7ea00d0cc1750754653a9abff6670cb9f9 Mon Sep 17 00:00:00 2001 From: Pratham Pratap Date: Tue, 2 May 2017 17:29:56 +0530 Subject: [PATCH 0818/1015] USB: f_qc_rndis: Prevent use-after-free for _rndis_qc Assume that there are two threads, thread1 is setting value of _rndis_qc variable in rndis_qc_bind_config_vendor function. Thread2 jumps in and get the value of _rndis_qc in rndis_qc_open_dev function before it is freed in rndis_qc_bind_config_vendor function, since rndis_ipa_init or usb_add_function failed. Use-after-free will happen as Thread2 is referencing freed objects. To prevent this spinlock is used where ever it is needed to protect _rndis_qc variable. Change-Id: Ibfe10cedc18bcb19dd01cd2bec43a5554fd008bc Signed-off-by: Pratham Pratap --- drivers/usb/gadget/function/f_qc_rndis.c | 85 ++++++++++++++++++------ 1 file changed, 64 insertions(+), 21 deletions(-) diff --git a/drivers/usb/gadget/function/f_qc_rndis.c b/drivers/usb/gadget/function/f_qc_rndis.c index b74462750a4a1..bef6a1ab3e5a7 100644 --- a/drivers/usb/gadget/function/f_qc_rndis.c +++ b/drivers/usb/gadget/function/f_qc_rndis.c @@ -1289,8 +1289,6 @@ rndis_qc_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], rndis->port.func.suspend = rndis_qc_suspend; rndis->port.func.resume = rndis_qc_resume; - _rndis_qc = rndis; - if (rndis->xport == USB_GADGET_XPORT_BAM2BAM_IPA) { status = rndis_ipa_init(&rndis_ipa_params); if (status) { @@ -1305,6 +1303,9 @@ rndis_qc_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], rndis_ipa_cleanup(rndis_ipa_params.private); goto fail; } + + _rndis_qc = rndis; + c->cdev->gadget->bam2bam_func_enabled = true; return 0; @@ -1317,74 +1318,115 @@ rndis_qc_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], static int rndis_qc_open_dev(struct inode *ip, struct file *fp) { + int ret = 0; + unsigned long flags; pr_info("Open rndis QC driver\n"); + spin_lock_irqsave(&rndis_lock, flags); if (!_rndis_qc) { pr_err("rndis_qc_dev not created yet\n"); - return -ENODEV; + ret = -ENODEV; + goto fail; } if (rndis_qc_lock(&_rndis_qc->open_excl)) { pr_err("Already opened\n"); - return -EBUSY; + ret = -EBUSY; + goto fail; } fp->private_data = _rndis_qc; - pr_info("rndis QC file opened\n"); +fail: + spin_unlock_irqrestore(&rndis_lock, flags); - return 0; + if (!ret) + pr_info("rndis QC file opened\n"); + + return ret; } static int rndis_qc_release_dev(struct inode *ip, struct file *fp) { - struct f_rndis_qc *rndis = fp->private_data; - + unsigned long flags; pr_info("Close rndis QC file\n"); - rndis_qc_unlock(&rndis->open_excl); + spin_lock_irqsave(&rndis_lock, flags); + + if (!_rndis_qc) { + pr_err("rndis_qc_dev not present\n"); + spin_unlock_irqrestore(&rndis_lock, flags); + return -ENODEV; + } + rndis_qc_unlock(&_rndis_qc->open_excl); + spin_unlock_irqrestore(&rndis_lock, flags); return 0; } static long rndis_qc_ioctl(struct file *fp, unsigned cmd, unsigned long arg) { - struct f_rndis_qc *rndis = fp->private_data; + u8 qc_max_pkt_per_xfer = 0; + u32 qc_max_pkt_size = 0; int ret = 0; + unsigned long flags; - pr_info("Received command %d\n", cmd); + spin_lock_irqsave(&rndis_lock, flags); + if (!_rndis_qc) { + pr_err("rndis_qc_dev not present\n"); + ret = -ENODEV; + goto fail; + } - if (rndis_qc_lock(&rndis->ioctl_excl)) - return -EBUSY; + qc_max_pkt_per_xfer = _rndis_qc->ul_max_pkt_per_xfer; + qc_max_pkt_size = _rndis_qc->max_pkt_size; + + if (rndis_qc_lock(&_rndis_qc->ioctl_excl)) { + ret = -EBUSY; + goto fail; + } + + spin_unlock_irqrestore(&rndis_lock, flags); + + pr_info("Received command %d\n", cmd); switch (cmd) { case RNDIS_QC_GET_MAX_PKT_PER_XFER: ret = copy_to_user((void __user *)arg, - &rndis->ul_max_pkt_per_xfer, - sizeof(rndis->ul_max_pkt_per_xfer)); + &qc_max_pkt_per_xfer, + sizeof(qc_max_pkt_per_xfer)); if (ret) { pr_err("copying to user space failed\n"); ret = -EFAULT; } pr_info("Sent UL max packets per xfer %d\n", - rndis->ul_max_pkt_per_xfer); + qc_max_pkt_per_xfer); break; case RNDIS_QC_GET_MAX_PKT_SIZE: ret = copy_to_user((void __user *)arg, - &rndis->max_pkt_size, - sizeof(rndis->max_pkt_size)); + &qc_max_pkt_size, + sizeof(qc_max_pkt_size)); if (ret) { pr_err("copying to user space failed\n"); ret = -EFAULT; } pr_debug("Sent max packet size %d\n", - rndis->max_pkt_size); + qc_max_pkt_size); break; default: pr_err("Unsupported IOCTL\n"); ret = -EINVAL; } - rndis_qc_unlock(&rndis->ioctl_excl); + spin_lock_irqsave(&rndis_lock, flags); + + if (!_rndis_qc) { + pr_err("rndis_qc_dev not present\n"); + ret = -ENODEV; + goto fail; + } + rndis_qc_unlock(&_rndis_qc->ioctl_excl); +fail: + spin_unlock_irqrestore(&rndis_lock, flags); return ret; } @@ -1407,10 +1449,11 @@ static int rndis_qc_init(void) pr_info("initialize rndis QC instance\n"); + spin_lock_init(&rndis_lock); + ret = misc_register(&rndis_qc_device); if (ret) pr_err("rndis QC driver failed to register\n"); - spin_lock_init(&rndis_lock); ret = bam_data_setup(USB_FUNC_RNDIS, RNDIS_QC_NO_PORTS); if (ret) { From 4955680262196dbc6b04e0b1d7c3e282e1a3c4ae Mon Sep 17 00:00:00 2001 From: Andrew Chant Date: Fri, 31 Mar 2017 15:33:48 +0530 Subject: [PATCH 0819/1015] input: synaptics: fix for buggy code poined by SIL tool Place file offset validity checks under mutex for synaptics_dsx_rmi_dev.c touch driver. Git-repo: https://android.googlesource.com/kernel/msm Git-commit: e1fb1600fc222337989e3084d68df929882deae5 Change-Id: I2c32babbccb483547204cb2843973abf97e988a5 Signed-off-by: Andrew Chant [srkupp@codeaurora.org: This change is a fix for buggy code pointed by sil after merging the above commit.} Signed-off-by: Srinivasa Rao Kuppala Signed-off-by: Shantanu Jain --- .../synaptics_dsx/synaptics_dsx_rmi_dev.c | 52 +++++++++++++------ 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c index 9d61eb110e2f1..c1cbec81d7d6a 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c @@ -355,18 +355,25 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, return -EBADF; } - if (count == 0) - return 0; + mutex_lock(&(dev_data->file_mutex)); if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; - tmpbuf = kzalloc(count + 1, GFP_KERNEL); - if (!tmpbuf) - return -ENOMEM; - - mutex_lock(&(dev_data->file_mutex)); + if (count == 0) { + retval = 0; + goto unlock; + } + if (*f_pos > REG_ADDR_LIMIT) { + retval = -EFAULT; + goto unlock; + } + tmpbuf = kzalloc(count + 1, GFP_KERNEL); + if (!tmpbuf) { + retval = -ENOMEM; + goto unlock; + } retval = synaptics_rmi4_reg_read(rmidev->rmi4_data, *f_pos, tmpbuf, @@ -380,8 +387,9 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, *f_pos += retval; clean_up: - mutex_unlock(&(dev_data->file_mutex)); kfree(tmpbuf); +unlock: + mutex_unlock(&(dev_data->file_mutex)); return retval; } @@ -405,21 +413,31 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, return -EBADF; } - if (count == 0) - return 0; + mutex_lock(&(dev_data->file_mutex)); + + if (*f_pos > REG_ADDR_LIMIT) { + retval = -EFAULT; + goto unlock; + } if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; + if (count == 0) { + retval = 0; + goto unlock; + } + tmpbuf = kzalloc(count + 1, GFP_KERNEL); - if (!tmpbuf) - return -ENOMEM; + if (!tmpbuf) { + retval = -ENOMEM; + goto unlock; + } if (copy_from_user(tmpbuf, buf, count)) { - kfree(tmpbuf); - return -EFAULT; + retval = -EFAULT; + goto clean_up; } - mutex_lock(&(dev_data->file_mutex)); retval = synaptics_rmi4_reg_write(rmidev->rmi4_data, *f_pos, @@ -428,8 +446,10 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, if (retval >= 0) *f_pos += retval; - mutex_unlock(&(dev_data->file_mutex)); +clean_up: kfree(tmpbuf); +unlock: + mutex_unlock(&(dev_data->file_mutex)); return retval; } From 3c05788905574f2714fc56c00ae4a14231f8e02d Mon Sep 17 00:00:00 2001 From: Ghanim Fodi Date: Tue, 1 Nov 2016 00:09:10 +0200 Subject: [PATCH 0820/1015] msm: ipa: use GFP_ATOMIC for DMA memory allocation during SSR SSR logic is executed during device shutdown. During device shutdown the Linux tasks (processes) are moving to SIGKILL state. If a DMA allocation from the kernel happens in a context of a process in SIGKILL state and page migration is needed, the allocation will fail. Use GFP_ATOMIC allocation flag during SSR. This will utilize the atomic memory pool and will not require page migration. CRs-fixed: 1077811 Change-Id: Ie06b85d1f9d0a230c3d3832b6f0bbcdefc520c1e Signed-off-by: Ghanim Fodi --- drivers/platform/msm/ipa/ipa_v2/ipa.c | 2 +- drivers/platform/msm/ipa/ipa_v3/ipa.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa.c b/drivers/platform/msm/ipa/ipa_v2/ipa.c index 8647a31ea0e8b..75b756ec7a0d4 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa.c @@ -1838,7 +1838,7 @@ static int ipa_q6_clean_q6_tables(void) u32 max_cmds = ipa_get_max_flt_rt_cmds(ipa_ctx->ipa_num_pipes); mem.base = dma_alloc_coherent(ipa_ctx->pdev, 4, &mem.phys_base, - GFP_KERNEL); + GFP_ATOMIC); if (!mem.base) { IPAERR("failed to alloc DMA buff of size 4\n"); return -ENOMEM; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index e5e1f7250b860..5f91d41096dd1 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -2064,7 +2064,7 @@ static int ipa3_q6_clean_q6_tables(void) mem.size = IPA_HW_TBL_HDR_WIDTH; mem.base = dma_alloc_coherent(ipa3_ctx->pdev, mem.size, - &mem.phys_base, GFP_KERNEL); + &mem.phys_base, GFP_ATOMIC); if (!mem.base) { IPAERR("failed to alloc DMA buff of size %d\n", mem.size); return -ENOMEM; From 6134b6c30f38e63a7e499530467bb2ccca739875 Mon Sep 17 00:00:00 2001 From: Taniya Das Date: Wed, 17 May 2017 09:54:59 +0530 Subject: [PATCH 0821/1015] clk: msm: Add support for 600MHz for GPU clock GPU clock frequency has been updated for SDM450 to support 600MHz, add support for the same to add a new GPU frequency table. Change-Id: Id9c0d2a0a859715e1d08dcfbfa2c3793bebeb9bd Signed-off-by: Taniya Das --- .../bindings/arm/msm/clock-controller.txt | 1 + drivers/clk/msm/clock-gcc-8953.c | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/msm/clock-controller.txt b/Documentation/devicetree/bindings/arm/msm/clock-controller.txt index 62440baac3287..7d060b169494c 100644 --- a/Documentation/devicetree/bindings/arm/msm/clock-controller.txt +++ b/Documentation/devicetree/bindings/arm/msm/clock-controller.txt @@ -70,6 +70,7 @@ Required properties: "qcom,gpucc-8996-v3.0" "qcom,gpucc-8996-pro" "qcom,gcc-gfx-8953" + "qcom,gcc-gfx-sdm450" "qcom,gcc-californium" "qcom,cc-debug-californium" "qcom,gcc-mdm9607" diff --git a/drivers/clk/msm/clock-gcc-8953.c b/drivers/clk/msm/clock-gcc-8953.c index bf0696d700bd2..d96fc42282be3 100644 --- a/drivers/clk/msm/clock-gcc-8953.c +++ b/drivers/clk/msm/clock-gcc-8953.c @@ -391,6 +391,25 @@ static struct clk_freq_tbl ftbl_gfx3d_clk_src[] = { F_END }; +static struct clk_freq_tbl ftbl_gfx3d_clk_src_sdm450[] = { + F_MM( 19200000, FIXED_CLK_SRC, xo, 1, 0, 0), + F_MM( 50000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 8, 0, 0), + F_MM( 80000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 5, 0, 0), + F_MM( 100000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 4, 0, 0), + F_MM( 133330000, FIXED_CLK_SRC, gpll0_main_div2_mm, 3, 0, 0), + F_MM( 160000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 2.5, 0, 0), + F_MM( 200000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 2, 0, 0), + F_MM( 216000000, FIXED_CLK_SRC, gpll6_main_div2_gfx, 2.5, 0, 0), + F_MM( 266670000, FIXED_CLK_SRC, gpll0, 3, 0, 0), + F_MM( 320000000, FIXED_CLK_SRC, gpll0, 2.5, 0, 0), + F_MM( 400000000, FIXED_CLK_SRC, gpll0, 2, 0, 0), + F_MM( 460800000, FIXED_CLK_SRC, gpll4_out_aux, 2.5, 0, 0), + F_MM( 510000000, 1020000000, gpll3, 1, 0, 0), + F_MM( 560000000, 1120000000, gpll3, 1, 0, 0), + F_MM( 600000000, 1200000000, gpll3, 1, 0, 0), + F_END +}; + static struct rcg_clk gfx3d_clk_src = { .cmd_rcgr_reg = GFX3D_CMD_RCGR, .set_rate = set_rate_hid, @@ -3984,6 +4003,7 @@ static int msm_gcc_gfx_probe(struct platform_device *pdev) struct resource *res; int ret; u32 regval; + bool compat_bin = false; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cc_base"); if (!res) { @@ -4005,6 +4025,11 @@ static int msm_gcc_gfx_probe(struct platform_device *pdev) return PTR_ERR(vdd_gfx.regulator[0]); } + compat_bin = of_device_is_compatible(pdev->dev.of_node, + "qcom,gcc-gfx-sdm450"); + if (compat_bin) + gfx3d_clk_src.freq_tbl = ftbl_gfx3d_clk_src_sdm450; + ret = of_get_fmax_vdd_class(pdev, &gcc_oxili_gfx3d_clk.c, "qcom,gfxfreq-corner"); if (ret) { @@ -4027,6 +4052,7 @@ static int msm_gcc_gfx_probe(struct platform_device *pdev) static struct of_device_id msm_clock_gfx_match_table[] = { { .compatible = "qcom,gcc-gfx-8953" }, + { .compatible = "qcom,gcc-gfx-sdm450" }, {} }; From faf5acf05b0073973865c07c052b9a2556168be8 Mon Sep 17 00:00:00 2001 From: Taniya Das Date: Thu, 18 May 2017 11:35:48 +0530 Subject: [PATCH 0822/1015] ARM: dts: msm: Update gfx clock corners for SDM450 New frequency table is required to be supported for GPU clients, update the gfxfreq-corner table for the same. Change-Id: I2ba8b73a96e7bd36171326ddb948ff7a85578b00 Signed-off-by: Taniya Das --- arch/arm/boot/dts/qcom/sdm450.dtsi | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/arch/arm/boot/dts/qcom/sdm450.dtsi b/arch/arm/boot/dts/qcom/sdm450.dtsi index 9cabb44a8d184..0300973b88b39 100644 --- a/arch/arm/boot/dts/qcom/sdm450.dtsi +++ b/arch/arm/boot/dts/qcom/sdm450.dtsi @@ -22,3 +22,16 @@ soc: soc { }; }; + +&clock_gcc_gfx { + compatible = "qcom,gcc-gfx-sdm450"; + qcom,gfxfreq-corner = + < 0 0 >, + < 133330000 1 >, /* Min SVS */ + < 216000000 2 >, /* Low SVS */ + < 320000000 3 >, /* SVS */ + < 400000000 4 >, /* SVS Plus */ + < 510000000 5 >, /* NOM */ + < 560000000 6 >, /* Nom Plus */ + < 600000000 7 >; /* Turbo */ +}; From 18cdbb914301ca43615720bca6ada95e0855843e Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Thu, 18 May 2017 16:19:47 +0530 Subject: [PATCH 0823/1015] ARM: dts: msm: Add 600Mhz GPU clock support for SDM450 SDM450 GPU can support max 600Mhz clock. Add support for new GPU powerlevel. Change-Id: If2eabd74065e3b2417b840d79c982f7495646a02 Signed-off-by: Hareesh Gundu --- arch/arm/boot/dts/qcom/sdm450.dtsi | 83 ++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/arch/arm/boot/dts/qcom/sdm450.dtsi b/arch/arm/boot/dts/qcom/sdm450.dtsi index 0300973b88b39..029e055b46d3b 100644 --- a/arch/arm/boot/dts/qcom/sdm450.dtsi +++ b/arch/arm/boot/dts/qcom/sdm450.dtsi @@ -35,3 +35,86 @@ < 560000000 6 >, /* Nom Plus */ < 600000000 7 >; /* Turbo */ }; + +/* GPU Overrides*/ +&msm_gpu { + + /delete-node/qcom,gpu-pwrlevels; + + qcom,gpu-pwrlevels { + #address-cells = <1>; + #size-cells = <0>; + + compatible = "qcom,gpu-pwrlevels"; + + /* TURBO */ + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <600000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <10>; + qcom,bus-max = <10>; + }; + + /* NOM+ */ + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <560000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <8>; + qcom,bus-max = <10>; + }; + + /* NOM */ + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <510000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <6>; + qcom,bus-max = <10>; + }; + + /* SVS+ */ + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <400000000>; + qcom,bus-freq = <7>; + qcom,bus-min = <5>; + qcom,bus-max = <8>; + }; + + /* SVS */ + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <320000000>; + qcom,bus-freq = <4>; + qcom,bus-min = <2>; + qcom,bus-max = <6>; + }; + + /* Low SVS */ + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <216000000>; + qcom,bus-freq = <1>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + + /* Min SVS */ + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <133300000>; + qcom,bus-freq = <1>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + /* XO */ + qcom,gpu-pwrlevel@7 { + reg = <7>; + qcom,gpu-freq = <19200000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + }; + }; +}; From 61cced4e59bdd095db203388443febbf3b9a4faf Mon Sep 17 00:00:00 2001 From: Trudy Shearer Date: Thu, 18 May 2017 17:31:51 +0100 Subject: [PATCH 0824/1015] msm: gud: Remove gud driver Complete removal of gud mobicore driver. The driver author delivers an updated version of this driver to interested parties directly rendering this version obsolete. Change-Id: I40498d3203b1d6ca04f2b5a2e65461851d84d2d4 Acked-by: Tony Hamilton Signed-off-by: Trudy Shearer --- drivers/Kconfig | 2 - drivers/Makefile | 3 - drivers/gud/Kconfig | 35 - drivers/gud/Makefile | 6 - drivers/gud/MobiCoreDriver/Makefile | 33 - drivers/gud/MobiCoreDriver/admin.c | 1011 ---------------- drivers/gud/MobiCoreDriver/admin.h | 32 - drivers/gud/MobiCoreDriver/api.c | 419 ------- drivers/gud/MobiCoreDriver/api.h | 46 - drivers/gud/MobiCoreDriver/arm.h | 88 -- drivers/gud/MobiCoreDriver/build_tag.h | 15 - drivers/gud/MobiCoreDriver/client.c | 572 --------- drivers/gud/MobiCoreDriver/client.h | 99 -- drivers/gud/MobiCoreDriver/clientlib.c | 433 ------- drivers/gud/MobiCoreDriver/clock.c | 161 --- drivers/gud/MobiCoreDriver/clock.h | 53 - drivers/gud/MobiCoreDriver/debug.h | 63 - drivers/gud/MobiCoreDriver/fastcall.c | 512 -------- drivers/gud/MobiCoreDriver/fastcall.h | 38 - drivers/gud/MobiCoreDriver/logging.c | 251 ---- drivers/gud/MobiCoreDriver/logging.h | 51 - drivers/gud/MobiCoreDriver/main.c | 750 ------------ drivers/gud/MobiCoreDriver/main.h | 60 - drivers/gud/MobiCoreDriver/mci/mcifc.h | 144 --- drivers/gud/MobiCoreDriver/mci/mcimcp.h | 508 -------- drivers/gud/MobiCoreDriver/mci/mcinq.h | 86 -- drivers/gud/MobiCoreDriver/mci/mcloadformat.h | 134 --- drivers/gud/MobiCoreDriver/mcp.c | 1067 ----------------- drivers/gud/MobiCoreDriver/mcp.h | 121 -- drivers/gud/MobiCoreDriver/mmu.c | 450 ------- drivers/gud/MobiCoreDriver/mmu.h | 44 - drivers/gud/MobiCoreDriver/platform.h | 150 --- drivers/gud/MobiCoreDriver/pm.c | 62 - drivers/gud/MobiCoreDriver/pm.h | 36 - drivers/gud/MobiCoreDriver/public/mc_admin.h | 80 -- drivers/gud/MobiCoreDriver/public/mc_linux.h | 170 --- .../gud/MobiCoreDriver/public/mc_linux_api.h | 28 - .../public/mobicore_driver_api.h | 450 ------- drivers/gud/MobiCoreDriver/scheduler.c | 231 ---- drivers/gud/MobiCoreDriver/scheduler.h | 25 - drivers/gud/MobiCoreDriver/session.c | 779 ------------ drivers/gud/MobiCoreDriver/session.h | 63 - drivers/gud/setupDrivers.sh | 19 - 43 files changed, 9380 deletions(-) delete mode 100644 drivers/gud/Kconfig delete mode 100644 drivers/gud/Makefile delete mode 100644 drivers/gud/MobiCoreDriver/Makefile delete mode 100644 drivers/gud/MobiCoreDriver/admin.c delete mode 100644 drivers/gud/MobiCoreDriver/admin.h delete mode 100644 drivers/gud/MobiCoreDriver/api.c delete mode 100644 drivers/gud/MobiCoreDriver/api.h delete mode 100644 drivers/gud/MobiCoreDriver/arm.h delete mode 100644 drivers/gud/MobiCoreDriver/build_tag.h delete mode 100644 drivers/gud/MobiCoreDriver/client.c delete mode 100644 drivers/gud/MobiCoreDriver/client.h delete mode 100644 drivers/gud/MobiCoreDriver/clientlib.c delete mode 100644 drivers/gud/MobiCoreDriver/clock.c delete mode 100644 drivers/gud/MobiCoreDriver/clock.h delete mode 100644 drivers/gud/MobiCoreDriver/debug.h delete mode 100644 drivers/gud/MobiCoreDriver/fastcall.c delete mode 100644 drivers/gud/MobiCoreDriver/fastcall.h delete mode 100644 drivers/gud/MobiCoreDriver/logging.c delete mode 100644 drivers/gud/MobiCoreDriver/logging.h delete mode 100644 drivers/gud/MobiCoreDriver/main.c delete mode 100644 drivers/gud/MobiCoreDriver/main.h delete mode 100644 drivers/gud/MobiCoreDriver/mci/mcifc.h delete mode 100644 drivers/gud/MobiCoreDriver/mci/mcimcp.h delete mode 100644 drivers/gud/MobiCoreDriver/mci/mcinq.h delete mode 100644 drivers/gud/MobiCoreDriver/mci/mcloadformat.h delete mode 100644 drivers/gud/MobiCoreDriver/mcp.c delete mode 100644 drivers/gud/MobiCoreDriver/mcp.h delete mode 100644 drivers/gud/MobiCoreDriver/mmu.c delete mode 100644 drivers/gud/MobiCoreDriver/mmu.h delete mode 100644 drivers/gud/MobiCoreDriver/platform.h delete mode 100644 drivers/gud/MobiCoreDriver/pm.c delete mode 100644 drivers/gud/MobiCoreDriver/pm.h delete mode 100644 drivers/gud/MobiCoreDriver/public/mc_admin.h delete mode 100644 drivers/gud/MobiCoreDriver/public/mc_linux.h delete mode 100644 drivers/gud/MobiCoreDriver/public/mc_linux_api.h delete mode 100644 drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h delete mode 100644 drivers/gud/MobiCoreDriver/scheduler.c delete mode 100644 drivers/gud/MobiCoreDriver/scheduler.h delete mode 100644 drivers/gud/MobiCoreDriver/session.c delete mode 100644 drivers/gud/MobiCoreDriver/session.h delete mode 100644 drivers/gud/setupDrivers.sh diff --git a/drivers/Kconfig b/drivers/Kconfig index fcff64188dd03..351d9100e93df 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -198,6 +198,4 @@ source "drivers/firmware/Kconfig" source "drivers/bif/Kconfig" -source "drivers/gud/Kconfig" - endmenu diff --git a/drivers/Makefile b/drivers/Makefile index ffbf12cf9f43d..e3352f1e48385 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -170,6 +170,3 @@ obj-$(CONFIG_ESOC) += esoc/ obj-$(CONFIG_BIF) += bif/ obj-$(CONFIG_SENSORS_SSC) += sensors/ - -# -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "mci/mcloadformat.h" - -#include "main.h" -#include "debug.h" -#include "mmu.h" /* For load_check and load_token */ -#include "mcp.h" -#include "client.h" -#include "api.h" -#include "admin.h" - -/* We need 2 devices for admin and user interface*/ -#define MC_DEV_MAX 2 - -static struct admin_ctx { - struct device *dev; - atomic_t daemon_counter; - /* Define a MobiCore device structure for use with dev_debug() etc */ - struct device_driver mc_dev_name; - dev_t mc_dev_admin; - struct cdev mc_admin_cdev; - int (*tee_start_cb)(void); -} g_admin_ctx; - -static struct mc_admin_driver_request { - /* Global */ - struct mutex mutex; /* Protects access to this struct */ - struct mutex states_mutex; /* Protect access to the states */ - enum client_state { - IDLE, - REQUEST_SENT, - BUFFERS_READY, - } client_state; - enum server_state { - NOT_CONNECTED, /* Device not open */ - READY, /* Waiting for requests */ - REQUEST_RECEIVED, /* Got a request, is working */ - RESPONSE_SENT, /* Has sent a response header */ - DATA_SENT, /* Blocked until data is consumed */ - } server_state; - /* Request */ - uint32_t request_id; - struct mc_admin_request request; - struct completion client_complete; - /* Response */ - struct mc_admin_response response; - struct completion server_complete; - void *buffer; /* Reception buffer (pre-allocated) */ - size_t size; /* Size of the reception buffer */ -} g_request; - -static struct tbase_object *tbase_object_alloc(bool is_sp_trustlet, - size_t length) -{ - struct tbase_object *obj; - size_t size = sizeof(*obj) + length; - size_t header_length = 0; - - /* Determine required size */ - if (is_sp_trustlet) { - /* Need space for lengths info and containers */ - header_length = sizeof(struct mc_blob_len_info); - size += header_length + 3 * MAX_SO_CONT_SIZE; - } - - /* Allocate memory */ - obj = vzalloc(size); - if (!obj) - return NULL; - - /* A non-zero header_length indicates that we have a SP trustlet */ - obj->header_length = header_length; - obj->length = length; - return obj; -} - -void tbase_object_free(struct tbase_object *robj) -{ - vfree(robj); -} - -static inline void client_state_change(enum client_state state) -{ - mutex_lock(&g_request.states_mutex); - g_request.client_state = state; - mutex_unlock(&g_request.states_mutex); -} - -static inline bool client_state_is(enum client_state state) -{ - bool is; - - mutex_lock(&g_request.states_mutex); - is = g_request.client_state == state; - mutex_unlock(&g_request.states_mutex); - return is; -} - -static inline void server_state_change(enum server_state state) -{ - mutex_lock(&g_request.states_mutex); - g_request.server_state = state; - mutex_unlock(&g_request.states_mutex); -} - -static inline bool server_state_is(enum server_state state) -{ - bool is; - - mutex_lock(&g_request.states_mutex); - is = g_request.server_state == state; - mutex_unlock(&g_request.states_mutex); - return is; -} - -static void request_cancel(void); - -static int request_send(uint32_t command, const struct mc_uuid_t *uuid, - uint32_t is_gp, uint32_t spid) -{ - struct device *dev = g_admin_ctx.dev; - int counter = 10; - int ret; - - /* Prepare request */ - mutex_lock(&g_request.states_mutex); - /* Wait a little for daemon to connect */ - while ((g_request.server_state == NOT_CONNECTED) && counter--) { - mutex_unlock(&g_request.states_mutex); - ssleep(1); - mutex_lock(&g_request.states_mutex); - } - - BUG_ON(g_request.client_state != IDLE); - if (g_request.server_state != READY) { - mutex_unlock(&g_request.states_mutex); - if (g_request.server_state != NOT_CONNECTED) { - /* TODO: can we recover? */ - dev_err(dev, "%s: invalid daemon state %d\n", __func__, - g_request.server_state); - ret = -EPROTO; - goto end; - } else { - dev_err(dev, "%s: daemon not connected\n", __func__); - ret = -ENOTCONN; - goto end; - } - } - - memset(&g_request.request, 0, sizeof(g_request.request)); - memset(&g_request.response, 0, sizeof(g_request.response)); - g_request.request.request_id = g_request.request_id++; - g_request.request.command = command; - if (uuid) - memcpy(&g_request.request.uuid, uuid, sizeof(*uuid)); - else - memset(&g_request.request.uuid, 0, sizeof(*uuid)); - - g_request.request.is_gp = is_gp; - g_request.request.spid = spid; - g_request.client_state = REQUEST_SENT; - mutex_unlock(&g_request.states_mutex); - - /* Send request */ - complete(&g_request.client_complete); - - /* Wait for header (could be interruptible, but then needs more work) */ - wait_for_completion(&g_request.server_complete); - - /* Server should be waiting with some data for us */ - mutex_lock(&g_request.states_mutex); - switch (g_request.server_state) { - case NOT_CONNECTED: - /* Daemon gone */ - ret = -EPIPE; - break; - case READY: - /* No data to come, likely an error */ - ret = -g_request.response.error_no; - break; - case RESPONSE_SENT: - case DATA_SENT: - /* Normal case, data to come */ - ret = 0; - break; - default: - /* Should not happen as complete means the state changed */ - dev_err(dev, "%s: daemon is in a bad state: %d\n", __func__, - g_request.server_state); - ret = -EPIPE; - break; - } - - mutex_unlock(&g_request.states_mutex); - -end: - if (ret) - request_cancel(); - - return ret; -} - -static int request_receive(void *address, uint32_t size) -{ - /* - * At this point we have received the header and prepared some buffers - * to receive data that we know are coming from the server. - */ - - /* Check server state */ - bool server_ok; - - mutex_lock(&g_request.states_mutex); - server_ok = (g_request.server_state == RESPONSE_SENT) || - (g_request.server_state == DATA_SENT); - mutex_unlock(&g_request.states_mutex); - if (!server_ok) { - /* TODO: can we recover? */ - request_cancel(); - return -EPIPE; - } - - /* Setup reception buffer */ - g_request.buffer = address; - g_request.size = size; - client_state_change(BUFFERS_READY); - - /* Unlock write of data */ - complete(&g_request.client_complete); - - /* Wait for data (far too late to be interruptible) */ - wait_for_completion(&g_request.server_complete); - - /* Reset reception buffer */ - g_request.buffer = NULL; - g_request.size = 0; - - /* Return to idle state */ - client_state_change(IDLE); - return 0; -} - -/* Must be called instead of request_receive() to cancel a pending request */ -static void request_cancel(void) -{ - /* Unlock write of data */ - mutex_lock(&g_request.states_mutex); - if (g_request.server_state == DATA_SENT) - complete(&g_request.client_complete); - - /* Return to idle state */ - g_request.client_state = IDLE; - mutex_unlock(&g_request.states_mutex); -} - -static int admin_get_root_container(void *address) -{ - struct device *dev = g_admin_ctx.dev; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_ROOT_CONTAINER, 0, 0, 0); - if (ret) - goto end; - - /* Check length against max */ - if (g_request.response.length >= MAX_SO_CONT_SIZE) { - request_cancel(); - dev_err(dev, "%s: response length exceeds maximum\n", __func__); - ret = EREMOTEIO; - goto end; - } - - /* Get data */ - ret = request_receive(address, g_request.response.length); - if (!ret) - ret = g_request.response.length; - -end: - mutex_unlock(&g_request.mutex); - return ret; -} - -static int admin_get_sp_container(void *address, uint32_t spid) -{ - struct device *dev = g_admin_ctx.dev; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_SP_CONTAINER, 0, 0, spid); - if (ret) - goto end; - - /* Check length against max */ - if (g_request.response.length >= MAX_SO_CONT_SIZE) { - request_cancel(); - dev_err(dev, "%s: response length exceeds maximum\n", __func__); - ret = EREMOTEIO; - goto end; - } - - /* Get data */ - ret = request_receive(address, g_request.response.length); - if (!ret) - ret = g_request.response.length; - -end: - mutex_unlock(&g_request.mutex); - return ret; -} - -static int admin_get_trustlet_container(void *address, - const struct mc_uuid_t *uuid, - uint32_t spid) -{ - struct device *dev = g_admin_ctx.dev; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_TRUSTLET_CONTAINER, uuid, 0, spid); - if (ret) - goto end; - - /* Check length against max */ - if (g_request.response.length >= MAX_SO_CONT_SIZE) { - request_cancel(); - dev_err(dev, "%s: response length exceeds maximum\n", __func__); - ret = EREMOTEIO; - goto end; - } - - /* Get data */ - ret = request_receive(address, g_request.response.length); - if (!ret) - ret = g_request.response.length; - -end: - mutex_unlock(&g_request.mutex); - return ret; -} - -static struct tbase_object *admin_get_trustlet(const struct mc_uuid_t *uuid, - uint32_t is_gp, uint32_t *spid) -{ - struct tbase_object *obj = NULL; - bool is_sp_tl; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_TRUSTLET, uuid, is_gp, 0); - if (ret) - goto end; - - /* Allocate memory */ - is_sp_tl = g_request.response.service_type == SERVICE_TYPE_SP_TRUSTLET; - obj = tbase_object_alloc(is_sp_tl, g_request.response.length); - if (!obj) { - request_cancel(); - ret = -ENOMEM; - goto end; - } - - /* Get data */ - ret = request_receive(&obj->data[obj->header_length], obj->length); - *spid = g_request.response.spid; - -end: - mutex_unlock(&g_request.mutex); - if (ret) - return ERR_PTR(ret); - - return obj; -} - -static void mc_admin_sendcrashdump(void) -{ - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_SIGNAL_CRASH, NULL, false, 0); - if (ret) - goto end; - - /* Done */ - request_cancel(); - -end: - mutex_unlock(&g_request.mutex); -} - -static int tbase_object_make(uint32_t spid, struct tbase_object *obj) -{ - struct mc_blob_len_info *l_info = (struct mc_blob_len_info *)obj->data; - uint8_t *address = &obj->data[obj->header_length + obj->length]; - struct mclf_header_v2 *thdr; - int ret; - - /* Get root container */ - ret = admin_get_root_container(address); - if (ret < 0) - goto err; - - l_info->root_size = ret; - address += ret; - - /* Get SP container */ - ret = admin_get_sp_container(address, spid); - if (ret < 0) - goto err; - - l_info->sp_size = ret; - address += ret; - - /* Get trustlet container */ - thdr = (struct mclf_header_v2 *)&obj->data[obj->header_length]; - ret = admin_get_trustlet_container(address, &thdr->uuid, spid); - if (ret < 0) - goto err; - - l_info->ta_size = ret; - address += ret; - - /* Setup lengths information */ - l_info->magic = MC_TLBLOBLEN_MAGIC; - obj->length += sizeof(*l_info); - obj->length += l_info->root_size + l_info->sp_size + l_info->ta_size; - ret = 0; - -err: - return ret; -} - -struct tbase_object *tbase_object_read(uint32_t spid, uintptr_t address, - size_t length) -{ - struct device *dev = g_admin_ctx.dev; - char __user *addr = (char __user *)address; - struct tbase_object *obj; - uint8_t *data; - struct mclf_header_v2 thdr; - int ret; - - /* Check length */ - if (length < sizeof(thdr)) { - dev_err(dev, "%s: buffer shorter than header size\n", __func__); - return ERR_PTR(-EFAULT); - } - - /* Read header */ - if (copy_from_user(&thdr, addr, sizeof(thdr))) { - dev_err(dev, "%s: header: copy_from_user failed\n", __func__); - return ERR_PTR(-EFAULT); - } - - /* Allocate memory */ - obj = tbase_object_alloc(thdr.service_type == SERVICE_TYPE_SP_TRUSTLET, - length); - if (!obj) - return ERR_PTR(-ENOMEM); - - /* Copy header */ - data = &obj->data[obj->header_length]; - memcpy(data, &thdr, sizeof(thdr)); - /* Copy the rest of the data */ - data += sizeof(thdr); - if (copy_from_user(data, &addr[sizeof(thdr)], length - sizeof(thdr))) { - dev_err(dev, "%s: data: copy_from_user failed\n", __func__); - vfree(obj); - return ERR_PTR(-EFAULT); - } - - if (obj->header_length) { - ret = tbase_object_make(spid, obj); - if (ret) { - vfree(obj); - return ERR_PTR(ret); - } - } - - return obj; -} - -struct tbase_object *tbase_object_select(const struct mc_uuid_t *uuid) -{ - struct tbase_object *obj; - struct mclf_header_v2 *thdr; - - obj = tbase_object_alloc(false, sizeof(*thdr)); - if (!obj) - return ERR_PTR(-ENOMEM); - - thdr = (struct mclf_header_v2 *)&obj->data[obj->header_length]; - memcpy(&thdr->uuid, uuid, sizeof(thdr->uuid)); - return obj; -} - -struct tbase_object *tbase_object_get(const struct mc_uuid_t *uuid, - uint32_t is_gp_uuid) -{ - struct tbase_object *obj; - uint32_t spid = 0; - - /* admin_get_trustlet creates the right object based on service type */ - obj = admin_get_trustlet(uuid, is_gp_uuid, &spid); - if (IS_ERR(obj)) - return obj; - - /* SP trustlet: create full secure object with all containers */ - if (obj->header_length) { - int ret; - - /* Do not return EINVAL in this case as SPID was not found */ - if (!spid) { - vfree(obj); - return ERR_PTR(-ENOENT); - } - - ret = tbase_object_make(spid, obj); - if (ret) { - vfree(obj); - return ERR_PTR(ret); - } - } - - return obj; -} - -static inline int load_driver(struct tbase_client *client, - struct mc_admin_load_info *info) -{ - struct tbase_object *obj; - struct mclf_header_v2 *thdr; - struct mc_identity identity = { - .login_type = TEEC_LOGIN_PUBLIC, - }; - uintptr_t dci = 0; - uint32_t dci_len = 0; - uint32_t sid; - int ret; - - obj = tbase_object_read(info->spid, info->address, info->length); - if (IS_ERR(obj)) - return PTR_ERR(obj); - - thdr = (struct mclf_header_v2 *)&obj->data[obj->header_length]; - if (!(thdr->flags & MC_SERVICE_HEADER_FLAGS_NO_CONTROL_INTERFACE)) { - /* - * The driver requires a DCI, although we won't be able to use - * it to communicate. - */ - dci_len = PAGE_SIZE; - ret = api_malloc_cbuf(client, dci_len, &dci, NULL); - if (ret) - goto end; - } - - /* Open session */ - ret = client_add_session(client, obj, dci, dci_len, &sid, false, - &identity); - if (ret) - api_free_cbuf(client, dci); - else - dev_dbg(g_admin_ctx.dev, "driver loaded with sid %x", sid); - -end: - vfree(obj); - return ret; -} - -static inline int load_token(struct mc_admin_load_info *token) -{ - struct tbase_mmu *mmu; - struct mcp_buffer_map map; - int ret; - - mmu = tbase_mmu_create(current, (void *)(uintptr_t)token->address, - token->length); - if (IS_ERR(mmu)) - return PTR_ERR(mmu); - - tbase_mmu_buffer(mmu, &map); - ret = mcp_load_token(token->address, &map); - tbase_mmu_delete(mmu); - return ret; -} - -static inline int load_check(struct mc_admin_load_info *info) -{ - struct tbase_object *obj; - struct tbase_mmu *mmu; - struct mcp_buffer_map map; - int ret; - - obj = tbase_object_read(info->spid, info->address, info->length); - if (IS_ERR(obj)) - return PTR_ERR(obj); - - mmu = tbase_mmu_create(NULL, obj->data, obj->length); - if (IS_ERR(mmu)) - return PTR_ERR(mmu); - - tbase_mmu_buffer(mmu, &map); - ret = mcp_load_check(obj, &map); - tbase_mmu_delete(mmu); - return ret; -} - -static ssize_t admin_write(struct file *file, const char __user *user, - size_t len, loff_t *off) -{ - int ret; - - /* No offset allowed [yet] */ - if (*off) { - g_request.response.error_no = EPIPE; - ret = -ECOMM; - goto err; - } - - if (server_state_is(REQUEST_RECEIVED)) { - /* Check client state */ - if (!client_state_is(REQUEST_SENT)) { - g_request.response.error_no = EPIPE; - ret = -EPIPE; - goto err; - } - - /* Receive response header */ - if (copy_from_user(&g_request.response, user, - sizeof(g_request.response))) { - g_request.response.error_no = EPIPE; - ret = -ECOMM; - goto err; - } - - /* Check request ID */ - if (g_request.request.request_id != - g_request.response.request_id) { - g_request.response.error_no = EPIPE; - ret = -EBADE; - goto err; - } - - /* Response header is acceptable */ - ret = sizeof(g_request.response); - if (g_request.response.length) - server_state_change(RESPONSE_SENT); - else - server_state_change(READY); - - goto end; - } else if (server_state_is(RESPONSE_SENT)) { - /* Server is waiting */ - server_state_change(DATA_SENT); - - /* Get data */ - ret = wait_for_completion_interruptible( - &g_request.client_complete); - - /* Server received a signal, let see if it tries again */ - if (ret) { - server_state_change(RESPONSE_SENT); - return ret; - } - - /* Check client state */ - if (!client_state_is(BUFFERS_READY)) { - g_request.response.error_no = EPIPE; - ret = -EPIPE; - goto err; - } - - /* TODO deal with several writes */ - if (len != g_request.size) - len = g_request.size; - - ret = copy_from_user(g_request.buffer, user, len); - if (ret) { - g_request.response.error_no = EPIPE; - ret = -ECOMM; - goto err; - } - - ret = len; - server_state_change(READY); - goto end; - } else { - ret = -ECOMM; - goto err; - } - -err: - server_state_change(READY); -end: - complete(&g_request.server_complete); - return ret; -} - -static long admin_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct tbase_client *client = file->private_data; - void __user *uarg = (void __user *)arg; - int ret = -EINVAL; - - MCDRV_DBG("%u from %s", _IOC_NR(cmd), current->comm); - - if (WARN(!client, "No client data available")) - return -EFAULT; - - switch (cmd) { - case MC_ADMIN_IO_GET_DRIVER_REQUEST: { - /* Block until a request is available */ - ret = wait_for_completion_interruptible( - &g_request.client_complete); - if (ret) - /* Interrupted by signal */ - break; - - /* Check client state */ - if (!client_state_is(REQUEST_SENT)) { - g_request.response.error_no = EPIPE; - complete(&g_request.server_complete); - ret = -EPIPE; - break; - } - - /* Send request (the driver request mutex is held) */ - ret = copy_to_user(uarg, &g_request.request, - sizeof(g_request.request)); - if (ret) { - server_state_change(READY); - complete(&g_request.server_complete); - ret = -EPROTO; - break; - } - - server_state_change(REQUEST_RECEIVED); - break; - } - case MC_ADMIN_IO_GET_INFO: { - struct mc_admin_driver_info info; - - info.drv_version = MC_VERSION(MCDRVMODULEAPI_VERSION_MAJOR, - MCDRVMODULEAPI_VERSION_MINOR); - info.initial_cmd_id = g_request.request_id; - ret = copy_to_user(uarg, &info, sizeof(info)); - break; - } - case MC_ADMIN_IO_LOAD_DRIVER: { - struct mc_admin_load_info info; - - ret = copy_from_user(&info, uarg, sizeof(info)); - if (ret) - ret = -EFAULT; - else - ret = load_driver(client, &info); - - break; - } - case MC_ADMIN_IO_LOAD_TOKEN: { - struct mc_admin_load_info info; - - ret = copy_from_user(&info, uarg, sizeof(info)); - if (ret) - ret = -EFAULT; - else - ret = load_token(&info); - - break; - } - case MC_ADMIN_IO_LOAD_CHECK: { - struct mc_admin_load_info info; - - ret = copy_from_user(&info, uarg, sizeof(info)); - if (ret) - ret = -EFAULT; - else - ret = load_check(&info); - - break; - } - default: - ret = -ENOIOCTLCMD; - } - - return ret; -} - -/* - * mc_fd_release() - This function will be called from user space as close(...) - * The client data are freed and the associated memory pages are unreserved. - * - * @inode - * @file - * - * Returns 0 - */ -static int admin_release(struct inode *inode, struct file *file) -{ - struct tbase_client *client = file->private_data; - struct device *dev = g_admin_ctx.dev; - - if (!client) - return -EPROTO; - - api_close_device(client); - file->private_data = NULL; - - /* Requests from driver to daemon */ - mutex_lock(&g_request.states_mutex); - dev_warn(dev, "%s: daemon disconnected\n", __func__); - g_request.server_state = NOT_CONNECTED; - /* A non-zero command indicates that a thread is waiting */ - if (g_request.client_state != IDLE) { - g_request.response.error_no = ESHUTDOWN; - complete(&g_request.server_complete); - } - - mutex_unlock(&g_request.states_mutex); - atomic_set(&g_admin_ctx.daemon_counter, 0); - /* - * ret is quite irrelevant here as most apps don't care about the - * return value from close() and it's quite difficult to recover - */ - return 0; -} - -static int admin_open(struct inode *inode, struct file *file) -{ - struct device *dev = g_admin_ctx.dev; - struct tbase_client *client; - int err; - - /* - * If the daemon is already set we can't allow anybody else to open - * the admin interface. - */ - if (atomic_cmpxchg(&g_admin_ctx.daemon_counter, 0, 1) != 0) { - MCDRV_ERROR("Daemon is already connected"); - return -EPROTO; - } - - /* Any value will do */ - g_request.request_id = 42; - - /* Setup the usual variables */ - MCDRV_DBG("accept %s as tbase daemon", current->comm); - - /* - * daemon is connected so now we can safely suppose - * the secure world is loaded too - */ - if (!IS_ERR_OR_NULL(g_admin_ctx.tee_start_cb)) - g_admin_ctx.tee_start_cb = ERR_PTR(g_admin_ctx.tee_start_cb()); - if (IS_ERR(g_admin_ctx.tee_start_cb)) { - MCDRV_ERROR("Failed initializing the SW"); - err = PTR_ERR(g_admin_ctx.tee_start_cb); - goto fail_connection; -} - - /* Create client */ - client = api_open_device(true); - if (!client) { - err = -ENOMEM; - goto fail_connection; - } - - /* Store client in user file */ - file->private_data = client; - - /* Requests from driver to daemon */ - server_state_change(READY); - dev_info(dev, "%s: daemon connected\n", __func__); - - return 0; - -fail_connection: - atomic_set(&g_admin_ctx.daemon_counter, 0); - return err; -} - -/* function table structure of this device driver. */ -static const struct file_operations mc_admin_fops = { - .owner = THIS_MODULE, - .open = admin_open, - .release = admin_release, - .unlocked_ioctl = admin_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = admin_ioctl, -#endif - .write = admin_write, -}; - -int mc_admin_init(struct class *mc_device_class, dev_t *out_dev, - int (*tee_start_cb)(void)) -{ - int err = 0; - - if (!out_dev || !mc_device_class) - return -EINVAL; - - atomic_set(&g_admin_ctx.daemon_counter, 0); - - /* Requests from driver to daemon */ - mutex_init(&g_request.mutex); - mutex_init(&g_request.states_mutex); - init_completion(&g_request.client_complete); - init_completion(&g_request.server_complete); - mcp_register_crashhandler(mc_admin_sendcrashdump); - - /* Create char device */ - cdev_init(&g_admin_ctx.mc_admin_cdev, &mc_admin_fops); - err = alloc_chrdev_region(&g_admin_ctx.mc_dev_admin, 0, MC_DEV_MAX, - "trustonic_tee"); - if (err < 0) { - MCDRV_ERROR("failed to allocate char dev region"); - goto fail_alloc_chrdev_region; - } - - err = cdev_add(&g_admin_ctx.mc_admin_cdev, g_admin_ctx.mc_dev_admin, 1); - if (err) { - MCDRV_ERROR("admin device register failed"); - goto fail_cdev_add; - } - - g_admin_ctx.mc_admin_cdev.owner = THIS_MODULE; - g_admin_ctx.dev = device_create(mc_device_class, NULL, - g_admin_ctx.mc_dev_admin, NULL, - MC_ADMIN_DEVNODE); - if (IS_ERR(g_admin_ctx.dev)) { - err = PTR_ERR(g_admin_ctx.dev); - goto fail_dev_create; - } - - g_admin_ctx.mc_dev_name.name = "driver = &g_admin_ctx.mc_dev_name; - *out_dev = g_admin_ctx.mc_dev_admin; - - /* Register the call back for starting the secure world */ - g_admin_ctx.tee_start_cb = tee_start_cb; - - MCDRV_DBG("done"); - return 0; - -fail_dev_create: - cdev_del(&g_admin_ctx.mc_admin_cdev); - -fail_cdev_add: - unregister_chrdev_region(g_admin_ctx.mc_dev_admin, MC_DEV_MAX); - -fail_alloc_chrdev_region: - MCDRV_ERROR("fail with %d", err); - return err; -} - -void mc_admin_exit(struct class *mc_device_class) -{ - device_destroy(mc_device_class, g_admin_ctx.mc_dev_admin); - cdev_del(&g_admin_ctx.mc_admin_cdev); - unregister_chrdev_region(g_admin_ctx.mc_dev_admin, MC_DEV_MAX); - /* Requests from driver to daemon */ - mutex_destroy(&g_request.states_mutex); - MCDRV_DBG("done"); -} diff --git a/drivers/gud/MobiCoreDriver/admin.h b/drivers/gud/MobiCoreDriver/admin.h deleted file mode 100644 index 5a78d943752da..0000000000000 --- a/drivers/gud/MobiCoreDriver/admin.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef ADMIN_FD_H_ -#define ADMIN_FD_H_ - -struct mc_uuid_t; -struct tbase_object; - -int mc_admin_init(struct class *mc_device_class, dev_t *out_dev, - int (*tee_start_cb)(void)); -void mc_admin_exit(struct class *mc_device_class); - -struct tbase_object *tbase_object_select(const struct mc_uuid_t *uuid); -struct tbase_object *tbase_object_get(const struct mc_uuid_t *uuid, - uint32_t is_gp_uuid); -struct tbase_object *tbase_object_read(uint32_t spid, uintptr_t address, - size_t length); -void tbase_object_free(struct tbase_object *out_robj); - -#endif /* ADMIN_FD_H_ */ diff --git a/drivers/gud/MobiCoreDriver/api.c b/drivers/gud/MobiCoreDriver/api.c deleted file mode 100644 index 0d2abaf617aea..0000000000000 --- a/drivers/gud/MobiCoreDriver/api.c +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include - -#include /* MC_MAP_MAX */ -#include "main.h" -#include "debug.h" -#include "mcp.h" -#include "admin.h" -#include "session.h" -#include "client.h" -#include "api.h" - -static struct api_ctx { - struct mutex clients_lock; /* Clients list + temp notifs */ - struct list_head clients; /* List of user-space clients */ -} api_ctx; - -/* - * Initialize a new tbase client object - * @return client pointer or NULL if no allocation was possible. - */ -struct tbase_client *api_open_device(bool is_from_kernel) -{ - struct tbase_client *client; - - /* Allocate and init client object */ - client = client_create(is_from_kernel); - if (!client) { - MCDRV_ERROR("Could not create client"); - return NULL; - } - - /* Add client to list of clients */ - mutex_lock(&api_ctx.clients_lock); - list_add_tail(&client->list, &api_ctx.clients); - mutex_unlock(&api_ctx.clients_lock); - - MCDRV_DBG("created client %p", client); - return client; -} - -/* - * Try and mark client as "closing" - * @return tbase driver error code - */ -int api_freeze_device(struct tbase_client *client) -{ - int err = 0; - - if (!client_set_closing(client)) - err = -ENOTEMPTY; - - MCDRV_DBG("client %p, exit with %d\n", client, err); - return err; -} - -/* - * Release a client and the session+cbuf objects it contains. - * @param client_t client - * @return tbase driver error code - */ -void api_close_device(struct tbase_client *client) -{ - /* Remove client from list of active clients */ - mutex_lock(&api_ctx.clients_lock); - list_del(&client->list); - mutex_unlock(&api_ctx.clients_lock); - /* Close all remaining sessions */ - client_close_sessions(client); - client_put(client); - MCDRV_DBG("client %p closed\n", client); -} - -/* - * Open TA for given client. TA binary is provided by the daemon. - * @param - * @return tbase driver error code - */ -int api_open_session(struct tbase_client *client, - uint32_t *p_session_id, - const struct mc_uuid_t *uuid, - uintptr_t tci, - size_t tci_len, - bool is_gp_uuid, - struct mc_identity *identity) -{ - int err = 0; - uint32_t sid = 0; - struct tbase_object *obj; - - /* Check parameters */ - if (!p_session_id) - return -EINVAL; - - if (!uuid) - return -EINVAL; - - /* Get secure object */ - obj = tbase_object_get(uuid, is_gp_uuid); - if (IS_ERR(obj)) { - /* Try to select secure object inside the SWd if not found */ - if ((PTR_ERR(obj) == -ENOENT) && g_ctx.f_ta_auth) - obj = tbase_object_select(uuid); - - if (IS_ERR(obj)) { - err = PTR_ERR(obj); - goto end; - } - } - - /* Open session */ - err = client_add_session(client, obj, tci, tci_len, &sid, is_gp_uuid, - identity); - /* Fill in return parameter */ - if (!err) - *p_session_id = sid; - - /* Delete secure object */ - tbase_object_free(obj); - -end: - - MCDRV_DBG("session %x, exit with %d\n", sid, err); - return err; -} - -/* - * Open TA for given client. TA binary is provided by the client. - * @param - * @return tbase driver error code - */ -int api_open_trustlet(struct tbase_client *client, - uint32_t *p_session_id, - uint32_t spid, - uintptr_t trustlet, - size_t trustlet_len, - uintptr_t tci, - size_t tci_len) -{ - struct tbase_object *obj; - struct mc_identity identity = { - .login_type = TEEC_LOGIN_PUBLIC, - }; - uint32_t sid = 0; - int err = 0; - - /* Check parameters */ - if (!p_session_id) - return -EINVAL; - - /* Create secure object from user-space trustlet binary */ - obj = tbase_object_read(spid, trustlet, trustlet_len); - if (IS_ERR(obj)) { - err = PTR_ERR(obj); - goto end; - } - - /* Open session */ - err = client_add_session(client, obj, tci, tci_len, &sid, false, - &identity); - /* Fill in return parameter */ - if (!err) - *p_session_id = sid; - - /* Delete secure object */ - tbase_object_free(obj); - -end: - MCDRV_DBG("session %x, exit with %d\n", sid, err); - return err; -} - -/* - * Close a TA - * @param - * @return tbase driver error code - */ -int api_close_session(struct tbase_client *client, uint32_t session_id) -{ - int ret = client_remove_session(client, session_id); - - MCDRV_DBG("session %x, exit with %d\n", session_id, ret); - return ret; -} - -/* - * Send a notification to TA - * @return tbase driver error code - */ -int api_notify(struct tbase_client *client, uint32_t session_id) -{ - int err = 0; - struct tbase_session *session = NULL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - /* Send command to SWd */ - if (!session) { - err = -ENXIO; - } else { - err = session_notify_swd(session); - - /* Release session */ - client_unref_session(session); - } - - MCDRV_DBG("session %x, exit with %d\n", session_id, err); - return err; -} - -/* - * Wait for a notification from TA - * @return tbase driver error code - */ -int api_wait_notification(struct tbase_client *client, - uint32_t session_id, - int32_t timeout) -{ - int err = 0; - struct tbase_session *session = NULL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - /* Wait for notification */ - if (!session) { - err = -ENXIO; - } else { - err = session_waitnotif(session, timeout); - - /* Release session */ - client_unref_session(session); - } - - MCDRV_DBG("session %x, exit with %d\n", session_id, err); - return err; -} - -/* - * Allocate a contiguous buffer (cbuf) for given client - * - * @param client client - * @param len size of the cbuf - * @param **p_addr pointer to the cbuf kva - * @return tbase driver error code - */ -int api_malloc_cbuf(struct tbase_client *client, uint32_t len, - uintptr_t *addr, struct vm_area_struct *vmarea) -{ - int err = tbase_cbuf_alloc(client, len, addr, vmarea); - - MCDRV_DBG("exit with %d\n", err); - return err; -} - -/* - * Free a contiguous buffer from given client - * @param client - * @param addr kernel virtual address of the buffer - * - * @return tbase driver error code - */ -int api_free_cbuf(struct tbase_client *client, uintptr_t addr) -{ - int err = tbase_cbuf_free(client, addr); - - MCDRV_DBG("@ 0x%lx, exit with %d\n", addr, err); - return err; -} - -/* Share a buffer with given TA in SWd */ -int api_map_wsms(struct tbase_client *client, uint32_t session_id, - struct mc_ioctl_buffer *bufs) -{ - struct tbase_session *session = NULL; - int err = 0; - - if (!client) - return -EINVAL; - - if (!bufs) - return -EINVAL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - if (session) { - /* Add buffer to the session */ - err = session_wsms_add(session, bufs); - - /* Release session */ - client_unref_session(session); - } else { - err = -ENXIO; - } - - MCDRV_DBG("exit with %d\n", err); - return err; -} - -/* Stop sharing a buffer with SWd */ -int api_unmap_wsms(struct tbase_client *client, uint32_t session_id, - const struct mc_ioctl_buffer *bufs) -{ - struct tbase_session *session = NULL; - int err = 0; - - if (!client) - return -EINVAL; - - if (!bufs) - return -EINVAL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - if (!session) { - err = -ENXIO; - } else { - /* Remove buffer from session */ - err = session_wsms_remove(session, bufs); - /* Release session */ - client_unref_session(session); - } - - MCDRV_DBG("exit with %d\n", err); - return err; -} - -/* - * Read session exit/termination code - */ -int api_get_session_exitcode(struct tbase_client *client, uint32_t session_id, - int32_t *exit_code) -{ - int err = 0; - struct tbase_session *session; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - if (!session) { - err = -ENXIO; - } else { - /* Retrieve error */ - *exit_code = session_exitcode(session); - - /* Release session */ - client_unref_session(session); - - err = 0; - } - - MCDRV_DBG("session %x, exit with %d\n", session_id, err); - return err; -} - -void api_init(void) -{ - INIT_LIST_HEAD(&api_ctx.clients); - mutex_init(&api_ctx.clients_lock); - - INIT_LIST_HEAD(&g_ctx.closing_sess); - mutex_init(&g_ctx.closing_lock); -} - -int api_info(struct kasnprintf_buf *buf) -{ - struct tbase_client *client; - struct tbase_session *session; - ssize_t ret = 0; - - mutex_lock(&api_ctx.clients_lock); - if (list_empty(&api_ctx.clients)) - goto done; - - list_for_each_entry(client, &api_ctx.clients, list) { - ret = client_info(client, buf); - if (ret < 0) - break; - } - -done: - mutex_unlock(&api_ctx.clients_lock); - - if (ret >= 0) { - mutex_lock(&g_ctx.closing_lock); - if (!list_empty(&g_ctx.closing_sess)) - ret = kasnprintf(buf, "closing sessions:\n"); - - list_for_each_entry(session, &g_ctx.closing_sess, list) { - ret = session_info(session, buf); - if (ret < 0) - break; - } - - mutex_unlock(&g_ctx.closing_lock); - } - - return ret; -} diff --git a/drivers/gud/MobiCoreDriver/api.h b/drivers/gud/MobiCoreDriver/api.h deleted file mode 100644 index 740ec7fb2d5b9..0000000000000 --- a/drivers/gud/MobiCoreDriver/api.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _API_H_ -#define _API_H_ - -struct tbase_client; - -struct tbase_client *api_open_device(bool is_from_kernel); -int api_freeze_device(struct tbase_client *client); -void api_close_device(struct tbase_client *client); -int api_open_session(struct tbase_client *client, uint32_t *session_id, - const struct mc_uuid_t *uuid, - uintptr_t tci, size_t tci_len, bool is_gp_uuid, - struct mc_identity *identity); -int api_open_trustlet(struct tbase_client *client, uint32_t *session_id, - uint32_t spid, uintptr_t trustlet, size_t trustlet_len, - uintptr_t tci, size_t tci_len); -int api_close_session(struct tbase_client *client, uint32_t session_id); -int api_notify(struct tbase_client *client, uint32_t session_id); -int api_wait_notification(struct tbase_client *client, uint32_t session_id, - int32_t timeout); -int api_malloc_cbuf(struct tbase_client *client, uint32_t len, uintptr_t *addr, - struct vm_area_struct *vmarea); -int api_free_cbuf(struct tbase_client *client, uintptr_t addr); -int api_map_wsms(struct tbase_client *client, uint32_t session_id, - struct mc_ioctl_buffer *bufs); -int api_unmap_wsms(struct tbase_client *client, uint32_t session_id, - const struct mc_ioctl_buffer *bufs); -int api_get_session_exitcode(struct tbase_client *client, uint32_t session_id, - int32_t *exit_code); -void api_init(void); -int api_info(struct kasnprintf_buf *buf); - -#endif /* _API_H_ */ diff --git a/drivers/gud/MobiCoreDriver/arm.h b/drivers/gud/MobiCoreDriver/arm.h deleted file mode 100644 index 58d91f11f789c..0000000000000 --- a/drivers/gud/MobiCoreDriver/arm.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MC_ARM_H_ -#define _MC_ARM_H_ - -#include "debug.h" - -#ifdef CONFIG_ARM64 -inline bool has_security_extensions(void) -{ - return true; -} - -inline bool is_secure_mode(void) -{ - return false; -} -#else -/* - * ARM Trustzone specific masks and modes - * Vanilla Linux is unaware of TrustZone extension. - * I.e. arch/arm/include/asm/ptrace.h does not define monitor mode. - * Also TZ bits in cpuid are not defined, ARM port uses magic numbers, - * see arch/arm/kernel/setup.c - */ -#define ARM_MONITOR_MODE (0x16) /*(0b10110)*/ -#define ARM_SECURITY_EXTENSION_MASK (0x30) - -/* check if CPU supports the ARM TrustZone Security Extensions */ -inline bool has_security_extensions(void) -{ - u32 fea = 0; - - asm volatile( - "mrc p15, 0, %[fea], cr0, cr1, 0" : - [fea]"=r" (fea)); - - MCDRV_DBG_VERBOSE("CPU Features: 0x%X", fea); - - /* - * If the CPU features ID has 0 for security features then the CPU - * doesn't support TrustZone at all! - */ - if ((fea & ARM_SECURITY_EXTENSION_MASK) == 0) - return false; - - return true; -} - -/* check if running in secure mode */ -inline bool is_secure_mode(void) -{ - u32 cpsr = 0; - u32 nsacr = 0; - - asm volatile( - "mrc p15, 0, %[nsacr], cr1, cr1, 2\n" - "mrs %[cpsr], cpsr\n" : - [nsacr]"=r" (nsacr), - [cpsr]"=r"(cpsr)); - - MCDRV_DBG_VERBOSE("CPRS.M = set to 0x%X\n", cpsr & MODE_MASK); - MCDRV_DBG_VERBOSE("SCR.NS = set to 0x%X\n", nsacr); - - /* - * If the NSACR contains the reset value(=0) then most likely we are - * running in Secure MODE. - * If the cpsr mode is set to monitor mode then we cannot load! - */ - if (nsacr == 0 || ((cpsr & MODE_MASK) == ARM_MONITOR_MODE)) - return true; - - return false; -} -#endif - -#endif /* _MC_ARM_H_ */ diff --git a/drivers/gud/MobiCoreDriver/build_tag.h b/drivers/gud/MobiCoreDriver/build_tag.h deleted file mode 100644 index 51a5d3e0ae7f5..0000000000000 --- a/drivers/gud/MobiCoreDriver/build_tag.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#define MOBICORE_COMPONENT_BUILD_TAG \ - "t-base-QC-MSM8996-Android-302B-V001-20150529_084320_16" diff --git a/drivers/gud/MobiCoreDriver/client.c b/drivers/gud/MobiCoreDriver/client.c deleted file mode 100644 index c8bdc07b8742d..0000000000000 --- a/drivers/gud/MobiCoreDriver/client.c +++ /dev/null @@ -1,572 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "main.h" -#include "debug.h" -#include "mcp.h" -#include "mmu.h" -#include "session.h" -#include "client.h" - -/* - * Contiguous buffer allocated to TLCs. - * These buffers are used as world shared memory (wsm) to share with - * secure world. - */ -struct tbase_cbuf { - /* Client this cbuf belongs to */ - struct tbase_client *client; - /* List element for client's list of cbuf's */ - struct list_head list; - /* Number of references kept to this buffer */ - struct kref kref; - /* virtual Kernel start address */ - uintptr_t addr; - /* virtual Userspace start address */ - uintptr_t uaddr; - /* physical start address */ - phys_addr_t phys; - /* 2^order = number of pages allocated */ - unsigned int order; - /* Length of memory mapped to user */ - uint32_t len; -}; - -/* - * Map a kernel contiguous buffer to user space - */ -static int map_cbuf(struct vm_area_struct *vmarea, uintptr_t addr, uint32_t len, - uintptr_t *uaddr) -{ - int ret; - - if (WARN(!uaddr, "No uaddr pointer available")) - return -EINVAL; - - if (WARN(!vmarea, "No vma available")) - return -EINVAL; - - if (WARN(!addr, "No addr available")) - return -EINVAL; - - if (len != (uint32_t)(vmarea->vm_end - vmarea->vm_start)) { - MCDRV_ERROR("cbuf incompatible with vma"); - return -EINVAL; - } - - vmarea->vm_flags |= VM_IO; - - /* CPI todo: use io_remap_page_range() to be consistent with VM_IO ? */ - ret = remap_pfn_range(vmarea, vmarea->vm_start, - page_to_pfn(virt_to_page(addr)), - vmarea->vm_end - vmarea->vm_start, - vmarea->vm_page_prot); - if (ret) { - *uaddr = 0; - MCDRV_ERROR("User mapping failed"); - return ret; - } - - *uaddr = vmarea->vm_start; - return 0; -} - -/* - * Allocate and initialize a client object - */ -struct tbase_client *client_create(bool is_from_kernel) -{ - struct tbase_client *client; - - /* allocate client structure */ - client = kzalloc(sizeof(*client), GFP_KERNEL); - if (!client) { - MCDRV_ERROR("Allocation failure"); - return NULL; - } - - /* init members */ - client->pid = is_from_kernel ? 0 : current->pid; - memcpy(client->comm, current->comm, sizeof(client->comm)); - kref_init(&client->kref); - INIT_LIST_HEAD(&client->cbufs); - mutex_init(&client->cbufs_lock); - INIT_LIST_HEAD(&client->sessions); - mutex_init(&client->sessions_lock); - INIT_LIST_HEAD(&client->list); - - return client; -} - -/* - * At this point, nobody has access to the client anymore, so no new sessions - * are coming. - */ -void client_close_sessions(struct tbase_client *client) -{ - struct tbase_session *session; - - mutex_lock(&client->sessions_lock); - while (!list_empty(&client->sessions)) { - session = list_first_entry(&client->sessions, - struct tbase_session, list); - - /* Move session to closing sessions list */ - mutex_lock(&g_ctx.closing_lock); - list_move(&session->list, &g_ctx.closing_sess); - mutex_unlock(&g_ctx.closing_lock); - /* Call session_close without lock */ - mutex_unlock(&client->sessions_lock); - session_close(session); - mutex_lock(&client->sessions_lock); - } - - mutex_unlock(&client->sessions_lock); -} - -/* - * Free client object + all objects it contains. - * Can be called only by last user referencing the client, - * therefore mutex lock seems overkill - */ -static void client_release(struct kref *kref) -{ - struct tbase_client *client; - - client = container_of(kref, struct tbase_client, kref); - kfree(client); -} - -void client_put(struct tbase_client *client) -{ - kref_put(&client->kref, client_release); -} - -/* - * Returns true if client is a kernel object. - */ -bool client_is_kernel(struct tbase_client *client) -{ - return !client->pid; -} - -/* - * Set client "closing" state, only if it contains no session. - * Once in "closing" state, system "close" can be called. - * Return: true if this state could be set. - */ -bool client_set_closing(struct tbase_client *client) -{ - bool clear = false; - - /* Check for sessions */ - mutex_lock(&client->sessions_lock); - clear = list_empty(&client->sessions); - client->closing = clear; - mutex_unlock(&client->sessions_lock); - MCDRV_DBG("return %d", clear); - return clear; -} - -/* - * Opens a TA and add corresponding session object to given client - * return: t-base driver error code - */ -int client_add_session(struct tbase_client *client, - const struct tbase_object *obj, uintptr_t tci, - size_t len, uint32_t *session_id, bool is_gp, - struct mc_identity *identity) -{ - struct tbase_session *session = NULL; - struct tbase_mmu *obj_mmu = NULL; - int ret = 0; - - /* - * Create session object with temp sid=0 BEFORE session is started, - * otherwise if a GP TA is started and NWd session object allocation - * fails, we cannot handle the potentially delayed GP closing. - * Adding session to list must be done AFTER it is started (once we have - * sid), therefore it cannot be done within session_create(). - */ - session = session_create(client, is_gp, identity); - if (IS_ERR(session)) - return PTR_ERR(session); - - /* Create blob L2 table (blob is allocated by driver, so task=NULL) */ - obj_mmu = tbase_mmu_create(NULL, obj->data, obj->length); - if (IS_ERR(obj_mmu)) { - ret = PTR_ERR(obj_mmu); - goto err; - } - - /* Open session */ - ret = session_open(session, obj, obj_mmu, tci, len); - /* Blob table no more needed in any case */ - tbase_mmu_delete(obj_mmu); - if (ret) - goto err; - - mutex_lock(&client->sessions_lock); - if (unlikely(client->closing)) { - /* Client has been frozen, no more sessions allowed */ - ret = -ENODEV; - } else { - /* Add session to client */ - list_add(&session->list, &client->sessions); - /* Set sid returned by SWd */ - *session_id = session->mcp_session.id; - } - - mutex_unlock(&client->sessions_lock); - -err: - /* Close or free session on error */ - if (ret == -ENODEV) { - /* The session must enter the closing process... */ - mutex_lock(&g_ctx.closing_lock); - list_add(&session->list, &g_ctx.closing_sess); - mutex_unlock(&g_ctx.closing_lock); - session_close(session); - } else if (ret) { - session_put(session); - } - - return ret; -} - -/* - * Remove a session object from client and close corresponding TA - * Return: true if session was found and closed - */ -int client_remove_session(struct tbase_client *client, uint32_t session_id) -{ - struct tbase_session *session = NULL, *candidate; - - /* Move session from main list to closing list */ - mutex_lock(&client->sessions_lock); - list_for_each_entry(candidate, &client->sessions, list) { - if (candidate->mcp_session.id == session_id) { - session = candidate; - mutex_lock(&g_ctx.closing_lock); - list_move(&session->list, &g_ctx.closing_sess); - mutex_unlock(&g_ctx.closing_lock); - break; - } - } - - mutex_unlock(&client->sessions_lock); - - /* Close session */ - return session_close(session); -} - -/* - * Find a session object and increment its reference counter. - * Object cannot be freed until its counter reaches 0. - * return: pointer to the object, NULL if not found. - */ -struct tbase_session *client_ref_session(struct tbase_client *client, - uint32_t session_id) -{ - struct tbase_session *session = NULL, *candidate; - - mutex_lock(&client->sessions_lock); - list_for_each_entry(candidate, &client->sessions, list) { - if (candidate->mcp_session.id == session_id) { - session = candidate; - session_get(session); - break; - } - } - - mutex_unlock(&client->sessions_lock); - return session; -} - -/* - * Decrement a session object's reference counter, and frees the object if it - * was the last reference. - * No lookup since session may have been removed from list - */ -void client_unref_session(struct tbase_session *session) -{ - session_put(session); -} - -static inline int cbuf_info(struct tbase_cbuf *cbuf, - struct kasnprintf_buf *buf); - -int client_info(struct tbase_client *client, struct kasnprintf_buf *buf) -{ - struct tbase_cbuf *cbuf; - struct tbase_session *session; - int ret; - - if (client->pid) - ret = kasnprintf(buf, "client %p: %s (%d)\n", client, - client->comm, client->pid); - else - ret = kasnprintf(buf, "client %p: [kernel]\n", client); - - if (ret < 0) - return ret; - - /* Buffers */ - mutex_lock(&client->cbufs_lock); - if (list_empty(&client->cbufs)) - goto done_cbufs; - - list_for_each_entry(cbuf, &client->cbufs, list) { - ret = cbuf_info(cbuf, buf); - if (ret < 0) - goto done_cbufs; - } - -done_cbufs: - mutex_unlock(&client->cbufs_lock); - if (ret < 0) - return ret; - - /* Sessions */ - mutex_lock(&client->sessions_lock); - if (list_empty(&client->sessions)) - goto done_sessions; - - list_for_each_entry(session, &client->sessions, list) { - ret = session_info(session, buf); - if (ret < 0) - goto done_sessions; - } - -done_sessions: - mutex_unlock(&client->sessions_lock); - - if (ret < 0) - return ret; - - return 0; -} - -/* - * This callback is called on remap - */ -static void cbuf_vm_open(struct vm_area_struct *vmarea) -{ - struct tbase_cbuf *cbuf = vmarea->vm_private_data; - - tbase_cbuf_get(cbuf); -} - -/* - * This callback is called on unmap - */ -static void cbuf_vm_close(struct vm_area_struct *vmarea) -{ - struct tbase_cbuf *cbuf = vmarea->vm_private_data; - - tbase_cbuf_put(cbuf); -} - -static struct vm_operations_struct cbuf_vm_ops = { - .open = cbuf_vm_open, - .close = cbuf_vm_close, -}; - -/* - * Create a cbuf object and add it to client - */ -int tbase_cbuf_alloc(struct tbase_client *client, uint32_t len, - uintptr_t *p_addr, - struct vm_area_struct *vmarea) -{ - int err = 0; - struct tbase_cbuf *cbuf = NULL; - unsigned int order; - - if (WARN(!client, "No client available")) - return -EINVAL; - - if (WARN(!len, "No len available")) - return -EINVAL; - - order = get_order(len); - if (order > MAX_ORDER) { - MCDRV_DBG_WARN("Buffer size too large"); - return -ENOMEM; - } - - /* Allocate buffer descriptor structure */ - cbuf = kzalloc(sizeof(*cbuf), GFP_KERNEL); - if (!cbuf) { - MCDRV_DBG_WARN("kzalloc failed"); - return -ENOMEM; - } - - /* Allocate buffer */ - cbuf->addr = __get_free_pages(GFP_USER | __GFP_ZERO, order); - if (!cbuf->addr) { - MCDRV_DBG_WARN("get_free_pages failed"); - kfree(cbuf); - return -ENOMEM; - } - - /* Map to user space if applicable */ - if (!client_is_kernel(client)) { - err = map_cbuf(vmarea, cbuf->addr, len, &cbuf->uaddr); - if (err) { - free_pages(cbuf->addr, order); - kfree(cbuf); - return err; - } - } - - /* Init descriptor members */ - cbuf->client = client; - cbuf->phys = virt_to_phys((void *)cbuf->addr); - cbuf->len = len; - cbuf->order = order; - kref_init(&cbuf->kref); - INIT_LIST_HEAD(&cbuf->list); - - /* Keep cbuf in VMA private data for refcounting (user-space clients) */ - if (vmarea) { - vmarea->vm_private_data = cbuf; - vmarea->vm_ops = &cbuf_vm_ops; - } - - /* Fill return parameter for k-api */ - if (p_addr) - *p_addr = cbuf->addr; - - /* Get a token on the client */ - client_get(client); - - /* Add buffer to list */ - mutex_lock(&client->cbufs_lock); - list_add(&cbuf->list, &client->cbufs); - mutex_unlock(&client->cbufs_lock); - MCDRV_DBG("created cbuf %p: client %p addr %lx uaddr %lx len %u", - cbuf, client, cbuf->addr, cbuf->uaddr, cbuf->len); - return err; -} - -/* - * Remove a cbuf object from client, and mark it for freeing. - * Freeing will happen once all current references are released. - */ -int tbase_cbuf_free(struct tbase_client *client, uintptr_t addr) -{ - struct tbase_cbuf *cbuf = tbase_cbuf_get_by_addr(client, addr); - - if (!cbuf) - return -EINVAL; - - /* Two references to put: the caller's and the one we just took */ - tbase_cbuf_put(cbuf); - tbase_cbuf_put(cbuf); - return 0; -} - -/* - * Find a contiguous buffer (cbuf) in the cbuf list of given client that - * contains given address and take a reference on it. - * Return pointer to the object, or NULL if not found. - */ -struct tbase_cbuf *tbase_cbuf_get_by_addr(struct tbase_client *client, - uintptr_t addr) -{ - struct tbase_cbuf *cbuf = NULL, *candidate; - bool is_kernel = client_is_kernel(client); - - mutex_lock(&client->cbufs_lock); - list_for_each_entry(candidate, &client->cbufs, list) { - /* Compare Vs kernel va OR user va depending on client type */ - uintptr_t start = is_kernel ? - candidate->addr : candidate->uaddr; - uintptr_t end = start + candidate->len; - - /* Check that (user) cbuf has not been unmapped */ - if (!start) - break; - - if ((addr >= start) && (addr < end)) { - cbuf = candidate; - break; - } - } - - if (cbuf) - tbase_cbuf_get(cbuf); - - mutex_unlock(&client->cbufs_lock); - return cbuf; -} - -void tbase_cbuf_get(struct tbase_cbuf *cbuf) -{ - kref_get(&cbuf->kref); -} - -static void cbuf_release(struct kref *kref) -{ - struct tbase_cbuf *cbuf = container_of(kref, struct tbase_cbuf, kref); - struct tbase_client *client = cbuf->client; - - /* Unlist from client */ - mutex_lock(&client->cbufs_lock); - list_del_init(&cbuf->list); - mutex_unlock(&client->cbufs_lock); - /* Release client token */ - client_put(client); - /* Free */ - free_pages(cbuf->addr, cbuf->order); - MCDRV_DBG("freed cbuf %p: client %p addr %lx uaddr %lx len %u", - cbuf, client, cbuf->addr, cbuf->uaddr, cbuf->len); - kfree(cbuf); -} - -void tbase_cbuf_put(struct tbase_cbuf *cbuf) -{ - kref_put(&cbuf->kref, cbuf_release); -} - -uintptr_t tbase_cbuf_addr(struct tbase_cbuf *cbuf) -{ - return cbuf->addr; -} - -uintptr_t tbase_cbuf_uaddr(struct tbase_cbuf *cbuf) -{ - return cbuf->uaddr; -} - -uint32_t tbase_cbuf_len(struct tbase_cbuf *cbuf) -{ - return cbuf->len; -} - -static inline int cbuf_info(struct tbase_cbuf *cbuf, struct kasnprintf_buf *buf) -{ - return kasnprintf(buf, "\tcbuf %p: addr %lx uaddr %lx len %u\n", - cbuf, cbuf->addr, cbuf->uaddr, cbuf->len); -} diff --git a/drivers/gud/MobiCoreDriver/client.h b/drivers/gud/MobiCoreDriver/client.h deleted file mode 100644 index 3cc833eeffb87..0000000000000 --- a/drivers/gud/MobiCoreDriver/client.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _CLIENT_H_ -#define _CLIENT_H_ - -#include -#include /* TASK_COMM_LEN */ - -struct task_struct; -struct tbase_object; -struct tbase_session; - -struct tbase_client { - /* PID of task that opened the device, 0 if kernel */ - pid_t pid; - /* Command for task*/ - char comm[TASK_COMM_LEN]; - /* Number of references kept to this object */ - struct kref kref; - /* List of contiguous buffers allocated by mcMallocWsm for the client */ - struct list_head cbufs; - struct mutex cbufs_lock; /* lock for the cbufs list */ - /* List of tbase TA sessions opened by this client */ - struct list_head sessions; - struct mutex sessions_lock; /* sessions list + closing */ - /* Client state */ - bool closing; - /* The list entry to attach to "ctx.clients" list */ - struct list_head list; -}; - -struct tbase_client *client_create(bool is_from_kernel); - -void client_close_sessions(struct tbase_client *client); - -static inline void client_get(struct tbase_client *client) -{ - kref_get(&client->kref); -} - -void client_put(struct tbase_client *client); - -bool client_is_kernel(struct tbase_client *client); - -bool client_set_closing(struct tbase_client *client); - -int client_add_session(struct tbase_client *client, - const struct tbase_object *obj, uintptr_t tci, - size_t len, uint32_t *p_sid, bool is_gp_uuid, - struct mc_identity *identity); - -int client_remove_session(struct tbase_client *client, uint32_t session_id); - -struct tbase_session *client_ref_session(struct tbase_client *client, - uint32_t session_id); - -void client_unref_session(struct tbase_session *session); - -int client_info(struct tbase_client *client, struct kasnprintf_buf *buf); - -/* - * Contiguous buffer allocated to TLCs. - * These buffers are uses as world shared memory (wsm) and shared with - * secure world. - * The virtual kernel address is added for a simpler search algorithm. - */ -struct tbase_cbuf; - -int tbase_cbuf_alloc(struct tbase_client *client, uint32_t len, - uintptr_t *addr, struct vm_area_struct *vmarea); - -int tbase_cbuf_free(struct tbase_client *client, uintptr_t addr); - -struct tbase_cbuf *tbase_cbuf_get_by_addr(struct tbase_client *client, - uintptr_t addr); - -void tbase_cbuf_get(struct tbase_cbuf *cbuf); - -void tbase_cbuf_put(struct tbase_cbuf *cbuf); - -uintptr_t tbase_cbuf_addr(struct tbase_cbuf *cbuf); - -uintptr_t tbase_cbuf_uaddr(struct tbase_cbuf *cbuf); - -uint32_t tbase_cbuf_len(struct tbase_cbuf *cbuf); - -#endif /* _CLIENT_H_ */ diff --git a/drivers/gud/MobiCoreDriver/clientlib.c b/drivers/gud/MobiCoreDriver/clientlib.c deleted file mode 100644 index c7d6d023b3a80..0000000000000 --- a/drivers/gud/MobiCoreDriver/clientlib.c +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" -#include "public/mobicore_driver_api.h" - -#include "main.h" -#include "debug.h" -#include "client.h" -#include "session.h" -#include "api.h" - -enum mc_result convert(int err) -{ - switch (-err) { - case 0: - return MC_DRV_OK; - case ENOMSG: - return MC_DRV_NO_NOTIFICATION; - case EBADMSG: - return MC_DRV_ERR_NOTIFICATION; - case EAGAIN: - return MC_DRV_ERR_OUT_OF_RESOURCES; - case EHOSTDOWN: - return MC_DRV_ERR_INIT; - case ENODEV: - return MC_DRV_ERR_UNKNOWN_DEVICE; - case ENXIO: - return MC_DRV_ERR_UNKNOWN_SESSION; - case EPERM: - return MC_DRV_ERR_INVALID_OPERATION; - case EBADE: - return MC_DRV_ERR_INVALID_RESPONSE; - case ETIME: - return MC_DRV_ERR_TIMEOUT; - case ENOMEM: - return MC_DRV_ERR_NO_FREE_MEMORY; - case EUCLEAN: - return MC_DRV_ERR_FREE_MEMORY_FAILED; - case ENOTEMPTY: - return MC_DRV_ERR_SESSION_PENDING; - case EHOSTUNREACH: - return MC_DRV_ERR_DAEMON_UNREACHABLE; - case ENOENT: - return MC_DRV_ERR_INVALID_DEVICE_FILE; - case EINVAL: - return MC_DRV_ERR_INVALID_PARAMETER; - case EPROTO: - return MC_DRV_ERR_KERNEL_MODULE; - case EADDRINUSE: - return MC_DRV_ERR_BULK_MAPPING; - case EADDRNOTAVAIL: - return MC_DRV_ERR_BULK_UNMAPPING; - case ECOMM: - return MC_DRV_INFO_NOTIFICATION; - case EUNATCH: - return MC_DRV_ERR_NQ_FAILED; - default: - MCDRV_DBG("error is %d", err); - return MC_DRV_ERR_UNKNOWN; - } -} - -static inline bool is_valid_device(uint32_t device_id) -{ - return MC_DEVICE_ID_DEFAULT == device_id; -} - -static struct tbase_client *client; -static int open_count; -static DEFINE_MUTEX(dev_mutex); /* Lock for the device */ - -static bool clientlib_client_get(void) -{ - int ret = true; - - mutex_lock(&dev_mutex); - if (!client) - ret = false; - else - client_get(client); - - mutex_unlock(&dev_mutex); - return ret; -} - -static void clientlib_client_put(void) -{ - mutex_lock(&dev_mutex); - client_put(client); - mutex_unlock(&dev_mutex); -} - -enum mc_result mc_open_device(uint32_t device_id) -{ - enum mc_result mc_result = MC_DRV_OK; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - mutex_lock(&dev_mutex); - if (!open_count) - client = api_open_device(true); - - if (client) { - open_count++; - MCDRV_DBG("Successfully opened the device."); - } else { - mc_result = MC_DRV_ERR_INVALID_DEVICE_FILE; - MCDRV_DBG("Could not open device"); - } - - mutex_unlock(&dev_mutex); - return mc_result; -} -EXPORT_SYMBOL(mc_open_device); - -enum mc_result mc_close_device(uint32_t device_id) -{ - enum mc_result mc_result = MC_DRV_OK; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - mutex_lock(&dev_mutex); - if (!client) { - mc_result = MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - goto end; - } - - if (open_count > 1) { - open_count--; - goto end; - } - - /* Check sessions and freeze client */ - mc_result = convert(api_freeze_device(client)); - if (MC_DRV_OK != mc_result) - goto end; - - /* Close the device */ - api_close_device(client); - client = NULL; - open_count = 0; - -end: - mutex_unlock(&dev_mutex); - return mc_result; -} -EXPORT_SYMBOL(mc_close_device); - -enum mc_result mc_open_session(struct mc_session_handle *session, - const struct mc_uuid_t *uuid, - uint8_t *tci, uint32_t len) -{ - struct mc_identity identity = { - .login_type = TEEC_LOGIN_PUBLIC, - }; - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_open_session(client, &session->session_id, uuid, - (uintptr_t)tci, len, false, &identity)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_open_session); - -enum mc_result mc_open_trustlet(struct mc_session_handle *session, - uint32_t spid, - uint8_t *trustlet, uint32_t trustlet_len, - uint8_t *tci, uint32_t len) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_open_trustlet(client, &session->session_id, spid, - (uintptr_t)trustlet, trustlet_len, - (uintptr_t)tci, len)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_open_trustlet); - -enum mc_result mc_close_session(struct mc_session_handle *session) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_close_session(client, session->session_id)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_close_session); - -enum mc_result mc_notify(struct mc_session_handle *session) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_notify(client, session->session_id)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_notify); - -enum mc_result mc_wait_notification(struct mc_session_handle *session, - int32_t timeout) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_wait_notification(client, session->session_id, - timeout)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_wait_notification); - -enum mc_result mc_malloc_wsm(uint32_t device_id, uint32_t align, uint32_t len, - uint8_t **wsm, uint32_t wsm_flags) -{ - enum mc_result ret; - uintptr_t va; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!len) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!wsm) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_malloc_cbuf(client, len, &va, NULL)); - if (ret == MC_DRV_OK) - *wsm = (uint8_t *)va; - - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_malloc_wsm); - -enum mc_result mc_free_wsm(uint32_t device_id, uint8_t *wsm) -{ - enum mc_result ret; - uintptr_t va = (uintptr_t)wsm; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_free_cbuf(client, va)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_free_wsm); - -enum mc_result mc_map(struct mc_session_handle *session, void *address, - uint32_t length, struct mc_bulk_map *map_info) -{ - enum mc_result ret; - struct mc_ioctl_buffer bufs[MC_MAP_MAX]; - uint32_t i; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!map_info) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - bufs[0].va = (uintptr_t)address; - bufs[0].len = length; - for (i = 1; i < MC_MAP_MAX; i++) - bufs[i].va = 0; - - ret = convert(api_map_wsms(client, session->session_id, bufs)); - if (ret == MC_DRV_OK) { - map_info->secure_virt_addr = bufs[0].sva; - map_info->secure_virt_len = bufs[0].len; - } - - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_map); - -enum mc_result mc_unmap(struct mc_session_handle *session, void *address, - struct mc_bulk_map *map_info) -{ - enum mc_result ret; - struct mc_ioctl_buffer bufs[MC_MAP_MAX]; - uint32_t i; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!map_info) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - bufs[0].va = (uintptr_t)address; - bufs[0].len = map_info->secure_virt_len; - bufs[0].sva = map_info->secure_virt_addr; - for (i = 1; i < MC_MAP_MAX; i++) - bufs[i].va = 0; - - ret = convert(api_unmap_wsms(client, session->session_id, bufs)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_unmap); - -enum mc_result mc_get_session_error_code(struct mc_session_handle *session, - int32_t *exit_code) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!exit_code) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_get_session_exitcode(client, session->session_id, - exit_code)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_get_session_error_code); diff --git a/drivers/gud/MobiCoreDriver/clock.c b/drivers/gud/MobiCoreDriver/clock.c deleted file mode 100644 index 0195ab794f205..0000000000000 --- a/drivers/gud/MobiCoreDriver/clock.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "platform.h" - -#ifdef MC_CRYPTO_CLOCK_MANAGEMENT - -#include -#include -#include -#include - -#include "debug.h" -#include "clock.h" - -static struct clk_context { - struct clk *mc_ce_iface_clk; - struct clk *mc_ce_core_clk; - struct clk *mc_ce_bus_clk; - struct clk *mc_ce_core_src_clk; -} clk_ctx; - -int mc_clock_init(void) -{ - int ret = 0; -#ifdef MC_CLOCK_CORESRC_DEFAULTRATE - int core_src_rate = MC_CLOCK_CORESRC_DEFAULTRATE; - - /* Get core clk src */ - clk_ctx.mc_ce_core_src_clk = clk_get(g_ctx.mcd, "core_clk_src"); - if (IS_ERR(clk_ctx.mc_ce_core_src_clk)) { - ret = PTR_ERR(clk_ctx.mc_ce_core_src_clk); - MCDRV_ERROR("cannot get core src clock: %d", ret); - goto error; - } - -#ifdef MC_CRYPTO_CLOCK_CORESRC_PROPNAME - if (of_property_read_u32(g_ctx.mcd->of_node, - MC_CRYPTO_CLOCK_CORESRC_PROPNAME, - &core_src_rate)) { - core_src_rate = MC_CLOCK_CORESRC_DEFAULTRATE; - MCDRV_ERROR("cannot get ce clock frequency from DT, use %d", - core_src_rate); - } -#endif /* MC_CRYPTO_CLOCK_CORESRC_PROPNAME */ - - ret = clk_set_rate(clk_ctx.mc_ce_core_src_clk, core_src_rate); - if (ret) { - clk_put(clk_ctx.mc_ce_core_src_clk); - clk_ctx.mc_ce_core_src_clk = NULL; - MCDRV_ERROR("cannot set core clock src rate: %d", ret); - ret = -EIO; - goto error; - } -#endif /* MC_CLOCK_CORESRC_DEFAULTRATE */ - - /* Get core clk */ - clk_ctx.mc_ce_core_clk = clk_get(g_ctx.mcd, "core_clk"); - if (IS_ERR(clk_ctx.mc_ce_core_clk)) { - ret = PTR_ERR(clk_ctx.mc_ce_core_clk); - MCDRV_ERROR("cannot get core clock: %d", ret); - goto error; - } - /* Get Interface clk */ - clk_ctx.mc_ce_iface_clk = clk_get(g_ctx.mcd, "iface_clk"); - if (IS_ERR(clk_ctx.mc_ce_iface_clk)) { - clk_put(clk_ctx.mc_ce_core_clk); - ret = PTR_ERR(clk_ctx.mc_ce_iface_clk); - MCDRV_ERROR("cannot get iface clock: %d", ret); - goto error; - } - /* Get AXI clk */ - clk_ctx.mc_ce_bus_clk = clk_get(g_ctx.mcd, "bus_clk"); - if (IS_ERR(clk_ctx.mc_ce_bus_clk)) { - clk_put(clk_ctx.mc_ce_iface_clk); - clk_put(clk_ctx.mc_ce_core_clk); - ret = PTR_ERR(clk_ctx.mc_ce_bus_clk); - MCDRV_ERROR("cannot get AXI bus clock: %d", ret); - goto error; - } - return ret; - -error: - clk_ctx.mc_ce_core_clk = NULL; - clk_ctx.mc_ce_iface_clk = NULL; - clk_ctx.mc_ce_bus_clk = NULL; - clk_ctx.mc_ce_core_src_clk = NULL; - return ret; -} - -void mc_clock_exit(void) -{ - if (clk_ctx.mc_ce_iface_clk) - clk_put(clk_ctx.mc_ce_iface_clk); - - if (clk_ctx.mc_ce_core_clk) - clk_put(clk_ctx.mc_ce_core_clk); - - if (clk_ctx.mc_ce_bus_clk) - clk_put(clk_ctx.mc_ce_bus_clk); - - if (clk_ctx.mc_ce_core_src_clk) - clk_put(clk_ctx.mc_ce_core_src_clk); -} - -int mc_clock_enable(void) -{ - int rc; - - rc = clk_prepare_enable(clk_ctx.mc_ce_core_clk); - if (rc) { - MCDRV_ERROR("cannot enable core clock"); - goto err_core; - } - - rc = clk_prepare_enable(clk_ctx.mc_ce_iface_clk); - if (rc) { - MCDRV_ERROR("cannot enable interface clock"); - goto err_iface; - } - - rc = clk_prepare_enable(clk_ctx.mc_ce_bus_clk); - if (rc) { - MCDRV_ERROR("cannot enable bus clock"); - goto err_bus; - } - - return 0; - -err_bus: - clk_disable_unprepare(clk_ctx.mc_ce_iface_clk); -err_iface: - clk_disable_unprepare(clk_ctx.mc_ce_core_clk); -err_core: - return rc; -} - -void mc_clock_disable(void) -{ - if (clk_ctx.mc_ce_iface_clk) - clk_disable_unprepare(clk_ctx.mc_ce_iface_clk); - - if (clk_ctx.mc_ce_core_clk) - clk_disable_unprepare(clk_ctx.mc_ce_core_clk); - - if (clk_ctx.mc_ce_bus_clk) - clk_disable_unprepare(clk_ctx.mc_ce_bus_clk); -} - -#endif /* MC_CRYPTO_CLOCK_MANAGEMENT */ diff --git a/drivers/gud/MobiCoreDriver/clock.h b/drivers/gud/MobiCoreDriver/clock.h deleted file mode 100644 index 21095499efb53..0000000000000 --- a/drivers/gud/MobiCoreDriver/clock.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MC_CLOCK_H_ -#define _MC_CLOCK_H_ - -#include "platform.h" /* MC_CRYPTO_CLOCK_MANAGEMENT */ - -#ifdef MC_CRYPTO_CLOCK_MANAGEMENT - -/* Initialize secure crypto clocks */ -int mc_clock_init(void); -/* Free secure crypto clocks */ -void mc_clock_exit(void); -/* Enable secure crypto clocks */ -int mc_clock_enable(void); -/* Disable secure crypto clocks */ -void mc_clock_disable(void); - -#else /* MC_CRYPTO_CLOCK_MANAGEMENT */ - -static inline int mc_clock_init(void) -{ - return 0; -} - -static inline void mc_clock_exit(void) -{ -} - -static inline int mc_clock_enable(void) -{ - return 0; -} - -static inline void mc_clock_disable(void) -{ -} - -#endif /* !MC_CRYPTO_CLOCK_MANAGEMENT */ - -#endif /* _MC_CLOCK_H_ */ diff --git a/drivers/gud/MobiCoreDriver/debug.h b/drivers/gud/MobiCoreDriver/debug.h deleted file mode 100644 index 9d6a52ab955b6..0000000000000 --- a/drivers/gud/MobiCoreDriver/debug.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MC_DEBUG_H_ -#define _MC_DEBUG_H_ - -#include "main.h" /* g_ctx */ - -#define MCDRV_ERROR(txt, ...) \ - dev_err(g_ctx.mcd, "%s() ### ERROR: " txt "\n", \ - __func__, \ - ##__VA_ARGS__) - -/* dummy function helper macro. */ -#define DUMMY_FUNCTION() do {} while (0) - -#ifdef DEBUG - -#ifdef DEBUG_VERBOSE -#define MCDRV_DBG_VERBOSE MCDRV_DBG -#else -#define MCDRV_DBG_VERBOSE(...) DUMMY_FUNCTION() -#endif - -#define MCDRV_DBG(txt, ...) \ - dev_info(g_ctx.mcd, "%s(): " txt "\n", \ - __func__, \ - ##__VA_ARGS__) - -#define MCDRV_DBG_WARN(txt, ...) \ - dev_warn(g_ctx.mcd, "%s() WARNING: " txt "\n", \ - __func__, \ - ##__VA_ARGS__) - -#define MCDRV_ASSERT(cond) \ - do { \ - if (unlikely(!(cond))) { \ - panic("Assertion failed: %s:%d\n", \ - __FILE__, __LINE__); \ - } \ - } while (0) - -#else /* DEBUG */ - -#define MCDRV_DBG_VERBOSE(...) DUMMY_FUNCTION() -#define MCDRV_DBG(...) DUMMY_FUNCTION() -#define MCDRV_DBG_WARN(...) DUMMY_FUNCTION() - -#define MCDRV_ASSERT(...) DUMMY_FUNCTION() - -#endif /* !DEBUG */ - -#endif /* _MC_DEBUG_H_ */ diff --git a/drivers/gud/MobiCoreDriver/fastcall.c b/drivers/gud/MobiCoreDriver/fastcall.c deleted file mode 100644 index ee612632331c8..0000000000000 --- a/drivers/gud/MobiCoreDriver/fastcall.c +++ /dev/null @@ -1,512 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_linux_api.h" - -#include "mci/mcifc.h" - -#include "platform.h" /* MC_FASTCALL_WORKER_THREAD and more */ -#include "debug.h" -#include "clock.h" /* mc_clock_enable, mc_clock_disable */ -#include "fastcall.h" - -struct fastcall_work { -#ifdef MC_FASTCALL_WORKER_THREAD - struct kthread_work work; -#else - struct work_struct work; -#endif - void *data; -}; - -/* generic fast call parameters */ -union mc_fc_generic { - struct { - uint32_t cmd; - uint32_t param[3]; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t param[2]; - } as_out; -}; - -/* fast call init */ -union mc_fc_init { - union mc_fc_generic as_generic; - struct { - uint32_t cmd; - uint32_t base; - uint32_t nq_info; - uint32_t mcp_info; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t rfu[2]; - } as_out; -}; - -/* fast call info parameters */ -union mc_fc_info { - union mc_fc_generic as_generic; - struct { - uint32_t cmd; - uint32_t ext_info_id; - uint32_t rfu[2]; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t state; - uint32_t ext_info; - } as_out; -}; - -#ifdef TBASE_CORE_SWITCHER -/* fast call switch Core parameters */ -union mc_fc_swich_core { - union mc_fc_generic as_generic; - struct { - uint32_t cmd; - uint32_t core_id; - uint32_t rfu[2]; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t state; - uint32_t ext_info; - } as_out; -}; -#endif - -#ifdef MC_FASTCALL_WORKER_THREAD -static struct task_struct *fastcall_thread; -static DEFINE_KTHREAD_WORKER(fastcall_worker); -#endif - -/* - * _smc() - fast call to MobiCore - * - * @data: pointer to fast call data - */ -static inline int _smc(union mc_fc_generic *mc_fc_generic) -{ - if (!mc_fc_generic) - return -EINVAL; - -#ifdef MC_SMC_FASTCALL - return smc_fastcall(mc_fc_generic, sizeof(*mc_fc_generic)); -#else /* MC_SMC_FASTCALL */ - { -#ifdef CONFIG_ARM64 - /* SMC expect values in x0-x3 */ - register u64 reg0 __asm__("x0") = mc_fc_generic->as_in.cmd; - register u64 reg1 __asm__("x1") = mc_fc_generic->as_in.param[0]; - register u64 reg2 __asm__("x2") = mc_fc_generic->as_in.param[1]; - register u64 reg3 __asm__("x3") = mc_fc_generic->as_in.param[2]; - - /* - * According to AARCH64 SMC Calling Convention (ARM DEN 0028A), - * section 3.1: registers x4-x17 are unpredictable/scratch - * registers. So we have to make sure that the compiler does - * not allocate any of those registers by letting him know that - * the asm code might clobber them. - */ - __asm__ volatile ( - "smc #0\n" - : "+r"(reg0), "+r"(reg1), "+r"(reg2), "+r"(reg3) - : - : "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", - "x12", "x13", "x14", "x15", "x16", "x17" - ); -#else /* CONFIG_ARM64 */ - /* SMC expect values in r0-r3 */ - register u32 reg0 __asm__("r0") = mc_fc_generic->as_in.cmd; - register u32 reg1 __asm__("r1") = mc_fc_generic->as_in.param[0]; - register u32 reg2 __asm__("r2") = mc_fc_generic->as_in.param[1]; - register u32 reg3 __asm__("r3") = mc_fc_generic->as_in.param[2]; - - __asm__ volatile ( -#ifdef MC_ARCH_EXTENSION_SEC - /* This pseudo op is supported and required from - * binutils 2.21 on */ - ".arch_extension sec\n" -#endif /* MC_ARCH_EXTENSION_SEC */ - "smc #0\n" - : "+r"(reg0), "+r"(reg1), "+r"(reg2), "+r"(reg3) - ); - -#ifdef __ARM_VE_A9X4_QEMU__ - /* Qemu does not return to the address following the SMC - * instruction so we have to insert several nop instructions to - * workaround this Qemu bug. */ - __asm__ volatile ( - "nop\n" - "nop\n" - "nop\n" - "nop" - ); -#endif /* __ARM_VE_A9X4_QEMU__ */ -#endif /* !CONFIG_ARM64 */ - - /* set response */ - mc_fc_generic->as_out.resp = reg0; - mc_fc_generic->as_out.ret = reg1; - mc_fc_generic->as_out.param[0] = reg2; - mc_fc_generic->as_out.param[1] = reg3; - } - return 0; -#endif /* !MC_SMC_FASTCALL */ -} - -#ifdef TBASE_CORE_SWITCHER -static uint32_t active_cpu; - -#ifdef MC_FASTCALL_WORKER_THREAD -static void mc_cpu_offline(int cpu) -{ - int i; - - if (active_cpu != cpu) { - MCDRV_DBG("not active CPU, no action taken\n"); - return; - } - - /* Chose the first online CPU and switch! */ - for_each_online_cpu(i) { - if (cpu != i) { - MCDRV_DBG("CPU %d is dying, switching to %d\n", cpu, i); - mc_switch_core(i); - break; - } - - MCDRV_DBG("Skipping CPU %d\n", cpu); - } -} - -static int mobicore_cpu_callback(struct notifier_block *nfb, - unsigned long action, void *hcpu) -{ - unsigned int cpu = (unsigned long)hcpu; - - switch (action) { - case CPU_DOWN_PREPARE: - case CPU_DOWN_PREPARE_FROZEN: - dev_info(g_ctx.mcd, "Cpu %u is going to die\n", cpu); - mc_cpu_offline(cpu); - break; - case CPU_DEAD: - case CPU_DEAD_FROZEN: - dev_info(g_ctx.mcd, "Cpu %u is dead\n", cpu); - break; - } - return NOTIFY_OK; -} - -static struct notifier_block mobicore_cpu_notifer = { - .notifier_call = mobicore_cpu_callback, -}; -#endif /* MC_FASTCALL_WORKER_THREAD */ - -static cpumask_t mc_exec_core_switch(union mc_fc_generic *mc_fc_generic) -{ - cpumask_t cpu; - uint32_t new_cpu; - uint32_t cpu_id[] = CPU_IDS; - - new_cpu = mc_fc_generic->as_in.param[0]; - mc_fc_generic->as_in.param[0] = cpu_id[mc_fc_generic->as_in.param[0]]; - - if (_smc(mc_fc_generic) != 0 || mc_fc_generic->as_out.ret != 0) { - MCDRV_DBG("CoreSwap failed %d -> %d (cpu %d still active)\n", - raw_smp_processor_id(), - mc_fc_generic->as_in.param[0], - raw_smp_processor_id()); - } else { - active_cpu = new_cpu; - MCDRV_DBG("CoreSwap ok %d -> %d\n", - raw_smp_processor_id(), active_cpu); - } - cpumask_clear(&cpu); - cpumask_set_cpu(active_cpu, &cpu); - return cpu; -} -#else /* TBASE_CORE_SWITCHER */ -static inline cpumask_t mc_exec_core_switch(union mc_fc_generic *mc_fc_generic) -{ - return CPU_MASK_CPU0; -} -#endif /* !TBASE_CORE_SWITCHER */ - -#ifdef MC_FASTCALL_WORKER_THREAD -static void fastcall_work_func(struct kthread_work *work) -#else -static void fastcall_work_func(struct work_struct *work) -#endif -{ - struct fastcall_work *fc_work = - container_of(work, struct fastcall_work, work); - union mc_fc_generic *mc_fc_generic = fc_work->data; - - if (!mc_fc_generic) - return; - - mc_clock_enable(); - - if (mc_fc_generic->as_in.cmd == MC_FC_SWAP_CPU) { -#ifdef MC_FASTCALL_WORKER_THREAD - cpumask_t new_msk = mc_exec_core_switch(mc_fc_generic); - - set_cpus_allowed(fastcall_thread, new_msk); -#else - mc_exec_core_switch(mc_fc_generic); -#endif - } else { - _smc(mc_fc_generic); - } - - mc_clock_disable(); -} - -static bool mc_fastcall(void *data) -{ -#ifdef MC_FASTCALL_WORKER_THREAD - struct fastcall_work fc_work = { - KTHREAD_WORK_INIT(fc_work.work, fastcall_work_func), - .data = data, - }; - - if (!queue_kthread_work(&fastcall_worker, &fc_work.work)) - return false; - - /* If work is queued or executing, wait for it to finish execution */ - flush_kthread_work(&fc_work.work); -#else - struct fastcall_work fc_work = { - .data = data, - }; - - INIT_WORK_ONSTACK(&fc_work.work, fastcall_work_func); - - if (!schedule_work_on(0, &fc_work.work)) - return false; - - flush_work(&fc_work.work); -#endif - return true; -} - -int mc_fastcall_init(void) -{ - int ret = mc_clock_init(); - - if (ret) - return ret; - -#ifdef MC_FASTCALL_WORKER_THREAD - fastcall_thread = kthread_create(kthread_worker_fn, &fastcall_worker, - "mc_fastcall"); - if (IS_ERR(fastcall_thread)) { - ret = PTR_ERR(fastcall_thread); - fastcall_thread = NULL; - MCDRV_ERROR("cannot create fastcall wq (%d)", ret); - return ret; - } - - /* this thread MUST run on CPU 0 at startup */ - set_cpus_allowed(fastcall_thread, CPU_MASK_CPU0); - - wake_up_process(fastcall_thread); -#ifdef TBASE_CORE_SWITCHER - ret = register_cpu_notifier(&mobicore_cpu_notifer); -#endif -#endif /* MC_FASTCALL_WORKER_THREAD */ - return ret; -} - -void mc_fastcall_exit(void) -{ -#ifdef MC_FASTCALL_WORKER_THREAD - if (!IS_ERR_OR_NULL(fastcall_thread)) { -#ifdef TBASE_CORE_SWITCHER - unregister_cpu_notifier(&mobicore_cpu_notifer); -#endif - kthread_stop(fastcall_thread); - fastcall_thread = NULL; - } -#endif /* MC_FASTCALL_WORKER_THREAD */ - mc_clock_exit(); -} - -/* - * convert fast call return code to linux driver module error code - */ -static int convert_fc_ret(uint32_t ret) -{ - switch (ret) { - case MC_FC_RET_OK: - return 0; - case MC_FC_RET_ERR_INVALID: - return -EINVAL; - case MC_FC_RET_ERR_ALREADY_INITIALIZED: - return -EBUSY; - default: - return -EFAULT; - } -} - -int mc_fc_init(uintptr_t base_pa, ptrdiff_t off, size_t q_len, size_t buf_len) -{ -#ifdef CONFIG_ARM64 - uint32_t base_high = (uint32_t)(base_pa >> 32); -#else - uint32_t base_high = 0; -#endif - union mc_fc_init fc_init; - - /* Call the INIT fastcall to setup MobiCore initialization */ - memset(&fc_init, 0, sizeof(fc_init)); - fc_init.as_in.cmd = MC_FC_INIT; - /* base address of mci buffer PAGE_SIZE (default is 4KB) aligned */ - fc_init.as_in.base = (uint32_t)base_pa; - /* notification buffer start/length [16:16] [start, length] */ - fc_init.as_in.nq_info = - ((base_high & 0xFFFF) << 16) | (q_len & 0xFFFF); - /* mcp buffer start/length [16:16] [start, length] */ - fc_init.as_in.mcp_info = (off << 16) | (buf_len & 0xFFFF); - MCDRV_DBG("cmd=0x%08x, base=0x%08x,nq_info=0x%08x, mcp_info=0x%08x", - fc_init.as_in.cmd, fc_init.as_in.base, fc_init.as_in.nq_info, - fc_init.as_in.mcp_info); - mc_fastcall(&fc_init.as_generic); - MCDRV_DBG("out cmd=0x%08x, ret=0x%08x", fc_init.as_out.resp, - fc_init.as_out.ret); - return convert_fc_ret(fc_init.as_out.ret); -} - -int mc_fc_info(uint32_t ext_info_id, uint32_t *state, uint32_t *ext_info) -{ - union mc_fc_info fc_info; - int ret = 0; - - memset(&fc_info, 0, sizeof(fc_info)); - fc_info.as_in.cmd = MC_FC_INFO; - fc_info.as_in.ext_info_id = ext_info_id; - mc_fastcall(&fc_info.as_generic); - ret = convert_fc_ret(fc_info.as_out.ret); - if (ret) { - if (state) - *state = MC_STATUS_NOT_INITIALIZED; - - if (ext_info) - *ext_info = 0; - - MCDRV_ERROR("code %d for idx %d", ret, ext_info_id); - } else { - if (state) - *state = fc_info.as_out.state; - - if (ext_info) - *ext_info = fc_info.as_out.ext_info; - } - - return ret; -} - -int mc_fc_mem_trace(phys_addr_t buffer, uint32_t size) -{ - union mc_fc_generic mc_fc_generic; - - memset(&mc_fc_generic, 0, sizeof(mc_fc_generic)); - mc_fc_generic.as_in.cmd = MC_FC_MEM_TRACE; - mc_fc_generic.as_in.param[0] = (uint32_t)buffer; -#ifdef CONFIG_ARM64 - mc_fc_generic.as_in.param[1] = (uint32_t)(buffer >> 32); -#endif - mc_fc_generic.as_in.param[2] = size; - mc_fastcall(&mc_fc_generic); - return convert_fc_ret(mc_fc_generic.as_out.ret); -} - -int mc_fc_nsiq(void) -{ - union mc_fc_generic fc; - int ret; - - memset(&fc, 0, sizeof(fc)); - fc.as_in.cmd = MC_SMC_N_SIQ; - mc_fastcall(&fc); - ret = convert_fc_ret(fc.as_out.ret); - if (ret) - MCDRV_ERROR("failed: %d", ret); - - return ret; -} - -int mc_fc_yield(void) -{ - union mc_fc_generic fc; - int ret; - - memset(&fc, 0, sizeof(fc)); - fc.as_in.cmd = MC_SMC_N_YIELD; - mc_fastcall(&fc); - ret = convert_fc_ret(fc.as_out.ret); - if (ret) - MCDRV_ERROR("failed: %d", ret); - - return ret; -} - -#ifdef TBASE_CORE_SWITCHER -uint32_t mc_active_core(void) -{ - return active_cpu; -} - -int mc_switch_core(uint32_t core_num) -{ - int32_t ret = 0; - union mc_fc_swich_core fc_switch_core; - - if (!cpu_online(core_num)) - return 1; - - MCDRV_DBG_VERBOSE("enter\n"); - memset(&fc_switch_core, 0, sizeof(fc_switch_core)); - fc_switch_core.as_in.cmd = MC_FC_SWAP_CPU; - if (core_num < COUNT_OF_CPUS) - fc_switch_core.as_in.core_id = core_num; - else - fc_switch_core.as_in.core_id = 0; - - MCDRV_DBG("<- cmd=0x%08x, core_id=0x%08x\n", - fc_switch_core.as_in.cmd, fc_switch_core.as_in.core_id); - MCDRV_DBG("<- core_num=0x%08x, active_cpu=0x%08x\n", - core_num, active_cpu); - mc_fastcall(&fc_switch_core.as_generic); - ret = convert_fc_ret(fc_switch_core.as_out.ret); - MCDRV_DBG_VERBOSE("exit with %d/0x%08X\n", ret, ret); - return ret; -} -#endif diff --git a/drivers/gud/MobiCoreDriver/fastcall.h b/drivers/gud/MobiCoreDriver/fastcall.h deleted file mode 100644 index b19b27687ff38..0000000000000 --- a/drivers/gud/MobiCoreDriver/fastcall.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _TBASE_FASTCALL_H_ -#define _TBASE_FASTCALL_H_ - -/* Use the arch_extension sec pseudo op before switching to secure world */ -#if defined(__GNUC__) && \ - defined(__GNUC_MINOR__) && \ - defined(__GNUC_PATCHLEVEL__) && \ - ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)) \ - >= 40502 -#ifndef CONFIG_ARM64 -#define MC_ARCH_EXTENSION_SEC -#endif -#endif - -int mc_fc_init(uintptr_t base_pa, ptrdiff_t off, size_t q_len, size_t buf_len); -int mc_fc_info(uint32_t ext_info_id, uint32_t *state, uint32_t *ext_info); -int mc_fc_mem_trace(phys_addr_t buffer, uint32_t size); -int mc_fc_nsiq(void); -int mc_fc_yield(void); - -int mc_fastcall_init(void); -void mc_fastcall_exit(void); - -#endif /* _TBASE_FASTCALL_H_ */ diff --git a/drivers/gud/MobiCoreDriver/logging.c b/drivers/gud/MobiCoreDriver/logging.c deleted file mode 100644 index 953de5f149f78..0000000000000 --- a/drivers/gud/MobiCoreDriver/logging.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include - -#include "fastcall.h" -#include "main.h" -#include "logging.h" - -#ifndef CONFIG_TRUSTONIC_TEE_NO_TRACES - -/* Supported log buffer version */ -#define MC_LOG_VERSION 2 - -/* Default length of the log ring buffer 256KiB */ -#define LOG_BUF_ORDER 6 - -/* Max Len of a log line for printing */ -#define LOG_LINE_SIZE 256 - -/* Definitions for log version 2 */ -#define LOG_TYPE_MASK (0x0007) -#define LOG_TYPE_CHAR 0 -#define LOG_TYPE_INTEGER 1 - -/* Field length */ -#define LOG_LENGTH_MASK (0x00F8) -#define LOG_LENGTH_SHIFT 3 - -/* Extra attributes */ -#define LOG_EOL (0x0100) -#define LOG_INTEGER_DECIMAL (0x0200) -#define LOG_INTEGER_SIGNED (0x0400) - -struct mc_logmsg { - uint16_t ctrl; /* Type and format of data */ - uint16_t source; /* Unique value for each event source */ - uint32_t log_data; /* Value, if any */ -}; - -/* MobiCore internal trace buffer structure. */ -struct mc_trace_buf { - uint32_t version; /* version of trace buffer */ - uint32_t length; /* length of buff */ - uint32_t head; /* last write position */ - uint8_t buff[]; /* start of the log buffer */ -}; - -static struct logging_ctx { - struct work_struct work; - union { - struct mc_trace_buf *trace_buf; /* Circular log buffer */ - unsigned long trace_page; - }; - bool buffer_is_shared; /* Log buffer cannot be freed */ - uint32_t tail; /* MobiCore log read position */ - uint32_t line_len; /* Log Line buffer current length */ - int thread_err; - uint16_t prev_source; /* Previous Log source */ - char line[LOG_LINE_SIZE]; /* Log Line buffer */ - bool dead; -} log_ctx; - -static inline void log_eol(uint16_t source) -{ - if (!strnlen(log_ctx.line, LOG_LINE_SIZE)) { - /* In case a TA tries to print a 0x0 */ - log_ctx.line_len = 0; - return; - } - - if (log_ctx.prev_source) - /* MobiCore Userspace */ - dev_info(g_ctx.mcd, "%03x|%s\n", log_ctx.prev_source, - log_ctx.line); - else - /* MobiCore kernel */ - dev_info(g_ctx.mcd, "%s\n", log_ctx.line); - - log_ctx.line_len = 0; - log_ctx.line[0] = 0; -} - -/* - * Collect chars in log_ctx.line buffer and output the buffer when it is full. - * No locking needed because only "mobicore_log" thread updates this buffer. - */ -static inline void log_char(char ch, uint16_t source) -{ - if (ch == '\n' || ch == '\r') { - log_eol(source); - return; - } - - if ((log_ctx.line_len >= (LOG_LINE_SIZE - 1)) || - (source != log_ctx.prev_source)) - log_eol(source); - - log_ctx.line[log_ctx.line_len++] = ch; - log_ctx.line[log_ctx.line_len] = 0; - log_ctx.prev_source = source; -} - -static inline void log_string(uint32_t ch, uint16_t source) -{ - while (ch) { - log_char(ch & 0xFF, source); - ch >>= 8; - } -} - -static inline void log_number(uint32_t format, uint32_t value, uint16_t source) -{ - int width = (format & LOG_LENGTH_MASK) >> LOG_LENGTH_SHIFT; - char fmt[16]; - char buffer[32]; - const char *reader = buffer; - - if (format & LOG_INTEGER_DECIMAL) - if (format & LOG_INTEGER_SIGNED) - snprintf(fmt, sizeof(fmt), "%%%ud", width); - else - snprintf(fmt, sizeof(fmt), "%%%uu", width); - else - snprintf(fmt, sizeof(fmt), "%%0%ux", width); - - snprintf(buffer, sizeof(buffer), fmt, value); - while (*reader) - log_char(*reader++, source); -} - -static inline int log_msg(void *data) -{ - struct mc_logmsg *msg = (struct mc_logmsg *)data; - int log_type = msg->ctrl & LOG_TYPE_MASK; - - switch (log_type) { - case LOG_TYPE_CHAR: - log_string(msg->log_data, msg->source); - break; - case LOG_TYPE_INTEGER: - log_number(msg->ctrl, msg->log_data, msg->source); - break; - } - if (msg->ctrl & LOG_EOL) - log_eol(msg->source); - - return sizeof(*msg); -} - -static void log_worker(struct work_struct *work) -{ - while (log_ctx.trace_buf->head != log_ctx.tail) { - if (log_ctx.trace_buf->version != MC_LOG_VERSION) { - dev_err(g_ctx.mcd, - "Bad log data v%d (exp. v%d), stop.\n", - log_ctx.trace_buf->version, - MC_LOG_VERSION); - log_ctx.dead = true; - break; - } - - log_ctx.tail += log_msg(&log_ctx.trace_buf->buff[log_ctx.tail]); - /* Wrap over if no space left for a complete message */ - if ((log_ctx.tail + sizeof(struct mc_logmsg)) > - log_ctx.trace_buf->length) - log_ctx.tail = 0; - } -} - -/* - * Wake up the log reader thread - * This should be called from the places where calls into MobiCore have - * generated some logs(eg, yield, SIQ...) - */ -void mc_logging_run(void) -{ - if (!log_ctx.dead && (log_ctx.trace_buf->head != log_ctx.tail)) - schedule_work(&log_ctx.work); -} - -int mc_logging_start(void) -{ - int ret = mc_fc_mem_trace(virt_to_phys((void *)(log_ctx.trace_page)), - BIT(LOG_BUF_ORDER) * PAGE_SIZE); - - if (ret) { - dev_err(g_ctx.mcd, "shared traces setup failed\n"); - return ret; - } - - log_ctx.buffer_is_shared = true; - dev_dbg(g_ctx.mcd, "fc_log version %u\n", log_ctx.trace_buf->version); - mc_logging_run(); - return 0; -} - -void mc_logging_stop(void) -{ - if (!mc_fc_mem_trace(0, 0)) - log_ctx.buffer_is_shared = false; - - mc_logging_run(); - flush_work(&log_ctx.work); -} - -/* - * Setup MobiCore kernel log. It assumes it's running on CORE 0! - * The fastcall will complain is that is not the case! - */ -int mc_logging_init(void) -{ - /* - * We are going to map this buffer into virtual address space in SWd. - * To reduce complexity there, we use a contiguous buffer. - */ - log_ctx.trace_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, - LOG_BUF_ORDER); - if (!log_ctx.trace_page) - return -ENOMEM; - - INIT_WORK(&log_ctx.work, log_worker); - return 0; -} - -void mc_logging_exit(void) -{ - /* - * This is not racey as the only caller for mc_logging_run is the - * scheduler which gets stopped before us, and long before we exit. - */ - if (!log_ctx.buffer_is_shared) - free_pages(log_ctx.trace_page, LOG_BUF_ORDER); - else - dev_err(g_ctx.mcd, "log buffer unregister not supported\n"); -} - -#endif /* !CONFIG_TRUSTONIC_TEE_NO_TRACES */ diff --git a/drivers/gud/MobiCoreDriver/logging.h b/drivers/gud/MobiCoreDriver/logging.h deleted file mode 100644 index 744b41880ea31..0000000000000 --- a/drivers/gud/MobiCoreDriver/logging.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MC_LOGGING_H_ -#define _MC_LOGGING_H_ - -#include "platform.h" /* CONFIG_TRUSTONIC_TEE_NO_TRACES */ - -/* MobiCore internal trace log setup. */ -#ifndef CONFIG_TRUSTONIC_TEE_NO_TRACES -void mc_logging_run(void); -int mc_logging_init(void); -void mc_logging_exit(void); -int mc_logging_start(void); -void mc_logging_stop(void); -#else /* !CONFIG_TRUSTONIC_TEE_NO_TRACES */ -static inline void mc_logging_run(void) -{ -} - -static inline long mc_logging_init(void) -{ - return 0; -} - -static inline void mc_logging_exit(void) -{ -} - -static inline int mc_logging_start(void) -{ - return 0; -} - -static inline void mc_logging_stop(void) -{ -} - -#endif /* CONFIG_TRUSTONIC_TEE_NO_TRACES */ - -#endif /* _MC_LOGGING_H_ */ diff --git a/drivers/gud/MobiCoreDriver/main.c b/drivers/gud/MobiCoreDriver/main.c deleted file mode 100644 index 66b232e5bc8b5..0000000000000 --- a/drivers/gud/MobiCoreDriver/main.c +++ /dev/null @@ -1,750 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "main.h" -#include "fastcall.h" -#include "arm.h" -#include "mmu.h" -#include "scheduler.h" -#include "pm.h" -#include "debug.h" -#include "logging.h" -#include "admin.h" -#include "mcp.h" -#include "session.h" -#include "client.h" -#include "api.h" - -#include "build_tag.h" - -/* Define a MobiCore device structure for use with dev_debug() etc */ -static struct device_driver driver = { - .name = "Trustonic" -}; - -static struct device device = { - .driver = &driver -}; - -struct mc_device_ctx g_ctx = { - .mcd = &device -}; - -/* device admin */ -static dev_t mc_dev_admin; -/* device user */ -static dev_t mc_dev_user; - -/* Need to discover a chrdev region for the driver */ -static struct cdev mc_user_cdev; -/* Device class for the driver assigned major */ -static struct class *mc_device_class; - -/* - * Get client object from file pointer - */ -static inline struct tbase_client *get_client(struct file *file) -{ - return (struct tbase_client *)file->private_data; -} - -/* - * Callback for system mmap() - */ -static int mc_fd_user_mmap(struct file *file, struct vm_area_struct *vmarea) -{ - struct tbase_client *client = get_client(file); - uint32_t len = (uint32_t)(vmarea->vm_end - vmarea->vm_start); - - /* Alloc contiguous buffer for this client */ - return api_malloc_cbuf(client, len, NULL, vmarea); -} - -/* - * Check r/w access to referenced memory - */ -static inline int ioctl_check_pointer(unsigned int cmd, int __user *uarg) -{ - int err = 0; - - if (_IOC_DIR(cmd) & _IOC_READ) - err = !access_ok(VERIFY_WRITE, uarg, _IOC_SIZE(cmd)); - else if (_IOC_DIR(cmd) & _IOC_WRITE) - err = !access_ok(VERIFY_READ, uarg, _IOC_SIZE(cmd)); - - if (err) - return -EFAULT; - - return 0; -} - -/* - * Callback for system ioctl() - * Implement most of ClientLib API functions - * @file pointer to file - * @cmd command - * @arg arguments - * - * Returns 0 for OK and an errno in case of error - */ -static long mc_fd_user_ioctl(struct file *file, unsigned int id, - unsigned long arg) -{ - struct tbase_client *client = get_client(file); - int __user *uarg = (int __user *)arg; - int ret = -EINVAL; - - MCDRV_DBG("%u from %s", _IOC_NR(id), current->comm); - - if (WARN(!client, "No client data available")) - return -EPROTO; - - if (ioctl_check_pointer(id, uarg)) - return -EFAULT; - - switch (id) { - case MC_IO_FREEZE: - /* Freeze the client */ - ret = api_freeze_device(client); - break; - - case MC_IO_OPEN_SESSION: { - struct mc_ioctl_open_sess sess; - - if (copy_from_user(&sess, uarg, sizeof(sess))) { - ret = -EFAULT; - break; - } - - ret = api_open_session(client, &sess.sid, &sess.uuid, sess.tci, - sess.tcilen, sess.is_gp_uuid, - &sess.identity); - if (ret) - break; - - if (copy_to_user(uarg, &sess, sizeof(sess))) { - ret = -EFAULT; - api_close_session(client, sess.sid); - break; - } - break; - } - case MC_IO_OPEN_TRUSTLET: { - struct mc_ioctl_open_trustlet ta_desc; - - if (copy_from_user(&ta_desc, uarg, sizeof(ta_desc))) { - ret = -EFAULT; - break; - } - - /* Call internal api */ - ret = api_open_trustlet(client, &ta_desc.sid, ta_desc.spid, - ta_desc.buffer, ta_desc.tlen, - ta_desc.tci, ta_desc.tcilen); - if (ret) - break; - - if (copy_to_user(uarg, &ta_desc, sizeof(ta_desc))) { - ret = -EFAULT; - api_close_session(client, ta_desc.sid); - break; - } - break; - } - case MC_IO_CLOSE_SESSION: { - uint32_t sid = (uint32_t)arg; - - ret = api_close_session(client, sid); - break; - } - case MC_IO_NOTIFY: { - uint32_t sid = (uint32_t)arg; - - ret = api_notify(client, sid); - break; - } - case MC_IO_WAIT: { - struct mc_ioctl_wait wait; - - if (copy_from_user(&wait, uarg, sizeof(wait))) { - ret = -EFAULT; - break; - } - ret = api_wait_notification(client, wait.sid, wait.timeout); - break; - } - case MC_IO_MAP: { - struct mc_ioctl_map map; - - if (copy_from_user(&map, uarg, sizeof(map))) { - ret = -EFAULT; - break; - } - ret = api_map_wsms(client, map.sid, map.bufs); - if (ret) - break; - - /* Fill in return struct */ - if (copy_to_user(uarg, &map, sizeof(map))) { - ret = -EFAULT; - api_unmap_wsms(client, map.sid, map.bufs); - break; - } - break; - } - case MC_IO_UNMAP: { - struct mc_ioctl_map map; - - if (copy_from_user(&map, uarg, sizeof(map))) { - ret = -EFAULT; - break; - } - - ret = api_unmap_wsms(client, map.sid, map.bufs); - break; - } - case MC_IO_ERR: { - struct mc_ioctl_geterr *uerr = (struct mc_ioctl_geterr *)uarg; - uint32_t sid; - int32_t exit_code; - - if (get_user(sid, &uerr->sid)) { - ret = -EFAULT; - break; - } - - ret = api_get_session_exitcode(client, sid, &exit_code); - if (ret) - break; - - /* Fill in return struct */ - if (put_user(exit_code, &uerr->value)) { - ret = -EFAULT; - break; - } - - break; - } - case MC_IO_VERSION: { - struct mc_version_info version_info; - - ret = mcp_get_version(&version_info); - if (ret) - break; - - if (copy_to_user(uarg, &version_info, sizeof(version_info))) - ret = -EFAULT; - - break; - } - case MC_IO_DR_VERSION: { - uint32_t version = MC_VERSION(MCDRVMODULEAPI_VERSION_MAJOR, - MCDRVMODULEAPI_VERSION_MINOR); - - ret = put_user(version, uarg); - break; - } - default: - MCDRV_ERROR("unsupported cmd=0x%x", id); - ret = -ENOIOCTLCMD; - } - - return ret; -} - -/* - * Callback for system open() - * A set of internal client data are created and initialized. - * - * @inode - * @file - * Returns 0 if OK or -ENOMEM if no allocation was possible. - */ -static int mc_fd_user_open(struct inode *inode, struct file *file) -{ - struct tbase_client *client; - - MCDRV_DBG("from %s", current->comm); - - /* Create client */ - client = api_open_device(false); - if (!client) - return -ENOMEM; - - /* Store client in user file */ - file->private_data = client; - return 0; -} - -/* - * Callback for system close() - * The client object is freed. - * @inode - * @file - * Returns 0 - */ -static int mc_fd_user_release(struct inode *inode, struct file *file) -{ - struct tbase_client *client = get_client(file); - - MCDRV_DBG("from %s", current->comm); - - if (WARN(!client, "No client data available")) - return -EPROTO; - - /* Detach client from user file */ - file->private_data = NULL; - - /* Destroy client, including remaining sessions */ - api_close_device(client); - return 0; -} - -static const struct file_operations mc_user_fops = { - .owner = THIS_MODULE, - .open = mc_fd_user_open, - .release = mc_fd_user_release, - .unlocked_ioctl = mc_fd_user_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = mc_fd_user_ioctl, -#endif - .mmap = mc_fd_user_mmap, -}; - -int kasnprintf(struct kasnprintf_buf *buf, const char *fmt, ...) -{ - va_list args; - int max_size = buf->size - buf->off; - int i; - - va_start(args, fmt); - i = vsnprintf(buf->buf + buf->off, max_size, fmt, args); - if (i >= max_size) { - int new_size = PAGE_ALIGN(buf->size + i + 1); - char *new_buf = krealloc(buf->buf, new_size, buf->gfp); - - if (!new_buf) { - i = -ENOMEM; - } else { - buf->buf = new_buf; - buf->size = new_size; - max_size = buf->size - buf->off; - i = vsnprintf(buf->buf + buf->off, max_size, fmt, args); - } - } - - if (i > 0) - buf->off += i; - - va_end(args); - return i; -} - -static ssize_t debug_info_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - /* Add/update buffer */ - if (!file->private_data || !*ppos) { - struct kasnprintf_buf *buf, *old_buf; - int ret; - - buf = kzalloc(GFP_KERNEL, sizeof(*buf)); - if (!buf) - return -ENOMEM; - - buf->gfp = GFP_KERNEL; - ret = api_info(buf); - if (ret < 0) { - kfree(buf); - return ret; - } - - old_buf = file->private_data; - file->private_data = buf; - kfree(old_buf); - } - - if (file->private_data) { - struct kasnprintf_buf *buf = file->private_data; - - return simple_read_from_buffer(user_buf, count, ppos, buf->buf, - buf->off); - } - - return 0; -} - -static int debug_info_release(struct inode *inode, struct file *file) -{ - kfree(file->private_data); - return 0; -} - -static const struct file_operations mc_debug_info_ops = { - .read = debug_info_read, - .llseek = default_llseek, - .release = debug_info_release, -}; - -static inline int device_admin_init(int (*tee_start_cb)(void)) -{ - int ret = 0; - - cdev_init(&mc_user_cdev, &mc_user_fops); - - mc_device_class = class_create(THIS_MODULE, "trustonic_tee"); - if (IS_ERR(mc_device_class)) { - MCDRV_ERROR("failed to create device class"); - return PTR_ERR(mc_device_class); - } - - /* Create the ADMIN node */ - ret = mc_admin_init(mc_device_class, &mc_dev_admin, tee_start_cb); - if (ret < 0) { - MCDRV_ERROR("failed to init mobicore device"); - class_destroy(mc_device_class); - return ret; - } - return 0; -} - -static inline int device_user_init(void) -{ - int ret = 0; - struct device *dev; - - mc_dev_user = MKDEV(MAJOR(mc_dev_admin), 1); - /* Create the user node */ - ret = cdev_add(&mc_user_cdev, mc_dev_user, 1); - if (ret) { - MCDRV_ERROR("user device register failed"); - goto err_cdev_add; - } - mc_user_cdev.owner = THIS_MODULE; - dev = device_create(mc_device_class, NULL, mc_dev_user, NULL, - MC_USER_DEVNODE); - if (IS_ERR(dev)) { - ret = PTR_ERR(dev); - goto err_device_create; - } - - /* Create debugfs info entry */ - debugfs_create_file("info", 0400, g_ctx.debug_dir, NULL, - &mc_debug_info_ops); - - return 0; - -err_device_create: - cdev_del(&mc_user_cdev); -err_cdev_add: - mc_admin_exit(mc_device_class); - class_destroy(mc_device_class); - MCDRV_DBG("failed with %d", ret); - return ret; -} - -static void devices_exit(void) -{ - device_destroy(mc_device_class, mc_dev_user); - cdev_del(&mc_user_cdev); - mc_admin_exit(mc_device_class); - class_destroy(mc_device_class); -} - -static inline int mobicore_start(void) -{ - int ret; - struct mc_version_info version_info; - - ret = mcp_start(); - if (ret) { - MCDRV_ERROR("TEE start failed"); - goto err_mcp; - } - - ret = mc_logging_start(); - if (ret) { - MCDRV_ERROR("Log start failed"); - goto err_log; - } - - ret = mc_scheduler_start(); - if (ret) { - MCDRV_ERROR("Scheduler start failed"); - goto err_sched; - } - - ret = mc_pm_start(); - if (ret) { - MCDRV_ERROR("Power Management start failed"); - goto err_pm; - } - - ret = mcp_get_version(&version_info); - if (ret) - goto err_mcp_cmd; - - MCDRV_DBG("\n" - " product_id = %s\n" - " version_so = 0x%x\n" - " version_mci = 0x%x\n" - " version_mclf = 0x%x\n" - " version_container = 0x%x\n" - " version_mc_config = 0x%x\n" - " version_tl_api = 0x%x\n" - " version_dr_api = 0x%x\n" - " version_cmp = 0x%x\n", - version_info.product_id, - version_info.version_mci, - version_info.version_so, - version_info.version_mclf, - version_info.version_container, - version_info.version_mc_config, - version_info.version_tl_api, - version_info.version_dr_api, - version_info.version_cmp); - - if (MC_VERSION_MAJOR(version_info.version_mci) > 1) { - pr_err("MCI version %d.%d is too recent for this driver", - MC_VERSION_MAJOR(version_info.version_mci), - MC_VERSION_MINOR(version_info.version_mci)); - goto err_version; - } - - if ((MC_VERSION_MAJOR(version_info.version_mci) == 0) && - (MC_VERSION_MINOR(version_info.version_mci) < 6)) { - pr_err("MCI version %d.%d is too old for this driver", - MC_VERSION_MAJOR(version_info.version_mci), - MC_VERSION_MINOR(version_info.version_mci)); - goto err_version; - } - - dev_info(g_ctx.mcd, "MobiCore MCI version is %d.%d\n", - MC_VERSION_MAJOR(version_info.version_mci), - MC_VERSION_MINOR(version_info.version_mci)); - - /* Determine which features are supported */ - switch (version_info.version_mci) { - case MC_VERSION(1, 2): /* 310 */ - g_ctx.f_client_login = true; - /* Fall through */ - case MC_VERSION(1, 1): - g_ctx.f_multimap = true; - /* Fall through */ - case MC_VERSION(1, 0): /* 302 */ - g_ctx.f_mem_ext = true; - g_ctx.f_ta_auth = true; - /* Fall through */ - case MC_VERSION(0, 7): - g_ctx.f_timeout = true; - /* Fall through */ - case MC_VERSION(0, 6): /* 301 */ - break; - } - - ret = device_user_init(); - if (ret) - goto err_create_dev_user; - - return 0; - -err_create_dev_user: -err_version: -err_mcp_cmd: - mc_pm_stop(); -err_pm: - mc_scheduler_stop(); -err_sched: - mc_logging_stop(); -err_log: - mcp_stop(); -err_mcp: - return ret; -} - -static inline void mobicore_stop(void) -{ - mc_pm_stop(); - mc_scheduler_stop(); - mc_logging_stop(); - mcp_stop(); -} - -/* - * This function is called by the kernel during startup or by a insmod command. - * This device is installed and registered as cdev, then interrupt and - * queue handling is set up - */ -static int mobicore_init(void) -{ - int err = 0; - - dev_set_name(g_ctx.mcd, "TEE"); - - /* Do not remove or change the following trace. - * The string "MobiCore" is used to detect if Cannot continue! */ - if (!has_security_extensions()) { - MCDRV_ERROR("Hardware doesn't support ARM TrustZone!"); - return -ENODEV; - } - - /* Running in secure mode -> Cannot load the driver! */ - if (is_secure_mode()) { - MCDRV_ERROR("Running in secure MODE!"); - return -ENODEV; - } - - /* Init common API layer */ - api_init(); - - /* Init plenty of nice features */ - err = mc_fastcall_init(); - if (err) { - MCDRV_ERROR("Fastcall support init failed!"); - goto fail_fastcall_init; - } - - err = mcp_init(); - if (err) { - MCDRV_ERROR("MCP init failed!"); - goto fail_mcp_init; - } - - err = mc_logging_init(); - if (err) { - MCDRV_ERROR("Log init failed!"); - goto fail_log_init; - } - - /* The scheduler is the first to create a debugfs entry */ - g_ctx.debug_dir = debugfs_create_dir("trustonic_tee", NULL); - err = mc_scheduler_init(); - if (err) { - MCDRV_ERROR("Scheduler init failed!"); - goto fail_mc_device_sched_init; - } - - /* - * Create admin dev so that daemon can already communicate with - * the driver - */ - err = device_admin_init(mobicore_start); - if (err) - goto fail_creat_dev_admin; - - return 0; - -fail_creat_dev_admin: - mc_scheduler_exit(); -fail_mc_device_sched_init: - debugfs_remove(g_ctx.debug_dir); - mc_logging_exit(); -fail_log_init: - mcp_exit(); -fail_mcp_init: - mc_fastcall_exit(); -fail_fastcall_init: - return err; -} - -/* - * This function removes this device driver from the Linux device manager . - */ -static void mobicore_exit(void) -{ - MCDRV_DBG("enter"); - - devices_exit(); - mobicore_stop(); - mc_scheduler_exit(); - mc_logging_exit(); - mcp_exit(); - mc_fastcall_exit(); - debugfs_remove_recursive(g_ctx.debug_dir); - - MCDRV_DBG("exit"); -} - -/* Linux Driver Module Macros */ - -#ifdef MC_DEVICE_PROPNAME - -static int mobicore_probe(struct platform_device *pdev) -{ - g_ctx.mcd->of_node = pdev->dev.of_node; - mobicore_init(); - return 0; -} - -static const struct of_device_id of_match_table[] = { - { .compatible = MC_DEVICE_PROPNAME }, - { } -}; - -static struct platform_driver mc_plat_driver = { - .probe = mobicore_probe, - .driver = { - .name = "mcd", - .owner = THIS_MODULE, - .of_match_table = of_match_table, - } -}; - -static int mobicore_register(void) -{ - return platform_driver_register(&mc_plat_driver); -} - -static void mobicore_unregister(void) -{ - platform_driver_unregister(&mc_plat_driver); - mobicore_exit(); -} - -module_init(mobicore_register); -module_exit(mobicore_unregister); - -#else /* MC_DEVICE_PROPNAME */ - -module_init(mobicore_init); -module_exit(mobicore_exit); - -#endif /* !MC_DEVICE_PROPNAME */ - -MODULE_AUTHOR("Trustonic Limited"); -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("MobiCore driver"); diff --git a/drivers/gud/MobiCoreDriver/main.h b/drivers/gud/MobiCoreDriver/main.h deleted file mode 100644 index cadc3d766147a..0000000000000 --- a/drivers/gud/MobiCoreDriver/main.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MC_MAIN_H_ -#define _MC_MAIN_H_ - -#include /* gfp_t */ - -#define MC_VERSION(major, minor) \ - (((major & 0x0000ffff) << 16) | (minor & 0x0000ffff)) -#define MC_VERSION_MAJOR(x) ((x) >> 16) -#define MC_VERSION_MINOR(x) ((x) & 0xffff) - -/* MobiCore Driver Kernel Module context data. */ -struct mc_device_ctx { - struct device *mcd; - /* debugfs root */ - struct dentry *debug_dir; - - /* GP sessions waiting final close notif */ - struct list_head closing_sess; - struct mutex closing_lock; /* Closing sessions list */ - - /* Features */ - /* - SWd can set a time out to get scheduled at a future time */ - bool f_timeout; - /* - SWd supports memory extension which allows for bigger TAs */ - bool f_mem_ext; - /* - SWd supports TA authorisation */ - bool f_ta_auth; - /* - SWd can map several buffers at once */ - bool f_multimap; - /* - SWd supports GP client authentication */ - bool f_client_login; -}; - -extern struct mc_device_ctx g_ctx; - -struct kasnprintf_buf { - gfp_t gfp; - void *buf; - int size; - int off; -}; - -extern __printf(2, 3) -int kasnprintf(struct kasnprintf_buf *buf, const char *fmt, ...); - -#endif /* _MC_MAIN_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mci/mcifc.h b/drivers/gud/MobiCoreDriver/mci/mcifc.h deleted file mode 100644 index 4848c9e047fba..0000000000000 --- a/drivers/gud/MobiCoreDriver/mci/mcifc.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef MCIFC_H_ -#define MCIFC_H_ - -#include "platform.h" - -/** @name MobiCore FastCall Defines - * Defines for the two different FastCall's. - */ -/** @{ */ - -#include "platform.h" - -/* --- global ---- */ -#define MC_FC_INVALID ((uint32_t)0) /**< Invalid FastCall ID */ - -#if defined(CONFIG_ARM64) && !defined(MC_ARMV7_FC) - -/* These should be handled as 64-bit FCs; now they are more like 32bits... */ -#define MC_FC_STD64_BASE ((uint32_t)0xFF000000) -#define MC_FC_STD64(x) ((uint32_t)(MC_FC_STD64_BASE + (x))) - -#define MC_FC_INIT MC_FC_STD64(1) /**< Initializing FastCall. */ -#define MC_FC_INFO MC_FC_STD64(2) /**< Info FastCall. */ -#define MC_FC_MEM_TRACE MC_FC_STD64(10) /**< Enable SWd tracing via memory */ -#define MC_FC_SWAP_CPU MC_FC_STD64(54) /**< Change new active Core */ - -#else - -#define MC_FC_INIT ((uint32_t)(-1)) /**< Initializing FastCall. */ -#define MC_FC_INFO ((uint32_t)(-2)) /**< Info FastCall. */ -#define MC_FC_MEM_TRACE ((uint32_t)(-31)) /**< Enable SWd tracing via memory */ -#define MC_FC_SWAP_CPU ((uint32_t)(0x84000005)) /**< Change new active Core */ - -#endif - -/** @} */ - -/** @name MobiCore SMC Defines - * Defines the different secure monitor calls (SMC) for world switching. - * @{ */ -/**< Yield to switch from NWd to SWd. */ -#define MC_SMC_N_YIELD 3 -/**< SIQ to switch from NWd to SWd. */ -#define MC_SMC_N_SIQ 4 -/** @} */ - -/** @name MobiCore status - * MobiCore status information. - * @{ */ -/**< MobiCore is not yet initialized. FastCall FcInit() to set up MobiCore.*/ -#define MC_STATUS_NOT_INITIALIZED 0 -/**< Bad parameters have been passed in FcInit(). */ -#define MC_STATUS_BAD_INIT 1 -/**< MobiCore did initialize properly. */ -#define MC_STATUS_INITIALIZED 2 -/**< MobiCore kernel halted due to an unrecoverable exception. Further - * information is available extended info */ -#define MC_STATUS_HALT 3 -/** @} */ - -/** @name Extended Info Identifiers - * Extended info parameters for MC_FC_INFO to obtain further information depending on MobiCore state. - * @{ */ -/**< Version of the MobiCore Control Interface (MCI) */ -#define MC_EXT_INFO_ID_MCI_VERSION 0 -/**< MobiCore control flags */ -#define MC_EXT_INFO_ID_FLAGS 1 -/**< MobiCore halt condition code */ -#define MC_EXT_INFO_ID_HALT_CODE 2 -/**< MobiCore halt condition instruction pointer */ -#define MC_EXT_INFO_ID_HALT_IP 3 -/**< MobiCore fault counter */ -#define MC_EXT_INFO_ID_FAULT_CNT 4 -/**< MobiCore last fault cause */ -#define MC_EXT_INFO_ID_FAULT_CAUSE 5 -/**< MobiCore last fault meta */ -#define MC_EXT_INFO_ID_FAULT_META 6 -/**< MobiCore last fault threadid */ -#define MC_EXT_INFO_ID_FAULT_THREAD 7 -/**< MobiCore last fault instruction pointer */ -#define MC_EXT_INFO_ID_FAULT_IP 8 -/**< MobiCore last fault stack pointer */ -#define MC_EXT_INFO_ID_FAULT_SP 9 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_DFSR 10 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_ADFSR 11 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_DFAR 12 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_IFSR 13 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_AIFSR 14 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_IFAR 15 -/**< MobiCore configured by Daemon via fc_init flag */ -#define MC_EXT_INFO_ID_MC_CONFIGURED 16 -/**< MobiCore scheduling status: idle/non-idle */ -#define MC_EXT_INFO_ID_MC_SCHED_STATUS 17 -/**< MobiCore runtime status: initialized, halted */ -#define MC_EXT_INFO_ID_MC_STATUS 18 -/**< MobiCore exception handler last partner */ -#define MC_EXT_INFO_ID_MC_EXC_PARTNER 19 -/**< MobiCore exception handler last peer */ -#define MC_EXT_INFO_ID_MC_EXC_IPCPEER 20 -/**< MobiCore exception handler last IPC message */ -#define MC_EXT_INFO_ID_MC_EXC_IPCMSG 21 -/**< MobiCore exception handler last IPC data */ -#define MC_EXT_INFO_ID_MC_EXC_IPCDATA 22 -/**< MobiCore exception handler last UUID (uses 4 slots: 23 to 26) */ -#define MC_EXT_INFO_ID_MC_EXC_UUID 23 -#define MC_EXT_INFO_ID_MC_EXC_UUID1 24 -#define MC_EXT_INFO_ID_MC_EXC_UUID2 25 -#define MC_EXT_INFO_ID_MC_EXC_UUID3 26 - -/** @} */ - -/** @name FastCall return values - * Return values of the MobiCore FastCalls. - * @{ */ -/**< No error. Everything worked fine. */ -#define MC_FC_RET_OK 0 -/**< FastCall was not successful. */ -#define MC_FC_RET_ERR_INVALID 1 -/**< MobiCore has already been initialized. */ -#define MC_FC_RET_ERR_ALREADY_INITIALIZED 5 -/** @} */ - -#endif /** MCIFC_H_ */ - -/** @} */ diff --git a/drivers/gud/MobiCoreDriver/mci/mcimcp.h b/drivers/gud/MobiCoreDriver/mci/mcimcp.h deleted file mode 100644 index 3eb2efea2c30c..0000000000000 --- a/drivers/gud/MobiCoreDriver/mci/mcimcp.h +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef MCP_H_ -#define MCP_H_ - -#include "mci/mcloadformat.h" - -/** Indicates a response */ -#define FLAG_RESPONSE BIT(31) - -/** Maximum number of buffers that can be mapped at once */ -#define MCP_MAP_MAX_BUF 4 - -/** MobiCore Return Code Defines. - * List of the possible MobiCore return codes. - */ -enum mcp_result { - /** Memory has successfully been mapped */ - MC_MCP_RET_OK = 0, - /** The session ID is invalid */ - MC_MCP_RET_ERR_INVALID_SESSION = 1, - /** The UUID of the Trustlet is unknown */ - MC_MCP_RET_ERR_UNKNOWN_UUID = 2, - /** The ID of the driver is unknown */ - MC_MCP_RET_ERR_UNKNOWN_DRIVER_ID = 3, - /** No more session are allowed */ - MC_MCP_RET_ERR_NO_MORE_SESSIONS = 4, - /** The container is invalid */ - MC_MCP_RET_ERR_CONTAINER_INVALID = 5, - /** The Trustlet is invalid */ - MC_MCP_RET_ERR_TRUSTLET_INVALID = 6, - /** The memory block has already been mapped before */ - MC_MCP_RET_ERR_ALREADY_MAPPED = 7, - /** Alignment or length error in the command parameters */ - MC_MCP_RET_ERR_INVALID_PARAM = 8, - /** No space left in the virtual address space of the session */ - MC_MCP_RET_ERR_OUT_OF_RESOURCES = 9, - /** WSM type unknown or broken WSM */ - MC_MCP_RET_ERR_INVALID_WSM = 10, - /** unknown error */ - MC_MCP_RET_ERR_UNKNOWN = 11, - /** Length of map invalid */ - MC_MCP_RET_ERR_INVALID_MAPPING_LENGTH = 12, - /** Map can only be applied to Trustlet session */ - MC_MCP_RET_ERR_MAPPING_TARGET = 13, - /** Couldn't open crypto session */ - MC_MCP_RET_ERR_OUT_OF_CRYPTO_RESOURCES = 14, - /** System Trustlet signature verification failed */ - MC_MCP_RET_ERR_SIGNATURE_VERIFICATION_FAILED = 15, - /** System Trustlet public key is wrong */ - MC_MCP_RET_ERR_WRONG_PUBLIC_KEY = 16, - /** Wrong containter type(s) */ - MC_MCP_RET_ERR_CONTAINER_TYPE_MISMATCH = 17, - /** Container is locked (or not activated) */ - MC_MCP_RET_ERR_CONTAINER_LOCKED = 18, - /** SPID is not registered with root container */ - MC_MCP_RET_ERR_SP_NO_CHILD = 19, - /** UUID is not registered with sp container */ - MC_MCP_RET_ERR_TL_NO_CHILD = 20, - /** Unwrapping of root container failed */ - MC_MCP_RET_ERR_UNWRAP_ROOT_FAILED = 21, - /** Unwrapping of service provider container failed */ - MC_MCP_RET_ERR_UNWRAP_SP_FAILED = 22, - /** Unwrapping of Trustlet container failed */ - MC_MCP_RET_ERR_UNWRAP_TRUSTLET_FAILED = 23, - /** Container version mismatch */ - MC_MCP_RET_ERR_CONTAINER_VERSION_MISMATCH = 24, - /** Decryption of service provider trustlet failed */ - MC_MCP_RET_ERR_SP_TL_DECRYPTION_FAILED = 25, - /** Hash check of service provider trustlet failed */ - MC_MCP_RET_ERR_SP_TL_HASH_CHECK_FAILED = 26, - /** Activation/starting of task failed */ - MC_MCP_RET_ERR_LAUNCH_TASK_FAILED = 27, - /** Closing of task not yet possible, try again later */ - MC_MCP_RET_ERR_CLOSE_TASK_FAILED = 28, - /**< Service is blocked and a session cannot be opened to it */ - MC_MCP_RET_ERR_SERVICE_BLOCKED = 29, - /**< Service is locked and a session cannot be opened to it */ - MC_MCP_RET_ERR_SERVICE_LOCKED = 30, - /**< Service was forcefully killed (due to an administrative command) */ - MC_MCP_RET_ERR_SERVICE_KILLED = 31, - /** The command is unknown */ - MC_MCP_RET_ERR_UNKNOWN_COMMAND = 50, - /** The command data is invalid */ - MC_MCP_RET_ERR_INVALID_DATA = 51 -}; - -/** Possible MCP Command IDs - * Command ID must be between 0 and 0x7FFFFFFF. - */ -enum cmd_id { - /** Invalid command ID */ - MC_MCP_CMD_ID_INVALID = 0x00, - /** Open a session */ - MC_MCP_CMD_OPEN_SESSION = 0x01, - /** Close an existing session */ - MC_MCP_CMD_CLOSE_SESSION = 0x03, - /** Map WSM to session */ - MC_MCP_CMD_MAP = 0x04, - /** Unmap WSM from session */ - MC_MCP_CMD_UNMAP = 0x05, - /** Prepare for suspend */ - MC_MCP_CMD_SUSPEND = 0x06, - /** Resume from suspension */ - MC_MCP_CMD_RESUME = 0x07, - /** Get MobiCore version information */ - MC_MCP_CMD_GET_MOBICORE_VERSION = 0x09, - /** Close MCP and unmap MCI */ - MC_MCP_CMD_CLOSE_MCP = 0x0A, - /** Load token for device attestation */ - MC_MCP_CMD_LOAD_TOKEN = 0x0B, - /** Check that TA can be loaded */ - MC_MCP_CMD_CHECK_LOAD_TA = 0x0C, - /** Map multiple WSMs to session */ - MC_MCP_CMD_MULTIMAP = 0x0D, - /** Unmap multiple WSMs to session */ - MC_MCP_CMD_MULTIUNMAP = 0x0E, -}; - -/* - * Types of WSM known to the MobiCore. - */ -#define WSM_TYPE_MASK 0xFF -#define WSM_INVALID 0 /** Invalid memory type */ -#define WSM_L2 2 /** Buffer mapping uses L2/L3 table */ -#define WSM_L1 3 /** Buffer mapping uses fake L1 table */ - -/** Magic number used to identify if Open Command supports GP client - * authentication. - */ -#define MC_GP_CLIENT_AUTH_MAGIC 0x47504131 /* "GPA1" */ - -/** Command header. - * It just contains the command ID. Only values specified in cmd_id are - * allowed as command IDs. If the command ID is unspecified the MobiCore - * returns an empty response with the result set to - * MC_MCP_RET_ERR_UNKNOWN_COMMAND. - */ -struct cmd_header { - enum cmd_id cmd_id; /** Command ID of the command */ -}; - -/** Response header. - * MobiCore will reply to every MCP command with an MCP response. Like the MCP - * command the response consists of a header followed by response data. The - * response is written to the same memory location as the MCP command. - */ -struct rsp_header { - uint32_t rsp_id; /** Command ID | FLAG_RESPONSE */ - enum mcp_result result; /** Result of the command execution */ -}; - -/** @defgroup CMD MCP Commands - */ - -/** @defgroup ASMCMD Administrative Commands - */ - -/** @defgroup MCPGETMOBICOREVERSION GET_MOBICORE_VERSION - * Get MobiCore version info. - * - */ - -/** Get MobiCore Version Command */ -struct cmd_get_version { - struct cmd_header cmd_header; /** Command header */ -}; - -/** Get MobiCore Version Command Response */ -struct rsp_get_version { - struct rsp_header rsp_header; /** Response header */ - struct mc_version_info version_info; /** MobiCore version info */ -}; - -/** @defgroup POWERCMD Power Management Commands - */ - -/** @defgroup MCPSUSPEND SUSPEND - * Prepare MobiCore suspension. - * This command allows MobiCore and MobiCore drivers to release or clean - * resources and save device state. - * - */ - -/** Suspend Command */ -struct cmd_suspend { - struct cmd_header cmd_header; /** Command header */ -}; - -/** Suspend Command Response */ -struct rsp_suspend { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPRESUME RESUME - * Resume MobiCore from suspension. - * This command allows MobiCore and MobiCore drivers to reinitialize hardware - * affected by suspension. - * - */ - -/** Resume Command */ -struct cmd_resume { - struct cmd_header cmd_header; /** Command header */ -}; - -/** Resume Command Response */ -struct rsp_resume { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup SESSCMD Session Management Commands - */ - -/** @defgroup MCPOPEN OPEN - * Load and open a session to a Trustlet. - * The OPEN command loads Trustlet data to the MobiCore context and opens a - * session to the Trustlet. If wsm_data_type is WSM_INVALID MobiCore tries to - * start a pre-installed Trustlet associated with the uuid passed. The uuid - * passed must match the uuid contained in the load data (if available). - * On success, MobiCore returns the session ID which can be used for further - * communication. - */ - -/** GP client authentication data */ -struct cmd_open_data { - uint32_t mclf_magic; /** ASCII "MCLF" on older versions */ - struct identity identity; /** Login method and data */ -}; - -/** Open Command */ -struct cmd_open { - struct cmd_header cmd_header; /** Command header */ - struct mc_uuid_t uuid; /** Service UUID */ - uint8_t unused[4]; /** Padding to be 64-bit aligned */ - uint64_t adr_tci_buffer; /** Physical address of the TCI MMU */ - uint64_t adr_load_data; /** Physical address of the data MMU */ - uint32_t ofs_tci_buffer; /** Offset to the data */ - uint32_t len_tci_buffer; /** Length of the TCI */ - uint32_t wsmtype_tci; /** Type of WSM used for the TCI */ - uint32_t wsm_data_type; /** Type of MMU */ - uint32_t ofs_load_data; /** Offset to the data */ - uint32_t len_load_data; /** Length of the data to load */ - union { - struct cmd_open_data cmd_open_data; /** Client login data */ - union mclf_header tl_header; /** Service header */ - }; - uint32_t is_gpta; /** true if looking for an SD/GP-TA */ -}; - -/** Open Command Response */ -struct rsp_open { - struct rsp_header rsp_header; /** Response header */ - uint32_t session_id; /** Session ID */ -}; - -/** TA Load Check Command */ -struct cmd_check_load { - struct cmd_header cmd_header; /** Command header */ - struct mc_uuid_t uuid; /** Service UUID */ - uint64_t adr_load_data; /** Physical address of the data */ - uint32_t wsm_data_type; /** Type of MMU */ - uint32_t ofs_load_data; /** Offset to the data */ - uint32_t len_load_data; /** Length of the data to load */ - union mclf_header tl_header; /** Service header */ -}; - -/** TA Load Check Response */ -struct rsp_check_load { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPCLOSE CLOSE - * Close an existing session to a Trustlet. - * The CLOSE command terminates a session and frees all resources in the - * MobiCore system which are currently occupied by the session. Before closing - * the session, the MobiCore runtime management waits until all pending - * operations, like calls to drivers, invoked by the Trustlet have been - * terminated. Mapped memory will automatically be unmapped from the MobiCore - * context. The NWd is responsible for processing the freed memory according to - * the Rich-OS needs. - * - */ - -/** Close Command */ -struct cmd_close { - struct cmd_header cmd_header; /** Command header */ - uint32_t session_id; /** Session ID */ -}; - -/** Close Command Response */ -struct rsp_close { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPMAP MAP - * Map a portion of memory to a session. - * The MAP command provides a block of memory to the context of a service. - * The memory then becomes world-shared memory (WSM). - * The only allowed memory type here is WSM_L2. - */ - -/** Map Command */ -struct cmd_map { - struct cmd_header cmd_header; /** Command header */ - uint32_t session_id; /** Session ID */ - uint32_t wsm_type; /** Type of MMU */ - uint32_t ofs_buffer; /** Offset to the payload */ - uint64_t adr_buffer; /** Physical address of the MMU */ - uint32_t len_buffer; /** Length of the buffer */ -}; - -#define MCP_MAP_MAX 0x100000 /** Maximum length for MCP map */ - -/** Map Command Response */ -struct rsp_map { - struct rsp_header rsp_header; /** Response header */ - /** Virtual address the WSM is mapped to, may include an offset! */ - uint32_t secure_va; -}; - -/** @defgroup MCPUNMAP UNMAP - * Unmap a portion of world-shared memory from a session. - * The UNMAP command is used to unmap a previously mapped block of - * world shared memory from the context of a session. - * - * Attention: The memory block will be immediately unmapped from the specified - * session. If the service is still accessing the memory, the service will - * trigger a segmentation fault. - */ - -/** Unmap Command */ -struct cmd_unmap { - struct cmd_header cmd_header; /** Command header */ - uint32_t session_id; /** Session ID */ - uint32_t wsm_type; /** Type of WSM used of the memory */ - /** Virtual address the WSM is mapped to, may include an offset! */ - uint32_t secure_va; - uint32_t virtual_buffer_len; /** Length of virtual buffer */ -}; - -/** Unmap Command Response */ -struct rsp_unmap { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPLOADTOKEN - * Load a token from the normal world and share it with type of - * function. elementCnt must be a power of two and the power needs - * to be smaller than power of uint32_t (obviously 32). - */ -struct notification_queue { - struct notification_queue_header hdr; /** Queue header */ - struct notification notification[MIN_NQ_ELEM]; /** Elements */ -}; - -#endif /** NQ_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mci/mcloadformat.h b/drivers/gud/MobiCoreDriver/mci/mcloadformat.h deleted file mode 100644 index f12f618bb0dc6..0000000000000 --- a/drivers/gud/MobiCoreDriver/mci/mcloadformat.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef MCLOADFORMAT_H_ -#define MCLOADFORMAT_H_ - -/** Trustlet Blob length info */ -#define MC_TLBLOBLEN_MAGIC 0x7672746C /* Magic for SWd: vrtl */ -#define MAX_SO_CONT_SIZE 512 /* Max size for a container */ - -/** MCLF flags */ -/**< Loaded service cannot be unloaded from MobiCore. */ -#define MC_SERVICE_HEADER_FLAGS_PERMANENT BIT(0) -/**< Service has no WSM control interface. */ -#define MC_SERVICE_HEADER_FLAGS_NO_CONTROL_INTERFACE BIT(1) -/**< Service can be debugged. */ -#define MC_SERVICE_HEADER_FLAGS_DEBUGGABLE BIT(2) -/**< New-layout trusted application or trusted driver. */ -#define MC_SERVICE_HEADER_FLAGS_EXTENDED_LAYOUT BIT(3) - -/** Service type. - * The service type defines the type of executable. - */ -enum service_type { - SERVICE_TYPE_ILLEGAL = 0, - SERVICE_TYPE_DRIVER = 1, - SERVICE_TYPE_SP_TRUSTLET = 2, - SERVICE_TYPE_SYSTEM_TRUSTLET = 3, - SERVICE_TYPE_MIDDLEWARE = 4, - SERVICE_TYPE_LAST_ENTRY = 5, -}; - -/** - * Descriptor for a memory segment. - */ -struct segment_descriptor { - uint32_t start; /**< Virtual start address */ - uint32_t len; /**< Segment length in bytes */ -}; - -/** - * MCLF intro for data structure identification. - * Must be the first element of a valid MCLF file. - */ -struct mclf_intro { - uint32_t magic; /**< Header magic value ASCII "MCLF" */ - uint32_t version; /**< Version the MCLF header struct */ -}; - -/** - * @defgroup MCLF_VER_V2 MCLF Version 32 - * @ingroup MCLF_VER - * - * @addtogroup MCLF_VER_V2 - */ - -/* - * GP TA identity. - */ -struct identity { - /**< GP TA login type */ - uint32_t login_type; - /**< GP TA login data */ - uint8_t login_data[16]; -}; - -/** - * Version 2.1/2.2 MCLF header. - */ -struct mclf_header_v2 { - /**< MCLF header start with the mandatory intro */ - struct mclf_intro intro; - /**< Service flags */ - uint32_t flags; - /**< Type of memory the service must be executed from */ - uint32_t mem_type; - /**< Type of service */ - enum service_type service_type; - /**< Number of instances which can be run simultaneously */ - uint32_t num_instances; - /**< Loadable service unique identifier (UUID) */ - struct mc_uuid_t uuid; - /**< If the service_type is SERVICE_TYPE_DRIVER the Driver ID is used */ - uint32_t driver_id; - /**< - * Number of threads (N) in a service: - * SERVICE_TYPE_SP_TRUSTLET: N = 1 - * SERVICE_TYPE_SYSTEM_TRUSTLET: N = 1 - * SERVICE_TYPE_DRIVER: N >= 1 - */ - uint32_t num_threads; - /**< Virtual text segment */ - struct segment_descriptor text; - /**< Virtual data segment */ - struct segment_descriptor data; - /**< Length of the BSS segment in bytes. MUST be at least 8 byte */ - uint32_t bss_len; - /**< Virtual start address of service code */ - uint32_t entry; - /**< Version of the interface the driver exports */ - uint32_t service_version; -}; - -/** - * @addtogroup MCLF - */ - -/** MCLF header */ -union mclf_header { - /**< Intro for data identification */ - struct mclf_intro intro; - /**< Version 2 header */ - struct mclf_header_v2 mclf_header_v2; -}; - -struct mc_blob_len_info { - uint32_t magic; /**< New blob format magic number */ - uint32_t root_size; /**< Root container size */ - uint32_t sp_size; /**< SP container size */ - uint32_t ta_size; /**< TA container size */ - uint32_t reserved[4]; /**< Reserved for further Use */ -}; - -#endif /* MCLOADFORMAT_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mcp.c b/drivers/gud/MobiCoreDriver/mcp.c deleted file mode 100644 index 693fd42e2d4b5..0000000000000 --- a/drivers/gud/MobiCoreDriver/mcp.c +++ /dev/null @@ -1,1067 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "mci/mcimcp.h" -#include "mci/mcifc.h" -#include "mci/mcinq.h" /* SID_MCP */ - -#include "platform.h" /* IRQ number */ -#include "fastcall.h" -#include "debug.h" -#include "logging.h" -#include "mcp.h" - -/* respond timeout for MCP notification, in secs */ -#define MCP_TIMEOUT 10 -#define MCP_RETRIES 5 -#define MCP_NF_QUEUE_SZ 8 -#define NQ_NUM_ELEMS 16 - -static void mc_irq_worker(struct work_struct *data); -DECLARE_WORK(irq_work, mc_irq_worker); - -static const struct { - unsigned int index; - const char *msg; -} status_map[] = { - /**< MobiCore control flags */ - { MC_EXT_INFO_ID_FLAGS, "flags"}, - /**< MobiCore halt condition code */ - { MC_EXT_INFO_ID_HALT_CODE, "haltCode"}, - /**< MobiCore halt condition instruction pointer */ - { MC_EXT_INFO_ID_HALT_IP, "haltIp"}, - /**< MobiCore fault counter */ - { MC_EXT_INFO_ID_FAULT_CNT, "faultRec.cnt"}, - /**< MobiCore last fault cause */ - { MC_EXT_INFO_ID_FAULT_CAUSE, "faultRec.cause"}, - /**< MobiCore last fault meta */ - { MC_EXT_INFO_ID_FAULT_META, "faultRec.meta"}, - /**< MobiCore last fault threadid */ - { MC_EXT_INFO_ID_FAULT_THREAD, "faultRec.thread"}, - /**< MobiCore last fault instruction pointer */ - { MC_EXT_INFO_ID_FAULT_IP, "faultRec.ip"}, - /**< MobiCore last fault stack pointer */ - { MC_EXT_INFO_ID_FAULT_SP, "faultRec.sp"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_DFSR, "faultRec.arch.dfsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_ADFSR, "faultRec.arch.adfsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_DFAR, "faultRec.arch.dfar"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_IFSR, "faultRec.arch.ifsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_AIFSR, "faultRec.arch.aifsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_IFAR, "faultRec.arch.ifar"}, - /**< MobiCore configured by Daemon via fc_init flag */ - { MC_EXT_INFO_ID_MC_CONFIGURED, "mcData.flags"}, - /**< MobiCore exception handler last partner */ - { MC_EXT_INFO_ID_MC_EXC_PARTNER, "mcExcep.partner"}, - /**< MobiCore exception handler last peer */ - { MC_EXT_INFO_ID_MC_EXC_IPCPEER, "mcExcep.peer"}, - /**< MobiCore exception handler last IPC message */ - { MC_EXT_INFO_ID_MC_EXC_IPCMSG, "mcExcep.cause"}, - /**< MobiCore exception handler last IPC data */ - {MC_EXT_INFO_ID_MC_EXC_IPCDATA, "mcExcep.meta"}, -}; - -static struct mcp_context { - struct mutex buffer_lock; /* Lock on SWd communication buffer */ - struct mutex queue_lock; /* Lock for MCP messages */ - struct mcp_buffer *mcp_buffer; - struct tbase_session *session; - struct completion complete; - bool mcp_dead; - int irq; - int (*scheduler_cb)(enum mcp_scheduler_commands); - void (*crashhandler_cb)(void); - /* MobiCore MCI information */ - unsigned int order; - union { - void *base; - struct { - struct notification_queue *tx; - struct notification_queue *rx; - } nq; - }; - /* - * This notifications list is to be used to queue notifications when the - * notification queue overflows, so no session gets its notification - * lost, especially MCP. - */ - struct mutex notifications_mutex; - struct list_head notifications; - struct mcp_session mcp_session; /* Pseudo session for MCP */ - /* Unexpected notification (during MCP open) */ - struct mutex unexp_notif_mutex; - struct notification unexp_notif; - /* Sessions */ - struct mutex sessions_lock; - struct list_head sessions; - /* Dump buffer */ - struct kasnprintf_buf dump; -} mcp_ctx; - -static inline void mark_mcp_dead(void) -{ - mcp_ctx.mcp_dead = true; - complete(&mcp_ctx.complete); -} - -static inline int mcp_set_sleep_mode_rq(uint16_t sleep_req) -{ - mutex_lock(&mcp_ctx.buffer_lock); - mcp_ctx.mcp_buffer->mc_flags.sleep_mode.sleep_req = sleep_req; - mutex_unlock(&mcp_ctx.buffer_lock); - return 0; -} - -static ssize_t debug_crashdump_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - if (mcp_ctx.dump.off) - return simple_read_from_buffer(user_buf, count, ppos, - mcp_ctx.dump.buf, - mcp_ctx.dump.off); - - return 0; -} - -static const struct file_operations mc_debug_crashdump_ops = { - .read = debug_crashdump_read, - .llseek = default_llseek, -}; - -static void mcp_dump_mobicore_status(void) -{ - char uuid_str[33]; - int ret = 0; - int i; - - if (mcp_ctx.dump.off) - ret = -EBUSY; - - /* read additional info about exception-point and print */ - dev_err(g_ctx.mcd, "= 0) - ret = kasnprintf(&mcp_ctx.dump, - "%-20s= 0x%08x\n", - status_map[i].msg, info); - } - } - - /* construct UUID string */ - for (i = 0; i < 4; i++) { - uint32_t info; - int j; - - if (mc_fc_info(MC_EXT_INFO_ID_MC_EXC_UUID + i, NULL, &info)) - return; - - for (j = 0; j < sizeof(info); j++) { - snprintf(&uuid_str[(i * sizeof(info) + j) * 2], 3, - "%02x", (info >> (j * 8)) & 0xff); - } - } - - dev_err(g_ctx.mcd, " %-20s= 0x%s\n", "mcExcep.uuid", uuid_str); - if (ret >= 0) - ret = kasnprintf(&mcp_ctx.dump, "%-20s= 0x%s\n", "mcExcep.uuid", - uuid_str); - - if (ret < 0) { - kfree(mcp_ctx.dump.buf); - mcp_ctx.dump.off = 0; - return; - } - - debugfs_create_file("crashdump", 0400, g_ctx.debug_dir, NULL, - &mc_debug_crashdump_ops); - if (mcp_ctx.crashhandler_cb) - mcp_ctx.crashhandler_cb(); -} - -void mcp_session_init(struct mcp_session *session, bool is_gp, - const struct identity *identity) -{ - /* close_work is initialized by the caller */ - INIT_LIST_HEAD(&session->list); - INIT_LIST_HEAD(&session->notifications_list); - mutex_init(&session->notif_wait_lock); - init_completion(&session->completion); - mutex_init(&session->exit_code_lock); - session->state = MCP_SESSION_RUNNING; - session->is_gp = is_gp; - if (is_gp) - session->identity = *identity; -} - -static inline bool mcp_session_isrunning(struct mcp_session *session) -{ - bool ret; - - mutex_lock(&mcp_ctx.sessions_lock); - ret = session->state == MCP_SESSION_RUNNING; - mutex_unlock(&mcp_ctx.sessions_lock); - return ret; -} - -/* - * session remains valid thanks to the upper layers reference counters, but the - * SWd session may have died, in which case we are informed. - */ -int mcp_session_waitnotif(struct mcp_session *session, int32_t timeout) -{ - int ret = 0; - - mutex_lock(&session->notif_wait_lock); - if (!mcp_session_isrunning(session)) { - ret = -ENXIO; - goto end; - } - - if (mcp_session_exitcode(session)) { - ret = -ECOMM; - goto end; - } - - if (timeout < 0) { - ret = wait_for_completion_interruptible(&session->completion); - if (ret) - goto end; - } else { - ret = wait_for_completion_interruptible_timeout( - &session->completion, timeout * HZ / 1000); - if (ret < 0) - /* Interrupted */ - goto end; - - if (!ret) { - /* Timed out */ - ret = -ETIME; - goto end; - } - - ret = 0; - } - - if (mcp_session_exitcode(session)) { - ret = -ECOMM; - goto end; - } - - if (!mcp_session_isrunning(session)) { - ret = -ENXIO; - goto end; - } - -end: - mutex_unlock(&session->notif_wait_lock); - if (ret) - dev_info(g_ctx.mcd, "%s session %x ec %d ret %d\n", __func__, - session->id, session->exit_code, ret); - - return ret; -} - -int32_t mcp_session_exitcode(struct mcp_session *session) -{ - int32_t exit_code; - - mutex_lock(&session->exit_code_lock); - exit_code = session->exit_code; - mutex_unlock(&session->exit_code_lock); - if (exit_code) - dev_info(g_ctx.mcd, "%s session %x ec %d\n", __func__, - session->id, exit_code); - - return exit_code; -} - -int mcp_suspend(void) -{ - return mcp_set_sleep_mode_rq(MC_FLAG_REQ_TO_SLEEP); -} - -int mcp_resume(void) -{ - return mcp_set_sleep_mode_rq(MC_FLAG_NO_SLEEP_REQ); -} - -bool mcp_suspended(void) -{ - struct mcp_flags *flags = &mcp_ctx.mcp_buffer->mc_flags; - bool ret; - - mutex_lock(&mcp_ctx.buffer_lock); - ret = flags->sleep_mode.ready_to_sleep & MC_STATE_READY_TO_SLEEP; - if (!ret) { - MCDRV_DBG("IDLE=%d!", flags->schedule); - MCDRV_DBG("Request Sleep=%d!", flags->sleep_mode.sleep_req); - MCDRV_DBG("Sleep Ready=%d!", flags->sleep_mode.ready_to_sleep); - } - - mutex_unlock(&mcp_ctx.buffer_lock); - return ret; -} - -bool mcp_get_idle_timeout(int32_t *timeout) -{ - uint32_t schedule; - bool ret; - - mutex_lock(&mcp_ctx.buffer_lock); - schedule = mcp_ctx.mcp_buffer->mc_flags.schedule; - if (schedule == MC_FLAG_SCHEDULE_IDLE) { - if (g_ctx.f_timeout) - *timeout = mcp_ctx.mcp_buffer->mc_flags.timeout_ms; - else - *timeout = -1; - - ret = true; - } else { - ret = false; - } - - mutex_unlock(&mcp_ctx.buffer_lock); - return ret; -} - -void mcp_reset_idle_timeout(void) -{ - mutex_lock(&mcp_ctx.buffer_lock); - mcp_ctx.mcp_buffer->mc_flags.timeout_ms = -1; - mutex_unlock(&mcp_ctx.buffer_lock); -} - -static inline int wait_mcp_notification(void) -{ - unsigned long timeout = msecs_to_jiffies(MCP_TIMEOUT * 1000); - int try; - - /* - * Total timeout is MCP_TIMEOUT * MCP_RETRIES, but we check for a crash - * to try and terminate before then if things go wrong. - */ - for (try = 1; try <= MCP_RETRIES; try++) { - uint32_t status; - int ret; - - /* - * Wait non-interruptible to keep MCP synchronised even if caller - * is interrupted by signal. - */ - ret = wait_for_completion_timeout(&mcp_ctx.complete, timeout); - if (ret > 0) - return 0; - - MCDRV_ERROR("No answer after %ds", MCP_TIMEOUT * try); - - /* If SWd halted, exit now */ - if (!mc_fc_info(MC_EXT_INFO_ID_MCI_VERSION, &status, NULL) && - (status == MC_STATUS_HALT)) - break; - } - - /* mcp_message; - enum cmd_id cmd_id = cmd->cmd_header.cmd_id; - - mutex_lock(&mcp_ctx.queue_lock); - if (mcp_ctx.mcp_dead) - goto out; - - /* Copy message to MCP buffer */ - memcpy(msg, cmd, sizeof(*msg)); - - /* Poke tbase */ - err = mcp_notify(&mcp_ctx.mcp_session); - if (!err) - err = wait_mcp_notification(); - - if (err) - goto out; - - /* Check response ID */ - if (msg->rsp_header.rsp_id != (cmd_id | FLAG_RESPONSE)) { - MCDRV_ERROR("MCP command got invalid response (0x%X)", - msg->rsp_header.rsp_id); - err = -EBADE; - goto out; - } - - /* Convert result */ - switch (msg->rsp_header.result) { - case MC_MCP_RET_OK: - err = 0; - break; - case MC_MCP_RET_ERR_CLOSE_TASK_FAILED: - case MC_MCP_RET_ERR_NO_MORE_SESSIONS: - err = -EBUSY; - break; - case MC_MCP_RET_ERR_OUT_OF_RESOURCES: - err = -ENOSPC; - break; - case MC_MCP_RET_ERR_UNKNOWN_UUID: - err = -ENOENT; - break; - case MC_MCP_RET_ERR_WRONG_PUBLIC_KEY: - err = -EKEYREJECTED; - break; - case MC_MCP_RET_ERR_SERVICE_BLOCKED: - err = -ECONNREFUSED; - break; - case MC_MCP_RET_ERR_SERVICE_LOCKED: - err = -ECONNABORTED; - break; - case MC_MCP_RET_ERR_SERVICE_KILLED: - err = -ECONNRESET; - break; - default: - MCDRV_ERROR("cmd %d returned %d.", cmd_id, - msg->rsp_header.result); - err = -EPERM; - goto out; - } - - /* Copy response back to caller struct */ - memcpy(cmd, msg, sizeof(*cmd)); - -out: - mutex_unlock(&mcp_ctx.queue_lock); - return err; -} - -int mcp_get_version(struct mc_version_info *version_info) -{ - union mcp_message cmd; - int ret; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_GET_MOBICORE_VERSION; - ret = mcp_cmd(&cmd); - if (!ret) - memcpy(version_info, &cmd.rsp_get_version.version_info, - sizeof(*version_info)); - - return ret; -} - -int mcp_load_token(uintptr_t data, const struct mcp_buffer_map *map) -{ - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_LOAD_TOKEN; - cmd.cmd_load_token.wsm_data_type = map->type; - cmd.cmd_load_token.adr_load_data = map->phys_addr; - cmd.cmd_load_token.ofs_load_data = map->offset; - cmd.cmd_load_token.len_load_data = map->length; - return mcp_cmd(&cmd); -} - -int mcp_load_check(const struct tbase_object *obj, - const struct mcp_buffer_map *map) -{ - const union mclf_header *header; - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_CHECK_LOAD_TA; - /* Data */ - cmd.cmd_check_load.wsm_data_type = map->type; - cmd.cmd_check_load.adr_load_data = map->phys_addr; - cmd.cmd_check_load.ofs_load_data = map->offset; - cmd.cmd_check_load.len_load_data = map->length; - /* Header */ - header = (union mclf_header *)(obj->data + obj->header_length); - cmd.cmd_check_load.uuid = header->mclf_header_v2.uuid; - return mcp_cmd(&cmd); -} - -int mcp_open_session(struct mcp_session *session, - const struct tbase_object *obj, - const struct mcp_buffer_map *map, - const struct mcp_buffer_map *tci_map) -{ - static DEFINE_MUTEX(local_mutex); - const union mclf_header *header; - union mcp_message cmd; - int ret; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_OPEN_SESSION; - /* Data */ - cmd.cmd_open.wsm_data_type = map->type; - cmd.cmd_open.adr_load_data = map->phys_addr; - cmd.cmd_open.ofs_load_data = map->offset; - cmd.cmd_open.len_load_data = map->length; - /* Buffer */ - if (tci_map) { - cmd.cmd_open.wsmtype_tci = tci_map->type; - cmd.cmd_open.adr_tci_buffer = tci_map->phys_addr; - cmd.cmd_open.ofs_tci_buffer = tci_map->offset; - cmd.cmd_open.len_tci_buffer = tci_map->length; - } else { - cmd.cmd_open.wsmtype_tci = WSM_INVALID; - } - /* Header */ - header = (union mclf_header *)(obj->data + obj->header_length); - cmd.cmd_open.uuid = header->mclf_header_v2.uuid; - cmd.cmd_open.is_gpta = session->is_gp; - /* Reset unexpected notification */ - mutex_lock(&local_mutex); - mcp_ctx.unexp_notif.session_id = SID_MCP; /* Cannot be */ - if (!g_ctx.f_client_login) { - memcpy(&cmd.cmd_open.tl_header, header, - sizeof(cmd.cmd_open.tl_header)); - } else { - cmd.cmd_open.cmd_open_data.mclf_magic = MC_GP_CLIENT_AUTH_MAGIC; - if (session->is_gp) - cmd.cmd_open.cmd_open_data.identity = session->identity; - } - - /* Send MCP open command */ - ret = mcp_cmd(&cmd); - if (!ret) { - session->id = cmd.rsp_open.session_id; - /* Add to list of sessions */ - mutex_lock(&mcp_ctx.sessions_lock); - list_add(&session->list, &mcp_ctx.sessions); - mutex_unlock(&mcp_ctx.sessions_lock); - /* Check for spurious notification */ - mutex_lock(&mcp_ctx.unexp_notif_mutex); - if (mcp_ctx.unexp_notif.session_id == session->id) { - mutex_lock(&session->exit_code_lock); - session->exit_code = mcp_ctx.unexp_notif.payload; - mutex_unlock(&session->exit_code_lock); - complete(&session->completion); - } - - mutex_unlock(&mcp_ctx.unexp_notif_mutex); - } - - mutex_unlock(&local_mutex); - return ret; -} - -/* - * Legacy and GP TAs close differently: - * - GP TAs always send a notification with payload, whether on close or crash - * - Legacy TAs only send a notification with payload on crash - * - GP TAs may take time to close, and we get -EBUSY back from mcp_cmd - * - Legacy TAs always close when asked, unless they are driver in which case - * they just don't close at all - */ -int mcp_close_session(struct mcp_session *session) -{ - union mcp_message cmd; - int ret; - - /* state is either MCP_SESSION_RUNNING or MCP_SESSION_CLOSING_GP */ - mutex_lock(&mcp_ctx.sessions_lock); - if (session->state == MCP_SESSION_RUNNING) - session->state = MCP_SESSION_CLOSE_PREPARE; - - mutex_unlock(&mcp_ctx.sessions_lock); - /* Signal an eventual waiter that SWd session is going away */ - complete(&session->completion); - /* Send MCP command */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_CLOSE_SESSION; - cmd.cmd_close.session_id = session->id; - ret = mcp_cmd(&cmd); - mutex_lock(&mcp_ctx.sessions_lock); - /* - * The GP TA may already have sent its exit code, in which case the - * state has also been changed to MCP_SESSION_CLOSE_NOTIFIED. - */ - if (!ret) { - session->state = MCP_SESSION_CLOSED; - list_del(&session->list); - mutex_lock(&mcp_ctx.notifications_mutex); - list_del(&session->notifications_list); - mutex_unlock(&mcp_ctx.notifications_mutex); - } else if (ret == -EBUSY) { - if (session->state == MCP_SESSION_CLOSE_NOTIFIED) - /* GP TA already closed */ - schedule_work(&session->close_work); - - session->state = MCP_SESSION_CLOSING_GP; - } else { - /* Something is not right, assume session is still running */ - session->state = MCP_SESSION_RUNNING; - } - - mutex_unlock(&mcp_ctx.sessions_lock); - return ret; -} - -int mcp_map(uint32_t session_id, struct mcp_buffer_map *map) -{ - union mcp_message cmd; - int ret; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_MAP; - cmd.cmd_map.session_id = session_id; - cmd.cmd_map.wsm_type = map->type; - cmd.cmd_map.adr_buffer = map->phys_addr; - cmd.cmd_map.ofs_buffer = map->offset; - cmd.cmd_map.len_buffer = map->length; - ret = mcp_cmd(&cmd); - if (!ret) - map->secure_va = cmd.rsp_map.secure_va; - - return ret; -} - -int mcp_unmap(uint32_t session_id, const struct mcp_buffer_map *map) -{ - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_UNMAP; - cmd.cmd_unmap.session_id = session_id; - cmd.cmd_unmap.wsm_type = map->type; - cmd.cmd_unmap.virtual_buffer_len = map->length; - cmd.cmd_unmap.secure_va = map->secure_va; - return mcp_cmd(&cmd); -} - -int mcp_multimap(uint32_t session_id, struct mcp_buffer_map *maps) -{ - struct mcp_buffer_map *map = maps; - union mcp_message cmd; - struct buffer_map *buf = cmd.cmd_multimap.bufs; - int ret = 0; - uint32_t i; - - /* Prepare command */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_MULTIMAP; - cmd.cmd_multimap.session_id = session_id; - for (i = 0; i < MC_MAP_MAX; i++, map++, buf++) { - buf->wsm_type = map->type; - buf->adr_buffer = map->phys_addr; - buf->ofs_buffer = map->offset; - buf->len_buffer = map->length; - } - - ret = mcp_cmd(&cmd); - if (ret) - return ret; - - /* Return secure virtual addresses */ - map = maps; - for (i = 0; i < MC_MAP_MAX; i++, map++) - map->secure_va = cmd.rsp_multimap.secure_va[i]; - - return 0; -} - -int mcp_multiunmap(uint32_t session_id, const struct mcp_buffer_map *maps) -{ - const struct mcp_buffer_map *map = maps; - union mcp_message cmd; - struct buffer_unmap *buf = cmd.cmd_multiunmap.bufs; - uint32_t i; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_MULTIUNMAP; - cmd.cmd_multiunmap.session_id = session_id; - for (i = 0; i < MC_MAP_MAX; i++, map++, buf++) { - buf->secure_va = map->secure_va; - buf->len_buffer = map->length; - } - - return mcp_cmd(&cmd); -} - -static int mcp_close(void) -{ - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_CLOSE_MCP; - return mcp_cmd(&cmd); -} - -static inline bool notif_queue_full(void) -{ - struct notification_queue *tx = mcp_ctx.nq.tx; - - return (tx->hdr.write_cnt - tx->hdr.read_cnt) == tx->hdr.queue_size; -} - -static inline void notif_queue_push(uint32_t session_id) -{ - struct notification_queue_header *hdr = &mcp_ctx.nq.tx->hdr; - uint32_t i = hdr->write_cnt % hdr->queue_size; - - mcp_ctx.nq.tx->notification[i].session_id = session_id; - mcp_ctx.nq.tx->notification[i].payload = 0; - hdr->write_cnt++; -} - -static inline bool mcp_notifications_flush_nolock(void) -{ - bool flushed = false; - - while (!list_empty(&mcp_ctx.notifications) && !notif_queue_full()) { - struct mcp_session *session; - - session = list_first_entry(&mcp_ctx.notifications, - struct mcp_session, - notifications_list); - dev_dbg(g_ctx.mcd, "pop %x\n", session->id); - notif_queue_push(session->id); - list_del_init(&session->notifications_list); - flushed = true; - } - - return flushed; -} - -bool mcp_notifications_flush(void) -{ - bool flushed = false; - - mutex_lock(&mcp_ctx.notifications_mutex); - flushed = mcp_notifications_flush_nolock(); - mutex_unlock(&mcp_ctx.notifications_mutex); - return flushed; -} - -int mcp_notify(struct mcp_session *session) -{ - int ret = 0; - - if (!mcp_ctx.scheduler_cb) - return -EAGAIN; - - mutex_lock(&mcp_ctx.notifications_mutex); - if (session->id == SID_MCP) - dev_dbg(g_ctx.mcd, "notify MCP"); - else - dev_dbg(g_ctx.mcd, "notify %x", session->id); - - /* Notify TEE */ - if (!list_empty(&mcp_ctx.notifications) || notif_queue_full()) { - if (!list_empty(&session->notifications_list)) { - ret = -EAGAIN; - dev_dbg(g_ctx.mcd, "skip %x\n", session->id); - } else { - list_add(&session->notifications_list, - &mcp_ctx.notifications); - dev_dbg(g_ctx.mcd, "push %x\n", session->id); - } - - mcp_notifications_flush_nolock(); - - if (mcp_ctx.scheduler_cb(MCP_YIELD)) { - MCDRV_ERROR("MC_SMC_N_YIELD failed"); - ret = -EPROTO; - } - } else { - notif_queue_push(session->id); - if (mcp_ctx.scheduler_cb(MCP_NSIQ)) { - MCDRV_ERROR("MC_SMC_N_SIQ failed"); - ret = -EPROTO; - } - } - - mutex_unlock(&mcp_ctx.notifications_mutex); - return ret; -} - -static inline void handle_mcp_notif(uint32_t exit_code) -{ - dev_dbg(g_ctx.mcd, "notification from MCP ec %d\n", exit_code); - complete(&mcp_ctx.complete); -} - -static inline void handle_session_notif(uint32_t session_id, uint32_t exit_code) -{ - struct mcp_session *session = NULL, *s; - - dev_dbg(g_ctx.mcd, "notification from %x ec %d\n", session_id, - exit_code); - mutex_lock(&mcp_ctx.sessions_lock); - list_for_each_entry(s, &mcp_ctx.sessions, list) { - if (s->id == session_id) { - session = s; - break; - } - } - - if (session) { - /* TA has terminated */ - if (exit_code) { - /* Update exit code, or not */ - mutex_lock(&session->exit_code_lock); - /* - * In GP, the only way to recover the sessions exit code - * is to call TEEC_InvokeCommand which will notify. But - * notifying a dead session would change the exit code - * to ERR_SID_NOT_ACTIVE, hence the check below. - */ - if (!session->is_gp || !session->exit_code || - (exit_code != ERR_SID_NOT_ACTIVE)) - session->exit_code = exit_code; - - mutex_unlock(&session->exit_code_lock); - - /* Update state or schedule close worker */ - if (session->state == MCP_SESSION_CLOSE_PREPARE) - session->state = MCP_SESSION_CLOSE_NOTIFIED; - else if (session->state == MCP_SESSION_CLOSING_GP) - schedule_work(&session->close_work); - } - - /* Unblock waiter */ - complete(&session->completion); - } - mutex_unlock(&mcp_ctx.sessions_lock); - - /* Unknown session, probably being started */ - if (!session) { - mutex_lock(&mcp_ctx.unexp_notif_mutex); - mcp_ctx.unexp_notif.session_id = session_id; - mcp_ctx.unexp_notif.payload = exit_code; - mutex_unlock(&mcp_ctx.unexp_notif_mutex); - } -} - -static void mc_irq_worker(struct work_struct *data) -{ - struct notification_queue *rx = mcp_ctx.nq.rx; - - /* Deal with all pending notifications in one go */ - while ((rx->hdr.write_cnt - rx->hdr.read_cnt) > 0) { - struct notification nf; - - nf = rx->notification[rx->hdr.read_cnt++ % rx->hdr.queue_size]; - if (nf.session_id == SID_MCP) - handle_mcp_notif(nf.payload); - else - handle_session_notif(nf.session_id, nf.payload); - } - - /* - * Finished processing notifications. It does not matter whether - * there actually were any notification or not. S-SIQs can also - * be triggered by an SWd driver which was waiting for a FIQ. - * In this case the S-SIQ tells NWd that SWd is no longer idle - * an will need scheduling again. - */ - if (mcp_ctx.scheduler_cb) - mcp_ctx.scheduler_cb(MCP_NSIQ); -} - -/* - * This function represents the interrupt function of the mcDrvModule. - * It signals by incrementing of an event counter and the start of the read - * waiting queue, the read function a interrupt has occurred. - */ -static irqreturn_t irq_handler(int intr, void *arg) -{ - /* wake up thread to continue handling this interrupt */ - schedule_work(&irq_work); - return IRQ_HANDLED; -} - -void mcp_register_scheduler(int (*scheduler_cb)(enum mcp_scheduler_commands)) -{ - mcp_ctx.scheduler_cb = scheduler_cb; -} - -void mcp_register_crashhandler(void (*crashhandler_cb)(void)) -{ - mcp_ctx.crashhandler_cb = crashhandler_cb; -} - -int mcp_start(void) -{ - size_t q_len = ALIGN(2 * (sizeof(struct notification_queue_header) + - NQ_NUM_ELEMS * sizeof(struct notification)), 4); - int ret; - - /* Make sure we have an interrupt number before going on */ -#if defined(CONFIG_OF) - mcp_ctx.irq = irq_of_parse_and_map(g_ctx.mcd->of_node, 0); -#endif -#if defined(MC_INTR_SSIQ) - if (mcp_ctx.irq <= 0) - mcp_ctx.irq = MC_INTR_SSIQ; -#endif - - if (mcp_ctx.irq <= 0) { - MCDRV_ERROR("No IRQ number, aborting"); - return -EINVAL; - } - - /* Call the INIT fastcall to setup shared buffers */ - ret = mc_fc_init(virt_to_phys(mcp_ctx.base), - (uintptr_t)mcp_ctx.mcp_buffer - - (uintptr_t)mcp_ctx.base, - q_len, sizeof(*mcp_ctx.mcp_buffer)); - if (ret) - return ret; - - /* First empty N-SIQ to setup of the MCI structure */ - ret = mc_fc_nsiq(); - if (ret) - return ret; - - /* - * Wait until (uint16_t)-1) { - MCDRV_DBG_WARN("queues too large (more than 64k), sorry..."); - return -EINVAL; - } - - mcp_ctx.order = get_order(q_len + sizeof(*mcp_ctx.mcp_buffer)); - mci = __get_free_pages(GFP_USER | __GFP_ZERO, mcp_ctx.order); - if (!mci) - return -ENOMEM; - - mcp_ctx.nq.tx = (struct notification_queue *)mci; - mcp_ctx.nq.tx->hdr.queue_size = NQ_NUM_ELEMS; - mci += sizeof(struct notification_queue_header) + - mcp_ctx.nq.tx->hdr.queue_size * sizeof(struct notification); - - mcp_ctx.nq.rx = (struct notification_queue *)mci; - mcp_ctx.nq.rx->hdr.queue_size = NQ_NUM_ELEMS; - mci += sizeof(struct notification_queue_header) + - mcp_ctx.nq.rx->hdr.queue_size * sizeof(struct notification); - - mcp_ctx.mcp_buffer = (void *)ALIGN(mci, 4); - return 0; -} - -void mcp_exit(void) -{ - mark_mcp_dead(); - if (mcp_ctx.dump.off) - kfree(mcp_ctx.dump.buf); - - free_pages((unsigned long)mcp_ctx.base, mcp_ctx.order); -} diff --git a/drivers/gud/MobiCoreDriver/mcp.h b/drivers/gud/MobiCoreDriver/mcp.h deleted file mode 100644 index 0eefe573de8bf..0000000000000 --- a/drivers/gud/MobiCoreDriver/mcp.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MC_MCP_H_ -#define _MC_MCP_H_ - -#include "mci/mcloadformat.h" /* struct identity */ - -/* Structure to hold the TA/driver descriptor to pass to MCP */ -struct tbase_object { - uint32_t length; /* Total length */ - uint32_t header_length; /* Length of header before payload */ - uint8_t data[]; /* Header followed by payload */ -}; - -/* Structure to hold all mapped buffer data to pass to MCP */ -struct mcp_buffer_map { - uint64_t phys_addr; /** Page-aligned physical address */ - uint64_t secure_va; /** Page-aligned physical address */ - uint32_t offset; /** Data offset inside the first page */ - uint32_t length; /** Length of the data */ - uint32_t type; /** Type of MMU */ -}; - -struct mcp_session { - /* Work descriptor to handle delayed closing, set by upper layer */ - struct work_struct close_work; - /* Sessions list (protected by mcp sessions_lock) */ - struct list_head list; - /* Notifications list (protected by mcp notifications_mutex) */ - struct list_head notifications_list; - /* Notification waiter lock */ - struct mutex notif_wait_lock; /* Only one at a time */ - /* Notification received */ - struct completion completion; - /* Notification lock */ - struct mutex exit_code_lock; - /* Last notification */ - int32_t exit_code; - /* Session id */ - uint32_t id; - /* Session state (protected by mcp sessions_lock) */ - enum mcp_session_state { - MCP_SESSION_RUNNING, - MCP_SESSION_CLOSE_PREPARE, - MCP_SESSION_CLOSE_NOTIFIED, - MCP_SESSION_CLOSING_GP, - MCP_SESSION_CLOSED, - } state; - /* This TA is of Global Platform type, set by upper layer */ - bool is_gp; - /* GP TAs have login information */ - struct identity identity; -}; - -/* Init for the mcp_session structure */ -void mcp_session_init(struct mcp_session *session, bool is_gp, - const struct identity *identity); -int mcp_session_waitnotif(struct mcp_session *session, int32_t timeout); -int32_t mcp_session_exitcode(struct mcp_session *mcp_session); - -/* SWd suspend/resume */ -int mcp_suspend(void); -int mcp_resume(void); -bool mcp_suspended(void); - -/* Callback to scheduler registration */ -enum mcp_scheduler_commands { - MCP_YIELD, - MCP_NSIQ, -}; - -void mcp_register_scheduler(int (*scheduler_cb)(enum mcp_scheduler_commands)); -bool mcp_notifications_flush(void); -void mcp_register_crashhandler(void (*crashhandler_cb)(void)); - -/* - * Get the requested SWd sleep timeout value (ms) - * - if the timeout is -1, wait indefinitely - * - if the timeout is 0, re-schedule immediately (timeouts in µs in the SWd) - * - otherwise sleep for the required time - * returns true if sleep is required, false otherwise - */ -bool mcp_get_idle_timeout(int32_t *timeout); -void mcp_reset_idle_timeout(void); - -/* MCP commands */ -int mcp_get_version(struct mc_version_info *version_info); -int mcp_load_token(uintptr_t data, const struct mcp_buffer_map *buffer_map); -int mcp_load_check(const struct tbase_object *obj, - const struct mcp_buffer_map *buffer_map); -int mcp_open_session(struct mcp_session *session, - const struct tbase_object *obj, - const struct mcp_buffer_map *map, - const struct mcp_buffer_map *tci_map); -int mcp_close_session(struct mcp_session *session); -int mcp_map(uint32_t session_id, struct mcp_buffer_map *buffer_map); -int mcp_unmap(uint32_t session_id, const struct mcp_buffer_map *buffer_map); -int mcp_multimap(uint32_t session_id, struct mcp_buffer_map *buffer_maps); -int mcp_multiunmap(uint32_t session_id, - const struct mcp_buffer_map *buffer_maps); -int mcp_notify(struct mcp_session *mcp_session); - -/* MCP initialisation/cleanup */ -int mcp_init(void); -void mcp_exit(void); -int mcp_start(void); -void mcp_stop(void); - -#endif /* _MC_MCP_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mmu.c b/drivers/gud/MobiCoreDriver/mmu.c deleted file mode 100644 index fc769be4d15db..0000000000000 --- a/drivers/gud/MobiCoreDriver/mmu.c +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "mci/mcimcp.h" - -#include "platform.h" /* CONFIG_TRUSTONIC_TEE_LPAE */ -#include "main.h" -#include "debug.h" -#include "mcp.h" /* mcp_buffer_map */ -#include "mmu.h" - -#ifdef CONFIG_TRUSTONIC_TEE_LPAE -#define MMU_TYPE_PAGE (3 << 0) -#define MMU_BUFFERABLE BIT(2) /* AttrIndx[0] */ -#define MMU_CACHEABLE BIT(3) /* AttrIndx[1] */ -#define MMU_NS BIT(5) -#define MMU_AP_RW_ALL BIT(6) /* AP[2:1], RW, at any privilege level */ -#define MMU_EXT_SHARED (3 << 8) /* SH[1:0], inner shareable */ -#define MMU_EXT_AF BIT(10) /* Access Flag */ -#define MMU_EXT_NG BIT(11) -#define MMU_EXT_XN (((uint64_t)1) << 54) /* XN */ -#else -#define MMU_TYPE_EXT (3 << 0) /* v5 */ -#define MMU_TYPE_SMALL (2 << 0) -#define MMU_BUFFERABLE BIT(2) -#define MMU_CACHEABLE BIT(3) -#define MMU_EXT_AP0 BIT(4) -#define MMU_EXT_AP1 (2 << 4) -#define MMU_EXT_TEX(x) ((x) << 6) /* v5 */ -#define MMU_EXT_SHARED BIT(10) /* v6 */ -#define MMU_EXT_NG BIT(11) /* v6 */ -#endif - -/* - * MobiCore specific page tables for world shared memory. - * Linux uses shadow page tables, see arch/arm/include/asm/pgtable-2level. - * MobiCore uses the default ARM format. - * - * Number of page table entries in one L2 MMU table. This is ARM specific, an - * MMU table covers 1 MiB by using 256 entries referring to 4KiB pages each. - */ -#define L2_ENTRIES_MAX 256 - -/* - * Small buffers (below 1MiB) are mapped using the legacy L2 table, but bigger - * buffers now use a fake L1 table that holds 64-bit pointers to L2 tables. As - * this must be exactly one page, we can hold up to 512 entries. - */ -#define L1_ENTRIES_MAX 512 - -#ifdef CONFIG_TRUSTONIC_TEE_LPAE - -/* - * Secure world uses 64-bit physical addresses - */ -typedef u64 tbase_pte_t; - -/* - * Linux uses different mappings for SMP systems(the sharing flag is set for - * the pte. In order not to confuse things too much in Mobicore make sure the - * shared buffers have the same flags. This should also be done in SWD side. - */ -static tbase_pte_t pte_flags = MMU_BUFFERABLE | MMU_CACHEABLE | MMU_EXT_NG | -#ifdef CONFIG_SMP - MMU_EXT_SHARED | -#endif /* CONFIG_SMP */ - MMU_EXT_XN | MMU_EXT_AF | MMU_AP_RW_ALL | - MMU_NS | MMU_TYPE_PAGE; - -#else /* CONFIG_TRUSTONIC_TEE_LPAE */ - -/* - * Secure world uses 32-bit physical addresses - */ -typedef u32 tbase_pte_t; - -/* - * Linux uses different mappings for SMP systems(the sharing flag is set for - * the pte. In order not to confuse things too much in Mobicore make sure the - * shared buffers have the same flags. This should also be done in SWD side. - */ -static tbase_pte_t pte_flags = MMU_BUFFERABLE | MMU_CACHEABLE | MMU_EXT_NG | -#ifdef CONFIG_SMP - MMU_EXT_SHARED | MMU_EXT_TEX(1) | -#endif /* CONFIG_SMP */ - MMU_EXT_AP1 | MMU_EXT_AP0 | - MMU_TYPE_SMALL | MMU_TYPE_EXT; - -#endif /* !CONFIG_TRUSTONIC_TEE_LPAE */ - -/* - * Fake L1 MMU table. - */ -union l1_table { - u64 *pages_phys; /* Array of physical page addresses */ - unsigned long page; -}; - -/* - * L2 MMU table, which is more a L3 table in the LPAE case. - */ -union l2_table { - tbase_pte_t *ptes; /* Array of PTEs */ - unsigned long page; -}; - -/* - * MMU table allocated to the Daemon or a TLC describing a world shared - * buffer. - * When users map a malloc()ed area into SWd, a MMU table is allocated. - * In addition, the area of maximum 1MB virtual address space is mapped into - * the MMU table and a handle for this table is returned to the user. - */ -struct tbase_mmu { - union l2_table l2_tables[L1_ENTRIES_MAX]; /* L2 tables */ - size_t l2_tables_nr; /* Actual number of L2 tables */ - union l1_table l1_table; /* Fake L1 table */ - union l2_table l1_l2_table; /* L2 table for the L1 table */ - uint32_t offset; - uint32_t length; - bool user; /* Pages are from user space */ -}; - -static void free_all_pages(struct tbase_mmu *mmu_table) -{ - union l2_table *l2_table = &mmu_table->l2_tables[0]; - size_t i; - - for (i = 0; i < mmu_table->l2_tables_nr; i++, l2_table++) { - if (!l2_table->page) - break; - - free_page(l2_table->page); - } - - if (mmu_table->l1_l2_table.page) - free_page(mmu_table->l1_l2_table.page); - - if (mmu_table->l1_table.page) - free_page(mmu_table->l1_table.page); -} - -/* - * Create a MMU table for a buffer or trustlet. - */ -static inline int map_buffer(struct task_struct *task, const void *data, - unsigned int length, struct tbase_mmu *mmu_table) -{ - const void *reader = (const void *)((uintptr_t)data & PAGE_MASK); - struct page **pages; /* Same as above, conveniently typed */ - unsigned long pages_page; /* Page to contain the page pointers */ - size_t chunk; - unsigned long total_pages_nr; - int l1_entries_max; - int ret = 0; - - /* Check that we have enough space to map data */ - mmu_table->length = length; - mmu_table->offset = (uintptr_t)data & ~PAGE_MASK; - total_pages_nr = PAGE_ALIGN(mmu_table->offset + length) / PAGE_SIZE; - if (g_ctx.f_mem_ext) - l1_entries_max = L1_ENTRIES_MAX; - else - l1_entries_max = 1; - - if (total_pages_nr > (l1_entries_max * L2_ENTRIES_MAX)) { - dev_err(g_ctx.mcd, "data mapping exceeds %d pages", - l1_entries_max * L2_ENTRIES_MAX); - return -EINVAL; - } - - /* Get number of L2 tables needed */ - mmu_table->l2_tables_nr = (total_pages_nr + L2_ENTRIES_MAX - 1) / - L2_ENTRIES_MAX; - dev_dbg(g_ctx.mcd, "total_pages_nr %lu l2_tables_nr %zu", - total_pages_nr, mmu_table->l2_tables_nr); - - /* Get a page to store page pointers */ - pages_page = get_zeroed_page(GFP_KERNEL); - if (!pages_page) - return -ENOMEM; - - pages = (struct page **)pages_page; - - /* Allocate a page for the L1 table */ - if (mmu_table->l2_tables_nr > 1) { - tbase_pte_t *pte; - - mmu_table->l1_table.page = get_zeroed_page(GFP_KERNEL); - mmu_table->l1_l2_table.page = get_zeroed_page(GFP_KERNEL); - if (!mmu_table->l1_table.page || !mmu_table->l1_l2_table.page) { - ret = -ENOMEM; - goto end; - } - - /* Map it */ - pte = &mmu_table->l1_l2_table.ptes[0]; - *pte = virt_to_phys(mmu_table->l1_table.pages_phys); - *pte |= pte_flags; - } - - for (chunk = 0; chunk < mmu_table->l2_tables_nr; chunk++) { - unsigned long pages_nr, i; - tbase_pte_t *pte; - struct page **page_ptr; - - /* Size to map for this chunk */ - if (chunk == (mmu_table->l2_tables_nr - 1)) - pages_nr = ((total_pages_nr - 1) % L2_ENTRIES_MAX) + 1; - else - pages_nr = L2_ENTRIES_MAX; - - /* Allocate a page for the MMU descriptor */ - mmu_table->l2_tables[chunk].page = get_zeroed_page(GFP_KERNEL); - if (!mmu_table->l2_tables[chunk].page) { - ret = -ENOMEM; - goto end; - } - - /* Add page address to L1 table if needed */ - if (mmu_table->l1_table.page) - mmu_table->l1_table.pages_phys[chunk] = - virt_to_phys(mmu_table->l2_tables[chunk].ptes); - - /* Get pages */ - if (task) { - long gup_ret; - - /* Buffer was allocated in user space */ - down_read(&task->mm->mmap_sem); - gup_ret = get_user_pages(task, task->mm, - (uintptr_t)reader, pages_nr, - 1, 0, pages, 0); - reader += pages_nr * PAGE_SIZE; - up_read(&task->mm->mmap_sem); - if (gup_ret < 0) { - ret = gup_ret; - dev_err(g_ctx.mcd, - "failed to get user pages: %d", ret); - goto end; - } - - /* check if we could lock all pages. */ - if (gup_ret != pages_nr) { - dev_err(g_ctx.mcd, - "get_user_pages() failed, ret: %ld", - gup_ret); - release_pages(pages, gup_ret, 0); - ret = -ENOMEM; - goto end; - } - - mmu_table->user = true; - } else if (is_vmalloc_addr(data)) { - /* Buffer vmalloc'ed in kernel space */ - page_ptr = &pages[0]; - for (i = 0; i < pages_nr; i++) { - struct page *page = vmalloc_to_page(reader); - - if (!page) { - dev_err(g_ctx.mcd, - "failed to map address"); - ret = -EINVAL; - goto end; - } - - *page_ptr++ = page; - reader += PAGE_SIZE; - } - } else { - /* Buffer kmalloc'ed in kernel space */ - struct page *page = virt_to_page(reader); - - reader += pages_nr * PAGE_SIZE; - page_ptr = &pages[0]; - for (i = 0; i < pages_nr; i++) - *page_ptr++ = page++; - } - - /* Create MMU Table entries */ - page_ptr = &pages[0]; - pte = &mmu_table->l2_tables[chunk].ptes[0]; - for (i = 0; i < pages_nr; i++, page_ptr++, pte++) { - /* - * Create MMU table entry, see ARM MMU docu for details - * about flags stored in the lowest 12 bits. As a side - * reference, the Article "ARM's multiply-mapped memory - * mess" found in the collection at - * http://lwn.net/Articles/409032/ is also worth reading. - */ - unsigned long phys = page_to_phys(*page_ptr); -#if defined CONFIG_ARM64 && !defined CONFIG_TRUSTONIC_TEE_LPAE - if (phys & 0xffffffff00000000) { - dev_err(g_ctx.mcd, - "Pointer too big for non-LPAE: 0x%16lx", - phys); - ret = -EFAULT; - goto end; - } -#endif - *pte = phys; - *pte |= pte_flags; - } - } - -end: - if (ret) - free_all_pages(mmu_table); - - free_page(pages_page); - return ret; -} - -static inline void unmap_buffer(struct tbase_mmu *mmu_table) -{ - int t; - - dev_dbg(g_ctx.mcd, "clear MMU table, virt %p", mmu_table); - if (!mmu_table->user) - goto end; - - /* Release all locked user space pages */ - for (t = 0; t < mmu_table->l2_tables_nr; t++) { - tbase_pte_t *pte = mmu_table->l2_tables[t].ptes; - int i; - - for (i = 0; i < L2_ENTRIES_MAX; i++, pte++) { - struct page *page; - - /* If not all entries are used, unused ones are 0 */ - if (!*pte) - break; - - /* pte_page() cannot return NULL */ - page = pte_page(*pte); - dev_dbg(g_ctx.mcd, "MMU entry %d: 0x%llx, virt %p", - i, (u64)*pte, page); - - page_cache_release(page); - } - } - -end: - free_all_pages(mmu_table); -} - -/* - * Delete a MMU table. - */ -void tbase_mmu_delete(struct tbase_mmu *mmu) -{ - if (WARN(!mmu, "NULL mmu pointer given")) - return; - - unmap_buffer(mmu); - MCDRV_DBG("freed mmu %p: %s len %u off %u table %lx type L%d", - mmu, mmu->user ? "user" : "kernel", mmu->length, mmu->offset, - (uintptr_t)(mmu->l1_table.page ? mmu->l1_l2_table.ptes : - mmu->l2_tables[0].ptes), - mmu->l1_table.page ? 1 : 2); - kfree(mmu); -} - -/* - * Allocate MMU table and map buffer into it. - * That is, create respective table entries. - */ -struct tbase_mmu *tbase_mmu_create(struct task_struct *task, - const void *addr, - unsigned int length) -{ - struct tbase_mmu *mmu; - int ret; - - /* Check input arguments */ - if (WARN(!addr, "data address is NULL")) - return ERR_PTR(-EINVAL); - - if (WARN(!length, "data length is 0")) - return ERR_PTR(-EINVAL); - - /* Allocate the struct */ - mmu = kmalloc(sizeof(*mmu), GFP_KERNEL | __GFP_ZERO); - if (!mmu) - return ERR_PTR(-ENOMEM); - - /* Create the MMU mapping for the data */ - ret = map_buffer(task, addr, length, mmu); - if (ret) { - kfree(mmu); - return ERR_PTR(ret); - } - - MCDRV_DBG("created mmu %p: %s addr %p len %u off %u table %lx type L%d", - mmu, mmu->user ? "user" : "kernel", addr, mmu->length, - mmu->offset, - (uintptr_t)(mmu->l1_table.page ? mmu->l1_l2_table.ptes : - mmu->l2_tables[0].ptes), - mmu->l1_table.page ? 1 : 2); - return mmu; -} - -void tbase_mmu_buffer(const struct tbase_mmu *mmu, struct mcp_buffer_map *map) -{ - if (mmu->l1_table.page) { - map->phys_addr = virt_to_phys(mmu->l1_l2_table.ptes); - map->type = WSM_L1; - } else { - map->phys_addr = virt_to_phys(mmu->l2_tables[0].ptes); - map->type = WSM_L2; - } - - map->secure_va = 0; - map->offset = mmu->offset; - map->length = mmu->length; -} - -int tbase_mmu_info(const struct tbase_mmu *mmu, struct kasnprintf_buf *buf) -{ - return kasnprintf(buf, - "\t\t\tmmu %p: %s len %u off %u table %lx type L%d\n", - mmu, mmu->user ? "user" : "kernel", mmu->length, - mmu->offset, - (uintptr_t)(mmu->l1_table.page ? - mmu->l1_l2_table.ptes : mmu->l2_tables[0].ptes), - mmu->l1_table.page ? 1 : 2); -} diff --git a/drivers/gud/MobiCoreDriver/mmu.h b/drivers/gud/MobiCoreDriver/mmu.h deleted file mode 100644 index 09efea480bef8..0000000000000 --- a/drivers/gud/MobiCoreDriver/mmu.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _TBASE_MEM_H_ -#define _TBASE_MEM_H_ - -struct tbase_mmu; -struct mcp_buffer_map; - -/* - * Allocate MMU table and map buffer into it. - * That is, create respective table entries. - */ -struct tbase_mmu *tbase_mmu_create(struct task_struct *task, - const void *wsm_buffer, - unsigned int wsm_len); - -/* - * Delete a used MMU table. - */ -void tbase_mmu_delete(struct tbase_mmu *mmu); - -/* - * Fill in buffer info for MMU table. - */ -void tbase_mmu_buffer(const struct tbase_mmu *mmu, struct mcp_buffer_map *map); - -/* - * Add info to debug buffer. - */ -int tbase_mmu_info(const struct tbase_mmu *mmu, struct kasnprintf_buf *buf); - -#endif /* _TBASE_MEM_H_ */ diff --git a/drivers/gud/MobiCoreDriver/platform.h b/drivers/gud/MobiCoreDriver/platform.h deleted file mode 100644 index f9c801450f64e..0000000000000 --- a/drivers/gud/MobiCoreDriver/platform.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MC_PLATFORM_H_ -#define _MC_PLATFORM_H_ - -/* MobiCore Interrupt for Qualcomm (DT IRQ has priority if present) */ -#define MC_INTR_SSIQ 280 - -/* Use SMC for fastcalls */ -#define MC_SMC_FASTCALL - -#include - -/*--------------- Implementation -------------- */ -#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || \ - defined(CONFIG_ARCH_MSM8994) || defined(CONFIG_ARCH_MSM8909) || \ - defined(CONFIG_ARCH_MSM8996) - -#include - -#if defined(CONFIG_ARM64) || defined(CONFIG_ARCH_MSM8916) - - #include - #include - #include - #include - #include - #include - - #define SCM_MOBIOS_FNID(s, c) (((((s) & 0xFF) << 8) | ((c) & 0xFF)) \ - | 0x33000000) - - #define TZ_EXECUTIVE_EXT_ID_PARAM_ID \ - TZ_SYSCALL_CREATE_PARAM_ID_4( \ - TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ - TZ_SYSCALL_PARAM_TYPE_VAL, \ - TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ - TZ_SYSCALL_PARAM_TYPE_VAL) - -#endif - -#else -#include -#endif - -/* from following file */ -#define SCM_SVC_MOBICORE 250 -#define SCM_CMD_MOBICORE 1 - -static inline int smc_fastcall(void *fc_generic, size_t size) -{ -#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || \ - defined(CONFIG_ARCH_MSM8994) || defined(CONFIG_ARCH_MSM8996) - if (is_scm_armv8()) { - struct scm_desc desc = {0}; - int ret; - void *scm_buf = NULL; - - scm_buf = kzalloc(PAGE_ALIGN(size), GFP_KERNEL); - if (!scm_buf) - return -ENOMEM; - memcpy(scm_buf, fc_generic, size); - dmac_flush_range(scm_buf, scm_buf + size); - - desc.arginfo = TZ_EXECUTIVE_EXT_ID_PARAM_ID; - desc.args[0] = virt_to_phys(scm_buf); - desc.args[1] = (u32)size; - desc.args[2] = virt_to_phys(scm_buf); - desc.args[3] = (u32)size; - - ret = scm_call2( - SCM_MOBIOS_FNID(SCM_SVC_MOBICORE, SCM_CMD_MOBICORE), - &desc); - - dmac_flush_range(scm_buf, scm_buf + size); - - memcpy(fc_generic, scm_buf, size); - kfree(scm_buf); - return ret; - } -#endif - - return scm_call(SCM_SVC_MOBICORE, SCM_CMD_MOBICORE, - fc_generic, size, - fc_generic, size); -} - -/* Fastcall value should be the one for armv7, even if on armv8, - * as long as the __aarch32__ flag is not activated in SW. - * But for 8996, architecture is armv8 with __aarch32__ in Sw. - */ -#if !defined(CONFIG_ARCH_MSM8996) -#define MC_ARMV7_FC -#endif - -#if defined(CONFIG_ARCH_MSM8996) -#define CONFIG_TRUSTONIC_TEE_LPAE -#endif - -/* - * Perform crypto clock enable/disable - * of clocks - * "bus_clk" - * "core_clk" - * "iface_clk" - */ -#if (!defined(CONFIG_ARCH_MSM8960) && !defined(CONFIG_ARCH_MSM8994)) || \ - defined(CONFIG_ARCH_MSM8996) -#define MC_CRYPTO_CLOCK_MANAGEMENT -#endif - -/* - * Perform clock enable/disable for clock "core_clk_src" - */ -#if defined(CONFIG_ARCH_MSM8916) || defined(CONFIG_ARCH_MSM8909) || \ - defined(CONFIG_ARCH_MSM8996) -#define MC_DEVICE_PROPNAME "qcom,mcd" -#if defined(MC_CRYPTO_CLOCK_MANAGEMENT) -#define MC_CLOCK_CORESRC_PROPNAME "qcom,ce-opp-freq" -#define MC_CLOCK_CORESRC_DEFAULTRATE 100000000 -#endif /* MC_CRYPTO_CLOCK_MANAGEMENT */ -#endif - - -#if !defined(CONFIG_ARCH_MSM8996) -/* uid/gid behave like old kernels but with new types */ -/* This flag does not exist on 8996 3.10 kernel version */ -#if !defined(CONFIG_UIDGID_STRICT_TYPE_CHECKS) -#define MC_UIDGID_OLDSTYLE -#endif -/* Fastcall value should be the one for armv7, even if on armv8, - * as long as the __aarch32__ flag is not activated in SW. - * But for 8996, architecture is armv8 with __aarch32__ in Sw. - */ -#define MC_ARMV7_FC -#endif /* not CONFIG_ARCH_MSM8996 */ - -#endif /* _MC_PLATFORM_H_ */ - diff --git a/drivers/gud/MobiCoreDriver/pm.c b/drivers/gud/MobiCoreDriver/pm.c deleted file mode 100644 index 98310f73dfeab..0000000000000 --- a/drivers/gud/MobiCoreDriver/pm.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "platform.h" /* MC_PM_RUNTIME */ -#include "debug.h" -#include "scheduler.h" /* SWd suspend/resume commands */ -#include "pm.h" - -#ifdef MC_PM_RUNTIME -static struct pm_context { - struct notifier_block pm_notifier; -} pm_ctx; - -static int mc_suspend_notifier(struct notifier_block *nb, unsigned long event, - void *dummy) -{ - switch (event) { - case PM_SUSPEND_PREPARE: - return mc_scheduler_suspend(); - case PM_POST_SUSPEND: - return mc_scheduler_resume(); - } - - return 0; -} - - -/* CPI todo: inconsistent handling of ret in below 2 functions */ -int mc_pm_start(void) -{ - int ret = 0; - - pm_ctx.pm_notifier.notifier_call = mc_suspend_notifier; - ret = register_pm_notifier(&pm_ctx.pm_notifier); - MCDRV_DBG_VERBOSE("done, ret = %d", ret); - - return ret; -} - -void mc_pm_stop(void) -{ - unregister_pm_notifier(&pm_ctx.pm_notifier); -} - -#endif /* MC_PM_RUNTIME */ diff --git a/drivers/gud/MobiCoreDriver/pm.h b/drivers/gud/MobiCoreDriver/pm.h deleted file mode 100644 index 999599a70b1ab..0000000000000 --- a/drivers/gud/MobiCoreDriver/pm.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MC_PM_H_ -#define _MC_PM_H_ - -#include "platform.h" /* MC_PM_RUNTIME */ - -#ifdef MC_PM_RUNTIME -/* Initialize Power Management */ -int mc_pm_start(void); -/* Free all Power Management resources*/ -void mc_pm_stop(void); -#else -static inline int mc_pm_start(void) -{ - return 0; -} - -static inline void mc_pm_stop(void) -{ -} -#endif - -#endif /* _MC_PM_H_ */ diff --git a/drivers/gud/MobiCoreDriver/public/mc_admin.h b/drivers/gud/MobiCoreDriver/public/mc_admin.h deleted file mode 100644 index 3a4078dd6fc30..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mc_admin.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MC_ADMIN_IOCTL_H__ -#define __MC_ADMIN_IOCTL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define MC_ADMIN_DEVNODE "mobicore" - -/* Driver/daemon commands */ -enum { - /* Command 0 is reserved */ - MC_DRV_GET_ROOT_CONTAINER = 1, - MC_DRV_GET_SP_CONTAINER = 2, - MC_DRV_GET_TRUSTLET_CONTAINER = 3, - MC_DRV_GET_TRUSTLET = 4, - MC_DRV_SIGNAL_CRASH = 5, -}; - -/* MobiCore IOCTL magic number */ -#define MC_IOC_MAGIC 'M' - -struct mc_admin_request { - uint32_t request_id; /* Unique request identifier */ - uint32_t command; /* Command to daemon */ - struct mc_uuid_t uuid; /* UUID of trustlet, if relevant */ - uint32_t is_gp; /* Whether trustlet is GP */ - uint32_t spid; /* SPID of trustlet, if relevant */ -}; - -struct mc_admin_response { - uint32_t request_id; /* Unique request identifier */ - uint32_t error_no; /* Errno from daemon */ - uint32_t spid; /* SPID of trustlet, if relevant */ - uint32_t service_type; /* Type of trustlet being returned */ - uint32_t length; /* Length of data to get */ - /* Any data follows */ -}; - -struct mc_admin_driver_info { - /* Version, and something else..*/ - uint32_t drv_version; - uint32_t initial_cmd_id; -}; - -struct mc_admin_load_info { - uint32_t spid; /* SPID of trustlet, if relevant */ - uint64_t address; /* Address of the data */ - uint32_t length; /* Length of data to get */ -}; - -#define MC_ADMIN_IO_GET_DRIVER_REQUEST \ - _IOR(MC_IOC_MAGIC, 0, struct mc_admin_request) -#define MC_ADMIN_IO_GET_INFO \ - _IOR(MC_IOC_MAGIC, 1, struct mc_admin_driver_info) -#define MC_ADMIN_IO_LOAD_DRIVER \ - _IOW(MC_IOC_MAGIC, 2, struct mc_admin_load_info) -#define MC_ADMIN_IO_LOAD_TOKEN \ - _IOW(MC_IOC_MAGIC, 3, struct mc_admin_load_info) -#define MC_ADMIN_IO_LOAD_CHECK \ - _IOW(MC_IOC_MAGIC, 4, struct mc_admin_load_info) - -#ifdef __cplusplus -} -#endif -#endif /* __MC_ADMIN_IOCTL_H__ */ diff --git a/drivers/gud/MobiCoreDriver/public/mc_linux.h b/drivers/gud/MobiCoreDriver/public/mc_linux.h deleted file mode 100644 index 2368653f8890d..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mc_linux.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MC_LINUX_H_ -#define _MC_LINUX_H_ - -#define MCDRVMODULEAPI_VERSION_MAJOR 2 -#define MCDRVMODULEAPI_VERSION_MINOR 1 - -#ifndef __KERNEL__ -#include -#endif - -#define MC_USER_DEVNODE "mobicore-user" - -/** Maximum length of MobiCore product ID string. */ -#define MC_PRODUCT_ID_LEN 64 - -/** Number of buffers that can be mapped at once */ -#define MC_MAP_MAX 4 - -/* - * Universally Unique Identifier (UUID) according to ISO/IEC 11578. - */ -struct mc_uuid_t { - uint8_t value[16]; /* Value of the UUID. */ -}; - -/* - * GP TA login types. - */ -enum mc_login_type { - TEEC_LOGIN_PUBLIC = 0, - TEEC_LOGIN_USER, - TEEC_LOGIN_GROUP, - TEEC_LOGIN_APPLICATION = 4, - TEEC_LOGIN_USER_APPLICATION, - TEEC_LOGIN_GROUP_APPLICATION, -}; - -/* - * GP TA identity structure. - */ -struct mc_identity { - enum mc_login_type login_type; - union { - uint8_t login_data[16]; - gid_t gid; /* Requested group id */ - struct { - uid_t euid; - uid_t ruid; - } uid; - }; -}; - -/* - * Data exchange structure of the MC_IO_OPEN_SESSION ioctl command. - */ -struct mc_ioctl_open_sess { - struct mc_uuid_t uuid; /* trustlet uuid */ - uint32_t is_gp_uuid; /* uuid is for GP TA */ - uint32_t sid; /* session id (out) */ - uint64_t tci; /* tci buffer pointer */ - uint32_t tcilen; /* tci length */ - struct mc_identity identity; /* GP TA identity */ -}; - -/* - * Data exchange structure of the MC_IO_OPEN_TRUSTLET ioctl command. - */ -struct mc_ioctl_open_trustlet { - uint32_t sid; /* session id (out) */ - uint32_t spid; /* trustlet spid */ - uint64_t buffer; /* trustlet binary pointer */ - uint32_t tlen; /* binary length */ - uint64_t tci; /* tci buffer pointer */ - uint32_t tcilen; /* tci length */ -}; - -/* - * Data exchange structure of the MC_IO_WAIT ioctl command. - */ -struct mc_ioctl_wait { - uint32_t sid; /* session id (in) */ - int32_t timeout; /* notification timeout */ -}; - -/* - * Data exchange structure of the MC_IO_ALLOC ioctl command. - */ -struct mc_ioctl_alloc { - uint32_t len; /* buffer length */ - uint32_t handle; /* user handle for the buffer (out) */ -}; - -/* - * Buffer mapping incoming and outgoing information. - */ -struct mc_ioctl_buffer { - uint64_t va; /* user space address of buffer */ - uint32_t len; /* buffer length */ - uint64_t sva; /* SWd virt address of buffer (out) */ -}; - -/* - * Data exchange structure of the MC_IO_MAP and MC_IO_UNMAP ioctl commands. - */ -struct mc_ioctl_map { - uint32_t sid; /* session id */ - struct mc_ioctl_buffer bufs[MC_MAP_MAX];/* buffers info */ -}; - -/* - * Data exchange structure of the MC_IO_ERR ioctl command. - */ -struct mc_ioctl_geterr { - uint32_t sid; /* session id */ - int32_t value; /* error value (out) */ -}; - -/* - * Global MobiCore Version Information. - */ -struct mc_version_info { - char product_id[MC_PRODUCT_ID_LEN]; /** Product ID string */ - uint32_t version_mci; /** Mobicore Control Interface */ - uint32_t version_so; /** Secure Objects */ - uint32_t version_mclf; /** MobiCore Load Format */ - uint32_t version_container; /** MobiCore Container Format */ - uint32_t version_mc_config; /** MobiCore Config. Block Format */ - uint32_t version_tl_api; /** MobiCore Trustlet API */ - uint32_t version_dr_api; /** MobiCore Driver API */ - uint32_t version_cmp; /** Content Management Protocol */ -}; - -/* - * defines for the ioctl mobicore driver module function call from user space. - */ -/* MobiCore IOCTL magic number */ -#define MC_IOC_MAGIC 'M' - -/* - * Implement corresponding functions from user api - */ -#define MC_IO_OPEN_SESSION \ - _IOWR(MC_IOC_MAGIC, 0, struct mc_ioctl_open_sess) -#define MC_IO_OPEN_TRUSTLET \ - _IOWR(MC_IOC_MAGIC, 1, struct mc_ioctl_open_trustlet) -#define MC_IO_CLOSE_SESSION _IO(MC_IOC_MAGIC, 2) -#define MC_IO_NOTIFY _IO(MC_IOC_MAGIC, 3) -#define MC_IO_WAIT _IOW(MC_IOC_MAGIC, 4, struct mc_ioctl_wait) -#define MC_IO_MAP _IOWR(MC_IOC_MAGIC, 5, struct mc_ioctl_map) -#define MC_IO_UNMAP _IOW(MC_IOC_MAGIC, 6, struct mc_ioctl_map) -#define MC_IO_ERR _IOWR(MC_IOC_MAGIC, 7, struct mc_ioctl_geterr) -#define MC_IO_FREEZE _IO(MC_IOC_MAGIC, 8) -#define MC_IO_VERSION _IOR(MC_IOC_MAGIC, 9, struct mc_version_info) -#define MC_IO_DR_VERSION _IOR(MC_IOC_MAGIC, 10, uint32_t) - -#endif /* _MC_LINUX_H_ */ diff --git a/drivers/gud/MobiCoreDriver/public/mc_linux_api.h b/drivers/gud/MobiCoreDriver/public/mc_linux_api.h deleted file mode 100644 index 211bc2682b754..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mc_linux_api.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MC_LINUX_API_H_ -#define _MC_LINUX_API_H_ - -/* - * Switch tbase active core to core_num, defined as linux - * core id - */ -int mc_switch_core(uint32_t core_num); - -/* - * Return tbase active core as Linux core id - */ -uint32_t mc_active_core(void); - -#endif /* _MC_LINUX_API_H_ */ diff --git a/drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h b/drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h deleted file mode 100644 index 005099532d73a..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MOBICORE_DRIVER_API_H_ -#define _MOBICORE_DRIVER_API_H_ - -#include "mc_linux.h" - -#define __MC_CLIENT_LIB_API - -/* - * Return values of MobiCore driver functions. - */ -enum mc_result { - /* Function call succeeded. */ - MC_DRV_OK = 0, - /* No notification available. */ - MC_DRV_NO_NOTIFICATION = 1, - /* Error during notification on communication level. */ - MC_DRV_ERR_NOTIFICATION = 2, - /* Function not implemented. */ - MC_DRV_ERR_NOT_IMPLEMENTED = 3, - /* No more resources available. */ - MC_DRV_ERR_OUT_OF_RESOURCES = 4, - /* Driver initialization failed. */ - MC_DRV_ERR_INIT = 5, - /* Unknown error. */ - MC_DRV_ERR_UNKNOWN = 6, - /* The specified device is unknown. */ - MC_DRV_ERR_UNKNOWN_DEVICE = 7, - /* The specified session is unknown.*/ - MC_DRV_ERR_UNKNOWN_SESSION = 8, - /* The specified operation is not allowed. */ - MC_DRV_ERR_INVALID_OPERATION = 9, - /* The response header from the MC is invalid. */ - MC_DRV_ERR_INVALID_RESPONSE = 10, - /* Function call timed out. */ - MC_DRV_ERR_TIMEOUT = 11, - /* Can not allocate additional memory. */ - MC_DRV_ERR_NO_FREE_MEMORY = 12, - /* Free memory failed. */ - MC_DRV_ERR_FREE_MEMORY_FAILED = 13, - /* Still some open sessions pending. */ - MC_DRV_ERR_SESSION_PENDING = 14, - /* MC daemon not reachable */ - MC_DRV_ERR_DAEMON_UNREACHABLE = 15, - /* The device file of the kernel module could not be opened. */ - MC_DRV_ERR_INVALID_DEVICE_FILE = 16, - /* Invalid parameter. */ - MC_DRV_ERR_INVALID_PARAMETER = 17, - /* Unspecified error from Kernel Module*/ - MC_DRV_ERR_KERNEL_MODULE = 18, - /* Error during mapping of additional bulk memory to session. */ - MC_DRV_ERR_BULK_MAPPING = 19, - /* Error during unmapping of additional bulk memory to session. */ - MC_DRV_ERR_BULK_UNMAPPING = 20, - /* Notification received, exit code available. */ - MC_DRV_INFO_NOTIFICATION = 21, - /* Set up of NWd connection failed. */ - MC_DRV_ERR_NQ_FAILED = 22, - /* Wrong daemon version. */ - MC_DRV_ERR_DAEMON_VERSION = 23, - /* Wrong container version. */ - MC_DRV_ERR_CONTAINER_VERSION = 24, - /* System Trustlet public key is wrong. */ - MC_DRV_ERR_WRONG_PUBLIC_KEY = 25, - /* Wrong container type(s). */ - MC_DRV_ERR_CONTAINER_TYPE_MISMATCH = 26, - /* Container is locked (or not activated). */ - MC_DRV_ERR_CONTAINER_LOCKED = 27, - /* SPID is not registered with root container. */ - MC_DRV_ERR_SP_NO_CHILD = 28, - /* UUID is not registered with sp container. */ - MC_DRV_ERR_TL_NO_CHILD = 29, - /* Unwrapping of root container failed. */ - MC_DRV_ERR_UNWRAP_ROOT_FAILED = 30, - /* Unwrapping of service provider container failed. */ - MC_DRV_ERR_UNWRAP_SP_FAILED = 31, - /* Unwrapping of Trustlet container failed. */ - MC_DRV_ERR_UNWRAP_TRUSTLET_FAILED = 32, - /* No device associated with connection. */ - MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN = 33, - /* TA blob attestation is incorrect. */ - MC_DRV_ERR_TA_ATTESTATION_ERROR = 34, - /* Interrupted system call. */ - MC_DRV_ERR_INTERRUPTED_BY_SIGNAL = 35, - /* Service is blocked and opensession is thus not allowed. */ - MC_DRV_ERR_SERVICE_BLOCKED = 36, - /* Service is locked and opensession is thus not allowed. */ - MC_DRV_ERR_SERVICE_LOCKED = 37, - /* Service was killed by the TEE (due to an administrative command). */ - MC_DRV_ERR_SERVICE_KILLED = 38, - /* All permitted instances to the service are used */ - MC_DRV_ERR_NO_FREE_INSTANCES = 39, - /* TA blob header is incorrect. */ - MC_DRV_ERR_TA_HEADER_ERROR = 40, -}; - -/* - * Structure of Session Handle, includes the Session ID and the Device ID the - * Session belongs to. - * The session handle will be used for session-based MobiCore communication. - * It will be passed to calls which address a communication end point in the - * MobiCore environment. - */ -struct mc_session_handle { - uint32_t session_id; /* MobiCore session ID */ - uint32_t device_id; /* Device ID the session belongs to */ -}; - -/* - * Information structure about additional mapped Bulk buffer between the - * Trustlet Connector (NWd) and the Trustlet (SWd). This structure is - * initialized from a Trustlet Connector by calling mc_map(). - * In order to use the memory within a Trustlet the Trustlet Connector has to - * inform the Trustlet with the content of this structure via the TCI. - */ -struct mc_bulk_map { - /* The virtual address of the Bulk buffer regarding the address space - * of the Trustlet, already includes a possible offset! */ - uint32_t secure_virt_addr; - uint32_t secure_virt_len; /* Length of the mapped Bulk buffer */ -}; - -/* The default device ID */ -#define MC_DEVICE_ID_DEFAULT 0 -/* Wait infinite for a response of the MC. */ -#define MC_INFINITE_TIMEOUT ((int32_t)(-1)) -/* Do not wait for a response of the MC. */ -#define MC_NO_TIMEOUT 0 -/* TCI/DCI must not exceed 1MiB */ -#define MC_MAX_TCI_LEN 0x100000 - -/** - * mc_open_device() - Open a new connection to a MobiCore device. - * @device_id: Identifier for the MobiCore device to be used. - * MC_DEVICE_ID_DEFAULT refers to the default device. - * - * Initializes all device specific resources required to communicate with a - * MobiCore instance located on the specified device in the system. If the - * device does not exist the function will return MC_DRV_ERR_UNKNOWN_DEVICE. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_ERR_INVALID_OPERATION: device already opened - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon - * MC_DRV_ERR_UNKNOWN_DEVICE: device_id unknown - * MC_DRV_ERR_INVALID_DEVICE_FILE: kernel module under /dev/mobicore - * cannot be opened - */ -__MC_CLIENT_LIB_API enum mc_result mc_open_device(uint32_t device_id); - -/** - * mc_close_device() - Close the connection to a MobiCore device. - * @device_id: Identifier for the MobiCore device. - * - * When closing a device, active sessions have to be closed beforehand. - * Resources associated with the device will be released. - * The device may be opened again after it has been closed. - * - * MC_DEVICE_ID_DEFAULT refers to the default device. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_SESSION_PENDING: a session is still open - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - */ -__MC_CLIENT_LIB_API enum mc_result mc_close_device(uint32_t device_id); - -/** - * mc_open_session() - Open a new session to a Trustlet. - * @session: On success, the session data will be returned - * @uuid: UUID of the Trustlet to be opened - * @tci: TCI buffer for communicating with the Trustlet - * @tci_len: Length of the TCI buffer. Maximum allowed value - * is MC_MAX_TCI_LEN - * - * The Trustlet with the given UUID has to be available in the flash filesystem. - * - * Write MCP open message to buffer and notify MobiCore about the availability - * of a new command. - * - * Waits till the MobiCore responses with the new session ID (stored in the MCP - * buffer). - * - * Note that session.device_id has to be the device id of an opened device. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon socket occur - * MC_DRV_ERR_NQ_FAILED: daemon returns an error - */ -__MC_CLIENT_LIB_API enum mc_result mc_open_session( - struct mc_session_handle *session, const struct mc_uuid_t *uuid, - uint8_t *tci, uint32_t tci_len); - -/** - * mc_open_trustlet() - Open a new session to the provided Trustlet. - * @session: On success, the session data will be returned - * @spid: Service Provider ID (for SP trustlets otherwise ignored) - * @trustlet Memory buffer containing the Trusted Application binary - * @trustlet_len Trusted Application length - * @tci: TCI buffer for communicating with the Trustlet - * @tci_len: Length of the TCI buffer. Maximum allowed value - * is MC_MAX_TCI_LEN - * - * Write MCP open message to buffer and notify MobiCore about the availability - * of a new command. - * - * Waits till the MobiCore responses with the new session ID (stored in the MCP - * buffer). - * - * Note that session.device_id has to be the device id of an opened device. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon socket occur - * MC_DRV_ERR_NQ_FAILED: daemon returns an error - */ -__MC_CLIENT_LIB_API enum mc_result mc_open_trustlet( - struct mc_session_handle *session, uint32_t spid, - uint8_t *trustlet, uint32_t trustlet_len, uint8_t *tci, uint32_t len); - -/** - * mc_close_session() - Close a Trustlet session. - * @session: Session to be closed. - * - * Closes the specified MobiCore session. The call will block until the - * session has been closed. - * - * Device device_id has to be opened in advance. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - * MC_DRV_ERR_INVALID_DEVICE_FILE: daemon cannot open Trustlet file - */ -__MC_CLIENT_LIB_API enum mc_result mc_close_session( - struct mc_session_handle *session); - -/** - * mc_notify() - Notify a session. - * @session: The session to be notified. - * - * Notifies the session end point about available message data. - * If the session parameter is correct, notify will always succeed. - * Corresponding errors can only be received by mc_wait_notification(). - * - * A session has to be opened in advance. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - */ -__MC_CLIENT_LIB_API enum mc_result mc_notify(struct mc_session_handle *session); - -/** - * mc_wait_notification() - Wait for a notification. - * @session: The session the notification should correspond to. - * @timeout: Time in milliseconds to wait - * (MC_NO_TIMEOUT : direct return, > 0 : milliseconds, - * MC_INFINITE_TIMEOUT : wait infinitely) - * - * Wait for a notification issued by the MobiCore for a specific session. - * The timeout parameter specifies the number of milliseconds the call will wait - * for a notification. - * - * If the caller passes 0 as timeout value the call will immediately return. - * If timeout value is below 0 the call will block until a notification for the - * session has been received. - * - * If timeout is below 0, call will block. - * - * Caller has to trust the other side to send a notification to wake him up - * again. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_ERR_TIMEOUT: no notification arrived in time - * MC_DRV_INFO_NOTIFICATION: a problem with the session was - * encountered. Get more details with - * mc_get_session_error_code() - * MC_DRV_ERR_NOTIFICATION: a problem with the socket occurred - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - */ -__MC_CLIENT_LIB_API enum mc_result mc_wait_notification( - struct mc_session_handle *session, int32_t timeout); - -/** - * mc_malloc_wsm() - Allocate a block of world shared memory (WSM). - * @device_id: The ID of an opened device to retrieve the WSM from. - * @align: The alignment (number of pages) of the memory block - * (e.g. 0x00000001 for 4kb). - * @len: Length of the block in bytes. - * @wsm: Virtual address of the world shared memory block. - * @wsm_flags: Platform specific flags describing the memory to - * be allocated. - * - * The MC driver allocates a contiguous block of memory which can be used as - * WSM. - * This implicates that the allocated memory is aligned according to the - * alignment parameter. - * - * Always returns a buffer of size WSM_SIZE aligned to 4K. - * - * Align and wsm_flags are currently ignored - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_NO_FREE_MEMORY: no more contiguous memory is - * available in this size or for this - * process - */ -__MC_CLIENT_LIB_API enum mc_result mc_malloc_wsm( - uint32_t device_id, - uint32_t align, - uint32_t len, - uint8_t **wsm, - uint32_t wsm_flags -); - -/** - * mc_free_wsm() - Free a block of world shared memory (WSM). - * @device_id: The ID to which the given address belongs - * @wsm: Address of WSM block to be freed - * - * The MC driver will free a block of world shared memory (WSM) previously - * allocated with mc_malloc_wsm(). The caller has to assure that the address - * handed over to the driver is a valid WSM address. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: when device id is invalid - * MC_DRV_ERR_FREE_MEMORY_FAILED: on failure - */ -__MC_CLIENT_LIB_API enum mc_result mc_free_wsm(uint32_t device_id, - uint8_t *wsm); - -/** - *mc_map() - Map additional bulk buffer between a Trustlet Connector (TLC) - * and the Trustlet (TL) for a session - * @session: Session handle with information of the device_id and - * the session_id. The given buffer is mapped to the - * session specified in the sessionHandle - * @buf: Virtual address of a memory portion (relative to TLC) - * to be shared with the Trustlet, already includes a - * possible offset! - * @len: length of buffer block in bytes. - * @map_info: Information structure about the mapped Bulk buffer - * between the TLC (NWd) and the TL (SWd). - * - * Memory allocated in user space of the TLC can be mapped as additional - * communication channel (besides TCI) to the Trustlet. Limitation of the - * Trustlet memory structure apply: only 6 chunks can be mapped with a maximum - * chunk size of 1 MiB each. - * - * It is up to the application layer (TLC) to inform the Trustlet - * about the additional mapped bulk memory. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - * MC_DRV_ERR_BULK_MAPPING: buf is already uses as bulk buffer or - * when registering the buffer failed - */ -__MC_CLIENT_LIB_API enum mc_result mc_map( - struct mc_session_handle *session, void *buf, uint32_t len, - struct mc_bulk_map *map_info); - -/** - * mc_unmap() - Remove additional mapped bulk buffer between Trustlet Connector - * (TLC) and the Trustlet (TL) for a session - * @session: Session handle with information of the device_id and - * the session_id. The given buffer is unmapped from the - * session specified in the sessionHandle. - * @buf: Virtual address of a memory portion (relative to TLC) - * shared with the TL, already includes a possible offset! - * @map_info: Information structure about the mapped Bulk buffer - * between the TLC (NWd) and the TL (SWd) - * - * The bulk buffer will immediately be unmapped from the session context. - * - * The application layer (TLC) must inform the TL about unmapping of the - * additional bulk memory before calling mc_unmap! - * - * The clientlib currently ignores the len field in map_info. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - * MC_DRV_ERR_BULK_UNMAPPING: buf was not registered earlier - * or when unregistering failed - */ -__MC_CLIENT_LIB_API enum mc_result mc_unmap( - struct mc_session_handle *session, void *buf, - struct mc_bulk_map *map_info); - -/* - * mc_get_session_error_code() - Get additional error information of the last - * error that occurred on a session. - * @session: Session handle with information of the device_id and - * the session_id - * @exit_code: >0 Trustlet has terminated itself with this value, - * <0 Trustlet is dead because of an error within the - * MobiCore (e.g. Kernel exception). See also MCI - * definition. - * - * After the request the stored error code will be deleted. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - */ -__MC_CLIENT_LIB_API enum mc_result mc_get_session_error_code( - struct mc_session_handle *session, int32_t *exit_code); - -#endif /* _MOBICORE_DRIVER_API_H_ */ diff --git a/drivers/gud/MobiCoreDriver/scheduler.c b/drivers/gud/MobiCoreDriver/scheduler.c deleted file mode 100644 index 444f839d8ad1d..0000000000000 --- a/drivers/gud/MobiCoreDriver/scheduler.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "main.h" -#include "fastcall.h" -#include "debug.h" -#include "logging.h" -#include "mcp.h" -#include "scheduler.h" - -#define SCHEDULING_FREQ 5 /**< N-SIQ every n-th time */ - -static struct sched_ctx { - struct task_struct *thread; - bool thread_run; - struct completion idle_complete; /* Unblock scheduler thread */ - struct completion sleep_complete; /* Wait for sleep status */ - struct mutex sleep_mutex; /* Protect sleep request */ - struct mutex request_mutex; /* Protect all below */ - /* The order of this enum matters */ - enum { - NONE, /* No specific request */ - YIELD, /* Run the SWd */ - NSIQ, /* Schedule the SWd */ - SUSPEND, /* Suspend the SWd */ - RESUME, /* Resume the SWd */ - } request; - bool suspended; -} sched_ctx; - -static int mc_scheduler_command(int command) -{ - if (IS_ERR_OR_NULL(sched_ctx.thread)) - return -EFAULT; - - mutex_lock(&sched_ctx.request_mutex); - if (sched_ctx.request < command) { - sched_ctx.request = command; - complete(&sched_ctx.idle_complete); - } - - mutex_unlock(&sched_ctx.request_mutex); - return 0; -} - -static int mc_scheduler_pm_command(int command) -{ - int ret = -EPERM; - - if (IS_ERR_OR_NULL(sched_ctx.thread)) - return -EFAULT; - - mutex_lock(&sched_ctx.sleep_mutex); - - /* Send request */ - mc_scheduler_command(command); - - /* Wait for scheduler to reply */ - wait_for_completion(&sched_ctx.sleep_complete); - mutex_lock(&sched_ctx.request_mutex); - if (command == SUSPEND) { - if (sched_ctx.suspended) - ret = 0; - } else { - if (!sched_ctx.suspended) - ret = 0; - } - - mutex_unlock(&sched_ctx.request_mutex); - - mutex_unlock(&sched_ctx.sleep_mutex); - return ret; -} - -static int mc_dev_command(enum mcp_scheduler_commands command) -{ - switch (command) { - case MCP_YIELD: - return mc_scheduler_command(YIELD); - case MCP_NSIQ: - return mc_scheduler_command(NSIQ); - } - - return -EINVAL; -} - -int mc_scheduler_suspend(void) -{ - return mc_scheduler_pm_command(SUSPEND); -} - -int mc_scheduler_resume(void) -{ - return mc_scheduler_pm_command(RESUME); -} - -/* - * This thread, and only this thread, schedules the SWd. Hence, reading the idle - * status and its associated timeout is safe from race conditions. - */ -static int tee_scheduler(void *arg) -{ - int timeslice = 0; /* Actually scheduling period */ - int ret = 0; - - MCDRV_DBG("enter"); - while (1) { - int32_t timeout_ms = -1; - bool pm_request = false; - - if (sched_ctx.suspended || mcp_get_idle_timeout(&timeout_ms)) { - /* If timeout is 0 we keep scheduling the SWd */ - if (!timeout_ms) - mc_scheduler_command(NSIQ); - else if (timeout_ms < 0) - wait_for_completion(&sched_ctx.idle_complete); - else if (!wait_for_completion_timeout( - &sched_ctx.idle_complete, - msecs_to_jiffies(timeout_ms))) - /* Timed out, force SWd schedule */ - mc_scheduler_command(NSIQ); - } - - if (kthread_should_stop() || !sched_ctx.thread_run) - break; - - /* Get requested command if any */ - mutex_lock(&sched_ctx.request_mutex); - if (sched_ctx.request == YIELD) - /* Yield forced: increment timeslice */ - timeslice++; - else if (sched_ctx.request >= NSIQ) { - /* Force N_SIQ, also to suspend/resume SWd */ - timeslice = 0; - if (sched_ctx.request == SUSPEND) { - mcp_suspend(); - pm_request = true; - } else if (sched_ctx.request == RESUME) { - mcp_resume(); - pm_request = true; - } - } - - sched_ctx.request = NONE; - mutex_unlock(&sched_ctx.request_mutex); - - /* Reset timeout so we don't loop if SWd halted */ - mcp_reset_idle_timeout(); - if (timeslice--) { - /* Resume SWd from where it was */ - ret = mc_fc_yield(); - } else { - timeslice = SCHEDULING_FREQ; - /* Call SWd scheduler */ - ret = mc_fc_nsiq(); - } - - /* Always flush log buffer after the SWd has run */ - mc_logging_run(); - if (ret) - break; - - /* Should have suspended by now if requested */ - mutex_lock(&sched_ctx.request_mutex); - if (pm_request) { - sched_ctx.suspended = mcp_suspended(); - complete(&sched_ctx.sleep_complete); - } - - mutex_unlock(&sched_ctx.request_mutex); - - /* Flush pending notifications if possible */ - if (mcp_notifications_flush()) - complete(&sched_ctx.idle_complete); - } - - MCDRV_DBG("exit, ret is %d", ret); - return ret; -} - -int mc_scheduler_start(void) -{ - sched_ctx.thread_run = true; - sched_ctx.thread = kthread_run(tee_scheduler, NULL, "tee_scheduler"); - if (IS_ERR(sched_ctx.thread)) { - MCDRV_ERROR("tee_scheduler thread creation failed"); - return PTR_ERR(sched_ctx.thread); - } - - mcp_register_scheduler(mc_dev_command); - complete(&sched_ctx.idle_complete); - return 0; -} - -void mc_scheduler_stop(void) -{ - mcp_register_scheduler(NULL); - sched_ctx.thread_run = false; - complete(&sched_ctx.idle_complete); - kthread_stop(sched_ctx.thread); -} - -int mc_scheduler_init(void) -{ - init_completion(&sched_ctx.idle_complete); - init_completion(&sched_ctx.sleep_complete); - mutex_init(&sched_ctx.sleep_mutex); - mutex_init(&sched_ctx.request_mutex); - return 0; -} diff --git a/drivers/gud/MobiCoreDriver/scheduler.h b/drivers/gud/MobiCoreDriver/scheduler.h deleted file mode 100644 index c3c17f1c9017c..0000000000000 --- a/drivers/gud/MobiCoreDriver/scheduler.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MC_SCHEDULER_H__ -#define __MC_SCHEDULER_H__ - -int mc_scheduler_init(void); -static inline void mc_scheduler_exit(void) {} -int mc_scheduler_start(void); -void mc_scheduler_stop(void); -int mc_scheduler_suspend(void); -int mc_scheduler_resume(void); - -#endif /* __MC_SCHEDULER_H__ */ diff --git a/drivers/gud/MobiCoreDriver/session.c b/drivers/gud/MobiCoreDriver/session.c deleted file mode 100644 index 1dbb8900b2b3a..0000000000000 --- a/drivers/gud/MobiCoreDriver/session.c +++ /dev/null @@ -1,779 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "platform.h" /* MC_UIDGID_OLDSTYLE */ -#include "main.h" -#include "debug.h" -#include "mmu.h" -#include "mcp.h" -#include "client.h" /* *cbuf* */ -#include "session.h" -#include "mci/mcimcp.h" - -#define SHA1_HASH_SIZE 20 - -struct tbase_wsm { - /* Buffer NWd addr (uva or kva, used only for lookup) */ - uintptr_t va; - /* buffer length */ - uint32_t len; - /* Buffer SWd addr */ - uint32_t sva; - /* mmu L2 table */ - struct tbase_mmu *mmu; - /* possibly a pointer to a cbuf */ - struct tbase_cbuf *cbuf; - /* list node */ - struct list_head list; -}; - -/* - * Postponed closing for GP TAs. - * Implemented as a worker because cannot be executed from within isr_worker. - */ -static void session_close_worker(struct work_struct *work) -{ - struct mcp_session *mcp_session; - struct tbase_session *session; - - mcp_session = container_of(work, struct mcp_session, close_work); - session = container_of(mcp_session, struct tbase_session, mcp_session); - session_close(session); -} - -/* Forward declarations */ -static struct tbase_wsm *wsm_create(struct tbase_session *session, - uintptr_t buf, uint32_t len); -static void wsm_free(struct tbase_wsm *wsm); - -static int hash_path_and_data(char *hash, const void *data, - unsigned int data_len) -{ - struct mm_struct *mm = current->mm; - struct hash_desc desc; - struct scatterlist sg; - char *buf; - char *path; - unsigned int path_len; - int ret = 0; - - buf = (char *)__get_free_page(GFP_KERNEL); - if (!buf) - return -ENOMEM; - - down_read(&mm->mmap_sem); - if (!mm->exe_file) { - ret = -ENOENT; - goto end; - } - - path = d_path(&mm->exe_file->f_path, buf, PAGE_SIZE); - if (IS_ERR(path)) { - ret = PTR_ERR(path); - goto end; - } - - MCDRV_DBG("current process path = "); - { - char *c; - - for (c = path; *c; c++) - MCDRV_DBG("%c %d", *c, *c); - } - - path_len = strnlen(path, PAGE_SIZE); - MCDRV_DBG("path_len = %u", path_len); - desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC); - if (IS_ERR(desc.tfm)) { - ret = PTR_ERR(desc.tfm); - MCDRV_DBG("could not alloc hash = %d", ret); - goto end; - } - - desc.flags = 0; - sg_init_one(&sg, path, path_len); - crypto_hash_init(&desc); - crypto_hash_update(&desc, &sg, path_len); - if (data) { - MCDRV_DBG("current process path: hashing additional data\n"); - sg_init_one(&sg, data, data_len); - crypto_hash_update(&desc, &sg, data_len); - } - - crypto_hash_final(&desc, hash); - crypto_free_hash(desc.tfm); - -end: - up_read(&mm->mmap_sem); - free_page((unsigned long)buf); - - return ret; -} - -static int check_prepare_identity(const struct mc_identity *identity, - struct identity *mcp_identity) -{ - struct mc_identity *mcp_id = (struct mc_identity *)mcp_identity; - uint8_t hash[SHA1_HASH_SIZE]; - bool application = false; - const void *data; - unsigned int data_len; - - /* Mobicore doesn't support GP client authentication. */ - if (!g_ctx.f_client_login && - (identity->login_type != TEEC_LOGIN_PUBLIC)) { - MCDRV_DBG_WARN("Unsupported login type %d", - identity->login_type); - return -EINVAL; - } - - /* Copy login type */ - mcp_identity->login_type = identity->login_type; - - /* Fill in uid field */ - if ((identity->login_type == TEEC_LOGIN_USER) || - (identity->login_type == TEEC_LOGIN_USER_APPLICATION)) { - /* Set euid and ruid of the process. */ -#if !defined(KUIDT_INIT) || defined(MC_UIDGID_OLDSTYLE) - mcp_id->uid.euid = current_euid(); - mcp_id->uid.ruid = current_uid(); -#else - mcp_id->uid.euid = current_euid().val; - mcp_id->uid.ruid = current_uid().val; -#endif - } - - /* Check gid field */ - if ((identity->login_type == TEEC_LOGIN_GROUP) || - (identity->login_type == TEEC_LOGIN_GROUP_APPLICATION)) { -#if !defined(KUIDT_INIT) || defined(MC_UIDGID_OLDSTYLE) - gid_t gid = identity->gid; -#else - kgid_t gid = { - .val = identity->gid, - }; -#endif - /* Check if gid is one of: egid of the process, its rgid or one - * of its supplementary groups */ - if (!in_egroup_p(gid) && !in_group_p(gid)) { - MCDRV_DBG("group %d not allowed", identity->gid); - return -EACCES; - } - - MCDRV_DBG("group %d found", identity->gid); - mcp_id->gid = identity->gid; - } - - switch (identity->login_type) { - case TEEC_LOGIN_PUBLIC: - case TEEC_LOGIN_USER: - case TEEC_LOGIN_GROUP: - break; - case TEEC_LOGIN_APPLICATION: - application = true; - data = NULL; - data_len = 0; - break; - case TEEC_LOGIN_USER_APPLICATION: - application = true; - data = &mcp_id->uid; - data_len = sizeof(mcp_id->uid); - break; - case TEEC_LOGIN_GROUP_APPLICATION: - application = true; - data = &identity->gid; - data_len = sizeof(identity->gid); - break; - default: - /* Any other login_type value is invalid. */ - MCDRV_DBG_WARN("Invalid login type"); - return -EINVAL; - } - - if (application) { - if (hash_path_and_data(hash, data, data_len)) { - MCDRV_DBG("error in hash calculation"); - return -EAGAIN; - } - - memcpy(&mcp_id->login_data, hash, sizeof(mcp_id->login_data)); - } - - return 0; -} - -/* - * Create a session object. - * Note: object is not attached to client yet. - */ -struct tbase_session *session_create(struct tbase_client *client, bool is_gp, - struct mc_identity *identity) -{ - struct tbase_session *session; - struct identity mcp_identity; - - if (is_gp) { - /* Check identity method and data. */ - int ret = check_prepare_identity(identity, &mcp_identity); - - if (ret) - return ERR_PTR(ret); - } - - /* Allocate session object */ - session = kzalloc(sizeof(*session), GFP_KERNEL); - if (!session) - return ERR_PTR(-ENOMEM); - - mutex_init(&session->close_lock); - /* Initialise object members */ - mcp_session_init(&session->mcp_session, is_gp, &mcp_identity); - INIT_WORK(&session->mcp_session.close_work, session_close_worker); - session->client = client; - kref_init(&session->kref); - INIT_LIST_HEAD(&session->list); - mutex_init(&session->wsms_lock); - INIT_LIST_HEAD(&session->wsms); - MCDRV_DBG("created session %p: client %p", session, session->client); - return session; -} - -int session_open(struct tbase_session *session, const struct tbase_object *obj, - const struct tbase_mmu *obj_mmu, uintptr_t tci, size_t len) -{ - struct mcp_buffer_map map; - - tbase_mmu_buffer(obj_mmu, &map); - /* Create wsm object for tci */ - if (tci && len) { - struct tbase_wsm *wsm; - struct mcp_buffer_map tci_map; - int ret = 0; - - mutex_lock(&session->wsms_lock); - wsm = wsm_create(session, tci, len); - if (IS_ERR(wsm)) - ret = PTR_ERR(wsm); - - mutex_unlock(&session->wsms_lock); - if (ret) - return ret; - - tbase_mmu_buffer(wsm->mmu, &tci_map); - ret = mcp_open_session(&session->mcp_session, obj, &map, - &tci_map); - if (ret) { - mutex_lock(&session->wsms_lock); - wsm_free(wsm); - mutex_unlock(&session->wsms_lock); - } - - return ret; - } - - if (tci || len) { - MCDRV_ERROR("Tci pointer and length are incoherent"); - return -EINVAL; - } - - return mcp_open_session(&session->mcp_session, obj, &map, NULL); -} - -/* - * Close TA and unreference session object. - * Object will be freed if reference reaches 0. - * Session object is assumed to have been removed from main list, which means - * that session_close cannot be called anymore. - */ -int session_close(struct tbase_session *session) -{ - int ret = 0; - - if (!session) - return -ENXIO; - - mutex_lock(&session->close_lock); - switch (mcp_close_session(&session->mcp_session)) { - case 0: - /* TA is closed, remove from closing list */ - mutex_lock(&g_ctx.closing_lock); - list_del(&session->list); - mutex_unlock(&g_ctx.closing_lock); - /* Remove the ref we took on creation, exit if session freed */ - if (session_put(session)) - return 0; - - break; - case -EBUSY: - /* - * (GP) TA needs time to close. The "TA closed" notification - * will trigger a new call to session_close(). - * Return OK but do not unref. - */ - break; - default: - MCDRV_ERROR("Failed to close session %x in SWd", - session->mcp_session.id); - ret = -EPERM; - } - - mutex_unlock(&session->close_lock); - return ret; -} - -/* - * Free session object and all objects it contains (wsm). - */ -static void session_free(struct kref *kref) -{ - struct tbase_session *session; - struct tbase_wsm *wsm, *next; - - /* Remove remaining shared buffers (unmapped in SWd by mcp_close) */ - session = container_of(kref, struct tbase_session, kref); - list_for_each_entry_safe(wsm, next, &session->wsms, list) { - MCDRV_DBG("session %p: free wsm %p", session, wsm); - wsm_free(wsm); - } - - MCDRV_DBG("freed session %p: client %p id %x", - session, session->client, session->mcp_session.id); - kfree(session); -} - -/* - * Unreference session. - * Free session object if reference reaches 0. - */ -int session_put(struct tbase_session *session) -{ - return kref_put(&session->kref, session_free); -} - -/* - * Send a notification to TA - */ -int session_notify_swd(struct tbase_session *session) -{ - if (!session) { - MCDRV_ERROR("Session pointer is null"); - return -EINVAL; - } - - return mcp_notify(&session->mcp_session); -} - -/* - * Read and clear last notification received from TA - */ -int32_t session_exitcode(struct tbase_session *session) -{ - return mcp_session_exitcode(&session->mcp_session); -} - -/* - * Free a WSM object - */ -static void wsm_free(struct tbase_wsm *wsm) -{ - /* Remove wsm from its parent session's list */ - list_del(&wsm->list); - /* Free MMU table */ - if (!IS_ERR_OR_NULL(wsm->mmu)) - tbase_mmu_delete(wsm->mmu); - - /* Unref cbuf if applicable */ - if (wsm->cbuf) - tbase_cbuf_put(wsm->cbuf); - - /* Delete wsm object */ - MCDRV_DBG("freed wsm %p: mmu %p cbuf %p va %lx len %u", - wsm, wsm->mmu, wsm->cbuf, wsm->va, wsm->len); - kfree(wsm); -} - -static struct tbase_wsm *wsm_create(struct tbase_session *session, - uintptr_t buf, uint32_t len) -{ - struct tbase_wsm *wsm; - struct task_struct *task = NULL; - uintptr_t va; - int ret; - - /* Allocate structure */ - wsm = kzalloc(sizeof(*wsm), GFP_KERNEL); - if (!wsm) { - ret = -ENOMEM; - goto err_no_wsm; - } - - /* Add wsm to list so destroy can find it */ - list_add(&wsm->list, &session->wsms); - - /* Check if buffer is contained in a cbuf */ - wsm->cbuf = tbase_cbuf_get_by_addr(session->client, buf); - if (wsm->cbuf) { - uintptr_t offset; - - if (client_is_kernel(session->client)) - offset = buf - tbase_cbuf_addr(wsm->cbuf); - else - offset = buf - tbase_cbuf_uaddr(wsm->cbuf); - - if ((offset + len) > tbase_cbuf_len(wsm->cbuf)) { - ret = -EINVAL; - MCDRV_ERROR("crosses cbuf boundary"); - goto err; - } - /* Provide kernel virtual address */ - va = tbase_cbuf_addr(wsm->cbuf) + offset; - } else { - /* Not a cbuf. va is uva or kva depending on client. */ - /* Provide "task" if client is user */ - va = buf; - if (!client_is_kernel(session->client)) - task = current; - } - - /* Build MMU table for buffer */ - wsm->mmu = tbase_mmu_create(task, (void *)va, len); - if (IS_ERR(wsm->mmu)) { - ret = PTR_ERR(wsm->mmu); - goto err; - } - - wsm->va = buf; - wsm->len = len; - MCDRV_DBG("created wsm %p: mmu %p cbuf %p va %lx len %u", - wsm, wsm->mmu, wsm->cbuf, wsm->va, wsm->len); - goto end; - -err: - wsm_free(wsm); -err_no_wsm: - wsm = ERR_PTR(ret); -end: - return wsm; -} - -static inline int wsm_check(struct tbase_session *session, - struct mc_ioctl_buffer *buf) -{ - struct tbase_wsm *wsm; - - list_for_each_entry(wsm, &session->wsms, list) { - if ((buf->va < (wsm->va + wsm->len)) && - ((buf->va + buf->len) > wsm->va)) { - MCDRV_ERROR("buffer %lx overlaps with existing wsm", - wsm->va); - return -EADDRINUSE; - } - } - - return 0; -} - -static inline struct tbase_wsm *wsm_find(struct tbase_session *session, - uintptr_t va) -{ - struct tbase_wsm *wsm; - - list_for_each_entry(wsm, &session->wsms, list) - if (wsm->va == va) - return wsm; - - return NULL; -} - -static inline int wsm_info(struct tbase_wsm *wsm, struct kasnprintf_buf *buf) -{ - ssize_t ret; - - ret = kasnprintf(buf, "\t\twsm %p: mmu %p cbuf %p va %lx len %u\n", - wsm, wsm->mmu, wsm->cbuf, wsm->va, wsm->len); - if (ret < 0) - return ret; - - if (wsm->mmu) { - ret = tbase_mmu_info(wsm->mmu, buf); - if (ret < 0) - return ret; - } - - return 0; -} - -/* - * Share buffers with SWd and add corresponding WSM objects to session. - */ -int session_wsms_add(struct tbase_session *session, - struct mc_ioctl_buffer *bufs) -{ - struct mc_ioctl_buffer *buf; - struct mcp_buffer_map maps[MC_MAP_MAX]; - struct mcp_buffer_map *map; - int i, ret = 0; - uint32_t n_null_buf = 0; - - /* Check parameters */ - if (!session) - return -ENXIO; - - /* Lock the session */ - mutex_lock(&session->wsms_lock); - - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - if (!buf->va) { - n_null_buf++; - continue; - } - - /* Avoid mapping overlaps */ - if (wsm_check(session, buf)) { - ret = -EADDRINUSE; - MCDRV_ERROR("maps[%d] va=%llx already map'd", i, - buf->va); - goto unlock; - } - } - - if (n_null_buf >= MC_MAP_MAX) { - ret = -EINVAL; - MCDRV_ERROR("va=NULL"); - goto unlock; - } - - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - struct tbase_wsm *wsm; - - if (!buf->va) { - map->type = WSM_INVALID; - continue; - } - - wsm = wsm_create(session, buf->va, buf->len); - if (IS_ERR(wsm)) { - ret = PTR_ERR(wsm); - MCDRV_ERROR("maps[%d] va=%llx create failed: %d", i, - buf->va, ret); - goto end; - } - - tbase_mmu_buffer(wsm->mmu, map); - MCDRV_DBG("maps[%d] va=%llx: t:%u a:%llx o:%u l:%u", i, buf->va, - map->type, map->phys_addr, map->offset, map->length); - } - - /* Map buffers */ - if (g_ctx.f_multimap) { - /* Send MCP message to map buffers in SWd */ - ret = mcp_multimap(session->mcp_session.id, maps); - if (ret) - MCDRV_ERROR("multimap failed: %d", ret); - } else { - /* Map each buffer */ - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, - map++) { - if (!buf->va) - continue; - - /* Send MCP message to map buffer in SWd */ - ret = mcp_map(session->mcp_session.id, map); - if (ret) { - MCDRV_ERROR("maps[%d] va=%llx map failed: %d", - i, buf->va, ret); - break; - } - } - } - -end: - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - struct tbase_wsm *wsm = wsm_find(session, buf->va); - - if (!buf->va) - continue; - - if (ret) { - if (!wsm) - break; - - /* Destroy mapping */ - wsm_free(wsm); - } else { - /* Store mapping */ - buf->sva = map->secure_va; - wsm->sva = buf->sva; - MCDRV_DBG("maps[%d] va=%llx map'd len=%u sva=%llx", - i, buf->va, buf->len, buf->sva); - } - } - -unlock: - /* Unlock the session */ - mutex_unlock(&session->wsms_lock); - return ret; -} - -/* - * Stop sharing buffers and delete corrsponding WSM objects. - */ -int session_wsms_remove(struct tbase_session *session, - const struct mc_ioctl_buffer *bufs) -{ - const struct mc_ioctl_buffer *buf; - struct mcp_buffer_map maps[MC_MAP_MAX]; - struct mcp_buffer_map *map; - int i, ret = 0; - uint32_t n_null_buf = 0; - - if (!session) { - MCDRV_ERROR("session pointer is null"); - return -EINVAL; - } - - /* Lock the session */ - mutex_lock(&session->wsms_lock); - - /* Find, check and map buffer */ - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - struct tbase_wsm *wsm; - - if (!buf->va) { - n_null_buf++; - map->secure_va = 0; - continue; - } - - wsm = wsm_find(session, buf->va); - if (!wsm) { - ret = -EADDRNOTAVAIL; - MCDRV_ERROR("maps[%d] va=%llx not found", i, - buf->va); - goto out; - } - - /* Check input params consistency */ - /* TODO: fix the spec, "len" is NOT ignored anymore */ - if ((wsm->sva != buf->sva) || (wsm->len != buf->len)) { - MCDRV_ERROR("maps[%d] va=%llx no match: %x != %llx", - i, buf->va, wsm->sva, buf->sva); - MCDRV_ERROR("maps[%d] va=%llx no match: %u != %u", - i, buf->va, wsm->len, buf->len); - ret = -EINVAL; - goto out; - } - - tbase_mmu_buffer(wsm->mmu, map); - map->secure_va = buf->sva; - MCDRV_DBG("maps[%d] va=%llx: t:%u a:%llx o:%u l:%u s:%llx", i, - buf->va, map->type, map->phys_addr, map->offset, - map->length, map->secure_va); - } - - if (n_null_buf >= MC_MAP_MAX) { - ret = -EINVAL; - MCDRV_ERROR("va=NULL"); - goto out; - } - - if (g_ctx.f_multimap) { - /* Send MCP command to unmap buffers in SWd */ - ret = mcp_multiunmap(session->mcp_session.id, maps); - if (ret) - MCDRV_ERROR("mcp_multiunmap failed: %d", ret); - } else { - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; - i++, buf++, map++) { - if (!buf->va) - continue; - - /* Send MCP command to unmap buffer in SWd */ - ret = mcp_unmap(session->mcp_session.id, map); - if (ret) { - MCDRV_ERROR("maps[%d] va=%llx unmap failed: %d", - i, buf->va, ret); - break; - } - } - } - - for (i = 0, buf = bufs; i < MC_MAP_MAX; i++, buf++) { - struct tbase_wsm *wsm = wsm_find(session, buf->va); - - if (!wsm) - break; - - /* Free wsm */ - wsm_free(wsm); - MCDRV_DBG("maps[%d] va=%llx unmap'd len=%u sva=%llx", i, - buf->va, buf->len, buf->sva); - } - -out: - mutex_unlock(&session->wsms_lock); - return ret; -} - -/* - * Sleep until next notification from SWd. - */ -int session_waitnotif(struct tbase_session *session, int32_t timeout) -{ - return mcp_session_waitnotif(&session->mcp_session, timeout); -} - -int session_info(struct tbase_session *session, struct kasnprintf_buf *buf) -{ - struct tbase_wsm *wsm; - int32_t exit_code = mcp_session_exitcode(&session->mcp_session); - int ret; - - ret = kasnprintf(buf, "\tsession %p: %x rc %d\n", session, - session->mcp_session.id, exit_code); - if (ret < 0) - return ret; - - /* WMSs */ - mutex_lock(&session->wsms_lock); - if (list_empty(&session->wsms)) - goto done; - - list_for_each_entry(wsm, &session->wsms, list) { - ret = wsm_info(wsm, buf); - if (ret < 0) - goto done; - } - -done: - mutex_unlock(&session->wsms_lock); - if (ret < 0) - return ret; - - return 0; -} diff --git a/drivers/gud/MobiCoreDriver/session.h b/drivers/gud/MobiCoreDriver/session.h deleted file mode 100644 index aec0c09ae9c9a..0000000000000 --- a/drivers/gud/MobiCoreDriver/session.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _SESSION_H_ -#define _SESSION_H_ - -#include - -#include "mcp.h" - -struct tbase_object; -struct tbase_mmu; -struct mc_ioctl_buffer; - -struct tbase_session { - /* Session list lock */ - struct mutex close_lock; - /* MCP session descriptor (MUST BE FIRST) */ - struct mcp_session mcp_session; - /* Owner */ - struct tbase_client *client; - /* Number of references kept to this object */ - struct kref kref; - /* The list entry to attach to session list of owner */ - struct list_head list; - /* Session WSMs lock */ - struct mutex wsms_lock; - /* List of WSMs for a session */ - struct list_head wsms; -}; - -struct tbase_session *session_create(struct tbase_client *client, bool is_gp, - struct mc_identity *identity); -int session_open(struct tbase_session *session, const struct tbase_object *obj, - const struct tbase_mmu *obj_mmu, uintptr_t tci, size_t len); -int session_close(struct tbase_session *session); -static inline void session_get(struct tbase_session *session) -{ - kref_get(&session->kref); -} - -int session_put(struct tbase_session *session); -int session_wsms_add(struct tbase_session *session, - struct mc_ioctl_buffer *bufs); -int session_wsms_remove(struct tbase_session *session, - const struct mc_ioctl_buffer *bufs); -int32_t session_exitcode(struct tbase_session *session); -int session_notify_swd(struct tbase_session *session); -int session_waitnotif(struct tbase_session *session, int32_t timeout); -int session_info(struct tbase_session *session, struct kasnprintf_buf *buf); - -#endif /* _SESSION_H_ */ diff --git a/drivers/gud/setupDrivers.sh b/drivers/gud/setupDrivers.sh deleted file mode 100644 index 994e83e8d9517..0000000000000 --- a/drivers/gud/setupDrivers.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -export COMP_PATH_ROOT=$(dirname $(readlink -f $BASH_SOURCE)) #set this to the absolute path of the folder containing this file - -# This part has to be set by the customer -# To be set, absolute path of kernel folder -export LINUX_PATH= -# To be set, absolute path! CROSS_COMPILE variable needed by kernel eg /home/user/arm-2009q3/bin/arm-none-linux-gnueabi- -export CROSS_COMPILE= -# To be set, build mode debug or release -export MODE=debug -# To be set, the absolute path to the Linux Android NDK -export NDK_PATH= - -# Global variables needed by build scripts -export COMP_PATH_Logwrapper=$COMP_PATH_ROOT/Logwrapper/Out -export COMP_PATH_MobiCore=$COMP_PATH_ROOT/MobiCore/Out -export COMP_PATH_MobiCoreDriverMod=$COMP_PATH_ROOT/mobicore_driver/Out -export COMP_PATH_MobiCoreDriverLib=$COMP_PATH_ROOT/daemon/Out -export COMP_PATH_AndroidNdkLinux=$NDK_PATH From d7dba1ba6406c7926465b6dd618bbe1652923bb2 Mon Sep 17 00:00:00 2001 From: Trudy Shearer Date: Mon, 22 May 2017 12:33:15 +0100 Subject: [PATCH 0825/1015] defconfig: gud: Remove gud driver Disable and remove gud mobicore driver. Change-Id: Ia16bc3e1331f86724a391fd367587b56ccc14546 Acked-by: Tony Hamilton Signed-off-by: Trudy Shearer --- arch/arm64/configs/msm-auto_defconfig | 1 - arch/arm64/configs/msm_defconfig | 1 - 2 files changed, 2 deletions(-) diff --git a/arch/arm64/configs/msm-auto_defconfig b/arch/arm64/configs/msm-auto_defconfig index 57dcb9b175601..05ab497f2b095 100644 --- a/arch/arm64/configs/msm-auto_defconfig +++ b/arch/arm64/configs/msm-auto_defconfig @@ -597,7 +597,6 @@ CONFIG_CORESIGHT_REMOTE_ETM=y CONFIG_CORESIGHT_QPDI=y CONFIG_SENSORS_SSC=y CONFIG_MSM_TZ_LOG=y -CONFIG_MOBICORE_DRIVER=m CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT3_FS=y diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index 257f650f74fb1..c56c4af32672b 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -600,7 +600,6 @@ CONFIG_CORESIGHT_REMOTE_ETM=y CONFIG_CORESIGHT_QPDI=y CONFIG_SENSORS_SSC=y CONFIG_MSM_TZ_LOG=y -CONFIG_MOBICORE_DRIVER=m CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT3_FS=y From 13d45c26a08b959b0bf7e419c82611d5c81a49e9 Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Thu, 25 May 2017 10:26:13 +0530 Subject: [PATCH 0826/1015] input: qpnp-power-on: Add debounce for KPDPWR_N rising edge On certain PMICs, an unexpected assertion on KPDPWR_DBC may be seen during falling edge of KPDPWR_N when it is closer to the rising edge of SLEEP_CLK. This triggers spurious KPDPWR interrupts. Handle this by adding a debounce in SW when the first KPDPWR_N falling edge is seen. The debounce logic is enabled by the DT property 'qcom,kpdpwr-sw-debounce'. CRs-Fixed: 2032520 Change-Id: I7655c13bda47fa6e2983650d7bec21e52aa91c2f Signed-off-by: Anirudh Ghayal --- .../bindings/platform/msm/qpnp-power-on.txt | 2 + drivers/platform/msm/qpnp-power-on.c | 58 +++++++++++++++++-- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/Documentation/devicetree/bindings/platform/msm/qpnp-power-on.txt b/Documentation/devicetree/bindings/platform/msm/qpnp-power-on.txt index d5e79dba0b6d3..e673d9629a8ce 100644 --- a/Documentation/devicetree/bindings/platform/msm/qpnp-power-on.txt +++ b/Documentation/devicetree/bindings/platform/msm/qpnp-power-on.txt @@ -71,6 +71,8 @@ Optional properties: but this applies for the system hard reset case. - qcom,shutdown-poweroff-type Same description as qcom,warm-reset-poweroff-type but this applies for the system shutdown case. +- qcom,kpdpwr-sw-debounce Boolean property to enable the debounce logic + on the KPDPWR_N rising edge. All the below properties are in the sub-node section (properties of the child diff --git a/drivers/platform/msm/qpnp-power-on.c b/drivers/platform/msm/qpnp-power-on.c index 4e2a085f8b0a8..991716f06500a 100644 --- a/drivers/platform/msm/qpnp-power-on.c +++ b/drivers/platform/msm/qpnp-power-on.c @@ -206,7 +206,7 @@ struct qpnp_pon { int num_pon_reg; int num_pon_config; int reg_count; - u32 dbc; + u32 dbc_time_us; u32 uvlo; int warm_reset_poff_type; int hard_reset_poff_type; @@ -218,6 +218,8 @@ struct qpnp_pon { u8 warm_reset_reason2; bool is_spon; bool store_hard_reset_reason; + bool kpdpwr_dbc_enable; + ktime_t kpdpwr_last_release_time; }; static struct qpnp_pon *sys_reset_dev; @@ -390,7 +392,7 @@ static int qpnp_pon_set_dbc(struct qpnp_pon *pon, u32 delay) int rc = 0; u32 delay_reg; - if (delay == pon->dbc) + if (delay == pon->dbc_time_us) goto out; if (pon->pon_input) mutex_lock(&pon->pon_input->mutex); @@ -410,7 +412,7 @@ static int qpnp_pon_set_dbc(struct qpnp_pon *pon, u32 delay) goto unlock; } - pon->dbc = delay; + pon->dbc_time_us = delay; unlock: if (pon->pon_input) @@ -419,12 +421,31 @@ static int qpnp_pon_set_dbc(struct qpnp_pon *pon, u32 delay) return rc; } +static int qpnp_pon_get_dbc(struct qpnp_pon *pon, u32 *delay) +{ + int rc; + u8 val; + + rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + QPNP_PON_DBC_CTL(pon), &val, 1); + if (rc) { + pr_err("Unable to read pon_dbc_ctl rc=%d\n", rc); + return rc; + } + val &= QPNP_PON_DBC_DELAY_MASK(pon); + + *delay = USEC_PER_SEC / + (1 << (QPNP_PON_DELAY_BIT_SHIFT - val)); + + return rc; +} + static ssize_t qpnp_pon_dbc_show(struct device *dev, struct device_attribute *attr, char *buf) { struct qpnp_pon *pon = dev_get_drvdata(dev); - return snprintf(buf, QPNP_PON_BUFFER_SIZE, "%d\n", pon->dbc); + return snprintf(buf, QPNP_PON_BUFFER_SIZE, "%d\n", pon->dbc_time_us); } static ssize_t qpnp_pon_dbc_store(struct device *dev, @@ -757,6 +778,7 @@ qpnp_pon_input_dispatch(struct qpnp_pon *pon, u32 pon_type) struct qpnp_pon_config *cfg = NULL; u8 pon_rt_sts = 0, pon_rt_bit = 0; u32 key_status; + u64 elapsed_us; cfg = qpnp_get_cfg(pon, pon_type); if (!cfg) @@ -766,6 +788,15 @@ qpnp_pon_input_dispatch(struct qpnp_pon *pon, u32 pon_type) if (!cfg->key_code) return 0; + if (pon->kpdpwr_dbc_enable && cfg->pon_type == PON_KPDPWR) { + elapsed_us = ktime_us_delta(ktime_get(), + pon->kpdpwr_last_release_time); + if (elapsed_us < pon->dbc_time_us) { + pr_debug("Ignoring kpdpwr event - within debounce time\n"); + return 0; + } + } + /* check the RT status to get the current status of the line */ rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, QPNP_PON_RT_STS(pon), &pon_rt_sts, 1); @@ -795,6 +826,11 @@ qpnp_pon_input_dispatch(struct qpnp_pon *pon, u32 pon_type) cfg->key_code, pon_rt_sts); key_status = pon_rt_sts & pon_rt_bit; + if (pon->kpdpwr_dbc_enable && cfg->pon_type == PON_KPDPWR) { + if (!key_status) + pon->kpdpwr_last_release_time = ktime_get(); + } + /* simulate press event in case release event occured * without a press event */ @@ -2194,8 +2230,22 @@ static int qpnp_pon_probe(struct spmi_device *spmi) } } else { rc = qpnp_pon_set_dbc(pon, delay); + if (rc) { + dev_err(&spmi->dev, + "Unable to set PON debounce delay rc=%d\n", rc); + return rc; + } + } + rc = qpnp_pon_get_dbc(pon, &pon->dbc_time_us); + if (rc) { + dev_err(&spmi->dev, + "Unable to get PON debounce delay rc=%d\n", rc); + return rc; } + pon->kpdpwr_dbc_enable = of_property_read_bool(pon->spmi->dev.of_node, + "qcom,kpdpwr-sw-debounce"); + rc = of_property_read_u32(pon->spmi->dev.of_node, "qcom,warm-reset-poweroff-type", &pon->warm_reset_poff_type); From 8eaedf27b742327f6de0a8e68230828a99f93285 Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Thu, 25 May 2017 12:19:18 +0530 Subject: [PATCH 0827/1015] ARM: dts: msm: Enable KPDPWR software debounce for PM8994 Enable the SW debounce handling for KPDPWR_N rising edge. CRs-Fixed: 2032520 Change-Id: I63ec4b1539947a110d455dcf53d79219366696db Signed-off-by: Anirudh Ghayal --- arch/arm/boot/dts/qcom/msm-pm8994.dtsi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm-pm8994.dtsi b/arch/arm/boot/dts/qcom/msm-pm8994.dtsi index c913f53ce9ae4..719ae7a561f1e 100644 --- a/arch/arm/boot/dts/qcom/msm-pm8994.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pm8994.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2015, 2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -49,6 +49,7 @@ qcom,pon-dbc-delay = <15625>; qcom,system-reset; qcom,store-hard-reset-reason; + qcom,kpdpwr-sw-debounce; qcom,pon_1 { qcom,pon-type = <0>; From b46109f035a58a11a313254c134f9ce010da1cbd Mon Sep 17 00:00:00 2001 From: Depeng Shao Date: Thu, 11 May 2017 15:50:11 +0800 Subject: [PATCH 0828/1015] msm: camera: sensor: Validate sensor name during probe Some cameras have same sensor id in one device, but camera sensor driver just validate sensor id now which may result in wrong probe when camera daemon is killed and camera re-probe sensor again. Also validate the sensor name if sensor has probed. Change-Id: I641bf8c346bada9e6cc619389077e25e666c743f Signed-off-by: Depeng Shao --- .../platform/msm/camera_v2/sensor/msm_sensor_driver.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c index 16cacecb8ae59..226a19357528c 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -767,9 +767,12 @@ int32_t msm_sensor_driver_probe(void *setting, */ if (slave_info->sensor_id_info.sensor_id == s_ctrl->sensordata->cam_slave_info-> - sensor_id_info.sensor_id) { - pr_err("slot%d: sensor id%d already probed\n", + sensor_id_info.sensor_id && + !(strcmp(slave_info->sensor_name, + s_ctrl->sensordata->cam_slave_info->sensor_name))) { + pr_err("slot%d: sensor name: %s sensor id%d already probed\n", slave_info->camera_id, + slave_info->sensor_name, s_ctrl->sensordata->cam_slave_info-> sensor_id_info.sensor_id); msm_sensor_fill_sensor_info(s_ctrl, From 29b35e188d430d076cd59409674803f6d304a927 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Fri, 21 Apr 2017 15:38:13 +0530 Subject: [PATCH 0829/1015] msm: kgsl: Perform cache operation with kernel address Kernel should never access untrusted pointers directly. If the address is not mapped to kernel, map to kernel address space and perform cache related operation. Change-Id: I433befcde620e51b8ec17954ddb710f6084e0592 Signed-off-by: Hareesh Gundu Signed-off-by: haranath --- drivers/gpu/msm/kgsl_sharedmem.c | 133 ++++++++++++++++++++++++------- 1 file changed, 104 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 12a6ac97e0303..bc201a2e14fb7 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -560,16 +560,70 @@ static inline unsigned int _fixup_cache_range_op(unsigned int op) } #endif -int kgsl_cache_range_op(struct kgsl_memdesc *memdesc, uint64_t offset, - uint64_t size, unsigned int op) +static int kgsl_do_cache_op(struct page *page, void *addr, + uint64_t offset, uint64_t size, unsigned int op) { + void (*cache_op)(const void *, const void *); + /* - * If the buffer is mapped in the kernel operate on that address - * otherwise use the user address + * The dmac_xxx_range functions handle addresses and sizes that + * are not aligned to the cacheline size correctly. */ + switch (_fixup_cache_range_op(op)) { + case KGSL_CACHE_OP_FLUSH: + cache_op = dmac_flush_range; + break; + case KGSL_CACHE_OP_CLEAN: + cache_op = dmac_clean_range; + break; + case KGSL_CACHE_OP_INV: + cache_op = dmac_inv_range; + break; + default: + return -EINVAL; + } - void *addr = (memdesc->hostptr) ? - memdesc->hostptr : (void *) memdesc->useraddr; + if (page != NULL) { + unsigned long pfn = page_to_pfn(page) + offset / PAGE_SIZE; + /* + * page_address() returns the kernel virtual address of page. + * For high memory kernel virtual address exists only if page + * has been mapped. So use a version of kmap rather than + * page_address() for high memory. + */ + if (PageHighMem(page)) { + offset &= ~PAGE_MASK; + + do { + unsigned int len = size; + + if (len + offset > PAGE_SIZE) + len = PAGE_SIZE - offset; + + page = pfn_to_page(pfn++); + addr = kmap_atomic(page); + cache_op(addr + offset, addr + offset + len); + kunmap_atomic(addr); + + size -= len; + offset = 0; + } while (size); + + return 0; + } + + addr = page_address(page); + } + + cache_op(addr + offset, addr + offset + (size_t) size); + return 0; +} + +int kgsl_cache_range_op(struct kgsl_memdesc *memdesc, uint64_t offset, + uint64_t size, unsigned int op) +{ + void *addr = NULL; + int ret = 0; if (size == 0 || size > UINT_MAX) return -EINVAL; @@ -578,38 +632,59 @@ int kgsl_cache_range_op(struct kgsl_memdesc *memdesc, uint64_t offset, if ((offset + size < offset) || (offset + size < size)) return -ERANGE; - /* Make sure the offset + size do not overflow the address */ - if (addr + ((size_t) offset + (size_t) size) < addr) - return -ERANGE; - /* Check that offset+length does not exceed memdesc->size */ if (offset + size > memdesc->size) return -ERANGE; - /* Return quietly if the buffer isn't mapped on the CPU */ - if (addr == NULL) - return 0; + if (memdesc->hostptr) { + addr = memdesc->hostptr; + /* Make sure the offset + size do not overflow the address */ + if (addr + ((size_t) offset + (size_t) size) < addr) + return -ERANGE; - addr = addr + offset; + ret = kgsl_do_cache_op(NULL, addr, offset, size, op); + return ret; + } /* - * The dmac_xxx_range functions handle addresses and sizes that - * are not aligned to the cacheline size correctly. + * If the buffer is not to mapped to kernel, perform cache + * operations after mapping to kernel. */ + if (memdesc->sgt != NULL) { + struct scatterlist *sg; + unsigned int i, pos = 0; - switch (_fixup_cache_range_op(op)) { - case KGSL_CACHE_OP_FLUSH: - dmac_flush_range(addr, addr + (size_t) size); - break; - case KGSL_CACHE_OP_CLEAN: - dmac_clean_range(addr, addr + (size_t) size); - break; - case KGSL_CACHE_OP_INV: - dmac_inv_range(addr, addr + (size_t) size); - break; - } + for_each_sg(memdesc->sgt->sgl, sg, memdesc->sgt->nents, i) { + uint64_t sg_offset, sg_left; - return 0; + if (offset >= (pos + sg->length)) { + pos += sg->length; + continue; + } + sg_offset = offset > pos ? offset - pos : 0; + sg_left = (sg->length - sg_offset > size) ? size : + sg->length - sg_offset; + ret = kgsl_do_cache_op(sg_page(sg), NULL, sg_offset, + sg_left, op); + size -= sg_left; + if (size == 0) + break; + pos += sg->length; + } + } else if (memdesc->pages != NULL) { + addr = vmap(memdesc->pages, memdesc->page_count, + VM_IOREMAP, pgprot_writecombine(PAGE_KERNEL)); + if (addr == NULL) + return -ENOMEM; + + /* Make sure the offset + size do not overflow the address */ + if (addr + ((size_t) offset + (size_t) size) < addr) + return -ERANGE; + + ret = kgsl_do_cache_op(NULL, addr, offset, size, op); + vunmap(addr); + } + return ret; } EXPORT_SYMBOL(kgsl_cache_range_op); From 93ff0480de45e6a98a1ea2dbbefef5816cf98630 Mon Sep 17 00:00:00 2001 From: Odelu Kukatla Date: Wed, 10 May 2017 19:16:09 +0530 Subject: [PATCH 0830/1015] clk: msm: clock-alpha-pll: Update handoff for dynamic alpha pll Current handoff of alpha pll does not store the current VCO mode for slewing pll. Calculate and store the VCO mode during handoff for slewing PLL, so as to avoid PLL disable and reconfiguration during the set rate. Change-Id: I765bf9c3cbf0ae745f32a5eed157e10307a94e03 Signed-off-by: Odelu Kukatla --- drivers/clk/msm/clock-alpha-pll.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/clk/msm/clock-alpha-pll.c b/drivers/clk/msm/clock-alpha-pll.c index f7ba7118a60ae..d86ac1175c7bc 100644 --- a/drivers/clk/msm/clock-alpha-pll.c +++ b/drivers/clk/msm/clock-alpha-pll.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -805,8 +805,15 @@ static enum handoff alpha_pll_handoff(struct clk *c) update_vco_tbl(pll); if (!is_locked(pll)) { - if (c->rate && alpha_pll_set_rate(c, c->rate)) - WARN(1, "%s: Failed to configure rate\n", c->dbg_name); + if (pll->slew) { + if (c->rate && dyna_alpha_pll_set_rate(c, c->rate)) + WARN(1, "%s: Failed to configure rate\n", + c->dbg_name); + } else { + if (c->rate && alpha_pll_set_rate(c, c->rate)) + WARN(1, "%s: Failed to configure rate\n", + c->dbg_name); + } __init_alpha_pll(c); return HANDOFF_DISABLED_CLK; } else if (pll->fsm_en_mask && !is_fsm_mode(MODE_REG(pll))) { From d04e9202839d3e274794d57d05caeaa00b2e6cf3 Mon Sep 17 00:00:00 2001 From: Gopikrishna Mogasati Date: Fri, 5 May 2017 16:04:35 +0530 Subject: [PATCH 0831/1015] diag: Add proper synchronization checks to msg mask table This fix removes dependency between real time message mask table and build time message mask table. Also this fix synchronizes retrieval and modification of real time message mask table. CRs-Fixed: 2015227 Change-Id: Id0a0964337ec4645d7061fc35120dfa061a990ff Signed-off-by: Gopikrishna Mogasati --- drivers/char/diag/diag_masks.c | 59 ++++++++++++++++++++++--------- drivers/char/diag/diagchar.h | 2 ++ drivers/char/diag/diagchar_core.c | 1 + drivers/char/diag/diagfwd_cntl.c | 14 +++++--- 4 files changed, 54 insertions(+), 22 deletions(-) diff --git a/drivers/char/diag/diag_masks.c b/drivers/char/diag/diag_masks.c index f6709faa2d77c..64d5b431aa1d7 100644 --- a/drivers/char/diag/diag_masks.c +++ b/drivers/char/diag/diag_masks.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -308,7 +308,12 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last) if (!mask_info) return; + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)mask_info->ptr; + if (!mask->ptr) { + mutex_unlock(&driver->msg_mask_lock); + return; + } buf = mask_info->update_buf; mutex_lock(&mask_info->lock); switch (mask_info->status) { @@ -381,6 +386,7 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last) } err: mutex_unlock(&mask_info->lock); + mutex_unlock(&driver->msg_mask_lock); } static void diag_send_time_sync_update(uint8_t peripheral) @@ -493,6 +499,7 @@ static int diag_cmd_get_ssid_range(unsigned char *src_buf, int src_len, if (!diag_apps_responds()) return 0; + mutex_lock(&driver->msg_mask_lock); rsp.cmd_code = DIAG_CMD_MSG_CONFIG; rsp.sub_cmd = DIAG_CMD_OP_GET_SSID_RANGE; rsp.status = MSG_STATUS_SUCCESS; @@ -500,7 +507,6 @@ static int diag_cmd_get_ssid_range(unsigned char *src_buf, int src_len, rsp.count = driver->msg_mask_tbl_count; memcpy(dest_buf, &rsp, sizeof(rsp)); write_len += sizeof(rsp); - mask_ptr = (struct diag_msg_mask_t *)mask_info->ptr; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask_ptr++) { if (write_len + sizeof(ssid_range) > dest_len) { @@ -513,6 +519,7 @@ static int diag_cmd_get_ssid_range(unsigned char *src_buf, int src_len, memcpy(dest_buf + write_len, &ssid_range, sizeof(ssid_range)); write_len += sizeof(ssid_range); } + mutex_unlock(&driver->msg_mask_lock); return write_len; } @@ -538,6 +545,7 @@ static int diag_cmd_get_build_mask(unsigned char *src_buf, int src_len, if (!diag_apps_responds()) return 0; + mutex_lock(&driver->msg_mask_lock); req = (struct diag_build_mask_req_t *)src_buf; rsp.cmd_code = DIAG_CMD_MSG_CONFIG; rsp.sub_cmd = DIAG_CMD_OP_GET_BUILD_MASK; @@ -545,9 +553,8 @@ static int diag_cmd_get_build_mask(unsigned char *src_buf, int src_len, rsp.ssid_last = req->ssid_last; rsp.status = MSG_STATUS_FAIL; rsp.padding = 0; - build_mask = (struct diag_msg_mask_t *)msg_bt_mask.ptr; - for (i = 0; i < driver->msg_mask_tbl_count; i++, build_mask++) { + for (i = 0; i < driver->bt_msg_mask_tbl_count; i++, build_mask++) { if (build_mask->ssid_first != req->ssid_first) continue; num_entries = req->ssid_last - req->ssid_first + 1; @@ -568,6 +575,7 @@ static int diag_cmd_get_build_mask(unsigned char *src_buf, int src_len, } memcpy(dest_buf, &rsp, sizeof(rsp)); write_len += sizeof(rsp); + mutex_unlock(&driver->msg_mask_lock); return write_len; } @@ -596,6 +604,7 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len, if (!diag_apps_responds()) return 0; + mutex_lock(&driver->msg_mask_lock); req = (struct diag_build_mask_req_t *)src_buf; rsp.cmd_code = DIAG_CMD_MSG_CONFIG; rsp.sub_cmd = DIAG_CMD_OP_GET_MSG_MASK; @@ -603,7 +612,6 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len, rsp.ssid_last = req->ssid_last; rsp.status = MSG_STATUS_FAIL; rsp.padding = 0; - mask = (struct diag_msg_mask_t *)mask_info->ptr; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { if ((req->ssid_first < mask->ssid_first) || @@ -621,6 +629,7 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len, } memcpy(dest_buf, &rsp, sizeof(rsp)); write_len += sizeof(rsp); + mutex_unlock(&driver->msg_mask_lock); return write_len; } @@ -652,7 +661,7 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len, } req = (struct diag_msg_build_mask_t *)src_buf; - + mutex_lock(&driver->msg_mask_lock); mutex_lock(&mask_info->lock); mask = (struct diag_msg_mask_t *)mask_info->ptr; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { @@ -712,6 +721,7 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len, break; } mutex_unlock(&mask_info->lock); + mutex_unlock(&driver->msg_mask_lock); if (diag_check_update(APPS_DATA)) diag_update_userspace_clients(MSG_MASKS_TYPE); @@ -766,6 +776,7 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len, req = (struct diag_msg_config_rsp_t *)src_buf; + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)mask_info->ptr; mutex_lock(&mask_info->lock); mask_info->status = (req->rt_mask) ? DIAG_CTRL_MASK_ALL_ENABLED : @@ -777,6 +788,7 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len, mutex_unlock(&mask->lock); } mutex_unlock(&mask_info->lock); + mutex_unlock(&driver->msg_mask_lock); if (diag_check_update(APPS_DATA)) diag_update_userspace_clients(MSG_MASKS_TYPE); @@ -1280,6 +1292,7 @@ static int diag_create_msg_mask_table(void) struct diag_msg_mask_t *mask = (struct diag_msg_mask_t *)msg_mask.ptr; struct diag_ssid_range_t range; + mutex_lock(&driver->msg_mask_lock); mutex_lock(&msg_mask.lock); driver->msg_mask_tbl_count = MSG_MASK_TBL_CNT; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { @@ -1290,6 +1303,8 @@ static int diag_create_msg_mask_table(void) break; } mutex_unlock(&msg_mask.lock); + mutex_unlock(&driver->msg_mask_lock); + return err; } @@ -1302,9 +1317,11 @@ static int diag_create_build_time_mask(void) struct diag_msg_mask_t *build_mask = NULL; struct diag_ssid_range_t range; + mutex_lock(&driver->msg_mask_lock); mutex_lock(&msg_bt_mask.lock); + driver->bt_msg_mask_tbl_count = MSG_MASK_TBL_CNT; build_mask = (struct diag_msg_mask_t *)msg_bt_mask.ptr; - for (i = 0; i < driver->msg_mask_tbl_count; i++, build_mask++) { + for (i = 0; i < driver->bt_msg_mask_tbl_count; i++, build_mask++) { range.ssid_first = msg_mask_tbl[i].ssid_first; range.ssid_last = msg_mask_tbl[i].ssid_last; err = diag_create_msg_mask_table_entry(build_mask, &range); @@ -1415,6 +1432,7 @@ static int diag_create_build_time_mask(void) memcpy(build_mask->ptr, tbl, tbl_size); } mutex_unlock(&msg_bt_mask.lock); + mutex_unlock(&driver->msg_mask_lock); return err; } @@ -1562,10 +1580,11 @@ static int diag_msg_mask_init(void) pr_err("diag: Unable to create msg masks, err: %d\n", err); return err; } + mutex_lock(&driver->msg_mask_lock); driver->msg_mask = &msg_mask; - for (i = 0; i < NUM_PERIPHERALS; i++) driver->max_ssid_count[i] = 0; + mutex_unlock(&driver->msg_mask_lock); return 0; } @@ -1584,7 +1603,7 @@ int diag_msg_mask_copy(struct diag_mask_info *dest, struct diag_mask_info *src) err = __diag_mask_init(dest, MSG_MASK_SIZE, APPS_BUF_SIZE); if (err) return err; - + mutex_lock(&driver->msg_mask_lock); mutex_lock(&dest->lock); src_mask = (struct diag_msg_mask_t *)src->ptr; dest_mask = (struct diag_msg_mask_t *)dest->ptr; @@ -1603,6 +1622,7 @@ int diag_msg_mask_copy(struct diag_mask_info *dest, struct diag_mask_info *src) dest_mask++; } mutex_unlock(&dest->lock); + mutex_unlock(&driver->msg_mask_lock); return err; } @@ -1614,7 +1634,7 @@ void diag_msg_mask_free(struct diag_mask_info *mask_info) if (!mask_info) return; - + mutex_lock(&driver->msg_mask_lock); mutex_lock(&mask_info->lock); mask = (struct diag_msg_mask_t *)mask_info->ptr; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { @@ -1622,7 +1642,7 @@ void diag_msg_mask_free(struct diag_mask_info *mask_info) mask->ptr = NULL; } mutex_unlock(&mask_info->lock); - + mutex_unlock(&driver->msg_mask_lock); __diag_mask_exit(mask_info); } @@ -1630,15 +1650,17 @@ static void diag_msg_mask_exit(void) { int i; struct diag_msg_mask_t *mask = NULL; - + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)(msg_mask.ptr); if (mask) { for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) kfree(mask->ptr); kfree(msg_mask.ptr); + msg_mask.ptr = NULL; } - kfree(msg_mask.update_buf); + msg_mask.update_buf = NULL; + mutex_unlock(&driver->msg_mask_lock); } static int diag_build_time_mask_init(void) @@ -1663,13 +1685,15 @@ static void diag_build_time_mask_exit(void) { int i; struct diag_msg_mask_t *mask = NULL; - + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)(msg_bt_mask.ptr); if (mask) { - for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) + for (i = 0; i < driver->bt_msg_mask_tbl_count; i++, mask++) kfree(mask->ptr); - kfree(msg_mask.ptr); + kfree(msg_bt_mask.ptr); + msg_bt_mask.ptr = NULL; } + mutex_unlock(&driver->msg_mask_lock); } static int diag_log_mask_init(void) @@ -1787,7 +1811,7 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count, return -EIO; } mutex_unlock(&driver->diag_maskclear_mutex); - + mutex_lock(&driver->msg_mask_lock); mutex_lock(&mask_info->lock); mask = (struct diag_msg_mask_t *)(mask_info->ptr); for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { @@ -1826,6 +1850,7 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count, total_len += len; } mutex_unlock(&mask_info->lock); + mutex_unlock(&driver->msg_mask_lock); return err ? err : total_len; } diff --git a/drivers/char/diag/diagchar.h b/drivers/char/diag/diagchar.h index 8a2c2546d7c2f..065196a91aae9 100644 --- a/drivers/char/diag/diagchar.h +++ b/drivers/char/diag/diagchar.h @@ -582,8 +582,10 @@ struct diagchar_dev { struct diag_mask_info *event_mask; struct diag_mask_info *build_time_mask; uint8_t msg_mask_tbl_count; + uint8_t bt_msg_mask_tbl_count; uint16_t event_mask_size; uint16_t last_event_id; + struct mutex msg_mask_lock; /* Variables for Mask Centralization */ uint16_t num_event_id[NUM_PERIPHERALS]; uint32_t num_equip_id[NUM_PERIPHERALS]; diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index 86655beaeac16..1fa052f8fb876 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -3395,6 +3395,7 @@ static int __init diagchar_init(void) mutex_init(&driver->diag_file_mutex); mutex_init(&driver->delayed_rsp_mutex); mutex_init(&apps_data_mutex); + mutex_init(&driver->msg_mask_lock); for (i = 0; i < NUM_PERIPHERALS; i++) mutex_init(&driver->diagfwd_channel_mutex[i]); init_waitqueue_head(&driver->wait_q); diff --git a/drivers/char/diag/diagfwd_cntl.c b/drivers/char/diag/diagfwd_cntl.c index 594d3b1bf3b58..410790e116915 100644 --- a/drivers/char/diag/diagfwd_cntl.c +++ b/drivers/char/diag/diagfwd_cntl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -508,6 +508,7 @@ static void process_ssid_range_report(uint8_t *buf, uint32_t len, /* Don't account for pkt_id and length */ read_len += header_len - (2 * sizeof(uint32_t)); + mutex_lock(&driver->msg_mask_lock); driver->max_ssid_count[peripheral] = header->count; for (i = 0; i < header->count && read_len < len; i++) { ssid_range = (struct diag_ssid_range_t *)ptr; @@ -551,6 +552,7 @@ static void process_ssid_range_report(uint8_t *buf, uint32_t len, } driver->msg_mask_tbl_count += 1; } + mutex_unlock(&driver->msg_mask_lock); } static void diag_build_time_mask_update(uint8_t *buf, @@ -575,11 +577,11 @@ static void diag_build_time_mask_update(uint8_t *buf, __func__, range->ssid_first, range->ssid_last); return; } - + mutex_lock(&driver->msg_mask_lock); build_mask = (struct diag_msg_mask_t *)(driver->build_time_mask->ptr); num_items = range->ssid_last - range->ssid_first + 1; - for (i = 0; i < driver->msg_mask_tbl_count; i++, build_mask++) { + for (i = 0; i < driver->bt_msg_mask_tbl_count; i++, build_mask++) { if (build_mask->ssid_first != range->ssid_first) continue; found = 1; @@ -598,7 +600,7 @@ static void diag_build_time_mask_update(uint8_t *buf, if (found) goto end; - new_size = (driver->msg_mask_tbl_count + 1) * + new_size = (driver->bt_msg_mask_tbl_count + 1) * sizeof(struct diag_msg_mask_t); temp = krealloc(driver->build_time_mask->ptr, new_size, GFP_KERNEL); if (!temp) { @@ -613,8 +615,10 @@ static void diag_build_time_mask_update(uint8_t *buf, __func__, err); goto end; } - driver->msg_mask_tbl_count += 1; + driver->bt_msg_mask_tbl_count += 1; end: + mutex_unlock(&driver->msg_mask_lock); + return; } From 118ba634584a2b757bd4327502ad95b90c44a937 Mon Sep 17 00:00:00 2001 From: Abir Ghosh Date: Fri, 12 May 2017 09:16:34 +0530 Subject: [PATCH 0832/1015] qbt1000: Fix for incorrect buffer size check and integer overflow Fix an incorrect buffer size check which might have caused integer overflow. CRs-Fixed: 2045285 Change-Id: I3b5b996c7405f51b488d6cbda31c81a9a9905f23 Signed-off-by: Abir Ghosh --- drivers/soc/qcom/qbt1000.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/soc/qcom/qbt1000.c b/drivers/soc/qcom/qbt1000.c index 7f99c86368358..ee4939ab3ecdd 100644 --- a/drivers/soc/qcom/qbt1000.c +++ b/drivers/soc/qcom/qbt1000.c @@ -108,15 +108,16 @@ static int get_cmd_rsp_buffers(struct qseecom_handle *hdl, uint32_t *rsp_len) { /* 64 bytes alignment for QSEECOM */ - *cmd_len = ALIGN(*cmd_len, 64); - *rsp_len = ALIGN(*rsp_len, 64); + uint64_t aligned_cmd_len = ALIGN((uint64_t)*cmd_len, 64); + uint64_t aligned_rsp_len = ALIGN((uint64_t)*rsp_len, 64); - if (((uint64_t)*rsp_len + (uint64_t)*cmd_len) - > (uint64_t)g_app_buf_size) + if ((aligned_rsp_len + aligned_cmd_len) > (uint64_t)g_app_buf_size) return -ENOMEM; *cmd = hdl->sbuf; + *cmd_len = aligned_cmd_len; *rsp = hdl->sbuf + *cmd_len; + *rsp_len = aligned_rsp_len; return 0; } From a84f18aacc60f3d5959396b4f42cd1b9c338f412 Mon Sep 17 00:00:00 2001 From: Shiju Mathew Date: Fri, 12 May 2017 17:05:53 -0400 Subject: [PATCH 0833/1015] msm: ba: Update printk format specifier to prevent leaks Update printk format from %p to %pK in msm_ba driver to hide exposed kernel pointers. CRs-Fixed: 2036994 Change-Id: I8f9290670888a0b351339990f0dc2fa4fcc78b26 Signed-off-by: Shiju Mathew --- drivers/video/msm/ba/msm_ba.c | 10 +++++----- drivers/video/msm/ba/msm_ba_debug.c | 20 ++++++++++---------- drivers/video/msm/ba/msm_v4l2_ba.c | 6 +++--- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/drivers/video/msm/ba/msm_ba.c b/drivers/video/msm/ba/msm_ba.c index 43feb0f365651..0461a98ace5e3 100644 --- a/drivers/video/msm/ba/msm_ba.c +++ b/drivers/video/msm/ba/msm_ba.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -53,7 +53,7 @@ int msm_ba_querycap(void *instance, struct v4l2_capability *cap) if (!inst || !cap) { dprintk(BA_ERR, - "Invalid input, inst = 0x%p, cap = 0x%p", inst, cap); + "Invalid input, inst = 0x%pK, cap = 0x%pK", inst, cap); return -EINVAL; } @@ -77,7 +77,7 @@ int msm_ba_g_priority(void *instance, enum v4l2_priority *prio) if (!inst || !prio) { dprintk(BA_ERR, - "Invalid prio, inst = 0x%p, prio = 0x%p", inst, prio); + "Invalid prio, inst = 0x%pK, prio = 0x%pK", inst, prio); return -EINVAL; } @@ -692,7 +692,7 @@ static int msm_ba_register_v4l2_subdev(struct v4l2_device *v4l2_dev, struct video_device *vdev; int rc = 0; - dprintk(BA_DBG, "Enter %s: v4l2_dev 0x%p, v4l2_subdev 0x%p", + dprintk(BA_DBG, "Enter %s: v4l2_dev 0x%pK, v4l2_subdev 0x%pK", __func__, v4l2_dev, sd); if (NULL == v4l2_dev || NULL == sd || !sd->name[0]) { dprintk(BA_ERR, "Invalid input"); @@ -944,7 +944,7 @@ int msm_ba_close(void *instance) debugfs_remove_recursive(inst->debugfs_root); - dprintk(BA_DBG, "Closed BA instance: %p", inst); + dprintk(BA_DBG, "Closed BA instance: %pK", inst); kfree(inst); return rc; diff --git a/drivers/video/msm/ba/msm_ba_debug.c b/drivers/video/msm/ba/msm_ba_debug.c index d41d1ab8a6fee..d2441021ef2f8 100644 --- a/drivers/video/msm/ba/msm_ba_debug.c +++ b/drivers/video/msm/ba/msm_ba_debug.c @@ -60,7 +60,7 @@ static ssize_t dev_info_read(struct file *file, char __user *buf, ssize_t size = 0; if (!dev_ctxt) { - dprintk(BA_ERR, "Invalid params, dev: 0x%p", dev_ctxt); + dprintk(BA_ERR, "Invalid params, dev: 0x%pK", dev_ctxt); return 0; } @@ -70,7 +70,7 @@ static ssize_t dev_info_read(struct file *file, char __user *buf, INIT_DBG_BUF(dbg_buf); write_str(dbg_buf, "==============================="); - write_str(dbg_buf, "DEV: 0x%p", dev_ctxt); + write_str(dbg_buf, "DEV: 0x%pK", dev_ctxt); write_str(dbg_buf, "==============================="); write_str(dbg_buf, "state: %d", dev_ctxt->state); @@ -102,7 +102,7 @@ struct dentry *msm_ba_debugfs_init_drv(void) struct dentry *f = debugfs_create_##__type(__name, S_IRUGO | S_IWUSR, \ dir, __value); \ if (IS_ERR_OR_NULL(f)) { \ - dprintk(BA_ERR, "Failed creating debugfs file '%pd/%s'", \ + dprintk(BA_ERR, "Failed creating debugfs file '%pKd/%s'", \ dir, __name); \ f = NULL; \ } \ @@ -135,11 +135,11 @@ struct dentry *msm_ba_debugfs_init_dev(struct msm_ba_dev *dev_ctxt, char debugfs_name[MAX_DEBUGFS_NAME]; if (!dev_ctxt) { - dprintk(BA_ERR, "Invalid params, core: %p", dev_ctxt); + dprintk(BA_ERR, "Invalid params, core: %pK", dev_ctxt); goto failed_create_dir; } - snprintf(debugfs_name, MAX_DEBUGFS_NAME, "dev_%p", dev_ctxt); + snprintf(debugfs_name, MAX_DEBUGFS_NAME, "dev_%pK", dev_ctxt); dir = debugfs_create_dir(debugfs_name, parent); if (!dir) { dprintk(BA_ERR, "Failed to create debugfs for msm_ba"); @@ -168,7 +168,7 @@ static ssize_t inst_info_read(struct file *file, char __user *buf, ssize_t size = 0; if (!inst) { - dprintk(BA_ERR, "Invalid params, dev: %p", inst); + dprintk(BA_ERR, "Invalid params, dev: %pK", inst); return 0; } @@ -178,10 +178,10 @@ static ssize_t inst_info_read(struct file *file, char __user *buf, INIT_DBG_BUF(dbg_buf); write_str(dbg_buf, "==============================="); - write_str(dbg_buf, "INSTANCE: %p (%s)", inst, + write_str(dbg_buf, "INSTANCE: %pK (%s)", inst, "BA device"); write_str(dbg_buf, "==============================="); - write_str(dbg_buf, "dev: %p", inst->dev_ctxt); + write_str(dbg_buf, "dev: %pK", inst->dev_ctxt); write_str(dbg_buf, "state: %d", inst->state); size = simple_read_from_buffer(buf, count, ppos, @@ -204,10 +204,10 @@ struct dentry *msm_ba_debugfs_init_inst(struct msm_ba_inst *inst, char debugfs_name[MAX_DEBUGFS_NAME]; if (!inst) { - dprintk(BA_ERR, "Invalid params, inst: %p", inst); + dprintk(BA_ERR, "Invalid params, inst: %pK", inst); goto failed_create_dir; } - snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%p", inst); + snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%pK", inst); dir = debugfs_create_dir(debugfs_name, parent); if (!dir) { dprintk(BA_ERR, "Failed to create debugfs for msm_ba"); diff --git a/drivers/video/msm/ba/msm_v4l2_ba.c b/drivers/video/msm/ba/msm_v4l2_ba.c index d0fff6ba34bc6..300630ad85875 100644 --- a/drivers/video/msm/ba/msm_v4l2_ba.c +++ b/drivers/video/msm/ba/msm_v4l2_ba.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -387,7 +387,7 @@ static int msm_ba_device_init(struct platform_device *pdev, if ((NULL == ret_dev_ctxt) || (NULL != *ret_dev_ctxt) || (NULL == pdev)) { - dprintk(BA_ERR, "%s(%d) Invalid params %p %p %p", + dprintk(BA_ERR, "%s(%d) Invalid params %pK %pK %pK", __func__, __LINE__, ret_dev_ctxt, *ret_dev_ctxt, pdev); return -EINVAL; @@ -471,7 +471,7 @@ static int msm_ba_probe(struct platform_device *pdev) struct ba_ctxt *ba_ctxt; int rc = 0; - dprintk(BA_INFO, "Enter %s: pdev %p device id = %d", + dprintk(BA_INFO, "Enter %s: pdev %pK device id = %d", __func__, pdev, pdev->id); ba_ctxt = msm_ba_get_ba_context(); From 6225a08d9d593a2c59c89964c3c294e80dbc6283 Mon Sep 17 00:00:00 2001 From: Taniya Das Date: Wed, 17 May 2017 09:54:59 +0530 Subject: [PATCH 0834/1015] clk : msm: Add support for 600MHz for GPU clock GPU clock frequency has been updated for SDM450 to support 600MHz, add support for the same to add a new GPU frequency table. Change-Id: Id9c0d2a0a859715e1d08dcfbfa2c3793bebeb9bd Signed-off-by: Taniya Das --- .../bindings/arm/msm/clock-controller.txt | 1 + drivers/clk/msm/clock-gcc-8953.c | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/msm/clock-controller.txt b/Documentation/devicetree/bindings/arm/msm/clock-controller.txt index 62440baac3287..7d060b169494c 100644 --- a/Documentation/devicetree/bindings/arm/msm/clock-controller.txt +++ b/Documentation/devicetree/bindings/arm/msm/clock-controller.txt @@ -70,6 +70,7 @@ Required properties: "qcom,gpucc-8996-v3.0" "qcom,gpucc-8996-pro" "qcom,gcc-gfx-8953" + "qcom,gcc-gfx-sdm450" "qcom,gcc-californium" "qcom,cc-debug-californium" "qcom,gcc-mdm9607" diff --git a/drivers/clk/msm/clock-gcc-8953.c b/drivers/clk/msm/clock-gcc-8953.c index bf0696d700bd2..d96fc42282be3 100644 --- a/drivers/clk/msm/clock-gcc-8953.c +++ b/drivers/clk/msm/clock-gcc-8953.c @@ -391,6 +391,25 @@ static struct clk_freq_tbl ftbl_gfx3d_clk_src[] = { F_END }; +static struct clk_freq_tbl ftbl_gfx3d_clk_src_sdm450[] = { + F_MM( 19200000, FIXED_CLK_SRC, xo, 1, 0, 0), + F_MM( 50000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 8, 0, 0), + F_MM( 80000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 5, 0, 0), + F_MM( 100000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 4, 0, 0), + F_MM( 133330000, FIXED_CLK_SRC, gpll0_main_div2_mm, 3, 0, 0), + F_MM( 160000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 2.5, 0, 0), + F_MM( 200000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 2, 0, 0), + F_MM( 216000000, FIXED_CLK_SRC, gpll6_main_div2_gfx, 2.5, 0, 0), + F_MM( 266670000, FIXED_CLK_SRC, gpll0, 3, 0, 0), + F_MM( 320000000, FIXED_CLK_SRC, gpll0, 2.5, 0, 0), + F_MM( 400000000, FIXED_CLK_SRC, gpll0, 2, 0, 0), + F_MM( 460800000, FIXED_CLK_SRC, gpll4_out_aux, 2.5, 0, 0), + F_MM( 510000000, 1020000000, gpll3, 1, 0, 0), + F_MM( 560000000, 1120000000, gpll3, 1, 0, 0), + F_MM( 600000000, 1200000000, gpll3, 1, 0, 0), + F_END +}; + static struct rcg_clk gfx3d_clk_src = { .cmd_rcgr_reg = GFX3D_CMD_RCGR, .set_rate = set_rate_hid, @@ -3984,6 +4003,7 @@ static int msm_gcc_gfx_probe(struct platform_device *pdev) struct resource *res; int ret; u32 regval; + bool compat_bin = false; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cc_base"); if (!res) { @@ -4005,6 +4025,11 @@ static int msm_gcc_gfx_probe(struct platform_device *pdev) return PTR_ERR(vdd_gfx.regulator[0]); } + compat_bin = of_device_is_compatible(pdev->dev.of_node, + "qcom,gcc-gfx-sdm450"); + if (compat_bin) + gfx3d_clk_src.freq_tbl = ftbl_gfx3d_clk_src_sdm450; + ret = of_get_fmax_vdd_class(pdev, &gcc_oxili_gfx3d_clk.c, "qcom,gfxfreq-corner"); if (ret) { @@ -4027,6 +4052,7 @@ static int msm_gcc_gfx_probe(struct platform_device *pdev) static struct of_device_id msm_clock_gfx_match_table[] = { { .compatible = "qcom,gcc-gfx-8953" }, + { .compatible = "qcom,gcc-gfx-sdm450" }, {} }; From 0f783076c88c8627c8d45842ae29074a5f0bb9f4 Mon Sep 17 00:00:00 2001 From: Taniya Das Date: Thu, 18 May 2017 11:35:48 +0530 Subject: [PATCH 0835/1015] ARM : dts: msm: Update gfx clock corners for SDM450 New frequency table is required to be supported for GPU clients, update the gfxfreq-corner table for the same. Change-Id: I2ba8b73a96e7bd36171326ddb948ff7a85578b00 Signed-off-by: Taniya Das --- arch/arm/boot/dts/qcom/sdm450.dtsi | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/arch/arm/boot/dts/qcom/sdm450.dtsi b/arch/arm/boot/dts/qcom/sdm450.dtsi index 9cabb44a8d184..0300973b88b39 100644 --- a/arch/arm/boot/dts/qcom/sdm450.dtsi +++ b/arch/arm/boot/dts/qcom/sdm450.dtsi @@ -22,3 +22,16 @@ soc: soc { }; }; + +&clock_gcc_gfx { + compatible = "qcom,gcc-gfx-sdm450"; + qcom,gfxfreq-corner = + < 0 0 >, + < 133330000 1 >, /* Min SVS */ + < 216000000 2 >, /* Low SVS */ + < 320000000 3 >, /* SVS */ + < 400000000 4 >, /* SVS Plus */ + < 510000000 5 >, /* NOM */ + < 560000000 6 >, /* Nom Plus */ + < 600000000 7 >; /* Turbo */ +}; From 01958d3f3ef91036bf3c33c9c5cf895c3bf6afc5 Mon Sep 17 00:00:00 2001 From: Hareesh Gundu Date: Thu, 18 May 2017 16:19:47 +0530 Subject: [PATCH 0836/1015] ARM : dts: msm: Add 600Mhz GPU clock support for SDM450 SDM450 GPU can support max 600Mhz clock. Add support for new GPU powerlevel. Change-Id: If2eabd74065e3b2417b840d79c982f7495646a02 Signed-off-by: Hareesh Gundu --- arch/arm/boot/dts/qcom/sdm450.dtsi | 83 ++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/arch/arm/boot/dts/qcom/sdm450.dtsi b/arch/arm/boot/dts/qcom/sdm450.dtsi index 0300973b88b39..029e055b46d3b 100644 --- a/arch/arm/boot/dts/qcom/sdm450.dtsi +++ b/arch/arm/boot/dts/qcom/sdm450.dtsi @@ -35,3 +35,86 @@ < 560000000 6 >, /* Nom Plus */ < 600000000 7 >; /* Turbo */ }; + +/* GPU Overrides*/ +&msm_gpu { + + /delete-node/qcom,gpu-pwrlevels; + + qcom,gpu-pwrlevels { + #address-cells = <1>; + #size-cells = <0>; + + compatible = "qcom,gpu-pwrlevels"; + + /* TURBO */ + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <600000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <10>; + qcom,bus-max = <10>; + }; + + /* NOM+ */ + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <560000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <8>; + qcom,bus-max = <10>; + }; + + /* NOM */ + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <510000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <6>; + qcom,bus-max = <10>; + }; + + /* SVS+ */ + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <400000000>; + qcom,bus-freq = <7>; + qcom,bus-min = <5>; + qcom,bus-max = <8>; + }; + + /* SVS */ + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <320000000>; + qcom,bus-freq = <4>; + qcom,bus-min = <2>; + qcom,bus-max = <6>; + }; + + /* Low SVS */ + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <216000000>; + qcom,bus-freq = <1>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + + /* Min SVS */ + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <133300000>; + qcom,bus-freq = <1>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + /* XO */ + qcom,gpu-pwrlevel@7 { + reg = <7>; + qcom,gpu-freq = <19200000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + }; + }; +}; From 5557b58fc4abe79c932dad4a3cb891ad146de6aa Mon Sep 17 00:00:00 2001 From: Trudy Shearer Date: Thu, 18 May 2017 17:31:51 +0100 Subject: [PATCH 0837/1015] msm : gud: Remove gud driver Complete removal of gud mobicore driver. The driver author delivers an updated version of this driver to interested parties directly rendering this version obsolete. Change-Id: I40498d3203b1d6ca04f2b5a2e65461851d84d2d4 Acked-by: Tony Hamilton Signed-off-by: Trudy Shearer --- drivers/Kconfig | 2 - drivers/Makefile | 3 - drivers/gud/Kconfig | 35 - drivers/gud/Makefile | 6 - drivers/gud/MobiCoreDriver/Makefile | 33 - drivers/gud/MobiCoreDriver/admin.c | 1011 ---------------- drivers/gud/MobiCoreDriver/admin.h | 32 - drivers/gud/MobiCoreDriver/api.c | 419 ------- drivers/gud/MobiCoreDriver/api.h | 46 - drivers/gud/MobiCoreDriver/arm.h | 88 -- drivers/gud/MobiCoreDriver/build_tag.h | 15 - drivers/gud/MobiCoreDriver/client.c | 572 --------- drivers/gud/MobiCoreDriver/client.h | 99 -- drivers/gud/MobiCoreDriver/clientlib.c | 433 ------- drivers/gud/MobiCoreDriver/clock.c | 161 --- drivers/gud/MobiCoreDriver/clock.h | 53 - drivers/gud/MobiCoreDriver/debug.h | 63 - drivers/gud/MobiCoreDriver/fastcall.c | 512 -------- drivers/gud/MobiCoreDriver/fastcall.h | 38 - drivers/gud/MobiCoreDriver/logging.c | 251 ---- drivers/gud/MobiCoreDriver/logging.h | 51 - drivers/gud/MobiCoreDriver/main.c | 750 ------------ drivers/gud/MobiCoreDriver/main.h | 60 - drivers/gud/MobiCoreDriver/mci/mcifc.h | 144 --- drivers/gud/MobiCoreDriver/mci/mcimcp.h | 508 -------- drivers/gud/MobiCoreDriver/mci/mcinq.h | 86 -- drivers/gud/MobiCoreDriver/mci/mcloadformat.h | 134 --- drivers/gud/MobiCoreDriver/mcp.c | 1067 ----------------- drivers/gud/MobiCoreDriver/mcp.h | 121 -- drivers/gud/MobiCoreDriver/mmu.c | 450 ------- drivers/gud/MobiCoreDriver/mmu.h | 44 - drivers/gud/MobiCoreDriver/platform.h | 150 --- drivers/gud/MobiCoreDriver/pm.c | 62 - drivers/gud/MobiCoreDriver/pm.h | 36 - drivers/gud/MobiCoreDriver/public/mc_admin.h | 80 -- drivers/gud/MobiCoreDriver/public/mc_linux.h | 170 --- .../gud/MobiCoreDriver/public/mc_linux_api.h | 28 - .../public/mobicore_driver_api.h | 450 ------- drivers/gud/MobiCoreDriver/scheduler.c | 231 ---- drivers/gud/MobiCoreDriver/scheduler.h | 25 - drivers/gud/MobiCoreDriver/session.c | 779 ------------ drivers/gud/MobiCoreDriver/session.h | 63 - drivers/gud/setupDrivers.sh | 19 - 43 files changed, 9380 deletions(-) delete mode 100644 drivers/gud/Kconfig delete mode 100644 drivers/gud/Makefile delete mode 100644 drivers/gud/MobiCoreDriver/Makefile delete mode 100644 drivers/gud/MobiCoreDriver/admin.c delete mode 100644 drivers/gud/MobiCoreDriver/admin.h delete mode 100644 drivers/gud/MobiCoreDriver/api.c delete mode 100644 drivers/gud/MobiCoreDriver/api.h delete mode 100644 drivers/gud/MobiCoreDriver/arm.h delete mode 100644 drivers/gud/MobiCoreDriver/build_tag.h delete mode 100644 drivers/gud/MobiCoreDriver/client.c delete mode 100644 drivers/gud/MobiCoreDriver/client.h delete mode 100644 drivers/gud/MobiCoreDriver/clientlib.c delete mode 100644 drivers/gud/MobiCoreDriver/clock.c delete mode 100644 drivers/gud/MobiCoreDriver/clock.h delete mode 100644 drivers/gud/MobiCoreDriver/debug.h delete mode 100644 drivers/gud/MobiCoreDriver/fastcall.c delete mode 100644 drivers/gud/MobiCoreDriver/fastcall.h delete mode 100644 drivers/gud/MobiCoreDriver/logging.c delete mode 100644 drivers/gud/MobiCoreDriver/logging.h delete mode 100644 drivers/gud/MobiCoreDriver/main.c delete mode 100644 drivers/gud/MobiCoreDriver/main.h delete mode 100644 drivers/gud/MobiCoreDriver/mci/mcifc.h delete mode 100644 drivers/gud/MobiCoreDriver/mci/mcimcp.h delete mode 100644 drivers/gud/MobiCoreDriver/mci/mcinq.h delete mode 100644 drivers/gud/MobiCoreDriver/mci/mcloadformat.h delete mode 100644 drivers/gud/MobiCoreDriver/mcp.c delete mode 100644 drivers/gud/MobiCoreDriver/mcp.h delete mode 100644 drivers/gud/MobiCoreDriver/mmu.c delete mode 100644 drivers/gud/MobiCoreDriver/mmu.h delete mode 100644 drivers/gud/MobiCoreDriver/platform.h delete mode 100644 drivers/gud/MobiCoreDriver/pm.c delete mode 100644 drivers/gud/MobiCoreDriver/pm.h delete mode 100644 drivers/gud/MobiCoreDriver/public/mc_admin.h delete mode 100644 drivers/gud/MobiCoreDriver/public/mc_linux.h delete mode 100644 drivers/gud/MobiCoreDriver/public/mc_linux_api.h delete mode 100644 drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h delete mode 100644 drivers/gud/MobiCoreDriver/scheduler.c delete mode 100644 drivers/gud/MobiCoreDriver/scheduler.h delete mode 100644 drivers/gud/MobiCoreDriver/session.c delete mode 100644 drivers/gud/MobiCoreDriver/session.h delete mode 100644 drivers/gud/setupDrivers.sh diff --git a/drivers/Kconfig b/drivers/Kconfig index fcff64188dd03..351d9100e93df 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -198,6 +198,4 @@ source "drivers/firmware/Kconfig" source "drivers/bif/Kconfig" -source "drivers/gud/Kconfig" - endmenu diff --git a/drivers/Makefile b/drivers/Makefile index ffbf12cf9f43d..e3352f1e48385 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -170,6 +170,3 @@ obj-$(CONFIG_ESOC) += esoc/ obj-$(CONFIG_BIF) += bif/ obj-$(CONFIG_SENSORS_SSC) += sensors/ - -# -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "mci/mcloadformat.h" - -#include "main.h" -#include "debug.h" -#include "mmu.h" /* For load_check and load_token */ -#include "mcp.h" -#include "client.h" -#include "api.h" -#include "admin.h" - -/* We need 2 devices for admin and user interface*/ -#define MC_DEV_MAX 2 - -static struct admin_ctx { - struct device *dev; - atomic_t daemon_counter; - /* Define a MobiCore device structure for use with dev_debug() etc */ - struct device_driver mc_dev_name; - dev_t mc_dev_admin; - struct cdev mc_admin_cdev; - int (*tee_start_cb)(void); -} g_admin_ctx; - -static struct mc_admin_driver_request { - /* Global */ - struct mutex mutex; /* Protects access to this struct */ - struct mutex states_mutex; /* Protect access to the states */ - enum client_state { - IDLE, - REQUEST_SENT, - BUFFERS_READY, - } client_state; - enum server_state { - NOT_CONNECTED, /* Device not open */ - READY, /* Waiting for requests */ - REQUEST_RECEIVED, /* Got a request, is working */ - RESPONSE_SENT, /* Has sent a response header */ - DATA_SENT, /* Blocked until data is consumed */ - } server_state; - /* Request */ - uint32_t request_id; - struct mc_admin_request request; - struct completion client_complete; - /* Response */ - struct mc_admin_response response; - struct completion server_complete; - void *buffer; /* Reception buffer (pre-allocated) */ - size_t size; /* Size of the reception buffer */ -} g_request; - -static struct tbase_object *tbase_object_alloc(bool is_sp_trustlet, - size_t length) -{ - struct tbase_object *obj; - size_t size = sizeof(*obj) + length; - size_t header_length = 0; - - /* Determine required size */ - if (is_sp_trustlet) { - /* Need space for lengths info and containers */ - header_length = sizeof(struct mc_blob_len_info); - size += header_length + 3 * MAX_SO_CONT_SIZE; - } - - /* Allocate memory */ - obj = vzalloc(size); - if (!obj) - return NULL; - - /* A non-zero header_length indicates that we have a SP trustlet */ - obj->header_length = header_length; - obj->length = length; - return obj; -} - -void tbase_object_free(struct tbase_object *robj) -{ - vfree(robj); -} - -static inline void client_state_change(enum client_state state) -{ - mutex_lock(&g_request.states_mutex); - g_request.client_state = state; - mutex_unlock(&g_request.states_mutex); -} - -static inline bool client_state_is(enum client_state state) -{ - bool is; - - mutex_lock(&g_request.states_mutex); - is = g_request.client_state == state; - mutex_unlock(&g_request.states_mutex); - return is; -} - -static inline void server_state_change(enum server_state state) -{ - mutex_lock(&g_request.states_mutex); - g_request.server_state = state; - mutex_unlock(&g_request.states_mutex); -} - -static inline bool server_state_is(enum server_state state) -{ - bool is; - - mutex_lock(&g_request.states_mutex); - is = g_request.server_state == state; - mutex_unlock(&g_request.states_mutex); - return is; -} - -static void request_cancel(void); - -static int request_send(uint32_t command, const struct mc_uuid_t *uuid, - uint32_t is_gp, uint32_t spid) -{ - struct device *dev = g_admin_ctx.dev; - int counter = 10; - int ret; - - /* Prepare request */ - mutex_lock(&g_request.states_mutex); - /* Wait a little for daemon to connect */ - while ((g_request.server_state == NOT_CONNECTED) && counter--) { - mutex_unlock(&g_request.states_mutex); - ssleep(1); - mutex_lock(&g_request.states_mutex); - } - - BUG_ON(g_request.client_state != IDLE); - if (g_request.server_state != READY) { - mutex_unlock(&g_request.states_mutex); - if (g_request.server_state != NOT_CONNECTED) { - /* TODO: can we recover? */ - dev_err(dev, "%s: invalid daemon state %d\n", __func__, - g_request.server_state); - ret = -EPROTO; - goto end; - } else { - dev_err(dev, "%s: daemon not connected\n", __func__); - ret = -ENOTCONN; - goto end; - } - } - - memset(&g_request.request, 0, sizeof(g_request.request)); - memset(&g_request.response, 0, sizeof(g_request.response)); - g_request.request.request_id = g_request.request_id++; - g_request.request.command = command; - if (uuid) - memcpy(&g_request.request.uuid, uuid, sizeof(*uuid)); - else - memset(&g_request.request.uuid, 0, sizeof(*uuid)); - - g_request.request.is_gp = is_gp; - g_request.request.spid = spid; - g_request.client_state = REQUEST_SENT; - mutex_unlock(&g_request.states_mutex); - - /* Send request */ - complete(&g_request.client_complete); - - /* Wait for header (could be interruptible, but then needs more work) */ - wait_for_completion(&g_request.server_complete); - - /* Server should be waiting with some data for us */ - mutex_lock(&g_request.states_mutex); - switch (g_request.server_state) { - case NOT_CONNECTED: - /* Daemon gone */ - ret = -EPIPE; - break; - case READY: - /* No data to come, likely an error */ - ret = -g_request.response.error_no; - break; - case RESPONSE_SENT: - case DATA_SENT: - /* Normal case, data to come */ - ret = 0; - break; - default: - /* Should not happen as complete means the state changed */ - dev_err(dev, "%s: daemon is in a bad state: %d\n", __func__, - g_request.server_state); - ret = -EPIPE; - break; - } - - mutex_unlock(&g_request.states_mutex); - -end: - if (ret) - request_cancel(); - - return ret; -} - -static int request_receive(void *address, uint32_t size) -{ - /* - * At this point we have received the header and prepared some buffers - * to receive data that we know are coming from the server. - */ - - /* Check server state */ - bool server_ok; - - mutex_lock(&g_request.states_mutex); - server_ok = (g_request.server_state == RESPONSE_SENT) || - (g_request.server_state == DATA_SENT); - mutex_unlock(&g_request.states_mutex); - if (!server_ok) { - /* TODO: can we recover? */ - request_cancel(); - return -EPIPE; - } - - /* Setup reception buffer */ - g_request.buffer = address; - g_request.size = size; - client_state_change(BUFFERS_READY); - - /* Unlock write of data */ - complete(&g_request.client_complete); - - /* Wait for data (far too late to be interruptible) */ - wait_for_completion(&g_request.server_complete); - - /* Reset reception buffer */ - g_request.buffer = NULL; - g_request.size = 0; - - /* Return to idle state */ - client_state_change(IDLE); - return 0; -} - -/* Must be called instead of request_receive() to cancel a pending request */ -static void request_cancel(void) -{ - /* Unlock write of data */ - mutex_lock(&g_request.states_mutex); - if (g_request.server_state == DATA_SENT) - complete(&g_request.client_complete); - - /* Return to idle state */ - g_request.client_state = IDLE; - mutex_unlock(&g_request.states_mutex); -} - -static int admin_get_root_container(void *address) -{ - struct device *dev = g_admin_ctx.dev; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_ROOT_CONTAINER, 0, 0, 0); - if (ret) - goto end; - - /* Check length against max */ - if (g_request.response.length >= MAX_SO_CONT_SIZE) { - request_cancel(); - dev_err(dev, "%s: response length exceeds maximum\n", __func__); - ret = EREMOTEIO; - goto end; - } - - /* Get data */ - ret = request_receive(address, g_request.response.length); - if (!ret) - ret = g_request.response.length; - -end: - mutex_unlock(&g_request.mutex); - return ret; -} - -static int admin_get_sp_container(void *address, uint32_t spid) -{ - struct device *dev = g_admin_ctx.dev; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_SP_CONTAINER, 0, 0, spid); - if (ret) - goto end; - - /* Check length against max */ - if (g_request.response.length >= MAX_SO_CONT_SIZE) { - request_cancel(); - dev_err(dev, "%s: response length exceeds maximum\n", __func__); - ret = EREMOTEIO; - goto end; - } - - /* Get data */ - ret = request_receive(address, g_request.response.length); - if (!ret) - ret = g_request.response.length; - -end: - mutex_unlock(&g_request.mutex); - return ret; -} - -static int admin_get_trustlet_container(void *address, - const struct mc_uuid_t *uuid, - uint32_t spid) -{ - struct device *dev = g_admin_ctx.dev; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_TRUSTLET_CONTAINER, uuid, 0, spid); - if (ret) - goto end; - - /* Check length against max */ - if (g_request.response.length >= MAX_SO_CONT_SIZE) { - request_cancel(); - dev_err(dev, "%s: response length exceeds maximum\n", __func__); - ret = EREMOTEIO; - goto end; - } - - /* Get data */ - ret = request_receive(address, g_request.response.length); - if (!ret) - ret = g_request.response.length; - -end: - mutex_unlock(&g_request.mutex); - return ret; -} - -static struct tbase_object *admin_get_trustlet(const struct mc_uuid_t *uuid, - uint32_t is_gp, uint32_t *spid) -{ - struct tbase_object *obj = NULL; - bool is_sp_tl; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_TRUSTLET, uuid, is_gp, 0); - if (ret) - goto end; - - /* Allocate memory */ - is_sp_tl = g_request.response.service_type == SERVICE_TYPE_SP_TRUSTLET; - obj = tbase_object_alloc(is_sp_tl, g_request.response.length); - if (!obj) { - request_cancel(); - ret = -ENOMEM; - goto end; - } - - /* Get data */ - ret = request_receive(&obj->data[obj->header_length], obj->length); - *spid = g_request.response.spid; - -end: - mutex_unlock(&g_request.mutex); - if (ret) - return ERR_PTR(ret); - - return obj; -} - -static void mc_admin_sendcrashdump(void) -{ - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_SIGNAL_CRASH, NULL, false, 0); - if (ret) - goto end; - - /* Done */ - request_cancel(); - -end: - mutex_unlock(&g_request.mutex); -} - -static int tbase_object_make(uint32_t spid, struct tbase_object *obj) -{ - struct mc_blob_len_info *l_info = (struct mc_blob_len_info *)obj->data; - uint8_t *address = &obj->data[obj->header_length + obj->length]; - struct mclf_header_v2 *thdr; - int ret; - - /* Get root container */ - ret = admin_get_root_container(address); - if (ret < 0) - goto err; - - l_info->root_size = ret; - address += ret; - - /* Get SP container */ - ret = admin_get_sp_container(address, spid); - if (ret < 0) - goto err; - - l_info->sp_size = ret; - address += ret; - - /* Get trustlet container */ - thdr = (struct mclf_header_v2 *)&obj->data[obj->header_length]; - ret = admin_get_trustlet_container(address, &thdr->uuid, spid); - if (ret < 0) - goto err; - - l_info->ta_size = ret; - address += ret; - - /* Setup lengths information */ - l_info->magic = MC_TLBLOBLEN_MAGIC; - obj->length += sizeof(*l_info); - obj->length += l_info->root_size + l_info->sp_size + l_info->ta_size; - ret = 0; - -err: - return ret; -} - -struct tbase_object *tbase_object_read(uint32_t spid, uintptr_t address, - size_t length) -{ - struct device *dev = g_admin_ctx.dev; - char __user *addr = (char __user *)address; - struct tbase_object *obj; - uint8_t *data; - struct mclf_header_v2 thdr; - int ret; - - /* Check length */ - if (length < sizeof(thdr)) { - dev_err(dev, "%s: buffer shorter than header size\n", __func__); - return ERR_PTR(-EFAULT); - } - - /* Read header */ - if (copy_from_user(&thdr, addr, sizeof(thdr))) { - dev_err(dev, "%s: header: copy_from_user failed\n", __func__); - return ERR_PTR(-EFAULT); - } - - /* Allocate memory */ - obj = tbase_object_alloc(thdr.service_type == SERVICE_TYPE_SP_TRUSTLET, - length); - if (!obj) - return ERR_PTR(-ENOMEM); - - /* Copy header */ - data = &obj->data[obj->header_length]; - memcpy(data, &thdr, sizeof(thdr)); - /* Copy the rest of the data */ - data += sizeof(thdr); - if (copy_from_user(data, &addr[sizeof(thdr)], length - sizeof(thdr))) { - dev_err(dev, "%s: data: copy_from_user failed\n", __func__); - vfree(obj); - return ERR_PTR(-EFAULT); - } - - if (obj->header_length) { - ret = tbase_object_make(spid, obj); - if (ret) { - vfree(obj); - return ERR_PTR(ret); - } - } - - return obj; -} - -struct tbase_object *tbase_object_select(const struct mc_uuid_t *uuid) -{ - struct tbase_object *obj; - struct mclf_header_v2 *thdr; - - obj = tbase_object_alloc(false, sizeof(*thdr)); - if (!obj) - return ERR_PTR(-ENOMEM); - - thdr = (struct mclf_header_v2 *)&obj->data[obj->header_length]; - memcpy(&thdr->uuid, uuid, sizeof(thdr->uuid)); - return obj; -} - -struct tbase_object *tbase_object_get(const struct mc_uuid_t *uuid, - uint32_t is_gp_uuid) -{ - struct tbase_object *obj; - uint32_t spid = 0; - - /* admin_get_trustlet creates the right object based on service type */ - obj = admin_get_trustlet(uuid, is_gp_uuid, &spid); - if (IS_ERR(obj)) - return obj; - - /* SP trustlet: create full secure object with all containers */ - if (obj->header_length) { - int ret; - - /* Do not return EINVAL in this case as SPID was not found */ - if (!spid) { - vfree(obj); - return ERR_PTR(-ENOENT); - } - - ret = tbase_object_make(spid, obj); - if (ret) { - vfree(obj); - return ERR_PTR(ret); - } - } - - return obj; -} - -static inline int load_driver(struct tbase_client *client, - struct mc_admin_load_info *info) -{ - struct tbase_object *obj; - struct mclf_header_v2 *thdr; - struct mc_identity identity = { - .login_type = TEEC_LOGIN_PUBLIC, - }; - uintptr_t dci = 0; - uint32_t dci_len = 0; - uint32_t sid; - int ret; - - obj = tbase_object_read(info->spid, info->address, info->length); - if (IS_ERR(obj)) - return PTR_ERR(obj); - - thdr = (struct mclf_header_v2 *)&obj->data[obj->header_length]; - if (!(thdr->flags & MC_SERVICE_HEADER_FLAGS_NO_CONTROL_INTERFACE)) { - /* - * The driver requires a DCI, although we won't be able to use - * it to communicate. - */ - dci_len = PAGE_SIZE; - ret = api_malloc_cbuf(client, dci_len, &dci, NULL); - if (ret) - goto end; - } - - /* Open session */ - ret = client_add_session(client, obj, dci, dci_len, &sid, false, - &identity); - if (ret) - api_free_cbuf(client, dci); - else - dev_dbg(g_admin_ctx.dev, "driver loaded with sid %x", sid); - -end: - vfree(obj); - return ret; -} - -static inline int load_token(struct mc_admin_load_info *token) -{ - struct tbase_mmu *mmu; - struct mcp_buffer_map map; - int ret; - - mmu = tbase_mmu_create(current, (void *)(uintptr_t)token->address, - token->length); - if (IS_ERR(mmu)) - return PTR_ERR(mmu); - - tbase_mmu_buffer(mmu, &map); - ret = mcp_load_token(token->address, &map); - tbase_mmu_delete(mmu); - return ret; -} - -static inline int load_check(struct mc_admin_load_info *info) -{ - struct tbase_object *obj; - struct tbase_mmu *mmu; - struct mcp_buffer_map map; - int ret; - - obj = tbase_object_read(info->spid, info->address, info->length); - if (IS_ERR(obj)) - return PTR_ERR(obj); - - mmu = tbase_mmu_create(NULL, obj->data, obj->length); - if (IS_ERR(mmu)) - return PTR_ERR(mmu); - - tbase_mmu_buffer(mmu, &map); - ret = mcp_load_check(obj, &map); - tbase_mmu_delete(mmu); - return ret; -} - -static ssize_t admin_write(struct file *file, const char __user *user, - size_t len, loff_t *off) -{ - int ret; - - /* No offset allowed [yet] */ - if (*off) { - g_request.response.error_no = EPIPE; - ret = -ECOMM; - goto err; - } - - if (server_state_is(REQUEST_RECEIVED)) { - /* Check client state */ - if (!client_state_is(REQUEST_SENT)) { - g_request.response.error_no = EPIPE; - ret = -EPIPE; - goto err; - } - - /* Receive response header */ - if (copy_from_user(&g_request.response, user, - sizeof(g_request.response))) { - g_request.response.error_no = EPIPE; - ret = -ECOMM; - goto err; - } - - /* Check request ID */ - if (g_request.request.request_id != - g_request.response.request_id) { - g_request.response.error_no = EPIPE; - ret = -EBADE; - goto err; - } - - /* Response header is acceptable */ - ret = sizeof(g_request.response); - if (g_request.response.length) - server_state_change(RESPONSE_SENT); - else - server_state_change(READY); - - goto end; - } else if (server_state_is(RESPONSE_SENT)) { - /* Server is waiting */ - server_state_change(DATA_SENT); - - /* Get data */ - ret = wait_for_completion_interruptible( - &g_request.client_complete); - - /* Server received a signal, let see if it tries again */ - if (ret) { - server_state_change(RESPONSE_SENT); - return ret; - } - - /* Check client state */ - if (!client_state_is(BUFFERS_READY)) { - g_request.response.error_no = EPIPE; - ret = -EPIPE; - goto err; - } - - /* TODO deal with several writes */ - if (len != g_request.size) - len = g_request.size; - - ret = copy_from_user(g_request.buffer, user, len); - if (ret) { - g_request.response.error_no = EPIPE; - ret = -ECOMM; - goto err; - } - - ret = len; - server_state_change(READY); - goto end; - } else { - ret = -ECOMM; - goto err; - } - -err: - server_state_change(READY); -end: - complete(&g_request.server_complete); - return ret; -} - -static long admin_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct tbase_client *client = file->private_data; - void __user *uarg = (void __user *)arg; - int ret = -EINVAL; - - MCDRV_DBG("%u from %s", _IOC_NR(cmd), current->comm); - - if (WARN(!client, "No client data available")) - return -EFAULT; - - switch (cmd) { - case MC_ADMIN_IO_GET_DRIVER_REQUEST: { - /* Block until a request is available */ - ret = wait_for_completion_interruptible( - &g_request.client_complete); - if (ret) - /* Interrupted by signal */ - break; - - /* Check client state */ - if (!client_state_is(REQUEST_SENT)) { - g_request.response.error_no = EPIPE; - complete(&g_request.server_complete); - ret = -EPIPE; - break; - } - - /* Send request (the driver request mutex is held) */ - ret = copy_to_user(uarg, &g_request.request, - sizeof(g_request.request)); - if (ret) { - server_state_change(READY); - complete(&g_request.server_complete); - ret = -EPROTO; - break; - } - - server_state_change(REQUEST_RECEIVED); - break; - } - case MC_ADMIN_IO_GET_INFO: { - struct mc_admin_driver_info info; - - info.drv_version = MC_VERSION(MCDRVMODULEAPI_VERSION_MAJOR, - MCDRVMODULEAPI_VERSION_MINOR); - info.initial_cmd_id = g_request.request_id; - ret = copy_to_user(uarg, &info, sizeof(info)); - break; - } - case MC_ADMIN_IO_LOAD_DRIVER: { - struct mc_admin_load_info info; - - ret = copy_from_user(&info, uarg, sizeof(info)); - if (ret) - ret = -EFAULT; - else - ret = load_driver(client, &info); - - break; - } - case MC_ADMIN_IO_LOAD_TOKEN: { - struct mc_admin_load_info info; - - ret = copy_from_user(&info, uarg, sizeof(info)); - if (ret) - ret = -EFAULT; - else - ret = load_token(&info); - - break; - } - case MC_ADMIN_IO_LOAD_CHECK: { - struct mc_admin_load_info info; - - ret = copy_from_user(&info, uarg, sizeof(info)); - if (ret) - ret = -EFAULT; - else - ret = load_check(&info); - - break; - } - default: - ret = -ENOIOCTLCMD; - } - - return ret; -} - -/* - * mc_fd_release() - This function will be called from user space as close(...) - * The client data are freed and the associated memory pages are unreserved. - * - * @inode - * @file - * - * Returns 0 - */ -static int admin_release(struct inode *inode, struct file *file) -{ - struct tbase_client *client = file->private_data; - struct device *dev = g_admin_ctx.dev; - - if (!client) - return -EPROTO; - - api_close_device(client); - file->private_data = NULL; - - /* Requests from driver to daemon */ - mutex_lock(&g_request.states_mutex); - dev_warn(dev, "%s: daemon disconnected\n", __func__); - g_request.server_state = NOT_CONNECTED; - /* A non-zero command indicates that a thread is waiting */ - if (g_request.client_state != IDLE) { - g_request.response.error_no = ESHUTDOWN; - complete(&g_request.server_complete); - } - - mutex_unlock(&g_request.states_mutex); - atomic_set(&g_admin_ctx.daemon_counter, 0); - /* - * ret is quite irrelevant here as most apps don't care about the - * return value from close() and it's quite difficult to recover - */ - return 0; -} - -static int admin_open(struct inode *inode, struct file *file) -{ - struct device *dev = g_admin_ctx.dev; - struct tbase_client *client; - int err; - - /* - * If the daemon is already set we can't allow anybody else to open - * the admin interface. - */ - if (atomic_cmpxchg(&g_admin_ctx.daemon_counter, 0, 1) != 0) { - MCDRV_ERROR("Daemon is already connected"); - return -EPROTO; - } - - /* Any value will do */ - g_request.request_id = 42; - - /* Setup the usual variables */ - MCDRV_DBG("accept %s as tbase daemon", current->comm); - - /* - * daemon is connected so now we can safely suppose - * the secure world is loaded too - */ - if (!IS_ERR_OR_NULL(g_admin_ctx.tee_start_cb)) - g_admin_ctx.tee_start_cb = ERR_PTR(g_admin_ctx.tee_start_cb()); - if (IS_ERR(g_admin_ctx.tee_start_cb)) { - MCDRV_ERROR("Failed initializing the SW"); - err = PTR_ERR(g_admin_ctx.tee_start_cb); - goto fail_connection; -} - - /* Create client */ - client = api_open_device(true); - if (!client) { - err = -ENOMEM; - goto fail_connection; - } - - /* Store client in user file */ - file->private_data = client; - - /* Requests from driver to daemon */ - server_state_change(READY); - dev_info(dev, "%s: daemon connected\n", __func__); - - return 0; - -fail_connection: - atomic_set(&g_admin_ctx.daemon_counter, 0); - return err; -} - -/* function table structure of this device driver. */ -static const struct file_operations mc_admin_fops = { - .owner = THIS_MODULE, - .open = admin_open, - .release = admin_release, - .unlocked_ioctl = admin_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = admin_ioctl, -#endif - .write = admin_write, -}; - -int mc_admin_init(struct class *mc_device_class, dev_t *out_dev, - int (*tee_start_cb)(void)) -{ - int err = 0; - - if (!out_dev || !mc_device_class) - return -EINVAL; - - atomic_set(&g_admin_ctx.daemon_counter, 0); - - /* Requests from driver to daemon */ - mutex_init(&g_request.mutex); - mutex_init(&g_request.states_mutex); - init_completion(&g_request.client_complete); - init_completion(&g_request.server_complete); - mcp_register_crashhandler(mc_admin_sendcrashdump); - - /* Create char device */ - cdev_init(&g_admin_ctx.mc_admin_cdev, &mc_admin_fops); - err = alloc_chrdev_region(&g_admin_ctx.mc_dev_admin, 0, MC_DEV_MAX, - "trustonic_tee"); - if (err < 0) { - MCDRV_ERROR("failed to allocate char dev region"); - goto fail_alloc_chrdev_region; - } - - err = cdev_add(&g_admin_ctx.mc_admin_cdev, g_admin_ctx.mc_dev_admin, 1); - if (err) { - MCDRV_ERROR("admin device register failed"); - goto fail_cdev_add; - } - - g_admin_ctx.mc_admin_cdev.owner = THIS_MODULE; - g_admin_ctx.dev = device_create(mc_device_class, NULL, - g_admin_ctx.mc_dev_admin, NULL, - MC_ADMIN_DEVNODE); - if (IS_ERR(g_admin_ctx.dev)) { - err = PTR_ERR(g_admin_ctx.dev); - goto fail_dev_create; - } - - g_admin_ctx.mc_dev_name.name = "driver = &g_admin_ctx.mc_dev_name; - *out_dev = g_admin_ctx.mc_dev_admin; - - /* Register the call back for starting the secure world */ - g_admin_ctx.tee_start_cb = tee_start_cb; - - MCDRV_DBG("done"); - return 0; - -fail_dev_create: - cdev_del(&g_admin_ctx.mc_admin_cdev); - -fail_cdev_add: - unregister_chrdev_region(g_admin_ctx.mc_dev_admin, MC_DEV_MAX); - -fail_alloc_chrdev_region: - MCDRV_ERROR("fail with %d", err); - return err; -} - -void mc_admin_exit(struct class *mc_device_class) -{ - device_destroy(mc_device_class, g_admin_ctx.mc_dev_admin); - cdev_del(&g_admin_ctx.mc_admin_cdev); - unregister_chrdev_region(g_admin_ctx.mc_dev_admin, MC_DEV_MAX); - /* Requests from driver to daemon */ - mutex_destroy(&g_request.states_mutex); - MCDRV_DBG("done"); -} diff --git a/drivers/gud/MobiCoreDriver/admin.h b/drivers/gud/MobiCoreDriver/admin.h deleted file mode 100644 index 5a78d943752da..0000000000000 --- a/drivers/gud/MobiCoreDriver/admin.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef ADMIN_FD_H_ -#define ADMIN_FD_H_ - -struct mc_uuid_t; -struct tbase_object; - -int mc_admin_init(struct class *mc_device_class, dev_t *out_dev, - int (*tee_start_cb)(void)); -void mc_admin_exit(struct class *mc_device_class); - -struct tbase_object *tbase_object_select(const struct mc_uuid_t *uuid); -struct tbase_object *tbase_object_get(const struct mc_uuid_t *uuid, - uint32_t is_gp_uuid); -struct tbase_object *tbase_object_read(uint32_t spid, uintptr_t address, - size_t length); -void tbase_object_free(struct tbase_object *out_robj); - -#endif /* ADMIN_FD_H_ */ diff --git a/drivers/gud/MobiCoreDriver/api.c b/drivers/gud/MobiCoreDriver/api.c deleted file mode 100644 index 0d2abaf617aea..0000000000000 --- a/drivers/gud/MobiCoreDriver/api.c +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include - -#include /* MC_MAP_MAX */ -#include "main.h" -#include "debug.h" -#include "mcp.h" -#include "admin.h" -#include "session.h" -#include "client.h" -#include "api.h" - -static struct api_ctx { - struct mutex clients_lock; /* Clients list + temp notifs */ - struct list_head clients; /* List of user-space clients */ -} api_ctx; - -/* - * Initialize a new tbase client object - * @return client pointer or NULL if no allocation was possible. - */ -struct tbase_client *api_open_device(bool is_from_kernel) -{ - struct tbase_client *client; - - /* Allocate and init client object */ - client = client_create(is_from_kernel); - if (!client) { - MCDRV_ERROR("Could not create client"); - return NULL; - } - - /* Add client to list of clients */ - mutex_lock(&api_ctx.clients_lock); - list_add_tail(&client->list, &api_ctx.clients); - mutex_unlock(&api_ctx.clients_lock); - - MCDRV_DBG("created client %p", client); - return client; -} - -/* - * Try and mark client as "closing" - * @return tbase driver error code - */ -int api_freeze_device(struct tbase_client *client) -{ - int err = 0; - - if (!client_set_closing(client)) - err = -ENOTEMPTY; - - MCDRV_DBG("client %p, exit with %d\n", client, err); - return err; -} - -/* - * Release a client and the session+cbuf objects it contains. - * @param client_t client - * @return tbase driver error code - */ -void api_close_device(struct tbase_client *client) -{ - /* Remove client from list of active clients */ - mutex_lock(&api_ctx.clients_lock); - list_del(&client->list); - mutex_unlock(&api_ctx.clients_lock); - /* Close all remaining sessions */ - client_close_sessions(client); - client_put(client); - MCDRV_DBG("client %p closed\n", client); -} - -/* - * Open TA for given client. TA binary is provided by the daemon. - * @param - * @return tbase driver error code - */ -int api_open_session(struct tbase_client *client, - uint32_t *p_session_id, - const struct mc_uuid_t *uuid, - uintptr_t tci, - size_t tci_len, - bool is_gp_uuid, - struct mc_identity *identity) -{ - int err = 0; - uint32_t sid = 0; - struct tbase_object *obj; - - /* Check parameters */ - if (!p_session_id) - return -EINVAL; - - if (!uuid) - return -EINVAL; - - /* Get secure object */ - obj = tbase_object_get(uuid, is_gp_uuid); - if (IS_ERR(obj)) { - /* Try to select secure object inside the SWd if not found */ - if ((PTR_ERR(obj) == -ENOENT) && g_ctx.f_ta_auth) - obj = tbase_object_select(uuid); - - if (IS_ERR(obj)) { - err = PTR_ERR(obj); - goto end; - } - } - - /* Open session */ - err = client_add_session(client, obj, tci, tci_len, &sid, is_gp_uuid, - identity); - /* Fill in return parameter */ - if (!err) - *p_session_id = sid; - - /* Delete secure object */ - tbase_object_free(obj); - -end: - - MCDRV_DBG("session %x, exit with %d\n", sid, err); - return err; -} - -/* - * Open TA for given client. TA binary is provided by the client. - * @param - * @return tbase driver error code - */ -int api_open_trustlet(struct tbase_client *client, - uint32_t *p_session_id, - uint32_t spid, - uintptr_t trustlet, - size_t trustlet_len, - uintptr_t tci, - size_t tci_len) -{ - struct tbase_object *obj; - struct mc_identity identity = { - .login_type = TEEC_LOGIN_PUBLIC, - }; - uint32_t sid = 0; - int err = 0; - - /* Check parameters */ - if (!p_session_id) - return -EINVAL; - - /* Create secure object from user-space trustlet binary */ - obj = tbase_object_read(spid, trustlet, trustlet_len); - if (IS_ERR(obj)) { - err = PTR_ERR(obj); - goto end; - } - - /* Open session */ - err = client_add_session(client, obj, tci, tci_len, &sid, false, - &identity); - /* Fill in return parameter */ - if (!err) - *p_session_id = sid; - - /* Delete secure object */ - tbase_object_free(obj); - -end: - MCDRV_DBG("session %x, exit with %d\n", sid, err); - return err; -} - -/* - * Close a TA - * @param - * @return tbase driver error code - */ -int api_close_session(struct tbase_client *client, uint32_t session_id) -{ - int ret = client_remove_session(client, session_id); - - MCDRV_DBG("session %x, exit with %d\n", session_id, ret); - return ret; -} - -/* - * Send a notification to TA - * @return tbase driver error code - */ -int api_notify(struct tbase_client *client, uint32_t session_id) -{ - int err = 0; - struct tbase_session *session = NULL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - /* Send command to SWd */ - if (!session) { - err = -ENXIO; - } else { - err = session_notify_swd(session); - - /* Release session */ - client_unref_session(session); - } - - MCDRV_DBG("session %x, exit with %d\n", session_id, err); - return err; -} - -/* - * Wait for a notification from TA - * @return tbase driver error code - */ -int api_wait_notification(struct tbase_client *client, - uint32_t session_id, - int32_t timeout) -{ - int err = 0; - struct tbase_session *session = NULL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - /* Wait for notification */ - if (!session) { - err = -ENXIO; - } else { - err = session_waitnotif(session, timeout); - - /* Release session */ - client_unref_session(session); - } - - MCDRV_DBG("session %x, exit with %d\n", session_id, err); - return err; -} - -/* - * Allocate a contiguous buffer (cbuf) for given client - * - * @param client client - * @param len size of the cbuf - * @param **p_addr pointer to the cbuf kva - * @return tbase driver error code - */ -int api_malloc_cbuf(struct tbase_client *client, uint32_t len, - uintptr_t *addr, struct vm_area_struct *vmarea) -{ - int err = tbase_cbuf_alloc(client, len, addr, vmarea); - - MCDRV_DBG("exit with %d\n", err); - return err; -} - -/* - * Free a contiguous buffer from given client - * @param client - * @param addr kernel virtual address of the buffer - * - * @return tbase driver error code - */ -int api_free_cbuf(struct tbase_client *client, uintptr_t addr) -{ - int err = tbase_cbuf_free(client, addr); - - MCDRV_DBG("@ 0x%lx, exit with %d\n", addr, err); - return err; -} - -/* Share a buffer with given TA in SWd */ -int api_map_wsms(struct tbase_client *client, uint32_t session_id, - struct mc_ioctl_buffer *bufs) -{ - struct tbase_session *session = NULL; - int err = 0; - - if (!client) - return -EINVAL; - - if (!bufs) - return -EINVAL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - if (session) { - /* Add buffer to the session */ - err = session_wsms_add(session, bufs); - - /* Release session */ - client_unref_session(session); - } else { - err = -ENXIO; - } - - MCDRV_DBG("exit with %d\n", err); - return err; -} - -/* Stop sharing a buffer with SWd */ -int api_unmap_wsms(struct tbase_client *client, uint32_t session_id, - const struct mc_ioctl_buffer *bufs) -{ - struct tbase_session *session = NULL; - int err = 0; - - if (!client) - return -EINVAL; - - if (!bufs) - return -EINVAL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - if (!session) { - err = -ENXIO; - } else { - /* Remove buffer from session */ - err = session_wsms_remove(session, bufs); - /* Release session */ - client_unref_session(session); - } - - MCDRV_DBG("exit with %d\n", err); - return err; -} - -/* - * Read session exit/termination code - */ -int api_get_session_exitcode(struct tbase_client *client, uint32_t session_id, - int32_t *exit_code) -{ - int err = 0; - struct tbase_session *session; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - if (!session) { - err = -ENXIO; - } else { - /* Retrieve error */ - *exit_code = session_exitcode(session); - - /* Release session */ - client_unref_session(session); - - err = 0; - } - - MCDRV_DBG("session %x, exit with %d\n", session_id, err); - return err; -} - -void api_init(void) -{ - INIT_LIST_HEAD(&api_ctx.clients); - mutex_init(&api_ctx.clients_lock); - - INIT_LIST_HEAD(&g_ctx.closing_sess); - mutex_init(&g_ctx.closing_lock); -} - -int api_info(struct kasnprintf_buf *buf) -{ - struct tbase_client *client; - struct tbase_session *session; - ssize_t ret = 0; - - mutex_lock(&api_ctx.clients_lock); - if (list_empty(&api_ctx.clients)) - goto done; - - list_for_each_entry(client, &api_ctx.clients, list) { - ret = client_info(client, buf); - if (ret < 0) - break; - } - -done: - mutex_unlock(&api_ctx.clients_lock); - - if (ret >= 0) { - mutex_lock(&g_ctx.closing_lock); - if (!list_empty(&g_ctx.closing_sess)) - ret = kasnprintf(buf, "closing sessions:\n"); - - list_for_each_entry(session, &g_ctx.closing_sess, list) { - ret = session_info(session, buf); - if (ret < 0) - break; - } - - mutex_unlock(&g_ctx.closing_lock); - } - - return ret; -} diff --git a/drivers/gud/MobiCoreDriver/api.h b/drivers/gud/MobiCoreDriver/api.h deleted file mode 100644 index 740ec7fb2d5b9..0000000000000 --- a/drivers/gud/MobiCoreDriver/api.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _API_H_ -#define _API_H_ - -struct tbase_client; - -struct tbase_client *api_open_device(bool is_from_kernel); -int api_freeze_device(struct tbase_client *client); -void api_close_device(struct tbase_client *client); -int api_open_session(struct tbase_client *client, uint32_t *session_id, - const struct mc_uuid_t *uuid, - uintptr_t tci, size_t tci_len, bool is_gp_uuid, - struct mc_identity *identity); -int api_open_trustlet(struct tbase_client *client, uint32_t *session_id, - uint32_t spid, uintptr_t trustlet, size_t trustlet_len, - uintptr_t tci, size_t tci_len); -int api_close_session(struct tbase_client *client, uint32_t session_id); -int api_notify(struct tbase_client *client, uint32_t session_id); -int api_wait_notification(struct tbase_client *client, uint32_t session_id, - int32_t timeout); -int api_malloc_cbuf(struct tbase_client *client, uint32_t len, uintptr_t *addr, - struct vm_area_struct *vmarea); -int api_free_cbuf(struct tbase_client *client, uintptr_t addr); -int api_map_wsms(struct tbase_client *client, uint32_t session_id, - struct mc_ioctl_buffer *bufs); -int api_unmap_wsms(struct tbase_client *client, uint32_t session_id, - const struct mc_ioctl_buffer *bufs); -int api_get_session_exitcode(struct tbase_client *client, uint32_t session_id, - int32_t *exit_code); -void api_init(void); -int api_info(struct kasnprintf_buf *buf); - -#endif /* _API_H_ */ diff --git a/drivers/gud/MobiCoreDriver/arm.h b/drivers/gud/MobiCoreDriver/arm.h deleted file mode 100644 index 58d91f11f789c..0000000000000 --- a/drivers/gud/MobiCoreDriver/arm.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MC_ARM_H_ -#define _MC_ARM_H_ - -#include "debug.h" - -#ifdef CONFIG_ARM64 -inline bool has_security_extensions(void) -{ - return true; -} - -inline bool is_secure_mode(void) -{ - return false; -} -#else -/* - * ARM Trustzone specific masks and modes - * Vanilla Linux is unaware of TrustZone extension. - * I.e. arch/arm/include/asm/ptrace.h does not define monitor mode. - * Also TZ bits in cpuid are not defined, ARM port uses magic numbers, - * see arch/arm/kernel/setup.c - */ -#define ARM_MONITOR_MODE (0x16) /*(0b10110)*/ -#define ARM_SECURITY_EXTENSION_MASK (0x30) - -/* check if CPU supports the ARM TrustZone Security Extensions */ -inline bool has_security_extensions(void) -{ - u32 fea = 0; - - asm volatile( - "mrc p15, 0, %[fea], cr0, cr1, 0" : - [fea]"=r" (fea)); - - MCDRV_DBG_VERBOSE("CPU Features: 0x%X", fea); - - /* - * If the CPU features ID has 0 for security features then the CPU - * doesn't support TrustZone at all! - */ - if ((fea & ARM_SECURITY_EXTENSION_MASK) == 0) - return false; - - return true; -} - -/* check if running in secure mode */ -inline bool is_secure_mode(void) -{ - u32 cpsr = 0; - u32 nsacr = 0; - - asm volatile( - "mrc p15, 0, %[nsacr], cr1, cr1, 2\n" - "mrs %[cpsr], cpsr\n" : - [nsacr]"=r" (nsacr), - [cpsr]"=r"(cpsr)); - - MCDRV_DBG_VERBOSE("CPRS.M = set to 0x%X\n", cpsr & MODE_MASK); - MCDRV_DBG_VERBOSE("SCR.NS = set to 0x%X\n", nsacr); - - /* - * If the NSACR contains the reset value(=0) then most likely we are - * running in Secure MODE. - * If the cpsr mode is set to monitor mode then we cannot load! - */ - if (nsacr == 0 || ((cpsr & MODE_MASK) == ARM_MONITOR_MODE)) - return true; - - return false; -} -#endif - -#endif /* _MC_ARM_H_ */ diff --git a/drivers/gud/MobiCoreDriver/build_tag.h b/drivers/gud/MobiCoreDriver/build_tag.h deleted file mode 100644 index 51a5d3e0ae7f5..0000000000000 --- a/drivers/gud/MobiCoreDriver/build_tag.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#define MOBICORE_COMPONENT_BUILD_TAG \ - "t-base-QC-MSM8996-Android-302B-V001-20150529_084320_16" diff --git a/drivers/gud/MobiCoreDriver/client.c b/drivers/gud/MobiCoreDriver/client.c deleted file mode 100644 index c8bdc07b8742d..0000000000000 --- a/drivers/gud/MobiCoreDriver/client.c +++ /dev/null @@ -1,572 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "main.h" -#include "debug.h" -#include "mcp.h" -#include "mmu.h" -#include "session.h" -#include "client.h" - -/* - * Contiguous buffer allocated to TLCs. - * These buffers are used as world shared memory (wsm) to share with - * secure world. - */ -struct tbase_cbuf { - /* Client this cbuf belongs to */ - struct tbase_client *client; - /* List element for client's list of cbuf's */ - struct list_head list; - /* Number of references kept to this buffer */ - struct kref kref; - /* virtual Kernel start address */ - uintptr_t addr; - /* virtual Userspace start address */ - uintptr_t uaddr; - /* physical start address */ - phys_addr_t phys; - /* 2^order = number of pages allocated */ - unsigned int order; - /* Length of memory mapped to user */ - uint32_t len; -}; - -/* - * Map a kernel contiguous buffer to user space - */ -static int map_cbuf(struct vm_area_struct *vmarea, uintptr_t addr, uint32_t len, - uintptr_t *uaddr) -{ - int ret; - - if (WARN(!uaddr, "No uaddr pointer available")) - return -EINVAL; - - if (WARN(!vmarea, "No vma available")) - return -EINVAL; - - if (WARN(!addr, "No addr available")) - return -EINVAL; - - if (len != (uint32_t)(vmarea->vm_end - vmarea->vm_start)) { - MCDRV_ERROR("cbuf incompatible with vma"); - return -EINVAL; - } - - vmarea->vm_flags |= VM_IO; - - /* CPI todo: use io_remap_page_range() to be consistent with VM_IO ? */ - ret = remap_pfn_range(vmarea, vmarea->vm_start, - page_to_pfn(virt_to_page(addr)), - vmarea->vm_end - vmarea->vm_start, - vmarea->vm_page_prot); - if (ret) { - *uaddr = 0; - MCDRV_ERROR("User mapping failed"); - return ret; - } - - *uaddr = vmarea->vm_start; - return 0; -} - -/* - * Allocate and initialize a client object - */ -struct tbase_client *client_create(bool is_from_kernel) -{ - struct tbase_client *client; - - /* allocate client structure */ - client = kzalloc(sizeof(*client), GFP_KERNEL); - if (!client) { - MCDRV_ERROR("Allocation failure"); - return NULL; - } - - /* init members */ - client->pid = is_from_kernel ? 0 : current->pid; - memcpy(client->comm, current->comm, sizeof(client->comm)); - kref_init(&client->kref); - INIT_LIST_HEAD(&client->cbufs); - mutex_init(&client->cbufs_lock); - INIT_LIST_HEAD(&client->sessions); - mutex_init(&client->sessions_lock); - INIT_LIST_HEAD(&client->list); - - return client; -} - -/* - * At this point, nobody has access to the client anymore, so no new sessions - * are coming. - */ -void client_close_sessions(struct tbase_client *client) -{ - struct tbase_session *session; - - mutex_lock(&client->sessions_lock); - while (!list_empty(&client->sessions)) { - session = list_first_entry(&client->sessions, - struct tbase_session, list); - - /* Move session to closing sessions list */ - mutex_lock(&g_ctx.closing_lock); - list_move(&session->list, &g_ctx.closing_sess); - mutex_unlock(&g_ctx.closing_lock); - /* Call session_close without lock */ - mutex_unlock(&client->sessions_lock); - session_close(session); - mutex_lock(&client->sessions_lock); - } - - mutex_unlock(&client->sessions_lock); -} - -/* - * Free client object + all objects it contains. - * Can be called only by last user referencing the client, - * therefore mutex lock seems overkill - */ -static void client_release(struct kref *kref) -{ - struct tbase_client *client; - - client = container_of(kref, struct tbase_client, kref); - kfree(client); -} - -void client_put(struct tbase_client *client) -{ - kref_put(&client->kref, client_release); -} - -/* - * Returns true if client is a kernel object. - */ -bool client_is_kernel(struct tbase_client *client) -{ - return !client->pid; -} - -/* - * Set client "closing" state, only if it contains no session. - * Once in "closing" state, system "close" can be called. - * Return: true if this state could be set. - */ -bool client_set_closing(struct tbase_client *client) -{ - bool clear = false; - - /* Check for sessions */ - mutex_lock(&client->sessions_lock); - clear = list_empty(&client->sessions); - client->closing = clear; - mutex_unlock(&client->sessions_lock); - MCDRV_DBG("return %d", clear); - return clear; -} - -/* - * Opens a TA and add corresponding session object to given client - * return: t-base driver error code - */ -int client_add_session(struct tbase_client *client, - const struct tbase_object *obj, uintptr_t tci, - size_t len, uint32_t *session_id, bool is_gp, - struct mc_identity *identity) -{ - struct tbase_session *session = NULL; - struct tbase_mmu *obj_mmu = NULL; - int ret = 0; - - /* - * Create session object with temp sid=0 BEFORE session is started, - * otherwise if a GP TA is started and NWd session object allocation - * fails, we cannot handle the potentially delayed GP closing. - * Adding session to list must be done AFTER it is started (once we have - * sid), therefore it cannot be done within session_create(). - */ - session = session_create(client, is_gp, identity); - if (IS_ERR(session)) - return PTR_ERR(session); - - /* Create blob L2 table (blob is allocated by driver, so task=NULL) */ - obj_mmu = tbase_mmu_create(NULL, obj->data, obj->length); - if (IS_ERR(obj_mmu)) { - ret = PTR_ERR(obj_mmu); - goto err; - } - - /* Open session */ - ret = session_open(session, obj, obj_mmu, tci, len); - /* Blob table no more needed in any case */ - tbase_mmu_delete(obj_mmu); - if (ret) - goto err; - - mutex_lock(&client->sessions_lock); - if (unlikely(client->closing)) { - /* Client has been frozen, no more sessions allowed */ - ret = -ENODEV; - } else { - /* Add session to client */ - list_add(&session->list, &client->sessions); - /* Set sid returned by SWd */ - *session_id = session->mcp_session.id; - } - - mutex_unlock(&client->sessions_lock); - -err: - /* Close or free session on error */ - if (ret == -ENODEV) { - /* The session must enter the closing process... */ - mutex_lock(&g_ctx.closing_lock); - list_add(&session->list, &g_ctx.closing_sess); - mutex_unlock(&g_ctx.closing_lock); - session_close(session); - } else if (ret) { - session_put(session); - } - - return ret; -} - -/* - * Remove a session object from client and close corresponding TA - * Return: true if session was found and closed - */ -int client_remove_session(struct tbase_client *client, uint32_t session_id) -{ - struct tbase_session *session = NULL, *candidate; - - /* Move session from main list to closing list */ - mutex_lock(&client->sessions_lock); - list_for_each_entry(candidate, &client->sessions, list) { - if (candidate->mcp_session.id == session_id) { - session = candidate; - mutex_lock(&g_ctx.closing_lock); - list_move(&session->list, &g_ctx.closing_sess); - mutex_unlock(&g_ctx.closing_lock); - break; - } - } - - mutex_unlock(&client->sessions_lock); - - /* Close session */ - return session_close(session); -} - -/* - * Find a session object and increment its reference counter. - * Object cannot be freed until its counter reaches 0. - * return: pointer to the object, NULL if not found. - */ -struct tbase_session *client_ref_session(struct tbase_client *client, - uint32_t session_id) -{ - struct tbase_session *session = NULL, *candidate; - - mutex_lock(&client->sessions_lock); - list_for_each_entry(candidate, &client->sessions, list) { - if (candidate->mcp_session.id == session_id) { - session = candidate; - session_get(session); - break; - } - } - - mutex_unlock(&client->sessions_lock); - return session; -} - -/* - * Decrement a session object's reference counter, and frees the object if it - * was the last reference. - * No lookup since session may have been removed from list - */ -void client_unref_session(struct tbase_session *session) -{ - session_put(session); -} - -static inline int cbuf_info(struct tbase_cbuf *cbuf, - struct kasnprintf_buf *buf); - -int client_info(struct tbase_client *client, struct kasnprintf_buf *buf) -{ - struct tbase_cbuf *cbuf; - struct tbase_session *session; - int ret; - - if (client->pid) - ret = kasnprintf(buf, "client %p: %s (%d)\n", client, - client->comm, client->pid); - else - ret = kasnprintf(buf, "client %p: [kernel]\n", client); - - if (ret < 0) - return ret; - - /* Buffers */ - mutex_lock(&client->cbufs_lock); - if (list_empty(&client->cbufs)) - goto done_cbufs; - - list_for_each_entry(cbuf, &client->cbufs, list) { - ret = cbuf_info(cbuf, buf); - if (ret < 0) - goto done_cbufs; - } - -done_cbufs: - mutex_unlock(&client->cbufs_lock); - if (ret < 0) - return ret; - - /* Sessions */ - mutex_lock(&client->sessions_lock); - if (list_empty(&client->sessions)) - goto done_sessions; - - list_for_each_entry(session, &client->sessions, list) { - ret = session_info(session, buf); - if (ret < 0) - goto done_sessions; - } - -done_sessions: - mutex_unlock(&client->sessions_lock); - - if (ret < 0) - return ret; - - return 0; -} - -/* - * This callback is called on remap - */ -static void cbuf_vm_open(struct vm_area_struct *vmarea) -{ - struct tbase_cbuf *cbuf = vmarea->vm_private_data; - - tbase_cbuf_get(cbuf); -} - -/* - * This callback is called on unmap - */ -static void cbuf_vm_close(struct vm_area_struct *vmarea) -{ - struct tbase_cbuf *cbuf = vmarea->vm_private_data; - - tbase_cbuf_put(cbuf); -} - -static struct vm_operations_struct cbuf_vm_ops = { - .open = cbuf_vm_open, - .close = cbuf_vm_close, -}; - -/* - * Create a cbuf object and add it to client - */ -int tbase_cbuf_alloc(struct tbase_client *client, uint32_t len, - uintptr_t *p_addr, - struct vm_area_struct *vmarea) -{ - int err = 0; - struct tbase_cbuf *cbuf = NULL; - unsigned int order; - - if (WARN(!client, "No client available")) - return -EINVAL; - - if (WARN(!len, "No len available")) - return -EINVAL; - - order = get_order(len); - if (order > MAX_ORDER) { - MCDRV_DBG_WARN("Buffer size too large"); - return -ENOMEM; - } - - /* Allocate buffer descriptor structure */ - cbuf = kzalloc(sizeof(*cbuf), GFP_KERNEL); - if (!cbuf) { - MCDRV_DBG_WARN("kzalloc failed"); - return -ENOMEM; - } - - /* Allocate buffer */ - cbuf->addr = __get_free_pages(GFP_USER | __GFP_ZERO, order); - if (!cbuf->addr) { - MCDRV_DBG_WARN("get_free_pages failed"); - kfree(cbuf); - return -ENOMEM; - } - - /* Map to user space if applicable */ - if (!client_is_kernel(client)) { - err = map_cbuf(vmarea, cbuf->addr, len, &cbuf->uaddr); - if (err) { - free_pages(cbuf->addr, order); - kfree(cbuf); - return err; - } - } - - /* Init descriptor members */ - cbuf->client = client; - cbuf->phys = virt_to_phys((void *)cbuf->addr); - cbuf->len = len; - cbuf->order = order; - kref_init(&cbuf->kref); - INIT_LIST_HEAD(&cbuf->list); - - /* Keep cbuf in VMA private data for refcounting (user-space clients) */ - if (vmarea) { - vmarea->vm_private_data = cbuf; - vmarea->vm_ops = &cbuf_vm_ops; - } - - /* Fill return parameter for k-api */ - if (p_addr) - *p_addr = cbuf->addr; - - /* Get a token on the client */ - client_get(client); - - /* Add buffer to list */ - mutex_lock(&client->cbufs_lock); - list_add(&cbuf->list, &client->cbufs); - mutex_unlock(&client->cbufs_lock); - MCDRV_DBG("created cbuf %p: client %p addr %lx uaddr %lx len %u", - cbuf, client, cbuf->addr, cbuf->uaddr, cbuf->len); - return err; -} - -/* - * Remove a cbuf object from client, and mark it for freeing. - * Freeing will happen once all current references are released. - */ -int tbase_cbuf_free(struct tbase_client *client, uintptr_t addr) -{ - struct tbase_cbuf *cbuf = tbase_cbuf_get_by_addr(client, addr); - - if (!cbuf) - return -EINVAL; - - /* Two references to put: the caller's and the one we just took */ - tbase_cbuf_put(cbuf); - tbase_cbuf_put(cbuf); - return 0; -} - -/* - * Find a contiguous buffer (cbuf) in the cbuf list of given client that - * contains given address and take a reference on it. - * Return pointer to the object, or NULL if not found. - */ -struct tbase_cbuf *tbase_cbuf_get_by_addr(struct tbase_client *client, - uintptr_t addr) -{ - struct tbase_cbuf *cbuf = NULL, *candidate; - bool is_kernel = client_is_kernel(client); - - mutex_lock(&client->cbufs_lock); - list_for_each_entry(candidate, &client->cbufs, list) { - /* Compare Vs kernel va OR user va depending on client type */ - uintptr_t start = is_kernel ? - candidate->addr : candidate->uaddr; - uintptr_t end = start + candidate->len; - - /* Check that (user) cbuf has not been unmapped */ - if (!start) - break; - - if ((addr >= start) && (addr < end)) { - cbuf = candidate; - break; - } - } - - if (cbuf) - tbase_cbuf_get(cbuf); - - mutex_unlock(&client->cbufs_lock); - return cbuf; -} - -void tbase_cbuf_get(struct tbase_cbuf *cbuf) -{ - kref_get(&cbuf->kref); -} - -static void cbuf_release(struct kref *kref) -{ - struct tbase_cbuf *cbuf = container_of(kref, struct tbase_cbuf, kref); - struct tbase_client *client = cbuf->client; - - /* Unlist from client */ - mutex_lock(&client->cbufs_lock); - list_del_init(&cbuf->list); - mutex_unlock(&client->cbufs_lock); - /* Release client token */ - client_put(client); - /* Free */ - free_pages(cbuf->addr, cbuf->order); - MCDRV_DBG("freed cbuf %p: client %p addr %lx uaddr %lx len %u", - cbuf, client, cbuf->addr, cbuf->uaddr, cbuf->len); - kfree(cbuf); -} - -void tbase_cbuf_put(struct tbase_cbuf *cbuf) -{ - kref_put(&cbuf->kref, cbuf_release); -} - -uintptr_t tbase_cbuf_addr(struct tbase_cbuf *cbuf) -{ - return cbuf->addr; -} - -uintptr_t tbase_cbuf_uaddr(struct tbase_cbuf *cbuf) -{ - return cbuf->uaddr; -} - -uint32_t tbase_cbuf_len(struct tbase_cbuf *cbuf) -{ - return cbuf->len; -} - -static inline int cbuf_info(struct tbase_cbuf *cbuf, struct kasnprintf_buf *buf) -{ - return kasnprintf(buf, "\tcbuf %p: addr %lx uaddr %lx len %u\n", - cbuf, cbuf->addr, cbuf->uaddr, cbuf->len); -} diff --git a/drivers/gud/MobiCoreDriver/client.h b/drivers/gud/MobiCoreDriver/client.h deleted file mode 100644 index 3cc833eeffb87..0000000000000 --- a/drivers/gud/MobiCoreDriver/client.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _CLIENT_H_ -#define _CLIENT_H_ - -#include -#include /* TASK_COMM_LEN */ - -struct task_struct; -struct tbase_object; -struct tbase_session; - -struct tbase_client { - /* PID of task that opened the device, 0 if kernel */ - pid_t pid; - /* Command for task*/ - char comm[TASK_COMM_LEN]; - /* Number of references kept to this object */ - struct kref kref; - /* List of contiguous buffers allocated by mcMallocWsm for the client */ - struct list_head cbufs; - struct mutex cbufs_lock; /* lock for the cbufs list */ - /* List of tbase TA sessions opened by this client */ - struct list_head sessions; - struct mutex sessions_lock; /* sessions list + closing */ - /* Client state */ - bool closing; - /* The list entry to attach to "ctx.clients" list */ - struct list_head list; -}; - -struct tbase_client *client_create(bool is_from_kernel); - -void client_close_sessions(struct tbase_client *client); - -static inline void client_get(struct tbase_client *client) -{ - kref_get(&client->kref); -} - -void client_put(struct tbase_client *client); - -bool client_is_kernel(struct tbase_client *client); - -bool client_set_closing(struct tbase_client *client); - -int client_add_session(struct tbase_client *client, - const struct tbase_object *obj, uintptr_t tci, - size_t len, uint32_t *p_sid, bool is_gp_uuid, - struct mc_identity *identity); - -int client_remove_session(struct tbase_client *client, uint32_t session_id); - -struct tbase_session *client_ref_session(struct tbase_client *client, - uint32_t session_id); - -void client_unref_session(struct tbase_session *session); - -int client_info(struct tbase_client *client, struct kasnprintf_buf *buf); - -/* - * Contiguous buffer allocated to TLCs. - * These buffers are uses as world shared memory (wsm) and shared with - * secure world. - * The virtual kernel address is added for a simpler search algorithm. - */ -struct tbase_cbuf; - -int tbase_cbuf_alloc(struct tbase_client *client, uint32_t len, - uintptr_t *addr, struct vm_area_struct *vmarea); - -int tbase_cbuf_free(struct tbase_client *client, uintptr_t addr); - -struct tbase_cbuf *tbase_cbuf_get_by_addr(struct tbase_client *client, - uintptr_t addr); - -void tbase_cbuf_get(struct tbase_cbuf *cbuf); - -void tbase_cbuf_put(struct tbase_cbuf *cbuf); - -uintptr_t tbase_cbuf_addr(struct tbase_cbuf *cbuf); - -uintptr_t tbase_cbuf_uaddr(struct tbase_cbuf *cbuf); - -uint32_t tbase_cbuf_len(struct tbase_cbuf *cbuf); - -#endif /* _CLIENT_H_ */ diff --git a/drivers/gud/MobiCoreDriver/clientlib.c b/drivers/gud/MobiCoreDriver/clientlib.c deleted file mode 100644 index c7d6d023b3a80..0000000000000 --- a/drivers/gud/MobiCoreDriver/clientlib.c +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" -#include "public/mobicore_driver_api.h" - -#include "main.h" -#include "debug.h" -#include "client.h" -#include "session.h" -#include "api.h" - -enum mc_result convert(int err) -{ - switch (-err) { - case 0: - return MC_DRV_OK; - case ENOMSG: - return MC_DRV_NO_NOTIFICATION; - case EBADMSG: - return MC_DRV_ERR_NOTIFICATION; - case EAGAIN: - return MC_DRV_ERR_OUT_OF_RESOURCES; - case EHOSTDOWN: - return MC_DRV_ERR_INIT; - case ENODEV: - return MC_DRV_ERR_UNKNOWN_DEVICE; - case ENXIO: - return MC_DRV_ERR_UNKNOWN_SESSION; - case EPERM: - return MC_DRV_ERR_INVALID_OPERATION; - case EBADE: - return MC_DRV_ERR_INVALID_RESPONSE; - case ETIME: - return MC_DRV_ERR_TIMEOUT; - case ENOMEM: - return MC_DRV_ERR_NO_FREE_MEMORY; - case EUCLEAN: - return MC_DRV_ERR_FREE_MEMORY_FAILED; - case ENOTEMPTY: - return MC_DRV_ERR_SESSION_PENDING; - case EHOSTUNREACH: - return MC_DRV_ERR_DAEMON_UNREACHABLE; - case ENOENT: - return MC_DRV_ERR_INVALID_DEVICE_FILE; - case EINVAL: - return MC_DRV_ERR_INVALID_PARAMETER; - case EPROTO: - return MC_DRV_ERR_KERNEL_MODULE; - case EADDRINUSE: - return MC_DRV_ERR_BULK_MAPPING; - case EADDRNOTAVAIL: - return MC_DRV_ERR_BULK_UNMAPPING; - case ECOMM: - return MC_DRV_INFO_NOTIFICATION; - case EUNATCH: - return MC_DRV_ERR_NQ_FAILED; - default: - MCDRV_DBG("error is %d", err); - return MC_DRV_ERR_UNKNOWN; - } -} - -static inline bool is_valid_device(uint32_t device_id) -{ - return MC_DEVICE_ID_DEFAULT == device_id; -} - -static struct tbase_client *client; -static int open_count; -static DEFINE_MUTEX(dev_mutex); /* Lock for the device */ - -static bool clientlib_client_get(void) -{ - int ret = true; - - mutex_lock(&dev_mutex); - if (!client) - ret = false; - else - client_get(client); - - mutex_unlock(&dev_mutex); - return ret; -} - -static void clientlib_client_put(void) -{ - mutex_lock(&dev_mutex); - client_put(client); - mutex_unlock(&dev_mutex); -} - -enum mc_result mc_open_device(uint32_t device_id) -{ - enum mc_result mc_result = MC_DRV_OK; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - mutex_lock(&dev_mutex); - if (!open_count) - client = api_open_device(true); - - if (client) { - open_count++; - MCDRV_DBG("Successfully opened the device."); - } else { - mc_result = MC_DRV_ERR_INVALID_DEVICE_FILE; - MCDRV_DBG("Could not open device"); - } - - mutex_unlock(&dev_mutex); - return mc_result; -} -EXPORT_SYMBOL(mc_open_device); - -enum mc_result mc_close_device(uint32_t device_id) -{ - enum mc_result mc_result = MC_DRV_OK; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - mutex_lock(&dev_mutex); - if (!client) { - mc_result = MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - goto end; - } - - if (open_count > 1) { - open_count--; - goto end; - } - - /* Check sessions and freeze client */ - mc_result = convert(api_freeze_device(client)); - if (MC_DRV_OK != mc_result) - goto end; - - /* Close the device */ - api_close_device(client); - client = NULL; - open_count = 0; - -end: - mutex_unlock(&dev_mutex); - return mc_result; -} -EXPORT_SYMBOL(mc_close_device); - -enum mc_result mc_open_session(struct mc_session_handle *session, - const struct mc_uuid_t *uuid, - uint8_t *tci, uint32_t len) -{ - struct mc_identity identity = { - .login_type = TEEC_LOGIN_PUBLIC, - }; - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_open_session(client, &session->session_id, uuid, - (uintptr_t)tci, len, false, &identity)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_open_session); - -enum mc_result mc_open_trustlet(struct mc_session_handle *session, - uint32_t spid, - uint8_t *trustlet, uint32_t trustlet_len, - uint8_t *tci, uint32_t len) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_open_trustlet(client, &session->session_id, spid, - (uintptr_t)trustlet, trustlet_len, - (uintptr_t)tci, len)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_open_trustlet); - -enum mc_result mc_close_session(struct mc_session_handle *session) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_close_session(client, session->session_id)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_close_session); - -enum mc_result mc_notify(struct mc_session_handle *session) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_notify(client, session->session_id)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_notify); - -enum mc_result mc_wait_notification(struct mc_session_handle *session, - int32_t timeout) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_wait_notification(client, session->session_id, - timeout)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_wait_notification); - -enum mc_result mc_malloc_wsm(uint32_t device_id, uint32_t align, uint32_t len, - uint8_t **wsm, uint32_t wsm_flags) -{ - enum mc_result ret; - uintptr_t va; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!len) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!wsm) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_malloc_cbuf(client, len, &va, NULL)); - if (ret == MC_DRV_OK) - *wsm = (uint8_t *)va; - - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_malloc_wsm); - -enum mc_result mc_free_wsm(uint32_t device_id, uint8_t *wsm) -{ - enum mc_result ret; - uintptr_t va = (uintptr_t)wsm; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_free_cbuf(client, va)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_free_wsm); - -enum mc_result mc_map(struct mc_session_handle *session, void *address, - uint32_t length, struct mc_bulk_map *map_info) -{ - enum mc_result ret; - struct mc_ioctl_buffer bufs[MC_MAP_MAX]; - uint32_t i; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!map_info) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - bufs[0].va = (uintptr_t)address; - bufs[0].len = length; - for (i = 1; i < MC_MAP_MAX; i++) - bufs[i].va = 0; - - ret = convert(api_map_wsms(client, session->session_id, bufs)); - if (ret == MC_DRV_OK) { - map_info->secure_virt_addr = bufs[0].sva; - map_info->secure_virt_len = bufs[0].len; - } - - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_map); - -enum mc_result mc_unmap(struct mc_session_handle *session, void *address, - struct mc_bulk_map *map_info) -{ - enum mc_result ret; - struct mc_ioctl_buffer bufs[MC_MAP_MAX]; - uint32_t i; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!map_info) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - bufs[0].va = (uintptr_t)address; - bufs[0].len = map_info->secure_virt_len; - bufs[0].sva = map_info->secure_virt_addr; - for (i = 1; i < MC_MAP_MAX; i++) - bufs[i].va = 0; - - ret = convert(api_unmap_wsms(client, session->session_id, bufs)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_unmap); - -enum mc_result mc_get_session_error_code(struct mc_session_handle *session, - int32_t *exit_code) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!exit_code) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_get_session_exitcode(client, session->session_id, - exit_code)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_get_session_error_code); diff --git a/drivers/gud/MobiCoreDriver/clock.c b/drivers/gud/MobiCoreDriver/clock.c deleted file mode 100644 index 0195ab794f205..0000000000000 --- a/drivers/gud/MobiCoreDriver/clock.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "platform.h" - -#ifdef MC_CRYPTO_CLOCK_MANAGEMENT - -#include -#include -#include -#include - -#include "debug.h" -#include "clock.h" - -static struct clk_context { - struct clk *mc_ce_iface_clk; - struct clk *mc_ce_core_clk; - struct clk *mc_ce_bus_clk; - struct clk *mc_ce_core_src_clk; -} clk_ctx; - -int mc_clock_init(void) -{ - int ret = 0; -#ifdef MC_CLOCK_CORESRC_DEFAULTRATE - int core_src_rate = MC_CLOCK_CORESRC_DEFAULTRATE; - - /* Get core clk src */ - clk_ctx.mc_ce_core_src_clk = clk_get(g_ctx.mcd, "core_clk_src"); - if (IS_ERR(clk_ctx.mc_ce_core_src_clk)) { - ret = PTR_ERR(clk_ctx.mc_ce_core_src_clk); - MCDRV_ERROR("cannot get core src clock: %d", ret); - goto error; - } - -#ifdef MC_CRYPTO_CLOCK_CORESRC_PROPNAME - if (of_property_read_u32(g_ctx.mcd->of_node, - MC_CRYPTO_CLOCK_CORESRC_PROPNAME, - &core_src_rate)) { - core_src_rate = MC_CLOCK_CORESRC_DEFAULTRATE; - MCDRV_ERROR("cannot get ce clock frequency from DT, use %d", - core_src_rate); - } -#endif /* MC_CRYPTO_CLOCK_CORESRC_PROPNAME */ - - ret = clk_set_rate(clk_ctx.mc_ce_core_src_clk, core_src_rate); - if (ret) { - clk_put(clk_ctx.mc_ce_core_src_clk); - clk_ctx.mc_ce_core_src_clk = NULL; - MCDRV_ERROR("cannot set core clock src rate: %d", ret); - ret = -EIO; - goto error; - } -#endif /* MC_CLOCK_CORESRC_DEFAULTRATE */ - - /* Get core clk */ - clk_ctx.mc_ce_core_clk = clk_get(g_ctx.mcd, "core_clk"); - if (IS_ERR(clk_ctx.mc_ce_core_clk)) { - ret = PTR_ERR(clk_ctx.mc_ce_core_clk); - MCDRV_ERROR("cannot get core clock: %d", ret); - goto error; - } - /* Get Interface clk */ - clk_ctx.mc_ce_iface_clk = clk_get(g_ctx.mcd, "iface_clk"); - if (IS_ERR(clk_ctx.mc_ce_iface_clk)) { - clk_put(clk_ctx.mc_ce_core_clk); - ret = PTR_ERR(clk_ctx.mc_ce_iface_clk); - MCDRV_ERROR("cannot get iface clock: %d", ret); - goto error; - } - /* Get AXI clk */ - clk_ctx.mc_ce_bus_clk = clk_get(g_ctx.mcd, "bus_clk"); - if (IS_ERR(clk_ctx.mc_ce_bus_clk)) { - clk_put(clk_ctx.mc_ce_iface_clk); - clk_put(clk_ctx.mc_ce_core_clk); - ret = PTR_ERR(clk_ctx.mc_ce_bus_clk); - MCDRV_ERROR("cannot get AXI bus clock: %d", ret); - goto error; - } - return ret; - -error: - clk_ctx.mc_ce_core_clk = NULL; - clk_ctx.mc_ce_iface_clk = NULL; - clk_ctx.mc_ce_bus_clk = NULL; - clk_ctx.mc_ce_core_src_clk = NULL; - return ret; -} - -void mc_clock_exit(void) -{ - if (clk_ctx.mc_ce_iface_clk) - clk_put(clk_ctx.mc_ce_iface_clk); - - if (clk_ctx.mc_ce_core_clk) - clk_put(clk_ctx.mc_ce_core_clk); - - if (clk_ctx.mc_ce_bus_clk) - clk_put(clk_ctx.mc_ce_bus_clk); - - if (clk_ctx.mc_ce_core_src_clk) - clk_put(clk_ctx.mc_ce_core_src_clk); -} - -int mc_clock_enable(void) -{ - int rc; - - rc = clk_prepare_enable(clk_ctx.mc_ce_core_clk); - if (rc) { - MCDRV_ERROR("cannot enable core clock"); - goto err_core; - } - - rc = clk_prepare_enable(clk_ctx.mc_ce_iface_clk); - if (rc) { - MCDRV_ERROR("cannot enable interface clock"); - goto err_iface; - } - - rc = clk_prepare_enable(clk_ctx.mc_ce_bus_clk); - if (rc) { - MCDRV_ERROR("cannot enable bus clock"); - goto err_bus; - } - - return 0; - -err_bus: - clk_disable_unprepare(clk_ctx.mc_ce_iface_clk); -err_iface: - clk_disable_unprepare(clk_ctx.mc_ce_core_clk); -err_core: - return rc; -} - -void mc_clock_disable(void) -{ - if (clk_ctx.mc_ce_iface_clk) - clk_disable_unprepare(clk_ctx.mc_ce_iface_clk); - - if (clk_ctx.mc_ce_core_clk) - clk_disable_unprepare(clk_ctx.mc_ce_core_clk); - - if (clk_ctx.mc_ce_bus_clk) - clk_disable_unprepare(clk_ctx.mc_ce_bus_clk); -} - -#endif /* MC_CRYPTO_CLOCK_MANAGEMENT */ diff --git a/drivers/gud/MobiCoreDriver/clock.h b/drivers/gud/MobiCoreDriver/clock.h deleted file mode 100644 index 21095499efb53..0000000000000 --- a/drivers/gud/MobiCoreDriver/clock.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MC_CLOCK_H_ -#define _MC_CLOCK_H_ - -#include "platform.h" /* MC_CRYPTO_CLOCK_MANAGEMENT */ - -#ifdef MC_CRYPTO_CLOCK_MANAGEMENT - -/* Initialize secure crypto clocks */ -int mc_clock_init(void); -/* Free secure crypto clocks */ -void mc_clock_exit(void); -/* Enable secure crypto clocks */ -int mc_clock_enable(void); -/* Disable secure crypto clocks */ -void mc_clock_disable(void); - -#else /* MC_CRYPTO_CLOCK_MANAGEMENT */ - -static inline int mc_clock_init(void) -{ - return 0; -} - -static inline void mc_clock_exit(void) -{ -} - -static inline int mc_clock_enable(void) -{ - return 0; -} - -static inline void mc_clock_disable(void) -{ -} - -#endif /* !MC_CRYPTO_CLOCK_MANAGEMENT */ - -#endif /* _MC_CLOCK_H_ */ diff --git a/drivers/gud/MobiCoreDriver/debug.h b/drivers/gud/MobiCoreDriver/debug.h deleted file mode 100644 index 9d6a52ab955b6..0000000000000 --- a/drivers/gud/MobiCoreDriver/debug.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MC_DEBUG_H_ -#define _MC_DEBUG_H_ - -#include "main.h" /* g_ctx */ - -#define MCDRV_ERROR(txt, ...) \ - dev_err(g_ctx.mcd, "%s() ### ERROR: " txt "\n", \ - __func__, \ - ##__VA_ARGS__) - -/* dummy function helper macro. */ -#define DUMMY_FUNCTION() do {} while (0) - -#ifdef DEBUG - -#ifdef DEBUG_VERBOSE -#define MCDRV_DBG_VERBOSE MCDRV_DBG -#else -#define MCDRV_DBG_VERBOSE(...) DUMMY_FUNCTION() -#endif - -#define MCDRV_DBG(txt, ...) \ - dev_info(g_ctx.mcd, "%s(): " txt "\n", \ - __func__, \ - ##__VA_ARGS__) - -#define MCDRV_DBG_WARN(txt, ...) \ - dev_warn(g_ctx.mcd, "%s() WARNING: " txt "\n", \ - __func__, \ - ##__VA_ARGS__) - -#define MCDRV_ASSERT(cond) \ - do { \ - if (unlikely(!(cond))) { \ - panic("Assertion failed: %s:%d\n", \ - __FILE__, __LINE__); \ - } \ - } while (0) - -#else /* DEBUG */ - -#define MCDRV_DBG_VERBOSE(...) DUMMY_FUNCTION() -#define MCDRV_DBG(...) DUMMY_FUNCTION() -#define MCDRV_DBG_WARN(...) DUMMY_FUNCTION() - -#define MCDRV_ASSERT(...) DUMMY_FUNCTION() - -#endif /* !DEBUG */ - -#endif /* _MC_DEBUG_H_ */ diff --git a/drivers/gud/MobiCoreDriver/fastcall.c b/drivers/gud/MobiCoreDriver/fastcall.c deleted file mode 100644 index ee612632331c8..0000000000000 --- a/drivers/gud/MobiCoreDriver/fastcall.c +++ /dev/null @@ -1,512 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_linux_api.h" - -#include "mci/mcifc.h" - -#include "platform.h" /* MC_FASTCALL_WORKER_THREAD and more */ -#include "debug.h" -#include "clock.h" /* mc_clock_enable, mc_clock_disable */ -#include "fastcall.h" - -struct fastcall_work { -#ifdef MC_FASTCALL_WORKER_THREAD - struct kthread_work work; -#else - struct work_struct work; -#endif - void *data; -}; - -/* generic fast call parameters */ -union mc_fc_generic { - struct { - uint32_t cmd; - uint32_t param[3]; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t param[2]; - } as_out; -}; - -/* fast call init */ -union mc_fc_init { - union mc_fc_generic as_generic; - struct { - uint32_t cmd; - uint32_t base; - uint32_t nq_info; - uint32_t mcp_info; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t rfu[2]; - } as_out; -}; - -/* fast call info parameters */ -union mc_fc_info { - union mc_fc_generic as_generic; - struct { - uint32_t cmd; - uint32_t ext_info_id; - uint32_t rfu[2]; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t state; - uint32_t ext_info; - } as_out; -}; - -#ifdef TBASE_CORE_SWITCHER -/* fast call switch Core parameters */ -union mc_fc_swich_core { - union mc_fc_generic as_generic; - struct { - uint32_t cmd; - uint32_t core_id; - uint32_t rfu[2]; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t state; - uint32_t ext_info; - } as_out; -}; -#endif - -#ifdef MC_FASTCALL_WORKER_THREAD -static struct task_struct *fastcall_thread; -static DEFINE_KTHREAD_WORKER(fastcall_worker); -#endif - -/* - * _smc() - fast call to MobiCore - * - * @data: pointer to fast call data - */ -static inline int _smc(union mc_fc_generic *mc_fc_generic) -{ - if (!mc_fc_generic) - return -EINVAL; - -#ifdef MC_SMC_FASTCALL - return smc_fastcall(mc_fc_generic, sizeof(*mc_fc_generic)); -#else /* MC_SMC_FASTCALL */ - { -#ifdef CONFIG_ARM64 - /* SMC expect values in x0-x3 */ - register u64 reg0 __asm__("x0") = mc_fc_generic->as_in.cmd; - register u64 reg1 __asm__("x1") = mc_fc_generic->as_in.param[0]; - register u64 reg2 __asm__("x2") = mc_fc_generic->as_in.param[1]; - register u64 reg3 __asm__("x3") = mc_fc_generic->as_in.param[2]; - - /* - * According to AARCH64 SMC Calling Convention (ARM DEN 0028A), - * section 3.1: registers x4-x17 are unpredictable/scratch - * registers. So we have to make sure that the compiler does - * not allocate any of those registers by letting him know that - * the asm code might clobber them. - */ - __asm__ volatile ( - "smc #0\n" - : "+r"(reg0), "+r"(reg1), "+r"(reg2), "+r"(reg3) - : - : "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", - "x12", "x13", "x14", "x15", "x16", "x17" - ); -#else /* CONFIG_ARM64 */ - /* SMC expect values in r0-r3 */ - register u32 reg0 __asm__("r0") = mc_fc_generic->as_in.cmd; - register u32 reg1 __asm__("r1") = mc_fc_generic->as_in.param[0]; - register u32 reg2 __asm__("r2") = mc_fc_generic->as_in.param[1]; - register u32 reg3 __asm__("r3") = mc_fc_generic->as_in.param[2]; - - __asm__ volatile ( -#ifdef MC_ARCH_EXTENSION_SEC - /* This pseudo op is supported and required from - * binutils 2.21 on */ - ".arch_extension sec\n" -#endif /* MC_ARCH_EXTENSION_SEC */ - "smc #0\n" - : "+r"(reg0), "+r"(reg1), "+r"(reg2), "+r"(reg3) - ); - -#ifdef __ARM_VE_A9X4_QEMU__ - /* Qemu does not return to the address following the SMC - * instruction so we have to insert several nop instructions to - * workaround this Qemu bug. */ - __asm__ volatile ( - "nop\n" - "nop\n" - "nop\n" - "nop" - ); -#endif /* __ARM_VE_A9X4_QEMU__ */ -#endif /* !CONFIG_ARM64 */ - - /* set response */ - mc_fc_generic->as_out.resp = reg0; - mc_fc_generic->as_out.ret = reg1; - mc_fc_generic->as_out.param[0] = reg2; - mc_fc_generic->as_out.param[1] = reg3; - } - return 0; -#endif /* !MC_SMC_FASTCALL */ -} - -#ifdef TBASE_CORE_SWITCHER -static uint32_t active_cpu; - -#ifdef MC_FASTCALL_WORKER_THREAD -static void mc_cpu_offline(int cpu) -{ - int i; - - if (active_cpu != cpu) { - MCDRV_DBG("not active CPU, no action taken\n"); - return; - } - - /* Chose the first online CPU and switch! */ - for_each_online_cpu(i) { - if (cpu != i) { - MCDRV_DBG("CPU %d is dying, switching to %d\n", cpu, i); - mc_switch_core(i); - break; - } - - MCDRV_DBG("Skipping CPU %d\n", cpu); - } -} - -static int mobicore_cpu_callback(struct notifier_block *nfb, - unsigned long action, void *hcpu) -{ - unsigned int cpu = (unsigned long)hcpu; - - switch (action) { - case CPU_DOWN_PREPARE: - case CPU_DOWN_PREPARE_FROZEN: - dev_info(g_ctx.mcd, "Cpu %u is going to die\n", cpu); - mc_cpu_offline(cpu); - break; - case CPU_DEAD: - case CPU_DEAD_FROZEN: - dev_info(g_ctx.mcd, "Cpu %u is dead\n", cpu); - break; - } - return NOTIFY_OK; -} - -static struct notifier_block mobicore_cpu_notifer = { - .notifier_call = mobicore_cpu_callback, -}; -#endif /* MC_FASTCALL_WORKER_THREAD */ - -static cpumask_t mc_exec_core_switch(union mc_fc_generic *mc_fc_generic) -{ - cpumask_t cpu; - uint32_t new_cpu; - uint32_t cpu_id[] = CPU_IDS; - - new_cpu = mc_fc_generic->as_in.param[0]; - mc_fc_generic->as_in.param[0] = cpu_id[mc_fc_generic->as_in.param[0]]; - - if (_smc(mc_fc_generic) != 0 || mc_fc_generic->as_out.ret != 0) { - MCDRV_DBG("CoreSwap failed %d -> %d (cpu %d still active)\n", - raw_smp_processor_id(), - mc_fc_generic->as_in.param[0], - raw_smp_processor_id()); - } else { - active_cpu = new_cpu; - MCDRV_DBG("CoreSwap ok %d -> %d\n", - raw_smp_processor_id(), active_cpu); - } - cpumask_clear(&cpu); - cpumask_set_cpu(active_cpu, &cpu); - return cpu; -} -#else /* TBASE_CORE_SWITCHER */ -static inline cpumask_t mc_exec_core_switch(union mc_fc_generic *mc_fc_generic) -{ - return CPU_MASK_CPU0; -} -#endif /* !TBASE_CORE_SWITCHER */ - -#ifdef MC_FASTCALL_WORKER_THREAD -static void fastcall_work_func(struct kthread_work *work) -#else -static void fastcall_work_func(struct work_struct *work) -#endif -{ - struct fastcall_work *fc_work = - container_of(work, struct fastcall_work, work); - union mc_fc_generic *mc_fc_generic = fc_work->data; - - if (!mc_fc_generic) - return; - - mc_clock_enable(); - - if (mc_fc_generic->as_in.cmd == MC_FC_SWAP_CPU) { -#ifdef MC_FASTCALL_WORKER_THREAD - cpumask_t new_msk = mc_exec_core_switch(mc_fc_generic); - - set_cpus_allowed(fastcall_thread, new_msk); -#else - mc_exec_core_switch(mc_fc_generic); -#endif - } else { - _smc(mc_fc_generic); - } - - mc_clock_disable(); -} - -static bool mc_fastcall(void *data) -{ -#ifdef MC_FASTCALL_WORKER_THREAD - struct fastcall_work fc_work = { - KTHREAD_WORK_INIT(fc_work.work, fastcall_work_func), - .data = data, - }; - - if (!queue_kthread_work(&fastcall_worker, &fc_work.work)) - return false; - - /* If work is queued or executing, wait for it to finish execution */ - flush_kthread_work(&fc_work.work); -#else - struct fastcall_work fc_work = { - .data = data, - }; - - INIT_WORK_ONSTACK(&fc_work.work, fastcall_work_func); - - if (!schedule_work_on(0, &fc_work.work)) - return false; - - flush_work(&fc_work.work); -#endif - return true; -} - -int mc_fastcall_init(void) -{ - int ret = mc_clock_init(); - - if (ret) - return ret; - -#ifdef MC_FASTCALL_WORKER_THREAD - fastcall_thread = kthread_create(kthread_worker_fn, &fastcall_worker, - "mc_fastcall"); - if (IS_ERR(fastcall_thread)) { - ret = PTR_ERR(fastcall_thread); - fastcall_thread = NULL; - MCDRV_ERROR("cannot create fastcall wq (%d)", ret); - return ret; - } - - /* this thread MUST run on CPU 0 at startup */ - set_cpus_allowed(fastcall_thread, CPU_MASK_CPU0); - - wake_up_process(fastcall_thread); -#ifdef TBASE_CORE_SWITCHER - ret = register_cpu_notifier(&mobicore_cpu_notifer); -#endif -#endif /* MC_FASTCALL_WORKER_THREAD */ - return ret; -} - -void mc_fastcall_exit(void) -{ -#ifdef MC_FASTCALL_WORKER_THREAD - if (!IS_ERR_OR_NULL(fastcall_thread)) { -#ifdef TBASE_CORE_SWITCHER - unregister_cpu_notifier(&mobicore_cpu_notifer); -#endif - kthread_stop(fastcall_thread); - fastcall_thread = NULL; - } -#endif /* MC_FASTCALL_WORKER_THREAD */ - mc_clock_exit(); -} - -/* - * convert fast call return code to linux driver module error code - */ -static int convert_fc_ret(uint32_t ret) -{ - switch (ret) { - case MC_FC_RET_OK: - return 0; - case MC_FC_RET_ERR_INVALID: - return -EINVAL; - case MC_FC_RET_ERR_ALREADY_INITIALIZED: - return -EBUSY; - default: - return -EFAULT; - } -} - -int mc_fc_init(uintptr_t base_pa, ptrdiff_t off, size_t q_len, size_t buf_len) -{ -#ifdef CONFIG_ARM64 - uint32_t base_high = (uint32_t)(base_pa >> 32); -#else - uint32_t base_high = 0; -#endif - union mc_fc_init fc_init; - - /* Call the INIT fastcall to setup MobiCore initialization */ - memset(&fc_init, 0, sizeof(fc_init)); - fc_init.as_in.cmd = MC_FC_INIT; - /* base address of mci buffer PAGE_SIZE (default is 4KB) aligned */ - fc_init.as_in.base = (uint32_t)base_pa; - /* notification buffer start/length [16:16] [start, length] */ - fc_init.as_in.nq_info = - ((base_high & 0xFFFF) << 16) | (q_len & 0xFFFF); - /* mcp buffer start/length [16:16] [start, length] */ - fc_init.as_in.mcp_info = (off << 16) | (buf_len & 0xFFFF); - MCDRV_DBG("cmd=0x%08x, base=0x%08x,nq_info=0x%08x, mcp_info=0x%08x", - fc_init.as_in.cmd, fc_init.as_in.base, fc_init.as_in.nq_info, - fc_init.as_in.mcp_info); - mc_fastcall(&fc_init.as_generic); - MCDRV_DBG("out cmd=0x%08x, ret=0x%08x", fc_init.as_out.resp, - fc_init.as_out.ret); - return convert_fc_ret(fc_init.as_out.ret); -} - -int mc_fc_info(uint32_t ext_info_id, uint32_t *state, uint32_t *ext_info) -{ - union mc_fc_info fc_info; - int ret = 0; - - memset(&fc_info, 0, sizeof(fc_info)); - fc_info.as_in.cmd = MC_FC_INFO; - fc_info.as_in.ext_info_id = ext_info_id; - mc_fastcall(&fc_info.as_generic); - ret = convert_fc_ret(fc_info.as_out.ret); - if (ret) { - if (state) - *state = MC_STATUS_NOT_INITIALIZED; - - if (ext_info) - *ext_info = 0; - - MCDRV_ERROR("code %d for idx %d", ret, ext_info_id); - } else { - if (state) - *state = fc_info.as_out.state; - - if (ext_info) - *ext_info = fc_info.as_out.ext_info; - } - - return ret; -} - -int mc_fc_mem_trace(phys_addr_t buffer, uint32_t size) -{ - union mc_fc_generic mc_fc_generic; - - memset(&mc_fc_generic, 0, sizeof(mc_fc_generic)); - mc_fc_generic.as_in.cmd = MC_FC_MEM_TRACE; - mc_fc_generic.as_in.param[0] = (uint32_t)buffer; -#ifdef CONFIG_ARM64 - mc_fc_generic.as_in.param[1] = (uint32_t)(buffer >> 32); -#endif - mc_fc_generic.as_in.param[2] = size; - mc_fastcall(&mc_fc_generic); - return convert_fc_ret(mc_fc_generic.as_out.ret); -} - -int mc_fc_nsiq(void) -{ - union mc_fc_generic fc; - int ret; - - memset(&fc, 0, sizeof(fc)); - fc.as_in.cmd = MC_SMC_N_SIQ; - mc_fastcall(&fc); - ret = convert_fc_ret(fc.as_out.ret); - if (ret) - MCDRV_ERROR("failed: %d", ret); - - return ret; -} - -int mc_fc_yield(void) -{ - union mc_fc_generic fc; - int ret; - - memset(&fc, 0, sizeof(fc)); - fc.as_in.cmd = MC_SMC_N_YIELD; - mc_fastcall(&fc); - ret = convert_fc_ret(fc.as_out.ret); - if (ret) - MCDRV_ERROR("failed: %d", ret); - - return ret; -} - -#ifdef TBASE_CORE_SWITCHER -uint32_t mc_active_core(void) -{ - return active_cpu; -} - -int mc_switch_core(uint32_t core_num) -{ - int32_t ret = 0; - union mc_fc_swich_core fc_switch_core; - - if (!cpu_online(core_num)) - return 1; - - MCDRV_DBG_VERBOSE("enter\n"); - memset(&fc_switch_core, 0, sizeof(fc_switch_core)); - fc_switch_core.as_in.cmd = MC_FC_SWAP_CPU; - if (core_num < COUNT_OF_CPUS) - fc_switch_core.as_in.core_id = core_num; - else - fc_switch_core.as_in.core_id = 0; - - MCDRV_DBG("<- cmd=0x%08x, core_id=0x%08x\n", - fc_switch_core.as_in.cmd, fc_switch_core.as_in.core_id); - MCDRV_DBG("<- core_num=0x%08x, active_cpu=0x%08x\n", - core_num, active_cpu); - mc_fastcall(&fc_switch_core.as_generic); - ret = convert_fc_ret(fc_switch_core.as_out.ret); - MCDRV_DBG_VERBOSE("exit with %d/0x%08X\n", ret, ret); - return ret; -} -#endif diff --git a/drivers/gud/MobiCoreDriver/fastcall.h b/drivers/gud/MobiCoreDriver/fastcall.h deleted file mode 100644 index b19b27687ff38..0000000000000 --- a/drivers/gud/MobiCoreDriver/fastcall.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _TBASE_FASTCALL_H_ -#define _TBASE_FASTCALL_H_ - -/* Use the arch_extension sec pseudo op before switching to secure world */ -#if defined(__GNUC__) && \ - defined(__GNUC_MINOR__) && \ - defined(__GNUC_PATCHLEVEL__) && \ - ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)) \ - >= 40502 -#ifndef CONFIG_ARM64 -#define MC_ARCH_EXTENSION_SEC -#endif -#endif - -int mc_fc_init(uintptr_t base_pa, ptrdiff_t off, size_t q_len, size_t buf_len); -int mc_fc_info(uint32_t ext_info_id, uint32_t *state, uint32_t *ext_info); -int mc_fc_mem_trace(phys_addr_t buffer, uint32_t size); -int mc_fc_nsiq(void); -int mc_fc_yield(void); - -int mc_fastcall_init(void); -void mc_fastcall_exit(void); - -#endif /* _TBASE_FASTCALL_H_ */ diff --git a/drivers/gud/MobiCoreDriver/logging.c b/drivers/gud/MobiCoreDriver/logging.c deleted file mode 100644 index 953de5f149f78..0000000000000 --- a/drivers/gud/MobiCoreDriver/logging.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include - -#include "fastcall.h" -#include "main.h" -#include "logging.h" - -#ifndef CONFIG_TRUSTONIC_TEE_NO_TRACES - -/* Supported log buffer version */ -#define MC_LOG_VERSION 2 - -/* Default length of the log ring buffer 256KiB */ -#define LOG_BUF_ORDER 6 - -/* Max Len of a log line for printing */ -#define LOG_LINE_SIZE 256 - -/* Definitions for log version 2 */ -#define LOG_TYPE_MASK (0x0007) -#define LOG_TYPE_CHAR 0 -#define LOG_TYPE_INTEGER 1 - -/* Field length */ -#define LOG_LENGTH_MASK (0x00F8) -#define LOG_LENGTH_SHIFT 3 - -/* Extra attributes */ -#define LOG_EOL (0x0100) -#define LOG_INTEGER_DECIMAL (0x0200) -#define LOG_INTEGER_SIGNED (0x0400) - -struct mc_logmsg { - uint16_t ctrl; /* Type and format of data */ - uint16_t source; /* Unique value for each event source */ - uint32_t log_data; /* Value, if any */ -}; - -/* MobiCore internal trace buffer structure. */ -struct mc_trace_buf { - uint32_t version; /* version of trace buffer */ - uint32_t length; /* length of buff */ - uint32_t head; /* last write position */ - uint8_t buff[]; /* start of the log buffer */ -}; - -static struct logging_ctx { - struct work_struct work; - union { - struct mc_trace_buf *trace_buf; /* Circular log buffer */ - unsigned long trace_page; - }; - bool buffer_is_shared; /* Log buffer cannot be freed */ - uint32_t tail; /* MobiCore log read position */ - uint32_t line_len; /* Log Line buffer current length */ - int thread_err; - uint16_t prev_source; /* Previous Log source */ - char line[LOG_LINE_SIZE]; /* Log Line buffer */ - bool dead; -} log_ctx; - -static inline void log_eol(uint16_t source) -{ - if (!strnlen(log_ctx.line, LOG_LINE_SIZE)) { - /* In case a TA tries to print a 0x0 */ - log_ctx.line_len = 0; - return; - } - - if (log_ctx.prev_source) - /* MobiCore Userspace */ - dev_info(g_ctx.mcd, "%03x|%s\n", log_ctx.prev_source, - log_ctx.line); - else - /* MobiCore kernel */ - dev_info(g_ctx.mcd, "%s\n", log_ctx.line); - - log_ctx.line_len = 0; - log_ctx.line[0] = 0; -} - -/* - * Collect chars in log_ctx.line buffer and output the buffer when it is full. - * No locking needed because only "mobicore_log" thread updates this buffer. - */ -static inline void log_char(char ch, uint16_t source) -{ - if (ch == '\n' || ch == '\r') { - log_eol(source); - return; - } - - if ((log_ctx.line_len >= (LOG_LINE_SIZE - 1)) || - (source != log_ctx.prev_source)) - log_eol(source); - - log_ctx.line[log_ctx.line_len++] = ch; - log_ctx.line[log_ctx.line_len] = 0; - log_ctx.prev_source = source; -} - -static inline void log_string(uint32_t ch, uint16_t source) -{ - while (ch) { - log_char(ch & 0xFF, source); - ch >>= 8; - } -} - -static inline void log_number(uint32_t format, uint32_t value, uint16_t source) -{ - int width = (format & LOG_LENGTH_MASK) >> LOG_LENGTH_SHIFT; - char fmt[16]; - char buffer[32]; - const char *reader = buffer; - - if (format & LOG_INTEGER_DECIMAL) - if (format & LOG_INTEGER_SIGNED) - snprintf(fmt, sizeof(fmt), "%%%ud", width); - else - snprintf(fmt, sizeof(fmt), "%%%uu", width); - else - snprintf(fmt, sizeof(fmt), "%%0%ux", width); - - snprintf(buffer, sizeof(buffer), fmt, value); - while (*reader) - log_char(*reader++, source); -} - -static inline int log_msg(void *data) -{ - struct mc_logmsg *msg = (struct mc_logmsg *)data; - int log_type = msg->ctrl & LOG_TYPE_MASK; - - switch (log_type) { - case LOG_TYPE_CHAR: - log_string(msg->log_data, msg->source); - break; - case LOG_TYPE_INTEGER: - log_number(msg->ctrl, msg->log_data, msg->source); - break; - } - if (msg->ctrl & LOG_EOL) - log_eol(msg->source); - - return sizeof(*msg); -} - -static void log_worker(struct work_struct *work) -{ - while (log_ctx.trace_buf->head != log_ctx.tail) { - if (log_ctx.trace_buf->version != MC_LOG_VERSION) { - dev_err(g_ctx.mcd, - "Bad log data v%d (exp. v%d), stop.\n", - log_ctx.trace_buf->version, - MC_LOG_VERSION); - log_ctx.dead = true; - break; - } - - log_ctx.tail += log_msg(&log_ctx.trace_buf->buff[log_ctx.tail]); - /* Wrap over if no space left for a complete message */ - if ((log_ctx.tail + sizeof(struct mc_logmsg)) > - log_ctx.trace_buf->length) - log_ctx.tail = 0; - } -} - -/* - * Wake up the log reader thread - * This should be called from the places where calls into MobiCore have - * generated some logs(eg, yield, SIQ...) - */ -void mc_logging_run(void) -{ - if (!log_ctx.dead && (log_ctx.trace_buf->head != log_ctx.tail)) - schedule_work(&log_ctx.work); -} - -int mc_logging_start(void) -{ - int ret = mc_fc_mem_trace(virt_to_phys((void *)(log_ctx.trace_page)), - BIT(LOG_BUF_ORDER) * PAGE_SIZE); - - if (ret) { - dev_err(g_ctx.mcd, "shared traces setup failed\n"); - return ret; - } - - log_ctx.buffer_is_shared = true; - dev_dbg(g_ctx.mcd, "fc_log version %u\n", log_ctx.trace_buf->version); - mc_logging_run(); - return 0; -} - -void mc_logging_stop(void) -{ - if (!mc_fc_mem_trace(0, 0)) - log_ctx.buffer_is_shared = false; - - mc_logging_run(); - flush_work(&log_ctx.work); -} - -/* - * Setup MobiCore kernel log. It assumes it's running on CORE 0! - * The fastcall will complain is that is not the case! - */ -int mc_logging_init(void) -{ - /* - * We are going to map this buffer into virtual address space in SWd. - * To reduce complexity there, we use a contiguous buffer. - */ - log_ctx.trace_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, - LOG_BUF_ORDER); - if (!log_ctx.trace_page) - return -ENOMEM; - - INIT_WORK(&log_ctx.work, log_worker); - return 0; -} - -void mc_logging_exit(void) -{ - /* - * This is not racey as the only caller for mc_logging_run is the - * scheduler which gets stopped before us, and long before we exit. - */ - if (!log_ctx.buffer_is_shared) - free_pages(log_ctx.trace_page, LOG_BUF_ORDER); - else - dev_err(g_ctx.mcd, "log buffer unregister not supported\n"); -} - -#endif /* !CONFIG_TRUSTONIC_TEE_NO_TRACES */ diff --git a/drivers/gud/MobiCoreDriver/logging.h b/drivers/gud/MobiCoreDriver/logging.h deleted file mode 100644 index 744b41880ea31..0000000000000 --- a/drivers/gud/MobiCoreDriver/logging.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MC_LOGGING_H_ -#define _MC_LOGGING_H_ - -#include "platform.h" /* CONFIG_TRUSTONIC_TEE_NO_TRACES */ - -/* MobiCore internal trace log setup. */ -#ifndef CONFIG_TRUSTONIC_TEE_NO_TRACES -void mc_logging_run(void); -int mc_logging_init(void); -void mc_logging_exit(void); -int mc_logging_start(void); -void mc_logging_stop(void); -#else /* !CONFIG_TRUSTONIC_TEE_NO_TRACES */ -static inline void mc_logging_run(void) -{ -} - -static inline long mc_logging_init(void) -{ - return 0; -} - -static inline void mc_logging_exit(void) -{ -} - -static inline int mc_logging_start(void) -{ - return 0; -} - -static inline void mc_logging_stop(void) -{ -} - -#endif /* CONFIG_TRUSTONIC_TEE_NO_TRACES */ - -#endif /* _MC_LOGGING_H_ */ diff --git a/drivers/gud/MobiCoreDriver/main.c b/drivers/gud/MobiCoreDriver/main.c deleted file mode 100644 index 66b232e5bc8b5..0000000000000 --- a/drivers/gud/MobiCoreDriver/main.c +++ /dev/null @@ -1,750 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "main.h" -#include "fastcall.h" -#include "arm.h" -#include "mmu.h" -#include "scheduler.h" -#include "pm.h" -#include "debug.h" -#include "logging.h" -#include "admin.h" -#include "mcp.h" -#include "session.h" -#include "client.h" -#include "api.h" - -#include "build_tag.h" - -/* Define a MobiCore device structure for use with dev_debug() etc */ -static struct device_driver driver = { - .name = "Trustonic" -}; - -static struct device device = { - .driver = &driver -}; - -struct mc_device_ctx g_ctx = { - .mcd = &device -}; - -/* device admin */ -static dev_t mc_dev_admin; -/* device user */ -static dev_t mc_dev_user; - -/* Need to discover a chrdev region for the driver */ -static struct cdev mc_user_cdev; -/* Device class for the driver assigned major */ -static struct class *mc_device_class; - -/* - * Get client object from file pointer - */ -static inline struct tbase_client *get_client(struct file *file) -{ - return (struct tbase_client *)file->private_data; -} - -/* - * Callback for system mmap() - */ -static int mc_fd_user_mmap(struct file *file, struct vm_area_struct *vmarea) -{ - struct tbase_client *client = get_client(file); - uint32_t len = (uint32_t)(vmarea->vm_end - vmarea->vm_start); - - /* Alloc contiguous buffer for this client */ - return api_malloc_cbuf(client, len, NULL, vmarea); -} - -/* - * Check r/w access to referenced memory - */ -static inline int ioctl_check_pointer(unsigned int cmd, int __user *uarg) -{ - int err = 0; - - if (_IOC_DIR(cmd) & _IOC_READ) - err = !access_ok(VERIFY_WRITE, uarg, _IOC_SIZE(cmd)); - else if (_IOC_DIR(cmd) & _IOC_WRITE) - err = !access_ok(VERIFY_READ, uarg, _IOC_SIZE(cmd)); - - if (err) - return -EFAULT; - - return 0; -} - -/* - * Callback for system ioctl() - * Implement most of ClientLib API functions - * @file pointer to file - * @cmd command - * @arg arguments - * - * Returns 0 for OK and an errno in case of error - */ -static long mc_fd_user_ioctl(struct file *file, unsigned int id, - unsigned long arg) -{ - struct tbase_client *client = get_client(file); - int __user *uarg = (int __user *)arg; - int ret = -EINVAL; - - MCDRV_DBG("%u from %s", _IOC_NR(id), current->comm); - - if (WARN(!client, "No client data available")) - return -EPROTO; - - if (ioctl_check_pointer(id, uarg)) - return -EFAULT; - - switch (id) { - case MC_IO_FREEZE: - /* Freeze the client */ - ret = api_freeze_device(client); - break; - - case MC_IO_OPEN_SESSION: { - struct mc_ioctl_open_sess sess; - - if (copy_from_user(&sess, uarg, sizeof(sess))) { - ret = -EFAULT; - break; - } - - ret = api_open_session(client, &sess.sid, &sess.uuid, sess.tci, - sess.tcilen, sess.is_gp_uuid, - &sess.identity); - if (ret) - break; - - if (copy_to_user(uarg, &sess, sizeof(sess))) { - ret = -EFAULT; - api_close_session(client, sess.sid); - break; - } - break; - } - case MC_IO_OPEN_TRUSTLET: { - struct mc_ioctl_open_trustlet ta_desc; - - if (copy_from_user(&ta_desc, uarg, sizeof(ta_desc))) { - ret = -EFAULT; - break; - } - - /* Call internal api */ - ret = api_open_trustlet(client, &ta_desc.sid, ta_desc.spid, - ta_desc.buffer, ta_desc.tlen, - ta_desc.tci, ta_desc.tcilen); - if (ret) - break; - - if (copy_to_user(uarg, &ta_desc, sizeof(ta_desc))) { - ret = -EFAULT; - api_close_session(client, ta_desc.sid); - break; - } - break; - } - case MC_IO_CLOSE_SESSION: { - uint32_t sid = (uint32_t)arg; - - ret = api_close_session(client, sid); - break; - } - case MC_IO_NOTIFY: { - uint32_t sid = (uint32_t)arg; - - ret = api_notify(client, sid); - break; - } - case MC_IO_WAIT: { - struct mc_ioctl_wait wait; - - if (copy_from_user(&wait, uarg, sizeof(wait))) { - ret = -EFAULT; - break; - } - ret = api_wait_notification(client, wait.sid, wait.timeout); - break; - } - case MC_IO_MAP: { - struct mc_ioctl_map map; - - if (copy_from_user(&map, uarg, sizeof(map))) { - ret = -EFAULT; - break; - } - ret = api_map_wsms(client, map.sid, map.bufs); - if (ret) - break; - - /* Fill in return struct */ - if (copy_to_user(uarg, &map, sizeof(map))) { - ret = -EFAULT; - api_unmap_wsms(client, map.sid, map.bufs); - break; - } - break; - } - case MC_IO_UNMAP: { - struct mc_ioctl_map map; - - if (copy_from_user(&map, uarg, sizeof(map))) { - ret = -EFAULT; - break; - } - - ret = api_unmap_wsms(client, map.sid, map.bufs); - break; - } - case MC_IO_ERR: { - struct mc_ioctl_geterr *uerr = (struct mc_ioctl_geterr *)uarg; - uint32_t sid; - int32_t exit_code; - - if (get_user(sid, &uerr->sid)) { - ret = -EFAULT; - break; - } - - ret = api_get_session_exitcode(client, sid, &exit_code); - if (ret) - break; - - /* Fill in return struct */ - if (put_user(exit_code, &uerr->value)) { - ret = -EFAULT; - break; - } - - break; - } - case MC_IO_VERSION: { - struct mc_version_info version_info; - - ret = mcp_get_version(&version_info); - if (ret) - break; - - if (copy_to_user(uarg, &version_info, sizeof(version_info))) - ret = -EFAULT; - - break; - } - case MC_IO_DR_VERSION: { - uint32_t version = MC_VERSION(MCDRVMODULEAPI_VERSION_MAJOR, - MCDRVMODULEAPI_VERSION_MINOR); - - ret = put_user(version, uarg); - break; - } - default: - MCDRV_ERROR("unsupported cmd=0x%x", id); - ret = -ENOIOCTLCMD; - } - - return ret; -} - -/* - * Callback for system open() - * A set of internal client data are created and initialized. - * - * @inode - * @file - * Returns 0 if OK or -ENOMEM if no allocation was possible. - */ -static int mc_fd_user_open(struct inode *inode, struct file *file) -{ - struct tbase_client *client; - - MCDRV_DBG("from %s", current->comm); - - /* Create client */ - client = api_open_device(false); - if (!client) - return -ENOMEM; - - /* Store client in user file */ - file->private_data = client; - return 0; -} - -/* - * Callback for system close() - * The client object is freed. - * @inode - * @file - * Returns 0 - */ -static int mc_fd_user_release(struct inode *inode, struct file *file) -{ - struct tbase_client *client = get_client(file); - - MCDRV_DBG("from %s", current->comm); - - if (WARN(!client, "No client data available")) - return -EPROTO; - - /* Detach client from user file */ - file->private_data = NULL; - - /* Destroy client, including remaining sessions */ - api_close_device(client); - return 0; -} - -static const struct file_operations mc_user_fops = { - .owner = THIS_MODULE, - .open = mc_fd_user_open, - .release = mc_fd_user_release, - .unlocked_ioctl = mc_fd_user_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = mc_fd_user_ioctl, -#endif - .mmap = mc_fd_user_mmap, -}; - -int kasnprintf(struct kasnprintf_buf *buf, const char *fmt, ...) -{ - va_list args; - int max_size = buf->size - buf->off; - int i; - - va_start(args, fmt); - i = vsnprintf(buf->buf + buf->off, max_size, fmt, args); - if (i >= max_size) { - int new_size = PAGE_ALIGN(buf->size + i + 1); - char *new_buf = krealloc(buf->buf, new_size, buf->gfp); - - if (!new_buf) { - i = -ENOMEM; - } else { - buf->buf = new_buf; - buf->size = new_size; - max_size = buf->size - buf->off; - i = vsnprintf(buf->buf + buf->off, max_size, fmt, args); - } - } - - if (i > 0) - buf->off += i; - - va_end(args); - return i; -} - -static ssize_t debug_info_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - /* Add/update buffer */ - if (!file->private_data || !*ppos) { - struct kasnprintf_buf *buf, *old_buf; - int ret; - - buf = kzalloc(GFP_KERNEL, sizeof(*buf)); - if (!buf) - return -ENOMEM; - - buf->gfp = GFP_KERNEL; - ret = api_info(buf); - if (ret < 0) { - kfree(buf); - return ret; - } - - old_buf = file->private_data; - file->private_data = buf; - kfree(old_buf); - } - - if (file->private_data) { - struct kasnprintf_buf *buf = file->private_data; - - return simple_read_from_buffer(user_buf, count, ppos, buf->buf, - buf->off); - } - - return 0; -} - -static int debug_info_release(struct inode *inode, struct file *file) -{ - kfree(file->private_data); - return 0; -} - -static const struct file_operations mc_debug_info_ops = { - .read = debug_info_read, - .llseek = default_llseek, - .release = debug_info_release, -}; - -static inline int device_admin_init(int (*tee_start_cb)(void)) -{ - int ret = 0; - - cdev_init(&mc_user_cdev, &mc_user_fops); - - mc_device_class = class_create(THIS_MODULE, "trustonic_tee"); - if (IS_ERR(mc_device_class)) { - MCDRV_ERROR("failed to create device class"); - return PTR_ERR(mc_device_class); - } - - /* Create the ADMIN node */ - ret = mc_admin_init(mc_device_class, &mc_dev_admin, tee_start_cb); - if (ret < 0) { - MCDRV_ERROR("failed to init mobicore device"); - class_destroy(mc_device_class); - return ret; - } - return 0; -} - -static inline int device_user_init(void) -{ - int ret = 0; - struct device *dev; - - mc_dev_user = MKDEV(MAJOR(mc_dev_admin), 1); - /* Create the user node */ - ret = cdev_add(&mc_user_cdev, mc_dev_user, 1); - if (ret) { - MCDRV_ERROR("user device register failed"); - goto err_cdev_add; - } - mc_user_cdev.owner = THIS_MODULE; - dev = device_create(mc_device_class, NULL, mc_dev_user, NULL, - MC_USER_DEVNODE); - if (IS_ERR(dev)) { - ret = PTR_ERR(dev); - goto err_device_create; - } - - /* Create debugfs info entry */ - debugfs_create_file("info", 0400, g_ctx.debug_dir, NULL, - &mc_debug_info_ops); - - return 0; - -err_device_create: - cdev_del(&mc_user_cdev); -err_cdev_add: - mc_admin_exit(mc_device_class); - class_destroy(mc_device_class); - MCDRV_DBG("failed with %d", ret); - return ret; -} - -static void devices_exit(void) -{ - device_destroy(mc_device_class, mc_dev_user); - cdev_del(&mc_user_cdev); - mc_admin_exit(mc_device_class); - class_destroy(mc_device_class); -} - -static inline int mobicore_start(void) -{ - int ret; - struct mc_version_info version_info; - - ret = mcp_start(); - if (ret) { - MCDRV_ERROR("TEE start failed"); - goto err_mcp; - } - - ret = mc_logging_start(); - if (ret) { - MCDRV_ERROR("Log start failed"); - goto err_log; - } - - ret = mc_scheduler_start(); - if (ret) { - MCDRV_ERROR("Scheduler start failed"); - goto err_sched; - } - - ret = mc_pm_start(); - if (ret) { - MCDRV_ERROR("Power Management start failed"); - goto err_pm; - } - - ret = mcp_get_version(&version_info); - if (ret) - goto err_mcp_cmd; - - MCDRV_DBG("\n" - " product_id = %s\n" - " version_so = 0x%x\n" - " version_mci = 0x%x\n" - " version_mclf = 0x%x\n" - " version_container = 0x%x\n" - " version_mc_config = 0x%x\n" - " version_tl_api = 0x%x\n" - " version_dr_api = 0x%x\n" - " version_cmp = 0x%x\n", - version_info.product_id, - version_info.version_mci, - version_info.version_so, - version_info.version_mclf, - version_info.version_container, - version_info.version_mc_config, - version_info.version_tl_api, - version_info.version_dr_api, - version_info.version_cmp); - - if (MC_VERSION_MAJOR(version_info.version_mci) > 1) { - pr_err("MCI version %d.%d is too recent for this driver", - MC_VERSION_MAJOR(version_info.version_mci), - MC_VERSION_MINOR(version_info.version_mci)); - goto err_version; - } - - if ((MC_VERSION_MAJOR(version_info.version_mci) == 0) && - (MC_VERSION_MINOR(version_info.version_mci) < 6)) { - pr_err("MCI version %d.%d is too old for this driver", - MC_VERSION_MAJOR(version_info.version_mci), - MC_VERSION_MINOR(version_info.version_mci)); - goto err_version; - } - - dev_info(g_ctx.mcd, "MobiCore MCI version is %d.%d\n", - MC_VERSION_MAJOR(version_info.version_mci), - MC_VERSION_MINOR(version_info.version_mci)); - - /* Determine which features are supported */ - switch (version_info.version_mci) { - case MC_VERSION(1, 2): /* 310 */ - g_ctx.f_client_login = true; - /* Fall through */ - case MC_VERSION(1, 1): - g_ctx.f_multimap = true; - /* Fall through */ - case MC_VERSION(1, 0): /* 302 */ - g_ctx.f_mem_ext = true; - g_ctx.f_ta_auth = true; - /* Fall through */ - case MC_VERSION(0, 7): - g_ctx.f_timeout = true; - /* Fall through */ - case MC_VERSION(0, 6): /* 301 */ - break; - } - - ret = device_user_init(); - if (ret) - goto err_create_dev_user; - - return 0; - -err_create_dev_user: -err_version: -err_mcp_cmd: - mc_pm_stop(); -err_pm: - mc_scheduler_stop(); -err_sched: - mc_logging_stop(); -err_log: - mcp_stop(); -err_mcp: - return ret; -} - -static inline void mobicore_stop(void) -{ - mc_pm_stop(); - mc_scheduler_stop(); - mc_logging_stop(); - mcp_stop(); -} - -/* - * This function is called by the kernel during startup or by a insmod command. - * This device is installed and registered as cdev, then interrupt and - * queue handling is set up - */ -static int mobicore_init(void) -{ - int err = 0; - - dev_set_name(g_ctx.mcd, "TEE"); - - /* Do not remove or change the following trace. - * The string "MobiCore" is used to detect if Cannot continue! */ - if (!has_security_extensions()) { - MCDRV_ERROR("Hardware doesn't support ARM TrustZone!"); - return -ENODEV; - } - - /* Running in secure mode -> Cannot load the driver! */ - if (is_secure_mode()) { - MCDRV_ERROR("Running in secure MODE!"); - return -ENODEV; - } - - /* Init common API layer */ - api_init(); - - /* Init plenty of nice features */ - err = mc_fastcall_init(); - if (err) { - MCDRV_ERROR("Fastcall support init failed!"); - goto fail_fastcall_init; - } - - err = mcp_init(); - if (err) { - MCDRV_ERROR("MCP init failed!"); - goto fail_mcp_init; - } - - err = mc_logging_init(); - if (err) { - MCDRV_ERROR("Log init failed!"); - goto fail_log_init; - } - - /* The scheduler is the first to create a debugfs entry */ - g_ctx.debug_dir = debugfs_create_dir("trustonic_tee", NULL); - err = mc_scheduler_init(); - if (err) { - MCDRV_ERROR("Scheduler init failed!"); - goto fail_mc_device_sched_init; - } - - /* - * Create admin dev so that daemon can already communicate with - * the driver - */ - err = device_admin_init(mobicore_start); - if (err) - goto fail_creat_dev_admin; - - return 0; - -fail_creat_dev_admin: - mc_scheduler_exit(); -fail_mc_device_sched_init: - debugfs_remove(g_ctx.debug_dir); - mc_logging_exit(); -fail_log_init: - mcp_exit(); -fail_mcp_init: - mc_fastcall_exit(); -fail_fastcall_init: - return err; -} - -/* - * This function removes this device driver from the Linux device manager . - */ -static void mobicore_exit(void) -{ - MCDRV_DBG("enter"); - - devices_exit(); - mobicore_stop(); - mc_scheduler_exit(); - mc_logging_exit(); - mcp_exit(); - mc_fastcall_exit(); - debugfs_remove_recursive(g_ctx.debug_dir); - - MCDRV_DBG("exit"); -} - -/* Linux Driver Module Macros */ - -#ifdef MC_DEVICE_PROPNAME - -static int mobicore_probe(struct platform_device *pdev) -{ - g_ctx.mcd->of_node = pdev->dev.of_node; - mobicore_init(); - return 0; -} - -static const struct of_device_id of_match_table[] = { - { .compatible = MC_DEVICE_PROPNAME }, - { } -}; - -static struct platform_driver mc_plat_driver = { - .probe = mobicore_probe, - .driver = { - .name = "mcd", - .owner = THIS_MODULE, - .of_match_table = of_match_table, - } -}; - -static int mobicore_register(void) -{ - return platform_driver_register(&mc_plat_driver); -} - -static void mobicore_unregister(void) -{ - platform_driver_unregister(&mc_plat_driver); - mobicore_exit(); -} - -module_init(mobicore_register); -module_exit(mobicore_unregister); - -#else /* MC_DEVICE_PROPNAME */ - -module_init(mobicore_init); -module_exit(mobicore_exit); - -#endif /* !MC_DEVICE_PROPNAME */ - -MODULE_AUTHOR("Trustonic Limited"); -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("MobiCore driver"); diff --git a/drivers/gud/MobiCoreDriver/main.h b/drivers/gud/MobiCoreDriver/main.h deleted file mode 100644 index cadc3d766147a..0000000000000 --- a/drivers/gud/MobiCoreDriver/main.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MC_MAIN_H_ -#define _MC_MAIN_H_ - -#include /* gfp_t */ - -#define MC_VERSION(major, minor) \ - (((major & 0x0000ffff) << 16) | (minor & 0x0000ffff)) -#define MC_VERSION_MAJOR(x) ((x) >> 16) -#define MC_VERSION_MINOR(x) ((x) & 0xffff) - -/* MobiCore Driver Kernel Module context data. */ -struct mc_device_ctx { - struct device *mcd; - /* debugfs root */ - struct dentry *debug_dir; - - /* GP sessions waiting final close notif */ - struct list_head closing_sess; - struct mutex closing_lock; /* Closing sessions list */ - - /* Features */ - /* - SWd can set a time out to get scheduled at a future time */ - bool f_timeout; - /* - SWd supports memory extension which allows for bigger TAs */ - bool f_mem_ext; - /* - SWd supports TA authorisation */ - bool f_ta_auth; - /* - SWd can map several buffers at once */ - bool f_multimap; - /* - SWd supports GP client authentication */ - bool f_client_login; -}; - -extern struct mc_device_ctx g_ctx; - -struct kasnprintf_buf { - gfp_t gfp; - void *buf; - int size; - int off; -}; - -extern __printf(2, 3) -int kasnprintf(struct kasnprintf_buf *buf, const char *fmt, ...); - -#endif /* _MC_MAIN_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mci/mcifc.h b/drivers/gud/MobiCoreDriver/mci/mcifc.h deleted file mode 100644 index 4848c9e047fba..0000000000000 --- a/drivers/gud/MobiCoreDriver/mci/mcifc.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef MCIFC_H_ -#define MCIFC_H_ - -#include "platform.h" - -/** @name MobiCore FastCall Defines - * Defines for the two different FastCall's. - */ -/** @{ */ - -#include "platform.h" - -/* --- global ---- */ -#define MC_FC_INVALID ((uint32_t)0) /**< Invalid FastCall ID */ - -#if defined(CONFIG_ARM64) && !defined(MC_ARMV7_FC) - -/* These should be handled as 64-bit FCs; now they are more like 32bits... */ -#define MC_FC_STD64_BASE ((uint32_t)0xFF000000) -#define MC_FC_STD64(x) ((uint32_t)(MC_FC_STD64_BASE + (x))) - -#define MC_FC_INIT MC_FC_STD64(1) /**< Initializing FastCall. */ -#define MC_FC_INFO MC_FC_STD64(2) /**< Info FastCall. */ -#define MC_FC_MEM_TRACE MC_FC_STD64(10) /**< Enable SWd tracing via memory */ -#define MC_FC_SWAP_CPU MC_FC_STD64(54) /**< Change new active Core */ - -#else - -#define MC_FC_INIT ((uint32_t)(-1)) /**< Initializing FastCall. */ -#define MC_FC_INFO ((uint32_t)(-2)) /**< Info FastCall. */ -#define MC_FC_MEM_TRACE ((uint32_t)(-31)) /**< Enable SWd tracing via memory */ -#define MC_FC_SWAP_CPU ((uint32_t)(0x84000005)) /**< Change new active Core */ - -#endif - -/** @} */ - -/** @name MobiCore SMC Defines - * Defines the different secure monitor calls (SMC) for world switching. - * @{ */ -/**< Yield to switch from NWd to SWd. */ -#define MC_SMC_N_YIELD 3 -/**< SIQ to switch from NWd to SWd. */ -#define MC_SMC_N_SIQ 4 -/** @} */ - -/** @name MobiCore status - * MobiCore status information. - * @{ */ -/**< MobiCore is not yet initialized. FastCall FcInit() to set up MobiCore.*/ -#define MC_STATUS_NOT_INITIALIZED 0 -/**< Bad parameters have been passed in FcInit(). */ -#define MC_STATUS_BAD_INIT 1 -/**< MobiCore did initialize properly. */ -#define MC_STATUS_INITIALIZED 2 -/**< MobiCore kernel halted due to an unrecoverable exception. Further - * information is available extended info */ -#define MC_STATUS_HALT 3 -/** @} */ - -/** @name Extended Info Identifiers - * Extended info parameters for MC_FC_INFO to obtain further information depending on MobiCore state. - * @{ */ -/**< Version of the MobiCore Control Interface (MCI) */ -#define MC_EXT_INFO_ID_MCI_VERSION 0 -/**< MobiCore control flags */ -#define MC_EXT_INFO_ID_FLAGS 1 -/**< MobiCore halt condition code */ -#define MC_EXT_INFO_ID_HALT_CODE 2 -/**< MobiCore halt condition instruction pointer */ -#define MC_EXT_INFO_ID_HALT_IP 3 -/**< MobiCore fault counter */ -#define MC_EXT_INFO_ID_FAULT_CNT 4 -/**< MobiCore last fault cause */ -#define MC_EXT_INFO_ID_FAULT_CAUSE 5 -/**< MobiCore last fault meta */ -#define MC_EXT_INFO_ID_FAULT_META 6 -/**< MobiCore last fault threadid */ -#define MC_EXT_INFO_ID_FAULT_THREAD 7 -/**< MobiCore last fault instruction pointer */ -#define MC_EXT_INFO_ID_FAULT_IP 8 -/**< MobiCore last fault stack pointer */ -#define MC_EXT_INFO_ID_FAULT_SP 9 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_DFSR 10 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_ADFSR 11 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_DFAR 12 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_IFSR 13 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_AIFSR 14 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_IFAR 15 -/**< MobiCore configured by Daemon via fc_init flag */ -#define MC_EXT_INFO_ID_MC_CONFIGURED 16 -/**< MobiCore scheduling status: idle/non-idle */ -#define MC_EXT_INFO_ID_MC_SCHED_STATUS 17 -/**< MobiCore runtime status: initialized, halted */ -#define MC_EXT_INFO_ID_MC_STATUS 18 -/**< MobiCore exception handler last partner */ -#define MC_EXT_INFO_ID_MC_EXC_PARTNER 19 -/**< MobiCore exception handler last peer */ -#define MC_EXT_INFO_ID_MC_EXC_IPCPEER 20 -/**< MobiCore exception handler last IPC message */ -#define MC_EXT_INFO_ID_MC_EXC_IPCMSG 21 -/**< MobiCore exception handler last IPC data */ -#define MC_EXT_INFO_ID_MC_EXC_IPCDATA 22 -/**< MobiCore exception handler last UUID (uses 4 slots: 23 to 26) */ -#define MC_EXT_INFO_ID_MC_EXC_UUID 23 -#define MC_EXT_INFO_ID_MC_EXC_UUID1 24 -#define MC_EXT_INFO_ID_MC_EXC_UUID2 25 -#define MC_EXT_INFO_ID_MC_EXC_UUID3 26 - -/** @} */ - -/** @name FastCall return values - * Return values of the MobiCore FastCalls. - * @{ */ -/**< No error. Everything worked fine. */ -#define MC_FC_RET_OK 0 -/**< FastCall was not successful. */ -#define MC_FC_RET_ERR_INVALID 1 -/**< MobiCore has already been initialized. */ -#define MC_FC_RET_ERR_ALREADY_INITIALIZED 5 -/** @} */ - -#endif /** MCIFC_H_ */ - -/** @} */ diff --git a/drivers/gud/MobiCoreDriver/mci/mcimcp.h b/drivers/gud/MobiCoreDriver/mci/mcimcp.h deleted file mode 100644 index 3eb2efea2c30c..0000000000000 --- a/drivers/gud/MobiCoreDriver/mci/mcimcp.h +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef MCP_H_ -#define MCP_H_ - -#include "mci/mcloadformat.h" - -/** Indicates a response */ -#define FLAG_RESPONSE BIT(31) - -/** Maximum number of buffers that can be mapped at once */ -#define MCP_MAP_MAX_BUF 4 - -/** MobiCore Return Code Defines. - * List of the possible MobiCore return codes. - */ -enum mcp_result { - /** Memory has successfully been mapped */ - MC_MCP_RET_OK = 0, - /** The session ID is invalid */ - MC_MCP_RET_ERR_INVALID_SESSION = 1, - /** The UUID of the Trustlet is unknown */ - MC_MCP_RET_ERR_UNKNOWN_UUID = 2, - /** The ID of the driver is unknown */ - MC_MCP_RET_ERR_UNKNOWN_DRIVER_ID = 3, - /** No more session are allowed */ - MC_MCP_RET_ERR_NO_MORE_SESSIONS = 4, - /** The container is invalid */ - MC_MCP_RET_ERR_CONTAINER_INVALID = 5, - /** The Trustlet is invalid */ - MC_MCP_RET_ERR_TRUSTLET_INVALID = 6, - /** The memory block has already been mapped before */ - MC_MCP_RET_ERR_ALREADY_MAPPED = 7, - /** Alignment or length error in the command parameters */ - MC_MCP_RET_ERR_INVALID_PARAM = 8, - /** No space left in the virtual address space of the session */ - MC_MCP_RET_ERR_OUT_OF_RESOURCES = 9, - /** WSM type unknown or broken WSM */ - MC_MCP_RET_ERR_INVALID_WSM = 10, - /** unknown error */ - MC_MCP_RET_ERR_UNKNOWN = 11, - /** Length of map invalid */ - MC_MCP_RET_ERR_INVALID_MAPPING_LENGTH = 12, - /** Map can only be applied to Trustlet session */ - MC_MCP_RET_ERR_MAPPING_TARGET = 13, - /** Couldn't open crypto session */ - MC_MCP_RET_ERR_OUT_OF_CRYPTO_RESOURCES = 14, - /** System Trustlet signature verification failed */ - MC_MCP_RET_ERR_SIGNATURE_VERIFICATION_FAILED = 15, - /** System Trustlet public key is wrong */ - MC_MCP_RET_ERR_WRONG_PUBLIC_KEY = 16, - /** Wrong containter type(s) */ - MC_MCP_RET_ERR_CONTAINER_TYPE_MISMATCH = 17, - /** Container is locked (or not activated) */ - MC_MCP_RET_ERR_CONTAINER_LOCKED = 18, - /** SPID is not registered with root container */ - MC_MCP_RET_ERR_SP_NO_CHILD = 19, - /** UUID is not registered with sp container */ - MC_MCP_RET_ERR_TL_NO_CHILD = 20, - /** Unwrapping of root container failed */ - MC_MCP_RET_ERR_UNWRAP_ROOT_FAILED = 21, - /** Unwrapping of service provider container failed */ - MC_MCP_RET_ERR_UNWRAP_SP_FAILED = 22, - /** Unwrapping of Trustlet container failed */ - MC_MCP_RET_ERR_UNWRAP_TRUSTLET_FAILED = 23, - /** Container version mismatch */ - MC_MCP_RET_ERR_CONTAINER_VERSION_MISMATCH = 24, - /** Decryption of service provider trustlet failed */ - MC_MCP_RET_ERR_SP_TL_DECRYPTION_FAILED = 25, - /** Hash check of service provider trustlet failed */ - MC_MCP_RET_ERR_SP_TL_HASH_CHECK_FAILED = 26, - /** Activation/starting of task failed */ - MC_MCP_RET_ERR_LAUNCH_TASK_FAILED = 27, - /** Closing of task not yet possible, try again later */ - MC_MCP_RET_ERR_CLOSE_TASK_FAILED = 28, - /**< Service is blocked and a session cannot be opened to it */ - MC_MCP_RET_ERR_SERVICE_BLOCKED = 29, - /**< Service is locked and a session cannot be opened to it */ - MC_MCP_RET_ERR_SERVICE_LOCKED = 30, - /**< Service was forcefully killed (due to an administrative command) */ - MC_MCP_RET_ERR_SERVICE_KILLED = 31, - /** The command is unknown */ - MC_MCP_RET_ERR_UNKNOWN_COMMAND = 50, - /** The command data is invalid */ - MC_MCP_RET_ERR_INVALID_DATA = 51 -}; - -/** Possible MCP Command IDs - * Command ID must be between 0 and 0x7FFFFFFF. - */ -enum cmd_id { - /** Invalid command ID */ - MC_MCP_CMD_ID_INVALID = 0x00, - /** Open a session */ - MC_MCP_CMD_OPEN_SESSION = 0x01, - /** Close an existing session */ - MC_MCP_CMD_CLOSE_SESSION = 0x03, - /** Map WSM to session */ - MC_MCP_CMD_MAP = 0x04, - /** Unmap WSM from session */ - MC_MCP_CMD_UNMAP = 0x05, - /** Prepare for suspend */ - MC_MCP_CMD_SUSPEND = 0x06, - /** Resume from suspension */ - MC_MCP_CMD_RESUME = 0x07, - /** Get MobiCore version information */ - MC_MCP_CMD_GET_MOBICORE_VERSION = 0x09, - /** Close MCP and unmap MCI */ - MC_MCP_CMD_CLOSE_MCP = 0x0A, - /** Load token for device attestation */ - MC_MCP_CMD_LOAD_TOKEN = 0x0B, - /** Check that TA can be loaded */ - MC_MCP_CMD_CHECK_LOAD_TA = 0x0C, - /** Map multiple WSMs to session */ - MC_MCP_CMD_MULTIMAP = 0x0D, - /** Unmap multiple WSMs to session */ - MC_MCP_CMD_MULTIUNMAP = 0x0E, -}; - -/* - * Types of WSM known to the MobiCore. - */ -#define WSM_TYPE_MASK 0xFF -#define WSM_INVALID 0 /** Invalid memory type */ -#define WSM_L2 2 /** Buffer mapping uses L2/L3 table */ -#define WSM_L1 3 /** Buffer mapping uses fake L1 table */ - -/** Magic number used to identify if Open Command supports GP client - * authentication. - */ -#define MC_GP_CLIENT_AUTH_MAGIC 0x47504131 /* "GPA1" */ - -/** Command header. - * It just contains the command ID. Only values specified in cmd_id are - * allowed as command IDs. If the command ID is unspecified the MobiCore - * returns an empty response with the result set to - * MC_MCP_RET_ERR_UNKNOWN_COMMAND. - */ -struct cmd_header { - enum cmd_id cmd_id; /** Command ID of the command */ -}; - -/** Response header. - * MobiCore will reply to every MCP command with an MCP response. Like the MCP - * command the response consists of a header followed by response data. The - * response is written to the same memory location as the MCP command. - */ -struct rsp_header { - uint32_t rsp_id; /** Command ID | FLAG_RESPONSE */ - enum mcp_result result; /** Result of the command execution */ -}; - -/** @defgroup CMD MCP Commands - */ - -/** @defgroup ASMCMD Administrative Commands - */ - -/** @defgroup MCPGETMOBICOREVERSION GET_MOBICORE_VERSION - * Get MobiCore version info. - * - */ - -/** Get MobiCore Version Command */ -struct cmd_get_version { - struct cmd_header cmd_header; /** Command header */ -}; - -/** Get MobiCore Version Command Response */ -struct rsp_get_version { - struct rsp_header rsp_header; /** Response header */ - struct mc_version_info version_info; /** MobiCore version info */ -}; - -/** @defgroup POWERCMD Power Management Commands - */ - -/** @defgroup MCPSUSPEND SUSPEND - * Prepare MobiCore suspension. - * This command allows MobiCore and MobiCore drivers to release or clean - * resources and save device state. - * - */ - -/** Suspend Command */ -struct cmd_suspend { - struct cmd_header cmd_header; /** Command header */ -}; - -/** Suspend Command Response */ -struct rsp_suspend { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPRESUME RESUME - * Resume MobiCore from suspension. - * This command allows MobiCore and MobiCore drivers to reinitialize hardware - * affected by suspension. - * - */ - -/** Resume Command */ -struct cmd_resume { - struct cmd_header cmd_header; /** Command header */ -}; - -/** Resume Command Response */ -struct rsp_resume { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup SESSCMD Session Management Commands - */ - -/** @defgroup MCPOPEN OPEN - * Load and open a session to a Trustlet. - * The OPEN command loads Trustlet data to the MobiCore context and opens a - * session to the Trustlet. If wsm_data_type is WSM_INVALID MobiCore tries to - * start a pre-installed Trustlet associated with the uuid passed. The uuid - * passed must match the uuid contained in the load data (if available). - * On success, MobiCore returns the session ID which can be used for further - * communication. - */ - -/** GP client authentication data */ -struct cmd_open_data { - uint32_t mclf_magic; /** ASCII "MCLF" on older versions */ - struct identity identity; /** Login method and data */ -}; - -/** Open Command */ -struct cmd_open { - struct cmd_header cmd_header; /** Command header */ - struct mc_uuid_t uuid; /** Service UUID */ - uint8_t unused[4]; /** Padding to be 64-bit aligned */ - uint64_t adr_tci_buffer; /** Physical address of the TCI MMU */ - uint64_t adr_load_data; /** Physical address of the data MMU */ - uint32_t ofs_tci_buffer; /** Offset to the data */ - uint32_t len_tci_buffer; /** Length of the TCI */ - uint32_t wsmtype_tci; /** Type of WSM used for the TCI */ - uint32_t wsm_data_type; /** Type of MMU */ - uint32_t ofs_load_data; /** Offset to the data */ - uint32_t len_load_data; /** Length of the data to load */ - union { - struct cmd_open_data cmd_open_data; /** Client login data */ - union mclf_header tl_header; /** Service header */ - }; - uint32_t is_gpta; /** true if looking for an SD/GP-TA */ -}; - -/** Open Command Response */ -struct rsp_open { - struct rsp_header rsp_header; /** Response header */ - uint32_t session_id; /** Session ID */ -}; - -/** TA Load Check Command */ -struct cmd_check_load { - struct cmd_header cmd_header; /** Command header */ - struct mc_uuid_t uuid; /** Service UUID */ - uint64_t adr_load_data; /** Physical address of the data */ - uint32_t wsm_data_type; /** Type of MMU */ - uint32_t ofs_load_data; /** Offset to the data */ - uint32_t len_load_data; /** Length of the data to load */ - union mclf_header tl_header; /** Service header */ -}; - -/** TA Load Check Response */ -struct rsp_check_load { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPCLOSE CLOSE - * Close an existing session to a Trustlet. - * The CLOSE command terminates a session and frees all resources in the - * MobiCore system which are currently occupied by the session. Before closing - * the session, the MobiCore runtime management waits until all pending - * operations, like calls to drivers, invoked by the Trustlet have been - * terminated. Mapped memory will automatically be unmapped from the MobiCore - * context. The NWd is responsible for processing the freed memory according to - * the Rich-OS needs. - * - */ - -/** Close Command */ -struct cmd_close { - struct cmd_header cmd_header; /** Command header */ - uint32_t session_id; /** Session ID */ -}; - -/** Close Command Response */ -struct rsp_close { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPMAP MAP - * Map a portion of memory to a session. - * The MAP command provides a block of memory to the context of a service. - * The memory then becomes world-shared memory (WSM). - * The only allowed memory type here is WSM_L2. - */ - -/** Map Command */ -struct cmd_map { - struct cmd_header cmd_header; /** Command header */ - uint32_t session_id; /** Session ID */ - uint32_t wsm_type; /** Type of MMU */ - uint32_t ofs_buffer; /** Offset to the payload */ - uint64_t adr_buffer; /** Physical address of the MMU */ - uint32_t len_buffer; /** Length of the buffer */ -}; - -#define MCP_MAP_MAX 0x100000 /** Maximum length for MCP map */ - -/** Map Command Response */ -struct rsp_map { - struct rsp_header rsp_header; /** Response header */ - /** Virtual address the WSM is mapped to, may include an offset! */ - uint32_t secure_va; -}; - -/** @defgroup MCPUNMAP UNMAP - * Unmap a portion of world-shared memory from a session. - * The UNMAP command is used to unmap a previously mapped block of - * world shared memory from the context of a session. - * - * Attention: The memory block will be immediately unmapped from the specified - * session. If the service is still accessing the memory, the service will - * trigger a segmentation fault. - */ - -/** Unmap Command */ -struct cmd_unmap { - struct cmd_header cmd_header; /** Command header */ - uint32_t session_id; /** Session ID */ - uint32_t wsm_type; /** Type of WSM used of the memory */ - /** Virtual address the WSM is mapped to, may include an offset! */ - uint32_t secure_va; - uint32_t virtual_buffer_len; /** Length of virtual buffer */ -}; - -/** Unmap Command Response */ -struct rsp_unmap { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPLOADTOKEN - * Load a token from the normal world and share it with type of - * function. elementCnt must be a power of two and the power needs - * to be smaller than power of uint32_t (obviously 32). - */ -struct notification_queue { - struct notification_queue_header hdr; /** Queue header */ - struct notification notification[MIN_NQ_ELEM]; /** Elements */ -}; - -#endif /** NQ_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mci/mcloadformat.h b/drivers/gud/MobiCoreDriver/mci/mcloadformat.h deleted file mode 100644 index f12f618bb0dc6..0000000000000 --- a/drivers/gud/MobiCoreDriver/mci/mcloadformat.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef MCLOADFORMAT_H_ -#define MCLOADFORMAT_H_ - -/** Trustlet Blob length info */ -#define MC_TLBLOBLEN_MAGIC 0x7672746C /* Magic for SWd: vrtl */ -#define MAX_SO_CONT_SIZE 512 /* Max size for a container */ - -/** MCLF flags */ -/**< Loaded service cannot be unloaded from MobiCore. */ -#define MC_SERVICE_HEADER_FLAGS_PERMANENT BIT(0) -/**< Service has no WSM control interface. */ -#define MC_SERVICE_HEADER_FLAGS_NO_CONTROL_INTERFACE BIT(1) -/**< Service can be debugged. */ -#define MC_SERVICE_HEADER_FLAGS_DEBUGGABLE BIT(2) -/**< New-layout trusted application or trusted driver. */ -#define MC_SERVICE_HEADER_FLAGS_EXTENDED_LAYOUT BIT(3) - -/** Service type. - * The service type defines the type of executable. - */ -enum service_type { - SERVICE_TYPE_ILLEGAL = 0, - SERVICE_TYPE_DRIVER = 1, - SERVICE_TYPE_SP_TRUSTLET = 2, - SERVICE_TYPE_SYSTEM_TRUSTLET = 3, - SERVICE_TYPE_MIDDLEWARE = 4, - SERVICE_TYPE_LAST_ENTRY = 5, -}; - -/** - * Descriptor for a memory segment. - */ -struct segment_descriptor { - uint32_t start; /**< Virtual start address */ - uint32_t len; /**< Segment length in bytes */ -}; - -/** - * MCLF intro for data structure identification. - * Must be the first element of a valid MCLF file. - */ -struct mclf_intro { - uint32_t magic; /**< Header magic value ASCII "MCLF" */ - uint32_t version; /**< Version the MCLF header struct */ -}; - -/** - * @defgroup MCLF_VER_V2 MCLF Version 32 - * @ingroup MCLF_VER - * - * @addtogroup MCLF_VER_V2 - */ - -/* - * GP TA identity. - */ -struct identity { - /**< GP TA login type */ - uint32_t login_type; - /**< GP TA login data */ - uint8_t login_data[16]; -}; - -/** - * Version 2.1/2.2 MCLF header. - */ -struct mclf_header_v2 { - /**< MCLF header start with the mandatory intro */ - struct mclf_intro intro; - /**< Service flags */ - uint32_t flags; - /**< Type of memory the service must be executed from */ - uint32_t mem_type; - /**< Type of service */ - enum service_type service_type; - /**< Number of instances which can be run simultaneously */ - uint32_t num_instances; - /**< Loadable service unique identifier (UUID) */ - struct mc_uuid_t uuid; - /**< If the service_type is SERVICE_TYPE_DRIVER the Driver ID is used */ - uint32_t driver_id; - /**< - * Number of threads (N) in a service: - * SERVICE_TYPE_SP_TRUSTLET: N = 1 - * SERVICE_TYPE_SYSTEM_TRUSTLET: N = 1 - * SERVICE_TYPE_DRIVER: N >= 1 - */ - uint32_t num_threads; - /**< Virtual text segment */ - struct segment_descriptor text; - /**< Virtual data segment */ - struct segment_descriptor data; - /**< Length of the BSS segment in bytes. MUST be at least 8 byte */ - uint32_t bss_len; - /**< Virtual start address of service code */ - uint32_t entry; - /**< Version of the interface the driver exports */ - uint32_t service_version; -}; - -/** - * @addtogroup MCLF - */ - -/** MCLF header */ -union mclf_header { - /**< Intro for data identification */ - struct mclf_intro intro; - /**< Version 2 header */ - struct mclf_header_v2 mclf_header_v2; -}; - -struct mc_blob_len_info { - uint32_t magic; /**< New blob format magic number */ - uint32_t root_size; /**< Root container size */ - uint32_t sp_size; /**< SP container size */ - uint32_t ta_size; /**< TA container size */ - uint32_t reserved[4]; /**< Reserved for further Use */ -}; - -#endif /* MCLOADFORMAT_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mcp.c b/drivers/gud/MobiCoreDriver/mcp.c deleted file mode 100644 index 693fd42e2d4b5..0000000000000 --- a/drivers/gud/MobiCoreDriver/mcp.c +++ /dev/null @@ -1,1067 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "mci/mcimcp.h" -#include "mci/mcifc.h" -#include "mci/mcinq.h" /* SID_MCP */ - -#include "platform.h" /* IRQ number */ -#include "fastcall.h" -#include "debug.h" -#include "logging.h" -#include "mcp.h" - -/* respond timeout for MCP notification, in secs */ -#define MCP_TIMEOUT 10 -#define MCP_RETRIES 5 -#define MCP_NF_QUEUE_SZ 8 -#define NQ_NUM_ELEMS 16 - -static void mc_irq_worker(struct work_struct *data); -DECLARE_WORK(irq_work, mc_irq_worker); - -static const struct { - unsigned int index; - const char *msg; -} status_map[] = { - /**< MobiCore control flags */ - { MC_EXT_INFO_ID_FLAGS, "flags"}, - /**< MobiCore halt condition code */ - { MC_EXT_INFO_ID_HALT_CODE, "haltCode"}, - /**< MobiCore halt condition instruction pointer */ - { MC_EXT_INFO_ID_HALT_IP, "haltIp"}, - /**< MobiCore fault counter */ - { MC_EXT_INFO_ID_FAULT_CNT, "faultRec.cnt"}, - /**< MobiCore last fault cause */ - { MC_EXT_INFO_ID_FAULT_CAUSE, "faultRec.cause"}, - /**< MobiCore last fault meta */ - { MC_EXT_INFO_ID_FAULT_META, "faultRec.meta"}, - /**< MobiCore last fault threadid */ - { MC_EXT_INFO_ID_FAULT_THREAD, "faultRec.thread"}, - /**< MobiCore last fault instruction pointer */ - { MC_EXT_INFO_ID_FAULT_IP, "faultRec.ip"}, - /**< MobiCore last fault stack pointer */ - { MC_EXT_INFO_ID_FAULT_SP, "faultRec.sp"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_DFSR, "faultRec.arch.dfsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_ADFSR, "faultRec.arch.adfsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_DFAR, "faultRec.arch.dfar"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_IFSR, "faultRec.arch.ifsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_AIFSR, "faultRec.arch.aifsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_IFAR, "faultRec.arch.ifar"}, - /**< MobiCore configured by Daemon via fc_init flag */ - { MC_EXT_INFO_ID_MC_CONFIGURED, "mcData.flags"}, - /**< MobiCore exception handler last partner */ - { MC_EXT_INFO_ID_MC_EXC_PARTNER, "mcExcep.partner"}, - /**< MobiCore exception handler last peer */ - { MC_EXT_INFO_ID_MC_EXC_IPCPEER, "mcExcep.peer"}, - /**< MobiCore exception handler last IPC message */ - { MC_EXT_INFO_ID_MC_EXC_IPCMSG, "mcExcep.cause"}, - /**< MobiCore exception handler last IPC data */ - {MC_EXT_INFO_ID_MC_EXC_IPCDATA, "mcExcep.meta"}, -}; - -static struct mcp_context { - struct mutex buffer_lock; /* Lock on SWd communication buffer */ - struct mutex queue_lock; /* Lock for MCP messages */ - struct mcp_buffer *mcp_buffer; - struct tbase_session *session; - struct completion complete; - bool mcp_dead; - int irq; - int (*scheduler_cb)(enum mcp_scheduler_commands); - void (*crashhandler_cb)(void); - /* MobiCore MCI information */ - unsigned int order; - union { - void *base; - struct { - struct notification_queue *tx; - struct notification_queue *rx; - } nq; - }; - /* - * This notifications list is to be used to queue notifications when the - * notification queue overflows, so no session gets its notification - * lost, especially MCP. - */ - struct mutex notifications_mutex; - struct list_head notifications; - struct mcp_session mcp_session; /* Pseudo session for MCP */ - /* Unexpected notification (during MCP open) */ - struct mutex unexp_notif_mutex; - struct notification unexp_notif; - /* Sessions */ - struct mutex sessions_lock; - struct list_head sessions; - /* Dump buffer */ - struct kasnprintf_buf dump; -} mcp_ctx; - -static inline void mark_mcp_dead(void) -{ - mcp_ctx.mcp_dead = true; - complete(&mcp_ctx.complete); -} - -static inline int mcp_set_sleep_mode_rq(uint16_t sleep_req) -{ - mutex_lock(&mcp_ctx.buffer_lock); - mcp_ctx.mcp_buffer->mc_flags.sleep_mode.sleep_req = sleep_req; - mutex_unlock(&mcp_ctx.buffer_lock); - return 0; -} - -static ssize_t debug_crashdump_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - if (mcp_ctx.dump.off) - return simple_read_from_buffer(user_buf, count, ppos, - mcp_ctx.dump.buf, - mcp_ctx.dump.off); - - return 0; -} - -static const struct file_operations mc_debug_crashdump_ops = { - .read = debug_crashdump_read, - .llseek = default_llseek, -}; - -static void mcp_dump_mobicore_status(void) -{ - char uuid_str[33]; - int ret = 0; - int i; - - if (mcp_ctx.dump.off) - ret = -EBUSY; - - /* read additional info about exception-point and print */ - dev_err(g_ctx.mcd, "= 0) - ret = kasnprintf(&mcp_ctx.dump, - "%-20s= 0x%08x\n", - status_map[i].msg, info); - } - } - - /* construct UUID string */ - for (i = 0; i < 4; i++) { - uint32_t info; - int j; - - if (mc_fc_info(MC_EXT_INFO_ID_MC_EXC_UUID + i, NULL, &info)) - return; - - for (j = 0; j < sizeof(info); j++) { - snprintf(&uuid_str[(i * sizeof(info) + j) * 2], 3, - "%02x", (info >> (j * 8)) & 0xff); - } - } - - dev_err(g_ctx.mcd, " %-20s= 0x%s\n", "mcExcep.uuid", uuid_str); - if (ret >= 0) - ret = kasnprintf(&mcp_ctx.dump, "%-20s= 0x%s\n", "mcExcep.uuid", - uuid_str); - - if (ret < 0) { - kfree(mcp_ctx.dump.buf); - mcp_ctx.dump.off = 0; - return; - } - - debugfs_create_file("crashdump", 0400, g_ctx.debug_dir, NULL, - &mc_debug_crashdump_ops); - if (mcp_ctx.crashhandler_cb) - mcp_ctx.crashhandler_cb(); -} - -void mcp_session_init(struct mcp_session *session, bool is_gp, - const struct identity *identity) -{ - /* close_work is initialized by the caller */ - INIT_LIST_HEAD(&session->list); - INIT_LIST_HEAD(&session->notifications_list); - mutex_init(&session->notif_wait_lock); - init_completion(&session->completion); - mutex_init(&session->exit_code_lock); - session->state = MCP_SESSION_RUNNING; - session->is_gp = is_gp; - if (is_gp) - session->identity = *identity; -} - -static inline bool mcp_session_isrunning(struct mcp_session *session) -{ - bool ret; - - mutex_lock(&mcp_ctx.sessions_lock); - ret = session->state == MCP_SESSION_RUNNING; - mutex_unlock(&mcp_ctx.sessions_lock); - return ret; -} - -/* - * session remains valid thanks to the upper layers reference counters, but the - * SWd session may have died, in which case we are informed. - */ -int mcp_session_waitnotif(struct mcp_session *session, int32_t timeout) -{ - int ret = 0; - - mutex_lock(&session->notif_wait_lock); - if (!mcp_session_isrunning(session)) { - ret = -ENXIO; - goto end; - } - - if (mcp_session_exitcode(session)) { - ret = -ECOMM; - goto end; - } - - if (timeout < 0) { - ret = wait_for_completion_interruptible(&session->completion); - if (ret) - goto end; - } else { - ret = wait_for_completion_interruptible_timeout( - &session->completion, timeout * HZ / 1000); - if (ret < 0) - /* Interrupted */ - goto end; - - if (!ret) { - /* Timed out */ - ret = -ETIME; - goto end; - } - - ret = 0; - } - - if (mcp_session_exitcode(session)) { - ret = -ECOMM; - goto end; - } - - if (!mcp_session_isrunning(session)) { - ret = -ENXIO; - goto end; - } - -end: - mutex_unlock(&session->notif_wait_lock); - if (ret) - dev_info(g_ctx.mcd, "%s session %x ec %d ret %d\n", __func__, - session->id, session->exit_code, ret); - - return ret; -} - -int32_t mcp_session_exitcode(struct mcp_session *session) -{ - int32_t exit_code; - - mutex_lock(&session->exit_code_lock); - exit_code = session->exit_code; - mutex_unlock(&session->exit_code_lock); - if (exit_code) - dev_info(g_ctx.mcd, "%s session %x ec %d\n", __func__, - session->id, exit_code); - - return exit_code; -} - -int mcp_suspend(void) -{ - return mcp_set_sleep_mode_rq(MC_FLAG_REQ_TO_SLEEP); -} - -int mcp_resume(void) -{ - return mcp_set_sleep_mode_rq(MC_FLAG_NO_SLEEP_REQ); -} - -bool mcp_suspended(void) -{ - struct mcp_flags *flags = &mcp_ctx.mcp_buffer->mc_flags; - bool ret; - - mutex_lock(&mcp_ctx.buffer_lock); - ret = flags->sleep_mode.ready_to_sleep & MC_STATE_READY_TO_SLEEP; - if (!ret) { - MCDRV_DBG("IDLE=%d!", flags->schedule); - MCDRV_DBG("Request Sleep=%d!", flags->sleep_mode.sleep_req); - MCDRV_DBG("Sleep Ready=%d!", flags->sleep_mode.ready_to_sleep); - } - - mutex_unlock(&mcp_ctx.buffer_lock); - return ret; -} - -bool mcp_get_idle_timeout(int32_t *timeout) -{ - uint32_t schedule; - bool ret; - - mutex_lock(&mcp_ctx.buffer_lock); - schedule = mcp_ctx.mcp_buffer->mc_flags.schedule; - if (schedule == MC_FLAG_SCHEDULE_IDLE) { - if (g_ctx.f_timeout) - *timeout = mcp_ctx.mcp_buffer->mc_flags.timeout_ms; - else - *timeout = -1; - - ret = true; - } else { - ret = false; - } - - mutex_unlock(&mcp_ctx.buffer_lock); - return ret; -} - -void mcp_reset_idle_timeout(void) -{ - mutex_lock(&mcp_ctx.buffer_lock); - mcp_ctx.mcp_buffer->mc_flags.timeout_ms = -1; - mutex_unlock(&mcp_ctx.buffer_lock); -} - -static inline int wait_mcp_notification(void) -{ - unsigned long timeout = msecs_to_jiffies(MCP_TIMEOUT * 1000); - int try; - - /* - * Total timeout is MCP_TIMEOUT * MCP_RETRIES, but we check for a crash - * to try and terminate before then if things go wrong. - */ - for (try = 1; try <= MCP_RETRIES; try++) { - uint32_t status; - int ret; - - /* - * Wait non-interruptible to keep MCP synchronised even if caller - * is interrupted by signal. - */ - ret = wait_for_completion_timeout(&mcp_ctx.complete, timeout); - if (ret > 0) - return 0; - - MCDRV_ERROR("No answer after %ds", MCP_TIMEOUT * try); - - /* If SWd halted, exit now */ - if (!mc_fc_info(MC_EXT_INFO_ID_MCI_VERSION, &status, NULL) && - (status == MC_STATUS_HALT)) - break; - } - - /* mcp_message; - enum cmd_id cmd_id = cmd->cmd_header.cmd_id; - - mutex_lock(&mcp_ctx.queue_lock); - if (mcp_ctx.mcp_dead) - goto out; - - /* Copy message to MCP buffer */ - memcpy(msg, cmd, sizeof(*msg)); - - /* Poke tbase */ - err = mcp_notify(&mcp_ctx.mcp_session); - if (!err) - err = wait_mcp_notification(); - - if (err) - goto out; - - /* Check response ID */ - if (msg->rsp_header.rsp_id != (cmd_id | FLAG_RESPONSE)) { - MCDRV_ERROR("MCP command got invalid response (0x%X)", - msg->rsp_header.rsp_id); - err = -EBADE; - goto out; - } - - /* Convert result */ - switch (msg->rsp_header.result) { - case MC_MCP_RET_OK: - err = 0; - break; - case MC_MCP_RET_ERR_CLOSE_TASK_FAILED: - case MC_MCP_RET_ERR_NO_MORE_SESSIONS: - err = -EBUSY; - break; - case MC_MCP_RET_ERR_OUT_OF_RESOURCES: - err = -ENOSPC; - break; - case MC_MCP_RET_ERR_UNKNOWN_UUID: - err = -ENOENT; - break; - case MC_MCP_RET_ERR_WRONG_PUBLIC_KEY: - err = -EKEYREJECTED; - break; - case MC_MCP_RET_ERR_SERVICE_BLOCKED: - err = -ECONNREFUSED; - break; - case MC_MCP_RET_ERR_SERVICE_LOCKED: - err = -ECONNABORTED; - break; - case MC_MCP_RET_ERR_SERVICE_KILLED: - err = -ECONNRESET; - break; - default: - MCDRV_ERROR("cmd %d returned %d.", cmd_id, - msg->rsp_header.result); - err = -EPERM; - goto out; - } - - /* Copy response back to caller struct */ - memcpy(cmd, msg, sizeof(*cmd)); - -out: - mutex_unlock(&mcp_ctx.queue_lock); - return err; -} - -int mcp_get_version(struct mc_version_info *version_info) -{ - union mcp_message cmd; - int ret; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_GET_MOBICORE_VERSION; - ret = mcp_cmd(&cmd); - if (!ret) - memcpy(version_info, &cmd.rsp_get_version.version_info, - sizeof(*version_info)); - - return ret; -} - -int mcp_load_token(uintptr_t data, const struct mcp_buffer_map *map) -{ - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_LOAD_TOKEN; - cmd.cmd_load_token.wsm_data_type = map->type; - cmd.cmd_load_token.adr_load_data = map->phys_addr; - cmd.cmd_load_token.ofs_load_data = map->offset; - cmd.cmd_load_token.len_load_data = map->length; - return mcp_cmd(&cmd); -} - -int mcp_load_check(const struct tbase_object *obj, - const struct mcp_buffer_map *map) -{ - const union mclf_header *header; - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_CHECK_LOAD_TA; - /* Data */ - cmd.cmd_check_load.wsm_data_type = map->type; - cmd.cmd_check_load.adr_load_data = map->phys_addr; - cmd.cmd_check_load.ofs_load_data = map->offset; - cmd.cmd_check_load.len_load_data = map->length; - /* Header */ - header = (union mclf_header *)(obj->data + obj->header_length); - cmd.cmd_check_load.uuid = header->mclf_header_v2.uuid; - return mcp_cmd(&cmd); -} - -int mcp_open_session(struct mcp_session *session, - const struct tbase_object *obj, - const struct mcp_buffer_map *map, - const struct mcp_buffer_map *tci_map) -{ - static DEFINE_MUTEX(local_mutex); - const union mclf_header *header; - union mcp_message cmd; - int ret; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_OPEN_SESSION; - /* Data */ - cmd.cmd_open.wsm_data_type = map->type; - cmd.cmd_open.adr_load_data = map->phys_addr; - cmd.cmd_open.ofs_load_data = map->offset; - cmd.cmd_open.len_load_data = map->length; - /* Buffer */ - if (tci_map) { - cmd.cmd_open.wsmtype_tci = tci_map->type; - cmd.cmd_open.adr_tci_buffer = tci_map->phys_addr; - cmd.cmd_open.ofs_tci_buffer = tci_map->offset; - cmd.cmd_open.len_tci_buffer = tci_map->length; - } else { - cmd.cmd_open.wsmtype_tci = WSM_INVALID; - } - /* Header */ - header = (union mclf_header *)(obj->data + obj->header_length); - cmd.cmd_open.uuid = header->mclf_header_v2.uuid; - cmd.cmd_open.is_gpta = session->is_gp; - /* Reset unexpected notification */ - mutex_lock(&local_mutex); - mcp_ctx.unexp_notif.session_id = SID_MCP; /* Cannot be */ - if (!g_ctx.f_client_login) { - memcpy(&cmd.cmd_open.tl_header, header, - sizeof(cmd.cmd_open.tl_header)); - } else { - cmd.cmd_open.cmd_open_data.mclf_magic = MC_GP_CLIENT_AUTH_MAGIC; - if (session->is_gp) - cmd.cmd_open.cmd_open_data.identity = session->identity; - } - - /* Send MCP open command */ - ret = mcp_cmd(&cmd); - if (!ret) { - session->id = cmd.rsp_open.session_id; - /* Add to list of sessions */ - mutex_lock(&mcp_ctx.sessions_lock); - list_add(&session->list, &mcp_ctx.sessions); - mutex_unlock(&mcp_ctx.sessions_lock); - /* Check for spurious notification */ - mutex_lock(&mcp_ctx.unexp_notif_mutex); - if (mcp_ctx.unexp_notif.session_id == session->id) { - mutex_lock(&session->exit_code_lock); - session->exit_code = mcp_ctx.unexp_notif.payload; - mutex_unlock(&session->exit_code_lock); - complete(&session->completion); - } - - mutex_unlock(&mcp_ctx.unexp_notif_mutex); - } - - mutex_unlock(&local_mutex); - return ret; -} - -/* - * Legacy and GP TAs close differently: - * - GP TAs always send a notification with payload, whether on close or crash - * - Legacy TAs only send a notification with payload on crash - * - GP TAs may take time to close, and we get -EBUSY back from mcp_cmd - * - Legacy TAs always close when asked, unless they are driver in which case - * they just don't close at all - */ -int mcp_close_session(struct mcp_session *session) -{ - union mcp_message cmd; - int ret; - - /* state is either MCP_SESSION_RUNNING or MCP_SESSION_CLOSING_GP */ - mutex_lock(&mcp_ctx.sessions_lock); - if (session->state == MCP_SESSION_RUNNING) - session->state = MCP_SESSION_CLOSE_PREPARE; - - mutex_unlock(&mcp_ctx.sessions_lock); - /* Signal an eventual waiter that SWd session is going away */ - complete(&session->completion); - /* Send MCP command */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_CLOSE_SESSION; - cmd.cmd_close.session_id = session->id; - ret = mcp_cmd(&cmd); - mutex_lock(&mcp_ctx.sessions_lock); - /* - * The GP TA may already have sent its exit code, in which case the - * state has also been changed to MCP_SESSION_CLOSE_NOTIFIED. - */ - if (!ret) { - session->state = MCP_SESSION_CLOSED; - list_del(&session->list); - mutex_lock(&mcp_ctx.notifications_mutex); - list_del(&session->notifications_list); - mutex_unlock(&mcp_ctx.notifications_mutex); - } else if (ret == -EBUSY) { - if (session->state == MCP_SESSION_CLOSE_NOTIFIED) - /* GP TA already closed */ - schedule_work(&session->close_work); - - session->state = MCP_SESSION_CLOSING_GP; - } else { - /* Something is not right, assume session is still running */ - session->state = MCP_SESSION_RUNNING; - } - - mutex_unlock(&mcp_ctx.sessions_lock); - return ret; -} - -int mcp_map(uint32_t session_id, struct mcp_buffer_map *map) -{ - union mcp_message cmd; - int ret; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_MAP; - cmd.cmd_map.session_id = session_id; - cmd.cmd_map.wsm_type = map->type; - cmd.cmd_map.adr_buffer = map->phys_addr; - cmd.cmd_map.ofs_buffer = map->offset; - cmd.cmd_map.len_buffer = map->length; - ret = mcp_cmd(&cmd); - if (!ret) - map->secure_va = cmd.rsp_map.secure_va; - - return ret; -} - -int mcp_unmap(uint32_t session_id, const struct mcp_buffer_map *map) -{ - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_UNMAP; - cmd.cmd_unmap.session_id = session_id; - cmd.cmd_unmap.wsm_type = map->type; - cmd.cmd_unmap.virtual_buffer_len = map->length; - cmd.cmd_unmap.secure_va = map->secure_va; - return mcp_cmd(&cmd); -} - -int mcp_multimap(uint32_t session_id, struct mcp_buffer_map *maps) -{ - struct mcp_buffer_map *map = maps; - union mcp_message cmd; - struct buffer_map *buf = cmd.cmd_multimap.bufs; - int ret = 0; - uint32_t i; - - /* Prepare command */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_MULTIMAP; - cmd.cmd_multimap.session_id = session_id; - for (i = 0; i < MC_MAP_MAX; i++, map++, buf++) { - buf->wsm_type = map->type; - buf->adr_buffer = map->phys_addr; - buf->ofs_buffer = map->offset; - buf->len_buffer = map->length; - } - - ret = mcp_cmd(&cmd); - if (ret) - return ret; - - /* Return secure virtual addresses */ - map = maps; - for (i = 0; i < MC_MAP_MAX; i++, map++) - map->secure_va = cmd.rsp_multimap.secure_va[i]; - - return 0; -} - -int mcp_multiunmap(uint32_t session_id, const struct mcp_buffer_map *maps) -{ - const struct mcp_buffer_map *map = maps; - union mcp_message cmd; - struct buffer_unmap *buf = cmd.cmd_multiunmap.bufs; - uint32_t i; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_MULTIUNMAP; - cmd.cmd_multiunmap.session_id = session_id; - for (i = 0; i < MC_MAP_MAX; i++, map++, buf++) { - buf->secure_va = map->secure_va; - buf->len_buffer = map->length; - } - - return mcp_cmd(&cmd); -} - -static int mcp_close(void) -{ - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_CLOSE_MCP; - return mcp_cmd(&cmd); -} - -static inline bool notif_queue_full(void) -{ - struct notification_queue *tx = mcp_ctx.nq.tx; - - return (tx->hdr.write_cnt - tx->hdr.read_cnt) == tx->hdr.queue_size; -} - -static inline void notif_queue_push(uint32_t session_id) -{ - struct notification_queue_header *hdr = &mcp_ctx.nq.tx->hdr; - uint32_t i = hdr->write_cnt % hdr->queue_size; - - mcp_ctx.nq.tx->notification[i].session_id = session_id; - mcp_ctx.nq.tx->notification[i].payload = 0; - hdr->write_cnt++; -} - -static inline bool mcp_notifications_flush_nolock(void) -{ - bool flushed = false; - - while (!list_empty(&mcp_ctx.notifications) && !notif_queue_full()) { - struct mcp_session *session; - - session = list_first_entry(&mcp_ctx.notifications, - struct mcp_session, - notifications_list); - dev_dbg(g_ctx.mcd, "pop %x\n", session->id); - notif_queue_push(session->id); - list_del_init(&session->notifications_list); - flushed = true; - } - - return flushed; -} - -bool mcp_notifications_flush(void) -{ - bool flushed = false; - - mutex_lock(&mcp_ctx.notifications_mutex); - flushed = mcp_notifications_flush_nolock(); - mutex_unlock(&mcp_ctx.notifications_mutex); - return flushed; -} - -int mcp_notify(struct mcp_session *session) -{ - int ret = 0; - - if (!mcp_ctx.scheduler_cb) - return -EAGAIN; - - mutex_lock(&mcp_ctx.notifications_mutex); - if (session->id == SID_MCP) - dev_dbg(g_ctx.mcd, "notify MCP"); - else - dev_dbg(g_ctx.mcd, "notify %x", session->id); - - /* Notify TEE */ - if (!list_empty(&mcp_ctx.notifications) || notif_queue_full()) { - if (!list_empty(&session->notifications_list)) { - ret = -EAGAIN; - dev_dbg(g_ctx.mcd, "skip %x\n", session->id); - } else { - list_add(&session->notifications_list, - &mcp_ctx.notifications); - dev_dbg(g_ctx.mcd, "push %x\n", session->id); - } - - mcp_notifications_flush_nolock(); - - if (mcp_ctx.scheduler_cb(MCP_YIELD)) { - MCDRV_ERROR("MC_SMC_N_YIELD failed"); - ret = -EPROTO; - } - } else { - notif_queue_push(session->id); - if (mcp_ctx.scheduler_cb(MCP_NSIQ)) { - MCDRV_ERROR("MC_SMC_N_SIQ failed"); - ret = -EPROTO; - } - } - - mutex_unlock(&mcp_ctx.notifications_mutex); - return ret; -} - -static inline void handle_mcp_notif(uint32_t exit_code) -{ - dev_dbg(g_ctx.mcd, "notification from MCP ec %d\n", exit_code); - complete(&mcp_ctx.complete); -} - -static inline void handle_session_notif(uint32_t session_id, uint32_t exit_code) -{ - struct mcp_session *session = NULL, *s; - - dev_dbg(g_ctx.mcd, "notification from %x ec %d\n", session_id, - exit_code); - mutex_lock(&mcp_ctx.sessions_lock); - list_for_each_entry(s, &mcp_ctx.sessions, list) { - if (s->id == session_id) { - session = s; - break; - } - } - - if (session) { - /* TA has terminated */ - if (exit_code) { - /* Update exit code, or not */ - mutex_lock(&session->exit_code_lock); - /* - * In GP, the only way to recover the sessions exit code - * is to call TEEC_InvokeCommand which will notify. But - * notifying a dead session would change the exit code - * to ERR_SID_NOT_ACTIVE, hence the check below. - */ - if (!session->is_gp || !session->exit_code || - (exit_code != ERR_SID_NOT_ACTIVE)) - session->exit_code = exit_code; - - mutex_unlock(&session->exit_code_lock); - - /* Update state or schedule close worker */ - if (session->state == MCP_SESSION_CLOSE_PREPARE) - session->state = MCP_SESSION_CLOSE_NOTIFIED; - else if (session->state == MCP_SESSION_CLOSING_GP) - schedule_work(&session->close_work); - } - - /* Unblock waiter */ - complete(&session->completion); - } - mutex_unlock(&mcp_ctx.sessions_lock); - - /* Unknown session, probably being started */ - if (!session) { - mutex_lock(&mcp_ctx.unexp_notif_mutex); - mcp_ctx.unexp_notif.session_id = session_id; - mcp_ctx.unexp_notif.payload = exit_code; - mutex_unlock(&mcp_ctx.unexp_notif_mutex); - } -} - -static void mc_irq_worker(struct work_struct *data) -{ - struct notification_queue *rx = mcp_ctx.nq.rx; - - /* Deal with all pending notifications in one go */ - while ((rx->hdr.write_cnt - rx->hdr.read_cnt) > 0) { - struct notification nf; - - nf = rx->notification[rx->hdr.read_cnt++ % rx->hdr.queue_size]; - if (nf.session_id == SID_MCP) - handle_mcp_notif(nf.payload); - else - handle_session_notif(nf.session_id, nf.payload); - } - - /* - * Finished processing notifications. It does not matter whether - * there actually were any notification or not. S-SIQs can also - * be triggered by an SWd driver which was waiting for a FIQ. - * In this case the S-SIQ tells NWd that SWd is no longer idle - * an will need scheduling again. - */ - if (mcp_ctx.scheduler_cb) - mcp_ctx.scheduler_cb(MCP_NSIQ); -} - -/* - * This function represents the interrupt function of the mcDrvModule. - * It signals by incrementing of an event counter and the start of the read - * waiting queue, the read function a interrupt has occurred. - */ -static irqreturn_t irq_handler(int intr, void *arg) -{ - /* wake up thread to continue handling this interrupt */ - schedule_work(&irq_work); - return IRQ_HANDLED; -} - -void mcp_register_scheduler(int (*scheduler_cb)(enum mcp_scheduler_commands)) -{ - mcp_ctx.scheduler_cb = scheduler_cb; -} - -void mcp_register_crashhandler(void (*crashhandler_cb)(void)) -{ - mcp_ctx.crashhandler_cb = crashhandler_cb; -} - -int mcp_start(void) -{ - size_t q_len = ALIGN(2 * (sizeof(struct notification_queue_header) + - NQ_NUM_ELEMS * sizeof(struct notification)), 4); - int ret; - - /* Make sure we have an interrupt number before going on */ -#if defined(CONFIG_OF) - mcp_ctx.irq = irq_of_parse_and_map(g_ctx.mcd->of_node, 0); -#endif -#if defined(MC_INTR_SSIQ) - if (mcp_ctx.irq <= 0) - mcp_ctx.irq = MC_INTR_SSIQ; -#endif - - if (mcp_ctx.irq <= 0) { - MCDRV_ERROR("No IRQ number, aborting"); - return -EINVAL; - } - - /* Call the INIT fastcall to setup shared buffers */ - ret = mc_fc_init(virt_to_phys(mcp_ctx.base), - (uintptr_t)mcp_ctx.mcp_buffer - - (uintptr_t)mcp_ctx.base, - q_len, sizeof(*mcp_ctx.mcp_buffer)); - if (ret) - return ret; - - /* First empty N-SIQ to setup of the MCI structure */ - ret = mc_fc_nsiq(); - if (ret) - return ret; - - /* - * Wait until (uint16_t)-1) { - MCDRV_DBG_WARN("queues too large (more than 64k), sorry..."); - return -EINVAL; - } - - mcp_ctx.order = get_order(q_len + sizeof(*mcp_ctx.mcp_buffer)); - mci = __get_free_pages(GFP_USER | __GFP_ZERO, mcp_ctx.order); - if (!mci) - return -ENOMEM; - - mcp_ctx.nq.tx = (struct notification_queue *)mci; - mcp_ctx.nq.tx->hdr.queue_size = NQ_NUM_ELEMS; - mci += sizeof(struct notification_queue_header) + - mcp_ctx.nq.tx->hdr.queue_size * sizeof(struct notification); - - mcp_ctx.nq.rx = (struct notification_queue *)mci; - mcp_ctx.nq.rx->hdr.queue_size = NQ_NUM_ELEMS; - mci += sizeof(struct notification_queue_header) + - mcp_ctx.nq.rx->hdr.queue_size * sizeof(struct notification); - - mcp_ctx.mcp_buffer = (void *)ALIGN(mci, 4); - return 0; -} - -void mcp_exit(void) -{ - mark_mcp_dead(); - if (mcp_ctx.dump.off) - kfree(mcp_ctx.dump.buf); - - free_pages((unsigned long)mcp_ctx.base, mcp_ctx.order); -} diff --git a/drivers/gud/MobiCoreDriver/mcp.h b/drivers/gud/MobiCoreDriver/mcp.h deleted file mode 100644 index 0eefe573de8bf..0000000000000 --- a/drivers/gud/MobiCoreDriver/mcp.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MC_MCP_H_ -#define _MC_MCP_H_ - -#include "mci/mcloadformat.h" /* struct identity */ - -/* Structure to hold the TA/driver descriptor to pass to MCP */ -struct tbase_object { - uint32_t length; /* Total length */ - uint32_t header_length; /* Length of header before payload */ - uint8_t data[]; /* Header followed by payload */ -}; - -/* Structure to hold all mapped buffer data to pass to MCP */ -struct mcp_buffer_map { - uint64_t phys_addr; /** Page-aligned physical address */ - uint64_t secure_va; /** Page-aligned physical address */ - uint32_t offset; /** Data offset inside the first page */ - uint32_t length; /** Length of the data */ - uint32_t type; /** Type of MMU */ -}; - -struct mcp_session { - /* Work descriptor to handle delayed closing, set by upper layer */ - struct work_struct close_work; - /* Sessions list (protected by mcp sessions_lock) */ - struct list_head list; - /* Notifications list (protected by mcp notifications_mutex) */ - struct list_head notifications_list; - /* Notification waiter lock */ - struct mutex notif_wait_lock; /* Only one at a time */ - /* Notification received */ - struct completion completion; - /* Notification lock */ - struct mutex exit_code_lock; - /* Last notification */ - int32_t exit_code; - /* Session id */ - uint32_t id; - /* Session state (protected by mcp sessions_lock) */ - enum mcp_session_state { - MCP_SESSION_RUNNING, - MCP_SESSION_CLOSE_PREPARE, - MCP_SESSION_CLOSE_NOTIFIED, - MCP_SESSION_CLOSING_GP, - MCP_SESSION_CLOSED, - } state; - /* This TA is of Global Platform type, set by upper layer */ - bool is_gp; - /* GP TAs have login information */ - struct identity identity; -}; - -/* Init for the mcp_session structure */ -void mcp_session_init(struct mcp_session *session, bool is_gp, - const struct identity *identity); -int mcp_session_waitnotif(struct mcp_session *session, int32_t timeout); -int32_t mcp_session_exitcode(struct mcp_session *mcp_session); - -/* SWd suspend/resume */ -int mcp_suspend(void); -int mcp_resume(void); -bool mcp_suspended(void); - -/* Callback to scheduler registration */ -enum mcp_scheduler_commands { - MCP_YIELD, - MCP_NSIQ, -}; - -void mcp_register_scheduler(int (*scheduler_cb)(enum mcp_scheduler_commands)); -bool mcp_notifications_flush(void); -void mcp_register_crashhandler(void (*crashhandler_cb)(void)); - -/* - * Get the requested SWd sleep timeout value (ms) - * - if the timeout is -1, wait indefinitely - * - if the timeout is 0, re-schedule immediately (timeouts in µs in the SWd) - * - otherwise sleep for the required time - * returns true if sleep is required, false otherwise - */ -bool mcp_get_idle_timeout(int32_t *timeout); -void mcp_reset_idle_timeout(void); - -/* MCP commands */ -int mcp_get_version(struct mc_version_info *version_info); -int mcp_load_token(uintptr_t data, const struct mcp_buffer_map *buffer_map); -int mcp_load_check(const struct tbase_object *obj, - const struct mcp_buffer_map *buffer_map); -int mcp_open_session(struct mcp_session *session, - const struct tbase_object *obj, - const struct mcp_buffer_map *map, - const struct mcp_buffer_map *tci_map); -int mcp_close_session(struct mcp_session *session); -int mcp_map(uint32_t session_id, struct mcp_buffer_map *buffer_map); -int mcp_unmap(uint32_t session_id, const struct mcp_buffer_map *buffer_map); -int mcp_multimap(uint32_t session_id, struct mcp_buffer_map *buffer_maps); -int mcp_multiunmap(uint32_t session_id, - const struct mcp_buffer_map *buffer_maps); -int mcp_notify(struct mcp_session *mcp_session); - -/* MCP initialisation/cleanup */ -int mcp_init(void); -void mcp_exit(void); -int mcp_start(void); -void mcp_stop(void); - -#endif /* _MC_MCP_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mmu.c b/drivers/gud/MobiCoreDriver/mmu.c deleted file mode 100644 index fc769be4d15db..0000000000000 --- a/drivers/gud/MobiCoreDriver/mmu.c +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "mci/mcimcp.h" - -#include "platform.h" /* CONFIG_TRUSTONIC_TEE_LPAE */ -#include "main.h" -#include "debug.h" -#include "mcp.h" /* mcp_buffer_map */ -#include "mmu.h" - -#ifdef CONFIG_TRUSTONIC_TEE_LPAE -#define MMU_TYPE_PAGE (3 << 0) -#define MMU_BUFFERABLE BIT(2) /* AttrIndx[0] */ -#define MMU_CACHEABLE BIT(3) /* AttrIndx[1] */ -#define MMU_NS BIT(5) -#define MMU_AP_RW_ALL BIT(6) /* AP[2:1], RW, at any privilege level */ -#define MMU_EXT_SHARED (3 << 8) /* SH[1:0], inner shareable */ -#define MMU_EXT_AF BIT(10) /* Access Flag */ -#define MMU_EXT_NG BIT(11) -#define MMU_EXT_XN (((uint64_t)1) << 54) /* XN */ -#else -#define MMU_TYPE_EXT (3 << 0) /* v5 */ -#define MMU_TYPE_SMALL (2 << 0) -#define MMU_BUFFERABLE BIT(2) -#define MMU_CACHEABLE BIT(3) -#define MMU_EXT_AP0 BIT(4) -#define MMU_EXT_AP1 (2 << 4) -#define MMU_EXT_TEX(x) ((x) << 6) /* v5 */ -#define MMU_EXT_SHARED BIT(10) /* v6 */ -#define MMU_EXT_NG BIT(11) /* v6 */ -#endif - -/* - * MobiCore specific page tables for world shared memory. - * Linux uses shadow page tables, see arch/arm/include/asm/pgtable-2level. - * MobiCore uses the default ARM format. - * - * Number of page table entries in one L2 MMU table. This is ARM specific, an - * MMU table covers 1 MiB by using 256 entries referring to 4KiB pages each. - */ -#define L2_ENTRIES_MAX 256 - -/* - * Small buffers (below 1MiB) are mapped using the legacy L2 table, but bigger - * buffers now use a fake L1 table that holds 64-bit pointers to L2 tables. As - * this must be exactly one page, we can hold up to 512 entries. - */ -#define L1_ENTRIES_MAX 512 - -#ifdef CONFIG_TRUSTONIC_TEE_LPAE - -/* - * Secure world uses 64-bit physical addresses - */ -typedef u64 tbase_pte_t; - -/* - * Linux uses different mappings for SMP systems(the sharing flag is set for - * the pte. In order not to confuse things too much in Mobicore make sure the - * shared buffers have the same flags. This should also be done in SWD side. - */ -static tbase_pte_t pte_flags = MMU_BUFFERABLE | MMU_CACHEABLE | MMU_EXT_NG | -#ifdef CONFIG_SMP - MMU_EXT_SHARED | -#endif /* CONFIG_SMP */ - MMU_EXT_XN | MMU_EXT_AF | MMU_AP_RW_ALL | - MMU_NS | MMU_TYPE_PAGE; - -#else /* CONFIG_TRUSTONIC_TEE_LPAE */ - -/* - * Secure world uses 32-bit physical addresses - */ -typedef u32 tbase_pte_t; - -/* - * Linux uses different mappings for SMP systems(the sharing flag is set for - * the pte. In order not to confuse things too much in Mobicore make sure the - * shared buffers have the same flags. This should also be done in SWD side. - */ -static tbase_pte_t pte_flags = MMU_BUFFERABLE | MMU_CACHEABLE | MMU_EXT_NG | -#ifdef CONFIG_SMP - MMU_EXT_SHARED | MMU_EXT_TEX(1) | -#endif /* CONFIG_SMP */ - MMU_EXT_AP1 | MMU_EXT_AP0 | - MMU_TYPE_SMALL | MMU_TYPE_EXT; - -#endif /* !CONFIG_TRUSTONIC_TEE_LPAE */ - -/* - * Fake L1 MMU table. - */ -union l1_table { - u64 *pages_phys; /* Array of physical page addresses */ - unsigned long page; -}; - -/* - * L2 MMU table, which is more a L3 table in the LPAE case. - */ -union l2_table { - tbase_pte_t *ptes; /* Array of PTEs */ - unsigned long page; -}; - -/* - * MMU table allocated to the Daemon or a TLC describing a world shared - * buffer. - * When users map a malloc()ed area into SWd, a MMU table is allocated. - * In addition, the area of maximum 1MB virtual address space is mapped into - * the MMU table and a handle for this table is returned to the user. - */ -struct tbase_mmu { - union l2_table l2_tables[L1_ENTRIES_MAX]; /* L2 tables */ - size_t l2_tables_nr; /* Actual number of L2 tables */ - union l1_table l1_table; /* Fake L1 table */ - union l2_table l1_l2_table; /* L2 table for the L1 table */ - uint32_t offset; - uint32_t length; - bool user; /* Pages are from user space */ -}; - -static void free_all_pages(struct tbase_mmu *mmu_table) -{ - union l2_table *l2_table = &mmu_table->l2_tables[0]; - size_t i; - - for (i = 0; i < mmu_table->l2_tables_nr; i++, l2_table++) { - if (!l2_table->page) - break; - - free_page(l2_table->page); - } - - if (mmu_table->l1_l2_table.page) - free_page(mmu_table->l1_l2_table.page); - - if (mmu_table->l1_table.page) - free_page(mmu_table->l1_table.page); -} - -/* - * Create a MMU table for a buffer or trustlet. - */ -static inline int map_buffer(struct task_struct *task, const void *data, - unsigned int length, struct tbase_mmu *mmu_table) -{ - const void *reader = (const void *)((uintptr_t)data & PAGE_MASK); - struct page **pages; /* Same as above, conveniently typed */ - unsigned long pages_page; /* Page to contain the page pointers */ - size_t chunk; - unsigned long total_pages_nr; - int l1_entries_max; - int ret = 0; - - /* Check that we have enough space to map data */ - mmu_table->length = length; - mmu_table->offset = (uintptr_t)data & ~PAGE_MASK; - total_pages_nr = PAGE_ALIGN(mmu_table->offset + length) / PAGE_SIZE; - if (g_ctx.f_mem_ext) - l1_entries_max = L1_ENTRIES_MAX; - else - l1_entries_max = 1; - - if (total_pages_nr > (l1_entries_max * L2_ENTRIES_MAX)) { - dev_err(g_ctx.mcd, "data mapping exceeds %d pages", - l1_entries_max * L2_ENTRIES_MAX); - return -EINVAL; - } - - /* Get number of L2 tables needed */ - mmu_table->l2_tables_nr = (total_pages_nr + L2_ENTRIES_MAX - 1) / - L2_ENTRIES_MAX; - dev_dbg(g_ctx.mcd, "total_pages_nr %lu l2_tables_nr %zu", - total_pages_nr, mmu_table->l2_tables_nr); - - /* Get a page to store page pointers */ - pages_page = get_zeroed_page(GFP_KERNEL); - if (!pages_page) - return -ENOMEM; - - pages = (struct page **)pages_page; - - /* Allocate a page for the L1 table */ - if (mmu_table->l2_tables_nr > 1) { - tbase_pte_t *pte; - - mmu_table->l1_table.page = get_zeroed_page(GFP_KERNEL); - mmu_table->l1_l2_table.page = get_zeroed_page(GFP_KERNEL); - if (!mmu_table->l1_table.page || !mmu_table->l1_l2_table.page) { - ret = -ENOMEM; - goto end; - } - - /* Map it */ - pte = &mmu_table->l1_l2_table.ptes[0]; - *pte = virt_to_phys(mmu_table->l1_table.pages_phys); - *pte |= pte_flags; - } - - for (chunk = 0; chunk < mmu_table->l2_tables_nr; chunk++) { - unsigned long pages_nr, i; - tbase_pte_t *pte; - struct page **page_ptr; - - /* Size to map for this chunk */ - if (chunk == (mmu_table->l2_tables_nr - 1)) - pages_nr = ((total_pages_nr - 1) % L2_ENTRIES_MAX) + 1; - else - pages_nr = L2_ENTRIES_MAX; - - /* Allocate a page for the MMU descriptor */ - mmu_table->l2_tables[chunk].page = get_zeroed_page(GFP_KERNEL); - if (!mmu_table->l2_tables[chunk].page) { - ret = -ENOMEM; - goto end; - } - - /* Add page address to L1 table if needed */ - if (mmu_table->l1_table.page) - mmu_table->l1_table.pages_phys[chunk] = - virt_to_phys(mmu_table->l2_tables[chunk].ptes); - - /* Get pages */ - if (task) { - long gup_ret; - - /* Buffer was allocated in user space */ - down_read(&task->mm->mmap_sem); - gup_ret = get_user_pages(task, task->mm, - (uintptr_t)reader, pages_nr, - 1, 0, pages, 0); - reader += pages_nr * PAGE_SIZE; - up_read(&task->mm->mmap_sem); - if (gup_ret < 0) { - ret = gup_ret; - dev_err(g_ctx.mcd, - "failed to get user pages: %d", ret); - goto end; - } - - /* check if we could lock all pages. */ - if (gup_ret != pages_nr) { - dev_err(g_ctx.mcd, - "get_user_pages() failed, ret: %ld", - gup_ret); - release_pages(pages, gup_ret, 0); - ret = -ENOMEM; - goto end; - } - - mmu_table->user = true; - } else if (is_vmalloc_addr(data)) { - /* Buffer vmalloc'ed in kernel space */ - page_ptr = &pages[0]; - for (i = 0; i < pages_nr; i++) { - struct page *page = vmalloc_to_page(reader); - - if (!page) { - dev_err(g_ctx.mcd, - "failed to map address"); - ret = -EINVAL; - goto end; - } - - *page_ptr++ = page; - reader += PAGE_SIZE; - } - } else { - /* Buffer kmalloc'ed in kernel space */ - struct page *page = virt_to_page(reader); - - reader += pages_nr * PAGE_SIZE; - page_ptr = &pages[0]; - for (i = 0; i < pages_nr; i++) - *page_ptr++ = page++; - } - - /* Create MMU Table entries */ - page_ptr = &pages[0]; - pte = &mmu_table->l2_tables[chunk].ptes[0]; - for (i = 0; i < pages_nr; i++, page_ptr++, pte++) { - /* - * Create MMU table entry, see ARM MMU docu for details - * about flags stored in the lowest 12 bits. As a side - * reference, the Article "ARM's multiply-mapped memory - * mess" found in the collection at - * http://lwn.net/Articles/409032/ is also worth reading. - */ - unsigned long phys = page_to_phys(*page_ptr); -#if defined CONFIG_ARM64 && !defined CONFIG_TRUSTONIC_TEE_LPAE - if (phys & 0xffffffff00000000) { - dev_err(g_ctx.mcd, - "Pointer too big for non-LPAE: 0x%16lx", - phys); - ret = -EFAULT; - goto end; - } -#endif - *pte = phys; - *pte |= pte_flags; - } - } - -end: - if (ret) - free_all_pages(mmu_table); - - free_page(pages_page); - return ret; -} - -static inline void unmap_buffer(struct tbase_mmu *mmu_table) -{ - int t; - - dev_dbg(g_ctx.mcd, "clear MMU table, virt %p", mmu_table); - if (!mmu_table->user) - goto end; - - /* Release all locked user space pages */ - for (t = 0; t < mmu_table->l2_tables_nr; t++) { - tbase_pte_t *pte = mmu_table->l2_tables[t].ptes; - int i; - - for (i = 0; i < L2_ENTRIES_MAX; i++, pte++) { - struct page *page; - - /* If not all entries are used, unused ones are 0 */ - if (!*pte) - break; - - /* pte_page() cannot return NULL */ - page = pte_page(*pte); - dev_dbg(g_ctx.mcd, "MMU entry %d: 0x%llx, virt %p", - i, (u64)*pte, page); - - page_cache_release(page); - } - } - -end: - free_all_pages(mmu_table); -} - -/* - * Delete a MMU table. - */ -void tbase_mmu_delete(struct tbase_mmu *mmu) -{ - if (WARN(!mmu, "NULL mmu pointer given")) - return; - - unmap_buffer(mmu); - MCDRV_DBG("freed mmu %p: %s len %u off %u table %lx type L%d", - mmu, mmu->user ? "user" : "kernel", mmu->length, mmu->offset, - (uintptr_t)(mmu->l1_table.page ? mmu->l1_l2_table.ptes : - mmu->l2_tables[0].ptes), - mmu->l1_table.page ? 1 : 2); - kfree(mmu); -} - -/* - * Allocate MMU table and map buffer into it. - * That is, create respective table entries. - */ -struct tbase_mmu *tbase_mmu_create(struct task_struct *task, - const void *addr, - unsigned int length) -{ - struct tbase_mmu *mmu; - int ret; - - /* Check input arguments */ - if (WARN(!addr, "data address is NULL")) - return ERR_PTR(-EINVAL); - - if (WARN(!length, "data length is 0")) - return ERR_PTR(-EINVAL); - - /* Allocate the struct */ - mmu = kmalloc(sizeof(*mmu), GFP_KERNEL | __GFP_ZERO); - if (!mmu) - return ERR_PTR(-ENOMEM); - - /* Create the MMU mapping for the data */ - ret = map_buffer(task, addr, length, mmu); - if (ret) { - kfree(mmu); - return ERR_PTR(ret); - } - - MCDRV_DBG("created mmu %p: %s addr %p len %u off %u table %lx type L%d", - mmu, mmu->user ? "user" : "kernel", addr, mmu->length, - mmu->offset, - (uintptr_t)(mmu->l1_table.page ? mmu->l1_l2_table.ptes : - mmu->l2_tables[0].ptes), - mmu->l1_table.page ? 1 : 2); - return mmu; -} - -void tbase_mmu_buffer(const struct tbase_mmu *mmu, struct mcp_buffer_map *map) -{ - if (mmu->l1_table.page) { - map->phys_addr = virt_to_phys(mmu->l1_l2_table.ptes); - map->type = WSM_L1; - } else { - map->phys_addr = virt_to_phys(mmu->l2_tables[0].ptes); - map->type = WSM_L2; - } - - map->secure_va = 0; - map->offset = mmu->offset; - map->length = mmu->length; -} - -int tbase_mmu_info(const struct tbase_mmu *mmu, struct kasnprintf_buf *buf) -{ - return kasnprintf(buf, - "\t\t\tmmu %p: %s len %u off %u table %lx type L%d\n", - mmu, mmu->user ? "user" : "kernel", mmu->length, - mmu->offset, - (uintptr_t)(mmu->l1_table.page ? - mmu->l1_l2_table.ptes : mmu->l2_tables[0].ptes), - mmu->l1_table.page ? 1 : 2); -} diff --git a/drivers/gud/MobiCoreDriver/mmu.h b/drivers/gud/MobiCoreDriver/mmu.h deleted file mode 100644 index 09efea480bef8..0000000000000 --- a/drivers/gud/MobiCoreDriver/mmu.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _TBASE_MEM_H_ -#define _TBASE_MEM_H_ - -struct tbase_mmu; -struct mcp_buffer_map; - -/* - * Allocate MMU table and map buffer into it. - * That is, create respective table entries. - */ -struct tbase_mmu *tbase_mmu_create(struct task_struct *task, - const void *wsm_buffer, - unsigned int wsm_len); - -/* - * Delete a used MMU table. - */ -void tbase_mmu_delete(struct tbase_mmu *mmu); - -/* - * Fill in buffer info for MMU table. - */ -void tbase_mmu_buffer(const struct tbase_mmu *mmu, struct mcp_buffer_map *map); - -/* - * Add info to debug buffer. - */ -int tbase_mmu_info(const struct tbase_mmu *mmu, struct kasnprintf_buf *buf); - -#endif /* _TBASE_MEM_H_ */ diff --git a/drivers/gud/MobiCoreDriver/platform.h b/drivers/gud/MobiCoreDriver/platform.h deleted file mode 100644 index f9c801450f64e..0000000000000 --- a/drivers/gud/MobiCoreDriver/platform.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MC_PLATFORM_H_ -#define _MC_PLATFORM_H_ - -/* MobiCore Interrupt for Qualcomm (DT IRQ has priority if present) */ -#define MC_INTR_SSIQ 280 - -/* Use SMC for fastcalls */ -#define MC_SMC_FASTCALL - -#include - -/*--------------- Implementation -------------- */ -#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || \ - defined(CONFIG_ARCH_MSM8994) || defined(CONFIG_ARCH_MSM8909) || \ - defined(CONFIG_ARCH_MSM8996) - -#include - -#if defined(CONFIG_ARM64) || defined(CONFIG_ARCH_MSM8916) - - #include - #include - #include - #include - #include - #include - - #define SCM_MOBIOS_FNID(s, c) (((((s) & 0xFF) << 8) | ((c) & 0xFF)) \ - | 0x33000000) - - #define TZ_EXECUTIVE_EXT_ID_PARAM_ID \ - TZ_SYSCALL_CREATE_PARAM_ID_4( \ - TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ - TZ_SYSCALL_PARAM_TYPE_VAL, \ - TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ - TZ_SYSCALL_PARAM_TYPE_VAL) - -#endif - -#else -#include -#endif - -/* from following file */ -#define SCM_SVC_MOBICORE 250 -#define SCM_CMD_MOBICORE 1 - -static inline int smc_fastcall(void *fc_generic, size_t size) -{ -#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || \ - defined(CONFIG_ARCH_MSM8994) || defined(CONFIG_ARCH_MSM8996) - if (is_scm_armv8()) { - struct scm_desc desc = {0}; - int ret; - void *scm_buf = NULL; - - scm_buf = kzalloc(PAGE_ALIGN(size), GFP_KERNEL); - if (!scm_buf) - return -ENOMEM; - memcpy(scm_buf, fc_generic, size); - dmac_flush_range(scm_buf, scm_buf + size); - - desc.arginfo = TZ_EXECUTIVE_EXT_ID_PARAM_ID; - desc.args[0] = virt_to_phys(scm_buf); - desc.args[1] = (u32)size; - desc.args[2] = virt_to_phys(scm_buf); - desc.args[3] = (u32)size; - - ret = scm_call2( - SCM_MOBIOS_FNID(SCM_SVC_MOBICORE, SCM_CMD_MOBICORE), - &desc); - - dmac_flush_range(scm_buf, scm_buf + size); - - memcpy(fc_generic, scm_buf, size); - kfree(scm_buf); - return ret; - } -#endif - - return scm_call(SCM_SVC_MOBICORE, SCM_CMD_MOBICORE, - fc_generic, size, - fc_generic, size); -} - -/* Fastcall value should be the one for armv7, even if on armv8, - * as long as the __aarch32__ flag is not activated in SW. - * But for 8996, architecture is armv8 with __aarch32__ in Sw. - */ -#if !defined(CONFIG_ARCH_MSM8996) -#define MC_ARMV7_FC -#endif - -#if defined(CONFIG_ARCH_MSM8996) -#define CONFIG_TRUSTONIC_TEE_LPAE -#endif - -/* - * Perform crypto clock enable/disable - * of clocks - * "bus_clk" - * "core_clk" - * "iface_clk" - */ -#if (!defined(CONFIG_ARCH_MSM8960) && !defined(CONFIG_ARCH_MSM8994)) || \ - defined(CONFIG_ARCH_MSM8996) -#define MC_CRYPTO_CLOCK_MANAGEMENT -#endif - -/* - * Perform clock enable/disable for clock "core_clk_src" - */ -#if defined(CONFIG_ARCH_MSM8916) || defined(CONFIG_ARCH_MSM8909) || \ - defined(CONFIG_ARCH_MSM8996) -#define MC_DEVICE_PROPNAME "qcom,mcd" -#if defined(MC_CRYPTO_CLOCK_MANAGEMENT) -#define MC_CLOCK_CORESRC_PROPNAME "qcom,ce-opp-freq" -#define MC_CLOCK_CORESRC_DEFAULTRATE 100000000 -#endif /* MC_CRYPTO_CLOCK_MANAGEMENT */ -#endif - - -#if !defined(CONFIG_ARCH_MSM8996) -/* uid/gid behave like old kernels but with new types */ -/* This flag does not exist on 8996 3.10 kernel version */ -#if !defined(CONFIG_UIDGID_STRICT_TYPE_CHECKS) -#define MC_UIDGID_OLDSTYLE -#endif -/* Fastcall value should be the one for armv7, even if on armv8, - * as long as the __aarch32__ flag is not activated in SW. - * But for 8996, architecture is armv8 with __aarch32__ in Sw. - */ -#define MC_ARMV7_FC -#endif /* not CONFIG_ARCH_MSM8996 */ - -#endif /* _MC_PLATFORM_H_ */ - diff --git a/drivers/gud/MobiCoreDriver/pm.c b/drivers/gud/MobiCoreDriver/pm.c deleted file mode 100644 index 98310f73dfeab..0000000000000 --- a/drivers/gud/MobiCoreDriver/pm.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "platform.h" /* MC_PM_RUNTIME */ -#include "debug.h" -#include "scheduler.h" /* SWd suspend/resume commands */ -#include "pm.h" - -#ifdef MC_PM_RUNTIME -static struct pm_context { - struct notifier_block pm_notifier; -} pm_ctx; - -static int mc_suspend_notifier(struct notifier_block *nb, unsigned long event, - void *dummy) -{ - switch (event) { - case PM_SUSPEND_PREPARE: - return mc_scheduler_suspend(); - case PM_POST_SUSPEND: - return mc_scheduler_resume(); - } - - return 0; -} - - -/* CPI todo: inconsistent handling of ret in below 2 functions */ -int mc_pm_start(void) -{ - int ret = 0; - - pm_ctx.pm_notifier.notifier_call = mc_suspend_notifier; - ret = register_pm_notifier(&pm_ctx.pm_notifier); - MCDRV_DBG_VERBOSE("done, ret = %d", ret); - - return ret; -} - -void mc_pm_stop(void) -{ - unregister_pm_notifier(&pm_ctx.pm_notifier); -} - -#endif /* MC_PM_RUNTIME */ diff --git a/drivers/gud/MobiCoreDriver/pm.h b/drivers/gud/MobiCoreDriver/pm.h deleted file mode 100644 index 999599a70b1ab..0000000000000 --- a/drivers/gud/MobiCoreDriver/pm.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MC_PM_H_ -#define _MC_PM_H_ - -#include "platform.h" /* MC_PM_RUNTIME */ - -#ifdef MC_PM_RUNTIME -/* Initialize Power Management */ -int mc_pm_start(void); -/* Free all Power Management resources*/ -void mc_pm_stop(void); -#else -static inline int mc_pm_start(void) -{ - return 0; -} - -static inline void mc_pm_stop(void) -{ -} -#endif - -#endif /* _MC_PM_H_ */ diff --git a/drivers/gud/MobiCoreDriver/public/mc_admin.h b/drivers/gud/MobiCoreDriver/public/mc_admin.h deleted file mode 100644 index 3a4078dd6fc30..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mc_admin.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MC_ADMIN_IOCTL_H__ -#define __MC_ADMIN_IOCTL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define MC_ADMIN_DEVNODE "mobicore" - -/* Driver/daemon commands */ -enum { - /* Command 0 is reserved */ - MC_DRV_GET_ROOT_CONTAINER = 1, - MC_DRV_GET_SP_CONTAINER = 2, - MC_DRV_GET_TRUSTLET_CONTAINER = 3, - MC_DRV_GET_TRUSTLET = 4, - MC_DRV_SIGNAL_CRASH = 5, -}; - -/* MobiCore IOCTL magic number */ -#define MC_IOC_MAGIC 'M' - -struct mc_admin_request { - uint32_t request_id; /* Unique request identifier */ - uint32_t command; /* Command to daemon */ - struct mc_uuid_t uuid; /* UUID of trustlet, if relevant */ - uint32_t is_gp; /* Whether trustlet is GP */ - uint32_t spid; /* SPID of trustlet, if relevant */ -}; - -struct mc_admin_response { - uint32_t request_id; /* Unique request identifier */ - uint32_t error_no; /* Errno from daemon */ - uint32_t spid; /* SPID of trustlet, if relevant */ - uint32_t service_type; /* Type of trustlet being returned */ - uint32_t length; /* Length of data to get */ - /* Any data follows */ -}; - -struct mc_admin_driver_info { - /* Version, and something else..*/ - uint32_t drv_version; - uint32_t initial_cmd_id; -}; - -struct mc_admin_load_info { - uint32_t spid; /* SPID of trustlet, if relevant */ - uint64_t address; /* Address of the data */ - uint32_t length; /* Length of data to get */ -}; - -#define MC_ADMIN_IO_GET_DRIVER_REQUEST \ - _IOR(MC_IOC_MAGIC, 0, struct mc_admin_request) -#define MC_ADMIN_IO_GET_INFO \ - _IOR(MC_IOC_MAGIC, 1, struct mc_admin_driver_info) -#define MC_ADMIN_IO_LOAD_DRIVER \ - _IOW(MC_IOC_MAGIC, 2, struct mc_admin_load_info) -#define MC_ADMIN_IO_LOAD_TOKEN \ - _IOW(MC_IOC_MAGIC, 3, struct mc_admin_load_info) -#define MC_ADMIN_IO_LOAD_CHECK \ - _IOW(MC_IOC_MAGIC, 4, struct mc_admin_load_info) - -#ifdef __cplusplus -} -#endif -#endif /* __MC_ADMIN_IOCTL_H__ */ diff --git a/drivers/gud/MobiCoreDriver/public/mc_linux.h b/drivers/gud/MobiCoreDriver/public/mc_linux.h deleted file mode 100644 index 2368653f8890d..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mc_linux.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _MC_LINUX_H_ -#define _MC_LINUX_H_ - -#define MCDRVMODULEAPI_VERSION_MAJOR 2 -#define MCDRVMODULEAPI_VERSION_MINOR 1 - -#ifndef __KERNEL__ -#include -#endif - -#define MC_USER_DEVNODE "mobicore-user" - -/** Maximum length of MobiCore product ID string. */ -#define MC_PRODUCT_ID_LEN 64 - -/** Number of buffers that can be mapped at once */ -#define MC_MAP_MAX 4 - -/* - * Universally Unique Identifier (UUID) according to ISO/IEC 11578. - */ -struct mc_uuid_t { - uint8_t value[16]; /* Value of the UUID. */ -}; - -/* - * GP TA login types. - */ -enum mc_login_type { - TEEC_LOGIN_PUBLIC = 0, - TEEC_LOGIN_USER, - TEEC_LOGIN_GROUP, - TEEC_LOGIN_APPLICATION = 4, - TEEC_LOGIN_USER_APPLICATION, - TEEC_LOGIN_GROUP_APPLICATION, -}; - -/* - * GP TA identity structure. - */ -struct mc_identity { - enum mc_login_type login_type; - union { - uint8_t login_data[16]; - gid_t gid; /* Requested group id */ - struct { - uid_t euid; - uid_t ruid; - } uid; - }; -}; - -/* - * Data exchange structure of the MC_IO_OPEN_SESSION ioctl command. - */ -struct mc_ioctl_open_sess { - struct mc_uuid_t uuid; /* trustlet uuid */ - uint32_t is_gp_uuid; /* uuid is for GP TA */ - uint32_t sid; /* session id (out) */ - uint64_t tci; /* tci buffer pointer */ - uint32_t tcilen; /* tci length */ - struct mc_identity identity; /* GP TA identity */ -}; - -/* - * Data exchange structure of the MC_IO_OPEN_TRUSTLET ioctl command. - */ -struct mc_ioctl_open_trustlet { - uint32_t sid; /* session id (out) */ - uint32_t spid; /* trustlet spid */ - uint64_t buffer; /* trustlet binary pointer */ - uint32_t tlen; /* binary length */ - uint64_t tci; /* tci buffer pointer */ - uint32_t tcilen; /* tci length */ -}; - -/* - * Data exchange structure of the MC_IO_WAIT ioctl command. - */ -struct mc_ioctl_wait { - uint32_t sid; /* session id (in) */ - int32_t timeout; /* notification timeout */ -}; - -/* - * Data exchange structure of the MC_IO_ALLOC ioctl command. - */ -struct mc_ioctl_alloc { - uint32_t len; /* buffer length */ - uint32_t handle; /* user handle for the buffer (out) */ -}; - -/* - * Buffer mapping incoming and outgoing information. - */ -struct mc_ioctl_buffer { - uint64_t va; /* user space address of buffer */ - uint32_t len; /* buffer length */ - uint64_t sva; /* SWd virt address of buffer (out) */ -}; - -/* - * Data exchange structure of the MC_IO_MAP and MC_IO_UNMAP ioctl commands. - */ -struct mc_ioctl_map { - uint32_t sid; /* session id */ - struct mc_ioctl_buffer bufs[MC_MAP_MAX];/* buffers info */ -}; - -/* - * Data exchange structure of the MC_IO_ERR ioctl command. - */ -struct mc_ioctl_geterr { - uint32_t sid; /* session id */ - int32_t value; /* error value (out) */ -}; - -/* - * Global MobiCore Version Information. - */ -struct mc_version_info { - char product_id[MC_PRODUCT_ID_LEN]; /** Product ID string */ - uint32_t version_mci; /** Mobicore Control Interface */ - uint32_t version_so; /** Secure Objects */ - uint32_t version_mclf; /** MobiCore Load Format */ - uint32_t version_container; /** MobiCore Container Format */ - uint32_t version_mc_config; /** MobiCore Config. Block Format */ - uint32_t version_tl_api; /** MobiCore Trustlet API */ - uint32_t version_dr_api; /** MobiCore Driver API */ - uint32_t version_cmp; /** Content Management Protocol */ -}; - -/* - * defines for the ioctl mobicore driver module function call from user space. - */ -/* MobiCore IOCTL magic number */ -#define MC_IOC_MAGIC 'M' - -/* - * Implement corresponding functions from user api - */ -#define MC_IO_OPEN_SESSION \ - _IOWR(MC_IOC_MAGIC, 0, struct mc_ioctl_open_sess) -#define MC_IO_OPEN_TRUSTLET \ - _IOWR(MC_IOC_MAGIC, 1, struct mc_ioctl_open_trustlet) -#define MC_IO_CLOSE_SESSION _IO(MC_IOC_MAGIC, 2) -#define MC_IO_NOTIFY _IO(MC_IOC_MAGIC, 3) -#define MC_IO_WAIT _IOW(MC_IOC_MAGIC, 4, struct mc_ioctl_wait) -#define MC_IO_MAP _IOWR(MC_IOC_MAGIC, 5, struct mc_ioctl_map) -#define MC_IO_UNMAP _IOW(MC_IOC_MAGIC, 6, struct mc_ioctl_map) -#define MC_IO_ERR _IOWR(MC_IOC_MAGIC, 7, struct mc_ioctl_geterr) -#define MC_IO_FREEZE _IO(MC_IOC_MAGIC, 8) -#define MC_IO_VERSION _IOR(MC_IOC_MAGIC, 9, struct mc_version_info) -#define MC_IO_DR_VERSION _IOR(MC_IOC_MAGIC, 10, uint32_t) - -#endif /* _MC_LINUX_H_ */ diff --git a/drivers/gud/MobiCoreDriver/public/mc_linux_api.h b/drivers/gud/MobiCoreDriver/public/mc_linux_api.h deleted file mode 100644 index 211bc2682b754..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mc_linux_api.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MC_LINUX_API_H_ -#define _MC_LINUX_API_H_ - -/* - * Switch tbase active core to core_num, defined as linux - * core id - */ -int mc_switch_core(uint32_t core_num); - -/* - * Return tbase active core as Linux core id - */ -uint32_t mc_active_core(void); - -#endif /* _MC_LINUX_API_H_ */ diff --git a/drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h b/drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h deleted file mode 100644 index 005099532d73a..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#ifndef _MOBICORE_DRIVER_API_H_ -#define _MOBICORE_DRIVER_API_H_ - -#include "mc_linux.h" - -#define __MC_CLIENT_LIB_API - -/* - * Return values of MobiCore driver functions. - */ -enum mc_result { - /* Function call succeeded. */ - MC_DRV_OK = 0, - /* No notification available. */ - MC_DRV_NO_NOTIFICATION = 1, - /* Error during notification on communication level. */ - MC_DRV_ERR_NOTIFICATION = 2, - /* Function not implemented. */ - MC_DRV_ERR_NOT_IMPLEMENTED = 3, - /* No more resources available. */ - MC_DRV_ERR_OUT_OF_RESOURCES = 4, - /* Driver initialization failed. */ - MC_DRV_ERR_INIT = 5, - /* Unknown error. */ - MC_DRV_ERR_UNKNOWN = 6, - /* The specified device is unknown. */ - MC_DRV_ERR_UNKNOWN_DEVICE = 7, - /* The specified session is unknown.*/ - MC_DRV_ERR_UNKNOWN_SESSION = 8, - /* The specified operation is not allowed. */ - MC_DRV_ERR_INVALID_OPERATION = 9, - /* The response header from the MC is invalid. */ - MC_DRV_ERR_INVALID_RESPONSE = 10, - /* Function call timed out. */ - MC_DRV_ERR_TIMEOUT = 11, - /* Can not allocate additional memory. */ - MC_DRV_ERR_NO_FREE_MEMORY = 12, - /* Free memory failed. */ - MC_DRV_ERR_FREE_MEMORY_FAILED = 13, - /* Still some open sessions pending. */ - MC_DRV_ERR_SESSION_PENDING = 14, - /* MC daemon not reachable */ - MC_DRV_ERR_DAEMON_UNREACHABLE = 15, - /* The device file of the kernel module could not be opened. */ - MC_DRV_ERR_INVALID_DEVICE_FILE = 16, - /* Invalid parameter. */ - MC_DRV_ERR_INVALID_PARAMETER = 17, - /* Unspecified error from Kernel Module*/ - MC_DRV_ERR_KERNEL_MODULE = 18, - /* Error during mapping of additional bulk memory to session. */ - MC_DRV_ERR_BULK_MAPPING = 19, - /* Error during unmapping of additional bulk memory to session. */ - MC_DRV_ERR_BULK_UNMAPPING = 20, - /* Notification received, exit code available. */ - MC_DRV_INFO_NOTIFICATION = 21, - /* Set up of NWd connection failed. */ - MC_DRV_ERR_NQ_FAILED = 22, - /* Wrong daemon version. */ - MC_DRV_ERR_DAEMON_VERSION = 23, - /* Wrong container version. */ - MC_DRV_ERR_CONTAINER_VERSION = 24, - /* System Trustlet public key is wrong. */ - MC_DRV_ERR_WRONG_PUBLIC_KEY = 25, - /* Wrong container type(s). */ - MC_DRV_ERR_CONTAINER_TYPE_MISMATCH = 26, - /* Container is locked (or not activated). */ - MC_DRV_ERR_CONTAINER_LOCKED = 27, - /* SPID is not registered with root container. */ - MC_DRV_ERR_SP_NO_CHILD = 28, - /* UUID is not registered with sp container. */ - MC_DRV_ERR_TL_NO_CHILD = 29, - /* Unwrapping of root container failed. */ - MC_DRV_ERR_UNWRAP_ROOT_FAILED = 30, - /* Unwrapping of service provider container failed. */ - MC_DRV_ERR_UNWRAP_SP_FAILED = 31, - /* Unwrapping of Trustlet container failed. */ - MC_DRV_ERR_UNWRAP_TRUSTLET_FAILED = 32, - /* No device associated with connection. */ - MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN = 33, - /* TA blob attestation is incorrect. */ - MC_DRV_ERR_TA_ATTESTATION_ERROR = 34, - /* Interrupted system call. */ - MC_DRV_ERR_INTERRUPTED_BY_SIGNAL = 35, - /* Service is blocked and opensession is thus not allowed. */ - MC_DRV_ERR_SERVICE_BLOCKED = 36, - /* Service is locked and opensession is thus not allowed. */ - MC_DRV_ERR_SERVICE_LOCKED = 37, - /* Service was killed by the TEE (due to an administrative command). */ - MC_DRV_ERR_SERVICE_KILLED = 38, - /* All permitted instances to the service are used */ - MC_DRV_ERR_NO_FREE_INSTANCES = 39, - /* TA blob header is incorrect. */ - MC_DRV_ERR_TA_HEADER_ERROR = 40, -}; - -/* - * Structure of Session Handle, includes the Session ID and the Device ID the - * Session belongs to. - * The session handle will be used for session-based MobiCore communication. - * It will be passed to calls which address a communication end point in the - * MobiCore environment. - */ -struct mc_session_handle { - uint32_t session_id; /* MobiCore session ID */ - uint32_t device_id; /* Device ID the session belongs to */ -}; - -/* - * Information structure about additional mapped Bulk buffer between the - * Trustlet Connector (NWd) and the Trustlet (SWd). This structure is - * initialized from a Trustlet Connector by calling mc_map(). - * In order to use the memory within a Trustlet the Trustlet Connector has to - * inform the Trustlet with the content of this structure via the TCI. - */ -struct mc_bulk_map { - /* The virtual address of the Bulk buffer regarding the address space - * of the Trustlet, already includes a possible offset! */ - uint32_t secure_virt_addr; - uint32_t secure_virt_len; /* Length of the mapped Bulk buffer */ -}; - -/* The default device ID */ -#define MC_DEVICE_ID_DEFAULT 0 -/* Wait infinite for a response of the MC. */ -#define MC_INFINITE_TIMEOUT ((int32_t)(-1)) -/* Do not wait for a response of the MC. */ -#define MC_NO_TIMEOUT 0 -/* TCI/DCI must not exceed 1MiB */ -#define MC_MAX_TCI_LEN 0x100000 - -/** - * mc_open_device() - Open a new connection to a MobiCore device. - * @device_id: Identifier for the MobiCore device to be used. - * MC_DEVICE_ID_DEFAULT refers to the default device. - * - * Initializes all device specific resources required to communicate with a - * MobiCore instance located on the specified device in the system. If the - * device does not exist the function will return MC_DRV_ERR_UNKNOWN_DEVICE. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_ERR_INVALID_OPERATION: device already opened - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon - * MC_DRV_ERR_UNKNOWN_DEVICE: device_id unknown - * MC_DRV_ERR_INVALID_DEVICE_FILE: kernel module under /dev/mobicore - * cannot be opened - */ -__MC_CLIENT_LIB_API enum mc_result mc_open_device(uint32_t device_id); - -/** - * mc_close_device() - Close the connection to a MobiCore device. - * @device_id: Identifier for the MobiCore device. - * - * When closing a device, active sessions have to be closed beforehand. - * Resources associated with the device will be released. - * The device may be opened again after it has been closed. - * - * MC_DEVICE_ID_DEFAULT refers to the default device. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_SESSION_PENDING: a session is still open - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - */ -__MC_CLIENT_LIB_API enum mc_result mc_close_device(uint32_t device_id); - -/** - * mc_open_session() - Open a new session to a Trustlet. - * @session: On success, the session data will be returned - * @uuid: UUID of the Trustlet to be opened - * @tci: TCI buffer for communicating with the Trustlet - * @tci_len: Length of the TCI buffer. Maximum allowed value - * is MC_MAX_TCI_LEN - * - * The Trustlet with the given UUID has to be available in the flash filesystem. - * - * Write MCP open message to buffer and notify MobiCore about the availability - * of a new command. - * - * Waits till the MobiCore responses with the new session ID (stored in the MCP - * buffer). - * - * Note that session.device_id has to be the device id of an opened device. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon socket occur - * MC_DRV_ERR_NQ_FAILED: daemon returns an error - */ -__MC_CLIENT_LIB_API enum mc_result mc_open_session( - struct mc_session_handle *session, const struct mc_uuid_t *uuid, - uint8_t *tci, uint32_t tci_len); - -/** - * mc_open_trustlet() - Open a new session to the provided Trustlet. - * @session: On success, the session data will be returned - * @spid: Service Provider ID (for SP trustlets otherwise ignored) - * @trustlet Memory buffer containing the Trusted Application binary - * @trustlet_len Trusted Application length - * @tci: TCI buffer for communicating with the Trustlet - * @tci_len: Length of the TCI buffer. Maximum allowed value - * is MC_MAX_TCI_LEN - * - * Write MCP open message to buffer and notify MobiCore about the availability - * of a new command. - * - * Waits till the MobiCore responses with the new session ID (stored in the MCP - * buffer). - * - * Note that session.device_id has to be the device id of an opened device. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon socket occur - * MC_DRV_ERR_NQ_FAILED: daemon returns an error - */ -__MC_CLIENT_LIB_API enum mc_result mc_open_trustlet( - struct mc_session_handle *session, uint32_t spid, - uint8_t *trustlet, uint32_t trustlet_len, uint8_t *tci, uint32_t len); - -/** - * mc_close_session() - Close a Trustlet session. - * @session: Session to be closed. - * - * Closes the specified MobiCore session. The call will block until the - * session has been closed. - * - * Device device_id has to be opened in advance. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - * MC_DRV_ERR_INVALID_DEVICE_FILE: daemon cannot open Trustlet file - */ -__MC_CLIENT_LIB_API enum mc_result mc_close_session( - struct mc_session_handle *session); - -/** - * mc_notify() - Notify a session. - * @session: The session to be notified. - * - * Notifies the session end point about available message data. - * If the session parameter is correct, notify will always succeed. - * Corresponding errors can only be received by mc_wait_notification(). - * - * A session has to be opened in advance. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - */ -__MC_CLIENT_LIB_API enum mc_result mc_notify(struct mc_session_handle *session); - -/** - * mc_wait_notification() - Wait for a notification. - * @session: The session the notification should correspond to. - * @timeout: Time in milliseconds to wait - * (MC_NO_TIMEOUT : direct return, > 0 : milliseconds, - * MC_INFINITE_TIMEOUT : wait infinitely) - * - * Wait for a notification issued by the MobiCore for a specific session. - * The timeout parameter specifies the number of milliseconds the call will wait - * for a notification. - * - * If the caller passes 0 as timeout value the call will immediately return. - * If timeout value is below 0 the call will block until a notification for the - * session has been received. - * - * If timeout is below 0, call will block. - * - * Caller has to trust the other side to send a notification to wake him up - * again. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_ERR_TIMEOUT: no notification arrived in time - * MC_DRV_INFO_NOTIFICATION: a problem with the session was - * encountered. Get more details with - * mc_get_session_error_code() - * MC_DRV_ERR_NOTIFICATION: a problem with the socket occurred - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - */ -__MC_CLIENT_LIB_API enum mc_result mc_wait_notification( - struct mc_session_handle *session, int32_t timeout); - -/** - * mc_malloc_wsm() - Allocate a block of world shared memory (WSM). - * @device_id: The ID of an opened device to retrieve the WSM from. - * @align: The alignment (number of pages) of the memory block - * (e.g. 0x00000001 for 4kb). - * @len: Length of the block in bytes. - * @wsm: Virtual address of the world shared memory block. - * @wsm_flags: Platform specific flags describing the memory to - * be allocated. - * - * The MC driver allocates a contiguous block of memory which can be used as - * WSM. - * This implicates that the allocated memory is aligned according to the - * alignment parameter. - * - * Always returns a buffer of size WSM_SIZE aligned to 4K. - * - * Align and wsm_flags are currently ignored - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_NO_FREE_MEMORY: no more contiguous memory is - * available in this size or for this - * process - */ -__MC_CLIENT_LIB_API enum mc_result mc_malloc_wsm( - uint32_t device_id, - uint32_t align, - uint32_t len, - uint8_t **wsm, - uint32_t wsm_flags -); - -/** - * mc_free_wsm() - Free a block of world shared memory (WSM). - * @device_id: The ID to which the given address belongs - * @wsm: Address of WSM block to be freed - * - * The MC driver will free a block of world shared memory (WSM) previously - * allocated with mc_malloc_wsm(). The caller has to assure that the address - * handed over to the driver is a valid WSM address. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: when device id is invalid - * MC_DRV_ERR_FREE_MEMORY_FAILED: on failure - */ -__MC_CLIENT_LIB_API enum mc_result mc_free_wsm(uint32_t device_id, - uint8_t *wsm); - -/** - *mc_map() - Map additional bulk buffer between a Trustlet Connector (TLC) - * and the Trustlet (TL) for a session - * @session: Session handle with information of the device_id and - * the session_id. The given buffer is mapped to the - * session specified in the sessionHandle - * @buf: Virtual address of a memory portion (relative to TLC) - * to be shared with the Trustlet, already includes a - * possible offset! - * @len: length of buffer block in bytes. - * @map_info: Information structure about the mapped Bulk buffer - * between the TLC (NWd) and the TL (SWd). - * - * Memory allocated in user space of the TLC can be mapped as additional - * communication channel (besides TCI) to the Trustlet. Limitation of the - * Trustlet memory structure apply: only 6 chunks can be mapped with a maximum - * chunk size of 1 MiB each. - * - * It is up to the application layer (TLC) to inform the Trustlet - * about the additional mapped bulk memory. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - * MC_DRV_ERR_BULK_MAPPING: buf is already uses as bulk buffer or - * when registering the buffer failed - */ -__MC_CLIENT_LIB_API enum mc_result mc_map( - struct mc_session_handle *session, void *buf, uint32_t len, - struct mc_bulk_map *map_info); - -/** - * mc_unmap() - Remove additional mapped bulk buffer between Trustlet Connector - * (TLC) and the Trustlet (TL) for a session - * @session: Session handle with information of the device_id and - * the session_id. The given buffer is unmapped from the - * session specified in the sessionHandle. - * @buf: Virtual address of a memory portion (relative to TLC) - * shared with the TL, already includes a possible offset! - * @map_info: Information structure about the mapped Bulk buffer - * between the TLC (NWd) and the TL (SWd) - * - * The bulk buffer will immediately be unmapped from the session context. - * - * The application layer (TLC) must inform the TL about unmapping of the - * additional bulk memory before calling mc_unmap! - * - * The clientlib currently ignores the len field in map_info. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - * MC_DRV_ERR_BULK_UNMAPPING: buf was not registered earlier - * or when unregistering failed - */ -__MC_CLIENT_LIB_API enum mc_result mc_unmap( - struct mc_session_handle *session, void *buf, - struct mc_bulk_map *map_info); - -/* - * mc_get_session_error_code() - Get additional error information of the last - * error that occurred on a session. - * @session: Session handle with information of the device_id and - * the session_id - * @exit_code: >0 Trustlet has terminated itself with this value, - * <0 Trustlet is dead because of an error within the - * MobiCore (e.g. Kernel exception). See also MCI - * definition. - * - * After the request the stored error code will be deleted. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - */ -__MC_CLIENT_LIB_API enum mc_result mc_get_session_error_code( - struct mc_session_handle *session, int32_t *exit_code); - -#endif /* _MOBICORE_DRIVER_API_H_ */ diff --git a/drivers/gud/MobiCoreDriver/scheduler.c b/drivers/gud/MobiCoreDriver/scheduler.c deleted file mode 100644 index 444f839d8ad1d..0000000000000 --- a/drivers/gud/MobiCoreDriver/scheduler.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "main.h" -#include "fastcall.h" -#include "debug.h" -#include "logging.h" -#include "mcp.h" -#include "scheduler.h" - -#define SCHEDULING_FREQ 5 /**< N-SIQ every n-th time */ - -static struct sched_ctx { - struct task_struct *thread; - bool thread_run; - struct completion idle_complete; /* Unblock scheduler thread */ - struct completion sleep_complete; /* Wait for sleep status */ - struct mutex sleep_mutex; /* Protect sleep request */ - struct mutex request_mutex; /* Protect all below */ - /* The order of this enum matters */ - enum { - NONE, /* No specific request */ - YIELD, /* Run the SWd */ - NSIQ, /* Schedule the SWd */ - SUSPEND, /* Suspend the SWd */ - RESUME, /* Resume the SWd */ - } request; - bool suspended; -} sched_ctx; - -static int mc_scheduler_command(int command) -{ - if (IS_ERR_OR_NULL(sched_ctx.thread)) - return -EFAULT; - - mutex_lock(&sched_ctx.request_mutex); - if (sched_ctx.request < command) { - sched_ctx.request = command; - complete(&sched_ctx.idle_complete); - } - - mutex_unlock(&sched_ctx.request_mutex); - return 0; -} - -static int mc_scheduler_pm_command(int command) -{ - int ret = -EPERM; - - if (IS_ERR_OR_NULL(sched_ctx.thread)) - return -EFAULT; - - mutex_lock(&sched_ctx.sleep_mutex); - - /* Send request */ - mc_scheduler_command(command); - - /* Wait for scheduler to reply */ - wait_for_completion(&sched_ctx.sleep_complete); - mutex_lock(&sched_ctx.request_mutex); - if (command == SUSPEND) { - if (sched_ctx.suspended) - ret = 0; - } else { - if (!sched_ctx.suspended) - ret = 0; - } - - mutex_unlock(&sched_ctx.request_mutex); - - mutex_unlock(&sched_ctx.sleep_mutex); - return ret; -} - -static int mc_dev_command(enum mcp_scheduler_commands command) -{ - switch (command) { - case MCP_YIELD: - return mc_scheduler_command(YIELD); - case MCP_NSIQ: - return mc_scheduler_command(NSIQ); - } - - return -EINVAL; -} - -int mc_scheduler_suspend(void) -{ - return mc_scheduler_pm_command(SUSPEND); -} - -int mc_scheduler_resume(void) -{ - return mc_scheduler_pm_command(RESUME); -} - -/* - * This thread, and only this thread, schedules the SWd. Hence, reading the idle - * status and its associated timeout is safe from race conditions. - */ -static int tee_scheduler(void *arg) -{ - int timeslice = 0; /* Actually scheduling period */ - int ret = 0; - - MCDRV_DBG("enter"); - while (1) { - int32_t timeout_ms = -1; - bool pm_request = false; - - if (sched_ctx.suspended || mcp_get_idle_timeout(&timeout_ms)) { - /* If timeout is 0 we keep scheduling the SWd */ - if (!timeout_ms) - mc_scheduler_command(NSIQ); - else if (timeout_ms < 0) - wait_for_completion(&sched_ctx.idle_complete); - else if (!wait_for_completion_timeout( - &sched_ctx.idle_complete, - msecs_to_jiffies(timeout_ms))) - /* Timed out, force SWd schedule */ - mc_scheduler_command(NSIQ); - } - - if (kthread_should_stop() || !sched_ctx.thread_run) - break; - - /* Get requested command if any */ - mutex_lock(&sched_ctx.request_mutex); - if (sched_ctx.request == YIELD) - /* Yield forced: increment timeslice */ - timeslice++; - else if (sched_ctx.request >= NSIQ) { - /* Force N_SIQ, also to suspend/resume SWd */ - timeslice = 0; - if (sched_ctx.request == SUSPEND) { - mcp_suspend(); - pm_request = true; - } else if (sched_ctx.request == RESUME) { - mcp_resume(); - pm_request = true; - } - } - - sched_ctx.request = NONE; - mutex_unlock(&sched_ctx.request_mutex); - - /* Reset timeout so we don't loop if SWd halted */ - mcp_reset_idle_timeout(); - if (timeslice--) { - /* Resume SWd from where it was */ - ret = mc_fc_yield(); - } else { - timeslice = SCHEDULING_FREQ; - /* Call SWd scheduler */ - ret = mc_fc_nsiq(); - } - - /* Always flush log buffer after the SWd has run */ - mc_logging_run(); - if (ret) - break; - - /* Should have suspended by now if requested */ - mutex_lock(&sched_ctx.request_mutex); - if (pm_request) { - sched_ctx.suspended = mcp_suspended(); - complete(&sched_ctx.sleep_complete); - } - - mutex_unlock(&sched_ctx.request_mutex); - - /* Flush pending notifications if possible */ - if (mcp_notifications_flush()) - complete(&sched_ctx.idle_complete); - } - - MCDRV_DBG("exit, ret is %d", ret); - return ret; -} - -int mc_scheduler_start(void) -{ - sched_ctx.thread_run = true; - sched_ctx.thread = kthread_run(tee_scheduler, NULL, "tee_scheduler"); - if (IS_ERR(sched_ctx.thread)) { - MCDRV_ERROR("tee_scheduler thread creation failed"); - return PTR_ERR(sched_ctx.thread); - } - - mcp_register_scheduler(mc_dev_command); - complete(&sched_ctx.idle_complete); - return 0; -} - -void mc_scheduler_stop(void) -{ - mcp_register_scheduler(NULL); - sched_ctx.thread_run = false; - complete(&sched_ctx.idle_complete); - kthread_stop(sched_ctx.thread); -} - -int mc_scheduler_init(void) -{ - init_completion(&sched_ctx.idle_complete); - init_completion(&sched_ctx.sleep_complete); - mutex_init(&sched_ctx.sleep_mutex); - mutex_init(&sched_ctx.request_mutex); - return 0; -} diff --git a/drivers/gud/MobiCoreDriver/scheduler.h b/drivers/gud/MobiCoreDriver/scheduler.h deleted file mode 100644 index c3c17f1c9017c..0000000000000 --- a/drivers/gud/MobiCoreDriver/scheduler.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __MC_SCHEDULER_H__ -#define __MC_SCHEDULER_H__ - -int mc_scheduler_init(void); -static inline void mc_scheduler_exit(void) {} -int mc_scheduler_start(void); -void mc_scheduler_stop(void); -int mc_scheduler_suspend(void); -int mc_scheduler_resume(void); - -#endif /* __MC_SCHEDULER_H__ */ diff --git a/drivers/gud/MobiCoreDriver/session.c b/drivers/gud/MobiCoreDriver/session.c deleted file mode 100644 index 1dbb8900b2b3a..0000000000000 --- a/drivers/gud/MobiCoreDriver/session.c +++ /dev/null @@ -1,779 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "platform.h" /* MC_UIDGID_OLDSTYLE */ -#include "main.h" -#include "debug.h" -#include "mmu.h" -#include "mcp.h" -#include "client.h" /* *cbuf* */ -#include "session.h" -#include "mci/mcimcp.h" - -#define SHA1_HASH_SIZE 20 - -struct tbase_wsm { - /* Buffer NWd addr (uva or kva, used only for lookup) */ - uintptr_t va; - /* buffer length */ - uint32_t len; - /* Buffer SWd addr */ - uint32_t sva; - /* mmu L2 table */ - struct tbase_mmu *mmu; - /* possibly a pointer to a cbuf */ - struct tbase_cbuf *cbuf; - /* list node */ - struct list_head list; -}; - -/* - * Postponed closing for GP TAs. - * Implemented as a worker because cannot be executed from within isr_worker. - */ -static void session_close_worker(struct work_struct *work) -{ - struct mcp_session *mcp_session; - struct tbase_session *session; - - mcp_session = container_of(work, struct mcp_session, close_work); - session = container_of(mcp_session, struct tbase_session, mcp_session); - session_close(session); -} - -/* Forward declarations */ -static struct tbase_wsm *wsm_create(struct tbase_session *session, - uintptr_t buf, uint32_t len); -static void wsm_free(struct tbase_wsm *wsm); - -static int hash_path_and_data(char *hash, const void *data, - unsigned int data_len) -{ - struct mm_struct *mm = current->mm; - struct hash_desc desc; - struct scatterlist sg; - char *buf; - char *path; - unsigned int path_len; - int ret = 0; - - buf = (char *)__get_free_page(GFP_KERNEL); - if (!buf) - return -ENOMEM; - - down_read(&mm->mmap_sem); - if (!mm->exe_file) { - ret = -ENOENT; - goto end; - } - - path = d_path(&mm->exe_file->f_path, buf, PAGE_SIZE); - if (IS_ERR(path)) { - ret = PTR_ERR(path); - goto end; - } - - MCDRV_DBG("current process path = "); - { - char *c; - - for (c = path; *c; c++) - MCDRV_DBG("%c %d", *c, *c); - } - - path_len = strnlen(path, PAGE_SIZE); - MCDRV_DBG("path_len = %u", path_len); - desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC); - if (IS_ERR(desc.tfm)) { - ret = PTR_ERR(desc.tfm); - MCDRV_DBG("could not alloc hash = %d", ret); - goto end; - } - - desc.flags = 0; - sg_init_one(&sg, path, path_len); - crypto_hash_init(&desc); - crypto_hash_update(&desc, &sg, path_len); - if (data) { - MCDRV_DBG("current process path: hashing additional data\n"); - sg_init_one(&sg, data, data_len); - crypto_hash_update(&desc, &sg, data_len); - } - - crypto_hash_final(&desc, hash); - crypto_free_hash(desc.tfm); - -end: - up_read(&mm->mmap_sem); - free_page((unsigned long)buf); - - return ret; -} - -static int check_prepare_identity(const struct mc_identity *identity, - struct identity *mcp_identity) -{ - struct mc_identity *mcp_id = (struct mc_identity *)mcp_identity; - uint8_t hash[SHA1_HASH_SIZE]; - bool application = false; - const void *data; - unsigned int data_len; - - /* Mobicore doesn't support GP client authentication. */ - if (!g_ctx.f_client_login && - (identity->login_type != TEEC_LOGIN_PUBLIC)) { - MCDRV_DBG_WARN("Unsupported login type %d", - identity->login_type); - return -EINVAL; - } - - /* Copy login type */ - mcp_identity->login_type = identity->login_type; - - /* Fill in uid field */ - if ((identity->login_type == TEEC_LOGIN_USER) || - (identity->login_type == TEEC_LOGIN_USER_APPLICATION)) { - /* Set euid and ruid of the process. */ -#if !defined(KUIDT_INIT) || defined(MC_UIDGID_OLDSTYLE) - mcp_id->uid.euid = current_euid(); - mcp_id->uid.ruid = current_uid(); -#else - mcp_id->uid.euid = current_euid().val; - mcp_id->uid.ruid = current_uid().val; -#endif - } - - /* Check gid field */ - if ((identity->login_type == TEEC_LOGIN_GROUP) || - (identity->login_type == TEEC_LOGIN_GROUP_APPLICATION)) { -#if !defined(KUIDT_INIT) || defined(MC_UIDGID_OLDSTYLE) - gid_t gid = identity->gid; -#else - kgid_t gid = { - .val = identity->gid, - }; -#endif - /* Check if gid is one of: egid of the process, its rgid or one - * of its supplementary groups */ - if (!in_egroup_p(gid) && !in_group_p(gid)) { - MCDRV_DBG("group %d not allowed", identity->gid); - return -EACCES; - } - - MCDRV_DBG("group %d found", identity->gid); - mcp_id->gid = identity->gid; - } - - switch (identity->login_type) { - case TEEC_LOGIN_PUBLIC: - case TEEC_LOGIN_USER: - case TEEC_LOGIN_GROUP: - break; - case TEEC_LOGIN_APPLICATION: - application = true; - data = NULL; - data_len = 0; - break; - case TEEC_LOGIN_USER_APPLICATION: - application = true; - data = &mcp_id->uid; - data_len = sizeof(mcp_id->uid); - break; - case TEEC_LOGIN_GROUP_APPLICATION: - application = true; - data = &identity->gid; - data_len = sizeof(identity->gid); - break; - default: - /* Any other login_type value is invalid. */ - MCDRV_DBG_WARN("Invalid login type"); - return -EINVAL; - } - - if (application) { - if (hash_path_and_data(hash, data, data_len)) { - MCDRV_DBG("error in hash calculation"); - return -EAGAIN; - } - - memcpy(&mcp_id->login_data, hash, sizeof(mcp_id->login_data)); - } - - return 0; -} - -/* - * Create a session object. - * Note: object is not attached to client yet. - */ -struct tbase_session *session_create(struct tbase_client *client, bool is_gp, - struct mc_identity *identity) -{ - struct tbase_session *session; - struct identity mcp_identity; - - if (is_gp) { - /* Check identity method and data. */ - int ret = check_prepare_identity(identity, &mcp_identity); - - if (ret) - return ERR_PTR(ret); - } - - /* Allocate session object */ - session = kzalloc(sizeof(*session), GFP_KERNEL); - if (!session) - return ERR_PTR(-ENOMEM); - - mutex_init(&session->close_lock); - /* Initialise object members */ - mcp_session_init(&session->mcp_session, is_gp, &mcp_identity); - INIT_WORK(&session->mcp_session.close_work, session_close_worker); - session->client = client; - kref_init(&session->kref); - INIT_LIST_HEAD(&session->list); - mutex_init(&session->wsms_lock); - INIT_LIST_HEAD(&session->wsms); - MCDRV_DBG("created session %p: client %p", session, session->client); - return session; -} - -int session_open(struct tbase_session *session, const struct tbase_object *obj, - const struct tbase_mmu *obj_mmu, uintptr_t tci, size_t len) -{ - struct mcp_buffer_map map; - - tbase_mmu_buffer(obj_mmu, &map); - /* Create wsm object for tci */ - if (tci && len) { - struct tbase_wsm *wsm; - struct mcp_buffer_map tci_map; - int ret = 0; - - mutex_lock(&session->wsms_lock); - wsm = wsm_create(session, tci, len); - if (IS_ERR(wsm)) - ret = PTR_ERR(wsm); - - mutex_unlock(&session->wsms_lock); - if (ret) - return ret; - - tbase_mmu_buffer(wsm->mmu, &tci_map); - ret = mcp_open_session(&session->mcp_session, obj, &map, - &tci_map); - if (ret) { - mutex_lock(&session->wsms_lock); - wsm_free(wsm); - mutex_unlock(&session->wsms_lock); - } - - return ret; - } - - if (tci || len) { - MCDRV_ERROR("Tci pointer and length are incoherent"); - return -EINVAL; - } - - return mcp_open_session(&session->mcp_session, obj, &map, NULL); -} - -/* - * Close TA and unreference session object. - * Object will be freed if reference reaches 0. - * Session object is assumed to have been removed from main list, which means - * that session_close cannot be called anymore. - */ -int session_close(struct tbase_session *session) -{ - int ret = 0; - - if (!session) - return -ENXIO; - - mutex_lock(&session->close_lock); - switch (mcp_close_session(&session->mcp_session)) { - case 0: - /* TA is closed, remove from closing list */ - mutex_lock(&g_ctx.closing_lock); - list_del(&session->list); - mutex_unlock(&g_ctx.closing_lock); - /* Remove the ref we took on creation, exit if session freed */ - if (session_put(session)) - return 0; - - break; - case -EBUSY: - /* - * (GP) TA needs time to close. The "TA closed" notification - * will trigger a new call to session_close(). - * Return OK but do not unref. - */ - break; - default: - MCDRV_ERROR("Failed to close session %x in SWd", - session->mcp_session.id); - ret = -EPERM; - } - - mutex_unlock(&session->close_lock); - return ret; -} - -/* - * Free session object and all objects it contains (wsm). - */ -static void session_free(struct kref *kref) -{ - struct tbase_session *session; - struct tbase_wsm *wsm, *next; - - /* Remove remaining shared buffers (unmapped in SWd by mcp_close) */ - session = container_of(kref, struct tbase_session, kref); - list_for_each_entry_safe(wsm, next, &session->wsms, list) { - MCDRV_DBG("session %p: free wsm %p", session, wsm); - wsm_free(wsm); - } - - MCDRV_DBG("freed session %p: client %p id %x", - session, session->client, session->mcp_session.id); - kfree(session); -} - -/* - * Unreference session. - * Free session object if reference reaches 0. - */ -int session_put(struct tbase_session *session) -{ - return kref_put(&session->kref, session_free); -} - -/* - * Send a notification to TA - */ -int session_notify_swd(struct tbase_session *session) -{ - if (!session) { - MCDRV_ERROR("Session pointer is null"); - return -EINVAL; - } - - return mcp_notify(&session->mcp_session); -} - -/* - * Read and clear last notification received from TA - */ -int32_t session_exitcode(struct tbase_session *session) -{ - return mcp_session_exitcode(&session->mcp_session); -} - -/* - * Free a WSM object - */ -static void wsm_free(struct tbase_wsm *wsm) -{ - /* Remove wsm from its parent session's list */ - list_del(&wsm->list); - /* Free MMU table */ - if (!IS_ERR_OR_NULL(wsm->mmu)) - tbase_mmu_delete(wsm->mmu); - - /* Unref cbuf if applicable */ - if (wsm->cbuf) - tbase_cbuf_put(wsm->cbuf); - - /* Delete wsm object */ - MCDRV_DBG("freed wsm %p: mmu %p cbuf %p va %lx len %u", - wsm, wsm->mmu, wsm->cbuf, wsm->va, wsm->len); - kfree(wsm); -} - -static struct tbase_wsm *wsm_create(struct tbase_session *session, - uintptr_t buf, uint32_t len) -{ - struct tbase_wsm *wsm; - struct task_struct *task = NULL; - uintptr_t va; - int ret; - - /* Allocate structure */ - wsm = kzalloc(sizeof(*wsm), GFP_KERNEL); - if (!wsm) { - ret = -ENOMEM; - goto err_no_wsm; - } - - /* Add wsm to list so destroy can find it */ - list_add(&wsm->list, &session->wsms); - - /* Check if buffer is contained in a cbuf */ - wsm->cbuf = tbase_cbuf_get_by_addr(session->client, buf); - if (wsm->cbuf) { - uintptr_t offset; - - if (client_is_kernel(session->client)) - offset = buf - tbase_cbuf_addr(wsm->cbuf); - else - offset = buf - tbase_cbuf_uaddr(wsm->cbuf); - - if ((offset + len) > tbase_cbuf_len(wsm->cbuf)) { - ret = -EINVAL; - MCDRV_ERROR("crosses cbuf boundary"); - goto err; - } - /* Provide kernel virtual address */ - va = tbase_cbuf_addr(wsm->cbuf) + offset; - } else { - /* Not a cbuf. va is uva or kva depending on client. */ - /* Provide "task" if client is user */ - va = buf; - if (!client_is_kernel(session->client)) - task = current; - } - - /* Build MMU table for buffer */ - wsm->mmu = tbase_mmu_create(task, (void *)va, len); - if (IS_ERR(wsm->mmu)) { - ret = PTR_ERR(wsm->mmu); - goto err; - } - - wsm->va = buf; - wsm->len = len; - MCDRV_DBG("created wsm %p: mmu %p cbuf %p va %lx len %u", - wsm, wsm->mmu, wsm->cbuf, wsm->va, wsm->len); - goto end; - -err: - wsm_free(wsm); -err_no_wsm: - wsm = ERR_PTR(ret); -end: - return wsm; -} - -static inline int wsm_check(struct tbase_session *session, - struct mc_ioctl_buffer *buf) -{ - struct tbase_wsm *wsm; - - list_for_each_entry(wsm, &session->wsms, list) { - if ((buf->va < (wsm->va + wsm->len)) && - ((buf->va + buf->len) > wsm->va)) { - MCDRV_ERROR("buffer %lx overlaps with existing wsm", - wsm->va); - return -EADDRINUSE; - } - } - - return 0; -} - -static inline struct tbase_wsm *wsm_find(struct tbase_session *session, - uintptr_t va) -{ - struct tbase_wsm *wsm; - - list_for_each_entry(wsm, &session->wsms, list) - if (wsm->va == va) - return wsm; - - return NULL; -} - -static inline int wsm_info(struct tbase_wsm *wsm, struct kasnprintf_buf *buf) -{ - ssize_t ret; - - ret = kasnprintf(buf, "\t\twsm %p: mmu %p cbuf %p va %lx len %u\n", - wsm, wsm->mmu, wsm->cbuf, wsm->va, wsm->len); - if (ret < 0) - return ret; - - if (wsm->mmu) { - ret = tbase_mmu_info(wsm->mmu, buf); - if (ret < 0) - return ret; - } - - return 0; -} - -/* - * Share buffers with SWd and add corresponding WSM objects to session. - */ -int session_wsms_add(struct tbase_session *session, - struct mc_ioctl_buffer *bufs) -{ - struct mc_ioctl_buffer *buf; - struct mcp_buffer_map maps[MC_MAP_MAX]; - struct mcp_buffer_map *map; - int i, ret = 0; - uint32_t n_null_buf = 0; - - /* Check parameters */ - if (!session) - return -ENXIO; - - /* Lock the session */ - mutex_lock(&session->wsms_lock); - - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - if (!buf->va) { - n_null_buf++; - continue; - } - - /* Avoid mapping overlaps */ - if (wsm_check(session, buf)) { - ret = -EADDRINUSE; - MCDRV_ERROR("maps[%d] va=%llx already map'd", i, - buf->va); - goto unlock; - } - } - - if (n_null_buf >= MC_MAP_MAX) { - ret = -EINVAL; - MCDRV_ERROR("va=NULL"); - goto unlock; - } - - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - struct tbase_wsm *wsm; - - if (!buf->va) { - map->type = WSM_INVALID; - continue; - } - - wsm = wsm_create(session, buf->va, buf->len); - if (IS_ERR(wsm)) { - ret = PTR_ERR(wsm); - MCDRV_ERROR("maps[%d] va=%llx create failed: %d", i, - buf->va, ret); - goto end; - } - - tbase_mmu_buffer(wsm->mmu, map); - MCDRV_DBG("maps[%d] va=%llx: t:%u a:%llx o:%u l:%u", i, buf->va, - map->type, map->phys_addr, map->offset, map->length); - } - - /* Map buffers */ - if (g_ctx.f_multimap) { - /* Send MCP message to map buffers in SWd */ - ret = mcp_multimap(session->mcp_session.id, maps); - if (ret) - MCDRV_ERROR("multimap failed: %d", ret); - } else { - /* Map each buffer */ - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, - map++) { - if (!buf->va) - continue; - - /* Send MCP message to map buffer in SWd */ - ret = mcp_map(session->mcp_session.id, map); - if (ret) { - MCDRV_ERROR("maps[%d] va=%llx map failed: %d", - i, buf->va, ret); - break; - } - } - } - -end: - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - struct tbase_wsm *wsm = wsm_find(session, buf->va); - - if (!buf->va) - continue; - - if (ret) { - if (!wsm) - break; - - /* Destroy mapping */ - wsm_free(wsm); - } else { - /* Store mapping */ - buf->sva = map->secure_va; - wsm->sva = buf->sva; - MCDRV_DBG("maps[%d] va=%llx map'd len=%u sva=%llx", - i, buf->va, buf->len, buf->sva); - } - } - -unlock: - /* Unlock the session */ - mutex_unlock(&session->wsms_lock); - return ret; -} - -/* - * Stop sharing buffers and delete corrsponding WSM objects. - */ -int session_wsms_remove(struct tbase_session *session, - const struct mc_ioctl_buffer *bufs) -{ - const struct mc_ioctl_buffer *buf; - struct mcp_buffer_map maps[MC_MAP_MAX]; - struct mcp_buffer_map *map; - int i, ret = 0; - uint32_t n_null_buf = 0; - - if (!session) { - MCDRV_ERROR("session pointer is null"); - return -EINVAL; - } - - /* Lock the session */ - mutex_lock(&session->wsms_lock); - - /* Find, check and map buffer */ - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - struct tbase_wsm *wsm; - - if (!buf->va) { - n_null_buf++; - map->secure_va = 0; - continue; - } - - wsm = wsm_find(session, buf->va); - if (!wsm) { - ret = -EADDRNOTAVAIL; - MCDRV_ERROR("maps[%d] va=%llx not found", i, - buf->va); - goto out; - } - - /* Check input params consistency */ - /* TODO: fix the spec, "len" is NOT ignored anymore */ - if ((wsm->sva != buf->sva) || (wsm->len != buf->len)) { - MCDRV_ERROR("maps[%d] va=%llx no match: %x != %llx", - i, buf->va, wsm->sva, buf->sva); - MCDRV_ERROR("maps[%d] va=%llx no match: %u != %u", - i, buf->va, wsm->len, buf->len); - ret = -EINVAL; - goto out; - } - - tbase_mmu_buffer(wsm->mmu, map); - map->secure_va = buf->sva; - MCDRV_DBG("maps[%d] va=%llx: t:%u a:%llx o:%u l:%u s:%llx", i, - buf->va, map->type, map->phys_addr, map->offset, - map->length, map->secure_va); - } - - if (n_null_buf >= MC_MAP_MAX) { - ret = -EINVAL; - MCDRV_ERROR("va=NULL"); - goto out; - } - - if (g_ctx.f_multimap) { - /* Send MCP command to unmap buffers in SWd */ - ret = mcp_multiunmap(session->mcp_session.id, maps); - if (ret) - MCDRV_ERROR("mcp_multiunmap failed: %d", ret); - } else { - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; - i++, buf++, map++) { - if (!buf->va) - continue; - - /* Send MCP command to unmap buffer in SWd */ - ret = mcp_unmap(session->mcp_session.id, map); - if (ret) { - MCDRV_ERROR("maps[%d] va=%llx unmap failed: %d", - i, buf->va, ret); - break; - } - } - } - - for (i = 0, buf = bufs; i < MC_MAP_MAX; i++, buf++) { - struct tbase_wsm *wsm = wsm_find(session, buf->va); - - if (!wsm) - break; - - /* Free wsm */ - wsm_free(wsm); - MCDRV_DBG("maps[%d] va=%llx unmap'd len=%u sva=%llx", i, - buf->va, buf->len, buf->sva); - } - -out: - mutex_unlock(&session->wsms_lock); - return ret; -} - -/* - * Sleep until next notification from SWd. - */ -int session_waitnotif(struct tbase_session *session, int32_t timeout) -{ - return mcp_session_waitnotif(&session->mcp_session, timeout); -} - -int session_info(struct tbase_session *session, struct kasnprintf_buf *buf) -{ - struct tbase_wsm *wsm; - int32_t exit_code = mcp_session_exitcode(&session->mcp_session); - int ret; - - ret = kasnprintf(buf, "\tsession %p: %x rc %d\n", session, - session->mcp_session.id, exit_code); - if (ret < 0) - return ret; - - /* WMSs */ - mutex_lock(&session->wsms_lock); - if (list_empty(&session->wsms)) - goto done; - - list_for_each_entry(wsm, &session->wsms, list) { - ret = wsm_info(wsm, buf); - if (ret < 0) - goto done; - } - -done: - mutex_unlock(&session->wsms_lock); - if (ret < 0) - return ret; - - return 0; -} diff --git a/drivers/gud/MobiCoreDriver/session.h b/drivers/gud/MobiCoreDriver/session.h deleted file mode 100644 index aec0c09ae9c9a..0000000000000 --- a/drivers/gud/MobiCoreDriver/session.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _SESSION_H_ -#define _SESSION_H_ - -#include - -#include "mcp.h" - -struct tbase_object; -struct tbase_mmu; -struct mc_ioctl_buffer; - -struct tbase_session { - /* Session list lock */ - struct mutex close_lock; - /* MCP session descriptor (MUST BE FIRST) */ - struct mcp_session mcp_session; - /* Owner */ - struct tbase_client *client; - /* Number of references kept to this object */ - struct kref kref; - /* The list entry to attach to session list of owner */ - struct list_head list; - /* Session WSMs lock */ - struct mutex wsms_lock; - /* List of WSMs for a session */ - struct list_head wsms; -}; - -struct tbase_session *session_create(struct tbase_client *client, bool is_gp, - struct mc_identity *identity); -int session_open(struct tbase_session *session, const struct tbase_object *obj, - const struct tbase_mmu *obj_mmu, uintptr_t tci, size_t len); -int session_close(struct tbase_session *session); -static inline void session_get(struct tbase_session *session) -{ - kref_get(&session->kref); -} - -int session_put(struct tbase_session *session); -int session_wsms_add(struct tbase_session *session, - struct mc_ioctl_buffer *bufs); -int session_wsms_remove(struct tbase_session *session, - const struct mc_ioctl_buffer *bufs); -int32_t session_exitcode(struct tbase_session *session); -int session_notify_swd(struct tbase_session *session); -int session_waitnotif(struct tbase_session *session, int32_t timeout); -int session_info(struct tbase_session *session, struct kasnprintf_buf *buf); - -#endif /* _SESSION_H_ */ diff --git a/drivers/gud/setupDrivers.sh b/drivers/gud/setupDrivers.sh deleted file mode 100644 index 994e83e8d9517..0000000000000 --- a/drivers/gud/setupDrivers.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -export COMP_PATH_ROOT=$(dirname $(readlink -f $BASH_SOURCE)) #set this to the absolute path of the folder containing this file - -# This part has to be set by the customer -# To be set, absolute path of kernel folder -export LINUX_PATH= -# To be set, absolute path! CROSS_COMPILE variable needed by kernel eg /home/user/arm-2009q3/bin/arm-none-linux-gnueabi- -export CROSS_COMPILE= -# To be set, build mode debug or release -export MODE=debug -# To be set, the absolute path to the Linux Android NDK -export NDK_PATH= - -# Global variables needed by build scripts -export COMP_PATH_Logwrapper=$COMP_PATH_ROOT/Logwrapper/Out -export COMP_PATH_MobiCore=$COMP_PATH_ROOT/MobiCore/Out -export COMP_PATH_MobiCoreDriverMod=$COMP_PATH_ROOT/mobicore_driver/Out -export COMP_PATH_MobiCoreDriverLib=$COMP_PATH_ROOT/daemon/Out -export COMP_PATH_AndroidNdkLinux=$NDK_PATH From 04c1d98d354c257558574b91350576705423507e Mon Sep 17 00:00:00 2001 From: Trudy Shearer Date: Mon, 22 May 2017 12:33:15 +0100 Subject: [PATCH 0838/1015] defconfig : gud: Remove gud driver Disable and remove gud mobicore driver. Change-Id: Ia16bc3e1331f86724a391fd367587b56ccc14546 Acked-by: Tony Hamilton Signed-off-by: Trudy Shearer --- arch/arm64/configs/msm-auto_defconfig | 1 - arch/arm64/configs/msm_defconfig | 1 - 2 files changed, 2 deletions(-) diff --git a/arch/arm64/configs/msm-auto_defconfig b/arch/arm64/configs/msm-auto_defconfig index 57dcb9b175601..05ab497f2b095 100644 --- a/arch/arm64/configs/msm-auto_defconfig +++ b/arch/arm64/configs/msm-auto_defconfig @@ -597,7 +597,6 @@ CONFIG_CORESIGHT_REMOTE_ETM=y CONFIG_CORESIGHT_QPDI=y CONFIG_SENSORS_SSC=y CONFIG_MSM_TZ_LOG=y -CONFIG_MOBICORE_DRIVER=m CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT3_FS=y diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index 257f650f74fb1..c56c4af32672b 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -600,7 +600,6 @@ CONFIG_CORESIGHT_REMOTE_ETM=y CONFIG_CORESIGHT_QPDI=y CONFIG_SENSORS_SSC=y CONFIG_MSM_TZ_LOG=y -CONFIG_MOBICORE_DRIVER=m CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT3_FS=y From 5ab5a033a40871d07f3499be65116bf19ed3dfee Mon Sep 17 00:00:00 2001 From: Rajkumar Subbiah Date: Mon, 15 May 2017 15:17:14 -0400 Subject: [PATCH 0839/1015] msm: mdss: Fix potential dereferencing of null pointer During atomic commit on a writeback panel, there is a possibility of deferencing a NULL pointer if the configuration changes before the commit. This change adds a NULL pointer check to avoid it. Change-Id: I56d0efad40992b6f87c81e5eab93cf0f24f6f524 Signed-off-by: Rajkumar Subbiah --- drivers/video/msm/mdss/mdss_fb.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index 2f65a082918ef..402c1198a54de 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -3239,6 +3239,10 @@ int mdss_fb_atomic_commit(struct fb_info *info, MSMFB_ATOMIC_COMMIT, true, false); if (mfd->panel.type == WRITEBACK_PANEL) { output_layer = commit_v1->output_layer; + if (!output_layer) { + pr_err("Output layer is null\n"); + goto end; + } wb_change = !mdss_fb_is_wb_config_same(mfd, commit_v1->output_layer); if (wb_change) { From 16bae03d9a3ba95a9b7a32f83ce3c10f8e2c8854 Mon Sep 17 00:00:00 2001 From: Sai Krishna Juturi Date: Wed, 17 May 2017 11:06:35 +0530 Subject: [PATCH 0840/1015] usb : dwc3: Initialize kernel stack variables properly If kernel stack variables are not initialized properly, there is a chance of kernel information disclosure. So, initialize kernel stack variables with null characters. CRs-fixed: 2042592 Change-Id: I213c0e5c7f67824c2cecace276ff2f8f81599d51 Signed-off-by: Sai Krishna Juturi --- drivers/usb/dwc3/debugfs.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c index f040026fe8448..b8a161d61625c 100644 --- a/drivers/usb/dwc3/debugfs.c +++ b/drivers/usb/dwc3/debugfs.c @@ -402,7 +402,7 @@ static ssize_t dwc3_mode_write(struct file *file, struct dwc3 *dwc = s->private; unsigned long flags; u32 mode = 0; - char buf[32]; + char buf[32] = {0}; if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) return -EFAULT; @@ -482,7 +482,7 @@ static ssize_t dwc3_testmode_write(struct file *file, struct dwc3 *dwc = s->private; unsigned long flags; u32 testmode = 0; - char buf[32]; + char buf[32] = {0}; if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) return -EFAULT; @@ -589,7 +589,7 @@ static ssize_t dwc3_link_state_write(struct file *file, struct dwc3 *dwc = s->private; unsigned long flags; enum dwc3_link_state state = 0; - char buf[32]; + char buf[32] = {0}; if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) return -EFAULT; @@ -630,12 +630,10 @@ static ssize_t dwc3_store_ep_num(struct file *file, const char __user *ubuf, { struct seq_file *s = file->private_data; struct dwc3 *dwc = s->private; - char kbuf[10]; + char kbuf[10] = {0}; unsigned int num, dir, temp; unsigned long flags; - memset(kbuf, 0, 10); - if (copy_from_user(kbuf, ubuf, count > 10 ? 10 : count)) return -EFAULT; From 84c1cce64eb25eb19352d0101893383e8524eba8 Mon Sep 17 00:00:00 2001 From: Gopikrishnaiah Anandan Date: Tue, 16 May 2017 19:02:18 -0700 Subject: [PATCH 0841/1015] msm: mdss: Clean-up payload for unsupported versions When 32 bit process calls the post processing ioctls compat layer functions will be called. If post processing version is not supported payload needs to be freed. Change adds support for clean-up. Change-Id: Ib3c4d60b858ddd952a3906946458aa2bf2c69076 Signed-off-by: Gopikrishnaiah Anandan --- drivers/video/msm/mdss/mdss_compat_utils.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_compat_utils.c b/drivers/video/msm/mdss/mdss_compat_utils.c index f599bb5b445fa..d72cbb8bf8c66 100644 --- a/drivers/video/msm/mdss/mdss_compat_utils.c +++ b/drivers/video/msm/mdss/mdss_compat_utils.c @@ -3487,6 +3487,7 @@ static int __copy_layer_pp_info_igc_params( compat_ptr(pp_info32->igc_cfg.c0_c1_data); pp_info->igc_cfg.c2_data = compat_ptr(pp_info32->igc_cfg.c2_data); + kfree(cfg_payload); cfg_payload = NULL; break; } @@ -3559,6 +3560,7 @@ static int __copy_layer_pp_info_hist_lut_params( pp_info->hist_lut_cfg.len = pp_info32->hist_lut_cfg.len; pp_info->hist_lut_cfg.data = compat_ptr(pp_info32->hist_lut_cfg.data); + kfree(cfg_payload); cfg_payload = NULL; break; } @@ -3648,6 +3650,7 @@ static int __copy_layer_pp_info_pa_v2_params( break; default: pr_debug("version invalid\n"); + kfree(cfg_payload); cfg_payload = NULL; break; } @@ -3731,6 +3734,7 @@ static int __copy_layer_pp_info_pcc_params( break; default: pr_debug("version invalid, fallback to legacy\n"); + kfree(cfg_payload); cfg_payload = NULL; break; } From efe12baa3f3dd50d5b1f9d3ba04609d33a995a06 Mon Sep 17 00:00:00 2001 From: Xiaoyu Ye Date: Fri, 12 May 2017 16:09:01 -0700 Subject: [PATCH 0842/1015] ASoC: msm-cpe: Fix range checking in function fw_name_store The range checking between "WCD_CPE_IMAGE_FNAME_MAX" and "copy_count" is off-by-one due to the size of array "core->dyn_fname" is "WCD_CPE_IMAGE_FNAME_MAX". Subtract one from the range checking to fix this issue. Change-Id: I87fd55206f79ad7b13c3878f6642bf5579303b17 Signed-off-by: Xiaoyu Ye --- sound/soc/codecs/wcd_cpe_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/codecs/wcd_cpe_core.c b/sound/soc/codecs/wcd_cpe_core.c index 276947970ed1d..8209137d6e809 100644 --- a/sound/soc/codecs/wcd_cpe_core.c +++ b/sound/soc/codecs/wcd_cpe_core.c @@ -1731,10 +1731,10 @@ static ssize_t fw_name_store(struct wcd_cpe_core *core, if (pos) copy_count = pos - buf; - if (copy_count > WCD_CPE_IMAGE_FNAME_MAX) { + if (copy_count > (WCD_CPE_IMAGE_FNAME_MAX - 1)) { dev_err(core->dev, "%s: Invalid length %d, max allowed %d\n", - __func__, copy_count, WCD_CPE_IMAGE_FNAME_MAX); + __func__, copy_count, WCD_CPE_IMAGE_FNAME_MAX - 1); return -EINVAL; } From 40714343715bf8d5847aeb5d83adad329e5c0345 Mon Sep 17 00:00:00 2001 From: Shantanu Jain Date: Wed, 10 May 2017 11:20:42 +0530 Subject: [PATCH 0843/1015] input: synaptics_dsx: remove unused synaptics touch screen driver files Remove unused Synaptics DSX touch screen driver files as these are not used in any of the latest targets. Change-Id: I0cc19825691c92fee1c5b71ff7e9e7a6253f6afe Signed-off-by: Shantanu Jain --- .../input/touchscreen/synaptics_dsx/Kconfig | 22 - .../input/touchscreen/synaptics_dsx/Makefile | 2 - .../synaptics_dsx/synaptics_dsx_proximity.c | 671 --------------- .../synaptics_dsx/synaptics_dsx_rmi_dev.c | 810 ------------------ 4 files changed, 1505 deletions(-) delete mode 100755 drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_proximity.c delete mode 100644 drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c diff --git a/drivers/input/touchscreen/synaptics_dsx/Kconfig b/drivers/input/touchscreen/synaptics_dsx/Kconfig index 86263fddaceac..18d473969261d 100644 --- a/drivers/input/touchscreen/synaptics_dsx/Kconfig +++ b/drivers/input/touchscreen/synaptics_dsx/Kconfig @@ -50,17 +50,6 @@ config TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21 To compile this driver as a module, choose M here: the module will be called synaptics_dsx_core. -config TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21 - tristate "Synaptics DSX touchscreen RMI device module" - depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21 - help - Say Y here to enable support for direct RMI register access. - - If unsure, say N. - - To compile this driver as a module, choose M here: the - module will be called synaptics_dsx_rmi_dev. - config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21 tristate "Synaptics DSX touchscreen firmware update module" depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21 @@ -72,15 +61,4 @@ config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21 To compile this driver as a module, choose M here: the module will be called synaptics_dsx_fw_update. -config TOUCHSCREEN_SYNAPTICS_DSX_PROXIMITY_v21 - tristate "Synaptics DSX touchscreen proximity module" - depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21 - help - Say Y here to enable support for proximity functionalities. - - If unsure, say N. - - To compile this driver as a module, choose M here: the - module will be called synaptics_dsx_proximity. - endif diff --git a/drivers/input/touchscreen/synaptics_dsx/Makefile b/drivers/input/touchscreen/synaptics_dsx/Makefile index b35b222d5ae24..0bffb8da94eae 100644 --- a/drivers/input/touchscreen/synaptics_dsx/Makefile +++ b/drivers/input/touchscreen/synaptics_dsx/Makefile @@ -7,6 +7,4 @@ obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_I2C_v21) += synaptics_dsx_i2c.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_SPI_v21) += synaptics_dsx_spi.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21) += synaptics_dsx_core.o -obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21) += synaptics_dsx_rmi_dev.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21) += synaptics_dsx_fw_update.o -obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_PROXIMITY_v21) += synaptics_dsx_proximity.o diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_proximity.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_proximity.c deleted file mode 100755 index 99c05e6845c05..0000000000000 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_proximity.c +++ /dev/null @@ -1,671 +0,0 @@ -/* - * Synaptics DSX touchscreen driver - * - * Copyright (C) 2012 Synaptics Incorporated - * - * Copyright (C) 2012 Alexandra Chin - * Copyright (C) 2012 Scott Lin - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include "synaptics_dsx_core.h" - -#define PROX_PHYS_NAME "synaptics_dsx/input1" - -#define HOVER_Z_MAX (255) - -#define HOVERING_FINGER_EN (1 << 4) - -static ssize_t synaptics_rmi4_hover_finger_en_show(struct device *dev, - struct device_attribute *attr, char *buf); - -static ssize_t synaptics_rmi4_hover_finger_en_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count); - -static struct device_attribute attrs[] = { - __ATTR(hover_finger_en, (S_IRUGO | S_IWUGO), - synaptics_rmi4_hover_finger_en_show, - synaptics_rmi4_hover_finger_en_store), -}; - -struct synaptics_rmi4_f12_query_5 { - union { - struct { - unsigned char size_of_query6; - struct { - unsigned char ctrl0_is_present:1; - unsigned char ctrl1_is_present:1; - unsigned char ctrl2_is_present:1; - unsigned char ctrl3_is_present:1; - unsigned char ctrl4_is_present:1; - unsigned char ctrl5_is_present:1; - unsigned char ctrl6_is_present:1; - unsigned char ctrl7_is_present:1; - } __packed; - struct { - unsigned char ctrl8_is_present:1; - unsigned char ctrl9_is_present:1; - unsigned char ctrl10_is_present:1; - unsigned char ctrl11_is_present:1; - unsigned char ctrl12_is_present:1; - unsigned char ctrl13_is_present:1; - unsigned char ctrl14_is_present:1; - unsigned char ctrl15_is_present:1; - } __packed; - struct { - unsigned char ctrl16_is_present:1; - unsigned char ctrl17_is_present:1; - unsigned char ctrl18_is_present:1; - unsigned char ctrl19_is_present:1; - unsigned char ctrl20_is_present:1; - unsigned char ctrl21_is_present:1; - unsigned char ctrl22_is_present:1; - unsigned char ctrl23_is_present:1; - } __packed; - }; - unsigned char data[4]; - }; -}; - -struct synaptics_rmi4_f12_query_8 { - union { - struct { - unsigned char size_of_query9; - struct { - unsigned char data0_is_present:1; - unsigned char data1_is_present:1; - unsigned char data2_is_present:1; - unsigned char data3_is_present:1; - unsigned char data4_is_present:1; - unsigned char data5_is_present:1; - unsigned char data6_is_present:1; - unsigned char data7_is_present:1; - } __packed; - }; - unsigned char data[2]; - }; -}; - -struct prox_finger_data { - union { - struct { - unsigned char object_type_and_status; - unsigned char x_lsb; - unsigned char x_msb; - unsigned char y_lsb; - unsigned char y_msb; - unsigned char z; - } __packed; - unsigned char proximity_data[6]; - }; -}; - -struct synaptics_rmi4_prox_handle { - bool hover_finger_present; - bool hover_finger_en; - unsigned char intr_mask; - unsigned short query_base_addr; - unsigned short control_base_addr; - unsigned short data_base_addr; - unsigned short command_base_addr; - unsigned short hover_finger_en_addr; - unsigned short hover_finger_data_addr; - struct input_dev *prox_dev; - struct prox_finger_data *finger_data; - struct synaptics_rmi4_data *rmi4_data; -}; - -static struct synaptics_rmi4_prox_handle *prox; - -DECLARE_COMPLETION(prox_remove_complete); - -static void prox_hover_finger_lift(void) -{ - input_report_key(prox->prox_dev, BTN_TOUCH, 0); - input_report_key(prox->prox_dev, BTN_TOOL_FINGER, 0); - input_sync(prox->prox_dev); - prox->hover_finger_present = false; - - return; -} - -static void prox_hover_finger_report(void) -{ - int retval; - int x; - int y; - int z; - struct prox_finger_data *data; - struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; - - data = prox->finger_data; - - retval = synaptics_rmi4_reg_read(rmi4_data, - prox->hover_finger_data_addr, - data->proximity_data, - sizeof(data->proximity_data)); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to read hovering finger data\n", - __func__); - return; - } - - if (data->object_type_and_status != F12_HOVERING_FINGER_STATUS) { - if (prox->hover_finger_present) - prox_hover_finger_lift(); - - return; - } - - x = (data->x_msb << 8) | (data->x_lsb); - y = (data->y_msb << 8) | (data->y_lsb); - z = HOVER_Z_MAX - data->z; - - input_report_key(prox->prox_dev, BTN_TOUCH, 0); - input_report_key(prox->prox_dev, BTN_TOOL_FINGER, 1); - input_report_abs(prox->prox_dev, ABS_X, x); - input_report_abs(prox->prox_dev, ABS_Y, y); - input_report_abs(prox->prox_dev, ABS_DISTANCE, z); - - input_sync(prox->prox_dev); - - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: x = %d y = %d z = %d\n", - __func__, x, y, z); - - prox->hover_finger_present = true; - - return; -} - -static int prox_set_hover_finger_en(void) -{ - int retval; - unsigned char object_report_enable; - struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; - - retval = synaptics_rmi4_reg_read(rmi4_data, - prox->hover_finger_en_addr, - &object_report_enable, - sizeof(object_report_enable)); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to read from object report enable register\n", - __func__); - return retval; - } - - if (prox->hover_finger_en) - object_report_enable |= HOVERING_FINGER_EN; - else - object_report_enable &= ~HOVERING_FINGER_EN; - - retval = synaptics_rmi4_reg_write(rmi4_data, - prox->hover_finger_en_addr, - &object_report_enable, - sizeof(object_report_enable)); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to write to object report enable register\n", - __func__); - return retval; - } - - return 0; -} - -static void prox_set_params(void) -{ - input_set_abs_params(prox->prox_dev, ABS_X, 0, - prox->rmi4_data->sensor_max_x, 0, 0); - input_set_abs_params(prox->prox_dev, ABS_Y, 0, - prox->rmi4_data->sensor_max_y, 0, 0); - input_set_abs_params(prox->prox_dev, ABS_DISTANCE, 0, - HOVER_Z_MAX, 0, 0); - - return; -} - -static int prox_reg_init(void) -{ - int retval; - unsigned char ctrl_23_offset; - unsigned char data_1_offset; - struct synaptics_rmi4_f12_query_5 query_5; - struct synaptics_rmi4_f12_query_8 query_8; - struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; - - retval = synaptics_rmi4_reg_read(rmi4_data, - prox->query_base_addr + 5, - query_5.data, - sizeof(query_5.data)); - if (retval < 0) - return retval; - - ctrl_23_offset = query_5.ctrl0_is_present + - query_5.ctrl1_is_present + - query_5.ctrl2_is_present + - query_5.ctrl3_is_present + - query_5.ctrl4_is_present + - query_5.ctrl5_is_present + - query_5.ctrl6_is_present + - query_5.ctrl7_is_present + - query_5.ctrl8_is_present + - query_5.ctrl9_is_present + - query_5.ctrl10_is_present + - query_5.ctrl11_is_present + - query_5.ctrl12_is_present + - query_5.ctrl13_is_present + - query_5.ctrl14_is_present + - query_5.ctrl15_is_present + - query_5.ctrl16_is_present + - query_5.ctrl17_is_present + - query_5.ctrl18_is_present + - query_5.ctrl19_is_present + - query_5.ctrl20_is_present + - query_5.ctrl21_is_present + - query_5.ctrl22_is_present; - - prox->hover_finger_en_addr = prox->control_base_addr + ctrl_23_offset; - - retval = synaptics_rmi4_reg_read(rmi4_data, - prox->query_base_addr + 8, - query_8.data, - sizeof(query_8.data)); - if (retval < 0) - return retval; - - data_1_offset = query_8.data0_is_present; - prox->hover_finger_data_addr = prox->data_base_addr + data_1_offset; - - return retval; -} - -static int prox_scan_pdt(void) -{ - int retval; - unsigned char ii; - unsigned char page; - unsigned char intr_count = 0; - unsigned char intr_off; - unsigned char intr_src; - unsigned short addr; - struct synaptics_rmi4_fn_desc fd; - struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; - - for (page = 0; page < PAGES_TO_SERVICE; page++) { - for (addr = PDT_START; addr > PDT_END; addr -= PDT_ENTRY_SIZE) { - addr |= (page << 8); - - retval = synaptics_rmi4_reg_read(rmi4_data, - addr, - (unsigned char *)&fd, - sizeof(fd)); - if (retval < 0) - return retval; - - addr &= ~(MASK_8BIT << 8); - - if (fd.fn_number) { - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Found F%02x\n", - __func__, fd.fn_number); - switch (fd.fn_number) { - case SYNAPTICS_RMI4_F12: - goto f12_found; - break; - } - } else { - break; - } - - intr_count += (fd.intr_src_count & MASK_3BIT); - } - } - - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to find F12\n", - __func__); - return -EINVAL; - -f12_found: - prox->query_base_addr = fd.query_base_addr | (page << 8); - prox->control_base_addr = fd.ctrl_base_addr | (page << 8); - prox->data_base_addr = fd.data_base_addr | (page << 8); - prox->command_base_addr = fd.cmd_base_addr | (page << 8); - - retval = prox_reg_init(); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to initialize proximity registers\n", - __func__); - return retval; - } - - prox->intr_mask = 0; - intr_src = fd.intr_src_count; - intr_off = intr_count % 8; - for (ii = intr_off; - ii < ((intr_src & MASK_3BIT) + - intr_off); - ii++) { - prox->intr_mask |= 1 << ii; - } - - rmi4_data->intr_mask[0] |= prox->intr_mask; - - addr = rmi4_data->f01_ctrl_base_addr + 1; - - retval = synaptics_rmi4_reg_write(rmi4_data, - addr, - &(rmi4_data->intr_mask[0]), - sizeof(rmi4_data->intr_mask[0])); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to set interrupt enable bit\n", - __func__); - return retval; - } - - return 0; -} - -static ssize_t synaptics_rmi4_hover_finger_en_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - if (!prox) - return -ENODEV; - - return snprintf(buf, PAGE_SIZE, "%u\n", - prox->hover_finger_en); -} - -static ssize_t synaptics_rmi4_hover_finger_en_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - int retval; - unsigned int input; - struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; - - if (!prox) - return -ENODEV; - - if (sscanf(buf, "%x", &input) != 1) - return -EINVAL; - - if (input == 1) - prox->hover_finger_en = true; - else if (input == 0) - prox->hover_finger_en = false; - else - return -EINVAL; - - retval = prox_set_hover_finger_en(); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to change hovering finger enable setting\n", - __func__); - return retval; - } - - return count; -} - -int synaptics_rmi4_prox_hover_finger_en(bool enable) -{ - int retval; - - if (!prox) - return -ENODEV; - - prox->hover_finger_en = enable; - - retval = prox_set_hover_finger_en(); - if (retval < 0) - return retval; - - return 0; -} -EXPORT_SYMBOL(synaptics_rmi4_prox_hover_finger_en); - -static void synaptics_rmi4_prox_attn(struct synaptics_rmi4_data *rmi4_data, - unsigned char intr_mask) -{ - if (!prox) - return; - - if (prox->intr_mask & intr_mask) - prox_hover_finger_report(); - - return; -} - -static int synaptics_rmi4_prox_init(struct synaptics_rmi4_data *rmi4_data) -{ - int retval; - unsigned char attr_count; - - prox = kzalloc(sizeof(*prox), GFP_KERNEL); - if (!prox) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to alloc mem for prox\n", - __func__); - retval = -ENOMEM; - goto exit; - } - - prox->finger_data = kzalloc(sizeof(*(prox->finger_data)), GFP_KERNEL); - if (!prox->finger_data) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to alloc mem for finger_data\n", - __func__); - retval = -ENOMEM; - goto exit_free_prox; - } - - prox->rmi4_data = rmi4_data; - - retval = prox_scan_pdt(); - if (retval < 0) - goto exit_free_finger_data; - - prox->hover_finger_en = true; - - retval = prox_set_hover_finger_en(); - if (retval < 0) - return retval; - - prox->prox_dev = input_allocate_device(); - if (prox->prox_dev == NULL) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to allocate proximity device\n", - __func__); - retval = -ENOMEM; - goto exit_free_finger_data; - } - - prox->prox_dev->name = PLATFORM_DRIVER_NAME; - prox->prox_dev->phys = PROX_PHYS_NAME; - prox->prox_dev->id.product = SYNAPTICS_DSX_DRIVER_PRODUCT; - prox->prox_dev->id.version = SYNAPTICS_DSX_DRIVER_VERSION; - prox->prox_dev->dev.parent = rmi4_data->pdev->dev.parent; - input_set_drvdata(prox->prox_dev, rmi4_data); - - set_bit(EV_KEY, prox->prox_dev->evbit); - set_bit(EV_ABS, prox->prox_dev->evbit); - set_bit(BTN_TOUCH, prox->prox_dev->keybit); - set_bit(BTN_TOOL_FINGER, prox->prox_dev->keybit); -#ifdef INPUT_PROP_DIRECT - set_bit(INPUT_PROP_DIRECT, prox->prox_dev->propbit); -#endif - - prox_set_params(); - - retval = input_register_device(prox->prox_dev); - if (retval) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to register proximity device\n", - __func__); - goto exit_free_input_device; - } - - for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { - retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj, - &attrs[attr_count].attr); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create sysfs attributes\n", - __func__); - goto exit_free_sysfs; - } - } - - return 0; - -exit_free_sysfs: - for (attr_count--; attr_count >= 0; attr_count--) { - sysfs_remove_file(&rmi4_data->input_dev->dev.kobj, - &attrs[attr_count].attr); - } - - input_unregister_device(prox->prox_dev); - prox->prox_dev = NULL; - -exit_free_input_device: - if (prox->prox_dev) - input_free_device(prox->prox_dev); - -exit_free_finger_data: - kfree(prox->finger_data); - -exit_free_prox: - kfree(prox); - prox = NULL; - -exit: - return retval; -} - -static void synaptics_rmi4_prox_remove(struct synaptics_rmi4_data *rmi4_data) -{ - unsigned char attr_count; - - if (!prox) - goto exit; - - for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { - sysfs_remove_file(&rmi4_data->input_dev->dev.kobj, - &attrs[attr_count].attr); - } - - input_unregister_device(prox->prox_dev); - kfree(prox->finger_data); - kfree(prox); - prox = NULL; - -exit: - complete(&prox_remove_complete); - - return; -} - -static void synaptics_rmi4_prox_reset(struct synaptics_rmi4_data *rmi4_data) -{ - if (!prox) - return; - - prox_hover_finger_lift(); - - prox_scan_pdt(); - - prox_set_hover_finger_en(); - - prox_set_params(); - - return; -} - -static void synaptics_rmi4_prox_reinit(struct synaptics_rmi4_data *rmi4_data) -{ - if (!prox) - return; - - prox_hover_finger_lift(); - - prox_set_hover_finger_en(); - - return; -} - -static void synaptics_rmi4_prox_e_suspend(struct synaptics_rmi4_data *rmi4_data) -{ - if (!prox) - return; - - prox_hover_finger_lift(); - - return; -} - -static void synaptics_rmi4_prox_suspend(struct synaptics_rmi4_data *rmi4_data) -{ - if (!prox) - return; - - prox_hover_finger_lift(); - - return; -} - -static struct synaptics_rmi4_exp_fn proximity_module = { - .fn_type = RMI_PROXIMITY, - .init = synaptics_rmi4_prox_init, - .remove = synaptics_rmi4_prox_remove, - .reset = synaptics_rmi4_prox_reset, - .reinit = synaptics_rmi4_prox_reinit, - .early_suspend = synaptics_rmi4_prox_e_suspend, - .suspend = synaptics_rmi4_prox_suspend, - .resume = NULL, - .late_resume = NULL, - .attn = synaptics_rmi4_prox_attn, -}; - -static int __init rmi4_proximity_module_init(void) -{ - synaptics_rmi4_dsx_new_function(&proximity_module, true); - - return 0; -} - -static void __exit rmi4_proximity_module_exit(void) -{ - synaptics_rmi4_dsx_new_function(&proximity_module, false); - - wait_for_completion(&prox_remove_complete); - - return; -} - -module_init(rmi4_proximity_module_init); -module_exit(rmi4_proximity_module_exit); - -MODULE_AUTHOR("Synaptics, Inc."); -MODULE_DESCRIPTION("Synaptics DSX Proximity Module"); -MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c deleted file mode 100644 index c1cbec81d7d6a..0000000000000 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c +++ /dev/null @@ -1,810 +0,0 @@ -/* - * Synaptics DSX touchscreen driver - * - * Copyright (C) 2012 Synaptics Incorporated - * - * Copyright (C) 2012 Alexandra Chin - * Copyright (C) 2012 Scott Lin - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "synaptics_dsx_core.h" - -#define CHAR_DEVICE_NAME "rmi" -#define DEVICE_CLASS_NAME "rmidev" -#define SYSFS_FOLDER_NAME "rmidev" -#define DEV_NUMBER 1 -#define REG_ADDR_LIMIT 0xFFFF - -static ssize_t rmidev_sysfs_data_show(struct file *data_file, - struct kobject *kobj, struct bin_attribute *attributes, - char *buf, loff_t pos, size_t count); - -static ssize_t rmidev_sysfs_data_store(struct file *data_file, - struct kobject *kobj, struct bin_attribute *attributes, - char *buf, loff_t pos, size_t count); - -static ssize_t rmidev_sysfs_open_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count); - -static ssize_t rmidev_sysfs_release_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count); - -static ssize_t rmidev_sysfs_attn_state_show(struct device *dev, - struct device_attribute *attr, char *buf); - -struct rmidev_handle { - dev_t dev_no; - struct device dev; - struct synaptics_rmi4_data *rmi4_data; - struct kobject *sysfs_dir; - void *data; - bool irq_enabled; -}; - -struct rmidev_data { - int ref_count; - struct cdev main_dev; - struct class *device_class; - struct mutex file_mutex; - struct rmidev_handle *rmi_dev; -}; - -static struct bin_attribute attr_data = { - .attr = { - .name = "data", - .mode = (S_IRUGO | S_IWUSR), - }, - .size = 0, - .read = rmidev_sysfs_data_show, - .write = rmidev_sysfs_data_store, -}; - -static struct device_attribute attrs[] = { - __ATTR(open, S_IWUSR | S_IWGRP, - NULL, - rmidev_sysfs_open_store), - __ATTR(release, S_IWUSR | S_IWGRP, - NULL, - rmidev_sysfs_release_store), - __ATTR(attn_state, S_IRUGO, - rmidev_sysfs_attn_state_show, - synaptics_rmi4_store_error), -}; - -static int rmidev_major_num; - -static struct class *rmidev_device_class; - -static struct rmidev_handle *rmidev; - -DECLARE_COMPLETION(rmidev_remove_complete); - -static irqreturn_t rmidev_sysfs_irq(int irq, void *data) -{ - struct synaptics_rmi4_data *rmi4_data = data; - - sysfs_notify(&rmi4_data->input_dev->dev.kobj, - SYSFS_FOLDER_NAME, "attn_state"); - - return IRQ_HANDLED; -} - -static int rmidev_sysfs_irq_enable(struct synaptics_rmi4_data *rmi4_data, - bool enable) -{ - int retval = 0; - unsigned char intr_status[MAX_INTR_REGISTERS]; - unsigned long irq_flags = IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING; - - if (enable) { - if (rmidev->irq_enabled) - return retval; - - /* Clear interrupts first */ - retval = synaptics_rmi4_reg_read(rmi4_data, - rmi4_data->f01_data_base_addr + 1, - intr_status, - rmi4_data->num_of_intr_regs); - if (retval < 0) - return retval; - - retval = request_threaded_irq(rmi4_data->irq, NULL, - rmidev_sysfs_irq, irq_flags, - "synaptics_dsx_rmidev", rmi4_data); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create irq thread\n", - __func__); - return retval; - } - - rmidev->irq_enabled = true; - } else { - if (rmidev->irq_enabled) { - disable_irq(rmi4_data->irq); - free_irq(rmi4_data->irq, rmi4_data); - rmidev->irq_enabled = false; - } - } - - return retval; -} - -static ssize_t rmidev_sysfs_data_show(struct file *data_file, - struct kobject *kobj, struct bin_attribute *attributes, - char *buf, loff_t pos, size_t count) -{ - int retval; - unsigned int length = (unsigned int)count; - unsigned short address = (unsigned short)pos; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (length > (REG_ADDR_LIMIT - address)) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Out of register map limit\n", - __func__); - return -EINVAL; - } - - if (length) { - retval = synaptics_rmi4_reg_read(rmi4_data, - address, - (unsigned char *)buf, - length); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to read data\n", - __func__); - return retval; - } - } else { - return -EINVAL; - } - - return length; -} - -static ssize_t rmidev_sysfs_data_store(struct file *data_file, - struct kobject *kobj, struct bin_attribute *attributes, - char *buf, loff_t pos, size_t count) -{ - int retval; - unsigned int length = (unsigned int)count; - unsigned short address = (unsigned short)pos; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (length > (REG_ADDR_LIMIT - address)) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Out of register map limit\n", - __func__); - return -EINVAL; - } - - if (length) { - retval = synaptics_rmi4_reg_write(rmi4_data, - address, - (unsigned char *)buf, - length); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to write data\n", - __func__); - return retval; - } - } else { - return -EINVAL; - } - - return length; -} - -static ssize_t rmidev_sysfs_open_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - unsigned int input; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (sscanf(buf, "%u", &input) != 1) - return -EINVAL; - - if (input != 1) - return -EINVAL; - - rmi4_data->irq_enable(rmi4_data, false); - rmidev_sysfs_irq_enable(rmi4_data, true); - - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Attention interrupt disabled\n", - __func__); - - return count; -} - -static ssize_t rmidev_sysfs_release_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - unsigned int input; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (sscanf(buf, "%u", &input) != 1) - return -EINVAL; - - if (input != 1) - return -EINVAL; - - rmi4_data->reset_device(rmi4_data); - - rmidev_sysfs_irq_enable(rmi4_data, false); - rmi4_data->irq_enable(rmi4_data, true); - - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Attention interrupt enabled\n", - __func__); - - return count; -} - -static ssize_t rmidev_sysfs_attn_state_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int attn_state; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - const struct synaptics_dsx_board_data *bdata = - rmi4_data->hw_if->board_data; - - attn_state = gpio_get_value(bdata->irq_gpio); - - return snprintf(buf, PAGE_SIZE, "%u\n", attn_state); -} - -/* - * rmidev_llseek - used to set up register address - * - * @filp: file structure for seek - * @off: offset - * if whence == SEEK_SET, - * high 16 bits: page address - * low 16 bits: register address - * if whence == SEEK_CUR, - * offset from current position - * if whence == SEEK_END, - * offset from end position (0xFFFF) - * @whence: SEEK_SET, SEEK_CUR, or SEEK_END - */ -static loff_t rmidev_llseek(struct file *filp, loff_t off, int whence) -{ - loff_t newpos; - struct rmidev_data *dev_data = filp->private_data; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (IS_ERR(dev_data)) { - pr_err("%s: Pointer of char device data is invalid", __func__); - return -EBADF; - } - - mutex_lock(&(dev_data->file_mutex)); - - switch (whence) { - case SEEK_SET: - newpos = off; - break; - case SEEK_CUR: - newpos = filp->f_pos + off; - break; - case SEEK_END: - newpos = REG_ADDR_LIMIT + off; - break; - default: - newpos = -EINVAL; - goto clean_up; - } - - if (newpos < 0 || newpos > REG_ADDR_LIMIT) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: New position 0x%04x is invalid\n", - __func__, (unsigned int)newpos); - newpos = -EINVAL; - goto clean_up; - } - - filp->f_pos = newpos; - -clean_up: - mutex_unlock(&(dev_data->file_mutex)); - - return newpos; -} - -/* - * rmidev_read: - use to read data from rmi device - * - * @filp: file structure for read - * @buf: user space buffer pointer - * @count: number of bytes to read - * @f_pos: offset (starting register address) - */ -static ssize_t rmidev_read(struct file *filp, char __user *buf, - size_t count, loff_t *f_pos) -{ - ssize_t retval; - unsigned char *tmpbuf; - struct rmidev_data *dev_data = filp->private_data; - - if (IS_ERR(dev_data)) { - pr_err("%s: Pointer of char device data is invalid", __func__); - return -EBADF; - } - - mutex_lock(&(dev_data->file_mutex)); - - if (count > (REG_ADDR_LIMIT - *f_pos)) - count = REG_ADDR_LIMIT - *f_pos; - - if (count == 0) { - retval = 0; - goto unlock; - } - - if (*f_pos > REG_ADDR_LIMIT) { - retval = -EFAULT; - goto unlock; - } - tmpbuf = kzalloc(count + 1, GFP_KERNEL); - if (!tmpbuf) { - retval = -ENOMEM; - goto unlock; - } - retval = synaptics_rmi4_reg_read(rmidev->rmi4_data, - *f_pos, - tmpbuf, - count); - if (retval < 0) - goto clean_up; - - if (copy_to_user(buf, tmpbuf, count)) - retval = -EFAULT; - else - *f_pos += retval; - -clean_up: - kfree(tmpbuf); -unlock: - mutex_unlock(&(dev_data->file_mutex)); - return retval; -} - -/* - * rmidev_write: - used to write data to rmi device - * - * @filep: file structure for write - * @buf: user space buffer pointer - * @count: number of bytes to write - * @f_pos: offset (starting register address) - */ -static ssize_t rmidev_write(struct file *filp, const char __user *buf, - size_t count, loff_t *f_pos) -{ - ssize_t retval; - unsigned char *tmpbuf; - struct rmidev_data *dev_data = filp->private_data; - - if (IS_ERR(dev_data)) { - pr_err("%s: Pointer of char device data is invalid", __func__); - return -EBADF; - } - - mutex_lock(&(dev_data->file_mutex)); - - if (*f_pos > REG_ADDR_LIMIT) { - retval = -EFAULT; - goto unlock; - } - - if (count > (REG_ADDR_LIMIT - *f_pos)) - count = REG_ADDR_LIMIT - *f_pos; - - if (count == 0) { - retval = 0; - goto unlock; - } - - tmpbuf = kzalloc(count + 1, GFP_KERNEL); - if (!tmpbuf) { - retval = -ENOMEM; - goto unlock; - } - - if (copy_from_user(tmpbuf, buf, count)) { - retval = -EFAULT; - goto clean_up; - } - - retval = synaptics_rmi4_reg_write(rmidev->rmi4_data, - *f_pos, - tmpbuf, - count); - if (retval >= 0) - *f_pos += retval; - -clean_up: - kfree(tmpbuf); -unlock: - mutex_unlock(&(dev_data->file_mutex)); - return retval; -} - -/* - * rmidev_open: enable access to rmi device - * @inp: inode struture - * @filp: file structure - */ -static int rmidev_open(struct inode *inp, struct file *filp) -{ - int retval = 0; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - struct rmidev_data *dev_data = - container_of(inp->i_cdev, struct rmidev_data, main_dev); - - if (!dev_data) - return -EACCES; - - filp->private_data = dev_data; - - mutex_lock(&(dev_data->file_mutex)); - - rmi4_data->irq_enable(rmi4_data, false); - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Attention interrupt disabled\n", - __func__); - - if (dev_data->ref_count < 1) - dev_data->ref_count++; - else - retval = -EACCES; - - mutex_unlock(&(dev_data->file_mutex)); - - return retval; -} - -/* - * rmidev_release: - release access to rmi device - * @inp: inode structure - * @filp: file structure - */ -static int rmidev_release(struct inode *inp, struct file *filp) -{ - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - struct rmidev_data *dev_data = - container_of(inp->i_cdev, struct rmidev_data, main_dev); - - if (!dev_data) - return -EACCES; - - rmi4_data->reset_device(rmi4_data); - - mutex_lock(&(dev_data->file_mutex)); - - dev_data->ref_count--; - if (dev_data->ref_count < 0) - dev_data->ref_count = 0; - - rmi4_data->irq_enable(rmi4_data, true); - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Attention interrupt enabled\n", - __func__); - - mutex_unlock(&(dev_data->file_mutex)); - - return 0; -} - -static const struct file_operations rmidev_fops = { - .owner = THIS_MODULE, - .llseek = rmidev_llseek, - .read = rmidev_read, - .write = rmidev_write, - .open = rmidev_open, - .release = rmidev_release, -}; - -static void rmidev_device_cleanup(struct rmidev_data *dev_data) -{ - dev_t devno; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (dev_data) { - devno = dev_data->main_dev.dev; - - if (dev_data->device_class) - device_destroy(dev_data->device_class, devno); - - cdev_del(&dev_data->main_dev); - - unregister_chrdev_region(devno, 1); - - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: rmidev device removed\n", - __func__); - } - - return; -} - -static char *rmi_char_devnode(struct device *dev, umode_t *mode) -{ - if (!mode) - return NULL; - - *mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - - return kasprintf(GFP_KERNEL, "rmi/%s", dev_name(dev)); -} - -static int rmidev_create_device_class(void) -{ - rmidev_device_class = class_create(THIS_MODULE, DEVICE_CLASS_NAME); - - if (IS_ERR(rmidev_device_class)) { - pr_err("%s: Failed to create /dev/%s\n", - __func__, CHAR_DEVICE_NAME); - return -ENODEV; - } - - rmidev_device_class->devnode = rmi_char_devnode; - - return 0; -} - -static int rmidev_init_device(struct synaptics_rmi4_data *rmi4_data) -{ - int retval; - dev_t dev_no; - unsigned char attr_count; - struct rmidev_data *dev_data; - struct device *device_ptr; - const struct synaptics_dsx_board_data *bdata = - rmi4_data->hw_if->board_data; - - rmidev = kzalloc(sizeof(*rmidev), GFP_KERNEL); - if (!rmidev) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to alloc mem for rmidev\n", - __func__); - retval = -ENOMEM; - goto err_rmidev; - } - - rmidev->rmi4_data = rmi4_data; - - retval = rmidev_create_device_class(); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create device class\n", - __func__); - goto err_device_class; - } - - if (rmidev_major_num) { - dev_no = MKDEV(rmidev_major_num, DEV_NUMBER); - retval = register_chrdev_region(dev_no, 1, CHAR_DEVICE_NAME); - } else { - retval = alloc_chrdev_region(&dev_no, 0, 1, CHAR_DEVICE_NAME); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to allocate char device region\n", - __func__); - goto err_device_region; - } - - rmidev_major_num = MAJOR(dev_no); - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Major number of rmidev = %d\n", - __func__, rmidev_major_num); - } - - dev_data = kzalloc(sizeof(*dev_data), GFP_KERNEL); - if (!dev_data) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to alloc mem for dev_data\n", - __func__); - retval = -ENOMEM; - goto err_dev_data; - } - - mutex_init(&dev_data->file_mutex); - dev_data->rmi_dev = rmidev; - rmidev->data = dev_data; - - cdev_init(&dev_data->main_dev, &rmidev_fops); - - retval = cdev_add(&dev_data->main_dev, dev_no, 1); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to add rmi char device\n", - __func__); - goto err_char_device; - } - - dev_set_name(&rmidev->dev, "rmidev%d", MINOR(dev_no)); - dev_data->device_class = rmidev_device_class; - - device_ptr = device_create(dev_data->device_class, NULL, dev_no, - NULL, CHAR_DEVICE_NAME"%d", MINOR(dev_no)); - if (IS_ERR(device_ptr)) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create rmi char device\n", - __func__); - retval = -ENODEV; - goto err_char_device; - } - - retval = gpio_export(bdata->irq_gpio, false); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to export attention gpio\n", - __func__); - } else { - retval = gpio_export_link(&(rmi4_data->input_dev->dev), - "attn", bdata->irq_gpio); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s Failed to create gpio symlink\n", - __func__); - } else { - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Exported attention gpio %d\n", - __func__, bdata->irq_gpio); - } - } - - rmidev->sysfs_dir = kobject_create_and_add(SYSFS_FOLDER_NAME, - &rmi4_data->input_dev->dev.kobj); - if (!rmidev->sysfs_dir) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create sysfs directory\n", - __func__); - retval = -ENODEV; - goto err_sysfs_dir; - } - - retval = sysfs_create_bin_file(rmidev->sysfs_dir, - &attr_data); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create sysfs bin file\n", - __func__); - goto err_sysfs_bin; - } - - for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { - retval = sysfs_create_file(rmidev->sysfs_dir, - &attrs[attr_count].attr); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create sysfs attributes\n", - __func__); - retval = -ENODEV; - goto err_sysfs_attrs; - } - } - - return 0; - -err_sysfs_attrs: - for (attr_count--; attr_count >= 0; attr_count--) - sysfs_remove_file(rmidev->sysfs_dir, &attrs[attr_count].attr); - - sysfs_remove_bin_file(rmidev->sysfs_dir, &attr_data); - -err_sysfs_bin: - kobject_put(rmidev->sysfs_dir); - -err_sysfs_dir: -err_char_device: - rmidev_device_cleanup(dev_data); - kfree(dev_data); - -err_dev_data: - unregister_chrdev_region(dev_no, 1); - -err_device_region: - class_destroy(rmidev_device_class); - -err_device_class: - kfree(rmidev); - rmidev = NULL; - -err_rmidev: - return retval; -} - -static void rmidev_remove_device(struct synaptics_rmi4_data *rmi4_data) -{ - unsigned char attr_count; - struct rmidev_data *dev_data; - - if (!rmidev) - goto exit; - - for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) - sysfs_remove_file(rmidev->sysfs_dir, &attrs[attr_count].attr); - - sysfs_remove_bin_file(rmidev->sysfs_dir, &attr_data); - - kobject_put(rmidev->sysfs_dir); - - dev_data = rmidev->data; - if (dev_data) { - rmidev_device_cleanup(dev_data); - kfree(dev_data); - } - - unregister_chrdev_region(rmidev->dev_no, 1); - - class_destroy(rmidev_device_class); - - kfree(rmidev); - rmidev = NULL; - -exit: - complete(&rmidev_remove_complete); - - return; -} - -static struct synaptics_rmi4_exp_fn rmidev_module = { - .fn_type = RMI_DEV, - .init = rmidev_init_device, - .remove = rmidev_remove_device, - .reset = NULL, - .reinit = NULL, - .early_suspend = NULL, - .suspend = NULL, - .resume = NULL, - .late_resume = NULL, - .attn = NULL, -}; - -static int __init rmidev_module_init(void) -{ - synaptics_rmi4_dsx_new_function(&rmidev_module, true); - - return 0; -} - -static void __exit rmidev_module_exit(void) -{ - synaptics_rmi4_dsx_new_function(&rmidev_module, false); - - wait_for_completion(&rmidev_remove_complete); - - return; -} - -module_init(rmidev_module_init); -module_exit(rmidev_module_exit); - -MODULE_AUTHOR("Synaptics, Inc."); -MODULE_DESCRIPTION("Synaptics DSX RMI Dev Module"); -MODULE_LICENSE("GPL v2"); From d48f7d2bb1b06484eb66eedcf95dd72007e82ee1 Mon Sep 17 00:00:00 2001 From: Naresh Malladi Date: Mon, 29 May 2017 16:47:34 +0530 Subject: [PATCH 0844/1015] soc: qcom: rpm-smd-debug: initialize variables and check for return value Initialize few variables and check return value of sscanf. use 'goto' to exit without sending rpm send message request in case of sscanf failure. Change-Id: I86f723b4dbbca30b80a33de8b2c28116da8730dd Signed-off-by: Naresh Malladi --- drivers/soc/qcom/rpm-smd-debug.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/drivers/soc/qcom/rpm-smd-debug.c b/drivers/soc/qcom/rpm-smd-debug.c index c086681496361..aaf7b415d1f19 100644 --- a/drivers/soc/qcom/rpm-smd-debug.c +++ b/drivers/soc/qcom/rpm-smd-debug.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2014, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -44,9 +44,9 @@ static ssize_t rsc_ops_write(struct file *fp, const char __user *user_buffer, { char buf[MAX_MSG_BUFFER], rsc_type_str[6] = {}, rpm_set[8] = {}, key_str[6] = {}; - int i, pos, set = -1, nelems; + int i, pos = -1, set = -1, nelems = -1; char *cmp; - uint32_t rsc_type, rsc_id, key, data; + uint32_t rsc_type = 0, rsc_id = 0, key = 0, data = 0; struct msm_rpm_request *req; count = min(count, sizeof(buf) - 1); @@ -55,8 +55,12 @@ static ssize_t rsc_ops_write(struct file *fp, const char __user *user_buffer, buf[count] = '\0'; cmp = strstrip(buf); - sscanf(cmp, "%7s %5s %u %d %n", rpm_set, rsc_type_str, &rsc_id, - &nelems, &pos); + if (sscanf(cmp, "%7s %5s %u %d %n", rpm_set, rsc_type_str, + &rsc_id, &nelems, &pos) != 4) { + pr_err("Invalid number of arguments passed\n"); + goto err; + } + if (strlen(rpm_set) > 6 || strlen(rsc_type_str) > 4) { pr_err("Invalid value of set or resource type\n"); goto err; @@ -84,7 +88,11 @@ static ssize_t rsc_ops_write(struct file *fp, const char __user *user_buffer, for (i = 0; i < nelems; i++) { cmp += pos; - sscanf(cmp, "%5s %n", key_str, &pos); + if (sscanf(cmp, "%5s %n", key_str, &pos) != 1) { + pr_err("Invalid number of arguments passed\n"); + goto err; + } + if (strlen(key_str) > 4) { pr_err("Key value cannot be more than 4 charecters"); goto err; @@ -96,7 +104,11 @@ static ssize_t rsc_ops_write(struct file *fp, const char __user *user_buffer, } cmp += pos; - sscanf(cmp, "%u %n", &data, &pos); + if (sscanf(cmp, "%u %n", &data, &pos) != 1) { + pr_err("Invalid number of arguments passed\n"); + goto err; + } + if (msm_rpm_add_kvp_data(req, key, (void *)&data, sizeof(data))) goto err_request; From ee2ccf1ce400d2adda3bfc4273f6a03bdfb19fb9 Mon Sep 17 00:00:00 2001 From: Divya Ojha Date: Thu, 27 Apr 2017 22:52:40 +0530 Subject: [PATCH 0845/1015] ASoC: msm: qdsp6v2: make audio debugfs read and release exclusive A thread can read audio debugfs entry while another closes the device. Protect these operations with a mutex and before read check audio data to be a valid pointer. Change-Id: If29a308c1a8329d7befd047d41abe5f6ab626199 Signed-off-by: Divya Ojha --- drivers/misc/qcom/qdsp6v2/audio_utils_aio.c | 58 +++++++++++++-------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c index 1633383991efc..1f22ce11b1a1e 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c @@ -26,11 +26,14 @@ #include #include #include +#include #include "audio_utils_aio.h" #ifdef CONFIG_USE_DEV_CTRL_VOLUME #include #endif /*CONFIG_USE_DEV_CTRL_VOLUME*/ +DEFINE_MUTEX(lock); #ifdef CONFIG_DEBUG_FS + int audio_aio_debug_open(struct inode *inode, struct file *file) { file->private_data = inode->i_private; @@ -43,29 +46,37 @@ ssize_t audio_aio_debug_read(struct file *file, char __user *buf, const int debug_bufmax = 4096; static char buffer[4096]; int n = 0; - struct q6audio_aio *audio = file->private_data; + struct q6audio_aio *audio; - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "feedback %d\n", audio->feedback); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "inqueue empty %d\n", list_empty(&audio->in_queue)); - n += scnprintf(buffer + n, debug_bufmax - n, - "outqueue empty %d\n", list_empty(&audio->out_queue)); + mutex_lock(&lock); + if (file->private_data != NULL) { + audio = file->private_data; + mutex_lock(&audio->lock); + n = scnprintf(buffer, debug_bufmax, "opened %d\n", + audio->opened); + n += scnprintf(buffer + n, debug_bufmax - n, + "enabled %d\n", audio->enabled); + n += scnprintf(buffer + n, debug_bufmax - n, + "stopped %d\n", audio->stopped); + n += scnprintf(buffer + n, debug_bufmax - n, + "feedback %d\n", audio->feedback); + mutex_unlock(&audio->lock); + /* Following variables are only useful for debugging when + * when playback halts unexpectedly. Thus, no mutual exclusion + * enforced + */ + n += scnprintf(buffer + n, debug_bufmax - n, + "wflush %d\n", audio->wflush); + n += scnprintf(buffer + n, debug_bufmax - n, + "rflush %d\n", audio->rflush); + n += scnprintf(buffer + n, debug_bufmax - n, + "inqueue empty %d\n", + list_empty(&audio->in_queue)); + n += scnprintf(buffer + n, debug_bufmax - n, + "outqueue empty %d\n", + list_empty(&audio->out_queue)); + } + mutex_unlock(&lock); buffer[n] = 0; return simple_read_from_buffer(buf, count, ppos, buffer, n); } @@ -572,6 +583,7 @@ int audio_aio_release(struct inode *inode, struct file *file) { struct q6audio_aio *audio = file->private_data; pr_debug("%s[%pK]\n", __func__, audio); + mutex_lock(&lock); mutex_lock(&audio->lock); mutex_lock(&audio->read_lock); mutex_lock(&audio->write_lock); @@ -615,6 +627,8 @@ int audio_aio_release(struct inode *inode, struct file *file) #endif kfree(audio->codec_cfg); kfree(audio); + file->private_data = NULL; + mutex_unlock(&lock); return 0; } From a9036a9fd8b2d242db97ce3eb1dfaae90abfc630 Mon Sep 17 00:00:00 2001 From: Venu Yeshala Date: Mon, 29 May 2017 14:20:29 +0530 Subject: [PATCH 0846/1015] msm: camera: isp: Avoid information leak in ISPIF Change the format specifier in a debug print for ISPIF base address to avoid information leak. Change-Id: Ic6c799349ea98448da113d8710300934d77079b8 Signed-off-by: Venu Yeshala --- drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c index 649a363bc05dd..ec368a12c6ea6 100644 --- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c +++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c @@ -609,7 +609,7 @@ static int msm_ispif_reset(struct ispif_device *ispif) ispif->base + ISPIF_VFE_m_INTF_CMD_0(i)); msm_camera_io_w(ISPIF_STOP_INTF_IMMEDIATELY, ispif->base + ISPIF_VFE_m_INTF_CMD_1(i)); - pr_debug("%s: base %lx", __func__, (unsigned long)ispif->base); + pr_debug("%s: base %pK", __func__, ispif->base); msm_camera_io_w(0, ispif->base + ISPIF_VFE_m_PIX_INTF_n_CID_MASK(i, 0)); msm_camera_io_w(0, ispif->base + From 507541d4ab4237d12eb9592e0bfb8e17fd503483 Mon Sep 17 00:00:00 2001 From: Jiangen Jiao Date: Thu, 1 Jun 2017 11:21:54 +0800 Subject: [PATCH 0847/1015] ARM: dts: msm: Add initial support for sdm450 QRD Add initial device tree to build the sdm450 QRD target. Change-Id: I8533e4ea2af7b0f990ece850525ec22b98820c3a Signed-off-by: Jiangen Jiao --- .../devicetree/bindings/arm/msm/msm.txt | 1 + arch/arm/boot/dts/qcom/Makefile | 3 ++- arch/arm/boot/dts/qcom/sdm450-qrd.dts | 23 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 arch/arm/boot/dts/qcom/sdm450-qrd.dts diff --git a/Documentation/devicetree/bindings/arm/msm/msm.txt b/Documentation/devicetree/bindings/arm/msm/msm.txt index eece752a6709c..6cd7ceb88dcef 100644 --- a/Documentation/devicetree/bindings/arm/msm/msm.txt +++ b/Documentation/devicetree/bindings/arm/msm/msm.txt @@ -296,6 +296,7 @@ compatible = "qcom,msm8953-qrd" compatible = "qcom,msm8953-qrd-sku3" compatible = "qcom,sdm450-cdp" compatible = "qcom,sdm450-mtp" +compatible = "qcom,sdm450-qrd" compatible = "qcom,mdm9640-cdp" compatible = "qcom,mdm9640-mtp" compatible = "qcom,mdm9640-rumi" diff --git a/arch/arm/boot/dts/qcom/Makefile b/arch/arm/boot/dts/qcom/Makefile index 440682b22e391..9ef74c90d6bea 100644 --- a/arch/arm/boot/dts/qcom/Makefile +++ b/arch/arm/boot/dts/qcom/Makefile @@ -227,7 +227,8 @@ dtb-$(CONFIG_ARCH_MSM8953) += msm8953-sim.dtb \ dtb-$(CONFIG_ARCH_SDM450) += sdm450-rcm.dtb \ sdm450-cdp.dtb \ - sdm450-mtp.dtb + sdm450-mtp.dtb \ + sdm450-qrd.dtb dtb-$(CONFIG_ARCH_MDM9607) += mdm9607-rumi.dtb \ mdm9607-cdp.dtb \ diff --git a/arch/arm/boot/dts/qcom/sdm450-qrd.dts b/arch/arm/boot/dts/qcom/sdm450-qrd.dts new file mode 100644 index 0000000000000..88ffd8c25b86f --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-qrd.dts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "sdm450.dtsi" +#include "msm8953-qrd.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 QRD"; + compatible = "qcom,sdm450-qrd", "qcom,sdm450", "qcom,mtp"; + qcom,board-id = <0x0005000b 0>; +}; From 6a20f55753fe91a5914427d57cac8127be0f4220 Mon Sep 17 00:00:00 2001 From: Ravi Kishore Tanuku Date: Thu, 23 Mar 2017 18:12:17 +0530 Subject: [PATCH 0848/1015] msm: camera: Add spinlock protection for flags in CCI driver The race conditions in accessing the CCI queue control flags are resulting in CCI timeout issues. Added spinlocks to avoid these. Change-Id: I13ceeb4f5a139d7d66bbf98ac541590d65ca526b Signed-off-by: Ravi Kishore Tanuku --- .../msm/camera_v2/sensor/cci/msm_cci.c | 62 ++++++++++++++++++- .../msm/camera_v2/sensor/cci/msm_cci.h | 3 +- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c index dbdf8faeaf520..7a9977d9409bf 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c +++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c @@ -201,6 +201,7 @@ static int32_t msm_cci_validate_queue(struct cci_device *cci_dev, enum cci_i2c_queue_t queue) { int32_t rc = 0; + unsigned long flags; uint32_t read_val = 0; uint32_t reg_offset = master * 0x200 + queue * 0x100; read_val = msm_camera_io_r_mb(cci_dev->base + @@ -223,6 +224,8 @@ static int32_t msm_cci_validate_queue(struct cci_device *cci_dev, CCI_I2C_M0_Q0_EXEC_WORD_CNT_ADDR + reg_offset); reg_val = 1 << ((master * 2) + queue); CDBG("%s:%d CCI_QUEUE_START_ADDR\n", __func__, __LINE__); + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); atomic_set(&cci_dev->cci_master_info[master]. done_pending[queue], 1); msm_camera_io_w_mb(reg_val, cci_dev->base + @@ -230,6 +233,8 @@ static int32_t msm_cci_validate_queue(struct cci_device *cci_dev, CDBG("%s line %d wait_for_completion_timeout\n", __func__, __LINE__); atomic_set(&cci_dev->cci_master_info[master].q_free[queue], 1); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); rc = wait_for_completion_timeout(&cci_dev-> cci_master_info[master].report_q[queue], CCI_TIMEOUT); if (rc <= 0) { @@ -439,10 +444,17 @@ static int32_t msm_cci_wait_report_cmd(struct cci_device *cci_dev, enum cci_i2c_master_t master, enum cci_i2c_queue_t queue) { + unsigned long flags; uint32_t reg_val = 1 << ((master * 2) + queue); msm_cci_load_report_cmd(cci_dev, master, queue); + + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); atomic_set(&cci_dev->cci_master_info[master].q_free[queue], 1); atomic_set(&cci_dev->cci_master_info[master].done_pending[queue], 1); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); + msm_camera_io_w_mb(reg_val, cci_dev->base + CCI_QUEUE_START_ADDR); return msm_cci_wait(cci_dev, master, queue); @@ -452,12 +464,21 @@ static void msm_cci_process_half_q(struct cci_device *cci_dev, enum cci_i2c_master_t master, enum cci_i2c_queue_t queue) { + unsigned long flags; uint32_t reg_val = 1 << ((master * 2) + queue); + + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); if (0 == atomic_read(&cci_dev->cci_master_info[master].q_free[queue])) { msm_cci_load_report_cmd(cci_dev, master, queue); atomic_set(&cci_dev->cci_master_info[master].q_free[queue], 1); msm_camera_io_w_mb(reg_val, cci_dev->base + CCI_QUEUE_START_ADDR); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); + } else { + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); } } @@ -466,15 +487,23 @@ static int32_t msm_cci_process_full_q(struct cci_device *cci_dev, enum cci_i2c_queue_t queue) { int32_t rc = 0; + unsigned long flags; + + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); if (1 == atomic_read(&cci_dev->cci_master_info[master].q_free[queue])) { atomic_set(&cci_dev->cci_master_info[master]. done_pending[queue], 1); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); rc = msm_cci_wait(cci_dev, master, queue); if (rc < 0) { pr_err("%s: %d failed rc %d\n", __func__, __LINE__, rc); return rc; } } else { + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); rc = msm_cci_wait_report_cmd(cci_dev, master, queue); if (rc < 0) { pr_err("%s: %d failed rc %d\n", __func__, __LINE__, rc); @@ -502,8 +531,13 @@ static int32_t msm_cci_transfer_end(struct cci_device *cci_dev, enum cci_i2c_queue_t queue) { int32_t rc = 0; + unsigned long flags; + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); if (0 == atomic_read(&cci_dev->cci_master_info[master].q_free[queue])) { + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); rc = msm_cci_lock_queue(cci_dev, master, queue, 0); if (rc < 0) { pr_err("%s failed line %d\n", __func__, __LINE__); @@ -517,6 +551,8 @@ static int32_t msm_cci_transfer_end(struct cci_device *cci_dev, } else { atomic_set(&cci_dev->cci_master_info[master]. done_pending[queue], 1); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); rc = msm_cci_wait(cci_dev, master, queue); if (rc < 0) { pr_err("%s: %d failed rc %d\n", __func__, __LINE__, rc); @@ -571,6 +607,7 @@ static int32_t msm_cci_data_queue(struct cci_device *cci_dev, uint32_t reg_offset; uint32_t val = 0; uint32_t max_queue_size, queue_size = 0; + unsigned long flags; if (i2c_cmd == NULL) { pr_err("%s:%d Failed line\n", __func__, @@ -614,7 +651,11 @@ static int32_t msm_cci_data_queue(struct cci_device *cci_dev, msm_camera_io_w_mb(val, cci_dev->base + CCI_I2C_M0_Q0_LOAD_DATA_ADDR + reg_offset); + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); atomic_set(&cci_dev->cci_master_info[master].q_free[queue], 0); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); max_queue_size = cci_dev->cci_i2c_queue_info[master][queue]. max_queue_size; @@ -1639,6 +1680,7 @@ static int32_t msm_cci_config(struct v4l2_subdev *sd, static irqreturn_t msm_cci_irq(int irq_num, void *data) { uint32_t irq; + unsigned long flags; struct cci_device *cci_dev = data; irq = msm_camera_io_r_mb(cci_dev->base + CCI_IRQ_STATUS_0_ADDR); msm_camera_io_w_mb(irq, cci_dev->base + CCI_IRQ_CLEAR_0_ADDR); @@ -1665,22 +1707,30 @@ static irqreturn_t msm_cci_irq(int irq_num, void *data) if (irq & CCI_IRQ_STATUS_0_I2C_M0_Q0_REPORT_BMSK) { struct msm_camera_cci_master_info *cci_master_info; cci_master_info = &cci_dev->cci_master_info[MASTER_0]; + spin_lock_irqsave(&cci_dev->cci_master_info[MASTER_0]. + lock_q[QUEUE_0], flags); atomic_set(&cci_master_info->q_free[QUEUE_0], 0); cci_master_info->status = 0; if (atomic_read(&cci_master_info->done_pending[QUEUE_0]) == 1) { complete(&cci_master_info->report_q[QUEUE_0]); atomic_set(&cci_master_info->done_pending[QUEUE_0], 0); } + spin_unlock_irqrestore(&cci_dev->cci_master_info[MASTER_0]. + lock_q[QUEUE_0], flags); } if (irq & CCI_IRQ_STATUS_0_I2C_M0_Q1_REPORT_BMSK) { struct msm_camera_cci_master_info *cci_master_info; cci_master_info = &cci_dev->cci_master_info[MASTER_0]; + spin_lock_irqsave(&cci_dev->cci_master_info[MASTER_0]. + lock_q[QUEUE_1], flags); atomic_set(&cci_master_info->q_free[QUEUE_1], 0); cci_master_info->status = 0; if (atomic_read(&cci_master_info->done_pending[QUEUE_1]) == 1) { complete(&cci_master_info->report_q[QUEUE_1]); atomic_set(&cci_master_info->done_pending[QUEUE_1], 0); } + spin_unlock_irqrestore(&cci_dev->cci_master_info[MASTER_0]. + lock_q[QUEUE_1], flags); } if (irq & CCI_IRQ_STATUS_0_I2C_M1_RD_DONE_BMSK) { cci_dev->cci_master_info[MASTER_1].status = 0; @@ -1689,22 +1739,30 @@ static irqreturn_t msm_cci_irq(int irq_num, void *data) if (irq & CCI_IRQ_STATUS_0_I2C_M1_Q0_REPORT_BMSK) { struct msm_camera_cci_master_info *cci_master_info; cci_master_info = &cci_dev->cci_master_info[MASTER_1]; + spin_lock_irqsave(&cci_dev->cci_master_info[MASTER_1]. + lock_q[QUEUE_0], flags); atomic_set(&cci_master_info->q_free[QUEUE_0], 0); cci_master_info->status = 0; if (atomic_read(&cci_master_info->done_pending[QUEUE_0]) == 1) { complete(&cci_master_info->report_q[QUEUE_0]); atomic_set(&cci_master_info->done_pending[QUEUE_0], 0); } + spin_unlock_irqrestore(&cci_dev->cci_master_info[MASTER_1]. + lock_q[QUEUE_0], flags); } if (irq & CCI_IRQ_STATUS_0_I2C_M1_Q1_REPORT_BMSK) { struct msm_camera_cci_master_info *cci_master_info; cci_master_info = &cci_dev->cci_master_info[MASTER_1]; + spin_lock_irqsave(&cci_dev->cci_master_info[MASTER_1]. + lock_q[QUEUE_1], flags); atomic_set(&cci_master_info->q_free[QUEUE_1], 0); cci_master_info->status = 0; if (atomic_read(&cci_master_info->done_pending[QUEUE_1]) == 1) { complete(&cci_master_info->report_q[QUEUE_1]); atomic_set(&cci_master_info->done_pending[QUEUE_1], 0); } + spin_unlock_irqrestore(&cci_dev->cci_master_info[MASTER_1]. + lock_q[QUEUE_1], flags); } if (irq & CCI_IRQ_STATUS_0_I2C_M0_Q0Q1_HALT_ACK_BMSK) { cci_dev->cci_master_info[MASTER_0].reset_pending = TRUE; @@ -1793,7 +1851,9 @@ static void msm_cci_init_cci_params(struct cci_device *new_cci_dev) mutex_init(&new_cci_dev->cci_master_info[i].mutex_q[j]); init_completion(&new_cci_dev-> cci_master_info[i].report_q[j]); - } + spin_lock_init(&new_cci_dev-> + cci_master_info[i].lock_q[j]); + } } return; } diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h index 6e39d814bd731..eb615cc7a62c1 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h +++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -125,6 +125,7 @@ struct msm_camera_cci_master_info { struct mutex mutex_q[NUM_QUEUES]; struct completion report_q[NUM_QUEUES]; atomic_t done_pending[NUM_QUEUES]; + spinlock_t lock_q[NUM_QUEUES]; }; struct msm_cci_clk_params_t { From 484d509a8f77dddd3b56066ab2e88e6ee8c722e3 Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Wed, 31 Aug 2016 12:31:32 +0530 Subject: [PATCH 0849/1015] msm: mdss: update the wait logic for sending DSI commands For video mode panels, the assumption is that the vertical blanking region will be maximum of 4 ms and hence, we wait for 4 ms before queuing the DSI DMA commands. With the incell panels having huge vertical blanking region and dynamic fps feature, this assumption is no longer safe. Update the wait logic by calculating the vertical blanking duration. Change-Id: I69fdc182342493a54d78ae3ce5f4729e17452155 Signed-off-by: Padmanabhan Komanduru --- drivers/video/msm/mdss/mdss_dsi_host.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index ac7b259eb3b93..3b847c121e51a 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -39,6 +39,8 @@ #define MDSS_DSI_INT_CTRL 0x0110 +#define CEIL(x, y) (((x) + ((y) - 1)) / (y)) + struct mdss_dsi_ctrl_pdata *ctrl_list[DSI_CTRL_MAX]; struct mdss_hw mdss_dsi0_hw = { @@ -2357,14 +2359,25 @@ void mdss_dsi_wait4video_done(struct mdss_dsi_ctrl_pdata *ctrl) static int mdss_dsi_wait4video_eng_busy(struct mdss_dsi_ctrl_pdata *ctrl) { int ret = 0; + u32 v_total = 0, v_blank = 0, sleep_ms = 0, fps = 0; + struct mdss_panel_info *pinfo = &ctrl->panel_data.panel_info; if (ctrl->panel_mode == DSI_CMD_MODE) return ret; if (ctrl->ctrl_state & CTRL_STATE_MDP_ACTIVE) { mdss_dsi_wait4video_done(ctrl); - /* delay 4 ms to skip BLLP */ - usleep_range(4000, 4000); + v_total = mdss_panel_get_vtotal(pinfo); + v_blank = pinfo->lcdc.v_back_porch + pinfo->lcdc.v_pulse_width; + if (pinfo->dynamic_fps && pinfo->current_fps) + fps = pinfo->current_fps; + else + fps = pinfo->mipi.frame_rate; + + sleep_ms = CEIL((v_blank * 1000), (v_total * fps)); + /* delay sleep_ms to skip BLLP */ + if (sleep_ms) + usleep_range((sleep_ms * 1000), (sleep_ms * 1000) + 10); ret = 1; } From dbb2e1ca17053e932cd38b5236155447bd08cfe2 Mon Sep 17 00:00:00 2001 From: Padmanabhan Komanduru Date: Thu, 20 Oct 2016 14:06:45 +0530 Subject: [PATCH 0850/1015] msm: mdss: update the wait sequence for DSI_VIDEO_DONE interrupt At present, the previous VIDEO_DONE interrupt bit is cleared and the VIDEO_DONE_MASK bit are set in the DSI interrupt register by a single register write operation. This seems to be not reliable always and the DSI_VIDEO_DONE interrupt is generated for the previous VIDEO_DONE sometimes. Fix this sequence by clearing the previous DSI_VIDEO_DONE interrupt bit first followed by a separate register write to enable the VIDEO_DONE_MASK bit. Change-Id: Ic51424031bb1e4b5c5fae21bfe180c4620151c21 Signed-off-by: Padmanabhan Komanduru --- drivers/video/msm/mdss/mdss_dsi_host.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index 3b847c121e51a..9598519d867f7 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -2336,17 +2336,21 @@ void mdss_dsi_wait4video_done(struct mdss_dsi_ctrl_pdata *ctrl) /* DSI_INTL_CTRL */ data = MIPI_INP((ctrl->ctrl_base) + 0x0110); - /* clear previous VIDEO_DONE interrupt as well */ - data &= (DSI_INTR_TOTAL_MASK | DSI_INTR_VIDEO_DONE); - data |= DSI_INTR_VIDEO_DONE_MASK; - - MIPI_OUTP((ctrl->ctrl_base) + 0x0110, data); + /* clear previous VIDEO_DONE interrupt first */ + data &= DSI_INTR_TOTAL_MASK; + MIPI_OUTP((ctrl->ctrl_base) + 0x0110, (data | DSI_INTR_VIDEO_DONE)); + wmb(); /* make sure write happened */ spin_lock_irqsave(&ctrl->mdp_lock, flag); reinit_completion(&ctrl->video_comp); mdss_dsi_enable_irq(ctrl, DSI_VIDEO_TERM); spin_unlock_irqrestore(&ctrl->mdp_lock, flag); + /* set interrupt enable bit for VIDEO_DONE */ + data |= DSI_INTR_VIDEO_DONE_MASK; + MIPI_OUTP((ctrl->ctrl_base) + 0x0110, data); + wmb(); /* make sure write happened */ + wait_for_completion_timeout(&ctrl->video_comp, msecs_to_jiffies(VSYNC_PERIOD * 4)); From 90d23c419ec3fbe80238df818ef7859beee6bc2f Mon Sep 17 00:00:00 2001 From: jge Date: Tue, 23 May 2017 11:49:02 +0800 Subject: [PATCH 0851/1015] wcnss: Fix getting iris id wrong for wcn3610 card For wcn3610 and wcn3610v1, their IRIS card chip id are 0x9101 and 0x9110, so highest bit is 1. In wcnss_get_iris_name, when iris_id shifts 16bits right, it can't match the right name as the highest bit is filled up with 1. Change type of iris_id from int to u32, and add mask for iris_id. Change-Id: I3c17949fc327f9406326705191e4f5aedddfd3c4 CRs-Fixed: 2048990 Signed-off-by: Jingxiang Ge --- drivers/net/wireless/wcnss/wcnss_vreg.c | 12 +++++++----- include/linux/wcnss_wlan.h | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/wcnss/wcnss_vreg.c b/drivers/net/wireless/wcnss/wcnss_vreg.c index 82b90ad00f8b3..d0a04c06afd75 100644 --- a/drivers/net/wireless/wcnss/wcnss_vreg.c +++ b/drivers/net/wireless/wcnss/wcnss_vreg.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2015, 2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -39,6 +39,7 @@ static int is_power_on; #define PRONTO_IRIS_REG_READ_OFFSET 0x1134 #define PRONTO_IRIS_REG_CHIP_ID 0x04 +#define PRONTO_IRIS_REG_CHIP_ID_MASK 0xffff /* IRIS card chip ID's */ #define WCN3660 0x0200 #define WCN3660A 0x0300 @@ -124,13 +125,13 @@ int xo_auto_detect(u32 reg) int wcnss_get_iris_name(char *iris_name) { struct wcnss_wlan_config *cfg = NULL; - int iris_id; + u32 iris_id; cfg = wcnss_get_wlan_config(); if (cfg) { iris_id = cfg->iris_id; - iris_id = iris_id >> 16; + iris_id = PRONTO_IRIS_REG_CHIP_ID_MASK & (iris_id >> 16); } else { return 1; } @@ -167,8 +168,9 @@ EXPORT_SYMBOL(wcnss_get_iris_name); int validate_iris_chip_id(u32 reg) { - int iris_id; - iris_id = reg >> 16; + u32 iris_id; + + iris_id = PRONTO_IRIS_REG_CHIP_ID_MASK & (reg >> 16); switch (iris_id) { case WCN3660: diff --git a/include/linux/wcnss_wlan.h b/include/linux/wcnss_wlan.h index 4363485c5e4be..cd4c004d7ea1d 100644 --- a/include/linux/wcnss_wlan.h +++ b/include/linux/wcnss_wlan.h @@ -42,7 +42,7 @@ struct wcnss_wlan_config { int is_pronto_vadc; int is_pronto_v3; void __iomem *msm_wcnss_base; - int iris_id; + unsigned int iris_id; int vbatt; struct vregs_level pronto_vlevel[PRONTO_REGULATORS]; struct vregs_level iris_vlevel[IRIS_REGULATORS]; From 523cc17ee79204db1e1faf1055fa14c6e7030b99 Mon Sep 17 00:00:00 2001 From: Tanya Dixit Date: Mon, 6 Mar 2017 13:14:45 +0530 Subject: [PATCH 0852/1015] ASoC: msm: Fix mute on speaker in VoWLAN calls Add the proper DAPM routing for VoWLAN to fix mute in TX side. Change-Id: Id7306fbe8c1a301f09818068ea6712e2ac8cc2d7 CRs-Fixed: 2008274 Signed-off-by: Tanya Dixit --- sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c index b6684bcc61ac4..8dc0238b9176f 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c @@ -8422,6 +8422,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"VOIP_UL", NULL, "VOC_EXT_EC MUX"}, {"VoLTE_UL", NULL, "VOC_EXT_EC MUX"}, {"VOICE2_UL", NULL, "VOC_EXT_EC MUX"}, + {"VoWLAN_UL", NULL, "VOC_EXT_EC MUX"}, {"VOICEMMODE1_UL", NULL, "VOC_EXT_EC MUX"}, {"VOICEMMODE2_UL", NULL, "VOC_EXT_EC MUX"}, From 7cf99a49313840df0f38f0ffacdc2634734031bc Mon Sep 17 00:00:00 2001 From: Siva Kumar Akkireddi Date: Thu, 11 May 2017 15:29:47 +0530 Subject: [PATCH 0853/1015] msm: sps: Fix race condition in SPS debugfs APIs SPS debugfs APIs can be called concurrently which can result in dangling pointer access. This change synchronizes access to the SPS debugfs buffer. Change-Id: I409b3f0618f760cb67eba47b43c81d166cdae4aa Signed-off-by: Siva Kumar Akkireddi --- drivers/platform/msm/sps/sps.c | 15 ++++++++++++++- drivers/platform/msm/sps/spsi.h | 17 ----------------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/drivers/platform/msm/sps/sps.c b/drivers/platform/msm/sps/sps.c index 2f11c6dd7e05c..ddb2388c50063 100644 --- a/drivers/platform/msm/sps/sps.c +++ b/drivers/platform/msm/sps/sps.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016 , The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -67,6 +67,7 @@ static char *debugfs_buf; static u32 debugfs_buf_size; static u32 debugfs_buf_used; static int wraparound; +static struct mutex sps_debugfs_lock; struct dentry *dent; struct dentry *dfile_info; @@ -85,6 +86,7 @@ static struct sps_bam *phy2bam(phys_addr_t phys_addr); /* record debug info for debugfs */ void sps_debugfs_record(const char *msg) { + mutex_lock(&sps_debugfs_lock); if (debugfs_record_enabled) { if (debugfs_buf_used + MAX_MSG_LEN >= debugfs_buf_size) { debugfs_buf_used = 0; @@ -98,6 +100,7 @@ void sps_debugfs_record(const char *msg) debugfs_buf_size - debugfs_buf_used, "\n**** end line of sps log ****\n\n"); } + mutex_unlock(&sps_debugfs_lock); } /* read the recorded debug info to userspace */ @@ -107,6 +110,7 @@ static ssize_t sps_read_info(struct file *file, char __user *ubuf, int ret = 0; int size; + mutex_lock(&sps_debugfs_lock); if (debugfs_record_enabled) { if (wraparound) size = debugfs_buf_size - MAX_MSG_LEN; @@ -116,6 +120,7 @@ static ssize_t sps_read_info(struct file *file, char __user *ubuf, ret = simple_read_from_buffer(ubuf, count, ppos, debugfs_buf, size); } + mutex_unlock(&sps_debugfs_lock); return ret; } @@ -161,11 +166,13 @@ static ssize_t sps_set_info(struct file *file, const char __user *buf, new_buf_size = buf_size_kb * SZ_1K; + mutex_lock(&sps_debugfs_lock); if (debugfs_record_enabled) { if (debugfs_buf_size == new_buf_size) { /* need do nothing */ pr_info("sps:debugfs: input buffer size " "is the same as before.\n"); + mutex_unlock(&sps_debugfs_lock); return count; } else { /* release the current buffer */ @@ -185,12 +192,14 @@ static ssize_t sps_set_info(struct file *file, const char __user *buf, if (!debugfs_buf) { debugfs_buf_size = 0; pr_err("sps:fail to allocate memory for debug_fs.\n"); + mutex_unlock(&sps_debugfs_lock); return -ENOMEM; } debugfs_buf_used = 0; wraparound = false; debugfs_record_enabled = true; + mutex_unlock(&sps_debugfs_lock); return count; } @@ -239,6 +248,7 @@ static ssize_t sps_set_logging_option(struct file *file, const char __user *buf, return count; } + mutex_lock(&sps_debugfs_lock); if (((option == 0) || (option == 2)) && ((logging_option == 1) || (logging_option == 3))) { debugfs_record_enabled = false; @@ -250,6 +260,7 @@ static ssize_t sps_set_logging_option(struct file *file, const char __user *buf, } logging_option = option; + mutex_unlock(&sps_debugfs_lock); return count; } @@ -587,6 +598,8 @@ static void sps_debugfs_init(void) goto bam_log_level_err; } + mutex_init(&sps_debugfs_lock); + return; bam_log_level_err: diff --git a/drivers/platform/msm/sps/spsi.h b/drivers/platform/msm/sps/spsi.h index 1b4ca69bee16e..9e80381903418 100644 --- a/drivers/platform/msm/sps/spsi.h +++ b/drivers/platform/msm/sps/spsi.h @@ -145,11 +145,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } \ } while (0) -#define SPS_DEBUGFS(msg, args...) do { \ - char buf[MAX_MSG_LEN]; \ - snprintf(buf, MAX_MSG_LEN, msg"\n", ##args); \ - sps_debugfs_record(buf); \ - } while (0) #define SPS_ERR(dev, msg, args...) do { \ if (logging_option != 1) { \ if (unlikely(print_limit_option > 2)) \ @@ -157,8 +152,6 @@ extern u8 print_limit_option; else \ pr_err(msg, ##args); \ } \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ SPS_IPC(3, dev, msg, args); \ } while (0) #define SPS_INFO(dev, msg, args...) do { \ @@ -168,8 +161,6 @@ extern u8 print_limit_option; else \ pr_info(msg, ##args); \ } \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ SPS_IPC(3, dev, msg, args); \ } while (0) #define SPS_DBG(dev, msg, args...) do { \ @@ -181,8 +172,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 0) \ SPS_IPC(0, dev, msg, args); \ @@ -197,8 +186,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 1) \ SPS_IPC(1, dev, msg, args); \ @@ -213,8 +200,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 2) \ SPS_IPC(2, dev, msg, args); \ @@ -229,8 +214,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 3) \ SPS_IPC(3, dev, msg, args); \ From ea42dc73d91e011368b48a58bdce51a38838094a Mon Sep 17 00:00:00 2001 From: Fei Zhang Date: Wed, 17 May 2017 14:14:54 +0800 Subject: [PATCH 0854/1015] msm:camera: correct stats query out of boundary fix one potential out of boundary query of stats info. Change-Id: I13e4bf8802fcce529f9268c272e4727619d5ad8f Signed-off-by: Fei Zhang --- drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c old mode 100644 new mode 100755 index d4d2c82559847..8d2d8e7808c84 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c @@ -885,7 +885,7 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) &update_cmd->update_info[i]; /*check array reference bounds*/ if (STATS_IDX(update_info->stream_handle) - > vfe_dev->hw_info->stats_hw_info->num_stats_type) { + >= vfe_dev->hw_info->stats_hw_info->num_stats_type) { pr_err("%s: stats idx %d out of bound!", __func__, STATS_IDX(update_info->stream_handle)); return -EINVAL; From e4079d6f0df83b5cb3264eed88bd226d9941a7d1 Mon Sep 17 00:00:00 2001 From: Gaoxiang Chen Date: Wed, 17 May 2017 16:14:20 +0800 Subject: [PATCH 0855/1015] msm: camera: validate num_streams in stream_cfg_cmd before using it stream_cfg_cmd->num_streams is from userspace, need to check it against MSM_ISP_STATS_MAX before using it. CRs-Fixed: 2029867 Change-Id: I2ab892b7d406fc56de94c261a396866269e91d1a Signed-off-by: Gaoxiang Chen --- .../media/platform/msm/camera_v2/isp/msm_isp_stats_util.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c index d4d2c82559847..b53869298c4fb 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c @@ -857,6 +857,12 @@ int msm_isp_cfg_stats_stream(struct vfe_device *vfe_dev, void *arg) if (vfe_dev->stats_data.num_active_stream == 0) vfe_dev->hw_info->vfe_ops.stats_ops.cfg_ub(vfe_dev); + if (stream_cfg_cmd->num_streams > MSM_ISP_STATS_MAX) { + pr_err("%s invalid num_streams %d\n", __func__, + stream_cfg_cmd->num_streams); + return -EINVAL; + } + if (stream_cfg_cmd->enable) { msm_isp_stats_update_cgc_override(vfe_dev, stream_cfg_cmd); From beb2cf0aa9d79f1ed5214f1b7a023188f38f33fc Mon Sep 17 00:00:00 2001 From: Krupal Divvela Date: Thu, 18 May 2017 18:08:14 +0530 Subject: [PATCH 0856/1015] msm: camera: Use mutex lock to avoid race condition Use mutex lock before using queuing ioctls like queuing, dequeing buffers to avoid race condition. Change-Id: Ia9fdfd5a766add2f8d99003b0c2bfe7d34d57a09 Signed-off-by: Krupal Divvela --- .../platform/msm/camera_v2/fd/msm_fd_dev.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c index a6529a2e67a4e..3d5dd3e49407a 100644 --- a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c +++ b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c @@ -747,9 +747,13 @@ static int msm_fd_s_fmt_vid_out(struct file *file, static int msm_fd_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *req) { + int ret; struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); - return vb2_reqbufs(&ctx->vb2_q, req); + mutex_lock(&ctx->fd_device->recovery_lock); + ret = vb2_reqbufs(&ctx->vb2_q, req); + mutex_unlock(&ctx->fd_device->recovery_lock); + return ret; } /* @@ -761,9 +765,14 @@ static int msm_fd_reqbufs(struct file *file, static int msm_fd_qbuf(struct file *file, void *fh, struct v4l2_buffer *pb) { + int ret; struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); - return vb2_qbuf(&ctx->vb2_q, pb); + mutex_lock(&ctx->fd_device->recovery_lock); + ret = vb2_qbuf(&ctx->vb2_q, pb); + mutex_unlock(&ctx->fd_device->recovery_lock); + return ret; + } /* @@ -775,9 +784,13 @@ static int msm_fd_qbuf(struct file *file, void *fh, static int msm_fd_dqbuf(struct file *file, void *fh, struct v4l2_buffer *pb) { + int ret; struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); - return vb2_dqbuf(&ctx->vb2_q, pb, file->f_flags & O_NONBLOCK); + mutex_lock(&ctx->fd_device->recovery_lock); + ret = vb2_dqbuf(&ctx->vb2_q, pb, file->f_flags & O_NONBLOCK); + mutex_unlock(&ctx->fd_device->recovery_lock); + return ret; } /* From 4b11968110532cc5fc78201bbe3c3d45880cdddf Mon Sep 17 00:00:00 2001 From: Amir Samuelov Date: Sun, 15 Jan 2017 11:52:11 +0200 Subject: [PATCH 0857/1015] soc: qcom: remove spcom driver from msm-3.18 Remove spcom driver from msm-3.18, since Secure Processor hardware is present only starting from msm8998, which uses kernel msm-4.4. Future hardware SOC will use newer kernel. Change-Id: I222259fb79e7d1f74a38d622675a63b6ccd7ea4e Signed-off-by: Amir Samuelov --- drivers/soc/qcom/spcom.c | 2468 -------------------------------------- 1 file changed, 2468 deletions(-) delete mode 100644 drivers/soc/qcom/spcom.c diff --git a/drivers/soc/qcom/spcom.c b/drivers/soc/qcom/spcom.c deleted file mode 100644 index 7bcef2dcf704d..0000000000000 --- a/drivers/soc/qcom/spcom.c +++ /dev/null @@ -1,2468 +0,0 @@ -/* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* - * Secure-Processor-Communication (SPCOM). - * - * This driver provides communication to Secure Processor (SP) - * over G-Link transport layer. - * - * It provides interface to both User Space spcomlib and kernel drivers. - * - * User Space App shall use spcomlib for communication with SP. - * User Space App can be either Client or Server. - * spcomlib shall use write() file operation to send data, - * and read() file operation to read data. - * - * This driver uses glink as the transport layer. - * This driver exposes "/dev/" file node for each glink - * logical channel. - * This driver exposes "/dev/spcom" file node for some debug/control command. - * The predefined channel "/dev/sp_kernel" is used for loading SP Application - * from HLOS. - * This driver exposes "/dev/sp_ssr" file node to allow user space poll for SSR. - * After the remote SP App is loaded, this driver exposes a new file node - * "/dev/" for the matching HLOS App to use. - * The access to predefined file node is restricted by using unix group - * and SELinux. - * - * No message routing is use, but using the G-Link "multiplexing" feature - * to use a dedicated logical channel for HLOS and SP Application-Pair. - * - * Each HLOS/SP Application can be either Client or Server or both, - * Messaging is allays point-to-point between 2 HLOS<=>SP applications. - * - * User Space Request & Response are synchronous. - * read() & write() operations are blocking until completed or terminated. - * - * This driver registers to G-Link callbacks to be aware on channel state. - * A notify callback is called upon channel connect/disconnect. - * - */ - -/* Uncomment the line below to test spcom against modem rather than SP */ -/* #define SPCOM_TEST_HLOS_WITH_MODEM 1 */ - -/* Uncomment the line below to enable debug messages */ -/* #define DEBUG 1 */ - -#define pr_fmt(fmt) "spcom [%s]: " fmt, __func__ - -#include /* min() */ -#include /* MODULE_LICENSE */ -#include /* class_create() */ -#include /* kzalloc() */ -#include /* file_operations */ -#include /* cdev_add() */ -#include /* EINVAL, ETIMEDOUT */ -#include /* pr_err() */ -#include /* BIT(x) */ -#include /* wait_for_completion_timeout() */ -#include /* POLLOUT */ -#include /* dma_alloc_coherent() */ -#include -#include /* of_property_count_strings() */ -#include -#include /* msleep() */ -#include /* msm_ion_client_create() */ - -#include -#include -#include - -#include - -#include "glink_private.h" /* glink_ssr() */ - -/* "SPCM" string */ -#define SPCOM_MAGIC_ID ((uint32_t)(0x5350434D)) - -/* Request/Response */ -#define SPCOM_FLAG_REQ BIT(0) -#define SPCOM_FLAG_RESP BIT(1) -#define SPCOM_FLAG_ENCODED BIT(2) -#define SPCOM_FLAG_NON_ENCODED BIT(3) - -/* SPCOM driver name */ -#define DEVICE_NAME "spcom" - -#define SPCOM_MAX_CHANNELS 20 - -/* Maximum command size */ -#define SPCOM_MAX_COMMAND_SIZE (PAGE_SIZE) - -/* Maximum input size */ -#define SPCOM_MAX_READ_SIZE (PAGE_SIZE) - -/* Current Process ID */ -#define current_pid() ((u32)(current->pid)) - -/* Maximum channel name size (including null) - matching GLINK_NAME_SIZE */ -#define MAX_CH_NAME_LEN 32 - -/* Connection negotiation timeout, if remote channel is open */ -#define OPEN_CHANNEL_TIMEOUT_MSEC 100 - -/* - * After both sides get CONNECTED, - * there is a race between once side queueing rx buffer and the other side - * trying to call glink_tx() , this race is only on the 1st tx. - * do tx retry with some delay to allow the other side to queue rx buffer. - */ -#define TX_RETRY_DELAY_MSEC 100 - -/* number of tx retries */ -#define TX_MAX_RETRY 3 - -/* SPCOM_MAX_REQUEST_SIZE-or-SPCOM_MAX_RESPONSE_SIZE + header */ -#define SPCOM_RX_BUF_SIZE 300 - -/* The SPSS RAM size is 256 KB so SP App must fit into it */ -#define SPCOM_MAX_APP_SIZE SZ_256K - -/* ACK timeout from remote side for TX data */ -#define TX_DONE_TIMEOUT_MSEC 100 - -/* - * Initial transaction id, use non-zero nonce for debug. - * Incremented by client on request, and copied back by server on response. - */ -#define INITIAL_TXN_ID 0x12345678 - -/** - * struct spcom_msg_hdr - Request/Response message header between HLOS and SP. - * - * This header is proceeding any request specific parameters. - * The transaction id is used to match request with response. - * Note: glink API provides the rx/tx data size, so user payload size is - * calculated by reducing the header size. - */ -struct spcom_msg_hdr { - uint32_t reserved; /* for future use */ - uint32_t txn_id; /* transaction id */ - char buf[0]; /* Variable buffer size, must be last field */ -} __packed; - -/** - * struct spcom_client - Client handle - */ -struct spcom_client { - struct spcom_channel *ch; -}; - -/** - * struct spcom_server - Server handle - */ -struct spcom_server { - struct spcom_channel *ch; -}; - -/** - * struct spcom_channel - channel context - */ -struct spcom_channel { - char name[MAX_CH_NAME_LEN]; - struct mutex lock; - void *glink_handle; - uint32_t txn_id; /* incrementing nonce per channel */ - bool is_server; /* for txn_id and response_timeout_msec */ - uint32_t response_timeout_msec; /* for client only */ - - /* char dev */ - struct cdev *cdev; - struct device *dev; - struct device_attribute attr; - - /* - * glink state: CONNECTED / LOCAL_DISCONNECTED, REMOTE_DISCONNECTED - */ - unsigned glink_state; - - /* Events notification */ - struct completion connect; - struct completion disconnect; - struct completion tx_done; - struct completion rx_done; - - /* - * Only one client or server per channel. - * Only one rx/tx transaction at a time (request + response). - */ - int ref_count; - u32 pid; - - /* link UP/DOWN callback */ - void (*notify_link_state_cb)(bool up); - - /* abort flags */ - bool rx_abort; - bool tx_abort; - - /* rx data info */ - int rx_buf_size; /* allocated rx buffer size */ - bool rx_buf_ready; - int actual_rx_size; /* actual data size received */ - const void *glink_rx_buf; - - /* ION lock/unlock support */ - int ion_fd_table[SPCOM_MAX_ION_BUF]; - struct ion_handle *ion_handle_table[SPCOM_MAX_ION_BUF]; -}; - -/** - * struct spcom_device - device state structure. - */ -struct spcom_device { - char predefined_ch_name[SPCOM_MAX_CHANNELS][MAX_CH_NAME_LEN]; - - /* char device info */ - struct cdev cdev; - dev_t device_no; - struct class *driver_class; - struct device *class_dev; - - /* G-Link channels */ - struct spcom_channel channels[SPCOM_MAX_CHANNELS]; - int channel_count; - - /* private */ - struct mutex lock; - - /* Link state */ - struct completion link_state_changed; - enum glink_link_state link_state; - - /* ION support */ - struct ion_client *ion_client; -}; - -#ifdef SPCOM_TEST_HLOS_WITH_MODEM - static const char *spcom_edge = "mpss"; - static const char *spcom_transport = "smem"; -#else - static const char *spcom_edge = "spss"; - static const char *spcom_transport = "mailbox"; -#endif - -/* Device Driver State */ -static struct spcom_device *spcom_dev; - -/* static functions declaration */ -static int spcom_create_channel_chardev(const char *name); -static int spcom_open(struct spcom_channel *ch, unsigned int timeout_msec); -static int spcom_close(struct spcom_channel *ch); - -/** - * spcom_is_ready() - driver is initialized and ready. - */ -static inline bool spcom_is_ready(void) -{ - return spcom_dev != NULL; -} - -/** - * spcom_is_channel_open() - channel is open on this side. - * - * Channel might not be fully connected if remote side didn't open the channel - * yet. - */ -static inline bool spcom_is_channel_open(struct spcom_channel *ch) -{ - return ch->glink_handle != NULL; -} - -/** - * spcom_is_channel_connected() - channel is fully connected by both sides. - */ -static inline bool spcom_is_channel_connected(struct spcom_channel *ch) -{ - return (ch->glink_state == GLINK_CONNECTED); -} - -/** - * spcom_create_predefined_channels_chardev() - expose predefined channels to - * user space. - * - * Predefined channels list is provided by device tree. - * Typically, it is for known servers on remote side that are not loaded by the - * HLOS. - */ -static int spcom_create_predefined_channels_chardev(void) -{ - int i; - int ret; - - for (i = 0; i < SPCOM_MAX_CHANNELS; i++) { - const char *name = spcom_dev->predefined_ch_name[i]; - - if (name[0] == 0) - break; - ret = spcom_create_channel_chardev(name); - if (ret) { - pr_err("failed to create chardev [%s], ret [%d].\n", - name, ret); - return -EFAULT; - } - } - - return 0; -} - -/*======================================================================*/ -/* GLINK CALLBACKS */ -/*======================================================================*/ - -/** - * spcom_link_state_notif_cb() - glink callback for link state change. - * - * glink notifies link layer is up, before any channel opened on remote side. - * Calling glink_open() locally allowed only after link is up. - * Notify link down, normally upon Remote Subsystem Reset (SSR). - * Note: upon SSR, glink will also notify each channel about remote disconnect, - * and abort any pending rx buffer. - */ -static void spcom_link_state_notif_cb(struct glink_link_state_cb_info *cb_info, - void *priv) -{ - spcom_dev->link_state = cb_info->link_state; - - pr_debug("spcom_link_state_notif_cb called. transport = %s edge = %s\n", - cb_info->transport, cb_info->edge); - - switch (cb_info->link_state) { - case GLINK_LINK_STATE_UP: - pr_debug("GLINK_LINK_STATE_UP.\n"); - spcom_create_predefined_channels_chardev(); - break; - case GLINK_LINK_STATE_DOWN: - pr_debug("GLINK_LINK_STATE_DOWN.\n"); - break; - default: - pr_err("unknown link_state [%d].\n", cb_info->link_state); - break; - } - complete_all(&spcom_dev->link_state_changed); -} - -/** - * spcom_notify_rx() - glink callback on receiving data. - * - * Glink notify rx data is ready. The glink internal rx buffer was - * allocated upon glink_queue_rx_intent(). - */ -static void spcom_notify_rx(void *handle, - const void *priv, const void *pkt_priv, - const void *buf, size_t size) -{ - struct spcom_channel *ch = (struct spcom_channel *) priv; - - if (!ch) { - pr_err("invalid ch parameter.\n"); - return; - } - - pr_debug("ch [%s] rx size [%d].\n", ch->name, (int) size); - - ch->actual_rx_size = (int) size; - ch->glink_rx_buf = (void *) buf; - - complete_all(&ch->rx_done); -} - -/** - * spcom_notify_tx_done() - glink callback on ACK sent data. - * - * after calling glink_tx() the remote side ACK receiving the data. - */ -static void spcom_notify_tx_done(void *handle, - const void *priv, const void *pkt_priv, - const void *buf) -{ - struct spcom_channel *ch = (struct spcom_channel *) priv; - int *tx_buf = (int *) buf; - - if (!ch) { - pr_err("invalid ch parameter.\n"); - return; - } - - pr_debug("ch [%s] buf[0] = [0x%x].\n", ch->name, tx_buf[0]); - - complete_all(&ch->tx_done); -} - -/** - * spcom_notify_state() - glink callback on channel connect/disconnect. - * - * Channel is fully CONNECTED after both sides opened the channel. - * Channel is LOCAL_DISCONNECTED after both sides closed the channel. - * If the remote side closed the channel, it is expected that the local side - * will also close the channel. - * Upon connection, rx buffer is allocated to receive data, - * the maximum transfer size is agreed by both sides. - */ -static void spcom_notify_state(void *handle, const void *priv, unsigned event) -{ - int ret; - struct spcom_channel *ch = (struct spcom_channel *) priv; - - switch (event) { - case GLINK_CONNECTED: - pr_debug("GLINK_CONNECTED, ch name [%s].\n", ch->name); - complete_all(&ch->connect); - - /* - * if spcom_notify_state() is called within glink_open() - * then ch->glink_handle is not updated yet. - */ - if (!ch->glink_handle) { - pr_debug("update glink_handle, ch [%s].\n", ch->name); - ch->glink_handle = handle; - } - - /* prepare default rx buffer after connected */ - ret = glink_queue_rx_intent(ch->glink_handle, - ch, ch->rx_buf_size); - if (ret) { - pr_err("glink_queue_rx_intent() err [%d]\n", ret); - } else { - pr_debug("rx buf is ready, size [%d].\n", - ch->rx_buf_size); - ch->rx_buf_ready = true; - } - break; - case GLINK_LOCAL_DISCONNECTED: - /* - * Channel state is GLINK_LOCAL_DISCONNECTED - * only after *both* sides closed the channel. - */ - pr_debug("GLINK_LOCAL_DISCONNECTED, ch [%s].\n", ch->name); - complete_all(&ch->disconnect); - break; - case GLINK_REMOTE_DISCONNECTED: - /* - * Remote side initiates glink_close(). - * This is not expected on normal operation. - * This may happen upon remote SSR. - */ - pr_debug("GLINK_REMOTE_DISCONNECTED, ch [%s].\n", ch->name); - /* - * after glink_close(), - * expecting notify GLINK_LOCAL_DISCONNECTED - */ - spcom_close(ch); - break; - default: - pr_err("unknown event id = %d, ch name [%s].\n", - (int) event, ch->name); - return; - } - - ch->glink_state = event; -} - -/** - * spcom_notify_rx_intent_req() - glink callback on intent request. - * - * glink allows the remote side to request for a local rx buffer if such - * buffer is not ready. - * However, for spcom simplicity on SP, and to reduce latency, we decided - * that glink_tx() on both side is not using INTENT_REQ flag, so this - * callback should not be called. - * Anyhow, return "false" to reject the request. - */ -static bool spcom_notify_rx_intent_req(void *handle, const void *priv, - size_t req_size) -{ - struct spcom_channel *ch = (struct spcom_channel *) priv; - - pr_err("Unexpected intent request for ch [%s].\n", ch->name); - - return false; -} - -/** - * spcom_notify_rx_abort() - glink callback on aborting rx pending buffer. - * - * Rx abort may happen if channel is closed by remote side, while rx buffer is - * pending in the queue. - */ -static void spcom_notify_rx_abort(void *handle, const void *priv, - const void *pkt_priv) -{ - struct spcom_channel *ch = (struct spcom_channel *) priv; - - pr_debug("ch [%s] pending rx aborted.\n", ch->name); - - if (spcom_is_channel_connected(ch)) { - ch->rx_abort = true; - complete_all(&ch->rx_done); - } -} - -/** - * spcom_notify_tx_abort() - glink callback on aborting tx data. - * - * This is probably not relevant, since glink_txv() is not used. - * Tx abort may happen if channel is closed by remote side, - * while multiple tx buffers are in a middle of tx operation. - */ -static void spcom_notify_tx_abort(void *handle, const void *priv, - const void *pkt_priv) -{ - struct spcom_channel *ch = (struct spcom_channel *) priv; - - pr_debug("ch [%s] pending tx aborted.\n", ch->name); - - if (spcom_is_channel_connected(ch)) { - complete_all(&ch->tx_done); - ch->tx_abort = true; - } -} - -/*======================================================================*/ -/* UTILITIES */ -/*======================================================================*/ - -/** - * spcom_init_open_config() - Fill glink_open() configuration parameters. - * - * @cfg: glink configuration struct pointer - * @name: channel name - * @priv: private caller data, provided back by callbacks, channel state. - * - * specify callbacks and other parameters for glink open channel. - */ -static void spcom_init_open_config(struct glink_open_config *cfg, - const char *name, void *priv) -{ - cfg->notify_rx = spcom_notify_rx; - cfg->notify_rxv = NULL; - cfg->notify_tx_done = spcom_notify_tx_done; - cfg->notify_state = spcom_notify_state; - cfg->notify_rx_intent_req = spcom_notify_rx_intent_req; - cfg->notify_rx_sigs = NULL; - cfg->notify_rx_abort = spcom_notify_rx_abort; - cfg->notify_tx_abort = spcom_notify_tx_abort; - - cfg->options = 0; /* not using GLINK_OPT_INITIAL_XPORT */ - cfg->priv = priv; /* provided back by callbacks */ - - cfg->name = name; - - cfg->transport = spcom_transport; - cfg->edge = spcom_edge; -} - -/** - * spcom_init_channel() - initialize channel state. - * - * @ch: channel state struct pointer - * @name: channel name - */ -static int spcom_init_channel(struct spcom_channel *ch, const char *name) -{ - if (!ch || !name || !name[0]) { - pr_err("invalid parameters.\n"); - return -EINVAL; - } - - strlcpy(ch->name, name, sizeof(ch->name)); - - init_completion(&ch->connect); - init_completion(&ch->disconnect); - init_completion(&ch->tx_done); - init_completion(&ch->rx_done); - - mutex_init(&ch->lock); - ch->glink_state = GLINK_LOCAL_DISCONNECTED; - ch->actual_rx_size = 0; - ch->rx_buf_size = SPCOM_RX_BUF_SIZE; - - return 0; -} - -/** - * spcom_find_channel_by_name() - find a channel by name. - * - * @name: channel name - * - * Return: a channel state struct. - */ -static struct spcom_channel *spcom_find_channel_by_name(const char *name) -{ - int i; - - for (i = 0 ; i < ARRAY_SIZE(spcom_dev->channels); i++) { - struct spcom_channel *ch = &spcom_dev->channels[i]; - - if (strcmp(ch->name, name) == 0) { - pr_debug("channel [%s] found.\n", name); - return ch; - } - } - - pr_err("failed to find channel [%s].\n", name); - - return NULL; -} - -/** - * spcom_open() - Open glink channel and wait for connection ACK. - * - * @ch: channel state struct pointer - * - * Normally, a local client opens a channel after remote server has opened - * the channel. - * A local server may open the channel before remote client is running. - */ -static int spcom_open(struct spcom_channel *ch, unsigned int timeout_msec) -{ - struct glink_open_config cfg = {0}; - unsigned long jiffies = msecs_to_jiffies(timeout_msec); - long timeleft; - const char *name; - void *handle; - - mutex_lock(&ch->lock); - name = ch->name; - - /* only one client/server may use the channel */ - if (ch->ref_count) { - pr_err("channel [%s] already in use.\n", name); - goto exit_err; - } - ch->ref_count++; - ch->pid = current_pid(); - ch->txn_id = INITIAL_TXN_ID; - - pr_debug("ch [%s] opened by PID [%d], count [%d]\n", - name, ch->pid, ch->ref_count); - - pr_debug("Open channel [%s] timeout_msec [%d].\n", name, timeout_msec); - - if (spcom_is_channel_open(ch)) { - pr_debug("channel [%s] already open.\n", name); - mutex_unlock(&ch->lock); - return 0; - } - - spcom_init_open_config(&cfg, name, ch); - - /* init completion before calling glink_open() */ - reinit_completion(&ch->connect); - - handle = glink_open(&cfg); - if (IS_ERR_OR_NULL(handle)) { - pr_err("glink_open failed.\n"); - goto exit_err; - } else { - pr_debug("glink_open [%s] ok.\n", name); - } - ch->glink_handle = handle; - - pr_debug("Wait for connection on channel [%s] timeout_msec [%d].\n", - name, timeout_msec); - - /* Wait for remote side to connect */ - if (timeout_msec) { - timeleft = wait_for_completion_timeout(&(ch->connect), jiffies); - if (timeleft == 0) - pr_debug("Channel [%s] is NOT connected.\n", name); - else - pr_debug("Channel [%s] fully connect.\n", name); - } else { - pr_debug("wait for connection ch [%s] no timeout.\n", name); - wait_for_completion(&(ch->connect)); - pr_debug("Channel [%s] opened, no timeout.\n", name); - } - - mutex_unlock(&ch->lock); - - return 0; -exit_err: - mutex_unlock(&ch->lock); - - return -EFAULT; -} - -/** - * spcom_close() - Close glink channel. - * - * @ch: channel state struct pointer - * - * A calling API functions should wait for disconnecting by both sides. - */ -static int spcom_close(struct spcom_channel *ch) -{ - int ret = 0; - - mutex_lock(&ch->lock); - - if (!spcom_is_channel_open(ch)) { - pr_err("ch already closed.\n"); - mutex_unlock(&ch->lock); - return 0; - } - - ret = glink_close(ch->glink_handle); - if (ret) - pr_err("glink_close() fail, ret [%d].\n", ret); - else - pr_debug("glink_close() ok.\n"); - - ch->glink_handle = NULL; - ch->ref_count = 0; - - ch->txn_id = INITIAL_TXN_ID; /* use non-zero nonce for debug */ - ch->pid = 0; - - pr_debug("Channel closed [%s].\n", ch->name); - mutex_unlock(&ch->lock); - - return 0; -} - -/** - * spcom_tx() - Send data and wait for ACK or timeout. - * - * @ch: channel state struct pointer - * @buf: buffer pointer - * @size: buffer size - * - * ACK is expected within a very short time (few msec). - */ -static int spcom_tx(struct spcom_channel *ch, - void *buf, - uint32_t size, - uint32_t timeout_msec) -{ - int ret; - void *pkt_priv = NULL; - uint32_t tx_flags = 0 ; /* don't use GLINK_TX_REQ_INTENT */ - unsigned long jiffies = msecs_to_jiffies(timeout_msec); - long timeleft; - int retry = 0; - - mutex_lock(&ch->lock); - - /* reset completion before calling glink */ - reinit_completion(&ch->tx_done); - - for (retry = 0; retry < TX_MAX_RETRY ; retry++) { - ret = glink_tx(ch->glink_handle, pkt_priv, buf, size, tx_flags); - if (ret == -EAGAIN) { - pr_err("glink_tx() fail, try again.\n"); - /* - * Delay to allow remote side to queue rx buffer. - * This may happen after the first channel connection. - */ - msleep(TX_RETRY_DELAY_MSEC); - } else if (ret < 0) { - pr_err("glink_tx() error %d.\n", ret); - goto exit_err; - } else { - break; /* no retry needed */ - } - } - - pr_debug("Wait for Tx done.\n"); - - /* Wait for Tx Completion */ - timeleft = wait_for_completion_timeout(&ch->tx_done, jiffies); - if (timeleft == 0) { - pr_err("tx_done timeout %d msec expired.\n", timeout_msec); - goto exit_err; - } else if (ch->tx_abort) { - pr_err("tx aborted.\n"); - goto exit_err; - } - - mutex_unlock(&ch->lock); - - return ret; -exit_err: - mutex_unlock(&ch->lock); - return -EFAULT; -} - -/** - * spcom_rx() - Wait for received data until timeout, unless pending rx data is - * already ready - * - * @ch: channel state struct pointer - * @buf: buffer pointer - * @size: buffer size - * - * ACK is expected within a very short time (few msec). - */ -static int spcom_rx(struct spcom_channel *ch, - void *buf, - uint32_t size, - uint32_t timeout_msec) -{ - int ret; - unsigned long jiffies = msecs_to_jiffies(timeout_msec); - long timeleft = 1; - - mutex_lock(&ch->lock); - - /* check for already pending data */ - if (ch->actual_rx_size) { - pr_debug("already pending data size [%d].\n", - ch->actual_rx_size); - goto copy_buf; - } - - /* reset completion before calling glink */ - reinit_completion(&ch->rx_done); - - /* Wait for Rx response */ - pr_debug("Wait for Rx done.\n"); - if (timeout_msec) - timeleft = wait_for_completion_timeout(&ch->rx_done, jiffies); - else - wait_for_completion(&ch->rx_done); - - if (timeleft == 0) { - pr_err("rx_done timeout [%d] msec expired.\n", timeout_msec); - goto exit_err; - } else if (ch->rx_abort) { - pr_err("rx aborted.\n"); - goto exit_err; - } else if (ch->actual_rx_size) { - pr_debug("actual_rx_size is [%d].\n", ch->actual_rx_size); - } else { - pr_err("actual_rx_size is zero.\n"); - goto exit_err; - } - - if (!ch->glink_rx_buf) { - pr_err("invalid glink_rx_buf.\n"); - goto exit_err; - } - -copy_buf: - /* Copy from glink buffer to spcom buffer */ - size = min_t(int, ch->actual_rx_size, size); - memcpy(buf, ch->glink_rx_buf, size); - - pr_debug("copy size [%d].\n", (int) size); - - /* free glink buffer after copy to spcom buffer */ - glink_rx_done(ch->glink_handle, ch->glink_rx_buf, false); - ch->glink_rx_buf = NULL; - ch->actual_rx_size = 0; - - /* queue rx buffer for the next time */ - ret = glink_queue_rx_intent(ch->glink_handle, ch, ch->rx_buf_size); - if (ret) { - pr_err("glink_queue_rx_intent() failed, ret [%d]", ret); - goto exit_err; - } else { - pr_debug("queue rx_buf, size [%d].\n", ch->rx_buf_size); - } - - mutex_unlock(&ch->lock); - - return size; -exit_err: - mutex_unlock(&ch->lock); - return -EFAULT; -} - -/** - * spcom_get_next_request_size() - get request size. - * already ready - * - * @ch: channel state struct pointer - * - * Server needs the size of the next request to allocate a request buffer. - * Initially used intent-request, however this complicated the remote side, - * so both sides are not using glink_tx() with INTENT_REQ anymore. - */ -static int spcom_get_next_request_size(struct spcom_channel *ch) -{ - int size = -1; - - /* NOTE: Remote clients might not be connected yet.*/ - mutex_lock(&ch->lock); - reinit_completion(&ch->rx_done); - - /* check if already got it via callback */ - if (ch->actual_rx_size) { - pr_debug("next-req-size already ready ch [%s] size [%d].\n", - ch->name, ch->actual_rx_size); - goto exit_ready; - } - - pr_debug("Wait for Rx Done, ch [%s].\n", ch->name); - wait_for_completion(&ch->rx_done); - if (ch->actual_rx_size <= 0) { - pr_err("invalid rx size [%d] ch [%s].\n", - ch->actual_rx_size, ch->name); - goto exit_error; - } - -exit_ready: - size = ch->actual_rx_size; - if (size > sizeof(struct spcom_msg_hdr)) { - size -= sizeof(struct spcom_msg_hdr); - } else { - pr_err("rx size [%d] too small.\n", size); - goto exit_error; - } - - mutex_unlock(&ch->lock); - return size; - -exit_error: - mutex_unlock(&ch->lock); - return -EFAULT; - - -} - -/*======================================================================*/ -/* Client API for kernel drivers */ -/*======================================================================*/ - -/** - * spcom_register_client() - register a client. - * - * @info: channel name and ssr callback. - * - * Return: client handle - */ -struct spcom_client *spcom_register_client(struct spcom_client_info *info) -{ - int ret; - const char *name; - struct spcom_channel *ch; - struct spcom_client *client; - - if (!info) { - pr_err("Invalid parameter.\n"); - return NULL; - } - name = info->ch_name; - - client = kzalloc(sizeof(*client), GFP_KERNEL); - if (!client) - return NULL; - - ch = spcom_find_channel_by_name(name); - if (!ch) { - pr_err("channel %s doesn't exist, load App first.\n", name); - return NULL; - } - - client->ch = ch; /* backtrack */ - - ret = spcom_open(ch, OPEN_CHANNEL_TIMEOUT_MSEC); - if (ret) { - pr_err("failed to open channel [%s].\n", name); - kfree(client); - client = NULL; - } else { - pr_info("remote side connect to channel [%s].\n", name); - } - - return client; -} -EXPORT_SYMBOL(spcom_register_client); - - -/** - * spcom_unregister_client() - unregister a client. - * - * @client: client handle - */ -int spcom_unregister_client(struct spcom_client *client) -{ - struct spcom_channel *ch; - - if (!client) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = client->ch; - - kfree(client); - - spcom_close(ch); - - return 0; -} -EXPORT_SYMBOL(spcom_unregister_client); - - -/** - * spcom_client_send_message_sync() - send request and wait for response. - * - * @client: client handle - * @req_ptr: request pointer - * @req_size: request size - * @resp_ptr: response pointer - * @resp_size: response size - * @timeout_msec: timeout waiting for response. - * - * The timeout depends on the specific request handling time at the remote side. - */ -int spcom_client_send_message_sync(struct spcom_client *client, - void *req_ptr, - uint32_t req_size, - void *resp_ptr, - uint32_t resp_size, - uint32_t timeout_msec) -{ - int ret; - struct spcom_channel *ch; - - if (!client || !req_ptr || !resp_ptr) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = client->ch; - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - ret = spcom_tx(ch, req_ptr, req_size, TX_DONE_TIMEOUT_MSEC); - if (ret < 0) { - pr_err("tx error %d.\n", ret); - return ret; - } - - ret = spcom_rx(ch, resp_ptr, resp_size, timeout_msec); - if (ret < 0) { - pr_err("rx error %d.\n", ret); - return ret; - } - - /* @todo verify response transaction id match the request */ - - return ret; -} -EXPORT_SYMBOL(spcom_client_send_message_sync); - - -/** - * spcom_client_is_server_connected() - is remote server connected. - * - * @client: client handle - */ -bool spcom_client_is_server_connected(struct spcom_client *client) -{ - bool connected; - - if (!client) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - connected = spcom_is_channel_connected(client->ch); - - return connected; -} -EXPORT_SYMBOL(spcom_client_is_server_connected); - -/*======================================================================*/ -/* Server API for kernel drivers */ -/*======================================================================*/ - -/** - * spcom_register_service() - register a server. - * - * @info: channel name and ssr callback. - * - * Return: server handle - */ -struct spcom_server *spcom_register_service(struct spcom_service_info *info) -{ - int ret; - const char *name; - struct spcom_channel *ch; - struct spcom_server *server; - - if (!info) { - pr_err("Invalid parameter.\n"); - return NULL; - } - name = info->ch_name; - - server = kzalloc(sizeof(*server), GFP_KERNEL); - if (!server) - return NULL; - - ch = spcom_find_channel_by_name(name); - if (!ch) { - pr_err("channel %s doesn't exist, load App first.\n", name); - return NULL; - } - - server->ch = ch; /* backtrack */ - - ret = spcom_open(ch, 0); - if (ret) { - pr_err("failed to open channel [%s].\n", name); - kfree(server); - server = NULL; - } - - return server; -} -EXPORT_SYMBOL(spcom_register_service); - -/** - * spcom_unregister_service() - unregister a server. - * - * @server: server handle - */ -int spcom_unregister_service(struct spcom_server *server) -{ - struct spcom_channel *ch; - - if (!server) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = server->ch; - - kfree(server); - - spcom_close(ch); - - return 0; -} -EXPORT_SYMBOL(spcom_unregister_service); - -/** - * spcom_server_get_next_request_size() - get request size. - * - * @server: server handle - * - * Return: request size in bytes. - */ -int spcom_server_get_next_request_size(struct spcom_server *server) -{ - int size; - struct spcom_channel *ch; - - if (!server) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = server->ch; - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - size = spcom_get_next_request_size(ch); - - pr_debug("next_request_size [%d].\n", size); - - return size; -} -EXPORT_SYMBOL(spcom_server_get_next_request_size); - -/** - * spcom_server_wait_for_request() - wait for request. - * - * @server: server handle - * @req_ptr: request buffer pointer - * @req_size: max request size - * - * Return: request size in bytes. - */ -int spcom_server_wait_for_request(struct spcom_server *server, - void *req_ptr, - uint32_t req_size) -{ - int ret; - struct spcom_channel *ch; - - if (!server || !req_ptr) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = server->ch; - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - ret = spcom_rx(ch, req_ptr, req_size, 0); - - return ret; -} -EXPORT_SYMBOL(spcom_server_wait_for_request); - -/** - * spcom_server_send_response() - Send response - * - * @server: server handle - * @resp_ptr: response buffer pointer - * @resp_size: response size - */ -int spcom_server_send_response(struct spcom_server *server, - void *resp_ptr, - uint32_t resp_size) -{ - int ret; - struct spcom_channel *ch; - - if (!server || !resp_ptr) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = server->ch; - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - ret = spcom_tx(ch, resp_ptr, resp_size, TX_DONE_TIMEOUT_MSEC); - - return ret; -} -EXPORT_SYMBOL(spcom_server_send_response); - -/*======================================================================*/ -/* USER SPACE commands handling */ -/*======================================================================*/ - -/** - * spcom_handle_create_channel_command() - Handle Create Channel command from - * user space. - * - * @cmd_buf: command buffer. - * @cmd_size: command buffer size. - * - * Return: 0 on successful operation, negative value otherwise. - */ -static int spcom_handle_create_channel_command(void *cmd_buf, int cmd_size) -{ - int ret = 0; - struct spcom_user_create_channel_command *cmd = cmd_buf; - const char *ch_name; - - if (cmd_size != sizeof(*cmd)) { - pr_err("cmd_size [%d] , expected [%d].\n", - (int) cmd_size, (int) sizeof(*cmd)); - return -EINVAL; - } - - ch_name = cmd->ch_name; - - pr_debug("ch_name [%s].\n", ch_name); - - ret = spcom_create_channel_chardev(ch_name); - - return ret; -} - -/** - * spcom_handle_send_command() - Handle send request/response from user space. - * - * @buf: command buffer. - * @buf_size: command buffer size. - * - * Return: 0 on successful operation, negative value otherwise. - */ -static int spcom_handle_send_command(struct spcom_channel *ch, - void *cmd_buf, int size) -{ - int ret = 0; - struct spcom_send_command *cmd = cmd_buf; - uint32_t buf_size; - void *buf; - struct spcom_msg_hdr *hdr; - void *tx_buf; - int tx_buf_size; - uint32_t timeout_msec; - - pr_debug("send req/resp ch [%s] size [%d] .\n", ch->name, size); - - /* - * check that cmd buf size is at least struct size, - * to allow access to struct fields. - */ - if (size < sizeof(*cmd)) { - pr_err("ch [%s] invalid cmd buf.\n", - ch->name); - return -EINVAL; - } - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - /* parse command buffer */ - buf = &cmd->buf; - buf_size = cmd->buf_size; - timeout_msec = cmd->timeout_msec; - - /* Check param validity */ - if (buf_size > SPCOM_MAX_RESPONSE_SIZE) { - pr_err("ch [%s] invalid buf size [%d].\n", - ch->name, buf_size); - return -EINVAL; - } - if (size != sizeof(*cmd) + buf_size) { - pr_err("ch [%s] invalid cmd size [%d].\n", - ch->name, size); - return -EINVAL; - } - - /* Allocate Buffers*/ - tx_buf_size = sizeof(*hdr) + buf_size; - tx_buf = kzalloc(tx_buf_size, GFP_KERNEL); - if (!tx_buf) - return -ENOMEM; - - /* Prepare Tx Buf */ - hdr = tx_buf; - - /* Header */ - hdr->txn_id = ch->txn_id; - if (!ch->is_server) { - ch->txn_id++; /* client sets the request txn_id */ - ch->response_timeout_msec = timeout_msec; - } - - /* user buf */ - memcpy(hdr->buf, buf, buf_size); - - /* - * remote side should have rx buffer ready. - * tx_done is expected to be received quickly. - */ - ret = spcom_tx(ch, tx_buf, tx_buf_size, TX_DONE_TIMEOUT_MSEC); - if (ret < 0) - pr_err("tx error %d.\n", ret); - - kfree(tx_buf); - - return ret; -} - -/** - * modify_ion_addr() - replace the ION buffer virtual address with physical - * address in a request or response buffer. - * - * @buf: buffer to modify - * @buf_size: buffer size - * @ion_info: ION buffer info such as FD and offset in buffer. - * - * Return: 0 on successful operation, negative value otherwise. - */ -static int modify_ion_addr(void *buf, - uint32_t buf_size, - struct spcom_ion_info ion_info) -{ - struct ion_handle *handle = NULL; - ion_phys_addr_t ion_phys_addr; - size_t len; - int fd; - uint32_t buf_offset; - uint64_t *addr; - int ret; - - fd = ion_info.fd; - buf_offset = ion_info.buf_offset; - - if (fd < 0) { - pr_err("invalid fd [%d].\n", fd); - return -ENODEV; - } - - if (buf_size < sizeof(uint64_t)) { - pr_err("buf size too small [%d].\n", buf_size); - return -ENODEV; - } - - if (buf_offset > buf_size - sizeof(uint64_t)) { - pr_err("invalid buf_offset [%d].\n", buf_offset); - return -ENODEV; - } - - /* Get ION handle from fd */ - handle = ion_import_dma_buf(spcom_dev->ion_client, fd); - if (handle == NULL) { - pr_err("fail to get ion handle.\n"); - return -EINVAL; - } - pr_debug("ion handle ok.\n"); - - /* Get the ION buffer Physical Address */ - ret = ion_phys(spcom_dev->ion_client, handle, &ion_phys_addr, &len); - if (ret < 0) { - pr_err("fail to get ion phys addr.\n"); - ion_free(spcom_dev->ion_client, handle); - return -EINVAL; - } - pr_debug("buf_offset [%d].\n", buf_offset); - addr = (uint64_t *) ((char *) buf + buf_offset); - - /* Replace the user ION Virtual Address with the Physical Address */ - pr_debug("ion user vaddr = [0x%lx].\n", (long int) *addr); - *addr = (uint64_t) ion_phys_addr; - pr_debug("ion phys addr = [0x%lx].\n", (long int) *addr); - - /* Release the ION handle */ - ion_free(spcom_dev->ion_client, handle); - - return 0; -} - -/** - * spcom_handle_send_modified_command() - send a request/response with ION - * buffer address. Modify the request/response by replacing the ION buffer - * virtual address with the physical address. - * - * @ch: channel pointer - * @cmd_buf: User space command buffer - * @size: size of user command buffer - * - * Return: 0 on successful operation, negative value otherwise. - */ -static int spcom_handle_send_modified_command(struct spcom_channel *ch, - void *cmd_buf, int size) -{ - int ret = 0; - struct spcom_user_send_modified_command *cmd = cmd_buf; - uint32_t buf_size; - void *buf; - struct spcom_msg_hdr *hdr; - void *tx_buf; - int tx_buf_size; - uint32_t timeout_msec; - struct spcom_ion_info ion_info[SPCOM_MAX_ION_BUF]; - int i; - - pr_debug("send req/resp ch [%s] size [%d] .\n", ch->name, size); - - /* - * check that cmd buf size is at least struct size, - * to allow access to struct fields. - */ - if (size < sizeof(*cmd)) { - pr_err("ch [%s] invalid cmd buf.\n", - ch->name); - return -EINVAL; - } - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - /* parse command buffer */ - buf = &cmd->buf; - buf_size = cmd->buf_size; - timeout_msec = cmd->timeout_msec; - memcpy(ion_info, cmd->ion_info, sizeof(ion_info)); - - /* Check param validity */ - if (buf_size > SPCOM_MAX_RESPONSE_SIZE) { - pr_err("ch [%s] invalid buf size [%d].\n", - ch->name, buf_size); - return -EINVAL; - } - if (size != sizeof(*cmd) + buf_size) { - pr_err("ch [%s] invalid cmd size [%d].\n", - ch->name, size); - return -EINVAL; - } - - /* Allocate Buffers*/ - tx_buf_size = sizeof(*hdr) + buf_size; - tx_buf = kzalloc(tx_buf_size, GFP_KERNEL); - if (!tx_buf) - return -ENOMEM; - - /* Prepare Tx Buf */ - hdr = tx_buf; - - /* Header */ - hdr->txn_id = ch->txn_id; - if (!ch->is_server) { - ch->txn_id++; /* client sets the request txn_id */ - ch->response_timeout_msec = timeout_msec; - } - - /* user buf */ - memcpy(hdr->buf, buf, buf_size); - - for (i = 0 ; i < SPCOM_MAX_ION_BUF ; i++) { - if (ion_info[i].fd >= 0) { - ret = modify_ion_addr(hdr->buf, buf_size, ion_info[i]); - if (ret < 0) { - pr_err("modify_ion_addr() error [%d].\n", ret); - kfree(tx_buf); - return -EFAULT; - } - } - } - - /* - * remote side should have rx buffer ready. - * tx_done is expected to be received quickly. - */ - ret = spcom_tx(ch, tx_buf, tx_buf_size, TX_DONE_TIMEOUT_MSEC); - if (ret < 0) - pr_err("tx error %d.\n", ret); - - kfree(tx_buf); - - return ret; -} - - -/** - * spcom_handle_lock_ion_buf_command() - Lock an ION buffer. - * - * Lock an ION buffer, prevent it from being free if the user space App crash, - * while it is used by the remote subsystem. - */ -static int spcom_handle_lock_ion_buf_command(struct spcom_channel *ch, - void *cmd_buf, int size) -{ - struct spcom_user_command *cmd = cmd_buf; - int fd = cmd->arg; - struct ion_handle *ion_handle; - int i; - - if (size != sizeof(*cmd)) { - pr_err("cmd size [%d] , expected [%d].\n", - (int) size, (int) sizeof(*cmd)); - return -EINVAL; - } - - /* Check ION client */ - if (spcom_dev->ion_client == NULL) { - pr_err("invalid ion client.\n"); - return -ENODEV; - } - - /* Check if this FD is already locked */ - for (i = 0 ; i < SPCOM_MAX_ION_BUF ; i++) - if (ch->ion_fd_table[i] == fd) { - pr_debug("fd [%d] is already locked.\n", fd); - return -EINVAL; - } - - /* Get ION handle from fd - this increments the ref count */ - ion_handle = ion_import_dma_buf(spcom_dev->ion_client, fd); - if (ion_handle == NULL) { - pr_err("fail to get ion handle.\n"); - return -EINVAL; - } - pr_debug("ion handle ok.\n"); - - for (i = 0 ; i < SPCOM_MAX_ION_BUF ; i++) { - if (ch->ion_handle_table[i] == NULL) { - ch->ion_handle_table[i] = ion_handle; - ch->ion_fd_table[i] = fd; - pr_debug("locked ion buf#[%d], fd [%d].\n", i, fd); - return 0; - } - } - - return -EFAULT; -} - -/** - * spcom_handle_unlock_ion_buf_command() - Unlock an ION buffer. - * - * Unlock an ION buffer, let it be free, when it is no longer being used by - * the remote subsystem. - */ -static int spcom_handle_unlock_ion_buf_command(struct spcom_channel *ch, - void *cmd_buf, int size) -{ - struct spcom_user_command *cmd = cmd_buf; - int fd = cmd->arg; - struct ion_client *ion_client = spcom_dev->ion_client; - int i; - - if (size != sizeof(*cmd)) { - pr_err("cmd size [%d] , expected [%d].\n", - (int) size, (int) sizeof(*cmd)); - return -EINVAL; - } - - /* Check ION client */ - if (ion_client == NULL) { - pr_err("fail to create ion client.\n"); - return -ENODEV; - } - - if (fd == (int) SPCOM_ION_FD_UNLOCK_ALL) { - /* unlock all ION buf */ - for (i = 0 ; i < SPCOM_MAX_ION_BUF ; i++) { - if (ch->ion_handle_table[i] != NULL) { - ion_free(ion_client, ch->ion_handle_table[i]); - ch->ion_handle_table[i] = NULL; - ch->ion_fd_table[i] = -1; - pr_debug("unlocked ion buf#[%d].\n", i); - } - } - } else { - /* unlock specific ION buf */ - for (i = 0 ; i < SPCOM_MAX_ION_BUF ; i++) { - if (ch->ion_fd_table[i] == fd) { - ion_free(ion_client, ch->ion_handle_table[i]); - ch->ion_handle_table[i] = NULL; - ch->ion_fd_table[i] = -1; - pr_debug("unlocked ion buf#[%d].\n", i); - break; - } - } - } - - return 0; -} - -/** - * spcom_handle_fake_ssr_command() - Handle fake ssr command from user space. - */ -static int spcom_handle_fake_ssr_command(struct spcom_channel *ch, int arg) -{ - pr_debug("Start Fake glink SSR subsystem [%s].\n", spcom_edge); - glink_ssr(spcom_edge); - pr_debug("Fake glink SSR subsystem [%s] done.\n", spcom_edge); - - return 0; -} - -/** - * spcom_handle_write() - Handle user space write commands. - * - * @buf: command buffer. - * @buf_size: command buffer size. - * - * Return: 0 on successful operation, negative value otherwise. - */ -static int spcom_handle_write(struct spcom_channel *ch, - void *buf, - int buf_size) -{ - int ret = 0; - struct spcom_user_command *cmd = NULL; - int cmd_id = 0; - int swap_id; - char cmd_name[5] = {0}; /* debug only */ - - /* opcode field is the minimum length of cmd */ - if (buf_size < sizeof(cmd->cmd_id)) { - pr_err("Invalid argument user buffer size %d.\n", buf_size); - return -EINVAL; - } - - cmd = (struct spcom_user_command *)buf; - cmd_id = (int) cmd->cmd_id; - swap_id = htonl(cmd->cmd_id); - memcpy(cmd_name, &swap_id, sizeof(int)); - - pr_debug("cmd_id [0x%x] cmd_name [%s].\n", cmd_id, cmd_name); - - switch (cmd_id) { - case SPCOM_CMD_SEND: - ret = spcom_handle_send_command(ch, buf, buf_size); - break; - case SPCOM_CMD_SEND_MODIFIED: - ret = spcom_handle_send_modified_command(ch, buf, buf_size); - break; - case SPCOM_CMD_LOCK_ION_BUF: - ret = spcom_handle_lock_ion_buf_command(ch, buf, buf_size); - break; - case SPCOM_CMD_UNLOCK_ION_BUF: - ret = spcom_handle_unlock_ion_buf_command(ch, buf, buf_size); - break; - case SPCOM_CMD_FSSR: - ret = spcom_handle_fake_ssr_command(ch, cmd->arg); - break; - case SPCOM_CMD_CREATE_CHANNEL: - ret = spcom_handle_create_channel_command(buf, buf_size); - break; - default: - pr_err("Invalid Command Id [0x%x].\n", (int) cmd->cmd_id); - return -EINVAL; - } - - return ret; -} - -/** - * spcom_handle_get_req_size() - Handle user space get request size command - * - * @ch: channel handle - * @buf: command buffer. - * @size: command buffer size. - * - * Return: size in bytes. - */ -static int spcom_handle_get_req_size(struct spcom_channel *ch, - void *buf, - uint32_t size) -{ - uint32_t next_req_size = 0; - - if (size < sizeof(next_req_size)) { - pr_err("buf size [%d] too small.\n", (int) size); - return -EINVAL; - } - - next_req_size = spcom_get_next_request_size(ch); - - memcpy(buf, &next_req_size, sizeof(next_req_size)); - pr_debug("next_req_size [%d].\n", next_req_size); - - return sizeof(next_req_size); /* can't exceed user buffer size */ -} - -/** - * spcom_handle_read_req_resp() - Handle user space get request/response command - * - * @ch: channel handle - * @buf: command buffer. - * @size: command buffer size. - * - * Return: size in bytes. - */ -static int spcom_handle_read_req_resp(struct spcom_channel *ch, - void *buf, - uint32_t size) -{ - int ret; - struct spcom_msg_hdr *hdr; - void *rx_buf; - int rx_buf_size; - uint32_t timeout_msec = 0; /* client only */ - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - /* Check param validity */ - if (size > SPCOM_MAX_RESPONSE_SIZE) { - pr_err("ch [%s] inavlid size [%d].\n", - ch->name, size); - return -EINVAL; - } - - /* Allocate Buffers*/ - rx_buf_size = sizeof(*hdr) + size; - rx_buf = kzalloc(rx_buf_size, GFP_KERNEL); - if (!rx_buf) - return -ENOMEM; - - /* - * client response timeout depends on the request - * handling time on the remote side . - */ - if (!ch->is_server) { - timeout_msec = ch->response_timeout_msec; - pr_debug("response_timeout_msec = %d.\n", (int) timeout_msec); - } - - ret = spcom_rx(ch, rx_buf, rx_buf_size, timeout_msec); - if (ret < 0) { - pr_err("rx error %d.\n", ret); - goto exit_err; - } else { - size = ret; /* actual_rx_size */ - } - - hdr = rx_buf; - - if (ch->is_server) { - ch->txn_id = hdr->txn_id; - pr_err("request txn_id [0x%x].\n", ch->txn_id); - } - - /* copy data to user without the header */ - if (size > sizeof(*hdr)) { - size -= sizeof(*hdr); - memcpy(buf, hdr->buf, size); - } else { - pr_err("rx size [%d] too small.\n", size); - goto exit_err; - } - - kfree(rx_buf); - return size; -exit_err: - kfree(rx_buf); - return -EFAULT; - -} - -/** - * spcom_handle_read() - Handle user space read request/response or - * request-size command - * - * @ch: channel handle - * @buf: command buffer. - * @size: command buffer size. - * - * A special size SPCOM_GET_NEXT_REQUEST_SIZE, which is bigger than the max - * response/request tells the kernel that user space only need the size. - * - * Return: size in bytes. - */ -static int spcom_handle_read(struct spcom_channel *ch, - void *buf, - uint32_t size) -{ - if (size == SPCOM_GET_NEXT_REQUEST_SIZE) { - pr_debug("get next request size, ch [%s].\n", ch->name); - size = spcom_handle_get_req_size(ch, buf, size); - ch->is_server = true; - } else { - pr_debug("get request/response, ch [%s].\n", ch->name); - size = spcom_handle_read_req_resp(ch, buf, size); - } - - pr_debug("ch [%s] , size = %d.\n", ch->name, size); - - return size; -} - -/*======================================================================*/ -/* CHAR DEVICE USER SPACE INTERFACE */ -/*======================================================================*/ - -/** - * file_to_filename() - get the filename from file pointer. - * - * @filp: file pointer - * - * it is used for debug prints. - * - * Return: filename string or "unknown". - */ -static char *file_to_filename(struct file *filp) -{ - struct dentry *dentry = NULL; - char *filename = NULL; - - if (!filp || !filp->f_path.dentry) - return "unknown"; - - dentry = filp->f_path.dentry; - filename = dentry->d_iname; - - return filename; -} - -/** - * spcom_device_open() - handle channel file open() from user space. - * - * @filp: file pointer - * - * The file name (without path) is the channel name. - * Open the relevant glink channel. - * Store the channel context in the file private - * date pointer for future read/write/close - * operations. - */ -static int spcom_device_open(struct inode *inode, struct file *filp) -{ - int ret = 0; - struct spcom_channel *ch; - const char *name = file_to_filename(filp); - - pr_debug("Open file [%s].\n", name); - - if (strcmp(name, DEVICE_NAME) == 0) { - pr_debug("root dir skipped.\n"); - return 0; - } - - if (strcmp(name, "sp_ssr") == 0) { - pr_debug("sp_ssr dev node skipped.\n"); - return 0; - } - - ch = spcom_find_channel_by_name(name); - if (!ch) { - pr_err("channel %s doesn't exist, load App first.\n", name); - return -ENODEV; - } - - filp->private_data = ch; - - ret = spcom_open(ch, OPEN_CHANNEL_TIMEOUT_MSEC); - if (ret == -ETIMEDOUT) { - pr_err("Connection timeout channel [%s].\n", name); - } else if (ret) { - pr_err("failed to open channel [%s] , err=%d.\n", name, ret); - return ret; - } - - pr_debug("finished.\n"); - - return 0; -} - -/** - * spcom_device_release() - handle channel file close() from user space. - * - * @filp: file pointer - * - * The file name (without path) is the channel name. - * Open the relevant glink channel. - * Store the channel context in the file private - * date pointer for future read/write/close - * operations. - */ -static int spcom_device_release(struct inode *inode, struct file *filp) -{ - struct spcom_channel *ch; - const char *name = file_to_filename(filp); - bool connected = false; - - pr_debug("Close file [%s].\n", name); - - ch = filp->private_data; - - if (!ch) { - pr_err("ch is NULL, file name %s.\n", file_to_filename(filp)); - return -ENODEV; - } - - /* channel might be already closed or disconnected */ - if (spcom_is_channel_open(ch) && spcom_is_channel_connected(ch)) - connected = true; - - reinit_completion(&ch->disconnect); - - spcom_close(ch); - - if (connected) { - pr_debug("Wait for event GLINK_LOCAL_DISCONNECTED, ch [%s].\n", - name); - wait_for_completion(&ch->disconnect); - pr_debug("GLINK_LOCAL_DISCONNECTED signaled, ch [%s].\n", name); - } - - return 0; -} - -/** - * spcom_device_write() - handle channel file write() from user space. - * - * @filp: file pointer - * - * Return: On Success - same size as number of bytes to write. - * On Failure - negative value. - */ -static ssize_t spcom_device_write(struct file *filp, - const char __user *user_buff, - size_t size, loff_t *f_pos) -{ - int ret; - char *buf; - struct spcom_channel *ch; - const char *name = file_to_filename(filp); - - pr_debug("Write file [%s] size [%d] pos [%d].\n", - name, (int) size, (int) *f_pos); - - if (!user_buff || !f_pos || !filp) { - pr_err("invalid null parameters.\n"); - return -EINVAL; - } - - ch = filp->private_data; - if (!ch) { - pr_debug("invalid ch pointer.\n"); - /* Allow some special commands via /dev/spcom and /dev/sp_ssr */ - } else { - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - } - - if (size > SPCOM_MAX_COMMAND_SIZE) { - pr_err("size [%d] > max size [%d].\n", - (int) size , (int) SPCOM_MAX_COMMAND_SIZE); - return -EINVAL; - } - - if (*f_pos != 0) { - pr_err("offset should be zero, no sparse buffer.\n"); - return -EINVAL; - } - - buf = kzalloc(size, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - - ret = copy_from_user(buf, user_buff, size); - if (ret) { - pr_err("Unable to copy from user (err %d).\n", ret); - kfree(buf); - return -EFAULT; - } - - ret = spcom_handle_write(ch, buf, size); - if (ret) { - pr_err("handle command error [%d].\n", ret); - kfree(buf); - return -EFAULT; - } - - kfree(buf); - - return size; -} - -/** - * spcom_device_read() - handle channel file write() from user space. - * - * @filp: file pointer - * - * Return: number of bytes to read on success, negative value on - * failure. - */ -static ssize_t spcom_device_read(struct file *filp, char __user *user_buff, - size_t size, loff_t *f_pos) -{ - int ret = 0; - int actual_size = 0; - char *buf; - struct spcom_channel *ch; - const char *name = file_to_filename(filp); - - pr_debug("Read file [%s], size = %d bytes.\n", name, (int) size); - - if (!filp || !user_buff || !f_pos || - (size == 0) || (size > SPCOM_MAX_READ_SIZE)) { - pr_err("invalid parameters.\n"); - return -EINVAL; - } - - ch = filp->private_data; - - buf = kzalloc(size, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - - actual_size = spcom_handle_read(ch, buf, size); - if ((actual_size <= 0) || (actual_size > size)) { - pr_err("invalid actual_size [%d].\n", actual_size); - kfree(buf); - return -EFAULT; - } - - ret = copy_to_user(user_buff, buf, actual_size); - - if (ret) { - pr_err("Unable to copy to user, err = %d.\n", ret); - kfree(buf); - return -EFAULT; - } - - kfree(buf); - - pr_debug("ch [%s] ret [%d].\n", name, (int) actual_size); - - return actual_size; -} - -/** - * spcom_device_poll() - handle channel file poll() from user space. - * - * @filp: file pointer - * - * This allows user space to wait/check for channel connection, - * or wait for SSR event. - * - * Return: event bitmask on success, set POLLERR on failure. - */ -static unsigned int spcom_device_poll(struct file *filp, - struct poll_table_struct *poll_table) -{ - /* - * when user call with timeout -1 for blocking mode, - * any bit must be set in response - */ - unsigned int ret = SPCOM_POLL_READY_FLAG; - unsigned long mask; - struct spcom_channel *ch; - const char *name = file_to_filename(filp); - bool wait = false; - bool done = false; - /* Event types always implicitly polled for */ - unsigned long reserved = POLLERR | POLLHUP | POLLNVAL; - int ready = 0; - - ch = filp->private_data; - - mask = poll_requested_events(poll_table); - - pr_debug("== ch [%s] mask [0x%x] ==.\n", name, (int) mask); - - /* user space API has poll use "short" and not "long" */ - mask &= 0x0000FFFF; - - wait = mask & SPCOM_POLL_WAIT_FLAG; - if (wait) - pr_debug("ch [%s] wait for event flag is ON.\n", name); - mask &= ~SPCOM_POLL_WAIT_FLAG; /* clear the wait flag */ - mask &= ~SPCOM_POLL_READY_FLAG; /* clear the ready flag */ - mask &= ~reserved; /* clear the implicitly set reserved bits */ - - switch (mask) { - case SPCOM_POLL_LINK_STATE: - pr_debug("ch [%s] SPCOM_POLL_LINK_STATE.\n", name); - if (wait) { - reinit_completion(&spcom_dev->link_state_changed); - ready = wait_for_completion_interruptible( - &spcom_dev->link_state_changed); - pr_debug("ch [%s] poll LINK_STATE signaled.\n", name); - } - done = (spcom_dev->link_state == GLINK_LINK_STATE_UP); - break; - case SPCOM_POLL_CH_CONNECT: - pr_debug("ch [%s] SPCOM_POLL_CH_CONNECT.\n", name); - if (wait) { - reinit_completion(&ch->connect); - ready = wait_for_completion_interruptible(&ch->connect); - pr_debug("ch [%s] poll CH_CONNECT signaled.\n", name); - } - done = completion_done(&ch->connect); - break; - default: - pr_err("ch [%s] poll, invalid mask [0x%x].\n", - name, (int) mask); - ret = POLLERR; - break; - } - - if (ready < 0) { /* wait was interrupted */ - pr_err("ch [%s] poll interrupted, ret [%d].\n", name, ready); - ret = POLLERR | SPCOM_POLL_READY_FLAG | mask; - } - if (done) - ret |= mask; - - pr_debug("ch [%s] poll, mask = 0x%x, ret=0x%x.\n", - name, (int) mask, ret); - - return ret; -} - -/* file operation supported from user space */ -static const struct file_operations fops = { - .owner = THIS_MODULE, - .read = spcom_device_read, - .poll = spcom_device_poll, - .write = spcom_device_write, - .open = spcom_device_open, - .release = spcom_device_release, -}; - -/** - * spcom_create_channel_chardev() - Create a channel char-dev node file - * for user space interface - */ -static int spcom_create_channel_chardev(const char *name) -{ - int ret; - struct device *dev; - struct spcom_channel *ch; - dev_t devt; - struct class *cls = spcom_dev->driver_class; - struct device *parent = spcom_dev->class_dev; - void *priv; - struct cdev *cdev; - - pr_debug("Add channel [%s].\n", name); - - ch = spcom_find_channel_by_name(name); - if (ch) { - pr_err("channel [%s] already exist.\n", name); - return -EINVAL; - } - - ch = spcom_find_channel_by_name(""); /* find reserved channel */ - if (!ch) { - pr_err("no free channel.\n"); - return -ENODEV; - } - - cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); - if (!cdev) - return -ENOMEM; - - spcom_dev->channel_count++; - devt = spcom_dev->device_no + spcom_dev->channel_count; - priv = ch; - dev = device_create(cls, parent, devt, priv, name); - if (!dev) { - pr_err("device_create failed.\n"); - kfree(cdev); - return -ENODEV; - } - - cdev_init(cdev, &fops); - cdev->owner = THIS_MODULE; - - ret = cdev_add(cdev, devt, 1); - if (ret < 0) { - pr_err("cdev_add failed %d\n", ret); - goto exit_destroy_device; - } - - spcom_init_channel(ch, name); - - ch->cdev = cdev; - ch->dev = dev; - - return 0; - -exit_destroy_device: - device_destroy(spcom_dev->driver_class, devt); - kfree(cdev); - return -EFAULT; -} - -static int __init spcom_register_chardev(void) -{ - int ret; - unsigned baseminor = 0; - unsigned count = 1; - void *priv = spcom_dev; - - ret = alloc_chrdev_region(&spcom_dev->device_no, baseminor, count, - DEVICE_NAME); - if (ret < 0) { - pr_err("alloc_chrdev_region failed %d\n", ret); - return ret; - } - - spcom_dev->driver_class = class_create(THIS_MODULE, DEVICE_NAME); - if (IS_ERR(spcom_dev->driver_class)) { - ret = -ENOMEM; - pr_err("class_create failed %d\n", ret); - goto exit_unreg_chrdev_region; - } - - spcom_dev->class_dev = device_create(spcom_dev->driver_class, NULL, - spcom_dev->device_no, priv, - DEVICE_NAME); - - if (!spcom_dev->class_dev) { - pr_err("class_device_create failed %d\n", ret); - ret = -ENOMEM; - goto exit_destroy_class; - } - - cdev_init(&spcom_dev->cdev, &fops); - spcom_dev->cdev.owner = THIS_MODULE; - - ret = cdev_add(&spcom_dev->cdev, - MKDEV(MAJOR(spcom_dev->device_no), 0), - SPCOM_MAX_CHANNELS); - if (ret < 0) { - pr_err("cdev_add failed %d\n", ret); - goto exit_destroy_device; - } - - pr_info("char device created.\n"); - - return 0; - -exit_destroy_device: - device_destroy(spcom_dev->driver_class, spcom_dev->device_no); -exit_destroy_class: - class_destroy(spcom_dev->driver_class); -exit_unreg_chrdev_region: - unregister_chrdev_region(spcom_dev->device_no, 1); - return ret; -} - -static void spcom_unregister_chrdev(void) -{ - cdev_del(&spcom_dev->cdev); - device_destroy(spcom_dev->driver_class, spcom_dev->device_no); - class_destroy(spcom_dev->driver_class); - unregister_chrdev_region(spcom_dev->device_no, 1); - -} - -/*======================================================================*/ -/* Device Tree */ -/*======================================================================*/ - -static int spcom_parse_dt(struct device_node *np) -{ - int ret; - const char *propname = "qcom,spcom-ch-names"; - int num_ch = of_property_count_strings(np, propname); - int i; - const char *name; - - pr_debug("num of predefined channels [%d].\n", num_ch); - - for (i = 0; i < num_ch; i++) { - ret = of_property_read_string_index(np, propname, i, &name); - if (ret) { - pr_err("failed to read DT channel [%d] name .\n", i); - return -EFAULT; - } - strlcpy(spcom_dev->predefined_ch_name[i], - name, - sizeof(spcom_dev->predefined_ch_name[i])); - - pr_debug("found ch [%s].\n", name); - } - - return num_ch; -} - -static int spcom_probe(struct platform_device *pdev) -{ - int ret; - struct spcom_device *dev = NULL; - struct glink_link_info link_info; - struct device_node *np; - struct link_state_notifier_info *notif_handle; - - if (!pdev) { - pr_err("invalid pdev.\n"); - return -ENODEV; - } - - np = pdev->dev.of_node; - if (!np) { - pr_err("invalid DT node.\n"); - return -EINVAL; - } - - dev = kzalloc(sizeof(*dev), GFP_KERNEL); - if (dev == NULL) - return -ENOMEM; - - spcom_dev = dev; - mutex_init(&dev->lock); - init_completion(&dev->link_state_changed); - spcom_dev->link_state = GLINK_LINK_STATE_DOWN; - - ret = spcom_register_chardev(); - if (ret) { - pr_err("create character device failed.\n"); - goto fail_reg_chardev; - } - - link_info.glink_link_state_notif_cb = spcom_link_state_notif_cb; - link_info.transport = spcom_transport; - link_info.edge = spcom_edge; - - ret = spcom_parse_dt(np); - if (ret < 0) - goto fail_reg_chardev; - - /* - * Register for glink link up/down notification. - * glink channels can't be opened before link is up. - */ - pr_debug("register_link_state_cb(), transport [%s] edge [%s]\n", - link_info.transport, link_info.edge); - notif_handle = glink_register_link_state_cb(&link_info, spcom_dev); - if (!notif_handle) { - pr_err("glink_register_link_state_cb(), err [%d]\n", ret); - goto fail_reg_chardev; - } - - spcom_dev->ion_client = msm_ion_client_create(DEVICE_NAME); - if (spcom_dev->ion_client == NULL) { - pr_err("fail to create ion client.\n"); - goto fail_reg_chardev; - } - - pr_info("Driver Initialization ok.\n"); - - return 0; - -fail_reg_chardev: - pr_err("Failed to init driver.\n"); - spcom_unregister_chrdev(); - kfree(dev); - spcom_dev = NULL; - - return -ENODEV; -} - -static const struct of_device_id spcom_match_table[] = { - { .compatible = "qcom,spcom", }, - { }, -}; - -static struct platform_driver spcom_driver = { - .probe = spcom_probe, - .driver = { - .name = DEVICE_NAME, - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(spcom_match_table), - }, -}; - -/*======================================================================*/ -/* Driver Init/Exit */ -/*======================================================================*/ - -static int __init spcom_init(void) -{ - int ret; - - pr_info("spcom driver Ver 1.0 23-Nov-2015.\n"); - - ret = platform_driver_register(&spcom_driver); - if (ret) - pr_err("spcom_driver register failed %d\n", ret); - - return 0; -} -module_init(spcom_init); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Secure Processor Communication"); From be8935e8b84a820c52cb1b253d8d2791fa28a24f Mon Sep 17 00:00:00 2001 From: Amir Samuelov Date: Wed, 18 Jan 2017 10:05:10 +0200 Subject: [PATCH 0858/1015] defconfig: msm: remove spcom driver on msm-3.18 Remove spcom driver from non-relevant targets. The spcom driver is only relevant from msm8998, which uses kernel msm-4.4. Change-Id: I39d2c6c8c79e7a09a024073662277c7265a2a2c7 Signed-off-by: Amir Samuelov --- arch/arm64/configs/msmcortex-perf_defconfig | 1 - arch/arm64/configs/msmcortex_defconfig | 1 - 2 files changed, 2 deletions(-) diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index 6a0125c35a34c..09ba1abb42044 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -546,7 +546,6 @@ CONFIG_MSM_GLINK=y CONFIG_MSM_GLINK_LOOPBACK_SERVER=y CONFIG_MSM_GLINK_SMD_XPRT=y CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y -CONFIG_MSM_SPCOM=y CONFIG_MSM_SMEM_LOGGING=y CONFIG_MSM_SMP2P=y CONFIG_MSM_SMP2P_TEST=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index 0dd481b413643..0a873462ae23e 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -559,7 +559,6 @@ CONFIG_MSM_GLINK=y CONFIG_MSM_GLINK_LOOPBACK_SERVER=y CONFIG_MSM_GLINK_SMD_XPRT=y CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y -CONFIG_MSM_SPCOM=y CONFIG_MSM_SMEM_LOGGING=y CONFIG_MSM_SMP2P=y CONFIG_MSM_SMP2P_TEST=y From 14bc7906b8498dfbed5de1c2f65f7224088de2bc Mon Sep 17 00:00:00 2001 From: Bharath Gopal Date: Mon, 15 May 2017 17:30:23 +0530 Subject: [PATCH 0859/1015] msm: mdss: Buffer overflow while processing gamut table data Modified the size of the gamut table data-structure in order to avoid a buffer overflow while copying data from user-space. Change-Id: I8c5fa1caff450a2d25d7859bd159ab4a60045e54 Signed-off-by: Bharath Gopal --- drivers/video/msm/mdss/mdss_mdp_pp.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_pp.h b/drivers/video/msm/mdss/mdss_mdp_pp.h index adb4160f046e2..6604d6ba946ca 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp.h +++ b/drivers/video/msm/mdss/mdss_mdp_pp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -153,7 +153,7 @@ struct mdss_pp_res_type { struct mdp_hist_lut_data enhist_disp_cfg[MDSS_BLOCK_DISP_NUM]; struct mdp_dither_cfg_data dither_disp_cfg[MDSS_BLOCK_DISP_NUM]; struct mdp_gamut_cfg_data gamut_disp_cfg[MDSS_BLOCK_DISP_NUM]; - uint16_t gamut_tbl[MDSS_BLOCK_DISP_NUM][GAMUT_TOTAL_TABLE_SIZE]; + uint16_t gamut_tbl[MDSS_BLOCK_DISP_NUM][GAMUT_TOTAL_TABLE_SIZE * 3]; u32 hist_data[MDSS_BLOCK_DISP_NUM][HIST_V_SIZE]; struct pp_sts_type pp_disp_sts[MDSS_BLOCK_DISP_NUM]; /* physical info */ From 92c29bf7c51853c70bca3f21f6976a59ff7ae455 Mon Sep 17 00:00:00 2001 From: Jiangen Jiao Date: Wed, 7 Jun 2017 16:42:12 +0800 Subject: [PATCH 0860/1015] ARM: dts: msm: Bringup sdm450 QRD Msm8953 share the same peripherals with sdm450 QRD. Meanwhile, fix the compatible string to qrd. Change-Id: I5b155ac4f8f4a9f7f4fbe569e63ea325028451a4 Signed-off-by: Jiangen Jiao --- arch/arm/boot/dts/qcom/sdm450-qrd.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/qcom/sdm450-qrd.dts b/arch/arm/boot/dts/qcom/sdm450-qrd.dts index 88ffd8c25b86f..895c2f9c2644e 100644 --- a/arch/arm/boot/dts/qcom/sdm450-qrd.dts +++ b/arch/arm/boot/dts/qcom/sdm450-qrd.dts @@ -14,10 +14,10 @@ /dts-v1/; #include "sdm450.dtsi" -#include "msm8953-qrd.dtsi" +#include "msm8953-qrd-sku3.dtsi" / { model = "Qualcomm Technologies, Inc. SDM450 QRD"; - compatible = "qcom,sdm450-qrd", "qcom,sdm450", "qcom,mtp"; + compatible = "qcom,sdm450-qrd", "qcom,sdm450", "qcom,qrd"; qcom,board-id = <0x0005000b 0>; }; From 39ea6ee849d256f00e34d56545bf08063700fb5b Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Thu, 25 Feb 2016 20:44:16 +0530 Subject: [PATCH 0861/1015] sched: qhmp: consider only the active CPUs in select_best_cpu() A CPU is marked inactive before it is marked offline during the hotplug. Placing a task on an inactive but online CPU has the following problems. (1) It leads to a suboptimal migration to a fallback CPU later. (2) unthrottle_offline_cfs_rqs() iterates over rq->leaf_cfs_rq_list during hotplug to make sure that cfs_rq are not throttled after a CPU is marked inactive. If we place a task on an inactive CPU after this phase, there is a possiblity of adding a cfs_rq that was not present in rq->leaf_cfs_rq_list earlier. If this cfs_rq is throttled now, the enqueued tasks are not visible during the task migration. These tasks are left on an offline CPU. When the runtime is refilled later, we end up sending an IPI to an offline CPU. Change-Id: I6c61ad4f534cc55407e8b64a7b429edd9cc9c3fc Signed-off-by: Pavankumar Kondeti --- kernel/sched/qhmp_fair.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/kernel/sched/qhmp_fair.c b/kernel/sched/qhmp_fair.c index d9f03c3c917d6..f19c331cf9cba 100644 --- a/kernel/sched/qhmp_fair.c +++ b/kernel/sched/qhmp_fair.c @@ -3056,7 +3056,7 @@ static int best_small_task_cpu(struct task_struct *p, int sync) hmp_capable = !cpumask_equal(&mpc_mask, cpu_possible_mask); - cpumask_and(&search_cpu, tsk_cpus_allowed(p), cpu_online_mask); + cpumask_and(&search_cpu, tsk_cpus_allowed(p), cpu_active_mask); if (unlikely(!cpumask_test_cpu(i, &search_cpu))) { i = cpumask_first(&search_cpu); if (i >= nr_cpu_ids) @@ -3121,7 +3121,7 @@ static int best_small_task_cpu(struct task_struct *p, int sync) return min_cstate_cpu; if (!sysctl_sched_restrict_tasks_spread) { - cpumask_and(&search_cpu, tsk_cpus_allowed(p), cpu_online_mask); + cpumask_and(&search_cpu, tsk_cpus_allowed(p), cpu_active_mask); cpumask_andnot(&search_cpu, &search_cpu, &fb_search_cpu); for_each_cpu(i, &search_cpu) { rq = cpu_rq(i); @@ -3244,7 +3244,7 @@ static int select_packing_target(struct task_struct *p, int best_cpu) if (rq->max_freq <= rq->mostly_idle_freq) return best_cpu; - cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_online_mask); + cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_active_mask); cpumask_and(&search_cpus, &search_cpus, &rq->freq_domain_cpumask); /* Pick the first lowest power cpu as target */ @@ -3316,7 +3316,7 @@ static int select_best_cpu(struct task_struct *p, int target, int reason, } trq = task_rq(p); - cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_online_mask); + cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_active_mask); for_each_cpu(i, &search_cpus) { struct rq *rq = cpu_rq(i); @@ -4030,7 +4030,7 @@ static int lower_power_cpu_available(struct task_struct *p, int cpu) * This function should be called only when task 'p' fits in the current * CPU which can be ensured by task_will_fit() prior to this. */ - cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_online_mask); + cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_active_mask); cpumask_and(&search_cpus, &search_cpus, &rq->freq_domain_cpumask); cpumask_clear_cpu(lowest_power_cpu, &search_cpus); From 172694fc90fa545e1b9c86c1ef23ef433fcf879f Mon Sep 17 00:00:00 2001 From: Patrick Daly Date: Wed, 5 Apr 2017 18:05:02 -0700 Subject: [PATCH 0862/1015] iommu: iommu-debug: Rework CONFIG_IOMMU_DEBUG_TRACKING If CONFIG_IOMMU_DEBUG_TRACKING=y, a deadlock will occur if userspace writes to the debugfs file "attach": -001|context_switch(inline) -001|__schedule() -002|__preempt_count_sub(inline) -002|schedule() -003|schedule_timeout() -004|do_wait_for_common(inline) -004|__wait_for_common(inline) -004|wait_for_common() -005|wait_for_completion() -006|__synchronize_srcu() -007|synchronize_srcu() -008|debugfs_remove_recursive() -009|iommu_debug_detach_device() -010|__iommu_detach_device() -011|__iommu_group_for_each_dev(inline) -011|__iommu_detach_group() -012|iommu_detach_device() -013|iommu_debug_device_profiling() -014|iommu_debug_device_show() -015|seq_read() -016|full_proxy_read() -017|__vfs_read() -018|vfs_read() Since the files in the attachment directory are rarely used, remove them. Update the data saved by this config option to work properly with iommu groups. Change-Id: I3f0f1d0836f37412915ce3e78d8aefe92dc8d096 Signed-off-by: Patrick Daly [lmark@codeaurora.org: deadlock is not an issue on this branch but this change is backported because there are security benefits from removing the iommu debugfs attachments nodes, such as removing register access.] Signed-off-by: Liam Mark --- drivers/iommu/iommu-debug.c | 377 +++--------------------------------- drivers/iommu/iommu-debug.h | 23 +-- drivers/iommu/iommu.c | 3 - 3 files changed, 38 insertions(+), 365 deletions(-) diff --git a/drivers/iommu/iommu-debug.c b/drivers/iommu/iommu-debug.c index 65c46aa197292..06b26b3c8872a 100644 --- a/drivers/iommu/iommu-debug.c +++ b/drivers/iommu/iommu-debug.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -27,6 +27,7 @@ #include #include #include +#include "iommu-debug.h" #if defined(CONFIG_IOMMU_DEBUG_TRACKING) || defined(CONFIG_IOMMU_TESTS) @@ -81,380 +82,58 @@ static const char *iommu_debug_attr_to_string(enum iommu_attr attr) static DEFINE_MUTEX(iommu_debug_attachments_lock); static LIST_HEAD(iommu_debug_attachments); -static struct dentry *debugfs_attachments_dir; +/* + * Each group may have more than one domain; but each domain may + * only have one group. + * Used by debug tools to display the name of the device(s) associated + * with a particular domain. + */ struct iommu_debug_attachment { struct iommu_domain *domain; - struct device *dev; - struct dentry *dentry; + struct iommu_group *group; struct list_head list; - unsigned long reg_offset; -}; - -static int iommu_debug_attachment_info_show(struct seq_file *s, void *ignored) -{ - struct iommu_debug_attachment *attach = s->private; - phys_addr_t pt_phys; - int coherent_htw_disable; - int secure_vmid; - - seq_printf(s, "Domain: 0x%p\n", attach->domain); - if (iommu_domain_get_attr(attach->domain, DOMAIN_ATTR_PT_BASE_ADDR, - &pt_phys)) { - seq_puts(s, "PT_BASE_ADDR: (Unknown)\n"); - } else { - void *pt_virt = phys_to_virt(pt_phys); - - seq_printf(s, "PT_BASE_ADDR: virt=0x%p phys=%pa\n", - pt_virt, &pt_phys); - } - - seq_puts(s, "COHERENT_HTW_DISABLE: "); - if (iommu_domain_get_attr(attach->domain, - DOMAIN_ATTR_COHERENT_HTW_DISABLE, - &coherent_htw_disable)) - seq_puts(s, "(Unknown)\n"); - else - seq_printf(s, "%d\n", coherent_htw_disable); - - seq_puts(s, "SECURE_VMID: "); - if (iommu_domain_get_attr(attach->domain, - DOMAIN_ATTR_SECURE_VMID, - &secure_vmid)) - seq_puts(s, "(Unknown)\n"); - else - seq_printf(s, "%s (0x%x)\n", - msm_secure_vmid_to_string(secure_vmid), secure_vmid); - - return 0; -} - -static int iommu_debug_attachment_info_open(struct inode *inode, - struct file *file) -{ - return single_open(file, iommu_debug_attachment_info_show, - inode->i_private); -} - -static const struct file_operations iommu_debug_attachment_info_fops = { - .open = iommu_debug_attachment_info_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, }; -static ssize_t iommu_debug_attachment_trigger_fault_write( - struct file *file, const char __user *ubuf, size_t count, - loff_t *offset) -{ - struct iommu_debug_attachment *attach = file->private_data; - unsigned long flags; - - if (kstrtoul_from_user(ubuf, count, 0, &flags)) { - pr_err("Invalid flags format\n"); - return -EFAULT; - } - - iommu_trigger_fault(attach->domain, flags); - - return count; -} - -static const struct file_operations -iommu_debug_attachment_trigger_fault_fops = { - .open = simple_open, - .write = iommu_debug_attachment_trigger_fault_write, -}; - -static ssize_t iommu_debug_attachment_reg_offset_write( - struct file *file, const char __user *ubuf, size_t count, - loff_t *offset) -{ - struct iommu_debug_attachment *attach = file->private_data; - unsigned long reg_offset; - - if (kstrtoul_from_user(ubuf, count, 0, ®_offset)) { - pr_err("Invalid reg_offset format\n"); - return -EFAULT; - } - - attach->reg_offset = reg_offset; - - return count; -} - -static const struct file_operations iommu_debug_attachment_reg_offset_fops = { - .open = simple_open, - .write = iommu_debug_attachment_reg_offset_write, -}; - -static ssize_t iommu_debug_attachment_reg_read_read( - struct file *file, char __user *ubuf, size_t count, loff_t *offset) -{ - struct iommu_debug_attachment *attach = file->private_data; - unsigned long val; - char *val_str; - ssize_t val_str_len; - - if (*offset) - return 0; - - val = iommu_reg_read(attach->domain, attach->reg_offset); - val_str = kasprintf(GFP_KERNEL, "0x%lx\n", val); - if (!val_str) - return -ENOMEM; - val_str_len = strlen(val_str); - - if (copy_to_user(ubuf, val_str, val_str_len)) { - pr_err("copy_to_user failed\n"); - val_str_len = -EFAULT; - goto out; - } - *offset = 1; /* non-zero means we're done */ - -out: - kfree(val_str); - return val_str_len; -} - -static const struct file_operations iommu_debug_attachment_reg_read_fops = { - .open = simple_open, - .read = iommu_debug_attachment_reg_read_read, -}; - -static ssize_t iommu_debug_attachment_reg_write_write( - struct file *file, const char __user *ubuf, size_t count, - loff_t *offset) -{ - struct iommu_debug_attachment *attach = file->private_data; - unsigned long val; - - if (kstrtoul_from_user(ubuf, count, 0, &val)) { - pr_err("Invalid val format\n"); - return -EFAULT; - } - - iommu_reg_write(attach->domain, attach->reg_offset, val); - - return count; -} - -static const struct file_operations iommu_debug_attachment_reg_write_fops = { - .open = simple_open, - .write = iommu_debug_attachment_reg_write_write, -}; - -/* should be called with iommu_debug_attachments_lock locked */ -static int iommu_debug_attach_add_debugfs( - struct iommu_debug_attachment *attach) -{ - const char *attach_name; - struct device *dev = attach->dev; - struct iommu_domain *domain = attach->domain; - int is_dynamic; - - if (iommu_domain_get_attr(domain, DOMAIN_ATTR_DYNAMIC, &is_dynamic)) - is_dynamic = 0; - - if (is_dynamic) { - uuid_le uuid; - - uuid_le_gen(&uuid); - attach_name = kasprintf(GFP_KERNEL, "%s-%pUl", dev_name(dev), - uuid.b); - if (!attach_name) - return -ENOMEM; - } else { - attach_name = dev_name(dev); - } - - attach->dentry = debugfs_create_dir(attach_name, - debugfs_attachments_dir); - if (!attach->dentry) { - pr_err("Couldn't create iommu/attachments/%s debugfs directory for domain 0x%p\n", - attach_name, domain); - if (is_dynamic) - kfree(attach_name); - return -EIO; - } - - if (is_dynamic) - kfree(attach_name); - - if (!debugfs_create_file( - "info", S_IRUSR, attach->dentry, attach, - &iommu_debug_attachment_info_fops)) { - pr_err("Couldn't create iommu/attachments/%s/info debugfs file for domain 0x%p\n", - dev_name(dev), domain); - goto err_rmdir; - } - - if (!debugfs_create_file( - "trigger_fault", S_IRUSR, attach->dentry, attach, - &iommu_debug_attachment_trigger_fault_fops)) { - pr_err("Couldn't create iommu/attachments/%s/trigger_fault debugfs file for domain 0x%p\n", - dev_name(dev), domain); - goto err_rmdir; - } - - if (!debugfs_create_file( - "reg_offset", S_IRUSR, attach->dentry, attach, - &iommu_debug_attachment_reg_offset_fops)) { - pr_err("Couldn't create iommu/attachments/%s/reg_offset debugfs file for domain 0x%p\n", - dev_name(dev), domain); - goto err_rmdir; - } - - if (!debugfs_create_file( - "reg_read", S_IRUSR, attach->dentry, attach, - &iommu_debug_attachment_reg_read_fops)) { - pr_err("Couldn't create iommu/attachments/%s/reg_read debugfs file for domain 0x%p\n", - dev_name(dev), domain); - goto err_rmdir; - } - - if (!debugfs_create_file( - "reg_write", S_IRUSR, attach->dentry, attach, - &iommu_debug_attachment_reg_write_fops)) { - pr_err("Couldn't create iommu/attachments/%s/reg_write debugfs file for domain 0x%p\n", - dev_name(dev), domain); - goto err_rmdir; - } - - return 0; - -err_rmdir: - debugfs_remove_recursive(attach->dentry); - return -EIO; -} - -void iommu_debug_domain_add(struct iommu_domain *domain) +void iommu_debug_attach_device(struct iommu_domain *domain, + struct device *dev) { struct iommu_debug_attachment *attach; + struct iommu_group *group; - mutex_lock(&iommu_debug_attachments_lock); + group = iommu_group_get(dev); + if (!group) + return; - attach = kmalloc(sizeof(*attach), GFP_KERNEL); + attach = kzalloc(sizeof(*attach), GFP_KERNEL); if (!attach) - goto out_unlock; + return; attach->domain = domain; - attach->dev = NULL; - list_add(&attach->list, &iommu_debug_attachments); + attach->group = group; + INIT_LIST_HEAD(&attach->list); -out_unlock: + mutex_lock(&iommu_debug_attachments_lock); + list_add(&attach->list, &iommu_debug_attachments); mutex_unlock(&iommu_debug_attachments_lock); } void iommu_debug_domain_remove(struct iommu_domain *domain) { - struct iommu_debug_attachment *it; + struct iommu_debug_attachment *it, *tmp; mutex_lock(&iommu_debug_attachments_lock); - list_for_each_entry(it, &iommu_debug_attachments, list) - if (it->domain == domain && it->dev == NULL) - break; - - if (&it->list == &iommu_debug_attachments) { - WARN(1, "Couldn't find debug attachment for domain=0x%p", - domain); - } else { + list_for_each_entry_safe(it, tmp, &iommu_debug_attachments, list) { + if (it->domain != domain) + continue; list_del(&it->list); + iommu_group_put(it->group); kfree(it); } - mutex_unlock(&iommu_debug_attachments_lock); -} - -void iommu_debug_attach_device(struct iommu_domain *domain, - struct device *dev) -{ - struct iommu_debug_attachment *attach; - - mutex_lock(&iommu_debug_attachments_lock); - - list_for_each_entry(attach, &iommu_debug_attachments, list) - if (attach->domain == domain && attach->dev == NULL) - break; - - if (&attach->list == &iommu_debug_attachments) { - WARN(1, "Couldn't find debug attachment for domain=0x%p dev=%s", - domain, dev_name(dev)); - } else { - attach->dev = dev; - - /* - * we might not init until after other drivers start calling - * iommu_attach_device. Only set up the debugfs nodes if we've - * already init'd to avoid polluting the top-level debugfs - * directory (by calling debugfs_create_dir with a NULL - * parent). These will be flushed out later once we init. - */ - - if (debugfs_attachments_dir) - iommu_debug_attach_add_debugfs(attach); - } mutex_unlock(&iommu_debug_attachments_lock); } -void iommu_debug_detach_device(struct iommu_domain *domain, - struct device *dev) -{ - struct iommu_debug_attachment *it; - - mutex_lock(&iommu_debug_attachments_lock); - list_for_each_entry(it, &iommu_debug_attachments, list) - if (it->domain == domain && it->dev == dev) - break; - - if (&it->list == &iommu_debug_attachments) { - WARN(1, "Couldn't find debug attachment for domain=0x%p dev=%s", - domain, dev_name(dev)); - } else { - /* - * Just remove debugfs entry and mark dev as NULL on - * iommu_detach call. We would remove the actual - * attachment entry from the list only on domain_free call. - * This is to ensure we keep track of unattached domains too. - */ - - debugfs_remove_recursive(it->dentry); - it->dev = NULL; - } - mutex_unlock(&iommu_debug_attachments_lock); -} - -static int iommu_debug_init_tracking(void) -{ - int ret = 0; - struct iommu_debug_attachment *attach; - - mutex_lock(&iommu_debug_attachments_lock); - debugfs_attachments_dir = debugfs_create_dir("attachments", - iommu_debugfs_top); - if (!debugfs_attachments_dir) { - pr_err("Couldn't create iommu/attachments debugfs directory\n"); - ret = -ENODEV; - goto out_unlock; - } - - /* set up debugfs entries for attachments made during early boot */ - list_for_each_entry(attach, &iommu_debug_attachments, list) - if (attach->dev) - iommu_debug_attach_add_debugfs(attach); - -out_unlock: - mutex_unlock(&iommu_debug_attachments_lock); - return ret; -} - -static void iommu_debug_destroy_tracking(void) -{ - debugfs_remove_recursive(debugfs_attachments_dir); -} -#else -static inline int iommu_debug_init_tracking(void) { return 0; } -static inline void iommu_debug_destroy_tracking(void) { } #endif #ifdef CONFIG_IOMMU_TESTS @@ -2073,9 +1752,6 @@ static inline void iommu_debug_destroy_tests(void) { } static int iommu_debug_init(void) { - if (iommu_debug_init_tracking()) - return -ENODEV; - if (iommu_debug_init_tests()) return -ENODEV; @@ -2084,7 +1760,6 @@ static int iommu_debug_init(void) static void iommu_debug_exit(void) { - iommu_debug_destroy_tracking(); iommu_debug_destroy_tests(); } diff --git a/drivers/iommu/iommu-debug.h b/drivers/iommu/iommu-debug.h index 3dc87032f2a05..91c418d9e37fa 100644 --- a/drivers/iommu/iommu-debug.h +++ b/drivers/iommu/iommu-debug.h @@ -1,11 +1,21 @@ +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #ifndef IOMMU_DEBUG_H #define IOMMU_DEBUG_H #ifdef CONFIG_IOMMU_DEBUG_TRACKING void iommu_debug_attach_device(struct iommu_domain *domain, struct device *dev); -void iommu_debug_detach_device(struct iommu_domain *domain, struct device *dev); -void iommu_debug_domain_add(struct iommu_domain *domain); void iommu_debug_domain_remove(struct iommu_domain *domain); #else /* !CONFIG_IOMMU_DEBUG_TRACKING */ @@ -15,15 +25,6 @@ static inline void iommu_debug_attach_device(struct iommu_domain *domain, { } -static inline void iommu_debug_detach_device(struct iommu_domain *domain, - struct device *dev) -{ -} - -static inline void iommu_debug_domain_add(struct iommu_domain *domain) -{ -} - static inline void iommu_debug_domain_remove(struct iommu_domain *domain) { } diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 2ee174b74e2c3..3dd49d2de6760 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -977,8 +977,6 @@ struct iommu_domain *iommu_domain_alloc(struct bus_type *bus) if (ret) goto out_free; - iommu_debug_domain_add(domain); - return domain; out_free: @@ -1019,7 +1017,6 @@ void iommu_detach_device(struct iommu_domain *domain, struct device *dev) if (unlikely(domain->ops->detach_dev == NULL)) return; - iommu_debug_detach_device(domain, dev); domain->ops->detach_dev(domain, dev); trace_detach_device_from_domain(dev); } From 08e33c731ee4dcfb6cf6f9d3d3fbe0fef9ac6264 Mon Sep 17 00:00:00 2001 From: Liam Mark Date: Wed, 17 May 2017 17:03:48 -0700 Subject: [PATCH 0863/1015] iommu: iommu-debug: cleanup iommu debug Only expose debugfs nodes for test devices. Restrict secure attach to a valid vmid. Add clock reference counting to make code more robust. Restrict address printing with kptr_restrict. Change-Id: Ibf90068d778b0156e3bb42287af5dda3864da5fc Signed-off-by: Liam Mark --- drivers/iommu/iommu-debug.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/iommu/iommu-debug.c b/drivers/iommu/iommu-debug.c index 06b26b3c8872a..f7c5588dda661 100644 --- a/drivers/iommu/iommu-debug.c +++ b/drivers/iommu/iommu-debug.c @@ -163,6 +163,8 @@ struct iommu_debug_device { u64 phys; size_t len; struct list_head list; + struct mutex clk_lock; + unsigned int clk_count; }; static int iommu_debug_build_phoney_sg_table(struct device *dev, @@ -1201,6 +1203,7 @@ static int iommu_debug_attach_do_attach(struct iommu_debug_device *ddev, goto out_domain_free; } + val = VMID_CP_CAMERA; if (is_secure && iommu_domain_set_attr(ddev->domain, DOMAIN_ATTR_SECURE_VMID, &val)) { @@ -1346,6 +1349,10 @@ static ssize_t iommu_debug_atos_read(struct file *file, char __user *ubuf, ssize_t retval; size_t buflen; + if (kptr_restrict != 0) { + pr_err("kptr_restrict needs to be disabled.\n"); + return -EPERM; + } if (!ddev->domain) { pr_err("No domain. Did you already attach?\n"); return -EINVAL; @@ -1553,20 +1560,34 @@ static ssize_t iommu_debug_config_clocks_write(struct file *file, return -EFAULT; } + mutex_lock(&ddev->clk_lock); switch (buf) { case '0': + if (ddev->clk_count == 0) { + dev_err(dev, "Config clocks already disabled\n"); + break; + } + + if (--ddev->clk_count > 0) + break; + dev_err(dev, "Disabling config clocks\n"); iommu_disable_config_clocks(ddev->domain); break; case '1': + if (ddev->clk_count++ > 0) + break; + dev_err(dev, "Enabling config clocks\n"); if (iommu_enable_config_clocks(ddev->domain)) dev_err(dev, "Failed!\n"); break; default: dev_err(dev, "Invalid value. Should be 0 or 1.\n"); + mutex_unlock(&ddev->clk_lock); return -EINVAL; } + mutex_unlock(&ddev->clk_lock); return count; } @@ -1592,6 +1613,7 @@ static int snarf_iommu_devices(struct device *dev, const char *name) ddev = kzalloc(sizeof(*ddev), GFP_KERNEL); if (!ddev) return -ENODEV; + mutex_init(&ddev->clk_lock); ddev->dev = dev; dir = debugfs_create_dir(name, debugfs_tests_dir); if (!dir) { @@ -1703,6 +1725,9 @@ static int snarf_iommu_devices(struct device *dev, const char *name) static int pass_iommu_devices(struct device *dev, void *ignored) { + if (!of_device_is_compatible(dev->of_node, "iommu-debug-test")) + return 0; + if (!of_find_property(dev->of_node, "iommus", NULL)) return 0; @@ -1716,6 +1741,9 @@ static int iommu_debug_populate_devices(void) const char *cb_name; for_each_compatible_node(np, NULL, "qcom,msm-smmu-v2-ctx") { + if (!of_device_is_compatible(np, "iommu-debug-test")) + continue; + ret = of_property_read_string(np, "label", &cb_name); if (ret) return ret; From 6d94ec02cb7e16f9c631687be655b5b05268b1ea Mon Sep 17 00:00:00 2001 From: Surajit Podder Date: Thu, 1 Jun 2017 08:52:20 +0530 Subject: [PATCH 0864/1015] msm: vidc: Copy user buffers to kernel memory before access trigger_ssr_write directly accesses user buffer, which can lead to crash. Copy user buffer to kernel memory before access. Also, set initial value for ssr_trigger_val, and use kstrtoul instead of sscanf, with proper checking of return code. Change-Id: I94b1c14a8ae4628cb6ac0ee7f3bd38b0c79f088b Signed-off-by: Surajit Podder --- .../media/platform/msm/vidc/msm_vidc_debug.c | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.c b/drivers/media/platform/msm/vidc/msm_vidc_debug.c index 0980fa594950f..c81ba5485b504 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_debug.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.c @@ -12,6 +12,7 @@ */ #define CREATE_TRACE_POINTS +#define MAX_SSR_STRING_LEN 10 #include "msm_vidc_common.h" #include "msm_vidc_debug.h" #include "vidc_hfi_api.h" @@ -132,17 +133,33 @@ static int trigger_ssr_open(struct inode *inode, struct file *file) static ssize_t trigger_ssr_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos) { - u32 ssr_trigger_val; - int rc; + unsigned long ssr_trigger_val = 0; + int rc = 0; struct msm_vidc_core *core = filp->private_data; - rc = sscanf(buf, "%d", &ssr_trigger_val); - if (rc < 0) { + size_t size = MAX_SSR_STRING_LEN; + char kbuf[MAX_SSR_STRING_LEN + 1] = {0}; + + if (!count) + goto exit; + + if (count < size) + size = count; + + if (copy_from_user(kbuf, buf, size)) { + dprintk(VIDC_WARN, "%s User memory fault\n", __func__); + rc = -EFAULT; + goto exit; + } + + rc = kstrtoul(kbuf, 0, &ssr_trigger_val); + if (rc) { dprintk(VIDC_WARN, "returning error err %d\n", rc); rc = -EINVAL; } else { msm_vidc_trigger_ssr(core, ssr_trigger_val); rc = count; } +exit: return rc; } From 9167e98d7af48d395066a617e546aa3383960595 Mon Sep 17 00:00:00 2001 From: Ajay Agarwal Date: Wed, 26 Apr 2017 10:54:12 +0530 Subject: [PATCH 0865/1015] usb: gadget: MIDI: Add support for SuperSpeed enumeration Currently MIDI function supports only upto HighSpeed enumeration. Add descriptors for SuperSpeed mode and bind them to enable SuperSpeed enumeration of USB MIDI function. Change-Id: I0451dabf91e88503ab588dadbfbe6a2b76e2351b Signed-off-by: Ajay Agarwal --- drivers/usb/gadget/function/f_midi.c | 55 +++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c index f46c980718c7d..46839f01e7690 100644 --- a/drivers/usb/gadget/function/f_midi.c +++ b/drivers/usb/gadget/function/f_midi.c @@ -172,6 +172,15 @@ static struct usb_endpoint_descriptor bulk_in_desc = { .bmAttributes = USB_ENDPOINT_XFER_BULK, }; +static struct usb_ss_ep_comp_descriptor midi_ss_bulk_comp_desc = { + .bLength = sizeof(midi_ss_bulk_comp_desc), + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, + + /* the following 2 values can be tweaked if necessary */ + /* .bMaxBurst = 0, */ + /* .bmAttributes = 0, */ +}; + /* B.6.2 Class-specific MS Bulk IN Endpoint Descriptor */ static struct usb_ms_endpoint_descriptor_16 ms_in_desc = { /* .bLength = DYNAMIC */ @@ -753,13 +762,14 @@ static int /* __init */ f_midi_bind(struct usb_configuration *c, struct usb_function *f) { struct usb_descriptor_header **midi_function; + struct usb_descriptor_header **midi_ss_function; struct usb_midi_in_jack_descriptor jack_in_ext_desc[MAX_PORTS]; struct usb_midi_in_jack_descriptor jack_in_emb_desc[MAX_PORTS]; struct usb_midi_out_jack_descriptor_1 jack_out_ext_desc[MAX_PORTS]; struct usb_midi_out_jack_descriptor_1 jack_out_emb_desc[MAX_PORTS]; struct usb_composite_dev *cdev = c->cdev; struct f_midi *midi = func_to_midi(f); - int status, n, jack = 1, i = 0; + int status, n, jack = 1, i = 0, j = 0; /* maybe allocate device-global string ID */ if (midi_string_defs[0].id == 0) { @@ -794,11 +804,20 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) goto fail; midi->out_ep->driver_data = cdev; /* claim */ + /* allocate temporary function list for ss */ + midi_ss_function = kcalloc((MAX_PORTS * 4) + 11, + sizeof(*midi_ss_function), GFP_KERNEL); + if (!midi_ss_function) { + status = -ENOMEM; + goto fail; + } + /* allocate temporary function list */ midi_function = kcalloc((MAX_PORTS * 4) + 9, sizeof(*midi_function), GFP_KERNEL); if (!midi_function) { status = -ENOMEM; + kfree(midi_ss_function); goto fail; } @@ -812,6 +831,12 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) midi_function[i++] = (struct usb_descriptor_header *) &ac_interface_desc; midi_function[i++] = (struct usb_descriptor_header *) &ac_header_desc; midi_function[i++] = (struct usb_descriptor_header *) &ms_interface_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &ac_interface_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &ac_header_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &ms_interface_desc; /* calculate the header's wTotalLength */ n = USB_DT_MS_HEADER_SIZE @@ -820,6 +845,8 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) ms_header_desc.wTotalLength = cpu_to_le16(n); midi_function[i++] = (struct usb_descriptor_header *) &ms_header_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &ms_header_desc; /* configure the external IN jacks, each linked to an embedded OUT jack */ for (n = 0; n < midi->in_ports; n++) { @@ -833,6 +860,7 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) in_ext->bJackID = jack++; in_ext->iJack = 0; midi_function[i++] = (struct usb_descriptor_header *) in_ext; + midi_ss_function[j++] = (struct usb_descriptor_header *) in_ext; out_emb->bLength = USB_DT_MIDI_OUT_SIZE(1); out_emb->bDescriptorType = USB_DT_CS_INTERFACE; @@ -844,6 +872,8 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) out_emb->pins[0].baSourceID = in_ext->bJackID; out_emb->iJack = 0; midi_function[i++] = (struct usb_descriptor_header *) out_emb; + midi_ss_function[j++] = + (struct usb_descriptor_header *) out_emb; /* link it to the endpoint */ ms_in_desc.baAssocJackID[n] = out_emb->bJackID; @@ -861,6 +891,7 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) in_emb->bJackID = jack++; in_emb->iJack = 0; midi_function[i++] = (struct usb_descriptor_header *) in_emb; + midi_ss_function[j++] = (struct usb_descriptor_header *) in_emb; out_ext->bLength = USB_DT_MIDI_OUT_SIZE(1); out_ext->bDescriptorType = USB_DT_CS_INTERFACE; @@ -872,6 +903,8 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) out_ext->pins[0].baSourceID = in_emb->bJackID; out_ext->pins[0].baSourcePin = 1; midi_function[i++] = (struct usb_descriptor_header *) out_ext; + midi_ss_function[j++] = + (struct usb_descriptor_header *) out_ext; /* link it to the endpoint */ ms_out_desc.baAssocJackID[n] = in_emb->bJackID; @@ -891,6 +924,16 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) midi_function[i++] = (struct usb_descriptor_header *) &ms_in_desc; midi_function[i++] = NULL; + midi_ss_function[j++] = (struct usb_descriptor_header *) &bulk_out_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &midi_ss_bulk_comp_desc; + midi_ss_function[j++] = (struct usb_descriptor_header *) &ms_out_desc; + midi_ss_function[j++] = (struct usb_descriptor_header *) &bulk_in_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &midi_ss_bulk_comp_desc; + midi_ss_function[j++] = (struct usb_descriptor_header *) &ms_in_desc; + midi_ss_function[j++] = NULL; + /* * support all relevant hardware speeds... we expect that when * hardware is dual speed, all bulk-capable endpoints work at @@ -909,13 +952,23 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) goto fail_f_midi; } + if (gadget_is_superspeed(c->cdev->gadget)) { + bulk_in_desc.wMaxPacketSize = cpu_to_le16(1024); + bulk_out_desc.wMaxPacketSize = cpu_to_le16(1024); + f->ss_descriptors = usb_copy_descriptors(midi_ss_function); + if (!f->ss_descriptors) + goto fail_f_midi; + } + kfree(midi_function); + kfree(midi_ss_function); return 0; fail_f_midi: kfree(midi_function); usb_free_descriptors(f->hs_descriptors); + kfree(midi_ss_function); fail: /* we might as well release our claims on endpoints */ if (midi->out_ep) From 4c9d66a1bcbcbb78094f079fb414a448e94c6a24 Mon Sep 17 00:00:00 2001 From: Sai Krishna Juturi Date: Thu, 1 Jun 2017 10:00:48 +0530 Subject: [PATCH 0866/1015] usb: dwc3: Add check for SDP charger type During boot up when device is connected to CDP, driver is checking for floating charger, which is not required as PMIC has notified appropriate charger type already. So, check for floating charger only in case of SDP. Change-Id: Ia0b37742f86e2374eaeb1b06870f1c7a9ac01cb1 CRs-fixed: 2053529 Signed-off-by: Sai Krishna Juturi --- drivers/usb/dwc3/dwc3-msm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index f5f18b0bb5ed7..2075223da5caf 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -3570,7 +3570,8 @@ static void dwc3_otg_sm_work(struct work_struct *w) pm_runtime_get_noresume(mdwc->dev); dwc3_initialize(mdwc); /* check dp/dm for SDP & runtime_put if !SDP */ - if (mdwc->detect_dpdm_floating) { + if (mdwc->detect_dpdm_floating && + mdwc->chg_type == DWC3_SDP_CHARGER) { dwc3_check_float_lines(mdwc); if (mdwc->chg_type != DWC3_SDP_CHARGER) break; From 1fbbc5e46ff3f5b03c36219597405adfa4a7559d Mon Sep 17 00:00:00 2001 From: Naresh Malladi Date: Mon, 5 Jun 2017 21:45:45 +0530 Subject: [PATCH 0867/1015] drivers: soc: qcom: rpm_stats: Add mutex lock for shared data The buffer allocated in file open operations need to be protected as there can be a possiblity of use-after-free scenario. Process A B | | open | | | read started | | close Add mutex lock to protect the buffer to avoid this. "msm_rpmstats_copy_stats" accesses the variable "pdata->read_idx" without locking. The userspace can invoke the "read" call from multiple threads which will call "msm_rpmstats_file_read" which in turn calls "msm_rpmstats_copy_stats". This can allow the statement "pdata->read_idx++" increment "read_idx" beyond the limit ("prvdata->num_records") and call "msm_rpmstats_read_register" with this value. Also allow reading RPM stats information using sysfs nodes. The stats are available at /sys/power/system_sleep/stats Change-Id: I031f02bb2694a97ced86da0a9f54d0e434e4ad6d Signed-off-by: Naresh Malladi --- drivers/soc/qcom/rpm_master_stat.c | 53 +++++++++++++------- drivers/soc/qcom/rpm_rail_stats.c | 55 +++++++++++++++------ drivers/soc/qcom/rpm_stats.c | 78 +++++++++++++++++++++--------- 3 files changed, 130 insertions(+), 56 deletions(-) diff --git a/drivers/soc/qcom/rpm_master_stat.c b/drivers/soc/qcom/rpm_master_stat.c index 7854e35faf16c..ec8300b94ac2f 100644 --- a/drivers/soc/qcom/rpm_master_stat.c +++ b/drivers/soc/qcom/rpm_master_stat.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2012-2014, 2016 The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2014, 2016-2017, The Linux Foundation. All rights + * reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -50,6 +51,8 @@ #define GET_FIELD(a) ((strnstr(#a, ".", 80) + 1)) +static DEFINE_MUTEX(msm_rpm_master_stats_mutex); + struct msm_rpm_master_stats { uint32_t active_cores; uint32_t numshutdowns; @@ -80,9 +83,11 @@ int msm_rpm_master_stats_file_close(struct inode *inode, { struct msm_rpm_master_stats_private_data *private = file->private_data; + mutex_lock(&msm_rpm_master_stats_mutex); if (private->reg_base) iounmap(private->reg_base); kfree(file->private_data); + mutex_unlock(&msm_rpm_master_stats_mutex); return 0; } @@ -95,14 +100,10 @@ static int msm_rpm_master_copy_stats( static int master_cnt; int count, j = 0; char *buf; - static DEFINE_MUTEX(msm_rpm_master_stats_mutex); - - mutex_lock(&msm_rpm_master_stats_mutex); /* Iterate possible number of masters */ if (master_cnt > prvdata->num_masters - 1) { master_cnt = 0; - mutex_unlock(&msm_rpm_master_stats_mutex); return 0; } @@ -256,7 +257,6 @@ static int msm_rpm_master_copy_stats( } master_cnt++; - mutex_unlock(&msm_rpm_master_stats_mutex); return RPM_MASTERS_BUF_LEN - count; } @@ -265,25 +265,36 @@ static ssize_t msm_rpm_master_stats_file_read(struct file *file, { struct msm_rpm_master_stats_private_data *prvdata; struct msm_rpm_master_stats_platform_data *pdata; + ssize_t ret; + mutex_lock(&msm_rpm_master_stats_mutex); prvdata = file->private_data; - if (!prvdata) - return -EINVAL; + if (!prvdata) { + ret = -EINVAL; + goto exit; + } pdata = prvdata->platform_data; - if (!pdata) - return -EINVAL; + if (!pdata) { + ret = -EINVAL; + goto exit; + } - if (!bufu || count == 0) - return -EINVAL; + if (!bufu || count == 0) { + ret = -EINVAL; + goto exit; + } if ((*ppos <= pdata->phys_size)) { prvdata->len = msm_rpm_master_copy_stats(prvdata); *ppos = 0; } - return simple_read_from_buffer(bufu, count, ppos, + ret = simple_read_from_buffer(bufu, count, ppos, prvdata->buf, prvdata->len); +exit: + mutex_unlock(&msm_rpm_master_stats_mutex); + return ret; } static int msm_rpm_master_stats_file_open(struct inode *inode, @@ -291,15 +302,20 @@ static int msm_rpm_master_stats_file_open(struct inode *inode, { struct msm_rpm_master_stats_private_data *prvdata; struct msm_rpm_master_stats_platform_data *pdata; + int ret = 0; + mutex_lock(&msm_rpm_master_stats_mutex); pdata = inode->i_private; file->private_data = kzalloc(sizeof(struct msm_rpm_master_stats_private_data), GFP_KERNEL); - if (!file->private_data) - return -ENOMEM; + if (!file->private_data) { + ret = -ENOMEM; + goto exit; + } + prvdata = file->private_data; prvdata->reg_base = ioremap(pdata->phys_addr_base, @@ -310,14 +326,17 @@ static int msm_rpm_master_stats_file_open(struct inode *inode, pr_err("%s: ERROR could not ioremap start=%pa, len=%u\n", __func__, &pdata->phys_addr_base, pdata->phys_size); - return -EBUSY; + ret = -EBUSY; + goto exit; } prvdata->len = 0; prvdata->num_masters = pdata->num_masters; prvdata->master_names = pdata->masters; prvdata->platform_data = pdata; - return 0; +exit: + mutex_unlock(&msm_rpm_master_stats_mutex); + return ret; } static const struct file_operations msm_rpm_master_stats_fops = { diff --git a/drivers/soc/qcom/rpm_rail_stats.c b/drivers/soc/qcom/rpm_rail_stats.c index c4d34378140de..5e90ce35e64cf 100644 --- a/drivers/soc/qcom/rpm_rail_stats.c +++ b/drivers/soc/qcom/rpm_rail_stats.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -46,6 +46,8 @@ #define NAMELEN (sizeof(uint32_t)+1) +static DEFINE_MUTEX(msm_rpm_rail_stats_mutex); + struct msm_rpm_rail_stats_platform_data { phys_addr_t phys_addr_base; u32 phys_size; @@ -80,9 +82,11 @@ int msm_rpm_rail_stats_file_close(struct inode *inode, struct file *file) { struct msm_rpm_rail_stats_private_data *private = file->private_data; + mutex_lock(&msm_rpm_rail_stats_mutex); if (private->reg_base) iounmap(private->reg_base); kfree(file->private_data); + mutex_unlock(&msm_rpm_rail_stats_mutex); return 0; } @@ -154,18 +158,26 @@ static int msm_rpm_rail_stats_copy( static ssize_t msm_rpm_rail_stats_file_read(struct file *file, char __user *bufu, size_t count, loff_t *ppos) { - struct msm_rpm_rail_stats_private_data *prvdata = - file->private_data; + struct msm_rpm_rail_stats_private_data *prvdata; struct msm_rpm_rail_stats_platform_data *pdata; + ssize_t ret; - if (!prvdata) - return -EINVAL; + mutex_lock(&msm_rpm_rail_stats_mutex); + prvdata = file->private_data; + if (!prvdata) { + ret = -EINVAL; + goto exit; + } - if (!prvdata->platform_data) - return -EINVAL; + if (!prvdata->platform_data) { + ret = -EINVAL; + goto exit; + } - if (!bufu || count == 0) - return -EINVAL; + if (!bufu || count == 0) { + ret = -EINVAL; + goto exit; + } pdata = prvdata->platform_data; @@ -174,22 +186,32 @@ static ssize_t msm_rpm_rail_stats_file_read(struct file *file, *ppos = 0; } - return simple_read_from_buffer(bufu, count, ppos, + ret = simple_read_from_buffer(bufu, count, ppos, prvdata->buf, prvdata->len); +exit: + mutex_unlock(&msm_rpm_rail_stats_mutex); + return ret; } static int msm_rpm_rail_stats_file_open(struct inode *inode, struct file *file) { struct msm_rpm_rail_stats_private_data *prvdata; - struct msm_rpm_rail_stats_platform_data *pdata = inode->i_private; + struct msm_rpm_rail_stats_platform_data *pdata; + int ret = 0; + + mutex_lock(&msm_rpm_rail_stats_mutex); + pdata = inode->i_private; file->private_data = kzalloc(sizeof(struct msm_rpm_rail_stats_private_data), GFP_KERNEL); - if (!file->private_data) - return -ENOMEM; + if (!file->private_data) { + ret = -ENOMEM; + goto exit; + } + prvdata = file->private_data; prvdata->reg_base = ioremap(pdata->phys_addr_base, @@ -200,12 +222,15 @@ static int msm_rpm_rail_stats_file_open(struct inode *inode, pr_err("%s: ERROR could not ioremap start=%pa, len=%u\n", __func__, &pdata->phys_addr_base, pdata->phys_size); - return -EBUSY; + ret = -EBUSY; + goto exit; } prvdata->len = 0; prvdata->platform_data = pdata; - return 0; +exit: + mutex_unlock(&msm_rpm_rail_stats_mutex); + return ret; } diff --git a/drivers/soc/qcom/rpm_stats.c b/drivers/soc/qcom/rpm_stats.c index ec5f2303ffb03..70d6383837e0f 100644 --- a/drivers/soc/qcom/rpm_stats.c +++ b/drivers/soc/qcom/rpm_stats.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -31,6 +31,8 @@ #define GET_PDATA_OF_ATTR(attr) \ (container_of(attr, struct msm_rpmstats_kobj_attr, ka)->pd) +static DEFINE_MUTEX(rpm_stats_mutex); + enum { ID_COUNTER, ID_ACCUM_TIME_SCLK, @@ -218,6 +220,12 @@ static int msm_rpmstats_copy_stats(struct msm_rpmstats_private_data *pdata) record.id = msm_rpmstats_read_register(pdata->reg_base, pdata->read_idx, 1); + if (record.id >= ID_MAX) { + pr_err("%s: array out of bound error found.\n", + __func__); + return -EINVAL; + } + record.val = msm_rpmstats_read_register(pdata->reg_base, pdata->read_idx, 2); @@ -240,13 +248,20 @@ static ssize_t msm_rpmstats_file_read(struct file *file, char __user *bufu, size_t count, loff_t *ppos) { struct msm_rpmstats_private_data *prvdata; + ssize_t ret; + + mutex_lock(&rpm_stats_mutex); prvdata = file->private_data; - if (!prvdata) - return -EINVAL; + if (!prvdata) { + ret = -EINVAL; + goto exit; + } - if (!bufu || count == 0) - return -EINVAL; + if (!bufu || count == 0) { + ret = -EINVAL; + goto exit; + } if (prvdata->platform_data->version == 1) { if (!prvdata->num_records) @@ -263,22 +278,30 @@ static ssize_t msm_rpmstats_file_read(struct file *file, char __user *bufu, *ppos = 0; } - return simple_read_from_buffer(bufu, count, ppos, + ret = simple_read_from_buffer(bufu, count, ppos, prvdata->buf, prvdata->len); +exit: + mutex_unlock(&rpm_stats_mutex); + return ret; } static int msm_rpmstats_file_open(struct inode *inode, struct file *file) { struct msm_rpmstats_private_data *prvdata; struct msm_rpmstats_platform_data *pdata; + int ret = 0; + mutex_lock(&rpm_stats_mutex); pdata = inode->i_private; file->private_data = kmalloc(sizeof(struct msm_rpmstats_private_data), GFP_KERNEL); - if (!file->private_data) - return -ENOMEM; + if (!file->private_data) { + ret = -ENOMEM; + goto exit; + } + prvdata = file->private_data; prvdata->reg_base = ioremap_nocache(pdata->phys_addr_base, @@ -289,24 +312,28 @@ static int msm_rpmstats_file_open(struct inode *inode, struct file *file) pr_err("%s: ERROR could not ioremap start=%pa, len=%u\n", __func__, &pdata->phys_addr_base, pdata->phys_size); - return -EBUSY; + ret = -EBUSY; + goto exit; } prvdata->read_idx = prvdata->num_records = prvdata->len = 0; prvdata->platform_data = pdata; if (pdata->version == 2) prvdata->num_records = 2; - - return 0; +exit: + mutex_unlock(&rpm_stats_mutex); + return ret; } static int msm_rpmstats_file_close(struct inode *inode, struct file *file) { struct msm_rpmstats_private_data *private = file->private_data; + mutex_lock(&rpm_stats_mutex); if (private->reg_base) iounmap(private->reg_base); kfree(file->private_data); + mutex_unlock(&rpm_stats_mutex); return 0; } @@ -362,22 +389,26 @@ static ssize_t rpmstats_show(struct kobject *kobj, { struct msm_rpmstats_private_data *prvdata = NULL; struct msm_rpmstats_platform_data *pdata = NULL; + ssize_t ret; + mutex_lock(&rpm_stats_mutex); pdata = GET_PDATA_OF_ATTR(attr); prvdata = kmalloc(sizeof(*prvdata), GFP_KERNEL); - if (!prvdata) - return -ENOMEM; + if (!prvdata) { + ret = -ENOMEM; + goto kmalloc_fail; + } prvdata->reg_base = ioremap_nocache(pdata->phys_addr_base, pdata->phys_size); if (!prvdata->reg_base) { - kfree(prvdata); pr_err("%s: ERROR could not ioremap start=%pa, len=%u\n", __func__, &pdata->phys_addr_base, pdata->phys_size); - return -EBUSY; + ret = -EBUSY; + goto ioremap_fail; } prvdata->read_idx = prvdata->num_records = prvdata->len = 0; @@ -399,23 +430,22 @@ static ssize_t rpmstats_show(struct kobject *kobj, prvdata); } - return snprintf(buf, prvdata->len, prvdata->buf); + ret = snprintf(buf, prvdata->len, prvdata->buf); + iounmap(prvdata->reg_base); +ioremap_fail: + kfree(prvdata); +kmalloc_fail: + mutex_unlock(&rpm_stats_mutex); + return ret; } static int msm_rpmstats_create_sysfs(struct msm_rpmstats_platform_data *pd) { - struct kobject *module_kobj = NULL; struct kobject *rpmstats_kobj = NULL; struct msm_rpmstats_kobj_attr *rpms_ka = NULL; int ret = 0; - module_kobj = kset_find_obj(module_kset, KBUILD_MODNAME); - if (!module_kobj) { - pr_err("%s: Cannot find module_kset\n", __func__); - return -ENODEV; - } - - rpmstats_kobj = kobject_create_and_add("rpmstats", module_kobj); + rpmstats_kobj = kobject_create_and_add("system_sleep", power_kobj); if (!rpmstats_kobj) { pr_err("%s: Cannot create rpmstats kobject\n", __func__); ret = -ENOMEM; From 032e3fb4d446c6ec2e8345077c9ab55eeb8db2b4 Mon Sep 17 00:00:00 2001 From: Tanvi Aggarwal Date: Tue, 13 Jun 2017 18:12:35 +0530 Subject: [PATCH 0868/1015] ARM: dts: msm: Adding AF support for Rear Aux Camera Adding new eeprom node to support Auto Focus for Back Aux Camera node 1 on msm8937. Change-Id: I11d6ed65175bf66de2310547a14d44d2b1dbda3a Signed-off-by: Tanvi Aggarwal --- .../dts/qcom/msm8937-camera-sensor-mtp.dtsi | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi index c7e702c5b64ed..7e484f5725c08 100644 --- a/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -151,6 +151,41 @@ qcom,clock-rates = <19200000 0>; }; + eeprom2: qcom,eeprom@2 { + cell-index = <2>; + compatible = "qcom,eeprom"; + qcom,cci-master = <1>; + reg = <0x2>; + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vana", "cam_vio", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 0 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_default + &cam_sensor_front_default>; + pinctrl-1 = <&cam_sensor_mclk1_sleep &cam_sensor_front_sleep>; + gpios = <&tlmm 27 0>, + <&tlmm 38 0>, + <&tlmm 50 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1", + "CAM_STANDBY1"; + status = "ok"; + clocks = <&clock_gcc clk_mclk1_clk_src>, + <&clock_gcc clk_gcc_camss_mclk1_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + qcom,camera@0 { cell-index = <0>; compatible = "qcom,camera"; @@ -204,6 +239,8 @@ qcom,csiphy-sd-index = <1>; qcom,csid-sd-index = <1>; qcom,mount-angle = <90>; + qcom,actuator-src = <&actuator1>; + qcom,eeprom-src = <&eeprom2>; cam_vdig-supply = <&pm8937_l23>; cam_vana-supply = <&pm8937_l22>; cam_vio-supply = <&pm8937_l6>; From cc25670a0a85818573f049d451eb9151c0a6b73a Mon Sep 17 00:00:00 2001 From: "Sravan Kumar D.V.N" Date: Wed, 25 Jan 2017 16:43:00 +0530 Subject: [PATCH 0869/1015] msm: mdss: Do not apply bl scale if current back light is zero Calling mdss_fb_set_backlight when current back light zero to update bl scale will reset the unset_bl_level to zero. This affects ESD recovery as unset_bl_level is not updated on recovery path. Hence avoiding calling mdss_fb_set_backlight through mdss_bl_scale_config when current backlight is zero. CRs-Fixed: 1115920 Change-Id: I4e3297604a4585233c075f9ca08a6f8f527b0438 Signed-off-by: Sravan Kumar D.V.N Signed-off-by: Krishna Chaitanya Devarakonda --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index 2b9c15f6a5d6b..37cc8e0d5c950 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -4152,8 +4152,10 @@ static int mdss_bl_scale_config(struct msm_fb_data_type *mfd, pr_debug("update scale = %d, min_lvl = %d\n", mfd->bl_scale, mfd->bl_min_lvl); - /* update current backlight to use new scaling*/ - mdss_fb_set_backlight(mfd, curr_bl); + /* Update current backlight to use new scaling, if it is not zero */ + if (curr_bl) + mdss_fb_set_backlight(mfd, curr_bl); + mutex_unlock(&mfd->bl_lock); return ret; } From 4f466a63f3d33763b608866a35f748b774b9484e Mon Sep 17 00:00:00 2001 From: Siva Kumar Akkireddi Date: Thu, 11 May 2017 15:29:47 +0530 Subject: [PATCH 0870/1015] msm: sps: Fix race condition in SPS debugfs APIs SPS debugfs APIs can be called concurrently which can result in dangling pointer access. This change synchronizes access to the SPS debugfs buffer. Change-Id: I409b3f0618f760cb67eba47b43c81d166cdae4aa Signed-off-by: Siva Kumar Akkireddi --- drivers/platform/msm/sps/sps.c | 15 ++++++++++++++- drivers/platform/msm/sps/spsi.h | 17 ----------------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/drivers/platform/msm/sps/sps.c b/drivers/platform/msm/sps/sps.c index 2f11c6dd7e05c..ddb2388c50063 100644 --- a/drivers/platform/msm/sps/sps.c +++ b/drivers/platform/msm/sps/sps.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016 , The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -67,6 +67,7 @@ static char *debugfs_buf; static u32 debugfs_buf_size; static u32 debugfs_buf_used; static int wraparound; +static struct mutex sps_debugfs_lock; struct dentry *dent; struct dentry *dfile_info; @@ -85,6 +86,7 @@ static struct sps_bam *phy2bam(phys_addr_t phys_addr); /* record debug info for debugfs */ void sps_debugfs_record(const char *msg) { + mutex_lock(&sps_debugfs_lock); if (debugfs_record_enabled) { if (debugfs_buf_used + MAX_MSG_LEN >= debugfs_buf_size) { debugfs_buf_used = 0; @@ -98,6 +100,7 @@ void sps_debugfs_record(const char *msg) debugfs_buf_size - debugfs_buf_used, "\n**** end line of sps log ****\n\n"); } + mutex_unlock(&sps_debugfs_lock); } /* read the recorded debug info to userspace */ @@ -107,6 +110,7 @@ static ssize_t sps_read_info(struct file *file, char __user *ubuf, int ret = 0; int size; + mutex_lock(&sps_debugfs_lock); if (debugfs_record_enabled) { if (wraparound) size = debugfs_buf_size - MAX_MSG_LEN; @@ -116,6 +120,7 @@ static ssize_t sps_read_info(struct file *file, char __user *ubuf, ret = simple_read_from_buffer(ubuf, count, ppos, debugfs_buf, size); } + mutex_unlock(&sps_debugfs_lock); return ret; } @@ -161,11 +166,13 @@ static ssize_t sps_set_info(struct file *file, const char __user *buf, new_buf_size = buf_size_kb * SZ_1K; + mutex_lock(&sps_debugfs_lock); if (debugfs_record_enabled) { if (debugfs_buf_size == new_buf_size) { /* need do nothing */ pr_info("sps:debugfs: input buffer size " "is the same as before.\n"); + mutex_unlock(&sps_debugfs_lock); return count; } else { /* release the current buffer */ @@ -185,12 +192,14 @@ static ssize_t sps_set_info(struct file *file, const char __user *buf, if (!debugfs_buf) { debugfs_buf_size = 0; pr_err("sps:fail to allocate memory for debug_fs.\n"); + mutex_unlock(&sps_debugfs_lock); return -ENOMEM; } debugfs_buf_used = 0; wraparound = false; debugfs_record_enabled = true; + mutex_unlock(&sps_debugfs_lock); return count; } @@ -239,6 +248,7 @@ static ssize_t sps_set_logging_option(struct file *file, const char __user *buf, return count; } + mutex_lock(&sps_debugfs_lock); if (((option == 0) || (option == 2)) && ((logging_option == 1) || (logging_option == 3))) { debugfs_record_enabled = false; @@ -250,6 +260,7 @@ static ssize_t sps_set_logging_option(struct file *file, const char __user *buf, } logging_option = option; + mutex_unlock(&sps_debugfs_lock); return count; } @@ -587,6 +598,8 @@ static void sps_debugfs_init(void) goto bam_log_level_err; } + mutex_init(&sps_debugfs_lock); + return; bam_log_level_err: diff --git a/drivers/platform/msm/sps/spsi.h b/drivers/platform/msm/sps/spsi.h index 1b4ca69bee16e..9e80381903418 100644 --- a/drivers/platform/msm/sps/spsi.h +++ b/drivers/platform/msm/sps/spsi.h @@ -145,11 +145,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } \ } while (0) -#define SPS_DEBUGFS(msg, args...) do { \ - char buf[MAX_MSG_LEN]; \ - snprintf(buf, MAX_MSG_LEN, msg"\n", ##args); \ - sps_debugfs_record(buf); \ - } while (0) #define SPS_ERR(dev, msg, args...) do { \ if (logging_option != 1) { \ if (unlikely(print_limit_option > 2)) \ @@ -157,8 +152,6 @@ extern u8 print_limit_option; else \ pr_err(msg, ##args); \ } \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ SPS_IPC(3, dev, msg, args); \ } while (0) #define SPS_INFO(dev, msg, args...) do { \ @@ -168,8 +161,6 @@ extern u8 print_limit_option; else \ pr_info(msg, ##args); \ } \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ SPS_IPC(3, dev, msg, args); \ } while (0) #define SPS_DBG(dev, msg, args...) do { \ @@ -181,8 +172,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 0) \ SPS_IPC(0, dev, msg, args); \ @@ -197,8 +186,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 1) \ SPS_IPC(1, dev, msg, args); \ @@ -213,8 +200,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 2) \ SPS_IPC(2, dev, msg, args); \ @@ -229,8 +214,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 3) \ SPS_IPC(3, dev, msg, args); \ From 28adbf9eaebd82d71697d9404136bba618200bb1 Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Wed, 12 Apr 2017 12:28:50 +0530 Subject: [PATCH 0871/1015] ARM: dts: msm: Update low temperature APSS frequency in msm8996pro Update the minimum frequency restriction value and maximum frequency limit value to the correct nominal frequency 1.056 GHz and 1.2096 GHz respectively, as per the updated frequency plan of msm8996pro. Change-Id: I725351c064f0211f95af4b4dd708b62360331282 Signed-off-by: Manaf Meethalavalappu Pallikunhi --- arch/arm/boot/dts/qcom/msm8996pro.dtsi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8996pro.dtsi b/arch/arm/boot/dts/qcom/msm8996pro.dtsi index d4b3ae3a0a58b..1bf22f160dffc 100644 --- a/arch/arm/boot/dts/qcom/msm8996pro.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996pro.dtsi @@ -1333,6 +1333,10 @@ qcom,poll-ms = <50>; qcom,limit-temp = <80>; qcom,core-limit-temp = <90>; + msm_thermal_freq: qcom,vdd-apps-rstr { + qcom,max-freq-level = <1209600>; + qcom,levels = <1056000 1516800 1516800>; + }; qcom,vdd-gfx-rstr{ qcom,levels = <6 8 9>; /* Nominal, Turbo, Turbo_L1 */ }; From aca4f5862d3b97cc14378a752b8ab4ea0ad35832 Mon Sep 17 00:00:00 2001 From: Rohit Rangwani Date: Fri, 16 Sep 2016 18:44:55 +0530 Subject: [PATCH 0872/1015] NFC: Detection of NQ chip set and firmware version Changes made to detect NQ chipset and firmware version Change-Id: Ia9caa30b88eccb99dfebe9179bb61b8c2abb5de4 Signed-off-by: Rohit Rangwani --- drivers/nfc/nq-nci.c | 103 ++++++++++++++++++++++++++++--- drivers/nfc/nq-nci.h | 8 +++ include/linux/nfcinfo.h | 18 ++++++ include/uapi/linux/Kbuild | 1 + include/uapi/linux/nfc/Kbuild | 2 + include/uapi/linux/nfc/nfcinfo.h | 21 +++++++ 6 files changed, 143 insertions(+), 10 deletions(-) create mode 100644 include/linux/nfcinfo.h create mode 100644 include/uapi/linux/nfc/Kbuild create mode 100644 include/uapi/linux/nfc/nfcinfo.h diff --git a/drivers/nfc/nq-nci.c b/drivers/nfc/nq-nci.c index e7f8c835b7f44..3b51de98990aa 100644 --- a/drivers/nfc/nq-nci.c +++ b/drivers/nfc/nq-nci.c @@ -53,6 +53,7 @@ struct nqx_dev { struct mutex read_mutex; struct i2c_client *client; struct miscdevice nqx_device; + union nqx_uinfo nqx_info; /* NFC GPIO variables */ unsigned int irq_gpio; unsigned int en_gpio; @@ -464,6 +465,25 @@ int nfc_ioctl_core_reset_ntf(struct file *filp) return nqx_dev->core_reset_ntf; } +/** + * Inside nfc_ioctl_nfcc_info + * + * @brief nfc_ioctl_nfcc_info + * + * Check the NQ Chipset and firmware version details + */ +unsigned int nfc_ioctl_nfcc_info(struct file *filp, unsigned long arg) +{ + unsigned int r = 0; + struct nqx_dev *nqx_dev = filp->private_data; + + r = nqx_dev->nqx_info.i; + dev_dbg(&nqx_dev->client->dev, + "nqx nfc : nfc_ioctl_nfcc_info r = %d\n", r); + + return r; +} + static long nfc_ioctl(struct file *pfile, unsigned int cmd, unsigned long arg) { @@ -486,6 +506,9 @@ static long nfc_ioctl(struct file *pfile, unsigned int cmd, case NFCC_INITIAL_CORE_RESET_NTF: r = nfc_ioctl_core_reset_ntf(pfile); break; + case NFCC_GET_INFO: + r = nfc_ioctl_nfcc_info(pfile, arg); + break; default: r = -ENOIOCTLCMD; } @@ -505,13 +528,16 @@ static const struct file_operations nfc_dev_fops = { }; /* Check for availability of NQ_ NFC controller hardware */ -static int nfcc_hw_check(struct i2c_client *client, unsigned int enable_gpio) +static int nfcc_hw_check(struct i2c_client *client, struct nqx_dev *nqx_dev) { int ret = 0; unsigned char raw_nci_reset_cmd[] = {0x20, 0x00, 0x01, 0x00}; + unsigned char raw_nci_init_cmd[] = {0x20, 0x01, 0x00}; + unsigned char nci_init_rsp[28]; unsigned char nci_reset_rsp[6]; - + unsigned char init_rsp_len = 0; + unsigned int enable_gpio = nqx_dev->en_gpio; /* making sure that the NFCC starts in a clean state. */ gpio_set_value(enable_gpio, 0);/* ULPM: Disable */ /* hardware dependent delay */ @@ -533,16 +559,75 @@ static int nfcc_hw_check(struct i2c_client *client, unsigned int enable_gpio) /* Read Response of RESET command */ ret = i2c_master_recv(client, nci_reset_rsp, - sizeof(nci_reset_rsp)); + sizeof(nci_reset_rsp)); dev_err(&client->dev, - "%s: - nq - reset cmd answer : NfcNciRx %x %x %x\n", - __func__, nci_reset_rsp[0], - nci_reset_rsp[1], nci_reset_rsp[2]); + "%s: - nq - reset cmd answer : NfcNciRx %x %x %x\n", + __func__, nci_reset_rsp[0], + nci_reset_rsp[1], nci_reset_rsp[2]); if (ret < 0) { dev_err(&client->dev, "%s: - i2c_master_recv Error\n", __func__); goto err_nfcc_hw_check; } + ret = i2c_master_send(client, raw_nci_init_cmd, + sizeof(raw_nci_init_cmd)); + if (ret < 0) { + dev_err(&client->dev, + "%s: - i2c_master_send Error\n", __func__); + goto err_nfcc_hw_check; + } + /* hardware dependent delay */ + msleep(30); + /* Read Response of INIT command */ + ret = i2c_master_recv(client, nci_init_rsp, + sizeof(nci_init_rsp)); + if (ret < 0) { + dev_err(&client->dev, + "%s: - i2c_master_recv Error\n", __func__); + goto err_nfcc_hw_check; + } + init_rsp_len = 2 + nci_init_rsp[2]; /*payload + len*/ + if (init_rsp_len > PAYLOAD_HEADER_LENGTH) { + nqx_dev->nqx_info.info.chip_type = + nci_init_rsp[init_rsp_len - 3]; + nqx_dev->nqx_info.info.rom_version = + nci_init_rsp[init_rsp_len - 2]; + nqx_dev->nqx_info.info.fw_major = + nci_init_rsp[init_rsp_len - 1]; + nqx_dev->nqx_info.info.fw_minor = + nci_init_rsp[init_rsp_len]; + } + dev_dbg(&nqx_dev->client->dev, "NQ NFCC chip_type = %x\n", + nqx_dev->nqx_info.info.chip_type); + dev_dbg(&nqx_dev->client->dev, "NQ fw version = %x.%x.%x\n", + nqx_dev->nqx_info.info.rom_version, + nqx_dev->nqx_info.info.fw_major, + nqx_dev->nqx_info.info.fw_minor); + + switch (nqx_dev->nqx_info.info.chip_type) { + case NFCC_NQ_210: + dev_dbg(&client->dev, + "%s: ## NFCC == NQ210 ##\n", __func__); + break; + case NFCC_NQ_220: + dev_dbg(&client->dev, + "%s: ## NFCC == NQ220 ##\n", __func__); + break; + case NFCC_NQ_310: + dev_dbg(&client->dev, + "%s: ## NFCC == NQ310 ##\n", __func__); + break; + case NFCC_NQ_330: + dev_dbg(&client->dev, + "%s: ## NFCC == NQ330 ##\n", __func__); + break; + default: + dev_err(&client->dev, + "%s: - NFCC HW not Supported\n", __func__); + break; + } + + /*Disable NFC by default to save power on boot*/ gpio_set_value(enable_gpio, 0);/* ULPM: Disable */ ret = 0; goto done; @@ -563,9 +648,7 @@ static int nfcc_hw_check(struct i2c_client *client, unsigned int enable_gpio) static int nqx_clock_select(struct nqx_dev *nqx_dev) { int r = 0; - - nqx_dev->s_clk = - clk_get(&nqx_dev->client->dev, "ref_clk"); + nqx_dev->s_clk = clk_get(&nqx_dev->client->dev, "ref_clk"); if (nqx_dev->s_clk == NULL) goto err_clk; @@ -863,7 +946,7 @@ static int nqx_probe(struct i2c_client *client, * present before attempting further hardware initialisation. * */ - r = nfcc_hw_check(client , platform_data->en_gpio); + r = nfcc_hw_check(client , nqx_dev); if (r) { /* make sure NFCC is not enabled */ gpio_set_value(platform_data->en_gpio, 0); diff --git a/drivers/nfc/nq-nci.h b/drivers/nfc/nq-nci.h index 7656e9e8917ec..7e62b06955379 100644 --- a/drivers/nfc/nq-nci.h +++ b/drivers/nfc/nq-nci.h @@ -22,6 +22,7 @@ #include #include +#include #define NFC_SET_PWR _IOW(0xE9, 0x01, unsigned int) #define ESE_SET_PWR _IOW(0xE9, 0x02, unsigned int) @@ -42,4 +43,11 @@ enum nfcc_initial_core_reset_ntf { DEFAULT_INITIAL_CORE_RESET_NTF, /*2*/ }; +enum nfcc_chip_variant { + NFCC_NQ_210 = 0x48, /**< NFCC NQ210 */ + NFCC_NQ_220 = 0x58, /**< NFCC NQ220 */ + NFCC_NQ_310 = 0x40, /**< NFCC NQ310 */ + NFCC_NQ_330 = 0x51, /**< NFCC NQ330 */ + NFCC_NOT_SUPPORTED = 0xFF /**< NFCC is not supported */ +}; #endif diff --git a/include/linux/nfcinfo.h b/include/linux/nfcinfo.h new file mode 100644 index 0000000000000..9e089084ca14a --- /dev/null +++ b/include/linux/nfcinfo.h @@ -0,0 +1,18 @@ +/*Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + *This program is free software; you can redistribute it and/or modify + *it under the terms of the GNU General Public License version 2 and + *only version 2 as published by the Free Software Foundation. + * + *This program is distributed in the hope that it will be useful, + *but WITHOUT ANY WARRANTY; without even the implied warranty of + *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + *GNU General Public License for more details. + */ + +#ifndef _NFCINFO_H +#define _NFCINFO_H + +#include + +#endif diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index cdaa0e68b1e10..fc5e588e818cf 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -22,6 +22,7 @@ header-y += usb/ header-y += wimax/ header-y += ../../../drivers/staging/android/uapi/ header-y += mfd/ +header-y += nfc/ genhdr-y += version.h diff --git a/include/uapi/linux/nfc/Kbuild b/include/uapi/linux/nfc/Kbuild new file mode 100644 index 0000000000000..90710153e4626 --- /dev/null +++ b/include/uapi/linux/nfc/Kbuild @@ -0,0 +1,2 @@ +#UAPI export list +header-y += nfcinfo.h diff --git a/include/uapi/linux/nfc/nfcinfo.h b/include/uapi/linux/nfc/nfcinfo.h new file mode 100644 index 0000000000000..df178e2bbae6d --- /dev/null +++ b/include/uapi/linux/nfc/nfcinfo.h @@ -0,0 +1,21 @@ +#ifndef _UAPI_NFCINFO_H_ +#define _UAPI_NFCINFO_H_ + +#include + +#define NFCC_MAGIC 0xE9 +#define NFCC_GET_INFO _IOW(NFCC_MAGIC, 0x09, unsigned int) + +struct nqx_devinfo { + unsigned char chip_type; + unsigned char rom_version; + unsigned char fw_major; + unsigned char fw_minor; +}; + +union nqx_uinfo { + unsigned int i; + struct nqx_devinfo info; +}; + +#endif From cd7e77fbab7e2b7e737a10d5300e826572fee82f Mon Sep 17 00:00:00 2001 From: Ashish Garg Date: Mon, 5 Jun 2017 14:58:28 +0530 Subject: [PATCH 0873/1015] msm: mdss: size check before writing to edid buffer To update custom edid through sysfs node, there was no check on the edid size passed. The user can overwrite the edid buffer. To prevent buffer overflow, ensure that edid size is validated with the edid buffer size before writing to the buffer. Change-Id: I8604ea2d25f3a4985749bd037497d242b0621519 Signed-off-by: Ashish Garg --- drivers/video/msm/mdss/mdss_hdmi_tx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_hdmi_tx.c b/drivers/video/msm/mdss/mdss_hdmi_tx.c index edde7857fb111..6bb45ee46ebd9 100644 --- a/drivers/video/msm/mdss/mdss_hdmi_tx.c +++ b/drivers/video/msm/mdss/mdss_hdmi_tx.c @@ -542,7 +542,8 @@ static ssize_t hdmi_tx_sysfs_wta_edid(struct device *dev, } mutex_lock(&hdmi_ctrl->tx_lock); - if (edid_size < EDID_BLOCK_SIZE) { + if ((edid_size < EDID_BLOCK_SIZE) || + (edid_size > hdmi_ctrl->edid_buf_size)) { DEV_DBG("%s: disabling custom edid\n", __func__); ret = -EINVAL; From 2bb249fb5c5f34c658e68d53586d7c9416dbf0e1 Mon Sep 17 00:00:00 2001 From: Abdulla Anam Date: Fri, 12 May 2017 19:47:58 +0530 Subject: [PATCH 0874/1015] msm: vidc: Allocate memory dynamically for debugfs info_reads Use dynamically allocated memory for constructing strings in core_info_read & inst_info_read. This ensures that there is no contention for a shared memory & hence avoids the requirement of a lock. Allocate on demand, as the calls implement a debugfs facility and hence rarely invoked. Statically allocated memory otherwise remain idle. Change-Id: I3ae04e0a51801a2fc901591e41e28ff6b7d198b4 Signed-off-by: Abdulla Anam Signed-off-by: Sanjay Singh --- .../media/platform/msm/vidc/msm_v4l2_vidc.c | 2 - drivers/media/platform/msm/vidc/msm_vidc.c | 3 +- .../media/platform/msm/vidc/msm_vidc_debug.c | 282 +++++++++++------- .../media/platform/msm/vidc/msm_vidc_debug.h | 2 +- 4 files changed, 175 insertions(+), 114 deletions(-) diff --git a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c index f77b94323d224..9c897d3458b10 100644 --- a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c @@ -789,7 +789,6 @@ static int __init msm_vidc_init(void) if (rc) { dprintk(VIDC_ERR, "Failed to register platform driver\n"); - msm_vidc_debugfs_deinit_drv(); debugfs_remove_recursive(vidc_driver->debugfs_root); kfree(vidc_driver); vidc_driver = NULL; @@ -801,7 +800,6 @@ static int __init msm_vidc_init(void) static void __exit msm_vidc_exit(void) { platform_driver_unregister(&msm_vidc_driver); - msm_vidc_debugfs_deinit_drv(); debugfs_remove_recursive(vidc_driver->debugfs_root); kfree(vidc_driver); vidc_driver = NULL; diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c index 48b6e92b7d95c..f01590807d2f9 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_vidc.c @@ -1307,8 +1307,6 @@ static void cleanup_instance(struct msm_vidc_inst *inst) if (inst->extradata_handle) msm_comm_smem_free(inst, inst->extradata_handle); - debugfs_remove_recursive(inst->debugfs_root); - mutex_lock(&inst->pending_getpropq.lock); if (!list_empty(&inst->pending_getpropq.list)) { dprintk(VIDC_ERR, @@ -1342,6 +1340,7 @@ int msm_vidc_destroy(struct msm_vidc_inst *inst) for (i = 0; i < MAX_PORT_NUM; i++) vb2_queue_release(&inst->bufq[i].vb2_bufq); + msm_vidc_debugfs_deinit_inst(inst); pr_info(VIDC_DBG_TAG "Closed video instance: %pK\n", VIDC_MSG_PRIO2STRING(VIDC_INFO), inst); kfree(inst); diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.c b/drivers/media/platform/msm/vidc/msm_vidc_debug.c index c81ba5485b504..559988b62ebc5 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_debug.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.c @@ -34,44 +34,31 @@ int msm_vidc_debug_timeout = 0; #define MAX_DBG_BUF_SIZE 4096 -struct debug_buffer { - struct mutex lock; - char ptr[MAX_DBG_BUF_SIZE]; - char *curr; - u32 filled_size; -}; - -static struct debug_buffer dbg_buf; - -#define INIT_DBG_BUF(__buf) ({ \ - __buf.curr = __buf.ptr;\ - __buf.filled_size = 0; \ -}) - #define DYNAMIC_BUF_OWNER(__binfo) ({ \ atomic_read(&__binfo->ref_count) == 2 ? "video driver" : "firmware";\ }) +struct core_inst_pair { + struct msm_vidc_core *core; + struct msm_vidc_inst *inst; +}; + static int core_info_open(struct inode *inode, struct file *file) { file->private_data = inode->i_private; return 0; } -static u32 write_str(struct debug_buffer *buffer, const char *fmt, ...) +static u32 write_str(char *buffer, + size_t size, const char *fmt, ...) { va_list args; - u32 size; - - char *curr = buffer->curr; - char *end = buffer->ptr + MAX_DBG_BUF_SIZE; + u32 len; va_start(args, fmt); - size = vscnprintf(curr, end - curr, fmt, args); + len = vscnprintf(buffer, size, fmt, args); va_end(args); - buffer->curr += size; - buffer->filled_size += size; - return size; + return len; } static ssize_t core_info_read(struct file *file, char __user *buf, @@ -80,6 +67,7 @@ static ssize_t core_info_read(struct file *file, char __user *buf, struct msm_vidc_core *core = file->private_data; struct hfi_device *hdev; struct hal_fw_info fw_info = { {0} }; + char *dbuf, *cur, *end; int i = 0, rc = 0; ssize_t len = 0; @@ -87,36 +75,46 @@ static ssize_t core_info_read(struct file *file, char __user *buf, dprintk(VIDC_ERR, "Invalid params, core: %pK\n", core); return 0; } + + dbuf = kzalloc(MAX_DBG_BUF_SIZE, GFP_KERNEL); + if (!dbuf) { + dprintk(VIDC_ERR, "%s: Allocation failed!\n", __func__); + return -ENOMEM; + } + cur = dbuf; + end = cur + MAX_DBG_BUF_SIZE; hdev = core->device; - mutex_lock(&dbg_buf.lock); - INIT_DBG_BUF(dbg_buf); - write_str(&dbg_buf, "===============================\n"); - write_str(&dbg_buf, "CORE %d: %pK\n", core->id, core); - write_str(&dbg_buf, "===============================\n"); - write_str(&dbg_buf, "Core state: %d\n", core->state); + cur += write_str(cur, end - cur, "===============================\n"); + cur += write_str(cur, end - cur, "CORE %d: %pK\n", core->id, core); + cur += write_str(cur, end - cur, "===============================\n"); + cur += write_str(cur, end - cur, "Core state: %d\n", core->state); rc = call_hfi_op(hdev, get_fw_info, hdev->hfi_device_data, &fw_info); if (rc) { dprintk(VIDC_WARN, "Failed to read FW info\n"); goto err_fw_info; } - write_str(&dbg_buf, "FW version : %s\n", &fw_info.version); - write_str(&dbg_buf, "base addr: 0x%x\n", fw_info.base_addr); - write_str(&dbg_buf, "register_base: 0x%x\n", fw_info.register_base); - write_str(&dbg_buf, "register_size: %u\n", fw_info.register_size); - write_str(&dbg_buf, "irq: %u\n", fw_info.irq); + cur += write_str(cur, end - cur, + "FW version : %s\n", &fw_info.version); + cur += write_str(cur, end - cur, + "base addr: 0x%x\n", fw_info.base_addr); + cur += write_str(cur, end - cur, + "register_base: 0x%x\n", fw_info.register_base); + cur += write_str(cur, end - cur, + "register_size: %u\n", fw_info.register_size); + cur += write_str(cur, end - cur, "irq: %u\n", fw_info.irq); err_fw_info: for (i = SYS_MSG_START; i < SYS_MSG_END; i++) { - write_str(&dbg_buf, "completions[%d]: %s\n", i, + cur += write_str(cur, end - cur, "completions[%d]: %s\n", i, completion_done(&core->completions[SYS_MSG_INDEX(i)]) ? "pending" : "done"); } len = simple_read_from_buffer(buf, count, ppos, - dbg_buf.ptr, dbg_buf.filled_size); + dbuf, cur - dbuf); - mutex_unlock(&dbg_buf.lock); + kfree(dbuf); return len; } @@ -173,7 +171,6 @@ struct dentry *msm_vidc_debugfs_init_drv(void) bool ok = false; struct dentry *dir = NULL; - mutex_init(&dbg_buf.lock); dir = debugfs_create_dir("msm_vidc", NULL); if (IS_ERR_OR_NULL(dir)) { dir = NULL; @@ -259,12 +256,15 @@ struct dentry *msm_vidc_debugfs_init_core(struct msm_vidc_core *core, static int inst_info_open(struct inode *inode, struct file *file) { + dprintk(VIDC_INFO, "Open inode ptr: %pK\n", inode->i_private); file->private_data = inode->i_private; return 0; } -static int publish_unreleased_reference(struct msm_vidc_inst *inst) +static int publish_unreleased_reference(struct msm_vidc_inst *inst, + char **dbuf, char *end) { + char *cur = *dbuf; struct buffer_info *temp = NULL; if (!inst) { @@ -273,137 +273,206 @@ static int publish_unreleased_reference(struct msm_vidc_inst *inst) } if (inst->buffer_mode_set[CAPTURE_PORT] == HAL_BUFFER_MODE_DYNAMIC) { - write_str(&dbg_buf, "Pending buffer references:\n"); + cur += write_str(cur, end - cur, "Pending buffer references\n"); mutex_lock(&inst->registeredbufs.lock); list_for_each_entry(temp, &inst->registeredbufs.list, list) { if (temp->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE && !temp->inactive && atomic_read(&temp->ref_count)) { - write_str(&dbg_buf, - "\tpending buffer: %#lx fd[0] = %d ref_count = %d held by: %s\n", - temp->device_addr[0], - temp->fd[0], - atomic_read(&temp->ref_count), - DYNAMIC_BUF_OWNER(temp)); + cur += write_str(cur, end - cur, + "\tpending buffer: %#lx fd[0] = %d ref_count = %d held by: %s\n", + temp->device_addr[0], + temp->fd[0], + atomic_read(&temp->ref_count), + DYNAMIC_BUF_OWNER(temp)); } } mutex_unlock(&inst->registeredbufs.lock); } + + *dbuf = cur; return 0; } +void put_inst_helper(struct kref *kref) +{ + struct msm_vidc_inst *inst = container_of(kref, + struct msm_vidc_inst, kref); + msm_vidc_destroy(inst); +} static ssize_t inst_info_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { - struct msm_vidc_inst *inst = file->private_data; - struct msm_vidc_core *core = inst ? inst->core : NULL; + struct core_inst_pair *idata = file->private_data; + struct msm_vidc_core *core; + struct msm_vidc_inst *inst, *temp = NULL; + char *dbuf, *cur, *end; int i, j; ssize_t len = 0; - if (!inst || !core) { - dprintk(VIDC_ERR, "Invalid params, core: %pK inst %pK\n", - core, inst); + if (!idata || !idata->core || !idata->inst) { + dprintk(VIDC_ERR, "%s: Invalid params\n", __func__); return 0; } - if (!get_inst(core, inst)) { - dprintk(VIDC_ERR, "%s inactive session\n", __func__); + + core = idata->core; + inst = idata->inst; + + mutex_lock(&core->lock); + list_for_each_entry(temp, &core->instances, list) { + if (temp == inst) + break; + } + inst = ((temp == inst) && kref_get_unless_zero(&inst->kref)) ? + inst : NULL; + mutex_unlock(&core->lock); + + if (!inst) { + dprintk(VIDC_ERR, "%s: Instance has become obsolete", __func__); return 0; } - mutex_lock(&dbg_buf.lock); - INIT_DBG_BUF(dbg_buf); - write_str(&dbg_buf, "===============================\n"); - write_str(&dbg_buf, "INSTANCE: %pK (%s)\n", inst, + dbuf = kzalloc(MAX_DBG_BUF_SIZE, GFP_KERNEL); + if (!dbuf) { + dprintk(VIDC_ERR, "%s: Allocation failed!\n", __func__); + len = -ENOMEM; + goto failed_alloc; + } + cur = dbuf; + end = cur + MAX_DBG_BUF_SIZE; + + cur += write_str(cur, end - cur, "==============================\n"); + cur += write_str(cur, end - cur, "INSTANCE: %pK (%s)\n", inst, inst->session_type == MSM_VIDC_ENCODER ? "Encoder" : "Decoder"); - write_str(&dbg_buf, "===============================\n"); - write_str(&dbg_buf, "core: %pK\n", inst->core); - write_str(&dbg_buf, "height: %d\n", inst->prop.height[CAPTURE_PORT]); - write_str(&dbg_buf, "width: %d\n", inst->prop.width[CAPTURE_PORT]); - write_str(&dbg_buf, "fps: %d\n", inst->prop.fps); - write_str(&dbg_buf, "state: %d\n", inst->state); - write_str(&dbg_buf, "secure: %d\n", !!(inst->flags & VIDC_SECURE)); - write_str(&dbg_buf, "-----------Formats-------------\n"); + cur += write_str(cur, end - cur, "==============================\n"); + cur += write_str(cur, end - cur, "core: %pK\n", inst->core); + cur += write_str(cur, end - cur, "height: %d\n", + inst->prop.height[CAPTURE_PORT]); + cur += write_str(cur, end - cur, "width: %d\n", + inst->prop.width[CAPTURE_PORT]); + cur += write_str(cur, end - cur, "fps: %d\n", inst->prop.fps); + cur += write_str(cur, end - cur, "state: %d\n", inst->state); + cur += write_str(cur, end - cur, "secure: %d\n", + !!(inst->flags & VIDC_SECURE)); + cur += write_str(cur, end - cur, "-----------Formats-------------\n"); for (i = 0; i < MAX_PORT_NUM; i++) { - write_str(&dbg_buf, "capability: %s\n", i == OUTPUT_PORT ? + cur += write_str(cur, end - cur, "capability: %s\n", + i == OUTPUT_PORT ? "Output" : "Capture"); + cur += write_str(cur, end - cur, "name : %s\n", + inst->fmts[i]->name); + cur += write_str(cur, end - cur, "planes : %d\n", + inst->fmts[i]->num_planes); + cur += write_str(cur, end - cur, + "type: %s\n", i == OUTPUT_PORT ? "Output" : "Capture"); - write_str(&dbg_buf, "name : %s\n", inst->fmts[i]->name); - write_str(&dbg_buf, "planes : %d\n", inst->fmts[i]->num_planes); - write_str( - &dbg_buf, "type: %s\n", inst->fmts[i]->type == OUTPUT_PORT ? - "Output" : "Capture"); - switch (inst->buffer_mode_set[i]) { - case HAL_BUFFER_MODE_STATIC: - write_str(&dbg_buf, "buffer mode : %s\n", "static"); - break; - case HAL_BUFFER_MODE_RING: - write_str(&dbg_buf, "buffer mode : %s\n", "ring"); - break; - case HAL_BUFFER_MODE_DYNAMIC: - write_str(&dbg_buf, "buffer mode : %s\n", "dynamic"); - break; - default: - write_str(&dbg_buf, "buffer mode : unsupported\n"); - } - - write_str(&dbg_buf, "count: %u\n", - inst->bufq[i].vb2_bufq.num_buffers); - for (j = 0; j < inst->fmts[i]->num_planes; j++) - write_str(&dbg_buf, "size for plane %d: %u\n", j, + cur += write_str(cur, end - cur, + "size for plane %d: %u\n", j, inst->bufq[i].vb2_bufq.plane_sizes[j]); if (i < MAX_PORT_NUM - 1) - write_str(&dbg_buf, "\n"); + cur += write_str(cur, end - cur, "\n"); } - write_str(&dbg_buf, "-------------------------------\n"); + cur += write_str(cur, end - cur, "-------------------------------\n"); for (i = SESSION_MSG_START; i < SESSION_MSG_END; i++) { - write_str(&dbg_buf, "completions[%d]: %s\n", i, + cur += write_str(cur, end - cur, "completions[%d]: %s\n", i, completion_done(&inst->completions[SESSION_MSG_INDEX(i)]) ? "pending" : "done"); } - write_str(&dbg_buf, "ETB Count: %d\n", inst->count.etb); - write_str(&dbg_buf, "EBD Count: %d\n", inst->count.ebd); - write_str(&dbg_buf, "FTB Count: %d\n", inst->count.ftb); - write_str(&dbg_buf, "FBD Count: %d\n", inst->count.fbd); - publish_unreleased_reference(inst); + cur += write_str(cur, end - cur, "ETB Count: %d\n", inst->count.etb); + cur += write_str(cur, end - cur, "EBD Count: %d\n", inst->count.ebd); + cur += write_str(cur, end - cur, "FTB Count: %d\n", inst->count.ftb); + cur += write_str(cur, end - cur, "FBD Count: %d\n", inst->count.fbd); + + publish_unreleased_reference(inst, &cur, end); len = simple_read_from_buffer(buf, count, ppos, - dbg_buf.ptr, dbg_buf.filled_size); + dbuf, cur - dbuf); - mutex_unlock(&dbg_buf.lock); - put_inst(inst); + kfree(dbuf); +failed_alloc: + kref_put(&inst->kref, put_inst_helper); return len; } +static int inst_info_release(struct inode *inode, struct file *file) +{ + dprintk(VIDC_INFO, "Release inode ptr: %pK\n", inode->i_private); + file->private_data = NULL; + return 0; +} + static const struct file_operations inst_info_fops = { .open = inst_info_open, .read = inst_info_read, + .release = inst_info_release, }; struct dentry *msm_vidc_debugfs_init_inst(struct msm_vidc_inst *inst, struct dentry *parent) { - struct dentry *dir = NULL; + struct dentry *dir = NULL, *info = NULL; char debugfs_name[MAX_DEBUGFS_NAME]; + struct core_inst_pair *idata = NULL; + if (!inst) { dprintk(VIDC_ERR, "Invalid params, inst: %pK\n", inst); - goto failed_create_dir; + goto exit; } snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%p", inst); + + idata = kzalloc(sizeof(struct core_inst_pair), GFP_KERNEL); + if (!idata) { + dprintk(VIDC_ERR, "%s: Allocation failed!\n", __func__); + goto exit; + } + + idata->core = inst->core; + idata->inst = inst; + dir = debugfs_create_dir(debugfs_name, parent); if (!dir) { dprintk(VIDC_ERR, "Failed to create debugfs for msm_vidc\n"); goto failed_create_dir; } - if (!debugfs_create_file("info", S_IRUGO, dir, inst, &inst_info_fops)) { + + info = debugfs_create_file("info", S_IRUGO, dir, + idata, &inst_info_fops); + if (!info) { dprintk(VIDC_ERR, "debugfs_create_file: fail\n"); - goto failed_create_dir; + goto failed_create_file; } + + dir->d_inode->i_private = info->d_inode->i_private; inst->debug.pdata[FRAME_PROCESSING].sampling = true; + return dir; + +failed_create_file: + debugfs_remove_recursive(dir); + dir = NULL; failed_create_dir: + kfree(idata); +exit: return dir; } +void msm_vidc_debugfs_deinit_inst(struct msm_vidc_inst *inst) +{ + struct dentry *dentry = NULL; + + if (!inst || !inst->debugfs_root) + return; + + dentry = inst->debugfs_root; + if (dentry->d_inode) { + dprintk(VIDC_INFO, "Destroy %pK\n", dentry->d_inode->i_private); + kfree(dentry->d_inode->i_private); + dentry->d_inode->i_private = NULL; + } + debugfs_remove_recursive(dentry); + inst->debugfs_root = NULL; +} + void msm_vidc_debugfs_update(struct msm_vidc_inst *inst, enum msm_vidc_debugfs_event e) { @@ -453,8 +522,3 @@ void msm_vidc_debugfs_update(struct msm_vidc_inst *inst, } } -void msm_vidc_debugfs_deinit_drv(void) -{ - mutex_destroy(&dbg_buf.lock); -} - diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.h b/drivers/media/platform/msm/vidc/msm_vidc_debug.h index abf8d3a8a1737..ec9ec267a92e5 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_debug.h +++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.h @@ -124,9 +124,9 @@ struct dentry *msm_vidc_debugfs_init_core(struct msm_vidc_core *core, struct dentry *parent); struct dentry *msm_vidc_debugfs_init_inst(struct msm_vidc_inst *inst, struct dentry *parent); +void msm_vidc_debugfs_deinit_inst(struct msm_vidc_inst *inst); void msm_vidc_debugfs_update(struct msm_vidc_inst *inst, enum msm_vidc_debugfs_event e); -void msm_vidc_debugfs_deinit_drv(void); static inline void tic(struct msm_vidc_inst *i, enum profiling_points p, char *b) From 1a724ed89933e86ef0a50866d2001d502eb82f11 Mon Sep 17 00:00:00 2001 From: Sreelakshmi Gownipalli Date: Tue, 17 Jan 2017 14:03:54 -0800 Subject: [PATCH 0875/1015] diag: Prevent NULL pointer dereference while closing logging process Prevent NULL pointer dereference while copying the data to memory device process by adding mutex protection when closing the process. Change-Id: Idaad73fb8b2a0bb5a4983d5e255bfdf702cecf71 Signed-off-by: Sreelakshmi Gownipalli --- drivers/char/diag/diagchar_core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index 1fa052f8fb876..9bfb330886012 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -425,8 +425,10 @@ static void diag_close_logging_process(const int pid) driver->mask_clear = 1; mutex_unlock(&driver->diag_maskclear_mutex); + mutex_lock(&driver->diagchar_mutex); session_peripheral_mask = session_info->peripheral_mask; diag_md_session_close(session_info); + mutex_unlock(&driver->diagchar_mutex); for (i = 0; i < NUM_MD_SESSIONS; i++) if (MD_PERIPHERAL_MASK(i) & session_peripheral_mask) diag_mux_close_peripheral(DIAG_LOCAL_PROC, i); From d99ed8b43e9ab7503d40af3213b628feb72a9cd5 Mon Sep 17 00:00:00 2001 From: Sureshnaidu Laveti Date: Thu, 15 Dec 2016 02:39:35 -0800 Subject: [PATCH 0876/1015] msm: sensor: validating the flash initialization parameters Copying the flash initialization parameters from userspace memory to kernel memory and in turn checking for the validity of the flash initialization parameters pointer sent from userspace. CRs-Fixed: 1091603 Change-Id: I17d57016c254fb6628844a152b0e7d45c0b23b2d Signed-off-by: Sureshnaidu Laveti --- .../msm/camera_v2/sensor/flash/msm_flash.c | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c index 3b278128b782e..7d2123f1779fc 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c +++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c @@ -501,6 +501,42 @@ static int32_t msm_flash_init( return 0; } +#ifdef CONFIG_COMPAT +static int32_t msm_flash_init_prepare( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ + return msm_flash_init(flash_ctrl, flash_data); +} +#else +static int32_t msm_flash_init_prepare( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ + struct msm_flash_cfg_data_t flash_data_k; + struct msm_flash_init_info_t flash_init_info; + int32_t i = 0; + + flash_data_k.cfg_type = flash_data->cfg_type; + for (i = 0; i < MAX_LED_TRIGGERS; i++) { + flash_data_k.flash_current[i] = + flash_data->flash_current[i]; + flash_data_k.flash_duration[i] = + flash_data->flash_duration[i]; + } + + flash_data_k.cfg.flash_init_info = &flash_init_info; + if (copy_from_user(&flash_init_info, + (void *)(flash_data->cfg.flash_init_info), + sizeof(struct msm_flash_init_info_t))) { + pr_err("%s copy_from_user failed %d\n", + __func__, __LINE__); + return -EFAULT; + } + return msm_flash_init(flash_ctrl, &flash_data_k); +} +#endif + static int32_t msm_flash_low( struct msm_flash_ctrl_t *flash_ctrl, struct msm_flash_cfg_data_t *flash_data) @@ -607,7 +643,7 @@ static int32_t msm_flash_config(struct msm_flash_ctrl_t *flash_ctrl, switch (flash_data->cfg_type) { case CFG_FLASH_INIT: - rc = msm_flash_init(flash_ctrl, flash_data); + rc = msm_flash_init_prepare(flash_ctrl, flash_data); break; case CFG_FLASH_RELEASE: if (flash_ctrl->flash_state == MSM_CAMERA_FLASH_INIT) From 6edfd74eacc48339496bdbd49041b3ec89d52835 Mon Sep 17 00:00:00 2001 From: Ashish Garg Date: Thu, 25 May 2017 16:47:43 +0530 Subject: [PATCH 0877/1015] msm: mdss: validate number of cea blocks before reading from edid_buf Number of cea blocks are read from edid buffer which comes from the user. If the number of cea blocks are more than the supported blocks kernel information leak is possible by reading more data than is present in edid_buf. Change-Id: I03b8456ff1e1a7b15d711f06908bd5c83f83cc02 Signed-off-by: Ashish Garg --- drivers/video/msm/mdss/mdss_hdmi_tx.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_hdmi_tx.c b/drivers/video/msm/mdss/mdss_hdmi_tx.c index edde7857fb111..a7fe1876b5791 100644 --- a/drivers/video/msm/mdss/mdss_hdmi_tx.c +++ b/drivers/video/msm/mdss/mdss_hdmi_tx.c @@ -594,6 +594,11 @@ static ssize_t hdmi_tx_sysfs_rda_edid(struct device *dev, mutex_lock(&hdmi_ctrl->tx_lock); cea_blks = hdmi_ctrl->edid_buf[EDID_BLOCK_SIZE - 2]; + if (cea_blks >= MAX_EDID_BLOCKS) { + DEV_ERR("%s: invalid cea blocks\n", __func__); + mutex_unlock(&hdmi_ctrl->tx_lock); + return -EINVAL; + } size = (cea_blks + 1) * EDID_BLOCK_SIZE; size = min_t(u32, size, PAGE_SIZE); From 6913a08497fe7a4cd95f8fb11cb061cc059d1236 Mon Sep 17 00:00:00 2001 From: Ashish Garg Date: Thu, 25 May 2017 15:38:55 +0530 Subject: [PATCH 0878/1015] msm: mdss: validate the buffer size before allocating memory There is no validation of the "count" parameter, which is controlled by the user and used as a size of allocated memory. If the user provides a value of "0" for "count", then kmalloc would not return NULL, but also there will be a memory block of "zero" size. This can lead to buffer overflows. Also trying to access invalid memory will cause kernel crashes. Ensure to check that the number of bytes to be written is non-zero. If zero, return invalid input. Change-Id: I9613043881a91fd5a5f99337119c4a3d41493b54 Signed-off-by: Ashish Garg --- drivers/video/msm/mdss/mdss_dsi.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c index 5261d635e20eb..b9675310bc46b 100644 --- a/drivers/video/msm/mdss/mdss_dsi.c +++ b/drivers/video/msm/mdss/mdss_dsi.c @@ -674,6 +674,11 @@ static ssize_t mdss_dsi_cmd_state_write(struct file *file, int *link_state = file->private_data; char *input; + if (!count) { + pr_err("%s: Zero bytes to be written\n", __func__); + return -EINVAL; + } + input = kmalloc(count, GFP_KERNEL); if (!input) { pr_err("%s: Failed to allocate memory\n", __func__); From d76042ec33751a03b99980e9b4ae970d63aea86e Mon Sep 17 00:00:00 2001 From: Satya Durga Srinivasu Prabhala Date: Mon, 27 Mar 2017 13:10:09 -0700 Subject: [PATCH 0879/1015] soc: qcom: service-locator: Return in case of no matching domains found If no matching domains found in response to the request, return error instead of going ahead with memory allocation which would lead to other issues. CRs-Fixed: 2025293 Change-Id: I327b3494812cddc643f6b355c04f85f4baa7c399 Signed-off-by: Satya Durga Srinivasu Prabhala --- drivers/soc/qcom/service-locator.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/soc/qcom/service-locator.c b/drivers/soc/qcom/service-locator.c index 76d754d5edfc5..72f988b1d84f0 100644 --- a/drivers/soc/qcom/service-locator.c +++ b/drivers/soc/qcom/service-locator.c @@ -257,8 +257,10 @@ static int service_locator_send_msg(struct pd_qmi_client_data *pd) if (!domains_read) { db_rev_count = pd->db_rev_count = resp->db_rev_count; pd->total_domains = resp->total_domains; - if (!resp->total_domains) - pr_info("No matching domains found\n"); + if (!resp->total_domains) { + pr_err("No matching domains found\n"); + goto out; + } pd->domain_list = kmalloc( sizeof(struct servreg_loc_entry_v01) * From addb9570ef1e1c099b3b076c4b0c09dee6f5054c Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Wed, 17 May 2017 18:39:55 -0700 Subject: [PATCH 0880/1015] msm: mdss: fix issue preventing cursor_buf address to be stored Fix bug in cursor which prevents the virtual address of the registers to be stored in the driver context. Change-Id: Ica8a9548911da5a32903893b0e494d052e366285 Signed-off-by: Veera Sundaram Sankaran --- drivers/video/msm/mdss/mdss.h | 2 +- drivers/video/msm/mdss/mdss_mdp_overlay.c | 6 +++--- drivers/video/msm/mdss/mdss_smmu.c | 6 +++--- drivers/video/msm/mdss/mdss_smmu.h | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/video/msm/mdss/mdss.h b/drivers/video/msm/mdss/mdss.h index 705c18eaf31f7..396f4efe080da 100644 --- a/drivers/video/msm/mdss/mdss.h +++ b/drivers/video/msm/mdss/mdss.h @@ -249,7 +249,7 @@ struct mdss_smmu_ops { void (*smmu_unmap_dma_buf)(struct sg_table *table, int domain, int dir, struct dma_buf *dma_buf); int (*smmu_dma_alloc_coherent)(struct device *dev, size_t size, - dma_addr_t *phys, dma_addr_t *iova, void *cpu_addr, + dma_addr_t *phys, dma_addr_t *iova, void **cpu_addr, gfp_t gfp, int domain); void (*smmu_dma_free_coherent)(struct device *dev, size_t size, void *cpu_addr, dma_addr_t phys, dma_addr_t iova, diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index 2b9c15f6a5d6b..12bc1b4f95a9f 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -3838,7 +3838,7 @@ static int mdss_mdp_hw_cursor_pipe_update(struct msm_fb_data_type *mfd, if (!mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) { ret = mdss_smmu_dma_alloc_coherent(&pdev->dev, cursor_frame_size, (dma_addr_t *) &mfd->cursor_buf_phys, - &mfd->cursor_buf_iova, mfd->cursor_buf, + &mfd->cursor_buf_iova, &mfd->cursor_buf, GFP_KERNEL, MDSS_IOMMU_DOMAIN_UNSECURE); if (ret) { pr_err("can't allocate cursor buffer rc:%d\n", ret); @@ -4026,7 +4026,7 @@ static int mdss_mdp_hw_cursor_update(struct msm_fb_data_type *mfd, if (!mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) { ret = mdss_smmu_dma_alloc_coherent(&pdev->dev, cursor_frame_size, (dma_addr_t *) &mfd->cursor_buf_phys, - &mfd->cursor_buf_iova, mfd->cursor_buf, + &mfd->cursor_buf_iova, &mfd->cursor_buf, GFP_KERNEL, MDSS_IOMMU_DOMAIN_UNSECURE); if (ret) { pr_err("can't allocate cursor buffer rc:%d\n", ret); @@ -4074,7 +4074,7 @@ static int mdss_mdp_hw_cursor_update(struct msm_fb_data_type *mfd, mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); - if (cursor->set & FB_CUR_SETIMAGE) { + if (mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) { u32 cursor_addr; ret = copy_from_user(mfd->cursor_buf, img->data, img->width * img->height * 4); diff --git a/drivers/video/msm/mdss/mdss_smmu.c b/drivers/video/msm/mdss/mdss_smmu.c index 40b0d1de793ab..a609b44a1eca4 100644 --- a/drivers/video/msm/mdss/mdss_smmu.c +++ b/drivers/video/msm/mdss/mdss_smmu.c @@ -329,7 +329,7 @@ static void mdss_smmu_unmap_dma_buf_v2(struct sg_table *table, int domain, * bank device */ static int mdss_smmu_dma_alloc_coherent_v2(struct device *dev, size_t size, - dma_addr_t *phys, dma_addr_t *iova, void *cpu_addr, + dma_addr_t *phys, dma_addr_t *iova, void **cpu_addr, gfp_t gfp, int domain) { struct mdss_smmu_client *mdss_smmu = mdss_smmu_get_cb(domain); @@ -338,8 +338,8 @@ static int mdss_smmu_dma_alloc_coherent_v2(struct device *dev, size_t size, return -EINVAL; } - cpu_addr = dma_alloc_coherent(mdss_smmu->dev, size, iova, gfp); - if (!cpu_addr) { + *cpu_addr = dma_alloc_coherent(mdss_smmu->dev, size, iova, gfp); + if (!*cpu_addr) { pr_err("dma alloc coherent failed!\n"); return -ENOMEM; } diff --git a/drivers/video/msm/mdss/mdss_smmu.h b/drivers/video/msm/mdss/mdss_smmu.h index 19ec3d2d1e2dd..1e15d7036a7aa 100644 --- a/drivers/video/msm/mdss/mdss_smmu.h +++ b/drivers/video/msm/mdss/mdss_smmu.h @@ -201,7 +201,7 @@ static inline void mdss_smmu_unmap_dma_buf(struct sg_table *table, int domain, } static inline int mdss_smmu_dma_alloc_coherent(struct device *dev, size_t size, - dma_addr_t *phys, dma_addr_t *iova, void *cpu_addr, + dma_addr_t *phys, dma_addr_t *iova, void **cpu_addr, gfp_t gfp, int domain) { struct mdss_data_type *mdata = mdss_mdp_get_mdata(); From 350788e0c958a81e6030887a52ca9bc3ba341cf7 Mon Sep 17 00:00:00 2001 From: zhaoyuan Date: Mon, 20 Feb 2017 13:42:20 +0800 Subject: [PATCH 0881/1015] msm: mdss: hdmi: check up-bound of CEC frame size the spec says the frame size will not be greater than 14, but this have a security hole when somebody sends a message with a size greater than 14. So need check up-boud of the CEC frame size. Change-Id: I743208badc5e77ae911cfb2d102f758d4843138f Signed-off-by: zhaoyuan --- drivers/video/msm/mdss/mdss_hdmi_cec.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_hdmi_cec.c b/drivers/video/msm/mdss/mdss_hdmi_cec.c index a424d987bb638..a4ed01210e04c 100644 --- a/drivers/video/msm/mdss/mdss_hdmi_cec.c +++ b/drivers/video/msm/mdss/mdss_hdmi_cec.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -196,7 +196,7 @@ static void hdmi_cec_msg_recv(struct work_struct *work) msg.sender_id, msg.recvr_id, msg.frame_size); - if (msg.frame_size < 1) { + if (msg.frame_size < 1 || msg.frame_size > MAX_CEC_FRAME_SIZE) { DEV_ERR("%s: invalid message (frame length = %d)\n", __func__, msg.frame_size); return; @@ -216,7 +216,7 @@ static void hdmi_cec_msg_recv(struct work_struct *work) msg.operand[i] = data & 0xFF; } - for (; i < 14; i++) + for (; i < MAX_OPERAND_SIZE; i++) msg.operand[i] = 0; DEV_DBG("%s: opcode 0x%x, wakup_en %d, device_suspend %d\n", __func__, From f21cf3e828223d3303aa725bb19a08fc739060e9 Mon Sep 17 00:00:00 2001 From: Mohit Aggarwal Date: Thu, 25 May 2017 20:21:12 +0530 Subject: [PATCH 0882/1015] diag: Synchronize command registration table access Currently, command registration table is being read in debugfs without any protection which may lead to access of stale entries. The patch takes care of the issue by adding proper protection. CRs-Fixed: 2032672 Change-Id: I6ae058c16873f9ed52ae6516a1a70fd6d2d0da80 Signed-off-by: Mohit Aggarwal --- drivers/char/diag/diag_debugfs.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/char/diag/diag_debugfs.c b/drivers/char/diag/diag_debugfs.c index f5e4eba1e96bc..b66c8cb8257c2 100644 --- a/drivers/char/diag/diag_debugfs.c +++ b/drivers/char/diag/diag_debugfs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -268,8 +268,10 @@ static ssize_t diag_dbgfs_read_table(struct file *file, char __user *ubuf, struct list_head *temp; struct diag_cmd_reg_t *item = NULL; + mutex_lock(&driver->cmd_reg_mutex); if (diag_dbgfs_table_index == driver->cmd_reg_count) { diag_dbgfs_table_index = 0; + mutex_unlock(&driver->cmd_reg_mutex); return 0; } @@ -278,6 +280,7 @@ static ssize_t diag_dbgfs_read_table(struct file *file, char __user *ubuf, buf = kzalloc(sizeof(char) * buf_size, GFP_KERNEL); if (ZERO_OR_NULL_PTR(buf)) { pr_err("diag: %s, Error allocating memory\n", __func__); + mutex_unlock(&driver->cmd_reg_mutex); return -ENOMEM; } buf_size = ksize(buf); @@ -322,6 +325,7 @@ static ssize_t diag_dbgfs_read_table(struct file *file, char __user *ubuf, break; } diag_dbgfs_table_index = i; + mutex_unlock(&driver->cmd_reg_mutex); *ppos = 0; ret = simple_read_from_buffer(ubuf, count, ppos, buf, bytes_in_buffer); From f03b4752d1cc92b6a9792baae779e3f585501401 Mon Sep 17 00:00:00 2001 From: Manish Poddar Date: Thu, 25 May 2017 14:50:42 +0530 Subject: [PATCH 0883/1015] msm: camera: Fix Use after free bug in msm_vb2.c. There is no syncronization between msm_vb2_get_buf and msm_delete_stream which can lead to use after free. Fixed it by using read/write lock. Change-Id: I8e80d70ec866253aab8836457a28ae14175f5d61 Signed-off-by: Manish Poddar Signed-off-by: Trishansh Bhardwaj --- drivers/media/platform/msm/camera_v2/msm.c | 91 +++++++++-- drivers/media/platform/msm/camera_v2/msm.h | 5 +- .../platform/msm/camera_v2/msm_vb2/msm_vb2.c | 146 ++++++++++++++++-- .../platform/msm/camera_v2/msm_vb2/msm_vb2.h | 3 +- 4 files changed, 214 insertions(+), 31 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index 4160c61c76e0c..9f7fa5ad2f606 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -32,7 +32,6 @@ #include "cam_hw_ops.h" #include - static struct v4l2_device *msm_v4l2_dev; static struct list_head ordered_sd_list; @@ -147,7 +146,7 @@ typedef int (*msm_queue_find_func)(void *d1, void *d2); #define msm_queue_find(queue, type, member, func, data) ({\ unsigned long flags; \ struct msm_queue_head *__q = (queue); \ - type *node = 0; \ + type *node = NULL; \ typeof(node) __ret = NULL; \ msm_queue_find_func __f = (func); \ spin_lock_irqsave(&__q->lock, flags); \ @@ -277,22 +276,47 @@ void msm_delete_stream(unsigned int session_id, unsigned int stream_id) struct msm_session *session = NULL; struct msm_stream *stream = NULL; unsigned long flags; + int try_count = 0; session = msm_queue_find(msm_session_q, struct msm_session, list, __msm_queue_find_session, &session_id); + if (!session) return; - stream = msm_queue_find(&session->stream_q, struct msm_stream, - list, __msm_queue_find_stream, &stream_id); - if (!stream) - return; - spin_lock_irqsave(&(session->stream_q.lock), flags); - list_del_init(&stream->list); - session->stream_q.len--; - kfree(stream); - stream = NULL; - spin_unlock_irqrestore(&(session->stream_q.lock), flags); + while (1) { + + if (try_count > 5) { + pr_err("%s : not able to delete stream %d\n", + __func__, __LINE__); + break; + } + + write_lock(&session->stream_rwlock); + try_count++; + stream = msm_queue_find(&session->stream_q, struct msm_stream, + list, __msm_queue_find_stream, &stream_id); + + if (!stream) { + write_unlock(&session->stream_rwlock); + return; + } + + if (msm_vb2_get_stream_state(stream) != 1) { + write_unlock(&session->stream_rwlock); + continue; + } + + spin_lock_irqsave(&(session->stream_q.lock), flags); + list_del_init(&stream->list); + session->stream_q.len--; + kfree(stream); + stream = NULL; + spin_unlock_irqrestore(&(session->stream_q.lock), flags); + write_unlock(&session->stream_rwlock); + break; + } + } EXPORT_SYMBOL(msm_delete_stream); @@ -442,6 +466,7 @@ int msm_create_session(unsigned int session_id, struct video_device *vdev) mutex_init(&session->lock); mutex_init(&session->lock_q); mutex_init(&session->close_lock); + rwlock_init(&session->stream_rwlock); return 0; } EXPORT_SYMBOL(msm_create_session); @@ -1030,17 +1055,25 @@ static struct v4l2_file_operations msm_fops = { #endif }; -struct msm_stream *msm_get_stream(unsigned int session_id, - unsigned int stream_id) +struct msm_session *msm_get_session(unsigned int session_id) { struct msm_session *session; - struct msm_stream *stream; session = msm_queue_find(msm_session_q, struct msm_session, list, __msm_queue_find_session, &session_id); if (!session) return ERR_PTR(-EINVAL); + return session; +} +EXPORT_SYMBOL(msm_get_session); + + +struct msm_stream *msm_get_stream(struct msm_session *session, + unsigned int stream_id) +{ + struct msm_stream *stream; + stream = msm_queue_find(&session->stream_q, struct msm_stream, list, __msm_queue_find_stream, &stream_id); @@ -1097,6 +1130,34 @@ struct msm_stream *msm_get_stream_from_vb2q(struct vb2_queue *q) } EXPORT_SYMBOL(msm_get_stream_from_vb2q); +struct msm_session *msm_get_session_from_vb2q(struct vb2_queue *q) +{ + struct msm_session *session; + struct msm_stream *stream; + unsigned long flags1; + unsigned long flags2; + + spin_lock_irqsave(&msm_session_q->lock, flags1); + list_for_each_entry(session, &(msm_session_q->list), list) { + spin_lock_irqsave(&(session->stream_q.lock), flags2); + list_for_each_entry( + stream, &(session->stream_q.list), list) { + if (stream->vb2_q == q) { + spin_unlock_irqrestore + (&(session->stream_q.lock), flags2); + spin_unlock_irqrestore + (&msm_session_q->lock, flags1); + return session; + } + } + spin_unlock_irqrestore(&(session->stream_q.lock), flags2); + } + spin_unlock_irqrestore(&msm_session_q->lock, flags1); + return NULL; +} +EXPORT_SYMBOL(msm_get_session_from_vb2q); + + #ifdef CONFIG_COMPAT long msm_copy_camera_private_ioctl_args(unsigned long arg, struct msm_camera_private_ioctl_arg *k_ioctl, diff --git a/drivers/media/platform/msm/camera_v2/msm.h b/drivers/media/platform/msm/camera_v2/msm.h index 2b3576b8edd26..39797de41cce5 100644 --- a/drivers/media/platform/msm/camera_v2/msm.h +++ b/drivers/media/platform/msm/camera_v2/msm.h @@ -110,6 +110,7 @@ struct msm_session { struct mutex lock; struct mutex lock_q; struct mutex close_lock; + rwlock_t stream_rwlock; }; static inline bool msm_is_daemon_present(void) @@ -127,11 +128,13 @@ int msm_create_stream(unsigned int session_id, void msm_delete_stream(unsigned int session_id, unsigned int stream_id); int msm_create_command_ack_q(unsigned int session_id, unsigned int stream_id); void msm_delete_command_ack_q(unsigned int session_id, unsigned int stream_id); -struct msm_stream *msm_get_stream(unsigned int session_id, +struct msm_session *msm_get_session(unsigned int session_id); +struct msm_stream *msm_get_stream(struct msm_session *session, unsigned int stream_id); struct vb2_queue *msm_get_stream_vb2q(unsigned int session_id, unsigned int stream_id); struct msm_stream *msm_get_stream_from_vb2q(struct vb2_queue *q); +struct msm_session *msm_get_session_from_vb2q(struct vb2_queue *q); struct msm_session *msm_session_find(unsigned int session_id); #ifdef CONFIG_COMPAT long msm_copy_camera_private_ioctl_args(unsigned long arg, diff --git a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c index 8bea9efc292bb..834e8fae99ab6 100644 --- a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c +++ b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -44,16 +44,24 @@ static int msm_vb2_queue_setup(struct vb2_queue *q, int msm_vb2_buf_init(struct vb2_buffer *vb) { struct msm_stream *stream; + struct msm_session *session; struct msm_vb2_buffer *msm_vb2_buf; + session = msm_get_session_from_vb2q(vb->vb2_queue); + if (IS_ERR_OR_NULL(session)) + return -EINVAL; + + read_lock(&session->stream_rwlock); + stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s: Couldn't find stream\n", __func__); + read_unlock(&session->stream_rwlock); return -EINVAL; } msm_vb2_buf = container_of(vb, struct msm_vb2_buffer, vb2_buf); msm_vb2_buf->in_freeq = 0; - + read_unlock(&session->stream_rwlock); return 0; } @@ -61,6 +69,7 @@ static void msm_vb2_buf_queue(struct vb2_buffer *vb) { struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; + struct msm_session *session; unsigned long flags; msm_vb2 = container_of(vb, struct msm_vb2_buffer, vb2_buf); @@ -70,21 +79,30 @@ static void msm_vb2_buf_queue(struct vb2_buffer *vb) return; } + session = msm_get_session_from_vb2q(vb->vb2_queue); + if (IS_ERR_OR_NULL(session)) + return; + + read_lock(&session->stream_rwlock); + stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s:%d] NULL stream", __func__, __LINE__); + read_unlock(&session->stream_rwlock); return; } spin_lock_irqsave(&stream->stream_lock, flags); list_add_tail(&msm_vb2->list, &stream->queued_list); spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock(&session->stream_rwlock); } static void msm_vb2_buf_finish(struct vb2_buffer *vb) { struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; + struct msm_session *session; unsigned long flags; struct msm_vb2_buffer *msm_vb2_entry, *temp; @@ -95,9 +113,16 @@ static void msm_vb2_buf_finish(struct vb2_buffer *vb) return; } + session = msm_get_session_from_vb2q(vb->vb2_queue); + if (IS_ERR_OR_NULL(session)) + return; + + read_lock(&session->stream_rwlock); + stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s:%d] NULL stream", __func__, __LINE__); + read_unlock(&session->stream_rwlock); return; } @@ -110,6 +135,7 @@ static void msm_vb2_buf_finish(struct vb2_buffer *vb) } } spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock(&session->stream_rwlock); return; } @@ -117,12 +143,20 @@ static void msm_vb2_stop_stream(struct vb2_queue *q) { struct msm_vb2_buffer *msm_vb2, *temp; struct msm_stream *stream; + struct msm_session *session; unsigned long flags; struct vb2_buffer *vb2_buf; + session = msm_get_session_from_vb2q(q); + if (IS_ERR_OR_NULL(session)) + return; + + read_lock(&session->stream_rwlock); + stream = msm_get_stream_from_vb2q(q); if (!stream) { pr_err_ratelimited("%s:%d] NULL stream", __func__, __LINE__); + read_unlock(&session->stream_rwlock); return; } @@ -141,7 +175,27 @@ static void msm_vb2_stop_stream(struct vb2_queue *q) msm_vb2->in_freeq = 0; } spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock(&session->stream_rwlock); +} + +int msm_vb2_get_stream_state(struct msm_stream *stream) +{ + struct msm_vb2_buffer *msm_vb2, *temp; + unsigned long flags; + int rc = 1; + + spin_lock_irqsave(&stream->stream_lock, flags); + list_for_each_entry_safe(msm_vb2, temp, &(stream->queued_list), list) { + if (msm_vb2->in_freeq != 0) { + rc = 0; + break; + } + } + spin_unlock_irqrestore(&stream->stream_lock, flags); + return rc; } +EXPORT_SYMBOL(msm_vb2_get_stream_state); + static struct vb2_ops msm_vb2_get_q_op = { .queue_setup = msm_vb2_queue_setup, @@ -196,13 +250,22 @@ static struct vb2_buffer *msm_vb2_get_buf(int session_id, { struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; + struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; unsigned long flags; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) return NULL; + read_lock(&session->stream_rwlock); + + stream = msm_get_stream(session, stream_id); + if (IS_ERR_OR_NULL(stream)) { + read_unlock(&session->stream_rwlock); + return NULL; + } + spin_lock_irqsave(&stream->stream_lock, flags); if (!stream->vb2_q) { @@ -225,6 +288,7 @@ static struct vb2_buffer *msm_vb2_get_buf(int session_id, vb2_buf = NULL; end: spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock(&session->stream_rwlock); return vb2_buf; } @@ -233,12 +297,22 @@ static struct vb2_buffer *msm_vb2_get_buf_by_idx(int session_id, { struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; + struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; unsigned long flags; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) + return NULL; + + read_lock(&session->stream_rwlock); + + stream = msm_get_stream(session, stream_id); + + if (IS_ERR_OR_NULL(stream)) { + read_unlock(&session->stream_rwlock); return NULL; + } spin_lock_irqsave(&stream->stream_lock, flags); @@ -260,6 +334,7 @@ static struct vb2_buffer *msm_vb2_get_buf_by_idx(int session_id, vb2_buf = NULL; end: spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock(&session->stream_rwlock); return vb2_buf; } @@ -267,14 +342,24 @@ static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, unsigned int stream_id) { struct msm_stream *stream; + struct msm_session *session; struct msm_vb2_buffer *msm_vb2; struct vb2_buffer *vb2_buf = NULL; int rc = 0; unsigned long flags; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) return -EINVAL; + read_lock(&session->stream_rwlock); + + stream = msm_get_stream(session, stream_id); + if (IS_ERR_OR_NULL(stream)) { + read_unlock(&session->stream_rwlock); + return -EINVAL; + } + spin_lock_irqsave(&stream->stream_lock, flags); if (vb) { list_for_each_entry(msm_vb2, &(stream->queued_list), list) { @@ -301,6 +386,7 @@ static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, rc = -EINVAL; } spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock(&session->stream_rwlock); return rc; } @@ -312,11 +398,21 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; + struct msm_session *session; int rc = 0; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) return -EINVAL; + + read_lock(&session->stream_rwlock); + + stream = msm_get_stream(session, stream_id); + if (IS_ERR_OR_NULL(stream)) { + read_unlock(&session->stream_rwlock); + return -EINVAL; + } + spin_lock_irqsave(&stream->stream_lock, flags); if (vb) { list_for_each_entry(msm_vb2, &(stream->queued_list), list) { @@ -348,6 +444,7 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, rc = -EINVAL; } spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock(&session->stream_rwlock); return rc; } @@ -356,14 +453,23 @@ long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id, { struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; + struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; unsigned long flags; long rc = -EINVAL; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) return rc; + read_lock(&session->stream_rwlock); + + stream = msm_get_stream(session, stream_id); + if (IS_ERR_OR_NULL(stream)) { + read_unlock(&session->stream_rwlock); + return -EINVAL; + } + spin_lock_irqsave(&stream->stream_lock, flags); if (!stream->vb2_q) { @@ -388,6 +494,7 @@ long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id, end: spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock(&session->stream_rwlock); return rc; } EXPORT_SYMBOL(msm_vb2_return_buf_by_idx); @@ -398,10 +505,20 @@ static int msm_vb2_flush_buf(int session_id, unsigned int stream_id) struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; + struct msm_session *session; + + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) + return -EINVAL; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + read_lock(&session->stream_rwlock); + + stream = msm_get_stream(session, stream_id); + if (IS_ERR_OR_NULL(stream)) { + read_unlock(&session->stream_rwlock); return -EINVAL; + } + spin_lock_irqsave(&stream->stream_lock, flags); list_for_each_entry(msm_vb2, &(stream->queued_list), list) { vb2_buf = &(msm_vb2->vb2_buf); @@ -410,6 +527,7 @@ static int msm_vb2_flush_buf(int session_id, unsigned int stream_id) msm_vb2->in_freeq = 0; } spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock(&session->stream_rwlock); return 0; } diff --git a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.h b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.h index 066206c62f5f3..1da89e057b844 100644 --- a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.h +++ b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -67,5 +67,6 @@ struct vb2_mem_ops *msm_vb2_get_q_mem_ops(void); int msm_vb2_request_cb(struct msm_sd_req_vb2_q *req_sd); long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id, uint32_t index); +int msm_vb2_get_stream_state(struct msm_stream *stream); #endif /*_MSM_VB_H */ From c8118756d4fc7512b1d180ef776593dd84e4014c Mon Sep 17 00:00:00 2001 From: Harsh Sahu Date: Wed, 24 May 2017 13:37:28 -0700 Subject: [PATCH 0884/1015] msm : mdss: fix unaligned access problem debug offset comes from the user and can hold any value which can cause unaligned access. This change fixes the unaligned access problem on debug offset by properly aligning it. Change-Id: Ic61c2651986ea6c98cc7d58e27af3e5fe6e42a88 Signed-off-by: Harsh Sahu --- drivers/video/msm/mdss/mdss_debug.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_debug.c b/drivers/video/msm/mdss/mdss_debug.c index 0a13956078bb4..2756c0dd6f271 100644 --- a/drivers/video/msm/mdss/mdss_debug.c +++ b/drivers/video/msm/mdss/mdss_debug.c @@ -416,6 +416,9 @@ static ssize_t mdss_debug_base_offset_write(struct file *file, buf[count] = 0; /* end of string */ + if (off % sizeof(u32)) + return -EINVAL; + sscanf(buf, "%5x %x", &off, &cnt); if (off > dbg->max_offset) @@ -490,6 +493,9 @@ static ssize_t mdss_debug_base_reg_write(struct file *file, if (cnt < 2) return -EFAULT; + if (off % sizeof(u32)) + return -EFAULT; + if (off >= dbg->max_offset) return -EFAULT; @@ -535,6 +541,9 @@ static ssize_t mdss_debug_base_reg_read(struct file *file, return -ENOMEM; } + if (dbg->off % sizeof(u32)) + return -EFAULT; + ptr = dbg->base + dbg->off; tot = 0; From 70a827b013efc5758344f7a6017be5ed8ccc9765 Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Mon, 12 Jun 2017 10:50:12 -0700 Subject: [PATCH 0885/1015] msm: ipa: fix ipacm_client usage Fix the access to ipacm_client array. Change-Id: I0e6c026a4f6eb0bc21f4e07cb301e21f78103f33 CRs-Fixed: 2024177 Acked-by: Ady Abraham Signed-off-by: Skylar Chang --- drivers/platform/msm/ipa/ipa_v2/ipa_utils.c | 5 +++++ drivers/platform/msm/ipa/ipa_v3/ipa_utils.c | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c index 7cdb314f2196b..6e6af15be0399 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c @@ -969,6 +969,11 @@ enum ipacm_client_enum ipa2_get_client(int pipe_idx) */ bool ipa2_get_client_uplink(int pipe_idx) { + if (pipe_idx < 0 || pipe_idx >= IPA_MAX_NUM_PIPES) { + IPAERR("invalid pipe idx %d\n", pipe_idx); + return false; + } + return ipa_ctx->ipacm_client[pipe_idx].uplink; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 632d9c1988e28..5768bdec980d5 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -1006,6 +1006,11 @@ enum ipacm_client_enum ipa3_get_client(int pipe_idx) */ bool ipa3_get_client_uplink(int pipe_idx) { + if (pipe_idx < 0 || pipe_idx >= IPA3_MAX_NUM_PIPES) { + IPAERR("invalid pipe idx %d\n", pipe_idx); + return false; + } + return ipa3_ctx->ipacm_client[pipe_idx].uplink; } From 89e6c2d38405cdeefaa278cbf6d18791f255ee5e Mon Sep 17 00:00:00 2001 From: Ashish Garg Date: Mon, 5 Jun 2017 17:36:46 +0530 Subject: [PATCH 0886/1015] msm: mdss: validate page id before reading from edid buffer Provide complete resolution details in a sysfs node "res_info" limited to PAGE_SIZE. Different modules can query for multiple resolution details based on the resolution ids received from EDID of the TV. In case resolution details exceed PAGE_SIZE, reuse res_info to get remaining timing details by provide page details. Check page id is within the max supported resolution ids to avoid reading extra memory than required. Change-Id: I7cdd071ba462080fe5bb302d0da824ed95b50f15 Signed-off-by: Ashish Garg --- drivers/video/msm/mdss/mdss_hdmi_edid.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_hdmi_edid.c b/drivers/video/msm/mdss/mdss_hdmi_edid.c index 36c24302658d8..1e9d97dbeb6b9 100644 --- a/drivers/video/msm/mdss/mdss_hdmi_edid.c +++ b/drivers/video/msm/mdss/mdss_hdmi_edid.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -460,8 +460,10 @@ static ssize_t hdmi_edid_sysfs_wta_res_info(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int rc, page_id; + u32 i = 0, j, page; ssize_t ret = strnlen(buf, PAGE_SIZE); struct hdmi_edid_ctrl *edid_ctrl = hdmi_edid_get_ctrl(dev); + struct msm_hdmi_mode_timing_info info = {0}; if (!edid_ctrl) { DEV_ERR("%s: invalid input\n", __func__); @@ -474,7 +476,22 @@ static ssize_t hdmi_edid_sysfs_wta_res_info(struct device *dev, return rc; } - edid_ctrl->page_id = page_id; + if (page_id > MSM_HDMI_INIT_RES_PAGE) { + page = MSM_HDMI_INIT_RES_PAGE; + while (page < page_id) { + j = 1; + while (sizeof(info) * j < PAGE_SIZE) { + i++; + j++; + } + page++; + } + } + + if (i < HDMI_VFRMT_MAX) + edid_ctrl->page_id = page_id; + else + DEV_ERR("%s: invalid page id\n", __func__); DEV_DBG("%s: %d\n", __func__, edid_ctrl->page_id); return ret; From 5adc0b6878d2db8b73787a462f810940279922c6 Mon Sep 17 00:00:00 2001 From: Siena Richard Date: Fri, 19 May 2017 15:38:10 -0700 Subject: [PATCH 0887/1015] ASoC: msm: qdsp6v2: extend validation of virtual address Validate a buffer virtual address is fully within the region for an extended edge case. CRs-Fixed: 2049911 Signed-off-by: Siena Richard Change-Id: I4c56fdd42336d00a2294a8b7cc17c74606e56be2 --- drivers/misc/qcom/qdsp6v2/audio_utils_aio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c index 1f22ce11b1a1e..0a8b1245a50b2 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c @@ -151,7 +151,8 @@ static int audio_aio_ion_lookup_vaddr(struct q6audio_aio *audio, void *addr, list) { if (addr >= region_elt->vaddr && addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) + addr + len <= region_elt->vaddr + region_elt->len && + addr + len > addr) pr_err("\t%s[%pK]:%pK, %ld --> %pK\n", __func__, audio, region_elt->vaddr, From b5b3abd519a35e49c0b282b48b5e5e2183e99fc6 Mon Sep 17 00:00:00 2001 From: Krishna Manikandan Date: Fri, 14 Apr 2017 14:27:41 +0530 Subject: [PATCH 0888/1015] msm: mdss: Ensure mdp splash cleanup before initiating rotation request If rotation request comes when MDP is operating on physical address then fail the request such that composition can fall back onto GPU. Allow HW rotation when MDP switches to Virtual address access. Change-Id: Id8762a011ab3d991527a87cb70cd48877820792f Signed-off-by: Krishna Manikandan --- drivers/video/msm/mdss/mdss_rotator.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_rotator.c b/drivers/video/msm/mdss/mdss_rotator.c index fd38196e1caca..3a3e51299c968 100644 --- a/drivers/video/msm/mdss/mdss_rotator.c +++ b/drivers/video/msm/mdss/mdss_rotator.c @@ -2179,6 +2179,12 @@ static int mdss_rotator_handle_request(struct mdss_rot_mgr *mgr, struct mdss_rot_entry_container *req = NULL; int size, ret; uint32_t req_count; + struct mdss_data_type *mdata = mdss_mdp_get_mdata(); + + if (mdata->handoff_pending) { + pr_err("Rotator request failed. Handoff pending\n"); + return -EPERM; + } if (mdss_get_sd_client_cnt()) { pr_err("rot request not permitted during secure display session\n"); From 583be4ae2d76d06c3b10a979d57e885ffff20e2e Mon Sep 17 00:00:00 2001 From: Yeleswarapu Nagaradhesh Date: Fri, 6 Jan 2017 18:57:07 +0530 Subject: [PATCH 0889/1015] ASoC: wcd-mbhc: disable electrical interrupts when cable type is NONE Electrical interrupts are not disabled when cable type is NONE, due to which SW is getting spurious interrupts when cable is removed. Disable electrical interrupts if cable type is NONE. CRs-Fixed: 1072485 Change-Id: I5eb77eba3999aff929b659b783f3ed0776530479 Signed-off-by: Yeleswarapu Nagaradhesh --- sound/soc/codecs/wcd-mbhc-v2.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/soc/codecs/wcd-mbhc-v2.c b/sound/soc/codecs/wcd-mbhc-v2.c index 9c1cb21c7f005..e24ee3b71b2aa 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.c +++ b/sound/soc/codecs/wcd-mbhc-v2.c @@ -1607,6 +1607,9 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) /* Disable HW FSM */ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); + wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); + wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, false); + } mbhc->in_swch_irq_handler = false; From 8c75fde3613bceeab55d3b7adaab47b81ea29177 Mon Sep 17 00:00:00 2001 From: Sureshnaidu Laveti Date: Thu, 15 Dec 2016 02:39:35 -0800 Subject: [PATCH 0890/1015] msm: sensor: validating the flash initialization parameters Copying the flash initialization parameters from userspace memory to kernel memory and in turn checking for the validity of the flash initialization parameters pointer sent from userspace. CRs-Fixed: 1091603 Change-Id: I17d57016c254fb6628844a152b0e7d45c0b23b2d Signed-off-by: Sureshnaidu Laveti --- .../msm/camera_v2/sensor/flash/msm_flash.c | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c index 3b278128b782e..7d2123f1779fc 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c +++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c @@ -501,6 +501,42 @@ static int32_t msm_flash_init( return 0; } +#ifdef CONFIG_COMPAT +static int32_t msm_flash_init_prepare( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ + return msm_flash_init(flash_ctrl, flash_data); +} +#else +static int32_t msm_flash_init_prepare( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ + struct msm_flash_cfg_data_t flash_data_k; + struct msm_flash_init_info_t flash_init_info; + int32_t i = 0; + + flash_data_k.cfg_type = flash_data->cfg_type; + for (i = 0; i < MAX_LED_TRIGGERS; i++) { + flash_data_k.flash_current[i] = + flash_data->flash_current[i]; + flash_data_k.flash_duration[i] = + flash_data->flash_duration[i]; + } + + flash_data_k.cfg.flash_init_info = &flash_init_info; + if (copy_from_user(&flash_init_info, + (void *)(flash_data->cfg.flash_init_info), + sizeof(struct msm_flash_init_info_t))) { + pr_err("%s copy_from_user failed %d\n", + __func__, __LINE__); + return -EFAULT; + } + return msm_flash_init(flash_ctrl, &flash_data_k); +} +#endif + static int32_t msm_flash_low( struct msm_flash_ctrl_t *flash_ctrl, struct msm_flash_cfg_data_t *flash_data) @@ -607,7 +643,7 @@ static int32_t msm_flash_config(struct msm_flash_ctrl_t *flash_ctrl, switch (flash_data->cfg_type) { case CFG_FLASH_INIT: - rc = msm_flash_init(flash_ctrl, flash_data); + rc = msm_flash_init_prepare(flash_ctrl, flash_data); break; case CFG_FLASH_RELEASE: if (flash_ctrl->flash_state == MSM_CAMERA_FLASH_INIT) From d260684d00c38969d792d5e5107c5c0033c3be4c Mon Sep 17 00:00:00 2001 From: Gaurav Kohli Date: Thu, 4 Aug 2016 17:40:15 +0530 Subject: [PATCH 0891/1015] soc: qcom: Initialize message pointer with NULL During service locator call there is a chance in which resp message is used or freed while uninitialized.So to prevent it initialize the same with NULL. Change-Id: I65f854e184606684ce2ca711f19cf61d26c1ecb5 Signed-off-by: Gaurav Kohli --- drivers/soc/qcom/service-locator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/soc/qcom/service-locator.c b/drivers/soc/qcom/service-locator.c index 72f988b1d84f0..d03621e27c8d3 100644 --- a/drivers/soc/qcom/service-locator.c +++ b/drivers/soc/qcom/service-locator.c @@ -202,8 +202,8 @@ static int servreg_loc_send_msg(struct msg_desc *req_desc, static int service_locator_send_msg(struct pd_qmi_client_data *pd) { struct msg_desc req_desc, resp_desc; - struct qmi_servreg_loc_get_domain_list_resp_msg_v01 *resp; - struct qmi_servreg_loc_get_domain_list_req_msg_v01 *req; + struct qmi_servreg_loc_get_domain_list_resp_msg_v01 *resp = NULL; + struct qmi_servreg_loc_get_domain_list_req_msg_v01 *req = NULL; int rc; int db_rev_count = 0, domains_read = 0; From 95d439a0ef0beecba99eb5532b8e829ef1ee1c89 Mon Sep 17 00:00:00 2001 From: Brahmaji K Date: Mon, 15 May 2017 16:02:15 +0530 Subject: [PATCH 0892/1015] qcdev: Check the digest length during the SHA operations Check the digest length to avoid buffer overflow while doing the SHA operations. Change-Id: I4d3fb20723f59e905a672edaf84ee5d0865905b1 Signed-off-by: Brahmaji K --- drivers/crypto/msm/qcedev.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index 2a539d80385de..df7cca7e295f3 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -1741,6 +1741,12 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) mutex_unlock(&hash_access_lock); return err; } + if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { + pr_err("Invalid sha_ctxt.diglen %d\n", + handle->sha_ctxt.diglen); + mutex_unlock(&hash_access_lock); + return -EINVAL; + } qcedev_areq.sha_op_req.diglen = handle->sha_ctxt.diglen; memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], @@ -1777,6 +1783,12 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) mutex_unlock(&hash_access_lock); return err; } + if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { + pr_err("Invalid sha_ctxt.diglen %d\n", + handle->sha_ctxt.diglen); + mutex_unlock(&hash_access_lock); + return -EINVAL; + } qcedev_areq.sha_op_req.diglen = handle->sha_ctxt.diglen; memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], From 7800bf5b3695a43f25e98dc20ca9f92f61cf88cc Mon Sep 17 00:00:00 2001 From: Tharun Kumar Merugu Date: Tue, 20 Jun 2017 17:04:42 +0530 Subject: [PATCH 0893/1015] msm: ADSPRPC: Null check for file session context during device release While releasing the device, check if the file session context is NULL to make sure we are not dereferencing during file free. Change-Id: I4ba08cf9a1d56a5e28e6230b9f2fe02a52b70cb0 Acked-by: Vishnu Karthik D Signed-off-by: Tharun Kumar Merugu --- drivers/char/adsprpc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index 72c9a7fdffcc5..28818b28a1a04 100644 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -1719,6 +1719,11 @@ static int fastrpc_file_free(struct fastrpc_file *fl) hlist_del_init(&fl->hn); spin_unlock(&fl->apps->hlock); + if (!fl->sctx) { + kfree(fl); + return 0; + } + (void)fastrpc_release_current_dsp_process(fl); fastrpc_context_list_dtor(fl); fastrpc_buf_list_free(fl); From 033997ce53ad42859510925b0a76341b4ff502d1 Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Mon, 9 Jan 2017 08:26:52 +0530 Subject: [PATCH 0894/1015] power: qpnp-smbcharger: Release wakeup source on USB removal If the DCP charger gets removed before the HVDCP detection work is executed the wakeup source is left enabled. Fix this by releasing the wakeup source unconditionally on USB removal. CRs-Fixed: 1064563 Change-Id: Iab7239d178d845dc357995d069ec4c4d9d341166 Signed-off-by: Anirudh Ghayal --- drivers/power/qpnp-smbcharger.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/power/qpnp-smbcharger.c b/drivers/power/qpnp-smbcharger.c index 51cc5b96cca5d..352c2e538aa2d 100644 --- a/drivers/power/qpnp-smbcharger.c +++ b/drivers/power/qpnp-smbcharger.c @@ -4737,6 +4737,7 @@ static void handle_usb_removal(struct smbchg_chip *chip) chip->typec_current_ma = 0; /* cancel/wait for hvdcp pending work if any */ cancel_delayed_work_sync(&chip->hvdcp_det_work); + smbchg_relax(chip, PM_DETECT_HVDCP); smbchg_change_usb_supply_type(chip, POWER_SUPPLY_TYPE_UNKNOWN); if (!chip->skip_usb_notification) { pr_smb(PR_MISC, "setting usb psy present = %d\n", From 12c21b07f34600e55372c29d01050574b2742253 Mon Sep 17 00:00:00 2001 From: Manish Poddar Date: Wed, 19 Apr 2017 15:04:13 +0530 Subject: [PATCH 0895/1015] msm: camera: Fix NULL pointer dereference in msm_vb2.c. Added check to avoid NULL pointer dereference in msm_vb2.c. Change-Id: I89e9d0416d625fee887a31e53a9ecd3268732fb6 Signed-off-by: Manish Poddar --- drivers/media/platform/msm/camera_v2/msm.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index 9f7fa5ad2f606..09fd13a023608 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -717,6 +717,9 @@ static long msm_private_ioctl(struct file *file, void *fh, return 0; } + if (!event_data) + return -EINVAL; + memset(&event, 0, sizeof(struct v4l2_event)); session_id = event_data->session_id; stream_id = event_data->stream_id; From 1ed113ac033f04384f11a6f49939b8b85112a170 Mon Sep 17 00:00:00 2001 From: Arumuga Durai A Date: Wed, 14 Jun 2017 13:18:26 +0530 Subject: [PATCH 0896/1015] usb: bam: Remove inactivity_timer sysfs attribute Sysfs attribute "inactivity_timer" not being used anymore so remove that entry from sysfs. CRs-Fixed: 2048725 Change-Id: I30d2d4a3cb9899b7975a6395eab90337fc006488 Signed-off-by: Arumuga Durai A --- drivers/platform/msm/usb_bam.c | 79 ---------------------------------- 1 file changed, 79 deletions(-) diff --git a/drivers/platform/msm/usb_bam.c b/drivers/platform/msm/usb_bam.c index 5641f451021b6..3f130c4cfb7ce 100644 --- a/drivers/platform/msm/usb_bam.c +++ b/drivers/platform/msm/usb_bam.c @@ -3117,79 +3117,6 @@ static int enable_usb_bam(struct platform_device *pdev) return 0; } -static ssize_t -usb_bam_show_inactivity_timer(struct device *dev, struct device_attribute *attr, - char *buf) -{ - char *buff = buf; - int i; - - for (i = 0; i < ARRAY_SIZE(bam_enable_strings); i++) { - buff += snprintf(buff, PAGE_SIZE, "%s: %dms\n", - bam_enable_strings[i], - msm_usb_bam[i].inactivity_timer_ms); - } - - return buff - buf; -} - -static ssize_t usb_bam_store_inactivity_timer(struct device *dev, - struct device_attribute *attr, - const char *buff, size_t count) -{ - char buf[USB_BAM_MAX_STR_LEN]; - char *trimmed_buf, *bam_str, *bam_name, *timer; - int timer_d; - int bam; - - if (strnstr(buff, "help", USB_BAM_MAX_STR_LEN)) { - pr_info("Usage: , ,...\n"); - pr_info("\tbam_name: [%s, %s, %s]\n", - bam_enable_strings[DWC3_CTRL], - bam_enable_strings[CI_CTRL], - bam_enable_strings[HSIC_CTRL]); - pr_info("\tms: time in ms. Use 0 to disable timer\n"); - return count; - } - - strlcpy(buf, buff, sizeof(buf)); - trimmed_buf = strim(buf); - - while (trimmed_buf) { - bam_str = strsep(&trimmed_buf, ","); - if (bam_str) { - bam_name = strsep(&bam_str, " "); - bam = get_bam_type_from_core_name(bam_name); - if (bam < 0 || bam >= MAX_BAMS) { - log_event_err("%s: Invalid bam, type=%d ,name=%s\n", - __func__, bam, bam_name); - return -EINVAL; - } - - timer = strsep(&bam_str, " "); - - if (!timer) - continue; - - sscanf(timer, "%d", &timer_d); - - /* Apply new timer setting if bam has running pipes */ - if (msm_usb_bam[bam].inactivity_timer_ms != timer_d) { - msm_usb_bam[bam].inactivity_timer_ms = timer_d; - if (msm_usb_bam[bam].pipes_enabled_per_bam > 0 - && !info[bam].in_lpm) - usb_bam_set_inactivity_timer(bam); - } - } - } - - return count; -} - -static DEVICE_ATTR(inactivity_timer, S_IWUSR | S_IRUSR, - usb_bam_show_inactivity_timer, - usb_bam_store_inactivity_timer); - static int usb_bam_panic_notifier(struct notifier_block *this, unsigned long event, void *ptr) { @@ -3238,12 +3165,6 @@ static int usb_bam_probe(struct platform_device *pdev) dev_dbg(&pdev->dev, "usb_bam_probe\n"); - ret = device_create_file(&pdev->dev, &dev_attr_inactivity_timer); - if (ret) { - dev_err(&pdev->dev, "failed to create fs node\n"); - return ret; - } - io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!io_res) { dev_err(&pdev->dev, "missing BAM memory resource\n"); From 0c8c475b0a02501a7d0903a26bbed6301aec965f Mon Sep 17 00:00:00 2001 From: Andrew Chant Date: Fri, 7 Apr 2017 11:20:39 -0700 Subject: [PATCH 0897/1015] input: touchscreen: validate bounds of intr_reg_num Validate the intr_reg_num value returned by touchscreen to ensure no out of bounds access can occur. Bug: 35472278 Signed-off-by: Andrew Chant Change-Id: Ib2b5a53034fd1306d29a74ff0f2f698f149fc8c3 Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 70e632224737d448b1b4083af7d6b8fcee02b192 Signed-off-by: Dennis Cagle Signed-off-by: Shantanu Jain --- .../input/touchscreen/synaptics_i2c_rmi4.c | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_i2c_rmi4.c b/drivers/input/touchscreen/synaptics_i2c_rmi4.c index bb474701c80cb..432b70f9e4314 100644 --- a/drivers/input/touchscreen/synaptics_i2c_rmi4.c +++ b/drivers/input/touchscreen/synaptics_i2c_rmi4.c @@ -2085,6 +2085,12 @@ static int synaptics_rmi4_f11_init(struct synaptics_rmi4_data *rmi4_data, rmi4_data->max_touch_width = MAX_F11_TOUCH_WIDTH; fhandler->intr_reg_num = (intr_count + 7) / 8; + if (fhandler->intr_reg_num >= MAX_INTR_REGISTERS) { + fhandler->intr_reg_num = 0; + fhandler->num_of_data_sources = 0; + fhandler->intr_mask = 0; + return -EINVAL; + } if (fhandler->intr_reg_num != 0) fhandler->intr_reg_num -= 1; @@ -2356,6 +2362,13 @@ static int synaptics_rmi4_f12_init(struct synaptics_rmi4_data *rmi4_data, rmi4_data->num_of_tx); fhandler->intr_reg_num = (intr_count + 7) / 8; + if (fhandler->intr_reg_num >= MAX_INTR_REGISTERS) { + fhandler->intr_reg_num = 0; + fhandler->num_of_data_sources = 0; + fhandler->intr_mask = 0; + retval = -EINVAL; + goto free_function_handler_mem; + } if (fhandler->intr_reg_num != 0) fhandler->intr_reg_num -= 1; @@ -2485,6 +2498,13 @@ static int synaptics_rmi4_f1a_init(struct synaptics_rmi4_data *rmi4_data, fhandler->num_of_data_sources = fd->intr_src_count; fhandler->intr_reg_num = (intr_count + 7) / 8; + if (fhandler->intr_reg_num >= MAX_INTR_REGISTERS) { + fhandler->intr_reg_num = 0; + fhandler->num_of_data_sources = 0; + fhandler->intr_mask = 0; + retval = -EINVAL; + goto error_exit; + } if (fhandler->intr_reg_num != 0) fhandler->intr_reg_num -= 1; @@ -2835,7 +2855,8 @@ static int synaptics_rmi4_query_device(struct synaptics_rmi4_data *rmi4_data) dev_dbg(&rmi4_data->i2c_client->dev, "%s: Number of interrupt registers = %d\n", __func__, rmi4_data->num_of_intr_regs); - + if (rmi4_data->num_of_intr_regs >= MAX_INTR_REGISTERS) + return -EINVAL; memset(rmi4_data->intr_mask, 0x00, sizeof(rmi4_data->intr_mask)); /* @@ -3712,6 +3733,7 @@ static int synaptics_rmi4_probe(struct i2c_client *client, input_unregister_device(rmi4_data->input_dev); err_register_input: +err_free_gpios: mutex_lock(&rmi->support_fn_list_mutex); if (!list_empty(&rmi->support_fn_list)) { list_for_each_entry_safe(fhandler, next_fhandler, @@ -3719,14 +3741,15 @@ static int synaptics_rmi4_probe(struct i2c_client *client, if (fhandler->fn_number == SYNAPTICS_RMI4_F1A) synaptics_rmi4_f1a_kfree(fhandler); else { - kfree(fhandler->data); - kfree(fhandler->extra); + if (fhandler->data != NULL) + kfree(fhandler->data); + if (fhandler->extra != NULL) + kfree(fhandler->extra); } kfree(fhandler); } } mutex_unlock(&rmi->support_fn_list_mutex); -err_free_gpios: if (gpio_is_valid(rmi4_data->board->reset_gpio)) gpio_free(rmi4_data->board->reset_gpio); if (gpio_is_valid(rmi4_data->board->irq_gpio)) From b874853885e036c87e3b0465d63cb03baf9986ed Mon Sep 17 00:00:00 2001 From: Aditya Bavanari Date: Mon, 17 Apr 2017 19:57:59 +0530 Subject: [PATCH 0898/1015] ASoC: msm: Fix kernel crash in "Speaker Function" mixer control Use snd_soc_kcontrol_codec instead of snd_kcontrol_chip to obtain the codec information from the kcontrol. CRs-Fixed: 2034533 Change-Id: I8b5424400ce668756ac23cbcbd6e1cec79b6255c Signed-off-by: Aditya Bavanari --- sound/soc/msm/apq8084.c | 4 ++-- sound/soc/msm/mdm9607.c | 2 +- sound/soc/msm/mdm9640.c | 4 ++-- sound/soc/msm/mdmcalifornium.c | 2 +- sound/soc/msm/msm8952-slimbus.c | 2 +- sound/soc/msm/msm8994.c | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/sound/soc/msm/apq8084.c b/sound/soc/msm/apq8084.c index 1501ba7006bb5..948e5586e5f23 100644 --- a/sound/soc/msm/apq8084.c +++ b/sound/soc/msm/apq8084.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -622,7 +622,7 @@ static int apq8084_get_spk(struct snd_kcontrol *kcontrol, static int apq8084_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); if (apq8084_spk_control == ucontrol->value.integer.value[0]) diff --git a/sound/soc/msm/mdm9607.c b/sound/soc/msm/mdm9607.c index 16142a9d252da..effef4d755647 100644 --- a/sound/soc/msm/mdm9607.c +++ b/sound/soc/msm/mdm9607.c @@ -774,7 +774,7 @@ static void mdm_ext_control(struct snd_soc_codec *codec) static int mdm_mi2s_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); diff --git a/sound/soc/msm/mdm9640.c b/sound/soc/msm/mdm9640.c index 172addd36037d..9ba745e0aed21 100644 --- a/sound/soc/msm/mdm9640.c +++ b/sound/soc/msm/mdm9640.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -732,7 +732,7 @@ static void mdm_ext_control(struct snd_soc_codec *codec) static int mdm_mi2s_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); diff --git a/sound/soc/msm/mdmcalifornium.c b/sound/soc/msm/mdmcalifornium.c index 1b150a83759a3..783c21e40c0be 100644 --- a/sound/soc/msm/mdmcalifornium.c +++ b/sound/soc/msm/mdmcalifornium.c @@ -817,7 +817,7 @@ static void mdm_ext_control(struct snd_soc_codec *codec) static int mdm_mi2s_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); diff --git a/sound/soc/msm/msm8952-slimbus.c b/sound/soc/msm/msm8952-slimbus.c index ade7046ad8f17..5adca82f7744e 100644 --- a/sound/soc/msm/msm8952-slimbus.c +++ b/sound/soc/msm/msm8952-slimbus.c @@ -408,7 +408,7 @@ static int msm8952_get_spk(struct snd_kcontrol *kcontrol, static int msm8952_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); if (msm8952_spk_control == ucontrol->value.integer.value[0]) diff --git a/sound/soc/msm/msm8994.c b/sound/soc/msm/msm8994.c index 83edad44e4003..9f803ab09625c 100644 --- a/sound/soc/msm/msm8994.c +++ b/sound/soc/msm/msm8994.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -546,7 +546,7 @@ static int msm8994_get_spk(struct snd_kcontrol *kcontrol, static int msm8994_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); if (msm8994_spk_control == ucontrol->value.integer.value[0]) From cfa089ad88089d541e927a4c1f980c4d6142bb97 Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Thu, 6 Apr 2017 11:14:25 +0530 Subject: [PATCH 0899/1015] mmc: core: Remove unused variable Removed a local variable in mmc_start_req() which was used to store the error encountered while starting a new data request. If an error is encountered while starting a new request, the error information is stored in the mrq. The error information stored in the mrq is during error handling. So removing the unused variable. Change-Id: Ifeedc91433230d5156d286bd332a85fb221188ac Signed-off-by: Vijay Viswanath --- drivers/mmc/core/core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 9b69cfe4b7942..89314dc451dec 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1583,7 +1583,6 @@ struct mmc_async_req *mmc_start_req(struct mmc_host *host, struct mmc_async_req *areq, int *error) { int err = 0; - int start_err = 0; struct mmc_async_req *data = host->areq; /* Prepare a new request */ @@ -1615,7 +1614,7 @@ struct mmc_async_req *mmc_start_req(struct mmc_host *host, trace_mmc_blk_rw_start(areq->mrq->cmd->opcode, areq->mrq->cmd->arg, areq->mrq->data); - start_err = __mmc_start_data_req(host, areq->mrq); + __mmc_start_data_req(host, areq->mrq); } if (host->areq) From 7c10f03dd6dd679765a02fd665cc90916133de24 Mon Sep 17 00:00:00 2001 From: Krishna Manikandan Date: Wed, 28 Jun 2017 13:53:04 +0530 Subject: [PATCH 0900/1015] fbdev: msm: Allocate fd with O_CLOEXEC flag When fd is requested during get_metadata call, create fd using O_CLOEXEC flag. CRs-Fixed: 2030638 Change-Id: I1c874f713a3ebada63ba2c85f021aa78b04af44b Signed-off-by: Krishna Manikandan --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index 12bc1b4f95a9f..06984ad195eab 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -4391,9 +4391,10 @@ static int mdss_fb_get_metadata(struct msm_fb_data_type *mfd, ret = mdss_fb_get_hw_caps(mfd, &metadata->data.caps); break; case metadata_op_get_ion_fd: - if (mfd->fb_ion_handle) { + if (mfd->fb_ion_handle && mfd->fb_ion_client) { metadata->data.fbmem_ionfd = - dma_buf_fd(mfd->fbmem_buf, 0); + ion_share_dma_buf_fd(mfd->fb_ion_client, + mfd->fb_ion_handle); if (metadata->data.fbmem_ionfd < 0) pr_err("fd allocation failed. fd = %d\n", metadata->data.fbmem_ionfd); From 20958e19ce194ea2ececaf5d70b4d971098b81b3 Mon Sep 17 00:00:00 2001 From: mohamed sunfeer Date: Wed, 21 Jun 2017 15:21:58 +0530 Subject: [PATCH 0901/1015] compat_qcedev: Fix accessing userspace memory in kernel space Use put_user API to write the data to userspace from kernel space to avoid accessing userspace memory directly in kernel space. Change-Id: I4dd73872ab8c374793268cef2b9a2dfccf3454c9 Signed-off-by: mohamed sunfeer --- drivers/crypto/msm/compat_qcedev.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/drivers/crypto/msm/compat_qcedev.c b/drivers/crypto/msm/compat_qcedev.c index c69dc2b86a682..90e5fa804e471 100644 --- a/drivers/crypto/msm/compat_qcedev.c +++ b/drivers/crypto/msm/compat_qcedev.c @@ -1,7 +1,7 @@ /* * QTI CE 32-bit compatibility syscall for 64-bit systems * - * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -97,7 +97,6 @@ static int compat_get_qcedev_vbuf_info( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, &vbuf32->src[i].vaddr); - vbuf->src[i].vaddr = NULL; err |= put_user(vaddr, (compat_uptr_t *)&vbuf->src[i].vaddr); err |= get_user(len, &vbuf32->src[i].len); err |= put_user(len, &vbuf->src[i].len); @@ -105,7 +104,6 @@ static int compat_get_qcedev_vbuf_info( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, &vbuf32->dst[i].vaddr); - vbuf->dst[i].vaddr = NULL; err |= put_user(vaddr, (compat_uptr_t *)&vbuf->dst[i].vaddr); err |= get_user(len, &vbuf32->dst[i].len); err |= put_user(len, &vbuf->dst[i].len); @@ -123,7 +121,6 @@ static int compat_put_qcedev_vbuf_info( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, (compat_uptr_t *)&vbuf->src[i].vaddr); - vbuf32->src[i].vaddr = 0; err |= put_user(vaddr, &vbuf32->src[i].vaddr); err |= get_user(len, &vbuf->src[i].len); err |= put_user(len, &vbuf32->src[i].len); @@ -131,7 +128,6 @@ static int compat_put_qcedev_vbuf_info( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, (compat_uptr_t *)&vbuf->dst[i].vaddr); - vbuf32->dst[i].vaddr = 0; err |= put_user(vaddr, &vbuf32->dst[i].vaddr); err |= get_user(len, &vbuf->dst[i].len); err |= put_user(len, &vbuf32->dst[i].len); @@ -276,7 +272,6 @@ static int compat_get_qcedev_sha_op_req( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, &data32->data[i].vaddr); - data->data[i].vaddr = 0; err |= put_user(vaddr, (compat_uptr_t *)&data->data[i].vaddr); err |= get_user(len, &data32->data[i].len); err |= put_user(len, &data->data[i].len); @@ -295,7 +290,6 @@ static int compat_get_qcedev_sha_op_req( err |= get_user(diglen, &data32->diglen); err |= put_user(diglen, &data->diglen); err |= get_user(authkey, &data32->authkey); - data->authkey = NULL; err |= put_user(authkey, (compat_uptr_t *)&data->authkey); err |= get_user(authklen, &data32->authklen); err |= put_user(authklen, &data->authklen); @@ -322,7 +316,6 @@ static int compat_put_qcedev_sha_op_req( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, (compat_uptr_t *)&data->data[i].vaddr); - data32->data[i].vaddr = 0; err |= put_user(vaddr, &data32->data[i].vaddr); err |= get_user(len, &data->data[i].len); err |= put_user(len, &data32->data[i].len); @@ -341,7 +334,6 @@ static int compat_put_qcedev_sha_op_req( err |= get_user(diglen, &data->diglen); err |= put_user(diglen, &data32->diglen); err |= get_user(authkey, (compat_uptr_t *)&data->authkey); - data32->authkey = 0; err |= put_user(authkey, &data32->authkey); err |= get_user(authklen, &data->authklen); err |= put_user(authklen, &data32->authklen); From 8f881068b952c8546bad428953aa1685d269c113 Mon Sep 17 00:00:00 2001 From: Andrew Chant Date: Fri, 7 Apr 2017 10:58:26 -0700 Subject: [PATCH 0902/1015] input: synaptics_dsx: validate bounds of intr_reg_num Validate the intr_reg_num value returned by touchscreen to ensure no out of bounds access can occur. Bug: 35472278 Change-Id: I22f5b67815fe7d448b5ed847e4e3d65af63bed84 Signed-off-by: Andrew Chant Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 271baca849983ef309e82a4e5953027790f36154 Signed-off-by: Dennis Cagle Signed-off-by: Shantanu Jain --- .../synaptics_dsx/synaptics_dsx_core.c | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c index f7d0defafcdb5..06394c6b7a97a 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c @@ -1503,7 +1503,7 @@ static int synaptics_rmi4_irq_enable(struct synaptics_rmi4_data *rmi4_data, return retval; } -static void synaptics_rmi4_set_intr_mask(struct synaptics_rmi4_fn *fhandler, +static int synaptics_rmi4_set_intr_mask(struct synaptics_rmi4_fn *fhandler, struct synaptics_rmi4_fn_desc *fd, unsigned int intr_count) { @@ -1511,6 +1511,12 @@ static void synaptics_rmi4_set_intr_mask(struct synaptics_rmi4_fn *fhandler, unsigned char intr_offset; fhandler->intr_reg_num = (intr_count + 7) / 8; + if (fhandler->intr_reg_num >= MAX_INTR_REGISTERS) { + fhandler->intr_reg_num = 0; + fhandler->num_of_data_sources = 0; + fhandler->intr_mask = 0; + return -EINVAL; + } if (fhandler->intr_reg_num != 0) fhandler->intr_reg_num -= 1; @@ -1523,7 +1529,7 @@ static void synaptics_rmi4_set_intr_mask(struct synaptics_rmi4_fn *fhandler, ii++) fhandler->intr_mask |= 1 << ii; - return; + return 0; } static int synaptics_rmi4_f01_init(struct synaptics_rmi4_data *rmi4_data, @@ -1531,12 +1537,17 @@ static int synaptics_rmi4_f01_init(struct synaptics_rmi4_data *rmi4_data, struct synaptics_rmi4_fn_desc *fd, unsigned int intr_count) { + int retval; + fhandler->fn_number = fd->fn_number; fhandler->num_of_data_sources = fd->intr_src_count; fhandler->data = NULL; fhandler->extra = NULL; - synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + retval = synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + if (retval < 0) + return retval; + rmi4_data->f01_query_base_addr = fd->query_base_addr; rmi4_data->f01_ctrl_base_addr = fd->ctrl_base_addr; @@ -1661,7 +1672,9 @@ static int synaptics_rmi4_f11_init(struct synaptics_rmi4_data *rmi4_data, if (retval < 0) return retval; - synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + retval = synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + if (retval < 0) + return retval; abs_data_size = query[5] & MASK_2BIT; abs_data_blk_size = 3 + (2 * (abs_data_size == 0 ? 1 : 0)); @@ -1942,7 +1955,9 @@ static int synaptics_rmi4_f12_init(struct synaptics_rmi4_data *rmi4_data, if (retval < 0) goto free_function_handler_mem; - synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + retval = synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + if (retval < 0) + return retval; /* Allocate memory for finger data storage space */ fhandler->data_size = num_of_fingers * size_of_2d_data; @@ -2100,7 +2115,9 @@ static int synaptics_rmi4_f1a_init(struct synaptics_rmi4_data *rmi4_data, fhandler->fn_number = fd->fn_number; fhandler->num_of_data_sources = fd->intr_src_count; - synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + retval = synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + if (retval < 0) + return retval; retval = synaptics_rmi4_f1a_alloc_mem(rmi4_data, fhandler); if (retval < 0) @@ -2499,6 +2516,8 @@ static int synaptics_rmi4_query_device(struct synaptics_rmi4_data *rmi4_data) dev_dbg(rmi4_data->pdev->dev.parent, "%s: Number of interrupt registers = %d\n", __func__, rmi4_data->num_of_intr_regs); + if (rmi4_data->num_of_intr_regs >= MAX_INTR_REGISTERS) + return -EINVAL; retval = synaptics_rmi4_reg_read(rmi4_data, rmi4_data->f01_query_base_addr, From c65dfb535162135b931f70950ddb620b17999b39 Mon Sep 17 00:00:00 2001 From: Liangliang Lu Date: Wed, 5 Jul 2017 16:57:29 +0800 Subject: [PATCH 0903/1015] trace: ipc_logging: Avoid buffer overflow in ipc_log_string() In ipc_log_string() the return value from vsnprintf(), data_size, is used to increment ectxt.offset. However, this length could actually be much larger than that of ectxt.buff itself. This is a typical mistake of [v]snprintf() usage [1], in that it returns not the number of characters written but how many characters *would* have been written regardless of whether it was truncated. The result is that even though ectxt.buff itself is not overrun, the incorrect size in ectxt.offset will be later used as the length parameter when memcpy()'ing to the ipc_log_page's data, overflowing that memory and beyond. The write_page's write_offset would also indicate an out-of-bounds (greater than PAGE_SIZE) length. The fix is simple: use vscnprintf() instead of vsnprintf(). [1] https://lwn.net/Articles/69419/ Change-Id: I2e9d44e74f5f30a009732e31a554d82e31946999 Signed-off-by: Jack Pham Signed-off-by: Liangliang Lu --- kernel/trace/ipc_logging.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel/trace/ipc_logging.c b/kernel/trace/ipc_logging.c index 6c5b402c510e0..c31bd90ad9f5e 100644 --- a/kernel/trace/ipc_logging.c +++ b/kernel/trace/ipc_logging.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2015,2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -507,8 +507,8 @@ int ipc_log_string(void *ilctxt, const char *fmt, ...) tsv_qtimer_write(&ectxt); avail_size = (MAX_MSG_SIZE - (ectxt.offset + hdr_size)); va_start(arg_list, fmt); - data_size = vsnprintf((ectxt.buff + ectxt.offset + hdr_size), - avail_size, fmt, arg_list); + data_size = vscnprintf((ectxt.buff + ectxt.offset + hdr_size), + avail_size, fmt, arg_list); va_end(arg_list); tsv_write_header(&ectxt, TSV_TYPE_BYTE_ARRAY, data_size); ectxt.offset += data_size; From 08b79364a455c41679f919ab7b2505a5900501ff Mon Sep 17 00:00:00 2001 From: Ashay Jaiswal Date: Fri, 23 Jun 2017 14:46:49 +0530 Subject: [PATCH 0904/1015] qpnp-fg: fix integer overflow There is a possibility of integer overflow during capacity learning calculation. Fix this by storing intermediate results in 64 bit variable. CRs-Fixed: 2070510 Change-Id: I70b6ef0796be010129f8d8a7380f685bb76daf7d Signed-off-by: Ashay Jaiswal --- drivers/power/qpnp-fg.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/drivers/power/qpnp-fg.c b/drivers/power/qpnp-fg.c index d50cf2c1e36f8..fed684301f836 100644 --- a/drivers/power/qpnp-fg.c +++ b/drivers/power/qpnp-fg.c @@ -3479,6 +3479,7 @@ static int fg_cap_learning_process_full_data(struct fg_chip *chip) int cc_pc_val, rc = -EINVAL; unsigned int cc_soc_delta_pc; int64_t delta_cc_uah; + uint64_t temp; bool batt_missing = is_battery_missing(chip); if (batt_missing) { @@ -3501,9 +3502,8 @@ static int fg_cap_learning_process_full_data(struct fg_chip *chip) goto fail; } - cc_soc_delta_pc = DIV_ROUND_CLOSEST( - abs(cc_pc_val - chip->learning_data.init_cc_pc_val) - * 100, FULL_PERCENT_28BIT); + temp = abs(cc_pc_val - chip->learning_data.init_cc_pc_val); + cc_soc_delta_pc = DIV_ROUND_CLOSEST_ULL(temp * 100, FULL_PERCENT_28BIT); delta_cc_uah = div64_s64( chip->learning_data.learned_cc_uah * cc_soc_delta_pc, @@ -3511,8 +3511,11 @@ static int fg_cap_learning_process_full_data(struct fg_chip *chip) chip->learning_data.cc_uah = delta_cc_uah + chip->learning_data.cc_uah; if (fg_debug_mask & FG_AGING) - pr_info("current cc_soc=%d cc_soc_pc=%d total_cc_uah = %lld\n", + pr_info("current cc_soc=%d cc_soc_pc=%d init_cc_pc_val=%d delta_cc_uah=%lld learned_cc_uah=%lld total_cc_uah = %lld\n", cc_pc_val, cc_soc_delta_pc, + chip->learning_data.init_cc_pc_val, + delta_cc_uah, + chip->learning_data.learned_cc_uah, chip->learning_data.cc_uah); return 0; @@ -4035,10 +4038,10 @@ static void status_change_work(struct work_struct *work) } if ((chip->wa_flag & USE_CC_SOC_REG) && chip->bad_batt_detection_en && chip->safety_timer_expired) { - chip->sw_cc_soc_data.delta_soc = - DIV_ROUND_CLOSEST(abs(cc_soc - - chip->sw_cc_soc_data.init_cc_soc) - * 100, FULL_PERCENT_28BIT); + uint64_t delta_cc_soc = abs(cc_soc - + chip->sw_cc_soc_data.init_cc_soc); + chip->sw_cc_soc_data.delta_soc = DIV_ROUND_CLOSEST_ULL( + delta_cc_soc * 100, FULL_PERCENT_28BIT); chip->sw_cc_soc_data.full_capacity = chip->sw_cc_soc_data.delta_soc + chip->sw_cc_soc_data.init_sys_soc; From b2ac37131cc9e7d262ccb3caaddf4e535d748920 Mon Sep 17 00:00:00 2001 From: Sudarshan Rajagopalan Date: Mon, 1 May 2017 15:52:29 -0700 Subject: [PATCH 0905/1015] ion: fix logical-not comparison warning Fixes compiler warning when a logical-not on a variable is applied while comparing it with value zero. Change-Id: I92aa16bd0d57a0d59ecd26eef1ac92220332998d Signed-off-by: Sudarshan Rajagopalan --- drivers/staging/android/ion/ion.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index 7dd9b9037dc8e..ffab992311063 100755 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -3,7 +3,7 @@ * drivers/staging/android/ion/ion.c * * Copyright (C) 2011 Google, Inc. - * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -704,7 +704,7 @@ static void user_ion_free_nolock(struct ion_client *client, WARN(1, "%s: invalid handle passed to free.\n", __func__); return; } - if (!handle->user_ref_count > 0) { + if (handle->user_ref_count == 0) { WARN(1, "%s: User does not have access!\n", __func__); return; } From abb04913c3e3db11b7e10eb3276829766c95bcf1 Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Fri, 9 Jun 2017 17:25:24 +0530 Subject: [PATCH 0906/1015] usb: gadget: Fix incorrect ISOC data transfer PIDs The PIDs for Iscohronous data transfers are incorrect for high bandwidth endpoints when the request length is less than the wMaxPacketSize. The correct PIDs for ISOC data transfers is For request length < maxPayloadSize - DATA0, For maxPayloadSize < length < 2*maxPayloadSize - DATA0,DATA1 For 2*maxPayloadSize < length < 3*maxPayloadSize - DATA2, DATA1, DATA0. Fix this by setting the value of trb->size depending on request length rather than fixing it to the value depending on wMaxPacketSize. Change-Id: I9ae88ed3abc566e02daa727e84a2938582931436 Signed-off-by: Sriharsha Allenki --- drivers/usb/dwc3/gadget.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 534d2d7d39e4e..ea53e43123040 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -847,7 +847,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb; bool zlp_appended = false; unsigned rlen; - int isoc_maxp; + int isoc_maxp, max_payload, mult; dev_vdbg(dwc->dev, "%s: req %pK dma %08llx length %d%s%s\n", dep->name, req, (unsigned long long) dma, @@ -882,7 +882,10 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, case USB_ENDPOINT_XFER_ISOC: isoc_maxp = usb_endpoint_maxp(dep->endpoint.desc); - trb->size |= DWC3_TRB_SIZE_PCM1(isoc_maxp >> 11); + max_payload = isoc_maxp & 0x7FF; + mult = (req->request.length/max_payload) & 0x3; + trb->size |= DWC3_TRB_SIZE_PCM1( + (req->request.length%max_payload) ? mult : mult-1); if (!node) trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST; else From fa601f17db212c2efccc802b05364b7c356d58d1 Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Tue, 25 Oct 2016 12:35:22 +0530 Subject: [PATCH 0907/1015] regulator: mem-acc: Add range check based override fuse version map Sometimes, a range of override fuse values require a common mem-acc settings. Add a range based check against override fuse values to identify the required override map index. CRs-Fixed: 2056902 Change-Id: Id41bfe24dd0050aedf7b51e7c6b6a08fd370d922 Signed-off-by: Tirupathi Reddy --- .../bindings/regulator/mem-acc-regulator.txt | 22 + drivers/regulator/mem-acc-regulator.c | 461 ++++++++++++------ 2 files changed, 326 insertions(+), 157 deletions(-) diff --git a/Documentation/devicetree/bindings/regulator/mem-acc-regulator.txt b/Documentation/devicetree/bindings/regulator/mem-acc-regulator.txt index d217a4ea9fc8b..528b433b4b1b5 100644 --- a/Documentation/devicetree/bindings/regulator/mem-acc-regulator.txt +++ b/Documentation/devicetree/bindings/regulator/mem-acc-regulator.txt @@ -159,6 +159,21 @@ Optional properties: not specified, then "qcom,override-cornerX-reg-config" must contain a single register configuration sequence list which is then applied unconditionally. This property can only be specified if qcom,cornerX-reg-config property is already defined. +- qcom,override-acc-range-fuse-list: Array of tuples define the selection parameters used for selecting the override + mem-acc configuration. The fused values for these selection parameters are used by the + qcom,override-fuse-range-map to identify the correct set of override properties. + Each tuple contains 4 elements as defined below: + [0] => the fuse row number of the selector + [1] => LSB bit position of the bits + [2] => number of bits + [3] => fuse reading method, 0 for direct reading or 1 for SCM reading +- qcom,override-fuse-range-map: Array of tuples where each tuple specifies the allowed range for all the selection parameters + defined in qcom,override-acc-range-fuse-list. The fused values of these selection parameters + are compared against their allowed range in each tuple starting from 0th tuple and use the + first matched tuple index to select the right tuples from the other override properties. + Either qcom,override-fuse-range-map or qcom,override-fuse-version-map is used to select + the override configuration. The qcom,override-fuse-range-map is used if both the + properties are specified. mem_acc_vreg_corner: regulator@fd4aa044 { compatible = "qcom,mem-acc-regulator"; @@ -184,6 +199,13 @@ mem_acc_vreg_corner: regulator@fd4aa044 { qcom,override-fuse-version-map = <0>, <2>, <(-1)>; + qcom,override-acc-range-fuse-list = + <37 40 3 0>, + <36 30 8 0>; + qcom,override-fuse-range-map = + <0 0>, < 0 0>, <49 63>, + <1 1>, < 0 0>, <50 63>, + <0 1>, < 95 255>, < 0 63>; qcom,override-corner-acc-map = <0 0 1>, <0 1 2>, <0 1 1>; diff --git a/drivers/regulator/mem-acc-regulator.c b/drivers/regulator/mem-acc-regulator.c index 02d543b8ec741..27a9aa2d79054 100644 --- a/drivers/regulator/mem-acc-regulator.c +++ b/drivers/regulator/mem-acc-regulator.c @@ -108,6 +108,8 @@ struct mem_acc_regulator { u32 *phys_reg_addr_list; void __iomem **remap_reg_addr_list; struct corner_acc_reg_config *corner_acc_reg_config; + u32 *override_acc_range_fuse_list; + int override_acc_range_fuse_num; }; static DEFINE_MUTEX(mem_acc_memory_mutex); @@ -551,9 +553,8 @@ static int mem_acc_custom_data_init(struct platform_device *pdev, return 0; } -static int override_mem_acc_custom_data(struct platform_device *pdev, - struct mem_acc_regulator *mem_acc_vreg, - int mem_type) +static int override_mem_acc_custom_data(struct mem_acc_regulator *mem_acc_vreg, + int mem_type) { char *custom_apc_data_str; int len, rc = 0, i; @@ -649,27 +650,48 @@ static int mem_acc_override_corner_map(struct mem_acc_regulator *mem_acc_vreg) } -static int mem_acc_find_override_map_match(struct platform_device *pdev, - struct mem_acc_regulator *mem_acc_vreg) +static void mem_acc_read_efuse_param(struct mem_acc_regulator *mem_acc_vreg, + u32 *fuse_sel, int *val) { - struct device_node *of_node = pdev->dev.of_node; + u64 fuse_bits; + + fuse_bits = mem_acc_read_efuse_row(mem_acc_vreg, fuse_sel[0], + fuse_sel[3]); + /* + * fuse_sel[1] = LSB position in row (shift) + * fuse_sel[2] = num of bits (mask) + */ + *val = (fuse_bits >> fuse_sel[1]) & ((1 << fuse_sel[2]) - 1); +} + +#define FUSE_TUPLE_SIZE 4 +static int mem_acc_parse_override_fuse_version_map( + struct mem_acc_regulator *mem_acc_vreg) +{ + struct device_node *of_node = mem_acc_vreg->dev->of_node; int i, rc, tuple_size; int len = 0; u32 *tmp; - char *prop_str = "qcom,override-fuse-version-map"; - - /* Specify default no match case. */ - mem_acc_vreg->override_map_match = FUSE_MAP_NO_MATCH; - mem_acc_vreg->override_map_count = 0; + u32 fuse_sel[4]; + char *prop_str; - if (!of_find_property(of_node, prop_str, &len)) { - /* No mapping present. */ - return 0; + prop_str = "qcom,override-acc-fuse-sel"; + rc = of_property_read_u32_array(of_node, prop_str, fuse_sel, + FUSE_TUPLE_SIZE); + if (rc < 0) { + pr_err("Read failed - %s rc=%d\n", prop_str, rc); + return rc; } + mem_acc_read_efuse_param(mem_acc_vreg, fuse_sel, + &mem_acc_vreg->override_fuse_value); + + prop_str = "qcom,override-fuse-version-map"; + if (!of_find_property(of_node, prop_str, &len)) + return -EINVAL; + tuple_size = 1; mem_acc_vreg->override_map_count = len / (sizeof(u32) * tuple_size); - if (len == 0 || len % (sizeof(u32) * tuple_size)) { pr_err("%s length=%d is invalid\n", prop_str, len); return -EINVAL; @@ -697,8 +719,9 @@ static int mem_acc_find_override_map_match(struct platform_device *pdev, } if (mem_acc_vreg->override_map_match != FUSE_MAP_NO_MATCH) - pr_debug("%s tuple match found: %d\n", prop_str, - mem_acc_vreg->override_map_match); + pr_info("override_fuse_val=%d, %s tuple match found: %d\n", + mem_acc_vreg->override_fuse_value, prop_str, + mem_acc_vreg->override_map_match); else pr_err("%s tuple match not found\n", prop_str); @@ -707,6 +730,121 @@ static int mem_acc_find_override_map_match(struct platform_device *pdev, return rc; } +static int mem_acc_parse_override_fuse_version_range( + struct mem_acc_regulator *mem_acc_vreg) +{ + struct device_node *of_node = mem_acc_vreg->dev->of_node; + int i, j, rc, size, row_size; + int num_fuse_sel, len = 0; + u32 *tmp = NULL; + char *prop_str; + u32 *fuse_val, *fuse_sel; + char *buf = NULL; + int pos = 0, buflen; + + prop_str = "qcom,override-acc-range-fuse-list"; + if (!of_find_property(of_node, prop_str, &len)) { + pr_err("%s property is missing\n", prop_str); + return -EINVAL; + } + + size = len / sizeof(u32); + if (len == 0 || (size % FUSE_TUPLE_SIZE)) { + pr_err("%s property length (%d) is invalid\n", prop_str, len); + return -EINVAL; + } + + num_fuse_sel = size / FUSE_TUPLE_SIZE; + fuse_val = devm_kcalloc(mem_acc_vreg->dev, num_fuse_sel, + sizeof(*fuse_val), GFP_KERNEL); + if (!fuse_val) + return -ENOMEM; + mem_acc_vreg->override_acc_range_fuse_list = fuse_val; + mem_acc_vreg->override_acc_range_fuse_num = num_fuse_sel; + + fuse_sel = kzalloc(len, GFP_KERNEL); + if (!fuse_sel) { + rc = -ENOMEM; + goto done; + } + + rc = of_property_read_u32_array(of_node, prop_str, fuse_sel, + size); + if (rc) { + pr_err("%s read failed, rc=%d\n", prop_str, rc); + goto done; + } + + for (i = 0; i < num_fuse_sel; i++) { + mem_acc_read_efuse_param(mem_acc_vreg, &fuse_sel[i * 4], + &fuse_val[i]); + } + + prop_str = "qcom,override-fuse-range-map"; + if (!of_find_property(of_node, prop_str, &len)) + goto done; + + row_size = num_fuse_sel * 2; + mem_acc_vreg->override_map_count = len / (sizeof(u32) * row_size); + + if (len == 0 || len % (sizeof(u32) * row_size)) { + pr_err("%s length=%d is invalid\n", prop_str, len); + rc = -EINVAL; + goto done; + } + + tmp = kzalloc(len, GFP_KERNEL); + if (!tmp) { + rc = -ENOMEM; + goto done; + } + + rc = of_property_read_u32_array(of_node, prop_str, tmp, + mem_acc_vreg->override_map_count * row_size); + if (rc) { + pr_err("could not read %s rc=%d\n", prop_str, rc); + goto done; + } + + for (i = 0; i < mem_acc_vreg->override_map_count; i++) { + for (j = 0; j < num_fuse_sel; j++) { + if (tmp[i * row_size + j * 2] > fuse_val[j] + || tmp[i * row_size + j * 2 + 1] < fuse_val[j]) + break; + } + + if (j == num_fuse_sel) { + mem_acc_vreg->override_map_match = i; + break; + } + } + + /* + * Log register and value mapping since they are useful for + * baseline MEM ACC logging. + */ + buflen = num_fuse_sel * sizeof("fuse_selxxxx = XXXX "); + buf = kzalloc(buflen, GFP_KERNEL); + if (!buf) + goto done; + + for (j = 0; j < num_fuse_sel; j++) + pos += scnprintf(buf + pos, buflen - pos, "fuse_sel%d = %d ", + j, fuse_val[j]); + buf[pos] = '\0'; + if (mem_acc_vreg->override_map_match != FUSE_MAP_NO_MATCH) + pr_info("%s %s tuple match found: %d\n", buf, prop_str, + mem_acc_vreg->override_map_match); + else + pr_err("%s %s tuple match not found\n", buf, prop_str); + +done: + kfree(fuse_sel); + kfree(tmp); + kfree(buf); + return rc; +} + #define MAX_CHARS_PER_INT 20 static int mem_acc_reg_addr_val_dump(struct mem_acc_regulator *mem_acc_vreg, @@ -791,6 +929,150 @@ static int mem_acc_get_reg_addr_val(struct device_node *of_node, return rc; } +static int mem_acc_override_reg_addr_val_init( + struct mem_acc_regulator *mem_acc_vreg) +{ + struct device_node *of_node = mem_acc_vreg->dev->of_node; + struct corner_acc_reg_config *corner_acc_reg_config; + struct acc_reg_value *override_reg_config_list; + int i, tuple_count, tuple_match, len = 0, rc = 0; + u32 list_size, override_max_reg_config_len; + char prop_str[40]; + struct property *prop; + int num_corners = mem_acc_vreg->num_corners; + + if (!mem_acc_vreg->corner_acc_reg_config) + return 0; + + if (mem_acc_vreg->override_map_count) { + if (mem_acc_vreg->override_map_match == FUSE_MAP_NO_MATCH) + return 0; + tuple_count = mem_acc_vreg->override_map_count; + tuple_match = mem_acc_vreg->override_map_match; + } else { + tuple_count = 1; + tuple_match = 0; + } + + corner_acc_reg_config = mem_acc_vreg->corner_acc_reg_config; + for (i = 1; i <= num_corners; i++) { + snprintf(prop_str, sizeof(prop_str), + "qcom,override-corner%d-addr-val-map", i); + prop = of_find_property(of_node, prop_str, &len); + list_size = len / (tuple_count * sizeof(u32)); + if (!prop) { + pr_debug("%s property not specified\n", prop_str); + continue; + } + + if ((!list_size) || list_size < (num_corners * 2)) { + pr_err("qcom,override-corner%d-addr-val-map property is missed or invalid length: len=%d\n", + i, len); + return -EINVAL; + } + + override_max_reg_config_len = list_size / (num_corners * 2); + override_reg_config_list = + corner_acc_reg_config[i].reg_config_list; + + if (corner_acc_reg_config[i].max_reg_config_len + != override_max_reg_config_len) { + /* Free already allocate memory */ + devm_kfree(mem_acc_vreg->dev, override_reg_config_list); + + /* Allocated memory for new requirement */ + override_reg_config_list = + devm_kcalloc(mem_acc_vreg->dev, + override_max_reg_config_len * num_corners, + sizeof(*override_reg_config_list), GFP_KERNEL); + if (!override_reg_config_list) + return -ENOMEM; + + corner_acc_reg_config[i].max_reg_config_len = + override_max_reg_config_len; + corner_acc_reg_config[i].reg_config_list = + override_reg_config_list; + } + + rc = mem_acc_get_reg_addr_val(of_node, prop_str, + override_reg_config_list, tuple_match, + list_size, mem_acc_vreg->num_acc_reg); + if (rc) { + pr_err("Failed to read %s property: rc=%d\n", + prop_str, rc); + return rc; + } + + rc = mem_acc_reg_addr_val_dump(mem_acc_vreg, + &corner_acc_reg_config[i], i); + if (rc) { + pr_err("could not dump acc address-value dump for corner=%d: rc=%d\n", + i, rc); + return rc; + } + } + + return rc; +} + +static int mem_acc_parse_override_config(struct mem_acc_regulator *mem_acc_vreg) +{ + struct device_node *of_node = mem_acc_vreg->dev->of_node; + int i, rc = 0; + + /* Specify default no match case. */ + mem_acc_vreg->override_map_match = FUSE_MAP_NO_MATCH; + mem_acc_vreg->override_map_count = 0; + + if (of_find_property(of_node, "qcom,override-fuse-range-map", + NULL)) { + rc = mem_acc_parse_override_fuse_version_range(mem_acc_vreg); + if (rc) { + pr_err("parsing qcom,override-fuse-range-map property failed, rc=%d\n", + rc); + return rc; + } + } else if (of_find_property(of_node, "qcom,override-fuse-version-map", + NULL)) { + rc = mem_acc_parse_override_fuse_version_map(mem_acc_vreg); + if (rc) { + pr_err("parsing qcom,override-fuse-version-map property failed, rc=%d\n", + rc); + return rc; + } + } else { + /* No override fuse configuration defined in device node */ + return 0; + } + + if (mem_acc_vreg->override_map_match == FUSE_MAP_NO_MATCH) + return 0; + + rc = mem_acc_override_corner_map(mem_acc_vreg); + if (rc) { + pr_err("Unable to override corner map rc=%d\n", rc); + return rc; + } + + rc = mem_acc_override_reg_addr_val_init(mem_acc_vreg); + if (rc) { + pr_err("Unable to override reg_config_list init rc=%d\n", + rc); + return rc; + } + + for (i = 0; i < MEMORY_MAX; i++) { + rc = override_mem_acc_custom_data(mem_acc_vreg, i); + if (rc) { + pr_err("Unable to override custom data for mem_type=%d rc=%d\n", + i, rc); + return rc; + } + } + + return rc; +} + static int mem_acc_init_reg_config(struct mem_acc_regulator *mem_acc_vreg) { struct device_node *of_node = mem_acc_vreg->dev->of_node; @@ -967,92 +1249,6 @@ static int mem_acc_reg_config_init(struct mem_acc_regulator *mem_acc_vreg) return rc; } -static int mem_acc_override_reg_addr_val_init( - struct mem_acc_regulator *mem_acc_vreg) -{ - struct device_node *of_node = mem_acc_vreg->dev->of_node; - struct corner_acc_reg_config *corner_acc_reg_config; - struct acc_reg_value *override_reg_config_list; - int i, tuple_count, tuple_match, len = 0, rc = 0; - u32 list_size, override_max_reg_config_len; - char prop_str[40]; - struct property *prop; - int num_corners = mem_acc_vreg->num_corners; - - if (!mem_acc_vreg->corner_acc_reg_config) - return 0; - - if (mem_acc_vreg->override_map_count) { - if (mem_acc_vreg->override_map_match == FUSE_MAP_NO_MATCH) - return 0; - tuple_count = mem_acc_vreg->override_map_count; - tuple_match = mem_acc_vreg->override_map_match; - } else { - tuple_count = 1; - tuple_match = 0; - } - - corner_acc_reg_config = mem_acc_vreg->corner_acc_reg_config; - for (i = 1; i <= num_corners; i++) { - snprintf(prop_str, sizeof(prop_str), - "qcom,override-corner%d-addr-val-map", i); - prop = of_find_property(of_node, prop_str, &len); - list_size = len / (tuple_count * sizeof(u32)); - if (!prop) { - pr_debug("%s property not specified\n", prop_str); - continue; - } - - if ((!list_size) || list_size < (num_corners * 2)) { - pr_err("qcom,override-corner%d-addr-val-map property is missed or invalid length: len=%d\n", - i, len); - return -EINVAL; - } - - override_max_reg_config_len = list_size / (num_corners * 2); - override_reg_config_list = - corner_acc_reg_config[i].reg_config_list; - - if (corner_acc_reg_config[i].max_reg_config_len - != override_max_reg_config_len) { - /* Free already allocate memory */ - devm_kfree(mem_acc_vreg->dev, override_reg_config_list); - - /* Allocated memory for new requirement */ - override_reg_config_list = - devm_kcalloc(mem_acc_vreg->dev, - override_max_reg_config_len * num_corners, - sizeof(*override_reg_config_list), GFP_KERNEL); - if (!override_reg_config_list) - return -ENOMEM; - - corner_acc_reg_config[i].max_reg_config_len = - override_max_reg_config_len; - corner_acc_reg_config[i].reg_config_list = - override_reg_config_list; - } - - rc = mem_acc_get_reg_addr_val(of_node, prop_str, - override_reg_config_list, tuple_match, - list_size, mem_acc_vreg->num_acc_reg); - if (rc) { - pr_err("Failed to read %s property: rc=%d\n", - prop_str, rc); - return rc; - } - - rc = mem_acc_reg_addr_val_dump(mem_acc_vreg, - &corner_acc_reg_config[i], i); - if (rc) { - pr_err("could not dump acc address-value dump for corner=%d: rc=%d\n", - i, rc); - return rc; - } - } - - return rc; -} - #define MEM_TYPE_STRING_LEN 20 static int mem_acc_init(struct platform_device *pdev, struct mem_acc_regulator *mem_acc_vreg) @@ -1060,8 +1256,6 @@ static int mem_acc_init(struct platform_device *pdev, struct device_node *of_node = pdev->dev.of_node; struct resource *res; int len, rc, i, j; - u32 fuse_sel[4]; - u64 fuse_bits; bool acc_type_present = false; char tmps[MEM_TYPE_STRING_LEN]; @@ -1203,59 +1397,12 @@ static int mem_acc_init(struct platform_device *pdev, } } - if (of_find_property(mem_acc_vreg->dev->of_node, - "qcom,override-acc-fuse-sel", NULL)) { - rc = of_property_read_u32_array(mem_acc_vreg->dev->of_node, - "qcom,override-acc-fuse-sel", fuse_sel, 4); - if (rc < 0) { - pr_err("Read failed - qcom,override-acc-fuse-sel rc=%d\n", - rc); - return rc; - } - - fuse_bits = mem_acc_read_efuse_row(mem_acc_vreg, fuse_sel[0], - fuse_sel[3]); - /* - * fuse_sel[1] = LSB position in row (shift) - * fuse_sel[2] = num of bits (mask) - */ - mem_acc_vreg->override_fuse_value = (fuse_bits >> fuse_sel[1]) & - ((1 << fuse_sel[2]) - 1); - - rc = mem_acc_find_override_map_match(pdev, mem_acc_vreg); - if (rc) { - pr_err("Unable to find fuse map match rc=%d\n", rc); - return rc; - } - - pr_debug("override_fuse_val=%d override_map_match=%d\n", - mem_acc_vreg->override_fuse_value, - mem_acc_vreg->override_map_match); - - rc = mem_acc_override_corner_map(mem_acc_vreg); - if (rc) { - pr_err("Unable to override corner map rc=%d\n", rc); - return rc; - } - - rc = mem_acc_override_reg_addr_val_init(mem_acc_vreg); - if (rc) { - pr_err("Unable to override reg_config_list init rc=%d\n", - rc); - return rc; - } - - for (i = 0; i < MEMORY_MAX; i++) { - rc = override_mem_acc_custom_data(pdev, - mem_acc_vreg, i); - if (rc) { - pr_err("Unable to override custom data for mem_type=%d rc=%d\n", - i, rc); - return rc; - } - } + rc = mem_acc_parse_override_config(mem_acc_vreg); + if (rc) { + pr_err("Unable to parse mem acc override configuration, rc=%d\n", + rc); + return rc; } - if (acc_type_present) { mem_acc_vreg->mem_acc_type_data = devm_kzalloc( mem_acc_vreg->dev, mem_acc_vreg->num_corners * From 80e323d39a2353e2222e1bf3d0fe404373a9cf0b Mon Sep 17 00:00:00 2001 From: Tirupathi Reddy Date: Tue, 25 Oct 2016 17:15:07 +0530 Subject: [PATCH 0908/1015] ARM: dts: msm: Use override mem-acc settings for msm8940 Apply relax MEM ACC (L1 only) settings for NOMP/TURBO for below combinations: "Foundry-0, IDDQ >= 95mA (or) Turbo >= 49". "Foundry-1, IDDQ >= 95mA (or) Turbo >= 50". "Foundry-5, IDDQ >= 100mA (or) Turbo >= 51". CRs-Fixed: 2056902 Change-Id: Iabfb0f19ab4f10c32ef9ffd630aff53c0b270d4d Signed-off-by: Tirupathi Reddy --- arch/arm/boot/dts/qcom/msm8940.dtsi | 212 ++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index d9d2f28c3783e..6ec88d4915276 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -173,6 +173,8 @@ mem_acc_vreg_corner: regulator@01946004 { compatible = "qcom,mem-acc-regulator"; + reg = <0xa4000 0x1000>; + reg-names = "efuse_addr"; regulator-name = "mem_acc_corner"; regulator-min-microvolt = <1>; regulator-max-microvolt = <3>; @@ -223,6 +225,216 @@ <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>; + + qcom,override-acc-range-fuse-list = + <37 40 3 0>, /* foundry id */ + <36 30 8 0>, /* iddq apc on */ + <67 0 6 0>; /* turbo targ volt */ + + qcom,override-fuse-range-map = + <0 0>, < 0 0>, <49 63>, + <1 1>, < 0 0>, <50 63>, + <5 5>, < 0 0>, <51 63>, + <0 1>, < 95 255>, < 0 63>, + <5 5>, <100 255>, < 0 63>; + + qcom,override-corner1-addr-val-map = + /* 1st fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 2 0x555555 >, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 2nd fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 2 0x555555 >, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 3rd fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 2 0x555555 >, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 4th fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 2 0x555555 >, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 5th fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 2 0x555555 >, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>; + + qcom,override-corner2-addr-val-map = + /* 1st fuse version tuple matched */ + /* NOM => SVS+ */ + < 2 0x555555>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 2 0x555555>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 2nd fuse version tuple matched */ + /* NOM => SVS+ */ + < 2 0x555555>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 2 0x555555>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 3rd fuse version tuple matched */ + /* NOM => SVS+ */ + < 2 0x555555>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 2 0x555555>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 4th fuse version tuple matched */ + /* NOM => SVS+ */ + < 2 0x555555>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 2 0x555555>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 5th fuse version tuple matched */ + /* NOM => SVS+ */ + < 2 0x555555>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 2 0x555555>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>; + + qcom,override-corner3-addr-val-map = + /* 1st fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* TURBO/NOM+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + + /* 2nd fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* TURBO/NOM+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + + /* 3rd fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* TURBO/NOM+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + + /* 4th fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* TURBO/NOM+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + + /* 5th fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* TURBO/NOM+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>; }; }; From 9262263c54f7e13e30a31fa8fb0a3f76843ffdc3 Mon Sep 17 00:00:00 2001 From: Vijayavardhan Vennapusa Date: Wed, 21 Jun 2017 12:40:13 +0530 Subject: [PATCH 0909/1015] USB: phy-msm-qusb: Enable autoresume only when device is connected Currently driver is enabling autoresume feature even if no device is connected which is not required. Hence enable auto resume only when any HS/FS/LS devices are connected during bus suspend. Change-Id: I8150a571e11ccc128298fe75acef21ffe9b08a9a Signed-off-by: Vijayavardhan Vennapusa --- drivers/usb/phy/phy-msm-qusb.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/usb/phy/phy-msm-qusb.c b/drivers/usb/phy/phy-msm-qusb.c index c7f1722f8feb4..acf5c19766225 100644 --- a/drivers/usb/phy/phy-msm-qusb.c +++ b/drivers/usb/phy/phy-msm-qusb.c @@ -994,13 +994,15 @@ static int qusb_phy_set_suspend(struct usb_phy *phy, int suspend) writel_relaxed(intr_mask, qphy->base + QUSB2PHY_PORT_INTR_CTRL); - /* enable phy auto-resume */ - writel_relaxed(0x0C, + if (linestate & (LINESTATE_DP | LINESTATE_DM)) { + /* enable phy auto-resume */ + writel_relaxed(0x0C, qphy->base + QUSB2PHY_PORT_TEST_CTRL); - /* flush the previous write before next write */ - wmb(); - writel_relaxed(0x04, - qphy->base + QUSB2PHY_PORT_TEST_CTRL); + /* flush the previous write before next write */ + wmb(); + writel_relaxed(0x04, + qphy->base + QUSB2PHY_PORT_TEST_CTRL); + } dev_dbg(phy->dev, "%s: intr_mask = %x\n", From fb19c623ee6cc397ea81bdf7fb380e652ead609c Mon Sep 17 00:00:00 2001 From: Haibin Liu Date: Fri, 23 Jun 2017 16:46:05 +0800 Subject: [PATCH 0910/1015] msm: ispif: fix device crash during dumping io register Check whether ispif->base is null before dumping CRs-Fixed: 2046207 Change-Id: Ib026632252b43bb4d607ba00188c4c4143c1725e Signed-off-by: Haibin Liu --- drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c | 6 ++++++ 1 file changed, 6 insertions(+) mode change 100644 => 100755 drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c old mode 100644 new mode 100755 index ec368a12c6ea6..93b889c6ad4e5 --- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c +++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c @@ -68,6 +68,12 @@ static void msm_ispif_io_dump_reg(struct ispif_device *ispif) { if (!ispif->enb_dump_reg) return; + + if (!ispif->base) { + pr_err("%s: null pointer for the ispif base\n", __func__); + return; + } + msm_camera_io_dump(ispif->base, 0x250, 0); } From a9457ba7ca1d7f3f243636d70c5ecd7d1dda3405 Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Wed, 21 Jun 2017 16:51:26 -0700 Subject: [PATCH 0911/1015] msm: ipa: prevent string buffer overflows On rmnet_ipa_set_data_quota() API, add the string terminator to prevent vulnerability of string buffer overflows on debug prints. Change-Id: Ie669f6606f76b9006bce4edd0c6d04aef9cfb600 Signed-off-by: Skylar Chang --- drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c | 3 +++ drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c index 716330afb6e73..55b2c024b072d 100644 --- a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c @@ -2470,6 +2470,9 @@ int rmnet_ipa_set_data_quota(struct wan_ioctl_set_data_quota *data) int index; struct ipa_set_data_usage_quota_req_msg_v01 req; + /* prevent string buffer overflows */ + data->interface_name[IFNAMSIZ-1] = '\0'; + index = find_vchannel_name_index(data->interface_name); IPAWANERR("iface name %s, quota %lu\n", data->interface_name, diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index fcec90383463f..b49dcbf04d1ba 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -2562,6 +2562,9 @@ int rmnet_ipa3_set_data_quota(struct wan_ioctl_set_data_quota *data) int index; struct ipa_set_data_usage_quota_req_msg_v01 req; + /* prevent string buffer overflows */ + data->interface_name[IFNAMSIZ-1] = '\0'; + index = find_vchannel_name_index(data->interface_name); IPAWANERR("iface name %s, quota %lu\n", data->interface_name, From c2fd287bf16dc5e9f98145ba91083bdc56dfc01f Mon Sep 17 00:00:00 2001 From: Mohammed Javid Date: Thu, 15 Jun 2017 18:39:07 +0530 Subject: [PATCH 0912/1015] msm:ipa: Fix to kasan use-after-free issue Added mutex lock to query rt table function also to sync with other ioctl calls in both ipa v2/v3. Change-Id: I65d46c0ef28b5e6260c92473fd15e9763de20146 Acked-by: Ashok Vuyyuru Signed-off-by: Mohammed Javid --- drivers/platform/msm/ipa/ipa_v2/ipa_rt.c | 6 +++++- drivers/platform/msm/ipa/ipa_v3/ipa_rt.c | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c index ca27488c52055..8ce3617cb8092 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c @@ -852,12 +852,16 @@ int ipa2_query_rt_index(struct ipa_ioc_get_rt_tbl_indx *in) return -EINVAL; } + mutex_lock(&ipa_ctx->lock); /* check if this table exists */ entry = __ipa_find_rt_tbl(in->ip, in->name); - if (!entry) + if (!entry) { + mutex_unlock(&ipa_ctx->lock); return -EFAULT; + } in->idx = entry->idx; + mutex_unlock(&ipa_ctx->lock); return 0; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c index 43d0a372166e2..2e1a4ba02a708 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c @@ -901,12 +901,15 @@ int ipa3_query_rt_index(struct ipa_ioc_get_rt_tbl_indx *in) return -EINVAL; } + mutex_lock(&ipa3_ctx->lock); /* check if this table exists */ entry = __ipa3_find_rt_tbl(in->ip, in->name); - if (!entry) + if (!entry) { + mutex_unlock(&ipa3_ctx->lock); return -EFAULT; - + } in->idx = entry->idx; + mutex_unlock(&ipa3_ctx->lock); return 0; } From 84c0c54acf482c1b46e453fe9ddd5fb72b94ab08 Mon Sep 17 00:00:00 2001 From: Hamad Kadmany Date: Tue, 20 Jun 2017 13:55:07 +0300 Subject: [PATCH 0913/1015] wil6210: protect against invalid length of tx management frame Validate buffer length has the minimum needed size when sending management frame to protect against possible buffer overrun. Change-Id: Ib5aed79694100597d7f71a9e8d4e8dba91be538a Signed-off-by: Hamad Kadmany --- drivers/net/wireless/ath/wil6210/cfg80211.c | 3 +++ drivers/net/wireless/ath/wil6210/debugfs.c | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c index b20f56461d775..e0aebd36ca213 100644 --- a/drivers/net/wireless/ath/wil6210/cfg80211.c +++ b/drivers/net/wireless/ath/wil6210/cfg80211.c @@ -696,6 +696,9 @@ int wil_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, wil_dbg_misc(wil, "%s()\n", __func__); print_hex_dump_bytes("mgmt tx frame ", DUMP_PREFIX_OFFSET, buf, len); + if (len < sizeof(struct ieee80211_mgmt)) + return -EINVAL; + cmd = kmalloc(sizeof(*cmd) + len, GFP_KERNEL); if (!cmd) { rc = -ENOMEM; diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c index 63d5c2819ea7e..81a85da6730ca 100644 --- a/drivers/net/wireless/ath/wil6210/debugfs.c +++ b/drivers/net/wireless/ath/wil6210/debugfs.c @@ -807,8 +807,12 @@ static ssize_t wil_write_file_txmgmt(struct file *file, const char __user *buf, struct wireless_dev *wdev = wil_to_wdev(wil); struct cfg80211_mgmt_tx_params params; int rc; - void *frame = kmalloc(len, GFP_KERNEL); + void *frame; + if (!len) + return -EINVAL; + + frame = kmalloc(len, GFP_KERNEL); if (!frame) return -ENOMEM; From 1fa0f78c612b4c2628ee7ad309b1b93131f1c0a2 Mon Sep 17 00:00:00 2001 From: Mishra Mahima Date: Wed, 5 Jul 2017 09:59:50 +0530 Subject: [PATCH 0914/1015] msm: mdss: fix null pointer dereferencing Current driver checks if the address of start pointer is zero. But in cases when start pointer is NULL this check will result in null pointer dereferencing. This change adds an additioanl check on the start pointer to avoid null pointer dereferencing. CRs-fixed: 2035100 Change-Id: Ic86c9e73cd676cbf8680f5b7266ee3829f4ccbd2 Signed-off-by: Harsh Sahu Signed-off-by: Mishra Mahima --- drivers/video/msm/mdss/mdss_mdp_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_util.c b/drivers/video/msm/mdss/mdss_mdp_util.c index c25a976de0ea1..bffc13184c1f8 100644 --- a/drivers/video/msm/mdss/mdss_mdp_util.c +++ b/drivers/video/msm/mdss/mdss_mdp_util.c @@ -1086,7 +1086,7 @@ static int mdss_mdp_get_img(struct msmfb_data *img, return ret; } } - if (!*start) { + if (start && !*start) { pr_err("start address is zero!\n"); mdss_mdp_put_img(data, rotator, dir); return -ENOMEM; From 114611115d5796ebf4d9d54baebd00d8cc0e6f52 Mon Sep 17 00:00:00 2001 From: Samyukta Mogily Date: Fri, 23 Jun 2017 14:29:20 +0530 Subject: [PATCH 0915/1015] msm: sensor: Fix for variable being de-referenced without proper check Pointer from userspace is de-referenced before the command is checked. This might cause a crash if the command being sent is not a valid command. Hence changing the de-reference such that the pointer is accessed after checking if a valid command is sent from the userspace. Change-Id: I731a015c952d131187a47a8d346fb6478fddeeb1 Signed-off-by: Samyukta Mogily --- .../platform/msm/camera_v2/sensor/flash/msm_flash.c | 12 ++++++------ .../platform/msm/camera_v2/sensor/ois/msm_ois.c | 4 +--- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c index 7d2123f1779fc..22563da2d6d1a 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c +++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -999,13 +999,13 @@ static long msm_flash_subdev_do_ioctl( sd = vdev_to_v4l2_subdev(vdev); u32 = (struct msm_flash_cfg_data_t32 *)arg; - flash_data.cfg_type = u32->cfg_type; - for (i = 0; i < MAX_LED_TRIGGERS; i++) { - flash_data.flash_current[i] = u32->flash_current[i]; - flash_data.flash_duration[i] = u32->flash_duration[i]; - } switch (cmd) { case VIDIOC_MSM_FLASH_CFG32: + flash_data.cfg_type = u32->cfg_type; + for (i = 0; i < MAX_LED_TRIGGERS; i++) { + flash_data.flash_current[i] = u32->flash_current[i]; + flash_data.flash_duration[i] = u32->flash_duration[i]; + } cmd = VIDIOC_MSM_FLASH_CFG; switch (flash_data.cfg_type) { case CFG_FLASH_OFF: diff --git a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c index 5cec427213917..280bcfbab391c 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c +++ b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c @@ -774,11 +774,10 @@ static long msm_ois_subdev_do_ioctl( u32 = (struct msm_ois_cfg_data32 *)arg; parg = arg; - ois_data.cfgtype = u32->cfgtype; - switch (cmd) { case VIDIOC_MSM_OIS_CFG32: cmd = VIDIOC_MSM_OIS_CFG; + ois_data.cfgtype = u32->cfgtype; switch (u32->cfgtype) { case CFG_OIS_CONTROL: @@ -812,7 +811,6 @@ static long msm_ois_subdev_do_ioctl( settings.reg_setting = compat_ptr(settings32.reg_setting); - ois_data.cfgtype = u32->cfgtype; ois_data.cfg.settings = &settings; parg = &ois_data; break; From dad795633ed488a286bd8fc74441711383ed67d9 Mon Sep 17 00:00:00 2001 From: Haibin Liu Date: Wed, 28 Jun 2017 21:05:19 +0800 Subject: [PATCH 0916/1015] msm: sensor: actuator: add conditional check for ioctl Add conditional check when operating VIDIOC_MSM_ACTUATOR_CFG32 CRs-Fixed: 2060371 Change-Id: I9cfaff05b1fff6969a2543c3816d41ed1fabf897 Signed-off-by: Haibin Liu --- .../platform/msm/camera_v2/sensor/actuator/msm_actuator.c | 4 ++++ 1 file changed, 4 insertions(+) mode change 100644 => 100755 drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c old mode 100644 new mode 100755 index 0641eb7fe5b7a..f3a2fe0348720 --- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c @@ -1704,6 +1704,10 @@ static long msm_actuator_subdev_do_ioctl( parg = &actuator_data; break; } + break; + case VIDIOC_MSM_ACTUATOR_CFG: + pr_err("%s: invalid cmd 0x%x received\n", __func__, cmd); + return -EINVAL; } rc = msm_actuator_subdev_ioctl(sd, cmd, parg); From 7abce33d299addd01ea649b6f8069bb2e3852037 Mon Sep 17 00:00:00 2001 From: Vidyakumar Athota Date: Tue, 20 Jun 2017 16:39:00 -0700 Subject: [PATCH 0917/1015] ASoC: msm: qdsp6v2: add size check to fix out of bounds issue Before calling audio calibration ioctl functions, compare the allocated buffer size to the size of the header and cal type header to ensure the buffer is big enough. Change-Id: I601bb37ddcc34d459c207cf579f29744fe912d7b Signed-off-by: Vidyakumar Athota --- sound/soc/msm/qdsp6v2/audio_calibration.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/audio_calibration.c b/sound/soc/msm/qdsp6v2/audio_calibration.c index 60d09dfaeb7f7..2a1b34776b686 100644 --- a/sound/soc/msm/qdsp6v2/audio_calibration.c +++ b/sound/soc/msm/qdsp6v2/audio_calibration.c @@ -453,6 +453,12 @@ static long audio_cal_shared_ioctl(struct file *file, unsigned int cmd, data->cal_type.cal_hdr.buffer_number); ret = -EINVAL; goto done; + } else if ((data->hdr.cal_type_size + sizeof(data->hdr)) > size) { + pr_err("%s: cal type hdr size %zd + cal type size %d is greater than user buffer size %d\n", + __func__, sizeof(data->hdr), data->hdr.cal_type_size, + size); + ret = -EFAULT; + goto done; } @@ -490,13 +496,7 @@ static long audio_cal_shared_ioctl(struct file *file, unsigned int cmd, goto unlock; if (data == NULL) goto unlock; - if ((sizeof(data->hdr) + data->hdr.cal_type_size) > size) { - pr_err("%s: header size %zd plus cal type size %d are greater than data buffer size %d\n", - __func__, sizeof(data->hdr), - data->hdr.cal_type_size, size); - ret = -EFAULT; - goto unlock; - } else if (copy_to_user((void *)arg, data, + if (copy_to_user(arg, data, sizeof(data->hdr) + data->hdr.cal_type_size)) { pr_err("%s: Could not copy cal type to user\n", __func__); From 56980a6a34973392adb79cb0bbc66edeb7a6da68 Mon Sep 17 00:00:00 2001 From: Abhishek Kondaveeti Date: Thu, 25 May 2017 17:06:17 +0530 Subject: [PATCH 0918/1015] msm: isp: Fix Ub allocation for image WM Change total UB buffer size allocated for image Write masters as per the HW specification. Change-Id: Ifbfda4057f3de81171fb48d14584e07423d67075 Signed-off-by: Abhishek Kondaveeti --- drivers/media/platform/msm/camera_v2/isp/msm_isp40.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index 100c8e89d8e0b..3af953e268976 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -34,12 +34,13 @@ #define VFE40_STATS_BURST_LEN_8916_VERSION 2 #define VFE40_FETCH_BURST_LEN 3 #define VFE40_UB_SIZE 1536 /* 1536 * 128 bits = 24KB */ +#define VFE40_STATS_SIZE 392 #define VFE40_UB_SIZE_8952 2048 /* 2048 * 128 bits = 32KB */ #define VFE40_UB_SIZE_8916 3072 /* 3072 * 128 bits = 48KB */ #define VFE40_EQUAL_SLICE_UB 190 /* (UB_SIZE - STATS SIZE)/6 */ #define VFE40_EQUAL_SLICE_UB_8916 236 #define VFE40_TOTAL_WM_UB 1144 /* UB_SIZE - STATS SIZE */ -#define VFE40_TOTAL_WM_UB_8916 1656 +#define VFE40_TOTAL_WM_UB_8916 2680 #define VFE40_WM_BASE(idx) (0x6C + 0x24 * idx) #define VFE40_RDI_BASE(idx) (0x2E8 + 0x4 * idx) #define VFE40_XBAR_BASE(idx) (0x58 + 0x4 * (idx / 2)) @@ -103,7 +104,11 @@ static uint32_t msm_vfe40_ub_reg_offset(struct vfe_device *vfe_dev, int idx) static uint32_t msm_vfe40_get_ub_size(struct vfe_device *vfe_dev) { - if (vfe_dev->vfe_hw_version == VFE40_8916_VERSION) { + if (vfe_dev->vfe_hw_version == VFE40_8916_VERSION || + vfe_dev->vfe_hw_version == VFE40_8939_VERSION || + vfe_dev->vfe_hw_version == VFE40_8937_VERSION || + vfe_dev->vfe_hw_version == VFE40_8953_VERSION || + vfe_dev->vfe_hw_version == VFE40_8917_VERSION) { vfe_dev->ub_info->wm_ub = VFE40_TOTAL_WM_UB_8916; return VFE40_TOTAL_WM_UB_8916; } From b54141365805ae1a5254bff5442e1a103d3701d0 Mon Sep 17 00:00:00 2001 From: Satyajit Desai Date: Tue, 13 Jun 2017 15:55:20 -0700 Subject: [PATCH 0919/1015] coresight: tmc: Fix use after free issue with tmc read Fix race condition seen between reading tmc buffer and enabling the device. The race condition can result in a use after free issue if the buffer is released while a read is in progress. Change-Id: I44e0f8b95ddfae5acac6fcc59e78a7741aaa97cc Signed-off-by: Satyajit Desai --- drivers/hwtracing/coresight/coresight-tmc.c | 34 ++++++++++++++------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-tmc.c b/drivers/hwtracing/coresight/coresight-tmc.c index e1c1744e29176..a9a154c28302d 100644 --- a/drivers/hwtracing/coresight/coresight-tmc.c +++ b/drivers/hwtracing/coresight/coresight-tmc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012, 2016 The Linux Foundation. All rights reserved. +/* Copyright (c) 2012, 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -744,6 +744,16 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) pm_runtime_get_sync(drvdata->dev); mutex_lock(&drvdata->mem_lock); + + spin_lock_irqsave(&drvdata->spinlock, flags); + if (drvdata->reading) { + spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->mem_lock); + pm_runtime_put(drvdata->dev); + return -EBUSY; + } + spin_unlock_irqrestore(&drvdata->spinlock, flags); + if (drvdata->config_type == TMC_CONFIG_TYPE_ETR && drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) { /* @@ -778,17 +788,8 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) return ret; } } - mutex_unlock(&drvdata->mem_lock); spin_lock_irqsave(&drvdata->spinlock, flags); - if (drvdata->reading) { - spin_unlock_irqrestore(&drvdata->spinlock, flags); - if (drvdata->config_type == TMC_CONFIG_TYPE_ETR - && drvdata->out_mode == TMC_ETR_OUT_MODE_USB) - usb_qdss_close(drvdata->usbch); - pm_runtime_put(drvdata->dev); - return -EBUSY; - } if (drvdata->config_type == TMC_CONFIG_TYPE_ETB) { tmc_etb_enable_hw(drvdata); @@ -803,6 +804,7 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) } drvdata->enable = true; spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->mem_lock); dev_info(drvdata->dev, "TMC enabled\n"); return 0; @@ -1046,6 +1048,7 @@ static int tmc_read_prepare(struct tmc_drvdata *drvdata) unsigned long flags; enum tmc_mode mode; + mutex_lock(&drvdata->mem_lock); spin_lock_irqsave(&drvdata->spinlock, flags); if (!drvdata->enable) goto out; @@ -1066,11 +1069,13 @@ static int tmc_read_prepare(struct tmc_drvdata *drvdata) out: drvdata->reading = true; spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->mem_lock); dev_info(drvdata->dev, "TMC read start\n"); return 0; err: spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->mem_lock); return ret; } @@ -1245,7 +1250,11 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, { struct tmc_drvdata *drvdata = container_of(file->private_data, struct tmc_drvdata, miscdev); - char *bufp = drvdata->buf + *ppos; + char *bufp; + + mutex_lock(&drvdata->mem_lock); + + bufp = drvdata->buf + *ppos; if (*ppos + len > drvdata->size) len = drvdata->size - *ppos; @@ -1267,6 +1276,7 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, if (copy_to_user(data, bufp, len)) { dev_dbg(drvdata->dev, "%s: copy_to_user failed\n", __func__); + mutex_unlock(&drvdata->mem_lock); return -EFAULT; } @@ -1274,6 +1284,8 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, dev_dbg(drvdata->dev, "%s: %zu bytes copied, %d bytes left\n", __func__, len, (int)(drvdata->size - *ppos)); + + mutex_unlock(&drvdata->mem_lock); return len; } From f43e2f0866638cf81c0a1749676d1feb91ad1532 Mon Sep 17 00:00:00 2001 From: kaiwang Date: Tue, 27 Jun 2017 19:29:03 +0800 Subject: [PATCH 0920/1015] msm: camera: sensor:validating the flash initialization parameters Copying the flash initialization parameters from userspace memory to kernel memory and in turn checking for the validity of the flash initialization parameters pointer sent from userspace CRs-Fixed: 2059812 Change-Id: I957c10959108eb08b263d439a9a449b90338b6db Signed-off-by: kaiwang --- .../msm/camera_v2/sensor/flash/msm_flash.c | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c index 22563da2d6d1a..5af0a6a9c79e2 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c +++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c @@ -501,22 +501,44 @@ static int32_t msm_flash_init( return 0; } -#ifdef CONFIG_COMPAT static int32_t msm_flash_init_prepare( struct msm_flash_ctrl_t *flash_ctrl, struct msm_flash_cfg_data_t *flash_data) { +#ifdef CONFIG_COMPAT + struct msm_flash_cfg_data_t flash_data_k; + struct msm_flash_init_info_t flash_init_info; + int32_t i = 0; + if(!is_compat_task()) { + /*for 64-bit usecase,it need copy the data to local memory*/ + flash_data_k.cfg_type = flash_data->cfg_type; + for (i = 0; i < MAX_LED_TRIGGERS; i++) { + flash_data_k.flash_current[i] = + flash_data->flash_current[i]; + flash_data_k.flash_duration[i] = + flash_data->flash_duration[i]; + } + + flash_data_k.cfg.flash_init_info = &flash_init_info; + if (copy_from_user(&flash_init_info, + (void *)(flash_data->cfg.flash_init_info), + sizeof(struct msm_flash_init_info_t))) { + pr_err("%s copy_from_user failed %d\n", + __func__, __LINE__); + return -EFAULT; + } + return msm_flash_init(flash_ctrl, &flash_data_k); + } + /* + * for 32-bit usecase,it already copy the userspace + * data to local memory in msm_flash_subdev_do_ioctl() + * so here do not need copy from user + */ return msm_flash_init(flash_ctrl, flash_data); -} #else -static int32_t msm_flash_init_prepare( - struct msm_flash_ctrl_t *flash_ctrl, - struct msm_flash_cfg_data_t *flash_data) -{ struct msm_flash_cfg_data_t flash_data_k; struct msm_flash_init_info_t flash_init_info; int32_t i = 0; - flash_data_k.cfg_type = flash_data->cfg_type; for (i = 0; i < MAX_LED_TRIGGERS; i++) { flash_data_k.flash_current[i] = @@ -527,15 +549,15 @@ static int32_t msm_flash_init_prepare( flash_data_k.cfg.flash_init_info = &flash_init_info; if (copy_from_user(&flash_init_info, - (void *)(flash_data->cfg.flash_init_info), - sizeof(struct msm_flash_init_info_t))) { - pr_err("%s copy_from_user failed %d\n", - __func__, __LINE__); - return -EFAULT; - } + (void *)(flash_data->cfg.flash_init_info), + sizeof(struct msm_flash_init_info_t))) { + pr_err("%s copy_from_user failed %d\n", + __func__, __LINE__); + return -EFAULT; + } return msm_flash_init(flash_ctrl, &flash_data_k); -} #endif +} static int32_t msm_flash_low( struct msm_flash_ctrl_t *flash_ctrl, From 5ac202d431dab25474f52553c8deadbbb76a83bc Mon Sep 17 00:00:00 2001 From: Hardik Arya Date: Mon, 12 Jun 2017 11:26:05 +0530 Subject: [PATCH 0921/1015] diag: Add proper checks to fix possible out-of-bound issue Currently, there is a possibility of out-of-bound access while processing data received from user space. The patch adds proper checks for valid address. CRs-Fixed: 2048536 Change-Id: I1e0fc7a9d69e69f3326429d5d9540dd3bb1a59b0 Signed-off-by: Hardik Arya --- drivers/char/diag/diagchar_core.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index 9bfb330886012..90bba61d91fe1 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -954,6 +954,11 @@ static int diag_send_raw_data_remote(int proc, void *buf, int len, else hdlc_disabled = driver->hdlc_disabled; if (hdlc_disabled) { + if (len < 4) { + pr_err("diag: In %s, invalid len: %d of non_hdlc pkt", + __func__, len); + return -EBADMSG; + } payload = *(uint16_t *)(buf + 2); if (payload > DIAG_MAX_HDLC_BUF_SIZE) { pr_err("diag: Dropping packet, payload size is %d\n", @@ -962,11 +967,21 @@ static int diag_send_raw_data_remote(int proc, void *buf, int len, } driver->hdlc_encode_buf_len = payload; /* - * Adding 4 bytes for start (1 byte), version (1 byte) and - * payload (2 bytes) + * Adding 5 bytes for start (1 byte), version (1 byte), + * payload (2 bytes) and end (1 byte) */ - memcpy(driver->hdlc_encode_buf, buf + 4, payload); - goto send_data; + if (len == (payload + 5)) { + /* + * Adding 4 bytes for start (1 byte), version (1 byte) + * and payload (2 bytes) + */ + memcpy(driver->hdlc_encode_buf, buf + 4, payload); + goto send_data; + } else { + pr_err("diag: In %s, invalid len: %d of non_hdlc pkt", + __func__, len); + return -EBADMSG; + } } if (hdlc_flag) { From 6d44a276693bde14d774e31595b6b1d84aa27d76 Mon Sep 17 00:00:00 2001 From: John Youn Date: Tue, 16 Feb 2016 20:10:53 -0800 Subject: [PATCH 0922/1015] usb: dwc3: Fix assignment of EP transfer resources The assignement of EP transfer resources was not handled properly in the dwc3 driver. Commit aebda6187181 ("usb: dwc3: Reset the transfer resource index on SET_INTERFACE") previously fixed one aspect of this where resources may be exhausted with multiple calls to SET_INTERFACE. However, it introduced an issue where composite devices with multiple interfaces can be assigned the same transfer resources for different endpoints. This patch solves both issues. The assignment of transfer resources cannot perfectly follow the data book due to the fact that the controller driver does not have all knowledge of the configuration in advance. It is given this information piecemeal by the composite gadget framework after every SET_CONFIGURATION and SET_INTERFACE. Trying to follow the databook programming model in this scenario can cause errors. For two reasons: 1) The databook says to do DEPSTARTCFG for every SET_CONFIGURATION and SET_INTERFACE (8.1.5). This is incorrect in the scenario of multiple interfaces. 2) The databook does not mention doing more DEPXFERCFG for new endpoint on alt setting (8.1.6). The following simplified method is used instead: All hardware endpoints can be assigned a transfer resource and this setting will stay persistent until either a core reset or hibernation. So whenever we do a DEPSTARTCFG(0) we can go ahead and do DEPXFERCFG for every hardware endpoint as well. We are guaranteed that there are as many transfer resources as endpoints. This patch triggers off of the calling dwc3_gadget_start_config() for EP0-out, which always happens first, and which should only happen in one of the above conditions. Fixes: aebda6187181 ("usb: dwc3: Reset the transfer resource index on SET_INTERFACE") Cc: # v3.2+ Reported-by: Ravi Babu Signed-off-by: John Youn Signed-off-by: Felipe Balbi Git-commit: c450960187f45d4260db87c7dd4fc0bceb5565d8 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Signed-off-by: Sriharsha Allenki Change-Id: I36174da25c7a76d3bee3da4746ef9e4b171610f8 --- drivers/usb/dwc3/core.h | 1 - drivers/usb/dwc3/ep0.c | 1 - drivers/usb/dwc3/gadget.c | 73 ++++++++++++++++++++++++++++----------- 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 53b7ed0fad52d..b098801f566a5 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -947,7 +947,6 @@ struct dwc3 { unsigned pullups_connected:1; unsigned resize_fifos:1; unsigned setup_packet_pending:1; - unsigned start_config_issued:1; unsigned three_stage_setup:1; unsigned is_drd:1; diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index ef76e379ad823..a337aba4eb23c 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -575,7 +575,6 @@ static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) int ret; u32 reg; - dwc->start_config_issued = false; cfg = le16_to_cpu(ctrl->wValue); switch (state) { diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 534d2d7d39e4e..a3d0323aed540 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -450,24 +450,66 @@ static void dwc3_free_trb_pool(struct dwc3_ep *dep) } } +static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep); + +/** + * dwc3_gadget_start_config - Configure EP resources + * @dwc: pointer to our controller context structure + * @dep: endpoint that is being enabled + * + * The assignment of transfer resources cannot perfectly follow the + * data book due to the fact that the controller driver does not have + * all knowledge of the configuration in advance. It is given this + * information piecemeal by the composite gadget framework after every + * SET_CONFIGURATION and SET_INTERFACE. Trying to follow the databook + * programming model in this scenario can cause errors. For two + * reasons: + * + * 1) The databook says to do DEPSTARTCFG for every SET_CONFIGURATION + * and SET_INTERFACE (8.1.5). This is incorrect in the scenario of + * multiple interfaces. + * + * 2) The databook does not mention doing more DEPXFERCFG for new + * endpoint on alt setting (8.1.6). + * + * The following simplified method is used instead: + * + * All hardware endpoints can be assigned a transfer resource and this + * setting will stay persistent until either a core reset or + * hibernation. So whenever we do a DEPSTARTCFG(0) we can go ahead and + * do DEPXFERCFG for every hardware endpoint as well. We are + * guaranteed that there are as many transfer resources as endpoints. + * + * This function is called for each endpoint when it is being enabled + * but is triggered only when called for EP0-out, which always happens + * first, and which should only happen in one of the above conditions. + */ static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep) { struct dwc3_gadget_ep_cmd_params params; u32 cmd; + int i; + int ret; + + if (dep->number) + return 0; memset(¶ms, 0x00, sizeof(params)); + cmd = DWC3_DEPCMD_DEPSTARTCFG; - if (dep->number != 1) { - cmd = DWC3_DEPCMD_DEPSTARTCFG; - /* XferRscIdx == 0 for ep0 and 2 for the remaining */ - if (dep->number > 1) { - if (dwc->start_config_issued) - return 0; - dwc->start_config_issued = true; - cmd |= DWC3_DEPCMD_PARAM(2); - } + ret = dwc3_send_gadget_ep_cmd(dwc, 0, cmd, ¶ms); + if (ret) + return ret; + + for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) { + struct dwc3_ep *dep = dwc->eps[i]; + + if (!dep) + continue; - return dwc3_send_gadget_ep_cmd(dwc, 0, cmd, ¶ms); + ret = dwc3_gadget_set_xfer_resource(dwc, dep); + if (ret) + return ret; } return 0; @@ -593,13 +635,6 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, struct dwc3_trb *trb_st_hw; struct dwc3_trb *trb_link; - ret = dwc3_gadget_set_xfer_resource(dwc, dep); - if (ret) { - dev_err(dwc->dev, "set_xfer_resource() failed for %s\n", - dep->name); - return ret; - } - dep->endpoint.desc = desc; dep->comp_desc = comp_desc; dep->type = usb_endpoint_type(desc); @@ -2178,8 +2213,6 @@ static int __dwc3_gadget_start(struct dwc3 *dwc) dwc3_writel(dwc->regs, DWC3_GSBUSCFG1, reg); } - dwc->start_config_issued = false; - /* Start with SuperSpeed Default */ dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512); @@ -2911,7 +2944,6 @@ static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc) dbg_event(0xFF, "DISCONNECT", 0); dwc3_disconnect_gadget(dwc); - dwc->start_config_issued = false; dwc->gadget.speed = USB_SPEED_UNKNOWN; dwc->setup_packet_pending = false; @@ -2990,7 +3022,6 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) dwc3_stop_active_transfers(dwc); dwc3_clear_stall_all_ep(dwc); - dwc->start_config_issued = false; /* bus reset issued due to missing status stage of a control transfer */ dwc->resize_fifos = 0; From 3c067d6da2eb83f0761c0bd3bd1848b6349c0f3f Mon Sep 17 00:00:00 2001 From: Santosh Mardi Date: Tue, 11 Jul 2017 09:41:57 +0530 Subject: [PATCH 0923/1015] cpufreq: flush queued work before freeing policy When system resume and suspend happening at the same time, the resume sequence will schedule the work (policy->update) before policy->update getting chance to run in the meantime suspend or hotplug of an cpu happens at the same time resume is happening, and if the cpu is the last in the cluster policy is freed. This triggers an issue when scheduler tries to schedule the work which is scheduled in resume path But the handles are freed already. Flush the Queued work if any before freeing policy. Change-Id: I41504e7d9c201916457681537ac480c92e7cbe5d Signed-off-by: Santosh Mardi --- drivers/cpufreq/cpufreq.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 84092ca48dcc7..27ffe70cc0d40 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -1514,8 +1514,10 @@ static int __cpufreq_remove_dev_finish(struct device *dev, list_del(&policy->policy_list); write_unlock_irqrestore(&cpufreq_driver_lock, flags); - if (!cpufreq_suspended) + if (!cpufreq_suspended) { + flush_work(&policy->update); cpufreq_policy_free(policy); + } } else if (has_target()) { ret = __cpufreq_governor(policy, CPUFREQ_GOV_START); if (!ret) From 23f0da87e0adb8ccfa006e160e3b1bb5e48a66ea Mon Sep 17 00:00:00 2001 From: Hardik Arya Date: Thu, 15 Jun 2017 10:39:34 +0530 Subject: [PATCH 0924/1015] diag: Add protection while processing non-hdlc packets Currently, there is possibility of out-of-bound accesses during handling of data in non-hdlc path. The patch adds proper protection when processing non-hdlc packet information to fix the issue. CRs-Fixed: 2029216 Change-Id: I07c466f85bd8ac08226948fea86b1d8567e68431 Signed-off-by: Hardik Arya --- drivers/char/diag/diagchar.h | 1 + drivers/char/diag/diagchar_core.c | 1 + drivers/char/diag/diagfwd.c | 44 ++++++++++++++++++++++++------- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/drivers/char/diag/diagchar.h b/drivers/char/diag/diagchar.h index 065196a91aae9..0e74a855eb149 100644 --- a/drivers/char/diag/diagchar.h +++ b/drivers/char/diag/diagchar.h @@ -537,6 +537,7 @@ struct diagchar_dev { unsigned char *buf_feature_mask_update; uint8_t hdlc_disabled; struct mutex hdlc_disable_mutex; + struct mutex hdlc_recovery_mutex; struct timer_list hdlc_reset_timer; struct mutex diag_hdlc_mutex; unsigned char *hdlc_buf; diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index 9bfb330886012..8fd75531bc799 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -3398,6 +3398,7 @@ static int __init diagchar_init(void) mutex_init(&driver->delayed_rsp_mutex); mutex_init(&apps_data_mutex); mutex_init(&driver->msg_mask_lock); + mutex_init(&driver->hdlc_recovery_mutex); for (i = 0; i < NUM_PERIPHERALS; i++) mutex_init(&driver->diagfwd_channel_mutex[i]); init_waitqueue_head(&driver->wait_q); diff --git a/drivers/char/diag/diagfwd.c b/drivers/char/diag/diagfwd.c index 0b94244bafb28..2d79828449312 100644 --- a/drivers/char/diag/diagfwd.c +++ b/drivers/char/diag/diagfwd.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1348,7 +1348,9 @@ static void diag_hdlc_start_recovery(unsigned char *buf, int len, if (start_ptr) { /* Discard any partial packet reads */ + mutex_lock(&driver->hdlc_recovery_mutex); driver->incoming_pkt.processing = 0; + mutex_unlock(&driver->hdlc_recovery_mutex); diag_process_non_hdlc_pkt(start_ptr, len - i, info); } } @@ -1362,18 +1364,24 @@ void diag_process_non_hdlc_pkt(unsigned char *buf, int len, const uint32_t header_len = sizeof(struct diag_pkt_frame_t); struct diag_pkt_frame_t *actual_pkt = NULL; unsigned char *data_ptr = NULL; - struct diag_partial_pkt_t *partial_pkt = &driver->incoming_pkt; + struct diag_partial_pkt_t *partial_pkt = NULL; - if (!buf || len <= 0) + mutex_lock(&driver->hdlc_recovery_mutex); + if (!buf || len <= 0) { + mutex_unlock(&driver->hdlc_recovery_mutex); return; - - if (!partial_pkt->processing) + } + partial_pkt = &driver->incoming_pkt; + if (!partial_pkt->processing) { + mutex_unlock(&driver->hdlc_recovery_mutex); goto start; + } if (partial_pkt->remaining > len) { if ((partial_pkt->read_len + len) > partial_pkt->capacity) { pr_err("diag: Invalid length %d, %d received in %s\n", partial_pkt->read_len, len, __func__); + mutex_unlock(&driver->hdlc_recovery_mutex); goto end; } memcpy(partial_pkt->data + partial_pkt->read_len, buf, len); @@ -1387,6 +1395,7 @@ void diag_process_non_hdlc_pkt(unsigned char *buf, int len, pr_err("diag: Invalid length during partial read %d, %d received in %s\n", partial_pkt->read_len, partial_pkt->remaining, __func__); + mutex_unlock(&driver->hdlc_recovery_mutex); goto end; } memcpy(partial_pkt->data + partial_pkt->read_len, buf, @@ -1400,20 +1409,27 @@ void diag_process_non_hdlc_pkt(unsigned char *buf, int len, if (partial_pkt->remaining == 0) { actual_pkt = (struct diag_pkt_frame_t *)(partial_pkt->data); data_ptr = partial_pkt->data + header_len; - if (*(uint8_t *)(data_ptr + actual_pkt->length) != CONTROL_CHAR) + if (*(uint8_t *)(data_ptr + actual_pkt->length) != + CONTROL_CHAR) { + mutex_unlock(&driver->hdlc_recovery_mutex); diag_hdlc_start_recovery(buf, len, info); + mutex_lock(&driver->hdlc_recovery_mutex); + } err = diag_process_apps_pkt(data_ptr, actual_pkt->length, info); if (err) { pr_err("diag: In %s, unable to process incoming data packet, err: %d\n", __func__, err); + mutex_unlock(&driver->hdlc_recovery_mutex); goto end; } partial_pkt->read_len = 0; partial_pkt->total_len = 0; partial_pkt->processing = 0; + mutex_unlock(&driver->hdlc_recovery_mutex); goto start; } + mutex_unlock(&driver->hdlc_recovery_mutex); goto end; start: @@ -1426,14 +1442,14 @@ void diag_process_non_hdlc_pkt(unsigned char *buf, int len, diag_send_error_rsp(buf, len); goto end; } - + mutex_lock(&driver->hdlc_recovery_mutex); if (pkt_len + header_len > partial_pkt->capacity) { pr_err("diag: In %s, incoming data is too large for the request buffer %d\n", __func__, pkt_len); + mutex_unlock(&driver->hdlc_recovery_mutex); diag_hdlc_start_recovery(buf, len, info); break; } - if ((pkt_len + header_len) > (len - read_bytes)) { partial_pkt->read_len = len - read_bytes; partial_pkt->total_len = pkt_len + header_len; @@ -1441,19 +1457,27 @@ void diag_process_non_hdlc_pkt(unsigned char *buf, int len, partial_pkt->read_len; partial_pkt->processing = 1; memcpy(partial_pkt->data, buf, partial_pkt->read_len); + mutex_unlock(&driver->hdlc_recovery_mutex); break; } data_ptr = buf + header_len; - if (*(uint8_t *)(data_ptr + actual_pkt->length) != CONTROL_CHAR) + if (*(uint8_t *)(data_ptr + actual_pkt->length) != + CONTROL_CHAR) { + mutex_unlock(&driver->hdlc_recovery_mutex); diag_hdlc_start_recovery(buf, len, info); + mutex_lock(&driver->hdlc_recovery_mutex); + } else hdlc_reset = 0; err = diag_process_apps_pkt(data_ptr, actual_pkt->length, info); - if (err) + if (err) { + mutex_unlock(&driver->hdlc_recovery_mutex); break; + } read_bytes += header_len + pkt_len + 1; buf += header_len + pkt_len + 1; /* advance to next pkt */ + mutex_unlock(&driver->hdlc_recovery_mutex); } end: return; From bd328e73c976c3c234b6427a4b7c338863542480 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Mon, 12 Jun 2017 09:16:42 -0600 Subject: [PATCH 0925/1015] drm/msm: Fix possible overflow issue in submit_cmd When verifying that the submit_cmd offset and size do not exceed the bounds of the GEM object make sure to cast the math operation into a suitably large buffer to account for overflow. Change-Id: Ic0dedbad97513ee538d539e771038b3cf0405e91 Signed-off-by: Jordan Crouse Signed-off-by: Sharat Masetty --- drivers/gpu/drm/msm/msm_gem_submit.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index cd0554f68316e..b024abf7be810 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -360,7 +360,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, void __user *userptr = to_user_ptr(args->cmds + (i * sizeof(submit_cmd))); struct msm_gem_object *msm_obj; - uint32_t iova; + uint64_t iova; + size_t size; ret = copy_from_user(&submit_cmd, userptr, sizeof(submit_cmd)); if (ret) { @@ -392,9 +393,12 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, goto out; } - if ((submit_cmd.size + submit_cmd.submit_offset) >= - msm_obj->base.size) { - DRM_ERROR("invalid cmdstream size: %u\n", submit_cmd.size); + size = submit_cmd.size + submit_cmd.submit_offset; + + if (!submit_cmd.size || (size < submit_cmd.size) || + (size > msm_obj->base.size)) { + DRM_ERROR("invalid cmdstream offset/size: %u/%u\n", + submit_cmd.submit_offset, submit_cmd.size); ret = -EINVAL; goto out; } From 6ceb7f271c6d2004bad99437aaf2662cf766de77 Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Tue, 11 Jul 2017 17:21:01 +0530 Subject: [PATCH 0926/1015] usb: dwc3: gadget: Fix start transfer errors for ISOC endpoints If the end transfer does not happen on ISOC endpoints as a part of endpoint disable during set alt transitions; the consequent start transfers are failed. Fix this by explicitly doing stop active transfers on ISOC endpoints during endpoint disable. Change-Id: I66f8c7d10cfee4ba1c816ad0c1d2486f86936d34 Signed-off-by: Sriharsha Allenki --- drivers/usb/dwc3/gadget.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 534d2d7d39e4e..6577eac1813c4 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -640,6 +640,8 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) dwc3_gadget_giveback(dep, req, -ESHUTDOWN); } + } else if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { + dwc3_stop_active_transfer(dwc, dep->number, true); } while (!list_empty(&dep->request_list)) { From 1fc0c53758c2875ea06a9e6e814c18bc99589cad Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Wed, 2 Nov 2016 16:17:30 +0530 Subject: [PATCH 0927/1015] MMC : cmdq_hci: clear interrupt after halt in case of error During error scenario, if interrupt status of CQ controller is cleared before halting the controller, the CQ controller can send commands to card in the time delay between clearing of interrupt and halting. The response of card to these commands can overwrite the error information stored in Response Arg register. So, if an error is detected, the CQ must be halted first and then the interrupt must be cleared. Change-Id: Ief7039226b01b50fc71cf17a4eb625afd8c9bd06 Signed-off-by: Vijay Viswanath --- drivers/mmc/host/cmdq_hci.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/host/cmdq_hci.c b/drivers/mmc/host/cmdq_hci.c index b759613efe2c8..de8fb69d9c92c 100644 --- a/drivers/mmc/host/cmdq_hci.c +++ b/drivers/mmc/host/cmdq_hci.c @@ -804,7 +804,6 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) u32 dbr_set = 0; status = cmdq_readl(cq_host, CQIS); - cmdq_writel(cq_host, status, CQIS); if (!status && !err) return IRQ_NONE; @@ -827,6 +826,17 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) if (ret) pr_err("%s: %s: halt failed ret=%d\n", mmc_hostname(mmc), __func__, ret); + + /* + * Clear the CQIS after halting incase of error. This is done + * because if CQIS is cleared before halting, the CQ will + * continue with issueing commands for rest of requests with + * Doorbell rung. This will overwrite the Resp Arg register. + * So CQ must be halted first and then CQIS cleared incase + * of error + */ + cmdq_writel(cq_host, status, CQIS); + cmdq_dumpregs(cq_host); if (!err_info) { @@ -915,13 +925,15 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) mrq->cmdq_req->resp_err = true; pr_err("%s: Response error (0x%08x) from card !!!", - mmc_hostname(mmc), status); + mmc_hostname(mmc), cmdq_readl(cq_host, CQCRA)); } else { mrq->cmdq_req->resp_idx = cmdq_readl(cq_host, CQCRI); mrq->cmdq_req->resp_arg = cmdq_readl(cq_host, CQCRA); } cmdq_finish_data(mmc, tag); + } else { + cmdq_writel(cq_host, status, CQIS); } if (status & CQIS_TCC) { From 7623f8c5f6f157b8f557f4a7769eaa60eacd3243 Mon Sep 17 00:00:00 2001 From: Vijay Viswanath Date: Wed, 2 Nov 2016 16:17:30 +0530 Subject: [PATCH 0928/1015] MMC : card: Check for card status incase of timeout error Timeout errors can occur because of execution error in device during execution of last command. For errors encountered while executing commands in card, like cmd46 or 47, the card will stop execution and wait for the next command from controller to return error information. If controller sends no command, then a timeout error will occur. To retrieve the error information in card, send status command must be sent. In case a non-timeout error like RED error is detected, there is no need to send CMD13 to card as the error information is already present in the Resp Arg register. Change-Id: I6ac0d3db834a3d5a6c67ee08d6232240c35714ff Signed-off-by: Vijay Viswanath --- drivers/mmc/card/block.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index eb54463893c89..80a3cc1a4977d 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -3133,15 +3133,23 @@ static void mmc_blk_cmdq_err(struct mmc_queue *mq) /* RED error - Fatal: requires reset */ if (mrq->cmdq_req->resp_err) { err = mrq->cmdq_req->resp_err; + goto reset; + } + + /* + * TIMEOUT errrors can happen because of execution error + * in the last command. So send cmd 13 to get device status + */ + if ((mrq->cmd && (mrq->cmd->error == -ETIMEDOUT)) || + (mrq->data && (mrq->data->error == -ETIMEDOUT))) { if (mmc_host_halt(host) || mmc_host_cq_disable(host)) { ret = get_card_status(host->card, &status, 0); if (ret) pr_err("%s: CMD13 failed with err %d\n", mmc_hostname(host), ret); } - pr_err("%s: Response error detected with device status 0x%08x\n", + pr_err("%s: Timeout error detected with device status 0x%08x\n", mmc_hostname(host), status); - goto reset; } /* From 704512a933415f38c190d21e28bcd2dd122dc4b8 Mon Sep 17 00:00:00 2001 From: Sunil Khatri Date: Thu, 6 Jul 2017 15:09:35 +0530 Subject: [PATCH 0929/1015] msm: kgsl: Use vma_area_struct with proper locks Make sure to use proper locks when using the vma_struct_area. This will avoid the race condition in a scenario where one thread gets a vma_struct_area and other thread is unmapping the vma from the process. Change-Id: I6c7837d1a8dd24fc6955ab5be8b1917a42f2cb53 Signed-off-by: Sunil Khatri --- drivers/gpu/msm/kgsl.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 1a1c87c59238f..e022e0ef7c05d 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -2110,21 +2110,23 @@ static int kgsl_setup_dmabuf_useraddr(struct kgsl_device *device, if (fd != 0) dmabuf = dma_buf_get(fd - 1); } - up_read(¤t->mm->mmap_sem); - if (IS_ERR_OR_NULL(dmabuf)) + if (IS_ERR_OR_NULL(dmabuf)) { + up_read(¤t->mm->mmap_sem); return dmabuf ? PTR_ERR(dmabuf) : -ENODEV; + } ret = kgsl_setup_dma_buf(device, pagetable, entry, dmabuf); if (ret) { dma_buf_put(dmabuf); + up_read(¤t->mm->mmap_sem); return ret; } /* Setup the user addr/cache mode for cache operations */ entry->memdesc.useraddr = hostptr; _setup_cache_mode(entry, vma); - + up_read(¤t->mm->mmap_sem); return 0; } #else From 0bb6ed9b41ef04b76d0cbf3fafcb6b2cb7fb2311 Mon Sep 17 00:00:00 2001 From: Sarada Prasanna Garnayak Date: Thu, 29 Jun 2017 15:27:43 +0530 Subject: [PATCH 0930/1015] cnss_pci: fix the race condition in firmware file setup Add protection code to avoid the redundant firmware setup from the userspace. Synchronize firmware setup global data access by multiple firmware setup routines when firmware setup triggered by userspace is in progress. CRs-Fixed: 2053638 Change-Id: Ib5bf05aade464a0789c7b848457e95d25c4e6f8f Signed-off-by: Sarada Prasanna Garnayak --- drivers/net/wireless/cnss/cnss_pci.c | 62 +++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c index d12f48a1db187..4f6eeda76f9f2 100644 --- a/drivers/net/wireless/cnss/cnss_pci.c +++ b/drivers/net/wireless/cnss/cnss_pci.c @@ -137,6 +137,7 @@ static DEFINE_SPINLOCK(pci_link_down_lock); #define FW_IMAGE_MISSION (0x02) #define FW_IMAGE_BDATA (0x03) #define FW_IMAGE_PRINT (0x04) +#define FW_SETUP_DELAY 2000 #define SEG_METADATA (0x01) #define SEG_NON_PAGED (0x02) @@ -249,7 +250,7 @@ static struct cnss_data { struct pci_saved_state *saved_state; u16 revision_id; bool recovery_in_progress; - bool fw_available; + atomic_t fw_available; struct codeswap_codeseg_info *cnss_seg_info; /* Virtual Address of the DMA page */ void *codeseg_cpuaddr[CODESWAP_MAX_CODESEGS]; @@ -278,6 +279,10 @@ static struct cnss_data { u32 fw_dma_size; u32 fw_seg_count; struct segment_memory fw_seg_mem[MAX_NUM_OF_SEGMENTS]; + atomic_t fw_store_in_progress; + /* Firmware setup complete lock */ + struct mutex fw_setup_stat_lock; + struct completion fw_setup_complete; void *bdata_cpu; dma_addr_t bdata_dma; u32 bdata_dma_size; @@ -1432,10 +1437,21 @@ int cnss_get_fw_image(struct image_desc_info *image_desc_info) !penv->fw_seg_count || !penv->bdata_seg_count) return -EINVAL; + /* Check for firmware setup trigger by usersapce is in progress + * and wait for complition of firmware setup. + */ + + if (atomic_read(&penv->fw_store_in_progress)) { + wait_for_completion_timeout(&penv->fw_setup_complete, + msecs_to_jiffies(FW_SETUP_DELAY)); + } + + mutex_lock(&penv->fw_setup_stat_lock); image_desc_info->fw_addr = penv->fw_dma; image_desc_info->fw_size = penv->fw_dma_size; image_desc_info->bdata_addr = penv->bdata_dma; image_desc_info->bdata_size = penv->bdata_dma_size; + mutex_unlock(&penv->fw_setup_stat_lock); return 0; } @@ -1624,7 +1640,7 @@ static int cnss_wlan_pci_probe(struct pci_dev *pdev, penv->pdev = pdev; penv->id = id; - penv->fw_available = false; + atomic_set(&penv->fw_available, 0); penv->device_id = pdev->device; if (penv->smmu_iova_len) { @@ -1930,8 +1946,19 @@ static ssize_t fw_image_setup_store(struct device *dev, if (!penv) return -ENODEV; - if (sscanf(buf, "%d", &val) != 1) + if (atomic_read(&penv->fw_store_in_progress)) { + pr_info("%s: Firmware setup in progress\n", __func__); + return 0; + } + + atomic_set(&penv->fw_store_in_progress, 1); + init_completion(&penv->fw_setup_complete); + + if (kstrtoint(buf, 0, &val)) { + atomic_set(&penv->fw_store_in_progress, 0); + complete(&penv->fw_setup_complete); return -EINVAL; + } if (val == FW_IMAGE_FTM || val == FW_IMAGE_MISSION || val == FW_IMAGE_BDATA) { @@ -1940,6 +1967,8 @@ static ssize_t fw_image_setup_store(struct device *dev, if (ret != 0) { pr_err("%s: Invalid parsing of FW image files %d", __func__, ret); + atomic_set(&penv->fw_store_in_progress, 0); + complete(&penv->fw_setup_complete); return -EINVAL; } penv->fw_image_setup = val; @@ -1949,6 +1978,9 @@ static ssize_t fw_image_setup_store(struct device *dev, penv->bmi_test = val; } + atomic_set(&penv->fw_store_in_progress, 0); + complete(&penv->fw_setup_complete); + return count; } @@ -2051,7 +2083,7 @@ int cnss_get_codeswap_struct(struct codeswap_codeseg_info *swap_seg) swap_seg = NULL; return -ENOENT; } - if (!penv->fw_available) { + if (!atomic_read(&penv->fw_available)) { pr_debug("%s: fw is not available\n", __func__); return -ENOENT; } @@ -2076,27 +2108,41 @@ static void cnss_wlan_memory_expansion(void) struct pci_dev *pdev; filename = cnss_wlan_get_evicted_data_file(); + /* Check for firmware setup trigger by usersapce is in progress + * and wait for complition of firmware setup. + */ + + if (atomic_read(&penv->fw_store_in_progress)) { + wait_for_completion_timeout(&penv->fw_setup_complete, + msecs_to_jiffies(FW_SETUP_DELAY)); + } + + mutex_lock(&penv->fw_setup_stat_lock); pdev = penv->pdev; dev = &pdev->dev; cnss_seg_info = penv->cnss_seg_info; if (!cnss_seg_info) { pr_debug("cnss: cnss_seg_info is NULL\n"); + mutex_unlock(&penv->fw_setup_stat_lock); goto end; } - if (penv->fw_available) { + if (atomic_read(&penv->fw_available)) { pr_debug("cnss: fw code already copied to host memory\n"); + mutex_unlock(&penv->fw_setup_stat_lock); goto end; } if (request_firmware(&fw_entry, filename, dev) != 0) { pr_debug("cnss: failed to get fw: %s\n", filename); + mutex_unlock(&penv->fw_setup_stat_lock); goto end; } if (!fw_entry || !fw_entry->data) { pr_err("%s: INVALID FW entries\n", __func__); + mutex_unlock(&penv->fw_setup_stat_lock); goto release_fw; } @@ -2131,7 +2177,9 @@ static void cnss_wlan_memory_expansion(void) } pr_debug("cnss: total_bytes copied: %d\n", total_length); cnss_seg_info->codeseg_total_bytes = total_length; - penv->fw_available = 1; + + atomic_set(&penv->fw_available, 1); + mutex_unlock(&penv->fw_setup_stat_lock); release_fw: release_firmware(fw_entry); @@ -3038,6 +3086,8 @@ static int cnss_probe(struct platform_device *pdev) memset(phys_to_virt(0), 0, SZ_4K); #endif + atomic_set(&penv->fw_store_in_progress, 0); + mutex_init(&penv->fw_setup_stat_lock); ret = device_create_file(dev, &dev_attr_fw_image_setup); if (ret) { pr_err("cnss: fw_image_setup sys file creation failed\n"); From 87e3dfa6e241777b02561a29b506b78a287c4e77 Mon Sep 17 00:00:00 2001 From: Veerabhadrarao Badiganti Date: Wed, 21 Jun 2017 19:27:32 +0530 Subject: [PATCH 0931/1015] mmc: sdhci-msm: Don't turnoff Vcc during initialization As per emmc specification, device should be notified either with power-off or sleep notification before turning off the Vcc. Failing to do so might affect the device longevity. In mmc driver initialization phase even before device probing gets completed, Vcc is getting turned off without these notifications. Since it can't send commands at this stage, So just ensure that Vcc is not turned off till initialization gets completed. Change-Id: I0bbf0077357d66c888147be40a0c5d312b9ce063 Signed-off-by: Veerabhadrarao Badiganti --- drivers/mmc/host/sdhci-msm.c | 23 ++++++----------------- drivers/mmc/host/sdhci-msm.h | 1 + 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index dfb8c5f2fd4c2..9f7155070b30b 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -2181,21 +2181,6 @@ static int sdhci_msm_setup_vreg(struct sdhci_msm_pltfm_data *pdata, return ret; } -/* - * Reset vreg by ensuring it is off during probe. A call - * to enable vreg is needed to balance disable vreg - */ -static int sdhci_msm_vreg_reset(struct sdhci_msm_pltfm_data *pdata) -{ - int ret; - - ret = sdhci_msm_setup_vreg(pdata, 1, true); - if (ret) - return ret; - ret = sdhci_msm_setup_vreg(pdata, 0, true); - return ret; -} - /* This init function should be called only once for each SDHC slot */ static int sdhci_msm_vreg_init(struct device *dev, struct sdhci_msm_pltfm_data *pdata, @@ -2230,7 +2215,7 @@ static int sdhci_msm_vreg_init(struct device *dev, if (ret) goto vdd_reg_deinit; } - ret = sdhci_msm_vreg_reset(pdata); + if (ret) dev_err(dev, "vreg reset failed (%d)\n", ret); goto out; @@ -2396,7 +2381,9 @@ static irqreturn_t sdhci_msm_pwr_irq(int irq, void *data) io_level = REQ_IO_HIGH; } if (irq_status & CORE_PWRCTL_BUS_OFF) { - ret = sdhci_msm_setup_vreg(msm_host->pdata, false, false); + if (msm_host->pltfm_init_done) + ret = sdhci_msm_setup_vreg(msm_host->pdata, + false, false); if (!ret) { ret = sdhci_msm_setup_pins(msm_host->pdata, false); ret |= sdhci_msm_set_vdd_io_vol(msm_host->pdata, @@ -4341,6 +4328,8 @@ static int sdhci_msm_probe(struct platform_device *pdev) goto free_cd_gpio; } + msm_host->pltfm_init_done = true; + pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); pm_runtime_set_autosuspend_delay(&pdev->dev, MSM_AUTOSUSPEND_DELAY_MS); diff --git a/drivers/mmc/host/sdhci-msm.h b/drivers/mmc/host/sdhci-msm.h index e47a5083e8a6a..c3ba28dc967c6 100644 --- a/drivers/mmc/host/sdhci-msm.h +++ b/drivers/mmc/host/sdhci-msm.h @@ -214,6 +214,7 @@ struct sdhci_msm_host { bool pm_qos_group_enable; struct sdhci_msm_pm_qos_irq pm_qos_irq; bool tuning_in_progress; + bool pltfm_init_done; }; extern char *saved_command_line; From f8e3d576db7764f48d3d1fc9dcde582154c8fb72 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Fri, 28 Apr 2017 13:32:32 -0700 Subject: [PATCH 0932/1015] qseecom: add bus scaling support for GP operations When a GP application is loaded and the crypto engine is accessed, a NOC error will happen if CE clock is not enabled. Thus, add bus scaling support for GP operations. Change-Id: I59d63be9e08b2c135edc6ec224ec1a355434e1ec Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 157 ++++++++++++++++++++--------------------- 1 file changed, 76 insertions(+), 81 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 74e9fa4f11fe6..cb01bf46d14f3 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -6779,6 +6779,60 @@ static void __qseecom_clean_data_sglistinfo(struct qseecom_dev_handle *data) } } + +static int __qseecom_bus_scaling_enable(struct qseecom_dev_handle *data, + bool *perf_enabled) +{ + int ret = 0; + + if (qseecom.support_bus_scaling) { + if (!data->mode) { + mutex_lock(&qsee_bw_mutex); + __qseecom_register_bus_bandwidth_needs( + data, HIGH); + mutex_unlock(&qsee_bw_mutex); + } + ret = qseecom_scale_bus_bandwidth_timer(INACTIVE); + if (ret) { + pr_err("Failed to set bw\n"); + ret = -EINVAL; + goto exit; + } + } + /* + * On targets where crypto clock is handled by HLOS, + * if clk_access_cnt is zero and perf_enabled is false, + * then the crypto clock was not enabled before sending cmd + * to tz, qseecom will enable the clock to avoid service failure. + */ + if (!qseecom.no_clock_support && + !qseecom.qsee.clk_access_cnt && !data->perf_enabled) { + pr_debug("ce clock is not enabled\n"); + ret = qseecom_perf_enable(data); + if (ret) { + pr_err("Failed to vote for clock with err %d\n", + ret); + ret = -EINVAL; + goto exit; + } + *perf_enabled = true; + } +exit: + return ret; +} + +static void __qseecom_bus_scaling_disable(struct qseecom_dev_handle *data, + bool perf_enabled) +{ + if (qseecom.support_bus_scaling) + __qseecom_add_bw_scale_down_timer( + QSEECOM_SEND_CMD_CRYPTO_TIMEOUT); + if (perf_enabled) { + qsee_disable_clock_vote(data, CLK_DFAB); + qsee_disable_clock_vote(data, CLK_SFPB); + } +} + long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) { int ret = 0; @@ -6845,50 +6899,14 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* Only one client allowed here at a time */ mutex_lock(&app_access_lock); - if (qseecom.support_bus_scaling) { - /* register bus bw in case the client doesn't do it */ - if (!data->mode) { - mutex_lock(&qsee_bw_mutex); - __qseecom_register_bus_bandwidth_needs( - data, HIGH); - mutex_unlock(&qsee_bw_mutex); - } - ret = qseecom_scale_bus_bandwidth_timer(INACTIVE); - if (ret) { - pr_err("Failed to set bw.\n"); - ret = -EINVAL; - mutex_unlock(&app_access_lock); - break; - } - } - /* - * On targets where crypto clock is handled by HLOS, - * if clk_access_cnt is zero and perf_enabled is false, - * then the crypto clock was not enabled before sending cmd - * to tz, qseecom will enable the clock to avoid service failure. - */ - if (!qseecom.no_clock_support && - !qseecom.qsee.clk_access_cnt && !data->perf_enabled) { - pr_debug("ce clock is not enabled!\n"); - ret = qseecom_perf_enable(data); - if (ret) { - pr_err("Failed to vote for clock with err %d\n", - ret); - mutex_unlock(&app_access_lock); - ret = -EINVAL; - break; - } - perf_enabled = true; + ret = __qseecom_bus_scaling_enable(data, &perf_enabled); + if (ret) { + mutex_unlock(&app_access_lock); + break; } atomic_inc(&data->ioctl_count); ret = qseecom_send_cmd(data, argp); - if (qseecom.support_bus_scaling) - __qseecom_add_bw_scale_down_timer( - QSEECOM_SEND_CMD_CRYPTO_TIMEOUT); - if (perf_enabled) { - qsee_disable_clock_vote(data, CLK_DFAB); - qsee_disable_clock_vote(data, CLK_SFPB); - } + __qseecom_bus_scaling_disable(data, perf_enabled); atomic_dec(&data->ioctl_count); wake_up_all(&data->abort_wq); mutex_unlock(&app_access_lock); @@ -6907,52 +6925,17 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* Only one client allowed here at a time */ mutex_lock(&app_access_lock); - if (qseecom.support_bus_scaling) { - if (!data->mode) { - mutex_lock(&qsee_bw_mutex); - __qseecom_register_bus_bandwidth_needs( - data, HIGH); - mutex_unlock(&qsee_bw_mutex); - } - ret = qseecom_scale_bus_bandwidth_timer(INACTIVE); - if (ret) { - pr_err("Failed to set bw.\n"); - mutex_unlock(&app_access_lock); - ret = -EINVAL; - break; - } - } - /* - * On targets where crypto clock is handled by HLOS, - * if clk_access_cnt is zero and perf_enabled is false, - * then the crypto clock was not enabled before sending cmd - * to tz, qseecom will enable the clock to avoid service failure. - */ - if (!qseecom.no_clock_support && - !qseecom.qsee.clk_access_cnt && !data->perf_enabled) { - pr_debug("ce clock is not enabled!\n"); - ret = qseecom_perf_enable(data); - if (ret) { - pr_err("Failed to vote for clock with err %d\n", - ret); - mutex_unlock(&app_access_lock); - ret = -EINVAL; - break; - } - perf_enabled = true; + ret = __qseecom_bus_scaling_enable(data, &perf_enabled); + if (ret) { + mutex_unlock(&app_access_lock); + break; } atomic_inc(&data->ioctl_count); if (cmd == QSEECOM_IOCTL_SEND_MODFD_CMD_REQ) ret = qseecom_send_modfd_cmd(data, argp); else ret = qseecom_send_modfd_cmd_64(data, argp); - if (qseecom.support_bus_scaling) - __qseecom_add_bw_scale_down_timer( - QSEECOM_SEND_CMD_CRYPTO_TIMEOUT); - if (perf_enabled) { - qsee_disable_clock_vote(data, CLK_DFAB); - qsee_disable_clock_vote(data, CLK_SFPB); - } + __qseecom_bus_scaling_disable(data, perf_enabled); atomic_dec(&data->ioctl_count); wake_up_all(&data->abort_wq); mutex_unlock(&app_access_lock); @@ -7354,8 +7337,14 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* Only one client allowed here at a time */ mutex_lock(&app_access_lock); + ret = __qseecom_bus_scaling_enable(data, &perf_enabled); + if (ret) { + mutex_unlock(&app_access_lock); + break; + } atomic_inc(&data->ioctl_count); ret = qseecom_qteec_open_session(data, argp); + __qseecom_bus_scaling_disable(data, perf_enabled); atomic_dec(&data->ioctl_count); wake_up_all(&data->abort_wq); mutex_unlock(&app_access_lock); @@ -7403,8 +7392,14 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* Only one client allowed here at a time */ mutex_lock(&app_access_lock); + ret = __qseecom_bus_scaling_enable(data, &perf_enabled); + if (ret) { + mutex_unlock(&app_access_lock); + break; + } atomic_inc(&data->ioctl_count); ret = qseecom_qteec_invoke_modfd_cmd(data, argp); + __qseecom_bus_scaling_disable(data, perf_enabled); atomic_dec(&data->ioctl_count); wake_up_all(&data->abort_wq); mutex_unlock(&app_access_lock); From c7a45fb09e05c18b92bd666f88a554237016d131 Mon Sep 17 00:00:00 2001 From: Preeti U Murthy Date: Wed, 21 Jan 2015 16:27:25 +0530 Subject: [PATCH 0933/1015] sched/idle: Add missing checks to the exit condition of cpu_idle_poll() cpu_idle_poll() is entered into when either the cpu_idle_force_poll is set or tick_check_broadcast_expired() returns true. The exit condition from cpu_idle_poll() is tif_need_resched(). However this does not take into account scenarios where cpu_idle_force_poll changes or tick_check_broadcast_expired() returns false, without setting the resched flag. So a cpu will be caught in cpu_idle_poll() needlessly, thereby wasting power. Add an explicit check on cpu_idle_force_poll and tick_check_broadcast_expired() to the exit condition of cpu_idle_poll() to avoid this. Change-Id: I9e48347dba41ee9980afa00e0fe5be0fdddb5e6e Signed-off-by: Preeti U Murthy Reviewed-by: Thomas Gleixner Signed-off-by: Peter Zijlstra (Intel) Cc: linuxppc-dev@lists.ozlabs.org Cc: Linus Torvalds Link: http://lkml.kernel.org/r/20150121105655.15279.59626.stgit@preeti.in.ibm.com Signed-off-by: Ingo Molnar Git-commit: ff6f2d29bd31cdfa1ac494a8b26d2af8ba887d59 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Signed-off-by: Srinivasarao P --- kernel/sched/idle.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c index c232a2c2066a2..7d0cc80f1a885 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -47,7 +47,8 @@ static inline int cpu_idle_poll(void) rcu_idle_enter(); trace_cpu_idle_rcuidle(0, smp_processor_id()); local_irq_enable(); - while (!tif_need_resched()) + while (!tif_need_resched() && + (cpu_idle_force_poll || tick_check_broadcast_expired())) cpu_relax(); trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id()); rcu_idle_exit(); From 7419d035d6502a0b8da3c29c5eeb2fcd9e71724b Mon Sep 17 00:00:00 2001 From: Ajay Agarwal Date: Tue, 13 Jun 2017 10:59:17 +0530 Subject: [PATCH 0934/1015] usb: f_mtp: Check number of iterations before division If no MTP transfers have taken place and the user checks MTP status using cat /sys/kernel/debug/usb_mtp/status Then number of iterations will be 0 and a division by 0 (sum/iteration) would happen in debug_mtp_read_stats resulting in device crash. Fix this by checking if num of iterations is >0 and only then division; else 0. Change-Id: I87ba6daac04d1dfb90409f1a2da15e6659976926 Signed-off-by: Ajay Agarwal --- drivers/usb/gadget/function/f_mtp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/usb/gadget/function/f_mtp.c b/drivers/usb/gadget/function/f_mtp.c index 36cfda1a21944..6f5969135ca36 100644 --- a/drivers/usb/gadget/function/f_mtp.c +++ b/drivers/usb/gadget/function/f_mtp.c @@ -1588,7 +1588,7 @@ static int debug_mtp_read_stats(struct seq_file *s, void *unused) } seq_printf(s, "vfs_write(time in usec) min:%d\t max:%d\t avg:%d\n", - min, max, sum / iteration); + min, max, (iteration ? (sum / iteration) : 0)); min = max = sum = iteration = 0; seq_puts(s, "\n=======================\n"); seq_puts(s, "MTP Read Stats:\n"); @@ -1610,7 +1610,7 @@ static int debug_mtp_read_stats(struct seq_file *s, void *unused) } seq_printf(s, "vfs_read(time in usec) min:%d\t max:%d\t avg:%d\n", - min, max, sum / iteration); + min, max, (iteration ? (sum / iteration) : 0)); spin_unlock_irqrestore(&dev->lock, flags); return 0; } From 0362003e4abef598602379204a1656f193057be4 Mon Sep 17 00:00:00 2001 From: Sachin Bhayare Date: Fri, 12 May 2017 11:23:38 +0530 Subject: [PATCH 0935/1015] msm: mdss: Fix possible integer overflow Avoid possible integer overflow while validating mdp3 image parameters. Change-Id: Ifd972134a23f653cf38134510d98dec5a604d2bc CRs-Fixed: 1107055 Signed-off-by: Sachin Bhayare --- drivers/video/msm/mdss/mdp3_ppp.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/video/msm/mdss/mdp3_ppp.c b/drivers/video/msm/mdss/mdp3_ppp.c index 2eeecf046dbcc..682d3b002e4e7 100644 --- a/drivers/video/msm/mdss/mdp3_ppp.c +++ b/drivers/video/msm/mdss/mdp3_ppp.c @@ -37,6 +37,7 @@ #define MDP_PPP_MAX_BPP 4 #define MDP_PPP_DYNAMIC_FACTOR 3 #define MDP_PPP_MAX_READ_WRITE 3 +#define MDP_PPP_MAX_WIDTH 0xFFF #define ENABLE_SOLID_FILL 0x2 #define DISABLE_SOLID_FILL 0x0 #define BLEND_LATENCY 3 @@ -150,6 +151,11 @@ int mdp3_ppp_get_img(struct mdp_img *img, struct mdp_blit_req *req, return -EINVAL; } + if (img->width > MDP_PPP_MAX_WIDTH) { + pr_err("%s incorrect width %d\n", __func__, img->width); + return -EINVAL; + } + fb_data.flags = img->priv; fb_data.memory_id = img->memory_id; fb_data.offset = 0; From ee80595700aa826fa2dac1e2f64b8dcce0f00bab Mon Sep 17 00:00:00 2001 From: Patrick Fay Date: Mon, 19 Jun 2017 20:20:40 -0700 Subject: [PATCH 0936/1015] Perf: arm64: avoid use of uninitialized variable Variable "buf" is not initialized. It may contain the data from stack when "count == 0". Kernel information leak is possible due to different code path execution. Change-Id: I041b2e7262f7f66a9b039c0f0591bbb1fc9e4890 Signed-off-by: Patrick Fay --- arch/arm64/kernel/perf_trace_counters.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kernel/perf_trace_counters.c b/arch/arm64/kernel/perf_trace_counters.c index ffcf3d00bd5d4..0fb98052b5865 100644 --- a/arch/arm64/kernel/perf_trace_counters.c +++ b/arch/arm64/kernel/perf_trace_counters.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2014, 2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -124,6 +124,7 @@ static ssize_t write_enabled_perftp_file_bool(struct file *file, char buf[32]; size_t buf_size; + buf[0] = 0; buf_size = min(count, (sizeof(buf)-1)); if (copy_from_user(buf, user_buf, buf_size)) return -EFAULT; From 28d874cb9902dc916ef9853b698be7300946fef2 Mon Sep 17 00:00:00 2001 From: Venkateswara Rao Tadikonda Date: Tue, 27 Jun 2017 13:05:10 +0530 Subject: [PATCH 0937/1015] msm: kgsl: Fix a dead loop issue while changing gpu frequency There is a dead loop in kgsl_devfreq_target(), while governor request to change GPU frequency. In governor 'userspace' mode, If the requested frequency (set_freq) is more than the configured frequency and max_freq is also set to more than the configured frequency, then there is a dead loop while changing target frequency. Dead loop occurs due to comparing signed integer 'i' with unsigned integer 'max_pwrlevel'. Decrementing 'i' beyond zero will cause dead loop. So, change the array index 'i' of pwrlevels[] to unsigned int, which can't be decremented beyond zero. Also, changing loop condition to restrict 'i' within permitted levels. Change-Id: Ic82b7477d50d1abcd348b011f64246066887922c Signed-off-by: Venkateswara Rao Tadikonda --- drivers/gpu/msm/kgsl_pwrscale.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/msm/kgsl_pwrscale.c b/drivers/gpu/msm/kgsl_pwrscale.c index 1d0c72a66e16a..c68fe136b193e 100644 --- a/drivers/gpu/msm/kgsl_pwrscale.c +++ b/drivers/gpu/msm/kgsl_pwrscale.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -449,7 +449,8 @@ int kgsl_devfreq_target(struct device *dev, unsigned long *freq, u32 flags) struct kgsl_device *device = dev_get_drvdata(dev); struct kgsl_pwrctrl *pwr; struct kgsl_pwrlevel *pwr_level; - int level, i; + int level; + unsigned int i; unsigned long cur_freq; if (device == NULL) @@ -477,7 +478,12 @@ int kgsl_devfreq_target(struct device *dev, unsigned long *freq, u32 flags) /* If the governor recommends a new frequency, update it here */ if (*freq != cur_freq) { level = pwr->max_pwrlevel; - for (i = pwr->min_pwrlevel; i >= pwr->max_pwrlevel; i--) + /* + * Array index of pwrlevels[] should be within the permitted + * power levels, i.e., from max_pwrlevel to min_pwrlevel. + */ + for (i = pwr->min_pwrlevel; (i >= pwr->max_pwrlevel + && i <= pwr->min_pwrlevel); i--) if (*freq <= pwr->pwrlevels[i].gpu_freq) { if (pwr->thermal_cycle == CYCLE_ACTIVE) level = _thermal_adjust(pwr, i); From dbc0e5bec1d0f89e1b99a30dadbb42bbd1fa5b1a Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Thu, 16 Feb 2017 17:22:46 +0100 Subject: [PATCH 0938/1015] dccp: fix freeing skb too early for IPV6_RECVPKTINFO In the current DCCP implementation an skb for a DCCP_PKT_REQUEST packet is forcibly freed via __kfree_skb in dccp_rcv_state_process if dccp_v6_conn_request successfully returns. However, if IPV6_RECVPKTINFO is set on a socket, the address of the skb is saved to ireq->pktopts and the ref count for skb is incremented in dccp_v6_conn_request, so skb is still in use. Nevertheless, it gets freed in dccp_rcv_state_process. Fix by calling consume_skb instead of doing goto discard and therefore calling __kfree_skb. Similar fixes for TCP: fb7e2399ec17f1004c0e0ccfd17439f8759ede01 [TCP]: skb is unexpectedly freed. 0aea76d35c9651d55bbaf746e7914e5f9ae5a25d tcp: SYN packets are now simply consumed Change-Id: I948a9fe7d1695217b95fb4b71838033adb1d7f40 Signed-off-by: Andrey Konovalov Acked-by: Eric Dumazet Signed-off-by: David S. Miller Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git Git-commit: 5edabca9d4cff7f1f2b68f0bac55ef99d9798ba4 Signed-off-by: Dennis Cagle --- net/dccp/input.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/dccp/input.c b/net/dccp/input.c index 3c8ec7d4a34ec..700440e4fa3bb 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c @@ -606,7 +606,8 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb, if (inet_csk(sk)->icsk_af_ops->conn_request(sk, skb) < 0) return 1; - goto discard; + consume_skb(skb); + return 0; } if (dh->dccph_type == DCCP_PKT_RESET) goto discard; From f3b16e80f65b2bb7787ff65c6713246789417788 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Sat, 4 Feb 2017 11:16:52 -0800 Subject: [PATCH 0939/1015] ipv4: keep skb->dst around in presence of IP options Andrey Konovalov got crashes in __ip_options_echo() when a NULL skb->dst is accessed. ipv4_pktinfo_prepare() should not drop the dst if (evil) IP options are present. We could refine the test to the presence of ts_needtime or srr, but IP options are not often used, so let's be conservative. Thanks to syzkaller team for finding this bug. Change-Id: I9c255554a036bc0e59aea5f0a8011eef37e4dcdc Fixes: d826eb14ecef ("ipv4: PKTINFO doesnt need dst reference") Signed-off-by: Eric Dumazet Reported-by: Andrey Konovalov Signed-off-by: David S. Miller Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Git-commit: 34b2cef20f19c87999fff3da4071e66937db9644 Signed-off-by: Dennis Cagle --- net/ipv4/ip_sockglue.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 046fce012da5b..8839b55ea4def 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -1066,7 +1066,14 @@ void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb) pktinfo->ipi_ifindex = 0; pktinfo->ipi_spec_dst.s_addr = 0; } - skb_dst_drop(skb); + /* We need to keep the dst for __ip_options_echo() + * We could restrict the test to opt.ts_needtime || opt.srr, + * but the following is good enough as IP options are not often used. + */ + if (unlikely(IPCB(skb)->opt.optlen)) + skb_dst_force(skb); + else + skb_dst_drop(skb); } int ip_setsockopt(struct sock *sk, int level, From 851ee84d27e0a88095affa852eb56fc98743c8c7 Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Wed, 29 Mar 2017 16:11:20 +0200 Subject: [PATCH 0940/1015] net/packet: fix overflow in check for priv area size Subtracting tp_sizeof_priv from tp_block_size and casting to int to check whether one is less then the other doesn't always work (both of them are unsigned ints). Compare them as is instead. Also cast tp_sizeof_priv to u64 before using BLK_PLUS_PRIV, as it can overflow inside BLK_PLUS_PRIV otherwise. Change-Id: I6ea9173654eb07b0135045c9825b2d6fe1bf3978 Signed-off-by: Andrey Konovalov Acked-by: Eric Dumazet Signed-off-by: David S. Miller Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Git-commit: 2b6867c2ce76c596676bec7d2d525af525fdc6e2 Signed-off-by: Dennis Cagle --- net/packet/af_packet.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index a710a6cf265ef..8af38c4c2beb1 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -3806,8 +3806,8 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, if (unlikely(req->tp_block_size & (PAGE_SIZE - 1))) goto out; if (po->tp_version >= TPACKET_V3 && - (int)(req->tp_block_size - - BLK_PLUS_PRIV(req_u->req3.tp_sizeof_priv)) <= 0) + req->tp_block_size <= + BLK_PLUS_PRIV((u64)req_u->req3.tp_sizeof_priv)) goto out; if (unlikely(req->tp_frame_size < po->tp_hdrlen + po->tp_reserve)) From 0ed4a6bc8a5fae72200029b1ca7fdf101cf5176b Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Thu, 4 May 2017 13:25:44 -0700 Subject: [PATCH 0941/1015] Revert "proc: smaps: Allow smaps access for CAP_SYS_RESOURCE" This reverts commit f0ce0eee6b71bc310153edb87e66e6b25e12fece. Bug: 34951864 Bug: 36468447 Change-Id: I87bd92e096c6c28a53b9ecf302ae008f5e58eba1 Signed-off-by: Nick Desaulniers Git-repo: https://android.googlesource.com/kernel/msm Git-commit: 278dfe94be193a171af060c40e699447544ca362 Signed-off-by: Dennis Cagle --- kernel/fork.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kernel/fork.c b/kernel/fork.c index 600956bafb8df..786c9dce31ba8 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -756,8 +756,7 @@ struct mm_struct *mm_access(struct task_struct *task, unsigned int mode) mm = get_task_mm(task); if (mm && mm != current->mm && - !ptrace_may_access(task, mode) && - !capable(CAP_SYS_RESOURCE)) { + !ptrace_may_access(task, mode)) { mmput(mm); mm = ERR_PTR(-EACCES); } From 089a1ad56c2c531aa42bafd3af9789dfee17b7e0 Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Wed, 19 Jul 2017 16:29:45 +0530 Subject: [PATCH 0942/1015] diag: Synchronize msg mask read and write on a peripheral The patch synchronizes msg mask read and write on a peripheral by proper protection of mask_info and msg_mask_table_count. CRs-Fixed: 2042362, 2055291 Change-Id: If136012855834b0b8cba91eb66bf711750e8f372 Signed-off-by: Manoj Prabhu B --- drivers/char/diag/diag_masks.c | 54 ++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/drivers/char/diag/diag_masks.c b/drivers/char/diag/diag_masks.c index 64d5b431aa1d7..7b2fa58147311 100644 --- a/drivers/char/diag/diag_masks.c +++ b/drivers/char/diag/diag_masks.c @@ -288,6 +288,7 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last) struct diag_mask_info *mask_info = NULL; struct diag_msg_mask_t *mask = NULL; struct diag_ctrl_msg_mask header; + uint8_t msg_mask_tbl_count_local; if (peripheral >= NUM_PERIPHERALS) return; @@ -315,6 +316,8 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last) return; } buf = mask_info->update_buf; + msg_mask_tbl_count_local = driver->msg_mask_tbl_count; + mutex_unlock(&driver->msg_mask_lock); mutex_lock(&mask_info->lock); switch (mask_info->status) { case DIAG_CTRL_MASK_ALL_DISABLED: @@ -331,9 +334,11 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last) goto err; } - for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { - if (((first < mask->ssid_first) || - (last > mask->ssid_last_tools)) && first != ALL_SSID) { + for (i = 0; i < msg_mask_tbl_count_local; i++, mask++) { + mutex_lock(&driver->msg_mask_lock); + if (((mask->ssid_first > first) || + (mask->ssid_last_tools < last)) && first != ALL_SSID) { + mutex_unlock(&driver->msg_mask_lock); continue; } @@ -374,19 +379,19 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last) if (mask_size > 0) memcpy(buf + header_len, mask->ptr, mask_size); mutex_unlock(&mask->lock); + mutex_unlock(&driver->msg_mask_lock); err = diagfwd_write(peripheral, TYPE_CNTL, buf, header_len + mask_size); if (err && err != -ENODEV) - pr_err_ratelimited("diag: Unable to send msg masks to peripheral %d\n", - peripheral); + pr_err_ratelimited("diag: Unable to send msg masks to peripheral %d, error = %d\n", + peripheral, err); if (first != ALL_SSID) break; } err: mutex_unlock(&mask_info->lock); - mutex_unlock(&driver->msg_mask_lock); } static void diag_send_time_sync_update(uint8_t peripheral) @@ -661,8 +666,8 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len, } req = (struct diag_msg_build_mask_t *)src_buf; - mutex_lock(&driver->msg_mask_lock); mutex_lock(&mask_info->lock); + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)mask_info->ptr; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { if (i < (driver->msg_mask_tbl_count - 1)) { @@ -702,6 +707,8 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len, pr_err_ratelimited("diag: In %s, unable to allocate memory for msg mask ptr, mask_size: %d\n", __func__, mask_size); mutex_unlock(&mask->lock); + mutex_unlock(&driver->msg_mask_lock); + mutex_unlock(&mask_info->lock); return -ENOMEM; } mask->ptr = temp; @@ -720,9 +727,8 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len, mask_info->status = DIAG_CTRL_MASK_VALID; break; } - mutex_unlock(&mask_info->lock); mutex_unlock(&driver->msg_mask_lock); - + mutex_unlock(&mask_info->lock); if (diag_check_update(APPS_DATA)) diag_update_userspace_clients(MSG_MASKS_TYPE); @@ -776,9 +782,10 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len, req = (struct diag_msg_config_rsp_t *)src_buf; + mutex_lock(&mask_info->lock); mutex_lock(&driver->msg_mask_lock); + mask = (struct diag_msg_mask_t *)mask_info->ptr; - mutex_lock(&mask_info->lock); mask_info->status = (req->rt_mask) ? DIAG_CTRL_MASK_ALL_ENABLED : DIAG_CTRL_MASK_ALL_DISABLED; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { @@ -787,8 +794,8 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len, mask->range * sizeof(uint32_t)); mutex_unlock(&mask->lock); } - mutex_unlock(&mask_info->lock); mutex_unlock(&driver->msg_mask_lock); + mutex_unlock(&mask_info->lock); if (diag_check_update(APPS_DATA)) diag_update_userspace_clients(MSG_MASKS_TYPE); @@ -1292,8 +1299,8 @@ static int diag_create_msg_mask_table(void) struct diag_msg_mask_t *mask = (struct diag_msg_mask_t *)msg_mask.ptr; struct diag_ssid_range_t range; - mutex_lock(&driver->msg_mask_lock); mutex_lock(&msg_mask.lock); + mutex_lock(&driver->msg_mask_lock); driver->msg_mask_tbl_count = MSG_MASK_TBL_CNT; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { range.ssid_first = msg_mask_tbl[i].ssid_first; @@ -1302,9 +1309,8 @@ static int diag_create_msg_mask_table(void) if (err) break; } - mutex_unlock(&msg_mask.lock); mutex_unlock(&driver->msg_mask_lock); - + mutex_unlock(&msg_mask.lock); return err; } @@ -1317,8 +1323,8 @@ static int diag_create_build_time_mask(void) struct diag_msg_mask_t *build_mask = NULL; struct diag_ssid_range_t range; - mutex_lock(&driver->msg_mask_lock); mutex_lock(&msg_bt_mask.lock); + mutex_lock(&driver->msg_mask_lock); driver->bt_msg_mask_tbl_count = MSG_MASK_TBL_CNT; build_mask = (struct diag_msg_mask_t *)msg_bt_mask.ptr; for (i = 0; i < driver->bt_msg_mask_tbl_count; i++, build_mask++) { @@ -1431,9 +1437,8 @@ static int diag_create_build_time_mask(void) } memcpy(build_mask->ptr, tbl, tbl_size); } - mutex_unlock(&msg_bt_mask.lock); mutex_unlock(&driver->msg_mask_lock); - + mutex_unlock(&msg_bt_mask.lock); return err; } @@ -1603,8 +1608,8 @@ int diag_msg_mask_copy(struct diag_mask_info *dest, struct diag_mask_info *src) err = __diag_mask_init(dest, MSG_MASK_SIZE, APPS_BUF_SIZE); if (err) return err; - mutex_lock(&driver->msg_mask_lock); mutex_lock(&dest->lock); + mutex_lock(&driver->msg_mask_lock); src_mask = (struct diag_msg_mask_t *)src->ptr; dest_mask = (struct diag_msg_mask_t *)dest->ptr; @@ -1621,9 +1626,8 @@ int diag_msg_mask_copy(struct diag_mask_info *dest, struct diag_mask_info *src) src_mask++; dest_mask++; } - mutex_unlock(&dest->lock); mutex_unlock(&driver->msg_mask_lock); - + mutex_unlock(&dest->lock); return err; } @@ -1634,15 +1638,15 @@ void diag_msg_mask_free(struct diag_mask_info *mask_info) if (!mask_info) return; - mutex_lock(&driver->msg_mask_lock); mutex_lock(&mask_info->lock); + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)mask_info->ptr; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { kfree(mask->ptr); mask->ptr = NULL; } - mutex_unlock(&mask_info->lock); mutex_unlock(&driver->msg_mask_lock); + mutex_unlock(&mask_info->lock); __diag_mask_exit(mask_info); } @@ -1811,8 +1815,9 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count, return -EIO; } mutex_unlock(&driver->diag_maskclear_mutex); - mutex_lock(&driver->msg_mask_lock); mutex_lock(&mask_info->lock); + mutex_lock(&driver->msg_mask_lock); + mask = (struct diag_msg_mask_t *)(mask_info->ptr); for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { ptr = mask_info->update_buf; @@ -1849,9 +1854,8 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count, } total_len += len; } - mutex_unlock(&mask_info->lock); mutex_unlock(&driver->msg_mask_lock); - + mutex_unlock(&mask_info->lock); return err ? err : total_len; } From 1d8f4d806da7fa792307b79d66b2c2394ce4fb8c Mon Sep 17 00:00:00 2001 From: Sarada Prasanna Garnayak Date: Tue, 11 Jul 2017 13:01:19 +0530 Subject: [PATCH 0943/1015] wcnss: fix the potential buffer flow issue in firmware setup Add the check against negative or invalid firmware size passed by the userspace thread in firmware setup sysfs write operation. Update the datatype of the variable which holds the firmware size passed by userspace thread during firmware setup and WLAN calibration data update process. CRs-Fixed: 2072966 Change-Id: I8c84ad0d1b0a5f44a39c9c5b228734b0f693e8dd Signed-off-by: Sarada Prasanna Garnayak --- drivers/net/wireless/wcnss/wcnss_wlan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c index 93ae26b1533bc..a6a37b907c13c 100644 --- a/drivers/net/wireless/wcnss/wcnss_wlan.c +++ b/drivers/net/wireless/wcnss/wcnss_wlan.c @@ -395,7 +395,7 @@ static struct { int user_cal_read; int user_cal_available; u32 user_cal_rcvd; - int user_cal_exp_size; + u32 user_cal_exp_size; int iris_xo_mode_set; int fw_vbatt_state; char wlan_nv_macAddr[WLAN_MAC_ADDR_SIZE]; From baf3b7bd3434f69c9be9174588f36a2a9c157937 Mon Sep 17 00:00:00 2001 From: Vijay kumar Tumati Date: Mon, 17 Jul 2017 12:24:36 +0530 Subject: [PATCH 0944/1015] ARM: dts: msm: Add AF support for Rear Aux Camera on msm8937 Add actuator node to support Auto Focus for Back Aux Camera, the node 1 on msm8937. Change-Id: If783d63bd0adfb1789696aa39bb03c55574cfe00 Signed-off-by: Vijay kumar Tumati --- .../boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi index 7e484f5725c08..ab83251c8f576 100644 --- a/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi @@ -36,6 +36,18 @@ qcom,cam-vreg-op-mode = <80000>; }; + actuator2: qcom,actuator@2 { + cell-index = <2>; + reg = <0x2>; + compatible = "qcom,actuator"; + qcom,cci-master = <1>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + eeprom0: qcom,eeprom@0 { cell-index = <0>; compatible = "qcom,eeprom"; @@ -239,7 +251,7 @@ qcom,csiphy-sd-index = <1>; qcom,csid-sd-index = <1>; qcom,mount-angle = <90>; - qcom,actuator-src = <&actuator1>; + qcom,actuator-src = <&actuator2>; qcom,eeprom-src = <&eeprom2>; cam_vdig-supply = <&pm8937_l23>; cam_vana-supply = <&pm8937_l22>; From 734aabed170902202ab4d9cb180833cc08978630 Mon Sep 17 00:00:00 2001 From: Saranya Chidura Date: Mon, 10 Jul 2017 11:52:36 +0530 Subject: [PATCH 0945/1015] coresight: tmc: Fix use after free issue with tmc read Fix race condition seen between reading tmc buffer and enabling the device. The race condition can result in a use after free issue if the buffer is released while a read is in progress. Change-Id: I9908fa78acbf3152ee791c63fef525f09a9a23d5 Signed-off-by: Yasir Malik Signed-off-by: Saranya Chidura --- drivers/coresight/coresight-tmc.c | 33 ++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/drivers/coresight/coresight-tmc.c b/drivers/coresight/coresight-tmc.c index f94a5cf98d8b5..98761da0b2f96 100644 --- a/drivers/coresight/coresight-tmc.c +++ b/drivers/coresight/coresight-tmc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -849,6 +849,14 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) return ret; mutex_lock(&drvdata->usb_lock); + spin_lock_irqsave(&drvdata->spinlock, flags); + if (drvdata->reading) { + ret = -EBUSY; + spin_unlock_irqrestore(&drvdata->spinlock, flags); + goto err0; + } + spin_unlock_irqrestore(&drvdata->spinlock, flags); + if (drvdata->config_type == TMC_CONFIG_TYPE_ETB) { coresight_cti_map_trigout(drvdata->cti_flush, 1, 0); coresight_cti_map_trigin(drvdata->cti_reset, 2, 0); @@ -895,10 +903,6 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) } spin_lock_irqsave(&drvdata->spinlock, flags); - if (drvdata->reading) { - ret = -EBUSY; - goto err1; - } if (drvdata->config_type == TMC_CONFIG_TYPE_ETB) { __tmc_etb_enable(drvdata); @@ -928,11 +932,6 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) dev_info(drvdata->dev, "TMC enabled\n"); return 0; -err1: - spin_unlock_irqrestore(&drvdata->spinlock, flags); - if (drvdata->config_type == TMC_CONFIG_TYPE_ETR) - if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB) - usb_qdss_close(drvdata->usbch); err0: mutex_unlock(&drvdata->usb_lock); clk_disable_unprepare(drvdata->clk); @@ -1327,6 +1326,7 @@ static int tmc_read_prepare(struct tmc_drvdata *drvdata) unsigned long flags; enum tmc_mode mode; + mutex_lock(&drvdata->usb_lock); spin_lock_irqsave(&drvdata->spinlock, flags); if (!drvdata->sticky_enable) { dev_err(drvdata->dev, "enable tmc once before reading\n"); @@ -1357,11 +1357,13 @@ static int tmc_read_prepare(struct tmc_drvdata *drvdata) out: drvdata->reading = true; spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->usb_lock); dev_info(drvdata->dev, "TMC read start\n"); return 0; err: spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->usb_lock); return ret; } @@ -1543,8 +1545,12 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, { struct tmc_drvdata *drvdata = container_of(file->private_data, struct tmc_drvdata, miscdev); - char *bufp = drvdata->buf + *ppos; - char *end = (char *)(drvdata->vaddr + drvdata->size); + char *bufp, *end; + + mutex_lock(&drvdata->usb_lock); + + bufp = drvdata->buf + *ppos; + end = (char *)(drvdata->vaddr + drvdata->size); if (*ppos + len > drvdata->size) len = drvdata->size - *ppos; @@ -1571,6 +1577,7 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, if (copy_to_user(data, bufp, len)) { dev_dbg(drvdata->dev, "%s: copy_to_user failed\n", __func__); + mutex_unlock(&drvdata->usb_lock); return -EFAULT; } @@ -1578,6 +1585,8 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, out: dev_dbg(drvdata->dev, "%s: %zu bytes copied, %d bytes left\n", __func__, len, (int) (drvdata->size - *ppos)); + + mutex_lock(&drvdata->usb_lock); return len; } From 7ef3264c724296b1dbc212b4b741c67583f25cc1 Mon Sep 17 00:00:00 2001 From: Ghanim Fodi Date: Sun, 9 Jul 2017 12:09:11 +0300 Subject: [PATCH 0946/1015] msm: ipa3: Protect access to ipa3_qmi_ctx variable by lock ipa3_qmi_ctx is a global variable that may be accessed by different worker threads. Protect the access to it using mutex lock so that the access will be always atomic. Change-Id: Iaf0c95d66817833c8e8123b12e94a7a01ab8df2c CRs-fixed: 2056414 Signed-off-by: Ghanim Fodi --- drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c index 09c4dfb04962d..846d6045f3cc9 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c @@ -1106,10 +1106,13 @@ void ipa3_qmi_service_exit(void) } /* clean the QMI msg cache */ + mutex_lock(&ipa3_qmi_lock); if (ipa3_qmi_ctx != NULL) { vfree(ipa3_qmi_ctx); ipa3_qmi_ctx = NULL; } + mutex_unlock(&ipa3_qmi_lock); + ipa3_svc_handle = 0; ipa3_qmi_modem_init_fin = false; ipa3_qmi_indication_fin = false; From 9a3a66c4e5d95ab080ec3db732673a4a46bd330c Mon Sep 17 00:00:00 2001 From: Ashish Garg Date: Fri, 7 Jul 2017 11:41:56 +0530 Subject: [PATCH 0947/1015] msm: mdss: information leak during buffer copy from userspace While trying to write dsi commands from userspace, the user buffer is copied using simple_write_to_buffer. If the number of bytes in the user buffer is less than the destination buffer, the length was set to the destination buffer length. Subsequently the buffer could be read from userspace to dump a lot of uninitialized kernel heap data. Update the destination buffer with the correct size of bytes copied from the user buffer. Change-Id: Ib28f3698655d25ad8103fc02199a1d214092e232 Signed-off-by: Ashish Garg --- drivers/video/msm/mdss/mdss_dsi.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c index b9675310bc46b..7e9fab7faf4fe 100644 --- a/drivers/video/msm/mdss/mdss_dsi.c +++ b/drivers/video/msm/mdss/mdss_dsi.c @@ -810,10 +810,15 @@ static ssize_t mdss_dsi_cmd_write(struct file *file, const char __user *p, /* Writing in batches is possible */ ret = simple_write_to_buffer(string_buf, blen, ppos, p, count); + if (ret < 0) { + pr_err("%s: Failed to copy data\n", __func__); + mutex_unlock(&pcmds->dbg_mutex); + return -EINVAL; + } - string_buf[blen] = '\0'; + string_buf[ret] = '\0'; pcmds->string_buf = string_buf; - pcmds->sblen = blen; + pcmds->sblen = count; mutex_unlock(&pcmds->dbg_mutex); return ret; } From 154f27be1bbd3a50ce1bc22330256c7f97a7814e Mon Sep 17 00:00:00 2001 From: Mishra Mahima Date: Tue, 11 Jul 2017 13:52:07 +0530 Subject: [PATCH 0948/1015] msm: mdss: Increase fbmem buf ref count before use The reference count for fbmem buf is not increased before use, which means it can be get freed unintentionally when the reference count is decreased to "0". In this case, there is possibility of use after free. Ensure that fbmem buf refcount is incremented before use. Change-Id: I525d41e5496a1123e53a438b5f78d4da8bc046bd Signed-off-by: Jayant Shekhar Signed-off-by: Mishra Mahima --- drivers/video/msm/mdss/mdss_mdp_overlay.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index c47d2fb615538..e74d5136f96ff 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -4394,12 +4394,15 @@ static int mdss_fb_get_metadata(struct msm_fb_data_type *mfd, break; case metadata_op_get_ion_fd: if (mfd->fb_ion_handle && mfd->fb_ion_client) { + get_dma_buf(mfd->fbmem_buf); metadata->data.fbmem_ionfd = ion_share_dma_buf_fd(mfd->fb_ion_client, mfd->fb_ion_handle); - if (metadata->data.fbmem_ionfd < 0) + if (metadata->data.fbmem_ionfd < 0) { + dma_buf_put(mfd->fbmem_buf); pr_err("fd allocation failed. fd = %d\n", metadata->data.fbmem_ionfd); + } } break; case metadata_op_crc: From 8f14375dfc13090c7b5139776c8b5a1d430285a6 Mon Sep 17 00:00:00 2001 From: Samyukta Mogily Date: Tue, 4 Jul 2017 16:22:07 +0530 Subject: [PATCH 0949/1015] msm: sensor: Fix to validate the settings size in flash The size of the settings, copied from userspace, is directly checked in msm_cci_data_queue with CCI_I2C_MAX_WRITE. This might cause out of bound access in function msm_cci_data_queue as the max size is MAX_I2C_REG_SET. Hence adding check on the size in flash driver itself. Change-Id: Ifac358be9f4b4ff60d14c20e02886c2d044e7f52 Signed-off-by: Samyukta Mogily --- .../media/platform/msm/camera_v2/sensor/flash/msm_flash.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c index 5af0a6a9c79e2..680e7d946a2b8 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c +++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c @@ -151,6 +151,12 @@ static int32_t msm_flash_i2c_write_table( conf_array.reg_setting = settings->reg_setting_a; conf_array.size = settings->size; + /* Validate the settings size */ + if((!conf_array.size) || (conf_array.size > MAX_I2C_REG_SET)) { + pr_err("failed: invalid size %d", conf_array.size); + return -EINVAL; + } + return flash_ctrl->flash_i2c_client.i2c_func_tbl->i2c_write_table( &flash_ctrl->flash_i2c_client, &conf_array); } From 344309c43a65e434144bdf88f27c96c5f1f38ed3 Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Wed, 29 Mar 2017 16:11:21 +0200 Subject: [PATCH 0950/1015] net/packet: fix overflow in check for tp_frame_nr When calculating rb->frames_per_block * req->tp_block_nr the result can overflow. Add a check that tp_block_size * tp_block_nr <= UINT_MAX. Since frames_per_block <= tp_block_size, the expression would never overflow. Change-Id: I183d9adb8b90010f408b5e1d0785aa06814f4348 Signed-off-by: Andrey Konovalov Acked-by: Eric Dumazet Signed-off-by: David S. Miller Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Git-commit: 8f8d28e4d6d815a391285e121c3a53a0b6cb9e7b Signed-off-by: Dennis Cagle --- net/packet/af_packet.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 8af38c4c2beb1..74fb8ac52b930 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -3818,6 +3818,8 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, rb->frames_per_block = req->tp_block_size/req->tp_frame_size; if (unlikely(rb->frames_per_block <= 0)) goto out; + if (unlikely(req->tp_block_size > UINT_MAX / req->tp_block_nr)) + goto out; if (unlikely((rb->frames_per_block * req->tp_block_nr) != req->tp_frame_nr)) goto out; From 1ec330b2c74935b147d5dbe21c39adb440afdf29 Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Wed, 29 Mar 2017 16:11:22 +0200 Subject: [PATCH 0951/1015] net/packet: fix overflow in check for tp_reserve When calculating po->tp_hdrlen + po->tp_reserve the result can overflow. Fix by checking that tp_reserve <= INT_MAX on assign. Change-Id: If3b5fd73bd440de2a1050644b71ef7430f09810f Signed-off-by: Andrey Konovalov Acked-by: Eric Dumazet Signed-off-by: David S. Miller Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Git-commit: bcc5364bdcfe131e6379363f089e7b4108d35b70 Signed-off-by: Dennis Cagle --- net/packet/af_packet.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 74fb8ac52b930..3faaf31800663 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -3313,6 +3313,8 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv return -EBUSY; if (copy_from_user(&val, optval, sizeof(val))) return -EFAULT; + if (val > INT_MAX) + return -EINVAL; po->tp_reserve = val; return 0; } From ee781281d97f42654da5bf42644ec5da89af7603 Mon Sep 17 00:00:00 2001 From: Prateek Sood Date: Fri, 14 Jul 2017 16:10:14 +0530 Subject: [PATCH 0952/1015] osq_lock: fix osq_lock queue corruption Fix ordering of link creation between node->prev and prev->next in osq_lock(). A case in which the status of optimistic spin queue is CPU6->CPU2 in which CPU6 has acquired the lock. At this point if CPU0 comes in to acquire osq_lock, it will update the tail count. After tail count update if CPU2 starts to unqueue itself from optimistic spin queue, it will find updated tail count with CPU0 and update CPU2 node->next to NULL in osq_wait_next(). If reordering of following stores happen then prev->next where prev being CPU2 would be updated to point to CPU0 node: node->prev = prev; WRITE_ONCE(prev->next, node); At this point if next instruction WRITE_ONCE(next->prev, prev); in CPU2 path is committed before the update of CPU0 node->prev = prev then CPU0 node->prev will point to CPU6 node. At this point if CPU0 path's node->prev = prev is committed resulting in change of CPU0 prev back to CPU2 node. CPU2 node->next is NULL currently, so if CPU0 gets into unqueue path of osq_lock it will keep spinning in infinite loop as condition prev->next == node will never be true. Change-Id: I0b484f59f2e2945be4122792319c3431e55ec33e Signed-off-by: Prateek Sood --- kernel/locking/mcs_spinlock.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/kernel/locking/mcs_spinlock.c b/kernel/locking/mcs_spinlock.c index 9887a905a7626..39c9537c72991 100644 --- a/kernel/locking/mcs_spinlock.c +++ b/kernel/locking/mcs_spinlock.c @@ -100,6 +100,32 @@ bool osq_lock(struct optimistic_spin_queue *lock) prev = decode_cpu(old); node->prev = prev; + + /* + * We need to avoid reordering of link updation sequence of osq. + * A case in which the status of optimistic spin queue is + * CPU6->CPU2 in which CPU6 has acquired the lock. At this point + * if CPU0 comes in to acquire osq_lock, it will update the tail + * count. After tail count update if CPU2 starts to unqueue itself + * from optimistic spin queue, it will find updated tail count with + * CPU0 and update CPU2 node->next to NULL in osq_wait_next(). If + * reordering of following stores happen then prev->next where prev + * being CPU2 would be updated to point to CPU0 node: + * node->prev = prev; + * WRITE_ONCE(prev->next, node); + * + * At this point if next instruction + * WRITE_ONCE(next->prev, prev); + * in CPU2 path is committed before the update of CPU0 node->prev = + * prev then CPU0 node->prev will point to CPU6 node. At this point + * if CPU0 path's node->prev = prev is committed resulting in change + * of CPU0 prev back to CPU2 node. CPU2 node->next is NULL, so if + * CPU0 gets into unqueue path of osq_lock it will keep spinning + * in infinite loop as condition prev->next == node will never be + * true. + */ + smp_mb(); + ACCESS_ONCE(prev->next) = node; /* From c5085559112f67a5520c3fc1c38c7383d45c626e Mon Sep 17 00:00:00 2001 From: Prateek Sood Date: Fri, 14 Jul 2017 15:41:19 +0530 Subject: [PATCH 0953/1015] osq_lock: avoid live-lock issue for RT task Live Lock due to task spinning while unqueue of CPU osq_node from optimistic_spin_queue. Task T1 had decremented mutex count to acquire the lock on CPU0. Before setting owner it got preempted. On CPU1 task T2 acquired osq_lock and started spinning on owner of mutex with preemption disabled. CPU1 runq has one task, so need_resched will not be set. On CPU0 task T3 tried to acquire osq_lock to spin on the same mutex. At this time following scenario causes soft lockup: After preemption of task T1, RT task T3 tried to acquire the same mutex. It will start spinning on the osq_lock until the lock is available or need_resched is set. For RT task, need_resched will not be set. Task T3 will not be able to bail out of the infinite loop. Change-Id: Icd599bdcebda23b22dcd5e6f9be8842bb8f2f5b6 Signed-off-by: Prateek Sood --- kernel/locking/mcs_spinlock.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/kernel/locking/mcs_spinlock.c b/kernel/locking/mcs_spinlock.c index 9887a905a7626..620759f24da53 100644 --- a/kernel/locking/mcs_spinlock.c +++ b/kernel/locking/mcs_spinlock.c @@ -1,6 +1,7 @@ #include #include #include "mcs_spinlock.h" +#include #ifdef CONFIG_SMP @@ -87,6 +88,7 @@ bool osq_lock(struct optimistic_spin_queue *lock) { struct optimistic_spin_node *node = this_cpu_ptr(&osq_node); struct optimistic_spin_node *prev, *next; + struct task_struct *task = current; int curr = encode_cpu(smp_processor_id()); int old; @@ -114,8 +116,13 @@ bool osq_lock(struct optimistic_spin_queue *lock) while (!smp_load_acquire(&node->locked)) { /* * If we need to reschedule bail... so we can block. + * If a task spins on owner on a CPU after acquiring + * osq_lock while a RT task spins on another CPU to + * acquire osq_lock, it will starve the owner from + * completing if owner is to be scheduled on the same CPU. + * It will be a live lock. */ - if (need_resched()) + if (need_resched() || rt_task(task)) goto unqueue; cpu_relax_lowlatency(); From cdff0f9c335b2febba0ec842c892f7e2d1356c92 Mon Sep 17 00:00:00 2001 From: Srinivasarao P Date: Tue, 14 Feb 2017 13:52:08 +0530 Subject: [PATCH 0954/1015] defconfig: disable cp_access cpaccess module gives userspace control over system control registers so disable cp_access module. Change-Id: Ib49412957f91ce65f4350c5c72358b1c53eed43e Signed-off-by: Srinivasarao P --- arch/arm64/configs/msm8937-perf_defconfig | 2 +- arch/arm64/configs/msm8937_defconfig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index 2f0480e828f53..fb40f929dedaf 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -522,7 +522,7 @@ CONFIG_BW_MONITOR=y CONFIG_MSM_SPMI=y CONFIG_MSM_SPMI_PMIC_ARB=y CONFIG_MSM_QPNP_INT=y -CONFIG_CP_ACCESS64=y +# CONFIG_CP_ACCESS64 is not set CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y CONFIG_MSM_ADSP_LOADER=y CONFIG_MSM_MEMORY_DUMP_V2=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 160573147d378..3a9eaaf251c58 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -523,7 +523,7 @@ CONFIG_BW_MONITOR=y CONFIG_MSM_SPMI=y CONFIG_MSM_SPMI_PMIC_ARB=y CONFIG_MSM_QPNP_INT=y -CONFIG_CP_ACCESS64=y +# CONFIG_CP_ACCESS64 is not set CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y CONFIG_MSM_ADSP_LOADER=y CONFIG_MSM_MEMORY_DUMP_V2=y From 06e6cc1b6060fb7af70bdbfca9d07f3635c434a8 Mon Sep 17 00:00:00 2001 From: Saranya Chidura Date: Wed, 26 Jul 2017 17:37:17 +0530 Subject: [PATCH 0955/1015] coresight: tmc: Fix the unbalanced lock in tmc_read() 'commit 734aabed17090: ("coresight: tmc: Fix use after free issue with tmc read")' adds lock in tmc_read() to fix race condition seen in reading tmc buffer and enabling the device.But commit has unbalanced lock. This patch fixes the lock. Change-Id: Iaf3ecd83ef5af346725885ea2c84c4185f1a1c50 Signed-off-by: Saranya Chidura --- drivers/coresight/coresight-tmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/coresight/coresight-tmc.c b/drivers/coresight/coresight-tmc.c index 98761da0b2f96..c9844d2fb2813 100644 --- a/drivers/coresight/coresight-tmc.c +++ b/drivers/coresight/coresight-tmc.c @@ -1586,7 +1586,7 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, dev_dbg(drvdata->dev, "%s: %zu bytes copied, %d bytes left\n", __func__, len, (int) (drvdata->size - *ppos)); - mutex_lock(&drvdata->usb_lock); + mutex_unlock(&drvdata->usb_lock); return len; } From 7bea133ca4bb7090f863884a5c41db7b1cf6c849 Mon Sep 17 00:00:00 2001 From: "Sravan Kumar D.V.N" Date: Fri, 21 Jul 2017 00:47:28 +0530 Subject: [PATCH 0956/1015] msm: mdss: Fix possible leaks in PP LUT get functions Possible user information leaks in post processing LUT get functions are fixed by properly copying user data. Change-Id: I529f74a79e5857902177c8054d136b4544370be2 Signed-off-by: Sravan Kumar D.V.N --- drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c | 20 +++++++++++++++----- drivers/video/msm/mdss/mdss_mdp_pp_v3.c | 11 ++++++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c b/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c index 5921d286dc77b..7903c6ac83e7b 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -358,7 +358,8 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, int ret = 0, i = 0; char __iomem *hist_addr; u32 sz = 0, temp = 0, *data = NULL; - struct mdp_hist_lut_data_v1_7 *lut_data = NULL; + struct mdp_hist_lut_data_v1_7 lut_data_v1_7; + struct mdp_hist_lut_data_v1_7 *lut_data = &lut_data_v1_7; struct mdp_hist_lut_data *lut_cfg_data = NULL; if (!base_addr || !cfg_data) { @@ -378,7 +379,11 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, lut_cfg_data->version, lut_cfg_data->cfg_payload); return -EINVAL; } - lut_data = lut_cfg_data->cfg_payload; + if (copy_from_user(lut_data, (void __user *) lut_cfg_data->cfg_payload, + sizeof(*lut_data))) { + pr_err("copy from user failed for lut_data\n"); + return -EFAULT; + } if (lut_data->len != ENHIST_LUT_ENTRIES) { pr_err("invalid hist_lut len %d", lut_data->len); return -EINVAL; @@ -1786,7 +1791,8 @@ static int pp_igc_get_config(char __iomem *base_addr, void *cfg_data, { int ret = 0, i = 0; struct mdp_igc_lut_data *lut_cfg_data = NULL; - struct mdp_igc_lut_data_v1_7 *lut_data = NULL; + struct mdp_igc_lut_data_v1_7 lut_data_v1_7; + struct mdp_igc_lut_data_v1_7 *lut_data = &lut_data_v1_7; char __iomem *c1 = NULL, *c2 = NULL; u32 *c0c1_data = NULL, *c2_data = NULL; u32 data = 0, sz = 0; @@ -1810,7 +1816,11 @@ static int pp_igc_get_config(char __iomem *base_addr, void *cfg_data, ret = -EINVAL; goto exit; } - lut_data = lut_cfg_data->cfg_payload; + if (copy_from_user(lut_data, (void __user *) lut_cfg_data->cfg_payload, + sizeof(*lut_data))) { + pr_err("copy from user failed for lut_data\n"); + return -EFAULT; + } if (lut_data->len != IGC_LUT_ENTRIES) { pr_err("invalid lut len %d\n", lut_data->len); ret = -EINVAL; diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_v3.c b/drivers/video/msm/mdss/mdss_mdp_pp_v3.c index ce915e919caa3..c01e97d4c5947 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_v3.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_v3.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -249,7 +249,8 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, int ret = 0, i = 0; char __iomem *hist_lut_addr; u32 sz = 0, temp = 0, *data = NULL; - struct mdp_hist_lut_data_v1_7 *lut_data = NULL; + struct mdp_hist_lut_data_v1_7 lut_data_v1_7; + struct mdp_hist_lut_data_v1_7 *lut_data = &lut_data_v1_7; struct mdp_hist_lut_data *lut_cfg_data = NULL; if (!base_addr || !cfg_data) { @@ -274,7 +275,11 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, lut_cfg_data->version, lut_cfg_data->cfg_payload); return -EINVAL; } - lut_data = lut_cfg_data->cfg_payload; + if (copy_from_user(lut_data, (void __user *) lut_cfg_data->cfg_payload, + sizeof(*lut_data))) { + pr_err("copy from user failed for lut_data\n"); + return -EFAULT; + } if (lut_data->len != ENHIST_LUT_ENTRIES) { pr_err("invalid hist_lut len %d", lut_data->len); return -EINVAL; From 5ed5176852c3c17ab7764ef4ec3e37cb0fd97a86 Mon Sep 17 00:00:00 2001 From: "Sravan Kumar D.V.N" Date: Fri, 21 Jul 2017 01:11:16 +0530 Subject: [PATCH 0957/1015] msm: mdss: Fix possible memory overwrite in pgc config Possible memory overwrite in pgc get config is fixed by eliminating direct reference to user data. Change-Id: I7117848bacb8e69720eb3121d02bbacf02cab13a Signed-off-by: Sravan Kumar D.V.N --- drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c b/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c index 7903c6ac83e7b..5702fd755e54b 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c @@ -1964,20 +1964,24 @@ static int pp_pgc_get_config(char __iomem *base_addr, void *cfg_data, u32 *c0_data = NULL, *c1_data = NULL, *c2_data = NULL; u32 val = 0, i = 0, sz = 0; struct mdp_pgc_lut_data *pgc_data = NULL; - struct mdp_pgc_lut_data_v1_7 *pgc_data_v17 = NULL; + struct mdp_pgc_lut_data_v1_7 pgc_lut_data_v17; + struct mdp_pgc_lut_data_v1_7 *pgc_data_v17 = &pgc_lut_data_v17; if (!base_addr || !cfg_data) { pr_err("invalid params base_addr %pK cfg_data %pK block_type %d\n", base_addr, cfg_data, block_type); return -EINVAL; } pgc_data = (struct mdp_pgc_lut_data *) cfg_data; - pgc_data_v17 = (struct mdp_pgc_lut_data_v1_7 *) - pgc_data->cfg_payload; - if (pgc_data->version != mdp_pgc_v1_7 || !pgc_data_v17) { + if (pgc_data->version != mdp_pgc_v1_7 || !pgc_data->cfg_payload) { pr_err("invalid pgc version %d payload %pK\n", - pgc_data->version, pgc_data_v17); + pgc_data->version, pgc_data->cfg_payload); return -EINVAL; } + if (copy_from_user(pgc_data_v17, (void __user *) pgc_data->cfg_payload, + sizeof(*pgc_data_v17))) { + pr_err("copy from user failed for pgc lut data\n"); + return -EFAULT; + } if (!(pgc_data->flags & MDP_PP_OPS_READ)) { pr_info("read ops is not set %d", pgc_data->flags); return -EINVAL; From 322f20327ef5e8dfb47d1add792fc7c14fca2126 Mon Sep 17 00:00:00 2001 From: Krishna Manikandan Date: Fri, 30 Jun 2017 11:49:47 +0530 Subject: [PATCH 0958/1015] msm: mdss: Add check for fence count Add a check to ensure that the acquire fence count does not exceed the maximum possible value. Change-Id: I7198899be2d720214152d49fdbb6b6a69750fb3a Signed-off-by: Krishna Manikandan --- drivers/video/msm/mdss/mdss_mdp_layer.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_mdp_layer.c b/drivers/video/msm/mdss/mdss_mdp_layer.c index bbd97006ec297..28bd7129a9ff5 100644 --- a/drivers/video/msm/mdss/mdss_mdp_layer.c +++ b/drivers/video/msm/mdss/mdss_mdp_layer.c @@ -2194,6 +2194,14 @@ int mdss_mdp_layer_pre_commit_wfd(struct msm_fb_data_type *mfd, sync_pt_data = &mfd->mdp_sync_pt_data; mutex_lock(&sync_pt_data->sync_mutex); count = sync_pt_data->acq_fen_cnt; + + if (count >= MDP_MAX_FENCE_FD) { + pr_err("Reached maximum possible value for fence count\n"); + mutex_unlock(&sync_pt_data->sync_mutex); + rc = -EINVAL; + goto input_layer_err; + } + sync_pt_data->acq_fen[count] = fence; sync_pt_data->acq_fen_cnt++; mutex_unlock(&sync_pt_data->sync_mutex); From 69650e9e9fabed717e790133bdd893a8ecf31f10 Mon Sep 17 00:00:00 2001 From: Trishansh Bhardwaj Date: Thu, 13 Jul 2017 17:10:39 +0530 Subject: [PATCH 0959/1015] msm: camera: Instead of read_lock use read_lock_irqsave. Prevent deadlock between tasklet and delete_stream by stopping irq during delete_stream. CRs-Fixed: 2076578 Change-Id: Ibcc9fd44403d24112b01150a7d1f3c6e705ea99a Signed-off-by: Trishansh Bhardwaj Signed-off-by: VijayaKumar T M --- drivers/media/platform/msm/camera_v2/msm.c | 11 ++- .../platform/msm/camera_v2/msm_vb2/msm_vb2.c | 88 ++++++++++--------- 2 files changed, 55 insertions(+), 44 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index 09fd13a023608..a0a0737807dba 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -285,6 +285,7 @@ void msm_delete_stream(unsigned int session_id, unsigned int stream_id) return; while (1) { + unsigned long wl_flags; if (try_count > 5) { pr_err("%s : not able to delete stream %d\n", @@ -292,18 +293,20 @@ void msm_delete_stream(unsigned int session_id, unsigned int stream_id) break; } - write_lock(&session->stream_rwlock); + write_lock_irqsave(&session->stream_rwlock, wl_flags); try_count++; stream = msm_queue_find(&session->stream_q, struct msm_stream, list, __msm_queue_find_stream, &stream_id); if (!stream) { - write_unlock(&session->stream_rwlock); + write_unlock_irqrestore(&session->stream_rwlock, + wl_flags); return; } if (msm_vb2_get_stream_state(stream) != 1) { - write_unlock(&session->stream_rwlock); + write_unlock_irqrestore(&session->stream_rwlock, + wl_flags); continue; } @@ -313,7 +316,7 @@ void msm_delete_stream(unsigned int session_id, unsigned int stream_id) kfree(stream); stream = NULL; spin_unlock_irqrestore(&(session->stream_q.lock), flags); - write_unlock(&session->stream_rwlock); + write_unlock_irqrestore(&session->stream_rwlock, wl_flags); break; } diff --git a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c index 834e8fae99ab6..a1e37b3c81621 100644 --- a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c +++ b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c @@ -46,22 +46,23 @@ int msm_vb2_buf_init(struct vb2_buffer *vb) struct msm_stream *stream; struct msm_session *session; struct msm_vb2_buffer *msm_vb2_buf; + unsigned long rl_flags; session = msm_get_session_from_vb2q(vb->vb2_queue); if (IS_ERR_OR_NULL(session)) return -EINVAL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s: Couldn't find stream\n", __func__); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } msm_vb2_buf = container_of(vb, struct msm_vb2_buffer, vb2_buf); msm_vb2_buf->in_freeq = 0; - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return 0; } @@ -70,7 +71,7 @@ static void msm_vb2_buf_queue(struct vb2_buffer *vb) struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct msm_session *session; - unsigned long flags; + unsigned long flags, rl_flags; msm_vb2 = container_of(vb, struct msm_vb2_buffer, vb2_buf); @@ -83,19 +84,19 @@ static void msm_vb2_buf_queue(struct vb2_buffer *vb) if (IS_ERR_OR_NULL(session)) return; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s:%d] NULL stream", __func__, __LINE__); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } spin_lock_irqsave(&stream->stream_lock, flags); list_add_tail(&msm_vb2->list, &stream->queued_list); spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); } static void msm_vb2_buf_finish(struct vb2_buffer *vb) @@ -103,26 +104,26 @@ static void msm_vb2_buf_finish(struct vb2_buffer *vb) struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct msm_session *session; - unsigned long flags; + unsigned long flags, rl_flags; struct msm_vb2_buffer *msm_vb2_entry, *temp; msm_vb2 = container_of(vb, struct msm_vb2_buffer, vb2_buf); if (!msm_vb2) { pr_err("%s:%d] vb2_buf NULL", __func__, __LINE__); - return; + return; } session = msm_get_session_from_vb2q(vb->vb2_queue); if (IS_ERR_OR_NULL(session)) return; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s:%d] NULL stream", __func__, __LINE__); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } @@ -135,7 +136,7 @@ static void msm_vb2_buf_finish(struct vb2_buffer *vb) } } spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } @@ -144,19 +145,19 @@ static void msm_vb2_stop_stream(struct vb2_queue *q) struct msm_vb2_buffer *msm_vb2, *temp; struct msm_stream *stream; struct msm_session *session; - unsigned long flags; + unsigned long flags, rl_flags; struct vb2_buffer *vb2_buf; session = msm_get_session_from_vb2q(q); if (IS_ERR_OR_NULL(session)) return; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream_from_vb2q(q); if (!stream) { pr_err_ratelimited("%s:%d] NULL stream", __func__, __LINE__); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } @@ -175,7 +176,7 @@ static void msm_vb2_stop_stream(struct vb2_queue *q) msm_vb2->in_freeq = 0; } spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); } int msm_vb2_get_stream_state(struct msm_stream *stream) @@ -252,17 +253,17 @@ static struct vb2_buffer *msm_vb2_get_buf(int session_id, struct vb2_buffer *vb2_buf = NULL; struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; - unsigned long flags; + unsigned long flags, rl_flags; session = msm_get_session(session_id); if (IS_ERR_OR_NULL(session)) return NULL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return NULL; } @@ -288,7 +289,8 @@ static struct vb2_buffer *msm_vb2_get_buf(int session_id, vb2_buf = NULL; end: spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); + return vb2_buf; } @@ -299,18 +301,18 @@ static struct vb2_buffer *msm_vb2_get_buf_by_idx(int session_id, struct vb2_buffer *vb2_buf = NULL; struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; - unsigned long flags; + unsigned long flags, rl_flags; session = msm_get_session(session_id); if (IS_ERR_OR_NULL(session)) return NULL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return NULL; } @@ -334,10 +336,12 @@ static struct vb2_buffer *msm_vb2_get_buf_by_idx(int session_id, vb2_buf = NULL; end: spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); + return vb2_buf; } + static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, unsigned int stream_id) { @@ -346,17 +350,17 @@ static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, struct msm_vb2_buffer *msm_vb2; struct vb2_buffer *vb2_buf = NULL; int rc = 0; - unsigned long flags; + unsigned long flags, rl_flags; session = msm_get_session(session_id); if (IS_ERR_OR_NULL(session)) return -EINVAL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } @@ -371,6 +375,8 @@ static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, pr_err("VB buffer is INVALID vb=%pK, ses_id=%d, str_id=%d\n", vb, session_id, stream_id); spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, + rl_flags); return -EINVAL; } msm_vb2 = @@ -386,7 +392,7 @@ static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, rc = -EINVAL; } spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return rc; } @@ -394,7 +400,7 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, unsigned int stream_id, uint32_t sequence, struct timeval *ts, uint32_t reserved) { - unsigned long flags; + unsigned long flags, rl_flags; struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; @@ -405,11 +411,11 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, if (IS_ERR_OR_NULL(session)) return -EINVAL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } @@ -424,6 +430,8 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, pr_err("VB buffer is INVALID ses_id=%d, str_id=%d, vb=%pK\n", session_id, stream_id, vb); spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, + rl_flags); return -EINVAL; } msm_vb2 = @@ -444,7 +452,7 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, rc = -EINVAL; } spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return rc; } @@ -455,18 +463,18 @@ long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id, struct vb2_buffer *vb2_buf = NULL; struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; - unsigned long flags; + unsigned long flags, rl_flags; long rc = -EINVAL; session = msm_get_session(session_id); if (IS_ERR_OR_NULL(session)) return rc; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } @@ -494,14 +502,14 @@ long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id, end: spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return rc; } EXPORT_SYMBOL(msm_vb2_return_buf_by_idx); static int msm_vb2_flush_buf(int session_id, unsigned int stream_id) { - unsigned long flags; + unsigned long flags, rl_flags; struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; @@ -511,11 +519,11 @@ static int msm_vb2_flush_buf(int session_id, unsigned int stream_id) if (IS_ERR_OR_NULL(session)) return -EINVAL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } @@ -527,7 +535,7 @@ static int msm_vb2_flush_buf(int session_id, unsigned int stream_id) msm_vb2->in_freeq = 0; } spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return 0; } From 90a9f5b6c2cf88ff6b11221525a698b3b2d6297b Mon Sep 17 00:00:00 2001 From: Ramesh V Date: Wed, 5 Jul 2017 19:15:41 +0530 Subject: [PATCH 0960/1015] msm: camera: isp: Support dualcamera overflow Add support of overflow recovery mechanism in case of dualcamera. Change-Id: Ib61358883bc55c519650ebbc049f0cfec1957c0c Signed-off-by: Ramesh V --- .../platform/msm/camera_v2/ispif/msm_ispif.c | 147 ++++++++++++++++-- 1 file changed, 134 insertions(+), 13 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c index 93b889c6ad4e5..5ea58c9806900 100755 --- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c +++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c @@ -1085,21 +1085,142 @@ static int msm_ispif_start_frame_boundary(struct ispif_device *ispif, static int msm_ispif_restart_frame_boundary(struct ispif_device *ispif, struct msm_ispif_param_data *params) { - int rc = 0; + int rc = 0, i; + long timeout = 0; + uint16_t cid_mask; + enum msm_ispif_intftype intftype; + enum msm_ispif_vfe_intf vfe_intf; + uint32_t vfe_mask = 0; + uint32_t intf_addr; - rc = msm_ispif_reset_hw(ispif); - if (!rc) - rc = msm_ispif_reset(ispif); - if (!rc) - rc = msm_ispif_config(ispif, params); - if (!rc) - rc = msm_ispif_start_frame_boundary(ispif, params); - - if (!rc) - pr_info("ISPIF restart Successful\n"); - else - pr_info("ISPIF restart Failed\n"); + if (ispif->ispif_state != ISPIF_POWER_UP) { + pr_err("%s: ispif invalid state %d\n", __func__, + ispif->ispif_state); + rc = -EPERM; + return rc; + } + if (params->num > MAX_PARAM_ENTRIES) { + pr_err("%s: invalid param entries %d\n", __func__, + params->num); + rc = -EINVAL; + return rc; + } + + for (i = 0; i < params->num; i++) { + vfe_intf = params->entries[i].vfe_intf; + if (vfe_intf >= VFE_MAX) { + pr_err("%s: %d invalid i %d vfe_intf %d\n", __func__, + __LINE__, i, vfe_intf); + return -EINVAL; + } + vfe_mask |= (1 << vfe_intf); + } + + /* Turn ON regulators before enabling the clocks*/ + rc = msm_ispif_set_regulators(ispif->vfe_vdd, + ispif->vfe_vdd_count, 1); + if (rc < 0) + return -EFAULT; + + rc = msm_camera_clk_enable(&ispif->pdev->dev, + ispif->clk_info, ispif->clks, + ispif->num_clk, 1); + if (rc < 0) + goto disable_regulator; + + if (vfe_mask & (1 << VFE0)) { + atomic_set(&ispif->reset_trig[VFE0], 1); + /* initiate reset of ISPIF */ + msm_camera_io_w(ISPIF_RST_CMD_MASK_RESTART, + ispif->base + ISPIF_RST_CMD_ADDR); + timeout = wait_for_completion_timeout( + &ispif->reset_complete[VFE0], msecs_to_jiffies(500)); + if (timeout <= 0) { + pr_err("%s: VFE0 reset wait timeout\n", __func__); + rc = -ETIMEDOUT; + goto disable_clk; + } + } + + if (ispif->hw_num_isps > 1 && (vfe_mask & (1 << VFE1))) { + atomic_set(&ispif->reset_trig[VFE1], 1); + msm_camera_io_w(ISPIF_RST_CMD_1_MASK_RESTART, + ispif->base + ISPIF_RST_CMD_1_ADDR); + timeout = wait_for_completion_timeout( + &ispif->reset_complete[VFE1], + msecs_to_jiffies(500)); + if (timeout <= 0) { + pr_err("%s: VFE1 reset wait timeout\n", __func__); + rc = -ETIMEDOUT; + goto disable_clk; + } + } + pr_info("%s: ISPIF reset hw done, Restarting", __func__); + rc = msm_camera_clk_enable(&ispif->pdev->dev, + ispif->clk_info, ispif->clks, + ispif->num_clk, 0); + if (rc < 0) + goto disable_regulator; + + /* Turn OFF regulators after disabling clocks */ + rc = msm_ispif_set_regulators(ispif->vfe_vdd, ispif->vfe_vdd_count, 0); + if (rc < 0) + goto end; + + for (i = 0; i < params->num; i++) { + intftype = params->entries[i].intftype; + vfe_intf = params->entries[i].vfe_intf; + + switch (params->entries[0].intftype) { + case PIX0: + intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 0); + break; + case RDI0: + intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 0); + break; + case PIX1: + intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 1); + break; + case RDI1: + intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 1); + break; + case RDI2: + intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 2); + break; + default: + pr_err("%s: invalid intftype=%d\n", __func__, + params->entries[i].intftype); + rc = -EPERM; + goto end; + } + + msm_ispif_intf_cmd(ispif, + ISPIF_INTF_CMD_ENABLE_FRAME_BOUNDARY, params); + } + + for (i = 0; i < params->num; i++) { + intftype = params->entries[i].intftype; + + vfe_intf = params->entries[i].vfe_intf; + + + cid_mask = msm_ispif_get_cids_mask_from_cfg( + ¶ms->entries[i]); + + msm_ispif_enable_intf_cids(ispif, intftype, + cid_mask, vfe_intf, 1); + } + return rc; + +disable_clk: + msm_camera_clk_enable(&ispif->pdev->dev, + ispif->clk_info, ispif->clks, + ispif->num_clk, 0); +disable_regulator: + /* Turn OFF regulators */ + msm_ispif_set_regulators(ispif->vfe_vdd, ispif->vfe_vdd_count, 0); +end: return rc; } From 919a55db36e14cc0792675d9ddfc433139af146c Mon Sep 17 00:00:00 2001 From: Ajay Agarwal Date: Fri, 28 Jul 2017 10:56:24 +0530 Subject: [PATCH 0961/1015] dwc3: Do not perform core reinitialisation for host only mode Cuurently as a part of start host, after the block reset we are performing core init and gadget restart of the dwc3 controller. This causes crash for host only controller where ep0 and ep1 have not been initialised but are being dereferenced. Also, HW reinitialisation is not required for start or restart host routine. Change-Id: Ie2b781ecb03a1d0a02c5f4305d518adc18dc6ade Signed-off-by: Ajay Agarwal --- drivers/usb/dwc3/dwc3-msm.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 2075223da5caf..dd03cefddf814 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -237,6 +237,7 @@ struct dwc3_msm { struct notifier_block dwc3_cpu_notifier; struct notifier_block usbdev_nb; bool hc_died; + bool host_only_mode; int pwr_event_irq; atomic_t in_p3; @@ -3077,6 +3078,7 @@ static int dwc3_msm_probe(struct platform_device *pdev) if (!dwc->is_drd && host_mode) { dev_dbg(&pdev->dev, "DWC3 in host only mode\n"); + mdwc->host_only_mode = true; mdwc->id_state = DWC3_ID_GROUND; dwc3_ext_event_notify(mdwc); } @@ -3299,7 +3301,9 @@ static int dwc3_otg_start_host(struct dwc3_msm *mdwc, int on) mdwc->in_host_mode = false; /* re-init core and OTG registers as block reset clears these */ - dwc3_post_host_reset_core_init(dwc); + if (!mdwc->host_only_mode) + dwc3_post_host_reset_core_init(dwc); + pm_runtime_mark_last_busy(mdwc->dev); pm_runtime_put_sync_autosuspend(mdwc->dev); dbg_event(0xFF, "StopHost psync", From 66b7afc6a026aaaf5c85cd78695c683669be6b19 Mon Sep 17 00:00:00 2001 From: Alok Kediya Date: Thu, 2 Mar 2017 15:51:35 +0530 Subject: [PATCH 0962/1015] msm: camera: Bound check for num_of_stream. - num of stream comes from userspace and used without any bound check.It may result to overflow update_info. CRs-Fixed: 2006829 Change-Id: I8226e8f7081b28108dbed738ea4579e2051a85f2 Signed-off-by: Alok Kediya --- .../media/platform/msm/camera_v2/isp/msm_isp_stats_util.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c index 055bf75ef27bf..7e3f29198e42e 100755 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c @@ -885,6 +885,12 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) struct msm_vfe_axi_stream_cfg_update_info *update_info = NULL; struct msm_isp_sw_framskip *sw_skip_info = NULL; + if (update_cmd->num_streams > MSM_ISP_STATS_MAX) { + pr_err("%s: Invalid num_streams %d\n", + __func__, update_cmd->num_streams); + return -EINVAL; + } + /*validate request*/ for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) From 94022fe2daf04b9c32248071aa1e78b5815bd72f Mon Sep 17 00:00:00 2001 From: Fenglin Wu Date: Fri, 14 Jul 2017 00:43:11 -0700 Subject: [PATCH 0963/1015] power: qpnp-fg: Fix Rslow charger compensation workaround Currently, the default Rslow compensation values are read from FG SRAM where the data will be retained during reboot if the profile is not loaded again. If device reboots after Rslow compensation values are modified, the modified values will be read as the default values in the boot up which is not expected. Hence, change reading the default Rslow compensation values from battery profile instead of from FG SRAM. The default Rslow compensation values are part of the battery profile and they are written into FG SRAM when programming the battery profile, so reading them from battery profile is correct and this makes the driver would always get the correct default values. Also, clear the Rslow charger compensation in shutdown() callback, and trigger the Rslow charger compensation check immediately whenever the charger is inserted or removed and active flag is clear or set. CRs-Fixed: 2076453 Change-Id: I5180df615f6a60ba4709b1b3f5e16cdd9ddd3456 Signed-off-by: Fenglin Wu --- drivers/power/qpnp-fg.c | 67 ++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/drivers/power/qpnp-fg.c b/drivers/power/qpnp-fg.c index fed684301f836..eb774749a5f4e 100644 --- a/drivers/power/qpnp-fg.c +++ b/drivers/power/qpnp-fg.c @@ -5368,17 +5368,18 @@ static irqreturn_t fg_first_soc_irq_handler(int irq, void *_chip) static void fg_external_power_changed(struct power_supply *psy) { struct fg_chip *chip = container_of(psy, struct fg_chip, bms_psy); + bool input_present = is_input_present(chip); - if (is_input_present(chip) && chip->rslow_comp.active && + if (input_present ^ chip->rslow_comp.active && chip->rslow_comp.chg_rs_to_rslow > 0 && chip->rslow_comp.chg_rslow_comp_c1 > 0 && chip->rslow_comp.chg_rslow_comp_c2 > 0) schedule_work(&chip->rslow_comp_work); - if (!is_input_present(chip) && chip->resume_soc_lowered) { + if (!input_present && chip->resume_soc_lowered) { fg_stay_awake(&chip->resume_soc_wakeup_source); schedule_work(&chip->set_resume_soc_work); } - if (!is_input_present(chip) && chip->charge_full) + if (!input_present && chip->charge_full) schedule_work(&chip->charge_full_work); } @@ -5443,6 +5444,25 @@ static void set_resume_soc_work(struct work_struct *work) #define RSLOW_COMP_REG 0x528 #define RSLOW_COMP_C1_OFFSET 0 #define RSLOW_COMP_C2_OFFSET 2 +#define BATT_PROFILE_OFFSET 0x4C0 +static void get_default_rslow_comp_settings(struct fg_chip *chip) +{ + int offset; + + offset = RSLOW_CFG_REG + RSLOW_CFG_OFFSET - BATT_PROFILE_OFFSET; + memcpy(&chip->rslow_comp.rslow_cfg, chip->batt_profile + offset, 1); + + offset = RSLOW_THRESH_REG + RSLOW_THRESH_OFFSET - BATT_PROFILE_OFFSET; + memcpy(&chip->rslow_comp.rslow_thr, chip->batt_profile + offset, 1); + + offset = TEMP_RS_TO_RSLOW_REG + RS_TO_RSLOW_CHG_OFFSET - + BATT_PROFILE_OFFSET; + memcpy(&chip->rslow_comp.rs_to_rslow, chip->batt_profile + offset, 2); + + offset = RSLOW_COMP_REG + RSLOW_COMP_C1_OFFSET - BATT_PROFILE_OFFSET; + memcpy(&chip->rslow_comp.rslow_comp, chip->batt_profile + offset, 4); +} + static int populate_system_data(struct fg_chip *chip) { u8 buffer[24]; @@ -5495,37 +5515,7 @@ static int populate_system_data(struct fg_chip *chip) chip->ocv_junction_p1p2, chip->ocv_junction_p2p3); - rc = fg_mem_read(chip, buffer, RSLOW_CFG_REG, 1, RSLOW_CFG_OFFSET, 0); - if (rc) { - pr_err("unable to read rslow cfg: %d\n", rc); - goto done; - } - - chip->rslow_comp.rslow_cfg = buffer[0]; - rc = fg_mem_read(chip, buffer, RSLOW_THRESH_REG, 1, - RSLOW_THRESH_OFFSET, 0); - if (rc) { - pr_err("unable to read rslow thresh: %d\n", rc); - goto done; - } - - chip->rslow_comp.rslow_thr = buffer[0]; - rc = fg_mem_read(chip, buffer, TEMP_RS_TO_RSLOW_REG, 2, - RS_TO_RSLOW_CHG_OFFSET, 0); - if (rc) { - pr_err("unable to read rs to rslow_chg: %d\n", rc); - goto done; - } - - memcpy(chip->rslow_comp.rs_to_rslow, buffer, 2); - rc = fg_mem_read(chip, buffer, RSLOW_COMP_REG, 4, - RSLOW_COMP_C1_OFFSET, 0); - if (rc) { - pr_err("unable to read rslow comp: %d\n", rc); - goto done; - } - - memcpy(chip->rslow_comp.rslow_comp, buffer, 4); + get_default_rslow_comp_settings(chip); done: fg_mem_release(chip); return rc; @@ -5949,7 +5939,6 @@ static void discharge_gain_work(struct work_struct *work) } #define LOW_LATENCY BIT(6) -#define BATT_PROFILE_OFFSET 0x4C0 #define PROFILE_INTEGRITY_REG 0x53C #define PROFILE_INTEGRITY_BIT BIT(0) #define FIRST_EST_DONE_BIT BIT(5) @@ -6369,6 +6358,12 @@ static int fg_batt_profile_init(struct fg_chip *chip) pr_info("Battery profiles same, using default\n"); if (fg_est_dump) schedule_work(&chip->dump_sram); + /* + * Copy the profile read from device tree for + * getting profile parameters later. + */ + memcpy(chip->batt_profile, data, len); + chip->batt_profile_len = len; goto done; } } else { @@ -8923,6 +8918,8 @@ static void fg_shutdown(struct spmi_device *spmi) if (fg_debug_mask & FG_STATUS) pr_emerg("FG shutdown started\n"); + if (chip->rslow_comp.active) + fg_rslow_charge_comp_clear(chip); fg_cancel_all_works(chip); fg_check_ima_idle(chip); chip->fg_shutdown = true; From 7aa8d062efd023d063c4523a1a0802ef9530303c Mon Sep 17 00:00:00 2001 From: Harsh Sahu Date: Thu, 29 Jun 2017 18:50:20 -0700 Subject: [PATCH 0964/1015] msm: mdss: fix the use after free problem in rotator ioctl Currently the fence fd is installed too early. This can cause a use after free problem if the fence fd is closed in some other thread. This change will install the fence fd where it is required and eliminates the problem. Change-Id: I5cf585ea87ef75fccae06da6cb5a6c16fc74eff3 Signed-off-by: Harsh Sahu --- drivers/video/msm/mdss/mdss_rotator.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/video/msm/mdss/mdss_rotator.c b/drivers/video/msm/mdss/mdss_rotator.c index 3a3e51299c968..5dbedc42eb43b 100644 --- a/drivers/video/msm/mdss/mdss_rotator.c +++ b/drivers/video/msm/mdss/mdss_rotator.c @@ -373,6 +373,15 @@ static bool mdss_rotator_is_work_pending(struct mdss_rot_mgr *mgr, return false; } +static void mdss_rotator_install_fence_fd(struct mdss_rot_entry_container *req) +{ + int i = 0; + + for (i = 0; i < req->count; i++) + sync_fence_install(req->entries[i].output_fence, + req->entries[i].output_fence_fd); +} + static int mdss_rotator_create_fence(struct mdss_rot_entry *entry) { int ret = 0, fd; @@ -411,7 +420,6 @@ static int mdss_rotator_create_fence(struct mdss_rot_entry *entry) goto get_fd_err; } - sync_fence_install(fence, fd); rot_timeline->next_value++; mutex_unlock(&rot_timeline->lock); @@ -2248,6 +2256,7 @@ static int mdss_rotator_handle_request(struct mdss_rot_mgr *mgr, goto handle_request_err1; } + mdss_rotator_install_fence_fd(req); mdss_rotator_queue_request(mgr, private, req); mutex_unlock(&mgr->lock); @@ -2408,6 +2417,7 @@ static int mdss_rotator_handle_request32(struct mdss_rot_mgr *mgr, goto handle_request32_err1; } + mdss_rotator_install_fence_fd(req); mdss_rotator_queue_request(mgr, private, req); mutex_unlock(&mgr->lock); From 7043c6b278fe26ef44cfb6db9b60a1122b30f70d Mon Sep 17 00:00:00 2001 From: Brahmaji K Date: Tue, 27 Jun 2017 19:27:37 +0530 Subject: [PATCH 0965/1015] crypto: msm: Fix several race condition issues in crypto drivers Check areq before referencing, replace xchg to automic_xchg and verify return values of set key during SHA operations. Change-Id: Ife01372ba4990bfefe52b82db4ab33ef76190944 Signed-off-by: Brahmaji K --- drivers/crypto/msm/qce50.c | 20 +++++++++++++------- drivers/crypto/msm/qce50.h | 4 ++-- drivers/crypto/msm/qcrypto.c | 14 ++++++++++---- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/drivers/crypto/msm/qce50.c b/drivers/crypto/msm/qce50.c index 3519a356a5c89..7056aaf6a0c55 100644 --- a/drivers/crypto/msm/qce50.c +++ b/drivers/crypto/msm/qce50.c @@ -2168,6 +2168,10 @@ static int _sha_complete(struct qce_device *pce_dev, int req_info) pce_sps_data = &preq_info->ce_sps; qce_callback = preq_info->qce_cb; areq = (struct ahash_request *) preq_info->areq; + if (!areq) { + pr_err("sha operation error. areq is NULL\n"); + return -ENXIO; + } qce_dma_unmap_sg(pce_dev->pdev, areq->src, preq_info->src_nents, DMA_TO_DEVICE); memcpy(digest, (char *)(&pce_sps_data->result->auth_iv[0]), @@ -2915,7 +2919,7 @@ static inline int qce_alloc_req_info(struct qce_device *pce_dev) request_index++; if (request_index >= MAX_QCE_BAM_REQ) request_index = 0; - if (xchg(&pce_dev->ce_request_info[request_index]. + if (atomic_xchg(&pce_dev->ce_request_info[request_index]. in_use, true) == false) { pce_dev->ce_request_index = request_index; return request_index; @@ -2931,7 +2935,8 @@ static inline void qce_free_req_info(struct qce_device *pce_dev, int req_info, bool is_complete) { pce_dev->ce_request_info[req_info].xfer_type = QCE_XFER_TYPE_LAST; - if (xchg(&pce_dev->ce_request_info[req_info].in_use, false) == true) { + if (atomic_xchg(&pce_dev->ce_request_info[req_info].in_use, + false) == true) { if (req_info < MAX_QCE_BAM_REQ && is_complete) atomic_dec(&pce_dev->no_of_queued_req); } else @@ -4542,7 +4547,7 @@ static int qce_dummy_req(struct qce_device *pce_dev) { int ret = 0; - if (!(xchg(&pce_dev->ce_request_info[DUMMY_REQ_INDEX]. + if (!(atomic_xchg(&pce_dev->ce_request_info[DUMMY_REQ_INDEX]. in_use, true) == false)) return -EBUSY; ret = qce_process_sha_req(pce_dev, NULL); @@ -5960,7 +5965,7 @@ void *qce_open(struct platform_device *pdev, int *rc) } for (i = 0; i < MAX_QCE_ALLOC_BAM_REQ; i++) - pce_dev->ce_request_info[i].in_use = false; + atomic_set(&pce_dev->ce_request_info[i].in_use, false); pce_dev->ce_request_index = 0; pce_dev->memsize = 10 * PAGE_SIZE * MAX_QCE_ALLOC_BAM_REQ; @@ -6124,12 +6129,13 @@ EXPORT_SYMBOL(qce_hw_support); void qce_dump_req(void *handle) { int i; + bool req_in_use; struct qce_device *pce_dev = (struct qce_device *)handle; for (i = 0; i < MAX_QCE_BAM_REQ; i++) { - pr_info("qce_dump_req %d %d\n", i, - pce_dev->ce_request_info[i].in_use); - if (pce_dev->ce_request_info[i].in_use == true) + req_in_use = atomic_read(&pce_dev->ce_request_info[i].in_use); + pr_info("qce_dump_req %d %d\n", i, req_in_use); + if (req_in_use == true) _qce_dump_descr_fifos(pce_dev, i); } } diff --git a/drivers/crypto/msm/qce50.h b/drivers/crypto/msm/qce50.h index b2e96fe13c6ee..765eede0b583c 100644 --- a/drivers/crypto/msm/qce50.h +++ b/drivers/crypto/msm/qce50.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -214,7 +214,7 @@ struct ce_sps_data { }; struct ce_request_info { - bool in_use; + atomic_t in_use; bool in_prog; enum qce_xfer_type_enum xfer_type; struct ce_sps_data ce_sps; diff --git a/drivers/crypto/msm/qcrypto.c b/drivers/crypto/msm/qcrypto.c index dd4443f4458de..d73c7789fb14b 100644 --- a/drivers/crypto/msm/qcrypto.c +++ b/drivers/crypto/msm/qcrypto.c @@ -4240,6 +4240,7 @@ static int _sha1_hmac_setkey(struct crypto_ahash *tfm, const u8 *key, unsigned int len) { struct qcrypto_sha_ctx *sha_ctx = crypto_tfm_ctx(&tfm->base); + int ret = 0; memset(&sha_ctx->authkey[0], 0, SHA1_BLOCK_SIZE); if (len <= SHA1_BLOCK_SIZE) { memcpy(&sha_ctx->authkey[0], key, len); @@ -4247,16 +4248,19 @@ static int _sha1_hmac_setkey(struct crypto_ahash *tfm, const u8 *key, } else { sha_ctx->alg = QCE_HASH_SHA1; sha_ctx->diglen = SHA1_DIGEST_SIZE; - _sha_hmac_setkey(tfm, key, len); + ret = _sha_hmac_setkey(tfm, key, len); + if (ret) + pr_err("SHA1 hmac setkey failed\n"); sha_ctx->authkey_in_len = SHA1_BLOCK_SIZE; } - return 0; + return ret; } static int _sha256_hmac_setkey(struct crypto_ahash *tfm, const u8 *key, unsigned int len) { struct qcrypto_sha_ctx *sha_ctx = crypto_tfm_ctx(&tfm->base); + int ret = 0; memset(&sha_ctx->authkey[0], 0, SHA256_BLOCK_SIZE); if (len <= SHA256_BLOCK_SIZE) { @@ -4265,11 +4269,13 @@ static int _sha256_hmac_setkey(struct crypto_ahash *tfm, const u8 *key, } else { sha_ctx->alg = QCE_HASH_SHA256; sha_ctx->diglen = SHA256_DIGEST_SIZE; - _sha_hmac_setkey(tfm, key, len); + ret = _sha_hmac_setkey(tfm, key, len); + if (ret) + pr_err("SHA256 hmac setkey failed\n"); sha_ctx->authkey_in_len = SHA256_BLOCK_SIZE; } - return 0; + return ret; } static int _sha_hmac_init_ihash(struct ahash_request *req, From 68ccd6e493accf59247fd49a4468bcf3d5533c41 Mon Sep 17 00:00:00 2001 From: annamraj Date: Wed, 19 Jul 2017 16:52:55 +0530 Subject: [PATCH 0966/1015] msm: camera: Make use of mutex lock to avoid race condition Make use of mutex lock to access IOCTL so that two threads can avoid race condition. Change-Id: I00db78a42c86eef8a157b5b3547e4ca0006b0853 Signed-off-by: annamraj --- drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c index 3d5dd3e49407a..1377eb27eba8f 100644 --- a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c +++ b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c @@ -1055,14 +1055,18 @@ static int msm_fd_s_ctrl(struct file *file, void *fh, struct v4l2_control *a) a->value = ctx->format.size->work_size; break; case V4L2_CID_FD_WORK_MEMORY_FD: + mutex_lock(&ctx->fd_device->recovery_lock); if (ctx->work_buf.fd != -1) msm_fd_hw_unmap_buffer(&ctx->work_buf); if (a->value >= 0) { ret = msm_fd_hw_map_buffer(&ctx->mem_pool, a->value, &ctx->work_buf); - if (ret < 0) + if (ret < 0) { + mutex_unlock(&ctx->fd_device->recovery_lock); return ret; + } } + mutex_unlock(&ctx->fd_device->recovery_lock); break; default: return -EINVAL; From 4bf9e1dc4cc356bb898cbb0abc9a9a6bca7404a5 Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Wed, 15 Mar 2017 21:27:35 -0700 Subject: [PATCH 0967/1015] msm: ipa: fix security issues in ipa wan driver Fix the security issue in handling add mux channel event in ipa wan driver. Change-Id: Ic2ffeafddad4954ec3ecba0d675646d0790eede7 Signed-off-by: Skylar Chang Acked-by: Shihuan Liu --- drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c | 7 +++++++ drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c index 55b2c024b072d..de17a0e58ccbe 100644 --- a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c @@ -73,6 +73,7 @@ static void *subsys_notify_handle; u32 apps_to_ipa_hdl, ipa_to_apps_hdl; /* get handler from ipa */ static struct mutex ipa_to_apps_pipe_handle_guard; +static struct mutex add_mux_channel_lock; static int wwan_add_ul_flt_rule_to_ipa(void); static int wwan_del_ul_flt_rule_to_ipa(void); static void ipa_wwan_msg_free_cb(void*, u32, u32); @@ -1405,9 +1406,11 @@ static int ipa_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) rmnet_mux_val.mux_id); return rc; } + mutex_lock(&add_mux_channel_lock); if (rmnet_index >= MAX_NUM_OF_MUX_CHANNEL) { IPAWANERR("Exceed mux_channel limit(%d)\n", rmnet_index); + mutex_unlock(&add_mux_channel_lock); return -EFAULT; } IPAWANDBG("ADD_MUX_CHANNEL(%d, name: %s)\n", @@ -1436,6 +1439,7 @@ static int ipa_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) IPAWANERR("device %s reg IPA failed\n", extend_ioctl_data.u. rmnet_mux_val.vchannel_name); + mutex_unlock(&add_mux_channel_lock); return -ENODEV; } mux_channel[rmnet_index].mux_channel_set = true; @@ -1448,6 +1452,7 @@ static int ipa_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) mux_channel[rmnet_index].ul_flt_reg = false; } rmnet_index++; + mutex_unlock(&add_mux_channel_lock); break; case RMNET_IOCTL_SET_EGRESS_DATA_FORMAT: IPAWANDBG("get RMNET_IOCTL_SET_EGRESS_DATA_FORMAT\n"); @@ -2798,6 +2803,7 @@ static int __init ipa_wwan_init(void) atomic_set(&is_ssr, 0); mutex_init(&ipa_to_apps_pipe_handle_guard); + mutex_init(&add_mux_channel_lock); ipa_to_apps_hdl = -1; ipa_qmi_init(); @@ -2816,6 +2822,7 @@ static void __exit ipa_wwan_cleanup(void) int ret; ipa_qmi_cleanup(); mutex_destroy(&ipa_to_apps_pipe_handle_guard); + mutex_destroy(&add_mux_channel_lock); ret = subsys_notif_unregister_notifier(subsys_notify_handle, &ssr_notifier); if (ret) diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index b49dcbf04d1ba..251407bfa1de2 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -131,6 +131,7 @@ struct rmnet_ipa3_context { u32 apps_to_ipa3_hdl; u32 ipa3_to_apps_hdl; struct mutex ipa_to_apps_pipe_handle_guard; + struct mutex add_mux_channel_lock; }; static struct rmnet_ipa3_context *rmnet_ipa3_ctx; @@ -1423,10 +1424,13 @@ static int ipa3_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) rmnet_mux_val.mux_id); return rc; } + mutex_lock(&rmnet_ipa3_ctx->add_mux_channel_lock); if (rmnet_ipa3_ctx->rmnet_index >= MAX_NUM_OF_MUX_CHANNEL) { IPAWANERR("Exceed mux_channel limit(%d)\n", rmnet_ipa3_ctx->rmnet_index); + mutex_unlock(&rmnet_ipa3_ctx-> + add_mux_channel_lock); return -EFAULT; } IPAWANDBG("ADD_MUX_CHANNEL(%d, name: %s)\n", @@ -1460,6 +1464,8 @@ static int ipa3_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) IPAWANERR("device %s reg IPA failed\n", extend_ioctl_data.u. rmnet_mux_val.vchannel_name); + mutex_unlock(&rmnet_ipa3_ctx-> + add_mux_channel_lock); return -ENODEV; } mux_channel[rmnet_index].mux_channel_set = true; @@ -1472,6 +1478,7 @@ static int ipa3_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) mux_channel[rmnet_index].ul_flt_reg = false; } rmnet_ipa3_ctx->rmnet_index++; + mutex_unlock(&rmnet_ipa3_ctx->add_mux_channel_lock); break; case RMNET_IOCTL_SET_EGRESS_DATA_FORMAT: IPAWANDBG("get RMNET_IOCTL_SET_EGRESS_DATA_FORMAT\n"); @@ -2895,6 +2902,7 @@ static int __init ipa3_wwan_init(void) atomic_set(&rmnet_ipa3_ctx->is_ssr, 0); mutex_init(&rmnet_ipa3_ctx->ipa_to_apps_pipe_handle_guard); + mutex_init(&rmnet_ipa3_ctx->add_mux_channel_lock); rmnet_ipa3_ctx->ipa3_to_apps_hdl = -1; ipa3_qmi_init(); @@ -2912,8 +2920,10 @@ static int __init ipa3_wwan_init(void) static void __exit ipa3_wwan_cleanup(void) { int ret; + ipa3_qmi_cleanup(); mutex_destroy(&rmnet_ipa3_ctx->ipa_to_apps_pipe_handle_guard); + mutex_destroy(&rmnet_ipa3_ctx->add_mux_channel_lock); ret = subsys_notif_unregister_notifier( rmnet_ipa3_ctx->subsys_notify_handle, &ipa3_ssr_notifier); if (ret) From 7d686ee27e1031a799c09fdb89932a00c75a1a59 Mon Sep 17 00:00:00 2001 From: Weiyin Jiang Date: Fri, 28 Jul 2017 11:01:40 +0800 Subject: [PATCH 0968/1015] SoC: msm: audio-effects: return directly to avoid integer overflow Return error code directly to avoid further integer overflow leading to buffer overflow. Change-Id: I8b74efda227726494724f4387c45b5b6fa04637b CRs-Fixed: 2077909 Signed-off-by: Weiyin Jiang --- .../soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c index e312a879b86a5..1286d31857802 100644 --- a/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c @@ -155,7 +155,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "VIRT ENABLE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_VIRTUALIZER; *updt_params++ = @@ -183,7 +183,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "VIRT STRENGTH", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_VIRTUALIZER; *updt_params++ = @@ -211,7 +211,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "VIRT OUT_TYPE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_VIRTUALIZER; *updt_params++ = @@ -239,7 +239,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "VIRT GAIN_ADJUST", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_VIRTUALIZER; *updt_params++ = @@ -318,7 +318,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_ENABLE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -346,7 +346,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_MODE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -374,7 +374,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_PRESET", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -402,7 +402,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_WET_MIX", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -430,7 +430,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_GAIN_ADJUST", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -458,7 +458,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_ROOM_LEVEL", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -486,7 +486,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_ROOM_HF_LEVEL", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -514,7 +514,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_DECAY_TIME", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -542,7 +542,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_DECAY_HF_RATIO", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -570,7 +570,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_REFLECTIONS_LEVEL", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -598,7 +598,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_REFLECTIONS_DELAY", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -626,7 +626,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_LEVEL", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -654,7 +654,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_DELAY", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -682,7 +682,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_DIFFUSION", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -710,7 +710,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_DENSITY", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -790,7 +790,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "BASS_BOOST_ENABLE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_BASS_BOOST; *updt_params++ = @@ -818,7 +818,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "BASS_BOOST_MODE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_BASS_BOOST; *updt_params++ = @@ -846,7 +846,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "BASS_BOOST_STRENGTH", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_BASS_BOOST; *updt_params++ = @@ -924,7 +924,7 @@ int msm_audio_effects_pbe_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "PBE_ENABLE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_PBE; *updt_params++ = @@ -950,7 +950,7 @@ int msm_audio_effects_pbe_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "PBE_PARAM", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_PBE; *updt_params++ = @@ -1035,7 +1035,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "EQ_ENABLE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; *updt_params++ = @@ -1103,7 +1103,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "EQ_CONFIG", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; *updt_params++ = @@ -1154,7 +1154,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "EQ_BAND_INDEX", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; *updt_params++ = @@ -1186,7 +1186,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "EQ_SINGLE_BAND_FREQ", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; *updt_params++ = @@ -1276,7 +1276,7 @@ static int __msm_audio_effects_volume_handler(struct audio_client *ac, "VOLUME/VOLUME2_GAIN_2CH", rc); if (rc != 0) - break; + goto invalid_config; if (instance == SOFT_VOLUME_INSTANCE_2) *updt_params++ = ASM_MODULE_ID_VOL_CTRL2; @@ -1325,7 +1325,7 @@ static int __msm_audio_effects_volume_handler(struct audio_client *ac, "VOLUME/VOLUME2_GAIN_MASTER", rc); if (rc != 0) - break; + goto invalid_config; if (instance == SOFT_VOLUME_INSTANCE_2) *updt_params++ = ASM_MODULE_ID_VOL_CTRL2; From e083ac1a82f1fd114beefb11c6719e368473b537 Mon Sep 17 00:00:00 2001 From: Tony Truong Date: Fri, 6 Jan 2017 14:03:03 -0800 Subject: [PATCH 0969/1015] msm: pcie: add bounds check for debugfs register write Via debugfs nodes, users have the option to read and write to any PCIe register. To ensure clients do not access registers outside the PCIe range, add checks to validate the offset clients provide. Change-Id: Ia35cd04c57f01c21a47962be596bca395b5ca247 Signed-off-by: Tony Truong --- drivers/pci/host/pci-msm.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/pci/host/pci-msm.c b/drivers/pci/host/pci-msm.c index 96eeaa9f66fc4..bf9af36554358 100644 --- a/drivers/pci/host/pci-msm.c +++ b/drivers/pci/host/pci-msm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2332,8 +2332,16 @@ static void msm_pcie_sel_debug_testcase(struct msm_pcie_dev_t *dev, dev->res[base_sel - 1].base, wr_offset, wr_mask, wr_value); - msm_pcie_write_reg_field(dev->res[base_sel - 1].base, - wr_offset, wr_mask, wr_value); + base_sel_size = resource_size(dev->res[base_sel - 1].resource); + + if (wr_offset > base_sel_size - 4 || + msm_pcie_check_align(dev, wr_offset)) + PCIE_DBG_FS(dev, + "PCIe: RC%d: Invalid wr_offset: 0x%x. wr_offset should be no more than 0x%x\n", + dev->rc_idx, wr_offset, base_sel_size - 4); + else + msm_pcie_write_reg_field(dev->res[base_sel - 1].base, + wr_offset, wr_mask, wr_value); break; case 13: /* dump all registers of base_sel */ From ae5355d3cf74f21fa057d9156e019b7566ea8b87 Mon Sep 17 00:00:00 2001 From: Mohit Aggarwal Date: Sat, 22 Apr 2017 10:49:18 +0530 Subject: [PATCH 0970/1015] diag: dci: Add protection while querying event status Currently, protection is missing when querying event status due to which already removed dci client entry might be accessed. This patch takes care of issue by taking proper locking. CRs-Fixed: 2015892 Change-Id: I4195c4c6198d85e96559f1728d74419527a76bc5 Signed-off-by: Mohit Aggarwal --- drivers/char/diag/diagchar_core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index 427c857e6361f..f4f5bce730934 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -2206,7 +2206,9 @@ long diagchar_ioctl(struct file *filp, mutex_unlock(&driver->dci_mutex); break; case DIAG_IOCTL_DCI_EVENT_STATUS: + mutex_lock(&driver->dci_mutex); result = diag_ioctl_dci_event_status(ioarg); + mutex_unlock(&driver->dci_mutex); break; case DIAG_IOCTL_DCI_CLEAR_LOGS: mutex_lock(&driver->dci_mutex); From 316421f5bc3695e188af62ec990aec540bfe68b9 Mon Sep 17 00:00:00 2001 From: Gaoxiang Chen Date: Wed, 17 May 2017 15:14:36 +0800 Subject: [PATCH 0971/1015] msm: camera: fix off-by-one overflow in msm_isp_get_bufq In msm_isp_get_bufq, if bufq_index equals buf_mgr->num_buf_q, it will pass the check, leading to off-by-one overflow (exceed the length of array by one element). CRs-Fixed: 2031677 Change-Id: I7ea465897e2c37de6ca0155c3e225f1444b3cf13 Signed-off-by: Gaoxiang Chen --- drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c index 583e3f67ad413..7bc8f9cd5ebfe 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c @@ -86,7 +86,7 @@ struct msm_isp_bufq *msm_isp_get_bufq( /* bufq_handle cannot be 0 */ if ((bufq_handle == 0) || bufq_index >= BUF_MGR_NUM_BUF_Q || - (bufq_index > buf_mgr->num_buf_q)) + (bufq_index >= buf_mgr->num_buf_q)) return NULL; bufq = &buf_mgr->bufq[bufq_index]; From efa2b4ca56f603f3b23e2171a71ae704f8485297 Mon Sep 17 00:00:00 2001 From: Sarada Prasanna Garnayak Date: Mon, 17 Jul 2017 12:37:03 +0530 Subject: [PATCH 0972/1015] cnss_pci: fix the race condition bug in WLAN firmware table config Update the synchronization process of the cnss platform driver memory expansion and WLAN firmware table configuration from the userspace through sysfs firmware update node. CRs-Fixed: 2071560 Change-Id: I672ba84ad10c905be7855c1b8a930ac7adf349f1 Signed-off-by: Sarada Prasanna Garnayak --- drivers/net/wireless/cnss/cnss_pci.c | 51 ++++++++-------------------- 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c index 4f6eeda76f9f2..00bcc12d14061 100644 --- a/drivers/net/wireless/cnss/cnss_pci.c +++ b/drivers/net/wireless/cnss/cnss_pci.c @@ -137,7 +137,6 @@ static DEFINE_SPINLOCK(pci_link_down_lock); #define FW_IMAGE_MISSION (0x02) #define FW_IMAGE_BDATA (0x03) #define FW_IMAGE_PRINT (0x04) -#define FW_SETUP_DELAY 2000 #define SEG_METADATA (0x01) #define SEG_NON_PAGED (0x02) @@ -279,10 +278,8 @@ static struct cnss_data { u32 fw_dma_size; u32 fw_seg_count; struct segment_memory fw_seg_mem[MAX_NUM_OF_SEGMENTS]; - atomic_t fw_store_in_progress; /* Firmware setup complete lock */ struct mutex fw_setup_stat_lock; - struct completion fw_setup_complete; void *bdata_cpu; dma_addr_t bdata_dma; u32 bdata_dma_size; @@ -1437,15 +1434,6 @@ int cnss_get_fw_image(struct image_desc_info *image_desc_info) !penv->fw_seg_count || !penv->bdata_seg_count) return -EINVAL; - /* Check for firmware setup trigger by usersapce is in progress - * and wait for complition of firmware setup. - */ - - if (atomic_read(&penv->fw_store_in_progress)) { - wait_for_completion_timeout(&penv->fw_setup_complete, - msecs_to_jiffies(FW_SETUP_DELAY)); - } - mutex_lock(&penv->fw_setup_stat_lock); image_desc_info->fw_addr = penv->fw_dma; image_desc_info->fw_size = penv->fw_dma_size; @@ -1699,7 +1687,9 @@ static int cnss_wlan_pci_probe(struct pci_dev *pdev, goto err_pcie_suspend; } + mutex_lock(&penv->fw_setup_stat_lock); cnss_wlan_fw_mem_alloc(pdev); + mutex_unlock(&penv->fw_setup_stat_lock); ret = device_create_file(&penv->pldev->dev, &dev_attr_wlan_setup); @@ -1946,17 +1936,11 @@ static ssize_t fw_image_setup_store(struct device *dev, if (!penv) return -ENODEV; - if (atomic_read(&penv->fw_store_in_progress)) { - pr_info("%s: Firmware setup in progress\n", __func__); - return 0; - } - - atomic_set(&penv->fw_store_in_progress, 1); - init_completion(&penv->fw_setup_complete); + mutex_lock(&penv->fw_setup_stat_lock); + pr_info("%s: Firmware setup in progress\n", __func__); if (kstrtoint(buf, 0, &val)) { - atomic_set(&penv->fw_store_in_progress, 0); - complete(&penv->fw_setup_complete); + mutex_unlock(&penv->fw_setup_stat_lock); return -EINVAL; } @@ -1967,8 +1951,7 @@ static ssize_t fw_image_setup_store(struct device *dev, if (ret != 0) { pr_err("%s: Invalid parsing of FW image files %d", __func__, ret); - atomic_set(&penv->fw_store_in_progress, 0); - complete(&penv->fw_setup_complete); + mutex_unlock(&penv->fw_setup_stat_lock); return -EINVAL; } penv->fw_image_setup = val; @@ -1978,9 +1961,8 @@ static ssize_t fw_image_setup_store(struct device *dev, penv->bmi_test = val; } - atomic_set(&penv->fw_store_in_progress, 0); - complete(&penv->fw_setup_complete); - + pr_info("%s: Firmware setup completed\n", __func__); + mutex_unlock(&penv->fw_setup_stat_lock); return count; } @@ -2079,16 +2061,21 @@ int cnss_get_codeswap_struct(struct codeswap_codeseg_info *swap_seg) { struct codeswap_codeseg_info *cnss_seg_info = penv->cnss_seg_info; + mutex_lock(&penv->fw_setup_stat_lock); if (!cnss_seg_info) { swap_seg = NULL; + mutex_unlock(&penv->fw_setup_stat_lock); return -ENOENT; } + if (!atomic_read(&penv->fw_available)) { pr_debug("%s: fw is not available\n", __func__); + mutex_unlock(&penv->fw_setup_stat_lock); return -ENOENT; } *swap_seg = *cnss_seg_info; + mutex_unlock(&penv->fw_setup_stat_lock); return 0; } @@ -2108,15 +2095,6 @@ static void cnss_wlan_memory_expansion(void) struct pci_dev *pdev; filename = cnss_wlan_get_evicted_data_file(); - /* Check for firmware setup trigger by usersapce is in progress - * and wait for complition of firmware setup. - */ - - if (atomic_read(&penv->fw_store_in_progress)) { - wait_for_completion_timeout(&penv->fw_setup_complete, - msecs_to_jiffies(FW_SETUP_DELAY)); - } - mutex_lock(&penv->fw_setup_stat_lock); pdev = penv->pdev; dev = &pdev->dev; @@ -2926,6 +2904,7 @@ static int cnss_probe(struct platform_device *pdev) penv->vreg_info.wlan_reg = NULL; penv->vreg_info.state = VREG_OFF; penv->pci_register_again = false; + mutex_init(&penv->fw_setup_stat_lock); ret = cnss_wlan_get_resources(pdev); if (ret) @@ -3086,8 +3065,6 @@ static int cnss_probe(struct platform_device *pdev) memset(phys_to_virt(0), 0, SZ_4K); #endif - atomic_set(&penv->fw_store_in_progress, 0); - mutex_init(&penv->fw_setup_stat_lock); ret = device_create_file(dev, &dev_attr_fw_image_setup); if (ret) { pr_err("cnss: fw_image_setup sys file creation failed\n"); From c84d655bd23e49cb99e1a9c04a0969171eea7748 Mon Sep 17 00:00:00 2001 From: Srinivas Dasari Date: Fri, 7 Jul 2017 01:43:41 +0300 Subject: [PATCH 0973/1015] cfg80211: Define nla_policy for NL80211_ATTR_LOCAL_MESH_POWER_MODE Buffer overread may happen as nl80211_set_station() reads 4 bytes from the attribute NL80211_ATTR_LOCAL_MESH_POWER_MODE without validating the size of data received when userspace sends less than 4 bytes of data with NL80211_ATTR_LOCAL_MESH_POWER_MODE. Define nla_policy for NL80211_ATTR_LOCAL_MESH_POWER_MODE to avoid the buffer overread. Fixes: 3b1c5a5307f ("{cfg,nl}80211: mesh power mode primitives and userspace access") Cc: stable@vger.kernel.org Signed-off-by: Srinivas Dasari Signed-off-by: Jouni Malinen Signed-off-by: Johannes Berg Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git Git-commit: 8feb69c7bd89513be80eb19198d48f154b254021 Change-Id: Ie20993309501fd242782311b9fe787931f716116 CRs-Fixed: 2055013 Signed-off-by: Srinivas Dasari --- net/wireless/nl80211.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 1926d8d553bde..6c06434657996 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -358,6 +358,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 }, [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 }, + [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = {. type = NLA_U32 }, [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, From 7f7cc32d1285fb75f1337f4af6384d84f56fe381 Mon Sep 17 00:00:00 2001 From: Abhilash Kumar Date: Fri, 28 Jul 2017 16:29:53 +0530 Subject: [PATCH 0974/1015] msm: kgsl: Fix integer overflow in _load_gpmu_firmware There is a possibility of integer overflow in the arithmetic calculation for cmd_size. Fix this by adding checks for such arithmetic. Change-Id: I2298a32f8ba3411decb29f55bb7b55e2214de35a Signed-off-by: Abhilash Kumar --- drivers/gpu/msm/adreno_a5xx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c index 7ae9d16ff1bf4..adad5dd6d0e8e 100644 --- a/drivers/gpu/msm/adreno_a5xx.c +++ b/drivers/gpu/msm/adreno_a5xx.c @@ -650,6 +650,10 @@ static int _load_gpmu_firmware(struct adreno_device *adreno_dev) if (ret) goto err; + /* Integer overflow check for cmd_size */ + if (data[2] > (data[0] - 2)) + goto err; + cmds = data + data[2] + 3; cmd_size = data[0] - data[2] - 2; From e8015a1d5edcb406a15a677028587c13d515667a Mon Sep 17 00:00:00 2001 From: Rama Krishna Phani A Date: Wed, 19 Jul 2017 19:04:16 +0530 Subject: [PATCH 0975/1015] thermal: tsens: Disable Tsens interrupts during driver initialization TSENS upper lower interrupt for all sensors will be enabled by default. Disable interrupts during driver initialization and enable them based on client requirement. Change-Id: I7ad5d50ec9bb2a4c782787c7a1a6b8b42b1128fc Signed-off-by: Rama Krishna Phani A --- drivers/thermal/msm-tsens.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/thermal/msm-tsens.c b/drivers/thermal/msm-tsens.c index 321b1eca7a3b0..525f740a9b62e 100644 --- a/drivers/thermal/msm-tsens.c +++ b/drivers/thermal/msm-tsens.c @@ -87,6 +87,7 @@ #define TSENS_TM_CRITICAL_INT_EN BIT(2) #define TSENS_TM_UPPER_INT_EN BIT(1) #define TSENS_TM_LOWER_INT_EN BIT(0) +#define TSENS_TM_UPPER_LOWER_INT_DISABLE 0xffffffff #define TSENS_TM_UPPER_INT_MASK(n) (((n) & 0xffff0000) >> 16) #define TSENS_TM_LOWER_INT_MASK(n) ((n) & 0xffff) @@ -843,8 +844,8 @@ struct tsens_tm_device { uint32_t tsens_num_sensor; int tsens_irq; int tsens_critical_irq; - void *tsens_addr; - void *tsens_calib_addr; + void __iomem *tsens_addr; + void __iomem *tsens_calib_addr; int tsens_len; int calib_len; struct resource *res_tsens_mem; @@ -2710,6 +2711,7 @@ static int tsens_hw_init(struct tsens_tm_device *tmdev) { void __iomem *srot_addr; unsigned int srot_val; + void __iomem *int_mask_addr; if (!tmdev) { pr_err("Invalid tsens device\n"); @@ -2723,6 +2725,10 @@ static int tsens_hw_init(struct tsens_tm_device *tmdev) pr_err("TSENS device is not enabled\n"); return -ENODEV; } + int_mask_addr = TSENS_TM_UPPER_LOWER_INT_MASK + (tmdev->tsens_addr); + writel_relaxed(TSENS_TM_UPPER_LOWER_INT_DISABLE, + int_mask_addr); writel_relaxed(TSENS_TM_CRITICAL_INT_EN | TSENS_TM_UPPER_INT_EN | TSENS_TM_LOWER_INT_EN, TSENS_TM_INT_EN(tmdev->tsens_addr)); From bff011f0a1a9222eef398bff73f01c0ea1aed2ee Mon Sep 17 00:00:00 2001 From: Trishansh Bhardwaj Date: Thu, 13 Jul 2017 17:10:39 +0530 Subject: [PATCH 0976/1015] msm: camera: Instead of read_lock use read_lock_irqsave. Prevent deadlock between tasklet and delete_stream by stopping irq during delete_stream. CRs-Fixed: 2076578 Change-Id: Ibcc9fd44403d24112b01150a7d1f3c6e705ea99a Signed-off-by: Trishansh Bhardwaj Signed-off-by: VijayaKumar T M --- drivers/media/platform/msm/camera_v2/msm.c | 11 ++- .../platform/msm/camera_v2/msm_vb2/msm_vb2.c | 88 ++++++++++--------- 2 files changed, 55 insertions(+), 44 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index 09fd13a023608..a0a0737807dba 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -285,6 +285,7 @@ void msm_delete_stream(unsigned int session_id, unsigned int stream_id) return; while (1) { + unsigned long wl_flags; if (try_count > 5) { pr_err("%s : not able to delete stream %d\n", @@ -292,18 +293,20 @@ void msm_delete_stream(unsigned int session_id, unsigned int stream_id) break; } - write_lock(&session->stream_rwlock); + write_lock_irqsave(&session->stream_rwlock, wl_flags); try_count++; stream = msm_queue_find(&session->stream_q, struct msm_stream, list, __msm_queue_find_stream, &stream_id); if (!stream) { - write_unlock(&session->stream_rwlock); + write_unlock_irqrestore(&session->stream_rwlock, + wl_flags); return; } if (msm_vb2_get_stream_state(stream) != 1) { - write_unlock(&session->stream_rwlock); + write_unlock_irqrestore(&session->stream_rwlock, + wl_flags); continue; } @@ -313,7 +316,7 @@ void msm_delete_stream(unsigned int session_id, unsigned int stream_id) kfree(stream); stream = NULL; spin_unlock_irqrestore(&(session->stream_q.lock), flags); - write_unlock(&session->stream_rwlock); + write_unlock_irqrestore(&session->stream_rwlock, wl_flags); break; } diff --git a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c index 834e8fae99ab6..a1e37b3c81621 100644 --- a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c +++ b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c @@ -46,22 +46,23 @@ int msm_vb2_buf_init(struct vb2_buffer *vb) struct msm_stream *stream; struct msm_session *session; struct msm_vb2_buffer *msm_vb2_buf; + unsigned long rl_flags; session = msm_get_session_from_vb2q(vb->vb2_queue); if (IS_ERR_OR_NULL(session)) return -EINVAL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s: Couldn't find stream\n", __func__); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } msm_vb2_buf = container_of(vb, struct msm_vb2_buffer, vb2_buf); msm_vb2_buf->in_freeq = 0; - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return 0; } @@ -70,7 +71,7 @@ static void msm_vb2_buf_queue(struct vb2_buffer *vb) struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct msm_session *session; - unsigned long flags; + unsigned long flags, rl_flags; msm_vb2 = container_of(vb, struct msm_vb2_buffer, vb2_buf); @@ -83,19 +84,19 @@ static void msm_vb2_buf_queue(struct vb2_buffer *vb) if (IS_ERR_OR_NULL(session)) return; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s:%d] NULL stream", __func__, __LINE__); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } spin_lock_irqsave(&stream->stream_lock, flags); list_add_tail(&msm_vb2->list, &stream->queued_list); spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); } static void msm_vb2_buf_finish(struct vb2_buffer *vb) @@ -103,26 +104,26 @@ static void msm_vb2_buf_finish(struct vb2_buffer *vb) struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct msm_session *session; - unsigned long flags; + unsigned long flags, rl_flags; struct msm_vb2_buffer *msm_vb2_entry, *temp; msm_vb2 = container_of(vb, struct msm_vb2_buffer, vb2_buf); if (!msm_vb2) { pr_err("%s:%d] vb2_buf NULL", __func__, __LINE__); - return; + return; } session = msm_get_session_from_vb2q(vb->vb2_queue); if (IS_ERR_OR_NULL(session)) return; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s:%d] NULL stream", __func__, __LINE__); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } @@ -135,7 +136,7 @@ static void msm_vb2_buf_finish(struct vb2_buffer *vb) } } spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } @@ -144,19 +145,19 @@ static void msm_vb2_stop_stream(struct vb2_queue *q) struct msm_vb2_buffer *msm_vb2, *temp; struct msm_stream *stream; struct msm_session *session; - unsigned long flags; + unsigned long flags, rl_flags; struct vb2_buffer *vb2_buf; session = msm_get_session_from_vb2q(q); if (IS_ERR_OR_NULL(session)) return; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream_from_vb2q(q); if (!stream) { pr_err_ratelimited("%s:%d] NULL stream", __func__, __LINE__); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } @@ -175,7 +176,7 @@ static void msm_vb2_stop_stream(struct vb2_queue *q) msm_vb2->in_freeq = 0; } spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); } int msm_vb2_get_stream_state(struct msm_stream *stream) @@ -252,17 +253,17 @@ static struct vb2_buffer *msm_vb2_get_buf(int session_id, struct vb2_buffer *vb2_buf = NULL; struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; - unsigned long flags; + unsigned long flags, rl_flags; session = msm_get_session(session_id); if (IS_ERR_OR_NULL(session)) return NULL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return NULL; } @@ -288,7 +289,8 @@ static struct vb2_buffer *msm_vb2_get_buf(int session_id, vb2_buf = NULL; end: spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); + return vb2_buf; } @@ -299,18 +301,18 @@ static struct vb2_buffer *msm_vb2_get_buf_by_idx(int session_id, struct vb2_buffer *vb2_buf = NULL; struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; - unsigned long flags; + unsigned long flags, rl_flags; session = msm_get_session(session_id); if (IS_ERR_OR_NULL(session)) return NULL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return NULL; } @@ -334,10 +336,12 @@ static struct vb2_buffer *msm_vb2_get_buf_by_idx(int session_id, vb2_buf = NULL; end: spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); + return vb2_buf; } + static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, unsigned int stream_id) { @@ -346,17 +350,17 @@ static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, struct msm_vb2_buffer *msm_vb2; struct vb2_buffer *vb2_buf = NULL; int rc = 0; - unsigned long flags; + unsigned long flags, rl_flags; session = msm_get_session(session_id); if (IS_ERR_OR_NULL(session)) return -EINVAL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } @@ -371,6 +375,8 @@ static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, pr_err("VB buffer is INVALID vb=%pK, ses_id=%d, str_id=%d\n", vb, session_id, stream_id); spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, + rl_flags); return -EINVAL; } msm_vb2 = @@ -386,7 +392,7 @@ static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, rc = -EINVAL; } spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return rc; } @@ -394,7 +400,7 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, unsigned int stream_id, uint32_t sequence, struct timeval *ts, uint32_t reserved) { - unsigned long flags; + unsigned long flags, rl_flags; struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; @@ -405,11 +411,11 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, if (IS_ERR_OR_NULL(session)) return -EINVAL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } @@ -424,6 +430,8 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, pr_err("VB buffer is INVALID ses_id=%d, str_id=%d, vb=%pK\n", session_id, stream_id, vb); spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, + rl_flags); return -EINVAL; } msm_vb2 = @@ -444,7 +452,7 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, rc = -EINVAL; } spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return rc; } @@ -455,18 +463,18 @@ long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id, struct vb2_buffer *vb2_buf = NULL; struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; - unsigned long flags; + unsigned long flags, rl_flags; long rc = -EINVAL; session = msm_get_session(session_id); if (IS_ERR_OR_NULL(session)) return rc; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } @@ -494,14 +502,14 @@ long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id, end: spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return rc; } EXPORT_SYMBOL(msm_vb2_return_buf_by_idx); static int msm_vb2_flush_buf(int session_id, unsigned int stream_id) { - unsigned long flags; + unsigned long flags, rl_flags; struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; @@ -511,11 +519,11 @@ static int msm_vb2_flush_buf(int session_id, unsigned int stream_id) if (IS_ERR_OR_NULL(session)) return -EINVAL; - read_lock(&session->stream_rwlock); + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream(session, stream_id); if (IS_ERR_OR_NULL(stream)) { - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } @@ -527,7 +535,7 @@ static int msm_vb2_flush_buf(int session_id, unsigned int stream_id) msm_vb2->in_freeq = 0; } spin_unlock_irqrestore(&stream->stream_lock, flags); - read_unlock(&session->stream_rwlock); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return 0; } From 8f3e5648ba1c100e56de794ed42877df34fd562a Mon Sep 17 00:00:00 2001 From: "Sravan Kumar D.V.N" Date: Fri, 23 Jun 2017 20:15:13 +0530 Subject: [PATCH 0977/1015] msm: mdss: Avoid direct dereference user input in pp cache config Eliminate direct dereferencing of user input pointer in pp cache config functions. Change-Id: Ia07a0ecc3b4839635cbd9c2f635c1f713783683c CRs-Fixed: 2057285 Signed-off-by: Sravan Kumar D.V.N --- .../video/msm/mdss/mdss_mdp_pp_cache_config.c | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c b/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c index ab178ae45cf86..4252c9cdd6f5b 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -185,8 +185,12 @@ static int pp_hist_lut_cache_params_pipe_v1_7(struct mdp_hist_lut_data *config, return -EINVAL; } - memcpy(&hist_lut_usr_config, config->cfg_payload, - sizeof(struct mdp_hist_lut_data_v1_7)); + if (copy_from_user(&hist_lut_usr_config, + (void __user *) config->cfg_payload, + sizeof(hist_lut_usr_config))) { + pr_err("failed to copy hist lut config\n"); + return -EFAULT; + } hist_lut_cache_data = pipe->pp_res.hist_lut_cfg_payload; if (!hist_lut_cache_data) { @@ -597,8 +601,12 @@ static int pp_pcc_cache_params_pipe_v1_7(struct mdp_pcc_cfg_data *config, return -EINVAL; } - memcpy(&v17_usr_config, config->cfg_payload, - sizeof(v17_usr_config)); + if (copy_from_user(&v17_usr_config, + (void __user *) config->cfg_payload, + sizeof(v17_usr_config))) { + pr_err("failed to copy pcc config\n"); + return -EFAULT; + } if (!(config->ops & MDP_PP_OPS_WRITE)) { pr_debug("write ops not set value of flag is %d\n", @@ -852,8 +860,12 @@ static int pp_igc_lut_cache_params_pipe_v1_7(struct mdp_igc_lut_data *config, goto igc_config_exit; } - memcpy(&v17_usr_config, config->cfg_payload, - sizeof(v17_usr_config)); + if (copy_from_user(&v17_usr_config, + (void __user *) config->cfg_payload, + sizeof(v17_usr_config))) { + pr_err("failed to copy igc config\n"); + return -EFAULT; + } if (!(config->ops & MDP_PP_OPS_WRITE)) { pr_debug("op for gamut %d\n", config->ops); @@ -1248,8 +1260,12 @@ static int pp_pa_cache_params_pipe_v1_7(struct mdp_pa_v2_cfg_data *config, return -EINVAL; } - memcpy(&pa_usr_config, config->cfg_payload, - sizeof(struct mdp_pa_data_v1_7)); + if (copy_from_user(&pa_usr_config, + (void __user *) config->cfg_payload, + sizeof(pa_usr_config))) { + pr_err("failed to copy pa usr config\n"); + return -EFAULT; + } pa_cache_data = pipe->pp_res.pa_cfg_payload; if (!pa_cache_data) { From 6f26ff2ff830a4d482c98c76fa5d6d1b8b5a2c94 Mon Sep 17 00:00:00 2001 From: Krishna Manikandan Date: Thu, 25 May 2017 11:50:56 +0530 Subject: [PATCH 0978/1015] fbdev: core: Initialise structure to prevent kernel information leak The structure fix is initialised before its usage to prevent kernel information leak during copy_to_user. Change-Id: Ice4da4c9bd6095a4387e1d16cb20ca474accb9dc Signed-off-by: Krishna Manikandan --- drivers/video/fbdev/core/fbmem.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index c082ae8e50ce4..2a708dd2eceed 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -1097,6 +1097,13 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, void __user *argp = (void __user *)arg; long ret = 0; + memset(&var, 0, sizeof(var)); + memset(&fix, 0, sizeof(fix)); + memset(&con2fb, 0, sizeof(con2fb)); + memset(&cmap_from, 0, sizeof(cmap_from)); + memset(&cmap, 0, sizeof(cmap)); + memset(&event, 0, sizeof(event)); + switch (cmd) { case FBIOGET_VSCREENINFO: if (!lock_fb_info(info)) From b666c99c402cff9bd2fe15023f241c74951c9237 Mon Sep 17 00:00:00 2001 From: Kiran Gunda Date: Mon, 24 Jul 2017 18:10:36 +0530 Subject: [PATCH 0979/1015] ARM: dts: msm: add support of PMI8937/PMI8940 for MSM8953 Add device tree files to support MSM8953 + PMI8937/PMI8940 platform. The right dtb is dynamically detected based on the pmic-id. Change-Id: I91e3e381093806f4d9511b0d013d5a4daaae9a30 Signed-off-by: Kiran Gunda --- arch/arm/boot/dts/qcom/Makefile | 12 +- arch/arm/boot/dts/qcom/apq8053-cdp.dts | 12 +- .../boot/dts/qcom/apq8053-ext-audio-mtp.dts | 27 ++++- arch/arm/boot/dts/qcom/apq8053-iot-mtp.dts | 27 ++++- arch/arm/boot/dts/qcom/apq8053-mtp.dts | 24 +++- .../dts/qcom/msm8953-camera-sensor-cdp.dtsi | 13 +-- .../dts/qcom/msm8953-camera-sensor-mtp.dtsi | 13 +-- .../dts/qcom/msm8953-camera-sensor-qrd.dtsi | 13 +-- arch/arm/boot/dts/qcom/msm8953-cdp-1200p.dts | 13 ++- arch/arm/boot/dts/qcom/msm8953-cdp.dts | 13 ++- arch/arm/boot/dts/qcom/msm8953-cdp.dtsi | 15 +-- .../boot/dts/qcom/msm8953-ext-codec-mtp.dts | 28 ++++- .../boot/dts/qcom/msm8953-ext-codec-rcm.dts | 12 +- arch/arm/boot/dts/qcom/msm8953-iot-mtp.dts | 27 ++++- .../boot/dts/qcom/msm8953-mdss-panels.dtsi | 21 +--- arch/arm/boot/dts/qcom/msm8953-mdss.dtsi | 6 +- arch/arm/boot/dts/qcom/msm8953-mtp.dts | 28 ++++- arch/arm/boot/dts/qcom/msm8953-mtp.dtsi | 28 +---- .../arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts | 28 +++++ .../qcom/msm8953-pmi8937-ext-codec-mtp.dts | 103 ++++++++++++++++++ .../arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts | 46 ++++++++ arch/arm/boot/dts/qcom/msm8953-pmi8937.dtsi | 27 +++++ .../arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts | 27 +++++ .../qcom/msm8953-pmi8940-ext-codec-mtp.dts | 102 +++++++++++++++++ .../arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts | 45 ++++++++ arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi | 69 ++++++++++++ arch/arm/boot/dts/qcom/msm8953-pmi8950.dtsi | 63 +++++++++++ arch/arm/boot/dts/qcom/msm8953-qrd-sku3.dts | 48 +++++++- arch/arm/boot/dts/qcom/msm8953-rcm.dts | 12 +- arch/arm/boot/dts/qcom/msm8953-rumi.dts | 19 +++- arch/arm/boot/dts/qcom/msm8953-sim.dts | 19 +++- arch/arm/boot/dts/qcom/msm8953.dtsi | 4 +- arch/arm/boot/dts/qcom/sdm450-cdp.dts | 10 +- arch/arm/boot/dts/qcom/sdm450-mtp.dts | 26 ++++- arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts | 46 ++++++++ arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts | 45 ++++++++ arch/arm/boot/dts/qcom/sdm450-qrd.dts | 47 +++++++- arch/arm/boot/dts/qcom/sdm450-rcm.dts | 10 +- 38 files changed, 987 insertions(+), 141 deletions(-) create mode 100644 arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts create mode 100644 arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts create mode 100644 arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts create mode 100644 arch/arm/boot/dts/qcom/msm8953-pmi8937.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts create mode 100644 arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts create mode 100644 arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts create mode 100644 arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8953-pmi8950.dtsi create mode 100644 arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts create mode 100644 arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts diff --git a/arch/arm/boot/dts/qcom/Makefile b/arch/arm/boot/dts/qcom/Makefile index 9ef74c90d6bea..ba89193640f2d 100644 --- a/arch/arm/boot/dts/qcom/Makefile +++ b/arch/arm/boot/dts/qcom/Makefile @@ -223,12 +223,20 @@ dtb-$(CONFIG_ARCH_MSM8953) += msm8953-sim.dtb \ apq8053-ext-audio-mtp.dtb \ msm8953-cdp-1200p.dtb \ msm8953-iot-mtp.dtb \ - apq8053-iot-mtp.dtb + apq8053-iot-mtp.dtb \ + msm8953-pmi8940-cdp.dtb \ + msm8953-pmi8940-mtp.dtb \ + msm8953-pmi8937-cdp.dtb \ + msm8953-pmi8937-mtp.dtb \ + msm8953-pmi8940-ext-codec-mtp.dtb \ + msm8953-pmi8937-ext-codec-mtp.dtb dtb-$(CONFIG_ARCH_SDM450) += sdm450-rcm.dtb \ sdm450-cdp.dtb \ sdm450-mtp.dtb \ - sdm450-qrd.dtb + sdm450-qrd.dtb \ + sdm450-pmi8940-mtp.dtb \ + sdm450-pmi8937-mtp.dtb dtb-$(CONFIG_ARCH_MDM9607) += mdm9607-rumi.dtb \ mdm9607-cdp.dtb \ diff --git a/arch/arm/boot/dts/qcom/apq8053-cdp.dts b/arch/arm/boot/dts/qcom/apq8053-cdp.dts index 3f2220aa80e45..10e9808bbf856 100644 --- a/arch/arm/boot/dts/qcom/apq8053-cdp.dts +++ b/arch/arm/boot/dts/qcom/apq8053-cdp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,10 +14,18 @@ /dts-v1/; #include "apq8053.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. APQ8053 CDP"; + model = "Qualcomm Technologies, Inc. APQ8053 + PMI8950 CDP"; compatible = "qcom,apq8053-cdp", "qcom,apq8053", "qcom,cdp"; qcom,board-id= <1 0>; }; + +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/apq8053-ext-audio-mtp.dts b/arch/arm/boot/dts/qcom/apq8053-ext-audio-mtp.dts index c5d65bf382820..1c97af6bd2d62 100644 --- a/arch/arm/boot/dts/qcom/apq8053-ext-audio-mtp.dts +++ b/arch/arm/boot/dts/qcom/apq8053-ext-audio-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,14 +14,37 @@ /dts-v1/; #include "apq8053.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. APQ8053 External Codec MTP"; + model = "Qualcomm Technologies, Inc. APQ8053 + PMI8950 Ext Codec MTP"; compatible = "qcom,apq8053-mtp", "qcom,apq8053", "qcom,mtp"; qcom,board-id= <8 1>; }; +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; + &int_codec { status = "disabled"; }; diff --git a/arch/arm/boot/dts/qcom/apq8053-iot-mtp.dts b/arch/arm/boot/dts/qcom/apq8053-iot-mtp.dts index 34955afdfe894..b7fcc7de00b28 100644 --- a/arch/arm/boot/dts/qcom/apq8053-iot-mtp.dts +++ b/arch/arm/boot/dts/qcom/apq8053-iot-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,10 +14,13 @@ /dts-v1/; #include "apq8053.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. APQ8053 IOT MTP"; + model = "Qualcomm Technologies, Inc. APQ8053 + PMI8950 IOT MTP"; compatible = "qcom,apq8053-mtp", "qcom,apq8053", "qcom,mtp"; qcom,board-id= <8 2>; }; @@ -47,3 +50,23 @@ }; }; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/apq8053-mtp.dts b/arch/arm/boot/dts/qcom/apq8053-mtp.dts index 1d2ca54d91aa0..266dbdb859e4c 100644 --- a/arch/arm/boot/dts/qcom/apq8053-mtp.dts +++ b/arch/arm/boot/dts/qcom/apq8053-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,10 +14,13 @@ /dts-v1/; #include "apq8053.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. APQ8053 MTP"; + model = "Qualcomm Technologies, Inc. APQ8053 + PMI8950 MTP"; compatible = "qcom,apq8053-mtp", "qcom,apq8053", "qcom,mtp"; qcom,board-id= <8 0>; }; @@ -34,7 +37,24 @@ }; }; +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + &pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; /* use external rsense for parallel charging */ qcom,ext-sense-type; }; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi index 13e93c1fcaf97..a284dd59e6493 100644 --- a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -11,17 +11,6 @@ * GNU General Public License for more details. */ -&soc { - led_flash0: qcom,camera-flash { - cell-index = <0>; - compatible = "qcom,camera-flash"; - qcom,flash-type = <1>; - qcom,flash-source = <&pmi8950_flash0 &pmi8950_flash1>; - qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch1>; - qcom,switch-source = <&pmi8950_switch>; - }; -}; - &cci { actuator0: qcom,actuator@0 { cell-index = <0>; diff --git a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi index 5e406d3c66e4e..0ccdc8efa9740 100644 --- a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -11,17 +11,6 @@ * GNU General Public License for more details. */ -&soc { - led_flash0: qcom,camera-flash { - cell-index = <0>; - compatible = "qcom,camera-flash"; - qcom,flash-type = <1>; - qcom,flash-source = <&pmi8950_flash0 &pmi8950_flash1>; - qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch1>; - qcom,switch-source = <&pmi8950_switch>; - }; -}; - &cci { actuator0: qcom,actuator@0 { cell-index = <0>; diff --git a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi index 66bf97249a8bf..da00fb4624aaa 100644 --- a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -11,17 +11,6 @@ * GNU General Public License for more details. */ -&soc { - led_flash0: qcom,camera-flash { - cell-index = <0>; - compatible = "qcom,camera-flash"; - qcom,flash-type = <1>; - qcom,flash-source = <&pmi8950_flash0>; - qcom,torch-source = <&pmi8950_torch0>; - qcom,switch-source = <&pmi8950_switch>; - }; -}; - &cci { actuator0: qcom,actuator@0 { cell-index = <0>; diff --git a/arch/arm/boot/dts/qcom/msm8953-cdp-1200p.dts b/arch/arm/boot/dts/qcom/msm8953-cdp-1200p.dts index 13d95f4b42066..e4d57a7563a8e 100644 --- a/arch/arm/boot/dts/qcom/msm8953-cdp-1200p.dts +++ b/arch/arm/boot/dts/qcom/msm8953-cdp-1200p.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,11 +14,14 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" #include "msm8953-audio-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 CDP"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 CDP"; compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; qcom,board-id= <1 1>; }; @@ -28,7 +31,6 @@ qcom,platform-enable-gpio = <&tlmm 12 0>; }; - &pm8953_pwm { status = "ok"; }; @@ -62,6 +64,11 @@ }; }; +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; + &hsuart_active { mux { pins = "gpio13", "gpio14", "gpio15"; diff --git a/arch/arm/boot/dts/qcom/msm8953-cdp.dts b/arch/arm/boot/dts/qcom/msm8953-cdp.dts index 94ea484112466..3f06f6ba0bd5d 100644 --- a/arch/arm/boot/dts/qcom/msm8953-cdp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-cdp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,10 +14,19 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 CDP"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 CDP"; compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; qcom,board-id= <1 0>; + qcom,pmic-id = <0x010016 0x010011 0x0 0x0>; +}; + +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8953-cdp.dtsi index b04c1b9a37439..0cbc311953a3a 100644 --- a/arch/arm/boot/dts/qcom/msm8953-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -13,7 +13,6 @@ #include "msm8953-pinctrl.dtsi" #include "msm8953-audio-cdp.dtsi" -#include "msm8953-camera-sensor-cdp.dtsi" &spi_3 { /* BLSP1 QUP3 */ spi-max-frequency = <8000000>; @@ -143,7 +142,7 @@ }; }; -&pmi_haptic{ +&pmi_haptic { qcom,actuator-type = "lra"; qcom,lra-auto-res-mode="qwd"; qcom,lra-high-z="opt1"; @@ -195,11 +194,6 @@ qcom,platform-bklight-en-gpio = <&tlmm 59 0>; }; -&labibb { - status = "ok"; - qpnp,qpnp-labibb-mode = "lcd"; -}; - &dsi_truly_1080_vid { qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; qcom,mdss-dsi-pan-enable-dynamic-fps; @@ -293,11 +287,6 @@ pinctrl-0 = <&typec_ssmux_config>; }; -&pmi8950_charger { - qcom,external-typec; - qcom,typec-psy-name = "typec"; -}; - &pm8953_gpios { /* GPIO 2 (NFC_CLK_REQ) */ gpio@c100 { diff --git a/arch/arm/boot/dts/qcom/msm8953-ext-codec-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-ext-codec-mtp.dts index f952c04adcf65..039c75045cc7c 100644 --- a/arch/arm/boot/dts/qcom/msm8953-ext-codec-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-ext-codec-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,12 +14,36 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 External Codec MTP"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 Ext Codec MTP"; compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; qcom,board-id= <8 1>; + qcom,pmic-id = <0x010016 0x010011 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; &int_codec { diff --git a/arch/arm/boot/dts/qcom/msm8953-ext-codec-rcm.dts b/arch/arm/boot/dts/qcom/msm8953-ext-codec-rcm.dts index dad5f5a9fc5c6..1751e8627fc30 100644 --- a/arch/arm/boot/dts/qcom/msm8953-ext-codec-rcm.dts +++ b/arch/arm/boot/dts/qcom/msm8953-ext-codec-rcm.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,10 +14,13 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 External Codec RCM"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 Ext Codec RCM"; compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; qcom,board-id= <21 1>; }; @@ -106,3 +109,8 @@ pins = "gpio85", "gpio86", "gpio87"; }; }; + +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-iot-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-iot-mtp.dts index d5acbfb891e4e..8b4c392184b5a 100644 --- a/arch/arm/boot/dts/qcom/msm8953-iot-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-iot-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,10 +14,13 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 IOT MTP"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 IOT MTP"; compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; qcom,board-id= <8 2>; }; @@ -40,3 +43,23 @@ }; }; }; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-mdss-panels.dtsi b/arch/arm/boot/dts/qcom/msm8953-mdss-panels.dtsi index 14d742d19996f..9c857fd68f9d1 100644 --- a/arch/arm/boot/dts/qcom/msm8953-mdss-panels.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-mdss-panels.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -44,25 +44,6 @@ qcom,supply-enable-load = <100000>; qcom,supply-disable-load = <100>; }; - - qcom,panel-supply-entry@2 { - reg = <2>; - qcom,supply-name = "lab"; - qcom,supply-min-voltage = <4600000>; - qcom,supply-max-voltage = <6000000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - }; - - qcom,panel-supply-entry@3 { - reg = <3>; - qcom,supply-name = "ibb"; - qcom,supply-min-voltage = <4600000>; - qcom,supply-max-voltage = <6000000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-post-on-sleep = <10>; - }; }; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-mdss.dtsi b/arch/arm/boot/dts/qcom/msm8953-mdss.dtsi index c3a428e18cb77..3770b53243a39 100644 --- a/arch/arm/boot/dts/qcom/msm8953-mdss.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-mdss.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -304,8 +304,6 @@ qcom,mdss-mdp = <&mdss_mdp>; vdd-supply = <&pm8953_l17>; vddio-supply = <&pm8953_l6>; - lab-supply = <&lab_regulator>; - ibb-supply = <&ibb_regulator>; clocks = <&clock_gcc_mdss clk_gcc_mdss_byte0_clk>, <&clock_gcc_mdss clk_gcc_mdss_pclk0_clk>, @@ -353,8 +351,6 @@ qcom,mdss-mdp = <&mdss_mdp>; vdd-supply = <&pm8953_l17>; vddio-supply = <&pm8953_l6>; - lab-supply = <&lab_regulator>; - ibb-supply = <&ibb_regulator>; clocks = <&clock_gcc_mdss clk_gcc_mdss_byte1_clk>, <&clock_gcc_mdss clk_gcc_mdss_pclk1_clk>, diff --git a/arch/arm/boot/dts/qcom/msm8953-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-mtp.dts index e90897b27525d..69198d6d03081 100644 --- a/arch/arm/boot/dts/qcom/msm8953-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,10 +14,34 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 MTP"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 MTP"; compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x010011 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8953-mtp.dtsi index e9d1e325d0567..af1d61ae20b4f 100644 --- a/arch/arm/boot/dts/qcom/msm8953-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -13,7 +13,6 @@ #include "msm8953-pinctrl.dtsi" #include "msm8953-audio-mtp.dtsi" -#include "msm8953-camera-sensor-mtp.dtsi" &spi_3 { /* BLSP1 QUP3 */ spi-max-frequency = <16000000>; @@ -161,11 +160,6 @@ qcom,platform-bklight-en-gpio = <&tlmm 59 0>; }; -&labibb { - status = "ok"; - qpnp,qpnp-labibb-mode = "lcd"; -}; - &dsi_truly_1080_vid { qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; qcom,mdss-dsi-pan-enable-dynamic-fps; @@ -254,26 +248,6 @@ pinctrl-0 = <&typec_ssmux_config>; }; -/{ - mtp_batterydata: qcom,battery-data { - qcom,batt-id-range-pct = <15>; - #include "batterydata-itech-3000mah.dtsi" - #include "batterydata-ascent-3450mAh.dtsi" - }; -}; - -&pmi8950_fg { - qcom,battery-data = <&mtp_batterydata>; -}; - -&pmi8950_charger { - qcom,battery-data = <&mtp_batterydata>; - qcom,chg-led-sw-controls; - qcom,chg-led-support; - qcom,external-typec; - qcom,typec-psy-name = "typec"; -}; - &pm8953_gpios { /* GPIO 2 (NFC_CLK_REQ) */ gpio@c100 { diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts new file mode 100644 index 0000000000000..69cd0b4b1f046 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8937.dtsi" +#include "msm8953-cdp.dtsi" +#include "msm8953-audio-cdp.dtsi" +#include "msm8953-pmi8937.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8937 CDP"; + compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; + qcom,board-id= <1 0>; + qcom,pmic-id = <0x010016 0x020037 0x0 0x0>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts new file mode 100644 index 0000000000000..11ae3cca3cefc --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8937.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-audio-mtp.dtsi" +#include "msm8953-pmi8937.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8937 Ext Codec MTP"; + compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; + qcom,board-id= <8 1>; + qcom,pmic-id = <0x010016 0x020037 0x0 0x0>; +}; + +&int_codec { + status = "disabled"; +}; + +&pm8953_diangu_dig { + status = "disabled"; +}; + +&pm8953_diangu_analog { + status = "disabled"; +}; + +&wsa881x_i2c_e { + status = "disabled"; +}; + +&wsa881x_i2c_44 { + status = "disabled"; +}; + +&wsa881x_i2c_f { + status = "disabled"; +}; + +&wsa881x_i2c_45 { + status = "disabled"; +}; + +&slim_msm { + status = "okay"; +}; + +&dai_slim { + status = "okay"; +}; + +&wcd9xxx_intc { + status = "okay"; +}; + +&clock_audio { + status = "okay"; +}; + +&wcd9335 { + status = "okay"; +}; + +&wcd_rst_gpio { + status = "okay"; +}; + +&ext_codec { + qcom,model = "msm8953-tasha-snd-card"; + status = "okay"; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8937_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8937_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts new file mode 100644 index 0000000000000..dc42ef359fd06 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8937.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-audio-mtp.dtsi" +#include "msm8953-pmi8937.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8937 MTP"; + compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; + qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x020037 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8937_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8937_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937.dtsi b/arch/arm/boot/dts/qcom/msm8953-pmi8937.dtsi new file mode 100644 index 0000000000000..fba91a7d40559 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937.dtsi @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8937_flash0 &pmi8937_flash1>; + qcom,torch-source = <&pmi8937_torch0 &pmi8937_torch1>; + qcom,switch-source = <&pmi8937_switch>; + }; +}; + +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts new file mode 100644 index 0000000000000..151f50cdf6a9e --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8940.dtsi" +#include "msm8953-cdp.dtsi" +#include "msm8953-pmi8940.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8940 CDP"; + compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; + qcom,board-id= <1 0>; + qcom,pmic-id = <0x010016 0x020040 0x0 0x0>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts new file mode 100644 index 0000000000000..0ef38f95ca32a --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8940.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-pmi8940.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8940 Ext Codec MTP"; + compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; + qcom,board-id= <8 1>; + qcom,pmic-id = <0x010016 0x020040 0x0 0x0>; +}; + +&int_codec { + status = "disabled"; +}; + +&pm8953_diangu_dig { + status = "disabled"; +}; + +&pm8953_diangu_analog { + status = "disabled"; +}; + +&wsa881x_i2c_e { + status = "disabled"; +}; + +&wsa881x_i2c_44 { + status = "disabled"; +}; + +&wsa881x_i2c_f { + status = "disabled"; +}; + +&wsa881x_i2c_45 { + status = "disabled"; +}; + +&slim_msm { + status = "okay"; +}; + +&dai_slim { + status = "okay"; +}; + +&wcd9xxx_intc { + status = "okay"; +}; + +&clock_audio { + status = "okay"; +}; + +&wcd9335 { + status = "okay"; +}; + +&wcd_rst_gpio { + status = "okay"; +}; + +&ext_codec { + qcom,model = "msm8953-tasha-snd-card"; + status = "okay"; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8940_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8940_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts new file mode 100644 index 0000000000000..187da92785b9f --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8940.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-pmi8940.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8940 MTP"; + compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; + qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x020040 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8940_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8940_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi b/arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi new file mode 100644 index 0000000000000..9064551fa7b97 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm8953-audio-mtp.dtsi" + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8940_flash0 &pmi8940_flash1>; + qcom,torch-source = <&pmi8940_torch0 &pmi8940_torch1>; + qcom,switch-source = <&pmi8940_switch>; + }; +}; + +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi0 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&labibb { + status = "ok"; + qpnp,qpnp-labibb-mode = "lcd"; +}; + +&ibb_regulator { + qcom,qpnp-ibb-discharge-resistor = <32>; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <20>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8950.dtsi b/arch/arm/boot/dts/qcom/msm8953-pmi8950.dtsi new file mode 100644 index 0000000000000..ad06bd43017ec --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8950.dtsi @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8950_flash0 &pmi8950_flash1>; + qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch1>; + qcom,switch-source = <&pmi8950_switch>; + }; +}; + +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi0 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&labibb { + status = "ok"; + qpnp,qpnp-labibb-mode = "lcd"; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-qrd-sku3.dts b/arch/arm/boot/dts/qcom/msm8953-qrd-sku3.dts index dd65115017ebe..b6acd5abbae7f 100644 --- a/arch/arm/boot/dts/qcom/msm8953-qrd-sku3.dts +++ b/arch/arm/boot/dts/qcom/msm8953-qrd-sku3.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,12 +14,54 @@ /dts-v1/; #include "msm8953.dtsi" -#include "msm8953-qrd-sku3.dtsi" +#include "msm-pmi8950.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 QRD SKU3"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 QRD SKU3"; compatible = "qcom,msm8953-qrd-sku3", "qcom,msm8953-qrd", "qcom,msm8953", "qcom,qrd"; qcom,board-id= <0x2000b 0>; }; +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8950_flash0 &pmi8950_flash1>; + qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch1>; + qcom,switch-source = <&pmi8950_switch>; + }; +}; + +#include "msm8953-qrd-sku3.dtsi" + +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-rcm.dts b/arch/arm/boot/dts/qcom/msm8953-rcm.dts index d1f0cf9bcf8c2..f265ba451d0e9 100644 --- a/arch/arm/boot/dts/qcom/msm8953-rcm.dts +++ b/arch/arm/boot/dts/qcom/msm8953-rcm.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,15 +14,23 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" #include "msm8953-audio-cdp.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 RCM"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 RCM"; compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; qcom,board-id= <21 0>; }; +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; + &soc { gpio_keys { /delete-node/ home; diff --git a/arch/arm/boot/dts/qcom/msm8953-rumi.dts b/arch/arm/boot/dts/qcom/msm8953-rumi.dts index 6ea00c992e0f3..d1e16ed00558e 100644 --- a/arch/arm/boot/dts/qcom/msm8953-rumi.dts +++ b/arch/arm/boot/dts/qcom/msm8953-rumi.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,13 +14,28 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 RUMI"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 RUMI"; compatible = "qcom,msm8953-rumi", "qcom,msm8953", "qcom,rumi"; qcom,board-id= <15 0>; }; +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi0 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + &soc { timer { clock-frequency = <10000000>; diff --git a/arch/arm/boot/dts/qcom/msm8953-sim.dts b/arch/arm/boot/dts/qcom/msm8953-sim.dts index 438443ff0bb1d..77ea5133330ae 100644 --- a/arch/arm/boot/dts/qcom/msm8953-sim.dts +++ b/arch/arm/boot/dts/qcom/msm8953-sim.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -14,13 +14,28 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" / { - model = "Qualcomm Technologies, Inc. MSMTitaninum Simulator"; + model = "Qualcomm Technologies, Inc. MSMTitaninum + PMI8950 Simulator"; compatible = "qcom,msm8953-sim", "qcom,msm8953", "qcom,sim"; qcom,board-id= <16 0>; }; +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi0 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + &blsp1_uart0 { status = "ok"; pinctrl-names = "default"; diff --git a/arch/arm/boot/dts/qcom/msm8953.dtsi b/arch/arm/boot/dts/qcom/msm8953.dtsi index e5ad555c11eae..58ffa3f01c289 100644 --- a/arch/arm/boot/dts/qcom/msm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2022,7 +2022,6 @@ interrupt-names = "hs_phy_irq", "ss_phy_irq", "pwr_event_irq"; USB3_GDSC-supply = <&gdsc_usb30>; - vbus_dwc3-supply = <&smbcharger_charger_otg>; qcom,usb-dbm = <&dbm_1p5>; qcom,msm-bus,name = "usb3"; qcom,msm-bus,num-cases = <2>; @@ -2298,7 +2297,6 @@ #include "msm-pm8953-rpm-regulator.dtsi" #include "msm-pm8953.dtsi" #include "msm8953-regulator.dtsi" -#include "msm-pmi8950.dtsi" #include "msm-audio.dtsi" #include "msm8953-audio.dtsi" #include "msm-gdsc-8916.dtsi" diff --git a/arch/arm/boot/dts/qcom/sdm450-cdp.dts b/arch/arm/boot/dts/qcom/sdm450-cdp.dts index 5ec13bcf80e41..7ff6e9a7149db 100644 --- a/arch/arm/boot/dts/qcom/sdm450-cdp.dts +++ b/arch/arm/boot/dts/qcom/sdm450-cdp.dts @@ -14,10 +14,18 @@ /dts-v1/; #include "sdm450.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. SDM450 CDP"; + model = "Qualcomm Technologies, Inc. SDM450 + PMI8950 CDP"; compatible = "qcom,sdm450-cdp", "qcom,sdm450", "qcom,cdp"; qcom,board-id= <1 0>; }; + +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-mtp.dts b/arch/arm/boot/dts/qcom/sdm450-mtp.dts index b86c7e304b021..be541332b1144 100644 --- a/arch/arm/boot/dts/qcom/sdm450-mtp.dts +++ b/arch/arm/boot/dts/qcom/sdm450-mtp.dts @@ -14,10 +14,34 @@ /dts-v1/; #include "sdm450.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. SDM450 MTP"; + model = "Qualcomm Technologies, Inc. SDM450 + PMI8950 MTP"; compatible = "qcom,sdm450-mtp", "qcom,sdm450", "qcom,mtp"; qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x010011 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; diff --git a/arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts b/arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts new file mode 100644 index 0000000000000..a4686a1710f2c --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8937.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-audio-mtp.dtsi" +#include "msm8953-pmi8937.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 + PMI8937 MTP"; + compatible = "qcom,sdm450-mtp", "qcom,sdm450", "qcom,mtp"; + qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x020037 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8937_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8937_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts b/arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts new file mode 100644 index 0000000000000..7a76d1de9aa5f --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8940.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-pmi8940.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 + PMI8940 MTP"; + compatible = "qcom,sdm450-mtp", "qcom,sdm450", "qcom,mtp"; + qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x020040 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8940_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8940_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-qrd.dts b/arch/arm/boot/dts/qcom/sdm450-qrd.dts index 895c2f9c2644e..b8b2c81540067 100644 --- a/arch/arm/boot/dts/qcom/sdm450-qrd.dts +++ b/arch/arm/boot/dts/qcom/sdm450-qrd.dts @@ -14,10 +14,53 @@ /dts-v1/; #include "sdm450.dtsi" -#include "msm8953-qrd-sku3.dtsi" +#include "msm-pmi8950.dtsi" / { - model = "Qualcomm Technologies, Inc. SDM450 QRD"; + model = "Qualcomm Technologies, Inc. SDM450 + PMI8950 QRD"; compatible = "qcom,sdm450-qrd", "qcom,sdm450", "qcom,qrd"; qcom,board-id = <0x0005000b 0>; }; + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8950_flash0 &pmi8950_flash1>; + qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch1>; + qcom,switch-source = <&pmi8950_switch>; + }; +}; + +#include "msm8953-qrd-sku3.dtsi" + +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-rcm.dts b/arch/arm/boot/dts/qcom/sdm450-rcm.dts index 1f96a2d2c4c7b..742f1c2a73610 100644 --- a/arch/arm/boot/dts/qcom/sdm450-rcm.dts +++ b/arch/arm/boot/dts/qcom/sdm450-rcm.dts @@ -14,10 +14,18 @@ /dts-v1/; #include "sdm450.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. SDM450 RCM"; + model = "Qualcomm Technologies, Inc. SDM450 + PMI8950 RCM"; compatible = "qcom,sdm450-cdp", "qcom,sdm450", "qcom,cdp"; qcom,board-id= <21 0>; }; + +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; From 8083abcf3640fc4eecb7a2d2eb60e85cffbef3ca Mon Sep 17 00:00:00 2001 From: Tanvi Aggarwal Date: Wed, 2 Aug 2017 11:20:36 +0530 Subject: [PATCH 0980/1015] msm: sensor: ois: add conditional check for ioctl Add conditional check when sending VIDIOC_MSM_OIS_CFG. Change-Id: I128591359d7996fe73e9ac3d8a17c47004a2e04e CRs-Fixed:2078155 Signed-off-by: Tanvi Aggarwal --- drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c index 280bcfbab391c..a2794d680cf8d 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c +++ b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c @@ -818,6 +818,10 @@ static long msm_ois_subdev_do_ioctl( parg = &ois_data; break; } + break; + case VIDIOC_MSM_OIS_CFG: + pr_err("%s: invalid cmd 0x%x received\n", __func__, cmd); + return -EINVAL; } rc = msm_ois_subdev_ioctl(sd, cmd, parg); From beb9db912eff47d7393cd22616dea988bbdfa5c4 Mon Sep 17 00:00:00 2001 From: Siena Richard Date: Wed, 26 Apr 2017 11:18:15 -0700 Subject: [PATCH 0981/1015] ASoC: msm: qdsp6v2: clear address on error Set address to NULL on error to ensure a stale address is not used. CRs-Fixed: 2038685 Signed-off-by: Siena Richard Change-Id: I17e7b7b404625d21721b2466e70fa8be2370b517 --- sound/soc/msm/qdsp6v2/audio_cal_utils.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/soc/msm/qdsp6v2/audio_cal_utils.c b/sound/soc/msm/qdsp6v2/audio_cal_utils.c index cd5a9c5863f82..74186ecf593f2 100644 --- a/sound/soc/msm/qdsp6v2/audio_cal_utils.c +++ b/sound/soc/msm/qdsp6v2/audio_cal_utils.c @@ -637,7 +637,9 @@ static struct cal_block_data *create_cal_block(struct cal_type_data *cal_type, return cal_block; err: kfree(cal_block->cal_info); + cal_block->cal_info = NULL; kfree(cal_block->client_info); + cal_block->client_info = NULL; kfree(cal_block); cal_block = NULL; return cal_block; From 6b2615628924ec8c74ef2aaaab4f55133dc51b30 Mon Sep 17 00:00:00 2001 From: Ghanim Fodi Date: Sun, 9 Jul 2017 13:24:17 +0300 Subject: [PATCH 0982/1015] msm: ipa3: Verify IPA client id before using it Verify IPA client ID is valid before using it to access clients array for logging purposes. In case of invalid id, do not access the array. Change-Id: I7af6ee765a6d70d61721ac21b6a92ed53469b05a CRs-fixed: 2051257 Signed-off-by: Ghanim Fodi --- drivers/platform/msm/ipa/ipa_common_i.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_common_i.h b/drivers/platform/msm/ipa/ipa_common_i.h index ac83c0fd3d3ba..90774c61ca225 100644 --- a/drivers/platform/msm/ipa/ipa_common_i.h +++ b/drivers/platform/msm/ipa/ipa_common_i.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -26,7 +26,8 @@ log_info.file = __FILENAME__; \ log_info.line = __LINE__; \ log_info.type = EP; \ - log_info.id_string = ipa_clients_strings[client] + log_info.id_string = (client < 0 || client >= IPA_CLIENT_MAX) \ + ? "Invalid Client" : ipa_clients_strings[client] #define IPA_ACTIVE_CLIENTS_PREP_SIMPLE(log_info) \ log_info.file = __FILENAME__; \ From 02d12188e142945351d46d619f80a0127ce20df3 Mon Sep 17 00:00:00 2001 From: Kiran Gunda Date: Fri, 11 Aug 2017 16:01:47 +0530 Subject: [PATCH 0983/1015] ARM: dts: msm: Enable USB type-c support for PMI8940/PMI8937 Enable external type-C support for MSM8953/SDM450 + PMI8940/PMI8937 platforms. While at it, update the 'qcom,supply-post-on-sleep' to the right value of 10 for PMI8940 platform, the value was incorrectly set in the commit b666c99c (ARM: dts: msm: add support of PMI8937/PMI8940 for MSM8953). CRs-Fixed: 2078162 Change-Id: I92071d0ed3f19e500511877c950083f640548b4d Signed-off-by: Kiran Gunda --- arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts | 5 +++++ arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts | 2 ++ arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts | 2 ++ arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts | 5 +++++ arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts | 2 ++ arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts | 2 ++ arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi | 2 +- arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts | 2 ++ arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts | 2 ++ 9 files changed, 23 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts index 69cd0b4b1f046..a52679d346a8d 100644 --- a/arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts @@ -26,3 +26,8 @@ qcom,board-id= <1 0>; qcom,pmic-id = <0x010016 0x020037 0x0 0x0>; }; + +&pmi8937_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts index 11ae3cca3cefc..94d0ea36c4c0b 100644 --- a/arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts @@ -100,4 +100,6 @@ qcom,battery-data = <&mtp_batterydata>; qcom,chg-led-sw-controls; qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts index dc42ef359fd06..20a8304390d3f 100644 --- a/arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts @@ -43,4 +43,6 @@ qcom,battery-data = <&mtp_batterydata>; qcom,chg-led-sw-controls; qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts index 151f50cdf6a9e..8aed7caacdae9 100644 --- a/arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts @@ -25,3 +25,8 @@ qcom,board-id= <1 0>; qcom,pmic-id = <0x010016 0x020040 0x0 0x0>; }; + +&pmi8940_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts index 0ef38f95ca32a..0e5f2721e1009 100644 --- a/arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts @@ -99,4 +99,6 @@ qcom,battery-data = <&mtp_batterydata>; qcom,chg-led-sw-controls; qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts index 187da92785b9f..99b54fe2ce70f 100644 --- a/arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts @@ -42,4 +42,6 @@ qcom,battery-data = <&mtp_batterydata>; qcom,chg-led-sw-controls; qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi b/arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi index 9064551fa7b97..1f3010a6f9dfc 100644 --- a/arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi @@ -64,6 +64,6 @@ qcom,supply-max-voltage = <6000000>; qcom,supply-enable-load = <100000>; qcom,supply-disable-load = <100>; - qcom,supply-post-on-sleep = <20>; + qcom,supply-post-on-sleep = <10>; }; }; diff --git a/arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts b/arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts index a4686a1710f2c..1c413fa1fc80a 100644 --- a/arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts +++ b/arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts @@ -43,4 +43,6 @@ qcom,battery-data = <&mtp_batterydata>; qcom,chg-led-sw-controls; qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; diff --git a/arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts b/arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts index 7a76d1de9aa5f..2fda2dd22fbfc 100644 --- a/arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts +++ b/arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts @@ -42,4 +42,6 @@ qcom,battery-data = <&mtp_batterydata>; qcom,chg-led-sw-controls; qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; From add9c95f647fee4102b671832307f1cb157c5386 Mon Sep 17 00:00:00 2001 From: Haibin Liu Date: Wed, 9 Aug 2017 16:26:41 +0800 Subject: [PATCH 0984/1015] msm: sensor: Fix crash when ioctl VIDIOC_MSM_SENSOR_INIT_CFG Issue: the invalid slave_info is used by msm_sensor_driver_probe. This cause crash when ioctl VIDIOC_MSM_SENSOR_INIT_CFG repeatedly. Fix: 1) avoid the same msm_sd_subdev added into the ordered_sd_list. 2) enlarge the buffer size for i2c addr and data. Change-Id: Idffcd3b82b9590dbfdcaf14b80668cc894178f54 Signed-off-by: Haibin Liu --- drivers/media/platform/msm/camera_v2/msm.c | 5 ++++ .../camera_v2/sensor/io/msm_camera_cci_i2c.c | 6 +++-- .../msm/camera_v2/sensor/msm_sensor_driver.c | 23 ++++++++++++------- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index a0a0737807dba..bd7db44ebae09 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -386,6 +386,11 @@ static void msm_add_sd_in_position(struct msm_sd_subdev *msm_subdev, struct msm_sd_subdev *temp_sd; list_for_each_entry(temp_sd, sd_list, list) { + if (temp_sd == msm_subdev) { + pr_err("%s :Fail to add the same sd %d\n", + __func__, __LINE__); + return; + } if (msm_subdev->close_seq < temp_sd->close_seq) { list_add_tail(&msm_subdev->list, &temp_sd->list); return; diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c index 27d4f5e78cc8c..f76c6cceb3e03 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -17,13 +17,15 @@ #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) #define S_I2C_DBG(fmt, args...) pr_debug(fmt, ##args) +#define MAX_I2C_ADDR_TYPE_SIZE (MSM_CAMERA_I2C_3B_ADDR + 1) +#define MAX_I2C_DATA_TYPE_SIZE (MSM_CAMERA_I2C_SET_BYTE_WRITE_MASK_DATA + 1) int32_t msm_camera_cci_i2c_read(struct msm_camera_i2c_client *client, uint32_t addr, uint16_t *data, enum msm_camera_i2c_data_type data_type) { int32_t rc = -EFAULT; - unsigned char buf[client->addr_type+data_type]; + unsigned char buf[MAX_I2C_ADDR_TYPE_SIZE + MAX_I2C_DATA_TYPE_SIZE]; struct msm_camera_cci_ctrl cci_ctrl; if ((client->addr_type != MSM_CAMERA_I2C_BYTE_ADDR diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c index 85fbf162ea4d9..f8f28702e4c22 100755 --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c @@ -105,7 +105,11 @@ static int32_t msm_sensor_driver_create_i2c_v4l_subdev s_ctrl->msm_sd.sd.entity.name = s_ctrl->msm_sd.sd.name; s_ctrl->sensordata->sensor_info->session_id = session_id; s_ctrl->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x3; - msm_sd_register(&s_ctrl->msm_sd); + rc = msm_sd_register(&s_ctrl->msm_sd); + if (rc < 0) { + pr_err("failed: msm_sd_register rc %d", rc); + return rc; + } msm_sensor_v4l2_subdev_fops = v4l2_subdev_fops; #ifdef CONFIG_COMPAT msm_sensor_v4l2_subdev_fops.compat_ioctl32 = @@ -142,7 +146,11 @@ static int32_t msm_sensor_driver_create_v4l_subdev s_ctrl->msm_sd.sd.entity.group_id = MSM_CAMERA_SUBDEV_SENSOR; s_ctrl->msm_sd.sd.entity.name = s_ctrl->msm_sd.sd.name; s_ctrl->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x3; - msm_sd_register(&s_ctrl->msm_sd); + rc = msm_sd_register(&s_ctrl->msm_sd); + if (rc < 0) { + pr_err("failed: msm_sd_register rc %d", rc); + return rc; + } msm_cam_copy_v4l2_subdev_fops(&msm_sensor_v4l2_subdev_fops); #ifdef CONFIG_COMPAT msm_sensor_v4l2_subdev_fops.compat_ioctl32 = @@ -893,12 +901,6 @@ int32_t msm_sensor_driver_probe(void *setting, pr_err("%s probe succeeded", slave_info->sensor_name); - /* - Set probe succeeded flag to 1 so that no other camera shall - * probed on this slot - */ - s_ctrl->is_probe_succeed = 1; - /* * Update the subdevice id of flash-src based on availability in kernel. */ @@ -951,6 +953,11 @@ int32_t msm_sensor_driver_probe(void *setting, msm_sensor_fill_sensor_info(s_ctrl, probed_info, entity_name); + /* + * Set probe succeeded flag to 1 so that no other camera shall + * probed on this slot + */ + s_ctrl->is_probe_succeed = 1; return rc; camera_power_down: From 25a1ee238e3053e3f5e6811ada7ebc1a5bff9784 Mon Sep 17 00:00:00 2001 From: Divya Ojha Date: Fri, 28 Jul 2017 20:58:24 +0530 Subject: [PATCH 0985/1015] ASoC: msm: qdsp6v2: Check out-of-bound access in put functions Add out of bound access check in put function before accessing soc_enum struct with mux as index. Change-Id: I257f8c3c46a480cc4057ab34760d1d7daa3a3d20 Signed-off-by: Divya Ojha --- sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c index 8dc0238b9176f..5c0206ef7bcfd 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c @@ -1723,12 +1723,18 @@ static int msm_routing_lsm_mux_put(struct snd_kcontrol *kcontrol, dapm_kcontrol_get_wlist(kcontrol); struct snd_soc_dapm_widget *widget = wlist->widgets[0]; struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - int mux = ucontrol->value.enumerated.item[0]; + unsigned int mux = ucontrol->value.enumerated.item[0]; int lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX; struct snd_soc_dapm_update *update = NULL; pr_debug("%s: LSM enable %ld\n", __func__, ucontrol->value.integer.value[0]); + + if (mux >= ARRAY_SIZE(mad_audio_mux_text)){ + pr_err(" %s: invalid mux value %d\n", __func__, mux); + return -EINVAL; + } + switch (ucontrol->value.integer.value[0]) { case 1: lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX; From 94ce6025b7d933435a5a589b863553be2b6017d9 Mon Sep 17 00:00:00 2001 From: annamraj Date: Tue, 8 Aug 2017 10:08:10 +0530 Subject: [PATCH 0986/1015] msm: camera: Avoid deadlock for vb2 operations using separate lock Use mutex lock for all VB2 operations, and use separatelock other than used for stop streaming operation to avoid dead lock. Change-Id: Idba956e5e3bce48ee57eaa5984786ded218e32d5 Signed-off-by: annamraj --- .../platform/msm/camera_v2/fd/msm_fd_dev.c | 21 +++++++++++++------ .../platform/msm/camera_v2/fd/msm_fd_dev.h | 3 ++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c index 1377eb27eba8f..1b6cc3e24dcdb 100644 --- a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c +++ b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c @@ -432,6 +432,7 @@ static int msm_fd_open(struct file *file) ctx->vb2_q.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ctx->vb2_q.io_modes = VB2_USERPTR; ctx->vb2_q.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; + mutex_init(&ctx->lock); ret = vb2_queue_init(&ctx->vb2_q); if (ret < 0) { dev_err(device->dev, "Error queue init\n"); @@ -482,7 +483,9 @@ static int msm_fd_release(struct file *file) msm_cpp_vbif_register_error_handler((void *)ctx, VBIF_CLIENT_FD, NULL); + mutex_lock(&ctx->lock); vb2_queue_release(&ctx->vb2_q); + mutex_unlock(&ctx->lock); vfree(ctx->stats); @@ -512,7 +515,9 @@ static unsigned int msm_fd_poll(struct file *file, struct fd_ctx *ctx = msm_fd_ctx_from_fh(file->private_data); unsigned int ret; + mutex_lock(&ctx->lock); ret = vb2_poll(&ctx->vb2_q, file, wait); + mutex_unlock(&ctx->lock); if (atomic_read(&ctx->subscribed_for_event)) { poll_wait(file, &ctx->fh.wait, wait); @@ -750,9 +755,9 @@ static int msm_fd_reqbufs(struct file *file, int ret; struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); - mutex_lock(&ctx->fd_device->recovery_lock); + mutex_lock(&ctx->lock); ret = vb2_reqbufs(&ctx->vb2_q, req); - mutex_unlock(&ctx->fd_device->recovery_lock); + mutex_unlock(&ctx->lock); return ret; } @@ -768,9 +773,9 @@ static int msm_fd_qbuf(struct file *file, void *fh, int ret; struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); - mutex_lock(&ctx->fd_device->recovery_lock); + mutex_lock(&ctx->lock); ret = vb2_qbuf(&ctx->vb2_q, pb); - mutex_unlock(&ctx->fd_device->recovery_lock); + mutex_unlock(&ctx->lock); return ret; } @@ -787,9 +792,9 @@ static int msm_fd_dqbuf(struct file *file, int ret; struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); - mutex_lock(&ctx->fd_device->recovery_lock); + mutex_lock(&ctx->lock); ret = vb2_dqbuf(&ctx->vb2_q, pb, file->f_flags & O_NONBLOCK); - mutex_unlock(&ctx->fd_device->recovery_lock); + mutex_unlock(&ctx->lock); return ret; } @@ -805,7 +810,9 @@ static int msm_fd_streamon(struct file *file, struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); int ret; + mutex_lock(&ctx->lock); ret = vb2_streamon(&ctx->vb2_q, buf_type); + mutex_unlock(&ctx->lock); if (ret < 0) dev_err(ctx->fd_device->dev, "Stream on fails\n"); @@ -824,7 +831,9 @@ static int msm_fd_streamoff(struct file *file, struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); int ret; + mutex_lock(&ctx->lock); ret = vb2_streamoff(&ctx->vb2_q, buf_type); + mutex_unlock(&ctx->lock); if (ret < 0) dev_err(ctx->fd_device->dev, "Stream off fails\n"); diff --git a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.h b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.h index 4155eb8a6fafc..a7615a65d2fcf 100644 --- a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.h +++ b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -161,6 +161,7 @@ struct fd_ctx { struct msm_fd_mem_pool mem_pool; struct msm_fd_stats *stats; struct msm_fd_buf_handle work_buf; + struct mutex lock; }; /* From e5d491b37f17f51dad634193cf0dd701af49f2bc Mon Sep 17 00:00:00 2001 From: VijayaKumar T M Date: Mon, 7 Aug 2017 15:21:31 +0530 Subject: [PATCH 0987/1015] msm: sensor: Add mutex lock during ois power down operations Protecting operations performed during ois powerdown from race condition by adding mutex locks. CRs-Fixed: 2081806 Change-Id: I27a735fd69d3e98fdd2ed48456336c560b6f3adc Signed-off-by: VijayaKumar T M --- drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c index a2794d680cf8d..40fb78b6dbfc7 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c +++ b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c @@ -615,11 +615,13 @@ static long msm_ois_subdev_ioctl(struct v4l2_subdev *sd, pr_err("o_ctrl->i2c_client.i2c_func_tbl NULL\n"); return -EINVAL; } + mutex_lock(o_ctrl->ois_mutex); rc = msm_ois_power_down(o_ctrl); if (rc < 0) { pr_err("%s:%d OIS Power down failed\n", __func__, __LINE__); } + mutex_unlock(o_ctrl->ois_mutex); return msm_ois_close(sd, NULL); default: return -ENOIOCTLCMD; From 2e3328698d78dffc13d32d038a416a61fe6975d7 Mon Sep 17 00:00:00 2001 From: Brahmaji K Date: Thu, 1 Jun 2017 17:20:10 +0530 Subject: [PATCH 0988/1015] qseecom: Fix accessing userspace memory in kernel space Use put_user API to write the data from kernel space to userspace to avoid accessing userspace memory directly in kernel space. Change-Id: I649fe2597e80ccad50cf16b355e220734810e94c Signed-off-by: Brahmaji K --- drivers/misc/qseecom.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index cb01bf46d14f3..2163ab9b35869 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -2889,7 +2889,11 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, } if (req.cmd_id == QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND) { pr_warn("RPMB key status is 0x%x\n", resp.result); - *(uint32_t *)req.resp_buf = resp.result; + if (put_user(resp.result, + (uint32_t __user *)req.resp_buf)) { + ret = -EINVAL; + goto exit; + } ret = 0; } break; @@ -6434,11 +6438,16 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, void *cmd_buf = NULL; size_t cmd_len; struct sglist_info *table = data->sglistinfo_ptr; + void *req_ptr = NULL; + void *resp_ptr = NULL; ret = __qseecom_qteec_validate_msg(data, req); if (ret) return ret; + req_ptr = req->req_ptr; + resp_ptr = req->resp_ptr; + /* find app_id & img_name from list */ spin_lock_irqsave(&qseecom.registered_app_list_lock, flags); list_for_each_entry(ptr_app, &qseecom.registered_app_list_head, @@ -6456,6 +6465,11 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, return -ENOENT; } + req->req_ptr = (void *)__qseecom_uvirt_to_kvirt(data, + (uintptr_t)req->req_ptr); + req->resp_ptr = (void *)__qseecom_uvirt_to_kvirt(data, + (uintptr_t)req->resp_ptr); + if ((cmd_id == QSEOS_TEE_OPEN_SESSION) || (cmd_id == QSEOS_TEE_REQUEST_CANCELLATION)) { ret = __qseecom_update_qteec_req_buf( @@ -6467,10 +6481,10 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, if (qseecom.qsee_version < QSEE_VERSION_40) { ireq.app_id = data->client.app_id; ireq.req_ptr = (uint32_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req->req_ptr); + (uintptr_t)req_ptr); ireq.req_len = req->req_len; ireq.resp_ptr = (uint32_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req->resp_ptr); + (uintptr_t)resp_ptr); ireq.resp_len = req->resp_len; ireq.sglistinfo_ptr = (uint32_t)virt_to_phys(table); ireq.sglistinfo_len = SGLISTINFO_TABLE_SIZE; @@ -6481,10 +6495,10 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, } else { ireq_64bit.app_id = data->client.app_id; ireq_64bit.req_ptr = (uint64_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req->req_ptr); + (uintptr_t)req_ptr); ireq_64bit.req_len = req->req_len; ireq_64bit.resp_ptr = (uint64_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req->resp_ptr); + (uintptr_t)resp_ptr); ireq_64bit.resp_len = req->resp_len; if ((data->client.app_arch == ELFCLASS32) && ((ireq_64bit.req_ptr >= From d9a1d7beeb8ae747c528fcde6bd873df1b0083e3 Mon Sep 17 00:00:00 2001 From: Krishna Manikandan Date: Fri, 28 Jul 2017 13:52:40 +0530 Subject: [PATCH 0989/1015] msm: mdss: Add check for ioctl calls A check is added to ensure that only the supported ioctl calls are allowed to proceed further and all other ioctl calls are returned early. Change-Id: I30f69bc9c60384d01f990bd1830ddc1d8aa9241e Signed-off-by: Krishna Manikandan --- drivers/video/msm/mdss/mdss_fb.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index 402c1198a54de..fe3f1dd05bd01 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -4574,6 +4574,15 @@ static int __ioctl_wait_idle(struct msm_fb_data_type *mfd, u32 cmd) return ret; } +static bool check_not_supported_ioctl(u32 cmd) +{ + return((cmd == MSMFB_OVERLAY_SET) || (cmd == MSMFB_OVERLAY_UNSET) || + (cmd == MSMFB_OVERLAY_GET) || (cmd == MSMFB_OVERLAY_PREPARE) || + (cmd == MSMFB_DISPLAY_COMMIT) || (cmd == MSMFB_OVERLAY_PLAY) || + (cmd == MSMFB_BUFFER_SYNC) || (cmd == MSMFB_OVERLAY_QUEUE) || + (cmd == MSMFB_NOTIFY_UPDATE)); +} + /* * mdss_fb_do_ioctl() - MDSS Framebuffer ioctl function * @info: pointer to framebuffer info @@ -4608,6 +4617,11 @@ int mdss_fb_do_ioctl(struct fb_info *info, unsigned int cmd, if (!pdata || pdata->panel_info.dynamic_switch_pending) return -EPERM; + if (check_not_supported_ioctl(cmd)) { + pr_err("Unsupported ioctl\n"); + return -EINVAL; + } + atomic_inc(&mfd->ioctl_ref_cnt); mdss_fb_power_setting_idle(mfd); From 9dbac2ef055f9da912deecf7cccb26329da5694e Mon Sep 17 00:00:00 2001 From: Ashish Garg Date: Tue, 1 Aug 2017 15:26:45 +0530 Subject: [PATCH 0990/1015] msm: mdss: Check htotal for calculating programmable fetch For calculating programmable fetch values, ensure htotal is non-zero. Change-Id: Ib1f32f5f16aa97fb82c13c9020707245177067b9 Signed-off-by: Ashish Garg --- drivers/video/msm/mdss/mdss_mdp_intf_video.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_video.c b/drivers/video/msm/mdss/mdss_mdp_intf_video.c index 74dc2f3454d99..082ac4f5d4ca7 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_video.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_video.c @@ -1750,8 +1750,9 @@ static void mdss_mdp_handoff_programmable_fetch(struct mdss_mdp_ctl *ctl, MDSS_MDP_REG_INTF_HSYNC_CTL) >> 16; v_total_handoff = mdp_video_read(ctx, MDSS_MDP_REG_INTF_VSYNC_PERIOD_F0)/h_total_handoff; - pinfo->prg_fet = v_total_handoff - - ((fetch_start_handoff - 1)/h_total_handoff); + if (h_total_handoff) + pinfo->prg_fet = v_total_handoff - + ((fetch_start_handoff - 1)/h_total_handoff); pr_debug("programmable fetch lines %d start:%d\n", pinfo->prg_fet, fetch_start_handoff); MDSS_XLOG(pinfo->prg_fet, fetch_start_handoff, From 53a727800188250246ebc6f97a6d4378ee98fb22 Mon Sep 17 00:00:00 2001 From: Sunil Khatri Date: Tue, 1 Aug 2017 16:35:24 +0530 Subject: [PATCH 0991/1015] msm: kgsl: Fix the syncpoint_fence trace We should have a corresponding syncpoint_fence trace for every syncpoint_fence_expire trace. In case the fence is already signaled then make sure to have syncpoint_fence trace before syncpoint_fence_expire trace. Also take an extra refcount for fence which will make sure that the fence pointer is valid in the trace even if the fence is signaled. Change-Id: I2fd8f91c800f89a4a64813a6908eaa0445cf548b Signed-off-by: Sunil Khatri --- drivers/gpu/msm/kgsl_cmdbatch.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/msm/kgsl_cmdbatch.c b/drivers/gpu/msm/kgsl_cmdbatch.c index 6272410ce544b..a0691ce9480ff 100644 --- a/drivers/gpu/msm/kgsl_cmdbatch.c +++ b/drivers/gpu/msm/kgsl_cmdbatch.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -315,7 +315,13 @@ static int kgsl_cmdbatch_add_sync_fence(struct kgsl_device *device, { struct kgsl_cmd_syncpoint_fence *sync = priv; struct kgsl_cmdbatch_sync_event *event; + struct sync_fence *fence = NULL; unsigned int id; + int ret = 0; + + fence = sync_fence_fdget(sync->fd); + if (fence == NULL) + return -EINVAL; kref_get(&cmdbatch->refcount); @@ -331,11 +337,13 @@ static int kgsl_cmdbatch_add_sync_fence(struct kgsl_device *device, set_bit(event->id, &cmdbatch->pending); + trace_syncpoint_fence(cmdbatch, fence->name); + event->handle = kgsl_sync_fence_async_wait(sync->fd, kgsl_cmdbatch_sync_fence_func, event); if (IS_ERR_OR_NULL(event->handle)) { - int ret = PTR_ERR(event->handle); + ret = PTR_ERR(event->handle); clear_bit(event->id, &cmdbatch->pending); event->handle = NULL; @@ -343,18 +351,16 @@ static int kgsl_cmdbatch_add_sync_fence(struct kgsl_device *device, kgsl_cmdbatch_put(cmdbatch); /* - * If ret == 0 the fence was already signaled - print a trace - * message so we can track that - */ - if (ret == 0) - trace_syncpoint_fence_expire(cmdbatch, "signaled"); - - return ret; + * Print a syncpoint_fence_expire trace if + * fence is already signaled or there is + * a failure in registering the fence waiter. + */ + trace_syncpoint_fence_expire(cmdbatch, (ret < 0) ? + "error" : fence->name); } - trace_syncpoint_fence(cmdbatch, event->handle->name); - - return 0; + sync_fence_put(fence); + return ret; } /* kgsl_cmdbatch_add_sync_timestamp() - Add a new sync point for a cmdbatch From a577ecd078aec2287137a72d2b5af19ef39f3e58 Mon Sep 17 00:00:00 2001 From: Sunil Khatri Date: Tue, 25 Jul 2017 16:54:27 +0530 Subject: [PATCH 0992/1015] msm: kgsl: Protect the event->handle with spinlock event->handle pointer can be used after free due to the race condition between kgsl_sync_callback and kgsl_sync_fence_async_cancel. Protect the event->handle with a spinlock to avoid concurrent access issues. Change-Id: I3719e401af9ece82ac68b72f2aef784c7fdc1104 Signed-off-by: Sunil Khatri --- drivers/gpu/msm/adreno_debugfs.c | 6 +++++ drivers/gpu/msm/kgsl_cmdbatch.c | 45 +++++++++++++++++++++++++++++--- drivers/gpu/msm/kgsl_cmdbatch.h | 4 ++- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/msm/adreno_debugfs.c b/drivers/gpu/msm/adreno_debugfs.c index 680827e5b848c..7cb482aabc774 100644 --- a/drivers/gpu/msm/adreno_debugfs.c +++ b/drivers/gpu/msm/adreno_debugfs.c @@ -131,6 +131,8 @@ typedef void (*reg_read_fill_t)(struct kgsl_device *device, int i, static void sync_event_print(struct seq_file *s, struct kgsl_cmdbatch_sync_event *sync_event) { + unsigned long flags; + switch (sync_event->type) { case KGSL_CMD_SYNCPOINT_TYPE_TIMESTAMP: { seq_printf(s, "sync: ctx: %d ts: %d", @@ -138,9 +140,13 @@ static void sync_event_print(struct seq_file *s, break; } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: + spin_lock_irqsave(&sync_event->handle_lock, flags); + seq_printf(s, "sync: [%pK] %s", sync_event->handle, (sync_event->handle && sync_event->handle->fence) ? sync_event->handle->fence->name : "NULL"); + + spin_unlock_irqrestore(&sync_event->handle_lock, flags); break; default: seq_printf(s, "sync: type: %d", sync_event->type); diff --git a/drivers/gpu/msm/kgsl_cmdbatch.c b/drivers/gpu/msm/kgsl_cmdbatch.c index a0691ce9480ff..19730d3f425db 100644 --- a/drivers/gpu/msm/kgsl_cmdbatch.c +++ b/drivers/gpu/msm/kgsl_cmdbatch.c @@ -57,6 +57,7 @@ void kgsl_dump_syncpoints(struct kgsl_device *device, { struct kgsl_cmdbatch_sync_event *event; unsigned int i; + unsigned long flags; for (i = 0; i < cmdbatch->numsyncs; i++) { event = &cmdbatch->synclist[i]; @@ -79,12 +80,16 @@ void kgsl_dump_syncpoints(struct kgsl_device *device, break; } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: + spin_lock_irqsave(&event->handle_lock, flags); + if (event->handle) dev_err(device->dev, " fence: [%pK] %s\n", event->handle->fence, event->handle->name); else dev_err(device->dev, " fence: invalid\n"); + + spin_unlock_irqrestore(&event->handle_lock, flags); break; } } @@ -96,6 +101,7 @@ static void _kgsl_cmdbatch_timer(unsigned long data) struct kgsl_cmdbatch *cmdbatch = (struct kgsl_cmdbatch *) data; struct kgsl_cmdbatch_sync_event *event; unsigned int i; + unsigned long flags; if (cmdbatch == NULL || cmdbatch->context == NULL) return; @@ -124,12 +130,16 @@ static void _kgsl_cmdbatch_timer(unsigned long data) i, event->context->id, event->timestamp); break; case KGSL_CMD_SYNCPOINT_TYPE_FENCE: + spin_lock_irqsave(&event->handle_lock, flags); + if (event->handle != NULL) { dev_err(device->dev, " [%d] FENCE %s\n", i, event->handle->fence ? event->handle->fence->name : "NULL"); kgsl_sync_fence_log(event->handle->fence); } + + spin_unlock_irqrestore(&event->handle_lock, flags); break; } } @@ -221,7 +231,7 @@ static inline void _free_memobj_list(struct list_head *list) void kgsl_cmdbatch_destroy(struct kgsl_cmdbatch *cmdbatch) { unsigned int i; - unsigned long pending; + unsigned long pending, flags; if (IS_ERR_OR_NULL(cmdbatch)) return; @@ -255,8 +265,17 @@ void kgsl_cmdbatch_destroy(struct kgsl_cmdbatch *cmdbatch) kgsl_cmdbatch_sync_func, event); break; case KGSL_CMD_SYNCPOINT_TYPE_FENCE: - if (kgsl_sync_fence_async_cancel(event->handle)) + spin_lock_irqsave(&event->handle_lock, flags); + + if (kgsl_sync_fence_async_cancel(event->handle)) { + event->handle = NULL; + spin_unlock_irqrestore( + &event->handle_lock, flags); kgsl_cmdbatch_put(cmdbatch); + } else { + spin_unlock_irqrestore( + &event->handle_lock, flags); + } break; } } @@ -293,12 +312,23 @@ EXPORT_SYMBOL(kgsl_cmdbatch_destroy); */ static void kgsl_cmdbatch_sync_fence_func(void *priv) { + unsigned long flags; struct kgsl_cmdbatch_sync_event *event = priv; + kgsl_cmdbatch_sync_expire(event->device, event); + trace_syncpoint_fence_expire(event->cmdbatch, event->handle ? event->handle->name : "unknown"); - kgsl_cmdbatch_sync_expire(event->device, event); + spin_lock_irqsave(&event->handle_lock, flags); + + /* + * Setting the event->handle to NULL here make sure that + * other function does not dereference a invalid pointer. + */ + event->handle = NULL; + + spin_unlock_irqrestore(&event->handle_lock, flags); kgsl_cmdbatch_put(event->cmdbatch); } @@ -317,6 +347,7 @@ static int kgsl_cmdbatch_add_sync_fence(struct kgsl_device *device, struct kgsl_cmdbatch_sync_event *event; struct sync_fence *fence = NULL; unsigned int id; + unsigned long flags; int ret = 0; fence = sync_fence_fdget(sync->fd); @@ -335,19 +366,23 @@ static int kgsl_cmdbatch_add_sync_fence(struct kgsl_device *device, event->device = device; event->context = NULL; + spin_lock_init(&event->handle_lock); set_bit(event->id, &cmdbatch->pending); trace_syncpoint_fence(cmdbatch, fence->name); + spin_lock_irqsave(&event->handle_lock, flags); + event->handle = kgsl_sync_fence_async_wait(sync->fd, kgsl_cmdbatch_sync_fence_func, event); if (IS_ERR_OR_NULL(event->handle)) { ret = PTR_ERR(event->handle); - clear_bit(event->id, &cmdbatch->pending); event->handle = NULL; + spin_unlock_irqrestore(&event->handle_lock, flags); + clear_bit(event->id, &cmdbatch->pending); kgsl_cmdbatch_put(cmdbatch); /* @@ -357,6 +392,8 @@ static int kgsl_cmdbatch_add_sync_fence(struct kgsl_device *device, */ trace_syncpoint_fence_expire(cmdbatch, (ret < 0) ? "error" : fence->name); + } else { + spin_unlock_irqrestore(&event->handle_lock, flags); } sync_fence_put(fence); diff --git a/drivers/gpu/msm/kgsl_cmdbatch.h b/drivers/gpu/msm/kgsl_cmdbatch.h index d5cbf375b5d35..b37f432f3e7d1 100644 --- a/drivers/gpu/msm/kgsl_cmdbatch.h +++ b/drivers/gpu/msm/kgsl_cmdbatch.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -84,6 +84,7 @@ struct kgsl_cmdbatch { * @context: Pointer to the KGSL context that owns the cmdbatch * @timestamp: Pending timestamp for the event * @handle: Pointer to a sync fence handle + * @handle_lock: Spin lock to protect handle * @device: Pointer to the KGSL device */ struct kgsl_cmdbatch_sync_event { @@ -93,6 +94,7 @@ struct kgsl_cmdbatch_sync_event { struct kgsl_context *context; unsigned int timestamp; struct kgsl_sync_fence_waiter *handle; + spinlock_t handle_lock; struct kgsl_device *device; }; From 627cf6c6db216e82fb6766d696a34046cda87035 Mon Sep 17 00:00:00 2001 From: Mohammed Javid Date: Thu, 15 Jun 2017 15:39:04 +0530 Subject: [PATCH 0993/1015] msm:ipa: Fix to incorrect structure access Accessing of incorrect structure pointer is causing memory out of bound access, fixed issue by accessing the correct structure pointer. Change-Id: I3c2f5f7a97cac854093ef670184d06db4231f5e1 Acked-by: Ashok Vuyyuru Signed-off-by: Mohammed Javid --- drivers/platform/msm/ipa/ipa_v2/ipa_flt.c | 18 ++++++---- drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c | 38 +++++++++++++++------ drivers/platform/msm/ipa/ipa_v2/ipa_i.h | 18 +++++++--- drivers/platform/msm/ipa/ipa_v2/ipa_rt.c | 37 +++++++++++++------- drivers/platform/msm/ipa/ipa_v3/ipa_flt.c | 37 ++++++++++++++++---- drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c | 36 +++++++++++++++----- drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 16 ++++++--- drivers/platform/msm/ipa/ipa_v3/ipa_rt.c | 41 ++++++++++++++--------- 8 files changed, 170 insertions(+), 71 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c b/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c index d6e563b935b6a..a5c0893666deb 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c @@ -1023,7 +1023,7 @@ static int __ipa_add_flt_rule(struct ipa_flt_tbl *tbl, enum ipa_ip_type ip, goto error; } - if (rt_tbl->cookie != IPA_COOKIE) { + if (rt_tbl->cookie != IPA_RT_TBL_COOKIE) { IPAERR("RT table cookie is invalid\n"); goto error; } @@ -1044,7 +1044,7 @@ static int __ipa_add_flt_rule(struct ipa_flt_tbl *tbl, enum ipa_ip_type ip, } INIT_LIST_HEAD(&entry->link); entry->rule = *rule; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_FLT_COOKIE; entry->rt_tbl = rt_tbl; entry->tbl = tbl; if (add_rear) { @@ -1063,13 +1063,19 @@ static int __ipa_add_flt_rule(struct ipa_flt_tbl *tbl, enum ipa_ip_type ip, if (id < 0) { IPAERR("failed to add to tree\n"); WARN_ON(1); + goto ipa_insert_failed; } *rule_hdl = id; entry->id = id; IPADBG("add flt rule rule_cnt=%d\n", tbl->rule_cnt); return 0; - +ipa_insert_failed: + tbl->rule_cnt--; + if (entry->rt_tbl) + entry->rt_tbl->ref_cnt--; + list_del(&entry->link); + kmem_cache_free(ipa_ctx->flt_rule_cache, entry); error: return -EPERM; } @@ -1085,7 +1091,7 @@ static int __ipa_del_flt_rule(u32 rule_hdl) return -EINVAL; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_FLT_COOKIE) { IPAERR("bad params\n"); return -EINVAL; } @@ -1117,7 +1123,7 @@ static int __ipa_mdfy_flt_rule(struct ipa_flt_rule_mdfy *frule, goto error; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_FLT_COOKIE) { IPAERR("bad params\n"); goto error; } @@ -1138,7 +1144,7 @@ static int __ipa_mdfy_flt_rule(struct ipa_flt_rule_mdfy *frule, goto error; } - if (rt_tbl->cookie != IPA_COOKIE) { + if (rt_tbl->cookie != IPA_RT_TBL_COOKIE) { IPAERR("RT table cookie is invalid\n"); goto error; } diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c b/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c index 6a66b0b12254c..71afae0221cd4 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c @@ -544,7 +544,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, { struct ipa_hdr_entry *hdr_entry; struct ipa_hdr_proc_ctx_entry *entry; - struct ipa_hdr_proc_ctx_offset_entry *offset; + struct ipa_hdr_proc_ctx_offset_entry *offset = NULL; u32 bin; struct ipa_hdr_proc_ctx_tbl *htbl = &ipa_ctx->hdr_proc_ctx_tbl; int id; @@ -560,7 +560,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, } hdr_entry = ipa_id_find(proc_ctx->hdr_hdl); - if (!hdr_entry || (hdr_entry->cookie != IPA_COOKIE)) { + if (!hdr_entry || (hdr_entry->cookie != IPA_HDR_COOKIE)) { IPAERR("hdr_hdl is invalid\n"); return -EINVAL; } @@ -577,7 +577,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, entry->hdr = hdr_entry; if (add_ref_hdr) hdr_entry->ref_cnt++; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_PROC_HDR_COOKIE; needed_len = (proc_ctx->type == IPA_HDR_PROC_NONE) ? sizeof(struct ipa_hdr_proc_ctx_add_hdr_seq) : @@ -637,6 +637,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, if (id < 0) { IPAERR("failed to alloc id\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; proc_ctx->proc_ctx_hdl = id; @@ -644,6 +645,14 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, return 0; +ipa_insert_failed: + if (offset) + list_move(&offset->link, + &htbl->head_free_offset_list[offset->bin]); + entry->offset_entry = NULL; + list_del(&entry->link); + htbl->proc_ctx_cnt--; + bad_len: if (add_ref_hdr) hdr_entry->ref_cnt--; @@ -656,7 +665,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, static int __ipa_add_hdr(struct ipa_hdr_add *hdr) { struct ipa_hdr_entry *entry; - struct ipa_hdr_offset_entry *offset; + struct ipa_hdr_offset_entry *offset = NULL; u32 bin; struct ipa_hdr_tbl *htbl = &ipa_ctx->hdr_tbl; int id; @@ -687,7 +696,7 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) entry->type = hdr->type; entry->is_eth2_ofst_valid = hdr->is_eth2_ofst_valid; entry->eth2_ofst = hdr->eth2_ofst; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_HDR_COOKIE; if (hdr->hdr_len <= ipa_hdr_bin_sz[IPA_HDR_BIN0]) bin = IPA_HDR_BIN0; @@ -770,6 +779,7 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) if (id < 0) { IPAERR("failed to alloc id\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; hdr->hdr_hdl = id; @@ -794,10 +804,18 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) entry->ref_cnt--; hdr->hdr_hdl = 0; ipa_id_remove(id); +ipa_insert_failed: + if (entry->is_hdr_proc_ctx) { + dma_unmap_single(ipa_ctx->pdev, entry->phys_base, + entry->hdr_len, DMA_TO_DEVICE); + } else { + if (offset) + list_move(&offset->link, + &htbl->head_free_offset_list[offset->bin]); + entry->offset_entry = NULL; + } htbl->hdr_cnt--; list_del(&entry->link); - dma_unmap_single(ipa_ctx->pdev, entry->phys_base, - entry->hdr_len, DMA_TO_DEVICE); bad_hdr_len: entry->cookie = 0; kmem_cache_free(ipa_ctx->hdr_cache, entry); @@ -812,7 +830,7 @@ static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, struct ipa_hdr_proc_ctx_tbl *htbl = &ipa_ctx->hdr_proc_ctx_tbl; entry = ipa_id_find(proc_ctx_hdl); - if (!entry || (entry->cookie != IPA_COOKIE)) { + if (!entry || (entry->cookie != IPA_PROC_HDR_COOKIE)) { IPAERR("bad parm\n"); return -EINVAL; } @@ -863,7 +881,7 @@ int __ipa_del_hdr(u32 hdr_hdl, bool by_user) return -EINVAL; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_HDR_COOKIE) { IPAERR("bad parm\n"); return -EINVAL; } @@ -1432,7 +1450,7 @@ int ipa2_put_hdr(u32 hdr_hdl) goto bail; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_HDR_COOKIE) { IPAERR("invalid header entry\n"); result = -EINVAL; goto bail; diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h index fb0de21028bed..c9b2330a0d69c 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h @@ -37,7 +37,15 @@ #define DRV_NAME "ipa" #define NAT_DEV_NAME "ipaNatTable" + #define IPA_COOKIE 0x57831603 +#define IPA_RT_RULE_COOKIE 0x57831604 +#define IPA_RT_TBL_COOKIE 0x57831605 +#define IPA_FLT_COOKIE 0x57831606 +#define IPA_HDR_COOKIE 0x57831607 +#define IPA_PROC_HDR_COOKIE 0x57831608 + + #define MTU_BYTE 1500 #define IPA_MAX_NUM_PIPES 0x14 @@ -192,8 +200,8 @@ struct ipa_smmu_cb_ctx { */ struct ipa_flt_entry { struct list_head link; - struct ipa_flt_rule rule; u32 cookie; + struct ipa_flt_rule rule; struct ipa_flt_tbl *tbl; struct ipa_rt_tbl *rt_tbl; u32 hw_len; @@ -218,13 +226,13 @@ struct ipa_flt_entry { */ struct ipa_rt_tbl { struct list_head link; + u32 cookie; struct list_head head_rt_rule_list; char name[IPA_RESOURCE_NAME_MAX]; u32 idx; u32 rule_cnt; u32 ref_cnt; struct ipa_rt_tbl_set *set; - u32 cookie; bool in_sys; u32 sz; struct ipa_mem_buffer curr_mem; @@ -255,6 +263,7 @@ struct ipa_rt_tbl { */ struct ipa_hdr_entry { struct list_head link; + u32 cookie; u8 hdr[IPA_HDR_MAX_SIZE]; u32 hdr_len; char name[IPA_RESOURCE_NAME_MAX]; @@ -264,7 +273,6 @@ struct ipa_hdr_entry { dma_addr_t phys_base; struct ipa_hdr_proc_ctx_entry *proc_ctx; struct ipa_hdr_offset_entry *offset_entry; - u32 cookie; u32 ref_cnt; int id; u8 is_eth2_ofst_valid; @@ -337,10 +345,10 @@ struct ipa_hdr_proc_ctx_add_hdr_cmd_seq { */ struct ipa_hdr_proc_ctx_entry { struct list_head link; + u32 cookie; enum ipa_hdr_proc_type type; struct ipa_hdr_proc_ctx_offset_entry *offset_entry; struct ipa_hdr_entry *hdr; - u32 cookie; u32 ref_cnt; int id; bool user_deleted; @@ -396,8 +404,8 @@ struct ipa_flt_tbl { */ struct ipa_rt_entry { struct list_head link; - struct ipa_rt_rule rule; u32 cookie; + struct ipa_rt_rule rule; struct ipa_rt_tbl *tbl; struct ipa_hdr_entry *hdr; struct ipa_hdr_proc_ctx_entry *proc_ctx; diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c index 8ce3617cb8092..07756665a62ba 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c @@ -904,7 +904,7 @@ static struct ipa_rt_tbl *__ipa_add_rt_tbl(enum ipa_ip_type ip, INIT_LIST_HEAD(&entry->link); strlcpy(entry->name, name, IPA_RESOURCE_NAME_MAX); entry->set = set; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_RT_TBL_COOKIE; entry->in_sys = (ip == IPA_IP_v4) ? !ipa_ctx->ip4_rt_tbl_lcl : !ipa_ctx->ip6_rt_tbl_lcl; set->tbl_cnt++; @@ -917,12 +917,16 @@ static struct ipa_rt_tbl *__ipa_add_rt_tbl(enum ipa_ip_type ip, if (id < 0) { IPAERR("failed to add to tree\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; } return entry; +ipa_insert_failed: + set->tbl_cnt--; + list_del(&entry->link); fail_rt_idx_alloc: entry->cookie = 0; kmem_cache_free(ipa_ctx->rt_tbl_cache, entry); @@ -935,7 +939,7 @@ static int __ipa_del_rt_tbl(struct ipa_rt_tbl *entry) enum ipa_ip_type ip = IPA_IP_MAX; u32 id; - if (entry == NULL || (entry->cookie != IPA_COOKIE)) { + if (entry == NULL || (entry->cookie != IPA_RT_TBL_COOKIE)) { IPAERR("bad parms\n"); return -EINVAL; } @@ -949,8 +953,11 @@ static int __ipa_del_rt_tbl(struct ipa_rt_tbl *entry) ip = IPA_IP_v4; else if (entry->set == &ipa_ctx->rt_tbl_set[IPA_IP_v6]) ip = IPA_IP_v6; - else + else { WARN_ON(1); + return -EPERM; + } + if (!entry->in_sys) { list_del(&entry->link); @@ -989,13 +996,14 @@ static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name, if (rule->hdr_hdl) { hdr = ipa_id_find(rule->hdr_hdl); - if ((hdr == NULL) || (hdr->cookie != IPA_COOKIE)) { + if ((hdr == NULL) || (hdr->cookie != IPA_HDR_COOKIE)) { IPAERR("rt rule does not point to valid hdr\n"); goto error; } } else if (rule->hdr_proc_ctx_hdl) { proc_ctx = ipa_id_find(rule->hdr_proc_ctx_hdl); - if ((proc_ctx == NULL) || (proc_ctx->cookie != IPA_COOKIE)) { + if ((proc_ctx == NULL) || + (proc_ctx->cookie != IPA_PROC_HDR_COOKIE)) { IPAERR("rt rule does not point to valid proc ctx\n"); goto error; } @@ -1003,7 +1011,7 @@ static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name, tbl = __ipa_add_rt_tbl(ip, name); - if (tbl == NULL || (tbl->cookie != IPA_COOKIE)) { + if (tbl == NULL || (tbl->cookie != IPA_RT_TBL_COOKIE)) { IPAERR("bad params\n"); goto error; } @@ -1024,7 +1032,7 @@ static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name, goto error; } INIT_LIST_HEAD(&entry->link); - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_RT_RULE_COOKIE; entry->rule = *rule; entry->tbl = tbl; entry->hdr = hdr; @@ -1117,7 +1125,7 @@ int __ipa_del_rt_rule(u32 rule_hdl) return -EINVAL; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_RT_RULE_COOKIE) { IPAERR("bad params\n"); return -EINVAL; } @@ -1352,7 +1360,7 @@ int ipa2_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup) } mutex_lock(&ipa_ctx->lock); entry = __ipa_find_rt_tbl(lookup->ip, lookup->name); - if (entry && entry->cookie == IPA_COOKIE) { + if (entry && entry->cookie == IPA_RT_TBL_COOKIE) { if (entry->ref_cnt == U32_MAX) { IPAERR("fail: ref count crossed limit\n"); goto ret; @@ -1395,7 +1403,7 @@ int ipa2_put_rt_tbl(u32 rt_tbl_hdl) goto ret; } - if ((entry->cookie != IPA_COOKIE) || entry->ref_cnt == 0) { + if ((entry->cookie != IPA_RT_TBL_COOKIE) || entry->ref_cnt == 0) { IPAERR("bad parms\n"); result = -EINVAL; goto ret; @@ -1405,8 +1413,11 @@ int ipa2_put_rt_tbl(u32 rt_tbl_hdl) ip = IPA_IP_v4; else if (entry->set == &ipa_ctx->rt_tbl_set[IPA_IP_v6]) ip = IPA_IP_v6; - else + else { WARN_ON(1); + result = -EINVAL; + goto ret; + } entry->ref_cnt--; if (entry->ref_cnt == 0 && entry->rule_cnt == 0) { @@ -1433,7 +1444,7 @@ static int __ipa_mdfy_rt_rule(struct ipa_rt_rule_mdfy *rtrule) if (rtrule->rule.hdr_hdl) { hdr = ipa_id_find(rtrule->rule.hdr_hdl); - if ((hdr == NULL) || (hdr->cookie != IPA_COOKIE)) { + if ((hdr == NULL) || (hdr->cookie != IPA_HDR_COOKIE)) { IPAERR("rt rule does not point to valid hdr\n"); goto error; } @@ -1445,7 +1456,7 @@ static int __ipa_mdfy_rt_rule(struct ipa_rt_rule_mdfy *rtrule) goto error; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_RT_RULE_COOKIE) { IPAERR("bad params\n"); goto error; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c index f4307d2bf1a06..28ca219833a47 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c @@ -1085,7 +1085,7 @@ static int __ipa_validate_flt_rule(const struct ipa_flt_rule *rule, goto error; } - if ((*rt_tbl)->cookie != IPA_COOKIE) { + if ((*rt_tbl)->cookie != IPA_RT_TBL_COOKIE) { IPAERR("RT table cookie is invalid\n"); goto error; } @@ -1130,7 +1130,7 @@ static int __ipa_create_flt_entry(struct ipa3_flt_entry **entry, } INIT_LIST_HEAD(&((*entry)->link)); (*entry)->rule = *rule; - (*entry)->cookie = IPA_COOKIE; + (*entry)->cookie = IPA_FLT_COOKIE; (*entry)->rt_tbl = rt_tbl; (*entry)->tbl = tbl; if (rule->rule_id) { @@ -1165,12 +1165,18 @@ static int __ipa_finish_flt_rule_add(struct ipa3_flt_tbl *tbl, if (id < 0) { IPAERR("failed to add to tree\n"); WARN_ON(1); + goto ipa_insert_failed; } *rule_hdl = id; entry->id = id; IPADBG_LOW("add flt rule rule_cnt=%d\n", tbl->rule_cnt); return 0; +ipa_insert_failed: + if (entry->rt_tbl) + entry->rt_tbl->ref_cnt--; + tbl->rule_cnt--; + return -EPERM; } static int __ipa_add_flt_rule(struct ipa3_flt_tbl *tbl, enum ipa_ip_type ip, @@ -1196,9 +1202,17 @@ static int __ipa_add_flt_rule(struct ipa3_flt_tbl *tbl, enum ipa_ip_type ip, list_add(&entry->link, &tbl->head_flt_rule_list); } - __ipa_finish_flt_rule_add(tbl, entry, rule_hdl); + if (__ipa_finish_flt_rule_add(tbl, entry, rule_hdl)) + goto ipa_insert_failed; return 0; +ipa_insert_failed: + list_del(&entry->link); + /* if rule id was allocated from idr, remove it */ + if (entry->rule_id >= IPA_RULE_ID_MIN_VAL && + entry->rule_id <= IPA_RULE_ID_MAX_VAL) + idr_remove(&entry->tbl->rule_ids, entry->rule_id); + kmem_cache_free(ipa3_ctx->flt_rule_cache, entry); error: return -EPERM; @@ -1230,7 +1244,8 @@ static int __ipa_add_flt_rule_after(struct ipa3_flt_tbl *tbl, list_add(&entry->link, &((*add_after_entry)->link)); - __ipa_finish_flt_rule_add(tbl, entry, rule_hdl); + if (__ipa_finish_flt_rule_add(tbl, entry, rule_hdl)) + goto ipa_insert_failed; /* * prepare for next insertion @@ -1239,6 +1254,14 @@ static int __ipa_add_flt_rule_after(struct ipa3_flt_tbl *tbl, return 0; +ipa_insert_failed: + list_del(&entry->link); + /* if rule id was allocated from idr, remove it */ + if (entry->rule_id >= IPA_RULE_ID_MIN_VAL && + entry->rule_id <= IPA_RULE_ID_MAX_VAL) + idr_remove(&entry->tbl->rule_ids, entry->rule_id); + kmem_cache_free(ipa3_ctx->flt_rule_cache, entry); + error: *add_after_entry = NULL; return -EPERM; @@ -1255,7 +1278,7 @@ static int __ipa_del_flt_rule(u32 rule_hdl) return -EINVAL; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_FLT_COOKIE) { IPAERR("bad params\n"); return -EINVAL; } @@ -1292,7 +1315,7 @@ static int __ipa_mdfy_flt_rule(struct ipa_flt_rule_mdfy *frule, goto error; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_FLT_COOKIE) { IPAERR("bad params\n"); goto error; } @@ -1313,7 +1336,7 @@ static int __ipa_mdfy_flt_rule(struct ipa_flt_rule_mdfy *frule, goto error; } - if (rt_tbl->cookie != IPA_COOKIE) { + if (rt_tbl->cookie != IPA_RT_TBL_COOKIE) { IPAERR("RT table cookie is invalid\n"); goto error; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c index ecb4b8773b1e1..6d72bebb83ca8 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c @@ -332,7 +332,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, } hdr_entry = ipa3_id_find(proc_ctx->hdr_hdl); - if (!hdr_entry || (hdr_entry->cookie != IPA_COOKIE)) { + if (!hdr_entry || (hdr_entry->cookie != IPA_HDR_COOKIE)) { IPAERR("hdr_hdl is invalid\n"); return -EINVAL; } @@ -349,7 +349,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, entry->hdr = hdr_entry; if (add_ref_hdr) hdr_entry->ref_cnt++; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_PROC_HDR_COOKIE; needed_len = ipahal_get_proc_ctx_needed_len(proc_ctx->type); @@ -407,6 +407,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, if (id < 0) { IPAERR("failed to alloc id\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; proc_ctx->proc_ctx_hdl = id; @@ -414,6 +415,14 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, return 0; +ipa_insert_failed: + if (offset) + list_move(&offset->link, + &htbl->head_free_offset_list[offset->bin]); + entry->offset_entry = NULL; + list_del(&entry->link); + htbl->proc_ctx_cnt--; + bad_len: if (add_ref_hdr) hdr_entry->ref_cnt--; @@ -426,7 +435,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, static int __ipa_add_hdr(struct ipa_hdr_add *hdr) { struct ipa3_hdr_entry *entry; - struct ipa_hdr_offset_entry *offset; + struct ipa_hdr_offset_entry *offset = NULL; u32 bin; struct ipa3_hdr_tbl *htbl = &ipa3_ctx->hdr_tbl; int id; @@ -457,7 +466,7 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) entry->type = hdr->type; entry->is_eth2_ofst_valid = hdr->is_eth2_ofst_valid; entry->eth2_ofst = hdr->eth2_ofst; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_HDR_COOKIE; if (hdr->hdr_len <= ipa_hdr_bin_sz[IPA_HDR_BIN0]) bin = IPA_HDR_BIN0; @@ -531,6 +540,7 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) if (id < 0) { IPAERR("failed to alloc id\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; hdr->hdr_hdl = id; @@ -555,10 +565,18 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) entry->ref_cnt--; hdr->hdr_hdl = 0; ipa3_id_remove(id); +ipa_insert_failed: + if (entry->is_hdr_proc_ctx) { + dma_unmap_single(ipa3_ctx->pdev, entry->phys_base, + entry->hdr_len, DMA_TO_DEVICE); + } else { + if (offset) + list_move(&offset->link, + &htbl->head_free_offset_list[offset->bin]); + entry->offset_entry = NULL; + } htbl->hdr_cnt--; list_del(&entry->link); - dma_unmap_single(ipa3_ctx->pdev, entry->phys_base, - entry->hdr_len, DMA_TO_DEVICE); bad_hdr_len: entry->cookie = 0; kmem_cache_free(ipa3_ctx->hdr_cache, entry); @@ -573,7 +591,7 @@ static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, struct ipa3_hdr_proc_ctx_tbl *htbl = &ipa3_ctx->hdr_proc_ctx_tbl; entry = ipa3_id_find(proc_ctx_hdl); - if (!entry || (entry->cookie != IPA_COOKIE)) { + if (!entry || (entry->cookie != IPA_PROC_HDR_COOKIE)) { IPAERR("bad parm\n"); return -EINVAL; } @@ -624,7 +642,7 @@ int __ipa3_del_hdr(u32 hdr_hdl, bool by_user) return -EINVAL; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_HDR_COOKIE) { IPAERR("bad parm\n"); return -EINVAL; } @@ -1169,7 +1187,7 @@ int ipa3_put_hdr(u32 hdr_hdl) goto bail; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_HDR_COOKIE) { IPAERR("invalid header entry\n"); result = -EINVAL; goto bail; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index 4dbb908d09b6a..9170611be8088 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -40,6 +40,12 @@ #define DRV_NAME "ipa" #define NAT_DEV_NAME "ipaNatTable" #define IPA_COOKIE 0x57831603 +#define IPA_RT_RULE_COOKIE 0x57831604 +#define IPA_RT_TBL_COOKIE 0x57831605 +#define IPA_FLT_COOKIE 0x57831606 +#define IPA_HDR_COOKIE 0x57831607 +#define IPA_PROC_HDR_COOKIE 0x57831608 + #define MTU_BYTE 1500 #define IPA3_MAX_NUM_PIPES 31 @@ -253,8 +259,8 @@ struct ipa_smmu_cb_ctx { */ struct ipa3_flt_entry { struct list_head link; - struct ipa_flt_rule rule; u32 cookie; + struct ipa_flt_rule rule; struct ipa3_flt_tbl *tbl; struct ipa3_rt_tbl *rt_tbl; u32 hw_len; @@ -282,13 +288,13 @@ struct ipa3_flt_entry { */ struct ipa3_rt_tbl { struct list_head link; + u32 cookie; struct list_head head_rt_rule_list; char name[IPA_RESOURCE_NAME_MAX]; u32 idx; u32 rule_cnt; u32 ref_cnt; struct ipa3_rt_tbl_set *set; - u32 cookie; bool in_sys[IPA_RULE_TYPE_MAX]; u32 sz[IPA_RULE_TYPE_MAX]; struct ipa_mem_buffer curr_mem[IPA_RULE_TYPE_MAX]; @@ -320,6 +326,7 @@ struct ipa3_rt_tbl { */ struct ipa3_hdr_entry { struct list_head link; + u32 cookie; u8 hdr[IPA_HDR_MAX_SIZE]; u32 hdr_len; char name[IPA_RESOURCE_NAME_MAX]; @@ -329,7 +336,6 @@ struct ipa3_hdr_entry { dma_addr_t phys_base; struct ipa3_hdr_proc_ctx_entry *proc_ctx; struct ipa_hdr_offset_entry *offset_entry; - u32 cookie; u32 ref_cnt; int id; u8 is_eth2_ofst_valid; @@ -378,10 +384,10 @@ struct ipa3_hdr_proc_ctx_offset_entry { */ struct ipa3_hdr_proc_ctx_entry { struct list_head link; + u32 cookie; enum ipa_hdr_proc_type type; struct ipa3_hdr_proc_ctx_offset_entry *offset_entry; struct ipa3_hdr_entry *hdr; - u32 cookie; u32 ref_cnt; int id; bool user_deleted; @@ -443,8 +449,8 @@ struct ipa3_flt_tbl { */ struct ipa3_rt_entry { struct list_head link; - struct ipa_rt_rule rule; u32 cookie; + struct ipa_rt_rule rule; struct ipa3_rt_tbl *tbl; struct ipa3_hdr_entry *hdr; struct ipa3_hdr_proc_ctx_entry *proc_ctx; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c index 2e1a4ba02a708..d7c91d9415080 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c @@ -970,7 +970,7 @@ static struct ipa3_rt_tbl *__ipa_add_rt_tbl(enum ipa_ip_type ip, INIT_LIST_HEAD(&entry->link); strlcpy(entry->name, name, IPA_RESOURCE_NAME_MAX); entry->set = set; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_RT_TBL_COOKIE; entry->in_sys[IPA_RULE_HASHABLE] = (ip == IPA_IP_v4) ? !ipa3_ctx->ip4_rt_tbl_hash_lcl : !ipa3_ctx->ip6_rt_tbl_hash_lcl; @@ -988,12 +988,16 @@ static struct ipa3_rt_tbl *__ipa_add_rt_tbl(enum ipa_ip_type ip, if (id < 0) { IPAERR("failed to add to tree\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; } return entry; - +ipa_insert_failed: + set->tbl_cnt--; + list_del(&entry->link); + idr_destroy(&entry->rule_ids); fail_rt_idx_alloc: entry->cookie = 0; kmem_cache_free(ipa3_ctx->rt_tbl_cache, entry); @@ -1007,7 +1011,7 @@ static int __ipa_del_rt_tbl(struct ipa3_rt_tbl *entry) u32 id; struct ipa3_rt_tbl_set *rset; - if (entry == NULL || (entry->cookie != IPA_COOKIE)) { + if (entry == NULL || (entry->cookie != IPA_RT_TBL_COOKIE)) { IPAERR("bad parms\n"); return -EINVAL; } @@ -1021,8 +1025,10 @@ static int __ipa_del_rt_tbl(struct ipa3_rt_tbl *entry) ip = IPA_IP_v4; else if (entry->set == &ipa3_ctx->rt_tbl_set[IPA_IP_v6]) ip = IPA_IP_v6; - else + else { WARN_ON(1); + return -EPERM; + } rset = &ipa3_ctx->reap_rt_tbl_set[ip]; @@ -1059,14 +1065,14 @@ static int __ipa_rt_validate_hndls(const struct ipa_rt_rule *rule, if (rule->hdr_hdl) { *hdr = ipa3_id_find(rule->hdr_hdl); - if ((*hdr == NULL) || ((*hdr)->cookie != IPA_COOKIE)) { + if ((*hdr == NULL) || ((*hdr)->cookie != IPA_HDR_COOKIE)) { IPAERR("rt rule does not point to valid hdr\n"); return -EPERM; } } else if (rule->hdr_proc_ctx_hdl) { *proc_ctx = ipa3_id_find(rule->hdr_proc_ctx_hdl); if ((*proc_ctx == NULL) || - ((*proc_ctx)->cookie != IPA_COOKIE)) { + ((*proc_ctx)->cookie != IPA_PROC_HDR_COOKIE)) { IPAERR("rt rule does not point to valid proc ctx\n"); return -EPERM; @@ -1089,7 +1095,7 @@ static int __ipa_create_rt_entry(struct ipa3_rt_entry **entry, goto error; } INIT_LIST_HEAD(&(*entry)->link); - (*(entry))->cookie = IPA_COOKIE; + (*(entry))->cookie = IPA_RT_RULE_COOKIE; (*(entry))->rule = *rule; (*(entry))->tbl = tbl; (*(entry))->hdr = hdr; @@ -1157,7 +1163,7 @@ static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name, tbl = __ipa_add_rt_tbl(ip, name); - if (tbl == NULL || (tbl->cookie != IPA_COOKIE)) { + if (tbl == NULL || (tbl->cookie != IPA_RT_TBL_COOKIE)) { IPAERR("failed adding rt tbl name = %s\n", name ? name : ""); goto error; @@ -1292,7 +1298,7 @@ int ipa3_add_rt_rule_after(struct ipa_ioc_add_rt_rule_after *rules) mutex_lock(&ipa3_ctx->lock); tbl = __ipa3_find_rt_tbl(rules->ip, rules->rt_tbl_name); - if (tbl == NULL || (tbl->cookie != IPA_COOKIE)) { + if (tbl == NULL || (tbl->cookie != IPA_RT_TBL_COOKIE)) { IPAERR("failed finding rt tbl name = %s\n", rules->rt_tbl_name ? rules->rt_tbl_name : ""); ret = -EINVAL; @@ -1376,7 +1382,7 @@ int __ipa3_del_rt_rule(u32 rule_hdl) return -EINVAL; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_RT_RULE_COOKIE) { IPAERR("bad params\n"); return -EINVAL; } @@ -1613,7 +1619,7 @@ int ipa3_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup) } mutex_lock(&ipa3_ctx->lock); entry = __ipa3_find_rt_tbl(lookup->ip, lookup->name); - if (entry && entry->cookie == IPA_COOKIE) { + if (entry && entry->cookie == IPA_RT_TBL_COOKIE) { if (entry->ref_cnt == U32_MAX) { IPAERR("fail: ref count crossed limit\n"); goto ret; @@ -1656,7 +1662,7 @@ int ipa3_put_rt_tbl(u32 rt_tbl_hdl) goto ret; } - if ((entry->cookie != IPA_COOKIE) || entry->ref_cnt == 0) { + if ((entry->cookie != IPA_RT_TBL_COOKIE) || entry->ref_cnt == 0) { IPAERR("bad parms\n"); result = -EINVAL; goto ret; @@ -1666,8 +1672,10 @@ int ipa3_put_rt_tbl(u32 rt_tbl_hdl) ip = IPA_IP_v4; else if (entry->set == &ipa3_ctx->rt_tbl_set[IPA_IP_v6]) ip = IPA_IP_v6; - else + else { WARN_ON(1); + goto ret; + } entry->ref_cnt--; if (entry->ref_cnt == 0 && entry->rule_cnt == 0) { @@ -1695,13 +1703,14 @@ static int __ipa_mdfy_rt_rule(struct ipa_rt_rule_mdfy *rtrule) if (rtrule->rule.hdr_hdl) { hdr = ipa3_id_find(rtrule->rule.hdr_hdl); - if ((hdr == NULL) || (hdr->cookie != IPA_COOKIE)) { + if ((hdr == NULL) || (hdr->cookie != IPA_HDR_COOKIE)) { IPAERR("rt rule does not point to valid hdr\n"); goto error; } } else if (rtrule->rule.hdr_proc_ctx_hdl) { proc_ctx = ipa3_id_find(rtrule->rule.hdr_proc_ctx_hdl); - if ((proc_ctx == NULL) || (proc_ctx->cookie != IPA_COOKIE)) { + if ((proc_ctx == NULL) || + (proc_ctx->cookie != IPA_PROC_HDR_COOKIE)) { IPAERR("rt rule does not point to valid proc ctx\n"); goto error; } @@ -1713,7 +1722,7 @@ static int __ipa_mdfy_rt_rule(struct ipa_rt_rule_mdfy *rtrule) goto error; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_RT_RULE_COOKIE) { IPAERR("bad params\n"); goto error; } From 8f0ab2d63fbd695ffb387f4a3af25ae04993ef1e Mon Sep 17 00:00:00 2001 From: Kasin Li Date: Wed, 22 Feb 2017 18:25:36 +0800 Subject: [PATCH 0994/1015] drm/msm: Fix potential buffer overflow issue In function submit_create, if nr is assigned with negative value, the allocated buffer may be small than intended.Using this buffer will lead to buffer overflow issue. Change-Id: I0b61cccffd836e2dd3c859446470af4b6451b9ed Signed-off-by: Kasin Li Signed-off-by: Archana Sriram --- drivers/gpu/drm/msm/msm_gem_submit.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index b024abf7be810..395d0248a38d7 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -34,10 +34,13 @@ static inline void __user *to_user_ptr(u64 address) } static struct msm_gem_submit *submit_create(struct drm_device *dev, - struct msm_gpu *gpu, int nr) + struct msm_gpu *gpu, uint32_t nr) { struct msm_gem_submit *submit; - int sz = sizeof(*submit) + (nr * sizeof(submit->bos[0])); + uint64_t sz = sizeof(*submit) + (nr * sizeof(submit->bos[0])); + + if (sz > SIZE_MAX) + return NULL; submit = kmalloc(sz, GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY); if (submit) { From 3c7b724aaa59a04b3db41b682fd6e7637123c25b Mon Sep 17 00:00:00 2001 From: Abir Ghosh Date: Tue, 2 May 2017 22:41:06 +0530 Subject: [PATCH 0995/1015] qbt1000: Validate FP app name before qseecom_start_app Validate the name of the client app before passing it to qseecom_start_app. CRs-Fixed: 2006695 Change-Id: I9c6b16050d4f6fc94827021c7b0f2ab292452f60 Signed-off-by: Abir Ghosh --- drivers/soc/qcom/qbt1000.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/soc/qcom/qbt1000.c b/drivers/soc/qcom/qbt1000.c index ee4939ab3ecdd..335333098a49f 100644 --- a/drivers/soc/qcom/qbt1000.c +++ b/drivers/soc/qcom/qbt1000.c @@ -60,6 +60,7 @@ enum sensor_connection_types { * user space will provide new value upon tz app load */ static uint32_t g_app_buf_size = SZ_256K; +static char const *const FP_APP_NAME = "fingerpr"; struct qbt1000_drvdata { struct class *qbt1000_class; @@ -794,6 +795,13 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) goto end; } + if (strcmp(app.name, FP_APP_NAME)) { + dev_err(drvdata->dev, "%s: Invalid app name\n", + __func__); + rc = -EINVAL; + goto end; + } + if (drvdata->app_handle) { dev_err(drvdata->dev, "%s: LOAD app already loaded, unloading first\n", __func__); From 5db02769ab19ad25d482d12a12deaf083efc1777 Mon Sep 17 00:00:00 2001 From: Zhen Kong Date: Fri, 16 Jun 2017 11:55:07 -0700 Subject: [PATCH 0996/1015] qseecom: use strnlen in qseecom_start_app The appname received by qseecom_start_app() can be non-null terminated string beyond the max size check. Change strlen to strnlen. CRs-fixed: 2062061 Change-Id: I845d244336b5c81cedb2153d1303585f16819d58 Signed-off-by: Zhen Kong --- drivers/misc/qseecom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 2163ab9b35869..4854e179bd4cd 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -4353,9 +4353,9 @@ int qseecom_start_app(struct qseecom_handle **handle, return -EINVAL; } - if (strlen(app_name) >= MAX_APP_NAME_SIZE) { + if (strnlen(app_name, MAX_APP_NAME_SIZE) == MAX_APP_NAME_SIZE) { pr_err("The app_name (%s) with length %zu is not valid\n", - app_name, strlen(app_name)); + app_name, strnlen(app_name, MAX_APP_NAME_SIZE)); return -EINVAL; } From 9bdf72b248a12b003d7d738fabde7803dcdbce18 Mon Sep 17 00:00:00 2001 From: Jin Qian Date: Mon, 24 Apr 2017 18:20:52 -0700 Subject: [PATCH 0997/1015] BACKPORT: f2fs: sanity check log_blocks_per_seg f2fs currently only supports 4KB block size and 2MB segment size. Sanity check log_blocks_per_seg == 9, i.e. 2MB/4KB = (1 << 9) Partially (cherry-picked from commit 9a59b62fd88196844cee5fff851bee2cfd7afb6e) f2fs: do more integrity verification for superblock Do more sanity check for superblock during ->mount. Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Jin Qian Bug: 36817013 Change-Id: I0be52e54fba82083068337ceb9f7ad985a87319f Git-repo: https://android.googlesource.com/kernel/common Git-commit: 3c1659a14b13e66d1d1ab926e242489bda494752 Signed-off-by: Dennis Cagle --- fs/f2fs/super.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 50cb921ecede5..c75c074b6c73e 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -801,6 +801,14 @@ static int sanity_check_raw_super(struct super_block *sb, return 1; } + /* check log blocks per segment */ + if (le32_to_cpu(raw_super->log_blocks_per_seg) != 9) { + f2fs_msg(sb, KERN_INFO, + "Invalid log blocks per segment (%u)\n", + le32_to_cpu(raw_super->log_blocks_per_seg)); + return 1; + } + /* Currently, support 512/1024/2048/4096 bytes sector size */ if (le32_to_cpu(raw_super->log_sectorsize) > F2FS_MAX_LOG_SECTOR_SIZE || From 0a07cdec9ba86ef39c21604232e14a9059aedc63 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 31 Jan 2017 15:24:03 +0100 Subject: [PATCH 0998/1015] timerfd: Protect the might cancel mechanism proper The handling of the might_cancel queueing is not properly protected, so parallel operations on the file descriptor can race with each other and lead to list corruptions or use after free. Protect the context for these operations with a seperate lock. The wait queue lock cannot be reused for this because that would create a lock inversion scenario vs. the cancel lock. Replacing might_cancel with an atomic (atomic_t or atomic bit) does not help either because it still can race vs. the actual list operation. Change-Id: Ib0fc09f70b40be38badbbf674aacaa5c24a466b7 Reported-by: Dmitry Vyukov Signed-off-by: Thomas Gleixner Cc: "linux-fsdevel@vger.kernel.org" Cc: syzkaller Cc: Al Viro Cc: linux-fsdevel@vger.kernel.org Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1701311521430.3457@nanos Signed-off-by: Thomas Gleixner Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git Git-commit: 1e38da300e1e395a15048b0af1e5305bd91402f6 Signed-off-by: Dennis Cagle --- fs/timerfd.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/fs/timerfd.c b/fs/timerfd.c index 86b32c3cb247f..31374ec8f9bd2 100644 --- a/fs/timerfd.c +++ b/fs/timerfd.c @@ -40,6 +40,7 @@ struct timerfd_ctx { short unsigned settime_flags; /* to show in fdinfo */ struct rcu_head rcu; struct list_head clist; + spinlock_t cancel_lock; bool might_cancel; }; @@ -113,7 +114,7 @@ void timerfd_clock_was_set(void) rcu_read_unlock(); } -static void timerfd_remove_cancel(struct timerfd_ctx *ctx) +static void __timerfd_remove_cancel(struct timerfd_ctx *ctx) { if (ctx->might_cancel) { ctx->might_cancel = false; @@ -123,6 +124,13 @@ static void timerfd_remove_cancel(struct timerfd_ctx *ctx) } } +static void timerfd_remove_cancel(struct timerfd_ctx *ctx) +{ + spin_lock(&ctx->cancel_lock); + __timerfd_remove_cancel(ctx); + spin_unlock(&ctx->cancel_lock); +} + static bool timerfd_canceled(struct timerfd_ctx *ctx) { if (!ctx->might_cancel || ctx->moffs.tv64 != KTIME_MAX) @@ -133,6 +141,7 @@ static bool timerfd_canceled(struct timerfd_ctx *ctx) static void timerfd_setup_cancel(struct timerfd_ctx *ctx, int flags) { + spin_lock(&ctx->cancel_lock); if ((ctx->clockid == CLOCK_REALTIME || ctx->clockid == CLOCK_REALTIME_ALARM || ctx->clockid == CLOCK_POWEROFF_ALARM) && @@ -143,9 +152,10 @@ static void timerfd_setup_cancel(struct timerfd_ctx *ctx, int flags) list_add_rcu(&ctx->clist, &cancel_list); spin_unlock(&cancel_lock); } - } else if (ctx->might_cancel) { - timerfd_remove_cancel(ctx); + } else { + __timerfd_remove_cancel(ctx); } + spin_unlock(&ctx->cancel_lock); } static ktime_t timerfd_get_remaining(struct timerfd_ctx *ctx) @@ -397,6 +407,7 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags) return -ENOMEM; init_waitqueue_head(&ctx->wqh); + spin_lock_init(&ctx->cancel_lock); ctx->clockid = clockid; if (isalarm(ctx)) { From 3b96134d5b6df7196e4b7dba1a398e25a5c5184f Mon Sep 17 00:00:00 2001 From: Jin Qian Date: Tue, 25 Apr 2017 16:28:48 -0700 Subject: [PATCH 0999/1015] f2fs: sanity check segment count F2FS uses 4 bytes to represent block address. As a result, supported size of disk is 16 TB and it equals to 16 * 1024 * 1024 / 2 segments. Signed-off-by: Jin Qian Signed-off-by: Jaegeuk Kim [dcagle@codeaurora.org: Resolve merge conflict] Change-Id: I64d9be6dcc4ab5d8a45359c69d6163ed0209e8fe Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git Git-commit: b9dd46188edc2f0d1f37328637860bb65a771124 Signed-off-by: Dennis Cagle --- fs/f2fs/super.c | 7 +++++++ include/linux/f2fs_fs.h | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 50cb921ecede5..727767b49aaaa 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -819,6 +819,13 @@ static int sanity_check_raw_super(struct super_block *sb, le32_to_cpu(raw_super->log_sectorsize)); return 1; } + + if (le32_to_cpu(raw_super->segment_count) > F2FS_MAX_SEGMENT) { + f2fs_msg(sb, KERN_INFO, + "Invalid segment count (%u)", + le32_to_cpu(raw_super->segment_count)); + return 1; + } return 0; } diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h index 860313a33a438..2df22eab98e3f 100644 --- a/include/linux/f2fs_fs.h +++ b/include/linux/f2fs_fs.h @@ -268,6 +268,12 @@ struct f2fs_nat_block { #define SIT_VBLOCK_MAP_SIZE 64 #define SIT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_sit_entry)) +/* + * F2FS uses 4 bytes to represent block address. As a result, supported size of + * disk is 16 TB and it equals to 16 * 1024 * 1024 / 2 segments. + */ +#define F2FS_MAX_SEGMENT ((16 * 1024 * 1024) / 2) + /* * Note that f2fs_sit_entry->vblocks has the following bit-field information. * [15:10] : allocation type such as CURSEG_XXXX_TYPE From 98b503a9f8aa4c40d9c041749c484cbb9f19eabe Mon Sep 17 00:00:00 2001 From: Jin Qian Date: Thu, 11 May 2017 16:15:15 -0700 Subject: [PATCH 1000/1015] FROMLIST: f2fs: sanity check checkpoint segno and blkoff Make sure segno and blkoff read from raw image are valid. (url https://sourceforge.net/p/linux-f2fs/mailman/message/35835945) Signed-off-by: Jin Qian Bug: 36588520 Change-Id: Iba66ab97d3d0870ea48b5ef192d9075f225a934a Git-repo: https://android.googlesource.com/kernel/msm Git-commit: bac1f6d0d42c2cb696c1508afcbf71b0893e0c9a Signed-off-by: Dennis Cagle --- fs/f2fs/super.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 50cb921ecede5..f551ce34bf6af 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -827,6 +827,8 @@ static int sanity_check_ckpt(struct f2fs_sb_info *sbi) unsigned int total, fsmeta; struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); + unsigned int main_segs, blocks_per_seg; + int i; total = le32_to_cpu(raw_super->segment_count); fsmeta = le32_to_cpu(raw_super->segment_count_ckpt); @@ -838,6 +840,22 @@ static int sanity_check_ckpt(struct f2fs_sb_info *sbi) if (unlikely(fsmeta >= total)) return 1; + main_segs = le32_to_cpu(sbi->raw_super->segment_count_main); + blocks_per_seg = sbi->blocks_per_seg; + + for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) { + if (le32_to_cpu(ckpt->cur_node_segno[i]) >= main_segs || + le16_to_cpu(ckpt->cur_node_blkoff[i]) >= blocks_per_seg) { + return 1; + } + } + for (i = 0; i < NR_CURSEG_DATA_TYPE; i++) { + if (le32_to_cpu(ckpt->cur_data_segno[i]) >= main_segs || + le16_to_cpu(ckpt->cur_data_blkoff[i]) >= blocks_per_seg) { + return 1; + } + } + if (unlikely(f2fs_cp_error(sbi))) { f2fs_msg(sbi->sb, KERN_ERR, "A bug case: need to run fsck"); return 1; From 993865befa0df1f4fdc98a6105ea380f861b2709 Mon Sep 17 00:00:00 2001 From: Adrian Salido Date: Tue, 18 Apr 2017 11:44:33 -0700 Subject: [PATCH 1001/1015] tracing : fix race condition reading saved tgids Commit 939c7a4f04fc ("tracing: Introduce saved_cmdlines_size file") introduced ability to change saved cmdlines size. This resized saved command lines but missed resizing tgid mapping as well. Another issue is that when the resize happens, it removes saved command lines and reallocates new memory for it. This introduced a race condition when reading the global savecmd as this can be freed in the middle of accessing it causing a use after free access. Fix this by implementing locking. Signed-off-by: Adrian Salido Bug: 36007735 Change-Id: I334791ac35f8bcbd34362ed112aa624275a46947 Git-repo: https://android.googlesource.com/kernel/common Git-commit: 7116d306da66de0de21e982024b4d3a3056f4461 Signed-off-by: Dennis Cagle --- kernel/trace/trace.c | 101 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 81 insertions(+), 20 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index b4c923afd410b..de12731d5ade7 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1285,11 +1285,11 @@ void tracing_reset_all_online_cpus(void) #define SAVED_CMDLINES_DEFAULT 128 #define NO_CMDLINE_MAP UINT_MAX -static unsigned saved_tgids[SAVED_CMDLINES_DEFAULT]; static arch_spinlock_t trace_cmdline_lock = __ARCH_SPIN_LOCK_UNLOCKED; struct saved_cmdlines_buffer { unsigned map_pid_to_cmdline[PID_MAX_DEFAULT+1]; unsigned *map_cmdline_to_pid; + unsigned *map_cmdline_to_tgid; unsigned cmdline_num; int cmdline_idx; char *saved_cmdlines; @@ -1323,12 +1323,23 @@ static int allocate_cmdlines_buffer(unsigned int val, return -ENOMEM; } + s->map_cmdline_to_tgid = kmalloc_array(val, + sizeof(*s->map_cmdline_to_tgid), + GFP_KERNEL); + if (!s->map_cmdline_to_tgid) { + kfree(s->map_cmdline_to_pid); + kfree(s->saved_cmdlines); + return -ENOMEM; + } + s->cmdline_idx = 0; s->cmdline_num = val; memset(&s->map_pid_to_cmdline, NO_CMDLINE_MAP, sizeof(s->map_pid_to_cmdline)); memset(s->map_cmdline_to_pid, NO_CMDLINE_MAP, val * sizeof(*s->map_cmdline_to_pid)); + memset(s->map_cmdline_to_tgid, NO_CMDLINE_MAP, + val * sizeof(*s->map_cmdline_to_tgid)); return 0; } @@ -1494,14 +1505,17 @@ static int trace_save_cmdline(struct task_struct *tsk) if (!tsk->pid || unlikely(tsk->pid > PID_MAX_DEFAULT)) return 0; + preempt_disable(); /* * It's not the end of the world if we don't get * the lock, but we also don't want to spin * nor do we want to disable interrupts, * so if we miss here, then better luck next time. */ - if (!arch_spin_trylock(&trace_cmdline_lock)) + if (!arch_spin_trylock(&trace_cmdline_lock)) { + preempt_enable(); return 0; + } idx = savedcmd->map_pid_to_cmdline[tsk->pid]; if (idx == NO_CMDLINE_MAP) { @@ -1524,8 +1538,9 @@ static int trace_save_cmdline(struct task_struct *tsk) } set_cmdline(idx, tsk->comm); - saved_tgids[idx] = tsk->tgid; + savedcmd->map_cmdline_to_tgid[idx] = tsk->tgid; arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); return 1; } @@ -1567,19 +1582,29 @@ void trace_find_cmdline(int pid, char comm[]) preempt_enable(); } -int trace_find_tgid(int pid) +static int __find_tgid_locked(int pid) { unsigned map; int tgid; - preempt_disable(); - arch_spin_lock(&trace_cmdline_lock); map = savedcmd->map_pid_to_cmdline[pid]; if (map != NO_CMDLINE_MAP) - tgid = saved_tgids[map]; + tgid = savedcmd->map_cmdline_to_tgid[map]; else tgid = -1; + return tgid; +} + +int trace_find_tgid(int pid) +{ + int tgid; + + preempt_disable(); + arch_spin_lock(&trace_cmdline_lock); + + tgid = __find_tgid_locked(pid); + arch_spin_unlock(&trace_cmdline_lock); preempt_enable(); @@ -3881,10 +3906,15 @@ tracing_saved_cmdlines_size_read(struct file *filp, char __user *ubuf, { char buf[64]; int r; + unsigned int n; + preempt_disable(); arch_spin_lock(&trace_cmdline_lock); - r = scnprintf(buf, sizeof(buf), "%u\n", savedcmd->cmdline_num); + n = savedcmd->cmdline_num; arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); + + r = scnprintf(buf, sizeof(buf), "%u\n", n); return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); } @@ -3893,6 +3923,7 @@ static void free_saved_cmdlines_buffer(struct saved_cmdlines_buffer *s) { kfree(s->saved_cmdlines); kfree(s->map_cmdline_to_pid); + kfree(s->map_cmdline_to_tgid); kfree(s); } @@ -3909,10 +3940,12 @@ static int tracing_resize_saved_cmdlines(unsigned int val) return -ENOMEM; } + preempt_disable(); arch_spin_lock(&trace_cmdline_lock); savedcmd_temp = savedcmd; savedcmd = s; arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); free_saved_cmdlines_buffer(savedcmd_temp); return 0; @@ -3955,33 +3988,61 @@ tracing_saved_tgids_read(struct file *file, char __user *ubuf, char *file_buf; char *buf; int len = 0; - int pid; int i; + int *pids; + int n = 0; - file_buf = kmalloc(SAVED_CMDLINES_DEFAULT*(16+1+16), GFP_KERNEL); - if (!file_buf) - return -ENOMEM; + preempt_disable(); + arch_spin_lock(&trace_cmdline_lock); - buf = file_buf; + pids = kmalloc_array(savedcmd->cmdline_num, 2*sizeof(int), GFP_KERNEL); + if (!pids) { + arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); + return -ENOMEM; + } - for (i = 0; i < SAVED_CMDLINES_DEFAULT; i++) { - int tgid; - int r; + for (i = 0; i < savedcmd->cmdline_num; i++) { + int pid; pid = savedcmd->map_cmdline_to_pid[i]; if (pid == -1 || pid == NO_CMDLINE_MAP) continue; - tgid = trace_find_tgid(pid); - r = sprintf(buf, "%d %d\n", pid, tgid); + pids[n] = pid; + pids[n+1] = __find_tgid_locked(pid); + n += 2; + } + arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); + + if (n == 0) { + kfree(pids); + return 0; + } + + /* enough to hold max pair of pids + space, lr and nul */ + len = n * 12; + file_buf = kmalloc(len, GFP_KERNEL); + if (!file_buf) { + kfree(pids); + return -ENOMEM; + } + + buf = file_buf; + for (i = 0; i < n && len > 0; i += 2) { + int r; + + r = snprintf(buf, len, "%d %d\n", pids[i], pids[i+1]); buf += r; - len += r; + len -= r; } len = simple_read_from_buffer(ubuf, cnt, ppos, - file_buf, len); + file_buf, buf - file_buf); kfree(file_buf); + kfree(pids); return len; } From 41e4f889b04f4d7b527026cebc0a74cefd36bcd1 Mon Sep 17 00:00:00 2001 From: Ghanim Fodi Date: Mon, 7 Aug 2017 11:40:58 +0300 Subject: [PATCH 1002/1015] msm: ipa3: Fix IPA aggregation force close call Core IPA driver passes wrong end-point index to HAL when generating aggregation force close parameters values. Fixed the call to pass the correct index. CRs-Fixed: 2082839 Change-Id: Icc0fd2ce8a23bf0e3334f54b27b850ebf92b58a1 Signed-off-by: Ghanim Fodi --- drivers/platform/msm/ipa/ipa_v3/ipa_utils.c | 2 +- drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 5768bdec980d5..4eb674b7da447 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -4275,7 +4275,7 @@ static int ipa3_tag_generate_force_close_desc(struct ipa3_desc desc[], IPAHAL_FULL_PIPELINE_CLEAR; reg_write_agg_close.offset = ipahal_get_reg_ofst(IPA_AGGR_FORCE_CLOSE); - ipahal_get_aggr_force_close_valmask(1< (sizeof(valmask->val) * 8 - 1)) { + IPAHAL_ERR("too big ep_idx %d\n", ep_idx); + ipa_assert(); + return; + } IPA_SETFIELD_IN_REG(valmask->val, 1 << ep_idx, IPA_AGGR_FORCE_CLOSE_OFST_AGGR_FORCE_CLOSE_PIPE_BITMAP_SHFT, IPA_AGGR_FORCE_CLOSE_OFST_AGGR_FORCE_CLOSE_PIPE_BITMAP_BMSK); @@ -1356,6 +1360,7 @@ void ipahal_get_aggr_force_close_valmask(int ep_idx, valmask->mask = IPA_AGGR_FORCE_CLOSE_OFST_AGGR_FORCE_CLOSE_PIPE_BITMAP_BMSK << IPA_AGGR_FORCE_CLOSE_OFST_AGGR_FORCE_CLOSE_PIPE_BITMAP_SHFT; + } void ipahal_get_fltrt_hash_flush_valmask( From 0e3afcdd8f5e490739df5c5bcc1222178fe312b3 Mon Sep 17 00:00:00 2001 From: Dhoat Harpal Date: Fri, 18 Aug 2017 16:06:48 +0530 Subject: [PATCH 1003/1015] soc: qcom: glink: Initialize dummy xprt with dummy functions Few function pointers are left uninitialized in dummy transport. System can crash if these function pointer get dereferenced. Initialize all the function pointers which can get called, with dummy functions. CRs-Fixed: 2067859 Change-Id: I9172776d9ffa0af5deb9898125fc6403fdcdee0f Signed-off-by: Dhoat Harpal --- drivers/soc/qcom/glink.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/drivers/soc/qcom/glink.c b/drivers/soc/qcom/glink.c index d8102ff006ff0..6e2d5aae970cc 100644 --- a/drivers/soc/qcom/glink.c +++ b/drivers/soc/qcom/glink.c @@ -2336,6 +2336,35 @@ static void dummy_tx_cmd_ch_remote_close_ack(struct glink_transport_if *if_ptr, /* intentionally left blank */ } +/** + * dummy_tx_cmd_ch_open() - dummy channel open cmd sending function + * @if_ptr: The transport to transmit on. + * @lcid: The local channel id to encode. + * @name: The channel name to encode. + * @req_xprt: The transport the core would like to migrate this channel to. + * + * Return: 0 on success or standard Linux error code. + */ +static int dummy_tx_cmd_ch_open(struct glink_transport_if *if_ptr, + uint32_t lcid, const char *name, + uint16_t req_xprt) +{ + return -EOPNOTSUPP; +} + +/** + * dummy_tx_cmd_ch_remote_open_ack() - convert a channel open ack cmd to wire + * format and transmit + * @if_ptr: The transport to transmit on. + * @rcid: The remote channel id to encode. + * @xprt_resp: The response to a transport migration request. + */ +static void dummy_tx_cmd_ch_remote_open_ack(struct glink_transport_if *if_ptr, + uint32_t rcid, uint16_t xprt_resp) +{ + /* intentionally left blank */ +} + /** * dummy_get_power_vote_ramp_time() - Dummy Power vote ramp time * @if_ptr: The transport to transmit on. @@ -4012,8 +4041,14 @@ static struct glink_core_xprt_ctx *glink_create_dummy_xprt_ctx( if_ptr->tx_cmd_remote_rx_intent_req_ack = dummy_tx_cmd_remote_rx_intent_req_ack; if_ptr->tx_cmd_set_sigs = dummy_tx_cmd_set_sigs; + if_ptr->tx_cmd_ch_open = dummy_tx_cmd_ch_open; + if_ptr->tx_cmd_ch_remote_open_ack = dummy_tx_cmd_ch_remote_open_ack; if_ptr->tx_cmd_ch_close = dummy_tx_cmd_ch_close; if_ptr->tx_cmd_ch_remote_close_ack = dummy_tx_cmd_ch_remote_close_ack; + if_ptr->tx_cmd_tracer_pkt = dummy_tx_cmd_tracer_pkt; + if_ptr->get_power_vote_ramp_time = dummy_get_power_vote_ramp_time; + if_ptr->power_vote = dummy_power_vote; + if_ptr->power_unvote = dummy_power_unvote; xprt_ptr->ops = if_ptr; xprt_ptr->log_ctx = log_ctx; From bf018542ceace4da5b083597ea2e6c8ece248468 Mon Sep 17 00:00:00 2001 From: yidongh Date: Tue, 15 Aug 2017 14:24:13 +0800 Subject: [PATCH 1004/1015] ASoC: msm: qdspv2: initialize struct member before being used Initialize member value of struct audio_aio_write_param after declaration. CRs-Fixed: 2091953 Change-Id: Iaf3ff1232e85ae8d26e9d97ce4c2aa3408da7a80 Signed-off-by: Yidong Huang --- drivers/misc/qcom/qdsp6v2/audio_utils_aio.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c index 0a8b1245a50b2..0aa81ea4bff50 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c @@ -1062,6 +1062,8 @@ static int audio_aio_async_write(struct q6audio_aio *audio, struct audio_client *ac; struct audio_aio_write_param param; + memset(¶m, 0, sizeof(param)); + if (!audio || !buf_node) { pr_err("%s NULL pointer audio=[0x%pK], buf_node=[0x%pK]\n", __func__, audio, buf_node); From 4dedd19842a311ea6716f487f6bd2ee2d7533720 Mon Sep 17 00:00:00 2001 From: Narender Ankam Date: Wed, 23 Aug 2017 15:55:50 +0530 Subject: [PATCH 1005/1015] msm: mdss: hdmi: validate HDMI EDID's max number of CEA blocks No upper-bound validation is performed when reading number of extended CEA blocks from the untrusted source (EDID). Add a check to limit the number of CEA extension blocks. Change-Id: I69f09ed0ad28a4c267cf3e8f7a12efe46f75e244 Signed-off-by: Narender Ankam --- drivers/video/msm/mdss/mdss_hdmi_edid.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/video/msm/mdss/mdss_hdmi_edid.c b/drivers/video/msm/mdss/mdss_hdmi_edid.c index 1e9d97dbeb6b9..56fc9d837e651 100644 --- a/drivers/video/msm/mdss/mdss_hdmi_edid.c +++ b/drivers/video/msm/mdss/mdss_hdmi_edid.c @@ -2197,6 +2197,13 @@ int hdmi_edid_parser(void *input) goto bail; } + /* Find out if CEA extension blocks exceeding max limit */ + if (num_of_cea_blocks >= MAX_EDID_BLOCKS) { + DEV_WARN("%s: HDMI EDID exceeded max CEA blocks limit\n", + __func__); + num_of_cea_blocks = MAX_EDID_BLOCKS - 1; + } + /* check for valid CEA block */ if (edid_buf[EDID_BLOCK_SIZE] != 2) { DEV_ERR("%s: Invalid CEA block\n", __func__); From b7ddbed5ecd1cc163dce2d0ab04e50c02f97a955 Mon Sep 17 00:00:00 2001 From: Veerabhadrarao Badiganti Date: Thu, 15 Jun 2017 18:44:19 +0530 Subject: [PATCH 1006/1015] mmc: sdhci-msm: Set dll to good phase while sending cmd13 in tuning Set the dll to last known good phase before sending status command while executing tuning. This is to ensure that status command won't fail due to bad phase. Thus we can avoid sending status command multiple times and reduce tuning latency. Change-Id: Ib7fa5a8acbbffd9662617a357d221b36494a98b9 Signed-off-by: Veerabhadrarao Badiganti --- drivers/mmc/host/sdhci-msm.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 9f7155070b30b..a565e6b66fa77 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -958,6 +958,7 @@ int sdhci_msm_execute_tuning(struct sdhci_host *host, u32 opcode) bool drv_type_changed = false; struct mmc_card *card = host->mmc->card; int sts_retry; + u8 last_good_phase = 0; /* * Tuning is required for SDR104, HS200 and HS400 cards and @@ -1043,6 +1044,22 @@ int sdhci_msm_execute_tuning(struct sdhci_host *host, u32 opcode) mmc_wait_for_req(mmc, &mrq); if (card && (cmd.error || data.error)) { + /* + * Set the dll to last known good phase while sending + * status command to ensure that status command won't + * fail due to bad phase. + */ + if (tuned_phase_cnt) + last_good_phase = + tuned_phases[tuned_phase_cnt-1]; + else if (msm_host->saved_tuning_phase != + INVALID_TUNING_PHASE) + last_good_phase = msm_host->saved_tuning_phase; + + rc = msm_config_cm_dll_phase(host, last_good_phase); + if (rc) + goto kfree; + sts_cmd.opcode = MMC_SEND_STATUS; sts_cmd.arg = card->rca << 16; sts_cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; From 0b57c2c8a45a41e5f47727d7c3a62a99132e954e Mon Sep 17 00:00:00 2001 From: Veerabhadrarao Badiganti Date: Fri, 23 Jun 2017 19:18:45 +0530 Subject: [PATCH 1007/1015] mmc: core: Use PF_MEMALLOC flag for clock scaling context Memory allocations with GFP_KERNEL flag in clock scaling path might trigger IO transfer. This can cause deadlock since the claim_host lock which is needed by mmc driver to perform IO is held by clock scaling context. Below is the exact call sequence: mmc_devfreq_set_target() -> mmc_clk_update_freq () -> mmc_change_bus_speed() -> mmc_select_hs400() -> mmc_select_bus_width() -> mmc_get_ext_csd() -> kzalloc(512, GFP_KERNEL) -> try_to_free_pages() -> evict() -> ext4_evict_inode(). To avoid this scenario, use PF_MEMALLOC flag for clock scaling context so that it can have access to the more reserves of memory. And since devfreq workitem would run in different kworker threads, restore to original flags once done with setting clock frequency. Change-Id: If52f83f6ecae982d8ed709b08fd84545c7ecbc43 Signed-off-by: Veerabhadrarao Badiganti --- drivers/mmc/core/core.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 89314dc451dec..91433dfc82714 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -464,6 +464,10 @@ static int mmc_devfreq_set_target(struct device *dev, struct mmc_devfeq_clk_scaling *clk_scaling; int err = 0; int abort; + unsigned long pflags = current->flags; + + /* Ensure scaling would happen even in memory pressure conditions */ + current->flags |= PF_MEMALLOC; if (!(host && freq)) { pr_err("%s: unexpected host/freq parameter\n", __func__); @@ -522,6 +526,7 @@ static int mmc_devfreq_set_target(struct device *dev, mmc_host_clk_release(host); mmc_release_host(host); out: + tsk_restore_flags(current, pflags, PF_MEMALLOC); return err; } From 57026b93416a50f4c51ee2b4a47a94e538f0e0be Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Thu, 1 Jun 2017 14:44:16 +0530 Subject: [PATCH 1008/1015] diag: dci: Add NULL pointer checks for dci buffers The patch initializes dci peripheral buffers to NULL to prevent access before allocation by validating buffer status. CRs-Fixed: 2048635 Change-Id: I9be46e751da81cbbbae4fe0333c23101fdbf79ed Signed-off-by: Manoj Prabhu B --- drivers/char/diag/diag_dci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/char/diag/diag_dci.c b/drivers/char/diag/diag_dci.c index 62b0cf2e966f5..fd5157dda02e3 100644 --- a/drivers/char/diag/diag_dci.c +++ b/drivers/char/diag/diag_dci.c @@ -2767,6 +2767,8 @@ int diag_dci_register_client(struct diag_dci_reg_tbl_t *reg_entry) new_entry->num_buffers = 1; break; } + + new_entry->buffers = NULL; new_entry->real_time = MODE_REALTIME; new_entry->in_service = 0; INIT_LIST_HEAD(&new_entry->list_write_buf); @@ -2840,7 +2842,8 @@ int diag_dci_register_client(struct diag_dci_reg_tbl_t *reg_entry) fail_alloc: if (new_entry) { - for (i = 0; i < new_entry->num_buffers; i++) { + for (i = 0; ((i < new_entry->num_buffers) && + new_entry->buffers); i++) { proc_buf = &new_entry->buffers[i]; if (proc_buf) { mutex_destroy(&proc_buf->health_mutex); From b88f762519ec2f9664561a236e356da0488bd532 Mon Sep 17 00:00:00 2001 From: Ajay Agarwal Date: Fri, 1 Sep 2017 11:44:48 +0530 Subject: [PATCH 1009/1015] usb: gadget: Clear multi_req flag if UDC suspended If a large request has to be queued onto an EP, then multi_req flag for that EP is set before queueing the request to the hardware. Now if the UDC is suspended during cable disconnect before the request could be queued to the HW, then multi_req flag is not cleared even by ep_disable. Then on cable connect, re-enumeration fails with Large Request error for that particular endpoint. Fix this by clearing multi_req flag if the UDC suspend happens before HW enqueue happens. Change-Id: I77316192876b46ab82b775e01e2155309c2e91f8 Signed-off-by: Ajay Agarwal --- drivers/usb/gadget/ci13xxx_udc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c index 550f16d89aceb..2ee974eddb63d 100644 --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c @@ -3166,6 +3166,7 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req, __func__); dev_dbg(mEp->device, "%s: Remote wakeup is not supported. ept #%d\n", __func__, mEp->num); + mEp->multi_req = false; retval = -EAGAIN; goto done; From b188ea895b6f321272132ffeb572cea962ec622c Mon Sep 17 00:00:00 2001 From: Adrian Salido Date: Thu, 27 Apr 2017 10:32:55 -0700 Subject: [PATCH 1010/1015] dm ioctl: prevent stack leak in dm ioctl call commit 4617f564c06117c7d1b611be49521a4430042287 upstream. When calling a dm ioctl that doesn't process any data (IOCTL_FLAGS_NO_PARAMS), the contents of the data field in struct dm_ioctl are left initialized. Current code is incorrectly extending the size of data copied back to user, causing the contents of kernel stack to be leaked to user. Fix by only copying contents before data and allow the functions processing the ioctl to override. CRs-Fixed: 2094612 Change-Id: Id643af806105d898c53afae4e7760709c7f0896c Signed-off-by: Adrian Salido Reviewed-by: Alasdair G Kergon Signed-off-by: Mike Snitzer Signed-off-by: Greg Kroah-Hartman Git-commit: 4617f564c06117c7d1b611be49521a4430042287 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Signed-off-by: Shadab Naseem --- drivers/md/dm-ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 1d9628bc8c92e..755050e5587fd 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c @@ -1839,7 +1839,7 @@ static int ctl_ioctl(uint command, struct dm_ioctl __user *user) if (r) goto out; - param->data_size = sizeof(*param); + param->data_size = offsetof(struct dm_ioctl, data); r = fn(param, input_param_size); if (unlikely(param->flags & DM_BUFFER_FULL_FLAG) && From 8a5e0911ac236f475c60509db20cc2eee2dc768d Mon Sep 17 00:00:00 2001 From: Trishansh Bhardwaj Date: Mon, 4 Sep 2017 11:02:14 +0530 Subject: [PATCH 1011/1015] msm: camera: Return -NOTTY on invalid ioctl command. Check validity of command before processing. Change-Id: Icc5c57eac999b7c40fbb9505b2b88745167adc66 Signed-off-by: Trishansh Bhardwaj --- drivers/media/platform/msm/camera_v2/msm.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index bd7db44ebae09..f40b1fe9b4556 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -728,6 +728,16 @@ static long msm_private_ioctl(struct file *file, void *fh, if (!event_data) return -EINVAL; + switch (cmd) { + case MSM_CAM_V4L2_IOCTL_NOTIFY: + case MSM_CAM_V4L2_IOCTL_CMD_ACK: + case MSM_CAM_V4L2_IOCTL_NOTIFY_DEBUG: + case MSM_CAM_V4L2_IOCTL_NOTIFY_ERROR: + break; + default: + return -ENOTTY; + } + memset(&event, 0, sizeof(struct v4l2_event)); session_id = event_data->session_id; stream_id = event_data->stream_id; From 153bd4d5fcfd6ab094f750bad6420b0cd58251f9 Mon Sep 17 00:00:00 2001 From: Chris Lew Date: Mon, 21 Aug 2017 15:33:40 -0700 Subject: [PATCH 1012/1015] soc: qcom: smp2p: spinlock_test: Initialize work item Initialize the has_locked member before running SSR spinlock test to ensure consistent results. CRs-Fixed: 2091946 Change-Id: Ifad37541a94668b496aa9204dc80920b9a7ff244 Signed-off-by: Chris Lew --- drivers/soc/qcom/smp2p_spinlock_test.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/soc/qcom/smp2p_spinlock_test.c b/drivers/soc/qcom/smp2p_spinlock_test.c index 99b4558ef01f2..27ad4f4c5c643 100644 --- a/drivers/soc/qcom/smp2p_spinlock_test.c +++ b/drivers/soc/qcom/smp2p_spinlock_test.c @@ -1,6 +1,6 @@ /* drivers/soc/qcom/smp2p_spinlock_test.c * - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2015, 2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -516,7 +516,7 @@ static void smp2p_ut_remote_spinlock_ssr(struct seq_file *s) int spinlock_owner = 0; struct workqueue_struct *ws = NULL; - struct rmt_spinlock_work_item work_item; + struct rmt_spinlock_work_item work_item = { .has_locked = false }; seq_printf(s, " Running %s Test\n", __func__); From 47276bdf8a96e2c3d8330d4afbff8a823e384612 Mon Sep 17 00:00:00 2001 From: VijayaKumar T M Date: Tue, 5 Sep 2017 15:04:20 +0530 Subject: [PATCH 1013/1015] msm: camera: isp: Check null pointer for VFE0 base Add NULL pointer check for vfe_base of VFE0. CRs-Fixed: 1032715 Change-Id: I540d9ff831fc9447ecf145f75ea84da3668c4f6f Signed-off-by: Haibin Liu Signed-off-by: VijayaKumar T M --- drivers/media/platform/msm/camera_v2/isp/msm_isp40.c | 6 ++++++ drivers/media/platform/msm/camera_v2/isp/msm_isp44.c | 8 +++++++- drivers/media/platform/msm/camera_v2/isp/msm_isp46.c | 8 +++++++- drivers/media/platform/msm/camera_v2/isp/msm_isp47.c | 6 ++++++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index 3af953e268976..9764f57e4eb69 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -710,6 +710,12 @@ static void msm_vfe40_reg_update(struct vfe_device *vfe_dev, vfe_dev->reg_update_requested; if ((vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) && ((frame_src == VFE_PIX_0) || (frame_src == VFE_SRC_MAX))) { + if (!vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]) { + pr_err("%s vfe_base for ISP_VFE0 is NULL\n", __func__); + spin_unlock_irqrestore(&vfe_dev->reg_update_lock, + flags); + return; + } msm_camera_io_w_mb(update_mask, vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0] + 0x378); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c index e422d35a2e488..cbb9b89661dcf 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -551,6 +551,12 @@ static void msm_vfe44_reg_update(struct vfe_device *vfe_dev, vfe_dev->reg_update_requested; if ((vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) && ((frame_src == VFE_PIX_0) || (frame_src == VFE_SRC_MAX))) { + if (!vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]) { + pr_err("%s vfe_base for ISP_VFE0 is NULL\n", __func__); + spin_unlock_irqrestore(&vfe_dev->reg_update_lock, + flags); + return; + } msm_camera_io_w_mb(update_mask, vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0] + 0x378); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c index 7217dedd9292c..a785b164f0bdd 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -491,6 +491,12 @@ static void msm_vfe46_reg_update(struct vfe_device *vfe_dev, vfe_dev->reg_update_requested; if ((vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) && ((frame_src == VFE_PIX_0) || (frame_src == VFE_SRC_MAX))) { + if (!vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]) { + pr_err("%s vfe_base for ISP_VFE0 is NULL\n", __func__); + spin_unlock_irqrestore(&vfe_dev->reg_update_lock, + flags); + return; + } msm_camera_io_w_mb(update_mask, vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0] + 0x3D8); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c index 8bc46c8b3f563..e45d049fe5be5 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c @@ -705,6 +705,12 @@ void msm_vfe47_reg_update(struct vfe_device *vfe_dev, vfe_dev->reg_update_requested; if ((vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) && ((frame_src == VFE_PIX_0) || (frame_src == VFE_SRC_MAX))) { + if (!vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]) { + pr_err("%s vfe_base for ISP_VFE0 is NULL\n", __func__); + spin_unlock_irqrestore(&vfe_dev->reg_update_lock, + flags); + return; + } msm_camera_io_w_mb(update_mask, vfe_dev->common_data->dual_vfe_res-> vfe_base[ISP_VFE0] + 0x4AC); From 2dd7cd829e165917bfe384febf21d9727b05fba4 Mon Sep 17 00:00:00 2001 From: hehao Date: Thu, 22 Mar 2018 04:29:14 +0800 Subject: [PATCH 1014/1015] Kernel: Xiaomi kernel changes for Redmi 5, Redmi 4A, Redmi 5A. The Patch based on QualComm release version: LA.UM.5.6.r1-05900-89xx.0 The kernel config file used are: rosy-perf_defconfig(Redmi 5), S88505AA1-perf_defconfig(Redmi 5A), S88503AC1-perf_defconfig(Redmi 4A) Change-Id: I384337b584abfd77ba82ddc59d2cc57ab5adb9ca Signed-off-by: hehao --- AndroidKernel.mk | 38 +- Makefile | 9 + arch/arm/boot/dts/qcom/Makefile | 19 +- .../batterydata-D1_Default-4v4-3300mah.dtsi | 48 + .../qcom/batterydata-Scud-4v4-3300mah.dtsi | 48 + .../qcom/batterydata-Sunwoda-4v4-3300mah.dtsi | 48 + .../qcom/batterydata-qrd-Atl-4v4-4100mah.dtsi | 48 + .../batterydata-qrd-Coslight-4v4-4100mah.dtsi | 48 + .../batterydata-qrd-Default-4v4-4100mah.dtsi | 48 + .../batterydata-qrd-Desay-4v4-4100mah.dtsi | 48 + .../batterydata-qrd-sku1-4v4-2800mah.dtsi | 2 +- ...ta-wingtech-desai_SAMSUNG-4v4-4000mah.dtsi | 117 + ...a-wingtech-feimaotui_SONY-4v4-3030mah.dtsi | 120 + ...a-wingtech-feimaotui_SONY-4v4-4000mah.dtsi | 122 + ...wingtech-guangyu_Coslight-4v4-4000mah.dtsi | 111 + ...a-wingtech-xingwangda_ATL-4v4-3030mah.dtsi | 116 + ...a-wingtech-xingwangda_ATL-4v4-4000mah.dtsi | 119 + .../dsi-panel-ft8006m-boe-5p7-720p-video.dtsi | 110 + .../dsi-panel-ft8613-csot-5p7-720p-video.dtsi | 204 + ...dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi | 99 + .../dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi | 216 + .../dsi-panel-hx8394f-boe-720p-video.dtsi | 128 + .../dsi-panel-hx8394f-boe-c3a-720p-video.dtsi | 175 + .../dsi-panel-hx8394f-boe-c3b-720p-video.dtsi | 197 + .../dsi-panel-ili9881c-ebbg-720p-video.dtsi | 818 + ...si-panel-ili9881c-ebbg-c3a-720p-video.dtsi | 3418 +++ ...si-panel-ili9881c-ebbg-c3b-720p-video.dtsi | 3748 +++ ...dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi | 819 + ...panel-ili9881c-ebbgDJN-c3b-720p-video.dtsi | 3748 +++ ...-panel-ili9881c-tianma-c3b-720p-video.dtsi | 18892 ++++++++++++++++ ...si-panel-nt35521s-ebbg-c3a-720p-video.dtsi | 233 + arch/arm/boot/dts/qcom/msm-audio.dtsi | 8 +- arch/arm/boot/dts/qcom/msm-pm8937.dtsi | 5 + .../dts/qcom/msm-pm8953-rpm-regulator.dtsi | 4 +- arch/arm/boot/dts/qcom/msm-pm8953.dtsi | 5 + arch/arm/boot/dts/qcom/msm-pmi8940.dtsi | 12 +- arch/arm/boot/dts/qcom/msm-pmi8950.dtsi | 18 +- .../boot/dts/qcom/msm8917-camera-pinctrl.dtsi | 13 + .../msm8917-camera-sensor-qrd-s88503.dtsi | 459 + .../msm8917-camera-sensor-qrd-s88505.dtsi | 405 + .../dts/qcom/msm8917-camera-sensor-qrd.dtsi | 332 +- arch/arm/boot/dts/qcom/msm8917-pinctrl.dtsi | 121 +- arch/arm/boot/dts/qcom/msm8917-pm.dtsi | 2 + .../qcom/msm8917-pmi8937-qrd-sku5_S88503.dts | 28 + .../qcom/msm8917-pmi8937-qrd-sku5_S88503.dtsi | 437 + .../qcom/msm8917-pmi8937-qrd-sku5_S88505.dts | 28 + .../qcom/msm8917-pmi8937-qrd-sku5_S88505.dtsi | 442 + arch/arm/boot/dts/qcom/msm8917-qrd.dtsi | 2 +- .../arm/boot/dts/qcom/msm8917-qrd_S88503.dtsi | 40 + .../arm/boot/dts/qcom/msm8917-qrd_S88505.dtsi | 43 + arch/arm/boot/dts/qcom/msm8917.dtsi | 55 +- arch/arm/boot/dts/qcom/msm8937-audio.dtsi | 2 +- .../msm8937-camera-sensor-qrd-wt88536.dtsi | 425 + arch/arm/boot/dts/qcom/msm8937-pinctrl.dtsi | 110 +- .../boot/dts/qcom/msm8937-pmi8950-mtp.dtsi | 53 + .../msm8937-pmi8950-qrd-sku1_S88536AA2.dtsi | 328 + arch/arm/boot/dts/qcom/msm8937-qrd.dtsi | 8 +- arch/arm/boot/dts/qcom/msm8937-regulator.dtsi | 4 +- arch/arm/boot/dts/qcom/msm8937.dtsi | 13 +- .../boot/dts/qcom/msm8940-pmi8950-mtp.dtsi | 43 + .../msm8940-pmi8950-qrd-sku7_S88536AA2.dts | 89 + arch/arm/boot/dts/qcom/msm8940.dtsi | 14 +- .../boot/dts/qcom/msm8952-mdss-panels.dtsi | 6 +- arch/arm/boot/dts/qcom/msm8953-audio.dtsi | 8 +- .../arm/boot/dts/qcom/msm8953-audio_rosy.dtsi | 263 + .../qcom/msm8953-camera-sensor-qrd_rosy.dtsi | 323 + arch/arm/boot/dts/qcom/msm8953-mtp_rosy.dtsi | 405 + .../boot/dts/qcom/msm8953-pinctrl_rosy.dtsi | 1476 ++ arch/arm/boot/dts/qcom/msm8953-pm.dtsi | 2 + .../boot/dts/qcom/msm8953-qrd-sku3_rosy.dtsi | 185 + arch/arm/boot/dts/qcom/msm8953-qrd_rosy.dtsi | 479 + arch/arm/boot/dts/qcom/msm8953-regulator.dtsi | 7 +- arch/arm/boot/dts/qcom/msm8953.dtsi | 8 +- arch/arm/boot/dts/qcom/msm8953_rosy.dtsi | 2591 +++ arch/arm/boot/dts/qcom/sdm450-qrd_rosy.dts | 23 + arch/arm/boot/dts/qcom/sdm450_rosy.dtsi | 120 + arch/arm/mach-nspire/Makefile.boot | 0 arch/arm64/Kconfig | 65 +- arch/arm64/configs/S88503AC1-perf_defconfig | 731 + arch/arm64/configs/S88505AA1-perf_defconfig | 755 + arch/arm64/configs/S88536AA2-perf_defconfig | 727 + arch/arm64/configs/S88536AA2_defconfig | 773 + arch/arm64/configs/rosy-perf_defconfig | 715 + arch/arm64/include/asm/bootinfo.h | 51 + arch/arm64/include/asm/processor.h | 1 + arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/bootinfo.c | 203 + arch/arm64/kernel/setup.c | 15 + arch/arm64/kernel/smp_spin_table.c | 1 + block/blk-flush.c | 15 +- block/blk-mq-tag.c | 2 +- block/blk-mq-tag.h | 12 + block/blk-mq.c | 16 +- block/blk.h | 6 + crypto/algif_skcipher.c | 14 +- drivers/Kconfig | 5 + drivers/Makefile | 6 + drivers/base/platform.c | 11 +- drivers/block/zram/Kconfig | 10 +- drivers/block/zram/zcomp.c | 301 +- drivers/block/zram/zcomp.h | 17 +- drivers/block/zram/zcomp_lz4.c | 16 +- drivers/block/zram/zcomp_lzo.c | 16 +- drivers/block/zram/zram_drv.c | 1218 +- drivers/block/zram/zram_drv.h | 12 +- drivers/char/diag/diag_masks.c | 20 + drivers/char/diag/diag_usb.c | 18 +- drivers/char/diag/diag_usb.h | 1 + drivers/char/diag/diagfwd.c | 7 +- drivers/clk/msm/clock-debug.c | 3 +- drivers/cpufreq/cpufreq_interactive.c | 15 + drivers/fingerprint/Kconfig | 7 + drivers/fingerprint/Makefile | 2 + drivers/fingerprint/fpc/Kconfig | 5 + drivers/fingerprint/fpc/Makefile | 1 + drivers/fingerprint/fpc/fpc1020_tee.c | 715 + drivers/fingerprint/goodix/Kconfig | 5 + drivers/fingerprint/goodix/Makefile | 1 + drivers/fingerprint/goodix/gf_spi.c | 925 + drivers/fingerprint/goodix/gf_spi.h | 108 + drivers/fingerprint/goodix/netlink.c | 97 + drivers/fingerprint/goodix/platform.c | 198 + drivers/fingerprintrosy/Kconfig | 8 + drivers/fingerprintrosy/Makefile | 3 + drivers/fingerprintrosy/fpcrosy/Kconfig | 6 + drivers/fingerprintrosy/fpcrosy/Makefile | 1 + drivers/fingerprintrosy/fpcrosy/fpc1020_tee.c | 647 + drivers/fingerprintrosy/goodixrosy/Kconfig | 5 + drivers/fingerprintrosy/goodixrosy/Makefile | 1 + drivers/fingerprintrosy/goodixrosy/gf_spi.c | 940 + drivers/fingerprintrosy/goodixrosy/gf_spi.h | 158 + drivers/fingerprintrosy/goodixrosy/netlink.c | 97 + drivers/fingerprintrosy/goodixrosy/platform.c | 113 + drivers/gpio/gpiolib.c | 8 - drivers/gpu/drm/nouveau/nouveau_usif.c | 7 +- drivers/gpu/msm/adreno_dispatch.c | 8 +- drivers/gpu/msm/kgsl.c | 2 +- drivers/hwmon/qpnp-adc-common.c | 114 + drivers/input/Makefile | 1 + drivers/input/misc/keychord.c | 4 +- drivers/input/radio_freq_up.c | 292 + drivers/input/touchscreen/FT5346/Kconfig | 5 + drivers/input/touchscreen/FT5346/Makefile | 3 + .../FT5346/focaltech_global/Makefile | 6 + .../focaltech_global/focaltech_global.h | 19 + .../focaltech_global/focaltech_ic_table.c | 531 + .../focaltech_global/focaltech_ic_table.h | 114 + .../FT5346/focaltech_test/Makefile | 9 + .../focaltech_test/focaltech_test_config.h | 35 + .../include/focaltech_test_detail_threshold.h | 142 + .../include/focaltech_test_ini.h | 66 + .../include/focaltech_test_main.h | 239 + .../include/focaltech_test_supported_ic.h | 1543 ++ .../FT5346/focaltech_test/src/Makefile | 12 + .../focaltech_test/src/focaltech_test.c | 534 + .../src/focaltech_test_detail_threshold.c | 2144 ++ .../src/focaltech_test_global.c | 535 + .../focaltech_test/src/focaltech_test_ini.c | 432 + .../focaltech_test/src/focaltech_test_main.c | 253 + .../focaltech_test/supported_ic/Makefile | 10 + .../focaltech_test_config_ft5x46.c | 524 + .../supported_ic/focaltech_test_ft5x46.c | 2327 ++ .../focaltech_test_supported_ic.c | 270 + drivers/input/touchscreen/FT5346/ft5346.c | 3296 +++ .../touchscreen/FT5346/ft_app_ic_ds_ebbg.txt | 3093 +++ .../FT5346/ft_app_ic_ds_ebbg_ili.txt | 3093 +++ .../FT5346/ft_app_ic_lens_tianma.txt | 2713 +++ .../FT5346/ft_app_ic_oufei_ebbg.txt | 2820 +++ .../FT5346/ft_app_ic_oufei_ebbg_ili.txt | 3091 +++ .../FT5346/ft_app_ic_oufei_ebbg_nt.txt | 3091 +++ .../FT5346/ft_app_ic_oufei_tianma.txt | 3093 +++ drivers/input/touchscreen/FT8006m/Kconfig | 17 + drivers/input/touchscreen/FT8006m/Makefile | 18 + .../touchscreen/FT8006m/focaltech_common.h | 222 + .../touchscreen/FT8006m/focaltech_config.h | 268 + .../touchscreen/FT8006m/focaltech_core.c | 1715 ++ .../touchscreen/FT8006m/focaltech_core.h | 212 + .../touchscreen/FT8006m/focaltech_esdcheck.c | 458 + .../touchscreen/FT8006m/focaltech_ex_fun.c | 1236 + .../touchscreen/FT8006m/focaltech_ex_mode.c | 347 + .../touchscreen/FT8006m/focaltech_flash.c | 808 + .../touchscreen/FT8006m/focaltech_flash.h | 131 + .../FT8006m/focaltech_flash/Makefile | 10 + .../focaltech_upgrade_common.h | 57 + .../focaltech_upgrade_ft8006.c | 1348 ++ .../focaltech_flash/focaltech_upgrade_idc.c | 575 + .../focaltech_flash/focaltech_upgrade_test.c | 167 + .../touchscreen/FT8006m/focaltech_gesture.c | 683 + .../input/touchscreen/FT8006m/focaltech_i2c.c | 217 + .../FT8006m/focaltech_point_report_check.c | 150 + .../touchscreen/FT8006m/focaltech_sensor.c | 314 + .../FT8006m/focaltech_test/Makefile | 10 + .../focaltech_test/focaltech_test_config.h | 63 + .../include/focaltech_ic_table.h | 115 + .../include/focaltech_test_detail_threshold.h | 131 + .../include/focaltech_test_ini.h | 66 + .../include/focaltech_test_main.h | 240 + .../include/focaltech_test_supported_ic.h | 1576 ++ .../FT8006m/focaltech_test/src/Makefile | 12 + .../focaltech_test/src/focaltech_ic_table.c | 532 + .../focaltech_test/src/focaltech_test.c | 812 + .../src/focaltech_test_detail_threshold.c | 1812 ++ .../src/focaltech_test_global.c | 498 + .../focaltech_test/src/focaltech_test_ini.c | 433 + .../focaltech_test/src/focaltech_test_main.c | 253 + .../focaltech_test/supported_ic/Makefile | 9 + .../focaltech_test_config_ft8006.c | 430 + .../supported_ic/focaltech_test_ft8006.c | 2101 ++ .../focaltech_test_supported_ic.c | 268 + .../include/firmware/FT8006m_app_sample.i | 5329 +++++ .../FT8006m/include/firmware/black_all.i | 7029 ++++++ .../FT8006m/include/firmware/white_all.i | 7029 ++++++ .../pramboot/FT8716_Pramboot_V0.5_20160723.i | 246 + drivers/input/touchscreen/FT8716/Kconfig | 16 + drivers/input/touchscreen/FT8716/Makefile | 18 + .../touchscreen/FT8716/focaltech_common.h | 221 + .../touchscreen/FT8716/focaltech_config.h | 261 + .../input/touchscreen/FT8716/focaltech_core.c | 1723 ++ .../input/touchscreen/FT8716/focaltech_core.h | 212 + .../touchscreen/FT8716/focaltech_esdcheck.c | 466 + .../touchscreen/FT8716/focaltech_ex_fun.c | 1230 + .../touchscreen/FT8716/focaltech_ex_mode.c | 347 + .../touchscreen/FT8716/focaltech_flash.c | 723 + .../touchscreen/FT8716/focaltech_flash.h | 131 + .../FT8716/focaltech_flash/Makefile | 10 + .../focaltech_upgrade_common.h | 57 + .../focaltech_upgrade_ft8716.c | 497 + .../focaltech_flash/focaltech_upgrade_idc.c | 575 + .../focaltech_flash/focaltech_upgrade_test.c | 167 + .../touchscreen/FT8716/focaltech_gesture.c | 683 + .../input/touchscreen/FT8716/focaltech_i2c.c | 206 + .../FT8716/focaltech_point_report_check.c | 150 + .../touchscreen/FT8716/focaltech_sensor.c | 314 + .../FT8716/focaltech_test/Makefile | 10 + .../focaltech_test/focaltech_test_config.h | 63 + .../include/focaltech_ic_table.h | 115 + .../include/focaltech_test_detail_threshold.h | 131 + .../include/focaltech_test_ini.h | 66 + .../include/focaltech_test_main.h | 240 + .../include/focaltech_test_supported_ic.h | 1589 ++ .../FT8716/focaltech_test/src/Makefile | 12 + .../focaltech_test/src/focaltech_ic_table.c | 534 + .../focaltech_test/src/focaltech_test.c | 902 + .../src/focaltech_test_detail_threshold.c | 1812 ++ .../src/focaltech_test_global.c | 499 + .../focaltech_test/src/focaltech_test_ini.c | 433 + .../focaltech_test/src/focaltech_test_main.c | 252 + .../focaltech_test/supported_ic/Makefile | 9 + .../focaltech_test_config_ft8716.c | 360 + .../supported_ic/focaltech_test_ft8716.c | 1450 ++ .../focaltech_test_supported_ic.c | 268 + .../include/firmware/FT8716_app_csot_sample.i | 3694 +++ .../include/firmware/FT8716_app_ebbg_sample.i | 3700 +++ .../pramboot/FT8716_Pramboot_V0.5_20160723.i | 246 + drivers/input/touchscreen/GT915L/FW_BIEL.txt | 11265 +++++++++ drivers/input/touchscreen/GT915L/FW_EACH.txt | 11265 +++++++++ drivers/input/touchscreen/GT915L/Kconfig | 5 + drivers/input/touchscreen/GT915L/Makefile | 4 + .../input/touchscreen/GT915L/goodix_tool.c | 736 + drivers/input/touchscreen/GT915L/gt9xx.c | 3495 +++ drivers/input/touchscreen/GT915L/gt9xx.h | 370 + .../input/touchscreen/GT915L/gt9xx_firmware.h | 43 + .../input/touchscreen/GT915L/gt9xx_update.c | 3251 +++ drivers/input/touchscreen/GT917D/FW_BIEL.txt | 5633 +++++ drivers/input/touchscreen/GT917D/FW_EACH.txt | 11265 +++++++++ drivers/input/touchscreen/GT917D/Kconfig | 5 + drivers/input/touchscreen/GT917D/Makefile | 4 + .../input/touchscreen/GT917D/goodix_tool.c | 707 + drivers/input/touchscreen/GT917D/gt917.c | 3570 +++ drivers/input/touchscreen/GT917D/gt9xx.h | 349 + .../input/touchscreen/GT917D/gt9xx_firmware.h | 42 + .../input/touchscreen/GT917D/gt9xx_update.c | 3251 +++ drivers/input/touchscreen/Kconfig | 30 + drivers/input/touchscreen/Makefile | 7 + drivers/input/touchscreen/ft5336/Kconfig | 5 + drivers/input/touchscreen/ft5336/Makefile | 3 + .../ft5336/focal_mcap_test_lib64.a_shipped | Bin 0 -> 71588 bytes .../input/touchscreen/ft5336/ft5x06_720p.c | 2996 +++ .../touchscreen/ft5336/ft5x06_test_lib.h | 24 + .../ft5336/ft_app_ic_biel_boe_720p.txt | 1807 ++ .../ft5336/ft_app_ic_biel_ebbg_720p.txt | 1810 ++ .../ft5336/ft_app_ic_lens_tianma_720p.txt | 1806 ++ .../ft5336/ft_app_ic_oufei_boe_720p.txt | 1810 ++ .../ft5336/ft_app_ic_oufei_tianma_720p.txt | 1806 ++ drivers/input/touchscreen/gen_vkeys.c | 2 +- drivers/input/touchscreen/gen_vkeys_gt.c | 229 + drivers/input/touchscreen/synaptics_rmi_dev.c | 10 +- drivers/irqchip/msm_show_resume_irq.c | 2 +- drivers/leds/Kconfig | 16 + drivers/leds/Makefile | 6 +- drivers/leds/gpio_vib.c | 224 + drivers/leds/led-triggers.c | 21 + drivers/leds/leds-aw2013.c | 1146 +- drivers/leds/leds-gpio.c | 396 +- drivers/leds/leds-msm-gpio-flash.c | 325 + drivers/leds/leds-qpnp-flash.c | 29 + drivers/leds/leds-qpnp-wled.c | 8 +- drivers/md/dm-verity-target.c | 2 +- .../msm/camera_v2/pproc/cpp/msm_cpp.c | 138 + .../camera_v2/sensor/actuator/msm_actuator.c | 65 +- .../msm/camera_v2/sensor/cci/msm_cci.c | 9 +- .../msm/camera_v2/sensor/eeprom/Makefile | 1 + .../msm/camera_v2/sensor/eeprom/msm_eeprom.c | 404 +- .../msm/camera_v2/sensor/eeprom/msm_eeprom.h | 4 + .../eeprom/msm_eeprom_insensor_ov13850.c | 62 + .../sensor/eeprom/msm_eeprom_otp_interface.h | 90 + .../msm/camera_v2/sensor/flash/msm_flash.c | 108 +- .../msm/camera_v2/sensor/msm_sensor_driver.c | 361 +- drivers/media/radio/radio-iris-transport.c | 4 + drivers/media/radio/radio-iris.c | 42 +- drivers/media/v4l2-core/v4l2-compat-ioctl32.c | 627 +- drivers/mfd/wcd9xxx-core.c | 8 +- drivers/misc/Makefile | 1 + drivers/misc/hardware_info.c | 331 + drivers/mmc/Kconfig | 8 + drivers/mmc/card/block.c | 84 +- drivers/mmc/card/queue.c | 20 +- drivers/mmc/core/bus.c | 14 + drivers/mmc/core/core.c | 37 +- drivers/mmc/core/core.h | 2 + drivers/mmc/core/debugfs.c | 38 +- drivers/mmc/core/mmc.c | 62 +- drivers/mmc/core/sd.c | 17 +- drivers/mmc/core/sdio.c | 12 +- drivers/mmc/host/cmdq_hci.c | 11 +- drivers/mmc/host/sdhci.c | 4 +- drivers/net/ethernet/amd/xgbe/xgbe.h | 2 +- drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 2 +- drivers/net/ethernet/freescale/fec.h | 1 + drivers/net/ethernet/intel/e1000e/e1000.h | 2 +- drivers/net/ethernet/intel/igb/igb.h | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe.h | 2 +- drivers/net/ethernet/ti/cpts.h | 1 + drivers/of/fdt.c | 18 + drivers/of/of_batterydata.c | 59 +- drivers/platform/msm/qpnp-power-on.c | 121 + drivers/power/Kconfig | 64 + drivers/power/Makefile | 3 + drivers/power/bq2560x.h | 69 + drivers/power/bq2560x_charger.c | 2466 ++ drivers/power/bq2560x_reg.h | 307 + drivers/power/bq27426_fg.c | 2290 ++ drivers/power/bq27426_gmfs.h | 946 + drivers/power/bq27426_gmfs_atl.h | 822 + drivers/power/bq27426_gmfs_default.h | 946 + drivers/power/bq27426_gmfs_desay.h | 822 + drivers/power/bq27426_gmfs_scud.h | 822 + drivers/power/bq27426_gmfs_sunwoda.h | 822 + drivers/power/bqfs_cmd_type.h | 42 + drivers/power/cw2015_battery.c | 1300 ++ drivers/power/pmic-voter.c | 2 +- drivers/power/power_supply_core.c | 85 + drivers/power/power_supply_sysfs.c | 3 + .../power/profile_WT1001_88509_NT_Feimaotui.h | 64 + drivers/power/profile_WT702_88509_NT_DeSai.h | 64 + .../power/profile_WT801_88509_NT_XinWangDa.h | 64 + .../power/profile_WT902_88509_NT_GuangYu.h | 64 + drivers/power/qpnp-fg.c | 265 +- drivers/power/qpnp-smbcharger.c | 467 +- drivers/power/reset/msm-poweroff.c | 60 +- drivers/power/smb358-charger.c | 1241 +- drivers/regulator/Kconfig | 14 + drivers/regulator/Makefile | 1 + drivers/regulator/tps65132-regulator.c | 628 + drivers/scsi/sg.c | 37 +- drivers/soc/qcom/Kconfig | 15 + drivers/soc/qcom/Makefile | 3 + drivers/soc/qcom/cpumaxfreq.c | 60 + drivers/soc/qcom/secboot_fuse.c | 121 + drivers/soc/qcom/serial_num.c | 121 + drivers/soc/qcom/subsystem_restart.c | 138 +- drivers/soc/qcom/watchdog_v2.c | 22 + drivers/spi/spidev.c | 74 +- drivers/staging/Kconfig | 4 + drivers/staging/Makefile | 3 + drivers/staging/android/Kconfig | 28 + drivers/staging/android/Makefile | 4 +- drivers/staging/android/ashmem.c | 3 + drivers/staging/android/binder.c | 4996 ++-- drivers/staging/android/binder_alloc.c | 1012 + drivers/staging/android/binder_alloc.h | 185 + .../staging/android/binder_alloc_selftest.c | 310 + drivers/staging/android/binder_trace.h | 120 +- drivers/staging/android/ion/ion.c | 2 +- drivers/staging/android/ion/ion_system_heap.c | 2 +- drivers/staging/android/lowmemorykiller.c | 476 +- drivers/staging/android/memsw_state.c | 306 + drivers/staging/android/memsw_state.h | 45 + drivers/staging/android/uapi/binder.h | 169 +- drivers/staging/ktrace/Kconfig | 6 + drivers/staging/ktrace/Makefile | 3 + drivers/staging/ktrace/ktrace_binder.c | 216 + drivers/staging/ktrace/ktrace_cpufreq.c | 316 + drivers/staging/ktrace/ktrace_event.c | 133 + drivers/staging/ktrace/ktrace_main.c | 52 + drivers/staging/ktrace/ktrace_mm.c | 284 + drivers/staging/ktrace/ktrace_print.c | 109 + drivers/staging/ktrace/ktrace_queue.c | 238 + drivers/staging/ktrace/ktrace_sched.c | 568 + drivers/staging/rtmm/Kconfig | 5 + drivers/staging/rtmm/Makefile | 1 + drivers/staging/rtmm/rtmm_main.c | 37 + drivers/staging/rtmm/rtmm_pool.c | 402 + drivers/staging/rtmm/rtmm_reclaim.c | 609 + drivers/usb/dwc3/dwc3-msm.c | 91 +- drivers/usb/dwc3/gadget.c | 14 +- drivers/usb/gadget/android.c | 7 + drivers/usb/gadget/ci13xxx_msm.c | 7 + drivers/usb/gadget/ci13xxx_udc.c | 7 +- drivers/usb/gadget/composite.c | 8 +- drivers/usb/gadget/function/f_mtp.c | 10 + drivers/usb/phy/phy-msm-usb.c | 60 +- drivers/video/fbdev/core/fbmem.c | 15 +- drivers/video/msm/mdss/mdss_dsi.c | 247 +- drivers/video/msm/mdss/mdss_dsi.h | 37 + drivers/video/msm/mdss/mdss_dsi_host.c | 17 +- drivers/video/msm/mdss/mdss_dsi_panel.c | 236 +- drivers/video/msm/mdss/mdss_dsi_status.c | 2 +- drivers/video/msm/mdss/mdss_fb.c | 215 +- drivers/video/msm/mdss/mdss_fb.h | 4 + drivers/video/msm/mdss/mdss_mdp_overlay.c | 1 + drivers/video/msm/mdss/mdss_panel.h | 4 + drivers/video/msm/mdss/mdss_rotator.c | 4 +- fs/attr.c | 12 +- fs/coredump.c | 2 +- fs/ecryptfs/keystore.c | 11 +- fs/exec.c | 2 +- fs/inode.c | 6 +- fs/internal.h | 4 +- fs/namei.c | 179 +- fs/namespace.c | 32 +- fs/notify/fanotify/fanotify_user.c | 2 +- fs/notify/inotify/inotify_user.c | 4 +- fs/open.c | 37 +- fs/pnode.c | 15 + fs/pnode.h | 1 + fs/proc/task_mmu.c | 18 +- fs/proc_namespace.c | 8 +- fs/pstore/Kconfig | 8 + fs/pstore/inode.c | 40 + fs/pstore/ram.c | 38 +- fs/sdcardfs/dentry.c | 70 +- fs/sdcardfs/derived_perm.c | 402 +- fs/sdcardfs/file.c | 114 +- fs/sdcardfs/inode.c | 423 +- fs/sdcardfs/lookup.c | 230 +- fs/sdcardfs/main.c | 207 +- fs/sdcardfs/mmap.c | 76 +- fs/sdcardfs/multiuser.h | 30 +- fs/sdcardfs/packagelist.c | 865 +- fs/sdcardfs/sdcardfs.h | 292 +- fs/sdcardfs/super.c | 138 +- fs/super.c | 28 +- fs/utimes.c | 4 +- include/clocksource/arm_arch_timer.h | 2 +- include/dt-bindings/input/input.h | 2 + include/linux/clocksource.h | 102 - include/linux/dcache.h | 8 +- include/linux/delay.h | 5 + include/linux/fb.h | 1 + include/linux/fs.h | 24 +- include/linux/hardware_info.h | 54 + include/linux/input/ft5346.h | 348 + include/linux/input/ft5x06_720p.h | 334 + include/linux/input/gen_vkeys_gt.h | 24 + include/linux/ktrace.h | 287 + include/linux/mdss_io_util.h | 2 + include/linux/mlx4/device.h | 2 +- include/linux/mm.h | 3 + include/linux/mm_types.h | 2 + include/linux/mmc/card.h | 2 + include/linux/mmc/host.h | 5 +- include/linux/mmc/mmc.h | 2 + include/linux/mount.h | 1 + include/linux/namei.h | 1 + include/linux/of_fdt.h | 2 + include/linux/pagemap.h | 5 - include/linux/pid.h | 4 +- include/linux/power/cw2015_battery.h | 55 + include/linux/power_supply.h | 4 + include/linux/qpnp/power-on.h | 7 + include/linux/rtmm.h | 31 + include/linux/sched.h | 21 +- include/linux/timecounter.h | 122 + include/linux/types.h | 3 + include/linux/usb/msm_hsusb.h | 6 +- include/linux/zpool.h | 15 +- include/linux/zsmalloc.h | 10 +- include/scsi/fc/Kbuild | 0 include/sound/rawmidi.h | 1 + include/uapi/linux/input.h | 5 + include/uapi/linux/msm_mdp.h | 5 + ipc/mqueue.c | 10 +- kernel/bpf/verifier.c | 21 +- kernel/cpu.c | 5 + kernel/cpuset.c | 55 +- kernel/events/core.c | 61 +- kernel/fork.c | 60 +- kernel/pid.c | 11 +- kernel/power/Kconfig | 10 + kernel/power/suspend.c | 2 + kernel/sched/qhmp_core.c | 25 + kernel/sched/qhmp_fair.c | 7 + kernel/sched/sched_avg.c | 2 +- kernel/time/Makefile | 2 +- kernel/time/alarmtimer.c | 25 + kernel/time/clocksource.c | 76 - kernel/time/timecounter.c | 95 + lib/Kconfig.debug | 15 + mm/mempolicy.c | 20 +- mm/migrate.c | 11 +- mm/page_alloc.c | 28 +- mm/vmscan.c | 46 + mm/zpool.c | 102 +- mm/zsmalloc.c | 507 +- net/bluetooth/bnep/core.c | 3 + net/core/iovec.c | 4 + net/dccp/ipv6.c | 6 + net/ipc_router/ipc_router_core.c | 2 +- net/ipv4/tcp.c | 6 + net/ipv4/tcp_ipv4.c | 8 + net/ipv6/ip6_gre.c | 40 +- net/ipv6/tcp_ipv6.c | 3 +- net/ipx/af_ipx.c | 5 +- net/rmnet_data/rmnet_data_handlers.c | 1 + net/wireless/nl80211.c | 3 +- net/xfrm/xfrm_policy.c | 6 + security/commoncap.c | 9 +- security/inode.c | 2 +- sound/core/pcm.c | 4 +- sound/core/rawmidi.c | 44 +- sound/core/seq/seq_clientmgr.c | 14 +- sound/core/seq/seq_ports.c | 10 +- sound/core/timer.c | 224 +- sound/pci/hda/hda_priv.h | 2 +- sound/soc/codecs/msm8x16-wcd.c | 67 +- sound/soc/codecs/wcd-mbhc-v2.c | 123 +- sound/soc/codecs/wcd-mbhc-v2.h | 1 + sound/soc/msm/AW87319_Audio_M.c | 454 + sound/soc/msm/Kconfig | 3 + sound/soc/msm/Makefile | 3 + sound/soc/msm/msm8952.c | 410 +- sound/soc/msm/qdsp6v2/q6asm.c | 20 +- sound/soc/msm/qdsp6v2/rtac.c | 32 + sound/usb/endpoint.c | 7 +- .../powerpc/copyloops/asm/processor.h | 0 .../powerpc/primitives/asm/ppc-opcode.h | 0 tools/virtio/linux/hrtimer.h | 0 548 files changed, 251153 insertions(+), 5880 deletions(-) create mode 100644 arch/arm/boot/dts/qcom/batterydata-D1_Default-4v4-3300mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-Scud-4v4-3300mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-Sunwoda-4v4-3300mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-qrd-Atl-4v4-4100mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-qrd-Coslight-4v4-4100mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-qrd-Default-4v4-4100mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-qrd-Desay-4v4-4100mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-wingtech-desai_SAMSUNG-4v4-4000mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-3030mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-4000mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-wingtech-guangyu_Coslight-4v4-4000mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-3030mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-4000mah.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-ft8006m-boe-5p7-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-ft8613-csot-5p7-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3a-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3b-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3a-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3b-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-c3b-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-ili9881c-tianma-c3b-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/dsi-panel-nt35521s-ebbg-c3a-720p-video.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88503.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88505.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dts create mode 100644 arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dts create mode 100644 arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8917-qrd_S88503.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8917-qrd_S88505.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8937-camera-sensor-qrd-wt88536.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8937-pmi8950-qrd-sku1_S88536AA2.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8940-pmi8950-qrd-sku7_S88536AA2.dts create mode 100644 arch/arm/boot/dts/qcom/msm8953-audio_rosy.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd_rosy.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8953-mtp_rosy.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8953-pinctrl_rosy.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8953-qrd-sku3_rosy.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8953-qrd_rosy.dtsi create mode 100644 arch/arm/boot/dts/qcom/msm8953_rosy.dtsi create mode 100644 arch/arm/boot/dts/qcom/sdm450-qrd_rosy.dts create mode 100644 arch/arm/boot/dts/qcom/sdm450_rosy.dtsi delete mode 100644 arch/arm/mach-nspire/Makefile.boot create mode 100644 arch/arm64/configs/S88503AC1-perf_defconfig create mode 100644 arch/arm64/configs/S88505AA1-perf_defconfig create mode 100644 arch/arm64/configs/S88536AA2-perf_defconfig create mode 100644 arch/arm64/configs/S88536AA2_defconfig create mode 100644 arch/arm64/configs/rosy-perf_defconfig create mode 100644 arch/arm64/include/asm/bootinfo.h create mode 100644 arch/arm64/kernel/bootinfo.c create mode 100755 drivers/fingerprint/Kconfig create mode 100755 drivers/fingerprint/Makefile create mode 100755 drivers/fingerprint/fpc/Kconfig create mode 100755 drivers/fingerprint/fpc/Makefile create mode 100644 drivers/fingerprint/fpc/fpc1020_tee.c create mode 100755 drivers/fingerprint/goodix/Kconfig create mode 100755 drivers/fingerprint/goodix/Makefile create mode 100755 drivers/fingerprint/goodix/gf_spi.c create mode 100755 drivers/fingerprint/goodix/gf_spi.h create mode 100755 drivers/fingerprint/goodix/netlink.c create mode 100755 drivers/fingerprint/goodix/platform.c create mode 100755 drivers/fingerprintrosy/Kconfig create mode 100755 drivers/fingerprintrosy/Makefile create mode 100755 drivers/fingerprintrosy/fpcrosy/Kconfig create mode 100755 drivers/fingerprintrosy/fpcrosy/Makefile create mode 100644 drivers/fingerprintrosy/fpcrosy/fpc1020_tee.c create mode 100755 drivers/fingerprintrosy/goodixrosy/Kconfig create mode 100755 drivers/fingerprintrosy/goodixrosy/Makefile create mode 100644 drivers/fingerprintrosy/goodixrosy/gf_spi.c create mode 100644 drivers/fingerprintrosy/goodixrosy/gf_spi.h create mode 100644 drivers/fingerprintrosy/goodixrosy/netlink.c create mode 100644 drivers/fingerprintrosy/goodixrosy/platform.c create mode 100644 drivers/input/radio_freq_up.c create mode 100644 drivers/input/touchscreen/FT5346/Kconfig create mode 100644 drivers/input/touchscreen/FT5346/Makefile create mode 100644 drivers/input/touchscreen/FT5346/focaltech_global/Makefile create mode 100644 drivers/input/touchscreen/FT5346/focaltech_global/focaltech_global.h create mode 100644 drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.c create mode 100644 drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.h create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/Makefile create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/focaltech_test_config.h create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_detail_threshold.h create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_ini.h create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_main.h create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_supported_ic.h create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/src/Makefile create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test.c create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_detail_threshold.c create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_global.c create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_ini.c create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_main.c create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/Makefile create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_config_ft5x46.c create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_ft5x46.c create mode 100644 drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_supported_ic.c create mode 100644 drivers/input/touchscreen/FT5346/ft5346.c create mode 100644 drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg.txt create mode 100644 drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg_ili.txt create mode 100644 drivers/input/touchscreen/FT5346/ft_app_ic_lens_tianma.txt create mode 100644 drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg.txt create mode 100644 drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_ili.txt create mode 100644 drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_nt.txt create mode 100644 drivers/input/touchscreen/FT5346/ft_app_ic_oufei_tianma.txt create mode 100755 drivers/input/touchscreen/FT8006m/Kconfig create mode 100755 drivers/input/touchscreen/FT8006m/Makefile create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_common.h create mode 100644 drivers/input/touchscreen/FT8006m/focaltech_config.h create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_core.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_core.h create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_esdcheck.c create mode 100644 drivers/input/touchscreen/FT8006m/focaltech_ex_fun.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_ex_mode.c create mode 100644 drivers/input/touchscreen/FT8006m/focaltech_flash.c create mode 100644 drivers/input/touchscreen/FT8006m/focaltech_flash.h create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_flash/Makefile create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_common.h create mode 100644 drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_ft8006.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_idc.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_test.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_gesture.c create mode 100644 drivers/input/touchscreen/FT8006m/focaltech_i2c.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_point_report_check.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_sensor.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/Makefile create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/focaltech_test_config.h create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_ic_table.h create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_detail_threshold.h create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_ini.h create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_main.h create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_supported_ic.h create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/src/Makefile create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_ic_table.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_detail_threshold.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_global.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_ini.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_main.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/Makefile create mode 100644 drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_config_ft8006.c create mode 100644 drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_ft8006.c create mode 100755 drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_supported_ic.c create mode 100644 drivers/input/touchscreen/FT8006m/include/firmware/FT8006m_app_sample.i create mode 100644 drivers/input/touchscreen/FT8006m/include/firmware/black_all.i create mode 100644 drivers/input/touchscreen/FT8006m/include/firmware/white_all.i create mode 100755 drivers/input/touchscreen/FT8006m/include/pramboot/FT8716_Pramboot_V0.5_20160723.i create mode 100755 drivers/input/touchscreen/FT8716/Kconfig create mode 100755 drivers/input/touchscreen/FT8716/Makefile create mode 100755 drivers/input/touchscreen/FT8716/focaltech_common.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_config.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_core.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_core.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_esdcheck.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_ex_fun.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_ex_mode.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_flash.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_flash.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_flash/Makefile create mode 100755 drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_common.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_ft8716.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_idc.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_test.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_gesture.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_i2c.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_point_report_check.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_sensor.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/Makefile create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/focaltech_test_config.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_ic_table.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_detail_threshold.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_ini.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_main.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_supported_ic.h create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/src/Makefile create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_ic_table.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_detail_threshold.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_global.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_ini.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_main.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/Makefile create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_config_ft8716.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_ft8716.c create mode 100755 drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_supported_ic.c create mode 100644 drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_csot_sample.i create mode 100644 drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_ebbg_sample.i create mode 100755 drivers/input/touchscreen/FT8716/include/pramboot/FT8716_Pramboot_V0.5_20160723.i create mode 100644 drivers/input/touchscreen/GT915L/FW_BIEL.txt create mode 100644 drivers/input/touchscreen/GT915L/FW_EACH.txt create mode 100644 drivers/input/touchscreen/GT915L/Kconfig create mode 100644 drivers/input/touchscreen/GT915L/Makefile create mode 100644 drivers/input/touchscreen/GT915L/goodix_tool.c create mode 100644 drivers/input/touchscreen/GT915L/gt9xx.c create mode 100644 drivers/input/touchscreen/GT915L/gt9xx.h create mode 100644 drivers/input/touchscreen/GT915L/gt9xx_firmware.h create mode 100644 drivers/input/touchscreen/GT915L/gt9xx_update.c create mode 100644 drivers/input/touchscreen/GT917D/FW_BIEL.txt create mode 100644 drivers/input/touchscreen/GT917D/FW_EACH.txt create mode 100644 drivers/input/touchscreen/GT917D/Kconfig create mode 100644 drivers/input/touchscreen/GT917D/Makefile create mode 100644 drivers/input/touchscreen/GT917D/goodix_tool.c create mode 100644 drivers/input/touchscreen/GT917D/gt917.c create mode 100644 drivers/input/touchscreen/GT917D/gt9xx.h create mode 100644 drivers/input/touchscreen/GT917D/gt9xx_firmware.h create mode 100644 drivers/input/touchscreen/GT917D/gt9xx_update.c create mode 100644 drivers/input/touchscreen/ft5336/Kconfig create mode 100644 drivers/input/touchscreen/ft5336/Makefile create mode 100644 drivers/input/touchscreen/ft5336/focal_mcap_test_lib64.a_shipped create mode 100644 drivers/input/touchscreen/ft5336/ft5x06_720p.c create mode 100755 drivers/input/touchscreen/ft5336/ft5x06_test_lib.h create mode 100644 drivers/input/touchscreen/ft5336/ft_app_ic_biel_boe_720p.txt create mode 100644 drivers/input/touchscreen/ft5336/ft_app_ic_biel_ebbg_720p.txt create mode 100644 drivers/input/touchscreen/ft5336/ft_app_ic_lens_tianma_720p.txt create mode 100644 drivers/input/touchscreen/ft5336/ft_app_ic_oufei_boe_720p.txt create mode 100644 drivers/input/touchscreen/ft5336/ft_app_ic_oufei_tianma_720p.txt create mode 100644 drivers/input/touchscreen/gen_vkeys_gt.c create mode 100644 drivers/leds/gpio_vib.c create mode 100644 drivers/leds/leds-msm-gpio-flash.c create mode 100644 drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_insensor_ov13850.c create mode 100644 drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_otp_interface.h mode change 100755 => 100644 drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c create mode 100755 drivers/misc/hardware_info.c create mode 100644 drivers/power/bq2560x.h create mode 100644 drivers/power/bq2560x_charger.c create mode 100644 drivers/power/bq2560x_reg.h create mode 100644 drivers/power/bq27426_fg.c create mode 100644 drivers/power/bq27426_gmfs.h create mode 100644 drivers/power/bq27426_gmfs_atl.h create mode 100644 drivers/power/bq27426_gmfs_default.h create mode 100644 drivers/power/bq27426_gmfs_desay.h create mode 100644 drivers/power/bq27426_gmfs_scud.h create mode 100644 drivers/power/bq27426_gmfs_sunwoda.h create mode 100644 drivers/power/bqfs_cmd_type.h create mode 100644 drivers/power/cw2015_battery.c create mode 100644 drivers/power/profile_WT1001_88509_NT_Feimaotui.h create mode 100644 drivers/power/profile_WT702_88509_NT_DeSai.h create mode 100644 drivers/power/profile_WT801_88509_NT_XinWangDa.h create mode 100644 drivers/power/profile_WT902_88509_NT_GuangYu.h create mode 100644 drivers/regulator/tps65132-regulator.c create mode 100644 drivers/soc/qcom/cpumaxfreq.c create mode 100644 drivers/soc/qcom/secboot_fuse.c create mode 100644 drivers/soc/qcom/serial_num.c create mode 100644 drivers/staging/android/binder_alloc.c create mode 100644 drivers/staging/android/binder_alloc.h create mode 100644 drivers/staging/android/binder_alloc_selftest.c create mode 100644 drivers/staging/android/memsw_state.c create mode 100644 drivers/staging/android/memsw_state.h create mode 100644 drivers/staging/ktrace/Kconfig create mode 100644 drivers/staging/ktrace/Makefile create mode 100644 drivers/staging/ktrace/ktrace_binder.c create mode 100644 drivers/staging/ktrace/ktrace_cpufreq.c create mode 100644 drivers/staging/ktrace/ktrace_event.c create mode 100644 drivers/staging/ktrace/ktrace_main.c create mode 100644 drivers/staging/ktrace/ktrace_mm.c create mode 100644 drivers/staging/ktrace/ktrace_print.c create mode 100644 drivers/staging/ktrace/ktrace_queue.c create mode 100644 drivers/staging/ktrace/ktrace_sched.c create mode 100644 drivers/staging/rtmm/Kconfig create mode 100644 drivers/staging/rtmm/Makefile create mode 100644 drivers/staging/rtmm/rtmm_main.c create mode 100644 drivers/staging/rtmm/rtmm_pool.c create mode 100644 drivers/staging/rtmm/rtmm_reclaim.c create mode 100755 include/linux/hardware_info.h create mode 100644 include/linux/input/ft5346.h create mode 100644 include/linux/input/ft5x06_720p.h create mode 100644 include/linux/input/gen_vkeys_gt.h create mode 100644 include/linux/ktrace.h create mode 100644 include/linux/power/cw2015_battery.h create mode 100644 include/linux/rtmm.h create mode 100644 include/linux/timecounter.h delete mode 100644 include/scsi/fc/Kbuild create mode 100644 kernel/time/timecounter.c create mode 100644 sound/soc/msm/AW87319_Audio_M.c delete mode 100644 tools/testing/selftests/powerpc/copyloops/asm/processor.h delete mode 100644 tools/testing/selftests/powerpc/primitives/asm/ppc-opcode.h delete mode 100644 tools/virtio/linux/hrtimer.h diff --git a/AndroidKernel.mk b/AndroidKernel.mk index 3db9ac9f0bcb6..ae8176f420e55 100644 --- a/AndroidKernel.mk +++ b/AndroidKernel.mk @@ -32,6 +32,16 @@ ifeq ($(TARGET_ARCH),arm) KERNEL_CONFIG_OVERRIDE := CONFIG_ANDROID_BINDER_IPC_32BIT=y endif endif +ifeq ($(WT_FINAL_RELEASE),yes) +KERNEL_CONFIG_OVERRIDE += CONFIG_DYNAMIC_DEBUG=n +KERNEL_CONFIG_OVERRIDE += CONFIG_DEBUG_RODATA=n +KERNEL_CONFIG_OVERRIDE += CONFIG_DEBUG_SPINLOCK=n +KERNEL_CONFIG_OVERRIDE += CONFIG_MSM_DEBUG_LAR_UNLOCK=n +KERNEL_CONFIG_OVERRIDE += CONFIG_CORESIGHT_DBGUI=n +KERNEL_CONFIG_OVERRIDE += CONFIG_MSM_RTB=n +KERNEL_CONFIG_OVERRIDE += CONFIG_MSM_RTB_SEPARATE_CPUS=n +KERNEL_CONFIG_OVERRIDE += CONFIG_IKCONFIG=n +endif TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)) ifeq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) @@ -50,22 +60,22 @@ endif mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) current_dir := $(notdir $(patsubst %/,%,$(dir $(mkfile_path)))) ifeq ($(TARGET_KERNEL_VERSION),) - TARGET_KERNEL_VERSION := 3.18 + TARGET_KERNEL_VERSION := 3.18 endif TARGET_KERNEL := msm-$(TARGET_KERNEL_VERSION) ifeq ($(TARGET_KERNEL),$(current_dir)) - # New style, kernel/msm-version - BUILD_ROOT_LOC := ../../ - TARGET_KERNEL_SOURCE := kernel/$(TARGET_KERNEL) - KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/kernel/$(TARGET_KERNEL) - KERNEL_SYMLINK := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ - KERNEL_USR := $(KERNEL_SYMLINK)/usr + # New style, kernel/msm-version + BUILD_ROOT_LOC := ../../ + TARGET_KERNEL_SOURCE := kernel/$(TARGET_KERNEL) + KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/kernel/$(TARGET_KERNEL) + KERNEL_SYMLINK := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ + KERNEL_USR := $(KERNEL_SYMLINK)/usr else - # Legacy style, kernel source directly under kernel - KERNEL_LEGACY_DIR := true - BUILD_ROOT_LOC := ../ - TARGET_KERNEL_SOURCE := kernel - KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ + # Legacy style, kernel source directly under kernel + KERNEL_LEGACY_DIR := true + BUILD_ROOT_LOC := ../ + TARGET_KERNEL_SOURCE := kernel + KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ endif KERNEL_CONFIG := $(KERNEL_OUT)/.config @@ -127,7 +137,7 @@ $(KERNEL_CONFIG): $(KERNEL_OUT) $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG) $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ - echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ + for CONFIG_OVERRIDE in $(KERNEL_CONFIG_OVERRIDE);do echo $$CONFIG_OVERRIDE >> $(KERNEL_OUT)/.config;done; \ $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) oldconfig; fi $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_OUT) $(KERNEL_HEADERS_INSTALL) @@ -150,7 +160,7 @@ $(KERNEL_HEADERS_INSTALL): $(KERNEL_OUT) $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG); fi $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ - echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ + for CONFIG_OVERRIDE in $(KERNEL_CONFIG_OVERRIDE);do echo $$CONFIG_OVERRIDE >> $(KERNEL_OUT)/.config;done; \ $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) oldconfig; fi kerneltags: $(KERNEL_OUT) $(KERNEL_CONFIG) diff --git a/Makefile b/Makefile index b03ca98f7a366..d63eefa7fb3c4 100644 --- a/Makefile +++ b/Makefile @@ -694,6 +694,8 @@ else # Use make W=1 to enable this warning (see scripts/Makefile.build) KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable) endif +# transport MTK_CDEFS ( mtk compile macros ) to .c for compile +KBUILD_CFLAGS += $(MTK_CDEFS) ifdef CONFIG_FRAME_POINTER KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls @@ -779,6 +781,13 @@ ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC)), y) KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTO endif +ifeq ($(WT_COMPILE_FACTORY_VERSION),yes) + KBUILD_CFLAGS += -DWT_COMPILE_FACTORY_VERSION +endif +ifeq ($(WT_FINAL_RELEASE),yes) + KBUILD_CFLAGS += -DWT_FINAL_RELEASE +endif + include $(srctree)/scripts/Makefile.kasan include $(srctree)/scripts/Makefile.extrawarn include $(srctree)/scripts/Makefile.ubsan diff --git a/arch/arm/boot/dts/qcom/Makefile b/arch/arm/boot/dts/qcom/Makefile index ba89193640f2d..40af15110b1ba 100644 --- a/arch/arm/boot/dts/qcom/Makefile +++ b/arch/arm/boot/dts/qcom/Makefile @@ -186,7 +186,9 @@ dtb-$(CONFIG_ARCH_MSM8917) += msm8917-rumi.dtb \ msm8917-pmi8937-rcm.dtb \ msm8917-pmi8950-rcm.dtb \ msm8917-qgp-tmo.dtb \ - msm8917-pmi8937-qrd-sku5.dtb + msm8917-pmi8937-qrd-sku5.dtb \ + msm8917-pmi8937-qrd-sku5_S88503.dtb \ + msm8917-pmi8937-qrd-sku5_S88505.dtb dtb-$(CONFIG_ARCH_MSM8920) += msm8920-pmi8937-cdp.dtb \ msm8920-pmi8937-mtp.dtb \ @@ -208,7 +210,8 @@ dtb-$(CONFIG_ARCH_MSM8940) += msm8940-pmi8937-cdp.dtb \ msm8940-pmi8940-mtp.dtb \ msm8940-pmi8940-cdp.dtb \ msm8940-pmi8940-rcm.dtb \ - msm8940-pmi8940-qrd-sku7.dtb + msm8940-pmi8940-qrd-sku7.dtb \ + msm8940-pmi8950-qrd-sku7_S88536AA2.dtb dtb-$(CONFIG_ARCH_MSM8953) += msm8953-sim.dtb \ msm8953-rumi.dtb \ @@ -236,7 +239,9 @@ dtb-$(CONFIG_ARCH_SDM450) += sdm450-rcm.dtb \ sdm450-mtp.dtb \ sdm450-qrd.dtb \ sdm450-pmi8940-mtp.dtb \ - sdm450-pmi8937-mtp.dtb + sdm450-pmi8937-mtp.dtb \ + sdm450-qrd_rosy.dtb + dtb-$(CONFIG_ARCH_MDM9607) += mdm9607-rumi.dtb \ mdm9607-cdp.dtb \ @@ -245,9 +250,9 @@ dtb-$(CONFIG_ARCH_MDM9607) += mdm9607-rumi.dtb \ mdm9607-mtp-sdcard.dtb dtb-$(CONFIG_ARCH_MSM8916) += msm8952-qrd-skum.dtb \ - msm8952-cdp.dtb \ - msm8952-ext-codec-cdp.dtb \ - msm8952-mtp.dtb + msm8952-cdp.dtb \ + msm8952-ext-codec-cdp.dtb \ + msm8952-mtp.dtb dtb-$(CONFIG_ARCH_MSM8909) += msm8909-pm8916-mtp.dtb \ msm8909w-wtp.dtb \ @@ -284,7 +289,7 @@ targets += dtbs targets += $(addprefix ../, $(dtb-y)) $(obj)/../%.dtb: $(src)/%.dts FORCE - $(call if_changed_dep,dtc) + $(call if_changed_dep,dtc) dtbs: $(addprefix $(obj)/,$(dtb-y)) endif diff --git a/arch/arm/boot/dts/qcom/batterydata-D1_Default-4v4-3300mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-D1_Default-4v4-3300mah.dtsi new file mode 100644 index 0000000000000..00eabd9b38f6b --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-D1_Default-4v4-3300mah.dtsi @@ -0,0 +1,48 @@ + +qcom,3049735_wingtech_s88567aa1scud_3300mah_default { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <3300>; + qcom,batt-id-kohm = <1000>; + qcom,battery-beta = <3380>; + qcom,battery-type = "Generic_Battery"; + qcom,chg-rslow-comp-c1 = <3506249>; + qcom,chg-rslow-comp-c2 = <4896078>; + qcom,chg-rs-to-rslow = <1106835>; + qcom,chg-rslow-comp-thr = <0xA3>; + qcom,checksum = <0x574F>; + qcom,gui-version = "PMI8950GUI - 2.0.0.16"; + qcom,fg-profile-data = [ + DB 83 95 7C + E9 80 EF 76 + 60 83 E8 6E + F3 88 2C 94 + 3D 82 78 99 + 7B BC F9 C8 + 55 0E 79 83 + 12 6C DB 78 + EF 6C 40 83 + 56 78 5E 84 + 4E 7B 7D 82 + 80 93 1A B5 + 80 C0 70 0F + BB 0C 10 5A + 14 70 77 FD + 40 3C AE 45 + CA 41 00 00 + 49 4C 63 39 + 07 41 00 00 + 00 00 00 00 + 00 00 00 00 + 85 70 D6 6A + E6 60 85 89 + 43 76 09 6B + 63 55 2D 7A + FD 6F FE 63 + 68 56 DE A2 + 24 48 68 02 + 66 A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-Scud-4v4-3300mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-Scud-4v4-3300mah.dtsi new file mode 100644 index 0000000000000..c914f35dbaf62 --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-Scud-4v4-3300mah.dtsi @@ -0,0 +1,48 @@ + +qcom,3049735_wingtech_s88567aa1scud_3300mah_averaged_masterslave_aug9th2017 { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <3300>; + qcom,batt-id-kohm = <68>; + qcom,battery-beta = <3380>; + qcom,battery-type = "D1-qrd-scud-4v4-3300mah"; + qcom,chg-rslow-comp-c1 = <3506249>; + qcom,chg-rslow-comp-c2 = <4896078>; + qcom,chg-rs-to-rslow = <1106835>; + qcom,chg-rslow-comp-thr = <0xA3>; + qcom,checksum = <0x574F>; + qcom,gui-version = "PMI8950GUI - 2.0.0.16"; + qcom,fg-profile-data = [ + DB 83 95 7C + E9 80 EF 76 + 60 83 E8 6E + F3 88 2C 94 + 3D 82 78 99 + 7B BC F9 C8 + 55 0E 79 83 + 12 6C DB 78 + EF 6C 40 83 + 56 78 5E 84 + 4E 7B 7D 82 + 80 93 1A B5 + 80 C0 70 0F + BB 0C 10 5A + 14 70 77 FD + 40 3C AE 45 + CA 41 00 00 + 49 4C 63 39 + 07 41 00 00 + 00 00 00 00 + 00 00 00 00 + 85 70 D6 6A + E6 60 85 89 + 43 76 09 6B + 63 55 2D 7A + FD 6F FE 63 + 68 56 DE A2 + 24 48 68 02 + 66 A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-Sunwoda-4v4-3300mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-Sunwoda-4v4-3300mah.dtsi new file mode 100644 index 0000000000000..bb6e994c7e2cc --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-Sunwoda-4v4-3300mah.dtsi @@ -0,0 +1,48 @@ + +qcom,qrd_sdm450_4v4_3300mAh_sept11th2017 { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <3300>; + qcom,batt-id-kohm = <330>; + qcom,battery-beta = <3380>; + qcom,battery-type = "D1-qrd-sunwoda-4v4-3300mah"; + qcom,chg-rslow-comp-c1 = <3898419>; + qcom,chg-rslow-comp-c2 = <6564992>; + qcom,chg-rs-to-rslow = <1234327>; + qcom,chg-rslow-comp-thr = <0xB4>; + qcom,checksum = <0xB04E>; + qcom,gui-version = "PMI8950GUI - 2.0.0.16"; + qcom,fg-profile-data = [ + DF 83 CB 7C + 13 81 3E 77 + 62 83 56 6F + 0A 89 3B 94 + 31 82 9E 99 + 8B BC FB C8 + 56 0F 0D 88 + 5A 7E 17 82 + 79 7C 48 83 + 81 72 2D 77 + 4A 51 59 82 + 2F 99 45 BC + BB C8 5E 0D + DF 0C E1 59 + 14 70 77 FD + 32 31 FE 45 + 6E 33 00 00 + 66 45 F2 30 + 8D 36 00 00 + 00 00 00 00 + 00 00 00 00 + DC 71 31 70 + 23 84 5C 82 + A3 7C 03 72 + DB 67 51 79 + 8F 75 37 6A + 7E 60 C1 A0 + 33 22 62 B7 + 5F A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-qrd-Atl-4v4-4100mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-qrd-Atl-4v4-4100mah.dtsi new file mode 100644 index 0000000000000..017e1d587029b --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-qrd-Atl-4v4-4100mah.dtsi @@ -0,0 +1,48 @@ + +qcom,2312470_wingtech_a12atl_4000mah_averaged_masterslave_feb1st2016 { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <4100>; + qcom,batt-id-kohm = <68>; + qcom,battery-beta = <4150>; + qcom,battery-type = "qrd_msm8937_Atl_4100mah"; + qcom,chg-rslow-comp-c1 = <3011278>; + qcom,chg-rslow-comp-c2 = <4185582>; + qcom,chg-rs-to-rslow = <966005>; + qcom,chg-rslow-comp-thr = <0xA3>; + qcom,checksum = <0x90C2>; + qcom,gui-version = "PMI8950GUI - 2.0.0.15"; + qcom,fg-profile-data = [ + E1 83 CD 7C + FA 80 DE 76 + 69 83 6B 75 + 2B 8A 24 95 + 12 82 86 9A + 72 BD 12 CA + 56 11 EC 83 + B5 7C C8 80 + 55 76 5A 83 + A6 60 5E 81 + ED 8D 54 82 + 99 99 E9 BC + CD C9 54 0E + 65 10 A4 58 + 14 70 EE FC + 0F 36 44 3D + FD 2E 00 00 + 60 3F 44 33 + 35 3F 00 00 + 00 00 00 00 + 00 00 00 00 + F7 6B DA 6A + 5F 63 D8 80 + EB 6F 3C 62 + B5 57 6B 78 + DF 6E AE 60 + 8A 84 5B A3 + 17 A8 63 2D + 65 A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-qrd-Coslight-4v4-4100mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-qrd-Coslight-4v4-4100mah.dtsi new file mode 100644 index 0000000000000..cd5f348a00758 --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-qrd-Coslight-4v4-4100mah.dtsi @@ -0,0 +1,48 @@ + +qcom,2336567_wingtech_s88537a1coslight_4000mah_averaged_masterslave_mar3rd2016 { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <4100>; + qcom,batt-id-kohm = <100>; + qcom,battery-beta = <4250>; + qcom,battery-type = "qrd_msm8937_Coslight_4100mah"; + qcom,chg-rslow-comp-c1 = <3658227>; + qcom,chg-rslow-comp-c2 = <6007355>; + qcom,chg-rs-to-rslow = <1091156>; + qcom,chg-rslow-comp-thr = <0xB2>; + qcom,checksum = <0xA765>; + qcom,gui-version = "PMI8950GUI - 2.0.0.15"; + qcom,fg-profile-data = [ + E1 83 E0 7C + 31 81 88 77 + 62 83 1C 74 + 4E 89 60 94 + 40 82 A6 98 + 79 B6 08 C2 + 52 17 07 88 + 0A 7E F7 81 + 73 7C 36 83 + 40 79 08 86 + 9D 81 6B 82 + 6B 98 D0 B6 + 25 C3 5E 15 + 32 10 42 59 + 14 70 EE FC + 04 36 DC 44 + DE 3B 00 00 + 7C 4C FD 31 + E6 41 00 00 + 00 00 00 00 + 00 00 00 00 + 4F 71 C5 6B + 5B 74 71 88 + 88 7C E6 71 + 60 74 15 72 + A2 75 71 6A + B9 66 5C A3 + 23 91 60 87 + 5E A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-qrd-Default-4v4-4100mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-qrd-Default-4v4-4100mah.dtsi new file mode 100644 index 0000000000000..107390fd21061 --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-qrd-Default-4v4-4100mah.dtsi @@ -0,0 +1,48 @@ + +qcom,2312470_wingtech_a12atl_4000mah_default { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <4000>; + qcom,batt-id-kohm = <1>; + qcom,battery-beta = <4150>; + qcom,battery-type = "Generic_Battery"; + qcom,chg-rslow-comp-c1 = <3011278>; + qcom,chg-rslow-comp-c2 = <4185582>; + qcom,chg-rs-to-rslow = <966005>; + qcom,chg-rslow-comp-thr = <0xA3>; + qcom,checksum = <0x90C2>; + qcom,gui-version = "PMI8950GUI - 2.0.0.15"; + qcom,fg-profile-data = [ + E1 83 CD 7C + FA 80 DE 76 + 69 83 6B 75 + 2B 8A 24 95 + 12 82 86 9A + 72 BD 12 CA + 56 11 EC 83 + B5 7C C8 80 + 55 76 5A 83 + A6 60 5E 81 + ED 8D 54 82 + 99 99 E9 BC + CD C9 54 0E + 65 10 A4 58 + 14 70 EE FC + 0F 36 44 3D + FD 2E 00 00 + 60 3F 44 33 + 35 3F 00 00 + 00 00 00 00 + 00 00 00 00 + F7 6B DA 6A + 5F 63 D8 80 + EB 6F 3C 62 + B5 57 6B 78 + DF 6E AE 60 + 8A 84 5B A3 + 17 A8 63 2D + 65 A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-qrd-Desay-4v4-4100mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-qrd-Desay-4v4-4100mah.dtsi new file mode 100644 index 0000000000000..a5e3b5c71616b --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-qrd-Desay-4v4-4100mah.dtsi @@ -0,0 +1,48 @@ + +qcom,2312442_wingtech_a12desay_4000mah_averaged_masterslave_feb1st2016 { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <4100>; + qcom,batt-id-kohm = <30>; + qcom,battery-beta = <4100>; + qcom,battery-type = "qrd_msm8937_Desay_4100mah"; + qcom,chg-rslow-comp-c1 = <3278930>; + qcom,chg-rslow-comp-c2 = <4973220>; + qcom,chg-rs-to-rslow = <1125247>; + qcom,chg-rslow-comp-thr = <0xAC>; + qcom,checksum = <0xAB22>; + qcom,gui-version = "PMI8950GUI - 2.0.0.15"; + qcom,fg-profile-data = [ + D6 83 5E 7C + BB 80 9B 76 + 64 83 81 74 + A6 89 BC 94 + 9D 82 F3 91 + E0 AF 03 BB + 52 16 FE 83 + 7E 7D 8B 81 + 0B 7C 6A 83 + 62 6F B7 89 + 29 95 49 82 + 32 9A B0 BD + 0A CB 52 0D + 1B 10 B3 59 + 14 70 EE FC + 78 3E 7B 3F + 0B 40 00 00 + 5A 46 C1 2B + 1E 2A 00 00 + 00 00 00 00 + 00 00 00 00 + BA 70 4D 6B + 31 63 73 88 + BF 75 02 6B + DE 60 EF 7B + D4 6E 44 63 + D6 75 4F A0 + 1E E4 60 FF + 5E A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-qrd-sku1-4v4-2800mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-qrd-sku1-4v4-2800mah.dtsi index da520398cbaa0..87679f8c5d0ff 100644 --- a/arch/arm/boot/dts/qcom/batterydata-qrd-sku1-4v4-2800mah.dtsi +++ b/arch/arm/boot/dts/qcom/batterydata-qrd-sku1-4v4-2800mah.dtsi @@ -14,7 +14,7 @@ qcom,qrd_msm8937_sku1_2920mah { /* #QRD8937_2800mAh_China_data_averaged_MasterSlave_Oct30th2015*/ qcom,max-voltage-uv = <4400000>; qcom,nom-batt-capacity-mah = <2800>; - qcom,batt-id-kohm = <90>; + qcom,batt-id-kohm = <68>; qcom,battery-beta = <3380>; qcom,battery-type = "qrd_msm8937_sku1_2800mah"; qcom,fastchg-current-ma = <2600>; diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-desai_SAMSUNG-4v4-4000mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-desai_SAMSUNG-4v4-4000mah.dtsi new file mode 100644 index 0000000000000..ac7e8290df24f --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-desai_SAMSUNG-4v4-4000mah.dtsi @@ -0,0 +1,117 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + +qcom,wingtech-desai-4v4-4000mah-data { + qcom,default-rbatt-mohm = <116>; + qcom,max-voltage-uv = <4400000>; + qcom,fcc-mah = <4000>; + qcom,rbatt-capacitive-mohm = <10>; + qcom,v-cutoff-uv = <3400000>; + qcom,chg-term-ua = <100000>; + qcom,batt-id-kohm = <10>; + qcom,flat-ocv-threshold-uv = <3800000>; + qcom,battery-type = "wingtech-desai-4v4-3000mah"; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <4133 4132 4130 4121 4095>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 45 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4360 4360 4360 4360 4360>, + <4260 4302 4308 4306 4302>, + <4188 4240 4249 4248 4244>, + <4124 4185 4193 4191 4187>, + <4088 4132 4138 4136 4132>, + <4030 4082 4086 4084 4080>, + <3935 4024 4041 4038 4032>, + <3890 3942 3976 3982 3988>, + <3846 3909 3944 3948 3946>, + <3821 3878 3895 3902 3902>, + <3805 3848 3856 3857 3856>, + <3790 3821 3829 3830 3828>, + <3774 3798 3808 3808 3807>, + <3758 3780 3790 3791 3789>, + <3742 3767 3776 3774 3770>, + <3726 3753 3761 3754 3744>, + <3709 3734 3743 3734 3720>, + <3693 3718 3722 3712 3699>, + <3678 3708 3698 3689 3676>, + <3604 3679 3680 3670 3657>, + <3582 3661 3668 3652 3636>, + <3552 3628 3624 3610 3590>, + <3510 3576 3564 3550 3530>, + <3444 3498 3480 3467 3445>, + <3322 3368 3345 3341 3310>, + <3000 3000 3000 3018 3000>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>; + qcom,lut-data = <1382 266 100 84 79>, + <1379 266 100 84 79>, + <1278 267 100 85 79>, + <1186 269 103 87 80>, + <1162 274 107 90 79>, + <1091 280 112 92 81>, + <974 286 121 98 84>, + <964 241 122 99 87>, + <949 243 128 105 91>, + <977 241 109 102 93>, + <1021 240 98 85 79>, + <1071 241 98 84 79>, + <1124 240 101 87 81>, + <1178 246 104 90 84>, + <1231 262 105 90 84>, + <1292 282 105 87 81>, + <1360 297 103 86 81>, + <1410 309 104 86 81>, + <1322 312 100 83 77>, + <1381 324 99 84 78>, + <1416 334 101 85 79>, + <1453 345 103 88 83>, + <1485 359 107 91 88>, + <1525 379 112 97 93>, + <1576 393 117 102 97>, + <1634 405 120 97 90>, + <1745 412 109 91 84>, + <2055 432 110 91 86>, + <2583 466 115 95 90>, + <5166 565 160 109 109>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 250 500 1000 1500 2000>; + qcom,lut-data =<4066 4081 4072>, + <2422 4004 4006>, + <1628 3880 3989>, + <492 3340 3943>, + <110 2576 3850>, + <50 1987 3666>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-3030mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-3030mah.dtsi new file mode 100644 index 0000000000000..932109d640125 --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-3030mah.dtsi @@ -0,0 +1,120 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +qcom,wingtech-feimaotui-4v4-3030mah-data { + qcom,default-rbatt-mohm = <140>; + qcom,max-voltage-uv = <4400000>; + qcom,rbatt-capacitive-mohm = <50>; + qcom,v-cutoff-uv = <3400000>; + qcom,chg-term-ua = <100000>; + qcom,batt-id-kohm = <30>; + qcom,flat-ocv-threshold-uv = <3800000>; + qcom,battery-type = "wingtech-feimaotui-4v4-3030mah"; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <2343 2340 2338 2336 2328>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 45 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4328 4328 4328 4328 4086>, + <4240 4262 4266 4264 4076>, + <4172 4206 4208 4206 4056>, + <4106 4154 4154 4152 4046>, + <4070 4102 4102 4100 4036>, + <3995 4058 4062 4054 4020>, + <3919 3962 3992 3998 4002>, + <3882 3923 3960 3963 3961>, + <3843 3897 3914 3920 3919>, + <3808 3864 3870 3870 3869>, + <3791 3836 3840 3840 3840>, + <3778 3812 3818 3818 3817>, + <3766 3792 3800 3800 3798>, + <3756 3778 3784 3784 3782>, + <3744 3768 3770 3767 3762>, + <3734 3756 3756 3746 3734>, + <3720 3738 3736 3726 3713>, + <3706 3718 3714 3705 3691>, + <3692 3706 3696 3688 3675>, + <3680 3700 3690 3682 3670>, + <3672 3698 3689 3681 3669>, + <3662 3694 3688 3680 3668>, + <3651 3692 3686 3678 3666>, + <3636 3686 3682 3674 3660>, + <3618 3674 3670 3659 3640>, + <3594 3646 3639 3626 3602>, + <3560 3606 3592 3577 3552>, + <3514 3548 3530 3516 3490>, + <3446 3466 3448 3432 3404>, + <3322 3341 3320 3303 3274>, + <3000 3000 3000 3000 3006>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <1043 230 99 86 81>, + <1043 230 99 86 81>, + <1019 239 101 86 81>, + <984 247 104 87 82>, + <1009 251 109 91 84>, + <948 267 119 95 84>, + <893 223 119 96 86>, + <909 222 131 103 90>, + <906 230 119 108 95>, + <909 229 102 89 83>, + <950 228 100 86 81>, + <997 230 100 87 82>, + <1050 233 102 89 84>, + <1109 236 104 91 86>, + <1172 247 103 90 84>, + <1244 259 101 85 80>, + <1326 269 101 86 81>, + <1387 273 103 87 81>, + <1409 284 101 86 81>, + <1307 281 101 86 82>, + <1342 286 102 87 83>, + <1385 297 104 89 85>, + <1431 309 107 91 88>, + <1492 320 111 94 89>, + <1656 328 111 93 86>, + <1879 329 106 90 84>, + <2169 339 108 91 87>, + <2589 366 112 95 90>, + <3226 413 119 103 96>, + <5120 493 147 131 133>, + <53073 27234 27502 34136 15022>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 250 500 1000>; + qcom,lut-data = <2296 2305 2292>, + <1000 2256 2274>, + <626 2164 2262>, + <70 1732 2232>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-4000mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-4000mah.dtsi new file mode 100644 index 0000000000000..acebd0803ad8f --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-4000mah.dtsi @@ -0,0 +1,122 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + +qcom,wingtech-feimaotui-4v4-4000mah-data { + qcom,default-rbatt-mohm = <140>; + qcom,max-voltage-uv = <4400000>; + qcom,fcc-mah = <2300>; + qcom,rbatt-capacitive-mohm = <50>; + qcom,v-cutoff-uv = <3400000>; + qcom,chg-term-ua = <100000>; + qcom,batt-id-kohm = <30>; + qcom,flat-ocv-threshold-uv = <3800000>; + qcom,battery-type = "wingtech-feimaotui-4v4-3000mah"; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <2343 2340 2338 2336 2328>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 45 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4328 4328 4328 4328 4086>, + <4240 4262 4266 4264 4076>, + <4172 4206 4208 4206 4056>, + <4106 4154 4154 4152 4046>, + <4070 4102 4102 4100 4036>, + <3995 4058 4062 4054 4020>, + <3919 3962 3992 3998 4002>, + <3882 3923 3960 3963 3961>, + <3843 3897 3914 3920 3919>, + <3808 3864 3870 3870 3869>, + <3791 3836 3840 3840 3840>, + <3778 3812 3818 3818 3817>, + <3766 3792 3800 3800 3798>, + <3756 3778 3784 3784 3782>, + <3744 3768 3770 3767 3762>, + <3734 3756 3756 3746 3734>, + <3720 3738 3736 3726 3713>, + <3706 3718 3714 3705 3691>, + <3692 3706 3696 3688 3675>, + <3680 3700 3690 3682 3670>, + <3672 3698 3689 3681 3669>, + <3662 3694 3688 3680 3668>, + <3651 3692 3686 3678 3666>, + <3636 3686 3682 3674 3660>, + <3618 3674 3670 3659 3640>, + <3594 3646 3639 3626 3602>, + <3560 3606 3592 3577 3552>, + <3514 3548 3530 3516 3490>, + <3446 3466 3448 3432 3404>, + <3322 3341 3320 3303 3274>, + <3000 3000 3000 3000 3006>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <1043 230 99 86 81>, + <1043 230 99 86 81>, + <1019 239 101 86 81>, + <984 247 104 87 82>, + <1009 251 109 91 84>, + <948 267 119 95 84>, + <893 223 119 96 86>, + <909 222 131 103 90>, + <906 230 119 108 95>, + <909 229 102 89 83>, + <950 228 100 86 81>, + <997 230 100 87 82>, + <1050 233 102 89 84>, + <1109 236 104 91 86>, + <1172 247 103 90 84>, + <1244 259 101 85 80>, + <1326 269 101 86 81>, + <1387 273 103 87 81>, + <1409 284 101 86 81>, + <1307 281 101 86 82>, + <1342 286 102 87 83>, + <1385 297 104 89 85>, + <1431 309 107 91 88>, + <1492 320 111 94 89>, + <1656 328 111 93 86>, + <1879 329 106 90 84>, + <2169 339 108 91 87>, + <2589 366 112 95 90>, + <3226 413 119 103 96>, + <5120 493 147 131 133>, + <53073 27234 27502 34136 15022>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 250 500 1000>; + qcom,lut-data = <2296 2305 2292>, + <1000 2256 2274>, + <626 2164 2262>, + <70 1732 2232>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-guangyu_Coslight-4v4-4000mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-guangyu_Coslight-4v4-4000mah.dtsi new file mode 100644 index 0000000000000..b7d38ca5e47df --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-guangyu_Coslight-4v4-4000mah.dtsi @@ -0,0 +1,111 @@ + +qcom,Wingtech4000-batterydata { + qcom,battery-type = "wingtech-guangyu-4v4-3000mah"; + qcom,batt-id-kohm = <100>; + qcom,chg-term-ua = <120000>; + qcom,default-rbatt-mohm = <112>; + qcom,fcc-mah = <4000>; + qcom,max-voltage-uv = <4400000>; + qcom,rbatt-capacitive-mohm = <50>; + qcom,v-cutoff-uv = <3400000>; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <4037 4050 4050 4046 4018>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 500 800 1000 1500>, + <2000>; + qcom,lut-data = <3968 3991 3988>, + <714 3850 3920>, + <448 3490 3906>, + <248 3193 3896>, + <48 2452 3826>, + <12 1878 3688>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4389 4385 4379 4374 4367>, + <4246 4302 4314 4312 4306>, + <4150 4237 4256 4254 4249>, + <4070 4178 4198 4197 4192>, + <3988 4122 4142 4140 4137>, + <3934 4068 4088 4087 4084>, + <3890 4004 4038 4036 4034>, + <3861 3946 3985 3989 3988>, + <3839 3906 3938 3943 3943>, + <3820 3870 3888 3890 3890>, + <3804 3840 3854 3854 3854>, + <3788 3814 3828 3828 3828>, + <3773 3794 3806 3806 3806>, + <3756 3778 3786 3788 3786>, + <3739 3766 3769 3768 3766>, + <3720 3750 3753 3747 3736>, + <3699 3730 3735 3726 3714>, + <3678 3712 3714 3706 3694>, + <3660 3696 3694 3686 3674>, + <3646 3688 3686 3680 3668>, + <3639 3686 3684 3678 3667>, + <3628 3680 3682 3676 3665>, + <3616 3676 3680 3674 3662>, + <3602 3670 3676 3670 3658>, + <3584 3659 3668 3661 3649>, + <3562 3640 3650 3640 3626>, + <3535 3606 3609 3596 3584>, + <3496 3554 3550 3536 3526>, + <3434 3475 3466 3451 3444>, + <3316 3337 3324 3309 3312>, + <3000 3000 3000 3000 3000>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>; + qcom,lut-data = <1427 317 100 81 73>, + <1427 316 100 81 73>, + <1289 303 100 81 73>, + <1186 293 100 81 75>, + <1084 285 103 83 77>, + <1039 279 104 85 78>, + <1016 264 107 87 79>, + <1020 244 111 90 81>, + <1032 243 108 92 82>, + <1058 240 95 80 75>, + <1087 241 93 79 73>, + <1124 243 94 79 74>, + <1177 249 96 80 75>, + <1233 259 96 81 76>, + <1298 272 96 81 75>, + <1366 290 96 80 75>, + <1446 314 97 80 76>, + <1514 338 98 81 76>, + <1571 361 98 80 74>, + <1569 373 99 80 75>, + <1587 387 100 82 77>, + <1638 400 102 84 79>, + <1732 417 105 88 82>, + <1883 436 110 91 85>, + <2069 461 113 93 86>, + <2304 480 113 90 82>, + <2620 505 108 86 79>, + <3055 536 111 88 79>, + <3730 584 115 90 82>, + <5181 704 141 120 91>; + }; +}; +/* TEST_DB_ID=TEST_ID_NOT_SET */ diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-3030mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-3030mah.dtsi new file mode 100644 index 0000000000000..fcc71ffda47f2 --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-3030mah.dtsi @@ -0,0 +1,116 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +qcom,wingtech-xingwangda-4v4-3030mah-data { + qcom,default-rbatt-mohm = <120>; + qcom,max-voltage-uv = <4400000>; + qcom,rbatt-capacitive-mohm = <10>; + qcom,v-cutoff-uv = <3400000>; + qcom,chg-term-ua = <100000>; + qcom,batt-id-kohm = <50>; + qcom,flat-ocv-threshold-uv = <3800000>; + qcom,battery-type = "wingtech-xingwangda-4v4-3030mah"; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <4025 4035 4034 4030 4020>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 45 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4360 4360 4360 4360 4360>, + <4278 4311 4314 4310 4305>, + <4199 4248 4254 4251 4246>, + <4128 4188 4195 4194 4188>, + <4080 4130 4138 4136 4133>, + <4000 4075 4084 4083 4080>, + <3946 4010 4033 4033 4030>, + <3903 3952 3984 3986 3984>, + <3866 3915 3935 3942 3940>, + <3834 3880 3888 3890 3889>, + <3812 3847 3854 3854 3854>, + <3794 3820 3828 3828 3828>, + <3778 3797 3806 3807 3806>, + <3762 3779 3788 3789 3788>, + <3743 3766 3772 3771 3765>, + <3724 3750 3756 3749 3738>, + <3700 3734 3738 3730 3716>, + <3679 3720 3718 3710 3696>, + <3660 3708 3700 3692 3680>, + <3644 3700 3690 3682 3670>, + <3554 3640 3648 3640 3617>, + <3516 3598 3606 3596 3574>, + <3458 3539 3548 3537 3512>, + <3367 3454 3467 3456 3427>, + <3223 3318 3338 3327 3304>, + <3019 3000 3000 3000 3036>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data =<1351 292 100 81 73>, + <1351 292 100 81 73>, + <1232 292 102 82 74>, + <1143 289 104 84 75>, + <1113 287 108 86 78>, + <1048 282 111 89 79>, + <1027 273 116 92 81>, + <1018 265 123 97 83>, + <1016 264 114 100 87>, + <1020 260 101 85 78>, + <1035 260 99 81 74>, + <1063 260 99 82 76>, + <1103 262 102 84 79>, + <1160 267 105 88 82>, + <1231 273 106 88 80>, + <1318 282 103 83 77>, + <1423 297 103 83 77>, + <1575 317 103 83 77>, + <1747 341 102 82 76>, + <1864 360 102 82 75>, + <1881 367 102 84 78>, + <1805 357 104 85 80>, + <1664 352 108 88 82>, + <1835 363 112 91 86>, + <2064 375 114 92 86>, + <2373 388 112 88 79>, + <2802 408 109 88 80>, + <3500 448 112 89 82>, + <5633 516 118 92 83>, + <11267 1032 148 118 94>, + <22533 2063 295 235 188>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 500 800 1000 1500 2000>; + qcom,lut-data =<3944 3954 3974>, + <300 3793 3930>, + <86 3332 3905>, + <76 2939 3883>, + <17 2118 3797>, + <11 1552 3622>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-4000mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-4000mah.dtsi new file mode 100644 index 0000000000000..ce537fba7e52f --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-4000mah.dtsi @@ -0,0 +1,119 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + +qcom,wingtech-xingwangda-4v4-4000mah-data { + qcom,default-rbatt-mohm = <120>; + qcom,max-voltage-uv = <4400000>; + qcom,fcc-mah = <4000>; + qcom,rbatt-capacitive-mohm = <10>; + qcom,v-cutoff-uv = <3400000>; + qcom,chg-term-ua = <100000>; + qcom,batt-id-kohm = <50>; + qcom,flat-ocv-threshold-uv = <3800000>; + qcom,battery-type = "wingtech-xingwangda-4v4-3000mah"; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <4025 4035 4034 4030 4020>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 45 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4360 4360 4360 4360 4360>, + <4278 4311 4314 4310 4305>, + <4199 4248 4254 4251 4246>, + <4128 4188 4195 4194 4188>, + <4080 4130 4138 4136 4133>, + <4000 4075 4084 4083 4080>, + <3946 4010 4033 4033 4030>, + <3903 3952 3984 3986 3984>, + <3866 3915 3935 3942 3940>, + <3834 3880 3888 3890 3889>, + <3812 3847 3854 3854 3854>, + <3794 3820 3828 3828 3828>, + <3778 3797 3806 3807 3806>, + <3762 3779 3788 3789 3788>, + <3743 3766 3772 3771 3765>, + <3724 3750 3756 3749 3738>, + <3700 3734 3738 3730 3716>, + <3679 3720 3718 3710 3696>, + <3660 3708 3700 3692 3680>, + <3644 3700 3690 3682 3670>, + <3554 3640 3648 3640 3617>, + <3516 3598 3606 3596 3574>, + <3458 3539 3548 3537 3512>, + <3367 3454 3467 3456 3427>, + <3223 3318 3338 3327 3304>, + <3019 3000 3000 3000 3036>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data =<1351 292 100 81 73>, + <1351 292 100 81 73>, + <1232 292 102 82 74>, + <1143 289 104 84 75>, + <1113 287 108 86 78>, + <1048 282 111 89 79>, + <1027 273 116 92 81>, + <1018 265 123 97 83>, + <1016 264 114 100 87>, + <1020 260 101 85 78>, + <1035 260 99 81 74>, + <1063 260 99 82 76>, + <1103 262 102 84 79>, + <1160 267 105 88 82>, + <1231 273 106 88 80>, + <1318 282 103 83 77>, + <1423 297 103 83 77>, + <1575 317 103 83 77>, + <1747 341 102 82 76>, + <1864 360 102 82 75>, + <1881 367 102 84 78>, + <1805 357 104 85 80>, + <1664 352 108 88 82>, + <1835 363 112 91 86>, + <2064 375 114 92 86>, + <2373 388 112 88 79>, + <2802 408 109 88 80>, + <3500 448 112 89 82>, + <5633 516 118 92 83>, + <11267 1032 148 118 94>, + <22533 2063 295 235 188>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 500 800 1000 1500 2000>; + qcom,lut-data =<3944 3954 3974>, + <300 3793 3930>, + <86 3332 3905>, + <76 2939 3883>, + <17 2118 3797>, + <11 1552 3622>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ft8006m-boe-5p7-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ft8006m-boe-5p7-720p-video.dtsi new file mode 100644 index 0000000000000..1667ef07c0e72 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ft8006m-boe-5p7-720p-video.dtsi @@ -0,0 +1,110 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ft8006m_boe_5p7_720p_video: qcom,mdss_dsi_ft8006m_boe_5p7_720p_video { + qcom,mdss-dsi-panel-name = "ft8006m_boe_5p7_720p_video"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,min-refresh-rate = <48>; + qcom,max-refresh-rate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1440>; + qcom,mdss-pan-physical-width-dimension = <65>; + qcom,mdss-pan-physical-height-dimension = <129>; + qcom,mdss-dsi-h-front-porch = <45>; + qcom,mdss-dsi-h-back-porch = <25>; + qcom,mdss-dsi-h-pulse-width = <14>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <37>; + qcom,mdss-dsi-v-front-porch = <65>; + qcom,mdss-dsi-v-pulse-width = <8>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00 + 39 00 00 00 00 00 03 50 5A 0E + 39 00 00 00 00 00 04 83 AC B4 6D + 39 00 00 00 00 00 03 50 5A 19 + 39 00 00 00 00 00 08 90 fc 6f f6 ef cf af 0f + 39 00 00 00 00 00 03 A1 00 44 + 39 00 00 00 00 00 11 80 ea d3 c6 b8 af a6 9e 98 92 8e 8a 85 00 60 f6 cf + 39 00 00 00 00 00 03 50 5A 23 + 39 00 00 00 00 00 07 90 ff 0f 00 00 2C 00 + 39 01 00 00 00 00 02 50 00 + 39 01 00 00 02 00 02 29 00 + ]; + qcom,mdss-dsi-off-command = [ + 05 01 00 00 14 00 02 28 00 + 05 01 00 00 78 00 02 10 00 + 39 01 00 00 00 00 02 04 5A + 39 01 00 00 00 00 02 05 5A]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + + qcom,mdss-dsi-panel-cabc-off-command = [39 01 00 00 00 00 03 50 5A 23 + 39 01 00 00 00 00 02 95 00 + 39 01 00 00 00 00 02 50 00]; + qcom,mdss-dsi-panel-cabc-on-command = [39 01 00 00 00 00 03 50 5A 23 + 39 01 00 00 00 00 02 95 01 + 39 01 00 00 00 00 02 50 00]; + qcom,mdss-dsi-panel-cabc-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-panel-timings-phy-v2 = [1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 0E 04 05 02 03 04 A0]; + qcom,mdss-dsi-t-clk-post = <0x0A>; + qcom,mdss-dsi-t-clk-pre = <0x1E>; + qcom,mdss-dsi-bl-min-level = <7>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-brightness-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <5000>; + qcom,mdss-dsi-reset-sequence = <1 35>, <0 5>, <1 10>; + qcom,mdss-dsi-pwr-off-rst-pull-high = <1>; + + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 9c]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ft8613-csot-5p7-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-csot-5p7-720p-video.dtsi new file mode 100644 index 0000000000000..a4a8680c7c705 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-csot-5p7-720p-video.dtsi @@ -0,0 +1,204 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ft8613_csot_5p7_720p_video: qcom,mdss_dsi_ft8613_csot_5p7_720p_video { + qcom,mdss-dsi-panel-name = "ft8613_csot_5p7_720p_video"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,min-refresh-rate = <48>; + qcom,max-refresh-rate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1440>; + qcom,mdss-pan-physical-width-dimension = <65>; + qcom,mdss-pan-physical-height-dimension = <129>; + qcom,mdss-dsi-h-front-porch = <32>; + qcom,mdss-dsi-h-back-porch = <32>; + qcom,mdss-dsi-h-pulse-width = <2>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <16>; + qcom,mdss-dsi-v-front-porch = <16>; + qcom,mdss-dsi-v-pulse-width = <2>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 04 FF 87 16 01 + 39 01 00 00 00 00 02 00 80 + 39 01 00 00 00 00 03 FF 87 16 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 19 E1 00 06 18 2B 36 42 55 64 6B 74 7D 87 70 68 65 5E 50 45 37 2D 25 16 09 07 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 19 E2 00 06 18 2B 36 42 55 64 6B 74 7D 87 70 68 65 5E 50 45 37 2D 25 16 09 07 + 39 01 00 00 00 00 02 00 81 + 39 01 00 00 00 00 0D F3 40 89 C0 40 89 C0 40 81 C0 40 81 C0 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 05 2A 00 00 02 CF + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 05 2B 00 00 05 9F + 39 01 00 00 00 00 02 00 81 + 39 01 00 00 00 00 0a CA b9 ff b9 ff b9 ff 00 00 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 10 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 bb bc aa cd 9a bb 8c 88 88 78 66 56 55 55 55 55 55 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 11 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 ab ac aa cc 9a ba 8b 88 88 78 66 66 66 66 55 55 55 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 12 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 aa 9c 9b cc 99 ba 8a 88 88 78 66 66 66 66 66 66 55 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 13 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9b 9c 9a bc 9a a9 8b 88 88 88 66 66 66 66 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 14 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9a 9c 9a ca 99 a9 8b 88 88 88 77 67 66 66 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 15 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9a 9b 9a c9 99 99 8a 88 88 88 77 77 77 67 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 16 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9a 9a 8a c9 99 99 8a 88 88 88 77 77 77 77 67 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 17 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 99 9a 8a b9 99 99 89 88 88 88 77 77 77 77 77 77 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 18 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 9a 8a 99 a9 99 98 89 88 88 88 78 77 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 19 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 99 99 99 b8 89 89 89 88 88 88 88 78 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1a + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 99 99 98 a8 89 89 89 88 88 88 88 88 78 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1b + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 98 99 89 98 99 88 89 88 88 88 88 88 88 78 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1c + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 98 98 89 98 89 98 88 88 88 88 88 88 88 88 78 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1d + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 89 89 98 79 89 88 88 88 88 88 88 88 88 88 78 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1e + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 98 88 98 88 89 88 88 88 88 88 88 88 88 88 88 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1f + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 88 88 88 89 88 88 88 88 88 88 88 88 88 88 88 88 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 00 + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 53 24 + 39 01 00 00 00 00 02 55 00 + 39 01 00 00 78 00 02 11 00 + 39 01 00 00 02 00 02 29 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-off-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 05 01 00 00 14 00 02 28 00 + 05 01 00 00 78 00 02 10 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 05 F7 5A A5 87 16 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + + qcom,mdss-dsi-panel-cabc-off-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 39 01 00 00 00 00 02 55 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-panel-cabc-on-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 39 01 00 00 00 00 02 55 01 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-panel-cabc-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-panel-timings-phy-v2 = [1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 0E 03 05 02 03 04 A0]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1D>; + qcom,mdss-dsi-bl-min-level = <8>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-brightness-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <5000>; + qcom,mdss-dsi-reset-sequence = <1 10>, <0 5>, <1 30>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 AC 00 + 06 01 00 01 05 00 02 0A 9C]; + qcom,mdss-dsi-panel-status-command-num = <2>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1 1>; + qcom,mdss-dsi-panel-status-value = <0x00>,<0x9C>; + qcom,mdss-dsi-panel-status-read-length = <1 1>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi new file mode 100644 index 0000000000000..2a92adab6a51f --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi @@ -0,0 +1,99 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ft8613_ebbg_5p5_1080p_video: qcom,mdss_dsi_ft8613_ebbg_5p5_1080p_video { + qcom,mdss-dsi-panel-name = "ft8613_ebbg_5p5_1080p_video"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <1080>; + qcom,mdss-dsi-panel-height = <1920>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <88>; + qcom,mdss-dsi-h-back-porch = <98>; + qcom,mdss-dsi-h-pulse-width = <20>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <20>; + qcom,mdss-dsi-v-front-porch = <20>; + qcom,mdss-dsi-v-pulse-width = <2>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 04 FF 87 16 01 + 39 00 00 00 00 00 02 00 80 + 39 00 00 00 00 00 03 FF 87 16 + 39 00 00 00 00 00 02 00 81 + 39 00 00 00 00 00 0A CA B4 FF B9 FF B9 FF 00 00 00 + 39 00 00 00 00 00 02 00 B0 + 39 00 00 00 00 00 02 CA 04 + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 53 2C + 39 01 00 00 00 00 02 55 02 + 39 01 00 00 78 00 02 11 00 + 39 01 00 00 02 00 02 29 00 + ]; + qcom,mdss-dsi-off-command = [ + 05 00 00 00 14 00 02 28 00 + 05 01 00 00 78 00 02 10 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 05 F7 5A A5 87 16]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-panel-timings-phy-v2 = [24 1F 08 09 05 03 04 A0 + 24 1F 08 09 05 03 04 A0 + 24 1F 08 09 05 03 04 A0 + 24 1F 08 09 05 03 04 A0 + 24 1B 08 09 05 03 04 A0]; + qcom,mdss-dsi-t-clk-post = <0x0D>; + qcom,mdss-dsi-t-clk-pre = <0x30>; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <5000>; + qcom,mdss-dsi-reset-sequence = <1 10>, <0 5>, <1 10>; + + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi new file mode 100644 index 0000000000000..2dbb4a31abb68 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi @@ -0,0 +1,216 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ft8613_ebbg_5p7_720p_video: qcom,mdss_dsi_ft8613_ebbg_5p7_720p_video { + qcom,mdss-dsi-panel-name = "ft8613_ebbg_5p7_720p_video"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,min-refresh-rate = <48>; + qcom,max-refresh-rate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1440>; + qcom,mdss-pan-physical-width-dimension = <65>; + qcom,mdss-pan-physical-height-dimension = <129>; + qcom,mdss-dsi-h-front-porch = <32>; + qcom,mdss-dsi-h-back-porch = <32>; + qcom,mdss-dsi-h-pulse-width = <2>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <16>; + qcom,mdss-dsi-v-front-porch = <16>; + qcom,mdss-dsi-v-pulse-width = <2>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 04 FF 87 16 01 + 39 01 00 00 00 00 02 00 80 + 39 01 00 00 00 00 03 FF 87 16 + 39 01 00 00 00 00 02 00 81 + 39 01 00 00 00 00 0D F3 00 82 C0 00 82 C0 00 84 C0 00 84 C0 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 05 2A 00 00 02 CF + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 05 2B 00 00 05 9F + 39 00 00 00 00 00 02 00 81 + 39 00 00 00 00 00 0A CA B4 FF B9 FF B9 FF 00 00 00 + 39 00 00 00 00 00 02 00 B0 + 39 00 00 00 00 00 02 CA 04 + 39 00 00 00 00 00 02 00 88 + 39 00 00 00 00 00 05 C2 90 0C 12 00 + 39 00 00 00 00 00 02 00 CA + 39 00 00 00 00 00 02 CB 02 + 39 00 00 00 00 00 02 00 8A + 39 00 00 00 00 00 02 CC 04 + 39 00 00 00 00 00 02 00 9A + 39 00 00 00 00 00 02 CC 04 + 39 00 00 00 00 00 02 00 AB + 39 00 00 00 00 00 02 CD 0B + 39 00 00 00 00 00 02 00 8B + 39 00 00 00 00 00 02 CD 0B + 39 01 00 00 00 00 02 00 81 + 39 01 00 00 00 00 0a CA b9 ff b9 ff b9 ff 00 00 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 10 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 bb 9c bb dc aa 8b 88 88 78 66 66 66 66 66 66 66 56 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 11 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 ab 9c aa cd aa 8a 88 88 88 77 66 66 66 66 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 12 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 aa 9c 9a bd 9b 8a 88 88 88 77 77 67 66 66 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 13 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9b ab 9a cb aa 89 88 88 88 77 77 77 77 66 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 14 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 aa 8b aa ca a9 89 88 88 88 77 77 77 77 77 67 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 15 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9a 8b 9a bb a9 89 88 88 88 77 77 77 77 77 77 67 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 16 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9a 8a 9a ba 99 89 88 88 88 77 77 77 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 17 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 99 9a 89 ba 99 89 88 88 88 88 77 77 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 18 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 9a 99 99 a9 99 89 88 88 88 88 88 77 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 19 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 99 8a 99 a8 99 89 88 88 88 88 88 88 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1a + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 99 89 99 a8 89 89 88 88 88 88 88 88 88 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1b + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 89 89 99 a8 98 88 88 88 88 88 88 88 88 88 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1c + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 98 89 98 a8 88 88 88 88 88 88 88 88 88 88 88 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1d + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 89 98 98 98 88 88 88 88 88 88 88 88 88 88 78 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1e + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 98 88 88 89 88 88 88 88 88 88 88 88 88 88 88 78 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1f + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 88 88 88 89 88 88 88 88 88 88 88 88 88 88 88 88 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 00 + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 53 24 + 39 01 00 00 00 00 02 55 00 + 39 01 00 00 78 00 02 11 00 + 39 01 00 00 02 00 02 29 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-off-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 05 00 00 00 14 00 02 28 00 + 05 01 00 00 78 00 02 10 00 + 39 00 00 00 00 00 02 00 00 + 39 01 00 00 00 00 05 f7 5a a5 87 16 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + + qcom,mdss-dsi-panel-cabc-off-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 39 01 00 00 00 00 02 55 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-panel-cabc-on-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 39 01 00 00 00 00 02 55 01 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-panel-cabc-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-panel-timings-phy-v2 = [1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 0E 03 05 02 03 04 A0]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1D>; + qcom,mdss-dsi-bl-min-level = <9>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-brightness-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <5000>; + qcom,mdss-dsi-reset-sequence = <1 10>, <0 5>, <1 30>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 AC 00 + 06 01 00 01 05 00 02 0A 9C]; + qcom,mdss-dsi-panel-status-command-num = <2>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1 1>; + qcom,mdss-dsi-panel-status-value = <0x00>,<0x9C>; + qcom,mdss-dsi-panel-status-read-length = <1 1>; +}; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-720p-video.dtsi new file mode 100644 index 0000000000000..abd23f54b489b --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-720p-video.dtsi @@ -0,0 +1,128 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_hx8394f_boe_720_vid: qcom,mdss_dsi_hx8394f_boe_720p_video { + qcom,mdss-dsi-panel-name = "hx8394F_HD720p_video_BOE"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-dsi-h-front-porch = <160>; + qcom,mdss-dsi-h-back-porch = <160>; + qcom,mdss-dsi-h-pulse-width = <24>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <12>; + qcom,mdss-dsi-v-front-porch = <15>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 B9 FF 83 94 + 39 01 00 00 78 00 02 11 00 + 39 01 00 00 14 00 02 29 00 + 39 01 00 00 00 00 02 51 FF + 39 01 00 00 05 00 0A C9 13 00 13 1E 31 1E 00 91 00 + 39 01 00 00 05 00 02 55 00 + 39 01 00 00 00 00 02 53 2C]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 + 39 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0C 18 24 30 3A 43 4A 52 59 5F 66 6D 74 7B 83 8A 91 99 A0 A7 AE B5 BC C3 CA D1 D9 E0 E7 EF F7 FF 15 B3 59 B8 1E 00 AC 63 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0B 16 21 2C 36 3E 46 4D 54 5A 60 66 6C 73 79 7F 86 8D 93 9B A0 A6 AD B3 B9 BF C6 CD D3 DA E0 E6 06 9D 40 21 E3 3C 6E 62 C0 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 14 1E 28 32 3B 43 4A 51 57 5D 62 69 6F 75 7B 82 88 8F 95 9C A2 A7 AE B4 BA C0 C6 CD D2 D9 DE 16 BE 95 DB CD E3 01 8C C0 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-cool-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 11 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3C 43 4B 52 59 5F 66 6D 74 7B 82 8A 92 9A A0 A8 AF B7 BD C7 CE D5 DD E6 EE F7 FF 16 E3 11 59 A4 8D C3 84 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 31 3B 43 4A 51 57 5E 64 6B 72 79 80 87 8F 97 9E A4 AB B3 BA C1 C9 D0 D7 DF E6 EE F6 0F F0 1D AA B4 7C 01 C8 00 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 32 3C 44 4C 53 5A 60 68 6F 76 7D 85 8C 94 9C A3 AA B2 B9 C0 C8 D0 D8 DF E7 EE F6 FE 0E 56 27 1B 7E B5 F8 8B 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-nature-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 09 12 1B 24 2E 38 41 48 4F 56 5C 62 69 70 77 7E 85 8C 93 9B A2 A8 AF B6 BD C4 CC D3 DA E1 E8 F0 15 7C 62 A9 1B 8B 4C 2E 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-ce-std-command = [ + 39 01 00 00 05 00 02 55 00 + 39 01 00 00 0A 00 03 E4 01 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [ + 39 01 00 00 05 00 02 55 11 + 39 01 00 00 14 00 03 E4 01 42 + 39 01 00 00 14 00 20 E5 00 00 0B 08 01 00 00 00 00 00 00 05 1D 19 1F 05 ED 09 20 00 00 04 0B 02 01 08 08 07 02 04 02 + 39 01 00 00 14 00 16 E6 00 08 00 05 05 10 10 10 20 20 20 10 10 10 10 10 03 A0 01 0F 11]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-panel-timings = [8C 1E 14 00 46 48 1A 22 18 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 01 D9 + 06 01 00 01 05 00 01 09 + ]; + qcom,mdss-dsi-panel-status-command-num = <2>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-read-length = <4 4>; + qcom,mdss-dsi-panel-status-valid-params = <1 3>; + qcom,mdss-dsi-panel-status-value = + <0x80 0x80 0x73 0x04 >, + <0x80 0x80 0x73 0x04 >; + + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-reset-sequence = <1 50>, <0 20>, <1 5>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-tx-eot-append; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3a-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3a-720p-video.dtsi new file mode 100644 index 0000000000000..62c2c25525f1b --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3a-720p-video.dtsi @@ -0,0 +1,175 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_hx8394f_boe_720_vid: qcom,mdss_dsi_hx8394f_boe_720p_video { + qcom,mdss-dsi-panel-name = "hx8394F_HD720p_video_BOE_c3a"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-dsi-h-front-porch = <160>; + qcom,mdss-dsi-h-back-porch = <160>; + qcom,mdss-dsi-h-pulse-width = <24>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <12>; + qcom,mdss-dsi-v-front-porch = <15>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 B9 FF 83 94 + 05 01 00 00 78 00 02 11 00 + 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 + 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0C 18 24 30 3A 43 4A 52 59 5F 66 6D 74 7B 83 8A 91 99 A0 A7 AE B5 BC C3 CA D1 D9 E0 E7 EF F7 FF 15 B3 59 B8 1E 00 AC 63 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0B 16 21 2C 36 3E 46 4D 54 5A 60 66 6C 73 79 7F 86 8D 93 9B A0 A6 AD B3 B9 BF C6 CD D3 DA E0 E6 06 9D 40 21 E3 3C 6E 62 C0 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 14 1E 28 32 3B 43 4A 51 57 5D 62 69 6F 75 7B 82 88 8F 95 9C A2 A7 AE B4 BA C0 C6 CD D2 D9 DE 16 BE 95 DB CD E3 01 8C C0 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-cool-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 11 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3C 43 4B 52 59 5F 66 6D 74 7B 82 8A 92 9A A0 A8 AF B7 BD C7 CE D5 DD E6 EE F7 FF 16 E3 11 59 A4 8D C3 84 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 31 3B 43 4A 51 57 5E 64 6B 72 79 80 87 8F 97 9E A4 AB B3 BA C1 C9 D0 D7 DF E6 EE F6 0F F0 1D AA B4 7C 01 C8 00 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 32 3C 44 4C 53 5A 60 68 6F 76 7D 85 8C 94 9C A3 AA B2 B9 C0 C8 D0 D8 DF E7 EE F6 FE 0E 56 27 1B 7E B5 F8 8B 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-nature-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 09 12 1B 24 2E 38 41 48 4F 56 5C 62 69 70 77 7E 85 8C 93 9B A2 A8 AF B6 BD C4 CC D3 DA E1 E8 F0 15 7C 62 A9 1B 8B 4C 2E 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 0A 00 03 E4 00 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 01 00 00 14 00 02 E4 00 + 39 01 00 00 14 00 20 E5 00 00 0B 08 01 00 00 00 00 00 00 05 1D 19 1F 05 ED 09 20 00 00 04 0B 02 01 08 08 07 02 04 02 + 39 01 00 00 14 00 16 E6 00 08 00 05 05 10 10 10 20 20 20 10 10 10 10 10 03 A0 01 0F 11 + 39 01 00 00 14 00 03 E4 00 41]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_lp_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 08 11 19 22 2C 35 3D 44 4B 51 57 5D 64 6A 71 77 7E 85 8C 93 99 9F A6 AC B3 BA C1 C8 CF D6 DC E3 37 5E 9A 48 50 6E C9 01 80 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command02 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 08 10 18 20 2A 33 3A 40 47 4D 53 58 5E 65 6B 71 77 7E 84 8B 91 97 9E A3 A9 B0 B7 BD C4 CB D1 D7 16 81 D4 B0 77 E8 FD E0 C0 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command03 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 07 0F 17 1E 27 30 37 3D 43 49 4E 53 59 5F 65 6B 71 77 7D 84 8A 8F 95 9B A1 A7 AD B3 BA C0 C6 CC 38 F5 B7 FE 6F 8B 4B C4 80 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command04 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 07 0E 15 1D 25 2D 34 39 3F 44 4A 4E 54 5A 5F 64 6A 70 76 7C 81 87 8C 92 97 9D A3 A9 AF B4 BA C0 1B 14 EC E2 F9 B3 1A 0D 40 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command05 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0D 14 1B 23 2A 31 36 3B 40 45 4A 4F 54 59 5F 64 6A 6F 75 7A 7F 84 89 8E 94 99 9F A4 AA AF B5 3E 5C BF 6F 21 52 A7 35 00 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command06 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0C 13 19 21 28 2E 33 38 3D 41 46 4B 50 54 59 5E 63 69 6E 73 77 7D 81 86 8C 91 96 9B A0 A5 AA 2D D5 63 03 BC 9C 90 19 C0 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command07 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0C 12 18 1F 25 2B 30 34 39 3D 41 46 4A 4F 53 58 5D 62 67 6B 70 74 79 7D 82 87 8C 91 96 9A 9F 00 08 31 4D E4 63 2E 42 80 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command08 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 05 0B 10 16 1C 22 27 2C 30 34 38 3C 40 45 49 4D 51 56 5A 5F 63 67 6B 6F 74 78 7D 81 86 8A 8E 93 22 6F 7F 70 76 57 CC 8A 40 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-panel-timings = [8C 20 14 00 46 48 1A 22 18 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-reset-sequence = <1 50>, <0 20>, <1 5>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-tx-eot-append; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3b-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3b-720p-video.dtsi new file mode 100644 index 0000000000000..d26a2d4317246 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3b-720p-video.dtsi @@ -0,0 +1,197 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_hx8394f_boe_720_vid: qcom,mdss_dsi_hx8394f_boe_c3b_720p_video { + qcom,mdss-dsi-panel-name = "hx8394F_HD720p_video_BOE_c3b"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-model = "BOE HD HX8394F VIDEO PANEL"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-dsi-h-front-porch = <160>; + qcom,mdss-dsi-h-back-porch = <160>; + qcom,mdss-dsi-h-pulse-width = <24>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <12>; + qcom,mdss-dsi-v-front-porch = <15>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 B9 FF 83 94 + 05 01 00 00 78 00 02 11 00 + 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 + 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0C 18 24 30 3A 43 4A 52 59 5F 66 6D 74 7B 83 8A 91 99 A0 A7 AE B5 BC C3 CA D1 D9 E0 E7 EF F7 FF 15 B3 59 B8 1E 00 AC 63 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0B 16 21 2C 36 3E 46 4D 54 5A 60 66 6C 73 79 7F 86 8D 93 9B A0 A6 AD B3 B9 BF C6 CD D3 DA E0 E6 06 9D 40 21 E3 3C 6E 62 C0 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 14 1E 28 32 3B 43 4A 51 57 5D 62 69 6F 75 7B 82 88 8F 95 9C A2 A7 AE B4 BA C0 C6 CD D2 D9 DE 16 BE 95 DB CD E3 01 8C C0 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-cool-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 11 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3C 43 4B 52 59 5F 66 6D 74 7B 82 8A 92 9A A0 A8 AF B7 BD C7 CE D5 DD E6 EE F7 FF 16 E3 11 59 A4 8D C3 84 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 31 3B 43 4A 51 57 5E 64 6B 72 79 80 87 8F 97 9E A4 AB B3 BA C1 C9 D0 D7 DF E6 EE F6 0F F0 1D AA B4 7C 01 C8 00 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 32 3C 44 4C 53 5A 60 68 6F 76 7D 85 8C 94 9C A3 AA B2 B9 C0 C8 D0 D8 DF E7 EE F6 FE 0E 56 27 1B 7E B5 F8 8B 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-nature-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 09 12 1B 24 2E 38 41 48 4F 56 5C 62 69 70 77 7E 85 8C 93 9B A2 A8 AF B6 BD C4 CC D3 DA E1 E8 F0 15 7C 62 A9 1B 8B 4C 2E 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 0A 00 03 E4 00 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 01 00 00 14 00 02 E4 00 + 39 01 00 00 14 00 20 E5 00 00 0B 08 01 00 00 00 00 00 00 05 1D 19 1F 05 ED 09 20 00 00 04 0B 02 01 08 08 07 02 04 02 + 39 01 00 00 14 00 16 E6 00 08 00 05 05 10 10 10 20 20 20 10 10 10 10 10 03 A0 01 0F 11 + 39 01 00 00 14 00 03 E4 00 41]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_lp_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 12 1C 25 2E 37 3F 46 4D 53 59 5F 66 6C 73 7A 81 88 8F 96 9D A3 AA B1 B7 BE C6 CD D4 DB E2 EA 1D BF 9F DE 01 C9 3D 55 00 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 08 11 19 22 2C 36 3E 44 4B 52 58 5D 64 6B 71 78 7F 86 8C 94 9A A0 A7 AD B4 BB C2 C9 D0 D7 DD E4 37 A0 F1 E7 03 6E DA 57 C0 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command02 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 12 1B 24 2D 36 3E 44 4B 51 57 5D 63 6A 70 77 7D 84 8C 93 99 9F A6 AC B3 BA C1 C8 CF D6 DC E4 06 B9 EF 77 7C 1C D6 53 40 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 08 10 18 21 2A 33 3B 41 48 4E 54 59 60 66 6C 72 79 80 86 8D 93 99 A0 A6 AC B3 B9 C0 C7 CD D3 DA 1B 28 D5 86 D2 A8 03 0B 80 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command03 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 08 11 1B 23 2C 35 3C 43 4A 50 55 5B 61 68 6E 74 7B 82 89 90 96 9C A2 A9 AF B6 BD C4 CB D1 D8 DF 3C FB 83 B2 D0 0B 66 0D C0 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 08 0F 17 1F 28 31 38 3E 45 4A 50 55 5B 61 67 6D 73 79 80 86 8C 92 98 9E A4 AA B1 B7 BD C3 C9 D0 0E 65 89 AA 6D E6 0C 2F 40 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command04 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 08 11 1A 23 2B 34 3B 41 48 4E 53 59 5F 65 6B 71 78 7E 85 8C 92 98 9E A5 AB B1 B8 BF C5 CC D2 DA 29 21 C3 5A DE 9A 1F 7B 00 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 07 0F 16 1D 26 2E 35 3B 41 46 4C 51 57 5C 62 67 6D 73 79 80 85 8B 90 96 9B A2 A8 AE B4 BA BF C6 21 EE AD 4D FF 63 75 13 00 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command05 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 08 11 19 22 2A 33 3A 40 46 4C 52 57 5D 63 69 6F 75 7C 82 89 8F 95 9B A1 A7 AE B4 BB C1 C8 CE D5 13 70 64 55 63 95 A3 21 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 07 0E 15 1C 24 2C 32 38 3E 43 48 4D 52 57 5D 62 68 6D 73 79 7E 83 89 8E 93 99 9F A5 AA B0 B5 BB 05 67 85 2D 8E AD BE 3B 80 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command06 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 08 10 19 21 29 31 38 3E 44 4A 4F 55 5A 60 66 6C 72 78 7F 85 8B 91 97 9D A3 A9 B0 B6 BC C2 C8 CF 08 6A B7 3E AD E5 44 6F C0 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0D 14 1A 22 29 30 35 3A 3F 44 48 4D 53 58 5D 62 67 6D 72 77 7C 81 86 8B 91 96 9B A1 A6 AB B1 34 EC 79 F0 1C EB A7 DF 40 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command07 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 07 10 18 20 28 30 36 3C 42 48 4D 52 58 5D 63 69 6E 75 7B 81 87 8C 92 98 9E A4 AA B0 B6 BC C2 C9 31 53 A1 49 31 8D 42 AA 40 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0C 13 19 21 28 2E 33 38 3C 41 45 4A 4F 54 59 5E 63 68 6E 72 77 7C 80 85 8B 90 95 9A 9F A4 A9 2D 80 1D A9 16 25 F1 6E C0 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command08 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 07 0F 17 1F 27 2E 35 3B 40 46 4B 50 55 5B 60 66 6B 71 77 7E 83 88 8E 94 99 9F A5 AB B1 B7 BD C3 3A 4D 30 22 3F 1D 2B A4 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0C 12 18 1F 25 2B 30 35 39 3D 41 46 4B 4F 54 59 5D 62 67 6C 70 75 79 7E 83 88 8D 92 96 9B A0 00 1D 4B E2 0F DA D9 0D 40 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-panel-timings = [8C 20 14 00 46 48 1A 22 18 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-reset-sequence = <1 50>, <0 20>, <1 5>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-tx-eot-append; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 01 D9 + 06 01 00 01 05 00 01 09 + ]; + qcom,mdss-dsi-panel-status-command-num = <2>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-read-length = <4 4>; + qcom,mdss-dsi-panel-status-valid-params = <1 3>; + qcom,mdss-dsi-panel-status-value = + <0x80 0x80 0x73 0x04 >, + <0x80 0x80 0x73 0x04 >; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-720p-video.dtsi new file mode 100644 index 0000000000000..6efda422408a6 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-720p-video.dtsi @@ -0,0 +1,818 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_ebbg_720p_video: qcom,mdss_dsi_ili9881c_ebbg_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_Ebbg"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <114>; + qcom,mdss-dsi-h-back-porch = <180>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <10>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 00 00 00 00 00 05 FF 98 81 00 FF + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 00 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 B4 00 02 11 00 + 39 00 00 00 00 00 02 29 00 + 39 00 00 00 0A 00 02 35 00 + 39 00 00 00 00 00 03 51 0F FF + 39 00 00 00 00 00 02 53 2C + 39 00 00 00 00 00 02 55 00 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 03 5E 00 FF + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 04 16 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 40 + 39 00 00 00 00 00 02 07 04 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + qcom,mdss-dsi-off-command = [ + 39 00 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 00 + 05 00 00 00 0A 00 02 28 00 + 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1A + 39 00 00 00 00 00 02 A2 29 + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2B + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 8D + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 76 + 39 00 00 00 00 00 02 AC 1A + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 29 + 39 00 00 00 00 00 02 B1 4F + 39 00 00 00 00 00 02 B2 5D + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1A + 39 00 00 00 00 00 02 C2 29 + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2B + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 8D + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 76 + 39 00 00 00 00 00 02 CC 1A + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 4F + 39 00 00 00 00 00 02 D2 5D + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 28 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 39 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 4C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 5F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 73 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 A6 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 B6 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 C6 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D F7 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 08 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 18 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 37 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 48 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 58 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 69 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 79 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 89 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 98 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A8 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B7 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D6 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 F5 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 14 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 34 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 53 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 71 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 91 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 AC + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C9 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 E6 + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 26 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 43 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 63 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 81 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A1 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BF + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E5 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B FF + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 12 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 42 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 52 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AD + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BB + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C8 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D7 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F E8 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 F8 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 07 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 16 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 23 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 30 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 3E + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 4C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 5A + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 68 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 77 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 A0 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 BB + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D6 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F1 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0C + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 45 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 5E + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 78 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 95 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B B3 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D CC + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F E6 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 00 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 1E + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 39 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 53 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 70 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 8A + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 41 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4C + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 56 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 64 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 73 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 9B + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AA + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B8 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C4 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 E0 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 EF + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 0B + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 18 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 24 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 31 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3D + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 4A + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 58 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 65 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 7F + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 98 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B1 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D C9 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F E2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 FA + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 2D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 47 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 5E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 76 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F AB + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 C4 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 DA + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 F2 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 0C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 27 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 3E + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + + qcom,mdss-dsi-panel-cool-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 19 + 39 00 00 00 00 00 02 A5 2C + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 95 + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 27 + 39 00 00 00 00 00 02 AB 7F + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 27 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 63 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 19 + 39 00 00 00 00 00 02 C5 2C + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 95 + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 27 + 39 00 00 00 00 00 02 CB 7F + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 27 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 63 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 18 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 29 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 3A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 4C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 5E + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 71 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 92 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 A4 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 B4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 C5 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D FB + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 08 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 18 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 37 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 46 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 57 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 67 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 78 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 88 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A7 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B6 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D5 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 F4 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 13 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 34 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 53 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 70 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 8F + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 B0 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 CE + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 EB + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 4B 0B + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 2D + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 49 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 6A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A7 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C6 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E2 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 13 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 25 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 57 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 67 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 78 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 87 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 96 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A7 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F7 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 17 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 25 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 33 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 42 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 61 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 70 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 7F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 8E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 9C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B9 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F4 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 32 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 4F + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 6A + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 A6 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 C4 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B DE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D FB + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 1A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 37 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 53 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 72 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 8E + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B C9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 61 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A2 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B2 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C1 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D0 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F2 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 03 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 12 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 20 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 2E + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 3B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 4B + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 5A + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 69 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 78 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 87 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B1 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 CE + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B EC + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 0A + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 29 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 47 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 61 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 7D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 9B + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 BA + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B D4 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D EF + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 0C + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 2C + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 46 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 64 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 80 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 9E + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B BA + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-nature-command = [39 01 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 02 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 11 00 + 39 01 00 00 00 00 04 FF 98 81 03 + 39 01 00 00 00 00 04 FF 98 81 03 + 39 01 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-init-last; + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 55 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 02 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 00 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 04 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 55 01]; + + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <20000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + + qcom,esd-check-enabled; + + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08 + 06 01 00 01 05 00 02 0D 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1 1>; + qcom,mdss-dsi-panel-status-value = <0x9c 0x00>; + qcom,mdss-dsi-panel-status-read-length = <1 1>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3a-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3a-720p-video.dtsi new file mode 100644 index 0000000000000..b50934b491985 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3a-720p-video.dtsi @@ -0,0 +1,3418 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_ebbg_720p_video: qcom,mdss_dsi_ili9881c_ebbg_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_Ebbg_c3a"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <116>; + qcom,mdss-dsi-h-back-porch = <180>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <10>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 02 E5 00 + 39 01 00 00 0A 00 04 FF 98 81 00 + 39 01 00 00 96 00 02 11 00 + 39 01 00 00 00 00 02 29 00 + 39 01 00 00 0A 00 02 35 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-off-command = [39 00 00 00 00 00 04 FF 98 81 00 + 05 00 00 00 0A 00 02 28 00 + 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 17 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 89 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 74 + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 4F + 39 00 00 00 00 00 02 B2 5D + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 89 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 74 + 39 00 00 00 00 00 02 CC 1B + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 D1 4F + 39 00 00 00 00 00 02 D2 5D + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 13 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 30 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 42 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 95 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F6 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 16 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 24 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 32 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 94 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A4 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C3 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E2 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 02 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1D + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3F + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7B + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BE + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DA + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FA + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1C + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3C + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7B + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BC + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DB + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 29 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 45 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 54 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 62 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 70 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 98 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D0 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 DF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 EE + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 0B + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 18 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 24 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 31 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 4A + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 59 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 67 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 83 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 9E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B9 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D D4 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F EE + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 0A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 26 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 43 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 5C + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 77 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 92 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D AF + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F CA + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 E4 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 21 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 39 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 55 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 70 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0A + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 13 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 25 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 30 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 43 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 51 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7B + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A2 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B0 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E4 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F2 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 0B + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 18 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 23 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 39 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 46 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 60 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 79 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 93 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C5 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 DD + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F6 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 0F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 29 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 43 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 5A + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 73 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A6 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C0 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DB + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 EF + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 0B + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 25 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-cool-command = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 19 + 39 00 00 00 00 00 02 A2 29 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 91 + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 7E + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 51 + 39 00 00 00 00 00 02 AF 26 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 57 + 39 00 00 00 00 00 02 B2 66 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 19 + 39 00 00 00 00 00 02 C2 29 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 91 + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 7E + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 51 + 39 00 00 00 00 00 02 CF 26 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 57 + 39 00 00 00 00 00 02 D2 66 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 27 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B5 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C4 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E9 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F FA + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 17 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 25 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 34 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 42 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 54 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 64 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 74 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A2 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1F + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 41 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5F + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DD + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FB + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 20 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3B + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7C + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C3 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E3 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 12 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 21 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3D + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 5A + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 69 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 77 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 94 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A4 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D1 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F E1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 11 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1F + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 2B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 39 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 47 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 56 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 66 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 75 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 A1 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 BE + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B DB + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F6 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 14 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 33 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 4F + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 6C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 8A + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A9 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B C5 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 00 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 21 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 3F + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 61 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 7C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 9B + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B B6 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 09 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 16 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 26 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 43 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4F + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6D + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 9E + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EC + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FC + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0C + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1A + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 35 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7E + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B9 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D5 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F1 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 65 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D DA + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F6 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 17 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 37 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 56 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 72 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8F + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B AB + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-nature-command = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 02 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 0A 00 02 11 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-init-last; + + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 02 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 00 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 04 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 16 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 23 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 32 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 83 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 93 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 50 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 E9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FA + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 17 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 26 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 33 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 41 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 50 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 5F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D2 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D ED + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0A + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 47 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 61 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 7E + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9C + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BC + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D5 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F1 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 0F + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 2F + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4B + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6A + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 08 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 11 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 20 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2E + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3A + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 44 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 52 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 61 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 70 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8C + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 9A + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C2 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 CF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 DD + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 ED + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 FB + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 09 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 16 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 24 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 30 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 3C + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 49 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 57 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 72 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 8D + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B A8 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D C1 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F DA + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 F3 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 0E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 29 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 44 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 5D + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 76 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 91 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F AE + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 C8 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 DF + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 F9 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 15 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 31 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 4A + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command02 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 16 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 32 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 83 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 93 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 50 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 84 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 92 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DA + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FB + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 18 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 34 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 61 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D3 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0C + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 48 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 64 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 80 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D7 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F3 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 12 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 32 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4E + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6D + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 89 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A8 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 07 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0F + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 1B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 34 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 3D + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 4C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5A + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 68 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 77 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 84 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 91 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 9E + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B8 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C4 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D0 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 DE + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 ED + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FA + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 08 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 14 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 21 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2D + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 38 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 45 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 5E + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 78 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 92 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AA + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 DA + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F2 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 0B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 24 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 40 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 57 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 6E + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 87 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A1 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 BD + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 D2 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 EA + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 03 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 1E + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command03 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 16 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 32 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 50 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DA + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FA + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 18 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 26 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 33 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D3 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0C + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 48 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 63 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 80 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BD + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D7 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F3 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 11 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 31 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4D + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6D + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 88 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A7 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 06 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 15 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 25 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 2F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 36 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 44 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 53 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 61 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 6F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 7C + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 88 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D A1 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F AE + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 BA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 C4 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D0 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 DD + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 EB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B F8 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 11 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 1D + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 28 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 33 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 4A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 63 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 7A + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 94 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F AA + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 C1 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 D8 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 EF + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 1E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 37 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 4F + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 65 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 7B + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 94 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 AD + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 C5 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 D9 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B F0 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command04 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 E9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FA + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 08 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 17 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 26 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 33 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 41 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 4F + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 5F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D1 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D ED + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0A + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 46 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 61 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 7D + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9C + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BB + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D5 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F1 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 0E + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 2F + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4A + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 69 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0A + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 10 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 1E + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 28 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 2D + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 3B + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 4B + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 58 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 65 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 72 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 7E + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 89 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 95 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F A1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 AD + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 B9 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 C3 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 CD + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 D9 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B E6 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D F3 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F FF + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 0B + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 16 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 21 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 35 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 4B + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 62 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 79 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 90 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 A6 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 BB + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 D0 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 E6 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 FB + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 11 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 29 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 40 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 55 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 6A + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 7F + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 96 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 AE + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B C5 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command05 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FA + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 18 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 26 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 33 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 50 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D2 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 29 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 48 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 63 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 7F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BD + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D6 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F2 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 11 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 31 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4D + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 88 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A7 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 09 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 17 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 21 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 25 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 33 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 43 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 51 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 5D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 69 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 75 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 81 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 8B + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 96 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 A2 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 AD + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 B7 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 C1 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 CB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B D6 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D E2 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F EE + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 F9 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 10 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 24 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 37 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 4B + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 62 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 77 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 8C + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 A1 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 B6 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 C9 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 DD + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B F1 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 06 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 1B + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 31 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 46 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 5A + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 6D + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 82 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 97 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command06 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FA + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 18 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 26 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 33 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 50 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D2 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 29 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 48 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 63 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 7F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BD + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D6 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F2 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 11 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 31 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4D + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 88 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A7 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 07 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 0F + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 16 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 18 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 29 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 39 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 47 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 54 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 5F + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 6A + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 76 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 80 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 8A + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 94 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 9F + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 A9 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 B3 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 BD + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B C5 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D CF + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F DA + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 E5 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 F0 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 FA + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 0F + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 22 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 34 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 47 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 5B + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 6F + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 83 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 96 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 A9 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 BC + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B CE + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D E2 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F F4 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 07 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 1A + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 2E + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 43 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 55 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 67 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command07 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1E + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 58 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 67 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 76 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 84 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 92 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A1 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DA + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EB + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FB + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 19 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 34 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 43 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 61 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 70 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7E + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9B + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D4 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F0 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0D + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 64 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 81 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9F + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D8 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F4 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 13 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 33 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4F + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6E + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8A + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 07 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 10 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 14 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 18 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 1C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 2F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 3D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 4A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 56 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 60 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 6B + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 75 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 7F + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 88 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 92 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 9B + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 A5 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 AF + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B B8 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D C0 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F C8 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 D2 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 DC + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 E6 + 39 00 00 00 00 00 02 36 00 + 39 00 00 00 00 00 02 37 FA + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 0E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 1F + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 30 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 41 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 54 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 66 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 79 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 8B + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 9D + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B AE + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D C0 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F D1 + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 51 E3 + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 53 F3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 06 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 18 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 2A + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 3E + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command08 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 18 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1E + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 58 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 76 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 84 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 92 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A1 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DA + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EB + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FB + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 19 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 34 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 43 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 61 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7E + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9B + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D3 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F0 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0C + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 64 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 81 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9F + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D7 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F4 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 13 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 32 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4F + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6E + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8A + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 06 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 08 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 0C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 0F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 12 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 15 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 23 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 32 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 40 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 4C + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 56 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 5F + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 69 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 73 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 7C + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 85 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 8D + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 96 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 A0 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B A9 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D B1 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F BA + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 C1 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 C9 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 D2 + 39 00 00 00 00 00 02 36 00 + 39 00 00 00 00 00 02 37 E4 + 39 00 00 00 00 00 02 38 00 + 39 00 00 00 00 00 02 39 F7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 09 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 1A + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 29 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 39 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 5A + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 6B + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 7C + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B 8D + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D 9E + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F AE + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 51 BE + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 53 CE + 39 00 00 00 00 00 02 54 01 + 39 00 00 00 00 00 02 55 DE + 39 00 00 00 00 00 02 56 01 + 39 00 00 00 00 00 02 57 EE + 39 00 00 00 00 00 02 58 01 + 39 00 00 00 00 00 02 59 FE + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 0F + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 22 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1c>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-pwm-gpio = <&pm8937_mpps 4 0>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3b-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3b-720p-video.dtsi new file mode 100644 index 0000000000000..e221636beb001 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3b-720p-video.dtsi @@ -0,0 +1,3748 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_ebbg_720p_video: qcom,mdss_dsi_ili9881c_ebbg_c3b_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_Ebbg_c3b"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-model = "EBBG HD ILI9881C VIDEO PANEL"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <116>; + qcom,mdss-dsi-h-back-porch = <180>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <10>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 02 E5 00 + 39 01 00 00 0A 00 04 FF 98 81 00 + 39 01 00 00 96 00 02 11 00 + 39 01 00 00 00 00 02 29 00 + 39 01 00 00 0A 00 02 35 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-off-command = [39 00 00 00 00 00 04 FF 98 81 00 + 05 00 00 00 0A 00 02 28 00 + 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 17 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 89 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 74 + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 4F + 39 00 00 00 00 00 02 B2 5D + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 89 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 74 + 39 00 00 00 00 00 02 CC 1B + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 D1 4F + 39 00 00 00 00 00 02 D2 5D + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 13 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 30 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 42 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 95 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F6 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 16 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 24 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 32 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 94 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A4 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C3 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E2 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 02 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1D + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3F + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7B + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BE + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DA + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FA + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1C + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3C + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7B + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BC + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DB + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 29 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 45 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 54 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 62 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 70 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 98 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D0 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 DF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 EE + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 0B + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 18 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 24 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 31 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 4A + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 59 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 67 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 83 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 9E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B9 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D D4 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F EE + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 0A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 26 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 43 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 5C + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 77 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 92 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D AF + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F CA + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 E4 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 21 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 39 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 55 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 70 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0A + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 13 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 25 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 30 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 43 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 51 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7B + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A2 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B0 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E4 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F2 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 0B + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 18 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 23 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 39 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 46 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 60 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 79 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 93 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C5 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 DD + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F6 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 0F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 29 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 43 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 5A + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 73 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A6 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C0 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DB + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 EF + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 0B + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 25 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-cool-command = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 19 + 39 00 00 00 00 00 02 A2 29 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 91 + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 7E + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 51 + 39 00 00 00 00 00 02 AF 26 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 57 + 39 00 00 00 00 00 02 B2 66 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 19 + 39 00 00 00 00 00 02 C2 29 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 91 + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 7E + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 51 + 39 00 00 00 00 00 02 CF 26 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 57 + 39 00 00 00 00 00 02 D2 66 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 27 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B5 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C4 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E9 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F FA + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 17 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 25 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 34 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 42 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 54 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 64 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 74 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A2 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1F + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 41 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5F + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DD + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FB + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 20 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3B + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7C + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C3 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E3 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 12 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 21 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3D + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 5A + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 69 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 77 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 94 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A4 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D1 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F E1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 11 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1F + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 2B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 39 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 47 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 56 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 66 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 75 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 A1 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 BE + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B DB + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F6 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 14 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 33 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 4F + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 6C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 8A + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A9 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B C5 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 00 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 21 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 3F + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 61 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 7C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 9B + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B B6 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 09 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 16 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 26 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 43 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4F + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6D + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 9E + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EC + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FC + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0C + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1A + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 35 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7E + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B9 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D5 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F1 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 65 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D DA + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F6 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 17 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 37 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 56 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 72 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8F + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B AB + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-nature-command = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 18 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 17 + 39 00 00 00 00 00 02 A5 2B + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 22 + 39 00 00 00 00 00 02 A8 95 + 39 00 00 00 00 00 02 A9 1B + 39 00 00 00 00 00 02 AA 27 + 39 00 00 00 00 00 02 AB 87 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1F + 39 00 00 00 00 00 02 AE 54 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2C + 39 00 00 00 00 00 02 B1 5C + 39 00 00 00 00 00 02 B2 6A + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 18 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 2B + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 22 + 39 00 00 00 00 00 02 C8 95 + 39 00 00 00 00 00 02 C9 1B + 39 00 00 00 00 00 02 CA 27 + 39 00 00 00 00 00 02 CB 87 + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1F + 39 00 00 00 00 00 02 CE 54 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2C + 39 00 00 00 00 00 02 D1 5C + 39 00 00 00 00 00 02 D2 6A + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 26 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 58 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 69 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 7B + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 8C + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 9D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 AF + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 BE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D F5 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 19 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 34 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 44 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 55 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 66 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 76 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 86 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 95 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A5 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B4 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 EF + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 0E + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 2D + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 4B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 69 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 A9 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C4 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DF + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 20 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3F + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5D + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7C + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C2 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DF + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 14 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 30 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 40 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 5E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 6E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 7E + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8C + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9C + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AC + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BB + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D9 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 2A + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 37 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 46 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 56 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 66 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 74 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 91 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 AD + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 C8 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B E4 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 1B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 38 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 53 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 6D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 89 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A6 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B C4 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D E0 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F FB + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 1B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 39 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 54 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 71 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8C + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 11 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 19 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2F + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4D + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5D + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 80 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DD + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0E + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1D + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 2B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 38 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 47 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 56 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 65 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 73 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 81 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D1 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EB + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 05 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 20 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 3C + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 55 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 70 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 8A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B A7 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D C4 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F DD + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 F8 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 14 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 32 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 4B + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 67 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 81 + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 02 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 0A 00 02 11 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-init-last; + + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 6a 06 + 39 00 00 00 00 00 02 6b 06 + 39 00 00 00 00 00 02 6c 06 + 39 00 00 00 00 00 02 6D 06 + 39 00 00 00 00 00 02 6E 06 + 39 00 00 00 00 00 02 6F 06 + 39 00 00 00 00 00 02 70 06 + 39 00 00 00 00 00 02 71 06 + 39 00 00 00 00 00 02 72 06 + 39 00 00 00 00 00 02 73 06 + 39 00 00 00 00 00 02 74 06 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 76 06 + 39 00 00 00 00 00 02 77 06 + 39 00 00 00 00 00 02 78 06 + 39 00 00 00 00 00 02 79 06 + 39 00 00 00 00 00 02 7A 06 + 39 00 00 00 00 00 02 7B 06 + 39 00 00 00 00 00 02 7C 06 + 39 00 00 00 00 00 02 7D 06 + 39 00 00 00 00 00 02 7E 05 + 39 00 00 00 00 00 02 7F 05 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 52 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 61 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 7F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CA + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FB + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 33 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 74 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 48 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 55 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 63 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 71 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 99 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F CE + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 DD + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 ED + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FB + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 09 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 16 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 23 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 2F + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3B + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 49 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 58 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 67 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 A0 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B BC + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D D8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F F4 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 11 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 2E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 4C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 69 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B A7 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D C6 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F E1 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 1E + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 3C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 59 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 77 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 93 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 1B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 39 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 44 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 52 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 60 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8A + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 98 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BF + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 CB + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D9 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E8 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F5 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 03 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 10 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 1C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 28 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 33 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 3F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 4C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 69 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 84 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D B8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F D3 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 EC + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 22 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 3F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 75 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 92 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F B0 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 CB + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 E5 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 01 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 21 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 3A + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 55 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command02 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 18 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FB + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 38 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 46 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 53 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 60 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6D + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7B + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 88 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 95 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D BD + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 D7 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 E6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 F4 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 02 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 0F + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 1C + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 28 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 34 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 40 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 4E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 5D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 79 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 95 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B0 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D CB + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F E6 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 02 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 1E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 3C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 58 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 75 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 93 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D B2 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F CE + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 E9 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 26 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 42 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 5F + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 7B + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0B + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 14 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 27 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 34 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 3E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 4C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5A + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 69 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 77 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 90 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AB + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B7 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C3 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 CE + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 DC + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 EA + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F7 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 04 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 10 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 1C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 27 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 32 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 3C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 57 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 71 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 8B + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D A5 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F BE + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 D7 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F0 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 09 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 23 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 3E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 58 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 72 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8E + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 AA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C5 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DE + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 F7 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 15 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 31 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command03 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 19 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 25 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 37 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 45 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 52 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6B + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 79 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 86 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 92 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B AD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D BA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 D4 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 E1 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 F0 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 FE + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 0B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 17 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 24 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 2F + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 3B + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 48 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 56 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 72 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 8D + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B A9 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D C3 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F DE + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 F9 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 31 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 4D + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 69 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 85 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D A4 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F C2 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 DC + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 F7 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 14 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 33 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 4E + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 6C + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 16 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 22 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 2F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 38 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 47 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 55 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 63 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 70 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 7D + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 96 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D A2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F AF + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 BA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 C6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D1 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 DE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 EB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B F8 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 10 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 1B + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 26 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 30 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 46 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 5F + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 79 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 92 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F AA + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 C2 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 DA + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 F2 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 0A + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 23 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 3D + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 56 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 6E + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 88 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 A3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 BF + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 D5 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 EE + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command04 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1A + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 26 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 63 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1B + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 29 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 43 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 50 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 69 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 76 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8E + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 9C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C2 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 CD + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 DB + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E9 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F7 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 04 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 10 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 1C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 28 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 33 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 3F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 4D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 68 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 83 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D B8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F D2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 EB + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 06 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 21 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 3E + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 58 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 74 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F AF + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 CA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 E3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 1C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 39 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 53 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 09 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 11 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 1B + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 29 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 31 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 41 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 50 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 5C + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 69 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 76 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 8D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 99 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F A6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 B1 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 BC + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 C7 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 D2 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 DE + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B EB + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D F7 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 03 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 0E + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 19 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 23 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 37 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 4D + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 66 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 7E + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 95 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 AC + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 C2 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 D9 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 F0 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 07 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 1F + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 38 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 4F + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 67 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 7F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 99 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 B3 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 CA + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B E0 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command05 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 27 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 45 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 63 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 73 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1A + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 28 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 34 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 42 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 66 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 73 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 80 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8B + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 98 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BD + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E3 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F1 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FE + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 0A + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 16 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 22 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2D + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 38 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 44 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 5F + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 79 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 94 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C7 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 E0 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F9 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 14 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 2F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 4A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 64 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 7F + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 9C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 BA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 D2 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 EC + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 07 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 24 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 3F + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 03 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 08 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 16 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 21 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 2A + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 3A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 49 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 56 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 63 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 6F + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 7B + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 86 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 91 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 9D + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 A8 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 B3 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 BD + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 C8 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 D2 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B DE + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D EA + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F F5 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 01 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 0C + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 16 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 2A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 3C + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 53 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 6B + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 81 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 97 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 AD + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 C2 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 D8 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 ED + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 03 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 31 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 48 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 5F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 75 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 8D + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 A5 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B BF + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command06 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 28 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 37 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 45 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 55 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 73 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 90 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1A + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 27 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 33 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 40 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4C + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 58 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 64 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 71 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 88 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AE + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C5 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D0 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 DD + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 EB + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F8 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 10 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 1C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 27 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 32 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 3D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 57 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 71 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 8A + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D A4 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F BD + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 D5 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 EE + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 21 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 3D + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 56 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 70 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A7 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DB + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 F4 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 11 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 2E + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 06 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 11 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 19 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 22 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 33 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 43 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 51 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 5C + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 68 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 74 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 7F + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 89 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 94 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 9F + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 AA + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 B5 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 BE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 C8 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B D2 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D DD + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F E9 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 F4 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 FE + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 09 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 1C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 2F + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 41 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 57 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 6D + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 83 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 98 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 AD + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 D6 + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B EA + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 14 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 2A + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 40 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 56 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 6B + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 81 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 99 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command07 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1C + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 29 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 37 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 55 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 90 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AF + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0C + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 19 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 26 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 32 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3E + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4B + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 56 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 62 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 91 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C1 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 CB + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D8 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 E5 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F2 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 0B + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 16 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 21 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 2C + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 36 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 4E + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 68 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 81 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 9A + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F B2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 CA + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 E2 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 FB + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 14 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 2E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 48 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 62 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 7B + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 97 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 B3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 CC + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 E3 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 FD + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 17 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 05 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 07 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 0A + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 14 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 2A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 3C + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 4A + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 56 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 61 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 6C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 77 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 81 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 8B + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 95 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 A0 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 AA + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 B4 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 BD + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B C7 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D D0 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F DA + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 E5 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 F0 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 FA + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 0E + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 20 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 31 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 43 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 58 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 6D + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 81 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 95 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 A9 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 BD + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B D0 + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F F7 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 0B + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 1F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 34 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 49 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 5D + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 71 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command08 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1F + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 38 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 56 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A0 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AF + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CC + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DB + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0D + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 64 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 24 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 30 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3C + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 49 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 54 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6A + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 77 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 8C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 99 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D A5 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 BC + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 C6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D2 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 DE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 EB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B F7 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 0F + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 1A + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 25 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 2F + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 44 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 5E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 76 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 8E + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F A6 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 BE + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 D5 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 EC + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 04 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 1D + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 37 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 50 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 68 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 81 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 9C + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 B8 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 CF + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 E6 + 39 00 00 00 00 00 02 5A 02 + 39 01 00 00 00 00 02 5B FF + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 11 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 17 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 1B + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 1F + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 33 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 42 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 4F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 59 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 64 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 6E + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 79 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 82 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 8B + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 95 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 9F + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 A9 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 B3 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B BB + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D C4 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F CC + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 D7 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 E0 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 EB + 39 00 00 00 00 00 02 36 00 + 39 00 00 00 00 00 02 37 FE + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 10 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 21 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 31 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 42 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 55 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 6A + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 7D + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 90 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 A2 + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B B4 + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D C7 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F D9 + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 51 EB + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 53 FE + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 11 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 24 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 39 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 4B + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 22 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1c>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-pwm-gpio = <&pm8937_mpps 4 0>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi new file mode 100644 index 0000000000000..a55a2fe3aa615 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi @@ -0,0 +1,819 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_ebbgDJN_720p_video: qcom,mdss_dsi_ili9881c_ebbgDJN_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_EbbgDJN"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <114>; + qcom,mdss-dsi-h-back-porch = <180>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <10>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 00 00 00 00 00 05 FF 98 81 00 FF + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 00 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 B4 00 02 11 00 + 39 00 00 00 00 00 02 29 00 + 39 00 00 00 0A 00 02 35 00 + 39 00 00 00 00 00 03 51 0F FF + 39 00 00 00 00 00 02 53 2C + 39 00 00 00 00 00 02 55 00 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 03 5E 00 FF + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 04 16 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 40 + 39 00 00 00 00 00 02 07 04 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + qcom,mdss-dsi-off-command = [ + 39 00 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 00 + 05 00 00 00 0A 00 02 28 00 + 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1A + 39 00 00 00 00 00 02 A2 29 + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2B + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 8D + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 76 + 39 00 00 00 00 00 02 AC 1A + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 29 + 39 00 00 00 00 00 02 B1 4F + 39 00 00 00 00 00 02 B2 5D + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1A + 39 00 00 00 00 00 02 C2 29 + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2B + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 8D + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 76 + 39 00 00 00 00 00 02 CC 1A + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 4F + 39 00 00 00 00 00 02 D2 5D + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 28 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 39 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 4C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 5F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 73 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 A6 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 B6 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 C6 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D F7 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 08 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 18 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 37 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 48 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 58 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 69 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 79 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 89 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 98 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A8 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B7 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D6 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 F5 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 14 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 34 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 53 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 71 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 91 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 AC + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C9 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 E6 + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 26 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 43 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 63 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 81 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A1 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BF + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E5 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B FF + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 12 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 42 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 52 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AD + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BB + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C8 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D7 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F E8 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 F8 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 07 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 16 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 23 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 30 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 3E + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 4C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 5A + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 68 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 77 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 A0 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 BB + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D6 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F1 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0C + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 45 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 5E + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 78 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 95 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B B3 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D CC + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F E6 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 00 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 1E + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 39 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 53 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 70 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 8A + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 41 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4C + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 56 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 64 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 73 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 9B + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AA + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B8 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C4 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 E0 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 EF + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 0B + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 18 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 24 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 31 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3D + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 4A + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 58 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 65 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 7F + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 98 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B1 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D C9 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F E2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 FA + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 2D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 47 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 5E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 76 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F AB + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 C4 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 DA + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 F2 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 0C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 27 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 3E + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + + qcom,mdss-dsi-panel-cool-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 19 + 39 00 00 00 00 00 02 A5 2C + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 95 + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 27 + 39 00 00 00 00 00 02 AB 7F + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 27 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 63 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 19 + 39 00 00 00 00 00 02 C5 2C + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 95 + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 27 + 39 00 00 00 00 00 02 CB 7F + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 27 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 63 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 18 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 29 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 3A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 4C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 5E + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 71 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 92 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 A4 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 B4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 C5 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D FB + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 08 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 18 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 37 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 46 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 57 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 67 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 78 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 88 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A7 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B6 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D5 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 F4 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 13 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 34 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 53 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 70 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 8F + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 B0 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 CE + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 EB + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 4B 0B + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 2D + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 49 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 6A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A7 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C6 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E2 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 13 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 25 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 57 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 67 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 78 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 87 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 96 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A7 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F7 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 17 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 25 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 33 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 42 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 61 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 70 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 7F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 8E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 9C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B9 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F4 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 32 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 4F + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 6A + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 A6 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 C4 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B DE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D FB + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 1A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 37 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 53 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 72 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 8E + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B C9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 61 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A2 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B2 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C1 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D0 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F2 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 03 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 12 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 20 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 2E + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 3B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 4B + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 5A + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 69 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 78 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 87 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B1 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 CE + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B EC + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 0A + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 29 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 47 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 61 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 7D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 9B + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 BA + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B D4 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D EF + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 0C + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 2C + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 46 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 64 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 80 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 9E + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B BA + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-nature-command = [39 01 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 02 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 11 00 + 39 01 00 00 00 00 04 FF 98 81 03 + 39 01 00 00 00 00 04 FF 98 81 03 + 39 01 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-init-last; + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 55 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 02 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 00 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 04 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 55 01]; + + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <20000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + qcom,mdss-night-brightness = <8 26 46 68>; + + qcom,esd-check-enabled; + + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08 + 06 01 00 01 05 00 02 0D 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1 1>; + qcom,mdss-dsi-panel-status-value = <0x9c 0x00>; + qcom,mdss-dsi-panel-status-read-length = <1 1>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-c3b-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-c3b-720p-video.dtsi new file mode 100644 index 0000000000000..61d549f4fadb3 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-c3b-720p-video.dtsi @@ -0,0 +1,3748 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_ebbgDJN_720p_video: qcom,mdss_dsi_ili9881c_ebbgDJN_c3b_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_EbbgDJN_c3b"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <112>; + qcom,mdss-dsi-h-back-porch = <180>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <12>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 02 E5 00 + 39 01 00 00 0A 00 04 FF 98 81 00 + 39 01 00 00 96 00 02 11 00 + 39 01 00 00 00 00 02 29 00 + 39 01 00 00 0A 00 02 35 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-off-command = [39 00 00 00 00 00 04 FF 98 81 00 + 05 00 00 00 0A 00 02 28 00 + 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 17 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 89 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 74 + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 4F + 39 00 00 00 00 00 02 B2 5D + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 89 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 74 + 39 00 00 00 00 00 02 CC 1B + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 D1 4F + 39 00 00 00 00 00 02 D2 5D + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 13 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 30 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 42 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 95 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F6 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 16 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 24 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 32 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 82 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 94 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A4 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C3 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E2 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 02 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1D + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3F + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7B + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BE + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DA + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FA + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1C + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3C + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7B + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BC + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DB + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 29 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 45 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 54 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 62 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 70 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 98 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D0 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 DF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 EE + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 0B + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 18 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 24 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 31 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 4A + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 59 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 67 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 83 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 9E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B9 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D D4 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F EE + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 0A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 26 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 43 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 5C + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 77 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 92 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D AF + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F CA + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 E4 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 21 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 39 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 55 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 70 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0A + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 13 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 25 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 30 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 43 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 51 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7B + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A2 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B0 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E4 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F2 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 0B + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 18 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 23 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2F + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 39 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 46 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 60 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 79 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 93 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C5 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 DD + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F6 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 0F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 29 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 43 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 5A + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 73 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A6 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C0 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DB + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 EF + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 0B + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 25 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-cool-command = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 19 + 39 00 00 00 00 00 02 A2 29 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 91 + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 7E + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 51 + 39 00 00 00 00 00 02 AF 26 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 57 + 39 00 00 00 00 00 02 B2 66 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 19 + 39 00 00 00 00 00 02 C2 29 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 91 + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 7E + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 51 + 39 00 00 00 00 00 02 CF 26 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 57 + 39 00 00 00 00 00 02 D2 66 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 27 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B5 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C4 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E9 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F FA + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 17 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 25 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 34 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 42 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 54 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 64 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 74 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A2 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1F + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 41 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5F + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DD + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FB + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 20 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3B + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7C + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C3 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E3 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 12 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 21 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3D + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 5A + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 69 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 77 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 94 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A4 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D1 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F E1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 11 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1F + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 2B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 39 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 47 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 56 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 66 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 75 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 A1 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 BE + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B DB + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F6 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 14 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 33 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 4F + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 6C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 8A + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A9 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B C5 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 00 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 21 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 3F + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 61 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 7C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 9B + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B B6 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 09 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 16 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 26 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 43 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4F + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6D + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 9E + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EC + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FC + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0C + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1A + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 35 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7E + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B9 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D5 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F1 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 65 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D DA + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F6 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 17 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 37 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 56 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 72 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8F + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B AB + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-nature-command = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 18 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 17 + 39 00 00 00 00 00 02 A5 2B + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 22 + 39 00 00 00 00 00 02 A8 95 + 39 00 00 00 00 00 02 A9 1B + 39 00 00 00 00 00 02 AA 27 + 39 00 00 00 00 00 02 AB 87 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1F + 39 00 00 00 00 00 02 AE 54 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2C + 39 00 00 00 00 00 02 B1 5C + 39 00 00 00 00 00 02 B2 6A + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 18 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 2B + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 22 + 39 00 00 00 00 00 02 C8 95 + 39 00 00 00 00 00 02 C9 1B + 39 00 00 00 00 00 02 CA 27 + 39 00 00 00 00 00 02 CB 87 + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1F + 39 00 00 00 00 00 02 CE 54 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2C + 39 00 00 00 00 00 02 D1 5C + 39 00 00 00 00 00 02 D2 6A + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 26 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 58 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 69 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 7B + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 8C + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 9D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 AF + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 BE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D F5 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 19 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 34 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 44 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 55 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 66 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 76 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 86 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 95 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A5 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B4 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 EF + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 0E + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 2D + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 4B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 69 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 A9 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C4 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DF + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 20 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3F + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5D + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7C + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C2 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DF + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 14 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 30 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 40 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 5E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 6E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 7E + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8C + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9C + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AC + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BB + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D9 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 2A + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 37 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 46 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 56 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 66 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 74 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 91 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 AD + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 C8 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B E4 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 1B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 38 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 53 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 6D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 89 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A6 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B C4 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D E0 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F FB + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 1B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 39 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 54 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 71 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8C + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 11 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 19 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2F + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4D + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5D + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 80 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DD + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0E + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1D + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 2B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 38 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 47 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 56 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 65 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 73 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 81 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D1 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EB + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 05 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 20 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 3C + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 55 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 70 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 8A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B A7 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D C4 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F DD + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 F8 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 14 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 32 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 4B + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 67 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 81 + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 02 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 0A 00 02 11 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-init-last; + + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 6a 06 + 39 00 00 00 00 00 02 6b 06 + 39 00 00 00 00 00 02 6c 06 + 39 00 00 00 00 00 02 6D 06 + 39 00 00 00 00 00 02 6E 06 + 39 00 00 00 00 00 02 6F 06 + 39 00 00 00 00 00 02 70 06 + 39 00 00 00 00 00 02 71 06 + 39 00 00 00 00 00 02 72 06 + 39 00 00 00 00 00 02 73 06 + 39 00 00 00 00 00 02 74 06 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 76 06 + 39 00 00 00 00 00 02 77 06 + 39 00 00 00 00 00 02 78 06 + 39 00 00 00 00 00 02 79 06 + 39 00 00 00 00 00 02 7A 06 + 39 00 00 00 00 00 02 7B 06 + 39 00 00 00 00 00 02 7C 06 + 39 00 00 00 00 00 02 7D 06 + 39 00 00 00 00 00 02 7E 05 + 39 00 00 00 00 00 02 7F 05 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 52 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 61 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 7F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CA + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FB + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 33 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 74 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 48 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 55 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 63 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 71 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 99 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F CE + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 DD + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 ED + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FB + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 09 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 16 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 23 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 2F + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3B + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 49 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 58 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 67 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 A0 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B BC + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D D8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F F4 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 11 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 2E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 4C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 69 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B A7 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D C6 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F E1 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 1E + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 3C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 59 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 77 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 93 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 1B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 39 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 44 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 52 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 60 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8A + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 98 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BF + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 CB + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D9 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E8 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F5 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 03 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 10 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 1C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 28 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 33 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 3F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 4C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 69 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 84 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D B8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F D3 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 EC + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 22 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 3F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 75 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 92 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F B0 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 CB + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 E5 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 01 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 21 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 3A + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 55 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + qcom,mdss-dsi-panel-eye-command02 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 18 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FB + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 38 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 46 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 53 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 60 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6D + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7B + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 88 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 95 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D BD + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 D7 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 E6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 F4 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 02 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 0F + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 1C + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 28 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 34 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 40 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 4E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 5D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 79 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 95 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B0 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D CB + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F E6 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 02 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 1E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 3C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 58 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 75 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 93 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D B2 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F CE + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 E9 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 26 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 42 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 5F + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 7B + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0B + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 14 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 27 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 34 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 3E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 4C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5A + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 69 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 77 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 90 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AB + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B7 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C3 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 CE + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 DC + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 EA + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F7 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 04 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 10 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 1C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 27 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 32 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 3C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 57 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 71 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 8B + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D A5 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F BE + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 D7 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F0 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 09 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 23 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 3E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 58 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 72 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8E + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 AA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C5 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DE + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 F7 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 15 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 31 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command03 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 19 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 25 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 37 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 45 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 52 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6B + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 79 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 86 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 92 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B AD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D BA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 D4 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 E1 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 F0 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 FE + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 0B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 17 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 24 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 2F + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 3B + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 48 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 56 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 72 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 8D + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B A9 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D C3 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F DE + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 F9 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 31 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 4D + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 69 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 85 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D A4 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F C2 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 DC + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 F7 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 14 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 33 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 4E + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 6C + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 16 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 22 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 2F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 38 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 47 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 55 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 63 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 70 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 7D + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 96 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D A2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F AF + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 BA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 C6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D1 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 DE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 EB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B F8 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 10 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 1B + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 26 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 30 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 46 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 5F + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 79 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 92 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F AA + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 C2 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 DA + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 F2 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 0A + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 23 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 3D + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 56 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 6E + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 88 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 A3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 BF + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 D5 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 EE + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command04 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1A + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 26 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 63 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1B + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 29 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 43 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 50 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 69 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 76 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8E + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 9C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C2 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 CD + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 DB + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E9 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F7 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 04 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 10 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 1C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 28 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 33 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 3F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 4D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 68 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 83 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D B8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F D2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 EB + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 06 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 21 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 3E + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 58 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 74 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F AF + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 CA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 E3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 1C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 39 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 53 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 09 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 11 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 1B + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 29 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 31 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 41 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 50 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 5C + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 69 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 76 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 8D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 99 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F A6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 B1 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 BC + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 C7 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 D2 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 DE + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B EB + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D F7 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 03 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 0E + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 19 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 23 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 37 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 4D + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 66 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 7E + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 95 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 AC + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 C2 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 D9 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 F0 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 07 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 1F + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 38 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 4F + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 67 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 7F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 99 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 B3 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 CA + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B E0 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command05 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 27 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 45 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 63 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 73 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1A + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 28 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 34 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 42 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 66 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 73 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 80 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8B + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 98 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BD + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E3 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F1 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FE + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 0A + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 16 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 22 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2D + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 38 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 44 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 5F + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 79 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 94 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C7 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 E0 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F9 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 14 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 2F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 4A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 64 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 7F + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 9C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 BA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 D2 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 EC + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 07 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 24 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 3F + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 03 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 08 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 16 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 21 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 2A + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 3A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 49 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 56 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 63 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 6F + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 7B + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 86 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 91 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 9D + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 A8 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 B3 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 BD + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 C8 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 D2 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B DE + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D EA + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F F5 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 01 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 0C + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 16 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 2A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 3C + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 53 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 6B + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 81 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 97 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 AD + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 C2 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 D8 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 ED + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 03 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 31 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 48 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 5F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 75 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 8D + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 A5 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B BF + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command06 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 28 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 37 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 45 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 55 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 73 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 90 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1A + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 27 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 33 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 40 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4C + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 58 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 64 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 71 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 88 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AE + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C5 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D0 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 DD + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 EB + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F8 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 10 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 1C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 27 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 32 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 3D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 57 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 71 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 8A + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D A4 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F BD + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 D5 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 EE + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 21 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 3D + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 56 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 70 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A7 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DB + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 F4 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 11 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 2E + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 06 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 11 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 19 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 22 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 33 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 43 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 51 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 5C + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 68 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 74 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 7F + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 89 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 94 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 9F + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 AA + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 B5 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 BE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 C8 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B D2 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D DD + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F E9 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 F4 + 39 01 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 FE + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 09 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 1C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 2F + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 41 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 57 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 6D + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 83 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 98 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 AD + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 D6 + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B EA + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 14 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 2A + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 40 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 56 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 6B + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 81 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 99 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command07 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1C + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 29 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 37 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 55 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 90 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AF + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0C + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 19 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 26 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 32 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3E + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4B + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 56 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 62 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 91 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C1 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 CB + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D8 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 E5 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F2 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 0B + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 16 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 21 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 2C + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 36 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 4E + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 68 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 81 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 9A + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F B2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 CA + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 E2 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 FB + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 14 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 2E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 48 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 62 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 7B + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 97 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 B3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 CC + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 E3 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 FD + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 17 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 05 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 07 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 0A + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 14 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 2A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 3C + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 4A + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 56 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 61 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 6C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 77 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 81 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 8B + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 95 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 A0 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 AA + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 B4 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 BD + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B C7 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D D0 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F DA + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 E5 + 39 01 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 F0 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 FA + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 0E + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 20 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 31 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 43 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 58 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 6D + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 81 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 95 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 A9 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 BD + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B D0 + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F F7 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 0B + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 1F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 34 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 49 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 5D + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 71 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command08 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1F + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 38 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 56 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A0 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AF + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CC + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DB + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0D + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 64 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 24 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 30 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3C + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 49 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 54 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6A + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 77 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 8C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 99 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D A5 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 BC + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 C6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D2 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 DE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 EB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B F7 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 0F + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 1A + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 25 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 2F + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 44 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 5E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 76 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 8E + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F A6 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 BE + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 D5 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 EC + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 04 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 1D + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 37 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 50 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 68 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 81 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 9C + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 B8 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 CF + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 E6 + 39 00 00 00 00 00 02 5A 02 + 39 01 00 00 00 00 02 5B FF + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 11 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 17 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 1B + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 1F + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 33 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 42 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 4F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 59 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 64 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 6E + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 79 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 82 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 8B + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 95 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 9F + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 A9 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 B3 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B BB + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D C4 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F CC + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 D7 + 39 01 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 E0 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 EB + 39 00 00 00 00 00 02 36 00 + 39 00 00 00 00 00 02 37 FE + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 10 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 21 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 31 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 42 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 55 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 6A + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 7D + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 90 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 A2 + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B B4 + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D C7 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F D9 + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 51 EB + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 53 FE + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 11 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 24 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 39 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 4B + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 46 18 20 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1c>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-pwm-gpio = <&pm8937_mpps 4 0>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-tianma-c3b-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-tianma-c3b-720p-video.dtsi new file mode 100644 index 0000000000000..a538d8f776e99 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-tianma-c3b-720p-video.dtsi @@ -0,0 +1,18892 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_tianma_720p_video: qcom,mdss_dsi_ili9881c_tianma_c3b_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_tianma_c3b"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-model = "TIANMA HD ILI9881C VIDEO PANEL"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <112>; + qcom,mdss-dsi-h-back-porch = <160>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <40>; + qcom,mdss-dsi-v-pulse-width = <4>; + + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 78 00 02 11 00 + 39 01 00 00 0A 00 02 29 00 + 39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 02 92 0F + 39 01 00 00 00 00 02 21 B0 + 39 01 00 00 00 00 04 FF 98 81 05 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 7F 81 + 39 01 00 00 00 00 04 FF 98 81 06 + 39 01 00 00 00 00 02 00 81 + 39 01 00 00 00 00 02 7F 83 + 39 01 00 00 00 00 04 FF 98 81 07 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 7F 89 + 39 01 00 00 00 00 04 FF 98 81 08 + 39 01 00 00 00 00 02 00 89 + 39 01 00 00 00 00 02 7F 93 + 39 01 00 00 00 00 04 FF 98 81 09 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 7F 93 + 39 01 00 00 00 00 04 FF 98 81 0A + 39 01 00 00 00 00 02 00 93 + 39 01 00 00 00 00 02 7F b3 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-off-command = [39 00 00 00 00 00 04 FF 98 81 00 + 05 01 00 00 1F 00 02 28 00 + 05 01 00 00 8c 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + + + qcom,mdss-dsi-panel-nature-command = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 03 + 39 00 00 00 00 00 02 09 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 03 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 25 04 + 39 00 00 00 00 00 02 26 04 + 39 00 00 00 00 00 02 27 04 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 2B 04 + 39 00 00 00 00 00 02 2C 04 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 30 03 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 32 02 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 34 03 + 39 00 00 00 00 00 02 35 03 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 37 04 + 39 00 00 00 00 00 02 38 04 + 39 00 00 00 00 00 02 39 04 + 39 00 00 00 00 00 02 3A 05 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3D 06 + 39 00 00 00 00 00 02 3E 06 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 48 07 + 39 00 00 00 00 00 02 49 08 + 39 00 00 00 00 00 02 4A 07 + 39 00 00 00 00 00 02 4B 07 + 39 00 00 00 00 00 02 4C 06 + 39 00 00 00 00 00 02 4D 06 + 39 00 00 00 00 00 02 4E 05 + 39 00 00 00 00 00 02 4F 05 + 39 00 00 00 00 00 02 50 05 + 39 00 00 00 00 00 02 51 05 + 39 00 00 00 00 00 02 52 06 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 54 05 + 39 00 00 00 00 00 02 55 05 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 63 03 + 39 00 00 00 00 00 02 64 03 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 68 02 + 39 00 00 00 00 00 02 69 02 + 39 00 00 00 00 00 02 6A 02 + 39 00 00 00 00 00 02 6B 02 + 39 00 00 00 00 00 02 6C 02 + 39 00 00 00 00 00 02 6D 02 + 39 00 00 00 00 00 02 6E 02 + 39 00 00 00 00 00 02 6F 01 + 39 00 00 00 00 00 02 70 01 + 39 00 00 00 00 00 02 71 01 + 39 00 00 00 00 00 02 72 01 + 39 00 00 00 00 00 02 73 00 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 75 00 + 39 00 00 00 00 00 02 76 00 + 39 00 00 00 00 00 02 77 81 + 39 00 00 00 00 00 02 78 81 + 39 00 00 00 00 00 02 79 81 + 39 00 00 00 00 00 02 7A 81 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7E 82 + 39 00 00 00 00 00 02 7F 82 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 11 83 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1C 83 + 39 00 00 00 00 00 02 1D 83 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 23 83 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 28 85 + 39 00 00 00 00 00 02 29 85 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2F 85 + 39 00 00 00 00 00 02 30 86 + 39 00 00 00 00 00 02 31 86 + 39 00 00 00 00 00 02 32 87 + 39 00 00 00 00 00 02 33 87 + 39 00 00 00 00 00 02 34 88 + 39 00 00 00 00 00 02 35 89 + 39 00 00 00 00 00 02 36 88 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 38 87 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 42 85 + 39 00 00 00 00 00 02 43 85 + 39 00 00 00 00 00 02 44 85 + 39 00 00 00 00 00 02 45 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4C 86 + 39 00 00 00 00 00 02 4D 86 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4F 87 + 39 00 00 00 00 00 02 50 88 + 39 00 00 00 00 00 02 51 88 + 39 00 00 00 00 00 02 52 89 + 39 00 00 00 00 00 02 53 89 + 39 00 00 00 00 00 02 54 89 + 39 00 00 00 00 00 02 55 89 + 39 00 00 00 00 00 02 56 89 + 39 00 00 00 00 00 02 57 89 + 39 00 00 00 00 00 02 58 89 + 39 00 00 00 00 00 02 59 89 + 39 00 00 00 00 00 02 5A 89 + 39 00 00 00 00 00 02 5B 89 + 39 00 00 00 00 00 02 5C 89 + 39 00 00 00 00 00 02 5D 89 + 39 00 00 00 00 00 02 5E 8A + 39 00 00 00 00 00 02 5F 8A + 39 00 00 00 00 00 02 60 8A + 39 00 00 00 00 00 02 61 8A + 39 00 00 00 00 00 02 62 8B + 39 00 00 00 00 00 02 63 8B + 39 00 00 00 00 00 02 64 8B + 39 00 00 00 00 00 02 65 8B + 39 00 00 00 00 00 02 66 8B + 39 00 00 00 00 00 02 67 8C + 39 00 00 00 00 00 02 68 8C + 39 00 00 00 00 00 02 69 8C + 39 00 00 00 00 00 02 6A 8C + 39 00 00 00 00 00 02 6B 8D + 39 00 00 00 00 00 02 6C 8D + 39 00 00 00 00 00 02 6D 8D + 39 00 00 00 00 00 02 6E 8D + 39 00 00 00 00 00 02 6F 8E + 39 00 00 00 00 00 02 70 8D + 39 00 00 00 00 00 02 71 8D + 39 00 00 00 00 00 02 72 8E + 39 00 00 00 00 00 02 73 8E + 39 00 00 00 00 00 02 74 8F + 39 00 00 00 00 00 02 75 8F + 39 00 00 00 00 00 02 76 8F + 39 00 00 00 00 00 02 77 90 + 39 00 00 00 00 00 02 78 90 + 39 00 00 00 00 00 02 79 90 + 39 00 00 00 00 00 02 7A 90 + 39 00 00 00 00 00 02 7B 91 + 39 00 00 00 00 00 02 7C 91 + 39 00 00 00 00 00 02 7D 91 + 39 00 00 00 00 00 02 7E 91 + 39 00 00 00 00 00 02 7F 92 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1C 81 + 39 00 00 00 00 00 02 1D 81 + 39 00 00 00 00 00 02 1E 81 + 39 00 00 00 00 00 02 1F 81 + 39 00 00 00 00 00 02 20 82 + 39 00 00 00 00 00 02 21 82 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 23 81 + 39 00 00 00 00 00 02 24 81 + 39 00 00 00 00 00 02 25 82 + 39 00 00 00 00 00 02 26 82 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2E 83 + 39 00 00 00 00 00 02 2F 83 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 31 84 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 3B 84 + 39 00 00 00 00 00 02 3C 84 + 39 00 00 00 00 00 02 3D 83 + 39 00 00 00 00 00 02 3E 83 + 39 00 00 00 00 00 02 3F 83 + 39 00 00 00 00 00 02 40 83 + 39 00 00 00 00 00 02 41 83 + 39 00 00 00 00 00 02 42 82 + 39 00 00 00 00 00 02 43 82 + 39 00 00 00 00 00 02 44 82 + 39 00 00 00 00 00 02 45 82 + 39 00 00 00 00 00 02 46 82 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 48 83 + 39 00 00 00 00 00 02 49 83 + 39 00 00 00 00 00 02 4A 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 50 85 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 57 86 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5C 86 + 39 00 00 00 00 00 02 5D 86 + 39 00 00 00 00 00 02 5E 87 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 60 87 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 62 88 + 39 00 00 00 00 00 02 63 88 + 39 00 00 00 00 00 02 64 88 + 39 00 00 00 00 00 02 65 88 + 39 00 00 00 00 00 02 66 88 + 39 00 00 00 00 00 02 67 89 + 39 00 00 00 00 00 02 68 89 + 39 00 00 00 00 00 02 69 89 + 39 00 00 00 00 00 02 6A 89 + 39 00 00 00 00 00 02 6B 8A + 39 00 00 00 00 00 02 6C 8A + 39 00 00 00 00 00 02 6D 8A + 39 00 00 00 00 00 02 6E 8A + 39 00 00 00 00 00 02 6F 8A + 39 00 00 00 00 00 02 70 8A + 39 00 00 00 00 00 02 71 8B + 39 00 00 00 00 00 02 72 8B + 39 00 00 00 00 00 02 73 8C + 39 00 00 00 00 00 02 74 8C + 39 00 00 00 00 00 02 75 8C + 39 00 00 00 00 00 02 76 8D + 39 00 00 00 00 00 02 77 8D + 39 00 00 00 00 00 02 78 8D + 39 00 00 00 00 00 02 79 8D + 39 00 00 00 00 00 02 7A 8E + 39 00 00 00 00 00 02 7B 8E + 39 00 00 00 00 00 02 7C 8E + 39 00 00 00 00 00 02 7D 8E + 39 00 00 00 00 00 02 7E 8F + 39 00 00 00 00 00 02 7F 8F + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 83 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 17 84 + 39 00 00 00 00 00 02 18 84 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 1B 85 + 39 00 00 00 00 00 02 1C 85 + 39 00 00 00 00 00 02 1D 85 + 39 00 00 00 00 00 02 1E 85 + 39 00 00 00 00 00 02 1F 85 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 21 86 + 39 00 00 00 00 00 02 22 86 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 25 86 + 39 00 00 00 00 00 02 26 86 + 39 00 00 00 00 00 02 27 86 + 39 00 00 00 00 00 02 28 86 + 39 00 00 00 00 00 02 29 86 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2F 84 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 31 85 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 37 87 + 39 00 00 00 00 00 02 38 88 + 39 00 00 00 00 00 02 39 88 + 39 00 00 00 00 00 02 3A 88 + 39 00 00 00 00 00 02 3B 88 + 39 00 00 00 00 00 02 3C 89 + 39 00 00 00 00 00 02 3D 89 + 39 00 00 00 00 00 02 3E 89 + 39 00 00 00 00 00 02 3F 89 + 39 00 00 00 00 00 02 40 89 + 39 00 00 00 00 00 02 41 89 + 39 00 00 00 00 00 02 42 89 + 39 00 00 00 00 00 02 43 89 + 39 00 00 00 00 00 02 44 89 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 47 88 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 50 87 + 39 00 00 00 00 00 02 51 87 + 39 00 00 00 00 00 02 52 88 + 39 00 00 00 00 00 02 53 88 + 39 00 00 00 00 00 02 54 88 + 39 00 00 00 00 00 02 55 88 + 39 00 00 00 00 00 02 56 88 + 39 00 00 00 00 00 02 57 88 + 39 00 00 00 00 00 02 58 88 + 39 00 00 00 00 00 02 59 88 + 39 00 00 00 00 00 02 5A 88 + 39 00 00 00 00 00 02 5B 88 + 39 00 00 00 00 00 02 5C 87 + 39 00 00 00 00 00 02 5D 87 + 39 00 00 00 00 00 02 5E 88 + 39 00 00 00 00 00 02 5F 88 + 39 00 00 00 00 00 02 60 88 + 39 00 00 00 00 00 02 61 89 + 39 00 00 00 00 00 02 62 89 + 39 00 00 00 00 00 02 63 89 + 39 00 00 00 00 00 02 64 89 + 39 00 00 00 00 00 02 65 89 + 39 00 00 00 00 00 02 66 88 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 68 88 + 39 00 00 00 00 00 02 69 87 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 6B 88 + 39 00 00 00 00 00 02 6C 88 + 39 00 00 00 00 00 02 6D 88 + 39 00 00 00 00 00 02 6E 88 + 39 00 00 00 00 00 02 6F 88 + 39 00 00 00 00 00 02 70 88 + 39 00 00 00 00 00 02 71 87 + 39 00 00 00 00 00 02 72 87 + 39 00 00 00 00 00 02 73 87 + 39 00 00 00 00 00 02 74 87 + 39 00 00 00 00 00 02 75 87 + 39 00 00 00 00 00 02 76 87 + 39 00 00 00 00 00 02 77 87 + 39 00 00 00 00 00 02 78 87 + 39 00 00 00 00 00 02 79 87 + 39 00 00 00 00 00 02 7A 87 + 39 00 00 00 00 00 02 7B 87 + 39 00 00 00 00 00 02 7C 86 + 39 00 00 00 00 00 02 7D 86 + 39 00 00 00 00 00 02 7E 87 + 39 00 00 00 00 00 02 7F 87 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 92 + 39 00 00 00 00 00 02 02 92 + 39 00 00 00 00 00 02 03 92 + 39 00 00 00 00 00 02 04 92 + 39 00 00 00 00 00 02 05 92 + 39 00 00 00 00 00 02 06 93 + 39 00 00 00 00 00 02 07 93 + 39 00 00 00 00 00 02 08 93 + 39 00 00 00 00 00 02 09 93 + 39 00 00 00 00 00 02 0A 93 + 39 00 00 00 00 00 02 0B 93 + 39 00 00 00 00 00 02 0C 93 + 39 00 00 00 00 00 02 0D 93 + 39 00 00 00 00 00 02 0E 93 + 39 00 00 00 00 00 02 0F 93 + 39 00 00 00 00 00 02 10 93 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 12 92 + 39 00 00 00 00 00 02 13 93 + 39 00 00 00 00 00 02 14 92 + 39 00 00 00 00 00 02 15 93 + 39 00 00 00 00 00 02 16 93 + 39 00 00 00 00 00 02 17 93 + 39 00 00 00 00 00 02 18 94 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 95 + 39 00 00 00 00 00 02 1B 95 + 39 00 00 00 00 00 02 1C 95 + 39 00 00 00 00 00 02 1D 96 + 39 00 00 00 00 00 02 1E 96 + 39 00 00 00 00 00 02 1F 96 + 39 00 00 00 00 00 02 20 96 + 39 00 00 00 00 00 02 21 97 + 39 00 00 00 00 00 02 22 97 + 39 00 00 00 00 00 02 23 97 + 39 00 00 00 00 00 02 24 97 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 26 98 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 28 98 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 2A 97 + 39 00 00 00 00 00 02 2B 97 + 39 00 00 00 00 00 02 2C 98 + 39 00 00 00 00 00 02 2D 98 + 39 00 00 00 00 00 02 2E 98 + 39 00 00 00 00 00 02 2F 97 + 39 00 00 00 00 00 02 30 97 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 32 97 + 39 00 00 00 00 00 02 33 97 + 39 00 00 00 00 00 02 34 96 + 39 00 00 00 00 00 02 35 96 + 39 00 00 00 00 00 02 36 97 + 39 00 00 00 00 00 02 37 97 + 39 00 00 00 00 00 02 38 98 + 39 00 00 00 00 00 02 39 99 + 39 00 00 00 00 00 02 3A 99 + 39 00 00 00 00 00 02 3B 99 + 39 00 00 00 00 00 02 3C 9A + 39 00 00 00 00 00 02 3D 9A + 39 00 00 00 00 00 02 3E 9B + 39 00 00 00 00 00 02 3F 9B + 39 00 00 00 00 00 02 40 9B + 39 00 00 00 00 00 02 41 9B + 39 00 00 00 00 00 02 42 9B + 39 00 00 00 00 00 02 43 9C + 39 00 00 00 00 00 02 44 9C + 39 00 00 00 00 00 02 45 9C + 39 00 00 00 00 00 02 46 9C + 39 00 00 00 00 00 02 47 9C + 39 00 00 00 00 00 02 48 9C + 39 00 00 00 00 00 02 49 9B + 39 00 00 00 00 00 02 4A 9B + 39 00 00 00 00 00 02 4B 9B + 39 00 00 00 00 00 02 4C 9A + 39 00 00 00 00 00 02 4D 9A + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4F 99 + 39 00 00 00 00 00 02 50 99 + 39 00 00 00 00 00 02 51 98 + 39 00 00 00 00 00 02 52 99 + 39 00 00 00 00 00 02 53 99 + 39 00 00 00 00 00 02 54 9A + 39 00 00 00 00 00 02 55 9B + 39 00 00 00 00 00 02 56 9B + 39 00 00 00 00 00 02 57 9B + 39 00 00 00 00 00 02 58 9C + 39 00 00 00 00 00 02 59 9C + 39 00 00 00 00 00 02 5A 9C + 39 00 00 00 00 00 02 5B 9C + 39 00 00 00 00 00 02 5C 9C + 39 00 00 00 00 00 02 5D 9D + 39 00 00 00 00 00 02 5E 9C + 39 00 00 00 00 00 02 5F 9C + 39 00 00 00 00 00 02 60 9C + 39 00 00 00 00 00 02 61 9C + 39 00 00 00 00 00 02 62 9C + 39 00 00 00 00 00 02 63 9C + 39 00 00 00 00 00 02 64 9D + 39 00 00 00 00 00 02 65 9D + 39 00 00 00 00 00 02 66 9D + 39 00 00 00 00 00 02 67 9E + 39 00 00 00 00 00 02 68 9E + 39 00 00 00 00 00 02 69 9E + 39 00 00 00 00 00 02 6A 9E + 39 00 00 00 00 00 02 6B 9E + 39 00 00 00 00 00 02 6C 9D + 39 00 00 00 00 00 02 6D 9D + 39 00 00 00 00 00 02 6E 9D + 39 00 00 00 00 00 02 6F 9D + 39 00 00 00 00 00 02 70 9E + 39 00 00 00 00 00 02 71 9E + 39 00 00 00 00 00 02 72 9E + 39 00 00 00 00 00 02 73 9E + 39 00 00 00 00 00 02 74 9E + 39 00 00 00 00 00 02 75 9E + 39 00 00 00 00 00 02 76 9E + 39 00 00 00 00 00 02 77 9D + 39 00 00 00 00 00 02 78 9D + 39 00 00 00 00 00 02 79 9D + 39 00 00 00 00 00 02 7A 9D + 39 00 00 00 00 00 02 7B 9E + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7D 9E + 39 00 00 00 00 00 02 7E 9E + 39 00 00 00 00 00 02 7F 9E + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 90 + 39 00 00 00 00 00 02 02 90 + 39 00 00 00 00 00 02 03 90 + 39 00 00 00 00 00 02 04 90 + 39 00 00 00 00 00 02 05 90 + 39 00 00 00 00 00 02 06 90 + 39 00 00 00 00 00 02 07 91 + 39 00 00 00 00 00 02 08 91 + 39 00 00 00 00 00 02 09 91 + 39 00 00 00 00 00 02 0A 91 + 39 00 00 00 00 00 02 0B 91 + 39 00 00 00 00 00 02 0C 91 + 39 00 00 00 00 00 02 0D 91 + 39 00 00 00 00 00 02 0E 91 + 39 00 00 00 00 00 02 0F 91 + 39 00 00 00 00 00 02 10 91 + 39 00 00 00 00 00 02 11 91 + 39 00 00 00 00 00 02 12 91 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 91 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 92 + 39 00 00 00 00 00 02 17 92 + 39 00 00 00 00 00 02 18 93 + 39 00 00 00 00 00 02 19 93 + 39 00 00 00 00 00 02 1A 94 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1C 94 + 39 00 00 00 00 00 02 1D 95 + 39 00 00 00 00 00 02 1E 95 + 39 00 00 00 00 00 02 1F 95 + 39 00 00 00 00 00 02 20 96 + 39 00 00 00 00 00 02 21 96 + 39 00 00 00 00 00 02 22 96 + 39 00 00 00 00 00 02 23 97 + 39 00 00 00 00 00 02 24 97 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 26 97 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 28 98 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 2A 98 + 39 00 00 00 00 00 02 2B 98 + 39 00 00 00 00 00 02 2C 98 + 39 00 00 00 00 00 02 2D 98 + 39 00 00 00 00 00 02 2E 98 + 39 00 00 00 00 00 02 2F 98 + 39 00 00 00 00 00 02 30 98 + 39 00 00 00 00 00 02 31 98 + 39 00 00 00 00 00 02 32 98 + 39 00 00 00 00 00 02 33 98 + 39 00 00 00 00 00 02 34 98 + 39 00 00 00 00 00 02 35 98 + 39 00 00 00 00 00 02 36 99 + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 38 9A + 39 00 00 00 00 00 02 39 9A + 39 00 00 00 00 00 02 3A 9B + 39 00 00 00 00 00 02 3B 9C + 39 00 00 00 00 00 02 3C 9C + 39 00 00 00 00 00 02 3D 9D + 39 00 00 00 00 00 02 3E 9D + 39 00 00 00 00 00 02 3F 9E + 39 00 00 00 00 00 02 40 9E + 39 00 00 00 00 00 02 41 9E + 39 00 00 00 00 00 02 42 9F + 39 00 00 00 00 00 02 43 9F + 39 00 00 00 00 00 02 44 9F + 39 00 00 00 00 00 02 45 A0 + 39 00 00 00 00 00 02 46 A0 + 39 00 00 00 00 00 02 47 A0 + 39 00 00 00 00 00 02 48 A0 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 4A A0 + 39 00 00 00 00 00 02 4B A0 + 39 00 00 00 00 00 02 4C A0 + 39 00 00 00 00 00 02 4D A0 + 39 00 00 00 00 00 02 4E A0 + 39 00 00 00 00 00 02 4F A0 + 39 00 00 00 00 00 02 50 A0 + 39 00 00 00 00 00 02 51 A0 + 39 00 00 00 00 00 02 52 9F + 39 00 00 00 00 00 02 53 9F + 39 00 00 00 00 00 02 54 A0 + 39 00 00 00 00 00 02 55 A1 + 39 00 00 00 00 00 02 56 A1 + 39 00 00 00 00 00 02 57 A2 + 39 00 00 00 00 00 02 58 A3 + 39 00 00 00 00 00 02 59 A4 + 39 00 00 00 00 00 02 5A A4 + 39 00 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 02 5C A5 + 39 00 00 00 00 00 02 5D A5 + 39 00 00 00 00 00 02 5E A6 + 39 00 00 00 00 00 02 5F A6 + 39 00 00 00 00 00 02 60 A6 + 39 00 00 00 00 00 02 61 A7 + 39 00 00 00 00 00 02 62 A7 + 39 00 00 00 00 00 02 63 A7 + 39 00 00 00 00 00 02 64 A7 + 39 00 00 00 00 00 02 65 A7 + 39 00 00 00 00 00 02 66 A8 + 39 00 00 00 00 00 02 67 A9 + 39 00 00 00 00 00 02 68 AA + 39 00 00 00 00 00 02 69 AA + 39 00 00 00 00 00 02 6A AB + 39 00 00 00 00 00 02 6B AB + 39 00 00 00 00 00 02 6C AC + 39 00 00 00 00 00 02 6D AC + 39 00 00 00 00 00 02 6E AD + 39 00 00 00 00 00 02 6F AD + 39 00 00 00 00 00 02 70 AD + 39 00 00 00 00 00 02 71 AD + 39 00 00 00 00 00 02 72 AD + 39 00 00 00 00 00 02 73 AE + 39 00 00 00 00 00 02 74 AF + 39 00 00 00 00 00 02 75 B0 + 39 00 00 00 00 00 02 76 B0 + 39 00 00 00 00 00 02 77 B1 + 39 00 00 00 00 00 02 78 B2 + 39 00 00 00 00 00 02 79 B2 + 39 00 00 00 00 00 02 7A B3 + 39 00 00 00 00 00 02 7B B3 + 39 00 00 00 00 00 02 7C B3 + 39 00 00 00 00 00 02 7D B4 + 39 00 00 00 00 00 02 7E B5 + 39 00 00 00 00 00 02 7F B5 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 82 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 82 + 39 00 00 00 00 00 02 7F 87 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 92 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 92 + 39 00 00 00 00 00 02 7F 9E + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 8F + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 8F + 39 00 00 00 00 00 02 7F B5 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F B5 + 39 00 00 00 00 00 02 7E B5 + 39 00 00 00 00 00 02 7D B4 + 39 00 00 00 00 00 02 7C B3 + 39 00 00 00 00 00 02 7B B3 + 39 00 00 00 00 00 02 7A B3 + 39 00 00 00 00 00 02 79 B2 + 39 00 00 00 00 00 02 78 B2 + 39 00 00 00 00 00 02 77 B1 + 39 00 00 00 00 00 02 76 B0 + 39 00 00 00 00 00 02 75 B0 + 39 00 00 00 00 00 02 74 AF + 39 00 00 00 00 00 02 73 AE + 39 00 00 00 00 00 02 72 AD + 39 00 00 00 00 00 02 71 AD + 39 00 00 00 00 00 02 70 AD + 39 00 00 00 00 00 02 6F AD + 39 00 00 00 00 00 02 6E AD + 39 00 00 00 00 00 02 6D AC + 39 00 00 00 00 00 02 6C AC + 39 00 00 00 00 00 02 6B AB + 39 00 00 00 00 00 02 6A AB + 39 00 00 00 00 00 02 69 AA + 39 00 00 00 00 00 02 68 AA + 39 00 00 00 00 00 02 67 A9 + 39 00 00 00 00 00 02 66 A8 + 39 00 00 00 00 00 02 65 A7 + 39 00 00 00 00 00 02 64 A7 + 39 00 00 00 00 00 02 63 A7 + 39 00 00 00 00 00 02 62 A7 + 39 00 00 00 00 00 02 61 A7 + 39 00 00 00 00 00 02 60 A6 + 39 00 00 00 00 00 02 5F A6 + 39 00 00 00 00 00 02 5E A6 + 39 00 00 00 00 00 02 5D A5 + 39 00 00 00 00 00 02 5C A5 + 39 00 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 02 5A A4 + 39 00 00 00 00 00 02 59 A4 + 39 00 00 00 00 00 02 58 A3 + 39 00 00 00 00 00 02 57 A2 + 39 00 00 00 00 00 02 56 A1 + 39 00 00 00 00 00 02 55 A1 + 39 00 00 00 00 00 02 54 A0 + 39 00 00 00 00 00 02 53 9F + 39 00 00 00 00 00 02 52 9F + 39 00 00 00 00 00 02 51 A0 + 39 00 00 00 00 00 02 50 A0 + 39 00 00 00 00 00 02 4F A0 + 39 00 00 00 00 00 02 4E A0 + 39 00 00 00 00 00 02 4D A0 + 39 00 00 00 00 00 02 4C A0 + 39 00 00 00 00 00 02 4B A0 + 39 00 00 00 00 00 02 4A A0 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 48 A0 + 39 00 00 00 00 00 02 47 A0 + 39 00 00 00 00 00 02 46 A0 + 39 00 00 00 00 00 02 45 A0 + 39 00 00 00 00 00 02 44 9F + 39 00 00 00 00 00 02 43 9F + 39 00 00 00 00 00 02 42 9F + 39 00 00 00 00 00 02 41 9E + 39 00 00 00 00 00 02 40 9E + 39 00 00 00 00 00 02 3F 9E + 39 00 00 00 00 00 02 3E 9D + 39 00 00 00 00 00 02 3D 9D + 39 00 00 00 00 00 02 3C 9C + 39 00 00 00 00 00 02 3B 9C + 39 00 00 00 00 00 02 3A 9B + 39 00 00 00 00 00 02 39 9A + 39 00 00 00 00 00 02 38 9A + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 36 99 + 39 00 00 00 00 00 02 35 98 + 39 00 00 00 00 00 02 34 98 + 39 00 00 00 00 00 02 33 98 + 39 00 00 00 00 00 02 32 98 + 39 00 00 00 00 00 02 31 98 + 39 00 00 00 00 00 02 30 98 + 39 00 00 00 00 00 02 2F 98 + 39 00 00 00 00 00 02 2E 98 + 39 00 00 00 00 00 02 2D 98 + 39 00 00 00 00 00 02 2C 98 + 39 00 00 00 00 00 02 2B 98 + 39 00 00 00 00 00 02 2A 98 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 28 98 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 26 97 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 24 97 + 39 00 00 00 00 00 02 23 97 + 39 00 00 00 00 00 02 22 96 + 39 00 00 00 00 00 02 21 96 + 39 00 00 00 00 00 02 20 96 + 39 00 00 00 00 00 02 1F 95 + 39 00 00 00 00 00 02 1E 95 + 39 00 00 00 00 00 02 1D 95 + 39 00 00 00 00 00 02 1C 94 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1A 94 + 39 00 00 00 00 00 02 19 93 + 39 00 00 00 00 00 02 18 93 + 39 00 00 00 00 00 02 17 92 + 39 00 00 00 00 00 02 16 92 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 14 91 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 12 91 + 39 00 00 00 00 00 02 11 91 + 39 00 00 00 00 00 02 10 91 + 39 00 00 00 00 00 02 0F 91 + 39 00 00 00 00 00 02 0E 91 + 39 00 00 00 00 00 02 0D 91 + 39 00 00 00 00 00 02 0C 91 + 39 00 00 00 00 00 02 0B 91 + 39 00 00 00 00 00 02 0A 91 + 39 00 00 00 00 00 02 09 91 + 39 00 00 00 00 00 02 08 91 + 39 00 00 00 00 00 02 07 91 + 39 00 00 00 00 00 02 06 90 + 39 00 00 00 00 00 02 05 90 + 39 00 00 00 00 00 02 04 90 + 39 00 00 00 00 00 02 03 90 + 39 00 00 00 00 00 02 02 90 + 39 00 00 00 00 00 02 01 90 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 87 + 39 00 00 00 00 00 02 7E 87 + 39 00 00 00 00 00 02 7D 86 + 39 00 00 00 00 00 02 7C 86 + 39 00 00 00 00 00 02 7B 87 + 39 00 00 00 00 00 02 7A 87 + 39 00 00 00 00 00 02 79 87 + 39 00 00 00 00 00 02 78 87 + 39 00 00 00 00 00 02 77 87 + 39 00 00 00 00 00 02 76 87 + 39 00 00 00 00 00 02 75 87 + 39 00 00 00 00 00 02 74 87 + 39 00 00 00 00 00 02 73 87 + 39 00 00 00 00 00 02 72 87 + 39 00 00 00 00 00 02 71 87 + 39 00 00 00 00 00 02 70 88 + 39 00 00 00 00 00 02 6F 88 + 39 00 00 00 00 00 02 6E 88 + 39 00 00 00 00 00 02 6D 88 + 39 00 00 00 00 00 02 6C 88 + 39 00 00 00 00 00 02 6B 88 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 69 87 + 39 00 00 00 00 00 02 68 88 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 66 88 + 39 00 00 00 00 00 02 65 89 + 39 00 00 00 00 00 02 64 89 + 39 00 00 00 00 00 02 63 89 + 39 00 00 00 00 00 02 62 89 + 39 00 00 00 00 00 02 61 89 + 39 00 00 00 00 00 02 60 88 + 39 00 00 00 00 00 02 5F 88 + 39 00 00 00 00 00 02 5E 88 + 39 00 00 00 00 00 02 5D 87 + 39 00 00 00 00 00 02 5C 87 + 39 00 00 00 00 00 02 5B 88 + 39 00 00 00 00 00 02 5A 88 + 39 00 00 00 00 00 02 59 88 + 39 00 00 00 00 00 02 58 88 + 39 00 00 00 00 00 02 57 88 + 39 00 00 00 00 00 02 56 88 + 39 00 00 00 00 00 02 55 88 + 39 00 00 00 00 00 02 54 88 + 39 00 00 00 00 00 02 53 88 + 39 00 00 00 00 00 02 52 88 + 39 00 00 00 00 00 02 51 87 + 39 00 00 00 00 00 02 50 87 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 47 88 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 44 89 + 39 00 00 00 00 00 02 43 89 + 39 00 00 00 00 00 02 42 89 + 39 00 00 00 00 00 02 41 89 + 39 00 00 00 00 00 02 40 89 + 39 00 00 00 00 00 02 3F 89 + 39 00 00 00 00 00 02 3E 89 + 39 00 00 00 00 00 02 3D 89 + 39 00 00 00 00 00 02 3C 89 + 39 00 00 00 00 00 02 3B 88 + 39 00 00 00 00 00 02 3A 88 + 39 00 00 00 00 00 02 39 88 + 39 00 00 00 00 00 02 38 88 + 39 00 00 00 00 00 02 37 87 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 31 85 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 2F 84 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 29 86 + 39 00 00 00 00 00 02 28 86 + 39 00 00 00 00 00 02 27 86 + 39 00 00 00 00 00 02 26 86 + 39 00 00 00 00 00 02 25 86 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 22 86 + 39 00 00 00 00 00 02 21 86 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 1F 85 + 39 00 00 00 00 00 02 1E 85 + 39 00 00 00 00 00 02 1D 85 + 39 00 00 00 00 00 02 1C 85 + 39 00 00 00 00 00 02 1B 85 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 18 84 + 39 00 00 00 00 00 02 17 84 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 14 83 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F 9E + 39 00 00 00 00 00 02 7E 9E + 39 00 00 00 00 00 02 7D 9E + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7B 9E + 39 00 00 00 00 00 02 7A 9D + 39 00 00 00 00 00 02 79 9D + 39 00 00 00 00 00 02 78 9D + 39 00 00 00 00 00 02 77 9D + 39 00 00 00 00 00 02 76 9E + 39 00 00 00 00 00 02 75 9E + 39 00 00 00 00 00 02 74 9E + 39 00 00 00 00 00 02 73 9E + 39 00 00 00 00 00 02 72 9E + 39 00 00 00 00 00 02 71 9E + 39 00 00 00 00 00 02 70 9E + 39 00 00 00 00 00 02 6F 9D + 39 00 00 00 00 00 02 6E 9D + 39 00 00 00 00 00 02 6D 9D + 39 00 00 00 00 00 02 6C 9D + 39 00 00 00 00 00 02 6B 9E + 39 00 00 00 00 00 02 6A 9E + 39 00 00 00 00 00 02 69 9E + 39 00 00 00 00 00 02 68 9E + 39 00 00 00 00 00 02 67 9E + 39 00 00 00 00 00 02 66 9D + 39 00 00 00 00 00 02 65 9D + 39 00 00 00 00 00 02 64 9D + 39 00 00 00 00 00 02 63 9C + 39 00 00 00 00 00 02 62 9C + 39 00 00 00 00 00 02 61 9C + 39 00 00 00 00 00 02 60 9C + 39 00 00 00 00 00 02 5F 9C + 39 00 00 00 00 00 02 5E 9C + 39 00 00 00 00 00 02 5D 9D + 39 00 00 00 00 00 02 5C 9C + 39 00 00 00 00 00 02 5B 9C + 39 00 00 00 00 00 02 5A 9C + 39 00 00 00 00 00 02 59 9C + 39 00 00 00 00 00 02 58 9C + 39 00 00 00 00 00 02 57 9B + 39 00 00 00 00 00 02 56 9B + 39 00 00 00 00 00 02 55 9B + 39 00 00 00 00 00 02 54 9A + 39 00 00 00 00 00 02 53 99 + 39 00 00 00 00 00 02 52 99 + 39 00 00 00 00 00 02 51 98 + 39 00 00 00 00 00 02 50 99 + 39 00 00 00 00 00 02 4F 99 + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4D 9A + 39 00 00 00 00 00 02 4C 9A + 39 00 00 00 00 00 02 4B 9B + 39 00 00 00 00 00 02 4A 9B + 39 00 00 00 00 00 02 49 9B + 39 00 00 00 00 00 02 48 9C + 39 00 00 00 00 00 02 47 9C + 39 00 00 00 00 00 02 46 9C + 39 00 00 00 00 00 02 45 9C + 39 00 00 00 00 00 02 44 9C + 39 00 00 00 00 00 02 43 9C + 39 00 00 00 00 00 02 42 9B + 39 00 00 00 00 00 02 41 9B + 39 00 00 00 00 00 02 40 9B + 39 00 00 00 00 00 02 3F 9B + 39 00 00 00 00 00 02 3E 9B + 39 00 00 00 00 00 02 3D 9A + 39 00 00 00 00 00 02 3C 9A + 39 00 00 00 00 00 02 3B 99 + 39 00 00 00 00 00 02 3A 99 + 39 00 00 00 00 00 02 39 99 + 39 00 00 00 00 00 02 38 98 + 39 00 00 00 00 00 02 37 97 + 39 00 00 00 00 00 02 36 97 + 39 00 00 00 00 00 02 35 96 + 39 00 00 00 00 00 02 34 96 + 39 00 00 00 00 00 02 33 97 + 39 00 00 00 00 00 02 32 97 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 30 97 + 39 00 00 00 00 00 02 2F 97 + 39 00 00 00 00 00 02 2E 98 + 39 00 00 00 00 00 02 2D 98 + 39 00 00 00 00 00 02 2C 98 + 39 00 00 00 00 00 02 2B 97 + 39 00 00 00 00 00 02 2A 97 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 28 98 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 26 98 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 24 97 + 39 00 00 00 00 00 02 23 97 + 39 00 00 00 00 00 02 22 97 + 39 00 00 00 00 00 02 21 97 + 39 00 00 00 00 00 02 20 96 + 39 00 00 00 00 00 02 1F 96 + 39 00 00 00 00 00 02 1E 96 + 39 00 00 00 00 00 02 1D 96 + 39 00 00 00 00 00 02 1C 95 + 39 00 00 00 00 00 02 1B 95 + 39 00 00 00 00 00 02 1A 95 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 18 94 + 39 00 00 00 00 00 02 17 93 + 39 00 00 00 00 00 02 16 93 + 39 00 00 00 00 00 02 15 93 + 39 00 00 00 00 00 02 14 92 + 39 00 00 00 00 00 02 13 93 + 39 00 00 00 00 00 02 12 92 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 10 93 + 39 00 00 00 00 00 02 0F 93 + 39 00 00 00 00 00 02 0E 93 + 39 00 00 00 00 00 02 0D 93 + 39 00 00 00 00 00 02 0C 93 + 39 00 00 00 00 00 02 0B 93 + 39 00 00 00 00 00 02 0A 93 + 39 00 00 00 00 00 02 09 93 + 39 00 00 00 00 00 02 08 93 + 39 00 00 00 00 00 02 07 93 + 39 00 00 00 00 00 02 06 93 + 39 00 00 00 00 00 02 05 92 + 39 00 00 00 00 00 02 04 92 + 39 00 00 00 00 00 02 03 92 + 39 00 00 00 00 00 02 02 92 + 39 00 00 00 00 00 02 01 92 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 82 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 82 + 39 00 00 00 00 00 02 7F 87 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 92 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 92 + 39 00 00 00 00 00 02 7F 9E + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 8F + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 8F + 39 00 00 00 00 00 02 7F B5 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 8F + 39 00 00 00 00 00 02 7E 8F + 39 00 00 00 00 00 02 7D 8E + 39 00 00 00 00 00 02 7C 8E + 39 00 00 00 00 00 02 7B 8E + 39 00 00 00 00 00 02 7A 8E + 39 00 00 00 00 00 02 79 8D + 39 00 00 00 00 00 02 78 8D + 39 00 00 00 00 00 02 77 8D + 39 00 00 00 00 00 02 76 8D + 39 00 00 00 00 00 02 75 8C + 39 00 00 00 00 00 02 74 8C + 39 00 00 00 00 00 02 73 8C + 39 00 00 00 00 00 02 72 8B + 39 00 00 00 00 00 02 71 8B + 39 00 00 00 00 00 02 70 8A + 39 00 00 00 00 00 02 6F 8A + 39 00 00 00 00 00 02 6E 8A + 39 00 00 00 00 00 02 6D 8A + 39 00 00 00 00 00 02 6C 8A + 39 00 00 00 00 00 02 6B 8A + 39 00 00 00 00 00 02 6A 89 + 39 00 00 00 00 00 02 69 89 + 39 00 00 00 00 00 02 68 89 + 39 00 00 00 00 00 02 67 89 + 39 00 00 00 00 00 02 66 88 + 39 00 00 00 00 00 02 65 88 + 39 00 00 00 00 00 02 64 88 + 39 00 00 00 00 00 02 63 88 + 39 00 00 00 00 00 02 62 88 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 60 87 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 5E 87 + 39 00 00 00 00 00 02 5D 86 + 39 00 00 00 00 00 02 5C 86 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 57 86 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 50 85 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4A 83 + 39 00 00 00 00 00 02 49 83 + 39 00 00 00 00 00 02 48 83 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 46 82 + 39 00 00 00 00 00 02 45 82 + 39 00 00 00 00 00 02 44 82 + 39 00 00 00 00 00 02 43 82 + 39 00 00 00 00 00 02 42 82 + 39 00 00 00 00 00 02 41 83 + 39 00 00 00 00 00 02 40 83 + 39 00 00 00 00 00 02 3F 83 + 39 00 00 00 00 00 02 3E 83 + 39 00 00 00 00 00 02 3D 83 + 39 00 00 00 00 00 02 3C 84 + 39 00 00 00 00 00 02 3B 84 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 31 84 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 2F 83 + 39 00 00 00 00 00 02 2E 83 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 26 82 + 39 00 00 00 00 00 02 25 82 + 39 00 00 00 00 00 02 24 81 + 39 00 00 00 00 00 02 23 81 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 21 82 + 39 00 00 00 00 00 02 20 82 + 39 00 00 00 00 00 02 1F 81 + 39 00 00 00 00 00 02 1E 81 + 39 00 00 00 00 00 02 1D 81 + 39 00 00 00 00 00 02 1C 81 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 82 + 39 00 00 00 00 00 02 7E 82 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 81 + 39 00 00 00 00 00 02 79 81 + 39 00 00 00 00 00 02 78 81 + 39 00 00 00 00 00 02 77 81 + 39 00 00 00 00 00 02 76 00 + 39 00 00 00 00 00 02 75 00 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 73 00 + 39 00 00 00 00 00 02 72 01 + 39 00 00 00 00 00 02 71 01 + 39 00 00 00 00 00 02 70 01 + 39 00 00 00 00 00 02 6F 01 + 39 00 00 00 00 00 02 6E 02 + 39 00 00 00 00 00 02 6D 02 + 39 00 00 00 00 00 02 6C 02 + 39 00 00 00 00 00 02 6B 02 + 39 00 00 00 00 00 02 6A 02 + 39 00 00 00 00 00 02 69 02 + 39 00 00 00 00 00 02 68 02 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 64 03 + 39 00 00 00 00 00 02 63 03 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 55 05 + 39 00 00 00 00 00 02 54 05 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 52 06 + 39 00 00 00 00 00 02 51 05 + 39 00 00 00 00 00 02 50 05 + 39 00 00 00 00 00 02 4F 05 + 39 00 00 00 00 00 02 4E 05 + 39 00 00 00 00 00 02 4D 06 + 39 00 00 00 00 00 02 4C 06 + 39 00 00 00 00 00 02 4B 07 + 39 00 00 00 00 00 02 4A 07 + 39 00 00 00 00 00 02 49 08 + 39 00 00 00 00 00 02 48 07 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 06 + 39 00 00 00 00 00 02 3D 06 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3A 05 + 39 00 00 00 00 00 02 39 04 + 39 00 00 00 00 00 02 38 04 + 39 00 00 00 00 00 02 37 04 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 35 03 + 39 00 00 00 00 00 02 34 03 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 32 02 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 30 03 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2C 04 + 39 00 00 00 00 00 02 2B 04 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 27 04 + 39 00 00 00 00 00 02 26 04 + 39 00 00 00 00 00 02 25 04 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 03 + 39 00 00 00 00 00 02 08 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F 92 + 39 00 00 00 00 00 02 7E 91 + 39 00 00 00 00 00 02 7D 91 + 39 00 00 00 00 00 02 7C 91 + 39 00 00 00 00 00 02 7B 91 + 39 00 00 00 00 00 02 7A 90 + 39 00 00 00 00 00 02 79 90 + 39 00 00 00 00 00 02 78 90 + 39 00 00 00 00 00 02 77 90 + 39 00 00 00 00 00 02 76 8F + 39 00 00 00 00 00 02 75 8F + 39 00 00 00 00 00 02 74 8F + 39 00 00 00 00 00 02 73 8E + 39 00 00 00 00 00 02 72 8E + 39 00 00 00 00 00 02 71 8D + 39 00 00 00 00 00 02 70 8D + 39 00 00 00 00 00 02 6F 8E + 39 00 00 00 00 00 02 6E 8D + 39 00 00 00 00 00 02 6D 8D + 39 00 00 00 00 00 02 6C 8D + 39 00 00 00 00 00 02 6B 8D + 39 00 00 00 00 00 02 6A 8C + 39 00 00 00 00 00 02 69 8C + 39 00 00 00 00 00 02 68 8C + 39 00 00 00 00 00 02 67 8C + 39 00 00 00 00 00 02 66 8B + 39 00 00 00 00 00 02 65 8B + 39 00 00 00 00 00 02 64 8B + 39 00 00 00 00 00 02 63 8B + 39 00 00 00 00 00 02 62 8B + 39 00 00 00 00 00 02 61 8A + 39 00 00 00 00 00 02 60 8A + 39 00 00 00 00 00 02 5F 8A + 39 00 00 00 00 00 02 5E 8A + 39 00 00 00 00 00 02 5D 89 + 39 00 00 00 00 00 02 5C 89 + 39 00 00 00 00 00 02 5B 89 + 39 00 00 00 00 00 02 5A 89 + 39 00 00 00 00 00 02 59 89 + 39 00 00 00 00 00 02 58 89 + 39 00 00 00 00 00 02 57 89 + 39 00 00 00 00 00 02 56 89 + 39 00 00 00 00 00 02 55 89 + 39 00 00 00 00 00 02 54 89 + 39 00 00 00 00 00 02 53 89 + 39 00 00 00 00 00 02 52 89 + 39 00 00 00 00 00 02 51 88 + 39 00 00 00 00 00 02 50 88 + 39 00 00 00 00 00 02 4F 87 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4D 86 + 39 00 00 00 00 00 02 4C 86 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 45 85 + 39 00 00 00 00 00 02 44 85 + 39 00 00 00 00 00 02 43 85 + 39 00 00 00 00 00 02 42 85 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 38 87 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 36 88 + 39 00 00 00 00 00 02 35 89 + 39 00 00 00 00 00 02 34 88 + 39 00 00 00 00 00 02 33 87 + 39 00 00 00 00 00 02 32 87 + 39 00 00 00 00 00 02 31 86 + 39 00 00 00 00 00 02 30 86 + 39 00 00 00 00 00 02 2F 85 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 29 85 + 39 00 00 00 00 00 02 28 85 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 23 83 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1D 83 + 39 00 00 00 00 00 02 1C 83 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 11 83 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + + ]; + + + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 26 04 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 30 03 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 32 02 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 37 04 + 39 00 00 00 00 00 02 38 04 + 39 00 00 00 00 00 02 39 05 + 39 00 00 00 00 00 02 3A 05 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 47 08 + 39 00 00 00 00 00 02 48 08 + 39 00 00 00 00 00 02 49 08 + 39 00 00 00 00 00 02 4A 08 + 39 00 00 00 00 00 02 4B 07 + 39 00 00 00 00 00 02 4C 07 + 39 00 00 00 00 00 02 4D 06 + 39 00 00 00 00 00 02 4E 06 + 39 00 00 00 00 00 02 4F 06 + 39 00 00 00 00 00 02 50 06 + 39 00 00 00 00 00 02 51 06 + 39 00 00 00 00 00 02 52 06 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 55 06 + 39 00 00 00 00 00 02 56 06 + 39 00 00 00 00 00 02 57 06 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 03 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6E 02 + 39 00 00 00 00 00 02 6F 02 + 39 00 00 00 00 00 02 70 02 + 39 00 00 00 00 00 02 71 02 + 39 00 00 00 00 00 02 72 01 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 76 00 + 39 00 00 00 00 00 02 77 00 + 39 00 00 00 00 00 02 78 00 + 39 00 00 00 00 00 02 79 00 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7F 81 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0F 84 + 39 00 00 00 00 00 02 10 84 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 12 85 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 14 85 + 39 00 00 00 00 00 02 15 85 + 39 00 00 00 00 00 02 16 85 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 86 + 39 00 00 00 00 00 02 19 86 + 39 00 00 00 00 00 02 1A 87 + 39 00 00 00 00 00 02 1B 87 + 39 00 00 00 00 00 02 1C 87 + 39 00 00 00 00 00 02 1D 86 + 39 00 00 00 00 00 02 1E 86 + 39 00 00 00 00 00 02 1F 87 + 39 00 00 00 00 00 02 20 87 + 39 00 00 00 00 00 02 21 87 + 39 00 00 00 00 00 02 22 88 + 39 00 00 00 00 00 02 23 88 + 39 00 00 00 00 00 02 24 87 + 39 00 00 00 00 00 02 25 87 + 39 00 00 00 00 00 02 26 88 + 39 00 00 00 00 00 02 27 89 + 39 00 00 00 00 00 02 28 89 + 39 00 00 00 00 00 02 29 8A + 39 00 00 00 00 00 02 2A 8A + 39 00 00 00 00 00 02 2B 8A + 39 00 00 00 00 00 02 2C 8A + 39 00 00 00 00 00 02 2D 8A + 39 00 00 00 00 00 02 2E 8B + 39 00 00 00 00 00 02 2F 8B + 39 00 00 00 00 00 02 30 8B + 39 00 00 00 00 00 02 31 8C + 39 00 00 00 00 00 02 32 8C + 39 00 00 00 00 00 02 33 8D + 39 00 00 00 00 00 02 34 8D + 39 00 00 00 00 00 02 35 8E + 39 00 00 00 00 00 02 36 8F + 39 00 00 00 00 00 02 37 8F + 39 00 00 00 00 00 02 38 8F + 39 00 00 00 00 00 02 39 8F + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 3B 8F + 39 00 00 00 00 00 02 3C 8F + 39 00 00 00 00 00 02 3D 8F + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3F 8E + 39 00 00 00 00 00 02 40 8E + 39 00 00 00 00 00 02 41 8E + 39 00 00 00 00 00 02 42 8E + 39 00 00 00 00 00 02 43 8E + 39 00 00 00 00 00 02 44 8E + 39 00 00 00 00 00 02 45 8E + 39 00 00 00 00 00 02 46 8E + 39 00 00 00 00 00 02 47 8E + 39 00 00 00 00 00 02 48 8E + 39 00 00 00 00 00 02 49 8E + 39 00 00 00 00 00 02 4A 8F + 39 00 00 00 00 00 02 4B 8F + 39 00 00 00 00 00 02 4C 8F + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4E 90 + 39 00 00 00 00 00 02 4F 8F + 39 00 00 00 00 00 02 50 90 + 39 00 00 00 00 00 02 51 91 + 39 00 00 00 00 00 02 52 91 + 39 00 00 00 00 00 02 53 92 + 39 00 00 00 00 00 02 54 93 + 39 00 00 00 00 00 02 55 93 + 39 00 00 00 00 00 02 56 93 + 39 00 00 00 00 00 02 57 93 + 39 00 00 00 00 00 02 58 93 + 39 00 00 00 00 00 02 59 94 + 39 00 00 00 00 00 02 5A 94 + 39 00 00 00 00 00 02 5B 94 + 39 00 00 00 00 00 02 5C 94 + 39 00 00 00 00 00 02 5D 95 + 39 00 00 00 00 00 02 5E 95 + 39 00 00 00 00 00 02 5F 95 + 39 00 00 00 00 00 02 60 95 + 39 00 00 00 00 00 02 61 96 + 39 00 00 00 00 00 02 62 96 + 39 00 00 00 00 00 02 63 96 + 39 00 00 00 00 00 02 64 97 + 39 00 00 00 00 00 02 65 97 + 39 00 00 00 00 00 02 66 97 + 39 00 00 00 00 00 02 67 98 + 39 00 00 00 00 00 02 68 98 + 39 00 00 00 00 00 02 69 98 + 39 00 00 00 00 00 02 6A 99 + 39 00 00 00 00 00 02 6B 99 + 39 00 00 00 00 00 02 6C 9A + 39 00 00 00 00 00 02 6D 9A + 39 00 00 00 00 00 02 6E 9A + 39 00 00 00 00 00 02 6F 9B + 39 00 00 00 00 00 02 70 9B + 39 00 00 00 00 00 02 71 9B + 39 00 00 00 00 00 02 72 9C + 39 00 00 00 00 00 02 73 9C + 39 00 00 00 00 00 02 74 9B + 39 00 00 00 00 00 02 75 9C + 39 00 00 00 00 00 02 76 9D + 39 00 00 00 00 00 02 77 9D + 39 00 00 00 00 00 02 78 9E + 39 00 00 00 00 00 02 79 9E + 39 00 00 00 00 00 02 7A 9F + 39 00 00 00 00 00 02 7B 9F + 39 00 00 00 00 00 02 7C 9F + 39 00 00 00 00 00 02 7D 9F + 39 00 00 00 00 00 02 7E A0 + 39 00 00 00 00 00 02 7F A0 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0E 85 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 12 87 + 39 00 00 00 00 00 02 13 87 + 39 00 00 00 00 00 02 14 87 + 39 00 00 00 00 00 02 15 87 + 39 00 00 00 00 00 02 16 88 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 88 + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 1A 8A + 39 00 00 00 00 00 02 1B 8A + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1D 8A + 39 00 00 00 00 00 02 1E 8A + 39 00 00 00 00 00 02 1F 8A + 39 00 00 00 00 00 02 20 8A + 39 00 00 00 00 00 02 21 8B + 39 00 00 00 00 00 02 22 8B + 39 00 00 00 00 00 02 23 8C + 39 00 00 00 00 00 02 24 8C + 39 00 00 00 00 00 02 25 8C + 39 00 00 00 00 00 02 26 8B + 39 00 00 00 00 00 02 27 8D + 39 00 00 00 00 00 02 28 8E + 39 00 00 00 00 00 02 29 8E + 39 00 00 00 00 00 02 2A 8F + 39 00 00 00 00 00 02 2B 8F + 39 00 00 00 00 00 02 2C 8F + 39 00 00 00 00 00 02 2D 8F + 39 00 00 00 00 00 02 2E 90 + 39 00 00 00 00 00 02 2F 90 + 39 00 00 00 00 00 02 30 91 + 39 00 00 00 00 00 02 31 91 + 39 00 00 00 00 00 02 32 91 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 34 93 + 39 00 00 00 00 00 02 35 93 + 39 00 00 00 00 00 02 36 94 + 39 00 00 00 00 00 02 37 95 + 39 00 00 00 00 00 02 38 96 + 39 00 00 00 00 00 02 39 96 + 39 00 00 00 00 00 02 3A 96 + 39 00 00 00 00 00 02 3B 96 + 39 00 00 00 00 00 02 3C 96 + 39 00 00 00 00 00 02 3D 96 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3F 96 + 39 00 00 00 00 00 02 40 96 + 39 00 00 00 00 00 02 41 96 + 39 00 00 00 00 00 02 42 96 + 39 00 00 00 00 00 02 43 96 + 39 00 00 00 00 00 02 44 96 + 39 00 00 00 00 00 02 45 96 + 39 00 00 00 00 00 02 46 96 + 39 00 00 00 00 00 02 47 97 + 39 00 00 00 00 00 02 48 97 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 4A 97 + 39 00 00 00 00 00 02 4B 98 + 39 00 00 00 00 00 02 4C 98 + 39 00 00 00 00 00 02 4D 98 + 39 00 00 00 00 00 02 4E 99 + 39 00 00 00 00 00 02 4F 99 + 39 00 00 00 00 00 02 50 9A + 39 00 00 00 00 00 02 51 9A + 39 00 00 00 00 00 02 52 9A + 39 00 00 00 00 00 02 53 9B + 39 00 00 00 00 00 02 54 9C + 39 00 00 00 00 00 02 55 9D + 39 00 00 00 00 00 02 56 9D + 39 00 00 00 00 00 02 57 9E + 39 00 00 00 00 00 02 58 9E + 39 00 00 00 00 00 02 59 9F + 39 00 00 00 00 00 02 5A 9F + 39 00 00 00 00 00 02 5B 9F + 39 00 00 00 00 00 02 5C 9F + 39 00 00 00 00 00 02 5D A0 + 39 00 00 00 00 00 02 5E A0 + 39 00 00 00 00 00 02 5F A1 + 39 00 00 00 00 00 02 60 A1 + 39 00 00 00 00 00 02 61 A2 + 39 00 00 00 00 00 02 62 A2 + 39 00 00 00 00 00 02 63 A2 + 39 00 00 00 00 00 02 64 A3 + 39 00 00 00 00 00 02 65 A3 + 39 00 00 00 00 00 02 66 A4 + 39 00 00 00 00 00 02 67 A4 + 39 00 00 00 00 00 02 68 A5 + 39 00 00 00 00 00 02 69 A5 + 39 00 00 00 00 00 02 6A A6 + 39 00 00 00 00 00 02 6B A6 + 39 00 00 00 00 00 02 6C A7 + 39 00 00 00 00 00 02 6D A7 + 39 00 00 00 00 00 02 6E A8 + 39 00 00 00 00 00 02 6F A8 + 39 00 00 00 00 00 02 70 A9 + 39 00 00 00 00 00 02 71 A9 + 39 00 00 00 00 00 02 72 AA + 39 00 00 00 00 00 02 73 AA + 39 00 00 00 00 00 02 74 AB + 39 00 00 00 00 00 02 75 AB + 39 00 00 00 00 00 02 76 AC + 39 00 00 00 00 00 02 77 AC + 39 00 00 00 00 00 02 78 AC + 39 00 00 00 00 00 02 79 AD + 39 00 00 00 00 00 02 7A AE + 39 00 00 00 00 00 02 7B AE + 39 00 00 00 00 00 02 7C AF + 39 00 00 00 00 00 02 7D AF + 39 00 00 00 00 00 02 7E B0 + 39 00 00 00 00 00 02 7F B1 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 21 85 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 23 85 + 39 00 00 00 00 00 02 24 85 + 39 00 00 00 00 00 02 25 85 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 27 85 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 29 84 + 39 00 00 00 00 00 02 2A 84 + 39 00 00 00 00 00 02 2B 84 + 39 00 00 00 00 00 02 2C 84 + 39 00 00 00 00 00 02 2D 84 + 39 00 00 00 00 00 02 2E 83 + 39 00 00 00 00 00 02 2F 83 + 39 00 00 00 00 00 02 30 83 + 39 00 00 00 00 00 02 31 84 + 39 00 00 00 00 00 02 32 84 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 86 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 38 87 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 46 87 + 39 00 00 00 00 00 02 47 86 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 49 85 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 4B 84 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4D 84 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 58 87 + 39 00 00 00 00 00 02 59 87 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5C 86 + 39 00 00 00 00 00 02 5D 86 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 60 87 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 62 87 + 39 00 00 00 00 00 02 63 87 + 39 00 00 00 00 00 02 64 87 + 39 00 00 00 00 00 02 65 87 + 39 00 00 00 00 00 02 66 87 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 68 86 + 39 00 00 00 00 00 02 69 86 + 39 00 00 00 00 00 02 6A 86 + 39 00 00 00 00 00 02 6B 87 + 39 00 00 00 00 00 02 6C 87 + 39 00 00 00 00 00 02 6D 87 + 39 00 00 00 00 00 02 6E 87 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 77 85 + 39 00 00 00 00 00 02 78 85 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 7A 85 + 39 00 00 00 00 00 02 7B 85 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7F 85 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 A1 + 39 00 00 00 00 00 02 02 A1 + 39 00 00 00 00 00 02 03 A2 + 39 00 00 00 00 00 02 04 A2 + 39 00 00 00 00 00 02 05 A2 + 39 00 00 00 00 00 02 06 A3 + 39 00 00 00 00 00 02 07 A3 + 39 00 00 00 00 00 02 08 A3 + 39 00 00 00 00 00 02 09 A3 + 39 00 00 00 00 00 02 0A A4 + 39 00 00 00 00 00 02 0B A4 + 39 00 00 00 00 00 02 0C A4 + 39 00 00 00 00 00 02 0D A4 + 39 00 00 00 00 00 02 0E A5 + 39 00 00 00 00 00 02 0F A5 + 39 00 00 00 00 00 02 10 A5 + 39 00 00 00 00 00 02 11 A5 + 39 00 00 00 00 00 02 12 A5 + 39 00 00 00 00 00 02 13 A5 + 39 00 00 00 00 00 02 14 A5 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 A5 + 39 00 00 00 00 00 02 17 A5 + 39 00 00 00 00 00 02 18 A5 + 39 00 00 00 00 00 02 19 A5 + 39 00 00 00 00 00 02 1A A6 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1C A7 + 39 00 00 00 00 00 02 1D A7 + 39 00 00 00 00 00 02 1E A8 + 39 00 00 00 00 00 02 1F A8 + 39 00 00 00 00 00 02 20 A9 + 39 00 00 00 00 00 02 21 A9 + 39 00 00 00 00 00 02 22 AA + 39 00 00 00 00 00 02 23 AA + 39 00 00 00 00 00 02 24 AA + 39 00 00 00 00 00 02 25 AB + 39 00 00 00 00 00 02 26 AB + 39 00 00 00 00 00 02 27 AC + 39 00 00 00 00 00 02 28 AC + 39 00 00 00 00 00 02 29 AC + 39 00 00 00 00 00 02 2A AC + 39 00 00 00 00 00 02 2B AD + 39 00 00 00 00 00 02 2C AD + 39 00 00 00 00 00 02 2D AE + 39 00 00 00 00 00 02 2E AD + 39 00 00 00 00 00 02 2F AD + 39 00 00 00 00 00 02 30 AD + 39 00 00 00 00 00 02 31 AD + 39 00 00 00 00 00 02 32 AE + 39 00 00 00 00 00 02 33 AE + 39 00 00 00 00 00 02 34 AE + 39 00 00 00 00 00 02 35 AE + 39 00 00 00 00 00 02 36 AE + 39 00 00 00 00 00 02 37 AE + 39 00 00 00 00 00 02 38 AE + 39 00 00 00 00 00 02 39 AD + 39 00 00 00 00 00 02 3A AD + 39 00 00 00 00 00 02 3B AE + 39 00 00 00 00 00 02 3C AE + 39 00 00 00 00 00 02 3D AF + 39 00 00 00 00 00 02 3E B0 + 39 00 00 00 00 00 02 3F B0 + 39 00 00 00 00 00 02 40 B1 + 39 00 00 00 00 00 02 41 B1 + 39 00 00 00 00 00 02 42 B2 + 39 00 00 00 00 00 02 43 B3 + 39 00 00 00 00 00 02 44 B3 + 39 00 00 00 00 00 02 45 B3 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 47 B4 + 39 00 00 00 00 00 02 48 B4 + 39 00 00 00 00 00 02 49 B4 + 39 00 00 00 00 00 02 4A B5 + 39 00 00 00 00 00 02 4B B5 + 39 00 00 00 00 00 02 4C B5 + 39 00 00 00 00 00 02 4D B5 + 39 00 00 00 00 00 02 4E B5 + 39 00 00 00 00 00 02 4F B5 + 39 00 00 00 00 00 02 50 B5 + 39 00 00 00 00 00 02 51 B5 + 39 00 00 00 00 00 02 52 B5 + 39 00 00 00 00 00 02 53 B4 + 39 00 00 00 00 00 02 54 B4 + 39 00 00 00 00 00 02 55 B4 + 39 00 00 00 00 00 02 56 B4 + 39 00 00 00 00 00 02 57 B3 + 39 00 00 00 00 00 02 58 B3 + 39 00 00 00 00 00 02 59 B4 + 39 00 00 00 00 00 02 5A B5 + 39 00 00 00 00 00 02 5B B5 + 39 00 00 00 00 00 02 5C B6 + 39 00 00 00 00 00 02 5D B6 + 39 00 00 00 00 00 02 5E B7 + 39 00 00 00 00 00 02 5F B7 + 39 00 00 00 00 00 02 60 B8 + 39 00 00 00 00 00 02 61 B8 + 39 00 00 00 00 00 02 62 B8 + 39 00 00 00 00 00 02 63 B8 + 39 00 00 00 00 00 02 64 B9 + 39 00 00 00 00 00 02 65 B9 + 39 00 00 00 00 00 02 66 B9 + 39 00 00 00 00 00 02 67 B9 + 39 00 00 00 00 00 02 68 B9 + 39 00 00 00 00 00 02 69 B9 + 39 00 00 00 00 00 02 6A B9 + 39 00 00 00 00 00 02 6B BA + 39 00 00 00 00 00 02 6C BA + 39 00 00 00 00 00 02 6D BB + 39 00 00 00 00 00 02 6E BB + 39 00 00 00 00 00 02 6F BB + 39 00 00 00 00 00 02 70 BB + 39 00 00 00 00 00 02 71 BC + 39 00 00 00 00 00 02 72 BC + 39 00 00 00 00 00 02 73 BC + 39 00 00 00 00 00 02 74 BC + 39 00 00 00 00 00 02 75 BB + 39 00 00 00 00 00 02 76 BB + 39 00 00 00 00 00 02 77 BC + 39 00 00 00 00 00 02 78 BC + 39 00 00 00 00 00 02 79 BD + 39 00 00 00 00 00 02 7A BD + 39 00 00 00 00 00 02 7B BD + 39 00 00 00 00 00 02 7C BD + 39 00 00 00 00 00 02 7D BD + 39 00 00 00 00 00 02 7E BD + 39 00 00 00 00 00 02 7F BD + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 B2 + 39 00 00 00 00 00 02 02 B2 + 39 00 00 00 00 00 02 03 B3 + 39 00 00 00 00 00 02 04 B4 + 39 00 00 00 00 00 02 05 B4 + 39 00 00 00 00 00 02 06 B4 + 39 00 00 00 00 00 02 07 B5 + 39 00 00 00 00 00 02 08 B6 + 39 00 00 00 00 00 02 09 B6 + 39 00 00 00 00 00 02 0A B7 + 39 00 00 00 00 00 02 0B B7 + 39 00 00 00 00 00 02 0C B8 + 39 00 00 00 00 00 02 0D B8 + 39 00 00 00 00 00 02 0E B8 + 39 00 00 00 00 00 02 0F B9 + 39 00 00 00 00 00 02 10 B9 + 39 00 00 00 00 00 02 11 BA + 39 00 00 00 00 00 02 12 BA + 39 00 00 00 00 00 02 13 BB + 39 00 00 00 00 00 02 14 BB + 39 00 00 00 00 00 02 15 BB + 39 00 00 00 00 00 02 16 BC + 39 00 00 00 00 00 02 17 BC + 39 00 00 00 00 00 02 18 BC + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A BD + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C BD + 39 00 00 00 00 00 02 1D BE + 39 00 00 00 00 00 02 1E BE + 39 00 00 00 00 00 02 1F BE + 39 00 00 00 00 00 02 20 BF + 39 00 00 00 00 00 02 21 BF + 39 00 00 00 00 00 02 22 C0 + 39 00 00 00 00 00 02 23 C1 + 39 00 00 00 00 00 02 24 C2 + 39 00 00 00 00 00 02 25 C2 + 39 00 00 00 00 00 02 26 C3 + 39 00 00 00 00 00 02 27 C4 + 39 00 00 00 00 00 02 28 C4 + 39 00 00 00 00 00 02 29 C5 + 39 00 00 00 00 00 02 2A C6 + 39 00 00 00 00 00 02 2B C6 + 39 00 00 00 00 00 02 2C C7 + 39 00 00 00 00 00 02 2D C7 + 39 00 00 00 00 00 02 2E C8 + 39 00 00 00 00 00 02 2F C8 + 39 00 00 00 00 00 02 30 C9 + 39 00 00 00 00 00 02 31 C9 + 39 00 00 00 00 00 02 32 CA + 39 00 00 00 00 00 02 33 CB + 39 00 00 00 00 00 02 34 CC + 39 00 00 00 00 00 02 35 CC + 39 00 00 00 00 00 02 36 CC + 39 00 00 00 00 00 02 37 CC + 39 00 00 00 00 00 02 38 CC + 39 00 00 00 00 00 02 39 CD + 39 00 00 00 00 00 02 3A CD + 39 00 00 00 00 00 02 3B CD + 39 00 00 00 00 00 02 3C CE + 39 00 00 00 00 00 02 3D CE + 39 00 00 00 00 00 02 3E CE + 39 00 00 00 00 00 02 3F CF + 39 00 00 00 00 00 02 40 CF + 39 00 00 00 00 00 02 41 CF + 39 00 00 00 00 00 02 42 CF + 39 00 00 00 00 00 02 43 CF + 39 00 00 00 00 00 02 44 D0 + 39 00 00 00 00 00 02 45 D1 + 39 00 00 00 00 00 02 46 D2 + 39 00 00 00 00 00 02 47 D3 + 39 00 00 00 00 00 02 48 D4 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A D5 + 39 00 00 00 00 00 02 4B D6 + 39 00 00 00 00 00 02 4C D7 + 39 00 00 00 00 00 02 4D D8 + 39 00 00 00 00 00 02 4E D8 + 39 00 00 00 00 00 02 4F D9 + 39 00 00 00 00 00 02 50 DA + 39 00 00 00 00 00 02 51 DA + 39 00 00 00 00 00 02 52 DB + 39 00 00 00 00 00 02 53 DB + 39 00 00 00 00 00 02 54 DC + 39 00 00 00 00 00 02 55 DC + 39 00 00 00 00 00 02 56 DD + 39 00 00 00 00 00 02 57 DD + 39 00 00 00 00 00 02 58 DE + 39 00 00 00 00 00 02 59 DE + 39 00 00 00 00 00 02 5A DE + 39 00 00 00 00 00 02 5B DE + 39 00 00 00 00 00 02 5C DF + 39 00 00 00 00 00 02 5D DF + 39 00 00 00 00 00 02 5E DF + 39 00 00 00 00 00 02 5F DF + 39 00 00 00 00 00 02 60 DF + 39 00 00 00 00 00 02 61 E0 + 39 00 00 00 00 00 02 62 E0 + 39 00 00 00 00 00 02 63 E0 + 39 00 00 00 00 00 02 64 E1 + 39 00 00 00 00 00 02 65 E2 + 39 00 00 00 00 00 02 66 E3 + 39 00 00 00 00 00 02 67 E4 + 39 00 00 00 00 00 02 68 E4 + 39 00 00 00 00 00 02 69 E5 + 39 00 00 00 00 00 02 6A E6 + 39 00 00 00 00 00 02 6B E7 + 39 00 00 00 00 00 02 6C E8 + 39 00 00 00 00 00 02 6D E9 + 39 00 00 00 00 00 02 6E E9 + 39 00 00 00 00 00 02 6F EA + 39 00 00 00 00 00 02 70 EA + 39 00 00 00 00 00 02 71 EB + 39 00 00 00 00 00 02 72 EC + 39 00 00 00 00 00 02 73 EC + 39 00 00 00 00 00 02 74 EC + 39 00 00 00 00 00 02 75 ED + 39 00 00 00 00 00 02 76 ED + 39 00 00 00 00 00 02 77 EE + 39 00 00 00 00 00 02 78 EF + 39 00 00 00 00 00 02 79 F0 + 39 00 00 00 00 00 02 7A F1 + 39 00 00 00 00 00 02 7B F2 + 39 00 00 00 00 00 02 7C F3 + 39 00 00 00 00 00 02 7D F3 + 39 00 00 00 00 00 02 7E F4 + 39 00 00 00 00 00 02 7F F5 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 81 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F a0 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 a1 + 39 00 00 00 00 00 02 7F bd + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F b1 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 b1 + 39 00 00 00 00 00 02 7F f5 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F F5 + 39 00 00 00 00 00 02 7E F4 + 39 00 00 00 00 00 02 7D F3 + 39 00 00 00 00 00 02 7C F3 + 39 00 00 00 00 00 02 7B F2 + 39 00 00 00 00 00 02 7A F1 + 39 00 00 00 00 00 02 79 F0 + 39 00 00 00 00 00 02 78 EF + 39 00 00 00 00 00 02 77 EE + 39 00 00 00 00 00 02 76 ED + 39 00 00 00 00 00 02 75 ED + 39 00 00 00 00 00 02 74 EC + 39 00 00 00 00 00 02 73 EC + 39 00 00 00 00 00 02 72 EC + 39 00 00 00 00 00 02 71 EB + 39 00 00 00 00 00 02 70 EA + 39 00 00 00 00 00 02 6F EA + 39 00 00 00 00 00 02 6E E9 + 39 00 00 00 00 00 02 6D E9 + 39 00 00 00 00 00 02 6C E8 + 39 00 00 00 00 00 02 6B E7 + 39 00 00 00 00 00 02 6A E6 + 39 00 00 00 00 00 02 69 E5 + 39 00 00 00 00 00 02 68 E4 + 39 00 00 00 00 00 02 67 E4 + 39 00 00 00 00 00 02 66 E3 + 39 00 00 00 00 00 02 65 E2 + 39 00 00 00 00 00 02 64 E1 + 39 00 00 00 00 00 02 63 E0 + 39 00 00 00 00 00 02 62 E0 + 39 00 00 00 00 00 02 61 E0 + 39 00 00 00 00 00 02 60 DF + 39 00 00 00 00 00 02 5F DF + 39 00 00 00 00 00 02 5E DF + 39 00 00 00 00 00 02 5D DF + 39 00 00 00 00 00 02 5C DF + 39 00 00 00 00 00 02 5B DE + 39 00 00 00 00 00 02 5A DE + 39 00 00 00 00 00 02 59 DE + 39 00 00 00 00 00 02 58 DE + 39 00 00 00 00 00 02 57 DD + 39 00 00 00 00 00 02 56 DD + 39 00 00 00 00 00 02 55 DC + 39 00 00 00 00 00 02 54 DC + 39 00 00 00 00 00 02 53 DB + 39 00 00 00 00 00 02 52 DB + 39 00 00 00 00 00 02 51 DA + 39 00 00 00 00 00 02 50 DA + 39 00 00 00 00 00 02 4F D9 + 39 00 00 00 00 00 02 4E D8 + 39 00 00 00 00 00 02 4D D8 + 39 00 00 00 00 00 02 4C D7 + 39 00 00 00 00 00 02 4B D6 + 39 00 00 00 00 00 02 4A D5 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 48 D4 + 39 00 00 00 00 00 02 47 D3 + 39 00 00 00 00 00 02 46 D2 + 39 00 00 00 00 00 02 45 D1 + 39 00 00 00 00 00 02 44 D0 + 39 00 00 00 00 00 02 43 CF + 39 00 00 00 00 00 02 42 CF + 39 00 00 00 00 00 02 41 CF + 39 00 00 00 00 00 02 40 CF + 39 00 00 00 00 00 02 3F CF + 39 00 00 00 00 00 02 3E CE + 39 00 00 00 00 00 02 3D CE + 39 00 00 00 00 00 02 3C CE + 39 00 00 00 00 00 02 3B CD + 39 00 00 00 00 00 02 3A CD + 39 00 00 00 00 00 02 39 CD + 39 00 00 00 00 00 02 38 CC + 39 00 00 00 00 00 02 37 CC + 39 00 00 00 00 00 02 36 CC + 39 00 00 00 00 00 02 35 CC + 39 00 00 00 00 00 02 34 CC + 39 00 00 00 00 00 02 33 CB + 39 00 00 00 00 00 02 32 CA + 39 00 00 00 00 00 02 31 C9 + 39 00 00 00 00 00 02 30 C9 + 39 00 00 00 00 00 02 2F C8 + 39 00 00 00 00 00 02 2E C8 + 39 00 00 00 00 00 02 2D C7 + 39 00 00 00 00 00 02 2C C7 + 39 00 00 00 00 00 02 2B C6 + 39 00 00 00 00 00 02 2A C6 + 39 00 00 00 00 00 02 29 C5 + 39 00 00 00 00 00 02 28 C4 + 39 00 00 00 00 00 02 27 C4 + 39 00 00 00 00 00 02 26 C3 + 39 00 00 00 00 00 02 25 C2 + 39 00 00 00 00 00 02 24 C2 + 39 00 00 00 00 00 02 23 C1 + 39 00 00 00 00 00 02 22 C0 + 39 00 00 00 00 00 02 21 BF + 39 00 00 00 00 00 02 20 BF + 39 00 00 00 00 00 02 1F BE + 39 00 00 00 00 00 02 1E BE + 39 00 00 00 00 00 02 1D BE + 39 00 00 00 00 00 02 1C BD + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1A BD + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 18 BC + 39 00 00 00 00 00 02 17 BC + 39 00 00 00 00 00 02 16 BC + 39 00 00 00 00 00 02 15 BB + 39 00 00 00 00 00 02 14 BB + 39 00 00 00 00 00 02 13 BB + 39 00 00 00 00 00 02 12 BA + 39 00 00 00 00 00 02 11 BA + 39 00 00 00 00 00 02 10 B9 + 39 00 00 00 00 00 02 0F B9 + 39 00 00 00 00 00 02 0E B8 + 39 00 00 00 00 00 02 0D B8 + 39 00 00 00 00 00 02 0C B8 + 39 00 00 00 00 00 02 0B B7 + 39 00 00 00 00 00 02 0A B7 + 39 00 00 00 00 00 02 09 B6 + 39 00 00 00 00 00 02 08 B6 + 39 00 00 00 00 00 02 07 B5 + 39 00 00 00 00 00 02 06 B4 + 39 00 00 00 00 00 02 05 B4 + 39 00 00 00 00 00 02 04 B4 + 39 00 00 00 00 00 02 03 B3 + 39 00 00 00 00 00 02 02 B2 + 39 00 00 00 00 00 02 01 B2 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7B 85 + 39 00 00 00 00 00 02 7A 85 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 78 85 + 39 00 00 00 00 00 02 77 85 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 6E 87 + 39 00 00 00 00 00 02 6D 87 + 39 00 00 00 00 00 02 6C 87 + 39 00 00 00 00 00 02 6B 87 + 39 00 00 00 00 00 02 6A 86 + 39 00 00 00 00 00 02 69 86 + 39 00 00 00 00 00 02 68 86 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 66 87 + 39 00 00 00 00 00 02 65 87 + 39 00 00 00 00 00 02 64 87 + 39 00 00 00 00 00 02 63 87 + 39 00 00 00 00 00 02 62 87 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 60 87 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5D 86 + 39 00 00 00 00 00 02 5C 86 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 59 87 + 39 00 00 00 00 00 02 58 87 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4D 84 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4B 84 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 49 85 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 47 86 + 39 00 00 00 00 00 02 46 87 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 38 87 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 36 86 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 84 + 39 00 00 00 00 00 02 31 84 + 39 00 00 00 00 00 02 30 83 + 39 00 00 00 00 00 02 2F 83 + 39 00 00 00 00 00 02 2E 83 + 39 00 00 00 00 00 02 2D 84 + 39 00 00 00 00 00 02 2C 84 + 39 00 00 00 00 00 02 2B 84 + 39 00 00 00 00 00 02 2A 84 + 39 00 00 00 00 00 02 29 84 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 27 85 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 25 85 + 39 00 00 00 00 00 02 24 85 + 39 00 00 00 00 00 02 23 85 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 21 85 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F BD + 39 00 00 00 00 00 02 7E BD + 39 00 00 00 00 00 02 7D BD + 39 00 00 00 00 00 02 7C BD + 39 00 00 00 00 00 02 7B BD + 39 00 00 00 00 00 02 7A BD + 39 00 00 00 00 00 02 79 BD + 39 00 00 00 00 00 02 78 BC + 39 00 00 00 00 00 02 77 BC + 39 00 00 00 00 00 02 76 BB + 39 00 00 00 00 00 02 75 BB + 39 00 00 00 00 00 02 74 BC + 39 00 00 00 00 00 02 73 BC + 39 00 00 00 00 00 02 72 BC + 39 00 00 00 00 00 02 71 BC + 39 00 00 00 00 00 02 70 BB + 39 00 00 00 00 00 02 6F BB + 39 00 00 00 00 00 02 6E BB + 39 00 00 00 00 00 02 6D BB + 39 00 00 00 00 00 02 6C BA + 39 00 00 00 00 00 02 6B BA + 39 00 00 00 00 00 02 6A B9 + 39 00 00 00 00 00 02 69 B9 + 39 00 00 00 00 00 02 68 B9 + 39 00 00 00 00 00 02 67 B9 + 39 00 00 00 00 00 02 66 B9 + 39 00 00 00 00 00 02 65 B9 + 39 00 00 00 00 00 02 64 B9 + 39 00 00 00 00 00 02 63 B8 + 39 00 00 00 00 00 02 62 B8 + 39 00 00 00 00 00 02 61 B8 + 39 00 00 00 00 00 02 60 B8 + 39 00 00 00 00 00 02 5F B7 + 39 00 00 00 00 00 02 5E B7 + 39 00 00 00 00 00 02 5D B6 + 39 00 00 00 00 00 02 5C B6 + 39 00 00 00 00 00 02 5B B5 + 39 00 00 00 00 00 02 5A B5 + 39 00 00 00 00 00 02 59 B4 + 39 00 00 00 00 00 02 58 B3 + 39 00 00 00 00 00 02 57 B3 + 39 00 00 00 00 00 02 56 B4 + 39 00 00 00 00 00 02 55 B4 + 39 00 00 00 00 00 02 54 B4 + 39 00 00 00 00 00 02 53 B4 + 39 00 00 00 00 00 02 52 B5 + 39 00 00 00 00 00 02 51 B5 + 39 00 00 00 00 00 02 50 B5 + 39 00 00 00 00 00 02 4F B5 + 39 00 00 00 00 00 02 4E B5 + 39 00 00 00 00 00 02 4D B5 + 39 00 00 00 00 00 02 4C B5 + 39 00 00 00 00 00 02 4B B5 + 39 00 00 00 00 00 02 4A B5 + 39 00 00 00 00 00 02 49 B4 + 39 00 00 00 00 00 02 48 B4 + 39 00 00 00 00 00 02 47 B4 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 45 B3 + 39 00 00 00 00 00 02 44 B3 + 39 00 00 00 00 00 02 43 B3 + 39 00 00 00 00 00 02 42 B2 + 39 00 00 00 00 00 02 41 B1 + 39 00 00 00 00 00 02 40 B1 + 39 00 00 00 00 00 02 3F B0 + 39 00 00 00 00 00 02 3E B0 + 39 00 00 00 00 00 02 3D AF + 39 00 00 00 00 00 02 3C AE + 39 00 00 00 00 00 02 3B AE + 39 00 00 00 00 00 02 3A AD + 39 00 00 00 00 00 02 39 AD + 39 00 00 00 00 00 02 38 AE + 39 00 00 00 00 00 02 37 AE + 39 00 00 00 00 00 02 36 AE + 39 00 00 00 00 00 02 35 AE + 39 00 00 00 00 00 02 34 AE + 39 00 00 00 00 00 02 33 AE + 39 00 00 00 00 00 02 32 AE + 39 00 00 00 00 00 02 31 AD + 39 00 00 00 00 00 02 30 AD + 39 00 00 00 00 00 02 2F AD + 39 00 00 00 00 00 02 2E AD + 39 00 00 00 00 00 02 2D AE + 39 00 00 00 00 00 02 2C AD + 39 00 00 00 00 00 02 2B AD + 39 00 00 00 00 00 02 2A AC + 39 00 00 00 00 00 02 29 AC + 39 00 00 00 00 00 02 28 AC + 39 00 00 00 00 00 02 27 AC + 39 00 00 00 00 00 02 26 AB + 39 00 00 00 00 00 02 25 AB + 39 00 00 00 00 00 02 24 AA + 39 00 00 00 00 00 02 23 AA + 39 00 00 00 00 00 02 22 AA + 39 00 00 00 00 00 02 21 A9 + 39 00 00 00 00 00 02 20 A9 + 39 00 00 00 00 00 02 1F A8 + 39 00 00 00 00 00 02 1E A8 + 39 00 00 00 00 00 02 1D A7 + 39 00 00 00 00 00 02 1C A7 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1A A6 + 39 00 00 00 00 00 02 19 A5 + 39 00 00 00 00 00 02 18 A5 + 39 00 00 00 00 00 02 17 A5 + 39 00 00 00 00 00 02 16 A5 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 14 A5 + 39 00 00 00 00 00 02 13 A5 + 39 00 00 00 00 00 02 12 A5 + 39 00 00 00 00 00 02 11 A5 + 39 00 00 00 00 00 02 10 A5 + 39 00 00 00 00 00 02 0F A5 + 39 00 00 00 00 00 02 0E A5 + 39 00 00 00 00 00 02 0D A4 + 39 00 00 00 00 00 02 0C A4 + 39 00 00 00 00 00 02 0B A4 + 39 00 00 00 00 00 02 0A A4 + 39 00 00 00 00 00 02 09 A3 + 39 00 00 00 00 00 02 08 A3 + 39 00 00 00 00 00 02 07 A3 + 39 00 00 00 00 00 02 06 A3 + 39 00 00 00 00 00 02 05 A2 + 39 00 00 00 00 00 02 04 A2 + 39 00 00 00 00 00 02 03 A2 + 39 00 00 00 00 00 02 02 A1 + 39 00 00 00 00 00 02 01 A1 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 81 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F a0 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 a1 + 39 00 00 00 00 00 02 7F bd + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F b1 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 b1 + 39 00 00 00 00 00 02 7F f5 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F B1 + 39 00 00 00 00 00 02 7E B0 + 39 00 00 00 00 00 02 7D AF + 39 00 00 00 00 00 02 7C AF + 39 00 00 00 00 00 02 7B AE + 39 00 00 00 00 00 02 7A AE + 39 00 00 00 00 00 02 79 AD + 39 00 00 00 00 00 02 78 AC + 39 00 00 00 00 00 02 77 AC + 39 00 00 00 00 00 02 76 AC + 39 00 00 00 00 00 02 75 AB + 39 00 00 00 00 00 02 74 AB + 39 00 00 00 00 00 02 73 AA + 39 00 00 00 00 00 02 72 AA + 39 00 00 00 00 00 02 71 A9 + 39 00 00 00 00 00 02 70 A9 + 39 00 00 00 00 00 02 6F A8 + 39 00 00 00 00 00 02 6E A8 + 39 00 00 00 00 00 02 6D A7 + 39 00 00 00 00 00 02 6C A7 + 39 00 00 00 00 00 02 6B A6 + 39 00 00 00 00 00 02 6A A6 + 39 00 00 00 00 00 02 69 A5 + 39 00 00 00 00 00 02 68 A5 + 39 00 00 00 00 00 02 67 A4 + 39 00 00 00 00 00 02 66 A4 + 39 00 00 00 00 00 02 65 A3 + 39 00 00 00 00 00 02 64 A3 + 39 00 00 00 00 00 02 63 A2 + 39 00 00 00 00 00 02 62 A2 + 39 00 00 00 00 00 02 61 A2 + 39 00 00 00 00 00 02 60 A1 + 39 00 00 00 00 00 02 5F A1 + 39 00 00 00 00 00 02 5E A0 + 39 00 00 00 00 00 02 5D A0 + 39 00 00 00 00 00 02 5C 9F + 39 00 00 00 00 00 02 5B 9F + 39 00 00 00 00 00 02 5A 9F + 39 00 00 00 00 00 02 59 9F + 39 00 00 00 00 00 02 58 9E + 39 00 00 00 00 00 02 57 9E + 39 00 00 00 00 00 02 56 9D + 39 00 00 00 00 00 02 55 9D + 39 00 00 00 00 00 02 54 9C + 39 00 00 00 00 00 02 53 9B + 39 00 00 00 00 00 02 52 9A + 39 00 00 00 00 00 02 51 9A + 39 00 00 00 00 00 02 50 9A + 39 00 00 00 00 00 02 4F 99 + 39 00 00 00 00 00 02 4E 99 + 39 00 00 00 00 00 02 4D 98 + 39 00 00 00 00 00 02 4C 98 + 39 00 00 00 00 00 02 4B 98 + 39 00 00 00 00 00 02 4A 97 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 48 97 + 39 00 00 00 00 00 02 47 97 + 39 00 00 00 00 00 02 46 96 + 39 00 00 00 00 00 02 45 96 + 39 00 00 00 00 00 02 44 96 + 39 00 00 00 00 00 02 43 96 + 39 00 00 00 00 00 02 42 96 + 39 00 00 00 00 00 02 41 96 + 39 00 00 00 00 00 02 40 96 + 39 00 00 00 00 00 02 3F 96 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3D 96 + 39 00 00 00 00 00 02 3C 96 + 39 00 00 00 00 00 02 3B 96 + 39 00 00 00 00 00 02 3A 96 + 39 00 00 00 00 00 02 39 96 + 39 00 00 00 00 00 02 38 96 + 39 00 00 00 00 00 02 37 95 + 39 00 00 00 00 00 02 36 94 + 39 00 00 00 00 00 02 35 93 + 39 00 00 00 00 00 02 34 93 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 32 91 + 39 00 00 00 00 00 02 31 91 + 39 00 00 00 00 00 02 30 91 + 39 00 00 00 00 00 02 2F 90 + 39 00 00 00 00 00 02 2E 90 + 39 00 00 00 00 00 02 2D 8F + 39 00 00 00 00 00 02 2C 8F + 39 00 00 00 00 00 02 2B 8F + 39 00 00 00 00 00 02 2A 8F + 39 00 00 00 00 00 02 29 8E + 39 00 00 00 00 00 02 28 8E + 39 00 00 00 00 00 02 27 8D + 39 00 00 00 00 00 02 26 8B + 39 00 00 00 00 00 02 25 8C + 39 00 00 00 00 00 02 24 8C + 39 00 00 00 00 00 02 23 8C + 39 00 00 00 00 00 02 22 8B + 39 00 00 00 00 00 02 21 8B + 39 00 00 00 00 00 02 20 8A + 39 00 00 00 00 00 02 1F 8A + 39 00 00 00 00 00 02 1E 8A + 39 00 00 00 00 00 02 1D 8A + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1B 8A + 39 00 00 00 00 00 02 1A 8A + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 18 88 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 16 88 + 39 00 00 00 00 00 02 15 87 + 39 00 00 00 00 00 02 14 87 + 39 00 00 00 00 00 02 13 87 + 39 00 00 00 00 00 02 12 87 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 0E 85 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 79 00 + 39 00 00 00 00 00 02 78 00 + 39 00 00 00 00 00 02 77 00 + 39 00 00 00 00 00 02 76 00 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 72 01 + 39 00 00 00 00 00 02 71 02 + 39 00 00 00 00 00 02 70 02 + 39 00 00 00 00 00 02 6F 02 + 39 00 00 00 00 00 02 6E 02 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6C 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 57 06 + 39 00 00 00 00 00 02 56 06 + 39 00 00 00 00 00 02 55 06 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 52 06 + 39 00 00 00 00 00 02 51 06 + 39 00 00 00 00 00 02 50 06 + 39 00 00 00 00 00 02 4F 06 + 39 00 00 00 00 00 02 4E 06 + 39 00 00 00 00 00 02 4D 06 + 39 00 00 00 00 00 02 4C 07 + 39 00 00 00 00 00 02 4B 07 + 39 00 00 00 00 00 02 4A 08 + 39 00 00 00 00 00 02 49 08 + 39 00 00 00 00 00 02 48 08 + 39 00 00 00 00 00 02 47 08 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3A 05 + 39 00 00 00 00 00 02 39 05 + 39 00 00 00 00 00 02 38 04 + 39 00 00 00 00 00 02 37 04 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 32 02 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 30 03 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 26 04 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F A0 + 39 00 00 00 00 00 02 7E A0 + 39 00 00 00 00 00 02 7D 9F + 39 00 00 00 00 00 02 7C 9F + 39 00 00 00 00 00 02 7B 9F + 39 00 00 00 00 00 02 7A 9F + 39 00 00 00 00 00 02 79 9E + 39 00 00 00 00 00 02 78 9E + 39 00 00 00 00 00 02 77 9D + 39 00 00 00 00 00 02 76 9D + 39 00 00 00 00 00 02 75 9C + 39 00 00 00 00 00 02 74 9B + 39 00 00 00 00 00 02 73 9C + 39 00 00 00 00 00 02 72 9C + 39 00 00 00 00 00 02 71 9B + 39 00 00 00 00 00 02 70 9B + 39 00 00 00 00 00 02 6F 9B + 39 00 00 00 00 00 02 6E 9A + 39 00 00 00 00 00 02 6D 9A + 39 00 00 00 00 00 02 6C 9A + 39 00 00 00 00 00 02 6B 99 + 39 00 00 00 00 00 02 6A 99 + 39 00 00 00 00 00 02 69 98 + 39 00 00 00 00 00 02 68 98 + 39 00 00 00 00 00 02 67 98 + 39 00 00 00 00 00 02 66 97 + 39 00 00 00 00 00 02 65 97 + 39 00 00 00 00 00 02 64 97 + 39 00 00 00 00 00 02 63 96 + 39 00 00 00 00 00 02 62 96 + 39 00 00 00 00 00 02 61 96 + 39 00 00 00 00 00 02 60 95 + 39 00 00 00 00 00 02 5F 95 + 39 00 00 00 00 00 02 5E 95 + 39 00 00 00 00 00 02 5D 95 + 39 00 00 00 00 00 02 5C 94 + 39 00 00 00 00 00 02 5B 94 + 39 00 00 00 00 00 02 5A 94 + 39 00 00 00 00 00 02 59 94 + 39 00 00 00 00 00 02 58 93 + 39 00 00 00 00 00 02 57 93 + 39 00 00 00 00 00 02 56 93 + 39 00 00 00 00 00 02 55 93 + 39 00 00 00 00 00 02 54 93 + 39 00 00 00 00 00 02 53 92 + 39 00 00 00 00 00 02 52 91 + 39 00 00 00 00 00 02 51 91 + 39 00 00 00 00 00 02 50 90 + 39 00 00 00 00 00 02 4F 8F + 39 00 00 00 00 00 02 4E 90 + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4C 8F + 39 00 00 00 00 00 02 4B 8F + 39 00 00 00 00 00 02 4A 8F + 39 00 00 00 00 00 02 49 8E + 39 00 00 00 00 00 02 48 8E + 39 00 00 00 00 00 02 47 8E + 39 00 00 00 00 00 02 46 8E + 39 00 00 00 00 00 02 45 8E + 39 00 00 00 00 00 02 44 8E + 39 00 00 00 00 00 02 43 8E + 39 00 00 00 00 00 02 42 8E + 39 00 00 00 00 00 02 41 8E + 39 00 00 00 00 00 02 40 8E + 39 00 00 00 00 00 02 3F 8E + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3D 8F + 39 00 00 00 00 00 02 3C 8F + 39 00 00 00 00 00 02 3B 8F + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 39 8F + 39 00 00 00 00 00 02 38 8F + 39 00 00 00 00 00 02 37 8F + 39 00 00 00 00 00 02 36 8F + 39 00 00 00 00 00 02 35 8E + 39 00 00 00 00 00 02 34 8D + 39 00 00 00 00 00 02 33 8D + 39 00 00 00 00 00 02 32 8C + 39 00 00 00 00 00 02 31 8C + 39 00 00 00 00 00 02 30 8B + 39 00 00 00 00 00 02 2F 8B + 39 00 00 00 00 00 02 2E 8B + 39 00 00 00 00 00 02 2D 8A + 39 00 00 00 00 00 02 2C 8A + 39 00 00 00 00 00 02 2B 8A + 39 00 00 00 00 00 02 2A 8A + 39 00 00 00 00 00 02 29 8A + 39 00 00 00 00 00 02 28 89 + 39 00 00 00 00 00 02 27 89 + 39 00 00 00 00 00 02 26 88 + 39 00 00 00 00 00 02 25 87 + 39 00 00 00 00 00 02 24 87 + 39 00 00 00 00 00 02 23 88 + 39 00 00 00 00 00 02 22 88 + 39 00 00 00 00 00 02 21 87 + 39 00 00 00 00 00 02 20 87 + 39 00 00 00 00 00 02 1F 87 + 39 00 00 00 00 00 02 1E 86 + 39 00 00 00 00 00 02 1D 86 + 39 00 00 00 00 00 02 1C 87 + 39 00 00 00 00 00 02 1B 87 + 39 00 00 00 00 00 02 1A 87 + 39 00 00 00 00 00 02 19 86 + 39 00 00 00 00 00 02 18 86 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 16 85 + 39 00 00 00 00 00 02 15 85 + 39 00 00 00 00 00 02 14 85 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 12 85 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 10 84 + 39 00 00 00 00 00 02 0F 84 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + + qcom,mdss-dsi-panel-cool-command = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 30 04 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 32 03 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 37 05 + 39 00 00 00 00 00 02 38 05 + 39 00 00 00 00 00 02 39 05 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 47 08 + 39 00 00 00 00 00 02 48 08 + 39 00 00 00 00 00 02 49 09 + 39 00 00 00 00 00 02 4A 08 + 39 00 00 00 00 00 02 4B 08 + 39 00 00 00 00 00 02 4C 07 + 39 00 00 00 00 00 02 4D 07 + 39 00 00 00 00 00 02 4E 06 + 39 00 00 00 00 00 02 4F 06 + 39 00 00 00 00 00 02 50 06 + 39 00 00 00 00 00 02 51 06 + 39 00 00 00 00 00 02 52 07 + 39 00 00 00 00 00 02 53 07 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 55 06 + 39 00 00 00 00 00 02 56 06 + 39 00 00 00 00 00 02 57 06 + 39 00 00 00 00 00 02 58 06 + 39 00 00 00 00 00 02 59 06 + 39 00 00 00 00 00 02 5A 06 + 39 00 00 00 00 00 02 5B 06 + 39 00 00 00 00 00 02 5C 06 + 39 00 00 00 00 00 02 5D 06 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 03 + 39 00 00 00 00 00 02 6F 03 + 39 00 00 00 00 00 02 70 02 + 39 00 00 00 00 00 02 71 02 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 73 02 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 76 01 + 39 00 00 00 00 00 02 77 01 + 39 00 00 00 00 00 02 78 01 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 7B 00 + 39 00 00 00 00 00 02 7C 00 + 39 00 00 00 00 00 02 7D 00 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7F 00 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 07 01 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 01 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 00 + 39 00 00 00 00 00 02 18 81 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 00 + 39 00 00 00 00 00 02 1C 01 + 39 00 00 00 00 00 02 1D 01 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 01 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 00 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 01 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 00 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 00 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 00 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B 00 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D 00 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 30 81 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 34 82 + 39 00 00 00 00 00 02 35 81 + 39 00 00 00 00 00 02 36 81 + 39 00 00 00 00 00 02 37 81 + 39 00 00 00 00 00 02 38 81 + 39 00 00 00 00 00 02 39 00 + 39 00 00 00 00 00 02 3A 00 + 39 00 00 00 00 00 02 3B 01 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 02 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 02 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 03 + 39 00 00 00 00 00 02 42 03 + 39 00 00 00 00 00 02 43 03 + 39 00 00 00 00 00 02 44 03 + 39 00 00 00 00 00 02 45 03 + 39 00 00 00 00 00 02 46 03 + 39 00 00 00 00 00 02 47 03 + 39 00 00 00 00 00 02 48 03 + 39 00 00 00 00 00 02 49 03 + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 4B 03 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 02 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F 01 + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 51 01 + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 53 01 + 39 00 00 00 00 00 02 54 01 + 39 00 00 00 00 00 02 55 01 + 39 00 00 00 00 00 02 56 01 + 39 00 00 00 00 00 02 57 01 + 39 00 00 00 00 00 02 58 01 + 39 00 00 00 00 00 02 59 01 + 39 00 00 00 00 00 02 5A 01 + 39 00 00 00 00 00 02 5B 01 + 39 00 00 00 00 00 02 5C 01 + 39 00 00 00 00 00 02 5D 01 + 39 00 00 00 00 00 02 5E 01 + 39 00 00 00 00 00 02 5F 01 + 39 00 00 00 00 00 02 60 01 + 39 00 00 00 00 00 02 61 01 + 39 00 00 00 00 00 02 62 01 + 39 00 00 00 00 00 02 63 00 + 39 00 00 00 00 00 02 64 00 + 39 00 00 00 00 00 02 65 00 + 39 00 00 00 00 00 02 66 00 + 39 00 00 00 00 00 02 67 00 + 39 00 00 00 00 00 02 68 00 + 39 00 00 00 00 00 02 69 00 + 39 00 00 00 00 00 02 6A 00 + 39 00 00 00 00 00 02 6B 81 + 39 00 00 00 00 00 02 6C 81 + 39 00 00 00 00 00 02 6D 00 + 39 00 00 00 00 00 02 6E 00 + 39 00 00 00 00 00 02 6F 81 + 39 00 00 00 00 00 02 70 81 + 39 00 00 00 00 00 02 71 81 + 39 00 00 00 00 00 02 72 81 + 39 00 00 00 00 00 02 73 82 + 39 00 00 00 00 00 02 74 82 + 39 00 00 00 00 00 02 75 82 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7F 83 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 05 02 + 39 00 00 00 00 00 02 06 02 + 39 00 00 00 00 00 02 07 02 + 39 00 00 00 00 00 02 08 02 + 39 00 00 00 00 00 02 09 02 + 39 00 00 00 00 00 02 0A 02 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0C 02 + 39 00 00 00 00 00 02 0D 02 + 39 00 00 00 00 00 02 0E 02 + 39 00 00 00 00 00 02 0F 02 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 03 + 39 00 00 00 00 00 02 12 03 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 20 07 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 07 + 39 00 00 00 00 00 02 23 07 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 07 + 39 00 00 00 00 00 02 26 07 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 29 08 + 39 00 00 00 00 00 02 2A 08 + 39 00 00 00 00 00 02 2B 08 + 39 00 00 00 00 00 02 2C 08 + 39 00 00 00 00 00 02 2D 08 + 39 00 00 00 00 00 02 2E 08 + 39 00 00 00 00 00 02 2F 08 + 39 00 00 00 00 00 02 30 07 + 39 00 00 00 00 00 02 31 07 + 39 00 00 00 00 00 02 32 08 + 39 00 00 00 00 00 02 33 08 + 39 00 00 00 00 00 02 34 09 + 39 00 00 00 00 00 02 35 09 + 39 00 00 00 00 00 02 36 0A + 39 00 00 00 00 00 02 37 0A + 39 00 00 00 00 00 02 38 0B + 39 00 00 00 00 00 02 39 0C + 39 00 00 00 00 00 02 3A 0C + 39 00 00 00 00 00 02 3B 0D + 39 00 00 00 00 00 02 3C 0D + 39 00 00 00 00 00 02 3D 0E + 39 00 00 00 00 00 02 3E 0E + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 40 0F + 39 00 00 00 00 00 02 41 0F + 39 00 00 00 00 00 02 42 0F + 39 00 00 00 00 00 02 43 0F + 39 00 00 00 00 00 02 44 0F + 39 00 00 00 00 00 02 45 0F + 39 00 00 00 00 00 02 46 10 + 39 00 00 00 00 00 02 47 10 + 39 00 00 00 00 00 02 48 10 + 39 00 00 00 00 00 02 49 10 + 39 00 00 00 00 00 02 4A 0F + 39 00 00 00 00 00 02 4B 0F + 39 00 00 00 00 00 02 4C 0F + 39 00 00 00 00 00 02 4D 0F + 39 00 00 00 00 00 02 4E 0F + 39 00 00 00 00 00 02 4F 0F + 39 00 00 00 00 00 02 50 10 + 39 00 00 00 00 00 02 51 10 + 39 00 00 00 00 00 02 52 10 + 39 00 00 00 00 00 02 53 10 + 39 00 00 00 00 00 02 54 10 + 39 00 00 00 00 00 02 55 10 + 39 00 00 00 00 00 02 56 11 + 39 00 00 00 00 00 02 57 11 + 39 00 00 00 00 00 02 58 11 + 39 00 00 00 00 00 02 59 11 + 39 00 00 00 00 00 02 5A 11 + 39 00 00 00 00 00 02 5B 11 + 39 00 00 00 00 00 02 5C 11 + 39 00 00 00 00 00 02 5D 11 + 39 00 00 00 00 00 02 5E 11 + 39 00 00 00 00 00 02 5F 11 + 39 00 00 00 00 00 02 60 11 + 39 00 00 00 00 00 02 61 11 + 39 00 00 00 00 00 02 62 11 + 39 00 00 00 00 00 02 63 11 + 39 00 00 00 00 00 02 64 11 + 39 00 00 00 00 00 02 65 11 + 39 00 00 00 00 00 02 66 11 + 39 00 00 00 00 00 02 67 11 + 39 00 00 00 00 00 02 68 11 + 39 00 00 00 00 00 02 69 12 + 39 00 00 00 00 00 02 6A 11 + 39 00 00 00 00 00 02 6B 11 + 39 00 00 00 00 00 02 6C 11 + 39 00 00 00 00 00 02 6D 11 + 39 00 00 00 00 00 02 6E 11 + 39 00 00 00 00 00 02 6F 10 + 39 00 00 00 00 00 02 70 11 + 39 00 00 00 00 00 02 71 11 + 39 00 00 00 00 00 02 72 10 + 39 00 00 00 00 00 02 73 10 + 39 00 00 00 00 00 02 74 11 + 39 00 00 00 00 00 02 75 10 + 39 00 00 00 00 00 02 76 10 + 39 00 00 00 00 00 02 77 10 + 39 00 00 00 00 00 02 78 10 + 39 00 00 00 00 00 02 79 10 + 39 00 00 00 00 00 02 7A 10 + 39 00 00 00 00 00 02 7B 11 + 39 00 00 00 00 00 02 7C 11 + 39 00 00 00 00 00 02 7D 11 + 39 00 00 00 00 00 02 7E 11 + 39 00 00 00 00 00 02 7F 11 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 1A 83 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1C 83 + 39 00 00 00 00 00 02 1D 83 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 3B 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 45 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 48 84 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 4A 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4C 82 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 57 85 + 39 00 00 00 00 00 02 58 85 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 5A 85 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 67 85 + 39 00 00 00 00 00 02 68 84 + 39 00 00 00 00 00 02 69 84 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 6B 85 + 39 00 00 00 00 00 02 6C 85 + 39 00 00 00 00 00 02 6D 85 + 39 00 00 00 00 00 02 6E 85 + 39 00 00 00 00 00 02 6F 84 + 39 00 00 00 00 00 02 70 84 + 39 00 00 00 00 00 02 71 84 + 39 00 00 00 00 00 02 72 84 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 75 84 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 79 83 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7F 83 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 39 84 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3C 85 + 39 00 00 00 00 00 02 3D 85 + 39 00 00 00 00 00 02 3E 85 + 39 00 00 00 00 00 02 3F 85 + 39 00 00 00 00 00 02 40 85 + 39 00 00 00 00 00 02 41 85 + 39 00 00 00 00 00 02 42 84 + 39 00 00 00 00 00 02 43 84 + 39 00 00 00 00 00 02 44 84 + 39 00 00 00 00 00 02 45 83 + 39 00 00 00 00 00 02 46 83 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 48 82 + 39 00 00 00 00 00 02 49 81 + 39 00 00 00 00 00 02 4A 81 + 39 00 00 00 00 00 02 4B 00 + 39 00 00 00 00 00 02 4C 81 + 39 00 00 00 00 00 02 4D 81 + 39 00 00 00 00 00 02 4E 81 + 39 00 00 00 00 00 02 4F 82 + 39 00 00 00 00 00 02 50 82 + 39 00 00 00 00 00 02 51 83 + 39 00 00 00 00 00 02 52 83 + 39 00 00 00 00 00 02 53 83 + 39 00 00 00 00 00 02 54 83 + 39 00 00 00 00 00 02 55 83 + 39 00 00 00 00 00 02 56 83 + 39 00 00 00 00 00 02 57 83 + 39 00 00 00 00 00 02 58 82 + 39 00 00 00 00 00 02 59 82 + 39 00 00 00 00 00 02 5A 82 + 39 00 00 00 00 00 02 5B 82 + 39 00 00 00 00 00 02 5C 82 + 39 00 00 00 00 00 02 5D 82 + 39 00 00 00 00 00 02 5E 82 + 39 00 00 00 00 00 02 5F 83 + 39 00 00 00 00 00 02 60 83 + 39 00 00 00 00 00 02 61 83 + 39 00 00 00 00 00 02 62 83 + 39 00 00 00 00 00 02 63 83 + 39 00 00 00 00 00 02 64 82 + 39 00 00 00 00 00 02 65 82 + 39 00 00 00 00 00 02 66 82 + 39 00 00 00 00 00 02 67 81 + 39 00 00 00 00 00 02 68 81 + 39 00 00 00 00 00 02 69 82 + 39 00 00 00 00 00 02 6A 82 + 39 00 00 00 00 00 02 6B 82 + 39 00 00 00 00 00 02 6C 82 + 39 00 00 00 00 00 02 6D 82 + 39 00 00 00 00 00 02 6E 81 + 39 00 00 00 00 00 02 6F 81 + 39 00 00 00 00 00 02 70 81 + 39 00 00 00 00 00 02 71 81 + 39 00 00 00 00 00 02 72 00 + 39 00 00 00 00 00 02 73 00 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 75 81 + 39 00 00 00 00 00 02 76 81 + 39 00 00 00 00 00 02 77 81 + 39 00 00 00 00 00 02 78 81 + 39 00 00 00 00 00 02 79 81 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 7B 00 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7F 00 + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 11 + 39 00 00 00 00 00 02 02 11 + 39 00 00 00 00 00 02 03 11 + 39 00 00 00 00 00 02 04 11 + 39 00 00 00 00 00 02 05 12 + 39 00 00 00 00 00 02 06 12 + 39 00 00 00 00 00 02 07 13 + 39 00 00 00 00 00 02 08 13 + 39 00 00 00 00 00 02 09 13 + 39 00 00 00 00 00 02 0A 13 + 39 00 00 00 00 00 02 0B 14 + 39 00 00 00 00 00 02 0C 13 + 39 00 00 00 00 00 02 0D 13 + 39 00 00 00 00 00 02 0E 13 + 39 00 00 00 00 00 02 0F 13 + 39 00 00 00 00 00 02 10 12 + 39 00 00 00 00 00 02 11 12 + 39 00 00 00 00 00 02 12 12 + 39 00 00 00 00 00 02 13 12 + 39 00 00 00 00 00 02 14 12 + 39 00 00 00 00 00 02 15 12 + 39 00 00 00 00 00 02 16 12 + 39 00 00 00 00 00 02 17 12 + 39 00 00 00 00 00 02 18 12 + 39 00 00 00 00 00 02 19 12 + 39 00 00 00 00 00 02 1A 12 + 39 00 00 00 00 00 02 1B 12 + 39 00 00 00 00 00 02 1C 11 + 39 00 00 00 00 00 02 1D 11 + 39 00 00 00 00 00 02 1E 12 + 39 00 00 00 00 00 02 1F 12 + 39 00 00 00 00 00 02 20 12 + 39 00 00 00 00 00 02 21 13 + 39 00 00 00 00 00 02 22 13 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 13 + 39 00 00 00 00 00 02 25 13 + 39 00 00 00 00 00 02 26 14 + 39 00 00 00 00 00 02 27 14 + 39 00 00 00 00 00 02 28 14 + 39 00 00 00 00 00 02 29 15 + 39 00 00 00 00 00 02 2A 15 + 39 00 00 00 00 00 02 2B 14 + 39 00 00 00 00 00 02 2C 14 + 39 00 00 00 00 00 02 2D 14 + 39 00 00 00 00 00 02 2E 13 + 39 00 00 00 00 00 02 2F 13 + 39 00 00 00 00 00 02 30 13 + 39 00 00 00 00 00 02 31 12 + 39 00 00 00 00 00 02 32 12 + 39 00 00 00 00 00 02 33 12 + 39 00 00 00 00 00 02 34 12 + 39 00 00 00 00 00 02 35 11 + 39 00 00 00 00 00 02 36 11 + 39 00 00 00 00 00 02 37 11 + 39 00 00 00 00 00 02 38 11 + 39 00 00 00 00 00 02 39 11 + 39 00 00 00 00 00 02 3A 11 + 39 00 00 00 00 00 02 3B 11 + 39 00 00 00 00 00 02 3C 11 + 39 00 00 00 00 00 02 3D 11 + 39 00 00 00 00 00 02 3E 12 + 39 00 00 00 00 00 02 3F 12 + 39 00 00 00 00 00 02 40 13 + 39 00 00 00 00 00 02 41 13 + 39 00 00 00 00 00 02 42 13 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 44 14 + 39 00 00 00 00 00 02 45 15 + 39 00 00 00 00 00 02 46 15 + 39 00 00 00 00 00 02 47 14 + 39 00 00 00 00 00 02 48 14 + 39 00 00 00 00 00 02 49 13 + 39 00 00 00 00 00 02 4A 13 + 39 00 00 00 00 00 02 4B 12 + 39 00 00 00 00 00 02 4C 12 + 39 00 00 00 00 00 02 4D 12 + 39 00 00 00 00 00 02 4E 11 + 39 00 00 00 00 00 02 4F 11 + 39 00 00 00 00 00 02 50 11 + 39 00 00 00 00 00 02 51 11 + 39 00 00 00 00 00 02 52 11 + 39 00 00 00 00 00 02 53 11 + 39 00 00 00 00 00 02 54 11 + 39 00 00 00 00 00 02 55 11 + 39 00 00 00 00 00 02 56 11 + 39 00 00 00 00 00 02 57 11 + 39 00 00 00 00 00 02 58 11 + 39 00 00 00 00 00 02 59 10 + 39 00 00 00 00 00 02 5A 10 + 39 00 00 00 00 00 02 5B 0F + 39 00 00 00 00 00 02 5C 0F + 39 00 00 00 00 00 02 5D 0F + 39 00 00 00 00 00 02 5E 0E + 39 00 00 00 00 00 02 5F 0E + 39 00 00 00 00 00 02 60 0E + 39 00 00 00 00 00 02 61 0E + 39 00 00 00 00 00 02 62 0E + 39 00 00 00 00 00 02 63 0E + 39 00 00 00 00 00 02 64 0E + 39 00 00 00 00 00 02 65 0D + 39 00 00 00 00 00 02 66 0D + 39 00 00 00 00 00 02 67 0C + 39 00 00 00 00 00 02 68 0C + 39 00 00 00 00 00 02 69 0B + 39 00 00 00 00 00 02 6A 0B + 39 00 00 00 00 00 02 6B 0B + 39 00 00 00 00 00 02 6C 0B + 39 00 00 00 00 00 02 6D 0B + 39 00 00 00 00 00 02 6E 0A + 39 00 00 00 00 00 02 6F 0A + 39 00 00 00 00 00 02 70 0A + 39 00 00 00 00 00 02 71 09 + 39 00 00 00 00 00 02 72 08 + 39 00 00 00 00 00 02 73 07 + 39 00 00 00 00 00 02 74 06 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 76 05 + 39 00 00 00 00 00 02 77 04 + 39 00 00 00 00 00 02 78 04 + 39 00 00 00 00 00 02 79 03 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7F 85 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 83 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 11 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 11 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 79 03 + 39 00 00 00 00 00 02 78 04 + 39 00 00 00 00 00 02 77 04 + 39 00 00 00 00 00 02 76 05 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 74 06 + 39 00 00 00 00 00 02 73 07 + 39 00 00 00 00 00 02 72 08 + 39 00 00 00 00 00 02 71 09 + 39 00 00 00 00 00 02 70 0A + 39 00 00 00 00 00 02 6F 0A + 39 00 00 00 00 00 02 6E 0A + 39 00 00 00 00 00 02 6D 0B + 39 00 00 00 00 00 02 6C 0B + 39 00 00 00 00 00 02 6B 0B + 39 00 00 00 00 00 02 6A 0B + 39 00 00 00 00 00 02 69 0B + 39 00 00 00 00 00 02 68 0C + 39 00 00 00 00 00 02 67 0C + 39 00 00 00 00 00 02 66 0D + 39 00 00 00 00 00 02 65 0D + 39 00 00 00 00 00 02 64 0E + 39 00 00 00 00 00 02 63 0E + 39 00 00 00 00 00 02 62 0E + 39 00 00 00 00 00 02 61 0E + 39 00 00 00 00 00 02 60 0E + 39 00 00 00 00 00 02 5F 0E + 39 00 00 00 00 00 02 5E 0E + 39 00 00 00 00 00 02 5D 0F + 39 00 00 00 00 00 02 5C 0F + 39 00 00 00 00 00 02 5B 0F + 39 00 00 00 00 00 02 5A 10 + 39 00 00 00 00 00 02 59 10 + 39 00 00 00 00 00 02 58 11 + 39 00 00 00 00 00 02 57 11 + 39 00 00 00 00 00 02 56 11 + 39 00 00 00 00 00 02 55 11 + 39 00 00 00 00 00 02 54 11 + 39 00 00 00 00 00 02 53 11 + 39 00 00 00 00 00 02 52 11 + 39 00 00 00 00 00 02 51 11 + 39 00 00 00 00 00 02 50 11 + 39 00 00 00 00 00 02 4F 11 + 39 00 00 00 00 00 02 4E 11 + 39 00 00 00 00 00 02 4D 12 + 39 00 00 00 00 00 02 4C 12 + 39 00 00 00 00 00 02 4B 12 + 39 00 00 00 00 00 02 4A 13 + 39 00 00 00 00 00 02 49 13 + 39 00 00 00 00 00 02 48 14 + 39 00 00 00 00 00 02 47 14 + 39 00 00 00 00 00 02 46 15 + 39 00 00 00 00 00 02 45 15 + 39 00 00 00 00 00 02 44 14 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 42 13 + 39 00 00 00 00 00 02 41 13 + 39 00 00 00 00 00 02 40 13 + 39 00 00 00 00 00 02 3F 12 + 39 00 00 00 00 00 02 3E 12 + 39 00 00 00 00 00 02 3D 11 + 39 00 00 00 00 00 02 3C 11 + 39 00 00 00 00 00 02 3B 11 + 39 00 00 00 00 00 02 3A 11 + 39 00 00 00 00 00 02 39 11 + 39 00 00 00 00 00 02 38 11 + 39 00 00 00 00 00 02 37 11 + 39 00 00 00 00 00 02 36 11 + 39 00 00 00 00 00 02 35 11 + 39 00 00 00 00 00 02 34 12 + 39 00 00 00 00 00 02 33 12 + 39 00 00 00 00 00 02 32 12 + 39 00 00 00 00 00 02 31 12 + 39 00 00 00 00 00 02 30 13 + 39 00 00 00 00 00 02 2F 13 + 39 00 00 00 00 00 02 2E 13 + 39 00 00 00 00 00 02 2D 14 + 39 00 00 00 00 00 02 2C 14 + 39 00 00 00 00 00 02 2B 14 + 39 00 00 00 00 00 02 2A 15 + 39 00 00 00 00 00 02 29 15 + 39 00 00 00 00 00 02 28 14 + 39 00 00 00 00 00 02 27 14 + 39 00 00 00 00 00 02 26 14 + 39 00 00 00 00 00 02 25 13 + 39 00 00 00 00 00 02 24 13 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 22 13 + 39 00 00 00 00 00 02 21 13 + 39 00 00 00 00 00 02 20 12 + 39 00 00 00 00 00 02 1F 12 + 39 00 00 00 00 00 02 1E 12 + 39 00 00 00 00 00 02 1D 11 + 39 00 00 00 00 00 02 1C 11 + 39 00 00 00 00 00 02 1B 12 + 39 00 00 00 00 00 02 1A 12 + 39 00 00 00 00 00 02 19 12 + 39 00 00 00 00 00 02 18 12 + 39 00 00 00 00 00 02 17 12 + 39 00 00 00 00 00 02 16 12 + 39 00 00 00 00 00 02 15 12 + 39 00 00 00 00 00 02 14 12 + 39 00 00 00 00 00 02 13 12 + 39 00 00 00 00 00 02 12 12 + 39 00 00 00 00 00 02 11 12 + 39 00 00 00 00 00 02 10 12 + 39 00 00 00 00 00 02 0F 13 + 39 00 00 00 00 00 02 0E 13 + 39 00 00 00 00 00 02 0D 13 + 39 00 00 00 00 00 02 0C 13 + 39 00 00 00 00 00 02 0B 14 + 39 00 00 00 00 00 02 0A 13 + 39 00 00 00 00 00 02 09 13 + 39 00 00 00 00 00 02 08 13 + 39 00 00 00 00 00 02 07 13 + 39 00 00 00 00 00 02 06 12 + 39 00 00 00 00 00 02 05 12 + 39 00 00 00 00 00 02 04 11 + 39 00 00 00 00 00 02 03 11 + 39 00 00 00 00 00 02 02 11 + 39 00 00 00 00 00 02 01 11 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 79 83 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 75 84 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 72 84 + 39 00 00 00 00 00 02 71 84 + 39 00 00 00 00 00 02 70 84 + 39 00 00 00 00 00 02 6F 84 + 39 00 00 00 00 00 02 6E 85 + 39 00 00 00 00 00 02 6D 85 + 39 00 00 00 00 00 02 6C 85 + 39 00 00 00 00 00 02 6B 85 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 69 84 + 39 00 00 00 00 00 02 68 84 + 39 00 00 00 00 00 02 67 85 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5A 85 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 58 85 + 39 00 00 00 00 00 02 57 85 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4C 82 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4A 83 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 48 84 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 45 85 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3B 86 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1D 83 + 39 00 00 00 00 00 02 1C 83 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1A 83 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 01 00 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7B 00 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 79 81 + 39 00 00 00 00 00 02 78 81 + 39 00 00 00 00 00 02 77 81 + 39 00 00 00 00 00 02 76 81 + 39 00 00 00 00 00 02 75 81 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 73 00 + 39 00 00 00 00 00 02 72 00 + 39 00 00 00 00 00 02 71 81 + 39 00 00 00 00 00 02 70 81 + 39 00 00 00 00 00 02 6F 81 + 39 00 00 00 00 00 02 6E 81 + 39 00 00 00 00 00 02 6D 82 + 39 00 00 00 00 00 02 6C 82 + 39 00 00 00 00 00 02 6B 82 + 39 00 00 00 00 00 02 6A 82 + 39 00 00 00 00 00 02 69 82 + 39 00 00 00 00 00 02 68 81 + 39 00 00 00 00 00 02 67 81 + 39 00 00 00 00 00 02 66 82 + 39 00 00 00 00 00 02 65 82 + 39 00 00 00 00 00 02 64 82 + 39 00 00 00 00 00 02 63 83 + 39 00 00 00 00 00 02 62 83 + 39 00 00 00 00 00 02 61 83 + 39 00 00 00 00 00 02 60 83 + 39 00 00 00 00 00 02 5F 83 + 39 00 00 00 00 00 02 5E 82 + 39 00 00 00 00 00 02 5D 82 + 39 00 00 00 00 00 02 5C 82 + 39 00 00 00 00 00 02 5B 82 + 39 00 00 00 00 00 02 5A 82 + 39 00 00 00 00 00 02 59 82 + 39 00 00 00 00 00 02 58 82 + 39 00 00 00 00 00 02 57 83 + 39 00 00 00 00 00 02 56 83 + 39 00 00 00 00 00 02 55 83 + 39 00 00 00 00 00 02 54 83 + 39 00 00 00 00 00 02 53 83 + 39 00 00 00 00 00 02 52 83 + 39 00 00 00 00 00 02 51 83 + 39 00 00 00 00 00 02 50 82 + 39 00 00 00 00 00 02 4F 82 + 39 00 00 00 00 00 02 4E 81 + 39 00 00 00 00 00 02 4D 81 + 39 00 00 00 00 00 02 4C 81 + 39 00 00 00 00 00 02 4B 00 + 39 00 00 00 00 00 02 4A 81 + 39 00 00 00 00 00 02 49 81 + 39 00 00 00 00 00 02 48 82 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 46 83 + 39 00 00 00 00 00 02 45 83 + 39 00 00 00 00 00 02 44 84 + 39 00 00 00 00 00 02 43 84 + 39 00 00 00 00 00 02 42 84 + 39 00 00 00 00 00 02 41 85 + 39 00 00 00 00 00 02 40 85 + 39 00 00 00 00 00 02 3F 85 + 39 00 00 00 00 00 02 3E 85 + 39 00 00 00 00 00 02 3D 85 + 39 00 00 00 00 00 02 3C 85 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 39 84 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 83 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 11 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 11 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 11 + 39 00 00 00 00 00 02 7E 11 + 39 00 00 00 00 00 02 7D 11 + 39 00 00 00 00 00 02 7C 11 + 39 00 00 00 00 00 02 7B 11 + 39 00 00 00 00 00 02 7A 10 + 39 00 00 00 00 00 02 79 10 + 39 00 00 00 00 00 02 78 10 + 39 00 00 00 00 00 02 77 10 + 39 00 00 00 00 00 02 76 10 + 39 00 00 00 00 00 02 75 10 + 39 00 00 00 00 00 02 74 11 + 39 00 00 00 00 00 02 73 10 + 39 00 00 00 00 00 02 72 10 + 39 00 00 00 00 00 02 71 11 + 39 00 00 00 00 00 02 70 11 + 39 00 00 00 00 00 02 6F 10 + 39 00 00 00 00 00 02 6E 11 + 39 00 00 00 00 00 02 6D 11 + 39 00 00 00 00 00 02 6C 11 + 39 00 00 00 00 00 02 6B 11 + 39 00 00 00 00 00 02 6A 11 + 39 00 00 00 00 00 02 69 12 + 39 00 00 00 00 00 02 68 11 + 39 00 00 00 00 00 02 67 11 + 39 00 00 00 00 00 02 66 11 + 39 00 00 00 00 00 02 65 11 + 39 00 00 00 00 00 02 64 11 + 39 00 00 00 00 00 02 63 11 + 39 00 00 00 00 00 02 62 11 + 39 00 00 00 00 00 02 61 11 + 39 00 00 00 00 00 02 60 11 + 39 00 00 00 00 00 02 5F 11 + 39 00 00 00 00 00 02 5E 11 + 39 00 00 00 00 00 02 5D 11 + 39 00 00 00 00 00 02 5C 11 + 39 00 00 00 00 00 02 5B 11 + 39 00 00 00 00 00 02 5A 11 + 39 00 00 00 00 00 02 59 11 + 39 00 00 00 00 00 02 58 11 + 39 00 00 00 00 00 02 57 11 + 39 00 00 00 00 00 02 56 11 + 39 00 00 00 00 00 02 55 10 + 39 00 00 00 00 00 02 54 10 + 39 00 00 00 00 00 02 53 10 + 39 00 00 00 00 00 02 52 10 + 39 00 00 00 00 00 02 51 10 + 39 00 00 00 00 00 02 50 10 + 39 00 00 00 00 00 02 4F 0F + 39 00 00 00 00 00 02 4E 0F + 39 00 00 00 00 00 02 4D 0F + 39 00 00 00 00 00 02 4C 0F + 39 00 00 00 00 00 02 4B 0F + 39 00 00 00 00 00 02 4A 0F + 39 00 00 00 00 00 02 49 10 + 39 00 00 00 00 00 02 48 10 + 39 00 00 00 00 00 02 47 10 + 39 00 00 00 00 00 02 46 10 + 39 00 00 00 00 00 02 45 0F + 39 00 00 00 00 00 02 44 0F + 39 00 00 00 00 00 02 43 0F + 39 00 00 00 00 00 02 42 0F + 39 00 00 00 00 00 02 41 0F + 39 00 00 00 00 00 02 40 0F + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 3E 0E + 39 00 00 00 00 00 02 3D 0E + 39 00 00 00 00 00 02 3C 0D + 39 00 00 00 00 00 02 3B 0D + 39 00 00 00 00 00 02 3A 0C + 39 00 00 00 00 00 02 39 0C + 39 00 00 00 00 00 02 38 0B + 39 00 00 00 00 00 02 37 0A + 39 00 00 00 00 00 02 36 0A + 39 00 00 00 00 00 02 35 09 + 39 00 00 00 00 00 02 34 09 + 39 00 00 00 00 00 02 33 08 + 39 00 00 00 00 00 02 32 08 + 39 00 00 00 00 00 02 31 07 + 39 00 00 00 00 00 02 30 07 + 39 00 00 00 00 00 02 2F 08 + 39 00 00 00 00 00 02 2E 08 + 39 00 00 00 00 00 02 2D 08 + 39 00 00 00 00 00 02 2C 08 + 39 00 00 00 00 00 02 2B 08 + 39 00 00 00 00 00 02 2A 08 + 39 00 00 00 00 00 02 29 08 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 07 + 39 00 00 00 00 00 02 25 07 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 07 + 39 00 00 00 00 00 02 22 07 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 20 07 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 03 + 39 00 00 00 00 00 02 11 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 02 + 39 00 00 00 00 00 02 0E 02 + 39 00 00 00 00 00 02 0D 02 + 39 00 00 00 00 00 02 0C 02 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0A 02 + 39 00 00 00 00 00 02 09 02 + 39 00 00 00 00 00 02 08 02 + 39 00 00 00 00 00 02 07 02 + 39 00 00 00 00 00 02 06 02 + 39 00 00 00 00 00 02 05 02 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7D 00 + 39 00 00 00 00 00 02 7C 00 + 39 00 00 00 00 00 02 7B 00 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 78 01 + 39 00 00 00 00 00 02 77 01 + 39 00 00 00 00 00 02 76 01 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 73 02 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 71 02 + 39 00 00 00 00 00 02 70 02 + 39 00 00 00 00 00 02 6F 03 + 39 00 00 00 00 00 02 6E 03 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 06 + 39 00 00 00 00 00 02 5C 06 + 39 00 00 00 00 00 02 5B 06 + 39 00 00 00 00 00 02 5A 06 + 39 00 00 00 00 00 02 59 06 + 39 00 00 00 00 00 02 58 06 + 39 00 00 00 00 00 02 57 06 + 39 00 00 00 00 00 02 56 06 + 39 00 00 00 00 00 02 55 06 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 53 07 + 39 00 00 00 00 00 02 52 07 + 39 00 00 00 00 00 02 51 06 + 39 00 00 00 00 00 02 50 06 + 39 00 00 00 00 00 02 4F 06 + 39 00 00 00 00 00 02 4E 06 + 39 00 00 00 00 00 02 4D 07 + 39 00 00 00 00 00 02 4C 07 + 39 00 00 00 00 00 02 4B 08 + 39 00 00 00 00 00 02 4A 08 + 39 00 00 00 00 00 02 49 09 + 39 00 00 00 00 00 02 48 08 + 39 00 00 00 00 00 02 47 08 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 39 05 + 39 00 00 00 00 00 02 38 05 + 39 00 00 00 00 00 02 37 05 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 32 03 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 30 04 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 04 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 75 82 + 39 00 00 00 00 00 02 74 82 + 39 00 00 00 00 00 02 73 82 + 39 00 00 00 00 00 02 72 81 + 39 00 00 00 00 00 02 71 81 + 39 00 00 00 00 00 02 70 81 + 39 00 00 00 00 00 02 6F 81 + 39 00 00 00 00 00 02 6E 00 + 39 00 00 00 00 00 02 6D 00 + 39 00 00 00 00 00 02 6C 81 + 39 00 00 00 00 00 02 6B 81 + 39 00 00 00 00 00 02 6A 00 + 39 00 00 00 00 00 02 69 00 + 39 00 00 00 00 00 02 68 00 + 39 00 00 00 00 00 02 67 00 + 39 00 00 00 00 00 02 66 00 + 39 00 00 00 00 00 02 65 00 + 39 00 00 00 00 00 02 64 00 + 39 00 00 00 00 00 02 63 00 + 39 00 00 00 00 00 02 62 01 + 39 00 00 00 00 00 02 61 01 + 39 00 00 00 00 00 02 60 01 + 39 00 00 00 00 00 02 5F 01 + 39 00 00 00 00 00 02 5E 01 + 39 00 00 00 00 00 02 5D 01 + 39 00 00 00 00 00 02 5C 01 + 39 00 00 00 00 00 02 5B 01 + 39 00 00 00 00 00 02 5A 01 + 39 00 00 00 00 00 02 59 01 + 39 00 00 00 00 00 02 58 01 + 39 00 00 00 00 00 02 57 01 + 39 00 00 00 00 00 02 56 01 + 39 00 00 00 00 00 02 55 01 + 39 00 00 00 00 00 02 54 01 + 39 00 00 00 00 00 02 53 01 + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 51 01 + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 4F 01 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4D 02 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4B 03 + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 49 03 + 39 00 00 00 00 00 02 48 03 + 39 00 00 00 00 00 02 47 03 + 39 00 00 00 00 00 02 46 03 + 39 00 00 00 00 00 02 45 03 + 39 00 00 00 00 00 02 44 03 + 39 00 00 00 00 00 02 43 03 + 39 00 00 00 00 00 02 42 03 + 39 00 00 00 00 00 02 41 03 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 3F 02 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3D 02 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3B 01 + 39 00 00 00 00 00 02 3A 00 + 39 00 00 00 00 00 02 39 00 + 39 00 00 00 00 00 02 38 81 + 39 00 00 00 00 00 02 37 81 + 39 00 00 00 00 00 02 36 81 + 39 00 00 00 00 00 02 35 81 + 39 00 00 00 00 00 02 34 82 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 30 81 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2D 00 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2B 00 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 29 00 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 27 00 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 25 00 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 23 01 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 21 00 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 1F 01 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1D 01 + 39 00 00 00 00 00 02 1C 01 + 39 00 00 00 00 00 02 1B 00 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 18 81 + 39 00 00 00 00 00 02 17 00 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 15 01 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 07 01 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + + + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 09 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2E 07 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 06 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 33 05 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 37 08 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 39 08 + 39 00 00 00 00 00 02 3A 08 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 66 06 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 6A 05 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 05 + 39 00 00 00 00 00 02 73 04 + 39 00 00 00 00 00 02 74 04 + 39 00 00 00 00 00 02 75 04 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 77 03 + 39 00 00 00 00 00 02 78 03 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7F 01 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 10 83 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 84 + 39 00 00 00 00 00 02 13 84 + 39 00 00 00 00 00 02 14 84 + 39 00 00 00 00 00 02 15 84 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 85 + 39 00 00 00 00 00 02 19 85 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 1B 85 + 39 00 00 00 00 00 02 1C 85 + 39 00 00 00 00 00 02 1D 85 + 39 00 00 00 00 00 02 1E 85 + 39 00 00 00 00 00 02 1F 85 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 21 85 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 25 87 + 39 00 00 00 00 00 02 26 87 + 39 00 00 00 00 00 02 27 85 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 84 + 39 00 00 00 00 00 02 2A 84 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2C 86 + 39 00 00 00 00 00 02 2D 86 + 39 00 00 00 00 00 02 2E 86 + 39 00 00 00 00 00 02 2F 87 + 39 00 00 00 00 00 02 30 87 + 39 00 00 00 00 00 02 31 88 + 39 00 00 00 00 00 02 32 88 + 39 00 00 00 00 00 02 33 88 + 39 00 00 00 00 00 02 34 89 + 39 00 00 00 00 00 02 35 8A + 39 00 00 00 00 00 02 36 8A + 39 00 00 00 00 00 02 37 8B + 39 00 00 00 00 00 02 38 8B + 39 00 00 00 00 00 02 39 8B + 39 00 00 00 00 00 02 3A 8A + 39 00 00 00 00 00 02 3B 89 + 39 00 00 00 00 00 02 3C 89 + 39 00 00 00 00 00 02 3D 89 + 39 00 00 00 00 00 02 3E 89 + 39 00 00 00 00 00 02 3F 8A + 39 00 00 00 00 00 02 40 8A + 39 00 00 00 00 00 02 41 8A + 39 00 00 00 00 00 02 42 8A + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 44 8A + 39 00 00 00 00 00 02 45 8B + 39 00 00 00 00 00 02 46 8B + 39 00 00 00 00 00 02 47 8B + 39 00 00 00 00 00 02 48 8C + 39 00 00 00 00 00 02 49 8C + 39 00 00 00 00 00 02 4A 8C + 39 00 00 00 00 00 02 4B 8D + 39 00 00 00 00 00 02 4C 8D + 39 00 00 00 00 00 02 4D 8E + 39 00 00 00 00 00 02 4E 8E + 39 00 00 00 00 00 02 4F 8F + 39 00 00 00 00 00 02 50 90 + 39 00 00 00 00 00 02 51 90 + 39 00 00 00 00 00 02 52 90 + 39 00 00 00 00 00 02 53 91 + 39 00 00 00 00 00 02 54 91 + 39 00 00 00 00 00 02 55 92 + 39 00 00 00 00 00 02 56 92 + 39 00 00 00 00 00 02 57 92 + 39 00 00 00 00 00 02 58 92 + 39 00 00 00 00 00 02 59 92 + 39 00 00 00 00 00 02 5A 92 + 39 00 00 00 00 00 02 5B 92 + 39 00 00 00 00 00 02 5C 92 + 39 00 00 00 00 00 02 5D 92 + 39 00 00 00 00 00 02 5E 92 + 39 00 00 00 00 00 02 5F 92 + 39 00 00 00 00 00 02 60 92 + 39 00 00 00 00 00 02 61 92 + 39 00 00 00 00 00 02 62 92 + 39 00 00 00 00 00 02 63 92 + 39 00 00 00 00 00 02 64 92 + 39 00 00 00 00 00 02 65 93 + 39 00 00 00 00 00 02 66 93 + 39 00 00 00 00 00 02 67 93 + 39 00 00 00 00 00 02 68 93 + 39 00 00 00 00 00 02 69 93 + 39 00 00 00 00 00 02 6A 94 + 39 00 00 00 00 00 02 6B 93 + 39 00 00 00 00 00 02 6C 94 + 39 00 00 00 00 00 02 6D 94 + 39 00 00 00 00 00 02 6E 94 + 39 00 00 00 00 00 02 6F 94 + 39 00 00 00 00 00 02 70 94 + 39 00 00 00 00 00 02 71 94 + 39 00 00 00 00 00 02 72 94 + 39 00 00 00 00 00 02 73 94 + 39 00 00 00 00 00 02 74 95 + 39 00 00 00 00 00 02 75 95 + 39 00 00 00 00 00 02 76 95 + 39 00 00 00 00 00 02 77 95 + 39 00 00 00 00 00 02 78 96 + 39 00 00 00 00 00 02 79 96 + 39 00 00 00 00 00 02 7A 97 + 39 00 00 00 00 00 02 7B 97 + 39 00 00 00 00 00 02 7C 98 + 39 00 00 00 00 00 02 7D 98 + 39 00 00 00 00 00 02 7E 99 + 39 00 00 00 00 00 02 7F 99 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0D 84 + 39 00 00 00 00 00 02 0E 84 + 39 00 00 00 00 00 02 0F 84 + 39 00 00 00 00 00 02 10 84 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 12 85 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 14 85 + 39 00 00 00 00 00 02 15 85 + 39 00 00 00 00 00 02 16 86 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 87 + 39 00 00 00 00 00 02 19 87 + 39 00 00 00 00 00 02 1A 87 + 39 00 00 00 00 00 02 1B 87 + 39 00 00 00 00 00 02 1C 87 + 39 00 00 00 00 00 02 1D 87 + 39 00 00 00 00 00 02 1E 87 + 39 00 00 00 00 00 02 1F 87 + 39 00 00 00 00 00 02 20 87 + 39 00 00 00 00 00 02 21 87 + 39 00 00 00 00 00 02 22 88 + 39 00 00 00 00 00 02 23 88 + 39 00 00 00 00 00 02 24 89 + 39 00 00 00 00 00 02 25 89 + 39 00 00 00 00 00 02 26 8A + 39 00 00 00 00 00 02 27 89 + 39 00 00 00 00 00 02 28 87 + 39 00 00 00 00 00 02 29 87 + 39 00 00 00 00 00 02 2A 87 + 39 00 00 00 00 00 02 2B 88 + 39 00 00 00 00 00 02 2C 89 + 39 00 00 00 00 00 02 2D 89 + 39 00 00 00 00 00 02 2E 8A + 39 00 00 00 00 00 02 2F 8A + 39 00 00 00 00 00 02 30 8A + 39 00 00 00 00 00 02 31 8B + 39 00 00 00 00 00 02 32 8B + 39 00 00 00 00 00 02 33 8C + 39 00 00 00 00 00 02 34 8C + 39 00 00 00 00 00 02 35 8D + 39 00 00 00 00 00 02 36 8E + 39 00 00 00 00 00 02 37 8F + 39 00 00 00 00 00 02 38 8F + 39 00 00 00 00 00 02 39 8F + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 3B 8F + 39 00 00 00 00 00 02 3C 8E + 39 00 00 00 00 00 02 3D 8D + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3F 8E + 39 00 00 00 00 00 02 40 8F + 39 00 00 00 00 00 02 41 8F + 39 00 00 00 00 00 02 42 8F + 39 00 00 00 00 00 02 43 90 + 39 00 00 00 00 00 02 44 90 + 39 00 00 00 00 00 02 45 90 + 39 00 00 00 00 00 02 46 90 + 39 00 00 00 00 00 02 47 91 + 39 00 00 00 00 00 02 48 91 + 39 00 00 00 00 00 02 49 91 + 39 00 00 00 00 00 02 4A 92 + 39 00 00 00 00 00 02 4B 92 + 39 00 00 00 00 00 02 4C 93 + 39 00 00 00 00 00 02 4D 93 + 39 00 00 00 00 00 02 4E 94 + 39 00 00 00 00 00 02 4F 94 + 39 00 00 00 00 00 02 50 95 + 39 00 00 00 00 00 02 51 96 + 39 00 00 00 00 00 02 52 96 + 39 00 00 00 00 00 02 53 97 + 39 00 00 00 00 00 02 54 97 + 39 00 00 00 00 00 02 55 98 + 39 00 00 00 00 00 02 56 99 + 39 00 00 00 00 00 02 57 99 + 39 00 00 00 00 00 02 58 9A + 39 00 00 00 00 00 02 59 9A + 39 00 00 00 00 00 02 5A 9A + 39 00 00 00 00 00 02 5B 9A + 39 00 00 00 00 00 02 5C 9A + 39 00 00 00 00 00 02 5D 9A + 39 00 00 00 00 00 02 5E 9A + 39 00 00 00 00 00 02 5F 9A + 39 00 00 00 00 00 02 60 9A + 39 00 00 00 00 00 02 61 9B + 39 00 00 00 00 00 02 62 9B + 39 00 00 00 00 00 02 63 9B + 39 00 00 00 00 00 02 64 9B + 39 00 00 00 00 00 02 65 9B + 39 00 00 00 00 00 02 66 9B + 39 00 00 00 00 00 02 67 9C + 39 00 00 00 00 00 02 68 9C + 39 00 00 00 00 00 02 69 9C + 39 00 00 00 00 00 02 6A 9C + 39 00 00 00 00 00 02 6B 9D + 39 00 00 00 00 00 02 6C 9D + 39 00 00 00 00 00 02 6D 9D + 39 00 00 00 00 00 02 6E 9D + 39 00 00 00 00 00 02 6F 9E + 39 00 00 00 00 00 02 70 9E + 39 00 00 00 00 00 02 71 9E + 39 00 00 00 00 00 02 72 9F + 39 00 00 00 00 00 02 73 9F + 39 00 00 00 00 00 02 74 9F + 39 00 00 00 00 00 02 75 9F + 39 00 00 00 00 00 02 76 A0 + 39 00 00 00 00 00 02 77 A0 + 39 00 00 00 00 00 02 78 A1 + 39 00 00 00 00 00 02 79 A1 + 39 00 00 00 00 00 02 7A A1 + 39 00 00 00 00 00 02 7B A1 + 39 00 00 00 00 00 02 7C A2 + 39 00 00 00 00 00 02 7D A3 + 39 00 00 00 00 00 02 7E A3 + 39 00 00 00 00 00 02 7F A4 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0E 01 + 39 00 00 00 00 00 02 0F 01 + 39 00 00 00 00 00 02 10 01 + 39 00 00 00 00 00 02 11 01 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 82 + 39 00 00 00 00 00 02 28 82 + 39 00 00 00 00 00 02 29 81 + 39 00 00 00 00 00 02 2A 81 + 39 00 00 00 00 00 02 2B 81 + 39 00 00 00 00 00 02 2C 81 + 39 00 00 00 00 00 02 2D 81 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 35 83 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 67 82 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6C 84 + 39 00 00 00 00 00 02 6D 84 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 70 83 + 39 00 00 00 00 00 02 71 83 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7F 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 9A + 39 00 00 00 00 00 02 02 9A + 39 00 00 00 00 00 02 03 9A + 39 00 00 00 00 00 02 04 9B + 39 00 00 00 00 00 02 05 9B + 39 00 00 00 00 00 02 06 9B + 39 00 00 00 00 00 02 07 9C + 39 00 00 00 00 00 02 08 9C + 39 00 00 00 00 00 02 09 9C + 39 00 00 00 00 00 02 0A 9C + 39 00 00 00 00 00 02 0B 9C + 39 00 00 00 00 00 02 0C 9D + 39 00 00 00 00 00 02 0D 9D + 39 00 00 00 00 00 02 0E 9D + 39 00 00 00 00 00 02 0F 9D + 39 00 00 00 00 00 02 10 9D + 39 00 00 00 00 00 02 11 9E + 39 00 00 00 00 00 02 12 9E + 39 00 00 00 00 00 02 13 9E + 39 00 00 00 00 00 02 14 9E + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 9E + 39 00 00 00 00 00 02 17 9E + 39 00 00 00 00 00 02 18 9E + 39 00 00 00 00 00 02 19 9E + 39 00 00 00 00 00 02 1A 9F + 39 00 00 00 00 00 02 1B 9F + 39 00 00 00 00 00 02 1C A0 + 39 00 00 00 00 00 02 1D A0 + 39 00 00 00 00 00 02 1E A1 + 39 00 00 00 00 00 02 1F A1 + 39 00 00 00 00 00 02 20 A1 + 39 00 00 00 00 00 02 21 A2 + 39 00 00 00 00 00 02 22 A2 + 39 00 00 00 00 00 02 23 A2 + 39 00 00 00 00 00 02 24 A3 + 39 00 00 00 00 00 02 25 A3 + 39 00 00 00 00 00 02 26 A3 + 39 00 00 00 00 00 02 27 A3 + 39 00 00 00 00 00 02 28 A3 + 39 00 00 00 00 00 02 29 A3 + 39 00 00 00 00 00 02 2A A4 + 39 00 00 00 00 00 02 2B A4 + 39 00 00 00 00 00 02 2C A4 + 39 00 00 00 00 00 02 2D A4 + 39 00 00 00 00 00 02 2E A5 + 39 00 00 00 00 00 02 2F A4 + 39 00 00 00 00 00 02 30 A4 + 39 00 00 00 00 00 02 31 A3 + 39 00 00 00 00 00 02 32 A4 + 39 00 00 00 00 00 02 33 A4 + 39 00 00 00 00 00 02 34 A3 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 A3 + 39 00 00 00 00 00 02 37 A3 + 39 00 00 00 00 00 02 38 A3 + 39 00 00 00 00 00 02 39 A4 + 39 00 00 00 00 00 02 3A A4 + 39 00 00 00 00 00 02 3B A5 + 39 00 00 00 00 00 02 3C A6 + 39 00 00 00 00 00 02 3D A6 + 39 00 00 00 00 00 02 3E A7 + 39 00 00 00 00 00 02 3F A7 + 39 00 00 00 00 00 02 40 A8 + 39 00 00 00 00 00 02 41 A8 + 39 00 00 00 00 00 02 42 A9 + 39 00 00 00 00 00 02 43 A9 + 39 00 00 00 00 00 02 44 AA + 39 00 00 00 00 00 02 45 AA + 39 00 00 00 00 00 02 46 AA + 39 00 00 00 00 00 02 47 AB + 39 00 00 00 00 00 02 48 AB + 39 00 00 00 00 00 02 49 AB + 39 00 00 00 00 00 02 4A AB + 39 00 00 00 00 00 02 4B AB + 39 00 00 00 00 00 02 4C AB + 39 00 00 00 00 00 02 4D AB + 39 00 00 00 00 00 02 4E AB + 39 00 00 00 00 00 02 4F AB + 39 00 00 00 00 00 02 50 AB + 39 00 00 00 00 00 02 51 AB + 39 00 00 00 00 00 02 52 AB + 39 00 00 00 00 00 02 53 AA + 39 00 00 00 00 00 02 54 AA + 39 00 00 00 00 00 02 55 AA + 39 00 00 00 00 00 02 56 AA + 39 00 00 00 00 00 02 57 AA + 39 00 00 00 00 00 02 58 AB + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 5A AC + 39 00 00 00 00 00 02 5B AC + 39 00 00 00 00 00 02 5C AC + 39 00 00 00 00 00 02 5D AD + 39 00 00 00 00 00 02 5E AD + 39 00 00 00 00 00 02 5F AD + 39 00 00 00 00 00 02 60 AD + 39 00 00 00 00 00 02 61 AD + 39 00 00 00 00 00 02 62 AD + 39 00 00 00 00 00 02 63 AD + 39 00 00 00 00 00 02 64 AC + 39 00 00 00 00 00 02 65 AC + 39 00 00 00 00 00 02 66 AC + 39 00 00 00 00 00 02 67 AC + 39 00 00 00 00 00 02 68 AD + 39 00 00 00 00 00 02 69 AD + 39 00 00 00 00 00 02 6A AE + 39 00 00 00 00 00 02 6B AE + 39 00 00 00 00 00 02 6C AE + 39 00 00 00 00 00 02 6D AE + 39 00 00 00 00 00 02 6E AE + 39 00 00 00 00 00 02 6F AE + 39 00 00 00 00 00 02 70 AE + 39 00 00 00 00 00 02 71 AE + 39 00 00 00 00 00 02 72 AE + 39 00 00 00 00 00 02 73 AE + 39 00 00 00 00 00 02 74 AF + 39 00 00 00 00 00 02 75 AF + 39 00 00 00 00 00 02 76 B0 + 39 00 00 00 00 00 02 77 B0 + 39 00 00 00 00 00 02 78 B0 + 39 00 00 00 00 00 02 79 B0 + 39 00 00 00 00 00 02 7A B0 + 39 00 00 00 00 00 02 7B B0 + 39 00 00 00 00 00 02 7C B0 + 39 00 00 00 00 00 02 7D B0 + 39 00 00 00 00 00 02 7E B0 + 39 00 00 00 00 00 02 7F B0 + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 A5 + 39 00 00 00 00 00 02 02 A6 + 39 00 00 00 00 00 02 03 A6 + 39 00 00 00 00 00 02 04 A7 + 39 00 00 00 00 00 02 05 A7 + 39 00 00 00 00 00 02 06 A7 + 39 00 00 00 00 00 02 07 A8 + 39 00 00 00 00 00 02 08 A8 + 39 00 00 00 00 00 02 09 A9 + 39 00 00 00 00 00 02 0A A9 + 39 00 00 00 00 00 02 0B AA + 39 00 00 00 00 00 02 0C AA + 39 00 00 00 00 00 02 0D AB + 39 00 00 00 00 00 02 0E AB + 39 00 00 00 00 00 02 0F AB + 39 00 00 00 00 00 02 10 AC + 39 00 00 00 00 00 02 11 AC + 39 00 00 00 00 00 02 12 AC + 39 00 00 00 00 00 02 13 AD + 39 00 00 00 00 00 02 14 AD + 39 00 00 00 00 00 02 15 AD + 39 00 00 00 00 00 02 16 AE + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 AE + 39 00 00 00 00 00 02 19 AE + 39 00 00 00 00 00 02 1A AE + 39 00 00 00 00 00 02 1B AF + 39 00 00 00 00 00 02 1C AF + 39 00 00 00 00 00 02 1D AF + 39 00 00 00 00 00 02 1E B0 + 39 00 00 00 00 00 02 1F B1 + 39 00 00 00 00 00 02 20 B1 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 22 B3 + 39 00 00 00 00 00 02 23 B3 + 39 00 00 00 00 00 02 24 B4 + 39 00 00 00 00 00 02 25 B4 + 39 00 00 00 00 00 02 26 B5 + 39 00 00 00 00 00 02 27 B5 + 39 00 00 00 00 00 02 28 B6 + 39 00 00 00 00 00 02 29 B6 + 39 00 00 00 00 00 02 2A B6 + 39 00 00 00 00 00 02 2B B7 + 39 00 00 00 00 00 02 2C B7 + 39 00 00 00 00 00 02 2D B8 + 39 00 00 00 00 00 02 2E B8 + 39 00 00 00 00 00 02 2F B8 + 39 00 00 00 00 00 02 30 B8 + 39 00 00 00 00 00 02 31 B9 + 39 00 00 00 00 00 02 32 BA + 39 00 00 00 00 00 02 33 BA + 39 00 00 00 00 00 02 34 BA + 39 00 00 00 00 00 02 35 BA + 39 00 00 00 00 00 02 36 BA + 39 00 00 00 00 00 02 37 BA + 39 00 00 00 00 00 02 38 BA + 39 00 00 00 00 00 02 39 BA + 39 00 00 00 00 00 02 3A BA + 39 00 00 00 00 00 02 3B BB + 39 00 00 00 00 00 02 3C BB + 39 00 00 00 00 00 02 3D BB + 39 00 00 00 00 00 02 3E BB + 39 00 00 00 00 00 02 3F BC + 39 00 00 00 00 00 02 40 BD + 39 00 00 00 00 00 02 41 BE + 39 00 00 00 00 00 02 42 BE + 39 00 00 00 00 00 02 43 BF + 39 00 00 00 00 00 02 44 C0 + 39 00 00 00 00 00 02 45 C1 + 39 00 00 00 00 00 02 46 C2 + 39 00 00 00 00 00 02 47 C2 + 39 00 00 00 00 00 02 48 C3 + 39 00 00 00 00 00 02 49 C4 + 39 00 00 00 00 00 02 4A C5 + 39 00 00 00 00 00 02 4B C5 + 39 00 00 00 00 00 02 4C C6 + 39 00 00 00 00 00 02 4D C6 + 39 00 00 00 00 00 02 4E C7 + 39 00 00 00 00 00 02 4F C7 + 39 00 00 00 00 00 02 50 C8 + 39 00 00 00 00 00 02 51 C8 + 39 00 00 00 00 00 02 52 C8 + 39 00 00 00 00 00 02 53 C9 + 39 00 00 00 00 00 02 54 C9 + 39 00 00 00 00 00 02 55 C9 + 39 00 00 00 00 00 02 56 CA + 39 00 00 00 00 00 02 57 CA + 39 00 00 00 00 00 02 58 CA + 39 00 00 00 00 00 02 59 CA + 39 00 00 00 00 00 02 5A CA + 39 00 00 00 00 00 02 5B CA + 39 00 00 00 00 00 02 5C CA + 39 00 00 00 00 00 02 5D CA + 39 00 00 00 00 00 02 5E CB + 39 00 00 00 00 00 02 5F CB + 39 00 00 00 00 00 02 60 CC + 39 00 00 00 00 00 02 61 CD + 39 00 00 00 00 00 02 62 CE + 39 00 00 00 00 00 02 63 CE + 39 00 00 00 00 00 02 64 CF + 39 00 00 00 00 00 02 65 D0 + 39 00 00 00 00 00 02 66 D0 + 39 00 00 00 00 00 02 67 D1 + 39 00 00 00 00 00 02 68 D1 + 39 00 00 00 00 00 02 69 D2 + 39 00 00 00 00 00 02 6A D2 + 39 00 00 00 00 00 02 6B D2 + 39 00 00 00 00 00 02 6C D3 + 39 00 00 00 00 00 02 6D D3 + 39 00 00 00 00 00 02 6E D3 + 39 00 00 00 00 00 02 6F D3 + 39 00 00 00 00 00 02 70 D3 + 39 00 00 00 00 00 02 71 D4 + 39 00 00 00 00 00 02 72 D5 + 39 00 00 00 00 00 02 73 D6 + 39 00 00 00 00 00 02 74 D7 + 39 00 00 00 00 00 02 75 D7 + 39 00 00 00 00 00 02 76 D8 + 39 00 00 00 00 00 02 77 D9 + 39 00 00 00 00 00 02 78 D9 + 39 00 00 00 00 00 02 79 DA + 39 00 00 00 00 00 02 7A DA + 39 00 00 00 00 00 02 7B DB + 39 00 00 00 00 00 02 7C DB + 39 00 00 00 00 00 02 7D DB + 39 00 00 00 00 00 02 7E DC + 39 00 00 00 00 00 02 7F DD + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 99 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 99 + 39 00 00 00 00 00 02 7F B0 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F A4 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 A5 + 39 00 00 00 00 00 02 7F DD + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F DD + 39 00 00 00 00 00 02 7E DC + 39 00 00 00 00 00 02 7D DB + 39 00 00 00 00 00 02 7C DB + 39 00 00 00 00 00 02 7B DB + 39 00 00 00 00 00 02 7A DA + 39 00 00 00 00 00 02 79 DA + 39 00 00 00 00 00 02 78 D9 + 39 00 00 00 00 00 02 77 D9 + 39 00 00 00 00 00 02 76 D8 + 39 00 00 00 00 00 02 75 D7 + 39 00 00 00 00 00 02 74 D7 + 39 00 00 00 00 00 02 73 D6 + 39 00 00 00 00 00 02 72 D5 + 39 00 00 00 00 00 02 71 D4 + 39 00 00 00 00 00 02 70 D3 + 39 00 00 00 00 00 02 6F D3 + 39 00 00 00 00 00 02 6E D3 + 39 00 00 00 00 00 02 6D D3 + 39 00 00 00 00 00 02 6C D3 + 39 00 00 00 00 00 02 6B D2 + 39 00 00 00 00 00 02 6A D2 + 39 00 00 00 00 00 02 69 D2 + 39 00 00 00 00 00 02 68 D1 + 39 00 00 00 00 00 02 67 D1 + 39 00 00 00 00 00 02 66 D0 + 39 00 00 00 00 00 02 65 D0 + 39 00 00 00 00 00 02 64 CF + 39 00 00 00 00 00 02 63 CE + 39 00 00 00 00 00 02 62 CE + 39 00 00 00 00 00 02 61 CD + 39 00 00 00 00 00 02 60 CC + 39 00 00 00 00 00 02 5F CB + 39 00 00 00 00 00 02 5E CB + 39 00 00 00 00 00 02 5D CA + 39 00 00 00 00 00 02 5C CA + 39 00 00 00 00 00 02 5B CA + 39 00 00 00 00 00 02 5A CA + 39 00 00 00 00 00 02 59 CA + 39 00 00 00 00 00 02 58 CA + 39 00 00 00 00 00 02 57 CA + 39 00 00 00 00 00 02 56 CA + 39 00 00 00 00 00 02 55 C9 + 39 00 00 00 00 00 02 54 C9 + 39 00 00 00 00 00 02 53 C9 + 39 00 00 00 00 00 02 52 C8 + 39 00 00 00 00 00 02 51 C8 + 39 00 00 00 00 00 02 50 C8 + 39 00 00 00 00 00 02 4F C7 + 39 00 00 00 00 00 02 4E C7 + 39 00 00 00 00 00 02 4D C6 + 39 00 00 00 00 00 02 4C C6 + 39 00 00 00 00 00 02 4B C5 + 39 00 00 00 00 00 02 4A C5 + 39 00 00 00 00 00 02 49 C4 + 39 00 00 00 00 00 02 48 C3 + 39 00 00 00 00 00 02 47 C2 + 39 00 00 00 00 00 02 46 C2 + 39 00 00 00 00 00 02 45 C1 + 39 00 00 00 00 00 02 44 C0 + 39 00 00 00 00 00 02 43 BF + 39 00 00 00 00 00 02 42 BE + 39 00 00 00 00 00 02 41 BE + 39 00 00 00 00 00 02 40 BD + 39 00 00 00 00 00 02 3F BC + 39 00 00 00 00 00 02 3E BB + 39 00 00 00 00 00 02 3D BB + 39 00 00 00 00 00 02 3C BB + 39 00 00 00 00 00 02 3B BB + 39 00 00 00 00 00 02 3A BA + 39 00 00 00 00 00 02 39 BA + 39 00 00 00 00 00 02 38 BA + 39 00 00 00 00 00 02 37 BA + 39 00 00 00 00 00 02 36 BA + 39 00 00 00 00 00 02 35 BA + 39 00 00 00 00 00 02 34 BA + 39 00 00 00 00 00 02 33 BA + 39 00 00 00 00 00 02 32 BA + 39 00 00 00 00 00 02 31 B9 + 39 00 00 00 00 00 02 30 B8 + 39 00 00 00 00 00 02 2F B8 + 39 00 00 00 00 00 02 2E B8 + 39 00 00 00 00 00 02 2D B8 + 39 00 00 00 00 00 02 2C B7 + 39 00 00 00 00 00 02 2B B7 + 39 00 00 00 00 00 02 2A B6 + 39 00 00 00 00 00 02 29 B6 + 39 00 00 00 00 00 02 28 B6 + 39 00 00 00 00 00 02 27 B5 + 39 00 00 00 00 00 02 26 B5 + 39 00 00 00 00 00 02 25 B4 + 39 00 00 00 00 00 02 24 B4 + 39 00 00 00 00 00 02 23 B3 + 39 00 00 00 00 00 02 22 B3 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 20 B1 + 39 00 00 00 00 00 02 1F B1 + 39 00 00 00 00 00 02 1E B0 + 39 00 00 00 00 00 02 1D AF + 39 00 00 00 00 00 02 1C AF + 39 00 00 00 00 00 02 1B AF + 39 00 00 00 00 00 02 1A AE + 39 00 00 00 00 00 02 19 AE + 39 00 00 00 00 00 02 18 AE + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 16 AE + 39 00 00 00 00 00 02 15 AD + 39 00 00 00 00 00 02 14 AD + 39 00 00 00 00 00 02 13 AD + 39 00 00 00 00 00 02 12 AC + 39 00 00 00 00 00 02 11 AC + 39 00 00 00 00 00 02 10 AC + 39 00 00 00 00 00 02 0F AB + 39 00 00 00 00 00 02 0E AB + 39 00 00 00 00 00 02 0D AB + 39 00 00 00 00 00 02 0C AA + 39 00 00 00 00 00 02 0B AA + 39 00 00 00 00 00 02 0A A9 + 39 00 00 00 00 00 02 09 A9 + 39 00 00 00 00 00 02 08 A8 + 39 00 00 00 00 00 02 07 A8 + 39 00 00 00 00 00 02 06 A7 + 39 00 00 00 00 00 02 05 A7 + 39 00 00 00 00 00 02 04 A7 + 39 00 00 00 00 00 02 03 A6 + 39 00 00 00 00 00 02 02 A6 + 39 00 00 00 00 00 02 01 A5 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 71 83 + 39 00 00 00 00 00 02 70 83 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6D 84 + 39 00 00 00 00 00 02 6C 84 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 67 82 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 35 83 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2D 81 + 39 00 00 00 00 00 02 2C 81 + 39 00 00 00 00 00 02 2B 81 + 39 00 00 00 00 00 02 2A 81 + 39 00 00 00 00 00 02 29 81 + 39 00 00 00 00 00 02 28 82 + 39 00 00 00 00 00 02 27 82 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 11 01 + 39 00 00 00 00 00 02 10 01 + 39 00 00 00 00 00 02 0F 01 + 39 00 00 00 00 00 02 0E 01 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 01 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F B0 + 39 00 00 00 00 00 02 7E B0 + 39 00 00 00 00 00 02 7D B0 + 39 00 00 00 00 00 02 7C B0 + 39 00 00 00 00 00 02 7B B0 + 39 00 00 00 00 00 02 7A B0 + 39 00 00 00 00 00 02 79 B0 + 39 00 00 00 00 00 02 78 B0 + 39 00 00 00 00 00 02 77 B0 + 39 00 00 00 00 00 02 76 B0 + 39 00 00 00 00 00 02 75 AF + 39 00 00 00 00 00 02 74 AF + 39 00 00 00 00 00 02 73 AE + 39 00 00 00 00 00 02 72 AE + 39 00 00 00 00 00 02 71 AE + 39 00 00 00 00 00 02 70 AE + 39 00 00 00 00 00 02 6F AE + 39 00 00 00 00 00 02 6E AE + 39 00 00 00 00 00 02 6D AE + 39 00 00 00 00 00 02 6C AE + 39 00 00 00 00 00 02 6B AE + 39 00 00 00 00 00 02 6A AE + 39 00 00 00 00 00 02 69 AD + 39 00 00 00 00 00 02 68 AD + 39 00 00 00 00 00 02 67 AC + 39 00 00 00 00 00 02 66 AC + 39 00 00 00 00 00 02 65 AC + 39 00 00 00 00 00 02 64 AC + 39 00 00 00 00 00 02 63 AD + 39 00 00 00 00 00 02 62 AD + 39 00 00 00 00 00 02 61 AD + 39 00 00 00 00 00 02 60 AD + 39 00 00 00 00 00 02 5F AD + 39 00 00 00 00 00 02 5E AD + 39 00 00 00 00 00 02 5D AD + 39 00 00 00 00 00 02 5C AC + 39 00 00 00 00 00 02 5B AC + 39 00 00 00 00 00 02 5A AC + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 58 AB + 39 00 00 00 00 00 02 57 AA + 39 00 00 00 00 00 02 56 AA + 39 00 00 00 00 00 02 55 AA + 39 00 00 00 00 00 02 54 AA + 39 00 00 00 00 00 02 53 AA + 39 00 00 00 00 00 02 52 AB + 39 00 00 00 00 00 02 51 AB + 39 00 00 00 00 00 02 50 AB + 39 00 00 00 00 00 02 4F AB + 39 00 00 00 00 00 02 4E AB + 39 00 00 00 00 00 02 4D AB + 39 00 00 00 00 00 02 4C AB + 39 00 00 00 00 00 02 4B AB + 39 00 00 00 00 00 02 4A AB + 39 00 00 00 00 00 02 49 AB + 39 00 00 00 00 00 02 48 AB + 39 00 00 00 00 00 02 47 AB + 39 00 00 00 00 00 02 46 AA + 39 00 00 00 00 00 02 45 AA + 39 00 00 00 00 00 02 44 AA + 39 00 00 00 00 00 02 43 A9 + 39 00 00 00 00 00 02 42 A9 + 39 00 00 00 00 00 02 41 A8 + 39 00 00 00 00 00 02 40 A8 + 39 00 00 00 00 00 02 3F A7 + 39 00 00 00 00 00 02 3E A7 + 39 00 00 00 00 00 02 3D A6 + 39 00 00 00 00 00 02 3C A6 + 39 00 00 00 00 00 02 3B A5 + 39 00 00 00 00 00 02 3A A4 + 39 00 00 00 00 00 02 39 A4 + 39 00 00 00 00 00 02 38 A3 + 39 00 00 00 00 00 02 37 A3 + 39 00 00 00 00 00 02 36 A3 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 34 A3 + 39 00 00 00 00 00 02 33 A4 + 39 00 00 00 00 00 02 32 A4 + 39 00 00 00 00 00 02 31 A3 + 39 00 00 00 00 00 02 30 A4 + 39 00 00 00 00 00 02 2F A4 + 39 00 00 00 00 00 02 2E A5 + 39 00 00 00 00 00 02 2D A4 + 39 00 00 00 00 00 02 2C A4 + 39 00 00 00 00 00 02 2B A4 + 39 00 00 00 00 00 02 2A A4 + 39 00 00 00 00 00 02 29 A3 + 39 00 00 00 00 00 02 28 A3 + 39 00 00 00 00 00 02 27 A3 + 39 00 00 00 00 00 02 26 A3 + 39 00 00 00 00 00 02 25 A3 + 39 00 00 00 00 00 02 24 A3 + 39 00 00 00 00 00 02 23 A2 + 39 00 00 00 00 00 02 22 A2 + 39 00 00 00 00 00 02 21 A2 + 39 00 00 00 00 00 02 20 A1 + 39 00 00 00 00 00 02 1F A1 + 39 00 00 00 00 00 02 1E A1 + 39 00 00 00 00 00 02 1D A0 + 39 00 00 00 00 00 02 1C A0 + 39 00 00 00 00 00 02 1B 9F + 39 00 00 00 00 00 02 1A 9F + 39 00 00 00 00 00 02 19 9E + 39 00 00 00 00 00 02 18 9E + 39 00 00 00 00 00 02 17 9E + 39 00 00 00 00 00 02 16 9E + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 14 9E + 39 00 00 00 00 00 02 13 9E + 39 00 00 00 00 00 02 12 9E + 39 00 00 00 00 00 02 11 9E + 39 00 00 00 00 00 02 10 9D + 39 00 00 00 00 00 02 0F 9D + 39 00 00 00 00 00 02 0E 9D + 39 00 00 00 00 00 02 0D 9D + 39 00 00 00 00 00 02 0C 9D + 39 00 00 00 00 00 02 0B 9C + 39 00 00 00 00 00 02 0A 9C + 39 00 00 00 00 00 02 09 9C + 39 00 00 00 00 00 02 08 9C + 39 00 00 00 00 00 02 07 9C + 39 00 00 00 00 00 02 06 9B + 39 00 00 00 00 00 02 05 9B + 39 00 00 00 00 00 02 04 9B + 39 00 00 00 00 00 02 03 9A + 39 00 00 00 00 00 02 02 9A + 39 00 00 00 00 00 02 01 9A + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 99 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 99 + 39 00 00 00 00 00 02 7F B0 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F A4 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 A5 + 39 00 00 00 00 00 02 7F DD + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F A4 + 39 00 00 00 00 00 02 7E A3 + 39 00 00 00 00 00 02 7D A3 + 39 00 00 00 00 00 02 7C A2 + 39 00 00 00 00 00 02 7B A1 + 39 00 00 00 00 00 02 7A A1 + 39 00 00 00 00 00 02 79 A1 + 39 00 00 00 00 00 02 78 A1 + 39 00 00 00 00 00 02 77 A0 + 39 00 00 00 00 00 02 76 A0 + 39 00 00 00 00 00 02 75 9F + 39 00 00 00 00 00 02 74 9F + 39 00 00 00 00 00 02 73 9F + 39 00 00 00 00 00 02 72 9F + 39 00 00 00 00 00 02 71 9E + 39 00 00 00 00 00 02 70 9E + 39 00 00 00 00 00 02 6F 9E + 39 00 00 00 00 00 02 6E 9D + 39 00 00 00 00 00 02 6D 9D + 39 00 00 00 00 00 02 6C 9D + 39 00 00 00 00 00 02 6B 9D + 39 00 00 00 00 00 02 6A 9C + 39 00 00 00 00 00 02 69 9C + 39 00 00 00 00 00 02 68 9C + 39 00 00 00 00 00 02 67 9C + 39 00 00 00 00 00 02 66 9B + 39 00 00 00 00 00 02 65 9B + 39 00 00 00 00 00 02 64 9B + 39 00 00 00 00 00 02 63 9B + 39 00 00 00 00 00 02 62 9B + 39 00 00 00 00 00 02 61 9B + 39 00 00 00 00 00 02 60 9A + 39 00 00 00 00 00 02 5F 9A + 39 00 00 00 00 00 02 5E 9A + 39 00 00 00 00 00 02 5D 9A + 39 00 00 00 00 00 02 5C 9A + 39 00 00 00 00 00 02 5B 9A + 39 00 00 00 00 00 02 5A 9A + 39 00 00 00 00 00 02 59 9A + 39 00 00 00 00 00 02 58 9A + 39 00 00 00 00 00 02 57 99 + 39 00 00 00 00 00 02 56 99 + 39 00 00 00 00 00 02 55 98 + 39 00 00 00 00 00 02 54 97 + 39 00 00 00 00 00 02 53 97 + 39 00 00 00 00 00 02 52 96 + 39 00 00 00 00 00 02 51 96 + 39 00 00 00 00 00 02 50 95 + 39 00 00 00 00 00 02 4F 94 + 39 00 00 00 00 00 02 4E 94 + 39 00 00 00 00 00 02 4D 93 + 39 00 00 00 00 00 02 4C 93 + 39 00 00 00 00 00 02 4B 92 + 39 00 00 00 00 00 02 4A 92 + 39 00 00 00 00 00 02 49 91 + 39 00 00 00 00 00 02 48 91 + 39 00 00 00 00 00 02 47 91 + 39 00 00 00 00 00 02 46 90 + 39 00 00 00 00 00 02 45 90 + 39 00 00 00 00 00 02 44 90 + 39 00 00 00 00 00 02 43 90 + 39 00 00 00 00 00 02 42 8F + 39 00 00 00 00 00 02 41 8F + 39 00 00 00 00 00 02 40 8F + 39 00 00 00 00 00 02 3F 8E + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3D 8D + 39 00 00 00 00 00 02 3C 8E + 39 00 00 00 00 00 02 3B 8F + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 39 8F + 39 00 00 00 00 00 02 38 8F + 39 00 00 00 00 00 02 37 8F + 39 00 00 00 00 00 02 36 8E + 39 00 00 00 00 00 02 35 8D + 39 00 00 00 00 00 02 34 8C + 39 00 00 00 00 00 02 33 8C + 39 00 00 00 00 00 02 32 8B + 39 00 00 00 00 00 02 31 8B + 39 00 00 00 00 00 02 30 8A + 39 00 00 00 00 00 02 2F 8A + 39 00 00 00 00 00 02 2E 8A + 39 00 00 00 00 00 02 2D 89 + 39 00 00 00 00 00 02 2C 89 + 39 00 00 00 00 00 02 2B 88 + 39 00 00 00 00 00 02 2A 87 + 39 00 00 00 00 00 02 29 87 + 39 00 00 00 00 00 02 28 87 + 39 00 00 00 00 00 02 27 89 + 39 00 00 00 00 00 02 26 8A + 39 00 00 00 00 00 02 25 89 + 39 00 00 00 00 00 02 24 89 + 39 00 00 00 00 00 02 23 88 + 39 00 00 00 00 00 02 22 88 + 39 00 00 00 00 00 02 21 87 + 39 00 00 00 00 00 02 20 87 + 39 00 00 00 00 00 02 1F 87 + 39 00 00 00 00 00 02 1E 87 + 39 00 00 00 00 00 02 1D 87 + 39 00 00 00 00 00 02 1C 87 + 39 00 00 00 00 00 02 1B 87 + 39 00 00 00 00 00 02 1A 87 + 39 00 00 00 00 00 02 19 87 + 39 00 00 00 00 00 02 18 87 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 16 86 + 39 00 00 00 00 00 02 15 85 + 39 00 00 00 00 00 02 14 85 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 12 85 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 10 84 + 39 00 00 00 00 00 02 0F 84 + 39 00 00 00 00 00 02 0E 84 + 39 00 00 00 00 00 02 0D 84 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 78 03 + 39 00 00 00 00 00 02 77 03 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 75 04 + 39 00 00 00 00 00 02 74 04 + 39 00 00 00 00 00 02 73 04 + 39 00 00 00 00 00 02 72 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6A 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 66 06 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 08 + 39 00 00 00 00 00 02 39 08 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 37 08 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 33 05 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 31 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 07 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 09 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F 99 + 39 00 00 00 00 00 02 7E 99 + 39 00 00 00 00 00 02 7D 98 + 39 00 00 00 00 00 02 7C 98 + 39 00 00 00 00 00 02 7B 97 + 39 00 00 00 00 00 02 7A 97 + 39 00 00 00 00 00 02 79 96 + 39 00 00 00 00 00 02 78 96 + 39 00 00 00 00 00 02 77 95 + 39 00 00 00 00 00 02 76 95 + 39 00 00 00 00 00 02 75 95 + 39 00 00 00 00 00 02 74 95 + 39 00 00 00 00 00 02 73 94 + 39 00 00 00 00 00 02 72 94 + 39 00 00 00 00 00 02 71 94 + 39 00 00 00 00 00 02 70 94 + 39 00 00 00 00 00 02 6F 94 + 39 00 00 00 00 00 02 6E 94 + 39 00 00 00 00 00 02 6D 94 + 39 00 00 00 00 00 02 6C 94 + 39 00 00 00 00 00 02 6B 93 + 39 00 00 00 00 00 02 6A 94 + 39 00 00 00 00 00 02 69 93 + 39 00 00 00 00 00 02 68 93 + 39 00 00 00 00 00 02 67 93 + 39 00 00 00 00 00 02 66 93 + 39 00 00 00 00 00 02 65 93 + 39 00 00 00 00 00 02 64 92 + 39 00 00 00 00 00 02 63 92 + 39 00 00 00 00 00 02 62 92 + 39 00 00 00 00 00 02 61 92 + 39 00 00 00 00 00 02 60 92 + 39 00 00 00 00 00 02 5F 92 + 39 00 00 00 00 00 02 5E 92 + 39 00 00 00 00 00 02 5D 92 + 39 00 00 00 00 00 02 5C 92 + 39 00 00 00 00 00 02 5B 92 + 39 00 00 00 00 00 02 5A 92 + 39 00 00 00 00 00 02 59 92 + 39 00 00 00 00 00 02 58 92 + 39 00 00 00 00 00 02 57 92 + 39 00 00 00 00 00 02 56 92 + 39 00 00 00 00 00 02 55 92 + 39 00 00 00 00 00 02 54 91 + 39 00 00 00 00 00 02 53 91 + 39 00 00 00 00 00 02 52 90 + 39 00 00 00 00 00 02 51 90 + 39 00 00 00 00 00 02 50 90 + 39 00 00 00 00 00 02 4F 8F + 39 00 00 00 00 00 02 4E 8E + 39 00 00 00 00 00 02 4D 8E + 39 00 00 00 00 00 02 4C 8D + 39 00 00 00 00 00 02 4B 8D + 39 00 00 00 00 00 02 4A 8C + 39 00 00 00 00 00 02 49 8C + 39 00 00 00 00 00 02 48 8C + 39 00 00 00 00 00 02 47 8B + 39 00 00 00 00 00 02 46 8B + 39 00 00 00 00 00 02 45 8B + 39 00 00 00 00 00 02 44 8A + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 42 8A + 39 00 00 00 00 00 02 41 8A + 39 00 00 00 00 00 02 40 8A + 39 00 00 00 00 00 02 3F 8A + 39 00 00 00 00 00 02 3E 89 + 39 00 00 00 00 00 02 3D 89 + 39 00 00 00 00 00 02 3C 89 + 39 00 00 00 00 00 02 3B 89 + 39 00 00 00 00 00 02 3A 8A + 39 00 00 00 00 00 02 39 8B + 39 00 00 00 00 00 02 38 8B + 39 00 00 00 00 00 02 37 8B + 39 00 00 00 00 00 02 36 8A + 39 00 00 00 00 00 02 35 8A + 39 00 00 00 00 00 02 34 89 + 39 00 00 00 00 00 02 33 88 + 39 00 00 00 00 00 02 32 88 + 39 00 00 00 00 00 02 31 88 + 39 00 00 00 00 00 02 30 87 + 39 00 00 00 00 00 02 2F 87 + 39 00 00 00 00 00 02 2E 86 + 39 00 00 00 00 00 02 2D 86 + 39 00 00 00 00 00 02 2C 86 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2A 84 + 39 00 00 00 00 00 02 29 84 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 85 + 39 00 00 00 00 00 02 26 87 + 39 00 00 00 00 00 02 25 87 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 21 85 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 1F 85 + 39 00 00 00 00 00 02 1E 85 + 39 00 00 00 00 00 02 1D 85 + 39 00 00 00 00 00 02 1C 85 + 39 00 00 00 00 00 02 1B 85 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 19 85 + 39 00 00 00 00 00 02 18 85 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 15 84 + 39 00 00 00 00 00 02 14 84 + 39 00 00 00 00 00 02 13 84 + 39 00 00 00 00 00 02 12 84 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 10 83 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 83 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + + ]; + + + qcom,mdss-dsi-panel-eye-command02 = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 03 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 66 05 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7F 00 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0D 84 + 39 00 00 00 00 00 02 0E 84 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 10 85 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 12 86 + 39 00 00 00 00 00 02 13 86 + 39 00 00 00 00 00 02 14 86 + 39 00 00 00 00 00 02 15 86 + 39 00 00 00 00 00 02 16 87 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 88 + 39 00 00 00 00 00 02 19 88 + 39 00 00 00 00 00 02 1A 89 + 39 00 00 00 00 00 02 1B 89 + 39 00 00 00 00 00 02 1C 89 + 39 00 00 00 00 00 02 1D 89 + 39 00 00 00 00 00 02 1E 89 + 39 00 00 00 00 00 02 1F 89 + 39 00 00 00 00 00 02 20 89 + 39 00 00 00 00 00 02 21 89 + 39 00 00 00 00 00 02 22 89 + 39 00 00 00 00 00 02 23 8A + 39 00 00 00 00 00 02 24 8A + 39 00 00 00 00 00 02 25 8B + 39 00 00 00 00 00 02 26 8C + 39 00 00 00 00 00 02 27 8C + 39 00 00 00 00 00 02 28 8A + 39 00 00 00 00 00 02 29 89 + 39 00 00 00 00 00 02 2A 89 + 39 00 00 00 00 00 02 2B 8A + 39 00 00 00 00 00 02 2C 8A + 39 00 00 00 00 00 02 2D 8B + 39 00 00 00 00 00 02 2E 8C + 39 00 00 00 00 00 02 2F 8C + 39 00 00 00 00 00 02 30 8C + 39 00 00 00 00 00 02 31 8D + 39 00 00 00 00 00 02 32 8D + 39 00 00 00 00 00 02 33 8E + 39 00 00 00 00 00 02 34 8F + 39 00 00 00 00 00 02 35 8F + 39 00 00 00 00 00 02 36 90 + 39 00 00 00 00 00 02 37 91 + 39 00 00 00 00 00 02 38 92 + 39 00 00 00 00 00 02 39 92 + 39 00 00 00 00 00 02 3A 92 + 39 00 00 00 00 00 02 3B 92 + 39 00 00 00 00 00 02 3C 92 + 39 00 00 00 00 00 02 3D 90 + 39 00 00 00 00 00 02 3E 90 + 39 00 00 00 00 00 02 3F 91 + 39 00 00 00 00 00 02 40 91 + 39 00 00 00 00 00 02 41 92 + 39 00 00 00 00 00 02 42 92 + 39 00 00 00 00 00 02 43 92 + 39 00 00 00 00 00 02 44 93 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 93 + 39 00 00 00 00 00 02 47 93 + 39 00 00 00 00 00 02 48 94 + 39 00 00 00 00 00 02 49 94 + 39 00 00 00 00 00 02 4A 95 + 39 00 00 00 00 00 02 4B 95 + 39 00 00 00 00 00 02 4C 96 + 39 00 00 00 00 00 02 4D 96 + 39 00 00 00 00 00 02 4E 97 + 39 00 00 00 00 00 02 4F 97 + 39 00 00 00 00 00 02 50 98 + 39 00 00 00 00 00 02 51 99 + 39 00 00 00 00 00 02 52 99 + 39 00 00 00 00 00 02 53 9A + 39 00 00 00 00 00 02 54 9A + 39 00 00 00 00 00 02 55 9B + 39 00 00 00 00 00 02 56 9B + 39 00 00 00 00 00 02 57 9C + 39 00 00 00 00 00 02 58 9D + 39 00 00 00 00 00 02 59 9D + 39 00 00 00 00 00 02 5A 9D + 39 00 00 00 00 00 02 5B 9D + 39 00 00 00 00 00 02 5C 9D + 39 00 00 00 00 00 02 5D 9E + 39 00 00 00 00 00 02 5E 9E + 39 00 00 00 00 00 02 5F 9E + 39 00 00 00 00 00 02 60 9E + 39 00 00 00 00 00 02 61 9E + 39 00 00 00 00 00 02 62 9E + 39 00 00 00 00 00 02 63 9F + 39 00 00 00 00 00 02 64 9F + 39 00 00 00 00 00 02 65 9F + 39 00 00 00 00 00 02 66 9F + 39 00 00 00 00 00 02 67 9F + 39 00 00 00 00 00 02 68 A0 + 39 00 00 00 00 00 02 69 A0 + 39 00 00 00 00 00 02 6A A0 + 39 00 00 00 00 00 02 6B A0 + 39 00 00 00 00 00 02 6C A0 + 39 00 00 00 00 00 02 6D A1 + 39 00 00 00 00 00 02 6E A1 + 39 00 00 00 00 00 02 6F A1 + 39 00 00 00 00 00 02 70 A1 + 39 00 00 00 00 00 02 71 A2 + 39 00 00 00 00 00 02 72 A2 + 39 00 00 00 00 00 02 73 A2 + 39 00 00 00 00 00 02 74 A3 + 39 00 00 00 00 00 02 75 A3 + 39 00 00 00 00 00 02 76 A3 + 39 00 00 00 00 00 02 77 A3 + 39 00 00 00 00 00 02 78 A4 + 39 00 00 00 00 00 02 79 A4 + 39 00 00 00 00 00 02 7A A4 + 39 00 00 00 00 00 02 7B A4 + 39 00 00 00 00 00 02 7C A5 + 39 00 00 00 00 00 02 7D A6 + 39 00 00 00 00 00 02 7E A7 + 39 00 00 00 00 00 02 7F A7 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 84 + 39 00 00 00 00 00 02 09 85 + 39 00 00 00 00 00 02 0A 85 + 39 00 00 00 00 00 02 0B 85 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0D 87 + 39 00 00 00 00 00 02 0E 87 + 39 00 00 00 00 00 02 0F 88 + 39 00 00 00 00 00 02 10 88 + 39 00 00 00 00 00 02 11 89 + 39 00 00 00 00 00 02 12 8A + 39 00 00 00 00 00 02 13 8A + 39 00 00 00 00 00 02 14 8A + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 16 8B + 39 00 00 00 00 00 02 17 8C + 39 00 00 00 00 00 02 18 8D + 39 00 00 00 00 00 02 19 8D + 39 00 00 00 00 00 02 1A 8E + 39 00 00 00 00 00 02 1B 8E + 39 00 00 00 00 00 02 1C 8F + 39 00 00 00 00 00 02 1D 8F + 39 00 00 00 00 00 02 1E 8F + 39 00 00 00 00 00 02 1F 90 + 39 00 00 00 00 00 02 20 90 + 39 00 00 00 00 00 02 21 90 + 39 00 00 00 00 00 02 22 90 + 39 00 00 00 00 00 02 23 91 + 39 00 00 00 00 00 02 24 91 + 39 00 00 00 00 00 02 25 92 + 39 00 00 00 00 00 02 26 93 + 39 00 00 00 00 00 02 27 93 + 39 00 00 00 00 00 02 28 94 + 39 00 00 00 00 00 02 29 95 + 39 00 00 00 00 00 02 2A 94 + 39 00 00 00 00 00 02 2B 93 + 39 00 00 00 00 00 02 2C 92 + 39 00 00 00 00 00 02 2D 93 + 39 00 00 00 00 00 02 2E 94 + 39 00 00 00 00 00 02 2F 95 + 39 00 00 00 00 00 02 30 96 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 32 97 + 39 00 00 00 00 00 02 33 98 + 39 00 00 00 00 00 02 34 98 + 39 00 00 00 00 00 02 35 99 + 39 00 00 00 00 00 02 36 9A + 39 00 00 00 00 00 02 37 9B + 39 00 00 00 00 00 02 38 9C + 39 00 00 00 00 00 02 39 9C + 39 00 00 00 00 00 02 3A 9D + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3C 9F + 39 00 00 00 00 00 02 3D 9F + 39 00 00 00 00 00 02 3E A0 + 39 00 00 00 00 00 02 3F A0 + 39 00 00 00 00 00 02 40 9F + 39 00 00 00 00 00 02 41 9F + 39 00 00 00 00 00 02 42 9F + 39 00 00 00 00 00 02 43 A0 + 39 00 00 00 00 00 02 44 A1 + 39 00 00 00 00 00 02 45 A1 + 39 00 00 00 00 00 02 46 A2 + 39 00 00 00 00 00 02 47 A2 + 39 00 00 00 00 00 02 48 A3 + 39 00 00 00 00 00 02 49 A3 + 39 00 00 00 00 00 02 4A A4 + 39 00 00 00 00 00 02 4B A4 + 39 00 00 00 00 00 02 4C A5 + 39 00 00 00 00 00 02 4D A5 + 39 00 00 00 00 00 02 4E A6 + 39 00 00 00 00 00 02 4F A7 + 39 00 00 00 00 00 02 50 A7 + 39 00 00 00 00 00 02 51 A8 + 39 00 00 00 00 00 02 52 A9 + 39 00 00 00 00 00 02 53 AA + 39 00 00 00 00 00 02 54 AA + 39 00 00 00 00 00 02 55 AB + 39 00 00 00 00 00 02 56 AC + 39 00 00 00 00 00 02 57 AD + 39 00 00 00 00 00 02 58 AE + 39 00 00 00 00 00 02 59 AF + 39 00 00 00 00 00 02 5A AF + 39 00 00 00 00 00 02 5B B0 + 39 00 00 00 00 00 02 5C B1 + 39 00 00 00 00 00 02 5D B2 + 39 00 00 00 00 00 02 5E B3 + 39 00 00 00 00 00 02 5F B3 + 39 00 00 00 00 00 02 60 B3 + 39 00 00 00 00 00 02 61 B4 + 39 00 00 00 00 00 02 62 B4 + 39 00 00 00 00 00 02 63 B4 + 39 00 00 00 00 00 02 64 B5 + 39 00 00 00 00 00 02 65 B5 + 39 00 00 00 00 00 02 66 B5 + 39 00 00 00 00 00 02 67 B6 + 39 00 00 00 00 00 02 68 B6 + 39 00 00 00 00 00 02 69 B7 + 39 00 00 00 00 00 02 6A B7 + 39 00 00 00 00 00 02 6B B8 + 39 00 00 00 00 00 02 6C B8 + 39 00 00 00 00 00 02 6D B8 + 39 00 00 00 00 00 02 6E B9 + 39 00 00 00 00 00 02 6F B9 + 39 00 00 00 00 00 02 70 BA + 39 00 00 00 00 00 02 71 BB + 39 00 00 00 00 00 02 72 BB + 39 00 00 00 00 00 02 73 BB + 39 00 00 00 00 00 02 74 BC + 39 00 00 00 00 00 02 75 BD + 39 00 00 00 00 00 02 76 BD + 39 00 00 00 00 00 02 77 BD + 39 00 00 00 00 00 02 78 BE + 39 00 00 00 00 00 02 79 BF + 39 00 00 00 00 00 02 7A BF + 39 00 00 00 00 00 02 7B C0 + 39 00 00 00 00 00 02 7C C0 + 39 00 00 00 00 00 02 7D C1 + 39 00 00 00 00 00 02 7E C1 + 39 00 00 00 00 00 02 7F C2 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 26 85 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 44 88 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 52 87 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5C 85 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5F 86 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 65 86 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 67 85 + 39 00 00 00 00 00 02 68 85 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 6B 86 + 39 00 00 00 00 00 02 6C 86 + 39 00 00 00 00 00 02 6D 86 + 39 00 00 00 00 00 02 6E 86 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 79 84 + 39 00 00 00 00 00 02 7A 84 + 39 00 00 00 00 00 02 7B 84 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7F 85 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 A8 + 39 00 00 00 00 00 02 02 A9 + 39 00 00 00 00 00 02 03 A9 + 39 00 00 00 00 00 02 04 A9 + 39 00 00 00 00 00 02 05 AA + 39 00 00 00 00 00 02 06 AB + 39 00 00 00 00 00 02 07 AB + 39 00 00 00 00 00 02 08 AB + 39 00 00 00 00 00 02 09 AC + 39 00 00 00 00 00 02 0A AC + 39 00 00 00 00 00 02 0B AD + 39 00 00 00 00 00 02 0C AD + 39 00 00 00 00 00 02 0D AD + 39 00 00 00 00 00 02 0E AE + 39 00 00 00 00 00 02 0F AE + 39 00 00 00 00 00 02 10 AE + 39 00 00 00 00 00 02 11 AF + 39 00 00 00 00 00 02 12 AF + 39 00 00 00 00 00 02 13 AF + 39 00 00 00 00 00 02 14 B0 + 39 00 00 00 00 00 02 15 B0 + 39 00 00 00 00 00 02 16 B0 + 39 00 00 00 00 00 02 17 B1 + 39 00 00 00 00 00 02 18 B1 + 39 00 00 00 00 00 02 19 B1 + 39 00 00 00 00 00 02 1A B1 + 39 00 00 00 00 00 02 1B B1 + 39 00 00 00 00 00 02 1C B1 + 39 00 00 00 00 00 02 1D B1 + 39 00 00 00 00 00 02 1E B2 + 39 00 00 00 00 00 02 1F B3 + 39 00 00 00 00 00 02 20 B3 + 39 00 00 00 00 00 02 21 B4 + 39 00 00 00 00 00 02 22 B4 + 39 00 00 00 00 00 02 23 B5 + 39 00 00 00 00 00 02 24 B5 + 39 00 00 00 00 00 02 25 B6 + 39 00 00 00 00 00 02 26 B6 + 39 00 00 00 00 00 02 27 B7 + 39 00 00 00 00 00 02 28 B7 + 39 00 00 00 00 00 02 29 B7 + 39 00 00 00 00 00 02 2A B8 + 39 00 00 00 00 00 02 2B B8 + 39 00 00 00 00 00 02 2C B8 + 39 00 00 00 00 00 02 2D B9 + 39 00 00 00 00 00 02 2E B9 + 39 00 00 00 00 00 02 2F B9 + 39 00 00 00 00 00 02 30 B9 + 39 00 00 00 00 00 02 31 BA + 39 00 00 00 00 00 02 32 BA + 39 00 00 00 00 00 02 33 BB + 39 00 00 00 00 00 02 34 BB + 39 00 00 00 00 00 02 35 BA + 39 00 00 00 00 00 02 36 BA + 39 00 00 00 00 00 02 37 BA + 39 00 00 00 00 00 02 38 BA + 39 00 00 00 00 00 02 39 BA + 39 00 00 00 00 00 02 3A BA + 39 00 00 00 00 00 02 3B BA + 39 00 00 00 00 00 02 3C BA + 39 00 00 00 00 00 02 3D BA + 39 00 00 00 00 00 02 3E BA + 39 00 00 00 00 00 02 3F BB + 39 00 00 00 00 00 02 40 BC + 39 00 00 00 00 00 02 41 BD + 39 00 00 00 00 00 02 42 BE + 39 00 00 00 00 00 02 43 BE + 39 00 00 00 00 00 02 44 BF + 39 00 00 00 00 00 02 45 C0 + 39 00 00 00 00 00 02 46 C0 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 C2 + 39 00 00 00 00 00 02 49 C2 + 39 00 00 00 00 00 02 4A C3 + 39 00 00 00 00 00 02 4B C3 + 39 00 00 00 00 00 02 4C C3 + 39 00 00 00 00 00 02 4D C4 + 39 00 00 00 00 00 02 4E C4 + 39 00 00 00 00 00 02 4F C4 + 39 00 00 00 00 00 02 50 C5 + 39 00 00 00 00 00 02 51 C5 + 39 00 00 00 00 00 02 52 C5 + 39 00 00 00 00 00 02 53 C6 + 39 00 00 00 00 00 02 54 C6 + 39 00 00 00 00 00 02 55 C6 + 39 00 00 00 00 00 02 56 C6 + 39 00 00 00 00 00 02 57 C6 + 39 00 00 00 00 00 02 58 C5 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 5A C5 + 39 00 00 00 00 00 02 5B C5 + 39 00 00 00 00 00 02 5C C5 + 39 00 00 00 00 00 02 5D C5 + 39 00 00 00 00 00 02 5E C6 + 39 00 00 00 00 00 02 5F C6 + 39 00 00 00 00 00 02 60 C7 + 39 00 00 00 00 00 02 61 C7 + 39 00 00 00 00 00 02 62 C8 + 39 00 00 00 00 00 02 63 C8 + 39 00 00 00 00 00 02 64 C9 + 39 00 00 00 00 00 02 65 C9 + 39 00 00 00 00 00 02 66 C9 + 39 00 00 00 00 00 02 67 C9 + 39 00 00 00 00 00 02 68 CA + 39 00 00 00 00 00 02 69 C9 + 39 00 00 00 00 00 02 6A CA + 39 00 00 00 00 00 02 6B C9 + 39 00 00 00 00 00 02 6C C9 + 39 00 00 00 00 00 02 6D C9 + 39 00 00 00 00 00 02 6E C9 + 39 00 00 00 00 00 02 6F CA + 39 00 00 00 00 00 02 70 CB + 39 00 00 00 00 00 02 71 CB + 39 00 00 00 00 00 02 72 CC + 39 00 00 00 00 00 02 73 CC + 39 00 00 00 00 00 02 74 CC + 39 00 00 00 00 00 02 75 CD + 39 00 00 00 00 00 02 76 CD + 39 00 00 00 00 00 02 77 CD + 39 00 00 00 00 00 02 78 CD + 39 00 00 00 00 00 02 79 CD + 39 00 00 00 00 00 02 7A CC + 39 00 00 00 00 00 02 7B CD + 39 00 00 00 00 00 02 7C CE + 39 00 00 00 00 00 02 7D CE + 39 00 00 00 00 00 02 7E CF + 39 00 00 00 00 00 02 7F CF + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 C3 + 39 00 00 00 00 00 02 02 C3 + 39 00 00 00 00 00 02 03 C4 + 39 00 00 00 00 00 02 04 C5 + 39 00 00 00 00 00 02 05 C6 + 39 00 00 00 00 00 02 06 C7 + 39 00 00 00 00 00 02 07 C7 + 39 00 00 00 00 00 02 08 C8 + 39 00 00 00 00 00 02 09 C9 + 39 00 00 00 00 00 02 0A CA + 39 00 00 00 00 00 02 0B CB + 39 00 00 00 00 00 02 0C CB + 39 00 00 00 00 00 02 0D CC + 39 00 00 00 00 00 02 0E CD + 39 00 00 00 00 00 02 0F CD + 39 00 00 00 00 00 02 10 CE + 39 00 00 00 00 00 02 11 CF + 39 00 00 00 00 00 02 12 D0 + 39 00 00 00 00 00 02 13 D0 + 39 00 00 00 00 00 02 14 D1 + 39 00 00 00 00 00 02 15 D2 + 39 00 00 00 00 00 02 16 D2 + 39 00 00 00 00 00 02 17 D3 + 39 00 00 00 00 00 02 18 D4 + 39 00 00 00 00 00 02 19 D4 + 39 00 00 00 00 00 02 1A D5 + 39 00 00 00 00 00 02 1B D5 + 39 00 00 00 00 00 02 1C D6 + 39 00 00 00 00 00 02 1D D7 + 39 00 00 00 00 00 02 1E D7 + 39 00 00 00 00 00 02 1F D8 + 39 00 00 00 00 00 02 20 D8 + 39 00 00 00 00 00 02 21 D9 + 39 00 00 00 00 00 02 22 DA + 39 00 00 00 00 00 02 23 DA + 39 00 00 00 00 00 02 24 DA + 39 00 00 00 00 00 02 25 DB + 39 00 00 00 00 00 02 26 DB + 39 00 00 00 00 00 02 27 DB + 39 00 00 00 00 00 02 28 DC + 39 00 00 00 00 00 02 29 DD + 39 00 00 00 00 00 02 2A DE + 39 00 00 00 00 00 02 2B DF + 39 00 00 00 00 00 02 2C E0 + 39 00 00 00 00 00 02 2D E0 + 39 00 00 00 00 00 02 2E E1 + 39 00 00 00 00 00 02 2F E2 + 39 00 00 00 00 00 02 30 E3 + 39 00 00 00 00 00 02 31 E4 + 39 00 00 00 00 00 02 32 E4 + 39 00 00 00 00 00 02 33 E5 + 39 00 00 00 00 00 02 34 E6 + 39 00 00 00 00 00 02 35 E6 + 39 00 00 00 00 00 02 36 E7 + 39 00 00 00 00 00 02 37 E8 + 39 00 00 00 00 00 02 38 E8 + 39 00 00 00 00 00 02 39 E9 + 39 00 00 00 00 00 02 3A E9 + 39 00 00 00 00 00 02 3B EA + 39 00 00 00 00 00 02 3C EA + 39 00 00 00 00 00 02 3D EB + 39 00 00 00 00 00 02 3E EC + 39 00 00 00 00 00 02 3F ED + 39 00 00 00 00 00 02 40 ED + 39 00 00 00 00 00 02 41 ED + 39 00 00 00 00 00 02 42 EE + 39 00 00 00 00 00 02 43 EE + 39 00 00 00 00 00 02 44 EE + 39 00 00 00 00 00 02 45 EF + 39 00 00 00 00 00 02 46 EF + 39 00 00 00 00 00 02 47 F0 + 39 00 00 00 00 00 02 48 F0 + 39 00 00 00 00 00 02 49 F0 + 39 00 00 00 00 00 02 4A F0 + 39 00 00 00 00 00 02 4B F1 + 39 00 00 00 00 00 02 4C F2 + 39 00 00 00 00 00 02 4D F3 + 39 00 00 00 00 00 02 4E F4 + 39 00 00 00 00 00 02 4F F5 + 39 00 00 00 00 00 02 50 F6 + 39 00 00 00 00 00 02 51 F7 + 39 00 00 00 00 00 02 52 F8 + 39 00 00 00 00 00 02 53 F9 + 39 00 00 00 00 00 02 54 FA + 39 00 00 00 00 00 02 55 FB + 39 00 00 00 00 00 02 56 FC + 39 00 00 00 00 00 02 57 FD + 39 00 00 00 00 00 02 58 FE + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7F FF + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F A7 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 A8 + 39 00 00 00 00 00 02 7F CF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F C2 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 C2 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 58 FE + 39 00 00 00 00 00 02 57 FD + 39 00 00 00 00 00 02 56 FC + 39 00 00 00 00 00 02 55 FB + 39 00 00 00 00 00 02 54 FA + 39 00 00 00 00 00 02 53 F9 + 39 00 00 00 00 00 02 52 F8 + 39 00 00 00 00 00 02 51 F7 + 39 00 00 00 00 00 02 50 F6 + 39 00 00 00 00 00 02 4F F5 + 39 00 00 00 00 00 02 4E F4 + 39 00 00 00 00 00 02 4D F3 + 39 00 00 00 00 00 02 4C F2 + 39 00 00 00 00 00 02 4B F1 + 39 00 00 00 00 00 02 4A F0 + 39 00 00 00 00 00 02 49 F0 + 39 00 00 00 00 00 02 48 F0 + 39 00 00 00 00 00 02 47 F0 + 39 00 00 00 00 00 02 46 EF + 39 00 00 00 00 00 02 45 EF + 39 00 00 00 00 00 02 44 EE + 39 00 00 00 00 00 02 43 EE + 39 00 00 00 00 00 02 42 EE + 39 00 00 00 00 00 02 41 ED + 39 00 00 00 00 00 02 40 ED + 39 00 00 00 00 00 02 3F ED + 39 00 00 00 00 00 02 3E EC + 39 00 00 00 00 00 02 3D EB + 39 00 00 00 00 00 02 3C EA + 39 00 00 00 00 00 02 3B EA + 39 00 00 00 00 00 02 3A E9 + 39 00 00 00 00 00 02 39 E9 + 39 00 00 00 00 00 02 38 E8 + 39 00 00 00 00 00 02 37 E8 + 39 00 00 00 00 00 02 36 E7 + 39 00 00 00 00 00 02 35 E6 + 39 00 00 00 00 00 02 34 E6 + 39 00 00 00 00 00 02 33 E5 + 39 00 00 00 00 00 02 32 E4 + 39 00 00 00 00 00 02 31 E4 + 39 00 00 00 00 00 02 30 E3 + 39 00 00 00 00 00 02 2F E2 + 39 00 00 00 00 00 02 2E E1 + 39 00 00 00 00 00 02 2D E0 + 39 00 00 00 00 00 02 2C E0 + 39 00 00 00 00 00 02 2B DF + 39 00 00 00 00 00 02 2A DE + 39 00 00 00 00 00 02 29 DD + 39 00 00 00 00 00 02 28 DC + 39 00 00 00 00 00 02 27 DB + 39 00 00 00 00 00 02 26 DB + 39 00 00 00 00 00 02 25 DB + 39 00 00 00 00 00 02 24 DA + 39 00 00 00 00 00 02 23 DA + 39 00 00 00 00 00 02 22 DA + 39 00 00 00 00 00 02 21 D9 + 39 00 00 00 00 00 02 20 D8 + 39 00 00 00 00 00 02 1F D8 + 39 00 00 00 00 00 02 1E D7 + 39 00 00 00 00 00 02 1D D7 + 39 00 00 00 00 00 02 1C D6 + 39 00 00 00 00 00 02 1B D5 + 39 00 00 00 00 00 02 1A D5 + 39 00 00 00 00 00 02 19 D4 + 39 00 00 00 00 00 02 18 D4 + 39 00 00 00 00 00 02 17 D3 + 39 00 00 00 00 00 02 16 D2 + 39 00 00 00 00 00 02 15 D2 + 39 00 00 00 00 00 02 14 D1 + 39 00 00 00 00 00 02 13 D0 + 39 00 00 00 00 00 02 12 D0 + 39 00 00 00 00 00 02 11 CF + 39 00 00 00 00 00 02 10 CE + 39 00 00 00 00 00 02 0F CD + 39 00 00 00 00 00 02 0E CD + 39 00 00 00 00 00 02 0D CC + 39 00 00 00 00 00 02 0C CB + 39 00 00 00 00 00 02 0B CB + 39 00 00 00 00 00 02 0A CA + 39 00 00 00 00 00 02 09 C9 + 39 00 00 00 00 00 02 08 C8 + 39 00 00 00 00 00 02 07 C7 + 39 00 00 00 00 00 02 06 C7 + 39 00 00 00 00 00 02 05 C6 + 39 00 00 00 00 00 02 04 C5 + 39 00 00 00 00 00 02 03 C4 + 39 00 00 00 00 00 02 02 C3 + 39 00 00 00 00 00 02 01 C3 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7B 84 + 39 00 00 00 00 00 02 7A 84 + 39 00 00 00 00 00 02 79 84 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 6E 86 + 39 00 00 00 00 00 02 6D 86 + 39 00 00 00 00 00 02 6C 86 + 39 00 00 00 00 00 02 6B 86 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 68 85 + 39 00 00 00 00 00 02 67 85 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 65 86 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 5F 86 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5C 85 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 52 87 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 44 88 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 26 85 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F CF + 39 00 00 00 00 00 02 7E CF + 39 00 00 00 00 00 02 7D CE + 39 00 00 00 00 00 02 7C CE + 39 00 00 00 00 00 02 7B CD + 39 00 00 00 00 00 02 7A CC + 39 00 00 00 00 00 02 79 CD + 39 00 00 00 00 00 02 78 CD + 39 00 00 00 00 00 02 77 CD + 39 00 00 00 00 00 02 76 CD + 39 00 00 00 00 00 02 75 CD + 39 00 00 00 00 00 02 74 CC + 39 00 00 00 00 00 02 73 CC + 39 00 00 00 00 00 02 72 CC + 39 00 00 00 00 00 02 71 CB + 39 00 00 00 00 00 02 70 CB + 39 00 00 00 00 00 02 6F CA + 39 00 00 00 00 00 02 6E C9 + 39 00 00 00 00 00 02 6D C9 + 39 00 00 00 00 00 02 6C C9 + 39 00 00 00 00 00 02 6B C9 + 39 00 00 00 00 00 02 6A CA + 39 00 00 00 00 00 02 69 C9 + 39 00 00 00 00 00 02 68 CA + 39 00 00 00 00 00 02 67 C9 + 39 00 00 00 00 00 02 66 C9 + 39 00 00 00 00 00 02 65 C9 + 39 00 00 00 00 00 02 64 C9 + 39 00 00 00 00 00 02 63 C8 + 39 00 00 00 00 00 02 62 C8 + 39 00 00 00 00 00 02 61 C7 + 39 00 00 00 00 00 02 60 C7 + 39 00 00 00 00 00 02 5F C6 + 39 00 00 00 00 00 02 5E C6 + 39 00 00 00 00 00 02 5D C5 + 39 00 00 00 00 00 02 5C C5 + 39 00 00 00 00 00 02 5B C5 + 39 00 00 00 00 00 02 5A C5 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 58 C5 + 39 00 00 00 00 00 02 57 C6 + 39 00 00 00 00 00 02 56 C6 + 39 00 00 00 00 00 02 55 C6 + 39 00 00 00 00 00 02 54 C6 + 39 00 00 00 00 00 02 53 C6 + 39 00 00 00 00 00 02 52 C5 + 39 00 00 00 00 00 02 51 C5 + 39 00 00 00 00 00 02 50 C5 + 39 00 00 00 00 00 02 4F C4 + 39 00 00 00 00 00 02 4E C4 + 39 00 00 00 00 00 02 4D C4 + 39 00 00 00 00 00 02 4C C3 + 39 00 00 00 00 00 02 4B C3 + 39 00 00 00 00 00 02 4A C3 + 39 00 00 00 00 00 02 49 C2 + 39 00 00 00 00 00 02 48 C2 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 46 C0 + 39 00 00 00 00 00 02 45 C0 + 39 00 00 00 00 00 02 44 BF + 39 00 00 00 00 00 02 43 BE + 39 00 00 00 00 00 02 42 BE + 39 00 00 00 00 00 02 41 BD + 39 00 00 00 00 00 02 40 BC + 39 00 00 00 00 00 02 3F BB + 39 00 00 00 00 00 02 3E BA + 39 00 00 00 00 00 02 3D BA + 39 00 00 00 00 00 02 3C BA + 39 00 00 00 00 00 02 3B BA + 39 00 00 00 00 00 02 3A BA + 39 00 00 00 00 00 02 39 BA + 39 00 00 00 00 00 02 38 BA + 39 00 00 00 00 00 02 37 BA + 39 00 00 00 00 00 02 36 BA + 39 00 00 00 00 00 02 35 BA + 39 00 00 00 00 00 02 34 BB + 39 00 00 00 00 00 02 33 BB + 39 00 00 00 00 00 02 32 BA + 39 00 00 00 00 00 02 31 BA + 39 00 00 00 00 00 02 30 B9 + 39 00 00 00 00 00 02 2F B9 + 39 00 00 00 00 00 02 2E B9 + 39 00 00 00 00 00 02 2D B9 + 39 00 00 00 00 00 02 2C B8 + 39 00 00 00 00 00 02 2B B8 + 39 00 00 00 00 00 02 2A B8 + 39 00 00 00 00 00 02 29 B7 + 39 00 00 00 00 00 02 28 B7 + 39 00 00 00 00 00 02 27 B7 + 39 00 00 00 00 00 02 26 B6 + 39 00 00 00 00 00 02 25 B6 + 39 00 00 00 00 00 02 24 B5 + 39 00 00 00 00 00 02 23 B5 + 39 00 00 00 00 00 02 22 B4 + 39 00 00 00 00 00 02 21 B4 + 39 00 00 00 00 00 02 20 B3 + 39 00 00 00 00 00 02 1F B3 + 39 00 00 00 00 00 02 1E B2 + 39 00 00 00 00 00 02 1D B1 + 39 00 00 00 00 00 02 1C B1 + 39 00 00 00 00 00 02 1B B1 + 39 00 00 00 00 00 02 1A B1 + 39 00 00 00 00 00 02 19 B1 + 39 00 00 00 00 00 02 18 B1 + 39 00 00 00 00 00 02 17 B1 + 39 00 00 00 00 00 02 16 B0 + 39 00 00 00 00 00 02 15 B0 + 39 00 00 00 00 00 02 14 B0 + 39 00 00 00 00 00 02 13 AF + 39 00 00 00 00 00 02 12 AF + 39 00 00 00 00 00 02 11 AF + 39 00 00 00 00 00 02 10 AE + 39 00 00 00 00 00 02 0F AE + 39 00 00 00 00 00 02 0E AE + 39 00 00 00 00 00 02 0D AD + 39 00 00 00 00 00 02 0C AD + 39 00 00 00 00 00 02 0B AD + 39 00 00 00 00 00 02 0A AC + 39 00 00 00 00 00 02 09 AC + 39 00 00 00 00 00 02 08 AB + 39 00 00 00 00 00 02 07 AB + 39 00 00 00 00 00 02 06 AB + 39 00 00 00 00 00 02 05 AA + 39 00 00 00 00 00 02 04 A9 + 39 00 00 00 00 00 02 03 A9 + 39 00 00 00 00 00 02 02 A9 + 39 00 00 00 00 00 02 01 A8 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F A7 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 A8 + 39 00 00 00 00 00 02 7F CF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F C2 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 C2 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F C2 + 39 00 00 00 00 00 02 7E C1 + 39 00 00 00 00 00 02 7D C1 + 39 00 00 00 00 00 02 7C C0 + 39 00 00 00 00 00 02 7B C0 + 39 00 00 00 00 00 02 7A BF + 39 00 00 00 00 00 02 79 BF + 39 00 00 00 00 00 02 78 BE + 39 00 00 00 00 00 02 77 BD + 39 00 00 00 00 00 02 76 BD + 39 00 00 00 00 00 02 75 BD + 39 00 00 00 00 00 02 74 BC + 39 00 00 00 00 00 02 73 BB + 39 00 00 00 00 00 02 72 BB + 39 00 00 00 00 00 02 71 BB + 39 00 00 00 00 00 02 70 BA + 39 00 00 00 00 00 02 6F B9 + 39 00 00 00 00 00 02 6E B9 + 39 00 00 00 00 00 02 6D B8 + 39 00 00 00 00 00 02 6C B8 + 39 00 00 00 00 00 02 6B B8 + 39 00 00 00 00 00 02 6A B7 + 39 00 00 00 00 00 02 69 B7 + 39 00 00 00 00 00 02 68 B6 + 39 00 00 00 00 00 02 67 B6 + 39 00 00 00 00 00 02 66 B5 + 39 00 00 00 00 00 02 65 B5 + 39 00 00 00 00 00 02 64 B5 + 39 00 00 00 00 00 02 63 B4 + 39 00 00 00 00 00 02 62 B4 + 39 00 00 00 00 00 02 61 B4 + 39 00 00 00 00 00 02 60 B3 + 39 00 00 00 00 00 02 5F B3 + 39 00 00 00 00 00 02 5E B3 + 39 00 00 00 00 00 02 5D B2 + 39 00 00 00 00 00 02 5C B1 + 39 00 00 00 00 00 02 5B B0 + 39 00 00 00 00 00 02 5A AF + 39 00 00 00 00 00 02 59 AF + 39 00 00 00 00 00 02 58 AE + 39 00 00 00 00 00 02 57 AD + 39 00 00 00 00 00 02 56 AC + 39 00 00 00 00 00 02 55 AB + 39 00 00 00 00 00 02 54 AA + 39 00 00 00 00 00 02 53 AA + 39 00 00 00 00 00 02 52 A9 + 39 00 00 00 00 00 02 51 A8 + 39 00 00 00 00 00 02 50 A7 + 39 00 00 00 00 00 02 4F A7 + 39 00 00 00 00 00 02 4E A6 + 39 00 00 00 00 00 02 4D A5 + 39 00 00 00 00 00 02 4C A5 + 39 00 00 00 00 00 02 4B A4 + 39 00 00 00 00 00 02 4A A4 + 39 00 00 00 00 00 02 49 A3 + 39 00 00 00 00 00 02 48 A3 + 39 00 00 00 00 00 02 47 A2 + 39 00 00 00 00 00 02 46 A2 + 39 00 00 00 00 00 02 45 A1 + 39 00 00 00 00 00 02 44 A1 + 39 00 00 00 00 00 02 43 A0 + 39 00 00 00 00 00 02 42 9F + 39 00 00 00 00 00 02 41 9F + 39 00 00 00 00 00 02 40 9F + 39 00 00 00 00 00 02 3F A0 + 39 00 00 00 00 00 02 3E A0 + 39 00 00 00 00 00 02 3D 9F + 39 00 00 00 00 00 02 3C 9F + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3A 9D + 39 00 00 00 00 00 02 39 9C + 39 00 00 00 00 00 02 38 9C + 39 00 00 00 00 00 02 37 9B + 39 00 00 00 00 00 02 36 9A + 39 00 00 00 00 00 02 35 99 + 39 00 00 00 00 00 02 34 98 + 39 00 00 00 00 00 02 33 98 + 39 00 00 00 00 00 02 32 97 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 30 96 + 39 00 00 00 00 00 02 2F 95 + 39 00 00 00 00 00 02 2E 94 + 39 00 00 00 00 00 02 2D 93 + 39 00 00 00 00 00 02 2C 92 + 39 00 00 00 00 00 02 2B 93 + 39 00 00 00 00 00 02 2A 94 + 39 00 00 00 00 00 02 29 95 + 39 00 00 00 00 00 02 28 94 + 39 00 00 00 00 00 02 27 93 + 39 00 00 00 00 00 02 26 93 + 39 00 00 00 00 00 02 25 92 + 39 00 00 00 00 00 02 24 91 + 39 00 00 00 00 00 02 23 91 + 39 00 00 00 00 00 02 22 90 + 39 00 00 00 00 00 02 21 90 + 39 00 00 00 00 00 02 20 90 + 39 00 00 00 00 00 02 1F 90 + 39 00 00 00 00 00 02 1E 8F + 39 00 00 00 00 00 02 1D 8F + 39 00 00 00 00 00 02 1C 8F + 39 00 00 00 00 00 02 1B 8E + 39 00 00 00 00 00 02 1A 8E + 39 00 00 00 00 00 02 19 8D + 39 00 00 00 00 00 02 18 8D + 39 00 00 00 00 00 02 17 8C + 39 00 00 00 00 00 02 16 8B + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 14 8A + 39 00 00 00 00 00 02 13 8A + 39 00 00 00 00 00 02 12 8A + 39 00 00 00 00 00 02 11 89 + 39 00 00 00 00 00 02 10 88 + 39 00 00 00 00 00 02 0F 88 + 39 00 00 00 00 00 02 0E 87 + 39 00 00 00 00 00 02 0D 87 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0B 85 + 39 00 00 00 00 00 02 0A 85 + 39 00 00 00 00 00 02 09 85 + 39 00 00 00 00 00 02 08 84 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 66 05 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 03 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F A7 + 39 00 00 00 00 00 02 7E A7 + 39 00 00 00 00 00 02 7D A6 + 39 00 00 00 00 00 02 7C A5 + 39 00 00 00 00 00 02 7B A4 + 39 00 00 00 00 00 02 7A A4 + 39 00 00 00 00 00 02 79 A4 + 39 00 00 00 00 00 02 78 A4 + 39 00 00 00 00 00 02 77 A3 + 39 00 00 00 00 00 02 76 A3 + 39 00 00 00 00 00 02 75 A3 + 39 00 00 00 00 00 02 74 A3 + 39 00 00 00 00 00 02 73 A2 + 39 00 00 00 00 00 02 72 A2 + 39 00 00 00 00 00 02 71 A2 + 39 00 00 00 00 00 02 70 A1 + 39 00 00 00 00 00 02 6F A1 + 39 00 00 00 00 00 02 6E A1 + 39 00 00 00 00 00 02 6D A1 + 39 00 00 00 00 00 02 6C A0 + 39 00 00 00 00 00 02 6B A0 + 39 00 00 00 00 00 02 6A A0 + 39 00 00 00 00 00 02 69 A0 + 39 00 00 00 00 00 02 68 A0 + 39 00 00 00 00 00 02 67 9F + 39 00 00 00 00 00 02 66 9F + 39 00 00 00 00 00 02 65 9F + 39 00 00 00 00 00 02 64 9F + 39 00 00 00 00 00 02 63 9F + 39 00 00 00 00 00 02 62 9E + 39 00 00 00 00 00 02 61 9E + 39 00 00 00 00 00 02 60 9E + 39 00 00 00 00 00 02 5F 9E + 39 00 00 00 00 00 02 5E 9E + 39 00 00 00 00 00 02 5D 9E + 39 00 00 00 00 00 02 5C 9D + 39 00 00 00 00 00 02 5B 9D + 39 00 00 00 00 00 02 5A 9D + 39 00 00 00 00 00 02 59 9D + 39 00 00 00 00 00 02 58 9D + 39 00 00 00 00 00 02 57 9C + 39 00 00 00 00 00 02 56 9B + 39 00 00 00 00 00 02 55 9B + 39 00 00 00 00 00 02 54 9A + 39 00 00 00 00 00 02 53 9A + 39 00 00 00 00 00 02 52 99 + 39 00 00 00 00 00 02 51 99 + 39 00 00 00 00 00 02 50 98 + 39 00 00 00 00 00 02 4F 97 + 39 00 00 00 00 00 02 4E 97 + 39 00 00 00 00 00 02 4D 96 + 39 00 00 00 00 00 02 4C 96 + 39 00 00 00 00 00 02 4B 95 + 39 00 00 00 00 00 02 4A 95 + 39 00 00 00 00 00 02 49 94 + 39 00 00 00 00 00 02 48 94 + 39 00 00 00 00 00 02 47 93 + 39 00 00 00 00 00 02 46 93 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 44 93 + 39 00 00 00 00 00 02 43 92 + 39 00 00 00 00 00 02 42 92 + 39 00 00 00 00 00 02 41 92 + 39 00 00 00 00 00 02 40 91 + 39 00 00 00 00 00 02 3F 91 + 39 00 00 00 00 00 02 3E 90 + 39 00 00 00 00 00 02 3D 90 + 39 00 00 00 00 00 02 3C 92 + 39 00 00 00 00 00 02 3B 92 + 39 00 00 00 00 00 02 3A 92 + 39 00 00 00 00 00 02 39 92 + 39 00 00 00 00 00 02 38 92 + 39 00 00 00 00 00 02 37 91 + 39 00 00 00 00 00 02 36 90 + 39 00 00 00 00 00 02 35 8F + 39 00 00 00 00 00 02 34 8F + 39 00 00 00 00 00 02 33 8E + 39 00 00 00 00 00 02 32 8D + 39 00 00 00 00 00 02 31 8D + 39 00 00 00 00 00 02 30 8C + 39 00 00 00 00 00 02 2F 8C + 39 00 00 00 00 00 02 2E 8C + 39 00 00 00 00 00 02 2D 8B + 39 00 00 00 00 00 02 2C 8A + 39 00 00 00 00 00 02 2B 8A + 39 00 00 00 00 00 02 2A 89 + 39 00 00 00 00 00 02 29 89 + 39 00 00 00 00 00 02 28 8A + 39 00 00 00 00 00 02 27 8C + 39 00 00 00 00 00 02 26 8C + 39 00 00 00 00 00 02 25 8B + 39 00 00 00 00 00 02 24 8A + 39 00 00 00 00 00 02 23 8A + 39 00 00 00 00 00 02 22 89 + 39 00 00 00 00 00 02 21 89 + 39 00 00 00 00 00 02 20 89 + 39 00 00 00 00 00 02 1F 89 + 39 00 00 00 00 00 02 1E 89 + 39 00 00 00 00 00 02 1D 89 + 39 00 00 00 00 00 02 1C 89 + 39 00 00 00 00 00 02 1B 89 + 39 00 00 00 00 00 02 1A 89 + 39 00 00 00 00 00 02 19 88 + 39 00 00 00 00 00 02 18 88 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 16 87 + 39 00 00 00 00 00 02 15 86 + 39 00 00 00 00 00 02 14 86 + 39 00 00 00 00 00 02 13 86 + 39 00 00 00 00 00 02 12 86 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 10 85 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 0E 84 + 39 00 00 00 00 00 02 0D 84 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 83 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + + ]; + + + qcom,mdss-dsi-panel-eye-command04= [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 09 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2E 07 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 06 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 33 05 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 37 08 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 39 08 + 39 00 00 00 00 00 02 3A 08 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 66 06 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 6A 05 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 73 04 + 39 00 00 00 00 00 02 74 04 + 39 00 00 00 00 00 02 75 04 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 77 03 + 39 00 00 00 00 00 02 78 03 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7F 01 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 84 + 39 00 00 00 00 00 02 0A 84 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0C 85 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0E 86 + 39 00 00 00 00 00 02 0F 86 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 11 87 + 39 00 00 00 00 00 02 12 88 + 39 00 00 00 00 00 02 13 88 + 39 00 00 00 00 00 02 14 88 + 39 00 00 00 00 00 02 15 88 + 39 00 00 00 00 00 02 16 89 + 39 00 00 00 00 00 02 17 89 + 39 00 00 00 00 00 02 18 8A + 39 00 00 00 00 00 02 19 8A + 39 00 00 00 00 00 02 1A 8B + 39 00 00 00 00 00 02 1B 8B + 39 00 00 00 00 00 02 1C 8B + 39 00 00 00 00 00 02 1D 8B + 39 00 00 00 00 00 02 1E 8B + 39 00 00 00 00 00 02 1F 8C + 39 00 00 00 00 00 02 20 8C + 39 00 00 00 00 00 02 21 8C + 39 00 00 00 00 00 02 22 8C + 39 00 00 00 00 00 02 23 8C + 39 00 00 00 00 00 02 24 8D + 39 00 00 00 00 00 02 25 8E + 39 00 00 00 00 00 02 26 8E + 39 00 00 00 00 00 02 27 8F + 39 00 00 00 00 00 02 28 8F + 39 00 00 00 00 00 02 29 8E + 39 00 00 00 00 00 02 2A 8C + 39 00 00 00 00 00 02 2B 8D + 39 00 00 00 00 00 02 2C 8D + 39 00 00 00 00 00 02 2D 8E + 39 00 00 00 00 00 02 2E 8F + 39 00 00 00 00 00 02 2F 90 + 39 00 00 00 00 00 02 30 90 + 39 00 00 00 00 00 02 31 91 + 39 00 00 00 00 00 02 32 91 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 34 93 + 39 00 00 00 00 00 02 35 93 + 39 00 00 00 00 00 02 36 94 + 39 00 00 00 00 00 02 37 95 + 39 00 00 00 00 00 02 38 95 + 39 00 00 00 00 00 02 39 96 + 39 00 00 00 00 00 02 3A 97 + 39 00 00 00 00 00 02 3B 97 + 39 00 00 00 00 00 02 3C 97 + 39 00 00 00 00 00 02 3D 97 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3F 96 + 39 00 00 00 00 00 02 40 96 + 39 00 00 00 00 00 02 41 97 + 39 00 00 00 00 00 02 42 97 + 39 00 00 00 00 00 02 43 98 + 39 00 00 00 00 00 02 44 98 + 39 00 00 00 00 00 02 45 99 + 39 00 00 00 00 00 02 46 99 + 39 00 00 00 00 00 02 47 99 + 39 00 00 00 00 00 02 48 9A + 39 00 00 00 00 00 02 49 9A + 39 00 00 00 00 00 02 4A 9B + 39 00 00 00 00 00 02 4B 9B + 39 00 00 00 00 00 02 4C 9B + 39 00 00 00 00 00 02 4D 9C + 39 00 00 00 00 00 02 4E 9D + 39 00 00 00 00 00 02 4F 9D + 39 00 00 00 00 00 02 50 9E + 39 00 00 00 00 00 02 51 9E + 39 00 00 00 00 00 02 52 9F + 39 00 00 00 00 00 02 53 A0 + 39 00 00 00 00 00 02 54 A1 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 56 A2 + 39 00 00 00 00 00 02 57 A2 + 39 00 00 00 00 00 02 58 A3 + 39 00 00 00 00 00 02 59 A4 + 39 00 00 00 00 00 02 5A A5 + 39 00 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 02 5C A6 + 39 00 00 00 00 00 02 5D A6 + 39 00 00 00 00 00 02 5E A6 + 39 00 00 00 00 00 02 5F A6 + 39 00 00 00 00 00 02 60 A6 + 39 00 00 00 00 00 02 61 A6 + 39 00 00 00 00 00 02 62 A6 + 39 00 00 00 00 00 02 63 A7 + 39 00 00 00 00 00 02 64 A7 + 39 00 00 00 00 00 02 65 A7 + 39 00 00 00 00 00 02 66 A8 + 39 00 00 00 00 00 02 67 A8 + 39 00 00 00 00 00 02 68 A8 + 39 00 00 00 00 00 02 69 A8 + 39 00 00 00 00 00 02 6A A9 + 39 00 00 00 00 00 02 6B A9 + 39 00 00 00 00 00 02 6C A9 + 39 00 00 00 00 00 02 6D AA + 39 00 00 00 00 00 02 6E AA + 39 00 00 00 00 00 02 6F AA + 39 00 00 00 00 00 02 70 AB + 39 00 00 00 00 00 02 71 AB + 39 00 00 00 00 00 02 72 AB + 39 00 00 00 00 00 02 73 AC + 39 00 00 00 00 00 02 74 AC + 39 00 00 00 00 00 02 75 AD + 39 00 00 00 00 00 02 76 AD + 39 00 00 00 00 00 02 77 AD + 39 00 00 00 00 00 02 78 AD + 39 00 00 00 00 00 02 79 AE + 39 00 00 00 00 00 02 7A AE + 39 00 00 00 00 00 02 7B AF + 39 00 00 00 00 00 02 7C AF + 39 00 00 00 00 00 02 7D AF + 39 00 00 00 00 00 02 7E AF + 39 00 00 00 00 00 02 7F B1 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 04 84 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 07 84 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 0A 87 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0D 89 + 39 00 00 00 00 00 02 0E 8A + 39 00 00 00 00 00 02 0F 8B + 39 00 00 00 00 00 02 10 8B + 39 00 00 00 00 00 02 11 8C + 39 00 00 00 00 00 02 12 8D + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 8E + 39 00 00 00 00 00 02 15 8F + 39 00 00 00 00 00 02 16 8F + 39 00 00 00 00 00 02 17 90 + 39 00 00 00 00 00 02 18 91 + 39 00 00 00 00 00 02 19 92 + 39 00 00 00 00 00 02 1A 93 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1C 94 + 39 00 00 00 00 00 02 1D 95 + 39 00 00 00 00 00 02 1E 95 + 39 00 00 00 00 00 02 1F 96 + 39 00 00 00 00 00 02 20 6A + 39 00 00 00 00 00 02 21 69 + 39 00 00 00 00 00 02 22 69 + 39 00 00 00 00 00 02 23 68 + 39 00 00 00 00 00 02 24 68 + 39 00 00 00 00 00 02 25 67 + 39 00 00 00 00 00 02 26 67 + 39 00 00 00 00 00 02 27 66 + 39 00 00 00 00 00 02 28 65 + 39 00 00 00 00 00 02 29 64 + 39 00 00 00 00 00 02 2A 63 + 39 00 00 00 00 00 02 2B 62 + 39 00 00 00 00 00 02 2C 62 + 39 00 00 00 00 00 02 2D 63 + 39 00 00 00 00 00 02 2E 64 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 62 + 39 00 00 00 00 00 02 31 61 + 39 00 00 00 00 00 02 32 60 + 39 00 00 00 00 00 02 33 5F + 39 00 00 00 00 00 02 34 5E + 39 00 00 00 00 00 02 35 5D + 39 00 00 00 00 00 02 36 5D + 39 00 00 00 00 00 02 37 5C + 39 00 00 00 00 00 02 38 5B + 39 00 00 00 00 00 02 39 5A + 39 00 00 00 00 00 02 3A 59 + 39 00 00 00 00 00 02 3B 58 + 39 00 00 00 00 00 02 3C 57 + 39 00 00 00 00 00 02 3D 56 + 39 00 00 00 00 00 02 3E 55 + 39 00 00 00 00 00 02 3F 54 + 39 00 00 00 00 00 02 40 53 + 39 00 00 00 00 00 02 41 53 + 39 00 00 00 00 00 02 42 52 + 39 00 00 00 00 00 02 43 52 + 39 00 00 00 00 00 02 44 53 + 39 00 00 00 00 00 02 45 53 + 39 00 00 00 00 00 02 46 52 + 39 00 00 00 00 00 02 47 51 + 39 00 00 00 00 00 02 48 50 + 39 00 00 00 00 00 02 49 4F + 39 00 00 00 00 00 02 4A 4E + 39 00 00 00 00 00 02 4B 4E + 39 00 00 00 00 00 02 4C 4D + 39 00 00 00 00 00 02 4D 4D + 39 00 00 00 00 00 02 4E 4C + 39 00 00 00 00 00 02 4F 4B + 39 00 00 00 00 00 02 50 4A + 39 00 00 00 00 00 02 51 49 + 39 00 00 00 00 00 02 52 49 + 39 00 00 00 00 00 02 53 48 + 39 00 00 00 00 00 02 54 47 + 39 00 00 00 00 00 02 55 46 + 39 00 00 00 00 00 02 56 45 + 39 00 00 00 00 00 02 57 44 + 39 00 00 00 00 00 02 58 43 + 39 00 00 00 00 00 02 59 42 + 39 00 00 00 00 00 02 5A 41 + 39 00 00 00 00 00 02 5B 40 + 39 00 00 00 00 00 02 5C 3F + 39 00 00 00 00 00 02 5D 3E + 39 00 00 00 00 00 02 5E 3D + 39 00 00 00 00 00 02 5F 3D + 39 00 00 00 00 00 02 60 3C + 39 00 00 00 00 00 02 61 3A + 39 00 00 00 00 00 02 62 39 + 39 00 00 00 00 00 02 63 38 + 39 00 00 00 00 00 02 64 38 + 39 00 00 00 00 00 02 65 37 + 39 00 00 00 00 00 02 66 37 + 39 00 00 00 00 00 02 67 36 + 39 00 00 00 00 00 02 68 36 + 39 00 00 00 00 00 02 69 35 + 39 00 00 00 00 00 02 6A 35 + 39 00 00 00 00 00 02 6B 34 + 39 00 00 00 00 00 02 6C 34 + 39 00 00 00 00 00 02 6D 33 + 39 00 00 00 00 00 02 6E 32 + 39 00 00 00 00 00 02 6F 32 + 39 00 00 00 00 00 02 70 31 + 39 00 00 00 00 00 02 71 30 + 39 00 00 00 00 00 02 72 30 + 39 00 00 00 00 00 02 73 2F + 39 00 00 00 00 00 02 74 2E + 39 00 00 00 00 00 02 75 2E + 39 00 00 00 00 00 02 76 2D + 39 00 00 00 00 00 02 77 2C + 39 00 00 00 00 00 02 78 2C + 39 00 00 00 00 00 02 79 2B + 39 00 00 00 00 00 02 7A 2A + 39 00 00 00 00 00 02 7B 29 + 39 00 00 00 00 00 02 7C 29 + 39 00 00 00 00 00 02 7D 28 + 39 00 00 00 00 00 02 7E 28 + 39 00 00 00 00 00 02 7F 27 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0E 01 + 39 00 00 00 00 00 02 0F 01 + 39 00 00 00 00 00 02 10 01 + 39 00 00 00 00 00 02 11 01 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 82 + 39 00 00 00 00 00 02 28 82 + 39 00 00 00 00 00 02 29 81 + 39 00 00 00 00 00 02 2A 81 + 39 00 00 00 00 00 02 2B 81 + 39 00 00 00 00 00 02 2C 81 + 39 00 00 00 00 00 02 2D 81 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 35 83 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 67 83 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6C 84 + 39 00 00 00 00 00 02 6D 84 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 70 83 + 39 00 00 00 00 00 02 71 83 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7F 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 B2 + 39 00 00 00 00 00 02 02 B2 + 39 00 00 00 00 00 02 03 B3 + 39 00 00 00 00 00 02 04 B4 + 39 00 00 00 00 00 02 05 B4 + 39 00 00 00 00 00 02 06 B5 + 39 00 00 00 00 00 02 07 B5 + 39 00 00 00 00 00 02 08 B6 + 39 00 00 00 00 00 02 09 B7 + 39 00 00 00 00 00 02 0A B7 + 39 00 00 00 00 00 02 0B B7 + 39 00 00 00 00 00 02 0C B8 + 39 00 00 00 00 00 02 0D B9 + 39 00 00 00 00 00 02 0E B9 + 39 00 00 00 00 00 02 0F BA + 39 00 00 00 00 00 02 10 BA + 39 00 00 00 00 00 02 11 BA + 39 00 00 00 00 00 02 12 BB + 39 00 00 00 00 00 02 13 BB + 39 00 00 00 00 00 02 14 BC + 39 00 00 00 00 00 02 15 BC + 39 00 00 00 00 00 02 16 BC + 39 00 00 00 00 00 02 17 BD + 39 00 00 00 00 00 02 18 BD + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A BE + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C BF + 39 00 00 00 00 00 02 1D BF + 39 00 00 00 00 00 02 1E BF + 39 00 00 00 00 00 02 1F BF + 39 00 00 00 00 00 02 20 BF + 39 00 00 00 00 00 02 21 C0 + 39 00 00 00 00 00 02 22 C1 + 39 00 00 00 00 00 02 23 C1 + 39 00 00 00 00 00 02 24 C2 + 39 00 00 00 00 00 02 25 C2 + 39 00 00 00 00 00 02 26 C3 + 39 00 00 00 00 00 02 27 C4 + 39 00 00 00 00 00 02 28 C4 + 39 00 00 00 00 00 02 29 C5 + 39 00 00 00 00 00 02 2A C5 + 39 00 00 00 00 00 02 2B C6 + 39 00 00 00 00 00 02 2C C6 + 39 00 00 00 00 00 02 2D C7 + 39 00 00 00 00 00 02 2E C7 + 39 00 00 00 00 00 02 2F C8 + 39 00 00 00 00 00 02 30 C8 + 39 00 00 00 00 00 02 31 C8 + 39 00 00 00 00 00 02 32 C9 + 39 00 00 00 00 00 02 33 C9 + 39 00 00 00 00 00 02 34 C9 + 39 00 00 00 00 00 02 35 C9 + 39 00 00 00 00 00 02 36 CA + 39 00 00 00 00 00 02 37 CB + 39 00 00 00 00 00 02 38 CB + 39 00 00 00 00 00 02 39 CA + 39 00 00 00 00 00 02 3A CA + 39 00 00 00 00 00 02 3B CB + 39 00 00 00 00 00 02 3C CB + 39 00 00 00 00 00 02 3D CB + 39 00 00 00 00 00 02 3E CB + 39 00 00 00 00 00 02 3F CB + 39 00 00 00 00 00 02 40 CB + 39 00 00 00 00 00 02 41 CB + 39 00 00 00 00 00 02 42 CB + 39 00 00 00 00 00 02 43 CC + 39 00 00 00 00 00 02 44 CD + 39 00 00 00 00 00 02 45 CE + 39 00 00 00 00 00 02 46 CF + 39 00 00 00 00 00 02 47 D0 + 39 00 00 00 00 00 02 48 D0 + 39 00 00 00 00 00 02 49 D1 + 39 00 00 00 00 00 02 4A D2 + 39 00 00 00 00 00 02 4B D2 + 39 00 00 00 00 00 02 4C D3 + 39 00 00 00 00 00 02 4D D4 + 39 00 00 00 00 00 02 4E D5 + 39 00 00 00 00 00 02 4F D5 + 39 00 00 00 00 00 02 50 D5 + 39 00 00 00 00 00 02 51 D6 + 39 00 00 00 00 00 02 52 D6 + 39 00 00 00 00 00 02 53 D7 + 39 00 00 00 00 00 02 54 D7 + 39 00 00 00 00 00 02 55 D8 + 39 00 00 00 00 00 02 56 D8 + 39 00 00 00 00 00 02 57 D8 + 39 00 00 00 00 00 02 58 D8 + 39 00 00 00 00 00 02 59 D9 + 39 00 00 00 00 00 02 5A D9 + 39 00 00 00 00 00 02 5B D9 + 39 00 00 00 00 00 02 5C D9 + 39 00 00 00 00 00 02 5D D9 + 39 00 00 00 00 00 02 5E D9 + 39 00 00 00 00 00 02 5F D9 + 39 00 00 00 00 00 02 60 D9 + 39 00 00 00 00 00 02 61 D9 + 39 00 00 00 00 00 02 62 D9 + 39 00 00 00 00 00 02 63 DA + 39 00 00 00 00 00 02 64 DA + 39 00 00 00 00 00 02 65 DB + 39 00 00 00 00 00 02 66 DC + 39 00 00 00 00 00 02 67 DC + 39 00 00 00 00 00 02 68 DD + 39 00 00 00 00 00 02 69 DD + 39 00 00 00 00 00 02 6A DE + 39 00 00 00 00 00 02 6B DE + 39 00 00 00 00 00 02 6C DE + 39 00 00 00 00 00 02 6D DE + 39 00 00 00 00 00 02 6E DE + 39 00 00 00 00 00 02 6F DF + 39 00 00 00 00 00 02 70 DF + 39 00 00 00 00 00 02 71 DE + 39 00 00 00 00 00 02 72 DE + 39 00 00 00 00 00 02 73 DF + 39 00 00 00 00 00 02 74 DF + 39 00 00 00 00 00 02 75 E0 + 39 00 00 00 00 00 02 76 E1 + 39 00 00 00 00 00 02 77 E1 + 39 00 00 00 00 00 02 78 E2 + 39 00 00 00 00 00 02 79 E2 + 39 00 00 00 00 00 02 7A E2 + 39 00 00 00 00 00 02 7B E3 + 39 00 00 00 00 00 02 7C E3 + 39 00 00 00 00 00 02 7D E3 + 39 00 00 00 00 00 02 7E E3 + 39 00 00 00 00 00 02 7F E3 + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 25 + 39 00 00 00 00 00 02 02 25 + 39 00 00 00 00 00 02 03 24 + 39 00 00 00 00 00 02 04 23 + 39 00 00 00 00 00 02 05 23 + 39 00 00 00 00 00 02 06 22 + 39 00 00 00 00 00 02 07 21 + 39 00 00 00 00 00 02 08 20 + 39 00 00 00 00 00 02 09 20 + 39 00 00 00 00 00 02 0A 1F + 39 00 00 00 00 00 02 0B 1E + 39 00 00 00 00 00 02 0C 1D + 39 00 00 00 00 00 02 0D 1B + 39 00 00 00 00 00 02 0E 1B + 39 00 00 00 00 00 02 0F 1A + 39 00 00 00 00 00 02 10 19 + 39 00 00 00 00 00 02 11 18 + 39 00 00 00 00 00 02 12 17 + 39 00 00 00 00 00 02 13 16 + 39 00 00 00 00 00 02 14 15 + 39 00 00 00 00 00 02 15 14 + 39 00 00 00 00 00 02 16 13 + 39 00 00 00 00 00 02 17 12 + 39 00 00 00 00 00 02 18 12 + 39 00 00 00 00 00 02 19 11 + 39 00 00 00 00 00 02 1A 10 + 39 00 00 00 00 00 02 1B 0F + 39 00 00 00 00 00 02 1C 0E + 39 00 00 00 00 00 02 1D 0D + 39 00 00 00 00 00 02 1E 0C + 39 00 00 00 00 00 02 1F 0C + 39 00 00 00 00 00 02 20 0B + 39 00 00 00 00 00 02 21 0A + 39 00 00 00 00 00 02 22 09 + 39 00 00 00 00 00 02 23 08 + 39 00 00 00 00 00 02 24 08 + 39 00 00 00 00 00 02 25 07 + 39 00 00 00 00 00 02 26 06 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 28 04 + 39 00 00 00 00 00 02 29 04 + 39 00 00 00 00 00 02 2A 03 + 39 00 00 00 00 00 02 2B 02 + 39 00 00 00 00 00 02 2C 02 + 39 00 00 00 00 00 02 2D 01 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 30 81 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 38 89 + 39 00 00 00 00 00 02 39 8A + 39 00 00 00 00 00 02 3A 8B + 39 00 00 00 00 00 02 3B 8B + 39 00 00 00 00 00 02 3C 8C + 39 00 00 00 00 00 02 3D 8D + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3F 8F + 39 00 00 00 00 00 02 40 90 + 39 00 00 00 00 00 02 41 91 + 39 00 00 00 00 00 02 42 91 + 39 00 00 00 00 00 02 43 92 + 39 00 00 00 00 00 02 44 93 + 39 00 00 00 00 00 02 45 94 + 39 00 00 00 00 00 02 46 94 + 39 00 00 00 00 00 02 47 95 + 39 00 00 00 00 00 02 48 96 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 4A 98 + 39 00 00 00 00 00 02 4B 99 + 39 00 00 00 00 00 02 4C 99 + 39 00 00 00 00 00 02 4D 99 + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 51 9C + 39 00 00 00 00 00 02 52 9C + 39 00 00 00 00 00 02 53 9D + 39 00 00 00 00 00 02 54 9D + 39 00 00 00 00 00 02 55 9E + 39 00 00 00 00 00 02 56 9E + 39 00 00 00 00 00 02 57 9F + 39 00 00 00 00 00 02 58 A0 + 39 00 00 00 00 00 02 59 A2 + 39 00 00 00 00 00 02 5A A3 + 39 00 00 00 00 00 02 5B A4 + 39 00 00 00 00 00 02 5C A5 + 39 00 00 00 00 00 02 5D A6 + 39 00 00 00 00 00 02 5E A7 + 39 00 00 00 00 00 02 5F A9 + 39 00 00 00 00 00 02 60 AA + 39 00 00 00 00 00 02 61 AB + 39 00 00 00 00 00 02 62 AC + 39 00 00 00 00 00 02 63 AD + 39 00 00 00 00 00 02 64 AE + 39 00 00 00 00 00 02 65 AF + 39 00 00 00 00 00 02 66 B0 + 39 00 00 00 00 00 02 67 B1 + 39 00 00 00 00 00 02 68 B2 + 39 00 00 00 00 00 02 69 B3 + 39 00 00 00 00 00 02 6A B4 + 39 00 00 00 00 00 02 6B B5 + 39 00 00 00 00 00 02 6C B6 + 39 00 00 00 00 00 02 6D B7 + 39 00 00 00 00 00 02 6E B7 + 39 00 00 00 00 00 02 6F B8 + 39 00 00 00 00 00 02 70 B9 + 39 00 00 00 00 00 02 71 BA + 39 00 00 00 00 00 02 72 BA + 39 00 00 00 00 00 02 73 BB + 39 00 00 00 00 00 02 74 BB + 39 00 00 00 00 00 02 75 BC + 39 00 00 00 00 00 02 76 BD + 39 00 00 00 00 00 02 77 BD + 39 00 00 00 00 00 02 78 BE + 39 00 00 00 00 00 02 79 BE + 39 00 00 00 00 00 02 7A BF + 39 00 00 00 00 00 02 7B BF + 39 00 00 00 00 00 02 7C C1 + 39 00 00 00 00 00 02 7D C2 + 39 00 00 00 00 00 02 7E C3 + 39 00 00 00 00 00 02 7F C4 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F B1 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 B1 + 39 00 00 00 00 00 02 7F E3 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 27 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 26 + 39 00 00 00 00 00 02 7F C4 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F C4 + 39 00 00 00 00 00 02 7E C3 + 39 00 00 00 00 00 02 7D C2 + 39 00 00 00 00 00 02 7C C1 + 39 00 00 00 00 00 02 7B BF + 39 00 00 00 00 00 02 7A BF + 39 00 00 00 00 00 02 79 BE + 39 00 00 00 00 00 02 78 BE + 39 00 00 00 00 00 02 77 BD + 39 00 00 00 00 00 02 76 BD + 39 00 00 00 00 00 02 75 BC + 39 00 00 00 00 00 02 74 BB + 39 00 00 00 00 00 02 73 BB + 39 00 00 00 00 00 02 72 BA + 39 00 00 00 00 00 02 71 BA + 39 00 00 00 00 00 02 70 B9 + 39 00 00 00 00 00 02 6F B8 + 39 00 00 00 00 00 02 6E B7 + 39 00 00 00 00 00 02 6D B7 + 39 00 00 00 00 00 02 6C B6 + 39 00 00 00 00 00 02 6B B5 + 39 00 00 00 00 00 02 6A B4 + 39 00 00 00 00 00 02 69 B3 + 39 00 00 00 00 00 02 68 B2 + 39 00 00 00 00 00 02 67 B1 + 39 00 00 00 00 00 02 66 B0 + 39 00 00 00 00 00 02 65 AF + 39 00 00 00 00 00 02 64 AE + 39 00 00 00 00 00 02 63 AD + 39 00 00 00 00 00 02 62 AC + 39 00 00 00 00 00 02 61 AB + 39 00 00 00 00 00 02 60 AA + 39 00 00 00 00 00 02 5F A9 + 39 00 00 00 00 00 02 5E A7 + 39 00 00 00 00 00 02 5D A6 + 39 00 00 00 00 00 02 5C A5 + 39 00 00 00 00 00 02 5B A4 + 39 00 00 00 00 00 02 5A A3 + 39 00 00 00 00 00 02 59 A2 + 39 00 00 00 00 00 02 58 A0 + 39 00 00 00 00 00 02 57 9F + 39 00 00 00 00 00 02 56 9E + 39 00 00 00 00 00 02 55 9E + 39 00 00 00 00 00 02 54 9D + 39 00 00 00 00 00 02 53 9D + 39 00 00 00 00 00 02 52 9C + 39 00 00 00 00 00 02 51 9C + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4D 99 + 39 00 00 00 00 00 02 4C 99 + 39 00 00 00 00 00 02 4B 99 + 39 00 00 00 00 00 02 4A 98 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 48 96 + 39 00 00 00 00 00 02 47 95 + 39 00 00 00 00 00 02 46 94 + 39 00 00 00 00 00 02 45 94 + 39 00 00 00 00 00 02 44 93 + 39 00 00 00 00 00 02 43 92 + 39 00 00 00 00 00 02 42 91 + 39 00 00 00 00 00 02 41 91 + 39 00 00 00 00 00 02 40 90 + 39 00 00 00 00 00 02 3F 8F + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3D 8D + 39 00 00 00 00 00 02 3C 8C + 39 00 00 00 00 00 02 3B 8B + 39 00 00 00 00 00 02 3A 8B + 39 00 00 00 00 00 02 39 8A + 39 00 00 00 00 00 02 38 89 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 30 81 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2D 01 + 39 00 00 00 00 00 02 2C 02 + 39 00 00 00 00 00 02 2B 02 + 39 00 00 00 00 00 02 2A 03 + 39 00 00 00 00 00 02 29 04 + 39 00 00 00 00 00 02 28 04 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 26 06 + 39 00 00 00 00 00 02 25 07 + 39 00 00 00 00 00 02 24 08 + 39 00 00 00 00 00 02 23 08 + 39 00 00 00 00 00 02 22 09 + 39 00 00 00 00 00 02 21 0A + 39 00 00 00 00 00 02 20 0B + 39 00 00 00 00 00 02 1F 0C + 39 00 00 00 00 00 02 1E 0C + 39 00 00 00 00 00 02 1D 0D + 39 00 00 00 00 00 02 1C 0E + 39 00 00 00 00 00 02 1B 0F + 39 00 00 00 00 00 02 1A 10 + 39 00 00 00 00 00 02 19 11 + 39 00 00 00 00 00 02 18 12 + 39 00 00 00 00 00 02 17 12 + 39 00 00 00 00 00 02 16 13 + 39 00 00 00 00 00 02 15 14 + 39 00 00 00 00 00 02 14 15 + 39 00 00 00 00 00 02 13 16 + 39 00 00 00 00 00 02 12 17 + 39 00 00 00 00 00 02 11 18 + 39 00 00 00 00 00 02 10 19 + 39 00 00 00 00 00 02 0F 1A + 39 00 00 00 00 00 02 0E 1B + 39 00 00 00 00 00 02 0D 1B + 39 00 00 00 00 00 02 0C 1D + 39 00 00 00 00 00 02 0B 1E + 39 00 00 00 00 00 02 0A 1F + 39 00 00 00 00 00 02 09 20 + 39 00 00 00 00 00 02 08 20 + 39 00 00 00 00 00 02 07 21 + 39 00 00 00 00 00 02 06 22 + 39 00 00 00 00 00 02 05 23 + 39 00 00 00 00 00 02 04 23 + 39 00 00 00 00 00 02 03 24 + 39 00 00 00 00 00 02 02 25 + 39 00 00 00 00 00 02 01 25 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 71 83 + 39 00 00 00 00 00 02 70 83 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6D 84 + 39 00 00 00 00 00 02 6C 84 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 67 83 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 35 83 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2D 81 + 39 00 00 00 00 00 02 2C 81 + 39 00 00 00 00 00 02 2B 81 + 39 00 00 00 00 00 02 2A 81 + 39 00 00 00 00 00 02 29 81 + 39 00 00 00 00 00 02 28 82 + 39 00 00 00 00 00 02 27 82 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 11 01 + 39 00 00 00 00 00 02 10 01 + 39 00 00 00 00 00 02 0F 01 + 39 00 00 00 00 00 02 0E 01 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 01 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F E3 + 39 00 00 00 00 00 02 7E E3 + 39 00 00 00 00 00 02 7D E3 + 39 00 00 00 00 00 02 7C E3 + 39 00 00 00 00 00 02 7B E3 + 39 00 00 00 00 00 02 7A E2 + 39 00 00 00 00 00 02 79 E2 + 39 00 00 00 00 00 02 78 E2 + 39 00 00 00 00 00 02 77 E1 + 39 00 00 00 00 00 02 76 E1 + 39 00 00 00 00 00 02 75 E0 + 39 00 00 00 00 00 02 74 DF + 39 00 00 00 00 00 02 73 DF + 39 00 00 00 00 00 02 72 DE + 39 00 00 00 00 00 02 71 DE + 39 00 00 00 00 00 02 70 DF + 39 00 00 00 00 00 02 6F DF + 39 00 00 00 00 00 02 6E DE + 39 00 00 00 00 00 02 6D DE + 39 00 00 00 00 00 02 6C DE + 39 00 00 00 00 00 02 6B DE + 39 00 00 00 00 00 02 6A DE + 39 00 00 00 00 00 02 69 DD + 39 00 00 00 00 00 02 68 DD + 39 00 00 00 00 00 02 67 DC + 39 00 00 00 00 00 02 66 DC + 39 00 00 00 00 00 02 65 DB + 39 00 00 00 00 00 02 64 DA + 39 00 00 00 00 00 02 63 DA + 39 00 00 00 00 00 02 62 D9 + 39 00 00 00 00 00 02 61 D9 + 39 00 00 00 00 00 02 60 D9 + 39 00 00 00 00 00 02 5F D9 + 39 00 00 00 00 00 02 5E D9 + 39 00 00 00 00 00 02 5D D9 + 39 00 00 00 00 00 02 5C D9 + 39 00 00 00 00 00 02 5B D9 + 39 00 00 00 00 00 02 5A D9 + 39 00 00 00 00 00 02 59 D9 + 39 00 00 00 00 00 02 58 D8 + 39 00 00 00 00 00 02 57 D8 + 39 00 00 00 00 00 02 56 D8 + 39 00 00 00 00 00 02 55 D8 + 39 00 00 00 00 00 02 54 D7 + 39 00 00 00 00 00 02 53 D7 + 39 00 00 00 00 00 02 52 D6 + 39 00 00 00 00 00 02 51 D6 + 39 00 00 00 00 00 02 50 D5 + 39 00 00 00 00 00 02 4F D5 + 39 00 00 00 00 00 02 4E D5 + 39 00 00 00 00 00 02 4D D4 + 39 00 00 00 00 00 02 4C D3 + 39 00 00 00 00 00 02 4B D2 + 39 00 00 00 00 00 02 4A D2 + 39 00 00 00 00 00 02 49 D1 + 39 00 00 00 00 00 02 48 D0 + 39 00 00 00 00 00 02 47 D0 + 39 00 00 00 00 00 02 46 CF + 39 00 00 00 00 00 02 45 CE + 39 00 00 00 00 00 02 44 CD + 39 00 00 00 00 00 02 43 CC + 39 00 00 00 00 00 02 42 CB + 39 00 00 00 00 00 02 41 CB + 39 00 00 00 00 00 02 40 CB + 39 00 00 00 00 00 02 3F CB + 39 00 00 00 00 00 02 3E CB + 39 00 00 00 00 00 02 3D CB + 39 00 00 00 00 00 02 3C CB + 39 00 00 00 00 00 02 3B CB + 39 00 00 00 00 00 02 3A CA + 39 00 00 00 00 00 02 39 CA + 39 00 00 00 00 00 02 38 CB + 39 00 00 00 00 00 02 37 CB + 39 00 00 00 00 00 02 36 CA + 39 00 00 00 00 00 02 35 C9 + 39 00 00 00 00 00 02 34 C9 + 39 00 00 00 00 00 02 33 C9 + 39 00 00 00 00 00 02 32 C9 + 39 00 00 00 00 00 02 31 C8 + 39 00 00 00 00 00 02 30 C8 + 39 00 00 00 00 00 02 2F C8 + 39 00 00 00 00 00 02 2E C7 + 39 00 00 00 00 00 02 2D C7 + 39 00 00 00 00 00 02 2C C6 + 39 00 00 00 00 00 02 2B C6 + 39 00 00 00 00 00 02 2A C5 + 39 00 00 00 00 00 02 29 C5 + 39 00 00 00 00 00 02 28 C4 + 39 00 00 00 00 00 02 27 C4 + 39 00 00 00 00 00 02 26 C3 + 39 00 00 00 00 00 02 25 C2 + 39 00 00 00 00 00 02 24 C2 + 39 00 00 00 00 00 02 23 C1 + 39 00 00 00 00 00 02 22 C1 + 39 00 00 00 00 00 02 21 C0 + 39 00 00 00 00 00 02 20 BF + 39 00 00 00 00 00 02 1F BF + 39 00 00 00 00 00 02 1E BF + 39 00 00 00 00 00 02 1D BF + 39 00 00 00 00 00 02 1C BF + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1A BE + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 18 BD + 39 00 00 00 00 00 02 17 BD + 39 00 00 00 00 00 02 16 BC + 39 00 00 00 00 00 02 15 BC + 39 00 00 00 00 00 02 14 BC + 39 00 00 00 00 00 02 13 BB + 39 00 00 00 00 00 02 12 BB + 39 00 00 00 00 00 02 11 BA + 39 00 00 00 00 00 02 10 BA + 39 00 00 00 00 00 02 0F BA + 39 00 00 00 00 00 02 0E B9 + 39 00 00 00 00 00 02 0D B9 + 39 00 00 00 00 00 02 0C B8 + 39 00 00 00 00 00 02 0B B7 + 39 00 00 00 00 00 02 0A B7 + 39 00 00 00 00 00 02 09 B7 + 39 00 00 00 00 00 02 08 B6 + 39 00 00 00 00 00 02 07 B5 + 39 00 00 00 00 00 02 06 B5 + 39 00 00 00 00 00 02 05 B4 + 39 00 00 00 00 00 02 04 B4 + 39 00 00 00 00 00 02 03 B3 + 39 00 00 00 00 00 02 02 B2 + 39 00 00 00 00 00 02 01 B2 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F B1 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 B1 + 39 00 00 00 00 00 02 7F E3 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 27 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 26 + 39 00 00 00 00 00 02 7F C4 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 27 + 39 00 00 00 00 00 02 7E 28 + 39 00 00 00 00 00 02 7D 28 + 39 00 00 00 00 00 02 7C 29 + 39 00 00 00 00 00 02 7B 29 + 39 00 00 00 00 00 02 7A 2A + 39 00 00 00 00 00 02 79 2B + 39 00 00 00 00 00 02 78 2C + 39 00 00 00 00 00 02 77 2C + 39 00 00 00 00 00 02 76 2D + 39 00 00 00 00 00 02 75 2E + 39 00 00 00 00 00 02 74 2E + 39 00 00 00 00 00 02 73 2F + 39 00 00 00 00 00 02 72 30 + 39 00 00 00 00 00 02 71 30 + 39 00 00 00 00 00 02 70 31 + 39 00 00 00 00 00 02 6F 32 + 39 00 00 00 00 00 02 6E 32 + 39 00 00 00 00 00 02 6D 33 + 39 00 00 00 00 00 02 6C 34 + 39 00 00 00 00 00 02 6B 34 + 39 00 00 00 00 00 02 6A 35 + 39 00 00 00 00 00 02 69 35 + 39 00 00 00 00 00 02 68 36 + 39 00 00 00 00 00 02 67 36 + 39 00 00 00 00 00 02 66 37 + 39 00 00 00 00 00 02 65 37 + 39 00 00 00 00 00 02 64 38 + 39 00 00 00 00 00 02 63 38 + 39 00 00 00 00 00 02 62 39 + 39 00 00 00 00 00 02 61 3A + 39 00 00 00 00 00 02 60 3C + 39 00 00 00 00 00 02 5F 3D + 39 00 00 00 00 00 02 5E 3D + 39 00 00 00 00 00 02 5D 3E + 39 00 00 00 00 00 02 5C 3F + 39 00 00 00 00 00 02 5B 40 + 39 00 00 00 00 00 02 5A 41 + 39 00 00 00 00 00 02 59 42 + 39 00 00 00 00 00 02 58 43 + 39 00 00 00 00 00 02 57 44 + 39 00 00 00 00 00 02 56 45 + 39 00 00 00 00 00 02 55 46 + 39 00 00 00 00 00 02 54 47 + 39 00 00 00 00 00 02 53 48 + 39 00 00 00 00 00 02 52 49 + 39 00 00 00 00 00 02 51 49 + 39 00 00 00 00 00 02 50 4A + 39 00 00 00 00 00 02 4F 4B + 39 00 00 00 00 00 02 4E 4C + 39 00 00 00 00 00 02 4D 4D + 39 00 00 00 00 00 02 4C 4D + 39 00 00 00 00 00 02 4B 4E + 39 00 00 00 00 00 02 4A 4E + 39 00 00 00 00 00 02 49 4F + 39 00 00 00 00 00 02 48 50 + 39 00 00 00 00 00 02 47 51 + 39 00 00 00 00 00 02 46 52 + 39 00 00 00 00 00 02 45 53 + 39 00 00 00 00 00 02 44 53 + 39 00 00 00 00 00 02 43 52 + 39 00 00 00 00 00 02 42 52 + 39 00 00 00 00 00 02 41 53 + 39 00 00 00 00 00 02 40 53 + 39 00 00 00 00 00 02 3F 54 + 39 00 00 00 00 00 02 3E 55 + 39 00 00 00 00 00 02 3D 56 + 39 00 00 00 00 00 02 3C 57 + 39 00 00 00 00 00 02 3B 58 + 39 00 00 00 00 00 02 3A 59 + 39 00 00 00 00 00 02 39 5A + 39 00 00 00 00 00 02 38 5B + 39 00 00 00 00 00 02 37 5C + 39 00 00 00 00 00 02 36 5D + 39 00 00 00 00 00 02 35 5D + 39 00 00 00 00 00 02 34 5E + 39 00 00 00 00 00 02 33 5F + 39 00 00 00 00 00 02 32 60 + 39 00 00 00 00 00 02 31 61 + 39 00 00 00 00 00 02 30 62 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 2E 64 + 39 00 00 00 00 00 02 2D 63 + 39 00 00 00 00 00 02 2C 62 + 39 00 00 00 00 00 02 2B 62 + 39 00 00 00 00 00 02 2A 63 + 39 00 00 00 00 00 02 29 64 + 39 00 00 00 00 00 02 28 65 + 39 00 00 00 00 00 02 27 66 + 39 00 00 00 00 00 02 26 67 + 39 00 00 00 00 00 02 25 67 + 39 00 00 00 00 00 02 24 68 + 39 00 00 00 00 00 02 23 68 + 39 00 00 00 00 00 02 22 69 + 39 00 00 00 00 00 02 21 69 + 39 00 00 00 00 00 02 20 6A + 39 00 00 00 00 00 02 1F 96 + 39 00 00 00 00 00 02 1E 95 + 39 00 00 00 00 00 02 1D 95 + 39 00 00 00 00 00 02 1C 94 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1A 93 + 39 00 00 00 00 00 02 19 92 + 39 00 00 00 00 00 02 18 91 + 39 00 00 00 00 00 02 17 90 + 39 00 00 00 00 00 02 16 8F + 39 00 00 00 00 00 02 15 8F + 39 00 00 00 00 00 02 14 8E + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 12 8D + 39 00 00 00 00 00 02 11 8C + 39 00 00 00 00 00 02 10 8B + 39 00 00 00 00 00 02 0F 8B + 39 00 00 00 00 00 02 0E 8A + 39 00 00 00 00 00 02 0D 89 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0A 87 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 07 84 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 04 84 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 78 03 + 39 00 00 00 00 00 02 77 03 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 75 04 + 39 00 00 00 00 00 02 74 04 + 39 00 00 00 00 00 02 73 04 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6A 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 66 06 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 08 + 39 00 00 00 00 00 02 39 08 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 37 08 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 33 05 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 31 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 07 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 09 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F B1 + 39 00 00 00 00 00 02 7E AF + 39 00 00 00 00 00 02 7D AF + 39 00 00 00 00 00 02 7C AF + 39 00 00 00 00 00 02 7B AF + 39 00 00 00 00 00 02 7A AE + 39 00 00 00 00 00 02 79 AE + 39 00 00 00 00 00 02 78 AD + 39 00 00 00 00 00 02 77 AD + 39 00 00 00 00 00 02 76 AD + 39 00 00 00 00 00 02 75 AD + 39 00 00 00 00 00 02 74 AC + 39 00 00 00 00 00 02 73 AC + 39 00 00 00 00 00 02 72 AB + 39 00 00 00 00 00 02 71 AB + 39 00 00 00 00 00 02 70 AB + 39 00 00 00 00 00 02 6F AA + 39 00 00 00 00 00 02 6E AA + 39 00 00 00 00 00 02 6D AA + 39 00 00 00 00 00 02 6C A9 + 39 00 00 00 00 00 02 6B A9 + 39 00 00 00 00 00 02 6A A9 + 39 00 00 00 00 00 02 69 A8 + 39 00 00 00 00 00 02 68 A8 + 39 00 00 00 00 00 02 67 A8 + 39 00 00 00 00 00 02 66 A8 + 39 00 00 00 00 00 02 65 A7 + 39 00 00 00 00 00 02 64 A7 + 39 00 00 00 00 00 02 63 A7 + 39 00 00 00 00 00 02 62 A6 + 39 00 00 00 00 00 02 61 A6 + 39 00 00 00 00 00 02 60 A6 + 39 00 00 00 00 00 02 5F A6 + 39 00 00 00 00 00 02 5E A6 + 39 00 00 00 00 00 02 5D A6 + 39 00 00 00 00 00 02 5C A6 + 39 00 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 02 5A A5 + 39 00 00 00 00 00 02 59 A4 + 39 00 00 00 00 00 02 58 A3 + 39 00 00 00 00 00 02 57 A2 + 39 00 00 00 00 00 02 56 A2 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 54 A1 + 39 00 00 00 00 00 02 53 A0 + 39 00 00 00 00 00 02 52 9F + 39 00 00 00 00 00 02 51 9E + 39 00 00 00 00 00 02 50 9E + 39 00 00 00 00 00 02 4F 9D + 39 00 00 00 00 00 02 4E 9D + 39 00 00 00 00 00 02 4D 9C + 39 00 00 00 00 00 02 4C 9B + 39 00 00 00 00 00 02 4B 9B + 39 00 00 00 00 00 02 4A 9B + 39 00 00 00 00 00 02 49 9A + 39 00 00 00 00 00 02 48 9A + 39 00 00 00 00 00 02 47 99 + 39 00 00 00 00 00 02 46 99 + 39 00 00 00 00 00 02 45 99 + 39 00 00 00 00 00 02 44 98 + 39 00 00 00 00 00 02 43 98 + 39 00 00 00 00 00 02 42 97 + 39 00 00 00 00 00 02 41 97 + 39 00 00 00 00 00 02 40 96 + 39 00 00 00 00 00 02 3F 96 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3D 97 + 39 00 00 00 00 00 02 3C 97 + 39 00 00 00 00 00 02 3B 97 + 39 00 00 00 00 00 02 3A 97 + 39 00 00 00 00 00 02 39 96 + 39 00 00 00 00 00 02 38 95 + 39 00 00 00 00 00 02 37 95 + 39 00 00 00 00 00 02 36 94 + 39 00 00 00 00 00 02 35 93 + 39 00 00 00 00 00 02 34 93 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 32 91 + 39 00 00 00 00 00 02 31 91 + 39 00 00 00 00 00 02 30 90 + 39 00 00 00 00 00 02 2F 90 + 39 00 00 00 00 00 02 2E 8F + 39 00 00 00 00 00 02 2D 8E + 39 00 00 00 00 00 02 2C 8D + 39 00 00 00 00 00 02 2B 8D + 39 00 00 00 00 00 02 2A 8C + 39 00 00 00 00 00 02 29 8E + 39 00 00 00 00 00 02 28 8F + 39 00 00 00 00 00 02 27 8F + 39 00 00 00 00 00 02 26 8E + 39 00 00 00 00 00 02 25 8E + 39 00 00 00 00 00 02 24 8D + 39 00 00 00 00 00 02 23 8C + 39 00 00 00 00 00 02 22 8C + 39 00 00 00 00 00 02 21 8C + 39 00 00 00 00 00 02 20 8C + 39 00 00 00 00 00 02 1F 8C + 39 00 00 00 00 00 02 1E 8B + 39 00 00 00 00 00 02 1D 8B + 39 00 00 00 00 00 02 1C 8B + 39 00 00 00 00 00 02 1B 8B + 39 00 00 00 00 00 02 1A 8B + 39 00 00 00 00 00 02 19 8A + 39 00 00 00 00 00 02 18 8A + 39 00 00 00 00 00 02 17 89 + 39 00 00 00 00 00 02 16 89 + 39 00 00 00 00 00 02 15 88 + 39 00 00 00 00 00 02 14 88 + 39 00 00 00 00 00 02 13 88 + 39 00 00 00 00 00 02 12 88 + 39 00 00 00 00 00 02 11 87 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 0F 86 + 39 00 00 00 00 00 02 0E 86 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0C 85 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0A 84 + 39 00 00 00 00 00 02 09 84 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + + ]; + + + qcom,mdss-dsi-panel-eye-command05 = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 66 05 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 75 03 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7F 00 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 84 + 39 00 00 00 00 00 02 0A 84 + 39 00 00 00 00 00 02 0B 85 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0D 86 + 39 00 00 00 00 00 02 0E 87 + 39 00 00 00 00 00 02 0F 87 + 39 00 00 00 00 00 02 10 88 + 39 00 00 00 00 00 02 11 88 + 39 00 00 00 00 00 02 12 89 + 39 00 00 00 00 00 02 13 89 + 39 00 00 00 00 00 02 14 8A + 39 00 00 00 00 00 02 15 8A + 39 00 00 00 00 00 02 16 8A + 39 00 00 00 00 00 02 17 8B + 39 00 00 00 00 00 02 18 8C + 39 00 00 00 00 00 02 19 8C + 39 00 00 00 00 00 02 1A 8D + 39 00 00 00 00 00 02 1B 8D + 39 00 00 00 00 00 02 1C 8E + 39 00 00 00 00 00 02 1D 8E + 39 00 00 00 00 00 02 1E 8E + 39 00 00 00 00 00 02 1F 8E + 39 00 00 00 00 00 02 20 8F + 39 00 00 00 00 00 02 21 8F + 39 00 00 00 00 00 02 22 8F + 39 00 00 00 00 00 02 23 8F + 39 00 00 00 00 00 02 24 90 + 39 00 00 00 00 00 02 25 91 + 39 00 00 00 00 00 02 26 91 + 39 00 00 00 00 00 02 27 92 + 39 00 00 00 00 00 02 28 93 + 39 00 00 00 00 00 02 29 93 + 39 00 00 00 00 00 02 2A 92 + 39 00 00 00 00 00 02 2B 90 + 39 00 00 00 00 00 02 2C 91 + 39 00 00 00 00 00 02 2D 92 + 39 00 00 00 00 00 02 2E 93 + 39 00 00 00 00 00 02 2F 93 + 39 00 00 00 00 00 02 30 94 + 39 00 00 00 00 00 02 31 95 + 39 00 00 00 00 00 02 32 95 + 39 00 00 00 00 00 02 33 96 + 39 00 00 00 00 00 02 34 97 + 39 00 00 00 00 00 02 35 97 + 39 00 00 00 00 00 02 36 98 + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 38 9A + 39 00 00 00 00 00 02 39 9A + 39 00 00 00 00 00 02 3A 9B + 39 00 00 00 00 00 02 3B 9C + 39 00 00 00 00 00 02 3C 9D + 39 00 00 00 00 00 02 3D 9D + 39 00 00 00 00 00 02 3E 9D + 39 00 00 00 00 00 02 3F 9D + 39 00 00 00 00 00 02 40 9C + 39 00 00 00 00 00 02 41 9C + 39 00 00 00 00 00 02 42 9D + 39 00 00 00 00 00 02 43 9D + 39 00 00 00 00 00 02 44 9E + 39 00 00 00 00 00 02 45 9E + 39 00 00 00 00 00 02 46 9F + 39 00 00 00 00 00 02 47 9F + 39 00 00 00 00 00 02 48 9F + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 4A A0 + 39 00 00 00 00 00 02 4B A1 + 39 00 00 00 00 00 02 4C A2 + 39 00 00 00 00 00 02 4D A2 + 39 00 00 00 00 00 02 4E A3 + 39 00 00 00 00 00 02 4F A3 + 39 00 00 00 00 00 02 50 A4 + 39 00 00 00 00 00 02 51 A5 + 39 00 00 00 00 00 02 52 A5 + 39 00 00 00 00 00 02 53 A6 + 39 00 00 00 00 00 02 54 A7 + 39 00 00 00 00 00 02 55 A8 + 39 00 00 00 00 00 02 56 A9 + 39 00 00 00 00 00 02 57 AA + 39 00 00 00 00 00 02 58 AA + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 5A AC + 39 00 00 00 00 00 02 5B AD + 39 00 00 00 00 00 02 5C AD + 39 00 00 00 00 00 02 5D AE + 39 00 00 00 00 00 02 5E AE + 39 00 00 00 00 00 02 5F AE + 39 00 00 00 00 00 02 60 AF + 39 00 00 00 00 00 02 61 AF + 39 00 00 00 00 00 02 62 AF + 39 00 00 00 00 00 02 63 AF + 39 00 00 00 00 00 02 64 B0 + 39 00 00 00 00 00 02 65 B0 + 39 00 00 00 00 00 02 66 B0 + 39 00 00 00 00 00 02 67 B1 + 39 00 00 00 00 00 02 68 B1 + 39 00 00 00 00 00 02 69 B1 + 39 00 00 00 00 00 02 6A B2 + 39 00 00 00 00 00 02 6B B2 + 39 00 00 00 00 00 02 6C B2 + 39 00 00 00 00 00 02 6D B3 + 39 00 00 00 00 00 02 6E B3 + 39 00 00 00 00 00 02 6F B4 + 39 00 00 00 00 00 02 70 B4 + 39 00 00 00 00 00 02 71 B5 + 39 00 00 00 00 00 02 72 B5 + 39 00 00 00 00 00 02 73 B6 + 39 00 00 00 00 00 02 74 B6 + 39 00 00 00 00 00 02 75 B6 + 39 00 00 00 00 00 02 76 B7 + 39 00 00 00 00 00 02 77 B7 + 39 00 00 00 00 00 02 78 B8 + 39 00 00 00 00 00 02 79 B8 + 39 00 00 00 00 00 02 7A B8 + 39 00 00 00 00 00 02 7B B9 + 39 00 00 00 00 00 02 7C B9 + 39 00 00 00 00 00 02 7D BA + 39 00 00 00 00 00 02 7E BA + 39 00 00 00 00 00 02 7F BB + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 04 85 + 39 00 00 00 00 00 02 05 85 + 39 00 00 00 00 00 02 06 85 + 39 00 00 00 00 00 02 07 86 + 39 00 00 00 00 00 02 08 87 + 39 00 00 00 00 00 02 09 88 + 39 00 00 00 00 00 02 0A 89 + 39 00 00 00 00 00 02 0B 89 + 39 00 00 00 00 00 02 0C 8A + 39 00 00 00 00 00 02 0D 8B + 39 00 00 00 00 00 02 0E 8C + 39 00 00 00 00 00 02 0F 8D + 39 00 00 00 00 00 02 10 8E + 39 00 00 00 00 00 02 11 8F + 39 00 00 00 00 00 02 12 90 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 92 + 39 00 00 00 00 00 02 15 93 + 39 00 00 00 00 00 02 16 93 + 39 00 00 00 00 00 02 17 94 + 39 00 00 00 00 00 02 18 95 + 39 00 00 00 00 00 02 19 96 + 39 00 00 00 00 00 02 1A 97 + 39 00 00 00 00 00 02 1B 98 + 39 00 00 00 00 00 02 1C 99 + 39 00 00 00 00 00 02 1D 9A + 39 00 00 00 00 00 02 1E 9B + 39 00 00 00 00 00 02 1F 9B + 39 00 00 00 00 00 02 20 64 + 39 00 00 00 00 00 02 21 63 + 39 00 00 00 00 00 02 22 63 + 39 00 00 00 00 00 02 23 62 + 39 00 00 00 00 00 02 24 61 + 39 00 00 00 00 00 02 25 61 + 39 00 00 00 00 00 02 26 60 + 39 00 00 00 00 00 02 27 60 + 39 00 00 00 00 00 02 28 5F + 39 00 00 00 00 00 02 29 5E + 39 00 00 00 00 00 02 2A 5D + 39 00 00 00 00 00 02 2B 5B + 39 00 00 00 00 00 02 2C 5A + 39 00 00 00 00 00 02 2D 59 + 39 00 00 00 00 00 02 2E 58 + 39 00 00 00 00 00 02 2F 59 + 39 00 00 00 00 00 02 30 5A + 39 00 00 00 00 00 02 31 5A + 39 00 00 00 00 00 02 32 59 + 39 00 00 00 00 00 02 33 57 + 39 00 00 00 00 00 02 34 56 + 39 00 00 00 00 00 02 35 55 + 39 00 00 00 00 00 02 36 54 + 39 00 00 00 00 00 02 37 53 + 39 00 00 00 00 00 02 38 52 + 39 00 00 00 00 00 02 39 51 + 39 00 00 00 00 00 02 3A 50 + 39 00 00 00 00 00 02 3B 4F + 39 00 00 00 00 00 02 3C 4E + 39 00 00 00 00 00 02 3D 4D + 39 00 00 00 00 00 02 3E 4C + 39 00 00 00 00 00 02 3F 4A + 39 00 00 00 00 00 02 40 49 + 39 00 00 00 00 00 02 41 48 + 39 00 00 00 00 00 02 42 47 + 39 00 00 00 00 00 02 43 46 + 39 00 00 00 00 00 02 44 45 + 39 00 00 00 00 00 02 45 44 + 39 00 00 00 00 00 02 46 44 + 39 00 00 00 00 00 02 47 44 + 39 00 00 00 00 00 02 48 44 + 39 00 00 00 00 00 02 49 44 + 39 00 00 00 00 00 02 4A 43 + 39 00 00 00 00 00 02 4B 42 + 39 00 00 00 00 00 02 4C 41 + 39 00 00 00 00 00 02 4D 40 + 39 00 00 00 00 00 02 4E 3F + 39 00 00 00 00 00 02 4F 3E + 39 00 00 00 00 00 02 50 3D + 39 00 00 00 00 00 02 51 3C + 39 00 00 00 00 00 02 52 3B + 39 00 00 00 00 00 02 53 3B + 39 00 00 00 00 00 02 54 3A + 39 00 00 00 00 00 02 55 39 + 39 00 00 00 00 00 02 56 38 + 39 00 00 00 00 00 02 57 37 + 39 00 00 00 00 00 02 58 36 + 39 00 00 00 00 00 02 59 35 + 39 00 00 00 00 00 02 5A 34 + 39 00 00 00 00 00 02 5B 33 + 39 00 00 00 00 00 02 5C 32 + 39 00 00 00 00 00 02 5D 30 + 39 00 00 00 00 00 02 5E 2F + 39 00 00 00 00 00 02 5F 2E + 39 00 00 00 00 00 02 60 2D + 39 00 00 00 00 00 02 61 2C + 39 00 00 00 00 00 02 62 2A + 39 00 00 00 00 00 02 63 2A + 39 00 00 00 00 00 02 64 29 + 39 00 00 00 00 00 02 65 28 + 39 00 00 00 00 00 02 66 26 + 39 00 00 00 00 00 02 67 25 + 39 00 00 00 00 00 02 68 24 + 39 00 00 00 00 00 02 69 23 + 39 00 00 00 00 00 02 6A 22 + 39 00 00 00 00 00 02 6B 21 + 39 00 00 00 00 00 02 6C 21 + 39 00 00 00 00 00 02 6D 20 + 39 00 00 00 00 00 02 6E 1F + 39 00 00 00 00 00 02 6F 1F + 39 00 00 00 00 00 02 70 1E + 39 00 00 00 00 00 02 71 1D + 39 00 00 00 00 00 02 72 1C + 39 00 00 00 00 00 02 73 1C + 39 00 00 00 00 00 02 74 1B + 39 00 00 00 00 00 02 75 1A + 39 00 00 00 00 00 02 76 19 + 39 00 00 00 00 00 02 77 18 + 39 00 00 00 00 00 02 78 18 + 39 00 00 00 00 00 02 79 17 + 39 00 00 00 00 00 02 7A 16 + 39 00 00 00 00 00 02 7B 15 + 39 00 00 00 00 00 02 7C 14 + 39 00 00 00 00 00 02 7D 13 + 39 00 00 00 00 00 02 7E 12 + 39 00 00 00 00 00 02 7F 12 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 1A 83 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3D 87 + 39 00 00 00 00 00 02 3E 87 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 42 87 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 46 87 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 4B 85 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 53 86 + 39 00 00 00 00 00 02 54 86 + 39 00 00 00 00 00 02 55 86 + 39 00 00 00 00 00 02 56 86 + 39 00 00 00 00 00 02 57 86 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 5A 85 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 60 85 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 64 85 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 67 84 + 39 00 00 00 00 00 02 68 84 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 6B 85 + 39 00 00 00 00 00 02 6C 86 + 39 00 00 00 00 00 02 6D 86 + 39 00 00 00 00 00 02 6E 86 + 39 00 00 00 00 00 02 6F 85 + 39 00 00 00 00 00 02 70 85 + 39 00 00 00 00 00 02 71 85 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 79 84 + 39 00 00 00 00 00 02 7A 84 + 39 00 00 00 00 00 02 7B 84 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7F 84 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 BB + 39 00 00 00 00 00 02 02 BD + 39 00 00 00 00 00 02 03 BD + 39 00 00 00 00 00 02 04 BE + 39 00 00 00 00 00 02 05 BF + 39 00 00 00 00 00 02 06 BF + 39 00 00 00 00 00 02 07 C0 + 39 00 00 00 00 00 02 08 C1 + 39 00 00 00 00 00 02 09 C1 + 39 00 00 00 00 00 02 0A C2 + 39 00 00 00 00 00 02 0B C3 + 39 00 00 00 00 00 02 0C C3 + 39 00 00 00 00 00 02 0D C4 + 39 00 00 00 00 00 02 0E C4 + 39 00 00 00 00 00 02 0F C5 + 39 00 00 00 00 00 02 10 C6 + 39 00 00 00 00 00 02 11 C6 + 39 00 00 00 00 00 02 12 C7 + 39 00 00 00 00 00 02 13 C8 + 39 00 00 00 00 00 02 14 C8 + 39 00 00 00 00 00 02 15 C8 + 39 00 00 00 00 00 02 16 C9 + 39 00 00 00 00 00 02 17 C9 + 39 00 00 00 00 00 02 18 CA + 39 00 00 00 00 00 02 19 CA + 39 00 00 00 00 00 02 1A CB + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C CC + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E CD + 39 00 00 00 00 00 02 1F CD + 39 00 00 00 00 00 02 20 CD + 39 00 00 00 00 00 02 21 CD + 39 00 00 00 00 00 02 22 CE + 39 00 00 00 00 00 02 23 CE + 39 00 00 00 00 00 02 24 CE + 39 00 00 00 00 00 02 25 CF + 39 00 00 00 00 00 02 26 D0 + 39 00 00 00 00 00 02 27 D1 + 39 00 00 00 00 00 02 28 D1 + 39 00 00 00 00 00 02 29 D2 + 39 00 00 00 00 00 02 2A D3 + 39 00 00 00 00 00 02 2B D4 + 39 00 00 00 00 00 02 2C D4 + 39 00 00 00 00 00 02 2D D5 + 39 00 00 00 00 00 02 2E D5 + 39 00 00 00 00 00 02 2F D6 + 39 00 00 00 00 00 02 30 D6 + 39 00 00 00 00 00 02 31 D7 + 39 00 00 00 00 00 02 32 D8 + 39 00 00 00 00 00 02 33 D8 + 39 00 00 00 00 00 02 34 D8 + 39 00 00 00 00 00 02 35 D9 + 39 00 00 00 00 00 02 36 D9 + 39 00 00 00 00 00 02 37 DA + 39 00 00 00 00 00 02 38 DA + 39 00 00 00 00 00 02 39 DA + 39 00 00 00 00 00 02 3A DB + 39 00 00 00 00 00 02 3B DC + 39 00 00 00 00 00 02 3C DC + 39 00 00 00 00 00 02 3D DC + 39 00 00 00 00 00 02 3E DC + 39 00 00 00 00 00 02 3F DC + 39 00 00 00 00 00 02 40 DC + 39 00 00 00 00 00 02 41 DD + 39 00 00 00 00 00 02 42 DD + 39 00 00 00 00 00 02 43 DD + 39 00 00 00 00 00 02 44 DD + 39 00 00 00 00 00 02 45 DD + 39 00 00 00 00 00 02 46 DD + 39 00 00 00 00 00 02 47 DE + 39 00 00 00 00 00 02 48 DF + 39 00 00 00 00 00 02 49 E0 + 39 00 00 00 00 00 02 4A E1 + 39 00 00 00 00 00 02 4B E2 + 39 00 00 00 00 00 02 4C E2 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E E4 + 39 00 00 00 00 00 02 4F E5 + 39 00 00 00 00 00 02 50 E6 + 39 00 00 00 00 00 02 51 E7 + 39 00 00 00 00 00 02 52 E7 + 39 00 00 00 00 00 02 53 E8 + 39 00 00 00 00 00 02 54 E9 + 39 00 00 00 00 00 02 55 E9 + 39 00 00 00 00 00 02 56 EA + 39 00 00 00 00 00 02 57 EA + 39 00 00 00 00 00 02 58 EB + 39 00 00 00 00 00 02 59 EB + 39 00 00 00 00 00 02 5A EC + 39 00 00 00 00 00 02 5B EC + 39 00 00 00 00 00 02 5C ED + 39 00 00 00 00 00 02 5D ED + 39 00 00 00 00 00 02 5E ED + 39 00 00 00 00 00 02 5F EE + 39 00 00 00 00 00 02 60 EE + 39 00 00 00 00 00 02 61 EE + 39 00 00 00 00 00 02 62 EE + 39 00 00 00 00 00 02 63 EE + 39 00 00 00 00 00 02 64 EE + 39 00 00 00 00 00 02 65 EE + 39 00 00 00 00 00 02 66 EE + 39 00 00 00 00 00 02 67 EE + 39 00 00 00 00 00 02 68 EF + 39 00 00 00 00 00 02 69 F0 + 39 00 00 00 00 00 02 6A F0 + 39 00 00 00 00 00 02 6B F1 + 39 00 00 00 00 00 02 6C F2 + 39 00 00 00 00 00 02 6D F2 + 39 00 00 00 00 00 02 6E F3 + 39 00 00 00 00 00 02 6F F3 + 39 00 00 00 00 00 02 70 F4 + 39 00 00 00 00 00 02 71 F4 + 39 00 00 00 00 00 02 72 F5 + 39 00 00 00 00 00 02 73 F5 + 39 00 00 00 00 00 02 74 F5 + 39 00 00 00 00 00 02 75 F5 + 39 00 00 00 00 00 02 76 F5 + 39 00 00 00 00 00 02 77 F5 + 39 00 00 00 00 00 02 78 F5 + 39 00 00 00 00 00 02 79 F6 + 39 00 00 00 00 00 02 7A F7 + 39 00 00 00 00 00 02 7B F7 + 39 00 00 00 00 00 02 7C F8 + 39 00 00 00 00 00 02 7D F9 + 39 00 00 00 00 00 02 7E F9 + 39 00 00 00 00 00 02 7F FA + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 10 + 39 00 00 00 00 00 02 02 0F + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 0D + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 0C + 39 00 00 00 00 00 02 07 0B + 39 00 00 00 00 00 02 08 0A + 39 00 00 00 00 00 02 09 09 + 39 00 00 00 00 00 02 0A 08 + 39 00 00 00 00 00 02 0B 07 + 39 00 00 00 00 00 02 0C 06 + 39 00 00 00 00 00 02 0D 06 + 39 00 00 00 00 00 02 0E 05 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 12 01 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 86 + 39 00 00 00 00 00 02 19 87 + 39 00 00 00 00 00 02 1A 88 + 39 00 00 00 00 00 02 1B 89 + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1D 8B + 39 00 00 00 00 00 02 1E 8D + 39 00 00 00 00 00 02 1F 8E + 39 00 00 00 00 00 02 20 8F + 39 00 00 00 00 00 02 21 90 + 39 00 00 00 00 00 02 22 91 + 39 00 00 00 00 00 02 23 92 + 39 00 00 00 00 00 02 24 93 + 39 00 00 00 00 00 02 25 94 + 39 00 00 00 00 00 02 26 95 + 39 00 00 00 00 00 02 27 96 + 39 00 00 00 00 00 02 28 97 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 2A 99 + 39 00 00 00 00 00 02 2B 99 + 39 00 00 00 00 00 02 2C 9A + 39 00 00 00 00 00 02 2D 9B + 39 00 00 00 00 00 02 2E 9C + 39 00 00 00 00 00 02 2F 9D + 39 00 00 00 00 00 02 30 9E + 39 00 00 00 00 00 02 31 9F + 39 00 00 00 00 00 02 32 A0 + 39 00 00 00 00 00 02 33 A1 + 39 00 00 00 00 00 02 34 A2 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 A3 + 39 00 00 00 00 00 02 37 A4 + 39 00 00 00 00 00 02 38 A5 + 39 00 00 00 00 00 02 39 A6 + 39 00 00 00 00 00 02 3A A7 + 39 00 00 00 00 00 02 3B A8 + 39 00 00 00 00 00 02 3C A9 + 39 00 00 00 00 00 02 3D AA + 39 00 00 00 00 00 02 3E AB + 39 00 00 00 00 00 02 3F AD + 39 00 00 00 00 00 02 40 AE + 39 00 00 00 00 00 02 41 AF + 39 00 00 00 00 00 02 42 B0 + 39 00 00 00 00 00 02 43 B1 + 39 00 00 00 00 00 02 44 B2 + 39 00 00 00 00 00 02 45 B3 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 47 B5 + 39 00 00 00 00 00 02 48 B6 + 39 00 00 00 00 00 02 49 B7 + 39 00 00 00 00 00 02 4A B8 + 39 00 00 00 00 00 02 4B B9 + 39 00 00 00 00 00 02 4C BA + 39 00 00 00 00 00 02 4D BB + 39 00 00 00 00 00 02 4E BC + 39 00 00 00 00 00 02 4F BD + 39 00 00 00 00 00 02 50 BE + 39 00 00 00 00 00 02 51 BF + 39 00 00 00 00 00 02 52 C0 + 39 00 00 00 00 00 02 53 C1 + 39 00 00 00 00 00 02 54 C2 + 39 00 00 00 00 00 02 55 C3 + 39 00 00 00 00 00 02 56 C4 + 39 00 00 00 00 00 02 57 C4 + 39 00 00 00 00 00 02 58 C5 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 5A C6 + 39 00 00 00 00 00 02 5B C7 + 39 00 00 00 00 00 02 5C C8 + 39 00 00 00 00 00 02 5D C9 + 39 00 00 00 00 00 02 5E C9 + 39 00 00 00 00 00 02 5F CA + 39 00 00 00 00 00 02 60 CB + 39 00 00 00 00 00 02 61 CB + 39 00 00 00 00 00 02 62 CC + 39 00 00 00 00 00 02 63 CD + 39 00 00 00 00 00 02 64 CF + 39 00 00 00 00 00 02 65 D0 + 39 00 00 00 00 00 02 66 D2 + 39 00 00 00 00 00 02 67 D3 + 39 00 00 00 00 00 02 68 D4 + 39 00 00 00 00 00 02 69 D5 + 39 00 00 00 00 00 02 6A D7 + 39 00 00 00 00 00 02 6B D8 + 39 00 00 00 00 00 02 6C D9 + 39 00 00 00 00 00 02 6D DB + 39 00 00 00 00 00 02 6E DC + 39 00 00 00 00 00 02 6F DD + 39 00 00 00 00 00 02 70 DE + 39 00 00 00 00 00 02 71 E0 + 39 00 00 00 00 00 02 72 E1 + 39 00 00 00 00 00 02 73 E2 + 39 00 00 00 00 00 02 74 E3 + 39 00 00 00 00 00 02 75 E4 + 39 00 00 00 00 00 02 76 E5 + 39 00 00 00 00 00 02 77 E6 + 39 00 00 00 00 00 02 78 E7 + 39 00 00 00 00 00 02 79 E8 + 39 00 00 00 00 00 02 7A E9 + 39 00 00 00 00 00 02 7B EA + 39 00 00 00 00 00 02 7C EB + 39 00 00 00 00 00 02 7D EC + 39 00 00 00 00 00 02 7E ED + 39 00 00 00 00 00 02 7F EE + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 84 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F bb + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 bb + 39 00 00 00 00 00 02 7F fa + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 12 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 11 + 39 00 00 00 00 00 02 7F ee + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F EE + 39 00 00 00 00 00 02 7E ED + 39 00 00 00 00 00 02 7D EC + 39 00 00 00 00 00 02 7C EB + 39 00 00 00 00 00 02 7B EA + 39 00 00 00 00 00 02 7A E9 + 39 00 00 00 00 00 02 79 E8 + 39 00 00 00 00 00 02 78 E7 + 39 00 00 00 00 00 02 77 E6 + 39 00 00 00 00 00 02 76 E5 + 39 00 00 00 00 00 02 75 E4 + 39 00 00 00 00 00 02 74 E3 + 39 00 00 00 00 00 02 73 E2 + 39 00 00 00 00 00 02 72 E1 + 39 00 00 00 00 00 02 71 E0 + 39 00 00 00 00 00 02 70 DE + 39 00 00 00 00 00 02 6F DD + 39 00 00 00 00 00 02 6E DC + 39 00 00 00 00 00 02 6D DB + 39 00 00 00 00 00 02 6C D9 + 39 00 00 00 00 00 02 6B D8 + 39 00 00 00 00 00 02 6A D7 + 39 00 00 00 00 00 02 69 D5 + 39 00 00 00 00 00 02 68 D4 + 39 00 00 00 00 00 02 67 D3 + 39 00 00 00 00 00 02 66 D2 + 39 00 00 00 00 00 02 65 D0 + 39 00 00 00 00 00 02 64 CF + 39 00 00 00 00 00 02 63 CD + 39 00 00 00 00 00 02 62 CC + 39 00 00 00 00 00 02 61 CB + 39 00 00 00 00 00 02 60 CB + 39 00 00 00 00 00 02 5F CA + 39 00 00 00 00 00 02 5E C9 + 39 00 00 00 00 00 02 5D C9 + 39 00 00 00 00 00 02 5C C8 + 39 00 00 00 00 00 02 5B C7 + 39 00 00 00 00 00 02 5A C6 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 58 C5 + 39 00 00 00 00 00 02 57 C4 + 39 00 00 00 00 00 02 56 C4 + 39 00 00 00 00 00 02 55 C3 + 39 00 00 00 00 00 02 54 C2 + 39 00 00 00 00 00 02 53 C1 + 39 00 00 00 00 00 02 52 C0 + 39 00 00 00 00 00 02 51 BF + 39 00 00 00 00 00 02 50 BE + 39 00 00 00 00 00 02 4F BD + 39 00 00 00 00 00 02 4E BC + 39 00 00 00 00 00 02 4D BB + 39 00 00 00 00 00 02 4C BA + 39 00 00 00 00 00 02 4B B9 + 39 00 00 00 00 00 02 4A B8 + 39 00 00 00 00 00 02 49 B7 + 39 00 00 00 00 00 02 48 B6 + 39 00 00 00 00 00 02 47 B5 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 45 B3 + 39 00 00 00 00 00 02 44 B2 + 39 00 00 00 00 00 02 43 B1 + 39 00 00 00 00 00 02 42 B0 + 39 00 00 00 00 00 02 41 AF + 39 00 00 00 00 00 02 40 AE + 39 00 00 00 00 00 02 3F AD + 39 00 00 00 00 00 02 3E AB + 39 00 00 00 00 00 02 3D AA + 39 00 00 00 00 00 02 3C A9 + 39 00 00 00 00 00 02 3B A8 + 39 00 00 00 00 00 02 3A A7 + 39 00 00 00 00 00 02 39 A6 + 39 00 00 00 00 00 02 38 A5 + 39 00 00 00 00 00 02 37 A4 + 39 00 00 00 00 00 02 36 A3 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 34 A2 + 39 00 00 00 00 00 02 33 A1 + 39 00 00 00 00 00 02 32 A0 + 39 00 00 00 00 00 02 31 9F + 39 00 00 00 00 00 02 30 9E + 39 00 00 00 00 00 02 2F 9D + 39 00 00 00 00 00 02 2E 9C + 39 00 00 00 00 00 02 2D 9B + 39 00 00 00 00 00 02 2C 9A + 39 00 00 00 00 00 02 2B 99 + 39 00 00 00 00 00 02 2A 99 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 28 97 + 39 00 00 00 00 00 02 27 96 + 39 00 00 00 00 00 02 26 95 + 39 00 00 00 00 00 02 25 94 + 39 00 00 00 00 00 02 24 93 + 39 00 00 00 00 00 02 23 92 + 39 00 00 00 00 00 02 22 91 + 39 00 00 00 00 00 02 21 90 + 39 00 00 00 00 00 02 20 8F + 39 00 00 00 00 00 02 1F 8E + 39 00 00 00 00 00 02 1E 8D + 39 00 00 00 00 00 02 1D 8B + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1B 89 + 39 00 00 00 00 00 02 1A 88 + 39 00 00 00 00 00 02 19 87 + 39 00 00 00 00 00 02 18 86 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 12 01 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 05 + 39 00 00 00 00 00 02 0D 06 + 39 00 00 00 00 00 02 0C 06 + 39 00 00 00 00 00 02 0B 07 + 39 00 00 00 00 00 02 0A 08 + 39 00 00 00 00 00 02 09 09 + 39 00 00 00 00 00 02 08 0A + 39 00 00 00 00 00 02 07 0B + 39 00 00 00 00 00 02 06 0C + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 04 0D + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 02 0F + 39 00 00 00 00 00 02 01 10 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 84 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7B 84 + 39 00 00 00 00 00 02 7A 84 + 39 00 00 00 00 00 02 79 84 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 71 85 + 39 00 00 00 00 00 02 70 85 + 39 00 00 00 00 00 02 6F 85 + 39 00 00 00 00 00 02 6E 86 + 39 00 00 00 00 00 02 6D 86 + 39 00 00 00 00 00 02 6C 86 + 39 00 00 00 00 00 02 6B 85 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 68 84 + 39 00 00 00 00 00 02 67 84 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 64 85 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 60 85 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5A 85 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 57 86 + 39 00 00 00 00 00 02 56 86 + 39 00 00 00 00 00 02 55 86 + 39 00 00 00 00 00 02 54 86 + 39 00 00 00 00 00 02 53 86 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4B 85 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 46 87 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 42 87 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 3E 87 + 39 00 00 00 00 00 02 3D 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1A 83 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 01 00 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F FA + 39 00 00 00 00 00 02 7E F9 + 39 00 00 00 00 00 02 7D F9 + 39 00 00 00 00 00 02 7C F8 + 39 00 00 00 00 00 02 7B F7 + 39 00 00 00 00 00 02 7A F7 + 39 00 00 00 00 00 02 79 F6 + 39 00 00 00 00 00 02 78 F5 + 39 00 00 00 00 00 02 77 F5 + 39 00 00 00 00 00 02 76 F5 + 39 00 00 00 00 00 02 75 F5 + 39 00 00 00 00 00 02 74 F5 + 39 00 00 00 00 00 02 73 F5 + 39 00 00 00 00 00 02 72 F5 + 39 00 00 00 00 00 02 71 F4 + 39 00 00 00 00 00 02 70 F4 + 39 00 00 00 00 00 02 6F F3 + 39 00 00 00 00 00 02 6E F3 + 39 00 00 00 00 00 02 6D F2 + 39 00 00 00 00 00 02 6C F2 + 39 00 00 00 00 00 02 6B F1 + 39 00 00 00 00 00 02 6A F0 + 39 00 00 00 00 00 02 69 F0 + 39 00 00 00 00 00 02 68 EF + 39 00 00 00 00 00 02 67 EE + 39 00 00 00 00 00 02 66 EE + 39 00 00 00 00 00 02 65 EE + 39 00 00 00 00 00 02 64 EE + 39 00 00 00 00 00 02 63 EE + 39 00 00 00 00 00 02 62 EE + 39 00 00 00 00 00 02 61 EE + 39 00 00 00 00 00 02 60 EE + 39 00 00 00 00 00 02 5F EE + 39 00 00 00 00 00 02 5E ED + 39 00 00 00 00 00 02 5D ED + 39 00 00 00 00 00 02 5C ED + 39 00 00 00 00 00 02 5B EC + 39 00 00 00 00 00 02 5A EC + 39 00 00 00 00 00 02 59 EB + 39 00 00 00 00 00 02 58 EB + 39 00 00 00 00 00 02 57 EA + 39 00 00 00 00 00 02 56 EA + 39 00 00 00 00 00 02 55 E9 + 39 00 00 00 00 00 02 54 E9 + 39 00 00 00 00 00 02 53 E8 + 39 00 00 00 00 00 02 52 E7 + 39 00 00 00 00 00 02 51 E7 + 39 00 00 00 00 00 02 50 E6 + 39 00 00 00 00 00 02 4F E5 + 39 00 00 00 00 00 02 4E E4 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4C E2 + 39 00 00 00 00 00 02 4B E2 + 39 00 00 00 00 00 02 4A E1 + 39 00 00 00 00 00 02 49 E0 + 39 00 00 00 00 00 02 48 DF + 39 00 00 00 00 00 02 47 DE + 39 00 00 00 00 00 02 46 DD + 39 00 00 00 00 00 02 45 DD + 39 00 00 00 00 00 02 44 DD + 39 00 00 00 00 00 02 43 DD + 39 00 00 00 00 00 02 42 DD + 39 00 00 00 00 00 02 41 DD + 39 00 00 00 00 00 02 40 DC + 39 00 00 00 00 00 02 3F DC + 39 00 00 00 00 00 02 3E DC + 39 00 00 00 00 00 02 3D DC + 39 00 00 00 00 00 02 3C DC + 39 00 00 00 00 00 02 3B DC + 39 00 00 00 00 00 02 3A DB + 39 00 00 00 00 00 02 39 DA + 39 00 00 00 00 00 02 38 DA + 39 00 00 00 00 00 02 37 DA + 39 00 00 00 00 00 02 36 D9 + 39 00 00 00 00 00 02 35 D9 + 39 00 00 00 00 00 02 34 D8 + 39 00 00 00 00 00 02 33 D8 + 39 00 00 00 00 00 02 32 D8 + 39 00 00 00 00 00 02 31 D7 + 39 00 00 00 00 00 02 30 D6 + 39 00 00 00 00 00 02 2F D6 + 39 00 00 00 00 00 02 2E D5 + 39 00 00 00 00 00 02 2D D5 + 39 00 00 00 00 00 02 2C D4 + 39 00 00 00 00 00 02 2B D4 + 39 00 00 00 00 00 02 2A D3 + 39 00 00 00 00 00 02 29 D2 + 39 00 00 00 00 00 02 28 D1 + 39 00 00 00 00 00 02 27 D1 + 39 00 00 00 00 00 02 26 D0 + 39 00 00 00 00 00 02 25 CF + 39 00 00 00 00 00 02 24 CE + 39 00 00 00 00 00 02 23 CE + 39 00 00 00 00 00 02 22 CE + 39 00 00 00 00 00 02 21 CD + 39 00 00 00 00 00 02 20 CD + 39 00 00 00 00 00 02 1F CD + 39 00 00 00 00 00 02 1E CD + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1C CC + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1A CB + 39 00 00 00 00 00 02 19 CA + 39 00 00 00 00 00 02 18 CA + 39 00 00 00 00 00 02 17 C9 + 39 00 00 00 00 00 02 16 C9 + 39 00 00 00 00 00 02 15 C8 + 39 00 00 00 00 00 02 14 C8 + 39 00 00 00 00 00 02 13 C8 + 39 00 00 00 00 00 02 12 C7 + 39 00 00 00 00 00 02 11 C6 + 39 00 00 00 00 00 02 10 C6 + 39 00 00 00 00 00 02 0F C5 + 39 00 00 00 00 00 02 0E C4 + 39 00 00 00 00 00 02 0D C4 + 39 00 00 00 00 00 02 0C C3 + 39 00 00 00 00 00 02 0B C3 + 39 00 00 00 00 00 02 0A C2 + 39 00 00 00 00 00 02 09 C1 + 39 00 00 00 00 00 02 08 C1 + 39 00 00 00 00 00 02 07 C0 + 39 00 00 00 00 00 02 06 BF + 39 00 00 00 00 00 02 05 BF + 39 00 00 00 00 00 02 04 BE + 39 00 00 00 00 00 02 03 BD + 39 00 00 00 00 00 02 02 BD + 39 00 00 00 00 00 02 01 BB + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 84 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F bb + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 bb + 39 00 00 00 00 00 02 7F fa + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 12 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 11 + 39 00 00 00 00 00 02 7F ee + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 12 + 39 00 00 00 00 00 02 7E 12 + 39 00 00 00 00 00 02 7D 13 + 39 00 00 00 00 00 02 7C 14 + 39 00 00 00 00 00 02 7B 15 + 39 00 00 00 00 00 02 7A 16 + 39 00 00 00 00 00 02 79 17 + 39 00 00 00 00 00 02 78 18 + 39 00 00 00 00 00 02 77 18 + 39 00 00 00 00 00 02 76 19 + 39 00 00 00 00 00 02 75 1A + 39 00 00 00 00 00 02 74 1B + 39 00 00 00 00 00 02 73 1C + 39 00 00 00 00 00 02 72 1C + 39 00 00 00 00 00 02 71 1D + 39 00 00 00 00 00 02 70 1E + 39 00 00 00 00 00 02 6F 1F + 39 00 00 00 00 00 02 6E 1F + 39 00 00 00 00 00 02 6D 20 + 39 00 00 00 00 00 02 6C 21 + 39 00 00 00 00 00 02 6B 21 + 39 00 00 00 00 00 02 6A 22 + 39 00 00 00 00 00 02 69 23 + 39 00 00 00 00 00 02 68 24 + 39 00 00 00 00 00 02 67 25 + 39 00 00 00 00 00 02 66 26 + 39 00 00 00 00 00 02 65 28 + 39 00 00 00 00 00 02 64 29 + 39 00 00 00 00 00 02 63 2A + 39 00 00 00 00 00 02 62 2A + 39 00 00 00 00 00 02 61 2C + 39 00 00 00 00 00 02 60 2D + 39 00 00 00 00 00 02 5F 2E + 39 00 00 00 00 00 02 5E 2F + 39 00 00 00 00 00 02 5D 30 + 39 00 00 00 00 00 02 5C 32 + 39 00 00 00 00 00 02 5B 33 + 39 00 00 00 00 00 02 5A 34 + 39 00 00 00 00 00 02 59 35 + 39 00 00 00 00 00 02 58 36 + 39 00 00 00 00 00 02 57 37 + 39 00 00 00 00 00 02 56 38 + 39 00 00 00 00 00 02 55 39 + 39 00 00 00 00 00 02 54 3A + 39 00 00 00 00 00 02 53 3B + 39 00 00 00 00 00 02 52 3B + 39 00 00 00 00 00 02 51 3C + 39 00 00 00 00 00 02 50 3D + 39 00 00 00 00 00 02 4F 3E + 39 00 00 00 00 00 02 4E 3F + 39 00 00 00 00 00 02 4D 40 + 39 00 00 00 00 00 02 4C 41 + 39 00 00 00 00 00 02 4B 42 + 39 00 00 00 00 00 02 4A 43 + 39 00 00 00 00 00 02 49 44 + 39 00 00 00 00 00 02 48 44 + 39 00 00 00 00 00 02 47 44 + 39 00 00 00 00 00 02 46 44 + 39 00 00 00 00 00 02 45 44 + 39 00 00 00 00 00 02 44 45 + 39 00 00 00 00 00 02 43 46 + 39 00 00 00 00 00 02 42 47 + 39 00 00 00 00 00 02 41 48 + 39 00 00 00 00 00 02 40 49 + 39 00 00 00 00 00 02 3F 4A + 39 00 00 00 00 00 02 3E 4C + 39 00 00 00 00 00 02 3D 4D + 39 00 00 00 00 00 02 3C 4E + 39 00 00 00 00 00 02 3B 4F + 39 00 00 00 00 00 02 3A 50 + 39 00 00 00 00 00 02 39 51 + 39 00 00 00 00 00 02 38 52 + 39 00 00 00 00 00 02 37 53 + 39 00 00 00 00 00 02 36 54 + 39 00 00 00 00 00 02 35 55 + 39 00 00 00 00 00 02 34 56 + 39 00 00 00 00 00 02 33 57 + 39 00 00 00 00 00 02 32 59 + 39 00 00 00 00 00 02 31 5A + 39 00 00 00 00 00 02 30 5A + 39 00 00 00 00 00 02 2F 59 + 39 00 00 00 00 00 02 2E 58 + 39 00 00 00 00 00 02 2D 59 + 39 00 00 00 00 00 02 2C 5A + 39 00 00 00 00 00 02 2B 5B + 39 00 00 00 00 00 02 2A 5D + 39 00 00 00 00 00 02 29 5E + 39 00 00 00 00 00 02 28 5F + 39 00 00 00 00 00 02 27 60 + 39 00 00 00 00 00 02 26 60 + 39 00 00 00 00 00 02 25 61 + 39 00 00 00 00 00 02 24 61 + 39 00 00 00 00 00 02 23 62 + 39 00 00 00 00 00 02 22 63 + 39 00 00 00 00 00 02 21 63 + 39 00 00 00 00 00 02 20 64 + 39 00 00 00 00 00 02 1F 9B + 39 00 00 00 00 00 02 1E 9B + 39 00 00 00 00 00 02 1D 9A + 39 00 00 00 00 00 02 1C 99 + 39 00 00 00 00 00 02 1B 98 + 39 00 00 00 00 00 02 1A 97 + 39 00 00 00 00 00 02 19 96 + 39 00 00 00 00 00 02 18 95 + 39 00 00 00 00 00 02 17 94 + 39 00 00 00 00 00 02 16 93 + 39 00 00 00 00 00 02 15 93 + 39 00 00 00 00 00 02 14 92 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 12 90 + 39 00 00 00 00 00 02 11 8F + 39 00 00 00 00 00 02 10 8E + 39 00 00 00 00 00 02 0F 8D + 39 00 00 00 00 00 02 0E 8C + 39 00 00 00 00 00 02 0D 8B + 39 00 00 00 00 00 02 0C 8A + 39 00 00 00 00 00 02 0B 89 + 39 00 00 00 00 00 02 0A 89 + 39 00 00 00 00 00 02 09 88 + 39 00 00 00 00 00 02 08 87 + 39 00 00 00 00 00 02 07 86 + 39 00 00 00 00 00 02 06 85 + 39 00 00 00 00 00 02 05 85 + 39 00 00 00 00 00 02 04 85 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 75 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 66 05 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F BB + 39 00 00 00 00 00 02 7E BA + 39 00 00 00 00 00 02 7D BA + 39 00 00 00 00 00 02 7C B9 + 39 00 00 00 00 00 02 7B B9 + 39 00 00 00 00 00 02 7A B8 + 39 00 00 00 00 00 02 79 B8 + 39 00 00 00 00 00 02 78 B8 + 39 00 00 00 00 00 02 77 B7 + 39 00 00 00 00 00 02 76 B7 + 39 00 00 00 00 00 02 75 B6 + 39 00 00 00 00 00 02 74 B6 + 39 00 00 00 00 00 02 73 B6 + 39 00 00 00 00 00 02 72 B5 + 39 00 00 00 00 00 02 71 B5 + 39 00 00 00 00 00 02 70 B4 + 39 00 00 00 00 00 02 6F B4 + 39 00 00 00 00 00 02 6E B3 + 39 00 00 00 00 00 02 6D B3 + 39 00 00 00 00 00 02 6C B2 + 39 00 00 00 00 00 02 6B B2 + 39 00 00 00 00 00 02 6A B2 + 39 00 00 00 00 00 02 69 B1 + 39 00 00 00 00 00 02 68 B1 + 39 00 00 00 00 00 02 67 B1 + 39 00 00 00 00 00 02 66 B0 + 39 00 00 00 00 00 02 65 B0 + 39 00 00 00 00 00 02 64 B0 + 39 00 00 00 00 00 02 63 AF + 39 00 00 00 00 00 02 62 AF + 39 00 00 00 00 00 02 61 AF + 39 00 00 00 00 00 02 60 AF + 39 00 00 00 00 00 02 5F AE + 39 00 00 00 00 00 02 5E AE + 39 00 00 00 00 00 02 5D AE + 39 00 00 00 00 00 02 5C AD + 39 00 00 00 00 00 02 5B AD + 39 00 00 00 00 00 02 5A AC + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 58 AA + 39 00 00 00 00 00 02 57 AA + 39 00 00 00 00 00 02 56 A9 + 39 00 00 00 00 00 02 55 A8 + 39 00 00 00 00 00 02 54 A7 + 39 00 00 00 00 00 02 53 A6 + 39 00 00 00 00 00 02 52 A5 + 39 00 00 00 00 00 02 51 A5 + 39 00 00 00 00 00 02 50 A4 + 39 00 00 00 00 00 02 4F A3 + 39 00 00 00 00 00 02 4E A3 + 39 00 00 00 00 00 02 4D A2 + 39 00 00 00 00 00 02 4C A2 + 39 00 00 00 00 00 02 4B A1 + 39 00 00 00 00 00 02 4A A0 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 48 9F + 39 00 00 00 00 00 02 47 9F + 39 00 00 00 00 00 02 46 9F + 39 00 00 00 00 00 02 45 9E + 39 00 00 00 00 00 02 44 9E + 39 00 00 00 00 00 02 43 9D + 39 00 00 00 00 00 02 42 9D + 39 00 00 00 00 00 02 41 9C + 39 00 00 00 00 00 02 40 9C + 39 00 00 00 00 00 02 3F 9D + 39 00 00 00 00 00 02 3E 9D + 39 00 00 00 00 00 02 3D 9D + 39 00 00 00 00 00 02 3C 9D + 39 00 00 00 00 00 02 3B 9C + 39 00 00 00 00 00 02 3A 9B + 39 00 00 00 00 00 02 39 9A + 39 00 00 00 00 00 02 38 9A + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 36 98 + 39 00 00 00 00 00 02 35 97 + 39 00 00 00 00 00 02 34 97 + 39 00 00 00 00 00 02 33 96 + 39 00 00 00 00 00 02 32 95 + 39 00 00 00 00 00 02 31 95 + 39 00 00 00 00 00 02 30 94 + 39 00 00 00 00 00 02 2F 93 + 39 00 00 00 00 00 02 2E 93 + 39 00 00 00 00 00 02 2D 92 + 39 00 00 00 00 00 02 2C 91 + 39 00 00 00 00 00 02 2B 90 + 39 00 00 00 00 00 02 2A 92 + 39 00 00 00 00 00 02 29 93 + 39 00 00 00 00 00 02 28 93 + 39 00 00 00 00 00 02 27 92 + 39 00 00 00 00 00 02 26 91 + 39 00 00 00 00 00 02 25 91 + 39 00 00 00 00 00 02 24 90 + 39 00 00 00 00 00 02 23 8F + 39 00 00 00 00 00 02 22 8F + 39 00 00 00 00 00 02 21 8F + 39 00 00 00 00 00 02 20 8F + 39 00 00 00 00 00 02 1F 8E + 39 00 00 00 00 00 02 1E 8E + 39 00 00 00 00 00 02 1D 8E + 39 00 00 00 00 00 02 1C 8E + 39 00 00 00 00 00 02 1B 8D + 39 00 00 00 00 00 02 1A 8D + 39 00 00 00 00 00 02 19 8C + 39 00 00 00 00 00 02 18 8C + 39 00 00 00 00 00 02 17 8B + 39 00 00 00 00 00 02 16 8A + 39 00 00 00 00 00 02 15 8A + 39 00 00 00 00 00 02 14 8A + 39 00 00 00 00 00 02 13 89 + 39 00 00 00 00 00 02 12 89 + 39 00 00 00 00 00 02 11 88 + 39 00 00 00 00 00 02 10 88 + 39 00 00 00 00 00 02 0F 87 + 39 00 00 00 00 00 02 0E 87 + 39 00 00 00 00 00 02 0D 86 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0B 85 + 39 00 00 00 00 00 02 0A 84 + 39 00 00 00 00 00 02 09 84 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + + ]; + + + qcom,mdss-dsi-panel-eye-command06 = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 03 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 04 + 39 00 00 00 00 00 02 1C 04 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 24 06 + 39 00 00 00 00 00 02 25 08 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 27 07 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 2B 06 + 39 00 00 00 00 00 02 2C 06 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2F 05 + 39 00 00 00 00 00 02 30 05 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 37 06 + 39 00 00 00 00 00 02 38 07 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3D 06 + 39 00 00 00 00 00 02 3E 06 + 39 00 00 00 00 00 02 3F 06 + 39 00 00 00 00 00 02 40 06 + 39 00 00 00 00 00 02 41 06 + 39 00 00 00 00 00 02 42 06 + 39 00 00 00 00 00 02 43 06 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 45 05 + 39 00 00 00 00 00 02 46 05 + 39 00 00 00 00 00 02 47 05 + 39 00 00 00 00 00 02 48 05 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 4A 04 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 03 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 02 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 02 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 02 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 02 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 03 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 03 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 03 + 39 00 00 00 00 00 02 5C 03 + 39 00 00 00 00 00 02 5D 03 + 39 00 00 00 00 00 02 5E 03 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 60 03 + 39 00 00 00 00 00 02 61 03 + 39 00 00 00 00 00 02 62 03 + 39 00 00 00 00 00 02 63 03 + 39 00 00 00 00 00 02 64 03 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 03 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6E 03 + 39 00 00 00 00 00 02 6F 03 + 39 00 00 00 00 00 02 70 03 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 73 02 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 76 01 + 39 00 00 00 00 00 02 77 00 + 39 00 00 00 00 00 02 78 00 + 39 00 00 00 00 00 02 79 00 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7F 81 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 04 84 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 07 84 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 0A 86 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0D 88 + 39 00 00 00 00 00 02 0E 89 + 39 00 00 00 00 00 02 0F 8A + 39 00 00 00 00 00 02 10 8A + 39 00 00 00 00 00 02 11 8B + 39 00 00 00 00 00 02 12 8C + 39 00 00 00 00 00 02 13 8D + 39 00 00 00 00 00 02 14 8D + 39 00 00 00 00 00 02 15 8E + 39 00 00 00 00 00 02 16 8E + 39 00 00 00 00 00 02 17 8F + 39 00 00 00 00 00 02 18 90 + 39 00 00 00 00 00 02 19 90 + 39 00 00 00 00 00 02 1A 91 + 39 00 00 00 00 00 02 1B 92 + 39 00 00 00 00 00 02 1C 93 + 39 00 00 00 00 00 02 1D 93 + 39 00 00 00 00 00 02 1E 94 + 39 00 00 00 00 00 02 1F 94 + 39 00 00 00 00 00 02 20 95 + 39 00 00 00 00 00 02 21 95 + 39 00 00 00 00 00 02 22 95 + 39 00 00 00 00 00 02 23 96 + 39 00 00 00 00 00 02 24 96 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 26 97 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 28 99 + 39 00 00 00 00 00 02 29 9A + 39 00 00 00 00 00 02 2A 9B + 39 00 00 00 00 00 02 2B 9C + 39 00 00 00 00 00 02 2C 9B + 39 00 00 00 00 00 02 2D 99 + 39 00 00 00 00 00 02 2E 9A + 39 00 00 00 00 00 02 2F 9B + 39 00 00 00 00 00 02 30 9C + 39 00 00 00 00 00 02 31 9D + 39 00 00 00 00 00 02 32 9E + 39 00 00 00 00 00 02 33 9F + 39 00 00 00 00 00 02 34 9F + 39 00 00 00 00 00 02 35 A0 + 39 00 00 00 00 00 02 36 A1 + 39 00 00 00 00 00 02 37 A2 + 39 00 00 00 00 00 02 38 A3 + 39 00 00 00 00 00 02 39 A3 + 39 00 00 00 00 00 02 3A A4 + 39 00 00 00 00 00 02 3B A5 + 39 00 00 00 00 00 02 3C A6 + 39 00 00 00 00 00 02 3D A7 + 39 00 00 00 00 00 02 3E A9 + 39 00 00 00 00 00 02 3F A9 + 39 00 00 00 00 00 02 40 A9 + 39 00 00 00 00 00 02 41 AA + 39 00 00 00 00 00 02 42 AA + 39 00 00 00 00 00 02 43 A9 + 39 00 00 00 00 00 02 44 A9 + 39 00 00 00 00 00 02 45 AA + 39 00 00 00 00 00 02 46 AB + 39 00 00 00 00 00 02 47 AC + 39 00 00 00 00 00 02 48 AC + 39 00 00 00 00 00 02 49 AD + 39 00 00 00 00 00 02 4A AE + 39 00 00 00 00 00 02 4B AE + 39 00 00 00 00 00 02 4C AF + 39 00 00 00 00 00 02 4D AF + 39 00 00 00 00 00 02 4E B0 + 39 00 00 00 00 00 02 4F B1 + 39 00 00 00 00 00 02 50 B2 + 39 00 00 00 00 00 02 51 B2 + 39 00 00 00 00 00 02 52 B3 + 39 00 00 00 00 00 02 53 B4 + 39 00 00 00 00 00 02 54 B5 + 39 00 00 00 00 00 02 55 B5 + 39 00 00 00 00 00 02 56 B6 + 39 00 00 00 00 00 02 57 B7 + 39 00 00 00 00 00 02 58 B8 + 39 00 00 00 00 00 02 59 B9 + 39 00 00 00 00 00 02 5A BA + 39 00 00 00 00 00 02 5B BB + 39 00 00 00 00 00 02 5C BC + 39 00 00 00 00 00 02 5D BD + 39 00 00 00 00 00 02 5E BE + 39 00 00 00 00 00 02 5F BF + 39 00 00 00 00 00 02 60 C0 + 39 00 00 00 00 00 02 61 C1 + 39 00 00 00 00 00 02 62 C1 + 39 00 00 00 00 00 02 63 C2 + 39 00 00 00 00 00 02 64 C2 + 39 00 00 00 00 00 02 65 C3 + 39 00 00 00 00 00 02 66 C3 + 39 00 00 00 00 00 02 67 C3 + 39 00 00 00 00 00 02 68 C4 + 39 00 00 00 00 00 02 69 C4 + 39 00 00 00 00 00 02 6A C5 + 39 00 00 00 00 00 02 6B C5 + 39 00 00 00 00 00 02 6C C6 + 39 00 00 00 00 00 02 6D C7 + 39 00 00 00 00 00 02 6E C7 + 39 00 00 00 00 00 02 6F C8 + 39 00 00 00 00 00 02 70 C8 + 39 00 00 00 00 00 02 71 C9 + 39 00 00 00 00 00 02 72 C9 + 39 00 00 00 00 00 02 73 CA + 39 00 00 00 00 00 02 74 CA + 39 00 00 00 00 00 02 75 CB + 39 00 00 00 00 00 02 76 CC + 39 00 00 00 00 00 02 77 CC + 39 00 00 00 00 00 02 78 CD + 39 00 00 00 00 00 02 79 CD + 39 00 00 00 00 00 02 7A CE + 39 00 00 00 00 00 02 7B CE + 39 00 00 00 00 00 02 7C CF + 39 00 00 00 00 00 02 7D D0 + 39 00 00 00 00 00 02 7E D1 + 39 00 00 00 00 00 02 7F D1 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 03 86 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 06 87 + 39 00 00 00 00 00 02 07 87 + 39 00 00 00 00 00 02 08 88 + 39 00 00 00 00 00 02 09 89 + 39 00 00 00 00 00 02 0A 8B + 39 00 00 00 00 00 02 0B 8C + 39 00 00 00 00 00 02 0C 8D + 39 00 00 00 00 00 02 0D 8E + 39 00 00 00 00 00 02 0E 8F + 39 00 00 00 00 00 02 0F 90 + 39 00 00 00 00 00 02 10 92 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 12 94 + 39 00 00 00 00 00 02 13 95 + 39 00 00 00 00 00 02 14 96 + 39 00 00 00 00 00 02 15 97 + 39 00 00 00 00 00 02 16 99 + 39 00 00 00 00 00 02 17 99 + 39 00 00 00 00 00 02 18 9A + 39 00 00 00 00 00 02 19 9B + 39 00 00 00 00 00 02 1A 9C + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1C 9F + 39 00 00 00 00 00 02 1D A0 + 39 00 00 00 00 00 02 1E A1 + 39 00 00 00 00 00 02 1F A2 + 39 00 00 00 00 00 02 20 5D + 39 00 00 00 00 00 02 21 5B + 39 00 00 00 00 00 02 22 5B + 39 00 00 00 00 00 02 23 5A + 39 00 00 00 00 00 02 24 59 + 39 00 00 00 00 00 02 25 58 + 39 00 00 00 00 00 02 26 57 + 39 00 00 00 00 00 02 27 56 + 39 00 00 00 00 00 02 28 55 + 39 00 00 00 00 00 02 29 54 + 39 00 00 00 00 00 02 2A 54 + 39 00 00 00 00 00 02 2B 52 + 39 00 00 00 00 00 02 2C 51 + 39 00 00 00 00 00 02 2D 50 + 39 00 00 00 00 00 02 2E 4F + 39 00 00 00 00 00 02 2F 4D + 39 00 00 00 00 00 02 30 4C + 39 00 00 00 00 00 02 31 4B + 39 00 00 00 00 00 02 32 4A + 39 00 00 00 00 00 02 33 4B + 39 00 00 00 00 00 02 34 4C + 39 00 00 00 00 00 02 35 4B + 39 00 00 00 00 00 02 36 49 + 39 00 00 00 00 00 02 37 48 + 39 00 00 00 00 00 02 38 46 + 39 00 00 00 00 00 02 39 45 + 39 00 00 00 00 00 02 3A 43 + 39 00 00 00 00 00 02 3B 42 + 39 00 00 00 00 00 02 3C 41 + 39 00 00 00 00 00 02 3D 40 + 39 00 00 00 00 00 02 3E 3F + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 3C + 39 00 00 00 00 00 02 41 3B + 39 00 00 00 00 00 02 42 3A + 39 00 00 00 00 00 02 43 38 + 39 00 00 00 00 00 02 44 37 + 39 00 00 00 00 00 02 45 36 + 39 00 00 00 00 00 02 46 34 + 39 00 00 00 00 00 02 47 33 + 39 00 00 00 00 00 02 48 31 + 39 00 00 00 00 00 02 49 30 + 39 00 00 00 00 00 02 4A 30 + 39 00 00 00 00 00 02 4B 2F + 39 00 00 00 00 00 02 4C 2E + 39 00 00 00 00 00 02 4D 2E + 39 00 00 00 00 00 02 4E 2E + 39 00 00 00 00 00 02 4F 2D + 39 00 00 00 00 00 02 50 2C + 39 00 00 00 00 00 02 51 2A + 39 00 00 00 00 00 02 52 29 + 39 00 00 00 00 00 02 53 28 + 39 00 00 00 00 00 02 54 27 + 39 00 00 00 00 00 02 55 26 + 39 00 00 00 00 00 02 56 25 + 39 00 00 00 00 00 02 57 24 + 39 00 00 00 00 00 02 58 23 + 39 00 00 00 00 00 02 59 22 + 39 00 00 00 00 00 02 5A 20 + 39 00 00 00 00 00 02 5B 1F + 39 00 00 00 00 00 02 5C 1E + 39 00 00 00 00 00 02 5D 1D + 39 00 00 00 00 00 02 5E 1C + 39 00 00 00 00 00 02 5F 1A + 39 00 00 00 00 00 02 60 19 + 39 00 00 00 00 00 02 61 18 + 39 00 00 00 00 00 02 62 17 + 39 00 00 00 00 00 02 63 15 + 39 00 00 00 00 00 02 64 14 + 39 00 00 00 00 00 02 65 13 + 39 00 00 00 00 00 02 66 11 + 39 00 00 00 00 00 02 67 10 + 39 00 00 00 00 00 02 68 0F + 39 00 00 00 00 00 02 69 0D + 39 00 00 00 00 00 02 6A 0C + 39 00 00 00 00 00 02 6B 0B + 39 00 00 00 00 00 02 6C 0A + 39 00 00 00 00 00 02 6D 08 + 39 00 00 00 00 00 02 6E 07 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 75 81 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 77 83 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 7A 86 + 39 00 00 00 00 00 02 7B 87 + 39 00 00 00 00 00 02 7C 88 + 39 00 00 00 00 00 02 7D 89 + 39 00 00 00 00 00 02 7E 8A + 39 00 00 00 00 00 02 7F 8B + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 83 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 84 + 39 00 00 00 00 00 02 15 84 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 85 + 39 00 00 00 00 00 02 19 85 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 1B 86 + 39 00 00 00 00 00 02 1C 86 + 39 00 00 00 00 00 02 1D 86 + 39 00 00 00 00 00 02 1E 86 + 39 00 00 00 00 00 02 1F 86 + 39 00 00 00 00 00 02 20 86 + 39 00 00 00 00 00 02 21 86 + 39 00 00 00 00 00 02 22 86 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 25 86 + 39 00 00 00 00 00 02 26 87 + 39 00 00 00 00 00 02 27 86 + 39 00 00 00 00 00 02 28 86 + 39 00 00 00 00 00 02 29 86 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2F 84 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 31 85 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 33 86 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 35 87 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 38 88 + 39 00 00 00 00 00 02 39 89 + 39 00 00 00 00 00 02 3A 89 + 39 00 00 00 00 00 02 3B 89 + 39 00 00 00 00 00 02 3C 8A + 39 00 00 00 00 00 02 3D 8A + 39 00 00 00 00 00 02 3E 8A + 39 00 00 00 00 00 02 3F 8A + 39 00 00 00 00 00 02 40 8A + 39 00 00 00 00 00 02 41 8A + 39 00 00 00 00 00 02 42 8A + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 44 8A + 39 00 00 00 00 00 02 45 8A + 39 00 00 00 00 00 02 46 8A + 39 00 00 00 00 00 02 47 8A + 39 00 00 00 00 00 02 48 8A + 39 00 00 00 00 00 02 49 89 + 39 00 00 00 00 00 02 4A 89 + 39 00 00 00 00 00 02 4B 88 + 39 00 00 00 00 00 02 4C 88 + 39 00 00 00 00 00 02 4D 88 + 39 00 00 00 00 00 02 4E 88 + 39 00 00 00 00 00 02 4F 88 + 39 00 00 00 00 00 02 50 89 + 39 00 00 00 00 00 02 51 89 + 39 00 00 00 00 00 02 52 89 + 39 00 00 00 00 00 02 53 89 + 39 00 00 00 00 00 02 54 8A + 39 00 00 00 00 00 02 55 8A + 39 00 00 00 00 00 02 56 8A + 39 00 00 00 00 00 02 57 8A + 39 00 00 00 00 00 02 58 89 + 39 00 00 00 00 00 02 59 89 + 39 00 00 00 00 00 02 5A 89 + 39 00 00 00 00 00 02 5B 88 + 39 00 00 00 00 00 02 5C 88 + 39 00 00 00 00 00 02 5D 88 + 39 00 00 00 00 00 02 5E 88 + 39 00 00 00 00 00 02 5F 88 + 39 00 00 00 00 00 02 60 89 + 39 00 00 00 00 00 02 61 89 + 39 00 00 00 00 00 02 62 89 + 39 00 00 00 00 00 02 63 89 + 39 00 00 00 00 00 02 64 89 + 39 00 00 00 00 00 02 65 89 + 39 00 00 00 00 00 02 66 89 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 68 88 + 39 00 00 00 00 00 02 69 88 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 6B 89 + 39 00 00 00 00 00 02 6C 89 + 39 00 00 00 00 00 02 6D 89 + 39 00 00 00 00 00 02 6E 89 + 39 00 00 00 00 00 02 6F 89 + 39 00 00 00 00 00 02 70 89 + 39 00 00 00 00 00 02 71 89 + 39 00 00 00 00 00 02 72 89 + 39 00 00 00 00 00 02 73 89 + 39 00 00 00 00 00 02 74 89 + 39 00 00 00 00 00 02 75 88 + 39 00 00 00 00 00 02 76 88 + 39 00 00 00 00 00 02 77 88 + 39 00 00 00 00 00 02 78 88 + 39 00 00 00 00 00 02 79 87 + 39 00 00 00 00 00 02 7A 88 + 39 00 00 00 00 00 02 7B 88 + 39 00 00 00 00 00 02 7C 87 + 39 00 00 00 00 00 02 7D 87 + 39 00 00 00 00 00 02 7E 88 + 39 00 00 00 00 00 02 7F 89 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 D2 + 39 00 00 00 00 00 02 02 D3 + 39 00 00 00 00 00 02 03 D3 + 39 00 00 00 00 00 02 04 D4 + 39 00 00 00 00 00 02 05 D5 + 39 00 00 00 00 00 02 06 D5 + 39 00 00 00 00 00 02 07 D6 + 39 00 00 00 00 00 02 08 D7 + 39 00 00 00 00 00 02 09 D8 + 39 00 00 00 00 00 02 0A D9 + 39 00 00 00 00 00 02 0B DA + 39 00 00 00 00 00 02 0C DA + 39 00 00 00 00 00 02 0D DB + 39 00 00 00 00 00 02 0E DC + 39 00 00 00 00 00 02 0F DD + 39 00 00 00 00 00 02 10 DE + 39 00 00 00 00 00 02 11 DE + 39 00 00 00 00 00 02 12 DF + 39 00 00 00 00 00 02 13 E0 + 39 00 00 00 00 00 02 14 E1 + 39 00 00 00 00 00 02 15 E2 + 39 00 00 00 00 00 02 16 E2 + 39 00 00 00 00 00 02 17 E3 + 39 00 00 00 00 00 02 18 E4 + 39 00 00 00 00 00 02 19 E5 + 39 00 00 00 00 00 02 1A E6 + 39 00 00 00 00 00 02 1B E6 + 39 00 00 00 00 00 02 1C E7 + 39 00 00 00 00 00 02 1D E8 + 39 00 00 00 00 00 02 1E E8 + 39 00 00 00 00 00 02 1F E9 + 39 00 00 00 00 00 02 20 E9 + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 22 EB + 39 00 00 00 00 00 02 23 EB + 39 00 00 00 00 00 02 24 EC + 39 00 00 00 00 00 02 25 ED + 39 00 00 00 00 00 02 26 ED + 39 00 00 00 00 00 02 27 EE + 39 00 00 00 00 00 02 28 EE + 39 00 00 00 00 00 02 29 EF + 39 00 00 00 00 00 02 2A EF + 39 00 00 00 00 00 02 2B F0 + 39 00 00 00 00 00 02 2C F0 + 39 00 00 00 00 00 02 2D F1 + 39 00 00 00 00 00 02 2E F2 + 39 00 00 00 00 00 02 2F F3 + 39 00 00 00 00 00 02 30 F4 + 39 00 00 00 00 00 02 31 F5 + 39 00 00 00 00 00 02 32 F5 + 39 00 00 00 00 00 02 33 F6 + 39 00 00 00 00 00 02 34 F7 + 39 00 00 00 00 00 02 35 F8 + 39 00 00 00 00 00 02 36 F9 + 39 00 00 00 00 00 02 37 F9 + 39 00 00 00 00 00 02 38 FA + 39 00 00 00 00 00 02 39 FB + 39 00 00 00 00 00 02 3A FC + 39 00 00 00 00 00 02 3B FC + 39 00 00 00 00 00 02 3C FD + 39 00 00 00 00 00 02 3D FE + 39 00 00 00 00 00 02 3E FE + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7F FF + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 73 + 39 00 00 00 00 00 02 02 72 + 39 00 00 00 00 00 02 03 71 + 39 00 00 00 00 00 02 04 70 + 39 00 00 00 00 00 02 05 6F + 39 00 00 00 00 00 02 06 6E + 39 00 00 00 00 00 02 07 6D + 39 00 00 00 00 00 02 08 6C + 39 00 00 00 00 00 02 09 6B + 39 00 00 00 00 00 02 0A 69 + 39 00 00 00 00 00 02 0B 68 + 39 00 00 00 00 00 02 0C 67 + 39 00 00 00 00 00 02 0D 66 + 39 00 00 00 00 00 02 0E 65 + 39 00 00 00 00 00 02 0F 64 + 39 00 00 00 00 00 02 10 63 + 39 00 00 00 00 00 02 11 62 + 39 00 00 00 00 00 02 12 61 + 39 00 00 00 00 00 02 13 60 + 39 00 00 00 00 00 02 14 5F + 39 00 00 00 00 00 02 15 5D + 39 00 00 00 00 00 02 16 5C + 39 00 00 00 00 00 02 17 5B + 39 00 00 00 00 00 02 18 5A + 39 00 00 00 00 00 02 19 59 + 39 00 00 00 00 00 02 1A 58 + 39 00 00 00 00 00 02 1B 57 + 39 00 00 00 00 00 02 1C 56 + 39 00 00 00 00 00 02 1D 55 + 39 00 00 00 00 00 02 1E 53 + 39 00 00 00 00 00 02 1F 51 + 39 00 00 00 00 00 02 20 50 + 39 00 00 00 00 00 02 21 4F + 39 00 00 00 00 00 02 22 4E + 39 00 00 00 00 00 02 23 4C + 39 00 00 00 00 00 02 24 4B + 39 00 00 00 00 00 02 25 49 + 39 00 00 00 00 00 02 26 48 + 39 00 00 00 00 00 02 27 47 + 39 00 00 00 00 00 02 28 46 + 39 00 00 00 00 00 02 29 45 + 39 00 00 00 00 00 02 2A 43 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 41 + 39 00 00 00 00 00 02 2D 40 + 39 00 00 00 00 00 02 2E 3E + 39 00 00 00 00 00 02 2F 3D + 39 00 00 00 00 00 02 30 3C + 39 00 00 00 00 00 02 31 3A + 39 00 00 00 00 00 02 32 39 + 39 00 00 00 00 00 02 33 38 + 39 00 00 00 00 00 02 34 37 + 39 00 00 00 00 00 02 35 36 + 39 00 00 00 00 00 02 36 35 + 39 00 00 00 00 00 02 37 34 + 39 00 00 00 00 00 02 38 32 + 39 00 00 00 00 00 02 39 31 + 39 00 00 00 00 00 02 3A 30 + 39 00 00 00 00 00 02 3B 2F + 39 00 00 00 00 00 02 3C 2E + 39 00 00 00 00 00 02 3D 2C + 39 00 00 00 00 00 02 3E 2B + 39 00 00 00 00 00 02 3F 2A + 39 00 00 00 00 00 02 40 29 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 42 27 + 39 00 00 00 00 00 02 43 26 + 39 00 00 00 00 00 02 44 25 + 39 00 00 00 00 00 02 45 24 + 39 00 00 00 00 00 02 46 23 + 39 00 00 00 00 00 02 47 22 + 39 00 00 00 00 00 02 48 21 + 39 00 00 00 00 00 02 49 1F + 39 00 00 00 00 00 02 4A 1E + 39 00 00 00 00 00 02 4B 1D + 39 00 00 00 00 00 02 4C 1B + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 19 + 39 00 00 00 00 00 02 4F 17 + 39 00 00 00 00 00 02 50 16 + 39 00 00 00 00 00 02 51 15 + 39 00 00 00 00 00 02 52 13 + 39 00 00 00 00 00 02 53 12 + 39 00 00 00 00 00 02 54 11 + 39 00 00 00 00 00 02 55 0F + 39 00 00 00 00 00 02 56 0E + 39 00 00 00 00 00 02 57 0D + 39 00 00 00 00 00 02 58 0C + 39 00 00 00 00 00 02 59 0B + 39 00 00 00 00 00 02 5A 09 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 02 5C 07 + 39 00 00 00 00 00 02 5D 06 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 60 02 + 39 00 00 00 00 00 02 61 01 + 39 00 00 00 00 00 02 62 00 + 39 00 00 00 00 00 02 63 81 + 39 00 00 00 00 00 02 64 82 + 39 00 00 00 00 00 02 65 84 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 68 86 + 39 00 00 00 00 00 02 69 87 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 6B 89 + 39 00 00 00 00 00 02 6C 8A + 39 00 00 00 00 00 02 6D 8B + 39 00 00 00 00 00 02 6E 8C + 39 00 00 00 00 00 02 6F 8D + 39 00 00 00 00 00 02 70 8E + 39 00 00 00 00 00 02 71 8F + 39 00 00 00 00 00 02 72 90 + 39 00 00 00 00 00 02 73 91 + 39 00 00 00 00 00 02 74 92 + 39 00 00 00 00 00 02 75 94 + 39 00 00 00 00 00 02 76 95 + 39 00 00 00 00 00 02 77 97 + 39 00 00 00 00 00 02 78 99 + 39 00 00 00 00 00 02 79 9A + 39 00 00 00 00 00 02 7A 9C + 39 00 00 00 00 00 02 7B 9D + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7D A0 + 39 00 00 00 00 00 02 7E A2 + 39 00 00 00 00 00 02 7F A3 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 82 + 39 00 00 00 00 00 02 7F 89 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F d1 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 d2 + 39 00 00 00 00 00 02 7F ff + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 8b + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 74 + 39 00 00 00 00 00 02 7F a3 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F A3 + 39 00 00 00 00 00 02 7E A2 + 39 00 00 00 00 00 02 7D A0 + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7B 9D + 39 00 00 00 00 00 02 7A 9C + 39 00 00 00 00 00 02 79 9A + 39 00 00 00 00 00 02 78 99 + 39 00 00 00 00 00 02 77 97 + 39 00 00 00 00 00 02 76 95 + 39 00 00 00 00 00 02 75 94 + 39 00 00 00 00 00 02 74 92 + 39 00 00 00 00 00 02 73 91 + 39 00 00 00 00 00 02 72 90 + 39 00 00 00 00 00 02 71 8F + 39 00 00 00 00 00 02 70 8E + 39 00 00 00 00 00 02 6F 8D + 39 00 00 00 00 00 02 6E 8C + 39 00 00 00 00 00 02 6D 8B + 39 00 00 00 00 00 02 6C 8A + 39 00 00 00 00 00 02 6B 89 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 69 87 + 39 00 00 00 00 00 02 68 86 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 65 84 + 39 00 00 00 00 00 02 64 82 + 39 00 00 00 00 00 02 63 81 + 39 00 00 00 00 00 02 62 00 + 39 00 00 00 00 00 02 61 01 + 39 00 00 00 00 00 02 60 02 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 06 + 39 00 00 00 00 00 02 5C 07 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 02 5A 09 + 39 00 00 00 00 00 02 59 0B + 39 00 00 00 00 00 02 58 0C + 39 00 00 00 00 00 02 57 0D + 39 00 00 00 00 00 02 56 0E + 39 00 00 00 00 00 02 55 0F + 39 00 00 00 00 00 02 54 11 + 39 00 00 00 00 00 02 53 12 + 39 00 00 00 00 00 02 52 13 + 39 00 00 00 00 00 02 51 15 + 39 00 00 00 00 00 02 50 16 + 39 00 00 00 00 00 02 4F 17 + 39 00 00 00 00 00 02 4E 19 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4C 1B + 39 00 00 00 00 00 02 4B 1D + 39 00 00 00 00 00 02 4A 1E + 39 00 00 00 00 00 02 49 1F + 39 00 00 00 00 00 02 48 21 + 39 00 00 00 00 00 02 47 22 + 39 00 00 00 00 00 02 46 23 + 39 00 00 00 00 00 02 45 24 + 39 00 00 00 00 00 02 44 25 + 39 00 00 00 00 00 02 43 26 + 39 00 00 00 00 00 02 42 27 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 40 29 + 39 00 00 00 00 00 02 3F 2A + 39 00 00 00 00 00 02 3E 2B + 39 00 00 00 00 00 02 3D 2C + 39 00 00 00 00 00 02 3C 2E + 39 00 00 00 00 00 02 3B 2F + 39 00 00 00 00 00 02 3A 30 + 39 00 00 00 00 00 02 39 31 + 39 00 00 00 00 00 02 38 32 + 39 00 00 00 00 00 02 37 34 + 39 00 00 00 00 00 02 36 35 + 39 00 00 00 00 00 02 35 36 + 39 00 00 00 00 00 02 34 37 + 39 00 00 00 00 00 02 33 38 + 39 00 00 00 00 00 02 32 39 + 39 00 00 00 00 00 02 31 3A + 39 00 00 00 00 00 02 30 3C + 39 00 00 00 00 00 02 2F 3D + 39 00 00 00 00 00 02 2E 3E + 39 00 00 00 00 00 02 2D 40 + 39 00 00 00 00 00 02 2C 41 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2A 43 + 39 00 00 00 00 00 02 29 45 + 39 00 00 00 00 00 02 28 46 + 39 00 00 00 00 00 02 27 47 + 39 00 00 00 00 00 02 26 48 + 39 00 00 00 00 00 02 25 49 + 39 00 00 00 00 00 02 24 4B + 39 00 00 00 00 00 02 23 4C + 39 00 00 00 00 00 02 22 4E + 39 00 00 00 00 00 02 21 4F + 39 00 00 00 00 00 02 20 50 + 39 00 00 00 00 00 02 1F 51 + 39 00 00 00 00 00 02 1E 53 + 39 00 00 00 00 00 02 1D 55 + 39 00 00 00 00 00 02 1C 56 + 39 00 00 00 00 00 02 1B 57 + 39 00 00 00 00 00 02 1A 58 + 39 00 00 00 00 00 02 19 59 + 39 00 00 00 00 00 02 18 5A + 39 00 00 00 00 00 02 17 5B + 39 00 00 00 00 00 02 16 5C + 39 00 00 00 00 00 02 15 5D + 39 00 00 00 00 00 02 14 5F + 39 00 00 00 00 00 02 13 60 + 39 00 00 00 00 00 02 12 61 + 39 00 00 00 00 00 02 11 62 + 39 00 00 00 00 00 02 10 63 + 39 00 00 00 00 00 02 0F 64 + 39 00 00 00 00 00 02 0E 65 + 39 00 00 00 00 00 02 0D 66 + 39 00 00 00 00 00 02 0C 67 + 39 00 00 00 00 00 02 0B 68 + 39 00 00 00 00 00 02 0A 69 + 39 00 00 00 00 00 02 09 6B + 39 00 00 00 00 00 02 08 6C + 39 00 00 00 00 00 02 07 6D + 39 00 00 00 00 00 02 06 6E + 39 00 00 00 00 00 02 05 6F + 39 00 00 00 00 00 02 04 70 + 39 00 00 00 00 00 02 03 71 + 39 00 00 00 00 00 02 02 72 + 39 00 00 00 00 00 02 01 73 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 89 + 39 00 00 00 00 00 02 7E 88 + 39 00 00 00 00 00 02 7D 87 + 39 00 00 00 00 00 02 7C 87 + 39 00 00 00 00 00 02 7B 88 + 39 00 00 00 00 00 02 7A 88 + 39 00 00 00 00 00 02 79 87 + 39 00 00 00 00 00 02 78 88 + 39 00 00 00 00 00 02 77 88 + 39 00 00 00 00 00 02 76 88 + 39 00 00 00 00 00 02 75 88 + 39 00 00 00 00 00 02 74 89 + 39 00 00 00 00 00 02 73 89 + 39 00 00 00 00 00 02 72 89 + 39 00 00 00 00 00 02 71 89 + 39 00 00 00 00 00 02 70 89 + 39 00 00 00 00 00 02 6F 89 + 39 00 00 00 00 00 02 6E 89 + 39 00 00 00 00 00 02 6D 89 + 39 00 00 00 00 00 02 6C 89 + 39 00 00 00 00 00 02 6B 89 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 69 88 + 39 00 00 00 00 00 02 68 88 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 66 89 + 39 00 00 00 00 00 02 65 89 + 39 00 00 00 00 00 02 64 89 + 39 00 00 00 00 00 02 63 89 + 39 00 00 00 00 00 02 62 89 + 39 00 00 00 00 00 02 61 89 + 39 00 00 00 00 00 02 60 89 + 39 00 00 00 00 00 02 5F 88 + 39 00 00 00 00 00 02 5E 88 + 39 00 00 00 00 00 02 5D 88 + 39 00 00 00 00 00 02 5C 88 + 39 00 00 00 00 00 02 5B 88 + 39 00 00 00 00 00 02 5A 89 + 39 00 00 00 00 00 02 59 89 + 39 00 00 00 00 00 02 58 89 + 39 00 00 00 00 00 02 57 8A + 39 00 00 00 00 00 02 56 8A + 39 00 00 00 00 00 02 55 8A + 39 00 00 00 00 00 02 54 8A + 39 00 00 00 00 00 02 53 89 + 39 00 00 00 00 00 02 52 89 + 39 00 00 00 00 00 02 51 89 + 39 00 00 00 00 00 02 50 89 + 39 00 00 00 00 00 02 4F 88 + 39 00 00 00 00 00 02 4E 88 + 39 00 00 00 00 00 02 4D 88 + 39 00 00 00 00 00 02 4C 88 + 39 00 00 00 00 00 02 4B 88 + 39 00 00 00 00 00 02 4A 89 + 39 00 00 00 00 00 02 49 89 + 39 00 00 00 00 00 02 48 8A + 39 00 00 00 00 00 02 47 8A + 39 00 00 00 00 00 02 46 8A + 39 00 00 00 00 00 02 45 8A + 39 00 00 00 00 00 02 44 8A + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 42 8A + 39 00 00 00 00 00 02 41 8A + 39 00 00 00 00 00 02 40 8A + 39 00 00 00 00 00 02 3F 8A + 39 00 00 00 00 00 02 3E 8A + 39 00 00 00 00 00 02 3D 8A + 39 00 00 00 00 00 02 3C 8A + 39 00 00 00 00 00 02 3B 89 + 39 00 00 00 00 00 02 3A 89 + 39 00 00 00 00 00 02 39 89 + 39 00 00 00 00 00 02 38 88 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 35 87 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 33 86 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 31 85 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 2F 84 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 29 86 + 39 00 00 00 00 00 02 28 86 + 39 00 00 00 00 00 02 27 86 + 39 00 00 00 00 00 02 26 87 + 39 00 00 00 00 00 02 25 86 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 22 86 + 39 00 00 00 00 00 02 21 86 + 39 00 00 00 00 00 02 20 86 + 39 00 00 00 00 00 02 1F 86 + 39 00 00 00 00 00 02 1E 86 + 39 00 00 00 00 00 02 1D 86 + 39 00 00 00 00 00 02 1C 86 + 39 00 00 00 00 00 02 1B 86 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 19 85 + 39 00 00 00 00 00 02 18 85 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 15 84 + 39 00 00 00 00 00 02 14 84 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 12 83 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 3E FE + 39 00 00 00 00 00 02 3D FE + 39 00 00 00 00 00 02 3C FD + 39 00 00 00 00 00 02 3B FC + 39 00 00 00 00 00 02 3A FC + 39 00 00 00 00 00 02 39 FB + 39 00 00 00 00 00 02 38 FA + 39 00 00 00 00 00 02 37 F9 + 39 00 00 00 00 00 02 36 F9 + 39 00 00 00 00 00 02 35 F8 + 39 00 00 00 00 00 02 34 F7 + 39 00 00 00 00 00 02 33 F6 + 39 00 00 00 00 00 02 32 F5 + 39 00 00 00 00 00 02 31 F5 + 39 00 00 00 00 00 02 30 F4 + 39 00 00 00 00 00 02 2F F3 + 39 00 00 00 00 00 02 2E F2 + 39 00 00 00 00 00 02 2D F1 + 39 00 00 00 00 00 02 2C F0 + 39 00 00 00 00 00 02 2B F0 + 39 00 00 00 00 00 02 2A EF + 39 00 00 00 00 00 02 29 EF + 39 00 00 00 00 00 02 28 EE + 39 00 00 00 00 00 02 27 EE + 39 00 00 00 00 00 02 26 ED + 39 00 00 00 00 00 02 25 ED + 39 00 00 00 00 00 02 24 EC + 39 00 00 00 00 00 02 23 EB + 39 00 00 00 00 00 02 22 EB + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 20 E9 + 39 00 00 00 00 00 02 1F E9 + 39 00 00 00 00 00 02 1E E8 + 39 00 00 00 00 00 02 1D E8 + 39 00 00 00 00 00 02 1C E7 + 39 00 00 00 00 00 02 1B E6 + 39 00 00 00 00 00 02 1A E6 + 39 00 00 00 00 00 02 19 E5 + 39 00 00 00 00 00 02 18 E4 + 39 00 00 00 00 00 02 17 E3 + 39 00 00 00 00 00 02 16 E2 + 39 00 00 00 00 00 02 15 E2 + 39 00 00 00 00 00 02 14 E1 + 39 00 00 00 00 00 02 13 E0 + 39 00 00 00 00 00 02 12 DF + 39 00 00 00 00 00 02 11 DE + 39 00 00 00 00 00 02 10 DE + 39 00 00 00 00 00 02 0F DD + 39 00 00 00 00 00 02 0E DC + 39 00 00 00 00 00 02 0D DB + 39 00 00 00 00 00 02 0C DA + 39 00 00 00 00 00 02 0B DA + 39 00 00 00 00 00 02 0A D9 + 39 00 00 00 00 00 02 09 D8 + 39 00 00 00 00 00 02 08 D7 + 39 00 00 00 00 00 02 07 D6 + 39 00 00 00 00 00 02 06 D5 + 39 00 00 00 00 00 02 05 D5 + 39 00 00 00 00 00 02 04 D4 + 39 00 00 00 00 00 02 03 D3 + 39 00 00 00 00 00 02 02 D3 + 39 00 00 00 00 00 02 01 D2 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 82 + 39 00 00 00 00 00 02 7F 89 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F d1 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 d2 + 39 00 00 00 00 00 02 7F ff + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 8b + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 74 + 39 00 00 00 00 00 02 7F a3 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 8B + 39 00 00 00 00 00 02 7E 8A + 39 00 00 00 00 00 02 7D 89 + 39 00 00 00 00 00 02 7C 88 + 39 00 00 00 00 00 02 7B 87 + 39 00 00 00 00 00 02 7A 86 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 77 83 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 75 81 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 6E 07 + 39 00 00 00 00 00 02 6D 08 + 39 00 00 00 00 00 02 6C 0A + 39 00 00 00 00 00 02 6B 0B + 39 00 00 00 00 00 02 6A 0C + 39 00 00 00 00 00 02 69 0D + 39 00 00 00 00 00 02 68 0F + 39 00 00 00 00 00 02 67 10 + 39 00 00 00 00 00 02 66 11 + 39 00 00 00 00 00 02 65 13 + 39 00 00 00 00 00 02 64 14 + 39 00 00 00 00 00 02 63 15 + 39 00 00 00 00 00 02 62 17 + 39 00 00 00 00 00 02 61 18 + 39 00 00 00 00 00 02 60 19 + 39 00 00 00 00 00 02 5F 1A + 39 00 00 00 00 00 02 5E 1C + 39 00 00 00 00 00 02 5D 1D + 39 00 00 00 00 00 02 5C 1E + 39 00 00 00 00 00 02 5B 1F + 39 00 00 00 00 00 02 5A 20 + 39 00 00 00 00 00 02 59 22 + 39 00 00 00 00 00 02 58 23 + 39 00 00 00 00 00 02 57 24 + 39 00 00 00 00 00 02 56 25 + 39 00 00 00 00 00 02 55 26 + 39 00 00 00 00 00 02 54 27 + 39 00 00 00 00 00 02 53 28 + 39 00 00 00 00 00 02 52 29 + 39 00 00 00 00 00 02 51 2A + 39 00 00 00 00 00 02 50 2C + 39 00 00 00 00 00 02 4F 2D + 39 00 00 00 00 00 02 4E 2E + 39 00 00 00 00 00 02 4D 2E + 39 00 00 00 00 00 02 4C 2E + 39 00 00 00 00 00 02 4B 2F + 39 00 00 00 00 00 02 4A 30 + 39 00 00 00 00 00 02 49 30 + 39 00 00 00 00 00 02 48 31 + 39 00 00 00 00 00 02 47 33 + 39 00 00 00 00 00 02 46 34 + 39 00 00 00 00 00 02 45 36 + 39 00 00 00 00 00 02 44 37 + 39 00 00 00 00 00 02 43 38 + 39 00 00 00 00 00 02 42 3A + 39 00 00 00 00 00 02 41 3B + 39 00 00 00 00 00 02 40 3C + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 3E 3F + 39 00 00 00 00 00 02 3D 40 + 39 00 00 00 00 00 02 3C 41 + 39 00 00 00 00 00 02 3B 42 + 39 00 00 00 00 00 02 3A 43 + 39 00 00 00 00 00 02 39 45 + 39 00 00 00 00 00 02 38 46 + 39 00 00 00 00 00 02 37 48 + 39 00 00 00 00 00 02 36 49 + 39 00 00 00 00 00 02 35 4B + 39 00 00 00 00 00 02 34 4C + 39 00 00 00 00 00 02 33 4B + 39 00 00 00 00 00 02 32 4A + 39 00 00 00 00 00 02 31 4B + 39 00 00 00 00 00 02 30 4C + 39 00 00 00 00 00 02 2F 4D + 39 00 00 00 00 00 02 2E 4F + 39 00 00 00 00 00 02 2D 50 + 39 00 00 00 00 00 02 2C 51 + 39 00 00 00 00 00 02 2B 52 + 39 00 00 00 00 00 02 2A 54 + 39 00 00 00 00 00 02 29 54 + 39 00 00 00 00 00 02 28 55 + 39 00 00 00 00 00 02 27 56 + 39 00 00 00 00 00 02 26 57 + 39 00 00 00 00 00 02 25 58 + 39 00 00 00 00 00 02 24 59 + 39 00 00 00 00 00 02 23 5A + 39 00 00 00 00 00 02 22 5B + 39 00 00 00 00 00 02 21 5B + 39 00 00 00 00 00 02 20 5D + 39 00 00 00 00 00 02 1F A2 + 39 00 00 00 00 00 02 1E A1 + 39 00 00 00 00 00 02 1D A0 + 39 00 00 00 00 00 02 1C 9F + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1A 9C + 39 00 00 00 00 00 02 19 9B + 39 00 00 00 00 00 02 18 9A + 39 00 00 00 00 00 02 17 99 + 39 00 00 00 00 00 02 16 99 + 39 00 00 00 00 00 02 15 97 + 39 00 00 00 00 00 02 14 96 + 39 00 00 00 00 00 02 13 95 + 39 00 00 00 00 00 02 12 94 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 10 92 + 39 00 00 00 00 00 02 0F 90 + 39 00 00 00 00 00 02 0E 8F + 39 00 00 00 00 00 02 0D 8E + 39 00 00 00 00 00 02 0C 8D + 39 00 00 00 00 00 02 0B 8C + 39 00 00 00 00 00 02 0A 8B + 39 00 00 00 00 00 02 09 89 + 39 00 00 00 00 00 02 08 88 + 39 00 00 00 00 00 02 07 87 + 39 00 00 00 00 00 02 06 87 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 03 86 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 79 00 + 39 00 00 00 00 00 02 78 00 + 39 00 00 00 00 00 02 77 00 + 39 00 00 00 00 00 02 76 01 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 73 02 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 70 03 + 39 00 00 00 00 00 02 6F 03 + 39 00 00 00 00 00 02 6E 03 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6C 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 64 03 + 39 00 00 00 00 00 02 63 03 + 39 00 00 00 00 00 02 62 03 + 39 00 00 00 00 00 02 61 03 + 39 00 00 00 00 00 02 60 03 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 5E 03 + 39 00 00 00 00 00 02 5D 03 + 39 00 00 00 00 00 02 5C 03 + 39 00 00 00 00 00 02 5B 03 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 59 03 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 57 03 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 55 02 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 53 02 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 51 02 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 4F 02 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4D 03 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4A 04 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 48 05 + 39 00 00 00 00 00 02 47 05 + 39 00 00 00 00 00 02 46 05 + 39 00 00 00 00 00 02 45 05 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 43 06 + 39 00 00 00 00 00 02 42 06 + 39 00 00 00 00 00 02 41 06 + 39 00 00 00 00 00 02 40 06 + 39 00 00 00 00 00 02 3F 06 + 39 00 00 00 00 00 02 3E 06 + 39 00 00 00 00 00 02 3D 06 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 38 07 + 39 00 00 00 00 00 02 37 06 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 05 + 39 00 00 00 00 00 02 2F 05 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2C 06 + 39 00 00 00 00 00 02 2B 06 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 27 07 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 25 08 + 39 00 00 00 00 00 02 24 06 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 04 + 39 00 00 00 00 00 02 1B 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 14 03 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 01 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F D1 + 39 00 00 00 00 00 02 7E D1 + 39 00 00 00 00 00 02 7D D0 + 39 00 00 00 00 00 02 7C CF + 39 00 00 00 00 00 02 7B CE + 39 00 00 00 00 00 02 7A CE + 39 00 00 00 00 00 02 79 CD + 39 00 00 00 00 00 02 78 CD + 39 00 00 00 00 00 02 77 CC + 39 00 00 00 00 00 02 76 CC + 39 00 00 00 00 00 02 75 CB + 39 00 00 00 00 00 02 74 CA + 39 00 00 00 00 00 02 73 CA + 39 00 00 00 00 00 02 72 C9 + 39 00 00 00 00 00 02 71 C9 + 39 00 00 00 00 00 02 70 C8 + 39 00 00 00 00 00 02 6F C8 + 39 00 00 00 00 00 02 6E C7 + 39 00 00 00 00 00 02 6D C7 + 39 00 00 00 00 00 02 6C C6 + 39 00 00 00 00 00 02 6B C5 + 39 00 00 00 00 00 02 6A C5 + 39 00 00 00 00 00 02 69 C4 + 39 00 00 00 00 00 02 68 C4 + 39 00 00 00 00 00 02 67 C3 + 39 00 00 00 00 00 02 66 C3 + 39 00 00 00 00 00 02 65 C3 + 39 00 00 00 00 00 02 64 C2 + 39 00 00 00 00 00 02 63 C2 + 39 00 00 00 00 00 02 62 C1 + 39 00 00 00 00 00 02 61 C1 + 39 00 00 00 00 00 02 60 C0 + 39 00 00 00 00 00 02 5F BF + 39 00 00 00 00 00 02 5E BE + 39 00 00 00 00 00 02 5D BD + 39 00 00 00 00 00 02 5C BC + 39 00 00 00 00 00 02 5B BB + 39 00 00 00 00 00 02 5A BA + 39 00 00 00 00 00 02 59 B9 + 39 00 00 00 00 00 02 58 B8 + 39 00 00 00 00 00 02 57 B7 + 39 00 00 00 00 00 02 56 B6 + 39 00 00 00 00 00 02 55 B5 + 39 00 00 00 00 00 02 54 B5 + 39 00 00 00 00 00 02 53 B4 + 39 00 00 00 00 00 02 52 B3 + 39 00 00 00 00 00 02 51 B2 + 39 00 00 00 00 00 02 50 B2 + 39 00 00 00 00 00 02 4F B1 + 39 00 00 00 00 00 02 4E B0 + 39 00 00 00 00 00 02 4D AF + 39 00 00 00 00 00 02 4C AF + 39 00 00 00 00 00 02 4B AE + 39 00 00 00 00 00 02 4A AE + 39 00 00 00 00 00 02 49 AD + 39 00 00 00 00 00 02 48 AC + 39 00 00 00 00 00 02 47 AC + 39 00 00 00 00 00 02 46 AB + 39 00 00 00 00 00 02 45 AA + 39 00 00 00 00 00 02 44 A9 + 39 00 00 00 00 00 02 43 A9 + 39 00 00 00 00 00 02 42 AA + 39 00 00 00 00 00 02 41 AA + 39 00 00 00 00 00 02 40 A9 + 39 00 00 00 00 00 02 3F A9 + 39 00 00 00 00 00 02 3E A9 + 39 00 00 00 00 00 02 3D A7 + 39 00 00 00 00 00 02 3C A6 + 39 00 00 00 00 00 02 3B A5 + 39 00 00 00 00 00 02 3A A4 + 39 00 00 00 00 00 02 39 A3 + 39 00 00 00 00 00 02 38 A3 + 39 00 00 00 00 00 02 37 A2 + 39 00 00 00 00 00 02 36 A1 + 39 00 00 00 00 00 02 35 A0 + 39 00 00 00 00 00 02 34 9F + 39 00 00 00 00 00 02 33 9F + 39 00 00 00 00 00 02 32 9E + 39 00 00 00 00 00 02 31 9D + 39 00 00 00 00 00 02 30 9C + 39 00 00 00 00 00 02 2F 9B + 39 00 00 00 00 00 02 2E 9A + 39 00 00 00 00 00 02 2D 99 + 39 00 00 00 00 00 02 2C 9B + 39 00 00 00 00 00 02 2B 9C + 39 00 00 00 00 00 02 2A 9B + 39 00 00 00 00 00 02 29 9A + 39 00 00 00 00 00 02 28 99 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 26 97 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 24 96 + 39 00 00 00 00 00 02 23 96 + 39 00 00 00 00 00 02 22 95 + 39 00 00 00 00 00 02 21 95 + 39 00 00 00 00 00 02 20 95 + 39 00 00 00 00 00 02 1F 94 + 39 00 00 00 00 00 02 1E 94 + 39 00 00 00 00 00 02 1D 93 + 39 00 00 00 00 00 02 1C 93 + 39 00 00 00 00 00 02 1B 92 + 39 00 00 00 00 00 02 1A 91 + 39 00 00 00 00 00 02 19 90 + 39 00 00 00 00 00 02 18 90 + 39 00 00 00 00 00 02 17 8F + 39 00 00 00 00 00 02 16 8E + 39 00 00 00 00 00 02 15 8E + 39 00 00 00 00 00 02 14 8D + 39 00 00 00 00 00 02 13 8D + 39 00 00 00 00 00 02 12 8C + 39 00 00 00 00 00 02 11 8B + 39 00 00 00 00 00 02 10 8A + 39 00 00 00 00 00 02 0F 8A + 39 00 00 00 00 00 02 0E 89 + 39 00 00 00 00 00 02 0D 88 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0A 86 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 07 84 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 04 84 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + + qcom,mdss-dsi-panel-eye-command07= [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A3 13 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 94 + 39 00 00 00 00 00 02 A9 1E + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 86 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 B0 26 + 39 00 00 00 00 00 02 B1 51 + 39 00 00 00 00 00 02 B2 60 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1B + 39 00 00 00 00 00 02 C2 2A + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 93 + 39 00 00 00 00 00 02 C9 1E + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 85 + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1B + 39 00 00 00 00 00 02 CE 4E + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 D1 50 + 39 00 00 00 00 00 02 D2 5F + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 02 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0F 04 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 11 05 + 39 00 00 00 00 00 02 12 05 + 39 00 00 00 00 00 02 13 05 + 39 00 00 00 00 00 02 14 05 + 39 00 00 00 00 00 02 15 05 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 18 05 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 1A 06 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1D 07 + 39 00 00 00 00 00 02 1E 08 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 20 07 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 24 04 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 29 06 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 2B 06 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 37 06 + 39 00 00 00 00 00 02 38 06 + 39 00 00 00 00 00 02 39 06 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4E 05 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 51 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 75 03 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7F 02 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 07 85 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 0A 87 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0D 89 + 39 00 00 00 00 00 02 0E 8B + 39 00 00 00 00 00 02 0F 8C + 39 00 00 00 00 00 02 10 8C + 39 00 00 00 00 00 02 11 8D + 39 00 00 00 00 00 02 12 8D + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 8F + 39 00 00 00 00 00 02 15 90 + 39 00 00 00 00 00 02 16 90 + 39 00 00 00 00 00 02 17 90 + 39 00 00 00 00 00 02 18 90 + 39 00 00 00 00 00 02 19 91 + 39 00 00 00 00 00 02 1A 92 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1C 95 + 39 00 00 00 00 00 02 1D 96 + 39 00 00 00 00 00 02 1E 96 + 39 00 00 00 00 00 02 1F 97 + 39 00 00 00 00 00 02 20 97 + 39 00 00 00 00 00 02 21 98 + 39 00 00 00 00 00 02 22 98 + 39 00 00 00 00 00 02 23 99 + 39 00 00 00 00 00 02 24 99 + 39 00 00 00 00 00 02 25 9A + 39 00 00 00 00 00 02 26 99 + 39 00 00 00 00 00 02 27 9A + 39 00 00 00 00 00 02 28 9B + 39 00 00 00 00 00 02 29 9D + 39 00 00 00 00 00 02 2A 9F + 39 00 00 00 00 00 02 2B A0 + 39 00 00 00 00 00 02 2C A2 + 39 00 00 00 00 00 02 2D A3 + 39 00 00 00 00 00 02 2E A3 + 39 00 00 00 00 00 02 2F A4 + 39 00 00 00 00 00 02 30 A4 + 39 00 00 00 00 00 02 31 A5 + 39 00 00 00 00 00 02 32 A5 + 39 00 00 00 00 00 02 33 A6 + 39 00 00 00 00 00 02 34 A6 + 39 00 00 00 00 00 02 35 A7 + 39 00 00 00 00 00 02 36 A8 + 39 00 00 00 00 00 02 37 A9 + 39 00 00 00 00 00 02 38 AA + 39 00 00 00 00 00 02 39 AB + 39 00 00 00 00 00 02 3A AC + 39 00 00 00 00 00 02 3B AC + 39 00 00 00 00 00 02 3C AC + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E AF + 39 00 00 00 00 00 02 3F B0 + 39 00 00 00 00 00 02 40 B1 + 39 00 00 00 00 00 02 41 B2 + 39 00 00 00 00 00 02 42 B3 + 39 00 00 00 00 00 02 43 B3 + 39 00 00 00 00 00 02 44 B3 + 39 00 00 00 00 00 02 45 B4 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 47 B4 + 39 00 00 00 00 00 02 48 B5 + 39 00 00 00 00 00 02 49 B6 + 39 00 00 00 00 00 02 4A B6 + 39 00 00 00 00 00 02 4B B7 + 39 00 00 00 00 00 02 4C B7 + 39 00 00 00 00 00 02 4D B8 + 39 00 00 00 00 00 02 4E B8 + 39 00 00 00 00 00 02 4F B9 + 39 00 00 00 00 00 02 50 BA + 39 00 00 00 00 00 02 51 BB + 39 00 00 00 00 00 02 52 BC + 39 00 00 00 00 00 02 53 BC + 39 00 00 00 00 00 02 54 BD + 39 00 00 00 00 00 02 55 BE + 39 00 00 00 00 00 02 56 BE + 39 00 00 00 00 00 02 57 BF + 39 00 00 00 00 00 02 58 C0 + 39 00 00 00 00 00 02 59 C1 + 39 00 00 00 00 00 02 5A C3 + 39 00 00 00 00 00 02 5B C4 + 39 00 00 00 00 00 02 5C C5 + 39 00 00 00 00 00 02 5D C6 + 39 00 00 00 00 00 02 5E C7 + 39 00 00 00 00 00 02 5F C8 + 39 00 00 00 00 00 02 60 C9 + 39 00 00 00 00 00 02 61 CA + 39 00 00 00 00 00 02 62 CB + 39 00 00 00 00 00 02 63 CC + 39 00 00 00 00 00 02 64 CD + 39 00 00 00 00 00 02 65 CD + 39 00 00 00 00 00 02 66 CE + 39 00 00 00 00 00 02 67 CE + 39 00 00 00 00 00 02 68 CF + 39 00 00 00 00 00 02 69 D0 + 39 00 00 00 00 00 02 6A D0 + 39 00 00 00 00 00 02 6B D1 + 39 00 00 00 00 00 02 6C D2 + 39 00 00 00 00 00 02 6D D2 + 39 00 00 00 00 00 02 6E D3 + 39 00 00 00 00 00 02 6F D4 + 39 00 00 00 00 00 02 70 D4 + 39 00 00 00 00 00 02 71 D5 + 39 00 00 00 00 00 02 72 D6 + 39 00 00 00 00 00 02 73 D7 + 39 00 00 00 00 00 02 74 D7 + 39 00 00 00 00 00 02 75 D8 + 39 00 00 00 00 00 02 76 D9 + 39 00 00 00 00 00 02 77 DA + 39 00 00 00 00 00 02 78 DA + 39 00 00 00 00 00 02 79 DB + 39 00 00 00 00 00 02 7A DC + 39 00 00 00 00 00 02 7B DD + 39 00 00 00 00 00 02 7C DD + 39 00 00 00 00 00 02 7D DE + 39 00 00 00 00 00 02 7E DF + 39 00 00 00 00 00 02 7F E0 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 06 89 + 39 00 00 00 00 00 02 07 89 + 39 00 00 00 00 00 02 08 8A + 39 00 00 00 00 00 02 09 8B + 39 00 00 00 00 00 02 0A 8D + 39 00 00 00 00 00 02 0B 8E + 39 00 00 00 00 00 02 0C 90 + 39 00 00 00 00 00 02 0D 91 + 39 00 00 00 00 00 02 0E 92 + 39 00 00 00 00 00 02 0F 93 + 39 00 00 00 00 00 02 10 95 + 39 00 00 00 00 00 02 11 97 + 39 00 00 00 00 00 02 12 98 + 39 00 00 00 00 00 02 13 9A + 39 00 00 00 00 00 02 14 9B + 39 00 00 00 00 00 02 15 9C + 39 00 00 00 00 00 02 16 9D + 39 00 00 00 00 00 02 17 9F + 39 00 00 00 00 00 02 18 A0 + 39 00 00 00 00 00 02 19 A1 + 39 00 00 00 00 00 02 1A A2 + 39 00 00 00 00 00 02 1B A3 + 39 00 00 00 00 00 02 1C A4 + 39 00 00 00 00 00 02 1D A5 + 39 00 00 00 00 00 02 1E A7 + 39 00 00 00 00 00 02 1F A8 + 39 00 00 00 00 00 02 20 56 + 39 00 00 00 00 00 02 21 55 + 39 00 00 00 00 00 02 22 53 + 39 00 00 00 00 00 02 23 51 + 39 00 00 00 00 00 02 24 50 + 39 00 00 00 00 00 02 25 4F + 39 00 00 00 00 00 02 26 4E + 39 00 00 00 00 00 02 27 4D + 39 00 00 00 00 00 02 28 4C + 39 00 00 00 00 00 02 29 4B + 39 00 00 00 00 00 02 2A 49 + 39 00 00 00 00 00 02 2B 48 + 39 00 00 00 00 00 02 2C 47 + 39 00 00 00 00 00 02 2D 46 + 39 00 00 00 00 00 02 2E 45 + 39 00 00 00 00 00 02 2F 45 + 39 00 00 00 00 00 02 30 43 + 39 00 00 00 00 00 02 31 41 + 39 00 00 00 00 00 02 32 3F + 39 00 00 00 00 00 02 33 3D + 39 00 00 00 00 00 02 34 3B + 39 00 00 00 00 00 02 35 39 + 39 00 00 00 00 00 02 36 37 + 39 00 00 00 00 00 02 37 35 + 39 00 00 00 00 00 02 38 35 + 39 00 00 00 00 00 02 39 34 + 39 00 00 00 00 00 02 3A 32 + 39 00 00 00 00 00 02 3B 31 + 39 00 00 00 00 00 02 3C 30 + 39 00 00 00 00 00 02 3D 2F + 39 00 00 00 00 00 02 3E 2E + 39 00 00 00 00 00 02 3F 2D + 39 00 00 00 00 00 02 40 2B + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 42 29 + 39 00 00 00 00 00 02 43 27 + 39 00 00 00 00 00 02 44 26 + 39 00 00 00 00 00 02 45 24 + 39 00 00 00 00 00 02 46 23 + 39 00 00 00 00 00 02 47 21 + 39 00 00 00 00 00 02 48 20 + 39 00 00 00 00 00 02 49 20 + 39 00 00 00 00 00 02 4A 1E + 39 00 00 00 00 00 02 4B 1C + 39 00 00 00 00 00 02 4C 1A + 39 00 00 00 00 00 02 4D 18 + 39 00 00 00 00 00 02 4E 16 + 39 00 00 00 00 00 02 4F 15 + 39 00 00 00 00 00 02 50 14 + 39 00 00 00 00 00 02 51 13 + 39 00 00 00 00 00 02 52 12 + 39 00 00 00 00 00 02 53 11 + 39 00 00 00 00 00 02 54 10 + 39 00 00 00 00 00 02 55 0F + 39 00 00 00 00 00 02 56 0E + 39 00 00 00 00 00 02 57 0D + 39 00 00 00 00 00 02 58 0B + 39 00 00 00 00 00 02 59 0A + 39 00 00 00 00 00 02 5A 09 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 02 5C 07 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 60 02 + 39 00 00 00 00 00 02 61 00 + 39 00 00 00 00 00 02 62 81 + 39 00 00 00 00 00 02 63 82 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 66 87 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 68 89 + 39 00 00 00 00 00 02 69 8A + 39 00 00 00 00 00 02 6A 8C + 39 00 00 00 00 00 02 6B 8D + 39 00 00 00 00 00 02 6C 8F + 39 00 00 00 00 00 02 6D 91 + 39 00 00 00 00 00 02 6E 92 + 39 00 00 00 00 00 02 6F 94 + 39 00 00 00 00 00 02 70 96 + 39 00 00 00 00 00 02 71 97 + 39 00 00 00 00 00 02 72 99 + 39 00 00 00 00 00 02 73 9A + 39 00 00 00 00 00 02 74 9C + 39 00 00 00 00 00 02 75 9E + 39 00 00 00 00 00 02 76 9F + 39 00 00 00 00 00 02 77 A1 + 39 00 00 00 00 00 02 78 A2 + 39 00 00 00 00 00 02 79 A4 + 39 00 00 00 00 00 02 7A A5 + 39 00 00 00 00 00 02 7B A7 + 39 00 00 00 00 00 02 7C A8 + 39 00 00 00 00 00 02 7D A9 + 39 00 00 00 00 00 02 7E AA + 39 00 00 00 00 00 02 7F AC + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 05 02 + 39 00 00 00 00 00 02 06 02 + 39 00 00 00 00 00 02 07 02 + 39 00 00 00 00 00 02 08 02 + 39 00 00 00 00 00 02 09 02 + 39 00 00 00 00 00 02 0A 02 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 12 02 + 39 00 00 00 00 00 02 13 02 + 39 00 00 00 00 00 02 14 01 + 39 00 00 00 00 00 02 15 01 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 00 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 1A 81 + 39 00 00 00 00 00 02 1B 81 + 39 00 00 00 00 00 02 1C 81 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1F 82 + 39 00 00 00 00 00 02 20 82 + 39 00 00 00 00 00 02 21 82 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 24 82 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 82 + 39 00 00 00 00 00 02 2A 82 + 39 00 00 00 00 00 02 2B 82 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2E 81 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 3B 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 40 87 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 56 84 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 67 83 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 6B 83 + 39 00 00 00 00 00 02 6C 83 + 39 00 00 00 00 00 02 6D 83 + 39 00 00 00 00 00 02 6E 83 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 70 82 + 39 00 00 00 00 00 02 71 82 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 76 83 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7E 82 + 39 00 00 00 00 00 02 7F 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 E0 + 39 00 00 00 00 00 02 02 E1 + 39 00 00 00 00 00 02 03 E2 + 39 00 00 00 00 00 02 04 E3 + 39 00 00 00 00 00 02 05 E4 + 39 00 00 00 00 00 02 06 E4 + 39 00 00 00 00 00 02 07 E5 + 39 00 00 00 00 00 02 08 E6 + 39 00 00 00 00 00 02 09 E7 + 39 00 00 00 00 00 02 0A E8 + 39 00 00 00 00 00 02 0B E8 + 39 00 00 00 00 00 02 0C E9 + 39 00 00 00 00 00 02 0D EA + 39 00 00 00 00 00 02 0E EB + 39 00 00 00 00 00 02 0F EC + 39 00 00 00 00 00 02 10 ED + 39 00 00 00 00 00 02 11 EE + 39 00 00 00 00 00 02 12 EF + 39 00 00 00 00 00 02 13 F0 + 39 00 00 00 00 00 02 14 F0 + 39 00 00 00 00 00 02 15 F1 + 39 00 00 00 00 00 02 16 F2 + 39 00 00 00 00 00 02 17 F3 + 39 00 00 00 00 00 02 18 F3 + 39 00 00 00 00 00 02 19 F4 + 39 00 00 00 00 00 02 1A F5 + 39 00 00 00 00 00 02 1B F6 + 39 00 00 00 00 00 02 1C F7 + 39 00 00 00 00 00 02 1D F7 + 39 00 00 00 00 00 02 1E F8 + 39 00 00 00 00 00 02 1F F9 + 39 00 00 00 00 00 02 20 FA + 39 00 00 00 00 00 02 21 FA + 39 00 00 00 00 00 02 22 FB + 39 00 00 00 00 00 02 23 FC + 39 00 00 00 00 00 02 24 FC + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 FE + 39 00 00 00 00 00 02 27 FE + 39 00 00 00 00 00 02 28 FF + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 2A FF + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2C FF + 39 00 00 00 00 00 02 2D FF + 39 00 00 00 00 00 02 2E FF + 39 00 00 00 00 00 02 2F FF + 39 00 00 00 00 00 02 30 FF + 39 00 00 00 00 00 02 31 FF + 39 00 00 00 00 00 02 32 FF + 39 00 00 00 00 00 02 33 FF + 39 00 00 00 00 00 02 34 FF + 39 00 00 00 00 00 02 35 FF + 39 00 00 00 00 00 02 36 FF + 39 00 00 00 00 00 02 37 FF + 39 00 00 00 00 00 02 38 FF + 39 00 00 00 00 00 02 39 FF + 39 00 00 00 00 00 02 3A FF + 39 00 00 00 00 00 02 3B FF + 39 00 00 00 00 00 02 3C FF + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3E FF + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7F FF + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 52 + 39 00 00 00 00 00 02 02 51 + 39 00 00 00 00 00 02 03 4F + 39 00 00 00 00 00 02 04 4E + 39 00 00 00 00 00 02 05 4D + 39 00 00 00 00 00 02 06 4B + 39 00 00 00 00 00 02 07 4A + 39 00 00 00 00 00 02 08 49 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 0A 46 + 39 00 00 00 00 00 02 0B 44 + 39 00 00 00 00 00 02 0C 43 + 39 00 00 00 00 00 02 0D 42 + 39 00 00 00 00 00 02 0E 41 + 39 00 00 00 00 00 02 0F 3F + 39 00 00 00 00 00 02 10 3E + 39 00 00 00 00 00 02 11 3C + 39 00 00 00 00 00 02 12 3B + 39 00 00 00 00 00 02 13 3A + 39 00 00 00 00 00 02 14 38 + 39 00 00 00 00 00 02 15 37 + 39 00 00 00 00 00 02 16 36 + 39 00 00 00 00 00 02 17 34 + 39 00 00 00 00 00 02 18 33 + 39 00 00 00 00 00 02 19 32 + 39 00 00 00 00 00 02 1A 30 + 39 00 00 00 00 00 02 1B 2F + 39 00 00 00 00 00 02 1C 2E + 39 00 00 00 00 00 02 1D 2D + 39 00 00 00 00 00 02 1E 2C + 39 00 00 00 00 00 02 1F 2A + 39 00 00 00 00 00 02 20 28 + 39 00 00 00 00 00 02 21 27 + 39 00 00 00 00 00 02 22 25 + 39 00 00 00 00 00 02 23 24 + 39 00 00 00 00 00 02 24 23 + 39 00 00 00 00 00 02 25 21 + 39 00 00 00 00 00 02 26 20 + 39 00 00 00 00 00 02 27 1E + 39 00 00 00 00 00 02 28 1D + 39 00 00 00 00 00 02 29 1B + 39 00 00 00 00 00 02 2A 1A + 39 00 00 00 00 00 02 2B 19 + 39 00 00 00 00 00 02 2C 17 + 39 00 00 00 00 00 02 2D 16 + 39 00 00 00 00 00 02 2E 14 + 39 00 00 00 00 00 02 2F 13 + 39 00 00 00 00 00 02 30 11 + 39 00 00 00 00 00 02 31 10 + 39 00 00 00 00 00 02 32 0E + 39 00 00 00 00 00 02 33 0D + 39 00 00 00 00 00 02 34 0B + 39 00 00 00 00 00 02 35 0A + 39 00 00 00 00 00 02 36 08 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 38 05 + 39 00 00 00 00 00 02 39 04 + 39 00 00 00 00 00 02 3A 03 + 39 00 00 00 00 00 02 3B 01 + 39 00 00 00 00 00 02 3C 00 + 39 00 00 00 00 00 02 3D 82 + 39 00 00 00 00 00 02 3E 83 + 39 00 00 00 00 00 02 3F 85 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 41 87 + 39 00 00 00 00 00 02 42 89 + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 44 8C + 39 00 00 00 00 00 02 45 8D + 39 00 00 00 00 00 02 46 8E + 39 00 00 00 00 00 02 47 90 + 39 00 00 00 00 00 02 48 91 + 39 00 00 00 00 00 02 49 93 + 39 00 00 00 00 00 02 4A 94 + 39 00 00 00 00 00 02 4B 95 + 39 00 00 00 00 00 02 4C 96 + 39 00 00 00 00 00 02 4D 98 + 39 00 00 00 00 00 02 4E 99 + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 51 9D + 39 00 00 00 00 00 02 52 9E + 39 00 00 00 00 00 02 53 9F + 39 00 00 00 00 00 02 54 A1 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 56 A3 + 39 00 00 00 00 00 02 57 A4 + 39 00 00 00 00 00 02 58 A6 + 39 00 00 00 00 00 02 59 A7 + 39 00 00 00 00 00 02 5A A8 + 39 00 00 00 00 00 02 5B AA + 39 00 00 00 00 00 02 5C AC + 39 00 00 00 00 00 02 5D AD + 39 00 00 00 00 00 02 5E AF + 39 00 00 00 00 00 02 5F B0 + 39 00 00 00 00 00 02 60 B2 + 39 00 00 00 00 00 02 61 B4 + 39 00 00 00 00 00 02 62 B5 + 39 00 00 00 00 00 02 63 B7 + 39 00 00 00 00 00 02 64 B9 + 39 00 00 00 00 00 02 65 BA + 39 00 00 00 00 00 02 66 BC + 39 00 00 00 00 00 02 67 BD + 39 00 00 00 00 00 02 68 BF + 39 00 00 00 00 00 02 69 C1 + 39 00 00 00 00 00 02 6A C2 + 39 00 00 00 00 00 02 6B C4 + 39 00 00 00 00 00 02 6C C5 + 39 00 00 00 00 00 02 6D C7 + 39 00 00 00 00 00 02 6E C8 + 39 00 00 00 00 00 02 6F CA + 39 00 00 00 00 00 02 70 CC + 39 00 00 00 00 00 02 71 CE + 39 00 00 00 00 00 02 72 CF + 39 00 00 00 00 00 02 73 D0 + 39 00 00 00 00 00 02 74 D1 + 39 00 00 00 00 00 02 75 D3 + 39 00 00 00 00 00 02 76 D4 + 39 00 00 00 00 00 02 77 D6 + 39 00 00 00 00 00 02 78 D7 + 39 00 00 00 00 00 02 79 D9 + 39 00 00 00 00 00 02 7A DA + 39 00 00 00 00 00 02 7B DC + 39 00 00 00 00 00 02 7C DD + 39 00 00 00 00 00 02 7D DF + 39 00 00 00 00 00 02 7E E0 + 39 00 00 00 00 00 02 7F E1 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 02 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F E0 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 E0 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F ac + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 53 + 39 00 00 00 00 00 02 7F e1 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F E1 + 39 00 00 00 00 00 02 7E E0 + 39 00 00 00 00 00 02 7D DF + 39 00 00 00 00 00 02 7C DD + 39 00 00 00 00 00 02 7B DC + 39 00 00 00 00 00 02 7A DA + 39 00 00 00 00 00 02 79 D9 + 39 00 00 00 00 00 02 78 D7 + 39 00 00 00 00 00 02 77 D6 + 39 00 00 00 00 00 02 76 D4 + 39 00 00 00 00 00 02 75 D3 + 39 00 00 00 00 00 02 74 D1 + 39 00 00 00 00 00 02 73 D0 + 39 00 00 00 00 00 02 72 CF + 39 00 00 00 00 00 02 71 CE + 39 00 00 00 00 00 02 70 CC + 39 00 00 00 00 00 02 6F CA + 39 00 00 00 00 00 02 6E C8 + 39 00 00 00 00 00 02 6D C7 + 39 00 00 00 00 00 02 6C C5 + 39 00 00 00 00 00 02 6B C4 + 39 00 00 00 00 00 02 6A C2 + 39 00 00 00 00 00 02 69 C1 + 39 00 00 00 00 00 02 68 BF + 39 00 00 00 00 00 02 67 BD + 39 00 00 00 00 00 02 66 BC + 39 00 00 00 00 00 02 65 BA + 39 00 00 00 00 00 02 64 B9 + 39 00 00 00 00 00 02 63 B7 + 39 00 00 00 00 00 02 62 B5 + 39 00 00 00 00 00 02 61 B4 + 39 00 00 00 00 00 02 60 B2 + 39 00 00 00 00 00 02 5F B0 + 39 00 00 00 00 00 02 5E AF + 39 00 00 00 00 00 02 5D AD + 39 00 00 00 00 00 02 5C AC + 39 00 00 00 00 00 02 5B AA + 39 00 00 00 00 00 02 5A A8 + 39 00 00 00 00 00 02 59 A7 + 39 00 00 00 00 00 02 58 A6 + 39 00 00 00 00 00 02 57 A4 + 39 00 00 00 00 00 02 56 A3 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 54 A1 + 39 00 00 00 00 00 02 53 9F + 39 00 00 00 00 00 02 52 9E + 39 00 00 00 00 00 02 51 9D + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 4E 99 + 39 00 00 00 00 00 02 4D 98 + 39 00 00 00 00 00 02 4C 96 + 39 00 00 00 00 00 02 4B 95 + 39 00 00 00 00 00 02 4A 94 + 39 00 00 00 00 00 02 49 93 + 39 00 00 00 00 00 02 48 91 + 39 00 00 00 00 00 02 47 90 + 39 00 00 00 00 00 02 46 8E + 39 00 00 00 00 00 02 45 8D + 39 00 00 00 00 00 02 44 8C + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 42 89 + 39 00 00 00 00 00 02 41 87 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 3F 85 + 39 00 00 00 00 00 02 3E 83 + 39 00 00 00 00 00 02 3D 82 + 39 00 00 00 00 00 02 3C 00 + 39 00 00 00 00 00 02 3B 01 + 39 00 00 00 00 00 02 3A 03 + 39 00 00 00 00 00 02 39 04 + 39 00 00 00 00 00 02 38 05 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 36 08 + 39 00 00 00 00 00 02 35 0A + 39 00 00 00 00 00 02 34 0B + 39 00 00 00 00 00 02 33 0D + 39 00 00 00 00 00 02 32 0E + 39 00 00 00 00 00 02 31 10 + 39 00 00 00 00 00 02 30 11 + 39 00 00 00 00 00 02 2F 13 + 39 00 00 00 00 00 02 2E 14 + 39 00 00 00 00 00 02 2D 16 + 39 00 00 00 00 00 02 2C 17 + 39 00 00 00 00 00 02 2B 19 + 39 00 00 00 00 00 02 2A 1A + 39 00 00 00 00 00 02 29 1B + 39 00 00 00 00 00 02 28 1D + 39 00 00 00 00 00 02 27 1E + 39 00 00 00 00 00 02 26 20 + 39 00 00 00 00 00 02 25 21 + 39 00 00 00 00 00 02 24 23 + 39 00 00 00 00 00 02 23 24 + 39 00 00 00 00 00 02 22 25 + 39 00 00 00 00 00 02 21 27 + 39 00 00 00 00 00 02 20 28 + 39 00 00 00 00 00 02 1F 2A + 39 00 00 00 00 00 02 1E 2C + 39 00 00 00 00 00 02 1D 2D + 39 00 00 00 00 00 02 1C 2E + 39 00 00 00 00 00 02 1B 2F + 39 00 00 00 00 00 02 1A 30 + 39 00 00 00 00 00 02 19 32 + 39 00 00 00 00 00 02 18 33 + 39 00 00 00 00 00 02 17 34 + 39 00 00 00 00 00 02 16 36 + 39 00 00 00 00 00 02 15 37 + 39 00 00 00 00 00 02 14 38 + 39 00 00 00 00 00 02 13 3A + 39 00 00 00 00 00 02 12 3B + 39 00 00 00 00 00 02 11 3C + 39 00 00 00 00 00 02 10 3E + 39 00 00 00 00 00 02 0F 3F + 39 00 00 00 00 00 02 0E 41 + 39 00 00 00 00 00 02 0D 42 + 39 00 00 00 00 00 02 0C 43 + 39 00 00 00 00 00 02 0B 44 + 39 00 00 00 00 00 02 0A 46 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 08 49 + 39 00 00 00 00 00 02 07 4A + 39 00 00 00 00 00 02 06 4B + 39 00 00 00 00 00 02 05 4D + 39 00 00 00 00 00 02 04 4E + 39 00 00 00 00 00 02 03 4F + 39 00 00 00 00 00 02 02 51 + 39 00 00 00 00 00 02 01 52 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 02 7E 82 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 76 83 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 71 82 + 39 00 00 00 00 00 02 70 82 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 6E 83 + 39 00 00 00 00 00 02 6D 83 + 39 00 00 00 00 00 02 6C 83 + 39 00 00 00 00 00 02 6B 83 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 67 83 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 56 84 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 40 87 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3B 86 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 2E 81 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2B 82 + 39 00 00 00 00 00 02 2A 82 + 39 00 00 00 00 00 02 29 82 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 24 82 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 21 82 + 39 00 00 00 00 00 02 20 82 + 39 00 00 00 00 00 02 1F 82 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1C 81 + 39 00 00 00 00 00 02 1B 81 + 39 00 00 00 00 00 02 1A 81 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 17 00 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 15 01 + 39 00 00 00 00 00 02 14 01 + 39 00 00 00 00 00 02 13 02 + 39 00 00 00 00 00 02 12 02 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0A 02 + 39 00 00 00 00 00 02 09 02 + 39 00 00 00 00 00 02 08 02 + 39 00 00 00 00 00 02 07 02 + 39 00 00 00 00 00 02 06 02 + 39 00 00 00 00 00 02 05 02 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 01 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 3E FF + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3C FF + 39 00 00 00 00 00 02 3B FF + 39 00 00 00 00 00 02 3A FF + 39 00 00 00 00 00 02 39 FF + 39 00 00 00 00 00 02 38 FF + 39 00 00 00 00 00 02 37 FF + 39 00 00 00 00 00 02 36 FF + 39 00 00 00 00 00 02 35 FF + 39 00 00 00 00 00 02 34 FF + 39 00 00 00 00 00 02 33 FF + 39 00 00 00 00 00 02 32 FF + 39 00 00 00 00 00 02 31 FF + 39 00 00 00 00 00 02 30 FF + 39 00 00 00 00 00 02 2F FF + 39 00 00 00 00 00 02 2E FF + 39 00 00 00 00 00 02 2D FF + 39 00 00 00 00 00 02 2C FF + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2A FF + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 28 FF + 39 00 00 00 00 00 02 27 FE + 39 00 00 00 00 00 02 26 FE + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 24 FC + 39 00 00 00 00 00 02 23 FC + 39 00 00 00 00 00 02 22 FB + 39 00 00 00 00 00 02 21 FA + 39 00 00 00 00 00 02 20 FA + 39 00 00 00 00 00 02 1F F9 + 39 00 00 00 00 00 02 1E F8 + 39 00 00 00 00 00 02 1D F7 + 39 00 00 00 00 00 02 1C F7 + 39 00 00 00 00 00 02 1B F6 + 39 00 00 00 00 00 02 1A F5 + 39 00 00 00 00 00 02 19 F4 + 39 00 00 00 00 00 02 18 F3 + 39 00 00 00 00 00 02 17 F3 + 39 00 00 00 00 00 02 16 F2 + 39 00 00 00 00 00 02 15 F1 + 39 00 00 00 00 00 02 14 F0 + 39 00 00 00 00 00 02 13 F0 + 39 00 00 00 00 00 02 12 EF + 39 00 00 00 00 00 02 11 EE + 39 00 00 00 00 00 02 10 ED + 39 00 00 00 00 00 02 0F EC + 39 00 00 00 00 00 02 0E EB + 39 00 00 00 00 00 02 0D EA + 39 00 00 00 00 00 02 0C E9 + 39 00 00 00 00 00 02 0B E8 + 39 00 00 00 00 00 02 0A E8 + 39 00 00 00 00 00 02 09 E7 + 39 00 00 00 00 00 02 08 E6 + 39 00 00 00 00 00 02 07 E5 + 39 00 00 00 00 00 02 06 E4 + 39 00 00 00 00 00 02 05 E4 + 39 00 00 00 00 00 02 04 E3 + 39 00 00 00 00 00 02 03 E2 + 39 00 00 00 00 00 02 02 E1 + 39 00 00 00 00 00 02 01 E0 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 02 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F E0 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 E0 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F ac + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 53 + 39 00 00 00 00 00 02 7F e1 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F AC + 39 00 00 00 00 00 02 7E AA + 39 00 00 00 00 00 02 7D A9 + 39 00 00 00 00 00 02 7C A8 + 39 00 00 00 00 00 02 7B A7 + 39 00 00 00 00 00 02 7A A5 + 39 00 00 00 00 00 02 79 A4 + 39 00 00 00 00 00 02 78 A2 + 39 00 00 00 00 00 02 77 A1 + 39 00 00 00 00 00 02 76 9F + 39 00 00 00 00 00 02 75 9E + 39 00 00 00 00 00 02 74 9C + 39 00 00 00 00 00 02 73 9A + 39 00 00 00 00 00 02 72 99 + 39 00 00 00 00 00 02 71 97 + 39 00 00 00 00 00 02 70 96 + 39 00 00 00 00 00 02 6F 94 + 39 00 00 00 00 00 02 6E 92 + 39 00 00 00 00 00 02 6D 91 + 39 00 00 00 00 00 02 6C 8F + 39 00 00 00 00 00 02 6B 8D + 39 00 00 00 00 00 02 6A 8C + 39 00 00 00 00 00 02 69 8A + 39 00 00 00 00 00 02 68 89 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 66 87 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 63 82 + 39 00 00 00 00 00 02 62 81 + 39 00 00 00 00 00 02 61 00 + 39 00 00 00 00 00 02 60 02 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5C 07 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 02 5A 09 + 39 00 00 00 00 00 02 59 0A + 39 00 00 00 00 00 02 58 0B + 39 00 00 00 00 00 02 57 0D + 39 00 00 00 00 00 02 56 0E + 39 00 00 00 00 00 02 55 0F + 39 00 00 00 00 00 02 54 10 + 39 00 00 00 00 00 02 53 11 + 39 00 00 00 00 00 02 52 12 + 39 00 00 00 00 00 02 51 13 + 39 00 00 00 00 00 02 50 14 + 39 00 00 00 00 00 02 4F 15 + 39 00 00 00 00 00 02 4E 16 + 39 00 00 00 00 00 02 4D 18 + 39 00 00 00 00 00 02 4C 1A + 39 00 00 00 00 00 02 4B 1C + 39 00 00 00 00 00 02 4A 1E + 39 00 00 00 00 00 02 49 20 + 39 00 00 00 00 00 02 48 20 + 39 00 00 00 00 00 02 47 21 + 39 00 00 00 00 00 02 46 23 + 39 00 00 00 00 00 02 45 24 + 39 00 00 00 00 00 02 44 26 + 39 00 00 00 00 00 02 43 27 + 39 00 00 00 00 00 02 42 29 + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 40 2B + 39 00 00 00 00 00 02 3F 2D + 39 00 00 00 00 00 02 3E 2E + 39 00 00 00 00 00 02 3D 2F + 39 00 00 00 00 00 02 3C 30 + 39 00 00 00 00 00 02 3B 31 + 39 00 00 00 00 00 02 3A 32 + 39 00 00 00 00 00 02 39 34 + 39 00 00 00 00 00 02 38 35 + 39 00 00 00 00 00 02 37 35 + 39 00 00 00 00 00 02 36 37 + 39 00 00 00 00 00 02 35 39 + 39 00 00 00 00 00 02 34 3B + 39 00 00 00 00 00 02 33 3D + 39 00 00 00 00 00 02 32 3F + 39 00 00 00 00 00 02 31 41 + 39 00 00 00 00 00 02 30 43 + 39 00 00 00 00 00 02 2F 45 + 39 00 00 00 00 00 02 2E 45 + 39 00 00 00 00 00 02 2D 46 + 39 00 00 00 00 00 02 2C 47 + 39 00 00 00 00 00 02 2B 48 + 39 00 00 00 00 00 02 2A 49 + 39 00 00 00 00 00 02 29 4B + 39 00 00 00 00 00 02 28 4C + 39 00 00 00 00 00 02 27 4D + 39 00 00 00 00 00 02 26 4E + 39 00 00 00 00 00 02 25 4F + 39 00 00 00 00 00 02 24 50 + 39 00 00 00 00 00 02 23 51 + 39 00 00 00 00 00 02 22 53 + 39 00 00 00 00 00 02 21 55 + 39 00 00 00 00 00 02 20 56 + 39 00 00 00 00 00 02 1F A8 + 39 00 00 00 00 00 02 1E A7 + 39 00 00 00 00 00 02 1D A5 + 39 00 00 00 00 00 02 1C A4 + 39 00 00 00 00 00 02 1B A3 + 39 00 00 00 00 00 02 1A A2 + 39 00 00 00 00 00 02 19 A1 + 39 00 00 00 00 00 02 18 A0 + 39 00 00 00 00 00 02 17 9F + 39 00 00 00 00 00 02 16 9D + 39 00 00 00 00 00 02 15 9C + 39 00 00 00 00 00 02 14 9B + 39 00 00 00 00 00 02 13 9A + 39 00 00 00 00 00 02 12 98 + 39 00 00 00 00 00 02 11 97 + 39 00 00 00 00 00 02 10 95 + 39 00 00 00 00 00 02 0F 93 + 39 00 00 00 00 00 02 0E 92 + 39 00 00 00 00 00 02 0D 91 + 39 00 00 00 00 00 02 0C 90 + 39 00 00 00 00 00 02 0B 8E + 39 00 00 00 00 00 02 0A 8D + 39 00 00 00 00 00 02 09 8B + 39 00 00 00 00 00 02 08 8A + 39 00 00 00 00 00 02 07 89 + 39 00 00 00 00 00 02 06 89 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 75 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 51 04 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 4E 05 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 39 06 + 39 00 00 00 00 00 02 38 06 + 39 00 00 00 00 00 02 37 06 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2B 06 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 29 06 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 24 04 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 07 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 1E 08 + 39 00 00 00 00 00 02 1D 07 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1A 06 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 18 05 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 05 + 39 00 00 00 00 00 02 14 05 + 39 00 00 00 00 00 02 13 05 + 39 00 00 00 00 00 02 12 05 + 39 00 00 00 00 00 02 11 05 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 0F 04 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 04 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 04 02 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 00 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 5F + 39 00 00 00 00 00 02 D1 50 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 CE 4E + 39 00 00 00 00 00 02 CD 1B + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 85 + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1E + 39 00 00 00 00 00 02 C8 93 + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C2 2A + 39 00 00 00 00 00 02 C1 1B + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 60 + 39 00 00 00 00 00 02 B1 51 + 39 00 00 00 00 00 02 B0 26 + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AB 86 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1E + 39 00 00 00 00 00 02 A8 94 + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A3 13 + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 01 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F E0 + 39 00 00 00 00 00 02 7E DF + 39 00 00 00 00 00 02 7D DE + 39 00 00 00 00 00 02 7C DD + 39 00 00 00 00 00 02 7B DD + 39 00 00 00 00 00 02 7A DC + 39 00 00 00 00 00 02 79 DB + 39 00 00 00 00 00 02 78 DA + 39 00 00 00 00 00 02 77 DA + 39 00 00 00 00 00 02 76 D9 + 39 00 00 00 00 00 02 75 D8 + 39 00 00 00 00 00 02 74 D7 + 39 00 00 00 00 00 02 73 D7 + 39 00 00 00 00 00 02 72 D6 + 39 00 00 00 00 00 02 71 D5 + 39 00 00 00 00 00 02 70 D4 + 39 00 00 00 00 00 02 6F D4 + 39 00 00 00 00 00 02 6E D3 + 39 00 00 00 00 00 02 6D D2 + 39 00 00 00 00 00 02 6C D2 + 39 00 00 00 00 00 02 6B D1 + 39 00 00 00 00 00 02 6A D0 + 39 00 00 00 00 00 02 69 D0 + 39 00 00 00 00 00 02 68 CF + 39 00 00 00 00 00 02 67 CE + 39 00 00 00 00 00 02 66 CE + 39 00 00 00 00 00 02 65 CD + 39 00 00 00 00 00 02 64 CD + 39 00 00 00 00 00 02 63 CC + 39 00 00 00 00 00 02 62 CB + 39 00 00 00 00 00 02 61 CA + 39 00 00 00 00 00 02 60 C9 + 39 00 00 00 00 00 02 5F C8 + 39 00 00 00 00 00 02 5E C7 + 39 00 00 00 00 00 02 5D C6 + 39 00 00 00 00 00 02 5C C5 + 39 00 00 00 00 00 02 5B C4 + 39 00 00 00 00 00 02 5A C3 + 39 00 00 00 00 00 02 59 C1 + 39 00 00 00 00 00 02 58 C0 + 39 00 00 00 00 00 02 57 BF + 39 00 00 00 00 00 02 56 BE + 39 00 00 00 00 00 02 55 BE + 39 00 00 00 00 00 02 54 BD + 39 00 00 00 00 00 02 53 BC + 39 00 00 00 00 00 02 52 BC + 39 00 00 00 00 00 02 51 BB + 39 00 00 00 00 00 02 50 BA + 39 00 00 00 00 00 02 4F B9 + 39 00 00 00 00 00 02 4E B8 + 39 00 00 00 00 00 02 4D B8 + 39 00 00 00 00 00 02 4C B7 + 39 00 00 00 00 00 02 4B B7 + 39 00 00 00 00 00 02 4A B6 + 39 00 00 00 00 00 02 49 B6 + 39 00 00 00 00 00 02 48 B5 + 39 00 00 00 00 00 02 47 B4 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 45 B4 + 39 00 00 00 00 00 02 44 B3 + 39 00 00 00 00 00 02 43 B3 + 39 00 00 00 00 00 02 42 B3 + 39 00 00 00 00 00 02 41 B2 + 39 00 00 00 00 00 02 40 B1 + 39 00 00 00 00 00 02 3F B0 + 39 00 00 00 00 00 02 3E AF + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3C AC + 39 00 00 00 00 00 02 3B AC + 39 00 00 00 00 00 02 3A AC + 39 00 00 00 00 00 02 39 AB + 39 00 00 00 00 00 02 38 AA + 39 00 00 00 00 00 02 37 A9 + 39 00 00 00 00 00 02 36 A8 + 39 00 00 00 00 00 02 35 A7 + 39 00 00 00 00 00 02 34 A6 + 39 00 00 00 00 00 02 33 A6 + 39 00 00 00 00 00 02 32 A5 + 39 00 00 00 00 00 02 31 A5 + 39 00 00 00 00 00 02 30 A4 + 39 00 00 00 00 00 02 2F A4 + 39 00 00 00 00 00 02 2E A3 + 39 00 00 00 00 00 02 2D A3 + 39 00 00 00 00 00 02 2C A2 + 39 00 00 00 00 00 02 2B A0 + 39 00 00 00 00 00 02 2A 9F + 39 00 00 00 00 00 02 29 9D + 39 00 00 00 00 00 02 28 9B + 39 00 00 00 00 00 02 27 9A + 39 00 00 00 00 00 02 26 99 + 39 00 00 00 00 00 02 25 9A + 39 00 00 00 00 00 02 24 99 + 39 00 00 00 00 00 02 23 99 + 39 00 00 00 00 00 02 22 98 + 39 00 00 00 00 00 02 21 98 + 39 00 00 00 00 00 02 20 97 + 39 00 00 00 00 00 02 1F 97 + 39 00 00 00 00 00 02 1E 96 + 39 00 00 00 00 00 02 1D 96 + 39 00 00 00 00 00 02 1C 95 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1A 92 + 39 00 00 00 00 00 02 19 91 + 39 00 00 00 00 00 02 18 90 + 39 00 00 00 00 00 02 17 90 + 39 00 00 00 00 00 02 16 90 + 39 00 00 00 00 00 02 15 90 + 39 00 00 00 00 00 02 14 8F + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 12 8D + 39 00 00 00 00 00 02 11 8D + 39 00 00 00 00 00 02 10 8C + 39 00 00 00 00 00 02 0F 8C + 39 00 00 00 00 00 02 0E 8B + 39 00 00 00 00 00 02 0D 89 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0A 87 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 07 85 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 82 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + + + + + qcom,mdss-dsi-panel-eye-command03= [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 04 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 38 07 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 02 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 03 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 74 02 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 01 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7C 00 + 39 00 00 00 00 00 02 7D 00 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7F 00 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0E 85 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 12 87 + 39 00 00 00 00 00 02 13 87 + 39 00 00 00 00 00 02 14 87 + 39 00 00 00 00 00 02 15 87 + 39 00 00 00 00 00 02 16 88 + 39 00 00 00 00 00 02 17 88 + 39 00 00 00 00 00 02 18 89 + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 1A 8A + 39 00 00 00 00 00 02 1B 8A + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1D 8A + 39 00 00 00 00 00 02 1E 8A + 39 00 00 00 00 00 02 1F 8A + 39 00 00 00 00 00 02 20 8A + 39 00 00 00 00 00 02 21 8A + 39 00 00 00 00 00 02 22 8B + 39 00 00 00 00 00 02 23 8B + 39 00 00 00 00 00 02 24 8C + 39 00 00 00 00 00 02 25 8C + 39 00 00 00 00 00 02 26 8D + 39 00 00 00 00 00 02 27 8E + 39 00 00 00 00 00 02 28 8D + 39 00 00 00 00 00 02 29 8B + 39 00 00 00 00 00 02 2A 8A + 39 00 00 00 00 00 02 2B 8B + 39 00 00 00 00 00 02 2C 8C + 39 00 00 00 00 00 02 2D 8D + 39 00 00 00 00 00 02 2E 8E + 39 00 00 00 00 00 02 2F 8E + 39 00 00 00 00 00 02 30 8E + 39 00 00 00 00 00 02 31 8F + 39 00 00 00 00 00 02 32 8F + 39 00 00 00 00 00 02 33 90 + 39 00 00 00 00 00 02 34 91 + 39 00 00 00 00 00 02 35 91 + 39 00 00 00 00 00 02 36 92 + 39 00 00 00 00 00 02 37 93 + 39 00 00 00 00 00 02 38 93 + 39 00 00 00 00 00 02 39 94 + 39 00 00 00 00 00 02 3A 94 + 39 00 00 00 00 00 02 3B 95 + 39 00 00 00 00 00 02 3C 95 + 39 00 00 00 00 00 02 3D 94 + 39 00 00 00 00 00 02 3E 93 + 39 00 00 00 00 00 02 3F 93 + 39 00 00 00 00 00 02 40 94 + 39 00 00 00 00 00 02 41 94 + 39 00 00 00 00 00 02 42 95 + 39 00 00 00 00 00 02 43 95 + 39 00 00 00 00 00 02 44 96 + 39 00 00 00 00 00 02 45 96 + 39 00 00 00 00 00 02 46 96 + 39 00 00 00 00 00 02 47 96 + 39 00 00 00 00 00 02 48 97 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 4A 98 + 39 00 00 00 00 00 02 4B 98 + 39 00 00 00 00 00 02 4C 99 + 39 00 00 00 00 00 02 4D 99 + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 51 9C + 39 00 00 00 00 00 02 52 9C + 39 00 00 00 00 00 02 53 9D + 39 00 00 00 00 00 02 54 9E + 39 00 00 00 00 00 02 55 9E + 39 00 00 00 00 00 02 56 9F + 39 00 00 00 00 00 02 57 9F + 39 00 00 00 00 00 02 58 A0 + 39 00 00 00 00 00 02 59 A1 + 39 00 00 00 00 00 02 5A A1 + 39 00 00 00 00 00 02 5B A1 + 39 00 00 00 00 00 02 5C A1 + 39 00 00 00 00 00 02 5D A2 + 39 00 00 00 00 00 02 5E A2 + 39 00 00 00 00 00 02 5F A2 + 39 00 00 00 00 00 02 60 A2 + 39 00 00 00 00 00 02 61 A2 + 39 00 00 00 00 00 02 62 A2 + 39 00 00 00 00 00 02 63 A3 + 39 00 00 00 00 00 02 64 A3 + 39 00 00 00 00 00 02 65 A3 + 39 00 00 00 00 00 02 66 A3 + 39 00 00 00 00 00 02 67 A3 + 39 00 00 00 00 00 02 68 A4 + 39 00 00 00 00 00 02 69 A4 + 39 00 00 00 00 00 02 6A A4 + 39 00 00 00 00 00 02 6B A5 + 39 00 00 00 00 00 02 6C A5 + 39 00 00 00 00 00 02 6D A5 + 39 00 00 00 00 00 02 6E A6 + 39 00 00 00 00 00 02 6F A6 + 39 00 00 00 00 00 02 70 A6 + 39 00 00 00 00 00 02 71 A6 + 39 00 00 00 00 00 02 72 A7 + 39 00 00 00 00 00 02 73 A7 + 39 00 00 00 00 00 02 74 A7 + 39 00 00 00 00 00 02 75 A8 + 39 00 00 00 00 00 02 76 A8 + 39 00 00 00 00 00 02 77 A8 + 39 00 00 00 00 00 02 78 A8 + 39 00 00 00 00 00 02 79 A9 + 39 00 00 00 00 00 02 7A A9 + 39 00 00 00 00 00 02 7B AA + 39 00 00 00 00 00 02 7C AA + 39 00 00 00 00 00 02 7D AA + 39 00 00 00 00 00 02 7E AB + 39 00 00 00 00 00 02 7F AC + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 84 + 39 00 00 00 00 00 02 09 85 + 39 00 00 00 00 00 02 0A 85 + 39 00 00 00 00 00 02 0B 86 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0D 87 + 39 00 00 00 00 00 02 0E 88 + 39 00 00 00 00 00 02 0F 88 + 39 00 00 00 00 00 02 10 89 + 39 00 00 00 00 00 02 11 89 + 39 00 00 00 00 00 02 12 8A + 39 00 00 00 00 00 02 13 8B + 39 00 00 00 00 00 02 14 8B + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 16 8C + 39 00 00 00 00 00 02 17 8D + 39 00 00 00 00 00 02 18 8D + 39 00 00 00 00 00 02 19 8E + 39 00 00 00 00 00 02 1A 8F + 39 00 00 00 00 00 02 1B 8F + 39 00 00 00 00 00 02 1C 90 + 39 00 00 00 00 00 02 1D 90 + 39 00 00 00 00 00 02 1E 90 + 39 00 00 00 00 00 02 1F 91 + 39 00 00 00 00 00 02 20 6F + 39 00 00 00 00 00 02 21 6F + 39 00 00 00 00 00 02 22 6E + 39 00 00 00 00 00 02 23 6E + 39 00 00 00 00 00 02 24 6E + 39 00 00 00 00 00 02 25 6D + 39 00 00 00 00 00 02 26 6C + 39 00 00 00 00 00 02 27 6B + 39 00 00 00 00 00 02 28 6B + 39 00 00 00 00 00 02 29 6A + 39 00 00 00 00 00 02 2A 6A + 39 00 00 00 00 00 02 2B 6B + 39 00 00 00 00 00 02 2C 6C + 39 00 00 00 00 00 02 2D 6C + 39 00 00 00 00 00 02 2E 6B + 39 00 00 00 00 00 02 2F 6A + 39 00 00 00 00 00 02 30 69 + 39 00 00 00 00 00 02 31 68 + 39 00 00 00 00 00 02 32 67 + 39 00 00 00 00 00 02 33 67 + 39 00 00 00 00 00 02 34 66 + 39 00 00 00 00 00 02 35 65 + 39 00 00 00 00 00 02 36 64 + 39 00 00 00 00 00 02 37 63 + 39 00 00 00 00 00 02 38 63 + 39 00 00 00 00 00 02 39 62 + 39 00 00 00 00 00 02 3A 61 + 39 00 00 00 00 00 02 3B 60 + 39 00 00 00 00 00 02 3C 5F + 39 00 00 00 00 00 02 3D 5E + 39 00 00 00 00 00 02 3E 5E + 39 00 00 00 00 00 02 3F 5E + 39 00 00 00 00 00 02 40 5E + 39 00 00 00 00 00 02 41 5F + 39 00 00 00 00 00 02 42 5F + 39 00 00 00 00 00 02 43 5E + 39 00 00 00 00 00 02 44 5D + 39 00 00 00 00 00 02 45 5D + 39 00 00 00 00 00 02 46 5C + 39 00 00 00 00 00 02 47 5B + 39 00 00 00 00 00 02 48 5B + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 4A 5A + 39 00 00 00 00 00 02 4B 59 + 39 00 00 00 00 00 02 4C 59 + 39 00 00 00 00 00 02 4D 58 + 39 00 00 00 00 00 02 4E 57 + 39 00 00 00 00 00 02 4F 57 + 39 00 00 00 00 00 02 50 56 + 39 00 00 00 00 00 02 51 55 + 39 00 00 00 00 00 02 52 55 + 39 00 00 00 00 00 02 53 54 + 39 00 00 00 00 00 02 54 53 + 39 00 00 00 00 00 02 55 52 + 39 00 00 00 00 00 02 56 51 + 39 00 00 00 00 00 02 57 51 + 39 00 00 00 00 00 02 58 50 + 39 00 00 00 00 00 02 59 4F + 39 00 00 00 00 00 02 5A 4E + 39 00 00 00 00 00 02 5B 4D + 39 00 00 00 00 00 02 5C 4C + 39 00 00 00 00 00 02 5D 4B + 39 00 00 00 00 00 02 5E 4A + 39 00 00 00 00 00 02 5F 4A + 39 00 00 00 00 00 02 60 49 + 39 00 00 00 00 00 02 61 49 + 39 00 00 00 00 00 02 62 49 + 39 00 00 00 00 00 02 63 48 + 39 00 00 00 00 00 02 64 48 + 39 00 00 00 00 00 02 65 48 + 39 00 00 00 00 00 02 66 47 + 39 00 00 00 00 00 02 67 47 + 39 00 00 00 00 00 02 68 46 + 39 00 00 00 00 00 02 69 46 + 39 00 00 00 00 00 02 6A 45 + 39 00 00 00 00 00 02 6B 45 + 39 00 00 00 00 00 02 6C 44 + 39 00 00 00 00 00 02 6D 44 + 39 00 00 00 00 00 02 6E 43 + 39 00 00 00 00 00 02 6F 43 + 39 00 00 00 00 00 02 70 42 + 39 00 00 00 00 00 02 71 42 + 39 00 00 00 00 00 02 72 41 + 39 00 00 00 00 00 02 73 41 + 39 00 00 00 00 00 02 74 40 + 39 00 00 00 00 00 02 75 40 + 39 00 00 00 00 00 02 76 3F + 39 00 00 00 00 00 02 77 3F + 39 00 00 00 00 00 02 78 3E + 39 00 00 00 00 00 02 79 3E + 39 00 00 00 00 00 02 7A 3D + 39 00 00 00 00 00 02 7B 3C + 39 00 00 00 00 00 02 7C 3C + 39 00 00 00 00 00 02 7D 3B + 39 00 00 00 00 00 02 7E 3B + 39 00 00 00 00 00 02 7F 3A + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 25 85 + 39 00 00 00 00 00 02 26 85 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 88 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 44 88 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4D 86 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 50 87 + 39 00 00 00 00 00 02 51 87 + 39 00 00 00 00 00 02 52 87 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 58 87 + 39 00 00 00 00 00 02 59 87 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5C 85 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5F 86 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 62 87 + 39 00 00 00 00 00 02 63 87 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 65 86 + 39 00 00 00 00 00 02 66 86 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 68 85 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 6A 86 + 39 00 00 00 00 00 02 6B 86 + 39 00 00 00 00 00 02 6C 87 + 39 00 00 00 00 00 02 6D 87 + 39 00 00 00 00 00 02 6E 87 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 72 86 + 39 00 00 00 00 00 02 73 86 + 39 00 00 00 00 00 02 74 86 + 39 00 00 00 00 00 02 75 86 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 77 85 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 7A 85 + 39 00 00 00 00 00 02 7B 85 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7E 86 + 39 00 00 00 00 00 02 7F 85 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 AD + 39 00 00 00 00 00 02 02 AE + 39 00 00 00 00 00 02 03 AE + 39 00 00 00 00 00 02 04 AF + 39 00 00 00 00 00 02 05 AF + 39 00 00 00 00 00 02 06 B0 + 39 00 00 00 00 00 02 07 B0 + 39 00 00 00 00 00 02 08 B1 + 39 00 00 00 00 00 02 09 B1 + 39 00 00 00 00 00 02 0A B2 + 39 00 00 00 00 00 02 0B B2 + 39 00 00 00 00 00 02 0C B3 + 39 00 00 00 00 00 02 0D B3 + 39 00 00 00 00 00 02 0E B4 + 39 00 00 00 00 00 02 0F B4 + 39 00 00 00 00 00 02 10 B4 + 39 00 00 00 00 00 02 11 B4 + 39 00 00 00 00 00 02 12 B5 + 39 00 00 00 00 00 02 13 B5 + 39 00 00 00 00 00 02 14 B6 + 39 00 00 00 00 00 02 15 B6 + 39 00 00 00 00 00 02 16 B6 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 B7 + 39 00 00 00 00 00 02 19 B7 + 39 00 00 00 00 00 02 1A B8 + 39 00 00 00 00 00 02 1B B8 + 39 00 00 00 00 00 02 1C B8 + 39 00 00 00 00 00 02 1D B8 + 39 00 00 00 00 00 02 1E B8 + 39 00 00 00 00 00 02 1F B8 + 39 00 00 00 00 00 02 20 B9 + 39 00 00 00 00 00 02 21 BA + 39 00 00 00 00 00 02 22 BA + 39 00 00 00 00 00 02 23 BB + 39 00 00 00 00 00 02 24 BC + 39 00 00 00 00 00 02 25 BC + 39 00 00 00 00 00 02 26 BD + 39 00 00 00 00 00 02 27 BD + 39 00 00 00 00 00 02 28 BE + 39 00 00 00 00 00 02 29 BE + 39 00 00 00 00 00 02 2A BF + 39 00 00 00 00 00 02 2B BF + 39 00 00 00 00 00 02 2C BF + 39 00 00 00 00 00 02 2D C0 + 39 00 00 00 00 00 02 2E C0 + 39 00 00 00 00 00 02 2F C0 + 39 00 00 00 00 00 02 30 C1 + 39 00 00 00 00 00 02 31 C1 + 39 00 00 00 00 00 02 32 C1 + 39 00 00 00 00 00 02 33 C1 + 39 00 00 00 00 00 02 34 C2 + 39 00 00 00 00 00 02 35 C3 + 39 00 00 00 00 00 02 36 C2 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 C2 + 39 00 00 00 00 00 02 39 C2 + 39 00 00 00 00 00 02 3A C2 + 39 00 00 00 00 00 02 3B C3 + 39 00 00 00 00 00 02 3C C3 + 39 00 00 00 00 00 02 3D C3 + 39 00 00 00 00 00 02 3E C3 + 39 00 00 00 00 00 02 3F C2 + 39 00 00 00 00 00 02 40 C3 + 39 00 00 00 00 00 02 41 C4 + 39 00 00 00 00 00 02 42 C4 + 39 00 00 00 00 00 02 43 C5 + 39 00 00 00 00 00 02 44 C6 + 39 00 00 00 00 00 02 45 C7 + 39 00 00 00 00 00 02 46 C7 + 39 00 00 00 00 00 02 47 C8 + 39 00 00 00 00 00 02 48 C9 + 39 00 00 00 00 00 02 49 CA + 39 00 00 00 00 00 02 4A CA + 39 00 00 00 00 00 02 4B CB + 39 00 00 00 00 00 02 4C CC + 39 00 00 00 00 00 02 4D CC + 39 00 00 00 00 00 02 4E CC + 39 00 00 00 00 00 02 4F CD + 39 00 00 00 00 00 02 50 CD + 39 00 00 00 00 00 02 51 CE + 39 00 00 00 00 00 02 52 CE + 39 00 00 00 00 00 02 53 CE + 39 00 00 00 00 00 02 54 CF + 39 00 00 00 00 00 02 55 CF + 39 00 00 00 00 00 02 56 CF + 39 00 00 00 00 00 02 57 CF + 39 00 00 00 00 00 02 58 CF + 39 00 00 00 00 00 02 59 CF + 39 00 00 00 00 00 02 5A CF + 39 00 00 00 00 00 02 5B CF + 39 00 00 00 00 00 02 5C CF + 39 00 00 00 00 00 02 5D CF + 39 00 00 00 00 00 02 5E CF + 39 00 00 00 00 00 02 5F CF + 39 00 00 00 00 00 02 60 CF + 39 00 00 00 00 00 02 61 D0 + 39 00 00 00 00 00 02 62 D1 + 39 00 00 00 00 00 02 63 D1 + 39 00 00 00 00 00 02 64 D2 + 39 00 00 00 00 00 02 65 D2 + 39 00 00 00 00 00 02 66 D3 + 39 00 00 00 00 00 02 67 D3 + 39 00 00 00 00 00 02 68 D3 + 39 00 00 00 00 00 02 69 D3 + 39 00 00 00 00 00 02 6A D4 + 39 00 00 00 00 00 02 6B D4 + 39 00 00 00 00 00 02 6C D4 + 39 00 00 00 00 00 02 6D D4 + 39 00 00 00 00 00 02 6E D4 + 39 00 00 00 00 00 02 6F D3 + 39 00 00 00 00 00 02 70 D4 + 39 00 00 00 00 00 02 71 D4 + 39 00 00 00 00 00 02 72 D5 + 39 00 00 00 00 00 02 73 D5 + 39 00 00 00 00 00 02 74 D6 + 39 00 00 00 00 00 02 75 D6 + 39 00 00 00 00 00 02 76 D7 + 39 00 00 00 00 00 02 77 D7 + 39 00 00 00 00 00 02 78 D7 + 39 00 00 00 00 00 02 79 D8 + 39 00 00 00 00 00 02 7A D8 + 39 00 00 00 00 00 02 7B D8 + 39 00 00 00 00 00 02 7C D8 + 39 00 00 00 00 00 02 7D D8 + 39 00 00 00 00 00 02 7E D8 + 39 00 00 00 00 00 02 7F D9 + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 39 + 39 00 00 00 00 00 02 02 38 + 39 00 00 00 00 00 02 03 38 + 39 00 00 00 00 00 02 04 38 + 39 00 00 00 00 00 02 05 36 + 39 00 00 00 00 00 02 06 35 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 08 34 + 39 00 00 00 00 00 02 09 33 + 39 00 00 00 00 00 02 0A 32 + 39 00 00 00 00 00 02 0B 31 + 39 00 00 00 00 00 02 0C 30 + 39 00 00 00 00 00 02 0D 30 + 39 00 00 00 00 00 02 0E 2F + 39 00 00 00 00 00 02 0F 2E + 39 00 00 00 00 00 02 10 2D + 39 00 00 00 00 00 02 11 2D + 39 00 00 00 00 00 02 12 2C + 39 00 00 00 00 00 02 13 2B + 39 00 00 00 00 00 02 14 2A + 39 00 00 00 00 00 02 15 2A + 39 00 00 00 00 00 02 16 29 + 39 00 00 00 00 00 02 17 28 + 39 00 00 00 00 00 02 18 28 + 39 00 00 00 00 00 02 19 27 + 39 00 00 00 00 00 02 1A 26 + 39 00 00 00 00 00 02 1B 26 + 39 00 00 00 00 00 02 1C 25 + 39 00 00 00 00 00 02 1D 25 + 39 00 00 00 00 00 02 1E 24 + 39 00 00 00 00 00 02 1F 23 + 39 00 00 00 00 00 02 20 23 + 39 00 00 00 00 00 02 21 22 + 39 00 00 00 00 00 02 22 21 + 39 00 00 00 00 00 02 23 21 + 39 00 00 00 00 00 02 24 20 + 39 00 00 00 00 00 02 25 20 + 39 00 00 00 00 00 02 26 20 + 39 00 00 00 00 00 02 27 1F + 39 00 00 00 00 00 02 28 1F + 39 00 00 00 00 00 02 29 1E + 39 00 00 00 00 00 02 2A 1D + 39 00 00 00 00 00 02 2B 1C + 39 00 00 00 00 00 02 2C 1B + 39 00 00 00 00 00 02 2D 1A + 39 00 00 00 00 00 02 2E 1A + 39 00 00 00 00 00 02 2F 19 + 39 00 00 00 00 00 02 30 18 + 39 00 00 00 00 00 02 31 17 + 39 00 00 00 00 00 02 32 16 + 39 00 00 00 00 00 02 33 16 + 39 00 00 00 00 00 02 34 15 + 39 00 00 00 00 00 02 35 14 + 39 00 00 00 00 00 02 36 13 + 39 00 00 00 00 00 02 37 13 + 39 00 00 00 00 00 02 38 12 + 39 00 00 00 00 00 02 39 11 + 39 00 00 00 00 00 02 3A 11 + 39 00 00 00 00 00 02 3B 10 + 39 00 00 00 00 00 02 3C 0F + 39 00 00 00 00 00 02 3D 0F + 39 00 00 00 00 00 02 3E 0E + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 40 0D + 39 00 00 00 00 00 02 41 0C + 39 00 00 00 00 00 02 42 0B + 39 00 00 00 00 00 02 43 0B + 39 00 00 00 00 00 02 44 0B + 39 00 00 00 00 00 02 45 0B + 39 00 00 00 00 00 02 46 0A + 39 00 00 00 00 00 02 47 0A + 39 00 00 00 00 00 02 48 09 + 39 00 00 00 00 00 02 49 09 + 39 00 00 00 00 00 02 4A 09 + 39 00 00 00 00 00 02 4B 08 + 39 00 00 00 00 00 02 4C 08 + 39 00 00 00 00 00 02 4D 08 + 39 00 00 00 00 00 02 4E 07 + 39 00 00 00 00 00 02 4F 05 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 01 + 39 00 00 00 00 00 02 54 00 + 39 00 00 00 00 00 02 55 81 + 39 00 00 00 00 00 02 56 82 + 39 00 00 00 00 00 02 57 83 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 5B 87 + 39 00 00 00 00 00 02 5C 88 + 39 00 00 00 00 00 02 5D 88 + 39 00 00 00 00 00 02 5E 89 + 39 00 00 00 00 00 02 5F 8A + 39 00 00 00 00 00 02 60 8B + 39 00 00 00 00 00 02 61 8B + 39 00 00 00 00 00 02 62 8C + 39 00 00 00 00 00 02 63 8D + 39 00 00 00 00 00 02 64 8E + 39 00 00 00 00 00 02 65 8E + 39 00 00 00 00 00 02 66 8F + 39 00 00 00 00 00 02 67 8F + 39 00 00 00 00 00 02 68 90 + 39 00 00 00 00 00 02 69 90 + 39 00 00 00 00 00 02 6A 91 + 39 00 00 00 00 00 02 6B 91 + 39 00 00 00 00 00 02 6C 91 + 39 00 00 00 00 00 02 6D 92 + 39 00 00 00 00 00 02 6E 92 + 39 00 00 00 00 00 02 6F 92 + 39 00 00 00 00 00 02 70 93 + 39 00 00 00 00 00 02 71 94 + 39 00 00 00 00 00 02 72 95 + 39 00 00 00 00 00 02 73 96 + 39 00 00 00 00 00 02 74 97 + 39 00 00 00 00 00 02 75 98 + 39 00 00 00 00 00 02 76 99 + 39 00 00 00 00 00 02 77 9A + 39 00 00 00 00 00 02 78 9B + 39 00 00 00 00 00 02 79 9B + 39 00 00 00 00 00 02 7A 9C + 39 00 00 00 00 00 02 7B 9D + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7D 9E + 39 00 00 00 00 00 02 7E 9F + 39 00 00 00 00 00 02 7F 9F + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F AC + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 AC + 39 00 00 00 00 00 02 7F D9 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 3A + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 3a + 39 00 00 00 00 00 02 7F 9F + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F 9F + 39 00 00 00 00 00 02 7E 9F + 39 00 00 00 00 00 02 7D 9E + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7B 9D + 39 00 00 00 00 00 02 7A 9C + 39 00 00 00 00 00 02 79 9B + 39 00 00 00 00 00 02 78 9B + 39 00 00 00 00 00 02 77 9A + 39 00 00 00 00 00 02 76 99 + 39 00 00 00 00 00 02 75 98 + 39 00 00 00 00 00 02 74 97 + 39 00 00 00 00 00 02 73 96 + 39 00 00 00 00 00 02 72 95 + 39 00 00 00 00 00 02 71 94 + 39 00 00 00 00 00 02 70 93 + 39 00 00 00 00 00 02 6F 92 + 39 00 00 00 00 00 02 6E 92 + 39 00 00 00 00 00 02 6D 92 + 39 00 00 00 00 00 02 6C 91 + 39 00 00 00 00 00 02 6B 91 + 39 00 00 00 00 00 02 6A 91 + 39 00 00 00 00 00 02 69 90 + 39 00 00 00 00 00 02 68 90 + 39 00 00 00 00 00 02 67 8F + 39 00 00 00 00 00 02 66 8F + 39 00 00 00 00 00 02 65 8E + 39 00 00 00 00 00 02 64 8E + 39 00 00 00 00 00 02 63 8D + 39 00 00 00 00 00 02 62 8C + 39 00 00 00 00 00 02 61 8B + 39 00 00 00 00 00 02 60 8B + 39 00 00 00 00 00 02 5F 8A + 39 00 00 00 00 00 02 5E 89 + 39 00 00 00 00 00 02 5D 88 + 39 00 00 00 00 00 02 5C 88 + 39 00 00 00 00 00 02 5B 87 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 57 83 + 39 00 00 00 00 00 02 56 82 + 39 00 00 00 00 00 02 55 81 + 39 00 00 00 00 00 02 54 00 + 39 00 00 00 00 00 02 53 01 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 4F 05 + 39 00 00 00 00 00 02 4E 07 + 39 00 00 00 00 00 02 4D 08 + 39 00 00 00 00 00 02 4C 08 + 39 00 00 00 00 00 02 4B 08 + 39 00 00 00 00 00 02 4A 09 + 39 00 00 00 00 00 02 49 09 + 39 00 00 00 00 00 02 48 09 + 39 00 00 00 00 00 02 47 0A + 39 00 00 00 00 00 02 46 0A + 39 00 00 00 00 00 02 45 0B + 39 00 00 00 00 00 02 44 0B + 39 00 00 00 00 00 02 43 0B + 39 00 00 00 00 00 02 42 0B + 39 00 00 00 00 00 02 41 0C + 39 00 00 00 00 00 02 40 0D + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 3E 0E + 39 00 00 00 00 00 02 3D 0F + 39 00 00 00 00 00 02 3C 0F + 39 00 00 00 00 00 02 3B 10 + 39 00 00 00 00 00 02 3A 11 + 39 00 00 00 00 00 02 39 11 + 39 00 00 00 00 00 02 38 12 + 39 00 00 00 00 00 02 37 13 + 39 00 00 00 00 00 02 36 13 + 39 00 00 00 00 00 02 35 14 + 39 00 00 00 00 00 02 34 15 + 39 00 00 00 00 00 02 33 16 + 39 00 00 00 00 00 02 32 16 + 39 00 00 00 00 00 02 31 17 + 39 00 00 00 00 00 02 30 18 + 39 00 00 00 00 00 02 2F 19 + 39 00 00 00 00 00 02 2E 1A + 39 00 00 00 00 00 02 2D 1A + 39 00 00 00 00 00 02 2C 1B + 39 00 00 00 00 00 02 2B 1C + 39 00 00 00 00 00 02 2A 1D + 39 00 00 00 00 00 02 29 1E + 39 00 00 00 00 00 02 28 1F + 39 00 00 00 00 00 02 27 1F + 39 00 00 00 00 00 02 26 20 + 39 00 00 00 00 00 02 25 20 + 39 00 00 00 00 00 02 24 20 + 39 00 00 00 00 00 02 23 21 + 39 00 00 00 00 00 02 22 21 + 39 00 00 00 00 00 02 21 22 + 39 00 00 00 00 00 02 20 23 + 39 00 00 00 00 00 02 1F 23 + 39 00 00 00 00 00 02 1E 24 + 39 00 00 00 00 00 02 1D 25 + 39 00 00 00 00 00 02 1C 25 + 39 00 00 00 00 00 02 1B 26 + 39 00 00 00 00 00 02 1A 26 + 39 00 00 00 00 00 02 19 27 + 39 00 00 00 00 00 02 18 28 + 39 00 00 00 00 00 02 17 28 + 39 00 00 00 00 00 02 16 29 + 39 00 00 00 00 00 02 15 2A + 39 00 00 00 00 00 02 14 2A + 39 00 00 00 00 00 02 13 2B + 39 00 00 00 00 00 02 12 2C + 39 00 00 00 00 00 02 11 2D + 39 00 00 00 00 00 02 10 2D + 39 00 00 00 00 00 02 0F 2E + 39 00 00 00 00 00 02 0E 2F + 39 00 00 00 00 00 02 0D 30 + 39 00 00 00 00 00 02 0C 30 + 39 00 00 00 00 00 02 0B 31 + 39 00 00 00 00 00 02 0A 32 + 39 00 00 00 00 00 02 09 33 + 39 00 00 00 00 00 02 08 34 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 06 35 + 39 00 00 00 00 00 02 05 36 + 39 00 00 00 00 00 02 04 38 + 39 00 00 00 00 00 02 03 38 + 39 00 00 00 00 00 02 02 38 + 39 00 00 00 00 00 02 01 39 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 02 7E 86 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7B 85 + 39 00 00 00 00 00 02 7A 85 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 77 85 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 75 86 + 39 00 00 00 00 00 02 74 86 + 39 00 00 00 00 00 02 73 86 + 39 00 00 00 00 00 02 72 86 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 6E 87 + 39 00 00 00 00 00 02 6D 87 + 39 00 00 00 00 00 02 6C 87 + 39 00 00 00 00 00 02 6B 86 + 39 00 00 00 00 00 02 6A 86 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 68 85 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 66 86 + 39 00 00 00 00 00 02 65 86 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 63 87 + 39 00 00 00 00 00 02 62 87 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 5F 86 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5C 85 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 59 87 + 39 00 00 00 00 00 02 58 87 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 52 87 + 39 00 00 00 00 00 02 51 87 + 39 00 00 00 00 00 02 50 87 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4D 86 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 44 88 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3C 88 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 26 85 + 39 00 00 00 00 00 02 25 85 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F D9 + 39 00 00 00 00 00 02 7E D8 + 39 00 00 00 00 00 02 7D D8 + 39 00 00 00 00 00 02 7C D8 + 39 00 00 00 00 00 02 7B D8 + 39 00 00 00 00 00 02 7A D8 + 39 00 00 00 00 00 02 79 D8 + 39 00 00 00 00 00 02 78 D7 + 39 00 00 00 00 00 02 77 D7 + 39 00 00 00 00 00 02 76 D7 + 39 00 00 00 00 00 02 75 D6 + 39 00 00 00 00 00 02 74 D6 + 39 00 00 00 00 00 02 73 D5 + 39 00 00 00 00 00 02 72 D5 + 39 00 00 00 00 00 02 71 D4 + 39 00 00 00 00 00 02 70 D4 + 39 00 00 00 00 00 02 6F D3 + 39 00 00 00 00 00 02 6E D4 + 39 00 00 00 00 00 02 6D D4 + 39 00 00 00 00 00 02 6C D4 + 39 00 00 00 00 00 02 6B D4 + 39 00 00 00 00 00 02 6A D4 + 39 00 00 00 00 00 02 69 D3 + 39 00 00 00 00 00 02 68 D3 + 39 00 00 00 00 00 02 67 D3 + 39 00 00 00 00 00 02 66 D3 + 39 00 00 00 00 00 02 65 D2 + 39 00 00 00 00 00 02 64 D2 + 39 00 00 00 00 00 02 63 D1 + 39 00 00 00 00 00 02 62 D1 + 39 00 00 00 00 00 02 61 D0 + 39 00 00 00 00 00 02 60 CF + 39 00 00 00 00 00 02 5F CF + 39 00 00 00 00 00 02 5E CF + 39 00 00 00 00 00 02 5D CF + 39 00 00 00 00 00 02 5C CF + 39 00 00 00 00 00 02 5B CF + 39 00 00 00 00 00 02 5A CF + 39 00 00 00 00 00 02 59 CF + 39 00 00 00 00 00 02 58 CF + 39 00 00 00 00 00 02 57 CF + 39 00 00 00 00 00 02 56 CF + 39 00 00 00 00 00 02 55 CF + 39 00 00 00 00 00 02 54 CF + 39 00 00 00 00 00 02 53 CE + 39 00 00 00 00 00 02 52 CE + 39 00 00 00 00 00 02 51 CE + 39 00 00 00 00 00 02 50 CD + 39 00 00 00 00 00 02 4F CD + 39 00 00 00 00 00 02 4E CC + 39 00 00 00 00 00 02 4D CC + 39 00 00 00 00 00 02 4C CC + 39 00 00 00 00 00 02 4B CB + 39 00 00 00 00 00 02 4A CA + 39 00 00 00 00 00 02 49 CA + 39 00 00 00 00 00 02 48 C9 + 39 00 00 00 00 00 02 47 C8 + 39 00 00 00 00 00 02 46 C7 + 39 00 00 00 00 00 02 45 C7 + 39 00 00 00 00 00 02 44 C6 + 39 00 00 00 00 00 02 43 C5 + 39 00 00 00 00 00 02 42 C4 + 39 00 00 00 00 00 02 41 C4 + 39 00 00 00 00 00 02 40 C3 + 39 00 00 00 00 00 02 3F C2 + 39 00 00 00 00 00 02 3E C3 + 39 00 00 00 00 00 02 3D C3 + 39 00 00 00 00 00 02 3C C3 + 39 00 00 00 00 00 02 3B C3 + 39 00 00 00 00 00 02 3A C2 + 39 00 00 00 00 00 02 39 C2 + 39 00 00 00 00 00 02 38 C2 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 36 C2 + 39 00 00 00 00 00 02 35 C3 + 39 00 00 00 00 00 02 34 C2 + 39 00 00 00 00 00 02 33 C1 + 39 00 00 00 00 00 02 32 C1 + 39 00 00 00 00 00 02 31 C1 + 39 00 00 00 00 00 02 30 C1 + 39 00 00 00 00 00 02 2F C0 + 39 00 00 00 00 00 02 2E C0 + 39 00 00 00 00 00 02 2D C0 + 39 00 00 00 00 00 02 2C BF + 39 00 00 00 00 00 02 2B BF + 39 00 00 00 00 00 02 2A BF + 39 00 00 00 00 00 02 29 BE + 39 00 00 00 00 00 02 28 BE + 39 00 00 00 00 00 02 27 BD + 39 00 00 00 00 00 02 26 BD + 39 00 00 00 00 00 02 25 BC + 39 00 00 00 00 00 02 24 BC + 39 00 00 00 00 00 02 23 BB + 39 00 00 00 00 00 02 22 BA + 39 00 00 00 00 00 02 21 BA + 39 00 00 00 00 00 02 20 B9 + 39 00 00 00 00 00 02 1F B8 + 39 00 00 00 00 00 02 1E B8 + 39 00 00 00 00 00 02 1D B8 + 39 00 00 00 00 00 02 1C B8 + 39 00 00 00 00 00 02 1B B8 + 39 00 00 00 00 00 02 1A B8 + 39 00 00 00 00 00 02 19 B7 + 39 00 00 00 00 00 02 18 B7 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 16 B6 + 39 00 00 00 00 00 02 15 B6 + 39 00 00 00 00 00 02 14 B6 + 39 00 00 00 00 00 02 13 B5 + 39 00 00 00 00 00 02 12 B5 + 39 00 00 00 00 00 02 11 B4 + 39 00 00 00 00 00 02 10 B4 + 39 00 00 00 00 00 02 0F B4 + 39 00 00 00 00 00 02 0E B4 + 39 00 00 00 00 00 02 0D B3 + 39 00 00 00 00 00 02 0C B3 + 39 00 00 00 00 00 02 0B B2 + 39 00 00 00 00 00 02 0A B2 + 39 00 00 00 00 00 02 09 B1 + 39 00 00 00 00 00 02 08 B1 + 39 00 00 00 00 00 02 07 B0 + 39 00 00 00 00 00 02 06 B0 + 39 00 00 00 00 00 02 05 AF + 39 00 00 00 00 00 02 04 AF + 39 00 00 00 00 00 02 03 AE + 39 00 00 00 00 00 02 02 AE + 39 00 00 00 00 00 02 01 AD + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F AC + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 AC + 39 00 00 00 00 00 02 7F D9 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 3A + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 3a + 39 00 00 00 00 00 02 7F 9F + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 3A + 39 00 00 00 00 00 02 7E 3B + 39 00 00 00 00 00 02 7D 3B + 39 00 00 00 00 00 02 7C 3C + 39 00 00 00 00 00 02 7B 3C + 39 00 00 00 00 00 02 7A 3D + 39 00 00 00 00 00 02 79 3E + 39 00 00 00 00 00 02 78 3E + 39 00 00 00 00 00 02 77 3F + 39 00 00 00 00 00 02 76 3F + 39 00 00 00 00 00 02 75 40 + 39 00 00 00 00 00 02 74 40 + 39 00 00 00 00 00 02 73 41 + 39 00 00 00 00 00 02 72 41 + 39 00 00 00 00 00 02 71 42 + 39 00 00 00 00 00 02 70 42 + 39 00 00 00 00 00 02 6F 43 + 39 00 00 00 00 00 02 6E 43 + 39 00 00 00 00 00 02 6D 44 + 39 00 00 00 00 00 02 6C 44 + 39 00 00 00 00 00 02 6B 45 + 39 00 00 00 00 00 02 6A 45 + 39 00 00 00 00 00 02 69 46 + 39 00 00 00 00 00 02 68 46 + 39 00 00 00 00 00 02 67 47 + 39 00 00 00 00 00 02 66 47 + 39 00 00 00 00 00 02 65 48 + 39 00 00 00 00 00 02 64 48 + 39 00 00 00 00 00 02 63 48 + 39 00 00 00 00 00 02 62 49 + 39 00 00 00 00 00 02 61 49 + 39 00 00 00 00 00 02 60 49 + 39 00 00 00 00 00 02 5F 4A + 39 00 00 00 00 00 02 5E 4A + 39 00 00 00 00 00 02 5D 4B + 39 00 00 00 00 00 02 5C 4C + 39 00 00 00 00 00 02 5B 4D + 39 00 00 00 00 00 02 5A 4E + 39 00 00 00 00 00 02 59 4F + 39 00 00 00 00 00 02 58 50 + 39 00 00 00 00 00 02 57 51 + 39 00 00 00 00 00 02 56 51 + 39 00 00 00 00 00 02 55 52 + 39 00 00 00 00 00 02 54 53 + 39 00 00 00 00 00 02 53 54 + 39 00 00 00 00 00 02 52 55 + 39 00 00 00 00 00 02 51 55 + 39 00 00 00 00 00 02 50 56 + 39 00 00 00 00 00 02 4F 57 + 39 00 00 00 00 00 02 4E 57 + 39 00 00 00 00 00 02 4D 58 + 39 00 00 00 00 00 02 4C 59 + 39 00 00 00 00 00 02 4B 59 + 39 00 00 00 00 00 02 4A 5A + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 48 5B + 39 00 00 00 00 00 02 47 5B + 39 00 00 00 00 00 02 46 5C + 39 00 00 00 00 00 02 45 5D + 39 00 00 00 00 00 02 44 5D + 39 00 00 00 00 00 02 43 5E + 39 00 00 00 00 00 02 42 5F + 39 00 00 00 00 00 02 41 5F + 39 00 00 00 00 00 02 40 5E + 39 00 00 00 00 00 02 3F 5E + 39 00 00 00 00 00 02 3E 5E + 39 00 00 00 00 00 02 3D 5E + 39 00 00 00 00 00 02 3C 5F + 39 00 00 00 00 00 02 3B 60 + 39 00 00 00 00 00 02 3A 61 + 39 00 00 00 00 00 02 39 62 + 39 00 00 00 00 00 02 38 63 + 39 00 00 00 00 00 02 37 63 + 39 00 00 00 00 00 02 36 64 + 39 00 00 00 00 00 02 35 65 + 39 00 00 00 00 00 02 34 66 + 39 00 00 00 00 00 02 33 67 + 39 00 00 00 00 00 02 32 67 + 39 00 00 00 00 00 02 31 68 + 39 00 00 00 00 00 02 30 69 + 39 00 00 00 00 00 02 2F 6A + 39 00 00 00 00 00 02 2E 6B + 39 00 00 00 00 00 02 2D 6C + 39 00 00 00 00 00 02 2C 6C + 39 00 00 00 00 00 02 2B 6B + 39 00 00 00 00 00 02 2A 6A + 39 00 00 00 00 00 02 29 6A + 39 00 00 00 00 00 02 28 6B + 39 00 00 00 00 00 02 27 6B + 39 00 00 00 00 00 02 26 6C + 39 00 00 00 00 00 02 25 6D + 39 00 00 00 00 00 02 24 6E + 39 00 00 00 00 00 02 23 6E + 39 00 00 00 00 00 02 22 6E + 39 00 00 00 00 00 02 21 6F + 39 00 00 00 00 00 02 20 6F + 39 00 00 00 00 00 02 1F 91 + 39 00 00 00 00 00 02 1E 90 + 39 00 00 00 00 00 02 1D 90 + 39 00 00 00 00 00 02 1C 90 + 39 00 00 00 00 00 02 1B 8F + 39 00 00 00 00 00 02 1A 8F + 39 00 00 00 00 00 02 19 8E + 39 00 00 00 00 00 02 18 8D + 39 00 00 00 00 00 02 17 8D + 39 00 00 00 00 00 02 16 8C + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 14 8B + 39 00 00 00 00 00 02 13 8B + 39 00 00 00 00 00 02 12 8A + 39 00 00 00 00 00 02 11 89 + 39 00 00 00 00 00 02 10 89 + 39 00 00 00 00 00 02 0F 88 + 39 00 00 00 00 00 02 0E 88 + 39 00 00 00 00 00 02 0D 87 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0B 86 + 39 00 00 00 00 00 02 0A 85 + 39 00 00 00 00 00 02 09 85 + 39 00 00 00 00 00 02 08 84 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7D 00 + 39 00 00 00 00 00 02 7C 00 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 78 01 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 74 02 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 03 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 51 02 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 38 07 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F AC + 39 00 00 00 00 00 02 7E AB + 39 00 00 00 00 00 02 7D AA + 39 00 00 00 00 00 02 7C AA + 39 00 00 00 00 00 02 7B AA + 39 00 00 00 00 00 02 7A A9 + 39 00 00 00 00 00 02 79 A9 + 39 00 00 00 00 00 02 78 A8 + 39 00 00 00 00 00 02 77 A8 + 39 00 00 00 00 00 02 76 A8 + 39 00 00 00 00 00 02 75 A8 + 39 00 00 00 00 00 02 74 A7 + 39 00 00 00 00 00 02 73 A7 + 39 00 00 00 00 00 02 72 A7 + 39 00 00 00 00 00 02 71 A6 + 39 00 00 00 00 00 02 70 A6 + 39 00 00 00 00 00 02 6F A6 + 39 00 00 00 00 00 02 6E A6 + 39 00 00 00 00 00 02 6D A5 + 39 00 00 00 00 00 02 6C A5 + 39 00 00 00 00 00 02 6B A5 + 39 00 00 00 00 00 02 6A A4 + 39 00 00 00 00 00 02 69 A4 + 39 00 00 00 00 00 02 68 A4 + 39 00 00 00 00 00 02 67 A3 + 39 00 00 00 00 00 02 66 A3 + 39 00 00 00 00 00 02 65 A3 + 39 00 00 00 00 00 02 64 A3 + 39 00 00 00 00 00 02 63 A3 + 39 00 00 00 00 00 02 62 A2 + 39 00 00 00 00 00 02 61 A2 + 39 00 00 00 00 00 02 60 A2 + 39 00 00 00 00 00 02 5F A2 + 39 00 00 00 00 00 02 5E A2 + 39 00 00 00 00 00 02 5D A2 + 39 00 00 00 00 00 02 5C A1 + 39 00 00 00 00 00 02 5B A1 + 39 00 00 00 00 00 02 5A A1 + 39 00 00 00 00 00 02 59 A1 + 39 00 00 00 00 00 02 58 A0 + 39 00 00 00 00 00 02 57 9F + 39 00 00 00 00 00 02 56 9F + 39 00 00 00 00 00 02 55 9E + 39 00 00 00 00 00 02 54 9E + 39 00 00 00 00 00 02 53 9D + 39 00 00 00 00 00 02 52 9C + 39 00 00 00 00 00 02 51 9C + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4D 99 + 39 00 00 00 00 00 02 4C 99 + 39 00 00 00 00 00 02 4B 98 + 39 00 00 00 00 00 02 4A 98 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 48 97 + 39 00 00 00 00 00 02 47 96 + 39 00 00 00 00 00 02 46 96 + 39 00 00 00 00 00 02 45 96 + 39 00 00 00 00 00 02 44 96 + 39 00 00 00 00 00 02 43 95 + 39 00 00 00 00 00 02 42 95 + 39 00 00 00 00 00 02 41 94 + 39 00 00 00 00 00 02 40 94 + 39 00 00 00 00 00 02 3F 93 + 39 00 00 00 00 00 02 3E 93 + 39 00 00 00 00 00 02 3D 94 + 39 00 00 00 00 00 02 3C 95 + 39 00 00 00 00 00 02 3B 95 + 39 00 00 00 00 00 02 3A 94 + 39 00 00 00 00 00 02 39 94 + 39 00 00 00 00 00 02 38 93 + 39 00 00 00 00 00 02 37 93 + 39 00 00 00 00 00 02 36 92 + 39 00 00 00 00 00 02 35 91 + 39 00 00 00 00 00 02 34 91 + 39 00 00 00 00 00 02 33 90 + 39 00 00 00 00 00 02 32 8F + 39 00 00 00 00 00 02 31 8F + 39 00 00 00 00 00 02 30 8E + 39 00 00 00 00 00 02 2F 8E + 39 00 00 00 00 00 02 2E 8E + 39 00 00 00 00 00 02 2D 8D + 39 00 00 00 00 00 02 2C 8C + 39 00 00 00 00 00 02 2B 8B + 39 00 00 00 00 00 02 2A 8A + 39 00 00 00 00 00 02 29 8B + 39 00 00 00 00 00 02 28 8D + 39 00 00 00 00 00 02 27 8E + 39 00 00 00 00 00 02 26 8D + 39 00 00 00 00 00 02 25 8C + 39 00 00 00 00 00 02 24 8C + 39 00 00 00 00 00 02 23 8B + 39 00 00 00 00 00 02 22 8B + 39 00 00 00 00 00 02 21 8A + 39 00 00 00 00 00 02 20 8A + 39 00 00 00 00 00 02 1F 8A + 39 00 00 00 00 00 02 1E 8A + 39 00 00 00 00 00 02 1D 8A + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1B 8A + 39 00 00 00 00 00 02 1A 8A + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 18 89 + 39 00 00 00 00 00 02 17 88 + 39 00 00 00 00 00 02 16 88 + 39 00 00 00 00 00 02 15 87 + 39 00 00 00 00 00 02 14 87 + 39 00 00 00 00 00 02 13 87 + 39 00 00 00 00 00 02 12 87 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 0E 85 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + qcom,mdss-dsi-panel-eye-command08= [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 03 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A3 13 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 94 + 39 00 00 00 00 00 02 A9 1E + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 86 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 B0 26 + 39 00 00 00 00 00 02 B1 51 + 39 00 00 00 00 00 02 B2 60 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1B + 39 00 00 00 00 00 02 C2 2A + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 93 + 39 00 00 00 00 00 02 C9 1E + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 85 + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1B + 39 00 00 00 00 00 02 CE 4E + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 D1 50 + 39 00 00 00 00 00 02 D2 5F + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 02 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 11 05 + 39 00 00 00 00 00 02 12 05 + 39 00 00 00 00 00 02 13 05 + 39 00 00 00 00 00 02 14 05 + 39 00 00 00 00 00 02 15 05 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 18 05 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1E 08 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 20 06 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 23 03 + 39 00 00 00 00 00 02 24 04 + 39 00 00 00 00 00 02 25 04 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 37 05 + 39 00 00 00 00 00 02 38 06 + 39 00 00 00 00 00 02 39 06 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 51 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 70 03 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7F 01 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 06 85 + 39 00 00 00 00 00 02 07 85 + 39 00 00 00 00 00 02 08 86 + 39 00 00 00 00 00 02 09 87 + 39 00 00 00 00 00 02 0A 88 + 39 00 00 00 00 00 02 0B 88 + 39 00 00 00 00 00 02 0C 89 + 39 00 00 00 00 00 02 0D 8A + 39 00 00 00 00 00 02 0E 8B + 39 00 00 00 00 00 02 0F 8C + 39 00 00 00 00 00 02 10 8D + 39 00 00 00 00 00 02 11 8E + 39 00 00 00 00 00 02 12 8E + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 14 90 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 91 + 39 00 00 00 00 00 02 17 91 + 39 00 00 00 00 00 02 18 92 + 39 00 00 00 00 00 02 19 93 + 39 00 00 00 00 00 02 1A 94 + 39 00 00 00 00 00 02 1B 95 + 39 00 00 00 00 00 02 1C 96 + 39 00 00 00 00 00 02 1D 97 + 39 00 00 00 00 00 02 1E 98 + 39 00 00 00 00 00 02 1F 98 + 39 00 00 00 00 00 02 20 99 + 39 00 00 00 00 00 02 21 99 + 39 00 00 00 00 00 02 22 9A + 39 00 00 00 00 00 02 23 9B + 39 00 00 00 00 00 02 24 9B + 39 00 00 00 00 00 02 25 9C + 39 00 00 00 00 00 02 26 9C + 39 00 00 00 00 00 02 27 9C + 39 00 00 00 00 00 02 28 9D + 39 00 00 00 00 00 02 29 9F + 39 00 00 00 00 00 02 2A A0 + 39 00 00 00 00 00 02 2B A2 + 39 00 00 00 00 00 02 2C A4 + 39 00 00 00 00 00 02 2D A5 + 39 00 00 00 00 00 02 2E A6 + 39 00 00 00 00 00 02 2F A6 + 39 00 00 00 00 00 02 30 A7 + 39 00 00 00 00 00 02 31 A7 + 39 00 00 00 00 00 02 32 A8 + 39 00 00 00 00 00 02 33 A8 + 39 00 00 00 00 00 02 34 A9 + 39 00 00 00 00 00 02 35 AA + 39 00 00 00 00 00 02 36 AA + 39 00 00 00 00 00 02 37 AB + 39 00 00 00 00 00 02 38 AC + 39 00 00 00 00 00 02 39 AD + 39 00 00 00 00 00 02 3A AE + 39 00 00 00 00 00 02 3B AF + 39 00 00 00 00 00 02 3C B0 + 39 00 00 00 00 00 02 3D B0 + 39 00 00 00 00 00 02 3E B1 + 39 00 00 00 00 00 02 3F B3 + 39 00 00 00 00 00 02 40 B4 + 39 00 00 00 00 00 02 41 B5 + 39 00 00 00 00 00 02 42 B6 + 39 00 00 00 00 00 02 43 B7 + 39 00 00 00 00 00 02 44 B7 + 39 00 00 00 00 00 02 45 B7 + 39 00 00 00 00 00 02 46 B8 + 39 00 00 00 00 00 02 47 B8 + 39 00 00 00 00 00 02 48 B9 + 39 00 00 00 00 00 02 49 B9 + 39 00 00 00 00 00 02 4A BA + 39 00 00 00 00 00 02 4B BB + 39 00 00 00 00 00 02 4C BB + 39 00 00 00 00 00 02 4D BC + 39 00 00 00 00 00 02 4E BC + 39 00 00 00 00 00 02 4F BD + 39 00 00 00 00 00 02 50 BE + 39 00 00 00 00 00 02 51 BF + 39 00 00 00 00 00 02 52 C0 + 39 00 00 00 00 00 02 53 C0 + 39 00 00 00 00 00 02 54 C1 + 39 00 00 00 00 00 02 55 C2 + 39 00 00 00 00 00 02 56 C3 + 39 00 00 00 00 00 02 57 C3 + 39 00 00 00 00 00 02 58 C4 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 5A C6 + 39 00 00 00 00 00 02 5B C8 + 39 00 00 00 00 00 02 5C C9 + 39 00 00 00 00 00 02 5D CA + 39 00 00 00 00 00 02 5E CB + 39 00 00 00 00 00 02 5F CC + 39 00 00 00 00 00 02 60 CD + 39 00 00 00 00 00 02 61 CE + 39 00 00 00 00 00 02 62 CF + 39 00 00 00 00 00 02 63 D0 + 39 00 00 00 00 00 02 64 D1 + 39 00 00 00 00 00 02 65 D2 + 39 00 00 00 00 00 02 66 D3 + 39 00 00 00 00 00 02 67 D4 + 39 00 00 00 00 00 02 68 D4 + 39 00 00 00 00 00 02 69 D5 + 39 00 00 00 00 00 02 6A D6 + 39 00 00 00 00 00 02 6B D6 + 39 00 00 00 00 00 02 6C D7 + 39 00 00 00 00 00 02 6D D8 + 39 00 00 00 00 00 02 6E D9 + 39 00 00 00 00 00 02 6F DA + 39 00 00 00 00 00 02 70 DA + 39 00 00 00 00 00 02 71 DB + 39 00 00 00 00 00 02 72 DC + 39 00 00 00 00 00 02 73 DD + 39 00 00 00 00 00 02 74 DD + 39 00 00 00 00 00 02 75 DE + 39 00 00 00 00 00 02 76 DF + 39 00 00 00 00 00 02 77 DF + 39 00 00 00 00 00 02 78 E0 + 39 00 00 00 00 00 02 79 E1 + 39 00 00 00 00 00 02 7A E2 + 39 00 00 00 00 00 02 7B E3 + 39 00 00 00 00 00 02 7C E3 + 39 00 00 00 00 00 02 7D E4 + 39 00 00 00 00 00 02 7E E5 + 39 00 00 00 00 00 02 7F E6 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 06 89 + 39 00 00 00 00 00 02 07 8A + 39 00 00 00 00 00 02 08 8B + 39 00 00 00 00 00 02 09 8C + 39 00 00 00 00 00 02 0A 8E + 39 00 00 00 00 00 02 0B 8F + 39 00 00 00 00 00 02 0C 91 + 39 00 00 00 00 00 02 0D 92 + 39 00 00 00 00 00 02 0E 93 + 39 00 00 00 00 00 02 0F 95 + 39 00 00 00 00 00 02 10 97 + 39 00 00 00 00 00 02 11 98 + 39 00 00 00 00 00 02 12 9A + 39 00 00 00 00 00 02 13 9C + 39 00 00 00 00 00 02 14 9D + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 9F + 39 00 00 00 00 00 02 17 A1 + 39 00 00 00 00 00 02 18 A2 + 39 00 00 00 00 00 02 19 A4 + 39 00 00 00 00 00 02 1A A5 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1C A7 + 39 00 00 00 00 00 02 1D A8 + 39 00 00 00 00 00 02 1E A9 + 39 00 00 00 00 00 02 1F AB + 39 00 00 00 00 00 02 20 53 + 39 00 00 00 00 00 02 21 52 + 39 00 00 00 00 00 02 22 50 + 39 00 00 00 00 00 02 23 4E + 39 00 00 00 00 00 02 24 4D + 39 00 00 00 00 00 02 25 4B + 39 00 00 00 00 00 02 26 4A + 39 00 00 00 00 00 02 27 49 + 39 00 00 00 00 00 02 28 48 + 39 00 00 00 00 00 02 29 46 + 39 00 00 00 00 00 02 2A 45 + 39 00 00 00 00 00 02 2B 44 + 39 00 00 00 00 00 02 2C 42 + 39 00 00 00 00 00 02 2D 41 + 39 00 00 00 00 00 02 2E 40 + 39 00 00 00 00 00 02 2F 3F + 39 00 00 00 00 00 02 30 3E + 39 00 00 00 00 00 02 31 3D + 39 00 00 00 00 00 02 32 3B + 39 00 00 00 00 00 02 33 39 + 39 00 00 00 00 00 02 34 37 + 39 00 00 00 00 00 02 35 35 + 39 00 00 00 00 00 02 36 33 + 39 00 00 00 00 00 02 37 31 + 39 00 00 00 00 00 02 38 2F + 39 00 00 00 00 00 02 39 2D + 39 00 00 00 00 00 02 3A 2C + 39 00 00 00 00 00 02 3B 2B + 39 00 00 00 00 00 02 3C 2A + 39 00 00 00 00 00 02 3D 28 + 39 00 00 00 00 00 02 3E 27 + 39 00 00 00 00 00 02 3F 26 + 39 00 00 00 00 00 02 40 25 + 39 00 00 00 00 00 02 41 23 + 39 00 00 00 00 00 02 42 22 + 39 00 00 00 00 00 02 43 21 + 39 00 00 00 00 00 02 44 1F + 39 00 00 00 00 00 02 45 1E + 39 00 00 00 00 00 02 46 1C + 39 00 00 00 00 00 02 47 1A + 39 00 00 00 00 00 02 48 19 + 39 00 00 00 00 00 02 49 17 + 39 00 00 00 00 00 02 4A 16 + 39 00 00 00 00 00 02 4B 15 + 39 00 00 00 00 00 02 4C 14 + 39 00 00 00 00 00 02 4D 12 + 39 00 00 00 00 00 02 4E 10 + 39 00 00 00 00 00 02 4F 0E + 39 00 00 00 00 00 02 50 0C + 39 00 00 00 00 00 02 51 0A + 39 00 00 00 00 00 02 52 09 + 39 00 00 00 00 00 02 53 07 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 55 05 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 03 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 01 + 39 00 00 00 00 00 02 5A 00 + 39 00 00 00 00 00 02 5B 82 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5D 84 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 60 88 + 39 00 00 00 00 00 02 61 8A + 39 00 00 00 00 00 02 62 8B + 39 00 00 00 00 00 02 63 8C + 39 00 00 00 00 00 02 64 8E + 39 00 00 00 00 00 02 65 8F + 39 00 00 00 00 00 02 66 90 + 39 00 00 00 00 00 02 67 92 + 39 00 00 00 00 00 02 68 94 + 39 00 00 00 00 00 02 69 95 + 39 00 00 00 00 00 02 6A 97 + 39 00 00 00 00 00 02 6B 98 + 39 00 00 00 00 00 02 6C 99 + 39 00 00 00 00 00 02 6D 9A + 39 00 00 00 00 00 02 6E 9C + 39 00 00 00 00 00 02 6F 9E + 39 00 00 00 00 00 02 70 9F + 39 00 00 00 00 00 02 71 A1 + 39 00 00 00 00 00 02 72 A3 + 39 00 00 00 00 00 02 73 A5 + 39 00 00 00 00 00 02 74 A7 + 39 00 00 00 00 00 02 75 A8 + 39 00 00 00 00 00 02 76 AA + 39 00 00 00 00 00 02 77 AB + 39 00 00 00 00 00 02 78 AD + 39 00 00 00 00 00 02 79 AF + 39 00 00 00 00 00 02 7A B0 + 39 00 00 00 00 00 02 7B B2 + 39 00 00 00 00 00 02 7C B4 + 39 00 00 00 00 00 02 7D B6 + 39 00 00 00 00 00 02 7E B7 + 39 00 00 00 00 00 02 7F B9 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 07 01 + 39 00 00 00 00 00 02 08 01 + 39 00 00 00 00 00 02 09 01 + 39 00 00 00 00 00 02 0A 01 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0C 02 + 39 00 00 00 00 00 02 0D 02 + 39 00 00 00 00 00 02 0E 02 + 39 00 00 00 00 00 02 0F 02 + 39 00 00 00 00 00 02 10 02 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 12 01 + 39 00 00 00 00 00 02 13 01 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 00 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 18 81 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 22 83 + 39 00 00 00 00 00 02 23 83 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 84 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3D 87 + 39 00 00 00 00 00 02 3E 87 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 41 87 + 39 00 00 00 00 00 02 42 87 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 46 86 + 39 00 00 00 00 00 02 47 86 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 49 85 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 4B 84 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4D 84 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 50 85 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 53 86 + 39 00 00 00 00 00 02 54 86 + 39 00 00 00 00 00 02 55 86 + 39 00 00 00 00 00 02 56 86 + 39 00 00 00 00 00 02 57 85 + 39 00 00 00 00 00 02 58 85 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 5A 84 + 39 00 00 00 00 00 02 5B 84 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5D 84 + 39 00 00 00 00 00 02 5E 84 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 60 85 + 39 00 00 00 00 00 02 61 85 + 39 00 00 00 00 00 02 62 85 + 39 00 00 00 00 00 02 63 85 + 39 00 00 00 00 00 02 64 85 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 66 84 + 39 00 00 00 00 00 02 67 84 + 39 00 00 00 00 00 02 68 83 + 39 00 00 00 00 00 02 69 84 + 39 00 00 00 00 00 02 6A 84 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6C 85 + 39 00 00 00 00 00 02 6D 85 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6F 84 + 39 00 00 00 00 00 02 70 84 + 39 00 00 00 00 00 02 71 84 + 39 00 00 00 00 00 02 72 84 + 39 00 00 00 00 00 02 73 84 + 39 00 00 00 00 00 02 74 84 + 39 00 00 00 00 00 02 75 84 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 79 83 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7F 83 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 E7 + 39 00 00 00 00 00 02 02 E8 + 39 00 00 00 00 00 02 03 E8 + 39 00 00 00 00 00 02 04 E9 + 39 00 00 00 00 00 02 05 EA + 39 00 00 00 00 00 02 06 EB + 39 00 00 00 00 00 02 07 EC + 39 00 00 00 00 00 02 08 ED + 39 00 00 00 00 00 02 09 EE + 39 00 00 00 00 00 02 0A EF + 39 00 00 00 00 00 02 0B EF + 39 00 00 00 00 00 02 0C F0 + 39 00 00 00 00 00 02 0D F1 + 39 00 00 00 00 00 02 0E F2 + 39 00 00 00 00 00 02 0F F3 + 39 00 00 00 00 00 02 10 F4 + 39 00 00 00 00 00 02 11 F5 + 39 00 00 00 00 00 02 12 F6 + 39 00 00 00 00 00 02 13 F6 + 39 00 00 00 00 00 02 14 F7 + 39 00 00 00 00 00 02 15 F8 + 39 00 00 00 00 00 02 16 F9 + 39 00 00 00 00 00 02 17 FA + 39 00 00 00 00 00 02 18 FB + 39 00 00 00 00 00 02 19 FC + 39 00 00 00 00 00 02 1A FD + 39 00 00 00 00 00 02 1B FD + 39 00 00 00 00 00 02 1C FE + 39 00 00 00 00 00 02 1D FF + 39 00 00 00 00 00 02 1E FF + 39 00 00 00 00 00 02 1F FF + 39 00 00 00 00 00 02 20 FF + 39 00 00 00 00 00 02 21 FF + 39 00 00 00 00 00 02 22 FF + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 FF + 39 00 00 00 00 00 02 25 FF + 39 00 00 00 00 00 02 26 FF + 39 00 00 00 00 00 02 27 FF + 39 00 00 00 00 00 02 28 FF + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 2A FF + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2C FF + 39 00 00 00 00 00 02 2D FF + 39 00 00 00 00 00 02 2E FF + 39 00 00 00 00 00 02 2F FF + 39 00 00 00 00 00 02 30 FF + 39 00 00 00 00 00 02 31 FF + 39 00 00 00 00 00 02 32 FF + 39 00 00 00 00 00 02 33 FF + 39 00 00 00 00 00 02 34 FF + 39 00 00 00 00 00 02 35 FF + 39 00 00 00 00 00 02 36 FF + 39 00 00 00 00 00 02 37 FF + 39 00 00 00 00 00 02 38 FF + 39 00 00 00 00 00 02 39 FF + 39 00 00 00 00 00 02 3A FF + 39 00 00 00 00 00 02 3B FF + 39 00 00 00 00 00 02 3C FF + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3E FF + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7F FF + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 45 + 39 00 00 00 00 00 02 02 43 + 39 00 00 00 00 00 02 03 42 + 39 00 00 00 00 00 02 04 41 + 39 00 00 00 00 00 02 05 3F + 39 00 00 00 00 00 02 06 3E + 39 00 00 00 00 00 02 07 3C + 39 00 00 00 00 00 02 08 3B + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 38 + 39 00 00 00 00 00 02 0B 37 + 39 00 00 00 00 00 02 0C 35 + 39 00 00 00 00 00 02 0D 34 + 39 00 00 00 00 00 02 0E 32 + 39 00 00 00 00 00 02 0F 31 + 39 00 00 00 00 00 02 10 2F + 39 00 00 00 00 00 02 11 2E + 39 00 00 00 00 00 02 12 2D + 39 00 00 00 00 00 02 13 2B + 39 00 00 00 00 00 02 14 2A + 39 00 00 00 00 00 02 15 28 + 39 00 00 00 00 00 02 16 27 + 39 00 00 00 00 00 02 17 25 + 39 00 00 00 00 00 02 18 24 + 39 00 00 00 00 00 02 19 22 + 39 00 00 00 00 00 02 1A 21 + 39 00 00 00 00 00 02 1B 1F + 39 00 00 00 00 00 02 1C 1E + 39 00 00 00 00 00 02 1D 1D + 39 00 00 00 00 00 02 1E 1B + 39 00 00 00 00 00 02 1F 1A + 39 00 00 00 00 00 02 20 18 + 39 00 00 00 00 00 02 21 17 + 39 00 00 00 00 00 02 22 15 + 39 00 00 00 00 00 02 23 14 + 39 00 00 00 00 00 02 24 13 + 39 00 00 00 00 00 02 25 12 + 39 00 00 00 00 00 02 26 10 + 39 00 00 00 00 00 02 27 0E + 39 00 00 00 00 00 02 28 0C + 39 00 00 00 00 00 02 29 0B + 39 00 00 00 00 00 02 2A 0A + 39 00 00 00 00 00 02 2B 08 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2F 02 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 35 87 + 39 00 00 00 00 00 02 36 89 + 39 00 00 00 00 00 02 37 8A + 39 00 00 00 00 00 02 38 8C + 39 00 00 00 00 00 02 39 8E + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 3B 91 + 39 00 00 00 00 00 02 3C 92 + 39 00 00 00 00 00 02 3D 94 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3F 97 + 39 00 00 00 00 00 02 40 68 + 39 00 00 00 00 00 02 41 66 + 39 00 00 00 00 00 02 42 64 + 39 00 00 00 00 00 02 43 63 + 39 00 00 00 00 00 02 44 61 + 39 00 00 00 00 00 02 45 60 + 39 00 00 00 00 00 02 46 5E + 39 00 00 00 00 00 02 47 5D + 39 00 00 00 00 00 02 48 5B + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 4A 58 + 39 00 00 00 00 00 02 4B 57 + 39 00 00 00 00 00 02 4C 55 + 39 00 00 00 00 00 02 4D 54 + 39 00 00 00 00 00 02 4E 52 + 39 00 00 00 00 00 02 4F 51 + 39 00 00 00 00 00 02 50 4F + 39 00 00 00 00 00 02 51 4E + 39 00 00 00 00 00 02 52 4D + 39 00 00 00 00 00 02 53 4B + 39 00 00 00 00 00 02 54 4A + 39 00 00 00 00 00 02 55 48 + 39 00 00 00 00 00 02 56 47 + 39 00 00 00 00 00 02 57 46 + 39 00 00 00 00 00 02 58 44 + 39 00 00 00 00 00 02 59 43 + 39 00 00 00 00 00 02 5A 42 + 39 00 00 00 00 00 02 5B 40 + 39 00 00 00 00 00 02 5C 3F + 39 00 00 00 00 00 02 5D 3D + 39 00 00 00 00 00 02 5E 3C + 39 00 00 00 00 00 02 5F 3B + 39 00 00 00 00 00 02 60 39 + 39 00 00 00 00 00 02 61 38 + 39 00 00 00 00 00 02 62 37 + 39 00 00 00 00 00 02 63 35 + 39 00 00 00 00 00 02 64 33 + 39 00 00 00 00 00 02 65 31 + 39 00 00 00 00 00 02 66 30 + 39 00 00 00 00 00 02 67 2E + 39 00 00 00 00 00 02 68 2C + 39 00 00 00 00 00 02 69 2B + 39 00 00 00 00 00 02 6A 29 + 39 00 00 00 00 00 02 6B 27 + 39 00 00 00 00 00 02 6C 25 + 39 00 00 00 00 00 02 6D 24 + 39 00 00 00 00 00 02 6E 22 + 39 00 00 00 00 00 02 6F 20 + 39 00 00 00 00 00 02 70 1F + 39 00 00 00 00 00 02 71 1D + 39 00 00 00 00 00 02 72 1B + 39 00 00 00 00 00 02 73 1A + 39 00 00 00 00 00 02 74 18 + 39 00 00 00 00 00 02 75 16 + 39 00 00 00 00 00 02 76 15 + 39 00 00 00 00 00 02 77 13 + 39 00 00 00 00 00 02 78 11 + 39 00 00 00 00 00 02 79 0F + 39 00 00 00 00 00 02 7A 0E + 39 00 00 00 00 00 02 7B 0C + 39 00 00 00 00 00 02 7C 0B + 39 00 00 00 00 00 02 7D 09 + 39 00 00 00 00 00 02 7E 08 + 39 00 00 00 00 00 02 7F 07 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F E6 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 E7 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F b9 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 46 + 39 00 00 00 00 00 02 7F 07 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F 07 + 39 00 00 00 00 00 02 7E 08 + 39 00 00 00 00 00 02 7D 09 + 39 00 00 00 00 00 02 7C 0B + 39 00 00 00 00 00 02 7B 0C + 39 00 00 00 00 00 02 7A 0E + 39 00 00 00 00 00 02 79 0F + 39 00 00 00 00 00 02 78 11 + 39 00 00 00 00 00 02 77 13 + 39 00 00 00 00 00 02 76 15 + 39 00 00 00 00 00 02 75 16 + 39 00 00 00 00 00 02 74 18 + 39 00 00 00 00 00 02 73 1A + 39 00 00 00 00 00 02 72 1B + 39 00 00 00 00 00 02 71 1D + 39 00 00 00 00 00 02 70 1F + 39 00 00 00 00 00 02 6F 20 + 39 00 00 00 00 00 02 6E 22 + 39 00 00 00 00 00 02 6D 24 + 39 00 00 00 00 00 02 6C 25 + 39 00 00 00 00 00 02 6B 27 + 39 00 00 00 00 00 02 6A 29 + 39 00 00 00 00 00 02 69 2B + 39 00 00 00 00 00 02 68 2C + 39 00 00 00 00 00 02 67 2E + 39 00 00 00 00 00 02 66 30 + 39 00 00 00 00 00 02 65 31 + 39 00 00 00 00 00 02 64 33 + 39 00 00 00 00 00 02 63 35 + 39 00 00 00 00 00 02 62 37 + 39 00 00 00 00 00 02 61 38 + 39 00 00 00 00 00 02 60 39 + 39 00 00 00 00 00 02 5F 3B + 39 00 00 00 00 00 02 5E 3C + 39 00 00 00 00 00 02 5D 3D + 39 00 00 00 00 00 02 5C 3F + 39 00 00 00 00 00 02 5B 40 + 39 00 00 00 00 00 02 5A 42 + 39 00 00 00 00 00 02 59 43 + 39 00 00 00 00 00 02 58 44 + 39 00 00 00 00 00 02 57 46 + 39 00 00 00 00 00 02 56 47 + 39 00 00 00 00 00 02 55 48 + 39 00 00 00 00 00 02 54 4A + 39 00 00 00 00 00 02 53 4B + 39 00 00 00 00 00 02 52 4D + 39 00 00 00 00 00 02 51 4E + 39 00 00 00 00 00 02 50 4F + 39 00 00 00 00 00 02 4F 51 + 39 00 00 00 00 00 02 4E 52 + 39 00 00 00 00 00 02 4D 54 + 39 00 00 00 00 00 02 4C 55 + 39 00 00 00 00 00 02 4B 57 + 39 00 00 00 00 00 02 4A 58 + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 48 5B + 39 00 00 00 00 00 02 47 5D + 39 00 00 00 00 00 02 46 5E + 39 00 00 00 00 00 02 45 60 + 39 00 00 00 00 00 02 44 61 + 39 00 00 00 00 00 02 43 63 + 39 00 00 00 00 00 02 42 64 + 39 00 00 00 00 00 02 41 66 + 39 00 00 00 00 00 02 40 68 + 39 00 00 00 00 00 02 3F 97 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3D 94 + 39 00 00 00 00 00 02 3C 92 + 39 00 00 00 00 00 02 3B 91 + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 39 8E + 39 00 00 00 00 00 02 38 8C + 39 00 00 00 00 00 02 37 8A + 39 00 00 00 00 00 02 36 89 + 39 00 00 00 00 00 02 35 87 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 2F 02 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 08 + 39 00 00 00 00 00 02 2A 0A + 39 00 00 00 00 00 02 29 0B + 39 00 00 00 00 00 02 28 0C + 39 00 00 00 00 00 02 27 0E + 39 00 00 00 00 00 02 26 10 + 39 00 00 00 00 00 02 25 12 + 39 00 00 00 00 00 02 24 13 + 39 00 00 00 00 00 02 23 14 + 39 00 00 00 00 00 02 22 15 + 39 00 00 00 00 00 02 21 17 + 39 00 00 00 00 00 02 20 18 + 39 00 00 00 00 00 02 1F 1A + 39 00 00 00 00 00 02 1E 1B + 39 00 00 00 00 00 02 1D 1D + 39 00 00 00 00 00 02 1C 1E + 39 00 00 00 00 00 02 1B 1F + 39 00 00 00 00 00 02 1A 21 + 39 00 00 00 00 00 02 19 22 + 39 00 00 00 00 00 02 18 24 + 39 00 00 00 00 00 02 17 25 + 39 00 00 00 00 00 02 16 27 + 39 00 00 00 00 00 02 15 28 + 39 00 00 00 00 00 02 14 2A + 39 00 00 00 00 00 02 13 2B + 39 00 00 00 00 00 02 12 2D + 39 00 00 00 00 00 02 11 2E + 39 00 00 00 00 00 02 10 2F + 39 00 00 00 00 00 02 0F 31 + 39 00 00 00 00 00 02 0E 32 + 39 00 00 00 00 00 02 0D 34 + 39 00 00 00 00 00 02 0C 35 + 39 00 00 00 00 00 02 0B 37 + 39 00 00 00 00 00 02 0A 38 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 08 3B + 39 00 00 00 00 00 02 07 3C + 39 00 00 00 00 00 02 06 3E + 39 00 00 00 00 00 02 05 3F + 39 00 00 00 00 00 02 04 41 + 39 00 00 00 00 00 02 03 42 + 39 00 00 00 00 00 02 02 43 + 39 00 00 00 00 00 02 01 45 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 79 83 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 75 84 + 39 00 00 00 00 00 02 74 84 + 39 00 00 00 00 00 02 73 84 + 39 00 00 00 00 00 02 72 84 + 39 00 00 00 00 00 02 71 84 + 39 00 00 00 00 00 02 70 84 + 39 00 00 00 00 00 02 6F 84 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6D 85 + 39 00 00 00 00 00 02 6C 85 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6A 84 + 39 00 00 00 00 00 02 69 84 + 39 00 00 00 00 00 02 68 83 + 39 00 00 00 00 00 02 67 84 + 39 00 00 00 00 00 02 66 84 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 64 85 + 39 00 00 00 00 00 02 63 85 + 39 00 00 00 00 00 02 62 85 + 39 00 00 00 00 00 02 61 85 + 39 00 00 00 00 00 02 60 85 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 5E 84 + 39 00 00 00 00 00 02 5D 84 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5B 84 + 39 00 00 00 00 00 02 5A 84 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 58 85 + 39 00 00 00 00 00 02 57 85 + 39 00 00 00 00 00 02 56 86 + 39 00 00 00 00 00 02 55 86 + 39 00 00 00 00 00 02 54 86 + 39 00 00 00 00 00 02 53 86 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 50 85 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4D 84 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4B 84 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 49 85 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 47 86 + 39 00 00 00 00 00 02 46 86 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 42 87 + 39 00 00 00 00 00 02 41 87 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 3E 87 + 39 00 00 00 00 00 02 3D 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 84 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 23 83 + 39 00 00 00 00 00 02 22 83 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 18 81 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 15 00 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 13 01 + 39 00 00 00 00 00 02 12 01 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 10 02 + 39 00 00 00 00 00 02 0F 02 + 39 00 00 00 00 00 02 0E 02 + 39 00 00 00 00 00 02 0D 02 + 39 00 00 00 00 00 02 0C 02 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0A 01 + 39 00 00 00 00 00 02 09 01 + 39 00 00 00 00 00 02 08 01 + 39 00 00 00 00 00 02 07 01 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 01 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 3E FF + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3C FF + 39 00 00 00 00 00 02 3B FF + 39 00 00 00 00 00 02 3A FF + 39 00 00 00 00 00 02 39 FF + 39 00 00 00 00 00 02 38 FF + 39 00 00 00 00 00 02 37 FF + 39 00 00 00 00 00 02 36 FF + 39 00 00 00 00 00 02 35 FF + 39 00 00 00 00 00 02 34 FF + 39 00 00 00 00 00 02 33 FF + 39 00 00 00 00 00 02 32 FF + 39 00 00 00 00 00 02 31 FF + 39 00 00 00 00 00 02 30 FF + 39 00 00 00 00 00 02 2F FF + 39 00 00 00 00 00 02 2E FF + 39 00 00 00 00 00 02 2D FF + 39 00 00 00 00 00 02 2C FF + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2A FF + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 28 FF + 39 00 00 00 00 00 02 27 FF + 39 00 00 00 00 00 02 26 FF + 39 00 00 00 00 00 02 25 FF + 39 00 00 00 00 00 02 24 FF + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 22 FF + 39 00 00 00 00 00 02 21 FF + 39 00 00 00 00 00 02 20 FF + 39 00 00 00 00 00 02 1F FF + 39 00 00 00 00 00 02 1E FF + 39 00 00 00 00 00 02 1D FF + 39 00 00 00 00 00 02 1C FE + 39 00 00 00 00 00 02 1B FD + 39 00 00 00 00 00 02 1A FD + 39 00 00 00 00 00 02 19 FC + 39 00 00 00 00 00 02 18 FB + 39 00 00 00 00 00 02 17 FA + 39 00 00 00 00 00 02 16 F9 + 39 00 00 00 00 00 02 15 F8 + 39 00 00 00 00 00 02 14 F7 + 39 00 00 00 00 00 02 13 F6 + 39 00 00 00 00 00 02 12 F6 + 39 00 00 00 00 00 02 11 F5 + 39 00 00 00 00 00 02 10 F4 + 39 00 00 00 00 00 02 0F F3 + 39 00 00 00 00 00 02 0E F2 + 39 00 00 00 00 00 02 0D F1 + 39 00 00 00 00 00 02 0C F0 + 39 00 00 00 00 00 02 0B EF + 39 00 00 00 00 00 02 0A EF + 39 00 00 00 00 00 02 09 EE + 39 00 00 00 00 00 02 08 ED + 39 00 00 00 00 00 02 07 EC + 39 00 00 00 00 00 02 06 EB + 39 00 00 00 00 00 02 05 EA + 39 00 00 00 00 00 02 04 E9 + 39 00 00 00 00 00 02 03 E8 + 39 00 00 00 00 00 02 02 E8 + 39 00 00 00 00 00 02 01 E7 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F E6 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 E7 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F b9 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 46 + 39 00 00 00 00 00 02 7F 07 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F B9 + 39 00 00 00 00 00 02 7E B7 + 39 00 00 00 00 00 02 7D B6 + 39 00 00 00 00 00 02 7C B4 + 39 00 00 00 00 00 02 7B B2 + 39 00 00 00 00 00 02 7A B0 + 39 00 00 00 00 00 02 79 AF + 39 00 00 00 00 00 02 78 AD + 39 00 00 00 00 00 02 77 AB + 39 00 00 00 00 00 02 76 AA + 39 00 00 00 00 00 02 75 A8 + 39 00 00 00 00 00 02 74 A7 + 39 00 00 00 00 00 02 73 A5 + 39 00 00 00 00 00 02 72 A3 + 39 00 00 00 00 00 02 71 A1 + 39 00 00 00 00 00 02 70 9F + 39 00 00 00 00 00 02 6F 9E + 39 00 00 00 00 00 02 6E 9C + 39 00 00 00 00 00 02 6D 9A + 39 00 00 00 00 00 02 6C 99 + 39 00 00 00 00 00 02 6B 98 + 39 00 00 00 00 00 02 6A 97 + 39 00 00 00 00 00 02 69 95 + 39 00 00 00 00 00 02 68 94 + 39 00 00 00 00 00 02 67 92 + 39 00 00 00 00 00 02 66 90 + 39 00 00 00 00 00 02 65 8F + 39 00 00 00 00 00 02 64 8E + 39 00 00 00 00 00 02 63 8C + 39 00 00 00 00 00 02 62 8B + 39 00 00 00 00 00 02 61 8A + 39 00 00 00 00 00 02 60 88 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5D 84 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5B 82 + 39 00 00 00 00 00 02 5A 00 + 39 00 00 00 00 00 02 59 01 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 57 03 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 05 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 53 07 + 39 00 00 00 00 00 02 52 09 + 39 00 00 00 00 00 02 51 0A + 39 00 00 00 00 00 02 50 0C + 39 00 00 00 00 00 02 4F 0E + 39 00 00 00 00 00 02 4E 10 + 39 00 00 00 00 00 02 4D 12 + 39 00 00 00 00 00 02 4C 14 + 39 00 00 00 00 00 02 4B 15 + 39 00 00 00 00 00 02 4A 16 + 39 00 00 00 00 00 02 49 17 + 39 00 00 00 00 00 02 48 19 + 39 00 00 00 00 00 02 47 1A + 39 00 00 00 00 00 02 46 1C + 39 00 00 00 00 00 02 45 1E + 39 00 00 00 00 00 02 44 1F + 39 00 00 00 00 00 02 43 21 + 39 00 00 00 00 00 02 42 22 + 39 00 00 00 00 00 02 41 23 + 39 00 00 00 00 00 02 40 25 + 39 00 00 00 00 00 02 3F 26 + 39 00 00 00 00 00 02 3E 27 + 39 00 00 00 00 00 02 3D 28 + 39 00 00 00 00 00 02 3C 2A + 39 00 00 00 00 00 02 3B 2B + 39 00 00 00 00 00 02 3A 2C + 39 00 00 00 00 00 02 39 2D + 39 00 00 00 00 00 02 38 2F + 39 00 00 00 00 00 02 37 31 + 39 00 00 00 00 00 02 36 33 + 39 00 00 00 00 00 02 35 35 + 39 00 00 00 00 00 02 34 37 + 39 00 00 00 00 00 02 33 39 + 39 00 00 00 00 00 02 32 3B + 39 00 00 00 00 00 02 31 3D + 39 00 00 00 00 00 02 30 3E + 39 00 00 00 00 00 02 2F 3F + 39 00 00 00 00 00 02 2E 40 + 39 00 00 00 00 00 02 2D 41 + 39 00 00 00 00 00 02 2C 42 + 39 00 00 00 00 00 02 2B 44 + 39 00 00 00 00 00 02 2A 45 + 39 00 00 00 00 00 02 29 46 + 39 00 00 00 00 00 02 28 48 + 39 00 00 00 00 00 02 27 49 + 39 00 00 00 00 00 02 26 4A + 39 00 00 00 00 00 02 25 4B + 39 00 00 00 00 00 02 24 4D + 39 00 00 00 00 00 02 23 4E + 39 00 00 00 00 00 02 22 50 + 39 00 00 00 00 00 02 21 52 + 39 00 00 00 00 00 02 20 53 + 39 00 00 00 00 00 02 1F AB + 39 00 00 00 00 00 02 1E A9 + 39 00 00 00 00 00 02 1D A8 + 39 00 00 00 00 00 02 1C A7 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1A A5 + 39 00 00 00 00 00 02 19 A4 + 39 00 00 00 00 00 02 18 A2 + 39 00 00 00 00 00 02 17 A1 + 39 00 00 00 00 00 02 16 9F + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 14 9D + 39 00 00 00 00 00 02 13 9C + 39 00 00 00 00 00 02 12 9A + 39 00 00 00 00 00 02 11 98 + 39 00 00 00 00 00 02 10 97 + 39 00 00 00 00 00 02 0F 95 + 39 00 00 00 00 00 02 0E 93 + 39 00 00 00 00 00 02 0D 92 + 39 00 00 00 00 00 02 0C 91 + 39 00 00 00 00 00 02 0B 8F + 39 00 00 00 00 00 02 0A 8E + 39 00 00 00 00 00 02 09 8C + 39 00 00 00 00 00 02 08 8B + 39 00 00 00 00 00 02 07 8A + 39 00 00 00 00 00 02 06 89 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 70 03 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 51 04 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 39 06 + 39 00 00 00 00 00 02 38 06 + 39 00 00 00 00 00 02 37 05 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 25 04 + 39 00 00 00 00 00 02 24 04 + 39 00 00 00 00 00 02 23 03 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 06 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 1E 08 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 18 05 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 05 + 39 00 00 00 00 00 02 14 05 + 39 00 00 00 00 00 02 13 05 + 39 00 00 00 00 00 02 12 05 + 39 00 00 00 00 00 02 11 05 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 04 02 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 00 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 5F + 39 00 00 00 00 00 02 D1 50 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 CE 4E + 39 00 00 00 00 00 02 CD 1B + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 85 + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1E + 39 00 00 00 00 00 02 C8 93 + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C2 2A + 39 00 00 00 00 00 02 C1 1B + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 60 + 39 00 00 00 00 00 02 B1 51 + 39 00 00 00 00 00 02 B0 26 + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AB 86 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1E + 39 00 00 00 00 00 02 A8 94 + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A3 13 + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 03 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F E6 + 39 00 00 00 00 00 02 7E E5 + 39 00 00 00 00 00 02 7D E4 + 39 00 00 00 00 00 02 7C E3 + 39 00 00 00 00 00 02 7B E3 + 39 00 00 00 00 00 02 7A E2 + 39 00 00 00 00 00 02 79 E1 + 39 00 00 00 00 00 02 78 E0 + 39 00 00 00 00 00 02 77 DF + 39 00 00 00 00 00 02 76 DF + 39 00 00 00 00 00 02 75 DE + 39 00 00 00 00 00 02 74 DD + 39 00 00 00 00 00 02 73 DD + 39 00 00 00 00 00 02 72 DC + 39 00 00 00 00 00 02 71 DB + 39 00 00 00 00 00 02 70 DA + 39 00 00 00 00 00 02 6F DA + 39 00 00 00 00 00 02 6E D9 + 39 00 00 00 00 00 02 6D D8 + 39 00 00 00 00 00 02 6C D7 + 39 00 00 00 00 00 02 6B D6 + 39 00 00 00 00 00 02 6A D6 + 39 00 00 00 00 00 02 69 D5 + 39 00 00 00 00 00 02 68 D4 + 39 00 00 00 00 00 02 67 D4 + 39 00 00 00 00 00 02 66 D3 + 39 00 00 00 00 00 02 65 D2 + 39 00 00 00 00 00 02 64 D1 + 39 00 00 00 00 00 02 63 D0 + 39 00 00 00 00 00 02 62 CF + 39 00 00 00 00 00 02 61 CE + 39 00 00 00 00 00 02 60 CD + 39 00 00 00 00 00 02 5F CC + 39 00 00 00 00 00 02 5E CB + 39 00 00 00 00 00 02 5D CA + 39 00 00 00 00 00 02 5C C9 + 39 00 00 00 00 00 02 5B C8 + 39 00 00 00 00 00 02 5A C6 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 58 C4 + 39 00 00 00 00 00 02 57 C3 + 39 00 00 00 00 00 02 56 C3 + 39 00 00 00 00 00 02 55 C2 + 39 00 00 00 00 00 02 54 C1 + 39 00 00 00 00 00 02 53 C0 + 39 00 00 00 00 00 02 52 C0 + 39 00 00 00 00 00 02 51 BF + 39 00 00 00 00 00 02 50 BE + 39 00 00 00 00 00 02 4F BD + 39 00 00 00 00 00 02 4E BC + 39 00 00 00 00 00 02 4D BC + 39 00 00 00 00 00 02 4C BB + 39 00 00 00 00 00 02 4B BB + 39 00 00 00 00 00 02 4A BA + 39 00 00 00 00 00 02 49 B9 + 39 00 00 00 00 00 02 48 B9 + 39 00 00 00 00 00 02 47 B8 + 39 00 00 00 00 00 02 46 B8 + 39 00 00 00 00 00 02 45 B7 + 39 00 00 00 00 00 02 44 B7 + 39 00 00 00 00 00 02 43 B7 + 39 00 00 00 00 00 02 42 B6 + 39 00 00 00 00 00 02 41 B5 + 39 00 00 00 00 00 02 40 B4 + 39 00 00 00 00 00 02 3F B3 + 39 00 00 00 00 00 02 3E B1 + 39 00 00 00 00 00 02 3D B0 + 39 00 00 00 00 00 02 3C B0 + 39 00 00 00 00 00 02 3B AF + 39 00 00 00 00 00 02 3A AE + 39 00 00 00 00 00 02 39 AD + 39 00 00 00 00 00 02 38 AC + 39 00 00 00 00 00 02 37 AB + 39 00 00 00 00 00 02 36 AA + 39 00 00 00 00 00 02 35 AA + 39 00 00 00 00 00 02 34 A9 + 39 00 00 00 00 00 02 33 A8 + 39 00 00 00 00 00 02 32 A8 + 39 00 00 00 00 00 02 31 A7 + 39 00 00 00 00 00 02 30 A7 + 39 00 00 00 00 00 02 2F A6 + 39 00 00 00 00 00 02 2E A6 + 39 00 00 00 00 00 02 2D A5 + 39 00 00 00 00 00 02 2C A4 + 39 00 00 00 00 00 02 2B A2 + 39 00 00 00 00 00 02 2A A0 + 39 00 00 00 00 00 02 29 9F + 39 00 00 00 00 00 02 28 9D + 39 00 00 00 00 00 02 27 9C + 39 00 00 00 00 00 02 26 9C + 39 00 00 00 00 00 02 25 9C + 39 00 00 00 00 00 02 24 9B + 39 00 00 00 00 00 02 23 9B + 39 00 00 00 00 00 02 22 9A + 39 00 00 00 00 00 02 21 99 + 39 00 00 00 00 00 02 20 99 + 39 00 00 00 00 00 02 1F 98 + 39 00 00 00 00 00 02 1E 98 + 39 00 00 00 00 00 02 1D 97 + 39 00 00 00 00 00 02 1C 96 + 39 00 00 00 00 00 02 1B 95 + 39 00 00 00 00 00 02 1A 94 + 39 00 00 00 00 00 02 19 93 + 39 00 00 00 00 00 02 18 92 + 39 00 00 00 00 00 02 17 91 + 39 00 00 00 00 00 02 16 91 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 14 90 + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 12 8E + 39 00 00 00 00 00 02 11 8E + 39 00 00 00 00 00 02 10 8D + 39 00 00 00 00 00 02 0F 8C + 39 00 00 00 00 00 02 0E 8B + 39 00 00 00 00 00 02 0D 8A + 39 00 00 00 00 00 02 0C 89 + 39 00 00 00 00 00 02 0B 88 + 39 00 00 00 00 00 02 0A 88 + 39 00 00 00 00 00 02 09 87 + 39 00 00 00 00 00 02 08 86 + 39 00 00 00 00 00 02 07 85 + 39 00 00 00 00 00 02 06 85 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + + + qcom,mdss-dsi-panel-eye-command-num = <8>; + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 69 20 + 39 00 00 00 00 00 02 6A 20 + 39 00 00 00 00 00 02 6B 01 + 39 00 00 00 00 00 02 6C 02 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 05 + 39 00 00 00 00 00 02 73 05 + 39 00 00 00 00 00 02 74 05 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 76 07 + 39 00 00 00 00 00 02 77 07 + 39 00 00 00 00 00 02 78 07 + 39 00 00 00 00 00 02 79 07 + 39 00 00 00 00 00 02 7A 07 + 39 00 00 00 00 00 02 7B 06 + 39 00 00 00 00 00 02 7C 03 + 39 00 00 00 00 00 02 7D 03 + 39 00 00 00 00 00 02 7E 03 + 39 00 00 00 00 00 02 7F 03 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 7F 03 + 39 00 00 00 00 00 02 7E 03 + 39 00 00 00 00 00 02 7D 03 + 39 00 00 00 00 00 02 7C 03 + 39 00 00 00 00 00 02 7B 06 + 39 00 00 00 00 00 02 7A 07 + 39 00 00 00 00 00 02 79 07 + 39 00 00 00 00 00 02 78 07 + 39 00 00 00 00 00 02 77 07 + 39 00 00 00 00 00 02 76 07 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 74 05 + 39 00 00 00 00 00 02 73 05 + 39 00 00 00 00 00 02 72 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6C 02 + 39 00 00 00 00 00 02 6B 01 + 39 00 00 00 00 00 02 6A 20 + 39 00 00 00 00 00 02 69 20 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 10 16 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 22 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-pwm-gpio = <&pm8937_mpps 4 0>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-nt35521s-ebbg-c3a-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-nt35521s-ebbg-c3a-720p-video.dtsi new file mode 100644 index 0000000000000..6fd0009f31f09 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-nt35521s-ebbg-c3a-720p-video.dtsi @@ -0,0 +1,233 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_nt35521s_ebbg_720_video: qcom,mdss_dsi_nt35521s_ebbg_720p_video { + qcom,mdss-dsi-panel-name = "nt35521s_HD720p_video_EBBG_c3a"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <240>; + qcom,mdss-dsi-h-back-porch = <241>; + qcom,mdss-dsi-h-pulse-width = <20>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <28>; + qcom,mdss-dsi-v-front-porch = <35>; + qcom,mdss-dsi-v-pulse-width = <2>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <20>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 B1 6C + 29 01 00 00 00 00 02 64 07 + 29 01 00 00 00 00 03 CC 40 00 + 29 01 00 00 00 00 11 D1 00 00 00 01 01 01 01 01 01 01 01 01 02 02 02 02 + 29 01 00 00 00 00 0D D7 00 00 00 00 00 00 00 00 00 00 00 00 + 29 01 00 00 00 00 0D D8 00 00 00 00 00 00 00 00 00 00 00 00 + 29 01 00 00 00 00 06 F0 55 AA 52 00 00 + 29 01 00 00 00 00 05 FF AA 55 25 01 + 29 01 00 00 00 00 02 6F 1A + 29 01 00 00 00 00 02 F7 05 + 29 01 00 00 00 00 02 6F 16 + 29 01 00 00 00 00 02 F7 10 + 29 01 00 00 00 00 02 6F 10 + 29 01 00 00 00 00 02 F7 1D + 29 01 00 00 00 00 05 FF AA 55 25 00 + 29 01 00 00 00 00 02 35 00 + 05 01 00 00 78 00 02 11 00 + 05 01 00 00 00 00 02 29 00 + 37 01 00 00 00 00 02 01 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 00 00 02 28 00 + 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [29 01 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 26 01 + 29 01 00 00 00 00 02 26 02]; + qcom,mdss-dsi-panel-cool-command = [29 01 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 26 02 + 29 01 00 00 00 00 02 26 04]; + qcom,mdss-dsi-panel-nature-command = [29 01 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 26 02 + 29 01 00 00 00 00 02 26 01]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-ce-std-command = [29 00 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 55 00]; + qcom,mdss-dsi-panel-ce-bright-command = [29 00 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 55 B0]; + qcom,mdss-dsi-panel-ce-vivid-command = [29 00 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 55 80]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-eye-command01 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 51 01 54 01 59 01 5F 01 64 01 6E 01 77 01 8A + 29 00 00 00 00 00 11 B9 01 9C 01 BC 01 D7 02 08 02 35 02 36 02 67 02 A5 + 29 00 00 00 00 00 11 BA 02 CF 03 07 03 29 03 56 03 71 03 8E 03 A2 03 CF + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command02 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 75 01 77 01 7B 01 80 01 84 01 8D 01 96 01 A5 + 29 00 00 00 00 00 11 B9 01 B4 01 CF 01 E7 02 14 02 3E 02 3F 02 70 02 AD + 29 00 00 00 00 00 11 BA 02 D6 03 0E 03 30 03 5B 03 75 03 90 03 A5 03 D1 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command03 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 91 01 93 01 97 01 9B 01 9F 01 A6 01 AD 01 BB + 29 00 00 00 00 00 11 B9 01 C8 01 E0 01 F6 02 1E 02 47 02 49 02 78 02 B5 + 29 00 00 00 00 00 11 BA 02 DE 03 14 03 36 03 60 03 79 03 94 03 A8 03 D2 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command04 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 B1 01 B2 01 B6 01 B9 01 BC 01 C2 01 C8 01 D3 + 29 00 00 00 00 00 11 B9 01 DE 01 F3 02 06 02 2C 02 53 02 54 02 83 02 BE + 29 00 00 00 00 00 11 BA 02 E7 03 1C 03 3D 03 67 03 80 03 99 03 AA 03 D2 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command05 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 C8 01 C9 01 CC 01 CF 01 D1 01 D6 01 DB 01 E6 + 29 00 00 00 00 00 11 B9 01 EF 02 02 02 14 02 37 02 5D 02 5E 02 8B 02 C7 + 29 00 00 00 00 00 11 BA 02 EF 03 23 03 43 03 6C 03 85 03 9D 03 AC 03 D2 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command06 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 DE 01 E0 01 E2 01 E5 01 E6 01 EB 01 F0 01 F8 + 29 00 00 00 00 00 11 B9 02 01 02 12 02 22 02 44 02 68 02 6A 02 96 02 D1 + 29 00 00 00 00 00 11 BA 02 F8 03 2A 03 4A 03 71 03 89 03 A1 03 C6 03 D3 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command07 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 F4 01 F5 01 F7 01 F9 01 FB 01 FF 02 02 02 0B + 29 00 00 00 00 00 11 B9 02 12 02 21 02 31 02 50 02 75 02 76 02 A1 02 DC + 29 00 00 00 00 00 11 BA 03 03 03 33 03 52 03 76 03 8C 03 A5 03 CA 03 D3 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command08 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 02 07 02 08 02 0A 02 0B 02 0E 02 11 02 14 02 1B + 29 00 00 00 00 00 11 B9 02 23 02 31 02 3F 02 5E 02 81 02 82 02 AD 02 E7 + 29 00 00 00 00 00 11 BA 03 0D 03 3C 03 5A 03 7D 03 8E 03 A8 03 CE 03 D3 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + qcom,mdss-dsi-init-last; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-hbp-power-mode; + qcom,mdss-dsi-panel-timings = [CF 32 20 00 5E 62 26 34 29 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x03>; + qcom,mdss-dsi-t-clk-pre = <0x27>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-value = <0x9C>; + qcom,mdss-dsi-panel-status-read-length = <1>; + + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-pwm-gpio = <&pm8937_mpps 4 0>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm-audio.dtsi b/arch/arm/boot/dts/qcom/msm-audio.dtsi index ee732f71cce41..2e2eada23234f 100644 --- a/arch/arm/boot/dts/qcom/msm-audio.dtsi +++ b/arch/arm/boot/dts/qcom/msm-audio.dtsi @@ -317,17 +317,19 @@ qcom,msm-mclk-freq = <9600000>; qcom,msm-mbhc-hphl-swh = <0>; qcom,msm-mbhc-gnd-swh = <0>; - qcom,msm-hs-micbias-type = "external"; + qcom,msm-hs-micbias-type = "internal"; + ext-spk-amp-gpio = <&tlmm 124 0>; + headset-gpio = <&tlmm 129 0>; qcom,msm-micbias1-ext-cap; qcom,audio-routing = "RX_BIAS", "MCLK", "SPK_RX_BIAS", "MCLK", "INT_LDO_H", "MCLK", "MIC BIAS External", "Handset Mic", - "MIC BIAS External2", "Headset Mic", + "MIC BIAS Internal2", "Headset Mic", "MIC BIAS External", "Secondary Mic", "AMIC1", "MIC BIAS External", - "AMIC2", "MIC BIAS External2", + "AMIC2", "MIC BIAS Internal2", "AMIC3", "MIC BIAS External", "WSA_SPK OUT", "VDD_WSA_SWITCH", "SpkrMono WSA_IN", "WSA_SPK OUT"; diff --git a/arch/arm/boot/dts/qcom/msm-pm8937.dtsi b/arch/arm/boot/dts/qcom/msm-pm8937.dtsi index e523cbdfb5dce..b12393cc423e4 100644 --- a/arch/arm/boot/dts/qcom/msm-pm8937.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pm8937.dtsi @@ -35,10 +35,15 @@ "resin-bark", "kpdpwr-resin-bark"; qcom,pon-dbc-delay = <15625>; qcom,system-reset; + qcom,store-hard-reset-reason; qcom,pon_1 { qcom,pon-type = <0>; qcom,pull-up = <1>; + qcom,support-reset = <1>; + qcom,s1-timer = <4480>; + qcom,s2-timer = <2000>; + qcom,s2-type = <7>; linux,code = <116>; }; diff --git a/arch/arm/boot/dts/qcom/msm-pm8953-rpm-regulator.dtsi b/arch/arm/boot/dts/qcom/msm-pm8953-rpm-regulator.dtsi index 2db90e29a82f1..874027bbc16a2 100644 --- a/arch/arm/boot/dts/qcom/msm-pm8953-rpm-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pm8953-rpm-regulator.dtsi @@ -226,13 +226,13 @@ qcom,resource-id = <10>; qcom,regulator-type = <0>; qcom,hpm-min-load = <10000>; - status = "disabled"; + status = "okay"; regulator-l10 { compatible = "qcom,rpm-smd-regulator"; regulator-name = "pm8953_l10"; qcom,set = <3>; - status = "disabled"; + status = "okay"; }; }; diff --git a/arch/arm/boot/dts/qcom/msm-pm8953.dtsi b/arch/arm/boot/dts/qcom/msm-pm8953.dtsi index 7fad9be18b27d..d247da0d82cff 100644 --- a/arch/arm/boot/dts/qcom/msm-pm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pm8953.dtsi @@ -35,10 +35,15 @@ "resin-bark", "kpdpwr-resin-bark"; qcom,pon-dbc-delay = <15625>; qcom,system-reset; + qcom,store-hard-reset-reason; qcom,pon_1 { qcom,pon-type = <0>; qcom,pull-up = <1>; + qcom,support-reset = <1>; + qcom,s1-timer = <4480>; + qcom,s2-timer = <2000>; + qcom,s2-type = <7>; linux,code = <116>; }; diff --git a/arch/arm/boot/dts/qcom/msm-pmi8940.dtsi b/arch/arm/boot/dts/qcom/msm-pmi8940.dtsi index 618daeb8c3796..d1b84d6add533 100644 --- a/arch/arm/boot/dts/qcom/msm-pmi8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pmi8940.dtsi @@ -493,6 +493,7 @@ qcom,sync-dly-us = <800>; qcom,fs-curr-ua = <20000>; qcom,en-phase-stag; + qcom,en-cabc; qcom,led-strings-list = [00 01]; qcom,en-ext-pfet-sc-pro; qcom,cons-sync-write-delay-us = <1000>; @@ -529,7 +530,7 @@ qcom,max-current = <1000>; qcom,duration = <1280>; qcom,id = <0>; - qcom,current = <625>; + qcom,current = <1000>; }; pmi8940_flash1: qcom,flash_1 { @@ -540,7 +541,7 @@ qcom,max-current = <1000>; qcom,duration = <1280>; qcom,id = <1>; - qcom,current = <625>; + qcom,current = <800>; }; pmi8940_torch0: qcom,torch_0 { @@ -560,7 +561,7 @@ "torch1_trigger"; qcom,max-current = <200>; qcom,id = <1>; - qcom,current = <120>; + qcom,current = <75>; }; pmi8940_switch: qcom,switch { @@ -587,13 +588,12 @@ vcc_pon-supply = <&pon_perph_reg>; qcom,play-mode = "direct"; qcom,wave-play-rate-us = <5263>; - qcom,actuator-type = "lra"; + qcom,actuator-type = "erm"; qcom,wave-shape = "square"; - qcom,vmax-mv = <2000>; + qcom,vmax-mv = <2900>; qcom,ilim-ma = <800>; qcom,sc-deb-cycles = <8>; qcom,int-pwm-freq-khz = <505>; - qcom,en-brake; qcom,brake-pattern = [03 03 00 00]; qcom,use-play-irq; qcom,use-sc-irq; diff --git a/arch/arm/boot/dts/qcom/msm-pmi8950.dtsi b/arch/arm/boot/dts/qcom/msm-pmi8950.dtsi index 25244c0506e53..7d18b019f490e 100644 --- a/arch/arm/boot/dts/qcom/msm-pmi8950.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pmi8950.dtsi @@ -215,7 +215,6 @@ qcom,pmic-revid = <&pmi8950_revid>; qcom,force-aicl-rerun; qcom,aicl-rerun-period-s = <180>; - qcom,autoadjust-vfloat; qcom,chgr@1000 { reg = <0x1000 0x100>; @@ -528,6 +527,7 @@ qcom,hyb-thres = <625>; qcom,sync-dly-us = <800>; qcom,fs-curr-ua = <20000>; + qcom,en-cabc; qcom,led-strings-list = [00 01]; qcom,en-ext-pfet-sc-pro; qcom,cons-sync-write-delay-us = <1000>; @@ -585,7 +585,7 @@ "torch0_trigger"; qcom,max-current = <200>; qcom,id = <0>; - qcom,current = <120>; + qcom,current = <100>; }; pmi8950_torch1: qcom,torch_1 { @@ -595,7 +595,16 @@ "torch1_trigger"; qcom,max-current = <200>; qcom,id = <1>; - qcom,current = <120>; + qcom,current = <100>; + }; + pmi8950_torch2: qcom,torch_2 { + label = "torch"; + qcom,led-name = "flashlight"; + qcom,default-led-trigger = + "torch2_trigger"; + qcom,max-current = <200>; + qcom,id = <1>; + qcom,current = <100>; }; pmi8950_switch: qcom,switch { @@ -624,11 +633,10 @@ qcom,wave-play-rate-us = <5263>; qcom,actuator-type = "erm"; qcom,wave-shape = "square"; - qcom,vmax-mv = <2000>; + qcom,vmax-mv = <2700>; qcom,ilim-ma = <800>; qcom,sc-deb-cycles = <8>; qcom,int-pwm-freq-khz = <505>; - qcom,en-brake; qcom,brake-pattern = [03 03 00 00]; qcom,use-play-irq; qcom,use-sc-irq; diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-pinctrl.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-pinctrl.dtsi index a48b5dfc866f6..ce9315b0fa7d1 100644 --- a/arch/arm/boot/dts/qcom/msm8917-camera-pinctrl.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-camera-pinctrl.dtsi @@ -275,3 +275,16 @@ cam_sensor_front1_sleep: cam_sensor_front1_sleep { drive-strength = <2>; /* 2 MA */ }; }; + +SGM3780_default: SGM3780_default { + mux { + pins = "gpio90", "gpio93"; + function = "gpio"; + }; + + config { + pins = "gpio90", "gpio93"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88503.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88503.dtsi new file mode 100644 index 0000000000000..ebcdbb518ecbb --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88503.dtsi @@ -0,0 +1,459 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +&soc { + flash_SGM3780:flashlight { + compatible = "qcom,leds-gpio-flash"; + status = "okay"; + pinctrl-names = "flash_default"; + pinctrl-0 = <&SGM3780_default>; + qcom,flash-en = <93>; + qcom,flash-now = <90>; + qcom,op-seq = "flash_en", "flash_now"; + qcom,torch-seq-val = <1 0>; + qcom,flash-seq-val = <0 1>; + linux,name = "flashlight"; + linux,default-trigger = "flashlight-trigger"; + }; + + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <3>; + qcom,flash-source = <&flash_SGM3780>; + qcom,torch-source = <&flash_SGM3780>; + }; + }; + +&cci { + actuator0: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + qcom,cci-master = <0>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + + eeprom0: qcom,eeprom@0 { + cell-index = <0>; + reg = <0x00>; + qcom,eeprom-name = "ov13850"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x20>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + qcom,page0 = <0 0x3d85 2 0x16 1 0>; + qcom,poll0 = <0 0x3d85 2 0x16 1 0>; + qcom,mem0 = <410 0x7220 2 0 1 1>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vana", + "cam_vio","cam_vdig", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 24000000 1 1>; + qcom,cam-power-seq-delay = <0 0 10 1 10 0>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom2: qcom,eeprom@2 { + cell-index = <2>; + reg = <0x02>; + qcom,eeprom-name = "s5k5e8_ofilm"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x20>; + qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <48 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom4: qcom,eeprom@4 { + cell-index = <4>; + reg = <0x04>; + qcom,eeprom-name = "s5k3l2"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xA0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x834 0x0 2 0 1 0>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vana", + "cam_vio","cam_vdig", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 24000000 1 1>; + qcom,cam-power-seq-delay = <0 0 10 1 10 0>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom5: qcom,eeprom@5{ + cell-index = <5>; + reg = <0x05>; + qcom,eeprom-name = "ov5675"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x6c>; + qcom,cci-master = <0>; + + qcom,num-blocks = <4>; + qcom,page0 = <1 0x3d88 2 7010 2 1>; + qcom,poll0 = <1 0x3d88 2 7010 2 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,poll1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,mem1 = <0 0x3d00 2 0 1 0>; + qcom,page2 = <1 0x3d85 2 0x6 1 1>; + qcom,poll2 = <1 0x3d85 2 0x6 1 1>; + qcom,mem2 = <0 0x3d00 2 0 1 0>; + qcom,page3 = <1 0x0100 2 0x1 1 1>; + qcom,pageen3 = <0 0x3d85 2 0x16 1 0>; + qcom,poll3 = <0 0x3d85 2 0x16 1 0>; + qcom,mem3 = <30 0x7010 2 0 1 1>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom6: qcom,eeprom@6 { + cell-index = <6>; + reg = <0x06>; + qcom,eeprom-name = "s5k5e8"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x30>; + qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <48 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + qcom,camera@0 { + cell-index = <0>; + compatible = "qcom,camera"; + reg = <0x0>; + qcom,csiphy-sd-index = <0>; + qcom,csid-sd-index = <0>; + qcom,mount-angle = <90>; + qcom,actuator-src = <&actuator0>; + qcom,led-flash-src = <&led_flash0>; + qcom,eeprom-src = <&eeprom0 &eeprom4>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep + &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,sensor-position = <0>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@2 { + cell-index = <2>; + compatible = "qcom,camera"; + reg = <0x01>; + qcom,csiphy-sd-index = <1>; + qcom,csid-sd-index = <1>; + qcom,eeprom-src = <&eeprom6 &eeprom5 &eeprom2>; + qcom,mount-angle = <270>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 0 2800000>; + qcom,cam-vreg-max-voltage = <1200000 0 2800000>; + qcom,cam-vreg-op-mode = <105000 0 80000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,sensor-position = <1>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88505.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88505.dtsi new file mode 100644 index 0000000000000..9312a920594df --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88505.dtsi @@ -0,0 +1,405 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +&soc { + flash_SGM3780:flashlight { + compatible = "qcom,leds-gpio-flash"; + status = "okay"; + pinctrl-names = "flash_default"; + pinctrl-0 = <&SGM3780_default>; + qcom,flash-en = <93>; + qcom,flash-now = <90>; + qcom,op-seq = "flash_en", "flash_now"; + qcom,torch-seq-val = <1 0>; + qcom,flash-seq-val = <0 1>; + linux,name = "flashlight"; + linux,default-trigger = "flashlight-trigger"; + }; + led_flash01: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <3>; + qcom,flash-source = <&flash_SGM3780>; + qcom,torch-source = <&flash_SGM3780>; + }; +}; +&cci { + actuator0: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + qcom,cci-master = <0>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + + eeprom0: qcom,eeprom@5 { + cell-index = <5>; + reg = <0x05>; + qcom,eeprom-name = "s5k3l8_ofilm_riva"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xa0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x848 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vana-supply = <&pm8917_l22>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 200000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "MCAM_RESET0", + "MCAM_STANDBY0"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 1 1 1 1 1 10 1>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom2: qcom,eeprom@2 { + cell-index = <2>; + reg = <0x02>; + qcom,eeprom-name = "s5k5e8_ofilm_riva"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x5a>; + qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <24 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vana-supply = <&pm8917_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <1 5 1 1 1 1 1 1 10>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + eeprom3: qcom,eeprom@3 { + cell-index = <3>; + reg = <0x03>; + qcom,eeprom-name = "s5k5e8_qtech_riva"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x5a>; + qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <24 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <1 5 1 1 1 1 1 1 10>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom4: qcom,eeprom@4 { + cell-index = <4>; + reg = <0x04>; + qcom,eeprom-name = "ov13855_qtech"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xa0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0xAE8 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vana-supply = <&pm8917_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 1 1 1 1 1 10 1>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@0 { + cell-index = <0>; + compatible = "qcom,camera"; + reg = <0x0>; + qcom,csiphy-sd-index = <0>; + qcom,csid-sd-index = <0>; + qcom,mount-angle = <90>; + qcom,actuator-src = <&actuator0>; + qcom,led-flash-src = <&led_flash0>; + qcom,eeprom-src = <&eeprom0 &eeprom4>; + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vana-supply = <&pm8917_l22>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep + &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,sensor-position = <0>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@2 { + cell-index = <2>; + compatible = "qcom,camera"; + reg = <0x01>; + qcom,csiphy-sd-index = <1>; + qcom,csid-sd-index = <1>; + qcom,eeprom-src = <&eeprom2 &eeprom3>; + qcom,mount-angle = <270>; + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vana-supply = <&pm8917_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <105000 80000 80000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,sensor-position = <1>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi index 70d2d831f7242..b4167b81e8137 100644 --- a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi @@ -1,5 +1,6 @@ /* * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -10,6 +11,31 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ + +&soc { + flash_SGM3780:flashlight { + compatible = "qcom,leds-gpio-flash"; + status = "okay"; + pinctrl-names = "flash_default"; + pinctrl-0 = <&SGM3780_default>; + qcom,flash-en = <93>; + qcom,flash-now = <90>; + qcom,op-seq = "flash_en", "flash_now"; + qcom,torch-seq-val = <1 0>; + qcom,flash-seq-val = <0 1>; + linux,name = "flashlight"; + linux,default-trigger = "flashlight-trigger"; + }; + + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <3>; + qcom,flash-source = <&flash_SGM3780>; + qcom,torch-source = <&flash_SGM3780>; + }; +}; + &cci { actuator0: qcom,actuator@0 { cell-index = <0>; @@ -25,25 +51,40 @@ eeprom0: qcom,eeprom@0 { cell-index = <0>; + reg = <0x00>; + qcom,eeprom-name = "ov13850"; compatible = "qcom,eeprom"; + qcom,slave-addr = <0x20>; qcom,cci-master = <0>; - reg = <0x0>; + qcom,num-blocks = <4>; + qcom,page0 = <1 0x3d88 2 7010 2 1>; + qcom,poll0 = <1 0x3d88 2 7010 2 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,poll1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,mem1 = <0 0x3d00 2 0 1 0>; + qcom,page2 = <1 0x3d85 2 0x6 1 1>; + qcom,poll2 = <1 0x3d85 2 0x6 1 1>; + qcom,mem2 = <0 0x3d00 2 0 1 0>; + qcom,page3 = <1 0x0100 2 0x1 1 1>; + qcom,pageen3 = <0 0x3d85 2 0x16 1 0>; + qcom,poll3 = <0 0x3d85 2 0x16 1 0>; + qcom,mem3 = <478 0x7220 2 0 1 1>; cam_vdig-supply = <&pm8917_l23>; cam_vana-supply = <&pm8917_l22>; cam_vio-supply = <&pm8917_l6>; cam_vaf-supply = <&pm8917_l17>; qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", "cam_vaf"; - qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-op-mode = <200000 0 80000 100000>; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_default - &cam_sensor_rear_default>; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; gpios = <&tlmm 26 0>, - <&tlmm 36 0>, - <&tlmm 35 0>; + <&tlmm 35 0>, + <&tlmm 36 0>; qcom,gpio-reset = <1>; qcom,gpio-standby = <2>; qcom,gpio-req-tbl-num = <0 1 2>; @@ -51,26 +92,180 @@ qcom,gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_STANDBY0"; + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vana", + "cam_vio","cam_vdig", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 24000000 1 1>; + qcom,cam-power-seq-delay = <0 0 10 1 10 0>; status = "ok"; clocks = <&clock_gcc clk_mclk0_clk_src>, - <&clock_gcc clk_gcc_camss_mclk0_clk>; + <&clock_gcc clk_gcc_camss_mclk0_clk>; clock-names = "cam_src_clk", "cam_clk"; qcom,clock-rates = <19200000 0>; }; eeprom2: qcom,eeprom@2 { cell-index = <2>; - compatible = "qcom,eeprom"; reg = <0x02>; + qcom,eeprom-name = "s5k5e8_ofilm"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x20>; + qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <48 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom4: qcom,eeprom@4 { + cell-index = <4>; + reg = <0x04>; + qcom,eeprom-name = "s5k3l2"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xA0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x834 0x0 2 0 1 0>; cam_vdig-supply = <&pm8917_l23>; cam_vana-supply = <&pm8917_l22>; cam_vio-supply = <&pm8917_l6>; cam_vaf-supply = <&pm8917_l17>; qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", - "cam_vaf"; - qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-op-mode = <105000 0 80000 100000>; + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vana", + "cam_vio","cam_vdig", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 24000000 1 1>; + qcom,cam-power-seq-delay = <0 0 10 1 10 0>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom5: qcom,eeprom@5{ + cell-index = <5>; + reg = <0x05>; + qcom,eeprom-name = "ov5675"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x6c>; + qcom,cci-master = <0>; + + qcom,num-blocks = <4>; + qcom,page0 = <1 0x3d88 2 7010 2 1>; + qcom,poll0 = <1 0x3d88 2 7010 2 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,poll1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,mem1 = <0 0x3d00 2 0 1 0>; + qcom,page2 = <1 0x3d85 2 0x6 1 1>; + qcom,poll2 = <1 0x3d85 2 0x6 1 1>; + qcom,mem2 = <0 0x3d00 2 0 1 0>; + qcom,page3 = <1 0x0100 2 0x1 1 1>; + qcom,pageen3 = <0 0x3d85 2 0x16 1 0>; + qcom,poll3 = <0 0x3d85 2 0x16 1 0>; + qcom,mem3 = <30 0x7010 2 0 1 1>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; qcom,gpio-no-mux = <0>; pinctrl-names = "cam_default", "cam_suspend"; pinctrl-0 = <&cam_sensor_mclk2_default @@ -87,7 +282,101 @@ qcom,gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2", "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom6: qcom,eeprom@6 { + cell-index = <6>; + reg = <0x06>; + qcom,eeprom-name = "s5k5e8"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x30>; qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <48 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; status = "ok"; clocks = <&clock_gcc clk_mclk2_clk_src>, <&clock_gcc clk_gcc_camss_mclk2_clk>; @@ -103,25 +392,24 @@ qcom,csid-sd-index = <0>; qcom,mount-angle = <90>; qcom,actuator-src = <&actuator0>; - qcom,led-flash-src = <&led_flash0>; - qcom,eeprom-src = <&eeprom0>; + qcom,eeprom-src = <&eeprom0 &eeprom4>; cam_vdig-supply = <&pm8917_l23>; cam_vana-supply = <&pm8917_l22>; cam_vio-supply = <&pm8917_l6>; cam_vaf-supply = <&pm8917_l17>; qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", "cam_vaf"; - qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-op-mode = <200000 0 80000 100000>; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; pinctrl-names = "cam_default", "cam_suspend"; pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; gpios = <&tlmm 26 0>, - <&tlmm 36 0>, - <&tlmm 35 0>; + <&tlmm 35 0>, + <&tlmm 36 0>; qcom,gpio-reset = <1>; qcom,gpio-standby = <2>; qcom,gpio-req-tbl-num = <0 1 2>; @@ -144,7 +432,7 @@ reg = <0x01>; qcom,csiphy-sd-index = <1>; qcom,csid-sd-index = <1>; - qcom,eeprom-src = <&eeprom2>; + qcom,eeprom-src = <&eeprom6 &eeprom5 &eeprom2>; qcom,mount-angle = <270>; cam_vdig-supply = <&pm8917_l23>; cam_vana-supply = <&pm8917_l22>; diff --git a/arch/arm/boot/dts/qcom/msm8917-pinctrl.dtsi b/arch/arm/boot/dts/qcom/msm8917-pinctrl.dtsi index 6617e1aafefa1..89079ae9a1ac9 100644 --- a/arch/arm/boot/dts/qcom/msm8917-pinctrl.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-pinctrl.dtsi @@ -1,5 +1,6 @@ /* * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -68,7 +69,53 @@ }; }; }; - + smb_int_pin { + pins = "gpio61"; + qcom,num-grp-pins = <1>; + qcom,pin-func = <0>; + label = "smb_int_gpio"; + smb_int_default: smb_int_default { + drive-strength = <2>; /*8 MA */ + bias-pull-up; /* PULL UP*/ + }; + }; + bq_int_default: bq_int_default { + mux { + pins = "gpio25"; + function ="gpio"; + }; + config { + pins = "gpio25"; + drive-strength = <2>; /* 2 MA */ + bias-pull-up; + /* PULL UP*/ + }; + }; + tps65132_en_default: tps65132_en_default { + mux { + pins = "gpio126", "gpio127"; + function = "gpio"; + }; + config { + pins = "gpio126", "gpio127"; + drive-strength = <2>; + bias-pull-down; + }; + }; + gpio_led_pins { + gpio_led_off: gpio_led_off { + mux { + pins = "gpio45"; + function = "gpio"; + }; + config { + pins = "gpio45"; + drive-strength = <6>; + bias-pull-down; + output-low; + }; + }; + }; pmx_ts_reset_suspend { ts_reset_suspend: ts_reset_suspend { mux { @@ -871,24 +918,24 @@ pri-tlmm-lines { pri_tlmm_lines_act: pri_tlmm_lines_act { mux { - pins = "gpio85", "gpio88"; + pins = /*"gpio85", */"gpio88"; function = "pri_mi2s"; }; config { - pins = "gpio85", "gpio88"; + pins = /*"gpio85", */"gpio88"; drive-strength = <8>; }; }; pri_tlmm_lines_sus: pri_tlmm_lines_sus { mux { - pins = "gpio85", "gpio88"; + pins = /*"gpio85", */"gpio88"; function = "pri_mi2s"; }; config { - pins = "gpio85", "gpio88"; + pins = /*"gpio85", */"gpio88"; drive-strength = <2>; bias-pull-down; }; @@ -981,7 +1028,65 @@ }; }; }; + spi7 { + spi7_default: spi7_default { + /* active state */ + mux { + /* MOSI, MISO, CLK */ + pins = "gpio85", "gpio86", "gpio88"; + function = "blsp_spi7"; + }; + config { + pins = "gpio85", "gpio86", "gpio88"; + drive-strength = <12>; /* 12 MA */ + bias-disable = <0>; /* No PULL */ + }; + }; + + spi7_sleep: spi7_sleep { + /* suspended state */ + mux { + /* MOSI, MISO, CLK */ + pins = "gpio85", "gpio86", "gpio88"; + function = "gpio"; + }; + + config { + pins = "gpio85", "gpio86", "gpio88"; + drive-strength = <2>; /* 2 MA */ + bias-pull-down; /* PULL Down */ + }; + }; + + spi7_cs0_active: cs0_active { + /* CS */ + mux { + pins = "gpio87"; + function = "blsp_spi7"; + }; + + config { + pins = "gpio87"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + + spi7_cs0_sleep: cs0_sleep { + /* CS */ + mux { + pins = "gpio87"; + function = "gpio"; + }; + + config { + pins = "gpio87"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + }; i2c_2 { i2c_2_active: i2c_2_active { /* active state */ @@ -1007,7 +1112,7 @@ config { pins = "gpio6", "gpio7"; drive-strength = <2>; - bias-disable; + bias-pull-down; }; }; }; @@ -1182,12 +1287,12 @@ usbc_int_default: usbc_int_default { mux { - pins = "gpio97", "gpio131"; + pins = /*"gpio97",*/ "gpio131"; function = "gpio"; }; config { - pins = "gpio97", "gpio131"; + pins = /*"gpio97",*/ "gpio131"; drive-strength = <2>; bias-pull-up; }; diff --git a/arch/arm/boot/dts/qcom/msm8917-pm.dtsi b/arch/arm/boot/dts/qcom/msm8917-pm.dtsi index 367bdee125249..1cf7cee0d0ae2 100644 --- a/arch/arm/boot/dts/qcom/msm8917-pm.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-pm.dtsi @@ -202,6 +202,7 @@ <0xff 155>, /* sdc1_irq(0) */ <0xff 157>, /* sdc2_irq(0) */ <0xff 167>, /* bam_irq(0) */ + <0xff 168>, <0xff 170>, /* sdc1_pwr_cmd_irq */ <0xff 173>, /* o_wcss_apss_smd_hi */ <0xff 174>, /* o_wcss_apss_smd_med */ @@ -241,6 +242,7 @@ <0xff 263>, /* ipa_bam_irq[2] */ <0xff 269>, /* rpm_wdog_expired_irq */ <0xff 270>, /* blsp1_bam_irq[0] */ + <0xff 271>, /* sps interrupt */ <0xff 272>, /* smmu_intr_bus[17] */ <0xff 273>, /* smmu_bus_intr[18] */ <0xff 274>, /* smmu_bus_intr[19] */ diff --git a/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dts b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dts new file mode 100644 index 0000000000000..68989f098a838 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8917.dtsi" +#include "msm8917-pmi8937-qrd-sku5_S88503.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8917-PMI8937 QRD SKU5"; + compatible = "qcom,msm8917-qrd-sku5", "qcom,msm8917-qrd", + "qcom,msm8917", "qcom,qrd"; + qcom,board-id= <0x1000b 1>, <0x2000b 1>; +}; + +&int_codec { + qcom,model = "msm8917-sku5-snd-card"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dtsi b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dtsi new file mode 100644 index 0000000000000..928e626ce5b4f --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dtsi @@ -0,0 +1,437 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm8917-qrd.dtsi" +#include "msm8937-mdss-panels.dtsi" +#include "dsi-panel-hx8394f-boe-c3a-720p-video.dtsi" +#include "dsi-panel-nt35521s-ebbg-c3a-720p-video.dtsi" + +#include "dsi-panel-ili9881c-ebbg-c3a-720p-video.dtsi" + +#include "msm8917-qrd_S88503.dtsi" +#include "msm8917-camera-sensor-qrd-s88503.dtsi" + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_boe_720_vid>; + qcom,dsi-pref-sub-pan = <&dsi_nt35521s_ebbg_720_video>; + + qcom,dsi-pref-sub1-pan = <&dsi_ili9881c_ebbg_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active>; + pinctrl-1 = <&mdss_dsi_suspend>; + qcom,platform-te-gpio = <&tlmm 24 0>; + qcom,platform-reset-gpio = <&tlmm 60 0>; + lab-supply = <&tps65132_pos>; + ibb-supply = <&tps65132_neg>; + + qcom,regulator-ldo-mode; + qcom,platform-regulator-settings = [ 00 01 01 00 20 07 00]; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <5000000>; + qcom,supply-max-voltage = <5000000>; + qcom,supply-enable-load = <200>; + qcom,supply-disable-load = <0>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <5000000>; + qcom,supply-max-voltage = <5000000>; + qcom,supply-enable-load = <40>; + qcom,supply-disable-load = <0>; + qcom,supply-post-off-sleep = <3>; + }; +}; +&dsi_hx8394f_boe_720_vid { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; +&dsi_nt35521s_ebbg_720_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + + + + +&dsi_ili9881c_ebbg_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&soc { + i2c@78b6000 { /* i2c 2 */ + aw2013@45 { /*blink */ + compatible = "awinc,aw2013"; + reg = <0x45>; + rgb_led-supply = <&pm8917_l10>; + + red { + label = "red"; + linux,default-trigger = "battery-red"; + default-state = "off"; + retain-state-suspended; + }; + + green { + label = "green"; + linux,default-trigger = "battery-green"; + default-state = "off"; + retain-state-suspended; + }; + + blue { + label = "blue"; + linux,default-trigger = "battery-blue"; + default-state = "off"; + retain-state-suspended; + }; + white { + label = "white"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + yellow { + label = "yellow"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + cyan { + label = "cyan"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + purple { + label = "purple"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + }; +}; +gpio-leds { + compatible = "gpio-leds"; + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&gpio_led_off>; + + infred { + gpios = <&tlmm 45 0>; + label = "infrared"; + linux,default-trigger = "infra-red"; + default-state = "off"; + retain-state-suspended; + }; + + }; + gpio-vib { + compatible = "gpio-vibrator"; + vibrator { + gpios = <&tlmm 97 0>; + label = "vibrator"; + max_timeout = <50000>; + }; + }; +}; +&i2c_3 { /* BLSP1 QUP3 */ + status = "ok"; + ftech@38 { + compatible = "focaltech,5336"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + ftech,name = "ft5336"; + ftech,family-id = <0x36>; + ftech,reset-gpio = <&tlmm 64 0x00>; + ftech,irq-gpio = <&tlmm 65 0x2008>; + ftech,display-coords = <0 0 720 1280>; + ftech,panel-coords = <0 0 720 1280>; + ftech,virtual-key1 = <139 140 2000>;/*menu*/ + ftech,virtual-key2 = <172 360 2000>;/*home*/ + ftech,virtual-key3 = <158 580 2000>;/*back*/ + ftech,no-force-update; + ftech,i2c-pull-up; + ftech,group-id = <1>; + ftech,hard-reset-delay-ms = <20>; + ftech,soft-reset-delay-ms = <200>; + ftech,num-max-touches = <10>; + ftech,fw-delay-aa-ms = <30>; + ftech,fw-delay-55-ms = <30>; + ftech,fw-upgrade-id1 = <0x79>; + ftech,fw-upgrade-id2 = <0x18>; + ftech,fw-delay-readid-ms = <10>; + ftech,fw-delay-era-flsh-ms = <2000>; + ftech,fw-auto-cal; + ftech,ignore-id-check; + }; + goodix_ts@5d { + compatible = "goodix,gt9xx"; + reg = <0x5d>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd_ana-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + goodix,rst-gpio = <&tlmm 64 0x00>; + goodix,irq-gpio = <&tlmm 65 0x2008>; + goodix,cfg-group0 = [ + 41 D0 02 00 05 05 75 01 01 0F 24 + 0F 64 3C 03 05 00 00 00 02 00 00 + 00 16 19 1C 14 8C 0E 0E 24 00 31 + 0D 00 00 00 83 33 1D 00 41 00 00 + 00 00 00 08 0A 00 2B 1C 3C 94 D5 + 03 08 00 00 04 93 1E 00 82 23 00 + 74 29 00 69 2F 00 5F 37 00 5F 20 + 40 60 00 F0 40 30 55 50 27 00 00 + 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 14 19 00 00 + 50 50 02 04 06 08 0A 0C 0E 10 12 + 14 16 18 1A 1C 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 1D + 1E 1F 20 21 22 24 26 28 29 2A 1C + 18 16 14 13 12 10 0F 0C 0A 08 06 + 04 02 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 9C 01]; + }; + +}; + +&soc { + gen-vkeys_ft { + compatible = "qcom,gen-vkeys"; + label = "ft5346"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <2080>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; + gen-vkeys_gt { + compatible = "qcom,gen-vkeys_gt"; + label = "goodix-ts"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <2080>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; + +}; + +&i2c_2 { /* i2c 2 */ + tps65132@3e { + compatible = "ti,tps65132"; + reg = <0x3e>; + i2c-pwr-supply = <&pm8917_l5>; + ti,en-gpio-lpm; + pinctrl-names = "default"; + pinctrl-0 = <&tps65132_en_default>; + + regulators { + tps65132_pos: pos-boost { + regulator-name = "tps65132-pos"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + ti,discharge-enable; + ti,enable-time = <800>; + ti,current-limit = <200000>; + ti,en-gpio = <&tlmm 126 0>; + }; + + tps65132_neg: neg-boost { + regulator-name = "tps65132-neg"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + ti,discharge-enable; + ti,enable-time = <800>; + ti,current-limit = <40000>; + ti,en-gpio = <&tlmm 127 0>; + }; + }; + }; +}; + + + +&i2c_5 { + status = "ok"; + smb358_otg_vreg: smb358-charger@57 { + compatible = "qcom,smb358-charger"; + reg = <0x57>; + interrupt-parent = <&tlmm>; + interrupts = <61 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <&smb_int_default>; + qcom,irq-gpio = <&tlmm 61 0x0>; + qcom,battid-gpio = <&pm8937_gpios 5 0>; + qcom,float-voltage-mv = <4400>; + qcom,recharge-mv = <50>; + regulator-name = "smb358_otg_vreg"; + qcom,thermal-mitigation = <1500 1000 700 700>; + qcom,fastchg-current-max-ma = <1500>; + qcom,bms-psy-name = "bms"; + + qcom,bms-controlled-charging; + qcom,chg-inhibit-disabled; + qcom,chg-vadc = <&pm8937_vadc>; + qcom,chg-adc_tm = <&pm8937_adc_tm>; + qcom,using-pmic-therm; + qcom,bat-present-decidegc = <(300)>; + qcom,disable-apsd; +/* + * Below properties are used for enable JEITA + */ + qcom,hot-bat-decidegc = <600>; + qcom,warm-bat-decidegc = <450>; + qcom,cool-bat-decidegc = <100>; + qcom,cold-bat-decidegc = <0>; + qcom,warm-bat-ma = <600>; + + qcom,cool-normal-bat-ma = <600>; + qcom,cool-cold-bat-ma = <300>; + qcom,iterm-ma = <150>; + qcom,warm-bat-mv = <4100>; + qcom,cool-bat-mv = <4400>; + + qcom,battery-fcc = <3030>; + status = "ok"; + }; + cw2015: cw2015@62 { + compatible = "cellwise,cw2015"; + reg = <0x62>; + vdd-supply = <&pm8917_l17>; + vcc_i2c-supply = <&pm8917_l5>; + interrupt-parent = <&tlmm>; + interrupts = <86 8>; + cw2015,irq-gpio=<86>; + }; +}; +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + }; +}; +&usb_otg { + + qcom,hsusb-otg-mode = <3>; + interrupts = <0 134 0>,<0 140 0>,<0 136 0>; + interrupt-names = "core_irq", "async_irq", "phy_irq"; + vbus_otg-supply = <&smb358_otg_vreg>; + qcom,hsusb-otg-phy-init-seq = + <0x39 0x81 0x37 0x82 0xffffffff>; +}; + +&pm8937_vadc{ + chan@13 { + label = "mpp4"; + reg = <0x13>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "absolute"; + qcom,scale-function = <0>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + }; +}; + +&pm8937_gpios { +gpio@c700 { + reg = <0xc700 0x100>; + qcom,pin-num = <8>; + qcom,mode = <1>; /*QPNP_PIN_MODE_DIG_OUT*/ + qcom,output-type = <0>; /*QPNP_PIN_OUT_BUF_CMOS*/ + qcom,invert = <0>; /*QPNP_PIN_INVERT_DISABLE*/ + qcom,pull = <5>; /*QPNP_PIN_PULL_NO*/ + qcom,vin-sel = <0>; /*QPNP_PIN_VIN2, VREG_S3A*/ + qcom,out-strength = <3>;/*QPNP_PIN_OUT_STRENGTH_MED*/ + qcom,src-sel = <5>; /*QPNP_PIN_SEL_FUNC_2*/ + qcom,master-en = <1>; /*Enable GPIO by default*/ + status = "ok"; + }; + gpio@c400 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; + + &pm8937_1{ + pm8937_pwm: pwm@bc00 { + status = "ok"; + compatible = "qcom,qpnp-pwm"; + reg = <0xbc00 0x100>; + reg-names = "qpnp-lpg-channel-base"; + qcom,channel-id = <0>; + qcom,supported-sizes = <6>, <9>; + qcom,force-pwm-size = <9>; + #pwm-cells = <2>; + }; + }; + +/ { +qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + qcom,rpull-up-kohm = <68>; + qcom,vref-batt-therm = <1800000>; + + #include "batterydata-wingtech-feimaotui_SONY-4v4-3030mah.dtsi" + #include "batterydata-wingtech-xingwangda_ATL-4v4-3030mah.dtsi" + + }; + +}; +&rpm_bus { + rpm-regulator-ldoa6 { + pm8917_l6: regulator-l6 { + regulator-always-on; + }; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dts b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dts new file mode 100644 index 0000000000000..04aa0b9b9fedc --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8917.dtsi" +#include "msm8917-pmi8937-qrd-sku5_S88505.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8917-PMI8937 QRD SKU5"; + compatible = "qcom,msm8917-qrd-sku5", "qcom,msm8917-qrd", + "qcom,msm8917", "qcom,qrd"; + qcom,board-id= <0x1000b 2>, <0x2000b 2>; +}; + +&int_codec { + qcom,model = "msm8917-sku5-snd-card"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dtsi b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dtsi new file mode 100644 index 0000000000000..758c8178d02d3 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dtsi @@ -0,0 +1,442 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm8917-qrd.dtsi" +#include "msm8937-mdss-panels.dtsi" +#include "dsi-panel-hx8394f-boe-c3b-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbg-c3b-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbgDJN-c3b-720p-video.dtsi" +#include "dsi-panel-ili9881c-tianma-c3b-720p-video.dtsi" + +#include "msm8917-camera-sensor-qrd-s88505.dtsi" + +#include "msm8917-qrd_S88505.dtsi" + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_boe_720_vid>; + qcom,dsi-pref-sub-pan = <&dsi_ili9881c_ebbg_720p_video>; + qcom,dsi-pref-sub1-pan = <&dsi_ili9881c_ebbgDJN_720p_video>; + qcom,dsi-pref-sub2-pan = <&dsi_ili9881c_tianma_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active>; + pinctrl-1 = <&mdss_dsi_suspend>; + qcom,platform-te-gpio = <&tlmm 24 0>; + qcom,platform-reset-gpio = <&tlmm 60 0>; + lab-supply = <&tps65132_pos>; + ibb-supply = <&tps65132_neg>; + + qcom,regulator-ldo-mode; + qcom,platform-regulator-settings = [ 00 01 01 00 20 07 00]; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <5000000>; + qcom,supply-max-voltage = <5000000>; + qcom,supply-enable-load = <200>; + qcom,supply-disable-load = <0>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <5000000>; + qcom,supply-max-voltage = <5000000>; + qcom,supply-enable-load = <40>; + qcom,supply-disable-load = <0>; + qcom,supply-post-off-sleep = <3>; + }; +}; +&dsi_hx8394f_boe_720_vid { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ili9881c_ebbg_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ili9881c_ebbgDJN_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ili9881c_tianma_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + + +&soc { + i2c@78b7000 { + status = "ok"; + ftech@38 { + compatible = "focaltech,5336"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + ftech,name = "ft5336"; + ftech,family-id = <0x36>; + ftech,reset-gpio = <&tlmm 64 0x00>; + ftech,irq-gpio = <&tlmm 65 0x2008>; + ftech,display-coords = <0 0 720 1280>; + ftech,panel-coords = <0 0 720 1280>; + ftech,virtual-key1 = <139 140 2000>;/*menu*/ + ftech,virtual-key2 = <172 360 2000>;/*home*/ + ftech,virtual-key3 = <158 580 2000>;/*back*/ + ftech,no-force-update; + ftech,i2c-pull-up; + ftech,group-id = <1>; + ftech,hard-reset-delay-ms = <20>; + ftech,soft-reset-delay-ms = <200>; + ftech,num-max-touches = <10>; + ftech,fw-delay-aa-ms = <30>; + ftech,fw-delay-55-ms = <30>; + ftech,fw-upgrade-id1 = <0x79>; + ftech,fw-upgrade-id2 = <0x18>; + ftech,fw-delay-readid-ms = <10>; + ftech,fw-delay-era-flsh-ms = <2000>; + ftech,fw-auto-cal; + ftech,ignore-id-check; + }; + goodix_ts@5d { + compatible = "goodix,gt9xx"; + reg = <0x5d>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd_ana-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + goodix,rst-gpio = <&tlmm 64 0x00>; + goodix,irq-gpio = <&tlmm 65 0x2008>; + goodix,cfg-group0 = [ + 41 D0 02 00 05 05 75 01 01 0F 24 + 0F 64 3C 03 05 00 00 00 02 00 00 + 00 16 19 1C 14 8C 0E 0E 24 00 31 + 0D 00 00 00 83 33 1D 00 41 00 00 + 00 00 00 08 0A 00 2B 1C 3C 94 D5 + 03 08 00 00 04 93 1E 00 82 23 00 + 74 29 00 69 2F 00 5F 37 00 5F 20 + 40 60 00 F0 40 30 55 50 27 00 00 + 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 14 19 00 00 + 50 50 02 04 06 08 0A 0C 0E 10 12 + 14 16 18 1A 1C 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 1D + 1E 1F 20 21 22 24 26 28 29 2A 1C + 18 16 14 13 12 10 0F 0C 0A 08 06 + 04 02 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 9C 01]; + }; + + }; + + gen-vkeys { + compatible = "qcom,gen-vkeys"; + label = "ft5346"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <2080>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; + gen-vkeys_gt { + compatible = "qcom,gen-vkeys_gt"; + label = "goodix-ts"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <2080>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; + + i2c@78b6000 { /* i2c 2 */ + aw2013@45 { /*blink */ + compatible = "awinc,aw2013"; + reg = <0x45>; + rgb_led-supply = <&pm8917_l10>; + + red { + label = "red"; + linux,default-trigger = "battery-red"; + default-state = "off"; + retain-state-suspended; + }; + + green { + label = "green"; + linux,default-trigger = "battery-green"; + default-state = "off"; + retain-state-suspended; + }; + + blue { + label = "blue"; + linux,default-trigger = "battery-blue"; + default-state = "off"; + retain-state-suspended; + }; + white { + label = "white"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + yellow { + label = "yellow"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + cyan { + label = "cyan"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + purple { + label = "purple"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + }; +}; +gpio-vib { + compatible = "gpio-vibrator"; + vibrator { + gpios = <&tlmm 97 0>; + label = "vibrator"; + max_timeout = <50000>; + }; + }; +}; + + +&i2c_2 { /* i2c 2 */ + tps65132@3e { + compatible = "ti,tps65132"; + reg = <0x3e>; + i2c-pwr-supply = <&pm8917_l5>; + ti,en-gpio-lpm; + pinctrl-names = "default"; + pinctrl-0 = <&tps65132_en_default>; + + regulators { + tps65132_pos: pos-boost { + regulator-name = "tps65132-pos"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + ti,discharge-enable; + ti,enable-time = <800>; + ti,current-limit = <200000>; + ti,en-gpio = <&tlmm 126 0>; + }; + + tps65132_neg: neg-boost { + regulator-name = "tps65132-neg"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + ti,discharge-enable; + ti,enable-time = <800>; + ti,current-limit = <40000>; + ti,en-gpio = <&tlmm 127 0>; + }; + }; + }; +}; + + +&spi_7{ + status = "ok"; + spi_ir@1 { + compatible = "qcom,spi-msm-codec-slave"; + reg = <1>; + spi-max-frequency = <50000000>; + spi-cpol; + status = "ok"; + }; +}; + + +&i2c_5 { + status = "ok"; + +bq27426@55 { + compatible = "ti,bq27426"; + reg = <0x55>; + + vcc_i2c-supply = <&pm8917_l5>; + interrupt-parent = <&tlmm>; + interrupts = <25 2>; + qcom,battid-vadc = <&pm8937_vadc>; + pinctrl-names = "default"; + pinctrl-0 = <&bq_int_default>; +}; + +bq2560x_otg_supply: bq2560x@6B { + compatible = "ti,bq25601-charger"; + reg = <0x6B>; + interrupt-parent = <&tlmm>; + interrupts = <61 2>; + pinctrl-names = "default"; + pinctrl-0 = <&smb_int_default>; + + regulator-name = "bq2560x_otg_supply"; + vdd-supply = <&pm8917_l17>; + + + ti,bq2560x,chip-enable-gpio = <48>; + ti,bq2560x,usb-vlim = <4400>; + ti,bq2560x,usb-ilim = <500>; + ti,bq2560x,usb-vreg = <4400>; + ti,bq2560x,usb-ichg = <500>; + + ti,bq2560x,ta-vlim = <4400>; + ti,bq2560x,ta-ilim = <1000>; + ti,bq2560x,ta-vreg = <4400>; + ti,bq2560x,ta-ichg = <1500>; + qcom,thermal-mitigation = <1000 800 700 0>; + + ti,bq2560x,precharge-current = <256>; + ti,bq2560x,termination-current = <60>; + ti,bq2560x,boost-voltage = <4998>; + ti,bq2560x,boost-current = <500>; + ti,bq2560x,enable_term; + ti,bq2560x,stat-pin-ctrl = <0>; + ti,bq2560x,vac-ovp-threshold = <6500>; + + ti,bq2560x,jeita-hot-degc = <550>; + ti,bq2560x,jeita-warm-degc = <450>; + ti,bq2560x,jeita-cool-normal-degc = <150>; + ti,bq2560x,jeita-cold-cool-degc = <50>; + ti,bq2560x,jeita-cold-degc = <0>; + + ti,bq2560x,jeita-hot-hysteresis = <20>; + ti,bq2560x,jeita-cold-hysteresis = <10>; + + ti,bq2560x,jeita-cold-cool-ma = <300>; + ti,bq2560x,jeita-cool-normal-ma = <600>; + ti,bq2560x,jeita-cool-mv = <4400>; + ti,bq2560x,jeita-warm-ma = <1000>; + ti,bq2560x,jeita-warm-mv = <4100>; + + ti,bq2560x,software-jeita-supported; + }; +}; + +&pm8937_vadc { + chan@13 { + label = "mpp4"; + reg = <0x13>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "absolute"; + qcom,scale-function = <0>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + }; +}; + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + }; +}; +&usb_otg { + qcom,hsusb-otg-mode = <3>; + interrupts = <0 134 0>,<0 140 0>,<0 136 0>; + interrupt-names = "core_irq", "async_irq", "phy_irq"; + vbus_otg-supply = <&bq2560x_otg_supply>; + qcom,hsusb-otg-phy-init-seq = + <0x53 0x80 0x39 0x81 0x37 0x82 0xffffffff>; +}; +&pm8937_gpios { + gpio@c700 { + reg = <0xc700 0x100>; + qcom,pin-num = <8>; + qcom,mode = <1>; /*QPNP_PIN_MODE_DIG_OUT*/ + qcom,output-type = <0>; /*QPNP_PIN_OUT_BUF_CMOS*/ + qcom,invert = <0>; /*QPNP_PIN_INVERT_DISABLE*/ + qcom,pull = <5>; /*QPNP_PIN_PULL_NO*/ + qcom,vin-sel = <0>; /*QPNP_PIN_VIN2, VREG_S3A*/ + qcom,out-strength = <3>;/*QPNP_PIN_OUT_STRENGTH_MED*/ + qcom,src-sel = <5>; /*QPNP_PIN_SEL_FUNC_2*/ + qcom,master-en = <1>; /*Enable GPIO by default*/ + status = "ok"; + }; + gpio@c400 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; + + &pm8937_1{ + pm8937_pwm: pwm@bc00 { + status = "ok"; + compatible = "qcom,qpnp-pwm"; + reg = <0xbc00 0x100>; + reg-names = "qpnp-lpg-channel-base"; + qcom,channel-id = <0>; + qcom,supported-sizes = <6>, <9>; + qcom,force-pwm-size = <9>; + #pwm-cells = <2>; + }; + }; + +/ { +qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + qcom,rpull-up-kohm = <68>; + qcom,vref-batt-therm = <1800000>; + #include "batterydata-qrd-sku2-4v35-2590mah.dtsi" + #include "batterydata-wingtech-desai_SAMSUNG-4v4-4000mah.dtsi" + #include "batterydata-wingtech-feimaotui_SONY-4v4-4000mah.dtsi" + #include "batterydata-wingtech-xingwangda_ATL-4v4-4000mah.dtsi" + #include "batterydata-wingtech-guangyu_Coslight-4v4-4000mah.dtsi" + }; + +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8917-qrd.dtsi index c0644c765e1b3..66e77fb5ef64d 100644 --- a/arch/arm/boot/dts/qcom/msm8917-qrd.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-qrd.dtsi @@ -12,7 +12,6 @@ */ #include "msm8917-pinctrl.dtsi" -#include "msm8917-camera-sensor-qrd.dtsi" &blsp1_uart2 { status = "ok"; @@ -25,6 +24,7 @@ vdd-supply = <&pm8917_l8>; qcom,vdd-voltage-level = <2900000 2900000>; qcom,vdd-current-level = <200 570000>; + qcom,vdd-always-on; /* device communication power supply */ vdd-io-supply = <&pm8917_l5>; diff --git a/arch/arm/boot/dts/qcom/msm8917-qrd_S88503.dtsi b/arch/arm/boot/dts/qcom/msm8917-qrd_S88503.dtsi new file mode 100644 index 0000000000000..25ee555dffa2d --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-qrd_S88503.dtsi @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +&int_codec { + status = "okay"; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-gpios = + "pri_i2s"; + qcom,pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-0 = <&cdc_pdm_lines_sus &cdc_pdm_lines_2_sus>; + pinctrl-1 = <&cdc_pdm_lines_act &cdc_pdm_lines_2_act>; + qcom,cdc-us-euro-gpios; + qcom,msm-hs-micbias-type = "internal"; + qcom,audio-routing = + "RX_BIAS", "MCLK", + "SPK_RX_BIAS", "MCLK", + "INT_LDO_H", "MCLK", + "MIC BIAS External", "Handset Mic", + "MIC BIAS Internal2", "Headset Mic", + "MIC BIAS External", "Secondary Mic", + "AMIC1", "MIC BIAS External", + "AMIC2", "MIC BIAS Internal2", + "AMIC3", "MIC BIAS External"; +}; + diff --git a/arch/arm/boot/dts/qcom/msm8917-qrd_S88505.dtsi b/arch/arm/boot/dts/qcom/msm8917-qrd_S88505.dtsi new file mode 100644 index 0000000000000..76e13b8cb4537 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-qrd_S88505.dtsi @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +&int_codec { + status = "okay"; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-gpios = + "pri_i2s"; + qcom,pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-0 = <&cdc_pdm_lines_sus &cdc_pdm_lines_2_sus>; + pinctrl-1 = <&cdc_pdm_lines_act &cdc_pdm_lines_2_act>; + qcom,cdc-us-euro-gpios; + ext-spk-amp-gpio; + qcom,msm-spk-ext-pa = <&tlmm 124 0>; + qcom,msm-hs-micbias-type = "internal"; + qcom,msm-micbias2-ext-cap; + qcom,audio-routing = + "RX_BIAS", "MCLK", + "SPK_RX_BIAS", "MCLK", + "INT_LDO_H", "MCLK", + "MIC BIAS External", "Handset Mic", + "MIC BIAS Internal2", "Headset Mic", + "MIC BIAS External", "Secondary Mic", + "AMIC1", "MIC BIAS External", + "AMIC2", "MIC BIAS Internal2", + "AMIC3", "MIC BIAS External"; +}; + diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index cd233ccbb99e8..e7a25b3191377 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -1,5 +1,6 @@ /* * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -40,6 +41,7 @@ smd21 = &smdtty_data21; smd36 = &smdtty_loopback; spi3 = &spi_3; + spi7 = &spi_7; i2c2 = &i2c_2; i2c5 = &i2c_5; i2c3 = &i2c_3; @@ -55,7 +57,7 @@ other_ext_mem: other_ext_region@0 { compatible = "removed-dma-pool"; no-map; - reg = <0x0 0x85b00000 0x0 0xd00000>; + reg = <0x0 0x84A00000 0x0 0x1E00000>; }; modem_mem: modem_region@0 { @@ -398,7 +400,6 @@ qcom,freq-mitigation-temp = <105>; qcom,freq-mitigation-temp-hysteresis = <15>; qcom,freq-mitigation-value = <998400>; - qcom,therm-reset-temp = <115>; qcom,online-hotplug-core; qcom,synchronous-cluster-id = <1>; qcom,synchronous-cluster-map = <1 4 &CPU0 &CPU1 &CPU2 &CPU3>; @@ -557,6 +558,32 @@ dma-names = "tx", "rx"; }; + spi_7: spi@7af7000 { /* BLSP1 QUP3 */ + compatible = "qcom,spi-qup-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "spi_physical", "spi_bam_physical"; + reg = <0x7af7000 0x600>, + <0x7ac4000 0x1f000>; + interrupt-names = "spi_irq", "spi_bam_irq"; + interrupts = <0 301 0>, <0 239 0>; + spi-max-frequency = <50000000>; + pinctrl-names = "spi_default", "spi_sleep"; + pinctrl-0 = <&spi7_default &spi7_cs0_active>; + pinctrl-1 = <&spi7_sleep &spi7_cs0_sleep>; + clocks = <&clock_gcc clk_gcc_blsp2_ahb_clk>, + <&clock_gcc clk_gcc_blsp2_qup3_spi_apps_clk>; + clock-names = "iface_clk", "core_clk"; + qcom,use-bam; + qcom,use-pinctrl; + qcom,ver-reg-exists; + qcom,bam-consumer-pipe-index = <8>; + qcom,bam-producer-pipe-index = <9>; + qcom,master-id = <84>; + qcom,rt-priority; + status = "disabled"; + }; + rpm_bus: qcom,rpm-smd { compatible = "qcom,rpm-smd"; rpm-channel-name = "rpm_requests"; @@ -752,10 +779,10 @@ HSUSB_1p8-supply = <&pm8917_l7>; HSUSB_3p3-supply = <&pm8917_l13>; qcom,vdd-voltage-level = <0 1200000 1200000>; - vbus_otg-supply = <&smbcharger_charger_otg>; - + qcom,hsusb-otg-phy-init-seq = + <0x53 0x80 0x32 0x81 0x07 0x82 0x13 0x83 0xffffffff>; qcom,hsusb-otg-phy-type = <3>; /* SNPS Femto PHY */ - qcom,hsusb-otg-mode = <3>; /* OTG mode */ + qcom,hsusb-otg-mode = <1>; /* OTG mode */ qcom,hsusb-otg-otg-control = <2>; /* PMIC */ qcom,dp-manual-pullup; qcom,hsusb-otg-mpm-dpsehv-int = <49>; @@ -765,7 +792,7 @@ qcom,axi-prefetch-enable; qcom,enable-sdp-typec-current-limit; qcom,hsusb-otg-delay-lpm; - + qcom,hsusb-otg-default-mode = <1>; /* peripheral mode */ qcom,msm-bus,name = "usb2"; qcom,msm-bus,num-cases = <3>; qcom,msm-bus,num-paths = <1>; @@ -1112,6 +1139,18 @@ }; }; + sn_fuse: snfuse@0xa0128 { + compatible = "qcom,sn-fuse"; + reg = <0xa0128 0x4>; + reg-names = "sn-base"; + }; + + sec_boot_fuse: secbootfuse@0xa41d0 { + compatible = "qcom,sec-boot-fuse"; + reg = <0xa41d0 0x4>; + reg-names = "sec-boot-base"; + }; + qcom,smdtty { compatible = "qcom,smdtty"; @@ -1283,9 +1322,9 @@ qcom,ce-opp-freq = <100000000>; }; - qcom_seecom: qseecom@85b00000 { + qcom_seecom: qseecom@84A00000 { compatible = "qcom,qseecom"; - reg = <0x85b00000 0x800000>; + reg = <0x84A00000 0x1900000>; reg-names = "secapp-region"; qcom,hlos-num-ce-hw-instances = <1>; qcom,hlos-ce-hw-instance = <0>; diff --git a/arch/arm/boot/dts/qcom/msm8937-audio.dtsi b/arch/arm/boot/dts/qcom/msm8937-audio.dtsi index 8a2dd86562e23..0c2adc6f3214c 100644 --- a/arch/arm/boot/dts/qcom/msm8937-audio.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-audio.dtsi @@ -17,7 +17,7 @@ qcom,model = "msm8952-snd-card-mtp"; qcom,cdc-us-euro-gpios = <&tlmm 63 0>; - qcom,msm-mbhc-hphl-swh = <0>; + qcom,msm-mbhc-hphl-swh = <1>; qcom,msm-mbhc-gnd-swh = <0>; qcom,msm-hs-micbias-type = "external"; qcom,msm-micbias1-ext-cap; diff --git a/arch/arm/boot/dts/qcom/msm8937-camera-sensor-qrd-wt88536.dtsi b/arch/arm/boot/dts/qcom/msm8937-camera-sensor-qrd-wt88536.dtsi new file mode 100644 index 0000000000000..0e217d8ec3123 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8937-camera-sensor-qrd-wt88536.dtsi @@ -0,0 +1,425 @@ +/* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +&cci { + actuator0: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + qcom,cci-master = <0>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + + eeprom0: qcom,eeprom@0 { + cell-index = <0>; + reg = <0x00>; + qcom,eeprom-name = "s5k3l8_ofilm"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xB0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x7E9 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 200000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 36 0>, + <&tlmm 35 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "MCAM_RESET0", + "MCAM_STANDBY0"; + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vio", + "cam_vana", "cam_vdig", "cam_vaf", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 1 24000000 0 0 1 1>; + qcom,cam-power-seq-delay = <1 1 5 1 10 5 5 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom1: qcom,eeprom@1 { + cell-index = <1>; + reg = <0x01>; + qcom,eeprom-name = "s5k3l8_sunny"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xB0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x7E9 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 200000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 36 0>, + <&tlmm 35 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "MCAM_RESET0", + "MCAM_STANDBY0"; + + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vio", + "cam_vana", "cam_vdig", "cam_vaf", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 1 24000000 0 0 1 1>; + qcom,cam-power-seq-delay = <1 1 5 5 10 5 5 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom2: qcom,eeprom@2{ + cell-index = <2>; + reg = <0x02>; + qcom,eeprom-name = "ov5675_ofilm"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x6c>; + qcom,cci-master = <0>; + qcom,num-blocks = <4>; + + qcom,page0 = <1 0x3d88 2 7010 2 1>; + qcom,poll0 = <1 0x3d88 2 7010 2 1>; + qcom,mem0 = <0 0x7010 2 0 1 1>; + qcom,page1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,poll1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,mem1 = <0 0x7010 2 0 1 1>; + qcom,page2 = <1 0x3d85 2 0x6 1 1>; + qcom,poll2 = <1 0x3d85 2 0x6 1 1>; + qcom,mem2 = <0 0x7010 2 0 1 1>; + qcom,page3 = <1 0x0100 2 0x1 1 1>; + qcom,poll3 = <0 0x0100 2 0x1 1 1>; + qcom,mem3 = <0x18 0x7010 2 0 1 1>; + + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom3: qcom,eeprom@3{ + cell-index = <3>; + reg = <0x03>; + qcom,eeprom-name = "s5k5e8_sunny"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x5a>; + qcom,cci-master = <0>; + qcom,num-blocks = <5>; + + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <24 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + eeprom4: qcom,eeprom@4 { + cell-index = <4>; + reg = <0x04>; + qcom,eeprom-name = "ov13855_sunny"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xB0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x7E9 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 200000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 36 0>, + <&tlmm 35 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "MCAM_RESET0", + "MCAM_STANDBY0"; + + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vio", + "cam_vana", "cam_vdig", "cam_vaf", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 1 24000000 0 0 1 1>; + qcom,cam-power-seq-delay = <1 1 5 5 10 5 5 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@0 { + cell-index = <0>; + compatible = "qcom,camera"; + reg = <0x0>; + qcom,csiphy-sd-index = <0>; + qcom,csid-sd-index = <0>; + qcom,mount-angle = <90>; + qcom,actuator-src = <&actuator0>; + qcom,led-flash-src = <&led_flash0>; + qcom,eeprom-src = <&eeprom0 &eeprom1 &eeprom4>; + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep + &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 36 0>, + <&tlmm 35 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,sensor-position = <0>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@2 { + cell-index = <2>; + compatible = "qcom,camera"; + reg = <0x02>; + qcom,csiphy-sd-index = <1>; + qcom,csid-sd-index = <1>; + qcom,eeprom-src = <&eeprom2 &eeprom3>; + qcom,mount-angle = <90>; + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 0 2800000>; + qcom,cam-vreg-max-voltage = <1200000 0 2800000>; + qcom,cam-vreg-op-mode = <105000 0 80000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,sensor-position = <1>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8937-pinctrl.dtsi b/arch/arm/boot/dts/qcom/msm8937-pinctrl.dtsi index 63b7b94ffafd7..367891ded11e3 100644 --- a/arch/arm/boot/dts/qcom/msm8937-pinctrl.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-pinctrl.dtsi @@ -49,7 +49,20 @@ }; }; - + gpio_led_pins { + gpio_led_off: gpio_led_off { + mux { + pins = "gpio45"; + function = "gpio"; + }; + config { + pins = "gpio45"; + drive-strength = <6>; + bias-disable; + output-high; + }; + }; + }; i2c_2 { i2c_2_active: i2c_2_active { /* active state */ @@ -289,7 +302,102 @@ }; }; }; + fpc_spi_active: fpc_spi_active{ + mux { + pins = "gpio20", "gpio21", "gpio22", "gpio23"; + function = "blsp_spi6"; + }; + config { + pins = "gpio20", "gpio21", "gpio22", "gpio23"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + fpc_reset_reset: fpc_reset_reset{ + mux { + pins = "gpio8"; + function = "gpio"; + }; + config { + pins = "gpio8"; + drive-strength = <2>; + bias-disable = <0>; + output-low; + }; + }; + fpc_reset_active: fpc_reset_active{ + mux { + pins = "gpio8"; + function = "gpio"; + }; + config { + pins = "gpio8"; + drive-strength = <2>; + bias-disable = <0>; + output-high; + }; + }; + fpc_irq_active: fpc_irq_active { + mux { + pins = "gpio9"; + function = "gpio"; + }; + config { + pins = "gpio9"; + drive-strength = <2>; + bias-disable = <0>; + input-enable; + }; + }; + goodix_spi_active: goodix_spi_active{ + mux { + pins = "gpio20", "gpio21", "gpio22", "gpio23"; + function = "blsp_spi6"; + }; + config { + pins = "gpio20", "gpio21", "gpio22", "gpio23"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + goodix_reset_reset: goodix_reset_reset{ + mux { + pins = "gpio8"; + function = "gpio"; + }; + config { + pins = "gpio8"; + drive-strength = <2>; + bias-disable = <0>; + output-low; + }; + }; + goodix_reset_active: goodix_reset_active{ + mux { + pins = "gpio8"; + function = "gpio"; + }; + config { + pins = "gpio8"; + drive-strength = <2>; + bias-disable = <0>; + output-high; + }; + }; + + goodix_irq_active: goodix_irq_active { + mux { + pins = "gpio9"; + function = "gpio"; + }; + config { + pins = "gpio9"; + drive-strength = <2>; + bias-disable = <0>; + input-enable; + }; + }; wcnss_pmux_5wire { /* Active configuration of bus pins */ wcnss_default: wcnss_default { diff --git a/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi index 7d2a6c9b92720..34f425a975137 100644 --- a/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi @@ -14,6 +14,9 @@ #include "msm-pmi8950.dtsi" #include "msm8937-mtp.dtsi" #include "msm8937-audio-mtp.dtsi" +#include "dsi-panel-hx8394f-boe-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbg-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi" &soc { led_flash0: qcom,camera-flash { @@ -44,9 +47,31 @@ qcom,chg-led-support; }; +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + &mdss_dsi0 { lab-supply = <&lab_regulator>; ibb-supply = <&ibb_regulator>; + + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_boe_720_vid>; + qcom,dsi-pref-sub-pan = <&dsi_ili9881c_ebbg_720p_video>; + qcom,dsi-pref-sub1-pan = <&dsi_ili9881c_ebbgDJN_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,platform-te-gpio = <&tlmm 24 0>; + qcom,platform-reset-gpio = <&tlmm 60 0>; + + qcom,regulator-ldo-mode; + qcom,platform-regulator-settings = [ 00 01 01 00 20 07 00]; + }; &mdss_dsi1 { @@ -83,3 +108,31 @@ qcom,supply-post-on-sleep = <20>; }; }; +&dsi_hx8394f_boe_720_vid { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ili9881c_ebbg_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; +&dsi_ili9881c_ebbgDJN_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&spmi_bus { + qcom,pmi8950@3 { + labibb: qpnp-labibb-regulator { + ibb_regulator: qcom,ibb@dc00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5500000>; + }; + + lab_regulator: qcom,lab@de00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5500000>; + }; + }; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8937-pmi8950-qrd-sku1_S88536AA2.dtsi b/arch/arm/boot/dts/qcom/msm8937-pmi8950-qrd-sku1_S88536AA2.dtsi new file mode 100644 index 0000000000000..2794b17b50b06 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8937-pmi8950-qrd-sku1_S88536AA2.dtsi @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm-pmi8950.dtsi" +#include "msm8937-qrd.dtsi" +#include "msm8937-mdss-panels.dtsi" +#include "dsi-panel-hx8394f-boe-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbg-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi" +#include "msm8937-camera-sensor-qrd-wt88536.dtsi" + +&i2c_2 { /* i2c 6 */ + + aw2013@45 { /*blink */ + compatible = "awinic,aw2013"; + reg = <0x45>; + rgb_led-supply = <&pm8937_l10>; + + red { + label = "red"; + linux,default-trigger = "battery-red"; + default-state = "off"; + retain-state-suspended; + }; + + green { + label = "green"; + linux,default-trigger = "battery-green"; + default-state = "off"; + retain-state-suspended; + }; + + blue { + label = "blue"; + linux,default-trigger = "battery-blue"; + default-state = "off"; + retain-state-suspended; + }; + white { + label = "white"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + yellow { + label = "yellow"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + cyan { + label = "cyan"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + purple { + label = "purple"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + }; +}; + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8950_flash0>; + qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch2>; + qcom,switch-source = <&pmi8950_switch>; + }; + + i2c@78b7000 { + status = "ok"; + ftech@38 { + compatible = "focaltech,5336"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8937_l10>; + vcc_i2c-supply = <&pm8937_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + ftech,name = "ft5336"; + ftech,family-id = <0x36>; + ftech,reset-gpio = <&tlmm 64 0x00>; + ftech,irq-gpio = <&tlmm 65 0x2008>; + ftech,display-coords = <0 0 720 1280>; + ftech,panel-coords = <0 0 720 1280>; + ftech,virtual-key1 = <139 140 2000>;/*menu*/ + ftech,virtual-key2 = <172 360 2000>;/*home*/ + ftech,virtual-key3 = <158 580 2000>;/*back*/ + ftech,no-force-update; + ftech,i2c-pull-up; + ftech,group-id = <1>; + ftech,hard-reset-delay-ms = <20>; + ftech,soft-reset-delay-ms = <200>; + ftech,num-max-touches = <10>; + ftech,fw-delay-aa-ms = <30>; + ftech,fw-delay-55-ms = <30>; + ftech,fw-upgrade-id1 = <0x79>; + ftech,fw-upgrade-id2 = <0x18>; + ftech,fw-delay-readid-ms = <10>; + ftech,fw-delay-era-flsh-ms = <2000>; + ftech,fw-auto-cal; + ftech,ignore-id-check; + }; + }; + + gen-vkey1 { + compatible = "qcom,gen-vkeys"; + label = "ft5x06_720p"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <1458>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; + + fpc1020 { + compatible = "soc:fpc1020"; + + interrupt-parent = <&tlmm>; + interrupts = <9 0x0>; + + fpc,gpio_rst = <&tlmm 8 0>; + fpc,gpio_irq = <&tlmm 9 0>; + + vcc_spi-supply = <&pm8937_l5>; + vdd_ana-supply = <&pm8937_l5>; + vdd_io-supply = <&pm8937_l5>; + + fpc,enable-on-boot; + /delete-property/ + fpc,enable-wakeup; + + fpc,spi-max-frequency = <4800000>; + + /* Only for SPI Clock Handled by Linux */ + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup1_spi_apps_clk>; + + pinctrl-names = "fpc1020_spi_active", + "fpc1020_reset_reset", + "fpc1020_reset_active", + "fpc1020_irq_active"; + + pinctrl-0 = <&fpc_spi_active>; + pinctrl-1 = <&fpc_reset_reset>; + pinctrl-2 = <&fpc_reset_active>; + pinctrl-3 = <&fpc_irq_active>; + }; + + goodix_fp { + compatible = "goodix,fingerprint"; + spi-max-frequency = <1000000>; + input-device-name = "gf3208"; + interrupt-parent = <&tlmm>; + interrupts = <9 0x0>; + + goodix,gpio_reset = <&tlmm 8 0>; + goodix,gpio_irq = <&tlmm 9 0>; + + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup1_spi_apps_clk>; + + pinctrl-names = "goodixfp_spi_active", + "goodixfp_reset_reset", + "goodixfp_reset_active", + "goodixfp_irq_active"; + + pinctrl-0 = <&goodix_spi_active>; + pinctrl-1 = <&goodix_reset_reset>; + pinctrl-2 = <&goodix_reset_active>; + pinctrl-3 = <&goodix_irq_active>; + }; + gpio-leds { + compatible = "gpio-leds"; + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&gpio_led_off>; + + infred { + gpios = <&tlmm 45 0>; + label = "infrared"; + linux,default-trigger = "infra-red"; + default-state = "off"; + retain-state-suspended; + }; + + }; +}; + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + + +&mdss_dsi0 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; + + + + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_boe_720_vid>; + qcom,dsi-pref-sub-pan = <&dsi_ili9881c_ebbg_720p_video>; + qcom,dsi-pref-sub1-pan = <&dsi_ili9881c_ebbgDJN_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,platform-te-gpio = <&tlmm 24 0>; + qcom,platform-reset-gpio = <&tlmm 60 0>; + + qcom,regulator-ldo-mode; + qcom,platform-regulator-settings = [ 00 01 01 00 20 07 00]; + +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&labibb { + status = "ok"; + qpnp,qpnp-labibb-mode = "lcd"; +}; + +&ibb_regulator { + qcom,qpnp-ibb-discharge-resistor = <32>; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <5>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <5>; + }; +}; + +&dsi_hx8394f_boe_720_vid { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ili9881c_ebbg_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; +&dsi_ili9881c_ebbgDJN_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&spmi_bus { + qcom,pmi8950@3 { + labibb: qpnp-labibb-regulator { + ibb_regulator: qcom,ibb@dc00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5500000>; + }; + + lab_regulator: qcom,lab@de00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5500000>; + }; + }; + }; +}; + +&sdc2_cmd_on { + config { + drive-strength = <12>; + }; +}; + +&sdc2_data_on { + config { + drive-strength = <12>; + }; +}; + +&flash_led { + /delete-node/ qcom,flash_1; + /delete-node/ qcom,torch_1; +}; diff --git a/arch/arm/boot/dts/qcom/msm8937-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8937-qrd.dtsi index 116de59bdfff1..7476cf921ff27 100644 --- a/arch/arm/boot/dts/qcom/msm8937-qrd.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-qrd.dtsi @@ -1,5 +1,6 @@ /* * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -12,7 +13,6 @@ */ #include "msm8937-pinctrl.dtsi" -#include "msm8937-camera-sensor-qrd.dtsi" &soc { gpio_keys { @@ -30,6 +30,11 @@ debounce-interval = <15>; }; }; + + + boardinfo { + compatible = "wt:boardinfo"; + }; }; &wled { @@ -83,6 +88,7 @@ vdd-supply = <&pm8937_l8>; qcom,vdd-voltage-level = <2900000 2900000>; qcom,vdd-current-level = <200 570000>; + qcom,vdd-always-on; /* device communication power supply */ vdd-io-supply = <&pm8937_l5>; diff --git a/arch/arm/boot/dts/qcom/msm8937-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8937-regulator.dtsi index ca571e27aebd4..20c93441fadef 100644 --- a/arch/arm/boot/dts/qcom/msm8937-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-regulator.dtsi @@ -136,6 +136,7 @@ regulator-max-microvolt = <1800000>; qcom,init-voltage = <1800000>; status = "okay"; + regulator-always-on; }; }; @@ -296,6 +297,7 @@ pm8937_s5: spm-regulator@2000 { compatible = "qcom,spm-regulator"; reg = <0x2000 0x100>; + qcom,mode = "pwm"; regulator-name = "pm8937_s5"; regulator-min-microvolt = <1050000>; regulator-max-microvolt = <1350000>; @@ -360,7 +362,7 @@ qcom,cpr-fuse-corners = <3>; qcom,cpr-voltage-ceiling = <1155000 1225000 1350000>; - qcom,cpr-voltage-floor = <1050000 1050000 1090000>; + qcom,cpr-voltage-floor = <1150000 1150000 1250000>; vdd-apc-supply = <&pm8937_s5>; mem-acc-supply = <&mem_acc_vreg_corner>; diff --git a/arch/arm/boot/dts/qcom/msm8937.dtsi b/arch/arm/boot/dts/qcom/msm8937.dtsi index b3c684453a119..3b63f95521ca4 100644 --- a/arch/arm/boot/dts/qcom/msm8937.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937.dtsi @@ -33,7 +33,7 @@ other_ext_mem: other_ext_region@0 { compatible = "removed-dma-pool"; no-map; - reg = <0x0 0x85b00000 0x0 0xd00000>; + reg = <0x0 0x84A00000 0x0 0x1E00000>; }; modem_mem: modem_region@0 { @@ -540,6 +540,11 @@ qcom,enable-load = <0>; qcom,disable-load = <0>; }; + aw87319@58{ /*AW87319 PA*/ + compatible = "awinic,aw87319_pa"; + reg = <0x58>; + qcom,ext_pa_spk_aw87319_rst = <&tlmm 124 0>; + }; }; i2c_3: i2c@78b7000 { /* BLSP1 QUP3 */ @@ -550,7 +555,7 @@ reg = <0x78b7000 0x600>; interrupt-names = "qup_irq"; interrupts = <0 97 0>; - qcom,clk-freq-out = <400000>; + qcom,clk-freq-out = <100000>; qcom,clk-freq-in = <19200000>; clock-names = "iface_clk", "core_clk"; clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, @@ -1523,9 +1528,9 @@ qcom,ce-opp-freq = <100000000>; }; - qcom_seecom: qseecom@85b00000 { + qcom_seecom: qseecom@84A00000 { compatible = "qcom,qseecom"; - reg = <0x85b00000 0x800000>; + reg = <0x84A00000 0x1900000>; reg-names = "secapp-region"; qcom,hlos-num-ce-hw-instances = <1>; qcom,hlos-ce-hw-instance = <0>; diff --git a/arch/arm/boot/dts/qcom/msm8940-pmi8950-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8940-pmi8950-mtp.dtsi index 65b5097206e66..e04927561c21f 100644 --- a/arch/arm/boot/dts/qcom/msm8940-pmi8950-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940-pmi8950-mtp.dtsi @@ -15,4 +15,47 @@ #include "msm8940-mtp.dtsi" &soc { + + i2c@78b7000 { + status = "ok"; + ftech@38 { + compatible = "focaltech,5336"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8937_l10>; + vcc_i2c-supply = <&pm8937_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + ftech,name = "ft5336"; + ftech,family-id = <0x36>; + ftech,reset-gpio = <&tlmm 64 0x00>; + ftech,irq-gpio = <&tlmm 65 0x2008>; + ftech,display-coords = <0 0 720 1280>; + ftech,panel-coords = <0 0 720 1280>; + ftech,virtual-key1 = <139 140 2000>;/*menu*/ + ftech,virtual-key2 = <172 360 2000>;/*home*/ + ftech,virtual-key3 = <158 580 2000>;/*back*/ + ftech,no-force-update; + ftech,i2c-pull-up; + ftech,group-id = <1>; + ftech,hard-reset-delay-ms = <20>; + ftech,soft-reset-delay-ms = <200>; + ftech,num-max-touches = <10>; + ftech,fw-delay-aa-ms = <30>; + ftech,fw-delay-55-ms = <30>; + ftech,fw-upgrade-id1 = <0x79>; + ftech,fw-upgrade-id2 = <0x18>; + ftech,fw-delay-readid-ms = <10>; + ftech,fw-delay-era-flsh-ms = <2000>; + ftech,fw-auto-cal; + ftech,ignore-id-check; + }; + + }; }; + diff --git a/arch/arm/boot/dts/qcom/msm8940-pmi8950-qrd-sku7_S88536AA2.dts b/arch/arm/boot/dts/qcom/msm8940-pmi8950-qrd-sku7_S88536AA2.dts new file mode 100644 index 0000000000000..8f32c9942cb04 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8940-pmi8950-qrd-sku7_S88536AA2.dts @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "msm8940.dtsi" +#include "msm8937-pmi8950-qrd-sku1_S88536AA2.dtsi" +#include "msm8940-pinctrl.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8940-PMI8950 QRD SKU7"; + compatible = "qcom,msm8940-qrd-sku7", "qcom,msm8940-qrd", + "qcom,msm8940", "qcom,qrd"; + qcom,board-id= <0x1000b 1>, <0x2000b 1>; + qcom,pmic-id = <0x10019 0x010011 0x0 0x0>; +}; + +/ { + qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-qrd-Desay-4v4-4100mah.dtsi" + #include "batterydata-qrd-Atl-4v4-4100mah.dtsi" + #include "batterydata-qrd-Coslight-4v4-4100mah.dtsi" + #include "batterydata-qrd-Default-4v4-4100mah.dtsi" + }; +}; + +&pmi8950_charger { + qcom,battery-data = <&qrd_batterydata>; + qcom,float-voltage-mv = <4400>; + qcom,chg-inhibit-fg; + qcom,thermal-mitigation = <2000 1500 1200 700 0>; + status = "okay"; + qcom,vchg_sns-vadc = <&pmi8950_vadc>; + qcom,vchg-adc-channel-id = <3>; +}; + +&pmi8950_fg { + qcom,battery-data = <&qrd_batterydata>; + qcom,cold-bat-decidegc = <(0)>; + qcom,cool-bat-decidegc = <(150)>; + qcom,hot-bat-decidegc = <550>; + qcom,warm-bat-decidegc = <450>; + qcom,warm-bat-india-decidegc = <500>; + qcom,fg-iterm-ma = <180>; + qcom,fg-chg-iterm-ma = <130>; + qcom,resume-soc = <99>; + qcom,resume-soc-raw = <253>; + qcom,vbat-estimate-diff-mv = <100>; + qcom,fg-cutoff-voltage-mv = <3400>; + qcom,fg-cc-cv-threshold-mv = <4390>; + qcom,cl-max-increment-deciperc = <1>; + qcom,cl-max-decrement-deciperc = <1>; + qcom,fg-delta-soc = <1>; + qcom,bad-battery-detection-enable; + qcom,hold-soc-while-full; + qcom,thermal-coefficients = [B7 85 B2 49 71 35]; +}; + +&usb_otg { + qcom,usbin-vadc = <&pmi8950_vadc>; +}; +&soc { + sound { + qcom,model = "msm8920-sku7-snd-card"; + }; + + i2c@78b7000 { + synaptics@4b { + vdd-supply = <&pm8937_l10>; + }; + }; +}; + +&i2c_2 { + pericom-type-c@1d { + status="disabled"; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index 6ec88d4915276..f4bffec714799 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -473,7 +473,6 @@ <38 0 28>, /* SVSP(20mv); TURBO(15mv); KV(1.9) */ <0 0 38>; /* TURBO(20mv); KV(1.9) */ - qcom,cpr-enable; }; &mdss_mdp { @@ -548,6 +547,19 @@ qcom,inst-id = <11>; }; + + sn_fuse: snfuse@0xa0128 { + compatible = "qcom,sn-fuse"; + reg = <0xa0128 0x4>; + reg-names = "sn-base"; + }; + + sec_boot_fuse: secbootfuse@0xa41d0 { + compatible = "qcom,sec-boot-fuse"; + reg = <0xa41d0 0x4>; + reg-names = "sec-boot-base"; + }; + }; /* GPU overrides */ diff --git a/arch/arm/boot/dts/qcom/msm8952-mdss-panels.dtsi b/arch/arm/boot/dts/qcom/msm8952-mdss-panels.dtsi index 17798d4384617..e4d20291c7cd0 100644 --- a/arch/arm/boot/dts/qcom/msm8952-mdss-panels.dtsi +++ b/arch/arm/boot/dts/qcom/msm8952-mdss-panels.dtsi @@ -35,6 +35,7 @@ qcom,supply-max-voltage = <1800000>; qcom,supply-enable-load = <100000>; qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <12>; }; qcom,panel-supply-entry@2 { @@ -44,6 +45,8 @@ qcom,supply-max-voltage = <6000000>; qcom,supply-enable-load = <100000>; qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <12>; + qcom,supply-pre-off-sleep = <2>; }; qcom,panel-supply-entry@3 { @@ -53,7 +56,8 @@ qcom,supply-max-voltage = <6000000>; qcom,supply-enable-load = <100000>; qcom,supply-disable-load = <100>; - qcom,supply-post-on-sleep = <20>; + qcom,supply-post-on-sleep = <2>; + qcom,supply-post-off-sleep = <4>; }; }; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-audio.dtsi b/arch/arm/boot/dts/qcom/msm8953-audio.dtsi index 386bc5fc7b578..a9e33101f4c40 100644 --- a/arch/arm/boot/dts/qcom/msm8953-audio.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-audio.dtsi @@ -16,11 +16,11 @@ &int_codec { qcom,model = "msm8953-snd-card-mtp"; - qcom,cdc-us-euro-gpios = <&tlmm 63 0>; - qcom,msm-mbhc-hphl-swh = <0>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,msm-hs-micbias-type = "internal"; + qcom,cdc-us-euro-gpios; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-hs-micbias-type = "external"; qcom,msm-micbias1-ext-cap; + qcom,msm-micbias2-ext-cap; qcom,msm-gpios = "pri_i2s", diff --git a/arch/arm/boot/dts/qcom/msm8953-audio_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-audio_rosy.dtsi new file mode 100644 index 0000000000000..cae990dc42e94 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-audio_rosy.dtsi @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm8953-wsa881x.dtsi" + +&int_codec { + qcom,model = "msm8953-snd-card-mtp"; + + qcom,cdc-us-euro-gpios; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-hs-micbias-type = "external"; + qcom,msm-micbias1-ext-cap; + qcom,msm-micbias2-ext-cap; + + qcom,msm-gpios = + "pri_i2s", + "us_eu_gpio", + "quin_i2s", + "comp_gpio"; + qcom,pinctrl-names = + "all_off", + "pri_i2s_act", + "us_eu_gpio_act", + "pri_i2s_us_eu_gpio_act", + "quin_act", + "quin_pri_i2s_act", + "quin_us_eu_gpio_act", + "quin_us_eu_gpio_pri_i2s_act", + "comp_gpio_act", + "comp_gpio_pri_i2s_act", + "comp_gpio_us_eu_gpio_act", + "comp_gpio_pri_i2s_us_eu_gpio_act", + "comp_gpio_quin_act", + "comp_gpio_quin_pri_i2s_act", + "comp_gpio_quin_us_eu_gpio_act", + "comp_gpio_quin_us_eu_gpio_pri_i2s_act"; + + pinctrl-names = + "all_off", + "pri_i2s_act", + "us_eu_gpio_act", + "pri_i2s_us_eu_gpio_act", + "quin_act", + "quin_pri_i2s_act", + "quin_us_eu_gpio_act", + "quin_us_eu_gpio_pri_i2s_act", + "comp_gpio_act", + "comp_gpio_pri_i2s_act", + "comp_gpio_us_eu_gpio_act", + "comp_gpio_pri_i2s_us_eu_gpio_act", + "comp_gpio_quin_act", + "comp_gpio_quin_pri_i2s_act", + "comp_gpio_quin_us_eu_gpio_act", + "comp_gpio_quin_us_eu_gpio_pri_i2s_act"; + + pinctrl-0 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_sus &cross_conn_det_sus + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-1 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_act &cross_conn_det_sus + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-2 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_sus &cross_conn_det_act + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-3 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_act &cross_conn_det_act + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-4 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_sus &cross_conn_det_sus + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-5 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_act &cross_conn_det_sus + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-6 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_sus &cross_conn_det_act + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-7 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_act &cross_conn_det_act + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-8 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_sus &cross_conn_det_sus + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-9 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_act &cross_conn_det_sus + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-10 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_sus &cross_conn_det_act + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-11 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_act &cross_conn_det_act + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-12 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_sus &cross_conn_det_sus + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-13 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_act &cross_conn_det_sus + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-14 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_sus &cross_conn_det_act + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-15 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_act &cross_conn_det_act + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + + asoc-codec = <&stub_codec>, <&pm8953_diangu_dig>, <&hdmi_dba>; + asoc-codec-names = "msm-stub-codec.1", "cajon_codec", + "msm-hdmi-dba-codec-rx"; +}; + +&pm8953_gpios { + gpio@c000 { + status = "ok"; + qcom,mode = <1>; + qcom,pull = <5>; + qcom,vin-sel = <0>; + qcom,src-sel = <2>; + qcom,master-en = <1>; + qcom,out-strength = <2>; + }; +}; + +&ext_codec { + qcom,model = "msm8953-tasha-snd-card"; + + qcom,cdc-us-euro-gpios = <&tlmm 63 0>; + qcom,msm-mbhc-hphl-swh = <0>; + qcom,msm-mbhc-gnd-swh = <0>; + + qcom,wsa-max-devs = <2>; + qcom,wsa-devs = <&wsa881x_211>, <&wsa881x_212>, + <&wsa881x_213>, <&wsa881x_214>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", + "SpkrLeft", "SpkrRight"; +}; + +&wcd9xxx_intc { + interrupt-parent = <&tlmm>; + interrupts = <73 0>; + qcom,gpio-connect = <&tlmm 73 0>; +}; + +&clock_audio { + qcom,audio-ref-clk-gpio = <&pm8953_gpios 1 0>; + qcom,lpass-mclk-id = "pri_mclk"; + clocks = <&clock_gcc clk_div_clk2>; + pinctrl-names = "sleep", "active"; + pinctrl-0 = <&cdc_mclk2_sleep>; + pinctrl-1 = <&cdc_mclk2_active>; +}; + +&pm8953_1 { + pm8953_diangu_dig: 8953_wcd_codec@f000 { + compatible = "qcom,msm8x16_wcd_codec"; + reg = <0xf000 0x100>; + interrupt-parent = <&spmi_bus>; + interrupts = <0x1 0xf0 0x0>, + <0x1 0xf0 0x1>, + <0x1 0xf0 0x2>, + <0x1 0xf0 0x3>, + <0x1 0xf0 0x4>, + <0x1 0xf0 0x5>, + <0x1 0xf0 0x6>, + <0x1 0xf0 0x7>; + interrupt-names = "spk_cnp_int", + "spk_clip_int", + "spk_ocp_int", + "ins_rem_det1", + "but_rel_det", + "but_press_det", + "ins_rem_det", + "mbhc_int"; + + cdc-vdda-cp-supply = <&pm8953_s4>; + qcom,cdc-vdda-cp-voltage = <1900000 2050000>; + qcom,cdc-vdda-cp-current = <500000>; + + cdc-vdd-io-supply = <&pm8953_l5>; + qcom,cdc-vdd-io-voltage = <1800000 1800000>; + qcom,cdc-vdd-io-current = <5000>; + + cdc-vdd-pa-supply = <&pm8953_s4>; + qcom,cdc-vdd-pa-voltage = <1900000 2050000>; + qcom,cdc-vdd-pa-current = <260000>; + + cdc-vdd-mic-bias-supply = <&pm8953_l13>; + qcom,cdc-vdd-mic-bias-voltage = <3125000 3125000>; + qcom,cdc-vdd-mic-bias-current = <5000>; + + qcom,cdc-mclk-clk-rate = <9600000>; + + qcom,cdc-static-supplies = "cdc-vdd-io", + "cdc-vdd-pa", + "cdc-vdda-cp"; + + qcom,cdc-on-demand-supplies = "cdc-vdd-mic-bias"; + qcom,dig-cdc-base-addr = <0xc0f0000>; + }; + + pm8953_diangu_analog: 8953_wcd_codec@f100 { + compatible = "qcom,msm8x16_wcd_codec"; + reg = <0xf100 0x100>; + interrupt-parent = <&spmi_bus>; + interrupts = <0x1 0xf1 0x0>, + <0x1 0xf1 0x1>, + <0x1 0xf1 0x2>, + <0x1 0xf1 0x3>, + <0x1 0xf1 0x4>, + <0x1 0xf1 0x5>; + interrupt-names = "ear_ocp_int", + "hphr_ocp_int", + "hphl_ocp_det", + "ear_cnp_int", + "hphr_cnp_int", + "hphl_cnp_int"; + qcom,dig-cdc-base-addr = <0xc0f0000>; + }; +}; + +&wcd_rst_gpio { + qcom,cdc-rst-n-gpio = <&tlmm 67 0>; +}; + +&wcd9335 { + clock-names = "wcd_clk", "wcd_native_clk"; + clocks = <&clock_audio clk_audio_pmi_clk>, + <&clock_audio clk_audio_ap_clk2>; + + qcom,cdc-reset-gpio = <&tlmm 67 0>; + + cdc-vdd-buck-supply = <&eldo2_8953>; + qcom,cdc-vdd-buck-voltage = <1800000 1800000>; + qcom,cdc-vdd-buck-current = <650000>; + + cdc-buck-sido-supply = <&eldo2_8953>; + qcom,cdc-buck-sido-voltage = <1800000 1800000>; + qcom,cdc-buck-sido-current = <150000>; + + cdc-vdd-tx-h-supply = <&eldo2_8953>; + qcom,cdc-vdd-tx-h-voltage = <1800000 1800000>; + qcom,cdc-vdd-tx-h-current = <25000>; + + cdc-vdd-rx-h-supply = <&eldo2_8953>; + qcom,cdc-vdd-rx-h-voltage = <1800000 1800000>; + qcom,cdc-vdd-rx-h-current = <25000>; + + cdc-vdd-px-supply = <&eldo2_8953>; + qcom,cdc-vdd-px-voltage = <1800000 1800000>; + qcom,cdc-vdd-px-current = <10000>; + + cdc-vdd-mic-bias-supply = <&pm8953_l13>; + qcom,cdc-vdd-mic-bias-voltage = <3125000 3125000>; + qcom,cdc-vdd-mic-bias-current = <15000>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd_rosy.dtsi new file mode 100644 index 0000000000000..6c2300162a114 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd_rosy.dtsi @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +&soc { + led_flash1: qcom,camera-flash@1 { + cell-index = <1>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8940_flash1>; + qcom,torch-source = <&pmi8940_torch1>; + qcom,switch-source = <&pmi8940_switch>; + }; + + led_flash0: qcom,camera-flash@0 { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8940_flash0>; + qcom,torch-source = <&pmi8940_torch0>; + qcom,switch-source = <&pmi8940_switch>; + }; +}; + +&cci { + actuator0: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + qcom,cci-master = <0>; + cam_vaf-supply = <&pm8953_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + + eeprom0: qcom,eeprom@0 { + cell-index = <0>; + reg = <0x0>; + qcom,eeprom-name = "ovt_ov12a10_i"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xB0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x18F6 0x0 2 0 1 0>; + + cam_vio-supply = <&pm8953_l6>; + cam_vaf-supply = <&pm8953_l17>; + qcom,cam-vreg-name = "cam_vio", "cam_vaf"; + qcom,cam-vreg-min-voltage = <1800000 2850000>; + qcom,cam-vreg-max-voltage = <1800000 2850000>; + qcom,cam-vreg-op-mode = <100000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 40 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0"; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vio", "cam_vaf"; + qcom,cam-power-seq-cfg-val = <1 1>; + qcom,cam-power-seq-delay = <5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + eeprom1: qcom,eeprom@1 { + cell-index = <1>; + reg = <0x1>; + qcom,eeprom-name = "sony_imx486_ii"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xB0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x18F6 0x0 2 0 1 0>; + + cam_vio-supply = <&pm8953_l6>; + cam_vaf-supply = <&pm8953_l17>; + qcom,cam-vreg-name = "cam_vio", "cam_vaf"; + qcom,cam-vreg-min-voltage = <1800000 2850000>; + qcom,cam-vreg-max-voltage = <1800000 2850000>; + qcom,cam-vreg-op-mode = <100000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 40 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0"; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vio", "cam_vaf"; + qcom,cam-power-seq-cfg-val = <1 1>; + qcom,cam-power-seq-delay = <5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom2: qcom,eeprom@2{ + cell-index = <2>; + reg = <0x02>; + qcom,eeprom-name = "ovt_ov5675_i"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x20>; + qcom,cci-master = <1>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x3d88 2 0x7010 2 1>; + qcom,poll0 = <0 0x3d88 2 0x7010 2 1>; + qcom,mem0 = <0x95 0x7010 2 0 1 1>; + + cam_vdig-supply = <&pm8953_l23>; + cam_vio-supply = <&pm8953_l6>; + cam_vana-supply = <&pm8953_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2900000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2900000>; + qcom,cam-vreg-op-mode = <105000 80000 80000>; + qcom,gpio-no-mux = <0>; + + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk1_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 27 0>, + <&tlmm 129 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1"; + + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_clk"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "cam_vio", + "cam_vana", + "cam_vdig", + "sensor_gpio_reset", + "sensor_cam_mclk"; + qcom,cam-power-seq-cfg-val = <0 1 1 1 1 24000000>; + qcom,cam-power-seq-delay = <5 1 1 5 10 10>; + + status = "ok"; + clocks = <&clock_gcc clk_mclk1_clk_src>, + <&clock_gcc clk_gcc_camss_mclk1_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom3: qcom,eeprom@3{ + cell-index = <3>; + reg = <0x03>; + qcom,eeprom-name = "ovt_ov5675_ii"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x6c>; + qcom,cci-master = <1>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x3d88 2 0x7010 2 1>; + qcom,poll0 = <0 0x3d88 2 0x7010 2 1>; + qcom,mem0 = <0x95 0x7010 2 0 1 1>; + + cam_vdig-supply = <&pm8953_l23>; + cam_vio-supply = <&pm8953_l6>; + cam_vana-supply = <&pm8953_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2900000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2900000>; + qcom,cam-vreg-op-mode = <105000 80000 80000>; + qcom,gpio-no-mux = <0>; + + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk1_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 27 0>, + <&tlmm 129 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1"; + + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_clk"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "cam_vio", + "cam_vana", + "cam_vdig", + "sensor_gpio_reset", + "sensor_cam_mclk"; + qcom,cam-power-seq-cfg-val = <0 1 1 1 1 24000000>; + qcom,cam-power-seq-delay = <5 1 1 5 10 10>; + + status = "ok"; + clocks = <&clock_gcc clk_mclk1_clk_src>, + <&clock_gcc clk_gcc_camss_mclk1_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@0 { + cell-index = <0>; + compatible = "qcom,camera"; + reg = <0x0>; + qcom,csiphy-sd-index = <0>; + qcom,csid-sd-index = <0>; + qcom,mount-angle = <270>; + qcom,actuator-src = <&actuator0>; + qcom,eeprom-src = <&eeprom0 &eeprom1>; + qcom,led-flash-src = <&led_flash0>; + cam_vio-supply = <&pm8953_l6>; + cam_vdig-supply = <&pm8953_l2>; + cam_vaf-supply = <&pm8953_l17>; + cam_vana-supply = <&pm8953_l22>; + qcom,cam-vreg-name = "cam_vio", "cam_vdig", "cam_vaf", + "cam_vana"; + qcom,cam-vreg-min-voltage = <0 1200000 2850000 2900000>; + qcom,cam-vreg-max-voltage = <0 1200000 2850000 2900000>; + qcom,cam-vreg-op-mode = <0 105000 100000 80000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 40 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0"; + qcom,sensor-position = <0>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + qcom,camera@2 { + cell-index = <2>; + compatible = "qcom,camera"; + reg = <0x02>; + qcom,csiphy-sd-index = <2>; + qcom,csid-sd-index = <2>; + qcom,mount-angle = <90>; + qcom,led-flash-src = <&led_flash1>; + qcom,eeprom-src = <&eeprom2 &eeprom3>; + cam_vdig-supply = <&pm8953_l23>; + cam_vio-supply = <&pm8953_l6>; + cam_vana-supply = <&pm8953_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 0 2900000>; + qcom,cam-vreg-max-voltage = <1200000 0 2900000>; + qcom,cam-vreg-op-mode = <105000 0 80000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk1_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 27 0>, + <&tlmm 129 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1"; + qcom,sensor-position = <1>; + qcom,sensor-mode = <0>; + qcom,cci-master = <1>; + status = "ok"; + clocks = <&clock_gcc clk_mclk1_clk_src>, + <&clock_gcc clk_gcc_camss_mclk1_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-mtp_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-mtp_rosy.dtsi new file mode 100644 index 0000000000000..0693452033e89 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-mtp_rosy.dtsi @@ -0,0 +1,405 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm8953-pinctrl.dtsi" +#include "msm8953-audio-mtp.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" +#include "dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi" +#include "dsi-panel-ft8006m-boe-5p7-720p-video.dtsi" +#include "dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi" + +&spi_3 { /* BLSP1 QUP3 */ + spi-max-frequency = <16000000>; + maxim_sti@0 { + status = "disabled"; + compatible = "maxim,maxim_sti"; + reg = <0>; + interrupt-parent = <&tlmm>; + interrupts = <65 0>; + spi-max-frequency = <16000000>; + avdd-supply = <&pm8953_l10>; + dvdd-supply = <&pm8953_l5>; + maxim_sti,irq-gpio = <&tlmm 65 0x00>; + maxim_sti,reset-gpio = <&tlmm 64 0x00>; + maxim_sti,touch_fusion = "/vendor/bin/touch_fusion"; + maxim_sti,config_file = "/etc/firmware/qtc800s.cfg"; + maxim_sti,fw_name = "qtc800s.bin"; + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + }; +}; + +&i2c_5 { /* BLSP2 QUP1 (NFC) */ + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <&tlmm 17 0x00>; + qcom,nq-ven = <&tlmm 16 0x00>; + qcom,nq-firm = <&tlmm 62 0x00>; + qcom,nq-clkreq = <&pm8953_gpios 2 0x00>; + interrupt-parent = <&tlmm>; + qcom,clk-src = "BBCLK2"; + interrupts = <17 0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <&nfc_int_active &nfc_disable_active>; + pinctrl-1 = <&nfc_int_suspend &nfc_disable_suspend>; + clocks = <&clock_gcc clk_bb_clk2_pin>; + clock-names = "ref_clk"; + }; +}; + +&i2c_3 { + status = "ok"; + focaltech@38{ + compatible = "focaltech,fts"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8953_l10>; + vcc_i2c-suppy = <&pm8953_l6>; + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + focaltech,name = "fts_ts"; + focaltech,family-id = <0x54>; + focaltech,reset-gpio = <&tlmm 64 0x00>; + focaltech,irq-gpio = <&tlmm 65 0x2008>; + focaltech,display-coords = <0 0 1080 1920>; + focaltech,panel-coords = <0 0 1080 1920>; + /*ftech,button-map= <139 102 158>;*/ + focaltech,virtual-key1 = <139 560 2000>;/*menu*/ + focaltech,virtual-key2 = <102 360 2000>;/*home*/ + focaltech,virtual-key3 = <158 160 2000>;/*back*/ + focaltech,no-force-update; + focaltech,i2c-pull-up; + focaltech,group-id = <1>; + focaltech,hard-reset-delay-ms = <20>; + focaltech,soft-reset-delay-ms = <200>; + focaltech,num-max-touches = <10>; + focaltech,fw-delay-aa-ms = <30>; + focaltech,fw-delay-55-ms = <30>; + focaltech,fw-upgrade-id1 = <0x79>; + focaltech,fw-upgrade-id2 = <0x18>; + focaltech,fw-delay-readid-ms = <10>; + focaltech,fw-delay-era-flsh-ms = <2000>; + focaltech,fw-auto-cal; + focaltech,ignore-id-check; + }; +}; + +&pm8953_l10 { + regulator-max-microvolt = <2850000>; +}; + +&soc { + gpio_keys { + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend"; + pinctrl-0 = <&gpio_key_active>; + pinctrl-1 = <&gpio_key_suspend>; + + camera_focus { + label = "camera_focus"; + gpios = <&tlmm 87 0x1>; + linux,input-type = <1>; + linux,code = <0x210>; + debounce-interval = <15>; + }; + + camera_snapshot { + label = "camera_snapshot"; + gpios = <&tlmm 86 0x1>; + linux,input-type = <1>; + linux,code = <0x2fe>; + debounce-interval = <15>; + }; + + vol_up { + label = "volume_up"; + gpios = <&tlmm 85 0x1>; + linux,input-type = <1>; + linux,code = <115>; + debounce-interval = <15>; + }; + }; + + hbtp { + compatible = "qcom,hbtp-input"; + vcc_ana-supply = <&pm8953_l10>; + vcc_dig-supply = <&pm8953_l5>; + qcom,afe-load = <50000>; + qcom,afe-vtg-min = <2850000>; + qcom,afe-vtg-max = <2850000>; + qcom,dig-load = <15000>; + qcom,dig-vtg-min = <1800000>; + qcom,dig-vtg-max = <1800000>; + }; + i2c@78b6000 { /* i2c 2 */ + aw2013@45 { /*blink */ + compatible = "awinc,aw2013"; + reg = <0x45>; + rgb_led-supply = <&pm8953_l10>; + + red { + label = "red"; + linux,default-trigger = "battery-red"; + default-state = "off"; + retain-state-suspended; + }; + + green { + label = "green"; + linux,default-trigger = "battery-green"; + default-state = "off"; + retain-state-suspended; + }; + + blue { + label = "blue"; + linux,default-trigger = "battery-blue"; + default-state = "off"; + retain-state-suspended; + }; + white { + label = "white"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + yellow { + label = "yellow"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + cyan { + label = "cyan"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + purple { + label = "purple"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + }; + }; +}; + +&pmi_haptic{ + qcom,actuator-type = "lra"; + qcom,lra-auto-res-mode="qwd"; + qcom,lra-high-z="opt1"; + qcom,lra-res-cal-period = <0>; + qcom,wave-play-rate-us = <4165>; +}; + +&wled { + qcom,cons-sync-write-delay-us = <1000>; +}; + +&flash_led { + compatible = "qcom,qpnp-flash-led"; + reg = <0xd300 0x100>; + qcom,follow-otst2-rb-disabled; +}; + +#include "msm8953-mdss-panels.dtsi" + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + qcom,dsi-pref-prim-pan = <&dsi_ft8613_ebbg_5p7_720p_video>; + qcom,dsi-pref-sub-pan = <&dsi_ft8006m_boe_5p7_720p_video>; + qcom,dsi-pref-sub1-pan = <&dsi_ft8613_ebbg_5p5_1080p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active>; + pinctrl-1 = <&mdss_dsi_suspend>; + + qcom,platform-reset-gpio = <&tlmm 61 0>; + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + status = "disabled"; + qcom,dsi-pref-prim-pan = <&dsi_adv7533_1080p>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,pluggable; + qcom,platform-te-gpio = <&tlmm 24 0>; + qcom,platform-reset-gpio = <&tlmm 61 0>; + qcom,platform-bklight-en-gpio = <&tlmm 59 0>; +}; + +&labibb { + status = "ok"; + qpnp,qpnp-labibb-mode = "lcd"; +}; + +&dsi_ft8613_ebbg_5p7_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ft8006m_boe_5p7_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ft8613_ebbg_5p5_1080p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_truly_1080_vid { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_clk_mode"; +}; + +&dsi_truly_1080_cmd { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,ulps-enabled; + qcom,partial-update-enabled; + qcom,panel-roi-alignment = <2 2 4 2 1080 2>; +}; + +&blsp1_uart0 { + status = "ok"; + pinctrl-names = "default"; + pinctrl-0 = <&uart_console_active>; +}; + +&mem_client_3_size { + qcom,peripheral-size = <0x500000>; +}; + +&sdhc_1 { + /* device core power supply */ + vdd-supply = <&pm8953_l8>; + qcom,vdd-voltage-level = <2900000 2900000>; + qcom,vdd-current-level = <200 570000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8953_l5>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <1800000 1800000>; + qcom,vdd-io-current-level = <200 325000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on &sdc1_rclk_on>; + pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off &sdc1_rclk_off>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 192000000 + 384000000>; + qcom,nonremovable; + qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v"; + + status = "ok"; +}; + +&sdhc_2 { + /* device core power supply */ + vdd-supply = <&pm8953_l11>; + qcom,vdd-voltage-level = <2950000 2950000>; + qcom,vdd-current-level = <15000 800000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8953_l12>; + qcom,vdd-io-voltage-level = <1800000 2950000>; + qcom,vdd-io-current-level = <200 22000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>; + pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off>; + + #address-cells = <0>; + interrupt-parent = <&sdhc_2>; + interrupts = <0 1 2>; + #interrupt-cells = <1>; + interrupt-map-mask = <0xffffffff>; + interrupt-map = <0 &intc 0 125 0 + 1 &intc 0 221 0 + 2 &tlmm 133 0>; + interrupt-names = "hc_irq", "pwr_irq", "status_irq"; + cd-gpios = <&tlmm 133 0x1>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 + 200000000>; + qcom,bus-speed-mode = "SDR12", "SDR25", "SDR50", "DDR50", "SDR104"; + + status = "ok"; +}; + +&pm8953_typec { + ss-mux-supply = <&pm8953_l13>; + qcom,ssmux-gpio = <&tlmm 139 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&typec_ssmux_config>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; + +&pm8953_gpios { + /* GPIO 2 (NFC_CLK_REQ) */ + gpio@c100 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pinctrl_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-pinctrl_rosy.dtsi new file mode 100644 index 0000000000000..9523453cfb500 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pinctrl_rosy.dtsi @@ -0,0 +1,1476 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +&soc { + tlmm: pinctrl@1000000 { + compatible = "qcom,msm8953-pinctrl"; + reg = <0x1000000 0x300000>; + interrupts = <0 208 0>; + gpio-controller; + #gpio-cells = <2>; + interrupt-controller; + #interrupt-cells = <2>; + + pmx-uartconsole { + uart_console_active: uart_console_active { + mux { + pins = "gpio4", "gpio5"; + function = "blsp_uart2"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <2>; + bias-disable; + }; + }; + + uart_console_sleep: uart_console_sleep { + mux { + pins = "gpio4", "gpio5"; + function = "blsp_uart2"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <2>; + bias-pull-down; + }; + }; + + }; + cci { + cci0_active: cci0_active { + /* cci0 active state */ + mux { + /* CLK, DATA */ + pins = "gpio29", "gpio30"; + function = "cci_i2c"; + }; + + config { + pins = "gpio29", "gpio30"; + drive-strength = <2>; /* 2 MA */ + bias-disable; /* No PULL */ + }; + }; + + cci0_suspend: cci0_suspend { + /* cci0 suspended state */ + mux { + /* CLK, DATA */ + pins = "gpio29", "gpio30"; + function = "cci_i2c"; + }; + + config { + pins = "gpio29", "gpio30"; + drive-strength = <2>; /* 2 MA */ + bias-disable; /* No PULL */ + }; + }; + + cci1_active: cci1_active { + /* cci1 active state */ + mux { + /* CLK, DATA */ + pins = "gpio31", "gpio32"; + function = "cci_i2c"; + }; + + config { + pins = "gpio31", "gpio32"; + drive-strength = <2>; /* 2 MA */ + bias-disable; /* No PULL */ + }; + }; + + cci1_suspend: cci1_suspend { + /* cci1 suspended state */ + mux { + /* CLK, DATA */ + pins = "gpio31", "gpio32"; + function = "cci_i2c"; + }; + + config { + pins = "gpio31", "gpio32"; + drive-strength = <2>; /* 2 MA */ + bias-disable; /* No PULL */ + }; + }; + }; + + /*sensors */ + cam_sensor_mclk0_default: cam_sensor_mclk0_default { + /* MCLK0 */ + mux { + /* CLK, DATA */ + pins = "gpio26"; + function = "cam_mclk"; + }; + + config { + pins = "gpio26"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_mclk0_sleep: cam_sensor_mclk0_sleep { + /* MCLK0 */ + mux { + /* CLK, DATA */ + pins = "gpio26"; + function = "cam_mclk"; + }; + + config { + pins = "gpio26"; + bias-pull-down; /* PULL DOWN */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_rear_default: cam_sensor_rear_default { + /* RESET, STANDBY */ + mux { + pins = "gpio40"; + function = "gpio"; + }; + + config { + pins = "gpio40"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_rear_sleep: cam_sensor_rear_sleep { + /* RESET, STANDBY */ + mux { + pins = "gpio40"; + function = "gpio"; + }; + + config { + pins = "gpio40"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_mclk1_default: cam_sensor_mclk1_default { + /* MCLK1 */ + mux { + /* CLK, DATA */ + pins = "gpio27"; + function = "cam_mclk"; + }; + + config { + pins = "gpio27"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_mclk1_sleep: cam_sensor_mclk1_sleep { + /* MCLK1 */ + mux { + /* CLK, DATA */ + pins = "gpio27"; + function = "cam_mclk"; + }; + + config { + pins = "gpio27"; + bias-pull-down; /* PULL DOWN */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_front1_default: cam_sensor_front1_default { + /* RESET, STANDBY */ + mux { + pins = "gpio129", "gpio130"; + function = "gpio"; + }; + + config { + pins = "gpio129", "gpio130"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_front1_sleep: cam_sensor_front1_sleep { + /* RESET, STANDBY */ + mux { + pins = "gpio129", "gpio130"; + function = "gpio"; + }; + + config { + pins = "gpio129", "gpio130"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + pmx_adv7533_int: pmx_adv7533_int { + adv7533_int_active: adv7533_int_active { + mux { + pins = "gpio90"; + function = "gpio"; + }; + + config { + pins = "gpio90"; + drive-strength = <16>; + bias-disable; + }; + }; + + adv7533_int_suspend: adv7533_int_suspend { + mux { + pins = "gpio90"; + function = "gpio"; + }; + + config { + pins = "gpio90"; + drive-strength = <16>; + bias-disable; + }; + }; + + }; + + pmx_mdss: pmx_mdss { + mdss_dsi_active: mdss_dsi_active { + mux { + pins = "gpio61", "gpio59"; + function = "gpio"; + }; + + config { + pins = "gpio61", "gpio59"; + drive-strength = <8>; /* 8 mA */ + bias-disable = <0>; /* no pull */ + output-high; + }; + }; + + mdss_dsi_suspend: mdss_dsi_suspend { + mux { + pins = "gpio61", "gpio59"; + function = "gpio"; + }; + + config { + pins = "gpio61", "gpio59"; + drive-strength = <2>; /* 2 mA */ + bias-pull-down; /* pull down */ + }; + }; + }; + + pmx_mdss_te { + mdss_te_active: mdss_te_active { + mux { + pins = "gpio24"; + function = "mdp_vsync"; + }; + config { + pins = "gpio24"; + drive-strength = <2>; /* 8 mA */ + bias-pull-down; /* pull down*/ + }; + }; + + mdss_te_suspend: mdss_te_suspend { + mux { + pins = "gpio24"; + function = "mdp_vsync"; + }; + config { + pins = "gpio24"; + drive-strength = <2>; /* 2 mA */ + bias-pull-down; /* pull down */ + }; + }; + }; + + /* SDC pin type */ + sdc1_clk_on: sdc1_clk_on { + config { + pins = "sdc1_clk"; + bias-disable; /* NO pull */ + drive-strength = <16>; /* 16 MA */ + }; + }; + + sdc1_clk_off: sdc1_clk_off { + config { + pins = "sdc1_clk"; + bias-disable; /* NO pull */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc1_cmd_on: sdc1_cmd_on { + config { + pins = "sdc1_cmd"; + bias-pull-up; /* pull up */ + drive-strength = <10>; /* 10 MA */ + }; + }; + + sdc1_cmd_off: sdc1_cmd_off { + config { + pins = "sdc1_cmd"; + num-grp-pins = <1>; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc1_data_on: sdc1_data_on { + config { + pins = "sdc1_data"; + bias-pull-up; /* pull up */ + drive-strength = <10>; /* 10 MA */ + }; + }; + + sdc1_data_off: sdc1_data_off { + config { + pins = "sdc1_data"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc1_rclk_on: sdc1_rclk_on { + config { + pins = "sdc1_rclk"; + bias-pull-down; /* pull down */ + }; + }; + + sdc1_rclk_off: sdc1_rclk_off { + config { + pins = "sdc1_rclk"; + bias-pull-down; /* pull down */ + }; + }; + + sdc2_clk_on: sdc2_clk_on { + config { + pins = "sdc2_clk"; + drive-strength = <16>; /* 16 MA */ + bias-disable; /* NO pull */ + }; + }; + + sdc2_clk_off: sdc2_clk_off { + config { + pins = "sdc2_clk"; + bias-disable; /* NO pull */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc2_cmd_on: sdc2_cmd_on { + config { + pins = "sdc2_cmd"; + bias-pull-up; /* pull up */ + drive-strength = <10>; /* 10 MA */ + }; + }; + + sdc2_cmd_off: sdc2_cmd_off { + config { + pins = "sdc2_cmd"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc2_data_on: sdc2_data_on { + config { + pins = "sdc2_data"; + bias-pull-up; /* pull up */ + drive-strength = <10>; /* 10 MA */ + }; + }; + + sdc2_data_off: sdc2_data_off { + config { + pins = "sdc2_data"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc2_cd_on: cd_on { + mux { + pins = "gpio133"; + function = "gpio"; + }; + + config { + pins = "gpio133"; + drive-strength = <2>; + bias-pull-up; + }; + }; + + sdc2_cd_off: cd_off { + mux { + pins = "gpio133"; + function = "gpio"; + }; + + config { + pins = "gpio133"; + drive-strength = <2>; + bias-disable; + }; + }; + gpio_led_pins { + gpio_led_off: gpio_led_off { + mux { + pins = "gpio20"; + function = "gpio"; + }; + config { + pins = "gpio20"; + drive-strength = <6>; + bias-pull-down; + output-low; + }; + }; + }; + i2c_2 { + i2c_2_active: i2c_2_active { + /* active state */ + mux { + pins = "gpio6", "gpio7"; + function = "blsp_i2c2"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <2>; + bias-disable; + }; + }; + + i2c_2_sleep: i2c_2_sleep { + /* suspended state */ + mux { + pins = "gpio6", "gpio7"; + function = "gpio"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + i2c_3 { + i2c_3_active: i2c_3_active { + /* active state */ + mux { + pins = "gpio10", "gpio11"; + function = "blsp_i2c3"; + }; + + config { + pins = "gpio10", "gpio11"; + drive-strength = <2>; + bias-disable; + }; + }; + + i2c_3_sleep: i2c_3_sleep { + /* suspended state */ + mux { + pins = "gpio10", "gpio11"; + function = "gpio"; + }; + + config { + pins = "gpio10", "gpio11"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + i2c_5 { + i2c_5_active: i2c_5_active { + /* active state */ + mux { + pins = "gpio18", "gpio19"; + function = "blsp_i2c5"; + }; + + config { + pins = "gpio18", "gpio19"; + drive-strength = <2>; + bias-disable; + }; + }; + + i2c_5_sleep: i2c_5_sleep { + /* suspended state */ + mux { + pins = "gpio18", "gpio19"; + function = "gpio"; + }; + + config { + pins = "gpio18", "gpio19"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + i2c_8{ + i2c_8_active:i2c_8_active{ + /* active state */ + mux{ + pins = "gpio98","gpio99"; + function = "blsp_i2c8"; + }; + + config{ + pins = "gpio98","gpio99"; + drive-strength = <2>; + bias-disable; + }; + }; + + i2c_8_sleep:i2c_8_sleep{ + /* suspended state */ + mux{ + pins = "gpio98","gpio99"; + function = "gpio"; + }; + + config{ + pins = "gpio98","gpio99"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + wcnss_pmux_5wire { + /* Active configuration of bus pins */ + wcnss_default: wcnss_default { + wcss_wlan2 { + pins = "gpio76"; + function = "wcss_wlan2"; + }; + wcss_wlan1 { + pins = "gpio77"; + function = "wcss_wlan1"; + }; + wcss_wlan0 { + pins = "gpio78"; + function = "wcss_wlan0"; + }; + wcss_wlan { + pins = "gpio79", "gpio80"; + function = "wcss_wlan"; + }; + + config { + pins = "gpio76", "gpio77", + "gpio78", "gpio79", + "gpio80"; + drive-strength = <6>; /* 6 MA */ + bias-pull-up; /* PULL UP */ + }; + }; + + wcnss_sleep: wcnss_sleep { + wcss_wlan2 { + pins = "gpio76"; + function = "wcss_wlan2"; + }; + wcss_wlan1 { + pins = "gpio77"; + function = "wcss_wlan1"; + }; + wcss_wlan0 { + pins = "gpio78"; + function = "wcss_wlan0"; + }; + wcss_wlan { + pins = "gpio79", "gpio80"; + function = "wcss_wlan"; + }; + + config { + pins = "gpio76", "gpio77", + "gpio78", "gpio79", + "gpio80"; + drive-strength = <2>; /* 2 MA */ + bias-pull-down; /* PULL Down */ + }; + }; + }; + + wcnss_pmux_gpio: wcnss_pmux_gpio { + wcnss_gpio_default: wcnss_gpio_default { + /* Active configuration of bus pins */ + mux { + /* Uses general purpose pins */ + pins = "gpio76", "gpio77", + "gpio78", "gpio79", + "gpio80"; + function = "gpio"; + }; + + config { + pins = "gpio76", "gpio77", + "gpio78", "gpio79", + "gpio80"; + drive-strength = <6>; /* 6 MA */ + bias-pull-up; /* PULL UP */ + }; + }; + }; + + wcd9xxx_intr { + wcd_intr_default: wcd_intr_default{ + mux { + pins = "gpio73"; + function = "gpio"; + }; + + config { + pins = "gpio73"; + drive-strength = <2>; /* 2 mA */ + bias-pull-down; /* pull down */ + input-enable; + }; + }; + }; + + cdc_reset_ctrl { + cdc_reset_sleep: cdc_reset_sleep { + mux { + pins = "gpio67"; + function = "gpio"; + }; + config { + pins = "gpio67"; + drive-strength = <16>; + bias-disable; + output-low; + }; + }; + cdc_reset_active:cdc_reset_active { + mux { + pins = "gpio67"; + function = "gpio"; + }; + config { + pins = "gpio67"; + drive-strength = <16>; + bias-pull-down; + output-high; + }; + }; + }; + + cdc_mclk2_pin { + cdc_mclk2_sleep: cdc_mclk2_sleep { + mux { + pins = "gpio66"; + function = "pri_mi2s"; + }; + config { + pins = "gpio66"; + drive-strength = <2>; /* 2 mA */ + bias-pull-down; /* PULL DOWN */ + }; + }; + cdc_mclk2_active: cdc_mclk2_active { + mux { + pins = "gpio66"; + function = "pri_mi2s"; + }; + config { + pins = "gpio66"; + drive-strength = <8>; /* 8 mA */ + bias-disable; /* NO PULL */ + }; + }; + }; + + cdc-pdm-2-lines { + cdc_pdm_lines_2_act: pdm_lines_2_on { + mux { + pins = "gpio70", "gpio71", "gpio72"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio70", "gpio71", "gpio72"; + drive-strength = <8>; + }; + }; + + cdc_pdm_lines_2_sus: pdm_lines_2_off { + mux { + pins = "gpio70", "gpio71", "gpio72"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio70", "gpio71", "gpio72"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + cdc-pdm-lines { + cdc_pdm_lines_act: pdm_lines_on { + mux { + pins = "gpio69", "gpio73", "gpio74"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio69", "gpio73", "gpio74"; + drive-strength = <8>; + }; + }; + cdc_pdm_lines_sus: pdm_lines_off { + mux { + pins = "gpio69", "gpio73", "gpio74"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio69", "gpio73", "gpio74"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + cdc-pdm-comp-lines { + cdc_pdm_comp_lines_act: pdm_comp_lines_on { + mux { + pins = "gpio67", "gpio68"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio67", "gpio68"; + drive-strength = <8>; + }; + }; + + cdc_pdm_comp_lines_sus: pdm_comp_lines_off { + mux { + pins = "gpio67", "gpio68"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio67", "gpio68"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + cross-conn-det { + cross_conn_det_act: lines_on { + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + drive-strength = <8>; + output-low; + bias-pull-down; + }; + }; + + cross_conn_det_sus: lines_off { + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + /* WSA VI sense */ + wsa-vi { + wsa_vi_on: wsa_vi_on { + mux { + pins = "gpio94", "gpio95"; + function = "wsa_io"; + }; + + config { + pins = "gpio94", "gpio95"; + drive-strength = <8>; /* 8 MA */ + bias-disable; /* NO pull */ + }; + }; + + wsa_vi_off: wsa_vi_off { + mux { + pins = "gpio94", "gpio95"; + function = "wsa_io"; + }; + + config { + pins = "gpio94", "gpio95"; + drive-strength = <2>; /* 2 MA */ + bias-pull-down; + }; + }; + }; + + /* WSA CLK */ + wsa_clk { + wsa_clk_on: wsa_clk_on { + mux { + pins = "gpio25"; + function = "pri_mi2s_mclk_a"; + }; + + config { + pins = "gpio25"; + drive-strength = <8>; /* 8 MA */ + output-high; + }; + }; + + wsa_clk_off: wsa_clk_off { + mux { + pins = "gpio25"; + function = "pri_mi2s_mclk_a"; + }; + + config { + pins = "gpio25"; + drive-strength = <2>; /* 2 MA */ + output-low; + bias-pull-down; + }; + }; + }; + + pri-tlmm-lines { + pri_tlmm_lines_act: pri_tlmm_lines_act { + mux { + pins = "gpio91", "gpio93"; + function = "pri_mi2s"; + }; + + config { + pins = "gpio91", "gpio93"; + drive-strength = <8>; + }; + }; + + pri_tlmm_lines_sus: pri_tlmm_lines_sus { + mux { + pins = "gpio91", "gpio93"; + function = "pri_mi2s"; + }; + + config { + pins = "gpio91", "gpio93"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + pri-tlmm-ws-lines { + pri_tlmm_ws_act: pri_tlmm_ws_act { + mux { + pins = "gpio92"; + function = "pri_mi2s_ws"; + }; + + config { + pins = "gpio92"; + drive-strength = <8>; + }; + }; + + pri_tlmm_ws_sus: pri_tlmm_ws_sus { + mux { + pins = "gpio92"; + function = "pri_mi2s_ws"; + }; + + config { + pins = "gpio92"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + fpc_spi_active: fpc_spi_active{ + mux { + pins = "gpio135", "gpio136", "gpio137", "gpio138"; + function = "blsp_spi7"; + }; + config { + pins = "gpio135", "gpio136", "gpio137", "gpio138"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + fpc_reset_reset: fpc_reset_reset{ + mux { + pins = "gpio140"; + function = "gpio"; + }; + config { + pins = "gpio140"; + drive-strength = <2>; + bias-disable = <0>; + output-low; + }; + }; + fpc_reset_active: fpc_reset_active{ + mux { + pins = "gpio140"; + function = "gpio"; + }; + config { + pins = "gpio140"; + drive-strength = <2>; + bias-disable = <0>; + output-high; + }; + }; + + fpc_irq_active: fpc_irq_active { + mux { + pins = "gpio48"; + function = "gpio"; + }; + config { + pins = "gpio48"; + drive-strength = <2>; + bias-disable = <0>; + input-enable; + }; + }; + goodix_spi_active: goodix_spi_active{ + mux { + pins = "gpio135", "gpio136", "gpio137", "gpio138"; + function = "blsp_spi7"; + }; + config { + pins = "gpio135", "gpio136", "gpio137", "gpio138"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + goodix_reset_reset: goodix_reset_reset{ + mux { + pins = "gpio140"; + function = "gpio"; + }; + config { + pins = "gpio140"; + drive-strength = <2>; + bias-disable = <0>; + output-low; + }; + }; + goodix_reset_active: goodix_reset_active{ + mux { + pins = "gpio140"; + function = "gpio"; + }; + config { + pins = "gpio140"; + drive-strength = <2>; + bias-disable = <0>; + output-high; + }; + }; + + goodix_irq_active: goodix_irq_active { + mux { + pins = "gpio48"; + function = "gpio"; + }; + config { + pins = "gpio48"; + drive-strength = <2>; + bias-disable = <0>; + input-enable; + }; + }; + + spi6 { + spi6_default: spi6_default { + /* active state */ + mux { + /* MOSI, MISO, CLK */ + pins = "gpio20", "gpio21", "gpio23"; + function = "blsp_spi6"; + }; + + config { + pins = "gpio20", "gpio21", "gpio23"; + drive-strength = <12>; /* 12 MA */ + bias-disable = <0>; /* No PULL */ + }; + }; + + spi6_sleep: spi6_sleep { + /* suspended state */ + mux { + /* MOSI, MISO, CLK */ + pins = "gpio20", "gpio21", "gpio23"; + function = "gpio"; + }; + + config { + pins = "gpio20", "gpio21", "gpio23"; + drive-strength = <2>; /* 2 MA */ + bias-pull-down; /* PULL Down */ + }; + }; + + spi6_cs0_active: cs0_active { + /* CS */ + mux { + pins = "gpio22"; + function = "blsp_spi6"; + }; + + config { + pins = "gpio22"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + + spi6_cs0_sleep: cs0_sleep { + /* CS */ + mux { + pins = "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio22"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + }; + /* add pingrp for touchscreen */ + pmx_ts_int_active { + ts_int_active: ts_int_active { + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + drive-strength = <8>; + bias-pull-up; + }; + }; + }; + + pmx_ts_int_suspend { + ts_int_suspend: ts_int_suspend { + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + pmx_ts_reset_active { + ts_reset_active: ts_reset_active { + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + drive-strength = <8>; + bias-pull-up; + }; + }; + }; + + pmx_ts_reset_suspend { + ts_reset_suspend: ts_reset_suspend { + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + pmx_ts_release { + ts_release: ts_release { + mux { + pins = "gpio65", "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio65", "gpio64"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + tlmm_gpio_key { + gpio_key_active: gpio_key_active { + mux { + pins = "gpio85", "gpio86", "gpio87"; + function = "gpio"; + }; + + config { + pins = "gpio85", "gpio86", "gpio87"; + drive-strength = <2>; + bias-pull-up; + }; + }; + + gpio_key_suspend: gpio_key_suspend { + mux { + pins = "gpio85", "gpio86", "gpio87"; + function = "gpio"; + }; + + config { + pins = "gpio85", "gpio86", "gpio87"; + drive-strength = <2>; + bias-pull-up; + }; + }; + }; + pmx_qdsd_clk { + qdsd_clk_sdcard: clk_sdcard { + config { + pins = "qdsd_clk"; + bias-disable;/* NO pull */ + drive-strength = <16>; /* 16 MA */ + }; + }; + qdsd_clk_trace: clk_trace { + config { + pins = "qdsd_clk"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_clk_swdtrc: clk_swdtrc { + config { + pins = "qdsd_clk"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_clk_spmi: clk_spmi { + config { + pins = "qdsd_clk"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + }; + + pmx_qdsd_cmd { + qdsd_cmd_sdcard: cmd_sdcard { + config { + pins = "qdsd_cmd"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_cmd_trace: cmd_trace { + config { + pins = "qdsd_cmd"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_cmd_swduart: cmd_uart { + config { + pins = "qdsd_cmd"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_cmd_swdtrc: cmd_swdtrc { + config { + pins = "qdsd_cmd"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_cmd_jtag: cmd_jtag { + config { + pins = "qdsd_cmd"; + bias-disable; /* NO pull */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_cmd_spmi: cmd_spmi { + config { + pins = "qdsd_cmd"; + bias-pull-down; /* pull down */ + drive-strength = <10>; /* 10 MA */ + }; + }; + }; + + pmx_qdsd_data0 { + qdsd_data0_sdcard: data0_sdcard { + config { + pins = "qdsd_data0"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data0_trace: data0_trace { + config { + pins = "qdsd_data0"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data0_swduart: data0_uart { + config { + pins = "qdsd_data0"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data0_swdtrc: data0_swdtrc { + config { + pins = "qdsd_data0"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data0_jtag: data0_jtag { + config { + pins = "qdsd_data0"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data0_spmi: data0_spmi { + config { + pins = "qdsd_data0"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + }; + + pmx_qdsd_data1 { + qdsd_data1_sdcard: data1_sdcard { + config { + pins = "qdsd_data1"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data1_trace: data1_trace { + config { + pins = "qdsd_data1"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data1_swduart: data1_uart { + config { + pins = "qdsd_data1"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data1_swdtrc: data1_swdtrc { + config { + pins = "qdsd_data1"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data1_jtag: data1_jtag { + config { + pins = "qdsd_data1"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + }; + + pmx_qdsd_data2 { + qdsd_data2_sdcard: data2_sdcard { + config { + pins = "qdsd_data2"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data2_trace: data2_trace { + config { + pins = "qdsd_data2"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data2_swduart: data2_uart { + config { + pins = "qdsd_data2"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data2_swdtrc: data2_swdtrc { + config { + pins = "qdsd_data2"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data2_jtag: data2_jtag { + config { + pins = "qdsd_data2"; + bias-pull-up; /* pull up */ + drive-strength = <8>; /* 8 MA */ + }; + }; + }; + + pmx_qdsd_data3 { + qdsd_data3_sdcard: data3_sdcard { + config { + pins = "qdsd_data3"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data3_trace: data3_trace { + config { + pins = "qdsd_data3"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data3_swduart: data3_uart { + config { + pins = "qdsd_data3"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data3_swdtrc: data3_swdtrc { + config { + pins = "qdsd_data3"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data3_jtag: data3_jtag { + config { + pins = "qdsd_data3"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data3_spmi: data3_spmi { + config { + pins = "qdsd_data3"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + }; + + typec_ssmux_config: typec_ssmux_config { + mux { + pins = "gpio139"; + function = "gpio"; + }; + + config { + pins = "gpio139"; + drive-strength = <2>; + bias-disable; + }; + }; + + radio_frequence_config: radio_frequence_config { + config { + pins = "gpio112"; + drive-strength = <2>; + bias-pull-up; + }; + }; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pm.dtsi b/arch/arm/boot/dts/qcom/msm8953-pm.dtsi index d30fe282fb356..ca4da0b8f9c41 100644 --- a/arch/arm/boot/dts/qcom/msm8953-pm.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-pm.dtsi @@ -402,6 +402,7 @@ <0xff 264>, /* arm-smmu context fault */ <0xff 269>, /* rpm_wdog_expired_irq */ <0xff 270>, /* blsp1_bam_irq[0] */ + <0xff 271>, /* sps interrupt */ <0xff 273>, /* smmu_bus_intr[18] */ <0xff 274>, /* smmu_bus_intr[19] */ <0xff 275>, /* rpm_ipc(30) */ @@ -455,6 +456,7 @@ <34 81>, <35 85>, <36 90>, + <37 112>, <50 67>, <51 73>, <52 74>, diff --git a/arch/arm/boot/dts/qcom/msm8953-qrd-sku3_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-qrd-sku3_rosy.dtsi new file mode 100644 index 0000000000000..100ee3ae777b5 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-qrd-sku3_rosy.dtsi @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm8953-qrd_rosy.dtsi" +#include "msm8953-pinctrl_rosy.dtsi" +#include "msm8953-camera-sensor-qrd_rosy.dtsi" +#include "dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi" +#include "dsi-panel-ft8006m-boe-5p7-720p-video.dtsi" +#include "dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi" +#include "dsi-panel-ft8613-csot-5p7-720p-video.dtsi" + +&spmi_bus { + qcom,pmi8940@3 { + labibb: qpnp-labibb-regulator { + ibb_regulator: qcom,ibb@dc00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5700000>; + }; + + lab_regulator: qcom,lab@de00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5700000>; + }; + }; + }; +}; + +#include "msm8953-mdss-panels.dtsi" + +&tlmm { + pmx_mdss { + mdss_dsi_active: mdss_dsi_active { + mux { + pins = "gpio61"; + }; + config { + pins = "gpio61"; + }; + }; + mdss_dsi_suspend: mdss_dsi_suspend { + mux { + pins = "gpio61"; + }; + config { + pins = "gpio61"; + }; + }; + }; +}; + +&dsi_r69006_1080p_cmd { + qcom,esd-check-enabled; +}; + +#include "msm8953-mdss-panels.dtsi" +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + qcom,dsi-pref-prim-pan = <&dsi_ft8613_ebbg_5p7_720p_video>; + qcom,dsi-pref-sub-pan = <&dsi_ft8006m_boe_5p7_720p_video>; + qcom,dsi-pref-sub1-pan = <&dsi_ft8613_csot_5p7_720p_video>; + qcom,dsi-pref-sub2-pan = <&dsi_ft8613_ebbg_5p5_1080p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active>; + pinctrl-1 = <&mdss_dsi_suspend>; + + qcom,platform-reset-gpio = <&tlmm 61 0>; + iovdd_gpio-supply = <&iovdd_gpio_vreg>; + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + status = "disabled"; +}; + +&labibb { + status = "ok"; + qpnp,qpnp-labibb-mode = "lcd"; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@1 { + reg = <1>; + qcom,supply-name = "iovdd_gpio"; + qcom,supply-min-voltage = <1800000>; + qcom,supply-max-voltage = <1800000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; +}; + +&dsi_ft8613_ebbg_5p7_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,qpnp-ibb-init-lcd-voltage = <5800000>; + qcom,qpnp-lab-init-lcd-voltage = <5800000>; +}; + +&dsi_ft8006m_boe_5p7_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,qpnp-ibb-init-lcd-voltage = <6000000>; + qcom,qpnp-lab-init-lcd-voltage = <6000000>; +}; + +&dsi_ft8613_csot_5p7_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,qpnp-ibb-init-lcd-voltage = <5800000>; + qcom,qpnp-lab-init-lcd-voltage = <5800000>; +}; + +&dsi_ft8613_ebbg_5p5_1080p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,qpnp-ibb-init-lcd-voltage = <5800000>; + qcom,qpnp-lab-init-lcd-voltage = <5800000>; +}; + +&dsi_r69006_1080p_cmd { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_r69006_1080p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&int_codec { + status = "okay"; + qcom,model = "msm8953-snd-card-mtp"; + qcom,msm-hs-micbias-type = "internal"; +}; + +&pm8953_diangu_dig { + status = "okay"; +}; + +&pm8953_diangu_analog { + status = "okay"; +}; +&wsa881x_i2c_e { + status = "disabled"; +}; + +&wsa881x_i2c_44 { + status = "disabled"; +}; + +&wsa881x_i2c_f { + status = "disabled"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-qrd_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-qrd_rosy.dtsi new file mode 100644 index 0000000000000..fe703e6b22442 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-qrd_rosy.dtsi @@ -0,0 +1,479 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "msm8953-pinctrl_rosy.dtsi" +#include "msm8953-camera-sensor-qrd_rosy.dtsi" +#include +#include + +&soc { + radio_frequence { + compatible = "wingtech,radio_frequence_detection"; + pinctrl-names = "default"; + pinctrl-0 = <&radio_frequence_config>; + gpios = <&tlmm 112 GPIO_ACTIVE_HIGH>; + linux,input-type = <1>; + linux,code = ; + interrupts-extended = <&tlmm 112 0x3>; + debounce-interval = <30>; + }; + + gpio_keys { + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend"; + pinctrl-0 = <&gpio_key_active>; + pinctrl-1 = <&gpio_key_suspend>; + + vol_up { + label = "volume_up"; + gpios = <&tlmm 85 0x1>; + linux,input-type = <1>; + linux,code = <115>; + debounce-interval = <15>; + }; + }; + + i2c@78b7000 { /* BLSP1 QUP3 */ + status = "okay"; + synaptics@4b { + compatible = "synaptics,dsx-i2c"; + reg = <0x4b>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd_ana-supply = <&vdd_vreg>; + vcc_i2c-supply = <&pm8953_l6>; + synaptics,pwr-reg-name = "vdd_ana"; + synaptics,bus-reg-name = "vcc_i2c"; + synaptics,irq-gpio = <&tlmm 65 0x2008>; + synaptics,irq-on-state = <0>; + synaptics,irq-flags = <0x2008>; + synaptics,power-delay-ms = <200>; + synaptics,reset-delay-ms = <200>; + synaptics,max-y-for-2d = <1919>; + synaptics,cap-button-codes = <139 158 172>; + synaptics,vir-button-codes = <139 180 2000 320 160 + 158 540 2000 320 160 + 172 900 2000 320 160>; + synaptics,resume-in-workqueue; + /* Underlying clocks used by secure touch */ + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup3_i2c_apps_clk>; + }; + }; + + vdd_vreg: vdd_vreg { + compatible = "regulator-fixed"; + status = "ok"; + regulator-name = "vdd_vreg"; + }; + fpc1020 { + compatible = "fpc,fpc1020"; + + interrupt-parent = <&tlmm>; + interrupts = <48 0x0>; + + fpc,gpio_rst = <&tlmm 140 0>; + fpc,gpio_irq = <&tlmm 48 0>; + fpc,gpio_pwr = <&tlmm 134 0>; + + vcc_spi-supply = <&pm8953_l5>; + vdd_ana-supply = <&pm8953_l5>; + vdd_io-supply = <&pm8953_l5>; + + fpc,enable-on-boot; + /delete-property/ + fpc,enable-wakeup; + + fpc,spi-max-frequency = <4800000>; + + /* Only for SPI Clock Handled by Linux */ + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup1_spi_apps_clk>; + + pinctrl-names = "fpc1020_spi_active", + "fpc1020_reset_reset", + "fpc1020_reset_active", + "fpc1020_irq_active"; + + pinctrl-0 = <&fpc_spi_active>; + pinctrl-1 = <&fpc_reset_reset>; + pinctrl-2 = <&fpc_reset_active>; + pinctrl-3 = <&fpc_irq_active>; + }; + + goodix_fp { + compatible = "goodix,fingerprint"; + interrupt-parent = <&tlmm>; + interrupts = <48 0x1>; + fp-gpio-irq = <&tlmm 48 0x00>; + fp-gpio-reset = <&tlmm 140 0x00>; + fp-gpio-power = <&tlmm 134 0x00>; + spi-max-frequency = <19200000>; + }; + gpio-leds { + compatible = "gpio-leds"; + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&gpio_led_off>; + + infred { + gpios = <&tlmm 20 0>; + label = "infrared"; + linux,default-trigger = "infra-red"; + default-state = "off"; + retain-state-suspended; + }; + + }; + + iovdd_gpio_vreg: iovdd_gpio_vreg { + compatible = "regulator-fixed"; + regulator-name="iovdd_gpio_vreg"; + gpio = <&tlmm 97 0>; /* iovdd - ldo6 */ + startup-delay-us = <300>; + enable-active-high; + regulator-boot-on; + status = "ok"; + }; + +}; +&i2c_2 { /* i2c 2 */ + aw2013@45 { /*blink */ + compatible = "awinc,aw2013"; + reg = <0x45>; + rgb_led-supply = <&pm8953_l10>; + + red { + label = "red"; + linux,default-trigger = "battery-red"; + default-state = "off"; + retain-state-suspended; + }; + + green { + label = "green"; + linux,default-trigger = "battery-green"; + default-state = "off"; + retain-state-suspended; + }; + + blue { + label = "blue"; + linux,default-trigger = "battery-blue"; + default-state = "off"; + retain-state-suspended; + }; + white { + label = "white"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + yellow { + label = "yellow"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + cyan { + label = "cyan"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + purple { + label = "purple"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + }; + }; +&wled { + qcom,cons-sync-write-delay-us = <1000>; +}; + +/ { + qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-Scud-4v4-3300mah.dtsi" + #include "batterydata-Sunwoda-4v4-3300mah.dtsi" + #include "batterydata-D1_Default-4v4-3300mah.dtsi" + }; +}; + +&pm8953_typec { + ss-mux-supply = <&pm8953_l6>; + qcom,ssmux-gpio = <&tlmm 139 GPIO_ACTIVE_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&typec_ssmux_config>; +}; + +&pmi8940_charger { + qcom,battery-data = <&qrd_batterydata>; + qcom,float-voltage-mv = <4400>; + qcom,chg-inhibit-fg; + qcom,thermal-mitigation = <2000 1800 1500 1200 1000 0>; + status = "okay"; + qcom,vchg_sns-vadc = <&pmi8940_vadc>; + qcom,vchg-adc-channel-id = <3>; + qcom,customize-cool-low-limit = <0>; + qcom,customize-cool-high-limit = <50>; + qcom,fastchg-current-customize-cool = <300>; + qcom,fastchg-current-bat-cool = <900>; + qcom,fastchg-current-ma = <2000>; + qcom,override-usb-current; +}; + +&pmi8940_fg { + qcom,battery-data = <&qrd_batterydata>; + qcom,cold-bat-decidegc = <(0)>; + qcom,cool-bat-decidegc = <(150)>; + qcom,hot-bat-decidegc = <550>; + qcom,warm-bat-decidegc = <450>; + qcom,warm-bat-india-decidegc = <500>; + qcom,fg-iterm-ma = <230>; + qcom,fg-chg-iterm-ma = <200>; + qcom,resume-soc = <99>; + qcom,resume-soc-raw = <253>; + qcom,vbat-estimate-diff-mv = <100>; + qcom,fg-cutoff-voltage-mv = <3400>; + qcom,fg-cc-cv-threshold-mv = <4390>; + qcom,cl-max-increment-deciperc = <1>; + qcom,cl-max-decrement-deciperc = <1>; + qcom,fg-delta-soc = <2>; + qcom,bad-battery-detection-enable; + qcom,hold-soc-while-full; + qcom,thermal-coefficients = [DA 86 F0 50 08 3C]; +}; + +&usb3 { + qcom,usbin-vadc = <&pmi8940_vadc>; + qcom,detect-dpdm-floating; +}; + +&blsp1_uart0 { + status = "ok"; + pinctrl-names = "default"; + pinctrl-0 = <&uart_console_active>; +}; + +&sdhc_1 { + /* device core power supply */ + vdd-supply = <&pm8953_l8>; + qcom,vdd-voltage-level = <2900000 2900000>; + qcom,vdd-current-level = <200 570000>; + qcom,vdd-always-on; + + /* device communication power supply */ + vdd-io-supply = <&pm8953_l5>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <1800000 1800000>; + qcom,vdd-io-current-level = <200 325000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on &sdc1_rclk_on>; + pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off &sdc1_rclk_off>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 192000000 + 384000000>; + qcom,nonremovable; + qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v"; + + status = "ok"; +}; + +&sdhc_2 { + /* device core power supply */ + vdd-supply = <&pm8953_l11>; + qcom,vdd-voltage-level = <2950000 2950000>; + qcom,vdd-current-level = <15000 800000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8953_l12>; + qcom,vdd-io-voltage-level = <1800000 2950000>; + qcom,vdd-io-current-level = <200 22000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>; + pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>; + + #address-cells = <0>; + interrupt-parent = <&sdhc_2>; + interrupts = <0 1 2>; + #interrupt-cells = <1>; + interrupt-map-mask = <0xffffffff>; + interrupt-map = <0 &intc 0 125 0 + 1 &intc 0 221 0 + 2 &tlmm 133 0>; + interrupt-names = "hc_irq", "pwr_irq", "status_irq"; + cd-gpios = <&tlmm 133 0x0>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 + 200000000>; + qcom,bus-speed-mode = "SDR12", "SDR25", "SDR50", "DDR50", "SDR104"; + + status = "ok"; +}; + +&i2c_5 { /* BLSP2 QUP1 (NFC) */ + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <&tlmm 17 0x00>; + qcom,nq-ven = <&tlmm 16 0x00>; + qcom,nq-firm = <&tlmm 62 0x00>; + qcom,nq-clkreq = <&pm8953_gpios 2 0x00>; + interrupt-parent = <&tlmm>; + qcom,clk-src = "BBCLK2"; + interrupts = <17 0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <&nfc_int_active &nfc_disable_active>; + pinctrl-1 = <&nfc_int_suspend &nfc_disable_suspend>; + clocks = <&clock_gcc clk_bb_clk2_pin>; + clock-names = "ref_clk"; + }; +}; + +&i2c_3 { + status = "ok"; + focaltech@38{ + compatible = "focaltech,fts"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8953_l10>; + vcc_i2c-suppy = <&pm8953_l5>; + panel_iovdd-supply = <&iovdd_gpio_vreg>; + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + focaltech,name = "fts_ts"; + focaltech,family-id = <0x54>; + focaltech,reset-gpio = <&tlmm 64 0x00>; + focaltech,irq-gpio = <&tlmm 65 0x2008>; + focaltech,display-coords = <0 0 720 1440>; + focaltech,panel-coords = <0 0 720 1440>; + /*ftech,button-map= <139 102 158>;*/ + focaltech,virtual-key1 = <139 560 2000>;/*menu*/ + focaltech,virtual-key2 = <102 360 2000>;/*home*/ + focaltech,virtual-key3 = <158 160 2000>;/*back*/ + focaltech,no-force-update; + focaltech,i2c-pull-up; + focaltech,group-id = <1>; + focaltech,hard-reset-delay-ms = <20>; + focaltech,soft-reset-delay-ms = <200>; + focaltech,num-max-touches = <10>; + focaltech,fw-delay-aa-ms = <30>; + focaltech,fw-delay-55-ms = <30>; + focaltech,fw-upgrade-id1 = <0x79>; + focaltech,fw-upgrade-id2 = <0x18>; + focaltech,fw-delay-readid-ms = <10>; + focaltech,fw-delay-era-flsh-ms = <2000>; + focaltech,fw-auto-cal; + focaltech,ignore-id-check; + }; + focaltech@39{ + compatible = "focaltech,ft8006m"; + reg = <0x39>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8953_l10>; + vcc_i2c-suppy = <&pm8953_l5>; + panel_iovdd-supply = <&iovdd_gpio_vreg>; + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + focaltech,name = "fts_ts"; + focaltech,family-id = <0x54>; + focaltech,reset-gpio = <&tlmm 64 0x00>; + focaltech,irq-gpio = <&tlmm 65 0x2008>; + focaltech,display-coords = <0 0 720 1440>; + focaltech,panel-coords = <0 0 720 1440>; + focaltech,virtual-key1 = <139 560 2000>;/*menu*/ + focaltech,virtual-key2 = <102 360 2000>;/*home*/ + focaltech,virtual-key3 = <158 160 2000>;/*back*/ + focaltech,no-force-update; + focaltech,i2c-pull-up; + focaltech,group-id = <1>; + focaltech,hard-reset-delay-ms = <20>; + focaltech,soft-reset-delay-ms = <200>; + focaltech,num-max-touches = <10>; + focaltech,fw-delay-aa-ms = <30>; + focaltech,fw-delay-55-ms = <30>; + focaltech,fw-upgrade-id1 = <0x79>; + focaltech,fw-upgrade-id2 = <0x18>; + focaltech,fw-delay-readid-ms = <10>; + focaltech,fw-delay-era-flsh-ms = <2000>; + focaltech,fw-auto-cal; + focaltech,ignore-id-check; + }; + +}; + +&pm8953_gpios { + /* GPIO 2 (NFC_CLK_REQ) */ + gpio@c100 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; + +&i2c_3 { + status = "ok"; +}; + +&led_flash0{ + qcom,flash-source = <&pmi8950_flash0>; + qcom,torch-source = <&pmi8950_torch0>; +}; + +&pm8953_vadc { + /delete-node/ chan@11; +}; + +&sdc2_cmd_on { + config { + drive-strength=<12>; + }; +}; + +&sdc2_data_on { + config { + drive-strength=<12>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi index 30c6d6791677d..45c1e18536d1c 100644 --- a/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi @@ -172,6 +172,7 @@ regulator-max-microvolt = <1800000>; qcom,init-voltage = <1800000>; status = "okay"; + regulator-always-on; }; }; @@ -287,9 +288,9 @@ rpm-regulator-ldoa22 { status = "okay"; pm8953_l22: regulator-l22 { - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - qcom,init-voltage = <2800000>; + regulator-min-microvolt = <2900000>; + regulator-max-microvolt = <2900000>; + qcom,init-voltage = <2900000>; status = "okay"; }; }; diff --git a/arch/arm/boot/dts/qcom/msm8953.dtsi b/arch/arm/boot/dts/qcom/msm8953.dtsi index 58ffa3f01c289..4004ff4bd41a5 100644 --- a/arch/arm/boot/dts/qcom/msm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953.dtsi @@ -84,8 +84,8 @@ }; dfps_data_mem: dfps_data_mem@90000000 { - reg = <0 0x90000000 0 0x1000>; - label = "dfps_data_mem"; + reg = <0 0x90000000 0 0x1000>; + label = "dfps_data_mem"; }; cont_splash_mem: splash_region@0x90001000 { @@ -750,7 +750,7 @@ dmas = <&dma_blsp1 8 64 0x20000020 0x20>, <&dma_blsp1 9 32 0x20000020 0x20>; dma-names = "tx", "rx"; - status = "disabled"; + status = "okay"; }; i2c_5: i2c@7af5000 { /* BLSP2 QUP1 */ @@ -2298,7 +2298,7 @@ #include "msm-pm8953.dtsi" #include "msm8953-regulator.dtsi" #include "msm-audio.dtsi" -#include "msm8953-audio.dtsi" +#include "msm8953-audio_rosy.dtsi" #include "msm-gdsc-8916.dtsi" #include "msm8953-camera.dtsi" #include "msm8953-mdss.dtsi" diff --git a/arch/arm/boot/dts/qcom/msm8953_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953_rosy.dtsi new file mode 100644 index 0000000000000..cdc676c4a0666 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953_rosy.dtsi @@ -0,0 +1,2591 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "skeleton64.dtsi" +#include +#include +#include + +/ { + model = "Qualcomm Technologies, Inc. MSM 8953"; + compatible = "qcom,msm8953"; + qcom,msm-id = <293 0x0>; + interrupt-parent = <&intc>; + + chosen { + bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1"; + }; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + other_ext_mem: other_ext_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x84A00000 0x0 0x1E00000>; + }; + + modem_mem: modem_region@0 { + compatible = "removed-dma-pool"; + no-map-fixup; + reg = <0x0 0x86c00000 0x0 0x6a00000>; + }; + + adsp_fw_mem: adsp_fw_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x8d600000 0x0 0x1100000>; + }; + + wcnss_fw_mem: wcnss_fw_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x8e700000 0x0 0x700000>; + }; + + venus_mem: venus_region@0 { + compatible = "shared-dma-pool"; + reusable; + alloc-ranges = <0x0 0x80000000 0x0 0x10000000>; + alignment = <0 0x400000>; + size = <0 0x0800000>; + }; + + secure_mem: secure_region@0 { + compatible = "shared-dma-pool"; + reusable; + alignment = <0 0x400000>; + size = <0 0x09800000>; + }; + + qseecom_mem: qseecom_region@0 { + compatible = "shared-dma-pool"; + reusable; + alignment = <0 0x400000>; + size = <0 0x1000000>; + }; + + adsp_mem: adsp_region@0 { + compatible = "shared-dma-pool"; + reusable; + size = <0 0x400000>; + }; + + dfps_data_mem: dfps_data_mem@90000000 { + reg = <0 0x90000000 0 0x1000>; + label = "dfps_data_mem"; + }; + + cont_splash_mem: splash_region@0x90001000 { + reg = <0x0 0x90001000 0x0 0x13ff000>; + label = "cont_splash_mem"; + }; + + gpu_mem: gpu_region@0 { + compatible = "shared-dma-pool"; + reusable; + alloc-ranges = <0x0 0x80000000 0x0 0x10000000>; + alignment = <0 0x400000>; + size = <0 0x800000>; + }; + }; + + aliases { + /* smdtty devices */ + smd1 = &smdtty_apps_fm; + smd2 = &smdtty_apps_riva_bt_acl; + smd3 = &smdtty_apps_riva_bt_cmd; + smd4 = &smdtty_mbalbridge; + smd5 = &smdtty_apps_riva_ant_cmd; + smd6 = &smdtty_apps_riva_ant_data; + smd7 = &smdtty_data1; + smd8 = &smdtty_data4; + smd11 = &smdtty_data11; + smd21 = &smdtty_data21; + smd36 = &smdtty_loopback; + sdhc1 = &sdhc_1; /* SDC1 eMMC slot */ + sdhc2 = &sdhc_2; /* SDC2 for SD card */ + i2c2 = &i2c_2; + i2c3 = &i2c_3; + i2c5 = &i2c_5; + spi3 = &spi_3; + spi6 = &spi_6; + i2c8 = &i2c_8; + }; + + soc: soc { }; + +}; + +#include "msm8953-pinctrl.dtsi" +#include "msm8953-cpu.dtsi" +#include "msm8953-gpu.dtsi" +#include "msm8953-ion.dtsi" +#include "msm8953-smp2p.dtsi" +#include "msm-arm-smmu-8953.dtsi" +#include "msm8953-coresight.dtsi" +#include "msm8953-bus.dtsi" +#include "msm8953-iommu-domains.dtsi" +#include "msm8953-vidc.dtsi" +#include "msm8953-pm.dtsi" + +&soc { + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0 0 0xffffffff>; + compatible = "simple-bus"; + + apc_apm: apm@b111000 { + compatible = "qcom,msm8953-apm"; + reg = <0xb111000 0x1000>; + reg-names = "pm-apcc-glb"; + qcom,apm-post-halt-delay = <0x2>; + qcom,apm-halt-clk-delay = <0x11>; + qcom,apm-resume-clk-delay = <0x10>; + qcom,apm-sel-switch-delay = <0x01>; + }; + + intc: interrupt-controller@b000000 { + compatible = "qcom,msm-qgic2"; + interrupt-controller; + #interrupt-cells = <3>; + reg = <0x0b000000 0x1000>, + <0x0b002000 0x1000>; + }; + + arm64-cpu-erp { + compatible = "arm,arm64-cpu-erp"; + interrupts = <0 275 0>, + <0 276 0>, + <0 273 0>, + <0 274 0>; + interrupt-names = "pri-dbe-irq", + "sec-dbe-irq", + "pri-ext-irq", + "sec-ext-irq"; + poll-delay-ms = <5000>; + }; + + qcom,msm-gladiator@b1c0000 { + compatible = "qcom,msm-gladiator"; + reg = <0x0b1c0000 0x4000>; + reg-names = "gladiator_base"; + interrupts = <0 22 0>; + }; + + timer { + compatible = "arm,armv8-timer"; + interrupts = <1 2 0xff08>, + <1 3 0xff08>, + <1 4 0xff08>, + <1 1 0xff08>; + clock-frequency = <19200000>; + }; + + timer@b120000 { + #address-cells = <1>; + #size-cells = <1>; + ranges; + compatible = "arm,armv7-timer-mem"; + reg = <0xb120000 0x1000>; + clock-frequency = <19200000>; + + frame@b121000 { + frame-number = <0>; + interrupts = <0 8 0x4>, + <0 7 0x4>; + reg = <0xb121000 0x1000>, + <0xb122000 0x1000>; + }; + + frame@b123000 { + frame-number = <1>; + interrupts = <0 9 0x4>; + reg = <0xb123000 0x1000>; + status = "disabled"; + }; + + frame@b124000 { + frame-number = <2>; + interrupts = <0 10 0x4>; + reg = <0xb124000 0x1000>; + status = "disabled"; + }; + + frame@b125000 { + frame-number = <3>; + interrupts = <0 11 0x4>; + reg = <0xb125000 0x1000>; + status = "disabled"; + }; + + frame@b126000 { + frame-number = <4>; + interrupts = <0 12 0x4>; + reg = <0xb126000 0x1000>; + status = "disabled"; + }; + + frame@b127000 { + frame-number = <5>; + interrupts = <0 13 0x4>; + reg = <0xb127000 0x1000>; + status = "disabled"; + }; + + frame@b128000 { + frame-number = <6>; + interrupts = <0 14 0x4>; + reg = <0xb128000 0x1000>; + status = "disabled"; + }; + }; + qcom,rmtfs_sharedmem@00000000 { + compatible = "qcom,sharedmem-uio"; + reg = <0x00000000 0x00180000>; + reg-names = "rmtfs"; + qcom,client-id = <0x00000001>; + }; + + restart@4ab000 { + compatible = "qcom,pshold"; + reg = <0x4ab000 0x4>, + <0x193d100 0x4>; + reg-names = "pshold-base", "tcsr-boot-misc-detect"; + }; + + qcom,mpm2-sleep-counter@4a3000 { + compatible = "qcom,mpm2-sleep-counter"; + reg = <0x4a3000 0x1000>; + clock-frequency = <32768>; + }; + + cpu-pmu { + compatible = "arm,armv8-pmuv3"; + interrupts = <1 7 0xff00>; + }; + + qcom,sps { + compatible = "qcom,msm_sps_4k"; + qcom,pipe-attr-ee; + }; + + tsens: tsens@4a8000 { + compatible = "qcom,msm8953-tsens"; + reg = <0x4a8000 0x2000>, + <0xa4000 0x1000>; + reg-names = "tsens_physical", "tsens_eeprom_physical"; + interrupts = <0 184 0>, <0 314 0>; + interrupt-names = "tsens-upper-lower", "tsens-critical"; + qcom,client-id = <1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>; + qcom,sensor-id = <1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>; + qcom,sensors = <15>; + qcom,slope = <3200 3200 3200 3200 3200 3200 3200 3200 + 3200 3200 3200 3200 3200 3200 3200>; + qcom,valid-status-check; + }; + + qcom,sensor-information { + compatible = "qcom,sensor-information"; + sensor_information0: qcom,sensor-information-0 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor0"; + qcom,scaling-factor = <10>; + }; + + sensor_information1: qcom,sensor-information-1 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor1"; + qcom,scaling-factor = <10>; + }; + + sensor_information2: qcom,sensor-information-2 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor2"; + qcom,alias-name = "pop_mem"; + qcom,scaling-factor = <10>; + }; + + sensor_information3: qcom,sensor-information-3 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor3"; + qcom,scaling-factor = <10>; + }; + + sensor_information4: qcom,sensor-information-4 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor4"; + qcom,scaling-factor = <10>; + }; + + sensor_information5: qcom,sensor-information-5 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor5"; + qcom,scaling-factor = <10>; + }; + + sensor_information6: qcom,sensor-information-6 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor6"; + qcom,scaling-factor = <10>; + }; + + sensor_information7: qcom,sensor-information-7 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor7"; + qcom,scaling-factor = <10>; + }; + + sensor_information8: qcom,sensor-information-8 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor8"; + qcom,scaling-factor = <10>; + qcom,alias-name = "L2_cache_1"; + }; + + sensor_information9: qcom,sensor-information-9 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor9"; + qcom,scaling-factor = <10>; + }; + + sensor_information10: qcom,sensor-information-10 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor10"; + qcom,scaling-factor = <10>; + }; + + sensor_information11: qcom,sensor-information-11 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor11"; + qcom,scaling-factor = <10>; + }; + + sensor_information12: qcom,sensor-information-12 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor12"; + qcom,scaling-factor = <10>; + }; + + sensor_information13: qcom,sensor-information-13 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor13"; + qcom,scaling-factor = <10>; + qcom,alias-name = "L2_cache_0"; + }; + + sensor_information14: qcom,sensor-information-14 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor14"; + qcom,scaling-factor = <10>; + }; + + sensor_information15: qcom,sensor-information-15 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor15"; + qcom,alias-name = "gpu"; + qcom,scaling-factor = <10>; + }; + + sensor_information16: qcom,sensor-information-16 { + qcom,sensor-type = "alarm"; + qcom,sensor-name = "pm8953_tz"; + qcom,scaling-factor = <1000>; + }; + + sensor_information17: qcom,sensor-information-17 { + qcom,sensor-type = "adc"; + qcom,sensor-name = "pa_therm0"; + }; + + sensor_information18: qcom,sensor-information-18 { + qcom,sensor-type = "adc"; + qcom,sensor-name = "pa_therm1"; + }; + + sensor_information19: qcom,sensor-information-19 { + qcom,sensor-type = "adc"; + qcom,sensor-name = "xo_therm"; + }; + + sensor_information20: qcom,sensor-information-20 { + qcom,sensor-type = "adc"; + qcom,sensor-name = "xo_therm_buf"; + }; + + sensor_information21: qcom,sensor-information-21 { + qcom,sensor-type = "adc"; + qcom,sensor-name = "case_therm"; + }; + }; + + mitigation_profile0: qcom,limit_info-0 { + qcom,temperature-sensor = <&sensor_information9>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile1: qcom,limit_info-1 { + qcom,temperature-sensor = <&sensor_information10>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile2: qcom,limit_info-2 { + qcom,temperature-sensor = <&sensor_information11>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile3: qcom,limit_info-3 { + qcom,temperature-sensor = <&sensor_information12>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile4: qcom,limit_info-4 { + qcom,temperature-sensor = <&sensor_information4>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile5: qcom,limit_info-5 { + qcom,temperature-sensor = <&sensor_information5>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile6: qcom,limit_info-6 { + qcom,temperature-sensor = <&sensor_information6>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile7: qcom,limit_info-7 { + qcom,temperature-sensor = <&sensor_information7>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + qcom,msm-thermal { + compatible = "qcom,msm-thermal"; + qcom,sensor-id = <9>; + qcom,poll-ms = <250>; + qcom,limit-temp = <60>; + qcom,temp-hysteresis = <10>; + qcom,freq-step = <2>; + qcom,core-limit-temp = <80>; + qcom,core-temp-hysteresis = <10>; + qcom,hotplug-temp = <105>; + qcom,hotplug-temp-hysteresis = <15>; + qcom,freq-mitigation-temp = <105>; + qcom,freq-mitigation-temp-hysteresis = <15>; + qcom,freq-mitigation-value = <1036800>; + qcom,therm-reset-temp = <115>; + qcom,online-hotplug-core; + qcom,synchronous-cluster-id = <0 1>; + qcom,synchronous-cluster-map = <0 4 &CPU0 &CPU1 &CPU2 &CPU3>, + <1 4 &CPU4 &CPU5 &CPU6 &CPU7>; + qcom,disable-cx-phase-ctrl; + qcom,disable-gfx-phase-ctrl; + qcom,disable-vdd-mx; + qcom,disable-psm; + qcom,disable-ocr; + qcom,vdd-restriction-temp = <5>; + qcom,vdd-restriction-temp-hysteresis = <10>; + vdd-dig-supply = <&pm8953_s2_floor_level>; + vdd-gfx-supply = <&gfx_vreg_corner>; + + qcom,vdd-dig-rstr { + qcom,vdd-rstr-reg = "vdd-dig"; + qcom,levels = ; + qcom,min-level = ; + }; + + qcom,vdd-gfx-rstr { + qcom,vdd-rstr-reg = "vdd-gfx"; + qcom,levels = <5 7 7>; /* Nominal, Turbo, Turbo */ + qcom,min-level = <1>; /* No Request */ + }; + + msm_thermal_freq: qcom,vdd-apps-rstr { + qcom,vdd-rstr-reg = "vdd-apps"; + qcom,levels = <1689600>; + qcom,freq-req; + }; + }; + + qcom,bcl { + compatible = "qcom,bcl"; + qcom,bcl-enable; + qcom,bcl-framework-interface; + qcom,bcl-freq-control-list = <&CPU0 &CPU1 &CPU2 &CPU3 + &CPU4 &CPU5 &CPU6 &CPU7>; + qcom,bcl-hotplug-list = <&CPU6 &CPU7>; + qcom,bcl-soc-hotplug-list = <&CPU4 &CPU5 &CPU6 &CPU7>; + qcom,ibat-monitor { + qcom,low-threshold-uamp = <3400000>; + qcom,high-threshold-uamp = <4200000>; + qcom,mitigation-freq-khz = <1689600>; + qcom,vph-high-threshold-uv = <3500000>; + qcom,vph-low-threshold-uv = <3200000>; + qcom,soc-low-threshold = <10>; + qcom,thermal-handle = <&msm_thermal_freq>; + }; + }; + + qcom,msm-core@a0000 { + compatible = "qcom,apss-core-ea"; + reg = <0xa0000 0x1000>; + qcom,low-hyst-temp = <10>; + qcom,high-hyst-temp = <5>; + + ea0: ea0 { + sensor = <&sensor_information9>; + }; + + ea1: ea1 { + sensor = <&sensor_information10>; + }; + + ea2: ea2 { + sensor = <&sensor_information11>; + }; + + ea3: ea3 { + sensor = <&sensor_information12>; + }; + + ea4: ea4 { + sensor = <&sensor_information4>; + }; + + ea5: ea5 { + sensor = <&sensor_information5>; + }; + + ea6: ea6 { + sensor = <&sensor_information6>; + }; + + ea7: ea7 { + sensor = <&sensor_information7>; + }; + }; + + blsp1_uart0: serial@78af000 { + compatible = "qcom,msm-lsuart-v14"; + reg = <0x78af000 0x200>; + interrupts = <0 107 0>; + status = "disabled"; + clocks = <&clock_gcc clk_gcc_blsp1_uart1_apps_clk>, + <&clock_gcc clk_gcc_blsp1_ahb_clk>; + clock-names = "core_clk", "iface_clk"; + }; + + blsp1_uart1: uart@78b0000 { + compatible = "qcom,msm-hsuart-v14"; + reg = <0x78b0000 0x200>, + <0x7884000 0x1f000>; + reg-names = "core_mem", "bam_mem"; + + interrupt-names = "core_irq", "bam_irq", "wakeup_irq"; + #address-cells = <0>; + interrupt-parent = <&blsp1_uart1>; + interrupts = <0 1 2>; + #interrupt-cells = <1>; + interrupt-map-mask = <0xffffffff>; + interrupt-map = <0 &intc 0 108 0 + 1 &intc 0 238 0 + 2 &tlmm 13 0>; + + qcom,inject-rx-on-wakeup; + qcom,rx-char-to-inject = <0xFD>; + qcom,master-id = <86>; + clock-names = "core_clk", "iface_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_uart2_apps_clk>, + <&clock_gcc clk_gcc_blsp1_ahb_clk>; + pinctrl-names = "sleep", "default"; + pinctrl-0 = <&hsuart_sleep>; + pinctrl-1 = <&hsuart_active>; + qcom,bam-tx-ep-pipe-index = <2>; + qcom,bam-rx-ep-pipe-index = <3>; + qcom,msm-bus,name = "blsp1_uart1"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <86 512 0 0>, + <86 512 500 800>; + status = "disabled"; + }; + + dma_blsp1: qcom,sps-dma@7884000 { /* BLSP1 */ + #dma-cells = <4>; + compatible = "qcom,sps-dma"; + reg = <0x7884000 0x1f000>; + interrupts = <0 238 0>; + qcom,summing-threshold = <10>; + }; + + dma_blsp2: qcom,sps-dma@7ac4000 { /* BLSP2 */ + #dma-cells = <4>; + compatible = "qcom,sps-dma"; + reg = <0x7ac4000 0x1f000>; + interrupts = <0 239 0>; + qcom,summing-threshold = <10>; + }; + + spi_3: spi@78b7000 { /* BLSP1 QUP3 */ + compatible = "qcom,spi-qup-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "spi_physical", "spi_bam_physical"; + reg = <0x78b7000 0x600>, + <0x7884000 0x1f000>; + interrupt-names = "spi_irq", "spi_bam_irq"; + interrupts = <0 97 0>, <0 238 0>; + spi-max-frequency = <19200000>; + pinctrl-names = "spi_default", "spi_sleep"; + pinctrl-0 = <&spi3_default &spi3_cs0_active>; + pinctrl-1 = <&spi3_sleep &spi3_cs0_sleep>; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup3_spi_apps_clk>; + clock-names = "iface_clk", "core_clk"; + qcom,infinite-mode = <0>; + qcom,use-bam; + qcom,use-pinctrl; + qcom,ver-reg-exists; + qcom,bam-consumer-pipe-index = <8>; + qcom,bam-producer-pipe-index = <9>; + qcom,master-id = <86>; + }; + + spi_6: spi@7af6000 { + compatible = "qcom,spi-qup-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "spi_physical", "spi_bam_physical"; + reg = <0x7af6000 0x600>, + <0x7ac4000 0x1f000>; + interrupt-names = "spi_irq", "spi_bam_irq"; + interrupts = <0 300 0>, <0 239 0>; + spi-max-frequency = <50000000>; + pinctrl-names = "spi_default", "spi_sleep"; + pinctrl-0 = <&spi6_default &spi6_cs0_active>; + pinctrl-1 = <&spi6_sleep &spi6_cs0_sleep>; + clocks = <&clock_gcc clk_gcc_blsp2_ahb_clk>, + <&clock_gcc clk_gcc_blsp2_qup2_spi_apps_clk>; + clock-names = "iface_clk", "core_clk"; + qcom,infinite-mode = <0>; + qcom,use-bam; + qcom,rt-priority; + qcom,use-pinctrl; + qcom,ver-reg-exists; + qcom,bam-consumer-pipe-index = <6>; + qcom,bam-producer-pipe-index = <7>; + qcom,master-id = <84>; + status = "ok"; + spi_ir@1 { + compatible = "qcom,spi-msm-codec-slave"; + reg = <1>; + spi-max-frequency = <50000000>; + spi-cpol; + status = "ok"; + }; + }; + + i2c_2: i2c@78b6000 { /* BLSP1 QUP2 */ + compatible = "qcom,i2c-msm-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "qup_phys_addr"; + reg = <0x78b6000 0x600>; + interrupt-names = "qup_irq"; + interrupts = <0 96 0>; + qcom,clk-freq-out = <400000>; + qcom,clk-freq-in = <19200000>; + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup2_i2c_apps_clk>; + + pinctrl-names = "i2c_active", "i2c_sleep"; + pinctrl-0 = <&i2c_2_active>; + pinctrl-1 = <&i2c_2_sleep>; + qcom,noise-rjct-scl = <0>; + qcom,noise-rjct-sda = <0>; + qcom,master-id = <86>; + dmas = <&dma_blsp1 6 64 0x20000020 0x20>, + <&dma_blsp1 7 32 0x20000020 0x20>; + dma-names = "tx", "rx"; + + /* DSI_TO_HDMI I2C configuration */ + adv7533@39 { + compatible = "adv7533"; + reg = <0x39>; + instance_id = <0>; + adi,video-mode = <3>; /* 3 = 1080p */ + adi,main-addr = <0x39>; + adi,cec-dsi-addr = <0x3C>; + adi,enable-audio; + pinctrl-names = "pmx_adv7533_active", + "pmx_adv7533_suspend"; + pinctrl-0 = <&adv7533_int_active>; + pinctrl-1 = <&adv7533_int_suspend>; + adi,irq-gpio = <&tlmm 90 0x2002>; + hpd-5v-en-supply = <&adv_vreg>; + qcom,supply-names = "hpd-5v-en"; + qcom,min-voltage-level = <0>; + qcom,max-voltage-level = <0>; + qcom,enable-load = <0>; + qcom,disable-load = <0>; + }; + }; + + i2c_3: i2c@78b7000 { /* BLSP1 QUP3 */ + compatible = "qcom,i2c-msm-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "qup_phys_addr"; + reg = <0x78b7000 0x600>; + interrupt-names = "qup_irq"; + interrupts = <0 97 0>; + qcom,clk-freq-out = <400000>; + qcom,clk-freq-in = <19200000>; + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup3_i2c_apps_clk>; + + pinctrl-names = "i2c_active", "i2c_sleep"; + pinctrl-0 = <&i2c_3_active>; + pinctrl-1 = <&i2c_3_sleep>; + qcom,noise-rjct-scl = <0>; + qcom,noise-rjct-sda = <0>; + qcom,master-id = <86>; + dmas = <&dma_blsp1 8 64 0x20000020 0x20>, + <&dma_blsp1 9 32 0x20000020 0x20>; + dma-names = "tx", "rx"; + status = "okay"; + }; + + i2c_5: i2c@7af5000 { /* BLSP2 QUP1 */ + compatible = "qcom,i2c-msm-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "qup_phys_addr"; + reg = <0x7af5000 0x600>; + interrupt-names = "qup_irq"; + interrupts = <0 299 0>; + qcom,clk-freq-out = <400000>; + qcom,clk-freq-in = <19200000>; + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp2_ahb_clk>, + <&clock_gcc clk_gcc_blsp2_qup1_i2c_apps_clk>; + + pinctrl-names = "i2c_active", "i2c_sleep"; + pinctrl-0 = <&i2c_5_active>; + pinctrl-1 = <&i2c_5_sleep>; + qcom,noise-rjct-scl = <0>; + qcom,noise-rjct-sda = <0>; + qcom,master-id = <84>; + dmas = <&dma_blsp2 4 64 0x20000020 0x20>, + <&dma_blsp2 5 32 0x20000020 0x20>; + dma-names = "tx", "rx"; + }; + + i2c_8: i2c@7af8000 { /* BLSP2 QUP3 */ + compatible = "qcom,i2c-msm-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "qup_phys_addr"; + reg = <0x7af8000 0x600>; + interrupt-names = "qup_irq"; + interrupts = <0 302 0>; + qcom,clk-freq-out = <400000>; + qcom,clk-freq-in = <19200000>; + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp2_ahb_clk>, + <&clock_gcc clk_gcc_blsp2_qup4_i2c_apps_clk>; + + pinctrl-names = "i2c_active", "i2c_sleep"; + pinctrl-0 = <&i2c_8_active>; + pinctrl-1 = <&i2c_8_sleep>; + qcom,noise-rjct-scl = <0>; + qcom,noise-rjct-sda = <0>; + qcom,master-id = <84>; + dmas = <&dma_blsp2 10 64 0x20000020 0x20>, + <&dma_blsp2 11 32 0x20000020 0x20>; + dma-names = "tx", "rx"; + + aw87319@58{ /*AW87319 PA*/ + compatible = "awinic,aw87319_pa"; + reg = <0x58>; + qcom,ext_pa_spk_aw87319_rst = <&tlmm 96 0>; + }; + }; + + slim_msm: slim@c140000{ + cell-index = <1>; + compatible = "qcom,slim-ngd"; + reg = <0xc140000 0x2c000>, + <0xc104000 0x2a000>; + reg-names = "slimbus_physical", "slimbus_bam_physical"; + interrupts = <0 163 0>, <0 180 0>; + interrupt-names = "slimbus_irq", "slimbus_bam_irq"; + qcom,apps-ch-pipes = <0x600000>; + qcom,ea-pc = <0x200>; + status = "disabled"; + }; + + dcc: dcc@b3000 { + compatible = "qcom,dcc"; + reg = <0xb3000 0x1000>, + <0xb4000 0x800>; + reg-names = "dcc-base", "dcc-ram-base"; + + clocks = <&clock_gcc clk_gcc_dcc_clk>; + clock-names = "dcc_clk"; + + qcom,save-reg; + }; + + clock_gcc: qcom,gcc@1800000 { + compatible = "qcom,gcc-8953"; + reg = <0x1800000 0x80000>; + reg-names = "cc_base"; + vdd_dig-supply = <&pm8953_s2_level>; + #clock-cells = <1>; + }; + + clock_gcc_mdss: qcom,gcc-mdss@1800000 { + compatible = "qcom,gcc-mdss-8953"; + reg = <0x1800000 0x80000>; + reg-names = "cc_base"; + clock-names = "pclk0_src", "pclk1_src", + "byte0_src", "byte1_src"; + clocks = <&mdss_dsi0_pll clk_dsi0pll_pixel_clk_mux>, + <&mdss_dsi1_pll clk_dsi1pll_pixel_clk_mux>, + <&mdss_dsi0_pll clk_dsi0pll_byte_clk_mux>, + <&mdss_dsi1_pll clk_dsi1pll_byte_clk_mux>; + #clock-cells = <1>; + }; + + clock_debug: qcom,cc-debug@1874000 { + compatible = "qcom,cc-debug-8953"; + reg = <0x1874000 0x4>; + reg-names = "cc_base"; + clocks = <&clock_cpu clk_cpu_debug_pri_mux>; + clock-names = "debug_cpu_clk"; + #clock-cells = <1>; + }; + + clock_gcc_gfx: qcom,gcc-gfx@1800000 { + compatible = "qcom,gcc-gfx-8953"; + reg = <0x1800000 0x80000>; + reg-names = "cc_base"; + vdd_gfx-supply = <&gfx_vreg_corner>; + qcom,gfxfreq-corner = + < 0 0 >, + < 133330000 1 >, /* Min SVS */ + < 216000000 2 >, /* Low SVS */ + < 320000000 3 >, /* SVS */ + < 400000000 4 >, /* SVS Plus */ + < 510000000 5 >, /* NOM */ + < 560000000 6 >, /* Nom Plus */ + < 650000000 7 >; /* Turbo */ + #clock-cells = <1>; + }; + + clock_cpu: qcom,cpu-clock-8953@b116000 { + compatible = "qcom,cpu-clock-8953"; + reg = <0xb114000 0x68>, + <0xb014000 0x68>, + <0xb116000 0x400>, + <0xb111050 0x08>, + <0xb011050 0x08>, + <0xb1d1050 0x08>, + <0x00a4124 0x08>; + reg-names = "rcgwr-c0-base", "rcgwr-c1-base", + "c0-pll", "c0-mux", "c1-mux", + "cci-mux", "efuse"; + vdd-mx-supply = <&pm8953_s7_level_ao>; + vdd-cl-supply = <&apc_vreg>; + clocks = <&clock_gcc clk_xo_a_clk_src>; + clock-names = "xo_a"; + qcom,num-clusters = <2>; + qcom,speed0-bin-v0-cl = + < 0 0>, + < 652800000 1>, + < 1036800000 2>, + < 1401600000 3>, + < 1689600000 4>, + < 1804800000 5>, + < 1958400000 6>, + < 2016000000 7>; + qcom,speed0-bin-v0-cci = + < 0 0>, + < 261120000 1>, + < 414720000 2>, + < 560640000 3>, + < 675840000 4>, + < 721920000 5>, + < 783360000 6>, + < 806400000 7>; + qcom,speed2-bin-v0-cl = + < 0 0>, + < 652800000 1>, + < 1036800000 2>, + < 1401600000 3>, + < 1689600000 4>, + < 1804800000 5>, + < 1958400000 6>, + < 2016000000 7>; + qcom,speed2-bin-v0-cci = + < 0 0>, + < 261120000 1>, + < 414720000 2>, + < 560640000 3>, + < 675840000 4>, + < 721920000 5>, + < 783360000 6>, + < 806400000 7>; + qcom,speed7-bin-v0-cl = + < 0 0>, + < 652800000 1>, + < 1036800000 2>, + < 1401600000 3>, + < 1689600000 4>, + < 1804800000 5>, + < 1958400000 6>, + < 2016000000 7>, + < 2150400000 8>, + < 2208000000 9>; + qcom,speed7-bin-v0-cci = + < 0 0>, + < 261120000 1>, + < 414720000 2>, + < 560640000 3>, + < 675840000 4>, + < 721920000 5>, + < 783360000 6>, + < 806400000 7>, + < 860160000 8>, + < 883200000 9>; + qcom,speed6-bin-v0-cl = + < 0 0>, + < 652800000 1>, + < 1036800000 2>, + < 1401600000 3>, + < 1689600000 4>, + < 1804800000 5>; + qcom,speed6-bin-v0-cci = + < 0 0>, + < 261120000 1>, + < 414720000 2>, + < 560640000 3>, + < 675840000 4>, + < 721920000 5>; + #clock-cells = <1>; + }; + + msm_cpufreq: qcom,msm-cpufreq { + compatible = "qcom,msm-cpufreq"; + clock-names = "l2_clk", "cpu0_clk", "cpu1_clk", "cpu2_clk", + "cpu3_clk", "cpu4_clk", "cpu5_clk", + "cpu6_clk", "cpu7_clk"; + clocks = <&clock_cpu clk_cci_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>; + + qcom,cpufreq-table = + < 652800 >, + < 1036800 >, + < 1401600 >, + < 1689600 >, + < 1804800 >, + < 1958400 >, + < 2016000 >, + < 2150400 >, + < 2208000 >; + }; + + cpubw: qcom,cpubw { + compatible = "qcom,devbw"; + governor = "cpufreq"; + qcom,src-dst-ports = <1 512>; + qcom,active-only; + qcom,bw-tbl = + < 769 /* 100.8 MHz */ >, + < 1611 /* 211.2 MHz */ >, /*Low SVS*/ + < 2124 /* 278.4 MHz */ >, + < 2929 /* 384 MHz */ >, + < 3221 /* 422.4 MHz */ >, /* SVS */ + < 4248 /* 556.8 MHz */ >, + < 5126 /* 672 MHz */ >, + < 5859 /* 768 MHz */ >, /* SVS+ */ + < 6152 /* 806.4 MHz */ >, + < 6445 /* 844.8 MHz */ >, /* NOM */ + < 7104 /* 931.2 MHz */ >; /* TURBO */ + }; + + mincpubw: qcom,mincpubw { + compatible = "qcom,devbw"; + governor = "cpufreq"; + qcom,src-dst-ports = <1 512>; + qcom,active-only; + qcom,bw-tbl = + < 769 /* 100.8 MHz */ >, + < 1611 /* 211.2 MHz */ >, /*Low SVS*/ + < 2124 /* 278.4 MHz */ >, + < 2929 /* 384 MHz */ >, + < 3221 /* 422.4 MHz */ >, /* SVS */ + < 4248 /* 556.8 MHz */ >, + < 5126 /* 672 MHz */ >, + < 5859 /* 768 MHz */ >, /* SVS+ */ + < 6152 /* 806.4 MHz */ >, + < 6445 /* 844.8 MHz */ >, /* NOM */ + < 7104 /* 931.2 MHz */ >; /* TURBO */ + }; + + qcom,cpu-bwmon { + compatible = "qcom,bimc-bwmon2"; + reg = <0x408000 0x300>, <0x401000 0x200>; + reg-names = "base", "global_base"; + interrupts = <0 183 4>; + qcom,mport = <0>; + qcom,target-dev = <&cpubw>; + }; + + devfreq-cpufreq { + cpubw-cpufreq { + target-dev = <&cpubw>; + cpu-to-dev-map = + < 652800 1611>, + < 1036800 3221>, + < 1401600 5859>, + < 1689600 6445>, + < 1804800 7104>, + < 1958400 7104>, + < 2208000 7104>; + }; + + mincpubw-cpufreq { + target-dev = <&mincpubw>; + cpu-to-dev-map = + < 652800 1611 >, + < 1401600 3221 >, + < 2208000 5859 >; + }; + }; + + rpm_bus: qcom,rpm-smd { + compatible = "qcom,rpm-smd"; + rpm-channel-name = "rpm_requests"; + rpm-channel-type = <15>; /* SMD_APPS_RPM */ + }; + + qcom,ipc-spinlock@1905000 { + compatible = "qcom,ipc-spinlock-sfpb"; + reg = <0x1905000 0x8000>; + qcom,num-locks = <8>; + }; + + qcom,smem@86300000 { + compatible = "qcom,smem"; + reg = <0x86300000 0x100000>, + <0x0b011008 0x4>, + <0x60000 0x8000>, + <0x193d000 0x8>; + reg-names = "smem", "irq-reg-base", + "aux-mem1", "smem_targ_info_reg"; + qcom,mpu-enabled; + + qcom,smd-modem { + compatible = "qcom,smd"; + qcom,smd-edge = <0>; + qcom,smd-irq-offset = <0x0>; + qcom,smd-irq-bitmask = <0x1000>; + interrupts = <0 25 1>; + label = "modem"; + qcom,not-loadable; + }; + + qcom,smsm-modem { + compatible = "qcom,smsm"; + qcom,smsm-edge = <0>; + qcom,smsm-irq-offset = <0x0>; + qcom,smsm-irq-bitmask = <0x2000>; + interrupts = <0 26 1>; + }; + + qcom,smd-wcnss { + compatible = "qcom,smd"; + qcom,smd-edge = <6>; + qcom,smd-irq-offset = <0x0>; + qcom,smd-irq-bitmask = <0x20000>; + interrupts = <0 142 1>; + label = "wcnss"; + }; + + qcom,smsm-wcnss { + compatible = "qcom,smsm"; + qcom,smsm-edge = <6>; + qcom,smsm-irq-offset = <0x0>; + qcom,smsm-irq-bitmask = <0x80000>; + interrupts = <0 144 1>; + }; + + qcom,smd-adsp { + compatible = "qcom,smd"; + qcom,smd-edge = <1>; + qcom,smd-irq-offset = <0x0>; + qcom,smd-irq-bitmask = <0x100>; + interrupts = <0 289 1>; + label = "adsp"; + }; + + qcom,smsm-adsp { + compatible = "qcom,smsm"; + qcom,smsm-edge = <1>; + qcom,smsm-irq-offset = <0x0>; + qcom,smsm-irq-bitmask = <0x200>; + interrupts = <0 290 1>; + }; + + qcom,smd-rpm { + compatible = "qcom,smd"; + qcom,smd-edge = <15>; + qcom,smd-irq-offset = <0x0>; + qcom,smd-irq-bitmask = <0x1>; + interrupts = <0 168 1>; + label = "rpm"; + qcom,irq-no-suspend; + qcom,not-loadable; + }; + }; + + qcom,wdt@b017000 { + compatible = "qcom,msm-watchdog"; + reg = <0xb017000 0x1000>; + reg-names = "wdt-base"; + interrupts = <0 3 0>, <0 4 0>; + qcom,bark-time = <11000>; + qcom,pet-time = <10000>; + qcom,ipi-ping; + qcom,wakeup-enable; + }; + + qcom,chd { + compatible = "qcom,core-hang-detect"; + qcom,threshold-arr = <0xb1880b0 0xb1980b0 0xb1a80b0 + 0xb1b80b0 0xb0880b0 0xb0980b0 0xb0a80b0 0xb0b80b0>; + qcom,config-arr = <0xb1880b8 0xb1980b8 0xb1a80b8 + 0xb1b80b8 0xb0880b8 0xb0980b8 0xb0a80b8 0xb0b80b8>; + }; + + qcom,msm-rtb { + compatible = "qcom,msm-rtb"; + qcom,rtb-size = <0x100000>; + }; + + qcom,msm-imem@8600000 { + compatible = "qcom,msm-imem"; + reg = <0x08600000 0x1000>; + ranges = <0x0 0x08600000 0x1000>; + #address-cells = <1>; + #size-cells = <1>; + + mem_dump_table@10 { + compatible = "qcom,msm-imem-mem_dump_table"; + reg = <0x10 8>; + }; + + dload_type@18 { + compatible = "qcom,msm-imem-dload-type"; + reg = <0x18 4>; + }; + + restart_reason@65c { + compatible = "qcom,msm-imem-restart_reason"; + reg = <0x65c 4>; + }; + + boot_stats@6b0 { + compatible = "qcom,msm-imem-boot_stats"; + reg = <0x6b0 32>; + }; + + pil@94c { + compatible = "qcom,msm-imem-pil"; + reg = <0x94c 200>; + + }; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_1 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x200000>; + qcom,client-id = <0>; + qcom,allocate-boot-time; + label = "modem"; + }; + + qcom,client_2 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x300000>; + qcom,client-id = <2>; + label = "modem"; + }; + + mem_client_3_size: qcom,client_3 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x0>; + qcom,client-id = <1>; + label = "modem"; + }; + }; + + jtag_fuse: jtagfuse@a601c { + compatible = "qcom,jtag-fuse-v2"; + reg = <0xa601c 0x8>; + reg-names = "fuse-base"; + }; + sn_fuse: snfuse@0xa0128 { + compatible = "qcom,sn-fuse"; + reg = <0xa0128 0x4>; + reg-names = "sn-base"; + }; + + + sec_boot_fuse: secbootfuse@0xa41d0 { + compatible = "qcom,sec-boot-fuse"; + reg = <0xa41d0 0x4>; + reg-names = "sec-boot-base"; + }; + + jtag_mm0: jtagmm@619c000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x619c000 0x1000>, + <0x6190000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm1: jtagmm@619d000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x619d000 0x1000>, + <0x6192000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU1>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm2: jtagmm@619e000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x619e000 0x1000>, + <0x6194000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU2>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm3: jtagmm@619f000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x619f000 0x1000>, + <0x6196000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU3>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm4: jtagmm@61bc000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x61bc000 0x1000>, + <0x61b0000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU4>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm5: jtagmm@61bd000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x61bd000 0x1000>, + <0x61b2000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU5>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm6: jtagmm@61be000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x61be000 0x1000>, + <0x61b4000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU6>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm7: jtagmm@61bf000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x61bf000 0x1000>, + <0x61b6000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU7>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + ipa_hw: qcom,ipa@07900000 { + compatible = "qcom,ipa"; + reg = <0x07900000 0x4effc>, <0x07904000 0x26934>; + reg-names = "ipa-base", "bam-base"; + interrupts = <0 228 0>, + <0 230 0>; + interrupt-names = "ipa-irq", "bam-irq"; + qcom,ipa-hw-ver = <6>; /* IPA core version = IPAv2.6L */ + qcom,ipa-hw-mode = <0>; /* IPA hw type = Normal */ + qcom,wan-rx-ring-size = <192>; /* IPA WAN-rx-ring-size*/ + qcom,lan-rx-ring-size = <192>; /* IPA LAN-rx-ring-size*/ + clock-names = "core_clk"; + clocks = <&clock_gcc clk_ipa_clk>; + qcom,ee = <0>; + qcom,use-ipa-tethering-bridge; + qcom,modem-cfg-emb-pipe-flt; + qcom,msm-bus,name = "ipa"; + qcom,msm-bus,num-cases = <3>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <90 512 0 0>, /* No BIMC vote (ab=0 Mbps, ib=0 Mbps ~ 0MHZ) */ + <90 512 100000 800000>, /* SVS (ab=100, ib=800 ~ 50MHz) */ + <90 512 100000 1200000>; /* PERF (ab=100, ib=1200 ~ 75MHz) */ + qcom,bus-vector-names = "MIN", "SVS", "PERF"; + }; + + qcom,rmnet-ipa { + compatible = "qcom,rmnet-ipa"; + qcom,rmnet-ipa-ssr; + qcom,ipa-loaduC; + qcom,ipa-advertise-sg-support; + }; + + qcom,smdtty { + compatible = "qcom,smdtty"; + + smdtty_apps_fm: qcom,smdtty-apps-fm { + qcom,smdtty-remote = "wcnss"; + qcom,smdtty-port-name = "APPS_FM"; + }; + + smdtty_apps_riva_bt_acl: smdtty-apps-riva-bt-acl { + qcom,smdtty-remote = "wcnss"; + qcom,smdtty-port-name = "APPS_RIVA_BT_ACL"; + }; + + smdtty_apps_riva_bt_cmd: qcom,smdtty-apps-riva-bt-cmd { + qcom,smdtty-remote = "wcnss"; + qcom,smdtty-port-name = "APPS_RIVA_BT_CMD"; + }; + + smdtty_mbalbridge: qcom,smdtty-mbalbridge { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "MBALBRIDGE"; + }; + + smdtty_apps_riva_ant_cmd: smdtty-apps-riva-ant-cmd { + qcom,smdtty-remote = "wcnss"; + qcom,smdtty-port-name = "APPS_RIVA_ANT_CMD"; + }; + + smdtty_apps_riva_ant_data: smdtty-apps-riva-ant-data { + qcom,smdtty-remote = "wcnss"; + qcom,smdtty-port-name = "APPS_RIVA_ANT_DATA"; + }; + + smdtty_data1: qcom,smdtty-data1 { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "DATA1"; + }; + + smdtty_data4: qcom,smdtty-data4 { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "DATA4"; + }; + + smdtty_data11: qcom,smdtty-data11 { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "DATA11"; + }; + + smdtty_data21: qcom,smdtty-data21 { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "DATA21"; + }; + + smdtty_loopback: smdtty-loopback { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "LOOPBACK"; + qcom,smdtty-dev-name = "LOOPBACK_TTY"; + }; + }; + + qcom,smdpkt { + compatible = "qcom,smdpkt"; + + qcom,smdpkt-data5-cntl { + qcom,smdpkt-remote = "modem"; + qcom,smdpkt-port-name = "DATA5_CNTL"; + qcom,smdpkt-dev-name = "smdcntl0"; + }; + + qcom,smdpkt-data22 { + qcom,smdpkt-remote = "modem"; + qcom,smdpkt-port-name = "DATA22"; + qcom,smdpkt-dev-name = "smd22"; + }; + + qcom,smdpkt-data40-cntl { + qcom,smdpkt-remote = "modem"; + qcom,smdpkt-port-name = "DATA40_CNTL"; + qcom,smdpkt-dev-name = "smdcntl8"; + }; + + qcom,smdpkt-apr-apps2 { + qcom,smdpkt-remote = "adsp"; + qcom,smdpkt-port-name = "apr_apps2"; + qcom,smdpkt-dev-name = "apr_apps2"; + }; + + qcom,smdpkt-loopback { + qcom,smdpkt-remote = "modem"; + qcom,smdpkt-port-name = "LOOPBACK"; + qcom,smdpkt-dev-name = "smd_pkt_loopback"; + }; + }; + + qcom,iris-fm { + compatible = "qcom,iris_fm"; + }; + + qcom,wcnss-wlan@0a000000 { + compatible = "qcom,wcnss_wlan"; + reg = <0x0a000000 0x280000>, + <0x0b011008 0x04>, + <0x0a21b000 0x3000>, + <0x03204000 0x00000100>, + <0x03200800 0x00000200>, + <0x0a100400 0x00000200>, + <0x0a205050 0x00000200>, + <0x0a219000 0x00000020>, + <0x0a080488 0x00000008>, + <0x0a080fb0 0x00000008>, + <0x0a08040c 0x00000008>, + <0x0a0120a8 0x00000008>, + <0x0a012448 0x00000008>, + <0x0a080c00 0x00000001>; + + reg-names = "wcnss_mmio", "wcnss_fiq", + "pronto_phy_base", "riva_phy_base", + "riva_ccu_base", "pronto_a2xb_base", + "pronto_ccpu_base", "pronto_saw2_base", + "wlan_tx_phy_aborts","wlan_brdg_err_source", + "wlan_tx_status", "alarms_txctl", + "alarms_tactl", "pronto_mcu_base"; + + interrupts = <0 145 0 0 146 0>; + interrupt-names = "wcnss_wlantx_irq", "wcnss_wlanrx_irq"; + + qcom,pronto-vddmx-supply = <&pm8953_s7_level_ao>; + qcom,pronto-vddcx-supply = <&pm8953_s2_level>; + qcom,pronto-vddpx-supply = <&pm8953_l5>; + qcom,iris-vddxo-supply = <&pm8953_l7>; + qcom,iris-vddrfa-supply = <&pm8953_l19>; + qcom,iris-vddpa-supply = <&pm8953_l9>; + qcom,iris-vdddig-supply = <&pm8953_l5>; + + qcom,iris-vddxo-voltage-level = <1800000 0 1800000>; + qcom,iris-vddrfa-voltage-level = <1300000 0 1300000>; + qcom,iris-vddpa-voltage-level = <3300000 0 3300000>; + qcom,iris-vdddig-voltage-level = <1800000 0 1800000>; + + qcom,vddmx-voltage-level = ; + qcom,vddcx-voltage-level = ; + qcom,vddpx-voltage-level = <1800000 0 1800000>; + + qcom,iris-vddxo-current = <10000>; + qcom,iris-vddrfa-current = <100000>; + qcom,iris-vddpa-current = <515000>; + qcom,iris-vdddig-current = <10000>; + + qcom,pronto-vddmx-current = <0>; + qcom,pronto-vddcx-current = <0>; + qcom,pronto-vddpx-current = <0>; + + pinctrl-names = "wcnss_default", "wcnss_sleep", + "wcnss_gpio_default"; + pinctrl-0 = <&wcnss_default>; + pinctrl-1 = <&wcnss_sleep>; + pinctrl-2 = <&wcnss_gpio_default>; + + gpios = <&tlmm 76 0>, <&tlmm 77 0>, <&tlmm 78 0>, + <&tlmm 79 0>, <&tlmm 80 0>; + + clocks = <&clock_gcc clk_xo_wlan_clk>, + <&clock_gcc clk_rf_clk2>, + <&clock_debug clk_gcc_debug_mux>, + <&clock_gcc clk_wcnss_m_clk>; + + clock-names = "xo", "rf_clk", "measure", "wcnss_debug"; + + qcom,has-autodetect-xo; + qcom,is-pronto-v3; + qcom,has-pronto-hw; + qcom,has-vsys-adc-channel; + qcom,has-a2xb-split-reg; + qcom,wcnss-adc_tm = <&pm8953_adc_tm>; + }; + + qcom_rng: qrng@e3000 { + compatible = "qcom,msm-rng"; + reg = <0xe3000 0x1000>; + qcom,msm-rng-iface-clk; + qcom,no-qrng-config; + qcom,msm-bus,name = "msm-rng-noc"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <1 618 0 0>, /* No vote */ + <1 618 0 800>; /* 100 MB/s */ + clocks = <&clock_gcc clk_gcc_prng_ahb_clk>; + clock-names = "iface_clk"; + }; + + qcom_tzlog: tz-log@08600720 { + compatible = "qcom,tz-log"; + reg = <0x08600720 0x2000>; + }; + + qcom_crypto: qcrypto@720000 { + compatible = "qcom,qcrypto"; + reg = <0x720000 0x20000>, + <0x704000 0x20000>; + reg-names = "crypto-base","crypto-bam-base"; + interrupts = <0 207 0>; + qcom,bam-pipe-pair = <2>; + qcom,ce-hw-instance = <0>; + qcom,ce-device = <0>; + qcom,ce-hw-shared; + qcom,clk-mgmt-sus-res; + qcom,msm-bus,name = "qcrypto-noc"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <55 512 0 0>, + <55 512 393600 393600>; + clocks = <&clock_gcc clk_crypto_clk_src>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>; + clock-names = "core_clk_src", "core_clk", + "iface_clk", "bus_clk"; + qcom,use-sw-aes-cbc-ecb-ctr-algo; + qcom,use-sw-aes-xts-algo; + qcom,use-sw-aes-ccm-algo; + qcom,use-sw-ahash-algo; + qcom,use-sw-hmac-algo; + qcom,use-sw-aead-algo; + qcom,ce-opp-freq = <100000000>; + }; + + qcom_cedev: qcedev@720000 { + compatible = "qcom,qcedev"; + reg = <0x720000 0x20000>, + <0x704000 0x20000>; + reg-names = "crypto-base","crypto-bam-base"; + interrupts = <0 207 0>; + qcom,bam-pipe-pair = <1>; + qcom,ce-hw-instance = <0>; + qcom,ce-device = <0>; + qcom,ce-hw-shared; + qcom,msm-bus,name = "qcedev-noc"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <55 512 0 0>, + <55 512 393600 393600>; + clocks = <&clock_gcc clk_crypto_clk_src>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>; + clock-names = "core_clk_src", "core_clk", + "iface_clk", "bus_clk"; + qcom,ce-opp-freq = <100000000>; + }; + + qcom_seecom: qseecom@84A00000 { + compatible = "qcom,qseecom"; + reg = <0x84A00000 0x1900000>; + reg-names = "secapp-region"; + qcom,hlos-num-ce-hw-instances = <1>; + qcom,hlos-ce-hw-instance = <0>; + qcom,qsee-ce-hw-instance = <0>; + qcom,disk-encrypt-pipe-pair = <2>; + qcom,support-fde; + qcom,msm-bus,name = "qseecom-noc"; + qcom,msm-bus,num-cases = <4>; + qcom,msm-bus,num-paths = <1>; + qcom,support-bus-scaling; + qcom,appsbl-qseecom-support; + qcom,msm-bus,vectors-KBps = + <55 512 0 0>, + <55 512 0 0>, + <55 512 120000 1200000>, + <55 512 393600 3936000>; + clocks = <&clock_gcc clk_crypto_clk_src>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>; + clock-names = "core_clk_src", "core_clk", + "iface_clk", "bus_clk"; + qcom,ce-opp-freq = <100000000>; + }; + + qcom,ipc_router { + compatible = "qcom,ipc_router"; + qcom,node-id = <1>; + }; + + qcom,ipc_router_modem_xprt { + compatible = "qcom,ipc_router_smd_xprt"; + qcom,ch-name = "IPCRTR"; + qcom,xprt-remote = "modem"; + qcom,xprt-linkid = <1>; + qcom,xprt-version = <1>; + qcom,fragmented-data; + qcom,disable-pil-loading; + }; + + qcom,ipc_router_q6_xprt { + compatible = "qcom,ipc_router_smd_xprt"; + qcom,ch-name = "IPCRTR"; + qcom,xprt-remote = "adsp"; + qcom,xprt-linkid = <1>; + qcom,xprt-version = <1>; + qcom,fragmented-data; + }; + + qcom,ipc_router_wcnss_xprt { + compatible = "qcom,ipc_router_smd_xprt"; + qcom,ch-name = "IPCRTR"; + qcom,xprt-remote = "wcnss"; + qcom,xprt-linkid = <1>; + qcom,xprt-version = <1>; + qcom,fragmented-data; + }; + + qcom,adsprpc-mem { + compatible = "qcom,msm-adsprpc-mem-region"; + memory-region = <&adsp_mem>; + }; + + qcom,adsprpc_domains { + compatible = "qcom,msm-fastrpc-legacy-compute-cb"; + qcom,msm_fastrpc_compute_cb { + qcom,adsp-shared-phandle = <&adsp_shared>; + qcom,adsp-shared-sids = + <0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf>; + qcom,virtual-addr-pool = <0x80000000 0x7FFFFFFF>; + }; + }; + + sdcc1_ice: sdcc1ice@7803000 { + compatible = "qcom,ice"; + reg = <0x7803000 0x8000>; + interrupt-names = "sdcc_ice_nonsec_level_irq", + "sdcc_ice_sec_level_irq"; + interrupts = <0 312 0>, <0 313 0>; + qcom,enable-ice-clk; + clock-names = "ice_core_clk_src", "ice_core_clk", + "bus_clk", "iface_clk"; + clocks = <&clock_gcc clk_sdcc1_ice_core_clk_src>, + <&clock_gcc clk_gcc_sdcc1_ice_core_clk>, + <&clock_gcc clk_gcc_sdcc1_apps_clk>, + <&clock_gcc clk_gcc_sdcc1_ahb_clk>; + qcom,op-freq-hz = <270000000>, <0>, <0>, <0>; + qcom,msm-bus,name = "sdcc_ice_noc"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <78 512 0 0>, /* No vote */ + <78 512 1000 0>; /* Max. bandwidth */ + qcom,bus-vector-names = "MIN", "MAX"; + qcom,instance-type = "sdcc"; + }; + + sdhc_1: sdhci@7824900 { + compatible = "qcom,sdhci-msm"; + reg = <0x7824900 0x500>, <0x7824000 0x800>, <0x7824e00 0x200>; + reg-names = "hc_mem", "core_mem", "cmdq_mem"; + + interrupts = <0 123 0>, <0 138 0>; + interrupt-names = "hc_irq", "pwr_irq"; + + sdhc-msm-crypto = <&sdcc1_ice>; + qcom,bus-width = <8>; + + qcom,devfreq,freq-table = <50000000 200000000>; + + qcom,pm-qos-irq-type = "affine_irq"; + qcom,pm-qos-irq-latency = <2 213>; + + qcom,pm-qos-cpu-groups = <0x0f 0xf0>; + qcom,pm-qos-cmdq-latency-us = <2 213>, <2 213>; + + qcom,pm-qos-legacy-latency-us = <2 213>, <2 213>; + + qcom,msm-bus,name = "sdhc1"; + qcom,msm-bus,num-cases = <9>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = <78 512 0 0>, /* No vote */ + <78 512 1046 3200>, /* 400 KB/s*/ + <78 512 52286 160000>, /* 20 MB/s */ + <78 512 65360 200000>, /* 25 MB/s */ + <78 512 130718 400000>, /* 50 MB/s */ + <78 512 130718 400000>, /* 100 MB/s */ + <78 512 261438 800000>, /* 200 MB/s */ + <78 512 261438 800000>, /* 400 MB/s */ + <78 512 1338562 4096000>; /* Max. bandwidth */ + qcom,bus-bw-vectors-bps = <0 400000 20000000 25000000 50000000 + 100000000 200000000 400000000 4294967295>; + + clocks = <&clock_gcc clk_gcc_sdcc1_ahb_clk>, + <&clock_gcc clk_gcc_sdcc1_apps_clk>, + <&clock_gcc clk_gcc_sdcc1_ice_core_clk>; + clock-names = "iface_clk", "core_clk", "ice_core_clk"; + qcom,ice-clk-rates = <270000000 160000000>; + qcom,large-address-bus; + + status = "disabled"; + }; + + sdhc_2: sdhci@7864900 { + compatible = "qcom,sdhci-msm"; + reg = <0x7864900 0x500>, <0x7864000 0x800>; + reg-names = "hc_mem", "core_mem"; + + interrupts = <0 125 0>, <0 221 0>; + interrupt-names = "hc_irq", "pwr_irq"; + + qcom,bus-width = <4>; + + qcom,pm-qos-irq-type = "affine_irq"; + qcom,pm-qos-irq-latency = <2 213>; + + qcom,pm-qos-cpu-groups = <0x0f 0xf0>; + qcom,pm-qos-legacy-latency-us = <2 213>, <2 213>; + + qcom,devfreq,freq-table = <50000000 200000000>; + + qcom,msm-bus,name = "sdhc2"; + qcom,msm-bus,num-cases = <8>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = <81 512 0 0>, /* No vote */ + <81 512 1046 3200>, /* 400 KB/s*/ + <81 512 52286 160000>, /* 20 MB/s */ + <81 512 65360 200000>, /* 25 MB/s */ + <81 512 130718 400000>, /* 50 MB/s */ + <81 512 261438 800000>, /* 100 MB/s */ + <81 512 261438 800000>, /* 200 MB/s */ + <81 512 1338562 4096000>; /* Max. bandwidth */ + qcom,bus-bw-vectors-bps = <0 400000 20000000 25000000 50000000 + 100000000 200000000 4294967295>; + + clocks = <&clock_gcc clk_gcc_sdcc2_ahb_clk>, + <&clock_gcc clk_gcc_sdcc2_apps_clk>; + clock-names = "iface_clk", "core_clk"; + + qcom,large-address-bus; + status = "disabled"; + }; + + spmi_bus: qcom,spmi@200f000 { + compatible = "qcom,spmi-pmic-arb"; + reg = <0x200f000 0x1000>, + <0x2400000 0x800000>, + <0x2c00000 0x800000>, + <0x3800000 0x200000>, + <0x200a000 0x2100>; + reg-names = "core", "chnls", "obsrvr", "intr", "cnfg"; + interrupts = <0 190 0>; + qcom,pmic-arb-channel = <0>; + qcom,pmic-arb-max-peripherals = <256>; + qcom,pmic-arb-max-periph-interrupts = <256>; + qcom,pmic-arb-ee = <0>; + #interrupt-cells = <3>; + interrupt-controller; + #address-cells = <1>; + #size-cells = <0>; + cell-index = <0>; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_1 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x200000>; + qcom,client-id = <0>; + qcom,allocate-boot-time; + label = "modem"; + }; + + qcom,client_2 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x300000>; + qcom,client-id = <2>; + label = "modem"; + }; + + qcom,client_3 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x0>; + qcom,client-id = <1>; + label = "modem"; + }; + }; + + qcom,mss@4080000 { + compatible = "qcom,pil-q6v55-mss"; + reg = <0x04080000 0x100>, + <0x0194f000 0x010>, + <0x01950000 0x008>, + <0x01951000 0x008>, + <0x04020000 0x040>, + <0x01871000 0x004>; + reg-names = "qdsp6_base", "halt_q6", "halt_modem", "halt_nc", + "rmb_base", "restart_reg"; + + interrupts = <0 24 1>; + vdd_mss-supply = <&pm8953_s1>; + vdd_cx-supply = <&pm8953_s2_level>; + vdd_cx-voltage = ; + vdd_mx-supply = <&pm8953_s7_level_ao>; + vdd_mx-uV = ; + vdd_pll-supply = <&pm8953_l7>; + qcom,vdd_pll = <1800000>; + + clocks = <&clock_gcc clk_xo_pil_mss_clk>, + <&clock_gcc clk_gcc_mss_cfg_ahb_clk>, + <&clock_gcc clk_gcc_mss_q6_bimc_axi_clk>, + <&clock_gcc clk_gcc_boot_rom_ahb_clk>; + clock-names = "xo", "iface_clk", "bus_clk", "mem_clk"; + qcom,proxy-clock-names = "xo"; + qcom,active-clock-names = "iface_clk", "bus_clk", "mem_clk"; + + qcom,pas-id = <5>; + qcom,pil-mss-memsetup; + qcom,firmware-name = "modem"; + qcom,pil-self-auth; + qcom,sysmon-id = <0>; + qcom,ssctl-instance-id = <0x12>; + qcom,qdsp6v56-1-10; + + /* GPIO inputs from mss */ + qcom,gpio-err-fatal = <&smp2pgpio_ssr_smp2p_1_in 0 0>; + qcom,gpio-err-ready = <&smp2pgpio_ssr_smp2p_1_in 1 0>; + qcom,gpio-proxy-unvote = <&smp2pgpio_ssr_smp2p_1_in 2 0>; + qcom,gpio-stop-ack = <&smp2pgpio_ssr_smp2p_1_in 3 0>; + qcom,gpio-shutdown-ack = <&smp2pgpio_ssr_smp2p_1_in 7 0>; + + /* GPIO output to mss */ + qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_1_out 0 0>; + memory-region = <&modem_mem>; + }; + + qcom,lpass@c200000 { + compatible = "qcom,pil-tz-generic"; + reg = <0xc200000 0x00100>; + interrupts = <0 293 1>; + + vdd_cx-supply = <&pm8953_s2_level>; + qcom,proxy-reg-names = "vdd_cx"; + qcom,vdd_cx-uV-uA = ; + + clocks = <&clock_gcc clk_xo_pil_lpass_clk>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>, + <&clock_gcc clk_crypto_clk_src>; + clock-names = "xo", "scm_core_clk", "scm_iface_clk", + "scm_bus_clk", "scm_core_clk_src"; + qcom,proxy-clock-names = "xo", "scm_core_clk", "scm_iface_clk", + "scm_bus_clk", "scm_core_clk_src"; + qcom,scm_core_clk_src-freq = <80000000>; + + qcom,pas-id = <1>; + qcom,complete-ramdump; + qcom,proxy-timeout-ms = <10000>; + qcom,smem-id = <423>; + qcom,sysmon-id = <1>; + qcom,ssctl-instance-id = <0x14>; + qcom,firmware-name = "adsp"; + + /* GPIO inputs from lpass */ + qcom,gpio-err-fatal = <&smp2pgpio_ssr_smp2p_2_in 0 0>; + qcom,gpio-proxy-unvote = <&smp2pgpio_ssr_smp2p_2_in 2 0>; + qcom,gpio-err-ready = <&smp2pgpio_ssr_smp2p_2_in 1 0>; + qcom,gpio-stop-ack = <&smp2pgpio_ssr_smp2p_2_in 3 0>; + + /* GPIO output to lpass */ + qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_2_out 0 0>; + + memory-region = <&adsp_fw_mem>; + }; + + qcom,venus@1de0000 { + compatible = "qcom,pil-tz-generic"; + reg = <0x1de0000 0x4000>; + + vdd-supply = <&gdsc_venus>; + qcom,proxy-reg-names = "vdd"; + + clocks = <&clock_gcc clk_gcc_venus0_vcodec0_clk>, + <&clock_gcc clk_gcc_venus0_ahb_clk>, + <&clock_gcc clk_gcc_venus0_axi_clk>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>, + <&clock_gcc clk_crypto_clk_src>; + + clock-names = "core_clk", "iface_clk", "bus_clk", + "scm_core_clk", "scm_iface_clk", + "scm_bus_clk", "scm_core_clk_src"; + + qcom,proxy-clock-names = "core_clk", "iface_clk", + "bus_clk", "scm_core_clk", + "scm_iface_clk", "scm_bus_clk", + "scm_core_clk_src"; + qcom,scm_core_clk_src-freq = <80000000>; + + qcom,msm-bus,name = "pil-venus"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <63 512 0 0>, + <63 512 0 304000>; + + qcom,pas-id = <9>; + qcom,proxy-timeout-ms = <100>; + qcom,firmware-name = "venus"; + memory-region = <&venus_mem>; + }; + + qcom,msm-ssc-sensors { + compatible = "qcom,msm-ssc-sensors"; + }; + + qcom,pronto@a21b000 { + compatible = "qcom,pil-tz-generic"; + reg = <0x0a21b000 0x3000>; + interrupts = <0 149 1>; + + vdd_pronto_pll-supply = <&pm8953_l7>; + proxy-reg-names = "vdd_pronto_pll"; + vdd_pronto_pll-uV-uA = <1800000 18000>; + clocks = <&clock_gcc clk_xo_pil_pronto_clk>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>, + <&clock_gcc clk_crypto_clk_src>; + + clock-names = "xo", "scm_core_clk", "scm_iface_clk", + "scm_bus_clk", "scm_core_clk_src"; + qcom,proxy-clock-names = "xo", "scm_core_clk", "scm_iface_clk", + "scm_bus_clk", "scm_core_clk_src"; + qcom,scm_core_clk_src = <80000000>; + + qcom,pas-id = <6>; + qcom,proxy-timeout-ms = <10000>; + qcom,smem-id = <422>; + qcom,sysmon-id = <6>; + qcom,ssctl-instance-id = <0x13>; + qcom,firmware-name = "wcnss"; + + /* GPIO inputs from wcnss */ + qcom,gpio-err-fatal = <&smp2pgpio_ssr_smp2p_4_in 0 0>; + qcom,gpio-err-ready = <&smp2pgpio_ssr_smp2p_4_in 1 0>; + qcom,gpio-proxy-unvote = <&smp2pgpio_ssr_smp2p_4_in 2 0>; + qcom,gpio-stop-ack = <&smp2pgpio_ssr_smp2p_4_in 3 0>; + + /* GPIO output to wcnss */ + qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_4_out 0 0>; + memory-region = <&wcnss_fw_mem>; + }; + + usb3: ssusb@7000000{ + compatible = "qcom,dwc-usb3-msm"; + reg = <0x07000000 0xfc000>, + <0x0007e000 0x400>; + reg-names = "core_base", + "ahb2phy_base"; + #address-cells = <1>; + #size-cells = <1>; + ranges; + + interrupts = <0 136 0>, <0 220 0>, <0 134 0>; + interrupt-names = "hs_phy_irq", "ss_phy_irq", "pwr_event_irq"; + + USB3_GDSC-supply = <&gdsc_usb30>; + vbus_dwc3-supply = <&smbcharger_charger_otg>; + qcom,usb-dbm = <&dbm_1p5>; + qcom,msm-bus,name = "usb3"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <61 512 0 0>, + <61 512 240000 800000>; + + qcom,dwc-usb3-msm-tx-fifo-size = <21288>; + + clocks = <&clock_gcc clk_gcc_usb30_master_clk>, + <&clock_gcc clk_gcc_pcnoc_usb3_axi_clk>, + <&clock_gcc clk_gcc_usb30_mock_utmi_clk>, + <&clock_gcc clk_gcc_usb30_sleep_clk>, + <&clock_gcc clk_xo_dwc3_clk>, + <&clock_gcc clk_gcc_usb_phy_cfg_ahb_clk>; + + clock-names = "core_clk", "iface_clk", "utmi_clk", + "sleep_clk", "xo", "cfg_ahb_clk"; + + dwc3@7000000 { + compatible = "snps,dwc3"; + reg = <0x07000000 0xc8d0>; + interrupt-parent = <&intc>; + interrupts = <0 140 0>; + usb-phy = <&qusb_phy>, <&ssphy>; + tx-fifo-resize; + snps,usb3-u1u2-disable; + snps,nominal-elastic-buffer; + snps,is-utmi-l1-suspend; + snps,hird-threshold = /bits/ 8 <0x0>; + }; + + qcom,usbbam@7104000 { + compatible = "qcom,usb-bam-msm"; + reg = <0x07104000 0x1a934>; + interrupt-parent = <&intc>; + interrupts = <0 135 0>; + + qcom,bam-type = <0>; + qcom,usb-bam-fifo-baseaddr = <0x08605000>; + qcom,usb-bam-num-pipes = <8>; + qcom,ignore-core-reset-ack; + qcom,disable-clk-gating; + qcom,usb-bam-override-threshold = <0x4001>; + qcom,usb-bam-max-mbps-highspeed = <400>; + qcom,usb-bam-max-mbps-superspeed = <3600>; + qcom,reset-bam-on-connect; + + qcom,pipe0 { + label = "ssusb-ipa-out-0"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <0>; + qcom,pipe-num = <0>; + qcom,peer-bam = <1>; + qcom,src-bam-pipe-index = <1>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + + qcom,pipe1 { + label = "ssusb-ipa-in-0"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <1>; + qcom,pipe-num = <0>; + qcom,peer-bam = <1>; + qcom,dst-bam-pipe-index = <0>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + + qcom,pipe2 { + label = "ssusb-qdss-in-0"; + qcom,usb-bam-mem-type = <2>; + qcom,dir = <1>; + qcom,pipe-num = <0>; + qcom,peer-bam = <0>; + qcom,peer-bam-physical-address = <0x06044000>; + qcom,src-bam-pipe-index = <0>; + qcom,dst-bam-pipe-index = <2>; + qcom,data-fifo-offset = <0x0>; + qcom,data-fifo-size = <0xe00>; + qcom,descriptor-fifo-offset = <0xe00>; + qcom,descriptor-fifo-size = <0x200>; + }; + + qcom,pipe3 { + label = "ssusb-dpl-ipa-in-1"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <1>; + qcom,pipe-num = <1>; + qcom,peer-bam = <1>; + qcom,dst-bam-pipe-index = <2>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + }; + }; + + qusb_phy: qusb@79000 { + compatible = "qcom,qusb2phy"; + reg = <0x079000 0x180>, + <0x070f8800 0x400>, + <0x01841030 0x4>, + <0x0193f044 0x4>, + <0x0193f020 0x4>; + reg-names = "qusb_phy_base", + "qscratch_base", + "ref_clk_addr", + "tcsr_phy_clk_scheme_sel", + "tcsr_phy_level_shift_keeper"; + + USB3_GDSC-supply = <&gdsc_usb30>; + vdd-supply = <&pm8953_l3>; + vdda18-supply = <&pm8953_l7>; + vdda33-supply = <&pm8953_l13>; + qcom,vdd-voltage-level = <0 925000 925000>; + + qcom,qusb-phy-init-seq = <0xF8 0x80 + 0x73 0x84 + 0x83 0x88 + 0xC7 0x8C + 0x14 0x9C + 0x30 0x08 + 0x79 0x0C + 0x21 0x10 + 0x00 0x90 + 0x9F 0x1C + 0x00 0x18>; + phy_type= "utmi"; + + clocks = <&clock_gcc clk_bb_clk1>, + <&clock_gcc clk_gcc_qusb_ref_clk>, + <&clock_gcc clk_gcc_usb_phy_cfg_ahb_clk>, + <&clock_gcc clk_gcc_qusb2_phy_reset>, + <&clock_gcc clk_gcc_pcnoc_usb3_axi_clk>, + <&clock_gcc clk_gcc_usb30_master_clk>; + + clock-names = "ref_clk_src", "ref_clk", "cfg_ahb_clk", + "phy_reset", "iface_clk", "core_clk"; + + }; + + usb_nop_phy: usb_nop_phy { + status = "disabled"; + compatible = "usb-nop-xceiv"; + }; + + + ssphy: ssphy@78000 { + compatible = "qcom,usb-ssphy-qmp"; + reg = <0x78000 0x9f8>, + <0x0193f244 0x4>, + <0x0193f044 0x4>; + reg-names = "qmp_phy_base", + "vls_clamp_reg", + "tcsr_phy_clk_scheme_sel"; + qcom,qmp-phy-init-seq = <0xac 0x14 0x1a 0x00 + 0x34 0x08 0x08 0x00 + 0x174 0x30 0x30 0x00 + 0x3c 0x06 0x06 0x00 + 0xb4 0x00 0x00 0x00 + 0xb8 0x08 0x08 0x00 + 0x194 0x06 0x06 0x3e8 + 0x19c 0x01 0x01 0x00 + 0x178 0x00 0x00 0x00 + 0xd0 0x82 0x82 0x00 + 0xdc 0x55 0x55 0x00 + 0xe0 0x55 0x55 0x00 + 0xe4 0x03 0x03 0x00 + 0x78 0x0b 0x0b 0x00 + 0x84 0x16 0x16 0x00 + 0x90 0x28 0x28 0x00 + 0x108 0x80 0x80 0x00 + 0x10c 0x00 0x00 0x00 + 0x184 0x0a 0x0a 0x00 + 0x4c 0x15 0x15 0x00 + 0x50 0x34 0x34 0x00 + 0x54 0x00 0x00 0x00 + 0xc8 0x00 0x00 0x00 + 0x18c 0x00 0x00 0x00 + 0xcc 0x00 0x00 0x00 + 0x128 0x00 0x00 0x00 + 0x0c 0x0a 0x0a 0x00 + 0x10 0x01 0x01 0x00 + 0x1c 0x31 0x31 0x00 + 0x20 0x01 0x01 0x00 + 0x14 0x00 0x00 0x00 + 0x18 0x00 0x00 0x00 + 0x24 0xde 0xde 0x00 + 0x28 0x07 0x07 0x00 + 0x48 0x0f 0x0f 0x00 + 0x70 0x0f 0x0f 0x00 + 0x100 0x80 0x80 0x00 + 0x440 0x0b 0x0b 0x00 + 0x4d8 0x02 0x02 0x00 + 0x4dc 0x6c 0x6c 0x00 + 0x4e0 0xbb 0xbb 0x00 + 0x508 0x77 0x77 0x00 + 0x50c 0x80 0x80 0x00 + 0x514 0x03 0x03 0x00 + 0x51c 0x16 0x16 0x00 + 0x448 0x75 0x75 0x00 + 0x454 0x00 0x00 0x00 + 0x40c 0x0a 0x0a 0x00 + 0x41c 0x06 0x06 0x00 + 0x510 0x00 0x00 0x00 + 0x268 0x45 0x45 0x00 + 0x2ac 0x12 0x12 0x00 + 0x294 0x06 0x06 0x00 + 0x254 0x00 0x00 0x00 + 0x8c8 0x83 0x83 0x00 + 0x8c4 0x02 0x02 0x00 + 0x8cc 0x09 0x09 0x00 + 0x8d0 0xa2 0xa2 0x00 + 0x8d4 0x85 0x85 0x00 + 0x880 0xd1 0xd1 0x00 + 0x884 0x1f 0x1f 0x00 + 0x888 0x47 0x47 0x00 + 0x80c 0x9f 0x9f 0x00 + 0x824 0x17 0x17 0x00 + 0x828 0x0f 0x0f 0x00 + 0x8b8 0x75 0x75 0x00 + 0x8bc 0x13 0x13 0x00 + 0x8b0 0x86 0x86 0x00 + 0x8a0 0x04 0x04 0x00 + 0x88c 0x44 0x44 0x00 + 0x870 0xe7 0xe7 0x00 + 0x874 0x03 0x03 0x00 + 0x878 0x40 0x40 0x00 + 0x87c 0x00 0x00 0x00 + 0x9d8 0x88 0x88 0x00 + 0xffffffff 0xffffffff 0x00 0x00>; + qcom,qmp-phy-reg-offset = <0x988 0x98c 0x990 0x994 + 0x974 0x8d8 0x8dc 0x804 0x800 + 0x808>; + vdd-supply = <&pm8953_l3>; + vdda18-supply = <&pm8953_l7>; + qcom,vdd-voltage-level = <0 925000 925000>; + qcom,vbus-valid-override; + + clocks = <&clock_gcc clk_gcc_usb3_aux_clk>, + <&clock_gcc clk_gcc_usb3_pipe_clk>, + <&clock_gcc clk_gcc_usb_phy_cfg_ahb_clk>, + <&clock_gcc clk_gcc_usb3_phy_reset>, + <&clock_gcc clk_gcc_usb3phy_phy_reset>, + <&clock_gcc clk_bb_clk1>, + <&clock_gcc clk_gcc_usb_ss_ref_clk>; + + clock-names = "aux_clk", "pipe_clk", "cfg_ahb_clk", "phy_reset", + "phy_phy_reset", "ref_clk_src", "ref_clk"; + + }; + + usb_audio_qmi_dev { + compatible = "qcom,usb-audio-qmi-dev"; + qcom,usb-audio-intr-num = <2>; + }; + + dbm_1p5: dbm@70f8000 { + compatible = "qcom,usb-dbm-1p5"; + reg = <0x070f8000 0x300>; + qcom,reset-ep-after-lpm-resume; + }; + + android_usb@86000c8 { + compatible = "qcom,android-usb"; + reg = <0x086000c8 0xc8>; + qcom,pm-qos-latency = <2 213 11028>; + }; +}; + +#include "msm-pm8953-rpm-regulator.dtsi" +#include "msm-pm8953.dtsi" +#include "msm8953-regulator.dtsi" +#include "msm-pmi8940.dtsi" +#include "msm-audio.dtsi" +#include "msm8953-audio_rosy.dtsi" +#include "msm-gdsc-8916.dtsi" +#include "msm8953-camera.dtsi" +#include "msm8953-mdss.dtsi" +#include "msm8953-mdss-pll.dtsi" + +&gdsc_venus { + clock-names = "bus_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_venus0_axi_clk>, + <&clock_gcc clk_gcc_venus0_vcodec0_clk>; + status = "okay"; +}; + +&gdsc_venus_core0 { + qcom,support-hw-trigger; + clock-names ="core0_clk"; + clocks = <&clock_gcc clk_gcc_venus0_core0_vcodec0_clk>; + status = "okay"; +}; + +&gdsc_mdss { + clock-names = "core_clk", "bus_clk"; + clocks = <&clock_gcc clk_gcc_mdss_mdp_clk>, + <&clock_gcc clk_gcc_mdss_axi_clk>; + proxy-supply = <&gdsc_mdss>; + qcom,proxy-consumer-enable; + status = "okay"; +}; + +&gdsc_oxili_gx { + clock-names = "core_root_clk"; + clocks =<&clock_gcc_gfx clk_gfx3d_clk_src>; + qcom,force-enable-root-clk; + parent-supply = <&gfx_vreg_corner>; + status = "okay"; +}; + +&gdsc_jpeg { + clock-names = "core_clk", "bus_clk"; + clocks = <&clock_gcc clk_gcc_camss_jpeg0_clk>, + <&clock_gcc clk_gcc_camss_jpeg_axi_clk>; + status = "okay"; +}; + +&gdsc_vfe { + clock-names = "core_clk", "bus_clk", "micro_clk", + "csi_clk"; + clocks = <&clock_gcc clk_gcc_camss_vfe0_clk>, + <&clock_gcc clk_gcc_camss_vfe_axi_clk>, + <&clock_gcc clk_gcc_camss_micro_ahb_clk>, + <&clock_gcc clk_gcc_camss_csi_vfe0_clk>; + status = "okay"; +}; + +&gdsc_vfe1 { + clock-names = "core_clk", "bus_clk", "micro_clk", + "csi_clk"; + clocks = <&clock_gcc clk_gcc_camss_vfe1_clk>, + <&clock_gcc clk_gcc_camss_vfe1_axi_clk>, + <&clock_gcc clk_gcc_camss_micro_ahb_clk>, + <&clock_gcc clk_gcc_camss_csi_vfe1_clk>; + status = "okay"; +}; + +&gdsc_cpp { + clock-names = "core_clk", "bus_clk"; + clocks = <&clock_gcc clk_gcc_camss_cpp_clk>, + <&clock_gcc clk_gcc_camss_cpp_axi_clk>; + status = "okay"; +}; + +&gdsc_oxili_cx { + clock-names = "core_clk"; + clocks = <&clock_gcc_gfx clk_gcc_oxili_gfx3d_clk>; + status = "okay"; +}; + +&gdsc_usb30 { + status = "okay"; +}; + +&pm8953_mpps { + mpp@a100 { + /* MPP2 - PA_THERM config */ + qcom,mode = <4>; /* AIN input */ + qcom,invert = <1>; /* Enable MPP */ + qcom,ain-route = <1>; /* AMUX 6 */ + qcom,master-en = <1>; + qcom,src-sel = <0>; /* Function constant */ + }; + + mpp@a300 { + /* MPP4 - CASE_THERM config */ + qcom,mode = <4>; /* AIN input */ + qcom,invert = <1>; /* Enable MPP */ + qcom,ain-route = <3>; /* AMUX 8 */ + qcom,master-en = <1>; + qcom,src-sel = <0>; /* Function constant */ + }; +}; + +&pm8953_vadc { + chan@5 { + label = "vcoin"; + reg = <5>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <1>; + qcom,calibration-type = "absolute"; + qcom,scale-function = <0>; + qcom,hw-settle-time = <0>; + qcom,fast-avg-setup = <0>; + }; + + chan@7 { + label = "vph_pwr"; + reg = <7>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <1>; + qcom,calibration-type = "absolute"; + qcom,scale-function = <0>; + qcom,hw-settle-time = <0>; + qcom,fast-avg-setup = <0>; + }; + + chan@36 { + label = "pa_therm0"; + reg = <0x36>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <2>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + }; + + chan@11 { + label = "pa_therm1"; + reg = <0x11>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <2>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + qcom,vadc-thermal-node; + }; + + chan@32 { + label = "xo_therm"; + reg = <0x32>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <4>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + qcom,vadc-thermal-node; + }; + + chan@3c { + label = "xo_therm_buf"; + reg = <0x3c>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <4>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + qcom,vadc-thermal-node; + }; + + chan@13 { + label = "case_therm"; + reg = <0x13>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <2>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + qcom,vadc-thermal-node; + }; +}; + +&pm8953_adc_tm { + chan@36 { + label = "pa_therm0"; + reg = <0x36>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <2>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + qcom,btm-channel-number = <0x48>; + qcom,thermal-node; + }; + + chan@7 { + label = "vph_pwr"; + reg = <0x7>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <1>; + qcom,calibration-type = "absolute"; + qcom,scale-function = <0>; + qcom,hw-settle-time = <0>; + qcom,fast-avg-setup = <0>; + qcom,btm-channel-number = <0x68>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-qrd_rosy.dts b/arch/arm/boot/dts/qcom/sdm450-qrd_rosy.dts new file mode 100644 index 0000000000000..163d7b1e86a03 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-qrd_rosy.dts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/dts-v1/; + +#include "sdm450_rosy.dtsi" +#include "msm8953-qrd-sku3_rosy.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 QRD"; + compatible = "qcom,sdm450-qrd", "qcom,sdm450", "qcom,qrd"; + qcom,board-id = <11 1>; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450_rosy.dtsi b/arch/arm/boot/dts/qcom/sdm450_rosy.dtsi new file mode 100644 index 0000000000000..8be543d238321 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450_rosy.dtsi @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "skeleton64.dtsi" +#include "msm8953_rosy.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450"; + compatible = "qcom,sdm450"; + qcom,msm-id = <338 0x0>; + interrupt-parent = <&intc>; + + soc: soc { }; +}; + +&clock_gcc_gfx { + compatible = "qcom,gcc-gfx-sdm450"; + qcom,gfxfreq-corner = + < 0 0 >, + < 133330000 1 >, /* Min SVS */ + < 216000000 2 >, /* Low SVS */ + < 320000000 3 >, /* SVS */ + < 400000000 4 >, /* SVS Plus */ + < 510000000 5 >, /* NOM */ + < 560000000 6 >, /* Nom Plus */ + < 600000000 7 >; /* Turbo */ +}; + +/* GPU Overrides*/ +&msm_gpu { + + /delete-node/qcom,gpu-pwrlevels; + + qcom,gpu-pwrlevels { + #address-cells = <1>; + #size-cells = <0>; + + compatible = "qcom,gpu-pwrlevels"; + + /* TURBO */ + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <600000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <10>; + qcom,bus-max = <10>; + }; + + /* NOM+ */ + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <560000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <8>; + qcom,bus-max = <10>; + }; + + /* NOM */ + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <510000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <6>; + qcom,bus-max = <10>; + }; + + /* SVS+ */ + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <400000000>; + qcom,bus-freq = <7>; + qcom,bus-min = <5>; + qcom,bus-max = <8>; + }; + + /* SVS */ + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <320000000>; + qcom,bus-freq = <4>; + qcom,bus-min = <2>; + qcom,bus-max = <6>; + }; + + /* Low SVS */ + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <216000000>; + qcom,bus-freq = <1>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + + /* Min SVS */ + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <133300000>; + qcom,bus-freq = <1>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + /* XO */ + qcom,gpu-pwrlevel@7 { + reg = <7>; + qcom,gpu-freq = <19200000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + }; + }; +}; diff --git a/arch/arm/mach-nspire/Makefile.boot b/arch/arm/mach-nspire/Makefile.boot deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 26a5e8aab8202..737117b5d6af0 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -98,31 +98,31 @@ config MMU def_bool y config ARCH_MMAP_RND_BITS_MIN - default 14 if ARM64_64K_PAGES - default 16 if ARM64_16K_PAGES - default 18 + default 14 if ARM64_64K_PAGES + default 16 if ARM64_16K_PAGES + default 18 # max bits determined by the following formula: # VA_BITS - PAGE_SHIFT - 3 config ARCH_MMAP_RND_BITS_MAX - default 19 if ARM64_VA_BITS=36 - default 24 if ARM64_VA_BITS=39 - default 27 if ARM64_VA_BITS=42 - default 30 if ARM64_VA_BITS=47 - default 29 if ARM64_VA_BITS=48 && ARM64_64K_PAGES - default 31 if ARM64_VA_BITS=48 && ARM64_16K_PAGES - default 33 if ARM64_VA_BITS=48 - default 14 if ARM64_64K_PAGES - default 16 if ARM64_16K_PAGES - default 18 + default 19 if ARM64_VA_BITS=36 + default 24 if ARM64_VA_BITS=39 + default 27 if ARM64_VA_BITS=42 + default 30 if ARM64_VA_BITS=47 + default 29 if ARM64_VA_BITS=48 && ARM64_64K_PAGES + default 31 if ARM64_VA_BITS=48 && ARM64_16K_PAGES + default 33 if ARM64_VA_BITS=48 + default 14 if ARM64_64K_PAGES + default 16 if ARM64_16K_PAGES + default 18 config ARCH_MMAP_RND_COMPAT_BITS_MIN - default 7 if ARM64_64K_PAGES - default 9 if ARM64_16K_PAGES - default 11 + default 7 if ARM64_64K_PAGES + default 9 if ARM64_16K_PAGES + default 11 config ARCH_MMAP_RND_COMPAT_BITS_MAX - default 16 + default 16 config NO_IOPORT_MAP def_bool y if !PCI @@ -155,7 +155,7 @@ config GENERIC_HWEIGHT def_bool y config GENERIC_CSUM - def_bool y + def_bool y config GENERIC_CALIBRATE_DELAY def_bool y @@ -624,9 +624,9 @@ config ARM64_PGTABLE_LEVELS default 4 if ARM64_4K_PAGES && ARM64_VA_BITS_48 config CPU_BIG_ENDIAN - bool "Build big-endian kernel" - help - Say Y if you plan on running a kernel in big-endian mode. + bool "Build big-endian kernel" + help + Say Y if you plan on running a kernel in big-endian mode. config ARM64_SEV_IN_LOCK_UNLOCK bool "Add explicit SEV in the spinlock unlock code path" @@ -700,14 +700,14 @@ config HOTPLUG_CPU # a multiplatform kernel, we just want the highest value required by the # selected platforms. config ARCH_NR_GPIO - int - default 1024 if ARCH_TEGRA - default 1024 if ARCH_MSM - default 256 - help - Maximum number of GPIOs in the system. + int + default 1024 if ARCH_TEGRA + default 1024 if ARCH_MSM + default 256 + help + Maximum number of GPIOs in the system. - If unsure, leave the default value. + If unsure, leave the default value. source kernel/Kconfig.preempt @@ -782,6 +782,13 @@ config HAVE_ARCH_TRANSPARENT_HUGEPAGE config ARCH_HAS_CACHE_LINE_SIZE def_bool y +config BOOT_INFO + bool "Boot information from bootloader" + default y + help + On embedded linux device, we try to collect more information from + bootloader to kernel. eg. powerup reason. + source "mm/Kconfig" config SECCOMP @@ -949,7 +956,7 @@ config EFI help This option provides support for runtime services provided by UEFI firmware (such as non-volatile variables, realtime - clock, and platform reset). A UEFI stub is also provided to + clock, and platform reset). A UEFI stub is also provided to allow the kernel to be booted as an EFI application. This is only useful on systems that have UEFI firmware. diff --git a/arch/arm64/configs/S88503AC1-perf_defconfig b/arch/arm64/configs/S88503AC1-perf_defconfig new file mode 100644 index 0000000000000..b8928d39a9525 --- /dev/null +++ b/arch/arm64/configs/S88503AC1-perf_defconfig @@ -0,0 +1,731 @@ +CONFIG_LOCALVERSION="-perf" +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_NOCB_CPU=y +CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=n +CONFIG_CGROUPS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y +CONFIG_SCHED_QHMP=y +CONFIG_C3N_SMB358=y +CONFIG_NAMESPACES=y +CONFIG_LEDS_AW2013=y +CONFIG_LEDS_GPIO=y +CONFIG_VIB_GPIO=y +# CONFIG_UTS_NS is not set +# CONFIG_PID_NS is not set +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_ACL=y +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="cp850" +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_KALLSYMS_ALL=y +CONFIG_EMBEDDED=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PROFILING=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SIG=y +CONFIG_MODULE_SIG_FORCE=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ARCH_MSM=y +CONFIG_ARCH_MSM8916=y +CONFIG_ARCH_MSM8917=y +CONFIG_ARCH_MSM8920=y +CONFIG_ARCH_MSM8940=y +CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_MSM8937=y +CONFIG_ARCH_MSMCOBALT=y +CONFIG_PCI_MSM=y +CONFIG_SMP=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_CLEANCACHE=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_ZSMALLOC=y +CONFIG_RTMM=y +CONFIG_ZCACHE=y +CONFIG_PROCESS_RECLAIM=y +CONFIG_SECCOMP=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_SWP_EMULATION=y +CONFIG_CP15_BARRIER_EMULATION=y +CONFIG_SETEND_EMULATION=y +CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=0 +# CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_DEBUG=y +CONFIG_SUSPEND_TIME=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_FREQ=y +CONFIG_SCHED_FREQ_INPUT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM_USER=y +CONFIG_XFRM_STATISTICS=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_HARDIDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +CONFIG_NETFILTER_XT_TARGET_NOTRACK=y +CONFIG_NETFILTER_XT_TARGET_TEE=y +CONFIG_NETFILTER_XT_TARGET_TPROXY=y +CONFIG_NETFILTER_XT_TARGET_TRACE=y +CONFIG_NETFILTER_XT_TARGET_SECMARK=y +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_DSCP=y +CONFIG_NETFILTER_XT_MATCH_ESP=y +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NATTYPE_MODULE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_RAW=y +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +CONFIG_BRIDGE_NF_EBTABLES=y +CONFIG_BRIDGE_EBT_BROUTE=y +CONFIG_L2TP=y +CONFIG_L2TP_DEBUGFS=y +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=y +CONFIG_L2TP_ETH=y +CONFIG_BRIDGE=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=y +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CMP=y +CONFIG_NET_EMATCH_NBYTE=y +CONFIG_NET_EMATCH_U32=y +CONFIG_NET_EMATCH_META=y +CONFIG_NET_EMATCH_TEXT=y +CONFIG_NET_CLS_ACT=y +CONFIG_RMNET_DATA=y +CONFIG_RMNET_DATA_FC=y +CONFIG_RMNET_DATA_DEBUG_PKT=n +CONFIG_SOCKEV_NLMCAST=y +CONFIG_BT=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=y +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=y +CONFIG_MSM_BT_POWER=y +CONFIG_CFG80211=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_RFKILL=y +CONFIG_NFC_NQ=n +CONFIG_IPC_ROUTER=y +CONFIG_IPC_ROUTER_SECURITY=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +CONFIG_DMA_CMA=y +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_UID_STAT=y +CONFIG_QSEECOM=y +CONFIG_HDCP_QSEECOM=y +CONFIG_UID_CPUTIME=y +CONFIG_USB_EXT_TYPE_C_PERICOM=n +CONFIG_MSM_ULTRASOUND=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_UFSHCD=y +CONFIG_SCSI_UFSHCD_PLATFORM=y +CONFIG_SCSI_UFS_QCOM=y +CONFIG_SCSI_UFS_QCOM_ICE=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_REQ_CRYPT=y +CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y +CONFIG_NETDEVICES=y +CONFIG_DUMMY=y +CONFIG_TUN=y +CONFIG_RNDIS_IPA=y +CONFIG_MSM_RMNET_BAM=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOL2TP=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_WCNSS_CORE=y +CONFIG_WCNSS_CORE_PRONTO=y +CONFIG_WCNSS_REGISTER_DUMP_ON_BITE=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y +CONFIG_CNSS_CRYPTO=y +CONFIG_ATH_CARDS=y +CONFIG_WIL6210=m +CONFIG_CNSS=y +CONFIG_CLD_LL_CORE=y +CONFIG_BUS_AUTO_SUSPEND=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_INPUT_KEYRESET=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v26=y +CONFIG_TOUCHSCREEN_LOCKDOWN_INFO=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GEN_VKEYS=y +CONFIG_TOUCHSCREEN_FT5346=y +CONFIG_TOUCHSCREEN_GT915L=y +CONFIG_FT_SECURE_TOUCH=y +CONFIG_TOUCHSCREEN_MAXIM_STI=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_HBTP_INPUT=n +CONFIG_INPUT_KEYCHORD=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_GPIO=y +# CONFIG_VT is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_DEVMEM is not set +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_MSM_HS=n +CONFIG_SERIAL_MSM_HSL=n +CONFIG_SERIAL_MSM_HSL_CONSOLE=n +CONFIG_SERIAL_MSM_SMD=y +CONFIG_DIAG_CHAR=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_MSM_SMD_PKT=y +CONFIG_MSM_ADSPRPC=y +CONFIG_MSM_RDBG=m +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MSM_V2=y +CONFIG_SLIMBUS=y +CONFIG_SLIMBUS_MSM_NGD=y +CONFIG_SOUNDWIRE=y +CONFIG_SPI=y +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=m +CONFIG_PINCTRL_MSM8952=y +CONFIG_PINCTRL_MSM8937=y +CONFIG_PINCTRL_MSMCOBALT=y +CONFIG_PINCTRL_MSM8917=y +CONFIG_PINCTRL_MSM8940=y +CONFIG_PINCTRL_MSM8953=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_QPNP_PIN=y +CONFIG_SMB1351_USB_CHARGER=n +CONFIG_SMB135X_CHARGER=n +CONFIG_QPNP_SMBCHARGER=n +CONFIG_QPNP_FG=n +#CONFIG_BATTERY_BCL=y +#CONFIG_MSM_BCL_CTL=y +#CONFIG_MSM_BCL_PERIPHERAL_CTL=y +CONFIG_SMB358_CHARGER=y +CONFIG_BATTERY_CW2015=y +CONFIG_POWER_RESET_MSM=y +CONFIG_MSM_DLOAD_MODE=y +CONFIG_MSM_PM=y +CONFIG_MSM_APM=y +CONFIG_SENSORS_EPM_ADC=y +CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y +CONFIG_SENSORS_QPNP_ADC_CURRENT=y +CONFIG_THERMAL=y +CONFIG_THERMAL_TSENS8974=y +CONFIG_LIMITS_MONITOR=y +CONFIG_LIMITS_LITE_HW=y +CONFIG_THERMAL_MONITOR=y +CONFIG_THERMAL_QPNP=y +CONFIG_THERMAL_QPNP_ADC_TM=y +CONFIG_WCD9335_CODEC=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_STUB=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_MEM_ACC=y +CONFIG_REGULATOR_RPM_SMD=y +CONFIG_REGULATOR_QPNP=y +CONFIG_REGULATOR_QPNP_LABIBB=y +CONFIG_REGULATOR_SPM=y +CONFIG_REGULATOR_CPR=y +CONFIG_REGULATOR_CPR3_HMSS=y +CONFIG_REGULATOR_CPR3_MMSS=y +CONFIG_REGULATOR_KRYO=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_PLATFORM=y +CONFIG_MSM_VIDC_V4L2=y +CONFIG_MSM_VIDC_VMEM=y +CONFIG_MSM_VIDC_GOVERNORS=y +CONFIG_MSM_CAMERA=y +CONFIG_MSMB_CAMERA=y +CONFIG_MSM_CAMERA_SENSOR=y +CONFIG_MSM_CPP=y +CONFIG_MSM_CCI=y +CONFIG_MSM_CSI20_HEADER=y +CONFIG_MSM_CSI22_HEADER=y +CONFIG_MSM_CSI30_HEADER=y +CONFIG_MSM_CSI31_HEADER=y +CONFIG_MSM_CSIPHY=y +CONFIG_MSM_CSID=y +CONFIG_MSM_EEPROM=y +CONFIG_MSM_ISPIF=y +CONFIG_MSM_ISPIF_V2=y +CONFIG_IMX134=y +CONFIG_IMX132=y +CONFIG_OV9724=y +CONFIG_OV5648=y +CONFIG_GC0339=y +CONFIG_OV8825=y +CONFIG_OV8865=y +CONFIG_s5k4e1=y +CONFIG_OV12830=y +CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE=y +CONFIG_MSMB_JPEG=y +CONFIG_MSM_FD=y +CONFIG_RADIO_IRIS=y +CONFIG_RADIO_IRIS_TRANSPORT=y +CONFIG_RADIO_SILABS=y +CONFIG_MSM_KGSL=y +CONFIG_FB=y +CONFIG_FB_MSM=y +CONFIG_MSM_DBA=y +CONFIG_MSM_DBA_ADV7533=y +CONFIG_FB_MSM_MDSS=y +CONFIG_FB_MSM_MDSS_WRITEBACK=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_MSM8X16=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_APPLE=y +CONFIG_HID_ELECOM=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MSM=y +CONFIG_USB_EHCI_MSM_HSIC=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_DWC3=y +CONFIG_USB_SERIAL=y +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MSM_HSPHY=y +CONFIG_USB_MSM_SSPHY_QMP=y +CONFIG_MSM_QUSB_PHY=y +CONFIG_DUAL_ROLE_USB_INTF=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_DEBUG_FS=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_CI13XXX_MSM=y +CONFIG_USB_G_ANDROID=y +CONFIG_MMC=y +CONFIG_MMC_PERF_PROFILING=n +CONFIG_MMC_CLKGATE=y +CONFIG_MMC_PARANOID_SD_INIT=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +CONFIG_MMC_TEST=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +CONFIG_MMC_CQ_HCI=y +CONFIG_LEDS_QPNP=y +CONFIG_LEDS_QPNP_FLASH=y +CONFIG_LEDS_QPNP_WLED=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_SWITCH=y +CONFIG_EDAC=y +CONFIG_EDAC_MM_EDAC=y +CONFIG_EDAC_CORTEX_ARM64=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_CE=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_QPNP=y +CONFIG_DMADEVICES=y +CONFIG_QCOM_SPS_DMA=y +CONFIG_UIO=y +CONFIG_UIO_MSM_SHAREDMEM=y +CONFIG_STAGING=y +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_TIMED_GPIO=y +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_SW_SYNC_USER=y +CONFIG_ION=y +CONFIG_ION_MSM=y +CONFIG_MSM_AVTIMER=y +CONFIG_MSM_BUS_SCALING=y +CONFIG_BUS_TOPOLOGY_ADHOC=y +CONFIG_QPNP_POWER_ON=y +CONFIG_QPNP_REVID=y +CONFIG_QPNP_COINCELL=y +CONFIG_SPS=y +CONFIG_USB_BAM=y +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_IPA=y +CONFIG_RMNET_IPA=y +CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y +CONFIG_MSM_SPMI=y +CONFIG_MSM_SPMI_PMIC_ARB=y +CONFIG_MSM_QPNP_INT=y +CONFIG_CP_ACCESS64=y +CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_MSM_MEMORY_DUMP_V2=y +CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CPUSS_DUMP=y +CONFIG_MSM_COMMON_LOG=y +CONFIG_MSM_DDR_HEALTH=y +CONFIG_MSM_WATCHDOG_V2=y +CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y +CONFIG_MSM_RPM_SMD=y +CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG=y +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_STATS_LOG=y +CONFIG_MSM_RUN_QUEUE_STATS=y +CONFIG_MSM_SCM=y +CONFIG_MSM_SCM_XPU=y +CONFIG_MSM_MPM_OF=y +CONFIG_MSM_SMEM=y +CONFIG_MSM_SMD=y +CONFIG_MSM_SMD_DEBUG=n +CONFIG_MSM_GLINK=y +CONFIG_MSM_GLINK_LOOPBACK_SERVER=y +CONFIG_MSM_GLINK_SMD_XPRT=y +CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y +CONFIG_MSM_SMEM_LOGGING=y +CONFIG_MSM_SMP2P=y +CONFIG_MSM_SMP2P_TEST=y +CONFIG_MSM_SPM=y +CONFIG_MSM_L2_SPM=y +CONFIG_MSM_QMI_INTERFACE=y +CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y +CONFIG_MSM_EVENT_TIMER=y +CONFIG_MSM_SUBSYSTEM_RESTART=y +CONFIG_MSM_SYSMON_COMM=y +CONFIG_MSM_PIL=y +CONFIG_MSM_PIL_SSR_GENERIC=y +CONFIG_MSM_PIL_MSS_QDSP6V5=y +CONFIG_MSM_BAM_DMUX=y +CONFIG_MSM_PERFORMANCE=y +# CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y +CONFIG_MEM_SHARE_QMI_SERVICE=y +CONFIG_MSM_CLK_CONTROLLER_V2=y +CONFIG_MSM_MDSS_PLL=y +CONFIG_REMOTE_SPINLOCK_MSM=y +CONFIG_MSM_IOMMU_V1=y +CONFIG_ARM_SMMU=y +CONFIG_IOMMU_DEBUG=y +CONFIG_IOMMU_TESTS=y +CONFIG_SPDM_SCM=y +CONFIG_DEVFREQ_SPDM=y +CONFIG_PWM=y +CONFIG_PWM_QPNP=y +CONFIG_ARM_GIC_PANIC_HANDLER=y +CONFIG_CORESIGHT=n +CONFIG_CORESIGHT_EVENT=n +CONFIG_CORESIGHT_FUSE=n +CONFIG_CORESIGHT_CTI=n +CONFIG_CORESIGHT_CTI_SAVE_DISABLE=n +CONFIG_CORESIGHT_TMC=n +CONFIG_CORESIGHT_TPIU=n +CONFIG_CORESIGHT_FUNNEL=n +CONFIG_CORESIGHT_REPLICATOR=n +CONFIG_CORESIGHT_STM=n +CONFIG_CORESIGHT_HWEVENT=n +CONFIG_SENSORS_SSC=y +CONFIG_MSM_TZ_LOG=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_INFO=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_RECURSIVE_FAULT=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_IPC_LOGGING=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_DEBUG_RODATA=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_LSM_MMAP_MIN_ADDR=4096 +CONFIG_SECURITY_SELINUX=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_DEV_QCRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_MSM_QCE=y +CONFIG_CRYPTO_DEV_QCEDEV=y +CONFIG_CRYPTO_DEV_OTA_CRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_ICE=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_QMI_ENCDEC=y +CONFIG_REGULATOR_TPS65132=y +CONFIG_SND_SOC_AW87319=y +CONFIG_SERIAL_NUM=y +CONFIG_SECBOOT_FUSE=y +CONFIG_PSTORE=y +CONFIG_PSTORE_CONSOLE=y +CONFIG_PSTORE_FTRACE=y +CONFIG_PSTORE_RAM=y +CONFIG_PSTORE_LAST_KMSG=y +CONFIG_CPUMAXFREQ=y +## MIUI ADD:START +## Multi userspace config support +CONFIG_ECRYPT_FS=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XTS=y +CONFIG_NAMESPACES=y +#CONFIG_UTS_NS=y +#CONFIG_IPC_NS=y +## do not turn on user-namespaces as it enables +## CONFIG_UIDGID_STRICT_TYPE_CHECKS, which results in several compile +## errors +#CONFIG_USER_NS=y +#CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_VETH=y +## END +CONFIG_DISABLE_TEMP_PROTECT=n +CONFIG_DIFFERENT_TP_COLOR=y +CONFIG_COLOFUL_RGB_FOR_PROJECT=y + +CONFIG_MSM_RTB=y +CONFIG_MSM_RTB_SEPARATE_CPUS=y + +ONFIG_ZRAM_DEBUG=y +CONFIG_SWAP=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_ANDROID_WHETSTONE=y +CONFIG_CGROUP_MEM_RES_CTLR=y +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y + +CONFIG_DUMP_ALL_STACKS=y +# CONFIG_FIRE_WATCHDOG is not set + +# sdcardfs +CONFIG_SDCARD_FS=y diff --git a/arch/arm64/configs/S88505AA1-perf_defconfig b/arch/arm64/configs/S88505AA1-perf_defconfig new file mode 100644 index 0000000000000..0db762863b3db --- /dev/null +++ b/arch/arm64/configs/S88505AA1-perf_defconfig @@ -0,0 +1,755 @@ +CONFIG_LOCALVERSION="-perf" +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_NOCB_CPU=y +CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=n +CONFIG_CGROUPS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_CPUSETS=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y +CONFIG_C3B_BQ2560X=y +CONFIG_CHARGER_BQ2560=y +CONFIG_GAUGE_BQ27426=y +CONFIG_DISABLE_TEMP_PROTECT=n +CONFIG_SCHED_QHMP=y +CONFIG_NAMESPACES=y +CONFIG_LEDS_AW2013=y +CONFIG_LEDS_GPIO=y +CONFIG_VIB_GPIO=y +# CONFIG_UTS_NS is not set +# CONFIG_PID_NS is not set +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +CONFIG_RTMM=y +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_ACL=y +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="cp850" +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_KALLSYMS_ALL=y +CONFIG_EMBEDDED=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PROFILING=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SIG=y +CONFIG_MODULE_SIG_FORCE=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ARCH_MSM=y +CONFIG_ARCH_MSM8916=y +CONFIG_ARCH_MSM8917=y +CONFIG_ARCH_MSM8920=y +CONFIG_ARCH_MSM8940=y +CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_MSM8937=y +CONFIG_ARCH_MSMCOBALT=y +CONFIG_PCI_MSM=y +CONFIG_SMP=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_CLEANCACHE=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_ZSMALLOC=y +CONFIG_ZCACHE=y +CONFIG_PROCESS_RECLAIM=y +CONFIG_SECCOMP=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_SWP_EMULATION=y +CONFIG_CP15_BARRIER_EMULATION=y +CONFIG_SETEND_EMULATION=y +CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=0 +# CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_DEBUG=n +CONFIG_SUSPEND_TIME=y +CONFIG_SUSPEND_SKIP_SYNC=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_FREQ=y +CONFIG_SCHED_FREQ_INPUT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM=y +CONFIG_XFRM_USER=y +CONFIG_XFRM_STATISTICS=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +CONFIG_INET_XFRM_TUNNEL=y +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_HARDIDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +CONFIG_NETFILTER_XT_TARGET_NOTRACK=y +CONFIG_NETFILTER_XT_TARGET_TEE=y +CONFIG_NETFILTER_XT_TARGET_TPROXY=y +CONFIG_NETFILTER_XT_TARGET_TRACE=y +CONFIG_NETFILTER_XT_TARGET_SECMARK=y +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_DSCP=y +CONFIG_NETFILTER_XT_MATCH_ESP=y +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NATTYPE_MODULE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_RAW=y +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +CONFIG_BRIDGE_NF_EBTABLES=y +CONFIG_BRIDGE_EBT_BROUTE=y +CONFIG_L2TP=y +CONFIG_L2TP_DEBUGFS=y +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=y +CONFIG_L2TP_ETH=y +CONFIG_BRIDGE=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=y +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CMP=y +CONFIG_NET_EMATCH_NBYTE=y +CONFIG_NET_EMATCH_U32=y +CONFIG_NET_EMATCH_META=y +CONFIG_NET_EMATCH_TEXT=y +CONFIG_NET_CLS_ACT=y +CONFIG_RMNET_DATA=y +CONFIG_RMNET_DATA_FC=y +#CONFIG_RMNET_DATA_DEBUG_PKT=y +CONFIG_SOCKEV_NLMCAST=y +CONFIG_BT=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=y +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=y +CONFIG_MSM_BT_POWER=y +CONFIG_CFG80211=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_RFKILL=y +CONFIG_NFC_NQ=n +CONFIG_IPC_ROUTER=y +CONFIG_IPC_ROUTER_SECURITY=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +CONFIG_DMA_CMA=y +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_UID_STAT=y +CONFIG_QSEECOM=y +CONFIG_HDCP_QSEECOM=y +CONFIG_UID_CPUTIME=y +CONFIG_USB_EXT_TYPE_C_PERICOM=n +CONFIG_MSM_ULTRASOUND=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_UFSHCD=y +CONFIG_SCSI_UFSHCD_PLATFORM=y +CONFIG_SCSI_UFS_QCOM=y +CONFIG_SCSI_UFS_QCOM_ICE=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_REQ_CRYPT=y +CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y +CONFIG_NETDEVICES=y +CONFIG_DUMMY=y +CONFIG_TUN=y +CONFIG_RNDIS_IPA=y +CONFIG_MSM_RMNET_BAM=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOATM=m +CONFIG_PPPOL2TP=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_WCNSS_CORE=y +CONFIG_WCNSS_CORE_PRONTO=y +CONFIG_WCNSS_REGISTER_DUMP_ON_BITE=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y +CONFIG_CNSS_CRYPTO=y +CONFIG_ATH_CARDS=y +CONFIG_WIL6210=m +CONFIG_CNSS=y +CONFIG_CLD_LL_CORE=y +CONFIG_BUS_AUTO_SUSPEND=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_INPUT_KEYRESET=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v26=y +CONFIG_TOUCHSCREEN_LOCKDOWN_INFO=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GEN_VKEYS=y +CONFIG_TOUCHSCREEN_FT5346=y +CONFIG_TOUCHSCREEN_GT917D=y +CONFIG_FT_SECURE_TOUCH=y +CONFIG_TOUCHSCREEN_MAXIM_STI=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_HBTP_INPUT=n +CONFIG_INPUT_KEYCHORD=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_GPIO=y +# CONFIG_VT is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_DEVMEM is not set +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_MSM_HS=n +CONFIG_SERIAL_MSM_HSL=n +CONFIG_SERIAL_MSM_HSL_CONSOLE=n +CONFIG_SERIAL_MSM_SMD=y +CONFIG_DIAG_CHAR=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_MSM_SMD_PKT=y +CONFIG_MSM_ADSPRPC=y +CONFIG_MSM_RDBG=m +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MSM_V2=y +CONFIG_SLIMBUS=y +CONFIG_SLIMBUS_MSM_NGD=y +CONFIG_SOUNDWIRE=y +CONFIG_SPI=y +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=y +CONFIG_PINCTRL_MSM8952=y +CONFIG_PINCTRL_MSM8937=y +CONFIG_PINCTRL_MSMCOBALT=y +CONFIG_PINCTRL_MSM8917=y +CONFIG_PINCTRL_MSM8940=y +CONFIG_PINCTRL_MSM8953=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_QPNP_PIN=y +CONFIG_SMB1351_USB_CHARGER=n +CONFIG_SMB135X_CHARGER=n +CONFIG_QPNP_SMBCHARGER=n +CONFIG_QPNP_FG=n +#CONFIG_BATTERY_BCL=y +#CONFIG_MSM_BCL_CTL=y +#CONFIG_MSM_BCL_PERIPHERAL_CTL=y +CONFIG_SMB358_CHARGER=n +CONFIG_BATTERY_CW2015=n +CONFIG_POWER_RESET_MSM=y +CONFIG_MSM_DLOAD_MODE=y +CONFIG_MSM_PM=y +CONFIG_MSM_APM=y +CONFIG_SENSORS_EPM_ADC=y +CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y +CONFIG_SENSORS_QPNP_ADC_CURRENT=y +CONFIG_THERMAL=y +CONFIG_THERMAL_TSENS8974=y +CONFIG_LIMITS_MONITOR=y +CONFIG_LIMITS_LITE_HW=y +CONFIG_THERMAL_MONITOR=y +CONFIG_THERMAL_QPNP=y +CONFIG_THERMAL_QPNP_ADC_TM=y +CONFIG_WCD9335_CODEC=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_STUB=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_MEM_ACC=y +CONFIG_REGULATOR_RPM_SMD=y +CONFIG_REGULATOR_QPNP=y +CONFIG_REGULATOR_QPNP_LABIBB=y +CONFIG_REGULATOR_SPM=y +CONFIG_REGULATOR_CPR=y +CONFIG_REGULATOR_CPR3_HMSS=y +CONFIG_REGULATOR_CPR3_MMSS=y +CONFIG_REGULATOR_KRYO=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_PLATFORM=y +CONFIG_MSM_VIDC_V4L2=y +CONFIG_MSM_VIDC_VMEM=y +CONFIG_MSM_VIDC_GOVERNORS=y +CONFIG_MSM_CAMERA=y +CONFIG_MSMB_CAMERA=y +CONFIG_MSM_CAMERA_SENSOR=y +CONFIG_MSM_CPP=y +CONFIG_MSM_CCI=y +CONFIG_MSM_CSI20_HEADER=y +CONFIG_MSM_CSI22_HEADER=y +CONFIG_MSM_CSI30_HEADER=y +CONFIG_MSM_CSI31_HEADER=y +CONFIG_MSM_CSIPHY=y +CONFIG_MSM_CSID=y +CONFIG_MSM_EEPROM=y +CONFIG_MSM_ISPIF=y +CONFIG_MSM_ISPIF_V2=y +CONFIG_IMX134=y +CONFIG_IMX132=y +CONFIG_OV9724=y +CONFIG_OV5648=y +CONFIG_GC0339=y +CONFIG_OV8825=y +CONFIG_OV8865=y +CONFIG_s5k4e1=y +CONFIG_OV12830=y +CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE=y +CONFIG_MSMB_JPEG=y +CONFIG_MSM_FD=y +CONFIG_RADIO_IRIS=y +CONFIG_RADIO_IRIS_TRANSPORT=y +CONFIG_RADIO_SILABS=y +CONFIG_MSM_KGSL=y +CONFIG_FB=y +CONFIG_FB_MSM=y +CONFIG_MSM_DBA=y +CONFIG_MSM_DBA_ADV7533=y +CONFIG_FB_MSM_MDSS=y +CONFIG_FB_MSM_MDSS_WRITEBACK=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=n +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_MSM8X16=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_APPLE=y +CONFIG_HID_ELECOM=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MSM=y +CONFIG_USB_EHCI_MSM_HSIC=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_DWC3=y +CONFIG_USB_SERIAL=y +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MSM_HSPHY=y +CONFIG_USB_MSM_SSPHY_QMP=y +CONFIG_MSM_QUSB_PHY=y +CONFIG_DUAL_ROLE_USB_INTF=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_DEBUG_FS=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_CI13XXX_MSM=y +CONFIG_USB_G_ANDROID=y +CONFIG_MMC=y +#CONFIG_MMC_PERF_PROFILING=y +CONFIG_MMC_CLKGATE=y +CONFIG_MMC_PARANOID_SD_INIT=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +CONFIG_MMC_TEST=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +CONFIG_MMC_CQ_HCI=y +CONFIG_LEDS_QPNP=y +CONFIG_LEDS_QPNP_FLASH=y +CONFIG_LEDS_QPNP_WLED=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_SWITCH=y +CONFIG_EDAC=y +CONFIG_EDAC_MM_EDAC=y +CONFIG_EDAC_CORTEX_ARM64=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_CE=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_QPNP=y +CONFIG_DMADEVICES=y +CONFIG_QCOM_SPS_DMA=y +CONFIG_UIO=y +CONFIG_UIO_MSM_SHAREDMEM=y +CONFIG_STAGING=y +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_TIMED_GPIO=y +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_SW_SYNC_USER=y +CONFIG_ION=y +CONFIG_ION_MSM=y +CONFIG_MSM_AVTIMER=y +CONFIG_MSM_BUS_SCALING=y +CONFIG_BUS_TOPOLOGY_ADHOC=y +CONFIG_QPNP_POWER_ON=y +CONFIG_QPNP_REVID=y +CONFIG_QPNP_COINCELL=y +CONFIG_SPS=y +CONFIG_USB_BAM=y +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_IPA=y +CONFIG_RMNET_IPA=y +CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y +CONFIG_MSM_SPMI=y +CONFIG_MSM_SPMI_PMIC_ARB=y +CONFIG_MSM_QPNP_INT=y +CONFIG_CP_ACCESS64=y +CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_MSM_MEMORY_DUMP_V2=y +CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CPUSS_DUMP=y +CONFIG_MSM_COMMON_LOG=y +CONFIG_MSM_DDR_HEALTH=y +CONFIG_MSM_WATCHDOG_V2=y +CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y +CONFIG_MSM_RPM_SMD=y +CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG=y +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_STATS_LOG=y +CONFIG_MSM_RUN_QUEUE_STATS=y +CONFIG_MSM_SCM=y +CONFIG_MSM_SCM_XPU=y +CONFIG_MSM_MPM_OF=y +CONFIG_MSM_SMEM=y +CONFIG_MSM_SMD=y +#CONFIG_MSM_SMD_DEBUG=y +CONFIG_MSM_GLINK=y +CONFIG_MSM_GLINK_LOOPBACK_SERVER=y +CONFIG_MSM_GLINK_SMD_XPRT=y +CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y +CONFIG_MSM_SMEM_LOGGING=y +CONFIG_MSM_SMP2P=y +CONFIG_MSM_SMP2P_TEST=y +CONFIG_MSM_SPM=y +CONFIG_MSM_L2_SPM=y +CONFIG_MSM_QMI_INTERFACE=y +CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y +CONFIG_MSM_EVENT_TIMER=y +CONFIG_MSM_SUBSYSTEM_RESTART=y +CONFIG_MSM_SYSMON_COMM=y +CONFIG_MSM_PIL=y +CONFIG_MSM_PIL_SSR_GENERIC=y +CONFIG_MSM_PIL_MSS_QDSP6V5=y +CONFIG_MSM_BAM_DMUX=y +CONFIG_MSM_PERFORMANCE=y +# CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y +CONFIG_MEM_SHARE_QMI_SERVICE=y +CONFIG_MSM_CLK_CONTROLLER_V2=y +CONFIG_MSM_MDSS_PLL=y +CONFIG_REMOTE_SPINLOCK_MSM=y +CONFIG_MSM_IOMMU_V1=y +CONFIG_ARM_SMMU=y +CONFIG_IOMMU_DEBUG=n +CONFIG_IOMMU_TESTS=n +CONFIG_SPDM_SCM=y +CONFIG_DEVFREQ_SPDM=y +CONFIG_PWM=y +CONFIG_PWM_QPNP=y +CONFIG_ARM_GIC_PANIC_HANDLER=y +CONFIG_CORESIGHT=n +CONFIG_CORESIGHT_EVENT=n +CONFIG_CORESIGHT_FUSE=n +CONFIG_CORESIGHT_CTI=n +CONFIG_CORESIGHT_CTI_SAVE_DISABLE=n +CONFIG_CORESIGHT_TMC=n +CONFIG_CORESIGHT_TPIU=n +CONFIG_CORESIGHT_FUNNEL=n +CONFIG_CORESIGHT_REPLICATOR=n +CONFIG_CORESIGHT_STM=n +CONFIG_CORESIGHT_HWEVENT=n +CONFIG_SENSORS_SSC=y +CONFIG_MSM_TZ_LOG=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DEBUG_INFO=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_RECURSIVE_FAULT=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_IPC_LOGGING=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_DEBUG_RODATA=n +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_LSM_MMAP_MIN_ADDR=4096 +CONFIG_SECURITY_SELINUX=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_DEV_QCRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_MSM_QCE=y +CONFIG_CRYPTO_DEV_QCEDEV=y +CONFIG_CRYPTO_DEV_OTA_CRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_ICE=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_QMI_ENCDEC=y +CONFIG_SERIAL_NUM=y +CONFIG_SECBOOT_FUSE=y +CONFIG_REGULATOR_TPS65132=y +CONFIG_SND_SOC_AW87319=y +CONFIG_PSTORE=y +CONFIG_PSTORE_CONSOLE=y +CONFIG_PSTORE_PMSG=y +CONFIG_PSTORE_FTRACE=y +CONFIG_PSTORE_RAM=y +CONFIG_PSTORE_LAST_KMSG=y +CONFIG_CPUMAXFREQ=y +## MIUI ADD:START +## Multi userspace config support +CONFIG_ECRYPT_FS=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XTS=y +CONFIG_NAMESPACES=y +CONFIG_XFRM_MIGRATE=y +CONFIG_NET_KEY_MIGRATE=y + +#CONFIG_UTS_NS=y +#CONFIG_IPC_NS=y +## do not turn on user-namespaces as it enables +## CONFIG_UIDGID_STRICT_TYPE_CHECKS, which results in several compile +## errors +#CONFIG_USER_NS=y +#CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_VETH=y +## END + +#CONFIG_ZRAM_DEBUG=y +CONFIG_SWAP=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_ANDROID_WHETSTONE=y +CONFIG_CGROUP_MEM_RES_CTLR=y +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y + +#MIUI ADD +#Add CIFS Config +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_UTF8=y +#MIUI END + +CONFIG_BOOT_INFO=y +CONFIG_OF_FLATTREE=y + +CONFIG_DUMP_ALL_STACKS=y +# CONFIG_FIRE_WATCHDOG is not set + +# sdcardfs +CONFIG_SDCARD_FS=y diff --git a/arch/arm64/configs/S88536AA2-perf_defconfig b/arch/arm64/configs/S88536AA2-perf_defconfig new file mode 100644 index 0000000000000..dda1b31487f26 --- /dev/null +++ b/arch/arm64/configs/S88536AA2-perf_defconfig @@ -0,0 +1,727 @@ +CONFIG_LOCALVERSION="-perf" +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_NOCB_CPU=y +CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=n +CONFIG_CGROUPS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_CPUSETS=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y +CONFIG_SCHED_QHMP=y +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_PID_NS is not set +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_ACL=y +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="cp850" +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_KALLSYMS_ALL=y +CONFIG_PSTORE_LAST_KMSG=y +CONFIG_EMBEDDED=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PROFILING=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SIG=y +CONFIG_MODULE_SIG_FORCE=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ARCH_MSM=y +CONFIG_ARCH_MSM8916=y +CONFIG_ARCH_MSM8917=y +CONFIG_ARCH_MSM8920=y +CONFIG_ARCH_MSM8940=y +CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_MSM8937=y +CONFIG_ARCH_MSMCOBALT=y +CONFIG_PCI_MSM=y +CONFIG_SMP=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_CLEANCACHE=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_ZSMALLOC=y +CONFIG_ZSMALLOC_STAT=y +CONFIG_ZCACHE=y +CONFIG_PROCESS_RECLAIM=y +CONFIG_SECCOMP=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_SWP_EMULATION=y +CONFIG_CP15_BARRIER_EMULATION=y +CONFIG_SETEND_EMULATION=y +CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=0 +# CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_DEBUG=y +CONFIG_SUSPEND_TIME=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_FREQ=y +CONFIG_SCHED_FREQ_INPUT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM_USER=y +CONFIG_XFRM_STATISTICS=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_HARDIDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +CONFIG_NETFILTER_XT_TARGET_NOTRACK=y +CONFIG_NETFILTER_XT_TARGET_TEE=y +CONFIG_NETFILTER_XT_TARGET_TPROXY=y +CONFIG_NETFILTER_XT_TARGET_TRACE=y +CONFIG_NETFILTER_XT_TARGET_SECMARK=y +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_DSCP=y +CONFIG_NETFILTER_XT_MATCH_ESP=y +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NATTYPE_MODULE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_RAW=y +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +CONFIG_BRIDGE_NF_EBTABLES=y +CONFIG_BRIDGE_EBT_BROUTE=y +CONFIG_L2TP=y +CONFIG_L2TP_DEBUGFS=y +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=y +CONFIG_L2TP_ETH=y +CONFIG_BRIDGE=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=y +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CMP=y +CONFIG_NET_EMATCH_NBYTE=y +CONFIG_NET_EMATCH_U32=y +CONFIG_NET_EMATCH_META=y +CONFIG_NET_EMATCH_TEXT=y +CONFIG_NET_CLS_ACT=y +CONFIG_RMNET_DATA=y +CONFIG_RMNET_DATA_FC=y +CONFIG_RMNET_DATA_DEBUG_PKT=n +CONFIG_SOCKEV_NLMCAST=y +CONFIG_BT=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=y +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=y +CONFIG_MSM_BT_POWER=y +CONFIG_CFG80211=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_RFKILL=y +CONFIG_NFC_NQ=y +CONFIG_IPC_ROUTER=y +CONFIG_IPC_ROUTER_SECURITY=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +CONFIG_DMA_CMA=y +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_UID_STAT=y +CONFIG_QSEECOM=y +CONFIG_HDCP_QSEECOM=y +CONFIG_UID_CPUTIME=y +CONFIG_USB_EXT_TYPE_C_PERICOM=y +CONFIG_MSM_ULTRASOUND=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_UFSHCD=y +CONFIG_SCSI_UFSHCD_PLATFORM=y +CONFIG_SCSI_UFS_QCOM=y +CONFIG_SCSI_UFS_QCOM_ICE=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_REQ_CRYPT=y +CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y +CONFIG_NETDEVICES=y +CONFIG_DUMMY=y +CONFIG_TUN=y +CONFIG_RNDIS_IPA=y +CONFIG_MSM_RMNET_BAM=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOL2TP=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_WCNSS_CORE=y +CONFIG_WCNSS_CORE_PRONTO=y +CONFIG_WCNSS_REGISTER_DUMP_ON_BITE=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y +CONFIG_CNSS_CRYPTO=y +CONFIG_ATH_CARDS=y +CONFIG_WIL6210=m +CONFIG_CNSS=y +CONFIG_CLD_LL_CORE=y +CONFIG_BUS_AUTO_SUSPEND=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_INPUT_KEYRESET=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v26=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GEN_VKEYS=y +CONFIG_TOUCHSCREEN_FT5336=y +CONFIG_FT_SECURE_TOUCH=y +CONFIG_TOUCHSCREEN_MAXIM_STI=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_HBTP_INPUT=n +CONFIG_INPUT_KEYCHORD=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_GPIO=y +# CONFIG_VT is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_DEVMEM is not set +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_MSM_HS=y +CONFIG_SERIAL_MSM_SMD=y +CONFIG_DIAG_CHAR=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_MSM_SMD_PKT=y +CONFIG_MSM_ADSPRPC=y +CONFIG_MSM_RDBG=m +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MSM_V2=y +CONFIG_SLIMBUS=y +CONFIG_SLIMBUS_MSM_NGD=y +CONFIG_SOUNDWIRE=y +CONFIG_SPI=y +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=m +CONFIG_PINCTRL_MSM8952=y +CONFIG_PINCTRL_MSM8937=y +CONFIG_PINCTRL_MSMCOBALT=y +CONFIG_PINCTRL_MSM8917=y +CONFIG_PINCTRL_MSM8940=y +CONFIG_PINCTRL_MSM8953=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_QPNP_PIN=y +CONFIG_SMB1351_USB_CHARGER=n +CONFIG_SMB135X_CHARGER=n +CONFIG_QPNP_SMBCHARGER=y +CONFIG_QPNP_FG=y +CONFIG_BATTERY_BCL=y +CONFIG_MSM_BCL_CTL=y +CONFIG_MSM_BCL_PERIPHERAL_CTL=y +CONFIG_POWER_RESET_MSM=y +CONFIG_MSM_DLOAD_MODE=y +CONFIG_MSM_PM=y +CONFIG_MSM_APM=y +CONFIG_SENSORS_EPM_ADC=y +CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y +CONFIG_SENSORS_QPNP_ADC_CURRENT=y +CONFIG_THERMAL=y +CONFIG_THERMAL_TSENS8974=y +CONFIG_LIMITS_MONITOR=y +CONFIG_LIMITS_LITE_HW=y +CONFIG_THERMAL_MONITOR=y +CONFIG_THERMAL_QPNP=y +CONFIG_THERMAL_QPNP_ADC_TM=y +CONFIG_WCD9335_CODEC=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_STUB=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_MEM_ACC=y +CONFIG_REGULATOR_RPM_SMD=y +CONFIG_REGULATOR_QPNP=y +CONFIG_REGULATOR_QPNP_LABIBB=y +CONFIG_REGULATOR_SPM=y +CONFIG_REGULATOR_CPR=y +CONFIG_REGULATOR_CPR3_HMSS=y +CONFIG_REGULATOR_CPR3_MMSS=y +CONFIG_REGULATOR_KRYO=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_PLATFORM=y +CONFIG_MSM_VIDC_V4L2=y +CONFIG_MSM_VIDC_VMEM=y +CONFIG_MSM_VIDC_GOVERNORS=y +CONFIG_MSM_CAMERA=y +CONFIG_MSMB_CAMERA=y +CONFIG_MSM_CAMERA_SENSOR=y +CONFIG_MSM_CPP=y +CONFIG_MSM_CCI=y +CONFIG_MSM_CSI20_HEADER=y +CONFIG_MSM_CSI22_HEADER=y +CONFIG_MSM_CSI30_HEADER=y +CONFIG_MSM_CSI31_HEADER=y +CONFIG_MSM_CSIPHY=y +CONFIG_MSM_CSID=y +CONFIG_MSM_EEPROM=y +CONFIG_MSM_ISPIF=y +CONFIG_MSM_ISPIF_V2=y +CONFIG_IMX134=y +CONFIG_IMX132=y +CONFIG_OV9724=y +CONFIG_OV5648=y +CONFIG_GC0339=y +CONFIG_OV8825=y +CONFIG_OV8865=y +CONFIG_s5k4e1=y +CONFIG_OV12830=y +CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE=y +CONFIG_MSMB_JPEG=y +CONFIG_MSM_FD=y +CONFIG_RADIO_IRIS=y +CONFIG_RADIO_IRIS_TRANSPORT=y +CONFIG_RADIO_SILABS=y +CONFIG_MSM_KGSL=y +CONFIG_FB=y +CONFIG_FB_MSM=y +CONFIG_MSM_DBA=y +CONFIG_MSM_DBA_ADV7533=y +CONFIG_FB_MSM_MDSS=y +CONFIG_FB_MSM_MDSS_WRITEBACK=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_MSM8X16=y +CONFIG_SND_SOC_AW87319=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_APPLE=y +CONFIG_HID_ELECOM=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MSM=y +CONFIG_USB_EHCI_MSM_HSIC=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_DWC3=y +CONFIG_USB_SERIAL=y +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MSM_HSPHY=y +CONFIG_USB_MSM_SSPHY_QMP=y +CONFIG_MSM_QUSB_PHY=y +CONFIG_DUAL_ROLE_USB_INTF=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_DEBUG_FS=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_CI13XXX_MSM=y +CONFIG_USB_G_ANDROID=y +CONFIG_MMC=y +CONFIG_MMC_PERF_PROFILING=n +CONFIG_MMC_CLKGATE=y +CONFIG_MMC_PARANOID_SD_INIT=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +CONFIG_MMC_TEST=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +CONFIG_MMC_CQ_HCI=y +CONFIG_LEDS_QPNP=y +CONFIG_LEDS_QPNP_FLASH=y +CONFIG_LEDS_QPNP_WLED=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_SWITCH=y +CONFIG_EDAC=y +CONFIG_EDAC_MM_EDAC=y +CONFIG_EDAC_CORTEX_ARM64=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_CE=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_QPNP=y +CONFIG_DMADEVICES=y +CONFIG_QCOM_SPS_DMA=y +CONFIG_UIO=y +CONFIG_UIO_MSM_SHAREDMEM=y +CONFIG_STAGING=y +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_TIMED_GPIO=y +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_SW_SYNC_USER=y +CONFIG_ION=y +CONFIG_ION_MSM=y +CONFIG_MSM_AVTIMER=y +CONFIG_MSM_BUS_SCALING=y +CONFIG_BUS_TOPOLOGY_ADHOC=y +CONFIG_QPNP_POWER_ON=y +CONFIG_QPNP_REVID=y +CONFIG_QPNP_COINCELL=y +CONFIG_SPS=y +CONFIG_USB_BAM=y +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_IPA=y +CONFIG_RMNET_IPA=y +CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y +CONFIG_MSM_SPMI=y +CONFIG_MSM_SPMI_PMIC_ARB=y +CONFIG_MSM_QPNP_INT=y +CONFIG_CP_ACCESS64=y +CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_MSM_MEMORY_DUMP_V2=y +CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CPUSS_DUMP=y +CONFIG_MSM_COMMON_LOG=y +CONFIG_MSM_DDR_HEALTH=y +CONFIG_MSM_WATCHDOG_V2=y +CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y +CONFIG_MSM_RPM_SMD=y +CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG=y +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_STATS_LOG=y +CONFIG_MSM_RUN_QUEUE_STATS=y +CONFIG_MSM_SCM=y +CONFIG_MSM_SCM_XPU=y +CONFIG_MSM_MPM_OF=y +CONFIG_MSM_SMEM=y +CONFIG_MSM_SMD=y +CONFIG_MSM_SMD_DEBUG=n +CONFIG_MSM_GLINK=y +CONFIG_MSM_GLINK_LOOPBACK_SERVER=y +CONFIG_MSM_GLINK_SMD_XPRT=y +CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y +CONFIG_MSM_SMEM_LOGGING=y +CONFIG_MSM_SMP2P=y +CONFIG_MSM_SMP2P_TEST=y +CONFIG_MSM_SPM=y +CONFIG_MSM_L2_SPM=y +CONFIG_MSM_QMI_INTERFACE=y +CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y +CONFIG_MSM_EVENT_TIMER=y +CONFIG_MSM_SUBSYSTEM_RESTART=y +CONFIG_MSM_SYSMON_COMM=y +CONFIG_MSM_PIL=y +CONFIG_MSM_PIL_SSR_GENERIC=y +CONFIG_MSM_PIL_MSS_QDSP6V5=y +CONFIG_MSM_BAM_DMUX=y +CONFIG_MSM_PERFORMANCE=y +# CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y +CONFIG_MEM_SHARE_QMI_SERVICE=y +CONFIG_MSM_CLK_CONTROLLER_V2=y +CONFIG_MSM_MDSS_PLL=y +CONFIG_REMOTE_SPINLOCK_MSM=y +CONFIG_MSM_IOMMU_V1=y +CONFIG_ARM_SMMU=y +CONFIG_IOMMU_DEBUG=y +CONFIG_IOMMU_TESTS=y +CONFIG_SPDM_SCM=y +CONFIG_DEVFREQ_SPDM=y +CONFIG_PWM=y +CONFIG_PWM_QPNP=y +CONFIG_ARM_GIC_PANIC_HANDLER=y +CONFIG_CORESIGHT=n +CONFIG_CORESIGHT_EVENT=n +CONFIG_CORESIGHT_FUSE=n +CONFIG_CORESIGHT_CTI=n +CONFIG_CORESIGHT_CTI_SAVE_DISABLE=n +CONFIG_CORESIGHT_TMC=n +CONFIG_CORESIGHT_TPIU=n +CONFIG_CORESIGHT_FUNNEL=n +CONFIG_CORESIGHT_REPLICATOR=n +CONFIG_CORESIGHT_STM=n +CONFIG_CORESIGHT_HWEVENT=n +CONFIG_SENSORS_SSC=y +CONFIG_MSM_TZ_LOG=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_INFO=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_RECURSIVE_FAULT=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_IPC_LOGGING=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_DEBUG_RODATA=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_LSM_MMAP_MIN_ADDR=4096 +CONFIG_SECURITY_SELINUX=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_DEV_QCRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_MSM_QCE=y +CONFIG_CRYPTO_DEV_QCEDEV=y +CONFIG_CRYPTO_DEV_OTA_CRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_ICE=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_QMI_ENCDEC=y +CONFIG_CPUMAXFREQ=y +CONFIG_SERIAL_NUM=y +CONFIG_SECBOOT_FUSE=y +## MIUI ADD:START +## Multi userspace config support +CONFIG_ECRYPT_FS=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XTS=y +CONFIG_NAMESPACES=y +#CONFIG_UTS_NS=y +#CONFIG_IPC_NS=y +## do not turn on user-namespaces as it enables +## CONFIG_UIDGID_STRICT_TYPE_CHECKS, which results in several compile +## errors +#CONFIG_USER_NS=y +#CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_VETH=y +## END +CONFIG_FINGERPRINT=y +CONFIG_FINGERPRINT_GOODIX_GF3208=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_AW2013=y +CONFIG_FINGERPRINT_FPC1020=y + +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DISABLE_TEMP_PROTECT=n +CONFIG_A13N_PMI8952=y + +#CONFIG_ZRAM_DEBUG=y +CONFIG_SWAP=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_ANDROID_WHETSTONE=y +CONFIG_CGROUP_MEM_RES_CTLR=y +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y + +#MIUI ADD +#Add CIFS Config +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_UTF8=y +#MIUI END diff --git a/arch/arm64/configs/S88536AA2_defconfig b/arch/arm64/configs/S88536AA2_defconfig new file mode 100644 index 0000000000000..77d39e6ab7b60 --- /dev/null +++ b/arch/arm64/configs/S88536AA2_defconfig @@ -0,0 +1,773 @@ +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_NOCB_CPU=y +CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=n +CONFIG_CGROUPS=y +CONFIG_CGROUP_DEBUG=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_CPUSETS=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y +CONFIG_SCHED_QHMP=y +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_PID_NS is not set +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_ACL=y +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="cp850" +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_KALLSYMS_ALL=y +CONFIG_PSTORE_LAST_KMSG=y +CONFIG_EMBEDDED=y +CONFIG_PROFILING=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SIG=y +CONFIG_MODULE_SIG_FORCE=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ARCH_MSM=y +CONFIG_ARCH_MSM8916=y +CONFIG_ARCH_MSM8917=y +CONFIG_ARCH_MSM8920=y +CONFIG_ARCH_MSM8940=y +CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_MSM8937=y +CONFIG_ARCH_MSMCOBALT=y +CONFIG_PCI_MSM=y +CONFIG_SMP=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_CLEANCACHE=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_ZSMALLOC=y +CONFIG_ZSMALLOC_STAT=y +CONFIG_ZCACHE=y +CONFIG_PROCESS_RECLAIM=y +CONFIG_SECCOMP=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_SWP_EMULATION=y +CONFIG_CP15_BARRIER_EMULATION=y +CONFIG_SETEND_EMULATION=y +CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=0 +# CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_DEBUG=y +CONFIG_SUSPEND_TIME=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_FREQ=y +CONFIG_SCHED_FREQ_INPUT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM_USER=y +CONFIG_XFRM_STATISTICS=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_HARDIDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +CONFIG_NETFILTER_XT_TARGET_NOTRACK=y +CONFIG_NETFILTER_XT_TARGET_TEE=y +CONFIG_NETFILTER_XT_TARGET_TPROXY=y +CONFIG_NETFILTER_XT_TARGET_TRACE=y +CONFIG_NETFILTER_XT_TARGET_SECMARK=y +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_DSCP=y +CONFIG_NETFILTER_XT_MATCH_ESP=y +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NATTYPE_MODULE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_RAW=y +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +CONFIG_BRIDGE_NF_EBTABLES=y +CONFIG_BRIDGE_EBT_BROUTE=y +CONFIG_L2TP=y +CONFIG_L2TP_DEBUGFS=y +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=y +CONFIG_L2TP_ETH=y +CONFIG_BRIDGE=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=y +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CMP=y +CONFIG_NET_EMATCH_NBYTE=y +CONFIG_NET_EMATCH_U32=y +CONFIG_NET_EMATCH_META=y +CONFIG_NET_EMATCH_TEXT=y +CONFIG_NET_CLS_ACT=y +CONFIG_RMNET_DATA=y +CONFIG_RMNET_DATA_FC=y +CONFIG_RMNET_DATA_DEBUG_PKT=y +CONFIG_SOCKEV_NLMCAST=y +CONFIG_BT=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=y +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=y +CONFIG_MSM_BT_POWER=y +CONFIG_CFG80211=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_RFKILL=y +CONFIG_NFC_NQ=y +CONFIG_IPC_ROUTER=y +CONFIG_IPC_ROUTER_SECURITY=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +CONFIG_DMA_CMA=y +CONFIG_CMA_SIZE_MBYTES=40 +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_UID_STAT=y +CONFIG_QSEECOM=y +CONFIG_HDCP_QSEECOM=y +CONFIG_UID_CPUTIME=y +CONFIG_USB_EXT_TYPE_C_PERICOM=y +CONFIG_MSM_ULTRASOUND=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_UFSHCD=y +CONFIG_SCSI_UFSHCD_PLATFORM=y +CONFIG_SCSI_UFS_QCOM=y +CONFIG_SCSI_UFS_QCOM_ICE=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_REQ_CRYPT=y +CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y +CONFIG_NETDEVICES=y +CONFIG_DUMMY=y +CONFIG_TUN=y +CONFIG_RNDIS_IPA=y +CONFIG_MSM_RMNET_BAM=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOL2TP=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_WCNSS_CORE=y +CONFIG_WCNSS_CORE_PRONTO=y +CONFIG_WCNSS_REGISTER_DUMP_ON_BITE=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y +CONFIG_CNSS_CRYPTO=y +CONFIG_ATH_CARDS=y +CONFIG_WIL6210=m +CONFIG_CNSS=y +CONFIG_CLD_LL_CORE=y +CONFIG_BUS_AUTO_SUSPEND=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_INPUT_KEYRESET=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v26=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GEN_VKEYS=y +CONFIG_TOUCHSCREEN_FT5336=y +CONFIG_FT_SECURE_TOUCH=y +CONFIG_TOUCHSCREEN_MAXIM_STI=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_HBTP_INPUT=n +CONFIG_INPUT_KEYCHORD=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_GPIO=y +# CONFIG_VT is not set +# CONFIG_LEGACY_PTYS is not set +CONFIG_SERIAL_MSM_HS=y +CONFIG_SERIAL_MSM_HSL=y +CONFIG_SERIAL_MSM_HSL_CONSOLE=y +CONFIG_SERIAL_MSM_SMD=y +CONFIG_DIAG_CHAR=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_MSM_SMD_PKT=y +CONFIG_MSM_ADSPRPC=y +CONFIG_MSM_RDBG=m +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MSM_V2=y +CONFIG_SLIMBUS=y +CONFIG_SLIMBUS_MSM_NGD=y +CONFIG_SOUNDWIRE=y +CONFIG_SPI=y +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=m +CONFIG_PINCTRL_MSM8952=y +CONFIG_PINCTRL_MSM8937=y +CONFIG_PINCTRL_MSMCOBALT=y +CONFIG_PINCTRL_MSM8917=y +CONFIG_PINCTRL_MSM8940=y +CONFIG_PINCTRL_MSM8953=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_QPNP_PIN=y +CONFIG_SMB1351_USB_CHARGER=n +CONFIG_SMB135X_CHARGER=n +CONFIG_QPNP_SMBCHARGER=y +CONFIG_QPNP_FG=y +CONFIG_BATTERY_BCL=y +CONFIG_MSM_BCL_CTL=y +CONFIG_MSM_BCL_PERIPHERAL_CTL=y +CONFIG_POWER_RESET_MSM=y +CONFIG_MSM_DLOAD_MODE=y +CONFIG_MSM_PM=y +CONFIG_MSM_APM=y +CONFIG_SENSORS_EPM_ADC=y +CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y +CONFIG_SENSORS_QPNP_ADC_CURRENT=y +CONFIG_THERMAL=y +CONFIG_THERMAL_TSENS8974=y +CONFIG_LIMITS_MONITOR=y +CONFIG_LIMITS_LITE_HW=y +CONFIG_THERMAL_MONITOR=y +CONFIG_THERMAL_QPNP=y +CONFIG_THERMAL_QPNP_ADC_TM=y +CONFIG_WCD9335_CODEC=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_STUB=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_MEM_ACC=y +CONFIG_REGULATOR_RPM_SMD=y +CONFIG_REGULATOR_QPNP=y +CONFIG_REGULATOR_QPNP_LABIBB=y +CONFIG_REGULATOR_SPM=y +CONFIG_REGULATOR_CPR=y +CONFIG_REGULATOR_CPR3_HMSS=y +CONFIG_REGULATOR_CPR3_MMSS=y +CONFIG_REGULATOR_KRYO=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_PLATFORM=y +CONFIG_MSM_VIDC_V4L2=y +CONFIG_MSM_VIDC_VMEM=y +CONFIG_MSM_VIDC_GOVERNORS=y +CONFIG_MSM_CAMERA=y +CONFIG_MSM_CAMERA_DEBUG=y +CONFIG_MSMB_CAMERA=y +CONFIG_MSMB_CAMERA_DEBUG=y +CONFIG_MSM_CAMERA_SENSOR=y +CONFIG_MSM_CPP=y +CONFIG_MSM_CCI=y +CONFIG_MSM_CSI20_HEADER=y +CONFIG_MSM_CSI22_HEADER=y +CONFIG_MSM_CSI30_HEADER=y +CONFIG_MSM_CSI31_HEADER=y +CONFIG_MSM_CSIPHY=y +CONFIG_MSM_CSID=y +CONFIG_MSM_EEPROM=y +CONFIG_MSM_ISPIF_V2=y +CONFIG_IMX134=y +CONFIG_IMX132=y +CONFIG_OV9724=y +CONFIG_OV5648=y +CONFIG_GC0339=y +CONFIG_OV8825=y +CONFIG_OV8865=y +CONFIG_s5k4e1=y +CONFIG_OV12830=y +CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE=y +CONFIG_MSMB_JPEG=y +CONFIG_MSM_FD=y +CONFIG_RADIO_IRIS=y +CONFIG_RADIO_IRIS_TRANSPORT=y +CONFIG_RADIO_SILABS=y +CONFIG_MSM_KGSL=y +CONFIG_FB=y +CONFIG_FB_MSM=y +CONFIG_MSM_DBA=y +CONFIG_MSM_DBA_ADV7533=y +CONFIG_FB_MSM_MDSS=y +CONFIG_FB_MSM_MDSS_WRITEBACK=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_MSM8X16=y +CONFIG_SND_SOC_AW87319=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_APPLE=y +CONFIG_HID_ELECOM=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MSM=y +CONFIG_USB_EHCI_MSM_HSIC=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_DWC3=y +CONFIG_USB_SERIAL=y +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MSM_HSPHY=y +CONFIG_USB_MSM_SSPHY_QMP=y +CONFIG_MSM_QUSB_PHY=y +CONFIG_DUAL_ROLE_USB_INTF=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_DEBUG_FS=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_CI13XXX_MSM=y +CONFIG_USB_G_ANDROID=y +CONFIG_MMC=y +CONFIG_MMC_PERF_PROFILING=y +CONFIG_MMC_CLKGATE=y +CONFIG_MMC_PARANOID_SD_INIT=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +CONFIG_MMC_TEST=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +CONFIG_MMC_CQ_HCI=y +CONFIG_LEDS_QPNP=y +CONFIG_LEDS_QPNP_FLASH=y +CONFIG_LEDS_QPNP_WLED=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_SWITCH=y +CONFIG_EDAC=y +CONFIG_EDAC_MM_EDAC=y +CONFIG_EDAC_CORTEX_ARM64=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_CE=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_QPNP=y +CONFIG_DMADEVICES=y +CONFIG_QCOM_SPS_DMA=y +CONFIG_UIO=y +CONFIG_UIO_MSM_SHAREDMEM=y +CONFIG_STAGING=y +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_TIMED_GPIO=y +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_SW_SYNC_USER=y +CONFIG_ION=y +CONFIG_ION_MSM=y +CONFIG_MSM_AVTIMER=y +CONFIG_MSM_BUS_SCALING=y +CONFIG_BUS_TOPOLOGY_ADHOC=y +CONFIG_QPNP_POWER_ON=y +CONFIG_QPNP_REVID=y +CONFIG_QPNP_COINCELL=y +CONFIG_SPS=y +CONFIG_USB_BAM=y +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_IPA=y +CONFIG_RMNET_IPA=y +CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y +CONFIG_MSM_SPMI=y +CONFIG_MSM_SPMI_PMIC_ARB=y +CONFIG_MSM_QPNP_INT=y +CONFIG_CP_ACCESS64=y +CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_MSM_MEMORY_DUMP_V2=y +CONFIG_MSM_DEBUG_LAR_UNLOCK=y +CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CPUSS_DUMP=y +CONFIG_MSM_COMMON_LOG=y +CONFIG_MSM_DDR_HEALTH=y +CONFIG_MSM_WATCHDOG_V2=y +CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y +CONFIG_MSM_CORE_HANG_DETECT=y +CONFIG_MSM_RPM_SMD=y +CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG=y +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_STATS_LOG=y +CONFIG_MSM_RUN_QUEUE_STATS=y +CONFIG_MSM_SCM=y +CONFIG_MSM_SCM_XPU=y +CONFIG_MSM_MPM_OF=y +CONFIG_MSM_SMEM=y +CONFIG_MSM_SMD=y +CONFIG_MSM_SMD_DEBUG=y +CONFIG_MSM_GLINK=y +CONFIG_MSM_GLINK_LOOPBACK_SERVER=y +CONFIG_MSM_GLINK_SMD_XPRT=y +CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y +CONFIG_MSM_SMEM_LOGGING=y +CONFIG_MSM_SMP2P=y +CONFIG_MSM_SMP2P_TEST=y +CONFIG_MSM_SPM=y +CONFIG_MSM_L2_SPM=y +CONFIG_MSM_QMI_INTERFACE=y +CONFIG_MSM_DCC=y +CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y +CONFIG_MSM_EVENT_TIMER=y +CONFIG_MSM_IPC_ROUTER_GLINK_XPRT=y +CONFIG_MSM_GLINK_PKT=y +CONFIG_MSM_SUBSYSTEM_RESTART=y +CONFIG_MSM_SYSMON_COMM=y +CONFIG_MSM_PIL=y +CONFIG_MSM_PIL_SSR_GENERIC=y +CONFIG_MSM_PIL_MSS_QDSP6V5=y +CONFIG_TRACER_PKT=y +CONFIG_MSM_BAM_DMUX=y +CONFIG_MSM_PERFORMANCE=y +# CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y +CONFIG_MEM_SHARE_QMI_SERVICE=y +CONFIG_MSM_CLK_CONTROLLER_V2=y +CONFIG_MSM_MDSS_PLL=y +CONFIG_REMOTE_SPINLOCK_MSM=y +CONFIG_MSM_IOMMU_V1=y +CONFIG_ARM_SMMU=y +CONFIG_IOMMU_DEBUG=y +CONFIG_IOMMU_DEBUG_TRACKING=y +CONFIG_IOMMU_TESTS=y +CONFIG_SPDM_SCM=y +CONFIG_DEVFREQ_SPDM=y +CONFIG_PWM=y +CONFIG_PWM_QPNP=y +CONFIG_ARM_GIC_PANIC_HANDLER=y +CONFIG_CORESIGHT=y +CONFIG_CORESIGHT_EVENT=y +CONFIG_CORESIGHT_FUSE=y +CONFIG_CORESIGHT_CTI=y +CONFIG_CORESIGHT_TMC=y +CONFIG_CORESIGHT_TPIU=y +CONFIG_CORESIGHT_FUNNEL=y +CONFIG_CORESIGHT_REPLICATOR=y +CONFIG_CORESIGHT_TPDA=y +CONFIG_CORESIGHT_TPDM=y +CONFIG_CORESIGHT_DBGUI=y +CONFIG_CORESIGHT_STM=y +CONFIG_CORESIGHT_HWEVENT=y +CONFIG_CORESIGHT_ETMV4=y +CONFIG_CORESIGHT_REMOTE_ETM=y +CONFIG_CORESIGHT_QPDI=y +CONFIG_SENSORS_SSC=y +CONFIG_MSM_TZ_LOG=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_LOG_BUF_MAGIC=y +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DEBUG_INFO=y +CONFIG_PAGE_OWNER=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_SLUB_DEBUG_PANIC_ON=y +CONFIG_DEBUG_OBJECTS=y +CONFIG_DEBUG_OBJECTS_FREE=y +CONFIG_DEBUG_OBJECTS_TIMERS=y +CONFIG_DEBUG_OBJECTS_WORK=y +CONFIG_DEBUG_OBJECTS_RCU_HEAD=y +CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y +CONFIG_SLUB_DEBUG_ON=y +CONFIG_DEBUG_KMEMLEAK=y +CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4000 +CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y +CONFIG_DEBUG_STACK_USAGE=y +CONFIG_DEBUG_MEMORY_INIT=y +CONFIG_LOCKUP_DETECTOR=y +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y +# CONFIG_DETECT_HUNG_TASK is not set +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_RECURSIVE_FAULT=y +CONFIG_PANIC_ON_SCHED_BUG=y +CONFIG_PANIC_ON_RT_THROTTLING=y +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_DEBUG_SPINLOCK=y +CONFIG_DEBUG_MUTEXES=y +CONFIG_DEBUG_ATOMIC_SLEEP=y +CONFIG_DEBUG_LIST=y +CONFIG_FAULT_INJECTION=y +CONFIG_FAIL_PAGE_ALLOC=y +CONFIG_UFS_FAULT_INJECTION=y +CONFIG_FAULT_INJECTION_DEBUG_FS=y +CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y +CONFIG_MSM_RTB=y +CONFIG_MSM_RTB_SEPARATE_CPUS=y +CONFIG_IPC_LOGGING=y +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_PANIC_ON_DATA_CORRUPTION=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_FREE_PAGES_RDONLY=y +CONFIG_KERNEL_TEXT_RDONLY=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_LSM_MMAP_MIN_ADDR=4096 +CONFIG_SECURITY_SELINUX=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_DEV_QCRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_MSM_QCE=y +CONFIG_CRYPTO_DEV_QCEDEV=y +CONFIG_CRYPTO_DEV_OTA_CRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_ICE=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_QMI_ENCDEC=y +CONFIG_CPUMAXFREQ=y +CONFIG_SERIAL_NUM=y +CONFIG_SECBOOT_FUSE=y +## MIUI ADD:START +## Multi userspace config support +CONFIG_ECRYPT_FS=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XTS=y +CONFIG_NAMESPACES=y +#CONFIG_UTS_NS=y +#CONFIG_IPC_NS=y +## do not turn on user-namespaces as it enables +## CONFIG_UIDGID_STRICT_TYPE_CHECKS, which results in several compile +## errors +#CONFIG_USER_NS=y +#CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_VETH=y +## END +CONFIG_FINGERPRINT=y +CONFIG_FINGERPRINT_GOODIX_GF3208=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_AW2013=y +CONFIG_FINGERPRINT_FPC1020=y +CONFIG_DISABLE_TEMP_PROTECT=n +CONFIG_A13N_PMI8952=y + +#CONFIG_ZRAM_DEBUG=y +CONFIG_SWAP=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_ANDROID_WHETSTONE=y +CONFIG_CGROUP_MEM_RES_CTLR=y +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y + +#MIUI ADD +#Add CIFS Config +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_UTF8=y +#MIUI END + diff --git a/arch/arm64/configs/rosy-perf_defconfig b/arch/arm64/configs/rosy-perf_defconfig new file mode 100644 index 0000000000000..772a4b361c24a --- /dev/null +++ b/arch/arm64/configs/rosy-perf_defconfig @@ -0,0 +1,715 @@ +CONFIG_LOCALVERSION="-perf" +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_NOCB_CPU=y +CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=n +CONFIG_CGROUPS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CPUSETS=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_SCHED_HMP=y +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_PID_NS is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_KALLSYMS_ALL=y +CONFIG_EMBEDDED=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PROFILING=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SIG=y +CONFIG_MODULE_SIG_FORCE=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ARCH_MSM=y +CONFIG_ARCH_MSM8916=y +CONFIG_ARCH_MSM8940=y +CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_SDM450=y +CONFIG_ARCH_MSM8937=y +CONFIG_ARCH_MSMCOBALT=y +CONFIG_PCI_MSM=y +CONFIG_SMP=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_CLEANCACHE=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_ZSMALLOC=y +CONFIG_ZCACHE=y +CONFIG_PROCESS_RECLAIM=y +CONFIG_SECCOMP=y +CONFIG_RTMM=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_SWP_EMULATION=y +CONFIG_CP15_BARRIER_EMULATION=y +CONFIG_SETEND_EMULATION=y +CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=0 +# CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_DEBUG=y +CONFIG_SUSPEND_TIME=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_FREQ=y +CONFIG_SCHED_FREQ_INPUT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM_USER=y +CONFIG_XFRM_STATISTICS=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_HARDIDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +CONFIG_NETFILTER_XT_TARGET_NOTRACK=y +CONFIG_NETFILTER_XT_TARGET_TEE=y +CONFIG_NETFILTER_XT_TARGET_TPROXY=y +CONFIG_NETFILTER_XT_TARGET_TRACE=y +CONFIG_NETFILTER_XT_TARGET_SECMARK=y +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_DSCP=y +CONFIG_NETFILTER_XT_MATCH_ESP=y +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NATTYPE_MODULE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_RAW=y +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +CONFIG_BRIDGE_NF_EBTABLES=y +CONFIG_BRIDGE_EBT_BROUTE=y +CONFIG_L2TP=y +CONFIG_L2TP_DEBUGFS=y +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=y +CONFIG_L2TP_ETH=y +CONFIG_BRIDGE=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=y +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CMP=y +CONFIG_NET_EMATCH_NBYTE=y +CONFIG_NET_EMATCH_U32=y +CONFIG_NET_EMATCH_META=y +CONFIG_NET_EMATCH_TEXT=y +CONFIG_NET_CLS_ACT=y +CONFIG_RMNET_DATA=y +CONFIG_RMNET_DATA_FC=y +#CONFIG_RMNET_DATA_DEBUG_PKT=y +CONFIG_SOCKEV_NLMCAST=y +CONFIG_BT=y +CONFIG_MSM_BT_POWER=y +CONFIG_CFG80211=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_RFKILL=y +CONFIG_NFC_NQ=y +CONFIG_IPC_ROUTER=y +CONFIG_IPC_ROUTER_SECURITY=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +CONFIG_DMA_CMA=y +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_UID_STAT=y +CONFIG_QSEECOM=y +CONFIG_HDCP_QSEECOM=y +CONFIG_UID_CPUTIME=y +CONFIG_USB_EXT_TYPE_C_PERICOM=y +CONFIG_MSM_ULTRASOUND=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_UFSHCD=y +CONFIG_SCSI_UFSHCD_PLATFORM=y +CONFIG_SCSI_UFS_QCOM=y +CONFIG_SCSI_UFS_QCOM_ICE=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_REQ_CRYPT=y +CONFIG_DM_UEVENT=y +CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y +CONFIG_NETDEVICES=y +CONFIG_DUMMY=y +CONFIG_TUN=y +CONFIG_RNDIS_IPA=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOL2TP=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_WCNSS_CORE=y +CONFIG_WCNSS_CORE_PRONTO=y +CONFIG_WCNSS_REGISTER_DUMP_ON_BITE=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y +CONFIG_CNSS_CRYPTO=y +CONFIG_ATH_CARDS=y +CONFIG_WIL6210=m +CONFIG_CLD_LL_CORE=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_INPUT_KEYRESET=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_FTS=y +CONFIG_TOUCHSCREEN_FT8006M=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GEN_VKEYS=y +CONFIG_TOUCHSCREEN_FT5X06=y +CONFIG_TOUCHSCREEN_MAXIM_STI=y +CONFIG_INPUT_MISC=y +#CONFIG_INPUT_HBTP_INPUT=y +CONFIG_INPUT_KEYCHORD=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_GPIO=y +# CONFIG_VT is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_DEVMEM is not set +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_MSM_HS=y +CONFIG_SERIAL_MSM_SMD=y +CONFIG_DIAG_CHAR=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_MSM_SMD_PKT=y +CONFIG_MSM_ADSPRPC=y +CONFIG_MSM_RDBG=m +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MSM_V2=y +CONFIG_SLIMBUS=y +CONFIG_SLIMBUS_MSM_NGD=y +CONFIG_SOUNDWIRE=y +CONFIG_SPI=y +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=y +CONFIG_PINCTRL_MSM8952=y +CONFIG_PINCTRL_MSM8937=y +CONFIG_PINCTRL_MSMCOBALT=y +CONFIG_PINCTRL_MSM8940=y +CONFIG_PINCTRL_MSM8953=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_QPNP_PIN=y +CONFIG_SMB1351_USB_CHARGER=y +CONFIG_SMB135X_CHARGER=y +CONFIG_QPNP_SMBCHARGER=y +CONFIG_QPNP_FG=y +CONFIG_BATTERY_BCL=y +CONFIG_QPNP_TYPEC=n +CONFIG_MSM_BCL_CTL=y +CONFIG_MSM_BCL_PERIPHERAL_CTL=y +CONFIG_POWER_RESET_MSM=y +CONFIG_MSM_DLOAD_MODE=y +CONFIG_MSM_PM=y +CONFIG_APSS_CORE_EA=y +CONFIG_MSM_APM=y +CONFIG_SENSORS_EPM_ADC=y +CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y +CONFIG_SENSORS_QPNP_ADC_CURRENT=y +CONFIG_THERMAL=y +CONFIG_THERMAL_TSENS8974=y +CONFIG_LIMITS_MONITOR=y +CONFIG_LIMITS_LITE_HW=y +CONFIG_THERMAL_MONITOR=y +CONFIG_THERMAL_QPNP=y +CONFIG_THERMAL_QPNP_ADC_TM=y +CONFIG_WCD9335_CODEC=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_STUB=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_MSM_GFX_LDO=y +CONFIG_REGULATOR_MEM_ACC=y +CONFIG_REGULATOR_RPM_SMD=y +CONFIG_REGULATOR_QPNP=y +CONFIG_REGULATOR_QPNP_LABIBB=y +CONFIG_REGULATOR_SPM=y +CONFIG_REGULATOR_CPR=y +CONFIG_REGULATOR_CPR3_HMSS=y +CONFIG_REGULATOR_CPR3_MMSS=y +CONFIG_REGULATOR_CPR4_APSS=y +CONFIG_REGULATOR_CPRH_KBSS=y +CONFIG_REGULATOR_KRYO=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_PLATFORM=y +CONFIG_MSM_VIDC_V4L2=y +CONFIG_MSM_VIDC_VMEM=y +CONFIG_MSM_VIDC_GOVERNORS=y +CONFIG_MSM_CAMERA=y +CONFIG_MSMB_CAMERA=y +CONFIG_MSM_CAMERA_SENSOR=y +CONFIG_MSM_CPP=y +CONFIG_MSM_CCI=y +CONFIG_MSM_CSI20_HEADER=y +CONFIG_MSM_CSI22_HEADER=y +CONFIG_MSM_CSI30_HEADER=y +CONFIG_MSM_CSI31_HEADER=y +CONFIG_MSM_CSIPHY=y +CONFIG_MSM_CSID=y +CONFIG_MSM_EEPROM=y +CONFIG_MSM_ISPIF=y +CONFIG_IMX134=y +CONFIG_IMX132=y +CONFIG_OV9724=y +CONFIG_OV5648=y +CONFIG_GC0339=y +CONFIG_OV8825=y +CONFIG_OV8865=y +CONFIG_s5k4e1=y +CONFIG_OV12830=y +CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE=y +CONFIG_MSMB_JPEG=y +CONFIG_MSM_FD=y +CONFIG_MSM_SDE_ROTATOR=y +CONFIG_RADIO_IRIS=y +CONFIG_RADIO_IRIS_TRANSPORT=y +CONFIG_RADIO_SILABS=y +CONFIG_MSM_KGSL=y +CONFIG_FB=y +CONFIG_FB_MSM=y +CONFIG_MSM_DBA=y +CONFIG_MSM_DBA_ADV7533=y +CONFIG_FB_MSM_MDSS=y +CONFIG_FB_MSM_MDSS_WRITEBACK=y +CONFIG_FB_MSM_MDSS_HDMI_PANEL=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_USB_AUDIO_QMI=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_MSM8X16=y +CONFIG_SND_SOC_AW87319=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_APPLE=y +CONFIG_HID_ELECOM=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MSM=y +CONFIG_USB_EHCI_MSM_HSIC=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_DWC3=y +CONFIG_USB_SERIAL=y +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MSM_HSPHY=y +CONFIG_USB_MSM_SSPHY_QMP=y +CONFIG_MSM_QUSB_PHY=y +CONFIG_DUAL_ROLE_USB_INTF=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_DEBUG_FS=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_CI13XXX_MSM=y +CONFIG_USB_G_ANDROID=y +CONFIG_MMC=y +#CONFIG_MMC_PERF_PROFILING=y +CONFIG_MMC_CLKGATE=y +CONFIG_MMC_PARANOID_SD_INIT=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +CONFIG_MMC_TEST=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +CONFIG_MMC_CQ_HCI=y +CONFIG_LEDS_QPNP=y +CONFIG_LEDS_QPNP_FLASH=y +CONFIG_LEDS_QPNP_WLED=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_SWITCH=y +CONFIG_EDAC=y +CONFIG_EDAC_MM_EDAC=y +CONFIG_EDAC_CORTEX_ARM64=y +CONFIG_EDAC_CORTEX_ARM64_DBE_IRQ_ONLY=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_QPNP=y +CONFIG_DMADEVICES=y +CONFIG_QCOM_SPS_DMA=y +CONFIG_UIO=y +CONFIG_UIO_MSM_SHAREDMEM=y +CONFIG_STAGING=y +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_TIMED_GPIO=y +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_SW_SYNC_USER=y +CONFIG_ION=y +CONFIG_ION_MSM=y +CONFIG_MSM_AVTIMER=y +CONFIG_MSM_BUS_SCALING=y +CONFIG_BUS_TOPOLOGY_ADHOC=y +CONFIG_QPNP_POWER_ON=y +CONFIG_QPNP_REVID=y +CONFIG_QPNP_COINCELL=y +CONFIG_SPS=y +CONFIG_USB_BAM=y +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_IPA=y +CONFIG_RMNET_IPA=y +CONFIG_QPNP_HAPTIC=y +CONFIG_MSM_SPMI=y +CONFIG_MSM_SPMI_PMIC_ARB=y +CONFIG_MSM_QPNP_INT=y +CONFIG_CP_ACCESS64=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_MSM_MEMORY_DUMP_V2=y +CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CPUSS_DUMP=y +CONFIG_MSM_COMMON_LOG=y +CONFIG_MSM_DDR_HEALTH=y +CONFIG_MSM_WATCHDOG_V2=y +CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y +CONFIG_MSM_RPM_SMD=y +CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG=y +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_STATS_LOG=y +CONFIG_MSM_RUN_QUEUE_STATS=y +CONFIG_MSM_SCM=y +CONFIG_MSM_SCM_XPU=y +CONFIG_MSM_MPM_OF=y +CONFIG_MSM_SMEM=y +CONFIG_MSM_SMD=y +#CONFIG_MSM_SMD_DEBUG=y +CONFIG_MSM_GLINK=y +CONFIG_MSM_GLINK_LOOPBACK_SERVER=y +CONFIG_MSM_GLINK_SMD_XPRT=y +CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y +#CONFIG_MSM_SPCOM=y +CONFIG_MSM_SMEM_LOGGING=y +CONFIG_MSM_SMP2P=y +CONFIG_MSM_SMP2P_TEST=y +CONFIG_MSM_SPM=y +CONFIG_MSM_L2_SPM=y +CONFIG_MSM_QMI_INTERFACE=y +CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y +CONFIG_MSM_EVENT_TIMER=y +CONFIG_MSM_TZ_SMMU=y +CONFIG_MSM_SUBSYSTEM_RESTART=y +CONFIG_MSM_SYSMON_COMM=y +CONFIG_MSM_PIL=y +CONFIG_MSM_PIL_SSR_GENERIC=y +CONFIG_MSM_PIL_MSS_QDSP6V5=y +CONFIG_ICNSS=y +CONFIG_MSM_BAM_DMUX=y +CONFIG_MSM_PERFORMANCE=y +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y +CONFIG_MEM_SHARE_QMI_SERVICE=y +CONFIG_MSM_CLK_CONTROLLER_V2=y +CONFIG_MSM_MDSS_PLL=y +CONFIG_REMOTE_SPINLOCK_MSM=y +CONFIG_MSM_IOMMU_V1=y +CONFIG_ARM_SMMU=y +CONFIG_IOMMU_DEBUG=y +CONFIG_IOMMU_TESTS=y +CONFIG_SPDM_SCM=y +CONFIG_DEVFREQ_SPDM=y +CONFIG_PWM=y +CONFIG_PWM_QPNP=y +CONFIG_ARM_GIC_PANIC_HANDLER=y +CONFIG_ARM_GIC_V3_ACL=y +#CONFIG_CORESIGHT=y +#CONFIG_CORESIGHT_EVENT=y +#CONFIG_CORESIGHT_FUSE=y +#CONFIG_CORESIGHT_CTI=y +#CONFIG_CORESIGHT_CTI_SAVE_DISABLE=y +#CONFIG_CORESIGHT_TMC=y +#CONFIG_CORESIGHT_TPIU=y +#CONFIG_CORESIGHT_FUNNEL=y +#CONFIG_CORESIGHT_REPLICATOR=y +#CONFIG_CORESIGHT_STM=y +#CONFIG_CORESIGHT_HWEVENT=y +CONFIG_SENSORS_SSC=y +CONFIG_MSM_TZ_LOG=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_INFO=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_RECURSIVE_FAULT=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_IPC_LOGGING=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_DEBUG_RODATA=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_LSM_MMAP_MIN_ADDR=4096 +CONFIG_SECURITY_SELINUX=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_DEV_QCRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_MSM_QCE=y +CONFIG_CRYPTO_DEV_QCEDEV=y +CONFIG_CRYPTO_DEV_OTA_CRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_ICE=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_QMI_ENCDEC=y +## MIUI ADD:START +## Multi userspace config support +CONFIG_ECRYPT_FS=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XTS=y +CONFIG_NAMESPACES=y +#CONFIG_UTS_NS=y +#CONFIG_IPC_NS=y +## do not turn on user-namespaces as it enables +## CONFIG_UIDGID_STRICT_TYPE_CHECKS, which results in several compile +## errors +#CONFIG_USER_NS=y +#CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_VETH=y +## END +CONFIG_LEDS_AW2013=y +CONFIG_D1_ROSY=y +CONFIG_CPUMAXFREQ=y +CONFIG_SERIAL_NUM=y +CONFIG_SECBOOT_FUSE=y +##enable RTB +#CONFIG_MSM_RTB=y +CONFIG_MSM_RTB_SEPARATE_CPUS=y +CONFIG_DYNAMIC_DEBUG=y +#CONFIG_DEBUG_SPINLOCK=y +CONFIG_MSM_DEBUG_LAR_UNLOCK=y +CONFIG_CORESIGHT_DBGUI=y +CONFIG_LEDS_GPIO=y +CONFIG_FINGERPRINT_ROSY=y +CONFIG_FINGERPRINT_GOODIX_GF3208_ROSY=y +CONFIG_FINGERPRINT_FPC1020_ROSY=y +CONFIG_SUSPEND_SKIP_SYNC=y +CONFIG_DISABLE_TEMP_PROTECT=n +CONFIG_PSTORE=y +CONFIG_PSTORE_CONSOLE=y +CONFIG_PSTORE_FTRACE=y +CONFIG_PSTORE_PMSG=y +CONFIG_PSTORE_RAM=y +CONFIG_PSTORE_LAST_KMSG=y + +CONFIG_DUMP_ALL_STACKS=y +# CONFIG_FIRE_WATCHDOG is not set + +CONFIG_BOOT_INFO=y +CONFIG_OF_FLATTREE=y + +#Add CIFS Config +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_UTF8=y + +#CONFIG_ZRAM_DEBUG=y +CONFIG_SWAP=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_ANDROID_WHETSTONE=y +CONFIG_CGROUP_MEM_RES_CTLR=y +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y + +# sdcardfs +CONFIG_SDCARD_FS=y diff --git a/arch/arm64/include/asm/bootinfo.h b/arch/arm64/include/asm/bootinfo.h new file mode 100644 index 0000000000000..b2db0353e4211 --- /dev/null +++ b/arch/arm64/include/asm/bootinfo.h @@ -0,0 +1,51 @@ +/* + * bootinfo.h + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __ASMARM_BOOTINFO_H +#define __ASMARM_BOOTINFO_H + +#define HW_MAJOR_VERSION_SHIFT 4 +#define HW_MAJOR_VERSION_MASK 0xF0 +#define HW_MINOR_VERSION_SHIFT 0 +#define HW_MINOR_VERSION_MASK 0x0F + +typedef enum { + PU_REASON_EVENT_HWRST, + PU_REASON_EVENT_SMPL, + PU_REASON_EVENT_RTC, + PU_REASON_EVENT_DC_CHG, + PU_REASON_EVENT_USB_CHG, + PU_REASON_EVENT_PON1, + PU_REASON_EVENT_CABLE, + PU_REASON_EVENT_KPD, + PU_REASON_EVENT_WARMRST, + PU_REASON_EVENT_LPK, + PU_REASON_MAX +} powerup_reason_t; + +enum { + RS_REASON_EVENT_WDOG, + RS_REASON_EVENT_KPANIC, + RS_REASON_EVENT_NORMAL, + RS_REASON_EVENT_OTHER, + RS_REASON_MAX +}; + +#define RESTART_EVENT_WDOG 0x10000 +#define RESTART_EVENT_KPANIC 0x20000 +#define RESTART_EVENT_NORMAL 0x40000 +#define RESTART_EVENT_OTHER 0x80000 + +unsigned int get_powerup_reason(void); +int is_abnormal_powerup(void); +void set_powerup_reason(unsigned int powerup_reason); +unsigned int get_hw_version(void); +void set_hw_version(unsigned int hw_version); +unsigned int get_hw_version_major(void); +unsigned int get_hw_version_minor(void); +#endif diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index bd4e7c7096055..d69981ac0765d 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -31,6 +31,7 @@ #include #include +#include #include #include diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 7b00b863c648f..0ad51096c9b6b 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -20,6 +20,7 @@ arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ hyp-stub.o psci.o psci-call.o cpu_ops.o insn.o \ return_address.o cpuinfo.o cpu_errata.o cpufeature.o alternative.o +arm64-obj-$(CONFIG_BOOT_INFO) += bootinfo.o arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ sys_compat.o \ ../../arm/kernel/opcodes.o diff --git a/arch/arm64/kernel/bootinfo.c b/arch/arm64/kernel/bootinfo.c new file mode 100644 index 0000000000000..b4c51395705cc --- /dev/null +++ b/arch/arm64/kernel/bootinfo.c @@ -0,0 +1,203 @@ +/* + * bootinfo.c + * + * Copyright (C) 2011 Xiaomi Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const char * const powerup_reasons[PU_REASON_MAX] = { + [PU_REASON_EVENT_KPD] = "keypad", + [PU_REASON_EVENT_RTC] = "rtc", + [PU_REASON_EVENT_CABLE] = "cable", + [PU_REASON_EVENT_SMPL] = "smpl", + [PU_REASON_EVENT_PON1] = "pon1", + [PU_REASON_EVENT_USB_CHG] = "usb_chg", + [PU_REASON_EVENT_DC_CHG] = "dc_chg", + [PU_REASON_EVENT_HWRST] = "hw_reset", + [PU_REASON_EVENT_LPK] = "long_power_key", +}; + +static const char * const reset_reasons[RS_REASON_MAX] = { + [RS_REASON_EVENT_WDOG] = "wdog", + [RS_REASON_EVENT_KPANIC] = "kpanic", + [RS_REASON_EVENT_NORMAL] = "reboot", + [RS_REASON_EVENT_OTHER] = "other", +}; + +static struct kobject *bootinfo_kobj = NULL; +static powerup_reason_t powerup_reason; +static unsigned int hw_version; + +#define bootinfo_attr(_name) \ +static struct kobj_attribute _name##_attr = { \ + .attr = { \ + .name = __stringify(_name), \ + .mode = 0644, \ + }, \ + .show = _name##_show, \ + .store = NULL, \ +} + +#define bootinfo_func_init(type,name,initval) \ + static type name = (initval); \ + type get_##name(void) \ + { \ + return name; \ + } \ + void set_##name(type __##name) \ + { \ + name = __##name; \ + } \ + EXPORT_SYMBOL(set_##name); \ + EXPORT_SYMBOL(get_##name); + +int is_abnormal_powerup(void) +{ + u32 pu_reason = get_powerup_reason(); + return (pu_reason & (RESTART_EVENT_KPANIC | RESTART_EVENT_WDOG)) | + (pu_reason & BIT(PU_REASON_EVENT_HWRST) & RESTART_EVENT_OTHER); +} + +static ssize_t powerup_reason_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) +{ + char *s = buf; + u32 pu_reason; + int pu_reason_index = PU_REASON_MAX; + u32 reset_reason; + int reset_reason_index = RS_REASON_MAX; + + pu_reason = get_powerup_reason(); + if (((pu_reason & BIT(PU_REASON_EVENT_HWRST)) + && qpnp_pon_is_ps_hold_reset()) || + (pu_reason & BIT(PU_REASON_EVENT_WARMRST))) { + reset_reason = pu_reason >> 16; + reset_reason_index = find_first_bit((unsigned long *)&reset_reason, + sizeof(reset_reason)*BITS_PER_BYTE); + if (reset_reason_index < RS_REASON_MAX && reset_reason_index >= 0) { + s += sprintf(s, "%s\n", reset_reasons[reset_reason_index]); + printk(KERN_DEBUG "%s: rs_reason [0x%x], first non-zero bit" + " %d\n", __func__, reset_reason, reset_reason_index); + goto out; + }; + } + if (qpnp_pon_is_lpk() && + (pu_reason & BIT(PU_REASON_EVENT_HWRST))) + pu_reason_index = PU_REASON_EVENT_LPK; + else if (pu_reason & BIT(PU_REASON_EVENT_HWRST)) + pu_reason_index = PU_REASON_EVENT_HWRST; + else if (pu_reason & BIT(PU_REASON_EVENT_SMPL)) + pu_reason_index = PU_REASON_EVENT_SMPL; + else if (pu_reason & BIT(PU_REASON_EVENT_RTC)) + pu_reason_index = PU_REASON_EVENT_RTC; + else if (pu_reason & BIT(PU_REASON_EVENT_USB_CHG)) + pu_reason_index = PU_REASON_EVENT_USB_CHG; + else if (pu_reason & BIT(PU_REASON_EVENT_DC_CHG)) + pu_reason_index = PU_REASON_EVENT_DC_CHG; + else if (pu_reason & BIT(PU_REASON_EVENT_KPD)) + pu_reason_index = PU_REASON_EVENT_KPD; + else if (pu_reason & BIT(PU_REASON_EVENT_PON1)) + pu_reason_index = PU_REASON_EVENT_PON1; + if (pu_reason_index < PU_REASON_MAX && pu_reason_index >=0) { + s += sprintf(s, "%s\n", powerup_reasons[pu_reason_index]); + printk(KERN_DEBUG "%s: pu_reason [0x%x] index %d\n", + __func__, pu_reason, pu_reason_index); + goto out; + } + s += sprintf(s, "unknown reboot\n"); +out: + return (s - buf); +} + +static ssize_t powerup_reason_details_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) +{ + u32 pu_reason; + + pu_reason = get_powerup_reason(); + + return sprintf(buf, "0x%x\n", pu_reason); +} + +static ssize_t hw_version_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) +{ + u32 hw_version; + + hw_version = get_hw_version(); + + return sprintf(buf, "0x%x\n", hw_version); +} + +bootinfo_attr(powerup_reason); +bootinfo_attr(powerup_reason_details); +bootinfo_attr(hw_version); +bootinfo_func_init(u32, powerup_reason, 0); +bootinfo_func_init(u32, hw_version, 0); + +unsigned int get_hw_version_major(void) { + return ((get_hw_version() & HW_MAJOR_VERSION_MASK) >> HW_MAJOR_VERSION_SHIFT); +} +EXPORT_SYMBOL(get_hw_version_major); + +unsigned int get_hw_version_minor(void) { + return ((get_hw_version() & HW_MINOR_VERSION_MASK) >> HW_MINOR_VERSION_SHIFT); +} + +static struct attribute * g[] = { + &powerup_reason_attr.attr, + &powerup_reason_details_attr.attr, + &hw_version_attr.attr, + NULL, +}; + +static struct attribute_group attr_group = { + .attrs = g, +}; + +static int __init bootinfo_init(void) +{ + int ret = -ENOMEM; + + bootinfo_kobj = kobject_create_and_add("bootinfo", NULL); + if (bootinfo_kobj == NULL) { + printk("bootinfo_init: subsystem_register failed\n"); + goto fail; + } + + ret = sysfs_create_group(bootinfo_kobj, &attr_group); + if (ret) { + printk("bootinfo_init: subsystem_register failed\n"); + goto sys_fail; + } + + return ret; + +sys_fail: + kobject_del(bootinfo_kobj); +fail: + return ret; + +} + +static void __exit bootinfo_exit(void) +{ + if (bootinfo_kobj) { + sysfs_remove_group(bootinfo_kobj, &attr_group); + kobject_del(bootinfo_kobj); + } +} + +core_initcall(bootinfo_init); +module_exit(bootinfo_exit); + diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index d594ce9d5875f..475f27fbff7b1 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -63,6 +63,7 @@ #include #include #include +#include unsigned int processor_id; EXPORT_SYMBOL(processor_id); @@ -85,6 +86,8 @@ unsigned int compat_elf_hwcap __read_mostly = COMPAT_ELF_HWCAP_DEFAULT; unsigned int compat_elf_hwcap2 __read_mostly; #endif +extern void pstore_ram_reserve_memory(void); + DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS); unsigned int boot_reason; @@ -380,6 +383,14 @@ static void __init request_standard_resources(void) request_resource(res, &kernel_data); } } +#ifdef CONFIG_OF_FLATTREE +void __init early_init_dt_setup_pureason_arch(unsigned long pu_reason) +{ + set_powerup_reason(pu_reason); + pr_info("Powerup reason=0x%x\n", get_powerup_reason()); +} +#endif + #ifdef CONFIG_BLK_DEV_INITRD /* @@ -496,6 +507,10 @@ void __init setup_arch(char **cmdline_p) smp_build_mpidr_hash(); #endif +#ifdef CONFIG_PSTORE + pstore_ram_reserve_memory(); +#endif + #ifdef CONFIG_VT #if defined(CONFIG_VGA_CONSOLE) conswitchp = &vga_con; diff --git a/arch/arm64/kernel/smp_spin_table.c b/arch/arm64/kernel/smp_spin_table.c index 0d9afcfcae92a..f189668566caf 100644 --- a/arch/arm64/kernel/smp_spin_table.c +++ b/arch/arm64/kernel/smp_spin_table.c @@ -25,6 +25,7 @@ #include #include #include +#include #include static phys_addr_t cpu_release_addr[NR_CPUS]; diff --git a/block/blk-flush.c b/block/blk-flush.c index 10679fe62c8c3..d9a005037179d 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -112,6 +112,7 @@ #include "blk.h" #include "blk-mq.h" +#include "blk-mq-tag.h" /* FLUSH/FUA sequences */ enum { @@ -283,7 +284,12 @@ static void flush_end_io(struct request *flush_rq, int error) struct blk_flush_queue *fq = blk_get_flush_queue(q, flush_rq->mq_ctx); if (q->mq_ops) { + struct blk_mq_hw_ctx *hctx; + + /* release the tag's ownership to the req cloned from */ spin_lock_irqsave(&fq->mq_flush_lock, flags); + hctx = q->mq_ops->map_queue(q, flush_rq->mq_ctx->cpu); + blk_mq_tag_set_rq(hctx, flush_rq->tag, fq->orig_rq); flush_rq->tag = -1; } @@ -366,11 +372,18 @@ static bool blk_kick_flush(struct request_queue *q, struct blk_flush_queue *fq) /* * Borrow tag from the first request since they can't - * be in flight at the same time. + * be in flight at the same time. And acquire the tag's + * ownership for flush req. */ if (q->mq_ops) { + struct blk_mq_hw_ctx *hctx; + flush_rq->mq_ctx = first_rq->mq_ctx; flush_rq->tag = first_rq->tag; + fq->orig_rq = first_rq; + + hctx = q->mq_ops->map_queue(q, first_rq->mq_ctx->cpu); + blk_mq_tag_set_rq(hctx, first_rq->tag, flush_rq); } flush_rq->cmd_type = REQ_TYPE_FS; diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index 702ae29b8d90f..4fbc8d563777f 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c @@ -403,7 +403,7 @@ static void bt_for_each(struct blk_mq_hw_ctx *hctx, for (bit = find_first_bit(&bm->word, bm->depth); bit < bm->depth; bit = find_next_bit(&bm->word, bm->depth, bit + 1)) { - rq = blk_mq_tag_to_rq(hctx->tags, off + bit); + rq = hctx->tags->rqs[off + bit]; if (rq->q == hctx->queue) fn(hctx, rq, data, reserved); } diff --git a/block/blk-mq-tag.h b/block/blk-mq-tag.h index 6206ed17ef766..14c6e4c925564 100644 --- a/block/blk-mq-tag.h +++ b/block/blk-mq-tag.h @@ -85,4 +85,16 @@ static inline void blk_mq_tag_idle(struct blk_mq_hw_ctx *hctx) __blk_mq_tag_idle(hctx); } +/* + * This helper should only be used for flush request to share tag + * with the request cloned from, and both the two requests can't be + * in flight at the same time. The caller has to make sure the tag + * can't be freed. + */ +static inline void blk_mq_tag_set_rq(struct blk_mq_hw_ctx *hctx, + unsigned int tag, struct request *rq) +{ + hctx->tags->rqs[tag] = rq; +} + #endif diff --git a/block/blk-mq.c b/block/blk-mq.c index 691959ecb80fe..4b839c117c566 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -498,23 +498,9 @@ void blk_mq_kick_requeue_list(struct request_queue *q) } EXPORT_SYMBOL(blk_mq_kick_requeue_list); -static inline bool is_flush_request(struct request *rq, - struct blk_flush_queue *fq, unsigned int tag) -{ - return ((rq->cmd_flags & REQ_FLUSH_SEQ) && - fq->flush_rq->tag == tag); -} - struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag) { - struct request *rq = tags->rqs[tag]; - /* mq_ctx of flush rq is always cloned from the corresponding req */ - struct blk_flush_queue *fq = blk_get_flush_queue(rq->q, rq->mq_ctx); - - if (!is_flush_request(rq, fq, tag)) - return rq; - - return fq->flush_rq; + return tags->rqs[tag]; } EXPORT_SYMBOL(blk_mq_tag_to_rq); diff --git a/block/blk.h b/block/blk.h index 39471974401c5..5bc529f289215 100644 --- a/block/blk.h +++ b/block/blk.h @@ -22,6 +22,12 @@ struct blk_flush_queue { struct list_head flush_queue[2]; struct list_head flush_data_in_flight; struct request *flush_rq; + + /* + * flush_rq shares tag with this rq, both can't be active + * at the same time + */ + struct request *orig_rq; spinlock_t mq_flush_lock; }; diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c index d2cacc7f079f8..ea51eb5f575ef 100644 --- a/crypto/algif_skcipher.c +++ b/crypto/algif_skcipher.c @@ -446,13 +446,6 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, char __user *from = iov->iov_base; while (seglen) { - sgl = list_first_entry(&ctx->tsgl, - struct skcipher_sg_list, list); - sg = sgl->sg; - - while (!sg->length) - sg++; - used = ctx->used; if (!used) { err = skcipher_wait_for_data(sk, flags); @@ -474,6 +467,13 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, if (!used) goto free; + sgl = list_first_entry(&ctx->tsgl, + struct skcipher_sg_list, list); + sg = sgl->sg; + + while (!sg->length) + sg++; + ablkcipher_request_set_crypt(&ctx->req, sg, ctx->rsgl.sg, used, ctx->iv); diff --git a/drivers/Kconfig b/drivers/Kconfig index 351d9100e93df..1c08080d114e6 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -198,4 +198,9 @@ source "drivers/firmware/Kconfig" source "drivers/bif/Kconfig" +#source "drivers/gud/Kconfig" + +source "drivers/fingerprint/Kconfig" + +source "drivers/fingerprintrosy/Kconfig" endmenu diff --git a/drivers/Makefile b/drivers/Makefile index e3352f1e48385..c8dc476ce7b05 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -170,3 +170,9 @@ obj-$(CONFIG_ESOC) += esoc/ obj-$(CONFIG_BIF) += bif/ obj-$(CONFIG_SENSORS_SSC) += sensors/ + +# driver_override, *cp; + char *driver_override, *old, *cp; if (count > PATH_MAX) return -EINVAL; @@ -740,12 +740,15 @@ static ssize_t driver_override_store(struct device *dev, if (cp) *cp = '\0'; + device_lock(dev); + old = pdev->driver_override; if (strlen(driver_override)) { pdev->driver_override = driver_override; } else { kfree(driver_override); pdev->driver_override = NULL; } + device_unlock(dev); kfree(old); @@ -756,8 +759,12 @@ static ssize_t driver_override_show(struct device *dev, struct device_attribute *attr, char *buf) { struct platform_device *pdev = to_platform_device(dev); + ssize_t len; - return sprintf(buf, "%s\n", pdev->driver_override); + device_lock(dev); + len = sprintf(buf, "%s\n", pdev->driver_override); + device_unlock(dev); + return len; } static DEVICE_ATTR_RW(driver_override); diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 6489c0fd0ea6e..386ba3d1a6ee8 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -23,12 +23,4 @@ config ZRAM_LZ4_COMPRESS default n help This option enables LZ4 compression algorithm support. Compression - algorithm can be changed using `comp_algorithm' device attribute. - -config ZRAM_DEBUG - bool "Compressed RAM block device debug support" - depends on ZRAM - default n - help - This option adds additional debugging code to the compressed - RAM block device driver. + algorithm can be changed using `comp_algorithm' device attribute. \ No newline at end of file diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 6fbb10ca73b10..b51a816d766bb 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "zcomp.h" #include "zcomp_lzo.h" @@ -20,29 +21,6 @@ #include "zcomp_lz4.h" #endif -/* - * single zcomp_strm backend - */ -struct zcomp_strm_single { - struct mutex strm_lock; - struct zcomp_strm *zstrm; -}; - -/* - * multi zcomp_strm backend - */ -struct zcomp_strm_multi { - /* protect strm list */ - spinlock_t strm_lock; - /* max possible number of zstrm streams */ - int max_strm; - /* number of available zstrm streams */ - int avail_strm; - /* list of available strms */ - struct list_head idle_strm; - wait_queue_head_t strm_wait; -}; - static struct zcomp_backend *backends[] = { &zcomp_lzo, #ifdef CONFIG_ZRAM_LZ4_COMPRESS @@ -74,18 +52,18 @@ static void zcomp_strm_free(struct zcomp *comp, struct zcomp_strm *zstrm) * allocate new zcomp_strm structure with ->private initialized by * backend, return NULL on error */ -static struct zcomp_strm *zcomp_strm_alloc(struct zcomp *comp) +static struct zcomp_strm *zcomp_strm_alloc(struct zcomp *comp, gfp_t flags) { - struct zcomp_strm *zstrm = kmalloc(sizeof(*zstrm), GFP_NOIO); + struct zcomp_strm *zstrm = kmalloc(sizeof(*zstrm), flags); if (!zstrm) return NULL; - zstrm->private = comp->backend->create(); + zstrm->private = comp->backend->create(flags); /* * allocate 2 pages. 1 for compressed data, plus 1 extra for the * case when compressed size is larger than the original one */ - zstrm->buffer = (void *)__get_free_pages(GFP_NOIO | __GFP_ZERO, 1); + zstrm->buffer = (void *)__get_free_pages(flags | __GFP_ZERO, 1); if (!zstrm->private || !zstrm->buffer) { zcomp_strm_free(comp, zstrm); zstrm = NULL; @@ -93,180 +71,6 @@ static struct zcomp_strm *zcomp_strm_alloc(struct zcomp *comp) return zstrm; } -/* - * get idle zcomp_strm or wait until other process release - * (zcomp_strm_release()) one for us - */ -static struct zcomp_strm *zcomp_strm_multi_find(struct zcomp *comp) -{ - struct zcomp_strm_multi *zs = comp->stream; - struct zcomp_strm *zstrm; - - while (1) { - spin_lock(&zs->strm_lock); - if (!list_empty(&zs->idle_strm)) { - zstrm = list_entry(zs->idle_strm.next, - struct zcomp_strm, list); - list_del(&zstrm->list); - spin_unlock(&zs->strm_lock); - return zstrm; - } - /* zstrm streams limit reached, wait for idle stream */ - if (zs->avail_strm >= zs->max_strm) { - spin_unlock(&zs->strm_lock); - wait_event(zs->strm_wait, !list_empty(&zs->idle_strm)); - continue; - } - /* allocate new zstrm stream */ - zs->avail_strm++; - spin_unlock(&zs->strm_lock); - - zstrm = zcomp_strm_alloc(comp); - if (!zstrm) { - spin_lock(&zs->strm_lock); - zs->avail_strm--; - spin_unlock(&zs->strm_lock); - wait_event(zs->strm_wait, !list_empty(&zs->idle_strm)); - continue; - } - break; - } - return zstrm; -} - -/* add stream back to idle list and wake up waiter or free the stream */ -static void zcomp_strm_multi_release(struct zcomp *comp, struct zcomp_strm *zstrm) -{ - struct zcomp_strm_multi *zs = comp->stream; - - spin_lock(&zs->strm_lock); - if (zs->avail_strm <= zs->max_strm) { - list_add(&zstrm->list, &zs->idle_strm); - spin_unlock(&zs->strm_lock); - wake_up(&zs->strm_wait); - return; - } - - zs->avail_strm--; - spin_unlock(&zs->strm_lock); - zcomp_strm_free(comp, zstrm); -} - -/* change max_strm limit */ -static bool zcomp_strm_multi_set_max_streams(struct zcomp *comp, int num_strm) -{ - struct zcomp_strm_multi *zs = comp->stream; - struct zcomp_strm *zstrm; - - spin_lock(&zs->strm_lock); - zs->max_strm = num_strm; - /* - * if user has lowered the limit and there are idle streams, - * immediately free as much streams (and memory) as we can. - */ - while (zs->avail_strm > num_strm && !list_empty(&zs->idle_strm)) { - zstrm = list_entry(zs->idle_strm.next, - struct zcomp_strm, list); - list_del(&zstrm->list); - zcomp_strm_free(comp, zstrm); - zs->avail_strm--; - } - spin_unlock(&zs->strm_lock); - return true; -} - -static void zcomp_strm_multi_destroy(struct zcomp *comp) -{ - struct zcomp_strm_multi *zs = comp->stream; - struct zcomp_strm *zstrm; - - while (!list_empty(&zs->idle_strm)) { - zstrm = list_entry(zs->idle_strm.next, - struct zcomp_strm, list); - list_del(&zstrm->list); - zcomp_strm_free(comp, zstrm); - } - kfree(zs); -} - -static int zcomp_strm_multi_create(struct zcomp *comp, int max_strm) -{ - struct zcomp_strm *zstrm; - struct zcomp_strm_multi *zs; - - comp->destroy = zcomp_strm_multi_destroy; - comp->strm_find = zcomp_strm_multi_find; - comp->strm_release = zcomp_strm_multi_release; - comp->set_max_streams = zcomp_strm_multi_set_max_streams; - zs = kmalloc(sizeof(struct zcomp_strm_multi), GFP_KERNEL); - if (!zs) - return -ENOMEM; - - comp->stream = zs; - spin_lock_init(&zs->strm_lock); - INIT_LIST_HEAD(&zs->idle_strm); - init_waitqueue_head(&zs->strm_wait); - zs->max_strm = max_strm; - zs->avail_strm = 1; - - zstrm = zcomp_strm_alloc(comp); - if (!zstrm) { - kfree(zs); - return -ENOMEM; - } - list_add(&zstrm->list, &zs->idle_strm); - return 0; -} - -static struct zcomp_strm *zcomp_strm_single_find(struct zcomp *comp) -{ - struct zcomp_strm_single *zs = comp->stream; - mutex_lock(&zs->strm_lock); - return zs->zstrm; -} - -static void zcomp_strm_single_release(struct zcomp *comp, - struct zcomp_strm *zstrm) -{ - struct zcomp_strm_single *zs = comp->stream; - mutex_unlock(&zs->strm_lock); -} - -static bool zcomp_strm_single_set_max_streams(struct zcomp *comp, int num_strm) -{ - /* zcomp_strm_single support only max_comp_streams == 1 */ - return false; -} - -static void zcomp_strm_single_destroy(struct zcomp *comp) -{ - struct zcomp_strm_single *zs = comp->stream; - zcomp_strm_free(comp, zs->zstrm); - kfree(zs); -} - -static int zcomp_strm_single_create(struct zcomp *comp) -{ - struct zcomp_strm_single *zs; - - comp->destroy = zcomp_strm_single_destroy; - comp->strm_find = zcomp_strm_single_find; - comp->strm_release = zcomp_strm_single_release; - comp->set_max_streams = zcomp_strm_single_set_max_streams; - zs = kmalloc(sizeof(struct zcomp_strm_single), GFP_KERNEL); - if (!zs) - return -ENOMEM; - - comp->stream = zs; - mutex_init(&zs->strm_lock); - zs->zstrm = zcomp_strm_alloc(comp); - if (!zs->zstrm) { - kfree(zs); - return -ENOMEM; - } - return 0; -} - /* show available compressors */ ssize_t zcomp_available_show(const char *comp, char *buf) { @@ -274,7 +78,7 @@ ssize_t zcomp_available_show(const char *comp, char *buf) int i = 0; while (backends[i]) { - if (sysfs_streq(comp, backends[i]->name)) + if (!strcmp(comp, backends[i]->name)) sz += scnprintf(buf + sz, PAGE_SIZE - sz - 2, "[%s] ", backends[i]->name); else @@ -286,19 +90,19 @@ ssize_t zcomp_available_show(const char *comp, char *buf) return sz; } -bool zcomp_set_max_streams(struct zcomp *comp, int num_strm) +bool zcomp_available_algorithm(const char *comp) { - return comp->set_max_streams(comp, num_strm); + return find_backend(comp) != NULL; } struct zcomp_strm *zcomp_strm_find(struct zcomp *comp) { - return comp->strm_find(comp); + return *get_cpu_ptr(comp->stream); } void zcomp_strm_release(struct zcomp *comp, struct zcomp_strm *zstrm) { - comp->strm_release(comp, zstrm); + put_cpu_ptr(comp->stream); } int zcomp_compress(struct zcomp *comp, struct zcomp_strm *zstrm, @@ -314,9 +118,83 @@ int zcomp_decompress(struct zcomp *comp, const unsigned char *src, return comp->backend->decompress(src, src_len, dst); } +static int __zcomp_cpu_notifier(struct zcomp *comp, + unsigned long action, unsigned long cpu) +{ + struct zcomp_strm *zstrm; + + switch (action) { + case CPU_UP_PREPARE: + if (WARN_ON(*per_cpu_ptr(comp->stream, cpu))) + break; + zstrm = zcomp_strm_alloc(comp, GFP_KERNEL); + if (IS_ERR_OR_NULL(zstrm)) { + pr_err("Can't allocate a compression stream\n"); + return NOTIFY_BAD; + } + *per_cpu_ptr(comp->stream, cpu) = zstrm; + break; + case CPU_DEAD: + case CPU_UP_CANCELED: + zstrm = *per_cpu_ptr(comp->stream, cpu); + if (!IS_ERR_OR_NULL(zstrm)) + zcomp_strm_free(comp, zstrm); + *per_cpu_ptr(comp->stream, cpu) = NULL; + break; + default: + break; + } + return NOTIFY_OK; +} + +static int zcomp_cpu_notifier(struct notifier_block *nb, + unsigned long action, void *pcpu) +{ + unsigned long cpu = (unsigned long)pcpu; + struct zcomp *comp = container_of(nb, typeof(*comp), notifier); + + return __zcomp_cpu_notifier(comp, action, cpu); +} + +static int zcomp_init(struct zcomp *comp) +{ + unsigned long cpu; + int ret; + + comp->notifier.notifier_call = zcomp_cpu_notifier; + + comp->stream = alloc_percpu(struct zcomp_strm *); + if (!comp->stream) + return -ENOMEM; + + cpu_notifier_register_begin(); + for_each_online_cpu(cpu) { + ret = __zcomp_cpu_notifier(comp, CPU_UP_PREPARE, cpu); + if (ret == NOTIFY_BAD) + goto cleanup; + } + __register_cpu_notifier(&comp->notifier); + cpu_notifier_register_done(); + return 0; + +cleanup: + for_each_online_cpu(cpu) + __zcomp_cpu_notifier(comp, CPU_UP_CANCELED, cpu); + cpu_notifier_register_done(); + return -ENOMEM; +} + void zcomp_destroy(struct zcomp *comp) { - comp->destroy(comp); + unsigned long cpu; + + cpu_notifier_register_begin(); + for_each_online_cpu(cpu) + __zcomp_cpu_notifier(comp, CPU_UP_CANCELED, cpu); + __unregister_cpu_notifier(&comp->notifier); + cpu_notifier_register_done(); + + free_percpu(comp->stream); kfree(comp); } @@ -326,9 +204,9 @@ void zcomp_destroy(struct zcomp *comp) * backend pointer or ERR_PTR if things went bad. ERR_PTR(-EINVAL) * if requested algorithm is not supported, ERR_PTR(-ENOMEM) in * case of allocation error, or any other error potentially - * returned by functions zcomp_strm_{multi,single}_create. + * returned by zcomp_init(). */ -struct zcomp *zcomp_create(const char *compress, int max_strm) +struct zcomp *zcomp_create(const char *compress) { struct zcomp *comp; struct zcomp_backend *backend; @@ -343,10 +221,7 @@ struct zcomp *zcomp_create(const char *compress, int max_strm) return ERR_PTR(-ENOMEM); comp->backend = backend; - if (max_strm > 1) - error = zcomp_strm_multi_create(comp, max_strm); - else - error = zcomp_strm_single_create(comp); + error = zcomp_init(comp); if (error) { kfree(comp); return ERR_PTR(error); diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index c59d1fca72c06..ffd88cb747fee 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -10,8 +10,6 @@ #ifndef _ZCOMP_H_ #define _ZCOMP_H_ -#include - struct zcomp_strm { /* compression/decompression buffer */ void *buffer; @@ -21,8 +19,6 @@ struct zcomp_strm { * working memory) */ void *private; - /* used in multi stream backend, protected by backend strm_lock */ - struct list_head list; }; /* static compression backend */ @@ -33,7 +29,7 @@ struct zcomp_backend { int (*decompress)(const unsigned char *src, size_t src_len, unsigned char *dst); - void *(*create)(void); + void *(*create)(gfp_t flags); void (*destroy)(void *private); const char *name; @@ -41,18 +37,15 @@ struct zcomp_backend { /* dynamic per-device compression frontend */ struct zcomp { - void *stream; + struct zcomp_strm * __percpu *stream; struct zcomp_backend *backend; - - struct zcomp_strm *(*strm_find)(struct zcomp *comp); - void (*strm_release)(struct zcomp *comp, struct zcomp_strm *zstrm); - bool (*set_max_streams)(struct zcomp *comp, int num_strm); - void (*destroy)(struct zcomp *comp); + struct notifier_block notifier; }; ssize_t zcomp_available_show(const char *comp, char *buf); +bool zcomp_available_algorithm(const char *comp); -struct zcomp *zcomp_create(const char *comp, int max_strm); +struct zcomp *zcomp_create(const char *comp); void zcomp_destroy(struct zcomp *comp); struct zcomp_strm *zcomp_strm_find(struct zcomp *comp); diff --git a/drivers/block/zram/zcomp_lz4.c b/drivers/block/zram/zcomp_lz4.c index dd6083124276f..0110086accba8 100644 --- a/drivers/block/zram/zcomp_lz4.c +++ b/drivers/block/zram/zcomp_lz4.c @@ -15,24 +15,14 @@ #include "zcomp_lz4.h" -static void *zcomp_lz4_create(void) +static void *zcomp_lz4_create(gfp_t flags) { void *ret; - /* - * This function can be called in swapout/fs write path - * so we can't use GFP_FS|IO. And it assumes we already - * have at least one stream in zram initialization so we - * don't do best effort to allocate more stream in here. - * A default stream will work well without further multiple - * streams. That's why we use NORETRY | NOWARN. - */ - ret = kzalloc(LZ4_MEM_COMPRESS, GFP_NOIO | __GFP_NORETRY | - __GFP_NOWARN); + ret = kmalloc(LZ4_MEM_COMPRESS, flags); if (!ret) ret = __vmalloc(LZ4_MEM_COMPRESS, - GFP_NOIO | __GFP_NORETRY | __GFP_NOWARN | - __GFP_ZERO | __GFP_HIGHMEM, + flags | __GFP_HIGHMEM, PAGE_KERNEL); return ret; } diff --git a/drivers/block/zram/zcomp_lzo.c b/drivers/block/zram/zcomp_lzo.c index edc549920fa06..ed7a1f0549ecf 100644 --- a/drivers/block/zram/zcomp_lzo.c +++ b/drivers/block/zram/zcomp_lzo.c @@ -15,24 +15,14 @@ #include "zcomp_lzo.h" -static void *lzo_create(void) +static void *lzo_create(gfp_t flags) { void *ret; - /* - * This function can be called in swapout/fs write path - * so we can't use GFP_FS|IO. And it assumes we already - * have at least one stream in zram initialization so we - * don't do best effort to allocate more stream in here. - * A default stream will work well without further multiple - * streams. That's why we use NORETRY | NOWARN. - */ - ret = kzalloc(LZO1X_MEM_COMPRESS, GFP_NOIO | __GFP_NORETRY | - __GFP_NOWARN); + ret = kmalloc(LZO1X_MEM_COMPRESS, flags); if (!ret) ret = __vmalloc(LZO1X_MEM_COMPRESS, - GFP_NOIO | __GFP_NORETRY | __GFP_NOWARN | - __GFP_ZERO | __GFP_HIGHMEM, + flags | __GFP_HIGHMEM, PAGE_KERNEL); return ret; } diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 74fd2566b8757..21a367439a0cf 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -3,6 +3,7 @@ * * Copyright (C) 2008, 2009, 2010 Nitin Gupta * 2012, 2013 Minchan Kim + * Copyright (C) 2018 XiaoMi, Inc. * * This code is released using a dual license strategy: BSD/GPL * You can choose the licence that better fits your requirements. @@ -15,10 +16,6 @@ #define KMSG_COMPONENT "zram" #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt -#ifdef CONFIG_ZRAM_DEBUG -#define DEBUG -#endif - #include #include #include @@ -32,22 +29,18 @@ #include #include #include -#include -#include +#include +#include #include "zram_drv.h" -/* Globals */ +static DEFINE_IDR(zram_index_idr); +/* idr index must be protected */ +static DEFINE_MUTEX(zram_index_mutex); + static int zram_major; -static struct zram *zram_devices; static const char *default_compressor = "lzo"; -/* - * We don't need to see memory allocation errors more than once every 1 - * second to know that a problem is occurring. - */ -#define ALLOC_ERROR_LOG_RATE_MS 1000 - /* Module params (documentation at end) */ static unsigned int num_devices = 1; @@ -61,7 +54,7 @@ static inline void deprecated_attr_warn(const char *name) } #define ZRAM_ATTR_RO(name) \ -static ssize_t name##_show(struct device *d, \ +static ssize_t name##_show(struct device *d, \ struct device_attribute *attr, char *b) \ { \ struct zram *zram = dev_to_zram(d); \ @@ -77,81 +70,122 @@ static inline bool init_done(struct zram *zram) return zram->disksize; } -static int zram_show_mem_notifier(struct notifier_block *nb, - unsigned long action, - void *data) +static inline struct zram *dev_to_zram(struct device *dev) { - int i; + return (struct zram *)dev_to_disk(dev)->private_data; +} - if (!zram_devices) - return 0; +/* flag operations require table entry bit_spin_lock() being held */ +static int zram_test_flag(struct zram_meta *meta, u32 index, + enum zram_pageflags flag) +{ + return meta->table[index].value & BIT(flag); +} - for (i = 0; i < num_devices; i++) { - struct zram *zram = &zram_devices[i]; - struct zram_meta *meta = zram->meta; +static void zram_set_flag(struct zram_meta *meta, u32 index, + enum zram_pageflags flag) +{ + meta->table[index].value |= BIT(flag); +} - if (!down_read_trylock(&zram->init_lock)) - continue; +static void zram_clear_flag(struct zram_meta *meta, u32 index, + enum zram_pageflags flag) +{ + meta->table[index].value &= ~BIT(flag); +} - if (init_done(zram)) { - u64 val; - u64 data_size; - u64 orig_data_size; - - val = zs_get_total_pages(meta->mem_pool); - data_size = atomic64_read(&zram->stats.compr_data_size); - orig_data_size = atomic64_read( - &zram->stats.pages_stored); - pr_info("Zram[%d] mem_used_total = %llu\n", i, - val << PAGE_SHIFT); - pr_info("Zram[%d] compr_data_size = %llu\n", i, - (unsigned long long)data_size); - pr_info("Zram[%d] orig_data_size = %llu\n", i, - (unsigned long long)orig_data_size); - } +static size_t zram_get_obj_size(struct zram_meta *meta, u32 index) +{ + return meta->table[index].value & (BIT(ZRAM_FLAG_SHIFT) - 1); +} - up_read(&zram->init_lock); - } +static void zram_set_obj_size(struct zram_meta *meta, + u32 index, size_t size) +{ + unsigned long flags = meta->table[index].value >> ZRAM_FLAG_SHIFT; - return 0; + meta->table[index].value = (flags << ZRAM_FLAG_SHIFT) | size; } -static struct notifier_block zram_show_mem_notifier_block = { - .notifier_call = zram_show_mem_notifier -}; +static inline bool is_partial_io(struct bio_vec *bvec) +{ + return bvec->bv_len != PAGE_SIZE; +} -static inline struct zram *dev_to_zram(struct device *dev) +/* + * Check if request is within bounds and aligned on zram logical blocks. + */ +static inline bool valid_io_request(struct zram *zram, + sector_t start, unsigned int size) { - return (struct zram *)dev_to_disk(dev)->private_data; + u64 end, bound; + + /* unaligned request */ + if (unlikely(start & (ZRAM_SECTOR_PER_LOGICAL_BLOCK - 1))) + return false; + if (unlikely(size & (ZRAM_LOGICAL_BLOCK_SIZE - 1))) + return false; + + end = start + (size >> SECTOR_SHIFT); + bound = zram->disksize >> SECTOR_SHIFT; + /* out of range range */ + if (unlikely(start >= bound || end > bound || start > end)) + return false; + + /* I/O request is valid */ + return true; } -static ssize_t compact_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) +static void update_position(u32 *index, int *offset, struct bio_vec *bvec) { - unsigned long nr_migrated; - struct zram *zram = dev_to_zram(dev); - struct zram_meta *meta; + if (*offset + bvec->bv_len >= PAGE_SIZE) + (*index)++; + *offset = (*offset + bvec->bv_len) % PAGE_SIZE; +} - down_read(&zram->init_lock); - if (!init_done(zram)) { - up_read(&zram->init_lock); - return -EINVAL; - } +static inline void update_used_max(struct zram *zram, + const unsigned long pages) +{ + unsigned long old_max, cur_max; - meta = zram->meta; - nr_migrated = zs_compact(meta->mem_pool); - atomic64_add(nr_migrated, &zram->stats.num_migrated); - up_read(&zram->init_lock); + old_max = atomic_long_read(&zram->stats.max_used_pages); - return len; + do { + cur_max = old_max; + if (pages > cur_max) + old_max = atomic_long_cmpxchg( + &zram->stats.max_used_pages, cur_max, pages); + } while (old_max != cur_max); } -static ssize_t disksize_show(struct device *dev, - struct device_attribute *attr, char *buf) +static bool page_zero_filled(void *ptr) { - struct zram *zram = dev_to_zram(dev); + unsigned int pos; + unsigned long *page; - return scnprintf(buf, PAGE_SIZE, "%llu\n", zram->disksize); + page = (unsigned long *)ptr; + + for (pos = 0; pos != PAGE_SIZE / sizeof(*page); pos++) { + if (page[pos]) + return false; + } + + return true; +} + +static void handle_zero_page(struct bio_vec *bvec) +{ + struct page *page = bvec->bv_page; + void *user_mem; + + user_mem = kmap_atomic(page); + if (is_partial_io(bvec)) + memset(user_mem + bvec->bv_offset, 0, bvec->bv_len); + else + clear_page(user_mem); + kunmap_atomic(user_mem); + + flush_dcache_page(page); } static ssize_t initstate_show(struct device *dev, @@ -167,6 +201,14 @@ static ssize_t initstate_show(struct device *dev, return scnprintf(buf, PAGE_SIZE, "%u\n", val); } +static ssize_t disksize_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct zram *zram = dev_to_zram(dev); + + return scnprintf(buf, PAGE_SIZE, "%llu\n", zram->disksize); +} + static ssize_t orig_data_size_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -194,19 +236,6 @@ static ssize_t mem_used_total_show(struct device *dev, return scnprintf(buf, PAGE_SIZE, "%llu\n", val << PAGE_SHIFT); } -static ssize_t max_comp_streams_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int val; - struct zram *zram = dev_to_zram(dev); - - down_read(&zram->init_lock); - val = zram->max_comp_streams; - up_read(&zram->init_lock); - - return scnprintf(buf, PAGE_SIZE, "%d\n", val); -} - static ssize_t mem_limit_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -276,33 +305,25 @@ static ssize_t mem_used_max_store(struct device *dev, return len; } +/* + * We switched to per-cpu streams and this attr is not needed anymore. + * However, we will keep it around for some time, because: + * a) we may revert per-cpu streams in the future + * b) it's visible to user space and we need to follow our 2 years + * retirement rule; but we already have a number of 'soon to be + * altered' attrs, so max_comp_streams need to wait for the next + * layoff cycle. + */ +static ssize_t max_comp_streams_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%d\n", num_online_cpus()); +} + static ssize_t max_comp_streams_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { - int num; - struct zram *zram = dev_to_zram(dev); - int ret; - - ret = kstrtoint(buf, 0, &num); - if (ret < 0) - return ret; - if (num < 1) - return -EINVAL; - - down_write(&zram->init_lock); - if (init_done(zram)) { - if (!zcomp_set_max_streams(zram->comp, num)) { - pr_info("Cannot change max compression streams\n"); - ret = -EINVAL; - goto out; - } - } - - zram->max_comp_streams = num; - ret = len; -out: - up_write(&zram->init_lock); - return ret; + return len; } static ssize_t comp_algorithm_show(struct device *dev, @@ -322,6 +343,11 @@ static ssize_t comp_algorithm_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { struct zram *zram = dev_to_zram(dev); + size_t sz; + + if (!zcomp_available_algorithm(buf)) + return -EINVAL; + down_write(&zram->init_lock); if (init_done(zram)) { up_write(&zram->init_lock); @@ -329,78 +355,117 @@ static ssize_t comp_algorithm_store(struct device *dev, return -EBUSY; } strlcpy(zram->compressor, buf, sizeof(zram->compressor)); + + /* ignore trailing newline */ + sz = strlen(zram->compressor); + if (sz > 0 && zram->compressor[sz - 1] == '\n') + zram->compressor[sz - 1] = 0x00; + up_write(&zram->init_lock); return len; } -/* flag operations needs meta->tb_lock */ -static int zram_test_flag(struct zram_meta *meta, u32 index, - enum zram_pageflags flag) +static ssize_t compact_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) { - return meta->table[index].value & BIT(flag); -} + struct zram *zram = dev_to_zram(dev); + struct zram_meta *meta; -static void zram_set_flag(struct zram_meta *meta, u32 index, - enum zram_pageflags flag) -{ - meta->table[index].value |= BIT(flag); -} + down_read(&zram->init_lock); + if (!init_done(zram)) { + up_read(&zram->init_lock); + return -EINVAL; + } -static void zram_clear_flag(struct zram_meta *meta, u32 index, - enum zram_pageflags flag) -{ - meta->table[index].value &= ~BIT(flag); -} + meta = zram->meta; + zs_compact(meta->mem_pool); + up_read(&zram->init_lock); -static size_t zram_get_obj_size(struct zram_meta *meta, u32 index) -{ - return meta->table[index].value & (BIT(ZRAM_FLAG_SHIFT) - 1); + return len; } -static void zram_set_obj_size(struct zram_meta *meta, - u32 index, size_t size) +static ssize_t io_stat_show(struct device *dev, + struct device_attribute *attr, char *buf) { - unsigned long flags = meta->table[index].value >> ZRAM_FLAG_SHIFT; + struct zram *zram = dev_to_zram(dev); + ssize_t ret; - meta->table[index].value = (flags << ZRAM_FLAG_SHIFT) | size; -} + down_read(&zram->init_lock); + ret = scnprintf(buf, PAGE_SIZE, + "%8llu %8llu %8llu %8llu\n", + (u64)atomic64_read(&zram->stats.failed_reads), + (u64)atomic64_read(&zram->stats.failed_writes), + (u64)atomic64_read(&zram->stats.invalid_io), + (u64)atomic64_read(&zram->stats.notify_free)); + up_read(&zram->init_lock); -static inline int is_partial_io(struct bio_vec *bvec) -{ - return bvec->bv_len != PAGE_SIZE; + return ret; } -/* - * Check if request is within bounds and aligned on zram logical blocks. - */ -static inline int valid_io_request(struct zram *zram, - sector_t start, unsigned int size) +static ssize_t mm_stat_show(struct device *dev, + struct device_attribute *attr, char *buf) { - u64 end, bound; + struct zram *zram = dev_to_zram(dev); + struct zs_pool_stats pool_stats; + u64 orig_size, mem_used = 0; + long max_used; + ssize_t ret; - /* unaligned request */ - if (unlikely(start & (ZRAM_SECTOR_PER_LOGICAL_BLOCK - 1))) - return 0; - if (unlikely(size & (ZRAM_LOGICAL_BLOCK_SIZE - 1))) - return 0; + memset(&pool_stats, 0x00, sizeof(struct zs_pool_stats)); - end = start + (size >> SECTOR_SHIFT); - bound = zram->disksize >> SECTOR_SHIFT; - /* out of range range */ - if (unlikely(start >= bound || end > bound || start > end)) - return 0; + down_read(&zram->init_lock); + if (init_done(zram)) { + mem_used = zs_get_total_pages(zram->meta->mem_pool); + zs_pool_stats(zram->meta->mem_pool, &pool_stats); + } - /* I/O request is valid */ - return 1; -} + orig_size = atomic64_read(&zram->stats.pages_stored); + max_used = atomic_long_read(&zram->stats.max_used_pages); -static void zram_meta_free(struct zram_meta *meta, u64 disksize) -{ - size_t num_pages = disksize >> PAGE_SHIFT; - size_t index; + ret = scnprintf(buf, PAGE_SIZE, + "%8llu %8llu %8llu %8lu %8ld %8llu %8lu\n", + orig_size << PAGE_SHIFT, + (u64)atomic64_read(&zram->stats.compr_data_size), + mem_used << PAGE_SHIFT, + zram->limit_pages << PAGE_SHIFT, + max_used << PAGE_SHIFT, + (u64)atomic64_read(&zram->stats.zero_pages), + pool_stats.pages_compacted); + up_read(&zram->init_lock); - /* Free all pages that are still in this zram device */ - for (index = 0; index < num_pages; index++) { + return ret; +} + +static DEVICE_ATTR_RO(io_stat); +static DEVICE_ATTR_RO(mm_stat); +ZRAM_ATTR_RO(num_reads); +ZRAM_ATTR_RO(num_writes); +ZRAM_ATTR_RO(failed_reads); +ZRAM_ATTR_RO(failed_writes); +ZRAM_ATTR_RO(invalid_io); +ZRAM_ATTR_RO(notify_free); +ZRAM_ATTR_RO(zero_pages); +ZRAM_ATTR_RO(compr_data_size); + +static inline bool zram_meta_get(struct zram *zram) +{ + if (atomic_inc_not_zero(&zram->refcount)) + return true; + return false; +} + +static inline void zram_meta_put(struct zram *zram) +{ + atomic_dec(&zram->refcount); +} + +static void zram_meta_free(struct zram_meta *meta, u64 disksize) +{ + size_t num_pages = disksize >> PAGE_SHIFT; + size_t index; + + /* Free all pages that are still in this zram device */ + for (index = 0; index < num_pages; index++) { unsigned long handle = meta->table[index].handle; if (!handle) @@ -414,10 +479,9 @@ static void zram_meta_free(struct zram_meta *meta, u64 disksize) kfree(meta); } -static struct zram_meta *zram_meta_alloc(int device_id, u64 disksize) +static struct zram_meta *zram_meta_alloc(char *pool_name, u64 disksize) { size_t num_pages; - char pool_name[8]; struct zram_meta *meta = kmalloc(sizeof(*meta), GFP_KERNEL); if (!meta) @@ -430,8 +494,7 @@ static struct zram_meta *zram_meta_alloc(int device_id, u64 disksize) goto out_error; } - snprintf(pool_name, sizeof(pool_name), "zram%d", device_id); - meta->mem_pool = zs_create_pool(pool_name, GFP_NOIO | __GFP_HIGHMEM); + meta->mem_pool = zs_create_pool(pool_name); if (!meta->mem_pool) { pr_err("Error creating memory pool\n"); goto out_error; @@ -445,56 +508,6 @@ static struct zram_meta *zram_meta_alloc(int device_id, u64 disksize) return NULL; } -static inline bool zram_meta_get(struct zram *zram) -{ - if (atomic_inc_not_zero(&zram->refcount)) - return true; - return false; -} - -static inline void zram_meta_put(struct zram *zram) -{ - atomic_dec(&zram->refcount); -} - -static void update_position(u32 *index, int *offset, struct bio_vec *bvec) -{ - if (*offset + bvec->bv_len >= PAGE_SIZE) - (*index)++; - *offset = (*offset + bvec->bv_len) % PAGE_SIZE; -} - -static int page_zero_filled(void *ptr) -{ - unsigned int pos; - unsigned long *page; - - page = (unsigned long *)ptr; - - for (pos = 0; pos != PAGE_SIZE / sizeof(*page); pos++) { - if (page[pos]) - return 0; - } - - return 1; -} - -static void handle_zero_page(struct bio_vec *bvec) -{ - struct page *page = bvec->bv_page; - void *user_mem; - - user_mem = kmap_atomic(page); - if (is_partial_io(bvec)) - memset(user_mem + bvec->bv_offset, 0, bvec->bv_len); - else - clear_page(user_mem); - kunmap_atomic(user_mem); - - flush_dcache_page(page); -} - - /* * To protect concurrent access to the same index entry, * caller should hold this table index entry's bit_spinlock to @@ -589,7 +602,7 @@ static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, uncmem = user_mem; if (!uncmem) { - pr_info("Unable to allocate temp memory\n"); + pr_err("Unable to allocate temp memory\n"); ret = -ENOMEM; goto out_cleanup; } @@ -612,34 +625,17 @@ static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, return ret; } -static inline void update_used_max(struct zram *zram, - const unsigned long pages) -{ - unsigned long old_max, cur_max; - - old_max = atomic_long_read(&zram->stats.max_used_pages); - - do { - cur_max = old_max; - if (pages > cur_max) - old_max = atomic_long_cmpxchg( - &zram->stats.max_used_pages, cur_max, pages); - } while (old_max != cur_max); -} - static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, int offset) { int ret = 0; size_t clen; - unsigned long handle; + unsigned long handle = 0; struct page *page; unsigned char *user_mem, *cmem, *src, *uncmem = NULL; struct zram_meta *meta = zram->meta; - struct zcomp_strm *zstrm; - bool locked = false; + struct zcomp_strm *zstrm = NULL; unsigned long alloced_pages; - static unsigned long zram_rs_time; page = bvec->bv_page; if (is_partial_io(bvec)) { @@ -657,10 +653,8 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, goto out; } - zstrm = zcomp_strm_find(zram->comp); - locked = true; +compress_again: user_mem = kmap_atomic(page); - if (is_partial_io(bvec)) { memcpy(uncmem + offset, user_mem + bvec->bv_offset, bvec->bv_len); @@ -684,6 +678,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, goto out; } + zstrm = zcomp_strm_find(zram->comp); ret = zcomp_compress(zram->comp, zstrm, uncmem, &clen); if (!is_partial_io(bvec)) { kunmap_atomic(user_mem); @@ -695,6 +690,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, pr_err("Compression failed! err=%d\n", ret); goto out; } + src = zstrm->buffer; if (unlikely(clen > max_zpage_size)) { clen = PAGE_SIZE; @@ -702,26 +698,48 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, src = uncmem; } - handle = zs_malloc(meta->mem_pool, clen); + /* + * handle allocation has 2 paths: + * a) fast path is executed with preemption disabled (for + * per-cpu streams) and has __GFP_DIRECT_RECLAIM bit clear, + * since we can't sleep; + * b) slow path enables preemption and attempts to allocate + * the page with __GFP_DIRECT_RECLAIM bit set. we have to + * put per-cpu compression stream and, thus, to re-do + * the compression once handle is allocated. + * + * if we have a 'non-null' handle here then we are coming + * from the slow path and handle has already been allocated. + */ + if (!handle) + handle = zs_malloc(meta->mem_pool, clen, + + __GFP_NOWARN | + __GFP_HIGHMEM); if (!handle) { - if (printk_timed_ratelimit(&zram_rs_time, - ALLOC_ERROR_LOG_RATE_MS)) - pr_info("Error allocating memory for compressed page: %u, size=%zu\n", - index, clen); + zcomp_strm_release(zram->comp, zstrm); + zstrm = NULL; + handle = zs_malloc(meta->mem_pool, clen, + GFP_NOIO | __GFP_HIGHMEM); + if (handle) + goto compress_again; + + pr_err("Error allocating memory for compressed page: %u, size=%zu\n", + index, clen); ret = -ENOMEM; goto out; } alloced_pages = zs_get_total_pages(meta->mem_pool); + update_used_max(zram, alloced_pages); + if (zram->limit_pages && alloced_pages > zram->limit_pages) { zs_free(meta->mem_pool, handle); ret = -ENOMEM; goto out; } - update_used_max(zram, alloced_pages); - cmem = zs_map_object(meta->mem_pool, handle, ZS_MM_WO); if ((clen == PAGE_SIZE) && !is_partial_io(bvec)) { @@ -733,7 +751,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, } zcomp_strm_release(zram->comp, zstrm); - locked = false; + zstrm = NULL; zs_unmap_object(meta->mem_pool, handle); /* @@ -751,36 +769,13 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, atomic64_add(clen, &zram->stats.compr_data_size); atomic64_inc(&zram->stats.pages_stored); out: - if (locked) + if (zstrm) zcomp_strm_release(zram->comp, zstrm); if (is_partial_io(bvec)) kfree(uncmem); return ret; } -static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, - int offset, int rw) -{ - int ret; - - if (rw == READ) { - atomic64_inc(&zram->stats.num_reads); - ret = zram_bvec_read(zram, bvec, index, offset); - } else { - atomic64_inc(&zram->stats.num_writes); - ret = zram_bvec_write(zram, bvec, index, offset); - } - - if (unlikely(ret)) { - if (rw == READ) - atomic64_inc(&zram->stats.failed_reads); - else - atomic64_inc(&zram->stats.failed_writes); - } - - return ret; -} - /* * zram_bio_discard - handler on discard request * @index: physical block index in PAGE_SIZE units @@ -820,217 +815,99 @@ static void zram_bio_discard(struct zram *zram, u32 index, } } -static void zram_reset_device(struct zram *zram) +static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, + int offset, int rw) { - struct zram_meta *meta; - struct zcomp *comp; - u64 disksize; - down_write(&zram->init_lock); + int ret; +/* + generic_start_io_acct(rw, bvec->bv_len >> SECTOR_SHIFT, + &zram->disk->part0); +*/ + if (rw == READ) { + atomic64_inc(&zram->stats.num_reads); + ret = zram_bvec_read(zram, bvec, index, offset); + } else { + atomic64_inc(&zram->stats.num_writes); + ret = zram_bvec_write(zram, bvec, index, offset); + } +/* + generic_end_io_acct(rw, &zram->disk->part0, start_time); +*/ + if (unlikely(ret)) { + if (rw == READ) + atomic64_inc(&zram->stats.failed_reads); + else + atomic64_inc(&zram->stats.failed_writes); + } - zram->limit_pages = 0; + return ret; +} - if (!init_done(zram)) { - up_write(&zram->init_lock); +static void __zram_make_request(struct zram *zram, struct bio *bio) +{ + int offset, rw; + u32 index; + struct bio_vec bvec; + struct bvec_iter iter; + + index = bio->bi_iter.bi_sector >> SECTORS_PER_PAGE_SHIFT; + offset = (bio->bi_iter.bi_sector & + (SECTORS_PER_PAGE - 1)) << SECTOR_SHIFT; + + if (unlikely(bio->bi_rw & REQ_DISCARD)) { + zram_bio_discard(zram, index, offset, bio); + bio_endio(bio, 0); return; } - meta = zram->meta; - comp = zram->comp; - disksize = zram->disksize; - /* - * Refcount will go down to 0 eventually and r/w handler - * cannot handle further I/O so it will bail out by - * check zram_meta_get. - */ - zram_meta_put(zram); - /* - * We want to free zram_meta in process context to avoid - * deadlock between reclaim path and any other locks. - */ - wait_event(zram->io_done, atomic_read(&zram->refcount) == 0); + rw = bio_data_dir(bio); + bio_for_each_segment(bvec, bio, iter) { + int max_transfer_size = PAGE_SIZE - offset; - /* Reset stats */ - memset(&zram->stats, 0, sizeof(zram->stats)); - zram->disksize = 0; - zram->max_comp_streams = 1; + if (bvec.bv_len > max_transfer_size) { + /* + * zram_bvec_rw() can only make operation on a single + * zram page. Split the bio vector. + */ + struct bio_vec bv; - set_capacity(zram->disk, 0); - part_stat_set_all(&zram->disk->part0, 0); + bv.bv_page = bvec.bv_page; + bv.bv_len = max_transfer_size; + bv.bv_offset = bvec.bv_offset; - up_write(&zram->init_lock); - /* I/O operation under all of CPU are done so let's free */ - zram_meta_free(meta, disksize); - zcomp_destroy(comp); + if (zram_bvec_rw(zram, &bv, index, offset, rw) < 0) + goto out; + + bv.bv_len = bvec.bv_len - max_transfer_size; + bv.bv_offset += max_transfer_size; + if (zram_bvec_rw(zram, &bv, index + 1, 0, rw) < 0) + goto out; + } else + if (zram_bvec_rw(zram, &bvec, index, offset, rw) < 0) + goto out; + + update_position(&index, &offset, &bvec); + } + + bio_endio(bio, 0); + return; + +out: + bio_io_error(bio); } -static ssize_t disksize_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) +/* + * Handler function for all zram I/O requests. + */ +static void zram_make_request(struct request_queue *queue, struct bio *bio) { - u64 disksize; - struct zcomp *comp; - struct zram_meta *meta; - struct zram *zram = dev_to_zram(dev); - int err; + struct zram *zram = queue->queuedata; - disksize = memparse(buf, NULL); - if (!disksize) - return -EINVAL; + if (unlikely(!zram_meta_get(zram))) + goto error; - disksize = PAGE_ALIGN(disksize); - meta = zram_meta_alloc(zram->disk->first_minor, disksize); - if (!meta) - return -ENOMEM; - comp = zcomp_create(zram->compressor, zram->max_comp_streams); - if (IS_ERR(comp)) { - pr_info("Cannot initialise %s compressing backend\n", - zram->compressor); - err = PTR_ERR(comp); - goto out_free_meta; - } - - down_write(&zram->init_lock); - if (init_done(zram)) { - pr_info("Cannot change disksize for initialized device\n"); - err = -EBUSY; - goto out_destroy_comp; - } - - init_waitqueue_head(&zram->io_done); - atomic_set(&zram->refcount, 1); - zram->meta = meta; - zram->comp = comp; - zram->disksize = disksize; - set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); - up_write(&zram->init_lock); - - /* - * Revalidate disk out of the init_lock to avoid lockdep splat. - * It's okay because disk's capacity is protected by init_lock - * so that revalidate_disk always sees up-to-date capacity. - */ - revalidate_disk(zram->disk); - - return len; - -out_destroy_comp: - up_write(&zram->init_lock); - zcomp_destroy(comp); -out_free_meta: - zram_meta_free(meta, disksize); - return err; -} - -static ssize_t reset_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) -{ - int ret; - unsigned short do_reset; - struct zram *zram; - struct block_device *bdev; - - zram = dev_to_zram(dev); - bdev = bdget_disk(zram->disk, 0); - - if (!bdev) - return -ENOMEM; - - mutex_lock(&bdev->bd_mutex); - /* Do not reset an active device! */ - if (bdev->bd_openers) { - ret = -EBUSY; - goto out; - } - - ret = kstrtou16(buf, 10, &do_reset); - if (ret) - goto out; - - if (!do_reset) { - ret = -EINVAL; - goto out; - } - - /* Make sure all pending I/O is finished */ - fsync_bdev(bdev); - zram_reset_device(zram); - - mutex_unlock(&bdev->bd_mutex); - revalidate_disk(zram->disk); - bdput(bdev); - - return len; - -out: - mutex_unlock(&bdev->bd_mutex); - bdput(bdev); - return ret; -} - -static void __zram_make_request(struct zram *zram, struct bio *bio) -{ - int offset, rw; - u32 index; - struct bio_vec bvec; - struct bvec_iter iter; - - index = bio->bi_iter.bi_sector >> SECTORS_PER_PAGE_SHIFT; - offset = (bio->bi_iter.bi_sector & - (SECTORS_PER_PAGE - 1)) << SECTOR_SHIFT; - - if (unlikely(bio->bi_rw & REQ_DISCARD)) { - zram_bio_discard(zram, index, offset, bio); - bio_endio(bio, 0); - return; - } - - rw = bio_data_dir(bio); - bio_for_each_segment(bvec, bio, iter) { - int max_transfer_size = PAGE_SIZE - offset; - - if (bvec.bv_len > max_transfer_size) { - /* - * zram_bvec_rw() can only make operation on a single - * zram page. Split the bio vector. - */ - struct bio_vec bv; - - bv.bv_page = bvec.bv_page; - bv.bv_len = max_transfer_size; - bv.bv_offset = bvec.bv_offset; - - if (zram_bvec_rw(zram, &bv, index, offset, rw) < 0) - goto out; - - bv.bv_len = bvec.bv_len - max_transfer_size; - bv.bv_offset += max_transfer_size; - if (zram_bvec_rw(zram, &bv, index + 1, 0, rw) < 0) - goto out; - } else - if (zram_bvec_rw(zram, &bvec, index, offset, rw) < 0) - goto out; - - update_position(&index, &offset, &bvec); - } - - set_bit(BIO_UPTODATE, &bio->bi_flags); - bio_endio(bio, 0); - return; - -out: - bio_io_error(bio); -} - -/* - * Handler function for all zram I/O requests. - */ -static void zram_make_request(struct request_queue *queue, struct bio *bio) -{ - struct zram *zram = queue->queuedata; - - if (unlikely(!zram_meta_get(zram))) - goto error; if (!valid_io_request(zram, bio->bi_iter.bi_sector, bio->bi_iter.bi_size)) { @@ -1045,6 +922,7 @@ static void zram_make_request(struct request_queue *queue, struct bio *bio) zram_meta_put(zram); error: bio_io_error(bio); + return; } static void zram_slot_free_notify(struct block_device *bdev, @@ -1104,80 +982,184 @@ static int zram_rw_page(struct block_device *bdev, sector_t sector, return err; } -static const struct block_device_operations zram_devops = { - .swap_slot_free_notify = zram_slot_free_notify, - .rw_page = zram_rw_page, - .owner = THIS_MODULE -}; +static void zram_reset_device(struct zram *zram) +{ + struct zram_meta *meta; + struct zcomp *comp; + u64 disksize; -static DEVICE_ATTR_WO(compact); -static DEVICE_ATTR_RW(disksize); -static DEVICE_ATTR_RO(initstate); -static DEVICE_ATTR_WO(reset); -static DEVICE_ATTR_RO(orig_data_size); -static DEVICE_ATTR_RO(mem_used_total); -static DEVICE_ATTR_RW(mem_limit); -static DEVICE_ATTR_RW(mem_used_max); -static DEVICE_ATTR_RW(max_comp_streams); -static DEVICE_ATTR_RW(comp_algorithm); + down_write(&zram->init_lock); -static ssize_t io_stat_show(struct device *dev, - struct device_attribute *attr, char *buf) + zram->limit_pages = 0; + + if (!init_done(zram)) { + up_write(&zram->init_lock); + return; + } + + meta = zram->meta; + comp = zram->comp; + disksize = zram->disksize; + /* + * Refcount will go down to 0 eventually and r/w handler + * cannot handle further I/O so it will bail out by + * check zram_meta_get. + */ + zram_meta_put(zram); + /* + * We want to free zram_meta in process context to avoid + * deadlock between reclaim path and any other locks. + */ + wait_event(zram->io_done, atomic_read(&zram->refcount) == 0); + + /* Reset stats */ + memset(&zram->stats, 0, sizeof(zram->stats)); + zram->disksize = 0; + + set_capacity(zram->disk, 0); + part_stat_set_all(&zram->disk->part0, 0); + + up_write(&zram->init_lock); + /* I/O operation under all of CPU are done so let's free */ + zram_meta_free(meta, disksize); + zcomp_destroy(comp); +} + +static ssize_t disksize_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) { + u64 disksize; + struct zcomp *comp; + struct zram_meta *meta; struct zram *zram = dev_to_zram(dev); - ssize_t ret; + int err; - down_read(&zram->init_lock); - ret = scnprintf(buf, PAGE_SIZE, - "%8llu %8llu %8llu %8llu\n", - (u64)atomic64_read(&zram->stats.failed_reads), - (u64)atomic64_read(&zram->stats.failed_writes), - (u64)atomic64_read(&zram->stats.invalid_io), - (u64)atomic64_read(&zram->stats.notify_free)); - up_read(&zram->init_lock); + disksize = memparse(buf, NULL); + if (!disksize) + return -EINVAL; - return ret; + disksize = PAGE_ALIGN(disksize); + meta = zram_meta_alloc(zram->disk->disk_name, disksize); + if (!meta) + return -ENOMEM; + + comp = zcomp_create(zram->compressor); + if (IS_ERR(comp)) { + pr_err("Cannot initialise %s compressing backend\n", + zram->compressor); + err = PTR_ERR(comp); + goto out_free_meta; + } + + down_write(&zram->init_lock); + if (init_done(zram)) { + pr_info("Cannot change disksize for initialized device\n"); + err = -EBUSY; + goto out_destroy_comp; + } + + init_waitqueue_head(&zram->io_done); + atomic_set(&zram->refcount, 1); + zram->meta = meta; + zram->comp = comp; + zram->disksize = disksize; + set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); + up_write(&zram->init_lock); + + /* + * Revalidate disk out of the init_lock to avoid lockdep splat. + * It's okay because disk's capacity is protected by init_lock + * so that revalidate_disk always sees up-to-date capacity. + */ + revalidate_disk(zram->disk); + + return len; + +out_destroy_comp: + up_write(&zram->init_lock); + zcomp_destroy(comp); +out_free_meta: + zram_meta_free(meta, disksize); + return err; } -static ssize_t mm_stat_show(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t reset_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) { - struct zram *zram = dev_to_zram(dev); - u64 orig_size, mem_used = 0; - long max_used; - ssize_t ret; + int ret; + unsigned short do_reset; + struct zram *zram; + struct block_device *bdev; - down_read(&zram->init_lock); - if (init_done(zram)) - mem_used = zs_get_total_pages(zram->meta->mem_pool); + ret = kstrtou16(buf, 10, &do_reset); + if (ret) + return ret; - orig_size = atomic64_read(&zram->stats.pages_stored); - max_used = atomic_long_read(&zram->stats.max_used_pages); + if (!do_reset) + return -EINVAL; - ret = scnprintf(buf, PAGE_SIZE, - "%8llu %8llu %8llu %8lu %8ld %8llu %8llu\n", - orig_size << PAGE_SHIFT, - (u64)atomic64_read(&zram->stats.compr_data_size), - mem_used << PAGE_SHIFT, - zram->limit_pages << PAGE_SHIFT, - max_used << PAGE_SHIFT, - (u64)atomic64_read(&zram->stats.zero_pages), - (u64)atomic64_read(&zram->stats.num_migrated)); - up_read(&zram->init_lock); + zram = dev_to_zram(dev); + bdev = bdget_disk(zram->disk, 0); + if (!bdev) + return -ENOMEM; + + mutex_lock(&bdev->bd_mutex); + /* Do not reset an active device or claimed device */ + if (bdev->bd_openers || zram->claim) { + mutex_unlock(&bdev->bd_mutex); + bdput(bdev); + return -EBUSY; + } + + /* From now on, anyone can't open /dev/zram[0-9] */ + zram->claim = true; + mutex_unlock(&bdev->bd_mutex); + + /* Make sure all the pending I/O are finished */ + fsync_bdev(bdev); + zram_reset_device(zram); + revalidate_disk(zram->disk); + bdput(bdev); + + mutex_lock(&bdev->bd_mutex); + zram->claim = false; + mutex_unlock(&bdev->bd_mutex); + + return len; +} + +static int zram_open(struct block_device *bdev, fmode_t mode) +{ + int ret = 0; + struct zram *zram; + + WARN_ON(!mutex_is_locked(&bdev->bd_mutex)); + + zram = bdev->bd_disk->private_data; + /* zram was claimed to reset so open request fails */ + if (zram->claim) + ret = -EBUSY; return ret; } -static DEVICE_ATTR_RO(io_stat); -static DEVICE_ATTR_RO(mm_stat); -ZRAM_ATTR_RO(num_reads); -ZRAM_ATTR_RO(num_writes); -ZRAM_ATTR_RO(failed_reads); -ZRAM_ATTR_RO(failed_writes); -ZRAM_ATTR_RO(invalid_io); -ZRAM_ATTR_RO(notify_free); -ZRAM_ATTR_RO(zero_pages); -ZRAM_ATTR_RO(compr_data_size); +static const struct block_device_operations zram_devops = { + .open = zram_open, + .swap_slot_free_notify = zram_slot_free_notify, + .rw_page = zram_rw_page, + .owner = THIS_MODULE +}; + +static DEVICE_ATTR_WO(compact); +static DEVICE_ATTR_RW(disksize); +static DEVICE_ATTR_RO(initstate); +static DEVICE_ATTR_WO(reset); +static DEVICE_ATTR_RO(orig_data_size); +static DEVICE_ATTR_RO(mem_used_total); +static DEVICE_ATTR_RW(mem_limit); +static DEVICE_ATTR_RW(mem_used_max); +static DEVICE_ATTR_RW(max_comp_streams); +static DEVICE_ATTR_RW(comp_algorithm); static struct attribute *zram_disk_attrs[] = { &dev_attr_disksize.attr, @@ -1207,10 +1189,24 @@ static struct attribute_group zram_disk_attr_group = { .attrs = zram_disk_attrs, }; -static int create_device(struct zram *zram, int device_id) +/* + * Allocate and initialize new zram device. the function returns + * '>= 0' device_id upon success, and negative value otherwise. + */ +static int zram_add(void) { + struct zram *zram; struct request_queue *queue; - int ret = -ENOMEM; + int ret, device_id; + + zram = kzalloc(sizeof(struct zram), GFP_KERNEL); + if (!zram) + return -ENOMEM; + + ret = idr_alloc(&zram_index_idr, zram, 0, 0, GFP_KERNEL); + if (ret < 0) + goto out_free_dev; + device_id = ret; init_rwsem(&zram->init_lock); @@ -1218,15 +1214,16 @@ static int create_device(struct zram *zram, int device_id) if (!queue) { pr_err("Error allocating disk queue for device %d\n", device_id); - goto out; + ret = -ENOMEM; + goto out_free_idr; } blk_queue_make_request(queue, zram_make_request); - /* gendisk structure */ + /* gendisk structure */ zram->disk = alloc_disk(1); if (!zram->disk) { - pr_warn("Error allocating disk structure for device %d\n", + pr_err("Error allocating disk structure for device %d\n", device_id); ret = -ENOMEM; goto out_free_queue; @@ -1240,7 +1237,6 @@ static int create_device(struct zram *zram, int device_id) zram->disk->private_data = zram; snprintf(zram->disk->disk_name, 16, "zram%d", device_id); - __set_bit(QUEUE_FLAG_FAST, &queue->queue_flags); /* Actual capacity set using syfs (/sys/block/zram/disksize */ set_capacity(zram->disk, 0); /* zram devices sort of resembles non-rotational disks */ @@ -1256,7 +1252,7 @@ static int create_device(struct zram *zram, int device_id) blk_queue_io_min(zram->disk->queue, PAGE_SIZE); blk_queue_io_opt(zram->disk->queue, PAGE_SIZE); zram->disk->queue->limits.discard_granularity = PAGE_SIZE; - zram->disk->queue->limits.max_discard_sectors = UINT_MAX; + blk_queue_max_discard_sectors(zram->disk->queue, UINT_MAX); /* * zram_bio_discard() will clear all logical blocks if logical block * size is identical with physical block size(PAGE_SIZE). But if it is @@ -1276,98 +1272,184 @@ static int create_device(struct zram *zram, int device_id) ret = sysfs_create_group(&disk_to_dev(zram->disk)->kobj, &zram_disk_attr_group); if (ret < 0) { - pr_warn("Error creating sysfs group"); + pr_err("Error creating sysfs group for device %d\n", + device_id); goto out_free_disk; } strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor)); zram->meta = NULL; - zram->max_comp_streams = 1; - return 0; + + pr_info("Added device: %s\n", zram->disk->disk_name); + return device_id; out_free_disk: del_gendisk(zram->disk); put_disk(zram->disk); out_free_queue: blk_cleanup_queue(queue); -out: +out_free_idr: + idr_remove(&zram_index_idr, device_id); +out_free_dev: + kfree(zram); return ret; } -static void destroy_devices(unsigned int nr) +static int zram_remove(struct zram *zram) +{ + struct block_device *bdev; + + bdev = bdget_disk(zram->disk, 0); + if (!bdev) + return -ENOMEM; + + mutex_lock(&bdev->bd_mutex); + if (bdev->bd_openers || zram->claim) { + mutex_unlock(&bdev->bd_mutex); + bdput(bdev); + return -EBUSY; + } + + zram->claim = true; + mutex_unlock(&bdev->bd_mutex); + + /* + * Remove sysfs first, so no one will perform a disksize + * store while we destroy the devices. This also helps during + * hot_remove -- zram_reset_device() is the last holder of + * ->init_lock, no later/concurrent disksize_store() or any + * other sysfs handlers are possible. + */ + sysfs_remove_group(&disk_to_dev(zram->disk)->kobj, + &zram_disk_attr_group); + + /* Make sure all the pending I/O are finished */ + fsync_bdev(bdev); + zram_reset_device(zram); + bdput(bdev); + + pr_info("Removed device: %s\n", zram->disk->disk_name); + + blk_cleanup_queue(zram->disk->queue); + del_gendisk(zram->disk); + put_disk(zram->disk); + kfree(zram); + return 0; +} + +/* zram-control sysfs attributes */ +static ssize_t hot_add_show(struct class *class, + struct class_attribute *attr, + char *buf) +{ + int ret; + + mutex_lock(&zram_index_mutex); + ret = zram_add(); + mutex_unlock(&zram_index_mutex); + + if (ret < 0) + return ret; + return scnprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t hot_remove_store(struct class *class, + struct class_attribute *attr, + const char *buf, + size_t count) { struct zram *zram; - unsigned int i; + int ret, dev_id; - for (i = 0; i < nr; i++) { - zram = &zram_devices[i]; - /* - * Remove sysfs first, so no one will perform a disksize - * store while we destroy the devices - */ - sysfs_remove_group(&disk_to_dev(zram->disk)->kobj, - &zram_disk_attr_group); + /* dev_id is gendisk->first_minor, which is `int' */ + ret = kstrtoint(buf, 10, &dev_id); + if (ret) + return ret; + if (dev_id < 0) + return -EINVAL; - zram_reset_device(zram); + mutex_lock(&zram_index_mutex); - blk_cleanup_queue(zram->disk->queue); - del_gendisk(zram->disk); - put_disk(zram->disk); + zram = idr_find(&zram_index_idr, dev_id); + if (zram) { + ret = zram_remove(zram); + idr_remove(&zram_index_idr, dev_id); + } else { + ret = -ENODEV; } - kfree(zram_devices); + mutex_unlock(&zram_index_mutex); + return ret ? ret : count; +} + +static struct class_attribute zram_control_class_attrs[] = { + __ATTR_RO(hot_add), + __ATTR_WO(hot_remove), + __ATTR_NULL, +}; + +static struct class zram_control_class = { + .name = "zram-control", + .owner = THIS_MODULE, + .class_attrs = zram_control_class_attrs, +}; + +static int zram_remove_cb(int id, void *ptr, void *data) +{ + zram_remove(ptr); + return 0; +} + +static void destroy_devices(void) +{ + class_unregister(&zram_control_class); + idr_for_each(&zram_index_idr, &zram_remove_cb, NULL); + idr_destroy(&zram_index_idr); unregister_blkdev(zram_major, "zram"); - pr_info("Destroyed %u device(s)\n", nr); } static int __init zram_init(void) { - int ret, dev_id; + int ret; - if (num_devices > max_num_devices) { - pr_warn("Invalid value for num_devices: %u\n", - num_devices); - return -EINVAL; + ret = class_register(&zram_control_class); + if (ret) { + pr_err("Unable to register zram-control class\n"); + return ret; } zram_major = register_blkdev(0, "zram"); if (zram_major <= 0) { - pr_warn("Unable to get major number\n"); + pr_err("Unable to get major number\n"); + class_unregister(&zram_control_class); return -EBUSY; } - /* Allocate the device array and initialize each one */ - zram_devices = kzalloc(num_devices * sizeof(struct zram), GFP_KERNEL); - if (!zram_devices) { - unregister_blkdev(zram_major, "zram"); - return -ENOMEM; - } - - for (dev_id = 0; dev_id < num_devices; dev_id++) { - ret = create_device(&zram_devices[dev_id], dev_id); - if (ret) + while (num_devices != 0) { + mutex_lock(&zram_index_mutex); + ret = zram_add(); + mutex_unlock(&zram_index_mutex); + if (ret < 0) goto out_error; + num_devices--; } - show_mem_notifier_register(&zram_show_mem_notifier_block); - pr_info("Created %u device(s) ...\n", num_devices); - return 0; out_error: - destroy_devices(dev_id); + destroy_devices(); return ret; } static void __exit zram_exit(void) { - destroy_devices(num_devices); + destroy_devices(); } module_init(zram_init); module_exit(zram_exit); module_param(num_devices, uint, 0); -MODULE_PARM_DESC(num_devices, "Number of zram devices"); +MODULE_PARM_DESC(num_devices, "Number of pre-created zram devices"); MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Nitin Gupta "); diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index 570c598f4ce9a..06b1636f47221 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -20,12 +20,6 @@ #include "zcomp.h" -/* - * Some arbitrary value. This is just to catch - * invalid value for num_devices module parameter. - */ -static const unsigned max_num_devices = 32; - /*-- Configurable parameters */ /* @@ -84,7 +78,6 @@ struct zram_stats { atomic64_t compr_data_size; /* compressed size of pages stored */ atomic64_t num_reads; /* failed + successful */ atomic64_t num_writes; /* --do-- */ - atomic64_t num_migrated; /* no. of migrated object */ atomic64_t failed_reads; /* can happen when memory is too low */ atomic64_t failed_writes; /* can happen when memory is too low */ atomic64_t invalid_io; /* non-page-aligned I/O requests */ @@ -109,7 +102,6 @@ struct zram { * the number of pages zram can consume for storing compressed data */ unsigned long limit_pages; - int max_comp_streams; struct zram_stats stats; atomic_t refcount; /* refcount for zram_meta */ @@ -121,5 +113,9 @@ struct zram { */ u64 disksize; /* bytes */ char compressor[10]; + /* + * zram is claimed so open request will be failed + */ + bool claim; /* Protected by bdev->bd_mutex */ }; #endif diff --git a/drivers/char/diag/diag_masks.c b/drivers/char/diag/diag_masks.c index 7b2fa58147311..de18a7a86dc41 100644 --- a/drivers/char/diag/diag_masks.c +++ b/drivers/char/diag/diag_masks.c @@ -753,7 +753,9 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_msg_mask_update(i, req->ssid_first, req->ssid_last); + mutex_unlock(&driver->md_session_lock); } end: return write_len; @@ -815,7 +817,9 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_msg_mask_update(i, ALL_SSID, ALL_SSID); + mutex_unlock(&driver->md_session_lock); } return write_len; @@ -909,7 +913,9 @@ static int diag_cmd_update_event_mask(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_event_mask_update(i); + mutex_unlock(&driver->md_session_lock); } return write_len; @@ -956,7 +962,9 @@ static int diag_cmd_toggle_events(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_event_mask_update(i); + mutex_unlock(&driver->md_session_lock); } memcpy(dest_buf, &header, sizeof(header)); write_len += sizeof(header); @@ -1210,7 +1218,9 @@ static int diag_cmd_set_log_mask(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_log_mask_update(i, req->equip_id); + mutex_unlock(&driver->md_session_lock); } end: return write_len; @@ -1261,7 +1271,9 @@ static int diag_cmd_disable_log_mask(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_log_mask_update(i, ALL_EQUIP_ID); + mutex_unlock(&driver->md_session_lock); } return write_len; @@ -1882,6 +1894,12 @@ int diag_copy_to_user_log_mask(char __user *buf, size_t count, mutex_lock(&mask_info->lock); mask = (struct diag_log_mask_t *)(mask_info->ptr); for (i = 0; i < MAX_EQUIP_ID; i++, mask++) { + if (!mask->ptr) { + pr_err("diag: In %s, mask->ptr==NULL, equip_id:%d\n", + __func__, mask->equip_id); + continue; + } + ptr = mask_info->update_buf; len = 0; mutex_lock(&mask->lock); @@ -1924,9 +1942,11 @@ void diag_send_updates_peripheral(uint8_t peripheral) diag_send_feature_mask_update(peripheral); if (driver->time_sync_enabled) diag_send_time_sync_update(peripheral); + mutex_lock(&driver->md_session_lock); diag_send_msg_mask_update(peripheral, ALL_SSID, ALL_SSID); diag_send_log_mask_update(peripheral, ALL_EQUIP_ID); diag_send_event_mask_update(peripheral); + mutex_unlock(&driver->md_session_lock); diag_send_real_time_update(peripheral, driver->real_time_mode[DIAG_LOCAL_PROC]); diag_send_peripheral_buffering_mode( diff --git a/drivers/char/diag/diag_usb.c b/drivers/char/diag/diag_usb.c index ca54b24ec6042..93c5076302cf9 100644 --- a/drivers/char/diag/diag_usb.c +++ b/drivers/char/diag/diag_usb.c @@ -213,23 +213,33 @@ static void usb_connect_work_fn(struct work_struct *work) * and synchronously when Diag wants to disconnect from USB * explicitly. */ -static void usb_disconnect(struct diag_usb_info *ch) +static void __usb_disconnect(struct diag_usb_info *ch, int skip) { if (!ch) return; - if (!atomic_read(&ch->connected) && driver->usb_connected) + WARN_ON(skip && !atomic_read(&ch->connected) && driver->usb_connected); + + if (!skip && !atomic_read(&ch->connected) && driver->usb_connected) diag_clear_masks(NULL); if (ch && ch->ops && ch->ops->close) ch->ops->close(ch->ctxt, DIAG_USB_MODE); } +static void usb_disconnect(struct diag_usb_info *ch) +{ + if (!ch) + return; + + __usb_disconnect(ch, ch->closing); +} + static void usb_disconnect_work_fn(struct work_struct *work) { struct diag_usb_info *ch = container_of(work, struct diag_usb_info, disconnect_work); - usb_disconnect(ch); + __usb_disconnect(ch, 0); } static void usb_read_work_fn(struct work_struct *work) @@ -354,12 +364,14 @@ static void diag_usb_notifier(void *priv, unsigned event, switch (event) { case USB_DIAG_CONNECT: usb_info->max_size = usb_diag_request_size(usb_info->hdl); + usb_info->closing = 0; atomic_set(&usb_info->connected, 1); pr_info("diag: USB channel %s connected\n", usb_info->name); queue_work(usb_info->usb_wq, &usb_info->connect_work); break; case USB_DIAG_DISCONNECT: + usb_info->closing = 1; atomic_set(&usb_info->connected, 0); pr_info("diag: USB channel %s disconnected\n", usb_info->name); queue_work(usb_info->usb_wq, diff --git a/drivers/char/diag/diag_usb.h b/drivers/char/diag/diag_usb.h index cf4d4db3e3c32..22bf9b7dc3cd1 100644 --- a/drivers/char/diag/diag_usb.h +++ b/drivers/char/diag/diag_usb.h @@ -53,6 +53,7 @@ struct diag_usb_info { atomic_t connected; atomic_t diag_state; atomic_t read_pending; + int closing; int enabled; int mempool; int max_size; diff --git a/drivers/char/diag/diagfwd.c b/drivers/char/diag/diagfwd.c index 2d79828449312..1668274709b1a 100644 --- a/drivers/char/diag/diagfwd.c +++ b/drivers/char/diag/diagfwd.c @@ -1,4 +1,5 @@ /* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -903,7 +904,11 @@ int diag_process_apps_pkt(unsigned char *buf, int len, pr_debug("diag: In %s, received cmd %02x %02x %02x\n", __func__, entry.cmd_code, entry.subsys_id, entry.cmd_code_hi); - +#ifdef WT_COMPILE_FACTORY_VERSION + if (entry.cmd_code == 0x4b && entry.subsys_id == 0x0b && (entry.cmd_code_hi == 0x36 || entry.cmd_code_hi == 0x34)) { + print_hex_dump(KERN_ERR, "wt_factory_cmd: ", DUMP_PREFIX_NONE, 16, 1, &buf[2], len > (3+5) ? 6 : (len-2), false); + } +#endif if (*buf == DIAG_CMD_LOG_ON_DMND && driver->log_on_demand_support && driver->feature[PERIPHERAL_MODEM].rcvd_feature_mask) { write_len = diag_cmd_log_on_demand(buf, len, diff --git a/drivers/clk/msm/clock-debug.c b/drivers/clk/msm/clock-debug.c index d0ff821eb2039..bbcfed53fb1f5 100644 --- a/drivers/clk/msm/clock-debug.c +++ b/drivers/clk/msm/clock-debug.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2007 Google, Inc. * Copyright (c) 2007-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -34,7 +35,7 @@ static LIST_HEAD(clk_list); static DEFINE_MUTEX(clk_list_lock); static struct dentry *debugfs_base; -static u32 debug_suspend; +static u32 debug_suspend = 1; static int clock_debug_rate_set(void *data, u64 val) { diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c index 789a131fec7a5..bdac1d22b5282 100644 --- a/drivers/cpufreq/cpufreq_interactive.c +++ b/drivers/cpufreq/cpufreq_interactive.c @@ -31,6 +31,7 @@ #include #include #include +#include #define CREATE_TRACE_POINTS #include @@ -662,6 +663,14 @@ static void cpufreq_interactive_timer(unsigned long data) ppol->policy->cur, new_freq); ppol->target_freq = new_freq; + + if ((ppol->target_freq != ppol->policy->cur) + && (ppol->target_freq > ppol->policy->max)) { + ktrace_add_cpufreq_event(KTRACE_CPUFREQ_TYPE_MITIGATION, + current->pid, ktime_to_ns(ktime_get()), max_cpu, + ppol->target_freq, ppol->policy->max); + } + spin_unlock_irqrestore(&ppol->target_freq_lock, flags); spin_lock_irqsave(&speedchange_cpumask_lock, flags); cpumask_set_cpu(max_cpu, &speedchange_cpumask); @@ -1796,6 +1805,12 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, case CPUFREQ_GOV_LIMITS: ppol = per_cpu(polinfo, policy->cpu); + if (policy->max < policy->cpuinfo.max_freq) { + ktrace_cpufreq_set_mitigated(current->comm, policy->cpu, policy->related_cpus, policy->max); + } else { + ktrace_cpufreq_set_mitigated(current->comm, policy->cpu, policy->related_cpus, 0); + } + __cpufreq_driver_target(policy, ppol->target_freq, CPUFREQ_RELATION_L); diff --git a/drivers/fingerprint/Kconfig b/drivers/fingerprint/Kconfig new file mode 100755 index 0000000000000..fc1ec096771d1 --- /dev/null +++ b/drivers/fingerprint/Kconfig @@ -0,0 +1,7 @@ +config FINGERPRINT + tristate "Fingerprint driver support" + help + Say Y here to enable goodix fingerprint driver support! + +source "drivers/fingerprint/goodix/Kconfig" +source "drivers/fingerprint/fpc/Kconfig" diff --git a/drivers/fingerprint/Makefile b/drivers/fingerprint/Makefile new file mode 100755 index 0000000000000..28d1360d2205c --- /dev/null +++ b/drivers/fingerprint/Makefile @@ -0,0 +1,2 @@ +obj-$(CONFIG_FINGERPRINT_GOODIX_GF3208) += goodix/ +obj-$(CONFIG_FINGERPRINT_FPC1020) += fpc/ diff --git a/drivers/fingerprint/fpc/Kconfig b/drivers/fingerprint/fpc/Kconfig new file mode 100755 index 0000000000000..49cbae40d8ce8 --- /dev/null +++ b/drivers/fingerprint/fpc/Kconfig @@ -0,0 +1,5 @@ +config FINGERPRINT_FPC1020 + tristate "FingerPrint Cards fingerprint drvier support" + depends on FINGERPRINT + help + Say Y here to enable goodix fingerprint driver support! diff --git a/drivers/fingerprint/fpc/Makefile b/drivers/fingerprint/fpc/Makefile new file mode 100755 index 0000000000000..2a107b89704d4 --- /dev/null +++ b/drivers/fingerprint/fpc/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_FINGERPRINT_FPC1020) += fpc1020_tee.o diff --git a/drivers/fingerprint/fpc/fpc1020_tee.c b/drivers/fingerprint/fpc/fpc1020_tee.c new file mode 100644 index 0000000000000..3588b8b634fd6 --- /dev/null +++ b/drivers/fingerprint/fpc/fpc1020_tee.c @@ -0,0 +1,715 @@ +/* + * FPC1020 Fingerprint sensor device driver + * + * This driver will control the platform resources that the FPC fingerprint + * sensor needs to operate. The major things are probing the sensor to check + * that it is actually connected and let the Kernel know this and with that also + * enabling and disabling of regulators, enabling and disabling of platform + * clocks, controlling GPIOs such as SPI chip select, sensor reset line, sensor + * IRQ line, MISO and MOSI lines. + * + * The driver will expose most of its available functionality in sysfs which + * enables dynamic control of these features from eg. a user space process. + * + * The sensor's IRQ events will be pushed to Kernel's event handling system and + * are exposed in the drivers event node. This makes it possible for a user + * space process to poll the input node and receive IRQ events easily. Usually + * this node is available under /dev/input/eventX where 'X' is a number given by + * the event system. A user space process will need to traverse all the event + * nodes and ask for its parent's name (through EVIOCGNAME) which should match + * the value in device tree named input-device-name. + * + * This driver will NOT send any SPI commands to the sensor it only controls the + * electrical parts. + * + * + * Copyright (c) 2015 Fingerprint Cards AB + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License Version 2 + * as published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FPC1020_RESET_LOW_US 1000 +#define FPC1020_RESET_HIGH1_US 100 +#define FPC1020_RESET_HIGH2_US 1250 +#define PWR_ON_STEP_SLEEP 100 +#define PWR_ON_STEP_RANGE1 100 +#define PWR_ON_STEP_RANGE2 900 +#define FPC_TTW_HOLD_TIME 2000 +#define FP_UNLOCK_REJECTION_TIMEOUT (FPC_TTW_HOLD_TIME - 500) +#define NUM_PARAMS_REG_ENABLE_SET 2 + +static const char * const pctl_names[] = { + "fpc1020_spi_active", + "fpc1020_reset_reset", + "fpc1020_reset_active", + "fpc1020_irq_active", +}; + + +struct fpc1020_data { + struct device *dev; + struct pinctrl *fingerprint_pinctrl; + struct pinctrl_state *pinctrl_state[ARRAY_SIZE(pctl_names)]; +#ifdef LINUX_CONTROL_SPI_CLK + u32 max_speed_hz; + struct clk *iface_clk; + struct clk *core_clk; +#endif + + struct wake_lock ttw_wl; + int irq_gpio; + int rst_gpio; + struct mutex lock; + bool prepared; + bool wakeup_enabled; + bool compatible_enabled; +#ifdef LINUX_CONTROL_SPI_CLK + bool clocks_enabled; + bool clocks_suspended; +#endif + struct notifier_block fb_notifier; + bool fb_black; + bool wait_finger_down; + struct work_struct work; +}; +char boardid_info_fingerprint[HARDWARE_MAX_ITEM_LONGTH] = {0,}; +static irqreturn_t fpc1020_irq_handler(int irq, void *handle); +static int fpc1020_request_named_gpio(struct fpc1020_data *fpc1020, + const char *label, int *gpio); +static int hw_reset(struct fpc1020_data *fpc1020); + +#ifdef LINUX_CONTROL_SPI_CLK +static int set_clks(struct fpc1020_data *fpc1020, bool enable) +{ + int rc = 0; + mutex_lock(&fpc1020->lock); + + if (enable == fpc1020->clocks_enabled) + goto out; + + if (enable) { + rc = clk_set_rate(fpc1020->core_clk, fpc1020->max_speed_hz); + if (rc) { + dev_err(fpc1020->dev, + "%s: Error setting clk_rate: %u, %d\n", + __func__, fpc1020->max_speed_hz, + rc); + goto out; + } + rc = clk_prepare_enable(fpc1020->core_clk); + if (rc) { + dev_err(fpc1020->dev, + "%s: Error enabling core clk: %d\n", + __func__, rc); + goto out; + } + + rc = clk_prepare_enable(fpc1020->iface_clk); + if (rc) { + dev_err(fpc1020->dev, + "%s: Error enabling iface clk: %d\n", + __func__, rc); + clk_disable_unprepare(fpc1020->core_clk); + goto out; + } + dev_dbg(fpc1020->dev, "%s ok. clk rate %u hz\n", __func__, + fpc1020->max_speed_hz); + + fpc1020->clocks_enabled = true; + } else { + clk_disable_unprepare(fpc1020->iface_clk); + clk_disable_unprepare(fpc1020->core_clk); + fpc1020->clocks_enabled = false; + } + +out: + mutex_unlock(&fpc1020->lock); + return rc; +} + +static ssize_t clk_enable_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + return set_clks(fpc1020, (*buf == '1')) ? : count; +} + +static DEVICE_ATTR(clk_enable, S_IWUSR, NULL, clk_enable_set); +#endif +/** + * Will try to select the set of pins (GPIOS) defined in a pin control node of + * the device tree named @p name. + * + * The node can contain several eg. GPIOs that is controlled when selecting it. + * The node may activate or deactivate the pins it contains, the action is + * defined in the device tree node itself and not here. The states used + * internally is fetched at probe time. + * + * @see pctl_names + * @see fpc1020_probe + */ +static int select_pin_ctl(struct fpc1020_data *fpc1020, const char *name) +{ + size_t i; + int rc; + struct device *dev = fpc1020->dev; + for (i = 0; i < ARRAY_SIZE(fpc1020->pinctrl_state); i++) { + const char *n = pctl_names[i]; + if (!strncmp(n, name, strlen(n))) { + rc = pinctrl_select_state(fpc1020->fingerprint_pinctrl, + fpc1020->pinctrl_state[i]); + if (rc) + dev_err(dev, "cannot select '%s'\n", name); + else + dev_dbg(dev, "Selected '%s'\n", name); + goto exit; + } + } + rc = -EINVAL; + dev_err(dev, "%s:'%s' not found\n", __func__, name); +exit: + return rc; +} + +static ssize_t pinctl_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + int rc = select_pin_ctl(fpc1020, buf); + return rc ? rc : count; +} +static DEVICE_ATTR(pinctl_set, S_IWUSR, NULL, pinctl_set); + +static int hw_reset(struct fpc1020_data *fpc1020) +{ + int irq_gpio; + struct device *dev = fpc1020->dev; + + int rc = select_pin_ctl(fpc1020, "fpc1020_reset_active"); + if (rc) + goto exit; + usleep_range(FPC1020_RESET_HIGH1_US, FPC1020_RESET_HIGH1_US + 100); + + rc = select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + if (rc) + goto exit; + usleep_range(FPC1020_RESET_LOW_US, FPC1020_RESET_LOW_US + 100); + + rc = select_pin_ctl(fpc1020, "fpc1020_reset_active"); + if (rc) + goto exit; + usleep_range(FPC1020_RESET_HIGH1_US, FPC1020_RESET_HIGH1_US + 100); + + irq_gpio = gpio_get_value(fpc1020->irq_gpio); + dev_info(dev, "IRQ after reset %d\n", irq_gpio); +exit: + return rc; +} + +static ssize_t hw_reset_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + if (!strncmp(buf, "reset", strlen("reset"))) + rc = hw_reset(fpc1020); + else + return -EINVAL; + return rc ? rc : count; +} +static DEVICE_ATTR(hw_reset, S_IWUSR, NULL, hw_reset_set); + +/** + * Will setup clocks, GPIOs, and regulators to correctly initialize the touch + * sensor to be ready for work. + * + * In the correct order according to the sensor spec this function will + * enable/disable regulators, SPI platform clocks, and reset line, all to set + * the sensor in a correct power on or off state "electrical" wise. + * + * @see spi_prepare_set + * @note This function will not send any commands to the sensor it will only + * control it "electrically". + */ +static int device_prepare(struct fpc1020_data *fpc1020, bool enable) +{ + int rc; + + mutex_lock(&fpc1020->lock); + if (enable && !fpc1020->prepared) { + fpc1020->prepared = true; + select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + + usleep_range(PWR_ON_STEP_SLEEP, PWR_ON_STEP_RANGE2); + + (void)select_pin_ctl(fpc1020, "fpc1020_reset_active"); + usleep_range(PWR_ON_STEP_SLEEP, PWR_ON_STEP_RANGE1); + } else if (!enable && fpc1020->prepared) { + rc = 0; + + (void)select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + usleep_range(PWR_ON_STEP_SLEEP, PWR_ON_STEP_RANGE2); + + fpc1020->prepared = false; + } else { + rc = 0; + } + mutex_unlock(&fpc1020->lock); + return rc; +} + +static ssize_t spi_prepare_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + if (!strncmp(buf, "enable", strlen("enable"))) + rc = device_prepare(fpc1020, true); + else if (!strncmp(buf, "disable", strlen("disable"))) + rc = device_prepare(fpc1020, false); + else + return -EINVAL; + return rc ? rc : count; +} +static DEVICE_ATTR(spi_prepare, S_IWUSR, NULL, spi_prepare_set); + +/** + * sysf node to check the interrupt status of the sensor, the interrupt + * handler should perform sysf_notify to allow userland to poll the node. + */ +static ssize_t irq_get(struct device *device, + struct device_attribute *attribute, + char *buffer) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(device); + int irq = gpio_get_value(fpc1020->irq_gpio); + return scnprintf(buffer, PAGE_SIZE, "%i\n", irq); +} + + +/** + * writing to the irq node will just drop a printk message + * and return success, used for latency measurement. + */ +static ssize_t irq_ack(struct device *device, + struct device_attribute *attribute, + const char *buffer, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(device); + dev_dbg(fpc1020->dev, "%s\n", __func__); + return count; +} + +static DEVICE_ATTR(irq, S_IRUSR | S_IWUSR, irq_get, irq_ack); + +static ssize_t fingerdown_wait_set(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + dev_dbg(fpc1020->dev, "%s\n", __func__); + if (!strncmp(buf, "enable", strlen("enable"))) + fpc1020->wait_finger_down = true; + else if (!strncmp(buf, "disable", strlen("disable"))) + fpc1020->wait_finger_down = false; + else + return -EINVAL; + + return count; +} +static DEVICE_ATTR(fingerdown_wait, S_IWUSR, NULL, fingerdown_wait_set); + +static ssize_t compatible_all_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + int i; + int irqf; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + dev_err(dev, "compatible all enter %d\n", fpc1020->compatible_enabled); + if (!strncmp(buf, "enable", strlen("enable")) && fpc1020->compatible_enabled != 1) { + rc = fpc1020_request_named_gpio(fpc1020, "fpc,gpio_irq", + &fpc1020->irq_gpio); + if (rc) + goto exit; + rc = fpc1020_request_named_gpio(fpc1020, "fpc,gpio_rst", + &fpc1020->rst_gpio); + if (rc) + goto exit; + + fpc1020->fingerprint_pinctrl = devm_pinctrl_get(dev); + if (IS_ERR(fpc1020->fingerprint_pinctrl)) { + if (PTR_ERR(fpc1020->fingerprint_pinctrl) == -EPROBE_DEFER) { + dev_info(dev, "pinctrl not ready\n"); + rc = -EPROBE_DEFER; + goto exit; + } + dev_err(dev, "Target does not use pinctrl\n"); + fpc1020->fingerprint_pinctrl = NULL; + rc = -EINVAL; + goto exit; + } + + for (i = 0; i < ARRAY_SIZE(fpc1020->pinctrl_state); i++) { + const char *n = pctl_names[i]; + struct pinctrl_state *state = + pinctrl_lookup_state(fpc1020->fingerprint_pinctrl, n); + if (IS_ERR(state)) { + dev_err(dev, "cannot find '%s'\n", n); + rc = -EINVAL; + goto exit; + } + dev_info(dev, "found pin control %s\n", n); + fpc1020->pinctrl_state[i] = state; + } + + rc = select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + if (rc) + goto exit; + rc = select_pin_ctl(fpc1020, "fpc1020_irq_active"); + if (rc) + goto exit; + irqf = IRQF_TRIGGER_RISING | IRQF_ONESHOT; + if (1) { + dev_err(dev, "enable-wakeup request irq %d\n", fpc1020->compatible_enabled); + irqf |= IRQF_NO_SUSPEND; + device_init_wakeup(dev, 1); + rc = devm_request_threaded_irq(dev, gpio_to_irq(fpc1020->irq_gpio), + NULL, fpc1020_irq_handler, irqf, + dev_name(dev), fpc1020); + if (rc) { + dev_err(dev, "could not request irq %d\n", + gpio_to_irq(fpc1020->irq_gpio)); + goto exit; + } + dev_err(dev, "requested irq %d\n", gpio_to_irq(fpc1020->irq_gpio)); + } + + /* Request that the interrupt should be wakeable */ + enable_irq_wake(gpio_to_irq(fpc1020->irq_gpio)); + fpc1020->compatible_enabled = 1; + if (of_property_read_bool(dev->of_node, "fpc,enable-on-boot")) { + dev_info(dev, "Enabling hardware\n"); + (void)device_prepare(fpc1020, true); + #ifdef LINUX_CONTROL_SPI_CLK + (void)set_clks(fpc1020, false); + #endif + } + } else if (!strncmp(buf, "disable", strlen("disable")) && fpc1020->compatible_enabled != 0) { + if (gpio_is_valid(fpc1020->irq_gpio)) { + devm_gpio_free(dev, fpc1020->irq_gpio); + pr_info("remove irq_gpio success\n"); + } + if (gpio_is_valid(fpc1020->rst_gpio)) { + devm_gpio_free(dev, fpc1020->rst_gpio); + pr_info("remove rst_gpio success\n"); + } + devm_free_irq(dev, gpio_to_irq(fpc1020->irq_gpio), fpc1020); + fpc1020->compatible_enabled = 0; + } else + goto exit; + hw_reset(fpc1020); + return count; +exit: + return -EINVAL; +} +static DEVICE_ATTR(compatible_all, S_IWUSR, NULL, compatible_all_set); +static struct attribute *attributes[] = { + &dev_attr_pinctl_set.attr, + &dev_attr_spi_prepare.attr, + &dev_attr_hw_reset.attr, + &dev_attr_compatible_all.attr, +#ifdef LINUX_CONTROL_SPI_CLK + &dev_attr_clk_enable.attr, +#endif + &dev_attr_irq.attr, + &dev_attr_fingerdown_wait.attr, + NULL +}; + +static const struct attribute_group attribute_group = { + .attrs = attributes, +}; + +static void notification_work(struct work_struct *work) +{ + mdss_prim_panel_fb_unblank(FP_UNLOCK_REJECTION_TIMEOUT); + pr_debug("unblank\n"); +} + +static irqreturn_t fpc1020_irq_handler(int irq, void *handle) +{ + struct fpc1020_data *fpc1020 = handle; + dev_dbg(fpc1020->dev, "%s\n", __func__); + + /* Make sure 'wakeup_enabled' is updated before using it + ** since this is interrupt context (other thread...) */ + smp_rmb(); + + if (fpc1020->wakeup_enabled) { + wake_lock_timeout(&fpc1020->ttw_wl, + msecs_to_jiffies(FPC_TTW_HOLD_TIME)); + } + + sysfs_notify(&fpc1020->dev->kobj, NULL, dev_attr_irq.attr.name); + + if (fpc1020->wait_finger_down && fpc1020->fb_black) { + pr_debug("%s enter\n", __func__); + fpc1020->wait_finger_down = false; + schedule_work(&fpc1020->work); + } + return IRQ_HANDLED; +} + +static int fpc1020_request_named_gpio(struct fpc1020_data *fpc1020, + const char *label, int *gpio) +{ + struct device *dev = fpc1020->dev; + struct device_node *np = dev->of_node; + int rc = of_get_named_gpio(np, label, 0); + if (rc < 0) { + dev_err(dev, "failed to get '%s'\n", label); + return rc; + } + *gpio = rc; + rc = devm_gpio_request(dev, *gpio, label); + if (rc) { + dev_err(dev, "failed to request gpio %d\n", *gpio); + return rc; + } + dev_dbg(dev, "%s %d\n", label, *gpio); + return 0; +} + +static int fpc_fb_notif_callback(struct notifier_block *nb, + unsigned long val, void *data) +{ + struct fpc1020_data *fpc1020 = container_of(nb, struct fpc1020_data, + fb_notifier); + struct fb_event *evdata = data; + unsigned int blank; + + if (!fpc1020) + return 0; + + if (val != FB_EVENT_BLANK) + return 0; + + pr_debug("[info] %s value = %d\n", __func__, (int)val); + + if (evdata && evdata->data && val == FB_EVENT_BLANK) { + blank = *(int *)(evdata->data); + switch (blank) { + case FB_BLANK_POWERDOWN: + fpc1020->fb_black = true; + break; + case FB_BLANK_UNBLANK: + fpc1020->fb_black = false; + break; + default: + pr_debug("%s defalut\n", __func__); + break; + } + } + return NOTIFY_OK; +} + + +static struct notifier_block fpc_notif_block = { + .notifier_call = fpc_fb_notif_callback, +}; + + +void parse_cmldine_for_fingerprint(struct device *dev) +{ + char *boadrid_start; + boadrid_start = strstr(saved_command_line, "board_id="); + if (boadrid_start != NULL) { + strncpy(boardid_info_fingerprint, boadrid_start+sizeof("board_id=")-1, 12); + dev_info(dev, "%s: is ok %s \n", __func__, boardid_info_fingerprint); + } else { + pr_debug("boarid not define!\n"); + } +} + +static int fpc1020_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + int rc = 0; + + struct device_node *np = dev->of_node; + + struct fpc1020_data *fpc1020 = devm_kzalloc(dev, sizeof(*fpc1020), + GFP_KERNEL); + if (!fpc1020) { + dev_err(dev, + "failed to allocate memory for struct fpc1020_data\n"); + rc = -ENOMEM; + goto exit; + } + + parse_cmldine_for_fingerprint(dev); + if (strcmp(boardid_info_fingerprint, "S88537DC1:bo") == 0) { + devm_kfree(dev, fpc1020); + dev_info(dev, "%s: exit fpc probe\n", __func__); + return -EPERM; + } + + fpc1020->dev = dev; + dev_set_drvdata(dev, fpc1020); + + if (!np) { + dev_err(dev, "no of node found\n"); + rc = -EINVAL; + goto exit; + } + +#ifdef LINUX_CONTROL_SPI_CLK + if (of_property_read_u32(dev->of_node, "fpc,spi-max-frequency", &fpc1020->max_speed_hz)) { + fpc1020->max_speed_hz = 4800000; + dev_err(dev, "%s: Failed to get spi-max-frequency\n", __func__); + } + + fpc1020->iface_clk = clk_get(dev, "iface_clk"); + if (IS_ERR(fpc1020->iface_clk)) { + dev_err(dev, "%s: Failed to get iface_clk\n", __func__); + rc = -EINVAL; + goto exit; + } + + fpc1020->core_clk = clk_get(dev, "core_clk"); + if (IS_ERR(fpc1020->core_clk)) { + dev_err(dev, "%s: Failed to get core_clk\n", __func__); + rc = -EINVAL; + goto exit; + } +#endif + fpc1020->wakeup_enabled = true; +#ifdef LINUX_CONTROL_SPI_CLK + fpc1020->clocks_enabled = false; + fpc1020->clocks_suspended = false; +#endif + + mutex_init(&fpc1020->lock); + wake_lock_init(&fpc1020->ttw_wl, WAKE_LOCK_SUSPEND, "fpc_ttw_wl"); + + rc = sysfs_create_group(&dev->kobj, &attribute_group); + if (rc) { + dev_err(dev, "could not create sysfs\n"); + goto exit; + } + + dev_info(dev, "%s: ok\n", __func__); + fpc1020->fb_black = false; + fpc1020->wait_finger_down = false; + INIT_WORK(&fpc1020->work, notification_work); + fpc1020->fb_notifier = fpc_notif_block; + fb_register_client(&fpc1020->fb_notifier); +exit: + return rc; +} + +static int fpc1020_remove(struct platform_device *pdev) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(&pdev->dev); + + fb_unregister_client(&fpc1020->fb_notifier); + sysfs_remove_group(&pdev->dev.kobj, &attribute_group); + mutex_destroy(&fpc1020->lock); + wake_lock_destroy(&fpc1020->ttw_wl); + dev_info(&pdev->dev, "%s\n", __func__); + return 0; +} + +#ifdef LINUX_CONTROL_SPI_CLK +static int fpc1020_suspend(struct device *dev) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + fpc1020->clocks_suspended = fpc1020->clocks_enabled; + set_clks(fpc1020, false); + return 0; +} + +static int fpc1020_resume(struct device *dev) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + if (fpc1020->clocks_suspended) + set_clks(fpc1020, true); + + return 0; +} + +static const struct dev_pm_ops fpc1020_pm_ops = { + .suspend = fpc1020_suspend, + .resume = fpc1020_resume, +}; +#endif + +static struct of_device_id fpc1020_of_match[] = { + { .compatible = "soc:fpc1020", }, + {} +}; +MODULE_DEVICE_TABLE(of, fpc1020_of_match); + +static struct platform_driver fpc1020_driver = { + .driver = { + .name = "fpc1020", + .owner = THIS_MODULE, + .of_match_table = fpc1020_of_match, +#ifdef LINUX_CONTROL_SPI_CLK + .pm = &fpc1020_pm_ops, +#endif + }, + .probe = fpc1020_probe, + .remove = fpc1020_remove, +}; + +static int __init fpc1020_init(void) +{ + int rc = platform_driver_register(&fpc1020_driver); + if (!rc) + pr_info("%s OK\n", __func__); + else + pr_err("%s %d\n", __func__, rc); + return rc; +} + +static void __exit fpc1020_exit(void) +{ + pr_info("%s\n", __func__); + platform_driver_unregister(&fpc1020_driver); +} + +module_init(fpc1020_init); +module_exit(fpc1020_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Aleksej Makarov"); +MODULE_AUTHOR("Henrik Tillman "); +MODULE_DESCRIPTION("FPC1020 Fingerprint sensor device driver."); diff --git a/drivers/fingerprint/goodix/Kconfig b/drivers/fingerprint/goodix/Kconfig new file mode 100755 index 0000000000000..3b2d98e01b097 --- /dev/null +++ b/drivers/fingerprint/goodix/Kconfig @@ -0,0 +1,5 @@ +config FINGERPRINT_GOODIX_GF3208 + tristate "Goodix GF3208 fingerprint drvier support" + depends on FINGERPRINT + help + Say Y here to enable goodix fingerprint driver support! diff --git a/drivers/fingerprint/goodix/Makefile b/drivers/fingerprint/goodix/Makefile new file mode 100755 index 0000000000000..54c40263f5623 --- /dev/null +++ b/drivers/fingerprint/goodix/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_FINGERPRINT_GOODIX_GF3208) += gf_spi.o platform.o netlink.o \ No newline at end of file diff --git a/drivers/fingerprint/goodix/gf_spi.c b/drivers/fingerprint/goodix/gf_spi.c new file mode 100755 index 0000000000000..7243cb2acfdb7 --- /dev/null +++ b/drivers/fingerprint/goodix/gf_spi.c @@ -0,0 +1,925 @@ + /*Simple synchronous userspace interface to SPI devices + * + * Copyright (C) 2006 SWAPP + * Andrea Paterniani + * Copyright (C) 2007 David Brownell (simplification, cleanup) + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gf_spi.h" + +#if defined(USE_SPI_BUS) +#include +#include +#elif defined(USE_PLATFORM_BUS) +#include +#endif + +#define WAKELOCK_HOLD_TIME 2000 /* in ms */ +#define FP_UNLOCK_REJECTION_TIMEOUT (WAKELOCK_HOLD_TIME - 500) + +#define GF_SPIDEV_NAME "goodix,fingerprint" +/*device name after register in charater*/ +#define GF_DEV_NAME "goodix_fp" +#define GF_INPUT_NAME "gf3208" /*"goodix_fp" */ + +#define CHRD_DRIVER_NAME "goodix_fp_spi" +#define CLASS_NAME "goodix_fp" +#define SPIDEV_MAJOR 225 /* assigned */ +#define N_SPI_MINORS 32 /* ... up to 256 */ + + +struct gf_key_map key_map[] = { + { "POWER", KEY_POWER }, + { "HOME" , KEY_HOME }, + { "MENU" , KEY_MENU }, + { "BACK" , KEY_BACK }, + { "UP" , KEY_UP }, + { "DOWN" , KEY_DOWN }, + { "LEFT" , KEY_LEFT }, + { "RIGHT", KEY_RIGHT }, + { "CAMERA", KEY_CAMERA }, + { "ENTER", KEY_SELECT}, + { "FORCE", KEY_F9 }, + { "CLICK", KEY_F19 }, +}; + +/**************************debug******************************/ +#define GF_DEBUG +/*#undef GF_DEBUG*/ + +#ifdef GF_DEBUG +#define gf_dbg(fmt, args...) do { \ + pr_warn("gf:" fmt, ##args);\ + } while (0) +#define FUNC_ENTRY() pr_warn("gf:%s, entry\n", __func__) +#define FUNC_EXIT() pr_warn("gf:%s, exit\n", __func__) +#else +#define gf_dbg(fmt, args...) +#define FUNC_ENTRY() +#define FUNC_EXIT() +#endif + +/*Global variables*/ +/*static MODE g_mode = GF_IMAGE_MODE;*/ +static DECLARE_BITMAP(minors, N_SPI_MINORS); +static LIST_HEAD(device_list); +static DEFINE_MUTEX(device_list_lock); +static struct gf_dev gf; +static struct class *gf_class; +static int driver_init_partial(struct gf_dev *gf_dev); + +static void gf_enable_irq(struct gf_dev *gf_dev) +{ + if (gf_dev->irq_enabled) { + pr_warn("IRQ has been enabled.\n"); + } else { + enable_irq(gf_dev->irq); + gf_dev->irq_enabled = 1; + } +} + +static void gf_disable_irq(struct gf_dev *gf_dev) +{ + if (gf_dev->irq_enabled) { + gf_dev->irq_enabled = 0; + disable_irq(gf_dev->irq); + } else { + pr_warn("IRQ has been disabled.\n"); + } +} + +#ifdef AP_CONTROL_CLK +static long spi_clk_max_rate(struct clk *clk, unsigned long rate) +{ + long lowest_available, nearest_low, step_size, cur; + long step_direction = -1; + long guess = rate; + int max_steps = 10; + + cur = clk_round_rate(clk, rate); + if (cur == rate) + return rate; + + /* if we got here then: cur > rate */ + lowest_available = clk_round_rate(clk, 0); + if (lowest_available > rate) + return -EINVAL; + + step_size = (rate - lowest_available) >> 1; + nearest_low = lowest_available; + + while (max_steps-- && step_size) { + guess += step_size * step_direction; + cur = clk_round_rate(clk, guess); + + if ((cur < rate) && (cur > nearest_low)) + nearest_low = cur; + /* + * if we stepped too far, then start stepping in the other + * direction with half the step size + */ + if (((cur > rate) && (step_direction > 0)) + || ((cur < rate) && (step_direction < 0))) { + step_direction = -step_direction; + step_size >>= 1; + } + } + return nearest_low; +} + +static void spi_clock_set(struct gf_dev *gf_dev, int speed) +{ + long rate; + int rc; + + rate = spi_clk_max_rate(gf_dev->core_clk, speed); + if (rate < 0) { + pr_info("%s: no match found for requested clock frequency:%d", + __func__, speed); + return; + } + + rc = clk_set_rate(gf_dev->core_clk, rate); +} + +static int gfspi_ioctl_clk_init(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + data->clk_enabled = 0; + data->core_clk = clk_get(&data->spi->dev, "core_clk"); + if (IS_ERR_OR_NULL(data->core_clk)) { + pr_err("%s: fail to get core_clk\n", __func__); + return -EPERM; + } + data->iface_clk = clk_get(&data->spi->dev, "iface_clk"); + if (IS_ERR_OR_NULL(data->iface_clk)) { + pr_err("%s: fail to get iface_clk\n", __func__); + clk_put(data->core_clk); + data->core_clk = NULL; + return -ENOENT; + } + return 0; +} + +static int gfspi_ioctl_clk_enable(struct gf_dev *data) +{ + int err; + + pr_debug("%s: enter\n", __func__); + + if (data->clk_enabled) + return 0; + + err = clk_prepare_enable(data->core_clk); + if (err) { + pr_err("%s: fail to enable core_clk\n", __func__); + return -EPERM; + } + + err = clk_prepare_enable(data->iface_clk); + if (err) { + pr_err("%s: fail to enable iface_clk\n", __func__); + clk_disable_unprepare(data->core_clk); + return -ENOENT; + } + + data->clk_enabled = 1; + + return 0; +} + +static int gfspi_ioctl_clk_disable(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + if (!data->clk_enabled) + return 0; + + clk_disable_unprepare(data->core_clk); + clk_disable_unprepare(data->iface_clk); + data->clk_enabled = 0; + + return 0; +} + +static int gfspi_ioctl_clk_uninit(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + if (data->clk_enabled) + gfspi_ioctl_clk_disable(data); + + if (!IS_ERR_OR_NULL(data->core_clk)) { + clk_put(data->core_clk); + data->core_clk = NULL; + } + + if (!IS_ERR_OR_NULL(data->iface_clk)) { + clk_put(data->iface_clk); + data->iface_clk = NULL; + } + + return 0; +} +#endif + +static long gf_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + struct gf_dev *gf_dev = &gf; + struct gf_key gf_key = { 0 }; + int retval = 0; + int i; +#ifdef AP_CONTROL_CLK + unsigned int speed = 0; +#endif + FUNC_ENTRY(); + if (_IOC_TYPE(cmd) != GF_IOC_MAGIC) + return -ENODEV; + + if (_IOC_DIR(cmd) & _IOC_READ) + retval = + !access_ok(VERIFY_WRITE, (void __user *)arg, + _IOC_SIZE(cmd)); + if ((retval == 0) && (_IOC_DIR(cmd) & _IOC_WRITE)) + retval = + !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + if (retval) + return -EFAULT; + + if (gf_dev->device_available == 0) { + if ((cmd == GF_IOC_POWER_ON) || (cmd == GF_IOC_POWER_OFF) || (cmd == GF_IOC_ENABLE_GPIO)) { + pr_info("power cmd\n"); + } else { + pr_info("Sensor is power off currently. \n"); + return -ENODEV; + } + } + + switch (cmd) { + case GF_IOC_ENABLE_GPIO: + driver_init_partial(gf_dev); + break; + case GF_IOC_RELEASE_GPIO: + gf_cleanup(gf_dev); + break; + case GF_IOC_DISABLE_IRQ: + gf_disable_irq(gf_dev); + break; + case GF_IOC_ENABLE_IRQ: + gf_enable_irq(gf_dev); + break; + case GF_IOC_SETSPEED: +#ifdef AP_CONTROL_CLK + retval = __get_user(speed, (u32 __user *) arg); + if (retval == 0) { + if (speed > 12 * 1000 * 1000) { + pr_warn("Set speed:%d is larger than 12Mbps.\n", speed); + } else { + spi_clock_set(gf_dev, speed); + } + } else { + pr_warn("Failed to get speed from user. retval = %d\n", retval); + } +#else + pr_info("This kernel doesn't support control clk in AP\n"); +#endif + break; + case GF_IOC_RESET: + gf_hw_reset(gf_dev, 3); + break; + case GF_IOC_COOLBOOT: + gf_power_off(gf_dev); + mdelay(5); + gf_power_on(gf_dev); + break; + case GF_IOC_SENDKEY: + if (copy_from_user + (&gf_key, (struct gf_key *)arg, sizeof(struct gf_key))) { + pr_warn("Failed to copy data from user space.\n"); + retval = -EFAULT; + break; + } + + for (i = 0; i < ARRAY_SIZE(key_map); i++) { + if (key_map[i].val == gf_key.key) { + if (KEY_CAMERA == gf_key.key) { + input_report_key(gf_dev->input, KEY_SELECT, gf_key.value); + input_sync(gf_dev->input); + } else{ + input_report_key(gf_dev->input, gf_key.key, gf_key.value); + input_sync(gf_dev->input); + + } + break; + } + } + if (i == ARRAY_SIZE(key_map)) { + pr_warn("key %d not support yet \n", gf_key.key); + retval = -EFAULT; + } + + break; + case GF_IOC_CLK_READY: +#ifdef AP_CONTROL_CLK + gfspi_ioctl_clk_enable(gf_dev); +#else + pr_info("Doesn't support control clock.\n"); +#endif + break; + case GF_IOC_CLK_UNREADY: +#ifdef AP_CONTROL_CLK + gfspi_ioctl_clk_disable(gf_dev); +#else + pr_info("Doesn't support control clock.\n"); +#endif + break; + case GF_IOC_PM_FBCABCK: + __put_user(gf_dev->fb_black, (u8 __user *) arg); + break; + case GF_IOC_POWER_ON: + if (gf_dev->device_available == 1) + pr_info("Sensor has already powered-on.\n"); + else + gf_power_on(gf_dev); + gf_dev->device_available = 1; + break; + case GF_IOC_POWER_OFF: + if (gf_dev->device_available == 0) + pr_info("Sensor has already powered-off.\n"); + else + gf_power_off(gf_dev); + gf_dev->device_available = 0; + break; + default: + gf_dbg("Unsupport cmd:0x%x\n", cmd); + break; + } + + FUNC_EXIT(); + return retval; +} + +#ifdef CONFIG_COMPAT +static long +gf_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + return gf_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); +} +#endif /*CONFIG_COMPAT*/ + +static void notification_work(struct work_struct *work) +{ + mdss_prim_panel_fb_unblank(FP_UNLOCK_REJECTION_TIMEOUT); + pr_debug("unblank\n"); +} + +static irqreturn_t gf_irq(int irq, void *handle) +{ + +#if defined(GF_NETLINK_ENABLE) + + struct gf_dev *gf_dev = &gf; + char temp = GF_NET_EVENT_IRQ; + gf_dbg("enter irq %s\n", __func__); + + wake_lock_timeout(&gf_dev->ttw_wl, msecs_to_jiffies(WAKELOCK_HOLD_TIME)); + + sendnlmsg(&temp); + if ((gf_dev->wait_finger_down == true) && (gf_dev->device_available == 1) && (gf_dev->fb_black == 1)) { + gf_dev->wait_finger_down = false; + schedule_work(&gf_dev->work); + } +#elif defined (GF_FASYNC) + + struct gf_dev *gf_dev = &gf; + if (gf_dev->async) + kill_fasync(&gf_dev->async, SIGIO, POLL_IN); +#endif + + return IRQ_HANDLED; + +} + +static int driver_init_partial(struct gf_dev *gf_dev) +{ + int ret = 0; + FUNC_ENTRY(); + pr_warn("--------driver_init_partial start.--------\n"); + + gf_dev->device_available = 1; + + if (gf_parse_dts(gf_dev)) + goto error; + + gf_dev->irq = gf_irq_num(gf_dev); + ret = devm_request_threaded_irq(&gf_dev->spi->dev, + gf_dev->irq, + NULL, + gf_irq, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "gf", gf_dev); + if (ret) { + pr_err("Could not request irq %d\n", gpio_to_irq(gf_dev->irq_gpio)); + goto error; + } + if (!ret) { + enable_irq_wake(gf_dev->irq); + gf_enable_irq(gf_dev); + gf_disable_irq(gf_dev); + } + + gf_hw_reset(gf_dev, 360); + + FUNC_EXIT(); + return 0; + +error: + + gf_cleanup(gf_dev); + + gf_dev->device_available = 0; + + return -EPERM; + + +} +static int gf_open(struct inode *inode, struct file *filp) +{ + struct gf_dev *gf_dev; + int status = -ENXIO; + + FUNC_ENTRY(); + mutex_lock(&device_list_lock); + + list_for_each_entry(gf_dev, &device_list, device_entry) { + if (gf_dev->devt == inode->i_rdev) { + gf_dbg("Found\n"); + status = 0; + break; + } + } + + if (status == 0) { + if (status == 0) { + gf_dev->users++; + filp->private_data = gf_dev; + nonseekable_open(inode, filp); + gf_dbg("Succeed to open device. irq = %d\n", + gf_dev->irq); + + gf_dev->device_available = 1; + } + } else { + gf_dbg("No device for minor %d\n", iminor(inode)); + } + mutex_unlock(&device_list_lock); + FUNC_EXIT(); + return status; +} + +#ifdef GF_FASYNC +static int gf_fasync(int fd, struct file *filp, int mode) +{ + struct gf_dev *gf_dev = filp->private_data; + int ret; + + FUNC_ENTRY(); + ret = fasync_helper(fd, filp, mode, &gf_dev->async); + FUNC_EXIT(); + gf_dbg("ret = %d\n", ret); + return ret; +} +#endif + +static int gf_release(struct inode *inode, struct file *filp) +{ + struct gf_dev *gf_dev; + int status = 0; + + FUNC_ENTRY(); + mutex_lock(&device_list_lock); + gf_dev = filp->private_data; + filp->private_data = NULL; + + gf_dev->users--; + if (!gf_dev->users) { + + gf_dbg("disble_irq. irq = %d\n", gf_dev->irq); + gf_disable_irq(gf_dev); + + + + + devm_free_irq(&gf_dev->spi->dev, gf_dev->irq, gf_dev); + + /*power off the sensor*/ + gf_dev->device_available = 0; + gf_power_off(gf_dev); + } + mutex_unlock(&device_list_lock); + FUNC_EXIT(); + + return status; +} + +static const struct file_operations gf_fops = { + .owner = THIS_MODULE, + /* REVISIT switch to aio primitives, so that userspace + * gets more complete API coverage. It'll simplify things + * too, except for the locking. + */ + .unlocked_ioctl = gf_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = gf_compat_ioctl, +#endif /*CONFIG_COMPAT*/ + .open = gf_open, + .release = gf_release, +#ifdef GF_FASYNC + .fasync = gf_fasync, +#endif +}; + +static int goodix_fb_state_chg_callback(struct notifier_block *nb, + unsigned long val, void *data) +{ + struct gf_dev *gf_dev; + struct fb_event *evdata = data; + unsigned int blank; + +#if defined(GF_NETLINK_ENABLE) + char temp = 0; +#endif + + if (val != FB_EVENT_BLANK) + return 0; + pr_info("[info] %s go to the goodix_fb_state_chg_callback value = %d\n", + __func__, (int)val); + gf_dev = container_of(nb, struct gf_dev, notifier); + if (evdata && evdata->data && val == FB_EVENT_BLANK && gf_dev) { + blank = *(int *)(evdata->data); + switch (blank) { + case FB_BLANK_POWERDOWN: + if (gf_dev->device_available == 1) { + gf_dev->fb_black = 1; + gf_dev->wait_finger_down = true; +#if defined(GF_NETLINK_ENABLE) + temp = GF_NET_EVENT_FB_BLACK; + sendnlmsg(&temp); +#elif defined (GF_FASYNC) + if (gf_dev->async) { + kill_fasync(&gf_dev->async, SIGIO, + POLL_IN); + } +#endif + /*device unavailable */ + + } + break; + case FB_BLANK_UNBLANK: + if (gf_dev->device_available == 1) { + gf_dev->fb_black = 0; +#if defined(GF_NETLINK_ENABLE) + temp = GF_NET_EVENT_FB_UNBLACK; + sendnlmsg(&temp); +#elif defined (GF_FASYNC) + if (gf_dev->async) { + kill_fasync(&gf_dev->async, SIGIO, + POLL_IN); + } +#endif + /*device available */ + + } + break; + default: + pr_info("%s defalut\n", __func__); + break; + } + } + return NOTIFY_OK; +} + +static struct notifier_block goodix_noti_block = { + .notifier_call = goodix_fb_state_chg_callback, +}; + +static void gf_reg_key_kernel(struct gf_dev *gf_dev) +{ + int i; + + set_bit(EV_KEY, gf_dev->input->evbit); + for (i = 0; i < ARRAY_SIZE(key_map); i++) { + set_bit(key_map[i].val, gf_dev->input->keybit); + } + + gf_dev->input->name = GF_INPUT_NAME; + if (input_register_device(gf_dev->input)) + pr_warn("Failed to register GF as input device.\n"); +} + + +#if defined(USE_SPI_BUS) +static int gf_probe(struct spi_device *spi) +#elif defined(USE_PLATFORM_BUS) +static int gf_probe(struct platform_device *pdev) +#endif +{ + struct gf_dev *gf_dev = &gf; + int status = -EINVAL; + unsigned long minor; + + FUNC_ENTRY(); + + pr_warn("--------gf_probe start.--------\n"); + /* Initialize the driver data */ + INIT_LIST_HEAD(&gf_dev->device_entry); + +#if defined(USE_SPI_BUS) + gf_dev->spi = spi; +#elif defined(USE_PLATFORM_BUS) + gf_dev->spi = pdev; +#endif + + gf_dev->irq_gpio = -EINVAL; + gf_dev->reset_gpio = -EINVAL; + gf_dev->pwr_gpio = -EINVAL; + gf_dev->device_available = 0; + gf_dev->fb_black = 0; + gf_dev->irq_enabled = 0; + gf_dev->fingerprint_pinctrl = NULL; + gf_dev->wait_finger_down = false; + INIT_WORK(&gf_dev->work, notification_work); + + /* If we can allocate a minor number, hook up this device. + * Reusing minors is fine so long as udev or mdev is working. + */ + mutex_lock(&device_list_lock); + minor = find_first_zero_bit(minors, N_SPI_MINORS); + if (minor < N_SPI_MINORS) { + struct device *dev; + + gf_dev->devt = MKDEV(SPIDEV_MAJOR, minor); + dev = device_create(gf_class, &gf_dev->spi->dev, gf_dev->devt, + gf_dev, GF_DEV_NAME); + status = IS_ERR(dev) ? PTR_ERR(dev) : 0; + } else { + dev_dbg(&gf_dev->spi->dev, "no minor number available!\n"); + status = -ENODEV; + } + + if (status == 0) { + set_bit(minor, minors); + list_add(&gf_dev->device_entry, &device_list); + } else { + gf_dev->devt = 0; + } + mutex_unlock(&device_list_lock); + + if (status == 0) { + /*input device subsystem */ + gf_dev->input = input_allocate_device(); + if (gf_dev->input == NULL) { + dev_dbg(&gf_dev->input->dev, + "Faile to allocate input device.\n"); + status = -ENOMEM; + goto error; + } +#ifdef AP_CONTROL_CLK + pr_info("Get the clk resource.\n"); + /* Enable spi clock */ + if (gfspi_ioctl_clk_init(gf_dev)) + goto gfspi_probe_clk_init_failed; + + + if (gfspi_ioctl_clk_enable(gf_dev)) + goto gfspi_probe_clk_enable_failed; + + spi_clock_set(gf_dev, 4.8*1000*1000); +#endif + + gf_dev->notifier = goodix_noti_block; + fb_register_client(&gf_dev->notifier); + gf_reg_key_kernel(gf_dev); + + wake_lock_init(&gf_dev->ttw_wl, WAKE_LOCK_SUSPEND, "goodix_ttw_wl"); + } + + pr_warn("--------gf_probe end---OK.--------\n"); + return status; + +error: + gf_cleanup(gf_dev); + gf_dev->device_available = 0; + if (gf_dev->devt != 0) { + pr_info("Err: status = %d\n", status); + mutex_lock(&device_list_lock); + list_del(&gf_dev->device_entry); + device_destroy(gf_class, gf_dev->devt); + clear_bit(MINOR(gf_dev->devt), minors); + mutex_unlock(&device_list_lock); + +#ifdef AP_CONTROL_CLK +gfspi_probe_clk_enable_failed: + gfspi_ioctl_clk_uninit(gf_dev); +gfspi_probe_clk_init_failed: +#endif + if (gf_dev->input != NULL) + input_unregister_device(gf_dev->input); + } + + FUNC_EXIT(); + return status; +} + +/*static int __devexit gf_remove(struct spi_device *spi)*/ +#if defined(USE_SPI_BUS) +static int gf_remove(struct spi_device *spi) +#elif defined(USE_PLATFORM_BUS) +static int gf_remove(struct platform_device *pdev) +#endif +{ + struct gf_dev *gf_dev = &gf; + FUNC_ENTRY(); + + /* make sure ops on existing fds can abort cleanly */ + if (gf_dev->irq) + free_irq(gf_dev->irq, gf_dev); + + if (gf_dev->input != NULL) + input_unregister_device(gf_dev->input); + input_free_device(gf_dev->input); + + /* prevent new opens */ + mutex_lock(&device_list_lock); + list_del(&gf_dev->device_entry); + device_destroy(gf_class, gf_dev->devt); + clear_bit(MINOR(gf_dev->devt), minors); + if (gf_dev->users == 0) + kfree(gf_dev); + + mutex_unlock(&device_list_lock); + + wake_lock_destroy(&gf_dev->ttw_wl); + + FUNC_EXIT(); + return 0; +} + +#if defined(USE_SPI_BUS) +static int gf_suspend(struct spi_device *spi, pm_message_t mesg) +#elif defined(USE_PLATFORM_BUS) +static int gf_suspend(struct platform_device *pdev, pm_message_t state) +#endif +{ + + gf_dbg("gf_suspend_test.\n"); + return 0; +} + +#if defined(USE_SPI_BUS) +static int gf_resume(struct spi_device *spi) +#elif defined(USE_PLATFORM_BUS) +static int gf_resume(struct platform_device *pdev) +#endif +{ + gf_dbg("gf_resume_test.\n"); + return 0; +} + +static struct of_device_id gx_match_table[] = { + {.compatible = GF_SPIDEV_NAME,}, + {}, +}; + +#if defined(USE_SPI_BUS) +static struct spi_driver gf_driver = { +#elif defined(USE_PLATFORM_BUS) +static struct platform_driver gf_driver = { +#endif + .driver = { + .name = GF_DEV_NAME, + .owner = THIS_MODULE, +#if defined(USE_SPI_BUS) + +#endif + .of_match_table = gx_match_table, + }, + .probe = gf_probe, + .remove = gf_remove, + .suspend = gf_suspend, + .resume = gf_resume, +}; + +static int __init gf_init(void) +{ + int status; + FUNC_ENTRY(); + + pr_warn("--------gf_init start.--------\n"); + /* Claim our 256 reserved device numbers. Then register a class + * that will key udev/mdev to add/remove /dev nodes. Last, register + * the driver which manages those device numbers. + */ + + BUILD_BUG_ON(N_SPI_MINORS > 256); + status = register_chrdev(SPIDEV_MAJOR, CHRD_DRIVER_NAME, &gf_fops); + if (status < 0) { + pr_warn("Failed to register char device!\n"); + FUNC_EXIT(); + return status; + } + gf_class = class_create(THIS_MODULE, CLASS_NAME); + if (IS_ERR(gf_class)) { + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); + pr_warn("Failed to create class.\n"); + FUNC_EXIT(); + return PTR_ERR(gf_class); + } +#if defined(USE_PLATFORM_BUS) + status = platform_driver_register(&gf_driver); +#elif defined(USE_SPI_BUS) + status = spi_register_driver(&gf_driver); +#endif + if (status < 0) { + class_destroy(gf_class); + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); + pr_warn("Failed to register SPI driver.\n"); + } + +#ifdef GF_NETLINK_ENABLE + netlink_init(); +#endif + pr_info(" status = 0x%x\n", status); + FUNC_EXIT(); + + pr_warn("--------gf_init end---OK.--------\n"); + return 0; +} + +module_init(gf_init); + +static void __exit gf_exit(void) +{ + FUNC_ENTRY(); +#ifdef GF_NETLINK_ENABLE + netlink_exit(); +#endif +#if defined(USE_PLATFORM_BUS) + platform_driver_unregister(&gf_driver); +#elif defined(USE_SPI_BUS) + spi_unregister_driver(&gf_driver); +#endif + class_destroy(gf_class); + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); + FUNC_EXIT(); +} + +module_exit(gf_exit); + +MODULE_AUTHOR("Jiangtao Yi, "); +MODULE_DESCRIPTION("User mode SPI device interface"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("spi:gf-spi"); diff --git a/drivers/fingerprint/goodix/gf_spi.h b/drivers/fingerprint/goodix/gf_spi.h new file mode 100755 index 0000000000000..bcbe4d98740ee --- /dev/null +++ b/drivers/fingerprint/goodix/gf_spi.h @@ -0,0 +1,108 @@ +#ifndef __GF_SPI_H +#define __GF_SPI_H + +#include +#include +#include +/**********************************************************/ +enum FP_MODE{ + GF_IMAGE_MODE = 0, + GF_KEY_MODE, + GF_SLEEP_MODE, + GF_FF_MODE, + GF_DEBUG_MODE = 0x56 +}; + +struct gf_key { + unsigned int key; + int value; +}; + + +struct gf_key_map { + char *name; + unsigned short val; +}; + +#define GF_IOC_MAGIC 'G' +#define GF_IOC_DISABLE_IRQ _IO(GF_IOC_MAGIC, 0) +#define GF_IOC_ENABLE_IRQ _IO(GF_IOC_MAGIC, 1) +#define GF_IOC_SETSPEED _IOW(GF_IOC_MAGIC, 2, unsigned int) +#define GF_IOC_RESET _IO(GF_IOC_MAGIC, 3) +#define GF_IOC_COOLBOOT _IO(GF_IOC_MAGIC, 4) +#define GF_IOC_SENDKEY _IOW(GF_IOC_MAGIC, 5, struct gf_key) +#define GF_IOC_CLK_READY _IO(GF_IOC_MAGIC, 6) +#define GF_IOC_CLK_UNREADY _IO(GF_IOC_MAGIC, 7) +#define GF_IOC_PM_FBCABCK _IO(GF_IOC_MAGIC, 8) +#define GF_IOC_POWER_ON _IO(GF_IOC_MAGIC, 9) +#define GF_IOC_POWER_OFF _IO(GF_IOC_MAGIC, 10) +#define GF_IOC_ENABLE_GPIO _IO(GF_IOC_MAGIC, 11) +#define GF_IOC_RELEASE_GPIO _IO(GF_IOC_MAGIC, 12) + +#define GF_IOC_MAXNR 13 + + +#define USE_PLATFORM_BUS 1 + + +#define GF_NETLINK_ENABLE 1 +#define GF_NET_EVENT_IRQ 0 +#define GF_NET_EVENT_FB_BLACK 1 +#define GF_NET_EVENT_FB_UNBLACK 2 + + +static const char * const pctl_names[] = { + + "goodixfp_reset_reset", + "goodixfp_reset_active", + "goodixfp_irq_active", +}; + + +struct gf_dev { + dev_t devt; + struct list_head device_entry; +#if defined(USE_SPI_BUS) + struct spi_device *spi; +#elif defined(USE_PLATFORM_BUS) + struct platform_device *spi; +#endif + struct clk *core_clk; + struct clk *iface_clk; + + struct pinctrl *fingerprint_pinctrl; + struct pinctrl_state *pinctrl_state[ARRAY_SIZE(pctl_names)]; + + struct input_dev *input; + /* buffer is NULL unless this device is open (users > 0) */ + unsigned users; + signed irq_gpio; + signed reset_gpio; + signed pwr_gpio; + int irq; + int irq_enabled; + int clk_enabled; +#ifdef GF_FASYNC + struct fasync_struct *async; +#endif + struct notifier_block notifier; + char device_available; + char fb_black; + struct wake_lock ttw_wl; + char wait_finger_down; + struct work_struct work; +}; + +int gf_parse_dts(struct gf_dev *gf_dev); +void gf_cleanup(struct gf_dev *gf_dev); + +int gf_power_on(struct gf_dev *gf_dev); +int gf_power_off(struct gf_dev *gf_dev); + +int gf_hw_reset(struct gf_dev *gf_dev, unsigned int delay_ms); +int gf_irq_num(struct gf_dev *gf_dev); + +void sendnlmsg(char *message); +int netlink_init(void); +void netlink_exit(void); +#endif /*__GF_SPI_H*/ diff --git a/drivers/fingerprint/goodix/netlink.c b/drivers/fingerprint/goodix/netlink.c new file mode 100755 index 0000000000000..e53bb41d23f0f --- /dev/null +++ b/drivers/fingerprint/goodix/netlink.c @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include +#include +#include + +#define NETLINK_TEST 25 +#define MAX_MSGSIZE 4*1024 +int stringlength(char *s); +void sendnlmsg(char *message); +int pid; +int err; +struct sock *nl_sk = NULL; +int flag = 0; + + +struct gf_uk_channel{ + int channel_id; + int reserved; + char buf[3*1024]; + int len; +}; + + +void sendnlmsg(char *message) +{ + struct sk_buff *skb_1; + struct nlmsghdr *nlh; + int len = NLMSG_SPACE(MAX_MSGSIZE); + int slen = 0; + if (!message || !nl_sk) { + return ; + } + skb_1 = alloc_skb(len, GFP_KERNEL); + if (!skb_1) { + printk(KERN_ERR "my_net_link:alloc_skb_1 error\n"); + } + slen = strlen(message); + nlh = nlmsg_put(skb_1, 0, 0, 0, MAX_MSGSIZE, 0); + + NETLINK_CB(skb_1).portid = 0; + NETLINK_CB(skb_1).dst_group = 0; + + message[slen] = '\0'; + memcpy(NLMSG_DATA(nlh), message, slen+1); + + + netlink_unicast(nl_sk, skb_1, pid, MSG_DONTWAIT); + +} + + +void nl_data_ready(struct sk_buff *__skb) +{ + struct sk_buff *skb; + struct nlmsghdr *nlh; + char str[100]; + skb = skb_get (__skb); + if (skb->len >= NLMSG_SPACE(0)) { + nlh = nlmsg_hdr(skb); + + memcpy(str, NLMSG_DATA(nlh), sizeof(str)); + pid = nlh->nlmsg_pid; + kfree_skb(skb); + } + +} + + +int netlink_init(void) +{ + + struct netlink_kernel_cfg netlink_cfg; + netlink_cfg.groups = 0; + netlink_cfg.flags = 0; + netlink_cfg.input = nl_data_ready; + netlink_cfg.cb_mutex = NULL; + + nl_sk = netlink_kernel_create(&init_net, NETLINK_TEST, &netlink_cfg); + + if (!nl_sk) { + printk(KERN_ERR "my_net_link: create netlink socket error.\n"); + return 1; + } + return 0; +} + +void netlink_exit(void) +{ + if (nl_sk != NULL) { + sock_release(nl_sk->sk_socket); + } + + printk("my_net_link: self module exited\n"); +} diff --git a/drivers/fingerprint/goodix/platform.c b/drivers/fingerprint/goodix/platform.c new file mode 100755 index 0000000000000..131970b30cf27 --- /dev/null +++ b/drivers/fingerprint/goodix/platform.c @@ -0,0 +1,198 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "gf_spi.h" + +#if defined(USE_SPI_BUS) +#include +#include +#elif defined(USE_PLATFORM_BUS) +#include +#endif + +#define gf_dbg(fmt, args...) do { \ + pr_warn("gf:" fmt, ##args);\ + } while (0) + + +static int gf3208_request_named_gpio(struct gf_dev *gf_dev, const char *label, int *gpio) +{ + struct device *dev = &gf_dev->spi->dev; + struct device_node *np = dev->of_node; + int rc = of_get_named_gpio(np, label, 0); + if (rc < 0) { + dev_err(dev, "failed to get '%s'\n", label); + return rc; + } + *gpio = rc; + rc = devm_gpio_request(dev, *gpio, label); + if (rc) { + dev_err(dev, "failed to request gpio %d\n", *gpio); + return rc; + } + dev_err(dev, "%s %d\n", label, *gpio); + return 0; +} + +static int select_pin_ctl(struct gf_dev *gf_dev, const char *name) +{ + size_t i; + int rc; + struct device *dev = &gf_dev->spi->dev; + + for (i = 0; i < ARRAY_SIZE(gf_dev->pinctrl_state); i++) { + const char *n = pctl_names[i]; + if (!strncmp(n, name, strlen(n))) { + rc = pinctrl_select_state(gf_dev->fingerprint_pinctrl, gf_dev->pinctrl_state[i]); + + if (rc) + dev_err(dev, "cannot select '%s'\n", name); + else + dev_err(dev, "Selected '%s'\n", name); + goto exit; + } + } + rc = -EINVAL; + dev_err(dev, "%s:'%s' not found\n", __func__, name); +exit: + return rc; +} + + +/*GPIO pins reference.*/ +int gf_parse_dts(struct gf_dev *gf_dev) +{ + int rc = 0; + int i = 0; + pr_warn("--------gf_parse_dts start.--------\n"); + + /*get reset resource*/ + rc = gf3208_request_named_gpio(gf_dev, "goodix, gpio_reset", &gf_dev->reset_gpio); + if (rc) { + + gf_dbg("Failed to request RESET GPIO. rc = %d\n", rc); + return -EPERM; + } + + /*get irq resourece*/ + rc = gf3208_request_named_gpio(gf_dev, "goodix, gpio_irq", &gf_dev->irq_gpio); + if (rc) { + gf_dbg("Failed to request IRQ GPIO. rc = %d\n", rc); + return -EPERM; + } + + gf_dev->fingerprint_pinctrl = devm_pinctrl_get(&gf_dev->spi->dev); + for (i = 0; i < ARRAY_SIZE(gf_dev->pinctrl_state); i++) { + const char *n = pctl_names[i]; + struct pinctrl_state *state = + pinctrl_lookup_state(gf_dev->fingerprint_pinctrl, n); + if (IS_ERR(state)) { + pr_err("cannot find '%s'\n", n); + rc = -EINVAL; + } + pr_info("found pin control %s\n", n); + gf_dev->pinctrl_state[i] = state; + } + + rc = select_pin_ctl(gf_dev, "goodixfp_reset_active"); + if (rc) + goto exit; + rc = select_pin_ctl(gf_dev, "goodixfp_irq_active"); + if (rc) + goto exit; + pr_warn("--------gf_parse_dts end---OK.--------\n"); + +exit: + return rc; +} + +void gf_cleanup(struct gf_dev *gf_dev) +{ + gf_dbg("[info] enter%s\n", __func__); + + if (gpio_is_valid(gf_dev->irq_gpio)) { + + devm_gpio_free(&gf_dev->spi->dev, gf_dev->irq_gpio); + gf_dbg("remove irq_gpio success\n"); + } + + if (gpio_is_valid(gf_dev->reset_gpio)) { + + devm_gpio_free(&gf_dev->spi->dev, gf_dev->reset_gpio); + gf_dbg("remove reset_gpio success\n"); + } + + if (gf_dev->fingerprint_pinctrl != NULL) { + devm_pinctrl_put(gf_dev->fingerprint_pinctrl); + gf_dev->fingerprint_pinctrl = NULL; + gf_dbg("gx fingerprint_pinctrl release success\n"); + } +} + +/*power management*/ +int gf_power_on(struct gf_dev *gf_dev) +{ + int rc = 0; + msleep(10); + pr_info("---- power on ok ----\n"); + + return rc; +} + +int gf_power_off(struct gf_dev *gf_dev) +{ + int rc = 0; + pr_info("---- power off ----\n"); + return rc; +} + +static int hw_reset(struct gf_dev *gf_dev) +{ + int irq_gpio; + struct device *dev = &gf_dev->spi->dev; + int rc = select_pin_ctl(gf_dev, "goodixfp_reset_reset"); + if (rc) + goto exit; + mdelay(3); + + rc = select_pin_ctl(gf_dev, "goodixfp_reset_active"); + if (rc) + goto exit; + + irq_gpio = gpio_get_value(gf_dev->irq_gpio); + dev_info(dev, "IRQ after reset %d\n", irq_gpio); +exit: + return rc; +} + + +/******************************************************************** + *CPU output low level in RST pin to reset GF. This is the MUST action for GF. + *Take care of this function. IO Pin driver strength / glitch and so on. + ********************************************************************/ +int gf_hw_reset(struct gf_dev *gf_dev, unsigned int delay_ms) +{ + if (gf_dev == NULL) { + pr_info("Input buff is NULL.\n"); + return -EPERM; + } + hw_reset(gf_dev); + mdelay(delay_ms); + return 0; +} + +int gf_irq_num(struct gf_dev *gf_dev) +{ + if (gf_dev == NULL) { + pr_info("Input buff is NULL.\n"); + return -EPERM; + } else { + return gpio_to_irq(gf_dev->irq_gpio); + } +} + diff --git a/drivers/fingerprintrosy/Kconfig b/drivers/fingerprintrosy/Kconfig new file mode 100755 index 0000000000000..8911f4ea55903 --- /dev/null +++ b/drivers/fingerprintrosy/Kconfig @@ -0,0 +1,8 @@ +config FINGERPRINT_ROSY + tristate "ROSY Fingerprint driver support" + help + Say Y here to enable goodix fingerprint driver support! + +source "drivers/fingerprintrosy/goodixrosy/Kconfig" +source "drivers/fingerprintrosy/fpcrosy/Kconfig" + diff --git a/drivers/fingerprintrosy/Makefile b/drivers/fingerprintrosy/Makefile new file mode 100755 index 0000000000000..572f9928d6a5f --- /dev/null +++ b/drivers/fingerprintrosy/Makefile @@ -0,0 +1,3 @@ +obj-$(CONFIG_FINGERPRINT_GOODIX_GF3208_ROSY) += goodixrosy/ +obj-$(CONFIG_FINGERPRINT_FPC1020_ROSY) += fpcrosy/ + diff --git a/drivers/fingerprintrosy/fpcrosy/Kconfig b/drivers/fingerprintrosy/fpcrosy/Kconfig new file mode 100755 index 0000000000000..71cd2a83e4a7d --- /dev/null +++ b/drivers/fingerprintrosy/fpcrosy/Kconfig @@ -0,0 +1,6 @@ +config FINGERPRINT_FPC1020_ROSY + tristate "FingerPrint Cards fingerprint drvier support" + depends on FINGERPRINT_ROSY + help + Say Y here to enable goodix fingerprint driver support! + diff --git a/drivers/fingerprintrosy/fpcrosy/Makefile b/drivers/fingerprintrosy/fpcrosy/Makefile new file mode 100755 index 0000000000000..57eaf267c406d --- /dev/null +++ b/drivers/fingerprintrosy/fpcrosy/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_FINGERPRINT_FPC1020_ROSY) += fpc1020_tee.o diff --git a/drivers/fingerprintrosy/fpcrosy/fpc1020_tee.c b/drivers/fingerprintrosy/fpcrosy/fpc1020_tee.c new file mode 100644 index 0000000000000..8539a6a794e66 --- /dev/null +++ b/drivers/fingerprintrosy/fpcrosy/fpc1020_tee.c @@ -0,0 +1,647 @@ +/* + * FPC1020 Fingerprint sensor device driver + * + * This driver will control the platform resources that the FPC fingerprint + * sensor needs to operate. The major things are probing the sensor to check + * that it is actually connected and let the Kernel know this and with that also + * enabling and disabling of regulators, controlling GPIOs such as sensor reset + * line, sensor IRQ line. + * + * The driver will expose most of its available functionality in sysfs which + * enables dynamic control of these features from eg. a user space process. + * + * The sensor's IRQ events will be pushed to Kernel's event handling system and + * are exposed in the drivers event node. + * + * This driver will NOT send any commands to the sensor it only controls the + * electrical parts. + * + * + * Copyright (c) 2015 Fingerprint Cards AB + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License Version 2 + * as published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define FPC_TTW_HOLD_TIME 2000 +#define FP_UNLOCK_REJECTION_TIMEOUT (FPC_TTW_HOLD_TIME - 500) + + +#define RESET_LOW_SLEEP_MIN_US 5000 +#define RESET_LOW_SLEEP_MAX_US (RESET_LOW_SLEEP_MIN_US + 100) +#define RESET_HIGH_SLEEP1_MIN_US 100 +#define RESET_HIGH_SLEEP1_MAX_US (RESET_HIGH_SLEEP1_MIN_US + 100) +#define RESET_HIGH_SLEEP2_MIN_US 5000 +#define RESET_HIGH_SLEEP2_MAX_US (RESET_HIGH_SLEEP2_MIN_US + 100) +#define PWR_ON_SLEEP_MIN_US 100 +#define PWR_ON_SLEEP_MAX_US (PWR_ON_SLEEP_MIN_US + 900) + +#define NUM_PARAMS_REG_ENABLE_SET 2 + +static const char * const pctl_names[] = { + "fpc1020_reset_reset", + "fpc1020_reset_active", + "fpc1020_irq_active", +}; + +struct fpc1020_data { + struct device *dev; + + struct pinctrl *fingerprint_pinctrl; + struct pinctrl_state *pinctrl_state[ARRAY_SIZE(pctl_names)]; + + + struct wake_lock ttw_wl; + int irq_gpio; + int rst_gpio; + struct mutex lock; /* To set/get exported values in sysfs */ + bool prepared; + bool compatible_enabled; + atomic_t wakeup_enabled; /* Used both in ISR and non-ISR */ + + struct notifier_block fb_notifier; + bool fb_black; + bool wait_finger_down; + struct work_struct work; + +}; + +static irqreturn_t fpc1020_irq_handler(int irq, void *handle); +static int fpc1020_request_named_gpio(struct fpc1020_data *fpc1020, + const char *label, int *gpio); +static int hw_reset(struct fpc1020_data *fpc1020); + +/** + * sysfs node for controlling clocks. + * + * This is disabled in platform variant of this driver but kept for + * backwards compatibility. Only prints a debug print that it is + * disabled. + */ +static ssize_t clk_enable_set(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + dev_dbg(dev, + "clk_enable sysfs node not enabled in platform driver\n"); + + return count; +} +static DEVICE_ATTR(clk_enable, S_IWUSR, NULL, clk_enable_set); + +/** + * Will try to select the set of pins (GPIOS) defined in a pin control node of + * the device tree named @p name. + * + * The node can contain several eg. GPIOs that is controlled when selecting it. + * The node may activate or deactivate the pins it contains, the action is + * defined in the device tree node itself and not here. The states used + * internally is fetched at probe time. + * + * @see pctl_names + * @see fpc1020_probe + */ +static int select_pin_ctl(struct fpc1020_data *fpc1020, const char *name) +{ + size_t i; + int rc; + struct device *dev = fpc1020->dev; + + for (i = 0; i < ARRAY_SIZE(fpc1020->pinctrl_state); i++) { + const char *n = pctl_names[i]; + + if (!strncmp(n, name, strlen(n))) { + rc = pinctrl_select_state(fpc1020->fingerprint_pinctrl, + fpc1020->pinctrl_state[i]); + if (rc) + dev_err(dev, "cannot select '%s'\n", name); + else + dev_dbg(dev, "Selected '%s'\n", name); + goto exit; + } + } + + rc = -EINVAL; + dev_err(dev, "%s:'%s' not found\n", __func__, name); + +exit: + return rc; +} + +static ssize_t pinctl_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + int rc; + + mutex_lock(&fpc1020->lock); + rc = select_pin_ctl(fpc1020, buf); + mutex_unlock(&fpc1020->lock); + + return rc ? rc : count; +} +static DEVICE_ATTR(pinctl_set, S_IWUSR, NULL, pinctl_set); + +static int hw_reset(struct fpc1020_data *fpc1020) +{ + int irq_gpio; + struct device *dev = fpc1020->dev; + int rc = select_pin_ctl(fpc1020, "fpc1020_reset_active"); + + if (rc) + goto exit; + usleep_range(RESET_HIGH_SLEEP1_MIN_US, RESET_HIGH_SLEEP1_MAX_US); + + rc = select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + if (rc) + goto exit; + usleep_range(RESET_LOW_SLEEP_MIN_US, RESET_LOW_SLEEP_MAX_US); + + rc = select_pin_ctl(fpc1020, "fpc1020_reset_active"); + if (rc) + goto exit; + usleep_range(RESET_HIGH_SLEEP2_MIN_US, RESET_HIGH_SLEEP2_MAX_US); + + irq_gpio = gpio_get_value(fpc1020->irq_gpio); + dev_info(dev, "IRQ after reset %d\n", irq_gpio); + +exit: + return rc; +} + +static ssize_t hw_reset_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + if (!strncmp(buf, "reset", strlen("reset"))) { + mutex_lock(&fpc1020->lock); + rc = hw_reset(fpc1020); + mutex_unlock(&fpc1020->lock); + } else { + return -EINVAL; + } + + return rc ? rc : count; +} +static DEVICE_ATTR(hw_reset, S_IWUSR, NULL, hw_reset_set); + +/** + * Will setup GPIOs, and regulators to correctly initialize the touch sensor to + * be ready for work. + * + * In the correct order according to the sensor spec this function will + * enable/disable regulators, and reset line, all to set the sensor in a + * correct power on or off state "electrical" wise. + * + * @see device_prepare_set + * @note This function will not send any commands to the sensor it will only + * control it "electrically". + */ +static int device_prepare(struct fpc1020_data *fpc1020, bool enable) +{ + int rc; + + mutex_lock(&fpc1020->lock); + if (enable && !fpc1020->prepared) { + fpc1020->prepared = true; + select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + + usleep_range(PWR_ON_SLEEP_MIN_US, PWR_ON_SLEEP_MAX_US); + + /* As we can't control chip select here the other part of the + * sensor driver eg. the TEE driver needs to do a _SOFT_ reset + * on the sensor after power up to be sure that the sensor is + * in a good state after power up. Okeyed by ASIC. */ + + (void)select_pin_ctl(fpc1020, "fpc1020_reset_active"); + } else if (!enable && fpc1020->prepared) { + rc = 0; + (void)select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + + usleep_range(PWR_ON_SLEEP_MIN_US, PWR_ON_SLEEP_MAX_US); + fpc1020->prepared = false; + } else { + rc = 0; + } + mutex_unlock(&fpc1020->lock); + + return rc; +} + +/** + * sysfs node to enable/disable (power up/power down) the touch sensor + * + * @see device_prepare + */ +static ssize_t device_prepare_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + if (!strncmp(buf, "enable", strlen("enable"))) + rc = device_prepare(fpc1020, true); + else if (!strncmp(buf, "disable", strlen("disable"))) + rc = device_prepare(fpc1020, false); + else + return -EINVAL; + + return rc ? rc : count; +} +static DEVICE_ATTR(device_prepare, S_IWUSR, NULL, device_prepare_set); + +/** + * sysfs node for controlling whether the driver is allowed + * to wake up the platform on interrupt. + */ +static ssize_t wakeup_enable_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + ssize_t ret = count; + + mutex_lock(&fpc1020->lock); + if (!strncmp(buf, "enable", strlen("enable"))) + atomic_set(&fpc1020->wakeup_enabled, 1); + else if (!strncmp(buf, "disable", strlen("disable"))) + atomic_set(&fpc1020->wakeup_enabled, 1); + else + ret = -EINVAL; + mutex_unlock(&fpc1020->lock); + + return ret; +} +static DEVICE_ATTR(wakeup_enable, S_IWUSR, NULL, wakeup_enable_set); + +/** + * sysf node to check the interrupt status of the sensor, the interrupt + * handler should perform sysf_notify to allow userland to poll the node. + */ +static ssize_t irq_get(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + int irq = gpio_get_value(fpc1020->irq_gpio); + + return scnprintf(buf, PAGE_SIZE, "%i\n", irq); +} + +/** + * writing to the irq node will just drop a printk message + * and return success, used for latency measurement. + */ +static ssize_t irq_ack(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + dev_dbg(fpc1020->dev, "%s\n", __func__); + + return count; +} +static DEVICE_ATTR(irq, S_IRUSR | S_IWUSR, irq_get, irq_ack); + +static ssize_t fingerdown_wait_set(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + dev_dbg(fpc1020->dev, "%s\n", __func__); + if (!strncmp(buf, "enable", strlen("enable"))) + fpc1020->wait_finger_down = true; + else if (!strncmp(buf, "disable", strlen("disable"))) + fpc1020->wait_finger_down = false; + else + return -EINVAL; + + return count; +} +static DEVICE_ATTR(fingerdown_wait, S_IWUSR, NULL, fingerdown_wait_set); + +static ssize_t compatible_all_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + int i; + int irqf; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + dev_err(dev, "compatible all enter %d\n", fpc1020->compatible_enabled); + if (!strncmp(buf, "enable", strlen("enable")) && fpc1020->compatible_enabled != 1) { + rc = fpc1020_request_named_gpio(fpc1020, "fpc,gpio_irq", + &fpc1020->irq_gpio); + if (rc) + goto exit; + + rc = fpc1020_request_named_gpio(fpc1020, "fpc,gpio_rst", + &fpc1020->rst_gpio); + dev_err(dev, "fpc request reset result = %d\n", rc); + if (rc) + goto exit; + fpc1020->fingerprint_pinctrl = devm_pinctrl_get(dev); + if (IS_ERR(fpc1020->fingerprint_pinctrl)) { + if (PTR_ERR(fpc1020->fingerprint_pinctrl) == -EPROBE_DEFER) { + dev_info(dev, "pinctrl not ready\n"); + rc = -EPROBE_DEFER; + goto exit; + } + dev_err(dev, "Target does not use pinctrl\n"); + fpc1020->fingerprint_pinctrl = NULL; + rc = -EINVAL; + goto exit; + } + + for (i = 0; i < ARRAY_SIZE(fpc1020->pinctrl_state); i++) { + const char *n = pctl_names[i]; + struct pinctrl_state *state = + pinctrl_lookup_state(fpc1020->fingerprint_pinctrl, n); + if (IS_ERR(state)) { + dev_err(dev, "cannot find '%s'\n", n); + rc = -EINVAL; + goto exit; + } + dev_info(dev, "found pin control %s\n", n); + fpc1020->pinctrl_state[i] = state; + } + rc = select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + if (rc) + goto exit; + rc = select_pin_ctl(fpc1020, "fpc1020_irq_active"); + if (rc) + goto exit; + irqf = IRQF_TRIGGER_RISING | IRQF_ONESHOT; + if (of_property_read_bool(dev->of_node, "fpc,enable-wakeup")) { + irqf |= IRQF_NO_SUSPEND; + device_init_wakeup(dev, 1); + } + rc = devm_request_threaded_irq(dev, gpio_to_irq(fpc1020->irq_gpio), + NULL, fpc1020_irq_handler, irqf, + dev_name(dev), fpc1020); + if (rc) { + dev_err(dev, "could not request irq %d\n", + gpio_to_irq(fpc1020->irq_gpio)); + goto exit; + } + dev_dbg(dev, "requested irq %d\n", gpio_to_irq(fpc1020->irq_gpio)); + + /* Request that the interrupt should be wakeable */ + enable_irq_wake(gpio_to_irq(fpc1020->irq_gpio)); + fpc1020->compatible_enabled = 1; + if (of_property_read_bool(dev->of_node, "fpc,enable-on-boot")) { + dev_info(dev, "Enabling hardware\n"); + (void)device_prepare(fpc1020, true); +#ifdef LINUX_CONTROL_SPI_CLK + (void)set_clks(fpc1020, false); +#endif + } + } else if (!strncmp(buf, "disable", strlen("disable")) && fpc1020->compatible_enabled != 0) { + if (gpio_is_valid(fpc1020->irq_gpio)) { + devm_gpio_free(dev, fpc1020->irq_gpio); + pr_info("remove irq_gpio success\n"); + } + if (gpio_is_valid(fpc1020->rst_gpio)) { + devm_gpio_free(dev, fpc1020->rst_gpio); + pr_info("remove rst_gpio success\n"); + } + devm_free_irq(dev, gpio_to_irq(fpc1020->irq_gpio), fpc1020); + fpc1020->compatible_enabled = 0; + } + hw_reset(fpc1020); + return count; +exit: + return -EINVAL; +} +static DEVICE_ATTR(compatible_all, S_IWUSR, NULL, compatible_all_set); +static struct attribute *attributes[] = { + &dev_attr_pinctl_set.attr, + &dev_attr_device_prepare.attr, + + &dev_attr_hw_reset.attr, + &dev_attr_wakeup_enable.attr, + &dev_attr_clk_enable.attr, + &dev_attr_irq.attr, + &dev_attr_compatible_all.attr, + &dev_attr_fingerdown_wait.attr, + NULL +}; + +static const struct attribute_group attribute_group = { + .attrs = attributes, +}; + +static void notification_work(struct work_struct *work) +{ + mdss_prim_panel_fb_unblank(FP_UNLOCK_REJECTION_TIMEOUT); + pr_debug("unblank\n"); +} + +static irqreturn_t fpc1020_irq_handler(int irq, void *handle) +{ + struct fpc1020_data *fpc1020 = handle; + + dev_dbg(fpc1020->dev, "%s\n", __func__); + + if (atomic_read(&fpc1020->wakeup_enabled)) { + wake_lock_timeout(&fpc1020->ttw_wl, + msecs_to_jiffies(FPC_TTW_HOLD_TIME)); + } + + sysfs_notify(&fpc1020->dev->kobj, NULL, dev_attr_irq.attr.name); + + if (fpc1020->wait_finger_down && fpc1020->fb_black) { + pr_debug("%s enter\n", __func__); + fpc1020->wait_finger_down = false; + schedule_work(&fpc1020->work); + } + + return IRQ_HANDLED; +} + +static int fpc1020_request_named_gpio(struct fpc1020_data *fpc1020, + const char *label, int *gpio) +{ + struct device *dev = fpc1020->dev; + struct device_node *np = dev->of_node; + int rc = of_get_named_gpio(np, label, 0); + + if (rc < 0) { + dev_err(dev, "failed to get '%s'\n", label); + return rc; + } + *gpio = rc; + + rc = devm_gpio_request(dev, *gpio, label); + if (rc) { + dev_err(dev, "failed to request gpio %d\n", *gpio); + return rc; + } + dev_dbg(dev, "%s %d\n", label, *gpio); + + return 0; +} + +static int fpc_fb_notif_callback(struct notifier_block *nb, + unsigned long val, void *data) +{ + struct fpc1020_data *fpc1020 = container_of(nb, struct fpc1020_data, + fb_notifier); + struct fb_event *evdata = data; + unsigned int blank; + + if (!fpc1020) + return 0; + + if (val != FB_EVENT_BLANK) + return 0; + + pr_debug("[info] %s value = %d\n", __func__, (int)val); + + if (evdata && evdata->data && val == FB_EVENT_BLANK) { + blank = *(int *)(evdata->data); + switch (blank) { + case FB_BLANK_POWERDOWN: + fpc1020->fb_black = true; + break; + case FB_BLANK_UNBLANK: + fpc1020->fb_black = false; + break; + default: + pr_debug("%s defalut\n", __func__); + break; + } + } + return NOTIFY_OK; +} + + +static struct notifier_block fpc_notif_block = { + .notifier_call = fpc_fb_notif_callback, +}; + +static int fpc1020_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + int rc = 0; + + + struct device_node *np = dev->of_node; + struct fpc1020_data *fpc1020 = devm_kzalloc(dev, sizeof(*fpc1020), + GFP_KERNEL); + + if (!fpc1020) { + dev_err(dev, + "failed to allocate memory for struct fpc1020_data\n"); + rc = -ENOMEM; + goto exit; + } + + fpc1020->dev = dev; + platform_set_drvdata(pdev, fpc1020); + + if (!np) { + dev_err(dev, "no of node found\n"); + rc = -EINVAL; + goto exit; + } + + atomic_set(&fpc1020->wakeup_enabled, 1); + mutex_init(&fpc1020->lock); + + wake_lock_init(&fpc1020->ttw_wl, WAKE_LOCK_SUSPEND, "fpc_ttw_wl"); + + rc = sysfs_create_group(&dev->kobj, &attribute_group); + if (rc) { + dev_err(dev, "could not create sysfs\n"); + goto exit; + } + + dev_info(dev, "%s: ok\n", __func__); + + fpc1020->fb_black = false; + fpc1020->wait_finger_down = false; + INIT_WORK(&fpc1020->work, notification_work); + fpc1020->fb_notifier = fpc_notif_block; + fb_register_client(&fpc1020->fb_notifier); + + +exit: + return rc; +} + +static int fpc1020_remove(struct platform_device *pdev) +{ + struct fpc1020_data *fpc1020 = platform_get_drvdata(pdev); + + fb_unregister_client(&fpc1020->fb_notifier); + sysfs_remove_group(&pdev->dev.kobj, &attribute_group); + mutex_destroy(&fpc1020->lock); + wake_lock_destroy(&fpc1020->ttw_wl); + dev_info(&pdev->dev, "%s\n", __func__); + + return 0; +} + +static struct of_device_id fpc1020_of_match[] = { + { .compatible = "fpc,fpc1020", }, + {} +}; +MODULE_DEVICE_TABLE(of, fpc1020_of_match); + +static struct platform_driver fpc1020_driver = { + .driver = { + .name = "fpc1020", + .owner = THIS_MODULE, + .of_match_table = fpc1020_of_match, + }, + .probe = fpc1020_probe, + .remove = fpc1020_remove, +}; + +static int __init fpc1020_init(void) +{ + int rc = platform_driver_register(&fpc1020_driver); + + if (!rc) + pr_info("%s OK\n", __func__); + else + pr_err("%s %d\n", __func__, rc); + + return rc; +} + +static void __exit fpc1020_exit(void) +{ + pr_info("%s\n", __func__); + platform_driver_unregister(&fpc1020_driver); +} + +module_init(fpc1020_init); +module_exit(fpc1020_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Aleksej Makarov"); +MODULE_AUTHOR("Henrik Tillman "); +MODULE_DESCRIPTION("FPC1020 Fingerprint sensor device driver."); diff --git a/drivers/fingerprintrosy/goodixrosy/Kconfig b/drivers/fingerprintrosy/goodixrosy/Kconfig new file mode 100755 index 0000000000000..c23fedcbddc6b --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/Kconfig @@ -0,0 +1,5 @@ +config FINGERPRINT_GOODIX_GF3208_ROSY + tristate "generic goodix fingerprint driver" + depends on FINGERPRINT_ROSY + help + add support for goodix fingerprint driver. diff --git a/drivers/fingerprintrosy/goodixrosy/Makefile b/drivers/fingerprintrosy/goodixrosy/Makefile new file mode 100755 index 0000000000000..d8e1d2169d31f --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_FINGERPRINT_GOODIX_GF3208_ROSY) += gf_spi.o platform.o netlink.o diff --git a/drivers/fingerprintrosy/goodixrosy/gf_spi.c b/drivers/fingerprintrosy/goodixrosy/gf_spi.c new file mode 100644 index 0000000000000..87943b2dd746e --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/gf_spi.c @@ -0,0 +1,940 @@ +/* + * TEE driver for goodix fingerprint sensor + * Copyright (C) 2016 Goodix + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "gf_spi.h" + +#if defined(USE_SPI_BUS) +#include +#include +#elif defined(USE_PLATFORM_BUS) +#include +#endif + +#include +#define VER_MAJOR 1 +#define VER_MINOR 2 +#define PATCH_LEVEL 10 + +#define WAKELOCK_HOLD_TIME 2000 /* in ms */ +#define FP_UNLOCK_REJECTION_TIMEOUT (WAKELOCK_HOLD_TIME - 500) + +#define GF_SPIDEV_NAME "goodix,fingerprint" +/*device name after register in charater*/ +#define GF_DEV_NAME "goodix_fp" +#define GF_INPUT_NAME "uinput-goodix" /*"goodix_fp" */ + +#define CHRD_DRIVER_NAME "goodix_fp_spi" +#define CLASS_NAME "goodix_fp" + +#define N_SPI_MINORS 32 /* ... up to 256 */ +static int SPIDEV_MAJOR; + +static DECLARE_BITMAP(minors, N_SPI_MINORS); +static LIST_HEAD(device_list); +static DEFINE_MUTEX(device_list_lock); +static struct wake_lock fp_wakelock; +static struct gf_dev gf; + +static struct gf_key_map maps[] = { + { EV_KEY, GF_KEY_INPUT_HOME }, + { EV_KEY, GF_KEY_INPUT_MENU }, + { EV_KEY, GF_KEY_INPUT_BACK }, + { EV_KEY, GF_KEY_INPUT_POWER }, +#if defined(SUPPORT_NAV_EVENT) + { EV_KEY, GF_NAV_INPUT_UP }, + { EV_KEY, GF_NAV_INPUT_DOWN }, + { EV_KEY, GF_NAV_INPUT_RIGHT }, + { EV_KEY, GF_NAV_INPUT_LEFT }, + { EV_KEY, GF_KEY_INPUT_CAMERA }, + { EV_KEY, GF_NAV_INPUT_CLICK }, + { EV_KEY, GF_NAV_INPUT_DOUBLE_CLICK }, + { EV_KEY, GF_NAV_INPUT_LONG_PRESS }, + { EV_KEY, GF_NAV_INPUT_HEAVY }, +#endif + { EV_KEY, GF_KEY_INPUT_SELECT}, +}; + +static void notification_work(struct work_struct *work) +{ + mdss_prim_panel_fb_unblank(FP_UNLOCK_REJECTION_TIMEOUT); + pr_debug("unblank\n"); +} + +static void gf_enable_irq(struct gf_dev *gf_dev) +{ + if (gf_dev->irq_enabled) { + pr_warn("IRQ has been enabled.\n"); + } else { + enable_irq(gf_dev->irq); + gf_dev->irq_enabled = 1; + } +} + +static void gf_disable_irq(struct gf_dev *gf_dev) +{ + if (gf_dev->irq_enabled) { + gf_dev->irq_enabled = 0; + disable_irq(gf_dev->irq); + } else { + pr_warn("IRQ has been disabled.\n"); + } +} + +#ifdef AP_CONTROL_CLK +static long spi_clk_max_rate(struct clk *clk, unsigned long rate) +{ + long lowest_available, nearest_low, step_size, cur; + long step_direction = -1; + long guess = rate; + int max_steps = 10; + + cur = clk_round_rate(clk, rate); + if (cur == rate) + return rate; + + /* if we got here then: cur > rate */ + lowest_available = clk_round_rate(clk, 0); + if (lowest_available > rate) + return -EINVAL; + + step_size = (rate - lowest_available) >> 1; + nearest_low = lowest_available; + + while (max_steps-- && step_size) { + guess += step_size * step_direction; + cur = clk_round_rate(clk, guess); + + if ((cur < rate) && (cur > nearest_low)) + nearest_low = cur; + /* + * if we stepped too far, then start stepping in the other + * direction with half the step size + */ + if (((cur > rate) && (step_direction > 0)) + || ((cur < rate) && (step_direction < 0))) { + step_direction = -step_direction; + step_size >>= 1; + } + } + return nearest_low; +} + +static void spi_clock_set(struct gf_dev *gf_dev, int speed) +{ + long rate; + int rc; + + rate = spi_clk_max_rate(gf_dev->core_clk, speed); + if (rate < 0) { + pr_info("%s: no match found for requested clock frequency:%d", + __func__, speed); + return; + } + + rc = clk_set_rate(gf_dev->core_clk, rate); +} + +static int gfspi_ioctl_clk_init(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + data->clk_enabled = 0; + data->core_clk = clk_get(&data->spi->dev, "core_clk"); + if (IS_ERR_OR_NULL(data->core_clk)) { + pr_err("%s: fail to get core_clk\n", __func__); + return -EPERM; + } + data->iface_clk = clk_get(&data->spi->dev, "iface_clk"); + if (IS_ERR_OR_NULL(data->iface_clk)) { + pr_err("%s: fail to get iface_clk\n", __func__); + clk_put(data->core_clk); + data->core_clk = NULL; + return -ENOENT; + } + return 0; +} + +static int gfspi_ioctl_clk_enable(struct gf_dev *data) +{ + int err; + + pr_debug("%s: enter\n", __func__); + + if (data->clk_enabled) + return 0; + + err = clk_prepare_enable(data->core_clk); + if (err) { + pr_err("%s: fail to enable core_clk\n", __func__); + return -EPERM; + } + + err = clk_prepare_enable(data->iface_clk); + if (err) { + pr_err("%s: fail to enable iface_clk\n", __func__); + clk_disable_unprepare(data->core_clk); + return -ENOENT; + } + + data->clk_enabled = 1; + + return 0; +} + +static int gfspi_ioctl_clk_disable(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + if (!data->clk_enabled) + return 0; + + clk_disable_unprepare(data->core_clk); + clk_disable_unprepare(data->iface_clk); + data->clk_enabled = 0; + + return 0; +} + +static int gfspi_ioctl_clk_uninit(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + if (data->clk_enabled) + gfspi_ioctl_clk_disable(data); + + if (!IS_ERR_OR_NULL(data->core_clk)) { + clk_put(data->core_clk); + data->core_clk = NULL; + } + + if (!IS_ERR_OR_NULL(data->iface_clk)) { + clk_put(data->iface_clk); + data->iface_clk = NULL; + } + + return 0; +} +#endif + +static void nav_event_input(struct gf_dev *gf_dev, gf_nav_event_t nav_event) +{ + uint32_t nav_input = 0; + + switch (nav_event) { + case GF_NAV_FINGER_DOWN: + pr_debug("%s nav finger down\n", __func__); + break; + + case GF_NAV_FINGER_UP: + pr_debug("%s nav finger up\n", __func__); + break; + + case GF_NAV_DOWN: + nav_input = GF_NAV_INPUT_DOWN; + pr_debug("%s nav down\n", __func__); + break; + + case GF_NAV_UP: + nav_input = GF_NAV_INPUT_UP; + pr_debug("%s nav up\n", __func__); + break; + + case GF_NAV_LEFT: + nav_input = GF_NAV_INPUT_LEFT; + pr_debug("%s nav left\n", __func__); + break; + + case GF_NAV_RIGHT: + nav_input = GF_NAV_INPUT_RIGHT; + pr_debug("%s nav right\n", __func__); + break; + + case GF_NAV_CLICK: + nav_input = GF_NAV_INPUT_CLICK; + pr_debug("%s nav click\n", __func__); + break; + + case GF_NAV_HEAVY: + nav_input = GF_NAV_INPUT_HEAVY; + pr_debug("%s nav heavy\n", __func__); + break; + + case GF_NAV_LONG_PRESS: + nav_input = GF_NAV_INPUT_LONG_PRESS; + pr_debug("%s nav long press\n", __func__); + break; + + case GF_NAV_DOUBLE_CLICK: + nav_input = GF_NAV_INPUT_DOUBLE_CLICK; + pr_debug("%s nav double click\n", __func__); + break; + + default: + pr_warn("%s unknown nav event: %d\n", __func__, nav_event); + break; + } + + if ((nav_event != GF_NAV_FINGER_DOWN) && + (nav_event != GF_NAV_FINGER_UP)) { + input_report_key(gf_dev->input, nav_input, 1); + input_sync(gf_dev->input); + input_report_key(gf_dev->input, nav_input, 0); + input_sync(gf_dev->input); + } +} + +static irqreturn_t gf_irq(int irq, void *handle) +{ +#if defined(GF_NETLINK_ENABLE) + char msg = GF_NET_EVENT_IRQ; + struct gf_dev *gf_dev = &gf; + + wake_lock_timeout(&fp_wakelock, msecs_to_jiffies(WAKELOCK_HOLD_TIME)); + sendnlmsg(&msg); + + if ((gf_dev->wait_finger_down == true) && (gf_dev->device_available == 1) && (gf_dev->fb_black == 1)) { + gf_dev->wait_finger_down = false; + schedule_work(&gf_dev->work); + } + +#elif defined(GF_FASYNC) + struct gf_dev *gf_dev = &gf; + + if (gf_dev->async) + kill_fasync(&gf_dev->async, SIGIO, POLL_IN); +#endif + + return IRQ_HANDLED; +} + +static int irq_setup(struct gf_dev *gf_dev) +{ + int status; + + gf_dev->irq = gf_irq_num(gf_dev); + status = request_threaded_irq(gf_dev->irq, NULL, gf_irq, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "gf", gf_dev); + + if (status) { + pr_err("failed to request IRQ:%d\n", gf_dev->irq); + return status; + } + enable_irq_wake(gf_dev->irq); + gf_dev->irq_enabled = 1; + + return status; +} + +static void irq_cleanup(struct gf_dev *gf_dev) +{ + gf_dev->irq_enabled = 0; + disable_irq(gf_dev->irq); + disable_irq_wake(gf_dev->irq); + free_irq(gf_dev->irq, gf_dev); +} + +static void gf_kernel_key_input(struct gf_dev *gf_dev, struct gf_key *gf_key) +{ + uint32_t key_input = 0; + + if (gf_key->key == GF_KEY_HOME) { + key_input = GF_KEY_INPUT_SELECT; + pr_info("fp keycode home-SELECT \n"); + } else if (gf_key->key == GF_KEY_POWER) { + key_input = GF_KEY_INPUT_SELECT; + pr_info("fp keycode power \n"); + } else if (gf_key->key == GF_KEY_CAMERA) { + key_input = GF_KEY_INPUT_SELECT; + pr_info("fp keycode camera \n"); + } else { + /* add special key define */ + key_input = gf_key->key; + } + pr_info("%s: received key event[%d], key=%d, value=%d\n", + __func__, key_input, gf_key->key, gf_key->value); + + if ((GF_KEY_POWER == gf_key->key || GF_KEY_CAMERA == gf_key->key) + && (gf_key->value == 1)) { + #ifndef WT_COMPILE_FACTORY_VERSION + input_report_key(gf_dev->input, key_input, 1); + input_sync(gf_dev->input); + input_report_key(gf_dev->input, key_input, 0); + input_sync(gf_dev->input); + #endif + } + + if (gf_key->key == GF_KEY_HOME) { + #ifndef WT_COMPILE_FACTORY_VERSION + + input_report_key(gf_dev->input, key_input, gf_key->value); + input_sync(gf_dev->input); + #endif + } +} + +static long gf_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + struct gf_dev *gf_dev = &gf; + struct gf_key gf_key; +#if defined(SUPPORT_NAV_EVENT) + gf_nav_event_t nav_event = GF_NAV_NONE; +#endif + int retval = 0; + u8 netlink_route = NETLINK_TEST; + struct gf_ioc_chip_info info; + + if (_IOC_TYPE(cmd) != GF_IOC_MAGIC) + return -ENODEV; + + if (_IOC_DIR(cmd) & _IOC_READ) + retval = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); + else if (_IOC_DIR(cmd) & _IOC_WRITE) + retval = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + if (retval) + return -EFAULT; + + switch (cmd) { + case GF_IOC_INIT: + pr_debug("%s GF_IOC_INIT\n", __func__); + if (copy_to_user((void __user *)arg, (void *)&netlink_route, sizeof(u8))) { + pr_err("GF_IOC_INIT failed\n"); + retval = -EFAULT; + break; + } + break; + + case GF_IOC_EXIT: + pr_debug("%s GF_IOC_EXIT\n", __func__); + break; + + case GF_IOC_DISABLE_IRQ: + pr_debug("%s GF_IOC_DISABEL_IRQ\n", __func__); + gf_disable_irq(gf_dev); + break; + + case GF_IOC_ENABLE_IRQ: + pr_debug("%s GF_IOC_ENABLE_IRQ\n", __func__); + gf_enable_irq(gf_dev); + break; + + case GF_IOC_RESET: + pr_debug("%s GF_IOC_RESET\n", __func__); + gf_hw_reset(gf_dev, 3); + break; + + case GF_IOC_INPUT_KEY_EVENT: + if (copy_from_user(&gf_key, (void __user *)arg, sizeof(struct gf_key))) { + pr_err("failed to copy input key event from user to kernel\n"); + retval = -EFAULT; + break; + } + + gf_kernel_key_input(gf_dev, &gf_key); + break; + +#if defined(SUPPORT_NAV_EVENT) + case GF_IOC_NAV_EVENT: + pr_debug("%s GF_IOC_NAV_EVENT\n", __func__); + if (copy_from_user(&nav_event, (void __user *)arg, sizeof(gf_nav_event_t))) { + pr_err("failed to copy nav event from user to kernel\n"); + retval = -EFAULT; + break; + } + + nav_event_input(gf_dev, nav_event); + break; +#endif + + case GF_IOC_ENABLE_SPI_CLK: + pr_debug("%s GF_IOC_ENABLE_SPI_CLK\n", __func__); +#ifdef AP_CONTROL_CLK + gfspi_ioctl_clk_enable(gf_dev); +#else + pr_debug("doesn't support control clock!\n"); +#endif + break; + + case GF_IOC_DISABLE_SPI_CLK: + pr_debug("%s GF_IOC_DISABLE_SPI_CLK\n", __func__); +#ifdef AP_CONTROL_CLK + gfspi_ioctl_clk_disable(gf_dev); +#else + pr_debug("doesn't support control clock!\n"); +#endif + break; + + case GF_IOC_ENABLE_POWER: + pr_debug("%s GF_IOC_ENABLE_POWER\n", __func__); + gf_power_on(gf_dev); + break; + + case GF_IOC_DISABLE_POWER: + pr_debug("%s GF_IOC_DISABLE_POWER\n", __func__); + gf_power_off(gf_dev); + break; + + case GF_IOC_ENTER_SLEEP_MODE: + pr_debug("%s GF_IOC_ENTER_SLEEP_MODE\n", __func__); + break; + + case GF_IOC_GET_FW_INFO: + pr_debug("%s GF_IOC_GET_FW_INFO\n", __func__); + break; + + case GF_IOC_REMOVE: + pr_debug("%s GF_IOC_REMOVE\n", __func__); + irq_cleanup(gf_dev); + gf_cleanup(gf_dev); + break; + + case GF_IOC_CHIP_INFO: + pr_debug("%s GF_IOC_CHIP_INFO\n", __func__); + if (copy_from_user(&info, (void __user *)arg, sizeof(struct gf_ioc_chip_info))) { + retval = -EFAULT; + break; + } + pr_info("vendor_id : 0x%x\n", info.vendor_id); + pr_info("mode : 0x%x\n", info.mode); + pr_info("operation: 0x%x\n", info.operation); + break; + + default: + pr_warn("unsupport cmd:0x%x\n", cmd); + break; + } + + return retval; +} + +#ifdef CONFIG_COMPAT +static long gf_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + return gf_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); +} +#endif /*CONFIG_COMPAT*/ + + +static int gf_open(struct inode *inode, struct file *filp) +{ + struct gf_dev *gf_dev = &gf; + int status = -ENXIO; + + mutex_lock(&device_list_lock); + + list_for_each_entry(gf_dev, &device_list, device_entry) { + if (gf_dev->devt == inode->i_rdev) { + pr_info("Found\n"); + status = 0; + break; + } + } + + if (status == 0) { + if (status == 0) { + gf_dev->users++; + filp->private_data = gf_dev; + nonseekable_open(inode, filp); + pr_info("Succeed to open device. irq = %d\n", + gf_dev->irq); + if (gf_dev->users == 1) { + status = gf_parse_dts(gf_dev); + if (status) + goto err_parse_dt; + + status = irq_setup(gf_dev); + if (status) + goto err_irq; + } + gf_hw_reset(gf_dev, 3); + gf_dev->device_available = 1; + } + } else { + pr_info("No device for minor %d\n", iminor(inode)); + } + mutex_unlock(&device_list_lock); + + return status; +err_irq: + gf_cleanup(gf_dev); +err_parse_dt: + return status; +} + +#ifdef GF_FASYNC +static int gf_fasync(int fd, struct file *filp, int mode) +{ + struct gf_dev *gf_dev = filp->private_data; + int ret; + + ret = fasync_helper(fd, filp, mode, &gf_dev->async); + pr_info("ret = %d\n", ret); + return ret; +} +#endif + +static int gf_release(struct inode *inode, struct file *filp) +{ + struct gf_dev *gf_dev = &gf; + int status = 0; + + struct device *dev = &gf_dev->spi->dev; + mutex_lock(&device_list_lock); + gf_dev = filp->private_data; + filp->private_data = NULL; + + /*last close?? */ + gf_dev->users--; + if (!gf_dev->users) { + + pr_info("disble_irq. irq = %d\n", gf_dev->irq); + gf_disable_irq(gf_dev); + /*power off the sensor*/ + gf_dev->device_available = 0; + if (gpio_is_valid(gf_dev->reset_gpio)) { + devm_gpio_free(dev, gf_dev->reset_gpio); + pr_err(" gf_release === reset"); + } + if (gpio_is_valid(gf_dev->irq_gpio)) { + devm_gpio_free(dev, gf_dev->irq_gpio); + pr_err(" gf_release === irq"); + } + devm_free_irq(dev, gpio_to_irq(gf_dev->irq_gpio), gf_dev); + gf_power_off(gf_dev); + } + mutex_unlock(&device_list_lock); + return status; +} + +static const struct file_operations gf_fops = { + .owner = THIS_MODULE, + /* REVISIT switch to aio primitives, so that userspace + * gets more complete API coverage. It'll simplify things + * too, except for the locking. + */ + .unlocked_ioctl = gf_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = gf_compat_ioctl, +#endif /*CONFIG_COMPAT*/ + .open = gf_open, + .release = gf_release, +#ifdef GF_FASYNC + .fasync = gf_fasync, +#endif +}; + +static int goodix_fb_state_chg_callback(struct notifier_block *nb, + unsigned long val, void *data) +{ + struct gf_dev *gf_dev; + struct fb_event *evdata = data; + unsigned int blank; + char msg = 0; + + if (val != FB_EVENT_BLANK) + return 0; + pr_info("[info] %s go to the goodix_fb_state_chg_callback value = %d\n", + __func__, (int)val); + gf_dev = container_of(nb, struct gf_dev, notifier); + if (evdata && evdata->data && val == FB_EVENT_BLANK && gf_dev) { + blank = *(int *)(evdata->data); + switch (blank) { + case FB_BLANK_POWERDOWN: + if (gf_dev->device_available == 1) { + gf_dev->fb_black = 1; + gf_dev->wait_finger_down = true; +#if defined(GF_NETLINK_ENABLE) + msg = GF_NET_EVENT_FB_BLACK; + sendnlmsg(&msg); +#elif defined(GF_FASYNC) + if (gf_dev->async) + kill_fasync(&gf_dev->async, SIGIO, POLL_IN); +#endif + } + break; + case FB_BLANK_UNBLANK: + if (gf_dev->device_available == 1) { + gf_dev->fb_black = 0; +#if defined(GF_NETLINK_ENABLE) + msg = GF_NET_EVENT_FB_UNBLACK; + sendnlmsg(&msg); +#elif defined(GF_FASYNC) + if (gf_dev->async) + kill_fasync(&gf_dev->async, SIGIO, POLL_IN); +#endif + } + break; + default: + pr_info("%s defalut\n", __func__); + break; + } + } + return NOTIFY_OK; +} + +static struct notifier_block goodix_noti_block = { + .notifier_call = goodix_fb_state_chg_callback, +}; + +static struct class *gf_class; +#if defined(USE_SPI_BUS) +static int gf_probe(struct spi_device *spi) +#elif defined(USE_PLATFORM_BUS) +static int gf_probe(struct platform_device *pdev) +#endif +{ + struct gf_dev *gf_dev = &gf; + int status = -EINVAL; + unsigned long minor; + int i; + + /* Initialize the driver data */ + INIT_LIST_HEAD(&gf_dev->device_entry); +#if defined(USE_SPI_BUS) + gf_dev->spi = spi; +#elif defined(USE_PLATFORM_BUS) + gf_dev->spi = pdev; +#endif + gf_dev->irq_gpio = -EINVAL; + gf_dev->reset_gpio = -EINVAL; + gf_dev->pwr_gpio = -EINVAL; + gf_dev->device_available = 0; + gf_dev->fb_black = 0; + + gf_dev->wait_finger_down = false; + INIT_WORK(&gf_dev->work, notification_work); + + + /* If we can allocate a minor number, hook up this device. + * Reusing minors is fine so long as udev or mdev is working. + */ + mutex_lock(&device_list_lock); + minor = find_first_zero_bit(minors, N_SPI_MINORS); + if (minor < N_SPI_MINORS) { + struct device *dev; + + gf_dev->devt = MKDEV(SPIDEV_MAJOR, minor); + dev = device_create(gf_class, &gf_dev->spi->dev, gf_dev->devt, + gf_dev, GF_DEV_NAME); + status = IS_ERR(dev) ? PTR_ERR(dev) : 0; + } else { + dev_dbg(&gf_dev->spi->dev, "no minor number available!\n"); + status = -ENODEV; + mutex_unlock(&device_list_lock); + goto error_hw; + } + + if (status == 0) { + set_bit(minor, minors); + list_add(&gf_dev->device_entry, &device_list); + } else { + gf_dev->devt = 0; + goto error_hw; + } + mutex_unlock(&device_list_lock); + + gf_dev->input = input_allocate_device(); + if (gf_dev->input == NULL) { + pr_err("%s, failed to allocate input device\n", __func__); + status = -ENOMEM; + goto error_dev; + } + for (i = 0; i < ARRAY_SIZE(maps); i++) + input_set_capability(gf_dev->input, maps[i].type, maps[i].code); + + gf_dev->input->name = GF_INPUT_NAME; + status = input_register_device(gf_dev->input); + if (status) { + pr_err("failed to register input device\n"); + goto error_input; + } + +#ifdef AP_CONTROL_CLK + pr_info("Get the clk resource.\n"); + /* Enable spi clock */ + if (gfspi_ioctl_clk_init(gf_dev)) + goto gfspi_probe_clk_init_failed; + + if (gfspi_ioctl_clk_enable(gf_dev)) + goto gfspi_probe_clk_enable_failed; + + spi_clock_set(gf_dev, 1000000); +#endif + + gf_dev->notifier = goodix_noti_block; + fb_register_client(&gf_dev->notifier); + + wake_lock_init(&fp_wakelock, WAKE_LOCK_SUSPEND, "fp_wakelock"); + + pr_info("version V%d.%d.%02d\n", VER_MAJOR, VER_MINOR, PATCH_LEVEL); + + return status; + +#ifdef AP_CONTROL_CLK +gfspi_probe_clk_enable_failed: + gfspi_ioctl_clk_uninit(gf_dev); +gfspi_probe_clk_init_failed: +#endif + +error_input: + if (gf_dev->input != NULL) + input_free_device(gf_dev->input); +error_dev: + if (gf_dev->devt != 0) { + pr_info("Err: status = %d\n", status); + mutex_lock(&device_list_lock); + list_del(&gf_dev->device_entry); + device_destroy(gf_class, gf_dev->devt); + clear_bit(MINOR(gf_dev->devt), minors); + mutex_unlock(&device_list_lock); + } +error_hw: + gf_dev->device_available = 0; + + return status; +} + +#if defined(USE_SPI_BUS) +static int gf_remove(struct spi_device *spi) +#elif defined(USE_PLATFORM_BUS) +static int gf_remove(struct platform_device *pdev) +#endif +{ + struct gf_dev *gf_dev = &gf; + + wake_lock_destroy(&fp_wakelock); + fb_unregister_client(&gf_dev->notifier); + if (gf_dev->input) + input_unregister_device(gf_dev->input); + input_free_device(gf_dev->input); + + /* prevent new opens */ + mutex_lock(&device_list_lock); + list_del(&gf_dev->device_entry); + device_destroy(gf_class, gf_dev->devt); + clear_bit(MINOR(gf_dev->devt), minors); + mutex_unlock(&device_list_lock); + + return 0; +} + +static const struct of_device_id gx_match_table[] = { + { .compatible = GF_SPIDEV_NAME }, + {}, +}; + +#if defined(USE_SPI_BUS) +static struct spi_driver gf_driver = { +#elif defined(USE_PLATFORM_BUS) +static struct platform_driver gf_driver = { +#endif + .driver = { + .name = GF_DEV_NAME, + .owner = THIS_MODULE, + .of_match_table = gx_match_table, + }, + .probe = gf_probe, + .remove = gf_remove, +}; + +static int __init gf_init(void) +{ + int status; + + /* Claim our 256 reserved device numbers. Then register a class + * that will key udev/mdev to add/remove /dev nodes. Last, register + * the driver which manages those device numbers. + */ + + BUILD_BUG_ON(N_SPI_MINORS > 256); + status = register_chrdev(SPIDEV_MAJOR, CHRD_DRIVER_NAME, &gf_fops); + if (status < 0) { + pr_warn("Failed to register char device!\n"); + return status; + } + SPIDEV_MAJOR = status; + gf_class = class_create(THIS_MODULE, CLASS_NAME); + if (IS_ERR(gf_class)) { + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); + pr_warn("Failed to create class.\n"); + return PTR_ERR(gf_class); + } +#if defined(USE_PLATFORM_BUS) + status = platform_driver_register(&gf_driver); +#elif defined(USE_SPI_BUS) + status = spi_register_driver(&gf_driver); +#endif + if (status < 0) { + class_destroy(gf_class); + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); + pr_warn("Failed to register SPI driver.\n"); + } + +#ifdef GF_NETLINK_ENABLE + netlink_init(); +#endif + pr_info("status = 0x%x\n", status); + return 0; +} +module_init(gf_init); + +static void __exit gf_exit(void) +{ +#ifdef GF_NETLINK_ENABLE + netlink_exit(); +#endif +#if defined(USE_PLATFORM_BUS) + platform_driver_unregister(&gf_driver); +#elif defined(USE_SPI_BUS) + spi_unregister_driver(&gf_driver); +#endif + class_destroy(gf_class); + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); +} +module_exit(gf_exit); + +MODULE_AUTHOR("Jiangtao Yi, "); +MODULE_AUTHOR("Jandy Gou, "); +MODULE_DESCRIPTION("goodix fingerprint sensor device driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/fingerprintrosy/goodixrosy/gf_spi.h b/drivers/fingerprintrosy/goodixrosy/gf_spi.h new file mode 100644 index 0000000000000..f0e8b2e77f26b --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/gf_spi.h @@ -0,0 +1,158 @@ +/* + * driver definition for sensor driver + * + * Coypright (c) 2017 Goodix + */ +#ifndef __GF_SPI_H +#define __GF_SPI_H + +#include +#include +/**********************************************************/ +enum FP_MODE{ + GF_IMAGE_MODE = 0, + GF_KEY_MODE, + GF_SLEEP_MODE, + GF_FF_MODE, + GF_DEBUG_MODE = 0x56 +}; + +#define SUPPORT_NAV_EVENT + +#if defined(SUPPORT_NAV_EVENT) +#define GF_NAV_INPUT_UP KEY_UP +#define GF_NAV_INPUT_DOWN KEY_DOWN +#define GF_NAV_INPUT_LEFT KEY_LEFT +#define GF_NAV_INPUT_RIGHT KEY_RIGHT +#define GF_NAV_INPUT_CLICK KEY_VOLUMEDOWN +#define GF_NAV_INPUT_DOUBLE_CLICK KEY_VOLUMEUP +#define GF_NAV_INPUT_LONG_PRESS KEY_SEARCH +#define GF_NAV_INPUT_HEAVY KEY_CHAT +#endif + +#define GF_KEY_INPUT_HOME KEY_HOME +#define GF_KEY_INPUT_MENU KEY_MENU +#define GF_KEY_INPUT_BACK KEY_BACK +#define GF_KEY_INPUT_POWER KEY_POWER +#define GF_KEY_INPUT_CAMERA KEY_CAMERA +#define GF_KEY_INPUT_SELECT KEY_SELECT + +#if defined(SUPPORT_NAV_EVENT) +typedef enum gf_nav_event { + GF_NAV_NONE = 0, + GF_NAV_FINGER_UP, + GF_NAV_FINGER_DOWN, + GF_NAV_UP, + GF_NAV_DOWN, + GF_NAV_LEFT, + GF_NAV_RIGHT, + GF_NAV_CLICK, + GF_NAV_HEAVY, + GF_NAV_LONG_PRESS, + GF_NAV_DOUBLE_CLICK, +} gf_nav_event_t; +#endif + +typedef enum gf_key_event { + GF_KEY_NONE = 0, + GF_KEY_HOME, + GF_KEY_POWER, + GF_KEY_MENU, + GF_KEY_BACK, + GF_KEY_CAMERA, +} gf_key_event_t; + +struct gf_key { + enum gf_key_event key; + uint32_t value; /* key down = 1, key up = 0 */ +}; + +struct gf_key_map { + unsigned int type; + unsigned int code; +}; + +struct gf_ioc_chip_info { + unsigned char vendor_id; + unsigned char mode; + unsigned char operation; + unsigned char reserved[5]; +}; + +#define GF_IOC_MAGIC 'g' +#define GF_IOC_INIT _IOR(GF_IOC_MAGIC, 0, uint8_t) +#define GF_IOC_EXIT _IO(GF_IOC_MAGIC, 1) +#define GF_IOC_RESET _IO(GF_IOC_MAGIC, 2) +#define GF_IOC_ENABLE_IRQ _IO(GF_IOC_MAGIC, 3) +#define GF_IOC_DISABLE_IRQ _IO(GF_IOC_MAGIC, 4) +#define GF_IOC_ENABLE_SPI_CLK _IOW(GF_IOC_MAGIC, 5, uint32_t) +#define GF_IOC_DISABLE_SPI_CLK _IO(GF_IOC_MAGIC, 6) +#define GF_IOC_ENABLE_POWER _IO(GF_IOC_MAGIC, 7) +#define GF_IOC_DISABLE_POWER _IO(GF_IOC_MAGIC, 8) +#define GF_IOC_INPUT_KEY_EVENT _IOW(GF_IOC_MAGIC, 9, struct gf_key) +#define GF_IOC_ENTER_SLEEP_MODE _IO(GF_IOC_MAGIC, 10) +#define GF_IOC_GET_FW_INFO _IOR(GF_IOC_MAGIC, 11, uint8_t) +#define GF_IOC_REMOVE _IO(GF_IOC_MAGIC, 12) +#define GF_IOC_CHIP_INFO _IOW(GF_IOC_MAGIC, 13, struct gf_ioc_chip_info) + +#if defined(SUPPORT_NAV_EVENT) +#define GF_IOC_NAV_EVENT _IOW(GF_IOC_MAGIC, 14, gf_nav_event_t) +#define GF_IOC_MAXNR 15 /* THIS MACRO IS NOT USED NOW... */ +#else +#define GF_IOC_MAXNR 14 /* THIS MACRO IS NOT USED NOW... */ +#endif + + +#define USE_PLATFORM_BUS 1 + + +#define GF_NETLINK_ENABLE 1 +#define GF_NET_EVENT_IRQ 1 +#define GF_NET_EVENT_FB_BLACK 2 +#define GF_NET_EVENT_FB_UNBLACK 3 +#define NETLINK_TEST 25 + +struct gf_dev { + dev_t devt; + struct list_head device_entry; +#if defined(USE_SPI_BUS) + struct spi_device *spi; +#elif defined(USE_PLATFORM_BUS) + struct platform_device *spi; +#endif + struct clk *core_clk; + struct clk *iface_clk; + + struct input_dev *input; + /* buffer is NULL unless this device is open (users > 0) */ + unsigned users; + signed irq_gpio; + signed reset_gpio; + signed pwr_gpio; + int irq; + int irq_enabled; + int clk_enabled; +#ifdef GF_FASYNC + struct fasync_struct *async; +#endif + struct notifier_block notifier; + char device_available; + char fb_black; + + char wait_finger_down; + struct work_struct work; +}; + +int gf_parse_dts(struct gf_dev *gf_dev); +void gf_cleanup(struct gf_dev *gf_dev); + +int gf_power_on(struct gf_dev *gf_dev); +int gf_power_off(struct gf_dev *gf_dev); + +int gf_hw_reset(struct gf_dev *gf_dev, unsigned int delay_ms); +int gf_irq_num(struct gf_dev *gf_dev); + +void sendnlmsg(char *msg); +int netlink_init(void); +void netlink_exit(void); +#endif /*__GF_SPI_H*/ diff --git a/drivers/fingerprintrosy/goodixrosy/netlink.c b/drivers/fingerprintrosy/goodixrosy/netlink.c new file mode 100644 index 0000000000000..6691186c240aa --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/netlink.c @@ -0,0 +1,97 @@ +/* + * netlink interface + * + * Copyright (c) 2017 Goodix + */ +#include +#include +#include +#include +#include +#include +#include +#include "gf_spi.h" + +#define NETLINK_TEST 25 +#define MAX_MSGSIZE 32 + +static int pid = -1; +static struct sock *nl_sk; + +void sendnlmsg(char *msg) +{ + struct sk_buff *skb_1; + struct nlmsghdr *nlh; + int len = NLMSG_SPACE(MAX_MSGSIZE); + int ret = 0; + + if (!msg || !nl_sk || !pid) + return; + + skb_1 = alloc_skb(len, GFP_KERNEL); + if (!skb_1) + return; + + nlh = nlmsg_put(skb_1, 0, 0, 0, MAX_MSGSIZE, 0); + + NETLINK_CB(skb_1).portid = 0; + NETLINK_CB(skb_1).dst_group = 0; + + memcpy(NLMSG_DATA(nlh), msg, sizeof(char)); + pr_debug("send message: %d\n", *(char *)NLMSG_DATA(nlh)); + + ret = netlink_unicast(nl_sk, skb_1, pid, MSG_DONTWAIT); + if (ret) + pr_err("failed to send msg error:0x%x\n", ret); +} + +static void nl_data_ready(struct sk_buff *__skb) +{ + struct sk_buff *skb; + struct nlmsghdr *nlh; + char str[100]; + + skb = skb_get(__skb); + if (skb->len >= NLMSG_SPACE(0)) { + nlh = nlmsg_hdr(skb); + + memcpy(str, NLMSG_DATA(nlh), sizeof(str)); + pid = nlh->nlmsg_pid; + + kfree_skb(skb); + } + +} + + +int netlink_init(void) +{ + struct netlink_kernel_cfg netlink_cfg; + + memset(&netlink_cfg, 0, sizeof(struct netlink_kernel_cfg)); + + netlink_cfg.groups = 0; + netlink_cfg.flags = 0; + netlink_cfg.input = nl_data_ready; + netlink_cfg.cb_mutex = NULL; + + nl_sk = netlink_kernel_create(&init_net, NETLINK_TEST, + &netlink_cfg); + + if (!nl_sk) { + pr_err("create netlink socket error\n"); + return 1; + } + + return 0; +} + +void netlink_exit(void) +{ + if (nl_sk != NULL) { + netlink_kernel_release(nl_sk); + nl_sk = NULL; + } + + pr_info("self module exited\n"); +} diff --git a/drivers/fingerprintrosy/goodixrosy/platform.c b/drivers/fingerprintrosy/goodixrosy/platform.c new file mode 100644 index 0000000000000..3792780375bf0 --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/platform.c @@ -0,0 +1,113 @@ +/* + * platform indepent driver interface + * + * Coypritht (c) 2017 Goodix + */ +#include +#include +#include +#include +#include +#include +#include + +#include "gf_spi.h" + +#if defined(USE_SPI_BUS) +#include +#include +#elif defined(USE_PLATFORM_BUS) +#include +#endif + +int gf_parse_dts(struct gf_dev *gf_dev) +{ + int rc = 0; + struct device *dev = &gf_dev->spi->dev; + struct device_node *np = dev->of_node; + gf_dev->reset_gpio = of_get_named_gpio(np, "fp-gpio-reset", 0); + if (gf_dev->reset_gpio < 0) { + pr_err("falied to get reset gpio!\n"); + return gf_dev->reset_gpio; + } + + rc = devm_gpio_request(dev, gf_dev->reset_gpio, "goodix_reset"); + if (rc) { + pr_err("failed to request reset gpio, rc = %d\n", rc); + goto err_reset; + } + gpio_direction_output(gf_dev->reset_gpio, 1); + + gf_dev->irq_gpio = of_get_named_gpio(np, "fp-gpio-irq", 0); + if (gf_dev->irq_gpio < 0) { + pr_err("falied to get irq gpio!\n"); + return gf_dev->irq_gpio; + } + + rc = devm_gpio_request(dev, gf_dev->irq_gpio, "goodix_irq"); + if (rc) { + pr_err("failed to request irq gpio, rc = %d\n", rc); + goto err_irq; + } + gpio_direction_input(gf_dev->irq_gpio); + +err_irq: + devm_gpio_free(dev, gf_dev->reset_gpio); +err_reset: + return rc; +} + +void gf_cleanup(struct gf_dev *gf_dev) +{ + pr_info("[info] %s\n", __func__); + + if (gpio_is_valid(gf_dev->irq_gpio)) { + gpio_free(gf_dev->irq_gpio); + pr_info("remove irq_gpio success\n"); + } + if (gpio_is_valid(gf_dev->reset_gpio)) { + gpio_free(gf_dev->reset_gpio); + pr_info("remove reset_gpio success\n"); + } +} + +int gf_power_on(struct gf_dev *gf_dev) +{ + int rc = 0; + + /* TODO: add your power control here */ + return rc; +} + +int gf_power_off(struct gf_dev *gf_dev) +{ + int rc = 0; + + /* TODO: add your power control here */ + + return rc; +} + +int gf_hw_reset(struct gf_dev *gf_dev, unsigned int delay_ms) +{ + if (gf_dev == NULL) { + pr_info("Input buff is NULL.\n"); + return -EPERM; + } + gpio_direction_output(gf_dev->reset_gpio, 1); + gpio_set_value(gf_dev->reset_gpio, 0); + mdelay(5); + gpio_set_value(gf_dev->reset_gpio, 1); + mdelay(delay_ms); + return 0; +} + +int gf_irq_num(struct gf_dev *gf_dev) +{ + if (gf_dev == NULL) { + pr_info("Input buff is NULL.\n"); + return -EPERM; + } else { + return gpio_to_irq(gf_dev->irq_gpio); + } +} diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index c81bda0ec2cf1..a8d6a0ef1b0cb 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -989,14 +989,6 @@ static int _gpiod_direction_output_raw(struct gpio_desc *desc, int value) struct gpio_chip *chip; int status = -EINVAL; - /* GPIOs used for IRQs shall not be set as output */ - if (test_bit(FLAG_USED_AS_IRQ, &desc->flags)) { - gpiod_err(desc, - "%s: tried to set a GPIO tied to an IRQ as output\n", - __func__); - return -EIO; - } - /* Open drain pin should not be driven to 1 */ if (value && test_bit(FLAG_OPEN_DRAIN, &desc->flags)) return gpiod_direction_input(desc); diff --git a/drivers/gpu/drm/nouveau/nouveau_usif.c b/drivers/gpu/drm/nouveau/nouveau_usif.c index cb1182d7e80ea..8d4fcc17b2b4e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_usif.c +++ b/drivers/gpu/drm/nouveau/nouveau_usif.c @@ -316,6 +316,12 @@ usif_ioctl(struct drm_file *filp, void __user *user, u32 argc) } else goto done; + object = (void *)(unsigned long)argv->v0.token; + if (!access_ok(VERIFY_READ, object, sizeof(struct usif_object))) { + ret = -EINVAL; + goto done; + } + mutex_lock(&cli->mutex); switch (argv->v0.type) { case NVIF_IOCTL_V0_NEW: @@ -340,7 +346,6 @@ usif_ioctl(struct drm_file *filp, void __user *user, u32 argc) break; } if (argv->v0.route == NVDRM_OBJECT_USIF) { - object = (void *)(unsigned long)argv->v0.token; argv->v0.route = object->route; argv->v0.token = object->token; if (ret == 0 && argv->v0.type == NVIF_IOCTL_V0_DEL) { diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c index 522c32743d3dd..370848ecd2835 100644 --- a/drivers/gpu/msm/adreno_dispatch.c +++ b/drivers/gpu/msm/adreno_dispatch.c @@ -1769,8 +1769,12 @@ static int dispatcher_do_fault(struct adreno_device *adreno_dev) /* Turn off all the timers */ del_timer_sync(&dispatcher->timer); del_timer_sync(&dispatcher->fault_timer); - del_timer_sync(&adreno_dev->preempt.timer); - + /* + * Deleting uninitialized timer will block for ever on kernel debug + * disable build. Hence skip del timer if it is not initialized. + */ + if (adreno_is_preemption_enabled(adreno_dev)) + del_timer_sync(&adreno_dev->preempt.timer); mutex_lock(&device->mutex); /* hang opcode */ diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index e022e0ef7c05d..dbc227a72522a 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -2163,7 +2163,7 @@ static long _gpuobj_map_useraddr(struct kgsl_device *device, struct kgsl_mem_entry *entry, struct kgsl_gpuobj_import *param) { - struct kgsl_gpuobj_import_useraddr useraddr; + struct kgsl_gpuobj_import_useraddr useraddr = {0}; int ret; param->flags &= KGSL_MEMFLAGS_GPUREADONLY diff --git a/drivers/hwmon/qpnp-adc-common.c b/drivers/hwmon/qpnp-adc-common.c index bacb9d857b9c4..5c3509311cdb7 100644 --- a/drivers/hwmon/qpnp-adc-common.c +++ b/drivers/hwmon/qpnp-adc-common.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -387,6 +388,118 @@ static const struct qpnp_vadc_map_pt adcmap_qrd_skut1_btm_threshold[] = { /* Voltage to temperature */ static const struct qpnp_vadc_map_pt adcmap_100k_104ef_104fb[] = { +#ifdef CONFIG_C3N_SMB358 + {1707, -30 }, + {1701, -29}, + {1694, -28}, + {1688, -27}, + {1681, -26}, + {1674, -25}, + {1666, -24}, + {1658, -23}, + {1650, -22}, + {1641, -21}, + {1632, -20}, + {1622, -19}, + {1612, -18}, + {1602, -17}, + {1591, -16}, + {1580, -15}, + {1569, -14}, + {1557, -13}, + {1544, -12}, + {1531, -11}, + {1518, -10}, + {1505, -9}, + {1491, -8}, + {1476, -7}, + {1461, -6}, + {1446, -5}, + {1431, -4}, + {1415, -3}, + {1399, -2}, + {1382, -1}, + {1365, 0}, + {1348, 1}, + {1330, 2 }, + {1313, 3 }, + {1295, 4 }, + {1277, 5 }, + {1258, 6 }, + {1240, 7 }, + {1221, 8 }, + {1202, 9 }, + {1183, 10}, + {1165, 11}, + {1146, 12}, + {1127, 13}, + {1108, 14}, + {1089, 15}, + {1070, 16}, + {1051, 17}, + {1032, 18}, + {1013, 19}, + {995, 20}, + {976, 21}, + {958, 22}, + {940, 23}, + {922, 24}, + {905, 25}, + {888, 26}, + {871, 27}, + {854, 28}, + {837, 29}, + {821, 30}, + {805, 31}, + {790, 32}, + {774, 33}, + {759, 34}, + {745, 35}, + {731, 36}, + {717, 37}, + {703, 38}, + {690, 39}, + {677, 40}, + {664, 41}, + {652, 42}, + {640, 43}, + {628, 44}, + {617, 45}, + {606, 46}, + {595, 47}, + {585, 48}, + {575, 49}, + {565, 50}, + {556, 51}, + {546, 52}, + {538, 53}, + {529, 54}, + {521, 55}, + {513, 56}, + {505, 57}, + {497, 58}, + {490, 59}, + {483, 60}, + {476, 61}, + {470, 62}, + {463, 63}, + {457, 64}, + {451, 65}, + {445, 66}, + {440, 67}, + {434, 68}, + {429, 69}, + {424, 70}, + {419, 71}, + {415, 72}, + {410, 73}, + {406, 74}, + {402, 75}, + {398, 76}, + {394, 77}, + {390, 78}, + {386, 79} +#else {1758, -40}, {1742, -35}, {1719, -30}, @@ -421,6 +534,7 @@ static const struct qpnp_vadc_map_pt adcmap_100k_104ef_104fb[] = { {59, 115}, {51, 120}, {44, 125} +#endif }; /* Voltage to temperature */ diff --git a/drivers/input/Makefile b/drivers/input/Makefile index ee4c06520bb43..650452afb9bc1 100644 --- a/drivers/input/Makefile +++ b/drivers/input/Makefile @@ -28,3 +28,4 @@ obj-$(CONFIG_INPUT_APMPOWER) += apm-power.o obj-$(CONFIG_INPUT_KEYRESET) += keyreset.o obj-$(CONFIG_INPUT_KEYCOMBO) += keycombo.o +obj-y += radio_freq_up.o diff --git a/drivers/input/misc/keychord.c b/drivers/input/misc/keychord.c index a5ea27ad0e16c..f580edf1c87ce 100644 --- a/drivers/input/misc/keychord.c +++ b/drivers/input/misc/keychord.c @@ -300,8 +300,10 @@ static ssize_t keychord_write(struct file *file, const char __user *buffer, ret = input_register_handler(&kdev->input_handler); if (ret) { - kfree(keychords); + spin_lock_irqsave(&kdev->lock, flags); + kfree(kdev->keychords); kdev->keychords = 0; + spin_unlock_irqrestore(&kdev->lock, flags); return ret; } kdev->registered = 1; diff --git a/drivers/input/radio_freq_up.c b/drivers/input/radio_freq_up.c new file mode 100644 index 0000000000000..3720f66036276 --- /dev/null +++ b/drivers/input/radio_freq_up.c @@ -0,0 +1,292 @@ +/** + * Copyright (C) 2017.9.1 Wingtech + * Copyright (C) 2018 XiaoMi, Inc. + * + * Songmuchun Create + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ +#define pr_fmt(fmt) "[radio_frequence]: " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Debug messages level + */ +static int debug; +module_param(debug, int, 0644); + +/* debug code */ +#define radio_fre_dbg(msg...) do { \ + if (debug > 0) { \ + pr_info(msg); \ + } \ +} while (0) + +/** + * struct radio_freq_platform_data - The radio_freq_platform_data structure + * @irq: irq number(virtual). + * @type: type of the event (EV_KEY, EV_REL, etc...). + * @code: event code. + * @det_gpio: gpio number. + * @debounce_interval: how many msecs to debounce from device tree. + * @timer_debounce: software time debounce when gpiolib doesn't provide debounce. + * @work: delayed work. + * @det_gpio_flags: gpio flags from device tree. + * @input_dev: input device that is registered. + */ +struct radio_freq_platform_data { + int irq; + unsigned int type; + unsigned int code[2]; + int det_gpio; + int debounce_interval; + int timer_debounce; + struct delayed_work work; + enum of_gpio_flags det_gpio_flags; + struct input_dev *input_dev; +}; + +static void radio_freq__work_func(struct work_struct *work) +{ + struct radio_freq_platform_data *pdata = + container_of(work, struct radio_freq_platform_data, work.work); + int value; + unsigned int code; + + value = gpio_get_value(pdata->det_gpio); + radio_fre_dbg("gpio input value = %d\n", value); + + code = value ? pdata->code[0] : pdata->code[1]; + input_event(pdata->input_dev, pdata->type, code, 1); + input_sync(pdata->input_dev); + input_event(pdata->input_dev, pdata->type, code, 0); + input_sync(pdata->input_dev); +} + +static irqreturn_t radio_freq_interrupt(int irq, void *dev_id) +{ + struct radio_freq_platform_data *pdata = dev_id; + + radio_fre_dbg("irq enter\n"); + BUG_ON(irq != pdata->irq); + + mod_delayed_work(system_wq, + &pdata->work, + msecs_to_jiffies(pdata->timer_debounce)); + radio_fre_dbg("irq exit\n"); + + return IRQ_HANDLED; +} + +static int radio_freq_input_dev_init(struct device *dev) +{ + int i; + struct radio_freq_platform_data *pdata = dev_get_drvdata(dev); + struct input_dev *input_dev = pdata->input_dev; + + /* Init and register input device */ + input_dev->name = dev->driver->name; + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = dev; + + input_set_drvdata(input_dev, pdata); + for (i = 0; i < sizeof(pdata->code) / sizeof(pdata->code[0]); i++) + input_set_capability(input_dev, pdata->type, pdata->code[i]); + + return input_register_device(input_dev); +} + +/** + * radio_freq_prase_dt - prase device tree. + * @dev: pointer to the device structure + * + * @return: 0 if success, otherwise negative number will be return. + */ +static int radio_freq_prase_dt(struct device *dev) +{ + struct device_node *dev_node = dev->of_node; + struct platform_device *pdev = to_platform_device(dev); + struct radio_freq_platform_data *pdata = dev_get_drvdata(dev); + + if (of_property_read_u32(dev_node, "debounce-interval", &pdata->debounce_interval)) + pdata->debounce_interval = 10; + + pdata->det_gpio = of_get_gpio_flags(dev_node, 0, &pdata->det_gpio_flags); + if (unlikely(!gpio_is_valid(pdata->det_gpio))) { + pr_err("failed to prase gpios property!\n"); + return -EPERM; + } + + if (of_property_read_u32_array(dev_node, "linux,code", pdata->code, + sizeof(pdata->code) / sizeof(pdata->code[0]))) { + pr_err("without keycode: 0x%x\n", pdata->det_gpio); + return -EPERM; + } + + if (of_property_read_u32(dev_node, "linux,input-type", &pdata->type)) + pdata->type = EV_KEY; + + pdata->irq = platform_get_irq(pdev, 0); + if (unlikely(pdata->irq < 0)) { + pr_err("failed to prase irq property!\n"); + return pdata->irq; + } + + return 0; +} + +static int radio_freq_suspend(struct device *dev) +{ + struct radio_freq_platform_data *pdata = dev_get_drvdata(dev); + + radio_fre_dbg("suspend\n"); + enable_irq_wake(pdata->irq); + + return 0; +} + +static int radio_freq_resume(struct device *dev) +{ + struct radio_freq_platform_data *pdata = dev_get_drvdata(dev); + + radio_fre_dbg("resume\n"); + disable_irq_wake(pdata->irq); + + return 0; +} + +/** + * radio_freq_quiesce - prase device tree. + * @data: pointer to the private data + * + * This function will cancel the delayed work which is registered.When the driver probe + * is failure or driver is removed, the driver model will invoke this function to free + * device resource. + */ +static void radio_freq_quiesce(void *data) +{ + struct radio_freq_platform_data *pdata = data; + + cancel_delayed_work(&pdata->work); +} + +static int radio_freq_probe(struct platform_device *pdev) +{ + int ret; + struct radio_freq_platform_data *pdata; + struct device *dev = &pdev->dev; + const char *devname = dev_name(dev); + + pr_info("radio frequence detection probe start\n"); + + if (likely(pdev->dev.of_node)) { + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + pr_err("failed to allocate memory!\n"); + return -ENOMEM; + } + platform_set_drvdata(pdev, pdata); + + ret = radio_freq_prase_dt(dev); + if (ret < 0) { + pr_err("failed to prase device tree!\n"); + return ret; + } + } else { + pr_err("device node is not exist!\n"); + return -EPERM; + } + + /** + * Allocate and register input device. + */ + pdata->input_dev = devm_input_allocate_device(dev); + if (!pdata->input_dev) { + pr_err("failed to allocate input device!\n"); + return -EPERM; + } + ret = radio_freq_input_dev_init(dev); + if (unlikely(ret)) { + pr_err("failed to register input device!\n"); + return ret; + } + + /** + * After prase dt, we can do some usingfull thing. + */ + ret = gpio_set_debounce(pdata->det_gpio, pdata->debounce_interval * 1000); + /* use timer if gpiolib doesn't provide debounce */ + if (ret < 0) + pdata->timer_debounce = pdata->debounce_interval; + + INIT_DELAYED_WORK(&pdata->work, radio_freq__work_func); + ret = devm_add_action(dev, radio_freq_quiesce, pdata); + if (unlikely(ret)) { + pr_err("failed to register quiesce action, error: %d\n", ret); + return ret; + } + + ret = devm_gpio_request_one(dev, pdata->det_gpio, + GPIOF_IN | GPIOF_EXPORT, "radio_frequence_det_gpio"); + if (unlikely(ret)) { + pr_err("failed to request gpio %d\n", pdata->det_gpio); + return ret; + } + + ret = devm_request_any_context_irq(dev, pdata->irq, radio_freq_interrupt, + irq_get_trigger_type(pdata->irq), + devname ?: dev->driver->name, pdata); + if (unlikely(ret)) { + pr_err("failed to request irq %d\n", pdata->irq); + return ret; + } + + device_init_wakeup(dev, true); + + pr_info("radio frequence detection probe end\n"); + + return 0; +} + +static int radio_freq_remove(struct platform_device *pdev) +{ + return 0; +} + +static const struct of_device_id radio_freq_of_match[] = { + {.compatible = "wingtech,radio_frequence_detection",}, + {/* sentinel */} +}; + +MODULE_DEVICE_TABLE(of, radio_freq_of_match); + +static SIMPLE_DEV_PM_OPS(radio_freq_pm_ops, radio_freq_suspend, radio_freq_resume); + +static struct platform_driver radio_freq_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "radio_frequence", + .pm = &radio_freq_pm_ops, + .of_match_table = of_match_ptr(radio_freq_of_match), + }, + .probe = radio_freq_probe, + .remove = radio_freq_remove, +}; + +module_platform_driver(radio_freq_driver); + +MODULE_DESCRIPTION("radio frequence gpio check driver"); +MODULE_AUTHOR("Songmuchun "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/FT5346/Kconfig b/drivers/input/touchscreen/FT5346/Kconfig new file mode 100644 index 0000000000000..9526203554275 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/Kconfig @@ -0,0 +1,5 @@ + +config TOUCHSCREEN_FT5346 + tristate "FOCALTECH FT5346 touchpanel driver" + depends on CONFIG_INPUT_TOUCHSCREEN + default n diff --git a/drivers/input/touchscreen/FT5346/Makefile b/drivers/input/touchscreen/FT5346/Makefile new file mode 100644 index 0000000000000..2bb007c0389ab --- /dev/null +++ b/drivers/input/touchscreen/FT5346/Makefile @@ -0,0 +1,3 @@ +#FT5336 touchpanel driver + +obj-y += ft5346.o focaltech_global/ focaltech_test/ diff --git a/drivers/input/touchscreen/FT5346/focaltech_global/Makefile b/drivers/input/touchscreen/FT5346/focaltech_global/Makefile new file mode 100644 index 0000000000000..fac3f7882f6ce --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_global/Makefile @@ -0,0 +1,6 @@ +#drivers/input/touchscreen/focaltech_touch +# +#Makefile for flash module +# + +obj-y += focaltech_ic_table.o diff --git a/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_global.h b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_global.h new file mode 100644 index 0000000000000..8508b406d9a54 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_global.h @@ -0,0 +1,19 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: Global.c +* +* Author: Software Development Team, AE +* +* Created: 2015-07-14 +* +* Abstract: global function for test +* +************************************************************************/ +#ifndef _FOCALTECH_GLOBAL_H +#define _FOCALTECH_GLOBAL_H + +#include "focaltech_ic_table.h" + +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.c b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.c new file mode 100644 index 0000000000000..3ebd10b198a6c --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.c @@ -0,0 +1,531 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2016, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/******************************************************************************* +* +* File Name: Focaltech_ic_table.c +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*******************************************************************************/ + +/******************************************************************************* +* 1.Included header files +*******************************************************************************/ + +#include +#include +#include "focaltech_ic_table.h" + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ +#define FOCALTECH_IC_TABLE_INFO "File Version of focaltech_ic_table.c: V1.0.0 2016-03-22" + +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ + +/******************************************************************************* +* Static variables +*******************************************************************************/ + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ + + +/******************************************************************************* +* functions body +*******************************************************************************/ + + + +unsigned int fts_ic_table_get_ic_code_from_ic_name(char *strIcName) +{ + + if (strncmp(strIcName, "FT5X36", 6) == 0) + return IC_FT5X36; + if (strncmp(strIcName, "FT5X36i", 7) == 0) + return IC_FT5X36i; + if (strncmp(strIcName, "FT3X16", 6) == 0) + return IC_FT3X16; + if (strncmp(strIcName, "FT3X26", 6) == 0) + return IC_FT3X26; + + if (strncmp(strIcName, "FT5X22", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46i", 7) == 0) + return IC_FT5X46i; + if (strncmp(strIcName, "FT5526", 6) == 0) + return IC_FT5526; + if (strncmp(strIcName, "FT3X17", 6) == 0) + return IC_FT3X17; + if (strncmp(strIcName, "FT5436", 6) == 0) + return IC_FT5436; + if (strncmp(strIcName, "FT3X27", 6) == 0) + return IC_FT3X27; + if (strncmp(strIcName, "FT5526i", 7) == 0) + return IC_FT5526I; + if (strncmp(strIcName, "FT5416", 6) == 0) + return IC_FT5416; + if (strncmp(strIcName, "FT5426", 6) == 0) + return IC_FT5426; + if (strncmp(strIcName, "FT5435", 6) == 0) + return IC_FT5435; + if (strncmp(strIcName, "FT7681", 6) == 0) + return IC_FT7681; + if (strncmp(strIcName, "FT7661", 6) == 0) + return IC_FT7661; + if (strncmp(strIcName, "FT7511", 6) == 0) + return IC_FT7511; + if (strncmp(strIcName, "FT7421", 6) == 0) + return IC_FT7421; + + + if (strncmp(strIcName, "FT6X06", 6) == 0) + return IC_FT6X06; + if (strncmp(strIcName, "FT3X06", 6) == 0) + return IC_FT3X06; + + if (strncmp(strIcName, "FT6X36", 6) == 0) + return IC_FT6X36; + if (strncmp(strIcName, "FT3X07", 6) == 0) + return IC_FT3X07; + if (strncmp(strIcName, "FT6416", 6) == 0) + return IC_FT6416; + if (strncmp(strIcName, "FT6336G/U", 9) == 0) + return IC_FT6426; + if (strncmp(strIcName, "FT6236U", 7) == 0) + return IC_FT6236U; + if (strncmp(strIcName, "FT6436U", 7) == 0) + return IC_FT6436U; + if (strncmp(strIcName, "FT3267", 6) == 0) + return IC_FT3267; + if (strncmp(strIcName, "FT3367", 6) == 0) + return IC_FT3367; + if (strncmp(strIcName, "FT7401", 6) == 0) + return IC_FT7401; + if (strncmp(strIcName, "FT3407U", 7) == 0) + return IC_FT3407U; + + + + if (strncmp(strIcName, "FT5X16", 6) == 0) + return IC_FT5X16; + if (strncmp(strIcName, "FT5X12", 6) == 0) + return IC_FT5X12; + + if (strncmp(strIcName, "FT5506", 6) == 0) + return IC_FT5506; + if (strncmp(strIcName, "FT5606", 6) == 0) + return IC_FT5606; + if (strncmp(strIcName, "FT5816", 6) == 0) + return IC_FT5816; + + if (strncmp(strIcName, "FT5822", 6) == 0) + return IC_FT5822; + if (strncmp(strIcName, "FT5626", 6) == 0) + return IC_FT5626; + if (strncmp(strIcName, "FT5726", 6) == 0) + return IC_FT5726; + if (strncmp(strIcName, "FT5826B", 7) == 0) + return IC_FT5826B; + if (strncmp(strIcName, "FT3617", 6) == 0) + return IC_FT3617; + if (strncmp(strIcName, "FT3717", 6) == 0) + return IC_FT3717; + if (strncmp(strIcName, "FT7811", 6) == 0) + return IC_FT7811; + if (strncmp(strIcName, "FT5826S", 7) == 0) + return IC_FT5826S; + + if (strncmp(strIcName, "FT5306", 6) == 0) + return IC_FT5306; + if (strncmp(strIcName, "FT5406", 6) == 0) + return IC_FT5406; + + if (strncmp(strIcName, "FT8606", 6) == 0) + return IC_FT8606; + if (strncmp(strIcName, "FT8716", 6) == 0) + return IC_FT8716; + + if (strncmp(strIcName, "FT3C47U", 7) == 0) + return IC_FT3C47U; + + if (strncmp(strIcName, "FT8607", 6) == 0) + return IC_FT8607; + if (strncmp(strIcName, "FT8707", 6) == 0) + return IC_FT8707; + + + if (strncmp(strIcName, "FT8736", 6) == 0) + return IC_FT8736; + + if (strncmp(strIcName, "FT3D47", 6) == 0) + return IC_FT3D47; + + if (strncmp(strIcName, "FTE716", 6) == 0) + return IC_FTE716; + + if (strncmp(strIcName, "FT5442", 6) == 0) + return IC_FT5442; + + if (strncmp(strIcName, "FT3428U", 7) == 0) + return IC_FT3428U; + + if (strncmp(strIcName, "FT8006", 6) == 0) + return IC_FT8006; + + if (strncmp(strIcName, "FTE736", 6) == 0) + return IC_FTE736; + + printk("%s. can NOT get ic code. ERROR !!! \n", __func__); + + return 0xff; +} + + +void fts_ic_table_get_ic_name_from_ic_code(unsigned int ucIcCode, char *strIcName) +{ + if (NULL == strIcName) + return; + + sprintf(strIcName, "%s", "NA");/*if can't find IC , set 'NA'*/ + + if (ucIcCode == IC_FT5X36) + sprintf(strIcName, "%s", "FT5X36"); + if (ucIcCode == IC_FT5X36i) + sprintf(strIcName, "%s", "FT5X36i"); + if (ucIcCode == IC_FT3X16) + sprintf(strIcName, "%s", "FT3X16"); + if (ucIcCode == IC_FT3X26) + sprintf(strIcName, "%s", "FT3X26"); + + + if (ucIcCode == IC_FT5X46) + sprintf(strIcName, "%s", "FT5X46"); + if (ucIcCode == IC_FT5X46i) + sprintf(strIcName, "%s", "FT5X46i"); + if (ucIcCode == IC_FT5526) + sprintf(strIcName, "%s", "FT5526"); + if (ucIcCode == IC_FT3X17) + sprintf(strIcName, "%s", "FT3X17"); + if (ucIcCode == IC_FT5436) + sprintf(strIcName, "%s", "FT5436"); + if (ucIcCode == IC_FT3X27) + sprintf(strIcName, "%s", "FT3X27"); + if (ucIcCode == IC_FT5526I) + sprintf(strIcName, "%s", "FT5526i"); + if (ucIcCode == IC_FT5416) + sprintf(strIcName, "%s", "FT5416"); + if (ucIcCode == IC_FT5426) + sprintf(strIcName, "%s", "FT5426"); + if (ucIcCode == IC_FT5435) + sprintf(strIcName, "%s", "FT5435"); + if (ucIcCode == IC_FT7681) + sprintf(strIcName, "%s", "FT7681"); + if (ucIcCode == IC_FT7661) + sprintf(strIcName, "%s", "FT7661"); + if (ucIcCode == IC_FT7511) + sprintf(strIcName, "%s", "FT7511"); + if (ucIcCode == IC_FT7421) + sprintf(strIcName, "%s", "FT7421"); + + if (ucIcCode == IC_FT6X06) + sprintf(strIcName, "%s", "FT6X06"); + if (ucIcCode == IC_FT3X06) + sprintf(strIcName, "%s", "FT3X06"); + + if (ucIcCode == IC_FT6X36) + sprintf(strIcName, "%s", "FT6X36"); + if (ucIcCode == IC_FT3X07) + sprintf(strIcName, "%s", "FT3X07"); + if (ucIcCode == IC_FT6416) + sprintf(strIcName, "%s", "FT6416"); + if (ucIcCode == IC_FT6426) + sprintf(strIcName, "%s", "FT6336G/U"); + if (ucIcCode == IC_FT6236U) + sprintf(strIcName, "%s", "FT6236U"); + if (ucIcCode == IC_FT6436U) + sprintf(strIcName, "%s", "FT6436U"); + if (ucIcCode == IC_FT3267) + sprintf(strIcName, "%s", "FT3267"); + if (ucIcCode == IC_FT3367) + sprintf(strIcName, "%s", "FT3367"); + if (ucIcCode == IC_FT7401) + sprintf(strIcName, "%s", "FT7401"); + if (ucIcCode == IC_FT3407U) + sprintf(strIcName, "%s", "FT3407U"); + + if (ucIcCode == IC_FT5X16) + sprintf(strIcName, "%s", "FT5X16"); + if (ucIcCode == IC_FT5X12) + sprintf(strIcName, "%s", "FT5X12"); + + if (ucIcCode == IC_FT5506) + sprintf(strIcName, "%s", "FT5506"); + if (ucIcCode == IC_FT5606) + sprintf(strIcName, "%s", "FT5606"); + if (ucIcCode == IC_FT5816) + sprintf(strIcName, "%s", "FT5816"); + + if (ucIcCode == IC_FT5822) + sprintf(strIcName, "%s", "FT5822"); + if (ucIcCode == IC_FT5626) + sprintf(strIcName, "%s", "FT5626"); + if (ucIcCode == IC_FT5726) + sprintf(strIcName, "%s", "FT5726"); + if (ucIcCode == IC_FT5826B) + sprintf(strIcName, "%s", "FT5826B"); + if (ucIcCode == IC_FT3617) + sprintf(strIcName, "%s", "FT3617"); + if (ucIcCode == IC_FT3717) + sprintf(strIcName, "%s", "FT3717"); + if (ucIcCode == IC_FT7811) + sprintf(strIcName, "%s", "FT7811"); + if (ucIcCode == IC_FT5826S) + sprintf(strIcName, "%s", "FT5826S"); + + if (ucIcCode == IC_FT5306) + sprintf(strIcName, "%s", "FT5306"); + if (ucIcCode == IC_FT5406) + sprintf(strIcName, "%s", "FT5406"); + + if (ucIcCode == IC_FT8606) + sprintf(strIcName, "%s", "FT8606"); + if (ucIcCode == IC_FT8716) + sprintf(strIcName, "%s", "FT8716"); + + if (ucIcCode == IC_FT3C47U) + sprintf(strIcName, "%s", "FT3C47U"); + + if (ucIcCode == IC_FT8607) + sprintf(strIcName, "%s", "FT8607"); + if (ucIcCode == IC_FT8707) + sprintf(strIcName, "%s", "FT8707"); + if (ucIcCode == IC_FT8736) + sprintf(strIcName, "%s", "FT8736"); + + if (ucIcCode == IC_FT3D47) + sprintf(strIcName, "%s", "FT3D47"); + + if (ucIcCode == IC_FTE716) + sprintf(strIcName, "%s", "FTE716"); + + if (ucIcCode == IC_FT5442) + sprintf(strIcName, "%s", "FT5442"); + + if (ucIcCode == IC_FT3428U) + sprintf(strIcName, "%s", "FT3428U"); + + if (ucIcCode == IC_FT8006) + sprintf(strIcName, "%s", "FT8006"); + + if (ucIcCode == IC_FTE736) + sprintf(strIcName, "%s", "FTE736"); + + return ; +} + + +unsigned int fts_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2) +{ + unsigned int ic_code = 0; + switch (chip_id) { + case 0x55: + ic_code = IC_FT5306; + break; + case 0x08: + ic_code = IC_FT5606; + break; + case 0x0a: + ic_code = IC_FT5X16; + break; + case 0x06: + ic_code = IC_FT6X06; + break; + case 0x36: + ic_code = IC_FT6X36; + break; + case 0x14: + ic_code = IC_FT5X36; + break; + case 0x13: + ic_code = IC_FT3X16; + break; + case 0x12: + ic_code = IC_FT5X36i; + break; + case 0x11: + ic_code = IC_FT5X36i; + break; + case 0x54: + ic_code = IC_FT5X46; + break; + case 0x58: + ic_code = IC_FT5822; + break; + + + case 0x86: + if (0x06 == chip_id2) + ic_code = IC_FT8606; + else if (0x07 == chip_id2) + ic_code = IC_FT8607; + break; + case 0x87: + if (0x07 == chip_id2) + ic_code = IC_FT8707; + else if (0x16 == chip_id2) + ic_code = IC_FT8716; + else if (0x36 == chip_id2) + ic_code = IC_FT8736; + break; + case 0xE7: + if (0x16 == chip_id2) + ic_code = IC_FTE716; + else if (0x36 == chip_id2) + ic_code = IC_FTE736; + break; + + default: + ic_code = 0; + break; + + } + return ic_code; +} + + +unsigned int fts_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2) +{ + unsigned char uc_chip_id = 0; + unsigned char uc_chip_id2 = 0; + switch (ic_code>>4) { + case (IC_FT5306>>4): + uc_chip_id = 0x55; + break; + case (IC_FT5606>>4): + uc_chip_id = 0x08; + break; + case (IC_FT5X16>>4): + uc_chip_id = 0x0a; + break; + case (IC_FT6X06>>4): + uc_chip_id = 0x06; + break; + case (IC_FT6X36>>4): + uc_chip_id = 0x36; + break; + case (IC_FT5X36>>4): + switch (ic_code) { + case (IC_FT5X36): + uc_chip_id = 0x14; + break; + case (IC_FT3X26): + uc_chip_id = 0x13; + break; + case (IC_FT3X16): + uc_chip_id = 0x12; + break; + case (IC_FT5X36i): + uc_chip_id = 0x11; + break; + } + break; + case (IC_FT5X46>>4): + uc_chip_id = 0x54; + break; + case (IC_FT5822>>4): + uc_chip_id = 0x58; + break; + + + case (IC_FT8606>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x06; + break; + case (IC_FT8607>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x07; + break; + case (IC_FT8707>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x07; + break; + case (IC_FT8716>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x16; + break; + case (IC_FT8736>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x36; + break; + case (IC_FTE716>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x16; + break; + case (IC_FTE736>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x36; + break; + + default: + uc_chip_id = 0; + break; + + } + + *chip_id = uc_chip_id; + *chip_id2 = uc_chip_id2; + + return 0; +} +int fts_ic_table_need_chip_id2(unsigned int chip_id) +{ + int b_need_id2 = -1; + switch (chip_id) { + case 0x86: + case 0x87: + case 0xE7: + b_need_id2 = 0; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + default: + b_need_id2 = -1; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + + } + return b_need_id2; +} diff --git a/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.h b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.h new file mode 100644 index 0000000000000..b4cd1fb1dafac --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.h @@ -0,0 +1,114 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2016, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __FOCALTECH_IC_TABLE_H__ +#define __FOCALTECH_IC_TABLE_H__ +/******************************************************************************* +* +* File Name: focaltech_ic_table.h +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*******************************************************************************/ + +/******************************************************************************* +* 1.Included header files +*******************************************************************************/ + +/*----------------------------------------------------------- +IC corresponding code, each of the IC code is 8 bit, high 4 bit on behalf of the same series, low 4 bit on behalf of the specific IC +-----------------------------------------------------------*/ +enum IC_Type { + IC_FT5X36 = 0x10, + IC_FT5X36i = 0x11, + IC_FT3X16 = 0x12, + IC_FT3X26 = 0x13, + + IC_FT5X46 = 0x21, + IC_FT5X46i = 0x22, + IC_FT5526 = 0x23, + IC_FT3X17 = 0x24, + IC_FT5436 = 0x25, + IC_FT3X27 = 0x26, + IC_FT5526I = 0x27, + IC_FT5416 = 0x28, + IC_FT5426 = 0x29, + IC_FT5435 = 0x2A, + IC_FT7681 = 0x2B, + IC_FT7661 = 0x2C, + IC_FT7511 = 0x2D, + IC_FT7421 = 0x2E, + IC_FT6X06 = 0x30, + IC_FT3X06 = 0x31, + IC_FT6X36 = 0x40, + IC_FT3X07 = 0x41, + IC_FT6416 = 0x42, + IC_FT6426 = 0x43, + IC_FT7401 = 0x44, + IC_FT3407U = 0x45, + IC_FT6236U = 0x46, + IC_FT6436U = 0x47, + IC_FT3267 = 0x48, + IC_FT3367 = 0x49, + IC_FT5X16 = 0x50, + IC_FT5X12 = 0x51, + IC_FT5506 = 0x60, + IC_FT5606 = 0x61, + IC_FT5816 = 0x62, + IC_FT5822 = 0x70, + IC_FT5626 = 0x71, + IC_FT5726 = 0x72, + IC_FT5826B = 0x73, + IC_FT3617 = 0x74, + IC_FT3717 = 0x75, + IC_FT7811 = 0x76, + IC_FT5826S = 0x77, + IC_FT5306 = 0x80, + IC_FT5406 = 0x81, + IC_FT8606 = 0x90, + IC_FT8716 = 0xA0, + IC_FT3C47U = 0xB0, + IC_FT8607 = 0xC0, + IC_FT8707 = 0xD0, + IC_FT8736 = 0xE0, + IC_FT3D47 = 0xF0, + IC_FTE716 = 0x100, + IC_FT5442 = 0x110, + IC_FT3428U = 0x120, + IC_FT8006 = 0x130, + IC_FTE736 = 0x140 +}; + + + +extern unsigned int fts_ic_table_get_ic_code_from_ic_name(char *strIcName); +extern void fts_ic_table_get_ic_name_from_ic_code(unsigned int ic_code, char *strIcName); + +extern unsigned int fts_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2); +extern unsigned int fts_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2); +extern int fts_ic_table_need_chip_id2(unsigned int chip_id); + +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/Makefile b/drivers/input/touchscreen/FT5346/focaltech_test/Makefile new file mode 100644 index 0000000000000..94567c601458c --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/Makefile @@ -0,0 +1,9 @@ +#drivers/input/touchscreen/mediatek/focaltech_ts/focaltech_test +# +#Makefile for test module +# + +obj-y += src/ supported_ic/ + + + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/focaltech_test_config.h b/drivers/input/touchscreen/FT5346/focaltech_test/focaltech_test_config.h new file mode 100644 index 0000000000000..28223ff5b611e --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/focaltech_test_config.h @@ -0,0 +1,35 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_config.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +***************************************************************ene*********/ +#ifndef _GLOBAL_H +#define _GLOBAL_H + + +/*----------------------------------------------------------- +IC Type Test +-----------------------------------------------------------*/ + +#define FT3C47_TEST 0 +#define FT5822_TEST 0 +#define FT5X46_TEST 1 +#define FT6X36_TEST 0 +#define FT8606_TEST 0 +#define FT8607_TEST 0 +#define FT8716_TEST 0 +#define FT8736_TEST 0 +#define FTE716_TEST 0 +#define FTE736_TEST 0 +#define FT8006_TEST 0 + + +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_detail_threshold.h b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_detail_threshold.h new file mode 100644 index 0000000000000..295a7d5101947 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_detail_threshold.h @@ -0,0 +1,142 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ + +#ifndef _DETAIL_THRESHOLD_H +#define _DETAIL_THRESHOLD_H + +#define TX_NUM_MAX 60 +#define RX_NUM_MAX 60 +#define NUM_MAX (TX_NUM_MAX)*(RX_NUM_MAX) +#define MAX_PATH 256 + +#define BUFFER_LENGTH 512 +#define MAX_TEST_ITEM 20 +#define MAX_GRAPH_ITEM 20 +#define MAX_CHANNEL_NUM 144 + +#define FORCETOUCH_ROW 1 + +struct stCfg_Incell_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + + int (*CBTest_Min)[RX_NUM_MAX]; + int (*CBTest_Max)[RX_NUM_MAX]; + + int (*CBUniformityTest_CHX_Linearity)[RX_NUM_MAX]; + int (*CBUniformityTest_CHY_Linearity)[RX_NUM_MAX]; + + int (*RawDataUniformityTest_CHX_Linearity)[RX_NUM_MAX]; + int (*RawDataUniformityTest_CHY_Linearity)[RX_NUM_MAX]; + int (*RawDataUniformityTest_CB_Data)[RX_NUM_MAX]; + +}; + +struct stCfg_MCap_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + unsigned char (*InvalidNode_SC)[RX_NUM_MAX]; + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + int (*RawDataTest_Low_Min)[RX_NUM_MAX]; + int (*RawDataTest_Low_Max)[RX_NUM_MAX]; + int (*RawDataTest_High_Min)[RX_NUM_MAX]; + int (*RawDataTest_High_Max)[RX_NUM_MAX]; + int (*RxLinearityTest_Max)[RX_NUM_MAX]; + int (*TxLinearityTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Min)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Max)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Min)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Max)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Min)[RX_NUM_MAX]; + int (*NoistTest_Coefficient)[RX_NUM_MAX]; + + int (*SITORawdata_RxLinearityTest_Base)[RX_NUM_MAX]; + int (*SITORawdata_TxLinearityTest_Base)[RX_NUM_MAX]; + + int ForceTouch_SCapRawDataTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; +}; + +struct stCfg_SCap_DetailThreshold { + int TempData[MAX_CHANNEL_NUM]; + int RawDataTest_Max[MAX_CHANNEL_NUM]; + int RawDataTest_Min[MAX_CHANNEL_NUM]; + int CiTest_Max[MAX_CHANNEL_NUM]; + int CiTest_Min[MAX_CHANNEL_NUM]; + int DeltaCiTest_Base[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase1[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase2[MAX_CHANNEL_NUM]; + int CiDeviationTest_Base[MAX_CHANNEL_NUM]; + + int NoiseTest_Max[MAX_CHANNEL_NUM]; + int DeltaCxTest_Sort[MAX_CHANNEL_NUM]; + int DeltaCxTest_Area[MAX_CHANNEL_NUM]; + + int CbTest_Max[MAX_CHANNEL_NUM]; + int CbTest_Min[MAX_CHANNEL_NUM]; + int DeltaCbTest_Base[MAX_CHANNEL_NUM]; + int DifferTest_Base[MAX_CHANNEL_NUM]; + int CBDeviationTest_Base[MAX_CHANNEL_NUM]; + int K1DifferTest_Base[MAX_CHANNEL_NUM]; +}; + +void OnInit_MCap_DetailThreshold(char *strIniFile); +void OnInit_SCap_DetailThreshold(char *strIniFile); +void OnInit_Incell_DetailThreshold(char *strIniFile); + +void set_max_channel_num(void); + +void OnInit_InvalidNode(char *strIniFile); +void OnInit_DThreshold_RawDataTest(char *strIniFile); +void OnInit_DThreshold_SCapRawDataTest(char *strIniFile); +void OnInit_DThreshold_SCapCbTest(char *strIniFile); + +void OnInit_DThreshold_SITORawdata_RxLinearityTest(char *strIniFile); +void OnInit_DThreshold_SITORawdata_TxLinearityTest(char *strIniFile); + +void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile); +void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile); + + +void OnInit_DThreshold_RxLinearityTest(char *strIniFile); +void OnInit_DThreshold_TxLinearityTest(char *strIniFile); + +void OnInit_DThreshold_PanelDifferTest(char *strIniFile); +void OnInit_DThreshold_NoiseTest(char *strIniFile); + +void OnInit_DThreshold_CBTest(char *strIniFile); +void OnInit_DThreshold_AllButtonCBTest(char *strIniFile); +void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile); +void OnInit_DThreshold_RawDataUniformityTest(char *strIniFile); + +void OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue); + +int malloc_struct_DetailThreshold(void); +void free_struct_DetailThreshold(void); +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_ini.h b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_ini.h new file mode 100644 index 0000000000000..7828c96507bea --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_ini.h @@ -0,0 +1,66 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#ifndef INI_H +#define INI_H + +#define MAX_KEY_NUM 300 +#define MAX_KEY_NAME_LEN 50 +#define MAX_KEY_VALUE_LEN 360 + +#define MAX_CFG_BUF 480 +#define SUCCESS 0 +/* return value */ +#define CFG_OK SUCCESS +#define CFG_SECTION_NOT_FOUND -1 +#define CFG_KEY_NOT_FOUND -2 +#define CFG_ERR -10 + +#define CFG_ERR_OPEN_FILE -10 +#define CFG_ERR_CREATE_FILE -11 +#define CFG_ERR_READ_FILE -12 +#define CFG_ERR_WRITE_FILE -13 +#define CFG_ERR_FILE_FORMAT -14 +#define CFG_ERR_TOO_MANY_KEY_NUM -15 +#define CFG_ERR_OUT_OF_LEN -16 + +#define CFG_ERR_EXCEED_BUF_SIZE -22 + +#define COPYF_OK SUCCESS +#define COPYF_ERR_OPEN_FILE -10 +#define COPYF_ERR_CREATE_FILE -11 +#define COPYF_ERR_READ_FILE -12 +#define COPYF_ERR_WRITE_FILE -13 + +typedef struct _ST_INI_FILE_DATA { + char pSectionName[MAX_KEY_NAME_LEN]; + char pKeyName[MAX_KEY_NAME_LEN]; + char pKeyValue[MAX_KEY_VALUE_LEN]; + int iSectionNameLen; + int iKeyNameLen; + int iKeyValueLen; +} ST_INI_FILE_DATA; + + + +int ini_get_key(char *filedata, char *section, char *key, char *value); + + +int fts_atoi(char *nptr); +char *ini_str_trim_r(char *buf); +char *ini_str_trim_l(char *buf); + +int init_key_data(void); +int ini_get_key_data(char *filedata); +int release_key_data(void); +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_main.h b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_main.h new file mode 100644 index 0000000000000..022f4a81a5cd7 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_main.h @@ -0,0 +1,239 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#ifndef _TEST_LIB_H +#define _TEST_LIB_H + +#include "focaltech_test_detail_threshold.h" +#include "../focaltech_test_config.h" + +#define boolean unsigned char +#define bool unsigned char +#define BYTE unsigned char +#define false 0 +#define true 1 +#define pre 1 + + +enum NodeType { + NODE_INVALID_TYPE = 0, + NODE_VALID_TYPE = 1, + NODE_KEY_TYPE = 2, + NODE_AST_TYPE = 3, +}; + + +typedef int (*FTS_I2C_READ_FUNCTION)(unsigned char *, int , unsigned char *, int); +typedef int (*FTS_I2C_WRITE_FUNCTION)(unsigned char *, int); + +extern FTS_I2C_READ_FUNCTION fts_i2c_read_test; +extern FTS_I2C_WRITE_FUNCTION fts_i2c_write_test; + +extern int init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read); +extern int init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write); + +int set_param_data(char *TestParamData); +boolean start_test_tp(void); +int get_test_data(char *pTestData); + +int focaltech_test_main_init(void); +int focaltech_test_main_exit(void); + +#define MIN_HOLE_LEVEL (-1) +#define MAX_HOLE_LEVEL 0x7F +/*----------------------------------------------------------- +Error Code for Comm +-----------------------------------------------------------*/ +#define ERROR_CODE_OK 0x00 +#define ERROR_CODE_CHECKSUM_ERROR 0x01 +#define ERROR_CODE_INVALID_COMMAND 0x02 +#define ERROR_CODE_INVALID_PARAM 0x03 +#define ERROR_CODE_IIC_WRITE_ERROR 0x04 +#define ERROR_CODE_IIC_READ_ERROR 0x05 +#define ERROR_CODE_WRITE_USB_ERROR 0x06 +#define ERROR_CODE_WAIT_RESPONSE_TIMEOUT 0x07 +#define ERROR_CODE_PACKET_RE_ERROR 0x08 +#define ERROR_CODE_NO_DEVICE 0x09 +#define ERROR_CODE_WAIT_WRITE_TIMEOUT 0x0a +#define ERROR_CODE_READ_USB_ERROR 0x0b +#define ERROR_CODE_COMM_ERROR 0x0c +#define ERROR_CODE_ALLOCATE_BUFFER_ERROR 0x0d +#define ERROR_CODE_DEVICE_OPENED 0x0e +#define ERROR_CODE_DEVICE_CLOSED 0x0f + +/*----------------------------------------------------------- +Test Status +-----------------------------------------------------------*/ +#define RESULT_NULL 0 +#define RESULT_PASS 1 +#define RESULT_NG 2 +#define RESULT_TESTING 3 +#define RESULT_TBD 4 +#define RESULT_REPLACE 5 +#define RESULT_CONNECTING 6 + +/*----------------------------------------------------------- + +read write max bytes per time +-----------------------------------------------------------*/ + +#define BYTES_PER_TIME 128 + +extern void fts_test_funcs(void); +struct StTestFuncs { + void (*OnInit_TestItem)(char *); + void (*OnInit_BasicThreshold)(char *) ; + void (*SetTestItem)(void) ; + boolean (*Start_Test)(void); + int (*Get_test_data)(char *); +}; +extern struct StTestFuncs g_stTestFuncs; + +struct structCompareChannel { + unsigned char bCh1; + unsigned char bCh2; + int fResistanceValue; + int iAdcValue; +}; + +struct StruScreenSeting { + int iSelectedIC; + int iTxNum; + int iRxNum; + int isNormalize; + int iUsedMaxTxNum; + int iUsedMaxRxNum; + + unsigned char iChannelsNum; + unsigned char iKeyNum; +}; +extern struct StruScreenSeting g_ScreenSetParam; +struct stTestItem { + unsigned char ItemType; + unsigned char TestNum; + unsigned char TestResult; + unsigned char ItemCode; +}; +extern struct stTestItem g_stTestItem[1][MAX_TEST_ITEM]; + +struct structSCapConfEx { + unsigned char ChannelXNum; + unsigned char ChannelYNum; + unsigned char KeyNum; + unsigned char KeyNumTotal; + bool bLeftKey1; + bool bLeftKey2; + bool bLeftKey3; + bool bRightKey1; + bool bRightKey2; + bool bRightKey3; +}; +extern struct structSCapConfEx g_stSCapConfEx; + +enum NORMALIZE_Type { + Overall_Normalize = 0, + Auto_Normalize = 1, +}; + +enum PROOF_TYPE { + Proof_Normal, + Proof_Level0, + Proof_NoWaterProof, +}; + +/*----------------------------------------------------------- +IC Capacitance Type 0:Self Capacitance, 1:Mutual Capacitance, 2:IDC +-----------------------------------------------------------*/ +enum enum_Report_Protocol_Type { + Self_Capacitance = 0, + Mutual_Capacitance = 1, + IDC_Capacitance = 2, +}; + +#if (FT6X36_TEST) +#define IC_Capacitance_Type 0 +#elif((FT3C47_TEST) || (FT5822_TEST) || (FT5X46_TEST)) +#define IC_Capacitance_Type 1 +#elif ((FT8606_TEST) || (FT8607_TEST) || (FT8716_TEST) || (FT8736_TEST) || (FTE716_TEST) || (FTE736_TEST) || (FT8006_TEST)) +#define IC_Capacitance_Type 2 +#endif + + +extern struct stCfg_MCap_DetailThreshold g_stCfg_MCap_DetailThreshold; +extern struct stCfg_SCap_DetailThreshold g_stCfg_SCap_DetailThreshold; +extern struct stCfg_Incell_DetailThreshold g_stCfg_Incell_DetailThreshold; + + +extern int g_TestItemNum;/*test item num*/ +extern char g_strIcName[20];/*IC Name*/ +extern char *g_pStoreAllData; + +int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile); +void focal_msleep(int ms); +void SysDelay(int ms); +int focal_abs(int value); +unsigned int SqrtNew(unsigned int n) ; + + +void OnInit_InterfaceCfg(char *strIniFile); + +int ReadReg(unsigned char RegAddr, unsigned char *RegData); +int WriteReg(unsigned char RegAddr, unsigned char RegData); +unsigned char Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead); + +unsigned char EnterWork(void); +unsigned char EnterFactory(void); + +void fts_SetTestItemCodeName(unsigned char ucitemcode); + +extern void *fts_malloc(size_t size); +extern void fts_free(void *p); + +extern int InitTest(void); +extern void FinishTest(void); +extern void InitStoreParamOfTestData(void); +extern void MergeAllTestData(void); +extern int AllocateMemory(void); +extern void FreeMemory(void); + +extern char *g_pTmpBuff; +extern char *g_pStoreMsgArea; +extern int g_lenStoreMsgArea; +extern char *g_pMsgAreaLine2; +extern int g_lenMsgAreaLine2; +extern char *g_pStoreDataArea; +extern int g_lenStoreDataArea; +extern unsigned char m_ucTestItemCode; +extern int m_iStartLine; +extern int m_iTestDataCount; + +extern char *TestResult ; +extern int TestResultLen; + +#define FOCAL_TEST_DEBUG_EN 0 +#if (FOCAL_TEST_DEBUG_EN) +#define FTS_TEST_DBG(fmt, args...) do {printk(KERN_ERR "[FTS] [TEST]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_FUNC_ENTER() printk(KERN_ERR "[FTS][TEST]%s: Enter(%d)\n", __func__, __LINE__) +#define FTS_TEST_FUNC_EXIT() printk(KERN_ERR "[FTS][TEST]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_TEST_DBG(fmt, args...) do {} while (0) +#define FTS_TEST_FUNC_ENTER() +#define FTS_TEST_FUNC_EXIT() +#endif + +#define FTS_TEST_INFO(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Info]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_ERROR(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Error]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) + + + +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_supported_ic.h b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_supported_ic.h new file mode 100644 index 0000000000000..8743d011f0c23 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_supported_ic.h @@ -0,0 +1,1543 @@ +/************************************************************************ +* Copyright (C) 2012-2016, Focaltech Systems (R) All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ + +#include +#include + +#include "../focaltech_test_config.h" +#include "focaltech_test_main.h" + +#if (FT8716_TEST) + +struct stCfg_FT8716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool GPIO_TEST; + bool RESETDETECTION_TEST; + bool ERASE_TEST; + bool RAWDATA_UNIFORMITY_TEST; + bool VIRTUAL_DIFFER_TEST; + +}; +struct stCfg_FT8716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + bool bCBTest_VKey_DCheck_Check; + int CbTest_Min_DCheck_Vkey; + int CbTest_Max_DCheck_Vkey; + + bool bLcdBusyAdjust; + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + int LCDNoiseTest_SequenceFrame; + int LCDNoiseTest_MaxFrame; + + bool RawDataUniformityTest_Check_FIXCB; + bool RawDataUniformityTest_Check_CHX; + bool RawDataUniformityTest_Check_CHY; + int RawDataUniformityTest_CHX_Hole; + int RawDataUniformityTest_CHY_Hole; + +}; +enum enumTestItem_FT8716 { + Code_FT8716_ENTER_FACTORY_MODE, + Code_FT8716_DOWNLOAD, + Code_FT8716_UPGRADE, + Code_FT8716_FACTORY_ID_TEST, + Code_FT8716_PROJECT_CODE_TEST, + Code_FT8716_FW_VERSION_TEST, + Code_FT8716_IC_VERSION_TEST, + Code_FT8716_RAWDATA_TEST, + Code_FT8716_CHANNEL_NUM_TEST, + + Code_FT8716_INT_PIN_TEST, + Code_FT8716_RESET_PIN_TEST, + Code_FT8716_NOISE_TEST, + Code_FT8716_CB_TEST, + Code_FT8716_WRITE_CONFIG, + + Code_FT8716_SHORT_CIRCUIT_TEST, + Code_FT8716_OPEN_TEST, + Code_FT8716_CB_UNIFORMITY_TEST, + Code_FT8716_DIFFER_UNIFORMITY_TEST, + Code_FT8716_DIFFER2_UNIFORMITY_TEST, + Code_FT8716_LCD_NOISE_TEST, + Code_FT8716_GPIO_TEST, + Code_FT8716_IC_TYPE_TEST, + Code_FT8716_RESET_DETECT_TEST, + Code_FT8716_ERASE_SECTOR_TEST, + Code_FT8716_RAWDATA_UNIFORMITY_TEST, + Code_FT8716_VIRTUAL_DIFFER_TEST, +}; + + + +#elif (FT8607_TEST) + +struct stCfg_FT8607_TESTItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool OPEN_TEST; +}; + +struct stCfg_FT8607_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMax; + + int iLCDNoiseCoefficient; + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Open_Test_CBMin; +}; + + +enum enumTestItem_FT8607 { + Code_FT8607_ENTER_FACTORY_MODE, + Code_FT8607_DOWNLOAD, + Code_FT8607_UPGRADE, + Code_FT8607_FACTORY_ID_TEST, + Code_FT8607_PROJECT_CODE_TEST, + Code_FT8607_FW_VERSION_TEST, + Code_FT8607_IC_VERSION_TEST, + Code_FT8607_RAWDATA_TEST, + Code_FT8607_CHANNEL_NUM_TEST, + + Code_FT8607_INT_PIN_TEST, + Code_FT8607_RESET_PIN_TEST, + Code_FT8607_NOISE_TEST, + Code_FT8607_CB_TEST, + Code_FT8607_WRITE_CONFIG, + + Code_FT8607_SHORT_CIRCUIT_TEST, + Code_FT8607_LCD_NOISE_TEST, + + Code_FT8607_OSC60MHZ_TEST, + Code_FT8607_OSCTRM_TEST, + Code_FT8607_SNR_TEST, + Code_FT8607_DIFFER_TEST, + Code_FT8607_DIFFER_UNIFORMITY_TEST, + + Code_FT8607_LPWG_RAWDATA_TEST, + Code_FT8607_LPWG_CB_TEST, + Code_FT8607_LPWG_NOISE_TEST, + Code_FT8607_OPEN_TEST, +}; + +#elif (FT5X46_TEST) +/*----------------------------------------------- +FT5X46 and FT5X46 is the same series of chips +FT5422\FT5X46 is the chip code for internally develope +FT5X46 is the chip code for market +------------------------------------------------*/ +struct stCfg_FT5X46_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + bool PANEL_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + bool GPIO_TEST; + bool LCD_NOISE_TEST; +}; +struct stCfg_FT5X46_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + bool bNoiseTest_TPToolProcess; + + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int Lcd_Noise_MaxFrame; + int Lcd_Noise_Conficient; + int Lcd_Noise_Noise_Mode; + int Lcd_Noise_MaxNgPoint; + int Lcd_Noise_FrameNum; + + bool Lcd_Noise_NoiseThresholdMode; + int Lcd_Noise_NoiseCoefficient; + int Lcd_Noise_NoiseMax; + int Lcd_Noise_SetFrequency; +}; +enum enumTestItem_FT5X46 { + Code_FT5X46_ENTER_FACTORY_MODE, + Code_FT5X46_DOWNLOAD, + Code_FT5X46_UPGRADE, + Code_FT5X46_FACTORY_ID_TEST, + Code_FT5X46_PROJECT_CODE_TEST, + Code_FT5X46_FW_VERSION_TEST, + Code_FT5X46_IC_VERSION_TEST, + Code_FT5X46_RAWDATA_TEST, + Code_FT5X46_ADCDETECT_TEST, + Code_FT5X46_SCAP_CB_TEST, + Code_FT5X46_SCAP_RAWDATA_TEST, + Code_FT5X46_CHANNEL_NUM_TEST, + Code_FT5X46_INT_PIN_TEST, + Code_FT5X46_RESET_PIN_TEST, + Code_FT5X46_NOISE_TEST, + Code_FT5X46_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5X46_UNIFORMITY_TEST, + Code_FT5X46_CM_TEST, + Code_FT5X46_RAWDATA_MARGIN_TEST, + Code_FT5X46_WRITE_CONFIG, + Code_FT5X46_PANELDIFFER_TEST, + Code_FT5X46_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5X46_LCM_ID_TEST, + Code_FT5X46_JUDEG_NORMALIZE_TYPE, + Code_FT5X46_TE_TEST, + Code_FT5X46_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5X46_PATTERN_TEST, + Code_FT5X46_GPIO_TEST, + Code_FT5X46_LCD_NOISE_TEST, +}; + +#elif (FT6X36_TEST) + +struct stCfg_FT6X36_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool CHANNEL_SHORT_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool DELTA_CB_TEST; + bool CHANNELS_DEVIATION_TEST; + bool TWO_SIDES_DEVIATION_TEST; + bool FPC_SHORT_TEST; + bool FPC_OPEN_TEST; + bool SREF_OPEN_TEST; + bool TE_TEST; + bool CB_DEVIATION_TEST; + bool DIFFER_TEST; + bool WEAK_SHORT_TEST; + bool DIFFER_TEST2; + bool K1_DIFFER_TEST; +}; + +struct stCfg_FT6X36_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelNum; + BYTE ChannelNumTest_KeyNum; + int ChannelShortTest_K1; + int ChannelShortTest_K2; + int ChannelShortTest_CB; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int WeakShortThreshold; + int NoiseTest_Max; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int FPCShort_CB_Min; + int FPCShort_CB_Max; + int FPCShort_RawData_Min; + int FPCShort_RawData_Max; + int FPCOpen_CB_Min; + int FPCOpen_CB_Max; + int FPCOpen_RawData_Min; + int FPCOpen_RawData_Max; + int SREFOpen_Hole_Base1; + int SREFOpen_Hole_Base2; + int SREFOpen_Hole; + int CBDeviationTest_Hole; + int Differ_Ave_Hole; + int Differ_Max_Hole; + int CbTest_Min; + int CbTest_Max; + int DeltaCbTest_Base; + int DeltaCbTest_Differ_Max; + bool DeltaCbTest_Include_Key_Test; + int DeltaCbTest_Key_Differ_Max; + int DeltaCbTest_Deviation_S1; + int DeltaCbTest_Deviation_S2; + int DeltaCbTest_Deviation_S3; + int DeltaCbTest_Deviation_S4; + int DeltaCbTest_Deviation_S5; + int DeltaCbTest_Deviation_S6; + bool DeltaCbTest_Set_Critical; + int DeltaCbTest_Critical_S1; + int DeltaCbTest_Critical_S2; + int DeltaCbTest_Critical_S3; + int DeltaCbTest_Critical_S4; + int DeltaCbTest_Critical_S5; + int DeltaCbTest_Critical_S6; + + int ChannelsDeviationTest_Deviation_S1; + int ChannelsDeviationTest_Deviation_S2; + int ChannelsDeviationTest_Deviation_S3; + int ChannelsDeviationTest_Deviation_S4; + int ChannelsDeviationTest_Deviation_S5; + int ChannelsDeviationTest_Deviation_S6; + bool ChannelsDeviationTest_Set_Critical; + int ChannelsDeviationTest_Critical_S1; + int ChannelsDeviationTest_Critical_S2; + int ChannelsDeviationTest_Critical_S3; + int ChannelsDeviationTest_Critical_S4; + int ChannelsDeviationTest_Critical_S5; + int ChannelsDeviationTest_Critical_S6; + + int TwoSidesDeviationTest_Deviation_S1; + int TwoSidesDeviationTest_Deviation_S2; + int TwoSidesDeviationTest_Deviation_S3; + int TwoSidesDeviationTest_Deviation_S4; + int TwoSidesDeviationTest_Deviation_S5; + int TwoSidesDeviationTest_Deviation_S6; + bool TwoSidesDeviationTest_Set_Critical; + int TwoSidesDeviationTest_Critical_S1; + int TwoSidesDeviationTest_Critical_S2; + int TwoSidesDeviationTest_Critical_S3; + int TwoSidesDeviationTest_Critical_S4; + int TwoSidesDeviationTest_Critical_S5; + int TwoSidesDeviationTest_Critical_S6; + + int DifferTest2_Data_H_Min; + int DifferTest2_Data_H_Max; + int DifferTest2_Data_M_Min; + int DifferTest2_Data_M_Max; + int DifferTest2_Data_L_Min; + int DifferTest2_Data_L_Max; + bool bDifferTest2_Data_H; + bool bDifferTest2_Data_M; + bool bDifferTest2_Data_L; + int K1DifferTest_StartK1; + int K1DifferTest_EndK1; + int K1DifferTest_MinHold2; + int K1DifferTest_MaxHold2; + int K1DifferTest_MinHold4; + int K1DifferTest_MaxHold4; + int K1DifferTest_Deviation2; + int K1DifferTest_Deviation4; +}; + +enum enumTestItem_FT6X36 { + Code_FT6X36_ENTER_FACTORY_MODE, + Code_FT6X36_DOWNLOAD, + Code_FT6X36_UPGRADE, + Code_FT6X36_FACTORY_ID_TEST, + Code_FT6X36_PROJECT_CODE_TEST, + Code_FT6X36_FW_VERSION_TEST, + Code_FT6X36_IC_VERSION_TEST, + Code_FT6X36_RAWDATA_TEST, + Code_FT6X36_CHANNEL_NUM_TEST, + Code_FT6X36_CHANNEL_SHORT_TEST, + Code_FT6X36_INT_PIN_TEST, + Code_FT6X36_RESET_PIN_TEST, + Code_FT6X36_NOISE_TEST, + Code_FT6X36_CB_TEST, + Code_FT6X36_DELTA_CB_TEST, + Code_FT6X36_CHANNELS_DEVIATION_TEST, + Code_FT6X36_TWO_SIDES_DEVIATION_TEST, + Code_FT6X36_FPC_SHORT_TEST, + Code_FT6X36_FPC_OPEN_TEST, + Code_FT6X36_SREF_OPEN_TEST, + Code_FT6X36_TE_TEST, + Code_FT6X36_CB_DEVIATION_TEST, + Code_FT6X36_WRITE_CONFIG, + Code_FT6X36_DIFFER_TEST, + Code_FT6X36_WEAK_SHORT_TEST, + Code_FT6X36_DIFFER_TEST2, + Code_FT6X36_K1_DIFFER_TEST, +}; + +#elif (FT5822_TEST) + +struct stCfg_FT5822_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; +}; +struct stCfg_FT5822_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE NoiseTest_ShowTipAfter; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + bool bNoiseTest_FWMode; + int NoiseTest_SetFrequency; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int NoiseTest_Max_Value; + int WeakShortTest_CG; + int WeakShortTest_CC; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; +}; +enum enumTestItem_FT5822 { + Code_FT5822_ENTER_FACTORY_MODE, + Code_FT5822_DOWNLOAD, + Code_FT5822_UPGRADE, + Code_FT5822_FACTORY_ID_TEST, + Code_FT5822_PROJECT_CODE_TEST, + Code_FT5822_FW_VERSION_TEST, + Code_FT5822_IC_VERSION_TEST, + Code_FT5822_RAWDATA_TEST, + Code_FT5822_ADCDETECT_TEST, + Code_FT5822_SCAP_CB_TEST, + Code_FT5822_SCAP_RAWDATA_TEST, + Code_FT5822_CHANNEL_NUM_TEST, + Code_FT5822_INT_PIN_TEST, + Code_FT5822_RESET_PIN_TEST, + Code_FT5822_NOISE_TEST, + Code_FT5822_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5822_UNIFORMITY_TEST, + Code_FT5822_CM_TEST, + Code_FT5822_RAWDATA_MARGIN_TEST, + Code_FT5822_WRITE_CONFIG, + Code_FT5822_PANELDIFFER_TEST, + Code_FT5822_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5822_LCM_ID_TEST, + Code_FT5822_JUDEG_NORMALIZE_TYPE, + Code_FT5822_TE_TEST, + Code_FT5822_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5822_PATTERN_TEST, +}; + +#elif (FT8006_TEST) + +struct stCfg_FT8006_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_TEST; + +}; +struct stCfg_FT8006_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Differ2Test_Min; + int Differ2Test_Max; + +}; +enum enumTestItem_FT8006 { + Code_FT8006_ENTER_FACTORY_MODE, + Code_FT8006_DOWNLOAD, + Code_FT8006_UPGRADE, + Code_FT8006_FACTORY_ID_TEST, + Code_FT8006_PROJECT_CODE_TEST, + Code_FT8006_FW_VERSION_TEST, + Code_FT8006_IC_VERSION_TEST, + Code_FT8006_RAWDATA_TEST, + Code_FT8006_CHANNEL_NUM_TEST, + Code_FT8006_INT_PIN_TEST, + Code_FT8006_RESET_PIN_TEST, + Code_FT8006_NOISE_TEST, + Code_FT8006_CB_TEST, + Code_FT8006_WRITE_CONFIG, + Code_FT8006_SHORT_CIRCUIT_TEST, + Code_FT8006_LCD_NOISE_TEST, + + Code_FT8006_OSC60MHZ_TEST, + Code_FT8006_OSCTRM_TEST, + Code_FT8006_SNR_TEST, + Code_FT8006_DIFFER_TEST, + Code_FT8006_DIFFER_UNIFORMITY_TEST, + + Code_FT8006_LPWG_RAWDATA_TEST, + Code_FT8006_LPWG_CB_TEST, + Code_FT8006_LPWG_NOISE_TEST, + Code_FT8006_DIFFER2_TEST, +}; + +#elif (FT8736_TEST) + +struct stCfg_FT8736_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool CB_DECREASE_TEST; + bool VREF_DECREASE_TEST; +}; +struct stCfg_FT8736_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + + int CBDecrease_Step; + int CBDecrease_OrgMin; + int CBDecrease_OrgMax; + int CBDecrease_CalcMin; + int CBDecrease_CalcMax; + + int VRefDecrease_StepBegin; + int VRefDecrease_StepEnd; + int VRefDecrease_OrgMin; + int VRefDecrease_OrgMax; + int VRefDecrease_CalcMin; + int VRefDecrease_CalcMax; +}; + +enum enumTestItem_FT8736 { + Code_FT8736_ENTER_FACTORY_MODE, + Code_FT8736_DOWNLOAD, + Code_FT8736_UPGRADE, + Code_FT8736_FACTORY_ID_TEST, + Code_FT8736_PROJECT_CODE_TEST, + Code_FT8736_FW_VERSION_TEST, + Code_FT8736_IC_VERSION_TEST, + Code_FT8736_RAWDATA_TEST, + Code_FT8736_CHANNEL_NUM_TEST, + + Code_FT8736_INT_PIN_TEST, + Code_FT8736_RESET_PIN_TEST, + Code_FT8736_NOISE_TEST, + Code_FT8736_CB_TEST, + Code_FT8736_WRITE_CONFIG, + + Code_FT8736_SHORT_CIRCUIT_TEST, + Code_FT8736_OPEN_TEST, + Code_FT8736_CB_UNIFORMITY_TEST, + Code_FT8736_DIFFER_UNIFORMITY_TEST, + Code_FT8736_DIFFER2_UNIFORMITY_TEST, + Code_FT8736_LCD_NOISE_TEST, + Code_FT8736_CB_DECREASE_TEST, + Code_FT8736_VREF_DECREASE_TEST, + Code_FT8736_IC_TYPE_TEST, +}; + +#elif (FTE716_TEST) +struct stCfg_FTE716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool GPIO_TEST; +}; +struct stCfg_FTE716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + bool bOri_ProjectCode; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + BYTE LCDNoiseTest_NoiseMode; +}; + +enum enumTestItem_FTE716 { + Code_FTE716_ENTER_FACTORY_MODE, + Code_FTE716_DOWNLOAD, + Code_FTE716_UPGRADE, + Code_FTE716_FACTORY_ID_TEST, + Code_FTE716_PROJECT_CODE_TEST, + Code_FTE716_FW_VERSION_TEST, + Code_FTE716_IC_VERSION_TEST, + Code_FTE716_RAWDATA_TEST, + Code_FTE716_CHANNEL_NUM_TEST, + + Code_FTE716_INT_PIN_TEST, + Code_FTE716_RESET_PIN_TEST, + Code_FTE716_NOISE_TEST, + Code_FTE716_CB_TEST, + Code_FTE716_WRITE_CONFIG, + + Code_FTE716_SHORT_CIRCUIT_TEST, + Code_FTE716_OPEN_TEST, + Code_FTE716_CB_UNIFORMITY_TEST, + Code_FTE716_DIFFER_UNIFORMITY_TEST, + Code_FTE716_DIFFER2_UNIFORMITY_TEST, + Code_FTE716_LCD_NOISE_TEST, + Code_FTE716_GPIO_TEST, + Code_FTE716_IC_TYPE_TEST, +}; + +#elif (FTE736_TEST) + +struct stCfg_FTE736_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool CB_DECREASE_TEST; + bool VREF_DECREASE_TEST; +}; +struct stCfg_FTE736_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + + int CBDecrease_Step; + int CBDecrease_OrgMin; + int CBDecrease_OrgMax; + int CBDecrease_CalcMin; + int CBDecrease_CalcMax; + + int VRefDecrease_StepBegin; + int VRefDecrease_StepEnd; + int VRefDecrease_OrgMin; + int VRefDecrease_OrgMax; + int VRefDecrease_CalcMin; + int VRefDecrease_CalcMax; +}; + +enum enumTestItem_FTE736 { + Code_FTE736_ENTER_FACTORY_MODE, + Code_FTE736_DOWNLOAD, + Code_FTE736_UPGRADE, + Code_FTE736_FACTORY_ID_TEST, + Code_FTE736_PROJECT_CODE_TEST, + Code_FTE736_FW_VERSION_TEST, + Code_FTE736_IC_VERSION_TEST, + Code_FTE736_RAWDATA_TEST, + Code_FTE736_CHANNEL_NUM_TEST, + + Code_FTE736_INT_PIN_TEST, + Code_FTE736_RESET_PIN_TEST, + Code_FTE736_NOISE_TEST, + Code_FTE736_CB_TEST, + Code_FTE736_WRITE_CONFIG, + + Code_FTE736_SHORT_CIRCUIT_TEST, + Code_FTE736_OPEN_TEST, + Code_FTE736_CB_UNIFORMITY_TEST, + Code_FTE736_DIFFER_UNIFORMITY_TEST, + Code_FTE736_DIFFER2_UNIFORMITY_TEST, + Code_FTE736_LCD_NOISE_TEST, + Code_FTE736_CB_DECREASE_TEST, + Code_FTE736_VREF_DECREASE_TEST, + Code_FTE736_IC_TYPE_TEST, +}; + +#elif(FT8606_TEST) + +struct stCfg_FT8606_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool IVSN_TEST; +}; +struct stCfg_FT8606_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int CbTest_Min; + int CbTest_Max; + int ShortTest_Max; + int ShortTest_K2Value; + bool ShortTest_Tip; + bool IsDifferMode; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; +}; + + +enum enumTestItem_FT8606 { + Code_FT8606_ENTER_FACTORY_MODE, + Code_FT8606_DOWNLOAD, + Code_FT8606_UPGRADE, + Code_FT8606_FACTORY_ID_TEST, + Code_FT8606_PROJECT_CODE_TEST, + Code_FT8606_FW_VERSION_TEST, + Code_FT8606_IC_VERSION_TEST, + Code_FT8606_RAWDATA_TEST, + Code_FT8606_CHANNEL_NUM_TEST, + + Code_FT8606_INT_PIN_TEST, + Code_FT8606_RESET_PIN_TEST, + Code_FT8606_NOISE_TEST, + Code_FT8606_CB_TEST, + Code_FT8606_WRITE_CONFIG, + + Code_FT8606_SHORT_CIRCUIT_TEST, + Code_FT8606_LCD_NOISE_TEST, + Code_FT8606_OSC60MHZ_TEST, + Code_FT8606_OSCTRM_TEST, + Code_FT8606_IVSN_TEST, +}; + +#elif(FT3C47_TEST) + +struct stCfg_FT3C47_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + + bool FORCETOUCH_CHANNEL_NUM_TEST; + bool FORCETOUCH_RAWDATA_TEST; + bool FORCETOUCH_CB_TEST; + bool FORCETOUCH_WEAK_SHORT_CIRCUIT_TEST; + bool FORCETOUCH_FLATNESS_TEST; +}; + +struct stCfg_FT3C47_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int ForceTouch_ChannelNumTest_ChannelNum; + + int ForceTouch_SCapRawDataTest_OFF_Min; + int ForceTouch_SCapRawDataTest_OFF_Max; + int ForceTouch_SCapRawDataTest_ON_Min; + int ForceTouch_SCapRawDataTest_ON_Max; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_ON; + + int ForceTouch_SCapCbTest_OFF_Min; + int ForceTouch_SCapCbTest_OFF_Max; + int ForceTouch_SCapCbTest_ON_Min; + int ForceTouch_SCapCbTest_ON_Max; + BYTE ForceTouch_SCapCBTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapCBTest_SetWaterproof_ON; + + int ForceTouch_WeakShortTest_CG; + int ForceTouch_WeakShortTest_CC; + bool bForceTouch_WeakShortTest_CapShortTest; + + int ForceTouch_FlatnessTest_Differ_Threshold; + int ForceTouch_FlatnessTest_Differ_Coefficient; + bool ForceTouch_FlatnessTest_Differ_Threshold_Check; + bool ForceTouch_FlatnessTest_Differ_Coefficient_Check; + +}; +enum enumTestItem_FT3C47 { + Code_FT3C47_ENTER_FACTORY_MODE, + Code_FT3C47_DOWNLOAD, + Code_FT3C47_UPGRADE, + Code_FT3C47_FACTORY_ID_TEST, + Code_FT3C47_PROJECT_CODE_TEST, + Code_FT3C47_FW_VERSION_TEST, + Code_FT3C47_IC_VERSION_TEST, + Code_FT3C47_RAWDATA_TEST, + Code_FT3C47_ADCDETECT_TEST, + Code_FT3C47_SCAP_CB_TEST, + Code_FT3C47_SCAP_RAWDATA_TEST, + Code_FT3C47_CHANNEL_NUM_TEST, + Code_FT3C47_INT_PIN_TEST, + Code_FT3C47_RESET_PIN_TEST, + Code_FT3C47_NOISE_TEST, + Code_FT3C47_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_UNIFORMITY_TEST, + Code_FT3C47_CM_TEST, + Code_FT3C47_RAWDATA_MARGIN_TEST, + Code_FT3C47_WRITE_CONFIG, + Code_FT3C47_PANELDIFFER_TEST, + Code_FT3C47_PANELDIFFER_UNIFORMITY_TEST, + Code_FT3C47_LCM_ID_TEST, + Code_FT3C47_JUDEG_NORMALIZE_TYPE, + Code_FT3C47_TE_TEST, + Code_FT3C47_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT3C47_PATTERN_TEST, + + Code_FT3C47_GPIO_TEST, + Code_FT3C47_LCD_NOISE_TEST, + Code_FT3C47_FORCE_TOUCH_CHANNEL_NUM_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_RAWDATA_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_CB_TEST, + Code_FT3C47_FORCE_TOUCH_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_FORCE_TOUCH_FLATNESS_TEST, +}; + + +#endif + + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/Makefile b/drivers/input/touchscreen/FT5346/focaltech_test/src/Makefile new file mode 100644 index 0000000000000..f5d4ed7c1e77d --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/Makefile @@ -0,0 +1,12 @@ +#drivers/input/touchscreen/mediatek/focaltech_ts/focaltech_test/src +# +# Makefile for test module +# +# Linux driver folder + + +obj-y += focaltech_test.o +obj-y += focaltech_test_main.o +obj-y += focaltech_test_ini.o +obj-y += focaltech_test_global.o +obj-y += focaltech_test_detail_threshold.o diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test.c b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test.c new file mode 100644 index 0000000000000..c0b5cc1047f7c --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test.c @@ -0,0 +1,534 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2016, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/************************************************************************ +* +* File Name: focaltech_test.c +* +* Author: Software Department, FocalTech +* +* Created: 2016-08-01 +* +* Modify: +* +* Abstract: create char device and proc node for the comm between APK and TP +* +************************************************************************/ + +/******************************************************************************* +* Included header files +*******************************************************************************/ +#include +#include +#include +#include +#include + +#include +#include + +#include +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_test_ini.h" + + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ + +#define IC_TEST_VERSION "Test version: V1.0.0--2016-08-01, (sync version of FT_MultipleTest: V4.0.0.0 ------ 2016-07-18)" + +#define FTS_INI_FILE_PATH "/system/etc/" +#define FTS_CSV_FILE_PATH "/storage/" + +#define FTS_TEST_BUFFER_SIZE 80*1024 +#define FTS_TEST_PRINT_SIZE 128 +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ + + +/******************************************************************************* +* Static variables +*******************************************************************************/ + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ + + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ +static int fts_test_get_ini_size(char *config_name); +static int fts_test_read_ini_data(char *config_name, char *config_buf); +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen); +static int fts_test_get_testparam_from_ini(char *config_name); + +/******************************************************************************* +* functions body +*******************************************************************************/ +extern struct i2c_client *fts_i2c_client; +extern void disable_irq(unsigned int irq); +extern void enable_irq(unsigned int irq); + +static DEFINE_MUTEX(fts_mutex); +static int fts_test_i2c_read(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen) +{ + int ret = -1; + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = fts_i2c_client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = fts_i2c_client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(fts_i2c_client->adapter, msgs, 2); + if (ret < 0) + dev_err(&fts_i2c_client->dev, "%s: i2c read error.\n", __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = fts_i2c_client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(fts_i2c_client->adapter, msgs, 1); + if (ret < 0) + dev_err(&fts_i2c_client->dev, "%s:i2c read error.\n", __func__); + } + + return ret; + +} + +static int fts_test_i2c_write(unsigned char *writebuf, int writelen) +{ + int ret = -1; + + struct i2c_msg msgs[] = { + { + .addr = fts_i2c_client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + ret = i2c_transfer(fts_i2c_client->adapter, msgs, 1); + if (ret < 0) + dev_err(&fts_i2c_client->dev, "%s: i2c write error.\n", __func__); + + return ret; +} + + +static int fts_test_get_ini_size(char *config_name) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + filp_close(pfile, NULL); + + FTS_TEST_FUNC_ENTER(); + + return fsize; +} + + +static int fts_test_read_ini_data(char *config_name, char *config_buf) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + loff_t pos = 0; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, config_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen) +{ + struct file *pfile = NULL; + + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_CSV_FILE_PATH, file_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_CREAT|O_RDWR, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_write(pfile, data_buf, iLen, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_get_testparam_from_ini(char *config_name) +{ + char *pcfiledata = NULL; + int ret = 0; + int inisize = 0; + + FTS_TEST_FUNC_ENTER(); + + inisize = fts_test_get_ini_size(config_name); + FTS_TEST_DBG("ini_size = %d ", inisize); + if (inisize <= 0) { + FTS_TEST_ERROR("%s ERROR:Get firmware size failed", __func__); + return -EIO; + } + + pcfiledata = fts_malloc(inisize + 1); + if (NULL == pcfiledata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + + memset(pcfiledata, 0, inisize + 1); + + if (fts_test_read_ini_data(config_name, pcfiledata)) { + FTS_TEST_ERROR(" - ERROR: fts_test_read_ini_data failed"); + fts_free(pcfiledata); + pcfiledata = NULL; + + return -EIO; + } else { + FTS_TEST_DBG("fts_test_read_ini_data successful"); + } + + ret = set_param_data(pcfiledata); + + fts_free(pcfiledata); + pcfiledata = NULL; + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} + + + + +static int fts_test_entry(char *ini_file_name, char *bufdest, ssize_t *pinumread) +{ + /* place holder for future use */ + char cfgname[128]; + char *testdata = NULL; + char *printdata = NULL; + int iTestDataLen = 0; + int ret = 0; + int icycle = 0, i = 0; + int print_index = 0; + int test_result = -1; + + FTS_TEST_FUNC_ENTER(); + FTS_TEST_DBG("ini_file_name:%s.", ini_file_name); + /*Used to obtain the test data stored in the library, pay attention to the size of the distribution space.*/ + FTS_TEST_DBG("Allocate memory, size: %d", FTS_TEST_BUFFER_SIZE); + testdata = fts_malloc(FTS_TEST_BUFFER_SIZE); + if (NULL == testdata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + printdata = fts_malloc(FTS_TEST_PRINT_SIZE); + if (NULL == printdata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + /*Initialize the platform related I2C read and write functions*/ + + init_i2c_write_func(fts_test_i2c_write); + init_i2c_read_func(fts_test_i2c_read); + + /*Initialize pointer memory*/ + ret = focaltech_test_main_init(); + if (ret < 0) { + FTS_TEST_ERROR("focaltech_test_main_init() error."); + goto TEST_ERR; + } + + /*Read parse configuration file*/ + memset(cfgname, 0, sizeof(cfgname)); + sprintf(cfgname, "%s", ini_file_name); + FTS_TEST_DBG("ini_file_name = %s", cfgname); + + fts_test_funcs(); + + if (fts_test_get_testparam_from_ini(cfgname) < 0) { + FTS_TEST_ERROR("get testparam from ini failure"); + goto TEST_ERR; + } + + /*Start testing according to the test configuration*/ + if (true == start_test_tp()) { + + FTS_TEST_INFO("tp test pass"); + test_result = 0; + } + + else { + + FTS_TEST_INFO("tp test failure"); + test_result = -1; + } + + + /*Gets the number of tests in the test library and saves it*/ + iTestDataLen = get_test_data(testdata); + + + icycle = 0; + /*Print test data packets */ + FTS_TEST_DBG("print test data: \n"); + for (i = 0; i < iTestDataLen; i++) { + if (('\0' == testdata[i]) + || (icycle == FTS_TEST_PRINT_SIZE - 2) + || (i == iTestDataLen-1) + ) { + if (icycle == 0) { + print_index++; + } else { + memcpy(printdata, testdata + print_index, icycle); + printdata[FTS_TEST_PRINT_SIZE-1] = '\0'; + FTS_TEST_DBG("%s", printdata); + print_index += icycle; + icycle = 0; + } + } else { + icycle++; + } + } + FTS_TEST_DBG("\n"); + + + + fts_test_save_test_data("testdata.csv", testdata, iTestDataLen); + fts_test_save_test_data("testresult.txt", TestResult, TestResultLen); + + + /*Release memory */ + focaltech_test_main_exit(); + + + + if (NULL != testdata) + fts_free(testdata); + if (NULL != printdata) + fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return test_result; + +TEST_ERR: + if (NULL != testdata) + fts_free(testdata); + if (NULL != printdata) + fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return -EPERM; +} + +/************************************************************************ +* Name: fts_test_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_test_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return -EPERM; +} + +/************************************************************************ +* Name: fts_test_store +* Brief: upgrade from app.bin +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_test_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + char fwname[128] = {0}; + struct i2c_client *client = fts_i2c_client; + char *bufdest = NULL; + ssize_t pinumread = 0; + + FTS_TEST_FUNC_ENTER(); + + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + FTS_TEST_DBG("fwname:%s.", fwname); + mutex_lock(&fts_mutex); + + + disable_irq(client->irq); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(DISABLE); +#endif + + fts_test_entry("ft5346_ds.ini", bufdest, &pinumread); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(ENABLE); +#endif + + enable_irq(client->irq); + mutex_unlock(&fts_mutex); + + + FTS_TEST_FUNC_EXIT(); + + return count; +} +/* upgrade from app.bin +* example:echo "***.ini" > fts_test +*/ +static DEVICE_ATTR(fts_test, S_IRUGO|S_IWUSR, fts_test_show, fts_test_store); + +/* add your attr in here*/ +static struct attribute *fts_test_attributes[] = { + &dev_attr_fts_test.attr, + NULL +}; + +static struct attribute_group fts_test_attribute_group = { + .attrs = fts_test_attributes +}; + + +int fts_test_init(struct i2c_client *client) +{ + int err = 0; + + FTS_TEST_FUNC_ENTER(); + + FTS_TEST_INFO("[focal] %s ", IC_TEST_VERSION); + + + err = sysfs_create_group(&client->dev.kobj, &fts_test_attribute_group); + if (0 != err) { + FTS_TEST_ERROR("[focal] %s() - ERROR: sysfs_create_group() failed.", __func__); + sysfs_remove_group(&client->dev.kobj, &fts_test_attribute_group); + return -EIO; + } else { + FTS_TEST_DBG("[focal] %s() - sysfs_create_group() succeeded.", __func__); + } + + FTS_TEST_FUNC_EXIT(); + + return err; +} +int fts_test_exit(struct i2c_client *client) +{ + FTS_TEST_FUNC_ENTER(); + + sysfs_remove_group(&client->dev.kobj, &fts_test_attribute_group); + + FTS_TEST_FUNC_EXIT(); + + return 0; +} + +int fts_open_short_test(char *ini_file_name, char *bufdest, ssize_t *pinumread) +{ + return fts_test_entry(ini_file_name, bufdest, pinumread); +} + + + +EXPORT_SYMBOL(fts_open_short_test); + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_detail_threshold.c b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_detail_threshold.c new file mode 100644 index 0000000000000..2006819e915dc --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_detail_threshold.c @@ -0,0 +1,2144 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_main.h" +#include "../../focaltech_global/focaltech_ic_table.h" + + +struct stCfg_MCap_DetailThreshold g_stCfg_MCap_DetailThreshold; +struct stCfg_SCap_DetailThreshold g_stCfg_SCap_DetailThreshold; +struct stCfg_Incell_DetailThreshold g_stCfg_Incell_DetailThreshold; + +void set_max_channel_num(void) +{ + + FTS_TEST_FUNC_ENTER(); + switch (g_ScreenSetParam.iSelectedIC>>4) { + case IC_FT5822>>4: + case IC_FT8006>>4: + case IC_FTE716>>4: + g_ScreenSetParam.iUsedMaxTxNum = TX_NUM_MAX; + g_ScreenSetParam.iUsedMaxRxNum = RX_NUM_MAX; + break; + default: + g_ScreenSetParam.iUsedMaxTxNum = 30; + g_ScreenSetParam.iUsedMaxRxNum = 30; + break; + } + + FTS_TEST_DBG("MaxTxNum = %d, MaxRxNum = %d. ", g_ScreenSetParam.iUsedMaxTxNum, g_ScreenSetParam.iUsedMaxRxNum); + + FTS_TEST_FUNC_EXIT(); + +} + +int malloc_struct_DetailThreshold(void) +{ + FTS_TEST_FUNC_ENTER(); + + + g_stCfg_MCap_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_MCap_DetailThreshold.InvalidNode) + goto ERR; + + g_stCfg_MCap_DetailThreshold.InvalidNode_SC = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_MCap_DetailThreshold.InvalidNode_SC) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) + goto ERR; + + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) + goto ERR; + + + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) + goto ERR; + + + + g_stCfg_Incell_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_Incell_DetailThreshold.InvalidNode) { + FTS_TEST_DBG("InvalidNode. \n"); + goto ERR; + } + + + g_stCfg_Incell_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + FTS_TEST_DBG("RawDataTest_Min. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + FTS_TEST_DBG("RawDataTest_Max. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBTest_Min) { + FTS_TEST_DBG("CBTest_Min. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBTest_Max) { + FTS_TEST_DBG("CBTest_Max. \n"); + goto ERR; + } + + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHY_Linearity. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHX_Linearity. \n"); + goto ERR; + } + + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity) { + FTS_TEST_DBG("RawDataUniformityTest_CHX_Linearity. \n"); + goto ERR; + } + + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity) { + FTS_TEST_DBG("RawDataUniformityTest_CHY_Linearity. \n"); + goto ERR; + } + + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data) { + FTS_TEST_DBG("RawDataUniformityTest_CB_Data. \n"); + goto ERR; + } + + FTS_TEST_FUNC_EXIT(); + + return 0; + +ERR: + FTS_TEST_ERROR("fts_malloc memory failed in function."); + return -EPERM; +} + +void free_struct_DetailThreshold(void) +{ + if (NULL != g_stCfg_MCap_DetailThreshold.InvalidNode) { + fts_free(g_stCfg_MCap_DetailThreshold.InvalidNode); + g_stCfg_MCap_DetailThreshold.InvalidNode = NULL; + } + if (NULL != g_stCfg_MCap_DetailThreshold.InvalidNode_SC) { + fts_free(g_stCfg_MCap_DetailThreshold.InvalidNode_SC); + g_stCfg_MCap_DetailThreshold.InvalidNode_SC = NULL; + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base) { + fts_free(g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base) { + fts_free(g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) { + fts_free(g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient); + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = NULL; + } + + if (NULL != g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max); + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = NULL; + } + + if (NULL != g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min); + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.InvalidNode) { + fts_free(g_stCfg_Incell_DetailThreshold.InvalidNode); + g_stCfg_Incell_DetailThreshold.InvalidNode = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Min); + g_stCfg_Incell_DetailThreshold.RawDataTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBTest_Min) { + fts_free(g_stCfg_Incell_DetailThreshold.CBTest_Min); + g_stCfg_Incell_DetailThreshold.CBTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.CBTest_Max); + g_stCfg_Incell_DetailThreshold.CBTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity); + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity); + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity); + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity); + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data); + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data = NULL; + } + +} + +void OnInit_SCap_DetailThreshold(char *strIniFile) +{ + FTS_TEST_FUNC_ENTER(); + + OnGetTestItemParam("RawDataTest_Max", strIniFile, 12500); + memcpy(g_stCfg_SCap_DetailThreshold.RawDataTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("RawDataTest_Min", strIniFile, 16500); + memcpy(g_stCfg_SCap_DetailThreshold.RawDataTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiTest_Max", strIniFile, 5); + memcpy(g_stCfg_SCap_DetailThreshold.CiTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiTest_Min", strIniFile, 250); + memcpy(g_stCfg_SCap_DetailThreshold.CiTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_AnotherBase1", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase1, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_AnotherBase2", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase2, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("NoiseTest_Max", strIniFile, 20); + memcpy(g_stCfg_SCap_DetailThreshold.NoiseTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiDeviation_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CiDeviationTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCxTest_Sort", strIniFile, 1); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCxTest_Sort, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCxTest_Area", strIniFile, 1); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCxTest_Area, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + + OnGetTestItemParam("CbTest_Max", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CbTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("CbTest_Min", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CbTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("DeltaCbTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCbTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("DifferTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DifferTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("CBDeviation_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CBDeviationTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("K1DifferTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.K1DifferTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + FTS_TEST_FUNC_EXIT(); +} + +void OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue) +{ + + char strValue[800]; + char str_tmp[128]; + int iValue = 0; + int dividerPos = 0; + int index = 0; + int i = 0, j = 0, k = 0; + memset(g_stCfg_SCap_DetailThreshold.TempData, 0, sizeof(g_stCfg_SCap_DetailThreshold.TempData)); + sprintf(str_tmp, "%d", iDefautValue); + GetPrivateProfileString("Basic_Threshold", strItemName, str_tmp, strValue, strIniFile); + iValue = fts_atoi(strValue); + for (i = 0; i < MAX_CHANNEL_NUM; i++) { + g_stCfg_SCap_DetailThreshold.TempData[i] = iValue; + } + + dividerPos = GetPrivateProfileString("SpecialSet", strItemName, "", strValue, strIniFile); + if (dividerPos > 0) { + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_SCap_DetailThreshold.TempData[k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } +} + +void OnInit_MCap_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + set_max_channel_num(); + + OnInit_InvalidNode(strIniFile); + OnInit_DThreshold_RawDataTest(strIniFile); + OnInit_DThreshold_SCapRawDataTest(strIniFile); + OnInit_DThreshold_SCapCbTest(strIniFile); + + OnInit_DThreshold_ForceTouch_SCapRawDataTest(strIniFile); + OnInit_DThreshold_ForceTouch_SCapCbTest(strIniFile); + + OnInit_DThreshold_SITORawdata_TxLinearityTest(strIniFile); + OnInit_DThreshold_SITORawdata_RxLinearityTest(strIniFile); + + OnInit_DThreshold_RxLinearityTest(strIniFile); + OnInit_DThreshold_TxLinearityTest(strIniFile); + + OnInit_DThreshold_PanelDifferTest(strIniFile); + OnInit_DThreshold_NoiseTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} +void OnInit_InvalidNode(char *strIniFile) +{ + + char str[MAX_PATH] = {0}, strTemp[MAX_PATH] = {0}; + int i = 0, j = 0; + + + + FTS_TEST_FUNC_ENTER(); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + sprintf(strTemp, "InvalidNode[%d][%d]", (i+1), (j+1)); + + GetPrivateProfileString("INVALID_NODE", strTemp, "1", str, strIniFile); + if (fts_atoi(str) == 0) { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 0; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 0; + FTS_TEST_DBG("node (%d, %d) \n", (i+1), (j+1)); + + } else if (fts_atoi(str) == 2) { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 2; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 2; + } else { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 1; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 1; + } + + + + + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + sprintf(strTemp, "InvalidNodeS[%d][%d]", (i+1), (j+1)); + GetPrivateProfileString("INVALID_NODES", strTemp, "1", str, strIniFile); + if (fts_atoi(str) == 0) { + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 0; + } else if (fts_atoi(str) == 2) { + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 2; + } else + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 1; + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_RawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if ((g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8716 >> 4) || (g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8736 >> 4) || (g_ScreenSetParam.iSelectedIC >> 4 == IC_FTE716 >> 4)) { + return; + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "10000", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "7000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Max", "15000", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][j] = MaxValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Low_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Min", "3000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Low_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Max", "15000", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][j] = MaxValue; + } + } + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Min", "3000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_High_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_High_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_PanelDifferTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + int index = 0; + int k = 0, i = 0, j = 0; + char str_tmp[128]; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Max_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); + +} + + +void OnInit_DThreshold_NoiseTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_GloveMode", "0", str, strIniFile); + if (1 == fts_atoi(str)) + GetPrivateProfileString("Basic_Threshold", "GloveNoiseTest_Coefficient", "100", str, strIniFile); + else + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Max", "50", str, strIniFile); + + MaxValue = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "NoistTestCoefficient_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + + +} + + +void OnInit_DThreshold_RxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "RxLinearityTest_Max", "50", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Rx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_TxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "TxLinearityTest_Max", "50", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Tx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + FTS_TEST_FUNC_EXIT(); +} + + +void OnInit_DThreshold_SITORawdata_RxLinearityTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int i = 0, j = 0; + char str_tmp[128]; + int dividerPos = 0; + int index = 0; + int k = 0; + + if (IC_FT5X46>>4 != g_ScreenSetParam.iSelectedIC>>4 && IC_FT3C47U>>4 != g_ScreenSetParam.iSelectedIC>>4) { + return; + } + + + if (IC_FT5X46>>4 == g_ScreenSetParam.iSelectedIC>>4 || IC_FT3C47U>>4 == g_ScreenSetParam.iSelectedIC>>4) { + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Rx_Hole", "10", str, strIniFile); + MaxValue = 0/*atoi(str)*/; + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "SITORawdata_Rx_Linearity_Base_Rx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + +} + + + +void OnInit_DThreshold_SITORawdata_TxLinearityTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int i = 0, j = 0; + char str_tmp[128]; + int dividerPos = 0; + int index = 0; + int k = 0; + + if (IC_FT5X46>>4 != g_ScreenSetParam.iSelectedIC>>4 && IC_FT3C47U>>4 != g_ScreenSetParam.iSelectedIC>>4) { + return; + } + + + if (IC_FT5X46>>4 == g_ScreenSetParam.iSelectedIC>>4 || IC_FT3C47U>>4 == g_ScreenSetParam.iSelectedIC>>4) { + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Tx_Hole", "10", str, strIniFile); + MaxValue = 0/*atoi(str)*/; + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "SITORawdata_Rx_Linearity_Base_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + +} + + + +void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + FTS_TEST_DBG("%s\r", strTemp); + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_Incell_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + set_max_channel_num(); + + OnInit_InvalidNode(strIniFile); + + OnInit_DThreshold_RawDataTest(strIniFile); + OnInit_DThreshold_CBTest(strIniFile); + OnInit_DThreshold_AllButtonCBTest(strIniFile); + OnThreshold_VkAndVaRawDataSeparateTest(strIniFile); + + OnInit_DThreshold_RawDataUniformityTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_CBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + if (g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8606 >> 4) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, strIniFile); + MaxValue_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, strIniFile); + MinValue_Vkey = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + + + +void OnInit_DThreshold_AllButtonCBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if (g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8606 >> 4) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + + FTS_TEST_FUNC_ENTER(); + + if ((g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8716 >> 4) && (g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8736 >> 4) && (g_ScreenSetParam.iSelectedIC >> 4 != IC_FTE716 >> 4)) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "1100", str, strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max_VKey", "1100", str, strIniFile); + MaxValue_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min_VKey", "5000", str, strIniFile); + MinValue_Vkey = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_RawDataUniformityTest(char *strIniFile) +{ + + int iBasicCHX = 0, iBasicCHY = 0; + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + GetPrivateProfileString("Basic_Threshold", "RawDataUniformityTest_CHX_Hole", "15", str, strIniFile); + iBasicCHX = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity[i][j] = iBasicCHX; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawDataUniformityTest_CHX%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataUniformityTest_CHY_Hole", "15", str, strIniFile); + iBasicCHY = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity[i][j] = iBasicCHY; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawDataUniformityTest_CHY%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data[i][j] = 20; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawDataUniformityTest_CB%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } +} + + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_global.c b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_global.c new file mode 100644 index 0000000000000..97c92650f8c88 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_global.c @@ -0,0 +1,535 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_global.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_main.h" +#include "../../focaltech_global/focaltech_ic_table.h" + +#define DEVIDE_MODE_ADDR 0x00 + +/*buff length*/ +#define BUFF_LEN_STORE_MSG_AREA 1024*10 +#define BUFF_LEN_MSG_AREA_LINE2 1024*4 +#define BUFF_LEN_STORE_DATA_AREA 1024*80 +#define BUFF_LEN_TMP_BUFFER 1024*16 + + +char *g_pTmpBuff = NULL; +char *g_pStoreMsgArea = NULL; +int g_lenStoreMsgArea = 0; +char *g_pMsgAreaLine2 = NULL; +int g_lenMsgAreaLine2 = 0; +char *g_pStoreDataArea = NULL; +int g_lenStoreDataArea = 0; +unsigned char m_ucTestItemCode = 0; +int m_iStartLine = 0; +int m_iTestDataCount = 0; +char *TestResult = NULL; +int TestResultLen = 0; + +/*ÄÚ´æÉêÇ뷽ʽ*/ +#define FTS_MALLOC_TYPE 1 +enum enum_malloc_mode { + kmalloc_mode = 0, + vmalloc_mode = 1, +}; + +struct StruScreenSeting g_ScreenSetParam; +struct stTestItem g_stTestItem[1][MAX_TEST_ITEM]; +struct structSCapConfEx g_stSCapConfEx; + +int g_TestItemNum = 0; +char g_strIcName[20] = {0}; +char *g_pStoreAllData = NULL; + + +int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile) +{ + char value[512] = {0}; + int len = 0; + + if (NULL == returnValue) { + FTS_TEST_DBG("[FTS] returnValue==NULL in function %s.", __func__); + return 0; + } + + if (ini_get_key(IniFile, section, ItemName, value) < 0) { + if (NULL != defaultvalue) + memcpy(value, defaultvalue, strlen(defaultvalue)); + sprintf(returnValue, "%s", value); + return 0; + } else { + len = sprintf(returnValue, "%s", value); + } + + return len; +} + +void focal_msleep(int ms) +{ + msleep(ms); +} + +void SysDelay(int ms) +{ + msleep(ms); +} + +int focal_abs(int value) +{ + if (value < 0) + value = 0 - value; + + return value; +} + +/************************************************************************ +* Name: SqrtNew +* Brief: calculate sqrt of input. +* Input: unsigned int n +* Output: none +* Return: sqrt of n. +***********************************************************************/ +unsigned int SqrtNew(unsigned int n) +{ + unsigned int val = 0, last = 0; + unsigned char i = 0;; + + if (n < 6) { + if (n < 2) { + return n; + } + return n/2; + } + val = n; + i = 0; + while (val > 1) { + val >>= 1; + i++; + } + val <<= (i >> 1); + val = (val + val + val) >> 1; + do { + last = val; + val = ((val + n/val) >> 1); + } while (focal_abs(val-last) > pre); + return val; +} + +void *fts_malloc(size_t size) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kmalloc(size, GFP_ATOMIC); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vmalloc(size); + } else { + FTS_TEST_DBG("invalid malloc. \n"); + return NULL; + } + + return NULL; +} + +void fts_free(void *p) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kfree(p); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vfree(p); + } else { + FTS_TEST_DBG("invalid free. \n"); + return ; + } + + return ; +} + +void OnInit_InterfaceCfg(char *strIniFile) +{ + char str[128] = {0}; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Interface", "IC_Type", "FT5X36", str, strIniFile); + g_ScreenSetParam.iSelectedIC = fts_ic_table_get_ic_code_from_ic_name(str); + FTS_TEST_INFO(" IC code :0x%02x. ", g_ScreenSetParam.iSelectedIC); + + + GetPrivateProfileString("Interface", "Normalize_Type", 0, str, strIniFile); + g_ScreenSetParam.isNormalize = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); + +} +/************************************************************************ +* Name: ReadReg(Same function name as FT_MultipleTest) +* Brief: Read Register +* Input: RegAddr +* Output: RegData +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int ReadReg(unsigned char RegAddr, unsigned char *RegData) +{ + int iRet; + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + iRet = fts_i2c_read_test(&RegAddr, 1, RegData, 1); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} + +/************************************************************************ +* Name: WriteReg(Same function name as FT_MultipleTest) +* Brief: Write Register +* Input: RegAddr, RegData +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int WriteReg(unsigned char RegAddr, unsigned char RegData) +{ + int iRet; + unsigned char cmd[2] = {0}; + if (NULL == fts_i2c_write_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_write_test == NULL !!!", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + cmd[0] = RegAddr; + cmd[1] = RegData; + iRet = fts_i2c_write_test(cmd, 2); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: Comm_Base_IIC_IO(Same function name as FT_MultipleTest) +* Brief: Write/Read Data by IIC +* Input: pWriteBuffer, iBytesToWrite, iBytesToRead +* Output: pReadBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead) +{ + int iRet; + + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + if (iBytesToRead > 0) { + iRet = fts_i2c_read_test(pWriteBuffer, iBytesToWrite, pReadBuffer, iBytesToRead); + } else { + iRet = fts_i2c_write_test(pWriteBuffer, iBytesToWrite); + } + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: EnterWork(Same function name as FT_MultipleTest) +* Brief: Enter Work Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char EnterWork(void) +{ + unsigned char RunState = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = WriteReg(DEVIDE_MODE_ADDR, 0); + if (ReCode == ERROR_CODE_OK) { + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } else + FTS_TEST_ERROR("EnterWork read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("EnterWork write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("EnterWork read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} +/************************************************************************ +* Name: EnterFactory +* Brief: enter Fcatory Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0 is OK, else fail. +***********************************************************************/ +unsigned char EnterFactory(void) +{ + unsigned char RunState = 0; + int index = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = WriteReg(DEVIDE_MODE_ADDR, 0x40); + if (ReCode == ERROR_CODE_OK) { + for (index = 0; index < 20; ++index) { + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + break; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } + SysDelay(50); + } + if (ReCode != ERROR_CODE_OK) + FTS_TEST_ERROR("EnterFactory read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("EnterFactory write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("EnterFactory read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + return ReCode; +} + +/************************************************************************ +* Name: fts_SetTestItemCodeName +* Brief: set test item code and name +* Input: null +* Output: null +* Return: +**********************************************************************/ + +void fts_SetTestItemCodeName(unsigned char ucitemcode) +{ + g_stTestItem[0][g_TestItemNum].ItemCode = ucitemcode; + + g_stTestItem[0][g_TestItemNum].TestNum = g_TestItemNum; + g_stTestItem[0][g_TestItemNum].TestResult = RESULT_NULL; + g_TestItemNum++; +} + +/************************************************************************ +* Name: InitTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int InitTest(void) +{ + int ret = 0; + ret = AllocateMemory(); + if (ret < 0) + return -EPERM; + + InitStoreParamOfTestData(); + + g_stSCapConfEx.ChannelXNum = 0; + g_stSCapConfEx.ChannelYNum = 0; + g_stSCapConfEx.KeyNum = 0; + g_stSCapConfEx.KeyNumTotal = 6; + + return 0; + +} + +/************************************************************************ +* Name: FinishTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void FinishTest(void) +{ + MergeAllTestData(); + FreeMemory(); +} + + +/************************************************************************ +* Name: InitStoreParamOfTestData +* Brief: Init store param of test data +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void InitStoreParamOfTestData(void) +{ + g_lenStoreMsgArea = 0; + + g_lenStoreMsgArea += sprintf(g_pStoreMsgArea, "ECC, 85, 170, IC Name, %s, IC Code, %x\n", g_strIcName, g_ScreenSetParam.iSelectedIC); + + + + g_lenMsgAreaLine2 = 0; + + + + g_lenStoreDataArea = 0; + m_iStartLine = 11; + + m_iTestDataCount = 0; +} +/************************************************************************ +* Name: MergeAllTestData +* Brief: Merge All Data of test result +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void MergeAllTestData(void) +{ + int iLen = 0; + + + iLen = sprintf(g_pTmpBuff, "TestItem, %d, ", m_iTestDataCount); + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pTmpBuff, iLen); + g_lenStoreMsgArea += iLen; + + + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pMsgAreaLine2, g_lenMsgAreaLine2); + g_lenStoreMsgArea += g_lenMsgAreaLine2; + + + iLen = sprintf(g_pTmpBuff, "\n\n\n\n\n\n\n\n\n"); + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pTmpBuff, iLen); + g_lenStoreMsgArea += iLen; + + + memcpy(g_pStoreAllData, g_pStoreMsgArea, g_lenStoreMsgArea); + + + if (0 != g_lenStoreDataArea) { + memcpy(g_pStoreAllData+g_lenStoreMsgArea, g_pStoreDataArea, g_lenStoreDataArea); + } + + + + FTS_TEST_DBG("lenStoreMsgArea=%d, lenStoreDataArea = %d", g_lenStoreMsgArea, g_lenStoreDataArea); +} + + + +/************************************************************************ +* Name: AllocateMemory +* Brief: Allocate pointer Memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int AllocateMemory(void) +{ + + g_pStoreMsgArea = NULL; + if (NULL == g_pStoreMsgArea) + g_pStoreMsgArea = fts_malloc(BUFF_LEN_STORE_MSG_AREA); + if (NULL == g_pStoreMsgArea) + goto ERR; + + g_pMsgAreaLine2 = NULL; + if (NULL == g_pMsgAreaLine2) + g_pMsgAreaLine2 = fts_malloc(BUFF_LEN_MSG_AREA_LINE2); + if (NULL == g_pMsgAreaLine2) + goto ERR; + + g_pStoreDataArea = NULL; + if (NULL == g_pStoreDataArea) + g_pStoreDataArea = fts_malloc(BUFF_LEN_STORE_DATA_AREA); + if (NULL == g_pStoreDataArea) + goto ERR; + + g_pTmpBuff = NULL; + if (NULL == g_pTmpBuff) + g_pTmpBuff = fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == g_pTmpBuff) + goto ERR; + + TestResult = NULL; + if (NULL == TestResult) + TestResult = fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == TestResult) + goto ERR; + + return 0; + +ERR: + FTS_TEST_ERROR("fts_malloc memory failed in function."); + return -EPERM; + +} + +/************************************************************************ +* Name: FreeMemory +* Brief: Release pointer memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void FreeMemory(void) +{ + + if (NULL != g_pStoreMsgArea) + fts_free(g_pStoreMsgArea); + + if (NULL != g_pMsgAreaLine2) + fts_free(g_pMsgAreaLine2); + + if (NULL != g_pStoreDataArea) + fts_free(g_pStoreDataArea); + + if (NULL != g_pTmpBuff) + fts_free(g_pTmpBuff); + + +} + + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_ini.c b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_ini.c new file mode 100644 index 0000000000000..d5eba110d32d0 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_ini.c @@ -0,0 +1,432 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_main.h" + + +char CFG_SSL = '['; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char CFG_SSR = ']'; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char CFG_NIS = ':'; /* Separator between name and index */ +char CFG_NTS = '#'; /* annotator */ +char CFG_EQS = '='; /* The equal sign */ + + +ST_INI_FILE_DATA *g_st_ini_file_data = NULL; +int g_used_key_num = 0; + + +static int ini_file_get_line(char *filedata, char *buffer, int maxlen); +static long fts_atol(char *nptr); + + +/* Works only for digits and letters, but small and fast */ +#define TOLOWER(x) ((x) | 0x20) + +int fts_strncmp(const char *cs, const char *ct, size_t count) +{ + unsigned char c1 = 0, c2 = 0; + + while (count) { + c1 = TOLOWER(*cs++); + c2 = TOLOWER(*ct++); + if (c1 != c2) + return c1 < c2 ? -1 : 1; + if (!c1) + break; + count--; + } + return 0; +} + +/************************************************************* +Function: Get the value of key +Input: char * filedata; char * section; char * key +Output: char * value¡¡key +Return: 0 SUCCESS + -1 can not find section + -2 can not find key + -10 File open failed + -12 File read failed + -14 File format error + -22 Out of buffer size +Note: +*************************************************************/ +int ini_get_key(char *filedata, char *section, char *key, char *value) +{ + int i = 0; + int ret = -2; + for (i = 0; i < g_used_key_num; i++) { + if (fts_strncmp(section, g_st_ini_file_data[i].pSectionName, + g_st_ini_file_data[i].iSectionNameLen) != 0) + continue; + + if (strlen(key) == g_st_ini_file_data[i].iKeyNameLen) { + if (fts_strncmp(key, g_st_ini_file_data[i].pKeyName, g_st_ini_file_data[i].iKeyNameLen) == 0) + + { + memcpy(value, g_st_ini_file_data[i].pKeyValue, g_st_ini_file_data[i].iKeyValueLen); + ret = 0; + break; + } + } + } + + return ret; +} + +/************************************************************* +Function: Remove empty character on the right side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ini_str_trim_r(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + for (i = 0; i < len; i++) { + if (buf[i] != ' ') + break; + } + if (i < len) { + strncpy(tmp, (buf+i), (len-i)); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Remove empty character on the left side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ini_str_trim_l(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + + for (i = 0; i < len; i++) { + if (buf[len-i-1] != ' ') + break; + } + if (i < len) { + strncpy(tmp, buf, len-i); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Read a line from file +Input: FILE *fp; int maxlen-- Maximum length of buffer +Output: char *buffer -- A string +Return: >0 Actual read length + -1 End of file + -2 Error reading file +Note: +*************************************************************/ +static int ini_file_get_line(char *filedata, char *buffer, int maxlen) +{ + int i = 0; + int j = 0; + int iRetNum = -1; + char ch1 = '\0'; + + for (i = 0, j = 0; i < maxlen; j++) { + ch1 = filedata[j]; + iRetNum = j+1; + if (ch1 == '\n' || ch1 == '\r') { + ch1 = filedata[j+1]; + if (ch1 == '\n' || ch1 == '\r') { + iRetNum++; + } + + break; + } else if (ch1 == 0x00) { + iRetNum = -1; + break; + } else { + buffer[i++] = ch1; /* ignore carriage return */ + } + } + buffer[i] = '\0'; + + return iRetNum; +} + +int my_fts_atoi(const char *str) +{ + int result = 0; + int signal = 1; /* The default is positive number*/ + if ((*str >= '0' && *str <= '9') || *str == '-' || *str == '+') { + if (*str == '-' || *str == '+') { + if (*str == '-') + signal = -1; /*enter negative number*/ + str++; + } + } else + return 0; + /*start transform*/ + while (*str >= '0' && *str <= '9') + result = result*10 + (*str++ - '0'); + + return signal*result; +} + +int isspace(int x) +{ + if (x == ' ' || x == '\t' || x == '\n' || x == '\f' || x == '\b' || x == '\r') + return 1; + else + return 0; +} + +int isdigit(int x) +{ + if (x <= '9' && x >= '0') + return 1; + else + return 0; + +} + +static long fts_atol(char *nptr) +{ + int c; /* current char */ + long total; /* current total */ + int sign; /* if ''-'', then negative, otherwise positive */ + /* skip whitespace */ + while (isspace((int)(unsigned char)*nptr)) + ++nptr; + c = (int)(unsigned char)*nptr++; + sign = c; /* save sign indication */ + if (c == '-' || c == '+') + c = (int)(unsigned char)*nptr++; /* skip sign */ + total = 0; + while (isdigit(c)) { + total = 10 * total + (c - '0'); /* accumulate digit */ + c = (int)(unsigned char)*nptr++; /* get next char */ + } + if (sign == '-') + return -total; + else + return total; /* return result, negated if necessary */ +} + +int fts_atoi(char *nptr) +{ + return (int)fts_atol(nptr); +} + +int init_key_data(void) +{ + int i = 0; + + FTS_TEST_FUNC_ENTER(); + + g_used_key_num = 0; + + g_st_ini_file_data = NULL; + if (NULL == g_st_ini_file_data) + g_st_ini_file_data = fts_malloc(sizeof(ST_INI_FILE_DATA)*MAX_KEY_NUM); + if (NULL == g_st_ini_file_data) { + FTS_TEST_ERROR("fts_malloc failed in function."); + return -EPERM; + } + for (i = 0; i < MAX_KEY_NUM; i++) { + memset(g_st_ini_file_data[i].pSectionName, 0, MAX_KEY_NAME_LEN); + memset(g_st_ini_file_data[i].pKeyName, 0, MAX_KEY_NAME_LEN); + memset(g_st_ini_file_data[i].pKeyValue, 0, MAX_KEY_VALUE_LEN); + g_st_ini_file_data[i].iSectionNameLen = 0; + g_st_ini_file_data[i].iKeyNameLen = 0; + g_st_ini_file_data[i].iKeyValueLen = 0; + } + + FTS_TEST_FUNC_EXIT(); + return 1; +} + +int release_key_data(void) +{ + if (NULL != g_st_ini_file_data) + fts_free(g_st_ini_file_data); + + return 0; +} +int print_key_data(void) +{ + int i = 0; + + + + FTS_TEST_DBG("g_used_key_num = %d", g_used_key_num); + for (i = 0; i < MAX_KEY_NUM; i++) { + + FTS_TEST_DBG("pSectionName_%d:%s, pKeyName_%d:%s\n,pKeyValue_%d:%s", + i, g_st_ini_file_data[i].pSectionName, + i, g_st_ini_file_data[i].pKeyName, + i, g_st_ini_file_data[i].pKeyValue + ); + + } + + return 1; +} +/************************************************************* +Function: Read all the parameters and values to the structure. +Return: Returns the number of key. If you go wrong, return a negative number. + -10 File open failed + -12 File read failed + -14 File format error +Note: +*************************************************************/ +int ini_get_key_data(char *filedata) +{ + + char buf1[MAX_CFG_BUF + 1] = {0}; + int n = 0; + int ret = 0; + int dataoff = 0; + int iEqualSign = 0; + int i = 0; + char tmpSectionName[MAX_CFG_BUF + 1] = {0}; + + + + FTS_TEST_FUNC_ENTER(); + + ret = init_key_data();/*init*/ + if (ret < 0) { + return -EPERM; + } + + g_used_key_num = 0; + while (1) {/*find section */ + ret = CFG_ERR_READ_FILE; + n = ini_file_get_line(filedata+dataoff, buf1, MAX_CFG_BUF); + if (n < -1) + goto cfg_scts_end; + if (n < 0) + break;/* file end */ + if (n >= MAX_CFG_BUF) { + FTS_TEST_ERROR("Error Length:%d\n", n); + goto cfg_scts_end; + } + + dataoff += n; + + n = strlen(ini_str_trim_l(ini_str_trim_r(buf1))); + if (n == 0 || buf1[0] == CFG_NTS) + continue; /* A blank line or a comment line */ + ret = CFG_ERR_FILE_FORMAT; + + if (n > 2 && ((buf1[0] == CFG_SSL && buf1[n-1] != CFG_SSR))) { + FTS_TEST_ERROR("Bad Section:%s\n", buf1); + goto cfg_scts_end; + } + + + if (buf1[0] == CFG_SSL) { + g_st_ini_file_data[g_used_key_num].iSectionNameLen = n-2; + if (MAX_KEY_NAME_LEN < g_st_ini_file_data[g_used_key_num].iSectionNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + + buf1[n-1] = 0x00; + strcpy((char *)tmpSectionName, buf1+1); + + + continue; + } + + + strcpy(g_st_ini_file_data[g_used_key_num].pSectionName, tmpSectionName); + g_st_ini_file_data[g_used_key_num].iSectionNameLen = strlen(tmpSectionName); + + iEqualSign = 0; + for (i = 0; i < n; i++) { + if (buf1[i] == CFG_EQS) { + iEqualSign = i; + break; + } + } + if (0 == iEqualSign) + continue; + /* before equal sign is assigned to the key name*/ + g_st_ini_file_data[g_used_key_num].iKeyNameLen = iEqualSign; + if (MAX_KEY_NAME_LEN < g_st_ini_file_data[g_used_key_num].iKeyNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(g_st_ini_file_data[g_used_key_num].pKeyName, + buf1, g_st_ini_file_data[g_used_key_num].iKeyNameLen); + + /* After equal sign is assigned to the key value*/ + g_st_ini_file_data[g_used_key_num].iKeyValueLen = n-iEqualSign-1; + if (MAX_KEY_VALUE_LEN < g_st_ini_file_data[g_used_key_num].iKeyValueLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_VALUE_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(g_st_ini_file_data[g_used_key_num].pKeyValue, + buf1 + iEqualSign+1, g_st_ini_file_data[g_used_key_num].iKeyValueLen); + + + ret = g_used_key_num; + + g_used_key_num++; /*Parameter number accumulation*/ + if (MAX_KEY_NUM < g_used_key_num) { + ret = CFG_ERR_TOO_MANY_KEY_NUM; + FTS_TEST_ERROR("MAX_KEY_NUM: CFG_ERR_TOO_MANY_KEY_NUM\n"); + goto cfg_scts_end; + } + } + + + + FTS_TEST_FUNC_EXIT(); + + return 0; + +cfg_scts_end: + + FTS_TEST_FUNC_EXIT(); + return ret; +} + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_main.c b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_main.c new file mode 100644 index 0000000000000..4f5dd43dbe8b2 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_main.c @@ -0,0 +1,253 @@ +/************************************************************************ +* Copyright (C) 2012-2016, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#include +#include +#include +#include + + + +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_ini.h" +#include "../../focaltech_global/focaltech_ic_table.h" + + +#define FTS_TEST_STORE_DATA_SIZE 80*1024 + +FTS_I2C_READ_FUNCTION fts_i2c_read_test; +FTS_I2C_WRITE_FUNCTION fts_i2c_write_test; + +char *g_testparamstring = NULL; + +struct StTestFuncs g_stTestFuncs; + + +int init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read) +{ + unsigned char value = 0; + unsigned char recode = 0; + + FTS_TEST_FUNC_ENTER(); + + fts_i2c_read_test = fpI2C_Read; + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL ", __func__); + } + + + recode = ReadReg(0xa6, &value); + if (recode != ERROR_CODE_OK) { + FTS_TEST_ERROR("[focal] ReadReg Error, code: %d ", recode); + } else { + FTS_TEST_DBG("[focal] ReadReg successed, Addr: 0xa6, value: 0x%02x ", value); + } + + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +int init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write) +{ + FTS_TEST_FUNC_ENTER(); + + fts_i2c_write_test = fpI2C_Write; + if (NULL == fts_i2c_write_test) { + FTS_TEST_ERROR("[focal] fts_i2c_read_test == NULL "); + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + + +/************************************************************************ +* Name: set_param_data +* Brief: load Config. Set IC series, init test items, init basic threshold, int detailThreshold, and set order of test items +* Input: TestParamData, from ini file. +* Output: none +* Return: 0. No sense, just according to the old format. +***********************************************************************/ +int set_param_data(char *TestParamData) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + + g_testparamstring = TestParamData; + + ret = ini_get_key_data(g_testparamstring); + if (ret < 0) { + FTS_TEST_ERROR("ini_get_key_data error."); + return ret; + } + + + + OnInit_InterfaceCfg(g_testparamstring); + + /*Get IC Name*/ + fts_ic_table_get_ic_name_from_ic_code(g_ScreenSetParam.iSelectedIC, g_strIcName); + + + + if (g_stTestFuncs.OnInit_TestItem) { + g_stTestFuncs.OnInit_TestItem(g_testparamstring); + + } + + if (g_stTestFuncs.OnInit_BasicThreshold) { + g_stTestFuncs.OnInit_BasicThreshold(g_testparamstring); + + + } + + if (IC_Capacitance_Type == Self_Capacitance) { + OnInit_SCap_DetailThreshold(g_testparamstring); + } else if (IC_Capacitance_Type == Mutual_Capacitance) { + OnInit_MCap_DetailThreshold(g_testparamstring); + } else if (IC_Capacitance_Type == IDC_Capacitance) { + OnInit_Incell_DetailThreshold(g_testparamstring); + } + + if (g_stTestFuncs.SetTestItem) { + g_stTestFuncs.SetTestItem(); + } + + FTS_TEST_FUNC_EXIT(); + + return 0; +} + +/************************************************************************ +* Name: start_test_tp +* Brief: Test entry. Select test items based on IC series +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ + +boolean start_test_tp(void) +{ + boolean bTestResult = false; + + FTS_TEST_FUNC_ENTER(); + + FTS_TEST_DBG("IC_%s Test", g_strIcName); + + if (g_stTestFuncs.Start_Test) { + + bTestResult = g_stTestFuncs.Start_Test(); + + } else { + FTS_TEST_DBG("[Focal]Start_Test func null!\n"); + bTestResult = false; + } + + EnterWork(); + + FTS_TEST_FUNC_EXIT(); + + return bTestResult; +} +/************************************************************************ +* Name: get_test_data +* Brief: Get test data based on IC series +* Input: none +* Output: pTestData, External application for memory, buff size >= 1024*8 +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int get_test_data(char *pTestData) +{ + int iLen = 0; + FTS_TEST_DBG("[focal] %s start ", __func__); + + + if (g_stTestFuncs.Get_test_data) { + + iLen = g_stTestFuncs.Get_test_data(pTestData); + + } else { + FTS_TEST_DBG("[Focal]Get_test_data func null!\n"); + } + + FTS_TEST_FUNC_EXIT(); + return iLen; +} + +int focaltech_test_main_init(void) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + + /*Allocate memory, storage test results*/ + g_pStoreAllData = NULL; + if (NULL == g_pStoreAllData) + g_pStoreAllData = fts_malloc(FTS_TEST_STORE_DATA_SIZE); + if (NULL == g_pStoreAllData) + return -EPERM; + + /* Allocate memory, assigned to detail threshold structure*/ + ret = malloc_struct_DetailThreshold(); + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} +/************************************************************************ +* Name: free_test_param_data +* Brief: release printer memory +* Input: none +* Output: none +* Return: none. +***********************************************************************/ +int focaltech_test_main_exit(void) +{ + + FTS_TEST_DBG("[focal] release memory -start."); + + TestResultLen = 0; + + /* Release memory test results */ + if (NULL != g_pStoreAllData) { + FTS_TEST_DBG("[FTS] release memory g_pStoreAllData."); + fts_free(g_pStoreAllData); + g_pStoreAllData = NULL; + } + + + if (NULL != TestResult) { + fts_free(TestResult); + TestResult = NULL; + } + + + /* Releasing the memory of the detailed threshold structure */ + FTS_TEST_DBG("[FTS] release memory free_struct_DetailThreshold."); + free_struct_DetailThreshold(); + + + /* release memory of key data for ini file */ + release_key_data(); + FTS_TEST_DBG("[focal] release memory -end."); + return 0; +} + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/Makefile b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/Makefile new file mode 100644 index 0000000000000..7db0f9243b1f2 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/Makefile @@ -0,0 +1,10 @@ +#drivers/input/touchscreen/mediatek/focaltech_ts/focaltech_test +# +# Makefile for test module +# +# Linux driver folder + + +obj-y += focaltech_test_config_ft5x46.o +obj-y += focaltech_test_ft5x46.o +obj-y += focaltech_test_supported_ic.o diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_config_ft5x46.c b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_config_ft5x46.c new file mode 100644 index 0000000000000..70aef9a55873d --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_config_ft5x46.c @@ -0,0 +1,524 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: Focaltech_test_config_ft5x46.c +* +* Author: Software Development Team, AE +* +* Created: 2015-07-14 +* +* Abstract: Set Config for FT5X46\FT5X46i\FT5526\FT3X17\FT5436\FT3X27\FT5526i\FT5416\FT5426\FT5435 +* +************************************************************************/ +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + + +#if (FT5X46_TEST) + + +struct stCfg_FT5X46_TestItem g_stCfg_FT5X46_TestItem; +struct stCfg_FT5X46_BasicThreshold g_stCfg_FT5X46_BasicThreshold; + +void OnInit_FT5X46_TestItem(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("TestItem", "FW_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.FW_VERSION_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "FACTORY_ID_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.FACTORY_ID_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "PROJECT_CODE_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.PROJECT_CODE_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "IC_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.IC_VERSION_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "LCM_ID_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.LCM_ID_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "RAWDATA_TEST", "1", str, strIniFile); + g_stCfg_FT5X46_TestItem.RAWDATA_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "ADC_DETECT_TEST", "1", str, strIniFile); + g_stCfg_FT5X46_TestItem.ADC_DETECT_TEST = fts_atoi(str); + + GetPrivateProfileString("TestItem", "SCAP_CB_TEST", "1", str, strIniFile); + g_stCfg_FT5X46_TestItem.SCAP_CB_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "SCAP_RAWDATA_TEST", "1", str, strIniFile); + g_stCfg_FT5X46_TestItem.SCAP_RAWDATA_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "CHANNEL_NUM_TEST", "1", str, strIniFile); + g_stCfg_FT5X46_TestItem.CHANNEL_NUM_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "INT_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.INT_PIN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "RESET_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.RESET_PIN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.NOISE_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "WEAK_SHORT_CIRCUIT_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.WEAK_SHORT_CIRCUIT_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "UNIFORMITY_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "CM_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.CM_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "RAWDATA_MARGIN_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.RAWDATA_MARGIN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "PANEL_DIFFER_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.PANEL_DIFFER_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "PANEL_DIFFER_UNIFORMITY_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.PANEL_DIFFER_UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "TE_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.TE_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "SITO_RAWDATA_UNIFORMITY_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.SITO_RAWDATA_UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "PATTERN_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.PATTERN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "LCD_NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.LCD_NOISE_TEST = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); +} +void OnInit_FT5X46_BasicThreshold(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "FW_VER_VALUE", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.FW_VER_VALUE = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Factory_ID_Number", "255", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Factory_ID_Number = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Project_Code", " ", str, strIniFile); + + sprintf(g_stCfg_FT5X46_BasicThreshold.Project_Code, "%s", str); + + + GetPrivateProfileString("Basic_Threshold", "IC_Version", "3", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.IC_Version = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "LCM_ID", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.LCM_ID = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Min", "3000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_low_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Max", "15000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_Low_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Min", "3000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_high_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Max", "15000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_high_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_LowFreq", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_SetLowFreq = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_HighFreq", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_SetHighFreq = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "Adc_Detect_Max", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.AdcDetect_Max = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Min", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_OFF_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Max", "240", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_OFF_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Min", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_ON_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Max", "240", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_ON_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ScapCBTest_SetWaterproof_OFF", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_SetWaterproof_OFF = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ScapCBTest_SetWaterproof_ON", "240", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_SetWaterproof_ON = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapCBTest_LetTx_Disable", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_LetTx_Disable = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Min", "5000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_OFF_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Max", "8500", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_OFF_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Min", "5000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_ON_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Max", "8500", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_ON_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_SetWaterproof_OFF", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_SetWaterproof_OFF = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_SetWaterproof_ON", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_SetWaterproof_ON = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_LetTx_Disable", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_LetTx_Disable = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_Mapping", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bChannelTestMapping = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_NoMapping", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bChannelTestNoMapping = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_TxNum", "13", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.ChannelNumTest_TxNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_RxNum", "24", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.ChannelNumTest_RxNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_Tx_NP_Num", "13", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.ChannelNumTest_TxNpNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_Rx_NP_Num", "24", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.ChannelNumTest_RxNpNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ResetPinTest_RegAddr", "136", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.ResetPinTest_RegAddr = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "IntPinTest_RegAddr", "79", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.IntPinTest_RegAddr = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "IntPinTest_TestNum", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.IntPinTest_TestNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Max", "20", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_Max = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Frames", "32", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_Frames = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Time", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_Time = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_SampeMode", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_SampeMode = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_NoiseMode", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_NoiseMode = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_ShowTip", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_ShowTip = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_GloveMode", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bNoiseTest_GloveMode = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_RawdataMin", "5000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_RawdataMin = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "GloveNoiseTest_Coefficient", "100", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.GloveNoiseTest_Coefficient = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "Set_Frequency", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Set_Frequency = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseThreshold_Choose", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bNoiseThreshold_Choose = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Threshold", "50", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_Threshold = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_MinNGFrame", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_MinNgFrame = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_TPToolProcess", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bNoiseTest_TPToolProcess = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "WeakShortTest_CG", "2000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CG = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "WeakShortTest_CC", "2000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CC = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "UniformityTest_Check_Tx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_CheckTx = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "UniformityTest_Check_Rx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_CheckRx = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "UniformityTest_Check_MinMax", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_CheckMinMax = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "UniformityTest_Tx_Hole", "20", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_Tx_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "UniformityTest_Rx_Hole", "20", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_Rx_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "UniformityTest_MinMax_Hole", "70", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_MinMax_Hole = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CMTest_Check_Min", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.CMTest_CheckMin = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CMTest_Check_Max", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.CMTest_CheckMax = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CMTest_Min_Hole", "0.5", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.CMTest_MinHole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CMTest_Max_Hole", "5", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.CMTest_MaxHole = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawdataMarginTest_Min", "10", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawdataMarginTest_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawdataMarginTest_Max", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawdataMarginTest_Max = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Min", "150", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDifferTest_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Max", "1000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDifferTest_Max = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_Check_Tx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_Check_Tx = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_Check_Rx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_Check_Rx = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_Check_MinMax", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_Check_MinMax = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_Tx_Hole", "20", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_Tx_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_Rx_Hole", "20", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_Rx_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_MinMax_Hole", "70", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_MinMax_Hole = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Check_Tx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SITO_RawdtaUniformityTest_Check_Tx = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Check_Rx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SITO_RawdtaUniformityTest_Check_Rx = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Tx_Hole", "10", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SITO_RawdtaUniformityTest_Tx_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Rx_Hole", "10", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SITO_RawdtaUniformityTest_Rx_Hole = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "PramTest_Check_00", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bPattern00 = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PramTest_Check_FF", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bPatternFF = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PramTest_Check_55", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bPattern55 = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PramTest_Check_AA", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bPatternAA = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PramTest_Check_BIN", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bPatternBin = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "WeakShortTest_CC_Rsen", "57", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CC_Rsen = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "WeakShortTest_CapShortTest", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CapShortTest = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_Max_Frame", "200", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_MaxFrame = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_Conficient", "100", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_Conficient = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_Mode", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_Noise_Mode = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_MaxNgPoint", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_MaxNgPoint = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_FrameNum", "63", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_FrameNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_SetFrequency", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_SetFrequency = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_NoiseThresholdMode", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_NoiseThresholdMode = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_NoiseCoefficient", "200", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_NoiseCoefficient = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_NoiseMax", "50", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_NoiseMax = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); +} + +void SetTestItem_FT5X46(void) +{ + + g_TestItemNum = 0; + + FTS_TEST_FUNC_ENTER(); + + + if (g_stCfg_FT5X46_TestItem.RESET_PIN_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_RESET_PIN_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.FACTORY_ID_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_FACTORY_ID_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.PROJECT_CODE_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_PROJECT_CODE_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.FW_VERSION_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_FW_VERSION_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.LCM_ID_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_LCM_ID_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.IC_VERSION_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_IC_VERSION_TEST); + } + + + + fts_SetTestItemCodeName(Code_FT5X46_ENTER_FACTORY_MODE); + + + if (g_stCfg_FT5X46_TestItem.TE_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_TE_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.CHANNEL_NUM_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_CHANNEL_NUM_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.LCD_NOISE_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_LCD_NOISE_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.NOISE_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_NOISE_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.RAWDATA_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_RAWDATA_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.UNIFORMITY_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_UNIFORMITY_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.SITO_RAWDATA_UNIFORMITY_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_SITO_RAWDATA_UNIFORMITY_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.CM_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_CM_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.ADC_DETECT_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_ADCDETECT_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.SCAP_CB_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_SCAP_CB_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.SCAP_RAWDATA_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_SCAP_RAWDATA_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.RAWDATA_MARGIN_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_RAWDATA_MARGIN_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.WEAK_SHORT_CIRCUIT_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_WEAK_SHORT_CIRCUIT_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.PANEL_DIFFER_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_PANELDIFFER_TEST); + } + + if (g_stCfg_FT5X46_TestItem.PANEL_DIFFER_UNIFORMITY_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_PANELDIFFER_UNIFORMITY_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.INT_PIN_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_INT_PIN_TEST); + } + + FTS_TEST_FUNC_EXIT(); +} + +#endif + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_ft5x46.c b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_ft5x46.c new file mode 100644 index 0000000000000..fff3e01b95de8 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_ft5x46.c @@ -0,0 +1,2327 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: Focaltech_test_ft5x46.c +* +* Author: Software Development Team, AE +* +* Created: 2015-07-14 +* +* Abstract: test item for FT5X46\FT5X46i\FT5526\FT3X17\FT5436\FT3X27\FT5526i\FT5416\FT5426\FT5435 +* +************************************************************************/ + +/******************************************************************************* +* Included header files +*******************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" +#include "../../focaltech_global/focaltech_ic_table.h" + + +#if (FT5X46_TEST) + + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ + + + + +#define SPECIAL_TEST_FOR_MEIZU_EN 0 + + +#define DEVIDE_MODE_ADDR 0x00 +#define REG_LINE_NUM 0x01 +#define REG_TX_NUM 0x02 +#define REG_RX_NUM 0x03 +#define REG_PATTERN_5422 0x53 +#define REG_MAPPING_SWITCH 0x54 +#define REG_TX_NOMAPPING_NUM 0x55 +#define REG_RX_NOMAPPING_NUM 0x56 +#define REG_NORMALIZE_TYPE 0x16 +#define REG_ScCbBuf0 0x4E +#define REG_ScWorkMode 0x44 +#define REG_ScCbAddrR 0x45 +#define REG_RawBuf0 0x36 +#define REG_WATER_CHANNEL_SELECT 0x09 +#define REG_FW_PROCESS 0x1A +#define REG_NOISE_SAMPLE_FRAME 0X1C +#define REG_LCD_NOISE_CONFICIENT 0X0F +#define REG_LCD_NOISE_MAX_NG 0X10 +#define REG_LCD_NOISE_MODE 0X1B +#define REG_LCD_NOISE_FRAMEFAILED 0X11 +#define REG_RELEASECODEID_H 0xAE +#define REG_RELEASECODEID_L 0xAF +#define MAX_NOISE_FRAMES 200 + +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ +enum WaterproofType { + WT_NeedProofOnTest, + WT_NeedProofOffTest, + WT_NeedTxOnVal, + WT_NeedRxOnVal, + WT_NeedTxOffVal, + WT_NeedRxOffVal, +}; + +enum NOISE_TYPE { + NT_AvgData = 0, + NT_MaxData = 1, + NT_MaxDevication = 2, + NT_DifferData = 3, +}; + +/******************************************************************************* +* Static variables +*******************************************************************************/ + +static int m_RawData[TX_NUM_MAX][RX_NUM_MAX] = {{0} } ; +static int m_iTempRawData[TX_NUM_MAX * RX_NUM_MAX] = {0}; +static unsigned char m_ucTempData[TX_NUM_MAX * RX_NUM_MAX*2] = {0}; +static bool m_bV3TP; + + +static int m_DifferData[TX_NUM_MAX][RX_NUM_MAX] = {{0} } ; +static int m_absDifferData[TX_NUM_MAX][RX_NUM_MAX] = {{0} } ; + + + + + + + + + + + + + + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ +extern struct stCfg_FT5X46_BasicThreshold g_stCfg_FT5X46_BasicThreshold; + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ + +static int StartScan(void); +static unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer); +static unsigned char GetPanelRows(unsigned char *pPanelRows); +static unsigned char GetPanelCols(unsigned char *pPanelCols); +static unsigned char GetTxSC_CB(unsigned char index, unsigned char *pcbValue); +static unsigned char GetRawData(void); +static unsigned char GetChannelNum(void); +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount); +static void ShowRawData(void); +static boolean GetTestCondition(int iTestType, unsigned char ucChannelValue); +static unsigned char GetChannelNumNoMapping(void); +static unsigned char SwitchToNoMapping(void); +static unsigned char WeakShort_GetAdcData(int AllAdcDataLen, int *pRevBuffer); + + + + +boolean FT5X46_StartTest(void); +int FT5X46_get_test_data(char *pTestData); + + +unsigned char FT5X46_TestItem_EnterFactoryMode(void); +unsigned char FT5X46_TestItem_RawDataTest(bool *bTestResult); +unsigned char FT5X46_TestItem_SCapRawDataTest(bool *bTestResult); +unsigned char FT5X46_TestItem_SCapCbTest(bool *bTestResult); +unsigned char FT5X46_TestItem_PanelDifferTest(bool *bTestResult); +unsigned char FT5X46_TestItem_WeakShortTest(bool *bTestResult); + + + +/************************************************************************ +* Name: FT5X46_StartTest +* Brief: Test entry. Determine which test item to test +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ +boolean FT5X46_StartTest() +{ + bool bTestResult = true; + bool bTempResult = 1; + unsigned char ReCode = 0; + unsigned char ucDevice = 0; + int iItemCount = 0; + + FTS_TEST_FUNC_ENTER(); + + + if (InitTest() < 0) { + FTS_TEST_ERROR("[focal] Failed to init test."); + return false; + } + + + if (0 == g_TestItemNum) + bTestResult = false; + + + for (iItemCount = 0; iItemCount < g_TestItemNum; iItemCount++) { + m_ucTestItemCode = g_stTestItem[ucDevice][iItemCount].ItemCode; + + + if (Code_FT5X46_ENTER_FACTORY_MODE == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + + ReCode = FT5X46_TestItem_EnterFactoryMode(); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + break; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + + if (Code_FT5X46_RAWDATA_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + + ReCode = FT5X46_TestItem_RawDataTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + + if (Code_FT5X46_SCAP_CB_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT5X46_TestItem_SCapCbTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT5X46_SCAP_RAWDATA_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT5X46_TestItem_SCapRawDataTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT5X46_PANELDIFFER_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + + ReCode = FT5X46_TestItem_PanelDifferTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + + if (Code_FT5X46_WEAK_SHORT_CIRCUIT_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + + ReCode = FT5X46_TestItem_WeakShortTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + } + + + FinishTest(); + + g_TestItemNum = 0; + + return bTestResult; +} + +/************************************************************************ +* Name: FT5X46_get_test_data +* Brief: get data of test result +* Input: none +* Output: pTestData, the returned buff +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int FT5X46_get_test_data(char *pTestData) +{ + if (NULL == pTestData) { + FTS_TEST_ERROR(" pTestData == NULL "); + return -EPERM; + } + memcpy(pTestData, g_pStoreAllData, (g_lenStoreMsgArea+g_lenStoreDataArea)); + return (g_lenStoreMsgArea+g_lenStoreDataArea); +} + +/************************************************************************ +* Name: FT5X46_TestItem_EnterFactoryMode +* Brief: Check whether TP can enter Factory Mode, and do some thing +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT5X46_TestItem_EnterFactoryMode(void) +{ + unsigned char ReCode = ERROR_CODE_INVALID_PARAM; + int iRedo = 5; + int i ; + unsigned char chPattern = 0; + + FTS_TEST_FUNC_ENTER(); + + SysDelay(150); + for (i = 1; i <= iRedo; i++) { + ReCode = EnterFactory(); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Enter factory mode..."); + if (i < iRedo) { + SysDelay(50); + continue; + } + } else { + break; + } + + } + SysDelay(300); + + + if (ReCode != ERROR_CODE_OK) { + return ReCode; + } + + + ReCode = GetChannelNum(); + + + + + + ReCode = ReadReg(REG_PATTERN_5422, &chPattern); + if (chPattern == 1) { + m_bV3TP = true; + } else { + m_bV3TP = false; + } + + return ReCode; +} +/************************************************************************ +* Name: FT5X46_TestItem_RawDataTest +* Brief: TestItem: RawDataTest. Check if MCAP RawData is within the range. +* Input: none +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT5X46_TestItem_RawDataTest(bool *bTestResult) +{ + unsigned char ReCode = 0; + bool btmpresult = true; + int RawDataMin; + int RawDataMax; + unsigned char ucFre; + unsigned char strSwitch = 0; + unsigned char OriginValue = 0xff; + int index = 0; + int iRow, iCol; + int iValue = 0; + int nRawDataOK = 0; + + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Raw Data Test \n"); + ReCode = EnterFactory(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to Enter factory Mode. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + + if (m_bV3TP) { + ReCode = ReadReg(REG_MAPPING_SWITCH, &strSwitch); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + if (strSwitch != 0) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Write REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + ReCode = GetChannelNum(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n GetChannelNum error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + } + + + ReCode = ReadReg(REG_NORMALIZE_TYPE, &OriginValue); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_NORMALIZE_TYPE error. Error Code: %d", ReCode); + goto TEST_ERR; + } + ReCode = ReadReg(0x0A, &ucFre); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read frequency error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + if (g_ScreenSetParam.isNormalize == Auto_Normalize) { + if (OriginValue != 1) { + ReCode = WriteReg(REG_NORMALIZE_TYPE, 0x01); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n write REG_NORMALIZE_TYPE error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + + + FTS_TEST_DBG("\n=========Set Frequecy High\n"); + ReCode = WriteReg(0x0A, 0x81); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Set Frequecy High error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + FTS_TEST_DBG("\n=========FIR State: ON"); + ReCode = WriteReg(0xFB, 1); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n FIR State: ON error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + for (index = 0; index < 3; ++index) { + ReCode = GetRawData(); + } + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\nGet Rawdata failed, Error Code: 0x%x", ReCode); + goto TEST_ERR; + } + + ShowRawData(); + + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[iRow][iCol]; + RawDataMax = g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + + + Save_Test_Data(m_RawData, 0, g_ScreenSetParam.iTxNum, g_ScreenSetParam.iRxNum, 2); + } else { + if (OriginValue != 0) { + ReCode = WriteReg(REG_NORMALIZE_TYPE, 0x00); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n write REG_NORMALIZE_TYPE error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + + + if (g_stCfg_FT5X46_BasicThreshold.RawDataTest_SetLowFreq) { + FTS_TEST_DBG("\n=========Set Frequecy Low"); + ReCode = WriteReg(0x0A, 0x80); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n write frequency error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + + FTS_TEST_DBG("\n=========FIR State: OFF\n"); + ReCode = WriteReg(0xFB, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n FIR State: OFF error. Error Code: %d", ReCode); + goto TEST_ERR; + } + SysDelay(100); + + /* + for (index = 0; index < 3; ++index ) { + ReCode = GetRawData(); + } + */ + for (index = 0, nRawDataOK = 0; index < 10 && nRawDataOK < 3; ++index) { + ReCode = GetRawData(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Get Rawdata failed, index:%d. Error Code: 0x%x", index, ReCode); + } else + nRawDataOK++; + } + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Get Rawdata failed, Error Code: 0x%x", ReCode); + goto TEST_ERR; + } + ShowRawData(); + + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[iRow][iCol]; + RawDataMax = g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + + + Save_Test_Data(m_RawData, 0, g_ScreenSetParam.iTxNum, g_ScreenSetParam.iRxNum, 1); + } + + + + if (g_stCfg_FT5X46_BasicThreshold.RawDataTest_SetHighFreq) { + + FTS_TEST_DBG("\n=========Set Frequecy High"); + ReCode = WriteReg(0x0A, 0x81); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Set Frequecy High error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + + FTS_TEST_DBG("\n=========FIR State: OFF\n"); + ReCode = WriteReg(0xFB, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n FIR State: OFF error. Error Code: %d", ReCode); + goto TEST_ERR; + } + SysDelay(100); + + for (index = 0; index < 3; ++index) { + ReCode = GetRawData(); + } + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\nGet Rawdata failed, Error Code: 0x%x", ReCode); + if (ReCode != ERROR_CODE_OK) + goto TEST_ERR; + } + ShowRawData(); + + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[iRow][iCol]; + RawDataMax = g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + + + Save_Test_Data(m_RawData, 0, g_ScreenSetParam.iTxNum, g_ScreenSetParam.iRxNum, 2); + } + + } + + + + ReCode = WriteReg(REG_NORMALIZE_TYPE, OriginValue); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Write REG_NORMALIZE_TYPE error. Error Code: %d", ReCode); + goto TEST_ERR; + } + ReCode = WriteReg(0x0A, ucFre); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Write 0x0A error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + if (m_bV3TP) { + ReCode = WriteReg(REG_MAPPING_SWITCH, strSwitch); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Write REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + + TestResultLen += sprintf(TestResult+TestResultLen, " RawData Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//RawData Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//RawData Test is NG!"); + } + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO("\n\n//RawData Test is NG!"); + TestResultLen += sprintf(TestResult+TestResultLen, " RawData Test is NG. \n\n"); + return ReCode; + +} +/************************************************************************ +* Name: FT5X46_TestItem_SCapRawDataTest +* Brief: TestItem: SCapRawDataTest. Check if SCAP RawData is within the range. +* Input: none +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT5X46_TestItem_SCapRawDataTest(bool *bTestResult) +{ + int i = 0; + int RawDataMin = 0; + int RawDataMax = 0; + int Value = 0; + boolean bFlag = true; + unsigned char ReCode = 0; + boolean btmpresult = true; + int iMax = 0; + int iMin = 0; + int iAvg = 0; + int ByteNum = 0; + unsigned char wc_value = 0; + unsigned char ucValue = 0; + int iCount = 0; + + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Scap RawData Test \n"); + + + ReCode = EnterFactory(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to Enter factory Mode. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + ReCode = ReadReg(REG_WATER_CHANNEL_SELECT, &wc_value); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to read REG_WATER_CHANNEL_SELECT. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + ReCode = SwitchToNoMapping(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to SwitchToNoMapping. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + ReCode = StartScan(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to Scan SCap RawData! "); + goto TEST_ERR; + } + for (i = 0; i < 3; i++) { + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + + + ByteNum = (g_ScreenSetParam.iTxNum + g_ScreenSetParam.iRxNum)*2; + ReCode = ReadRawData(0, 0xAC, ByteNum, m_iTempRawData); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_DBG("Failed to ReadRawData water! "); + goto TEST_ERR; + } + + memcpy(m_RawData[0+g_ScreenSetParam.iTxNum], m_iTempRawData, sizeof(int)*g_ScreenSetParam.iRxNum); + memcpy(m_RawData[1+g_ScreenSetParam.iTxNum], m_iTempRawData + g_ScreenSetParam.iRxNum, sizeof(int)*g_ScreenSetParam.iTxNum); + + + ByteNum = (g_ScreenSetParam.iTxNum + g_ScreenSetParam.iRxNum)*2; + ReCode = ReadRawData(0, 0xAB, ByteNum, m_iTempRawData); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to ReadRawData no water! "); + goto TEST_ERR; + } + memcpy(m_RawData[2+g_ScreenSetParam.iTxNum], m_iTempRawData, sizeof(int)*g_ScreenSetParam.iRxNum); + memcpy(m_RawData[3+g_ScreenSetParam.iTxNum], m_iTempRawData + g_ScreenSetParam.iRxNum, sizeof(int)*g_ScreenSetParam.iTxNum); + } + + + + + + bFlag = GetTestCondition(WT_NeedProofOnTest, wc_value); + if (g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_SetWaterproof_ON && bFlag) { + iCount = 0; + RawDataMin = g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_ON_Min; + RawDataMax = g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_ON_Max; + iMax = -m_RawData[0+g_ScreenSetParam.iTxNum][0]; + iMin = 2 * m_RawData[0+g_ScreenSetParam.iTxNum][0]; + iAvg = 0; + Value = 0; + + + bFlag = GetTestCondition(WT_NeedRxOnVal, wc_value); + if (bFlag) + FTS_TEST_DBG("Judge Rx in Waterproof-ON:"); + for (i = 0; bFlag && i < g_ScreenSetParam.iRxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[0][i] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[0][i]; + RawDataMax = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[0][i]; + Value = m_RawData[0+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > RawDataMax || Value < RawDataMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, RawDataMin, RawDataMax); + } + iCount++; + } + + + bFlag = GetTestCondition(WT_NeedTxOnVal, wc_value); + if (bFlag) + FTS_TEST_DBG("Judge Tx in Waterproof-ON:"); + for (i = 0; bFlag && i < g_ScreenSetParam.iTxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[1][i] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[1][i]; + RawDataMax = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[1][i]; + Value = m_RawData[1+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > RawDataMax || Value < RawDataMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, RawDataMin, RawDataMax); + } + iCount++; + } + if (0 == iCount) { + iAvg = 0; + iMax = 0; + iMin = 0; + } else + iAvg = iAvg/iCount; + + FTS_TEST_DBG("SCap RawData in Waterproof-ON, Max : %d, Min: %d, Deviation: %d, Average: %d", iMax, iMin, iMax - iMin, iAvg); + + + Save_Test_Data(m_RawData, g_ScreenSetParam.iTxNum+0, 2, g_ScreenSetParam.iRxNum, 1); + } + + + bFlag = GetTestCondition(WT_NeedProofOffTest, wc_value); + if (g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_SetWaterproof_OFF && bFlag) { + iCount = 0; + RawDataMin = g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_OFF_Min; + RawDataMax = g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_OFF_Max; + iMax = -m_RawData[2+g_ScreenSetParam.iTxNum][0]; + iMin = 2 * m_RawData[2+g_ScreenSetParam.iTxNum][0]; + iAvg = 0; + Value = 0; + + bFlag = GetTestCondition(WT_NeedRxOffVal, wc_value); + if (bFlag) + FTS_TEST_DBG("Judge Rx in Waterproof-OFF:"); + for (i = 0; bFlag && i < g_ScreenSetParam.iRxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[0][i] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[0][i]; + RawDataMax = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[0][i]; + Value = m_RawData[2+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + + + + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > RawDataMax || Value < RawDataMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, RawDataMin, RawDataMax); + } + iCount++; + } + + bFlag = GetTestCondition(WT_NeedTxOffVal, wc_value); + if (bFlag) + FTS_TEST_DBG("Judge Tx in Waterproof-OFF:"); + for (i = 0; bFlag && i < g_ScreenSetParam.iTxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[1][i] == 0) + continue; + + Value = m_RawData[3+g_ScreenSetParam.iTxNum][i]; + RawDataMin = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[1][i]; + RawDataMax = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[1][i]; + + iAvg += Value; + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > RawDataMax || Value < RawDataMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, RawDataMin, RawDataMax); + } + iCount++; + } + if (0 == iCount) { + iAvg = 0; + iMax = 0; + iMin = 0; + } else + iAvg = iAvg/iCount; + + FTS_TEST_DBG("SCap RawData in Waterproof-OFF, Max : %d, Min: %d, Deviation: %d, Average: %d", iMax, iMin, iMax - iMin, iAvg); + + + Save_Test_Data(m_RawData, g_ScreenSetParam.iTxNum+2, 2, g_ScreenSetParam.iRxNum, 2); + } + + if (m_bV3TP) { + ReCode = ReadReg(REG_MAPPING_SWITCH, &ucValue); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + if (0 != ucValue) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 0); + SysDelay(10); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to switch mapping type!\n "); + btmpresult = false; + } + } + + + ReCode = GetChannelNum(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n GetChannelNum error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + + TestResultLen += sprintf(TestResult+TestResultLen, " SCap RawData Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//SCap RawData Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//SCap RawData Test is NG!"); + } + return ReCode; + +TEST_ERR: + *bTestResult = false; + FTS_TEST_INFO("\n\n//SCap RawData Test is NG!"); + TestResultLen += sprintf(TestResult+TestResultLen, " SCap RawData Test is NG. \n\n"); + return ReCode; +} + +/************************************************************************ +* Name: FT5X46_TestItem_SCapCbTest +* Brief: TestItem: SCapCbTest. Check if SCAP Cb is within the range. +* Input: none +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT5X46_TestItem_SCapCbTest(bool *bTestResult) +{ + int i, /* j, iOutNum, */index, Value, CBMin, CBMax; + boolean bFlag = true; + unsigned char ReCode; + boolean btmpresult = true; + int iMax, iMin, iAvg; + unsigned char wc_value = 0; + unsigned char ucValue = 0; + int iCount = 0; + + + FTS_TEST_INFO("\n\n==============================Test Item: ----- Scap CB Test \n"); + + + ReCode = EnterFactory(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to Enter factory Mode. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + ReCode = ReadReg(REG_WATER_CHANNEL_SELECT, &wc_value); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_WATER_CHANNEL_SELECT error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + bFlag = SwitchToNoMapping(); + if (bFlag) { + FTS_TEST_ERROR("Failed to SwitchToNoMapping! ReCode = %d. ", ReCode); + goto TEST_ERR; + } + + + ReCode = StartScan(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to Scan SCap RawData!ReCode = %d. ", ReCode); + goto TEST_ERR; + } + + + for (i = 0; i < 3; i++) { + memset(m_RawData, 0, sizeof(m_RawData)); + memset(m_ucTempData, 0, sizeof(m_ucTempData)); + + + ReCode = WriteReg(REG_ScWorkMode, 1); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Get REG_ScWorkMode Failed!"); + goto TEST_ERR; + } + + ReCode = StartScan(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("StartScan Failed!"); + goto TEST_ERR; + } + + ReCode = WriteReg(REG_ScCbAddrR, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Write REG_ScCbAddrR Failed!"); + goto TEST_ERR; + } + + ReCode = GetTxSC_CB(g_ScreenSetParam.iTxNum + g_ScreenSetParam.iRxNum + 128, m_ucTempData); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("GetTxSC_CB Failed!"); + goto TEST_ERR; + } + + for (index = 0; index < g_ScreenSetParam.iRxNum; ++index) { + m_RawData[0 + g_ScreenSetParam.iTxNum][index] = m_ucTempData[index]; + } + for (index = 0; index < g_ScreenSetParam.iTxNum; ++index) { + m_RawData[1 + g_ScreenSetParam.iTxNum][index] = m_ucTempData[index + g_ScreenSetParam.iRxNum]; + } + + + ReCode = WriteReg(REG_ScWorkMode, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Get REG_ScWorkMode Failed!"); + goto TEST_ERR; + } + + ReCode = StartScan(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("StartScan Failed!"); + goto TEST_ERR; + } + + ReCode = WriteReg(REG_ScCbAddrR, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Write REG_ScCbAddrR Failed!"); + goto TEST_ERR; + } + + ReCode = GetTxSC_CB(g_ScreenSetParam.iTxNum + g_ScreenSetParam.iRxNum + 128, m_ucTempData); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("GetTxSC_CB Failed!"); + goto TEST_ERR; + } + for (index = 0; index < g_ScreenSetParam.iRxNum; ++index) { + m_RawData[2 + g_ScreenSetParam.iTxNum][index] = m_ucTempData[index]; + } + for (index = 0; index < g_ScreenSetParam.iTxNum; ++index) { + m_RawData[3 + g_ScreenSetParam.iTxNum][index] = m_ucTempData[index + g_ScreenSetParam.iRxNum]; + } + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to Get SCap CB!"); + } + } + + if (ReCode != ERROR_CODE_OK) + goto TEST_ERR; + + + + + bFlag = GetTestCondition(WT_NeedProofOnTest, wc_value); + if (g_stCfg_FT5X46_BasicThreshold.SCapCbTest_SetWaterproof_ON && bFlag) { + FTS_TEST_DBG("SCapCbTest in WaterProof On Mode: "); + + iMax = -m_RawData[0+g_ScreenSetParam.iTxNum][0]; + iMin = 2 * m_RawData[0+g_ScreenSetParam.iTxNum][0]; + iAvg = 0; + Value = 0; + iCount = 0; + + + bFlag = GetTestCondition(WT_NeedRxOnVal, wc_value); + if (bFlag) + FTS_TEST_DBG("SCap CB_Rx: "); + for (i = 0; bFlag && i < g_ScreenSetParam.iRxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[0][i] == 0) + continue; + CBMin = g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[0][i]; + CBMax = g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[0][i]; + Value = m_RawData[0+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > CBMax || Value < CBMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, CBMin, CBMax); + } + iCount++; + } + + + bFlag = GetTestCondition(WT_NeedTxOnVal, wc_value); + if (bFlag) + FTS_TEST_DBG("SCap CB_Tx: "); + for (i = 0; bFlag && i < g_ScreenSetParam.iTxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[1][i] == 0) + continue; + CBMin = g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[1][i]; + CBMax = g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[1][i]; + Value = m_RawData[1+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > CBMax || Value < CBMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, CBMin, CBMax); + } + iCount++; + } + + if (0 == iCount) { + iAvg = 0; + iMax = 0; + iMin = 0; + } else + iAvg = iAvg/iCount; + + FTS_TEST_DBG("SCap CB in Waterproof-ON, Max : %d, Min: %d, Deviation: %d, Average: %d", iMax, iMin, iMax - iMin, iAvg); + + + Save_Test_Data(m_RawData, g_ScreenSetParam.iTxNum+0, 2, g_ScreenSetParam.iRxNum, 1); + } + + bFlag = GetTestCondition(WT_NeedProofOffTest, wc_value); + if (g_stCfg_FT5X46_BasicThreshold.SCapCbTest_SetWaterproof_OFF && bFlag) { + FTS_TEST_DBG("SCapCbTest in WaterProof OFF Mode: "); + iMax = -m_RawData[2+g_ScreenSetParam.iTxNum][0]; + iMin = 2 * m_RawData[2+g_ScreenSetParam.iTxNum][0]; + iAvg = 0; + Value = 0; + iCount = 0; + + + bFlag = GetTestCondition(WT_NeedRxOffVal, wc_value); + if (bFlag) + FTS_TEST_DBG("SCap CB_Rx: "); + for (i = 0; bFlag && i < g_ScreenSetParam.iRxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[0][i] == 0) + continue; + CBMin = g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[0][i]; + CBMax = g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[0][i]; + Value = m_RawData[2+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > CBMax || Value < CBMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, CBMin, CBMax); + } + iCount++; + } + + + bFlag = GetTestCondition(WT_NeedTxOffVal, wc_value); + if (bFlag) + FTS_TEST_DBG("SCap CB_Tx: "); + for (i = 0; bFlag && i < g_ScreenSetParam.iTxNum; i++) { + + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[1][i] == 0) + continue; + CBMin = g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[1][i]; + CBMax = g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[1][i]; + Value = m_RawData[3+g_ScreenSetParam.iTxNum][i]; + + iAvg += Value; + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > CBMax || Value < CBMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, CBMin, CBMax); + } + iCount++; + } + + if (0 == iCount) { + iAvg = 0; + iMax = 0; + iMin = 0; + } else + iAvg = iAvg/iCount; + + FTS_TEST_DBG("SCap CB in Waterproof-OFF, Max : %d, Min: %d, Deviation: %d, Average: %d", iMax, iMin, iMax - iMin, iAvg); + + + Save_Test_Data(m_RawData, g_ScreenSetParam.iTxNum+2, 2, g_ScreenSetParam.iRxNum, 2); + } + + if (m_bV3TP) { + ReCode = ReadReg(REG_MAPPING_SWITCH, &ucValue); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + if (0 != ucValue) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 0); + SysDelay(10); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_DBG("Failed to switch mapping type!\n "); + btmpresult = false; + } + } + + + ReCode = GetChannelNum(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n GetChannelNum error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + + TestResultLen += sprintf(TestResult+TestResultLen, " SCap CB Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//SCap CB Test Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//SCap CB Test Test is NG!"); + } + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO("\n\n//SCap CB Test Test is NG!"); + TestResultLen += sprintf(TestResult+TestResultLen, " SCap CB Test is NG. \n\n"); + return ReCode; +} + + +unsigned char FT5X46_TestItem_WeakShortTest(bool *bTestResult) +{ + + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + int i = 0; + bool btmpresult = true; + int iAllAdcDataNum = 63; + int iMaxTx = 35; + unsigned char iTxNum, iRxNum, iChannelNum; + int iClbData_Ground, iClbData_Mutual, iOffset, iRsen, iCCRsen; + unsigned char IcValue = 0; + unsigned char strSwitch = 1; + bool bCapShortTest = false; + + int *iAdcData = NULL; + + int fKcal = 0; + int *fMShortResistance = NULL, *fGShortResistance = NULL; + int iDoffset = 0, iDsen = 0, iDrefn = 0; + int iMin_CG = 0; + int iCount = 0; + int iMin_CC = 0; + int iDCal = 0; + int iMa = 0; + + + FTS_TEST_INFO("\n\n\n\n==============================Test Item: ----- Weak Short-Circuit Test \r\n\r\n"); + + ReCode = EnterWork(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR(" EnterWork failed.. Error Code: %d", ReCode); + btmpresult = false; + goto TEST_ERR; + } + SysDelay(200); + + + ReCode = ReadReg(0xB1, &IcValue); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read 0xB1 IcValue error. Error Code: %d\n", ReCode); + btmpresult = false; + goto TEST_ERR; + } else + FTS_TEST_DBG(" IcValue:0x%02x. \n", IcValue); + + iRsen = 57; + + iCCRsen = g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CC_Rsen; + bCapShortTest = g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CapShortTest; + FTS_TEST_DBG(" iCCRsen:%d. \n", iCCRsen); + FTS_TEST_DBG(" bCapShortTest:%d. \n", bCapShortTest); + + ReCode = EnterFactory(); + SysDelay(100); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_DBG(" EnterFactory failed.. Error Code: %d", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + + + + if (m_bV3TP) { + ReCode = ReadReg(REG_MAPPING_SWITCH, &strSwitch); + if (strSwitch != 1) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 1); + SysDelay(20); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\r\nFailed to restore mapping type!\r\n "); + btmpresult = false; + } + GetChannelNumNoMapping(); + + iTxNum = g_ScreenSetParam.iTxNum; + iRxNum = g_ScreenSetParam.iRxNum; + } + } else { + + + ReCode = ReadReg(0x02, &iTxNum); + ReCode = ReadReg(0x03, &iRxNum); + FTS_TEST_DBG("Newly acquired TxNum:%d, RxNum:%d", iTxNum, iRxNum); + } + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("ReCode error. Error Code: %d\n", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + iChannelNum = iTxNum + iRxNum; + iMaxTx = iTxNum; + iAllAdcDataNum = 1 + (1 + iTxNum + iRxNum)*2; + + for (i = 0; i < 5; i++) { + ReCode = StartScan(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("StartScan Failed!\n"); + + SysDelay(100); + } else { + FTS_TEST_DBG("StartScan OK!\n"); + break; + } + } + if (i >= 5) { + FTS_TEST_ERROR("StartScan Failed for several times.!\n"); + btmpresult = false; + goto TEST_ERR; + } + for (i = 0; i < 3; i++) { + GetRawData(); + } + + iAdcData = fts_malloc(iAllAdcDataNum*sizeof(int)); + memset(iAdcData, 0, iAllAdcDataNum); + + for (i = 0; i < 5; i++) { + memset(iAdcData, 0, iAllAdcDataNum); + + FTS_TEST_DBG("WeakShort_GetAdcData times: %d", i); + + ReCode = WeakShort_GetAdcData(iAllAdcDataNum*2, iAdcData); + SysDelay(50); + if (ReCode != ERROR_CODE_OK) { + continue; + } else { + if (0 == iAdcData[0] && 0 == iAdcData[1]) { + continue; + } + + else + break; + } + } + if (i >= 5) { + FTS_TEST_ERROR("WeakShort_GetAdcData or ADC data error. tried times: %d", i); + btmpresult = false; + goto TEST_ERR; + } + + + iOffset = iAdcData[0]; + iClbData_Ground = iAdcData[1]; + iClbData_Mutual = iAdcData[2 + iChannelNum]; + + +#if 0 + + + for (i = 0; i < iAllAdcDataNum/*iChannelNum*/; i++) { + if (i <= (iChannelNum + 1)) { + if (i == 0) + FTS_TEST_DBG("\n\n\nOffset %02d: %4d, \n", i, iAdcData[i]); + else if (i == 1) /*if(i <= iMaxTx)*/ + FTS_TEST_DBG("Ground %02d: %4d, \n", i, iAdcData[i]); + else if (i <= (iMaxTx + 1)) + FTS_TEST_DBG("Tx%02d: %4d, ", i-1, iAdcData[i]); + else if (i <= (iChannelNum + 1)) + FTS_TEST_DBG("Rx%02d: %4d, ", i - iMaxTx-1, iAdcData[i]); + + if (i % 10 == 0) + FTS_TEST_DBG("\n"); + + } else { + if (i == (iChannelNum + 2)) + FTS_TEST_DBG("\n\n\nMultual %02d: %4d, \n", i, iAdcData[i]); + else if (i <= (iMaxTx)+(iChannelNum + 2)) + FTS_TEST_DBG("Tx%02d: %4d, ", i - (iChannelNum + 2), iAdcData[i]); + else if (i < iAllAdcDataNum) + FTS_TEST_DBG("Rx%02d: %4d, ", i - iMaxTx - (iChannelNum + 2), iAdcData[i]); + + if (i % 10 == 0) + FTS_TEST_DBG("\n"); + + } + } + FTS_TEST_DBG("\r\n"); + +#endif + + + + fMShortResistance = fts_malloc(iChannelNum*sizeof(int)); + memset(fMShortResistance, 0, iChannelNum); + fGShortResistance = fts_malloc(iChannelNum*sizeof(int)); + memset(fGShortResistance, 0, iChannelNum); + + + iMin_CG = g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CG; + + iDoffset = iOffset - 1024; + iDrefn = iClbData_Ground; + + + FTS_TEST_DBG("Drefp: %5d \r\n", iDrefn); + + FTS_TEST_DBG("Doffset: %5d \r\n", iDoffset); + + FTS_TEST_DBG("Rshort(Ground): \n\n\n"); + + fKcal = 1; + FTS_TEST_DBG("Short Circuit (Channel and Ground):\r\n"); + + for (i = 0; i < iChannelNum; i++) { + iDsen = iAdcData[i+2]; + + FTS_TEST_DBG("%5d ", iDsen); + + if (i+1 == iMaxTx) { + + FTS_TEST_DBG("\n"); + } + + if ((2047+iDoffset) - iDsen <= 0) { + continue; + } + + if (i == iMaxTx) { + + FTS_TEST_DBG("\n"); + + } + + if (IcValue <= 0x05 || IcValue == 0xff) { + + fGShortResistance[i] = (iDsen - iDoffset + 410) * 25 * fKcal / (2047 + iDoffset - iDsen) - 3; + } else { + if (iDrefn - iDsen <= 0) { + fGShortResistance[i] = iMin_CG; + FTS_TEST_DBG("%02d ", fGShortResistance[i]); + + continue; + } + + fGShortResistance[i] = (((iDsen - iDoffset + 384) / (iDrefn - iDsen) * 57) - 1); + } + if (fGShortResistance[i] < 0) + fGShortResistance[i] = 0; + + FTS_TEST_DBG("%02d ", fGShortResistance[i]); + + if ((iMin_CG > fGShortResistance[i]) || (iDsen - iDoffset < 0)) { + iCount++; + if (i+1 <= iMaxTx) + FTS_TEST_DBG("Tx%02d: %02d (k¦¸), ", i+1, fGShortResistance[i]); + else + FTS_TEST_DBG("Rx%02d: %02d (k¦¸), ", i+1 - iMaxTx, fGShortResistance[i]); + if (iCount % 10 == 0) + FTS_TEST_DBG("\n"); + } + + } + FTS_TEST_DBG("\n"); + + + if (iCount > 0) { + + btmpresult = false; + } + + + iMin_CC = g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CC; + + if ((IcValue == 0x06 || IcValue < 0xff) && iRsen != iCCRsen) { + iRsen = iCCRsen; + } + iDoffset = iOffset - 1024; + iDrefn = iClbData_Mutual; + fKcal = 1.0; + + FTS_TEST_DBG("\n\nShort Circuit (Channel and Channel):\n"); + iCount = 0; + + + FTS_TEST_DBG("Drefp: %5d \r\n", iDrefn); + FTS_TEST_DBG("Doffset: %5d \r\n", iDoffset); + FTS_TEST_DBG("Rshort(Channel):"); + iDCal = max(iDrefn, 116 + iDoffset); + + for (i = 0; i < iChannelNum; i++) { + iDsen = iAdcData[i+iChannelNum + 3]; + + FTS_TEST_DBG("%5d ", iDsen); + if (i+1 == iMaxTx) { + + FTS_TEST_DBG("\n"); + } + if (IcValue <= 0x05 || IcValue == 0xff) { + if (iDsen - iDrefn < 0) + continue; + } + + if (i == iMaxTx) { + + FTS_TEST_DBG("\n"); + } + + + if (IcValue <= 0x05 || IcValue == 0xff) { + iMa = iDsen - iDCal; + iMa = iMa ? iMa : 1; + fMShortResistance[i] = ((2047 + iDoffset - iDCal) * 24 / iMa - 27) * fKcal - 6; + } else { + if (iDrefn - iDsen <= 0) { + fMShortResistance[i] = iMin_CC; + FTS_TEST_DBG("%02d ", fMShortResistance[i]); + continue; + } + + fMShortResistance[i] = (iDsen - iDoffset - 123) * iRsen * fKcal / (iDrefn - iDsen /*temp*/) - 2; + } + + + FTS_TEST_DBG("%02d ", fMShortResistance[i]); + + if (fMShortResistance[i] < 0 && fMShortResistance[i] >= -240) + fMShortResistance[i] = 0; + else if (fMShortResistance[i] < -240) + continue; + + if (fMShortResistance[i] <= 0 || fMShortResistance[i] < iMin_CC) { + iCount++; + if (i+1 <= iMaxTx) + FTS_TEST_DBG("Tx%02d: %02d(k¦¸), ", i+1, fMShortResistance[i]); + else + FTS_TEST_DBG("Rx%02d: %02d(k¦¸), ", i+1 - iMaxTx, fMShortResistance[i]); + + if (iCount % 10 == 0) + FTS_TEST_DBG("\n"); + + } + + } + FTS_TEST_DBG("\n"); + + + if (iCount > 0 && !bCapShortTest) { + + btmpresult = false; + } + + + if (bCapShortTest && iCount) { + FTS_TEST_DBG(" bCapShortTest && iCount. need to add ......"); + } + + + if (m_bV3TP) { + ReCode = WriteReg(REG_MAPPING_SWITCH, strSwitch); + SysDelay(50); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to restore mapping type!\r\n "); + btmpresult = false; + } + ReCode = GetChannelNum(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n GetChannelNum error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + ReCode = GetRawData(); + } + +TEST_ERR: + + if (NULL != iAdcData) { + fts_free(iAdcData); + iAdcData = NULL; + } + + if (NULL != fMShortResistance) { + fts_free(fMShortResistance); + fMShortResistance = NULL; + } + + if (NULL != fGShortResistance) { + fts_free(fGShortResistance); + fGShortResistance = NULL; + } + + TestResultLen += sprintf(TestResult+TestResultLen, " Weak Short Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + if (btmpresult) { + FTS_TEST_INFO("\r\n\r\n//Weak Short Test is OK."); + *bTestResult = true; + } else { + FTS_TEST_INFO("\r\n\r\n//Weak Short Test is NG."); + *bTestResult = false; + } + + + return ReCode; +} + + +unsigned char FT5X46_TestItem_PanelDifferTest(bool *bTestResult) +{ + int index = 0; + int iRow = 0, iCol = 0; + int iValue = 0; + unsigned char ReCode = 0, strSwitch = -1; + bool btmpresult = true; + int iMax, iMin; + int maxValue = 0; + int minValue = 32767; + int AvgValue = 0; + int InvalidNum = 0; + int i = 0, j = 0; + + unsigned char OriginRawDataType = 0xff; + unsigned char OriginFrequecy = 0xff; + unsigned char OriginFirState = 0xff; + + + FTS_TEST_INFO("\r\n\r\n\r\n==============================Test Item: -------- Panel Differ Test \r\n\r\n"); + + ReCode = EnterFactory(); + SysDelay(20); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to Enter factory Mode. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + + if (m_bV3TP) { + ReCode = ReadReg(REG_MAPPING_SWITCH, &strSwitch); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + if (strSwitch != 0) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Write REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + ReCode = GetChannelNum(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n GetChannelNum error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + ReCode = GetRawData(); + } + } + + + FTS_TEST_DBG("\r\n=========Set Auto Equalization:\r\n"); + ReCode = ReadReg(REG_NORMALIZE_TYPE, &OriginRawDataType); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Read REG_NORMALIZE_TYPE error. Error Code: %d", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + if (OriginRawDataType != 0) { + ReCode = WriteReg(REG_NORMALIZE_TYPE, 0x00); + SysDelay(50); + if (ReCode != ERROR_CODE_OK) { + btmpresult = false; + FTS_TEST_ERROR("Write reg REG_NORMALIZE_TYPE Failed."); + goto TEST_ERR; + } + } + + + + FTS_TEST_DBG("=========Set Frequecy High"); + ReCode = ReadReg(0x0A, &OriginFrequecy); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Read reg 0x0A error. Error Code: %d", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + ReCode = WriteReg(0x0A, 0x81); + SysDelay(10); + if (ReCode != ERROR_CODE_OK) { + btmpresult = false; + FTS_TEST_ERROR("Write reg 0x0A Failed."); + goto TEST_ERR; + } + + FTS_TEST_DBG("=========FIR State: OFF"); + ReCode = ReadReg(0xFB, &OriginFirState); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Read reg 0xFB error. Error Code: %d", ReCode); + btmpresult = false; + goto TEST_ERR; + } + ReCode = WriteReg(0xFB, 0); + SysDelay(50); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Write reg 0xFB Failed."); + btmpresult = false; + goto TEST_ERR; + } + ReCode = GetRawData(); + + for (index = 0; index < 4; ++index) { + ReCode = GetRawData(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("GetRawData Failed."); + btmpresult = false; + goto TEST_ERR; + } + } + + + for (i = 0; i < g_ScreenSetParam.iTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iRxNum; j++) { + m_DifferData[i][j] = m_RawData[i][j]/10; + } + } + + + + +#if 1 + FTS_TEST_DBG("PannelDiffer :\n"); + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + FTS_TEST_DBG("\nRow%2d: ", iRow+1); + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + + + iValue = m_DifferData[iRow][iCol]; + FTS_TEST_DBG("%4d, ", iValue); + } + FTS_TEST_DBG("\n"); + } + FTS_TEST_DBG("\n"); +#endif + + + + + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + + iValue = m_DifferData[iRow][iCol]; + iMin = g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[iRow][iCol]; + iMax = g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[iRow][iCol]; + + if (iValue < iMin || iValue > iMax) { + btmpresult = false; + FTS_TEST_ERROR("Out Of Range. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) \n", \ + iRow+1, iCol+1, iValue, iMin, iMax); + } + } + } + + + + + FTS_TEST_DBG("PannelDiffer ABS:\n"); + for (i = 0; i < g_ScreenSetParam.iTxNum; i++) { + + FTS_TEST_DBG("\n"); + for (j = 0; j < g_ScreenSetParam.iRxNum; j++) { + + FTS_TEST_DBG("%ld,", abs(m_DifferData[i][j])); + m_absDifferData[i][j] = abs(m_DifferData[i][j]); + + if (NODE_AST_TYPE == g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] || NODE_INVALID_TYPE == g_stCfg_MCap_DetailThreshold.InvalidNode[i][j]) { + InvalidNum++; + continue; + } + maxValue = max(maxValue, m_DifferData[i][j]); + minValue = min(minValue, m_DifferData[i][j]); + AvgValue += m_DifferData[i][j]; + } + } + FTS_TEST_DBG("\n"); + Save_Test_Data(m_absDifferData, 0, g_ScreenSetParam.iTxNum, g_ScreenSetParam.iRxNum, 1); + + + AvgValue = AvgValue/(g_ScreenSetParam.iTxNum*g_ScreenSetParam.iRxNum - InvalidNum); + FTS_TEST_DBG("PanelDiffer:Max: %d, Min: %d, Avg: %d ", maxValue, minValue, AvgValue); + + ReCode = WriteReg(REG_NORMALIZE_TYPE, OriginRawDataType); + ReCode = WriteReg(0x0A, OriginFrequecy); + ReCode = WriteReg(0xFB, OriginFirState); + + + if (m_bV3TP) { + ReCode = WriteReg(REG_MAPPING_SWITCH, strSwitch); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to restore mapping type!"); + btmpresult = false; + } + } + + TestResultLen += sprintf(TestResult+TestResultLen, " Panel Differ Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO(" //Panel Differ Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO(" //Panel Differ Test is NG!"); + } + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO(" //Panel Differ Test is NG!"); + TestResultLen += sprintf(TestResult+TestResultLen, " Panel Differ Test is NG. \n\n"); + return ReCode; +} + + + + +/************************************************************************ +* Name: GetPanelRows(Same function name as FT_MultipleTest) +* Brief: Get row of TP +* Input: none +* Output: pPanelRows +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetPanelRows(unsigned char *pPanelRows) +{ + return ReadReg(REG_TX_NUM, pPanelRows); +} + +/************************************************************************ +* Name: GetPanelCols(Same function name as FT_MultipleTest) +* Brief: get column of TP +* Input: none +* Output: pPanelCols +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetPanelCols(unsigned char *pPanelCols) +{ + return ReadReg(REG_RX_NUM, pPanelCols); +} +/************************************************************************ +* Name: StartScan(Same function name as FT_MultipleTest) +* Brief: Scan TP, do it before read Raw Data +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static int StartScan(void) +{ + unsigned char RegVal = 0; + unsigned char times = 0; + const unsigned char MaxTimes = 250; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RegVal); + FTS_TEST_ERROR("first read:RegVal = 0x%x\n", RegVal); + if (ReCode == ERROR_CODE_OK) { + RegVal |= 0x80; + ReCode = WriteReg(DEVIDE_MODE_ADDR, RegVal); + if (ReCode == ERROR_CODE_OK) { + while (times++ < MaxTimes) { + SysDelay(16); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RegVal); + FTS_TEST_ERROR("RegVal = 0x%x\n", RegVal); + if (ReCode == ERROR_CODE_OK) { + if ((RegVal>>7) == 0) + break; + } else { + FTS_TEST_ERROR("StartScan read DEVIDE_MODE_ADDR error."); + break; + } + } + if (times < MaxTimes) + ReCode = ERROR_CODE_OK; + else { + ReCode = ERROR_CODE_COMM_ERROR; + FTS_TEST_ERROR("times NOT < MaxTimes. error."); + } + } else + FTS_TEST_ERROR("StartScan write DEVIDE_MODE_ADDR error."); + } else + FTS_TEST_ERROR("StartScan read DEVIDE_MODE_ADDR error."); + return ReCode; + +} +/************************************************************************ +* Name: ReadRawData(Same function name as FT_MultipleTest) +* Brief: read Raw Data +* Input: Freq(No longer used, reserved), LineNum, ByteNum +* Output: pRevBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + unsigned char I2C_wBuffer[3]; + int i, iReadNum; + unsigned short BytesNumInTestMode1 = 0; + + + iReadNum = ByteNum/BYTES_PER_TIME; + + if (0 != (ByteNum%BYTES_PER_TIME)) + iReadNum++; + + if (ByteNum <= BYTES_PER_TIME) { + BytesNumInTestMode1 = ByteNum; + } else { + BytesNumInTestMode1 = BYTES_PER_TIME; + } + + ReCode = WriteReg(REG_LINE_NUM, LineNum); + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to write REG_LINE_NUM! "); + goto READ_ERR; + } + + + I2C_wBuffer[0] = REG_RawBuf0; + if (ReCode == ERROR_CODE_OK) { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(I2C_wBuffer, 1, m_ucTempData, BytesNumInTestMode1); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("read rawdata Comm_Base_IIC_IO Failed!1 "); + goto READ_ERR; + } + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) + break; + + if (i == iReadNum-1) { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(NULL, 0, m_ucTempData+BYTES_PER_TIME*i, ByteNum-BYTES_PER_TIME*i); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("read rawdata Comm_Base_IIC_IO Failed!2 "); + goto READ_ERR; + } + } else { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(NULL, 0, m_ucTempData+BYTES_PER_TIME*i, BYTES_PER_TIME); + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("read rawdata Comm_Base_IIC_IO Failed!3 "); + goto READ_ERR; + } + } + + } + + if (ReCode == ERROR_CODE_OK) { + for (i = 0; i < (ByteNum>>1); i++) { + pRevBuffer[i] = (m_ucTempData[i<<1]<<8)+m_ucTempData[(i<<1)+1]; + + + + + } + } + +READ_ERR: + return ReCode; + +} +/************************************************************************ +* Name: GetTxSC_CB(Same function name as FT_MultipleTest) +* Brief: get CB of Tx SCap +* Input: index +* Output: pcbValue +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char GetTxSC_CB(unsigned char index, unsigned char *pcbValue) +{ + unsigned char ReCode = ERROR_CODE_OK; + unsigned char wBuffer[4]; + + if (index < 128) { + *pcbValue = 0; + WriteReg(REG_ScCbAddrR, index); + ReCode = ReadReg(REG_ScCbBuf0, pcbValue); + } else { + WriteReg(REG_ScCbAddrR, 0); + wBuffer[0] = REG_ScCbBuf0; + ReCode = Comm_Base_IIC_IO(wBuffer, 1, pcbValue, index-128); + + } + + return ReCode; +} + + + + +/************************************************************************ +* Name: Save_Test_Data +* Brief: Storage format of test data +* Input: int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount +* Output: none +* Return: none +***********************************************************************/ +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount) +{ + int iLen = 0; + int i = 0, j = 0; + + + iLen = sprintf(g_pTmpBuff, "NA, %d, %d, %d, %d, %d, ", \ + m_ucTestItemCode, Row, Col, m_iStartLine, ItemCount); + memcpy(g_pMsgAreaLine2+g_lenMsgAreaLine2, g_pTmpBuff, iLen); + g_lenMsgAreaLine2 += iLen; + + m_iStartLine += Row; + m_iTestDataCount++; + + + for (i = 0+iArrayIndex; (i < Row+iArrayIndex) && (i < TX_NUM_MAX); i++) { + for (j = 0; (j < Col) && (j < RX_NUM_MAX); j++) { + if (j == (Col - 1)) + iLen = sprintf(g_pTmpBuff, "%d, \n", iData[i][j]); + else + iLen = sprintf(g_pTmpBuff, "%d, ", iData[i][j]); + + memcpy(g_pStoreDataArea+g_lenStoreDataArea, g_pTmpBuff, iLen); + g_lenStoreDataArea += iLen; + } + } + +} + +/************************************************************************ +* Name: GetChannelNum +* Brief: Get Channel Num(Tx and Rx) +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetChannelNum(void) +{ + unsigned char ReCode; + unsigned char rBuffer[1]; + + + ReCode = GetPanelRows(rBuffer); + if (ReCode == ERROR_CODE_OK) { + g_ScreenSetParam.iTxNum = rBuffer[0]; + if (g_ScreenSetParam.iTxNum > g_ScreenSetParam.iUsedMaxTxNum) { + FTS_TEST_ERROR("Failed to get Tx number, Get num = %d, UsedMaxNum = %d", + g_ScreenSetParam.iTxNum, g_ScreenSetParam.iUsedMaxTxNum); + g_ScreenSetParam.iTxNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + } else { + FTS_TEST_ERROR("Failed to get Tx number"); + } + + + + ReCode = GetPanelCols(rBuffer); + if (ReCode == ERROR_CODE_OK) { + g_ScreenSetParam.iRxNum = rBuffer[0]; + if (g_ScreenSetParam.iRxNum > g_ScreenSetParam.iUsedMaxRxNum) { + FTS_TEST_ERROR("Failed to get Rx number, Get num = %d, UsedMaxNum = %d", + g_ScreenSetParam.iRxNum, g_ScreenSetParam.iUsedMaxRxNum); + g_ScreenSetParam.iRxNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + } else { + FTS_TEST_ERROR("Failed to get Rx number"); + } + + return ReCode; + +} +/************************************************************************ +* Name: GetRawData +* Brief: Get Raw Data of MCAP +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetRawData(void) +{ + unsigned char ReCode = ERROR_CODE_OK; + int iRow = 0; + int iCol = 0; + + + FTS_TEST_DBG("Start Scan ..."); + + ReCode = StartScan(); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Scan ..."); + return ReCode; + } + + FTS_TEST_DBG("Succee to Scan ..."); + + + memset(m_RawData, 0, sizeof(m_RawData)); + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + + ReCode = ReadRawData(1, 0xAA, (g_ScreenSetParam.iTxNum * g_ScreenSetParam.iRxNum)*2, m_iTempRawData); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to ReadRawData ..."); + return ReCode; + } + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + m_RawData[iRow][iCol] = m_iTempRawData[iRow*g_ScreenSetParam.iRxNum + iCol]; + } + } + return ReCode; +} +/************************************************************************ +* Name: ShowRawData +* Brief: Show RawData +* Input: none +* Output: none +* Return: none. +***********************************************************************/ +static void ShowRawData(void) +{ + int iRow, iCol; + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + FTS_TEST_DBG("Tx%2d: ", iRow+1); + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + FTS_TEST_DBG("%5d ", m_RawData[iRow][iCol]); + } + FTS_TEST_DBG("\n "); + } +} + +/************************************************************************ +* Name: GetChannelNumNoMapping +* Brief: get Tx&Rx num from other Register +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetChannelNumNoMapping(void) +{ + unsigned char ReCode; + unsigned char rBuffer[1]; + + + FTS_TEST_DBG("Get Tx Num..."); + ReCode = ReadReg(REG_TX_NOMAPPING_NUM, rBuffer); + if (ReCode == ERROR_CODE_OK) { + g_ScreenSetParam.iTxNum = rBuffer[0]; + } else { + FTS_TEST_ERROR("Failed to get Tx number"); + } + + + FTS_TEST_DBG("Get Rx Num..."); + ReCode = ReadReg(REG_RX_NOMAPPING_NUM, rBuffer); + if (ReCode == ERROR_CODE_OK) { + g_ScreenSetParam.iRxNum = rBuffer[0]; + } else { + FTS_TEST_ERROR("Failed to get Rx number"); + } + + return ReCode; +} +/************************************************************************ +* Name: SwitchToNoMapping +* Brief: If it is V3 pattern, Get Tx/Rx Num again +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char SwitchToNoMapping(void) +{ + unsigned char chPattern = -1; + unsigned char ReCode = ERROR_CODE_OK; + unsigned char RegData = -1; + ReCode = ReadReg(REG_PATTERN_5422, &chPattern); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Switch To NoMapping Failed!"); + goto READ_ERR; + } + + if (1 == chPattern) { + RegData = -1; + ReCode = ReadReg(REG_MAPPING_SWITCH, &RegData); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("read REG_MAPPING_SWITCH Failed!"); + goto READ_ERR; + } + + if (1 != RegData) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 1); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("write REG_MAPPING_SWITCH Failed!"); + goto READ_ERR; + } + focal_msleep(20); + ReCode = GetChannelNumNoMapping(); + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("GetChannelNumNoMapping Failed!"); + goto READ_ERR; + } + } + } + +READ_ERR: + return ReCode; +} +/************************************************************************ +* Name: GetTestCondition +* Brief: Check whether Rx or TX need to test, in Waterproof ON/OFF Mode. +* Input: none +* Output: none +* Return: true: need to test; false: Not tested. +***********************************************************************/ +static boolean GetTestCondition(int iTestType, unsigned char ucChannelValue) +{ + boolean bIsNeeded = false; + switch (iTestType) { + case WT_NeedProofOnTest: + bIsNeeded = !(ucChannelValue & 0x20); + break; + case WT_NeedProofOffTest: + bIsNeeded = !(ucChannelValue & 0x80); + break; + case WT_NeedTxOnVal: + bIsNeeded = !(ucChannelValue & 0x40) || !(ucChannelValue & 0x04); + break; + case WT_NeedRxOnVal: + bIsNeeded = !(ucChannelValue & 0x40) || (ucChannelValue & 0x04); + break; + case WT_NeedTxOffVal: + bIsNeeded = (0x00 == (ucChannelValue & 0x03)) || (0x02 == (ucChannelValue & 0x03)); + break; + case WT_NeedRxOffVal: + bIsNeeded = (0x01 == (ucChannelValue & 0x03)) || (0x02 == (ucChannelValue & 0x03)); + break; + default: + break; + } + return bIsNeeded; +} + + + +static unsigned char WeakShort_GetAdcData(int AllAdcDataLen, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + int iReadDataLen = AllAdcDataLen; + unsigned char *pDataSend = NULL; + + unsigned char Data = 0xff; + unsigned char tmp = 0xff; + int i = 0; + bool bAdcOK = false; + + FTS_TEST_FUNC_ENTER(); + + pDataSend = fts_malloc(iReadDataLen + 1); + if (pDataSend == NULL) + return ERROR_CODE_ALLOCATE_BUFFER_ERROR; + memset(pDataSend, 0, iReadDataLen + 1); + + ReCode = WriteReg(0x07, 0x01); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("WriteReg error. \n"); + return ReCode; + } + + SysDelay(100); + + for (i = 0; i < 100*5; i++) { + SysDelay(10); + ReCode = ReadReg(0x07, &Data); + FTS_TEST_ERROR("data = 0x%x\n", Data); + if (i == 30) { + ReadReg(0x02, &tmp); + FTS_TEST_ERROR("Reg 0x02 = 0x%x\n", tmp); + } + if (ReCode == ERROR_CODE_OK) { + if (Data == 0) { + bAdcOK = true; + break; + } + } + } + + if (!bAdcOK) { + FTS_TEST_ERROR("ADC data NOT ready. error.\n"); + ReCode = ERROR_CODE_COMM_ERROR; + goto EndGetAdc; + } + SysDelay(300); + pDataSend[0] = 0xF4; + + + ReCode = Comm_Base_IIC_IO(pDataSend, 1, pDataSend + 1, iReadDataLen); + if (ReCode == ERROR_CODE_OK) { + FTS_TEST_DBG("\n Adc Data:\n"); + for (i = 0; i < iReadDataLen/2; i++) { + pRevBuffer[i] = (pDataSend[1 + 2*i]<<8) + pDataSend[1 + 2*i + 1]; + FTS_TEST_DBG("%d, ", pRevBuffer[i]); + } + FTS_TEST_DBG("\n"); + } else { + FTS_TEST_ERROR("Comm_Base_IIC_IO error. error:%d. \n", ReCode); + } + +EndGetAdc: + if (pDataSend != NULL) { + fts_free(pDataSend); + pDataSend = NULL; + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} + + +#endif + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_supported_ic.c b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_supported_ic.c new file mode 100644 index 0000000000000..87bb43db60935 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_supported_ic.c @@ -0,0 +1,270 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.c +* +* Author: Software Development +* +* Created: 2016-08-01 +* +* Abstract: test item for FT8716 +* +************************************************************************/ + +/******************************************************************************* +* Included header files +*******************************************************************************/ + + +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + + + +#if (FT8607_TEST) +void OnInit_FT8607_TestItem(char *strIniFile); +void OnInit_FT8607_BasicThreshold(char *strIniFile); +void SetTestItem_FT8607(void); +boolean FT8607_StartTest(void); +int FT8607_get_test_data(char *pTestData); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8607_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8607_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8607; + g_stTestFuncs.Start_Test = FT8607_StartTest; + g_stTestFuncs.Get_test_data = FT8607_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FT8716_TEST) + +boolean FT8716_StartTest(void); +int FT8716_get_test_data(char *pTestData); + +void OnInit_FT8716_TestItem(char *strIniFile); +void OnInit_FT8716_BasicThreshold(char *strIniFile); +void SetTestItem_FT8716(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8716_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8716_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8716; + g_stTestFuncs.Start_Test = FT8716_StartTest; + g_stTestFuncs.Get_test_data = FT8716_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT5X46_TEST) + +boolean FT5X46_StartTest(void); +int FT5X46_get_test_data(char *pTestData); + +void OnInit_FT5X46_TestItem(char *strIniFile); +void OnInit_FT5X46_BasicThreshold(char *strIniFile); +void SetTestItem_FT5X46(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT5X46_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5X46_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT5X46; + g_stTestFuncs.Start_Test = FT5X46_StartTest; + g_stTestFuncs.Get_test_data = FT5X46_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT6X36_TEST) + +boolean FT6X36_StartTest(void); +int FT6X36_get_test_data(char *pTestData); + +void OnInit_FT6X36_TestItem(char *strIniFile); +void OnInit_FT6X36_BasicThreshold(char *strIniFile); +void SetTestItem_FT6X36(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT6X36_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT6X36_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT6X36; + g_stTestFuncs.Start_Test = FT6X36_StartTest; + g_stTestFuncs.Get_test_data = FT6X36_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT5822_TEST) + +boolean FT5822_StartTest(void); +int FT5822_get_test_data(char *pTestData); + +void OnInit_FT5822_TestItem(char *strIniFile); +void OnInit_FT5822_BasicThreshold(char *strIniFile); +void SetTestItem_FT5822(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT5822_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5822_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT5822; + g_stTestFuncs.Start_Test = FT5822_StartTest; + g_stTestFuncs.Get_test_data = FT5822_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT8006_TEST) + +boolean FT8006_StartTest(void); +int FT8006_get_test_data(char *pTestData); + +void OnInit_FT8006_TestItem(char *strIniFile); +void OnInit_FT8006_BasicThreshold(char *strIniFile); +void SetTestItem_FT8006(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8006_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8006_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8006; + g_stTestFuncs.Start_Test = FT8006_StartTest; + g_stTestFuncs.Get_test_data = FT8006_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FT8736_TEST) + +boolean FT8736_StartTest(void); +int FT8736_get_test_data(char *pTestData); + +void OnInit_FT8736_TestItem(char *strIniFile); +void OnInit_FT8736_BasicThreshold(char *strIniFile); +void SetTestItem_FT8736(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8736_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8736_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8736; + g_stTestFuncs.Start_Test = FT8736_StartTest; + g_stTestFuncs.Get_test_data = FT8736_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTE736_TEST) + +boolean FTE736_StartTest(void); +int FTE736_get_test_data(char *pTestData); + +void OnInit_FTE736_TestItem(char *strIniFile); +void OnInit_FTE736_BasicThreshold(char *strIniFile); +void SetTestItem_FTE736(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FTE736_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FTE736_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FTE736; + g_stTestFuncs.Start_Test = FTE736_StartTest; + g_stTestFuncs.Get_test_data = FTE736_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTE716_TEST) + +boolean FTE716_StartTest(void); +int FTE716_get_test_data(char *pTestData); + +void OnInit_FTE716_TestItem(char *strIniFile); +void OnInit_FTE716_BasicThreshold(char *strIniFile); +void SetTestItem_FTE716(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FTE716_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FTE716_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FTE716; + g_stTestFuncs.Start_Test = FTE716_StartTest; + g_stTestFuncs.Get_test_data = FTE716_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT8606_TEST) + +boolean FT8606_StartTest(void); +int FT8606_get_test_data(char *pTestData); + +void OnInit_FT8606_TestItem(char *strIniFile); +void OnInit_FT8606_BasicThreshold(char *strIniFile); +void SetTestItem_FT8606(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8606_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8606_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8606; + g_stTestFuncs.Start_Test = FT8606_StartTest; + g_stTestFuncs.Get_test_data = FT8606_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT3C47_TEST) + +boolean FT3C47_StartTest(void); +int FT3C47_get_test_data(char *pTestData); + +void OnInit_FT3C47_TestItem(char *strIniFile); +void OnInit_FT3C47_BasicThreshold(char *strIniFile); +void SetTestItem_FT3C47(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT3C47_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT3C47_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT3C47; + g_stTestFuncs.Start_Test = FT3C47_StartTest; + g_stTestFuncs.Get_test_data = FT3C47_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#endif + + diff --git a/drivers/input/touchscreen/FT5346/ft5346.c b/drivers/input/touchscreen/FT5346/ft5346.c new file mode 100644 index 0000000000000..174a61760177f --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft5346.c @@ -0,0 +1,3296 @@ +/* + * + * FocalTech ft5x06 TouchScreen driver. + * + * Copyright (c) 2010 Focal tech Ltd. + * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if WT_ADD_CTP_INFO +#include +#endif + +#if WT_CTP_GESTURE_SUPPORT + +#define FTS_GESTRUE_POINTS 255 +#define FTS_GESTRUE_POINTS_HEADER 8 + +static void Ctp_Gesture_Fucntion_Proc_File(void); +static char gtp_gesture_value; +static char gtp_gesture_onoff = '0'; +unsigned short coordinate_x[150] = {0}; +unsigned short coordinate_y[150] = {0}; +#endif + +#if CTP_CHARGER_DETECT +#include +#endif + +#if defined(CONFIG_FB) +#include +#include + +#elif defined(CONFIG_HAS_EARLYSUSPEND) +#include +/* Early-suspend level */ +#define FT_SUSPEND_LEVEL 1 +#endif + + +#if WT_ADD_CTP_INFO +static u8 lockdown_info[FT_LOCKDOWN_SIZE]; + +static u8 nomal_boot; + +#endif +u8 tp_rgb_color; + +static u8 TP_Maker, LCD_Maker, Panel_Ink, Project_Id; +static char lcd_ic_name[10] = {0}; +extern char Lcm_name[HARDWARE_MAX_ITEM_LONGTH]; + +#define FT_MAX_SIZE 64 + +#define FT_DEBUG_DIR_NAME "ts_debug" + +#define TPD_MAX_POINTS_5 5 +#define TPD_MAX_POINTS_10 10 + +#define TPD_MAX_POINTS_2 2 +#define AUTO_CLB_NEED 1 +#define AUTO_CLB_NONEED 0 +struct Upgrade_Info fts_updateinfo_curr; +static struct Upgrade_Info fts_updateinfo[] = { + {0x55, "FT5x06", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x03, 1, 2000}, + {0x08, "FT5606", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x06, 100, 2000}, + {0x0a, "FT5x16", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x07, 1, 1500}, + {0x05, "FT6208", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 60, 30, 0x79, 0x05, 10, 2000}, + {0x06, "FT6x06", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 100, 30, 0x79, 0x08, 10, 2000}, + {0x36, "FT6x36", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 100, 30, 0x79, 0x18, 10, 2000}, + {0x55, "FT5x06i", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x03, 1, 2000}, + {0x14, "FT5336", TPD_MAX_POINTS_10, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x13, "FT3316", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x12, "FT5436i", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x11, "FT5336i", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x54, "FT5x46", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 2, 2, 0x54, 0x2c, 10, 1350}, +}; + +#define FT_STORE_TS_INFO(buf, id, name, max_tch, group_id, fw_vkey_support, \ + fw_name, fw_maj, fw_min, fw_sub_min) \ + snprintf(buf, FT_INFO_MAX_LEN, \ + "controller\t= focaltech\n" \ + "model\t\t= 0x%x\n" \ + "name\t\t= %s\n" \ + "max_touches\t= %d\n" \ + "drv_ver\t\t= 0x%x\n" \ + "group_id\t= 0x%x\n" \ + "fw_vkey_support\t= %s\n" \ + "fw_name\t\t= %s\n" \ + "fw_ver\t\t= %d.%d.%d\n", id, name, \ + max_tch, FT_DRIVER_VERSION, group_id, \ + fw_vkey_support, fw_name, fw_maj, fw_min, \ + fw_sub_min) + +#if CTP_PROC_INTERFACE +#define CTP_PARENT_PROC_NAME "touchscreen" +#define CTP_OPEN_PROC_NAME "ctp_openshort_test" +#define FTS_INI_FILE_NAME "ft5346_ds.ini" + +static DEFINE_MUTEX(fts_mutex); +struct i2c_client *fts_i2c_client = NULL; +EXPORT_SYMBOL(fts_i2c_client); +extern int fts_open_short_test(char *ini_file_name, char *bufdest, ssize_t *pinumread); + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); +static const struct file_operations ctp_open_procs_fops = { + .write = ctp_open_proc_write, + .read = ctp_open_proc_read, + .owner = THIS_MODULE, +}; +#endif + + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO +#define CTP_PARENT_PROC_NAME "touchscreen" +#define CTP_LOCKDOWN_INFOR_NAME "lockdown_info" + +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); +static const struct file_operations ctp_lockdown_procs_fops = { + .write = ctp_lockdown_proc_write, + .read = ctp_lockdown_proc_read, + .owner = THIS_MODULE, +}; +#endif + + +#if FTS_PROC_APK_DEBUG +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_RAWDATA 3 +#define PROC_AUTOCLB 4 + +#define PROC_NAME "ft5x0x-debug" +static unsigned char proc_operate_mode = PROC_RAWDATA; +static struct proc_dir_entry *ft5x0x_proc_entry; +#endif + +static u8 is_ic_update_crash; +static struct i2c_client *update_client; +static struct i2c_client *gesture_client; + +static struct proc_dir_entry *ctp_device_proc; + +#if CTP_CHARGER_DETECT +extern int power_supply_get_battery_charge_state(struct power_supply *psy); +static struct power_supply *batt_psy; +static u8 is_charger_plug; +static u8 pre_charger_status; + +#endif + +#if CTP_SYS_APK_UPDATE +static struct i2c_client *g_focalclient +#endif + +#if CTP_SYS_APK_UPDATE +static int focal_i2c_Read(unsigned char *writebuf, + int writelen, unsigned char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = g_focalclient->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = g_focalclient->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(g_focalclient->adapter, msgs, 2); + if (ret < 0) + dev_err(&g_focalclient->dev, "f%s: i2c read error.\n", + __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = g_focalclient->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(g_focalclient->adapter, msgs, 1); + if (ret < 0) + dev_err(&g_focalclient->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} +/*write data by i2c*/ +static int focal_i2c_Write(unsigned char *writebuf, int writelen) +{ + int ret; + + struct i2c_msg msg[] = { + { + .addr = g_focalclient->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(g_focalclient->adapter, msg, 1); + if (ret < 0) + dev_err(&g_focalclient->dev, "%s i2c write error.\n", __func__); + + return ret; +} +#endif + +static int ft5x06_i2c_read(struct i2c_client *client, char *writebuf, + int writelen, char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) + dev_err(&client->dev, "%s: i2c read error.\n", __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} + +static int ft5x06_i2c_write(struct i2c_client *client, char *writebuf, + int writelen) +{ + int ret; + + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s: i2c write error.\n", __func__); + + return ret; +} + +static int ft5x0x_write_reg(struct i2c_client *client, u8 addr, const u8 val) +{ + u8 buf[2] = {0}; + + buf[0] = addr; + buf[1] = val; + + return ft5x06_i2c_write(client, buf, sizeof(buf)); +} + +static int ft5x0x_read_reg(struct i2c_client *client, u8 addr, u8 *val) +{ + return ft5x06_i2c_read(client, &addr, 1, val, 1); +} + +static void ft5x06_update_fw_vendor_id(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + u8 reg_addr; + int err; + + reg_addr = FT_REG_FW_VENDOR_ID; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_vendor_id, 1); + if (err < 0) + dev_err(&client->dev, "fw vendor id read failed"); + + dev_err(&client->dev, "WT: fw vendor id = %d ", data->fw_vendor_id); +} + +static void ft5x06_update_fw_ver(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + u8 reg_addr; + int err; + + reg_addr = FT_REG_FW_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[0], 1); + if (err < 0) + dev_err(&client->dev, "fw major version read failed"); + + reg_addr = FT_REG_FW_MIN_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[1], 1); + if (err < 0) + dev_err(&client->dev, "fw minor version read failed"); + + reg_addr = FT_REG_FW_SUB_MIN_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[2], 1); + if (err < 0) + dev_err(&client->dev, "fw sub minor version read failed"); + + dev_info(&client->dev, "Firmware version = %d.%d.%d\n", + data->fw_ver[0], data->fw_ver[1], data->fw_ver[2]); +} + +#if WT_CTP_GESTURE_SUPPORT +static void check_gesture(int gesture_id, struct input_dev *ip_dev) +{ + + switch (gesture_id) { + case 0x24: + gtp_gesture_value = 'K'; + input_report_key(ip_dev, KEYCODE_WAKEUP, 1); + input_sync(ip_dev); + input_report_key(ip_dev, KEYCODE_WAKEUP, 0); + input_sync(ip_dev); + break; + default: + break; + } +} +static int fts_read_Gestruedata(struct input_dev *ip_dev) +{ + unsigned char buf[FTS_GESTRUE_POINTS * 3] = { 0 }; + int ret = -1; + int i = 0; + int gestrue_id = 0; + short pointnum = 0; + buf[0] = 0xd3; + + pointnum = 0; + ret = ft5x06_i2c_read(gesture_client, buf, 1, buf, FTS_GESTRUE_POINTS_HEADER); + if (ret < 0) { + CTP_ERROR("%s read touchdata failed.\n", __func__); + return ret; + } + CTP_ERROR("tpd %d read buf data.\n", buf[0]); + if (0x24 == buf[0]) { + gestrue_id = 0x24; + check_gesture(gestrue_id, ip_dev); + CTP_ERROR("tpd %d check_gesture gestrue_id.\n", gestrue_id); + return -EPERM; + } + + /* FW */ + + { + gestrue_id = buf[0]; + pointnum = (short)(buf[1]) & 0xff; + buf[0] = 0xd3; + + if ((pointnum * 4 + 8) < 255) { + ret = ft5x06_i2c_read(gesture_client, buf, 1, buf, (pointnum * 4 + 8)); + } else { + ret = ft5x06_i2c_read(gesture_client, buf, 1, buf, 255); + ret = ft5x06_i2c_read(gesture_client, buf, 0, buf+255, (pointnum * 4 + 8) - 255); + } + if (ret < 0) { + CTP_ERROR("%s read touchdata failed.\n", __func__); + return ret; + } + +printk("wdb: gestrue_id = %d \n", gestrue_id); + + + check_gesture(gestrue_id, ip_dev); + for (i = 0; i < pointnum; i++) { + coordinate_x[i] = (((s16) buf[0 + (4 * i)]) & 0x0F) << + 8 | (((s16) buf[1 + (4 * i)]) & 0xFF); + coordinate_y[i] = (((s16) buf[2 + (4 * i)]) & 0x0F) << + 8 | (((s16) buf[3 + (4 * i)]) & 0xFF); + } + return -EPERM; + } + + return -EPERM; +} +#endif + + +static irqreturn_t ft5x06_ts_interrupt(int irq, void *dev_id) +{ + struct ft5x06_ts_data *data = dev_id; + struct input_dev *ip_dev; + int rc, i, ret; + u32 id, x, y, status, num_touches; + u8 reg = 0x00, *buf, state; + bool update_input = false; + + if (!data) { + CTP_ERROR("%s: Invalid data\n", __func__); + return IRQ_HANDLED; + } + +#if CTP_CHARGER_DETECT + if (!batt_psy) { + + batt_psy = power_supply_get_by_name("usb"); + } else{ + + + + if (is_charger_plug != pre_charger_status) { + pre_charger_status = is_charger_plug; + ft5x0x_write_reg(update_client, 0x8B, is_charger_plug); + + } + } + +#endif + + ip_dev = data->input_dev; + buf = data->tch_data; + + rc = ft5x06_i2c_read(data->client, ®, 1, + buf, data->tch_data_len); + if (rc < 0) { + dev_err(&data->client->dev, "%s: read data fail\n", __func__); + return IRQ_HANDLED; + } + +#if WT_CTP_GESTURE_SUPPORT + if (gtp_gesture_onoff == '1') { + ret = ft5x0x_read_reg(gesture_client, 0xd0, &state); + CTP_DEBUG("in event gesture:%d\n", state); + if (ret < 0) { + CTP_ERROR("read value fail"); + } + if (state == 1) { + fts_read_Gestruedata(ip_dev); + return IRQ_HANDLED; + } + } +#endif + + for (i = 0; i < data->pdata->num_max_touches; i++) { + id = (buf[FT_TOUCH_ID_POS + FT_ONE_TCH_LEN * i]) >> 4; + if (id >= FT_MAX_ID) + break; + + update_input = true; + + x = (buf[FT_TOUCH_X_H_POS + FT_ONE_TCH_LEN * i] & 0x0F) << 8 | + (buf[FT_TOUCH_X_L_POS + FT_ONE_TCH_LEN * i]); + y = (buf[FT_TOUCH_Y_H_POS + FT_ONE_TCH_LEN * i] & 0x0F) << 8 | + (buf[FT_TOUCH_Y_L_POS + FT_ONE_TCH_LEN * i]); + + status = buf[FT_TOUCH_EVENT_POS + FT_ONE_TCH_LEN * i] >> 6; + + num_touches = buf[FT_TD_STATUS] & FT_STATUS_NUM_TP_MASK; + + /* invalid combination */ + if (!num_touches && !status && !id) + break; + + input_mt_slot(ip_dev, id); + if (status == FT_TOUCH_DOWN || status == FT_TOUCH_CONTACT) { + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 1); + input_report_abs(ip_dev, ABS_MT_POSITION_X, x); + input_report_abs(ip_dev, ABS_MT_POSITION_Y, y); + } else { + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 0); + } + } + + if (update_input) { + input_mt_report_pointer_emulation(ip_dev, false); + input_sync(ip_dev); + } + + if (num_touches == 0) { + for (i = 0; i < data->pdata->num_max_touches; i++) { + input_mt_slot(ip_dev, i); + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 0); + } + input_mt_report_pointer_emulation(ip_dev, false); + input_sync(ip_dev); + } + + return IRQ_HANDLED; +} + +static int ft5x06_power_on(struct ft5x06_ts_data *data, bool on) +{ + int rc; + + if (!on) + goto power_off; + + rc = regulator_enable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd enable failed rc=%d\n", rc); + return rc; + } + + rc = regulator_enable(data->vcc_i2c); + if (rc) { + dev_err(&data->client->dev, + "Regulator vcc_i2c enable failed rc=%d\n", rc); + regulator_disable(data->vdd); + } + + return rc; + +power_off: + rc = regulator_disable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd disable failed rc=%d\n", rc); + return rc; + } + + rc = regulator_disable(data->vcc_i2c); + if (rc) { + dev_err(&data->client->dev, + "Regulator vcc_i2c disable failed rc=%d\n", rc); + rc = regulator_enable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd enable failed rc=%d\n", rc); + } + } + + return rc; +} + +static int ft5x06_power_init(struct ft5x06_ts_data *data, bool on) +{ + int rc; + + if (!on) + goto pwr_deinit; + + data->vdd = regulator_get(&data->client->dev, "vdd"); + if (IS_ERR(data->vdd)) { + rc = PTR_ERR(data->vdd); + dev_err(&data->client->dev, + "Regulator get failed vdd rc=%d\n", rc); + return rc; + } + + if (regulator_count_voltages(data->vdd) > 0) { + rc = regulator_set_voltage(data->vdd, FT_VTG_MIN_UV, + FT_VTG_MAX_UV); + if (rc) { + dev_err(&data->client->dev, + "Regulator set_vtg failed vdd rc=%d\n", rc); + goto reg_vdd_put; + } + } + + data->vcc_i2c = regulator_get(&data->client->dev, "vcc_i2c"); + if (IS_ERR(data->vcc_i2c)) { + rc = PTR_ERR(data->vcc_i2c); + dev_err(&data->client->dev, + "Regulator get failed vcc_i2c rc=%d\n", rc); + goto reg_vdd_set_vtg; + } + + if (regulator_count_voltages(data->vcc_i2c) > 0) { + rc = regulator_set_voltage(data->vcc_i2c, FT_I2C_VTG_MIN_UV, + FT_I2C_VTG_MAX_UV); + if (rc) { + dev_err(&data->client->dev, + "Regulator set_vtg failed vcc_i2c rc=%d\n", rc); + goto reg_vcc_i2c_put; + } + } + + return 0; + +reg_vcc_i2c_put: + regulator_put(data->vcc_i2c); +reg_vdd_set_vtg: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FT_VTG_MAX_UV); +reg_vdd_put: + regulator_put(data->vdd); + return rc; + +pwr_deinit: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FT_VTG_MAX_UV); + + regulator_put(data->vdd); + + if (regulator_count_voltages(data->vcc_i2c) > 0) + regulator_set_voltage(data->vcc_i2c, 0, FT_I2C_VTG_MAX_UV); + + regulator_put(data->vcc_i2c); + return 0; +} + +static int ft5x06_ts_pinctrl_init(struct ft5x06_ts_data *ft5x06_data) +{ + int retval; + + /* Get pinctrl if target uses pinctrl */ + ft5x06_data->ts_pinctrl = devm_pinctrl_get(&(ft5x06_data->client->dev)); + if (IS_ERR_OR_NULL(ft5x06_data->ts_pinctrl)) { + dev_dbg(&ft5x06_data->client->dev, + "Target does not use pinctrl\n"); + retval = PTR_ERR(ft5x06_data->ts_pinctrl); + ft5x06_data->ts_pinctrl = NULL; + return retval; + } + + ft5x06_data->gpio_state_active + = pinctrl_lookup_state(ft5x06_data->ts_pinctrl, + "pmx_ts_active"); + if (IS_ERR_OR_NULL(ft5x06_data->gpio_state_active)) { + dev_dbg(&ft5x06_data->client->dev, + "Can not get ts default pinstate\n"); + retval = PTR_ERR(ft5x06_data->gpio_state_active); + ft5x06_data->ts_pinctrl = NULL; + return retval; + } + + ft5x06_data->gpio_state_suspend + = pinctrl_lookup_state(ft5x06_data->ts_pinctrl, + "pmx_ts_suspend"); + if (IS_ERR_OR_NULL(ft5x06_data->gpio_state_suspend)) { + dev_err(&ft5x06_data->client->dev, + "Can not get ts sleep pinstate\n"); + retval = PTR_ERR(ft5x06_data->gpio_state_suspend); + ft5x06_data->ts_pinctrl = NULL; + return retval; + } + return 0; +} + + +static void ft5x06_ts_pinctrl_free(struct ft5x06_ts_data *ft5x06_data) +{ + /* Put pinctrl if target uses pinctrl */ + if (!IS_ERR_OR_NULL(ft5x06_data->ts_pinctrl)) { + devm_pinctrl_put(ft5x06_data->ts_pinctrl); + ft5x06_data->ts_pinctrl = NULL; + } +} + +static int ft5x06_ts_pinctrl_select(struct ft5x06_ts_data *ft5x06_data, + bool on) +{ + struct pinctrl_state *pins_state; + int ret; + + pins_state = on ? ft5x06_data->gpio_state_active + : ft5x06_data->gpio_state_suspend; + if (!IS_ERR_OR_NULL(pins_state)) { + ret = pinctrl_select_state(ft5x06_data->ts_pinctrl, pins_state); + if (ret) { + dev_err(&ft5x06_data->client->dev, + "can not set %s pins\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + return ret; + } + } else { + dev_err(&ft5x06_data->client->dev, + "not a valid '%s' pinstate\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + } + + return 0; +} + + +#ifdef CONFIG_PM +static int ft5x06_ts_suspend(struct device *dev) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + char txbuf[2], i; + int err; + + if (data->loading_fw) { + dev_info(dev, "Firmware loading in process...\n"); + return 0; + } + + if (data->suspended) { + dev_info(dev, "Already in suspend state\n"); + return 0; + } + +#if WT_CTP_GESTURE_SUPPORT + if (gtp_gesture_onoff == '1') { + ft5x0x_write_reg(gesture_client, 0xd0, 0x01); + + { + ft5x0x_write_reg(gesture_client, 0xd1, 0xff); + ft5x0x_write_reg(gesture_client, 0xd2, 0xff); + ft5x0x_write_reg(gesture_client, 0xd5, 0xff); + ft5x0x_write_reg(gesture_client, 0xd6, 0xff); + ft5x0x_write_reg(gesture_client, 0xd7, 0xff); + ft5x0x_write_reg(gesture_client, 0xd8, 0xff); + } + enable_irq_wake(data->client->irq); + CTP_DEBUG("in suspend gesture\n"); + return 0; + } +#endif + + disable_irq(data->client->irq); + + /* release all touches */ + for (i = 0; i < data->pdata->num_max_touches; i++) { + input_mt_slot(data->input_dev, i); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, 0); + } + input_mt_report_pointer_emulation(data->input_dev, false); + input_sync(data->input_dev); + + if (gpio_is_valid(data->pdata->reset_gpio)) { + txbuf[0] = FT_REG_PMODE; + txbuf[1] = FT_PMODE_HIBERNATE; + err = ft5x06_i2c_write(data->client, txbuf, sizeof(txbuf)); + + msleep(data->pdata->hard_rst_dly); + } + + + if (data->pdata->power_on) { + err = data->pdata->power_on(false); + if (err) { + dev_err(dev, "power off failed"); + goto pwr_off_fail; + } + } else { + err = ft5x06_power_on(data, false); + if (err) { + dev_err(dev, "power off failed"); + goto pwr_off_fail; + } + } + + data->suspended = true; + + return 0; + + +pwr_off_fail: + if (gpio_is_valid(data->pdata->reset_gpio)) { + gpio_set_value_cansleep(data->pdata->reset_gpio, 0); + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + enable_irq(data->client->irq); + return err; + +} + +static int ft5x06_ts_resume(struct device *dev) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + int err; + if (!data->suspended) { + dev_dbg(dev, "Already in awake state\n"); + + } +#if WT_CTP_GESTURE_SUPPORT + printk("Resume Gesture TP.\n"); + if (gtp_gesture_onoff == '1') { + ft5x0x_write_reg(gesture_client, 0xD0, 0x00); + CTP_DEBUG("Resume Gesture TP Done.\n"); + } +#endif + + if (data->pdata->power_on) { + err = data->pdata->power_on(true); + if (err) { + dev_err(dev, "power on failed"); + return err; + } + } else { + err = ft5x06_power_on(data, true); + if (err) { + dev_err(dev, "power on failed"); + return err; + } + } + + if (gpio_is_valid(data->pdata->reset_gpio)) { + gpio_set_value_cansleep(data->pdata->reset_gpio, 0); + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + + msleep(data->pdata->soft_rst_dly); + + enable_irq(data->client->irq); + +#if CTP_CHARGER_DETECT + batt_psy = power_supply_get_by_name("usb"); + if (!batt_psy) + CTP_ERROR("tp resume battery supply not found\n"); + else{ + + + CTP_DEBUG("is_charger_plug %d, prev %d", is_charger_plug, pre_charger_status); + if (is_charger_plug) { + ft5x0x_write_reg(update_client, 0x8B, 1); + } else{ + ft5x0x_write_reg(update_client, 0x8B, 0); + } + } + pre_charger_status = is_charger_plug; +#endif + + + data->suspended = false; + + return 0; +} + +static const struct dev_pm_ops ft5x06_ts_pm_ops = { +#if (!defined(CONFIG_FB) && !defined(CONFIG_HAS_EARLYSUSPEND)) + .suspend = ft5x06_ts_suspend, + .resume = ft5x06_ts_resume, +#endif +}; + +#else +static int ft5x06_ts_suspend(struct device *dev) +{ + return 0; +} + +static int ft5x06_ts_resume(struct device *dev) +{ + return 0; +} + +#endif + +#if defined(CONFIG_FB) + +static void fb_notify_resume_work(struct work_struct *work) +{ + struct ft5x06_ts_data *ft5x06_data = + container_of(work, struct ft5x06_ts_data, fb_notify_work); + ft5x06_ts_resume(&ft5x06_data->client->dev); +} +static int fb_notifier_callback(struct notifier_block *self, + unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct ft5x06_ts_data *ft5x06_data = + container_of(self, struct ft5x06_ts_data, fb_notif); + + if (evdata && evdata->data && event == FB_EVENT_BLANK && + ft5x06_data && ft5x06_data->client) { + blank = evdata->data; + if (*blank == FB_BLANK_UNBLANK) + schedule_work(&ft5x06_data->fb_notify_work); + else if (*blank == FB_BLANK_POWERDOWN) { + flush_work(&ft5x06_data->fb_notify_work); + ft5x06_ts_suspend(&ft5x06_data->client->dev); + } + } + + return 0; +} +#elif defined(CONFIG_HAS_EARLYSUSPEND) +static void ft5x06_ts_early_suspend(struct early_suspend *handler) +{ + struct ft5x06_ts_data *data = container_of(handler, + struct ft5x06_ts_data, + early_suspend); + + ft5x06_ts_suspend(&data->client->dev); +} + +static void ft5x06_ts_late_resume(struct early_suspend *handler) +{ + struct ft5x06_ts_data *data = container_of(handler, + struct ft5x06_ts_data, + early_suspend); + + ft5x06_ts_resume(&data->client->dev); +} +#endif + + +int hid_to_i2c(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[5] = {0}; + int bRet = 0; +#ifdef HIDTOI2C_DISABLE + + return 2; + +#endif + auc_i2c_write_buf[0] = 0xeb; + auc_i2c_write_buf[1] = 0xaa; + auc_i2c_write_buf[2] = 0x09; + ft5x06_i2c_write(client, auc_i2c_write_buf, 3); + msleep(10); + auc_i2c_write_buf[0] = auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = 0; + ft5x06_i2c_read(client, auc_i2c_write_buf, 0, auc_i2c_write_buf, 3); + CTP_DEBUG("auc_i2c_write_buf[0]:%x, auc_i2c_write_buf[1]:%x, auc_i2c_write_buf[2]:%x\n", auc_i2c_write_buf[0], auc_i2c_write_buf[1], auc_i2c_write_buf[2]); + if (0xeb == auc_i2c_write_buf[0] && 0xaa == auc_i2c_write_buf[1] && 0x08 == auc_i2c_write_buf[2]) { + bRet = 1; + } else + bRet = 0; + return bRet; +} + +static int ft5x06_fw_upgrade_start(struct i2c_client *client, + const u8 *data, u32 data_len) { + struct ft5x06_ts_data *ts_data = i2c_get_clientdata(client); + struct fw_upgrade_info info = ts_data->pdata->info; + + u8 reg_addr; + u8 chip_id = 0x00; + u8 w_buf[FT_MAX_WR_BUF] = {0}, r_buf[FT_MAX_RD_BUF] = {0}; + u8 pkt_buf[FT_FW_PKT_LEN + FT_FW_PKT_META_LEN]; + int i, j, temp; + u32 pkt_num, pkt_len; + + + u8 fw_ecc; + int i_ret; + + + +#if 1 + reg_addr = FT_REG_ID; + temp = ft5x06_i2c_read(client, ®_addr, 1, &chip_id, 1); + CTP_DEBUG("Update:Read ic info:%x\n", chip_id); + if (temp < 0) { + dev_err(&client->dev, "version read failed"); + } + + if (is_ic_update_crash) { + chip_id = CTP_IC_TYPE_2; + } + + for (i = 0; i < sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info); i++) { + if (chip_id == fts_updateinfo[i].CHIP_ID) { + info.auto_cal = fts_updateinfo[i].AUTO_CLB; + info.delay_55 = fts_updateinfo[i].delay_55; + info.delay_aa = fts_updateinfo[i].delay_aa; + info.delay_erase_flash = fts_updateinfo[i].delay_earse_flash; + info.delay_readid = fts_updateinfo[i].delay_readid; + info.upgrade_id_1 = fts_updateinfo[i].upgrade_id_1; + info.upgrade_id_2 = fts_updateinfo[i].upgrade_id_2; + + break; + } + } + + ts_data->family_id = chip_id; + + if (i >= sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info)) { + info.auto_cal = fts_updateinfo[11].AUTO_CLB; + info.delay_55 = fts_updateinfo[11].delay_55; + info.delay_aa = fts_updateinfo[11].delay_aa; + info.delay_erase_flash = fts_updateinfo[11].delay_earse_flash; + info.delay_readid = fts_updateinfo[11].delay_readid; + info.upgrade_id_1 = fts_updateinfo[11].upgrade_id_1; + info.upgrade_id_2 = fts_updateinfo[11].upgrade_id_2; + } +#endif + + dev_err(&client->dev, "id1 = 0x%x id2 = 0x%x family_id=0x%x,data_len = %d\n", + info.upgrade_id_1, info.upgrade_id_2, ts_data->family_id, data_len); + /* determine firmware size */ + i_ret = hid_to_i2c(client); + + if (i_ret == 0) { + CTP_DEBUG("[FTS] hid change to i2c fail ! \n"); + } + + for (i = 0, j = 0; i < FT_UPGRADE_LOOP; i++) { + msleep(FT_EARSE_DLY_MS); + ft5x0x_write_reg(client, 0xfc, FT_UPGRADE_AA); + msleep(info.delay_aa); + + + ft5x0x_write_reg(client, 0xfc, FT_UPGRADE_55); + msleep(200); + i_ret = hid_to_i2c(client); + if (i_ret == 0) { + CTP_DEBUG("[FTS] hid change to i2c fail ! \n"); + + } + + msleep(10); + /* Enter upgrade mode */ + w_buf[0] = FT_UPGRADE_55; + ft5x06_i2c_write(client, &w_buf[0], 1); + usleep(FT_55_AA_DLY_NS); + w_buf[0] = FT_UPGRADE_AA; + ft5x06_i2c_write(client, &w_buf[0], 1); + if (i_ret < 0) { + CTP_DEBUG("[FTS] failed writing 0x55 and 0xaa ! \n"); + continue; + } + + + /* check READ_ID */ + msleep(info.delay_readid); + w_buf[0] = FT_READ_ID_REG; + w_buf[1] = 0x00; + w_buf[2] = 0x00; + w_buf[3] = 0x00; + + ft5x06_i2c_read(client, w_buf, 4, r_buf, 2); + + + CTP_DEBUG("r_buf[0] :%X,r_buf[1]: %X\n", r_buf[0], r_buf[1]); + if (r_buf[0] != info.upgrade_id_1 + || r_buf[1] != info.upgrade_id_2) { + dev_err(&client->dev, "Upgrade ID mismatch(%d), IC=0x%x 0x%x, info=0x%x 0x%x\n", + i, r_buf[0], r_buf[1], + info.upgrade_id_1, info.upgrade_id_2); + } else + break; + } + CTP_DEBUG("Begin to update \n\n"); + if (i >= FT_UPGRADE_LOOP) { + dev_err(&client->dev, "Abort upgrade\n"); + return -EIO; + } + + /* erase app and panel paramenter area */ + CTP_DEBUG("Step 4:erase app and panel paramenter area\n"); + w_buf[0] = FT_ERASE_APP_REG; + ft5x06_i2c_write(client, w_buf, 1); + msleep(1350); + + for (i = 0; i < 15; i++) { + w_buf[0] = 0x6a; + r_buf[0] = r_buf[1] = 0x00; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 2); + + if (0xF0 == r_buf[0] && 0xAA == r_buf[1]) { + break; + } + msleep(50); + + } + + w_buf[0] = 0xB0; + w_buf[1] = (u8) ((data_len >> 16) & 0xFF); + w_buf[2] = (u8) ((data_len >> 8) & 0xFF); + w_buf[3] = (u8) (data_len & 0xFF); + + ft5x06_i2c_write(client, w_buf, 4); + + /* program firmware */ + CTP_DEBUG("Step 5:program firmware\n"); + pkt_num = (data_len) / FT_FW_PKT_LEN; + pkt_buf[0] = FT_FW_START_REG; + pkt_buf[1] = 0x00; + fw_ecc = 0; + temp = 0; + + for (j = 0; j < pkt_num; j++) { + temp = j * FT_FW_PKT_LEN; + pkt_buf[2] = (u8) (temp >> 8); + pkt_buf[3] = (u8) temp; + pkt_len = FT_FW_PKT_LEN; + pkt_buf[4] = (u8) (pkt_len >> 8); + pkt_buf[5] = (u8) pkt_len; + + for (i = 0; i < FT_FW_PKT_LEN; i++) { + pkt_buf[6 + i] = data[j * FT_FW_PKT_LEN + i]; + fw_ecc ^= pkt_buf[6 + i]; + } + + ft5x06_i2c_write(client, pkt_buf, FT_FW_PKT_LEN + 6); + + for (i = 0; i < 30; i++) { + w_buf[0] = 0x6a; + r_buf[0] = r_buf[1] = 0x00; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 2); + + if ((j + 0x1000) == (((r_buf[0]) << 8) | r_buf[1])) { + break; + } + msleep(1); + } + } + + /* send remaining bytes */ + CTP_DEBUG("Step 6:send remaining bytes\n"); + if ((data_len) % FT_FW_PKT_LEN > 0) { + temp = pkt_num * FT_FW_PKT_LEN; + pkt_buf[2] = (u8) (temp >> 8); + pkt_buf[3] = (u8) temp; + temp = (data_len) % FT_FW_PKT_LEN; + pkt_buf[4] = (u8) (temp >> 8); + pkt_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + pkt_buf[6 + i] = data[pkt_num * FT_FW_PKT_LEN + i]; + fw_ecc ^= pkt_buf[6 + i]; + } + + ft5x06_i2c_write(client, pkt_buf, temp + 6); + + for (i = 0; i < 30; i++) { + w_buf[0] = 0x6a; + r_buf[0] = r_buf[1] = 0x00; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 2); + + if ((j + 0x1000) == (((r_buf[0]) << 8) | r_buf[1])) { + break; + } + msleep(1); + } + } + + msleep(50); + + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + CTP_DEBUG("Step 7: read out checksum\n"); + w_buf[0] = 0x64; + ft5x06_i2c_write(client, w_buf, 1); + msleep(300); + + temp = 0; + w_buf[0] = 0x65; + w_buf[1] = (u8)(temp >> 16); + w_buf[2] = (u8)(temp >> 8); + w_buf[3] = (u8)(temp); + temp = data_len; + w_buf[4] = (u8)(temp >> 8); + w_buf[5] = (u8)(temp); + i_ret = ft5x06_i2c_write(client, w_buf, 6); + msleep(data_len/256); + + for (i = 0; i < 100; i++) { + w_buf[0] = 0x6a; + r_buf[0] = r_buf[1] = 0x00; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 2); + + if (0xF0 == r_buf[0] && 0x55 == r_buf[1]) { + break; + } + msleep(1); + + } + w_buf[0] = 0x66; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 1); + if (r_buf[0] != fw_ecc) { + dev_err(&client->dev, "[FTS]--ecc error! FW=%02x bt_ecc=%02x\n", + r_buf[0], + fw_ecc); + + return -EIO; + } + + /* reset */ + CTP_DEBUG("Step 8: reset \n"); + w_buf[0] = FT_REG_RESET_FW; + ft5x06_i2c_write(client, w_buf, 1); + msleep(ts_data->pdata->soft_rst_dly); + + CTP_DEBUG("Firmware upgrade successful\n"); + + return 0; +} + +static void fts_get_upgrade_array(struct i2c_client *client) +{ + + u8 chip_id; + u32 i; + int ret = 0; + + ret = ft5x0x_read_reg(client, FT_REG_ID, &chip_id); + if (ret < 0) { + CTP_ERROR("[Focal][Touch] read value fail"); + } + + for (i = 0; i < sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info); i++) { + if (chip_id == fts_updateinfo[i].CHIP_ID) { + memcpy(&fts_updateinfo_curr, &fts_updateinfo[i], sizeof(struct Upgrade_Info)); + break; + } + } + + CTP_DEBUG("fts_updateinfo:%d\n", i); + if (i >= sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info)) { + memcpy(&fts_updateinfo_curr, &fts_updateinfo[11], sizeof(struct Upgrade_Info)); + } +} + +static void fts_ctpm_read_lockdown(struct i2c_client *client, struct ft5x06_ts_data *data) +{ + u8 buf[128]; + u8 w_buf[4], r_buf[2]; + u32 i = 0, j = 0; + u32 k = 0; + int i_ret; + struct ft5x06_ts_data *ts_data = i2c_get_clientdata(client); + + fts_get_upgrade_array(client); + CTP_DEBUG("id1 = 0x%x id2 = 0x%x\n", fts_updateinfo_curr.upgrade_id_1, fts_updateinfo_curr.upgrade_id_2); + i_ret = hid_to_i2c(client); + if (i_ret == 0) { + CTP_DEBUG("[FTS] hid change to i2c fail ! \n"); + } + + for (i = 0, j = 0; i < FT_UPGRADE_LOOP; i++) { + + + + CTP_DEBUG("[FTS]Step 1:Reset CTPM \n"); + ft5x0x_write_reg(client, 0xfc, 0xaa); + msleep(fts_updateinfo_curr.delay_aa); + ft5x0x_write_reg(client, 0xfc, 0x55); + msleep(100); + + i_ret = hid_to_i2c(client); + if (i_ret == 0) { + CTP_DEBUG("[FTS] hid change to i2c fail ! \n"); + } + msleep(2); + + /* Enter upgrade mode */ + CTP_DEBUG("[FTS]Step 2:Enter upgrade mode \n"); + w_buf[0] = FT_UPGRADE_55; + ft5x06_i2c_write(client, &w_buf[0], 1); + msleep(5); + w_buf[0] = FT_UPGRADE_AA; + ft5x06_i2c_write(client, &w_buf[0], 1); + + /* check READ_ID */ + msleep(fts_updateinfo_curr.delay_readid); + w_buf[0] = FT_READ_ID_REG; + w_buf[1] = 0x00; + w_buf[2] = 0x00; + w_buf[3] = 0x00; + ft5x06_i2c_read(client, w_buf, 4, r_buf, 2); + + CTP_DEBUG("r_buf[0] :%X,r_buf[1]: %X\n", r_buf[0], r_buf[1]); + if (r_buf[0] != fts_updateinfo_curr.upgrade_id_1 + || r_buf[1] != fts_updateinfo_curr.upgrade_id_2) { + dev_err(&client->dev, "Upgrade ID mismatch(%d), IC=0x%x 0x%x, info=0x%x 0x%x\n", + i, r_buf[0], r_buf[1], + fts_updateinfo_curr.upgrade_id_1, fts_updateinfo_curr.upgrade_id_2); + } else + break; + } + + /*--------- read current project setting ---------- */ + buf[0] = 0x03; + buf[1] = 0x00; + for (i = 0; i < FT_UPGRADE_LOOP; i++) { + buf[2] = 0xd7; + buf[3] = 0xa0; + + i_ret = ft5x06_i2c_write(client, buf, 4); + if (i_ret < 0) { + CTP_DEBUG("[FTS] Step 4: read lcm id from flash error when i2c write, i_ret = %d\n", i_ret); + continue; + } + + msleep(2); + + i_ret = ft5x06_i2c_read(client, buf, 0, data->lockdown_info, 8); + if (i_ret < 0) { + CTP_DEBUG("[FTS] Step 4: read lcm id from flash error when i2c write, i_ret = %d\n", i_ret); + continue; + } else { + CTP_DEBUG("[FTS] Step 4: read lcm id from flash success \n"); + break; + } + } + msleep(20); + + if (gpio_is_valid(ts_data->pdata->reset_gpio)) { + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); + msleep(ts_data->pdata->hard_rst_dly); + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 1); + } + msleep(80); + + for (k = 0 ; k < FT_LOCKDOWN_SIZE; k++) { + lockdown_info[k] = data->lockdown_info[k]; + } + + + tp_rgb_color = lockdown_info[2]; + TP_Maker = lockdown_info[0]; + LCD_Maker = lockdown_info[1]; + Panel_Ink = lockdown_info[2]; + Project_Id = lockdown_info[4]; + dev_info(&client->dev, "Lockdown info: %02X %02X %02X %02X %02X %02X %02X %02X", + lockdown_info[0], lockdown_info[1], + lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], + lockdown_info[6], lockdown_info[7]); + + dev_info(&client->dev, "WT: TP_Maker = 0x%x\n", TP_Maker); + dev_info(&client->dev, "WT: LCD_Maker = 0x%x\n", LCD_Maker); + dev_info(&client->dev, "WT: Panel_Ink = 0x%x\n", Panel_Ink); + dev_info(&client->dev, "WT: Project_Id = 0x%x\n", Project_Id); + +} + +#if TPD_AUTO_UPGRADE + +static unsigned char CTPM_FW1[] = { +#include "ft_app_ic_oufei_tianma.txt" +}; +static unsigned char CTPM_FW2[] = { +#include "ft_app_ic_ds_ebbg.txt" +}; +static unsigned char CTPM_FW3[] = { +#include "ft_app_ic_ds_ebbg_ili.txt" +}; +static unsigned char CTPM_FW4[] = { +#include "ft_app_ic_oufei_ebbg.txt" +}; + +static unsigned char CTPM_FW5[] = { +#include "ft_app_ic_oufei_ebbg_ili.txt" +}; +static unsigned char CTPM_FW6[] = { +#include "ft_app_ic_oufei_ebbg_nt.txt" +}; +static unsigned char CTPM_FW7[] = { +#include "ft_app_ic_lens_tianma.txt" +}; + +static int fts_ctpm_fw_upgrade_with_i_file(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + int flag_TPID = 0; + u8 *pbt_buf = 0x0; + int rc = 0, fw_len = 0; + u8 uc_host_fm_ver, uc_tp_fm_ver, vendor_id, ic_type; + u8 reg_addr; + + reg_addr = 0xA6; + ft5x06_i2c_read(client, ®_addr, 1, &uc_tp_fm_ver, 1); + reg_addr = 0xA8; + ft5x06_i2c_read(client, ®_addr, 1, &vendor_id, 1); + reg_addr = 0xA3; + ft5x06_i2c_read(client, ®_addr, 1, &ic_type, 1); + + CTP_INFO("Vendor ID:0x%02X, TP FW:0x%02X, IC TYPE:%d", vendor_id, uc_tp_fm_ver, ic_type); + if (vendor_id == 0xA8 || vendor_id == 0x00 || ic_type == 0xA3 || ic_type == 0x00) { + CTP_ERROR("vend_id read error,need project"); + + fts_ctpm_read_lockdown(client, data); + is_ic_update_crash = 1; + flag_TPID = 1; + } + + snprintf(lcd_ic_name, strchr(Lcm_name, '_')-Lcm_name + 1, Lcm_name); + + if (TP_Maker == TP_OUFEI && LCD_Maker == TP_TIANMA) { + pbt_buf = CTPM_FW1; + fw_len = sizeof(CTPM_FW1); + CTP_DEBUG("OUFEI+TIANMA"); + } else if (TP_Maker == TP_DS && LCD_Maker == TP_EBBG) { + + if (!strcmp(lcd_ic_name , "ili9881c")) { + pbt_buf = CTPM_FW3; + fw_len = sizeof(CTPM_FW3); + CTP_DEBUG("TP_DS+TP_EBBG+ili"); + } + + else { + pbt_buf = CTPM_FW2; + fw_len = sizeof(CTPM_FW2); + CTP_DEBUG("TP_DS+TP_EBBG"); + } + } else if (TP_Maker == TP_OUFEI && LCD_Maker == TP_EBBG && Project_Id == PROJECT_C3B) { + pbt_buf = CTPM_FW4; + fw_len = sizeof(CTPM_FW4); + CTP_DEBUG("TP_OUFEI+TP_EBBG"); + } else if (TP_Maker == TP_LENS && LCD_Maker == TP_TIANMA && Project_Id == PROJECT_C3B) { + pbt_buf = CTPM_FW7; + fw_len = sizeof(CTPM_FW7); + CTP_INFO("TP_LENS+TP_TIANMA ft_app_ic_lens_tianma.txt"); + } + + else if (TP_Maker == TP_OUFEI && LCD_Maker == TP_EBBG && Project_Id == PROJECT_C3N) { + if (!strcmp(lcd_ic_name , "ili9881c")) { + pbt_buf = CTPM_FW5; + fw_len = sizeof(CTPM_FW5); + CTP_DEBUG("TP_OUFEI+TP_EBBG_ili9881c"); + } else { + pbt_buf = CTPM_FW6; + fw_len = sizeof(CTPM_FW6); + CTP_DEBUG("TP_OUFEI+TP_EBBG_nt35521"); + } + } + + else { + CTP_ERROR("read vendor_id fail"); + return -EPERM; + } + + CTP_DEBUG("update firmware size:%d", fw_len); + if ((sizeof(CTPM_FW1) < 8) || (sizeof(CTPM_FW1) > FT_MAX_SIZE*1024) || (sizeof(CTPM_FW2) < 8) || (sizeof(CTPM_FW2) > FT_MAX_SIZE*1024)) { + CTP_ERROR("FW length error\n"); + return -EPERM; + } + + if ((pbt_buf[fw_len - 8] ^ pbt_buf[fw_len - 6]) == 0xFF + && (pbt_buf[fw_len - 7] ^ pbt_buf[fw_len - 5]) == 0xFF + && (pbt_buf[fw_len - 3] ^ pbt_buf[fw_len - 4]) == 0xFF) { + uc_host_fm_ver = pbt_buf[fw_len - 2]; + CTP_DEBUG("[FTS] uc_tp_fm_ver = %d.\n", uc_tp_fm_ver); + CTP_DEBUG("[FTS] uc_host_fm_ver = %d.\n", uc_host_fm_ver); + + if ((uc_tp_fm_ver < uc_host_fm_ver) || (is_ic_update_crash == 1)) { + rc = ft5x06_fw_upgrade_start(update_client, pbt_buf, fw_len); + if (rc != 0) { + CTP_DEBUG("[FTS] upgrade failed rc = %d.\n", rc); + } else { + CTP_DEBUG("[FTS] upgrade successfully.\n"); + } + } + } + + return rc; +} +#endif + +#if CTP_SYS_APK_UPDATE +static ssize_t ft5x06_fw_name_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u8 fw_version = 0x00; + + ft5x0x_read_reg(update_client, FT5x0x_REG_FW_VER, &fw_version); + + return sprintf(buf, "firmware version %02X\n", fw_version); +} + +static ssize_t ft5x06_fw_name_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + + if (size > FT_FW_NAME_MAX_LEN - 1) + return -EINVAL; + + strlcpy(data->fw_name, buf, size); + if (data->fw_name[size-1] == '\n') + data->fw_name[size-1] = 0; + + return size; +} + +static DEVICE_ATTR(fw_name, 0664, ft5x06_fw_name_show, ft5x06_fw_name_store); + +static int ft5x06_auto_cal(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + u8 temp = 0, i; + + /* set to factory mode */ + msleep(2 * data->pdata->soft_rst_dly); + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_FACTORYMODE_VALUE); + msleep(data->pdata->soft_rst_dly); + + /* start calibration */ + ft5x0x_write_reg(client, FT_DEV_MODE_REG_CAL, FT_CAL_START); + msleep(2 * data->pdata->soft_rst_dly); + for (i = 0; i < FT_CAL_RETRY; i++) { + ft5x0x_read_reg(client, FT_REG_CAL, &temp); + /*return to normal mode, calibration finish */ + if (((temp & FT_CAL_MASK) >> FT_4BIT_SHIFT) == FT_CAL_FIN) + break; + } + + /*calibration OK */ + msleep(2 * data->pdata->soft_rst_dly); + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_FACTORYMODE_VALUE); + msleep(data->pdata->soft_rst_dly); + + /* store calibration data */ + ft5x0x_write_reg(client, FT_DEV_MODE_REG_CAL, FT_CAL_STORE); + msleep(2 * data->pdata->soft_rst_dly); + + /* set to normal mode */ + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_WORKMODE_VALUE); + msleep(2 * data->pdata->soft_rst_dly); + + return 0; +} + + +static int ft5x06_fw_upgrade(struct device *dev, bool force) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + const struct firmware *fw = NULL; + int rc; + u8 fw_file_maj, fw_file_min, fw_file_sub_min, fw_file_vendor_id; + bool fw_upgrade = false; + + if (data->suspended) { + dev_err(dev, "Device is in suspend state: Exit FW upgrade\n"); + return -EBUSY; + } + + rc = request_firmware(&fw, data->fw_name, dev); + if (rc < 0) { + dev_err(dev, "Request firmware failed - %s (%d)\n", + data->fw_name, rc); + return rc; + } + + if (fw->size < FT_FW_MIN_SIZE || fw->size > FT_FW_MAX_SIZE) { + dev_err(dev, "Invalid firmware size (%zu)\n", fw->size); + rc = -EIO; + goto rel_fw; + } + + if (data->family_id == FT6X36_ID) { + fw_file_maj = FT_FW_FILE_MAJ_VER_FT6X36(fw); + fw_file_vendor_id = FT_FW_FILE_VENDOR_ID_FT6X36(fw); + } else { + fw_file_maj = FT_FW_FILE_MAJ_VER(fw); + fw_file_vendor_id = FT_FW_FILE_VENDOR_ID(fw); + } + fw_file_min = FT_FW_FILE_MIN_VER(fw); + fw_file_sub_min = FT_FW_FILE_SUB_MIN_VER(fw); + + dev_info(dev, "Current firmware: %d.%d.%d", data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); + dev_info(dev, "New firmware: %d.%d.%d", fw_file_maj, + fw_file_min, fw_file_sub_min); + + if (force) + fw_upgrade = true; + else if ((data->fw_ver[0] < fw_file_maj) && + data->fw_vendor_id == fw_file_vendor_id) + fw_upgrade = true; + + if (!fw_upgrade) { + dev_info(dev, "Exiting fw upgrade...\n"); + rc = -EFAULT; + goto rel_fw; + } + + /* start firmware upgrade */ + if (FT_FW_CHECK(fw, data)) { + rc = ft5x06_fw_upgrade_start(data->client, fw->data, fw->size); + if (rc < 0) + dev_err(dev, "update failed (%d). try later...\n", rc); + else if (data->pdata->info.auto_cal) + ft5x06_auto_cal(data->client); + } else { + dev_err(dev, "FW format error\n"); + rc = -EIO; + } + + ft5x06_update_fw_ver(data); + + FT_STORE_TS_INFO(data->ts_info, data->family_id, data->pdata->name, + data->pdata->num_max_touches, data->pdata->group_id, + data->pdata->fw_vkey_support ? "yes" : "no", + data->pdata->fw_name, data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); +rel_fw: + release_firmware(fw); + return rc; +} + + +static ssize_t ft5x06_update_fw_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + return snprintf(buf, 2, "%d\n", data->loading_fw); +} + +static ssize_t ft5x06_update_fw_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + unsigned long val; + int rc; + + if (size > 2) + return -EINVAL; + + rc = kstrtoul(buf, 10, &val); + if (rc != 0) + return rc; + + if (data->suspended) { + dev_info(dev, "In suspend state, try again later...\n"); + return size; + } + + mutex_lock(&data->input_dev->mutex); + if (!data->loading_fw && val) { + data->loading_fw = true; + ft5x06_fw_upgrade(dev, false); + data->loading_fw = false; + } + mutex_unlock(&data->input_dev->mutex); + + return size; +} + +static DEVICE_ATTR(update_fw, 0664, ft5x06_update_fw_show, + ft5x06_update_fw_store); + +static ssize_t ft5x06_force_update_fw_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + unsigned long val; + int rc; + + if (size > 2) + return -EINVAL; + + rc = kstrtoul(buf, 10, &val); + if (rc != 0) + return rc; + + mutex_lock(&data->input_dev->mutex); + if (!data->loading_fw && val) { + data->loading_fw = true; + ft5x06_fw_upgrade(dev, true); + data->loading_fw = false; + } + mutex_unlock(&data->input_dev->mutex); + + return size; +} + +static DEVICE_ATTR(force_update_fw, 0664, ft5x06_update_fw_show, + ft5x06_force_update_fw_store); + + +#define FT_DEBUG_DIR_NAME "ts_debug" + +static bool ft5x06_debug_addr_is_valid(int addr) +{ + if (addr < 0 || addr > 0xFF) { + pr_err("FT reg address is invalid: 0x%x\n", addr); + return false; + } + + return true; +} + +static int ft5x06_debug_data_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) + dev_info(&data->client->dev, + "Writing into FT registers not supported\n"); + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +static int ft5x06_debug_data_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + int rc; + u8 reg; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) { + rc = ft5x0x_read_reg(data->client, data->addr, ®); + if (rc < 0) + dev_err(&data->client->dev, + "FT read register 0x%x failed (%d)\n", + data->addr, rc); + else + *val = reg; + } + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_data_fops, ft5x06_debug_data_get, + ft5x06_debug_data_set, "0x%02llX\n"); + +static int ft5x06_debug_addr_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + if (ft5x06_debug_addr_is_valid(val)) { + mutex_lock(&data->input_dev->mutex); + data->addr = val; + mutex_unlock(&data->input_dev->mutex); + } + + return 0; +} + +static int ft5x06_debug_addr_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) + *val = data->addr; + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_addr_fops, ft5x06_debug_addr_get, + ft5x06_debug_addr_set, "0x%02llX\n"); + +static int ft5x06_debug_suspend_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (val) + ft5x06_ts_suspend(&data->client->dev); + else + ft5x06_ts_resume(&data->client->dev); + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +static int ft5x06_debug_suspend_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + *val = data->suspended; + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_suspend_fops, ft5x06_debug_suspend_get, + ft5x06_debug_suspend_set, "%lld\n"); + +static int ft5x06_debug_dump_info(struct seq_file *m, void *v) +{ + struct ft5x06_ts_data *data = m->private; + + seq_printf(m, "%s\n", data->ts_info); + + return 0; +} + +static int debugfs_dump_info_open(struct inode *inode, struct file *file) +{ + return single_open(file, ft5x06_debug_dump_info, inode->i_private); +} + +static const struct file_operations debug_dump_info_fops = { + .owner = THIS_MODULE, + .open = debugfs_dump_info_open, + .read = seq_read, + .release = single_release, +}; + +#endif + +static int ft5x0x_GetFirmwareSize(char *firmware_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[128]; + memset(filepath, 0, sizeof(filepath)); + + sprintf(filepath, "%s", firmware_name); + CTP_ERROR("filepath=%s\n", filepath); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + CTP_ERROR("error occured while opening file %s.\n", filepath); + return -EPERM; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +static int ft5x0x_ReadFirmware(char *firmware_name, unsigned char *firmware_buf) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s", firmware_name); + CTP_INFO("filepath=%s\n", filepath); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + CTP_ERROR("error occured while opening file %s.\n", filepath); + return -EPERM; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + + vfs_read(pfile, firmware_buf, fsize, &pos); + + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +static void delay_qt_ms(unsigned long w_ms) +{ + unsigned long i; + unsigned long j; + + for (i = 0; i < w_ms; i++) { + for (j = 0; j < 1000; j++) { + udelay(1); + } + } +} + +static int fts_ctpm_auto_clb(void) +{ + unsigned char uc_temp; + unsigned char i ; + + printk("[FTS] start auto CLB.\n"); + msleep(200); + ft5x0x_write_reg(update_client, 0, 0x40); + delay_qt_ms(100); + ft5x0x_write_reg(update_client, 2, 0x4); + delay_qt_ms(300); + for (i = 0; i < 100; i++) { + ft5x0x_read_reg(update_client, 0, &uc_temp); + if (((uc_temp&0x70)>>4) == 0x0) { + break; + } + delay_qt_ms(200); + printk("[FTS] waiting calibration %d\n", i); + } + + printk("[FTS] calibration OK.\n"); + + msleep(300); + ft5x0x_write_reg(update_client, 0, 0x40); + delay_qt_ms(100); + ft5x0x_write_reg(update_client, 2, 0x5); + delay_qt_ms(300); + ft5x0x_write_reg(update_client, 0, 0x0); + msleep(300); + printk("[FTS] store CLB result OK.\n"); + return 0; +} + + +static int fts_ctpm_fw_upgrade_with_app_file(char *firmware_name) +{ + unsigned char *pbt_buf = NULL; + int i_ret; + u8 fwver; + int fwsize = ft5x0x_GetFirmwareSize(firmware_name); + + CTP_DEBUG("enter fw_upgrade_with_app_file"); + if (fwsize <= 0) { + CTP_ERROR("%s ERROR:Get firmware size failed\n", __FUNCTION__); + return -EPERM; + } + + pbt_buf = (unsigned char *) kmalloc(fwsize+1, GFP_ATOMIC); + if (ft5x0x_ReadFirmware(firmware_name, pbt_buf)) { + CTP_ERROR("%s() - ERROR: request_firmware failed\n", __FUNCTION__); + kfree(pbt_buf); + return -EPERM; + } + + + + if ((pbt_buf[fwsize - 8] ^ pbt_buf[fwsize - 6]) != 0xFF + || (pbt_buf[fwsize - 7] ^ pbt_buf[fwsize - 5]) != 0xFF + || (pbt_buf[fwsize - 3] ^ pbt_buf[fwsize - 4]) != 0xFF) { + CTP_ERROR("the update file is not correct, please check\n"); + CTP_ERROR("checksum is %2x, %2x, %2x, %2x, %2x, %2x", pbt_buf[fwsize - 8], pbt_buf[fwsize - 6], pbt_buf[fwsize - 7], pbt_buf[fwsize - 5], pbt_buf[fwsize - 3], pbt_buf[fwsize - 4]); + return -EPERM; + } + /*call the upgrade function*/ + i_ret = ft5x06_fw_upgrade_start(update_client, pbt_buf, fwsize); + if (i_ret != 0) { + CTP_ERROR("%s() - ERROR:[FTS] upgrade failed i_ret = %d.\n", __FUNCTION__, i_ret); + + + } else { + CTP_INFO("[FTS] upgrade successfully.\n"); + if (ft5x0x_read_reg(update_client, FT5x0x_REG_FW_VER, &fwver) >= 0) + CTP_INFO("the new fw ver is 0x%02x\n", fwver); + + } + kfree(pbt_buf); + return i_ret; +} + +#if CTP_SYS_APK_UPDATE + +static ssize_t ft5x0x_fwupgradeapp_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} +#endif + +#if CTP_SYS_APK_UPDATE + +static ssize_t ft5x0x_fwupgradeapp_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + + + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + char fwname[128]; + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + + disable_irq(client->irq); + + fts_ctpm_fw_upgrade_with_app_file(fwname); + + enable_irq(client->irq); + + return count; +} + +#endif + +#if CTP_SYS_APK_UPDATE + +static DEVICE_ATTR(ftsfwupgradeapp, S_IRUGO|S_IWUSR, ft5x0x_fwupgradeapp_show, ft5x0x_fwupgradeapp_store); +#endif + + +#ifdef CONFIG_OF +static int ft5x06_get_dt_coords(struct device *dev, char *name, + struct ft5x06_ts_platform_data *pdata) +{ + u32 coords[FT_COORDS_ARR_SIZE]; + struct property *prop; + struct device_node *np = dev->of_node; + int coords_size, rc; + + prop = of_find_property(np, name, NULL); + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + coords_size = prop->length / sizeof(u32); + if (coords_size != FT_COORDS_ARR_SIZE) { + dev_err(dev, "invalid %s\n", name); + return -EINVAL; + } + + rc = of_property_read_u32_array(np, name, coords, coords_size); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read %s\n", name); + return rc; + } + + if (!strcmp(name, "ftech,panel-coords")) { + pdata->panel_minx = coords[0]; + pdata->panel_miny = coords[1]; + pdata->panel_maxx = coords[2]; + pdata->panel_maxy = coords[3]; + } else if (!strcmp(name, "ftech,display-coords")) { + pdata->x_min = coords[0]; + pdata->y_min = coords[1]; + pdata->x_max = coords[2]; + pdata->y_max = coords[3]; + } else { + dev_err(dev, "unsupported property %s\n", name); + return -EINVAL; + } + + return 0; +} + +static int ft5x06_parse_dt(struct device *dev, + struct ft5x06_ts_platform_data *pdata) +{ + int rc; + struct device_node *np = dev->of_node; + struct property *prop; + u32 temp_val, num_buttons; + u32 button_map[MAX_BUTTONS]; + + pdata->name = "ftech"; + rc = of_property_read_string(np, "ftech,name", &pdata->name); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read name\n"); + return rc; + } + + rc = ft5x06_get_dt_coords(dev, "ftech,panel-coords", pdata); + if (rc && (rc != -EINVAL)) + return rc; + + rc = ft5x06_get_dt_coords(dev, "ftech,display-coords", pdata); + if (rc) + return rc; + + pdata->i2c_pull_up = of_property_read_bool(np, + "ftech,i2c-pull-up"); + + pdata->no_force_update = of_property_read_bool(np, + "ftech,no-force-update"); + + /* reset, irq gpio info */ + pdata->reset_gpio = of_get_named_gpio_flags(np, "ftech,reset-gpio", + 0, &pdata->reset_gpio_flags); + if (pdata->reset_gpio < 0) + return pdata->reset_gpio; + + pdata->irq_gpio = of_get_named_gpio_flags(np, "ftech,irq-gpio", + 0, &pdata->irq_gpio_flags); + if (pdata->irq_gpio < 0) + return pdata->irq_gpio; + + pdata->fw_name = "ft_fw.bin"; + rc = of_property_read_string(np, "ftech,fw-name", &pdata->fw_name); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw name\n"); + return rc; + } + + rc = of_property_read_u32(np, "ftech,group-id", &temp_val); + if (!rc) + pdata->group_id = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,hard-reset-delay-ms", + &temp_val); + if (!rc) + pdata->hard_rst_dly = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,soft-reset-delay-ms", + &temp_val); + if (!rc) + pdata->soft_rst_dly = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,num-max-touches", &temp_val); + if (!rc) + pdata->num_max_touches = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,fw-delay-aa-ms", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay aa\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_aa = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-55-ms", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay 55\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_55 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-upgrade-id1", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw upgrade id1\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.upgrade_id_1 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-upgrade-id2", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw upgrade id2\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.upgrade_id_2 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-readid-ms", + &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay read id\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_readid = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-era-flsh-ms", + &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay erase flash\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_erase_flash = temp_val; + + pdata->info.auto_cal = of_property_read_bool(np, + "ftech,fw-auto-cal"); + + pdata->fw_vkey_support = of_property_read_bool(np, + "ftech,fw-vkey-support"); + + pdata->ignore_id_check = of_property_read_bool(np, + "ftech,ignore-id-check"); + + rc = of_property_read_u32(np, "ftech,family-id", &temp_val); + if (!rc) + pdata->family_id = temp_val; + else + return rc; + + prop = of_find_property(np, "ftech,button-map", NULL); + if (prop) { + num_buttons = prop->length / sizeof(temp_val); + if (num_buttons > MAX_BUTTONS) + return -EINVAL; + + rc = of_property_read_u32_array(np, + "ftech,button-map", button_map, + num_buttons); + if (rc) { + dev_err(dev, "Unable to read key codes\n"); + return rc; + } + } + + return 0; +} +#else +static int ft5x06_parse_dt(struct device *dev, + struct ft5x06_ts_platform_data *pdata) { + return -ENODEV; +} +#endif + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + + if (*ppos) { + CTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + return sprintf(ptr, "%02X%02X%02X%02X%02X%02X%02X%02X\n", + lockdown_info[0], lockdown_info[1], lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], lockdown_info[6], lockdown_info[7]); + +} + +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static void create_ctp_lockdown_proc(void) +{ + struct proc_dir_entry *ctp_lockdown_proc = NULL; + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + CTP_ERROR("ft5x06: create parent_proc fail\n"); + return; + } + } + ctp_lockdown_proc = proc_create(CTP_LOCKDOWN_INFOR_NAME, 0666, ctp_device_proc, &ctp_lockdown_procs_fops); + if (ctp_lockdown_proc == NULL) { + CTP_ERROR("ft5x06: create ctp_lockdown_proc fail\n"); + } +} + +#endif + +#if WT_ADD_CTP_INFO +static int hardwareinfo_set(struct ft5x06_ts_data *data, u8 value_name, u8 color) +{ + char firmware_ver[HARDWARE_MAX_ITEM_LONGTH]; + char vendor_for_id[HARDWARE_MAX_ITEM_LONGTH]; + char ic_name[HARDWARE_MAX_ITEM_LONGTH]; + char ic_color[HARDWARE_MAX_ITEM_LONGTH]; + int err; + u8 uc_tp_fm_ver, reg_addr; + + if (lockdown_info[0] == VENDOR_O_FILM) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "o-film"); + else if (lockdown_info[0] == TP_LENS) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "LENS"); + else if (lockdown_info[0] == VENDOR_DS) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "DS"); + else if (data->fw_vendor_id == VENDOR_O_FILM) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "o-film"); + else if (data->fw_vendor_id == VENDOR_Lens) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "LENS"); + else if (data->fw_vendor_id == VENDOR_DS) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "DS"); + else + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "Other vendor"); + + switch (value_name) { + case TP_IC_FT5X06: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5X06"); + break; + case TP_IC_FT5606: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5606"); + break; + case TP_IC_FT5X16: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5X16"); + break; + case TP_IC_FT6208: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6208"); + break; + case TP_IC_FT6X06: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6X06"); + break; + case TP_IC_FT6X36: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6X36"); + break; + case TP_IC_FT5336: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5336"); + break; + case TP_IC_FT3316: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT3316"); + break; + case TP_IC_FT5436i: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5436i"); + break; + case TP_IC_FT5336i: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5336i"); + break; + case TP_IC_FT5346: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5435"); + break; + default: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "Other IC"); + } + + + switch (color) { + case TP_White: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "White"); + break; + case TP_Black: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "Black"); + break; + case TP_Golden: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "Golden"); + break; + default: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "other Color"); + } + + if (nomal_boot) { + reg_addr = 0xA6; + ft5x06_i2c_read(data->client, ®_addr, 1, &uc_tp_fm_ver, 1); + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x, %s", vendor_for_id, ic_name, uc_tp_fm_ver, ic_color); + } else + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x, %s", vendor_for_id, ic_name, data->fw_ver[0], ic_color); + + err = hardwareinfo_set_prop(HARDWARE_TP, firmware_ver); + dev_err(&data->client->dev, "Set hardwareinfo is: %s\n", firmware_ver); + if (err < 0) + return -EPERM; + + return 0; +} +#endif + +#if CTP_PROC_INTERFACE +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + u8 result = 0; + int nret = -1; + char cfgname[128]; + struct i2c_client *client = fts_i2c_client; + ssize_t num_read_chars = 0; + + if (*ppos) { + CTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + mutex_lock(&fts_mutex); + disable_irq(client->irq); + + if (TP_Maker == TP_OUFEI && LCD_Maker == TP_EBBG && Project_Id == PROJECT_C3B) { + sprintf(cfgname, "%s", "ft5346_oufei_ebbg_c3b.ini"); + CTP_INFO("cfgname is: %s\n", cfgname); + } else if (TP_Maker == TP_LENS && LCD_Maker == TP_TIANMA && Project_Id == PROJECT_C3B) { + sprintf(cfgname, "%s", "ft5346_lens_tianma.ini"); + CTP_INFO("cfgname is: %s\n", cfgname); + } else if (TP_Maker == TP_DS && LCD_Maker == TP_EBBG && Project_Id == PROJECT_C3N) { + if (!strcmp(lcd_ic_name , "ili9881c")) { + sprintf(cfgname, "%s", "ft5346_ds_ebbg_nova.ini"); + CTP_INFO("cfgname is: %s\n", cfgname); + } else { + sprintf(cfgname, "%s", "ft5346_ds_ebbg_nova.ini"); + CTP_INFO("cfgname is: %s\n", cfgname); + } + } + + else if (TP_Maker == TP_OUFEI && LCD_Maker == TP_EBBG && Project_Id == PROJECT_C3N) { + sprintf(cfgname, "%s", "ft5346_oufei_ebbg.ini"); + CTP_INFO("cfgname is: %s\n", cfgname); + } else { + CTP_INFO("no ini match the project ctp,please check!"); + return count; + } + nret = fts_open_short_test(cfgname, NULL, &num_read_chars); + if (0 != nret) { + result = 0; + dev_err(&client->dev, "%s: fts open short test fail \n", __func__); + } else { + result = 1; + dev_err(&client->dev, "%s: fts open short test success \n", __func__); + } + + enable_irq(client->irq); + mutex_unlock(&fts_mutex); + + dev_err(&client->dev, "%s: End Open-Short Test \n", __func__); + return sprintf(ptr, "result=%d\n", result); +} + +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static void create_ctp_proc(void) +{ + + + + + + struct proc_dir_entry *ctp_open_proc = NULL; + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + CTP_ERROR("ft5x06: create parent_proc fail\n"); + return; + } + } + ctp_open_proc = proc_create(CTP_OPEN_PROC_NAME, 0777, ctp_device_proc, &ctp_open_procs_fops); + if (ctp_open_proc == NULL) { + CTP_ERROR("ft5x06: create open_proc fail\n"); + } +} +#endif + +#if FTS_PROC_APK_DEBUG +static int ft5x0x_i2c_Read(struct i2c_client *client, char *writebuf, + int writelen, char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) + dev_err(&client->dev, "f%s: i2c read error.\n", + __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} +/*write data by i2c*/ +static int ft5x0x_i2c_Write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret; + + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(client->adapter, msg, 1); + if (ret < 0) + dev_err(&client->dev, "%s i2c write error.\n", __func__); + + return ret; +} + +static ssize_t ft5x0x_debug_write(struct file *filp, const char __user *buff, size_t len, loff_t *ppos) +{ + struct i2c_client *client = update_client; + unsigned char writebuf[FTS_PACKET_LENGTH]; + int buflen = len; + int writelen = 0; + int ret = 0; + + if (*ppos) + return -EPERM; + + if (copy_from_user(&writebuf, buff, buflen)) { + dev_err(&client->dev, "%s:copy from user error\n", __func__); + return -EFAULT; + } + proc_operate_mode = writebuf[0]; + CTP_INFO("write mode %x", proc_operate_mode); + switch (proc_operate_mode) { + case PROC_UPGRADE: + { + char upgrade_file_path[128]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + + disable_irq(client->irq); + + ret = fts_ctpm_fw_upgrade_with_app_file(upgrade_file_path); + + enable_irq(client->irq); + if (ret < 0) { + dev_err(&client->dev, "%s:upgrade failed.\n", __func__); + return ret; + } + } + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = ft5x0x_i2c_Write(client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&client->dev, "%s:write iic error\n", __func__); + return ret; + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = ft5x0x_i2c_Write(client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&client->dev, "%s:write iic error\n", __func__); + return ret; + } + break; + case PROC_RAWDATA: + break; + case PROC_AUTOCLB: + fts_ctpm_auto_clb(); + break; + default: + break; + } + + *ppos += len; + return len; +} + +static unsigned char debug_read_buf[PAGE_SIZE]; + +/*interface of read proc*/ +static ssize_t ft5x0x_debug_read(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) +{ + struct i2c_client *client = update_client; + int ret = 0; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + + if (*ppos) + return -EPERM; + + switch (proc_operate_mode) { + case PROC_UPGRADE: + /*after calling ft5x0x_debug_write to upgrade*/ + regaddr = 0xA6; + ret = ft5x0x_read_reg(client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(debug_read_buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(debug_read_buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = ft5x0x_i2c_Read(client, NULL, 0, debug_read_buf, readlen); + if (ret < 0) { + dev_err(&client->dev, "%s:read iic error\n", __func__); + return ret; + } else + + num_read_chars = 1; + break; + case PROC_RAWDATA: + break; + default: + break; + } + + memcpy(user_buf, debug_read_buf, num_read_chars); + *ppos += num_read_chars; + return num_read_chars; +} + +static const struct file_operations ctp_apk_proc_fops = { + .write = ft5x0x_debug_write, + .read = ft5x0x_debug_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static int ft5x0x_create_apk_debug_channel(struct i2c_client *client) +{ + ft5x0x_proc_entry = proc_create(PROC_NAME, 0666, NULL, &ctp_apk_proc_fops); + if (NULL == ft5x0x_proc_entry) { + dev_err(&client->dev, "Couldn't create proc entry!\n"); + return -ENOMEM; + } + return 0; +} + +static void ft5x0x_release_apk_debug_channel(void) +{ + if (ft5x0x_proc_entry) + remove_proc_entry(PROC_NAME, NULL); +} + +#endif + +#if WT_CTP_GESTURE_SUPPORT +static ssize_t proc_gesture_data_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + int num = 0; + if (*ppos) + return 0; + printk("proc_gesture_data_read=%d\n", gtp_gesture_value); + num = sprintf(buffer, "%c\n", gtp_gesture_value); + *ppos += num; + return num; +} + + +static ssize_t proc_gesture_data_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_value); + return count; +} + +static ssize_t proc_gesture_onoff_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + + num = sprintf(page, "%c\n", gtp_gesture_onoff); + *ppos += num; + return num; + +} + +static ssize_t proc_gesture_onoff_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_onoff); + return count; +} + +static const struct file_operations gt_gesture_var_proc_fops = { + .write = proc_gesture_data_write, + .read = proc_gesture_data_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_gesture_onoff_proc_fops = { + .write = proc_gesture_onoff_write, + .read = proc_gesture_onoff_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +void Ctp_Gesture_Fucntion_Proc_File(void) +{ + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_gesture_type_proc = NULL; + struct proc_dir_entry *ctp_gesture_onoff_proc = NULL; + + ctp_device_proc = proc_mkdir("gesture", NULL); + + ctp_gesture_type_proc = proc_create("data", 0660, ctp_device_proc, >_gesture_var_proc_fops); + if (ctp_gesture_type_proc == NULL) { + CTP_DEBUG("ctp_gesture_var_proc create failed\n"); + } + + ctp_gesture_onoff_proc = proc_create("onoff", 0660, ctp_device_proc, >_gesture_onoff_proc_fops); + if (ctp_gesture_onoff_proc == NULL) { + CTP_DEBUG("ctp_gesture_onoff_proc create failed\n"); + } + +} + +#endif + +static int fts_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + char buffer[16]; + + if (type == EV_SYN && code == SYN_CONFIG) { + sprintf(buffer, "%d", value); + + CTP_INFO("FTS:Gesture on/off : %d", value); + if (value >= MXT_INPUT_EVENT_START && value <= MXT_INPUT_EVENT_END) { + if (value == MXT_INPUT_EVENT_WAKUP_MODE_ON) { + gtp_gesture_onoff = '1'; + } else if (value == MXT_INPUT_EVENT_WAKUP_MODE_OFF) { + gtp_gesture_onoff = '0'; + } else { + gtp_gesture_onoff = '0'; + CTP_ERROR("Failed Open/Close Gesture Function!\n"); + return -ENOMEM; + } + } + } + + return 0; +} + + +static int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, 10); + dev_err(&client->dev, "cmd_line =%s \n", cmd_line); + if (ret == 0) { + dev_err(&client->dev, "mode: ffbm\n"); + return 1;/* factory mode*/ + } else { + dev_err(&client->dev, "mode: no ffbm\n"); + return 2;/* no factory mode*/ + } + } + + nomal_boot = 1; + dev_err(&client->dev, "has no androidboot.mode \n"); + return 0; +} + +static int ft5x06_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct ft5x06_ts_platform_data *pdata; + struct ft5x06_ts_data *data; + struct input_dev *input_dev; + struct dentry *temp; + u8 reg_value; + u8 reg_addr; + int err; + int len; + u8 ic_name; +#if TPD_AUTO_UPGRADE + int ret_auto_upgrade = 0; + int i; +#endif + + temp = NULL; + update_client = client; + gesture_client = client; + + +#if CTP_PROC_INTERFACE + fts_i2c_client = client; +#endif + + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, + sizeof(struct ft5x06_ts_platform_data), GFP_KERNEL); + if (!pdata) { + dev_err(&client->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + err = ft5x06_parse_dt(&client->dev, pdata); + if (err) { + dev_err(&client->dev, "DT parsing failed\n"); + return err; + } + } else + pdata = client->dev.platform_data; + + if (!pdata) { + dev_err(&client->dev, "Invalid pdata\n"); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "I2C not supported\n"); + return -ENODEV; + } + + data = devm_kzalloc(&client->dev, + sizeof(struct ft5x06_ts_data), GFP_KERNEL); + if (!data) { + dev_err(&client->dev, "Not enough memory\n"); + return -ENOMEM; + } + + if (pdata->fw_name) { + len = strlen(pdata->fw_name); + if (len > FT_FW_NAME_MAX_LEN - 1) { + dev_err(&client->dev, "Invalid firmware name\n"); + return -EINVAL; + } + + strlcpy(data->fw_name, pdata->fw_name, len + 1); + } + + data->tch_data_len = FT_TCH_LEN(pdata->num_max_touches); + data->tch_data = devm_kzalloc(&client->dev, + data->tch_data_len, GFP_KERNEL); + if (!data) { + return -ENOMEM; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + return -ENOMEM; + } + + data->input_dev = input_dev; + data->client = client; + data->pdata = pdata; + + input_dev->name = "ft5346"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + input_dev->event = fts_input_event; + input_set_drvdata(input_dev, data); + i2c_set_clientdata(client, data); + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + +#if WT_CTP_GESTURE_SUPPORT + input_set_capability(input_dev, EV_KEY, KEY_POWER); + input_set_capability(input_dev, EV_KEY, KEYCODE_WAKEUP); + + __set_bit(KEYCODE_WAKEUP, input_dev->keybit); +#endif + + input_mt_init_slots(input_dev, pdata->num_max_touches, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, + pdata->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, + pdata->y_max, 0, 0); + + err = input_register_device(input_dev); + if (err) { + dev_err(&client->dev, "Input device registration failed\n"); + goto free_inputdev; + } + + if (pdata->power_init) { + err = pdata->power_init(true); + if (err) { + dev_err(&client->dev, "power init failed"); + goto unreg_inputdev; + } + } else { + err = ft5x06_power_init(data, true); + if (err) { + dev_err(&client->dev, "power init failed"); + goto unreg_inputdev; + } + } + + if (pdata->power_on) { + err = pdata->power_on(true); + if (err) { + dev_err(&client->dev, "power on failed"); + goto pwr_deinit; + } + } else { + err = ft5x06_power_on(data, true); + if (err) { + dev_err(&client->dev, "power on failed"); + goto pwr_deinit; + } + } + + err = ft5x06_ts_pinctrl_init(data); + if (!err && data->ts_pinctrl) { + err = ft5x06_ts_pinctrl_select(data, true); + if (err < 0) + goto pwr_off; + } + + if (gpio_is_valid(pdata->irq_gpio)) { + err = gpio_request(pdata->irq_gpio, "ft5x06_irq_gpio"); + if (err) { + dev_err(&client->dev, "irq gpio request failed"); + goto pwr_off; + } + err = gpio_direction_input(pdata->irq_gpio); + if (err) { + dev_err(&client->dev, + "set_direction for irq gpio failed\n"); + goto free_irq_gpio; + } + } + + if (gpio_is_valid(pdata->reset_gpio)) { + err = gpio_request(pdata->reset_gpio, "ft5x06_reset_gpio"); + if (err) { + goto free_irq_gpio; + } + + err = gpio_direction_output(pdata->reset_gpio, 0); + if (err) { + dev_err(&client->dev, + "set_direction for reset gpio failed\n"); + goto free_reset_gpio; + } + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + + /* make sure CTP already finish startup process */ + msleep(data->pdata->soft_rst_dly); + + /* check the controller id */ + reg_addr = FT_REG_ID; + err = ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) { + dev_err(&client->dev, "version read failed"); + goto free_reset_gpio; + } + ic_name = reg_value; + + dev_info(&client->dev, "Device ID = 0x%x\n", reg_value); + + if ((pdata->family_id != reg_value) && (!pdata->ignore_id_check)) { + dev_err(&client->dev, "%s:Unsupported controller\n", __func__); + goto free_reset_gpio; + } + + data->family_id = pdata->family_id; + + err = request_threaded_irq(client->irq, NULL, + ft5x06_ts_interrupt, + /*pdata->irq_gpio_flags |*/ IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + client->dev.driver->name, data); + if (err) { + dev_err(&client->dev, "request irq failed\n"); + goto free_reset_gpio; + } + + disable_irq(data->client->irq); + +#if CTP_SYS_APK_UPDATE + err = device_create_file(&client->dev, &dev_attr_fw_name); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_ftsfwupgradeapp); + if (err) { + dev_err(&client->dev, "upgradeapp sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_ftsmcaptest); + if (err) { + dev_err(&client->dev, "ftsmcaptest sys file creation failed\n"); + } + err = device_create_file(&client->dev, &dev_attr_update_fw); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_force_update_fw); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + data->dir = debugfs_create_dir(FT_DEBUG_DIR_NAME, NULL); + if (data->dir == NULL || IS_ERR(data->dir)) { + pr_err("debugfs_create_dir failed(%ld)\n", PTR_ERR(data->dir)); + err = PTR_ERR(data->dir); + } else { + temp = debugfs_create_file("addr", S_IRUSR | S_IWUSR, data->dir, data, + &debug_addr_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("data", S_IRUSR | S_IWUSR, data->dir, data, + &debug_data_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("suspend", S_IRUSR | S_IWUSR, data->dir, + data, &debug_suspend_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("dump_info", S_IRUSR | S_IWUSR, data->dir, + data, &debug_dump_info_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + } +#endif + + data->ts_info = devm_kzalloc(&client->dev, + FT_INFO_MAX_LEN, GFP_KERNEL); + if (!data->ts_info) { + dev_err(&client->dev, "Not enough memory\n"); + goto free_irq_gpio; + } + + /*get some register information */ + reg_addr = FT_REG_POINT_RATE; + ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + dev_err(&client->dev, "report rate read failed"); + + dev_info(&client->dev, "report rate = %dHz\n", reg_value * 10); + + reg_addr = FT_REG_THGROUP; + err = ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + dev_err(&client->dev, "threshold read failed"); + + dev_dbg(&client->dev, "touch threshold = %d\n", reg_value * 4); + + ft5x06_update_fw_ver(data); + ft5x06_update_fw_vendor_id(data); + + FT_STORE_TS_INFO(data->ts_info, data->family_id, data->pdata->name, + data->pdata->num_max_touches, data->pdata->group_id, + data->pdata->fw_vkey_support ? "yes" : "no", + data->pdata->fw_name, data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); + +#if WT_ADD_CTP_INFO + fts_ctpm_read_lockdown(client, data); +#endif + +#if defined(CONFIG_FB) + INIT_WORK(&data->fb_notify_work, fb_notify_resume_work); + data->fb_notif.notifier_call = fb_notifier_callback; + + err = fb_register_client(&data->fb_notif); + + if (err) + dev_err(&client->dev, "Unable to register fb_notifier: %d\n", + err); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + + FT_SUSPEND_LEVEL; + data->early_suspend.suspend = ft5x06_ts_early_suspend; + data->early_suspend.resume = ft5x06_ts_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO + create_ctp_lockdown_proc(); +#endif + + +#if CTP_PROC_INTERFACE + create_ctp_proc(); +#endif + +#if WT_CTP_GESTURE_SUPPORT + + Ctp_Gesture_Fucntion_Proc_File(); +#endif + +#if FTS_PROC_APK_DEBUG + ft5x0x_create_apk_debug_channel(update_client); +#endif + + +#if TPD_AUTO_UPGRADE + + err = get_boot_mode(client); + if (err == 0) { + dev_err(&client->dev, "upgrade\n"); + CTP_DEBUG("********************Enter CTP Auto Upgrade********************\n"); + msleep(50); + i = 0; + do { + ret_auto_upgrade = fts_ctpm_fw_upgrade_with_i_file(data); + i++; + if (ret_auto_upgrade < 0) { + CTP_DEBUG(" ctp upgrade fail err = %d \n", ret_auto_upgrade); + } + } while ((ret_auto_upgrade < 0) && (i < 3)); + } else { + dev_err(&client->dev, "no upgrade\n"); + CTP_DEBUG("not nomal_boot\n"); + } +#endif + +#if WT_ADD_CTP_INFO + err = hardwareinfo_set(data, ic_name, lockdown_info[2]); + if (err < 0) + dev_err(&client->dev, "hardwareinfo set failed"); +#endif + +#if CTP_CHARGER_DETECT + batt_psy = power_supply_get_by_name("usb"); + if (!batt_psy) + CTP_DEBUG("tp battery supply not found\n"); +#endif + + enable_irq(data->client->irq); + + return 0; + + +free_reset_gpio: + if (gpio_is_valid(pdata->reset_gpio)) + gpio_free(pdata->reset_gpio); + if (data->ts_pinctrl) { + err = ft5x06_ts_pinctrl_select(data, false); + if (err < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } +free_irq_gpio: + if (gpio_is_valid(pdata->irq_gpio)) + gpio_free(pdata->irq_gpio); + if (data->ts_pinctrl) { + err = ft5x06_ts_pinctrl_select(data, false); + if (err < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } + + +ft5x06_ts_pinctrl_free(data); + +pwr_off: +pwr_deinit: +unreg_inputdev: + input_unregister_device(input_dev); + input_dev = NULL; +free_inputdev: + input_free_device(input_dev); + return err; +} + +static int ft5x06_ts_remove(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + int retval; + +#if CTP_SYS_APK_UPDATE + device_remove_file(&client->dev, &dev_attr_fw_name); +#endif + +#if FTS_PROC_APK_DEBUG + ft5x0x_release_apk_debug_channel(); +#endif + + +#if defined(CONFIG_FB) + if (fb_unregister_client(&data->fb_notif)) + dev_err(&client->dev, "Error occurred while unregistering fb_notifier.\n"); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&data->early_suspend); +#endif + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + if (data->ts_pinctrl) { + retval = ft5x06_ts_pinctrl_select(data, false); + if (retval < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } + input_unregister_device(data->input_dev); + + return 0; +} + +void ft5x06_ts_shutdown(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + int retval; + + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) { + retval = gpio_direction_output(data->pdata->reset_gpio, 0); + if (retval) { + dev_err(&data->client->dev, + "set_direction for reset gpio failed\n"); + } + gpio_free(data->pdata->reset_gpio); + } + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + if (data->pdata->power_init) + data->pdata->power_init(false); + else + ft5x06_power_init(data, false); +} + + +static const struct i2c_device_id ft5x06_ts_id[] = { + {"ft5x06_720p", 0}, + {}, +}; + +MODULE_DEVICE_TABLE(i2c, ft5x06_ts_id); + +#ifdef CONFIG_OF +static struct of_device_id ft5x06_match_table[] = { + { .compatible = "focaltech,5336",}, + { }, +}; +#else +#define ft5x06_match_table NULL +#endif + +static struct i2c_driver ft5x06_ts_driver = { + .probe = ft5x06_ts_probe, + .remove = ft5x06_ts_remove, + .shutdown = ft5x06_ts_shutdown, + .driver = { + .name = "ft5x06_720p", + .owner = THIS_MODULE, + .of_match_table = ft5x06_match_table, +#ifdef CONFIG_PM + .pm = &ft5x06_ts_pm_ops, +#endif + }, + .id_table = ft5x06_ts_id, +}; + +static int __init ft5x06_ts_init(void) +{ + return i2c_add_driver(&ft5x06_ts_driver); +} +module_init(ft5x06_ts_init); + +static void __exit ft5x06_ts_exit(void) +{ + i2c_del_driver(&ft5x06_ts_driver); +} +module_exit(ft5x06_ts_exit); + +MODULE_DESCRIPTION("FocalTech ft5x06 TouchScreen driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg.txt new file mode 100644 index 0000000000000..420be95973f9d --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg.txt @@ -0,0 +1,3093 @@ +0x2, 0x1f,0xd2,0x2, 0xb5,0xb4,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x42,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x70,0x2d,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x7d,0x45,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x32,0x2, 0x7d,0xa4,0xe4,0x2, 0x29,0xfa,0x22,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xa2,0x13,0x22,0x32,0xff,0x2, 0x0, 0x69,0x2, 0x31, +0xb3,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x38,0xc8, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x38,0xd8,0x7e,0x73,0x38,0xd8,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x7f,0x5, 0x7e,0x1f,0x38,0xc8,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x38,0xc8,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x38,0xcc,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x38,0xd4,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x38,0xd2,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf7,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0xb7,0xc7,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d,0xe2,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xb2,0x61,0x3f,0x7e,0x34,0x1d,0x96,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xc6,0x61,0x3f,0x7e,0x34,0x1e,0xa, 0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d, +0xf1,0x61,0x3f,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x69,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x6a,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xc8,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x38,0xc8,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x20,0xde,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x38,0xc0,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf7,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x38,0xc0,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xb9,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x38,0xc8,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x39,0xd, 0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x86,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x39,0xd, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x39,0xd, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x39,0xd, 0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xf3,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xf3,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xc0,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x38,0xc8,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x38, +0xc8,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x38,0xc8,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x38,0xc8,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x38,0xc8,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x38, +0xc8,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x38,0xc8, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x38,0xc8,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x38,0xc8,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x38,0xc8,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xb9,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xb9,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xf3,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xf3,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x39, +0xd, 0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x38,0xc8, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x38,0xc8,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x39,0xd, 0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x39,0xd, 0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x39,0xd, 0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf7,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xf2,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf7,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf7,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x39, +0xd, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x39,0xd, 0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x39,0xd, 0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x58,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1e,0xeb,0x7d,0x1e,0x12,0x1f,0x5, 0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x38,0xc8,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf7,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xf2,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf7,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x7f,0x5, 0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x38,0xc0,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc8,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x38,0xd8,0x7e,0x1f,0x38,0xc0, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xf3,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x39,0xd, 0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x20,0x8f,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x20,0x90,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e, +0x1f,0x38,0xc0,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x38,0xc0,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x38,0xc8,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x6, 0xe, 0x15,0x1a,0x1f,0x26,0x2b,0x2d,0x2e,0x2f, +0x2c,0x2a,0x24,0x1f,0x1a,0x14,0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10,0x15,0x1c,0x22, +0x28,0x2d,0x34,0x39,0x3d,0x40,0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x11,0x16, +0x1c,0x23,0x2b,0x32,0x37,0x3c,0x40,0x45,0x4a,0x4d,0x4c,0x4b,0x4a,0x48,0x46,0x46, +0x45,0x45,0x44,0x44,0x43,0x44,0x45,0x78,0x65,0x55,0x2, 0xd, 0x14,0x1b,0x21,0x25, +0x2b,0x31,0x37,0x36,0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, +0x10,0x18,0x1e,0x23,0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40, +0x3f,0x3e,0x3d,0x3d,0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29, +0x27,0x1e,0x14,0x11,0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21, +0x2b,0x32,0x30,0x2a,0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, +0x10,0x19,0x23,0x2d,0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71, +0x50,0x55,0x28,0x12,0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39, +0x31,0x28,0x1e,0x15,0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32, +0x37,0x39,0x20,0x29,0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, +0x1, 0x0, 0x1, 0x5, 0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c, +0x34,0x31,0x26,0xcb,0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31, +0x2e,0x2d,0x35,0x3d,0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, +0x10,0x1b,0x24,0x2f,0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d, +0x28,0x31,0x34,0x2a,0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40, +0x47,0x47,0x44,0x3c,0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b, +0x22,0x2d,0x30,0x2e,0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, +0x0, 0x0, 0x3, 0xb, 0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26, +0x1b,0x14,0x1c,0x25,0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c, +0x25,0x30,0x38,0x40,0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c, +0x29,0x1e,0x14,0x13,0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39, +0x30,0x25,0x1b,0x10,0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a, +0x23,0x2f,0x33,0x29,0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, +0x2, 0x0, 0x1, 0x8, 0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e, +0x50,0x55,0x16,0x2b,0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36, +0x3b,0x3d,0x3b,0x37,0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33, +0x3d,0x3f,0x13,0x21,0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37, +0x2d,0x22,0x18,0xc, 0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38, +0x2e,0x2a,0x31,0x62,0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, +0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26, +0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b, +0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48, +0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x9, 0x17,0x1d,0x26,0x2e,0x37, +0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, +0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30,0x2f,0x2c,0x26,0x1e, +0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c,0x32,0x3a,0x41,0x48, +0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c,0x33,0x55,0x26,0x1c, +0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18,0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, +0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44,0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49, +0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f,0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54, +0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c, +0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22,0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c, +0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a,0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32, +0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, +0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22, +0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, 0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39, +0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68,0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70, +0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80,0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10, +0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, +0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39,0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24, +0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50,0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff, +0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a,0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, +0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22, +0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33,0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29, +0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d,0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26, +0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10,0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b, +0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19, +0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22,0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39, +0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34,0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, +0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18,0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37, +0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e, +0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21, +0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c, +0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, +0x0, 0x2, 0x5, 0x9, 0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f, +0x3d,0x38,0x30,0x27,0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36, +0x3f,0x49,0x53,0x5c,0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b, +0x15,0xb, 0x4, 0x0, 0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c, +0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, +0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, +0x8, 0xe, 0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58, +0x51,0x48,0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf, +0x30,0x55,0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28, +0x30,0x38,0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16, +0xf, 0xc, 0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, +0x3, 0xa, 0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a, +0x58,0x57,0xc6,0x55,0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38, +0x3c,0x3e,0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, +0xd, 0x17,0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57, +0x4f,0x47,0x40,0x38,0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, +0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f, +0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22, +0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25, +0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f, +0x3d,0x3a,0x36,0x2e,0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0x9, 0xe, 0x14,0x1c,0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a, +0x10,0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47, +0x4f,0x56,0x5a,0x5b,0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9, +0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e, +0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25, +0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25, +0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d, +0x3a,0x34,0x2d,0x27,0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, +0xa, 0xf, 0x15,0x1b,0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11, +0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36, +0x3c,0x42,0x47,0x48,0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29, +0x22,0x1b,0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c, +0x24,0x2a,0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, +0x4, 0x7, 0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b, +0x38,0x31,0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35, +0x3d,0x45,0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17, +0x11,0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6, +0x30,0x55,0xa, 0x5, 0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3c,0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, +0x1, 0x2, 0x35,0x46,0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37, +0x2e,0x25,0x1e,0x16,0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39, +0x41,0x45,0xf0,0xbc,0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28, +0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, +0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d, +0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19, +0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36, +0x2f,0x27,0x21,0x19,0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, +0x16,0x1f,0x26,0x2d,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d, +0x56,0x59,0x5a,0x58,0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, +0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38, +0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40, +0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3, +0x30,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, +0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f, +0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40, +0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32, +0x39,0x3e,0x7, 0x90,0x30,0x55,0x39,0x2b,0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, +0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b,0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f, +0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24, +0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b,0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65, +0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a,0x46,0x55,0x0, 0x1, 0x3, 0x5, 0x7, 0x8, +0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22,0x24,0x27,0x2a,0x2c, +0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, 0x14,0x1b,0x23,0x28, +0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53,0x4e,0x47,0x40,0x3b, +0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x1f,0x7, 0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x1f,0x7, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0x13,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x4c,0x0, 0xc2,0x14,0x75,0x4d,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x4e,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x21,0x10,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x36,0x72,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xd0,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33,0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0x9b,0x0, 0x0, 0x2, 0x37,0xed,0x0, 0x0, 0x0, 0x2, 0x37, +0xef,0x0, 0x0, 0x0, 0x1, 0x37,0xf1,0x0, 0x0, 0x1, 0x34,0x4f,0x0, 0x0, 0x1, 0x39, +0x11,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x2, 0x34,0x9f,0x0, 0x0, 0x0, 0x1, 0x34, +0xa1,0x0, 0x0, 0x1, 0x34,0xaf,0x0, 0x0, 0x1, 0x34,0xc4,0x0, 0x0, 0x1, 0x34,0xc5, +0x0, 0x0, 0x1, 0x35,0x3e,0x0, 0x0, 0x1, 0x35,0x3f,0x1, 0x0, 0x1, 0x35,0x40,0x0, +0x0, 0x3c,0x35,0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x36,0x61,0x0, 0x0, 0x1, 0x36,0x62,0x0, 0x0, 0x1, 0x36,0x63,0x0, 0x0, +0x1, 0x35,0xe2,0x1, 0x0, 0x2, 0x35,0xe5,0x0, 0x0, 0x0, 0x1, 0x2f,0xa9,0x0, 0x0, +0x1, 0x2f,0xaa,0x0, 0x0, 0x1, 0x2f,0xab,0x0, 0x0, 0x1, 0x2f,0xac,0x0, 0x0, 0x1, +0x36,0x66,0x1, 0x0, 0x1, 0x36,0xe0,0x0, 0x0, 0x1, 0x39,0x12,0x0, 0x0, 0x6, 0x38, +0xfb,0x3f,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x39,0x1, 0x24,0x0, 0x1, 0x39,0x8, +0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x1, 0x39,0xb, 0x0, +0x0, 0x1, 0x39,0xc, 0x0, 0x0, 0x1, 0x0, 0x4f,0x0, 0x0, 0x1, 0x3, 0xec,0x0, 0x0, +0x4, 0x37,0x40,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39,0x3, +0x0, 0x0, 0x2, 0x39,0x4, 0x0, 0x0, 0x0, 0x1, 0x39,0x6, 0x64,0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x39,0x13,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x2, 0x2b,0xb9,0x2b,0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, +0x0, 0x1, 0x38,0xdd,0x0, 0x0, 0x1, 0x38,0x3e,0xff,0x0, 0x1, 0x38,0x3f,0x0, 0x0, +0x1, 0x38,0x40,0x0, 0x0, 0x1, 0x38,0x41,0x40,0x0, 0x1, 0x38,0x42,0x40,0x0, 0x4, +0x38,0xf3,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf7,0x0, 0x0, 0x64,0x0, 0x0, 0x4, +0x38,0xc0,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x38,0xc4,0x0, 0x0, 0x68,0xc0,0x0, 0x4, +0x38,0xc8,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x38,0xd9,0x0, 0x0, 0x40,0x0, 0x0, 0x4, +0x39,0xd, 0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58, +0x0, 0xc, 0x0, 0xfa,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78, +0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, +0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, +0x0, 0x1e,0x12,0x3f,0x13,0x12,0x69,0x8e,0x12,0x23,0xb, 0x12,0x28,0x48,0x12,0x8d, +0xec,0x2, 0x23,0x4, 0x74,0x1, 0x7a,0xb3,0x36,0x6a,0x22,0x12,0x73,0x71,0x12,0x23, +0x40,0x2, 0x23,0x14,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x1d,0x7d,0x43,0x7e, +0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34, +0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22, +0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x23,0x1d,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, +0x7a,0x2, 0x23,0x1d,0x7e,0x34,0x60,0xa3,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x46, +0xa2,0x12,0x73,0x28,0x12,0x3f,0x13,0x12,0x69,0x87,0x12,0xc0,0x25,0x12,0x23,0xb, +0x12,0x28,0x48,0x12,0x68,0x23,0x12,0x8d,0xec,0x2, 0x23,0x4, 0x7e,0x34,0x61,0x4f, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x7a,0x37,0x28, +0x95,0x7e,0x34,0x61,0xba,0x12,0x23,0x9e,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8, +0x12,0x23,0x9e,0x7a,0x37,0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0x9e,0x7a,0x37, +0x28,0x9b,0x7e,0x34,0x61,0xbc,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61, +0xbe,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0x9e,0x12, +0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x20,0xde,0x12,0x25,0xc3,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0x9e, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0x9e,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x3c,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0xb7,0xc7,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x36, +0xe1,0x7e,0x34,0x61,0x51,0x12,0x23,0x9e,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x36,0xe2, +0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe3,0x7e,0x34, +0x61,0x57,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe4,0x7e,0x34,0x61,0x59, +0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe5,0x7e,0x34,0x61,0x5b,0x12,0x23, +0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe6,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x36,0xe7,0x12,0x20,0xb9,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x37,0x12,0xe5,0x28,0x7a,0xb3,0x37,0x1, 0x22,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a,0x4d,0x90,0x60, +0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0xc0, +0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93, +0x7a,0xb3,0x2a,0x59,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x62,0x12,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60, +0xa0,0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3, +0x16,0x92,0x22,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e, +0x12,0xc0,0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x37,0xa0,0xbe,0xf0,0x5, 0x78, +0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78, +0x13,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b,0xe4,0x7a,0xb3,0x2b,0x2, 0x12, +0x7a,0x2d,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x49,0xd, 0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x69,0xab,0x12,0xc1,0x1, +0x80,0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b, +0x12,0x2f,0xf4,0x50,0xfb,0x12,0x88,0x17,0x12,0x69,0x97,0x12,0x28,0x48,0x74,0x2, +0x7a,0xb3,0x37,0xa0,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3, +0xed,0x7a,0x37,0x3, 0xef,0x22,0x7e,0xb3,0x37,0x6, 0x14,0x68,0x60,0x14,0x78,0x2, +0xe1,0x10,0x14,0x68,0x73,0x24,0x3, 0x68,0x2, 0xe1,0x5, 0x12,0xc1,0x32,0x38,0x8, +0x30,0x10,0xf, 0x12,0xc1,0x2a,0x68,0xa, 0x12,0x63,0x2, 0xe4,0x7a,0xb3,0x38,0x85, +0x80,0x7e,0x7e,0xb3,0x36,0xe7,0x30,0xe0,0x77,0x7e,0x73,0x36,0xe8,0xa, 0x27,0x7e, +0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64, +0x12,0x23,0x9e,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x83,0x50,0x53,0x12,0x63,0x2, +0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x38,0x87,0x80,0x43,0x12,0xc1,0x32, +0x28,0x39,0xe4,0x7a,0xb3,0x37,0x6, 0x7e,0xb3,0x38,0x85,0xb4,0x1, 0x6, 0x74,0x1, +0x7a,0xb3,0x37,0x6, 0xd2,0x17,0x80,0x23,0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x45,0x73,0x12,0x23,0x54,0xe4,0x7a,0xb3,0x37,0x6, 0x7a,0xb3,0x39, +0x7, 0xd2,0x17,0x80,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x39,0x7, +0x12,0x90,0xd2,0x2, 0x27,0x16,0xca,0xd8,0xca,0x79,0x7e,0xb3,0x37,0x6, 0xb4,0x1, +0x2, 0x80,0x3, 0x2, 0x28,0x38,0x6c,0xdd,0x6c,0xff,0x12,0x91,0x11,0x7d,0xf3,0x12, +0x2f,0xf4,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x38,0x86,0x12,0x3d,0xac,0x12,0x13,0xc7, +0x12,0x0, 0x1e,0x74,0xa, 0x12,0x45,0x15,0x12,0xc0,0xe7,0x7e,0xe7,0x2b,0xd, 0x7a, +0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3,0x2a,0xfa,0x7e,0xe7,0x2b,0xd, +0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3,0x2a,0xfa,0x12,0x7b,0xd0,0x7c, +0x7b,0x74,0x6, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x1e,0xb9,0x7d,0x23,0x7d,0x3f, +0x12,0x25,0x3c,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12,0x4e,0xe0,0x12,0x26,0x57,0x7e, +0xb3,0x37,0x31,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, 0x74,0xa, 0x12,0x91,0x5d,0x12, +0x4f,0xaf,0x80,0xf, 0x80,0x7, 0x12,0x45,0xcf,0xe4,0x12,0x46,0x7, 0x20,0x93,0xf6, +0x12,0x45,0x9f,0x30,0x18,0xf7,0x30,0x17,0xf4,0xd2,0x4, 0x12,0x45,0x5a,0xe4,0x12, +0x13,0xde,0xb, 0xd0,0x12,0x4c,0x83,0x12,0x91,0x76,0x7e,0xa3,0x38,0x85,0x4c,0xaa, +0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x86,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x31, +0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x85,0x12,0x28,0x3d,0x78,0x18,0x7e,0xb3,0x38,0x85, +0x60,0x12,0xe4,0x7a,0xb3,0x38,0x85,0x7a,0xb3,0x2a,0x2, 0x7a,0xb3,0x2a,0x3, 0x7e, +0xf0,0x1, 0x80,0x1d,0x12,0x28,0x3d,0x68,0x10,0x7e,0xb3,0x38,0x85,0x70,0xa, 0x7e, +0xf0,0x1, 0xe4,0x7a,0xb3,0x37,0x6, 0x80,0x8, 0xbe,0xd0,0x32,0x50,0x3, 0x2, 0x27, +0x8c,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a,0x37,0x2b,0xd, 0x7a,0xe3,0x2a, +0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x48,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x38, +0xf2,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34, +0x39,0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34, +0x3a,0x22,0xca,0x3b,0x12,0x2f,0xf4,0x50,0xfb,0x7e,0xf3,0x2b,0xf, 0x7c,0xbf,0x12, +0xb3,0xfc,0x12,0xb4,0x13,0x7e,0xb3,0x2b,0x1f,0xf5,0x28,0x7e,0xb3,0x2b,0x20,0xf5, +0x29,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0xf, 0x12,0x8d,0x6c,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x28,0x48,0xc3,0x21,0x6c,0x12,0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x7, 0x12,0xac,0x20,0x7a,0x37,0x37,0xe3,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x69,0x8e,0x12,0xac,0xe, 0x7e,0xc3,0x3, 0xec,0x12,0x6e,0x31, +0xe4,0x12,0x13,0xde,0x12,0x28,0x48,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x2a,0x7e,0x18, +0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x7a,0xc8,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x2a, +0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x7a,0xc8,0x7e,0xd3,0x2b,0x1f,0x7e, +0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5,0x29,0x12,0x6e,0x8b,0x50,0x5, +0x7c,0xbc,0x12,0xb3,0x54,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d, +0x10,0x12,0x6a,0xd4,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3,0x2b,0x20,0x7c,0xbf,0x12,0x86, +0xf8,0x12,0xaa,0x18,0x7e,0xb3,0x39,0x7, 0x4, 0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39, +0x7, 0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x7, 0x7e,0xb3,0x16,0x90, +0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e, +0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, 0x37,0x2d,0x32,0x22,0x12,0x48, +0x7, 0x7e,0xb3,0x37,0x8, 0xb4,0x3, 0x6c,0x12,0xb6,0xe2,0x12,0x26,0x57,0x12,0x3f, +0xfb,0x7e,0xb3,0x37,0x9c,0x30,0xe7,0xe9,0x12,0x28,0x62,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18,0x12,0xab,0xdb,0x12,0x75,0xe9, +0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x88,0x5f,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x58,0x52,0x12,0x48,0x39,0x12,0x3a,0x9f,0x7e,0xb3,0x37,0x9c,0x54,0x7f,0x7a,0xb3, +0x37,0x9c,0x80,0x8d,0x12,0x2f,0xee,0x2, 0x0, 0x46,0x7a,0xb3,0x2b,0x2, 0x7a,0xb3, +0x2b,0x1e,0x22,0x12,0x52,0x6d,0x12,0x2b,0xfa,0x12,0x2b,0xfa,0x12,0x36,0xac,0x12, +0x9c,0xfd,0x12,0x9f,0xef,0x12,0x2b,0xfa,0x12,0x9b,0xe7,0x12,0x2b,0xfa,0x12,0xa0, +0xae,0x12,0x2b,0xfa,0x2, 0x2a,0x27,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c,0xdd, +0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x25,0x7e,0x8, 0x35,0xe9,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18,0x26, +0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0x41,0xfb, +0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9,0x9, +0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x36,0x74, +0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36, +0x26,0xa, 0x37,0x12,0x81,0xbf,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x25,0x12,0xa1,0x4b,0x2d,0x13,0xbd,0xc1,0x28, +0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68,0x39, +0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x2c,0x40, +0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34,0x74, +0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71,0x74, +0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe8,0xbc, +0x7e,0x28,0x2, 0x41,0x60,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x33,0x12,0x2f,0xe4,0xbe,0xb0,0xff,0x68, +0x2b,0x9, 0x73,0x1f,0x35,0x12,0x30,0x3, 0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54,0x0, +0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, 0x12, +0x2f,0xe4,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc,0xf9, +0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19,0x75, +0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19,0xa3, +0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe,0x38,0x8a,0x90, +0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e, +0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xfd,0x12,0x97,0x4, 0x7e,0x8, 0x36, +0x25,0x74,0xff,0x12,0x20,0xde,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b, +0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xf5, +0x7a,0xf3,0x35,0xe8,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb3,0x28, +0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee, +0x80,0x2e,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x25,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac, +0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa, +0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbf,0x12,0x2f,0xd0,0xb, 0xf0,0xb, 0xe0, +0x12,0x9c,0xf6,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c,0xba,0x7c,0x7d, +0x12,0x30,0x3, 0xb, 0x1a,0x30,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3, +0x2a,0x6f,0xf5,0x40,0x7e,0xb3,0x2a,0x70,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a, +0xb3,0x33,0xc2,0x7a,0xb3,0x33,0xc0,0x7a,0xb3,0x33,0xc1,0x7e,0x8, 0x1f,0x34,0x12, +0x2f,0xdd,0xe4,0x12,0x20,0xde,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x33,0xc3,0xe4, +0x12,0x20,0xde,0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa2,0x6c,0xcc,0xe1,0x91,0x12,0xc0, +0x8b,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, +0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34,0x7c, +0xbd,0x14,0xbc,0xbc,0x78,0x2, 0xe1,0x97,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x88, +0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, 0xb3, +0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x28,0xe5, +0x27,0xa, 0x2b,0xe5,0x25,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0, +0x4, 0x40,0x2, 0xe1,0x86,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x86,0x85,0x25, +0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb0,0x69,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x40,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83,0x80, +0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2b, +0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x40,0x2d,0x34, +0xbd,0x38,0x18,0x2, 0xe1,0x1d,0x75,0x30,0x1, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x1, +0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x4, +0x40,0x2, 0xe1,0x1d,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x1d,0x7c,0xbf,0x20, +0xe0,0x2, 0xe1,0x1d,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26,0xbe, +0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1, +0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25, +0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50, +0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29, +0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x5, +0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24,0xe5, +0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29, +0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x5, +0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24,0xe5, +0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85,0x2b, +0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x2c,0x40,0x7a,0x35,0x3e,0xe5,0x2a, +0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe,0xb1, +0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93,0x5, +0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0,0x5, +0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c,0x50, +0xad,0xe5,0x2c,0x12,0x2f,0xae,0xe5,0x2a,0x12,0x2f,0xa5,0xe5,0x2a,0x12,0x2f,0xae, +0xe5,0x2c,0x12,0x2f,0xa5,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20,0x5, +0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x42, +0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0xe5,0x42,0xa, 0x1b, +0x6d,0x0, 0x12,0x1e,0xeb,0x7f,0x21,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, +0x28,0x12,0x1e,0xfc,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23, +0x3e,0x24,0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe, +0xb0,0x0, 0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x33,0xbf,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f, +0x34,0xf5,0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x1f,0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0xc0,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x8e,0x7e,0x8, 0x1f,0x34,0x12,0xaf,0x94,0x7a,0xb3, +0x33,0xc2,0xda,0x3b,0x22,0x7e,0x71,0x2d,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7e,0x71, +0x2b,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7c,0x7b,0x12,0x77,0xf6,0x9, 0xa2,0x27,0x72, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x91,0x6d,0x5c,0xba,0x22, +0x7e,0x70,0x1, 0x2, 0x51,0x5f,0xa, 0x3b,0x9d,0x32,0x2, 0x21,0x0, 0x90,0x60,0x9a, +0x93,0xa, 0x3b,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x12,0x2f, +0xf4,0x50,0xfb,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x7c,0x5b,0x7e,0x43,0x28, +0x84,0xbe,0x40,0x1, 0x28,0x2, 0x21,0x14,0x7e,0xa3,0x2a,0x6e,0x7e,0x70,0x2, 0xac, +0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x30,0x3, +0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc,0x7c,0x9d,0x7e,0x83,0x2a, +0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc,0xa, 0xa8,0x1b,0xa5,0xa, +0x5f,0xbd,0x5a,0x58,0x2, 0x21,0x14,0xa, 0x59,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48, +0x4e,0x7c,0xb9,0x14,0x12,0x31,0x5a,0x50,0x46,0x7c,0xb9,0x14,0x12,0x31,0x17,0xb, +0x1a,0xe0,0x7d,0x3b,0x12,0x31,0x4c,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf, +0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12, +0x31,0x1e,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x31,0x20,0x1b,0x1a,0xa0,0xa, +0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9,0x4, 0x12,0x31,0x5a,0x50, +0x43,0x7c,0xb9,0x4, 0x12,0x31,0x17,0xb, 0x1a,0xe0,0x7d,0x3c,0x12,0x31,0x4c,0x8, +0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12, +0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x31,0x1e,0xb, 0x1a,0x50,0xbd,0x5a,0x8, +0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x31,0x27,0x7d,0xd3,0x7d,0x5d,0x3e,0x54, +0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43,0x2a,0x6e,0x90,0x60,0xab, +0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7c,0x75,0xac,0x74,0xa, +0x2a,0x2d,0x32,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40, +0x2d,0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xab,0x6c,0x77,0x80,0x12, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x51,0x4f,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22, +0xb, 0x70,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe5,0xc3,0x22,0x12,0x36,0x9c, +0x60,0x30,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1b,0x7c,0xb2,0x12, +0x31,0x27,0x7d,0x3, 0x12,0x36,0x94,0x49,0x55,0x38,0xe8,0x7d,0x40,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd4,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc0,0xde,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0x41,0xdd,0x6c,0xcc,0x41,0xcf,0x12,0xc0,0x8b,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xb, 0x7e,0xb3,0x36,0x71,0x70, +0x5, 0x12,0x32,0xe0,0x80,0x6, 0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x30, +0x19,0xd2,0x3, 0x12,0x32,0xe7,0x7e,0xb3,0x36,0xec,0xb4,0x1, 0x1b,0x7e,0xb3,0x2a, +0x3, 0xb4,0x1, 0x14,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xd, 0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x3, 0x12,0x32,0xe0,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x27,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, +0x2d,0x1b,0x24,0xe5,0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24, +0x0, 0x80,0x3c,0xe5,0x24,0xbc,0xbc,0x68,0x34,0x12,0x35,0xda,0x9, 0xa3,0x26,0xfa, +0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5,0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x2f,0xd6, +0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a,0xa, 0x2b,0xe5,0x28,0x12,0x2f,0xd6,0xbe, +0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12, +0x36,0xa4,0x38,0xbf,0xe5,0x27,0x7e,0x71,0x28,0x12,0xa0,0x94,0x50,0x8, 0x12,0x31, +0x7d,0x12,0x35,0xd3,0x80,0x8, 0x12,0x69,0x84,0x50,0x3, 0x12,0x32,0xe0,0xe5,0x25, +0x7e,0x71,0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x33,0x21,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x16,0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e, +0x34,0x27,0x78,0x6d,0x22,0x12,0x7f,0xc5,0x12,0x31,0x7d,0xb, 0xf0,0xb, 0xc0,0x7e, +0x73,0x28,0x84,0xbc,0x7c,0x28,0x2, 0x21,0xc9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22, +0x75,0x25,0x3, 0x75,0x26,0x3, 0x22,0x12,0x36,0x9c,0x60,0x34,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1f,0x7c,0xb2,0x12,0x31,0x27,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x36,0x94,0x59,0x35,0x38,0xe8,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72,0x38,0xd0, +0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x35, +0x80,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x35,0x80,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x30,0x3, 0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x90,0x50,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0xc7,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0xb1,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0xaf,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0xaf,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x40,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0xaf,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x35,0x65,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x35,0x65,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0xb8,0xa8,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x35,0x56,0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x35,0x56,0x9f,0x51,0x12,0x35,0x5d,0x9f,0x41,0x12,0x35,0x5d,0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0xeb,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xdf,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x35,0x71,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x35,0x71,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1e,0xeb,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x0, 0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x7, 0x2e,0x18,0x0, 0x20,0x22, +0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34, +0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39, +0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39, +0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d, +0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba, +0xda,0xf8,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x74,0xf5,0x27,0x12,0x0, 0x66,0x50,0x2, 0xc1, +0x6f,0x6d,0x33,0x9e,0x37,0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x70,0x7e, +0xb3,0x16,0x92,0x70,0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x60,0x7e,0x77,0x2a,0x51, +0x7e,0x67,0x2a,0x53,0x75,0x24,0x0, 0x80,0x4e,0xe5,0x24,0x12,0x2f,0xb7,0x60,0x45, +0x12,0x35,0xda,0x12,0x9d,0x80,0xf5,0x26,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90, +0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26,0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26, +0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0xd, 0xe5,0x25,0xa, 0x2b,0xe5, +0x27,0x12,0x9b,0x18,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x51,0x5f,0x12, +0x35,0xda,0x12,0x37,0x9f,0x5, 0x24,0x12,0x36,0xa4,0x38,0xad,0x12,0xa6,0x5, 0xda, +0x3b,0x22,0x12,0x46,0xa2,0x12,0x24,0x9a,0x12,0x73,0x28,0x12,0x22,0xf2,0x7e,0xb3, +0x37,0x8, 0x24,0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x58,0xf0,0x80,0xef,0x12, +0x29,0x7e,0x80,0xea,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x90,0x60, +0xa7,0xe4,0x93,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x12,0xa5,0xee,0x12, +0x9b,0x49,0x12,0x35,0xe2,0x12,0x9a,0x38,0x2, 0x36,0xbb,0xca,0x3b,0x12,0x2b,0xfa, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x9, 0xe4,0x7a,0xb3,0x35, +0xe4,0x7a,0xb3,0x35,0x69,0x7e,0xb3,0x35,0xe2,0x70,0x69,0x6c,0x99,0x80,0x5d,0x74, +0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x9a,0xed, +0x40,0x48,0x6c,0xee,0x80,0x3c,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x6a,0x9, 0xc5, +0x35,0x6b,0xa, 0x28,0xa, 0x3d,0x12,0x37,0x67,0x78,0x25,0xa, 0x2f,0xa, 0x3c,0x12, +0x37,0x67,0x78,0x1c,0x7c,0xb9,0x12,0x37,0x6f,0x7e,0x14,0x62,0x2b,0x12,0x87,0xee, +0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x51,0x5f,0x7c,0xb8,0x7c,0x7f,0x12,0x37,0xa7, +0xb, 0xe0,0x7e,0x73,0x35,0xe4,0xbc,0x7e,0x38,0xbc,0xb, 0x90,0x7e,0x73,0x28,0x84, +0xbc,0x79,0x38,0x9b,0x7e,0x73,0x35,0x69,0x7a,0x73,0x35,0xe4,0xa, 0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x35,0xa6,0x7e,0x8, 0x35,0x6a,0x12,0x20,0xb9,0x1b,0xfd,0xe4, +0x7a,0xb3,0x35,0xe2,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x0, 0x4d,0x33,0x22,0x7c, +0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x2, 0x2c, +0x40,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0x99,0x6c,0x7f,0x71,0x7c,0xbf,0x12, +0x37,0x6f,0x12,0xa4,0xcf,0x7f,0x17,0x12,0x1f,0x58,0x7c,0xb7,0xda,0xf8,0x22,0x9, +0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c,0x6b,0x7e,0xa3,0x35,0x69,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x62,0x35,0xa6,0x19,0x72,0x35,0xa7,0x7c,0xba,0x4, 0x7a,0xb3,0x35, +0x69,0x22,0xca,0xf8,0x6c,0xff,0x80,0x18,0x7c,0xbf,0x12,0x37,0x6f,0xbe,0x37,0x2a, +0x5c,0x58,0xb, 0x12,0x51,0x5b,0x7e,0x70,0x2, 0xac,0x7f,0x12,0x37,0x9f,0xb, 0xf0, +0x12,0x52,0x66,0x38,0xe3,0x12,0x2b,0xfa,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe, +0xa0,0x34,0x38,0x3, 0x2, 0x38,0xfd,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x10, +0x41,0x1c,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d, +0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x31,0xce,0x7e,0x39,0xb0,0xbe,0xa0,0x37, +0x68,0x2, 0x41,0x1c,0x75,0x1a,0x36,0x41,0x1c,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0, +0x39,0x78,0x1b,0x7e,0xf3,0x37,0xc0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc0,0xbe,0xa0, +0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x1c,0xbe,0xa0, +0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xc2,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc2,0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b, +0x44,0x41,0x1c,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x1c,0xbe,0xa0, +0x5e,0x78,0x26,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, +0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x1c,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0, +0x3d,0x78,0x1b,0x7e,0xf3,0x37,0xc4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc4,0xbe,0xa0, +0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x1c,0xbe,0xa0, +0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xc6,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc6,0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a, +0x9d,0x41,0x1c,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x37,0x9c,0x41,0x1c,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e, +0xf3,0x37,0xe1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xe1,0xbe,0xa0,0x4f,0x78,0x3, 0x75, +0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x31,0xcc,0x7e,0x39,0xb0,0x41,0x1c,0xbe,0xa0,0x51, +0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, +0xff,0x7e,0xb3,0x37,0xec,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a, +0xb3,0x37,0xec,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0x1c,0xbe, +0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xb5,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xb5,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x3a, +0x1f,0x41,0x1c,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0x91,0x41,0x1c,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e,0xbe,0xa0, +0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0xa, 0x9, 0xb3,0x31,0xd4,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1a,0xf4,0x80,0x5c, +0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5, +0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10, +0x3e,0x14,0x7e,0x1f,0x31,0xd0,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, +0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80, +0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c, +0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, +0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e, +0x3, 0x2a,0x6d,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x60,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, +0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, +0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x62,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca, +0xf8,0x80,0x38,0x7c,0xbf,0x12,0x3a,0x1f,0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70, +0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x12,0x3a,0xde,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x3a,0xde,0x7e,0x73,0x2a, +0x6e,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3, +0x2a,0x6d,0x74,0x2, 0xa4,0x22,0x12,0x3f,0xaa,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x37,0xdc,0x7e,0x8, 0x25,0xee,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x3f,0x49,0x80,0x12, +0xca,0x39,0x7e,0x18,0x37,0xdc,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x3f,0x67,0x2, 0x3b,0x15,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0xca,0xf8, +0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x7d,0xab,0xd2,0x6, 0xa1,0xa0,0xa5, +0xbe,0x1, 0x3d,0x7a,0x73,0x37,0x9d,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5,0xbf,0xae, +0x4, 0xd2,0x7, 0xa1,0xa0,0xa5,0xbf,0xaa,0x5, 0x12,0xc0,0xf8,0x80,0x1e,0xa5,0xbf, +0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xce,0x80,0x10,0xa5,0xbf,0xac,0x2, +0x80,0x2, 0xa1,0xa0,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xce,0x6d,0x33,0x81,0x1c, +0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x3d,0xa3,0xa5,0xbe,0x7, +0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xa0,0xa5,0xbe,0x8, 0x2, 0x80,0x2, 0xa1,0xa0, +0x12,0x7, 0xfb,0xa1,0xa0,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73,0x37,0xa6, +0xa1,0xa0,0xa5,0xbe,0xb, 0x8, 0x12,0x3d,0xa3,0x12,0x3f,0xc8,0xa1,0xa0,0xbe,0x60, +0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x38,0xbe,0x60,0x1e,0x40,0xd, 0xbe, +0x60,0x23,0x38,0x8, 0x12,0x3d,0xa5,0x43,0xc, 0x40,0xa1,0xa0,0xbe,0x60,0x15,0x40, +0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x3d,0xa5,0xd2,0x6, 0xa5,0xbe,0x15,0x2, 0x80, +0x2, 0xa1,0xa0,0x74,0x7, 0x7a,0xb3,0x37,0xa0,0xa1,0xa0,0xa5,0xbe,0x19,0x7, 0xe4, +0x7a,0xb3,0x37,0xb5,0xa1,0xa0,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c,0x38,0x2, +0xa1,0x38,0xa5,0xbe,0x2d,0x1b,0x12,0x3d,0xa5,0x20,0x7, 0x2, 0xa1,0xa0,0x7e,0x63, +0x37,0xc8,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35,0x8, 0xa1, +0xa0,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, 0xa1,0x38, +0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1,0x38,0x7e,0x70, +0x64,0xa1,0x38,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, 0x1, 0x7e, +0xf3,0x37,0xc1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc1,0xa, 0x2f,0x19,0x72,0x2b,0x21, +0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x38,0xa1,0xa0,0xbe,0x60,0x3a, +0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xc3,0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, 0x80,0x2, +0xa1,0xa0,0x75,0x1a,0x3a,0xa1,0xa0,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, 0x7a,0x73, +0x2b,0x12,0xa1,0xa0,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xec,0xa1,0xa0,0xbe,0x60, +0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc5,0x7c,0xbf, +0x4, 0x7a,0xb3,0x37,0xc5,0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d,0x2, 0x80, +0x2, 0xa1,0xa0,0x75,0x1a,0x3c,0xa1,0xa0,0xbe,0x60,0x3e,0x68,0x4, 0xa5,0xbe,0x3f, +0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc7,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc7,0xa, +0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x3e, +0xa1,0xa0,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x3d,0xa5,0x75, +0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x3d,0xa5,0x75,0xd, 0x2, 0x12,0x3a, +0xe6,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x3d,0xa5,0x12,0x3f,0x70,0x80,0x71,0xbe, +0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x3d,0xa5,0x80,0x63,0xbe,0x60,0x4e, +0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xe2,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xe2,0xa, 0x2f,0x2e,0x27,0x31,0xcc,0x7a,0x29,0x70,0xa5,0xbe,0x4f, +0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80,0x31,0xbe, +0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20,0x7c,0xb7, +0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, 0x7e,0x1f, +0x31,0xd0,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a,0x71,0xf, +0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0x9c,0x22,0x7a,0xb3,0x2b,0x0, +0x70,0x14,0x12,0x3f,0x67,0x12,0x3b,0x15,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4, +0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x3f,0x49,0x12,0x3b,0x15,0x12, +0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12,0x0, 0x1e, +0xe4,0x12,0x3d,0xac,0x12,0x3d,0xf3,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12,0x3d,0xac, +0x2, 0x3d,0xf3,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e,0x8, 0x1f, +0x44,0x12,0x3f,0xe9,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x20,0xde,0x7e, +0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x1f,0xda,0x7e, +0x34,0x0, 0xa, 0x12,0x20,0xde,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc,0x7a,0x1d, +0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, 0x2a,0xb9, +0x12,0xba,0x6c,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, 0x3a,0x2e, +0x34,0x20,0x73,0x12,0x91,0x6d,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12, +0x3f,0xb, 0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a, +0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9, +0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x3f,0xb, 0xa, 0x4a, +0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde, +0x38,0xd8,0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0, +0x12,0xb9,0x2, 0x80,0x3, 0x12,0x3f,0xd9,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f, +0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e, +0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34, +0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e, +0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x12,0xaf,0x1f,0x12,0x13,0xf5,0x12, +0xb9,0x8e,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x3f,0xcb,0x74,0x1, 0x12, +0x3d,0xac,0x12,0x3f,0xd2,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x3d,0xdb,0x7e, +0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25, +0xee,0x22,0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x3f,0x67,0x80,0x6, 0xb4,0x1, 0x6, +0x12,0x3f,0x49,0x12,0x3b,0x15,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22, +0x12,0x3f,0xaa,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x37,0xdc, +0x12,0x20,0xb9,0x1b,0xfd,0x12,0xc0,0xef,0x12,0x3f,0x49,0x80,0x1a,0xca,0x39,0x7e, +0x18,0x2b,0x70,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x37,0x2b,0x76, +0x7a,0x37,0x31,0xcc,0x12,0x3f,0x67,0x2, 0x3b,0x15,0x7e,0xb3,0x37,0xe0,0x7e,0x34, +0x0, 0x4, 0x22,0x7c,0x6b,0x12,0x3f,0xe1,0x78,0x5, 0x7c,0xb6,0x2, 0x7d,0xd6,0xb4, +0x4, 0x5, 0x7c,0xb6,0x2, 0x3b,0x1e,0x22,0xb2,0x82,0x22,0x7d,0x32,0x74,0xfa,0x2, +0x12,0xd0,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x20, +0xde,0x7e,0xb3,0x37,0x9c,0xc4,0x54,0x7, 0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, +0x20,0xde,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x30,0x6, 0x3b,0xc2,0x6, +0x12,0x25,0xe6,0x7e,0x73,0x37,0xa1,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x37,0xa2,0x7a, +0x73,0x2b,0x1d,0x7e,0x73,0x37,0xa2,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x37,0xa3,0x60, +0x18,0x7e,0x34,0x0, 0x2, 0x12,0x41,0x5d,0x7e,0x34,0x0, 0x1, 0x12,0x41,0x5d,0x6d, +0x33,0x12,0x41,0x5d,0xe4,0x7a,0xb3,0x37,0xa3,0x12,0x4f,0xfa,0x2, 0x40,0x3f,0xe5, +0xc, 0x70,0x2, 0x21,0x5c,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x72,0x92, +0x12,0x79,0x31,0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53, +0xc, 0xfd,0x12,0xba,0x23,0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b, +0x12,0x60,0x9, 0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65, +0x7e,0x73,0x2b,0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x4, +0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3, +0x45,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xce,0x7a,0x73,0x2b,0xf, 0x12,0x87,0x52,0x7a, +0xb3,0x0, 0x4f,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x4f,0x7a, +0x73,0x37,0xa6,0x12,0x6e,0x29,0x12,0xc0,0x42,0x7e,0x73,0x37,0xcf,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4, +0x12,0xa, 0x66,0x12,0x8d,0xec,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43, +0x37,0xd0,0x7e,0x50,0xa, 0xac,0x45,0x12,0x3f,0xcb,0xe5,0xc, 0x30,0xe6,0x4e,0x53, +0xc, 0xbf,0x7e,0x73,0x37,0xbc,0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37, +0xbc,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x43,0xeb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63, +0x37,0xbc,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12,0x47,0x81,0x7c,0x65,0x4c,0x76,0x74, +0xe, 0x12,0x43,0x5f,0x12,0x43,0xeb,0x12,0x43,0xf3,0x7e,0x73,0x37,0xbf,0x7a,0x73, +0x2b,0x14,0x7e,0x73,0x37,0xbe,0x7a,0x73,0x2b,0x1f,0x12,0xc1,0x1, 0xe5,0xc, 0x30, +0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xa6,0x2, 0x48,0x77,0x22,0xca,0xd8,0xca, +0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c, +0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x57, +0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x43,0xeb,0x7c,0x8b,0x74,0x7, 0x7e, +0x70,0xf, 0x12,0x43,0xf0,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, +0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, +0xc, 0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e, +0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x38,0xc4,0x12,0x43, +0x48,0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x38,0xc4,0x78,0x7, 0x12,0x43, +0x48,0x54,0xfb,0x80,0x5, 0x12,0x43,0x48,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x38, +0xc0,0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e, +0xa0,0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0x12,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff, +0xe, 0x12,0x43,0x53,0x54,0xe6,0x12,0x43,0x50,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12, +0x43,0x53,0x5e,0x54,0xfe,0xe6,0x12,0x43,0x50,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4, +0x0, 0x2, 0x78,0x2d,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e,0x54,0x0, 0xf, 0x1b, +0x1a,0x50,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34, +0x0, 0x2, 0x12,0x44,0x72,0x12,0x44,0x4b,0x12,0x44,0x28,0x7a,0x37,0x31,0xd4,0x61, +0x4, 0x6c,0xdd,0x41,0xfe,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40, +0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, +0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c, +0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e, +0x54,0x0, 0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4, +0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, +0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, +0x3b,0x12,0x44,0x72,0x12,0x44,0x4b,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x44,0x4b, +0x12,0x44,0x28,0x74,0x2, 0xac,0xbd,0x59,0x35,0x31,0xd6,0x80,0xf, 0x12,0x44,0x28, +0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x31,0xd6,0xb, 0xd0,0xbc,0xed, +0x28,0x2, 0x41,0x65,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x43,0xf0,0xa9,0xc0, +0xc4,0x7e,0x1f,0x38,0xc0,0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x38,0xc0,0x79,0xf1,0x0, +0x90,0x6d,0x33,0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0x8, 0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x10,0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22, +0x1b,0x1a,0x50,0x7e,0x1f,0x38,0xc0,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5, +0xfd,0x7a,0x71,0xfe,0x22,0xca,0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12, +0x43,0x5f,0x74,0xf, 0x12,0x43,0xeb,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe, +0x12,0x43,0x5f,0x74,0xc, 0x12,0x43,0xeb,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, +0x7e,0x70,0xf8,0x12,0x43,0x5f,0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, +0x38,0xb, 0x12,0x45,0x6, 0x7c,0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17, +0xe4,0x93,0xb4,0x1, 0xe, 0xbe,0xa0,0x7, 0x28,0x9, 0x12,0x45,0x6, 0xa, 0x77,0x2e, +0x74,0x0, 0x7, 0x74,0xe, 0x7c,0x7f,0x12,0x43,0x5f,0x74,0x7, 0x12,0x43,0xeb,0x7c, +0xfb,0x5e,0xf0,0xfb,0x90,0x60,0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c, +0xf7,0x74,0x7, 0x7c,0x7f,0x12,0x43,0xf0,0xda,0x79,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x12,0x43,0x5f,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24, +0x7e,0x24,0x0, 0x12,0x12,0xb7,0xc7,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74, +0x3, 0x7e,0x71,0x27,0x12,0x43,0x5f,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x43,0x5f,0x74, +0xc, 0x7e,0x71,0x30,0x12,0x43,0xf0,0x22,0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0xa, +0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e, +0xf, 0x38,0xc4,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0x12,0x5e, +0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34, +0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x45,0x15, +0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6, +0x22,0x12,0x47,0xf8,0xc2,0x3, 0x12,0xb6,0x57,0xc2,0x5, 0x12,0x45,0x51,0xc2,0x3, +0x12,0x47,0x21,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0xeb,0x7a,0x1b,0xb0,0x74,0xf, +0x6c,0x77,0x12,0x43,0x5f,0xe5,0xfc,0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x43,0xf3, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x2a,0x12,0x44,0x6e,0x12,0xb6, +0xf, 0x2, 0xb6,0xc4,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x1a,0x12,0x44,0x6e,0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0xc, 0x12,0x44,0x6e,0x2, 0xb6,0xbe,0x74, +0x1, 0x7a,0xb3,0x33,0xff,0x22,0xa, 0x3a,0x2e,0x34,0x0, 0x3, 0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0x5f,0x7a,0x61,0xfc,0x12,0x43,0xf3, +0x12,0x46,0x68,0xd2,0x3, 0x12,0x47,0x21,0x12,0x45,0x6b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x45,0x6b, +0x2, 0x13,0x96,0x12,0x47,0xf8,0xc2,0x5, 0x2, 0x45,0x51,0xd2,0x5, 0x12,0x45,0x51, +0x74,0x1, 0x22,0x12,0x45,0xcf,0x12,0x91,0x8, 0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0xc0,0xd5,0x12,0x44,0x91,0x74,0x1, 0x12,0x46,0x7, 0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x45,0x30,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x45,0x5a,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x45,0xcf,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x46, +0x7, 0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x45,0x5a,0x74, +0x81,0x7a,0xb3,0x39,0x2, 0x22,0x80,0x1d,0x12,0x45,0xcf,0x12,0x47,0xff,0x68,0x5, +0xc2,0x4, 0x12,0x45,0x5a,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x17, +0x15,0xe4,0x12,0x46,0x7, 0x20,0x93,0xe0,0x12,0x45,0xcf,0xa9,0xd1,0xcd,0xa9,0xc5, +0xea,0x74,0x2, 0x2, 0x46,0x7, 0x22,0x7c,0xab,0x7e,0xb3,0x39,0x2, 0xb4,0x81,0x38, +0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf, +0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, +0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87, +0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0x2, 0x22,0xd2,0x3, +0x80,0x12,0x30,0x3, 0xc, 0x12,0x47,0xff,0x68,0x7, 0xc2,0x3, 0xc2,0x4, 0x12,0x45, +0x5a,0x12,0x45,0xd6,0x30,0x17,0xeb,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb, +0xd2,0x3, 0x12,0xb6,0x57,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, +0xa9,0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74, +0x41,0x12,0x45,0x15,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda, +0xf8,0x22,0xe4,0x12,0x46,0xf0,0x12,0xb6,0x60,0x12,0x26,0x57,0x12,0xb6,0xdb,0x12, +0x43,0x65,0x12,0xb6,0x5, 0x12,0xb6,0x77,0x12,0x0, 0x4a,0x12,0xb6,0x83,0x12,0x7e, +0xa0,0x12,0xb6,0x93,0xd2,0xaf,0x12,0x47,0x8a,0x12,0xb8,0x1e,0x12,0x43,0xfa,0x12, +0x46,0x68,0x7e,0x8, 0x3, 0xf1,0x12,0xa9,0xa3,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34, +0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0xa9,0xd0, +0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x45,0x51,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75, +0xc2,0xc, 0xd2,0x3, 0x12,0x47,0x21,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1, +0x22,0xa2,0x3, 0xa9,0x97,0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x7e,0x34,0x36,0xe1, +0x30,0xd, 0x4b,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x4f, +0x9, 0x53,0x0, 0x3, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12, +0x47,0x7f,0x7a,0x27,0x2a,0x53,0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a, +0x27,0x2a,0x5a,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a, +0x5c,0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0x45,0xc, 0x7a,0x37,0x2a,0x62,0x22,0xa, +0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12, +0x43,0xeb,0x7c,0x7b,0x12,0x43,0xf3,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e, +0x24,0x0, 0xef,0x7e,0xf, 0x38,0xc0,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e, +0xf, 0x38,0xc0,0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x38,0xc0,0x79, +0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x38,0xc0,0x79, +0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8a,0x7e, +0x34,0x6a,0xd1,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e, +0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8e,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x12,0xc0,0xf8,0x12,0xc0,0xef,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x48,0x56,0x12,0x48,0x30,0x74,0x50,0x7a,0xb3,0x37,0xd0,0x7e,0x24, +0x3, 0x20,0x12,0x3f,0xcb,0xe4,0x12,0xc0,0x27,0x6d,0x33,0x7a,0x37,0x39,0x4, 0x22, +0x7e,0x73,0x2b,0x62,0x7a,0x73,0x37,0xcf,0x22,0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37, +0xca,0x7e,0x73,0x37,0xce,0xbe,0x73,0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12, +0x48,0x56,0x12,0x48,0x30,0x22,0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x7e,0x73, +0x2b,0x1f,0x7a,0x73,0x37,0xbe,0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x7e,0x73, +0x2b,0x14,0x7a,0x73,0x37,0xbf,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, +0x12,0x48,0xe8,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80, +0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x48,0xe8,0x40, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c, +0xdd,0x7c,0xbd,0x12,0x8d,0xb3,0x12,0x48,0x6e,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x37, +0xbe,0x12,0x49,0x4, 0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x12,0x48,0x30,0x7a, +0xd3,0x37,0xa6,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26, +0x33,0xbc,0xbe,0x22,0x30,0x3, 0x3, 0x12,0x48,0x6e,0xa2,0x4, 0x92,0x5, 0x12,0x49, +0xc3,0x2, 0x49,0x4, 0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x22,0x74,0x40,0x12, +0x6e,0x8b,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x48,0xf4,0x80,0x1c,0x74,0x1, 0x12, +0x49,0x47,0x7e,0x43,0x37,0xbb,0x7e,0x50,0x64,0xac,0x45,0x12,0x87,0xf8,0x7a,0xb3, +0x2b,0x1f,0x7e,0xf, 0x38,0xd9,0x12,0x4d,0x9b,0x12,0x49,0x4, 0x7e,0x73,0x2b,0x1f, +0x7a,0x73,0x37,0xbe,0x2, 0x48,0x6e,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14, +0x12,0xc0,0x42,0x7e,0xc0,0xa, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x1f,0x38,0xd9,0x12,0x90,0x58,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, +0x12,0x49,0xb7,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12, +0x49,0xb7,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x49,0xb7,0xb, +0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x38, +0xd9,0x12,0x8f,0xfb,0x7d,0x73,0x7e,0x1f,0x38,0xc8,0x69,0x31,0x0, 0x1a,0x7a,0x73, +0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, 0x1a,0xb, +0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x37,0xb1, +0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5,0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3, +0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a,0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35, +0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x31,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x4e,0x5f,0x6c,0xff,0x80,0x35,0x12,0x4c, +0x40,0x6c,0xee,0x80,0x19,0x7e,0x11,0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac, +0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x10,0x12,0x4c,0x47,0xe5,0x2e, +0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12,0x4c,0x56,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34, +0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xc5,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34, +0x10,0x0, 0x12,0x4c,0x7c,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x78,0x12,0x4c,0x40, +0x6c,0xee,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2a,0xbc,0xbe,0x38,0xe6,0xe5,0x2a, +0x12,0x4c,0x56,0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x60,0xe5,0x2a,0xbe,0xb1,0x2d, +0x50,0x35,0x12,0x4c,0x40,0x7e,0xe1,0x2a,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2d, +0xbc,0xbe,0x38,0xe6,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5,0x2d,0xa, 0x1b,0x6d,0x0, +0x9f,0x1, 0x12,0x4c,0x5a,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x3, 0x62,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x82,0xe5,0x2d,0xa, 0x1b,0x6d, +0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x1f,0x7, 0x6c,0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, 0x9d,0x15,0xad,0x12, +0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21, +0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xcc, +0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x7, 0x6c,0xff,0x80, +0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x60,0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10, +0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x60,0xe5,0x2a, +0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x62,0x2e,0x14,0x10, +0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x62,0xb, 0xf0,0xe5,0x2b,0xbc, +0xbf,0x38,0x9e,0x7e,0x73,0x37,0xb3,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14, +0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x5, 0x7d,0xe3,0x7a,0xe5,0x35, +0x7e,0x73,0x37,0xb4,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d, +0x1f,0x12,0x1f,0x5, 0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, 0xac,0xbf,0x49,0x45, +0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x34,0x0, 0x80,0x8, +0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xda, +0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x60,0xbe,0x45,0x35,0x28, +0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x60,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65, +0x3, 0x60,0x49,0x45,0x3, 0x62,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35, +0x3, 0x62,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x62,0xb, 0xf0,0xe5,0x2b, +0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x31,0x12,0x4d,0x9b,0xda,0x3b,0x22, +0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a, +0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f, +0x7, 0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x1f,0x5, 0x7e,0xa1,0x2c,0x74, +0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x4e,0x5f,0x7e,0x1f,0x38,0xf3, +0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x6, +0x7e,0x38,0x38,0x88,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x87,0x70,0xe, 0x7e,0xb3,0x38,0x85,0x70,0x8, +0x74,0x1, 0x7a,0xb3,0x38,0x87,0xa1,0x57,0x7e,0xb3,0x38,0x87,0x70,0x6, 0x74,0x1, +0x7a,0xb3,0x38,0x87,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0, +0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61, +0x59,0x12,0x23,0x9e,0x7a,0x35,0x2e,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0xa6,0x56, +0x75,0x2c,0x0, 0x80,0x16,0x12,0x4c,0x7c,0x12,0x4d,0x84,0xbe,0x35,0x2a,0x8, 0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x84,0x7a,0x35,0x2a,0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c, +0x38,0xe3,0x12,0x4d,0x93,0x40,0x25,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x1e,0x5, 0x1c, +0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c,0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20,0xb9,0x1b,0xfd,0x74,0x2, 0x12,0x0, +0x1e,0x12,0x4d,0x93,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x38,0xf2,0xe4,0x7a,0xb3,0x38, +0x87,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, 0x21,0x0, 0x7f,0x13,0x2d,0x35,0xb, +0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35,0x2a,0x22,0x12,0x4d,0xa5,0xb, 0x34, +0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x12,0xc1,0x3a,0x4c,0xaa, +0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c,0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4, +0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60, +0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e,0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, +0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc, +0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, +0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12,0x1f,0x7, 0x7f,0x1, 0xb, 0xc, 0x7e, +0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f,0x7, 0xbe,0x34,0x0, 0xfa,0x28,0x4, +0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, 0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d, +0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e,0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e, +0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27, +0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e, +0x34,0x0, 0x38,0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12, +0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, +0x12,0x4e,0x8d,0x80,0x2, 0xe4,0x22,0x12,0x4e,0x72,0x74,0x1, 0x22,0x12,0xc0,0x9f, +0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0x12,0x7f,0x6f,0x38,0x2, +0xe4,0x22,0x12,0x7f,0x67,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x4e, +0xb4,0x2, 0x4e,0x7d,0x7e,0xd7,0x2b,0xd, 0xbe,0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12, +0x7e,0xf8,0x12,0x4e,0xe0,0x7a,0xd7,0x2b,0xd, 0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e, +0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, 0x12,0x4f,0xaf,0x74,0x1, 0x22, +0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b,0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a, +0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x4e,0xe0,0x12,0xc0,0xe7,0x12,0x29,0x6f, +0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x20,0xde,0x7e,0xd0,0x7, 0x12,0x26,0x57,0x6c, +0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x12,0x4f,0xf0,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, +0x3c,0xbd,0x32,0x48,0xde,0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x7e,0xb3, +0x2a,0x73,0x7c,0x7e,0x12,0x7b,0x31,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49, +0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0x4f,0xf0,0x5c,0x7b,0x7a, +0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe, +0xd0,0x0, 0x58,0x88,0x12,0x7b,0x39,0x74,0x2, 0x12,0xc1,0xa, 0x12,0x50,0x51,0x74, +0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2a,0xfa,0x12,0x4e,0xe0,0xda,0x3b,0x22,0x74,0x2, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x12,0x50,0x51,0x74,0x2, 0x12,0x0, 0x1e,0x74, +0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x4f,0xc1,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, +0x94,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x2e,0x34,0x20,0x73,0x12, +0x91,0x6d,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x38,0xc0,0x2d, +0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x74,0xbc,0x6a,0x38,0xd6,0x22, +0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, +0x30,0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x4e,0xe0,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, +0xfd,0x7e,0xb3,0x37,0xe0,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc1,0xa, 0x12, +0x50,0xd4,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xe1,0x7e, +0xb3,0x37,0xe0,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x3f,0x67,0x80,0x7, 0xe4, +0x12,0x0, 0x1e,0x12,0x3f,0x49,0x12,0x3b,0x15,0x7e,0xb3,0x2a,0xfc,0x2, 0x50,0x51, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x3f,0xe9,0x7e,0xa3,0x2a,0x73, +0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x62,0x2a,0xdc,0xa, 0x26, +0x12,0x51,0x4b,0x93,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x50,0xca, +0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xde,0x6c,0xee,0x80,0x1a,0xa, 0x2e, +0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12, +0x50,0xca,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30, +0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba, +0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27,0x2a,0xfe,0x7e,0x29, +0xb0,0xa, 0x26,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xe9,0x7e, +0xa3,0x2a,0x73,0x7e,0x63,0x2a,0x74,0x6c,0xee,0x80,0x1f,0xa, 0x2e,0x9, 0x72,0x2a, +0xdc,0xbe,0x70,0x1c,0x50,0x12,0xa, 0x27,0x12,0x51,0x4b,0x93,0x7c,0x7b,0x7e,0xb3, +0x2a,0xfb,0xa, 0x27,0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xdd,0x6c,0xee, +0x80,0x17,0xa, 0x3e,0x9, 0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a, +0xfb,0xa, 0x27,0x19,0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e, +0x30,0xe, 0xac,0x3e,0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11, +0xf8,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0x73,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7a,0xb3,0x34,0xc4,0x7c,0xbf,0x6c,0x77,0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x51,0x4f,0x93,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff, +0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0xca, +0xf8,0x6c,0xaa,0x6d,0x33,0x7e,0x24,0x7f,0xff,0x7e,0xf0,0x1, 0x80,0x32,0xa, 0x1f, +0x7e,0xb3,0x2a,0x6e,0xa, 0xb, 0x2d,0x1, 0x3e,0x4, 0x49,0x10,0x4, 0xfc,0xbe,0x14, +0x3, 0xe8,0x8, 0x1a,0xb, 0xa0,0xbd,0x13,0x8, 0x4, 0x7d,0x31,0x80,0x10,0xbd,0x12, +0x58,0xc, 0x7d,0x21,0xbe,0x24,0x0, 0x0, 0x18,0x4, 0x7e,0x24,0x0, 0x1, 0xb, 0xf0, +0x7e,0xb3,0x2a,0x6f,0xa, 0xb, 0x1b,0x4, 0xa, 0x1f,0xbd,0x10,0x48,0xc0,0x7e,0xb3, +0x34,0xa1,0x7a,0xb3,0x36,0xf3,0x7a,0xa3,0x36,0xf7,0xe4,0x7a,0xb3,0x36,0xf5,0xbe, +0xa0,0xb, 0x78,0x18,0x9d,0x32,0xbe,0x34,0x5, 0xdc,0x58,0x10,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x1, 0x5e,0x58,0x6, 0x74,0x1, 0x7a,0xb3,0x34,0xa1,0x7e,0x73,0x34,0xa1, +0xbe,0x70,0x0, 0x28,0x3e,0x6c,0xff,0x80,0x35,0x7c,0xbf,0x12,0x97,0xfc,0x60,0x22, +0x74,0x22,0x7a,0xb3,0x36,0xf4,0x7e,0xb3,0x34,0xc4,0x4, 0x12,0x51,0x57,0x7e,0x73, +0x34,0xc4,0xbe,0x70,0x5, 0x40,0x15,0xe4,0x7a,0xb3,0x34,0xc4,0x7a,0xb3,0x34,0xa1, +0x80,0xa, 0xe4,0x12,0x51,0x57,0x74,0x33,0x7a,0xb3,0x36,0xf5,0xb, 0xf0,0x12,0x52, +0x66,0x38,0xc6,0xda,0xf8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xca,0xd8,0xca, +0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x3c,0xe4,0x7a,0xb3,0x1f,0x58,0xe5,0x1d, +0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60,0xc, 0x12,0x8c,0x87, +0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x10,0x6d,0x88,0x7a,0x87,0x37, +0xfd,0x61,0xa0,0x12,0x93,0x91,0x60,0x12,0x7e,0x34,0x62,0xe, 0x12,0x87,0xc4,0x7a, +0x87,0x37,0xf3,0x12,0x54,0x2b,0x7a,0x87,0x37,0xfd,0x7e,0x87,0x37,0xf3,0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x7b,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x52,0x7c,0xbd, +0x7c,0x7e,0x12,0x55,0xb9,0x7d,0x93,0x7e,0x87,0x37,0xfd,0xbd,0x89,0x50,0x4, 0x7a, +0x97,0x37,0xfd,0x7e,0x87,0x38,0x3c,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x3c,0xe5, +0x1d,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x37,0xff,0x12,0x54,0x4e,0x50,0x7, 0x12, +0x54,0x45,0xd2,0x3, 0x80,0x2f,0x7e,0x8, 0x37,0xff,0x7e,0x18,0x1f,0x52,0x12,0x57, +0x0, 0x50,0x22,0x80,0x10,0x12,0x54,0x2b,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f,0x52, +0x12,0x91,0x86,0x50,0x10,0x12,0x54,0x45,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52, +0x12,0x93,0x6b,0xd2,0x3, 0xb, 0xf0,0x12,0x52,0x66,0x38,0x80,0x30,0x3, 0x37,0x6c, +0xff,0x80,0x20,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x58,0x12,0x54, +0x4e,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x54, +0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdb,0x75,0x1d,0x0, 0x7e,0x34,0x62,0xe, 0x12, +0x23,0x9e,0x7a,0x37,0x37,0xf3,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, 0xac,0x67,0xb, +0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x37,0xff,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x37,0x37,0xf3,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93,0xa, 0x3b,0xbe, +0x37,0x37,0xfd,0x38,0x40,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37,0x38,0x3c,0x38, +0x34,0x90,0x60,0x51,0x12,0x54,0x33,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, +0x24,0x90,0x60,0x50,0x12,0x54,0x33,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, +0x14,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x54,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf4,0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0xa2,0x3, 0x92,0x10,0x12, +0x56,0xe9,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xb, 0x70,0x1b,0x7e, +0xb3,0x28,0xa8,0x70,0x15,0x12,0xc1,0x2a,0x68,0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0, +0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x51,0x5f,0x22,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0xd5,0x26,0xfa,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x7c,0xbd, +0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f, +0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0, +0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, +0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38, +0xc9,0xa2,0x4, 0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28,0x99, +0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73, +0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f, +0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, +0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x55,0xa6,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3, +0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e, +0xb3,0x26,0x83,0x70,0x40,0x12,0x8f,0xe3,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x55,0xa6,0x49,0x2, +0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49, +0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, +0xf0,0xbc,0x7f,0x38,0xc9,0x12,0xb1,0x8e,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28, +0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28, +0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x55,0xaf,0x49,0x25, +0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x0, 0xbe,0x37,0x28,0x9d,0x8, +0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdc,0x6c, +0xff,0x80,0x9, 0x12,0x55,0xaf,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf2,0xda,0x79,0xda,0xd8,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0x7c, +0xbf,0x12,0x37,0x6f,0x74,0x2, 0xac,0xbf,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f, +0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c,0xcc, +0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c, +0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14, +0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12, +0x20,0xde,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a, +0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1c,0x75,0x26,0x0, +0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56,0xd3,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf1,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xdf,0x7c,0xec, +0x80,0x23,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80,0xa, 0x12,0x91,0xd5, +0x70,0xd, 0x12,0x56,0xd3,0xb, 0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5, +0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd8,0x1a,0x3c,0xb, 0x34,0x7c,0xe7, +0x80,0x1c,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56, +0xd3,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf1,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73, +0x2a,0x6e,0xbc,0x7e,0x18,0xdc,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x21,0x75,0x26, +0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xa, 0x12,0x91,0xd5,0x70,0xd, 0x12,0x56,0xd3,0xb, +0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e, +0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd7,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, +0xda,0x3b,0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35,0x24,0x22,0x12,0x57, +0x32,0x12,0x51,0x9f,0x7a,0xb3,0x2a,0xc, 0x22,0x30,0x10,0x13,0x12,0xc1,0x1a,0x68, +0x6, 0x7e,0xb3,0x39,0xb, 0x60,0x8, 0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x37,0xfb,0x22, +0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f, +0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x54,0x52,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76, +0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9, +0xc3,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34,0xa2,0x6c,0x33,0x80,0x3d,0x7e, +0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc, +0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32, +0x12,0x35,0x67,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3, +0x34,0xa2,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf, +0x2, 0x57,0x83,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac, +0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c, +0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26, +0xfb,0xa, 0x28,0xa, 0x31,0x12,0x35,0x67,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x35, +0x67,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0, +0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3e,0xbe,0xb0,0x0, 0x28,0x12,0x14, +0x7a,0xb3,0x35,0x3e,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2a, +0x5a,0x7e,0xb3,0x36,0xec,0x70,0x58,0x7e,0xb3,0x39,0xb, 0x70,0x52,0x7e,0xb3,0x36, +0x71,0x70,0x4c,0x7e,0x37,0x37,0xfd,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28, +0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f, +0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3, +0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, +0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x35,0x3e,0xda, +0xf8,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e,0x7e,0xf3,0x2a,0x6d,0xac,0xf7, +0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x20,0xde,0x7e,0xb3,0x37,0xb7, +0xb4,0x1, 0x64,0x7e,0x73,0x37,0xb8,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c, +0x12,0x26,0x57,0x12,0x28,0x62,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49, +0x33,0xd, 0xc8,0x12,0x21,0x0, 0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14, +0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34, +0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xb8, +0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, +0xd, 0xc8,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0x4, 0xe4,0x2, 0x58,0xe8,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0x12,0x68,0x10,0x12,0x7d,0x94,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0x74,0x12,0xb6,0xe2, +0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x91,0x18,0x12,0x47,0x2c, +0x12,0x28,0x62,0x50,0xde,0x12,0xab,0xdb,0x12,0x75,0xe9,0x7e,0xb3,0x37,0x5, 0xb4, +0x1, 0x4, 0xe4,0x12,0x58,0xe8,0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x5e,0xaa,0x40, +0xc2,0x12,0x88,0x5f,0x12,0x5e,0xaa,0x40,0xba,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x0, 0x6e,0x12,0x5f,0x2f,0x12,0x5f,0x83,0x12,0x5b,0x94,0x12,0x96,0x24,0x12,0x5e, +0xc2,0x12,0x5f,0xcd,0x12,0xaa,0xe6,0x12,0x87,0x74,0x7e,0xb3,0x36,0xf1,0xbe,0xb0, +0x88,0x68,0x3, 0x12,0x59,0x77,0x12,0x67,0xfa,0x12,0x26,0x66,0x12,0x62,0xa5,0x80, +0x82,0x12,0x2f,0xee,0x2, 0x58,0xdc,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x12,0x35, +0xd3,0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, +0x7e,0xb3,0x2a,0x7, 0x70,0x8, 0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0x61,0x6b,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x28,0x80,0x4, 0x7e,0x68,0x32,0xea,0x7f,0x6, 0x12,0x7e,0xef, +0x7e,0x73,0x2a,0x4, 0x7a,0x6b,0x70,0x6c,0xdd,0x61,0x1c,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x5e,0x3d,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x61,0x1a,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x61,0x1a,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x9e,0xec,0x50,0x2, 0x61,0x1a,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3, +0x2a,0x9, 0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xd6,0x6d,0x22,0x74,0x1, 0x12,0x7f,0xd4,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xe0,0x6d,0x22,0x74,0x10,0x12,0x7f,0xd4,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xd6,0xf5,0x25,0x9, 0xb3,0x32,0xe0,0xf5,0x26,0xa, 0x3c,0x12,0x5e, +0x3d,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xd6,0x19,0xb3,0x32,0xe0,0x12, +0x35,0xd3,0x7e,0xb3,0x2a,0x64,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd, +0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac, +0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x2c,0x75,0x27, +0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x6a,0x54,0xf, +0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x66,0x49,0xa3,0x33,0x68,0x80,0xc, 0x5, 0x27, +0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, 0xff,0x5e,0xa4, +0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5, +0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0, +0xe5,0x28,0xa, 0x5b,0x12,0xb9,0x5c,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e, +0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13, +0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26, +0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x4d, +0xbc,0x7d,0x28,0x2, 0x21,0xbb,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x31, +0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38, +0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0xa, 0xb2,0xe, 0x12,0x7e,0x81,0x74,0x1, 0x12,0x58, +0xe8,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x5e,0x61,0xe4,0x7a,0xb3,0x2a, +0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, 0xe4,0x12,0x58,0xe8,0x12, +0x5f,0xc2,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x66,0x12,0x20,0xb9,0x1b, +0xfd,0x4c,0xff,0x78,0xc, 0x12,0x73,0xe5,0x7e,0x8, 0x33,0x66,0x74,0xff,0x12,0x20, +0xde,0xda,0x3b,0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70, +0xff,0x12,0x5e,0x8b,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f, +0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe2,0x7e,0x73,0x2a,0x2, +0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x2, 0xa1,0xab,0x6c,0xaa,0x80,0x10, +0x7e,0x44,0x7f,0xff,0x12,0x5e,0x95,0x79,0x40,0x0, 0x14,0x12,0x5e,0x45,0xb, 0xa0, +0x12,0x5e,0x25,0x38,0xeb,0xa1,0xab,0x7e,0xb3,0x34,0x4f,0x70,0x3d,0xbe,0x70,0x0, +0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12, +0x5e,0x95,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30, +0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0, +0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xce,0xa1,0xab,0x6c,0xaa,0x80,0x17,0x12,0x5e, +0x57,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe4,0x6c,0xaa,0x80,0x41,0x6c,0xff, +0x80,0x36,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe, +0x34,0x7f,0xff,0x68,0x21,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x18,0x12,0x5e, +0x35,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x5e,0x4e, +0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xc5,0xb, 0xa0,0x7e, +0xb3,0x34,0x4f,0xbc,0xba,0x38,0xb7,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x9, 0xb3,0x1f, +0x46,0xb4,0xff,0x1d,0x6c,0xff,0x80,0x14,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x9, 0x12,0x5e,0x4e,0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38, +0xe7,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xd3,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac, +0x7a,0x49,0x43,0x28,0xae,0x12,0x5e,0x35,0x59,0x42,0x15,0x76,0x49,0x33,0x28,0xb0, +0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xde,0x7e,0x34, +0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e,0x7e,0x73, +0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80, +0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0x12,0x5e,0x2d,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x5e,0x8b,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x5e,0x45,0xb, 0xa0,0x7e,0x63,0x2a,0x2, 0xbc,0x6a, +0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68, +0x13,0x12,0x5e,0x57,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c, +0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x7e,0xf3,0x2a,0x2, 0x7a, +0xf3,0x34,0x4f,0x6c,0xaa,0x80,0x66,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2b, +0x12,0x5e,0x9f,0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0xa, 0x3a,0x2d,0x3d, +0x7d,0x2c,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x2e, +0xa5,0xbb,0x0, 0x2a,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x23,0x12,0x5e,0x9f,0xbe,0xb0, +0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30, +0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0xa, 0x3a, +0x2d,0x3d,0x7d,0x2c,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0x12,0x5e,0x25, +0x38,0x95,0xda,0xf8,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0x90,0x60,0x99, +0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0xb0,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40,0x0, 0x28,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x22,0x6c,0xaa,0x80,0x20,0x74,0x3, 0x12,0xa9,0x99,0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0xa, 0x12,0x5e,0x57,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79, +0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x22,0x7e,0x50,0x9, 0xac,0x5a, +0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, +0x3a,0x2d,0x3d,0x7d,0x2c,0x29,0xb1,0x0, 0xa, 0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91, +0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x9b,0xdf,0x28,0x2, 0xd2,0x3, 0xa2, +0x3, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x3, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x5f,0xc2,0xca,0x59,0x7e,0x18,0x28, +0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xb9,0x1b,0xfd,0x90,0x61,0x35,0xe4,0x93,0xbe, +0xb0,0x0, 0x28,0x28,0x6c,0xff,0x80,0x1f,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae, +0x12,0x80,0x16,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12, +0x64,0xdb,0x12,0xab,0x9b,0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xdc,0xda,0xf8,0x22,0x2, +0x5f,0x32,0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe, +0x12,0x37,0x6f,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x23,0x7e,0xc4, +0x0, 0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0xb, +0xf0,0xb, 0xe0,0x12,0x9c,0xf6,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, +0xda,0x79,0x22,0x12,0x9d,0xda,0x2, 0x5f,0x89,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, +0x38,0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x35,0x40, +0x28,0x14,0x7e,0xb3,0x35,0x40,0x4, 0x7a,0xb3,0x35,0x40,0x7a,0xa3,0x2a,0x2, 0x80, +0x5, 0xe4,0x7a,0xb3,0x35,0x40,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a, +0xb, 0x22,0x90,0x60,0x99,0xe4,0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x12,0x68,0x38, +0x2, 0x5f,0xd3,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x34,0xa2,0x4c,0xaa,0x78, +0x3, 0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x34,0xad,0x7e, +0x73,0x34,0xae,0xbe,0x73,0x34,0xad,0x28,0x4, 0x7a,0x73,0x34,0xad,0x22,0xff,0xff, +0x70,0x8f,0x0, 0xff,0x53,0xac,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x45,0x37,0x32,0x1, 0xc3,0x1, 0x45,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x18,0xe7,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0x18,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, +0x2, 0x1, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x37,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x0, 0x4, 0x5a,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x65,0x40,0xd, 0x18,0x25,0x19,0x28,0x6, 0x80,0x19,0x28,0x6, +0x80,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x32,0x32,0x1, 0xec,0x2, 0x50,0x0, +0xe1,0x0, 0xe1,0x5, 0x0, 0x37,0x37,0x1, 0xba,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0x96,0x1, 0x18,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, 0x68,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15,0x0, 0x1, 0x54,0x1, 0x0, 0x18, +0x1, 0x53,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0x10,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x37,0x2, 0x5a,0x65,0x20,0x28,0x2, 0x2c,0x2e,0x20,0x3c, +0x2, 0x5b,0x66,0x20,0x46,0x2, 0x42,0x49,0x30,0x37,0x2, 0x5a,0x65,0x20,0x37,0x2, +0x5a,0x65,0x20,0x37,0x2, 0x5a,0x65,0x20,0x37,0x2, 0x5a,0x65,0x20,0x4, 0x5, 0x28, +0x29,0x2a,0x2b,0x2c,0x4, 0x0, 0xd2,0x2, 0x30,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x0, 0x78,0x0, 0x78,0x14,0x8, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, 0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x8, 0x37,0xf3,0x12,0x62,0xdf,0x7e,0x8, 0x37,0xfb, +0x12,0x62,0xdf,0x12,0x62,0xf4,0x12,0x62,0xfb,0x2, 0x62,0xbc,0x7e,0x37,0x37,0xf3, +0xbe,0x34,0x0, 0x0, 0x28,0x18,0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x50,0xf, 0x7e, +0xb3,0x37,0x31,0x70,0x9, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0x22,0xb, +0xa, 0x30,0xe5,0x4e,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33, +0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x2b,0xb7,0x2, 0x62,0xdf,0x7e,0x8, 0x38,0xe6,0x2, +0x62,0xdf,0x6d,0x33,0x7a,0x37,0x38,0x83,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e, +0xb3,0x2a,0x3, 0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28, +0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68, +0x17,0x7e,0x47,0x2b,0xb7,0x4d,0x44,0x78,0xf, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3, +0x38,0x85,0x7a,0xb3,0x37,0x6, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e, +0x37,0x2b,0xb7,0x7a,0x37,0x2f,0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37, +0x2b,0xb7,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37, +0x2f,0x98,0x7e,0x27,0x2f,0x9a,0x12,0x64,0x1a,0x81,0x13,0x80,0x0, 0x12,0xbd,0xdd, +0x81,0x13,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57, +0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xbd,0x78,0x12,0x64,0x16,0x74, +0x1, 0x7a,0xb3,0x2f,0x80,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88, +0x9e,0x27,0x2f,0x90,0x7e,0x14,0x62,0x8a,0x12,0x64,0xd3,0xbd,0x23,0x38,0x13,0x7e, +0x27,0x2f,0x96,0x9e,0x27,0x2f,0x8e,0x7e,0x14,0x62,0x8c,0x12,0x64,0xd3,0xbd,0x23, +0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a, +0xc7,0x2f,0x98,0x7a,0xd7,0x2f,0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d, +0x2d,0x7e,0x17,0x2b,0xbb,0x7e,0x7, 0x2b,0xbd,0x12,0x66,0xce,0xa, 0x2b,0x7e,0x73, +0x2f,0x7f,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0x64,0x16,0x7a,0xc7,0x2b,0xbb,0x7a, +0xd7,0x2b,0xbd,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24, +0x12,0x67,0xca,0x7d,0x31,0x12,0x85,0xfd,0x2, 0x64,0x2b,0x7e,0x3, 0x2f,0xa8,0xbe, +0x0, 0xf0,0x50,0x2, 0x81,0xc4,0x81,0xb9,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0, +0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34, +0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b, +0xc1,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0x66,0xce,0x7c,0x1b,0x7e,0x3, +0x2f,0x7f,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b, +0xbf,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x1f,0x8c,0x7e,0x34,0x1f,0x34,0x7e,0x30, +0x4, 0xac,0x39,0x2e,0x14,0x2b,0xbf,0x74,0x4, 0x12,0x1f,0x8c,0xb, 0x80,0x7e,0x3, +0x2f,0xa8,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8, +0x7e,0x3, 0x2f,0x7f,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec, +0x40,0x2, 0x81,0x38,0x22,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e, +0x14,0x61,0x49,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e, +0x14,0x61,0x43,0x12,0x83,0x62,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22, +0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83, +0x2a,0x70,0x12,0x87,0xd4,0xbe,0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d, +0x2e,0x7e,0x14,0x61,0x47,0x12,0x64,0xd3,0x12,0x66,0x10,0x90,0x61,0x45,0x12,0x66, +0x7, 0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0x12,0xc1,0x3a,0xbe,0xa0,0x0, 0x28, +0x32,0x7d,0x14,0x9e,0x14,0x0, 0x3f,0xbd,0x1e,0x38,0x13,0x12,0x66,0xb8,0x40,0xe, +0x12,0x64,0xc5,0x12,0x65,0xfa,0x48,0x32,0x7f,0x10,0x1b,0x1c,0x80,0x2c,0x12,0x66, +0xb8,0x50,0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x64,0xcb,0x12,0x66,0x10,0x7d, +0x1f,0x80,0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x66,0xb1,0xbd,0x5e,0x38,0x16,0x12,0x64, +0xc5,0x12,0x65,0xfa,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10, +0x6d,0x0, 0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x66,0xb1,0xbd,0x5e,0x28, +0x68,0x7d,0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d, +0x35,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d, +0x22,0x7e,0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1e,0xfc,0x12, +0x66,0x14,0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, +0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x66,0x7, +0x58,0x4, 0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76, +0x7c,0x65,0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x36,0x69,0x7a, +0x73,0x36,0xdf,0x7e,0x27,0x38,0xd6,0x7e,0x14,0x61,0xc8,0x12,0x64,0xd3,0x1e,0x34, +0xbd,0x32,0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x14,0x61,0xc8,0x12,0x64, +0xd3,0xbd,0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x36,0x67,0x12,0x67,0x62,0x7e,0x37,0x36, +0x6f,0xbd,0x32,0x50,0x4, 0x7a,0x27,0x36,0x6f,0x12,0xc1,0x12,0x38,0xa, 0x12,0x8f, +0xf3,0x38,0x5, 0x12,0x8f,0xeb,0x28,0x3d,0x12,0x67,0x69,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x36,0x67,0x4, 0x7a, +0xb3,0x36,0x67,0x7e,0x73,0x36,0x67,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3, +0x36,0x67,0x12,0xc0,0x95,0x7a,0xb3,0x36,0xdc,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x67, +0x7d,0x32,0x2, 0xad,0xac,0x2, 0x66,0xa8,0x12,0x67,0xc0,0xe4,0x7a,0xb3,0x36,0x75, +0x22,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4, +0x60,0xd1,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0xbd,0x1e,0x22,0x7d,0x51, +0x7d,0x12,0x9d,0x35,0x12,0x21,0x0, 0x7c,0xa7,0x12,0x67,0xeb,0x7c,0xb7,0xbc,0xba, +0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x67,0x15,0x50, +0x21,0x7e,0x54,0x62,0x5a,0x12,0x67,0x15,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x64, +0xd3,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x5e,0x12,0x64,0xd3,0xbd,0x32,0x28,0x2, +0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12, +0x66,0x1b,0x2, 0x67,0x25,0x7e,0xb3,0x36,0x69,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36, +0x71,0x7e,0xb3,0x36,0xdf,0x70,0x3, 0x12,0xaf,0x2f,0x7e,0xb3,0x36,0x71,0xb4,0x1, +0xc, 0x74,0x3, 0x12,0x67,0x59,0x12,0x23,0x9e,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x67, +0x59,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x34,0xae,0x7e,0x34,0x61, +0x5b,0x22,0x74,0x2, 0x7a,0xb3,0x36,0x69,0x22,0x7e,0xb3,0x36,0x75,0xb4,0x1, 0x3, +0x2, 0x67,0x62,0x7e,0xb3,0x36,0xdb,0x4, 0x7a,0xb3,0x36,0xdb,0x7e,0xb3,0x36,0x69, +0xb4,0x2, 0x18,0x7e,0xb3,0x36,0xda,0x4, 0x7a,0xb3,0x36,0xda,0xb4,0x1, 0x6, 0x74, +0x1, 0x7a,0xb3,0x36,0xdb,0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x73,0x36,0xda,0xbe, +0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x75,0x12,0x67,0x62,0x12,0xaf,0x2f, +0x12,0x67,0xc0,0x7e,0x73,0x36,0xdb,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x67,0xc0,0x22, +0xe4,0x7a,0xb3,0x36,0xdb,0x7a,0xb3,0x36,0xda,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0, +0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xbf,0x12,0x67,0xf2,0x59,0x25,0x2b, +0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a,0xb3,0x2f,0xa8,0x22,0x7d,0x31,0x9d,0x30,0x2, +0x21,0x0, 0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x73,0x28,0x93,0x7a,0x73, +0x28,0x94,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22, +0x12,0xc0,0x25,0x12,0x63,0x2, 0x7a,0x37,0x39,0x4, 0x12,0x69,0x87,0x12,0x28,0x48, +0x2, 0x68,0x23,0x12,0x69,0x84,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3, +0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca,0x79,0x7e,0x13,0x2a,0x2, 0x7e,0x78, +0x29,0xbc,0x12,0x69,0x84,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0x19, +0x7e,0xa0,0x5, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12, +0x68,0x23,0x21,0x6d,0xbc,0x20,0x50,0x3, 0x12,0x68,0x23,0x6c,0x0, 0x21,0x62,0x7e, +0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x21,0x60,0xa, +0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x21,0x43,0x12, +0x69,0x7a,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x21,0x0, 0x7d,0xd3,0x7e,0x70,0x4, +0xac,0x79,0x49,0x23,0x35,0x43,0x12,0x69,0x70,0x9d,0x32,0x12,0x21,0x0, 0x7d,0xc3, +0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x69, +0x7a,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x43,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28, +0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, 0x7a,0xb3,0x34,0x89, +0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3, +0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80,0x53,0x7e,0x50,0x9, +0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x35,0x41,0x49, +0x22,0x29,0xa, 0x59,0x27,0x35,0x43,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x34,0x88,0x80, +0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34, +0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, +0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x41,0x12,0x69,0x70,0x59,0x32,0x35,0x43, +0xb, 0x0, 0x90,0x60,0x99,0xe4,0x93,0xbc,0xb0,0x28,0x2, 0x1, 0x6f,0xda,0x79,0x22, +0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x41,0x22,0xa2,0x8, 0x22,0x7e,0x34,0xd, 0xac,0x12,0x26,0x5b,0x12,0x7a, +0x2d,0x12,0x69,0xab,0x2, 0x69,0x97,0x30,0xf, 0x10,0x12,0x6e,0x8f,0x50,0x3, 0x12, +0x6f,0x6e,0x12,0x6a,0x50,0x12,0x69,0xd1,0xc2,0xf, 0x22,0x7e,0xb3,0x2b,0x1e,0x70, +0x1f,0x12,0x26,0x57,0x12,0x2f,0xf4,0x50,0xfb,0x12,0x6a,0x50,0x12,0x88,0x17,0x20, +0xf, 0x3, 0x12,0x69,0xd1,0x74,0x2, 0x7a,0xb3,0x2b,0x1e,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12, +0x87,0x56,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0xc0,0xcc,0xf5,0x2a, +0x7e,0x73,0x2b,0xf, 0xbe,0x71,0x2a,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x91,0x67,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x44,0x6d,0x22,0x7a,0x1f,0x37,0x40,0x7c,0xbc,0x12,0x6c,0x20,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x62,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x6d,0x13,0xda,0x3b,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12, +0xc0,0x1b,0x7a,0x55,0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d, +0x7f,0x3, 0x7e,0x1d,0x2a,0x12,0x79,0x7a,0x12,0xc0,0x9f,0x12,0xc0,0x42,0x75,0x2e, +0x0, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0xc1,0x22,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6a,0xd4,0x12,0xb3,0x89,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x30,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12, +0x7b,0x20,0x7e,0x35,0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30, +0x38,0xdc,0x5, 0x2e,0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b, +0x1d,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x6d,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d, +0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x6e,0x8f,0x50,0x7c,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x6e,0x12,0x6b,0xff,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x8, 0x12,0x6d,0x34,0x38,0xea,0x6c,0xcc,0x80,0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a, +0x12,0x6b,0xff,0x75,0x3b,0x0, 0x80,0x27,0x7e,0xb3,0x37,0xb1,0xbe,0xb1,0x3b,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x60,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x62,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e, +0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34,0x10, +0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x50,0x12, +0x6c,0x8, 0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70, +0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a, +0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, +0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x7f,0x78,0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe, +0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x6b,0xf6,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d, +0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80, +0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x35,0x7a,0x37,0x25,0xba,0x7e,0x35, +0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12, +0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25, +0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac, +0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37, +0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22, +0xca,0x3b,0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b, +0xf, 0xf5,0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xb9, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x60,0x7e,0x8, 0x25,0x2a, +0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbc,0x12,0xb3,0x54,0x74,0x1, 0x7a,0xb3,0x2b,0x1d, +0x74,0x5, 0xac,0xbc,0x12,0xc0,0x39,0x74,0x5, 0xac,0xbc,0x12,0x6f,0xff,0x74,0x5, +0xac,0xbc,0x12,0xc0,0x30,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0xc2,0x3, 0x12,0xc0,0xcc,0x12,0x6d, +0x13,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, +0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x6a,0xd4,0x12, +0xc0,0x1b,0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xa8,0xef,0x12, +0xa9,0xc9,0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3, +0x2b,0x14,0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39, +0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, +0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd, +0xda,0x3b,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6e,0x29,0x30,0xc, 0xa, 0x12,0xaf,0x1d, +0x30,0x3, 0x4, 0xe4,0x12,0xa, 0x66,0x30,0x3, 0x9, 0x12,0xae,0xd2,0x12,0x8d,0xef, +0x2, 0x8c,0x90,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f, +0x50,0x7e,0x14,0x22,0xe2,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x7a,0x1d,0x2c,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f, +0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c,0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x34,0x6c, +0xcc,0x80,0x4f,0x12,0x6e,0x19,0x40,0x48,0x12,0x6e,0xf, 0x50,0x43,0x74,0x2, 0xac, +0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x0, 0x7d,0x3, 0x7d, +0x31,0x12,0x21,0x0, 0xbd,0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e, +0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d, +0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34, +0xb, 0xc0,0x12,0x6d,0x34,0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12, +0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, +0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12, +0x6e,0x19,0x40,0x8, 0x12,0x6e,0xf, 0x50,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x12,0x6d, +0x34,0x38,0xec,0xb, 0xd0,0xbe,0xd0,0x3, 0x50,0x2, 0xa1,0x68,0xda,0x3b,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xb9,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x12,0x6e,0xa0,0x7a,0x37,0x2b,0x1b, +0x22,0x7e,0xa3,0x0, 0x4f,0xbe,0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xec,0x68,0x42, +0x74,0x5, 0xa4,0x12,0xc0,0xc3,0x12,0x6e,0x83,0x12,0xc0,0x39,0x12,0x6e,0x83,0x12, +0xc0,0x30,0x12,0x6e,0x8f,0x50,0x9, 0x7e,0xb3,0x0, 0x4f,0x12,0xb3,0x54,0x80,0x6, +0x12,0x6e,0x83,0x12,0x6f,0xff,0x12,0x6e,0x29,0x12,0x6f,0xf8,0x7e,0x73,0x2b,0x14, +0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x4f,0x7a,0x73, +0x3, 0xec,0x22,0x7e,0xa3,0x0, 0x4f,0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x20,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xb2,0x70,0x2, 0xc3,0x22,0xd3,0x22, +0x7e,0x23,0x2b,0xf, 0x7e,0x33,0x37,0xcd,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x0, 0xac,0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, +0xa, 0x7e,0x63,0x2b,0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe, +0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61, +0x1b,0xe4,0x93,0x7c,0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73, +0x2b,0x10,0x80,0x9, 0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b, +0x10,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c, +0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x38,0xc0,0x69,0x51,0x0, +0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d, +0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, +0x1f,0x58,0x7e,0xb, 0x70,0x7a,0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b, +0x62,0x29,0x70,0x0, 0x1, 0x7a,0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b, +0x20,0x12,0x6e,0x29,0x12,0x6f,0xf8,0xd2,0x3, 0xc2,0x4, 0x2, 0x48,0xf4,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x4f,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6f,0xea,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0xc0,0x76,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0xc0, +0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6f,0xea,0xca,0x39,0x7e, +0x23,0x0, 0x4f,0x7e,0x30,0x38,0xac,0x23,0x12,0xc0,0x76,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x8c,0xac,0x23,0x12, +0xc0,0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6f,0x42,0x7e,0x34,0x0, 0x38,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x3, 0x8b,0x9, +0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0x7e,0x37,0x3, 0xed,0xb, 0x34,0x7a,0x37, +0x3, 0xed,0x7e,0x37,0x3, 0xef,0xbe,0x37,0x3, 0xed,0x28,0x3, 0x2, 0x70,0x23,0x22, +0x2, 0x70,0x8, 0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x70,0x20,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b, +0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e, +0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a,0xb3,0x2b,0x74,0x7a,0xb3,0x2b, +0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x25,0xee,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2, +0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93, +0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74,0xbc,0x7e,0x28, +0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3,0x2a,0x6e,0x7a, +0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3,0x2a,0x74,0x90, +0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9,0xe4,0x93,0xa, +0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a,0xa, 0x3e,0x9d, +0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a,0x78,0x90,0x60, +0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f,0xca,0x39, +0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12,0x20,0xb9,0x1b, +0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x2b,0x21,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x72,0x92,0x12,0x79,0x31,0x90,0x60, +0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76,0x12,0x70,0x59, +0x74,0x1, 0x12,0x3d,0xac,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x2, 0x12,0x73, +0xf1,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a,0xb3,0x2b,0x4, +0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0x9e,0x7a,0x37,0x2b, +0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x9, 0x7e, +0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a,0xb3,0x2b,0x62, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4,0x93,0x7a,0xb3, +0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x2b, +0xf, 0x12,0x6e,0x29,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61, +0x22,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12, +0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3, +0x2b,0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61, +0x20,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b, +0x14,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d, +0x7a,0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64, +0xe4,0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61, +0x7e,0x34,0x20,0x5b,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x12,0xc0,0xd5,0x12,0x72,0xf4,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x72,0xdb,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x72,0xdb,0xa, +0x1b,0x2e,0x14,0x2a,0x7c,0x12,0x72,0xe8,0xe5,0x25,0x12,0x72,0xdf,0xa, 0x1b,0x2e, +0x14,0x2b,0x23,0x12,0x72,0xe8,0xe5,0x24,0x2, 0x20,0xde,0x7e,0x34,0x0, 0x2, 0x12, +0x20,0xde,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, +0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a, +0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x73,0x20,0x38,0xef,0x12,0x73,0x20,0x68,0x7, +0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22, +0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x12,0x77,0xfd,0x12,0x70,0xa7,0x12,0x0, +0xa, 0x12,0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8, +0x7e,0x1f,0x6, 0xf4,0x12,0x79,0x9d,0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e, +0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12, +0x79,0x7a,0x12,0x79,0x2e,0x12,0x25,0x45,0x12,0x73,0xa7,0x12,0x73,0x7f,0x2, 0x73, +0x71,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x12, +0x73,0xe5,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, 0x28,0xae,0x74,0xff,0x12,0x20, +0xde,0x12,0x9f,0xe3,0x7e,0x8, 0x29,0xbc,0x12,0x5e,0x61,0x7e,0x8, 0x2a,0x2, 0x7e, +0x34,0x0, 0xb, 0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4, +0x12,0x20,0xde,0x90,0x60,0x9c,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74, +0xff,0x12,0x20,0xde,0x90,0x60,0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26, +0xb4,0x74,0xff,0x12,0x20,0xde,0x90,0x60,0x9a,0x12,0x73,0xe8,0x7e,0x8, 0x27,0x76, +0x74,0xff,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78, +0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc, +0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, +0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80, +0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73, +0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d, +0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a, +0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26, +0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x75,0xb2, +0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d, +0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53, +0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x75,0x9f,0xb, +0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80, +0x19,0x12,0x75,0xa8,0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58, +0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3, +0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x75,0x97,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12, +0x75,0xb2,0xb, 0x6a,0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d, +0x2d,0x7e,0x67,0x2a,0x51,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, +0x90,0x12,0x75,0x9f,0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, +0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x75,0xa8,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c, +0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12, +0x74,0x3c,0x38,0xab,0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, +0x12,0x75,0x97,0x2d,0x15,0x6c,0xaa,0x80,0xe, 0x12,0xa5,0xe4,0xb, 0x7a,0x90,0xbd, +0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xed,0x7a,0xb7,0x8, 0x4, +0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32, +0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e, +0x74,0x62,0x10,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d, +0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31, +0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0xa6, +0x56,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x75,0x97,0x7e,0xd, 0x24,0x2d,0x15,0x7f, +0x13,0x2d,0x35,0x12,0x6d,0x3b,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a, +0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x75,0xbc,0x7e,0x37,0x28, +0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x75, +0xbc,0x12,0x76,0x2b,0x12,0xa7,0x45,0x2, 0x76,0x1a,0xe4,0x7a,0xb3,0x3, 0xff,0x7e, +0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x3, 0xff,0x22,0xca,0x3b,0x7e,0xf3,0x2a, +0x6e,0x12,0xc0,0xde,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, +0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0xa7,0xcd,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda, +0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0xbb,0xb5,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, +0xf8,0x12,0x3f,0xf2,0x12,0x76,0x9a,0x12,0x74,0x43,0x7e,0xb3,0x16,0x90,0xb4,0x1, +0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26, +0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x20, +0xde,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26, +0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0xc0,0xb, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0xbf,0xe7, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x86,0x12,0xc0, +0x60,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x89,0x12,0xc0, +0x60,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3, +0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0xc0,0xb, 0x7e,0x50,0x1, 0x12,0x77,0x60,0x7a, +0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0xbf,0xe7,0x7e,0x50,0x1, 0x12,0x77,0x60, +0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22, +0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0, +0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4, +0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0, +0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, +0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c, +0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b, +0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f, +0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0xe4,0x7a,0xb3, +0x37,0x9c,0x7a,0xb3,0x37,0x9d,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0x9e,0x90,0x60, +0x51,0xe4,0x93,0x7a,0xb3,0x37,0x9f,0xe4,0x7a,0xb3,0x37,0xa0,0x90,0x60,0x99,0x93, +0x7a,0xb3,0x37,0xa1,0xe4,0x7a,0xb3,0x37,0xa2,0x7a,0xb3,0x37,0xa3,0x90,0x61,0xc4, +0x93,0x7a,0xb3,0x37,0xa5,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34, +0x7a,0x73,0x37,0xa9,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a, +0x73,0x37,0xaa,0x74,0x64,0x7a,0xb3,0x37,0xbb,0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3, +0x37,0xbc,0x90,0x61,0x17,0xe4,0x93,0x7a,0xb3,0x37,0xa8,0x90,0x61,0x19,0xe4,0x93, +0x7a,0xb3,0x37,0xbe,0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x37,0xbd,0x90,0x61,0x1d, +0xe4,0x93,0x7a,0xb3,0x37,0xbf,0x90,0x61,0x25,0xe4,0x93,0x7a,0xb3,0x37,0xba,0xe4, +0x7a,0xb3,0x37,0xb5,0x74,0xfa,0x7a,0xb3,0x37,0xb3,0x74,0x1e,0x7a,0xb3,0x37,0xb4, +0x74,0x1, 0x7a,0xb3,0x37,0xb2,0x74,0xd, 0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3, +0x37,0xb6,0xe4,0x7a,0xb3,0x37,0xb7,0x7a,0xb3,0x37,0xb8,0x7e,0x8, 0x37,0xc0,0x7e, +0x34,0x0, 0x2c,0x12,0x20,0xde,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0xa, 0x36,0x7a, +0x73,0x37,0xcb,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0x7a,0x73,0x37,0xcc,0x90,0x60, +0xd4,0x93,0x7a,0xb3,0x37,0xcd,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x37,0xce,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b, +0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xe9,0x74,0x1, 0x7a,0xb3,0x37,0xe0,0x7e,0x34,0x0, +0x28,0xca,0x39,0x7e,0x34,0x61,0xd5,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12, +0x20,0xb9,0x1b,0xfd,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0x2, 0x23, +0xa6,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x6d, +0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x20, +0xde,0x7f,0x6, 0x7d,0x3f,0x12,0x20,0xde,0x7a,0xb3,0x16,0x91,0x22,0x7f,0x70,0x7e, +0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c, +0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x20,0xde,0x7f,0x7, 0xa, +0x3a,0x2, 0x20,0xde,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15, +0x12,0x79,0x9d,0x12,0x3f,0xd2,0x7e,0xe0,0x1, 0x12,0x4f,0xaf,0x30,0x18,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x7b,0x29,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac, +0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15, +0x12,0x7b,0x20,0xb, 0xd0,0x7e,0x73,0x2a,0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, +0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c, +0xbf,0x2e,0x73,0x2a,0x73,0x12,0x7a,0x8e,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b, +0x2, 0x70,0x41,0x12,0x2f,0xf4,0x50,0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x7a,0x75, +0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x72,0x12,0x79,0xc4,0x74, +0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x7a,0x75,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f, +0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x79,0xc4,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4, +0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x3d,0xac,0x7c,0xba,0x12,0x13, +0xc7,0x74,0xa, 0x12,0x45,0x15,0x7c,0xb9,0x12,0x0, 0x1e,0x2, 0x4e,0xe7,0xca,0xd8, +0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0x7b,0xd0,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74, +0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11, +0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x1f,0x7, 0x1b,0x6a,0x30,0xb, 0xd0,0xbc, +0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3, +0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73,0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c, +0x7f,0x12,0x7a,0x8e,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12, +0x20,0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, 0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, +0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22, +0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, +0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x29,0x6f,0x7c,0xe7,0x80,0x5d,0x12,0x26,0x57, +0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x12,0x7b,0x29,0x6c,0xdd,0x80,0x3d, +0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, +0x1d,0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19, +0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x3f,0xb, 0xbe,0xb0, +0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x7b,0xb7, +0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa, +0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53,0x2a, +0x73,0xa, 0x25,0x2d,0x23,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22, +0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa, +0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38, +0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, +0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e, +0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x37,0xed,0x40,0x39,0x7e,0x37,0x37,0xed,0xb, 0x34,0x7a,0x37, +0x37,0xed,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x34,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x38,0xfb,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x70,0x5, 0x7e,0xb3,0x37,0x9c,0x22,0xbe,0xb0,0x3, 0x38,0x15, +0x75,0x1b,0x0, 0x30,0xe, 0x6, 0x7e,0x18,0x32,0xea,0x80,0x4, 0x7e,0x18,0x33,0x28, +0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e, +0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4, +0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xed,0x80,0x2, 0x15,0x1a,0x2, +0x7c,0x17,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x7d,0x61,0xbe,0xb0,0x80, +0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x61,0x22,0xb4,0xfc, +0x5, 0x7e,0xb3,0x37,0x8, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60, +0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x36,0x71,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22, +0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74,0xff,0x22,0x7c,0x7b,0x6c,0xaa,0x12, +0x3f,0xe1,0x78,0x9, 0x7c,0xb7,0x12,0x7c,0x64,0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, +0x7c,0xb7,0x12,0x37,0xeb,0x7c,0xab,0x7c,0xba,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5, +0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5, +0x1a,0x12,0x3f,0xb3,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12, +0x7c,0xfb,0xf5,0x91,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0, +0x82,0x12,0x7d,0x1a,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b, +0x32,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x37,0xf2,0x7e,0x73,0x37,0xf2,0xa, 0x27,0x2e, +0x24,0x0, 0x6, 0x12,0x51,0x4f,0x93,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x37,0xf2, +0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x37,0xf2,0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0x9b,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0x9b,0x7a, +0xa3,0x36,0xf2,0x22,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37,0x9c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, +0xe4,0x7a,0xb3,0x37,0x9c,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba, +0x12,0x7d,0xab,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3, +0x7c,0x7a,0x12,0x7e,0x45,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xdf,0x38, +0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x7e,0x21,0xa5,0xbb,0x8f,0x3, 0x75,0x19, +0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x44,0xc0,0x74,0x1, 0x7a,0xb3,0x33,0xff, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68,0x17,0x1b,0x61,0x68, +0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x36,0xe1,0xd2,0xd, 0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37, +0xef,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37, +0xef,0x15,0x1a,0x7e,0x27,0x37,0xef,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, +0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a,0xea, +0x22,0x7e,0xb3,0x37,0xf1,0x4, 0x7a,0xb3,0x37,0xf1,0xe5,0x19,0xb4,0x1, 0x8, 0xe4, +0x7a,0xb3,0x37,0xf1,0x75,0x19,0x0, 0x7e,0x73,0x37,0xf1,0x7a,0x73,0x36,0xf0,0x22, +0xe4,0x7a,0xb3,0x37,0x9c,0x7e,0x8, 0x32,0xea,0x12,0x7e,0xef,0x7e,0x8, 0x33,0x28, +0x7e,0x34,0x0, 0x3e,0x12,0x20,0xde,0x7e,0x18,0x32,0xea,0x7a,0x1d,0x14,0x12,0x7e, +0xd1,0x2, 0x7e,0xc4,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0x9c,0xf5,0x91, +0x22,0x2, 0x7e,0xd4,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e, +0x34,0x0, 0x3e,0x74,0xff,0x2, 0x20,0xde,0x7c,0xab,0x12,0x3f,0x52,0x7c,0xba,0x12, +0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x7f,0x67,0x49,0x35,0x34,0x3b,0x49,0x15, +0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40,0x15,0xbe, +0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12,0x7f,0x6f, +0x28,0xe, 0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, 0x80,0x2, +0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c, +0x7c,0xb9,0x12,0x31,0x27,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, +0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88,0x7f,0x10, +0x7f,0x4, 0x12,0x1e,0xeb,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x75, +0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b,0x2a,0x0, +0x1b,0x1a,0x10,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e, +0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12, +0x21,0x0, 0xe5,0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0, +0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e, +0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12,0x87,0xbc,0x90, +0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, +0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x87,0xd4,0xbe,0xc4, +0x0, 0x3f,0x38,0x1c,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61,0x3b,0x12,0x81, +0x2, 0x12,0x80,0xf1,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xee, +0x12,0x66,0xb1,0xbd,0x5c,0x38,0x21,0x7d,0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12, +0x81,0x2, 0x90,0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b, +0x7c,0x12,0x80,0xf9,0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b, +0x1b,0x54,0xbd,0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f, +0x80,0xa, 0x7d,0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x87,0xcc,0x7f, +0x17,0x12,0x1e,0xfc,0x7f,0x71,0x12,0x81,0x1c,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40, +0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d, +0x22,0x2f,0x71,0x12,0x80,0xf1,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, +0x90,0x61,0x3a,0xe4,0x93,0x12,0x80,0xf9,0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f, +0x22,0x90,0x61,0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d, +0x22,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d, +0x2e,0x7c,0x76,0x7c,0x65,0x7f,0x71,0x22,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65, +0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12, +0x9f,0x40,0x7d,0x3, 0x74,0x9, 0xac,0xbf,0x12,0x87,0xe5,0x49,0x35,0x28,0xae,0x12, +0x81,0xbf,0x12,0x81,0x18,0x7d,0x13,0x5e,0x30,0xfc,0x7e,0x70,0x9, 0xac,0x7f,0x49, +0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d, +0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34, +0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x12,0x81,0xb3,0x12,0x81, +0x18,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, +0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30, +0xda,0x79,0x22,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d, +0x32,0x12,0x21,0x0, 0x7d,0x13,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b,0x74, +0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3,0x49, +0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x81,0xbf,0x7d,0x3f,0x9d,0x35,0x12,0x21, +0x0, 0x9d,0x34,0x12,0x21,0x0, 0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0xf, 0x12,0x67,0xeb,0x7e,0x14,0x62,0x6a,0x12,0x87,0xee,0x50, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7, +0x2f,0x9e,0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7, +0x2f,0x9a,0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x81,0xc7, +0x70,0x2, 0x61,0x45,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70, +0x9, 0x7e,0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45, +0x7e,0x73,0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f, +0xa4,0x7e,0x17,0x2f,0xa6,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45,0x7e,0x34,0x62,0x72, +0x12,0x83,0x4a,0x28,0x4a,0x7e,0x34,0x62,0x70,0x12,0x83,0x54,0x50,0x41,0x7e,0xb3, +0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0x9e,0x12,0x83,0x5e,0x7d,0x8f, +0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0x87,0xc4,0x9d, +0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40,0x2, 0x61, +0x45,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7b,0x7e,0xf0,0x21,0x80,0x76,0x7e, +0x34,0x62,0x7a,0x12,0x83,0x54,0x28,0x6d,0x7e,0x34,0x62,0x78,0x12,0x83,0x4a,0x50, +0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62,0x7e,0x12,0x23,0x9e,0x12,0x83, +0x5e,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50,0x4a,0x7e,0x34,0x62,0x7c,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7,0x2f,0x82,0x28,0x37,0x7d,0xfb, +0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x26,0x12, +0x67,0xf2,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd,0x49,0x25,0x2b,0xab,0x49,0x5, +0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, 0x9d,0x32,0xbe,0x34,0x0, 0x10, +0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xf0,0xbd,0xfc,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xbd,0xfb,0x22,0x7e,0x14, +0x62,0x8e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22,0x12,0x86,0x69,0x7a,0x37,0x2f, +0x9c,0x12,0x85,0xf4,0x7a,0x37,0x2f,0x9e,0x12,0x82,0x16,0x60,0x1, 0x22,0x7e,0x73, +0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f,0x80,0x2, +0x83,0x92,0xca,0xf8,0x7e,0x45,0x24,0x7c,0xb9,0x7a,0xb3,0x38,0x3f,0x74,0xff,0x7a, +0xb3,0x38,0x3e,0x6d,0x55,0x80,0x19,0x7d,0xf5,0x3e,0xf4,0x12,0x86,0x74,0x7d,0xe5, +0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54, +0xbd,0x45,0x38,0xe3,0x7e,0x33,0x38,0x3f,0xbe,0x30,0x4, 0x38,0x2, 0x81,0x54,0x69, +0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e, +0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x40,0x7a,0xb3, +0x38,0x42,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f, +0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x38,0x42,0x7d,0xf, 0x2d,0xf, 0xbd, +0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x38,0x42,0xa, 0x37,0x6d,0x22,0x12, +0x1e,0xeb,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7a,0x73,0x38,0x42,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x84,0x73,0x12, +0xbf,0x3c,0x12,0x84,0x73,0x12,0x84,0x7c,0x12,0x84,0x73,0x12,0xa5,0x28,0x80,0xa, +0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x38,0x3e,0xe4,0x7a,0xb3,0x38,0x3f,0x7e, +0x73,0x39,0x1, 0xbe,0x73,0x38,0x3e,0x48,0x6, 0x7e,0xb3,0x38,0x40,0x80,0x1, 0xe4, +0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71, +0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a, +0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0xa1,0x9d,0x7e,0x90,0x2, 0xac,0x9a, +0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x26,0x7f,0x67,0x2d, +0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f, +0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a, +0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe, +0xf0,0x2, 0x58,0x2, 0xa1,0x9b,0xbe,0x60,0x0, 0x18,0x2, 0xa1,0x83,0xbe,0x70,0xec, +0x28,0x2, 0xa1,0xa7,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7, +0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x85,0xeb,0x19,0xba,0x22, +0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x85,0xeb,0x19,0xba,0x23,0xe4,0x9, 0xba, +0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7, +0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0x85, +0xeb,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12,0x85,0xe2,0x19,0xbd,0x22,0xf5,0xa, 0xd9, +0x12,0x85,0xe0,0x19,0xbd,0x23,0xe5,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe, +0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12, +0x85,0xe0,0x19,0xbd,0x22,0xf4,0xa, 0xc9,0xa, 0xd4,0x12,0x85,0xe0,0x19,0xbd,0x23, +0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f,0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, +0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23,0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x38, +0x3f,0xbc,0xba,0x28,0x2, 0x81,0x9b,0x7a,0x73,0x38,0x3f,0x7e,0xa0,0x1, 0x80,0x25, +0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d, +0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e, +0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x38,0x3f,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22, +0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c, +0xbd,0xa, 0xa7,0x22,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0x86,0x69,0x7a,0x37,0x2f,0xa0,0x12, +0x85,0xf4,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0x86,0x69,0x7a,0x37,0x2f, +0xa4,0x12,0x85,0xf4,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7c,0xab, +0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4,0x14, +0x78,0xfb,0x12,0x86,0x72,0x2d,0xfe,0x80,0xf, 0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x12,0x86,0x72,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a, +0xbd,0xf4,0x38,0xd0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61, +0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b, +0x7e,0x63,0x2a,0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10, +0x7d,0x21,0x12,0x87,0xdc,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34, +0x37,0x44,0x6d,0x22,0xe4,0x2, 0x86,0x7e,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b, +0x68,0x4f,0x12,0x87,0x56,0x7c,0x3b,0x7c,0xb2,0x12,0x87,0x56,0x7c,0xab,0xbe,0x30, +0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12, +0x91,0x67,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e, +0x34,0x16,0x93,0x6d,0x22,0x30,0x16,0x3, 0x2, 0x86,0xc7,0x7e,0xb3,0x2b,0x1d,0xb4, +0x1, 0xf, 0x12,0xc0,0x1b,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x86, +0x7e,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, +0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40, +0xe9,0x74,0xff,0x22,0x7e,0xb3,0x37,0x31,0x70,0x6, 0x12,0x87,0xad,0x2, 0x87,0xb6, +0x12,0x63,0x9, 0x12,0xbd,0x6d,0x50,0xa, 0x12,0x83,0x6a,0x7c,0x3b,0x12,0x87,0xad, +0x80,0x5, 0x12,0xbe,0x14,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xbc,0xf1, +0x60,0xa, 0x7a,0x33,0x37,0x34,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4,0x7a,0xb3, +0x2f,0x80,0x22,0x2, 0x81,0x23,0xe4,0x7a,0xb3,0x38,0xdd,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x3e,0x24,0x7e,0xf, +0x38,0xd9,0x2d,0x12,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x32,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74,0x6, +0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x5, 0x7d,0x53,0xbe,0x54,0x0, 0xff, +0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x12,0x6e,0x8f,0x50,0x3, 0xd2,0xf, 0x22,0xc2, +0xf, 0x22,0x12,0xac,0xe9,0x12,0x88,0x2b,0x2, 0x88,0x17,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x20,0xde,0x12,0xaa,0x61,0x12,0xaa,0x58,0xa9,0xd1,0xcb, +0x12,0xc1,0x22,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x12, +0x54,0x94,0x12,0x88,0xb9,0x12,0x8c,0xad,0x7e,0xb3,0x37,0x6, 0xb4,0x1, 0x1e,0x7e, +0x34,0x61,0xc0,0x12,0x87,0xcc,0x7e,0x24,0x0, 0x5, 0xad,0x12,0x7a,0x17,0x28,0xa1, +0x7e,0x14,0x61,0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39, +0x11,0x60,0x7, 0x14,0x7a,0xb3,0x39,0x11,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, +0x12,0x88,0x22,0x12,0x8c,0x90,0x12,0xb3,0xd3,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12, +0xbb,0x30,0x12,0xaa,0x6a,0x2, 0x8d,0x10,0x22,0x7e,0x90,0x1, 0x7e,0xb3,0x2f,0xa9, +0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xa9,0x7e,0x34,0x61,0xc0,0x12,0x23, +0x9e,0x12,0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x12,0x8c,0x87,0xb, 0x1a, +0xf0,0x7e,0x34,0x61,0x4f,0x12,0x87,0xbc,0xe4,0x7a,0xb3,0x28,0xac,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x7e,0x34,0xff,0xfa,0xad,0x3f,0x12,0x8f,0xdc,0x7d,0xc3,0xe, 0xc4, +0x7e,0xe7,0x7, 0xfe,0xbd,0xe3,0x58,0x15,0x7e,0xe7,0x7, 0xfc,0xbd,0xec,0x58,0xd, +0x12,0x8a,0x7c,0x8, 0x8, 0x12,0x8b,0xe, 0x60,0x3, 0x12,0x8a,0x95,0x12,0x8b,0xe, +0xa, 0xeb,0x4d,0xee,0x68,0x3b,0x6d,0xee,0x9d,0xef,0xbe,0xe7,0x7, 0xfe,0x18,0x6, +0xbe,0xe7,0x7, 0xfc,0x8, 0x2b,0x12,0x8a,0x7c,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12, +0x21,0x0, 0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x8a,0x74,0x28,0x14,0x7e,0x83,0x28, +0x85,0xbe,0x80,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xcf,0x58,0x3, 0x12,0x8a, +0x95,0x12,0xad,0x28,0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xc1,0x1a,0x68,0x6, +0x7e,0xb3,0x39,0xb, 0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x7d,0x12,0x8a,0x74, +0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0xad,0x66,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x12,0x8a,0xa6,0x7c,0x9b,0x80, +0x1a,0x7e,0xb3,0x26,0x84,0x70,0x14,0x7e,0xb3,0x26,0x85,0x70,0xe, 0x12,0x8a,0x74, +0x28,0x9, 0x7e,0x90,0x3, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0xc7,0x7, 0xfa,0xbe, +0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x8a,0x74,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7, +0x28,0x8e,0x58,0x8, 0x12,0x8a,0x87,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0x29,0x7e,0x14, +0x61,0xc0,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0x7e,0x14,0x61, +0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x12,0x0, 0x66,0x50,0xd, 0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x8f,0xe3,0x28,0x3, 0x12,0x8a,0x87,0x7e,0xc7,0x28,0x8a, +0xbd,0xcd,0x8, 0x19,0x12,0x9b,0xf, 0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28, +0x8e,0x58,0xa, 0x12,0x0, 0x66,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x8b,0x8e, +0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x2, 0x12,0xac,0x90,0x7e,0xb3,0x2f,0xaa,0xbe, +0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xaa,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8c,0x7f,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0x6d,0xee,0x9e,0xe7, +0x2a,0x5a,0xbe,0xe7,0x28,0x8e,0x22,0xe4,0x7a,0xb3,0x2f,0xaa,0x7a,0xb3,0x28,0xac, +0x74,0x2, 0x2, 0x29,0xfa,0x74,0x2, 0x7a,0xb3,0x2f,0xaa,0xe4,0x7a,0xb3,0x2f,0xa9, +0x12,0x8c,0x7f,0x2, 0x29,0xfa,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x8c,0x87, +0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x8b,0x6, +0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e, +0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x4, +0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11, +0x7e,0x34,0xff,0xfd,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0, +0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x1e,0xb9,0xbd,0x34,0x22,0x6c,0x66, +0x90,0x60,0xa7,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28, +0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14, +0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x9d,0x8b,0x50, +0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, +0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e, +0x73,0x2a,0x6d,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0xca,0x3b, +0x12,0xa6,0x4e,0x38,0x2, 0x81,0x55,0x7e,0xc3,0x2f,0xad,0x4c,0xcc,0x78,0x3d,0x7a, +0xb3,0x2f,0xad,0xe4,0x7a,0xb3,0x2f,0xaf,0x6c,0xaa,0x80,0x26,0x12,0x8c,0x60,0x7e, +0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a,0x49,0xd0,0x19, +0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8c,0x6a,0x59,0x34,0x0, 0x2, +0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c,0xfc,0x6c,0xaa, +0x80,0x35,0x12,0x8c,0x60,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, 0xb4,0x0, 0x8, +0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8c,0x6a,0x7d,0x23,0x49,0x34,0x0, 0x2, 0x9d, +0x32,0x12,0x21,0x0, 0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x4c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x2f,0xaf,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x8c, +0x60,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x4c,0x0, 0x12,0x8c,0x71,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x2f,0xaf,0x80,0x6, 0x12,0x8c,0x71,0x75,0x4c,0x0, 0xe5,0x4c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xb0,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x40,0xe4,0x7a,0xb3,0x2f,0xae,0x7a,0xb3,0x2f,0xad,0x7a,0xb3,0x2f,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22, +0x12,0x8c,0xcd,0x6d,0x33,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x5, 0x12,0x8d,0x5e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xf6,0xe4,0x7a,0xb3,0x36,0x72,0x22,0x12,0xb0,0xbe, +0x60,0x1a,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x7e,0x37,0x38, +0xd2,0x12,0x25,0x3c,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x23,0x12,0x8d,0x8, 0x28, +0x26,0xa, 0x4a,0x9, 0x64,0x36,0x76,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x42,0x38,0xcc,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x80,0xb, 0xa0,0x7e, +0xb3,0x36,0x73,0xbc,0xba,0x38,0xd5,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xae,0xc5,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x8d,0x5e,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x84, +0x49,0x12,0x36,0x80,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x84,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x36, +0x84,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x36,0x80,0x59,0x32,0x36,0x84,0x22,0x7e,0xb3,0x36,0x66, +0x60,0x6, 0x14,0x7a,0xb3,0x36,0x66,0x22,0x12,0x8c,0xcd,0x90,0x61,0xc5,0xe4,0x93, +0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x8d,0xef,0x7e,0xb3,0x36,0xec,0x70,0xe, 0x7e,0xb3, +0x39,0x12,0xb4,0x1, 0x7, 0xe4,0x12,0x8d,0xb3,0x12,0xc0,0x95,0x12,0x67,0x1f,0x12, +0x8e,0xa2,0x7e,0xa3,0x36,0xec,0x7a,0xa3,0x39,0x12,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x8d,0xb3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf,0x12,0xc0,0xc3,0x12,0xc0, +0x39,0x12,0x6f,0xff,0x12,0xc0,0x30,0x7a,0xf3,0x0, 0x4f,0x7c,0xbf,0x12,0xb3,0x54, +0x12,0x6e,0x29,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37,0x12,0xaf,0x4, 0x12,0x8d, +0xef,0x12,0x23,0x4, 0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8,0x22,0x12,0x8f,0xd2,0x7e, +0xb3,0x2b,0xf, 0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xc0,0x7e,0x73,0x37,0xcd,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36, +0x12,0x8f,0xca,0xbe,0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x36,0x72,0xa, 0x3e,0xad, +0x3b,0x7d,0xa3,0x2d,0xac,0x75,0x35,0x0, 0x7e,0xa3,0x36,0x72,0xbc,0xad,0x40,0x2, +0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e, +0x78,0xe, 0x7c,0xbd,0x14,0xbe,0xb3,0x36,0x72,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x72, +0x7e,0xc3,0x36,0x72,0x80,0x41,0x7e,0xb3,0x36,0x72,0x4, 0x7a,0xb3,0x36,0x72,0x7e, +0x90,0x5, 0xac,0x9c,0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb, +0x19,0xcd,0x36,0x76,0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, +0xf5,0x35,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0, +0xbe,0xf0,0x3, 0x50,0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x36,0x73,0xda, +0x3b,0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0x5a,0x7e,0xb3,0x36,0x6b, +0xb4,0x1, 0x8, 0x12,0x88,0x22,0xe4,0x7a,0xb3,0x36,0x6b,0x7e,0xb3,0x36,0x6a,0x60, +0x4, 0x74,0xff,0xe1,0xc5,0x7e,0xb3,0x36,0x69,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xb9, +0x12,0xc1,0x12,0x38,0xc, 0x12,0x8f,0xf3,0x38,0x7, 0x12,0x8f,0xeb,0x38,0x2, 0xe1, +0xb9,0x12,0x8f,0xca,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, +0x80,0x3, 0x7c,0xbd,0x14,0x12,0xae,0x34,0x7c,0xfb,0x7e,0xb3,0x36,0x68,0x4, 0x7a, +0xb3,0x36,0x68,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xae,0x34,0x7c,0xab,0xbe,0xa0, +0xff,0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x36, +0x7e,0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, +0x12,0xae,0xbb,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe, +0xf0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x68,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36, +0x75,0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x36,0x68,0x50,0x59, +0x74,0xc, 0xac,0xbf,0x49,0x25,0x36,0x7e,0x7e,0x14,0x61,0xcc,0x12,0x64,0xd3,0xbd, +0x23,0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0x9e,0xbe,0x37,0x36,0x64,0x40,0xd, +0x7e,0x34,0x61,0xd2,0x12,0x23,0x9e,0xbe,0x37,0x36,0x6f,0x50,0x23,0x74,0x5, 0xac, +0xbf,0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, +0x50,0x8, 0x12,0x87,0x52,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x6b, +0xe4,0x7a,0xb3,0x36,0x75,0x7a,0xb3,0x36,0x69,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a, +0xb3,0x36,0x68,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x90,0x61,0xc5,0xe4,0x93,0x7c, +0xdb,0x22,0x12,0xae,0xd2,0x74,0x1, 0x7a,0xb3,0x36,0x66,0x22,0x7e,0x24,0x0, 0x2, +0x2, 0x1e,0xb9,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26,0xf5,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf3,0x2a, +0x70,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3, +0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3, +0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x90, +0x50,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f, +0x36,0x6d,0x0, 0x12,0x1f,0x7, 0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x7, 0xda,0xf8,0x22, +0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8, +0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x6f, +0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x5c, +0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x60, +0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, +0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f, +0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x74,0xc8,0x7a,0xb3,0x39,0x6, 0xc2,0x17, +0x80,0xa, 0x12,0x45,0xd6,0x30,0x17,0x4, 0x75,0xe9,0xff,0x22,0x12,0x47,0xff,0x68, +0xf1,0x22,0x74,0x1, 0x12,0x90,0xf1,0x20,0x17,0x6, 0x12,0x46,0x4e,0x12,0x90,0xfa, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x90,0xb8,0x12,0x90,0xfa,0xe4,0x2, 0x90, +0xf1,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0x22,0xd2,0x4, 0x2, 0x45,0x5a,0xa, +0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x47,0xff,0x68,0xfb,0x20,0x93,0xfd, +0x22,0x7e,0x34,0x61,0x59,0x2, 0x23,0x9e,0x7e,0xb3,0x37,0x6, 0x70,0x2e,0x7e,0x73, +0x36,0xe9,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0x3, +0x7e,0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x91,0x6d,0x7c,0xab,0xe5,0x4e, +0xa, 0x3b,0x2e,0x37,0x38,0x83,0x7a,0x37,0x38,0x83,0x80,0xc, 0x7e,0xa3,0x36,0xea, +0xbe,0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x91,0x5d,0x75,0x4e,0x0, +0x7a,0xb3,0x39,0x6, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x20,0xf0,0x7a,0x71,0x82, +0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xb3,0x38,0x86,0x70,0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x38,0x86,0x22,0x7f,0x20,0xc2,0x4, 0x7e,0x2b,0x60,0x29,0x72,0x0, +0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21,0x0, 0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32, +0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x21,0x0, 0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d, +0x32,0x12,0x21,0x0, 0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60, +0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x37,0xf3,0x4d,0x33,0x68,0x2, +0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f,0x70,0x7c, +0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e, +0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12,0x87,0xbc,0x6c,0xff,0x12,0x2f,0xff,0x7f,0x51, +0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, 0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b, +0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e,0x14,0x62,0xa, 0x12,0x87,0xee,0x8, 0xc, 0x7e, +0x27,0x28,0x8a,0xbe,0x24,0x3, 0x20,0x8, 0x2, 0x61,0x2a,0xb, 0xa, 0xc0,0x1e,0xc4, +0xbd,0x3c,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x61,0x2a, +0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0, +0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca, +0x18,0x5, 0x4e,0xf0,0x1, 0x61,0x2a,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a, +0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa, +0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc, +0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90, +0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd, +0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b, +0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, +0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, +0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b, +0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0x40,0xbd,0x3d,0x22,0x7f,0x60,0x7e,0x6b,0xa0, +0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, +0x2d,0x15,0xb, 0x14,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0, +0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76,0x7d,0x13,0x1e, +0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e, +0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b, +0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xca,0x3b,0x6d,0x11,0x7e,0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c, +0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12,0x95,0x90,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x34,0xca,0x74,0x2, 0xa, 0x3f,0x19,0xb3,0x35,0x34,0xb, 0xf0,0x12,0x5e,0x2d, +0x38,0xe1,0x12,0x97,0xc0,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0xa1,0x69,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, +0x12,0x95,0xa1,0x38,0x2, 0xa1,0x67,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x4d,0x75,0x24,0x0, 0xa1,0x3f,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xca,0xbc,0xcd,0x68,0x2, 0xa1,0x3d,0x49,0x25,0x34,0xc8,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x0, 0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc6,0x74,0x9, 0xac,0xbf,0x12,0x96,0x1b,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x34,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x20,0xa, 0x1c,0x2e,0x14,0x35,0x34,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x67,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x69,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x1f,0x8c,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x97,0xae,0xac,0x3f,0x12,0x95,0x98,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x95,0x98,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x20,0x80,0x2a,0x5, 0x24,0x90, +0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0x81,0x49,0x80,0x1a,0x6d,0x11,0x74, +0x2, 0xac,0xbd,0x12,0x95,0x90,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1,0x34,0xca,0x74, +0x2, 0xa, 0x1d,0x19,0xb1,0x35,0x34,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x25,0xe4, +0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x5f,0xc6,0xca,0x59,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x34,0xc6,0x12,0x20,0xb9,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, 0xda,0x3b,0x22, +0x59,0x15,0x35,0x20,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x1f, +0x8c,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80, +0x63,0x6c,0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac, +0xbe,0x9, 0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x95,0xa1,0x38,0xe5, +0x12,0x95,0xa1,0x28,0x43,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x81,0xb3, +0x74,0x9, 0xac,0xbd,0x12,0x87,0xe5,0x12,0x96,0x1b,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8b,0x59,0x35,0x34,0xb0,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x87,0xb3,0xb, 0xe0,0xbc,0xfe,0x38,0x99,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x21,0x0, 0x7e,0xb3,0x37,0x31,0x70,0x3, 0x12,0x93,0xe3,0x2, 0x96,0x30, +0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x96, +0x7c,0x7c,0xbf,0x12,0x97,0x10,0x4c,0xee,0x78,0x14,0x12,0x5f,0xc2,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0x80,0xb, 0x7e,0xb3, +0x2a,0x9, 0x70,0x5, 0x7c,0xbf,0x12,0x95,0xa9,0x7c,0xbf,0x12,0x9f,0x90,0xbe,0xf0, +0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4, +0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, 0x2, 0x96,0xeb,0xa5,0xbe,0x0, 0x1d,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, +0xa0,0x12,0x5e,0x25,0x38,0xed,0x74,0x1, 0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x47,0x81,0x1b, +0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x47, +0x81,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0x12,0x97,0x4, 0x7e,0x8, +0x34,0xb0,0xe4,0x12,0x20,0xde,0x90,0x60,0x99,0x12,0x97,0x8, 0x7e,0x8, 0x34,0x8b, +0xe4,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60,0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x97,0xb6,0x7c,0x7d, +0x7c,0x6f,0x12,0x97,0xb6,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x97,0xae,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x1f,0x8c,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x2e,0x34, +0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x8, 0x1f,0x34,0x12,0x9e,0x37,0x7c,0x1b,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x34,0x9f,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x34,0x9f,0x1e,0x34,0x7a,0x37,0x34,0x9f,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9f,0x7e,0x37,0x34,0x9f,0x22,0xca,0xf8,0x7c,0xfb, +0x6d,0xdd,0x7c,0xbf,0x12,0x98,0xea,0x7d,0xe3,0x7c,0xbf,0x12,0x37,0x6f,0x7d,0xf3, +0x74,0x2, 0xac,0xbf,0x9, 0x95,0x26,0xfb,0x7c,0xbf,0x12,0x9a,0xed,0x40,0x2, 0x1, +0xd4,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0xbe,0xa0,0x0, 0x28,0x9, 0xa, 0x3a, +0x1b,0x34,0x12,0x98,0xd8,0x7d,0xd3,0x12,0x98,0xdf,0xbd,0xc3,0x58,0xb, 0xa, 0xca, +0xb, 0xc4,0x7d,0x3c,0x12,0x98,0xd8,0x2d,0xd3,0x12,0x9b,0xf, 0x7d,0xd3,0xbe,0xa0, +0x0, 0x28,0x56,0x12,0x98,0xdf,0xbd,0xc3,0x58,0x4f,0xbe,0x90,0x0, 0x28,0x4a,0xbe, +0x90,0x0, 0x28,0x45,0xbe,0xf4,0x0, 0xc8,0x8, 0x3f,0x7d,0x3d,0x3e,0x34,0x3e,0x34, +0xbd,0x3f,0x8, 0x35,0x7e,0x70,0x2, 0xac,0x79,0x49,0x33,0x4, 0xfc,0xbe,0x34,0x1, +0x2c,0x8, 0x26,0xa, 0x2a,0x7e,0xb3,0x2a,0x74,0x12,0x9b,0x18,0xbe,0x34,0x1, 0x90, +0x8, 0x17,0xbe,0xf4,0x1, 0x5e,0x58,0xd, 0x7e,0x34,0x0, 0x3, 0xad,0x3e,0xbd,0x3f, +0x8, 0x3, 0xe4,0x80,0x30,0x74,0x1, 0x80,0x2c,0x90,0x60,0xab,0xe4,0x93,0xbc,0xb9, +0x78,0x22,0x7c,0xba,0x7c,0x79,0x12,0x2c,0x40,0xbe,0x34,0x0, 0x96,0x8, 0x12,0x74, +0x2, 0xac,0xb9,0x49,0x35,0x4, 0xfc,0xbe,0x34,0x0, 0x32,0x8, 0x4, 0x74,0x1, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xb7,0x7c,0x79,0x2, 0x2c,0x40,0x7e, +0xb3,0x2a,0x6f,0xa, 0x3b,0x1b,0x34,0xa, 0xca,0x22,0xca,0x79,0x7c,0x8b,0x6c,0xaa, +0x9f,0x77,0x12,0x9a,0x2a,0x1a,0x79,0x1b,0x74,0x80,0x4c,0x1a,0x38,0x1b,0x34,0x7c, +0xe7,0x80,0x38,0xbc,0x9f,0x78,0x4, 0xbc,0x8e,0x68,0x2e,0xbe,0xf0,0x0, 0x48,0x29, +0x7e,0xb3,0x2a,0x6f,0xa, 0x2b,0x1a,0x3f,0xbd,0x32,0x58,0x1d,0xbe,0xe0,0x0, 0x48, +0x18,0x7e,0xb3,0x2a,0x70,0xa, 0x2b,0x1a,0x3e,0xbd,0x32,0x58,0xc, 0x7c,0xbf,0x7c, +0x7e,0x12,0x2c,0x40,0x12,0x99,0x65,0xb, 0xa0,0xb, 0xe0,0x1a,0x28,0xb, 0x24,0x1a, +0x3e,0xbd,0x32,0x8, 0xbe,0xb, 0xf0,0x1a,0x29,0xb, 0x24,0x1a,0x3f,0xbd,0x32,0x8, +0xaa,0x4c,0xaa,0x78,0x4, 0x6d,0x33,0x80,0x9, 0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12, +0x1f,0x58,0xda,0x79,0x22,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7, +0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f,0x34,0x7e,0xb3,0x2a,0x70,0x7a,0xb3, +0x1f,0x35,0x12,0x9a,0x2a,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x41,0x17,0x7a, +0xf1,0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d, +0x32,0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a, +0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d, +0x32,0x7c,0xb7,0xf5,0x2c,0x80,0x40,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58, +0x10,0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5, +0x2e,0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b, +0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12, +0x2c,0x40,0x12,0x99,0x65,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x2c,0x1a, +0x3b,0xbd,0x32,0x8, 0xb2,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd, +0x32,0x18,0x2, 0x21,0x8f,0x7f,0x17,0xda,0x79,0x22,0x7e,0x70,0x2, 0xac,0x78,0x9, +0x93,0x26,0xfa,0x9, 0x83,0x26,0xfb,0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x62,0x27, +0x12,0x9a,0xe5,0x12,0x9b,0x23,0x50,0x2, 0x41,0xe0,0x7e,0x34,0x62,0x2b,0x12,0x23, +0x9e,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, 0x41,0xe0,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x9a,0xe5,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x4, 0x4c,0x8, 0x6b,0x6c,0xdd,0x80,0x5f,0xc2,0x3, 0x7c,0xbd,0x12,0x37,0x6f, +0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x99,0x6c,0x7a,0x35,0x24,0x9e,0x35, +0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0xdc,0x7a,0x35, +0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, +0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x9a,0xed, +0x50,0x2, 0xc2,0x3, 0x30,0x3, 0xf, 0x7c,0xbd,0x6c,0x77,0x12,0x51,0x5f,0x7e,0x70, +0x2, 0xac,0x7d,0x12,0x37,0x9f,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x99, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x7c,0x4b,0x74, +0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc, +0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x2, 0x1e,0xb9,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33, +0x4, 0xfc,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x37,0x6f,0xbe,0x34, +0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0xe9, +0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0x3b,0x7e,0x77,0x2a,0x5c,0x12, +0x9d,0xa1,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x9b,0xd7,0x7e, +0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x35,0xe5,0xbd,0x36,0x48,0x7, 0x3e,0x34,0x3e, +0x34,0x12,0x9b,0xd7,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0x9b,0x23,0x50,0x6, 0x7e, +0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60,0xc, 0x7e, +0xb3,0x35,0xe3,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xe3, +0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x45,0xe, 0x7e,0x53,0x35,0xe3,0xbe,0x50,0x0, +0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, 0x7d,0xfe, +0x7a,0xf7,0x2a,0x5c,0x12,0x9b,0xdf,0x28,0x3, 0x12,0x37,0xc2,0x7a,0x67,0x35,0xe5, +0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xb9,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x79,0xc2,0x3, 0x7e,0xf0,0x3, 0x7e,0xe3, +0x2a,0x3, 0x12,0x9b,0xdf,0x28,0x72,0x7c,0xbf,0x12,0x2c,0x47,0x4c,0xee,0x68,0xe, +0x7e,0x63,0x33,0xc0,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x33,0xc1,0x70,0x4, 0xd2,0x3, +0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x4d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x3, +0x80,0x1e,0xd2,0x3, 0x12,0x9c,0xf6,0x78,0xa, 0xa5,0xbe,0x0, 0x6, 0x6c,0xff,0xc2, +0x3, 0x80,0xd, 0x9e,0x73,0x33,0xc0,0xbc,0x7e,0x78,0x5, 0x7e,0xf0,0x2, 0xc2,0x3, +0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x2c,0x47,0x7e,0xa3,0x33,0xc2,0x7a,0xa3,0x28,0x84, +0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x33,0xc3,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9, +0x1b,0xfd,0x12,0x9c,0x6f,0xf5,0x4d,0x80,0x3, 0x75,0x4d,0x64,0xda,0x79,0x22,0x7e, +0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80, +0x42,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x9c,0xee,0x9, 0xb3,0x26, +0xfa,0x12,0x2f,0xd6,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12, +0x9c,0xee,0x9, 0xb3,0x26,0xfb,0x12,0x2f,0xd6,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, +0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c, +0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28, +0x84,0xbc,0xb1,0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c, +0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0xca,0x79,0x6c, +0x88,0x80,0x72,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a, +0x71,0x24,0x7c,0xbf,0x12,0x9d,0x8b,0x50,0x5a,0x6c,0xee,0x80,0x51,0xbc,0xe8,0x68, +0x4b,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9d,0x80,0xf5,0x26,0x6c,0x99,0x90,0x60,0xaa, +0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, 0x2f, +0xe5,0x25,0xa, 0x3b,0x12,0x35,0x67,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, 0x78, +0x1b,0x7c,0xbe,0x12,0x37,0x6f,0x7d,0xf3,0x7c,0xb8,0x12,0x37,0x6f,0xbd,0x3f,0x8, +0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x51,0x5f,0xb, 0xe0,0x12,0x9c, +0xf6,0x38,0xaa,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0x86,0xda,0x79,0x22, +0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0x22,0x7c,0xab,0x90,0x60,0xab, +0xe4,0x93,0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x31,0x5a,0x50,0x2, 0xd3,0x22,0xc3, +0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84,0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12, +0x2f,0xb7,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb, +0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x40,0x7d,0xf3,0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, +0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x2, 0x70,0x2d, +0x7e,0x73,0x2a,0x3, 0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc5,0x70,0x18,0x12, +0x9e,0x17,0x7e,0x73,0x2a,0x3, 0x7a,0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, +0x7e,0xb3,0x34,0xc5,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc5,0x22,0xe4,0x7a,0xb3, +0x34,0xc5,0x7a,0xb3,0x2a,0x9, 0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x35, +0xe9,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73, +0x35,0xe8,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0xc1, +0xd2,0x7c,0x57,0xc1,0xca,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98, +0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff, +0x68,0x66,0x12,0x9e,0xe2,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e, +0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, +0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x9e,0xe2, +0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7, +0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0xc1,0x45, +0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6,0x28,0x2, 0xc1,0x41,0x7c,0xba,0xda, +0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0x7c,0xab,0x7e,0xb, +0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x34,0xa3,0xbe,0x73,0x34,0xad, +0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa3,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22, +0xbe,0x73,0x34,0xad,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74, +0xff,0x19,0xb4,0x34,0xa3,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x34,0xa3,0xbe,0xb0,0xff, +0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa3,0xd3,0x22,0xe4,0x19,0xb3,0x34,0xa3,0xc3,0x22, +0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34, +0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x5, 0xbe, +0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34, +0xb0,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x34,0x8b,0x80,0x4, 0x59,0x35,0x34,0x8b,0x59, +0xf5,0x34,0xb0,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x25,0x3c, +0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x25,0x3c, +0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28, +0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90, +0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0x12,0x5e,0x25, +0x38,0xb2,0x22,0x7e,0x8, 0x34,0xa2,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20,0xde,0x6c, +0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12,0x2f,0xb7,0x60,0xa, 0x12,0xa0,0x84,0x40, +0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5, +0x7c,0xb0,0x6c,0x77,0x12,0xa0,0x49,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70, +0x1, 0x12,0xa0,0x49,0xb4,0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x2f,0xb7, +0x60,0xc, 0x12,0xa0,0x84,0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x51,0x5f,0xb, 0x10, +0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3,0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e, +0xb3,0x36,0x61,0x7a,0xb3,0x36,0x62,0x7a,0xa3,0x36,0x61,0x7e,0xb3,0x36,0x62,0x60, +0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e,0xb3,0x36,0x63,0x60, +0x5, 0x14,0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x0, 0x28,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c, +0xa7,0x90,0x60,0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, +0x80,0x71,0xbe,0xb0,0x2, 0x38,0x66,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27, +0x7e,0x73,0x26,0xfa,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26, +0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x2, +0x80,0x4e,0x6c,0xff,0x80,0x30,0x7c,0xbf,0x12,0x37,0x81,0x1a,0x4b,0x7c,0xbf,0x12, +0x37,0x6f,0x7d,0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d, +0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, 0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75, +0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xcb,0x80,0x6, 0xe5,0x1e,0x24, +0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, +0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22,0x7e,0x39,0x70,0xa, 0x37,0x9d,0x32,0x2, +0x21,0x0, 0xca,0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6, +0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd, +0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f,0x46,0x75,0x2b,0x0, 0x61,0x43,0x12,0xa4, +0xde,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b, +0x2e,0x34,0x14,0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x22,0xff,0x12,0x20,0xb9,0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a,0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35, +0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff,0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a, +0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5,0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xa4, +0xe6,0x2e,0x35,0x36,0x12,0xa1,0x48,0x7d,0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58, +0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, 0x3b,0x7f,0x3, 0x12,0xa4,0xe6,0x2e,0x35, +0x38,0x12,0xa1,0x48,0x7d,0xc3,0x7e,0x35,0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32, +0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37,0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a, +0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c, +0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5,0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb, +0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0x61, +0x41,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60, +0x8, 0x2, 0x61,0x41,0x80,0x28,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, +0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x61,0x41,0xbe,0x34,0x0, 0x30,0x8, +0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x61,0x41,0x7e,0xa3, +0x38,0x41,0x74,0xc, 0xa4,0xbe,0x57,0x22,0xf9,0x58,0x2, 0x61,0x41,0x7e,0xa3,0x38, +0x42,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58,0x2, 0x61,0x41,0x7e,0x15,0x36,0x6d,0x0, +0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xa3,0x7e,0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d, +0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xa3,0x7e,0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73, +0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38,0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b, +0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4,0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10, +0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33,0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7c,0xb7,0xf5,0x2e,0xe5,0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37, +0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34,0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e, +0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22, +0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35,0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a, +0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a,0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22, +0xf6,0x5, 0x2b,0x12,0xa4,0xde,0x28,0x2, 0x21,0x7e,0x7e,0xa3,0x22,0xf7,0xbe,0xa1, +0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe,0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50, +0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, 0x34,0x7a,0x73,0x38,0x3e,0x7a,0xb3,0x38, +0x40,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x38,0x3e,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a, +0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43,0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14, +0x12,0xa4,0xd6,0x7a,0x55,0x4a,0xa, 0x5e,0x7f,0x16,0x12,0xa4,0xd6,0x7a,0x55,0x48, +0x7e,0x35,0x48,0x12,0xa4,0xcf,0x2f,0x50,0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a, +0x0, 0x2f,0x70,0x12,0xa4,0xcf,0x12,0xa4,0xc5,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d, +0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4a,0x12,0xa4,0xc5,0x7e,0x1d,0x40, +0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12, +0xa4,0xc5,0x7e,0x1d,0x44,0x2f,0x10,0x7a,0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c, +0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x1f,0x58,0x7f,0x51,0x7f,0x17,0x7f, +0x6, 0x12,0x1f,0x58,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12, +0x1e,0xfc,0x7e,0x87,0x23,0x43,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x3c,0x7e,0x1d,0x40,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x40,0x7e,0x1d,0x44,0x7d,0x19,0x12,0x1e,0xfc,0x7d,0x18, +0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x58,0x7a,0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1e, +0xeb,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12,0x1e,0xeb,0x7e,0x5d,0x3c, +0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1e,0xeb,0x7e,0x7d,0x40,0x9f,0x71,0xbe,0x58, +0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18, +0x7f,0x16,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x5, 0x12,0x1f,0x58,0x7f,0x6, 0x12,0x1e, +0xeb,0x7f,0x7, 0x12,0x1f,0x58,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44, +0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0x7f,0x1, 0x22,0x7d, +0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x39,0x1, 0xbe,0x71,0x2b,0x22,0x2d,0x13,0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79, +0x6c,0xaa,0x12,0xa5,0xe4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf, +0x38,0x43,0x7f,0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x38, +0x63,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda,0x7e,0x8, 0x38,0x43,0x7e,0x18,0x38,0x63, +0x74,0x20,0x12,0xa1,0x52,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73, +0x38,0x3f,0xbe,0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22, +0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0x33,0x38,0x3f,0xa, 0x13,0x6d,0x0, 0x12, +0x1f,0x7, 0x7c,0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64, +0xa, 0x3e,0x1b,0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xa5,0x92,0x7f,0x6, 0x7c, +0xbd,0x7c,0x7c,0x12,0xa5,0x92,0xb, 0xf0,0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x50,0xbc, +0x7f,0x5, 0x7f,0x16,0x12,0xa4,0xee,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x38,0x3e,0xda, +0x3b,0x22,0x7c,0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d, +0x2, 0xb, 0xa, 0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, +0x7c,0x21,0xa5,0xba,0x0, 0x14,0x1a,0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d, +0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, +0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35, +0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xe4,0x7a, +0xb3,0x35,0x69,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x5, 0xe4, +0x7a,0xb3,0x35,0xe4,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x4f,0x12,0xa6,0x4e,0x28, +0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0xdc,0xbe,0x37, +0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x3, 0x70,0x17,0x7e, +0xb3,0x37,0x8, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28, +0x5, 0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0xb3, +0x28,0x84,0xbe,0xb0,0x0, 0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x6e, +0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c, +0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x4a,0x12,0xa6,0xff,0x78, +0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x21, +0x0, 0x7d,0x13,0x7d,0x3e,0x12,0x21,0x0, 0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5, +0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33,0x9e,0x35,0x2e,0xbd,0x3e,0x8, +0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, +0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xae,0x7e,0x73, +0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80, +0xa, 0x12,0xa6,0xff,0x78,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc, +0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0xc1,0x71,0xda,0x3b,0x22,0xa, +0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22, +0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d, +0x0, 0x7f,0x14,0x12,0x1f,0x58,0x7d,0x73,0x12,0x21,0x0, 0x7d,0xe3,0x7d,0x3f,0x12, +0x21,0x0, 0xbd,0x3e,0x22,0x7e,0x63,0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c, +0xc2,0x12,0x6c,0x33,0x80,0x56,0x90,0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac, +0x93,0x90,0x60,0xab,0xe4,0x93,0xa, 0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4, +0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a, +0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x31,0x5a,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f, +0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, 0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, +0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75, +0xbc,0x73,0x38,0xa2,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x32,0xe7,0x22,0x90,0x60,0xa7, +0xe4,0x93,0x60,0x8, 0x30,0x12,0x5, 0x12,0x31,0x7d,0xc2,0x12,0x22,0xca,0xd8,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x22,0xe6,0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x1f,0xad,0x6d,0x11,0x7e,0x4, +0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0xa8,0xe1,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d, +0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, +0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x1, 0xd2,0xbe,0xd4,0x4, +0xb0,0x8, 0x2, 0xd2,0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd, +0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7, +0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x1, 0xd2,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, +0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0xa8,0xe1,0x1a,0x26,0x1a,0x24,0x2f, +0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0xa8,0xd7,0x9f,0x55,0x6c,0xee, +0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12, +0x21,0x0, 0x7d,0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, +0x1d,0x12,0xa8,0xd7,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, +0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea, +0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x58,0x7d,0x13, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x0, 0xca, +0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x80,0xc2,0x3, 0x6d,0x44,0x80,0x32, +0x12,0xa9,0x90,0x12,0xa8,0xe9,0xbd,0x3d,0x48,0x26,0x12,0xa9,0x90,0xb, 0x1a,0x30, +0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0xd2,0x3, 0x80,0x9, 0x12,0x21,0x0, 0xbd,0x3d,0x68, +0x2, 0xc2,0x3, 0x7d,0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa8,0xe9,0x7d,0xd3, +0xb, 0x44,0x7e,0xc5,0x35,0xbd,0xc4,0x38,0xc7,0x30,0x3, 0xc, 0x7e,0xf0,0x7f,0x80, +0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba,0x7d,0x3d,0x60,0x5, 0xe, 0x34, +0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f,0x10,0x2e,0x35,0x35,0x7a,0x1b, +0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30, +0x7f,0x60,0x2e,0xd5,0x35,0x7e,0x6b,0xb0,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0x7c, +0xb7,0x12,0xa9,0x9b,0xb, 0x44,0x7e,0x55,0x35,0xbd,0x54,0x38,0xd8,0xda,0xf8,0x22, +0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a, +0x1b,0xb0,0x22,0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5, +0x1, 0x6c,0xaa,0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0xa9,0x99,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xed,0xc2,0xc9,0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, +0x7e,0x73,0x2a,0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0xad,0x13, +0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x38,0xd9, +0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, +0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35,0x35,0x7e,0xf, 0x37, +0x40,0x7e,0x18,0x25,0xb6,0x2, 0xa8,0xef,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12, +0xaa,0x51,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37, +0x24,0xf6,0x12,0xaa,0x58,0x12,0xaa,0x61,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, +0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, +0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2, +0x22,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53, +0x2a,0x6d,0xac,0x54,0x7e,0x17,0x28,0xa1,0x12,0xaa,0x51,0x6d,0x0, 0x80,0x37,0x7d, +0x40,0x3e,0x44,0x7e,0x7f,0x38,0xd9,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10, +0x7d,0xf4,0x2e,0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14, +0x6d,0x55,0x9d,0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d, +0x51,0x1b,0x48,0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22,0x7c,0xab,0x7e,0x8, 0x29, +0xbc,0x12,0x5e,0x25,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0,0xb4, +0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31,0x7d, +0x20,0x39,0xb1,0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0x61,0x96,0x90,0x60, +0xa7,0xe4,0x93,0x70,0x2, 0x61,0x96,0x6c,0xff,0x61,0x8f,0x7e,0x70,0x9, 0xac,0x7f, +0x9, 0xe3,0x29,0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, +0x7d,0x3d,0x12,0xab,0xa4,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, +0x7d,0x34,0x1b,0x34,0x12,0xab,0x9b,0x7c,0xbe,0x12,0xaa,0xbb,0x80,0x3f,0x7e,0x70, +0x2, 0xac,0x7d,0x2e,0x34,0x60,0xc5,0x12,0x87,0xbc,0x74,0x9, 0xac,0xbf,0x59,0xd5, +0x29,0x8, 0x7e,0x34,0x60,0xcf,0x12,0x23,0x9e,0x12,0xab,0x9b,0x80,0x1f,0xbd,0xc4, +0x40,0x1b,0x7d,0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0xaa, +0xbb,0x7d,0xc4,0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12, +0x5e,0x2d,0x28,0x2, 0x61,0xb, 0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59, +0x35,0x29,0xa, 0x22,0x6c,0xaa,0x80,0x27,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e, +0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14, +0x60,0xb3,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0xb, 0xb, 0xa0,0x90, +0x60,0xa7,0xe4,0x93,0xbc,0xba,0x38,0xd0,0x7c,0xba,0x22,0x90,0x60,0xa7,0xe4,0x93, +0x60,0x2b,0x6c,0x33,0x80,0x1f,0x7c,0xb3,0x12,0x31,0x5a,0x40,0x16,0x7c,0xb3,0x12, +0x31,0x27,0x7d,0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x1b,0x1a,0x50,0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0xac, +0x20,0x7e,0x14,0x62,0x7, 0x12,0x87,0xee,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22, +0x6d,0x11,0xe4,0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x7f,0x38,0xf3,0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12, +0x21,0x0, 0xbd,0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xf3,0x2d, +0x13,0x69,0x20,0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x81,0xbf,0x7e,0x10,0x2, 0xac, +0x1a,0x7e,0x1f,0x38,0xf3,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78, +0x4, 0x7e,0x14,0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e, +0x14,0x7f,0xff,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22, +0x6c,0x66,0x7e,0x27,0x39,0x4, 0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e, +0xb3,0x28,0xac,0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xab,0xbc,0x76,0x50,0xf, 0xe4,0x7a, +0xb3,0x28,0xad,0x12,0x8a,0x87,0x7e,0xb3,0x2f,0xab,0x4, 0x80,0x4, 0xe4,0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xab,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xac, +0xbe,0xa0,0x5, 0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74, +0x5, 0x80,0x1, 0xe4,0x7a,0xb3,0x2f,0xac,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8, +0x30,0x1, 0xe, 0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, +0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d, +0x23,0xa, 0x3a,0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f, +0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac, +0x56,0x49,0x22,0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e, +0xb3,0x2a,0x6d,0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, +0x2, 0xc2,0x3, 0xa2,0x3, 0x22,0xc2,0x3, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1, +0x60,0x4, 0xd2,0x3, 0x80,0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57, +0x49,0x12,0x4, 0xfc,0x7e,0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d, +0x22,0x9d,0x20,0xbd,0x12,0x58,0x4, 0xd2,0x3, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e, +0x14,0x0, 0x3, 0xa, 0x27,0xbd,0x21,0x48,0xd2,0xa2,0x3, 0x22,0x7d,0x23,0x7e,0x14, +0x61,0xc8,0x12,0x64,0xd3,0x7e,0x14,0x0, 0x5, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50, +0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x8, 0x50,0x45,0x74,0x8, 0x80,0x3d,0x7d,0x13, +0x3e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x6, 0x50,0x30,0x74, +0x6, 0x80,0x28,0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e, +0x33,0x36,0xdc,0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, 0x80,0xf, 0xbd,0x32,0x50,0xf, +0x7e,0x73,0x36,0xdc,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xdc,0x7e, +0xb3,0x36,0xdc,0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a,0xb3,0x36,0xdc,0x74,0x1, 0x7a, +0xb3,0x16,0x92,0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3,0x36,0xdc,0x50,0x5, 0xe4,0x7a, +0xb3,0x16,0x91,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0xae, +0xad,0x68,0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0xae,0xc5,0x7d,0x23,0x7e,0x70,0xc, +0xac,0x72,0x59,0x23,0x36,0x82,0x49,0x3, 0x36,0x82,0x49,0x23,0x36,0x7e,0xbd,0x20, +0x50,0x4, 0x59,0x3, 0x36,0x7e,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22, +0x80,0x18,0x12,0xae,0xad,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7e, +0xbd,0x4, 0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37, +0x36,0x64,0xbe,0x37,0x36,0xdd,0x50,0x8, 0x7e,0x37,0x36,0xdd,0x7a,0x37,0x36,0x64, +0x12,0xae,0xbb,0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, +0xac,0x12,0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, 0x22,0x7e,0x70,0xc, 0xac,0x7a, +0x49,0x33,0x36,0x7e,0x22,0x49,0x23,0x36,0x84,0x49,0x33,0x36,0x80,0x9d,0x32,0x2, +0x21,0x0, 0x7e,0x8, 0x36,0x7a,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x20,0xde,0x6c,0xaa, +0x7e,0x44,0xff,0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7c,0x59,0x43,0x36, +0x84,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x68,0x7e,0x34,0x0, 0xd, +0xe4,0x2, 0x20,0xde,0x7e,0xa3,0x2b,0x62,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62, +0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4,0x2, 0xa, 0x66,0x22,0xc2,0xc, 0x7e, +0x8, 0x2a,0x6d,0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x6d,0x74,0x3, 0x2, 0x11,0x7a,0xe4, +0x7a,0xb3,0x36,0x67,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59, +0x43,0x36,0x7e,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xee,0xe4,0x7a,0xb3,0x36,0x68,0x6d, +0x33,0x7a,0x37,0x36,0x6f,0x7a,0x37,0x36,0x64,0x22,0x7e,0xb3,0x36,0x6a,0xb4,0x1, +0x27,0x7e,0xb3,0x36,0xe0,0x4, 0x7a,0xb3,0x36,0xe0,0x7e,0x73,0x36,0xe0,0xbe,0x70, +0x3, 0x40,0x15,0x12,0x8c,0x90,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x6, 0x40,0x9, 0xe4, +0x7a,0xb3,0x36,0xe0,0x7a,0xb3,0x36,0x6a,0x22,0x12,0x24,0x14,0xe4,0x7a,0xb3,0x3, +0xfe,0x2, 0x76,0x52,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88, +0x7e,0xf0,0x1, 0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f, +0x7f,0x7, 0x2d,0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc, +0x9f,0x38,0xe2,0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0, +0x1, 0x2, 0xb0,0x54,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, +0x80,0x36,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26, +0xfb,0xe5,0x44,0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16, +0x5, 0x45,0xa, 0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0xb0,0x62,0xbd,0x3d,0x8, +0x5, 0x12,0xb0,0x62,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe, +0xb0,0x0, 0x28,0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba, +0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x33,0xc3,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a, +0x19,0x72,0x33,0xc4,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x30,0x3, 0x1b,0x1a,0xd0, +0xb, 0xa0,0xb, 0xf0,0xbc,0x8f,0x40,0x3, 0x2, 0xaf,0xd4,0x7c,0xba,0xda,0x79,0xda, +0xd8,0x22,0x7c,0xbe,0x7c,0x7d,0x2, 0x2c,0x40,0x7c,0x9b,0x7f,0x71,0x7f,0x60,0x7e, +0x34,0x22,0xb8,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f,0x52,0x74,0x2a,0x12,0x1f,0xad, +0x7e,0x58,0x1f,0x52,0x7c,0xb9,0x7e,0x71,0x44,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x45, +0x7e,0x71,0x46,0x12,0x2c,0x40,0x2d,0x34,0xe, 0x34,0x7f,0x5, 0x7e,0x50,0x7, 0xb, +0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, 0x1b,0x6a,0x30,0x69,0x30,0x0, +0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe2,0x22,0x6d,0x33, +0x7d,0x23,0x7d,0x3, 0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x6e, +0xac,0xb3,0xa, 0x42,0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4, +0xb, 0x7a,0x40,0xbe,0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, +0x24,0xbe,0x44,0xff,0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, +0x34,0xb, 0x21,0x7e,0x93,0x2a,0x6e,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb3,0x38,0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e, +0x14,0x1e,0x14,0x12,0x25,0x3e,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a, +0xb3,0x39,0x8, 0x7e,0xb3,0x39,0x9, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39, +0x9, 0x80,0x3c,0xe4,0x7a,0xb3,0x39,0x9, 0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22, +0xbd,0x32,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x9, 0x7e,0xb3,0x39,0x8, 0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x8, 0x80,0x16,0xe4,0x7a,0xb3,0x39,0x8, 0x74,0x2, +0x80,0x9, 0xe4,0x7a,0xb3,0x39,0x8, 0x7a,0xb3,0x39,0x9, 0x7a,0xb3,0x39,0xa, 0x7e, +0xb3,0x39,0xa, 0x22,0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x39,0xb, 0x22,0xca,0xd8, +0xca,0x79,0xc2,0x3, 0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7,0x28,0x97, +0x7e,0x37,0x37,0xfb,0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff,0x7e,0xa3, +0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14,0x24,0xc2, +0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83,0x2a,0x6d, +0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99,0x80,0xf, +0x7c,0xb9,0x12,0x37,0x6f,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, 0x90,0x7e, +0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x61,0x4f,0x7e,0xa3, +0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3,0x26,0x83, +0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34,0x49,0x23, +0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, 0x6d,0x33, +0x9d,0x3e,0x12,0x8f,0xdc,0xbd,0x3, 0x8, 0x4, 0xd2,0x3, 0x80,0x6, 0xb, 0x90,0xbc, +0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe,0xe7,0x7, 0xf8,0x8, 0x2, 0xc2, +0x3, 0x30,0x3, 0x20,0x7e,0xb3,0x39,0xb, 0x4, 0x7a,0xb3,0x39,0xb, 0x7e,0x23,0x39, +0xb, 0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x39,0xb, 0x74,0x1, 0x7a,0xb3, +0x28,0xa8,0x80,0xf, 0x7e,0x23,0x39,0xb, 0xbe,0x20,0x0, 0x28,0x6, 0x1e,0x20,0x7a, +0x23,0x39,0xb, 0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28,0x69,0x7e, +0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68,0x59,0x7e, +0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, +0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x2c,0x3c,0xbe,0x34,0x0, 0x96,0x8, 0x5, +0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38,0xdb,0x6c, +0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3,0x27,0x37, +0x12,0x2c,0x3c,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90, +0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x17,0xa, 0xe9,0xa, 0x5f, +0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x39,0xc, 0x4, +0x7a,0xb3,0x39,0xc, 0x7e,0x73,0x39,0xc, 0xbe,0x70,0x5, 0x28,0x22,0x74,0x5, 0x7a, +0xb3,0x39,0xc, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x15,0x12,0xb1,0x84,0x80,0xf, +0x7e,0x73,0x39,0xc, 0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x39,0xc, 0xda, +0x79,0xda,0xd8,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34,0x0, 0x38,0xca,0x39,0xac,0x7f, +0x2e,0x34,0x0, 0x50,0x6d,0x22,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, 0x30,0x6d,0x22,0x7e,0x8, 0x3, +0x60,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0x3e, +0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x20,0xde,0x90,0x60,0x93,0x93,0xa, 0x3b,0x7e, +0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43,0x6c,0x77,0x80, +0x1d,0xa, 0x27,0x2d,0x24,0x12,0x87,0xdc,0xb, 0xa, 0x0, 0x7e,0x30,0x2, 0xac,0x37, +0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, 0x70,0xbc,0xa7, +0x38,0xdf,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x13,0xc6, +0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24,0x13,0x8e,0x9d,0x31,0x1b,0x28, +0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38,0xdc,0x22,0x7c,0xab,0x12,0xb4, +0xb, 0xd2,0x16,0x7c,0xba,0x12,0x86,0xf8,0xc2,0x16,0x22,0xa9,0xd1,0xcb,0x74,0x1, +0x2, 0x0, 0xe, 0x12,0xb4,0xb, 0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x6d,0x12,0xb4, +0x4c,0x12,0xb4,0x2f,0x7a,0x37,0x38,0xd6,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x6d, +0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb5,0x19,0x90,0x60, +0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb4,0x80,0x22,0x7a,0xb3,0x24,0xf2, +0x7e,0x53,0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa,0xe4,0x7a,0xb3,0x24, +0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24,0xf6,0x7e,0x34,0x0, +0x20,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x7a,0x37,0x24,0xfc,0x7e,0x8, 0x24,0xf2,0x22, +0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e,0xa, 0xd8,0x90,0x60,0x94,0xe4, +0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x18,0x7e,0x70,0x2, 0xac, +0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, 0x5a,0xc0,0x9d,0xc2,0x59,0xc3, +0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60,0x92,0xe4,0x93,0x7c,0x9b,0x6d, +0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92,0xe4,0x93,0xa, 0xcb,0x1b,0xc4, +0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x7d,0x23, +0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d,0x3e,0x34,0x2d,0x31,0x7d,0x20, +0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x0, 0x7d,0xa3,0xbd,0xfa,0x58,0x2, +0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8,0x2d,0xec,0x2d,0xdc,0xb, 0xf0, +0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca,0xf8,0x6d,0x44,0x7e,0xf3,0x2a, +0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3,0x2a,0x6d,0xa, 0xeb,0x2d,0xef, +0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x31, +0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda,0x2d,0xdf,0x3e,0xd4,0x7e,0x1f, +0x38,0xd9,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x50,0x2d,0xb2, +0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, 0xa0,0xbc,0xfa,0x38,0xd9,0x80, +0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x38,0xd9,0x2d,0x15,0x6c,0xaa,0x80,0x2c,0xa, +0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x38,0xd9,0x2d,0x3e,0xb, 0x1a,0xe0,0x7e,0x70, +0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0,0x7d,0x3e,0x9d,0x3d,0x12,0x21, +0x0, 0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, 0xa0,0xbc,0xfa,0x38,0xd0,0x7d, +0x34,0xda,0xf8,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9,0xc5,0xea, +0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x4e,0x7e,0x73,0x39,0x6, +0xbe,0x71,0x4e,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9,0x34,0xe5, +0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x33,0xe5, +0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5,0x3, 0xa9, +0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8,0x22,0x7e, +0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79,0x30, +0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79,0x30, +0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79,0x30, +0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd0,0xce,0xa2,0x3, 0xa9,0x95,0xc9,0x22, +0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0xa9,0xc2,0xeb,0xa9,0xd2, +0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9, +0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, 0x75,0x8b,0x0, 0xd2,0x8e, +0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7,0x0, 0x75,0xf8,0x0, 0xa9, +0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xc1, +0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7,0xc2,0xbe,0x22,0x75,0xe7, +0x6b,0x2, 0xb6,0xc4,0xe4,0x7e,0x34,0xd7,0xfc,0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0, +0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0x7e,0x37,0x39,0x4, 0xb, 0x34,0x7a,0x37,0x39,0x4, 0xbe,0x34,0xff,0x0, +0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37,0x39,0x4, 0x22,0x7c,0x6b,0x6c,0x77,0x6c, +0xaa,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x46,0x12,0xb7,0xb9,0x75,0xb5,0x5, 0xa9,0x36, +0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3, +0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5, +0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47, +0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0x22,0x74,0x6, +0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73,0x7d,0x52,0x7c,0xab,0x7e,0xb3, +0x39,0x13,0xb4,0xa5,0x3c,0x12,0xb7,0xb9,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0x12, +0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2, +0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0xb7,0x62,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x22, +0x74,0x2, 0x7d,0x3f,0x2, 0xb7,0x62,0x7d,0x42,0x7f,0x60,0x7d,0x3, 0x12,0xb8,0x38, +0x74,0x2, 0x12,0xb6,0xfb,0x7d,0xf3,0x4e,0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, 0x12, +0xb7,0xc0,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f,0x6, 0x12,0xb8,0x64,0x5e,0xf4, +0xff,0xfd,0x12,0xb7,0xc0,0x2, 0xb7,0xf8,0xa9,0xc5,0xca,0xe4,0x7a,0xb3,0x39,0x13, +0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12,0xb6,0xfb,0x4c,0xff,0x78,0x5, 0x5e,0x70, +0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0xb7,0x62,0xda,0xf8,0x22,0xd2,0xc8, +0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0xb8, +0x38,0xe4,0x12,0xb8,0x1, 0x2, 0xb7,0xf8,0xa9,0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1, +0xea,0x74,0xa5,0x7a,0xb3,0x39,0x13,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24,0xbd, +0x32,0x38,0xe9,0x22,0x12,0xb8,0x72,0x7e,0x35,0x36,0x12,0xb8,0x48,0xa9,0xd2,0xb4, +0xd3,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5,0xa, 0x44,0xf5,0x39,0x7f,0x21, +0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xb8,0x9d,0xe5,0x3a,0x12,0xb8,0x9d,0xe5, +0x39,0x12,0xb8,0x9d,0xe5,0x38,0x12,0xb8,0x9d,0xe4,0x2, 0xb8,0x9d,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c, +0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, +0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74, +0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x97,0xbe,0x90,0x1, +0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe, +0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18, +0xb2,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xb9,0x5c,0xb, 0x7a,0x20, +0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d, +0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25, +0x3c,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, +0xf9,0x2d,0xf1,0x7d,0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77, +0x14,0x78,0xfb,0x4d,0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xd9,0x7e,0x8, +0x1f,0x3c,0x12,0xba,0x1a,0xd2,0x3, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xb9,0x64, +0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32, +0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, +0x12,0xba,0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7, +0x38,0xee,0x12,0xba,0x7, 0xe4,0x12,0xba,0xf, 0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a, +0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xba,0x7, 0x74,0x1, 0x12,0xba,0xf, 0x74, +0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12, +0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x1c,0x74,0x3f, +0x2, 0x20,0xde,0x7e,0x8, 0x1f,0x34,0x12,0xba,0x1a,0x6c,0x77,0x80,0xe, 0x12,0xba, +0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x6e, +0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9, +0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x44,0xa, +0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57,0x7c,0xab, +0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46, +0x2e,0x44,0x20,0x73,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b,0xbe,0x60, +0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb, +0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b, +0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70, +0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbb,0x29,0x60,0x5, 0x3e, +0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16, +0x9e,0x60,0xe, 0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b, +0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72, +0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12,0x77,0xf6,0xb, 0x24,0xa, 0x33,0xbd,0x32, +0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28, +0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f, +0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d, +0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a, +0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a, +0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a, +0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3, +0xff,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, +0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85, +0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88, +0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53, +0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e, +0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91, +0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12,0x2f,0xd0,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xfb,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x37,0x32,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xbd,0x64, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x38,0xfc,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x37,0x33,0x80,0x1a,0x12,0xbd,0x64,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x38,0xfb,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x34,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f, +0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x80, +0x7e,0x34,0x0, 0x28,0xe4,0x12,0x20,0xde,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, 0xc0, +0x12,0x20,0xde,0x7a,0xb3,0x37,0x34,0x7e,0x34,0x62,0x8e,0x12,0x23,0x9e,0x7a,0x37, +0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a,0xe7, +0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a,0xf7, +0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a,0xf7, +0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe,0x7a, +0xb3,0x37,0x34,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x7e,0x37,0x38,0xe2,0x9e,0x37,0x38,0xde,0x12,0x21,0x0, 0xbd,0x31,0x38,0x12, +0x7e,0x37,0x38,0xe4,0x9e,0x37,0x38,0xe0,0x12,0x21,0x0, 0xbd,0x31,0x38,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd, +0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x38,0xdd,0x60,0x11,0x7e,0xc7, +0x38,0xe6,0x4d,0xcc,0x78,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x28,0x2, 0xe1,0x8, 0xbe, +0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xe1,0x8, 0x7e,0xe7,0x29,0x8, 0x7e, +0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x66,0xe6,0xbe,0xb0,0x1, 0x78,0x2, 0xe1, +0x8, 0x7e,0xa3,0x38,0xdd,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23, +0x14,0x78,0x2, 0xe1,0x5, 0xb, 0xb2,0x68,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x68,0x2, +0xe1,0x17,0x4c,0xee,0x68,0x2, 0xe1,0x17,0x74,0x1, 0x7a,0xb3,0x38,0xdd,0x12,0xbf, +0x2a,0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3, +0x38,0xdd,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xdd,0x7e,0x34, +0x62,0x68,0x80,0x48,0x12,0xbf,0x33,0x90,0x62,0x57,0x12,0xbf,0x1e,0x68,0x49,0x80, +0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xbf,0x33,0x7e,0x34,0x62, +0x60,0x12,0x23,0x9e,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d, +0xc3,0xbe,0xc7,0x38,0xe6,0x40,0x21,0x90,0x62,0x56,0x12,0xbf,0x1e,0x68,0x19,0x12, +0xbf,0x2a,0x74,0x3, 0x7a,0xb3,0x38,0xdd,0x7e,0x34,0x62,0x64,0x12,0x23,0x9e,0x7a, +0x37,0x38,0xe6,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xdd,0x6d,0x33,0x7a, +0x37,0x38,0xe6,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93, +0xa, 0x3b,0x12,0xbd,0xe9,0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x38,0xde,0x7a,0xf7, +0x38,0xe0,0x22,0x7a,0xe7,0x38,0xe2,0x7a,0xf7,0x38,0xe4,0x22,0xca,0xf8,0x7f,0x51, +0x7f,0x40,0x7e,0x37,0x2f,0x90,0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c, +0x7e,0x37,0x2f,0x9c,0x7a,0x35,0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff, +0x80,0x1e,0x7e,0x34,0x0, 0x26,0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0x8c,0x74, +0x2, 0xac,0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xbf,0x8b,0xb, 0xf0, +0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e, +0x35,0x2f,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e, +0x35,0x31,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, +0x6a,0x30,0x9e,0x35,0x33,0x6d,0x22,0x7e,0x33,0x38,0x41,0x12,0xbf,0xe0,0x7e,0x15, +0x2f,0x12,0x1f,0x5, 0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e, +0x33,0x38,0x42,0x12,0xbf,0xe0,0x7e,0x15,0x31,0x12,0x1f,0x5, 0x1b,0x7a,0x30,0x22, +0xa, 0x13,0x6d,0x0, 0x2, 0x1e,0xeb,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, +0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22, +0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x7e,0x34,0x60,0xa3,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e,0x37,0x2a,0x53,0x22,0x7e,0xa3,0x2a,0x6e,0x7e, +0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d,0x22, +0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b, +0x14,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e, +0x7b,0x60,0xbc,0x6b,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x2e,0x14,0x1, 0x30,0x6d, +0x0, 0x7e,0x18,0x3, 0x60,0x22,0x2e,0x14,0x0, 0x50,0x6d,0x0, 0x7e,0x18,0x34,0x0, +0x22,0x74,0x6, 0x12,0xb6,0xfb,0x7d,0x3, 0x6c,0x11,0x22,0x7e,0x70,0x2, 0xac,0x7c, +0x9, 0xb3,0x26,0xfa,0x22,0xe4,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36,0x71,0x22,0x74, +0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x61,0x57, +0x22,0x7a,0x37,0x28,0xa1,0x7e,0x34,0x61,0xc2,0x22,0x90,0x60,0xaa,0xe4,0x93,0xbe, +0xb0,0x1, 0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b,0xf, 0x22,0x74,0x5, 0xac,0xbc, +0x9, 0xb5,0x26,0x33,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22,0x7e,0xe3, +0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e, +0x37,0x25,0xf4,0x7a,0x37,0x31,0xcc,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x31,0xce, +0x22,0x7e,0x73,0x37,0xbd,0x7a,0x73,0x2b,0x20,0x22,0x12,0x0, 0x1e,0x7e,0xb3,0x2a, +0xfc,0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0, +0x1, 0x22,0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xb3,0x37,0x31,0xbe,0xb0, +0x1, 0x22,0x7e,0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7,0xe4,0x93,0x7c, +0xab,0x22,0xc1,0x42,0x3e,0xbd,0x40,0xbf,0x18,0x53, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg_ili.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg_ili.txt new file mode 100644 index 0000000000000..a95fee0f439bf --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg_ili.txt @@ -0,0 +1,3093 @@ +0x2, 0x1f,0xd2,0x2, 0xb5,0xb4,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x42,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x70,0x2d,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x7d,0x45,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x32,0x2, 0x7d,0xa4,0xe4,0x2, 0x29,0xfa,0x22,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xa2,0x13,0x22,0x32,0xff,0x2, 0x0, 0x69,0x2, 0x31, +0xb3,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x38,0xc8, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x38,0xd8,0x7e,0x73,0x38,0xd8,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x7f,0x5, 0x7e,0x1f,0x38,0xc8,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x38,0xc8,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x38,0xcc,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x38,0xd4,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x38,0xd2,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf7,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0xb7,0xc7,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d,0xe2,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xb2,0x61,0x3f,0x7e,0x34,0x1d,0x96,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xc6,0x61,0x3f,0x7e,0x34,0x1e,0xa, 0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d, +0xf1,0x61,0x3f,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x69,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x6a,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xc8,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x38,0xc8,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x20,0xde,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x38,0xc0,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf7,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x38,0xc0,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xb9,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x38,0xc8,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x39,0xd, 0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x86,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x39,0xd, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x39,0xd, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x39,0xd, 0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xf3,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xf3,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xc0,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x38,0xc8,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x38, +0xc8,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x38,0xc8,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x38,0xc8,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x38,0xc8,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x38, +0xc8,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x38,0xc8, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x38,0xc8,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x38,0xc8,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x38,0xc8,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xb9,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xb9,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xf3,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xf3,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x39, +0xd, 0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x38,0xc8, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x38,0xc8,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x39,0xd, 0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x39,0xd, 0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x39,0xd, 0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf7,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xf2,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf7,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf7,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x39, +0xd, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x39,0xd, 0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x39,0xd, 0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x58,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1e,0xeb,0x7d,0x1e,0x12,0x1f,0x5, 0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x38,0xc8,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf7,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xf2,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf7,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x7f,0x5, 0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x38,0xc0,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc8,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x38,0xd8,0x7e,0x1f,0x38,0xc0, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xf3,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x39,0xd, 0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x20,0x8f,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x20,0x90,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e, +0x1f,0x38,0xc0,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x38,0xc0,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x38,0xc8,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x6, 0xe, 0x15,0x1a,0x1f,0x26,0x2b,0x2d,0x2e,0x2f, +0x2c,0x2a,0x24,0x1f,0x1a,0x14,0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10,0x15,0x1c,0x22, +0x28,0x2d,0x34,0x39,0x3d,0x40,0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x11,0x16, +0x1c,0x23,0x2b,0x32,0x37,0x3c,0x40,0x45,0x4a,0x4d,0x4c,0x4b,0x4a,0x48,0x46,0x46, +0x45,0x45,0x44,0x44,0x43,0x44,0x45,0x78,0x65,0x55,0x2, 0xd, 0x14,0x1b,0x21,0x25, +0x2b,0x31,0x37,0x36,0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, +0x10,0x18,0x1e,0x23,0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40, +0x3f,0x3e,0x3d,0x3d,0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29, +0x27,0x1e,0x14,0x11,0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21, +0x2b,0x32,0x30,0x2a,0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, +0x10,0x19,0x23,0x2d,0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71, +0x50,0x55,0x28,0x12,0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39, +0x31,0x28,0x1e,0x15,0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32, +0x37,0x39,0x20,0x29,0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, +0x1, 0x0, 0x1, 0x5, 0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c, +0x34,0x31,0x26,0xcb,0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31, +0x2e,0x2d,0x35,0x3d,0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, +0x10,0x1b,0x24,0x2f,0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d, +0x28,0x31,0x34,0x2a,0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40, +0x47,0x47,0x44,0x3c,0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b, +0x22,0x2d,0x30,0x2e,0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, +0x0, 0x0, 0x3, 0xb, 0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26, +0x1b,0x14,0x1c,0x25,0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c, +0x25,0x30,0x38,0x40,0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c, +0x29,0x1e,0x14,0x13,0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39, +0x30,0x25,0x1b,0x10,0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a, +0x23,0x2f,0x33,0x29,0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, +0x2, 0x0, 0x1, 0x8, 0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e, +0x50,0x55,0x16,0x2b,0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36, +0x3b,0x3d,0x3b,0x37,0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33, +0x3d,0x3f,0x13,0x21,0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37, +0x2d,0x22,0x18,0xc, 0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38, +0x2e,0x2a,0x31,0x62,0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, +0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26, +0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b, +0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48, +0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x9, 0x17,0x1d,0x26,0x2e,0x37, +0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, +0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30,0x2f,0x2c,0x26,0x1e, +0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c,0x32,0x3a,0x41,0x48, +0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c,0x33,0x55,0x26,0x1c, +0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18,0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, +0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44,0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49, +0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f,0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54, +0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c, +0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22,0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c, +0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a,0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32, +0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, +0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22, +0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, 0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39, +0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68,0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70, +0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80,0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10, +0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, +0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39,0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24, +0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50,0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff, +0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a,0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, +0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22, +0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33,0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29, +0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d,0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26, +0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10,0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b, +0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19, +0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22,0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39, +0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34,0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, +0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18,0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37, +0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e, +0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21, +0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c, +0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, +0x0, 0x2, 0x5, 0x9, 0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f, +0x3d,0x38,0x30,0x27,0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36, +0x3f,0x49,0x53,0x5c,0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b, +0x15,0xb, 0x4, 0x0, 0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c, +0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, +0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, +0x8, 0xe, 0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58, +0x51,0x48,0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf, +0x30,0x55,0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28, +0x30,0x38,0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16, +0xf, 0xc, 0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, +0x3, 0xa, 0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a, +0x58,0x57,0xc6,0x55,0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38, +0x3c,0x3e,0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, +0xd, 0x17,0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57, +0x4f,0x47,0x40,0x38,0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, +0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f, +0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22, +0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25, +0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f, +0x3d,0x3a,0x36,0x2e,0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0x9, 0xe, 0x14,0x1c,0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a, +0x10,0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47, +0x4f,0x56,0x5a,0x5b,0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9, +0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e, +0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25, +0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25, +0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d, +0x3a,0x34,0x2d,0x27,0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, +0xa, 0xf, 0x15,0x1b,0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11, +0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36, +0x3c,0x42,0x47,0x48,0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29, +0x22,0x1b,0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c, +0x24,0x2a,0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, +0x4, 0x7, 0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b, +0x38,0x31,0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35, +0x3d,0x45,0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17, +0x11,0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6, +0x30,0x55,0xa, 0x5, 0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3c,0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, +0x1, 0x2, 0x35,0x46,0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37, +0x2e,0x25,0x1e,0x16,0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39, +0x41,0x45,0xf0,0xbc,0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28, +0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, +0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d, +0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19, +0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36, +0x2f,0x27,0x21,0x19,0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, +0x16,0x1f,0x26,0x2d,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d, +0x56,0x59,0x5a,0x58,0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, +0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38, +0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40, +0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3, +0x30,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, +0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f, +0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40, +0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32, +0x39,0x3e,0x7, 0x90,0x30,0x55,0x39,0x2b,0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, +0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b,0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f, +0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24, +0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b,0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65, +0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a,0x46,0x55,0x0, 0x1, 0x3, 0x5, 0x7, 0x8, +0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22,0x24,0x27,0x2a,0x2c, +0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, 0x14,0x1b,0x23,0x28, +0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53,0x4e,0x47,0x40,0x3b, +0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x1f,0x7, 0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x1f,0x7, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0x13,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x4c,0x0, 0xc2,0x14,0x75,0x4d,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x4e,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x21,0x10,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x36,0x72,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xd0,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33,0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0x9b,0x0, 0x0, 0x2, 0x37,0xed,0x0, 0x0, 0x0, 0x2, 0x37, +0xef,0x0, 0x0, 0x0, 0x1, 0x37,0xf1,0x0, 0x0, 0x1, 0x34,0x4f,0x0, 0x0, 0x1, 0x39, +0x11,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x2, 0x34,0x9f,0x0, 0x0, 0x0, 0x1, 0x34, +0xa1,0x0, 0x0, 0x1, 0x34,0xaf,0x0, 0x0, 0x1, 0x34,0xc4,0x0, 0x0, 0x1, 0x34,0xc5, +0x0, 0x0, 0x1, 0x35,0x3e,0x0, 0x0, 0x1, 0x35,0x3f,0x1, 0x0, 0x1, 0x35,0x40,0x0, +0x0, 0x3c,0x35,0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x36,0x61,0x0, 0x0, 0x1, 0x36,0x62,0x0, 0x0, 0x1, 0x36,0x63,0x0, 0x0, +0x1, 0x35,0xe2,0x1, 0x0, 0x2, 0x35,0xe5,0x0, 0x0, 0x0, 0x1, 0x2f,0xa9,0x0, 0x0, +0x1, 0x2f,0xaa,0x0, 0x0, 0x1, 0x2f,0xab,0x0, 0x0, 0x1, 0x2f,0xac,0x0, 0x0, 0x1, +0x36,0x66,0x1, 0x0, 0x1, 0x36,0xe0,0x0, 0x0, 0x1, 0x39,0x12,0x0, 0x0, 0x6, 0x38, +0xfb,0x3f,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x39,0x1, 0x24,0x0, 0x1, 0x39,0x8, +0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x1, 0x39,0xb, 0x0, +0x0, 0x1, 0x39,0xc, 0x0, 0x0, 0x1, 0x0, 0x4f,0x0, 0x0, 0x1, 0x3, 0xec,0x0, 0x0, +0x4, 0x37,0x40,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39,0x3, +0x0, 0x0, 0x2, 0x39,0x4, 0x0, 0x0, 0x0, 0x1, 0x39,0x6, 0x64,0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x39,0x13,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x2, 0x2b,0xb9,0x2b,0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, +0x0, 0x1, 0x38,0xdd,0x0, 0x0, 0x1, 0x38,0x3e,0xff,0x0, 0x1, 0x38,0x3f,0x0, 0x0, +0x1, 0x38,0x40,0x0, 0x0, 0x1, 0x38,0x41,0x40,0x0, 0x1, 0x38,0x42,0x40,0x0, 0x4, +0x38,0xf3,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf7,0x0, 0x0, 0x64,0x0, 0x0, 0x4, +0x38,0xc0,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x38,0xc4,0x0, 0x0, 0x68,0xc0,0x0, 0x4, +0x38,0xc8,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x38,0xd9,0x0, 0x0, 0x40,0x0, 0x0, 0x4, +0x39,0xd, 0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58, +0x0, 0xc, 0x0, 0xfa,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78, +0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, +0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, +0x0, 0x1e,0x12,0x3f,0x13,0x12,0x69,0x8e,0x12,0x23,0xb, 0x12,0x28,0x48,0x12,0x8d, +0xec,0x2, 0x23,0x4, 0x74,0x1, 0x7a,0xb3,0x36,0x6a,0x22,0x12,0x73,0x71,0x12,0x23, +0x40,0x2, 0x23,0x14,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x1d,0x7d,0x43,0x7e, +0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34, +0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22, +0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x23,0x1d,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, +0x7a,0x2, 0x23,0x1d,0x7e,0x34,0x60,0xa3,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x46, +0xa2,0x12,0x73,0x28,0x12,0x3f,0x13,0x12,0x69,0x87,0x12,0xc0,0x25,0x12,0x23,0xb, +0x12,0x28,0x48,0x12,0x68,0x23,0x12,0x8d,0xec,0x2, 0x23,0x4, 0x7e,0x34,0x61,0x4f, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x7a,0x37,0x28, +0x95,0x7e,0x34,0x61,0xba,0x12,0x23,0x9e,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8, +0x12,0x23,0x9e,0x7a,0x37,0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0x9e,0x7a,0x37, +0x28,0x9b,0x7e,0x34,0x61,0xbc,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61, +0xbe,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0x9e,0x12, +0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x20,0xde,0x12,0x25,0xc3,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0x9e, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0x9e,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x3c,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0xb7,0xc7,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x36, +0xe1,0x7e,0x34,0x61,0x51,0x12,0x23,0x9e,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x36,0xe2, +0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe3,0x7e,0x34, +0x61,0x57,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe4,0x7e,0x34,0x61,0x59, +0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe5,0x7e,0x34,0x61,0x5b,0x12,0x23, +0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe6,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x36,0xe7,0x12,0x20,0xb9,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x37,0x12,0xe5,0x28,0x7a,0xb3,0x37,0x1, 0x22,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a,0x4d,0x90,0x60, +0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0xc0, +0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93, +0x7a,0xb3,0x2a,0x59,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x62,0x12,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60, +0xa0,0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3, +0x16,0x92,0x22,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e, +0x12,0xc0,0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x37,0xa0,0xbe,0xf0,0x5, 0x78, +0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78, +0x13,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b,0xe4,0x7a,0xb3,0x2b,0x2, 0x12, +0x7a,0x2d,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x49,0xd, 0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x69,0xab,0x12,0xc1,0x1, +0x80,0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b, +0x12,0x2f,0xf4,0x50,0xfb,0x12,0x88,0x17,0x12,0x69,0x97,0x12,0x28,0x48,0x74,0x2, +0x7a,0xb3,0x37,0xa0,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3, +0xed,0x7a,0x37,0x3, 0xef,0x22,0x7e,0xb3,0x37,0x6, 0x14,0x68,0x60,0x14,0x78,0x2, +0xe1,0x10,0x14,0x68,0x73,0x24,0x3, 0x68,0x2, 0xe1,0x5, 0x12,0xc1,0x32,0x38,0x8, +0x30,0x10,0xf, 0x12,0xc1,0x2a,0x68,0xa, 0x12,0x63,0x2, 0xe4,0x7a,0xb3,0x38,0x85, +0x80,0x7e,0x7e,0xb3,0x36,0xe7,0x30,0xe0,0x77,0x7e,0x73,0x36,0xe8,0xa, 0x27,0x7e, +0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64, +0x12,0x23,0x9e,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x83,0x50,0x53,0x12,0x63,0x2, +0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x38,0x87,0x80,0x43,0x12,0xc1,0x32, +0x28,0x39,0xe4,0x7a,0xb3,0x37,0x6, 0x7e,0xb3,0x38,0x85,0xb4,0x1, 0x6, 0x74,0x1, +0x7a,0xb3,0x37,0x6, 0xd2,0x17,0x80,0x23,0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x45,0x73,0x12,0x23,0x54,0xe4,0x7a,0xb3,0x37,0x6, 0x7a,0xb3,0x39, +0x7, 0xd2,0x17,0x80,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x39,0x7, +0x12,0x90,0xd2,0x2, 0x27,0x16,0xca,0xd8,0xca,0x79,0x7e,0xb3,0x37,0x6, 0xb4,0x1, +0x2, 0x80,0x3, 0x2, 0x28,0x38,0x6c,0xdd,0x6c,0xff,0x12,0x91,0x11,0x7d,0xf3,0x12, +0x2f,0xf4,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x38,0x86,0x12,0x3d,0xac,0x12,0x13,0xc7, +0x12,0x0, 0x1e,0x74,0xa, 0x12,0x45,0x15,0x12,0xc0,0xe7,0x7e,0xe7,0x2b,0xd, 0x7a, +0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3,0x2a,0xfa,0x7e,0xe7,0x2b,0xd, +0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3,0x2a,0xfa,0x12,0x7b,0xd0,0x7c, +0x7b,0x74,0x6, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x1e,0xb9,0x7d,0x23,0x7d,0x3f, +0x12,0x25,0x3c,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12,0x4e,0xe0,0x12,0x26,0x57,0x7e, +0xb3,0x37,0x31,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, 0x74,0xa, 0x12,0x91,0x5d,0x12, +0x4f,0xaf,0x80,0xf, 0x80,0x7, 0x12,0x45,0xcf,0xe4,0x12,0x46,0x7, 0x20,0x93,0xf6, +0x12,0x45,0x9f,0x30,0x18,0xf7,0x30,0x17,0xf4,0xd2,0x4, 0x12,0x45,0x5a,0xe4,0x12, +0x13,0xde,0xb, 0xd0,0x12,0x4c,0x83,0x12,0x91,0x76,0x7e,0xa3,0x38,0x85,0x4c,0xaa, +0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x86,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x31, +0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x85,0x12,0x28,0x3d,0x78,0x18,0x7e,0xb3,0x38,0x85, +0x60,0x12,0xe4,0x7a,0xb3,0x38,0x85,0x7a,0xb3,0x2a,0x2, 0x7a,0xb3,0x2a,0x3, 0x7e, +0xf0,0x1, 0x80,0x1d,0x12,0x28,0x3d,0x68,0x10,0x7e,0xb3,0x38,0x85,0x70,0xa, 0x7e, +0xf0,0x1, 0xe4,0x7a,0xb3,0x37,0x6, 0x80,0x8, 0xbe,0xd0,0x32,0x50,0x3, 0x2, 0x27, +0x8c,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a,0x37,0x2b,0xd, 0x7a,0xe3,0x2a, +0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x48,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x38, +0xf2,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34, +0x39,0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34, +0x3a,0x22,0xca,0x3b,0x12,0x2f,0xf4,0x50,0xfb,0x7e,0xf3,0x2b,0xf, 0x7c,0xbf,0x12, +0xb3,0xfc,0x12,0xb4,0x13,0x7e,0xb3,0x2b,0x1f,0xf5,0x28,0x7e,0xb3,0x2b,0x20,0xf5, +0x29,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0xf, 0x12,0x8d,0x6c,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x28,0x48,0xc3,0x21,0x6c,0x12,0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x7, 0x12,0xac,0x20,0x7a,0x37,0x37,0xe3,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x69,0x8e,0x12,0xac,0xe, 0x7e,0xc3,0x3, 0xec,0x12,0x6e,0x31, +0xe4,0x12,0x13,0xde,0x12,0x28,0x48,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x2a,0x7e,0x18, +0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x7a,0xc8,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x2a, +0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x7a,0xc8,0x7e,0xd3,0x2b,0x1f,0x7e, +0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5,0x29,0x12,0x6e,0x8b,0x50,0x5, +0x7c,0xbc,0x12,0xb3,0x54,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d, +0x10,0x12,0x6a,0xd4,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3,0x2b,0x20,0x7c,0xbf,0x12,0x86, +0xf8,0x12,0xaa,0x18,0x7e,0xb3,0x39,0x7, 0x4, 0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39, +0x7, 0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x7, 0x7e,0xb3,0x16,0x90, +0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e, +0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, 0x37,0x2d,0x32,0x22,0x12,0x48, +0x7, 0x7e,0xb3,0x37,0x8, 0xb4,0x3, 0x6c,0x12,0xb6,0xe2,0x12,0x26,0x57,0x12,0x3f, +0xfb,0x7e,0xb3,0x37,0x9c,0x30,0xe7,0xe9,0x12,0x28,0x62,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18,0x12,0xab,0xdb,0x12,0x75,0xe9, +0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x88,0x5f,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x58,0x52,0x12,0x48,0x39,0x12,0x3a,0x9f,0x7e,0xb3,0x37,0x9c,0x54,0x7f,0x7a,0xb3, +0x37,0x9c,0x80,0x8d,0x12,0x2f,0xee,0x2, 0x0, 0x46,0x7a,0xb3,0x2b,0x2, 0x7a,0xb3, +0x2b,0x1e,0x22,0x12,0x52,0x6d,0x12,0x2b,0xfa,0x12,0x2b,0xfa,0x12,0x36,0xac,0x12, +0x9c,0xfd,0x12,0x9f,0xef,0x12,0x2b,0xfa,0x12,0x9b,0xe7,0x12,0x2b,0xfa,0x12,0xa0, +0xae,0x12,0x2b,0xfa,0x2, 0x2a,0x27,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c,0xdd, +0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x25,0x7e,0x8, 0x35,0xe9,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18,0x26, +0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0x41,0xfb, +0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9,0x9, +0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x36,0x74, +0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36, +0x26,0xa, 0x37,0x12,0x81,0xbf,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x25,0x12,0xa1,0x4b,0x2d,0x13,0xbd,0xc1,0x28, +0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68,0x39, +0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x2c,0x40, +0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34,0x74, +0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71,0x74, +0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe8,0xbc, +0x7e,0x28,0x2, 0x41,0x60,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x33,0x12,0x2f,0xe4,0xbe,0xb0,0xff,0x68, +0x2b,0x9, 0x73,0x1f,0x35,0x12,0x30,0x3, 0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54,0x0, +0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, 0x12, +0x2f,0xe4,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc,0xf9, +0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19,0x75, +0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19,0xa3, +0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe,0x38,0x8a,0x90, +0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e, +0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xfd,0x12,0x97,0x4, 0x7e,0x8, 0x36, +0x25,0x74,0xff,0x12,0x20,0xde,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b, +0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xf5, +0x7a,0xf3,0x35,0xe8,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb3,0x28, +0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee, +0x80,0x2e,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x25,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac, +0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa, +0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbf,0x12,0x2f,0xd0,0xb, 0xf0,0xb, 0xe0, +0x12,0x9c,0xf6,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c,0xba,0x7c,0x7d, +0x12,0x30,0x3, 0xb, 0x1a,0x30,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3, +0x2a,0x6f,0xf5,0x40,0x7e,0xb3,0x2a,0x70,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a, +0xb3,0x33,0xc2,0x7a,0xb3,0x33,0xc0,0x7a,0xb3,0x33,0xc1,0x7e,0x8, 0x1f,0x34,0x12, +0x2f,0xdd,0xe4,0x12,0x20,0xde,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x33,0xc3,0xe4, +0x12,0x20,0xde,0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa2,0x6c,0xcc,0xe1,0x91,0x12,0xc0, +0x8b,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, +0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34,0x7c, +0xbd,0x14,0xbc,0xbc,0x78,0x2, 0xe1,0x97,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x88, +0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, 0xb3, +0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x28,0xe5, +0x27,0xa, 0x2b,0xe5,0x25,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0, +0x4, 0x40,0x2, 0xe1,0x86,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x86,0x85,0x25, +0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb0,0x69,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x40,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83,0x80, +0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2b, +0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x40,0x2d,0x34, +0xbd,0x38,0x18,0x2, 0xe1,0x1d,0x75,0x30,0x1, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x1, +0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x4, +0x40,0x2, 0xe1,0x1d,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x1d,0x7c,0xbf,0x20, +0xe0,0x2, 0xe1,0x1d,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26,0xbe, +0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1, +0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25, +0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50, +0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29, +0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x5, +0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24,0xe5, +0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29, +0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x5, +0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24,0xe5, +0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85,0x2b, +0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x2c,0x40,0x7a,0x35,0x3e,0xe5,0x2a, +0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe,0xb1, +0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93,0x5, +0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0,0x5, +0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c,0x50, +0xad,0xe5,0x2c,0x12,0x2f,0xae,0xe5,0x2a,0x12,0x2f,0xa5,0xe5,0x2a,0x12,0x2f,0xae, +0xe5,0x2c,0x12,0x2f,0xa5,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20,0x5, +0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x42, +0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0xe5,0x42,0xa, 0x1b, +0x6d,0x0, 0x12,0x1e,0xeb,0x7f,0x21,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, +0x28,0x12,0x1e,0xfc,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23, +0x3e,0x24,0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe, +0xb0,0x0, 0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x33,0xbf,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f, +0x34,0xf5,0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x1f,0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0xc0,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x8e,0x7e,0x8, 0x1f,0x34,0x12,0xaf,0x94,0x7a,0xb3, +0x33,0xc2,0xda,0x3b,0x22,0x7e,0x71,0x2d,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7e,0x71, +0x2b,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7c,0x7b,0x12,0x77,0xf6,0x9, 0xa2,0x27,0x72, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x91,0x6d,0x5c,0xba,0x22, +0x7e,0x70,0x1, 0x2, 0x51,0x5f,0xa, 0x3b,0x9d,0x32,0x2, 0x21,0x0, 0x90,0x60,0x9a, +0x93,0xa, 0x3b,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x12,0x2f, +0xf4,0x50,0xfb,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x7c,0x5b,0x7e,0x43,0x28, +0x84,0xbe,0x40,0x1, 0x28,0x2, 0x21,0x14,0x7e,0xa3,0x2a,0x6e,0x7e,0x70,0x2, 0xac, +0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x30,0x3, +0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc,0x7c,0x9d,0x7e,0x83,0x2a, +0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc,0xa, 0xa8,0x1b,0xa5,0xa, +0x5f,0xbd,0x5a,0x58,0x2, 0x21,0x14,0xa, 0x59,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48, +0x4e,0x7c,0xb9,0x14,0x12,0x31,0x5a,0x50,0x46,0x7c,0xb9,0x14,0x12,0x31,0x17,0xb, +0x1a,0xe0,0x7d,0x3b,0x12,0x31,0x4c,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf, +0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12, +0x31,0x1e,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x31,0x20,0x1b,0x1a,0xa0,0xa, +0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9,0x4, 0x12,0x31,0x5a,0x50, +0x43,0x7c,0xb9,0x4, 0x12,0x31,0x17,0xb, 0x1a,0xe0,0x7d,0x3c,0x12,0x31,0x4c,0x8, +0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12, +0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x31,0x1e,0xb, 0x1a,0x50,0xbd,0x5a,0x8, +0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x31,0x27,0x7d,0xd3,0x7d,0x5d,0x3e,0x54, +0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43,0x2a,0x6e,0x90,0x60,0xab, +0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7c,0x75,0xac,0x74,0xa, +0x2a,0x2d,0x32,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40, +0x2d,0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xab,0x6c,0x77,0x80,0x12, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x51,0x4f,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22, +0xb, 0x70,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe5,0xc3,0x22,0x12,0x36,0x9c, +0x60,0x30,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1b,0x7c,0xb2,0x12, +0x31,0x27,0x7d,0x3, 0x12,0x36,0x94,0x49,0x55,0x38,0xe8,0x7d,0x40,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd4,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc0,0xde,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0x41,0xdd,0x6c,0xcc,0x41,0xcf,0x12,0xc0,0x8b,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xb, 0x7e,0xb3,0x36,0x71,0x70, +0x5, 0x12,0x32,0xe0,0x80,0x6, 0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x30, +0x19,0xd2,0x3, 0x12,0x32,0xe7,0x7e,0xb3,0x36,0xec,0xb4,0x1, 0x1b,0x7e,0xb3,0x2a, +0x3, 0xb4,0x1, 0x14,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xd, 0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x3, 0x12,0x32,0xe0,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x27,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, +0x2d,0x1b,0x24,0xe5,0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24, +0x0, 0x80,0x3c,0xe5,0x24,0xbc,0xbc,0x68,0x34,0x12,0x35,0xda,0x9, 0xa3,0x26,0xfa, +0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5,0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x2f,0xd6, +0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a,0xa, 0x2b,0xe5,0x28,0x12,0x2f,0xd6,0xbe, +0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12, +0x36,0xa4,0x38,0xbf,0xe5,0x27,0x7e,0x71,0x28,0x12,0xa0,0x94,0x50,0x8, 0x12,0x31, +0x7d,0x12,0x35,0xd3,0x80,0x8, 0x12,0x69,0x84,0x50,0x3, 0x12,0x32,0xe0,0xe5,0x25, +0x7e,0x71,0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x33,0x21,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x16,0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e, +0x34,0x27,0x78,0x6d,0x22,0x12,0x7f,0xc5,0x12,0x31,0x7d,0xb, 0xf0,0xb, 0xc0,0x7e, +0x73,0x28,0x84,0xbc,0x7c,0x28,0x2, 0x21,0xc9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22, +0x75,0x25,0x3, 0x75,0x26,0x3, 0x22,0x12,0x36,0x9c,0x60,0x34,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1f,0x7c,0xb2,0x12,0x31,0x27,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x36,0x94,0x59,0x35,0x38,0xe8,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72,0x38,0xd0, +0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x35, +0x80,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x35,0x80,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x30,0x3, 0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x90,0x50,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0xc7,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0xb1,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0xaf,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0xaf,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x40,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0xaf,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x35,0x65,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x35,0x65,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0xb8,0xa8,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x35,0x56,0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x35,0x56,0x9f,0x51,0x12,0x35,0x5d,0x9f,0x41,0x12,0x35,0x5d,0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0xeb,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xdf,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x35,0x71,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x35,0x71,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1e,0xeb,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x0, 0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x7, 0x2e,0x18,0x0, 0x20,0x22, +0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34, +0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39, +0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39, +0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d, +0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba, +0xda,0xf8,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x74,0xf5,0x27,0x12,0x0, 0x66,0x50,0x2, 0xc1, +0x6f,0x6d,0x33,0x9e,0x37,0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x70,0x7e, +0xb3,0x16,0x92,0x70,0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x60,0x7e,0x77,0x2a,0x51, +0x7e,0x67,0x2a,0x53,0x75,0x24,0x0, 0x80,0x4e,0xe5,0x24,0x12,0x2f,0xb7,0x60,0x45, +0x12,0x35,0xda,0x12,0x9d,0x80,0xf5,0x26,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90, +0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26,0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26, +0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0xd, 0xe5,0x25,0xa, 0x2b,0xe5, +0x27,0x12,0x9b,0x18,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x51,0x5f,0x12, +0x35,0xda,0x12,0x37,0x9f,0x5, 0x24,0x12,0x36,0xa4,0x38,0xad,0x12,0xa6,0x5, 0xda, +0x3b,0x22,0x12,0x46,0xa2,0x12,0x24,0x9a,0x12,0x73,0x28,0x12,0x22,0xf2,0x7e,0xb3, +0x37,0x8, 0x24,0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x58,0xf0,0x80,0xef,0x12, +0x29,0x7e,0x80,0xea,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x90,0x60, +0xa7,0xe4,0x93,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x12,0xa5,0xee,0x12, +0x9b,0x49,0x12,0x35,0xe2,0x12,0x9a,0x38,0x2, 0x36,0xbb,0xca,0x3b,0x12,0x2b,0xfa, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x9, 0xe4,0x7a,0xb3,0x35, +0xe4,0x7a,0xb3,0x35,0x69,0x7e,0xb3,0x35,0xe2,0x70,0x69,0x6c,0x99,0x80,0x5d,0x74, +0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x9a,0xed, +0x40,0x48,0x6c,0xee,0x80,0x3c,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x6a,0x9, 0xc5, +0x35,0x6b,0xa, 0x28,0xa, 0x3d,0x12,0x37,0x67,0x78,0x25,0xa, 0x2f,0xa, 0x3c,0x12, +0x37,0x67,0x78,0x1c,0x7c,0xb9,0x12,0x37,0x6f,0x7e,0x14,0x62,0x2b,0x12,0x87,0xee, +0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x51,0x5f,0x7c,0xb8,0x7c,0x7f,0x12,0x37,0xa7, +0xb, 0xe0,0x7e,0x73,0x35,0xe4,0xbc,0x7e,0x38,0xbc,0xb, 0x90,0x7e,0x73,0x28,0x84, +0xbc,0x79,0x38,0x9b,0x7e,0x73,0x35,0x69,0x7a,0x73,0x35,0xe4,0xa, 0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x35,0xa6,0x7e,0x8, 0x35,0x6a,0x12,0x20,0xb9,0x1b,0xfd,0xe4, +0x7a,0xb3,0x35,0xe2,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x0, 0x4d,0x33,0x22,0x7c, +0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x2, 0x2c, +0x40,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0x99,0x6c,0x7f,0x71,0x7c,0xbf,0x12, +0x37,0x6f,0x12,0xa4,0xcf,0x7f,0x17,0x12,0x1f,0x58,0x7c,0xb7,0xda,0xf8,0x22,0x9, +0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c,0x6b,0x7e,0xa3,0x35,0x69,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x62,0x35,0xa6,0x19,0x72,0x35,0xa7,0x7c,0xba,0x4, 0x7a,0xb3,0x35, +0x69,0x22,0xca,0xf8,0x6c,0xff,0x80,0x18,0x7c,0xbf,0x12,0x37,0x6f,0xbe,0x37,0x2a, +0x5c,0x58,0xb, 0x12,0x51,0x5b,0x7e,0x70,0x2, 0xac,0x7f,0x12,0x37,0x9f,0xb, 0xf0, +0x12,0x52,0x66,0x38,0xe3,0x12,0x2b,0xfa,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe, +0xa0,0x34,0x38,0x3, 0x2, 0x38,0xfd,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x10, +0x41,0x1c,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d, +0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x31,0xce,0x7e,0x39,0xb0,0xbe,0xa0,0x37, +0x68,0x2, 0x41,0x1c,0x75,0x1a,0x36,0x41,0x1c,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0, +0x39,0x78,0x1b,0x7e,0xf3,0x37,0xc0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc0,0xbe,0xa0, +0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x1c,0xbe,0xa0, +0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xc2,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc2,0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b, +0x44,0x41,0x1c,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x1c,0xbe,0xa0, +0x5e,0x78,0x26,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, +0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x1c,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0, +0x3d,0x78,0x1b,0x7e,0xf3,0x37,0xc4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc4,0xbe,0xa0, +0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x1c,0xbe,0xa0, +0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xc6,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc6,0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a, +0x9d,0x41,0x1c,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x37,0x9c,0x41,0x1c,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e, +0xf3,0x37,0xe1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xe1,0xbe,0xa0,0x4f,0x78,0x3, 0x75, +0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x31,0xcc,0x7e,0x39,0xb0,0x41,0x1c,0xbe,0xa0,0x51, +0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, +0xff,0x7e,0xb3,0x37,0xec,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a, +0xb3,0x37,0xec,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0x1c,0xbe, +0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xb5,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xb5,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x3a, +0x1f,0x41,0x1c,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0x91,0x41,0x1c,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e,0xbe,0xa0, +0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0xa, 0x9, 0xb3,0x31,0xd4,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1a,0xf4,0x80,0x5c, +0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5, +0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10, +0x3e,0x14,0x7e,0x1f,0x31,0xd0,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, +0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80, +0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c, +0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, +0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e, +0x3, 0x2a,0x6d,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x60,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, +0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, +0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x62,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca, +0xf8,0x80,0x38,0x7c,0xbf,0x12,0x3a,0x1f,0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70, +0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x12,0x3a,0xde,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x3a,0xde,0x7e,0x73,0x2a, +0x6e,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3, +0x2a,0x6d,0x74,0x2, 0xa4,0x22,0x12,0x3f,0xaa,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x37,0xdc,0x7e,0x8, 0x25,0xee,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x3f,0x49,0x80,0x12, +0xca,0x39,0x7e,0x18,0x37,0xdc,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x3f,0x67,0x2, 0x3b,0x15,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0xca,0xf8, +0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x7d,0xab,0xd2,0x6, 0xa1,0xa0,0xa5, +0xbe,0x1, 0x3d,0x7a,0x73,0x37,0x9d,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5,0xbf,0xae, +0x4, 0xd2,0x7, 0xa1,0xa0,0xa5,0xbf,0xaa,0x5, 0x12,0xc0,0xf8,0x80,0x1e,0xa5,0xbf, +0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xce,0x80,0x10,0xa5,0xbf,0xac,0x2, +0x80,0x2, 0xa1,0xa0,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xce,0x6d,0x33,0x81,0x1c, +0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x3d,0xa3,0xa5,0xbe,0x7, +0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xa0,0xa5,0xbe,0x8, 0x2, 0x80,0x2, 0xa1,0xa0, +0x12,0x7, 0xfb,0xa1,0xa0,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73,0x37,0xa6, +0xa1,0xa0,0xa5,0xbe,0xb, 0x8, 0x12,0x3d,0xa3,0x12,0x3f,0xc8,0xa1,0xa0,0xbe,0x60, +0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x38,0xbe,0x60,0x1e,0x40,0xd, 0xbe, +0x60,0x23,0x38,0x8, 0x12,0x3d,0xa5,0x43,0xc, 0x40,0xa1,0xa0,0xbe,0x60,0x15,0x40, +0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x3d,0xa5,0xd2,0x6, 0xa5,0xbe,0x15,0x2, 0x80, +0x2, 0xa1,0xa0,0x74,0x7, 0x7a,0xb3,0x37,0xa0,0xa1,0xa0,0xa5,0xbe,0x19,0x7, 0xe4, +0x7a,0xb3,0x37,0xb5,0xa1,0xa0,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c,0x38,0x2, +0xa1,0x38,0xa5,0xbe,0x2d,0x1b,0x12,0x3d,0xa5,0x20,0x7, 0x2, 0xa1,0xa0,0x7e,0x63, +0x37,0xc8,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35,0x8, 0xa1, +0xa0,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, 0xa1,0x38, +0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1,0x38,0x7e,0x70, +0x64,0xa1,0x38,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, 0x1, 0x7e, +0xf3,0x37,0xc1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc1,0xa, 0x2f,0x19,0x72,0x2b,0x21, +0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x38,0xa1,0xa0,0xbe,0x60,0x3a, +0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xc3,0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, 0x80,0x2, +0xa1,0xa0,0x75,0x1a,0x3a,0xa1,0xa0,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, 0x7a,0x73, +0x2b,0x12,0xa1,0xa0,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xec,0xa1,0xa0,0xbe,0x60, +0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc5,0x7c,0xbf, +0x4, 0x7a,0xb3,0x37,0xc5,0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d,0x2, 0x80, +0x2, 0xa1,0xa0,0x75,0x1a,0x3c,0xa1,0xa0,0xbe,0x60,0x3e,0x68,0x4, 0xa5,0xbe,0x3f, +0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc7,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc7,0xa, +0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x3e, +0xa1,0xa0,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x3d,0xa5,0x75, +0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x3d,0xa5,0x75,0xd, 0x2, 0x12,0x3a, +0xe6,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x3d,0xa5,0x12,0x3f,0x70,0x80,0x71,0xbe, +0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x3d,0xa5,0x80,0x63,0xbe,0x60,0x4e, +0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xe2,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xe2,0xa, 0x2f,0x2e,0x27,0x31,0xcc,0x7a,0x29,0x70,0xa5,0xbe,0x4f, +0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80,0x31,0xbe, +0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20,0x7c,0xb7, +0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, 0x7e,0x1f, +0x31,0xd0,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a,0x71,0xf, +0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0x9c,0x22,0x7a,0xb3,0x2b,0x0, +0x70,0x14,0x12,0x3f,0x67,0x12,0x3b,0x15,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4, +0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x3f,0x49,0x12,0x3b,0x15,0x12, +0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12,0x0, 0x1e, +0xe4,0x12,0x3d,0xac,0x12,0x3d,0xf3,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12,0x3d,0xac, +0x2, 0x3d,0xf3,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e,0x8, 0x1f, +0x44,0x12,0x3f,0xe9,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x20,0xde,0x7e, +0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x1f,0xda,0x7e, +0x34,0x0, 0xa, 0x12,0x20,0xde,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc,0x7a,0x1d, +0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, 0x2a,0xb9, +0x12,0xba,0x6c,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, 0x3a,0x2e, +0x34,0x20,0x73,0x12,0x91,0x6d,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12, +0x3f,0xb, 0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a, +0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9, +0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x3f,0xb, 0xa, 0x4a, +0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde, +0x38,0xd8,0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0, +0x12,0xb9,0x2, 0x80,0x3, 0x12,0x3f,0xd9,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f, +0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e, +0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34, +0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e, +0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x12,0xaf,0x1f,0x12,0x13,0xf5,0x12, +0xb9,0x8e,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x3f,0xcb,0x74,0x1, 0x12, +0x3d,0xac,0x12,0x3f,0xd2,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x3d,0xdb,0x7e, +0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25, +0xee,0x22,0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x3f,0x67,0x80,0x6, 0xb4,0x1, 0x6, +0x12,0x3f,0x49,0x12,0x3b,0x15,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22, +0x12,0x3f,0xaa,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x37,0xdc, +0x12,0x20,0xb9,0x1b,0xfd,0x12,0xc0,0xef,0x12,0x3f,0x49,0x80,0x1a,0xca,0x39,0x7e, +0x18,0x2b,0x70,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x37,0x2b,0x76, +0x7a,0x37,0x31,0xcc,0x12,0x3f,0x67,0x2, 0x3b,0x15,0x7e,0xb3,0x37,0xe0,0x7e,0x34, +0x0, 0x4, 0x22,0x7c,0x6b,0x12,0x3f,0xe1,0x78,0x5, 0x7c,0xb6,0x2, 0x7d,0xd6,0xb4, +0x4, 0x5, 0x7c,0xb6,0x2, 0x3b,0x1e,0x22,0xb2,0x82,0x22,0x7d,0x32,0x74,0xfa,0x2, +0x12,0xd0,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x20, +0xde,0x7e,0xb3,0x37,0x9c,0xc4,0x54,0x7, 0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, +0x20,0xde,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x30,0x6, 0x3b,0xc2,0x6, +0x12,0x25,0xe6,0x7e,0x73,0x37,0xa1,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x37,0xa2,0x7a, +0x73,0x2b,0x1d,0x7e,0x73,0x37,0xa2,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x37,0xa3,0x60, +0x18,0x7e,0x34,0x0, 0x2, 0x12,0x41,0x5d,0x7e,0x34,0x0, 0x1, 0x12,0x41,0x5d,0x6d, +0x33,0x12,0x41,0x5d,0xe4,0x7a,0xb3,0x37,0xa3,0x12,0x4f,0xfa,0x2, 0x40,0x3f,0xe5, +0xc, 0x70,0x2, 0x21,0x5c,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x72,0x92, +0x12,0x79,0x31,0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53, +0xc, 0xfd,0x12,0xba,0x23,0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b, +0x12,0x60,0x9, 0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65, +0x7e,0x73,0x2b,0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x4, +0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3, +0x45,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xce,0x7a,0x73,0x2b,0xf, 0x12,0x87,0x52,0x7a, +0xb3,0x0, 0x4f,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x4f,0x7a, +0x73,0x37,0xa6,0x12,0x6e,0x29,0x12,0xc0,0x42,0x7e,0x73,0x37,0xcf,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4, +0x12,0xa, 0x66,0x12,0x8d,0xec,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43, +0x37,0xd0,0x7e,0x50,0xa, 0xac,0x45,0x12,0x3f,0xcb,0xe5,0xc, 0x30,0xe6,0x4e,0x53, +0xc, 0xbf,0x7e,0x73,0x37,0xbc,0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37, +0xbc,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x43,0xeb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63, +0x37,0xbc,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12,0x47,0x81,0x7c,0x65,0x4c,0x76,0x74, +0xe, 0x12,0x43,0x5f,0x12,0x43,0xeb,0x12,0x43,0xf3,0x7e,0x73,0x37,0xbf,0x7a,0x73, +0x2b,0x14,0x7e,0x73,0x37,0xbe,0x7a,0x73,0x2b,0x1f,0x12,0xc1,0x1, 0xe5,0xc, 0x30, +0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xa6,0x2, 0x48,0x77,0x22,0xca,0xd8,0xca, +0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c, +0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x57, +0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x43,0xeb,0x7c,0x8b,0x74,0x7, 0x7e, +0x70,0xf, 0x12,0x43,0xf0,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, +0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, +0xc, 0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e, +0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x38,0xc4,0x12,0x43, +0x48,0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x38,0xc4,0x78,0x7, 0x12,0x43, +0x48,0x54,0xfb,0x80,0x5, 0x12,0x43,0x48,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x38, +0xc0,0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e, +0xa0,0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0x12,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff, +0xe, 0x12,0x43,0x53,0x54,0xe6,0x12,0x43,0x50,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12, +0x43,0x53,0x5e,0x54,0xfe,0xe6,0x12,0x43,0x50,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4, +0x0, 0x2, 0x78,0x2d,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e,0x54,0x0, 0xf, 0x1b, +0x1a,0x50,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34, +0x0, 0x2, 0x12,0x44,0x72,0x12,0x44,0x4b,0x12,0x44,0x28,0x7a,0x37,0x31,0xd4,0x61, +0x4, 0x6c,0xdd,0x41,0xfe,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40, +0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, +0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c, +0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e, +0x54,0x0, 0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4, +0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, +0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, +0x3b,0x12,0x44,0x72,0x12,0x44,0x4b,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x44,0x4b, +0x12,0x44,0x28,0x74,0x2, 0xac,0xbd,0x59,0x35,0x31,0xd6,0x80,0xf, 0x12,0x44,0x28, +0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x31,0xd6,0xb, 0xd0,0xbc,0xed, +0x28,0x2, 0x41,0x65,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x43,0xf0,0xa9,0xc0, +0xc4,0x7e,0x1f,0x38,0xc0,0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x38,0xc0,0x79,0xf1,0x0, +0x90,0x6d,0x33,0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0x8, 0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x10,0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22, +0x1b,0x1a,0x50,0x7e,0x1f,0x38,0xc0,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5, +0xfd,0x7a,0x71,0xfe,0x22,0xca,0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12, +0x43,0x5f,0x74,0xf, 0x12,0x43,0xeb,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe, +0x12,0x43,0x5f,0x74,0xc, 0x12,0x43,0xeb,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, +0x7e,0x70,0xf8,0x12,0x43,0x5f,0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, +0x38,0xb, 0x12,0x45,0x6, 0x7c,0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17, +0xe4,0x93,0xb4,0x1, 0xe, 0xbe,0xa0,0x7, 0x28,0x9, 0x12,0x45,0x6, 0xa, 0x77,0x2e, +0x74,0x0, 0x7, 0x74,0xe, 0x7c,0x7f,0x12,0x43,0x5f,0x74,0x7, 0x12,0x43,0xeb,0x7c, +0xfb,0x5e,0xf0,0xfb,0x90,0x60,0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c, +0xf7,0x74,0x7, 0x7c,0x7f,0x12,0x43,0xf0,0xda,0x79,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x12,0x43,0x5f,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24, +0x7e,0x24,0x0, 0x12,0x12,0xb7,0xc7,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74, +0x3, 0x7e,0x71,0x27,0x12,0x43,0x5f,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x43,0x5f,0x74, +0xc, 0x7e,0x71,0x30,0x12,0x43,0xf0,0x22,0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0xa, +0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e, +0xf, 0x38,0xc4,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0x12,0x5e, +0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34, +0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x45,0x15, +0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6, +0x22,0x12,0x47,0xf8,0xc2,0x3, 0x12,0xb6,0x57,0xc2,0x5, 0x12,0x45,0x51,0xc2,0x3, +0x12,0x47,0x21,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0xeb,0x7a,0x1b,0xb0,0x74,0xf, +0x6c,0x77,0x12,0x43,0x5f,0xe5,0xfc,0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x43,0xf3, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x2a,0x12,0x44,0x6e,0x12,0xb6, +0xf, 0x2, 0xb6,0xc4,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x1a,0x12,0x44,0x6e,0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0xc, 0x12,0x44,0x6e,0x2, 0xb6,0xbe,0x74, +0x1, 0x7a,0xb3,0x33,0xff,0x22,0xa, 0x3a,0x2e,0x34,0x0, 0x3, 0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0x5f,0x7a,0x61,0xfc,0x12,0x43,0xf3, +0x12,0x46,0x68,0xd2,0x3, 0x12,0x47,0x21,0x12,0x45,0x6b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x45,0x6b, +0x2, 0x13,0x96,0x12,0x47,0xf8,0xc2,0x5, 0x2, 0x45,0x51,0xd2,0x5, 0x12,0x45,0x51, +0x74,0x1, 0x22,0x12,0x45,0xcf,0x12,0x91,0x8, 0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0xc0,0xd5,0x12,0x44,0x91,0x74,0x1, 0x12,0x46,0x7, 0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x45,0x30,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x45,0x5a,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x45,0xcf,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x46, +0x7, 0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x45,0x5a,0x74, +0x81,0x7a,0xb3,0x39,0x2, 0x22,0x80,0x1d,0x12,0x45,0xcf,0x12,0x47,0xff,0x68,0x5, +0xc2,0x4, 0x12,0x45,0x5a,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x17, +0x15,0xe4,0x12,0x46,0x7, 0x20,0x93,0xe0,0x12,0x45,0xcf,0xa9,0xd1,0xcd,0xa9,0xc5, +0xea,0x74,0x2, 0x2, 0x46,0x7, 0x22,0x7c,0xab,0x7e,0xb3,0x39,0x2, 0xb4,0x81,0x38, +0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf, +0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, +0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87, +0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0x2, 0x22,0xd2,0x3, +0x80,0x12,0x30,0x3, 0xc, 0x12,0x47,0xff,0x68,0x7, 0xc2,0x3, 0xc2,0x4, 0x12,0x45, +0x5a,0x12,0x45,0xd6,0x30,0x17,0xeb,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb, +0xd2,0x3, 0x12,0xb6,0x57,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, +0xa9,0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74, +0x41,0x12,0x45,0x15,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda, +0xf8,0x22,0xe4,0x12,0x46,0xf0,0x12,0xb6,0x60,0x12,0x26,0x57,0x12,0xb6,0xdb,0x12, +0x43,0x65,0x12,0xb6,0x5, 0x12,0xb6,0x77,0x12,0x0, 0x4a,0x12,0xb6,0x83,0x12,0x7e, +0xa0,0x12,0xb6,0x93,0xd2,0xaf,0x12,0x47,0x8a,0x12,0xb8,0x1e,0x12,0x43,0xfa,0x12, +0x46,0x68,0x7e,0x8, 0x3, 0xf1,0x12,0xa9,0xa3,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34, +0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0xa9,0xd0, +0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x45,0x51,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75, +0xc2,0xc, 0xd2,0x3, 0x12,0x47,0x21,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1, +0x22,0xa2,0x3, 0xa9,0x97,0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x7e,0x34,0x36,0xe1, +0x30,0xd, 0x4b,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x4f, +0x9, 0x53,0x0, 0x3, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12, +0x47,0x7f,0x7a,0x27,0x2a,0x53,0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a, +0x27,0x2a,0x5a,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a, +0x5c,0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0x45,0xc, 0x7a,0x37,0x2a,0x62,0x22,0xa, +0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12, +0x43,0xeb,0x7c,0x7b,0x12,0x43,0xf3,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e, +0x24,0x0, 0xef,0x7e,0xf, 0x38,0xc0,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e, +0xf, 0x38,0xc0,0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x38,0xc0,0x79, +0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x38,0xc0,0x79, +0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8a,0x7e, +0x34,0x6a,0xd1,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e, +0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8e,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x12,0xc0,0xf8,0x12,0xc0,0xef,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x48,0x56,0x12,0x48,0x30,0x74,0x50,0x7a,0xb3,0x37,0xd0,0x7e,0x24, +0x3, 0x20,0x12,0x3f,0xcb,0xe4,0x12,0xc0,0x27,0x6d,0x33,0x7a,0x37,0x39,0x4, 0x22, +0x7e,0x73,0x2b,0x62,0x7a,0x73,0x37,0xcf,0x22,0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37, +0xca,0x7e,0x73,0x37,0xce,0xbe,0x73,0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12, +0x48,0x56,0x12,0x48,0x30,0x22,0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x7e,0x73, +0x2b,0x1f,0x7a,0x73,0x37,0xbe,0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x7e,0x73, +0x2b,0x14,0x7a,0x73,0x37,0xbf,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, +0x12,0x48,0xe8,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80, +0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x48,0xe8,0x40, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c, +0xdd,0x7c,0xbd,0x12,0x8d,0xb3,0x12,0x48,0x6e,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x37, +0xbe,0x12,0x49,0x4, 0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x12,0x48,0x30,0x7a, +0xd3,0x37,0xa6,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26, +0x33,0xbc,0xbe,0x22,0x30,0x3, 0x3, 0x12,0x48,0x6e,0xa2,0x4, 0x92,0x5, 0x12,0x49, +0xc3,0x2, 0x49,0x4, 0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x22,0x74,0x40,0x12, +0x6e,0x8b,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x48,0xf4,0x80,0x1c,0x74,0x1, 0x12, +0x49,0x47,0x7e,0x43,0x37,0xbb,0x7e,0x50,0x64,0xac,0x45,0x12,0x87,0xf8,0x7a,0xb3, +0x2b,0x1f,0x7e,0xf, 0x38,0xd9,0x12,0x4d,0x9b,0x12,0x49,0x4, 0x7e,0x73,0x2b,0x1f, +0x7a,0x73,0x37,0xbe,0x2, 0x48,0x6e,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14, +0x12,0xc0,0x42,0x7e,0xc0,0xa, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x1f,0x38,0xd9,0x12,0x90,0x58,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, +0x12,0x49,0xb7,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12, +0x49,0xb7,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x49,0xb7,0xb, +0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x38, +0xd9,0x12,0x8f,0xfb,0x7d,0x73,0x7e,0x1f,0x38,0xc8,0x69,0x31,0x0, 0x1a,0x7a,0x73, +0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, 0x1a,0xb, +0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x37,0xb1, +0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5,0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3, +0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a,0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35, +0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x31,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x4e,0x5f,0x6c,0xff,0x80,0x35,0x12,0x4c, +0x40,0x6c,0xee,0x80,0x19,0x7e,0x11,0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac, +0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x10,0x12,0x4c,0x47,0xe5,0x2e, +0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12,0x4c,0x56,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34, +0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xc5,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34, +0x10,0x0, 0x12,0x4c,0x7c,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x78,0x12,0x4c,0x40, +0x6c,0xee,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2a,0xbc,0xbe,0x38,0xe6,0xe5,0x2a, +0x12,0x4c,0x56,0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x60,0xe5,0x2a,0xbe,0xb1,0x2d, +0x50,0x35,0x12,0x4c,0x40,0x7e,0xe1,0x2a,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2d, +0xbc,0xbe,0x38,0xe6,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5,0x2d,0xa, 0x1b,0x6d,0x0, +0x9f,0x1, 0x12,0x4c,0x5a,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x3, 0x62,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x82,0xe5,0x2d,0xa, 0x1b,0x6d, +0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x1f,0x7, 0x6c,0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, 0x9d,0x15,0xad,0x12, +0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21, +0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xcc, +0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x7, 0x6c,0xff,0x80, +0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x60,0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10, +0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x60,0xe5,0x2a, +0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x62,0x2e,0x14,0x10, +0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x62,0xb, 0xf0,0xe5,0x2b,0xbc, +0xbf,0x38,0x9e,0x7e,0x73,0x37,0xb3,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14, +0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x5, 0x7d,0xe3,0x7a,0xe5,0x35, +0x7e,0x73,0x37,0xb4,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d, +0x1f,0x12,0x1f,0x5, 0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, 0xac,0xbf,0x49,0x45, +0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x34,0x0, 0x80,0x8, +0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xda, +0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x60,0xbe,0x45,0x35,0x28, +0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x60,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65, +0x3, 0x60,0x49,0x45,0x3, 0x62,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35, +0x3, 0x62,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x62,0xb, 0xf0,0xe5,0x2b, +0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x31,0x12,0x4d,0x9b,0xda,0x3b,0x22, +0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a, +0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f, +0x7, 0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x1f,0x5, 0x7e,0xa1,0x2c,0x74, +0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x4e,0x5f,0x7e,0x1f,0x38,0xf3, +0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x6, +0x7e,0x38,0x38,0x88,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x87,0x70,0xe, 0x7e,0xb3,0x38,0x85,0x70,0x8, +0x74,0x1, 0x7a,0xb3,0x38,0x87,0xa1,0x57,0x7e,0xb3,0x38,0x87,0x70,0x6, 0x74,0x1, +0x7a,0xb3,0x38,0x87,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0, +0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61, +0x59,0x12,0x23,0x9e,0x7a,0x35,0x2e,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0xa6,0x56, +0x75,0x2c,0x0, 0x80,0x16,0x12,0x4c,0x7c,0x12,0x4d,0x84,0xbe,0x35,0x2a,0x8, 0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x84,0x7a,0x35,0x2a,0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c, +0x38,0xe3,0x12,0x4d,0x93,0x40,0x25,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x1e,0x5, 0x1c, +0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c,0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20,0xb9,0x1b,0xfd,0x74,0x2, 0x12,0x0, +0x1e,0x12,0x4d,0x93,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x38,0xf2,0xe4,0x7a,0xb3,0x38, +0x87,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, 0x21,0x0, 0x7f,0x13,0x2d,0x35,0xb, +0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35,0x2a,0x22,0x12,0x4d,0xa5,0xb, 0x34, +0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x12,0xc1,0x3a,0x4c,0xaa, +0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c,0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4, +0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60, +0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e,0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, +0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc, +0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, +0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12,0x1f,0x7, 0x7f,0x1, 0xb, 0xc, 0x7e, +0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f,0x7, 0xbe,0x34,0x0, 0xfa,0x28,0x4, +0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, 0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d, +0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e,0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e, +0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27, +0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e, +0x34,0x0, 0x38,0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12, +0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, +0x12,0x4e,0x8d,0x80,0x2, 0xe4,0x22,0x12,0x4e,0x72,0x74,0x1, 0x22,0x12,0xc0,0x9f, +0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0x12,0x7f,0x6f,0x38,0x2, +0xe4,0x22,0x12,0x7f,0x67,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x4e, +0xb4,0x2, 0x4e,0x7d,0x7e,0xd7,0x2b,0xd, 0xbe,0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12, +0x7e,0xf8,0x12,0x4e,0xe0,0x7a,0xd7,0x2b,0xd, 0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e, +0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, 0x12,0x4f,0xaf,0x74,0x1, 0x22, +0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b,0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a, +0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x4e,0xe0,0x12,0xc0,0xe7,0x12,0x29,0x6f, +0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x20,0xde,0x7e,0xd0,0x7, 0x12,0x26,0x57,0x6c, +0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x12,0x4f,0xf0,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, +0x3c,0xbd,0x32,0x48,0xde,0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x7e,0xb3, +0x2a,0x73,0x7c,0x7e,0x12,0x7b,0x31,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49, +0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0x4f,0xf0,0x5c,0x7b,0x7a, +0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe, +0xd0,0x0, 0x58,0x88,0x12,0x7b,0x39,0x74,0x2, 0x12,0xc1,0xa, 0x12,0x50,0x51,0x74, +0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2a,0xfa,0x12,0x4e,0xe0,0xda,0x3b,0x22,0x74,0x2, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x12,0x50,0x51,0x74,0x2, 0x12,0x0, 0x1e,0x74, +0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x4f,0xc1,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, +0x94,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x2e,0x34,0x20,0x73,0x12, +0x91,0x6d,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x38,0xc0,0x2d, +0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x74,0xbc,0x6a,0x38,0xd6,0x22, +0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, +0x30,0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x4e,0xe0,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, +0xfd,0x7e,0xb3,0x37,0xe0,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc1,0xa, 0x12, +0x50,0xd4,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xe1,0x7e, +0xb3,0x37,0xe0,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x3f,0x67,0x80,0x7, 0xe4, +0x12,0x0, 0x1e,0x12,0x3f,0x49,0x12,0x3b,0x15,0x7e,0xb3,0x2a,0xfc,0x2, 0x50,0x51, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x3f,0xe9,0x7e,0xa3,0x2a,0x73, +0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x62,0x2a,0xdc,0xa, 0x26, +0x12,0x51,0x4b,0x93,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x50,0xca, +0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xde,0x6c,0xee,0x80,0x1a,0xa, 0x2e, +0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12, +0x50,0xca,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30, +0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba, +0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27,0x2a,0xfe,0x7e,0x29, +0xb0,0xa, 0x26,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xe9,0x7e, +0xa3,0x2a,0x73,0x7e,0x63,0x2a,0x74,0x6c,0xee,0x80,0x1f,0xa, 0x2e,0x9, 0x72,0x2a, +0xdc,0xbe,0x70,0x1c,0x50,0x12,0xa, 0x27,0x12,0x51,0x4b,0x93,0x7c,0x7b,0x7e,0xb3, +0x2a,0xfb,0xa, 0x27,0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xdd,0x6c,0xee, +0x80,0x17,0xa, 0x3e,0x9, 0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a, +0xfb,0xa, 0x27,0x19,0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e, +0x30,0xe, 0xac,0x3e,0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11, +0xf8,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0x73,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7a,0xb3,0x34,0xc4,0x7c,0xbf,0x6c,0x77,0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x51,0x4f,0x93,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff, +0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0xca, +0xf8,0x6c,0xaa,0x6d,0x33,0x7e,0x24,0x7f,0xff,0x7e,0xf0,0x1, 0x80,0x32,0xa, 0x1f, +0x7e,0xb3,0x2a,0x6e,0xa, 0xb, 0x2d,0x1, 0x3e,0x4, 0x49,0x10,0x4, 0xfc,0xbe,0x14, +0x3, 0xe8,0x8, 0x1a,0xb, 0xa0,0xbd,0x13,0x8, 0x4, 0x7d,0x31,0x80,0x10,0xbd,0x12, +0x58,0xc, 0x7d,0x21,0xbe,0x24,0x0, 0x0, 0x18,0x4, 0x7e,0x24,0x0, 0x1, 0xb, 0xf0, +0x7e,0xb3,0x2a,0x6f,0xa, 0xb, 0x1b,0x4, 0xa, 0x1f,0xbd,0x10,0x48,0xc0,0x7e,0xb3, +0x34,0xa1,0x7a,0xb3,0x36,0xf3,0x7a,0xa3,0x36,0xf7,0xe4,0x7a,0xb3,0x36,0xf5,0xbe, +0xa0,0xb, 0x78,0x18,0x9d,0x32,0xbe,0x34,0x5, 0xdc,0x58,0x10,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x1, 0x5e,0x58,0x6, 0x74,0x1, 0x7a,0xb3,0x34,0xa1,0x7e,0x73,0x34,0xa1, +0xbe,0x70,0x0, 0x28,0x3e,0x6c,0xff,0x80,0x35,0x7c,0xbf,0x12,0x97,0xfc,0x60,0x22, +0x74,0x22,0x7a,0xb3,0x36,0xf4,0x7e,0xb3,0x34,0xc4,0x4, 0x12,0x51,0x57,0x7e,0x73, +0x34,0xc4,0xbe,0x70,0x5, 0x40,0x15,0xe4,0x7a,0xb3,0x34,0xc4,0x7a,0xb3,0x34,0xa1, +0x80,0xa, 0xe4,0x12,0x51,0x57,0x74,0x33,0x7a,0xb3,0x36,0xf5,0xb, 0xf0,0x12,0x52, +0x66,0x38,0xc6,0xda,0xf8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xca,0xd8,0xca, +0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x3c,0xe4,0x7a,0xb3,0x1f,0x58,0xe5,0x1d, +0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60,0xc, 0x12,0x8c,0x87, +0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x10,0x6d,0x88,0x7a,0x87,0x37, +0xfd,0x61,0xa0,0x12,0x93,0x91,0x60,0x12,0x7e,0x34,0x62,0xe, 0x12,0x87,0xc4,0x7a, +0x87,0x37,0xf3,0x12,0x54,0x2b,0x7a,0x87,0x37,0xfd,0x7e,0x87,0x37,0xf3,0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x7b,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x52,0x7c,0xbd, +0x7c,0x7e,0x12,0x55,0xb9,0x7d,0x93,0x7e,0x87,0x37,0xfd,0xbd,0x89,0x50,0x4, 0x7a, +0x97,0x37,0xfd,0x7e,0x87,0x38,0x3c,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x3c,0xe5, +0x1d,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x37,0xff,0x12,0x54,0x4e,0x50,0x7, 0x12, +0x54,0x45,0xd2,0x3, 0x80,0x2f,0x7e,0x8, 0x37,0xff,0x7e,0x18,0x1f,0x52,0x12,0x57, +0x0, 0x50,0x22,0x80,0x10,0x12,0x54,0x2b,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f,0x52, +0x12,0x91,0x86,0x50,0x10,0x12,0x54,0x45,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52, +0x12,0x93,0x6b,0xd2,0x3, 0xb, 0xf0,0x12,0x52,0x66,0x38,0x80,0x30,0x3, 0x37,0x6c, +0xff,0x80,0x20,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x58,0x12,0x54, +0x4e,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x54, +0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdb,0x75,0x1d,0x0, 0x7e,0x34,0x62,0xe, 0x12, +0x23,0x9e,0x7a,0x37,0x37,0xf3,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, 0xac,0x67,0xb, +0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x37,0xff,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x37,0x37,0xf3,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93,0xa, 0x3b,0xbe, +0x37,0x37,0xfd,0x38,0x40,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37,0x38,0x3c,0x38, +0x34,0x90,0x60,0x51,0x12,0x54,0x33,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, +0x24,0x90,0x60,0x50,0x12,0x54,0x33,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, +0x14,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x54,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf4,0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0xa2,0x3, 0x92,0x10,0x12, +0x56,0xe9,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xb, 0x70,0x1b,0x7e, +0xb3,0x28,0xa8,0x70,0x15,0x12,0xc1,0x2a,0x68,0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0, +0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x51,0x5f,0x22,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0xd5,0x26,0xfa,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x7c,0xbd, +0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f, +0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0, +0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, +0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38, +0xc9,0xa2,0x4, 0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28,0x99, +0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73, +0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f, +0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, +0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x55,0xa6,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3, +0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e, +0xb3,0x26,0x83,0x70,0x40,0x12,0x8f,0xe3,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x55,0xa6,0x49,0x2, +0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49, +0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, +0xf0,0xbc,0x7f,0x38,0xc9,0x12,0xb1,0x8e,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28, +0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28, +0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x55,0xaf,0x49,0x25, +0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x0, 0xbe,0x37,0x28,0x9d,0x8, +0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdc,0x6c, +0xff,0x80,0x9, 0x12,0x55,0xaf,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf2,0xda,0x79,0xda,0xd8,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0x7c, +0xbf,0x12,0x37,0x6f,0x74,0x2, 0xac,0xbf,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f, +0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c,0xcc, +0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c, +0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14, +0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12, +0x20,0xde,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a, +0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1c,0x75,0x26,0x0, +0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56,0xd3,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf1,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xdf,0x7c,0xec, +0x80,0x23,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80,0xa, 0x12,0x91,0xd5, +0x70,0xd, 0x12,0x56,0xd3,0xb, 0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5, +0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd8,0x1a,0x3c,0xb, 0x34,0x7c,0xe7, +0x80,0x1c,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56, +0xd3,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf1,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73, +0x2a,0x6e,0xbc,0x7e,0x18,0xdc,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x21,0x75,0x26, +0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xa, 0x12,0x91,0xd5,0x70,0xd, 0x12,0x56,0xd3,0xb, +0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e, +0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd7,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, +0xda,0x3b,0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35,0x24,0x22,0x12,0x57, +0x32,0x12,0x51,0x9f,0x7a,0xb3,0x2a,0xc, 0x22,0x30,0x10,0x13,0x12,0xc1,0x1a,0x68, +0x6, 0x7e,0xb3,0x39,0xb, 0x60,0x8, 0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x37,0xfb,0x22, +0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f, +0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x54,0x52,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76, +0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9, +0xc3,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34,0xa2,0x6c,0x33,0x80,0x3d,0x7e, +0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc, +0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32, +0x12,0x35,0x67,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3, +0x34,0xa2,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf, +0x2, 0x57,0x83,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac, +0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c, +0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26, +0xfb,0xa, 0x28,0xa, 0x31,0x12,0x35,0x67,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x35, +0x67,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0, +0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3e,0xbe,0xb0,0x0, 0x28,0x12,0x14, +0x7a,0xb3,0x35,0x3e,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2a, +0x5a,0x7e,0xb3,0x36,0xec,0x70,0x58,0x7e,0xb3,0x39,0xb, 0x70,0x52,0x7e,0xb3,0x36, +0x71,0x70,0x4c,0x7e,0x37,0x37,0xfd,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28, +0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f, +0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3, +0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, +0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x35,0x3e,0xda, +0xf8,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e,0x7e,0xf3,0x2a,0x6d,0xac,0xf7, +0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x20,0xde,0x7e,0xb3,0x37,0xb7, +0xb4,0x1, 0x64,0x7e,0x73,0x37,0xb8,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c, +0x12,0x26,0x57,0x12,0x28,0x62,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49, +0x33,0xd, 0xc8,0x12,0x21,0x0, 0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14, +0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34, +0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xb8, +0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, +0xd, 0xc8,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0x4, 0xe4,0x2, 0x58,0xe8,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0x12,0x68,0x10,0x12,0x7d,0x94,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0x74,0x12,0xb6,0xe2, +0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x91,0x18,0x12,0x47,0x2c, +0x12,0x28,0x62,0x50,0xde,0x12,0xab,0xdb,0x12,0x75,0xe9,0x7e,0xb3,0x37,0x5, 0xb4, +0x1, 0x4, 0xe4,0x12,0x58,0xe8,0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x5e,0xaa,0x40, +0xc2,0x12,0x88,0x5f,0x12,0x5e,0xaa,0x40,0xba,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x0, 0x6e,0x12,0x5f,0x2f,0x12,0x5f,0x83,0x12,0x5b,0x94,0x12,0x96,0x24,0x12,0x5e, +0xc2,0x12,0x5f,0xcd,0x12,0xaa,0xe6,0x12,0x87,0x74,0x7e,0xb3,0x36,0xf1,0xbe,0xb0, +0x88,0x68,0x3, 0x12,0x59,0x77,0x12,0x67,0xfa,0x12,0x26,0x66,0x12,0x62,0xa5,0x80, +0x82,0x12,0x2f,0xee,0x2, 0x58,0xdc,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x12,0x35, +0xd3,0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, +0x7e,0xb3,0x2a,0x7, 0x70,0x8, 0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0x61,0x6b,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x28,0x80,0x4, 0x7e,0x68,0x32,0xea,0x7f,0x6, 0x12,0x7e,0xef, +0x7e,0x73,0x2a,0x4, 0x7a,0x6b,0x70,0x6c,0xdd,0x61,0x1c,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x5e,0x3d,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x61,0x1a,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x61,0x1a,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x9e,0xec,0x50,0x2, 0x61,0x1a,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3, +0x2a,0x9, 0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xd6,0x6d,0x22,0x74,0x1, 0x12,0x7f,0xd4,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xe0,0x6d,0x22,0x74,0x10,0x12,0x7f,0xd4,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xd6,0xf5,0x25,0x9, 0xb3,0x32,0xe0,0xf5,0x26,0xa, 0x3c,0x12,0x5e, +0x3d,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xd6,0x19,0xb3,0x32,0xe0,0x12, +0x35,0xd3,0x7e,0xb3,0x2a,0x64,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd, +0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac, +0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x2c,0x75,0x27, +0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x6a,0x54,0xf, +0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x66,0x49,0xa3,0x33,0x68,0x80,0xc, 0x5, 0x27, +0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, 0xff,0x5e,0xa4, +0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5, +0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0, +0xe5,0x28,0xa, 0x5b,0x12,0xb9,0x5c,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e, +0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13, +0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26, +0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x4d, +0xbc,0x7d,0x28,0x2, 0x21,0xbb,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x31, +0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38, +0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0xa, 0xb2,0xe, 0x12,0x7e,0x81,0x74,0x1, 0x12,0x58, +0xe8,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x5e,0x61,0xe4,0x7a,0xb3,0x2a, +0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, 0xe4,0x12,0x58,0xe8,0x12, +0x5f,0xc2,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x66,0x12,0x20,0xb9,0x1b, +0xfd,0x4c,0xff,0x78,0xc, 0x12,0x73,0xe5,0x7e,0x8, 0x33,0x66,0x74,0xff,0x12,0x20, +0xde,0xda,0x3b,0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70, +0xff,0x12,0x5e,0x8b,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f, +0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe2,0x7e,0x73,0x2a,0x2, +0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x2, 0xa1,0xab,0x6c,0xaa,0x80,0x10, +0x7e,0x44,0x7f,0xff,0x12,0x5e,0x95,0x79,0x40,0x0, 0x14,0x12,0x5e,0x45,0xb, 0xa0, +0x12,0x5e,0x25,0x38,0xeb,0xa1,0xab,0x7e,0xb3,0x34,0x4f,0x70,0x3d,0xbe,0x70,0x0, +0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12, +0x5e,0x95,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30, +0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0, +0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xce,0xa1,0xab,0x6c,0xaa,0x80,0x17,0x12,0x5e, +0x57,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe4,0x6c,0xaa,0x80,0x41,0x6c,0xff, +0x80,0x36,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe, +0x34,0x7f,0xff,0x68,0x21,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x18,0x12,0x5e, +0x35,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x5e,0x4e, +0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xc5,0xb, 0xa0,0x7e, +0xb3,0x34,0x4f,0xbc,0xba,0x38,0xb7,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x9, 0xb3,0x1f, +0x46,0xb4,0xff,0x1d,0x6c,0xff,0x80,0x14,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x9, 0x12,0x5e,0x4e,0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38, +0xe7,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xd3,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac, +0x7a,0x49,0x43,0x28,0xae,0x12,0x5e,0x35,0x59,0x42,0x15,0x76,0x49,0x33,0x28,0xb0, +0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xde,0x7e,0x34, +0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e,0x7e,0x73, +0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80, +0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0x12,0x5e,0x2d,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x5e,0x8b,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x5e,0x45,0xb, 0xa0,0x7e,0x63,0x2a,0x2, 0xbc,0x6a, +0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68, +0x13,0x12,0x5e,0x57,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c, +0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x7e,0xf3,0x2a,0x2, 0x7a, +0xf3,0x34,0x4f,0x6c,0xaa,0x80,0x66,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2b, +0x12,0x5e,0x9f,0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0xa, 0x3a,0x2d,0x3d, +0x7d,0x2c,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x2e, +0xa5,0xbb,0x0, 0x2a,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x23,0x12,0x5e,0x9f,0xbe,0xb0, +0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30, +0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0xa, 0x3a, +0x2d,0x3d,0x7d,0x2c,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0x12,0x5e,0x25, +0x38,0x95,0xda,0xf8,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0x90,0x60,0x99, +0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0xb0,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40,0x0, 0x28,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x22,0x6c,0xaa,0x80,0x20,0x74,0x3, 0x12,0xa9,0x99,0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0xa, 0x12,0x5e,0x57,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79, +0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x22,0x7e,0x50,0x9, 0xac,0x5a, +0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, +0x3a,0x2d,0x3d,0x7d,0x2c,0x29,0xb1,0x0, 0xa, 0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91, +0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x9b,0xdf,0x28,0x2, 0xd2,0x3, 0xa2, +0x3, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x3, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x5f,0xc2,0xca,0x59,0x7e,0x18,0x28, +0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xb9,0x1b,0xfd,0x90,0x61,0x35,0xe4,0x93,0xbe, +0xb0,0x0, 0x28,0x28,0x6c,0xff,0x80,0x1f,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae, +0x12,0x80,0x16,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12, +0x64,0xdb,0x12,0xab,0x9b,0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xdc,0xda,0xf8,0x22,0x2, +0x5f,0x32,0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe, +0x12,0x37,0x6f,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x23,0x7e,0xc4, +0x0, 0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0xb, +0xf0,0xb, 0xe0,0x12,0x9c,0xf6,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, +0xda,0x79,0x22,0x12,0x9d,0xda,0x2, 0x5f,0x89,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, +0x38,0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x35,0x40, +0x28,0x14,0x7e,0xb3,0x35,0x40,0x4, 0x7a,0xb3,0x35,0x40,0x7a,0xa3,0x2a,0x2, 0x80, +0x5, 0xe4,0x7a,0xb3,0x35,0x40,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a, +0xb, 0x22,0x90,0x60,0x99,0xe4,0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x12,0x68,0x38, +0x2, 0x5f,0xd3,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x34,0xa2,0x4c,0xaa,0x78, +0x3, 0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x34,0xad,0x7e, +0x73,0x34,0xae,0xbe,0x73,0x34,0xad,0x28,0x4, 0x7a,0x73,0x34,0xad,0x22,0xff,0xff, +0x70,0x8f,0x0, 0xff,0x53,0xac,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x45,0x37,0x31,0x1, 0xc3,0x1, 0x45,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x19,0xe6,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0x18,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, +0x2, 0x1, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x37,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x0, 0x4, 0x5a,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x65,0x40,0xd, 0x18,0x25,0x19,0x2e,0x6, 0x80,0x19,0x2e,0x6, +0x80,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x33,0x33,0x1, 0x98,0x1, 0x98,0x0, +0xde,0x0, 0xe0,0x5, 0x0, 0x38,0x34,0x1, 0xa0,0x1, 0xa0,0x0, 0xde,0x0, 0xe2,0x0, +0xb4,0x0, 0xa0,0x0, 0x96,0x1, 0x18,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, 0x68,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15,0x0, 0x1, 0x54,0x1, 0x0, 0x19, +0x1, 0x53,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0x10,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x37,0x2, 0x5a,0x65,0x20,0x28,0x2, 0x2c,0x2e,0x20,0x3c, +0x2, 0x5b,0x66,0x20,0x46,0x2, 0x42,0x49,0x30,0x37,0x2, 0x5a,0x65,0x20,0x37,0x2, +0x5a,0x65,0x20,0x37,0x2, 0x5a,0x65,0x20,0x37,0x2, 0x5a,0x65,0x20,0x4, 0x5, 0x2e, +0x2f,0x30,0x31,0x32,0x4, 0x0, 0xd2,0x2, 0x30,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x0, 0x78,0x0, 0x78,0x14,0x8, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, 0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x8, 0x37,0xf3,0x12,0x62,0xdf,0x7e,0x8, 0x37,0xfb, +0x12,0x62,0xdf,0x12,0x62,0xf4,0x12,0x62,0xfb,0x2, 0x62,0xbc,0x7e,0x37,0x37,0xf3, +0xbe,0x34,0x0, 0x0, 0x28,0x18,0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x50,0xf, 0x7e, +0xb3,0x37,0x31,0x70,0x9, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0x22,0xb, +0xa, 0x30,0xe5,0x4e,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33, +0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x2b,0xb7,0x2, 0x62,0xdf,0x7e,0x8, 0x38,0xe6,0x2, +0x62,0xdf,0x6d,0x33,0x7a,0x37,0x38,0x83,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e, +0xb3,0x2a,0x3, 0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28, +0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68, +0x17,0x7e,0x47,0x2b,0xb7,0x4d,0x44,0x78,0xf, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3, +0x38,0x85,0x7a,0xb3,0x37,0x6, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e, +0x37,0x2b,0xb7,0x7a,0x37,0x2f,0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37, +0x2b,0xb7,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37, +0x2f,0x98,0x7e,0x27,0x2f,0x9a,0x12,0x64,0x1a,0x81,0x13,0x80,0x0, 0x12,0xbd,0xdd, +0x81,0x13,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57, +0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xbd,0x78,0x12,0x64,0x16,0x74, +0x1, 0x7a,0xb3,0x2f,0x80,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88, +0x9e,0x27,0x2f,0x90,0x7e,0x14,0x62,0x8a,0x12,0x64,0xd3,0xbd,0x23,0x38,0x13,0x7e, +0x27,0x2f,0x96,0x9e,0x27,0x2f,0x8e,0x7e,0x14,0x62,0x8c,0x12,0x64,0xd3,0xbd,0x23, +0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a, +0xc7,0x2f,0x98,0x7a,0xd7,0x2f,0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d, +0x2d,0x7e,0x17,0x2b,0xbb,0x7e,0x7, 0x2b,0xbd,0x12,0x66,0xce,0xa, 0x2b,0x7e,0x73, +0x2f,0x7f,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0x64,0x16,0x7a,0xc7,0x2b,0xbb,0x7a, +0xd7,0x2b,0xbd,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24, +0x12,0x67,0xca,0x7d,0x31,0x12,0x85,0xfd,0x2, 0x64,0x2b,0x7e,0x3, 0x2f,0xa8,0xbe, +0x0, 0xf0,0x50,0x2, 0x81,0xc4,0x81,0xb9,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0, +0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34, +0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b, +0xc1,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0x66,0xce,0x7c,0x1b,0x7e,0x3, +0x2f,0x7f,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b, +0xbf,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x1f,0x8c,0x7e,0x34,0x1f,0x34,0x7e,0x30, +0x4, 0xac,0x39,0x2e,0x14,0x2b,0xbf,0x74,0x4, 0x12,0x1f,0x8c,0xb, 0x80,0x7e,0x3, +0x2f,0xa8,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8, +0x7e,0x3, 0x2f,0x7f,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec, +0x40,0x2, 0x81,0x38,0x22,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e, +0x14,0x61,0x49,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e, +0x14,0x61,0x43,0x12,0x83,0x62,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22, +0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83, +0x2a,0x70,0x12,0x87,0xd4,0xbe,0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d, +0x2e,0x7e,0x14,0x61,0x47,0x12,0x64,0xd3,0x12,0x66,0x10,0x90,0x61,0x45,0x12,0x66, +0x7, 0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0x12,0xc1,0x3a,0xbe,0xa0,0x0, 0x28, +0x32,0x7d,0x14,0x9e,0x14,0x0, 0x3f,0xbd,0x1e,0x38,0x13,0x12,0x66,0xb8,0x40,0xe, +0x12,0x64,0xc5,0x12,0x65,0xfa,0x48,0x32,0x7f,0x10,0x1b,0x1c,0x80,0x2c,0x12,0x66, +0xb8,0x50,0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x64,0xcb,0x12,0x66,0x10,0x7d, +0x1f,0x80,0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x66,0xb1,0xbd,0x5e,0x38,0x16,0x12,0x64, +0xc5,0x12,0x65,0xfa,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10, +0x6d,0x0, 0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x66,0xb1,0xbd,0x5e,0x28, +0x68,0x7d,0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d, +0x35,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d, +0x22,0x7e,0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1e,0xfc,0x12, +0x66,0x14,0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, +0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x66,0x7, +0x58,0x4, 0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76, +0x7c,0x65,0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x36,0x69,0x7a, +0x73,0x36,0xdf,0x7e,0x27,0x38,0xd6,0x7e,0x14,0x61,0xc8,0x12,0x64,0xd3,0x1e,0x34, +0xbd,0x32,0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x14,0x61,0xc8,0x12,0x64, +0xd3,0xbd,0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x36,0x67,0x12,0x67,0x62,0x7e,0x37,0x36, +0x6f,0xbd,0x32,0x50,0x4, 0x7a,0x27,0x36,0x6f,0x12,0xc1,0x12,0x38,0xa, 0x12,0x8f, +0xf3,0x38,0x5, 0x12,0x8f,0xeb,0x28,0x3d,0x12,0x67,0x69,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x36,0x67,0x4, 0x7a, +0xb3,0x36,0x67,0x7e,0x73,0x36,0x67,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3, +0x36,0x67,0x12,0xc0,0x95,0x7a,0xb3,0x36,0xdc,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x67, +0x7d,0x32,0x2, 0xad,0xac,0x2, 0x66,0xa8,0x12,0x67,0xc0,0xe4,0x7a,0xb3,0x36,0x75, +0x22,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4, +0x60,0xd1,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0xbd,0x1e,0x22,0x7d,0x51, +0x7d,0x12,0x9d,0x35,0x12,0x21,0x0, 0x7c,0xa7,0x12,0x67,0xeb,0x7c,0xb7,0xbc,0xba, +0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x67,0x15,0x50, +0x21,0x7e,0x54,0x62,0x5a,0x12,0x67,0x15,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x64, +0xd3,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x5e,0x12,0x64,0xd3,0xbd,0x32,0x28,0x2, +0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12, +0x66,0x1b,0x2, 0x67,0x25,0x7e,0xb3,0x36,0x69,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36, +0x71,0x7e,0xb3,0x36,0xdf,0x70,0x3, 0x12,0xaf,0x2f,0x7e,0xb3,0x36,0x71,0xb4,0x1, +0xc, 0x74,0x3, 0x12,0x67,0x59,0x12,0x23,0x9e,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x67, +0x59,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x34,0xae,0x7e,0x34,0x61, +0x5b,0x22,0x74,0x2, 0x7a,0xb3,0x36,0x69,0x22,0x7e,0xb3,0x36,0x75,0xb4,0x1, 0x3, +0x2, 0x67,0x62,0x7e,0xb3,0x36,0xdb,0x4, 0x7a,0xb3,0x36,0xdb,0x7e,0xb3,0x36,0x69, +0xb4,0x2, 0x18,0x7e,0xb3,0x36,0xda,0x4, 0x7a,0xb3,0x36,0xda,0xb4,0x1, 0x6, 0x74, +0x1, 0x7a,0xb3,0x36,0xdb,0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x73,0x36,0xda,0xbe, +0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x75,0x12,0x67,0x62,0x12,0xaf,0x2f, +0x12,0x67,0xc0,0x7e,0x73,0x36,0xdb,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x67,0xc0,0x22, +0xe4,0x7a,0xb3,0x36,0xdb,0x7a,0xb3,0x36,0xda,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0, +0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xbf,0x12,0x67,0xf2,0x59,0x25,0x2b, +0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a,0xb3,0x2f,0xa8,0x22,0x7d,0x31,0x9d,0x30,0x2, +0x21,0x0, 0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x73,0x28,0x93,0x7a,0x73, +0x28,0x94,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22, +0x12,0xc0,0x25,0x12,0x63,0x2, 0x7a,0x37,0x39,0x4, 0x12,0x69,0x87,0x12,0x28,0x48, +0x2, 0x68,0x23,0x12,0x69,0x84,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3, +0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca,0x79,0x7e,0x13,0x2a,0x2, 0x7e,0x78, +0x29,0xbc,0x12,0x69,0x84,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0x19, +0x7e,0xa0,0x5, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12, +0x68,0x23,0x21,0x6d,0xbc,0x20,0x50,0x3, 0x12,0x68,0x23,0x6c,0x0, 0x21,0x62,0x7e, +0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x21,0x60,0xa, +0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x21,0x43,0x12, +0x69,0x7a,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x21,0x0, 0x7d,0xd3,0x7e,0x70,0x4, +0xac,0x79,0x49,0x23,0x35,0x43,0x12,0x69,0x70,0x9d,0x32,0x12,0x21,0x0, 0x7d,0xc3, +0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x69, +0x7a,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x43,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28, +0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, 0x7a,0xb3,0x34,0x89, +0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3, +0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80,0x53,0x7e,0x50,0x9, +0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x35,0x41,0x49, +0x22,0x29,0xa, 0x59,0x27,0x35,0x43,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x34,0x88,0x80, +0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34, +0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, +0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x41,0x12,0x69,0x70,0x59,0x32,0x35,0x43, +0xb, 0x0, 0x90,0x60,0x99,0xe4,0x93,0xbc,0xb0,0x28,0x2, 0x1, 0x6f,0xda,0x79,0x22, +0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x41,0x22,0xa2,0x8, 0x22,0x7e,0x34,0xd, 0xac,0x12,0x26,0x5b,0x12,0x7a, +0x2d,0x12,0x69,0xab,0x2, 0x69,0x97,0x30,0xf, 0x10,0x12,0x6e,0x8f,0x50,0x3, 0x12, +0x6f,0x6e,0x12,0x6a,0x50,0x12,0x69,0xd1,0xc2,0xf, 0x22,0x7e,0xb3,0x2b,0x1e,0x70, +0x1f,0x12,0x26,0x57,0x12,0x2f,0xf4,0x50,0xfb,0x12,0x6a,0x50,0x12,0x88,0x17,0x20, +0xf, 0x3, 0x12,0x69,0xd1,0x74,0x2, 0x7a,0xb3,0x2b,0x1e,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12, +0x87,0x56,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0xc0,0xcc,0xf5,0x2a, +0x7e,0x73,0x2b,0xf, 0xbe,0x71,0x2a,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x91,0x67,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x44,0x6d,0x22,0x7a,0x1f,0x37,0x40,0x7c,0xbc,0x12,0x6c,0x20,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x62,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x6d,0x13,0xda,0x3b,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12, +0xc0,0x1b,0x7a,0x55,0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d, +0x7f,0x3, 0x7e,0x1d,0x2a,0x12,0x79,0x7a,0x12,0xc0,0x9f,0x12,0xc0,0x42,0x75,0x2e, +0x0, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0xc1,0x22,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6a,0xd4,0x12,0xb3,0x89,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x30,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12, +0x7b,0x20,0x7e,0x35,0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30, +0x38,0xdc,0x5, 0x2e,0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b, +0x1d,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x6d,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d, +0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x6e,0x8f,0x50,0x7c,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x6e,0x12,0x6b,0xff,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x8, 0x12,0x6d,0x34,0x38,0xea,0x6c,0xcc,0x80,0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a, +0x12,0x6b,0xff,0x75,0x3b,0x0, 0x80,0x27,0x7e,0xb3,0x37,0xb1,0xbe,0xb1,0x3b,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x60,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x62,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e, +0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34,0x10, +0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x50,0x12, +0x6c,0x8, 0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70, +0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a, +0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, +0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x7f,0x78,0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe, +0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x6b,0xf6,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d, +0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80, +0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x35,0x7a,0x37,0x25,0xba,0x7e,0x35, +0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12, +0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25, +0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac, +0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37, +0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22, +0xca,0x3b,0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b, +0xf, 0xf5,0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xb9, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x60,0x7e,0x8, 0x25,0x2a, +0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbc,0x12,0xb3,0x54,0x74,0x1, 0x7a,0xb3,0x2b,0x1d, +0x74,0x5, 0xac,0xbc,0x12,0xc0,0x39,0x74,0x5, 0xac,0xbc,0x12,0x6f,0xff,0x74,0x5, +0xac,0xbc,0x12,0xc0,0x30,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0xc2,0x3, 0x12,0xc0,0xcc,0x12,0x6d, +0x13,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, +0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x6a,0xd4,0x12, +0xc0,0x1b,0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xa8,0xef,0x12, +0xa9,0xc9,0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3, +0x2b,0x14,0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39, +0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, +0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd, +0xda,0x3b,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6e,0x29,0x30,0xc, 0xa, 0x12,0xaf,0x1d, +0x30,0x3, 0x4, 0xe4,0x12,0xa, 0x66,0x30,0x3, 0x9, 0x12,0xae,0xd2,0x12,0x8d,0xef, +0x2, 0x8c,0x90,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f, +0x50,0x7e,0x14,0x22,0xe2,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x7a,0x1d,0x2c,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f, +0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c,0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x34,0x6c, +0xcc,0x80,0x4f,0x12,0x6e,0x19,0x40,0x48,0x12,0x6e,0xf, 0x50,0x43,0x74,0x2, 0xac, +0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x0, 0x7d,0x3, 0x7d, +0x31,0x12,0x21,0x0, 0xbd,0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e, +0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d, +0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34, +0xb, 0xc0,0x12,0x6d,0x34,0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12, +0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, +0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12, +0x6e,0x19,0x40,0x8, 0x12,0x6e,0xf, 0x50,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x12,0x6d, +0x34,0x38,0xec,0xb, 0xd0,0xbe,0xd0,0x3, 0x50,0x2, 0xa1,0x68,0xda,0x3b,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xb9,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x12,0x6e,0xa0,0x7a,0x37,0x2b,0x1b, +0x22,0x7e,0xa3,0x0, 0x4f,0xbe,0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xec,0x68,0x42, +0x74,0x5, 0xa4,0x12,0xc0,0xc3,0x12,0x6e,0x83,0x12,0xc0,0x39,0x12,0x6e,0x83,0x12, +0xc0,0x30,0x12,0x6e,0x8f,0x50,0x9, 0x7e,0xb3,0x0, 0x4f,0x12,0xb3,0x54,0x80,0x6, +0x12,0x6e,0x83,0x12,0x6f,0xff,0x12,0x6e,0x29,0x12,0x6f,0xf8,0x7e,0x73,0x2b,0x14, +0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x4f,0x7a,0x73, +0x3, 0xec,0x22,0x7e,0xa3,0x0, 0x4f,0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x20,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xb2,0x70,0x2, 0xc3,0x22,0xd3,0x22, +0x7e,0x23,0x2b,0xf, 0x7e,0x33,0x37,0xcd,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x0, 0xac,0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, +0xa, 0x7e,0x63,0x2b,0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe, +0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61, +0x1b,0xe4,0x93,0x7c,0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73, +0x2b,0x10,0x80,0x9, 0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b, +0x10,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c, +0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x38,0xc0,0x69,0x51,0x0, +0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d, +0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, +0x1f,0x58,0x7e,0xb, 0x70,0x7a,0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b, +0x62,0x29,0x70,0x0, 0x1, 0x7a,0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b, +0x20,0x12,0x6e,0x29,0x12,0x6f,0xf8,0xd2,0x3, 0xc2,0x4, 0x2, 0x48,0xf4,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x4f,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6f,0xea,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0xc0,0x76,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0xc0, +0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6f,0xea,0xca,0x39,0x7e, +0x23,0x0, 0x4f,0x7e,0x30,0x38,0xac,0x23,0x12,0xc0,0x76,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x8c,0xac,0x23,0x12, +0xc0,0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6f,0x42,0x7e,0x34,0x0, 0x38,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x3, 0x8b,0x9, +0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0x7e,0x37,0x3, 0xed,0xb, 0x34,0x7a,0x37, +0x3, 0xed,0x7e,0x37,0x3, 0xef,0xbe,0x37,0x3, 0xed,0x28,0x3, 0x2, 0x70,0x23,0x22, +0x2, 0x70,0x8, 0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x70,0x20,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b, +0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e, +0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a,0xb3,0x2b,0x74,0x7a,0xb3,0x2b, +0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x25,0xee,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2, +0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93, +0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74,0xbc,0x7e,0x28, +0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3,0x2a,0x6e,0x7a, +0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3,0x2a,0x74,0x90, +0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9,0xe4,0x93,0xa, +0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a,0xa, 0x3e,0x9d, +0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a,0x78,0x90,0x60, +0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f,0xca,0x39, +0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12,0x20,0xb9,0x1b, +0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x2b,0x21,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x72,0x92,0x12,0x79,0x31,0x90,0x60, +0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76,0x12,0x70,0x59, +0x74,0x1, 0x12,0x3d,0xac,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x2, 0x12,0x73, +0xf1,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a,0xb3,0x2b,0x4, +0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0x9e,0x7a,0x37,0x2b, +0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x9, 0x7e, +0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a,0xb3,0x2b,0x62, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4,0x93,0x7a,0xb3, +0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x2b, +0xf, 0x12,0x6e,0x29,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61, +0x22,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12, +0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3, +0x2b,0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61, +0x20,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b, +0x14,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d, +0x7a,0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64, +0xe4,0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61, +0x7e,0x34,0x20,0x5b,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x12,0xc0,0xd5,0x12,0x72,0xf4,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x72,0xdb,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x72,0xdb,0xa, +0x1b,0x2e,0x14,0x2a,0x7c,0x12,0x72,0xe8,0xe5,0x25,0x12,0x72,0xdf,0xa, 0x1b,0x2e, +0x14,0x2b,0x23,0x12,0x72,0xe8,0xe5,0x24,0x2, 0x20,0xde,0x7e,0x34,0x0, 0x2, 0x12, +0x20,0xde,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, +0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a, +0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x73,0x20,0x38,0xef,0x12,0x73,0x20,0x68,0x7, +0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22, +0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x12,0x77,0xfd,0x12,0x70,0xa7,0x12,0x0, +0xa, 0x12,0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8, +0x7e,0x1f,0x6, 0xf4,0x12,0x79,0x9d,0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e, +0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12, +0x79,0x7a,0x12,0x79,0x2e,0x12,0x25,0x45,0x12,0x73,0xa7,0x12,0x73,0x7f,0x2, 0x73, +0x71,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x12, +0x73,0xe5,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, 0x28,0xae,0x74,0xff,0x12,0x20, +0xde,0x12,0x9f,0xe3,0x7e,0x8, 0x29,0xbc,0x12,0x5e,0x61,0x7e,0x8, 0x2a,0x2, 0x7e, +0x34,0x0, 0xb, 0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4, +0x12,0x20,0xde,0x90,0x60,0x9c,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74, +0xff,0x12,0x20,0xde,0x90,0x60,0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26, +0xb4,0x74,0xff,0x12,0x20,0xde,0x90,0x60,0x9a,0x12,0x73,0xe8,0x7e,0x8, 0x27,0x76, +0x74,0xff,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78, +0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc, +0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, +0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80, +0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73, +0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d, +0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a, +0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26, +0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x75,0xb2, +0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d, +0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53, +0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x75,0x9f,0xb, +0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80, +0x19,0x12,0x75,0xa8,0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58, +0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3, +0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x75,0x97,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12, +0x75,0xb2,0xb, 0x6a,0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d, +0x2d,0x7e,0x67,0x2a,0x51,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, +0x90,0x12,0x75,0x9f,0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, +0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x75,0xa8,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c, +0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12, +0x74,0x3c,0x38,0xab,0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, +0x12,0x75,0x97,0x2d,0x15,0x6c,0xaa,0x80,0xe, 0x12,0xa5,0xe4,0xb, 0x7a,0x90,0xbd, +0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xed,0x7a,0xb7,0x8, 0x4, +0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32, +0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e, +0x74,0x62,0x10,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d, +0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31, +0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0xa6, +0x56,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x75,0x97,0x7e,0xd, 0x24,0x2d,0x15,0x7f, +0x13,0x2d,0x35,0x12,0x6d,0x3b,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a, +0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x75,0xbc,0x7e,0x37,0x28, +0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x75, +0xbc,0x12,0x76,0x2b,0x12,0xa7,0x45,0x2, 0x76,0x1a,0xe4,0x7a,0xb3,0x3, 0xff,0x7e, +0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x3, 0xff,0x22,0xca,0x3b,0x7e,0xf3,0x2a, +0x6e,0x12,0xc0,0xde,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, +0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0xa7,0xcd,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda, +0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0xbb,0xb5,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, +0xf8,0x12,0x3f,0xf2,0x12,0x76,0x9a,0x12,0x74,0x43,0x7e,0xb3,0x16,0x90,0xb4,0x1, +0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26, +0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x20, +0xde,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26, +0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0xc0,0xb, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0xbf,0xe7, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x86,0x12,0xc0, +0x60,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x89,0x12,0xc0, +0x60,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3, +0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0xc0,0xb, 0x7e,0x50,0x1, 0x12,0x77,0x60,0x7a, +0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0xbf,0xe7,0x7e,0x50,0x1, 0x12,0x77,0x60, +0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22, +0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0, +0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4, +0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0, +0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, +0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c, +0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b, +0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f, +0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0xe4,0x7a,0xb3, +0x37,0x9c,0x7a,0xb3,0x37,0x9d,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0x9e,0x90,0x60, +0x51,0xe4,0x93,0x7a,0xb3,0x37,0x9f,0xe4,0x7a,0xb3,0x37,0xa0,0x90,0x60,0x99,0x93, +0x7a,0xb3,0x37,0xa1,0xe4,0x7a,0xb3,0x37,0xa2,0x7a,0xb3,0x37,0xa3,0x90,0x61,0xc4, +0x93,0x7a,0xb3,0x37,0xa5,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34, +0x7a,0x73,0x37,0xa9,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a, +0x73,0x37,0xaa,0x74,0x64,0x7a,0xb3,0x37,0xbb,0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3, +0x37,0xbc,0x90,0x61,0x17,0xe4,0x93,0x7a,0xb3,0x37,0xa8,0x90,0x61,0x19,0xe4,0x93, +0x7a,0xb3,0x37,0xbe,0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x37,0xbd,0x90,0x61,0x1d, +0xe4,0x93,0x7a,0xb3,0x37,0xbf,0x90,0x61,0x25,0xe4,0x93,0x7a,0xb3,0x37,0xba,0xe4, +0x7a,0xb3,0x37,0xb5,0x74,0xfa,0x7a,0xb3,0x37,0xb3,0x74,0x1e,0x7a,0xb3,0x37,0xb4, +0x74,0x1, 0x7a,0xb3,0x37,0xb2,0x74,0xd, 0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3, +0x37,0xb6,0xe4,0x7a,0xb3,0x37,0xb7,0x7a,0xb3,0x37,0xb8,0x7e,0x8, 0x37,0xc0,0x7e, +0x34,0x0, 0x2c,0x12,0x20,0xde,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0xa, 0x36,0x7a, +0x73,0x37,0xcb,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0x7a,0x73,0x37,0xcc,0x90,0x60, +0xd4,0x93,0x7a,0xb3,0x37,0xcd,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x37,0xce,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b, +0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xe9,0x74,0x1, 0x7a,0xb3,0x37,0xe0,0x7e,0x34,0x0, +0x28,0xca,0x39,0x7e,0x34,0x61,0xd5,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12, +0x20,0xb9,0x1b,0xfd,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0x2, 0x23, +0xa6,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x6d, +0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x20, +0xde,0x7f,0x6, 0x7d,0x3f,0x12,0x20,0xde,0x7a,0xb3,0x16,0x91,0x22,0x7f,0x70,0x7e, +0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c, +0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x20,0xde,0x7f,0x7, 0xa, +0x3a,0x2, 0x20,0xde,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15, +0x12,0x79,0x9d,0x12,0x3f,0xd2,0x7e,0xe0,0x1, 0x12,0x4f,0xaf,0x30,0x18,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x7b,0x29,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac, +0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15, +0x12,0x7b,0x20,0xb, 0xd0,0x7e,0x73,0x2a,0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, +0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c, +0xbf,0x2e,0x73,0x2a,0x73,0x12,0x7a,0x8e,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b, +0x2, 0x70,0x41,0x12,0x2f,0xf4,0x50,0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x7a,0x75, +0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x72,0x12,0x79,0xc4,0x74, +0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x7a,0x75,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f, +0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x79,0xc4,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4, +0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x3d,0xac,0x7c,0xba,0x12,0x13, +0xc7,0x74,0xa, 0x12,0x45,0x15,0x7c,0xb9,0x12,0x0, 0x1e,0x2, 0x4e,0xe7,0xca,0xd8, +0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0x7b,0xd0,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74, +0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11, +0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x1f,0x7, 0x1b,0x6a,0x30,0xb, 0xd0,0xbc, +0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3, +0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73,0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c, +0x7f,0x12,0x7a,0x8e,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12, +0x20,0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, 0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, +0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22, +0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, +0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x29,0x6f,0x7c,0xe7,0x80,0x5d,0x12,0x26,0x57, +0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x12,0x7b,0x29,0x6c,0xdd,0x80,0x3d, +0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, +0x1d,0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19, +0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x3f,0xb, 0xbe,0xb0, +0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x7b,0xb7, +0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa, +0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53,0x2a, +0x73,0xa, 0x25,0x2d,0x23,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22, +0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa, +0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38, +0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, +0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e, +0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x37,0xed,0x40,0x39,0x7e,0x37,0x37,0xed,0xb, 0x34,0x7a,0x37, +0x37,0xed,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x34,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x38,0xfb,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x70,0x5, 0x7e,0xb3,0x37,0x9c,0x22,0xbe,0xb0,0x3, 0x38,0x15, +0x75,0x1b,0x0, 0x30,0xe, 0x6, 0x7e,0x18,0x32,0xea,0x80,0x4, 0x7e,0x18,0x33,0x28, +0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e, +0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4, +0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xed,0x80,0x2, 0x15,0x1a,0x2, +0x7c,0x17,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x7d,0x61,0xbe,0xb0,0x80, +0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x61,0x22,0xb4,0xfc, +0x5, 0x7e,0xb3,0x37,0x8, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60, +0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x36,0x71,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22, +0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74,0xff,0x22,0x7c,0x7b,0x6c,0xaa,0x12, +0x3f,0xe1,0x78,0x9, 0x7c,0xb7,0x12,0x7c,0x64,0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, +0x7c,0xb7,0x12,0x37,0xeb,0x7c,0xab,0x7c,0xba,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5, +0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5, +0x1a,0x12,0x3f,0xb3,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12, +0x7c,0xfb,0xf5,0x91,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0, +0x82,0x12,0x7d,0x1a,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b, +0x32,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x37,0xf2,0x7e,0x73,0x37,0xf2,0xa, 0x27,0x2e, +0x24,0x0, 0x6, 0x12,0x51,0x4f,0x93,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x37,0xf2, +0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x37,0xf2,0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0x9b,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0x9b,0x7a, +0xa3,0x36,0xf2,0x22,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37,0x9c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, +0xe4,0x7a,0xb3,0x37,0x9c,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba, +0x12,0x7d,0xab,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3, +0x7c,0x7a,0x12,0x7e,0x45,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xdf,0x38, +0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x7e,0x21,0xa5,0xbb,0x8f,0x3, 0x75,0x19, +0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x44,0xc0,0x74,0x1, 0x7a,0xb3,0x33,0xff, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68,0x17,0x1b,0x61,0x68, +0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x36,0xe1,0xd2,0xd, 0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37, +0xef,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37, +0xef,0x15,0x1a,0x7e,0x27,0x37,0xef,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, +0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a,0xea, +0x22,0x7e,0xb3,0x37,0xf1,0x4, 0x7a,0xb3,0x37,0xf1,0xe5,0x19,0xb4,0x1, 0x8, 0xe4, +0x7a,0xb3,0x37,0xf1,0x75,0x19,0x0, 0x7e,0x73,0x37,0xf1,0x7a,0x73,0x36,0xf0,0x22, +0xe4,0x7a,0xb3,0x37,0x9c,0x7e,0x8, 0x32,0xea,0x12,0x7e,0xef,0x7e,0x8, 0x33,0x28, +0x7e,0x34,0x0, 0x3e,0x12,0x20,0xde,0x7e,0x18,0x32,0xea,0x7a,0x1d,0x14,0x12,0x7e, +0xd1,0x2, 0x7e,0xc4,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0x9c,0xf5,0x91, +0x22,0x2, 0x7e,0xd4,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e, +0x34,0x0, 0x3e,0x74,0xff,0x2, 0x20,0xde,0x7c,0xab,0x12,0x3f,0x52,0x7c,0xba,0x12, +0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x7f,0x67,0x49,0x35,0x34,0x3b,0x49,0x15, +0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40,0x15,0xbe, +0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12,0x7f,0x6f, +0x28,0xe, 0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, 0x80,0x2, +0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c, +0x7c,0xb9,0x12,0x31,0x27,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, +0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88,0x7f,0x10, +0x7f,0x4, 0x12,0x1e,0xeb,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x75, +0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b,0x2a,0x0, +0x1b,0x1a,0x10,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e, +0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12, +0x21,0x0, 0xe5,0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0, +0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e, +0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12,0x87,0xbc,0x90, +0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, +0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x87,0xd4,0xbe,0xc4, +0x0, 0x3f,0x38,0x1c,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61,0x3b,0x12,0x81, +0x2, 0x12,0x80,0xf1,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xee, +0x12,0x66,0xb1,0xbd,0x5c,0x38,0x21,0x7d,0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12, +0x81,0x2, 0x90,0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b, +0x7c,0x12,0x80,0xf9,0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b, +0x1b,0x54,0xbd,0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f, +0x80,0xa, 0x7d,0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x87,0xcc,0x7f, +0x17,0x12,0x1e,0xfc,0x7f,0x71,0x12,0x81,0x1c,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40, +0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d, +0x22,0x2f,0x71,0x12,0x80,0xf1,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, +0x90,0x61,0x3a,0xe4,0x93,0x12,0x80,0xf9,0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f, +0x22,0x90,0x61,0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d, +0x22,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d, +0x2e,0x7c,0x76,0x7c,0x65,0x7f,0x71,0x22,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65, +0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12, +0x9f,0x40,0x7d,0x3, 0x74,0x9, 0xac,0xbf,0x12,0x87,0xe5,0x49,0x35,0x28,0xae,0x12, +0x81,0xbf,0x12,0x81,0x18,0x7d,0x13,0x5e,0x30,0xfc,0x7e,0x70,0x9, 0xac,0x7f,0x49, +0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d, +0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34, +0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x12,0x81,0xb3,0x12,0x81, +0x18,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, +0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30, +0xda,0x79,0x22,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d, +0x32,0x12,0x21,0x0, 0x7d,0x13,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b,0x74, +0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3,0x49, +0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x81,0xbf,0x7d,0x3f,0x9d,0x35,0x12,0x21, +0x0, 0x9d,0x34,0x12,0x21,0x0, 0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0xf, 0x12,0x67,0xeb,0x7e,0x14,0x62,0x6a,0x12,0x87,0xee,0x50, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7, +0x2f,0x9e,0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7, +0x2f,0x9a,0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x81,0xc7, +0x70,0x2, 0x61,0x45,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70, +0x9, 0x7e,0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45, +0x7e,0x73,0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f, +0xa4,0x7e,0x17,0x2f,0xa6,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45,0x7e,0x34,0x62,0x72, +0x12,0x83,0x4a,0x28,0x4a,0x7e,0x34,0x62,0x70,0x12,0x83,0x54,0x50,0x41,0x7e,0xb3, +0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0x9e,0x12,0x83,0x5e,0x7d,0x8f, +0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0x87,0xc4,0x9d, +0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40,0x2, 0x61, +0x45,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7b,0x7e,0xf0,0x21,0x80,0x76,0x7e, +0x34,0x62,0x7a,0x12,0x83,0x54,0x28,0x6d,0x7e,0x34,0x62,0x78,0x12,0x83,0x4a,0x50, +0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62,0x7e,0x12,0x23,0x9e,0x12,0x83, +0x5e,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50,0x4a,0x7e,0x34,0x62,0x7c,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7,0x2f,0x82,0x28,0x37,0x7d,0xfb, +0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x26,0x12, +0x67,0xf2,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd,0x49,0x25,0x2b,0xab,0x49,0x5, +0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, 0x9d,0x32,0xbe,0x34,0x0, 0x10, +0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xf0,0xbd,0xfc,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xbd,0xfb,0x22,0x7e,0x14, +0x62,0x8e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22,0x12,0x86,0x69,0x7a,0x37,0x2f, +0x9c,0x12,0x85,0xf4,0x7a,0x37,0x2f,0x9e,0x12,0x82,0x16,0x60,0x1, 0x22,0x7e,0x73, +0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f,0x80,0x2, +0x83,0x92,0xca,0xf8,0x7e,0x45,0x24,0x7c,0xb9,0x7a,0xb3,0x38,0x3f,0x74,0xff,0x7a, +0xb3,0x38,0x3e,0x6d,0x55,0x80,0x19,0x7d,0xf5,0x3e,0xf4,0x12,0x86,0x74,0x7d,0xe5, +0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54, +0xbd,0x45,0x38,0xe3,0x7e,0x33,0x38,0x3f,0xbe,0x30,0x4, 0x38,0x2, 0x81,0x54,0x69, +0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e, +0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x40,0x7a,0xb3, +0x38,0x42,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f, +0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x38,0x42,0x7d,0xf, 0x2d,0xf, 0xbd, +0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x38,0x42,0xa, 0x37,0x6d,0x22,0x12, +0x1e,0xeb,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7a,0x73,0x38,0x42,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x84,0x73,0x12, +0xbf,0x3c,0x12,0x84,0x73,0x12,0x84,0x7c,0x12,0x84,0x73,0x12,0xa5,0x28,0x80,0xa, +0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x38,0x3e,0xe4,0x7a,0xb3,0x38,0x3f,0x7e, +0x73,0x39,0x1, 0xbe,0x73,0x38,0x3e,0x48,0x6, 0x7e,0xb3,0x38,0x40,0x80,0x1, 0xe4, +0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71, +0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a, +0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0xa1,0x9d,0x7e,0x90,0x2, 0xac,0x9a, +0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x26,0x7f,0x67,0x2d, +0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f, +0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a, +0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe, +0xf0,0x2, 0x58,0x2, 0xa1,0x9b,0xbe,0x60,0x0, 0x18,0x2, 0xa1,0x83,0xbe,0x70,0xec, +0x28,0x2, 0xa1,0xa7,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7, +0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x85,0xeb,0x19,0xba,0x22, +0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x85,0xeb,0x19,0xba,0x23,0xe4,0x9, 0xba, +0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7, +0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0x85, +0xeb,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12,0x85,0xe2,0x19,0xbd,0x22,0xf5,0xa, 0xd9, +0x12,0x85,0xe0,0x19,0xbd,0x23,0xe5,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe, +0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12, +0x85,0xe0,0x19,0xbd,0x22,0xf4,0xa, 0xc9,0xa, 0xd4,0x12,0x85,0xe0,0x19,0xbd,0x23, +0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f,0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, +0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23,0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x38, +0x3f,0xbc,0xba,0x28,0x2, 0x81,0x9b,0x7a,0x73,0x38,0x3f,0x7e,0xa0,0x1, 0x80,0x25, +0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d, +0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e, +0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x38,0x3f,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22, +0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c, +0xbd,0xa, 0xa7,0x22,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0x86,0x69,0x7a,0x37,0x2f,0xa0,0x12, +0x85,0xf4,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0x86,0x69,0x7a,0x37,0x2f, +0xa4,0x12,0x85,0xf4,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7c,0xab, +0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4,0x14, +0x78,0xfb,0x12,0x86,0x72,0x2d,0xfe,0x80,0xf, 0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x12,0x86,0x72,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a, +0xbd,0xf4,0x38,0xd0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61, +0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b, +0x7e,0x63,0x2a,0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10, +0x7d,0x21,0x12,0x87,0xdc,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34, +0x37,0x44,0x6d,0x22,0xe4,0x2, 0x86,0x7e,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b, +0x68,0x4f,0x12,0x87,0x56,0x7c,0x3b,0x7c,0xb2,0x12,0x87,0x56,0x7c,0xab,0xbe,0x30, +0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12, +0x91,0x67,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e, +0x34,0x16,0x93,0x6d,0x22,0x30,0x16,0x3, 0x2, 0x86,0xc7,0x7e,0xb3,0x2b,0x1d,0xb4, +0x1, 0xf, 0x12,0xc0,0x1b,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x86, +0x7e,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, +0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40, +0xe9,0x74,0xff,0x22,0x7e,0xb3,0x37,0x31,0x70,0x6, 0x12,0x87,0xad,0x2, 0x87,0xb6, +0x12,0x63,0x9, 0x12,0xbd,0x6d,0x50,0xa, 0x12,0x83,0x6a,0x7c,0x3b,0x12,0x87,0xad, +0x80,0x5, 0x12,0xbe,0x14,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xbc,0xf1, +0x60,0xa, 0x7a,0x33,0x37,0x34,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4,0x7a,0xb3, +0x2f,0x80,0x22,0x2, 0x81,0x23,0xe4,0x7a,0xb3,0x38,0xdd,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x3e,0x24,0x7e,0xf, +0x38,0xd9,0x2d,0x12,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x32,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74,0x6, +0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x5, 0x7d,0x53,0xbe,0x54,0x0, 0xff, +0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x12,0x6e,0x8f,0x50,0x3, 0xd2,0xf, 0x22,0xc2, +0xf, 0x22,0x12,0xac,0xe9,0x12,0x88,0x2b,0x2, 0x88,0x17,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x20,0xde,0x12,0xaa,0x61,0x12,0xaa,0x58,0xa9,0xd1,0xcb, +0x12,0xc1,0x22,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x12, +0x54,0x94,0x12,0x88,0xb9,0x12,0x8c,0xad,0x7e,0xb3,0x37,0x6, 0xb4,0x1, 0x1e,0x7e, +0x34,0x61,0xc0,0x12,0x87,0xcc,0x7e,0x24,0x0, 0x5, 0xad,0x12,0x7a,0x17,0x28,0xa1, +0x7e,0x14,0x61,0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39, +0x11,0x60,0x7, 0x14,0x7a,0xb3,0x39,0x11,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, +0x12,0x88,0x22,0x12,0x8c,0x90,0x12,0xb3,0xd3,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12, +0xbb,0x30,0x12,0xaa,0x6a,0x2, 0x8d,0x10,0x22,0x7e,0x90,0x1, 0x7e,0xb3,0x2f,0xa9, +0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xa9,0x7e,0x34,0x61,0xc0,0x12,0x23, +0x9e,0x12,0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x12,0x8c,0x87,0xb, 0x1a, +0xf0,0x7e,0x34,0x61,0x4f,0x12,0x87,0xbc,0xe4,0x7a,0xb3,0x28,0xac,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x7e,0x34,0xff,0xfa,0xad,0x3f,0x12,0x8f,0xdc,0x7d,0xc3,0xe, 0xc4, +0x7e,0xe7,0x7, 0xfe,0xbd,0xe3,0x58,0x15,0x7e,0xe7,0x7, 0xfc,0xbd,0xec,0x58,0xd, +0x12,0x8a,0x7c,0x8, 0x8, 0x12,0x8b,0xe, 0x60,0x3, 0x12,0x8a,0x95,0x12,0x8b,0xe, +0xa, 0xeb,0x4d,0xee,0x68,0x3b,0x6d,0xee,0x9d,0xef,0xbe,0xe7,0x7, 0xfe,0x18,0x6, +0xbe,0xe7,0x7, 0xfc,0x8, 0x2b,0x12,0x8a,0x7c,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12, +0x21,0x0, 0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x8a,0x74,0x28,0x14,0x7e,0x83,0x28, +0x85,0xbe,0x80,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xcf,0x58,0x3, 0x12,0x8a, +0x95,0x12,0xad,0x28,0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xc1,0x1a,0x68,0x6, +0x7e,0xb3,0x39,0xb, 0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x7d,0x12,0x8a,0x74, +0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0xad,0x66,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x12,0x8a,0xa6,0x7c,0x9b,0x80, +0x1a,0x7e,0xb3,0x26,0x84,0x70,0x14,0x7e,0xb3,0x26,0x85,0x70,0xe, 0x12,0x8a,0x74, +0x28,0x9, 0x7e,0x90,0x3, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0xc7,0x7, 0xfa,0xbe, +0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x8a,0x74,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7, +0x28,0x8e,0x58,0x8, 0x12,0x8a,0x87,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0x29,0x7e,0x14, +0x61,0xc0,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0x7e,0x14,0x61, +0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x12,0x0, 0x66,0x50,0xd, 0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x8f,0xe3,0x28,0x3, 0x12,0x8a,0x87,0x7e,0xc7,0x28,0x8a, +0xbd,0xcd,0x8, 0x19,0x12,0x9b,0xf, 0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28, +0x8e,0x58,0xa, 0x12,0x0, 0x66,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x8b,0x8e, +0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x2, 0x12,0xac,0x90,0x7e,0xb3,0x2f,0xaa,0xbe, +0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xaa,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8c,0x7f,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0x6d,0xee,0x9e,0xe7, +0x2a,0x5a,0xbe,0xe7,0x28,0x8e,0x22,0xe4,0x7a,0xb3,0x2f,0xaa,0x7a,0xb3,0x28,0xac, +0x74,0x2, 0x2, 0x29,0xfa,0x74,0x2, 0x7a,0xb3,0x2f,0xaa,0xe4,0x7a,0xb3,0x2f,0xa9, +0x12,0x8c,0x7f,0x2, 0x29,0xfa,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x8c,0x87, +0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x8b,0x6, +0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e, +0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x4, +0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11, +0x7e,0x34,0xff,0xfd,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0, +0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x1e,0xb9,0xbd,0x34,0x22,0x6c,0x66, +0x90,0x60,0xa7,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28, +0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14, +0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x9d,0x8b,0x50, +0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, +0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e, +0x73,0x2a,0x6d,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0xca,0x3b, +0x12,0xa6,0x4e,0x38,0x2, 0x81,0x55,0x7e,0xc3,0x2f,0xad,0x4c,0xcc,0x78,0x3d,0x7a, +0xb3,0x2f,0xad,0xe4,0x7a,0xb3,0x2f,0xaf,0x6c,0xaa,0x80,0x26,0x12,0x8c,0x60,0x7e, +0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a,0x49,0xd0,0x19, +0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8c,0x6a,0x59,0x34,0x0, 0x2, +0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c,0xfc,0x6c,0xaa, +0x80,0x35,0x12,0x8c,0x60,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, 0xb4,0x0, 0x8, +0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8c,0x6a,0x7d,0x23,0x49,0x34,0x0, 0x2, 0x9d, +0x32,0x12,0x21,0x0, 0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x4c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x2f,0xaf,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x8c, +0x60,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x4c,0x0, 0x12,0x8c,0x71,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x2f,0xaf,0x80,0x6, 0x12,0x8c,0x71,0x75,0x4c,0x0, 0xe5,0x4c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xb0,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x40,0xe4,0x7a,0xb3,0x2f,0xae,0x7a,0xb3,0x2f,0xad,0x7a,0xb3,0x2f,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22, +0x12,0x8c,0xcd,0x6d,0x33,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x5, 0x12,0x8d,0x5e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xf6,0xe4,0x7a,0xb3,0x36,0x72,0x22,0x12,0xb0,0xbe, +0x60,0x1a,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x7e,0x37,0x38, +0xd2,0x12,0x25,0x3c,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x23,0x12,0x8d,0x8, 0x28, +0x26,0xa, 0x4a,0x9, 0x64,0x36,0x76,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x42,0x38,0xcc,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x80,0xb, 0xa0,0x7e, +0xb3,0x36,0x73,0xbc,0xba,0x38,0xd5,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xae,0xc5,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x8d,0x5e,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x84, +0x49,0x12,0x36,0x80,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x84,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x36, +0x84,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x36,0x80,0x59,0x32,0x36,0x84,0x22,0x7e,0xb3,0x36,0x66, +0x60,0x6, 0x14,0x7a,0xb3,0x36,0x66,0x22,0x12,0x8c,0xcd,0x90,0x61,0xc5,0xe4,0x93, +0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x8d,0xef,0x7e,0xb3,0x36,0xec,0x70,0xe, 0x7e,0xb3, +0x39,0x12,0xb4,0x1, 0x7, 0xe4,0x12,0x8d,0xb3,0x12,0xc0,0x95,0x12,0x67,0x1f,0x12, +0x8e,0xa2,0x7e,0xa3,0x36,0xec,0x7a,0xa3,0x39,0x12,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x8d,0xb3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf,0x12,0xc0,0xc3,0x12,0xc0, +0x39,0x12,0x6f,0xff,0x12,0xc0,0x30,0x7a,0xf3,0x0, 0x4f,0x7c,0xbf,0x12,0xb3,0x54, +0x12,0x6e,0x29,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37,0x12,0xaf,0x4, 0x12,0x8d, +0xef,0x12,0x23,0x4, 0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8,0x22,0x12,0x8f,0xd2,0x7e, +0xb3,0x2b,0xf, 0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xc0,0x7e,0x73,0x37,0xcd,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36, +0x12,0x8f,0xca,0xbe,0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x36,0x72,0xa, 0x3e,0xad, +0x3b,0x7d,0xa3,0x2d,0xac,0x75,0x35,0x0, 0x7e,0xa3,0x36,0x72,0xbc,0xad,0x40,0x2, +0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e, +0x78,0xe, 0x7c,0xbd,0x14,0xbe,0xb3,0x36,0x72,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x72, +0x7e,0xc3,0x36,0x72,0x80,0x41,0x7e,0xb3,0x36,0x72,0x4, 0x7a,0xb3,0x36,0x72,0x7e, +0x90,0x5, 0xac,0x9c,0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb, +0x19,0xcd,0x36,0x76,0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, +0xf5,0x35,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0, +0xbe,0xf0,0x3, 0x50,0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x36,0x73,0xda, +0x3b,0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0x5a,0x7e,0xb3,0x36,0x6b, +0xb4,0x1, 0x8, 0x12,0x88,0x22,0xe4,0x7a,0xb3,0x36,0x6b,0x7e,0xb3,0x36,0x6a,0x60, +0x4, 0x74,0xff,0xe1,0xc5,0x7e,0xb3,0x36,0x69,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xb9, +0x12,0xc1,0x12,0x38,0xc, 0x12,0x8f,0xf3,0x38,0x7, 0x12,0x8f,0xeb,0x38,0x2, 0xe1, +0xb9,0x12,0x8f,0xca,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, +0x80,0x3, 0x7c,0xbd,0x14,0x12,0xae,0x34,0x7c,0xfb,0x7e,0xb3,0x36,0x68,0x4, 0x7a, +0xb3,0x36,0x68,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xae,0x34,0x7c,0xab,0xbe,0xa0, +0xff,0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x36, +0x7e,0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, +0x12,0xae,0xbb,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe, +0xf0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x68,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36, +0x75,0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x36,0x68,0x50,0x59, +0x74,0xc, 0xac,0xbf,0x49,0x25,0x36,0x7e,0x7e,0x14,0x61,0xcc,0x12,0x64,0xd3,0xbd, +0x23,0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0x9e,0xbe,0x37,0x36,0x64,0x40,0xd, +0x7e,0x34,0x61,0xd2,0x12,0x23,0x9e,0xbe,0x37,0x36,0x6f,0x50,0x23,0x74,0x5, 0xac, +0xbf,0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, +0x50,0x8, 0x12,0x87,0x52,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x6b, +0xe4,0x7a,0xb3,0x36,0x75,0x7a,0xb3,0x36,0x69,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a, +0xb3,0x36,0x68,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x90,0x61,0xc5,0xe4,0x93,0x7c, +0xdb,0x22,0x12,0xae,0xd2,0x74,0x1, 0x7a,0xb3,0x36,0x66,0x22,0x7e,0x24,0x0, 0x2, +0x2, 0x1e,0xb9,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26,0xf5,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf3,0x2a, +0x70,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3, +0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3, +0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x90, +0x50,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f, +0x36,0x6d,0x0, 0x12,0x1f,0x7, 0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x7, 0xda,0xf8,0x22, +0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8, +0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x6f, +0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x5c, +0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x60, +0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, +0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f, +0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x74,0xc8,0x7a,0xb3,0x39,0x6, 0xc2,0x17, +0x80,0xa, 0x12,0x45,0xd6,0x30,0x17,0x4, 0x75,0xe9,0xff,0x22,0x12,0x47,0xff,0x68, +0xf1,0x22,0x74,0x1, 0x12,0x90,0xf1,0x20,0x17,0x6, 0x12,0x46,0x4e,0x12,0x90,0xfa, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x90,0xb8,0x12,0x90,0xfa,0xe4,0x2, 0x90, +0xf1,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0x22,0xd2,0x4, 0x2, 0x45,0x5a,0xa, +0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x47,0xff,0x68,0xfb,0x20,0x93,0xfd, +0x22,0x7e,0x34,0x61,0x59,0x2, 0x23,0x9e,0x7e,0xb3,0x37,0x6, 0x70,0x2e,0x7e,0x73, +0x36,0xe9,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0x3, +0x7e,0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x91,0x6d,0x7c,0xab,0xe5,0x4e, +0xa, 0x3b,0x2e,0x37,0x38,0x83,0x7a,0x37,0x38,0x83,0x80,0xc, 0x7e,0xa3,0x36,0xea, +0xbe,0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x91,0x5d,0x75,0x4e,0x0, +0x7a,0xb3,0x39,0x6, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x20,0xf0,0x7a,0x71,0x82, +0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xb3,0x38,0x86,0x70,0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x38,0x86,0x22,0x7f,0x20,0xc2,0x4, 0x7e,0x2b,0x60,0x29,0x72,0x0, +0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21,0x0, 0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32, +0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x21,0x0, 0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d, +0x32,0x12,0x21,0x0, 0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60, +0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x37,0xf3,0x4d,0x33,0x68,0x2, +0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f,0x70,0x7c, +0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e, +0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12,0x87,0xbc,0x6c,0xff,0x12,0x2f,0xff,0x7f,0x51, +0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, 0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b, +0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e,0x14,0x62,0xa, 0x12,0x87,0xee,0x8, 0xc, 0x7e, +0x27,0x28,0x8a,0xbe,0x24,0x3, 0x20,0x8, 0x2, 0x61,0x2a,0xb, 0xa, 0xc0,0x1e,0xc4, +0xbd,0x3c,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x61,0x2a, +0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0, +0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca, +0x18,0x5, 0x4e,0xf0,0x1, 0x61,0x2a,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a, +0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa, +0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc, +0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90, +0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd, +0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b, +0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, +0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, +0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b, +0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0x40,0xbd,0x3d,0x22,0x7f,0x60,0x7e,0x6b,0xa0, +0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, +0x2d,0x15,0xb, 0x14,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0, +0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76,0x7d,0x13,0x1e, +0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e, +0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b, +0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xca,0x3b,0x6d,0x11,0x7e,0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c, +0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12,0x95,0x90,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x34,0xca,0x74,0x2, 0xa, 0x3f,0x19,0xb3,0x35,0x34,0xb, 0xf0,0x12,0x5e,0x2d, +0x38,0xe1,0x12,0x97,0xc0,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0xa1,0x69,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, +0x12,0x95,0xa1,0x38,0x2, 0xa1,0x67,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x4d,0x75,0x24,0x0, 0xa1,0x3f,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xca,0xbc,0xcd,0x68,0x2, 0xa1,0x3d,0x49,0x25,0x34,0xc8,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x0, 0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc6,0x74,0x9, 0xac,0xbf,0x12,0x96,0x1b,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x34,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x20,0xa, 0x1c,0x2e,0x14,0x35,0x34,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x67,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x69,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x1f,0x8c,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x97,0xae,0xac,0x3f,0x12,0x95,0x98,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x95,0x98,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x20,0x80,0x2a,0x5, 0x24,0x90, +0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0x81,0x49,0x80,0x1a,0x6d,0x11,0x74, +0x2, 0xac,0xbd,0x12,0x95,0x90,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1,0x34,0xca,0x74, +0x2, 0xa, 0x1d,0x19,0xb1,0x35,0x34,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x25,0xe4, +0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x5f,0xc6,0xca,0x59,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x34,0xc6,0x12,0x20,0xb9,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, 0xda,0x3b,0x22, +0x59,0x15,0x35,0x20,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x1f, +0x8c,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80, +0x63,0x6c,0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac, +0xbe,0x9, 0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x95,0xa1,0x38,0xe5, +0x12,0x95,0xa1,0x28,0x43,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x81,0xb3, +0x74,0x9, 0xac,0xbd,0x12,0x87,0xe5,0x12,0x96,0x1b,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8b,0x59,0x35,0x34,0xb0,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x87,0xb3,0xb, 0xe0,0xbc,0xfe,0x38,0x99,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x21,0x0, 0x7e,0xb3,0x37,0x31,0x70,0x3, 0x12,0x93,0xe3,0x2, 0x96,0x30, +0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x96, +0x7c,0x7c,0xbf,0x12,0x97,0x10,0x4c,0xee,0x78,0x14,0x12,0x5f,0xc2,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0x80,0xb, 0x7e,0xb3, +0x2a,0x9, 0x70,0x5, 0x7c,0xbf,0x12,0x95,0xa9,0x7c,0xbf,0x12,0x9f,0x90,0xbe,0xf0, +0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4, +0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, 0x2, 0x96,0xeb,0xa5,0xbe,0x0, 0x1d,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, +0xa0,0x12,0x5e,0x25,0x38,0xed,0x74,0x1, 0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x47,0x81,0x1b, +0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x47, +0x81,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0x12,0x97,0x4, 0x7e,0x8, +0x34,0xb0,0xe4,0x12,0x20,0xde,0x90,0x60,0x99,0x12,0x97,0x8, 0x7e,0x8, 0x34,0x8b, +0xe4,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60,0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x97,0xb6,0x7c,0x7d, +0x7c,0x6f,0x12,0x97,0xb6,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x97,0xae,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x1f,0x8c,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x2e,0x34, +0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x8, 0x1f,0x34,0x12,0x9e,0x37,0x7c,0x1b,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x34,0x9f,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x34,0x9f,0x1e,0x34,0x7a,0x37,0x34,0x9f,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9f,0x7e,0x37,0x34,0x9f,0x22,0xca,0xf8,0x7c,0xfb, +0x6d,0xdd,0x7c,0xbf,0x12,0x98,0xea,0x7d,0xe3,0x7c,0xbf,0x12,0x37,0x6f,0x7d,0xf3, +0x74,0x2, 0xac,0xbf,0x9, 0x95,0x26,0xfb,0x7c,0xbf,0x12,0x9a,0xed,0x40,0x2, 0x1, +0xd4,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0xbe,0xa0,0x0, 0x28,0x9, 0xa, 0x3a, +0x1b,0x34,0x12,0x98,0xd8,0x7d,0xd3,0x12,0x98,0xdf,0xbd,0xc3,0x58,0xb, 0xa, 0xca, +0xb, 0xc4,0x7d,0x3c,0x12,0x98,0xd8,0x2d,0xd3,0x12,0x9b,0xf, 0x7d,0xd3,0xbe,0xa0, +0x0, 0x28,0x56,0x12,0x98,0xdf,0xbd,0xc3,0x58,0x4f,0xbe,0x90,0x0, 0x28,0x4a,0xbe, +0x90,0x0, 0x28,0x45,0xbe,0xf4,0x0, 0xc8,0x8, 0x3f,0x7d,0x3d,0x3e,0x34,0x3e,0x34, +0xbd,0x3f,0x8, 0x35,0x7e,0x70,0x2, 0xac,0x79,0x49,0x33,0x4, 0xfc,0xbe,0x34,0x1, +0x2c,0x8, 0x26,0xa, 0x2a,0x7e,0xb3,0x2a,0x74,0x12,0x9b,0x18,0xbe,0x34,0x1, 0x90, +0x8, 0x17,0xbe,0xf4,0x1, 0x5e,0x58,0xd, 0x7e,0x34,0x0, 0x3, 0xad,0x3e,0xbd,0x3f, +0x8, 0x3, 0xe4,0x80,0x30,0x74,0x1, 0x80,0x2c,0x90,0x60,0xab,0xe4,0x93,0xbc,0xb9, +0x78,0x22,0x7c,0xba,0x7c,0x79,0x12,0x2c,0x40,0xbe,0x34,0x0, 0x96,0x8, 0x12,0x74, +0x2, 0xac,0xb9,0x49,0x35,0x4, 0xfc,0xbe,0x34,0x0, 0x32,0x8, 0x4, 0x74,0x1, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xb7,0x7c,0x79,0x2, 0x2c,0x40,0x7e, +0xb3,0x2a,0x6f,0xa, 0x3b,0x1b,0x34,0xa, 0xca,0x22,0xca,0x79,0x7c,0x8b,0x6c,0xaa, +0x9f,0x77,0x12,0x9a,0x2a,0x1a,0x79,0x1b,0x74,0x80,0x4c,0x1a,0x38,0x1b,0x34,0x7c, +0xe7,0x80,0x38,0xbc,0x9f,0x78,0x4, 0xbc,0x8e,0x68,0x2e,0xbe,0xf0,0x0, 0x48,0x29, +0x7e,0xb3,0x2a,0x6f,0xa, 0x2b,0x1a,0x3f,0xbd,0x32,0x58,0x1d,0xbe,0xe0,0x0, 0x48, +0x18,0x7e,0xb3,0x2a,0x70,0xa, 0x2b,0x1a,0x3e,0xbd,0x32,0x58,0xc, 0x7c,0xbf,0x7c, +0x7e,0x12,0x2c,0x40,0x12,0x99,0x65,0xb, 0xa0,0xb, 0xe0,0x1a,0x28,0xb, 0x24,0x1a, +0x3e,0xbd,0x32,0x8, 0xbe,0xb, 0xf0,0x1a,0x29,0xb, 0x24,0x1a,0x3f,0xbd,0x32,0x8, +0xaa,0x4c,0xaa,0x78,0x4, 0x6d,0x33,0x80,0x9, 0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12, +0x1f,0x58,0xda,0x79,0x22,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7, +0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f,0x34,0x7e,0xb3,0x2a,0x70,0x7a,0xb3, +0x1f,0x35,0x12,0x9a,0x2a,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x41,0x17,0x7a, +0xf1,0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d, +0x32,0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a, +0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d, +0x32,0x7c,0xb7,0xf5,0x2c,0x80,0x40,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58, +0x10,0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5, +0x2e,0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b, +0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12, +0x2c,0x40,0x12,0x99,0x65,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x2c,0x1a, +0x3b,0xbd,0x32,0x8, 0xb2,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd, +0x32,0x18,0x2, 0x21,0x8f,0x7f,0x17,0xda,0x79,0x22,0x7e,0x70,0x2, 0xac,0x78,0x9, +0x93,0x26,0xfa,0x9, 0x83,0x26,0xfb,0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x62,0x27, +0x12,0x9a,0xe5,0x12,0x9b,0x23,0x50,0x2, 0x41,0xe0,0x7e,0x34,0x62,0x2b,0x12,0x23, +0x9e,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, 0x41,0xe0,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x9a,0xe5,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x4, 0x4c,0x8, 0x6b,0x6c,0xdd,0x80,0x5f,0xc2,0x3, 0x7c,0xbd,0x12,0x37,0x6f, +0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x99,0x6c,0x7a,0x35,0x24,0x9e,0x35, +0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0xdc,0x7a,0x35, +0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, +0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x9a,0xed, +0x50,0x2, 0xc2,0x3, 0x30,0x3, 0xf, 0x7c,0xbd,0x6c,0x77,0x12,0x51,0x5f,0x7e,0x70, +0x2, 0xac,0x7d,0x12,0x37,0x9f,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x99, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x7c,0x4b,0x74, +0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc, +0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x2, 0x1e,0xb9,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33, +0x4, 0xfc,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x37,0x6f,0xbe,0x34, +0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0xe9, +0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0x3b,0x7e,0x77,0x2a,0x5c,0x12, +0x9d,0xa1,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x9b,0xd7,0x7e, +0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x35,0xe5,0xbd,0x36,0x48,0x7, 0x3e,0x34,0x3e, +0x34,0x12,0x9b,0xd7,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0x9b,0x23,0x50,0x6, 0x7e, +0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60,0xc, 0x7e, +0xb3,0x35,0xe3,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xe3, +0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x45,0xe, 0x7e,0x53,0x35,0xe3,0xbe,0x50,0x0, +0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, 0x7d,0xfe, +0x7a,0xf7,0x2a,0x5c,0x12,0x9b,0xdf,0x28,0x3, 0x12,0x37,0xc2,0x7a,0x67,0x35,0xe5, +0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xb9,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x79,0xc2,0x3, 0x7e,0xf0,0x3, 0x7e,0xe3, +0x2a,0x3, 0x12,0x9b,0xdf,0x28,0x72,0x7c,0xbf,0x12,0x2c,0x47,0x4c,0xee,0x68,0xe, +0x7e,0x63,0x33,0xc0,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x33,0xc1,0x70,0x4, 0xd2,0x3, +0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x4d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x3, +0x80,0x1e,0xd2,0x3, 0x12,0x9c,0xf6,0x78,0xa, 0xa5,0xbe,0x0, 0x6, 0x6c,0xff,0xc2, +0x3, 0x80,0xd, 0x9e,0x73,0x33,0xc0,0xbc,0x7e,0x78,0x5, 0x7e,0xf0,0x2, 0xc2,0x3, +0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x2c,0x47,0x7e,0xa3,0x33,0xc2,0x7a,0xa3,0x28,0x84, +0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x33,0xc3,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9, +0x1b,0xfd,0x12,0x9c,0x6f,0xf5,0x4d,0x80,0x3, 0x75,0x4d,0x64,0xda,0x79,0x22,0x7e, +0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80, +0x42,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x9c,0xee,0x9, 0xb3,0x26, +0xfa,0x12,0x2f,0xd6,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12, +0x9c,0xee,0x9, 0xb3,0x26,0xfb,0x12,0x2f,0xd6,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, +0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c, +0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28, +0x84,0xbc,0xb1,0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c, +0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0xca,0x79,0x6c, +0x88,0x80,0x72,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a, +0x71,0x24,0x7c,0xbf,0x12,0x9d,0x8b,0x50,0x5a,0x6c,0xee,0x80,0x51,0xbc,0xe8,0x68, +0x4b,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9d,0x80,0xf5,0x26,0x6c,0x99,0x90,0x60,0xaa, +0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, 0x2f, +0xe5,0x25,0xa, 0x3b,0x12,0x35,0x67,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, 0x78, +0x1b,0x7c,0xbe,0x12,0x37,0x6f,0x7d,0xf3,0x7c,0xb8,0x12,0x37,0x6f,0xbd,0x3f,0x8, +0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x51,0x5f,0xb, 0xe0,0x12,0x9c, +0xf6,0x38,0xaa,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0x86,0xda,0x79,0x22, +0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0x22,0x7c,0xab,0x90,0x60,0xab, +0xe4,0x93,0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x31,0x5a,0x50,0x2, 0xd3,0x22,0xc3, +0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84,0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12, +0x2f,0xb7,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb, +0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x40,0x7d,0xf3,0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, +0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x2, 0x70,0x2d, +0x7e,0x73,0x2a,0x3, 0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc5,0x70,0x18,0x12, +0x9e,0x17,0x7e,0x73,0x2a,0x3, 0x7a,0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, +0x7e,0xb3,0x34,0xc5,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc5,0x22,0xe4,0x7a,0xb3, +0x34,0xc5,0x7a,0xb3,0x2a,0x9, 0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x35, +0xe9,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73, +0x35,0xe8,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0xc1, +0xd2,0x7c,0x57,0xc1,0xca,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98, +0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff, +0x68,0x66,0x12,0x9e,0xe2,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e, +0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, +0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x9e,0xe2, +0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7, +0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0xc1,0x45, +0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6,0x28,0x2, 0xc1,0x41,0x7c,0xba,0xda, +0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0x7c,0xab,0x7e,0xb, +0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x34,0xa3,0xbe,0x73,0x34,0xad, +0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa3,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22, +0xbe,0x73,0x34,0xad,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74, +0xff,0x19,0xb4,0x34,0xa3,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x34,0xa3,0xbe,0xb0,0xff, +0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa3,0xd3,0x22,0xe4,0x19,0xb3,0x34,0xa3,0xc3,0x22, +0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34, +0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x5, 0xbe, +0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34, +0xb0,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x34,0x8b,0x80,0x4, 0x59,0x35,0x34,0x8b,0x59, +0xf5,0x34,0xb0,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x25,0x3c, +0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x25,0x3c, +0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28, +0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90, +0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0x12,0x5e,0x25, +0x38,0xb2,0x22,0x7e,0x8, 0x34,0xa2,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20,0xde,0x6c, +0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12,0x2f,0xb7,0x60,0xa, 0x12,0xa0,0x84,0x40, +0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5, +0x7c,0xb0,0x6c,0x77,0x12,0xa0,0x49,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70, +0x1, 0x12,0xa0,0x49,0xb4,0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x2f,0xb7, +0x60,0xc, 0x12,0xa0,0x84,0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x51,0x5f,0xb, 0x10, +0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3,0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e, +0xb3,0x36,0x61,0x7a,0xb3,0x36,0x62,0x7a,0xa3,0x36,0x61,0x7e,0xb3,0x36,0x62,0x60, +0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e,0xb3,0x36,0x63,0x60, +0x5, 0x14,0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x0, 0x28,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c, +0xa7,0x90,0x60,0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, +0x80,0x71,0xbe,0xb0,0x2, 0x38,0x66,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27, +0x7e,0x73,0x26,0xfa,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26, +0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x2, +0x80,0x4e,0x6c,0xff,0x80,0x30,0x7c,0xbf,0x12,0x37,0x81,0x1a,0x4b,0x7c,0xbf,0x12, +0x37,0x6f,0x7d,0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d, +0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, 0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75, +0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xcb,0x80,0x6, 0xe5,0x1e,0x24, +0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, +0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22,0x7e,0x39,0x70,0xa, 0x37,0x9d,0x32,0x2, +0x21,0x0, 0xca,0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6, +0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd, +0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f,0x46,0x75,0x2b,0x0, 0x61,0x43,0x12,0xa4, +0xde,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b, +0x2e,0x34,0x14,0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x22,0xff,0x12,0x20,0xb9,0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a,0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35, +0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff,0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a, +0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5,0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xa4, +0xe6,0x2e,0x35,0x36,0x12,0xa1,0x48,0x7d,0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58, +0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, 0x3b,0x7f,0x3, 0x12,0xa4,0xe6,0x2e,0x35, +0x38,0x12,0xa1,0x48,0x7d,0xc3,0x7e,0x35,0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32, +0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37,0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a, +0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c, +0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5,0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb, +0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0x61, +0x41,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60, +0x8, 0x2, 0x61,0x41,0x80,0x28,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, +0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x61,0x41,0xbe,0x34,0x0, 0x30,0x8, +0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x61,0x41,0x7e,0xa3, +0x38,0x41,0x74,0xc, 0xa4,0xbe,0x57,0x22,0xf9,0x58,0x2, 0x61,0x41,0x7e,0xa3,0x38, +0x42,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58,0x2, 0x61,0x41,0x7e,0x15,0x36,0x6d,0x0, +0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xa3,0x7e,0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d, +0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xa3,0x7e,0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73, +0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38,0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b, +0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4,0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10, +0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33,0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7c,0xb7,0xf5,0x2e,0xe5,0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37, +0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34,0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e, +0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22, +0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35,0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a, +0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a,0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22, +0xf6,0x5, 0x2b,0x12,0xa4,0xde,0x28,0x2, 0x21,0x7e,0x7e,0xa3,0x22,0xf7,0xbe,0xa1, +0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe,0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50, +0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, 0x34,0x7a,0x73,0x38,0x3e,0x7a,0xb3,0x38, +0x40,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x38,0x3e,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a, +0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43,0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14, +0x12,0xa4,0xd6,0x7a,0x55,0x4a,0xa, 0x5e,0x7f,0x16,0x12,0xa4,0xd6,0x7a,0x55,0x48, +0x7e,0x35,0x48,0x12,0xa4,0xcf,0x2f,0x50,0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a, +0x0, 0x2f,0x70,0x12,0xa4,0xcf,0x12,0xa4,0xc5,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d, +0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4a,0x12,0xa4,0xc5,0x7e,0x1d,0x40, +0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12, +0xa4,0xc5,0x7e,0x1d,0x44,0x2f,0x10,0x7a,0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c, +0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x1f,0x58,0x7f,0x51,0x7f,0x17,0x7f, +0x6, 0x12,0x1f,0x58,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12, +0x1e,0xfc,0x7e,0x87,0x23,0x43,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x3c,0x7e,0x1d,0x40,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x40,0x7e,0x1d,0x44,0x7d,0x19,0x12,0x1e,0xfc,0x7d,0x18, +0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x58,0x7a,0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1e, +0xeb,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12,0x1e,0xeb,0x7e,0x5d,0x3c, +0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1e,0xeb,0x7e,0x7d,0x40,0x9f,0x71,0xbe,0x58, +0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18, +0x7f,0x16,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x5, 0x12,0x1f,0x58,0x7f,0x6, 0x12,0x1e, +0xeb,0x7f,0x7, 0x12,0x1f,0x58,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44, +0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0x7f,0x1, 0x22,0x7d, +0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x39,0x1, 0xbe,0x71,0x2b,0x22,0x2d,0x13,0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79, +0x6c,0xaa,0x12,0xa5,0xe4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf, +0x38,0x43,0x7f,0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x38, +0x63,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda,0x7e,0x8, 0x38,0x43,0x7e,0x18,0x38,0x63, +0x74,0x20,0x12,0xa1,0x52,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73, +0x38,0x3f,0xbe,0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22, +0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0x33,0x38,0x3f,0xa, 0x13,0x6d,0x0, 0x12, +0x1f,0x7, 0x7c,0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64, +0xa, 0x3e,0x1b,0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xa5,0x92,0x7f,0x6, 0x7c, +0xbd,0x7c,0x7c,0x12,0xa5,0x92,0xb, 0xf0,0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x50,0xbc, +0x7f,0x5, 0x7f,0x16,0x12,0xa4,0xee,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x38,0x3e,0xda, +0x3b,0x22,0x7c,0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d, +0x2, 0xb, 0xa, 0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, +0x7c,0x21,0xa5,0xba,0x0, 0x14,0x1a,0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d, +0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, +0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35, +0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xe4,0x7a, +0xb3,0x35,0x69,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x5, 0xe4, +0x7a,0xb3,0x35,0xe4,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x4f,0x12,0xa6,0x4e,0x28, +0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0xdc,0xbe,0x37, +0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x3, 0x70,0x17,0x7e, +0xb3,0x37,0x8, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28, +0x5, 0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0xb3, +0x28,0x84,0xbe,0xb0,0x0, 0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x6e, +0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c, +0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x4a,0x12,0xa6,0xff,0x78, +0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x21, +0x0, 0x7d,0x13,0x7d,0x3e,0x12,0x21,0x0, 0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5, +0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33,0x9e,0x35,0x2e,0xbd,0x3e,0x8, +0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, +0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xae,0x7e,0x73, +0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80, +0xa, 0x12,0xa6,0xff,0x78,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc, +0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0xc1,0x71,0xda,0x3b,0x22,0xa, +0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22, +0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d, +0x0, 0x7f,0x14,0x12,0x1f,0x58,0x7d,0x73,0x12,0x21,0x0, 0x7d,0xe3,0x7d,0x3f,0x12, +0x21,0x0, 0xbd,0x3e,0x22,0x7e,0x63,0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c, +0xc2,0x12,0x6c,0x33,0x80,0x56,0x90,0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac, +0x93,0x90,0x60,0xab,0xe4,0x93,0xa, 0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4, +0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a, +0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x31,0x5a,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f, +0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, 0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, +0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75, +0xbc,0x73,0x38,0xa2,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x32,0xe7,0x22,0x90,0x60,0xa7, +0xe4,0x93,0x60,0x8, 0x30,0x12,0x5, 0x12,0x31,0x7d,0xc2,0x12,0x22,0xca,0xd8,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x22,0xe6,0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x1f,0xad,0x6d,0x11,0x7e,0x4, +0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0xa8,0xe1,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d, +0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, +0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x1, 0xd2,0xbe,0xd4,0x4, +0xb0,0x8, 0x2, 0xd2,0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd, +0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7, +0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x1, 0xd2,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, +0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0xa8,0xe1,0x1a,0x26,0x1a,0x24,0x2f, +0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0xa8,0xd7,0x9f,0x55,0x6c,0xee, +0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12, +0x21,0x0, 0x7d,0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, +0x1d,0x12,0xa8,0xd7,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, +0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea, +0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x58,0x7d,0x13, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x0, 0xca, +0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x80,0xc2,0x3, 0x6d,0x44,0x80,0x32, +0x12,0xa9,0x90,0x12,0xa8,0xe9,0xbd,0x3d,0x48,0x26,0x12,0xa9,0x90,0xb, 0x1a,0x30, +0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0xd2,0x3, 0x80,0x9, 0x12,0x21,0x0, 0xbd,0x3d,0x68, +0x2, 0xc2,0x3, 0x7d,0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa8,0xe9,0x7d,0xd3, +0xb, 0x44,0x7e,0xc5,0x35,0xbd,0xc4,0x38,0xc7,0x30,0x3, 0xc, 0x7e,0xf0,0x7f,0x80, +0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba,0x7d,0x3d,0x60,0x5, 0xe, 0x34, +0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f,0x10,0x2e,0x35,0x35,0x7a,0x1b, +0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30, +0x7f,0x60,0x2e,0xd5,0x35,0x7e,0x6b,0xb0,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0x7c, +0xb7,0x12,0xa9,0x9b,0xb, 0x44,0x7e,0x55,0x35,0xbd,0x54,0x38,0xd8,0xda,0xf8,0x22, +0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a, +0x1b,0xb0,0x22,0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5, +0x1, 0x6c,0xaa,0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0xa9,0x99,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xed,0xc2,0xc9,0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, +0x7e,0x73,0x2a,0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0xad,0x13, +0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x38,0xd9, +0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, +0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35,0x35,0x7e,0xf, 0x37, +0x40,0x7e,0x18,0x25,0xb6,0x2, 0xa8,0xef,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12, +0xaa,0x51,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37, +0x24,0xf6,0x12,0xaa,0x58,0x12,0xaa,0x61,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, +0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, +0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2, +0x22,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53, +0x2a,0x6d,0xac,0x54,0x7e,0x17,0x28,0xa1,0x12,0xaa,0x51,0x6d,0x0, 0x80,0x37,0x7d, +0x40,0x3e,0x44,0x7e,0x7f,0x38,0xd9,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10, +0x7d,0xf4,0x2e,0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14, +0x6d,0x55,0x9d,0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d, +0x51,0x1b,0x48,0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22,0x7c,0xab,0x7e,0x8, 0x29, +0xbc,0x12,0x5e,0x25,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0,0xb4, +0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31,0x7d, +0x20,0x39,0xb1,0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0x61,0x96,0x90,0x60, +0xa7,0xe4,0x93,0x70,0x2, 0x61,0x96,0x6c,0xff,0x61,0x8f,0x7e,0x70,0x9, 0xac,0x7f, +0x9, 0xe3,0x29,0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, +0x7d,0x3d,0x12,0xab,0xa4,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, +0x7d,0x34,0x1b,0x34,0x12,0xab,0x9b,0x7c,0xbe,0x12,0xaa,0xbb,0x80,0x3f,0x7e,0x70, +0x2, 0xac,0x7d,0x2e,0x34,0x60,0xc5,0x12,0x87,0xbc,0x74,0x9, 0xac,0xbf,0x59,0xd5, +0x29,0x8, 0x7e,0x34,0x60,0xcf,0x12,0x23,0x9e,0x12,0xab,0x9b,0x80,0x1f,0xbd,0xc4, +0x40,0x1b,0x7d,0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0xaa, +0xbb,0x7d,0xc4,0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12, +0x5e,0x2d,0x28,0x2, 0x61,0xb, 0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59, +0x35,0x29,0xa, 0x22,0x6c,0xaa,0x80,0x27,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e, +0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14, +0x60,0xb3,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0xb, 0xb, 0xa0,0x90, +0x60,0xa7,0xe4,0x93,0xbc,0xba,0x38,0xd0,0x7c,0xba,0x22,0x90,0x60,0xa7,0xe4,0x93, +0x60,0x2b,0x6c,0x33,0x80,0x1f,0x7c,0xb3,0x12,0x31,0x5a,0x40,0x16,0x7c,0xb3,0x12, +0x31,0x27,0x7d,0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x1b,0x1a,0x50,0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0xac, +0x20,0x7e,0x14,0x62,0x7, 0x12,0x87,0xee,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22, +0x6d,0x11,0xe4,0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x7f,0x38,0xf3,0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12, +0x21,0x0, 0xbd,0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xf3,0x2d, +0x13,0x69,0x20,0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x81,0xbf,0x7e,0x10,0x2, 0xac, +0x1a,0x7e,0x1f,0x38,0xf3,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78, +0x4, 0x7e,0x14,0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e, +0x14,0x7f,0xff,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22, +0x6c,0x66,0x7e,0x27,0x39,0x4, 0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e, +0xb3,0x28,0xac,0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xab,0xbc,0x76,0x50,0xf, 0xe4,0x7a, +0xb3,0x28,0xad,0x12,0x8a,0x87,0x7e,0xb3,0x2f,0xab,0x4, 0x80,0x4, 0xe4,0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xab,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xac, +0xbe,0xa0,0x5, 0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74, +0x5, 0x80,0x1, 0xe4,0x7a,0xb3,0x2f,0xac,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8, +0x30,0x1, 0xe, 0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, +0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d, +0x23,0xa, 0x3a,0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f, +0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac, +0x56,0x49,0x22,0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e, +0xb3,0x2a,0x6d,0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, +0x2, 0xc2,0x3, 0xa2,0x3, 0x22,0xc2,0x3, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1, +0x60,0x4, 0xd2,0x3, 0x80,0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57, +0x49,0x12,0x4, 0xfc,0x7e,0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d, +0x22,0x9d,0x20,0xbd,0x12,0x58,0x4, 0xd2,0x3, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e, +0x14,0x0, 0x3, 0xa, 0x27,0xbd,0x21,0x48,0xd2,0xa2,0x3, 0x22,0x7d,0x23,0x7e,0x14, +0x61,0xc8,0x12,0x64,0xd3,0x7e,0x14,0x0, 0x5, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50, +0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x8, 0x50,0x45,0x74,0x8, 0x80,0x3d,0x7d,0x13, +0x3e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x6, 0x50,0x30,0x74, +0x6, 0x80,0x28,0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e, +0x33,0x36,0xdc,0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, 0x80,0xf, 0xbd,0x32,0x50,0xf, +0x7e,0x73,0x36,0xdc,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xdc,0x7e, +0xb3,0x36,0xdc,0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a,0xb3,0x36,0xdc,0x74,0x1, 0x7a, +0xb3,0x16,0x92,0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3,0x36,0xdc,0x50,0x5, 0xe4,0x7a, +0xb3,0x16,0x91,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0xae, +0xad,0x68,0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0xae,0xc5,0x7d,0x23,0x7e,0x70,0xc, +0xac,0x72,0x59,0x23,0x36,0x82,0x49,0x3, 0x36,0x82,0x49,0x23,0x36,0x7e,0xbd,0x20, +0x50,0x4, 0x59,0x3, 0x36,0x7e,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22, +0x80,0x18,0x12,0xae,0xad,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7e, +0xbd,0x4, 0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37, +0x36,0x64,0xbe,0x37,0x36,0xdd,0x50,0x8, 0x7e,0x37,0x36,0xdd,0x7a,0x37,0x36,0x64, +0x12,0xae,0xbb,0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, +0xac,0x12,0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, 0x22,0x7e,0x70,0xc, 0xac,0x7a, +0x49,0x33,0x36,0x7e,0x22,0x49,0x23,0x36,0x84,0x49,0x33,0x36,0x80,0x9d,0x32,0x2, +0x21,0x0, 0x7e,0x8, 0x36,0x7a,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x20,0xde,0x6c,0xaa, +0x7e,0x44,0xff,0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7c,0x59,0x43,0x36, +0x84,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x68,0x7e,0x34,0x0, 0xd, +0xe4,0x2, 0x20,0xde,0x7e,0xa3,0x2b,0x62,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62, +0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4,0x2, 0xa, 0x66,0x22,0xc2,0xc, 0x7e, +0x8, 0x2a,0x6d,0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x6d,0x74,0x3, 0x2, 0x11,0x7a,0xe4, +0x7a,0xb3,0x36,0x67,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59, +0x43,0x36,0x7e,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xee,0xe4,0x7a,0xb3,0x36,0x68,0x6d, +0x33,0x7a,0x37,0x36,0x6f,0x7a,0x37,0x36,0x64,0x22,0x7e,0xb3,0x36,0x6a,0xb4,0x1, +0x27,0x7e,0xb3,0x36,0xe0,0x4, 0x7a,0xb3,0x36,0xe0,0x7e,0x73,0x36,0xe0,0xbe,0x70, +0x3, 0x40,0x15,0x12,0x8c,0x90,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x6, 0x40,0x9, 0xe4, +0x7a,0xb3,0x36,0xe0,0x7a,0xb3,0x36,0x6a,0x22,0x12,0x24,0x14,0xe4,0x7a,0xb3,0x3, +0xfe,0x2, 0x76,0x52,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88, +0x7e,0xf0,0x1, 0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f, +0x7f,0x7, 0x2d,0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc, +0x9f,0x38,0xe2,0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0, +0x1, 0x2, 0xb0,0x54,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, +0x80,0x36,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26, +0xfb,0xe5,0x44,0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16, +0x5, 0x45,0xa, 0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0xb0,0x62,0xbd,0x3d,0x8, +0x5, 0x12,0xb0,0x62,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe, +0xb0,0x0, 0x28,0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba, +0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x33,0xc3,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a, +0x19,0x72,0x33,0xc4,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x30,0x3, 0x1b,0x1a,0xd0, +0xb, 0xa0,0xb, 0xf0,0xbc,0x8f,0x40,0x3, 0x2, 0xaf,0xd4,0x7c,0xba,0xda,0x79,0xda, +0xd8,0x22,0x7c,0xbe,0x7c,0x7d,0x2, 0x2c,0x40,0x7c,0x9b,0x7f,0x71,0x7f,0x60,0x7e, +0x34,0x22,0xb8,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f,0x52,0x74,0x2a,0x12,0x1f,0xad, +0x7e,0x58,0x1f,0x52,0x7c,0xb9,0x7e,0x71,0x44,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x45, +0x7e,0x71,0x46,0x12,0x2c,0x40,0x2d,0x34,0xe, 0x34,0x7f,0x5, 0x7e,0x50,0x7, 0xb, +0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, 0x1b,0x6a,0x30,0x69,0x30,0x0, +0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe2,0x22,0x6d,0x33, +0x7d,0x23,0x7d,0x3, 0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x6e, +0xac,0xb3,0xa, 0x42,0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4, +0xb, 0x7a,0x40,0xbe,0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, +0x24,0xbe,0x44,0xff,0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, +0x34,0xb, 0x21,0x7e,0x93,0x2a,0x6e,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb3,0x38,0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e, +0x14,0x1e,0x14,0x12,0x25,0x3e,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a, +0xb3,0x39,0x8, 0x7e,0xb3,0x39,0x9, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39, +0x9, 0x80,0x3c,0xe4,0x7a,0xb3,0x39,0x9, 0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22, +0xbd,0x32,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x9, 0x7e,0xb3,0x39,0x8, 0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x8, 0x80,0x16,0xe4,0x7a,0xb3,0x39,0x8, 0x74,0x2, +0x80,0x9, 0xe4,0x7a,0xb3,0x39,0x8, 0x7a,0xb3,0x39,0x9, 0x7a,0xb3,0x39,0xa, 0x7e, +0xb3,0x39,0xa, 0x22,0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x39,0xb, 0x22,0xca,0xd8, +0xca,0x79,0xc2,0x3, 0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7,0x28,0x97, +0x7e,0x37,0x37,0xfb,0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff,0x7e,0xa3, +0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14,0x24,0xc2, +0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83,0x2a,0x6d, +0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99,0x80,0xf, +0x7c,0xb9,0x12,0x37,0x6f,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, 0x90,0x7e, +0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x61,0x4f,0x7e,0xa3, +0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3,0x26,0x83, +0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34,0x49,0x23, +0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, 0x6d,0x33, +0x9d,0x3e,0x12,0x8f,0xdc,0xbd,0x3, 0x8, 0x4, 0xd2,0x3, 0x80,0x6, 0xb, 0x90,0xbc, +0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe,0xe7,0x7, 0xf8,0x8, 0x2, 0xc2, +0x3, 0x30,0x3, 0x20,0x7e,0xb3,0x39,0xb, 0x4, 0x7a,0xb3,0x39,0xb, 0x7e,0x23,0x39, +0xb, 0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x39,0xb, 0x74,0x1, 0x7a,0xb3, +0x28,0xa8,0x80,0xf, 0x7e,0x23,0x39,0xb, 0xbe,0x20,0x0, 0x28,0x6, 0x1e,0x20,0x7a, +0x23,0x39,0xb, 0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28,0x69,0x7e, +0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68,0x59,0x7e, +0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, +0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x2c,0x3c,0xbe,0x34,0x0, 0x96,0x8, 0x5, +0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38,0xdb,0x6c, +0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3,0x27,0x37, +0x12,0x2c,0x3c,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90, +0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x17,0xa, 0xe9,0xa, 0x5f, +0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x39,0xc, 0x4, +0x7a,0xb3,0x39,0xc, 0x7e,0x73,0x39,0xc, 0xbe,0x70,0x5, 0x28,0x22,0x74,0x5, 0x7a, +0xb3,0x39,0xc, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x15,0x12,0xb1,0x84,0x80,0xf, +0x7e,0x73,0x39,0xc, 0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x39,0xc, 0xda, +0x79,0xda,0xd8,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34,0x0, 0x38,0xca,0x39,0xac,0x7f, +0x2e,0x34,0x0, 0x50,0x6d,0x22,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, 0x30,0x6d,0x22,0x7e,0x8, 0x3, +0x60,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0x3e, +0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x20,0xde,0x90,0x60,0x93,0x93,0xa, 0x3b,0x7e, +0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43,0x6c,0x77,0x80, +0x1d,0xa, 0x27,0x2d,0x24,0x12,0x87,0xdc,0xb, 0xa, 0x0, 0x7e,0x30,0x2, 0xac,0x37, +0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, 0x70,0xbc,0xa7, +0x38,0xdf,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x13,0xc6, +0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24,0x13,0x8e,0x9d,0x31,0x1b,0x28, +0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38,0xdc,0x22,0x7c,0xab,0x12,0xb4, +0xb, 0xd2,0x16,0x7c,0xba,0x12,0x86,0xf8,0xc2,0x16,0x22,0xa9,0xd1,0xcb,0x74,0x1, +0x2, 0x0, 0xe, 0x12,0xb4,0xb, 0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x6d,0x12,0xb4, +0x4c,0x12,0xb4,0x2f,0x7a,0x37,0x38,0xd6,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x6d, +0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb5,0x19,0x90,0x60, +0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb4,0x80,0x22,0x7a,0xb3,0x24,0xf2, +0x7e,0x53,0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa,0xe4,0x7a,0xb3,0x24, +0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24,0xf6,0x7e,0x34,0x0, +0x20,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x7a,0x37,0x24,0xfc,0x7e,0x8, 0x24,0xf2,0x22, +0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e,0xa, 0xd8,0x90,0x60,0x94,0xe4, +0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x18,0x7e,0x70,0x2, 0xac, +0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, 0x5a,0xc0,0x9d,0xc2,0x59,0xc3, +0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60,0x92,0xe4,0x93,0x7c,0x9b,0x6d, +0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92,0xe4,0x93,0xa, 0xcb,0x1b,0xc4, +0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x7d,0x23, +0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d,0x3e,0x34,0x2d,0x31,0x7d,0x20, +0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x0, 0x7d,0xa3,0xbd,0xfa,0x58,0x2, +0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8,0x2d,0xec,0x2d,0xdc,0xb, 0xf0, +0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca,0xf8,0x6d,0x44,0x7e,0xf3,0x2a, +0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3,0x2a,0x6d,0xa, 0xeb,0x2d,0xef, +0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x31, +0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda,0x2d,0xdf,0x3e,0xd4,0x7e,0x1f, +0x38,0xd9,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x50,0x2d,0xb2, +0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, 0xa0,0xbc,0xfa,0x38,0xd9,0x80, +0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x38,0xd9,0x2d,0x15,0x6c,0xaa,0x80,0x2c,0xa, +0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x38,0xd9,0x2d,0x3e,0xb, 0x1a,0xe0,0x7e,0x70, +0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0,0x7d,0x3e,0x9d,0x3d,0x12,0x21, +0x0, 0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, 0xa0,0xbc,0xfa,0x38,0xd0,0x7d, +0x34,0xda,0xf8,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9,0xc5,0xea, +0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x4e,0x7e,0x73,0x39,0x6, +0xbe,0x71,0x4e,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9,0x34,0xe5, +0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x33,0xe5, +0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5,0x3, 0xa9, +0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8,0x22,0x7e, +0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79,0x30, +0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79,0x30, +0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79,0x30, +0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd0,0xce,0xa2,0x3, 0xa9,0x95,0xc9,0x22, +0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0xa9,0xc2,0xeb,0xa9,0xd2, +0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9, +0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, 0x75,0x8b,0x0, 0xd2,0x8e, +0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7,0x0, 0x75,0xf8,0x0, 0xa9, +0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xc1, +0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7,0xc2,0xbe,0x22,0x75,0xe7, +0x6b,0x2, 0xb6,0xc4,0xe4,0x7e,0x34,0xd7,0xfc,0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0, +0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0x7e,0x37,0x39,0x4, 0xb, 0x34,0x7a,0x37,0x39,0x4, 0xbe,0x34,0xff,0x0, +0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37,0x39,0x4, 0x22,0x7c,0x6b,0x6c,0x77,0x6c, +0xaa,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x46,0x12,0xb7,0xb9,0x75,0xb5,0x5, 0xa9,0x36, +0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3, +0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5, +0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47, +0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0x22,0x74,0x6, +0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73,0x7d,0x52,0x7c,0xab,0x7e,0xb3, +0x39,0x13,0xb4,0xa5,0x3c,0x12,0xb7,0xb9,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0x12, +0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2, +0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0xb7,0x62,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x22, +0x74,0x2, 0x7d,0x3f,0x2, 0xb7,0x62,0x7d,0x42,0x7f,0x60,0x7d,0x3, 0x12,0xb8,0x38, +0x74,0x2, 0x12,0xb6,0xfb,0x7d,0xf3,0x4e,0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, 0x12, +0xb7,0xc0,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f,0x6, 0x12,0xb8,0x64,0x5e,0xf4, +0xff,0xfd,0x12,0xb7,0xc0,0x2, 0xb7,0xf8,0xa9,0xc5,0xca,0xe4,0x7a,0xb3,0x39,0x13, +0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12,0xb6,0xfb,0x4c,0xff,0x78,0x5, 0x5e,0x70, +0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0xb7,0x62,0xda,0xf8,0x22,0xd2,0xc8, +0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0xb8, +0x38,0xe4,0x12,0xb8,0x1, 0x2, 0xb7,0xf8,0xa9,0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1, +0xea,0x74,0xa5,0x7a,0xb3,0x39,0x13,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24,0xbd, +0x32,0x38,0xe9,0x22,0x12,0xb8,0x72,0x7e,0x35,0x36,0x12,0xb8,0x48,0xa9,0xd2,0xb4, +0xd3,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5,0xa, 0x44,0xf5,0x39,0x7f,0x21, +0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xb8,0x9d,0xe5,0x3a,0x12,0xb8,0x9d,0xe5, +0x39,0x12,0xb8,0x9d,0xe5,0x38,0x12,0xb8,0x9d,0xe4,0x2, 0xb8,0x9d,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c, +0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, +0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74, +0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x97,0xbe,0x90,0x1, +0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe, +0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18, +0xb2,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xb9,0x5c,0xb, 0x7a,0x20, +0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d, +0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25, +0x3c,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, +0xf9,0x2d,0xf1,0x7d,0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77, +0x14,0x78,0xfb,0x4d,0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xd9,0x7e,0x8, +0x1f,0x3c,0x12,0xba,0x1a,0xd2,0x3, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xb9,0x64, +0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32, +0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, +0x12,0xba,0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7, +0x38,0xee,0x12,0xba,0x7, 0xe4,0x12,0xba,0xf, 0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a, +0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xba,0x7, 0x74,0x1, 0x12,0xba,0xf, 0x74, +0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12, +0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x1c,0x74,0x3f, +0x2, 0x20,0xde,0x7e,0x8, 0x1f,0x34,0x12,0xba,0x1a,0x6c,0x77,0x80,0xe, 0x12,0xba, +0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x6e, +0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9, +0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x44,0xa, +0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57,0x7c,0xab, +0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46, +0x2e,0x44,0x20,0x73,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b,0xbe,0x60, +0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb, +0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b, +0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70, +0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbb,0x29,0x60,0x5, 0x3e, +0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16, +0x9e,0x60,0xe, 0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b, +0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72, +0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12,0x77,0xf6,0xb, 0x24,0xa, 0x33,0xbd,0x32, +0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28, +0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f, +0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d, +0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a, +0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a, +0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a, +0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3, +0xff,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, +0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85, +0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88, +0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53, +0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e, +0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91, +0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12,0x2f,0xd0,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xfb,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x37,0x32,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xbd,0x64, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x38,0xfc,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x37,0x33,0x80,0x1a,0x12,0xbd,0x64,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x38,0xfb,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x34,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f, +0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x80, +0x7e,0x34,0x0, 0x28,0xe4,0x12,0x20,0xde,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, 0xc0, +0x12,0x20,0xde,0x7a,0xb3,0x37,0x34,0x7e,0x34,0x62,0x8e,0x12,0x23,0x9e,0x7a,0x37, +0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a,0xe7, +0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a,0xf7, +0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a,0xf7, +0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe,0x7a, +0xb3,0x37,0x34,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x7e,0x37,0x38,0xe2,0x9e,0x37,0x38,0xde,0x12,0x21,0x0, 0xbd,0x31,0x38,0x12, +0x7e,0x37,0x38,0xe4,0x9e,0x37,0x38,0xe0,0x12,0x21,0x0, 0xbd,0x31,0x38,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd, +0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x38,0xdd,0x60,0x11,0x7e,0xc7, +0x38,0xe6,0x4d,0xcc,0x78,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x28,0x2, 0xe1,0x8, 0xbe, +0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xe1,0x8, 0x7e,0xe7,0x29,0x8, 0x7e, +0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x66,0xe6,0xbe,0xb0,0x1, 0x78,0x2, 0xe1, +0x8, 0x7e,0xa3,0x38,0xdd,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23, +0x14,0x78,0x2, 0xe1,0x5, 0xb, 0xb2,0x68,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x68,0x2, +0xe1,0x17,0x4c,0xee,0x68,0x2, 0xe1,0x17,0x74,0x1, 0x7a,0xb3,0x38,0xdd,0x12,0xbf, +0x2a,0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3, +0x38,0xdd,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xdd,0x7e,0x34, +0x62,0x68,0x80,0x48,0x12,0xbf,0x33,0x90,0x62,0x57,0x12,0xbf,0x1e,0x68,0x49,0x80, +0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xbf,0x33,0x7e,0x34,0x62, +0x60,0x12,0x23,0x9e,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d, +0xc3,0xbe,0xc7,0x38,0xe6,0x40,0x21,0x90,0x62,0x56,0x12,0xbf,0x1e,0x68,0x19,0x12, +0xbf,0x2a,0x74,0x3, 0x7a,0xb3,0x38,0xdd,0x7e,0x34,0x62,0x64,0x12,0x23,0x9e,0x7a, +0x37,0x38,0xe6,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xdd,0x6d,0x33,0x7a, +0x37,0x38,0xe6,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93, +0xa, 0x3b,0x12,0xbd,0xe9,0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x38,0xde,0x7a,0xf7, +0x38,0xe0,0x22,0x7a,0xe7,0x38,0xe2,0x7a,0xf7,0x38,0xe4,0x22,0xca,0xf8,0x7f,0x51, +0x7f,0x40,0x7e,0x37,0x2f,0x90,0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c, +0x7e,0x37,0x2f,0x9c,0x7a,0x35,0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff, +0x80,0x1e,0x7e,0x34,0x0, 0x26,0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0x8c,0x74, +0x2, 0xac,0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xbf,0x8b,0xb, 0xf0, +0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e, +0x35,0x2f,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e, +0x35,0x31,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, +0x6a,0x30,0x9e,0x35,0x33,0x6d,0x22,0x7e,0x33,0x38,0x41,0x12,0xbf,0xe0,0x7e,0x15, +0x2f,0x12,0x1f,0x5, 0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e, +0x33,0x38,0x42,0x12,0xbf,0xe0,0x7e,0x15,0x31,0x12,0x1f,0x5, 0x1b,0x7a,0x30,0x22, +0xa, 0x13,0x6d,0x0, 0x2, 0x1e,0xeb,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, +0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22, +0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x7e,0x34,0x60,0xa3,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e,0x37,0x2a,0x53,0x22,0x7e,0xa3,0x2a,0x6e,0x7e, +0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d,0x22, +0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b, +0x14,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e, +0x7b,0x60,0xbc,0x6b,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x2e,0x14,0x1, 0x30,0x6d, +0x0, 0x7e,0x18,0x3, 0x60,0x22,0x2e,0x14,0x0, 0x50,0x6d,0x0, 0x7e,0x18,0x34,0x0, +0x22,0x74,0x6, 0x12,0xb6,0xfb,0x7d,0x3, 0x6c,0x11,0x22,0x7e,0x70,0x2, 0xac,0x7c, +0x9, 0xb3,0x26,0xfa,0x22,0xe4,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36,0x71,0x22,0x74, +0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x61,0x57, +0x22,0x7a,0x37,0x28,0xa1,0x7e,0x34,0x61,0xc2,0x22,0x90,0x60,0xaa,0xe4,0x93,0xbe, +0xb0,0x1, 0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b,0xf, 0x22,0x74,0x5, 0xac,0xbc, +0x9, 0xb5,0x26,0x33,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22,0x7e,0xe3, +0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e, +0x37,0x25,0xf4,0x7a,0x37,0x31,0xcc,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x31,0xce, +0x22,0x7e,0x73,0x37,0xbd,0x7a,0x73,0x2b,0x20,0x22,0x12,0x0, 0x1e,0x7e,0xb3,0x2a, +0xfc,0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0, +0x1, 0x22,0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xb3,0x37,0x31,0xbe,0xb0, +0x1, 0x22,0x7e,0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7,0xe4,0x93,0x7c, +0xab,0x22,0xc1,0x42,0x3e,0xbd,0x2d,0xd2,0x19,0x53, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_lens_tianma.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_lens_tianma.txt new file mode 100644 index 0000000000000..4e2af6643b38b --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_lens_tianma.txt @@ -0,0 +1,2713 @@ +0x2, 0x16,0x42,0x2, 0x9d,0xa4,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x49,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x49,0xeb,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x65,0x9a,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x22,0x2, 0x65,0xb6,0x2, 0x20,0x74,0x32,0x32,0x2, 0x0, 0x4a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0x2, 0x27,0x69,0xff,0xff,0x2, 0x0, 0x5a,0xb2,0x86, +0x22,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x33,0xe7, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x33,0xf7,0x7e,0x73,0x33,0xf7,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x66,0xc9,0x7e,0x1f,0x33,0xe7,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x33,0xe7,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x33,0xeb,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x33,0xf3,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x33,0xf1,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf3,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0x4b,0x63,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x14,0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x14, +0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x52,0x61,0x3f,0x7e,0x34,0x14,0x89,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x61,0x3f,0x7e,0x34,0x14,0x89,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x14,0x22,0x61,0x3f,0x7e,0x34,0x14,0x6, 0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x14,0x36,0x61,0x3f,0x7e,0x34,0x14,0x7a,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14, +0x61,0x61,0x3f,0x7e,0x34,0x14,0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x14,0xd9,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x14,0xda,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x34,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x34,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x33,0xe7,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x33,0xe7,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x33, +0xe7,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x33,0xe7,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x17,0x4e,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf3,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x33,0xdf,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf3,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x33,0xdf,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf3,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf3,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf3,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x33,0xe7,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x15,0x29,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x33,0xe7,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x15,0x29,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x15,0x29,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x33,0xe7,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x33,0xfc,0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x33,0xfc,0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x82,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x33,0xfc, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x33,0xfc, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x33,0xfc,0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xef,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xef,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xef,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xef,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x33,0xdf,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x33,0xdf,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x33,0xdf,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x33,0xdf,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x33,0xe7,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x33,0xe7,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x33, +0xe7,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x33,0xe7,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x33,0xe7,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x33,0xe7,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x33,0xe7,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x33,0xe7,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x33, +0xe7,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x33,0xe7, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x33,0xe7,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x33,0xe7,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x33,0xe7,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x33,0xe7,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x15,0x29,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x15,0x29,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xef,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xef,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xef,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x33,0xfc, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x33, +0xfc,0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x33,0xe7,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x33,0xe7,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x33,0xe7,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x33,0xe7, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x33,0xe7,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x33,0xe7,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x33,0xfc,0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x33,0xfc,0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x33,0xfc,0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf3,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xee,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x33,0xdf,0x1b,0x1a,0x10,0x7e,0xf, 0x33,0xdf,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf3,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf3,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x33,0xfc,0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x33,0xfc,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x33,0xfc,0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x33, +0xfc,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x33,0xfc,0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x33,0xfc,0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x15,0xc8,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x15,0x5b,0x7d,0x1e,0x12,0x15,0x75,0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x33,0xe7,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf3,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xee,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf3,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x66,0xc9,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x33,0xdf,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x33,0xdf,0x1b,0x1a,0x10,0x7e,0xf, 0x33,0xe7,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x33,0xf7,0x7e,0x1f,0x33,0xdf, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xef,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xef,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xef,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x33,0xe7,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x33,0xe7,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xef,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xef,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x33,0xfc,0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x16,0xff,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x17,0x0, 0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x33,0xdf,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x33,0xdf,0x1b,0x1a,0x10,0x7e, +0x1f,0x33,0xdf,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x33,0xe7,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf3,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x33,0xdf,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x33,0xdf,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x33, +0xe7,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x33,0xe7,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x33,0xe7,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x33,0xdf,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x15,0x77,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x15,0x77,0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0xc, 0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x5e,0x0, 0xc2,0x14,0x75,0x5f,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x60,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x17,0x90,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x1f,0xfb,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0x32,0x1, 0x19,0x1, 0x0, 0x2, 0xf8,0x4, 0xe7,0x5, 0xce,0x6, 0xc2,0x7, 0xb5,0x8, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xef,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0xa9,0x0, 0x0, 0x2, 0x37,0xfb,0x0, 0x0, 0x0, 0x2, 0x37, +0xfd,0x0, 0x0, 0x0, 0x1, 0x37,0xff,0x0, 0x0, 0x1, 0x36,0xdd,0xff,0x0, 0x1, 0x34, +0x4f,0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x2, 0x34,0x9e,0x0, 0x0, 0x0, 0x1, 0x34, +0xc1,0x0, 0x0, 0x1, 0x35,0x3a,0x0, 0x0, 0x1, 0x35,0x3b,0x0, 0x0, 0x1, 0x35,0x3c, +0x0, 0x0, 0x3c,0x35,0xe5,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x36,0x5d,0x0, 0x0, 0x1, 0x36,0x5e,0x0, 0x0, 0x1, 0x36,0x5f,0x0, +0x0, 0x1, 0x35,0xde,0x1, 0x0, 0x2, 0x35,0xe1,0x0, 0x0, 0x0, 0x1, 0x2f,0xc8,0x0, +0x0, 0x1, 0x2f,0xc9,0x0, 0x0, 0x1, 0x2f,0xca,0x0, 0x0, 0x1, 0x2f,0xcb,0x0, 0x0, +0x1, 0x36,0x62,0x1, 0x0, 0x1, 0x36,0xdc,0x0, 0x0, 0x1, 0x39,0xb, 0x0, 0x0, 0x6, +0x38,0xf7,0x30,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x3, 0x0, 0x0, 0x1, 0x39, +0x4, 0x0, 0x0, 0x1, 0x39,0x5, 0x0, 0x0, 0x1, 0x39,0x6, 0x0, 0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x0, 0x61,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x4, 0x37,0x4e,0x0, +0x0, 0x0, 0x0, 0x0, 0x1, 0x38,0xfd,0x0, 0x0, 0x1, 0x38,0xfe,0x0, 0x0, 0x2, 0x38, +0xff,0x0, 0x0, 0x0, 0x1, 0x39,0x1, 0x64,0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39, +0xc, 0x0, 0x0, 0x1, 0x39,0x8, 0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x38,0xd9, +0x0, 0x0, 0x2, 0x2b,0xd8,0x2b,0xde,0x0, 0x1, 0x2f,0x9e,0x2, 0x0, 0x1, 0x2f,0xc7, +0x0, 0x0, 0x4, 0x38,0xef,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf3,0x0, 0x0, 0x64, +0x0, 0x0, 0x4, 0x33,0xdf,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x33,0xe3,0x0, 0x0, 0x68, +0xc0,0x0, 0x4, 0x33,0xe7,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x33,0xf8,0x0, 0x0, 0x40, +0x0, 0x0, 0x4, 0x33,0xfc,0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, +0xf4,0x2, 0x58,0x0, 0xc, 0x1, 0x5e,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, +0x5, 0x0, 0x78,0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, +0x3c,0x0, 0x2, 0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, +0x28,0x0, 0x0, 0x0, 0x1e,0x12,0x37,0x6e,0x12,0x19,0xc5,0x12,0x19,0x90,0x12,0x1a, +0x6a,0x2, 0x19,0x54,0x12,0x19,0x65,0x7e,0xb3,0x2b,0x2e,0x12,0x97,0xf7,0x74,0x1, +0x7a,0xb3,0x36,0x66,0x22,0x12,0x98,0x95,0x74,0x1, 0x7a,0xb3,0x36,0x62,0x22,0x12, +0x19,0xfc,0x12,0x4a,0x17,0x12,0x20,0x1d,0x12,0x37,0x6e,0x12,0x19,0xfc,0x12,0x19, +0xc5,0x12,0xa8,0xc5,0x12,0x19,0x90,0x12,0x1a,0x6a,0x12,0x1a,0x9a,0x2, 0x19,0x54, +0x12,0x20,0x66,0x12,0x19,0xe2,0x2, 0x19,0x99,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, +0x19,0xa2,0x7d,0x43,0x7e,0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, +0xac,0x7a,0x59,0x43,0x34,0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34, +0x38,0xc3,0x22,0xd3,0x22,0x12,0x63,0x86,0x12,0x5d,0xb3,0x2, 0x19,0xce,0x30,0xf, +0x10,0x12,0x5d,0xed,0x50,0x3, 0x12,0x4e,0x83,0x12,0x5a,0xf8,0x12,0x7c,0x51,0xc2, +0xf, 0x22,0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x19,0xa2,0x7e,0x34,0x0, 0x1, 0x7e, +0x24,0x7, 0x7a,0x2, 0x19,0xa2,0x74,0x1, 0x7a,0xb3,0x37,0xae,0x7e,0x34,0xd, 0xac, +0x6d,0x22,0x7a,0x27,0x38,0xc8,0x7a,0x37,0x38,0xca,0x22,0xca,0xf8,0x7e,0xf3,0x37, +0xae,0xbe,0xf0,0x5, 0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xae,0x12,0x0, 0x9, 0x80, +0x40,0xbe,0xf0,0x4, 0x78,0xd, 0x12,0x19,0xf6,0xe4,0x7a,0xb3,0x2b,0x21,0x12,0x63, +0x86,0x80,0x2e,0xbe,0xf0,0x6, 0x78,0x13,0x12,0x19,0xf6,0x12,0x41,0xb, 0xe4,0x7a, +0xb3,0x2b,0x3d,0x12,0x5d,0xb3,0x12,0xa9,0x52,0x80,0x16,0xbe,0xf0,0x7, 0x78,0x17, +0x12,0x19,0xf6,0x12,0x5f,0xe9,0x50,0xfb,0x12,0x5d,0xd9,0x12,0x19,0xce,0x12,0x1a, +0x6a,0x74,0x2, 0x7a,0xb3,0x37,0xae,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a, +0xb3,0x34,0x39,0x12,0x45,0x31,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a, +0xb3,0x34,0x3a,0x22,0x12,0xa8,0xc5,0x12,0xa9,0xb, 0x7a,0x37,0x38,0xff,0x12,0x19, +0xfc,0x12,0x19,0xc5,0x12,0x1a,0x6a,0x2, 0x1a,0x9a,0x12,0x8a,0x65,0x50,0x4, 0x74, +0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca, +0x3b,0x12,0x5f,0xe9,0x50,0xfb,0x7e,0xf3,0x2b,0x2e,0x7c,0xbf,0x12,0x7c,0xd0,0x12, +0x7f,0x4d,0x7e,0xb3,0x2b,0x3e,0xf5,0x28,0x7e,0xc3,0x2b,0x3f,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0xf, 0x12,0x4e,0x49,0x7e,0xb3,0x16,0x91,0x70,0x6, 0x12,0x1a,0x6a,0xc3, +0x61,0xab,0x12,0x1b,0xae,0x3e,0x34,0xca,0x39,0x7e,0x18,0x6, 0xfc,0x7e,0x8, 0x4, +0x7e,0x12,0x17,0x29,0x1b,0xfd,0x12,0x1b,0xae,0x3e,0x34,0xca,0x39,0x7e,0x18,0x7, +0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x17,0x29,0x1b,0xfd,0x7e,0xb3,0x37,0x5, 0xb4,0x3, +0x7, 0x12,0x92,0x7a,0x7a,0x37,0x37,0xf1,0x74,0x1, 0x7a,0xb3,0x16,0x90,0x12,0x19, +0xc5,0x12,0x92,0x6b,0x12,0x4d,0x5a,0xe4,0x12,0x13,0xde,0x12,0x1a,0x6a,0x7e,0x8, +0x4, 0x7e,0x7a,0xd, 0x29,0x7e,0x18,0x6, 0x76,0x7e,0xb3,0x2b,0x91,0x12,0x63,0xce, +0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x29,0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12, +0x63,0xce,0x7e,0xd3,0x2b,0x3e,0x7e,0xe3,0x2b,0x3f,0xe5,0x28,0x7a,0xb3,0x2b,0x3e, +0x7a,0xc3,0x2b,0x3f,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d,0x10, +0x12,0x5b,0x7c,0x7a,0xd3,0x2b,0x3e,0x7a,0xe3,0x2b,0x3f,0x7c,0xbf,0x12,0x7b,0xd5, +0x12,0x91,0x80,0x7e,0xb3,0x39,0x2, 0x4, 0x7a,0xb3,0x39,0x2, 0x7e,0x73,0x39,0x2, +0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x2, 0x7e,0xb3,0x16,0x90,0x60, +0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e,0x73, +0x2a,0x93,0xa, 0x27,0x7e,0x73,0x2a,0x92,0xa, 0x37,0x2d,0x32,0x22,0x12,0x40,0x7, +0x7e,0xb3,0x37,0x5, 0xb4,0x3, 0x6c,0x12,0x9f,0x30,0x12,0x1f,0xed,0x12,0x38,0xd, +0x7e,0xb3,0x37,0xaa,0x30,0xe7,0xe9,0x12,0x1a,0xaf,0x12,0x1b,0xae,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x17,0x29,0x1b,0xfd,0x12,0x1b, +0xae,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x17,0x29, +0x1b,0xfd,0x7e,0xb3,0x2b,0x3c,0xb4,0x1, 0x18,0x12,0x2e,0xde,0x12,0x54,0xb7,0x12, +0x57,0x4, 0x12,0x90,0x60,0x12,0x5e,0x84,0x12,0x87,0xc0,0x12,0x1c,0x44,0x12,0x48, +0xcf,0x12,0x40,0x40,0x12,0x9d,0x34,0x7e,0xb3,0x37,0xaa,0x54,0x7f,0x7a,0xb3,0x37, +0xaa,0x80,0x8d,0x12,0x5f,0xf4,0x2, 0x1c,0x39,0x7e,0xb3,0x37,0x4c,0x70,0x4, 0xe4, +0x12,0x76,0x96,0x22,0x12,0x73,0x21,0x12,0x1e,0x38,0x12,0x1e,0x38,0x12,0x8a,0x8b, +0x12,0x71,0x8b,0x12,0x2a,0x57,0x12,0x1e,0x38,0x12,0x24,0xbb,0x12,0x1e,0x38,0x12, +0x77,0x1a,0x12,0x1e,0x38,0x2, 0x1c,0x68,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c, +0xdd,0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x21,0x7e,0x8, 0x35,0xe5,0x12, +0x17,0x29,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18, +0x26,0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x17,0x29,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0xa1, +0x3c,0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9, +0x9, 0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x1f,0xd4,0x60,0x36, +0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75, +0x36,0x22,0x12,0x1f,0xf4,0x7d,0x13,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, +0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x21,0x12,0x1f,0xf4,0x2d,0x13,0xbd,0xc1, +0x28,0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68, +0x39,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x1e, +0x80,0xbe,0x37,0x2a,0x79,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34, +0x74,0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71, +0x74,0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe4, +0xbc,0x7e,0x28,0x2, 0x81,0xa1,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c, +0x99,0x80,0x3c,0x7c,0xb9,0x12,0x1f,0xd4,0x60,0x33,0x12,0xa9,0x23,0xbe,0xb0,0xff, +0x68,0x2b,0x9, 0x73,0x1f,0x35,0x12,0x2e,0xc8,0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54, +0x0, 0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, +0x12,0xa9,0x23,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc, +0xf9,0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19, +0x75,0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19, +0xa3,0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0xbe,0xe0,0xa, 0x40,0x8e,0x90,0x60,0x9a,0xe4, +0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e,0x8, 0x1f,0x34, +0x12,0x17,0x29,0x1b,0xfd,0x7c,0xfd,0x7e,0x8, 0x36,0x21,0x7e,0x34,0x0, 0x14,0x74, +0xff,0x12,0x17,0x4e,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e, +0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x17,0x29,0x1b,0xfd,0xa, 0x3f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x21,0x12,0x17,0x29,0x1b,0xfd,0x6c, +0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0x49,0xb, 0xe0,0xbc,0xfe,0x38,0xf5,0x7a,0xf3, +0x35,0xe4,0x7a,0xf3,0x28,0x84,0x7e,0x73,0x28,0x84,0xbe,0x70,0xa, 0x28,0x6, 0x74, +0xa, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x31, +0x7c,0xbe,0x12,0x1f,0xd4,0x60,0x28,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac,0x7e,0x2e, +0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa,0x6d,0x0, +0x12,0x17,0x29,0x1b,0xfd,0x7c,0xbf,0x7e,0x70,0x1, 0x12,0x2f,0x4c,0xb, 0xf0,0xb, +0xe0,0x12,0x77,0xc0,0x38,0xca,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7e,0x71,0x24, +0x12,0x2e,0xc8,0xb, 0x1a,0x30,0x22,0xca,0x3b,0x6d,0xee,0x7e,0xc3,0x2a,0x8d,0x7e, +0xd3,0x2a,0x8c,0x7e,0xb3,0x37,0x2e,0xb4,0x1, 0x3, 0xe4,0xe1,0xb8,0x7e,0xb3,0x28, +0x84,0x70,0x2, 0xe1,0x24,0x7e,0xb3,0x2a,0x21,0x60,0x2, 0x80,0x77,0x7e,0xa3,0x26, +0xfa,0x7e,0x73,0x26,0xfb,0x7a,0x71,0x24,0x6c,0xee,0x6d,0xff,0x6c,0xff,0xa, 0x47, +0x80,0x1c,0x12,0x1f,0xc8,0x8, 0x1d,0xb, 0xe0,0xbe,0xa0,0x0, 0x28,0x6, 0x7c,0xba, +0x14,0x12,0x1f,0xbe,0x12,0xa9,0x37,0x58,0x3, 0x12,0x1f,0xbb,0x1b,0x44,0xbe,0x44, +0x0, 0x0, 0x58,0xde,0xe5,0x24,0xa, 0x4b,0x80,0x1a,0x12,0x1f,0xc8,0x8, 0x21,0xb, +0xe0,0xbe,0xa0,0x0, 0x28,0x6, 0x7c,0xba,0x14,0x12,0x1f,0xbe,0x12,0xa9,0x37,0x58, +0x3, 0x12,0x1f,0xbb,0x7d,0x24,0xb, 0x24,0x7d,0x42,0xa, 0x3c,0xbd,0x23,0x48,0xda, +0xbe,0xe0,0x3, 0x50,0x2, 0x80,0xd, 0xa, 0x2f,0x7d,0x3f,0x12,0x15,0x29,0xbe,0x34, +0x0, 0x28,0x8, 0x7, 0xe4,0x7a,0xb3,0x35,0x3b,0xe1,0xb8,0x6d,0xdd,0xbe,0xa0,0x0, +0x28,0x8, 0x7c,0xba,0x14,0x12,0x1e,0x7d,0x2d,0xd3,0xa, 0x3d,0x1b,0x34,0xa, 0xca, +0xbd,0xc3,0x58,0xb, 0x7c,0xba,0x4, 0x7e,0x71,0x24,0x12,0x1e,0x80,0x2d,0xd3,0x7e, +0x70,0x8, 0x80,0x2a,0x7e,0x50,0x2, 0xac,0x57,0x7d,0xc2,0x2e,0xc4,0x17,0x60,0x7d, +0x1c,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0x1a,0xcb,0xbd,0xcd,0x8, 0xf, 0x7d, +0xc2,0x2e,0xc4,0x17,0x61,0x7d,0x2c,0x12,0x2f,0x8f,0x1a,0xcb,0x2d,0xec,0x7c,0x67, +0x1b,0x70,0xa5,0xbe,0x0, 0xce,0x7c,0xba,0x12,0x1e,0x7d,0x12,0x17,0x80,0xbe,0x34, +0xa, 0xf0,0x8, 0x4, 0x2e,0xe4,0x0, 0x28,0xbe,0xe4,0x0, 0xfa,0x28,0x4, 0x7e,0xe4, +0x0, 0xfa,0x7e,0xb3,0x35,0x3b,0xa, 0x3b,0xbd,0x3e,0x50,0x8, 0x7d,0x3e,0x7c,0xb7, +0x7a,0xb3,0x35,0x3b,0x7e,0xb3,0x35,0x3b,0xda,0x3b,0x22,0x7c,0xba,0x4, 0x7c,0x79, +0x12,0x1e,0x80,0x2d,0xf3,0xb, 0xf0,0x22,0x7c,0xba,0x7c,0x79,0x12,0x1e,0x80,0xbe, +0x34,0x0, 0x96,0x22,0x7c,0x7b,0x12,0x56,0xc9,0x9, 0xa2,0x27,0x72,0x7c,0xb7,0x54, +0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x7b,0xcc,0x5c,0xba,0x22,0x7e,0x34,0x3, +0xe8,0x2, 0x1a,0x0, 0xa, 0x37,0x9d,0x32,0x2, 0x17,0x80,0x12,0x4a,0x17,0x12,0x59, +0xe8,0x12,0x20,0x1d,0x12,0x19,0x45,0x7e,0xb3,0x37,0x5, 0x24,0xfd,0x68,0x9, 0xb, +0xb1,0x78,0xf4,0x12,0x25,0xf8,0x80,0xef,0x12,0x1b,0xbd,0x80,0xea,0x12,0x58,0xfa, +0x12,0x50,0x80,0x12,0x0, 0x42,0x12,0x57,0x8a,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, +0xf8,0x7e,0xf, 0x6, 0xf8,0x7e,0x1f,0x6, 0xf4,0x12,0x62,0xbc,0x7e,0x18,0x8, 0xa, +0x7a,0x1f,0x13,0x86,0x7e,0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a, +0x7e,0x1f,0x13,0x86,0x12,0x5a,0xd5,0x12,0x0, 0x46,0x12,0x25,0xb3,0x12,0x5a,0x54, +0x12,0x25,0x4b,0x2, 0x20,0x66,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a, +0xb3,0x34,0x3a,0x22,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x28,0x95,0x7e,0x34,0x2, 0x26, +0x7a,0x37,0x28,0x99,0x7e,0x34,0x0, 0x96,0x7a,0x37,0x28,0x97,0x7a,0x37,0x28,0x9b, +0x7e,0x34,0x0, 0x50,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x0, 0x27,0x7a,0x37,0x28,0x9f, +0x12,0xa8,0xb4,0x74,0x1, 0x7a,0xb3,0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x20, +0xbb,0x3e,0x34,0x7e,0x8, 0x25,0xf7,0xe4,0x2, 0x17,0x4e,0x90,0x60,0x9a,0x93,0xa, +0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3,0x2a,0x8e,0xf5,0x40,0x7e, +0xb3,0x2a,0x8f,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a,0xb3,0x38,0x4e,0x7a,0xb3, +0x38,0x4c,0x7a,0xb3,0x38,0x4d,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xbb,0xe4,0x12,0x17, +0x4e,0x12,0x20,0xbb,0x3e,0x34,0x7e,0x8, 0x38,0x4f,0xe4,0x12,0x17,0x4e,0xbe,0xd0, +0x2, 0x50,0x2, 0x81,0x20,0x6c,0xcc,0x81,0xf, 0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3, +0x26,0xfa,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c, +0x9, 0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34, +0x7c,0xbd,0x14,0xbc,0xbc,0x78,0x2, 0x81,0x15,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0x81, +0x6, 0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, +0xb3,0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x24,0x23,0x7c,0xb7,0xf5,0x28, +0xe5,0x27,0xa, 0x2b,0xe5,0x25,0x12,0x24,0x23,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe, +0xb0,0x5, 0x40,0x2, 0x81,0x4, 0xe5,0x29,0xbe,0xb0,0x5, 0x40,0x2, 0x81,0x4, 0x85, +0x25,0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33, +0xe5,0x24,0x12,0x99,0xc5,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e, +0x71,0x25,0x12,0x1e,0x80,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x1e,0x80, +0x7a,0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83, +0x80,0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38, +0x2b,0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e, +0x71,0x25,0x12,0x1e,0x80,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x1e,0x80,0x2d, +0x34,0xbd,0x38,0x18,0x2, 0x61,0x9b,0x75,0x30,0x1, 0x61,0x9b,0xe5,0x28,0xbe,0xb0, +0x1, 0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0x61,0x9b,0xe5,0x28,0xbe,0xb0, +0x5, 0x40,0x2, 0x61,0x9b,0xe5,0x29,0xbe,0xb0,0x5, 0x40,0x2, 0x61,0x9b,0x7c,0xbf, +0x20,0xe0,0x2, 0x61,0x9b,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26, +0xbe,0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe, +0xb1,0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1, +0x25,0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25, +0x50,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78, +0x29,0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2, +0x5, 0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24, +0xe5,0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78, +0x29,0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2, +0x5, 0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24, +0xe5,0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85, +0x2b,0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x1e,0x80,0x7a,0x35,0x3e,0xe5, +0x2a,0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe, +0xb1,0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93, +0x5, 0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0, +0x5, 0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c, +0x50,0xad,0xe5,0x2c,0x12,0x24,0x33,0xe5,0x2a,0x12,0x24,0x2a,0xe5,0x2a,0x12,0x24, +0x33,0xe5,0x2c,0x12,0x24,0x2a,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20, +0x5, 0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x42,0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a, +0x2, 0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x15,0x5b,0xe5,0x42,0xa, +0x1b,0x6d,0x0, 0x12,0x15,0x5b,0x7f,0x21,0x12,0x91,0x79,0x7e,0x14,0x0, 0x28,0x12, +0x15,0x6c,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23,0x3e,0x24, +0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe,0xb0,0x0, +0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x38,0x4b,0x7e,0x39,0xb0,0x4, 0x7a,0x39, +0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, 0x2c,0x9, +0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f,0x34,0xf5, +0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, 0x33,0x1f, +0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, 0xc, 0x9, +0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, 0x2f,0xbe, +0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x21,0x41,0xb, 0xc0,0xbc, +0xdc,0x28,0x2, 0x21,0x9, 0x7e,0x8, 0x1f,0x34,0x12,0x98,0xf2,0x7a,0xb3,0x38,0x4e, +0xda,0x3b,0x22,0xa, 0x3b,0x9d,0x32,0x2, 0x17,0x80,0x7e,0x71,0x2d,0x12,0x1e,0x80, +0x9d,0x93,0x22,0x7e,0x71,0x2b,0x12,0x1e,0x80,0x9d,0x93,0x22,0x7e,0x30,0x64,0x7e, +0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80,0x42,0x7e,0x70, +0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x25,0x43,0x9, 0xb3,0x26,0xfa,0x12,0x24, +0x23,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12,0x25,0x43,0x9, +0xb3,0x26,0xfb,0x12,0x24,0x23,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, 0xbc,0x39,0x28, +0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c,0x28,0xb, 0x0, +0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28,0x84,0xbc,0xb1, +0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c,0x22,0xbc,0x23, +0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xca,0x79,0xc2,0x3, 0x7e, +0xf0,0x3, 0x7e,0xe3,0x2a,0x21,0x12,0xa8,0xf8,0x28,0x72,0x7c,0xbf,0x12,0x20,0xc2, +0x4c,0xee,0x68,0xe, 0x7e,0x63,0x38,0x4c,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x38,0x4d, +0x70,0x4, 0xd2,0x3, 0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x5f,0xbe,0xb0,0x8, +0x28,0x4, 0xd2,0x3, 0x80,0x1e,0xd2,0x3, 0x12,0x77,0xc0,0x78,0xa, 0xa5,0xbe,0x0, +0x6, 0x6c,0xff,0xc2,0x3, 0x80,0xd, 0x9e,0x73,0x38,0x4c,0xbc,0x7e,0x78,0x5, 0x7e, +0xf0,0x2, 0xc2,0x3, 0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x20,0xc2,0x7e,0xa3,0x38,0x4e, +0x7a,0xa3,0x28,0x84,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x38,0x4f,0x7e,0x8, 0x26, +0xfa,0x12,0x17,0x29,0x1b,0xfd,0x12,0x24,0x3c,0xf5,0x5f,0x80,0x3, 0x75,0x5f,0x64, +0xda,0x79,0x22,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x8, 0x28,0xae,0x7e, +0x34,0x1, 0xe, 0x74,0xff,0x12,0x17,0x4e,0x12,0x8a,0x68,0x7e,0x8, 0x29,0xbc,0x12, +0x25,0x6e,0x7e,0x8, 0x2a,0x20,0x7e,0x34,0x0, 0xb, 0xe4,0x2, 0x17,0x4e,0x6c,0xaa, +0x74,0x3, 0x12,0x7f,0x86,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0xa, 0x12,0x25,0xa9, +0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79,0x41,0x0, 0x28,0xe4,0xa, +0x4a,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0x46,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, +0x50,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xc8,0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, +0xac,0x7a,0x22,0x74,0xa, 0x7a,0xb3,0x2a,0x6c,0x74,0x10,0x7a,0xb3,0x2a,0x6d,0x12, +0x57,0x79,0x7a,0x37,0x2a,0x74,0x74,0x1e,0x7a,0xb3,0x2a,0x78,0x12,0x57,0xa5,0x7e, +0x34,0x0, 0x96,0x7a,0x37,0x2a,0x7f,0xe4,0x7a,0xb3,0x2a,0x83,0x74,0x4, 0x7a,0xb3, +0x2a,0x84,0x7e,0x34,0x0, 0x64,0x7a,0x37,0x2a,0x85,0x7e,0x34,0xa, 0x0, 0x7a,0x37, +0x2a,0x81,0xe4,0x7a,0xb3,0x16,0x92,0x22,0x12,0x1a,0x84,0x12,0x65,0x8a,0x7e,0xb3, +0x37,0x5, 0xb4,0x1, 0x64,0x12,0x9f,0x30,0x12,0xa9,0x6c,0x12,0x7b,0x77,0x12,0x26, +0x9b,0x12,0x1a,0xaf,0x50,0xe5,0x12,0x2e,0xde,0x12,0x54,0xb7,0x7e,0xb3,0x37,0x2, +0xb4,0x1, 0x4, 0xe4,0x12,0x26,0x7b,0x12,0x57,0x4, 0x12,0x90,0x60,0x12,0x26,0x83, +0x40,0xc9,0x12,0x5e,0x84,0x12,0x26,0x83,0x40,0xc1,0x12,0x87,0xc0,0x12,0x1c,0x44, +0x12,0x0, 0x66,0x12,0x5f,0xfd,0x12,0x83,0xa7,0x12,0x6e,0x97,0x12,0x85,0xbc,0x12, +0x6a,0xa2,0x12,0x87,0xba,0x12,0x6d,0xde,0x12,0xa3,0x56,0x12,0x67,0xc3,0x12,0x49, +0xb0,0x12,0x7b,0x57,0x12,0x49,0x59,0x80,0x92,0x12,0x5f,0xf4,0x2, 0x26,0x6f,0x7e, +0xb3,0x37,0x2, 0xb4,0x1, 0x4, 0xe4,0x2, 0x26,0x7b,0x22,0x70,0x3, 0xd2,0x86,0x22, +0xc2,0x86,0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91,0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70, +0x7, 0x12,0xa8,0xf8,0x28,0x2, 0xd2,0x3, 0xa2,0x3, 0x22,0x7e,0x34,0x36,0xde,0x30, +0xd, 0x47,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x26,0xea,0x7a,0x27,0x2a,0x6e,0x9, +0x53,0x0, 0x3, 0x12,0x26,0xea,0x7a,0x27,0x2a,0x70,0x9, 0x53,0x0, 0x4, 0x12,0x26, +0xea,0x7a,0x27,0x2a,0x72,0x7e,0x39,0x50,0x12,0x26,0xf5,0x7a,0x27,0x2a,0x79,0x9, +0x53,0x0, 0x1, 0x12,0x26,0xf5,0x7a,0x27,0x2a,0x7b,0x9, 0x73,0x0, 0x5, 0xa, 0x37, +0x12,0xa9,0x1c,0x3e,0x34,0x7a,0x37,0x2a,0x81,0x22,0xa, 0x25,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x22,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x25,0xe4, +0x7a,0xb3,0x2a,0x27,0x7a,0xb3,0x2a,0x28,0x2, 0x8a,0x74,0xa5,0xbe,0x0, 0x1b,0x6c, +0xaa,0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, 0xa0,0xbe, +0xa0,0xa, 0x78,0xf0,0x74,0x1, 0x7a,0xb3,0x2a,0x24,0x6c,0xaa,0x80,0x26,0x7e,0x30, +0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x26,0xec,0x1b,0x18,0x20, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x26,0xec,0x1b, +0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0xca,0x3b,0x75,0x28,0x0, 0x7e,0xb3, +0x2a,0x8e,0xf5,0x2a,0x7e,0xb3,0x2a,0x8f,0xf5,0x2b,0x75,0x25,0x0, 0x7e,0xb3,0x16, +0x91,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x29,0xba,0x6c,0xdd,0x2, 0x29,0xa9,0x7e,0x70, +0x2, 0xac,0x7d,0x9, 0xb3,0x26,0xfa,0xf5,0x29,0x9, 0xc3,0x26,0xfb,0x75,0x26,0x2, +0x75,0x27,0x2, 0x7c,0xbd,0x12,0x2d,0x8d,0xd2,0x3, 0x12,0x2f,0xa, 0x7e,0xb3,0x36, +0xe9,0xb4,0x1, 0x1e,0x7e,0xb3,0x2a,0x21,0xb4,0x1, 0x17,0x7e,0xb3,0x28,0x84,0xb4, +0x1, 0x10,0x7e,0x37,0x28,0x86,0xbe,0x34,0x0, 0xa, 0x40,0x6, 0x75,0x26,0x3, 0x75, +0x27,0x3, 0xe5,0x29,0x60,0x5, 0x12,0xa8,0xeb,0x48,0x3, 0x75,0x26,0x1, 0x4c,0xcc, +0x68,0xc, 0xe5,0x2b,0xa, 0x2b,0x1b,0x24,0xa, 0x3c,0xbd,0x32,0x48,0x3, 0x75,0x27, +0x1, 0x75,0x25,0x0, 0x75,0x24,0x0, 0x80,0x55,0xe5,0x24,0xbc,0xbd,0x68,0x4d,0x12, +0x8c,0x91,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x2c,0x9, 0xb3,0x26,0xfb,0xf5,0x2d,0xa, +0x2a,0xe5,0x29,0x12,0x24,0x23,0xbe,0x34,0x0, 0x4, 0x18,0x30,0xe5,0x2d,0xa, 0x2b, +0xa, 0x3c,0x9d,0x32,0x12,0x17,0x80,0xbe,0x34,0x0, 0x4, 0x18,0x1f,0x12,0x29,0xbd, +0x40,0xa, 0xe5,0x2c,0x7e,0x71,0x2d,0x12,0x29,0xf6,0x50,0x5, 0x75,0x25,0x0, 0x80, +0x3, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x75,0x27,0x1, 0x80,0x7, 0x5, 0x24,0x12,0x8e, +0xc2,0x38,0xa6,0x12,0x29,0xbd,0x50,0xb, 0x12,0x2a,0x24,0x75,0x26,0x0, 0x75,0x27, +0x0, 0x80,0xb, 0x12,0x8a,0x65,0x50,0x6, 0x75,0x26,0x3, 0x75,0x27,0x3, 0xe5,0x25, +0x70,0x2, 0x21,0x62,0x6c,0xff,0x6c,0xee,0x12,0x29,0xd9,0x18,0x15,0xe5,0x2a,0xa, +0x5b,0xbd,0x35,0x48,0xd, 0x12,0x29,0xce,0x18,0x8, 0xe5,0x2b,0xa, 0x5b,0xbd,0x35, +0x58,0x3, 0x12,0x29,0xff,0xb, 0xe0,0xbe,0xe0,0x3, 0x78,0xdc,0xb, 0xf0,0xbe,0xf0, +0x3, 0x78,0xd3,0x7e,0xa1,0x2b,0x1b,0xa0,0xbc,0xac,0x68,0x6, 0x4c,0xcc,0x68,0x2, +0x21,0x62,0xe5,0x29,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x62,0x12,0xa8,0xeb,0x48,0x2, +0x21,0x62,0x7e,0x18,0x0, 0x64,0x7a,0x1d,0x41,0x4c,0xcc,0x78,0x5, 0x75,0x40,0x2, +0x80,0x7, 0xbc,0xac,0x78,0x3, 0x75,0x40,0x0, 0x6c,0xff,0x7e,0xa1,0x40,0x3e,0xa0, +0x7e,0x90,0x6, 0xac,0x9f,0x7c,0xb9,0x2c,0xba,0x24,0x2e,0x12,0x29,0xc4,0x7e,0x14, +0x0, 0x64,0x12,0x15,0x6c,0x7c,0xb9,0x24,0x30,0xa, 0x1b,0xb, 0x18,0x10,0x1a,0x2, +0x1a,0x0, 0x12,0x15,0xc8,0x7e,0xd, 0x41,0xbf,0x10,0x58,0x3, 0x7a,0x1d,0x41,0xb, +0xf0,0xbe,0xf0,0x3, 0x78,0xc5,0x7e,0x1d,0x41,0xbe,0x18,0x0, 0x0, 0x58,0x7, 0x7e, +0x18,0x0, 0x1, 0x7a,0x1d,0x41,0x6c,0xff,0x74,0x6, 0xac,0xbf,0x24,0x30,0x12,0x29, +0xc4,0x7e,0xd, 0x41,0x12,0x15,0x5b,0x7e,0x8, 0x0, 0x64,0x12,0x15,0xc8,0x7d,0x43, +0xe5,0x29,0xa, 0x3b,0x1b,0x34,0xa, 0x5f,0x2d,0x53,0xa, 0x2c,0x1b,0x24,0x7e,0xa1, +0x40,0xa, 0x3a,0x2d,0x32,0x12,0x2e,0xc8,0x1b,0x1a,0x40,0xb, 0xf0,0xbe,0xf0,0x3, +0x78,0xc6,0xe5,0x26,0x7e,0x71,0x27,0x7c,0x6d,0x7e,0x51,0x28,0x12,0x2a,0xec,0xe5, +0x25,0x60,0x2f,0x6c,0xff,0x6c,0xee,0x12,0x29,0xd9,0x18,0x15,0xe5,0x2a,0xa, 0x5b, +0xbd,0x35,0x48,0xd, 0x12,0x29,0xce,0x18,0x8, 0xe5,0x2b,0xa, 0x5b,0xbd,0x35,0x58, +0x3, 0x12,0x29,0xff,0xb, 0xe0,0xbe,0xe0,0x3, 0x78,0xdc,0xb, 0xf0,0xbe,0xf0,0x3, +0x78,0xd3,0x12,0x2a,0x24,0x5, 0x28,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x28, +0x3, 0x2, 0x27,0x8e,0xe5,0x28,0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xe5,0x29,0x7c, +0x7c,0x2, 0x29,0xf6,0xa, 0x3b,0xb, 0x38,0x30,0x1a,0x26,0x1a,0x24,0x22,0xa, 0x2e, +0xa, 0x3c,0x2d,0x32,0xbe,0x34,0x0, 0x1, 0x22,0xa, 0x3f,0xe5,0x29,0xa, 0x4b,0x2d, +0x34,0xbe,0x34,0x0, 0x1, 0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35, +0x26,0xfb,0x7c,0xb2,0x7c,0x73,0x7c,0xb7,0xb4,0x17,0x2, 0xd3,0x22,0xc3,0x22,0x1b, +0x44,0xa, 0x5f,0x2d,0x54,0xa, 0x2c,0x1b,0x24,0xa, 0x3e,0x2d,0x32,0x12,0x1e,0x80, +0x7d,0x23,0x7c,0x7e,0x3e,0x70,0x74,0x6, 0xac,0xbf,0x2c,0xb7,0x24,0x2e,0xa, 0x3b, +0x1b,0x38,0x20,0x22,0x6c,0x33,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x2e,0x9f,0x50, +0x1b,0x7c,0xb2,0x12,0x2d,0x82,0x7d,0x3, 0x12,0x2f,0x41,0x49,0x55,0x38,0xe4,0x7d, +0x40,0x3e,0x44,0x7e,0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73, +0x2a,0x94,0xbc,0x72,0x38,0xd4,0x22,0x6c,0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12, +0x1f,0xd4,0x60,0xa, 0x12,0x29,0xe6,0x40,0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10, +0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5,0x7c,0xb0,0x6c,0x77,0x12,0x2a,0xb1,0xbe, +0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70,0x1, 0x12,0x2a,0xb1,0xb4,0x1, 0x21,0x6c, +0x11,0x80,0x15,0x7c,0xb1,0x12,0x1f,0xd4,0x60,0xc, 0x12,0x29,0xe6,0x50,0x7, 0x7c, +0xb1,0x6c,0x77,0x12,0x2f,0x4c,0xb, 0x10,0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3, +0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e,0xb3,0x36,0x5d,0x7a,0xb3,0x36,0x5e,0x7a, +0xa3,0x36,0x5d,0x7e,0xb3,0x36,0x5e,0x60,0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28, +0x84,0x70,0xb, 0x7e,0xb3,0x36,0x5f,0x60,0x5, 0x14,0x7a,0xb3,0x36,0x5f,0x7e,0x73, +0x36,0x5f,0xbe,0x70,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0x3b,0x7c,0xc4, +0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x74,0x9, 0xac,0xb5,0x7d,0x95,0x2e,0x94,0x27,0x76, +0x6d,0x88,0x7e,0xe7,0x2a,0x85,0xe4,0x39,0xb4,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7f, +0x9, 0xb3,0x26,0xfa,0xf5,0x4e,0x9, 0xb3,0x26,0xfb,0xf5,0x4f,0x7e,0x73,0x2a,0x8d, +0x7c,0x6e,0x7e,0x8, 0x0, 0x52,0x12,0x2d,0x2f,0xf5,0x50,0xe5,0x4e,0x7e,0x73,0x2a, +0x8c,0x7c,0x6d,0x7e,0x8, 0x0, 0x51,0x12,0x2d,0x2f,0x7c,0xab,0xe5,0x51,0x7e,0x71, +0x52,0x12,0x2e,0xc8,0x7d,0xf3,0x7a,0xf5,0x5a,0x7e,0xf4,0x15,0x9e,0x7a,0xf5,0x5c, +0x85,0x51,0x54,0x85,0x52,0x55,0x7a,0xa1,0x56,0x85,0x50,0x57,0x7e,0xb3,0x2a,0x78, +0xf5,0x58,0x75,0x59,0x0, 0xbe,0xc0,0x1, 0x78,0x8, 0xe5,0x58,0x1e,0xb0,0x1e,0xb0, +0xf5,0x58,0x7e,0x8, 0x0, 0x54,0x12,0x78,0x71,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15, +0xa0,0x6d,0xaa,0x2f,0x51,0x7e,0x37,0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e, +0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d,0x45,0x7e,0x37,0x15,0xa6,0x6d,0x22,0x7d,0x3, +0x7e,0x37,0x15,0xa8,0x2f,0x10,0x7a,0x1d,0x49,0x7f,0x65,0xa, 0x3d,0xe5,0x4e,0xa, +0xfb,0x9d,0xf3,0x7d,0x3f,0x7c,0xc7,0x81,0x91,0xa, 0x4e,0xe5,0x4f,0xa, 0x5b,0x9d, +0x54,0xf5,0x4d,0x81,0x7b,0xbe,0xc0,0x0, 0x58,0x2, 0x81,0x79,0x7e,0x73,0x2a,0x8c, +0xbc,0x7c,0x18,0x2, 0x81,0x79,0xe5,0x4d,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0x79,0x7e, +0x73,0x2a,0x8d,0xbe,0x71,0x4d,0x18,0x2, 0x81,0x79,0x7c,0xbc,0x7e,0x71,0x4d,0x12, +0x1e,0x80,0x7e,0x53,0x2a,0x78,0xa, 0x25,0x7d,0xf3,0x9d,0xf2,0xbe,0xf4,0x0, 0x0, +0x8, 0x77,0xbd,0xef,0x18,0xd, 0x7f,0x14,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x4e,0xa, 0x2b,0x1a,0x3c,0x12,0x2d,0x16,0x18,0xd, 0xe5,0x4f, +0xa, 0x2b,0xe5,0x4d,0x1a,0x3b,0x12,0x2d,0x16,0x8, 0x4e,0x7c,0xbc,0x7e,0x71,0x4d, +0x7c,0x6f,0x12,0x9f,0x65,0xf5,0x53,0xb4,0x2, 0x6, 0x7d,0x3f,0xe, 0x34,0x9d,0xf3, +0xe5,0x53,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x53,0xb4,0x1, 0x2d,0x12,0x2d,0x7, 0x1a, +0x1c,0x12,0x2d,0xe, 0x7e,0x1d,0x45,0x9f,0x10,0x7a,0x1d,0x45,0x12,0x2d,0x7, 0xe5, +0x4d,0x1a,0x1b,0x12,0x2d,0xe, 0x7e,0x1d,0x49,0x9f,0x10,0x7a,0x1d,0x49,0x12,0x2d, +0x7, 0x9f,0x51,0x1a,0x26,0x1a,0x24,0x9f,0x61,0x5, 0x4d,0xa, 0x2e,0xe5,0x4f,0xa, +0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x4d,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xc5,0xb, +0xc0,0xa, 0x2d,0xe5,0x4e,0xa, 0x3b,0x2d,0x32,0x1a,0x37,0x1a,0xfc,0xbd,0xf3,0x18, +0x2, 0x61,0xb9,0xbe,0x58,0x0, 0x0, 0x78,0x2, 0xb, 0x5c,0xbe,0x68,0x0, 0x0, 0x78, +0x2, 0xb, 0x6c,0x7e,0x1d,0x45,0x7f,0x5, 0x12,0x2d,0x20,0x1b,0x4a,0x30,0x7e,0x1d, +0x49,0x7f,0x6, 0x12,0x2d,0x20,0x79,0x34,0x0, 0x2, 0x7e,0xb3,0x2a,0x84,0x60,0xd, +0x1e,0xd4,0x1e,0xc4,0x50,0x4, 0x4e,0xd4,0x80,0x0, 0x14,0x78,0xf3,0xbe,0x68,0x0, +0x7f,0x28,0x4, 0x7e,0x68,0x0, 0x7f,0x7d,0x3d,0x39,0x74,0x0, 0x5, 0x74,0x9, 0xac, +0xbf,0x9, 0x75,0x27,0x7c,0x39,0x74,0x0, 0x6, 0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, +0x39,0xb4,0x0, 0x6, 0xda,0x3b,0x22,0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x22,0x1a,0x2, +0x12,0x15,0x5b,0x7f,0x1, 0x22,0x9d,0x32,0x12,0x17,0x80,0xbe,0x34,0x0, 0x1, 0x22, +0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x15,0x77,0x2e,0x18,0x0, 0x20,0x22,0xca, +0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34,0x7c, +0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39,0xbd, +0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39,0xa, +0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d,0x53, +0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba,0xda, +0xf8,0x22,0x7e,0x73,0x2a,0x8d,0xac,0x7b,0x2e,0x34,0x0, 0x17,0x22,0xca,0x79,0x7c, +0x5b,0x7e,0x43,0x28,0x84,0xbe,0x40,0x1, 0x28,0x2, 0xc1,0x9c,0x7e,0xa3,0x2a,0x8d, +0x7e,0x70,0x2, 0xac,0x75,0x9, 0xf3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7c,0xbf,0x7c, +0x7e,0x12,0x2e,0xc8,0x7f,0x51,0x7c,0x1e,0x7c,0x3f,0x7e,0x3, 0x2a,0x8f,0x7e,0x23, +0x2a,0x8e,0xa, 0x3a,0x6d,0xdd,0x9d,0xd3,0xa, 0x9a,0xa, 0xc0,0x1b,0xc5,0xa, 0x51, +0xbd,0x5c,0x58,0x2, 0xc1,0x9c,0xa, 0x53,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48,0x55, +0x7c,0xb3,0x14,0x12,0x2e,0x9f,0x50,0x4d,0x7c,0xb3,0x14,0x12,0x2d,0x82,0x7d,0xe3, +0x7d,0x5e,0x12,0x2e,0xbb,0xb, 0x1a,0xf0,0x7d,0x5d,0x3e,0x54,0x7f,0x15,0x2d,0x35, +0xb, 0x1a,0x80,0xbe,0xf4,0x0, 0x0, 0x8, 0x11,0x9d,0x8f,0xbe,0x84,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x58,0x1b,0x1a,0x50,0x7c,0xb0,0x24,0xfe,0xbc,0xb1, +0x78,0x13,0x7d,0x4e,0x1b,0x44,0x7d,0x54,0x12,0x2e,0xbb,0xb, 0x1a,0x50,0xbd,0x58, +0x8, 0x3, 0x1b,0x1a,0x80,0xa, 0x83,0xb, 0x84,0xa, 0x52,0xbd,0x85,0x58,0x5d,0x7c, +0xb3,0x4, 0x12,0x2e,0x9f,0x50,0x55,0x7c,0xb3,0x4, 0x12,0x2d,0x82,0x7d,0xe3,0x7d, +0x1e,0x3e,0x14,0x7e,0x1f,0x13,0x8a,0x7f,0x61,0x2d,0xd1,0xb, 0x6a,0xf0,0x7d,0x19, +0x3e,0x14,0x7f,0x65,0x2d,0xd1,0xb, 0x6a,0x10,0xbe,0xf4,0x0, 0x0, 0x8, 0x11,0x9d, +0x1f,0xbe,0x14,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x51,0x1b,0x6a,0x50, +0x7c,0xb0,0x24,0xfe,0xbc,0xb1,0x78,0x14,0x7d,0x4e,0x1b,0x44,0x7d,0x4, 0x3e,0x4, +0x2d,0x30,0xb, 0x1a,0x0, 0xbd,0x1, 0x8, 0x3, 0x1b,0x1a,0x10,0xda,0x79,0x22,0x7c, +0xab,0x6c,0x77,0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x2f,0x8f,0xbc,0xba,0x78,0x2, +0xd3,0x22,0xb, 0x70,0xbe,0x70,0x3, 0x40,0xea,0xc3,0x22,0x3e,0x54,0x7e,0x1f,0x13, +0x8a,0x2d,0x35,0x22,0x7c,0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x8d,0xac,0x1b,0x3e,0x4, +0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0x6c,0x33, +0x80,0x1f,0x7c,0xb3,0x12,0x2e,0x9f,0x40,0x16,0x7c,0xb3,0x12,0x2d,0x82,0x7d,0x43, +0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x1b,0x1a,0x50,0xb, +0x30,0x7e,0x23,0x2a,0x94,0xbc,0x23,0x38,0xd9,0x22,0x6c,0x33,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x2e,0x9f,0x50,0x1f,0x7c,0xb2,0x12,0x2d,0x82,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x2f,0x41,0x59,0x35,0x38,0xe4,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x94,0xbc,0x72,0x38,0xd0, +0x22,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x7e,0x70,0x1, 0x7c,0x67,0x7c,0x7b, +0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e,0x24,0x0, 0x5e, +0x12,0x2f,0x8f,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e, +0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff,0xa, 0x2a,0x2e,0x24, +0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0x2e,0x24,0x16,0xe3,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34, +0xa0,0x6c,0x33,0x80,0x3d,0x7e,0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10, +0x1, 0x6c,0x0, 0x80,0x27,0xbc,0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93, +0x26,0xfb,0xa, 0x29,0xa, 0x32,0x12,0x2d,0x16,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, +0x40,0x8, 0x74,0x2, 0x7a,0xb3,0x34,0xa0,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5, +0xb, 0x30,0xbc,0xa3,0x38,0xbf,0x2, 0x2f,0xe9,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c, +0x22,0x80,0x45,0x74,0x2, 0xac,0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e, +0xa0,0x1, 0x6c,0x99,0x80,0x2c,0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, +0x83,0x26,0xfa,0x9, 0xf3,0x26,0xfb,0xa, 0x28,0xa, 0x31,0x12,0x2d,0x16,0x18,0xb, +0xa, 0x2f,0xa, 0x30,0x12,0x2d,0x16,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, +0xb, 0x90,0xbc,0x39,0x38,0xd0,0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3a, +0xbe,0xb0,0x0, 0x28,0x12,0x14,0x7a,0xb3,0x35,0x3a,0xbe,0xb0,0x14,0x28,0x8, 0x7e, +0x34,0x0, 0x8c,0x7a,0x37,0x2a,0x79,0x7e,0xb3,0x36,0xe9,0x70,0x58,0x7e,0xb3,0x39, +0x6, 0x70,0x52,0x7e,0xb3,0x36,0x6d,0x70,0x4c,0x7e,0x37,0x38,0xb, 0xbe,0x34,0x0, +0x14,0x50,0x42,0x7e,0x37,0x28,0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28, +0x84,0xbe,0xb0,0x3, 0x40,0x2f,0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe, +0xb0,0x3, 0x50,0x9, 0x7e,0xb3,0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26, +0xf6,0xbe,0xb0,0x8, 0x50,0x9, 0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74, +0x1e,0x7a,0xb3,0x35,0x3a,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe,0xa0,0x34,0x38, +0x2, 0x21,0xc9,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x2f,0x41,0xdf,0xbe,0xa0, +0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0x8, 0x2e,0x37,0x31,0xed,0x7e,0x39,0xb0,0xbe,0xa0,0x37,0x68,0x2, 0x41,0xdf, +0x75,0x1a,0x36,0x41,0xdf,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0,0x39,0x78,0x1b,0x7e, +0xf3,0x37,0xce,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xce,0xbe,0xa0,0x39,0x78,0x3, 0x75, +0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x40,0x41,0xdf,0xbe,0xa0,0x3a,0x68,0x5, 0xbe, +0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xd0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xd0,0xbe, +0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b,0x63,0x41,0xdf,0xbe, +0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x31,0x41,0xdf,0xbe,0xa0,0x5e,0x78,0x26,0x7e, +0xf, 0x33,0xdf,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e, +0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, 0x3, 0x7c,0xa7,0x4c, +0xba,0x44,0x80,0x41,0xdf,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0,0x3d,0x78,0x1b,0x7e, +0xf3,0x37,0xd2,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xd2,0xbe,0xa0,0x3d,0x78,0x3, 0x75, +0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x99,0x41,0xdf,0xbe,0xa0,0x3e,0x68,0x5, 0xbe, +0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xd4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xd4,0xbe, +0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a,0xbc,0x41,0xdf,0xbe, +0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, 0xb3,0x37,0xaa,0x41, +0xdf,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e,0xf3,0x37,0xef,0x7c, +0xbf,0x4, 0x7a,0xb3,0x37,0xef,0xbe,0xa0,0x4f,0x78,0x3, 0x75,0x1a,0x4e,0xa, 0x3f, +0x2e,0x37,0x31,0xeb,0x7e,0x39,0xb0,0x41,0xdf,0xbe,0xa0,0x51,0x68,0x5, 0xbe,0xa0, +0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, 0xff,0x7e,0xb3,0x37, +0xfa,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a,0xb3,0x37,0xfa,0xbe, +0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0xdf,0xbe,0xa0,0x5c,0x68,0x5, +0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc3, +0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x9c,0xb4,0x41,0xdf,0xbe, +0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, 0xb3,0x38,0x6c,0x80, +0x7e,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x75,0xbe,0xa0,0xf4,0x68,0x5, 0xbe, +0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a,0x25,0xa, 0x9, 0xb3, +0x31,0xf3,0xbe,0xa0,0xf5,0x78,0x58,0x75,0x1a,0xf4,0x80,0x53,0xbe,0xa0,0xf0,0x68, +0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5,0xe7,0x80,0x40,0xbe, +0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10,0x3e,0x14,0x7e,0x1f, +0x31,0xef,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, 0xa, 0x56,0x80,0x1f, +0x7d,0x53,0x80,0x1b,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80,0x12,0xbe,0xa0,0xf7, +0x78,0x4, 0x74,0x64,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda, +0xf8,0x22,0x7c,0x7b,0x6c,0xaa,0x12,0x35,0xcf,0x78,0x9, 0x7c,0xb7,0x12,0x64,0xc1, +0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, 0x7c,0xb7,0x12,0x30,0xb8,0x7c,0xab,0x7c,0xba, +0x22,0x30,0x90,0x19,0xc2,0x90,0xe5,0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5, +0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5,0x1a,0x12,0x33,0x2c,0x5, 0x1a,0x30,0x91,0xb, +0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12,0x32,0xe2,0xf5,0x91,0x22,0x7c,0x6b,0x12,0x35, +0xcf,0x78,0x5, 0x7c,0xb6,0x2, 0x65,0xe8,0xb4,0x4, 0x5, 0x7c,0xb6,0x2, 0x33,0x41, +0x22,0xca,0xf8,0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x65,0xbd,0xd2,0x6, +0xa1,0xc3,0xa5,0xbe,0x1, 0x3d,0x7a,0x73,0x37,0xab,0xa5,0xbf,0xad,0x2, 0x80,0x2f, +0xa5,0xbf,0xae,0x4, 0xd2,0x7, 0xa1,0xc3,0xa5,0xbf,0xaa,0x5, 0x12,0xa9,0x49,0x80, +0x1e,0xa5,0xbf,0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xed,0x80,0x10,0xa5, +0xbf,0xac,0x2, 0x80,0x2, 0xa1,0xc3,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xed,0x6d, +0x33,0x81,0x3f,0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x35,0xc6, +0xa5,0xbe,0x7, 0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xc3,0xa5,0xbe,0x8, 0x2, 0x80, +0x2, 0xa1,0xc3,0x12,0x0, 0x6e,0xa1,0xc3,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a, +0x73,0x37,0xb4,0xa1,0xc3,0xa5,0xbe,0xb, 0x8, 0x12,0x35,0xc6,0x12,0x7, 0xfb,0xa1, +0xc3,0xbe,0x60,0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x5b,0xbe,0x60,0x1e, +0x40,0xd, 0xbe,0x60,0x23,0x38,0x8, 0x12,0x35,0xc8,0x43,0xc, 0x40,0xa1,0xc3,0xbe, +0x60,0x15,0x40,0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x35,0xc8,0xd2,0x6, 0xa5,0xbe, +0x15,0x2, 0x80,0x2, 0xa1,0xc3,0x74,0x7, 0x7a,0xb3,0x37,0xae,0xa1,0xc3,0xa5,0xbe, +0x19,0x7, 0xe4,0x7a,0xb3,0x37,0xc3,0xa1,0xc3,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60, +0x2c,0x38,0x2, 0xa1,0x5b,0xa5,0xbe,0x2d,0x1b,0x12,0x35,0xc8,0x20,0x7, 0x2, 0xa1, +0xc3,0x7e,0x63,0x37,0xd6,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a, +0x35,0x8, 0xa1,0xc3,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, +0x8, 0xa1,0x5b,0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1, +0x5b,0x7e,0x70,0x64,0xa1,0x5b,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43, +0xc, 0x1, 0x7e,0xf3,0x37,0xcf,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xcf,0xa, 0x2f,0x19, +0x72,0x2b,0x40,0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xc3,0x75,0x1a,0x38,0xa1,0xc3, +0xbe,0x60,0x3a,0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xd1, +0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xd1,0xa, 0x2f,0x19,0x72,0x2b,0x63,0xa5,0xbe,0x3b, +0x2, 0x80,0x2, 0xa1,0xc3,0x75,0x1a,0x3a,0xa1,0xc3,0xa5,0xbe,0xfb,0x9, 0x43,0xc, +0x4, 0x7a,0x73,0x2b,0x31,0xa1,0xc3,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xfa,0xa1, +0xc3,0xbe,0x60,0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37, +0xd3,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xd3,0xa, 0x2f,0x19,0x72,0x2a,0x99,0xa5,0xbe, +0x3d,0x2, 0x80,0x2, 0xa1,0xc3,0x75,0x1a,0x3c,0xa1,0xc3,0xbe,0x60,0x3e,0x68,0x4, +0xa5,0xbe,0x3f,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xd5,0x7c,0xbf,0x4, 0x7a,0xb3, +0x37,0xd5,0xa, 0x2f,0x19,0x72,0x2a,0xbc,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xc3, +0x75,0x1a,0x3e,0xa1,0xc3,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12, +0x35,0xc8,0x75,0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x35,0xc8,0x75,0xd, +0x2, 0x12,0x35,0xd7,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x35,0xc8,0x12,0x37,0xd3, +0x80,0x71,0xbe,0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x35,0xc8,0x80,0x63, +0xbe,0x60,0x4e,0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xf0, +0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xf0,0xa, 0x2f,0x2e,0x27,0x31,0xeb,0x7a,0x29,0x70, +0xa5,0xbe,0x4f,0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, +0x80,0x31,0xbe,0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10, +0x20,0x7c,0xb7,0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e, +0x4, 0x7e,0x1f,0x31,0xef,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, +0x7a,0x71,0xf, 0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0xaa,0x22,0x7e, +0xb3,0x37,0xaa,0xc4,0x54,0x7, 0x22,0x12,0xa9,0x5b,0xb4,0x1, 0x14,0xca,0x39,0x7e, +0x18,0x37,0xea,0x7e,0x8, 0x25,0xee,0x12,0x17,0x29,0x1b,0xfd,0x12,0x37,0xac,0x80, +0x12,0xca,0x39,0x7e,0x18,0x37,0xea,0x7e,0x8, 0x2b,0x8f,0x12,0x17,0x29,0x1b,0xfd, +0x12,0x37,0xca,0x2, 0x36,0x6, 0x7a,0x1f,0x2b,0x1b,0x7a,0xf, 0x2b,0x17,0x22,0x7a, +0xb3,0x2b,0x1f,0x70,0x14,0x12,0x37,0xca,0x12,0x36,0x6, 0x7e,0x18,0x6, 0x76,0x7a, +0x1f,0x6, 0xf4,0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x37,0xac,0x12, +0x36,0x6, 0x12,0x57,0x8a,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, +0x12,0x0, 0x1e,0xe4,0x12,0x36,0xf, 0x12,0x36,0x56,0xe4,0x12,0x0, 0x1e,0x74,0x1, +0x12,0x36,0xf, 0x2, 0x36,0x56,0xca,0x3b,0x7e,0xd3,0x2a,0x92,0x7e,0xc3,0x2a,0x93, +0x7e,0x8, 0x1f,0x44,0x12,0x48,0xc6,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12, +0x17,0x4e,0x7e,0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x17,0x4e,0x7e,0x8, +0x1f,0xda,0x7e,0x34,0x0, 0xa, 0x12,0x17,0x4e,0x7e,0xf3,0x2b,0x1b,0x7e,0x18,0x2a, +0xfb,0x7a,0x1d,0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e, +0x8, 0x2a,0xd8,0x12,0x9f,0xe9,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xfb, +0xa, 0x3a,0x2e,0x34,0x16,0xe3,0x12,0x7b,0xcc,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13, +0xa, 0x3e,0x12,0x37,0xa4,0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2b,0x1a,0x19, +0xb4,0x1f,0x8a,0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, +0xa3,0x2a,0xd8,0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x37, +0xa4,0xa, 0x4a,0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2b,0x1a,0x19,0xb4,0x1f,0xa6,0xb, +0xe0,0xbc,0xde,0x38,0xd8,0x7e,0xb3,0x2b,0x1c,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e, +0x18,0x1f,0xd0,0x12,0x6a,0x48,0x80,0x3, 0x12,0xa1,0x3d,0x6c,0xee,0x7e,0x18,0x1f, +0xe4,0x7a,0x1f,0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f, +0x38,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, +0xac,0x7e,0x2e,0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac, +0x7e,0x2e,0x34,0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c, +0x7e,0x12,0x8, 0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x74,0x1, +0x7a,0xb3,0x37,0x5, 0x12,0x98,0xe2,0x12,0x13,0xf5,0x12,0xa0,0xb1,0xe4,0x12,0xa, +0x66,0x7e,0x24,0x3, 0xd4,0x12,0x40,0x30,0x74,0x1, 0x12,0x36,0xf, 0x12,0x64,0x26, +0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x36,0x3e,0x7e,0x34,0x0, 0x1, 0xe4,0x6c, +0x55,0x2, 0x13,0x1, 0x2e,0x37,0x2b,0x1d,0x7e,0x39,0xb0,0x22,0x7e,0x1f,0x25,0xf2, +0x7e,0xf, 0x25,0xee,0x22,0x7a,0xb3,0x2b,0x1f,0x70,0x5, 0x12,0x37,0xca,0x80,0x6, +0xb4,0x1, 0x6, 0x12,0x37,0xac,0x12,0x36,0x6, 0x22,0x7e,0x1f,0x2b,0x93,0x7e,0xf, +0x2b,0x8f,0x22,0x12,0xa9,0x5b,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e, +0x8, 0x37,0xea,0x12,0x17,0x29,0x1b,0xfd,0x12,0xa9,0x40,0x12,0x37,0xac,0x80,0x1a, +0xca,0x39,0x7e,0x18,0x2b,0x8f,0x7e,0x8, 0x37,0xea,0x12,0x17,0x29,0x1b,0xfd,0x7e, +0x37,0x2b,0x95,0x7a,0x37,0x31,0xeb,0x12,0x37,0xca,0x2, 0x36,0x6, 0x30,0x6, 0x3b, +0xc2,0x6, 0x12,0x1a,0xb, 0x7e,0x73,0x37,0xaf,0x7a,0x73,0x2a,0x6c,0x7e,0x73,0x37, +0xb0,0x7a,0x73,0x2b,0x3c,0x7e,0x73,0x37,0xb0,0x7a,0x73,0x2b,0x20,0x7e,0xb3,0x37, +0xb1,0x60,0x18,0x7e,0x34,0x0, 0x2, 0x12,0x39,0x74,0x7e,0x34,0x0, 0x1, 0x12,0x39, +0x74,0x6d,0x33,0x12,0x39,0x74,0xe4,0x7a,0xb3,0x37,0xb1,0x12,0x47,0xf9,0x2, 0x38, +0x51,0xe5,0xc, 0x70,0x2, 0x21,0x73,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12, +0x52,0x23,0x12,0x5a,0x8c,0x7e,0x8, 0x2a,0x8c,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1, +0x6, 0x53,0xc, 0xfd,0x12,0xa1,0x4e,0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e, +0xb3,0x2b,0x31,0x60,0x9, 0x7e,0x8, 0x2a,0x8c,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3, +0x2b,0x84,0x7e,0x73,0x2b,0x83,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x31,0x2e,0x70,0xff, +0x92,0x4, 0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x96,0x12,0xb, 0x1e,0xe5,0xc, +0x30,0xe3,0x4a,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xdc,0x7a,0x73,0x2b,0x2e,0x12,0x7c, +0x2f,0x7a,0xb3,0x0, 0x61,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, +0x61,0x7a,0x73,0x37,0xb4,0x12,0x4d,0xb8,0x12,0x47,0xd2,0x7e,0x73,0x37,0xdd,0xbe, +0x73,0x2b,0x81,0x68,0x6, 0x7a,0x73,0x2b,0x81,0xd2,0xc, 0x30,0xc, 0x9, 0xc2,0xc, +0x12,0x98,0xe2,0xe4,0x12,0xa, 0x66,0x12,0x19,0x65,0x12,0x97,0xf3,0xe5,0xc, 0x30, +0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43,0x37,0xde,0x7e,0x50,0xa, 0xac,0x45,0x12,0x40, +0x30,0xe5,0xc, 0x30,0xe6,0x4e,0x53,0xc, 0xbf,0x7e,0x73,0x37,0xca,0xbe,0x70,0x7, +0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37,0xca,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x3b,0xac, +0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63,0x37,0xca,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12, +0x26,0xec,0x7c,0x65,0x4c,0x76,0x74,0xe, 0x12,0x3b,0x5a,0x12,0x3b,0xac,0x12,0x3b, +0xa5,0x7e,0x73,0x37,0xcd,0x7a,0x73,0x2b,0x33,0x7e,0x73,0x37,0xcc,0x7a,0x73,0x2b, +0x3e,0x12,0xa9,0x52,0xe5,0xc, 0x30,0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xb4, +0x2, 0x40,0x7e,0x22,0xca,0xd8,0xca,0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c, +0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c,0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4, +0x7d,0x3c,0x7c,0xe7,0x12,0x1f,0xed,0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12, +0x3b,0xac,0x7c,0x8b,0x74,0x7, 0x7e,0x70,0xf, 0x12,0x3b,0xa2,0x7e,0x54,0x0, 0x78, +0x7e,0x1f,0x33,0xe3,0x79,0x51,0x0, 0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x33,0xe3, +0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, 0xc, 0x7e,0x1f,0x33,0xe3,0x79,0x51,0x0, 0x10, +0xbe,0xd4,0x0, 0x2, 0x78,0x7, 0x12,0x3b,0x3f,0x44,0x1, 0x80,0x1c,0x12,0x3b,0x3f, +0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x33,0xe3,0x78,0x7, 0x12,0x3b,0x43, +0x54,0xfb,0x80,0x5, 0x12,0x3b,0x43,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x33,0xdf, +0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e,0xa0, +0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0xf, 0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff,0xe, +0x12,0x3b,0x4e,0x54,0xe6,0x12,0x3b,0x4b,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12,0x3b, +0x4e,0x5e,0x54,0xfe,0xe6,0x12,0x3b,0x4b,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4,0x0, +0x2, 0x78,0x21,0x12,0x3b,0x3f,0x12,0x3c,0xbd,0x12,0x3b,0x3f,0x44,0x50,0x1b,0x1a, +0x50,0x7e,0x34,0x0, 0x2, 0x12,0x3c,0x29,0x12,0x3c,0x2, 0x12,0x3b,0xdf,0x7a,0x37, +0x31,0xf3,0x41,0xfb,0x6c,0xdd,0x41,0xf5,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b, +0xbc,0xfd,0x40,0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xd7,0xbe,0x90,0x23,0x40,0x3, 0x7e, +0x90,0x22,0xb, 0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xfa, +0xbe,0x90,0x1c,0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x12,0x3b,0x3f,0x12,0x3c, +0xbd,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x12,0x3b,0x3f,0x4d,0x5c, +0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, 0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34, +0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, 0x3b,0x12,0x3c,0x29,0x12,0x3c,0x2, 0xbe,0xd4, +0x0, 0x1, 0x78,0x10,0x12,0x3c,0x2, 0x12,0x3b,0xdf,0x74,0x2, 0xac,0xbd,0x59,0x35, +0x31,0xf5,0x80,0xf, 0x12,0x3b,0xdf,0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59, +0x32,0x31,0xf5,0xb, 0xd0,0xbc,0xed,0x28,0x2, 0x41,0x68,0xa9,0xd5,0xcb,0x74,0x7, +0x7c,0x78,0x12,0x3b,0xa2,0xa9,0xc0,0xc4,0x7e,0x1f,0x33,0xdf,0x79,0xe1,0x0, 0x84, +0x7e,0x1f,0x33,0xdf,0x79,0xf1,0x0, 0x90,0x6d,0x33,0x7e,0xf, 0x33,0xe3,0x79,0x30, +0x0, 0x6, 0x7e,0xf, 0x33,0xe3,0x79,0x30,0x0, 0x8, 0x7e,0xf, 0x33,0xe3,0x79,0x30, +0x0, 0x10,0x7e,0xf, 0x33,0xe3,0x79,0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x7e, +0x1f,0x33,0xe3,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22,0x1b,0x1a,0x50,0x7e,0x1f, +0x33,0xdf,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5,0xfd,0x7a,0x71,0xfe,0x22, +0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12,0x3b,0x5a,0x74,0xf, 0x12,0x3b,0xac, +0x7c,0x7b,0x74,0xf, 0x5e,0x70,0xfe,0x12,0x3b,0x5a,0x74,0xc, 0x12,0x3b,0xac,0x54, +0x7f,0x68,0x8, 0x74,0xc, 0x7e,0x70,0xf8,0x12,0x3b,0x5a,0x7e,0x70,0x72,0x74,0xe, +0x12,0x3b,0x5a,0x74,0x7, 0x12,0x3b,0xac,0x7c,0x7b,0x5e,0x70,0xfb,0x74,0x7, 0x2, +0x3b,0xa2,0x12,0x3b,0x5a,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0xf5,0xfd,0xe5,0xfe, +0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x12,0x12,0x4b,0x63,0xe5,0x34, +0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74,0x3, 0x7e,0x71,0x27,0x12,0x3b,0x5a,0x74,0xb, +0x7e,0x71,0x2f,0x12,0x3b,0x5a,0x74,0xc, 0x7e,0x71,0x30,0x12,0x3b,0xa2,0x22,0x7e, +0xf, 0x33,0xe3,0x69,0x30,0x0, 0xa, 0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d, +0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x33,0xe3,0x79,0x30,0x0, 0x4, 0x7e,0xf, +0x33,0xe3,0x69,0x30,0x0, 0x12,0x5e,0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, +0x79,0x30,0x0, 0x12,0x22,0x7e,0x34,0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, +0x80,0x5, 0x74,0xfa,0x12,0x3c,0xc5,0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d, +0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6,0x22,0x12,0x3f,0xe8,0xc2,0x3, 0x12,0x4f,0xe2, +0xc2,0x5, 0x12,0x3d,0x1, 0xc2,0x3, 0x12,0x3f,0xfc,0xa9,0xd5,0xcb,0x74,0xf, 0x12, +0x3b,0xac,0x7a,0x1b,0xb0,0x74,0xf, 0x6c,0x77,0x12,0x3b,0x5a,0xe5,0xfc,0x7a,0xb, +0xb0,0x43,0xfc,0x10,0x2, 0x3b,0xa5,0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24, +0xde,0x68,0x26,0x24,0xde,0x78,0x2f,0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x3, 0xff,0xb4, +0x5, 0x2a,0x12,0x3c,0x25,0x12,0x9d,0xff,0x2, 0x9f,0x19,0x7e,0xb3,0x3, 0xff,0xb4, +0x5, 0x1a,0x12,0x3c,0x25,0x75,0xe9,0xff,0x22,0x7e,0xb3,0x3, 0xff,0xb4,0x5, 0xc, +0x12,0x3c,0x25,0x2, 0x9f,0x13,0x74,0x1, 0x7a,0xb3,0x3, 0xff,0x22,0x5e,0x54,0x0, +0xf, 0x1b,0x1a,0x50,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x3b,0x5a,0x7a,0x61,0xfc,0x12,0x3b,0xa5, +0x12,0x4c,0xa6,0xd2,0x3, 0x12,0x3f,0xfc,0x12,0x3d,0x1b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x3d,0x1b, +0x2, 0x13,0x96,0x12,0x3f,0xe8,0xc2,0x5, 0x2, 0x3d,0x1, 0xd2,0x5, 0x12,0x3d,0x1, +0x74,0x1, 0x22,0x12,0x3e,0xb4,0x12,0x7b,0x45,0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0x57,0x93,0x12,0x3c,0x48,0x74,0x1, 0x12,0x3e,0xec,0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x3c,0xe0,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x3d,0xa, 0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x3e,0xb4,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x3e, +0xec,0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x3d,0xa, 0xca, +0x3b,0x7e,0xb3,0x37,0x3, 0xb4,0x1, 0x2, 0x80,0x2, 0xc1,0xb1,0x6c,0xcc,0x6c,0xdd, +0x7e,0xb3,0x37,0x2e,0xb4,0x1, 0x8, 0x7e,0xe0,0x10,0x7e,0xf0,0x32,0x80,0x6, 0x7e, +0xe0,0x6, 0x7e,0xf0,0x14,0x12,0x3f,0xf7,0x7d,0xf3,0x12,0x5f,0xe9,0x50,0xfb,0x74, +0x1, 0x7a,0xb3,0x38,0x8e,0x12,0x36,0xf, 0x12,0x13,0xc7,0x12,0x0, 0x1e,0x74,0xa, +0x12,0x3c,0xc5,0x12,0x47,0xe1,0x7e,0xe7,0x2b,0x2c,0x7a,0xe5,0x25,0x7e,0xb3,0x2b, +0x19,0xf5,0x24,0x74,0x4, 0x7a,0xb3,0x2b,0x19,0x7e,0xe7,0x2b,0x2c,0x5e,0xe4,0x0, +0x3f,0x7a,0xe7,0x2b,0x2c,0x7e,0xb3,0x2b,0x19,0x12,0x64,0x2d,0x7c,0x7b,0x74,0x6, +0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x15,0x29,0x7d,0x23,0x7d,0x3f,0x12,0x4f,0xeb, +0xad,0x32,0x7a,0x37,0x2b,0x26,0x12,0x45,0x76,0xc1,0x92,0x12,0x1f,0xed,0x30,0xd, +0x2, 0xc1,0x98,0x7c,0xbe,0x12,0x7b,0xbc,0x12,0x46,0xbd,0x80,0xf, 0x80,0x7, 0x12, +0x3e,0xb4,0xe4,0x12,0x3e,0xec,0x20,0x93,0xf6,0x12,0x3d,0x4f,0x30,0x18,0xf7,0x30, +0x17,0xf4,0xd2,0x4, 0x12,0x3d,0xa, 0xe4,0x12,0x13,0xde,0xb, 0xc0,0x12,0x78,0xd9, +0x12,0x7f,0xbb,0x7e,0xa3,0x38,0x8d,0x4c,0xaa,0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38, +0x8e,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x2e,0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x8d, +0x12,0xa9,0x0, 0x78,0x18,0x7e,0xb3,0x38,0x8d,0x60,0x12,0xe4,0x7a,0xb3,0x38,0x8d, +0x7a,0xb3,0x2a,0x20,0x7a,0xb3,0x2a,0x21,0x7e,0xd0,0x1, 0x80,0x1b,0x12,0xa9,0x0, +0x68,0x10,0x7e,0xb3,0x38,0x8d,0x70,0xa, 0x7e,0xd0,0x1, 0xe4,0x7a,0xb3,0x37,0x3, +0x80,0x6, 0xbc,0xfc,0x28,0x2, 0xc1,0xb, 0xe4,0x7a,0xb3,0x2b,0x23,0x7e,0x35,0x25, +0x7a,0x37,0x2b,0x2c,0xe5,0x24,0x7a,0xb3,0x2b,0x19,0x4c,0xdd,0x68,0x3, 0x12,0x1a, +0x6a,0xda,0x3b,0x22,0x74,0x81,0x7a,0xb3,0x38,0xfd,0x22,0x80,0x1d,0x12,0x3e,0xb4, +0x12,0x7b,0x3d,0x68,0x5, 0xc2,0x4, 0x12,0x3d,0xa, 0x7e,0xb3,0x34,0x3a,0xbe,0xb0, +0x2, 0x68,0x18,0x20,0x17,0x15,0xe4,0x12,0x3e,0xec,0x20,0x93,0xe0,0x12,0x3e,0xb4, +0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x74,0x2, 0x2, 0x3e,0xec,0x22,0x7c,0xab,0x7e,0xb3, +0x38,0xfd,0xb4,0x81,0x38,0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0, +0x1, 0x78,0xf, 0xc2,0xaf,0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf, +0x80,0x15,0xbe,0xa0,0x2, 0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9, +0xd7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3, +0x38,0xfd,0x22,0x7e,0xb3,0x37,0x3, 0x14,0x68,0x5a,0x14,0x78,0x2, 0xe1,0xd0,0x14, +0x68,0x6a,0x24,0x3, 0x68,0x2, 0xe1,0xc8,0x12,0x3f,0xef,0x38,0x8, 0x30,0x10,0xf, +0x12,0x77,0xf5,0x68,0xa, 0x12,0xa9,0xb, 0xe4,0x7a,0xb3,0x38,0x8d,0x80,0x71,0x7e, +0xb3,0x36,0xe4,0x30,0xe0,0x6a,0x7e,0x73,0x36,0xe5,0xa, 0x27,0x7e,0x34,0x4, 0x0, +0xad,0x32,0x7e,0xb3,0x37,0x2e,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x7b,0x12,0xa6,0x9c, +0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x8b,0x50,0x46,0x12,0x3f,0xd6,0xe4,0x7a,0xb3, +0x38,0x8f,0x80,0x3c,0x12,0x3f,0xef,0x28,0x32,0xe4,0x7a,0xb3,0x37,0x3, 0x7e,0xb3, +0x38,0x8d,0xb4,0x1, 0x3, 0x12,0x3f,0xdc,0xd2,0x17,0x80,0x1f,0x74,0xff,0x7a,0xb3, +0x36,0xdd,0x12,0xa9,0x6c,0x12,0x3d,0x23,0x12,0x19,0x6f,0xe4,0x7a,0xb3,0x37,0x3, +0x7a,0xb3,0x39,0x2, 0xd2,0x17,0x80,0x8, 0x12,0x3f,0xdc,0xe4,0x7a,0xb3,0x39,0x2, +0x12,0x7a,0xfb,0x2, 0x3d,0x7f,0x6d,0x33,0x7a,0x37,0x38,0x8b,0x74,0x1, 0x7a,0xb3, +0x37,0x3, 0x22,0xd2,0x4, 0x2, 0x3d,0xa, 0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0x73,0x2a,0x20,0xbe,0x70,0x0, 0x22,0x7e,0x34,0x0, 0x46,0x22,0xa2,0x3, 0xa9,0x97, +0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x12,0xa9,0x49,0x12,0xa9,0x40,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x40,0x5d,0x12,0x40,0x37,0x74,0x50,0x7a,0xb3,0x37,0xde,0x7e,0x24, +0x3, 0x20,0x12,0x40,0x30,0xe4,0x12,0xa8,0xc7,0x6d,0x33,0x7a,0x37,0x38,0xff,0x22, +0x7d,0x32,0x74,0xfa,0x2, 0x12,0xd0,0x7e,0x73,0x2b,0x81,0x7a,0x73,0x37,0xdd,0x22, +0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37,0xd8,0x7e,0x73,0x37,0xdc,0xbe,0x73,0x2b,0x2e, +0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12,0x40,0x5d,0x12,0x40,0x37,0x22,0x7e,0x73,0x2b, +0x2e,0x7a,0x73,0x37,0xdc,0x7e,0x73,0x2b,0x3e,0x7a,0x73,0x37,0xcc,0x7e,0x73,0x2b, +0x3f,0x7a,0x73,0x37,0xcb,0x7e,0x73,0x2b,0x33,0x7a,0x73,0x37,0xcd,0x22,0xca,0xd8, +0xca,0x79,0x7c,0xdb,0x7e,0xa0,0x4, 0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c, +0xff,0x80,0xb, 0x12,0x40,0xe6,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf, +0x38,0xf1,0x80,0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12, +0x40,0xe6,0x40,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad, +0x38,0x2, 0x6c,0xdd,0x7c,0xbd,0x12,0x4e,0xb, 0x12,0x40,0x75,0x12,0x44,0xf4,0x12, +0x41,0x2, 0x7e,0x73,0x2b,0x2e,0x7a,0x73,0x37,0xdc,0x12,0x40,0x37,0x7a,0xd3,0x37, +0xb4,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26,0x33,0xbc, +0xbe,0x22,0x30,0x3, 0x3, 0x12,0x40,0x75,0xa2,0x4, 0x92,0x5, 0x12,0x41,0xc0,0x2, +0x41,0x2, 0x7e,0x73,0x2b,0x3f,0x7a,0x73,0x37,0xcb,0x22,0x74,0x40,0x7a,0xb3,0x2b, +0x3f,0x12,0x5d,0xed,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x40,0xf2,0x80,0x1c,0x74, +0x1, 0x12,0x41,0x44,0x7e,0x43,0x37,0xc9,0x7e,0x50,0x64,0xac,0x45,0x12,0x77,0xfd, +0x7a,0xb3,0x2b,0x3e,0x7e,0xf, 0x33,0xf8,0x12,0x44,0x5d,0x12,0x41,0x2, 0x12,0x44, +0xf4,0x2, 0x40,0x75,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x33,0x12,0x47,0xd2, +0x7e,0xc0,0xa, 0x12,0x45,0x4, 0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x1f, +0x33,0xf8,0x12,0x78,0x79,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, 0x12,0x41,0xb4, +0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12,0x41,0xb4,0xb, +0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x41,0xb4,0xb, 0x34,0x1b,0xa, +0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x33,0xf8,0x12,0x78, +0x1c,0x7d,0x73,0x7e,0x1f,0x33,0xe7,0x69,0x31,0x0, 0x1a,0x7a,0x73,0x2b,0x33,0x7d, +0x37,0xda,0x3b,0x22,0x7e,0xf, 0x33,0xe7,0x2e,0x14,0x0, 0x1a,0xb, 0xa, 0x30,0x22, +0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x34,0x7e,0xb3,0x37,0xbf,0xf5,0x29,0x7e, +0xb3,0x2a,0x8c,0xf5,0x2a,0x7e,0xb3,0x2a,0x8d,0xf5,0x2b,0x7e,0xb3,0x2a,0x8f,0xf5, +0x2c,0x7e,0xb3,0x2a,0x8e,0xf5,0x2d,0x7e,0x34,0x2e,0xe0,0x7a,0x35,0x2e,0x7e,0x18, +0x40,0x0, 0x7a,0x1d,0x30,0x12,0x44,0xfd,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, +0x7e,0x8, 0x34,0x0, 0x12,0x47,0xd9,0x6c,0xff,0x80,0x34,0x9f,0x77,0x6c,0xee,0x80, +0x19,0x7e,0x11,0x2b,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x3f,0x2d,0x10,0x7e, +0x1d,0x30,0x2d,0x31,0xb, 0x1a,0x30,0x12,0x44,0x34,0xe5,0x2d,0xbc,0xbe,0x38,0xe1, +0xe5,0x2d,0x12,0x44,0x3b,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34,0x0, 0xb, 0xf0,0xe5, +0x2c,0xbc,0xbf,0x38,0xc6,0x7e,0x34,0x10,0x0, 0x7e,0xa1,0x2b,0x74,0x2, 0xa4,0x59, +0x35,0x33,0xfe,0x6c,0xff,0x80,0x72,0x9f,0x77,0x6c,0xee,0x80,0x12,0x12,0x44,0xcd, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x12,0x44,0x34,0xe5, +0x29,0xbc,0xbe,0x38,0xe8,0xe5,0x29,0x12,0x44,0x3b,0x74,0x4, 0xac,0xbf,0x59,0x35, +0x3, 0x72,0xe5,0x29,0xbe,0xb1,0x2c,0x50,0x32,0x9f,0x77,0x7e,0xe1,0x29,0x80,0x12, +0x12,0x44,0xcd,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x12, +0x44,0x34,0xe5,0x2c,0xbc,0xbe,0x38,0xe8,0xe5,0x29,0xa, 0x3b,0x6d,0x22,0xe5,0x2c, +0xa, 0x1b,0x6d,0x0, 0x9f,0x1, 0x12,0x44,0x3f,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74, +0x4, 0xac,0xbf,0x59,0x35,0x3, 0x74,0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0x88,0xe5, +0x2c,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x15,0x77,0x6c,0xff,0x80,0x2e, +0x74,0x2, 0xac,0xbf,0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, +0x9d,0x15,0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14, +0x78,0xf4,0x7d,0x21,0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2c, +0xbc,0xbf,0x38,0xcc,0xe5,0x2a,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x15, +0x77,0x6c,0xff,0x80,0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x72,0xa, 0x1f,0xad, +0x13,0x7e,0xf4,0x10,0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50, +0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25, +0x3, 0x72,0xe5,0x29,0xbe,0xb1,0x2c,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, +0x74,0x2e,0x14,0x10,0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x74,0xb, +0xf0,0xe5,0x2a,0xbc,0xbf,0x38,0x9e,0x7e,0x73,0x37,0xc1,0xa, 0x37,0x6d,0x22,0x74, +0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x15,0x75,0x7d, +0xe3,0x7a,0xe5,0x34,0x7e,0x73,0x37,0xc2,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11, +0x14,0x78,0xfb,0x7d,0x1f,0x12,0x15,0x75,0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, +0xac,0xbf,0x49,0x45,0x34,0x0, 0xbe,0x45,0x34,0x28,0x9, 0x7e,0x35,0x34,0x59,0x35, +0x34,0x0, 0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2c, +0xbc,0xbf,0x38,0xda,0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x72, +0xbe,0x45,0x34,0x28,0x9, 0x7e,0x35,0x34,0x59,0x35,0x3, 0x72,0x80,0x8, 0xbd,0x46, +0x50,0x4, 0x59,0x65,0x3, 0x72,0x49,0x45,0x3, 0x74,0xbe,0x45,0x34,0x28,0x9, 0x7e, +0x35,0x34,0x59,0x35,0x3, 0x74,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x74, +0xb, 0xf0,0xe5,0x2a,0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x30,0x12,0x44, +0x5d,0xda,0x3b,0x22,0x6d,0x22,0x2f,0x71,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7f, +0x17,0x12,0x15,0x77,0x7f,0x71,0x7e,0x25,0x2e,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d, +0x22,0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x15,0x75,0x12,0x44,0x67, +0xb, 0x34,0x7a,0x73,0x2b,0x3f,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x6c,0xaa,0xa, +0x4a,0x2e,0x44,0x60,0xac,0x12,0xa0,0xa8,0x7c,0x9b,0x7e,0xf3,0x2a,0x8d,0xac,0xf9, +0x7e,0xb3,0x2a,0x8f,0xa, 0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde, +0xb, 0x6a,0xd0,0x6d,0xcc,0x2f,0x6, 0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xd1,0xbe,0x8, +0x0, 0x0, 0x78,0x2, 0xb, 0xc, 0x7e,0x54,0x0, 0x3, 0x7f,0x10,0x7d,0x15,0x12,0x15, +0x75,0x7f,0x1, 0xb, 0xc, 0x7e,0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x15,0x77, +0xbe,0x34,0x0, 0xfa,0x28,0x4, 0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0x11,0x2b, +0xac,0x1f,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x30,0x2d,0x31, +0xb, 0x1a,0x20,0x7a,0x27,0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad, +0x23,0x74,0xc, 0x22,0x7e,0x73,0x2b,0x3e,0x7a,0x73,0x37,0xcc,0x22,0x7e,0x8, 0x2a, +0x8c,0x12,0xd, 0x72,0xe4,0x12,0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x2, 0x0, 0x4e,0xb4,0x3, 0x5, 0x12,0x45,0x23,0x80,0x2, 0xe4,0x22,0x12,0x45,0x8, +0x74,0x1, 0x22,0x12,0x5f,0xa0,0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x8c,0x2, 0xd, +0x72,0x12,0x67,0x2b,0x38,0x2, 0xe4,0x22,0x12,0x47,0xf1,0x49,0x55,0x34,0x3b,0xbe, +0xb0,0x2, 0x38,0x3, 0x2, 0x45,0x4a,0x2, 0x45,0x13,0x7e,0xd7,0x2b,0x2c,0xbe,0xb0, +0x1, 0x28,0x2, 0xe4,0x22,0x12,0x66,0xbc,0x12,0x45,0x76,0x7a,0xd7,0x2b,0x2c,0x7e, +0x73,0x2b,0x19,0xa, 0x37,0x3e,0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, +0x12,0x46,0xbd,0x74,0x1, 0x22,0x7e,0x8, 0x2a,0x8c,0x2, 0x5, 0xb4,0xca,0x3b,0x7e, +0xe3,0x2a,0x93,0x7e,0xf3,0x2b,0x19,0x74,0x1, 0x7a,0xb3,0x2b,0x19,0x12,0x45,0x76, +0x12,0x47,0xe1,0x12,0x1b,0xae,0x7e,0x17,0x2b,0x1d,0x6d,0x0, 0x12,0x17,0x4e,0x7e, +0xd0,0x7, 0x12,0x1f,0xed,0x6c,0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x67,0x12,0x47,0x95,0x4c,0x76,0x7a,0x29,0x70, +0xb, 0xc0,0x12,0x47,0x7c,0xa, 0x3c,0xbd,0x32,0x48,0xde,0x12,0x46,0xac,0x30,0x18, +0xfd,0x12,0x47,0x9f,0x7e,0xb3,0x2a,0x92,0x7c,0x7e,0x12,0x47,0xb1,0x6c,0xcc,0x80, +0x29,0x74,0x2, 0xac,0xbc,0x49,0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e, +0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff, +0x12,0x47,0x95,0x5c,0x7b,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x47,0x7c,0xa, 0x3c,0xbd, +0x32,0x48,0xce,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0x88,0x12,0x46,0xfe,0x74,0x2, 0x12, +0x47,0xe9,0x12,0x46,0x34,0x74,0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2b,0x19,0x12,0x45, +0x76,0xda,0x3b,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x48,0xc6,0x7e, +0xa3,0x2a,0x92,0x7e,0x73,0x2a,0x93,0x6c,0xee,0x80,0x1d,0xa, 0x2e,0x9, 0x62,0x2a, +0xfb,0xa, 0x26,0x12,0x2f,0x8b,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12, +0x47,0x8b,0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xdf,0x6c,0xee,0x80,0x1a, +0xa, 0x2e,0x9, 0x62,0x2a,0xd8,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d, +0x21,0x12,0x47,0x8b,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee, +0x7e,0x30,0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12, +0x11,0xba,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x74,0x2, 0x12,0x0, +0x1e,0x7e,0xb3,0x2b,0x1b,0x12,0x46,0x34,0x74,0x2, 0x12,0x0, 0x1e,0x74,0x5, 0x7e, +0x70,0x9b,0x12,0x13,0x2c,0x12,0x46,0xcf,0x7e,0xb3,0x2b,0x1b,0x2, 0xe, 0x94,0x6c, +0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xfb,0x2e,0x34,0x16,0xe3,0x12,0x7b,0xcc, +0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x33,0xdf,0x2d,0x12,0x79, +0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x93,0xbc,0x6a,0x38,0xd6,0x22,0xca,0xd8, +0xca,0x79,0x7e,0xf0,0xa, 0x74,0x1, 0x7a,0xb3,0x2b,0x19,0x12,0x1b,0xae,0x7c,0xe7, +0x80,0x5d,0x12,0x1f,0xed,0x12,0x46,0xac,0x30,0x18,0xfd,0x12,0x47,0x9f,0x12,0x47, +0xa9,0x6c,0xdd,0x80,0x3d,0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34, +0x14,0x78,0x50,0x14,0xa, 0x1d,0x2e,0x17,0x2b,0x1d,0x7e,0x19,0xb0,0xbe,0xb0,0x0, +0x28,0x1e,0x14,0x7a,0x19,0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d, +0x12,0x37,0xa4,0xbe,0xb0,0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0, +0xb, 0xd0,0x12,0x47,0x7c,0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c, +0xaf,0x1b,0xf0,0x4c,0xaa,0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x93, +0xa, 0x37,0x7e,0x53,0x2a,0x92,0xa, 0x25,0x2d,0x23,0x22,0x2e,0x27,0x2b,0x1d,0x7e, +0x29,0xb0,0xa, 0x26,0x22,0xa, 0x2c,0x2e,0x27,0x2b,0x1d,0x7e,0x29,0x70,0x22,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22,0x7e,0xb3,0x2a,0x92,0x7e,0x73,0x2a, +0x93,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0x7c,0x96,0x7c,0xa7,0x12,0x36,0xf, +0x7c,0xba,0x12,0x13,0xc7,0x74,0xa, 0x12,0x3c,0xc5,0x7c,0xb9,0x12,0x0, 0x1e,0x2, +0x45,0x7d,0x7e,0x8, 0x2a,0x8c,0x2, 0xd, 0x72,0x7e,0x34,0x0, 0x38,0xe4,0x2, 0x17, +0x4e,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x12,0x0, 0x1e,0x7e,0xb3,0x2b,0x1b, +0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, 0x30, +0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x45,0x76,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, 0xfd, +0x7e,0xb3,0x37,0xee,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0x47,0xe9,0x12,0x48, +0x50,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xef,0x7e,0xb3, +0x37,0xee,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x37,0xca,0x80,0x7, 0xe4,0x12, +0x0, 0x1e,0x12,0x37,0xac,0x12,0x36,0x6, 0x7e,0xb3,0x2b,0x1b,0x2, 0x46,0x34,0x22, +0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x48,0xc6,0x7e,0xa3,0x2a,0x92,0x7e, +0x63,0x2a,0x93,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x72,0x2a,0xfb,0xbe,0x70,0x1c, +0x50,0x11,0xa, 0x27,0x12,0x2f,0x8b,0x7c,0x7b,0x7e,0xb3,0x2b,0x1a,0xa, 0x27,0x19, +0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xde,0x6c,0xee,0x80,0x17,0xa, 0x3e,0x9, +0x73,0x2a,0xd8,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2b,0x1a,0xa, 0x27,0x19,0x62, +0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e,0x30,0xe, 0xac,0x3e,0x2e, +0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xf8,0xb, 0xe0,0xbe,0xe0, +0x5, 0x40,0xe7,0xda,0x79,0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, 0x17,0x4e,0xca, +0xd8,0xca,0x79,0x7e,0x73,0x2a,0x8d,0x7e,0xf3,0x2a,0x8c,0xac,0xf7,0x7d,0x37,0x3e, +0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x17,0x4e,0x7e,0xb3,0x37,0xc5,0xb4,0x1, 0x64, +0x7e,0x73,0x37,0xc6,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c,0x12,0x1f,0xed, +0x12,0x1a,0xaf,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49,0x33,0xd, 0xc8, +0x12,0x17,0x80,0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14,0x49,0x21,0x1f, +0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34,0xb, 0x34,0x7a, +0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xc6,0xbc,0x7d,0x38, +0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0xd, 0xc8,0x12, +0x17,0x29,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0x8, 0x38,0x1, 0x12,0x49,0x8d, +0x7e,0x8, 0x38,0x9, 0x12,0x49,0x8d,0x12,0x49,0xa9,0x12,0x49,0xa2,0x2, 0x49,0x70, +0x7e,0x37,0x38,0x1, 0xbe,0x34,0x0, 0x0, 0x28,0x12,0x7e,0x73,0x39,0x2, 0xbe,0x70, +0x5, 0x50,0x9, 0x7e,0xb3,0x37,0x2e,0x70,0x3, 0x12,0x3f,0xd6,0x22,0xb, 0xa, 0x30, +0xe5,0x60,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33,0x1b,0xa, +0x30,0x22,0x7e,0x8, 0x38,0xe2,0x2, 0x49,0x8d,0x7e,0x8, 0x2b,0xd6,0x2, 0x49,0x8d, +0x7e,0x73,0x28,0x93,0x7a,0x73,0x28,0x94,0x7e,0x73,0x2a,0x20,0x7a,0x73,0x2a,0x21, +0xe4,0x7a,0xb3,0x2a,0x24,0x22,0x7e,0x37,0x38,0xc8,0xb, 0x34,0x7a,0x37,0x38,0xc8, +0x7e,0x37,0x38,0xca,0xbe,0x37,0x38,0xc8,0x28,0x3, 0x2, 0x49,0xe1,0x22,0x2, 0x49, +0xc6,0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12, +0x49,0xde,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b, +0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xe4,0x12,0x4c,0x75,0x12,0x9e,0xb5,0x12,0x1f, +0xed,0x12,0x4f,0xdb,0x12,0x3b,0x60,0x12,0x9d,0xf5,0x12,0x9e,0xcc,0x12,0x0, 0xa, +0x12,0x9e,0xd8,0x12,0x4c,0x0, 0x12,0x9e,0xe8,0xd2,0xaf,0x12,0x9e,0x47,0x12,0x4a, +0x65,0x12,0x3b,0xb1,0x12,0x4c,0xa6,0x7e,0x8, 0x38,0xcc,0x12,0x4c,0x4f,0x90,0x60, +0x50,0xe4,0x93,0xca,0xb8,0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff, +0xda,0xb8,0x2, 0x12,0x34,0xd2,0xc8,0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9, +0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0x4b,0xf0,0xe4,0x12,0x4a,0x88,0x2, 0x4a,0x7f,0xa9, +0xc5,0xca,0xe4,0x7a,0xb3,0x39,0xc, 0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12,0x4b, +0x7, 0x4c,0xff,0x78,0x5, 0x5e,0x70,0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12, +0x4a,0xa9,0xda,0xf8,0x22,0x74,0x6, 0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c, +0x73,0x7d,0x52,0x7c,0xab,0x7e,0xb3,0x39,0xc, 0xb4,0xa5,0x3c,0x12,0x4b,0x9b,0x75, +0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0x12,0x4b,0x0, 0xa9,0x36,0xb3,0xfc,0x12,0x4b,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36, +0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0x4a,0xa9, +0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0x22,0x7c,0x6b,0x6c,0x77,0x6c,0xaa,0x7e,0xb3,0x39, +0xc, 0xb4,0xa5,0x46,0x12,0x4b,0x9b,0x75,0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0x12,0x4b, +0x0, 0xa9,0x36,0xb3,0xfc,0x12,0x4b,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a, +0x61,0xb5,0xa9,0x36,0xb3,0xfc,0x12,0x4b,0x0, 0xa9,0x36,0xb3,0xfc,0x12,0x4b,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, 0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c,0x55,0xa, 0x3a, +0x4d,0x32,0x22,0x7d,0x42,0x7f,0x60,0x7d,0x3, 0x12,0x4b,0xf0,0x74,0x2, 0x12,0x4b, +0x7, 0x7d,0xf3,0x4e,0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, 0x12,0x4b,0x94,0x7a,0x45, +0x36,0x7d,0x30,0x6d,0x22,0x7f,0x6, 0x12,0x4b,0xac,0x5e,0xf4,0xff,0xfd,0x12,0x4b, +0x94,0x2, 0x4a,0x7f,0x74,0x2, 0x7d,0x3f,0x2, 0x4a,0xa9,0xa9,0xc2,0xb4,0xa9,0xc6, +0xb3,0x22,0x74,0x6, 0x12,0x4b,0x7, 0x7d,0x3, 0x6c,0x11,0x22,0x12,0x4b,0xba,0x7e, +0x35,0x36,0x12,0x9f,0x49,0xa9,0xd2,0xb4,0xd3,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6, +0x7c,0xa5,0xa, 0x44,0xf5,0x39,0x7f,0x21,0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12, +0x4b,0xe5,0xe5,0x3a,0x12,0x4b,0xe5,0xe5,0x39,0x12,0x4b,0xe5,0xe5,0x38,0x12,0x4b, +0xe5,0xe4,0x2, 0x4b,0xe5,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22, +0xa9,0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1,0xea,0x74,0xa5,0x7a,0xb3,0x39,0xc, 0x22, +0xe4,0x7a,0xb3,0x37,0xaa,0x7e,0x8, 0x33,0x9, 0x12,0x4f,0xf4,0x7e,0x8, 0x33,0x47, +0x7e,0x34,0x0, 0x3e,0x12,0x17,0x4e,0x7e,0x18,0x33,0x9, 0x7a,0x1d,0x14,0x12,0x4c, +0x31,0x2, 0x4c,0x24,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0xaa,0xf5,0x91, +0x22,0x2, 0x4c,0x34,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0xd2, +0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5,0x1, 0x6c,0xaa,0xe5, +0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0x7f,0x86,0xb, 0xa0,0xbe,0xa0,0xd, +0x40,0xed,0xc2,0xc9,0x22,0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, +0x12,0x7b,0x4e,0xa9,0xd0,0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x3d,0x1, 0xa9,0xc2, +0xea,0x75,0xc1,0x6, 0x75,0xc2,0xc, 0xd2,0x3, 0x12,0x3f,0xfc,0xa9,0xc1,0xc4,0xa9, +0xd2,0xc4,0xa9,0xc2,0xe1,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb,0xd2,0x3, +0x12,0x4f,0xe2,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, 0xa9,0xd0, +0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74,0x41,0x12, +0x3c,0xc5,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda,0xf8,0x22, +0x7e,0x23,0x2b,0x2e,0x7e,0x33,0x37,0xdb,0xac,0x23,0x2e,0x14,0x1, 0xf4,0xbe,0x14, +0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, 0xa, 0x7e,0x63,0x2b,0x2f,0xbe,0x14,0xf, 0x3c, +0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe,0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x2, 0x74, +0x1, 0x7a,0xb3,0x2b,0x2f,0x7e,0x73,0x2b,0x2f,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e, +0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c,0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10, +0x7, 0x7e,0x1f,0x33,0xdf,0x69,0x51,0x0, 0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e, +0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e, +0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, 0x15,0xc8,0x7e,0xa3,0x0, 0x61,0xbe,0xa0, +0xff,0x68,0x48,0xbe,0xa3,0x3, 0xfe,0x68,0x42,0x74,0x5, 0xa4,0x12,0x4f,0x7b,0x12, +0x4d,0xac,0x12,0x4f,0x72,0x12,0x4d,0xac,0x12,0x4f,0x69,0x12,0x5d,0xed,0x50,0x9, +0x7e,0xb3,0x0, 0x61,0x12,0x4f,0xfd,0x80,0x6, 0x12,0x4d,0xac,0x12,0x4f,0x60,0x12, +0x4d,0xb8,0x12,0x4f,0x59,0x7e,0x73,0x2b,0x33,0xa, 0x37,0x7e,0xf, 0x33,0xe7,0x79, +0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x61,0x7a,0x73,0x3, 0xfe,0x22,0x7e,0xa3,0x0, 0x61, +0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x2e,0x12,0x4c,0xe0,0x7a,0x37,0x2b,0x3a,0x22, +0x12,0x4d,0xb4,0x30,0xc, 0xc, 0xc2,0xc, 0x12,0x98,0xe2,0x30,0x3, 0x4, 0xe4,0x12, +0xa, 0x66,0x30,0x3, 0x9, 0x12,0x98,0x95,0x12,0x97,0xf3,0x2, 0x4f,0x84,0x22,0x7e, +0xb, 0x70,0x7a,0x73,0x2b,0x2e,0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b,0x81,0x29,0x70, +0x0, 0x1, 0x7a,0x73,0x2b,0x33,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b,0x3f,0x12,0x4d, +0xb8,0x12,0x4f,0x59,0xd2,0x3, 0xc2,0x4, 0x2, 0x40,0xf2,0xca,0xf8,0x7c,0xfb,0x74, +0x5, 0xac,0xbf,0x12,0x4f,0x7b,0x12,0x4f,0x72,0x12,0x4f,0x60,0x12,0x4f,0x69,0x7a, +0xf3,0x0, 0x61,0x7c,0xbf,0x12,0x4f,0xfd,0x12,0x4d,0xb8,0x74,0x5, 0xac,0xbf,0x9, +0xb5,0x26,0x37,0x12,0x98,0xc7,0x12,0x19,0x57,0xe4,0x7a,0xb3,0x16,0x91,0x7a,0xb3, +0x36,0xd8,0x7a,0xb3,0x16,0x92,0xda,0xf8,0x22,0x7e,0xb3,0x36,0x62,0x60,0x6, 0x14, +0x7a,0xb3,0x36,0x62,0x22,0x12,0x4f,0x9f,0x7e,0xb3,0x36,0xe9,0x70,0xe, 0x7e,0xb3, +0x39,0xb, 0xb4,0x1, 0x7, 0xe4,0x12,0x4e,0xb, 0x12,0x97,0x13,0x12,0x4f,0x1d,0x12, +0x95,0x6e,0x7e,0xa3,0x36,0xe9,0x7a,0xa3,0x39,0xb, 0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x4e,0xb, 0x22,0xca,0xf8,0x6c,0xff,0x7e,0x73,0x0, 0x61,0xbc,0x7f,0x68,0x2a,0x7e, +0x30,0x5, 0xac,0x3f,0x12,0x4e,0xf9,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0x4f, +0x12,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac, +0x3f,0x12,0x4f,0x7, 0x12,0x17,0x29,0x1b,0xfd,0xb, 0xf0,0xbe,0xf0,0x4, 0x40,0xc7, +0x7e,0x23,0x0, 0x61,0x7e,0x30,0x5, 0xac,0x23,0x12,0x4e,0xf9,0xca,0x39,0x7e,0x23, +0x0, 0x61,0x7e,0x30,0x38,0xac,0x23,0x12,0x4f,0x12,0x12,0x17,0x29,0x1b,0xfd,0x7e, +0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x61,0x7e,0x30,0x8c,0xac,0x23,0x12,0x4f, +0x7, 0x12,0x17,0x29,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, 0x12, +0x4d,0xdf,0x7e,0x34,0x0, 0x38,0x22,0x2e,0x14,0x1, 0x42,0x6d,0x0, 0x7e,0x18,0x3, +0x72,0x22,0x2e,0x14,0x0, 0x62,0x6d,0x0, 0x7e,0x18,0x34,0x0, 0x22,0x12,0x94,0xdf, +0x2, 0x4f,0x23,0x7e,0xb3,0x36,0x65,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x6d,0x7e, +0xb3,0x36,0xdb,0x70,0x3, 0x12,0x97,0x2a,0x7e,0xb3,0x36,0x6d,0xb4,0x1, 0xc, 0x74, +0x3, 0x7a,0xb3,0x34,0xac,0x7e,0x34,0x14,0x0, 0x80,0x9, 0xe4,0x7a,0xb3,0x34,0xac, +0x7e,0x34,0xa, 0x0, 0x7a,0x37,0x2a,0x81,0x22,0x7e,0x8, 0x2a,0x8c,0x2, 0x3, 0x8b, +0x9, 0x75,0x26,0x35,0x7a,0x73,0x2b,0x3e,0x22,0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b, +0x3f,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b,0x33,0x22,0x9, 0x75,0x26,0x33,0x7a, +0x73,0x2b,0x2e,0x22,0x12,0x4f,0x9f,0x6d,0x33,0x7a,0x37,0x36,0xd9,0x6c,0xaa,0x12, +0xa8,0xd0,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xf6,0xe4,0x7a,0xb3,0x36,0x6e,0x22,0x7e, +0x37,0x33,0xf1,0x12,0x4f,0xeb,0x7a,0x37,0x36,0xd9,0x6c,0xaa,0x80,0x24,0xbe,0xa0, +0x4, 0x50,0x27,0xa, 0x3a,0x9, 0x63,0x36,0x72,0xbe,0x60,0x4, 0x50,0x12,0x7e,0x50, +0x2, 0xac,0x5a,0x49,0x42,0x33,0xeb,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x7c, +0xb, 0xa0,0x7e,0xb3,0x36,0x6f,0xbc,0xba,0x38,0xd4,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0xa9,0xd0,0xce,0xa2,0x3, 0xa9,0x95,0xc9,0x22,0x1e,0x34,0x1e,0x34,0x1e, +0x34,0x1e,0x34,0x22,0x7e,0x34,0x0, 0x3e,0x74,0xff,0x2, 0x17,0x4e,0xca,0xf8,0x7c, +0xfb,0x7e,0x34,0x0, 0x38,0xca,0x39,0xac,0x7f,0x2e,0x34,0x0, 0x62,0x6d,0x22,0x7e, +0x8, 0x34,0x0, 0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f, +0x2e,0x34,0x1, 0x42,0x6d,0x22,0x7e,0x8, 0x3, 0x72,0x12,0x17,0x29,0x1b,0xfd,0xda, +0xf8,0x22,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e,0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff, +0x7e,0x8, 0x2b,0x8f,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x2a,0x2d,0x7a,0x37,0x2b, +0x95,0xe4,0x7a,0xb3,0x2b,0x93,0x7a,0xb3,0x2b,0x94,0x7e,0x34,0x0, 0x4, 0xca,0x39, +0x12,0x57,0x9c,0x7e,0x8, 0x25,0xee,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x2b,0x97, +0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2,0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22, +0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93,0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93, +0x7c,0xeb,0x7e,0x73,0x2a,0x93,0xbc,0x7e,0x28,0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe, +0x7a,0xd3,0x2a,0x8c,0x7a,0xe3,0x2a,0x8d,0x7a,0xd3,0x2a,0x90,0x7a,0xe3,0x2a,0x91, +0x7a,0xd3,0x2a,0x92,0x7a,0xe3,0x2a,0x93,0x74,0x1, 0x7a,0xb3,0x2a,0x96,0x7a,0xd3, +0x2a,0x8e,0xa, 0x3e,0x1b,0x34,0x7a,0x73,0x2a,0x8f,0x90,0x60,0x91,0xe4,0x93,0x7a, +0xb3,0x2a,0x97,0x90,0x60,0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x98,0xa, 0x3d,0xca,0x39, +0x7e,0x34,0x60,0x52,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x99,0x12,0x17,0x29,0x1b, +0xfd,0xa, 0x3f,0xca,0x39,0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a, +0xbc,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x40,0x12,0x17,0x29,0x1b,0xfd,0x12,0x52,0x23, +0x12,0x5a,0x8c,0x7a,0xd3,0x2a,0x94,0x7a,0xe3,0x2a,0x95,0x12,0x50,0x32,0x74,0x1, +0x12,0x36,0xf, 0xe4,0x7a,0xb3,0x2b,0x20,0x7a,0xb3,0x2b,0x21,0x12,0x52,0xb9,0x7a, +0x37,0x2b,0x2c,0x74,0x3, 0x7a,0xb3,0x2b,0x22,0xe4,0x7a,0xb3,0x2b,0x23,0x74,0x2, +0x7a,0xb3,0x2b,0x24,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2b,0x26,0x74,0x4, 0x7a,0xb3, +0x2b,0x25,0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x28,0x7e,0x34,0x20,0x5f,0x7a,0x37, +0x2b,0x2a,0x74,0x20,0x7a,0xb3,0x2b,0x81,0x74,0x1, 0x7a,0xb3,0x2b,0x2f,0x74,0x20, +0x7a,0xb3,0x2b,0x30,0x74,0x4, 0x7a,0xb3,0x2b,0x32,0x74,0x38,0x12,0x4d,0xb4,0xe4, +0x7a,0xb3,0x2b,0x3c,0x7a,0xb3,0x2b,0x3d,0x7e,0x34,0x1, 0xf4,0x7a,0x37,0x2b,0x38, +0x74,0x1, 0x7a,0xb3,0x2b,0x31,0x74,0x60,0x7a,0xb3,0x2b,0x3f,0x74,0x66,0x7a,0xb3, +0x2b,0x3e,0x6d,0x33,0x7a,0x37,0x2b,0x34,0x7a,0x37,0x2b,0x36,0x74,0x2, 0x7a,0xb3, +0x2b,0x33,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x89,0x74,0x4, 0x7a,0xb3,0x2b,0x86, +0x7e,0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x87,0xe4,0x7a,0xb3,0x2b,0x85,0x7e,0x34,0x4, +0x6d,0x7a,0x37,0x2b,0x8b,0x74,0x1, 0x7a,0xb3,0x2b,0x82,0x74,0x5, 0x7a,0xb3,0x2b, +0x83,0xe4,0x7a,0xb3,0x2b,0x84,0x74,0x1, 0x7a,0xb3,0x2b,0x7f,0xe4,0x7a,0xb3,0x2b, +0x80,0x7e,0x34,0x16,0xcb,0x7a,0x37,0x2b,0x8d,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60, +0xfb,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x63,0x12,0x17,0x29,0x1b,0xfd,0xda,0x79, +0xda,0xd8,0x22,0x12,0x57,0x93,0x12,0x52,0x85,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2a,0x99,0x6d,0x0, 0x9, 0xb3,0x2a,0x98,0x12,0x52,0x6c,0xa, +0x3b,0x7d,0x13,0x2e,0x14,0x2b,0x40,0x6d,0x0, 0x9, 0xb3,0x2b,0x3f,0x12,0x52,0x6c, +0xa, 0x1b,0x2e,0x14,0x2a,0x9b,0x12,0x52,0x79,0xe5,0x25,0x12,0x52,0x70,0xa, 0x1b, +0x2e,0x14,0x2b,0x42,0x12,0x52,0x79,0xe5,0x24,0x2, 0x17,0x4e,0x7e,0x34,0x0, 0x2, +0x12,0x17,0x4e,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93, +0xa, 0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a, +0x99,0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x52,0xb1,0x38,0xef,0x12,0x52,0xb1,0x68, +0x7, 0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0, +0x22,0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, +0x2a,0x9, 0xb2,0x2a,0xfb,0x54,0x1, 0x78,0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70, +0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x93,0xbc,0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, +0x2a,0x9, 0xb2,0x2a,0xd8,0xbe,0xb0,0xd, 0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe, +0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80,0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x53, +0x4, 0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x92,0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f, +0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d,0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99, +0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a,0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, +0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26,0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26, +0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x54,0x80,0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d, +0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d,0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9, +0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x72,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7, +0x8, 0x2, 0x5, 0x24,0x12,0x54,0x6d,0xb, 0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3, +0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80,0x19,0x12,0x54,0x76,0xb, 0x3a,0xc0,0x6e, +0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58,0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3, +0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x93,0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe, +0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3,0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x54, +0x65,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12,0x54,0x80,0xb, 0x6a,0xd0,0xbd,0xd8,0x58, +0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d,0x2d,0x7e,0x67,0x2a,0x70,0x7e,0x74,0x0, +0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, 0x90,0x12,0x54,0x6d,0xb, 0x3a,0xc0,0xbd, +0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, 0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x54, +0x76,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c,0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8, +0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12,0x53,0x4, 0x38,0xab,0x7a,0x87,0x7, 0xfc, +0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, 0x12,0x54,0x65,0x2d,0x15,0x6c,0xaa,0x80, +0x14,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0xb, 0x7a,0x90,0xbd,0x9b,0x58, +0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x53,0x4, 0x38,0xe7,0x7a,0xb7,0x8, 0x4, 0xbd,0x8a, +0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32,0x7a,0x37, +0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x93,0x74,0x2, 0xa4,0x22,0x7e,0x74,0x62, +0x27,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d,0x6e,0x22, +0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31,0x7a,0xd, +0x24,0x7e,0x35,0x28,0x7a,0x35,0x2f,0x7e,0xd, 0x24,0x7f,0x13,0x12,0x79,0xff,0x7e, +0x35,0x28,0x7a,0x35,0x2a,0x12,0x54,0x65,0x7e,0xd, 0x24,0x2d,0x15,0x7f,0x13,0x2d, +0x35,0x12,0x5c,0xca,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x6e,0x1e,0x34,0x7a,0x35,0x28, +0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x54,0x8a,0x7e,0x37,0x28,0x99,0xe, +0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x54,0x8a,0x12, +0x54,0xf9,0x12,0x8f,0xfd,0x2, 0x54,0xe8,0xe4,0x7a,0xb3,0x39,0x9, 0x7e,0xb3,0x28, +0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x39,0x9, 0x22,0xca,0x3b,0x7e,0xf3,0x2a,0x8d,0x7e, +0xe3,0x2a,0x8e,0x7e,0xd3,0x2a,0x8f,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e, +0x34,0x7e,0xf, 0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0x90,0x69,0xb, 0xc0,0xbc,0xec, +0x38,0xe9,0xda,0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0x57,0xbe,0x7e,0xb3,0x16, +0x91,0xb4,0x1, 0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc, +0x7a,0x1f,0x6, 0xf8,0x12,0x57,0x8a,0x12,0x55,0x6d,0x12,0x53,0xb, 0x7e,0xb3,0x16, +0x90,0xb4,0x1, 0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85, +0x7a,0x73,0x26,0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26, +0x86,0x7e,0x34,0x0, 0x3, 0xe4,0x12,0x17,0x4e,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, +0x3, 0x12,0x17,0x4e,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85, +0x7a,0xb3,0x26,0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f, +0x12,0x56,0xdb,0x6c,0x55,0x12,0x56,0x33,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b, +0x12,0x56,0xeb,0x6c,0x55,0x12,0x56,0x33,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14, +0x12,0x56,0xbc,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x56,0xc5,0x2e,0x24,0x26, +0x86,0x12,0x56,0xd0,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14, +0x12,0x56,0xbc,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x56,0xc5,0x2e,0x24,0x26, +0x89,0x12,0x56,0xd0,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84, +0xa4,0x7a,0xb3,0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0x56,0xdb,0x7e,0x50,0x1, 0x12, +0x56,0x33,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0x56,0xeb,0x7e,0x50,0x1, +0x12,0x56,0x33,0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3, +0x26,0xf0,0x22,0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80, +0x70,0x7e,0xd0,0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68, +0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d, +0x44,0x69,0xf0,0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, +0x1b,0xb5,0xb, 0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6, +0x0, 0x2, 0x4c,0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff, +0xb, 0xf4,0xbd,0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d, +0xdb,0x7a,0x6b,0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, +0xf0,0xbc,0x4f,0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, +0x7e,0x24,0x0, 0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x8d,0x7e,0x37,0x2a,0x72,0x22,0x7a,0x1d,0x24,0x7e,0xa3, +0x2a,0x8d,0x74,0x2, 0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x8c,0x7e, +0x37,0x2a,0x70,0x22,0x12,0x57,0xf, 0xe4,0x7a,0xb3,0x39,0x8, 0x2, 0x55,0x25,0x12, +0x57,0x73,0x7e,0xb3,0x36,0x6d,0xb4,0x1, 0xc, 0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2a, +0x79,0x7a,0x37,0x2a,0x7b,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x1f,0x7e,0x34,0x1, 0x5e, +0x7a,0x37,0x2a,0x79,0x7e,0x34,0x1, 0x2c,0x7a,0x37,0x2a,0x7b,0x7e,0x34,0x1, 0x90, +0x7a,0x37,0x2a,0x6e,0x7e,0x34,0x1, 0x7c,0x12,0x57,0x81,0x7e,0xb3,0x2a,0x20,0x70, +0x21,0x7e,0x27,0x2a,0x79,0x7d,0x32,0x7e,0x14,0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12, +0x4f,0xeb,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e,0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37, +0x2a,0x79,0x22,0x12,0x57,0xa5,0x2, 0x57,0x79,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2a, +0x6e,0x7a,0x37,0x2a,0x70,0x7a,0x37,0x2a,0x72,0x22,0x7e,0x18,0x5, 0xf8,0x7a,0x1f, +0x6, 0xf4,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22,0x7e,0x34,0x61,0x29, +0x7e,0x24,0x0, 0xff,0x22,0x7e,0x34,0x0, 0xb4,0x7a,0x37,0x2a,0x79,0x7e,0x34,0x0, +0xa0,0x7a,0x37,0x2a,0x7b,0x7e,0x34,0xff,0x60,0x7a,0x37,0x2a,0x7d,0x22,0x6c,0x33, +0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72,0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93, +0x12,0x56,0xc9,0xb, 0x24,0xa, 0x33,0xbd,0x32,0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84, +0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28,0x86,0x7a,0x37,0x28,0x88,0x7a,0x37, +0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f,0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc, +0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d,0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a,0x8c,0x7a,0x73,0x1f,0x73,0x7e,0x73, +0x2a,0x8d,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a,0x7b,0x7a,0x37,0x1f,0x7c,0x7e,0x37, +0x2a,0x7d,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a,0x7f,0x7a,0x37,0x1f,0x80,0x90,0x60, +0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x39,0x9, 0x7a,0x73,0x1f,0x75,0x7e,0x8, +0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, 0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28, +0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85,0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28, +0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88,0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28, +0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53,0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28, +0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e,0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a, +0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91,0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12, +0x2f,0x49,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15,0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25, +0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, 0x30,0x7e,0x23,0x28,0x84,0xbc,0x23, +0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac,0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a, +0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36,0x7c,0x29,0x19,0x25,0x27,0x37,0xb, +0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd,0x22,0xe4,0x7a,0xb3,0x37,0xaa,0x7a, +0xb3,0x37,0xab,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0xac,0x90,0x60,0x51,0xe4,0x93, +0x7a,0xb3,0x37,0xad,0xe4,0x7a,0xb3,0x37,0xae,0x74,0xa, 0x7a,0xb3,0x37,0xaf,0xe4, +0x7a,0xb3,0x37,0xb0,0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3,0x37,0xb3,0x74,0x2d, +0x7a,0xb3,0x37,0xb7,0x74,0x46,0x7a,0xb3,0x37,0xb8,0x74,0x78,0x7a,0xb3,0x37,0xc9, +0x74,0x4, 0x7a,0xb3,0x37,0xca,0xe4,0x7a,0xb3,0x37,0xb6,0x74,0x66,0x7a,0xb3,0x37, +0xcc,0x74,0x60,0x7a,0xb3,0x37,0xcb,0x74,0x2, 0x7a,0xb3,0x37,0xcd,0x74,0x40,0x7a, +0xb3,0x37,0xc8,0xe4,0x7a,0xb3,0x37,0xc3,0x74,0xfa,0x7a,0xb3,0x37,0xc1,0x74,0x1e, +0x7a,0xb3,0x37,0xc2,0x74,0x1, 0x7a,0xb3,0x37,0xc0,0x74,0xc, 0x7a,0xb3,0x37,0xbf, +0x74,0x1, 0x7a,0xb3,0x37,0xc4,0xe4,0x7a,0xb3,0x37,0xc5,0x7a,0xb3,0x37,0xc6,0x7e, +0x8, 0x37,0xce,0x7e,0x34,0x0, 0x2c,0x12,0x17,0x4e,0x74,0x1, 0x7a,0xb3,0x37,0xd9, +0x74,0xf4,0x7a,0xb3,0x37,0xda,0x74,0x19,0x7a,0xb3,0x37,0xdb,0x74,0x38,0x7a,0xb3, +0x37,0xdc,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x57,0x9c,0x7e,0x8, 0x37,0xea,0x12, +0x17,0x29,0x1b,0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xf7,0x74,0x1, 0x7a,0xb3,0x37,0xee, +0x7e,0x34,0x0, 0x28,0xca,0x39,0x7e,0x34,0x61,0xec,0x7e,0x24,0x0, 0xff,0x7e,0x8, +0x26,0x33,0x12,0x17,0x29,0x1b,0xfd,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44,0x0, 0xff, +0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26,0x7a,0x15, +0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12,0x4b,0x63, +0x74,0x2d,0x7a,0xb3,0x36,0xde,0x74,0x28,0x7a,0xb3,0x36,0xdf,0x74,0x11,0x7a,0xb3, +0x36,0xe0,0x7a,0xb3,0x36,0xe1,0x7a,0xb3,0x36,0xe2,0x74,0xa0,0x7a,0xb3,0x36,0xe3, +0x7e,0x34,0x0, 0x6a,0xca,0x39,0x7e,0x34,0x61,0x65,0x7e,0x24,0x0, 0xff,0x7e,0x8, +0x36,0xe4,0x12,0x17,0x29,0x1b,0xfd,0xe5,0x25,0x7a,0xb3,0x37,0xf, 0xe5,0x28,0x7a, +0xb3,0x36,0xfe,0x22,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4,0x12,0x17,0x4e, +0x7e,0x8, 0x26,0x8c,0x7e,0x34,0x0, 0xc8,0x74,0xff,0x12,0x17,0x4e,0x7e,0x8, 0x26, +0xb4,0x7e,0x34,0x0, 0xc8,0x12,0x17,0x4e,0x90,0x60,0x9a,0xe4,0x93,0x7c,0x7b,0x74, +0x9, 0xac,0x7b,0x7e,0x8, 0x27,0x76,0x74,0xff,0x2, 0x17,0x4e,0xca,0xf8,0x7e,0x73, +0x2a,0x97,0xa, 0x47,0x7e,0x73,0x2a,0x90,0xa, 0x57,0x2d,0x54,0x7e,0xa3,0x2a,0x92, +0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x91,0x7e,0xa3,0x2a,0x93,0xbc,0xaf, +0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xd8,0x7e,0x18,0x2a,0x99,0x12, +0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xfb,0x7e,0x18,0x2a,0xbc,0x7c,0xbf,0x12, +0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x8c,0x7e,0xb3,0x2a,0x8d,0xa4, +0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x17,0x4e,0x7f,0x6, 0x7d,0x3f, +0x12,0x17,0x4e,0x7a,0xb3,0x16,0x91,0x22,0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, +0xca,0x3b,0x7a,0x1d,0x29,0x7f,0x30,0x12,0x5f,0xdf,0x7a,0x55,0x31,0x7e,0xb3,0x2b, +0x3c,0xf5,0x2e,0xe4,0x7a,0xb3,0x2b,0x3c,0x7f,0x3, 0x7e,0x1d,0x29,0x12,0x5a,0xd5, +0x12,0x5f,0xa0,0x12,0x47,0xd2,0x75,0x2d,0x0, 0x12,0x45,0x4, 0x30,0xb, 0xfd,0x74, +0x1, 0x12,0x5e,0x32,0x7e,0x14,0x40,0x0, 0x7d,0x21,0x7d,0x7, 0x12,0x5b,0x7c,0x12, +0x5e,0x3a,0x6d,0x33,0x80,0x19,0x7e,0x35,0x2f,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, +0xa, 0x20,0x7e,0xd, 0x29,0x2d,0x13,0x12,0x5f,0xd6,0x7e,0x35,0x2f,0xb, 0x34,0x7a, +0x35,0x2f,0x7e,0x35,0x31,0xbe,0x35,0x2f,0x38,0xdc,0x5, 0x2d,0xe5,0x2d,0xbe,0xb0, +0x1, 0x40,0xb6,0xe5,0x2e,0x7a,0xb3,0x2b,0x3c,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x8c, +0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x38,0x7d,0x71,0x7a,0x25,0x36,0x7a,0x35,0x34,0x12, +0x5d,0xed,0x50,0x77,0x6c,0xcc,0x80,0x11,0x7e,0x73,0x2a,0x8d,0x12,0x5c,0xa2,0x12, +0x5c,0x88,0x7e,0x34,0x34,0x0, 0x12,0x5c,0xab,0x12,0x5c,0xc3,0x38,0xea,0x6c,0xcc, +0x80,0x53,0x7e,0xa3,0x2a,0x8d,0x7c,0x7a,0x12,0x5c,0xa2,0x75,0x3a,0x0, 0x80,0x27, +0x7e,0xb3,0x37,0xbf,0xbe,0xb1,0x3a,0x7e,0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43, +0x3, 0x72,0x80,0x6, 0xac,0x7c,0x49,0x43,0x3, 0x74,0x7e,0x71,0x3a,0x74,0x2, 0xac, +0x7b,0x59,0x43,0x34,0x50,0x5, 0x3a,0x7e,0xb3,0x2a,0x8f,0xbe,0xb1,0x3a,0x38,0xd0, +0x7e,0x34,0x10,0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x5c,0x88,0x7e,0x34, +0x34,0x50,0x12,0x5c,0xab,0xbc,0xdc,0x38,0xa9,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e, +0x73,0x2a,0x8f,0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3, +0x25,0xb8,0x7a,0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73, +0x2b,0x3e,0xa, 0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x67,0x34,0x7e,0x35,0x38,0x7a, +0x37,0x25,0xbe,0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x5c,0x99,0x7a,0xd3,0x25,0xb6,0x7e, +0xb3,0x2b,0x3c,0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34, +0x0, 0x20,0x80,0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x34,0x7a,0x37,0x25, +0xba,0x7e,0x35,0x36,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, +0x25,0xb6,0x12,0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, +0x7a,0xb3,0x25,0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x8d,0x7a,0x73,0x25, +0xb7,0x22,0xac,0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d, +0x3f,0x7a,0x37,0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b, +0xb, 0xc0,0x22,0x7e,0x73,0x2a,0x8e,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50, +0x7e,0x14,0x19,0x35,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x7a, +0x1d,0x2c,0x7e,0x73,0x2a,0x8c,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, +0x12,0x17,0x29,0x1b,0xfd,0x6c,0xdd,0x12,0x5f,0x98,0x7a,0xb3,0x1f,0x34,0x6c,0xcc, +0x80,0x4a,0x12,0x5d,0xa3,0x40,0x43,0x12,0x5d,0x99,0x50,0x3e,0x12,0x5f,0xa9,0xb, +0x1a,0x10,0x7d,0x3f,0x12,0x17,0x80,0x7d,0x3, 0x7d,0x31,0x12,0x17,0x80,0xbd,0x30, +0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e,0x15,0x2a,0x80,0xb, 0x6d,0x0, +0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d,0x31,0x1a,0x26,0x1a,0x24,0x2f, +0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34,0xb, 0xc0,0x12,0x5c,0xc3,0x38, +0xb1,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12,0x7a,0xc9,0x8, 0x2, 0x7d,0x7f, +0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, 0x6d,0xee,0x9e,0xe5,0x2a,0xbd, +0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12,0x5d,0xa3,0x40,0x8, 0x12,0x5d, +0x99,0x50,0x3, 0x12,0x7a,0xb4,0xb, 0xc0,0x12,0x5c,0xc3,0x38,0xec,0xb, 0xd0,0xbe, +0xd0,0x3, 0x50,0x2, 0x81,0xf7,0xda,0x3b,0x22,0x7c,0x1d,0x2e,0x10,0x2d,0xa5,0xe7, +0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xd8,0x7c,0x1d,0x2e,0x10,0x2c,0xa5,0xe7, +0xbc,0xab,0x22,0x7e,0xb3,0x2b,0x3d,0x70,0x1f,0x12,0x1f,0xed,0x12,0x5f,0xe9,0x50, +0xfb,0x12,0x5a,0xf8,0x12,0x5d,0xd9,0x20,0xf, 0x3, 0x12,0x7c,0x51,0x74,0x2, 0x7a, +0xb3,0x2b,0x3d,0xe4,0x7a,0xb3,0x16,0x91,0x22,0x12,0x5d,0xed,0x50,0x3, 0xd2,0xf, +0x22,0xc2,0xf, 0x22,0x12,0x93,0xa6,0x12,0x5d,0xfe,0x2, 0x5d,0xd9,0x7e,0xb3,0x37, +0x5, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xc0,0x70,0x2, 0xc3,0x22,0xd3,0x22,0x7e,0x8, +0x24,0xf2,0x7e,0x34,0x0, 0xc, 0xe4,0x12,0x17,0x4e,0x12,0x5f,0xcd,0x12,0x5f,0xc4, +0xa9,0xd1,0xcb,0x12,0x5e,0x32,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x33,0xf8,0x7a,0x37, +0x24,0xf8,0x7e,0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0x5f,0xb2,0x2, +0xd, 0x7, 0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xa3,0x2a,0x8d,0xa, 0x3a, +0x3e,0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x17,0x4e,0x90,0x60,0x93,0x93,0xa, 0x3b, +0x7e,0xb3,0x2a,0x90,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43,0x6c,0x77, +0x80,0x1d,0xa, 0x27,0x2d,0x24,0x12,0x5f,0xbb,0xb, 0xa, 0x0, 0x7e,0x30,0x2, 0xac, +0x37,0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, 0x70,0xbc, +0xa7,0x38,0xdf,0x22,0x12,0x71,0xfe,0x12,0x74,0xae,0x12,0x5e,0xd0,0x7e,0xb3,0x37, +0x3, 0xb4,0x1, 0x10,0x7e,0x34,0x0, 0x5, 0x7a,0x37,0x28,0xa1,0x7e,0x34,0x0, 0xa, +0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39,0xa, 0x60,0x7, 0x14,0x7a,0xb3,0x39,0xa, 0x80, +0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, 0x12,0x5d,0xe4,0x12,0x4f,0x84,0x12,0x9d,0x7b, +0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12,0xa2,0xcb,0x12,0x5f,0x40,0x2, 0x5e,0xf4,0x22, +0x12,0x9a,0x1a,0x60,0x17,0x12,0x5e,0xed,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x22,0x6c,0xaa,0x7e,0x70,0xc, 0xac,0x7a,0x12,0x97,0x1d,0xbe,0x34, +0x3, 0xe8,0x8, 0x5, 0x12,0xa8,0xd0,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32, +0x36,0x80,0x49,0x12,0x36,0x7c,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x80, +0x7d,0x13,0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e, +0x24,0x36,0x80,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xb7,0x22, +0x7e,0x43,0x2a,0x8d,0x7e,0x53,0x2a,0x8c,0xac,0x54,0x7e,0x17,0x28,0xa1,0x12,0x5f, +0x91,0x6d,0x0, 0x80,0x37,0x7d,0x40,0x3e,0x44,0x7e,0x7f,0x33,0xf8,0x2d,0xf4,0xb, +0x7a,0x30,0xbd,0x13,0x58,0x10,0x7d,0xf4,0x2e,0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d, +0x51,0x1b,0xf8,0x50,0x80,0x14,0x6d,0x55,0x9d,0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44, +0x8, 0xa, 0xb, 0x48,0x50,0x2d,0x51,0x1b,0x48,0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5, +0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22, +0x74,0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d, +0x35,0x22,0x7a,0x37,0x24,0xfc,0x7e,0x8, 0x24,0xf2,0x22,0x3e,0x24,0x7e,0xf, 0x33, +0xf8,0x2d,0x12,0x22,0x7e,0x73,0x2a,0x8c,0x7a,0x73,0x24,0xf2,0x22,0x7e,0x73,0x2a, +0x8d,0x7a,0x73,0x24,0xf3,0x22,0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e, +0xa3,0x2a,0x8d,0x7e,0xb3,0x2a,0x8c,0xa4,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, +0xc3,0x22,0xd3,0x22,0x12,0x5f,0xe9,0x50,0xfb,0x22,0x2, 0x6b,0xe8,0x2, 0x71,0x2d, +0x70,0x8f,0x0, 0xff,0x6d,0x92,0x5a,0xa5,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x32,0x36,0x31,0x1, 0xc, 0x3b,0x32,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x4, 0xfb,0x43,0x33,0x42,0x5f,0x57,0x68,0x69,0x74,0x65,0x5f,0x4c,0x45,0x4e,0x53, +0xd, 0x18,0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, +0x1, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x38,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x4, 0x66,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x60,0x40,0xd, 0x18,0x25,0x18,0x10,0x6, 0x80,0x18,0x10,0x6, +0x78,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x34,0x32,0x1, 0xfb,0x2, 0x28,0x0, +0xdf,0x0, 0xe3,0x5, 0x0, 0x37,0x37,0x1, 0xb8,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0xa0,0x1, 0x18,0x0, 0x8c,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, +0x68,0x6, 0x10,0x14,0x32,0x1, 0xf, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x4, 0xf7,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15, +0x0, 0x3, 0x54,0x1, 0x0, 0x4, 0x1, 0x6d,0x1, 0x14,0x0, 0x5a,0x1, 0x1, 0x12,0x0, +0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27,0x0, 0x1, 0x0, 0x2, 0x1, 0x4, 0x1, 0x90,0x0, +0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96,0x1, 0x2c,0x1, 0x2c,0x4, 0x38,0x2, 0x66,0x60, +0x20,0x20,0x3, 0x5f,0x50,0x20,0x34,0x2, 0x62,0x5d,0x20,0x46,0x2, 0x4b,0x44,0x30, +0x38,0x2, 0x66,0x60,0x20,0x38,0x2, 0x66,0x60,0x20,0x38,0x2, 0x66,0x60,0x20,0x38, +0x2, 0x66,0x60,0x20,0x4, 0x5, 0x10,0x11,0x12,0x13,0x14,0x4, 0x0, 0xd2,0x2, 0x30, +0x32,0x0, 0xc8,0x1, 0x5e,0x0, 0x64,0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, +0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c,0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20, +0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, 0x4, 0x4, 0x6, 0x40,0x1, 0x18,0x1, 0x18,0x1, +0x90,0x1, 0x90,0x1, 0x90,0x1, 0x5e,0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, +0x64,0x0, 0x46,0x0, 0x78,0x0, 0x78,0x0, 0x64,0x1, 0x18,0x1, 0x18,0x14,0x8, 0x0, +0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0,0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, +0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80,0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, +0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8,0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, +0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88,0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, +0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, 0x6, 0x6, 0xc, 0x64,0xc8,0x7f,0x70,0x7e,0x33, +0x2a,0x93,0xa, 0x43,0x7e,0x33,0x2a,0x92,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c,0xab, +0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x17,0x4e,0x7f,0x7, 0xa, 0x3a, +0x2, 0x17,0x4e,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15,0x12, +0x62,0xbc,0x12,0x64,0x26,0x7e,0xe0,0x1, 0x12,0x46,0xbd,0x30,0x18,0xfd,0x74,0x2, +0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x47,0xa9,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac,0xbd, +0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15,0x12, +0x5f,0xd6,0xb, 0xd0,0x7e,0x73,0x2a,0x93,0xa, 0x7, 0x7e,0x63,0x2a,0x92,0xa, 0x16, +0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c,0xbf, +0x2e,0x73,0x2a,0x92,0x12,0x63,0x4c,0xda,0x79,0xda,0xd8,0x22,0xca,0xd8,0xca,0x79, +0x7c,0xf7,0x7f,0x70,0x12,0x64,0x2d,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74,0x2, 0xac, +0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11,0x14,0x78, +0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x15,0x77,0x1b,0x6a,0x30,0xb, 0xd0,0xbc,0xfd,0x38, +0xdc,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b,0x21,0x70,0x41,0x12,0x5f,0xe9,0x50, +0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x47,0xb9,0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, +0xf4,0x7e,0xb3,0x2b,0x91,0x12,0x62,0xe3,0x74,0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, +0x12,0x47,0xb9,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12, +0x62,0xe3,0x74,0x2, 0x7a,0xb3,0x2b,0x21,0xe4,0x7a,0xb3,0x16,0x90,0x22,0xca,0x79, +0x7f,0x51,0x7f,0x40,0x7e,0xa3,0x2a,0x93,0xa, 0x3a,0x7e,0xa3,0x2a,0x92,0xa, 0x7a, +0x2d,0x73,0x7e,0xd, 0x29,0x7c,0x7f,0x12,0x63,0x4c,0xa, 0x3f,0x3e,0x34,0xca,0x39, +0x7e,0x1d,0x29,0x7f,0x4, 0x12,0x17,0x29,0x1b,0xfd,0x7e,0xb3,0x2b,0x20,0xb4,0x1, +0x22,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, +0x20,0x7f,0x4, 0x2d,0x13,0xb, 0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc, +0xfa,0x38,0xe2,0xda,0x79,0x22,0x7e,0x8, 0x2a,0x8c,0x2, 0x0, 0x2e,0x7c,0x7b,0xa5, +0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe, +0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38,0x5, 0x7e,0xa0, +0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, +0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e,0x44,0x14,0x78, +0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xc7,0x7e,0x70,0x4, 0xac,0x7a,0xb, 0x34,0xbe, +0x37,0x37,0xfb,0x40,0x39,0x7e,0x37,0x37,0xfb,0xb, 0x34,0x7a,0x37,0x37,0xfb,0xbe, +0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x31,0x22,0xbe,0x34,0x0, 0x2, 0x78,0x3, +0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25,0x9, 0xb2,0x38, +0xf7,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xd8,0x7e,0x39,0xb0,0x22,0x74,0xff, +0x22,0x70,0x5, 0x7e,0xb3,0x37,0xaa,0x22,0xbe,0xb0,0x3, 0x38,0x15,0x75,0x1b,0x0, +0x30,0xe, 0x6, 0x7e,0x18,0x33,0x9, 0x80,0x4, 0x7e,0x18,0x33,0x47,0x7a,0x1d,0x14, +0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e,0x1d,0x14,0x2d, +0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4,0xd4,0x10,0xb4, +0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xfb,0x80,0x2, 0x15,0x1a,0x2, 0x64,0x74,0xbe, +0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x65,0x58,0xbe,0xb0,0x80,0x40,0xc, 0xbe, +0xb0,0xef,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x5e,0x22,0xb4,0xfc,0x5, 0x7e,0xb3, +0x37,0x5, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60,0x3, 0x4e,0xa0, +0x1, 0x7e,0xb3,0x36,0x6d,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22,0xb4,0xfe,0x5, +0x7e,0xb3,0x2b,0x2e,0x22,0x74,0xff,0x22,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x38,0x0, +0x7e,0x73,0x38,0x0, 0xa, 0x27,0x2e,0x24,0x0, 0x6, 0x12,0x2f,0x8f,0x7c,0xab,0x7c, +0xb7,0x4, 0x7a,0xb3,0x38,0x0, 0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x38,0x0, 0x6d,0x33, +0x7a,0x37,0x37,0xfd,0x75,0x1a,0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0xa9,0x7c,0xba, +0x4, 0x7a,0xb3,0x37,0xa9,0x7a,0xa3,0x36,0xef,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b, +0xca,0xb, 0xc0,0x83,0xc0,0x82,0x12,0x33,0x1, 0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda, +0x1b,0xda,0x2b,0xda,0x7b,0x32,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37, +0xaa,0xc4,0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, +0x60,0x3, 0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x5, 0x22,0x74,0x1, 0x7a,0xb3, +0x37,0x5, 0xe4,0x7a,0xb3,0x37,0xaa,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, +0x7c,0xba,0x12,0x65,0xbd,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, +0x7c,0xb3,0x7c,0x7a,0x12,0x66,0x61,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30, +0xef,0x38,0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x66,0x33,0xa5,0xbb,0x8f,0x3, +0x75,0x19,0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x3c,0x77,0x74,0x1, 0x7a,0xb3, +0x3, 0xff,0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x26,0x2e,0x60,0xfd,0x68,0x21,0x1b, +0x61,0x68,0x1d,0x1b,0x62,0x68,0x19,0x1b,0x61,0x68,0x15,0x1b,0x60,0x68,0x11,0x2e, +0x60,0xa, 0x78,0x4, 0x7a,0x73,0x36,0xdd,0xa, 0x2b,0x19,0x72,0x36,0xde,0xd2,0xd, +0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37,0xfd,0x4d,0x22,0x78, +0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37,0xfd,0x15,0x1a,0x7e, +0x27,0x37,0xfd,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, 0x6, 0x7e,0x34,0x0, +0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0x75,0x1a,0xea,0x22,0x7e,0xb3,0x37, +0xff,0x4, 0x7a,0xb3,0x37,0xff,0xe5,0x19,0xb4,0x1, 0x8, 0xe4,0x7a,0xb3,0x37,0xff, +0x75,0x19,0x0, 0x7e,0x73,0x37,0xff,0x7a,0x73,0x36,0xed,0x22,0x7c,0xab,0x12,0x37, +0xb5,0x7c,0xba,0x12,0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70, +0x99,0x12,0x13,0x2c,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x47,0xf1,0x49,0x35, +0x34,0x3b,0x49,0x15,0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70, +0x0, 0x40,0x15,0xbe,0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a, +0x92,0x7e,0x73,0x2a,0x93,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34, +0x39,0x12,0x67,0x2b,0x28,0xe, 0x12,0x45,0x31,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, +0x74,0x3, 0x80,0x2, 0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0x73,0x34,0x38,0xbe, +0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c,0x7c,0xb9,0x12,0x2d, +0x82,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, 0x5a,0x10,0x1a,0x2, +0x1a,0x0, 0x7e,0x83,0x2b,0x3f,0xa, 0x98,0x6d,0x88,0x7f,0x10,0x7f,0x4, 0x12,0x15, +0x5b,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x94,0xbc,0x89,0x38,0xbc, +0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e,0xb, 0x90,0x7a, +0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12,0x17,0x80,0xe5, +0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x7c, +0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e,0x7b,0x70,0x7a, +0xb, 0x70,0x22,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x75,0x25,0x0, 0x75,0x26,0x0, +0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0x29,0x70,0xf, 0x7e, +0xb3,0x2a,0x25,0x70,0x9, 0x7e,0xb3,0x2a,0x26,0x70,0x3, 0x2, 0x69,0xb9,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x47,0x80,0x4, 0x7e,0x68,0x33,0x9, 0x7f,0x6, 0x12,0x4f,0xf4, +0x7e,0x73,0x2a,0x22,0x7a,0x6b,0x70,0x6c,0xdd,0x21,0x6a,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x69,0xe4,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x21,0x68,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x21,0x68,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x69,0xf4,0x50,0x2, 0x21,0x68,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x6c,0xbc,0x7c,0x28,0x57,0x7e,0xb3, +0x2a,0x27,0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xf5,0x6d,0x22,0x74,0x1, 0x12,0x67,0x81,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xff,0x6d,0x22,0x74,0x10,0x12,0x67,0x81,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xf5,0xf5,0x25,0x9, 0xb3,0x32,0xff,0xf5,0x26,0xa, 0x3c,0x12,0x69, +0xe4,0xb4,0x1, 0x11,0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xf5,0x19,0xb3,0x32,0xff,0x75, +0x25,0x0, 0x75,0x26,0x0, 0x7e,0xb3,0x2a,0x83,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e, +0x90,0x9, 0xac,0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, +0x27,0x75,0x27,0x0, 0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x89,0x54, +0xf, 0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x85,0x49,0xa3,0x33,0x87,0x80,0x9, 0x5, +0x27,0xe5,0x27,0xbe,0xb0,0xa, 0x40,0xdc,0x5e,0xb4,0xf, 0xff,0x5e,0xa4,0xf, 0xff, +0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5,0xbe,0x70, +0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0,0xe5,0x28, +0xa, 0x5b,0x12,0x69,0xec,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e,0x70,0x6, +0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13,0x79,0xa0, +0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26,0x2d,0x3d, +0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x6c,0xbc,0x7d, +0x28,0x2, 0x1, 0xb, 0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x2e,0xb4,0x1, +0x9, 0x7e,0xb3,0x2a,0x26,0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38,0x6, 0x7e, +0xb3,0x2a,0x26,0x60,0xa, 0xb2,0xe, 0x12,0x66,0x9d,0x74,0x1, 0x12,0x26,0x7b,0x7e, +0xb3,0x2a,0x25,0x60,0x5, 0x7f,0x4, 0x12,0x25,0x6e,0xe4,0x7a,0xb3,0x2a,0x29,0x7a, +0xb3,0x2a,0x25,0x7a,0xb3,0x2a,0x26,0x80,0x4, 0xe4,0x12,0x26,0x7b,0x7e,0x34,0x0, +0x5a,0xca,0x39,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x85,0x12,0x17,0x29,0x1b,0xfd, +0x4c,0xff,0x78,0xd, 0x7e,0x8, 0x33,0x85,0x7e,0x34,0x0, 0x5a,0x74,0xff,0x12,0x17, +0x4e,0xda,0x3b,0x22,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x7e,0xb, 0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a, +0x9, 0x74,0x34,0xa1,0xbe,0x73,0x34,0xab,0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa1, +0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22,0xbe,0x73,0x34,0xab,0x40,0x9, 0xbe,0x70, +0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74,0xff,0x19,0xb4,0x34,0xa1,0x80,0x17,0xa, +0x3a,0x9, 0xb3,0x34,0xa1,0xbe,0xb0,0xff,0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa1,0xd3, +0x22,0xe4,0x19,0xb3,0x34,0xa1,0xc3,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53, +0x12,0x69,0xec,0xb, 0x7a,0x20,0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d, +0x52,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, +0x2, 0x69,0x37,0x0, 0x6, 0x7d,0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24, +0x1e,0x24,0x1e,0x24,0x1e,0x24,0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, +0x7c,0x45,0x6c,0x55,0x12,0x4f,0xeb,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, +0x6, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x20,0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x21, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x25,0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0x29,0x7e,0x34,0x0, 0x5a,0xca,0x39,0x7e,0x18, +0x28,0xae,0x7e,0x8, 0x29,0x8, 0x12,0x17,0x29,0x1b,0xfd,0x6c,0xff,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xae,0x12,0x6b,0x4, 0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, +0x49,0x35,0x28,0xb0,0x12,0x6c,0xe2,0x12,0x6d,0xd5,0xb, 0xf0,0xbe,0xf0,0xa, 0x40, +0xdc,0xda,0xf8,0x22,0x7d,0xd3,0x7e,0x44,0x2, 0xd0,0x7e,0xa3,0x2a,0x8e,0x74,0x40, +0xa4,0x7d,0xb5,0x1b,0xb4,0xbe,0xd4,0x0, 0x3f,0x38,0x29,0x7e,0xe4,0x0, 0x3f,0x9d, +0xed,0x7e,0xf4,0x1, 0xfb,0xad,0xef,0x7d,0x3f,0x7d,0x2e,0x12,0x6b,0xe1,0x7f,0x71, +0xbe,0x78,0x0, 0x34,0x40,0x4, 0x7e,0x78,0x0, 0x34,0x7e,0x18,0x0, 0x34,0x9f,0x17, +0x7f,0x71,0x61,0xd3,0x7d,0xcb,0x9e,0xc4,0x0, 0x3f,0xbd,0xcd,0x38,0x24,0x7d,0x5d, +0x9d,0x5c,0x7e,0xf4,0x2, 0x28,0xad,0xf5,0x7d,0x3f,0x7d,0x2e,0x12,0x6b,0xe1,0x7f, +0x71,0xbe,0x78,0x0, 0x32,0x40,0x4, 0x7e,0x78,0x0, 0x31,0x12,0x6c,0xd9,0x2f,0x71, +0x80,0x61,0x7d,0xcb,0xb, 0xc4,0x1e,0xc4,0x7d,0x5c,0x1b,0x54,0xbd,0x5d,0x40,0xc, +0x7d,0xf5,0x9d,0xfd,0x6d,0xee,0x7e,0x14,0x0, 0xdf,0x80,0xa, 0x7d,0xfd,0x9d,0xfc, +0x6d,0xee,0x7e,0x14,0x0, 0xe3,0x7f,0x17,0x12,0x15,0x6c,0x7f,0x71,0x12,0x6b,0xe1, +0x7f,0x71,0xbd,0x5d,0x7d,0x34,0x40,0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17, +0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d,0x22,0x2f,0x71,0xbe,0x78,0x0, 0x34,0x50,0x6, +0x7e,0x78,0x0, 0x34,0x80,0xd, 0x12,0x6c,0xd9,0x7d,0x13,0x6d,0x0, 0xbf,0x70,0x28, +0x2, 0x7f,0x71,0x7d,0x3f,0x22,0x9d,0x32,0x12,0x17,0x80,0x7d,0x13,0x7d,0x30,0xad, +0x31,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4, +0xff,0xfc,0x7c,0xb4,0x12,0x88,0x7d,0x7d,0x3, 0x7e,0x70,0x9, 0xac,0x7e,0x49,0x13, +0x28,0xb0,0xbe,0x14,0x2, 0x60,0x50,0x5, 0x12,0x6c,0xce,0x40,0xb, 0xbe,0x14,0x69, +0xb0,0x28,0x1f,0x12,0x6c,0xce,0x28,0x1a,0x3e,0x4, 0xbe,0x14,0x2, 0x30,0x50,0x5, +0x12,0x6c,0xce,0x40,0xb, 0xbe,0x14,0x69,0xe0,0x28,0x7, 0x12,0x6c,0xce,0x28,0x2, +0x3e,0x4, 0xbe,0x4, 0x1, 0x0, 0x28,0x4, 0x7e,0x4, 0x1, 0x0, 0x74,0x9, 0xac,0xbf, +0x49,0x25,0x29,0x62,0x49,0x33,0x28,0xae,0x12,0x6b,0xd6,0x7d,0x13,0x5d,0x1e,0x7e, +0x70,0x9, 0xac,0x7f,0x49,0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae, +0xbd,0x2f,0x28,0xf, 0x7d,0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58, +0x20,0x80,0xd, 0xbd,0xf1,0x40,0x9, 0x2e,0x34,0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0, +0x74,0x9, 0xac,0xbf,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0, +0x12,0x6b,0xd6,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64, +0x74,0x9, 0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, +0x29,0x64,0x2d,0x13,0x1b,0x8, 0x10,0x80,0x12,0xbd,0x31,0x40,0xe, 0x7e,0x50,0x9, +0xac,0x5f,0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30,0xda,0x79,0x22,0x74,0x9, +0xac,0xbf,0x49,0x25,0x29,0x64,0xbd,0x12,0x22,0x7d,0x34,0x6d,0x22,0x9e,0x18,0x0, +0x32,0x22,0x7d,0xf3,0x9f,0x11,0x7e,0x44,0x5, 0x0, 0x7e,0xa3,0x2a,0x8f,0x74,0x40, +0xa4,0x7d,0xd5,0x1b,0xd4,0xbe,0xf4,0x0, 0x3f,0x38,0x1f,0x7e,0x24,0x0, 0x3f,0x9d, +0x2f,0x7e,0x34,0x1, 0xb8,0x12,0x6d,0xba,0xbe,0x18,0x0, 0x37,0x40,0x4, 0x7e,0x18, +0x0, 0x37,0x7e,0x8, 0x0, 0x37,0x9f,0x1, 0x7f,0x10,0x7d,0x5d,0x9e,0x54,0x0, 0x3f, +0xbd,0x5f,0x38,0x1f,0x12,0x6d,0xcc,0x40,0x1a,0x7d,0x3d,0x9e,0x34,0x0, 0x40,0x12, +0x6d,0xb2,0xbe,0x18,0x0, 0x37,0x40,0x4, 0x7e,0x18,0x0, 0x36,0x12,0x6d,0xc3,0x2f, +0x10,0x80,0x14,0x12,0x6d,0xcc,0x50,0xf, 0x7d,0x3d,0x9e,0x34,0x0, 0x20,0x12,0x6d, +0xb2,0x7d,0x14,0x6d,0x0, 0x2f,0x10,0xbe,0xf4,0x0, 0x3f,0x28,0x54,0xbd,0x5f,0x28, +0x50,0x7d,0xed,0xb, 0xe4,0x1e,0xe4,0x7d,0x5e,0x1b,0x54,0xbd,0x5f,0x40,0x6, 0x7d, +0x35,0x9d,0x3f,0x80,0x4, 0x7d,0x3f,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x0, 0xe0,0x12, +0x15,0x6c,0x12,0x6d,0xbc,0xbd,0x5f,0x7d,0x14,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d, +0x0, 0x9f,0x1, 0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0xbe,0x18,0x0, +0x37,0x50,0x5, 0x7e,0x18,0x0, 0x37,0x22,0x12,0x6d,0xc3,0xbf,0x10,0x28,0x2, 0x7f, +0x10,0x22,0x7d,0x2f,0x9d,0x23,0x7e,0x34,0x1, 0xba,0xad,0x23,0x7c,0x76,0x7c,0x65, +0x1a,0x24,0x22,0x7d,0x14,0x6d,0x0, 0x9e,0x8, 0x0, 0x37,0x22,0x7d,0xed,0x9e,0xe4, +0x0, 0xb, 0xbd,0xef,0x22,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0xa, 0x22,0xca,0xd8, +0xca,0x79,0x7e,0x44,0x5, 0x0, 0x6c,0xff,0x7e,0x70,0x9, 0xac,0x7f,0x9, 0xe3,0x29, +0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7d,0x24,0x2e,0x24,0x0, 0x14,0xbd,0xc2, +0x40,0x3f,0x49,0xd3,0x29,0x8, 0x7d,0x3d,0x12,0x92,0x3a,0x7c,0xdb,0xbe,0xd0,0x3, +0x40,0xe, 0x7d,0x34,0x1b,0x34,0x12,0x6d,0xd5,0x7c,0xbe,0x12,0x6e,0x6c,0x80,0x40, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x34,0x60,0xc5,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xd0, +0x74,0x9, 0xac,0xbf,0x59,0xd5,0x29,0x8, 0x7e,0x34,0x7, 0xd0,0x12,0x6d,0xd5,0x80, +0x1f,0xbd,0xc4,0x40,0x1b,0x7d,0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c, +0xbe,0x12,0x6e,0x6c,0x7d,0xc4,0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, +0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0x81,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0x8, +0x29,0xbc,0xbe,0xa0,0xa, 0x50,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0, +0xb4,0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31, +0x7d,0x20,0x39,0xb1,0x0, 0xa, 0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x7e, +0x70,0xff,0x12,0x71,0x23,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4, +0x1f,0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xe2,0x7e,0x73,0x2a, +0x20,0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x3, 0x2, 0x70,0x99,0x6c,0xaa, +0x7e,0x44,0x7f,0xff,0x12,0xa9,0x2d,0x79,0x40,0x0, 0x14,0x12,0x71,0x1a,0xb, 0xa0, +0xbe,0xa0,0xa, 0x78,0xeb,0x2, 0x70,0x99,0x7e,0xb3,0x34,0x4f,0x70,0x3e,0xbe,0x70, +0x0, 0x28,0x39,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae, +0x12,0xa9,0x2d,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79, +0x30,0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, +0xa0,0x7e,0xb3,0x2a,0x20,0xbc,0xba,0x38,0xce,0x2, 0x70,0x99,0x6c,0xaa,0x12,0x25, +0xa9,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xe4,0x6c,0xaa,0x80,0x3b,0x6c,0xff, +0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe,0x34,0x7f, +0xff,0x68,0x1d,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x14,0x12,0xa9,0x73,0x59, +0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0xa8,0xde,0x80,0x7, +0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xc9,0xb, 0xa0,0x7e,0xb3,0x34,0x4f,0xbc,0xba,0x38, +0xbd,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x46,0xb4,0xff,0x17,0x6c,0xff,0xa, 0x4f, +0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x5, 0x12,0xa8,0xde,0x80,0x7, 0xb, 0xf0,0xbe,0xf0, +0xa, 0x40,0xeb,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xd9,0x6c,0xaa,0x80,0x1a,0x7e,0x70, +0x9, 0xac,0x7a,0x49,0x43,0x28,0xae,0x12,0xa9,0x73,0x59,0x42,0x15,0x76,0x49,0x33, +0x28,0xb0,0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x20,0xbc,0xba,0x38,0xde, +0x7e,0x34,0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42, +0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e, +0x7e,0x73,0x2a,0x20,0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c, +0xaa,0x80,0x57,0x7e,0x70,0xff,0x6c,0xff,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0xbe,0xf0,0xa, 0x40,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x71,0x23,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x71,0x1a,0xb, 0xa0,0x7e,0x63,0x2a,0x20,0xbc,0x6a, +0x38,0xa1,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68,0x13,0x12, +0x25,0xa9,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c,0x79,0x41, +0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xdb,0x7e,0xf3,0x2a,0x20,0x7a,0xf3,0x34, +0x4f,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2c,0x12,0x71,0x13,0x29, +0xb1,0x0, 0xa, 0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0x12,0x71,0x13,0x29, +0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x32,0xa5,0xbb,0x0, +0x2e,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x27,0x12,0x71,0x13,0x29,0xb1,0x0, 0xa, 0xbe, +0xb0,0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e, +0x30,0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0x12, +0x71,0x13,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0x93, +0xda,0xf8,0x22,0xa, 0x3a,0x2d,0x3d,0x7d,0x2c,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40, +0x0, 0x28,0x22,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x72,0x28,0xb2,0x22,0xca,0x79,0x6c, +0xff,0x7e,0xd7,0x2a,0x79,0x6c,0xee,0x80,0x35,0x7c,0xbe,0x12,0x71,0x7e,0xbd,0x3d, +0x48,0x2a,0x7c,0xbe,0x12,0x1f,0xd4,0x60,0x23,0x7e,0xc4,0x0, 0x9, 0xca,0xc9,0x7e, +0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e,0x30,0x9, 0xac,0x3f,0x2e, +0x14,0x28,0xae,0x6d,0x0, 0x12,0x17,0x29,0x1b,0xfd,0xb, 0xf0,0xb, 0xe0,0x12,0x77, +0xc0,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x20,0xda,0x79,0x22,0x7c,0xab, +0x7e,0x70,0x2, 0xac,0x7a,0x12,0x8c,0x99,0x2, 0x1e,0x80,0xca,0x79,0x6c,0x88,0x80, +0x65,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x12,0x77,0xed,0x7c,0xbf,0x12,0x91, +0xb9,0x50,0x51,0x6c,0xee,0x80,0x48,0xbc,0xe8,0x68,0x42,0x7e,0x70,0x2, 0xac,0x7e, +0x12,0x8e,0xca,0x6c,0x99,0x7e,0xb3,0x2a,0x8f,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, +0x2f,0xe5,0x25,0xa, 0x3b,0x12,0x2d,0x16,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, +0x78,0x1b,0x7c,0xbe,0x12,0x71,0x7e,0x7d,0xf3,0x7c,0xb8,0x12,0x71,0x7e,0xbd,0x3f, +0x8, 0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x2f,0x4c,0xb, 0xe0,0x12, +0x77,0xc0,0x38,0xb3,0xb, 0x80,0x12,0x77,0xe6,0x38,0x96,0xda,0x79,0x22,0xca,0xd8, +0xca,0x79,0x7e,0xa3,0x2a,0x8d,0x7e,0x47,0x28,0x99,0xe4,0x7a,0xb3,0x28,0xa6,0x7e, +0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73,0x28,0x85,0xbe,0x70,0x0, 0x28, +0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0x27,0x36,0x9, 0xe2, +0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a, +0x72,0xbd,0x12,0x58,0x19,0x12,0x76,0x55,0x49,0x12,0x4, 0xfc,0x6d,0x22,0x9e,0x27, +0x2a,0x70,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa6,0x80,0x6, 0xb, 0xf0, +0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e,0xb3,0x26,0x83,0x70,0x40,0x12, +0x74,0xa6,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0x26, +0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x76,0x55,0x49,0x2, 0x5, 0x7a,0x6d,0x11,0x9d,0x14, +0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49,0x20,0x5, 0x7a,0xbd,0x21,0x58, +0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc9,0x12, +0x9a,0xea,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28,0x88,0x2e,0x37,0x28,0x86,0xbe, +0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x74,0x1, 0x7a,0xb3,0x28, +0xaa,0x6c,0xff,0x80,0x1f,0x12,0x73,0x10,0x49,0x25,0x25,0xf7,0x7d,0x43,0x9d,0x42, +0x7d,0x34,0x12,0x17,0x80,0xbe,0x37,0x28,0x9d,0x8, 0x7, 0xe4,0x7a,0xb3,0x28,0xaa, +0x80,0x7, 0xb, 0xf0,0x12,0x73,0x1a,0x38,0xdc,0x6c,0xff,0x80,0x9, 0x12,0x73,0x10, +0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x73,0x1a,0x38,0xf2,0xda,0x79,0xda,0xd8,0x22, +0x7c,0xbf,0x12,0x71,0x7e,0x74,0x2, 0xac,0xbf,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f, +0x22,0xca,0xd8,0xca,0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x4a,0xe4,0x7a,0xb3, +0x1f,0x58,0xe5,0x1d,0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60, +0xa, 0x7e,0x87,0x7, 0xfa,0xbe,0x84,0x1, 0x18,0x58,0xa, 0xc2,0x10,0x6d,0x88,0x7a, +0x87,0x38,0xb, 0x81,0x44,0x12,0x82,0xea,0x60,0x10,0x7e,0x84,0x0, 0x64,0x7a,0x87, +0x38,0x1, 0x7e,0x84,0x0, 0x32,0x7a,0x87,0x38,0xb, 0x7e,0x87,0x38,0x1, 0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x76,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x76,0x7b,0x7e,0x8, 0x1f,0x52,0x7c,0xbd,0x7c,0x7e,0x12,0x81, +0xa5,0x7d,0x93,0x7e,0x87,0x38,0xb, 0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0xb, 0x7e, +0x87,0x38,0x4a,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x4a,0xe5,0x1d,0xbe,0xb0,0x5, +0x38,0x1f,0x7e,0x8, 0x38,0xd, 0x12,0x76,0xd4,0x50,0x7, 0x12,0x76,0x67,0xd2,0x3, +0x80,0x2e,0x7e,0x8, 0x38,0xd, 0x7e,0x18,0x1f,0x52,0x12,0x83,0x3c,0x50,0x21,0x80, +0xf, 0xbe,0x94,0x0, 0x32,0x40,0x19,0x7e,0x8, 0x1f,0x52,0x12,0x7f,0xcb,0x50,0x10, +0x12,0x76,0x67,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52,0x12,0x82,0xc4,0xd2,0x3, +0xb, 0xf0,0x12,0x73,0x1a,0x38,0x85,0x30,0x3, 0x30,0x6c,0xff,0x80,0x1c,0x12,0x76, +0x7b,0x7e,0x8, 0x1f,0x58,0x12,0x76,0xd4,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34, +0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x76,0xb0,0xb, 0xf0,0x12,0x73,0x1a,0x38,0xdf,0x75, +0x1d,0x0, 0x7e,0x34,0x0, 0x64,0x7a,0x37,0x38,0x1, 0x7e,0x63,0x1f,0x58,0x7e,0x70, +0x6, 0xac,0x67,0xb, 0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x38,0xd, 0x12, +0x17,0x29,0x1b,0xfd,0x7e,0x37,0x38,0x1, 0x4d,0x33,0x78,0x34,0x7e,0x37,0x38,0xb, +0xbe,0x34,0x0, 0x32,0x40,0x3e,0x7e,0x37,0x38,0x4a,0xbe,0x34,0x0, 0x19,0x40,0x34, +0x90,0x60,0x51,0x12,0x76,0x5e,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, 0x24, +0x90,0x60,0x50,0x12,0x76,0x5e,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, 0x14, +0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x76,0xb0,0xb, 0xf0,0x12,0x73,0x1a,0x38,0xf4, +0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x38,0xb, 0xa2,0x3, 0x92,0x10,0x12,0x77, +0xcf,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0xca,0xf8, +0x7e,0xf0,0x1, 0x7e,0xb3,0x2f,0xc8,0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f, +0xc8,0x12,0xa8,0xb4,0x7e,0x44,0x1, 0x18,0x7e,0xd4,0x0, 0xb4,0xe4,0x7a,0xb3,0x28, +0xac,0x12,0x5e,0xed,0x7e,0xc4,0xfe,0x5c,0x7e,0x57,0x7, 0xfe,0xbe,0x54,0xfc,0xb8, +0x58,0x15,0x7e,0x57,0x7, 0xfc,0xbd,0x5c,0x58,0xd, 0x12,0x76,0x70,0x8, 0x8, 0x12, +0x91,0xcb,0x60,0x3, 0x12,0x76,0x9f,0x12,0x91,0xcb,0xa, 0x5b,0x4d,0x55,0x68,0x3b, +0x6d,0x55,0x9d,0x54,0xbe,0x57,0x7, 0xfe,0x18,0x6, 0xbe,0x57,0x7, 0xfc,0x8, 0x2b, +0x12,0x76,0x70,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12,0x17,0x80,0xbe,0x37,0x28,0x8a, +0x8, 0x19,0x12,0x74,0xa6,0x28,0x14,0x7e,0x73,0x28,0x85,0xbe,0x70,0x1, 0x28,0xb, +0x7e,0xc7,0x7, 0xfa,0xbd,0xc4,0x58,0x3, 0x12,0x76,0x9f,0x12,0x93,0xe5,0x40,0x5, +0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x76,0x4d,0x68,0x6, 0x7e,0xb3,0x39,0x6, 0x60,0x7, +0xe4,0x7a,0xb3,0x28,0xad,0x80,0x71,0x12,0x74,0xa6,0x28,0x5, 0xe4,0x7a,0xb3,0x28, +0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x94,0x23,0x50,0xa, 0x12,0x5e, +0xed,0x12,0x92,0xea,0x7c,0xfb,0x80,0x21,0x7e,0xb3,0x26,0x84,0x70,0x1b,0x7e,0xb3, +0x26,0x85,0x70,0x15,0x12,0x74,0xa6,0x28,0x10,0x12,0x76,0x4d,0x68,0x5, 0x12,0x9a, +0x1a,0x60,0x6, 0x7e,0xf0,0x3, 0x12,0x5e,0xed,0x7e,0xc7,0x7, 0xfa,0xbe,0xc4,0x5, +0xdc,0x8, 0x17,0x12,0x74,0xa6,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7,0x28,0x8e, +0x58,0x8, 0x12,0x76,0x88,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0xcf,0x7a,0xc7,0x28,0xa1, +0x74,0x2, 0xac,0xbf,0x7a,0x57,0x28,0xa3,0x12,0x76,0x4a,0x50,0xd, 0xe4,0x7a,0xb3, +0x28,0xad,0x12,0x74,0xa6,0x28,0x3, 0x12,0x76,0x88,0x7e,0xc7,0x28,0x8a,0xbd,0xcd, +0x8, 0x1f,0x7e,0x24,0x0, 0x2, 0x7d,0x3d,0x12,0x15,0x29,0x6e,0x34,0xff,0xff,0xb, +0x34,0xbe,0x37,0x28,0x8e,0x58,0xa, 0x12,0x76,0x4a,0x50,0x5, 0xe4,0x7a,0xb3,0x28, +0xad,0x12,0x8d,0xd1,0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac, +0xb4,0x1, 0x9, 0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x20,0x12,0x93,0x4d,0x7e, +0xb3,0x2f,0xc9,0xbe,0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xc9,0x70,0x18,0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x77,0xc7,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a, +0xb3,0x28,0x84,0x7a,0xb3,0x26,0x83,0xda,0xf8,0x22,0xa2,0x13,0x22,0x7e,0xb3,0x28, +0xa8,0xbe,0xb0,0x1, 0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0xe4,0x93, +0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22, +0x6d,0x55,0x9e,0x57,0x2a,0x79,0xbe,0x57,0x28,0x8e,0x22,0x74,0x2, 0xac,0xbf,0x9, +0xd5,0x26,0xfa,0x9, 0xe5,0x26,0xfb,0x22,0xe4,0x7a,0xb3,0x2f,0xc9,0x7a,0xb3,0x28, +0xac,0x74,0x2, 0x2, 0x76,0x96,0x7a,0xb3,0x2b,0x21,0x7a,0xb3,0x2b,0x3d,0x22,0x74, +0x2, 0x7a,0xb3,0x2f,0xc9,0xe4,0x7a,0xb3,0x2f,0xc8,0x12,0x77,0xc7,0x2, 0x76,0x96, +0x7c,0xab,0x7e,0xb3,0x39,0x6, 0x70,0x1b,0x7e,0xb3,0x28,0xa8,0x70,0x15,0x12,0x77, +0xf5,0x68,0x10,0x7e,0xb3,0x2a,0x8a,0xbe,0xb0,0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77, +0x2, 0x2f,0x4c,0x22,0x7c,0xbd,0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30, +0x7e,0x50,0x6, 0xac,0x5a,0x7f,0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc, +0xb6,0x40,0x1b,0x7e,0x7b,0xb0,0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7, +0x40,0xc, 0x29,0xb7,0x0, 0x1, 0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0, +0x7e,0xb, 0xb0,0xbc,0xba,0x38,0xc9,0xa2,0x4, 0x22,0xca,0xf8,0x7e,0xd4,0x0, 0x9, +0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, 0x80,0x7d,0xbe,0xb0, +0x2, 0x38,0x72,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27,0x7e,0x73,0x26,0xfa, +0x12,0x1f,0xf4,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26,0xfd,0xa, 0x27,0x7e, +0x73,0x26,0xfb,0x12,0x1f,0xf4,0xbe,0x34,0x0, 0x5, 0x58,0x2, 0x80,0x5a,0x6c,0xff, +0x80,0x3c,0x7c,0xbf,0x12,0x8f,0xdc,0x1a,0x4b,0x7c,0xbf,0x12,0x71,0x7e,0x7d,0xc3, +0xbe,0xc4,0x3, 0xe8,0x58,0x4, 0x7e,0xd4,0x0, 0x8, 0x7d,0x5d,0x3e,0x54,0xbd,0x54, +0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d,0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, +0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75,0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x73, +0x1a,0x38,0xbf,0x80,0x6, 0xe5,0x1e,0x24,0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, +0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, 0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22, +0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0x74,0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x30, +0x10,0x13,0x12,0x76,0x4d,0x68,0x6, 0x7e,0xb3,0x39,0x6, 0x60,0x8, 0x7e,0x34,0xb, +0xb8,0x7a,0x37,0x38,0x9, 0x22,0x7e,0x73,0x28,0x84,0xbc,0x78,0x22,0x9, 0x75,0x26, +0xfb,0x7a,0x71,0x24,0x22,0x7e,0xb3,0x37,0x2e,0xbe,0xb0,0x1, 0x22,0x7d,0x13,0x7d, +0x32,0x6d,0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x15,0x75,0x7d, +0x53,0xbe,0x54,0x0, 0xff,0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0xca,0xf8,0x7e,0xf3, +0x2a,0x8f,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a, +0xb3,0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x8e,0x7a,0x73,0x1f,0x36,0x7a, +0xf3,0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12, +0x78,0x71,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33, +0x1f,0x36,0x6d,0x0, 0x12,0x15,0x77,0xa, 0x1f,0x6d,0x0, 0x12,0x15,0x77,0xda,0xf8, +0x22,0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15, +0xa8,0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a, +0x8e,0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x8f,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a, +0x7b,0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x7d,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a, +0x7f,0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e, +0x8, 0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27, +0x1f,0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12, +0x47,0xd9,0x7e,0x1f,0x38,0xef,0x7a,0x1d,0x27,0x7e,0xb3,0x2a,0x93,0xf5,0x2e,0x7e, +0xb3,0x38,0x8e,0xb4,0x1, 0x6, 0x7e,0x38,0x38,0x90,0x80,0x4, 0x7e,0x38,0x5, 0xf8, +0x6d,0x33,0x7a,0x35,0x2b,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x8f,0x70,0xe, +0x7e,0xb3,0x38,0x8d,0x70,0x8, 0x74,0x1, 0x7a,0xb3,0x38,0x8f,0x21,0x9e,0x7e,0xb3, +0x38,0x8f,0x70,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x8f,0x7e,0xb3,0x38,0x8e,0xb4,0x1, +0x14,0x75,0x2d,0x0, 0x80,0x6, 0x12,0x79,0xe0,0x12,0x79,0xee,0xe5,0x2e,0xbe,0xb1, +0x2d,0x38,0xf3,0x80,0x18,0x75,0x2d,0x0, 0x80,0xc, 0x12,0x79,0xe0,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x79,0xee,0xe5,0x2e,0xbe,0xb1,0x2d,0x38,0xed,0x7e,0x34,0x1, +0x18,0x7a,0x35,0x2f,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0x79,0xff,0x75,0x2d,0x0, +0x80,0x10,0x12,0x79,0xd3,0xbe,0x35,0x2b,0x8, 0x6, 0x12,0x79,0xd3,0x7a,0x35,0x2b, +0x5, 0x2d,0xe5,0x2e,0xbe,0xb1,0x2d,0x38,0xe9,0x12,0x79,0xcb,0x40,0x25,0x7e,0xb3, +0x38,0x8e,0xb4,0x1, 0x1e,0x5, 0x1c,0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c, +0x0, 0xe5,0x2e,0xa, 0x3b,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x27,0x7f,0x3, 0x12,0x17, +0x29,0x1b,0xfd,0x74,0x2, 0x12,0x0, 0x1e,0x12,0x79,0xcb,0x50,0xb, 0x74,0x2, 0x7a, +0xb3,0x38,0xee,0xe4,0x7a,0xb3,0x38,0x8f,0xda,0x3b,0x22,0x7e,0x37,0x2b,0x26,0xbe, +0x35,0x2b,0x22,0x7e,0xa1,0x2d,0x74,0x2, 0xa4,0x49,0x35,0x1f,0x34,0x2, 0x17,0x80, +0x7e,0xa1,0x2d,0x74,0x2, 0xa4,0x7f,0x13,0x2d,0x35,0xb, 0x1a,0x20,0x22,0x7e,0xd, +0x27,0x2d,0x15,0xb, 0xa, 0x30,0x9d,0x32,0x59,0x35,0x1f,0x34,0x5, 0x2d,0x22,0xca, +0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x8d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f, +0x16,0x7f,0x5, 0x12,0x17,0x29,0x1b,0xfd,0x6c,0xdd,0x12,0x5f,0x98,0x7a,0xb3,0x1f, +0x6c,0x6c,0xcc,0x80,0x45,0x12,0x7a,0xa3,0x78,0x3e,0x12,0x5f,0xa9,0xb, 0x1a,0xe0, +0x7d,0x3f,0x12,0x17,0x80,0x7d,0x13,0x7d,0x3e,0x12,0x17,0x80,0xbd,0x31,0x58,0x2, +0x7d,0xfe,0xbe,0xe5,0x2f,0x8, 0x5, 0x7e,0xe5,0x2f,0x80,0xb, 0x6d,0x33,0x9e,0x35, +0x2f,0xbd,0x3e,0x8, 0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e, +0xb3,0x1f,0x6c,0x4, 0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x8f,0xbc,0x7c, +0x38,0xb3,0x7e,0x73,0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0x7a,0xc9,0x8, 0x2, 0x7d, +0x7f,0x6c,0xcc,0x80,0xa, 0x12,0x7a,0xa3,0x78,0x3, 0x12,0x7a,0xb4,0xb, 0xc0,0x7e, +0x73,0x2a,0x8f,0xbc,0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0x41,0x1a, +0xda,0x3b,0x22,0xa, 0xec,0x9, 0x7e,0x2a,0xfb,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, +0xed,0xbd,0x3e,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x9d, +0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d,0x0, 0x7f,0x14,0x12, +0x15,0xc8,0x7d,0x73,0x12,0x17,0x80,0x7d,0xe3,0x7d,0x3f,0x12,0x17,0x80,0xbd,0x3e, +0x22,0x74,0xc8,0x7a,0xb3,0x39,0x1, 0xc2,0x17,0x80,0xa, 0x12,0x3e,0xbb,0x30,0x17, +0x4, 0x75,0xe9,0xff,0x22,0x12,0x7b,0x3d,0x68,0xf1,0x22,0x74,0x1, 0x12,0x7b,0x1a, +0x20,0x17,0x6, 0x12,0x7b,0x23,0x12,0x3f,0xe3,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, +0x12,0x7a,0xe1,0x12,0x3f,0xe3,0xe4,0x2, 0x7b,0x1a,0xbe,0xb0,0x8, 0x50,0x3, 0x12, +0x7b,0x4e,0x22,0xd2,0x3, 0x80,0x12,0x30,0x3, 0xc, 0x12,0x7b,0x3d,0x68,0x7, 0xc2, +0x3, 0xc2,0x4, 0x12,0x3d,0xa, 0x12,0x3e,0xbb,0x30,0x17,0xeb,0x22,0x7e,0xb3,0x34, +0x3a,0xbe,0xb0,0x1, 0x22,0x12,0x7b,0x3d,0x68,0xfb,0x20,0x93,0xfd,0x22,0xa, 0x5b, +0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x3f,0x33,0x7e,0x73,0x36,0xdd,0xbe,0x70, +0xff,0x68,0x13,0xbe,0x73,0x37,0x3, 0x68,0xd, 0x7a,0x73,0x37,0x3, 0x74,0xff,0x7a, +0xb3,0x36,0xdd,0x2, 0x3f,0x33,0x22,0x7e,0xb3,0x37,0x3, 0x70,0x2e,0x7e,0x73,0x36, +0xe6,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x2e,0xb4,0x1, 0x3, 0x7e, +0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x7b,0xcc,0x7c,0xab,0xe5,0x60,0xa, +0x3b,0x2e,0x37,0x38,0x8b,0x7a,0x37,0x38,0x8b,0x80,0xc, 0x7e,0xa3,0x36,0xe7,0xbe, +0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x7b,0xbc,0x75,0x60,0x0, 0x7a, +0xb3,0x39,0x1, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x17,0x70,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x22,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b,0x68,0x4f,0x12, +0x7c,0x33,0x7c,0x3b,0x7c,0xb2,0x12,0x7c,0x33,0x7c,0xab,0xbe,0x30,0xff,0x68,0x3e, +0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12,0x7b,0xc6,0xbe, +0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e,0x34,0x16,0x93, +0x6d,0x22,0x30,0x16,0x3, 0x2, 0x7c,0xdf,0x7e,0xb3,0x2b,0x3c,0xb4,0x1, 0xf, 0x12, +0x5f,0xdf,0x7a,0x55,0x29,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x7d,0x10,0x22,0x7e, +0xb3,0x2b,0x2e,0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, 0x62,0x26,0x33, +0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40,0xe9,0x74,0xff, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0x2e,0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x81,0x12, +0x7c,0x33,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0x7e,0x58,0xf5,0x29, +0x7e,0x73,0x2b,0x2e,0xbe,0x71,0x29,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x7b,0xc6,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2a,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x52,0x6d,0x22,0x7a,0x1f,0x37,0x4e,0x7c,0xbc,0x12,0x7d,0x65,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x81,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x81,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x4d,0xc0,0xda,0x3b,0x22, +0x7c,0xab,0x12,0x7f,0x45,0xd2,0x16,0x7c,0xba,0x12,0x7b,0xd5,0xc2,0x16,0x22,0x7c, +0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b,0x7e,0x63,0x2a,0x90,0xa, 0x6, 0x2d,0x1, +0x7e,0x63,0x2a,0x8d,0xa, 0x16,0xad,0x10,0x7d,0x21,0x12,0x5f,0xbb,0xa, 0x26,0x7a, +0x25,0x29,0x74,0x1d,0xac,0x7b,0x2e,0x34,0x37,0x52,0x6d,0x22,0xe4,0x2, 0x7d,0x10, +0x7c,0xab,0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x7d,0x53,0x60,0x5, 0x3e, +0xe4,0x14,0x78,0xfb,0x12,0x7d,0x47,0x2d,0xfe,0x80,0xf, 0x12,0x7d,0x53,0x60,0x5, +0x3e,0xe4,0x14,0x78,0xfb,0x12,0x7d,0x47,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e, +0xf5,0x29,0xbd,0xf4,0x38,0xd0,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, +0x6a,0xf0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61,0x2e,0xd5, +0x29,0x7e,0x6b,0xb0,0x22,0xca,0x3b,0x7a,0xd, 0x2e,0x7c,0xcb,0x7e,0xb3,0x2b,0x3c, +0xf5,0x32,0x7e,0xb3,0x2b,0x2e,0xf5,0x33,0x7e,0xd3,0x2b,0x33,0x7e,0xe3,0x2b,0x3e, +0x7e,0xf3,0x2b,0x3f,0x7e,0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, +0x24,0xf2,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, +0x72,0x7e,0x8, 0x25,0x2a,0x12,0x17,0x29,0x1b,0xfd,0x7c,0xbc,0x12,0x4f,0xfd,0x74, +0x1, 0x7a,0xb3,0x2b,0x3c,0x74,0x5, 0xac,0xbc,0x12,0x4f,0x72,0x74,0x5, 0xac,0xbc, +0x12,0x4f,0x60,0x74,0x5, 0xac,0xbc,0x12,0x4f,0x69,0x74,0x5, 0xac,0xbc,0x9, 0x75, +0x26,0x37,0xbe,0x73,0x2b,0x81,0x68,0x6, 0x7a,0x73,0x2b,0x81,0xd2,0xc, 0xc2,0x3, +0x12,0x7e,0x58,0x12,0x4d,0xc0,0x12,0x44,0xfd,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x14,0x40,0x0, 0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, +0xc8,0x12,0x5b,0x7c,0x12,0x5f,0xdf,0x7a,0x55,0x34,0x7e,0xd, 0x2e,0x7e,0x18,0xd, +0xc8,0x12,0x7e,0xb0,0x12,0x7e,0x61,0xe5,0x32,0x7a,0xb3,0x2b,0x3c,0xe5,0x33,0x7a, +0xb3,0x2b,0x2e,0x7a,0xd3,0x2b,0x33,0x7a,0xe3,0x2b,0x3e,0x7a,0xf3,0x2b,0x3f,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x17,0x29, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x72, +0x12,0x17,0x29,0x1b,0xfd,0xda,0x3b,0x22,0x74,0x5, 0xac,0xbc,0x9, 0xb5,0x26,0x33, +0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, 0x7e,0x73,0x2a,0x90,0xa, 0x17,0x2d,0x10, +0x7e,0xa3,0x2a,0x8d,0xa, 0x3a,0xad,0x13,0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, +0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x33,0xf8,0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, +0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, 0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3, +0x38,0xdc,0x7a,0x35,0x34,0x7e,0xf, 0x37,0x4e,0x7e,0x18,0x25,0xb6,0x2, 0x7e,0xb0, +0xca,0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x7f,0xc2,0x3, 0x6d,0x44,0x80, +0x1e,0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x12,0x7f,0x3f,0xbd,0x3d,0x48,0xd, +0x7d,0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0x7f,0x3f,0x7d,0xd3,0xb, 0x44,0x7e, +0xc5,0x34,0xbd,0xc4,0x38,0xdb,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c, +0xba,0x7d,0x3d,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8, +0x7f,0x10,0x2e,0x35,0x34,0x7a,0x1b,0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54, +0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x7f,0x60,0x2e,0xd5,0x34,0x7e,0x6b,0xb0,0x60, +0x5, 0xe, 0x34,0x14,0x78,0xfb,0x7c,0xb7,0x12,0x7f,0x88,0xb, 0x44,0x7e,0x55,0x34, +0xbd,0x54,0x38,0xd8,0xda,0xf8,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, +0x1a,0x30,0x2, 0x17,0x80,0xa9,0xd1,0xcb,0x74,0x1, 0x2, 0x0, 0xe, 0x12,0x7f,0x45, +0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x8c,0x12,0x7f,0x90,0x12,0x7f,0x69,0x7a,0x37, +0x33,0xf5,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x6d,0x33,0x90,0x60,0x91,0xe4,0x93, +0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xa2,0x30,0x90,0x60,0x92,0xe4,0x93,0xbe,0xb0,0x0, +0x28,0x3, 0x2, 0xa1,0x97,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xb0,0x22, +0x7a,0xb3,0x24,0xf2,0x7e,0x53,0x2a,0x8d,0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa, +0xe4,0x7a,0xb3,0x24,0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24, +0xf6,0x7e,0x34,0x0, 0x20,0x12,0x5f,0xb2,0x2, 0xd, 0x7, 0x7e,0xb3,0x38,0x8e,0x70, +0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x7a,0xb3,0x38,0x8e,0x22,0x7f,0x20,0xc2,0x4, 0x7e, +0x2b,0x60,0x29,0x72,0x0, 0x2, 0x9c,0x76,0x1a,0x37,0x12,0x17,0x80,0x7c,0x27,0x29, +0x72,0x0, 0x1, 0x29,0x32,0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x17,0x80,0x7c,0x37, +0x1a,0x23,0x1a,0x32,0x9d,0x32,0x12,0x17,0x80,0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58, +0x2, 0x7c,0x73,0xbe,0x60,0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x38, +0x1, 0x4d,0x33,0x68,0x2, 0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, +0xca,0x3b,0x7f,0x70,0x7c,0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x8c,0xf5, +0x26,0x7e,0xb3,0x2a,0x8d,0xf5,0x25,0x7e,0xd4,0x0, 0xc8,0x6c,0xff,0x12,0x2e,0xc4, +0xe5,0x26,0xa, 0x1b,0x1b,0x14,0xa, 0xcd,0xbd,0xc1,0x58,0x14,0xe5,0x25,0xa, 0x1b, +0x1b,0x14,0xa, 0xce,0xbd,0xc1,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x1a,0xc0,0xbe,0xc4,0x0, 0xc8,0x8, 0xc, 0x7e,0x17,0x28,0x8a, +0xbe,0x14,0x3, 0x20,0x8, 0x2, 0x21,0x64,0xbe,0xc4,0x0, 0x64,0x8, 0xc, 0x7e,0xc7, +0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x21,0x64,0x6c,0xaa,0x7c,0x8d,0x80,0x1c, +0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8c,0xbc,0xb8,0x8, 0x9, 0x12, +0x81,0x9b,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x80,0x1a,0x2c,0x1a,0x3d, +0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x1, 0x21, +0x64,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3, +0x2a,0x8c,0xbc,0xb8,0x8, 0x9, 0x12,0x81,0x9b,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, +0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a,0xc8,0xbd,0xc3,0x48,0xd8,0xbc, +0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d, +0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8d,0xbc,0xb9,0x8, 0x9, 0x12,0x81,0x9b, +0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90,0x1a,0x2c,0x1a,0x3e,0x9d,0x32, +0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x4, 0x80,0x35,0x6c, +0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8d, +0xbc,0xb9,0x8, 0x9, 0x12,0x81,0x9b,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, +0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18, +0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b,0xb0,0xbc,0xbd,0x40,0x3, 0x7a, +0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, 0x39,0xd7,0x0, 0x2, 0x29,0xb7, +0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, 0x29,0xb7,0x0, 0x3, 0xbc,0xbe, +0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b,0x22,0x7c,0xb8,0x7c,0x79,0x12, +0x1e,0x80,0xbd,0x3d,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f,0x40,0x6d,0xbb,0x7e, +0xa3,0x2a,0x8c,0x7e,0x73,0x2a,0x8d,0x4c,0xcc,0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, +0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c,0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78, +0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14,0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b, +0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12,0x17,0x4e,0x7e,0x73,0x2a,0x8c,0xa, +0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a,0x8d,0xa, 0x37,0x1b,0x34,0x39,0x74, +0x0, 0x1, 0x7c,0xec,0x80,0x1d,0x75,0x24,0x0, 0x7c,0xdf,0x80,0xb, 0x12,0x80,0x1a, +0x70,0xb, 0x5, 0x24,0xb, 0xb4,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf0,0xe5,0x24,0x60, +0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xde,0x7c,0xec,0x80,0x26,0x75,0x24,0x0, 0x1a, +0xaf,0xb, 0xa4,0x7d,0x3a,0x7c,0xd7,0x80,0xb, 0x12,0x80,0x1a,0x70,0xe, 0x5, 0x24, +0xb, 0xb4,0xb, 0xd0,0x7e,0x73,0x2a,0x8c,0xbc,0x7d,0x18,0xed,0xe5,0x24,0x60,0x7, +0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd5,0x12,0x82,0xbb,0x80,0x1d,0x75,0x24,0x0, 0x7c, +0xdf,0x80,0xb, 0x12,0x80,0x1a,0x70,0xb, 0x5, 0x24,0xb, 0xb4,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf0,0xe5,0x24,0x60,0xa, 0xb, 0xe0,0x7e,0x73,0x2a,0x8d,0xbc,0x7e,0x18, +0xdb,0x12,0x82,0xbb,0x80,0x22,0x75,0x24,0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xb, 0x12, +0x80,0x1a,0x70,0xe, 0x5, 0x24,0xb, 0xb4,0xb, 0xd0,0x7e,0x73,0x2a,0x8c,0xbc,0x7d, +0x18,0xed,0xe5,0x24,0x60,0xa, 0xb, 0xe0,0x7e,0x73,0x2a,0x8d,0xbc,0x7e,0x18,0xd6, +0x7d,0x3b,0x39,0x74,0x0, 0x5, 0x7d,0x3b,0xda,0x3b,0x22,0x1a,0xac,0xb, 0xa4,0x7d, +0x3a,0x7c,0xe7,0x22,0x7f,0x60,0x7e,0x6b,0xa0,0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14, +0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, 0x2d,0x15,0xb, 0x14,0x12,0x17,0x29, +0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0,0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x8d, +0x7e,0x73,0x2a,0x8c,0xac,0x76,0x7d,0x13,0x1e,0x14,0x7e,0x27,0x28,0x88,0x2e,0x27, +0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e,0x34,0xbe,0x37,0x28,0x86,0x50,0x29, +0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd, +0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e,0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6, +0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, 0x7c,0xba,0x22,0x7f,0x61,0x7f,0x50, +0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f,0x5, 0x7c,0xb9,0x7c, +0x78,0x12,0x76,0xd8,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76,0x0, 0x3, 0xbc,0x78, +0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9,0xc3,0x22,0x7e,0xa3, +0x2a,0x21,0xbe,0xa0,0x0, 0x38,0x2f,0xbe,0xa3,0x2a,0x20,0x50,0x19,0x7e,0xb3,0x2a, +0x2a,0xbe,0xb3,0x35,0x3c,0x28,0x14,0x7e,0xb3,0x35,0x3c,0x4, 0x7a,0xb3,0x35,0x3c, +0x7a,0xa3,0x2a,0x20,0x80,0x5, 0xe4,0x7a,0xb3,0x35,0x3c,0x7e,0xb3,0x2a,0x20,0x70, +0x5, 0xe4,0x7a,0xb3,0x2a,0x29,0x22,0x12,0x83,0xad,0x2, 0x83,0x6e,0x7e,0xb3,0x2a, +0x20,0x70,0x2d,0x7e,0x73,0x2a,0x21,0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc1, +0x70,0x18,0x12,0x83,0xea,0x7e,0x73,0x2a,0x21,0x7a,0x73,0x2a,0x20,0x74,0x1, 0x7a, +0xb3,0x2a,0x27,0x7e,0xb3,0x34,0xc1,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc1,0x22, +0xe4,0x7a,0xb3,0x34,0xc1,0x7a,0xb3,0x2a,0x27,0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39, +0x7e,0x18,0x35,0xe5,0x7e,0x8, 0x36,0x21,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x73,0x28, +0x94,0x7a,0x73,0x35,0xe4,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7e,0xe3,0x2a,0x20, +0x4c,0xee,0x78,0x20,0x6c,0xff,0x6d,0x11,0x74,0x2, 0xac,0xbf,0x12,0x85,0xb1,0xac, +0x3f,0x19,0xa1,0x34,0xc6,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x35,0x30,0xb, 0xf0,0xbe, +0xf0,0xa, 0x78,0xe2,0x12,0x86,0x15,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e, +0x44,0x3, 0x20,0x6c,0xff,0xa1,0x83,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e, +0xd0,0xf, 0xbe,0xd0,0xa, 0x40,0x2, 0xa1,0x81,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe, +0xb0,0x1, 0x78,0x2, 0xa1,0x6a,0x75,0x24,0x0, 0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xc6,0xbc,0xcd,0x68,0x2, 0xa1,0x5d,0x49,0x25,0x34,0xc4,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x17,0x80,0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc2,0x74,0x9, 0xac,0xbf,0x12,0x86,0xcb,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x30,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x1c,0xa, 0x1c,0x2e,0x14,0x35,0x30,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x81,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x1c,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x63,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x15,0xfc,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x87,0x78,0xac,0x3f,0x12,0x85,0xa8,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x85,0xa8,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x1c,0x80,0x24,0x5, 0x24,0xe5, +0x24,0xbe,0xb0,0xa, 0x50,0x2, 0x81,0x69,0x80,0x17,0x6d,0x11,0x74,0x2, 0xac,0xbd, +0x12,0x85,0xb1,0xac,0x3d,0x19,0xa1,0x34,0xc6,0x74,0x2, 0xa, 0x1d,0x19,0xb1,0x35, +0x30,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x47,0xe4,0x7a,0xb3,0x16,0x92,0x7e,0x34, +0x0, 0x5a,0xca,0x39,0x7e,0x18,0x28,0xae,0x7e,0x8, 0x34,0xc2,0x12,0x17,0x29,0x1b, +0xfd,0x7a,0xe3,0x2a,0x20,0xda,0x3b,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x15, +0xfc,0x59,0x15,0x35,0x1c,0x7e,0xa0,0xff,0x7e,0x30,0x9, 0x22,0x7e,0xb3,0x37,0x2e, +0x70,0x3, 0x12,0x84,0xa, 0x2, 0x85,0xc8,0xca,0x79,0x7e,0xf3,0x2a,0x20,0x7e,0xe3, +0x2a,0x21,0x7c,0xbf,0x7c,0x7e,0x12,0x26,0xfc,0x7c,0xbf,0x12,0x86,0xd4,0x4c,0xee, +0x78,0x15,0x7e,0x34,0x0, 0x5a,0xca,0x39,0x7e,0x18,0x28,0xae,0x7e,0x8, 0x29,0x62, +0x12,0x17,0x29,0x1b,0xfd,0x80,0xb, 0x7e,0xb3,0x2a,0x27,0x70,0x5, 0x7c,0xbf,0x12, +0x86,0x4d,0x7c,0xbf,0x12,0x88,0xcd,0xbe,0xf0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3, +0x2a,0x29,0xda,0x79,0x22,0x7e,0x73,0x2a,0x21,0xbe,0x73,0x2a,0x20,0x78,0x13,0x12, +0x87,0x88,0x40,0xe, 0x7e,0x37,0x34,0x9e,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34, +0x80,0x6, 0x7e,0x37,0x34,0x9e,0x1e,0x34,0x7a,0x37,0x34,0x9e,0x7e,0xb3,0x2a,0x20, +0x70,0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9e,0x7e,0x37,0x34,0x9e,0x22,0xca,0x3b,0x7c, +0xfb,0x6c,0xee,0x80,0x6f,0x6c,0xdd,0x74,0x9, 0xac,0xbd,0x9, 0x45,0x29,0x66,0x7e, +0x70,0x9, 0xac,0x7e,0x9, 0x53,0x28,0xb2,0xbc,0x45,0x68,0x7, 0xb, 0xd0,0xbe,0xd0, +0xa, 0x40,0xe4,0xbe,0xd0,0xa, 0x50,0x50,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66, +0x49,0x25,0x29,0x64,0x49,0x33,0x28,0xb0,0x12,0x87,0x80,0x74,0x9, 0xac,0xbd,0x49, +0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x12,0x86,0xcb,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8a,0x59,0x35,0x34,0xad,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x5f,0xfa,0xb, 0xe0,0xbc,0xfe,0x38,0x8d,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x17,0x80,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x7e,0xf0,0xa, 0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x87,0x6e,0x7c,0x7d, +0x7c,0x6f,0x12,0x87,0x6e,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x87,0x78,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x15,0xfc,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x17,0x29,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0x8, +0x1f,0x34,0x12,0x87,0xcb,0x7c,0x1b,0x22,0x2e,0x34,0x28,0xae,0x7e,0x30,0x9, 0x22, +0x9d,0x32,0x12,0x17,0x80,0x7d,0x13,0x22,0x7e,0x73,0x2a,0x20,0xbe,0x70,0x1, 0x22, +0x7e,0xb3,0x2a,0x27,0x70,0x23,0x7e,0xb3,0x34,0xa0,0xb4,0x2, 0x9, 0x12,0x87,0x88, +0x28,0x4, 0x74,0x3, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xab,0x7e,0x73,0x34,0xac,0xbe, +0x73,0x34,0xab,0x28,0x4, 0x7a,0x73,0x34,0xab,0x22,0x12,0x89,0x1e,0x2, 0x87,0x90, +0x12,0x2f,0x98,0x12,0x1e,0x87,0x7a,0xb3,0x2a,0x2a,0x22,0xca,0x3b,0x7c,0x46,0x7c, +0xab,0x6c,0x66,0x7c,0x57,0x2, 0x88,0x5d,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29, +0x66,0x7c,0x98,0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b, +0xbe,0x90,0xff,0x68,0x66,0x12,0x88,0x73,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf, +0x29,0xbc,0x7e,0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d, +0x88,0x80,0xa, 0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0, +0x12,0x88,0x73,0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f, +0x60,0x2d,0xd7,0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3, +0x12,0x88,0x73,0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4, +0x12,0x88,0x73,0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x9, 0xb, 0x50,0xbc,0x45,0x28, +0x3, 0x2, 0x87,0xd8,0xb, 0x60,0xbe,0x60,0xa, 0x50,0x3, 0x2, 0x87,0xd3,0x7c,0xba, +0xda,0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0xca,0xf8,0x7c, +0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x81,0xbd,0x13,0x38,0x6, 0x7e,0x34,0x1, 0x0, 0x80, +0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x15,0x75,0xbe,0x34,0x0, 0x10, +0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34,0xad,0xbd,0x2f, +0x28,0x6, 0x49,0x35,0x34,0x8a,0x80,0x4, 0x59,0x35,0x34,0x8a,0x59,0xf5,0x34,0xad, +0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22,0x6c,0xaa,0x7e, +0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x4f,0xeb,0x59,0x32,0x28,0xae,0x7e, +0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x4f,0xeb,0x59,0x32,0x28,0xb0,0x7e, +0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28,0xb2,0x7e,0x90,0x9, 0xac, +0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4, +0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xb2,0x22,0xca,0x79, +0x7e,0x13,0x2a,0x20,0x7e,0x78,0x29,0xbc,0x12,0x8a,0x65,0xe4,0x33,0x7c,0xb, 0x4c, +0x0, 0x68,0x8, 0x7e,0x30,0xf, 0x7e,0xa0,0x2, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0, +0x1, 0xa5,0xb9,0x0, 0x5, 0x12,0x1a,0x9a,0x41,0x4e,0xbc,0x20,0x50,0x3, 0x12,0x1a, +0x9a,0x6c,0x0, 0x7e,0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78, +0x2, 0x41,0x44,0xa, 0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68, +0x2, 0x41,0x27,0x12,0x8a,0x5b,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x17,0x80,0x7d, +0xd3,0x7e,0x70,0x4, 0xac,0x79,0x49,0x23,0x35,0x3f,0x12,0x8a,0x51,0x9d,0x32,0x12, +0x17,0x80,0x7d,0xc3,0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c, +0x28,0x4f,0x12,0x8a,0x5b,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50, +0x4, 0xac,0x59,0x49,0x22,0x35,0x3f,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, +0xbe,0x10,0x0, 0x28,0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, +0x7a,0xb3,0x34,0x89,0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3, +0x34,0x89,0x7e,0xb3,0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80, +0x53,0x7e,0x50,0x9, 0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59, +0xb7,0x35,0x3d,0x49,0x22,0x29,0xa, 0x59,0x27,0x35,0x3f,0xbc,0x73,0x28,0x6, 0x7a, +0xa3,0x34,0x88,0x80,0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88, +0xe4,0x7a,0xb3,0x34,0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70, +0x49,0x33,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x3d,0x12,0x8a,0x51, +0x59,0x32,0x35,0x3f,0xb, 0x0, 0xa5,0xb8,0xa, 0x2, 0x80,0x2, 0x21,0x53,0xda,0x79, +0x22,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59, +0x49,0x22,0x35,0x3d,0x22,0xa2,0x8, 0x22,0x7e,0x8, 0x34,0xa0,0x7e,0x34,0x0, 0xd, +0xe4,0x2, 0x17,0x4e,0x7e,0x8, 0x34,0xad,0x7e,0x34,0x0, 0x14,0xe4,0x12,0x17,0x4e, +0x7e,0x8, 0x34,0x8a,0x7e,0x34,0x0, 0x14,0x2, 0x17,0x4e,0x12,0x8e,0xd7,0x12,0x8d, +0x14,0x12,0x8b,0xfe,0x12,0x8b,0x47,0x2, 0x8a,0x9a,0xca,0x3b,0x12,0x1e,0x38,0x7e, +0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xde,0x60,0x9, 0xe4,0x7a,0xb3,0x35,0xe0, +0x7a,0xb3,0x35,0x65,0x7e,0xb3,0x35,0xde,0x70,0x62,0x6c,0x99,0x80,0x56,0x74,0x2, +0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x8c,0xa2,0x40, +0x41,0x6c,0xee,0x80,0x35,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x66,0x9, 0xc5,0x35, +0x67,0xa, 0x28,0xa, 0x3d,0x12,0x8b,0x3f,0x78,0x1e,0xa, 0x2f,0xa, 0x3c,0x12,0x8b, +0x3f,0x78,0x15,0x7c,0xb9,0x12,0x71,0x7e,0xbe,0x34,0x3, 0x20,0x58,0xa, 0x12,0x8d, +0xc2,0x7c,0xb8,0x7c,0x7f,0x12,0x8b,0xe3,0xb, 0xe0,0x7e,0x73,0x35,0xe0,0xbc,0x7e, +0x38,0xc3,0xb, 0x90,0x7e,0x73,0x28,0x84,0xbc,0x79,0x38,0xa2,0x7e,0x73,0x35,0x65, +0x7a,0x73,0x35,0xe0,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x35,0xa2,0x7e,0x8, +0x35,0x66,0x12,0x17,0x29,0x1b,0xfd,0xe4,0x7a,0xb3,0x35,0xde,0xda,0x3b,0x22,0x9d, +0x32,0x12,0x17,0x80,0x4d,0x33,0x22,0xca,0xd8,0xca,0x79,0x7e,0xf4,0x3, 0x20,0x7d, +0x7f,0x12,0x8e,0xee,0x50,0x2, 0x61,0xde,0x7a,0xf5,0x2a,0x7e,0xb3,0x28,0xa8,0xb4, +0x1, 0x4, 0x7e,0x74,0x4, 0xb0,0x7e,0x37,0x28,0x8a,0xbe,0x34,0x4, 0x4c,0x8, 0x6e, +0x6c,0xdd,0x80,0x62,0xc2,0x3, 0x7c,0xbd,0x12,0x71,0x7e,0x7a,0x35,0x26,0x7c,0xbd, +0x7e,0x70,0x1, 0x12,0x8f,0x11,0x7a,0x35,0x24,0x9e,0x35,0x26,0x7a,0x35,0x24,0x7e, +0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8d,0xd, 0x7a,0x35,0x28,0xbe,0x75,0x28,0x58, +0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, 0xa, 0x7e,0x35,0x2a,0xbe, +0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x8c,0xa2,0x50,0x2, 0xc2,0x3, 0x30, +0x3, 0x12,0x7c,0xbd,0x6c,0x77,0x12,0x2f,0x4c,0x7e,0x70,0x2, 0xac,0x7d,0x12,0x8c, +0x99,0x12,0x8b,0xe3,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x96,0xda,0x79, +0xda,0xd8,0x22,0x7c,0x6b,0x7e,0xa3,0x35,0x65,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x62, +0x35,0xa2,0x19,0x72,0x35,0xa3,0x7c,0xba,0x4, 0x7a,0xb3,0x35,0x65,0x22,0xca,0x3b, +0x7e,0xb3,0x2a,0x93,0xf5,0x27,0x12,0x76,0x4a,0x50,0x2, 0x81,0x8e,0x6d,0x33,0x9e, +0x37,0x2a,0x6e,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x73,0x7e,0xb3,0x16,0x92,0x70, +0x6d,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x77,0x2a,0x70,0x7e,0x67,0x2a,0x72, +0x75,0x24,0x0, 0x80,0x51,0xe5,0x24,0x12,0x1f,0xd4,0x60,0x48,0x12,0x8c,0x91,0x12, +0x8e,0xca,0x7e,0xb3,0x2a,0x21,0xb4,0x1, 0x9, 0xe5,0x26,0xb4,0x17,0x4, 0xe, 0x64, +0xe, 0x74,0x7e,0xa1,0x26,0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0x14, +0xe5,0x25,0xa, 0x2b,0xe5,0x27,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33,0x4, 0xfc, +0xbd,0x37,0x58,0x10,0xe5,0x24,0x6c,0x77,0x12,0x2f,0x4c,0x12,0x8c,0x91,0x12,0x8c, +0x99,0x12,0x8b,0xe3,0x5, 0x24,0x12,0x8e,0xc2,0x38,0xaa,0x12,0x8c,0xc4,0xda,0x3b, +0x22,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x22,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26, +0xfb,0x22,0x7c,0x4b,0x74,0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb, +0x7e,0x73,0x28,0x8c,0xbc,0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, +0xd3,0x22,0xc3,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x6e,0x12,0x8d,0xc9,0x28,0x35, +0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8d,0xd, 0xbe,0x37,0x7, +0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x21,0x70,0x17,0x7e,0xb3, +0x37,0x5, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28,0x5, +0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0x24,0x0, +0x2, 0x2, 0x15,0x29,0xca,0x3b,0x7e,0x93,0x2a,0x93,0x7e,0x37,0x28,0x8a,0xbe,0x34, +0x2, 0xbc,0x58,0x2, 0xa1,0xb8,0x6c,0x88,0xa1,0xb1,0x6c,0xff,0x6c,0xee,0x74,0x2, +0xac,0xb8,0x9, 0xd5,0x26,0xfa,0x12,0x77,0xed,0x7c,0xbd,0x12,0x1e,0x80,0xbe,0x34, +0x0, 0xfa,0x18,0x6b,0x7e,0xa1,0x24,0x74,0x2, 0xa4,0x49,0x55,0x4, 0xfc,0xbe,0x54, +0x1, 0xc2,0x18,0x5b,0xbe,0xd0,0x3, 0x38,0x5f,0x6c,0xcc,0x80,0xd, 0x12,0x8d,0xbb, +0xbe,0x34,0x2, 0xbc,0x8, 0x2, 0xb, 0xf0,0xb, 0xc0,0xbc,0x9c,0x38,0xef,0x6c,0xcc, +0x80,0x24,0xbc,0x8c,0x68,0x1e,0x74,0x2, 0xac,0xbc,0x9, 0x75,0x26,0xfa,0xa, 0x37, +0x7d,0x13,0xb, 0x14,0xa, 0x2d,0xbd,0x12,0x48,0xa, 0xa, 0x5d,0xb, 0x54,0xbd,0x35, +0x18,0x2, 0xb, 0xe0,0xb, 0xc0,0x7e,0x73,0x28,0x84,0xbc,0x7c,0x38,0xd4,0xbe,0xf0, +0x5, 0x50,0x5, 0xbe,0xe0,0x2, 0x40,0x7, 0x7c,0xb8,0x6c,0x77,0x12,0x2f,0x4c,0xb, +0x80,0x12,0x77,0xe6,0x28,0x2, 0xa1,0x2a,0xda,0x3b,0x22,0x7c,0xbd,0x7c,0x7c,0x2, +0x1e,0x80,0x7c,0xb9,0x6c,0x77,0x2, 0x2f,0x4c,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x0, +0x22,0xca,0x3b,0x12,0x8d,0xc9,0x38,0x2, 0xc1,0x98,0x7e,0xc3,0x2f,0xcc,0x4c,0xcc, +0x78,0x3d,0x7a,0xb3,0x2f,0xcc,0xe4,0x7a,0xb3,0x2f,0xce,0x6c,0xaa,0x80,0x26,0x12, +0x8e,0xa3,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a, +0x49,0xd0,0x19,0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8e,0xad,0x59, +0x34,0x0, 0x2, 0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c, +0xfc,0x6c,0xaa,0x80,0x35,0x12,0x8e,0xa3,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, +0xb4,0x0, 0x8, 0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8e,0xad,0x7d,0x23,0x49,0x34, +0x0, 0x2, 0x9d,0x32,0x12,0x17,0x80,0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74, +0x5, 0x19,0xb4,0x0, 0x8, 0x75,0x5e,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff, +0x78,0x2, 0x80,0x26,0x7e,0x73,0x2f,0xce,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80, +0xe, 0x12,0x8e,0xa3,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc, +0xfa,0x38,0xee,0xbc,0xfa,0x78,0x3, 0x75,0x5e,0x0, 0x12,0x8e,0xb4,0x80,0xf, 0x7c, +0xb7,0x4, 0x7a,0xb3,0x2f,0xce,0x80,0x6, 0x12,0x8e,0xb4,0x75,0x5e,0x0, 0xe5,0x5e, +0xda,0x3b,0x22,0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xcf,0x22,0x7c,0xbd,0x7c, +0x7e,0x2, 0x1e,0x80,0xe4,0x7a,0xb3,0x2f,0xcd,0x7a,0xb3,0x2f,0xcc,0x7a,0xb3,0x2f, +0xce,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x9, 0xb3,0x26,0xfa,0xf5,0x25, +0x9, 0xb3,0x26,0xfb,0xf5,0x26,0x22,0xe4,0x7a,0xb3,0x35,0x65,0x7e,0xb3,0x28,0x84, +0x60,0x6, 0x7e,0xb3,0x35,0xde,0x60,0x5, 0xe4,0x7a,0xb3,0x35,0xe0,0x22,0x6c,0x99, +0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x71,0x7e,0xbe,0x34,0x1, 0xf4,0x8, 0x2, 0xb, +0x90,0xb, 0x80,0x12,0x77,0xe6,0x38,0xec,0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3, +0x22,0xca,0x79,0x7c,0xa7,0x7c,0x8b,0x7e,0xb3,0x2a,0x8e,0x7a,0xb3,0x1f,0x34,0x7e, +0xb3,0x2a,0x8f,0x7a,0xb3,0x1f,0x35,0x7e,0x70,0x2, 0xac,0x78,0x9, 0x93,0x26,0xfa, +0x9, 0x83,0x26,0xfb,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0xe1,0xc9,0x7a,0xf1, +0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d,0x32, +0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a,0x2f, +0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d,0x32, +0x7c,0xb7,0xf5,0x2c,0x80,0x43,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58,0x10, +0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5,0x2e, +0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b,0x9d, +0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12,0x1e, +0x80,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5, +0x2c,0x1a,0x3b,0xbd,0x32,0x8, 0xaf,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a, +0x3f,0xbd,0x32,0x18,0x2, 0xe1,0x3e,0x7f,0x17,0xda,0x79,0x22,0xca,0xf8,0x7c,0xfb, +0x7e,0x70,0x2, 0x12,0x8f,0x11,0x7f,0x71,0x7c,0xbf,0x12,0x71,0x7e,0x7d,0x13,0x1a, +0x2, 0x1a,0x0, 0x7f,0x17,0x12,0x15,0xc8,0x7c,0xb7,0xda,0xf8,0x22,0x7e,0x63,0x2a, +0x8d,0xc2,0x12,0x6c,0x33,0x80,0x48,0x7c,0x96,0xac,0x93,0x2e,0x44,0x0, 0x16,0x7d, +0x4, 0xb, 0x4, 0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50, +0xbe,0x57,0x2a,0x79,0x8, 0x27,0x7c,0xb3,0x12,0x2e,0x9f,0x50,0x20,0x7d,0x50,0x3e, +0x54,0x7e,0x7f,0x13,0x8a,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x20,0x7d,0x54,0x3e,0x54, +0x2d,0xf5,0xb, 0x7a,0x50,0xbd,0x52,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e, +0x73,0x2a,0x94,0xbc,0x73,0x38,0xb0,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x2f,0xa, 0x22, +0x30,0x12,0x5, 0x12,0x2a,0x24,0xc2,0x12,0x22,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f, +0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x19,0x39,0x7e,0x24,0x0, 0xff,0x7e, +0x14,0x1f,0x34,0x74,0xc, 0x12,0x16,0x1d,0x6d,0x11,0x7e,0x4, 0x7f,0xff,0x6c,0xee, +0x80,0x13,0x12,0x7f,0x37,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d,0xdc,0xbd,0xc, 0x28, +0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, 0x1e,0x58,0xa, 0x7e, +0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x21,0x61,0xbe,0xd4,0x4, 0xb0,0x8, 0x2, 0xd2, +0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd,0x4d,0x58,0x6, 0x49, +0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7,0xbe,0xe0,0x3, 0x78, +0x4, 0x6d,0x33,0x80,0x7c,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, 0x7d,0xd0,0x9f,0x55, +0x6c,0xee,0x80,0xb, 0x12,0x7f,0x37,0x1a,0x26,0x1a,0x24,0x2f,0x51,0xb, 0xe0,0xbc, +0xfe,0x38,0xf1,0xa, 0x1f,0x12,0x91,0x6f,0x9f,0x55,0x6c,0xee,0x80,0x1a,0x12,0x91, +0x66,0xb, 0x1a,0x90,0x7d,0x39,0x12,0x17,0x80,0x7d,0xc3,0xbd,0x1c,0x28,0x7, 0x12, +0x91,0x79,0x2f,0x51,0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xe2,0x6d,0x11,0xbe,0xd0, +0x0, 0x28,0x5, 0xa, 0x1d,0x12,0x91,0x6f,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, +0x6d,0x0, 0x9d,0xd, 0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0xd, 0x12,0x91, +0x66,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xef,0x7d, +0x31,0xda,0x79,0xda,0xd8,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0x22,0x6d, +0x0, 0x7f,0x15,0x12,0x15,0xc8,0x7d,0x13,0x22,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x22, +0x7e,0xb3,0x2b,0x3c,0xb4,0x1, 0x31,0x12,0x5f,0x91,0x7e,0x1f,0x33,0xf8,0x7a,0x37, +0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x24,0xf6,0x12,0x5f,0xc4,0x12,0x5f,0xcd, +0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, 0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24, +0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, 0x22,0x7c,0xab,0x7c,0xb7,0xb4,0x17,0x9, +0x7c,0xba,0x12,0x2e,0x9f,0x50,0x2, 0xd3,0x22,0xc3,0x22,0x6c,0x66,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28,0x5a,0x6c,0x33,0x80, +0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x8d,0x14,0xbc,0x7b,0x78,0x3d, +0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x91,0xb9,0x50,0x1c,0xa, 0x22,0x7e, +0x73,0x2a,0x8d,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, 0xfc,0x6d,0x0, 0x9e, +0x7, 0x2a,0x6e,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e,0x73,0x2a,0x8c,0xbc, +0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xb, 0x30,0x7e, +0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0x6c,0xaa,0x7e,0x30,0x4, 0xac, +0x3a,0x7d,0xf1,0x2e,0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23, +0x38,0xf, 0x2e,0x14,0x60,0xb3,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50, +0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xd4,0x7c,0xba,0x22,0x12,0x92,0x7a,0xbe,0x34, +0x2, 0x30,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22,0x6d,0x11,0xe4,0x12,0x0, 0x1e, +0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x7f,0x38,0xef,0x2d,0xf0,0x69, +0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12,0x17,0x80,0xbd,0x31,0x28,0x16, +0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xef,0x2d,0x13,0x69,0x20,0x1, 0x0, 0x69, +0x30,0x0, 0x80,0x12,0x87,0x80,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x1f,0x38,0xef,0x2d, +0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff,0x69, +0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff,0xb, 0xa0,0x7e, +0xb3,0x2a,0x93,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22,0x7e,0xa0,0x1, 0x7e,0x47,0x7, +0xf8,0x7e,0x4, 0x1, 0x18,0xbe,0x44,0xfc,0xb8,0x58,0x12,0x7e,0xb3,0x28,0xac,0x60, +0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x38,0x7e,0xa0,0x5, 0x80,0x33,0x7e,0x34,0xff, +0xfb,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x93,0x45,0x8, 0x5, 0x7e,0xa0,0x4, 0x80, +0x1f,0x7e,0x34,0xff,0xfc,0x12,0x93,0x43,0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11,0x7e, +0x34,0xff,0xfd,0x12,0x93,0x43,0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x15,0x29,0xbd,0x34,0x22,0x6c,0x66,0x7e, +0x27,0x38,0xff,0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e,0xb3,0x28,0xac, +0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xca,0xbc,0x76,0x50,0xf, 0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x76,0x88,0x7e,0xb3,0x2f,0xca,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3, +0x2f,0xca,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xcb,0xbe,0xa0,0x5, +0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74,0x5, 0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xcb,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, 0xac,0x5a,0x49, +0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8,0x30,0x1, 0xe, +0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x93,0xa, 0x3b,0x7e,0xb3,0x2a,0x92,0xa, 0x2b,0x2d,0x23,0xa, 0x3a, +0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f,0x7e,0x63,0x2a, +0x8d,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac,0x56,0x49,0x22, +0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e,0xb3,0x2a,0x8c, +0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, 0x2, 0xc2,0x3, +0xa2,0x3, 0x22,0x7e,0x63,0x2a,0x8e,0x7e,0xa3,0x2a,0x8f,0x7e,0x70,0x1, 0x80,0x15, +0xa, 0x17,0x7e,0xb3,0x2a,0x8d,0xa, 0x2b,0x2d,0x21,0x3e,0x24,0x12,0x94,0x6e,0x58, +0x2, 0xd3,0x22,0xb, 0x70,0xa, 0x16,0x1b,0x14,0xa, 0x27,0xbd,0x21,0x48,0xe1,0x7e, +0x70,0x2, 0x80,0xe, 0x7e,0x50,0x2, 0xac,0x57,0x12,0x94,0x6e,0x58,0x2, 0xd3,0x22, +0xb, 0x70,0xa, 0x1a,0x1b,0x15,0xa, 0x27,0xbd,0x21,0x48,0xe8,0xc3,0x22,0x49,0x22, +0x4, 0xfc,0xbe,0x24,0xfe,0xe8,0x22,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x3, 0x2, 0x94, +0xce,0x7e,0xb3,0x36,0xd7,0x4, 0x7a,0xb3,0x36,0xd7,0x7e,0xb3,0x36,0x65,0xb4,0x2, +0x18,0x7e,0xb3,0x36,0xd6,0x4, 0x7a,0xb3,0x36,0xd6,0xb4,0x1, 0x6, 0x74,0x1, 0x7a, +0xb3,0x36,0xd7,0x74,0x1, 0x7a,0xb3,0x36,0x65,0x7e,0x73,0x36,0xd6,0xbe,0x70,0x3, +0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x71,0x12,0x94,0xce,0x12,0x97,0x2a,0x12,0x94, +0xd5,0x7e,0x73,0x36,0xd7,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x94,0xd5,0x22,0x74,0x2, +0x7a,0xb3,0x36,0x65,0x22,0xe4,0x7a,0xb3,0x36,0xd7,0x7a,0xb3,0x36,0xd6,0x22,0x7e, +0x73,0x36,0x65,0x7a,0x73,0x36,0xdb,0x7e,0x47,0x33,0xf5,0xbe,0x44,0x0, 0x64,0x28, +0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x65,0xbe,0x44,0x0, 0xc8,0x28,0x8, 0xe4,0x7a,0xb3, +0x36,0x63,0x12,0x94,0xce,0x7e,0x57,0x36,0x6b,0xbd,0x54,0x50,0x4, 0x7a,0x47,0x36, +0x6b,0x12,0x97,0x1, 0x38,0x10,0x12,0x96,0xf9,0x38,0xb, 0x12,0x95,0x66,0x38,0x6, +0x7e,0xb3,0x16,0x91,0x70,0x34,0x12,0x94,0x77,0xbe,0x44,0x0, 0x32,0x50,0x21,0x7e, +0xb3,0x36,0x63,0x4, 0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x32,0x28, +0x14,0x74,0x32,0x7a,0xb3,0x36,0x63,0x12,0x97,0x13,0x7a,0xb3,0x36,0xd8,0x80,0x5, +0xe4,0x7a,0xb3,0x36,0x63,0x7d,0x34,0x2, 0x97,0x82,0x2, 0x95,0x5d,0x12,0x94,0xd5, +0xe4,0x7a,0xb3,0x36,0x71,0x22,0x7e,0x73,0x26,0xf5,0xbe,0x70,0x0, 0x22,0xca,0x79, +0x7e,0xf0,0xff,0x12,0x97,0x53,0x7e,0xb3,0x36,0x67,0xb4,0x1, 0x8, 0x12,0x5d,0xe4, +0xe4,0x7a,0xb3,0x36,0x67,0x7e,0xb3,0x36,0x66,0x60,0x4, 0x74,0xff,0xc1,0x6f,0x7e, +0xb3,0x36,0x65,0xb4,0x2, 0x2, 0x80,0x2, 0xc1,0x63,0x12,0x97,0x1, 0x38,0x12,0x12, +0x96,0xf9,0x38,0xd, 0x12,0x95,0x66,0x38,0x8, 0x7e,0xb3,0x16,0x91,0x60,0x2, 0xc1, +0x63,0x74,0x3, 0x12,0x96,0x72,0x7c,0xeb,0x7e,0xb3,0x36,0x64,0x4, 0x7a,0xb3,0x36, +0x64,0x74,0x3, 0x12,0x96,0x72,0x7c,0xab,0xbe,0xa0,0xff,0x68,0x23,0xbe,0xe0,0xff, +0x68,0x1c,0x7e,0x30,0xc, 0xac,0x3e,0x49,0x21,0x36,0x7a,0xbe,0x24,0x1, 0xf4,0x28, +0xf, 0x12,0x97,0x9, 0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xea,0x80,0x2, 0x7c,0xea, +0xbe,0xe0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x64,0x7a,0xb3,0x36,0x65,0x7a,0xb3, +0x36,0x71,0x74,0xff,0x80,0x69,0x7e,0x73,0x36,0x64,0xbe,0x70,0x4, 0x28,0x54,0x74, +0xc, 0xac,0xbe,0x49,0x35,0x36,0x7a,0xbe,0x34,0x1, 0xf4,0x40,0x6, 0x7e,0xb3,0x16, +0x91,0x70,0x37,0x7e,0x37,0x36,0x60,0xbe,0x34,0x1, 0x2c,0x38,0xa, 0x7e,0x37,0x36, +0x6b,0xbe,0x34,0x1, 0x2c,0x28,0x23,0x74,0x5, 0xac,0xbe,0x9, 0x75,0x26,0x33,0xbe, +0x73,0x2b,0x2e,0x68,0x15,0x7c,0xfe,0xbe,0xf0,0x4, 0x50,0x8, 0x12,0x7c,0x2f,0xbe, +0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x67,0xe4,0x7a,0xb3,0x36,0x71,0x7a, +0xb3,0x36,0x65,0xbe,0xf0,0xff,0x68,0x5, 0xe4,0x7a,0xb3,0x36,0x64,0x7c,0xbf,0xda, +0x79,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0x96,0xeb,0x68, +0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0x97,0x1d,0x7d,0x23,0x7e,0x70,0xc, 0xac,0x72, +0x59,0x23,0x36,0x7e,0x49,0x3, 0x36,0x7e,0x49,0x23,0x36,0x7a,0xbd,0x20,0x50,0x4, +0x59,0x3, 0x36,0x7a,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22,0x80,0x18, +0x12,0x96,0xeb,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7a,0xbd,0x4, +0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37,0x36,0x60, +0xbe,0x37,0x36,0xd9,0x50,0x8, 0x7e,0x37,0x36,0xd9,0x7a,0x37,0x36,0x60,0x12,0x97, +0x9, 0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, 0xac,0x12, +0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0x2e,0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, +0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0x70,0xc, 0xac,0x7a,0x49,0x33, +0x36,0x7a,0x22,0xe4,0x7a,0xb3,0x36,0x65,0x7a,0xb3,0x36,0x6d,0x22,0x49,0x23,0x36, +0x80,0x49,0x33,0x36,0x7c,0x9d,0x32,0x2, 0x17,0x80,0xe4,0x7a,0xb3,0x36,0x63,0x6d, +0x33,0x6c,0xaa,0x7e,0x50,0xc, 0xac,0x5a,0x59,0x32,0x36,0x7a,0xb, 0xa0,0xbe,0xa0, +0x4, 0x40,0xf0,0xe4,0x7a,0xb3,0x36,0x64,0x6d,0x33,0x7a,0x37,0x36,0x6b,0x7a,0x37, +0x36,0x60,0x22,0x7e,0xb3,0x36,0x66,0xb4,0x1, 0x27,0x7e,0xb3,0x36,0xdc,0x4, 0x7a, +0xb3,0x36,0xdc,0x7e,0x73,0x36,0xdc,0xbe,0x70,0x3, 0x40,0x15,0x12,0x4f,0x84,0x7e, +0x73,0x36,0xdc,0xbe,0x70,0x6, 0x40,0x9, 0xe4,0x7a,0xb3,0x36,0xdc,0x7a,0xb3,0x36, +0x66,0x22,0xbe,0x34,0x1, 0xf4,0x28,0xd, 0x7e,0x53,0x36,0xd8,0xbe,0x50,0x8, 0x50, +0x3f,0x74,0x8, 0x80,0x37,0xbe,0x34,0x1, 0x90,0x28,0xd, 0x7e,0x53,0x36,0xd8,0xbe, +0x50,0x6, 0x50,0x2c,0x74,0x6, 0x80,0x24,0xbe,0x34,0x1, 0x2c,0x28,0xd, 0x7e,0x53, +0x36,0xd8,0xbe,0x50,0x4, 0x50,0x19,0x74,0x4, 0x80,0x11,0xbe,0x34,0x0, 0xc8,0x28, +0xf, 0x7e,0x73,0x36,0xd8,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xd8, +0x7e,0xb3,0x36,0xd8,0xbe,0xb0,0x0, 0x28,0x19,0x14,0x7a,0xb3,0x36,0xd8,0x74,0x1, +0x7a,0xb3,0x16,0x92,0x7e,0x73,0x36,0xd8,0xbe,0x70,0x4, 0x28,0x5, 0xe4,0x7a,0xb3, +0x16,0x91,0x22,0x7e,0xb3,0x2b,0x2e,0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0xc4,0x1, +0xf4,0x7e,0x73,0x37,0xdb,0xa, 0xb7,0x7e,0xb3,0x2b,0x2f,0xf5,0x34,0x75,0x35,0x4, +0xe4,0x7a,0xb3,0x36,0x6e,0xa, 0x3e,0xad,0x3b,0x7d,0xa3,0x2d,0xac,0x6c,0xdd,0x7e, +0xa3,0x36,0x6e,0xbe,0xa1,0x35,0x40,0x2, 0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74, +0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e,0x78,0xe, 0xe5,0x35,0x14,0xbe,0xb3,0x36, +0x6e,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x6e,0x7e,0xc3,0x36,0x6e,0x80,0x3a,0x7e,0xb3, +0x36,0x6e,0x4, 0x7a,0xb3,0x36,0x6e,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x33,0xbc, +0x7e,0x68,0x23,0xa, 0xdd,0x19,0xcd,0x36,0x72,0xa, 0x97,0xad,0x9b,0x2d,0x9c,0x7c, +0xad,0xb, 0xd0,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x34,0x12,0x10,0x0, 0xb, +0xf0,0xbe,0xf0,0x3, 0x50,0x8, 0xb, 0xc0,0xe5,0x35,0xbc,0xbc,0x38,0xc0,0x7a,0xf3, +0x36,0x6f,0xda,0x3b,0x22,0x7e,0x8, 0x36,0x76,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x17, +0x4e,0x6c,0xaa,0x7e,0x44,0xff,0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x78, +0x59,0x43,0x36,0x80,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x64,0x7e, +0x34,0x0, 0xd, 0xe4,0x2, 0x17,0x4e,0x7e,0xa3,0x2b,0x81,0xbc,0xab,0x68,0x6, 0x7a, +0xb3,0x2b,0x81,0xd2,0xc, 0x30,0xc, 0x9, 0xc2,0xc, 0x12,0x98,0xe2,0xe4,0x2, 0xa, +0x66,0x22,0x7e,0x8, 0x2a,0x8c,0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x8c,0x74,0x3, 0x2, +0x11,0x7a,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88,0x7e,0xf0, +0x1, 0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f,0x7f,0x7, +0x2d,0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc,0x9f,0x38, +0xe2,0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0,0x1, 0x21, +0xb1,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, 0x80,0x36,0x7e, +0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0xe5,0x44, +0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16,0x5, 0x45,0xa, +0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0x99,0xbe,0xbd,0x3d,0x8, 0x5, 0x12,0x99, +0xbe,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe,0xb0,0x0, 0x28, +0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x72,0x38,0x4f,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x38, +0x50,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x2e,0xc8,0x1b,0x1a,0xd0,0xb, 0xa0,0xb, +0xf0,0xbc,0x8f,0x40,0x2, 0x21,0x31,0x7c,0xba,0xda,0x79,0xda,0xd8,0x22,0x7c,0xbe, +0x7c,0x7d,0x2, 0x1e,0x80,0x7c,0x9b,0x7f,0x71,0x7f,0x60,0x7e,0x34,0x19,0xb, 0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x52,0x74,0x2a,0x12,0x16,0x1d,0x7e,0x58,0x1f,0x52, +0x7c,0xb9,0x7e,0x71,0x44,0x12,0x1e,0x80,0x7d,0x43,0xe5,0x45,0x7e,0x71,0x46,0x12, +0x1e,0x80,0x2d,0x34,0xe, 0x34,0x7f,0x5, 0x7e,0x50,0x7, 0xb, 0xa, 0x50,0xbd,0x53, +0x58,0xf, 0x69,0x30,0x0, 0x2, 0x1b,0x6a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x7a,0x30, +0x22,0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe2,0x22,0x6d,0x33,0x7d,0x23,0x7d,0x3, +0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x8d,0xac,0xb3,0xa, 0x42, +0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4,0xb, 0x7a,0x40,0xbe, +0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, 0x24,0xbe,0x44,0xff, +0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, 0x34,0xb, 0x21,0x7e, +0x93,0x2a,0x8d,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a,0x8c,0xbc,0xb3,0x38, +0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x12, +0x4f,0xed,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x3, 0x7e, +0xb3,0x39,0x4, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x4, 0x80,0x3c,0xe4, +0x7a,0xb3,0x39,0x4, 0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22,0xbd,0x32,0x28,0x1e, +0xe4,0x7a,0xb3,0x39,0x4, 0x7e,0xb3,0x39,0x3, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a, +0xb3,0x39,0x3, 0x80,0x16,0xe4,0x7a,0xb3,0x39,0x3, 0x74,0x2, 0x80,0x9, 0xe4,0x7a, +0xb3,0x39,0x3, 0x7a,0xb3,0x39,0x4, 0x7a,0xb3,0x39,0x5, 0x7e,0xb3,0x39,0x5, 0x22, +0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x39,0x6, 0x22,0xca,0xd8,0xca,0x79,0xc2,0x3, +0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7,0x28,0x97,0x7e,0x37,0x38,0x9, +0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff,0x7e,0xa3,0x2a,0x8d,0x7c,0x8a, +0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14,0x24,0xc2,0x68,0x8, 0x24,0xfb, +0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83,0x2a,0x8c,0x80,0xa, 0x7e,0x73, +0x2a,0x8c,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99,0x80,0xf, 0x7c,0xb9,0x12,0x71, +0x7e,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, 0x90,0x7e,0x33,0x28,0x84,0xbc, +0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x81,0xaf,0x7e,0xa3,0x28,0x85,0xbe,0xa0, +0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3,0x26,0x83,0x70,0x31,0x6c,0x99, +0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34,0x49,0x23,0x5, 0x7a,0xbd,0x2f, +0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, 0x6d,0x33,0x9d,0x3e,0x12,0x8d, +0xd, 0xbd,0x3, 0x8, 0x4, 0xd2,0x3, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xd3,0x6d, +0xee,0x9e,0xe7,0x2a,0x6e,0xbe,0xe7,0x7, 0xf8,0x8, 0x2, 0xc2,0x3, 0x30,0x3, 0x20, +0x7e,0xb3,0x39,0x6, 0x4, 0x7a,0xb3,0x39,0x6, 0x7e,0x23,0x39,0x6, 0xbe,0x20,0xa, +0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x39,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa8,0x80,0xf, +0x7e,0x23,0x39,0x6, 0xbe,0x20,0x0, 0x28,0x6, 0x1e,0x20,0x7a,0x23,0x39,0x6, 0x6c, +0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28,0x6d,0x7e,0xb3,0x28,0xa7,0xb4, +0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68,0x5d,0x7e,0xb3,0x28,0xa8,0xb4, +0x1, 0x56,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x26,0xfa,0x9, +0xd3,0x26,0xfb,0x7c,0xba,0x7c,0x7d,0x12,0x1f,0xcc,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x21,0x7e, +0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3,0x27,0x37,0x7c,0xba,0x7c,0x7d, +0x12,0x1e,0x80,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90, +0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xd7,0x6c,0x99,0x80,0x17,0xa, 0xe9,0xa, 0x5f, +0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x39,0x7, 0x4, +0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x28,0x22,0x74,0x5, 0x7a, +0xb3,0x39,0x7, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x15,0x12,0x9a,0xe0,0x80,0xf, +0x7e,0x73,0x39,0x7, 0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x39,0x7, 0xda, +0x79,0xda,0xd8,0x22,0x7c,0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x8d,0xbc, +0xba,0x28,0x9, 0x74,0x2, 0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x8d, +0xbc,0x1a,0x38,0x1c,0x7e,0x3, 0x2a,0x8c,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a, +0xbd,0x31,0x58,0xc, 0x9d,0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x72,0x80,0x2d, +0x7e,0x3, 0x2a,0x8c,0xa, 0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34, +0x48,0x19,0x7e,0x10,0x2, 0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x74,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, +0x64,0xad,0x23,0x74,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7c,0xb7,0x22,0xca,0xf8,0x80,0x38,0x7c,0xbf,0x12,0x9c,0xb4,0xa, 0x1b,0x7e, +0x63,0x2a,0x8d,0x7e,0x70,0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e, +0x1f,0x13,0x8a,0x2d,0x30,0x12,0x9d,0x73,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12, +0x9d,0x73,0x7e,0x73,0x2a,0x8d,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8, +0xda,0xf8,0x22,0x7e,0xa3,0x2a,0x8c,0x74,0x2, 0xa4,0x22,0x6c,0xaa,0x80,0x1c,0x7e, +0x50,0x2, 0xac,0x5a,0x49,0x12,0x13,0xc6,0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, +0x2e,0x24,0x13,0x8e,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x8d,0xbc, +0xba,0x38,0xdc,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9,0xc5,0xea, +0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x60,0x7e,0x73,0x39,0x1, +0xbe,0x71,0x60,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9,0x34,0xe5, +0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x33,0xe5, +0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5,0x3, 0xa9, +0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8,0x22,0x7e, +0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79,0x30, +0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79,0x30, +0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79,0x30, +0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12,0x3b,0xac,0x7c, +0x7b,0x12,0x3b,0xa5,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e,0x24,0x0, 0xef, +0x7e,0xf, 0x33,0xdf,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e,0xf, 0x33,0xdf, +0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x33,0xdf,0x79,0x20,0x0, 0x90, +0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x33,0xdf,0x79,0x30,0x0, 0x86, +0x7e,0x34,0x29,0x90,0x7e,0xf, 0x33,0xdf,0x79,0x30,0x0, 0x8a,0x7e,0x34,0x6a,0xd1, +0x7e,0xf, 0x33,0xdf,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e,0xf, 0x33,0xdf, +0x79,0x30,0x0, 0x8e,0x22,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86, +0xa9,0xc2,0xeb,0xa9,0xd2,0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, +0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7, +0x0, 0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0, +0xf7,0xd2,0xf8,0xa9,0xc1,0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7, +0xc2,0xbe,0x22,0x75,0xe7,0x6b,0x2, 0x9f,0x19,0xe4,0x7e,0x34,0xd7,0xfc,0x7e,0x24, +0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff,0x22, +0x7e,0x37,0x38,0xff,0xb, 0x34,0x7a,0x37,0x38,0xff,0xbe,0x34,0xff,0x0, 0x40,0x8, +0x7e,0x34,0xff,0x0, 0x7a,0x37,0x38,0xff,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24, +0xbd,0x32,0x38,0xe9,0x22,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c,0x11,0x80,0x46, +0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, 0x20,0xa, 0x33, +0x9d,0x32,0x12,0x17,0x80,0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74,0x26,0xfa,0xa, +0x27,0xa, 0x32,0x9d,0x32,0x12,0x17,0x80,0x7c,0x97,0xbe,0x90,0x1, 0x18,0x8, 0xbe, +0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe,0x0, 0x2, 0x18, +0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18,0xb2,0x22,0x7c, +0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, 0xf9,0x2d,0xf1,0x7d,0xe0, +0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77,0x14,0x78,0xfb,0x4d,0x3f, +0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0x7c,0x57,0x7c,0xab,0x6c,0x77,0x80, +0x4b,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46,0x2e,0x44,0x16, +0xe3,0x12,0xa0,0xa8,0x7c,0x6b,0xbe,0x60,0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c, +0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, +0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xb1, +0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70,0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, +0x38,0x11,0x12,0xa0,0xa1,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, +0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16,0x9e,0x60,0xe, 0x12,0xa0,0xa1,0x60,0x5, +0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60, +0x1c,0x12,0xa0,0xa1,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4, +0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b,0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4, +0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93, +0x22,0xca,0xf8,0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0xa1, +0x3d,0x7e,0x8, 0x1f,0x3c,0x12,0xa1,0x45,0xd2,0x3, 0x7e,0x8, 0x2a,0xfb,0x7c,0xbf, +0x12,0x9f,0xbf,0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f, +0x5c,0x7d,0x32,0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c, +0x77,0x80,0xe, 0x12,0xa1,0x8d,0x50,0x7, 0x12,0xa1,0x84,0x19,0x51,0x1f,0x3c,0xb, +0x70,0xbc,0xf7,0x38,0xee,0x12,0xa1,0x2a,0xe4,0x12,0xa1,0x32,0xe4,0x12,0xc, 0x9b, +0x6d,0x33,0x7a,0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xa1,0x2a,0x74,0x1, 0x12, +0xa1,0x32,0x74,0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f, +0x58,0x22,0x12,0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, +0x8, 0xe4,0x2, 0x17,0x4e,0x7e,0x34,0x0, 0x1c,0x74,0x3f,0x2, 0x17,0x4e,0x7e,0x8, +0x1f,0x34,0x12,0xa1,0x45,0x6c,0x77,0x80,0xe, 0x12,0xa1,0x8d,0x50,0x7, 0x12,0xa1, +0x84,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x8d,0xbc,0x57,0x38,0xea,0xa9, +0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9,0xd6,0xea,0x7e,0x8, 0x1f, +0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x63,0xa, 0x16,0x22,0xa, 0x27,0x9, +0x62,0x2a,0xfb,0xbe,0x60,0x1c,0x22,0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a, +0x8d,0xa, 0xd8,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c, +0xaa,0x80,0x18,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3, +0xb, 0x5a,0xc0,0x9d,0xc2,0x59,0xc3,0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90, +0x60,0x92,0xe4,0x93,0x7c,0x9b,0x6d,0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60, +0x92,0xe4,0x93,0xa, 0xcb,0x1b,0xc4,0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c, +0xaa,0x80,0x28,0xa, 0x3a,0x7d,0x23,0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d, +0x3d,0x3e,0x34,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x17, +0x80,0x7d,0xa3,0xbd,0xfa,0x58,0x2, 0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, +0xc8,0x2d,0xec,0x2d,0xdc,0xb, 0xf0,0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22, +0xca,0xf8,0x6d,0x44,0x7e,0xf3,0x2a,0x8d,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e, +0xb3,0x2a,0x8c,0xa, 0xeb,0x2d,0xef,0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90, +0x60,0x94,0xe4,0x93,0xb4,0xff,0x31,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, +0xda,0x2d,0xdf,0x3e,0xd4,0x7e,0x1f,0x33,0xf8,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50, +0x2, 0xac,0x5a,0x7f,0x50,0x2d,0xb2,0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6, +0xb, 0xa0,0xbc,0xfa,0x38,0xd9,0x80,0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x33,0xf8, +0x2d,0x15,0x6c,0xaa,0x80,0x2c,0xa, 0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x33,0xf8, +0x2d,0x3e,0xb, 0x1a,0xe0,0x7e,0x70,0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a, +0xd0,0x7d,0x3e,0x9d,0x3d,0x12,0x17,0x80,0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c, +0xb, 0xa0,0xbc,0xfa,0x38,0xd0,0x7d,0x34,0xda,0xf8,0x22,0x7e,0x27,0x28,0xa3,0x6d, +0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e,0x90,0x2, 0xac,0x9a,0x49, +0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11,0x7e,0xb3,0x25,0xf6,0xb4, +0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80,0xc, 0xbd,0x1, 0x58,0x8, +0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e,0x7e,0x90,0x2, 0xac,0x9a, +0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, 0x11,0x7e,0xb3,0x25,0xf6, +0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76,0x80,0xc, 0xbd,0x1, 0x58, +0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x93,0xa, +0xb, 0x7e,0xb3,0x2a,0x92,0xa, 0x4b,0x2d,0x40,0xa, 0xa, 0xbd,0x4, 0x48,0x88,0x22, +0xe4,0x7a,0xb3,0x38,0xd9,0x22,0x7e,0xb3,0x37,0x2e,0x70,0x6, 0x12,0xa3,0x8f,0x2, +0xa3,0x50,0x12,0xa3,0x95,0x12,0xa8,0x78,0x50,0xa, 0x12,0xa6,0xed,0x7c,0x3b,0x12, +0xa3,0x8f,0x80,0x5, 0x12,0xa5,0x92,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12, +0xa7,0xfc,0x60,0xa, 0x7a,0x33,0x37,0x31,0x74,0x1, 0x7a,0xb3,0x2a,0x26,0x22,0xe4, +0x7a,0xb3,0x2f,0x9f,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x20,0x7e,0xb3,0x2a,0x21,0xbe, +0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28,0x86,0xbe,0x44,0x0, +0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x9f,0x4c,0xff,0x68,0x17,0x7e,0x47,0x2b, +0xd6,0x4d,0x44,0x78,0xf, 0x12,0xa9,0xb, 0x74,0x1, 0x7a,0xb3,0x38,0x8d,0x7a,0xb3, +0x37,0x3, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e,0x37,0x2b,0xd6,0x7a, +0x37,0x2f,0xa1,0x7e,0xb3,0x2f,0x9f,0xb4,0x3, 0x1f,0x7e,0x37,0x2b,0xd6,0xbe,0x34, +0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x9f,0x7e,0x37,0x2f,0xb7,0x7e,0x27, +0x2f,0xb9,0x12,0xa4,0xa6,0x81,0x9f,0x80,0x0, 0x12,0xa8,0xa8,0x81,0x9f,0x7e,0xc7, +0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57,0xbe,0xa0,0x1, 0x78, +0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xa7,0x97,0x12,0xa4,0xa2,0x74,0x1, 0x7a,0xb3,0x2f, +0x9f,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0xa7,0x9e,0x27,0x2f,0xaf, +0x7e,0x14,0x62,0xa1,0x12,0xa5,0x51,0xbd,0x23,0x38,0x13,0x7e,0x27,0x2f,0xb5,0x9e, +0x27,0x2f,0xad,0x7e,0x14,0x62,0xa3,0x12,0xa5,0x51,0xbd,0x23,0x28,0x15,0x74,0x3, +0x7a,0xb3,0x2f,0x9f,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a,0xc7,0x2f,0xb7,0x7a, +0xd7,0x2f,0xb9,0x7e,0xb3,0x2f,0x9f,0x60,0x26,0x7d,0x3c,0x7d,0x2d,0x7e,0x17,0x2b, +0xda,0x7e,0x7, 0x2b,0xdc,0x12,0xa7,0x7b,0xa, 0x2b,0x7e,0x73,0x2f,0x9e,0xa, 0x37, +0xbd,0x32,0x58,0xb, 0x12,0xa4,0xa2,0x7a,0xc7,0x2b,0xda,0x7a,0xd7,0x2b,0xdc,0xda, +0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24,0x12,0xa8,0x83,0x7d, +0x31,0x12,0xa7,0x6, 0x2, 0xa4,0xb7,0x7e,0x3, 0x2f,0xc7,0xbe,0x0, 0xf0,0x50,0x2, +0xa1,0x50,0xa1,0x45,0x6c,0x99,0x7e,0xb3,0x2f,0x9e,0xbe,0xb0,0x20,0x50,0x5, 0x4, +0x7a,0xb3,0x2f,0x9e,0x7e,0x1f,0x2b,0xde,0x7a,0x1f,0x1f,0x34,0x7e,0x80,0x1, 0x80, +0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xde,0x49,0x25,0x2b,0xe0,0x7e,0x17,0x1f, +0x34,0x7e,0x7, 0x1f,0x36,0x12,0xa7,0x7b,0x7c,0x1b,0x7e,0x3, 0x2f,0x9e,0xbc,0x1, +0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b,0xde,0x7e,0x14,0x1f, +0x34,0x74,0x4, 0x12,0x15,0xfc,0x7e,0x34,0x1f,0x34,0x7e,0x30,0x4, 0xac,0x39,0x2e, +0x14,0x2b,0xde,0x74,0x4, 0x12,0x15,0xfc,0xb, 0x80,0x7e,0x3, 0x2f,0xc7,0xbc,0x8, +0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xc7,0x7e,0x3, 0x2f,0x9e, +0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xc7,0xbe,0x0, 0xec,0x40,0x2, 0x81,0xc4, +0x22,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0x13,0x7e,0x54,0x62,0x6f,0x12, +0xa5,0x88,0x50,0x21,0x7e,0x54,0x62,0x71,0x12,0xa5,0x88,0x28,0x18,0x7e,0x14,0x62, +0x73,0x12,0xa5,0x51,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x75,0x12,0xa5,0x51,0xbd, +0x32,0x28,0x2, 0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd, +0x31,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd,0x7e,0xd3, +0x2a,0x20,0x7e,0xe3,0x2a,0x21,0x7e,0xb3,0x38,0xd9,0x60,0x11,0x7e,0xc7,0x38,0xe2, +0x4d,0xcc,0x78,0x2, 0xc1,0x86,0xbe,0xd0,0x1, 0x28,0x2, 0xc1,0x86,0xbe,0xd0,0x1, +0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xc1,0x86,0x7e,0xe7,0x29,0x8, 0x7e,0xf7,0x29, +0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0xa5,0x59,0xbe,0xb0,0x1, 0x78,0x2, 0xc1,0x86,0x7e, +0xa3,0x38,0xd9,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23,0x14,0x78, +0x2, 0xc1,0x83,0xb, 0xb2,0x68,0x2, 0xc1,0x86,0xbe,0xd0,0x1, 0x68,0x2, 0xc1,0x95, +0x4c,0xee,0x68,0x2, 0xc1,0x95,0x74,0x1, 0x7a,0xb3,0x38,0xd9,0x12,0xa6,0xa4,0x80, +0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3,0x38,0xd9, +0x7e,0x34,0x62,0x7b,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xd9,0x7e,0x34,0x62,0x7f, +0x80,0x48,0x12,0xa6,0xad,0x90,0x62,0x6e,0x12,0xa6,0xb6,0x68,0x49,0x80,0x56,0xbe, +0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xa6,0xad,0x7e,0x34,0x62,0x77,0x12, +0xa6,0x9c,0x7e,0x14,0x62,0x7b,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d,0xc3,0xbe, +0xc7,0x38,0xe2,0x40,0x21,0x90,0x62,0x6d,0x12,0xa6,0xb6,0x68,0x19,0x12,0xa6,0xa4, +0x74,0x3, 0x7a,0xb3,0x38,0xd9,0x7e,0x34,0x62,0x7b,0x12,0xa6,0x9c,0x7a,0x37,0x38, +0xe2,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xd9,0x6d,0x33,0x7a,0x37,0x38, +0xe2,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x30,0x22,0x7a,0xe7,0x38,0xda,0x7a,0xf7,0x38,0xdc,0x22,0x7a,0xe7,0x38, +0xde,0x7a,0xf7,0x38,0xe0,0x22,0xe4,0x93,0xa, 0x3b,0x12,0xa6,0xc2,0xa, 0xdb,0x4d, +0xdd,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x7e,0x37,0x38,0xde,0x9e,0x37, +0x38,0xda,0x12,0x17,0x80,0xbd,0x31,0x38,0x12,0x7e,0x37,0x38,0xe0,0x9e,0x37,0x38, +0xdc,0x12,0x17,0x80,0xbd,0x31,0x38,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x12,0xa7,0x72, +0x7a,0x37,0x2f,0xbb,0x12,0xa6,0xfd,0x7a,0x37,0x2f,0xbd,0xe4,0x22,0x7e,0x37,0x2f, +0xb5,0x9e,0x37,0x2f,0xad,0x22,0x7e,0x17,0x2f,0xaf,0xbd,0x13,0x28,0xa, 0x7a,0x37, +0x2f,0xaf,0x7a,0x27,0x2f,0xb1,0x80,0x10,0x7e,0x17,0x2f,0xa7,0xbd,0x13,0x50,0x8, +0x7a,0x37,0x2f,0xa7,0x7a,0x27,0x2f,0xa9,0x7e,0x17,0x2f,0xad,0xbd,0x12,0x28,0xa, +0x7a,0x27,0x2f,0xad,0x7a,0x37,0x2f,0xab,0x80,0x10,0x7e,0x17,0x2f,0xb5,0xbd,0x12, +0x50,0x8, 0x7a,0x27,0x2f,0xb5,0x7a,0x37,0x2f,0xb3,0x7e,0xb3,0x2f,0xc7,0xb4,0xa, +0xf, 0x12,0xa7,0x72,0x7a,0x37,0x2f,0xbf,0x12,0xa6,0xfd,0x7a,0x37,0x2f,0xc1,0x22, +0xb4,0x14,0xe, 0x12,0xa7,0x72,0x7a,0x37,0x2f,0xc3,0x12,0xa6,0xfd,0x7a,0x37,0x2f, +0xc5,0x22,0x7e,0x37,0x2f,0xa7,0x9e,0x37,0x2f,0xaf,0x22,0x7d,0x51,0x7d,0x12,0x9d, +0x35,0x12,0x17,0x80,0x7c,0xa7,0x7d,0x31,0x9d,0x30,0x12,0x17,0x80,0x7c,0xb7,0xbc, +0xba,0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x9f,0x7e, +0x34,0x0, 0x28,0xe4,0x12,0x17,0x4e,0x7e,0x8, 0x2b,0xde,0x7e,0x34,0x3, 0xc0,0x12, +0x17,0x4e,0x7a,0xb3,0x37,0x31,0x7e,0x34,0x62,0xa5,0x12,0xa6,0x9c,0x7a,0x37,0x2b, +0xd6,0x7a,0xe7,0x2f,0xa3,0x7a,0xf7,0x2f,0xa5,0x7a,0xe7,0x2f,0xa7,0x7a,0xe7,0x2f, +0xab,0x7a,0xe7,0x2f,0xaf,0x7a,0xe7,0x2f,0xb3,0x7a,0xf7,0x2f,0xa9,0x7a,0xf7,0x2f, +0xad,0x7a,0xf7,0x2f,0xb1,0x7a,0xf7,0x2f,0xb5,0x7a,0xe7,0x2b,0xda,0x7a,0xf7,0x2b, +0xdc,0x7a,0xb3,0x2f,0xc7,0x74,0x2, 0x7a,0xb3,0x2f,0x9e,0x22,0x7c,0x7b,0xa, 0x57, +0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7c,0x67, +0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xf7,0xa, 0x47,0x5d,0x42,0x7e,0x73, +0x37,0x2f,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xa8,0x6f,0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0x7e,0x53,0x38,0xf8,0xa, 0x45,0x5d,0x43,0x7e,0x73,0x37,0x30,0x80,0x1a, +0x12,0xa8,0x6f,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x2a,0x9, 0xb2,0x38,0xf7, +0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x31,0xa, 0x57,0x5d,0x54,0x22,0x7c, +0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f,0x9f,0xb4,0x4, 0x2, 0xd3, +0x22,0xc3,0x22,0x7e,0xa3,0x2f,0xc7,0xbe,0xa0,0xf0,0x50,0x1b,0x74,0x4, 0xa4,0x59, +0x35,0x2b,0xde,0x7e,0xa3,0x2f,0xc7,0x74,0x4, 0xa4,0x59,0x25,0x2b,0xe0,0x7e,0xb3, +0x2f,0xc7,0x4, 0x7a,0xb3,0x2f,0xc7,0x22,0x74,0xfe,0x7a,0xb3,0x37,0x31,0xe4,0x7a, +0xb3,0x2f,0x9f,0x22,0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x28,0xa1,0x7e,0x34,0x0, 0x2, +0x7a,0x37,0x28,0xa3,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x20,0x7a,0xb3,0x2b,0x3c,0x22, +0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x7c,0x59,0x32,0x36,0x80,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x19,0xb4,0x1f,0x50,0x22,0xe5,0x2a,0xa, 0x2b,0x1b, +0x24,0xe5,0x29,0xa, 0x3b,0xbd,0x32,0x22,0x7e,0x73,0x28,0x84,0xbe,0x70,0x1, 0x22, +0x7e,0x73,0x38,0xee,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0x6d,0x33,0x7a,0x37,0x38, +0x8b,0x22,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e,0x7b,0x60,0x22,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x7e,0x50,0x2, +0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, 0x2d,0x1b,0x24,0xa, 0x3a,0xbd,0x32,0x22, +0x7e,0x37,0x25,0xf4,0x7a,0x37,0x31,0xeb,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x31, +0xed,0x22,0x7e,0x73,0x37,0xcb,0x7a,0x73,0x2b,0x3f,0x22,0x7e,0xb3,0x37,0xee,0x7e, +0x34,0x0, 0x4, 0x22,0x7d,0x2e,0x12,0x15,0x29,0x7d,0xf3,0x22,0x7e,0x34,0x0, 0xc8, +0x2, 0x1a,0x0, 0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0xff,0xa9,0x7c,0x56,0x83, +0x32,0xcd,0x4, 0x6d, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg.txt new file mode 100644 index 0000000000000..95f25982efc49 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg.txt @@ -0,0 +1,2820 @@ +0x2, 0x16,0x42,0x2, 0xa3,0xd6,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x49,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x50,0x93,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x70,0x54,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x22,0x2, 0x70,0x70,0x2, 0x28,0x88,0x32,0x32,0x2, 0x0, 0x4a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xb2,0x86,0x22,0xff,0xff,0x2, 0x0, 0x5a,0xb2,0x82, +0x22,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xf, 0x7e,0xf, 0x39,0x9b, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x39,0xab,0x7e,0x73,0x39,0xab,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xe, 0x80,0x2, 0xc2,0xe, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x72,0x97,0x7e,0x1f,0x39,0x9b,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x39,0x9b,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x39,0x9f,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x39,0xa7,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x39,0xa5,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x39,0xca,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0x63,0x28,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x14,0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x14, +0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x52,0x61,0x3f,0x7e,0x34,0x14,0x89,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x61,0x3f,0x7e,0x34,0x14,0x89,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x14,0x22,0x61,0x3f,0x7e,0x34,0x14,0x6, 0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x14,0x36,0x61,0x3f,0x7e,0x34,0x14,0x7a,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14, +0x61,0x61,0x3f,0x7e,0x34,0x14,0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x14,0xd9,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x14,0xda,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x1, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x34,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x1, 0xe5,0x34,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x39,0x9b,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x39,0x9b,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x39, +0x9b,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x39,0x9b,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x17,0x53,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x39,0xca,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x39,0x93,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x39, +0xca,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x39,0x93,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x39,0xca,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x39,0xca,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x39,0xca,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x39,0x9b,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x15,0x29,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x39,0x9b,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x15,0x29,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x15,0x29,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x39,0x9b,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x33,0xfc,0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x33,0xfc,0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x33,0xfc, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x33,0xfc, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x33,0xfc,0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x39,0xc6,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x39, +0xc6,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x39,0xc6,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x39,0xc6,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x39,0x93,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x39,0x93,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x39,0x93,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x39,0x93,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x39,0x9b,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x39,0x9b,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x39, +0x9b,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x39,0x9b,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x39,0x9b,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x39,0x9b,0x69,0x40,0x0, 0x22,0x30,0x1, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x39,0x9b,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x39,0x9b,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x39, +0x9b,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x39,0x9b, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x39,0x9b,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x39,0x9b,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x39,0x9b,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x39,0x9b,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x15,0x29,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x15,0x29,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x39,0xc6,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x39,0xc6,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x39,0xc6,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x1d,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x33,0xfc, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x33, +0xfc,0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x39,0x9b,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x39,0x9b,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x39,0x9b,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x39,0x9b, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x39,0x9b,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x39,0x9b,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x33,0xfc,0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x33,0xfc,0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x33,0xfc,0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x39,0xca,0x79,0x30, +0x0, 0xe, 0xc2,0x1c,0xe4,0x7a,0xb3,0x39,0xc5,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x39,0x93,0x1b,0x1a,0x10,0x7e,0xf, 0x39,0x93,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x39, +0xca,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x39, +0xca,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x33,0xfc,0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x33,0xfc,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x33,0xfc,0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x33, +0xfc,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x33,0xfc,0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x1d,0x7e,0xf, 0x33,0xfc,0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x15,0xc8,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x15,0x5b,0x7d,0x1e,0x12,0x15,0x75,0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x39,0x9b,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x1c,0x7e,0xf, 0x39,0xca,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x39,0xc5,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x39,0xca,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x72,0x97,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x39,0x93,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x39,0x93,0x1b,0x1a,0x10,0x7e,0xf, 0x39,0x9b,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xf, 0xe4,0x7a,0xb3,0x39,0xab,0x7e,0x1f,0x39,0x93, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x39,0xc6,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x39,0xc6,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x39,0xc6,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x39,0x9b,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x39,0x9b,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x39,0xc6,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x39,0xc6,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x33,0xfc,0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x17,0x4, 0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x17,0x5, 0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x39,0x93,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x39,0x93,0x1b,0x1a,0x10,0x7e, +0x1f,0x39,0x93,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x39,0x9b,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x39,0xca,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x39,0x93,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x39,0x93,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x39, +0x9b,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x39,0x9b,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x1, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x39,0x9b,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x39,0x93,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x15,0x77,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x15,0x77,0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0xe4,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1d,0x0, 0xc2,0x10,0xc2,0x11,0xc2,0x13,0x75,0x1e, +0x0, 0x75,0x1f,0x0, 0xc2,0xa, 0xc2,0xb, 0x75,0x5e,0x0, 0xc2,0x15,0x75,0x5f,0x0, +0xc2,0x17,0x75,0x60,0x0, 0xc2,0x18,0xc2,0x19,0xc2,0xc, 0x75,0x1b,0x0, 0x75,0x1c, +0x64,0xc2,0x1a,0xc2,0x1b,0x75,0x61,0x0, 0xd2,0x5, 0xd2,0x6, 0xd2,0x7, 0xd2,0x1c, +0xc2,0xe, 0xd2,0xf, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x17,0x95,0xb, 0xa, 0x40,0x5d, +0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0, +0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x28,0xf, +0x0, 0x0, 0x0, 0x47,0x0, 0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb, +0x1, 0xbb,0xc, 0x9e,0x19,0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11, +0x4, 0x12,0x5, 0x13,0x6, 0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19, +0xc, 0x1a,0xd, 0x1b,0xdf,0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d, +0x62,0x1c,0x55,0x1b,0x4a,0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15, +0x21,0x14,0x1c,0x13,0x19,0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8, +0x7f,0x20,0x80,0xa, 0x7e,0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff, +0xff,0xfc,0x7d,0xef,0x1b,0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10, +0xda,0xf8,0x22,0x7d,0x43,0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14, +0x4d,0x44,0x78,0xf5,0x22,0x32,0x1, 0x19,0x1, 0x0, 0x2, 0xf8,0x4, 0xe7,0x5, 0xce, +0x6, 0xc2,0x7, 0xb5,0x8, 0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff, +0x2, 0x0, 0x1, 0x2, 0xff,0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22, +0x6d,0x33,0x9d,0x32,0x22,0x0, 0x4, 0x34,0x8c,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x34, +0x4f,0x1, 0x0, 0x1, 0x25,0xf6,0x1, 0x0, 0x1, 0x38,0xb3,0x0, 0x0, 0x2, 0x39,0x5, +0x0, 0x0, 0x0, 0x2, 0x39,0x7, 0x0, 0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x37, +0xe7,0xff,0x0, 0x1, 0x39,0xe1,0x0, 0x0, 0x1, 0x39,0xe2,0x0, 0x0, 0x2, 0x35,0xa8, +0x0, 0x0, 0x0, 0x1, 0x35,0xcb,0x0, 0x0, 0x1, 0x36,0x44,0x0, 0x0, 0x1, 0x36,0x45, +0x0, 0x0, 0x1, 0x36,0x46,0x0, 0x0, 0x3c,0x36,0xef,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x37,0x67,0x0, 0x0, 0x1, 0x37,0x68,0x0, +0x0, 0x1, 0x37,0x69,0x0, 0x0, 0x1, 0x36,0xe8,0x1, 0x0, 0x2, 0x36,0xeb,0x0, 0x0, +0x0, 0x1, 0x2f,0xc8,0x0, 0x0, 0x1, 0x2f,0xc9,0x0, 0x0, 0x1, 0x2f,0xca,0x0, 0x0, +0x1, 0x2f,0xcb,0x0, 0x0, 0x1, 0x37,0x6c,0x1, 0x0, 0x1, 0x37,0xe6,0x0, 0x0, 0x1, +0x39,0xe3,0x0, 0x0, 0x6, 0x39,0xce,0x30,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39, +0xda,0x0, 0x0, 0x1, 0x39,0xdb,0x0, 0x0, 0x1, 0x39,0xdc,0x0, 0x0, 0x1, 0x39,0xdd, +0x0, 0x0, 0x1, 0x39,0xde,0x0, 0x0, 0x1, 0x0, 0x62,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x1, 0x31,0xed,0x0, 0x0, 0x2, 0x32,0xe, 0x0, 0x0, 0x0, 0x1, 0x32,0x4c,0x0, +0x0, 0x4, 0x38,0x58,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0xd4,0x0, 0x0, 0x1, 0x39, +0xd5,0x0, 0x0, 0x2, 0x39,0xd6,0x0, 0x0, 0x0, 0x1, 0x39,0xd8,0x64,0x0, 0x1, 0x39, +0xd9,0x0, 0x0, 0x1, 0x39,0xe4,0x0, 0x0, 0x1, 0x39,0xdf,0x0, 0x0, 0x1, 0x39,0xe0, +0x0, 0x0, 0x1, 0x39,0xb0,0x0, 0x0, 0x2, 0x2b,0xd8,0x2b,0xde,0x0, 0x1, 0x2f,0x9e, +0x2, 0x0, 0x1, 0x2f,0xc7,0x0, 0x0, 0x4, 0x39,0xc6,0x0, 0x0, 0x50,0x0, 0x0, 0x4, +0x39,0xca,0x0, 0x0, 0x64,0x0, 0x0, 0x4, 0x39,0x93,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, +0x39,0x97,0x0, 0x0, 0x68,0xc0,0x0, 0x4, 0x39,0x9b,0x0, 0x0, 0x68,0x0, 0x0, 0x4, +0x39,0xac,0x0, 0x0, 0x40,0x0, 0x0, 0x4, 0x33,0xfc,0x0, 0x0, 0x60,0x0, 0x0, 0x0, +0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58,0x0, 0xc, 0x1, 0x5e,0x1, 0xc2,0x0, 0xa, +0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78,0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78, +0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc, +0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, 0x0, 0x1e,0x12,0x27,0x6, 0x12,0x19,0xda, +0x12,0x19,0xa5,0x12,0x1a,0x7f,0x2, 0x19,0x69,0x12,0x19,0x7a,0x7e,0xb3,0x2b,0x2e, +0x12,0x97,0x34,0x74,0x1, 0x7a,0xb3,0x37,0x70,0x22,0x12,0x98,0xad,0x74,0x1, 0x7a, +0xb3,0x37,0x6c,0x22,0x12,0x1a,0x11,0x12,0x3f,0x81,0x12,0x28,0x31,0x12,0x27,0x6, +0x12,0x1a,0x11,0x12,0x19,0xda,0x12,0x38,0x39,0x12,0x19,0xa5,0x12,0x1a,0x7f,0x12, +0x1a,0xaf,0x2, 0x19,0x69,0x12,0x28,0x7a,0x12,0x19,0xf7,0x2, 0x19,0xae,0x7e,0x34, +0x0, 0x3, 0x6d,0x22,0x2, 0x19,0xb7,0x7d,0x43,0x7e,0xa3,0x34,0x38,0xbe,0xa0,0x5, +0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34,0x3b,0x59,0x23,0x34,0x3d,0x7c, +0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22,0x12,0x68,0xb1,0x12,0x6c,0x4b, +0x2, 0x19,0xe3,0x30,0x13,0x10,0x12,0x27,0xfe,0x50,0x3, 0x12,0x23,0x59,0x12,0x6a, +0x80,0x12,0x6c,0xc6,0xc2,0x13,0x22,0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x19,0xb7, +0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, 0x7a,0x2, 0x19,0xb7,0x74,0x1, 0x7a,0xb3,0x38, +0xb8,0x7e,0x34,0xd, 0xac,0x6d,0x22,0x7a,0x27,0x33,0xeb,0x7a,0x37,0x33,0xed,0x22, +0xca,0xf8,0x7e,0xf3,0x38,0xb8,0xbe,0xf0,0x5, 0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x38, +0xb8,0x12,0x0, 0xa, 0x80,0x40,0xbe,0xf0,0x4, 0x78,0xd, 0x12,0x1a,0xb, 0xe4,0x7a, +0xb3,0x2b,0x21,0x12,0x68,0xb1,0x80,0x2e,0xbe,0xf0,0x6, 0x78,0x13,0x12,0x1a,0xb, +0x12,0x22,0x83,0xe4,0x7a,0xb3,0x2b,0x3d,0x12,0x6c,0x4b,0x12,0xb0,0xe, 0x80,0x16, +0xbe,0xf0,0x7, 0x78,0x17,0x12,0x1a,0xb, 0x12,0x6c,0x71,0x50,0xfb,0x12,0x6f,0xe3, +0x12,0x19,0xe3,0x12,0x1a,0x7f,0x74,0x2, 0x7a,0xb3,0x38,0xb8,0xda,0xf8,0x22,0xe4, +0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34,0x39,0x12,0x67,0x97,0xb4,0x1, 0x4, 0x74,0x1, +0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34,0x3a,0x22,0x12,0x38,0x39,0x12,0xaf,0x4d,0x7a, +0x37,0x39,0xd6,0x12,0x1a,0x11,0x12,0x19,0xda,0x12,0x1a,0x7f,0x2, 0x1a,0xaf,0x12, +0x8c,0x4c,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x35,0x92,0xe4,0x7a, +0xb3,0x35,0x93,0x22,0xca,0x3b,0x12,0x6c,0x71,0x50,0xfb,0x7e,0xf3,0x2b,0x2e,0x7c, +0xbf,0x12,0x6e,0xd6,0x12,0x90,0xc3,0x7e,0xb3,0x2b,0x3e,0xf5,0x28,0x7e,0xc3,0x2b, +0x3f,0x7e,0xb3,0x38,0xf, 0xb4,0x1, 0xf, 0x12,0x20,0xc9,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x1a,0x7f,0xc3,0x61,0xc0,0x12,0x1b,0xc3,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x17,0x2e,0x1b,0xfd,0x12,0x1b,0xc3,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x17,0x2e,0x1b,0xfd,0x7e, +0xb3,0x38,0xf, 0xb4,0x3, 0x7, 0x12,0x8f,0xeb,0x7a,0x37,0x38,0xfb,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x19,0xda,0x12,0x8f,0xdc,0x12,0x21,0x4b,0xe4,0x12,0x13,0xde, +0x12,0x1a,0x7f,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x29,0x7e,0x18,0x6, 0x76,0x7e,0xb3, +0x2b,0x91,0x12,0x69,0x7b,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x29,0x7e,0x18,0x5, 0xf8, +0x7e,0xb3,0x25,0xf0,0x12,0x69,0x7b,0x7e,0xd3,0x2b,0x3e,0x7e,0xe3,0x2b,0x3f,0xe5, +0x28,0x7a,0xb3,0x2b,0x3e,0x7a,0xc3,0x2b,0x3f,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, +0xc8,0x7d,0x20,0x7d,0x10,0x12,0x6b,0x4, 0x7a,0xd3,0x2b,0x3e,0x7a,0xe3,0x2b,0x3f, +0x7c,0xbf,0x12,0x6e,0x5a,0x12,0x8f,0x8a,0x7e,0xb3,0x39,0xd9,0x4, 0x7a,0xb3,0x39, +0xd9,0x7e,0x73,0x39,0xd9,0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0xd9, +0x7e,0xb3,0x16,0x90,0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3, +0xda,0x3b,0x22,0x7e,0x73,0x2a,0x93,0xa, 0x27,0x7e,0x73,0x2a,0x92,0xa, 0x37,0x2d, +0x32,0x22,0x12,0x37,0xfe,0x7e,0xb3,0x38,0xf, 0xb4,0x3, 0x6c,0x12,0xa5,0x9a,0x12, +0x3f,0xcf,0x12,0x1e,0xaf,0x7e,0xb3,0x38,0xb4,0x30,0xe7,0xe9,0x12,0x1a,0xc4,0x12, +0x1b,0xc3,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x17, +0x2e,0x1b,0xfd,0x12,0x1b,0xc3,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, +0x5, 0x7a,0x12,0x17,0x2e,0x1b,0xfd,0x7e,0xb3,0x2b,0x3c,0xb4,0x1, 0x18,0x12,0x5d, +0xa8,0x12,0x5b,0x2b,0x12,0x51,0x88,0x12,0x5f,0xb7,0x12,0x7b,0xd8,0x12,0x2f,0x9e, +0x12,0x1c,0x59,0x12,0x3f,0xfa,0x12,0x38,0x44,0x12,0x32,0x6e,0x7e,0xb3,0x38,0xb4, +0x54,0x7f,0x7a,0xb3,0x38,0xb4,0x80,0x8d,0x12,0x6f,0xc3,0x2, 0x1c,0x4e,0x7e,0xb3, +0x38,0x56,0x70,0x4, 0xe4,0x12,0x7b,0xbe,0x22,0x12,0x55,0x30,0x12,0x1e,0x4d,0x12, +0x1e,0x4d,0x12,0x7f,0xb2,0x12,0x78,0x5f,0x12,0x8d,0xa, 0x12,0x1e,0x4d,0x12,0x9c, +0x48,0x12,0x1e,0x4d,0x12,0x8d,0xbf,0x12,0x1e,0x4d,0x2, 0x1c,0x7d,0xca,0x3b,0x75, +0x24,0x0, 0x6c,0xcc,0x6c,0xdd,0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x37,0x2b, +0x7e,0x8, 0x36,0xef,0x12,0x17,0x2e,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e, +0xc4,0xca,0xc9,0x7e,0x18,0x26,0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x17,0x2e,0x1b,0xfd, +0x6c,0x88,0x6c,0xee,0xa1,0x51,0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80, +0x4c,0x74,0x2, 0xac,0xb9,0x9, 0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9, +0x12,0x1e,0x96,0x60,0x36,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74, +0x2, 0xac,0xbe,0x9, 0x75,0x37,0x2c,0x12,0x1e,0x8f,0x7d,0x13,0x74,0x2, 0xac,0xb9, +0x9, 0x75,0x1f,0x34,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x37,0x2b,0x12,0x1e, +0x8f,0x2d,0x13,0xbd,0xc1,0x28,0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38, +0xb0,0xbe,0xc0,0xff,0x68,0x39,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, +0x73,0x1f,0x35,0x12,0x2c,0xb9,0xbe,0x37,0x2a,0x79,0x48,0x23,0x7e,0x70,0x2, 0xac, +0x7c,0x9, 0x53,0x1f,0x34,0x74,0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f, +0x35,0x19,0x55,0x1f,0x71,0x74,0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, +0xe0,0x7e,0x73,0x36,0xee,0xbc,0x7e,0x28,0x2, 0x81,0xb6,0x7c,0xe8,0x80,0x6d,0x6d, +0xdd,0x7e,0x80,0xff,0x6c,0x99,0x80,0x3c,0x7c,0xb9,0x12,0x1e,0x96,0x60,0x33,0x12, +0xaf,0xd6,0xbe,0xb0,0xff,0x68,0x2b,0x9, 0x73,0x1f,0x35,0x12,0x4c,0x21,0x7f,0x71, +0xb, 0x7a,0x50,0xbe,0x54,0x0, 0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a, +0xc0,0xbd,0xcd,0x8, 0xd, 0x12,0xaf,0xd6,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc, +0x7c,0x89,0xb, 0x90,0xbc,0xf9,0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24, +0x74,0x2, 0xac,0xbd,0x19,0x75,0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e, +0x70,0x2, 0xac,0x78,0x19,0xa3,0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0xbe,0xe0,0xa, 0x40, +0x8e,0x90,0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f, +0x70,0x7e,0x8, 0x1f,0x34,0x12,0x17,0x2e,0x1b,0xfd,0x7c,0xfd,0x7e,0x8, 0x37,0x2b, +0x7e,0x34,0x0, 0x14,0x74,0xff,0x12,0x17,0x53,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x17,0x2e,0x1b, +0xfd,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x37,0x2b,0x12, +0x17,0x2e,0x1b,0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x54,0xca,0xb, 0xe0,0xbc, +0xfe,0x38,0xf5,0x7a,0xf3,0x36,0xee,0x7a,0xf3,0x28,0x84,0x7e,0x73,0x28,0x84,0xbe, +0x70,0xa, 0x28,0x6, 0x74,0xa, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c, +0xff,0x6c,0xee,0x80,0x2e,0x7c,0xbe,0x12,0x1e,0x96,0x60,0x25,0x7e,0x34,0x0, 0x2, +0xca,0x39,0xac,0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e, +0x14,0x26,0xfa,0x6d,0x0, 0x12,0x17,0x2e,0x1b,0xfd,0x7c,0xbf,0x12,0x54,0xca,0xb, +0xf0,0xb, 0xe0,0x12,0x7d,0xfd,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0xa, +0x37,0x9d,0x32,0x2, 0x17,0x85,0x7c,0x7b,0x12,0x53,0x37,0x9, 0xa2,0x27,0x72,0x7c, +0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x6e,0x51,0x5c,0xba,0x22,0x30, +0x8, 0x3b,0xc2,0x8, 0x12,0x1a,0x20,0x7e,0x73,0x38,0xb9,0x7a,0x73,0x2a,0x6c,0x7e, +0x73,0x38,0xba,0x7a,0x73,0x2b,0x3c,0x7e,0x73,0x38,0xba,0x7a,0x73,0x2b,0x20,0x7e, +0xb3,0x38,0xbb,0x60,0x18,0x7e,0x34,0x0, 0x2, 0x12,0x38,0x84,0x7e,0x34,0x0, 0x1, +0x12,0x38,0x84,0x6d,0x33,0x12,0x38,0x84,0xe4,0x7a,0xb3,0x38,0xbb,0x12,0x36,0x25, +0x2, 0x1e,0xf3,0xe5,0xc, 0x70,0x3, 0x2, 0x20,0x16,0xe5,0xc, 0x30,0xe0,0x10,0x53, +0xc, 0xfe,0x12,0x98,0xe, 0x12,0x64,0x10,0x7e,0x8, 0x2a,0x8c,0x12,0x9, 0xa1,0xe5, +0xc, 0x30,0xe1,0x6, 0x53,0xc, 0xfd,0x12,0xa9,0x6, 0xe5,0xc, 0x30,0xe2,0x32,0x53, +0xc, 0xfb,0x7e,0xb3,0x2b,0x31,0x60,0x9, 0x7e,0x8, 0x2a,0x8c,0x12,0x6, 0xba,0x80, +0xb, 0x7e,0xb3,0x2b,0x84,0x7e,0x73,0x2b,0x83,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x31, +0x2e,0x70,0xff,0x92,0x1, 0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x96,0x12,0xb, +0x1e,0xe5,0xc, 0x30,0xe3,0x4a,0x53,0xc, 0xf7,0x7e,0x73,0x38,0xe6,0x7a,0x73,0x2b, +0x2e,0x12,0x6e,0xb4,0x7a,0xb3,0x0, 0x62,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20, +0x7e,0x73,0x0, 0x62,0x7a,0x73,0x38,0xbe,0x12,0x21,0x43,0x12,0x27,0xf0,0x7e,0x73, +0x38,0xe7,0xbe,0x73,0x2b,0x81,0x68,0x6, 0x7a,0x73,0x2b,0x81,0xd2,0x10,0x30,0x10, +0x9, 0xc2,0x10,0x12,0x27,0xe0,0xe4,0x12,0xa, 0x66,0x12,0x19,0x7a,0x12,0x97,0x30, +0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43,0x38,0xe8,0x7e,0x50,0xa, 0xac, +0x45,0x12,0x27,0xf7,0xe5,0xc, 0x30,0xe6,0x4e,0x53,0xc, 0xbf,0x7e,0x73,0x38,0xd4, +0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x38,0xd4,0xa9,0xd5,0xcb,0x74,0xe, +0x12,0x7, 0xfb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63,0x38,0xd4,0xa, 0x26,0x2e,0x24, +0x0, 0x3, 0x12,0x43,0xe2,0x7c,0x65,0x4c,0x76,0x74,0xe, 0x12,0x3a,0x6a,0x12,0x7, +0xfb,0x12,0x3a,0xb5,0x7e,0x73,0x38,0xd7,0x7a,0x73,0x2b,0x33,0x7e,0x73,0x38,0xd6, +0x7a,0x73,0x2b,0x3e,0x12,0xb0,0xe, 0xe5,0xc, 0x30,0xe5,0xa, 0x53,0xc, 0xdf,0x7e, +0xb3,0x38,0xbe,0x2, 0x20,0x17,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x7e,0xa0,0x4, +0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, 0x12,0x20,0x7f,0x38, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80,0x1a,0xbe,0xd0,0x81, +0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x20,0x7f,0x40,0x4, 0x7c,0xeb,0x7c, +0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c,0xdd,0x7c,0xbd,0x12, +0x20,0x8b,0x12,0x22,0xd4,0x12,0x27,0x5e,0x12,0x22,0x7a,0x7e,0x73,0x2b,0x2e,0x7a, +0x73,0x38,0xe6,0x12,0x38,0x27,0x7a,0xd3,0x38,0xbe,0xda,0x79,0xda,0xd8,0x22,0x7e, +0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26,0x33,0xbc,0xbe,0x22,0xca,0xf8,0x7c,0xfb,0x74, +0x5, 0xac,0xbf,0x12,0x27,0x67,0x12,0x27,0x55,0x12,0x27,0x43,0x12,0x27,0x4c,0x7a, +0xf3,0x0, 0x62,0x7c,0xbf,0x12,0x9b,0x97,0x12,0x21,0x43,0x74,0x5, 0xac,0xbf,0x9, +0xb5,0x26,0x37,0x12,0x98,0xdf,0x12,0x19,0x6c,0xe4,0x7a,0xb3,0x16,0x91,0x7a,0xb3, +0x37,0xe2,0x7a,0xb3,0x16,0x92,0xda,0xf8,0x22,0x7e,0xb3,0x37,0x6c,0x60,0x6, 0x14, +0x7a,0xb3,0x37,0x6c,0x22,0x12,0x97,0xd2,0x7e,0xb3,0x37,0xf3,0x70,0xe, 0x7e,0xb3, +0x39,0xe3,0xb4,0x1, 0x7, 0xe4,0x12,0x20,0x8b,0x12,0x95,0xf6,0x12,0x21,0x3, 0x12, +0x94,0x51,0x7e,0xa3,0x37,0xf3,0x7a,0xa3,0x39,0xe3,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x20,0x8b,0x22,0x12,0x93,0xc2,0x2, 0x21,0x9, 0x7e,0xb3,0x37,0x6f,0x60,0xf, 0x74, +0x1, 0x7a,0xb3,0x37,0x77,0x7e,0xb3,0x37,0xe5,0x70,0x3, 0x12,0x96,0x67,0x7e,0xb3, +0x37,0x77,0xb4,0x1, 0xc, 0x74,0x3, 0x7a,0xb3,0x35,0xb6,0x7e,0x34,0x14,0x0, 0x80, +0x9, 0xe4,0x7a,0xb3,0x35,0xb6,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0x2a,0x81,0x22,0x7a, +0xb3,0x2b,0x2e,0x12,0x21,0xa5,0x7a,0x37,0x2b,0x3a,0x22,0x7e,0xa3,0x0, 0x62,0xbe, +0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xff,0x68,0x42,0x74,0x5, 0xa4,0x12,0x27,0x67, +0x12,0x21,0x9d,0x12,0x27,0x55,0x12,0x21,0x9d,0x12,0x27,0x4c,0x12,0x27,0xfe,0x50, +0x9, 0x7e,0xb3,0x0, 0x62,0x12,0x9b,0x97,0x80,0x6, 0x12,0x21,0x9d,0x12,0x27,0x43, +0x12,0x21,0x43,0x12,0x27,0x3c,0x7e,0x73,0x2b,0x33,0xa, 0x37,0x7e,0xf, 0x39,0x9b, +0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x62,0x7a,0x73,0x3, 0xff,0x22,0x7e,0xa3,0x0, +0x62,0x74,0x5, 0xa4,0x22,0x7e,0x23,0x2b,0x2e,0x7e,0x33,0x38,0xe5,0xac,0x23,0x2e, +0x14,0x1, 0xf4,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, 0xa, 0x7e,0x63,0x2b, +0x2f,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe,0x14,0x7, 0x8, 0x40, +0x3, 0xe4,0x80,0x2, 0x74,0x1, 0x7a,0xb3,0x2b,0x2f,0x7e,0x73,0x2b,0x2f,0xbc,0x76, +0x68,0x2, 0xd2,0x10,0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c,0x17,0xbe,0x10, +0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x39,0x93,0x69,0x51,0x0, 0x86,0x54,0x1f, +0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x5, 0x79,0x1, +0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, 0x15,0xc8,0x12, +0x21,0x3f,0x30,0x10,0xc, 0xc2,0x10,0x12,0x27,0xe0,0x30,0x0, 0x4, 0xe4,0x12,0xa, +0x66,0x30,0x0, 0x9, 0x12,0x98,0xad,0x12,0x97,0x30,0x2, 0x7e,0xc, 0x22,0x7e,0xb, +0x70,0x7a,0x73,0x2b,0x2e,0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b,0x81,0x29,0x70,0x0, +0x1, 0x7a,0x73,0x2b,0x33,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b,0x3f,0x12,0x21,0x43, +0x12,0x27,0x3c,0xd2,0x0, 0xc2,0x1, 0x2, 0x22,0x6a,0x30,0x0, 0x3, 0x12,0x22,0xd4, +0xa2,0x1, 0x92,0x2, 0x12,0x82,0x93,0x2, 0x22,0x7a,0x7e,0x73,0x2b,0x3f,0x7a,0x73, +0x38,0xd5,0x22,0x74,0x40,0x7a,0xb3,0x2b,0x3f,0x12,0x27,0xfe,0x50,0x9, 0xd2,0x0, +0xd2,0x1, 0x12,0x22,0x6a,0x80,0x1c,0x74,0x1, 0x12,0x22,0xdd,0x7e,0x43,0x38,0xd3, +0x7e,0x50,0x64,0xac,0x45,0x12,0x80,0x89,0x7a,0xb3,0x2b,0x3e,0x7e,0xf, 0x39,0xac, +0x12,0x27,0x70,0x12,0x22,0x7a,0x12,0x27,0x5e,0x2, 0x22,0xd4,0x7e,0x73,0x2b,0x2e, +0x7a,0x73,0x38,0xe6,0x7e,0x73,0x2b,0x3e,0x7a,0x73,0x38,0xd6,0x7e,0x73,0x2b,0x3f, +0x7a,0x73,0x38,0xd5,0x7e,0x73,0x2b,0x33,0x7a,0x73,0x38,0xd7,0x22,0xca,0x3b,0x7c, +0xdb,0xe4,0x7a,0xb3,0x2b,0x33,0x12,0x27,0xf0,0x7e,0xc0,0xa, 0x12,0x67,0xef,0x30, +0xf, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x1f,0x39,0xac,0x12,0x81,0x5, 0x7d,0x73, +0xbe,0x74,0xff,0xff,0x78,0x9, 0x12,0x23,0x4d,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe, +0x74,0x80,0x0, 0x28,0x7, 0x12,0x23,0x4d,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, +0x28,0xc, 0x12,0x23,0x4d,0xb, 0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0, +0x1, 0x78,0x9, 0x7e,0x1f,0x39,0xac,0x12,0x80,0xa8,0x7d,0x73,0x7e,0x1f,0x39,0x9b, +0x69,0x31,0x0, 0x1a,0x7a,0x73,0x2b,0x33,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x39, +0x9b,0x2e,0x14,0x0, 0x1a,0xb, 0xa, 0x30,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x73,0x0, +0x62,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac,0x3f,0x12,0x23,0xcf,0xca,0x39,0x7e, +0x30,0x38,0xac,0x3f,0x12,0x23,0xe8,0x12,0x17,0x2e,0x1b,0xfd,0x7e,0x34,0x0, 0x8c, +0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0x23,0xdd,0x12,0x17,0x2e,0x1b,0xfd,0xb, +0xf0,0xbe,0xf0,0x4, 0x40,0xc7,0x7e,0x23,0x0, 0x62,0x7e,0x30,0x5, 0xac,0x23,0x12, +0x23,0xcf,0xca,0x39,0x7e,0x23,0x0, 0x62,0x7e,0x30,0x38,0xac,0x23,0x12,0x23,0xe8, +0x12,0x17,0x2e,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x62,0x7e, +0x30,0x8c,0xac,0x23,0x12,0x23,0xdd,0x12,0x17,0x2e,0x1b,0xfd,0xda,0xf8,0x22,0x2e, +0x14,0x26,0x33,0x6d,0x0, 0x12,0x22,0x3e,0x7e,0x34,0x0, 0x38,0x22,0x2e,0x14,0x1, +0x43,0x6d,0x0, 0x7e,0x18,0x3, 0x73,0x22,0x2e,0x14,0x0, 0x63,0x6d,0x0, 0x7e,0x18, +0x34,0x0, 0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93,0x7c,0xdb,0x90,0x60, +0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x93,0xbc,0x7e,0x28,0x4, 0x7c,0xf7,0x80, +0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x8c,0x7a,0xe3,0x2a,0x8d,0x7a,0xd3,0x2a,0x90,0x7a, +0xe3,0x2a,0x91,0x7a,0xd3,0x2a,0x92,0x7a,0xe3,0x2a,0x93,0x74,0x1, 0x7a,0xb3,0x2a, +0x96,0x7a,0xd3,0x2a,0x8e,0xa, 0x3e,0x1b,0x34,0x7a,0x73,0x2a,0x8f,0x90,0x60,0x91, +0xe4,0x93,0x7a,0xb3,0x2a,0x97,0x90,0x60,0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x98,0xa, +0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x99,0x12, +0x17,0x2e,0x1b,0xfd,0xa, 0x3f,0xca,0x39,0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff, +0x7e,0x8, 0x2a,0xbc,0x12,0x17,0x2e,0x1b,0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e, +0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x40,0x12,0x17,0x2e,0x1b,0xfd, +0x12,0x98,0xe, 0x12,0x64,0x10,0x7a,0xd3,0x2a,0x94,0x7a,0xe3,0x2a,0x95,0x12,0x57, +0xe8,0x74,0x1, 0x12,0x25,0x96,0xe4,0x7a,0xb3,0x2b,0x20,0x7a,0xb3,0x2b,0x21,0x12, +0x59,0x2d,0x7a,0x37,0x2b,0x2c,0x74,0x3, 0x7a,0xb3,0x2b,0x22,0xe4,0x7a,0xb3,0x2b, +0x23,0x74,0x2, 0x7a,0xb3,0x2b,0x24,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2b,0x26,0x74, +0x4, 0x7a,0xb3,0x2b,0x25,0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x28,0x7e,0x34,0x20, +0x5f,0x7a,0x37,0x2b,0x2a,0x74,0x20,0x7a,0xb3,0x2b,0x81,0x74,0x1, 0x7a,0xb3,0x2b, +0x2f,0x74,0x20,0x7a,0xb3,0x2b,0x30,0x74,0x4, 0x7a,0xb3,0x2b,0x32,0x74,0x38,0x12, +0x21,0x3f,0xe4,0x7a,0xb3,0x2b,0x3c,0x7a,0xb3,0x2b,0x3d,0x7e,0x34,0x1, 0xf4,0x7a, +0x37,0x2b,0x38,0x74,0x1, 0x7a,0xb3,0x2b,0x31,0x74,0x7f,0x7a,0xb3,0x2b,0x3f,0x74, +0x64,0x7a,0xb3,0x2b,0x3e,0x6d,0x33,0x7a,0x37,0x2b,0x34,0x7a,0x37,0x2b,0x36,0x74, +0x2, 0x7a,0xb3,0x2b,0x33,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x89,0x74,0x4, 0x7a, +0xb3,0x2b,0x86,0x7e,0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x87,0xe4,0x7a,0xb3,0x2b,0x85, +0x7e,0x34,0x4, 0x6d,0x7a,0x37,0x2b,0x8b,0x74,0x1, 0x7a,0xb3,0x2b,0x82,0x74,0x5, +0x7a,0xb3,0x2b,0x83,0xe4,0x7a,0xb3,0x2b,0x84,0x74,0x1, 0x7a,0xb3,0x2b,0x7f,0xe4, +0x7a,0xb3,0x2b,0x80,0x7e,0x34,0x16,0xd0,0x7a,0x37,0x2b,0x8d,0xa, 0x3e,0xca,0x39, +0x7e,0x34,0x60,0xfb,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x63,0x12,0x17,0x2e,0x1b, +0xfd,0xda,0x79,0xda,0xd8,0x22,0x7a,0xb3,0x2b,0x1f,0x70,0x14,0x12,0x36,0x1c,0x12, +0x25,0xc5,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4,0x7e,0x18,0x4, 0x7e,0x80,0x10, +0xb4,0x1, 0x11,0x12,0x36,0x13,0x12,0x25,0xc5,0x12,0x57,0xd2,0x7e,0x18,0x4, 0x0, +0x7a,0x1f,0x6, 0xf8,0x22,0x7a,0x1f,0x2b,0x1b,0x7a,0xf, 0x2b,0x17,0x22,0x74,0x1, +0x12,0x0, 0x1e,0xe4,0x12,0x25,0x96,0x12,0x25,0xe6,0xe4,0x12,0x0, 0x1e,0x74,0x1, +0x12,0x25,0x96,0x2, 0x25,0xe6,0xca,0x3b,0x7e,0xd3,0x2a,0x92,0x7e,0xc3,0x2a,0x93, +0x7e,0x8, 0x1f,0x44,0x12,0xa7,0x27,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12, +0x17,0x53,0x7e,0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x17,0x53,0x7e,0x8, +0x1f,0xda,0x7e,0x34,0x0, 0xa, 0x12,0x17,0x53,0x7e,0xf3,0x2b,0x1b,0x7e,0x18,0x2a, +0xfb,0x7a,0x1d,0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e, +0x8, 0x2a,0xd8,0x12,0xa7,0xf7,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xfb, +0xa, 0x3a,0x2e,0x34,0x16,0xe8,0x12,0x6e,0x51,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13, +0xa, 0x3e,0x12,0x26,0xfe,0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2b,0x1a,0x19, +0xb4,0x1f,0x8a,0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, +0xa3,0x2a,0xd8,0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x26, +0xfe,0xa, 0x4a,0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2b,0x1a,0x19,0xb4,0x1f,0xa6,0xb, +0xe0,0xbc,0xde,0x38,0xd8,0x7e,0xb3,0x2b,0x1c,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e, +0x18,0x1f,0xd0,0x12,0xa6,0x4f,0x80,0x3, 0x12,0xa7,0xe6,0x6c,0xee,0x7e,0x18,0x1f, +0xe4,0x7a,0x1f,0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f, +0x38,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, +0xac,0x7e,0x2e,0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac, +0x7e,0x2e,0x34,0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c, +0x7e,0x12,0x8, 0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37, +0x2b,0x1d,0x7e,0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x38,0xf, 0x12,0x27,0xe0,0x12, +0x13,0xf5,0x12,0xa7,0x5a,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x27,0xf7, +0x74,0x1, 0x12,0x25,0x96,0x12,0x6a,0x70,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12, +0x25,0xce,0x7e,0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x8, 0x2a,0x8c, +0x2, 0x3, 0x8b,0x9, 0x75,0x26,0x35,0x7a,0x73,0x2b,0x3e,0x22,0x9, 0x75,0x26,0x36, +0x7a,0x73,0x2b,0x3f,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b,0x33,0x22,0x7e,0x73, +0x2b,0x3e,0x7a,0x73,0x38,0xd6,0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b,0x2e,0x22, +0x12,0x27,0x7a,0xb, 0x34,0x7a,0x73,0x2b,0x3f,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, +0x6c,0xaa,0xa, 0x4a,0x2e,0x44,0x60,0xac,0x12,0xa8,0xb6,0x7c,0x9b,0x7e,0xf3,0x2a, +0x8d,0xac,0xf9,0x7e,0xb3,0x2a,0x8f,0xa, 0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f, +0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc,0x2f,0x6, 0xb, 0xa0,0xbe,0xa0,0x3, 0x78, +0xd1,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, 0x7e,0x54,0x0, 0x3, 0x7f,0x10,0x7d, +0x15,0x12,0x15,0x75,0x7f,0x1, 0xb, 0xc, 0x7e,0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, +0x12,0x15,0x77,0xbe,0x34,0x0, 0xfa,0x28,0x4, 0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22, +0x7e,0x8, 0x2a,0x8c,0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x8c,0x74,0x3, 0x2, 0x11,0x7a, +0x7e,0x8, 0x2a,0x8c,0x2, 0xd, 0x72,0x7d,0x32,0x74,0xfa,0x2, 0x12,0xd0,0x7e,0xb3, +0x38,0xf, 0xb4,0x3, 0x8, 0x7e,0xb3,0x38,0xca,0x70,0x2, 0xc3,0x22,0xd3,0x22,0x12, +0x3f,0x81,0x12,0x62,0xbc,0x12,0x28,0x31,0x12,0x19,0x5a,0x7e,0xb3,0x38,0xf, 0x24, +0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x40,0x98,0x80,0xef,0x12,0x1b,0xd2,0x80, +0xea,0x12,0x58,0x3f,0x12,0x23,0xf3,0x12,0x0, 0x9, 0x12,0x57,0xd2,0x7e,0x18,0x4, +0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8,0x7e,0x1f,0x6, 0xf4,0x12,0x68,0x21, +0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e,0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a, +0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12,0x67,0xfe,0x12,0x0, 0x46,0x12,0x50, +0xbf,0x12,0x63,0x59,0x12,0x63,0xed,0x2, 0x28,0x7a,0xe4,0x7a,0xb3,0x34,0x38,0x7a, +0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x28,0x95, +0x7e,0x34,0x2, 0x26,0x7a,0x37,0x28,0x99,0x7e,0x34,0x0, 0x96,0x7a,0x37,0x28,0x97, +0x7a,0x37,0x28,0x9b,0x7e,0x34,0x0, 0x50,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x0, 0x27, +0x7a,0x37,0x28,0x9f,0x12,0xaf,0x90,0x74,0x1, 0x7a,0xb3,0x28,0xa5,0xe4,0x7a,0xb3, +0x28,0xa8,0x12,0x28,0xcf,0x3e,0x34,0x7e,0x8, 0x25,0xf7,0xe4,0x2, 0x17,0x53,0x90, +0x60,0x9a,0x93,0xa, 0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3d,0x0, 0x7e,0xb3,0x2a, +0x8e,0xf5,0x42,0x7e,0xb3,0x2a,0x8f,0xf5,0x43,0x75,0x44,0x28,0x7e,0xd3,0x28,0x84, +0xe4,0x7a,0xb3,0x31,0xef,0x7a,0xb3,0x31,0xeb,0x7a,0xb3,0x31,0xec,0x7e,0x8, 0x31, +0xf0,0x12,0x28,0xcf,0xe4,0x12,0x17,0x53,0x12,0x28,0xcf,0x3e,0x34,0x7e,0x8, 0x32, +0x10,0xe4,0x12,0x17,0x53,0xbe,0xd0,0x2, 0x50,0x2, 0x81,0xb2,0x6c,0xcc,0x81,0xac, +0x12,0xaf,0xc5,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, +0x3c,0x9, 0xb3,0x31,0xf0,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x31, +0xf0,0x7c,0xbd,0x14,0xbc,0xbc,0x78,0x2, 0x81,0xb2,0xa, 0x5c,0xb, 0x54,0xf5,0x2e, +0x81,0xa3,0x7e,0x71,0x2e,0x12,0x2f,0xac,0x7a,0xa1,0x26,0x9, 0xb3,0x26,0xfb,0xf5, +0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0x7f,0x7c,0xb7,0xf5,0x28,0xe5,0x27,0xa, 0x2b, +0xe5,0x25,0x12,0x2f,0x7f,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0,0x5, 0x40,0x2, +0x81,0xa1,0xe5,0x29,0xbe,0xb0,0x5, 0x40,0x2, 0x81,0xa1,0x12,0x2f,0xb5,0x12,0x9d, +0xbb,0x7a,0xb3,0x31,0xee,0x85,0x25,0x54,0x85,0x26,0x55,0x85,0x27,0x56,0x7e,0x8, +0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5,0x24,0x12,0xa0,0x9e,0x75,0x3d,0x0, 0x6c,0xee, +0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71,0x25,0x12,0x2c,0xb9,0x7a,0x35,0x35,0xe5,0x26, +0x7e,0x71,0x27,0x12,0x2c,0xb9,0x7a,0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, +0x5, 0x7e,0x35,0x37,0x80,0x3, 0x7e,0x35,0x35,0x7a,0x35,0x3b,0xe, 0x34,0x7a,0x35, +0x39,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2c,0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x25,0x7c, +0xbf,0x30,0xe1,0x20,0xe5,0x26,0x7e,0x71,0x25,0x12,0x2c,0xb9,0x7d,0x43,0xe5,0x24, +0x7e,0x71,0x27,0x12,0x2c,0xb9,0x2d,0x34,0xbe,0x35,0x39,0x18,0x2, 0x81,0x38,0x75, +0x30,0x1, 0x81,0x38,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, +0x38,0x2, 0x81,0x38,0xe5,0x28,0xbe,0xb0,0x5, 0x40,0x2, 0x81,0x38,0xe5,0x29,0xbe, +0xb0,0x5, 0x40,0x2, 0x81,0x38,0x7c,0xbf,0x20,0xe0,0x2, 0x81,0x38,0x6d,0x33,0x7a, +0x35,0x4d,0x75,0x4f,0x0, 0x7a,0x35,0x50,0x75,0x52,0x0, 0xc2,0x2, 0xc2,0x3, 0xe5, +0x26,0xbe,0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26, +0xbe,0xb1,0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe, +0xb1,0x25,0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1, +0x25,0x50,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a, +0x78,0x29,0xd2,0x2, 0xe5,0x2a,0x60,0x8, 0xe5,0x42,0x14,0xbe,0xb1,0x2a,0x78,0x2, +0xd2,0x3, 0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x42,0xa, 0x2b,0x1b, +0x24,0xe5,0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b, +0x78,0x29,0xd2,0x2, 0xe5,0x2b,0x60,0x8, 0xe5,0x43,0x14,0xbe,0xb1,0x2b,0x78,0x2, +0xd2,0x3, 0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x43,0xa, 0x2b,0x1b, +0x24,0xe5,0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3e,0x80,0x5b, +0x85,0x2b,0x3f,0x80,0x4d,0xe5,0x3e,0x7e,0x71,0x3f,0x12,0x2c,0xb9,0x7a,0x35,0x40, +0xe5,0x2a,0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x2b, +0xbe,0xb1,0x3f,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3f,0x78,0xd, 0x7e,0x35,0x40,0x2e, +0x35,0x4d,0x7a,0x35,0x4d,0x5, 0x4f,0x80,0x17,0x5, 0x52,0x7e,0x35,0x40,0x2e,0x35, +0x50,0x7a,0x35,0x50,0x7e,0x35,0x33,0xbe,0x35,0x40,0x58,0x2, 0x5, 0x3d,0xb, 0xe0, +0x5, 0x3f,0xe5,0x2d,0xbe,0xb1,0x3f,0x50,0xac,0x5, 0x3e,0xe5,0x2c,0xbe,0xb1,0x3e, +0x50,0x9e,0xe5,0x2c,0x7e,0x71,0x2b,0x12,0x2c,0xb9,0x7e,0x45,0x4d,0x9d,0x43,0xe5, +0x2a,0x7e,0x71,0x2d,0x12,0x2c,0xb9,0x9d,0x43,0xe5,0x2a,0x7e,0x71,0x2b,0x12,0x2c, +0xb9,0x9d,0x43,0xe5,0x2c,0x7e,0x71,0x2d,0x12,0x2c,0xb9,0x7d,0x23,0x7d,0x34,0x9d, +0x32,0x7a,0x35,0x4d,0x7e,0x35,0x37,0x2e,0x35,0x35,0x7a,0x35,0x39,0x30,0x2, 0x10, +0x20,0x3, 0xd, 0x7e,0x35,0x4d,0x9e,0x35,0x39,0x7a,0x35,0x4d,0x15,0x4f,0x15,0x4f, +0xe5,0x4f,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x4f,0x24,0xfc,0xf5,0x4f,0x7e,0x35,0x4d, +0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x7a,0x35,0x4d,0x75,0x44,0x22,0xe5,0x42, +0x14,0xbe,0xb1,0x24,0x68,0xd, 0xbe,0xb1,0x26,0x68,0x8, 0xe5,0x24,0x60,0x4, 0xe5, +0x26,0x70,0x8, 0x12,0xa1,0x2d,0x28,0x3, 0x75,0x44,0x2c,0x7e,0x15,0x50,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x4d,0x1a,0x26,0x1a,0x24,0x2f,0x10,0xe5,0x44,0xa, 0x1b,0x6d, +0x0, 0x12,0x15,0x5b,0x7f,0x71,0x7a,0x7d,0x45,0x7e,0x15,0x39,0x1a,0x2, 0x1a,0x0, +0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x15,0x5b,0xe5,0x52,0xa, 0xdb,0x6d,0xcc, +0xe5,0x4f,0xa, 0x1b,0x6d,0x0, 0x2f,0x6, 0x12,0x15,0x5b,0x7a,0x1d,0x49,0xbf,0x71, +0x8, 0x3, 0x75,0x30,0x2, 0xc2,0x1, 0x20,0xc, 0xe, 0x12,0x2f,0xb5,0x12,0xa2,0x39, +0x92,0x1, 0x20,0x1, 0x3, 0x75,0x30,0x0, 0xe5,0x30,0xbe,0xb0,0x0, 0x28,0x62,0xe5, +0x30,0xa, 0x3b,0x2e,0x34,0x31,0xea,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2e, +0xa, 0x3b,0x9, 0xa3,0x31,0xf0,0x4c,0xaa,0x78,0xc, 0xa, 0x2c,0x9, 0xb2,0x31,0xf0, +0x19,0xb3,0x31,0xf0,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x31,0xf0,0xf5,0x53,0xbc,0xba, +0x28,0x3, 0x7a,0xa1,0x53,0x75,0x2f,0x0, 0x80,0x22,0x9, 0x33,0x31,0xf0,0xe5,0x2f, +0xa, 0x2b,0x9, 0x22,0x31,0xf0,0xbc,0x23,0x68,0xa, 0xa, 0xc, 0x9, 0x30,0x31,0xf0, +0xbc,0x23,0x78,0x6, 0xe5,0x53,0x19,0xb2,0x31,0xf0,0x5, 0x2f,0xbe,0xd1,0x2f,0x38, +0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x21,0x52,0xb, 0xc0,0xbc,0xdc,0x28,0x2, +0x21,0x20,0xda,0x3b,0x22,0x7c,0xba,0x7c,0x79,0x12,0x4c,0x21,0xb, 0x1a,0x30,0x22, +0xca,0x3b,0x6d,0xee,0x7e,0xc3,0x2a,0x8d,0x7e,0xd3,0x2a,0x8c,0x7e,0xb3,0x38,0x38, +0xb4,0x1, 0x3, 0xe4,0xa1,0xf6,0x7e,0xb3,0x28,0x84,0x70,0x2, 0xa1,0x65,0x7e,0xb3, +0x2a,0x21,0x60,0x2, 0x80,0x7f,0x7e,0xa3,0x26,0xfa,0x7e,0x73,0x26,0xfb,0x7a,0x71, +0x24,0x6c,0xee,0x6d,0xff,0x6c,0xff,0xa, 0x47,0x80,0x20,0x12,0x2c,0xb5,0xbe,0x34, +0x0, 0x96,0x8, 0x1d,0xb, 0xe0,0xbe,0xa0,0x0, 0x28,0x6, 0x7c,0xba,0x14,0x12,0x2d, +0xfc,0x12,0x2f,0x95,0x58,0x3, 0x12,0x2d,0xf9,0x1b,0x44,0xbe,0x44,0x0, 0x0, 0x58, +0xda,0xe5,0x24,0xa, 0x4b,0x80,0x1e,0x12,0x2c,0xb5,0xbe,0x34,0x0, 0x96,0x8, 0x21, +0xb, 0xe0,0xbe,0xa0,0x0, 0x28,0x6, 0x7c,0xba,0x14,0x12,0x2d,0xfc,0x12,0x2f,0x95, +0x58,0x3, 0x12,0x2d,0xf9,0x7d,0x24,0xb, 0x24,0x7d,0x42,0xa, 0x3c,0xbd,0x23,0x48, +0xd6,0xbe,0xe0,0x3, 0x50,0x2, 0x80,0xd, 0xa, 0x2f,0x7d,0x3f,0x12,0x15,0x29,0xbe, +0x34,0x0, 0x28,0x8, 0x7, 0xe4,0x7a,0xb3,0x36,0x45,0xa1,0xf6,0x6d,0xdd,0xbe,0xa0, +0x0, 0x28,0x8, 0x7c,0xba,0x14,0x12,0x2e,0x6, 0x2d,0xd3,0xa, 0x3d,0x1b,0x34,0xa, +0xca,0xbd,0xc3,0x58,0x8, 0x7c,0xba,0x4, 0x12,0x2e,0x6, 0x2d,0xd3,0x7e,0x70,0x8, +0x80,0x2a,0x7e,0x50,0x2, 0xac,0x57,0x7d,0xc2,0x2e,0xc4,0x17,0x65,0x7d,0x1c,0x7a, +0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0x1a,0xcb,0xbd,0xcd,0x8, 0xf, 0x7d,0xc2,0x2e, +0xc4,0x17,0x66,0x7d,0x2c,0x12,0x57,0xdf,0x1a,0xcb,0x2d,0xec,0x7c,0x67,0x1b,0x70, +0xa5,0xbe,0x0, 0xce,0x7c,0xba,0x12,0x2e,0x6, 0x12,0x17,0x85,0xbe,0x34,0xa, 0xf0, +0x8, 0x4, 0x2e,0xe4,0x0, 0x28,0xbe,0xe4,0x0, 0xfa,0x28,0x4, 0x7e,0xe4,0x0, 0xfa, +0x7e,0xb3,0x36,0x45,0xa, 0x3b,0xbd,0x3e,0x50,0x8, 0x7d,0x3e,0x7c,0xb7,0x7a,0xb3, +0x36,0x45,0x7e,0xb3,0x36,0x45,0xda,0x3b,0x22,0x7c,0xba,0x4, 0x7c,0x79,0x12,0x2c, +0xb9,0x2d,0xf3,0xb, 0xf0,0x22,0x7e,0x71,0x24,0x2, 0x2c,0xb9,0xca,0x3b,0x7f,0x40, +0x7e,0xe3,0x28,0x84,0x6c,0xdd,0x7e,0xc0,0x1, 0x80,0x1a,0xa, 0x3d,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0x60,0xa, 0x2c,0x7f,0x4, 0x2d,0x12,0x7e,0xb, 0x70,0xbc,0x76,0x40, +0x2, 0x7c,0xdc,0xb, 0xc0,0xbc,0xec,0x38,0xe2,0xa, 0x3d,0x2d,0x39,0x7d,0x28,0x7e, +0x1b,0xd0,0x6c,0xff,0x7e,0xc0,0x1, 0xe1,0x71,0x75,0x2d,0x0, 0x6d,0x33,0x7a,0x35, +0x2e,0x7a,0x35,0x25,0x7a,0x35,0x27,0x7e,0x18,0x1f,0x70,0x7a,0x1d,0x29,0x74,0xff, +0x7e,0x34,0x1f,0x71,0x7e,0x24,0x0, 0x0, 0x7a,0x1b,0xb0,0x7e,0x1d,0x29,0x7a,0x1b, +0xb0,0xe4,0x7e,0x1d,0x29,0x39,0xb1,0x0, 0x3, 0x7e,0x1d,0x29,0x39,0xb1,0x0, 0x2, +0x7e,0x1d,0x29,0x12,0x9f,0xe1,0x44,0x1, 0x7a,0x1b,0xb0,0x75,0x24,0x0, 0x80,0x6c, +0x12,0x2f,0xa9,0x9, 0x93,0x26,0xfb,0xe5,0x24,0x12,0x43,0x2d,0xbc,0xbc,0x78,0x5a, +0x5, 0x2d,0xa, 0x3a,0x2e,0x35,0x25,0x7a,0x35,0x25,0xa, 0x39,0x2e,0x35,0x27,0x7a, +0x35,0x27,0x12,0x2c,0xb5,0xbe,0x35,0x2e,0x8, 0x6, 0x12,0x2c,0xb5,0x7a,0x35,0x2e, +0x7e,0x1d,0x29,0x7e,0x1b,0xb0,0xbc,0xba,0x28,0x3, 0x7a,0x1b,0xa0,0x7e,0x1d,0x29, +0x29,0xb1,0x0, 0x2, 0xbc,0xba,0x50,0x4, 0x39,0xa1,0x0, 0x2, 0x7e,0x1d,0x29,0x29, +0xb1,0x0, 0x1, 0xbc,0xb9,0x28,0x4, 0x39,0x91,0x0, 0x1, 0x7e,0x1d,0x29,0x29,0xb1, +0x0, 0x3, 0xbc,0xb9,0x50,0x4, 0x39,0x91,0x0, 0x3, 0x5, 0x24,0xbe,0xe1,0x24,0x38, +0x8f,0xe5,0x2d,0xbe,0xb0,0x0, 0x28,0x67,0x7e,0xd, 0x29,0x12,0x9e,0x15,0xe5,0x2d, +0xa, 0x2b,0x7e,0x15,0x25,0x8d,0x12,0x7a,0x15,0x25,0x7e,0x35,0x27,0x8d,0x32,0x7a, +0x35,0x27,0x7e,0x55,0x25,0x12,0x2f,0x8d,0x19,0xa3,0x32,0x10,0x7e,0x55,0x27,0x12, +0x2f,0x8d,0x19,0xa3,0x32,0x11,0x7e,0x37,0x28,0x8a,0xbe,0x35,0x2e,0x78,0xe, 0x7e, +0x35,0x25,0x7a,0x73,0x28,0x8c,0x7e,0x35,0x27,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x32, +0xe, 0x4d,0x33,0x68,0x18,0x7e,0x55,0x25,0x7e,0x35,0x27,0x12,0x2c,0xb9,0x7e,0x25, +0x2e,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x37,0x32,0xe, 0x1b,0x38,0x20,0xb, 0xf0,0xb, +0xc0,0xbc,0xdc,0x40,0x2, 0xc1,0x49,0x12,0x9b,0xcc,0x7c,0xbf,0xda,0x3b,0x22,0xa, +0x3b,0x9d,0x32,0x2, 0x17,0x85,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c,0xb9,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7f,0x22,0xa, 0x2d,0x1b,0x24,0xa, 0x3a,0xbd,0x32,0x22,0x12,0x4e, +0xe1,0x12,0x2c,0xc0,0x7a,0xb3,0x2a,0x2a,0x22,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b, +0x9, 0xa3,0x26,0xfa,0x22,0xe5,0x24,0x7e,0x71,0x25,0x7e,0x61,0x26,0x7e,0x51,0x27, +0x22,0xca,0xf8,0x7c,0xab,0xbe,0xa0,0x34,0x38,0x3, 0x2, 0x30,0xd5,0xbe,0xa0,0x35, +0x78,0x7, 0x7e,0xb3,0x2b,0x2f,0x2, 0x31,0xeb,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0, +0x37,0x78,0x1e,0x7e,0x35,0x8, 0x7d,0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x34, +0x8a,0x7e,0x39,0xb0,0xbe,0xa0,0x37,0x68,0x3, 0x2, 0x31,0xeb,0x75,0x1a,0x36,0x21, +0xeb,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0,0x39,0x78,0x1b,0x7e,0xf3,0x38,0xd8,0x7c, +0xbf,0x4, 0x7a,0xb3,0x38,0xd8,0xbe,0xa0,0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f, +0x9, 0xb3,0x2b,0x40,0x21,0xeb,0xbe,0xa0,0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b, +0x7e,0xf3,0x38,0xda,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xda,0xbe,0xa0,0x3b,0x78,0x3, +0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b,0x63,0x21,0xeb,0xbe,0xa0,0xfb,0x78,0x6, +0x7e,0xb3,0x2b,0x31,0x21,0xeb,0xbe,0xa0,0x5e,0x78,0x26,0x7e,0xf, 0x39,0x93,0x69, +0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, +0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, 0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x21, +0xeb,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0,0x3d,0x78,0x1b,0x7e,0xf3,0x38,0xdc,0x7c, +0xbf,0x4, 0x7a,0xb3,0x38,0xdc,0xbe,0xa0,0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f, +0x9, 0xb3,0x2a,0x99,0x21,0xeb,0xbe,0xa0,0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b, +0x7e,0xf3,0x38,0xde,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xde,0xbe,0xa0,0x3f,0x78,0x3, +0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a,0xbc,0x21,0xeb,0xbe,0xa0,0x40,0x40,0xd, +0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, 0xb3,0x38,0xb4,0x21,0xeb,0xbe,0xa0,0x4e, +0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e,0xf3,0x38,0xf9,0x7c,0xbf,0x4, 0x7a,0xb3, +0x38,0xf9,0xbe,0xa0,0x4f,0x78,0x3, 0x75,0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x34,0x88, +0x7e,0x39,0xb0,0x21,0xeb,0xbe,0xa0,0x51,0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e, +0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, 0xff,0x7e,0xb3,0x39,0x4, 0xa, 0x3b,0x6d, +0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a,0xb3,0x39,0x4, 0xbe,0xa0,0x52,0x78,0x3, +0x75,0x1a,0x51,0x7c,0xb7,0x21,0xeb,0xbe,0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78, +0x1a,0x7e,0xf3,0x38,0xcd,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xcd,0xbe,0xa0,0x5d,0x78, +0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x31,0xee,0x21,0xeb,0xbe,0xa0,0x60,0x40,0xd, +0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, 0xb3,0x33,0x8f,0x80,0x7e,0xbe,0xa0,0x6d, +0x78,0x4, 0xe5,0xe, 0x80,0x75,0xbe,0xa0,0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18, +0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a,0x25,0xa, 0x9, 0xb3,0x34,0x90,0xbe,0xa0, +0xf5,0x78,0x58,0x75,0x1a,0xf4,0x80,0x53,0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1, +0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5,0xe7,0x80,0x40,0xbe,0xa0,0xf2,0x68,0x5, +0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10,0x3e,0x14,0x7e,0x1f,0x34,0x8c,0x2d,0x31, +0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, 0xa, 0x56,0x80,0x1f,0x7d,0x53,0x80,0x1b, +0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80,0x12,0xbe,0xa0,0xf7,0x78,0x4, 0x74,0x64, +0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xab, +0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x8d,0xbc,0xba,0x28,0x9, 0x74,0x2, 0xa4, +0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x8d,0xbc,0x1a,0x38,0x1c,0x7e,0x3, +0x2a,0x8c,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d,0x32, +0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x73,0x80,0x2d,0x7e,0x3, 0x2a,0x8c,0xa, 0x20, +0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, 0xac, +0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34,0x49, +0x23,0x3, 0x75,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, 0x1e, +0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca,0xf8, +0x80,0x38,0x7c,0xbf,0x12,0x31,0xee,0xa, 0x1b,0x7e,0x63,0x2a,0x8d,0x7e,0x70,0x2, +0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x12, +0x32,0xad,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x32,0xad,0x7e,0x73,0x2a,0x8d, +0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3,0x2a, +0x8c,0x74,0x2, 0xa4,0x22,0x12,0x37,0xeb,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18,0x38, +0xf4,0x7e,0x8, 0x25,0xee,0x12,0x17,0x2e,0x1b,0xfd,0x12,0x36,0x13,0x80,0x12,0xca, +0x39,0x7e,0x18,0x38,0xf4,0x7e,0x8, 0x2b,0x8f,0x12,0x17,0x2e,0x1b,0xfd,0x12,0x36, +0x1c,0x2, 0x25,0xc5,0xca,0xf8,0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x70, +0x77,0xd2,0x8, 0xa1,0x66,0xa5,0xbe,0x1, 0x3d,0x7a,0x73,0x38,0xb5,0xa5,0xbf,0xad, +0x2, 0x80,0x2f,0xa5,0xbf,0xae,0x4, 0xd2,0x9, 0xa1,0x66,0xa5,0xbf,0xaa,0x5, 0x12, +0xb0,0x5, 0x80,0x1e,0xa5,0xbf,0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x34,0x8a, +0x80,0x10,0xa5,0xbf,0xac,0x2, 0x80,0x2, 0xa1,0x66,0x7e,0x34,0x4, 0xfc,0x7a,0x37, +0x34,0x8a,0x6d,0x33,0x61,0xe2,0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b, +0x12,0x35,0x69,0xa5,0xbe,0x7, 0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0x66,0xa5,0xbe, +0x8, 0x2, 0x80,0x2, 0xa1,0x66,0x12,0x0, 0x66,0xa1,0x66,0xa5,0xbe,0xa, 0x9, 0x43, +0xc, 0x20,0x7a,0x73,0x38,0xbe,0xa1,0x66,0xa5,0xbe,0xb, 0x8, 0x12,0x35,0x69,0x12, +0x0, 0x6e,0xa1,0x66,0xbe,0x60,0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0x81,0xfe, +0xbe,0x60,0x1e,0x40,0xd, 0xbe,0x60,0x23,0x38,0x8, 0x12,0x35,0x6b,0x43,0xc, 0x40, +0xa1,0x66,0xbe,0x60,0x15,0x40,0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x35,0x6b,0xd2, +0x8, 0xa5,0xbe,0x15,0x2, 0x80,0x2, 0xa1,0x66,0x74,0x7, 0x7a,0xb3,0x38,0xb8,0xa1, +0x66,0xa5,0xbe,0x19,0x7, 0xe4,0x7a,0xb3,0x38,0xcd,0xa1,0x66,0xbe,0x60,0x24,0x40, +0x7, 0xbe,0x60,0x2c,0x38,0x2, 0x81,0xfe,0xa5,0xbe,0x2d,0x1b,0x12,0x35,0x6b,0x20, +0x9, 0x2, 0xa1,0x66,0x7e,0x63,0x38,0xe0,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32, +0x3e,0x34,0x7a,0x35,0x8, 0xa1,0x66,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38, +0x5, 0x43,0xc, 0x8, 0x81,0xfe,0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64, +0x38,0x2, 0x81,0xfe,0x7e,0x70,0x64,0x81,0xfe,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe, +0x39,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x38,0xd9,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xd9, +0xa, 0x2f,0x19,0x72,0x2b,0x40,0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0x66,0x75,0x1a, +0x38,0xa1,0x66,0xbe,0x60,0x3a,0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e, +0xf3,0x38,0xdb,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xdb,0xa, 0x2f,0x19,0x72,0x2b,0x63, +0xa5,0xbe,0x3b,0x2, 0x80,0x2, 0xa1,0x66,0x75,0x1a,0x3a,0xa1,0x66,0xa5,0xbe,0xfb, +0x9, 0x43,0xc, 0x4, 0x7a,0x73,0x2b,0x31,0xa1,0x66,0xa5,0xbe,0x50,0x6, 0x7a,0x73, +0x39,0x4, 0xa1,0x66,0xbe,0x60,0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, +0x7e,0xf3,0x38,0xdd,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xdd,0xa, 0x2f,0x19,0x72,0x2a, +0x99,0xa5,0xbe,0x3d,0x2, 0x80,0x2, 0xa1,0x66,0x75,0x1a,0x3c,0xa1,0x66,0xbe,0x60, +0x3e,0x68,0x4, 0xa5,0xbe,0x3f,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x38,0xdf,0x7c,0xbf, +0x4, 0x7a,0xb3,0x38,0xdf,0xa, 0x2f,0x19,0x72,0x2a,0xbc,0xa5,0xbe,0x3f,0x2, 0x80, +0x2, 0xa1,0x66,0x75,0x1a,0x3e,0xa1,0x66,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42, +0x38,0x8, 0x12,0x35,0x6b,0x75,0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x35, +0x6b,0x75,0xd, 0x2, 0x12,0x32,0xb5,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x35,0x6b, +0x12,0x35,0xd9,0x80,0x71,0xbe,0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x35, +0x6b,0x80,0x63,0xbe,0x60,0x4e,0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e, +0xf3,0x38,0xfa,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xfa,0xa, 0x2f,0x2e,0x27,0x34,0x88, +0x7a,0x29,0x70,0xa5,0xbe,0x4f,0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, +0x7a,0x71,0xe, 0x80,0x31,0xbe,0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c, +0x16,0x2e,0x10,0x20,0x7c,0xb7,0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e, +0x5, 0x10,0x3e,0x4, 0x7e,0x1f,0x34,0x8c,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5, +0xbe,0xf6,0x3, 0x7a,0x71,0xf, 0xda,0xf8,0x22,0xd2,0x8, 0xa, 0x26,0x19,0x72,0x38, +0xb4,0x22,0x7c,0x6b,0x12,0x35,0xd1,0x78,0x5, 0x7c,0xb6,0x2, 0x70,0xa2,0xb4,0x4, +0x5, 0x7c,0xb6,0x2, 0x32,0xe4,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5,0x18,0x70,0x9, +0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5,0x1a,0x12,0x35, +0x72,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12,0x35,0xb2,0xf5, +0x91,0x22,0x7c,0x7b,0x6c,0xaa,0x12,0x35,0xd1,0x78,0x9, 0x7c,0xb7,0x12,0x71,0x76, +0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, 0x7c,0xb7,0x12,0x2f,0xc1,0x7c,0xab,0x7c,0xba, +0x22,0x7e,0xb3,0x38,0xb4,0xc4,0x54,0x7, 0x22,0x12,0x37,0xeb,0xb4,0x1, 0x17,0xca, +0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x38,0xf4,0x12,0x17,0x2e,0x1b,0xfd,0x12,0x38, +0x30,0x12,0x36,0x13,0x80,0x1a,0xca,0x39,0x7e,0x18,0x2b,0x8f,0x7e,0x8, 0x38,0xf4, +0x12,0x17,0x2e,0x1b,0xfd,0x7e,0x37,0x2b,0x95,0x7a,0x37,0x34,0x88,0x12,0x36,0x1c, +0x2, 0x25,0xc5,0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25,0xee,0x22,0x7e,0x1f,0x2b,0x93, +0x7e,0xf, 0x2b,0x8f,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, 0x30,0xe0,0x6, 0x53,0xd, +0xfe,0x12,0x37,0xb9,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, 0xfd,0x7e,0xb3,0x38,0xf8, +0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0x37,0xe3,0x12,0xa6,0xb1,0xe5,0xd, 0x30, +0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x38,0xf9,0x7e,0xb3,0x38,0xf8,0x70,0xa, +0x74,0x1, 0x12,0x0, 0x1e,0x12,0x36,0x1c,0x80,0x7, 0xe4,0x12,0x0, 0x1e,0x12,0x36, +0x13,0x12,0x25,0xc5,0x7e,0xb3,0x2b,0x1b,0x2, 0x36,0x7c,0x22,0xca,0x79,0x7c,0xfb, +0x7e,0x8, 0x24,0xf2,0x12,0xa7,0x27,0x7e,0xa3,0x2a,0x92,0x7e,0x73,0x2a,0x93,0x6c, +0xee,0x80,0x1d,0xa, 0x2e,0x9, 0x62,0x2a,0xfb,0xa, 0x26,0x12,0x57,0xdb,0x7c,0x6b, +0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x36,0xf4,0x19,0xb2,0x24,0xf2,0xb, 0xe0, +0xbc,0x7e,0x38,0xdf,0x6c,0xee,0x80,0x1a,0xa, 0x2e,0x9, 0x62,0x2a,0xd8,0xbe,0x60, +0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12,0x36,0xf4,0x19,0xb2,0x25,0xe, +0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30,0xe, 0xac,0x3e,0x2e,0x14,0x24, +0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba,0xb, 0xe0,0xbe,0xe0,0x5, 0x40, +0xe7,0xda,0x79,0x22,0x2e,0x27,0x2b,0x1d,0x7e,0x29,0xb0,0xa, 0x26,0x22,0xca,0x3b, +0x7e,0xe3,0x2a,0x93,0x7e,0xf3,0x2b,0x19,0x74,0x1, 0x7a,0xb3,0x2b,0x19,0x12,0x37, +0xb9,0x12,0xaf,0xf4,0x12,0x1b,0xc3,0x7e,0x17,0x2b,0x1d,0x6d,0x0, 0x12,0x17,0x53, +0x7e,0xd0,0x7, 0x12,0x3f,0xcf,0x6c,0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x67,0x12,0x37,0xf4,0x4c,0x76,0x7a,0x29, +0x70,0xb, 0xc0,0x12,0x6a,0x53,0x2d,0x23,0xa, 0x3c,0xbd,0x32,0x48,0xdc,0x12,0x37, +0xc0,0x30,0x1c,0xfd,0x12,0x6f,0xd9,0x7e,0xb3,0x2a,0x92,0x7c,0x7e,0x12,0x6a,0x68, +0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49,0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40, +0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c, +0xb7,0x64,0xff,0x12,0x37,0xf4,0x5c,0x7b,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x6a,0x53, +0x2d,0x23,0xa, 0x3c,0xbd,0x32,0x48,0xcc,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0x84,0x12, +0x69,0xd3,0x74,0x2, 0x12,0x37,0xe3,0x12,0x36,0x7c,0x74,0x2, 0x12,0x0, 0x1e,0x7a, +0xf3,0x2b,0x19,0x12,0x37,0xb9,0xda,0x3b,0x22,0x7e,0x8, 0x2a,0x8c,0x2, 0x5, 0xb4, +0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2b,0x1b,0x12,0x36,0x7c,0x74,0x2, 0x12,0x0, +0x1e,0x74,0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x69,0x12,0x7e,0xb3,0x2b,0x1b, +0x2, 0xe, 0x94,0x12,0x0, 0x1e,0x7e,0xb3,0x2b,0x1b,0x22,0x7e,0xb3,0x38,0xf8,0x7e, +0x34,0x0, 0x4, 0x22,0xa, 0x2c,0x2e,0x27,0x2b,0x1d,0x7e,0x29,0x70,0x22,0x12,0xb0, +0x5, 0x12,0x38,0x30,0x6d,0x33,0x7a,0x35,0xa, 0x12,0x22,0xbc,0x12,0x38,0x27,0x74, +0x50,0x7a,0xb3,0x38,0xe8,0x7e,0x24,0x3, 0x20,0x12,0x27,0xf7,0xe4,0x12,0x38,0x3b, +0x6d,0x33,0x7a,0x37,0x39,0xd6,0x22,0x7e,0x73,0x2b,0x81,0x7a,0x73,0x38,0xe7,0x22, +0x7e,0x37,0x25,0xf4,0x7a,0x37,0x34,0x88,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x20,0x7a, +0xb3,0x2b,0x3c,0x22,0xa2,0xe, 0xe4,0x33,0x7a,0xb3,0x38,0xe2,0x7e,0x73,0x38,0xe6, +0xbe,0x73,0x2b,0x2e,0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12,0x22,0xbc,0x12,0x38,0x27, +0x22,0x7e,0xf, 0x39,0x97,0x69,0x30,0x0, 0xa, 0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, +0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x22,0xca,0xd8,0xca,0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c, +0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c,0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4, +0x7d,0x3c,0x7c,0xe7,0x12,0x3f,0xcf,0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12, +0x7, 0xfb,0x7c,0x8b,0x74,0x7, 0x7e,0x70,0xf, 0x12,0x3a,0xb2,0x7e,0x54,0x0, 0x78, +0x7e,0x1f,0x39,0x97,0x79,0x51,0x0, 0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x39,0x97, +0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, 0xc, 0x7e,0x1f,0x39,0x97,0x79,0x51,0x0, 0x10, +0xbe,0xd4,0x0, 0x2, 0x78,0x7, 0x12,0x3a,0x4f,0x44,0x1, 0x80,0x1c,0x12,0x3a,0x4f, +0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x39,0x97,0x78,0x7, 0x12,0x3a,0x53, +0x54,0xfb,0x80,0x5, 0x12,0x3a,0x53,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x39,0x93, +0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e,0xa0, +0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x38,0x19,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff,0xe, +0x12,0x3a,0x5e,0x54,0xe6,0x12,0x3a,0x5b,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12,0x3a, +0x5e,0x5e,0x54,0xfe,0xe6,0x12,0x3a,0x5b,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4,0x0, +0x2, 0x78,0x21,0x12,0x3a,0x4f,0x12,0x3b,0x76,0x12,0x3a,0x4f,0x44,0x50,0x1b,0x1a, +0x50,0x7e,0x34,0x0, 0x2, 0x12,0x3b,0x11,0x12,0x3a,0xbc,0x12,0x38,0x61,0x7a,0x37, +0x34,0x90,0x41,0xb, 0x6c,0xdd,0x41,0x5, 0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b, +0xbc,0xfd,0x40,0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xd7,0xbe,0x90,0x23,0x40,0x3, 0x7e, +0x90,0x22,0xb, 0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xfa, +0xbe,0x90,0x1c,0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x12,0x3a,0x4f,0x12,0x3b, +0x76,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x12,0x3a,0x4f,0x4d,0x5c, +0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, 0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34, +0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, 0x3b,0x12,0x3b,0x11,0x12,0x3a,0xbc,0xbe,0xd4, +0x0, 0x1, 0x78,0x10,0x12,0x3a,0xbc,0x12,0x38,0x61,0x74,0x2, 0xac,0xbd,0x59,0x35, +0x34,0x92,0x80,0xf, 0x12,0x38,0x61,0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59, +0x32,0x34,0x92,0xb, 0xd0,0xbc,0xed,0x28,0x2, 0x21,0x78,0xa9,0xd5,0xcb,0x74,0x7, +0x7c,0x78,0x12,0x3a,0xb2,0xa9,0xc0,0xc4,0x7e,0x1f,0x39,0x93,0x79,0xe1,0x0, 0x84, +0x7e,0x1f,0x39,0x93,0x79,0xf1,0x0, 0x90,0x6d,0x33,0x7e,0xf, 0x39,0x97,0x79,0x30, +0x0, 0x6, 0x7e,0xf, 0x39,0x97,0x79,0x30,0x0, 0x8, 0x7e,0xf, 0x39,0x97,0x79,0x30, +0x0, 0x10,0x7e,0xf, 0x39,0x97,0x79,0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x7e, +0x1f,0x39,0x97,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22,0x1b,0x1a,0x50,0x7e,0x1f, +0x39,0x93,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5,0xfd,0x7a,0x71,0xfe,0x22, +0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12,0x3a,0x6a,0x74,0xf, 0x12,0x7, 0xfb, +0x7c,0x7b,0x74,0xf, 0x5e,0x70,0xfe,0x12,0x3a,0x6a,0x74,0xc, 0x12,0x7, 0xfb,0x54, +0x7f,0x68,0x8, 0x74,0xc, 0x7e,0x70,0xf8,0x12,0x3a,0x6a,0x7e,0x70,0x72,0x74,0xe, +0x12,0x3a,0x6a,0x74,0x7, 0x12,0x7, 0xfb,0x7c,0x7b,0x5e,0x70,0xfb,0x74,0x7, 0x2, +0x3a,0xb2,0x12,0x3a,0x6a,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x7e,0x34,0x0, 0x1, +0x7e,0xf, 0x39,0x97,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x39,0x97,0x69,0x30,0x0, 0x12, +0x5e,0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x6d, +0x33,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x12,0x12,0x63,0x28,0xe5,0x34,0x20,0xe7, +0x1b,0xa9,0xd5,0xcb,0x74,0x3, 0x7e,0x71,0x27,0x12,0x3a,0x6a,0x74,0xb, 0x7e,0x71, +0x2f,0x12,0x3a,0x6a,0x74,0xc, 0x7e,0x71,0x30,0x12,0x3a,0xb2,0x22,0x7e,0x34,0x0, +0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x3b,0x7e,0x7c, +0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6,0x22, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x34,0x4f,0xb4,0x5, 0x2a,0x12,0x3b,0xd, 0x12,0xa4, +0x31,0x2, 0x3f,0xdc,0x7e,0xb3,0x34,0x4f,0xb4,0x5, 0x1a,0x12,0x3b,0xd, 0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x34,0x4f,0xb4,0x5, 0xc, 0x12,0x3b,0xd, 0x2, 0x3f,0xd6,0x74, +0x1, 0x7a,0xb3,0x34,0x4f,0x22,0x5e,0x54,0x0, 0xf, 0x1b,0x1a,0x50,0x22,0x7c,0xab, +0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c,0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7, +0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22,0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, +0x12,0x3a,0x6a,0x7a,0x61,0xfc,0x12,0x3a,0xb5,0x12,0x3f,0x47,0xd2,0x0, 0x12,0xa4, +0xb3,0x12,0x3c,0x3, 0x12,0x13,0xde,0x2, 0x13,0x96,0x12,0x3f,0xf3,0xc2,0x0, 0x12, +0xa4,0xbe,0xc2,0x2, 0x12,0x3b,0xe9,0xc2,0x0, 0x12,0xa4,0xb3,0xa9,0xd5,0xcb,0x74, +0xf, 0x12,0x7, 0xfb,0x7a,0x1b,0xb0,0x74,0xf, 0x6c,0x77,0x12,0x3a,0x6a,0xe5,0xfc, +0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x3a,0xb5,0xa9,0xd0,0xce,0xa2,0x2, 0xa9,0x91, +0xc9,0x22,0x30,0x1, 0x6, 0x12,0x3c,0x3, 0x2, 0x13,0x96,0x12,0x3f,0xf3,0xc2,0x2, +0x2, 0x3b,0xe9,0xd2,0x2, 0x12,0x3b,0xe9,0x74,0x1, 0x22,0x12,0x3d,0x9c,0x12,0x85, +0x77,0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9,0xd7,0xcd,0xc2,0xce,0x12,0x98,0xa4,0x12, +0x3b,0xba,0x74,0x1, 0x12,0x3d,0xd4,0xa9,0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5, +0x25,0x7e,0x71,0x24,0x2, 0x3b,0x99,0x30,0x1c,0x5, 0xc2,0x1, 0x12,0x3b,0xf2,0xa9, +0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x1b,0x3, 0x20,0x1c,0x14,0x12,0x3d,0x9c,0xa9,0xd0, +0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x3d,0xd4,0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9, +0xc1,0xcd,0xd2,0x1, 0x2, 0x3b,0xf2,0xca,0x3b,0x7e,0xb3,0x38,0xd, 0xb4,0x1, 0x2, +0x80,0x2, 0xa1,0x99,0x6c,0xcc,0x6c,0xdd,0x7e,0xb3,0x38,0x38,0xb4,0x1, 0x8, 0x7e, +0xe0,0x10,0x7e,0xf0,0x32,0x80,0x6, 0x7e,0xe0,0x6, 0x7e,0xf0,0x14,0x12,0x85,0x80, +0x7d,0xf3,0x12,0x6c,0x71,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x39,0x59,0x12,0x25,0x96, +0x12,0x13,0xc7,0x12,0x0, 0x1e,0x74,0xa, 0x12,0x3b,0x7e,0x12,0xaf,0xf4,0x7e,0xe7, +0x2b,0x2c,0x7a,0xe5,0x25,0x7e,0xb3,0x2b,0x19,0xf5,0x24,0x74,0x4, 0x7a,0xb3,0x2b, +0x19,0x7e,0xe7,0x2b,0x2c,0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0x2c,0x7e,0xb3,0x2b, +0x19,0x12,0xa8,0xbf,0x7c,0x7b,0x74,0x8, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x15, +0x29,0x7d,0x23,0x7d,0x3f,0x12,0x51,0x7f,0xad,0x32,0x7a,0x37,0x2b,0x26,0x12,0x37, +0xb9,0xa1,0x7a,0x12,0x3f,0xcf,0x30,0x11,0x2, 0xa1,0x80,0x7c,0xbe,0x12,0x6f,0xb9, +0x12,0x37,0xd1,0x80,0xf, 0x80,0x7, 0x12,0x3d,0x9c,0xe4,0x12,0x3d,0xd4,0x20,0x93, +0xf6,0x12,0x3c,0x37,0x30,0x1c,0xf7,0x30,0x1b,0xf4,0xd2,0x1, 0x12,0x3b,0xf2,0xe4, +0x12,0x13,0xde,0xb, 0xc0,0x12,0x81,0x65,0x12,0x85,0x85,0x7e,0xa3,0x39,0x58,0x4c, +0xaa,0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x39,0x59,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x38, +0x38,0x70,0x5, 0xe4,0x7a,0xb3,0x39,0x58,0x12,0x3e,0xd3,0x78,0x18,0x7e,0xb3,0x39, +0x58,0x60,0x12,0xe4,0x7a,0xb3,0x39,0x58,0x7a,0xb3,0x2a,0x20,0x7a,0xb3,0x2a,0x21, +0x7e,0xd0,0x1, 0x80,0x1b,0x12,0x3e,0xd3,0x68,0x10,0x7e,0xb3,0x39,0x58,0x70,0xa, +0x7e,0xd0,0x1, 0xe4,0x7a,0xb3,0x38,0xd, 0x80,0x6, 0xbc,0xfc,0x28,0x2, 0x81,0xf3, +0xe4,0x7a,0xb3,0x2b,0x23,0x7e,0x35,0x25,0x7a,0x37,0x2b,0x2c,0xe5,0x24,0x7a,0xb3, +0x2b,0x19,0x4c,0xdd,0x68,0x3, 0x12,0x1a,0x7f,0xda,0x3b,0x22,0x74,0x81,0x7a,0xb3, +0x39,0xd4,0x22,0x80,0x1d,0x12,0x3d,0x9c,0x12,0x3f,0x3f,0x68,0x5, 0xc2,0x1, 0x12, +0x3b,0xf2,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x1b,0x15,0xe4,0x12, +0x3d,0xd4,0x20,0x93,0xe0,0x12,0x3d,0x9c,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x74,0x2, +0x2, 0x3d,0xd4,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xd4,0xb4,0x81,0x38,0x4c,0xaa,0x78, +0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf,0xa9,0xd0,0xce, +0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, 0x78,0x16,0xc2, +0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0xd4,0x22,0x7e,0xb3,0x38,0xd, 0x14, +0x68,0x5a,0x14,0x78,0x2, 0xc1,0xb8,0x14,0x68,0x6a,0x24,0x3, 0x68,0x2, 0xc1,0xb0, +0x12,0x3e,0xcb,0x38,0x8, 0x30,0x14,0xf, 0x12,0x57,0xca,0x68,0xa, 0x12,0xaf,0x4d, +0xe4,0x7a,0xb3,0x39,0x58,0x80,0x71,0x7e,0xb3,0x37,0xee,0x30,0xe0,0x6a,0x7e,0x73, +0x37,0xef,0xa, 0x27,0x7e,0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x38,0x38,0xb4,0x1, +0xb, 0x7e,0x34,0x62,0x7b,0x12,0xad,0x71,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x39,0x56, +0x50,0x46,0x12,0x3e,0xbe,0xe4,0x7a,0xb3,0x39,0x5a,0x80,0x3c,0x12,0x3e,0xcb,0x28, +0x32,0xe4,0x7a,0xb3,0x38,0xd, 0x7e,0xb3,0x39,0x58,0xb4,0x1, 0x3, 0x12,0x3e,0xc4, +0xd2,0x1b,0x80,0x1f,0x74,0xff,0x7a,0xb3,0x37,0xe7,0x12,0xb0,0x27,0x12,0x3c,0xb, +0x12,0x19,0x84,0xe4,0x7a,0xb3,0x38,0xd, 0x7a,0xb3,0x39,0xd9,0xd2,0x1b,0x80,0x8, +0x12,0x3e,0xc4,0xe4,0x7a,0xb3,0x39,0xd9,0x12,0x3e,0xf8,0x2, 0x3c,0x67,0x6d,0x33, +0x7a,0x37,0x39,0x56,0x74,0x1, 0x7a,0xb3,0x38,0xd, 0x22,0x7e,0x73,0x2a,0x20,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x39,0xc5,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xd2,0x0, +0x80,0x12,0x30,0x0, 0xc, 0x12,0x3f,0x3f,0x68,0x7, 0xc2,0x0, 0xc2,0x1, 0x12,0x3b, +0xf2,0x12,0x3d,0xa3,0x30,0x1b,0xeb,0x22,0x74,0x1, 0x12,0x3f,0x17,0x20,0x1b,0x6, +0x12,0x3e,0xde,0x12,0x3f,0x20,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x3f,0x25, +0x12,0x3f,0x20,0xe4,0x2, 0x3f,0x17,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0xa4,0xaa,0x22, +0xd2,0x1, 0x2, 0x3b,0xf2,0x74,0xc8,0x7a,0xb3,0x39,0xd8,0xc2,0x1b,0x80,0xa, 0x12, +0x3d,0xa3,0x30,0x1b,0x4, 0x75,0xe9,0xff,0x22,0x12,0x3f,0x3f,0x68,0xf1,0x22,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb,0xd2, +0x0, 0x12,0xa4,0xbe,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, 0xa9, +0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74,0x41, +0x12,0x3b,0x7e,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda,0xf8, +0x22,0xe4,0x12,0xa4,0x79,0x12,0xa5,0x35,0x12,0x3f,0xcf,0x12,0xa5,0x93,0x12,0x3a, +0x70,0x12,0xa4,0x27,0x12,0xa5,0x4c,0x12,0x0, 0x42,0x12,0xa5,0x58,0x12,0x72,0x3f, +0x12,0xa5,0x68,0xd2,0xaf,0x12,0xa4,0xc7,0x12,0x65,0x31,0x12,0x3a,0xdf,0x12,0x3f, +0x47,0x7e,0x8, 0x33,0xef,0x12,0xa5,0xb3,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8,0x90, +0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34,0x7e, +0x34,0x3, 0xe8,0x2, 0x1a,0x15,0x75,0xe7,0x6b,0x2, 0x3f,0xdc,0xe4,0x7e,0x34,0xd7, +0xfc,0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75, +0xe9,0xff,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0xca,0xd8,0xca,0x79,0x7e,0x73, +0x2a,0x8d,0x7e,0xf3,0x2a,0x8c,0xac,0xf7,0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34, +0xe4,0x12,0x17,0x53,0x7e,0xb3,0x38,0xcf,0xb4,0x1, 0x64,0x7e,0x73,0x38,0xd0,0xbe, +0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c,0x12,0x3f,0xcf,0x12,0x1a,0xc4,0x6d,0x33, +0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49,0x33,0xd, 0xc8,0x12,0x17,0x85,0x7a,0x35, +0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14,0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58, +0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34,0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24, +0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x38,0xd0,0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0xd, 0xc8,0x12,0x17,0x2e,0x1b,0xfd,0xda, +0x79,0xda,0xd8,0x22,0x7e,0xb3,0x38,0xc, 0xb4,0x1, 0x4, 0xe4,0x2, 0x40,0x90,0x22, +0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0x12,0x1a,0x99,0x12,0x70,0x44,0x7e,0xb3, +0x38,0xf, 0xb4,0x1, 0x64,0x12,0xa5,0x9a,0x12,0xb0,0x27,0x12,0x6f,0x74,0x12,0x43, +0x91,0x12,0x1a,0xc4,0x50,0xe5,0x12,0x5d,0xa8,0x12,0x5b,0x2b,0x7e,0xb3,0x38,0xc, +0xb4,0x1, 0x4, 0xe4,0x12,0x40,0x90,0x12,0x51,0x88,0x12,0x5f,0xb7,0x12,0x43,0x37, +0x40,0xc9,0x12,0x7b,0xd8,0x12,0x43,0x37,0x40,0xc1,0x12,0x2f,0x9e,0x12,0x1c,0x59, +0x12,0x46,0xdf,0x12,0x77,0xfe,0x12,0x86,0x95,0x12,0x44,0x5f,0x12,0x8a,0x89,0x12, +0x73,0x46,0x12,0x8a,0xff,0x12,0x76,0x82,0x12,0xaa,0x2b,0x12,0x41,0xf, 0x12,0x50, +0x58,0x12,0x85,0x57,0x12,0x50,0x1, 0x80,0x92,0x12,0x6f,0xc3,0x2, 0x40,0x84,0xca, +0x3b,0x75,0x24,0x0, 0x6c,0xff,0x75,0x25,0x0, 0x75,0x26,0x0, 0x75,0x28,0x3, 0x6c, +0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0x29,0x70,0xe, 0x7e,0xb3,0x2a,0x25,0x70, +0x8, 0x7e,0xb3,0x2a,0x26,0x70,0x2, 0x61,0x2, 0x30,0x12,0x6, 0x7e,0x68,0x33,0x53, +0x80,0x4, 0x7e,0x68,0x33,0x15,0x7f,0x6, 0x12,0x72,0x8e,0x7e,0x73,0x2a,0x22,0x7a, +0x6b,0x70,0x6c,0xdd,0x41,0xb3,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0xc, 0x7c,0xbc, +0x54,0xf, 0x12,0x43,0x2d,0xf5,0x28,0x7c,0xbc,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, +0x41,0xb1,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, 0x41,0xb1,0x7e,0x8, 0x0, 0x28,0x7c, +0xbc,0x12,0x8c,0x4f,0x50,0x2, 0x41,0xb1,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, +0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e, +0x73,0x2a,0x6c,0xbc,0x7c,0x28,0x57,0x7e,0xb3,0x2a,0x27,0x70,0x2a,0x75,0x29,0xf, +0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x33,0x1, 0x6d,0x22,0x74,0x1, 0x12,0x43, +0x4f,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, 0x3c,0x2e,0x34,0x33,0xb, 0x6d,0x22, +0x74,0x10,0x12,0x43,0x4f,0x80,0xe, 0xa, 0x3c,0x9, 0xb3,0x33,0x1, 0xf5,0x25,0x9, +0xb3,0x33,0xb, 0xf5,0x26,0xa, 0x3c,0x12,0x43,0x2f,0xb4,0x1, 0x11,0xe4,0xa, 0x3c, +0x19,0xb3,0x33,0x1, 0x19,0xb3,0x33,0xb, 0x75,0x25,0x0, 0x75,0x26,0x0, 0x7e,0xb3, +0x2a,0x83,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xc, +0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac,0x9d,0x49,0xb4,0x29, +0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x27,0x75,0x27,0x0, 0x7e,0x71,0x27, +0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x95,0x54,0xf, 0xbc,0xbc,0x78,0xa, 0x49,0xb3, +0x33,0x91,0x49,0xa3,0x33,0x93,0x80,0x9, 0x5, 0x27,0xe5,0x27,0xbe,0xb0,0xa, 0x40, +0xdc,0x5e,0xb4,0xf, 0xff,0x5e,0xa4,0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4, +0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5,0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0, +0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0,0xe5,0x28,0xa, 0x5b,0x12,0xa6,0xa9,0x2d,0xb5, +0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e,0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79, +0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13,0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d, +0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26,0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, +0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x6c,0xbc,0x7d,0x28,0x2, 0x21,0x56,0xe5,0x24,0x39, +0xb6,0x0, 0x1, 0x7e,0xb3,0x38,0x38,0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x26,0xb4,0x1, +0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38,0x6, 0x7e,0xb3,0x2a,0x26,0x60,0xa, 0xb2,0x12, +0x12,0x71,0x57,0x74,0x1, 0x12,0x40,0x90,0x7e,0xb3,0x2a,0x25,0x60,0x5, 0x7f,0x4, +0x12,0x65,0x5b,0xe4,0x7a,0xb3,0x2a,0x29,0x7a,0xb3,0x2a,0x25,0x7a,0xb3,0x2a,0x26, +0x80,0x4, 0xe4,0x12,0x40,0x90,0x7e,0x34,0x0, 0x5a,0xca,0x39,0x7e,0x18,0x29,0x8, +0x7e,0x8, 0x33,0x91,0x12,0x17,0x2e,0x1b,0xfd,0x4c,0xff,0x78,0xd, 0x7e,0x8, 0x33, +0x91,0x7e,0x34,0x0, 0x5a,0x74,0xff,0x12,0x17,0x53,0xda,0x3b,0x22,0xa, 0x3b,0x2d, +0x39,0x7d,0x28,0x7e,0x1b,0xb0,0x22,0xc2,0x0, 0x7e,0xb3,0x16,0x91,0x60,0x6, 0x7e, +0xb3,0x16,0x90,0x70,0x7, 0x12,0x9f,0xf6,0x28,0x2, 0xd2,0x0, 0xa2,0x0, 0x22,0x7c, +0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e,0xb, 0x90,0x7a,0x7b,0x90, +0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12,0x17,0x85,0xe5,0x29,0xa, +0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x7c,0xba,0x28, +0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e,0x7b,0x70,0x7a,0xb, 0x70, +0x22,0x7e,0x34,0x37,0xe8,0x30,0x11,0x47,0xc2,0x11,0x9, 0x53,0x0, 0x2, 0x12,0x43, +0xe0,0x7a,0x27,0x2a,0x6e,0x9, 0x53,0x0, 0x3, 0x12,0x43,0xe0,0x7a,0x27,0x2a,0x70, +0x9, 0x53,0x0, 0x4, 0x12,0x43,0xe0,0x7a,0x27,0x2a,0x72,0x7e,0x39,0x50,0x12,0x43, +0xeb,0x7a,0x27,0x2a,0x79,0x9, 0x53,0x0, 0x1, 0x12,0x43,0xeb,0x7a,0x27,0x2a,0x7b, +0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0xaf,0xcf,0x3e,0x34,0x7a,0x37,0x2a,0x81,0x22, +0xa, 0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa, 0x25,0x3e,0x24,0x3e, +0x24,0x22,0x7c,0x67,0x7c,0x7b,0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74, +0x1, 0x7a,0xb3,0x2a,0x25,0xe4,0x7a,0xb3,0x2a,0x27,0x7a,0xb3,0x2a,0x28,0x2, 0x8c, +0xf3,0xa5,0xbe,0x0, 0x1b,0x6c,0xaa,0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19, +0x62,0x29,0x66,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xf0,0x74,0x1, 0x7a,0xb3,0x2a,0x24, +0x6c,0xaa,0x80,0x26,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20, +0x12,0x43,0xe2,0x1b,0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, +0x18,0x20,0x12,0x43,0xe2,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0xca, +0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x7e,0x70,0xff,0x12,0xaf,0xe0,0xe4,0xa, 0x4a, +0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f,0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0, +0xbe,0xa0,0xa, 0x78,0xe2,0x7e,0x73,0x2a,0x20,0xa5,0xbf,0x0, 0x21,0x7e,0xb3,0x39, +0xe1,0x70,0x2, 0xc1,0x5e,0x6c,0xaa,0x7e,0x44,0x7f,0xff,0x12,0xaf,0xea,0x79,0x40, +0x0, 0x14,0x12,0xaf,0xfc,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xeb,0xc1,0x5e,0x7e,0xb3, +0x39,0xe1,0x70,0x3d,0xbe,0x70,0x0, 0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, +0xac,0x9a,0x49,0x34,0x28,0xae,0x12,0xaf,0xea,0x79,0x30,0x0, 0x14,0x49,0x34,0x28, +0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30,0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f, +0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0,0x7e,0xb3,0x2a,0x20,0xbc,0xba,0x38,0xce,0xc1, +0x5e,0x6c,0xaa,0x12,0x65,0x96,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50, +0x59,0x43,0x15,0x76,0x59,0x43,0x15,0x78,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xe4,0x6c, +0xaa,0x80,0x3b,0x6c,0xff,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30, +0x0, 0x14,0xbe,0x34,0x7f,0xff,0x68,0x1d,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x14,0x12,0xb0,0x2e,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50, +0x12,0xaf,0xae,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xc9,0xb, 0xa0,0x7e,0xb3, +0x39,0xe1,0xbc,0xba,0x38,0xbd,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x46,0xb4,0xff, +0x17,0x6c,0xff,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x5, 0x12,0xaf,0xae,0x80, +0x7, 0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xeb,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xd9,0x6c, +0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x43,0x28,0xae,0x12,0xb0,0x2e,0x59, +0x42,0x15,0x76,0x49,0x33,0x28,0xb0,0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a, +0x20,0xbc,0xba,0x38,0xde,0x7e,0x34,0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15, +0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x39, +0xe1,0x7a,0x73,0x1f,0x3e,0x7e,0x73,0x2a,0x20,0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f, +0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80,0x57,0x7e,0x70,0xff,0x6c,0xff,0x7e,0x50,0x2, +0xac,0x5f,0x49,0x12,0x15,0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73, +0x1f,0x46,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xe2,0xbe,0x70,0xff,0x68,0x2d, +0x12,0xaf,0xe0,0x74,0x1, 0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a, +0x49,0x24,0x28,0xae,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, +0x14,0x49,0x44,0x28,0xb0,0x7e,0x50,0x2, 0xac,0x57,0x12,0xaf,0xfc,0xb, 0xa0,0x7e, +0x63,0x2a,0x20,0xbc,0x6a,0x38,0xa1,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe, +0xb0,0x1, 0x68,0x13,0x12,0x65,0x96,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d, +0x3d,0x7d,0x2c,0x79,0x41,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xdb,0x7e,0xf3, +0x2a,0x20,0x7a,0xf3,0x39,0xe1,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, +0x2c,0x12,0x46,0xd8,0x29,0xb1,0x0, 0xa, 0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, +0xa, 0x12,0x46,0xd8,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0, +0x80,0x32,0xa5,0xbb,0x0, 0x2e,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x27,0x12,0x46,0xd8, +0x29,0xb1,0x0, 0xa, 0xbe,0xb0,0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0, +0x7c,0x2f,0xb, 0xf0,0x7e,0x30,0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74, +0x3, 0x7a,0x1b,0xb0,0x12,0x46,0xd8,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0, +0xbe,0xa0,0xa, 0x40,0x93,0xda,0xf8,0x22,0xa, 0x3a,0x2d,0x3d,0x7d,0x2c,0x22,0x2, +0x46,0xe2,0xca,0x3b,0x75,0x28,0x0, 0x7e,0xb3,0x2a,0x8e,0xf5,0x2a,0x7e,0xb3,0x2a, +0x8f,0xf5,0x2b,0x75,0x25,0x0, 0x7e,0xb3,0x16,0x91,0xb4,0x1, 0x2, 0x80,0x3, 0x2, +0x49,0x30,0x6c,0xdd,0x2, 0x49,0x1f,0x7e,0x70,0x2, 0xac,0x7d,0x9, 0xb3,0x26,0xfa, +0xf5,0x29,0x9, 0xc3,0x26,0xfb,0x75,0x26,0x2, 0x75,0x27,0x2, 0x7c,0xbd,0x12,0x5c, +0x4f,0xd2,0x0, 0x12,0x5c,0x18,0x7e,0xb3,0x37,0xf3,0xb4,0x1, 0x1e,0x7e,0xb3,0x2a, +0x21,0xb4,0x1, 0x17,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0x10,0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x6, 0x75,0x26,0x3, 0x75,0x27,0x3, 0xe5,0x29,0x60,0x5, 0x12, +0x4c,0x10,0x48,0x3, 0x75,0x26,0x1, 0x4c,0xcc,0x68,0xc, 0xe5,0x2b,0xa, 0x2b,0x1b, +0x24,0xa, 0x3c,0xbd,0x32,0x48,0x3, 0x75,0x27,0x1, 0x75,0x25,0x0, 0x75,0x24,0x0, +0x80,0x51,0xe5,0x24,0xbc,0xbd,0x68,0x49,0x12,0x2f,0xa9,0x7a,0xa1,0x2c,0x9, 0xb3, +0x26,0xfb,0xf5,0x2d,0xa, 0x2a,0xe5,0x29,0x12,0x2f,0x7f,0xbe,0x34,0x0, 0x4, 0x18, +0x30,0xe5,0x2d,0xa, 0x2b,0xa, 0x3c,0x9d,0x32,0x12,0x17,0x85,0xbe,0x34,0x0, 0x4, +0x18,0x1f,0x12,0x8d,0xb8,0x40,0xa, 0xe5,0x2c,0x7e,0x71,0x2d,0x12,0x8d,0x74,0x50, +0x5, 0x75,0x25,0x0, 0x80,0x3, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x75,0x27,0x1, 0x80, +0x7, 0x5, 0x24,0x12,0xb0,0x1f,0x38,0xaa,0x12,0x8d,0xb8,0x50,0xb, 0x12,0x5d,0x75, +0x75,0x26,0x0, 0x75,0x27,0x0, 0x80,0xb, 0x12,0x8c,0x4c,0x50,0x6, 0x75,0x26,0x3, +0x75,0x27,0x3, 0xe5,0x25,0x70,0x3, 0x2, 0x48,0xd8,0x6c,0xff,0x6c,0xee,0x12,0x4c, +0x3, 0x18,0x15,0xe5,0x2a,0xa, 0x5b,0xbd,0x35,0x48,0xd, 0x12,0x4b,0xf8,0x18,0x8, +0xe5,0x2b,0xa, 0x5b,0xbd,0x35,0x58,0x3, 0x12,0x49,0x3d,0xb, 0xe0,0xbe,0xe0,0x3, +0x78,0xdc,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xd3,0x7e,0xa1,0x2b,0x1b,0xa0,0xbc,0xac, +0x68,0x6, 0x4c,0xcc,0x68,0x2, 0x1, 0xd8,0xe5,0x29,0xbe,0xb0,0x0, 0x38,0x2, 0x1, +0xd8,0x12,0x4c,0x10,0x48,0x2, 0x1, 0xd8,0x7e,0x18,0x0, 0x64,0x7a,0x1d,0x41,0x4c, +0xcc,0x78,0x5, 0x75,0x40,0x2, 0x80,0x7, 0xbc,0xac,0x78,0x3, 0x75,0x40,0x0, 0x6c, +0xff,0x7e,0xa1,0x40,0x3e,0xa0,0x7e,0x90,0x6, 0xac,0x9f,0x7c,0xb9,0x2c,0xba,0x24, +0x2e,0x12,0x49,0x33,0x7e,0x14,0x0, 0x64,0x12,0x15,0x6c,0x7c,0xb9,0x24,0x30,0xa, +0x1b,0xb, 0x18,0x10,0x1a,0x2, 0x1a,0x0, 0x12,0x15,0xc8,0x7e,0xd, 0x41,0xbf,0x10, +0x58,0x3, 0x7a,0x1d,0x41,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xc5,0x7e,0x1d,0x41,0xbe, +0x18,0x0, 0x0, 0x58,0x7, 0x7e,0x18,0x0, 0x1, 0x7a,0x1d,0x41,0x6c,0xff,0x74,0x6, +0xac,0xbf,0x24,0x30,0x12,0x49,0x33,0x7e,0xd, 0x41,0x12,0x15,0x5b,0x7e,0x8, 0x0, +0x64,0x12,0x15,0xc8,0x7d,0x43,0xe5,0x29,0xa, 0x3b,0x1b,0x34,0xa, 0x5f,0x2d,0x53, +0xa, 0x2c,0x1b,0x24,0x7e,0xa1,0x40,0xa, 0x3a,0x2d,0x32,0x12,0x4c,0x21,0x1b,0x1a, +0x40,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xc6,0xe5,0x26,0x7e,0x71,0x27,0x7c,0x6d,0x7e, +0x51,0x28,0x12,0x49,0x62,0xe5,0x25,0x60,0x2f,0x6c,0xff,0x6c,0xee,0x12,0x4c,0x3, +0x18,0x15,0xe5,0x2a,0xa, 0x5b,0xbd,0x35,0x48,0xd, 0x12,0x4b,0xf8,0x18,0x8, 0xe5, +0x2b,0xa, 0x5b,0xbd,0x35,0x58,0x3, 0x12,0x49,0x3d,0xb, 0xe0,0xbe,0xe0,0x3, 0x78, +0xdc,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xd3,0x12,0x5d,0x75,0x5, 0x28,0xb, 0xd0,0x7e, +0x73,0x28,0x84,0xbc,0x7d,0x28,0x3, 0x2, 0x47,0x7, 0xe5,0x28,0x7a,0xb3,0x28,0x84, +0xda,0x3b,0x22,0xa, 0x3b,0xb, 0x38,0x30,0x1a,0x26,0x1a,0x24,0x22,0x1b,0x44,0xa, +0x5f,0x2d,0x54,0xa, 0x2c,0x1b,0x24,0xa, 0x3e,0x2d,0x32,0x12,0x2c,0xb9,0x7d,0x23, +0x7c,0x7e,0x3e,0x70,0x74,0x6, 0xac,0xbf,0x2c,0xb7,0x24,0x2e,0xa, 0x3b,0x1b,0x38, +0x20,0x22,0xca,0x3b,0x7c,0xc4,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x74,0x9, 0xac,0xb5, +0x7d,0x95,0x2e,0x94,0x27,0x76,0x6d,0x88,0x7e,0xe7,0x2a,0x85,0xe4,0x39,0xb4,0x0, +0x6, 0x7e,0x70,0x2, 0xac,0x7f,0x9, 0xb3,0x26,0xfa,0xf5,0x4e,0x9, 0xb3,0x26,0xfb, +0xf5,0x4f,0x7e,0x73,0x2a,0x8d,0x7c,0x6e,0x7e,0x8, 0x0, 0x52,0x12,0x4b,0xa5,0xf5, +0x50,0xe5,0x4e,0x7e,0x73,0x2a,0x8c,0x7c,0x6d,0x7e,0x8, 0x0, 0x51,0x12,0x4b,0xa5, +0x7c,0xab,0xe5,0x51,0x7e,0x71,0x52,0x12,0x4c,0x21,0x7d,0xf3,0x7a,0xf5,0x5a,0x7e, +0xf4,0x15,0x9e,0x7a,0xf5,0x5c,0x85,0x51,0x54,0x85,0x52,0x55,0x7a,0xa1,0x56,0x85, +0x50,0x57,0x7e,0xb3,0x2a,0x78,0xf5,0x58,0x75,0x59,0x0, 0xbe,0xc0,0x1, 0x78,0x8, +0xe5,0x58,0x1e,0xb0,0x1e,0xb0,0xf5,0x58,0x7e,0x8, 0x0, 0x54,0x12,0x80,0xfd,0x7d, +0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa0,0x6d,0xaa,0x2f,0x51,0x7e,0x37,0x15,0xa2,0x6d, +0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d,0x45,0x7e,0x37, +0x15,0xa6,0x6d,0x22,0x7d,0x3, 0x7e,0x37,0x15,0xa8,0x2f,0x10,0x7a,0x1d,0x49,0x7f, +0x65,0xa, 0x3d,0xe5,0x4e,0xa, 0xfb,0x9d,0xf3,0x7d,0x3f,0x7c,0xc7,0x61,0x7, 0xa, +0x4e,0xe5,0x4f,0xa, 0x5b,0x9d,0x54,0xf5,0x4d,0x41,0xf1,0xbe,0xc0,0x0, 0x58,0x2, +0x41,0xef,0x7e,0x73,0x2a,0x8c,0xbc,0x7c,0x18,0x2, 0x41,0xef,0xe5,0x4d,0xbe,0xb0, +0x0, 0x58,0x2, 0x41,0xef,0x7e,0x73,0x2a,0x8d,0xbe,0x71,0x4d,0x18,0x2, 0x41,0xef, +0x7c,0xbc,0x7e,0x71,0x4d,0x12,0x2c,0xb9,0x7e,0x53,0x2a,0x78,0xa, 0x25,0x7d,0xf3, +0x9d,0xf2,0xbe,0xf4,0x0, 0x0, 0x8, 0x77,0xbd,0xef,0x18,0xd, 0x7f,0x14,0x2e,0x34, +0x0, 0x6, 0x7e,0x1b,0xb0,0x4, 0x7a,0x1b,0xb0,0xe5,0x4e,0xa, 0x2b,0x1a,0x3c,0x12, +0x4b,0x8c,0x18,0xd, 0xe5,0x4f,0xa, 0x2b,0xe5,0x4d,0x1a,0x3b,0x12,0x4b,0x8c,0x8, +0x4e,0x7c,0xbc,0x7e,0x71,0x4d,0x7c,0x6f,0x12,0xa5,0xf5,0xf5,0x53,0xb4,0x2, 0x6, +0x7d,0x3f,0xe, 0x34,0x9d,0xf3,0xe5,0x53,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x53,0xb4, +0x1, 0x2d,0x12,0x4b,0x7d,0x1a,0x1c,0x12,0x4b,0x84,0x7e,0x1d,0x45,0x9f,0x10,0x7a, +0x1d,0x45,0x12,0x4b,0x7d,0xe5,0x4d,0x1a,0x1b,0x12,0x4b,0x84,0x7e,0x1d,0x49,0x9f, +0x10,0x7a,0x1d,0x49,0x12,0x4b,0x7d,0x9f,0x51,0x1a,0x26,0x1a,0x24,0x9f,0x61,0x5, +0x4d,0xa, 0x2e,0xe5,0x4f,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x4d,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x41,0x3b,0xb, 0xc0,0xa, 0x2d,0xe5,0x4e,0xa, 0x3b,0x2d,0x32,0x1a, +0x37,0x1a,0xfc,0xbd,0xf3,0x18,0x2, 0x41,0x2f,0xbe,0x58,0x0, 0x0, 0x78,0x2, 0xb, +0x5c,0xbe,0x68,0x0, 0x0, 0x78,0x2, 0xb, 0x6c,0x7e,0x1d,0x45,0x7f,0x5, 0x12,0x4b, +0x96,0x1b,0x4a,0x30,0x7e,0x1d,0x49,0x7f,0x6, 0x12,0x4b,0x96,0x79,0x34,0x0, 0x2, +0x7e,0xb3,0x2a,0x84,0x60,0xd, 0x1e,0xd4,0x1e,0xc4,0x50,0x4, 0x4e,0xd4,0x80,0x0, +0x14,0x78,0xf3,0xbe,0x68,0x0, 0x7f,0x28,0x4, 0x7e,0x68,0x0, 0x7f,0x7d,0x3d,0x39, +0x74,0x0, 0x5, 0x74,0x9, 0xac,0xbf,0x9, 0x75,0x27,0x7c,0x39,0x74,0x0, 0x6, 0xbe, +0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb4,0x0, 0x6, 0xda,0x3b,0x22,0x7d,0x3f,0x1a, +0x26,0x1a,0x24,0x22,0x1a,0x2, 0x12,0x15,0x5b,0x7f,0x1, 0x22,0x9d,0x32,0x12,0x17, +0x85,0xbe,0x34,0x0, 0x1, 0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x15,0x77, +0x2e,0x18,0x0, 0x20,0x22,0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d, +0x32,0x3e,0x34,0xb, 0x34,0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, +0x3f,0x9d,0xf3,0xa, 0x39,0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc, +0xf9,0x28,0xd, 0xa, 0x39,0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10, +0xa, 0x3f,0xa, 0x58,0x2d,0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7, +0x7a,0xb, 0xb0,0x7c,0xba,0xda,0xf8,0x22,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0xbe,0x34, +0x0, 0x1, 0x22,0xa, 0x3f,0xe5,0x29,0xa, 0x4b,0x2d,0x34,0xbe,0x34,0x0, 0x1, 0x22, +0xe5,0x2a,0xa, 0x2b,0x1b,0x24,0xe5,0x29,0xa, 0x3b,0xbd,0x32,0x22,0x7c,0xbd,0x7c, +0x7e,0x7e,0x13,0x2a,0x8d,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10, +0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f, +0x70,0x7c,0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x8c,0xf5,0x26,0x7e,0xb3, +0x2a,0x8d,0xf5,0x25,0x7e,0xd4,0x0, 0xc8,0x6c,0xff,0x12,0x4c,0x1d,0xe5,0x26,0xa, +0x1b,0x1b,0x14,0xa, 0xcd,0xbd,0xc1,0x58,0x14,0xe5,0x25,0xa, 0x1b,0x1b,0x14,0xa, +0xce,0xbd,0xc1,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, 0x4e,0xf0,0x10, +0xb, 0x1a,0xc0,0xbe,0xc4,0x0, 0xc8,0x8, 0xc, 0x7e,0x17,0x28,0x8a,0xbe,0x14,0x3, +0x20,0x8, 0x2, 0xa1,0x81,0xbe,0xc4,0x0, 0x64,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe, +0xc4,0x3, 0x20,0x58,0x2, 0xa1,0x81,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8c,0xbc,0xb8,0x8, 0x9, 0x12,0x4d,0xb8,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a, +0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x1, 0xa1,0x81,0x6c,0xaa, +0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8c,0xbc, +0xb8,0x8, 0x9, 0x12,0x4d,0xb8,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80, +0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a,0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x8d,0xbc,0xb9,0x8, 0x9, 0x12,0x4d,0xb8,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90,0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd, +0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e, +0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8d,0xbc,0xb9,0x8, +0x9, 0x12,0x4d,0xb8,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c, +0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0, +0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b,0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29, +0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, 0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc, +0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, 0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39, +0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b,0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0xb9,0xbd, +0x3d,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f,0x40,0x6d,0xbb,0x7e,0xa3,0x2a,0x8c, +0x7e,0x73,0x2a,0x8d,0x4c,0xcc,0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14, +0xbc,0xbc,0x78,0x6, 0xa, 0x6c,0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0, +0x1, 0x80,0xb, 0x7c,0xba,0x14,0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, +0x7e,0x34,0x0, 0x6, 0xe4,0x12,0x17,0x53,0x7e,0x73,0x2a,0x8c,0xa, 0x37,0x1b,0x34, +0x7a,0x4b,0x70,0x7e,0x73,0x2a,0x8d,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c, +0xec,0x80,0x1d,0x75,0x24,0x0, 0x7c,0xdf,0x80,0xb, 0x12,0x4c,0x37,0x70,0xb, 0x5, +0x24,0xb, 0xb4,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf0,0xe5,0x24,0x60,0x7, 0x1b,0xe0, +0xbe,0xe0,0x0, 0x58,0xde,0x7c,0xec,0x80,0x26,0x75,0x24,0x0, 0x1a,0xaf,0xb, 0xa4, +0x7d,0x3a,0x7c,0xd7,0x80,0xb, 0x12,0x4c,0x37,0x70,0xe, 0x5, 0x24,0xb, 0xb4,0xb, +0xd0,0x7e,0x73,0x2a,0x8c,0xbc,0x7d,0x18,0xed,0xe5,0x24,0x60,0x7, 0x1b,0xe0,0xbe, +0xe0,0x0, 0x58,0xd5,0x12,0x4e,0xd8,0x80,0x1d,0x75,0x24,0x0, 0x7c,0xdf,0x80,0xb, +0x12,0x4c,0x37,0x70,0xb, 0x5, 0x24,0xb, 0xb4,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf0, +0xe5,0x24,0x60,0xa, 0xb, 0xe0,0x7e,0x73,0x2a,0x8d,0xbc,0x7e,0x18,0xdb,0x12,0x4e, +0xd8,0x80,0x22,0x75,0x24,0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xb, 0x12,0x4c,0x37,0x70, +0xe, 0x5, 0x24,0xb, 0xb4,0xb, 0xd0,0x7e,0x73,0x2a,0x8c,0xbc,0x7d,0x18,0xed,0xe5, +0x24,0x60,0xa, 0xb, 0xe0,0x7e,0x73,0x2a,0x8d,0xbc,0x7e,0x18,0xd6,0x7d,0x3b,0x39, +0x74,0x0, 0x5, 0x7d,0x3b,0xda,0x3b,0x22,0x1a,0xac,0xb, 0xa4,0x7d,0x3a,0x7c,0xe7, +0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x35,0xaa,0x6c,0x33,0x80,0x3d,0x7e,0x70, +0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc,0x3, +0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32,0x12, +0x4b,0x8c,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3,0x35, +0xaa,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf,0x2, +0x4f,0x32,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac,0xb2, +0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c,0xbc, +0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26,0xfb, +0xa, 0x28,0xa, 0x31,0x12,0x4b,0x8c,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x4b,0x8c, +0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0,0xb, +0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x36,0x44,0xbe,0xb0,0x0, 0x28,0x12,0x14,0x7a, +0xb3,0x36,0x44,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x8c,0x7a,0x37,0x2a,0x79, +0x7e,0xb3,0x37,0xf3,0x70,0x58,0x7e,0xb3,0x39,0xdd,0x70,0x52,0x7e,0xb3,0x37,0x77, +0x70,0x4c,0x7e,0x37,0x39,0x15,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f,0xbe, +0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3,0x26, +0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, 0x7e, +0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x36,0x44,0xda,0xf8, +0x22,0x7e,0x8, 0x39,0xb, 0x12,0x50,0x35,0x7e,0x8, 0x39,0x13,0x12,0x50,0x35,0x12, +0x50,0x51,0x12,0x50,0x4a,0x2, 0x50,0x18,0x7e,0x37,0x39,0xb, 0xbe,0x34,0x0, 0x0, +0x28,0x12,0x7e,0x73,0x39,0xd9,0xbe,0x70,0x5, 0x50,0x9, 0x7e,0xb3,0x38,0x38,0x70, +0x3, 0x12,0x3e,0xbe,0x22,0xb, 0xa, 0x30,0xe5,0x61,0xa, 0x2b,0xbd,0x32,0x28,0x4, +0x9d,0x32,0x80,0x2, 0x6d,0x33,0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x39,0xb9,0x2, 0x50, +0x35,0x7e,0x8, 0x2b,0xd6,0x2, 0x50,0x35,0x7e,0x73,0x28,0x93,0x7a,0x73,0x28,0x94, +0x7e,0x73,0x2a,0x20,0x7a,0x73,0x2a,0x21,0xe4,0x7a,0xb3,0x2a,0x24,0x22,0x7e,0x37, +0x33,0xeb,0xb, 0x34,0x7a,0x37,0x33,0xeb,0x7e,0x37,0x33,0xed,0xbe,0x37,0x33,0xeb, +0x28,0x3, 0x2, 0x50,0x89,0x22,0x2, 0x50,0x6e,0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9, +0xd6,0xdf,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x50,0x86,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x74, +0xa, 0x7a,0xb3,0x2a,0x6c,0x74,0x10,0x7a,0xb3,0x2a,0x6d,0x12,0x51,0x4, 0x7a,0x37, +0x2a,0x74,0x74,0x1e,0x7a,0xb3,0x2a,0x78,0x12,0x54,0xb1,0x7e,0x34,0x0, 0x96,0x7a, +0x37,0x2a,0x7f,0xe4,0x7a,0xb3,0x2a,0x83,0x74,0x4, 0x7a,0xb3,0x2a,0x84,0x7e,0x34, +0x0, 0x64,0x7a,0x37,0x2a,0x85,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0x2a,0x81,0xe4,0x7a, +0xb3,0x16,0x92,0x22,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2a,0x6e,0x7a,0x37,0x2a,0x70, +0x7a,0x37,0x2a,0x72,0x22,0x12,0x54,0xb1,0x2, 0x51,0x4, 0x12,0x51,0x15,0x7e,0xb3, +0x37,0x77,0xb4,0x1, 0xc, 0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2a,0x79,0x7a,0x37,0x2a, +0x7b,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x1f,0x7e,0x34,0x1, 0x5e,0x7a,0x37,0x2a,0x79, +0x7e,0x34,0x1, 0x2c,0x7a,0x37,0x2a,0x7b,0x7e,0x34,0x1, 0x90,0x7a,0x37,0x2a,0x6e, +0x7e,0x34,0x1, 0x7c,0x12,0x51,0xc, 0x7e,0xb3,0x2a,0x20,0x70,0x21,0x7e,0x27,0x2a, +0x79,0x7d,0x32,0x7e,0x14,0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x51,0x7f,0xbe,0x34, +0x0, 0x50,0x28,0x4, 0x7e,0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x79,0x22,0x1e, +0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x22,0x12,0x51,0x1b,0xe4,0x7a,0xb3,0x39,0xdf, +0x2, 0x51,0x93,0xe4,0x7a,0xb3,0x28,0x93,0x12,0x53,0x72,0x7e,0xb3,0x16,0x91,0xb4, +0x1, 0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f, +0x6, 0xf8,0x12,0x57,0xd2,0x12,0x51,0xdb,0x12,0x59,0x7f,0x7e,0xb3,0x16,0x90,0xb4, +0x1, 0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73, +0x26,0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e, +0x34,0x0, 0x3, 0xe4,0x12,0x17,0x53,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12, +0x17,0x53,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3, +0x26,0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0x53, +0x49,0x6c,0x55,0x12,0x52,0xa1,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0x53, +0x59,0x6c,0x55,0x12,0x52,0xa1,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x53, +0x2a,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x53,0x33,0x2e,0x24,0x26,0x86,0x12, +0x53,0x3e,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x53, +0x2a,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x53,0x33,0x2e,0x24,0x26,0x89,0x12, +0x53,0x3e,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a, +0xb3,0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0x53,0x49,0x7e,0x50,0x1, 0x12,0x52,0xa1, +0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0x53,0x59,0x7e,0x50,0x1, 0x12,0x52, +0xa1,0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0, +0x22,0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e, +0xd0,0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e, +0xe4,0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69, +0xf0,0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5, +0xb, 0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, +0x4c,0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4, +0xbd,0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a, +0x6b,0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc, +0x4f,0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24, +0x0, 0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0x7e,0x29, +0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x7a,0x1d,0x24,0x7e,0xf, 0x6, 0xf8, +0x7e,0xb3,0x2a,0x8d,0x7e,0x37,0x2a,0x72,0x22,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x8d, +0x74,0x2, 0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x8c,0x7e,0x37,0x2a, +0x70,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72,0xb, 0x30,0x90, +0x60,0x9a,0xe4,0x93,0x12,0x53,0x37,0xb, 0x24,0xa, 0x33,0xbd,0x32,0x48,0xe7,0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28,0x86,0x7a,0x37, +0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f,0x36,0x5e,0xd4, +0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d,0x3d,0x7a,0x37, +0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a,0x8c,0x7a,0x73, +0x1f,0x73,0x7e,0x73,0x2a,0x8d,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a,0x7b,0x7a,0x37, +0x1f,0x7c,0x7e,0x37,0x2a,0x7d,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a,0x7f,0x7a,0x37, +0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x39,0xe0,0x7a,0x73, +0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, 0x7e,0x73,0x1f, +0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85,0x7e,0x37,0x1f, +0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88,0x7e,0x37,0x1f, +0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53,0x28,0x8c,0xa, +0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e,0x7e,0x37,0x1f, +0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91,0x6c,0x33,0x80, +0x20,0x7c,0xb3,0x7e,0x70,0x1, 0x12,0x54,0xcd,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xd8,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7e,0x34,0x0, 0xb4,0x7a,0x37,0x2a,0x79,0x7e,0x34,0x0, 0xa0,0x7a,0x37,0x2a, +0x7b,0x7e,0x34,0xff,0x60,0x7a,0x37,0x2a,0x7d,0x22,0x7e,0x70,0x1, 0x7c,0x67,0x7c, +0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e,0x24,0x0, +0x5e,0x12,0x57,0xdf,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e,0x24,0x27,0x72, +0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff,0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0x7c,0xab,0x7e,0xb3, +0x39,0xdd,0x70,0x1b,0x7e,0xb3,0x28,0xa8,0x70,0x15,0x12,0x57,0xca,0x68,0x10,0x7e, +0xb3,0x2a,0x8a,0xbe,0xb0,0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x54,0xcd,0x22, +0xca,0xd8,0xca,0x79,0xc2,0x0, 0x6d,0x88,0x7a,0x87,0x39,0x54,0xe4,0x7a,0xb3,0x1f, +0x58,0xe5,0x1f,0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1f,0x7e,0xb3,0x28,0x84,0x60,0xa, +0x7e,0x87,0x7, 0xfa,0xbe,0x84,0x1, 0x18,0x58,0xa, 0xc2,0x14,0x6d,0x88,0x7a,0x87, +0x39,0x15,0xc1,0x53,0x12,0x86,0xa, 0x60,0x10,0x7e,0x84,0x0, 0x64,0x7a,0x87,0x39, +0xb, 0x7e,0x84,0x0, 0x32,0x7a,0x87,0x39,0x15,0x7e,0x87,0x39,0xb, 0x4d,0x88,0x68, +0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x76,0xe4,0xa, 0x3f,0x19,0xb3, +0x1f,0x34,0x12,0x56,0xce,0x7e,0x8, 0x1f,0x52,0x7c,0xbd,0x7c,0x7e,0x12,0x4d,0xc2, +0x7d,0x93,0x7e,0x87,0x39,0x15,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x39,0x15,0x7e,0x87, +0x39,0x54,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x39,0x54,0xe5,0x1f,0xbe,0xb0,0x5, 0x38, +0x1f,0x7e,0x8, 0x39,0x17,0x12,0x56,0xdb,0x50,0x7, 0x12,0x56,0xc5,0xd2,0x0, 0x80, +0x2e,0x7e,0x8, 0x39,0x17,0x7e,0x18,0x1f,0x52,0x12,0x57,0x38,0x50,0x21,0x80,0xf, +0xbe,0x94,0x0, 0x32,0x40,0x19,0x7e,0x8, 0x1f,0x52,0x12,0x85,0x95,0x50,0x10,0x12, +0x56,0xc5,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52,0x12,0x85,0xe4,0xd2,0x0, 0xb, +0xf0,0x12,0x56,0xb5,0x38,0x85,0x30,0x0, 0x30,0x6c,0xff,0x80,0x1c,0x12,0x56,0xce, +0x7e,0x8, 0x1f,0x58,0x12,0x56,0xdb,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4, +0x1, 0x5, 0x7c,0xbf,0x12,0x55,0xc, 0xb, 0xf0,0x12,0x56,0xb5,0x38,0xdf,0x75,0x1f, +0x0, 0x7e,0x34,0x0, 0x64,0x7a,0x37,0x39,0xb, 0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, +0xac,0x67,0xb, 0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x39,0x17,0x12,0x17, +0x2e,0x1b,0xfd,0x7e,0x37,0x39,0xb, 0x4d,0x33,0x78,0x34,0x7e,0x37,0x39,0x15,0xbe, +0x34,0x0, 0x32,0x40,0x3e,0x7e,0x37,0x39,0x54,0xbe,0x34,0x0, 0x19,0x40,0x34,0x90, +0x60,0x51,0x12,0x56,0xbc,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, 0x24,0x90, +0x60,0x50,0x12,0x56,0xbc,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, 0x14,0x6c, +0xff,0x80,0x7, 0x7c,0xbf,0x12,0x55,0xc, 0xb, 0xf0,0x12,0x56,0xb5,0x38,0xf4,0xd2, +0x0, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x39,0x15,0xa2,0x0, 0x92,0x14,0x12,0x57,0x21, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xe4,0x93,0x7c,0x7b, +0x1e,0x70,0xa, 0x27,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x74,0x2, +0xac,0xbf,0x9, 0xd5,0x26,0xfa,0x9, 0xe5,0x26,0xfb,0x22,0x7c,0xbd,0x7c,0x7e,0x7c, +0x6b,0xc2,0x1, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f,0x70,0x2d,0xf2, +0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0,0xbc,0xb6,0x38, +0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, 0xbc,0xb7,0x38, +0x4, 0xd2,0x1, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38,0xc9,0xa2,0x1, +0x22,0x30,0x14,0x13,0x12,0x57,0xc2,0x68,0x6, 0x7e,0xb3,0x39,0xdd,0x60,0x8, 0x7e, +0x34,0xb, 0xb8,0x7a,0x37,0x39,0x13,0x22,0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80, +0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f,0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x56,0xdf, +0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76,0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90, +0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9,0xc3,0x22,0x6c,0xaa,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x29,0x62,0x12,0x51,0x7f,0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x29,0x64,0x12,0x51,0x7f,0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac, +0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28,0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4, +0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19, +0xb4,0x28,0xb4,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xb2,0x22,0x7c,0xb9,0x6c,0x77,0x2, +0x54,0xcd,0x7e,0xb3,0x28,0xa8,0xbe,0xb0,0x1, 0x22,0x7e,0xb3,0x38,0x38,0xbe,0xb0, +0x1, 0x22,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x2e,0x24,0x16,0xe8,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e,0x34, +0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x8f,0x12,0x17,0x2e,0x1b,0xfd,0x7e, +0x34,0x2a,0x2d,0x7a,0x37,0x2b,0x95,0xe4,0x7a,0xb3,0x2b,0x93,0x7a,0xb3,0x2b,0x94, +0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x58,0x36,0x7e,0x8, 0x25,0xee,0x12,0x17,0x2e, +0x1b,0xfd,0x7e,0x34,0x2b,0x97,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2,0x74, +0x1, 0x7a,0xb3,0x25,0xf3,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0xe4, +0x7a,0xb3,0x38,0xb4,0x7a,0xb3,0x38,0xb5,0x90,0x60,0x50,0x93,0x7a,0xb3,0x38,0xb6, +0x90,0x60,0x51,0xe4,0x93,0x7a,0xb3,0x38,0xb7,0xe4,0x7a,0xb3,0x38,0xb8,0x74,0xa, +0x7a,0xb3,0x38,0xb9,0xe4,0x7a,0xb3,0x38,0xba,0x7a,0xb3,0x38,0xbb,0x74,0x1, 0x7a, +0xb3,0x38,0xbd,0x74,0x2d,0x7a,0xb3,0x38,0xc1,0x74,0x46,0x7a,0xb3,0x38,0xc2,0x74, +0x6e,0x7a,0xb3,0x38,0xd3,0x74,0x4, 0x7a,0xb3,0x38,0xd4,0xe4,0x7a,0xb3,0x38,0xc0, +0x74,0x64,0x7a,0xb3,0x38,0xd6,0x74,0x7f,0x7a,0xb3,0x38,0xd5,0x74,0x2, 0x7a,0xb3, +0x38,0xd7,0x74,0x40,0x7a,0xb3,0x38,0xd2,0xe4,0x7a,0xb3,0x38,0xcd,0x74,0xfa,0x7a, +0xb3,0x38,0xcb,0x74,0x1e,0x7a,0xb3,0x38,0xcc,0x74,0x1, 0x7a,0xb3,0x38,0xca,0x74, +0xc, 0x7a,0xb3,0x38,0xc9,0x74,0x1, 0x7a,0xb3,0x38,0xce,0xe4,0x7a,0xb3,0x38,0xcf, +0x7a,0xb3,0x38,0xd0,0x7e,0x8, 0x38,0xd8,0x7e,0x34,0x0, 0x2c,0x12,0x17,0x53,0x74, +0x1, 0x7a,0xb3,0x38,0xe3,0x74,0xf4,0x7a,0xb3,0x38,0xe4,0x74,0x19,0x7a,0xb3,0x38, +0xe5,0x74,0x38,0x7a,0xb3,0x38,0xe6,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x58,0x36, +0x7e,0x8, 0x38,0xf4,0x12,0x17,0x2e,0x1b,0xfd,0x74,0x5, 0x7a,0xb3,0x39,0x1, 0x74, +0x1, 0x7a,0xb3,0x38,0xf8,0x7e,0x34,0x0, 0x28,0xca,0x39,0x7e,0x34,0x61,0xec,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12,0x17,0x2e,0x1b,0xfd,0x22,0x6d,0x33,0x6c, +0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xfb,0x54,0x1, 0x78,0x5, 0x4e,0x70,0x1, +0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x93,0xbc,0x5a,0x38,0xe4,0x6c, +0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xd8,0xbe,0xb0,0xd, 0x38,0x5, 0x4e,0x70, +0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80,0x3, 0x4e,0x60,0x50, +0xb, 0xa0,0x12,0x59,0x78,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x92,0xbc,0xba,0x22,0xca, +0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d,0x32,0x7d,0x9b,0x75, +0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a,0xe4,0x7a,0xb3,0x8, +0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26,0xf8,0x7a,0xb3,0x26, +0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x5a,0xf4,0xb, 0x6a,0xc0,0xbd, +0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d,0x71,0x7d,0x60,0xb, +0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x72,0x7e,0x74,0x0, 0x3, +0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x5a,0xe1,0xb, 0x3a,0xd0,0xbd,0xcd, +0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80,0x19,0x12,0x5a,0xea, +0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58,0x9, 0x7e,0xb3,0x26, +0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x93,0xbc,0xba,0x38,0x99, +0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3,0x8, 0x9, 0x7a,0x97, +0x8, 0x6, 0x12,0x5a,0xd9,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12,0x5a,0xf4,0xb, 0x6a, +0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d,0x2d,0x7e,0x67,0x2a, +0x70,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, 0x90,0x12,0x5a,0xe1, +0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, 0x7a,0xb3,0x26,0xf6, +0x80,0x17,0x12,0x5a,0xea,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c,0xbd,0xd9,0x58,0x9, +0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12,0x59,0x78,0x38,0xab, +0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, 0x12,0x5a,0xd9,0x2d, +0x15,0x6c,0xaa,0x80,0x14,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0xb, 0x7a, +0x90,0xbd,0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x59,0x78,0x38,0xe7,0x7a,0xb7, +0x8, 0x4, 0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, +0x7d,0x32,0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x93,0x74,0x2, 0xa4, +0x22,0x7e,0x74,0x62,0x27,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d, +0x7f,0x7d,0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b, +0x7f,0x31,0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2f,0x7e,0xd, 0x24,0x7f,0x13, +0x12,0x5d,0xd4,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x5a,0xd9,0x7e,0xd, 0x24,0x2d, +0x15,0x7f,0x13,0x2d,0x35,0x12,0x5e,0x89,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x6e,0x1e, +0x34,0x7a,0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x5a,0xfe,0x7e, +0x37,0x28,0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e, +0x12,0x5a,0xfe,0x12,0x5b,0x6d,0x12,0x5b,0x99,0x2, 0x5b,0x5c,0xe4,0x7a,0xb3,0x39, +0xe0,0x7e,0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x39,0xe0,0x22,0xca,0x3b,0x7e, +0xf3,0x2a,0x8d,0x7e,0xe3,0x2a,0x8e,0x7e,0xd3,0x2a,0x8f,0x6c,0xcc,0x80,0x13,0x7c, +0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, 0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0x66,0x3f, +0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda,0x3b,0x22,0x7e,0x63,0x2a,0x8d,0xc2,0x16,0x6c, +0x33,0x80,0x48,0x7c,0x96,0xac,0x93,0x2e,0x44,0x0, 0x16,0x7d,0x4, 0xb, 0x4, 0x7d, +0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a,0x79, +0x8, 0x27,0x7c,0xb3,0x12,0x5b,0xfc,0x50,0x20,0x7d,0x50,0x3e,0x54,0x7e,0x7f,0x13, +0x8a,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x20,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, 0x7a, +0x50,0xbd,0x52,0x8, 0x4, 0xd2,0x16,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x94,0xbc, +0x73,0x38,0xb0,0x30,0x16,0x5, 0xd2,0x0, 0x2, 0x5c,0x18,0x22,0x7c,0xab,0x6c,0x77, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x57,0xdf,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xb, +0x70,0xbe,0x70,0x3, 0x40,0xea,0xc3,0x22,0x6c,0x33,0x6c,0x22,0x80,0x28,0x7c,0xb2, +0x12,0x5b,0xfc,0x50,0x1f,0x7c,0xb2,0x12,0x5d,0x61,0x3e,0x34,0x7e,0x7f,0x13,0x8a, +0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x5d,0xa0,0x59,0x35,0x39,0xbb,0x30,0x0, 0x5, 0x6d, +0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x94,0xbc,0x72,0x38,0xd0,0x22,0xca, +0x79,0x7c,0x5b,0x7e,0x43,0x28,0x84,0xbe,0x40,0x1, 0x28,0x2, 0xa1,0x5e,0x7e,0xa3, +0x2a,0x8d,0x7e,0x70,0x2, 0xac,0x75,0x9, 0xf3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7c, +0xbf,0x7c,0x7e,0x12,0x4c,0x21,0x7f,0x51,0x7c,0x1e,0x7c,0x3f,0x7e,0x3, 0x2a,0x8f, +0x7e,0x23,0x2a,0x8e,0xa, 0x3a,0x6d,0xdd,0x9d,0xd3,0xa, 0x9a,0xa, 0xc0,0x1b,0xc5, +0xa, 0x51,0xbd,0x5c,0x58,0x2, 0xa1,0x5e,0xa, 0x53,0x1b,0x54,0xbe,0x54,0x0, 0x0, +0x48,0x55,0x7c,0xb3,0x14,0x12,0x5b,0xfc,0x50,0x4d,0x7c,0xb3,0x14,0x12,0x5d,0x61, +0x7d,0xe3,0x7d,0x5e,0x12,0x5d,0x6c,0xb, 0x1a,0xf0,0x7d,0x5d,0x3e,0x54,0x7f,0x15, +0x2d,0x35,0xb, 0x1a,0x80,0xbe,0xf4,0x0, 0x0, 0x8, 0x11,0x9d,0x8f,0xbe,0x84,0x0, +0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x58,0x1b,0x1a,0x50,0x7c,0xb0,0x24,0xfe, +0xbc,0xb1,0x78,0x13,0x7d,0x4e,0x1b,0x44,0x7d,0x54,0x12,0x5d,0x6c,0xb, 0x1a,0x50, +0xbd,0x58,0x8, 0x3, 0x1b,0x1a,0x80,0xa, 0x83,0xb, 0x84,0xa, 0x52,0xbd,0x85,0x58, +0x5d,0x7c,0xb3,0x4, 0x12,0x5b,0xfc,0x50,0x55,0x7c,0xb3,0x4, 0x12,0x5d,0x61,0x7d, +0xe3,0x7d,0x1e,0x3e,0x14,0x7e,0x1f,0x13,0x8a,0x7f,0x61,0x2d,0xd1,0xb, 0x6a,0xf0, +0x7d,0x19,0x3e,0x14,0x7f,0x65,0x2d,0xd1,0xb, 0x6a,0x10,0xbe,0xf4,0x0, 0x0, 0x8, +0x11,0x9d,0x1f,0xbe,0x14,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x51,0x1b, +0x6a,0x50,0x7c,0xb0,0x24,0xfe,0xbc,0xb1,0x78,0x14,0x7d,0x4e,0x1b,0x44,0x7d,0x4, +0x3e,0x4, 0x2d,0x30,0xb, 0x1a,0x0, 0xbd,0x1, 0x8, 0x3, 0x1b,0x1a,0x10,0xda,0x79, +0x22,0x7e,0x73,0x2a,0x8d,0xac,0x7b,0x2e,0x34,0x0, 0x17,0x22,0x3e,0x54,0x7e,0x1f, +0x13,0x8a,0x2d,0x35,0x22,0x6c,0x33,0x6c,0x22,0x80,0x1c,0x7c,0xb2,0x12,0x5b,0xfc, +0x50,0x13,0x7c,0xb2,0x12,0x5d,0x61,0x7d,0x3, 0x12,0x5d,0xa0,0x49,0x55,0x39,0xbb, +0x7d,0x40,0x12,0x5f,0xc0,0xb, 0x20,0x7e,0x73,0x2a,0x94,0xbc,0x72,0x38,0xdc,0x22, +0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x80,0x1f,0x7c,0xb3,0x12,0x5b, +0xfc,0x40,0x16,0x7c,0xb3,0x12,0x5d,0x61,0x7d,0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, +0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x1b,0x1a,0x50,0xb, 0x30,0x7e,0x23,0x2a,0x94,0xbc, +0x23,0x38,0xd9,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x8d,0xa, 0x37, +0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x17,0x2e,0x1b,0xfd,0x6c,0xdd,0x12, +0x5f,0x79,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x45,0x12,0x5e,0x78,0x78,0x3e,0x12, +0x5f,0x81,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x17,0x85,0x7d,0x13,0x7d,0x3e,0x12,0x17, +0x85,0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5,0x2f,0x8, 0x5, 0x7e,0xe5,0x2f,0x80, +0xb, 0x6d,0x33,0x9e,0x35,0x2f,0xbd,0x3e,0x8, 0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26, +0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, 0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e, +0x73,0x2a,0x8f,0xbc,0x7c,0x38,0xb3,0x7e,0x73,0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12, +0x5f,0x9f,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80,0xa, 0x12,0x5e,0x78,0x78,0x3, 0x12, +0x5f,0x8a,0xb, 0xc0,0x7e,0x73,0x2a,0x8f,0xbc,0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0, +0x2, 0x50,0x2, 0xa1,0xef,0xda,0x3b,0x22,0xa, 0xec,0x9, 0x7e,0x2a,0xfb,0xa, 0x37, +0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e, +0x14,0x19,0x4a,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x7a,0x1d, +0x2c,0x7e,0x73,0x2a,0x8c,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12, +0x17,0x2e,0x1b,0xfd,0x6c,0xdd,0x12,0x5f,0x79,0x7a,0xb3,0x1f,0x34,0x6c,0xcc,0x80, +0x4a,0x12,0x5f,0x69,0x40,0x43,0x12,0x5f,0x5f,0x50,0x3e,0x12,0x5f,0x81,0xb, 0x1a, +0x10,0x7d,0x3f,0x12,0x17,0x85,0x7d,0x3, 0x7d,0x31,0x12,0x17,0x85,0xbd,0x30,0x58, +0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e,0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e, +0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d,0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41, +0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34,0xb, 0xc0,0x12,0x5f,0x58,0x38,0xb1, +0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12,0x5f,0x9f,0x8, 0x2, 0x7d,0x7f,0xbe, +0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, 0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7, +0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12,0x5f,0x69,0x40,0x8, 0x12,0x5f,0x5f, +0x50,0x3, 0x12,0x5f,0x8a,0xb, 0xc0,0x12,0x5f,0x58,0x38,0xec,0xb, 0xd0,0xbe,0xd0, +0x3, 0x50,0x2, 0xc1,0xb6,0xda,0x3b,0x22,0x7e,0x73,0x2a,0x8e,0xbc,0x7c,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xd8,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4, +0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16, +0x2d,0x35,0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, +0x17,0x6d,0x0, 0x7f,0x14,0x12,0x15,0xc8,0x7d,0x73,0x12,0x17,0x85,0x7d,0xe3,0x7d, +0x3f,0x12,0x17,0x85,0xbd,0x3e,0x22,0x30,0x16,0x5, 0x12,0x5d,0x75,0xc2,0x16,0x22, +0x3e,0x44,0x7e,0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0x22,0x7c,0xab,0x7c,0xb7, +0xb4,0x17,0x9, 0x7c,0xba,0x12,0x5b,0xfc,0x50,0x2, 0xd3,0x22,0xc3,0x22,0xa9,0xc5, +0xca,0xe4,0x7a,0xb3,0x39,0xe4,0x22,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0x22,0x74,0x2, +0x7d,0x3f,0x2, 0x64,0xd3,0x74,0x6, 0x12,0x63,0x91,0x7d,0x3, 0x6c,0x11,0x22,0xff, +0x70,0x8f,0x0, 0xff,0x51,0xae,0x5a,0xa5,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x37,0x31,0x1, 0xc, 0x3b,0x34,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xb, 0xf4,0x43,0x33,0x42,0x5f,0x57,0x68,0x69,0x74,0x65,0x5f,0x45,0x42,0x42,0x47, +0xd, 0x18,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x14,0x13,0x12,0x11,0x10,0xf, 0x9, 0xa, 0xb, 0xc, 0xd, +0xe, 0x15,0x16,0x17,0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x38,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x4, 0x64,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x7f,0x40,0xd, 0x18,0x25,0x18,0x10,0x6, 0x80,0x18,0x10,0x6, +0x78,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x34,0x32,0x1, 0xfb,0x2, 0x28,0x0, +0xdf,0x0, 0xe3,0x5, 0x0, 0x37,0x37,0x1, 0xb8,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0xa0,0x1, 0x18,0x0, 0x8c,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, +0x68,0x6, 0x10,0x14,0x32,0x1, 0xf, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0xb, 0xf7,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15, +0x0, 0x3, 0x54,0x1, 0x0, 0xb, 0x1, 0x51,0x1, 0x14,0x0, 0x5a,0x1, 0x1, 0x12,0x0, +0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27,0x0, 0x1, 0x0, 0x2, 0x1, 0x4, 0x1, 0x90,0x0, +0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96,0x1, 0x2c,0x1, 0x2c,0x4, 0x38,0x2, 0x64,0x7f, +0x20,0x26,0x2, 0x31,0x47,0x20,0x34,0x2, 0x61,0x97,0x20,0x46,0x2, 0x49,0x70,0x30, +0x38,0x2, 0x64,0x7f,0x20,0x38,0x2, 0x64,0x7f,0x20,0x38,0x2, 0x64,0x7f,0x20,0x38, +0x2, 0x64,0x7f,0x20,0x4, 0x5, 0x10,0x11,0x12,0x13,0x14,0x4, 0x0, 0xd2,0x2, 0x30, +0x32,0x0, 0xc8,0x1, 0x5e,0x0, 0x64,0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, +0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c,0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20, +0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, 0x4, 0x4, 0x6, 0x40,0x1, 0x18,0x1, 0x18,0x1, +0x90,0x1, 0x90,0x1, 0x90,0x1, 0x5e,0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, +0x64,0x0, 0x46,0x0, 0x78,0x0, 0x78,0x0, 0x64,0x1, 0x18,0x1, 0x18,0x14,0x8, 0x0, +0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0,0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, +0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80,0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, +0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8,0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, +0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88,0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, +0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, 0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x54,0x0, 0x54, +0x7e,0x44,0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a, +0x1d,0x26,0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, +0x6, 0x12,0x63,0x28,0x74,0x2d,0x7a,0xb3,0x37,0xe8,0x74,0x28,0x7a,0xb3,0x37,0xe9, +0x74,0x11,0x7a,0xb3,0x37,0xea,0x7a,0xb3,0x37,0xeb,0x7a,0xb3,0x37,0xec,0x74,0xa0, +0x7a,0xb3,0x37,0xed,0x7e,0x34,0x0, 0x6a,0xca,0x39,0x7e,0x34,0x61,0x65,0x7e,0x24, +0x0, 0xff,0x7e,0x8, 0x37,0xee,0x12,0x17,0x2e,0x1b,0xfd,0xe5,0x25,0x7a,0xb3,0x38, +0x19,0xe5,0x28,0x7a,0xb3,0x38,0x8, 0x22,0x7d,0x42,0x7f,0x60,0x7d,0x3, 0x12,0x65, +0x4b,0x74,0x2, 0x12,0x63,0x91,0x7d,0xf3,0x4e,0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, +0x12,0x5f,0xee,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f,0x6, 0x12,0x64,0x6e,0x5e, +0xf4,0xff,0xfd,0x12,0x5f,0xee,0x2, 0x5f,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, +0x3a,0xe4,0x12,0x17,0x53,0x7e,0x8, 0x26,0x8c,0x7e,0x34,0x0, 0xc8,0x74,0xff,0x12, +0x17,0x53,0x7e,0x8, 0x26,0xb4,0x7e,0x34,0x0, 0xc8,0x12,0x17,0x53,0x90,0x60,0x9a, +0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x27,0x76,0x74,0xff,0x2, 0x17, +0x53,0x7c,0x6b,0x6c,0x77,0x6c,0xaa,0x7e,0xb3,0x39,0xe4,0xb4,0xa5,0x46,0x12,0x65, +0x2a,0x75,0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0x12,0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0x12, +0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc, +0x12,0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0x12,0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1, +0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0x7e,0x8, 0x28, +0xae,0x7e,0x34,0x1, 0xe, 0x74,0xff,0x12,0x17,0x53,0x12,0x67,0x52,0x7e,0x8, 0x29, +0xbc,0x12,0x65,0x5b,0x7e,0x8, 0x2a,0x20,0x7e,0x34,0x0, 0xb, 0xe4,0x2, 0x17,0x53, +0xca,0xf8,0x7e,0x73,0x2a,0x97,0xa, 0x47,0x7e,0x73,0x2a,0x90,0xa, 0x57,0x2d,0x54, +0x7e,0xa3,0x2a,0x92,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x91,0x7e,0xa3, +0x2a,0x93,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xd8,0x7e, +0x18,0x2a,0x99,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xfb,0x7e,0x18,0x2a, +0xbc,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7a,0xb3,0x2b,0x1f,0x70,0x5, 0x12, +0x36,0x1c,0x80,0x6, 0xb4,0x1, 0x6, 0x12,0x36,0x13,0x12,0x25,0xc5,0x22,0x12,0x64, +0x7c,0x7e,0x35,0x36,0x12,0xa5,0xd9,0xa9,0xd2,0xb4,0xd3,0x22,0x7d,0x52,0xf5,0x3a, +0x7c,0xb6,0x7c,0xa5,0xa, 0x44,0xf5,0x39,0x7f,0x21,0xf5,0x38,0xa9,0xc2,0xb4,0x74, +0xb, 0x12,0x64,0xa7,0xe5,0x3a,0x12,0x64,0xa7,0xe5,0x39,0x12,0x64,0xa7,0xe5,0x38, +0x12,0x64,0xa7,0xe4,0x2, 0x64,0xa7,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xd3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12,0x63,0x91,0x4c,0xff,0x78,0x5, 0x5e, +0x70,0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0x64,0xd3,0xda,0xf8,0x22,0x74, +0x6, 0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73,0x7d,0x52,0x7c,0xab,0x7e, +0xb3,0x39,0xe4,0xb4,0xa5,0x3c,0x12,0x65,0x2a,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc, +0x12,0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0x12,0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36, +0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9, +0xd2,0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0x64,0xd3,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3, +0x22,0xd2,0xc8,0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0, +0xb4,0x12,0x65,0x4b,0xe4,0x12,0x64,0xb2,0x2, 0x5f,0xde,0xa9,0xd5,0xca,0xa9,0xd1, +0xea,0xa9,0xc1,0xea,0x74,0xa5,0x7a,0xb3,0x39,0xe4,0x22,0x6c,0xaa,0x74,0x3, 0x12, +0x65,0xa0,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0xa, 0x12,0x65,0x96,0x7f,0x70,0x2d, +0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79,0x41,0x0, 0x28,0xe4,0xa, 0x4a,0x7f,0x10, +0x2d,0x34,0x39,0xb1,0x0, 0x46,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0x50,0xb, 0xa0, +0xbe,0xa0,0xa, 0x40,0xc8,0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a,0x22, +0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xb0,0x22,0xca,0xf8,0x7f,0x71,0x6d,0xdd, +0x6c,0xaa,0x7e,0xf0,0x7f,0xc2,0x0, 0x6d,0x44,0x80,0x1e,0x7d,0xc4,0x3e,0xc4,0x7f, +0x17,0x2d,0x3c,0x12,0x66,0x39,0xbd,0x3d,0x48,0xd, 0x7d,0x34,0x3e,0x34,0x2d,0x3f, +0x7d,0x2e,0x12,0x66,0x39,0x7d,0xd3,0xb, 0x44,0x7e,0xc5,0x34,0xbd,0xc4,0x38,0xdb, +0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba,0x7d,0x3d,0x60,0x5, 0xe, +0x34,0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f,0x10,0x2e,0x35,0x34,0x7a, +0x1b,0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f,0x17,0x2d,0x35,0xb, 0x1a, +0x30,0x7f,0x60,0x2e,0xd5,0x34,0x7e,0x6b,0xb0,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb, +0x7c,0xb7,0x12,0x65,0xa2,0xb, 0x44,0x7e,0x55,0x34,0xbd,0x54,0x38,0xd8,0xda,0xf8, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x17,0x85,0xca, +0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x0, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x19, +0x4e,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x16,0x1d,0x6d,0x11, +0x7e,0x4, 0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0x66,0x31,0x7d,0xc3,0xbd,0xdc,0x50, +0x2, 0x7d,0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe, +0xd4,0x0, 0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0xe1,0x3a,0xbe, +0xd4,0x4, 0xb0,0x8, 0x2, 0xd2,0x0, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f, +0x34,0xbd,0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, +0x40,0xe7,0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x80,0x7f,0xbd,0xd, 0x8, 0x5, 0x30, +0x0, 0x2, 0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0x66,0x31,0x1a,0x26,0x1a, +0x24,0x2f,0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0x67,0x48,0x9f,0x55, +0x6c,0xee,0x80,0x1d,0x12,0x67,0x3f,0xb, 0x1a,0x90,0x7d,0x39,0x12,0x17,0x85,0x7d, +0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51,0xb, 0xd0,0xb, +0xe0,0xbc,0xfe,0x38,0xdf,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, 0x1d,0x12,0x67, +0x48,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, 0xbd,0x1, 0x8, +0x2, 0x7d,0x10,0x6c,0xee,0x80,0xd, 0x12,0x67,0x3f,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b, +0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xef,0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x74, +0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x15,0xc8,0x7d, +0x13,0x22,0x7e,0x8, 0x35,0xaa,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x17,0x53,0x7c,0xab, +0x12,0x64,0x59,0x7c,0xba,0x12,0x13,0xc7,0x2, 0x0, 0x1e,0x7e,0xd7,0x2b,0x2c,0xbe, +0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12,0x67,0x5e,0x12,0x37,0xb9,0x7a,0xd7,0x2b,0x2c, +0x7e,0x73,0x2b,0x19,0xa, 0x37,0x3e,0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13, +0x1, 0x12,0x37,0xd1,0x74,0x1, 0x22,0x12,0x67,0xdf,0x38,0x2, 0xe4,0x22,0x12,0x67, +0xce,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x67,0x6b,0x2, 0x67,0xb0, +0xb4,0x3, 0x5, 0x12,0x67,0xc0,0x80,0x2, 0xe4,0x22,0x12,0x67,0xf3,0x74,0x1, 0x22, +0x12,0x67,0xd6,0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x8c,0x2, 0xd, 0x72,0x7e,0xa3, +0x34,0x39,0x74,0x4, 0xa4,0x22,0x74,0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7e,0x8, 0x2a,0x8c,0x12,0xd, 0x72,0xe4, +0x12,0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0x7f,0x60, +0x7e,0xa3,0x2a,0x8c,0x7e,0xb3,0x2a,0x8d,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d, +0x3f,0xe4,0x12,0x17,0x53,0x7f,0x6, 0x7d,0x3f,0x12,0x17,0x53,0x7a,0xb3,0x16,0x91, +0x22,0x7f,0x70,0x7e,0x33,0x2a,0x93,0xa, 0x43,0x7e,0x33,0x2a,0x92,0xa, 0x53,0x2d, +0x54,0x3e,0x54,0x7c,0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x17, +0x53,0x7f,0x7, 0xa, 0x3a,0x2, 0x17,0x53,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51, +0x7f,0x40,0x7f,0x15,0x12,0x68,0x21,0x12,0x6a,0x70,0x7e,0xe0,0x1, 0x12,0x37,0xd1, +0x30,0x1c,0xfd,0x74,0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x6a,0x60,0x6c,0xdd,0x80, +0x18,0x74,0x2, 0xac,0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd, +0x7f,0x5, 0x2d,0x15,0x12,0x6a,0x77,0xb, 0xd0,0x7e,0x73,0x2a,0x93,0xa, 0x7, 0x7e, +0x63,0x2a,0x92,0xa, 0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78, +0xbc,0x7f,0x5, 0x7c,0xbf,0x2e,0x73,0x2a,0x92,0x12,0x69,0x41,0xda,0x79,0xda,0xd8, +0x22,0x7e,0xb3,0x2b,0x21,0x70,0x41,0x12,0x6c,0x71,0x50,0xfb,0xe4,0x6c,0x77,0x6c, +0x66,0x12,0x68,0xf9,0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x91, +0x12,0x68,0x48,0x74,0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x68,0xf9,0x7e,0x8, +0x7, 0x7a,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x68,0x48,0x74,0x2, 0x7a, +0xb3,0x2b,0x21,0xe4,0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x25,0x96, +0x7c,0xba,0x12,0x13,0xc7,0x74,0xa, 0x12,0x3b,0x7e,0x7c,0xb9,0x12,0x0, 0x1e,0x2, +0x36,0xfe,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xfb,0x2e,0x34,0x16,0xe8, +0x12,0x6e,0x51,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x39,0x93, +0x2d,0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x93,0xbc,0x6a,0x38,0xd6, +0x22,0xca,0xd8,0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0xa8,0xbf,0x7c,0xeb,0x6c,0xdd, +0x80,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74, +0x4, 0x2f,0x11,0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x15,0x77,0x1b,0x6a,0x30, +0xb, 0xd0,0xbc,0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f, +0x40,0x7e,0xa3,0x2a,0x93,0xa, 0x3a,0x7e,0xa3,0x2a,0x92,0xa, 0x7a,0x2d,0x73,0x7e, +0xd, 0x29,0x7c,0x7f,0x12,0x69,0x41,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x29, +0x7f,0x4, 0x12,0x17,0x2e,0x1b,0xfd,0x7e,0xb3,0x2b,0x20,0xb4,0x1, 0x22,0x6c,0xaa, +0x80,0x1a,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, +0x2d,0x13,0xb, 0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2, +0xda,0x79,0x22,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, 0x74,0x1, 0x7a,0xb3,0x2b,0x19, +0x12,0x1b,0xc3,0x7c,0xe7,0x80,0x5f,0x12,0x3f,0xcf,0x12,0x37,0xc0,0x30,0x1c,0xfd, +0x12,0x6f,0xd9,0x12,0x6a,0x60,0x6c,0xdd,0x80,0x3d,0x7e,0x50,0x2, 0xac,0x5d,0x49, +0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, 0x1d,0x2e,0x17,0x2b,0x1d,0x7e, +0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19,0xb0,0x80,0x18,0xbe,0x34,0x19, +0x28,0x28,0x10,0xa, 0x3d,0x12,0x26,0xfe,0xbe,0xb0,0xff,0x68,0x8, 0x4, 0x7a,0x39, +0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x6a,0x53,0x2d,0x23,0xa, 0x3d,0xbd,0x32, +0x48,0xb8,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa,0x78,0x99,0xda,0x79, +0xda,0xd8,0x22,0x7e,0x73,0x2a,0x93,0xa, 0x37,0x7e,0x53,0x2a,0x92,0xa, 0x25,0x22, +0x7e,0xb3,0x2a,0x92,0x7e,0x73,0x2a,0x93,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e, +0x7e,0x8, 0x2a,0x8c,0x2, 0x0, 0x2e,0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x29,0x7f,0x30,0x12, +0x6e,0x41,0x7a,0x55,0x31,0x7e,0xb3,0x2b,0x3c,0xf5,0x2e,0xe4,0x7a,0xb3,0x2b,0x3c, +0x7f,0x3, 0x7e,0x1d,0x29,0x12,0x67,0xfe,0x12,0x67,0xd6,0x12,0x27,0xf0,0x75,0x2d, +0x0, 0x12,0x67,0xef,0x30,0xf, 0xfd,0x74,0x1, 0x12,0x6f,0xd1,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6b,0x4, 0x12,0x6c,0x7c,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x2f,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x29,0x2d,0x13,0x12, +0x6a,0x77,0x7e,0x35,0x2f,0xb, 0x34,0x7a,0x35,0x2f,0x7e,0x35,0x31,0xbe,0x35,0x2f, +0x38,0xdc,0x5, 0x2d,0xe5,0x2d,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2e,0x7a,0xb3,0x2b, +0x3c,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x8c,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x38,0x7d, +0x71,0x7a,0x25,0x36,0x7a,0x35,0x34,0x12,0x27,0xfe,0x50,0x77,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x8d,0x12,0x6c,0x2a,0x12,0x6c,0x10,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x33,0x12,0x5f,0x58,0x38,0xea,0x6c,0xcc,0x80,0x53,0x7e,0xa3,0x2a,0x8d,0x7c,0x7a, +0x12,0x6c,0x2a,0x75,0x3a,0x0, 0x80,0x27,0x7e,0xb3,0x38,0xc9,0xbe,0xb1,0x3a,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x73,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x75,0x7e,0x71,0x3a,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3a,0x7e, +0xb3,0x2a,0x8f,0xbe,0xb1,0x3a,0x38,0xd0,0x7e,0x34,0x10,0x0, 0x74,0x2, 0xa4,0x59, +0x35,0x34,0x4e,0x12,0x6c,0x10,0x7e,0x34,0x34,0x50,0x12,0x6c,0x33,0xbc,0xdc,0x38, +0xa9,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x8f,0x7a,0x73,0x25,0xb7,0xe4, +0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a,0x77,0x25,0xba,0x7a,0x77, +0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x3e,0xa, 0x37,0x12,0xe, 0x37,0x7d, +0x37,0x12,0x72,0xf9,0x7e,0x35,0x38,0x7a,0x37,0x25,0xbe,0xe4,0x7a,0xb3,0x25,0xb8, +0x12,0x6c,0x21,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x3c,0x70,0xf, 0xe4,0x7a,0xb3, +0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80,0x16,0x74,0x1, 0x7a,0xb3, +0x25,0xb9,0x7e,0x35,0x34,0x7a,0x37,0x25,0xba,0x7e,0x35,0x36,0x7a,0x37,0x25,0xbc, +0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12,0xd, 0x7, 0xda,0x3b,0x22, +0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25,0xb6,0xe4,0x7a,0xb3,0x25, +0xb9,0x7e,0x73,0x2a,0x8d,0x7a,0x73,0x25,0xb7,0x22,0xac,0x7c,0x3e,0x34,0x7d,0xf7, +0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37,0x25,0xbc,0x7a,0x37,0x25, +0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22,0x7e,0xb3,0x2b,0x3d,0x70, +0x1f,0x12,0x3f,0xcf,0x12,0x6c,0x71,0x50,0xfb,0x12,0x6a,0x80,0x12,0x6f,0xe3,0x20, +0x13,0x3, 0x12,0x6c,0xc6,0x74,0x2, 0x7a,0xb3,0x2b,0x3d,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7e,0xa3,0x2a,0x8d, +0xa, 0x3a,0x3e,0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x17,0x53,0x90,0x60,0x93,0x93, +0xa, 0x3b,0x7e,0xb3,0x2a,0x90,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43, +0x6c,0x77,0x80,0x1d,0xa, 0x27,0x2d,0x24,0x12,0x6f,0x6b,0xb, 0xa, 0x0, 0x7e,0x30, +0x2, 0xac,0x37,0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, +0x70,0xbc,0xa7,0x38,0xdf,0x22,0xca,0x3b,0x7e,0xb3,0x2b,0x2e,0x7a,0xb3,0x1f,0x33, +0x7e,0xf3,0x2b,0x81,0x12,0x6e,0xb8,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc, +0x12,0x6e,0x38,0xf5,0x29,0x7e,0x73,0x2b,0x2e,0xbe,0x71,0x29,0x68,0x36,0x7e,0x70, +0x4, 0xac,0x7d,0xa, 0x2c,0x12,0x6e,0x4b,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, +0xe, 0x7e,0x14,0x2, 0xe0,0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2a, +0x7e,0x70,0x1d,0xac,0x7e,0x2e,0x34,0x38,0x5c,0x6d,0x22,0x7a,0x1f,0x38,0x58,0x7c, +0xbc,0x12,0x6d,0x45,0xb, 0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x81,0xbc, +0x7f,0x68,0x6, 0x7a,0xf3,0x2b,0x81,0xd2,0x10,0xd2,0x0, 0x7e,0xb3,0x1f,0x33,0x12, +0x22,0x1f,0xda,0x3b,0x22,0xca,0x3b,0x7a,0xd, 0x2e,0x7c,0xcb,0x7e,0xb3,0x2b,0x3c, +0xf5,0x32,0x7e,0xb3,0x2b,0x2e,0xf5,0x33,0x7e,0xd3,0x2b,0x33,0x7e,0xe3,0x2b,0x3e, +0x7e,0xf3,0x2b,0x3f,0x7e,0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, +0x24,0xf2,0x12,0x17,0x2e,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, +0x73,0x7e,0x8, 0x25,0x2a,0x12,0x17,0x2e,0x1b,0xfd,0x7c,0xbc,0x12,0x9b,0x97,0x74, +0x1, 0x7a,0xb3,0x2b,0x3c,0x74,0x5, 0xac,0xbc,0x12,0x27,0x55,0x74,0x5, 0xac,0xbc, +0x12,0x27,0x43,0x74,0x5, 0xac,0xbc,0x12,0x27,0x4c,0x74,0x5, 0xac,0xbc,0x9, 0x75, +0x26,0x37,0xbe,0x73,0x2b,0x81,0x68,0x6, 0x7a,0x73,0x2b,0x81,0xd2,0x10,0xc2,0x0, +0x12,0x6e,0x38,0x12,0x22,0x1f,0x12,0x67,0xe8,0x30,0xf, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x14,0x40,0x0, 0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, +0xc8,0x12,0x6b,0x4, 0x12,0x6e,0x41,0x7a,0x55,0x34,0x7e,0xd, 0x2e,0x7e,0x18,0xd, +0xc8,0x12,0x65,0xaa,0x12,0xa3,0x5e,0xe5,0x32,0x7a,0xb3,0x2b,0x3c,0xe5,0x33,0x7a, +0xb3,0x2b,0x2e,0x7a,0xd3,0x2b,0x33,0x7a,0xe3,0x2b,0x3e,0x7a,0xf3,0x2b,0x3f,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x17,0x2e, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x73, +0x12,0x17,0x2e,0x1b,0xfd,0xda,0x3b,0x22,0x74,0x5, 0xac,0xbc,0x9, 0xb5,0x26,0x33, +0x22,0x7e,0xa3,0x2a,0x8d,0x7e,0xb3,0x2a,0x8c,0xa4,0x22,0x2d,0x32,0x2e,0x34,0x17, +0x75,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7c,0x2b,0x7e,0xb3,0x1f,0x33, +0xbc,0x2b,0x68,0x4f,0x12,0x6e,0xb8,0x7c,0x3b,0x7c,0xb2,0x12,0x6e,0xb8,0x7c,0xab, +0xbe,0x30,0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, +0x2a,0x12,0x6e,0x4b,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad, +0x32,0x2e,0x34,0x16,0x93,0x6d,0x22,0x30,0x1a,0x3, 0x2, 0x6e,0xe5,0x7e,0xb3,0x2b, +0x3c,0xb4,0x1, 0xf, 0x12,0x6e,0x41,0x7a,0x55,0x29,0x7e,0x8, 0xd, 0xc8,0x74,0x1, +0x2, 0x6f,0x16,0x22,0x7e,0xb3,0x2b,0x2e,0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac, +0x57,0x9, 0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70, +0x4, 0x40,0xe9,0x74,0xff,0x22,0x7c,0xab,0x12,0x6f,0xc9,0xd2,0x1a,0x7c,0xba,0x12, +0x6e,0x5a,0xc2,0x1a,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b,0x7e,0x63, +0x2a,0x90,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x8d,0xa, 0x16,0xad,0x10,0x7d,0x21, +0x12,0x6f,0x6b,0xa, 0x26,0x7a,0x25,0x29,0x74,0x1d,0xac,0x7b,0x2e,0x34,0x38,0x5c, +0x6d,0x22,0xe4,0x2, 0x6f,0x16,0x7c,0xab,0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11, +0x12,0x6f,0x59,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb,0x12,0x6f,0x4d,0x2d,0xfe,0x80, +0xf, 0x12,0x6f,0x59,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb,0x12,0x6f,0x4d,0x9d,0xfe, +0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x29,0xbd,0xf4,0x38,0xd0,0x22,0x7d,0xf4,0x3e, +0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0, +0x1a,0xeb,0x7f,0x61,0x2e,0xd5,0x29,0x7e,0x6b,0xb0,0x22,0x3e,0x24,0x7e,0xf, 0x39, +0xac,0x2d,0x12,0x22,0x7e,0xb3,0x38,0xd, 0x70,0x2e,0x7e,0x73,0x37,0xf0,0xbe,0x70, +0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x38,0x38,0xb4,0x1, 0x3, 0x7e,0x70,0x6, 0xa, +0x37,0x2e,0x34,0xf, 0xf0,0x12,0x6e,0x51,0x7c,0xab,0xe5,0x61,0xa, 0x3b,0x2e,0x37, +0x39,0x56,0x7a,0x37,0x39,0x56,0x80,0xc, 0x7e,0xa3,0x37,0xf1,0xbe,0xa0,0x7f,0x28, +0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x6f,0xb9,0x75,0x61,0x0, 0x7a,0xb3,0x39,0xd8, +0xc2,0x1b,0x22,0x12,0x6c,0x71,0x50,0xfb,0x22,0xa9,0xd1,0xcb,0x74,0x1, 0x2, 0x0, +0xe, 0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, +0x6, 0xfc,0x22,0x12,0x27,0xfe,0x50,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22,0x12,0x92, +0x89,0x12,0x90,0x5b,0x2, 0x6f,0xe3,0x7e,0xa3,0x2f,0xc7,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x39,0x5, 0x40,0x39,0x7e,0x37,0x39,0x5, 0xb, 0x34,0x7a,0x37, +0x39,0x5, 0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x38,0x3b,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x39,0xce,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xd8,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x7e,0xa3,0x38,0xb3,0x7c,0xba,0x4, 0x7a,0xb3,0x38,0xb3,0x7a, +0xa3,0x37,0xf9,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0,0x82, +0x12,0x35,0x87,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b,0x32, +0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x38,0xb4,0xc4,0x54,0x7, 0xbe,0xb0, +0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, 0xb4,0x1, 0x7, 0x74, +0x1, 0x7a,0xb3,0x38,0xf, 0x22,0x74,0x1, 0x7a,0xb3,0x38,0xf, 0xe4,0x7a,0xb3,0x38, +0xb4,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba,0x12,0x70,0x77,0x80, +0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3,0x7c,0x7a,0x12,0x71, +0x1b,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xef,0x38,0x10,0x7c,0xb3,0x24, +0x80,0x7c,0x7a,0x12,0x70,0xed,0xa5,0xbb,0x8f,0x3, 0x75,0x19,0x1, 0xa5,0xbb,0xfc, +0x5, 0x7c,0xba,0x2, 0x3b,0x30,0x74,0x1, 0x7a,0xb3,0x34,0x4f,0x22,0x7c,0x6b,0x2e, +0x60,0xdd,0x68,0x26,0x2e,0x60,0xfd,0x68,0x21,0x1b,0x61,0x68,0x1d,0x1b,0x62,0x68, +0x19,0x1b,0x61,0x68,0x15,0x1b,0x60,0x68,0x11,0x2e,0x60,0xa, 0x78,0x4, 0x7a,0x73, +0x37,0xe7,0xa, 0x2b,0x19,0x72,0x37,0xe8,0xd2,0x11,0x22,0xbe,0xb0,0xeb,0x68,0x3, +0xb4,0xec,0x33,0x7e,0x27,0x39,0x7, 0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e, +0x24,0x0, 0x1, 0x7a,0x27,0x39,0x7, 0x15,0x1a,0x7e,0x27,0x39,0x7, 0xbe,0x24,0x0, +0x1, 0x78,0x10,0xa5,0xbf,0x9, 0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a, +0x37,0x39,0x7, 0x75,0x1a,0xea,0x22,0x7e,0xb3,0x39,0x9, 0x4, 0x7a,0xb3,0x39,0x9, +0xe5,0x19,0xb4,0x1, 0x8, 0xe4,0x7a,0xb3,0x39,0x9, 0x75,0x19,0x0, 0x7e,0x73,0x39, +0x9, 0x7a,0x73,0x37,0xf7,0x22,0x70,0x5, 0x7e,0xb3,0x38,0xb4,0x22,0xbe,0xb0,0x3, +0x38,0x15,0x75,0x1d,0x0, 0x30,0x12,0x6, 0x7e,0x18,0x33,0x15,0x80,0x4, 0x7e,0x18, +0x33,0x53,0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1d,0x0, 0xa, +0x1b,0x7e,0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68, +0x3, 0xb4,0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x39,0x5, 0x80,0x2, 0x15, +0x1a,0x2, 0x6f,0xf7,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x72,0xd, 0xbe, +0xb0,0x80,0x40,0xc, 0xbe,0xb0,0xef,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x37,0x68,0x22, +0xb4,0xfc,0x5, 0x7e,0xb3,0x38,0xf, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28, +0xa8,0x60,0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x37,0x77,0x60,0x3, 0x4e,0xa0,0x2, 0x7c, +0xba,0x22,0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0x2e,0x22,0x74,0xff,0x22,0xb4,0xeb,0x5, +0xe4,0x7a,0xb3,0x39,0xa, 0x7e,0x73,0x39,0xa, 0xa, 0x27,0x2e,0x24,0x0, 0x6, 0x12, +0x57,0xdf,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x39,0xa, 0xb4,0x3, 0xb, 0xe4,0x7a, +0xb3,0x39,0xa, 0x6d,0x33,0x7a,0x37,0x39,0x7, 0x75,0x1a,0xeb,0x7c,0xba,0x22,0xe4, +0x7a,0xb3,0x38,0xb4,0x7e,0x8, 0x33,0x15,0x12,0x72,0x8e,0x7e,0x8, 0x33,0x53,0x7e, +0x34,0x0, 0x3e,0x12,0x17,0x53,0x7e,0x18,0x33,0x15,0x7a,0x1d,0x14,0x12,0x72,0x70, +0x2, 0x72,0x63,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x38,0xb4,0xf5,0x91,0x22, +0x2, 0x72,0x73,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90,0xc2, +0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e,0x34, +0x0, 0x3e,0x74,0xff,0x2, 0x17,0x53,0x30,0x1c,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12, +0x13,0x2c,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x67,0xce,0x49,0x35,0x34,0x3b, +0x49,0x15,0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40, +0x15,0xbe,0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x92,0x7e, +0x73,0x2a,0x93,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12, +0x67,0xdf,0x28,0xe, 0x12,0x67,0x97,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, +0x80,0x2, 0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80, +0x3c,0x7c,0xb9,0x12,0x5d,0x61,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc, +0xb, 0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x3f,0xa, 0x98,0x6d,0x88,0x7f, +0x10,0x7f,0x4, 0x12,0x15,0x5b,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, +0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a, +0x94,0xbc,0x89,0x38,0xbc,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x20,0x4c,0xaa,0x78,0x11, +0x7e,0xb3,0x2a,0x21,0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x25,0x80, +0xb, 0xbe,0xa0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0x29,0x7e,0x34,0x0, 0x5a, +0xca,0x39,0x7e,0x18,0x28,0xae,0x7e,0x8, 0x29,0x8, 0x12,0x17,0x2e,0x1b,0xfd,0x6c, +0xff,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae,0x12,0x73,0xa8,0x74,0x9, 0xac,0xbf, +0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12,0x75,0x86,0x12,0x76,0x79,0xb, 0xf0, +0xbe,0xf0,0xa, 0x40,0xdc,0xda,0xf8,0x22,0x7d,0xd3,0x7e,0x44,0x2, 0xd0,0x7e,0xa3, +0x2a,0x8e,0x74,0x40,0xa4,0x7d,0xb5,0x1b,0xb4,0xbe,0xd4,0x0, 0x3f,0x38,0x29,0x7e, +0xe4,0x0, 0x3f,0x9d,0xed,0x7e,0xf4,0x1, 0xfb,0xad,0xef,0x7d,0x3f,0x7d,0x2e,0x12, +0x74,0x85,0x7f,0x71,0xbe,0x78,0x0, 0x34,0x40,0x4, 0x7e,0x78,0x0, 0x34,0x7e,0x18, +0x0, 0x34,0x9f,0x17,0x7f,0x71,0x81,0x77,0x7d,0xcb,0x9e,0xc4,0x0, 0x3f,0xbd,0xcd, +0x38,0x24,0x7d,0x5d,0x9d,0x5c,0x7e,0xf4,0x2, 0x28,0xad,0xf5,0x7d,0x3f,0x7d,0x2e, +0x12,0x74,0x85,0x7f,0x71,0xbe,0x78,0x0, 0x32,0x40,0x4, 0x7e,0x78,0x0, 0x31,0x12, +0x75,0x7d,0x2f,0x71,0x80,0x61,0x7d,0xcb,0xb, 0xc4,0x1e,0xc4,0x7d,0x5c,0x1b,0x54, +0xbd,0x5d,0x40,0xc, 0x7d,0xf5,0x9d,0xfd,0x6d,0xee,0x7e,0x14,0x0, 0xdf,0x80,0xa, +0x7d,0xfd,0x9d,0xfc,0x6d,0xee,0x7e,0x14,0x0, 0xe3,0x7f,0x17,0x12,0x15,0x6c,0x7f, +0x71,0x12,0x74,0x85,0x7f,0x71,0xbd,0x5d,0x7d,0x34,0x40,0xc, 0x1e,0x34,0x1b,0x34, +0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d,0x22,0x2f,0x71,0xbe,0x78, +0x0, 0x34,0x50,0x6, 0x7e,0x78,0x0, 0x34,0x80,0xd, 0x12,0x75,0x7d,0x7d,0x13,0x6d, +0x0, 0xbf,0x70,0x28,0x2, 0x7f,0x71,0x7d,0x3f,0x22,0x9d,0x32,0x12,0x17,0x85,0x7d, +0x13,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5, +0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12,0x8c,0xa3,0x7d,0x3, 0x7e,0x70,0x9, +0xac,0x7e,0x49,0x13,0x28,0xb0,0xbe,0x14,0x2, 0x60,0x50,0x5, 0x12,0x75,0x72,0x40, +0xb, 0xbe,0x14,0x69,0xb0,0x28,0x1f,0x12,0x75,0x72,0x28,0x1a,0x3e,0x4, 0xbe,0x14, +0x2, 0x30,0x50,0x5, 0x12,0x75,0x72,0x40,0xb, 0xbe,0x14,0x69,0xe0,0x28,0x7, 0x12, +0x75,0x72,0x28,0x2, 0x3e,0x4, 0xbe,0x4, 0x1, 0x0, 0x28,0x4, 0x7e,0x4, 0x1, 0x0, +0x74,0x9, 0xac,0xbf,0x49,0x25,0x29,0x62,0x49,0x33,0x28,0xae,0x12,0x74,0x7a,0x7d, +0x13,0x5d,0x1e,0x7e,0x70,0x9, 0xac,0x7f,0x49,0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe, +0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d,0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f, +0x2d,0x21,0x1b,0x58,0x20,0x80,0xd, 0xbd,0xf1,0x40,0x9, 0x2e,0x34,0x29,0x62,0x9d, +0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe, +0x49,0x35,0x28,0xb0,0x12,0x74,0x7a,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f, +0x49,0x32,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, +0x7d,0x2, 0x2e,0x4, 0x29,0x64,0x2d,0x13,0x1b,0x8, 0x10,0x80,0x12,0xbd,0x31,0x40, +0xe, 0x7e,0x50,0x9, 0xac,0x5f,0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30,0xda, +0x79,0x22,0x74,0x9, 0xac,0xbf,0x49,0x25,0x29,0x64,0xbd,0x12,0x22,0x7d,0x34,0x6d, +0x22,0x9e,0x18,0x0, 0x32,0x22,0x7d,0xf3,0x9f,0x11,0x7e,0x44,0x5, 0x0, 0x7e,0xa3, +0x2a,0x8f,0x74,0x40,0xa4,0x7d,0xd5,0x1b,0xd4,0xbe,0xf4,0x0, 0x3f,0x38,0x1f,0x7e, +0x24,0x0, 0x3f,0x9d,0x2f,0x7e,0x34,0x1, 0xb8,0x12,0x76,0x5e,0xbe,0x18,0x0, 0x37, +0x40,0x4, 0x7e,0x18,0x0, 0x37,0x7e,0x8, 0x0, 0x37,0x9f,0x1, 0x7f,0x10,0x7d,0x5d, +0x9e,0x54,0x0, 0x3f,0xbd,0x5f,0x38,0x1f,0x12,0x76,0x70,0x40,0x1a,0x7d,0x3d,0x9e, +0x34,0x0, 0x40,0x12,0x76,0x56,0xbe,0x18,0x0, 0x37,0x40,0x4, 0x7e,0x18,0x0, 0x36, +0x12,0x76,0x67,0x2f,0x10,0x80,0x14,0x12,0x76,0x70,0x50,0xf, 0x7d,0x3d,0x9e,0x34, +0x0, 0x20,0x12,0x76,0x56,0x7d,0x14,0x6d,0x0, 0x2f,0x10,0xbe,0xf4,0x0, 0x3f,0x28, +0x54,0xbd,0x5f,0x28,0x50,0x7d,0xed,0xb, 0xe4,0x1e,0xe4,0x7d,0x5e,0x1b,0x54,0xbd, +0x5f,0x40,0x6, 0x7d,0x35,0x9d,0x3f,0x80,0x4, 0x7d,0x3f,0x9d,0x3e,0x6d,0x22,0x7e, +0x14,0x0, 0xe0,0x12,0x15,0x6c,0x12,0x76,0x60,0xbd,0x5f,0x7d,0x14,0x40,0xc, 0x1e, +0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, 0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f, +0x10,0xbe,0x18,0x0, 0x37,0x50,0x5, 0x7e,0x18,0x0, 0x37,0x22,0x12,0x76,0x67,0xbf, +0x10,0x28,0x2, 0x7f,0x10,0x22,0x7d,0x2f,0x9d,0x23,0x7e,0x34,0x1, 0xba,0xad,0x23, +0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7d,0x14,0x6d,0x0, 0x9e,0x8, 0x0, 0x37,0x22, +0x7d,0xed,0x9e,0xe4,0x0, 0xb, 0xbd,0xef,0x22,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29, +0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x44,0x5, 0x0, 0x6c,0xff,0x7e,0x70,0x9, 0xac, +0x7f,0x9, 0xe3,0x29,0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7d,0x24,0x2e,0x24, +0x0, 0x14,0xbd,0xc2,0x40,0x3f,0x49,0xd3,0x29,0x8, 0x7d,0x3d,0x12,0x77,0xcd,0x7c, +0xdb,0xbe,0xd0,0x3, 0x40,0xe, 0x7d,0x34,0x1b,0x34,0x12,0x76,0x79,0x7c,0xbe,0x12, +0x77,0x10,0x80,0x40,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x34,0x60,0xc5,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xd0,0x74,0x9, 0xac,0xbf,0x59,0xd5,0x29,0x8, 0x7e,0x34,0x7, 0xd0, +0x12,0x76,0x79,0x80,0x1f,0xbd,0xc4,0x40,0x1b,0x7d,0x54,0x2e,0x54,0x0, 0xa, 0xbd, +0xc5,0x40,0x5, 0x7c,0xbe,0x12,0x77,0x10,0x7d,0xc4,0x1b,0xc4,0x74,0x9, 0xac,0xbf, +0x59,0xc5,0x29,0xa, 0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0x81,0xda,0x79,0xda,0xd8,0x22, +0x7c,0xab,0x7e,0x8, 0x29,0xbc,0xbe,0xa0,0xa, 0x50,0x1f,0xa, 0x3a,0x7f,0x70,0x2d, +0xf3,0x7e,0x7b,0xb0,0xb4,0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0, +0x74,0x3, 0x2d,0x31,0x7d,0x20,0x39,0xb1,0x0, 0xa, 0x22,0x2, 0x74,0x8c,0xca,0x3b, +0x7c,0xfb,0x6c,0xee,0x80,0x6f,0x6c,0xdd,0x74,0x9, 0xac,0xbd,0x9, 0x45,0x29,0x66, +0x7e,0x70,0x9, 0xac,0x7e,0x9, 0x53,0x28,0xb2,0xbc,0x45,0x68,0x7, 0xb, 0xd0,0xbe, +0xd0,0xa, 0x40,0xe4,0xbe,0xd0,0xa, 0x50,0x50,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29, +0x66,0x49,0x25,0x29,0x64,0x49,0x33,0x28,0xb0,0x12,0x77,0xbc,0x74,0x9, 0xac,0xbd, +0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x12,0x77,0xc4,0x2d,0x31,0x7a,0x35,0x24, +0xa, 0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59, +0x35,0x35,0x94,0x59,0x35,0x35,0xb7,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c, +0x12,0x77,0x3b,0xb, 0xe0,0xbc,0xfe,0x38,0x8d,0xda,0x3b,0x22,0x9d,0x32,0x12,0x17, +0x85,0x7d,0x13,0x22,0x49,0x35,0x28,0xae,0x9d,0x32,0x2, 0x17,0x85,0x6c,0xaa,0x7e, +0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a, +0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14,0x60,0xb3,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xd4,0x7c,0xba,0x22,0x2, 0x78, +0x1, 0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x79,0x6c,0xee,0x80,0x35,0x7c,0xbe,0x12, +0x78,0x52,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x1e,0x96,0x60,0x23,0x7e,0xc4,0x0, +0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e,0x30, +0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x17,0x2e,0x1b,0xfd,0xb, 0xf0, +0xb, 0xe0,0x12,0x7d,0xfd,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x20,0xda, +0x79,0x22,0x7c,0xab,0x7e,0x70,0x2, 0xac,0x7a,0x12,0x7f,0xe, 0x2, 0x2c,0xb9,0xca, +0x79,0x6c,0x88,0x80,0x65,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x12,0x8f,0x13, +0x7c,0xbf,0x12,0x5f,0xcc,0x50,0x51,0x6c,0xee,0x80,0x48,0xbc,0xe8,0x68,0x42,0x7e, +0x70,0x2, 0xac,0x7e,0x12,0xaf,0xa1,0x6c,0x99,0x7e,0xb3,0x2a,0x8f,0x14,0xbe,0xb1, +0x26,0x78,0xe, 0xa, 0x2f,0xe5,0x25,0xa, 0x3b,0x12,0x4b,0x8c,0x18,0x3, 0x7e,0x90, +0x1, 0xbe,0x90,0x1, 0x78,0x1b,0x7c,0xbe,0x12,0x78,0x52,0x7d,0xf3,0x7c,0xb8,0x12, +0x78,0x52,0xbd,0x3f,0x8, 0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x54, +0xcd,0xb, 0xe0,0x12,0x7d,0xfd,0x38,0xb3,0xb, 0x80,0x12,0x7f,0x7, 0x38,0x96,0xda, +0x79,0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x8d,0x7e,0x47,0x28,0x99,0xe4,0x7a, +0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73,0x28,0x85, +0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2, +0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, 0xfc,0x6d, +0x22,0x9e,0x27,0x2a,0x72,0xbd,0x12,0x58,0x19,0x12,0x7b,0x9c,0x49,0x12,0x4, 0xfc, +0x6d,0x22,0x9e,0x27,0x2a,0x70,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa6, +0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e,0xb3,0x26, +0x83,0x70,0x40,0x12,0x79,0xee,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50,0x2, 0xac, +0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x7b,0x9c,0x49,0x2, 0x5, 0x7a, +0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49,0x20,0x5, +0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, 0xf0,0xbc, +0x7f,0x38,0xc9,0x12,0x99,0xca,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28,0x88,0x2e, +0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x74, +0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x79,0xe4,0x49,0x25,0x25,0xf7, +0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x17,0x85,0xbe,0x37,0x28,0x9d,0x8, 0x7, 0xe4, +0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x56,0xb5,0x38,0xdc,0x6c,0xff,0x80, +0x9, 0x12,0x79,0xe4,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x56,0xb5,0x38,0xf2,0xda, +0x79,0xda,0xd8,0x22,0x7c,0xbf,0x12,0x78,0x52,0x74,0x2, 0xac,0xbf,0x22,0x7e,0x73, +0x28,0x84,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x7e,0xb3,0x2f,0xc8,0xbe, +0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xc8,0x12,0xaf,0x90,0x7e,0x44,0x1, 0x18, +0x7e,0xd4,0x0, 0xb4,0xe4,0x7a,0xb3,0x28,0xac,0x12,0x7b,0x92,0x7e,0xc4,0xfe,0x5c, +0x7e,0x57,0x7, 0xfe,0xbe,0x54,0xfc,0xb8,0x58,0x15,0x7e,0x57,0x7, 0xfc,0xbd,0x5c, +0x58,0xd, 0x12,0x7b,0xa5,0x8, 0x8, 0x12,0x7c,0xa4,0x60,0x3, 0x12,0x7b,0xc7,0x12, +0x7c,0xa4,0xa, 0x5b,0x4d,0x55,0x68,0x3b,0x6d,0x55,0x9d,0x54,0xbe,0x57,0x7, 0xfe, +0x18,0x6, 0xbe,0x57,0x7, 0xfc,0x8, 0x2b,0x12,0x7b,0xa5,0x8, 0x26,0x7e,0x37,0x28, +0x8e,0x12,0x17,0x85,0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x79,0xee,0x28,0x14,0x7e, +0x73,0x28,0x85,0xbe,0x70,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xc4,0x58,0x3, +0x12,0x7b,0xc7,0x12,0x92,0xc8,0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x57,0xc2, +0x68,0x6, 0x7e,0xb3,0x39,0xdd,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x71,0x12, +0x79,0xee,0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x14,0x5, 0xe4,0x7a,0xb3,0x28, +0xad,0x12,0x93,0x6, 0x50,0xa, 0x12,0x7b,0x92,0x12,0x7c,0x41,0x7c,0xfb,0x80,0x21, +0x7e,0xb3,0x26,0x84,0x70,0x1b,0x7e,0xb3,0x26,0x85,0x70,0x15,0x12,0x79,0xee,0x28, +0x10,0x12,0x57,0xc2,0x68,0x5, 0x12,0x98,0xfa,0x60,0x6, 0x7e,0xf0,0x3, 0x12,0x7b, +0x92,0x7e,0xc7,0x7, 0xfa,0xbe,0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x79,0xee,0x28,0x12, +0x6d,0xcc,0x9d,0xcd,0xbe,0xc7,0x28,0x8e,0x58,0x8, 0x12,0x7b,0xb0,0xe4,0x7a,0xb3, +0x28,0xad,0xa, 0xcf,0x7a,0xc7,0x28,0xa1,0x74,0x2, 0xac,0xbf,0x7a,0x57,0x28,0xa3, +0x12,0x7b,0x99,0x50,0xd, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x79,0xee,0x28,0x3, 0x12, +0x7b,0xb0,0x7e,0xc7,0x28,0x8a,0xbd,0xcd,0x8, 0x1f,0x7e,0x24,0x0, 0x2, 0x7d,0x3d, +0x12,0x15,0x29,0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28,0x8e,0x58,0xa, 0x12, +0x7b,0x99,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x7d,0x13,0xb4,0x1, 0x5, 0xe4, +0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4,0x7a,0xb3,0x28,0x84, +0x7a,0xb3,0x2a,0x20,0x12,0x92,0x30,0x7e,0xb3,0x2f,0xc9,0xbe,0xb0,0x0, 0x28,0x1f, +0x14,0x7a,0xb3,0x2f,0xc9,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad,0x12,0x7e,0x4, 0x7a, +0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x26,0x83,0xda, +0xf8,0x22,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x22,0xa2,0x17,0x22,0xa, 0x1d,0xa, 0x2a, +0x2d,0x21,0x3e,0x24,0x22,0x6d,0x55,0x9e,0x57,0x2a,0x79,0xbe,0x57,0x28,0x8e,0x22, +0xe4,0x7a,0xb3,0x2f,0xc9,0x7a,0xb3,0x28,0xac,0x74,0x2, 0x2, 0x7b,0xbe,0x7a,0xb3, +0x2b,0x21,0x7a,0xb3,0x2b,0x3d,0x22,0x74,0x2, 0x7a,0xb3,0x2f,0xc9,0xe4,0x7a,0xb3, +0x2f,0xc8,0x12,0x7e,0x4, 0x2, 0x7b,0xbe,0x12,0x78,0xd2,0x12,0x79,0xf6,0x12,0x7c, +0x24,0x7e,0xb3,0x38,0xd, 0xb4,0x1, 0x10,0x7e,0x34,0x0, 0x5, 0x7a,0x37,0x28,0xa1, +0x7e,0x34,0x0, 0xa, 0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39,0xe2,0x60,0x7, 0x14,0x7a, +0xb3,0x39,0xe2,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, 0x12,0x6f,0xee,0x12,0x7e, +0xc, 0x12,0xa3,0xad,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12,0xa9,0xa0,0x12,0xa9,0x4f, +0x2, 0x96,0xd, 0x22,0x12,0x98,0xfa,0x60,0x17,0x12,0x7b,0x92,0x7e,0x37,0x28,0xa1, +0x3e,0x34,0x7a,0x37,0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3, +0x22,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x7e,0x4, 0x1, 0x18,0xbe,0x44,0xfc,0xb8, +0x58,0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x38,0x7e, +0xa0,0x5, 0x80,0x33,0x7e,0x34,0xff,0xfb,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x7c, +0x9c,0x8, 0x5, 0x7e,0xa0,0x4, 0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x7c,0x9a,0x8, +0x5, 0x7e,0xa0,0x3, 0x80,0x11,0x7e,0x34,0xff,0xfd,0x12,0x7c,0x9a,0x8, 0x5, 0x7e, +0xa0,0x2, 0x80,0x3, 0x7e,0xa0,0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x15, +0x29,0xbd,0x34,0x22,0x6c,0x66,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26, +0xf2,0xbe,0x70,0x0, 0x28,0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6, +0x7e,0xb3,0x2a,0x8d,0x14,0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c, +0x73,0x12,0x5f,0xcc,0x50,0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x8d,0xa, 0x7, 0x2d,0x2, +0x3e,0x4, 0x49,0x20,0x4, 0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x6e,0xbd,0x20,0x58,0x2, +0xb, 0x60,0xb, 0x20,0x7e,0x73,0x2a,0x8c,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa, +0x74,0x1, 0x22,0xca,0x3b,0x12,0x8f,0x82,0x38,0x2, 0xa1,0xda,0x7e,0xc3,0x2f,0xcc, +0x4c,0xcc,0x78,0x3d,0x7a,0xb3,0x2f,0xcc,0xe4,0x7a,0xb3,0x2f,0xce,0x6c,0xaa,0x80, +0x26,0x12,0x7d,0xe5,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26, +0xfb,0x7a,0x49,0xd0,0x19,0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x2f, +0x86,0x59,0x34,0x0, 0x2, 0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80, +0x7f,0x7c,0xfc,0x6c,0xaa,0x80,0x35,0x12,0x7d,0xe5,0x7e,0x49,0xd0,0x9, 0xe4,0x0, +0x1, 0x9, 0xb4,0x0, 0x8, 0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x2f,0x86,0x7d,0x23, +0x49,0x34,0x0, 0x2, 0x9d,0x32,0x12,0x17,0x85,0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, +0x9, 0x74,0x5, 0x19,0xb4,0x0, 0x8, 0x75,0x60,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7, +0x4c,0xff,0x78,0x2, 0x80,0x26,0x7e,0x73,0x2f,0xce,0xbe,0x70,0x4, 0x40,0x22,0x6c, +0xaa,0x80,0xe, 0x12,0x7d,0xe5,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, +0xa0,0xbc,0xfa,0x38,0xee,0xbc,0xfa,0x78,0x3, 0x75,0x60,0x0, 0x12,0x7d,0xef,0x80, +0xf, 0x7c,0xb7,0x4, 0x7a,0xb3,0x2f,0xce,0x80,0x6, 0x12,0x7d,0xef,0x75,0x60,0x0, +0xe5,0x60,0xda,0x3b,0x22,0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xcf,0x22,0xe4, +0x7a,0xb3,0x2f,0xcd,0x7a,0xb3,0x2f,0xcc,0x7a,0xb3,0x2f,0xce,0x22,0x7e,0x73,0x28, +0x84,0xbc,0x7e,0x22,0x74,0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x12,0x97,0xd2,0x6d, +0x33,0x7a,0x37,0x37,0xe3,0x6c,0xaa,0x12,0x96,0x59,0xb, 0xa0,0xbe,0xa0,0x4, 0x40, +0xf6,0xe4,0x7a,0xb3,0x37,0x78,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0xa2, +0x71,0x7f,0x71,0x7c,0xbf,0x12,0x78,0x52,0x7d,0x13,0x1a,0x2, 0x1a,0x0, 0x7f,0x17, +0x12,0x15,0xc8,0x7c,0xb7,0xda,0xf8,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8, +0x12,0x78,0x52,0xbe,0x34,0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x12,0x7f,0x7, +0x38,0xec,0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0xd8,0xca,0x79,0x7e, +0xf4,0x3, 0x20,0x7d,0x7f,0x12,0x7e,0x48,0x50,0x2, 0xe1,0x2, 0x7a,0xf5,0x2a,0x7e, +0xb3,0x28,0xa8,0xb4,0x1, 0x4, 0x7e,0x74,0x4, 0xb0,0x7e,0x37,0x28,0x8a,0xbe,0x34, +0x4, 0x4c,0x8, 0x6e,0x6c,0xdd,0x80,0x62,0xc2,0x0, 0x7c,0xbd,0x12,0x78,0x52,0x7a, +0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0xa2,0x71,0x7a,0x35,0x24,0x9e,0x35,0x26, +0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0x7b,0x7a,0x35,0x28, +0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, 0xa, +0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x0, 0x7c,0xbd,0x12,0xa3,0x3c,0x50, +0x2, 0xc2,0x0, 0x30,0x0, 0x12,0x7c,0xbd,0x6c,0x77,0x12,0x54,0xcd,0x7e,0x70,0x2, +0xac,0x7d,0x12,0x7f,0xe, 0x12,0x80,0x6e,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d, +0x38,0x96,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x78,0x22,0x9, 0xb3, +0x26,0xfa,0x9, 0x73,0x26,0xfb,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x93,0xf5,0x27,0x12, +0x7b,0x99,0x50,0x2, 0xe1,0xa7,0x6d,0x33,0x9e,0x37,0x2a,0x6e,0x3e,0x34,0xbe,0x37, +0x7, 0xf8,0x18,0x73,0x7e,0xb3,0x16,0x92,0x70,0x6d,0x7e,0xb3,0x28,0xa8,0xb4,0x1, +0x63,0x7e,0x77,0x2a,0x70,0x7e,0x67,0x2a,0x72,0x75,0x24,0x0, 0x80,0x51,0xe5,0x24, +0x12,0x1e,0x96,0x60,0x48,0x12,0x7f,0xaa,0x12,0xaf,0xa1,0x7e,0xb3,0x2a,0x21,0xb4, +0x1, 0x9, 0xe5,0x26,0xb4,0x17,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26,0x74,0x2, +0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0x14,0xe5,0x25,0xa, 0x2b,0xe5,0x27,0xa, +0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33,0x4, 0xfc,0xbd,0x37,0x58,0x10,0xe5,0x24,0x6c, +0x77,0x12,0x54,0xcd,0x12,0x7f,0xaa,0x12,0x7f,0xe, 0x12,0x80,0x6e,0x5, 0x24,0x12, +0xb0,0x1f,0x38,0xaa,0x12,0x8f,0x32,0xda,0x3b,0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0x12,0x8f,0x1b,0x12,0x8e,0x65,0x12,0x7f,0x17,0x12,0x7e,0x6b,0x2, 0x7f, +0xc1,0xca,0x3b,0x12,0x1e,0x4d,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x36,0xe8, +0x60,0x9, 0xe4,0x7a,0xb3,0x36,0xea,0x7a,0xb3,0x36,0x6f,0x7e,0xb3,0x36,0xe8,0x70, +0x62,0x6c,0x99,0x80,0x56,0x74,0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26, +0xfb,0x7c,0xb9,0x12,0xa3,0x3c,0x40,0x41,0x6c,0xee,0x80,0x35,0x74,0x2, 0xac,0xbe, +0x9, 0xd5,0x36,0x70,0x9, 0xc5,0x36,0x71,0xa, 0x28,0xa, 0x3d,0x12,0x80,0x66,0x78, +0x1e,0xa, 0x2f,0xa, 0x3c,0x12,0x80,0x66,0x78,0x15,0x7c,0xb9,0x12,0x78,0x52,0xbe, +0x34,0x3, 0x20,0x58,0xa, 0x12,0x57,0xbb,0x7c,0xb8,0x7c,0x7f,0x12,0x80,0x6e,0xb, +0xe0,0x7e,0x73,0x36,0xea,0xbc,0x7e,0x38,0xc3,0xb, 0x90,0x7e,0x73,0x28,0x84,0xbc, +0x79,0x38,0xa2,0x7e,0x73,0x36,0x6f,0x7a,0x73,0x36,0xea,0xa, 0x37,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x36,0xac,0x7e,0x8, 0x36,0x70,0x12,0x17,0x2e,0x1b,0xfd,0xe4,0x7a, +0xb3,0x36,0xe8,0xda,0x3b,0x22,0x9d,0x32,0x12,0x17,0x85,0x4d,0x33,0x22,0x7c,0x6b, +0x7e,0xa3,0x36,0x6f,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x62,0x36,0xac,0x19,0x72,0x36, +0xad,0x7c,0xba,0x4, 0x7a,0xb3,0x36,0x6f,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74, +0x6, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x15,0x75,0x7d,0x53,0xbe,0x54,0x0, +0xff,0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0xca,0xf8,0x7e,0xf3,0x2a,0x8f,0x7a,0x37, +0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3,0x1f,0x34,0x7a, +0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x8e,0x7a,0x73,0x1f,0x36,0x7a,0xf3,0x1f,0x37,0x7a, +0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x80,0xfd,0x6d,0x22, +0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f,0x36,0x6d,0x0, +0x12,0x15,0x77,0xa, 0x1f,0x6d,0x0, 0x12,0x15,0x77,0xda,0xf8,0x22,0x12,0xc, 0x29, +0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8,0x7a,0x37,0x1f, +0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x8e,0x7a,0x73,0x1f, +0x35,0x7e,0x73,0x2a,0x8f,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x7b,0x7a,0x37,0x1f, +0x3e,0x7e,0x37,0x2a,0x7d,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x7f,0x7a,0x37,0x1f, +0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, 0x1f,0x34,0x7e, +0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f,0x4a,0xbd,0x23, +0x28,0x2, 0x7d,0x32,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x82,0x8b,0x7e,0x1f, +0x39,0xc6,0x7a,0x1d,0x27,0x7e,0xb3,0x2a,0x93,0xf5,0x2e,0x7e,0xb3,0x39,0x59,0xb4, +0x1, 0x6, 0x7e,0x38,0x39,0x5b,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35, +0x2b,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x39,0x5a,0x70,0xe, 0x7e,0xb3,0x39,0x58, +0x70,0x8, 0x74,0x1, 0x7a,0xb3,0x39,0x5a,0x41,0x2a,0x7e,0xb3,0x39,0x5a,0x70,0x6, +0x74,0x1, 0x7a,0xb3,0x39,0x5a,0x7e,0xb3,0x39,0x59,0xb4,0x1, 0x14,0x75,0x2d,0x0, +0x80,0x6, 0x12,0x82,0x6c,0x12,0x82,0x7a,0xe5,0x2e,0xbe,0xb1,0x2d,0x38,0xf3,0x80, +0x18,0x75,0x2d,0x0, 0x80,0xc, 0x12,0x82,0x6c,0x3e,0x24,0x3e,0x24,0x1e,0x24,0x12, +0x82,0x7a,0xe5,0x2e,0xbe,0xb1,0x2d,0x38,0xed,0x7e,0x34,0x1, 0x18,0x7a,0x35,0x2f, +0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0x5d,0xd4,0x75,0x2d,0x0, 0x80,0x10,0x12,0x82, +0x5f,0xbe,0x35,0x2b,0x8, 0x6, 0x12,0x82,0x5f,0x7a,0x35,0x2b,0x5, 0x2d,0xe5,0x2e, +0xbe,0xb1,0x2d,0x38,0xe9,0x12,0x82,0x57,0x40,0x25,0x7e,0xb3,0x39,0x59,0xb4,0x1, +0x1e,0x5, 0x1e,0xe5,0x1e,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1e,0x0, 0xe5,0x2e,0xa, +0x3b,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x27,0x7f,0x3, 0x12,0x17,0x2e,0x1b,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x12,0x82,0x57,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x39,0xc5,0xe4, +0x7a,0xb3,0x39,0x5a,0xda,0x3b,0x22,0x7e,0x37,0x2b,0x26,0xbe,0x35,0x2b,0x22,0x7e, +0xa1,0x2d,0x74,0x2, 0xa4,0x49,0x35,0x1f,0x34,0x2, 0x17,0x85,0x7e,0xa1,0x2d,0x74, +0x2, 0xa4,0x7f,0x13,0x2d,0x35,0xb, 0x1a,0x20,0x22,0x7e,0xd, 0x27,0x2d,0x15,0xb, +0xa, 0x30,0x9d,0x32,0x59,0x35,0x1f,0x34,0x5, 0x2d,0x22,0x7e,0x34,0x0, 0x38,0xe4, +0x2, 0x17,0x53,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x34,0x7e,0xb3,0x38,0xc9, +0xf5,0x29,0x7e,0xb3,0x2a,0x8c,0xf5,0x2a,0x7e,0xb3,0x2a,0x8d,0xf5,0x2b,0x7e,0xb3, +0x2a,0x8f,0xf5,0x2c,0x7e,0xb3,0x2a,0x8e,0xf5,0x2d,0x7e,0x34,0x2a,0xf8,0x7a,0x35, +0x2e,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x30,0x12,0x67,0xe8,0x30,0xf, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x82,0x8b,0x6c,0xff,0x80,0x34,0x9f,0x77, +0x6c,0xee,0x80,0x19,0x7e,0x11,0x2b,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x3f, +0x2d,0x10,0x7e,0x1d,0x30,0x2d,0x31,0xb, 0x1a,0x30,0x12,0x85,0x7, 0xe5,0x2d,0xbc, +0xbe,0x38,0xe1,0xe5,0x2d,0x12,0x85,0xe, 0x74,0x2, 0xac,0xbf,0x59,0x35,0x34,0x0, +0xb, 0xf0,0xe5,0x2c,0xbc,0xbf,0x38,0xc6,0x7e,0x34,0x10,0x0, 0x7e,0xa1,0x2b,0x74, +0x2, 0xa4,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x72,0x9f,0x77,0x6c,0xee,0x80,0x12, +0x12,0x85,0x30,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x12, +0x85,0x7, 0xe5,0x29,0xbc,0xbe,0x38,0xe8,0xe5,0x29,0x12,0x85,0xe, 0x74,0x4, 0xac, +0xbf,0x59,0x35,0x3, 0x73,0xe5,0x29,0xbe,0xb1,0x2c,0x50,0x32,0x9f,0x77,0x7e,0xe1, +0x29,0x80,0x12,0x12,0x85,0x30,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14, +0x78,0xf4,0x12,0x85,0x7, 0xe5,0x2c,0xbc,0xbe,0x38,0xe8,0xe5,0x29,0xa, 0x3b,0x6d, +0x22,0xe5,0x2c,0xa, 0x1b,0x6d,0x0, 0x9f,0x1, 0x12,0x85,0x12,0x80,0x4, 0x7e,0x34, +0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x75,0xb, 0xf0,0xe5,0x2d,0xbc,0xbf, +0x38,0x88,0xe5,0x2c,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x15,0x77,0x6c, +0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e, +0x14,0x10,0x0, 0x9d,0x15,0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0x21,0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, +0xf0,0xe5,0x2c,0xbc,0xbf,0x38,0xcc,0xe5,0x2a,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, +0x28,0x12,0x15,0x77,0x6c,0xff,0x80,0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x73, +0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10,0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4, +0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac, +0xbf,0x59,0x25,0x3, 0x73,0xe5,0x29,0xbe,0xb1,0x2c,0x50,0x26,0x74,0x4, 0xac,0xbf, +0x49,0x25,0x3, 0x75,0x2e,0x14,0x10,0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, +0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25, +0x3, 0x75,0xb, 0xf0,0xe5,0x2a,0xbc,0xbf,0x38,0x9e,0x7e,0x73,0x38,0xcb,0xa, 0x37, +0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12, +0x15,0x75,0x7d,0xe3,0x7a,0xe5,0x34,0x7e,0x73,0x38,0xcc,0xa, 0x37,0x6d,0x22,0x74, +0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d,0x1f,0x12,0x15,0x75,0x7d,0x63,0x6c,0xff,0x80, +0x20,0x74,0x2, 0xac,0xbf,0x49,0x45,0x34,0x0, 0xbe,0x45,0x34,0x28,0x9, 0x7e,0x35, +0x34,0x59,0x35,0x34,0x0, 0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, +0xf0,0xe5,0x2c,0xbc,0xbf,0x38,0xda,0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49, +0x45,0x3, 0x73,0xbe,0x45,0x34,0x28,0x9, 0x7e,0x35,0x34,0x59,0x35,0x3, 0x73,0x80, +0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x73,0x49,0x45,0x3, 0x75,0xbe,0x45,0x34, +0x28,0x9, 0x7e,0x35,0x34,0x59,0x35,0x3, 0x75,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59, +0x65,0x3, 0x75,0xb, 0xf0,0xe5,0x2a,0xbc,0xbf,0x38,0xc0,0x30,0x2, 0x6, 0x7e,0xd, +0x30,0x12,0x27,0x70,0xda,0x3b,0x22,0x6d,0x22,0x2f,0x71,0xb, 0xe0,0x22,0xa, 0x1b, +0x6d,0x0, 0x7f,0x17,0x12,0x15,0x77,0x7f,0x71,0x7e,0x25,0x2e,0x74,0xc, 0x7d,0x13, +0x7d,0x32,0x6d,0x22,0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x15,0x75, +0x7e,0x11,0x2b,0xac,0x1f,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d, +0x30,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27,0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35, +0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x12,0x3e,0x1b,0x7e,0x73,0x37,0xe7,0xbe,0x70, +0xff,0x68,0x13,0xbe,0x73,0x38,0xd, 0x68,0xd, 0x7a,0x73,0x38,0xd, 0x74,0xff,0x7a, +0xb3,0x37,0xe7,0x2, 0x3e,0x1b,0x22,0x12,0x3f,0x3f,0x68,0xfb,0x20,0x93,0xfd,0x22, +0x7e,0x34,0x0, 0x46,0x22,0x7e,0xb3,0x39,0x59,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4, +0x7a,0xb3,0x39,0x59,0x22,0x7f,0x20,0xc2,0x1, 0x7e,0x2b,0x60,0x29,0x72,0x0, 0x2, +0x9c,0x76,0x1a,0x37,0x12,0x17,0x85,0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32,0x0, +0x3, 0x9c,0x37,0x1a,0x33,0x12,0x17,0x85,0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d,0x32, +0x12,0x17,0x85,0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60,0x5, +0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x39,0xb, 0x4d,0x33,0x68,0x2, 0xd2, +0x1, 0xa2,0x1, 0x22,0x7f,0x60,0x7e,0x6b,0xa0,0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14, +0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, 0x2d,0x15,0xb, 0x14,0x12,0x17,0x2e, +0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0,0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x8d, +0x7e,0x73,0x2a,0x8c,0xac,0x76,0x7d,0x13,0x1e,0x14,0x7e,0x27,0x28,0x88,0x2e,0x27, +0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e,0x34,0xbe,0x37,0x28,0x86,0x50,0x29, +0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd, +0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e,0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6, +0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, 0x7c,0xba,0x22,0x7e,0xa3,0x2a,0x21, +0xbe,0xa0,0x0, 0x38,0x2f,0xbe,0xa3,0x2a,0x20,0x50,0x19,0x7e,0xb3,0x2a,0x2a,0xbe, +0xb3,0x36,0x46,0x28,0x14,0x7e,0xb3,0x36,0x46,0x4, 0x7a,0xb3,0x36,0x46,0x7a,0xa3, +0x2a,0x20,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x46,0x7e,0xb3,0x2a,0x20,0x70,0x5, 0xe4, +0x7a,0xb3,0x2a,0x29,0x22,0x12,0x86,0x9b,0x2, 0x86,0x5c,0x7e,0xb3,0x2a,0x20,0x70, +0x29,0x12,0x86,0xd4,0x28,0x24,0x7e,0xb3,0x35,0xcb,0x70,0x18,0x12,0x86,0xdc,0x7e, +0x73,0x2a,0x21,0x7a,0x73,0x2a,0x20,0x74,0x1, 0x7a,0xb3,0x2a,0x27,0x7e,0xb3,0x35, +0xcb,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xcb,0x22,0xe4,0x7a,0xb3,0x35,0xcb,0x7a, +0xb3,0x2a,0x27,0x22,0x7e,0x73,0x2a,0x21,0xbe,0x70,0x0, 0x22,0x7e,0x34,0x0, 0x3c, +0xca,0x39,0x7e,0x18,0x36,0xef,0x7e,0x8, 0x37,0x2b,0x12,0x17,0x2e,0x1b,0xfd,0x7e, +0x73,0x28,0x94,0x7a,0x73,0x36,0xee,0x7a,0x73,0x28,0x93,0x22,0x12,0x86,0xd4,0x28, +0x8, 0x7e,0xb3,0x28,0x84,0x70,0x2, 0xf5,0x1b,0x7e,0xb3,0x28,0x84,0x70,0x18,0xe5, +0x1b,0xbe,0xb0,0xfa,0x50,0x2, 0x5, 0x1b,0xe5,0x1b,0xbe,0xb0,0x5, 0x40,0x8, 0xe4, +0x7a,0xb3,0x32,0x4c,0x75,0x1b,0xfa,0x22,0xca,0x3b,0x7e,0xe3,0x2a,0x20,0x4c,0xee, +0x78,0x20,0x6c,0xff,0x6d,0x11,0x74,0x2, 0xac,0xbf,0x12,0x88,0xd6,0xac,0x3f,0x19, +0xa1,0x35,0xd0,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x36,0x3a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xe2,0x12,0x8a,0x95,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0x2, 0x88,0xa7,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0, +0xf, 0xbe,0xd0,0xa, 0x40,0x3, 0x2, 0x88,0xa5,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe, +0xb0,0x1, 0x78,0x3, 0x2, 0x88,0x8e,0x75,0x24,0x0, 0x7e,0xa1,0x24,0x74,0x9, 0xa4, +0x9, 0xc5,0x35,0xd0,0xbc,0xcd,0x68,0x3, 0x2, 0x88,0x80,0x49,0x25,0x35,0xce,0x74, +0x9, 0xac,0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x17,0x85,0x7d,0x3, 0x7e,0xa1, +0x24,0x74,0x9, 0xa4,0x49,0x25,0x35,0xcc,0x74,0x9, 0xac,0xbf,0x12,0x77,0xc4,0x2d, +0x3, 0xa, 0x1c,0x9, 0xa1,0x36,0x3a,0xbe,0xa0,0x0, 0x28,0x18,0x7e,0x30,0x2, 0xac, +0x3c,0x59,0x1, 0x36,0x26,0xa, 0x1c,0x2e,0x14,0x36,0x3a,0x7c,0xba,0x14,0x7a,0x19, +0xb0,0x2, 0x88,0xa5,0x74,0x2, 0xac,0xbc,0x49,0x15,0x36,0x26,0xbe,0x14,0x0, 0x32, +0x28,0x8, 0x7d,0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, +0xbe,0x4, 0x0, 0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30, +0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56, +0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d, +0x19,0xb1,0x29,0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28, +0x64,0x1b,0xe0,0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34, +0x74,0x9, 0x12,0x15,0xfc,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x88,0xe1,0xac,0x3f,0x12, +0x88,0xcd,0x7e,0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x88,0xcd,0x1b,0xf0, +0x74,0x2, 0xac,0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x36,0x26,0x80,0x25, +0x5, 0x24,0xe5,0x24,0xbe,0xb0,0xa, 0x50,0x3, 0x2, 0x87,0x8a,0x80,0x17,0x6d,0x11, +0x74,0x2, 0xac,0xbd,0x12,0x88,0xd6,0xac,0x3d,0x19,0xa1,0x35,0xd0,0x74,0x2, 0xa, +0x1d,0x19,0xb1,0x36,0x3a,0xb, 0xf0,0xbc,0xef,0x28,0x3, 0x2, 0x87,0x66,0xe4,0x7a, +0xb3,0x16,0x92,0x7e,0x34,0x0, 0x5a,0xca,0x39,0x7e,0x18,0x28,0xae,0x7e,0x8, 0x35, +0xcc,0x12,0x17,0x2e,0x1b,0xfd,0x7a,0xe3,0x2a,0x20,0xda,0x3b,0x22,0x2e,0x14,0x28, +0xae,0x74,0x9, 0x2, 0x15,0xfc,0x59,0x15,0x36,0x26,0x7e,0xa0,0xff,0x7e,0x30,0x9, +0x22,0x2e,0x34,0x28,0xae,0x7e,0x30,0x9, 0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x7e, +0xf0,0xa, 0x6c,0x11,0x80,0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f, +0x38,0x7e,0x34,0x7f,0xff,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac, +0xb1,0x59,0x35,0x1f,0x36,0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d, +0x12,0x8a,0x32,0x7c,0x7d,0x7c,0x6f,0x12,0x8a,0x32,0x6c,0x0, 0x80,0x39,0x6c,0xee, +0x80,0x16,0x74,0x9, 0xac,0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75, +0x28,0xb2,0xbc,0x76,0x68,0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15, +0x7e,0x70,0x9, 0xac,0x70,0x12,0x88,0xe1,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, +0x12,0x15,0xfc,0xb, 0x10,0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca, +0x59,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x29,0x62,0x12,0x17,0x2e,0x1b,0xfd,0xda,0x79, +0xda,0xd8,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0x7c,0x57,0x41,0x14,0x7e, +0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98,0x7e,0xd0,0x9, 0xac,0xd5,0x9, +0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff,0x68,0x66,0x12,0x8a,0x28,0x39, +0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e,0xf0,0x9, 0x70,0xc, 0xac,0xf5, +0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, 0xac,0xf6,0x7d,0x97,0x2e,0x94, +0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x8a,0x28,0x1b,0x7a,0xd0,0x69,0xf4,0x0, +0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7,0x79,0xf6,0x0, 0x2, 0x7e,0xf0, +0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x8a,0x28,0x39,0x87,0x0, 0x5, 0x7e,0xf0, +0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x8a,0x28,0x39,0x87,0x0, 0x6, 0xb, 0xa0, +0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0x21,0x8f,0xb, 0x60,0xbe,0x60,0xa, 0x50, +0x2, 0x21,0x8b,0x7c,0xba,0xda,0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d, +0xf7,0x22,0x7e,0x8, 0x1f,0x34,0x12,0x89,0x83,0x7c,0x1b,0x22,0xca,0x79,0x7e,0xf3, +0x2a,0x20,0x7e,0xe3,0x2a,0x21,0x7c,0xbf,0x7c,0x7e,0x12,0x43,0xf2,0x7c,0xbf,0x12, +0x88,0xe9,0x4c,0xee,0x78,0x15,0x7e,0x34,0x0, 0x5a,0xca,0x39,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x29,0x62,0x12,0x17,0x2e,0x1b,0xfd,0x80,0xb, 0x7e,0xb3,0x2a,0x27,0x70, +0x5, 0x7c,0xbf,0x12,0x77,0x3e,0x7c,0xbf,0x12,0x57,0x6a,0xbe,0xf0,0x0, 0x28,0x6, +0x74,0x1, 0x7a,0xb3,0x2a,0x29,0xda,0x79,0x22,0x7e,0xb3,0x38,0x38,0x70,0x3, 0x12, +0x87,0x28,0x2, 0x8a,0x3c,0x7e,0x73,0x2a,0x21,0xbe,0x73,0x2a,0x20,0x78,0x13,0x12, +0x8a,0xcd,0x40,0xe, 0x7e,0x37,0x35,0xa8,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34, +0x80,0x6, 0x7e,0x37,0x35,0xa8,0x1e,0x34,0x7a,0x37,0x35,0xa8,0x7e,0xb3,0x2a,0x20, +0x70,0x6, 0x6d,0x33,0x7a,0x37,0x35,0xa8,0x7e,0x37,0x35,0xa8,0x22,0x7e,0x73,0x2a, +0x20,0xbe,0x70,0x1, 0x22,0x7e,0xb3,0x2a,0x27,0x70,0x23,0x7e,0xb3,0x35,0xaa,0xb4, +0x2, 0x9, 0x12,0x8a,0xcd,0x28,0x4, 0x74,0x3, 0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xb5, +0x7e,0x73,0x35,0xb6,0xbe,0x73,0x35,0xb5,0x28,0x4, 0x7a,0x73,0x35,0xb5,0x22,0x12, +0x8b,0x5, 0x2, 0x8a,0xd5,0xca,0x79,0x7e,0x13,0x2a,0x20,0x7e,0x78,0x29,0xbc,0x12, +0x8c,0x4c,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0xf, 0x7e,0xa0,0x2, +0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12,0x1a,0xaf,0x81, +0x35,0xbc,0x20,0x50,0x3, 0x12,0x1a,0xaf,0x6c,0x0, 0x7e,0x70,0x9, 0xac,0x70,0x9, +0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x81,0x2b,0xa, 0x29,0x7f,0x67,0x2d,0xd2, +0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x81,0xe, 0x12,0x8c,0x42,0x49,0x33,0x29, +0x8, 0x9d,0x32,0x12,0x17,0x85,0x7d,0xd3,0x7e,0x70,0x4, 0xac,0x79,0x49,0x23,0x36, +0x49,0x12,0x8c,0x38,0x9d,0x32,0x12,0x17,0x85,0x7d,0xc3,0x7e,0x73,0x35,0x92,0xa, +0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x8c,0x42,0x7e,0xf0,0x9, 0xac, +0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49,0x22,0x36,0x49,0x7e,0xf0, +0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28,0x2, 0x1b,0x10,0xa5,0xb9, +0x0, 0x79,0x7e,0xb3,0x35,0x93,0x4, 0x7a,0xb3,0x35,0x93,0x7e,0x63,0x35,0x93,0xbe, +0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x35,0x93,0x7e,0xb3,0x35,0x92,0xbc,0xb3,0x50, +0x5a,0x4, 0x7a,0xb3,0x35,0x92,0x80,0x53,0x7e,0x50,0x9, 0xac,0x50,0x49,0xb2,0x29, +0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x36,0x47,0x49,0x22,0x29,0xa, 0x59,0x27, +0x36,0x49,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x35,0x92,0x80,0xb, 0xbc,0x7a,0x28,0x7, +0x7c,0xb7,0x14,0x7a,0xb3,0x35,0x92,0xe4,0x7a,0xb3,0x35,0x93,0x80,0x1d,0x4c,0x88, +0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59, +0x59,0x32,0x36,0x47,0x12,0x8c,0x38,0x59,0x32,0x36,0x49,0xb, 0x0, 0xa5,0xb8,0xa, +0x2, 0x80,0x2, 0x61,0x3a,0xda,0x79,0x22,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29, +0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49,0x22,0x36,0x47,0x22,0xa2,0xa, 0x22,0x7c, +0xab,0x7e,0xb, 0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x35,0xab,0xbe, +0x73,0x35,0xb5,0x50,0xe, 0x7d,0x24,0x2e,0x24,0x35,0xab,0x7c,0xb7,0x4, 0x7a,0x29, +0xb0,0xd3,0x22,0xbe,0x73,0x35,0xb5,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a, +0xb, 0xb0,0x74,0xff,0x19,0xb4,0x35,0xab,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x35,0xab, +0xbe,0xb0,0xff,0x68,0x7, 0xe4,0x19,0xb3,0x35,0xab,0xd3,0x22,0xe4,0x19,0xb3,0x35, +0xab,0xc3,0x22,0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x81,0xbd,0x13,0x38, +0x6, 0x7e,0x34,0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12, +0x15,0x75,0xbe,0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x35,0xb7,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x35,0x94,0x80,0x4, 0x59,0x35, +0x35,0x94,0x59,0xf5,0x35,0xb7,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, +0xda,0xf8,0x22,0x7e,0x8, 0x35,0xb7,0x7e,0x34,0x0, 0x14,0xe4,0x12,0x17,0x53,0x7e, +0x8, 0x35,0x94,0x7e,0x34,0x0, 0x14,0x2, 0x17,0x53,0x6c,0x0, 0x6c,0x11,0x80,0x13, +0x7c,0xb1,0x12,0x1e,0x96,0x60,0xa, 0x12,0x8d,0x64,0x40,0x5, 0x7e,0x0, 0x1, 0x80, +0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5,0x7c,0xb0,0x6c,0x77,0x12, +0x8d,0x7d,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70,0x1, 0x12,0x8d,0x7d,0xb4, +0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x1e,0x96,0x60,0xc, 0x12,0x8d,0x64, +0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x54,0xcd,0xb, 0x10,0x7e,0x3, 0x28,0x84,0xbc, +0x1, 0x38,0xe3,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xb7,0xb4,0x17,0x2, 0xd3,0x22,0xc3,0x22,0x7c,0xab,0xa5, +0xbf,0x0, 0xc, 0x7e,0xb3,0x37,0x67,0x7a,0xb3,0x37,0x68,0x7a,0xa3,0x37,0x67,0x7e, +0xb3,0x37,0x68,0x60,0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e, +0xb3,0x37,0x69,0x60,0x5, 0x14,0x7a,0xb3,0x37,0x69,0x7e,0x73,0x37,0x69,0xbe,0x70, +0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xe5,0x29,0x7c,0x7c,0x2, 0x8d,0x74,0xca, +0xf8,0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x5e,0xc2,0xa, 0xc2, +0xb, 0x80,0x7d,0xbe,0xb0,0x2, 0x38,0x72,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, +0x27,0x7e,0x73,0x26,0xfa,0x12,0x1e,0x8f,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73, +0x26,0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0x1e,0x8f,0xbe,0x34,0x0, 0x5, 0x58, +0x2, 0x80,0x5a,0x6c,0xff,0x80,0x3c,0x7c,0xbf,0x12,0x7e,0x27,0x1a,0x4b,0x7c,0xbf, +0x12,0x78,0x52,0x7d,0xc3,0xbe,0xc4,0x3, 0xe8,0x58,0x4, 0x7e,0xd4,0x0, 0x8, 0x7d, +0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0xb, 0x80,0xa, 0x7d,0x5d,0xe, 0x54,0xbd, +0x54,0x48,0x2, 0xc2,0xb, 0x20,0xb, 0x4, 0xbd,0xd4,0x58,0x5, 0x75,0x5e,0x28,0x80, +0xf, 0xb, 0xf0,0x12,0x56,0xb5,0x38,0xbf,0x80,0x6, 0xe5,0x5e,0x24,0xfb,0xf5,0x5e, +0xe5,0x5e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0xa, 0x15,0x5e,0x80,0x5, 0x75,0x5e,0x0, +0xc2,0xa, 0xda,0xf8,0x22,0xca,0x3b,0x7e,0x93,0x2a,0x93,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x2, 0xbc,0x58,0x2, 0xe1,0x9, 0x6c,0x88,0xe1,0x2, 0x6c,0xff,0x6c,0xee,0x74, +0x2, 0xac,0xb8,0x9, 0xd5,0x26,0xfa,0x12,0x8f,0x13,0x7c,0xbd,0x12,0x2c,0xb9,0xbe, +0x34,0x0, 0xfa,0x18,0x6b,0x7e,0xa1,0x24,0x74,0x2, 0xa4,0x49,0x55,0x4, 0xfc,0xbe, +0x54,0x1, 0xc2,0x18,0x5b,0xbe,0xd0,0x3, 0x38,0x5f,0x6c,0xcc,0x80,0xd, 0x12,0x8f, +0xc, 0xbe,0x34,0x2, 0xbc,0x8, 0x2, 0xb, 0xf0,0xb, 0xc0,0xbc,0x9c,0x38,0xef,0x6c, +0xcc,0x80,0x24,0xbc,0x8c,0x68,0x1e,0x74,0x2, 0xac,0xbc,0x9, 0x75,0x26,0xfa,0xa, +0x37,0x7d,0x13,0xb, 0x14,0xa, 0x2d,0xbd,0x12,0x48,0xa, 0xa, 0x5d,0xb, 0x54,0xbd, +0x35,0x18,0x2, 0xb, 0xe0,0xb, 0xc0,0x7e,0x73,0x28,0x84,0xbc,0x7c,0x38,0xd4,0xbe, +0xf0,0x5, 0x50,0x5, 0xbe,0xe0,0x2, 0x40,0x7, 0x7c,0xb8,0x6c,0x77,0x12,0x54,0xcd, +0xb, 0x80,0x12,0x7f,0x7, 0x28,0x2, 0xc1,0x7b,0xda,0x3b,0x22,0x7c,0xbd,0x7c,0x7c, +0x2, 0x2c,0xb9,0x9, 0x75,0x26,0xfb,0x7a,0x71,0x24,0x22,0xe4,0x7a,0xb3,0x36,0x6f, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x36,0xe8,0x60,0x5, 0xe4,0x7a,0xb3,0x36, +0xea,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x6e,0x12,0x8f,0x82,0x28,0x35,0x6d,0x22, +0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0x7b,0xbe,0x37,0x7, 0xfa,0x8, +0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x21,0x70,0x17,0x7e,0xb3,0x38,0xf, +0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x5f,0xe5,0x5f,0xbe,0xb0,0x10,0x28,0x5, 0xd2,0x15, +0x75,0x5f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x5f,0x0, 0x22,0x7e,0x24,0x0, 0x2, 0x2, +0x15,0x29,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x0, 0x22,0x7e,0xb3,0x2b,0x3c,0xb4,0x1, +0x31,0x12,0x8f,0xc3,0x7e,0x1f,0x39,0xac,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8, +0x7a,0x37,0x24,0xf6,0x12,0x8f,0xca,0x12,0x8f,0xd3,0xe4,0x7a,0xb3,0x24,0xf5,0x7e, +0x34,0x0, 0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, +0xd, 0x7, 0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x8c,0x7a,0x73, +0x24,0xf2,0x22,0x7e,0x73,0x2a,0x8d,0x7a,0x73,0x24,0xf3,0x22,0x12,0x8f,0xeb,0xbe, +0x34,0x2, 0x30,0x28,0x3, 0xd2,0x17,0x22,0xc2,0x17,0x22,0x6d,0x11,0xe4,0x12,0x0, +0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x7f,0x39,0xc6,0x2d,0xf0, +0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12,0x17,0x85,0xbd,0x31,0x28, +0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x39,0xc6,0x2d,0x13,0x69,0x20,0x1, 0x0, +0x69,0x30,0x0, 0x80,0x12,0x77,0xbc,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x1f,0x39,0xc6, +0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff, +0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff,0xb, 0xa0, +0x7e,0xb3,0x2a,0x93,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x17,0x53,0x12,0x8f,0xd3,0x12,0x8f,0xca,0xa9,0xd1,0xcb, +0x12,0x6f,0xd1,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x39,0xac,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0x90,0x8f,0x2, 0xd, 0x7, 0x7a, +0x37,0x24,0xfc,0x7e,0x8, 0x24,0xf2,0x22,0x7a,0xb3,0x24,0xf2,0x7e,0x53,0x2a,0x8d, +0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa,0xe4,0x7a,0xb3,0x24,0xf4,0x7a,0xb3,0x24, +0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24,0xf6,0x7e,0x34,0x0, 0x20,0x12,0x90,0x8f, +0x2, 0xd, 0x7, 0x12,0x6f,0xc9,0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x8c,0x12,0x90, +0x98,0x12,0x90,0xdf,0x7a,0x37,0x39,0xa9,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x6d, +0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0x91,0x95,0x90,0x60, +0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0x90,0xfc,0x22,0xca,0xf8,0x6d,0xee, +0x7d,0xfe,0x7e,0x83,0x2a,0x8d,0xa, 0xd8,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x2f, +0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x18,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x13, +0xfe,0x7f,0x50,0x2d,0xb3,0xb, 0x5a,0xc0,0x9d,0xc2,0x59,0xc3,0x13,0xc6,0xb, 0xa0, +0xbc,0x8a,0x38,0xe4,0x90,0x60,0x92,0xe4,0x93,0x7c,0x9b,0x6d,0xdd,0x80,0x11,0x7e, +0x8, 0x13,0xfe,0x90,0x60,0x92,0xe4,0x93,0xa, 0xcb,0x1b,0xc4,0x7d,0x3c,0x7c,0x97, +0x6c,0xff,0x80,0x38,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x7d,0x23,0x2d,0x2e,0x3e,0x24, +0x49,0xc2,0x13,0xfe,0x2d,0x3d,0x3e,0x34,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xb0,0x7d, +0x3c,0x9d,0x3b,0x12,0x17,0x85,0x7d,0xa3,0xbd,0xfa,0x58,0x2, 0x7d,0xfa,0xb, 0xa0, +0xbc,0x8a,0x38,0xd4,0xa, 0xc8,0x2d,0xec,0x2d,0xdc,0xb, 0xf0,0xbc,0x9f,0x38,0xc4, +0x7d,0x3f,0xda,0xf8,0x22,0xca,0xf8,0x6d,0x44,0x7e,0xf3,0x2a,0x8d,0x90,0x60,0x93, +0xe4,0x93,0xa, 0xfb,0x7e,0xb3,0x2a,0x8c,0xa, 0xeb,0x2d,0xef,0xa, 0xff,0xad,0xfe, +0xa, 0xef,0x2d,0xef,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x31,0x7e,0x8, 0x13,0x8e, +0x6c,0xaa,0x80,0x23,0xa, 0xda,0x2d,0xdf,0x3e,0xd4,0x7e,0x1f,0x39,0xac,0x2d,0x3d, +0xb, 0x1a,0xd0,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x50,0x2d,0xb2,0xb, 0x5a,0x30,0x9d, +0x3d,0x59,0x32,0x13,0xc6,0xb, 0xa0,0xbc,0xfa,0x38,0xd9,0x80,0xa, 0x7d,0x5e,0x3e, +0x54,0x7e,0xf, 0x39,0xac,0x2d,0x15,0x6c,0xaa,0x80,0x2c,0xa, 0xea,0x2d,0xef,0x3e, +0xe4,0x7e,0x1f,0x39,0xac,0x2d,0x3e,0xb, 0x1a,0xe0,0x7e,0x70,0x2, 0xac,0x7a,0x2d, +0x31,0x7d,0x20,0xb, 0x1a,0xd0,0x7d,0x3e,0x9d,0x3d,0x12,0x17,0x85,0x7d,0xc3,0xbd, +0x4c,0x58,0x2, 0x7d,0x4c,0xb, 0xa0,0xbc,0xfa,0x38,0xd0,0x7d,0x34,0xda,0xf8,0x22, +0x6c,0x66,0x7e,0x27,0x39,0xd6,0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e, +0xb3,0x28,0xac,0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xca,0xbc,0x76,0x50,0xf, 0xe4,0x7a, +0xb3,0x28,0xad,0x12,0x7b,0xb0,0x7e,0xb3,0x2f,0xca,0x4, 0x80,0x4, 0xe4,0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xca,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xcb, +0xbe,0xa0,0x5, 0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74, +0x5, 0x80,0x1, 0xe4,0x7a,0xb3,0x2f,0xcb,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8, +0x30,0x6, 0xe, 0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, +0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x93,0xa, 0x3b,0x7e,0xb3,0x2a,0x92,0xa, 0x2b,0x2d, +0x23,0xa, 0x3a,0xbd,0x32,0x48,0xc6,0x22,0xd2,0x0, 0x6c,0xaa,0x6c,0x77,0x80,0x1f, +0x7e,0x63,0x2a,0x8d,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac, +0x56,0x49,0x22,0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e, +0xb3,0x2a,0x8c,0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, +0x2, 0xc2,0x0, 0xa2,0x0, 0x22,0x7e,0x63,0x2a,0x8e,0x7e,0xa3,0x2a,0x8f,0x7e,0x70, +0x1, 0x80,0x15,0xa, 0x17,0x7e,0xb3,0x2a,0x8d,0xa, 0x2b,0x2d,0x21,0x3e,0x24,0x12, +0x93,0x51,0x58,0x2, 0xd3,0x22,0xb, 0x70,0xa, 0x16,0x1b,0x14,0xa, 0x27,0xbd,0x21, +0x48,0xe1,0x7e,0x70,0x2, 0x80,0xe, 0x7e,0x50,0x2, 0xac,0x57,0x12,0x93,0x51,0x58, +0x2, 0xd3,0x22,0xb, 0x70,0xa, 0x1a,0x1b,0x15,0xa, 0x27,0xbd,0x21,0x48,0xe8,0xc3, +0x22,0x49,0x22,0x4, 0xfc,0xbe,0x24,0xfe,0xe8,0x22,0x7e,0xb3,0x37,0x7b,0xb4,0x1, +0x3, 0x2, 0x93,0xb1,0x7e,0xb3,0x37,0xe1,0x4, 0x7a,0xb3,0x37,0xe1,0x7e,0xb3,0x37, +0x6f,0xb4,0x2, 0x18,0x7e,0xb3,0x37,0xe0,0x4, 0x7a,0xb3,0x37,0xe0,0xb4,0x1, 0x6, +0x74,0x1, 0x7a,0xb3,0x37,0xe1,0x74,0x1, 0x7a,0xb3,0x37,0x6f,0x7e,0x73,0x37,0xe0, +0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x37,0x7b,0x12,0x93,0xb1,0x12,0x96, +0x67,0x12,0x93,0xb8,0x7e,0x73,0x37,0xe1,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x93,0xb8, +0x22,0x74,0x2, 0x7a,0xb3,0x37,0x6f,0x22,0xe4,0x7a,0xb3,0x37,0xe1,0x7a,0xb3,0x37, +0xe0,0x22,0x7e,0x73,0x37,0x6f,0x7a,0x73,0x37,0xe5,0x7e,0x47,0x39,0xa9,0xbe,0x44, +0x0, 0x64,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x37,0x6f,0xbe,0x44,0x0, 0xc8,0x28,0x8, +0xe4,0x7a,0xb3,0x37,0x6d,0x12,0x93,0xb1,0x7e,0x57,0x37,0x75,0xbd,0x54,0x50,0x4, +0x7a,0x47,0x37,0x75,0x12,0x95,0xe4,0x38,0x10,0x12,0x95,0xdc,0x38,0xb, 0x12,0x94, +0x49,0x38,0x6, 0x7e,0xb3,0x16,0x91,0x70,0x34,0x12,0x93,0x5a,0xbe,0x44,0x0, 0x32, +0x50,0x21,0x7e,0xb3,0x37,0x6d,0x4, 0x7a,0xb3,0x37,0x6d,0x7e,0x73,0x37,0x6d,0xbe, +0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3,0x37,0x6d,0x12,0x95,0xf6,0x7a,0xb3,0x37, +0xe2,0x80,0x5, 0xe4,0x7a,0xb3,0x37,0x6d,0x7d,0x34,0x2, 0x96,0xbf,0x2, 0x94,0x40, +0x12,0x93,0xb8,0xe4,0x7a,0xb3,0x37,0x7b,0x22,0x7e,0x73,0x26,0xf5,0xbe,0x70,0x0, +0x22,0xca,0x79,0x7e,0xf0,0xff,0x12,0x96,0x90,0x7e,0xb3,0x37,0x71,0xb4,0x1, 0x8, +0x12,0x6f,0xee,0xe4,0x7a,0xb3,0x37,0x71,0x7e,0xb3,0x37,0x70,0x60,0x4, 0x74,0xff, +0xa1,0x52,0x7e,0xb3,0x37,0x6f,0xb4,0x2, 0x2, 0x80,0x2, 0xa1,0x46,0x12,0x95,0xe4, +0x38,0x12,0x12,0x95,0xdc,0x38,0xd, 0x12,0x94,0x49,0x38,0x8, 0x7e,0xb3,0x16,0x91, +0x60,0x2, 0xa1,0x46,0x74,0x3, 0x12,0x95,0x55,0x7c,0xeb,0x7e,0xb3,0x37,0x6e,0x4, +0x7a,0xb3,0x37,0x6e,0x74,0x3, 0x12,0x95,0x55,0x7c,0xab,0xbe,0xa0,0xff,0x68,0x23, +0xbe,0xe0,0xff,0x68,0x1c,0x7e,0x30,0xc, 0xac,0x3e,0x49,0x21,0x37,0x84,0xbe,0x24, +0x1, 0xf4,0x28,0xf, 0x12,0x95,0xec,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xea,0x80, +0x2, 0x7c,0xea,0xbe,0xe0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x37,0x6e,0x7a,0xb3,0x37, +0x6f,0x7a,0xb3,0x37,0x7b,0x74,0xff,0x80,0x69,0x7e,0x73,0x37,0x6e,0xbe,0x70,0x4, +0x28,0x54,0x74,0xc, 0xac,0xbe,0x49,0x35,0x37,0x84,0xbe,0x34,0x1, 0xf4,0x40,0x6, +0x7e,0xb3,0x16,0x91,0x70,0x37,0x7e,0x37,0x37,0x6a,0xbe,0x34,0x1, 0x2c,0x38,0xa, +0x7e,0x37,0x37,0x75,0xbe,0x34,0x1, 0x2c,0x28,0x23,0x74,0x5, 0xac,0xbe,0x9, 0x75, +0x26,0x33,0xbe,0x73,0x2b,0x2e,0x68,0x15,0x7c,0xfe,0xbe,0xf0,0x4, 0x50,0x8, 0x12, +0x6e,0xb4,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x37,0x71,0xe4,0x7a,0xb3, +0x37,0x7b,0x7a,0xb3,0x37,0x6f,0xbe,0xf0,0xff,0x68,0x5, 0xe4,0x7a,0xb3,0x37,0x6e, +0x7c,0xbf,0xda,0x79,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12, +0x95,0xce,0x68,0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0x96,0x0, 0x7d,0x23,0x7e,0x70, +0xc, 0xac,0x72,0x59,0x23,0x37,0x88,0x49,0x3, 0x37,0x88,0x49,0x23,0x37,0x84,0xbd, +0x20,0x50,0x4, 0x59,0x3, 0x37,0x84,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c, +0x22,0x80,0x18,0x12,0x95,0xce,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x37, +0x84,0xbd,0x4, 0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e, +0x37,0x37,0x6a,0xbe,0x37,0x37,0xe3,0x50,0x8, 0x7e,0x37,0x37,0xe3,0x7a,0x37,0x37, +0x6a,0x12,0x95,0xec,0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10, +0x5, 0xac,0x12,0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0x2e,0x22,0x7e,0x73,0x26,0xf4, +0xbe,0x70,0x0, 0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0x70,0xc, 0xac, +0x7a,0x49,0x33,0x37,0x84,0x22,0xe4,0x7a,0xb3,0x37,0x6f,0x7a,0xb3,0x37,0x77,0x22, +0x49,0x23,0x37,0x8a,0x49,0x33,0x37,0x86,0x9d,0x32,0x2, 0x17,0x85,0x6c,0xaa,0x7e, +0x70,0xc, 0xac,0x7a,0x12,0x96,0x0, 0xbe,0x34,0x3, 0xe8,0x8, 0x5, 0x12,0x96,0x59, +0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x37,0x8a,0x49,0x12,0x37,0x86,0xbd, +0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x37,0x8a,0x7d,0x13,0xb, 0x15,0x1b,0x8, 0x10, +0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x37,0x8a,0x1b,0x35,0x1b,0x28, +0x30,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xb7,0x22,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32, +0x37,0x86,0x59,0x32,0x37,0x8a,0x22,0xe4,0x7a,0xb3,0x37,0x6d,0x6d,0x33,0x6c,0xaa, +0x7e,0x50,0xc, 0xac,0x5a,0x59,0x32,0x37,0x84,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xf0, +0xe4,0x7a,0xb3,0x37,0x6e,0x6d,0x33,0x7a,0x37,0x37,0x75,0x7a,0x37,0x37,0x6a,0x22, +0x7e,0xb3,0x37,0x70,0xb4,0x1, 0x27,0x7e,0xb3,0x37,0xe6,0x4, 0x7a,0xb3,0x37,0xe6, +0x7e,0x73,0x37,0xe6,0xbe,0x70,0x3, 0x40,0x15,0x12,0x7e,0xc, 0x7e,0x73,0x37,0xe6, +0xbe,0x70,0x6, 0x40,0x9, 0xe4,0x7a,0xb3,0x37,0xe6,0x7a,0xb3,0x37,0x70,0x22,0xbe, +0x34,0x1, 0xf4,0x28,0xd, 0x7e,0x53,0x37,0xe2,0xbe,0x50,0x8, 0x50,0x3f,0x74,0x8, +0x80,0x37,0xbe,0x34,0x1, 0x90,0x28,0xd, 0x7e,0x53,0x37,0xe2,0xbe,0x50,0x6, 0x50, +0x2c,0x74,0x6, 0x80,0x24,0xbe,0x34,0x1, 0x2c,0x28,0xd, 0x7e,0x53,0x37,0xe2,0xbe, +0x50,0x4, 0x50,0x19,0x74,0x4, 0x80,0x11,0xbe,0x34,0x0, 0xc8,0x28,0xf, 0x7e,0x73, +0x37,0xe2,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x37,0xe2,0x7e,0xb3,0x37, +0xe2,0xbe,0xb0,0x0, 0x28,0x19,0x14,0x7a,0xb3,0x37,0xe2,0x74,0x1, 0x7a,0xb3,0x16, +0x92,0x7e,0x73,0x37,0xe2,0xbe,0x70,0x4, 0x28,0x5, 0xe4,0x7a,0xb3,0x16,0x91,0x22, +0x7e,0xb3,0x2b,0x2e,0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0xc4,0x1, 0xf4,0x7e,0x73, +0x38,0xe5,0xa, 0xb7,0x7e,0xb3,0x2b,0x2f,0xf5,0x34,0x75,0x35,0x4, 0xe4,0x7a,0xb3, +0x37,0x78,0xa, 0x3e,0xad,0x3b,0x7d,0xa3,0x2d,0xac,0x6c,0xdd,0x7e,0xa3,0x37,0x78, +0xbe,0xa1,0x35,0x40,0x2, 0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, +0x75,0x26,0x33,0xbc,0x7e,0x78,0xe, 0xe5,0x35,0x14,0xbe,0xb3,0x37,0x78,0x78,0x5, +0xe4,0x7a,0xb3,0x37,0x78,0x7e,0xc3,0x37,0x78,0x80,0x3a,0x7e,0xb3,0x37,0x78,0x4, +0x7a,0xb3,0x37,0x78,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x33,0xbc,0x7e,0x68,0x23, +0xa, 0xdd,0x19,0xcd,0x37,0x7c,0xa, 0x97,0xad,0x9b,0x2d,0x9c,0x7c,0xad,0xb, 0xd0, +0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x34,0x12,0x10,0x0, 0xb, 0xf0,0xbe,0xf0, +0x3, 0x50,0x8, 0xb, 0xc0,0xe5,0x35,0xbc,0xbc,0x38,0xc0,0x7a,0xf3,0x37,0x79,0xda, +0x3b,0x22,0x7e,0x37,0x39,0xa5,0x12,0x51,0x7f,0x7a,0x37,0x37,0xe3,0x6c,0xaa,0x80, +0x24,0xbe,0xa0,0x4, 0x50,0x27,0xa, 0x3a,0x9, 0x63,0x37,0x7c,0xbe,0x60,0x4, 0x50, +0x12,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x42,0x39,0x9f,0x7e,0x70,0xc, 0xac,0x67,0x59, +0x43,0x37,0x86,0xb, 0xa0,0x7e,0xb3,0x37,0x79,0xbc,0xba,0x38,0xd4,0x22,0x12,0x98, +0xa4,0x12,0x98,0x70,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d,0x13,0x2e,0x14,0x2a, +0x99,0x6d,0x0, 0x9, 0xb3,0x2a,0x98,0x12,0x98,0x57,0xa, 0x3b,0x7d,0x13,0x2e,0x14, +0x2b,0x40,0x6d,0x0, 0x9, 0xb3,0x2b,0x3f,0x12,0x98,0x57,0xa, 0x1b,0x2e,0x14,0x2a, +0x9b,0x12,0x98,0x64,0xe5,0x25,0x12,0x98,0x5b,0xa, 0x1b,0x2e,0x14,0x2b,0x42,0x12, +0x98,0x64,0xe5,0x24,0x2, 0x17,0x53,0x7e,0x34,0x0, 0x2, 0x12,0x17,0x53,0x90,0x60, +0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, 0x3b,0x1b,0x35,0x22, +0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x99,0xbc,0xba,0x68,0x7, +0xb, 0x90,0x12,0x98,0x9c,0x38,0xef,0x12,0x98,0x9c,0x68,0x7, 0xb, 0xa0,0xbe,0xa0, +0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22,0x90,0x60,0x50,0xe4, +0x93,0xbc,0xb9,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22,0x7e,0x8, 0x37, +0x80,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x17,0x53,0x6c,0xaa,0x7e,0x44,0xff,0xff,0x7e, +0x70,0xc, 0xac,0x7a,0x59,0x43,0x37,0x82,0x59,0x43,0x37,0x8a,0xb, 0xa0,0xbe,0xa0, +0x8, 0x40,0xe8,0x7e,0x8, 0x37,0x6e,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x17,0x53,0x7e, +0xa3,0x2b,0x81,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x81,0xd2,0x10,0x30,0x10,0x9, +0xc2,0x10,0x12,0x27,0xe0,0xe4,0x2, 0xa, 0x66,0x22,0x6d,0x33,0x7d,0x23,0x7d,0x3, +0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x8d,0xac,0xb3,0xa, 0x42, +0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4,0xb, 0x7a,0x40,0xbe, +0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, 0x24,0xbe,0x44,0xff, +0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, 0x34,0xb, 0x21,0x7e, +0x93,0x2a,0x8d,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a,0x8c,0xbc,0xb3,0x38, +0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x12, +0x51,0x81,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0xda,0x7e, +0xb3,0x39,0xdb,0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39,0xdb,0x80,0x3c,0xe4, +0x7a,0xb3,0x39,0xdb,0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22,0xbd,0x32,0x28,0x1e, +0xe4,0x7a,0xb3,0x39,0xdb,0x7e,0xb3,0x39,0xda,0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a, +0xb3,0x39,0xda,0x80,0x16,0xe4,0x7a,0xb3,0x39,0xda,0x74,0x2, 0x80,0x9, 0xe4,0x7a, +0xb3,0x39,0xda,0x7a,0xb3,0x39,0xdb,0x7a,0xb3,0x39,0xdc,0x7e,0xb3,0x39,0xdc,0x22, +0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x39,0xdd,0x22,0xca,0xd8,0xca,0x79,0xc2,0x0, +0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7,0x28,0x97,0x7e,0x37,0x39,0x13, +0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff,0x7e,0xa3,0x2a,0x8d,0x7c,0x8a, +0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14,0x24,0xc2,0x68,0x8, 0x24,0xfb, +0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83,0x2a,0x8c,0x80,0xa, 0x7e,0x73, +0x2a,0x8c,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99,0x80,0xf, 0x7c,0xb9,0x12,0x78, +0x52,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, 0x90,0x7e,0x33,0x28,0x84,0xbc, +0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x61,0x8b,0x7e,0xa3,0x28,0x85,0xbe,0xa0, +0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3,0x26,0x83,0x70,0x31,0x6c,0x99, +0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34,0x49,0x23,0x5, 0x7a,0xbd,0x2f, +0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, 0x6d,0x33,0x9d,0x3e,0x12,0x8f, +0x7b,0xbd,0x3, 0x8, 0x4, 0xd2,0x0, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xd3,0x6d, +0xee,0x9e,0xe7,0x2a,0x6e,0xbe,0xe7,0x7, 0xf8,0x8, 0x2, 0xc2,0x0, 0x30,0x0, 0x20, +0x7e,0xb3,0x39,0xdd,0x4, 0x7a,0xb3,0x39,0xdd,0x7e,0x23,0x39,0xdd,0xbe,0x20,0xa, +0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x39,0xdd,0x74,0x1, 0x7a,0xb3,0x28,0xa8,0x80,0xf, +0x7e,0x23,0x39,0xdd,0xbe,0x20,0x0, 0x28,0x6, 0x1e,0x20,0x7a,0x23,0x39,0xdd,0x6c, +0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28,0x69,0x7e,0xb3,0x28,0xa7,0xb4, +0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68,0x59,0x7e,0xb3,0x28,0xa8,0xb4, +0x1, 0x52,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x26,0xfa,0x9, +0xd3,0x26,0xfb,0x12,0x9b,0x90,0xbe,0x34,0x0, 0x96,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x1d,0x7e, +0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3,0x27,0x37,0x12,0x9b,0x90,0xbe, +0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x85, +0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x17,0xa, 0xe9,0xa, 0x5f,0x2d,0x5e,0x3e,0x54, +0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0x6, 0xb, 0x90,0xbc, +0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x39,0xde,0x4, 0x7a,0xb3,0x39,0xde, +0x7e,0x73,0x39,0xde,0xbe,0x70,0x5, 0x28,0x22,0x74,0x5, 0x7a,0xb3,0x39,0xde,0x7e, +0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x19,0x12,0x99,0xc0,0x80,0xf, 0x7e,0x73,0x39,0xde, +0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x39,0xde,0xda,0x79,0xda,0xd8,0x22, +0x7c,0xba,0x7c,0x7d,0x2, 0x2c,0xb9,0xca,0xf8,0x7c,0xfb,0x7e,0x34,0x0, 0x38,0xca, +0x39,0xac,0x7f,0x2e,0x34,0x0, 0x63,0x6d,0x22,0x7e,0x8, 0x34,0x0, 0x12,0x17,0x2e, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, 0x43,0x6d,0x22, +0x7e,0x8, 0x3, 0x73,0x12,0x17,0x2e,0x1b,0xfd,0xda,0xf8,0x22,0x6c,0xaa,0x12,0x9c, +0x10,0x29,0x81,0x0, 0x5, 0x7c,0x98,0x5e,0x90,0x1, 0x3e,0x90,0x7f,0x1, 0x2e,0x14, +0x0, 0x5, 0x7c,0xb8,0x54,0xfd,0x4c,0xb9,0x7a,0xb, 0xb0,0x29,0xb1,0x0, 0x5, 0x30, +0xe0,0x16,0x30,0xe2,0x13,0xc4,0x23,0x54,0x1f,0xb4,0x1, 0xc, 0x7f,0x1, 0xb, 0x16, +0x7e,0xb, 0xb0,0x1e,0xb0,0x7a,0xb, 0xb0,0xb, 0xa0,0xbe,0xa0,0x1e,0x40,0xbf,0x22, +0x7e,0x70,0x6, 0xac,0x7a,0x2e,0x34,0x32,0x4d,0x6d,0x22,0x22,0x6c,0xaa,0x12,0x9c, +0x10,0x12,0x9c,0x3e,0x54,0xfe,0x12,0x9c,0x3b,0x54,0x7, 0x12,0x9c,0x3b,0x54,0xfb, +0x7a,0xb, 0xb0,0xb, 0xa0,0xbe,0xa0,0x1e,0x40,0xe4,0x22,0x7a,0xb, 0xb0,0x7f,0x1, +0x2e,0x14,0x0, 0x5, 0x7e,0xb, 0xb0,0x22,0xca,0x79,0xc2,0x0, 0x7e,0xf0,0x3, 0x12, +0x86,0xfc,0x7e,0xe3,0x2a,0x21,0x7e,0x34,0x1f,0x34,0x7a,0x37,0x32,0xe, 0x12,0x9f, +0xf6,0x38,0x2, 0xa1,0x24,0x12,0x9d,0x2d,0x92,0xd, 0x12,0x9c,0x1c,0x7c,0xbf,0x12, +0x28,0xd6,0x4c,0xee,0x68,0xe, 0x7e,0xa3,0x31,0xeb,0x4c,0xaa,0x78,0xa, 0x7e,0xb3, +0x31,0xec,0x70,0x4, 0xd2,0x0, 0x80,0x25,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x1c,0xbe, +0xb0,0x8, 0x28,0x4, 0xd2,0x0, 0x80,0x15,0xd2,0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xbe, +0x78,0xb, 0x20,0xd, 0x8, 0x4c,0xaa,0x78,0x4, 0x6c,0xff,0xc2,0x0, 0x20,0x0, 0x5, +0x7c,0xbf,0x12,0x28,0xd6,0x7e,0x8, 0x31,0xf0,0x12,0x2e,0xc, 0x7a,0xb3,0x31,0xef, +0xbe,0xb3,0x28,0x84,0x50,0x3d,0x7e,0x33,0x31,0xef,0x80,0x29,0x7e,0x70,0x2, 0xac, +0x73,0x9, 0x23,0x32,0x10,0x9, 0x13,0x32,0x11,0x2e,0x37,0x32,0xe, 0xb, 0x38,0x50, +0x7e,0x93,0x2a,0x8d,0xac,0x92,0xa, 0x31,0x2d,0x43,0x12,0x5f,0xc0,0x7c,0xb3,0x7e, +0x70,0x1, 0x12,0x54,0xcd,0x7c,0x3, 0x1b,0x30,0xa5,0xb8,0x0, 0xcf,0x74,0x1, 0x7a, +0xb3,0x31,0xed,0x7e,0xa3,0x31,0xef,0x7a,0xa3,0x28,0x84,0x74,0x2, 0xa4,0xca,0x59, +0x7e,0x18,0x32,0x10,0x7e,0x8, 0x26,0xfa,0x12,0x17,0x2e,0x1b,0xfd,0x12,0xa0,0xb, +0xf5,0x1c,0x80,0x6, 0x75,0x1c,0x64,0x12,0xa2,0x65,0xda,0x79,0x22,0xca,0x3b,0x7e, +0xe3,0x28,0x84,0x6c,0xdd,0x6c,0xff,0x74,0x6, 0xac,0xbd,0x12,0x9f,0xfe,0x30,0xe0, +0x37,0x6c,0xcc,0x80,0x27,0x12,0xaf,0xc5,0x7a,0xb3,0x1f,0x70,0x9, 0xa3,0x26,0xfb, +0x7a,0xa3,0x1f,0x71,0x7f,0x7, 0x12,0x9d,0x83,0x50,0xf, 0x7f,0x7, 0x7e,0xb3,0x1f, +0x71,0x6c,0x77,0x12,0x9d,0x86,0x50,0x2, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xd5, +0xbe,0xf0,0x2, 0x40,0x3, 0xd3,0x80,0x8, 0xb, 0xd0,0xbe,0xd0,0x1e,0x40,0xb6,0xc3, +0xda,0x3b,0x22,0x7e,0x70,0x1, 0x7c,0x87,0x7c,0x9b,0x29,0xa0,0x0, 0x3, 0x29,0x60, +0x0, 0x1, 0x7e,0x70,0x1, 0xbe,0x80,0x1, 0x78,0x7, 0x29,0xa0,0x0, 0x2, 0x7e,0xb, +0x60,0xa, 0x7, 0xa, 0x29,0x2d,0x2, 0xa, 0x16,0xbd,0x1, 0x48,0xc, 0xa, 0x17,0xa, +0x3a,0x2d,0x31,0xbd,0x23,0x18,0x2, 0xd3,0x22,0xc3,0x22,0xca,0x3b,0x7c,0xf5,0x7c, +0xe6,0x7c,0xd7,0x7c,0xcb,0x75,0x54,0x0, 0x7e,0xa1,0x54,0x74,0x6, 0xa4,0x12,0x9f, +0xfe,0x30,0xe1,0x2e,0x7f,0x7, 0x7c,0xbc,0x12,0x9e,0xf, 0x50,0x25,0x7f,0x7, 0x7c, +0xbe,0x12,0x9d,0x83,0x50,0x1c,0x7f,0x7, 0x7c,0xbd,0x6c,0x77,0x12,0x9d,0x86,0x50, +0x11,0x7f,0x7, 0x7c,0xbf,0x6c,0x77,0x12,0x9d,0x86,0x50,0x6, 0x29,0xb7,0x0, 0x4, +0x80,0xa, 0x5, 0x54,0xe5,0x54,0xbe,0xb0,0x1e,0x40,0xbd,0xe4,0xda,0x3b,0x22,0x7e, +0x70,0x1, 0x2, 0x9d,0x86,0xca,0x79,0x7f,0x70,0x7e,0xb4,0xff,0xff,0x6c,0xee,0xc2, +0x1, 0xc2,0x2, 0x29,0x67,0x0, 0x2, 0x7e,0x7b,0x70,0xbc,0x76,0x78,0xe, 0x29,0x67, +0x0, 0x3, 0x29,0x77,0x0, 0x1, 0xbc,0x76,0x78,0x2, 0xd2,0x2, 0x6c,0xff,0x12,0x9f, +0xe9,0x6d,0xaa,0x29,0xb6,0x0, 0x5, 0x20,0xe1,0x2, 0xc1,0xcf,0x7f,0x6, 0x7e,0x7b, +0xb0,0x12,0x9e,0xf, 0x50,0x2d,0x7f,0x6, 0x29,0xb7,0x0, 0x2, 0x12,0x9e,0xf, 0x50, +0x22,0x7f,0x6, 0x29,0xb7,0x0, 0x1, 0x6c,0x77,0x12,0x9d,0x86,0x50,0x15,0x7f,0x6, +0x29,0xb7,0x0, 0x3, 0x6c,0x77,0x12,0x9d,0x86,0x50,0x8, 0x7c,0xef,0xd2,0x1, 0x6d, +0xbb,0x80,0x55,0x7e,0x6b,0x70,0xa, 0x27,0x7e,0x7b,0x70,0x12,0x1e,0x8f,0x2d,0xa3, +0x29,0x76,0x0, 0x2, 0xa, 0x27,0x29,0x77,0x0, 0x2, 0x12,0x1e,0x8f,0x2d,0xa3,0x29, +0x76,0x0, 0x1, 0xa, 0x27,0x29,0x77,0x0, 0x1, 0x12,0x1e,0x8f,0x2d,0xa3,0x29,0x76, +0x0, 0x3, 0xa, 0x27,0x29,0x77,0x0, 0x3, 0x12,0x1e,0x8f,0x2d,0xa3,0xbd,0xab,0x50, +0x4, 0x7d,0xba,0x7c,0xef,0xbe,0xa4,0x0, 0x4, 0x38,0x4, 0xd2,0x1, 0x80,0x9, 0xb, +0xf0,0xbe,0xf0,0x1e,0x50,0x2, 0xc1,0x3e,0x20,0x1, 0xb, 0x20,0x2, 0x8, 0xbe,0xb4, +0x0, 0x8, 0x50,0x2, 0xd2,0x1, 0x20,0x1, 0x2, 0xe1,0x90,0x74,0x6, 0xac,0xbe,0x12, +0x9f,0xed,0x29,0x76,0x0, 0x5, 0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xbe,0xb0,0x1f,0x50, +0x16,0x7f,0x6, 0x2e,0x14,0x0, 0x5, 0x7c,0x67,0x2e,0x60,0x8, 0x5e,0x60,0xf8,0x5e, +0x70,0x7, 0x4c,0x76,0x7a,0xb, 0x70,0x20,0x2, 0x11,0x29,0xb6,0x0, 0x4, 0xbe,0xb0, +0xfa,0x50,0x8, 0x7f,0x16,0xb, 0x36,0x4, 0x7a,0x1b,0xb0,0x29,0x67,0x0, 0x3, 0x29, +0x76,0x0, 0x3, 0xbc,0x76,0x28,0x6, 0x29,0x76,0x0, 0x3, 0x80,0x4, 0x29,0x77,0x0, +0x3, 0x39,0x76,0x0, 0x3, 0x29,0x67,0x0, 0x2, 0x29,0x76,0x0, 0x2, 0xbc,0x76,0x28, +0x6, 0x29,0x76,0x0, 0x2, 0x80,0x4, 0x29,0x77,0x0, 0x2, 0x39,0x76,0x0, 0x2, 0x29, +0x67,0x0, 0x1, 0x29,0x76,0x0, 0x1, 0xbc,0x76,0x50,0x6, 0x29,0x76,0x0, 0x1, 0x80, +0x4, 0x29,0x77,0x0, 0x1, 0x39,0x76,0x0, 0x1, 0x7e,0x7b,0x60,0x7e,0x6b,0x70,0xbc, +0x76,0x50,0x5, 0x7e,0x6b,0x70,0x80,0x3, 0x7e,0x7b,0x70,0x7a,0x6b,0x70,0x80,0x31, +0x6c,0xff,0x74,0x6, 0xac,0xbf,0x9, 0xb5,0x32,0x52,0x30,0xe1,0x7, 0xb, 0xf0,0xbe, +0xf0,0x1e,0x40,0xee,0xbe,0xf0,0x1e,0x50,0x33,0x74,0x1, 0x39,0xb7,0x0, 0x4, 0x12, +0x9f,0xe9,0x7e,0x34,0x0, 0x6, 0xca,0x39,0x7f,0x17,0x7f,0x6, 0x12,0x17,0x2e,0x1b, +0xfd,0x12,0x9f,0xdf,0x44,0x1, 0x7a,0x1b,0xb0,0x12,0x9f,0xdf,0x44,0x2, 0x7a,0x1b, +0xb0,0x30,0x2, 0x8, 0x12,0x9f,0xdf,0x44,0x4, 0x7a,0x1b,0xb0,0xda,0x79,0x22,0x7f, +0x16,0x2e,0x34,0x0, 0x5, 0x7e,0x1b,0xb0,0x22,0x74,0x6, 0xac,0xbf,0x7d,0xd5,0x2e, +0xd4,0x32,0x4d,0x6d,0xcc,0x22,0x7e,0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0x7d,0xf5, +0x2e,0xf4,0x32,0x4d,0x6d,0xee,0x29,0xb7,0x0, 0x5, 0x22,0x7e,0x30,0x64,0x7e,0x20, +0x64,0x6c,0x11,0x80,0x4a,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80,0x38,0x7e,0x70,0x2, +0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0xa0,0x80,0x9, 0xb3,0x26,0xfa,0x12,0x2f,0x7f, +0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12,0xa0,0x80,0x9, 0xb3, +0x26,0xfb,0x12,0x2f,0x7f,0x7c,0x87,0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbc,0x28,0x28, +0x2, 0x7c,0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xc0,0xb, 0x10,0x7e, +0xb3,0x28,0x84,0xbc,0xb1,0x38,0xae,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64, +0x2, 0x6c,0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22, +0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x37,0x28,0x8a,0xbe,0x34,0x3, 0xe8, +0x8, 0xa, 0x12,0xa1,0x35,0xbe,0xb0,0x8, 0x48,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7c,0xfb,0x7f,0x61,0x7f,0x50,0x7e,0x34,0x19,0x20,0x7e,0x24,0x0, 0xff,0x7e,0x14, +0x1f,0x70,0x74,0x2a,0x12,0x16,0x1d,0x7e,0x48,0x1f,0x70,0x12,0xa0,0x88,0x92,0xc, +0x7c,0xbf,0x7e,0x71,0x54,0x12,0x2c,0xb9,0x7d,0x43,0xe5,0x55,0x7e,0x71,0x56,0x12, +0x2c,0xb9,0x2d,0x34,0xe, 0x34,0x7f,0x4, 0x7e,0x50,0x7, 0xb, 0xa, 0x50,0xbd,0x53, +0x58,0x10,0x69,0x30,0x0, 0x2, 0x1b,0x5a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x6a,0x30, +0x80,0x8, 0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe1,0x12,0xa1,0x2d,0x28,0x2b,0xb, +0x5a,0x20,0x7e,0x34,0x0, 0xd, 0xad,0x32,0x7e,0x24,0x0, 0x10,0x12,0x15,0x29,0x1b, +0x5a,0x30,0xb, 0x6a,0x30,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0xd, 0x12,0x15,0x6c, +0x7e,0x8, 0x0, 0x10,0x12,0x15,0xc8,0x1b,0x6a,0x30,0xda,0xf8,0x22,0x7e,0x73,0x31, +0xee,0xbe,0x70,0x5, 0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0xf, 0x7c, +0xbe,0x12,0x7e,0x27,0x7c,0xdb,0xbc,0xfd,0x58,0x2, 0x7c,0xfd,0xb, 0xe0,0x12,0x7d, +0xfd,0x38,0xec,0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xca,0x3b,0x7c,0x45,0x7c,0x6, +0x7c,0x57,0x7c,0x1b,0x7e,0x34,0x4, 0xfc,0x7e,0xb3,0x26,0x83,0x7e,0xf3,0x2a,0x8d, +0x7c,0x31,0x7c,0xe0,0x7c,0x25,0x7c,0xa4,0xbc,0x1, 0x50,0x4, 0x7c,0x30,0x7c,0xe1, +0xbc,0x45,0x50,0x4, 0x7c,0x24,0x7c,0xa5,0xbe,0xb0,0x1, 0x50,0x2, 0x41,0x1f,0x7e, +0x90,0x2, 0xac,0x9f,0x7e,0x50,0x2, 0xac,0x53,0x2d,0x24,0x2d,0x23,0xb, 0x28,0x20, +0x7e,0x10,0x2, 0xac,0x1e,0x2d,0x4, 0x2d,0x3, 0xb, 0x8, 0x40,0xa, 0x3, 0xb, 0x4, +0x7c,0x31,0x80,0x28,0x7e,0xd0,0x2, 0xac,0xdf,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x6, +0x12,0xa2,0x23,0x58,0x15,0xad,0xf4,0xbd,0xdf,0x58,0xf, 0xbe,0x24,0x0, 0x0, 0x8, +0x9, 0xbe,0x44,0x0, 0x0, 0x8, 0x3, 0xc3,0x80,0x46,0xb, 0x30,0xbc,0xe3,0x38,0xd4, +0x7e,0x50,0x2, 0xac,0x52,0x2d,0x23,0xb, 0x28,0x20,0x7e,0x90,0x2, 0xac,0x9a,0x2d, +0x43,0xb, 0x48,0x40,0xa, 0x12,0xb, 0x14,0x80,0x21,0x7e,0x10,0x2, 0xac,0x13,0x12, +0xa2,0x23,0x58,0x15,0xad,0xf4,0xbd,0xdf,0x58,0xf, 0xbe,0x24,0x0, 0x0, 0x8, 0x9, +0xbe,0x44,0x0, 0x0, 0x8, 0x3, 0xc3,0x80,0x7, 0xb, 0x30,0xbc,0xa3,0x38,0xdb,0xd3, +0xda,0x3b,0x22,0x2d,0x3, 0xb, 0x8, 0x0, 0x7e,0xf4,0x0, 0x9, 0x7d,0xb2,0xad,0xbf, +0x7e,0xd4,0x0, 0xa, 0xad,0xd0,0xbd,0xdb,0x22,0x12,0xa1,0x5a,0x92,0x4, 0x30,0x4, +0xc, 0x7e,0xb3,0x32,0x4c,0xbe,0xb0,0xfa,0x50,0x11,0x4, 0x80,0xa, 0x7e,0xb3,0x32, +0x4c,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a,0xb3,0x32,0x4c,0x7e,0xb3,0x32,0x4c,0x70, +0x2, 0xc3,0x22,0xd3,0x22,0x7e,0x8, 0x32,0x4d,0x7e,0x34,0x0, 0xb4,0xe4,0x2, 0x17, +0x53,0xca,0x79,0x7c,0xa7,0x7c,0x8b,0x7e,0xb3,0x2a,0x8e,0x7a,0xb3,0x1f,0x9a,0x7e, +0xb3,0x2a,0x8f,0x7a,0xb3,0x1f,0x9b,0x7e,0x70,0x2, 0xac,0x78,0x9, 0x93,0x26,0xfa, +0x9, 0x83,0x26,0xfb,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x61,0x29,0x7a,0xf1, +0x58,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d,0x32, +0x7c,0xb7,0xf5,0x58,0x7e,0xb3,0x1f,0x9a,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a,0x2f, +0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x58,0x1a,0x2a,0x1a,0x38,0x9d,0x32, +0x7c,0xb7,0xf5,0x57,0x80,0x43,0x85,0x57,0x59,0xe5,0x57,0xbe,0xb0,0x0, 0x58,0x10, +0xe5,0x57,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5,0x59, +0x7e,0xb3,0x1f,0x9b,0xbe,0xb1,0x57,0x18,0x10,0x1a,0x38,0xe5,0x57,0x1a,0x2b,0x9d, +0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x59,0xe5,0x58,0x7e,0x71,0x59,0x12,0x2c, +0xb9,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x5, 0x57,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5, +0x57,0x1a,0x3b,0xbd,0x32,0x8, 0xaf,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a, +0x3f,0xbd,0x32,0x18,0x2, 0x41,0x9e,0x7f,0x17,0xda,0x79,0x22,0x7c,0x4b,0x74,0x2, +0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc,0x75, +0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x90,0x60, +0x93,0xe4,0x93,0xa, 0xb, 0x7e,0x73,0x2a,0x90,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a, +0x8d,0xa, 0x3a,0xad,0x13,0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e, +0x4, 0x7e,0x7f,0x39,0xac,0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49, +0xf4,0x13,0x8e,0x9d,0xf, 0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a, +0x35,0x34,0x7e,0xf, 0x38,0x58,0x7e,0x18,0x25,0xb6,0x2, 0x65,0xaa,0x6c,0xaa,0x80, +0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x13,0xc6,0x49,0x32,0x13,0x8e,0xbd,0x31, +0x28,0x9, 0x2e,0x24,0x13,0x8e,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x2a, +0x8d,0xbc,0xba,0x38,0xdc,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9, +0xc5,0xea,0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x61,0x7e,0x73, +0x39,0xd8,0xbe,0x71,0x61,0x38,0x2, 0xd2,0x1b,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9, +0x34,0xe5,0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9, +0x33,0xe5,0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5, +0x3, 0xa9,0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8, +0x22,0x7e,0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55, +0x50,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44, +0x79,0x30,0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc, +0x79,0x30,0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c, +0x79,0x30,0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe, +0xb0,0x8, 0x50,0x3, 0x12,0xa4,0xaa,0xa9,0xd0,0xce,0xa9,0xc0,0xc9,0xd2,0x2, 0x12, +0x3b,0xe9,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75,0xc2,0xc, 0xd2,0x0, 0x12,0xa4,0xb3, +0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1,0x22,0xa, 0x5b,0x2e,0x54,0x0, 0x8, +0xf5,0xcc,0x22,0xa2,0x0, 0xa9,0x97,0xc1,0xa2,0x0, 0xa9,0x97,0xc2,0x22,0xa9,0xd0, +0xce,0xa2,0x0, 0xa9,0x95,0xc9,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12,0x7, 0xfb,0x7c, +0x7b,0x12,0x3a,0xb5,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e,0x24,0x0, 0xef, +0x7e,0xf, 0x39,0x93,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e,0xf, 0x39,0x93, +0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x39,0x93,0x79,0x20,0x0, 0x90, +0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x39,0x93,0x79,0x30,0x0, 0x86, +0x7e,0x34,0x29,0x90,0x7e,0xf, 0x39,0x93,0x79,0x30,0x0, 0x8a,0x7e,0x34,0x6a,0xd1, +0x7e,0xf, 0x39,0x93,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e,0xf, 0x39,0x93, +0x79,0x30,0x0, 0x8e,0x22,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86, +0xa9,0xc2,0xeb,0xa9,0xd2,0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, +0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7, +0x0, 0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0, +0xf7,0xd2,0xf8,0xa9,0xc1,0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7, +0xc2,0xbe,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e,0x37,0x39,0xd6,0xb, 0x34, +0x7a,0x37,0x39,0xd6,0xbe,0x34,0xff,0x0, 0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37, +0x39,0xd6,0x22,0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5, +0x1, 0x6c,0xaa,0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0x65,0xa0,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xed,0xc2,0xc9,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24, +0xbd,0x32,0x38,0xe9,0x22,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c,0x11,0x80,0x46, +0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, 0x20,0xa, 0x33, +0x9d,0x32,0x12,0x17,0x85,0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74,0x26,0xfa,0xa, +0x27,0xa, 0x32,0x9d,0x32,0x12,0x17,0x85,0x7c,0x97,0xbe,0x90,0x1, 0x18,0x8, 0xbe, +0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe,0x0, 0x2, 0x18, +0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18,0xb2,0x22,0x7f, +0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xa6,0xa9,0xb, 0x7a,0x20,0x2d,0x25,0x1b, +0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x1e,0x34, +0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d,0x53,0x7c,0xab, +0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x2d,0x25,0x79, +0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x51,0x7f,0x1e,0x34, +0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0xa7,0x27,0x7e,0xa3,0x2a,0x92, +0x7e,0x63,0x2a,0x93,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x72,0x2a,0xfb,0xbe,0x70, +0x1c,0x50,0x11,0xa, 0x27,0x12,0x57,0xdb,0x7c,0x7b,0x7e,0xb3,0x2b,0x1a,0xa, 0x27, +0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xde,0x6c,0xee,0x80,0x17,0xa, 0x3e, +0x9, 0x73,0x2a,0xd8,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2b,0x1a,0xa, 0x27,0x19, +0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e,0x30,0xe, 0xac,0x3e, +0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xf8,0xb, 0xe0,0xbe, +0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, 0x17,0x53, +0x7c,0xab,0x9f,0x11,0x30,0x0, 0x22,0x6c,0x99,0x80,0x1a,0xa, 0xf9,0x2d,0xf1,0x7d, +0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77,0x14,0x78,0xfb,0x4d, +0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8,0x90,0x60,0x51,0xe4, +0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0xa7,0xe6,0x7e,0x8, 0x1f,0x3c,0x12,0xa7, +0xee,0xd2,0x0, 0x7e,0x8, 0x2a,0xfb,0x7c,0xbf,0x12,0xa7,0x30,0x7e,0x8, 0x1f,0x34, +0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32,0x7a,0x37,0x1f,0x5e, +0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, 0x12,0xa9,0x45,0x50, +0x7, 0x12,0xa9,0x3c,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7,0x38,0xee,0x12,0xa7, +0xd3,0xe4,0x12,0xa7,0xdb,0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a,0x37,0x1f,0x5c,0x7a, +0x37,0x1f,0x5e,0x12,0xa7,0xd3,0x74,0x1, 0x12,0xa7,0xdb,0x74,0x1, 0x12,0xc, 0x9b, +0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12,0xc, 0x9b,0xa9,0xd6, +0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x17,0x53,0x7e,0x34, +0x0, 0x1c,0x74,0x3f,0x2, 0x17,0x53,0x7c,0x57,0x7c,0xab,0x6c,0x77,0x80,0x4b,0xa, +0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46,0x2e,0x44,0x16,0xe8,0x12, +0xa8,0xb6,0x7c,0x6b,0xbe,0x60,0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60, +0x5, 0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4, +0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5, +0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xb1,0x6c,0x77, +0x80,0x58,0xa, 0x27,0x7f,0x70,0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11, +0x12,0xa8,0xaf,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80, +0x2f,0xbe,0x60,0x1b,0x38,0x16,0x9e,0x60,0xe, 0x12,0xa8,0xaf,0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12, +0xa8,0xaf,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, +0xb, 0x7a,0x20,0x4d,0x24,0x1b,0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e, +0x44,0x0, 0x1, 0x7c,0xb6,0x22,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x22,0x7c, +0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa,0x80, +0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38,0x5, +0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e, +0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0x8, 0x1f,0x34,0x12,0xa7,0xee,0x6c,0x77,0x80, +0xe, 0x12,0xa9,0x45,0x50,0x7, 0x12,0xa9,0x3c,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e, +0x53,0x2a,0x8d,0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12, +0x11,0x38,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52, +0x2b,0x63,0xa, 0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xfb,0xbe,0x60,0x1c,0x22,0x7e, +0x43,0x2a,0x8d,0x7e,0x53,0x2a,0x8c,0xac,0x54,0x7e,0x17,0x28,0xa1,0x12,0x8f,0xc3, +0x6d,0x0, 0x80,0x37,0x7d,0x40,0x3e,0x44,0x7e,0x7f,0x39,0xac,0x2d,0xf4,0xb, 0x7a, +0x30,0xbd,0x13,0x58,0x10,0x7d,0xf4,0x2e,0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51, +0x1b,0xf8,0x50,0x80,0x14,0x6d,0x55,0x9d,0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, +0xa, 0xb, 0x48,0x50,0x2d,0x51,0x1b,0x48,0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x5, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x7, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x93,0xa, 0xb, 0x7e,0xb3,0x2a,0x92,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0xe4,0x7a,0xb3,0x39,0xb0,0x22,0x7e,0xb3,0x38,0x38,0x70, +0x6, 0x12,0xaa,0x64,0x2, 0xaa,0x25,0x12,0xaa,0x6a,0x12,0xaf,0x54,0x50,0xa, 0x12, +0xad,0xc2,0x7c,0x3b,0x12,0xaa,0x64,0x80,0x5, 0x12,0xac,0x67,0x7c,0x3b,0x4c,0x33, +0x68,0x11,0x7c,0xb3,0x12,0xae,0xd1,0x60,0xa, 0x7a,0x33,0x38,0x3b,0x74,0x1, 0x7a, +0xb3,0x2a,0x26,0x22,0xe4,0x7a,0xb3,0x2f,0x9f,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x20, +0x7e,0xb3,0x2a,0x21,0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47, +0x28,0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x9f,0x4c,0xff, +0x68,0x17,0x7e,0x47,0x2b,0xd6,0x4d,0x44,0x78,0xf, 0x12,0xaf,0x4d,0x74,0x1, 0x7a, +0xb3,0x39,0x58,0x7a,0xb3,0x38,0xd, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33, +0x7e,0x37,0x2b,0xd6,0x7a,0x37,0x2f,0xa1,0x7e,0xb3,0x2f,0x9f,0xb4,0x3, 0x1f,0x7e, +0x37,0x2b,0xd6,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x9f,0x7e, +0x37,0x2f,0xb7,0x7e,0x27,0x2f,0xb9,0x12,0xab,0x7b,0x61,0x74,0x80,0x0, 0x12,0xaf, +0x5f,0x61,0x74,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70, +0x57,0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xae,0x6c,0x12,0xab,0x77, +0x74,0x1, 0x7a,0xb3,0x2f,0x9f,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f, +0xa7,0x9e,0x27,0x2f,0xaf,0x7e,0x14,0x62,0xa1,0x12,0xac,0x26,0xbd,0x23,0x38,0x13, +0x7e,0x27,0x2f,0xb5,0x9e,0x27,0x2f,0xad,0x7e,0x14,0x62,0xa3,0x12,0xac,0x26,0xbd, +0x23,0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x9f,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, +0x7a,0xc7,0x2f,0xb7,0x7a,0xd7,0x2f,0xb9,0x7e,0xb3,0x2f,0x9f,0x60,0x26,0x7d,0x3c, +0x7d,0x2d,0x7e,0x17,0x2b,0xda,0x7e,0x7, 0x2b,0xdc,0x12,0xae,0x50,0xa, 0x2b,0x7e, +0x73,0x2f,0x9e,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0xab,0x77,0x7a,0xc7,0x2b,0xda, +0x7a,0xd7,0x2b,0xdc,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d, +0x24,0x12,0xaf,0x6b,0x7d,0x31,0x12,0xad,0xdb,0x2, 0xab,0x8c,0x7e,0x3, 0x2f,0xc7, +0xbe,0x0, 0xf0,0x50,0x2, 0x81,0x25,0x81,0x1a,0x6c,0x99,0x7e,0xb3,0x2f,0x9e,0xbe, +0xb0,0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x9e,0x7e,0x1f,0x2b,0xde,0x7a,0x1f,0x1f, +0x34,0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xde,0x49,0x25, +0x2b,0xe0,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0xae,0x50,0x7c,0x1b,0x7e, +0x3, 0x2f,0x9e,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34, +0x2b,0xde,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x15,0xfc,0x7e,0x34,0x1f,0x34,0x7e, +0x30,0x4, 0xac,0x39,0x2e,0x14,0x2b,0xde,0x74,0x4, 0x12,0x15,0xfc,0xb, 0x80,0x7e, +0x3, 0x2f,0xc7,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f, +0xc7,0x7e,0x3, 0x2f,0x9e,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xc7,0xbe,0x0, +0xec,0x40,0x2, 0x61,0x99,0x22,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0x13, +0x7e,0x54,0x62,0x6f,0x12,0xac,0x5d,0x50,0x21,0x7e,0x54,0x62,0x71,0x12,0xac,0x5d, +0x28,0x18,0x7e,0x14,0x62,0x73,0x12,0xac,0x26,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62, +0x75,0x12,0xac,0x26,0xbd,0x32,0x28,0x2, 0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, +0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d, +0xed,0x7d,0xfd,0x7e,0xd3,0x2a,0x20,0x7e,0xe3,0x2a,0x21,0x7e,0xb3,0x39,0xb0,0x60, +0x11,0x7e,0xc7,0x39,0xb9,0x4d,0xcc,0x78,0x2, 0xa1,0x5b,0xbe,0xd0,0x1, 0x28,0x2, +0xa1,0x5b,0xbe,0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xa1,0x5b,0x7e,0xe7, +0x29,0x8, 0x7e,0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0xac,0x2e,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x5b,0x7e,0xa3,0x39,0xb0,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54, +0x14,0x68,0x23,0x14,0x78,0x2, 0xa1,0x58,0xb, 0xb2,0x68,0x2, 0xa1,0x5b,0xbe,0xd0, +0x1, 0x68,0x2, 0xa1,0x6a,0x4c,0xee,0x68,0x2, 0xa1,0x6a,0x74,0x1, 0x7a,0xb3,0x39, +0xb0,0x12,0xad,0x79,0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74, +0x2, 0x7a,0xb3,0x39,0xb0,0x7e,0x34,0x62,0x7b,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x39, +0xb0,0x7e,0x34,0x62,0x7f,0x80,0x48,0x12,0xad,0x82,0x90,0x62,0x6e,0x12,0xad,0x8b, +0x68,0x49,0x80,0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xad,0x82, +0x7e,0x34,0x62,0x77,0x12,0xad,0x71,0x7e,0x14,0x62,0x7b,0x7e,0x4, 0x0, 0xff,0xb, +0xa, 0xc0,0x9d,0xc3,0xbe,0xc7,0x39,0xb9,0x40,0x21,0x90,0x62,0x6d,0x12,0xad,0x8b, +0x68,0x19,0x12,0xad,0x79,0x74,0x3, 0x7a,0xb3,0x39,0xb0,0x7e,0x34,0x62,0x7b,0x12, +0xad,0x71,0x7a,0x37,0x39,0xb9,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x39,0xb0, +0x6d,0x33,0x7a,0x37,0x39,0xb9,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8, +0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7a,0xe7,0x39,0xb1,0x7a,0xf7,0x39, +0xb3,0x22,0x7a,0xe7,0x39,0xb5,0x7a,0xf7,0x39,0xb7,0x22,0xe4,0x93,0xa, 0x3b,0x12, +0xad,0x97,0xa, 0xdb,0x4d,0xdd,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x7e, +0x37,0x39,0xb5,0x9e,0x37,0x39,0xb1,0x12,0x17,0x85,0xbd,0x31,0x38,0x12,0x7e,0x37, +0x39,0xb7,0x9e,0x37,0x39,0xb3,0x12,0x17,0x85,0xbd,0x31,0x38,0x3, 0x74,0x1, 0x22, +0xe4,0x22,0x12,0xae,0x47,0x7a,0x37,0x2f,0xbb,0x12,0xad,0xd2,0x7a,0x37,0x2f,0xbd, +0xe4,0x22,0x7e,0x37,0x2f,0xb5,0x9e,0x37,0x2f,0xad,0x22,0x7e,0x17,0x2f,0xaf,0xbd, +0x13,0x28,0xa, 0x7a,0x37,0x2f,0xaf,0x7a,0x27,0x2f,0xb1,0x80,0x10,0x7e,0x17,0x2f, +0xa7,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0xa7,0x7a,0x27,0x2f,0xa9,0x7e,0x17,0x2f, +0xad,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0xad,0x7a,0x37,0x2f,0xab,0x80,0x10,0x7e, +0x17,0x2f,0xb5,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0xb5,0x7a,0x37,0x2f,0xb3,0x7e, +0xb3,0x2f,0xc7,0xb4,0xa, 0xf, 0x12,0xae,0x47,0x7a,0x37,0x2f,0xbf,0x12,0xad,0xd2, +0x7a,0x37,0x2f,0xc1,0x22,0xb4,0x14,0xe, 0x12,0xae,0x47,0x7a,0x37,0x2f,0xc3,0x12, +0xad,0xd2,0x7a,0x37,0x2f,0xc5,0x22,0x7e,0x37,0x2f,0xa7,0x9e,0x37,0x2f,0xaf,0x22, +0x7d,0x51,0x7d,0x12,0x9d,0x35,0x12,0x17,0x85,0x7c,0xa7,0x7d,0x31,0x9d,0x30,0x12, +0x17,0x85,0x7c,0xb7,0xbc,0xba,0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0xf2,0x7d,0xe3, +0x7e,0x8, 0x2f,0x9f,0x7e,0x34,0x0, 0x28,0xe4,0x12,0x17,0x53,0x7e,0x8, 0x2b,0xde, +0x7e,0x34,0x3, 0xc0,0x12,0x17,0x53,0x7a,0xb3,0x38,0x3b,0x7e,0x34,0x62,0xa5,0x12, +0xad,0x71,0x7a,0x37,0x2b,0xd6,0x7a,0xe7,0x2f,0xa3,0x7a,0xf7,0x2f,0xa5,0x7a,0xe7, +0x2f,0xa7,0x7a,0xe7,0x2f,0xab,0x7a,0xe7,0x2f,0xaf,0x7a,0xe7,0x2f,0xb3,0x7a,0xf7, +0x2f,0xa9,0x7a,0xf7,0x2f,0xad,0x7a,0xf7,0x2f,0xb1,0x7a,0xf7,0x2f,0xb5,0x7a,0xe7, +0x2b,0xda,0x7a,0xf7,0x2b,0xdc,0x7a,0xb3,0x2f,0xc7,0x74,0x2, 0x7a,0xb3,0x2f,0x9e, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x39,0xce,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x38,0x39,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xaf,0x44, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x39,0xcf,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x38,0x3a,0x80,0x1a,0x12,0xaf,0x44,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x39,0xce,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x38,0x3b,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x6d,0x33,0x7a, +0x37,0x39,0x56,0x22,0x7e,0xb3,0x2f,0x9f,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x74, +0xfe,0x7a,0xb3,0x38,0x3b,0xe4,0x7a,0xb3,0x2f,0x9f,0x22,0x7e,0xa3,0x2f,0xc7,0xbe, +0xa0,0xf0,0x50,0x1b,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xde,0x7e,0xa3,0x2f,0xc7,0x74, +0x4, 0xa4,0x59,0x25,0x2b,0xe0,0x7e,0xb3,0x2f,0xc7,0x4, 0x7a,0xb3,0x2f,0xc7,0x22, +0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x28,0xa1,0x7e,0x34,0x0, 0x2, 0x7a,0x37,0x28,0xa3, +0x22,0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0xf5,0x26,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x19,0xb4,0x1f,0x50,0x22,0xa, 0x47,0x7f,0x70,0x2d, +0xf4,0x7e,0x7b,0x60,0x22,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x26,0xfa,0x22,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22, +0x7e,0x50,0x9, 0xac,0x5a,0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f, +0x6, 0x2d,0x12,0x22,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7f,0x6, 0x2d,0x12, +0x79,0x40,0x0, 0x28,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x34,0x8a,0x22,0x7e,0x73, +0x38,0xd5,0x7a,0x73,0x2b,0x3f,0x22,0x7d,0x2e,0x12,0x15,0x29,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x7e,0x34,0x0, 0xc8,0x2, 0x1a,0x15,0x7e,0x50, +0x2, 0xac,0x5a,0x3e,0x24,0x22,0xb0,0x36,0x4f,0xc9,0xa0,0x5f,0xb, 0x51, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_ili.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_ili.txt new file mode 100644 index 0000000000000..e9262ef468551 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_ili.txt @@ -0,0 +1,3091 @@ +0x2, 0x1f,0xd2,0x2, 0xb5,0x8a,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x42,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x70,0x2d,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x7d,0x45,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x32,0x2, 0x7d,0xa4,0xe4,0x2, 0x29,0xfa,0x22,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xa2,0x13,0x22,0x32,0xff,0x2, 0x0, 0x69,0x2, 0x31, +0xb3,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x38,0xc8, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x38,0xd8,0x7e,0x73,0x38,0xd8,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x7f,0x5, 0x7e,0x1f,0x38,0xc8,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x38,0xc8,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x38,0xcc,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x38,0xd4,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x38,0xd2,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf7,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0xb7,0x9d,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d,0xe2,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xb2,0x61,0x3f,0x7e,0x34,0x1d,0x96,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xc6,0x61,0x3f,0x7e,0x34,0x1e,0xa, 0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d, +0xf1,0x61,0x3f,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x69,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x6a,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xc8,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x38,0xc8,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x20,0xde,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x38,0xc0,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf7,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x38,0xc0,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xb9,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x38,0xc8,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x39,0xd, 0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x86,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x39,0xd, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x39,0xd, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x39,0xd, 0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xf3,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xf3,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xc0,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x38,0xc8,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x38, +0xc8,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x38,0xc8,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x38,0xc8,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x38,0xc8,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x38, +0xc8,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x38,0xc8, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x38,0xc8,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x38,0xc8,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x38,0xc8,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xb9,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xb9,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xf3,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xf3,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x39, +0xd, 0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x38,0xc8, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x38,0xc8,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x39,0xd, 0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x39,0xd, 0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x39,0xd, 0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf7,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xf2,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf7,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf7,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x39, +0xd, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x39,0xd, 0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x39,0xd, 0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x58,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1e,0xeb,0x7d,0x1e,0x12,0x1f,0x5, 0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x38,0xc8,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf7,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xf2,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf7,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x7f,0x5, 0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x38,0xc0,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc8,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x38,0xd8,0x7e,0x1f,0x38,0xc0, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xf3,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x39,0xd, 0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x20,0x8f,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x20,0x90,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e, +0x1f,0x38,0xc0,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x38,0xc0,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x38,0xc8,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x6, 0xe, 0x15,0x1a,0x1f,0x26,0x2b,0x2d,0x2e,0x2f, +0x2c,0x2a,0x24,0x1f,0x1a,0x14,0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10,0x15,0x1c,0x22, +0x28,0x2d,0x34,0x39,0x3d,0x40,0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x11,0x16, +0x1c,0x23,0x2b,0x32,0x37,0x3c,0x40,0x45,0x4a,0x4d,0x4c,0x4b,0x4a,0x48,0x46,0x46, +0x45,0x45,0x44,0x44,0x43,0x44,0x45,0x78,0x65,0x55,0x2, 0xd, 0x14,0x1b,0x21,0x25, +0x2b,0x31,0x37,0x36,0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, +0x10,0x18,0x1e,0x23,0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40, +0x3f,0x3e,0x3d,0x3d,0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29, +0x27,0x1e,0x14,0x11,0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21, +0x2b,0x32,0x30,0x2a,0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, +0x10,0x19,0x23,0x2d,0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71, +0x50,0x55,0x28,0x12,0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39, +0x31,0x28,0x1e,0x15,0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32, +0x37,0x39,0x20,0x29,0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, +0x1, 0x0, 0x1, 0x5, 0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c, +0x34,0x31,0x26,0xcb,0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31, +0x2e,0x2d,0x35,0x3d,0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, +0x10,0x1b,0x24,0x2f,0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d, +0x28,0x31,0x34,0x2a,0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40, +0x47,0x47,0x44,0x3c,0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b, +0x22,0x2d,0x30,0x2e,0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, +0x0, 0x0, 0x3, 0xb, 0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26, +0x1b,0x14,0x1c,0x25,0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c, +0x25,0x30,0x38,0x40,0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c, +0x29,0x1e,0x14,0x13,0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39, +0x30,0x25,0x1b,0x10,0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a, +0x23,0x2f,0x33,0x29,0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, +0x2, 0x0, 0x1, 0x8, 0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e, +0x50,0x55,0x16,0x2b,0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36, +0x3b,0x3d,0x3b,0x37,0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33, +0x3d,0x3f,0x13,0x21,0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37, +0x2d,0x22,0x18,0xc, 0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38, +0x2e,0x2a,0x31,0x62,0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, +0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26, +0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b, +0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48, +0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x9, 0x17,0x1d,0x26,0x2e,0x37, +0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, +0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30,0x2f,0x2c,0x26,0x1e, +0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c,0x32,0x3a,0x41,0x48, +0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c,0x33,0x55,0x26,0x1c, +0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18,0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, +0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44,0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49, +0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f,0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54, +0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c, +0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22,0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c, +0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a,0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32, +0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, +0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22, +0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, 0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39, +0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68,0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70, +0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80,0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10, +0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, +0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39,0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24, +0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50,0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff, +0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a,0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, +0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22, +0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33,0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29, +0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d,0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26, +0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10,0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b, +0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19, +0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22,0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39, +0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34,0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, +0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18,0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37, +0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e, +0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21, +0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c, +0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, +0x0, 0x2, 0x5, 0x9, 0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f, +0x3d,0x38,0x30,0x27,0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36, +0x3f,0x49,0x53,0x5c,0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b, +0x15,0xb, 0x4, 0x0, 0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c, +0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, +0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, +0x8, 0xe, 0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58, +0x51,0x48,0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf, +0x30,0x55,0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28, +0x30,0x38,0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16, +0xf, 0xc, 0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, +0x3, 0xa, 0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a, +0x58,0x57,0xc6,0x55,0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38, +0x3c,0x3e,0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, +0xd, 0x17,0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57, +0x4f,0x47,0x40,0x38,0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, +0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f, +0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22, +0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25, +0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f, +0x3d,0x3a,0x36,0x2e,0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0x9, 0xe, 0x14,0x1c,0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a, +0x10,0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47, +0x4f,0x56,0x5a,0x5b,0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9, +0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e, +0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25, +0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25, +0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d, +0x3a,0x34,0x2d,0x27,0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, +0xa, 0xf, 0x15,0x1b,0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11, +0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36, +0x3c,0x42,0x47,0x48,0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29, +0x22,0x1b,0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c, +0x24,0x2a,0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, +0x4, 0x7, 0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b, +0x38,0x31,0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35, +0x3d,0x45,0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17, +0x11,0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6, +0x30,0x55,0xa, 0x5, 0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3c,0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, +0x1, 0x2, 0x35,0x46,0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37, +0x2e,0x25,0x1e,0x16,0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39, +0x41,0x45,0xf0,0xbc,0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28, +0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, +0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d, +0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19, +0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36, +0x2f,0x27,0x21,0x19,0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, +0x16,0x1f,0x26,0x2d,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d, +0x56,0x59,0x5a,0x58,0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, +0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38, +0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40, +0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3, +0x30,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, +0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f, +0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40, +0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32, +0x39,0x3e,0x7, 0x90,0x30,0x55,0x39,0x2b,0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, +0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b,0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f, +0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24, +0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b,0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65, +0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a,0x46,0x55,0x0, 0x1, 0x3, 0x5, 0x7, 0x8, +0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22,0x24,0x27,0x2a,0x2c, +0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, 0x14,0x1b,0x23,0x28, +0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53,0x4e,0x47,0x40,0x3b, +0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x1f,0x7, 0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x1f,0x7, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0x13,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x4c,0x0, 0xc2,0x14,0x75,0x4d,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x4e,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x21,0x10,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x36,0x72,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xd0,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33,0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0x9b,0x0, 0x0, 0x2, 0x37,0xed,0x0, 0x0, 0x0, 0x2, 0x37, +0xef,0x0, 0x0, 0x0, 0x1, 0x37,0xf1,0x0, 0x0, 0x1, 0x34,0x4f,0x0, 0x0, 0x1, 0x39, +0x11,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x2, 0x34,0x9f,0x0, 0x0, 0x0, 0x1, 0x34, +0xa1,0x0, 0x0, 0x1, 0x34,0xaf,0x0, 0x0, 0x1, 0x34,0xc4,0x0, 0x0, 0x1, 0x34,0xc5, +0x0, 0x0, 0x1, 0x35,0x3e,0x0, 0x0, 0x1, 0x35,0x3f,0x1, 0x0, 0x1, 0x35,0x40,0x0, +0x0, 0x3c,0x35,0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x36,0x61,0x0, 0x0, 0x1, 0x36,0x62,0x0, 0x0, 0x1, 0x36,0x63,0x0, 0x0, +0x1, 0x35,0xe2,0x1, 0x0, 0x2, 0x35,0xe5,0x0, 0x0, 0x0, 0x1, 0x2f,0xa9,0x0, 0x0, +0x1, 0x2f,0xaa,0x0, 0x0, 0x1, 0x2f,0xab,0x0, 0x0, 0x1, 0x2f,0xac,0x0, 0x0, 0x1, +0x36,0x66,0x1, 0x0, 0x1, 0x36,0xe0,0x0, 0x0, 0x1, 0x39,0x12,0x0, 0x0, 0x6, 0x38, +0xfb,0x3f,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x39,0x1, 0x24,0x0, 0x1, 0x39,0x8, +0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x1, 0x39,0xb, 0x0, +0x0, 0x1, 0x39,0xc, 0x0, 0x0, 0x1, 0x0, 0x4f,0x0, 0x0, 0x1, 0x3, 0xec,0x0, 0x0, +0x4, 0x37,0x40,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39,0x3, +0x0, 0x0, 0x2, 0x39,0x4, 0x0, 0x0, 0x0, 0x1, 0x39,0x6, 0x64,0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x39,0x13,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x2, 0x2b,0xb9,0x2b,0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, +0x0, 0x1, 0x38,0xdd,0x0, 0x0, 0x1, 0x38,0x3e,0xff,0x0, 0x1, 0x38,0x3f,0x0, 0x0, +0x1, 0x38,0x40,0x0, 0x0, 0x1, 0x38,0x41,0x40,0x0, 0x1, 0x38,0x42,0x40,0x0, 0x4, +0x38,0xf3,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf7,0x0, 0x0, 0x64,0x0, 0x0, 0x4, +0x38,0xc0,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x38,0xc4,0x0, 0x0, 0x68,0xc0,0x0, 0x4, +0x38,0xc8,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x38,0xd9,0x0, 0x0, 0x40,0x0, 0x0, 0x4, +0x39,0xd, 0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58, +0x0, 0xc, 0x1, 0x5e,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78, +0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, +0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, +0x0, 0x1e,0x12,0x3f,0x13,0x12,0x69,0x8e,0x12,0x23,0xb, 0x12,0x28,0x48,0x12,0x8d, +0xec,0x2, 0x23,0x4, 0x74,0x1, 0x7a,0xb3,0x36,0x6a,0x22,0x12,0x73,0x71,0x12,0x23, +0x40,0x2, 0x23,0x14,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x1d,0x7d,0x43,0x7e, +0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34, +0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22, +0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x23,0x1d,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, +0x7a,0x2, 0x23,0x1d,0x7e,0x34,0x60,0xa3,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x46, +0xa2,0x12,0x73,0x28,0x12,0x3f,0x13,0x12,0x69,0x87,0x12,0xc0,0x5, 0x12,0x23,0xb, +0x12,0x28,0x48,0x12,0x68,0x23,0x12,0x8d,0xec,0x2, 0x23,0x4, 0x7e,0x34,0x61,0x4f, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x7a,0x37,0x28, +0x95,0x7e,0x34,0x61,0xba,0x12,0x23,0x9e,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8, +0x12,0x23,0x9e,0x7a,0x37,0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0x9e,0x7a,0x37, +0x28,0x9b,0x7e,0x34,0x61,0xbc,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61, +0xbe,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0x9e,0x12, +0xc0,0x87,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x20,0xde,0x12,0x25,0xc3,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0x9e, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0x9e,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x3c,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0xb7,0x9d,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x36, +0xe1,0x7e,0x34,0x61,0x51,0x12,0x23,0x9e,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x36,0xe2, +0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe3,0x7e,0x34, +0x61,0x57,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe4,0x7e,0x34,0x61,0x59, +0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe5,0x7e,0x34,0x61,0x5b,0x12,0x23, +0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe6,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x36,0xe7,0x12,0x20,0xb9,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x37,0x12,0xe5,0x28,0x7a,0xb3,0x37,0x1, 0x22,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a,0x4d,0x90,0x60, +0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0xc0, +0x7e,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93, +0x7a,0xb3,0x2a,0x59,0x12,0x23,0x7c,0x12,0xc0,0x35,0x7e,0x34,0x62,0x12,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60, +0xa0,0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3, +0x16,0x92,0x22,0x12,0x23,0x7c,0x12,0xc0,0x35,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e, +0x12,0xc0,0x7e,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x37,0xa0,0xbe,0xf0,0x5, 0x78, +0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78, +0x13,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12,0x26,0x5b,0xe4,0x7a,0xb3,0x2b,0x2, 0x12, +0x7a,0x2d,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x49,0xd, 0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x69,0xab,0x12,0xc0,0xd7, +0x80,0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12,0x26,0x5b, +0x12,0x2f,0xf4,0x50,0xfb,0x12,0x88,0x17,0x12,0x69,0x97,0x12,0x28,0x48,0x74,0x2, +0x7a,0xb3,0x37,0xa0,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3, +0xed,0x7a,0x37,0x3, 0xef,0x22,0x7e,0xb3,0x37,0x6, 0x14,0x68,0x60,0x14,0x78,0x2, +0xe1,0x10,0x14,0x68,0x73,0x24,0x3, 0x68,0x2, 0xe1,0x5, 0x12,0xc1,0xf, 0x38,0x8, +0x30,0x10,0xf, 0x12,0xc1,0x7, 0x68,0xa, 0x12,0x63,0x2, 0xe4,0x7a,0xb3,0x38,0x85, +0x80,0x7e,0x7e,0xb3,0x36,0xe7,0x30,0xe0,0x77,0x7e,0x73,0x36,0xe8,0xa, 0x27,0x7e, +0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64, +0x12,0x23,0x9e,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x83,0x50,0x53,0x12,0x63,0x2, +0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x38,0x87,0x80,0x43,0x12,0xc1,0xf, +0x28,0x39,0xe4,0x7a,0xb3,0x37,0x6, 0x7e,0xb3,0x38,0x85,0xb4,0x1, 0x6, 0x74,0x1, +0x7a,0xb3,0x37,0x6, 0xd2,0x17,0x80,0x23,0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x45,0x73,0x12,0x23,0x54,0xe4,0x7a,0xb3,0x37,0x6, 0x7a,0xb3,0x39, +0x7, 0xd2,0x17,0x80,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x39,0x7, +0x12,0x90,0xd2,0x2, 0x27,0x16,0xca,0xd8,0xca,0x79,0x7e,0xb3,0x37,0x6, 0xb4,0x1, +0x2, 0x80,0x3, 0x2, 0x28,0x38,0x6c,0xdd,0x6c,0xff,0x12,0x91,0x11,0x7d,0xf3,0x12, +0x2f,0xf4,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x38,0x86,0x12,0x3d,0xac,0x12,0x13,0xc7, +0x12,0x0, 0x1e,0x74,0xa, 0x12,0x45,0x15,0x12,0xc0,0xbd,0x7e,0xe7,0x2b,0xd, 0x7a, +0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3,0x2a,0xfa,0x7e,0xe7,0x2b,0xd, +0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3,0x2a,0xfa,0x12,0x7b,0xd0,0x7c, +0x7b,0x74,0x6, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x1e,0xb9,0x7d,0x23,0x7d,0x3f, +0x12,0x25,0x3c,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12,0x4e,0xe0,0x12,0x26,0x57,0x7e, +0xb3,0x37,0x31,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, 0x74,0xa, 0x12,0x91,0x5d,0x12, +0x4f,0xaf,0x80,0xf, 0x80,0x7, 0x12,0x45,0xcf,0xe4,0x12,0x46,0x7, 0x20,0x93,0xf6, +0x12,0x45,0x9f,0x30,0x18,0xf7,0x30,0x17,0xf4,0xd2,0x4, 0x12,0x45,0x5a,0xe4,0x12, +0x13,0xde,0xb, 0xd0,0x12,0x4c,0x83,0x12,0x91,0x76,0x7e,0xa3,0x38,0x85,0x4c,0xaa, +0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x86,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x31, +0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x85,0x12,0x28,0x3d,0x78,0x18,0x7e,0xb3,0x38,0x85, +0x60,0x12,0xe4,0x7a,0xb3,0x38,0x85,0x7a,0xb3,0x2a,0x2, 0x7a,0xb3,0x2a,0x3, 0x7e, +0xf0,0x1, 0x80,0x1d,0x12,0x28,0x3d,0x68,0x10,0x7e,0xb3,0x38,0x85,0x70,0xa, 0x7e, +0xf0,0x1, 0xe4,0x7a,0xb3,0x37,0x6, 0x80,0x8, 0xbe,0xd0,0x32,0x50,0x3, 0x2, 0x27, +0x8c,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a,0x37,0x2b,0xd, 0x7a,0xe3,0x2a, +0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x48,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x38, +0xf2,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34, +0x39,0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34, +0x3a,0x22,0xca,0x3b,0x12,0x2f,0xf4,0x50,0xfb,0x7e,0xf3,0x2b,0xf, 0x7c,0xbf,0x12, +0xb3,0xd2,0x12,0xb3,0xe9,0x7e,0xb3,0x2b,0x1f,0xf5,0x28,0x7e,0xb3,0x2b,0x20,0xf5, +0x29,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0xf, 0x12,0x8d,0x6c,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x28,0x48,0xc3,0x21,0x6c,0x12,0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x7, 0x12,0xab,0xfd,0x7a,0x37,0x37,0xe3,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x69,0x8e,0x12,0xab,0xeb,0x7e,0xc3,0x3, 0xec,0x12,0x6e,0x31, +0xe4,0x12,0x13,0xde,0x12,0x28,0x48,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x2a,0x7e,0x18, +0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x7a,0xc8,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x2a, +0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x7a,0xc8,0x7e,0xd3,0x2b,0x1f,0x7e, +0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5,0x29,0x12,0x6e,0x8b,0x50,0x5, +0x7c,0xbc,0x12,0xb3,0x2a,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d, +0x10,0x12,0x6a,0xd4,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3,0x2b,0x20,0x7c,0xbf,0x12,0x86, +0xf8,0x12,0xa9,0xf5,0x7e,0xb3,0x39,0x7, 0x4, 0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39, +0x7, 0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x7, 0x7e,0xb3,0x16,0x90, +0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e, +0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, 0x37,0x2d,0x32,0x22,0x12,0x48, +0x7, 0x7e,0xb3,0x37,0x8, 0xb4,0x3, 0x6c,0x12,0xb6,0xb8,0x12,0x26,0x57,0x12,0x3f, +0xfb,0x7e,0xb3,0x37,0x9c,0x30,0xe7,0xe9,0x12,0x28,0x62,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18,0x12,0xab,0xb8,0x12,0x75,0xe9, +0x12,0xaf,0x66,0x12,0xa7,0xbd,0x12,0x88,0x5f,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x58,0x52,0x12,0x48,0x39,0x12,0x3a,0x9f,0x7e,0xb3,0x37,0x9c,0x54,0x7f,0x7a,0xb3, +0x37,0x9c,0x80,0x8d,0x12,0x2f,0xee,0x2, 0x0, 0x46,0x7a,0xb3,0x2b,0x2, 0x7a,0xb3, +0x2b,0x1e,0x22,0x12,0x52,0x6d,0x12,0x2b,0xfa,0x12,0x2b,0xfa,0x12,0x36,0xac,0x12, +0x9c,0xfd,0x12,0x9f,0xef,0x12,0x2b,0xfa,0x12,0x9b,0xe7,0x12,0x2b,0xfa,0x12,0xa0, +0xae,0x12,0x2b,0xfa,0x2, 0x2a,0x27,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c,0xdd, +0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x25,0x7e,0x8, 0x35,0xe9,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18,0x26, +0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0x41,0xfb, +0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9,0x9, +0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x36,0x74, +0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36, +0x26,0xa, 0x37,0x12,0x81,0xbf,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x25,0x12,0xa1,0x4b,0x2d,0x13,0xbd,0xc1,0x28, +0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68,0x39, +0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x2c,0x40, +0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34,0x74, +0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71,0x74, +0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe8,0xbc, +0x7e,0x28,0x2, 0x41,0x60,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x33,0x12,0x2f,0xe4,0xbe,0xb0,0xff,0x68, +0x2b,0x9, 0x73,0x1f,0x35,0x12,0x30,0x3, 0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54,0x0, +0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, 0x12, +0x2f,0xe4,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc,0xf9, +0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19,0x75, +0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19,0xa3, +0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe,0x38,0x8a,0x90, +0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e, +0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xfd,0x12,0x97,0x4, 0x7e,0x8, 0x36, +0x25,0x74,0xff,0x12,0x20,0xde,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b, +0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xf5, +0x7a,0xf3,0x35,0xe8,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb3,0x28, +0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee, +0x80,0x2e,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x25,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac, +0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa, +0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbf,0x12,0x2f,0xd0,0xb, 0xf0,0xb, 0xe0, +0x12,0x9c,0xf6,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c,0xba,0x7c,0x7d, +0x12,0x30,0x3, 0xb, 0x1a,0x30,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3, +0x2a,0x6f,0xf5,0x40,0x7e,0xb3,0x2a,0x70,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a, +0xb3,0x33,0xc2,0x7a,0xb3,0x33,0xc0,0x7a,0xb3,0x33,0xc1,0x7e,0x8, 0x1f,0x34,0x12, +0x2f,0xdd,0xe4,0x12,0x20,0xde,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x33,0xc3,0xe4, +0x12,0x20,0xde,0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa2,0x6c,0xcc,0xe1,0x91,0x12,0xc0, +0x61,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, +0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34,0x7c, +0xbd,0x14,0xbc,0xbc,0x78,0x2, 0xe1,0x97,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x88, +0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, 0xb3, +0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x28,0xe5, +0x27,0xa, 0x2b,0xe5,0x25,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0, +0x4, 0x40,0x2, 0xe1,0x86,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x86,0x85,0x25, +0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb0,0x3f,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x40,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83,0x80, +0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2b, +0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x40,0x2d,0x34, +0xbd,0x38,0x18,0x2, 0xe1,0x1d,0x75,0x30,0x1, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x1, +0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x4, +0x40,0x2, 0xe1,0x1d,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x1d,0x7c,0xbf,0x20, +0xe0,0x2, 0xe1,0x1d,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26,0xbe, +0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1, +0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25, +0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50, +0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29, +0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x5, +0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24,0xe5, +0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29, +0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x5, +0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24,0xe5, +0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85,0x2b, +0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x2c,0x40,0x7a,0x35,0x3e,0xe5,0x2a, +0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe,0xb1, +0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93,0x5, +0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0,0x5, +0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c,0x50, +0xad,0xe5,0x2c,0x12,0x2f,0xae,0xe5,0x2a,0x12,0x2f,0xa5,0xe5,0x2a,0x12,0x2f,0xae, +0xe5,0x2c,0x12,0x2f,0xa5,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20,0x5, +0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x42, +0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0xe5,0x42,0xa, 0x1b, +0x6d,0x0, 0x12,0x1e,0xeb,0x7f,0x21,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, +0x28,0x12,0x1e,0xfc,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23, +0x3e,0x24,0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe, +0xb0,0x0, 0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x33,0xbf,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f, +0x34,0xf5,0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x1f,0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0xc0,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x8e,0x7e,0x8, 0x1f,0x34,0x12,0xaf,0x71,0x7a,0xb3, +0x33,0xc2,0xda,0x3b,0x22,0x7e,0x71,0x2d,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7e,0x71, +0x2b,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7c,0x7b,0x12,0x77,0xf6,0x9, 0xa2,0x27,0x72, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x91,0x6d,0x5c,0xba,0x22, +0x7e,0x70,0x1, 0x2, 0x51,0x5f,0xa, 0x3b,0x9d,0x32,0x2, 0x21,0x0, 0x90,0x60,0x9a, +0x93,0xa, 0x3b,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x12,0x2f, +0xf4,0x50,0xfb,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x7c,0x5b,0x7e,0x43,0x28, +0x84,0xbe,0x40,0x1, 0x28,0x2, 0x21,0x14,0x7e,0xa3,0x2a,0x6e,0x7e,0x70,0x2, 0xac, +0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x30,0x3, +0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc,0x7c,0x9d,0x7e,0x83,0x2a, +0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc,0xa, 0xa8,0x1b,0xa5,0xa, +0x5f,0xbd,0x5a,0x58,0x2, 0x21,0x14,0xa, 0x59,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48, +0x4e,0x7c,0xb9,0x14,0x12,0x31,0x5a,0x50,0x46,0x7c,0xb9,0x14,0x12,0x31,0x17,0xb, +0x1a,0xe0,0x7d,0x3b,0x12,0x31,0x4c,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf, +0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12, +0x31,0x1e,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x31,0x20,0x1b,0x1a,0xa0,0xa, +0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9,0x4, 0x12,0x31,0x5a,0x50, +0x43,0x7c,0xb9,0x4, 0x12,0x31,0x17,0xb, 0x1a,0xe0,0x7d,0x3c,0x12,0x31,0x4c,0x8, +0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12, +0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x31,0x1e,0xb, 0x1a,0x50,0xbd,0x5a,0x8, +0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x31,0x27,0x7d,0xd3,0x7d,0x5d,0x3e,0x54, +0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43,0x2a,0x6e,0x90,0x60,0xab, +0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7c,0x75,0xac,0x74,0xa, +0x2a,0x2d,0x32,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40, +0x2d,0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xab,0x6c,0x77,0x80,0x12, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x51,0x4f,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22, +0xb, 0x70,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe5,0xc3,0x22,0x12,0x36,0x9c, +0x60,0x30,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1b,0x7c,0xb2,0x12, +0x31,0x27,0x7d,0x3, 0x12,0x36,0x94,0x49,0x55,0x38,0xe8,0x7d,0x40,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd4,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc0,0xb4,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0x41,0xdd,0x6c,0xcc,0x41,0xcf,0x12,0xc0,0x61,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xb, 0x7e,0xb3,0x36,0x71,0x70, +0x5, 0x12,0x32,0xe0,0x80,0x6, 0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x30, +0x19,0xd2,0x3, 0x12,0x32,0xe7,0x7e,0xb3,0x36,0xec,0xb4,0x1, 0x1b,0x7e,0xb3,0x2a, +0x3, 0xb4,0x1, 0x14,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xd, 0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x3, 0x12,0x32,0xe0,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x27,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, +0x2d,0x1b,0x24,0xe5,0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24, +0x0, 0x80,0x3c,0xe5,0x24,0xbc,0xbc,0x68,0x34,0x12,0x35,0xda,0x9, 0xa3,0x26,0xfa, +0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5,0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x2f,0xd6, +0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a,0xa, 0x2b,0xe5,0x28,0x12,0x2f,0xd6,0xbe, +0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12, +0x36,0xa4,0x38,0xbf,0xe5,0x27,0x7e,0x71,0x28,0x12,0xa0,0x94,0x50,0x8, 0x12,0x31, +0x7d,0x12,0x35,0xd3,0x80,0x8, 0x12,0x69,0x84,0x50,0x3, 0x12,0x32,0xe0,0xe5,0x25, +0x7e,0x71,0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x33,0x21,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x16,0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e, +0x34,0x27,0x78,0x6d,0x22,0x12,0x7f,0xc5,0x12,0x31,0x7d,0xb, 0xf0,0xb, 0xc0,0x7e, +0x73,0x28,0x84,0xbc,0x7c,0x28,0x2, 0x21,0xc9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22, +0x75,0x25,0x3, 0x75,0x26,0x3, 0x22,0x12,0x36,0x9c,0x60,0x34,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1f,0x7c,0xb2,0x12,0x31,0x27,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x36,0x94,0x59,0x35,0x38,0xe8,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72,0x38,0xd0, +0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x35, +0x80,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x35,0x80,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x30,0x3, 0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x90,0x50,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0xc7,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0xb1,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0xaf,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0xaf,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x40,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0xaf,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x35,0x65,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x35,0x65,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0xb8,0x88,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x35,0x56,0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x35,0x56,0x9f,0x51,0x12,0x35,0x5d,0x9f,0x41,0x12,0x35,0x5d,0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0xeb,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xdf,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x35,0x71,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x35,0x71,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1e,0xeb,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x0, 0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x7, 0x2e,0x18,0x0, 0x20,0x22, +0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34, +0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39, +0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39, +0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d, +0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba, +0xda,0xf8,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x74,0xf5,0x27,0x12,0x0, 0x66,0x50,0x2, 0xc1, +0x6f,0x6d,0x33,0x9e,0x37,0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x70,0x7e, +0xb3,0x16,0x92,0x70,0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x60,0x7e,0x77,0x2a,0x51, +0x7e,0x67,0x2a,0x53,0x75,0x24,0x0, 0x80,0x4e,0xe5,0x24,0x12,0x2f,0xb7,0x60,0x45, +0x12,0x35,0xda,0x12,0x9d,0x80,0xf5,0x26,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90, +0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26,0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26, +0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0xd, 0xe5,0x25,0xa, 0x2b,0xe5, +0x27,0x12,0x9b,0x18,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x51,0x5f,0x12, +0x35,0xda,0x12,0x37,0x9f,0x5, 0x24,0x12,0x36,0xa4,0x38,0xad,0x12,0xa6,0x5, 0xda, +0x3b,0x22,0x12,0x46,0xa2,0x12,0x24,0x9a,0x12,0x73,0x28,0x12,0x22,0xf2,0x7e,0xb3, +0x37,0x8, 0x24,0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x58,0xf0,0x80,0xef,0x12, +0x29,0x7e,0x80,0xea,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x90,0x60, +0xa7,0xe4,0x93,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x12,0xa5,0xee,0x12, +0x9b,0x49,0x12,0x35,0xe2,0x12,0x9a,0x38,0x2, 0x36,0xbb,0xca,0x3b,0x12,0x2b,0xfa, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x9, 0xe4,0x7a,0xb3,0x35, +0xe4,0x7a,0xb3,0x35,0x69,0x7e,0xb3,0x35,0xe2,0x70,0x69,0x6c,0x99,0x80,0x5d,0x74, +0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x9a,0xed, +0x40,0x48,0x6c,0xee,0x80,0x3c,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x6a,0x9, 0xc5, +0x35,0x6b,0xa, 0x28,0xa, 0x3d,0x12,0x37,0x67,0x78,0x25,0xa, 0x2f,0xa, 0x3c,0x12, +0x37,0x67,0x78,0x1c,0x7c,0xb9,0x12,0x37,0x6f,0x7e,0x14,0x62,0x2b,0x12,0x87,0xee, +0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x51,0x5f,0x7c,0xb8,0x7c,0x7f,0x12,0x37,0xa7, +0xb, 0xe0,0x7e,0x73,0x35,0xe4,0xbc,0x7e,0x38,0xbc,0xb, 0x90,0x7e,0x73,0x28,0x84, +0xbc,0x79,0x38,0x9b,0x7e,0x73,0x35,0x69,0x7a,0x73,0x35,0xe4,0xa, 0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x35,0xa6,0x7e,0x8, 0x35,0x6a,0x12,0x20,0xb9,0x1b,0xfd,0xe4, +0x7a,0xb3,0x35,0xe2,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x0, 0x4d,0x33,0x22,0x7c, +0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x2, 0x2c, +0x40,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0x99,0x6c,0x7f,0x71,0x7c,0xbf,0x12, +0x37,0x6f,0x12,0xa4,0xcf,0x7f,0x17,0x12,0x1f,0x58,0x7c,0xb7,0xda,0xf8,0x22,0x9, +0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c,0x6b,0x7e,0xa3,0x35,0x69,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x62,0x35,0xa6,0x19,0x72,0x35,0xa7,0x7c,0xba,0x4, 0x7a,0xb3,0x35, +0x69,0x22,0xca,0xf8,0x6c,0xff,0x80,0x18,0x7c,0xbf,0x12,0x37,0x6f,0xbe,0x37,0x2a, +0x5c,0x58,0xb, 0x12,0x51,0x5b,0x7e,0x70,0x2, 0xac,0x7f,0x12,0x37,0x9f,0xb, 0xf0, +0x12,0x52,0x66,0x38,0xe3,0x12,0x2b,0xfa,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe, +0xa0,0x34,0x38,0x3, 0x2, 0x38,0xfd,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x10, +0x41,0x1c,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d, +0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x31,0xce,0x7e,0x39,0xb0,0xbe,0xa0,0x37, +0x68,0x2, 0x41,0x1c,0x75,0x1a,0x36,0x41,0x1c,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0, +0x39,0x78,0x1b,0x7e,0xf3,0x37,0xc0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc0,0xbe,0xa0, +0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x1c,0xbe,0xa0, +0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xc2,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc2,0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b, +0x44,0x41,0x1c,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x1c,0xbe,0xa0, +0x5e,0x78,0x26,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, +0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x1c,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0, +0x3d,0x78,0x1b,0x7e,0xf3,0x37,0xc4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc4,0xbe,0xa0, +0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x1c,0xbe,0xa0, +0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xc6,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc6,0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a, +0x9d,0x41,0x1c,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x37,0x9c,0x41,0x1c,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e, +0xf3,0x37,0xe1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xe1,0xbe,0xa0,0x4f,0x78,0x3, 0x75, +0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x31,0xcc,0x7e,0x39,0xb0,0x41,0x1c,0xbe,0xa0,0x51, +0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, +0xff,0x7e,0xb3,0x37,0xec,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a, +0xb3,0x37,0xec,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0x1c,0xbe, +0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xb5,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xb5,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x3a, +0x1f,0x41,0x1c,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0x91,0x41,0x1c,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e,0xbe,0xa0, +0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0xa, 0x9, 0xb3,0x31,0xd4,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1a,0xf4,0x80,0x5c, +0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5, +0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10, +0x3e,0x14,0x7e,0x1f,0x31,0xd0,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, +0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80, +0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c, +0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, +0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e, +0x3, 0x2a,0x6d,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x60,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, +0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, +0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x62,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca, +0xf8,0x80,0x38,0x7c,0xbf,0x12,0x3a,0x1f,0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70, +0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x12,0x3a,0xde,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x3a,0xde,0x7e,0x73,0x2a, +0x6e,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3, +0x2a,0x6d,0x74,0x2, 0xa4,0x22,0x12,0x3f,0xaa,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x37,0xdc,0x7e,0x8, 0x25,0xee,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x3f,0x49,0x80,0x12, +0xca,0x39,0x7e,0x18,0x37,0xdc,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x3f,0x67,0x2, 0x3b,0x15,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0xca,0xf8, +0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x7d,0xab,0xd2,0x6, 0xa1,0xa0,0xa5, +0xbe,0x1, 0x3d,0x7a,0x73,0x37,0x9d,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5,0xbf,0xae, +0x4, 0xd2,0x7, 0xa1,0xa0,0xa5,0xbf,0xaa,0x5, 0x12,0xc0,0xce,0x80,0x1e,0xa5,0xbf, +0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xce,0x80,0x10,0xa5,0xbf,0xac,0x2, +0x80,0x2, 0xa1,0xa0,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xce,0x6d,0x33,0x81,0x1c, +0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x3d,0xa3,0xa5,0xbe,0x7, +0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xa0,0xa5,0xbe,0x8, 0x2, 0x80,0x2, 0xa1,0xa0, +0x12,0x7, 0xfb,0xa1,0xa0,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73,0x37,0xa6, +0xa1,0xa0,0xa5,0xbe,0xb, 0x8, 0x12,0x3d,0xa3,0x12,0x3f,0xc8,0xa1,0xa0,0xbe,0x60, +0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x38,0xbe,0x60,0x1e,0x40,0xd, 0xbe, +0x60,0x23,0x38,0x8, 0x12,0x3d,0xa5,0x43,0xc, 0x40,0xa1,0xa0,0xbe,0x60,0x15,0x40, +0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x3d,0xa5,0xd2,0x6, 0xa5,0xbe,0x15,0x2, 0x80, +0x2, 0xa1,0xa0,0x74,0x7, 0x7a,0xb3,0x37,0xa0,0xa1,0xa0,0xa5,0xbe,0x19,0x7, 0xe4, +0x7a,0xb3,0x37,0xb5,0xa1,0xa0,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c,0x38,0x2, +0xa1,0x38,0xa5,0xbe,0x2d,0x1b,0x12,0x3d,0xa5,0x20,0x7, 0x2, 0xa1,0xa0,0x7e,0x63, +0x37,0xc8,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35,0x8, 0xa1, +0xa0,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, 0xa1,0x38, +0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1,0x38,0x7e,0x70, +0x64,0xa1,0x38,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, 0x1, 0x7e, +0xf3,0x37,0xc1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc1,0xa, 0x2f,0x19,0x72,0x2b,0x21, +0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x38,0xa1,0xa0,0xbe,0x60,0x3a, +0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xc3,0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, 0x80,0x2, +0xa1,0xa0,0x75,0x1a,0x3a,0xa1,0xa0,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, 0x7a,0x73, +0x2b,0x12,0xa1,0xa0,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xec,0xa1,0xa0,0xbe,0x60, +0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc5,0x7c,0xbf, +0x4, 0x7a,0xb3,0x37,0xc5,0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d,0x2, 0x80, +0x2, 0xa1,0xa0,0x75,0x1a,0x3c,0xa1,0xa0,0xbe,0x60,0x3e,0x68,0x4, 0xa5,0xbe,0x3f, +0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc7,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc7,0xa, +0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x3e, +0xa1,0xa0,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x3d,0xa5,0x75, +0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x3d,0xa5,0x75,0xd, 0x2, 0x12,0x3a, +0xe6,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x3d,0xa5,0x12,0x3f,0x70,0x80,0x71,0xbe, +0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x3d,0xa5,0x80,0x63,0xbe,0x60,0x4e, +0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xe2,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xe2,0xa, 0x2f,0x2e,0x27,0x31,0xcc,0x7a,0x29,0x70,0xa5,0xbe,0x4f, +0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80,0x31,0xbe, +0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20,0x7c,0xb7, +0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, 0x7e,0x1f, +0x31,0xd0,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a,0x71,0xf, +0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0x9c,0x22,0x7a,0xb3,0x2b,0x0, +0x70,0x14,0x12,0x3f,0x67,0x12,0x3b,0x15,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4, +0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x3f,0x49,0x12,0x3b,0x15,0x12, +0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12,0x0, 0x1e, +0xe4,0x12,0x3d,0xac,0x12,0x3d,0xf3,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12,0x3d,0xac, +0x2, 0x3d,0xf3,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e,0x8, 0x1f, +0x44,0x12,0x3f,0xe9,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x20,0xde,0x7e, +0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x1f,0xda,0x7e, +0x34,0x0, 0xa, 0x12,0x20,0xde,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc,0x7a,0x1d, +0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, 0x2a,0xb9, +0x12,0xba,0x4c,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, 0x3a,0x2e, +0x34,0x20,0x73,0x12,0x91,0x6d,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12, +0x3f,0xb, 0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a, +0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9, +0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x3f,0xb, 0xa, 0x4a, +0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde, +0x38,0xd8,0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0, +0x12,0xb8,0xe2,0x80,0x3, 0x12,0x3f,0xd9,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f, +0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e, +0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34, +0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e, +0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x12,0xae,0xfc,0x12,0x13,0xf5,0x12, +0xb9,0x6e,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x3f,0xcb,0x74,0x1, 0x12, +0x3d,0xac,0x12,0x3f,0xd2,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x3d,0xdb,0x7e, +0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25, +0xee,0x22,0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x3f,0x67,0x80,0x6, 0xb4,0x1, 0x6, +0x12,0x3f,0x49,0x12,0x3b,0x15,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22, +0x12,0x3f,0xaa,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x37,0xdc, +0x12,0x20,0xb9,0x1b,0xfd,0x12,0xc0,0xc5,0x12,0x3f,0x49,0x80,0x1a,0xca,0x39,0x7e, +0x18,0x2b,0x70,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x37,0x2b,0x76, +0x7a,0x37,0x31,0xcc,0x12,0x3f,0x67,0x2, 0x3b,0x15,0x7e,0xb3,0x37,0xe0,0x7e,0x34, +0x0, 0x4, 0x22,0x7c,0x6b,0x12,0x3f,0xe1,0x78,0x5, 0x7c,0xb6,0x2, 0x7d,0xd6,0xb4, +0x4, 0x5, 0x7c,0xb6,0x2, 0x3b,0x1e,0x22,0xb2,0x82,0x22,0x7d,0x32,0x74,0xfa,0x2, +0x12,0xd0,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x20, +0xde,0x7e,0xb3,0x37,0x9c,0xc4,0x54,0x7, 0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, +0x20,0xde,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x30,0x6, 0x3b,0xc2,0x6, +0x12,0x25,0xe6,0x7e,0x73,0x37,0xa1,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x37,0xa2,0x7a, +0x73,0x2b,0x1d,0x7e,0x73,0x37,0xa2,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x37,0xa3,0x60, +0x18,0x7e,0x34,0x0, 0x2, 0x12,0x41,0x5d,0x7e,0x34,0x0, 0x1, 0x12,0x41,0x5d,0x6d, +0x33,0x12,0x41,0x5d,0xe4,0x7a,0xb3,0x37,0xa3,0x12,0x4f,0xfa,0x2, 0x40,0x3f,0xe5, +0xc, 0x70,0x2, 0x21,0x5c,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x72,0x92, +0x12,0x79,0x31,0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53, +0xc, 0xfd,0x12,0xba,0x3, 0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b, +0x12,0x60,0x9, 0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65, +0x7e,0x73,0x2b,0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x4, +0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3, +0x45,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xce,0x7a,0x73,0x2b,0xf, 0x12,0x87,0x52,0x7a, +0xb3,0x0, 0x4f,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x4f,0x7a, +0x73,0x37,0xa6,0x12,0x6e,0x29,0x12,0xc0,0x22,0x7e,0x73,0x37,0xcf,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xae,0xfa,0xe4, +0x12,0xa, 0x66,0x12,0x8d,0xec,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43, +0x37,0xd0,0x7e,0x50,0xa, 0xac,0x45,0x12,0x3f,0xcb,0xe5,0xc, 0x30,0xe6,0x4e,0x53, +0xc, 0xbf,0x7e,0x73,0x37,0xbc,0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37, +0xbc,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x43,0xeb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63, +0x37,0xbc,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12,0x47,0x81,0x7c,0x65,0x4c,0x76,0x74, +0xe, 0x12,0x43,0x5f,0x12,0x43,0xeb,0x12,0x43,0xf3,0x7e,0x73,0x37,0xbf,0x7a,0x73, +0x2b,0x14,0x7e,0x73,0x37,0xbe,0x7a,0x73,0x2b,0x1f,0x12,0xc0,0xd7,0xe5,0xc, 0x30, +0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xa6,0x2, 0x48,0x77,0x22,0xca,0xd8,0xca, +0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c, +0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x57, +0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x43,0xeb,0x7c,0x8b,0x74,0x7, 0x7e, +0x70,0xf, 0x12,0x43,0xf0,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, +0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, +0xc, 0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e, +0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x38,0xc4,0x12,0x43, +0x48,0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x38,0xc4,0x78,0x7, 0x12,0x43, +0x48,0x54,0xfb,0x80,0x5, 0x12,0x43,0x48,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x38, +0xc0,0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e, +0xa0,0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0x12,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff, +0xe, 0x12,0x43,0x53,0x54,0xe6,0x12,0x43,0x50,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12, +0x43,0x53,0x5e,0x54,0xfe,0xe6,0x12,0x43,0x50,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4, +0x0, 0x2, 0x78,0x2d,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e,0x54,0x0, 0xf, 0x1b, +0x1a,0x50,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34, +0x0, 0x2, 0x12,0x44,0x72,0x12,0x44,0x4b,0x12,0x44,0x28,0x7a,0x37,0x31,0xd4,0x61, +0x4, 0x6c,0xdd,0x41,0xfe,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40, +0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, +0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c, +0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e, +0x54,0x0, 0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4, +0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, +0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, +0x3b,0x12,0x44,0x72,0x12,0x44,0x4b,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x44,0x4b, +0x12,0x44,0x28,0x74,0x2, 0xac,0xbd,0x59,0x35,0x31,0xd6,0x80,0xf, 0x12,0x44,0x28, +0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x31,0xd6,0xb, 0xd0,0xbc,0xed, +0x28,0x2, 0x41,0x65,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x43,0xf0,0xa9,0xc0, +0xc4,0x7e,0x1f,0x38,0xc0,0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x38,0xc0,0x79,0xf1,0x0, +0x90,0x6d,0x33,0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0x8, 0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x10,0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22, +0x1b,0x1a,0x50,0x7e,0x1f,0x38,0xc0,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5, +0xfd,0x7a,0x71,0xfe,0x22,0xca,0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12, +0x43,0x5f,0x74,0xf, 0x12,0x43,0xeb,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe, +0x12,0x43,0x5f,0x74,0xc, 0x12,0x43,0xeb,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, +0x7e,0x70,0xf8,0x12,0x43,0x5f,0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, +0x38,0xb, 0x12,0x45,0x6, 0x7c,0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17, +0xe4,0x93,0xb4,0x1, 0xe, 0xbe,0xa0,0x7, 0x28,0x9, 0x12,0x45,0x6, 0xa, 0x77,0x2e, +0x74,0x0, 0x7, 0x74,0xe, 0x7c,0x7f,0x12,0x43,0x5f,0x74,0x7, 0x12,0x43,0xeb,0x7c, +0xfb,0x5e,0xf0,0xfb,0x90,0x60,0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c, +0xf7,0x74,0x7, 0x7c,0x7f,0x12,0x43,0xf0,0xda,0x79,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x12,0x43,0x5f,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24, +0x7e,0x24,0x0, 0x12,0x12,0xb7,0x9d,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74, +0x3, 0x7e,0x71,0x27,0x12,0x43,0x5f,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x43,0x5f,0x74, +0xc, 0x7e,0x71,0x30,0x12,0x43,0xf0,0x22,0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0xa, +0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e, +0xf, 0x38,0xc4,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0x12,0x5e, +0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34, +0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x45,0x15, +0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6, +0x22,0x12,0x47,0xf8,0xc2,0x3, 0x12,0xb6,0x2d,0xc2,0x5, 0x12,0x45,0x51,0xc2,0x3, +0x12,0x47,0x21,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0xeb,0x7a,0x1b,0xb0,0x74,0xf, +0x6c,0x77,0x12,0x43,0x5f,0xe5,0xfc,0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x43,0xf3, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x2a,0x12,0x44,0x6e,0x12,0xb5, +0xe5,0x2, 0xb6,0x9a,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x1a,0x12,0x44,0x6e,0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0xc, 0x12,0x44,0x6e,0x2, 0xb6,0x94,0x74, +0x1, 0x7a,0xb3,0x33,0xff,0x22,0xa, 0x3a,0x2e,0x34,0x0, 0x3, 0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0x5f,0x7a,0x61,0xfc,0x12,0x43,0xf3, +0x12,0x46,0x68,0xd2,0x3, 0x12,0x47,0x21,0x12,0x45,0x6b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x45,0x6b, +0x2, 0x13,0x96,0x12,0x47,0xf8,0xc2,0x5, 0x2, 0x45,0x51,0xd2,0x5, 0x12,0x45,0x51, +0x74,0x1, 0x22,0x12,0x45,0xcf,0x12,0x91,0x8, 0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0xc0,0xab,0x12,0x44,0x91,0x74,0x1, 0x12,0x46,0x7, 0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x45,0x30,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x45,0x5a,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x45,0xcf,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x46, +0x7, 0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x45,0x5a,0x74, +0x81,0x7a,0xb3,0x39,0x2, 0x22,0x80,0x1d,0x12,0x45,0xcf,0x12,0x47,0xff,0x68,0x5, +0xc2,0x4, 0x12,0x45,0x5a,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x17, +0x15,0xe4,0x12,0x46,0x7, 0x20,0x93,0xe0,0x12,0x45,0xcf,0xa9,0xd1,0xcd,0xa9,0xc5, +0xea,0x74,0x2, 0x2, 0x46,0x7, 0x22,0x7c,0xab,0x7e,0xb3,0x39,0x2, 0xb4,0x81,0x38, +0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf, +0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, +0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87, +0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0x2, 0x22,0xd2,0x3, +0x80,0x12,0x30,0x3, 0xc, 0x12,0x47,0xff,0x68,0x7, 0xc2,0x3, 0xc2,0x4, 0x12,0x45, +0x5a,0x12,0x45,0xd6,0x30,0x17,0xeb,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb, +0xd2,0x3, 0x12,0xb6,0x2d,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, +0xa9,0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74, +0x41,0x12,0x45,0x15,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda, +0xf8,0x22,0xe4,0x12,0x46,0xf0,0x12,0xb6,0x36,0x12,0x26,0x57,0x12,0xb6,0xb1,0x12, +0x43,0x65,0x12,0xb5,0xdb,0x12,0xb6,0x4d,0x12,0x0, 0x4a,0x12,0xb6,0x59,0x12,0x7e, +0xa0,0x12,0xb6,0x69,0xd2,0xaf,0x12,0x47,0x8a,0x12,0xb8,0x6e,0x12,0x43,0xfa,0x12, +0x46,0x68,0x7e,0x8, 0x3, 0xf1,0x12,0xa9,0x80,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34, +0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0xa9,0xd0, +0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x45,0x51,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75, +0xc2,0xc, 0xd2,0x3, 0x12,0x47,0x21,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1, +0x22,0xa2,0x3, 0xa9,0x97,0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x7e,0x34,0x36,0xe1, +0x30,0xd, 0x4b,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x4f, +0x9, 0x53,0x0, 0x3, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12, +0x47,0x7f,0x7a,0x27,0x2a,0x53,0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a, +0x27,0x2a,0x5a,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a, +0x5c,0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0x45,0xc, 0x7a,0x37,0x2a,0x62,0x22,0xa, +0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12, +0x43,0xeb,0x7c,0x7b,0x12,0x43,0xf3,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e, +0x24,0x0, 0xef,0x7e,0xf, 0x38,0xc0,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e, +0xf, 0x38,0xc0,0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x38,0xc0,0x79, +0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x38,0xc0,0x79, +0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8a,0x7e, +0x34,0x6a,0xd1,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e, +0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8e,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x12,0xc0,0xce,0x12,0xc0,0xc5,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x48,0x56,0x12,0x48,0x30,0x74,0x50,0x7a,0xb3,0x37,0xd0,0x7e,0x24, +0x3, 0x20,0x12,0x3f,0xcb,0xe4,0x12,0xc0,0x7, 0x6d,0x33,0x7a,0x37,0x39,0x4, 0x22, +0x7e,0x73,0x2b,0x62,0x7a,0x73,0x37,0xcf,0x22,0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37, +0xca,0x7e,0x73,0x37,0xce,0xbe,0x73,0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12, +0x48,0x56,0x12,0x48,0x30,0x22,0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x7e,0x73, +0x2b,0x1f,0x7a,0x73,0x37,0xbe,0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x7e,0x73, +0x2b,0x14,0x7a,0x73,0x37,0xbf,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, +0x12,0x48,0xe8,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80, +0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x48,0xe8,0x40, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c, +0xdd,0x7c,0xbd,0x12,0x8d,0xb3,0x12,0x48,0x6e,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x37, +0xbe,0x12,0x49,0x4, 0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x12,0x48,0x30,0x7a, +0xd3,0x37,0xa6,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26, +0x33,0xbc,0xbe,0x22,0x30,0x3, 0x3, 0x12,0x48,0x6e,0xa2,0x4, 0x92,0x5, 0x12,0x49, +0xc3,0x2, 0x49,0x4, 0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x22,0x74,0x40,0x12, +0x6e,0x8b,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x48,0xf4,0x80,0x1c,0x74,0x1, 0x12, +0x49,0x47,0x7e,0x43,0x37,0xbb,0x7e,0x50,0x64,0xac,0x45,0x12,0x87,0xf8,0x7a,0xb3, +0x2b,0x1f,0x7e,0xf, 0x38,0xd9,0x12,0x4d,0x9b,0x12,0x49,0x4, 0x7e,0x73,0x2b,0x1f, +0x7a,0x73,0x37,0xbe,0x2, 0x48,0x6e,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14, +0x12,0xc0,0x22,0x7e,0xc0,0xa, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x1f,0x38,0xd9,0x12,0x90,0x58,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, +0x12,0x49,0xb7,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12, +0x49,0xb7,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x49,0xb7,0xb, +0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x38, +0xd9,0x12,0x8f,0xfb,0x7d,0x73,0x7e,0x1f,0x38,0xc8,0x69,0x31,0x0, 0x1a,0x7a,0x73, +0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, 0x1a,0xb, +0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x37,0xb1, +0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5,0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3, +0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a,0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35, +0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x31,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x4e,0x5f,0x6c,0xff,0x80,0x35,0x12,0x4c, +0x40,0x6c,0xee,0x80,0x19,0x7e,0x11,0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac, +0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x10,0x12,0x4c,0x47,0xe5,0x2e, +0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12,0x4c,0x56,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34, +0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xc5,0x12,0xc0,0x90,0x68,0xb, 0x7e,0x34, +0x10,0x0, 0x12,0x4c,0x7c,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x78,0x12,0x4c,0x40, +0x6c,0xee,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2a,0xbc,0xbe,0x38,0xe6,0xe5,0x2a, +0x12,0x4c,0x56,0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x60,0xe5,0x2a,0xbe,0xb1,0x2d, +0x50,0x35,0x12,0x4c,0x40,0x7e,0xe1,0x2a,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2d, +0xbc,0xbe,0x38,0xe6,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5,0x2d,0xa, 0x1b,0x6d,0x0, +0x9f,0x1, 0x12,0x4c,0x5a,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x3, 0x62,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x82,0xe5,0x2d,0xa, 0x1b,0x6d, +0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x1f,0x7, 0x6c,0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, 0x9d,0x15,0xad,0x12, +0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21, +0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xcc, +0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x7, 0x6c,0xff,0x80, +0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x60,0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10, +0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x60,0xe5,0x2a, +0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x62,0x2e,0x14,0x10, +0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x62,0xb, 0xf0,0xe5,0x2b,0xbc, +0xbf,0x38,0x9e,0x7e,0x73,0x37,0xb3,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14, +0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x5, 0x7d,0xe3,0x7a,0xe5,0x35, +0x7e,0x73,0x37,0xb4,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d, +0x1f,0x12,0x1f,0x5, 0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, 0xac,0xbf,0x49,0x45, +0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x34,0x0, 0x80,0x8, +0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xda, +0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x60,0xbe,0x45,0x35,0x28, +0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x60,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65, +0x3, 0x60,0x49,0x45,0x3, 0x62,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35, +0x3, 0x62,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x62,0xb, 0xf0,0xe5,0x2b, +0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x31,0x12,0x4d,0x9b,0xda,0x3b,0x22, +0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a, +0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f, +0x7, 0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x1f,0x5, 0x7e,0xa1,0x2c,0x74, +0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x4e,0x5f,0x7e,0x1f,0x38,0xf3, +0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x6, +0x7e,0x38,0x38,0x88,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x87,0x70,0xe, 0x7e,0xb3,0x38,0x85,0x70,0x8, +0x74,0x1, 0x7a,0xb3,0x38,0x87,0xa1,0x57,0x7e,0xb3,0x38,0x87,0x70,0x6, 0x74,0x1, +0x7a,0xb3,0x38,0x87,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0, +0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61, +0x59,0x12,0x23,0x9e,0x7a,0x35,0x2e,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0xa6,0x56, +0x75,0x2c,0x0, 0x80,0x16,0x12,0x4c,0x7c,0x12,0x4d,0x84,0xbe,0x35,0x2a,0x8, 0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x84,0x7a,0x35,0x2a,0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c, +0x38,0xe3,0x12,0x4d,0x93,0x40,0x25,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x1e,0x5, 0x1c, +0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c,0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20,0xb9,0x1b,0xfd,0x74,0x2, 0x12,0x0, +0x1e,0x12,0x4d,0x93,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x38,0xf2,0xe4,0x7a,0xb3,0x38, +0x87,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, 0x21,0x0, 0x7f,0x13,0x2d,0x35,0xb, +0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35,0x2a,0x22,0x12,0x4d,0xa5,0xb, 0x34, +0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x12,0xc1,0x17,0x4c,0xaa, +0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c,0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4, +0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60, +0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e,0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, +0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc, +0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, +0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12,0x1f,0x7, 0x7f,0x1, 0xb, 0xc, 0x7e, +0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f,0x7, 0xbe,0x34,0x0, 0xfa,0x28,0x4, +0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, 0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d, +0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e,0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e, +0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27, +0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e, +0x34,0x0, 0x38,0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12, +0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, +0x12,0x4e,0x8d,0x80,0x2, 0xe4,0x22,0x12,0x4e,0x72,0x74,0x1, 0x22,0x12,0xc0,0x75, +0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0x12,0x7f,0x6f,0x38,0x2, +0xe4,0x22,0x12,0x7f,0x67,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x4e, +0xb4,0x2, 0x4e,0x7d,0x7e,0xd7,0x2b,0xd, 0xbe,0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12, +0x7e,0xf8,0x12,0x4e,0xe0,0x7a,0xd7,0x2b,0xd, 0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e, +0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, 0x12,0x4f,0xaf,0x74,0x1, 0x22, +0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b,0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a, +0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x4e,0xe0,0x12,0xc0,0xbd,0x12,0x29,0x6f, +0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x20,0xde,0x7e,0xd0,0x7, 0x12,0x26,0x57,0x6c, +0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x12,0x4f,0xf0,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, +0x3c,0xbd,0x32,0x48,0xde,0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x7e,0xb3, +0x2a,0x73,0x7c,0x7e,0x12,0x7b,0x31,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49, +0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0x4f,0xf0,0x5c,0x7b,0x7a, +0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe, +0xd0,0x0, 0x58,0x88,0x12,0x7b,0x39,0x74,0x2, 0x12,0xc0,0xe0,0x12,0x50,0x51,0x74, +0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2a,0xfa,0x12,0x4e,0xe0,0xda,0x3b,0x22,0x74,0x2, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x12,0x50,0x51,0x74,0x2, 0x12,0x0, 0x1e,0x74, +0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x4f,0xc1,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, +0x94,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x2e,0x34,0x20,0x73,0x12, +0x91,0x6d,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x38,0xc0,0x2d, +0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x74,0xbc,0x6a,0x38,0xd6,0x22, +0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, +0x30,0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x4e,0xe0,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, +0xfd,0x7e,0xb3,0x37,0xe0,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc0,0xe0,0x12, +0x50,0xd4,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xe1,0x7e, +0xb3,0x37,0xe0,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x3f,0x67,0x80,0x7, 0xe4, +0x12,0x0, 0x1e,0x12,0x3f,0x49,0x12,0x3b,0x15,0x7e,0xb3,0x2a,0xfc,0x2, 0x50,0x51, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x3f,0xe9,0x7e,0xa3,0x2a,0x73, +0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x62,0x2a,0xdc,0xa, 0x26, +0x12,0x51,0x4b,0x93,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x50,0xca, +0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xde,0x6c,0xee,0x80,0x1a,0xa, 0x2e, +0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12, +0x50,0xca,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30, +0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba, +0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27,0x2a,0xfe,0x7e,0x29, +0xb0,0xa, 0x26,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xe9,0x7e, +0xa3,0x2a,0x73,0x7e,0x63,0x2a,0x74,0x6c,0xee,0x80,0x1f,0xa, 0x2e,0x9, 0x72,0x2a, +0xdc,0xbe,0x70,0x1c,0x50,0x12,0xa, 0x27,0x12,0x51,0x4b,0x93,0x7c,0x7b,0x7e,0xb3, +0x2a,0xfb,0xa, 0x27,0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xdd,0x6c,0xee, +0x80,0x17,0xa, 0x3e,0x9, 0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a, +0xfb,0xa, 0x27,0x19,0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e, +0x30,0xe, 0xac,0x3e,0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11, +0xf8,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0x73,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7a,0xb3,0x34,0xc4,0x7c,0xbf,0x6c,0x77,0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x51,0x4f,0x93,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff, +0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0xca, +0xf8,0x6c,0xaa,0x6d,0x33,0x7e,0x24,0x7f,0xff,0x7e,0xf0,0x1, 0x80,0x32,0xa, 0x1f, +0x7e,0xb3,0x2a,0x6e,0xa, 0xb, 0x2d,0x1, 0x3e,0x4, 0x49,0x10,0x4, 0xfc,0xbe,0x14, +0x3, 0xe8,0x8, 0x1a,0xb, 0xa0,0xbd,0x13,0x8, 0x4, 0x7d,0x31,0x80,0x10,0xbd,0x12, +0x58,0xc, 0x7d,0x21,0xbe,0x24,0x0, 0x0, 0x18,0x4, 0x7e,0x24,0x0, 0x1, 0xb, 0xf0, +0x7e,0xb3,0x2a,0x6f,0xa, 0xb, 0x1b,0x4, 0xa, 0x1f,0xbd,0x10,0x48,0xc0,0x7e,0xb3, +0x34,0xa1,0x7a,0xb3,0x36,0xf3,0x7a,0xa3,0x36,0xf7,0xe4,0x7a,0xb3,0x36,0xf5,0xbe, +0xa0,0xb, 0x78,0x18,0x9d,0x32,0xbe,0x34,0x4, 0xb0,0x58,0x10,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x1, 0x5e,0x58,0x6, 0x74,0x1, 0x7a,0xb3,0x34,0xa1,0x7e,0x73,0x34,0xa1, +0xbe,0x70,0x0, 0x28,0x3e,0x6c,0xff,0x80,0x35,0x7c,0xbf,0x12,0x97,0xfc,0x60,0x22, +0x74,0x22,0x7a,0xb3,0x36,0xf4,0x7e,0xb3,0x34,0xc4,0x4, 0x12,0x51,0x57,0x7e,0x73, +0x34,0xc4,0xbe,0x70,0x5, 0x40,0x15,0xe4,0x7a,0xb3,0x34,0xc4,0x7a,0xb3,0x34,0xa1, +0x80,0xa, 0xe4,0x12,0x51,0x57,0x74,0x33,0x7a,0xb3,0x36,0xf5,0xb, 0xf0,0x12,0x52, +0x66,0x38,0xc6,0xda,0xf8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xca,0xd8,0xca, +0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x3c,0xe4,0x7a,0xb3,0x1f,0x58,0xe5,0x1d, +0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60,0xc, 0x12,0x8c,0x87, +0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x10,0x6d,0x88,0x7a,0x87,0x37, +0xfd,0x61,0xa0,0x12,0x93,0x91,0x60,0x12,0x7e,0x34,0x62,0xe, 0x12,0x87,0xc4,0x7a, +0x87,0x37,0xf3,0x12,0x54,0x2b,0x7a,0x87,0x37,0xfd,0x7e,0x87,0x37,0xf3,0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x7b,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x52,0x7c,0xbd, +0x7c,0x7e,0x12,0x55,0xb9,0x7d,0x93,0x7e,0x87,0x37,0xfd,0xbd,0x89,0x50,0x4, 0x7a, +0x97,0x37,0xfd,0x7e,0x87,0x38,0x3c,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x3c,0xe5, +0x1d,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x37,0xff,0x12,0x54,0x4e,0x50,0x7, 0x12, +0x54,0x45,0xd2,0x3, 0x80,0x2f,0x7e,0x8, 0x37,0xff,0x7e,0x18,0x1f,0x52,0x12,0x57, +0x0, 0x50,0x22,0x80,0x10,0x12,0x54,0x2b,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f,0x52, +0x12,0x91,0x86,0x50,0x10,0x12,0x54,0x45,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52, +0x12,0x93,0x6b,0xd2,0x3, 0xb, 0xf0,0x12,0x52,0x66,0x38,0x80,0x30,0x3, 0x37,0x6c, +0xff,0x80,0x20,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x58,0x12,0x54, +0x4e,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x54, +0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdb,0x75,0x1d,0x0, 0x7e,0x34,0x62,0xe, 0x12, +0x23,0x9e,0x7a,0x37,0x37,0xf3,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, 0xac,0x67,0xb, +0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x37,0xff,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x37,0x37,0xf3,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93,0xa, 0x3b,0xbe, +0x37,0x37,0xfd,0x38,0x40,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37,0x38,0x3c,0x38, +0x34,0x90,0x60,0x51,0x12,0x54,0x33,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, +0x24,0x90,0x60,0x50,0x12,0x54,0x33,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, +0x14,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x54,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf4,0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0xa2,0x3, 0x92,0x10,0x12, +0x56,0xe9,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xb, 0x70,0x1b,0x7e, +0xb3,0x28,0xa8,0x70,0x15,0x12,0xc1,0x7, 0x68,0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0, +0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x51,0x5f,0x22,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0xd5,0x26,0xfa,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x7c,0xbd, +0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f, +0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0, +0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, +0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38, +0xc9,0xa2,0x4, 0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28,0x99, +0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73, +0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f, +0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, +0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x55,0xa6,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3, +0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e, +0xb3,0x26,0x83,0x70,0x40,0x12,0x8f,0xe3,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x55,0xa6,0x49,0x2, +0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49, +0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, +0xf0,0xbc,0x7f,0x38,0xc9,0x12,0xb1,0x64,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28, +0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28, +0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x55,0xaf,0x49,0x25, +0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x0, 0xbe,0x37,0x28,0x9d,0x8, +0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdc,0x6c, +0xff,0x80,0x9, 0x12,0x55,0xaf,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf2,0xda,0x79,0xda,0xd8,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0x7c, +0xbf,0x12,0x37,0x6f,0x74,0x2, 0xac,0xbf,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f, +0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c,0xcc, +0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c, +0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14, +0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12, +0x20,0xde,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a, +0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1c,0x75,0x26,0x0, +0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56,0xd3,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf1,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xdf,0x7c,0xec, +0x80,0x23,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80,0xa, 0x12,0x91,0xd5, +0x70,0xd, 0x12,0x56,0xd3,0xb, 0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5, +0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd8,0x1a,0x3c,0xb, 0x34,0x7c,0xe7, +0x80,0x1c,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56, +0xd3,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf1,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73, +0x2a,0x6e,0xbc,0x7e,0x18,0xdc,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x21,0x75,0x26, +0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xa, 0x12,0x91,0xd5,0x70,0xd, 0x12,0x56,0xd3,0xb, +0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e, +0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd7,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, +0xda,0x3b,0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35,0x24,0x22,0x12,0x57, +0x32,0x12,0x51,0x9f,0x7a,0xb3,0x2a,0xc, 0x22,0x30,0x10,0x13,0x12,0xc0,0xf7,0x68, +0x6, 0x7e,0xb3,0x39,0xb, 0x60,0x8, 0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x37,0xfb,0x22, +0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f, +0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x54,0x52,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76, +0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9, +0xc3,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34,0xa2,0x6c,0x33,0x80,0x3d,0x7e, +0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc, +0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32, +0x12,0x35,0x67,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3, +0x34,0xa2,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf, +0x2, 0x57,0x83,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac, +0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c, +0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26, +0xfb,0xa, 0x28,0xa, 0x31,0x12,0x35,0x67,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x35, +0x67,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0, +0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3e,0xbe,0xb0,0x0, 0x28,0x12,0x14, +0x7a,0xb3,0x35,0x3e,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2a, +0x5a,0x7e,0xb3,0x36,0xec,0x70,0x58,0x7e,0xb3,0x39,0xb, 0x70,0x52,0x7e,0xb3,0x36, +0x71,0x70,0x4c,0x7e,0x37,0x37,0xfd,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28, +0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f, +0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3, +0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, +0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x35,0x3e,0xda, +0xf8,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e,0x7e,0xf3,0x2a,0x6d,0xac,0xf7, +0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x20,0xde,0x7e,0xb3,0x37,0xb7, +0xb4,0x1, 0x64,0x7e,0x73,0x37,0xb8,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c, +0x12,0x26,0x57,0x12,0x28,0x62,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49, +0x33,0xd, 0xc8,0x12,0x21,0x0, 0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14, +0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34, +0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xb8, +0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, +0xd, 0xc8,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0x4, 0xe4,0x2, 0x58,0xe8,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0x12,0x68,0x10,0x12,0x7d,0x94,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0x74,0x12,0xb6,0xb8, +0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x91,0x18,0x12,0x47,0x2c, +0x12,0x28,0x62,0x50,0xde,0x12,0xab,0xb8,0x12,0x75,0xe9,0x7e,0xb3,0x37,0x5, 0xb4, +0x1, 0x4, 0xe4,0x12,0x58,0xe8,0x12,0xaf,0x66,0x12,0xa7,0xbd,0x12,0x5e,0xaa,0x40, +0xc2,0x12,0x88,0x5f,0x12,0x5e,0xaa,0x40,0xba,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x0, 0x6e,0x12,0x5f,0x2f,0x12,0x5f,0x83,0x12,0x5b,0x94,0x12,0x96,0x24,0x12,0x5e, +0xc2,0x12,0x5f,0xcd,0x12,0xaa,0xc3,0x12,0x87,0x74,0x7e,0xb3,0x36,0xf1,0xbe,0xb0, +0x88,0x68,0x3, 0x12,0x59,0x77,0x12,0x67,0xfa,0x12,0x26,0x66,0x12,0x62,0xa5,0x80, +0x82,0x12,0x2f,0xee,0x2, 0x58,0xdc,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x12,0x35, +0xd3,0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, +0x7e,0xb3,0x2a,0x7, 0x70,0x8, 0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0x61,0x6b,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x28,0x80,0x4, 0x7e,0x68,0x32,0xea,0x7f,0x6, 0x12,0x7e,0xef, +0x7e,0x73,0x2a,0x4, 0x7a,0x6b,0x70,0x6c,0xdd,0x61,0x1c,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x5e,0x3d,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x61,0x1a,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x61,0x1a,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x9e,0xec,0x50,0x2, 0x61,0x1a,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3, +0x2a,0x9, 0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xd6,0x6d,0x22,0x74,0x1, 0x12,0x7f,0xd4,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xe0,0x6d,0x22,0x74,0x10,0x12,0x7f,0xd4,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xd6,0xf5,0x25,0x9, 0xb3,0x32,0xe0,0xf5,0x26,0xa, 0x3c,0x12,0x5e, +0x3d,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xd6,0x19,0xb3,0x32,0xe0,0x12, +0x35,0xd3,0x7e,0xb3,0x2a,0x64,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd, +0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac, +0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x2c,0x75,0x27, +0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x6a,0x54,0xf, +0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x66,0x49,0xa3,0x33,0x68,0x80,0xc, 0x5, 0x27, +0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, 0xff,0x5e,0xa4, +0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5, +0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0, +0xe5,0x28,0xa, 0x5b,0x12,0xb9,0x3c,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e, +0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13, +0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26, +0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x4d, +0xbc,0x7d,0x28,0x2, 0x21,0xbb,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x31, +0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38, +0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0xa, 0xb2,0xe, 0x12,0x7e,0x81,0x74,0x1, 0x12,0x58, +0xe8,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x5e,0x61,0xe4,0x7a,0xb3,0x2a, +0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, 0xe4,0x12,0x58,0xe8,0x12, +0x5f,0xc2,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x66,0x12,0x20,0xb9,0x1b, +0xfd,0x4c,0xff,0x78,0xc, 0x12,0x73,0xe5,0x7e,0x8, 0x33,0x66,0x74,0xff,0x12,0x20, +0xde,0xda,0x3b,0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70, +0xff,0x12,0x5e,0x8b,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f, +0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe2,0x7e,0x73,0x2a,0x2, +0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x2, 0xa1,0xab,0x6c,0xaa,0x80,0x10, +0x7e,0x44,0x7f,0xff,0x12,0x5e,0x95,0x79,0x40,0x0, 0x14,0x12,0x5e,0x45,0xb, 0xa0, +0x12,0x5e,0x25,0x38,0xeb,0xa1,0xab,0x7e,0xb3,0x34,0x4f,0x70,0x3d,0xbe,0x70,0x0, +0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12, +0x5e,0x95,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30, +0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0, +0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xce,0xa1,0xab,0x6c,0xaa,0x80,0x17,0x12,0x5e, +0x57,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe4,0x6c,0xaa,0x80,0x41,0x6c,0xff, +0x80,0x36,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe, +0x34,0x7f,0xff,0x68,0x21,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x18,0x12,0x5e, +0x35,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x5e,0x4e, +0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xc5,0xb, 0xa0,0x7e, +0xb3,0x34,0x4f,0xbc,0xba,0x38,0xb7,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x9, 0xb3,0x1f, +0x46,0xb4,0xff,0x1d,0x6c,0xff,0x80,0x14,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x9, 0x12,0x5e,0x4e,0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38, +0xe7,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xd3,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac, +0x7a,0x49,0x43,0x28,0xae,0x12,0x5e,0x35,0x59,0x42,0x15,0x76,0x49,0x33,0x28,0xb0, +0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xde,0x7e,0x34, +0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e,0x7e,0x73, +0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80, +0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0x12,0x5e,0x2d,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x5e,0x8b,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x5e,0x45,0xb, 0xa0,0x7e,0x63,0x2a,0x2, 0xbc,0x6a, +0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68, +0x13,0x12,0x5e,0x57,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c, +0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x7e,0xf3,0x2a,0x2, 0x7a, +0xf3,0x34,0x4f,0x6c,0xaa,0x80,0x66,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2b, +0x12,0x5e,0x9f,0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0xa, 0x3a,0x2d,0x3d, +0x7d,0x2c,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x2e, +0xa5,0xbb,0x0, 0x2a,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x23,0x12,0x5e,0x9f,0xbe,0xb0, +0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30, +0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0xa, 0x3a, +0x2d,0x3d,0x7d,0x2c,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0x12,0x5e,0x25, +0x38,0x95,0xda,0xf8,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0x90,0x60,0x99, +0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0xb0,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40,0x0, 0x28,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x22,0x6c,0xaa,0x80,0x20,0x74,0x3, 0x12,0xa9,0x76,0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0xa, 0x12,0x5e,0x57,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79, +0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x22,0x7e,0x50,0x9, 0xac,0x5a, +0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, +0x3a,0x2d,0x3d,0x7d,0x2c,0x29,0xb1,0x0, 0xa, 0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91, +0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x9b,0xdf,0x28,0x2, 0xd2,0x3, 0xa2, +0x3, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x3, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x5f,0xc2,0xca,0x59,0x7e,0x18,0x28, +0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xb9,0x1b,0xfd,0x90,0x61,0x35,0xe4,0x93,0xbe, +0xb0,0x0, 0x28,0x28,0x6c,0xff,0x80,0x1f,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae, +0x12,0x80,0x16,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12, +0x64,0xdb,0x12,0xab,0x78,0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xdc,0xda,0xf8,0x22,0x2, +0x5f,0x32,0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe, +0x12,0x37,0x6f,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x23,0x7e,0xc4, +0x0, 0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0xb, +0xf0,0xb, 0xe0,0x12,0x9c,0xf6,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, +0xda,0x79,0x22,0x12,0x9d,0xda,0x2, 0x5f,0x89,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, +0x38,0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x35,0x40, +0x28,0x14,0x7e,0xb3,0x35,0x40,0x4, 0x7a,0xb3,0x35,0x40,0x7a,0xa3,0x2a,0x2, 0x80, +0x5, 0xe4,0x7a,0xb3,0x35,0x40,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a, +0xb, 0x22,0x90,0x60,0x99,0xe4,0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x12,0x68,0x38, +0x2, 0x5f,0xd3,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x34,0xa2,0x4c,0xaa,0x78, +0x3, 0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x34,0xad,0x7e, +0x73,0x34,0xae,0xbe,0x73,0x34,0xad,0x28,0x4, 0x7a,0x73,0x34,0xad,0x22,0xff,0xff, +0x70,0x8f,0x0, 0xff,0x51,0xae,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x37,0x31,0x1, 0xc3,0x1, 0x34,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x10,0xef,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0x18,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xd, 0xc, 0xb, 0xa, 0x9, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x11,0x12,0x13,0x14,0x18,0x17,0xc, 0xd, 0xe, 0xf, 0x15, +0x16,0x10,0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x3d,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x4, 0x5d,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x69,0x40,0xd, 0x18,0x25,0x17,0x25,0x6, 0x80,0x17,0x25,0x6, +0x80,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x32,0x32,0x1, 0xd8,0x1, 0xec,0x0, +0xe1,0x0, 0xe1,0x5, 0x0, 0x37,0x37,0x1, 0xae,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0x96,0x1, 0x18,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, 0x68,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15,0x0, 0x1, 0x54,0x1, 0x0, 0x10, +0x1, 0x51,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0x10,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x3d,0x2, 0x5d,0x69,0x20,0x26,0x3, 0x52,0x59,0x20,0x34, +0x2, 0x5a,0x64,0x20,0x46,0x2, 0x47,0x49,0x30,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, +0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x4, 0x5, 0x25, +0x26,0x27,0x28,0x29,0x4, 0x0, 0xd2,0x2, 0x30,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x0, 0x78,0x0, 0x78,0x14,0x8, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, 0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x8, 0x37,0xf3,0x12,0x62,0xdf,0x7e,0x8, 0x37,0xfb, +0x12,0x62,0xdf,0x12,0x62,0xf4,0x12,0x62,0xfb,0x2, 0x62,0xbc,0x7e,0x37,0x37,0xf3, +0xbe,0x34,0x0, 0x0, 0x28,0x18,0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x50,0xf, 0x7e, +0xb3,0x37,0x31,0x70,0x9, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0x22,0xb, +0xa, 0x30,0xe5,0x4e,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33, +0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x2b,0xb7,0x2, 0x62,0xdf,0x7e,0x8, 0x38,0xe6,0x2, +0x62,0xdf,0x6d,0x33,0x7a,0x37,0x38,0x83,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e, +0xb3,0x2a,0x3, 0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28, +0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68, +0x17,0x7e,0x47,0x2b,0xb7,0x4d,0x44,0x78,0xf, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3, +0x38,0x85,0x7a,0xb3,0x37,0x6, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e, +0x37,0x2b,0xb7,0x7a,0x37,0x2f,0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37, +0x2b,0xb7,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37, +0x2f,0x98,0x7e,0x27,0x2f,0x9a,0x12,0x64,0x1a,0x81,0x13,0x80,0x0, 0x12,0xbd,0xbd, +0x81,0x13,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57, +0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xbd,0x58,0x12,0x64,0x16,0x74, +0x1, 0x7a,0xb3,0x2f,0x80,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88, +0x9e,0x27,0x2f,0x90,0x7e,0x14,0x62,0x8a,0x12,0x64,0xd3,0xbd,0x23,0x38,0x13,0x7e, +0x27,0x2f,0x96,0x9e,0x27,0x2f,0x8e,0x7e,0x14,0x62,0x8c,0x12,0x64,0xd3,0xbd,0x23, +0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a, +0xc7,0x2f,0x98,0x7a,0xd7,0x2f,0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d, +0x2d,0x7e,0x17,0x2b,0xbb,0x7e,0x7, 0x2b,0xbd,0x12,0x66,0xce,0xa, 0x2b,0x7e,0x73, +0x2f,0x7f,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0x64,0x16,0x7a,0xc7,0x2b,0xbb,0x7a, +0xd7,0x2b,0xbd,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24, +0x12,0x67,0xca,0x7d,0x31,0x12,0x85,0xfd,0x2, 0x64,0x2b,0x7e,0x3, 0x2f,0xa8,0xbe, +0x0, 0xf0,0x50,0x2, 0x81,0xc4,0x81,0xb9,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0, +0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34, +0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b, +0xc1,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0x66,0xce,0x7c,0x1b,0x7e,0x3, +0x2f,0x7f,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b, +0xbf,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x1f,0x8c,0x7e,0x34,0x1f,0x34,0x7e,0x30, +0x4, 0xac,0x39,0x2e,0x14,0x2b,0xbf,0x74,0x4, 0x12,0x1f,0x8c,0xb, 0x80,0x7e,0x3, +0x2f,0xa8,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8, +0x7e,0x3, 0x2f,0x7f,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec, +0x40,0x2, 0x81,0x38,0x22,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e, +0x14,0x61,0x49,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e, +0x14,0x61,0x43,0x12,0x83,0x62,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22, +0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83, +0x2a,0x70,0x12,0x87,0xd4,0xbe,0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d, +0x2e,0x7e,0x14,0x61,0x47,0x12,0x64,0xd3,0x12,0x66,0x10,0x90,0x61,0x45,0x12,0x66, +0x7, 0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0x12,0xc1,0x17,0xbe,0xa0,0x0, 0x28, +0x32,0x7d,0x14,0x9e,0x14,0x0, 0x3f,0xbd,0x1e,0x38,0x13,0x12,0x66,0xb8,0x40,0xe, +0x12,0x64,0xc5,0x12,0x65,0xfa,0x48,0x32,0x7f,0x10,0x1b,0x1c,0x80,0x2c,0x12,0x66, +0xb8,0x50,0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x64,0xcb,0x12,0x66,0x10,0x7d, +0x1f,0x80,0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x66,0xb1,0xbd,0x5e,0x38,0x16,0x12,0x64, +0xc5,0x12,0x65,0xfa,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10, +0x6d,0x0, 0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x66,0xb1,0xbd,0x5e,0x28, +0x68,0x7d,0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d, +0x35,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d, +0x22,0x7e,0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1e,0xfc,0x12, +0x66,0x14,0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, +0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x66,0x7, +0x58,0x4, 0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76, +0x7c,0x65,0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x36,0x69,0x7a, +0x73,0x36,0xdf,0x7e,0x27,0x38,0xd6,0x7e,0x14,0x61,0xc8,0x12,0x64,0xd3,0x1e,0x34, +0xbd,0x32,0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x14,0x61,0xc8,0x12,0x64, +0xd3,0xbd,0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x36,0x67,0x12,0x67,0x62,0x7e,0x37,0x36, +0x6f,0xbd,0x32,0x50,0x4, 0x7a,0x27,0x36,0x6f,0x12,0xc0,0xef,0x38,0xa, 0x12,0x8f, +0xf3,0x38,0x5, 0x12,0x8f,0xeb,0x28,0x3d,0x12,0x67,0x69,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x36,0x67,0x4, 0x7a, +0xb3,0x36,0x67,0x7e,0x73,0x36,0x67,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3, +0x36,0x67,0x12,0xc0,0x6b,0x7a,0xb3,0x36,0xdc,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x67, +0x7d,0x32,0x2, 0xad,0x89,0x2, 0x66,0xa8,0x12,0x67,0xc0,0xe4,0x7a,0xb3,0x36,0x75, +0x22,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4, +0x60,0xd1,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0xbd,0x1e,0x22,0x7d,0x51, +0x7d,0x12,0x9d,0x35,0x12,0x21,0x0, 0x7c,0xa7,0x12,0x67,0xeb,0x7c,0xb7,0xbc,0xba, +0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x67,0x15,0x50, +0x21,0x7e,0x54,0x62,0x5a,0x12,0x67,0x15,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x64, +0xd3,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x5e,0x12,0x64,0xd3,0xbd,0x32,0x28,0x2, +0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12, +0x66,0x1b,0x2, 0x67,0x25,0x7e,0xb3,0x36,0x69,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36, +0x71,0x7e,0xb3,0x36,0xdf,0x70,0x3, 0x12,0xaf,0xc, 0x7e,0xb3,0x36,0x71,0xb4,0x1, +0xc, 0x74,0x3, 0x12,0x67,0x59,0x12,0x23,0x9e,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x67, +0x59,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x34,0xae,0x7e,0x34,0x61, +0x5b,0x22,0x74,0x2, 0x7a,0xb3,0x36,0x69,0x22,0x7e,0xb3,0x36,0x75,0xb4,0x1, 0x3, +0x2, 0x67,0x62,0x7e,0xb3,0x36,0xdb,0x4, 0x7a,0xb3,0x36,0xdb,0x7e,0xb3,0x36,0x69, +0xb4,0x2, 0x18,0x7e,0xb3,0x36,0xda,0x4, 0x7a,0xb3,0x36,0xda,0xb4,0x1, 0x6, 0x74, +0x1, 0x7a,0xb3,0x36,0xdb,0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x73,0x36,0xda,0xbe, +0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x75,0x12,0x67,0x62,0x12,0xaf,0xc, +0x12,0x67,0xc0,0x7e,0x73,0x36,0xdb,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x67,0xc0,0x22, +0xe4,0x7a,0xb3,0x36,0xdb,0x7a,0xb3,0x36,0xda,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0, +0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xbf,0x12,0x67,0xf2,0x59,0x25,0x2b, +0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a,0xb3,0x2f,0xa8,0x22,0x7d,0x31,0x9d,0x30,0x2, +0x21,0x0, 0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x73,0x28,0x93,0x7a,0x73, +0x28,0x94,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22, +0x12,0xc0,0x5, 0x12,0x63,0x2, 0x7a,0x37,0x39,0x4, 0x12,0x69,0x87,0x12,0x28,0x48, +0x2, 0x68,0x23,0x12,0x69,0x84,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3, +0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca,0x79,0x7e,0x13,0x2a,0x2, 0x7e,0x78, +0x29,0xbc,0x12,0x69,0x84,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0x19, +0x7e,0xa0,0x5, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12, +0x68,0x23,0x21,0x6d,0xbc,0x20,0x50,0x3, 0x12,0x68,0x23,0x6c,0x0, 0x21,0x62,0x7e, +0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x21,0x60,0xa, +0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x21,0x43,0x12, +0x69,0x7a,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x21,0x0, 0x7d,0xd3,0x7e,0x70,0x4, +0xac,0x79,0x49,0x23,0x35,0x43,0x12,0x69,0x70,0x9d,0x32,0x12,0x21,0x0, 0x7d,0xc3, +0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x69, +0x7a,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x43,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28, +0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, 0x7a,0xb3,0x34,0x89, +0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3, +0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80,0x53,0x7e,0x50,0x9, +0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x35,0x41,0x49, +0x22,0x29,0xa, 0x59,0x27,0x35,0x43,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x34,0x88,0x80, +0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34, +0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, +0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x41,0x12,0x69,0x70,0x59,0x32,0x35,0x43, +0xb, 0x0, 0x90,0x60,0x99,0xe4,0x93,0xbc,0xb0,0x28,0x2, 0x1, 0x6f,0xda,0x79,0x22, +0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x41,0x22,0xa2,0x8, 0x22,0x7e,0x34,0xd, 0xac,0x12,0x26,0x5b,0x12,0x7a, +0x2d,0x12,0x69,0xab,0x2, 0x69,0x97,0x30,0xf, 0x10,0x12,0x6e,0x8f,0x50,0x3, 0x12, +0x6f,0x6e,0x12,0x6a,0x50,0x12,0x69,0xd1,0xc2,0xf, 0x22,0x7e,0xb3,0x2b,0x1e,0x70, +0x1f,0x12,0x26,0x57,0x12,0x2f,0xf4,0x50,0xfb,0x12,0x6a,0x50,0x12,0x88,0x17,0x20, +0xf, 0x3, 0x12,0x69,0xd1,0x74,0x2, 0x7a,0xb3,0x2b,0x1e,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12, +0x87,0x56,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0xc0,0xa2,0xf5,0x2a, +0x7e,0x73,0x2b,0xf, 0xbe,0x71,0x2a,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x91,0x67,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x44,0x6d,0x22,0x7a,0x1f,0x37,0x40,0x7c,0xbc,0x12,0x6c,0x20,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x62,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x6d,0x13,0xda,0x3b,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12, +0xbf,0xfb,0x7a,0x55,0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d, +0x7f,0x3, 0x7e,0x1d,0x2a,0x12,0x79,0x7a,0x12,0xc0,0x75,0x12,0xc0,0x22,0x75,0x2e, +0x0, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0xc0,0xff,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6a,0xd4,0x12,0xb3,0x5f,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x30,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12, +0x7b,0x20,0x7e,0x35,0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30, +0x38,0xdc,0x5, 0x2e,0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b, +0x1d,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x6d,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d, +0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x6e,0x8f,0x50,0x7c,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x6e,0x12,0x6b,0xff,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x8, 0x12,0x6d,0x34,0x38,0xea,0x6c,0xcc,0x80,0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a, +0x12,0x6b,0xff,0x75,0x3b,0x0, 0x80,0x27,0x7e,0xb3,0x37,0xb1,0xbe,0xb1,0x3b,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x60,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x62,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e, +0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12,0xc0,0x90,0x68,0xb, 0x7e,0x34,0x10, +0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x50,0x12, +0x6c,0x8, 0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70, +0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a, +0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, +0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x7f,0x78,0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe, +0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x6b,0xf6,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d, +0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80, +0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x35,0x7a,0x37,0x25,0xba,0x7e,0x35, +0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12, +0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25, +0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac, +0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37, +0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22, +0xca,0x3b,0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b, +0xf, 0xf5,0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xb9, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x60,0x7e,0x8, 0x25,0x2a, +0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbc,0x12,0xb3,0x2a,0x74,0x1, 0x7a,0xb3,0x2b,0x1d, +0x74,0x5, 0xac,0xbc,0x12,0xc0,0x19,0x74,0x5, 0xac,0xbc,0x12,0x6f,0xff,0x74,0x5, +0xac,0xbc,0x12,0xc0,0x10,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0xc2,0x3, 0x12,0xc0,0xa2,0x12,0x6d, +0x13,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, +0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x6a,0xd4,0x12, +0xbf,0xfb,0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xa8,0xef,0x12, +0xa9,0xa6,0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3, +0x2b,0x14,0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39, +0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, +0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd, +0xda,0x3b,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6e,0x29,0x30,0xc, 0xa, 0x12,0xae,0xfa, +0x30,0x3, 0x4, 0xe4,0x12,0xa, 0x66,0x30,0x3, 0x9, 0x12,0xae,0xaf,0x12,0x8d,0xef, +0x2, 0x8c,0x90,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f, +0x50,0x7e,0x14,0x22,0xe2,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x7a,0x1d,0x2c,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f, +0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c,0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x34,0x6c, +0xcc,0x80,0x4f,0x12,0x6e,0x19,0x40,0x48,0x12,0x6e,0xf, 0x50,0x43,0x74,0x2, 0xac, +0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x0, 0x7d,0x3, 0x7d, +0x31,0x12,0x21,0x0, 0xbd,0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e, +0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d, +0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34, +0xb, 0xc0,0x12,0x6d,0x34,0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12, +0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, +0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12, +0x6e,0x19,0x40,0x8, 0x12,0x6e,0xf, 0x50,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x12,0x6d, +0x34,0x38,0xec,0xb, 0xd0,0xbe,0xd0,0x3, 0x50,0x2, 0xa1,0x68,0xda,0x3b,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xb9,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x12,0x6e,0xa0,0x7a,0x37,0x2b,0x1b, +0x22,0x7e,0xa3,0x0, 0x4f,0xbe,0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xec,0x68,0x42, +0x74,0x5, 0xa4,0x12,0xc0,0x99,0x12,0x6e,0x83,0x12,0xc0,0x19,0x12,0x6e,0x83,0x12, +0xc0,0x10,0x12,0x6e,0x8f,0x50,0x9, 0x7e,0xb3,0x0, 0x4f,0x12,0xb3,0x2a,0x80,0x6, +0x12,0x6e,0x83,0x12,0x6f,0xff,0x12,0x6e,0x29,0x12,0x6f,0xf8,0x7e,0x73,0x2b,0x14, +0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x4f,0x7a,0x73, +0x3, 0xec,0x22,0x7e,0xa3,0x0, 0x4f,0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x20,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xb2,0x70,0x2, 0xc3,0x22,0xd3,0x22, +0x7e,0x23,0x2b,0xf, 0x7e,0x33,0x37,0xcd,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x0, 0xac,0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, +0xa, 0x7e,0x63,0x2b,0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe, +0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61, +0x1b,0xe4,0x93,0x7c,0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73, +0x2b,0x10,0x80,0x9, 0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b, +0x10,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c, +0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x38,0xc0,0x69,0x51,0x0, +0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d, +0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, +0x1f,0x58,0x7e,0xb, 0x70,0x7a,0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b, +0x62,0x29,0x70,0x0, 0x1, 0x7a,0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b, +0x20,0x12,0x6e,0x29,0x12,0x6f,0xf8,0xd2,0x3, 0xc2,0x4, 0x2, 0x48,0xf4,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x4f,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6f,0xea,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0xc0,0x56,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0xc0, +0x4b,0x12,0x20,0xb9,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6f,0xea,0xca,0x39,0x7e, +0x23,0x0, 0x4f,0x7e,0x30,0x38,0xac,0x23,0x12,0xc0,0x56,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x8c,0xac,0x23,0x12, +0xc0,0x4b,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6f,0x42,0x7e,0x34,0x0, 0x38,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x3, 0x8b,0x9, +0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0x7e,0x37,0x3, 0xed,0xb, 0x34,0x7a,0x37, +0x3, 0xed,0x7e,0x37,0x3, 0xef,0xbe,0x37,0x3, 0xed,0x28,0x3, 0x2, 0x70,0x23,0x22, +0x2, 0x70,0x8, 0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x70,0x20,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b, +0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e, +0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a,0xb3,0x2b,0x74,0x7a,0xb3,0x2b, +0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x25,0xee,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2, +0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93, +0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74,0xbc,0x7e,0x28, +0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3,0x2a,0x6e,0x7a, +0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3,0x2a,0x74,0x90, +0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9,0xe4,0x93,0xa, +0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a,0xa, 0x3e,0x9d, +0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a,0x78,0x90,0x60, +0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f,0xca,0x39, +0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12,0x20,0xb9,0x1b, +0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x2b,0x21,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x72,0x92,0x12,0x79,0x31,0x90,0x60, +0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76,0x12,0x70,0x59, +0x74,0x1, 0x12,0x3d,0xac,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x2, 0x12,0x73, +0xf1,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a,0xb3,0x2b,0x4, +0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0x9e,0x7a,0x37,0x2b, +0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x9, 0x7e, +0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a,0xb3,0x2b,0x62, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4,0x93,0x7a,0xb3, +0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x2b, +0xf, 0x12,0x6e,0x29,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61, +0x22,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12, +0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3, +0x2b,0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61, +0x20,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b, +0x14,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d, +0x7a,0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64, +0xe4,0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61, +0x7e,0x34,0x20,0x5b,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x12,0xc0,0xab,0x12,0x72,0xf4,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x72,0xdb,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x72,0xdb,0xa, +0x1b,0x2e,0x14,0x2a,0x7c,0x12,0x72,0xe8,0xe5,0x25,0x12,0x72,0xdf,0xa, 0x1b,0x2e, +0x14,0x2b,0x23,0x12,0x72,0xe8,0xe5,0x24,0x2, 0x20,0xde,0x7e,0x34,0x0, 0x2, 0x12, +0x20,0xde,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, +0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a, +0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x73,0x20,0x38,0xef,0x12,0x73,0x20,0x68,0x7, +0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22, +0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x12,0x77,0xfd,0x12,0x70,0xa7,0x12,0x0, +0xa, 0x12,0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8, +0x7e,0x1f,0x6, 0xf4,0x12,0x79,0x9d,0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e, +0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12, +0x79,0x7a,0x12,0x79,0x2e,0x12,0x25,0x45,0x12,0x73,0xa7,0x12,0x73,0x7f,0x2, 0x73, +0x71,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x12, +0x73,0xe5,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, 0x28,0xae,0x74,0xff,0x12,0x20, +0xde,0x12,0x9f,0xe3,0x7e,0x8, 0x29,0xbc,0x12,0x5e,0x61,0x7e,0x8, 0x2a,0x2, 0x7e, +0x34,0x0, 0xb, 0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4, +0x12,0x20,0xde,0x90,0x60,0x9c,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74, +0xff,0x12,0x20,0xde,0x90,0x60,0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26, +0xb4,0x74,0xff,0x12,0x20,0xde,0x90,0x60,0x9a,0x12,0x73,0xe8,0x7e,0x8, 0x27,0x76, +0x74,0xff,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78, +0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc, +0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, +0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80, +0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73, +0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d, +0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a, +0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26, +0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x75,0xb2, +0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d, +0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53, +0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x75,0x9f,0xb, +0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80, +0x19,0x12,0x75,0xa8,0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58, +0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3, +0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x75,0x97,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12, +0x75,0xb2,0xb, 0x6a,0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d, +0x2d,0x7e,0x67,0x2a,0x51,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, +0x90,0x12,0x75,0x9f,0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, +0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x75,0xa8,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c, +0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12, +0x74,0x3c,0x38,0xab,0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, +0x12,0x75,0x97,0x2d,0x15,0x6c,0xaa,0x80,0xe, 0x12,0xa5,0xe4,0xb, 0x7a,0x90,0xbd, +0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xed,0x7a,0xb7,0x8, 0x4, +0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32, +0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e, +0x74,0x62,0x10,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d, +0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31, +0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0xa6, +0x56,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x75,0x97,0x7e,0xd, 0x24,0x2d,0x15,0x7f, +0x13,0x2d,0x35,0x12,0x6d,0x3b,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a, +0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x75,0xbc,0x7e,0x37,0x28, +0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x75, +0xbc,0x12,0x76,0x2b,0x12,0xa7,0x45,0x2, 0x76,0x1a,0xe4,0x7a,0xb3,0x3, 0xff,0x7e, +0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x3, 0xff,0x22,0xca,0x3b,0x7e,0xf3,0x2a, +0x6e,0x12,0xc0,0xb4,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, +0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0xa7,0xcd,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda, +0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0xbb,0x95,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, +0xf8,0x12,0x3f,0xf2,0x12,0x76,0x9a,0x12,0x74,0x43,0x7e,0xb3,0x16,0x90,0xb4,0x1, +0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26, +0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x20, +0xde,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26, +0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0xbf,0xeb, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0xbf,0xc7, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x86,0x12,0xc0, +0x40,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x89,0x12,0xc0, +0x40,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3, +0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0xbf,0xeb,0x7e,0x50,0x1, 0x12,0x77,0x60,0x7a, +0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0xbf,0xc7,0x7e,0x50,0x1, 0x12,0x77,0x60, +0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22, +0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0, +0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4, +0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0, +0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, +0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c, +0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b, +0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f, +0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0xe4,0x7a,0xb3, +0x37,0x9c,0x7a,0xb3,0x37,0x9d,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0x9e,0x90,0x60, +0x51,0xe4,0x93,0x7a,0xb3,0x37,0x9f,0xe4,0x7a,0xb3,0x37,0xa0,0x90,0x60,0x99,0x93, +0x7a,0xb3,0x37,0xa1,0xe4,0x7a,0xb3,0x37,0xa2,0x7a,0xb3,0x37,0xa3,0x90,0x61,0xc4, +0x93,0x7a,0xb3,0x37,0xa5,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34, +0x7a,0x73,0x37,0xa9,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a, +0x73,0x37,0xaa,0x74,0x64,0x7a,0xb3,0x37,0xbb,0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3, +0x37,0xbc,0x90,0x61,0x17,0xe4,0x93,0x7a,0xb3,0x37,0xa8,0x90,0x61,0x19,0xe4,0x93, +0x7a,0xb3,0x37,0xbe,0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x37,0xbd,0x90,0x61,0x1d, +0xe4,0x93,0x7a,0xb3,0x37,0xbf,0x90,0x61,0x25,0xe4,0x93,0x7a,0xb3,0x37,0xba,0xe4, +0x7a,0xb3,0x37,0xb5,0x74,0xfa,0x7a,0xb3,0x37,0xb3,0x74,0x1e,0x7a,0xb3,0x37,0xb4, +0x74,0x1, 0x7a,0xb3,0x37,0xb2,0x74,0xc, 0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3, +0x37,0xb6,0xe4,0x7a,0xb3,0x37,0xb7,0x7a,0xb3,0x37,0xb8,0x7e,0x8, 0x37,0xc0,0x7e, +0x34,0x0, 0x2c,0x12,0x20,0xde,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0xa, 0x36,0x7a, +0x73,0x37,0xcb,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0x7a,0x73,0x37,0xcc,0x90,0x60, +0xd4,0x93,0x7a,0xb3,0x37,0xcd,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x37,0xce,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b, +0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xe9,0x74,0x1, 0x7a,0xb3,0x37,0xe0,0x7e,0x34,0x0, +0x28,0xca,0x39,0x7e,0x34,0x61,0xd5,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12, +0x20,0xb9,0x1b,0xfd,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0x2, 0x23, +0xa6,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x6d, +0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x20, +0xde,0x7f,0x6, 0x7d,0x3f,0x12,0x20,0xde,0x7a,0xb3,0x16,0x91,0x22,0x7f,0x70,0x7e, +0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c, +0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x20,0xde,0x7f,0x7, 0xa, +0x3a,0x2, 0x20,0xde,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15, +0x12,0x79,0x9d,0x12,0x3f,0xd2,0x7e,0xe0,0x1, 0x12,0x4f,0xaf,0x30,0x18,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x7b,0x29,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac, +0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15, +0x12,0x7b,0x20,0xb, 0xd0,0x7e,0x73,0x2a,0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, +0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c, +0xbf,0x2e,0x73,0x2a,0x73,0x12,0x7a,0x8e,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b, +0x2, 0x70,0x41,0x12,0x2f,0xf4,0x50,0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x7a,0x75, +0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x72,0x12,0x79,0xc4,0x74, +0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x7a,0x75,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f, +0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x79,0xc4,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4, +0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x3d,0xac,0x7c,0xba,0x12,0x13, +0xc7,0x74,0xa, 0x12,0x45,0x15,0x7c,0xb9,0x12,0x0, 0x1e,0x2, 0x4e,0xe7,0xca,0xd8, +0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0x7b,0xd0,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74, +0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11, +0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x1f,0x7, 0x1b,0x6a,0x30,0xb, 0xd0,0xbc, +0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3, +0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73,0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c, +0x7f,0x12,0x7a,0x8e,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12, +0x20,0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, 0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, +0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22, +0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, +0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x29,0x6f,0x7c,0xe7,0x80,0x5d,0x12,0x26,0x57, +0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x12,0x7b,0x29,0x6c,0xdd,0x80,0x3d, +0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, +0x1d,0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19, +0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x3f,0xb, 0xbe,0xb0, +0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x7b,0xb7, +0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa, +0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53,0x2a, +0x73,0xa, 0x25,0x2d,0x23,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22, +0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa, +0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38, +0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, +0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e, +0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x37,0xed,0x40,0x39,0x7e,0x37,0x37,0xed,0xb, 0x34,0x7a,0x37, +0x37,0xed,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x34,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x38,0xfb,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x70,0x5, 0x7e,0xb3,0x37,0x9c,0x22,0xbe,0xb0,0x3, 0x38,0x15, +0x75,0x1b,0x0, 0x30,0xe, 0x6, 0x7e,0x18,0x32,0xea,0x80,0x4, 0x7e,0x18,0x33,0x28, +0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e, +0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4, +0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xed,0x80,0x2, 0x15,0x1a,0x2, +0x7c,0x17,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x7d,0x61,0xbe,0xb0,0x80, +0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x61,0x22,0xb4,0xfc, +0x5, 0x7e,0xb3,0x37,0x8, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60, +0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x36,0x71,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22, +0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74,0xff,0x22,0x7c,0x7b,0x6c,0xaa,0x12, +0x3f,0xe1,0x78,0x9, 0x7c,0xb7,0x12,0x7c,0x64,0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, +0x7c,0xb7,0x12,0x37,0xeb,0x7c,0xab,0x7c,0xba,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5, +0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5, +0x1a,0x12,0x3f,0xb3,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12, +0x7c,0xfb,0xf5,0x91,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0, +0x82,0x12,0x7d,0x1a,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b, +0x32,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x37,0xf2,0x7e,0x73,0x37,0xf2,0xa, 0x27,0x2e, +0x24,0x0, 0x6, 0x12,0x51,0x4f,0x93,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x37,0xf2, +0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x37,0xf2,0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0x9b,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0x9b,0x7a, +0xa3,0x36,0xf2,0x22,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37,0x9c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, +0xe4,0x7a,0xb3,0x37,0x9c,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba, +0x12,0x7d,0xab,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3, +0x7c,0x7a,0x12,0x7e,0x45,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xdf,0x38, +0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x7e,0x21,0xa5,0xbb,0x8f,0x3, 0x75,0x19, +0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x44,0xc0,0x74,0x1, 0x7a,0xb3,0x33,0xff, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68,0x17,0x1b,0x61,0x68, +0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x36,0xe1,0xd2,0xd, 0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37, +0xef,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37, +0xef,0x15,0x1a,0x7e,0x27,0x37,0xef,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, +0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a,0xea, +0x22,0x7e,0xb3,0x37,0xf1,0x4, 0x7a,0xb3,0x37,0xf1,0xe5,0x19,0xb4,0x1, 0x8, 0xe4, +0x7a,0xb3,0x37,0xf1,0x75,0x19,0x0, 0x7e,0x73,0x37,0xf1,0x7a,0x73,0x36,0xf0,0x22, +0xe4,0x7a,0xb3,0x37,0x9c,0x7e,0x8, 0x32,0xea,0x12,0x7e,0xef,0x7e,0x8, 0x33,0x28, +0x7e,0x34,0x0, 0x3e,0x12,0x20,0xde,0x7e,0x18,0x32,0xea,0x7a,0x1d,0x14,0x12,0x7e, +0xd1,0x2, 0x7e,0xc4,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0x9c,0xf5,0x91, +0x22,0x2, 0x7e,0xd4,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e, +0x34,0x0, 0x3e,0x74,0xff,0x2, 0x20,0xde,0x7c,0xab,0x12,0x3f,0x52,0x7c,0xba,0x12, +0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x7f,0x67,0x49,0x35,0x34,0x3b,0x49,0x15, +0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40,0x15,0xbe, +0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12,0x7f,0x6f, +0x28,0xe, 0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, 0x80,0x2, +0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c, +0x7c,0xb9,0x12,0x31,0x27,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, +0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88,0x7f,0x10, +0x7f,0x4, 0x12,0x1e,0xeb,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x75, +0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b,0x2a,0x0, +0x1b,0x1a,0x10,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e, +0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12, +0x21,0x0, 0xe5,0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0, +0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e, +0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12,0x87,0xbc,0x90, +0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, +0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x87,0xd4,0xbe,0xc4, +0x0, 0x3f,0x38,0x1c,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61,0x3b,0x12,0x81, +0x2, 0x12,0x80,0xf1,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xee, +0x12,0x66,0xb1,0xbd,0x5c,0x38,0x21,0x7d,0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12, +0x81,0x2, 0x90,0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b, +0x7c,0x12,0x80,0xf9,0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b, +0x1b,0x54,0xbd,0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f, +0x80,0xa, 0x7d,0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x87,0xcc,0x7f, +0x17,0x12,0x1e,0xfc,0x7f,0x71,0x12,0x81,0x1c,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40, +0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d, +0x22,0x2f,0x71,0x12,0x80,0xf1,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, +0x90,0x61,0x3a,0xe4,0x93,0x12,0x80,0xf9,0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f, +0x22,0x90,0x61,0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d, +0x22,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d, +0x2e,0x7c,0x76,0x7c,0x65,0x7f,0x71,0x22,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65, +0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12, +0x9f,0x40,0x7d,0x3, 0x74,0x9, 0xac,0xbf,0x12,0x87,0xe5,0x49,0x35,0x28,0xae,0x12, +0x81,0xbf,0x12,0x81,0x18,0x7d,0x13,0x5e,0x30,0xfc,0x7e,0x70,0x9, 0xac,0x7f,0x49, +0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d, +0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34, +0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x12,0x81,0xb3,0x12,0x81, +0x18,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, +0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30, +0xda,0x79,0x22,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d, +0x32,0x12,0x21,0x0, 0x7d,0x13,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b,0x74, +0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3,0x49, +0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x81,0xbf,0x7d,0x3f,0x9d,0x35,0x12,0x21, +0x0, 0x9d,0x34,0x12,0x21,0x0, 0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0xf, 0x12,0x67,0xeb,0x7e,0x14,0x62,0x6a,0x12,0x87,0xee,0x50, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7, +0x2f,0x9e,0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7, +0x2f,0x9a,0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x81,0xc7, +0x70,0x2, 0x61,0x45,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70, +0x9, 0x7e,0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45, +0x7e,0x73,0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f, +0xa4,0x7e,0x17,0x2f,0xa6,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45,0x7e,0x34,0x62,0x72, +0x12,0x83,0x4a,0x28,0x4a,0x7e,0x34,0x62,0x70,0x12,0x83,0x54,0x50,0x41,0x7e,0xb3, +0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0x9e,0x12,0x83,0x5e,0x7d,0x8f, +0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0x87,0xc4,0x9d, +0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40,0x2, 0x61, +0x45,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7b,0x7e,0xf0,0x21,0x80,0x76,0x7e, +0x34,0x62,0x7a,0x12,0x83,0x54,0x28,0x6d,0x7e,0x34,0x62,0x78,0x12,0x83,0x4a,0x50, +0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62,0x7e,0x12,0x23,0x9e,0x12,0x83, +0x5e,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50,0x4a,0x7e,0x34,0x62,0x7c,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7,0x2f,0x82,0x28,0x37,0x7d,0xfb, +0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x26,0x12, +0x67,0xf2,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd,0x49,0x25,0x2b,0xab,0x49,0x5, +0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, 0x9d,0x32,0xbe,0x34,0x0, 0x10, +0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xf0,0xbd,0xfc,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xbd,0xfb,0x22,0x7e,0x14, +0x62,0x8e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22,0x12,0x86,0x69,0x7a,0x37,0x2f, +0x9c,0x12,0x85,0xf4,0x7a,0x37,0x2f,0x9e,0x12,0x82,0x16,0x60,0x1, 0x22,0x7e,0x73, +0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f,0x80,0x2, +0x83,0x92,0xca,0xf8,0x7e,0x45,0x24,0x7c,0xb9,0x7a,0xb3,0x38,0x3f,0x74,0xff,0x7a, +0xb3,0x38,0x3e,0x6d,0x55,0x80,0x19,0x7d,0xf5,0x3e,0xf4,0x12,0x86,0x74,0x7d,0xe5, +0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54, +0xbd,0x45,0x38,0xe3,0x7e,0x33,0x38,0x3f,0xbe,0x30,0x4, 0x38,0x2, 0x81,0x54,0x69, +0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e, +0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x40,0x7a,0xb3, +0x38,0x42,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f, +0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x38,0x42,0x7d,0xf, 0x2d,0xf, 0xbd, +0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x38,0x42,0xa, 0x37,0x6d,0x22,0x12, +0x1e,0xeb,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7a,0x73,0x38,0x42,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x84,0x73,0x12, +0xbf,0x1c,0x12,0x84,0x73,0x12,0x84,0x7c,0x12,0x84,0x73,0x12,0xa5,0x28,0x80,0xa, +0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x38,0x3e,0xe4,0x7a,0xb3,0x38,0x3f,0x7e, +0x73,0x39,0x1, 0xbe,0x73,0x38,0x3e,0x48,0x6, 0x7e,0xb3,0x38,0x40,0x80,0x1, 0xe4, +0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71, +0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a, +0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0xa1,0x9d,0x7e,0x90,0x2, 0xac,0x9a, +0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x26,0x7f,0x67,0x2d, +0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f, +0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a, +0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe, +0xf0,0x2, 0x58,0x2, 0xa1,0x9b,0xbe,0x60,0x0, 0x18,0x2, 0xa1,0x83,0xbe,0x70,0xec, +0x28,0x2, 0xa1,0xa7,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7, +0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x85,0xeb,0x19,0xba,0x22, +0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x85,0xeb,0x19,0xba,0x23,0xe4,0x9, 0xba, +0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7, +0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0x85, +0xeb,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12,0x85,0xe2,0x19,0xbd,0x22,0xf5,0xa, 0xd9, +0x12,0x85,0xe0,0x19,0xbd,0x23,0xe5,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe, +0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12, +0x85,0xe0,0x19,0xbd,0x22,0xf4,0xa, 0xc9,0xa, 0xd4,0x12,0x85,0xe0,0x19,0xbd,0x23, +0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f,0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, +0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23,0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x38, +0x3f,0xbc,0xba,0x28,0x2, 0x81,0x9b,0x7a,0x73,0x38,0x3f,0x7e,0xa0,0x1, 0x80,0x25, +0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d, +0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e, +0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x38,0x3f,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22, +0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c, +0xbd,0xa, 0xa7,0x22,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0x86,0x69,0x7a,0x37,0x2f,0xa0,0x12, +0x85,0xf4,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0x86,0x69,0x7a,0x37,0x2f, +0xa4,0x12,0x85,0xf4,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7c,0xab, +0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4,0x14, +0x78,0xfb,0x12,0x86,0x72,0x2d,0xfe,0x80,0xf, 0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x12,0x86,0x72,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a, +0xbd,0xf4,0x38,0xd0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61, +0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b, +0x7e,0x63,0x2a,0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10, +0x7d,0x21,0x12,0x87,0xdc,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34, +0x37,0x44,0x6d,0x22,0xe4,0x2, 0x86,0x7e,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b, +0x68,0x4f,0x12,0x87,0x56,0x7c,0x3b,0x7c,0xb2,0x12,0x87,0x56,0x7c,0xab,0xbe,0x30, +0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12, +0x91,0x67,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e, +0x34,0x16,0x93,0x6d,0x22,0x30,0x16,0x3, 0x2, 0x86,0xc7,0x7e,0xb3,0x2b,0x1d,0xb4, +0x1, 0xf, 0x12,0xbf,0xfb,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x86, +0x7e,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, +0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40, +0xe9,0x74,0xff,0x22,0x7e,0xb3,0x37,0x31,0x70,0x6, 0x12,0x87,0xad,0x2, 0x87,0xb6, +0x12,0x63,0x9, 0x12,0xbd,0x4d,0x50,0xa, 0x12,0x83,0x6a,0x7c,0x3b,0x12,0x87,0xad, +0x80,0x5, 0x12,0xbd,0xf4,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xbc,0xd1, +0x60,0xa, 0x7a,0x33,0x37,0x34,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4,0x7a,0xb3, +0x2f,0x80,0x22,0x2, 0x81,0x23,0xe4,0x7a,0xb3,0x38,0xdd,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x3e,0x24,0x7e,0xf, +0x38,0xd9,0x2d,0x12,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x32,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74,0x6, +0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x5, 0x7d,0x53,0xbe,0x54,0x0, 0xff, +0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x12,0x6e,0x8f,0x50,0x3, 0xd2,0xf, 0x22,0xc2, +0xf, 0x22,0x12,0xac,0xc6,0x12,0x88,0x2b,0x2, 0x88,0x17,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x20,0xde,0x12,0xaa,0x3e,0x12,0xaa,0x35,0xa9,0xd1,0xcb, +0x12,0xc0,0xff,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0xb4,0x4d,0x2, 0xd, 0x7, 0x12, +0x54,0x94,0x12,0x88,0xb9,0x12,0x8c,0xad,0x7e,0xb3,0x37,0x6, 0xb4,0x1, 0x1e,0x7e, +0x34,0x61,0xc0,0x12,0x87,0xcc,0x7e,0x24,0x0, 0x5, 0xad,0x12,0x7a,0x17,0x28,0xa1, +0x7e,0x14,0x61,0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39, +0x11,0x60,0x7, 0x14,0x7a,0xb3,0x39,0x11,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, +0x12,0x88,0x22,0x12,0x8c,0x90,0x12,0xb3,0xa9,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12, +0xbb,0x10,0x12,0xaa,0x47,0x2, 0x8d,0x10,0x22,0x7e,0x90,0x1, 0x7e,0xb3,0x2f,0xa9, +0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xa9,0x7e,0x34,0x61,0xc0,0x12,0x23, +0x9e,0x12,0xc0,0x87,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x12,0x8c,0x87,0xb, 0x1a, +0xf0,0x7e,0x34,0x61,0x4f,0x12,0x87,0xbc,0xe4,0x7a,0xb3,0x28,0xac,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x7e,0x34,0xff,0xfa,0xad,0x3f,0x12,0x8f,0xdc,0x7d,0xc3,0xe, 0xc4, +0x7e,0xe7,0x7, 0xfe,0xbd,0xe3,0x58,0x15,0x7e,0xe7,0x7, 0xfc,0xbd,0xec,0x58,0xd, +0x12,0x8a,0x7c,0x8, 0x8, 0x12,0x8b,0xe, 0x60,0x3, 0x12,0x8a,0x95,0x12,0x8b,0xe, +0xa, 0xeb,0x4d,0xee,0x68,0x3b,0x6d,0xee,0x9d,0xef,0xbe,0xe7,0x7, 0xfe,0x18,0x6, +0xbe,0xe7,0x7, 0xfc,0x8, 0x2b,0x12,0x8a,0x7c,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12, +0x21,0x0, 0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x8a,0x74,0x28,0x14,0x7e,0x83,0x28, +0x85,0xbe,0x80,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xcf,0x58,0x3, 0x12,0x8a, +0x95,0x12,0xad,0x5, 0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xc0,0xf7,0x68,0x6, +0x7e,0xb3,0x39,0xb, 0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x7d,0x12,0x8a,0x74, +0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0xad,0x43,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x12,0x8a,0xa6,0x7c,0x9b,0x80, +0x1a,0x7e,0xb3,0x26,0x84,0x70,0x14,0x7e,0xb3,0x26,0x85,0x70,0xe, 0x12,0x8a,0x74, +0x28,0x9, 0x7e,0x90,0x3, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0xc7,0x7, 0xfa,0xbe, +0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x8a,0x74,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7, +0x28,0x8e,0x58,0x8, 0x12,0x8a,0x87,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0x29,0x7e,0x14, +0x61,0xc0,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0x7e,0x14,0x61, +0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x12,0x0, 0x66,0x50,0xd, 0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x8f,0xe3,0x28,0x3, 0x12,0x8a,0x87,0x7e,0xc7,0x28,0x8a, +0xbd,0xcd,0x8, 0x19,0x12,0x9b,0xf, 0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28, +0x8e,0x58,0xa, 0x12,0x0, 0x66,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x8b,0x8e, +0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x2, 0x12,0xac,0x6d,0x7e,0xb3,0x2f,0xaa,0xbe, +0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xaa,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8c,0x7f,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0x6d,0xee,0x9e,0xe7, +0x2a,0x5a,0xbe,0xe7,0x28,0x8e,0x22,0xe4,0x7a,0xb3,0x2f,0xaa,0x7a,0xb3,0x28,0xac, +0x74,0x2, 0x2, 0x29,0xfa,0x74,0x2, 0x7a,0xb3,0x2f,0xaa,0xe4,0x7a,0xb3,0x2f,0xa9, +0x12,0x8c,0x7f,0x2, 0x29,0xfa,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x8c,0x87, +0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x8b,0x6, +0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e, +0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x4, +0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11, +0x7e,0x34,0xff,0xfd,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0, +0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x1e,0xb9,0xbd,0x34,0x22,0x6c,0x66, +0x90,0x60,0xa7,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28, +0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14, +0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x9d,0x8b,0x50, +0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, +0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e, +0x73,0x2a,0x6d,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0xca,0x3b, +0x12,0xa6,0x4e,0x38,0x2, 0x81,0x55,0x7e,0xc3,0x2f,0xad,0x4c,0xcc,0x78,0x3d,0x7a, +0xb3,0x2f,0xad,0xe4,0x7a,0xb3,0x2f,0xaf,0x6c,0xaa,0x80,0x26,0x12,0x8c,0x60,0x7e, +0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a,0x49,0xd0,0x19, +0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8c,0x6a,0x59,0x34,0x0, 0x2, +0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c,0xfc,0x6c,0xaa, +0x80,0x35,0x12,0x8c,0x60,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, 0xb4,0x0, 0x8, +0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8c,0x6a,0x7d,0x23,0x49,0x34,0x0, 0x2, 0x9d, +0x32,0x12,0x21,0x0, 0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x4c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x2f,0xaf,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x8c, +0x60,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x4c,0x0, 0x12,0x8c,0x71,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x2f,0xaf,0x80,0x6, 0x12,0x8c,0x71,0x75,0x4c,0x0, 0xe5,0x4c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xb0,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x40,0xe4,0x7a,0xb3,0x2f,0xae,0x7a,0xb3,0x2f,0xad,0x7a,0xb3,0x2f,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22, +0x12,0x8c,0xcd,0x6d,0x33,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x5, 0x12,0x8d,0x5e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xf6,0xe4,0x7a,0xb3,0x36,0x72,0x22,0x12,0xb0,0x94, +0x60,0x1a,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x7e,0x37,0x38, +0xd2,0x12,0x25,0x3c,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x23,0x12,0x8d,0x8, 0x28, +0x26,0xa, 0x4a,0x9, 0x64,0x36,0x76,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x42,0x38,0xcc,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x80,0xb, 0xa0,0x7e, +0xb3,0x36,0x73,0xbc,0xba,0x38,0xd5,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xae,0xa2,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x8d,0x5e,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x84, +0x49,0x12,0x36,0x80,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x84,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x36, +0x84,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x36,0x80,0x59,0x32,0x36,0x84,0x22,0x7e,0xb3,0x36,0x66, +0x60,0x6, 0x14,0x7a,0xb3,0x36,0x66,0x22,0x12,0x8c,0xcd,0x90,0x61,0xc5,0xe4,0x93, +0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x8d,0xef,0x7e,0xb3,0x36,0xec,0x70,0xe, 0x7e,0xb3, +0x39,0x12,0xb4,0x1, 0x7, 0xe4,0x12,0x8d,0xb3,0x12,0xc0,0x6b,0x12,0x67,0x1f,0x12, +0x8e,0xa2,0x7e,0xa3,0x36,0xec,0x7a,0xa3,0x39,0x12,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x8d,0xb3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf,0x12,0xc0,0x99,0x12,0xc0, +0x19,0x12,0x6f,0xff,0x12,0xc0,0x10,0x7a,0xf3,0x0, 0x4f,0x7c,0xbf,0x12,0xb3,0x2a, +0x12,0x6e,0x29,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37,0x12,0xae,0xe1,0x12,0x8d, +0xef,0x12,0x23,0x4, 0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8,0x22,0x12,0x8f,0xd2,0x7e, +0xb3,0x2b,0xf, 0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xc0,0x7e,0x73,0x37,0xcd,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36, +0x12,0x8f,0xca,0xbe,0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x36,0x72,0xa, 0x3e,0xad, +0x3b,0x7d,0xa3,0x2d,0xac,0x75,0x35,0x0, 0x7e,0xa3,0x36,0x72,0xbc,0xad,0x40,0x2, +0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e, +0x78,0xe, 0x7c,0xbd,0x14,0xbe,0xb3,0x36,0x72,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x72, +0x7e,0xc3,0x36,0x72,0x80,0x41,0x7e,0xb3,0x36,0x72,0x4, 0x7a,0xb3,0x36,0x72,0x7e, +0x90,0x5, 0xac,0x9c,0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb, +0x19,0xcd,0x36,0x76,0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, +0xf5,0x35,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0, +0xbe,0xf0,0x3, 0x50,0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x36,0x73,0xda, +0x3b,0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0x37,0x7e,0xb3,0x36,0x6b, +0xb4,0x1, 0x8, 0x12,0x88,0x22,0xe4,0x7a,0xb3,0x36,0x6b,0x7e,0xb3,0x36,0x6a,0x60, +0x4, 0x74,0xff,0xe1,0xc5,0x7e,0xb3,0x36,0x69,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xb9, +0x12,0xc0,0xef,0x38,0xc, 0x12,0x8f,0xf3,0x38,0x7, 0x12,0x8f,0xeb,0x38,0x2, 0xe1, +0xb9,0x12,0x8f,0xca,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, +0x80,0x3, 0x7c,0xbd,0x14,0x12,0xae,0x11,0x7c,0xfb,0x7e,0xb3,0x36,0x68,0x4, 0x7a, +0xb3,0x36,0x68,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xae,0x11,0x7c,0xab,0xbe,0xa0, +0xff,0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x36, +0x7e,0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, +0x12,0xae,0x98,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe, +0xf0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x68,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36, +0x75,0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x36,0x68,0x50,0x59, +0x74,0xc, 0xac,0xbf,0x49,0x25,0x36,0x7e,0x7e,0x14,0x61,0xcc,0x12,0x64,0xd3,0xbd, +0x23,0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0x9e,0xbe,0x37,0x36,0x64,0x40,0xd, +0x7e,0x34,0x61,0xd2,0x12,0x23,0x9e,0xbe,0x37,0x36,0x6f,0x50,0x23,0x74,0x5, 0xac, +0xbf,0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, +0x50,0x8, 0x12,0x87,0x52,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x6b, +0xe4,0x7a,0xb3,0x36,0x75,0x7a,0xb3,0x36,0x69,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a, +0xb3,0x36,0x68,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x90,0x61,0xc5,0xe4,0x93,0x7c, +0xdb,0x22,0x12,0xae,0xaf,0x74,0x1, 0x7a,0xb3,0x36,0x66,0x22,0x7e,0x24,0x0, 0x2, +0x2, 0x1e,0xb9,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26,0xf5,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf3,0x2a, +0x70,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3, +0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3, +0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x90, +0x50,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f, +0x36,0x6d,0x0, 0x12,0x1f,0x7, 0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x7, 0xda,0xf8,0x22, +0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8, +0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x6f, +0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x5c, +0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x60, +0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, +0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f, +0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x74,0xc8,0x7a,0xb3,0x39,0x6, 0xc2,0x17, +0x80,0xa, 0x12,0x45,0xd6,0x30,0x17,0x4, 0x75,0xe9,0xff,0x22,0x12,0x47,0xff,0x68, +0xf1,0x22,0x74,0x1, 0x12,0x90,0xf1,0x20,0x17,0x6, 0x12,0x46,0x4e,0x12,0x90,0xfa, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x90,0xb8,0x12,0x90,0xfa,0xe4,0x2, 0x90, +0xf1,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0x22,0xd2,0x4, 0x2, 0x45,0x5a,0xa, +0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x47,0xff,0x68,0xfb,0x20,0x93,0xfd, +0x22,0x7e,0x34,0x61,0x59,0x2, 0x23,0x9e,0x7e,0xb3,0x37,0x6, 0x70,0x2e,0x7e,0x73, +0x36,0xe9,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0x3, +0x7e,0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x91,0x6d,0x7c,0xab,0xe5,0x4e, +0xa, 0x3b,0x2e,0x37,0x38,0x83,0x7a,0x37,0x38,0x83,0x80,0xc, 0x7e,0xa3,0x36,0xea, +0xbe,0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x91,0x5d,0x75,0x4e,0x0, +0x7a,0xb3,0x39,0x6, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x20,0xf0,0x7a,0x71,0x82, +0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xb3,0x38,0x86,0x70,0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x38,0x86,0x22,0x7f,0x20,0xc2,0x4, 0x7e,0x2b,0x60,0x29,0x72,0x0, +0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21,0x0, 0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32, +0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x21,0x0, 0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d, +0x32,0x12,0x21,0x0, 0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60, +0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x37,0xf3,0x4d,0x33,0x68,0x2, +0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f,0x70,0x7c, +0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e, +0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12,0x87,0xbc,0x6c,0xff,0x12,0x2f,0xff,0x7f,0x51, +0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, 0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b, +0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e,0x14,0x62,0xa, 0x12,0x87,0xee,0x8, 0xc, 0x7e, +0x27,0x28,0x8a,0xbe,0x24,0x3, 0x20,0x8, 0x2, 0x61,0x2a,0xb, 0xa, 0xc0,0x1e,0xc4, +0xbd,0x3c,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x61,0x2a, +0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0, +0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca, +0x18,0x5, 0x4e,0xf0,0x1, 0x61,0x2a,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a, +0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa, +0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc, +0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90, +0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd, +0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b, +0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, +0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, +0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b, +0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0x40,0xbd,0x3d,0x22,0x7f,0x60,0x7e,0x6b,0xa0, +0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, +0x2d,0x15,0xb, 0x14,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0, +0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76,0x7d,0x13,0x1e, +0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e, +0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b, +0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xca,0x3b,0x6d,0x11,0x7e,0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c, +0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12,0x95,0x90,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x34,0xca,0x74,0x2, 0xa, 0x3f,0x19,0xb3,0x35,0x34,0xb, 0xf0,0x12,0x5e,0x2d, +0x38,0xe1,0x12,0x97,0xc0,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0xa1,0x69,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, +0x12,0x95,0xa1,0x38,0x2, 0xa1,0x67,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x4d,0x75,0x24,0x0, 0xa1,0x3f,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xca,0xbc,0xcd,0x68,0x2, 0xa1,0x3d,0x49,0x25,0x34,0xc8,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x0, 0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc6,0x74,0x9, 0xac,0xbf,0x12,0x96,0x1b,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x34,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x20,0xa, 0x1c,0x2e,0x14,0x35,0x34,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x67,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x69,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x1f,0x8c,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x97,0xae,0xac,0x3f,0x12,0x95,0x98,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x95,0x98,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x20,0x80,0x2a,0x5, 0x24,0x90, +0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0x81,0x49,0x80,0x1a,0x6d,0x11,0x74, +0x2, 0xac,0xbd,0x12,0x95,0x90,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1,0x34,0xca,0x74, +0x2, 0xa, 0x1d,0x19,0xb1,0x35,0x34,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x25,0xe4, +0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x5f,0xc6,0xca,0x59,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x34,0xc6,0x12,0x20,0xb9,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, 0xda,0x3b,0x22, +0x59,0x15,0x35,0x20,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x1f, +0x8c,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80, +0x63,0x6c,0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac, +0xbe,0x9, 0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x95,0xa1,0x38,0xe5, +0x12,0x95,0xa1,0x28,0x43,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x81,0xb3, +0x74,0x9, 0xac,0xbd,0x12,0x87,0xe5,0x12,0x96,0x1b,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8b,0x59,0x35,0x34,0xb0,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x87,0xb3,0xb, 0xe0,0xbc,0xfe,0x38,0x99,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x21,0x0, 0x7e,0xb3,0x37,0x31,0x70,0x3, 0x12,0x93,0xe3,0x2, 0x96,0x30, +0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x96, +0x7c,0x7c,0xbf,0x12,0x97,0x10,0x4c,0xee,0x78,0x14,0x12,0x5f,0xc2,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0x80,0xb, 0x7e,0xb3, +0x2a,0x9, 0x70,0x5, 0x7c,0xbf,0x12,0x95,0xa9,0x7c,0xbf,0x12,0x9f,0x90,0xbe,0xf0, +0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4, +0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, 0x2, 0x96,0xeb,0xa5,0xbe,0x0, 0x1d,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, +0xa0,0x12,0x5e,0x25,0x38,0xed,0x74,0x1, 0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x47,0x81,0x1b, +0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x47, +0x81,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0x12,0x97,0x4, 0x7e,0x8, +0x34,0xb0,0xe4,0x12,0x20,0xde,0x90,0x60,0x99,0x12,0x97,0x8, 0x7e,0x8, 0x34,0x8b, +0xe4,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60,0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x97,0xb6,0x7c,0x7d, +0x7c,0x6f,0x12,0x97,0xb6,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x97,0xae,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x1f,0x8c,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x2e,0x34, +0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x8, 0x1f,0x34,0x12,0x9e,0x37,0x7c,0x1b,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x34,0x9f,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x34,0x9f,0x1e,0x34,0x7a,0x37,0x34,0x9f,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9f,0x7e,0x37,0x34,0x9f,0x22,0xca,0xf8,0x7c,0xfb, +0x6d,0xdd,0x7c,0xbf,0x12,0x98,0xea,0x7d,0xe3,0x7c,0xbf,0x12,0x37,0x6f,0x7d,0xf3, +0x74,0x2, 0xac,0xbf,0x9, 0x95,0x26,0xfb,0x7c,0xbf,0x12,0x9a,0xed,0x40,0x2, 0x1, +0xd4,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0xbe,0xa0,0x0, 0x28,0x9, 0xa, 0x3a, +0x1b,0x34,0x12,0x98,0xd8,0x7d,0xd3,0x12,0x98,0xdf,0xbd,0xc3,0x58,0xb, 0xa, 0xca, +0xb, 0xc4,0x7d,0x3c,0x12,0x98,0xd8,0x2d,0xd3,0x12,0x9b,0xf, 0x7d,0xd3,0xbe,0xa0, +0x0, 0x28,0x56,0x12,0x98,0xdf,0xbd,0xc3,0x58,0x4f,0xbe,0x90,0x0, 0x28,0x4a,0xbe, +0x90,0x0, 0x28,0x45,0xbe,0xf4,0x0, 0xc8,0x8, 0x3f,0x7d,0x3d,0x3e,0x34,0x3e,0x34, +0xbd,0x3f,0x8, 0x35,0x7e,0x70,0x2, 0xac,0x79,0x49,0x33,0x4, 0xfc,0xbe,0x34,0x1, +0x2c,0x8, 0x26,0xa, 0x2a,0x7e,0xb3,0x2a,0x74,0x12,0x9b,0x18,0xbe,0x34,0x1, 0x90, +0x8, 0x17,0xbe,0xf4,0x1, 0x5e,0x58,0xd, 0x7e,0x34,0x0, 0x3, 0xad,0x3e,0xbd,0x3f, +0x8, 0x3, 0xe4,0x80,0x30,0x74,0x1, 0x80,0x2c,0x90,0x60,0xab,0xe4,0x93,0xbc,0xb9, +0x78,0x22,0x7c,0xba,0x7c,0x79,0x12,0x2c,0x40,0xbe,0x34,0x0, 0x96,0x8, 0x12,0x74, +0x2, 0xac,0xb9,0x49,0x35,0x4, 0xfc,0xbe,0x34,0x0, 0x32,0x8, 0x4, 0x74,0x1, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xb7,0x7c,0x79,0x2, 0x2c,0x40,0x7e, +0xb3,0x2a,0x6f,0xa, 0x3b,0x1b,0x34,0xa, 0xca,0x22,0xca,0x79,0x7c,0x8b,0x6c,0xaa, +0x9f,0x77,0x12,0x9a,0x2a,0x1a,0x79,0x1b,0x74,0x80,0x4c,0x1a,0x38,0x1b,0x34,0x7c, +0xe7,0x80,0x38,0xbc,0x9f,0x78,0x4, 0xbc,0x8e,0x68,0x2e,0xbe,0xf0,0x0, 0x48,0x29, +0x7e,0xb3,0x2a,0x6f,0xa, 0x2b,0x1a,0x3f,0xbd,0x32,0x58,0x1d,0xbe,0xe0,0x0, 0x48, +0x18,0x7e,0xb3,0x2a,0x70,0xa, 0x2b,0x1a,0x3e,0xbd,0x32,0x58,0xc, 0x7c,0xbf,0x7c, +0x7e,0x12,0x2c,0x40,0x12,0x99,0x65,0xb, 0xa0,0xb, 0xe0,0x1a,0x28,0xb, 0x24,0x1a, +0x3e,0xbd,0x32,0x8, 0xbe,0xb, 0xf0,0x1a,0x29,0xb, 0x24,0x1a,0x3f,0xbd,0x32,0x8, +0xaa,0x4c,0xaa,0x78,0x4, 0x6d,0x33,0x80,0x9, 0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12, +0x1f,0x58,0xda,0x79,0x22,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7, +0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f,0x34,0x7e,0xb3,0x2a,0x70,0x7a,0xb3, +0x1f,0x35,0x12,0x9a,0x2a,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x41,0x17,0x7a, +0xf1,0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d, +0x32,0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a, +0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d, +0x32,0x7c,0xb7,0xf5,0x2c,0x80,0x40,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58, +0x10,0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5, +0x2e,0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b, +0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12, +0x2c,0x40,0x12,0x99,0x65,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x2c,0x1a, +0x3b,0xbd,0x32,0x8, 0xb2,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd, +0x32,0x18,0x2, 0x21,0x8f,0x7f,0x17,0xda,0x79,0x22,0x7e,0x70,0x2, 0xac,0x78,0x9, +0x93,0x26,0xfa,0x9, 0x83,0x26,0xfb,0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x62,0x27, +0x12,0x9a,0xe5,0x12,0x9b,0x23,0x50,0x2, 0x41,0xe0,0x7e,0x34,0x62,0x2b,0x12,0x23, +0x9e,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, 0x41,0xe0,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x9a,0xe5,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x4, 0x4c,0x8, 0x6b,0x6c,0xdd,0x80,0x5f,0xc2,0x3, 0x7c,0xbd,0x12,0x37,0x6f, +0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x99,0x6c,0x7a,0x35,0x24,0x9e,0x35, +0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0xdc,0x7a,0x35, +0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, +0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x9a,0xed, +0x50,0x2, 0xc2,0x3, 0x30,0x3, 0xf, 0x7c,0xbd,0x6c,0x77,0x12,0x51,0x5f,0x7e,0x70, +0x2, 0xac,0x7d,0x12,0x37,0x9f,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x99, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x7c,0x4b,0x74, +0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc, +0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x2, 0x1e,0xb9,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33, +0x4, 0xfc,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x37,0x6f,0xbe,0x34, +0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0xe9, +0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0x3b,0x7e,0x77,0x2a,0x5c,0x12, +0x9d,0xa1,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x9b,0xd7,0x7e, +0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x35,0xe5,0xbd,0x36,0x48,0x7, 0x3e,0x34,0x3e, +0x34,0x12,0x9b,0xd7,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0x9b,0x23,0x50,0x6, 0x7e, +0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60,0xc, 0x7e, +0xb3,0x35,0xe3,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xe3, +0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x45,0xe, 0x7e,0x53,0x35,0xe3,0xbe,0x50,0x0, +0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, 0x7d,0xfe, +0x7a,0xf7,0x2a,0x5c,0x12,0x9b,0xdf,0x28,0x3, 0x12,0x37,0xc2,0x7a,0x67,0x35,0xe5, +0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xb9,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x79,0xc2,0x3, 0x7e,0xf0,0x3, 0x7e,0xe3, +0x2a,0x3, 0x12,0x9b,0xdf,0x28,0x72,0x7c,0xbf,0x12,0x2c,0x47,0x4c,0xee,0x68,0xe, +0x7e,0x63,0x33,0xc0,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x33,0xc1,0x70,0x4, 0xd2,0x3, +0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x4d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x3, +0x80,0x1e,0xd2,0x3, 0x12,0x9c,0xf6,0x78,0xa, 0xa5,0xbe,0x0, 0x6, 0x6c,0xff,0xc2, +0x3, 0x80,0xd, 0x9e,0x73,0x33,0xc0,0xbc,0x7e,0x78,0x5, 0x7e,0xf0,0x2, 0xc2,0x3, +0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x2c,0x47,0x7e,0xa3,0x33,0xc2,0x7a,0xa3,0x28,0x84, +0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x33,0xc3,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9, +0x1b,0xfd,0x12,0x9c,0x6f,0xf5,0x4d,0x80,0x3, 0x75,0x4d,0x64,0xda,0x79,0x22,0x7e, +0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80, +0x42,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x9c,0xee,0x9, 0xb3,0x26, +0xfa,0x12,0x2f,0xd6,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12, +0x9c,0xee,0x9, 0xb3,0x26,0xfb,0x12,0x2f,0xd6,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, +0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c, +0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28, +0x84,0xbc,0xb1,0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c, +0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0xca,0x79,0x6c, +0x88,0x80,0x72,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a, +0x71,0x24,0x7c,0xbf,0x12,0x9d,0x8b,0x50,0x5a,0x6c,0xee,0x80,0x51,0xbc,0xe8,0x68, +0x4b,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9d,0x80,0xf5,0x26,0x6c,0x99,0x90,0x60,0xaa, +0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, 0x2f, +0xe5,0x25,0xa, 0x3b,0x12,0x35,0x67,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, 0x78, +0x1b,0x7c,0xbe,0x12,0x37,0x6f,0x7d,0xf3,0x7c,0xb8,0x12,0x37,0x6f,0xbd,0x3f,0x8, +0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x51,0x5f,0xb, 0xe0,0x12,0x9c, +0xf6,0x38,0xaa,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0x86,0xda,0x79,0x22, +0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0x22,0x7c,0xab,0x90,0x60,0xab, +0xe4,0x93,0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x31,0x5a,0x50,0x2, 0xd3,0x22,0xc3, +0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84,0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12, +0x2f,0xb7,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb, +0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x40,0x7d,0xf3,0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, +0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x2, 0x70,0x2d, +0x7e,0x73,0x2a,0x3, 0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc5,0x70,0x18,0x12, +0x9e,0x17,0x7e,0x73,0x2a,0x3, 0x7a,0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, +0x7e,0xb3,0x34,0xc5,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc5,0x22,0xe4,0x7a,0xb3, +0x34,0xc5,0x7a,0xb3,0x2a,0x9, 0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x35, +0xe9,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73, +0x35,0xe8,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0xc1, +0xd2,0x7c,0x57,0xc1,0xca,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98, +0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff, +0x68,0x66,0x12,0x9e,0xe2,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e, +0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, +0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x9e,0xe2, +0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7, +0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0xc1,0x45, +0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6,0x28,0x2, 0xc1,0x41,0x7c,0xba,0xda, +0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0x7c,0xab,0x7e,0xb, +0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x34,0xa3,0xbe,0x73,0x34,0xad, +0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa3,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22, +0xbe,0x73,0x34,0xad,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74, +0xff,0x19,0xb4,0x34,0xa3,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x34,0xa3,0xbe,0xb0,0xff, +0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa3,0xd3,0x22,0xe4,0x19,0xb3,0x34,0xa3,0xc3,0x22, +0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34, +0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x5, 0xbe, +0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34, +0xb0,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x34,0x8b,0x80,0x4, 0x59,0x35,0x34,0x8b,0x59, +0xf5,0x34,0xb0,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x25,0x3c, +0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x25,0x3c, +0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28, +0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90, +0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0x12,0x5e,0x25, +0x38,0xb2,0x22,0x7e,0x8, 0x34,0xa2,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20,0xde,0x6c, +0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12,0x2f,0xb7,0x60,0xa, 0x12,0xa0,0x84,0x40, +0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5, +0x7c,0xb0,0x6c,0x77,0x12,0xa0,0x49,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70, +0x1, 0x12,0xa0,0x49,0xb4,0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x2f,0xb7, +0x60,0xc, 0x12,0xa0,0x84,0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x51,0x5f,0xb, 0x10, +0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3,0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e, +0xb3,0x36,0x61,0x7a,0xb3,0x36,0x62,0x7a,0xa3,0x36,0x61,0x7e,0xb3,0x36,0x62,0x60, +0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e,0xb3,0x36,0x63,0x60, +0x5, 0x14,0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x0, 0x28,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c, +0xa7,0x90,0x60,0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, +0x80,0x71,0xbe,0xb0,0x2, 0x38,0x66,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27, +0x7e,0x73,0x26,0xfa,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26, +0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x2, +0x80,0x4e,0x6c,0xff,0x80,0x30,0x7c,0xbf,0x12,0x37,0x81,0x1a,0x4b,0x7c,0xbf,0x12, +0x37,0x6f,0x7d,0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d, +0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, 0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75, +0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xcb,0x80,0x6, 0xe5,0x1e,0x24, +0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, +0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22,0x7e,0x39,0x70,0xa, 0x37,0x9d,0x32,0x2, +0x21,0x0, 0xca,0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6, +0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd, +0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f,0x46,0x75,0x2b,0x0, 0x61,0x43,0x12,0xa4, +0xde,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b, +0x2e,0x34,0x14,0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x22,0xff,0x12,0x20,0xb9,0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a,0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35, +0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff,0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a, +0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5,0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xa4, +0xe6,0x2e,0x35,0x36,0x12,0xa1,0x48,0x7d,0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58, +0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, 0x3b,0x7f,0x3, 0x12,0xa4,0xe6,0x2e,0x35, +0x38,0x12,0xa1,0x48,0x7d,0xc3,0x7e,0x35,0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32, +0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37,0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a, +0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c, +0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5,0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb, +0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0x61, +0x41,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60, +0x8, 0x2, 0x61,0x41,0x80,0x28,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, +0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x61,0x41,0xbe,0x34,0x0, 0x30,0x8, +0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x61,0x41,0x7e,0xa3, +0x38,0x41,0x74,0xc, 0xa4,0xbe,0x57,0x22,0xf9,0x58,0x2, 0x61,0x41,0x7e,0xa3,0x38, +0x42,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58,0x2, 0x61,0x41,0x7e,0x15,0x36,0x6d,0x0, +0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xa3,0x7e,0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d, +0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xa3,0x7e,0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73, +0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38,0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b, +0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4,0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10, +0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33,0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7c,0xb7,0xf5,0x2e,0xe5,0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37, +0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34,0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e, +0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22, +0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35,0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a, +0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a,0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22, +0xf6,0x5, 0x2b,0x12,0xa4,0xde,0x28,0x2, 0x21,0x7e,0x7e,0xa3,0x22,0xf7,0xbe,0xa1, +0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe,0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50, +0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, 0x34,0x7a,0x73,0x38,0x3e,0x7a,0xb3,0x38, +0x40,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x38,0x3e,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a, +0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43,0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14, +0x12,0xa4,0xd6,0x7a,0x55,0x4a,0xa, 0x5e,0x7f,0x16,0x12,0xa4,0xd6,0x7a,0x55,0x48, +0x7e,0x35,0x48,0x12,0xa4,0xcf,0x2f,0x50,0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a, +0x0, 0x2f,0x70,0x12,0xa4,0xcf,0x12,0xa4,0xc5,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d, +0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4a,0x12,0xa4,0xc5,0x7e,0x1d,0x40, +0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12, +0xa4,0xc5,0x7e,0x1d,0x44,0x2f,0x10,0x7a,0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c, +0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x1f,0x58,0x7f,0x51,0x7f,0x17,0x7f, +0x6, 0x12,0x1f,0x58,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12, +0x1e,0xfc,0x7e,0x87,0x23,0x43,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x3c,0x7e,0x1d,0x40,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x40,0x7e,0x1d,0x44,0x7d,0x19,0x12,0x1e,0xfc,0x7d,0x18, +0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x58,0x7a,0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1e, +0xeb,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12,0x1e,0xeb,0x7e,0x5d,0x3c, +0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1e,0xeb,0x7e,0x7d,0x40,0x9f,0x71,0xbe,0x58, +0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18, +0x7f,0x16,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x5, 0x12,0x1f,0x58,0x7f,0x6, 0x12,0x1e, +0xeb,0x7f,0x7, 0x12,0x1f,0x58,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44, +0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0x7f,0x1, 0x22,0x7d, +0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x39,0x1, 0xbe,0x71,0x2b,0x22,0x2d,0x13,0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79, +0x6c,0xaa,0x12,0xa5,0xe4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf, +0x38,0x43,0x7f,0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x38, +0x63,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda,0x7e,0x8, 0x38,0x43,0x7e,0x18,0x38,0x63, +0x74,0x20,0x12,0xa1,0x52,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73, +0x38,0x3f,0xbe,0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22, +0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0x33,0x38,0x3f,0xa, 0x13,0x6d,0x0, 0x12, +0x1f,0x7, 0x7c,0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64, +0xa, 0x3e,0x1b,0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xa5,0x92,0x7f,0x6, 0x7c, +0xbd,0x7c,0x7c,0x12,0xa5,0x92,0xb, 0xf0,0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x50,0xbc, +0x7f,0x5, 0x7f,0x16,0x12,0xa4,0xee,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x38,0x3e,0xda, +0x3b,0x22,0x7c,0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d, +0x2, 0xb, 0xa, 0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, +0x7c,0x21,0xa5,0xba,0x0, 0x14,0x1a,0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d, +0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, +0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35, +0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xe4,0x7a, +0xb3,0x35,0x69,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x5, 0xe4, +0x7a,0xb3,0x35,0xe4,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x4f,0x12,0xa6,0x4e,0x28, +0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0xdc,0xbe,0x37, +0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x3, 0x70,0x17,0x7e, +0xb3,0x37,0x8, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28, +0x5, 0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0xb3, +0x28,0x84,0xbe,0xb0,0x0, 0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x6e, +0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c, +0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x4a,0x12,0xa6,0xff,0x78, +0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x21, +0x0, 0x7d,0x13,0x7d,0x3e,0x12,0x21,0x0, 0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5, +0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33,0x9e,0x35,0x2e,0xbd,0x3e,0x8, +0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, +0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xae,0x7e,0x73, +0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80, +0xa, 0x12,0xa6,0xff,0x78,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc, +0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0xc1,0x71,0xda,0x3b,0x22,0xa, +0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22, +0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d, +0x0, 0x7f,0x14,0x12,0x1f,0x58,0x7d,0x73,0x12,0x21,0x0, 0x7d,0xe3,0x7d,0x3f,0x12, +0x21,0x0, 0xbd,0x3e,0x22,0x7e,0x63,0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c, +0xc2,0x12,0x6c,0x33,0x80,0x56,0x90,0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac, +0x93,0x90,0x60,0xab,0xe4,0x93,0xa, 0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4, +0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a, +0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x31,0x5a,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f, +0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, 0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, +0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75, +0xbc,0x73,0x38,0xa2,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x32,0xe7,0x22,0x90,0x60,0xa7, +0xe4,0x93,0x60,0x8, 0x30,0x12,0x5, 0x12,0x31,0x7d,0xc2,0x12,0x22,0xca,0xd8,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x22,0xe6,0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x1f,0xad,0x6d,0x11,0x7e,0x4, +0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0xa8,0xe1,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d, +0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, +0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x1, 0xd2,0xbe,0xd4,0x4, +0xb0,0x8, 0x2, 0xd2,0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd, +0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7, +0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x1, 0xd2,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, +0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0xa8,0xe1,0x1a,0x26,0x1a,0x24,0x2f, +0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0xa8,0xd7,0x9f,0x55,0x6c,0xee, +0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12, +0x21,0x0, 0x7d,0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, +0x1d,0x12,0xa8,0xd7,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, +0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea, +0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x58,0x7d,0x13, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x0, 0xca, +0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x7f,0xc2,0x3, 0x6d,0x44,0x80,0x1e, +0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x12,0xa8,0xe9,0xbd,0x3d,0x48,0xd, 0x7d, +0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa8,0xe9,0x7d,0xd3,0xb, 0x44,0x7e,0xc5, +0x35,0xbd,0xc4,0x38,0xdb,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba, +0x7d,0x3d,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f, +0x10,0x2e,0x35,0x35,0x7a,0x1b,0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f, +0x17,0x2d,0x35,0xb, 0x1a,0x30,0x7f,0x60,0x2e,0xd5,0x35,0x7e,0x6b,0xb0,0x60,0x5, +0xe, 0x34,0x14,0x78,0xfb,0x7c,0xb7,0x12,0xa9,0x78,0xb, 0x44,0x7e,0x55,0x35,0xbd, +0x54,0x38,0xd8,0xda,0xf8,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xb0,0x22, +0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5,0x1, 0x6c,0xaa, +0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0xa9,0x76,0xb, 0xa0,0xbe,0xa0, +0xd, 0x40,0xed,0xc2,0xc9,0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, 0x7e,0x73,0x2a, +0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0xad,0x13,0x7d,0x21,0x6c, +0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x38,0xd9,0x2d,0xf0,0xb, +0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, 0x59,0x4, 0x25, +0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35,0x35,0x7e,0xf, 0x37,0x40,0x7e,0x18, +0x25,0xb6,0x2, 0xa8,0xef,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12,0xaa,0x2e,0x7e, +0x1f,0x38,0xd9,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x24,0xf6,0x12, +0xaa,0x35,0x12,0xaa,0x3e,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, 0x20,0x7a,0x37, +0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, 0x22,0xa9,0xd1, +0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2,0x22,0x7e,0x73, +0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53,0x2a,0x6d,0xac, +0x54,0x7e,0x17,0x28,0xa1,0x12,0xaa,0x2e,0x6d,0x0, 0x80,0x37,0x7d,0x40,0x3e,0x44, +0x7e,0x7f,0x38,0xd9,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10,0x7d,0xf4,0x2e, +0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14,0x6d,0x55,0x9d, +0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d,0x51,0x1b,0x48, +0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22,0x7c,0xab,0x7e,0x8, 0x29,0xbc,0x12,0x5e, +0x25,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0,0xb4,0x2, 0x4, 0x74, +0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31,0x7d,0x20,0x39,0xb1, +0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e,0x24,0x0, 0xff,0xb, +0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0x61,0x73,0x90,0x60,0xa7,0xe4,0x93, +0x70,0x2, 0x61,0x73,0x6c,0xff,0x61,0x6c,0x7e,0x70,0x9, 0xac,0x7f,0x9, 0xe3,0x29, +0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, 0x7d,0x3d,0x12, +0xab,0x81,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, 0x7d,0x34,0x1b, +0x34,0x12,0xab,0x78,0x7c,0xbe,0x12,0xaa,0x98,0x80,0x3f,0x7e,0x70,0x2, 0xac,0x7d, +0x2e,0x34,0x60,0xc5,0x12,0x87,0xbc,0x74,0x9, 0xac,0xbf,0x59,0xd5,0x29,0x8, 0x7e, +0x34,0x60,0xcf,0x12,0x23,0x9e,0x12,0xab,0x78,0x80,0x1f,0xbd,0xc4,0x40,0x1b,0x7d, +0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0xaa,0x98,0x7d,0xc4, +0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12,0x5e,0x2d,0x28, +0x2, 0x41,0xe8,0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0xa, +0x22,0x6c,0xaa,0x80,0x27,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x60,0xb1, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14,0x60,0xb3,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0xb, 0xb, 0xa0,0x90,0x60,0xa7,0xe4, +0x93,0xbc,0xba,0x38,0xd0,0x7c,0xba,0x22,0x90,0x60,0xa7,0xe4,0x93,0x60,0x2b,0x6c, +0x33,0x80,0x1f,0x7c,0xb3,0x12,0x31,0x5a,0x40,0x16,0x7c,0xb3,0x12,0x31,0x27,0x7d, +0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x1b,0x1a,0x50, +0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0xab,0xfd,0x7e,0x14, +0x62,0x7, 0x12,0x87,0xee,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22,0x6d,0x11,0xe4, +0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x7f,0x38,0xf3, +0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12,0x21,0x0, 0xbd, +0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xf3,0x2d,0x13,0x69,0x20, +0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x81,0xbf,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x1f, +0x38,0xf3,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14, +0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff, +0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22,0x6c,0x66,0x7e, +0x27,0x39,0x4, 0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e,0xb3,0x28,0xac, +0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xab,0xbc,0x76,0x50,0xf, 0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8a,0x87,0x7e,0xb3,0x2f,0xab,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3, +0x2f,0xab,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xac,0xbe,0xa0,0x5, +0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74,0x5, 0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xac,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, 0xac,0x5a,0x49, +0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8,0x30,0x1, 0xe, +0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d,0x23,0xa, 0x3a, +0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f,0x7e,0x63,0x2a, +0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac,0x56,0x49,0x22, +0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e,0xb3,0x2a,0x6d, +0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, 0x2, 0xc2,0x3, +0xa2,0x3, 0x22,0xc2,0x3, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1,0x60,0x4, 0xd2, +0x3, 0x80,0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57,0x49,0x12,0x4, +0xfc,0x7e,0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d,0x22,0x9d,0x20, +0xbd,0x12,0x58,0x4, 0xd2,0x3, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e,0x14,0x0, 0x3, +0xa, 0x27,0xbd,0x21,0x48,0xd2,0xa2,0x3, 0x22,0x7d,0x23,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x7e,0x14,0x0, 0x5, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33, +0x36,0xdc,0xbe,0x30,0x8, 0x50,0x45,0x74,0x8, 0x80,0x3d,0x7d,0x13,0x3e,0x14,0xbd, +0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x6, 0x50,0x30,0x74,0x6, 0x80,0x28, +0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc, +0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, 0x80,0xf, 0xbd,0x32,0x50,0xf, 0x7e,0x73,0x36, +0xdc,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xdc,0x7e,0xb3,0x36,0xdc, +0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a,0xb3,0x36,0xdc,0x74,0x1, 0x7a,0xb3,0x16,0x92, +0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3,0x36,0xdc,0x50,0x5, 0xe4,0x7a,0xb3,0x16,0x91, +0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0xae,0x8a,0x68,0x23, +0x7e,0x70,0xc, 0xac,0x72,0x12,0xae,0xa2,0x7d,0x23,0x7e,0x70,0xc, 0xac,0x72,0x59, +0x23,0x36,0x82,0x49,0x3, 0x36,0x82,0x49,0x23,0x36,0x7e,0xbd,0x20,0x50,0x4, 0x59, +0x3, 0x36,0x7e,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22,0x80,0x18,0x12, +0xae,0x8a,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7e,0xbd,0x4, 0x50, +0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37,0x36,0x64,0xbe, +0x37,0x36,0xdd,0x50,0x8, 0x7e,0x37,0x36,0xdd,0x7a,0x37,0x36,0x64,0x12,0xae,0x98, +0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, 0xac,0x12,0x9, +0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, 0x22,0x7e,0x70,0xc, 0xac,0x7a,0x49,0x33,0x36, +0x7e,0x22,0x49,0x23,0x36,0x84,0x49,0x33,0x36,0x80,0x9d,0x32,0x2, 0x21,0x0, 0x7e, +0x8, 0x36,0x7a,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x20,0xde,0x6c,0xaa,0x7e,0x44,0xff, +0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7c,0x59,0x43,0x36,0x84,0xb, 0xa0, +0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x68,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20, +0xde,0x7e,0xa3,0x2b,0x62,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62,0xd2,0xc, 0x30, +0xc, 0x7, 0x12,0xae,0xfa,0xe4,0x2, 0xa, 0x66,0x22,0xc2,0xc, 0x7e,0x8, 0x2a,0x6d, +0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x6d,0x74,0x3, 0x2, 0x11,0x7a,0xe4,0x7a,0xb3,0x36, +0x67,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xee,0xe4,0x7a,0xb3,0x36,0x68,0x6d,0x33,0x7a,0x37, +0x36,0x6f,0x7a,0x37,0x36,0x64,0x22,0x7e,0xb3,0x36,0x6a,0xb4,0x1, 0x27,0x7e,0xb3, +0x36,0xe0,0x4, 0x7a,0xb3,0x36,0xe0,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x3, 0x40,0x15, +0x12,0x8c,0x90,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x6, 0x40,0x9, 0xe4,0x7a,0xb3,0x36, +0xe0,0x7a,0xb3,0x36,0x6a,0x22,0x12,0x24,0x14,0xe4,0x7a,0xb3,0x3, 0xfe,0x2, 0x76, +0x52,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88,0x7e,0xf0,0x1, +0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f,0x7f,0x7, 0x2d, +0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc,0x9f,0x38,0xe2, +0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0,0x1, 0x2, 0xb0, +0x31,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, 0x80,0x36,0x7e, +0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0xe5,0x44, +0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16,0x5, 0x45,0xa, +0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0xc0,0xe8,0xbd,0x3d,0x8, 0x5, 0x12,0xc0, +0xe8,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe,0xb0,0x0, 0x28, +0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x72,0x33,0xc3,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x33, +0xc4,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x30,0x3, 0x1b,0x1a,0xd0,0xb, 0xa0,0xb, +0xf0,0xbc,0x8f,0x40,0x3, 0x2, 0xaf,0xb1,0x7c,0xba,0xda,0x79,0xda,0xd8,0x22,0x7c, +0x9b,0x7f,0x71,0x7f,0x60,0x7e,0x34,0x22,0xb8,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f, +0x52,0x74,0x2a,0x12,0x1f,0xad,0x7e,0x58,0x1f,0x52,0x7c,0xb9,0x7e,0x71,0x44,0x12, +0x2c,0x40,0x7d,0x43,0xe5,0x45,0x7e,0x71,0x46,0x12,0x2c,0x40,0x2d,0x34,0xe, 0x34, +0x7f,0x5, 0x7e,0x50,0x7, 0xb, 0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, +0x1b,0x6a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b, +0x50,0x78,0xe2,0x22,0x6d,0x33,0x7d,0x23,0x7d,0x3, 0x6c,0x33,0x80,0x45,0x6c,0x22, +0x80,0x37,0x7e,0xb3,0x2a,0x6e,0xac,0xb3,0xa, 0x42,0x2d,0x54,0x7d,0x45,0x3e,0x44, +0x7e,0x7f,0x13,0x8a,0x2d,0xf4,0xb, 0x7a,0x40,0xbe,0x44,0x0, 0x32,0x8, 0x8, 0xbe, +0x44,0x2, 0x58,0x58,0x2, 0xb, 0x24,0xbe,0x44,0xff,0xce,0x58,0x8, 0xbe,0x44,0xfd, +0xa8,0x8, 0x2, 0xb, 0x4, 0xb, 0x34,0xb, 0x21,0x7e,0x93,0x2a,0x6e,0xbc,0x92,0x38, +0xc1,0xb, 0x31,0x7e,0xb3,0x2a,0x6d,0xbc,0xb3,0x38,0xb3,0x7e,0x54,0x0, 0x6, 0xad, +0x53,0x7d,0x15,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x12,0x25,0x3e,0xbd,0x12,0x50,0x22, +0xbd,0x30,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x8, 0x7e,0xb3,0x39,0x9, 0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x9, 0x80,0x3c,0xe4,0x7a,0xb3,0x39,0x9, 0x74,0x1, +0x80,0x2f,0xbd,0x10,0x50,0x22,0xbd,0x32,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x9, 0x7e, +0xb3,0x39,0x8, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x8, 0x80,0x16,0xe4, +0x7a,0xb3,0x39,0x8, 0x74,0x2, 0x80,0x9, 0xe4,0x7a,0xb3,0x39,0x8, 0x7a,0xb3,0x39, +0x9, 0x7a,0xb3,0x39,0xa, 0x7e,0xb3,0x39,0xa, 0x22,0xe4,0x7a,0xb3,0x28,0xa8,0x7a, +0xb3,0x39,0xb, 0x22,0xca,0xd8,0xca,0x79,0xc2,0x3, 0x6c,0xdd,0x7e,0x57,0x28,0x99, +0x7d,0xf5,0x7e,0xe7,0x28,0x97,0x7e,0x37,0x37,0xfb,0x4d,0x33,0x68,0x4, 0x7d,0xf5, +0xe, 0xf4,0x6c,0xff,0x7e,0xa3,0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68, +0x21,0x14,0x68,0x14,0x24,0xc2,0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10, +0x7c,0xfa,0x7e,0x83,0x2a,0x6d,0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, +0x6c,0x88,0x6c,0x99,0x80,0xf, 0x7c,0xb9,0x12,0x37,0x6f,0xbe,0x34,0x2, 0x58,0x8, +0x2, 0xb, 0xd0,0xb, 0x90,0x7e,0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, +0x40,0x2, 0x61,0x25,0x7e,0xa3,0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, +0x28,0x37,0x7e,0xb3,0x26,0x83,0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f, +0x2d,0x32,0x3e,0x34,0x49,0x23,0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc, +0xbd,0xe, 0x58,0xf, 0x6d,0x33,0x9d,0x3e,0x12,0x8f,0xdc,0xbd,0x3, 0x8, 0x4, 0xd2, +0x3, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe, +0xe7,0x7, 0xf8,0x8, 0x2, 0xc2,0x3, 0x30,0x3, 0x20,0x7e,0xb3,0x39,0xb, 0x4, 0x7a, +0xb3,0x39,0xb, 0x7e,0x23,0x39,0xb, 0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3, +0x39,0xb, 0x74,0x1, 0x7a,0xb3,0x28,0xa8,0x80,0xf, 0x7e,0x23,0x39,0xb, 0xbe,0x20, +0x0, 0x28,0x6, 0x1e,0x20,0x7a,0x23,0x39,0xb, 0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, +0xbe,0xa0,0x0, 0x28,0x69,0x7e,0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa, +0xbe,0xb0,0x1, 0x68,0x59,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d, +0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x2c,0x3c, +0xbe,0x34,0x0, 0x96,0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28, +0x84,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3, +0x27,0x36,0x9, 0xd3,0x27,0x37,0x12,0x2c,0x3c,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e, +0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99, +0x80,0x17,0xa, 0xe9,0xa, 0x5f,0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f, +0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78, +0x25,0x7e,0xb3,0x39,0xc, 0x4, 0x7a,0xb3,0x39,0xc, 0x7e,0x73,0x39,0xc, 0xbe,0x70, +0x5, 0x28,0x22,0x74,0x5, 0x7a,0xb3,0x39,0xc, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2, +0x15,0x12,0xb1,0x5a,0x80,0xf, 0x7e,0x73,0x39,0xc, 0xbe,0x70,0x0, 0x28,0x6, 0x1e, +0x70,0x7a,0x73,0x39,0xc, 0xda,0x79,0xda,0xd8,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34, +0x0, 0x38,0xca,0x39,0xac,0x7f,0x2e,0x34,0x0, 0x50,0x6d,0x22,0x7e,0x8, 0x34,0x0, +0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, +0x30,0x6d,0x22,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x7e, +0xa3,0x2a,0x6e,0xa, 0x3a,0x3e,0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x20,0xde,0x90, +0x60,0x93,0x93,0xa, 0x3b,0x7e,0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad, +0x32,0x7d,0x43,0x6c,0x77,0x80,0x1d,0xa, 0x27,0x2d,0x24,0x12,0x87,0xdc,0xb, 0xa, +0x0, 0x7e,0x30,0x2, 0xac,0x37,0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b, +0x18,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xdf,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x13,0xc6,0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24, +0x13,0x8e,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38, +0xdc,0x22,0x7c,0xab,0x12,0xb3,0xe1,0xd2,0x16,0x7c,0xba,0x12,0x86,0xf8,0xc2,0x16, +0x22,0xa9,0xd1,0xcb,0x74,0x1, 0x2, 0x0, 0xe, 0x12,0xb3,0xe1,0x7e,0x34,0xd, 0xc8, +0x7e,0xb3,0x2a,0x6d,0x12,0xb4,0x22,0x12,0xb4,0x5, 0x7a,0x37,0x38,0xd6,0x74,0x1, +0x7a,0xb3,0x16,0x91,0x22,0x6d,0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28, +0x3, 0x2, 0xb4,0xef,0x90,0x60,0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb4, +0x56,0x22,0x7a,0xb3,0x24,0xf2,0x7e,0x53,0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37, +0x24,0xfa,0xe4,0x7a,0xb3,0x24,0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a, +0x37,0x24,0xf6,0x7e,0x34,0x0, 0x20,0x12,0xb4,0x4d,0x2, 0xd, 0x7, 0x7a,0x37,0x24, +0xfc,0x7e,0x8, 0x24,0xf2,0x22,0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e, +0xa, 0xd8,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa, +0x80,0x18,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, +0x5a,0xc0,0x9d,0xc2,0x59,0xc3,0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60, +0x92,0xe4,0x93,0x7c,0x9b,0x6d,0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92, +0xe4,0x93,0xa, 0xcb,0x1b,0xc4,0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa, +0x80,0x28,0xa, 0x3a,0x7d,0x23,0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d, +0x3e,0x34,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x0, +0x7d,0xa3,0xbd,0xfa,0x58,0x2, 0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8, +0x2d,0xec,0x2d,0xdc,0xb, 0xf0,0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca, +0xf8,0x6d,0x44,0x7e,0xf3,0x2a,0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3, +0x2a,0x6d,0xa, 0xeb,0x2d,0xef,0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60, +0x94,0xe4,0x93,0xb4,0xff,0x31,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda, +0x2d,0xdf,0x3e,0xd4,0x7e,0x1f,0x38,0xd9,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, +0xac,0x5a,0x7f,0x50,0x2d,0xb2,0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, +0xa0,0xbc,0xfa,0x38,0xd9,0x80,0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x38,0xd9,0x2d, +0x15,0x6c,0xaa,0x80,0x2c,0xa, 0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x38,0xd9,0x2d, +0x3e,0xb, 0x1a,0xe0,0x7e,0x70,0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0, +0x7d,0x3e,0x9d,0x3d,0x12,0x21,0x0, 0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, +0xa0,0xbc,0xfa,0x38,0xd0,0x7d,0x34,0xda,0xf8,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, +0xa9,0xd5,0xea,0xa9,0xc5,0xea,0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e, +0x5, 0x4e,0x7e,0x73,0x39,0x6, 0xbe,0x71,0x4e,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e, +0xa9,0xd7,0x9e,0xa9,0x34,0xe5,0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, +0xa9,0xc2,0xcd,0xa9,0x33,0xe5,0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7, +0xcd,0xa9,0x36,0xe5,0x3, 0xa9,0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6, +0xc2,0x88,0xd2,0xa8,0x22,0x7e,0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47, +0x52,0x7e,0x24,0x55,0x50,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20, +0x7e,0x24,0x41,0x44,0x79,0x30,0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33, +0x7e,0x24,0x66,0xcc,0x79,0x30,0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47, +0x7e,0x24,0x46,0x4c,0x79,0x30,0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd0,0xce, +0xa2,0x3, 0xa9,0x95,0xc9,0x22,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2, +0x86,0xa9,0xc2,0xeb,0xa9,0xd2,0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f, +0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d, +0x1, 0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75, +0xf7,0x0, 0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9, +0xd0,0xf7,0xd2,0xf8,0xa9,0xc1,0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6, +0xb7,0xc2,0xbe,0x22,0x75,0xe7,0x6b,0x2, 0xb6,0x9a,0xe4,0x7e,0x34,0xd7,0xfc,0x7e, +0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff, +0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e,0x37,0x39,0x4, 0xb, 0x34,0x7a,0x37, +0x39,0x4, 0xbe,0x34,0xff,0x0, 0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37,0x39,0x4, +0x22,0x7c,0x6b,0x6c,0x77,0x6c,0xaa,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x46,0x12,0xb7, +0x8f,0x75,0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12, +0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc, +0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1, +0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0xa9,0xc6,0xb3, +0x75,0xb5,0x0, 0x22,0x74,0x6, 0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73, +0x7d,0x52,0x7c,0xab,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x3c,0x12,0xb7,0x8f,0x75,0xb5, +0x1, 0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0xb7,0x38,0xa9, +0xc2,0xb4,0xa9,0xc6,0xb3,0x22,0x74,0x2, 0x7d,0x3f,0x2, 0xb7,0x38,0x7d,0x42,0x7f, +0x60,0x7d,0x3, 0x12,0xb7,0xef,0x74,0x2, 0x12,0xb6,0xd1,0x7d,0xf3,0x4e,0xf4,0x0, +0x1, 0x4e,0xf4,0x0, 0xa, 0x12,0xb7,0x96,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f, +0x6, 0x12,0xb7,0xd7,0x5e,0xf4,0xff,0xfd,0x12,0xb7,0x96,0x2, 0xb7,0xce,0xa9,0xc5, +0xca,0xe4,0x7a,0xb3,0x39,0x13,0x22,0x12,0xb8,0x38,0x7e,0x35,0x36,0x12,0xb8,0x1c, +0xa9,0xd2,0xb4,0xd3,0x22,0x74,0x6, 0x12,0xb6,0xd1,0x7d,0x3, 0x6c,0x11,0x22,0xa9, +0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1,0xea,0x74,0xa5,0x7a,0xb3,0x39,0x13,0x22,0xca, +0xf8,0x7c,0xfb,0x74,0x2, 0x12,0xb6,0xd1,0x4c,0xff,0x78,0x5, 0x5e,0x70,0xdf,0x80, +0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0xb7,0x38,0xda,0xf8,0x22,0x6d,0x22,0x80,0x13, +0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, +0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5, +0xa, 0x44,0xf5,0x39,0x7f,0x21,0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xb8,0x63, +0xe5,0x3a,0x12,0xb8,0x63,0xe5,0x39,0x12,0xb8,0x63,0xe5,0x38,0x12,0xb8,0x63,0xe4, +0x2, 0xb8,0x63,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0xd2,0xc8, +0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0xb7, +0xef,0xe4,0x12,0xb7,0xff,0x2, 0xb7,0xce,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c, +0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, +0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74, +0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x97,0xbe,0x90,0x1, +0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe, +0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18, +0xb2,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xb9,0x3c,0xb, 0x7a,0x20, +0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d, +0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25, +0x3c,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, +0xf9,0x2d,0xf1,0x7d,0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77, +0x14,0x78,0xfb,0x4d,0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xd9,0x7e,0x8, +0x1f,0x3c,0x12,0xb9,0xfa,0xd2,0x3, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xb9,0x44, +0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32, +0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, +0x12,0xba,0x42,0x50,0x7, 0x12,0xba,0x39,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7, +0x38,0xee,0x12,0xb9,0xe7,0xe4,0x12,0xb9,0xef,0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a, +0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xb9,0xe7,0x74,0x1, 0x12,0xb9,0xef,0x74, +0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12, +0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x1c,0x74,0x3f, +0x2, 0x20,0xde,0x7e,0x8, 0x1f,0x34,0x12,0xb9,0xfa,0x6c,0x77,0x80,0xe, 0x12,0xba, +0x42,0x50,0x7, 0x12,0xba,0x39,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x6e, +0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9, +0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x44,0xa, +0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57,0x7c,0xab, +0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46, +0x2e,0x44,0x20,0x73,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b,0xbe,0x60, +0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb, +0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b, +0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70, +0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbb,0x9, 0x60,0x5, 0x3e, +0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16, +0x9e,0x60,0xe, 0x12,0xbb,0x9, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbb,0x9, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b, +0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72, +0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12,0x77,0xf6,0xb, 0x24,0xa, 0x33,0xbd,0x32, +0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28, +0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f, +0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d, +0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a, +0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a, +0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a, +0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3, +0xff,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, +0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85, +0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88, +0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53, +0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e, +0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91, +0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12,0x2f,0xd0,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xfb,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x37,0x32,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xbd,0x44, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x38,0xfc,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x37,0x33,0x80,0x1a,0x12,0xbd,0x44,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x38,0xfb,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x34,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f, +0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x80, +0x7e,0x34,0x0, 0x28,0xe4,0x12,0x20,0xde,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, 0xc0, +0x12,0x20,0xde,0x7a,0xb3,0x37,0x34,0x7e,0x34,0x62,0x8e,0x12,0x23,0x9e,0x7a,0x37, +0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a,0xe7, +0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a,0xf7, +0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a,0xf7, +0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe,0x7a, +0xb3,0x37,0x34,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x7e,0x37,0x38,0xe2,0x9e,0x37,0x38,0xde,0x12,0x21,0x0, 0xbd,0x31,0x38,0x12, +0x7e,0x37,0x38,0xe4,0x9e,0x37,0x38,0xe0,0x12,0x21,0x0, 0xbd,0x31,0x38,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd, +0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x38,0xdd,0x60,0x11,0x7e,0xc7, +0x38,0xe6,0x4d,0xcc,0x78,0x2, 0xc1,0xe8,0xbe,0xd0,0x1, 0x28,0x2, 0xc1,0xe8,0xbe, +0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xc1,0xe8,0x7e,0xe7,0x29,0x8, 0x7e, +0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x66,0xe6,0xbe,0xb0,0x1, 0x78,0x2, 0xc1, +0xe8,0x7e,0xa3,0x38,0xdd,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23, +0x14,0x78,0x2, 0xc1,0xe5,0xb, 0xb2,0x68,0x2, 0xc1,0xe8,0xbe,0xd0,0x1, 0x68,0x2, +0xc1,0xf7,0x4c,0xee,0x68,0x2, 0xc1,0xf7,0x74,0x1, 0x7a,0xb3,0x38,0xdd,0x12,0xbf, +0xa, 0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3, +0x38,0xdd,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xdd,0x7e,0x34, +0x62,0x68,0x80,0x48,0x12,0xbf,0x13,0x90,0x62,0x57,0x12,0xbe,0xfe,0x68,0x49,0x80, +0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xbf,0x13,0x7e,0x34,0x62, +0x60,0x12,0x23,0x9e,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d, +0xc3,0xbe,0xc7,0x38,0xe6,0x40,0x21,0x90,0x62,0x56,0x12,0xbe,0xfe,0x68,0x19,0x12, +0xbf,0xa, 0x74,0x3, 0x7a,0xb3,0x38,0xdd,0x7e,0x34,0x62,0x64,0x12,0x23,0x9e,0x7a, +0x37,0x38,0xe6,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xdd,0x6d,0x33,0x7a, +0x37,0x38,0xe6,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93, +0xa, 0x3b,0x12,0xbd,0xc9,0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x38,0xde,0x7a,0xf7, +0x38,0xe0,0x22,0x7a,0xe7,0x38,0xe2,0x7a,0xf7,0x38,0xe4,0x22,0xca,0xf8,0x7f,0x51, +0x7f,0x40,0x7e,0x37,0x2f,0x90,0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c, +0x7e,0x37,0x2f,0x9c,0x7a,0x35,0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff, +0x80,0x1e,0x7e,0x34,0x0, 0x26,0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0x8c,0x74, +0x2, 0xac,0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xbf,0x6b,0xb, 0xf0, +0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e, +0x35,0x2f,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e, +0x35,0x31,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, +0x6a,0x30,0x9e,0x35,0x33,0x6d,0x22,0x7e,0x33,0x38,0x41,0x12,0xbf,0xc0,0x7e,0x15, +0x2f,0x12,0x1f,0x5, 0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e, +0x33,0x38,0x42,0x12,0xbf,0xc0,0x7e,0x15,0x31,0x12,0x1f,0x5, 0x1b,0x7a,0x30,0x22, +0xa, 0x13,0x6d,0x0, 0x2, 0x1e,0xeb,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, +0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22, +0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x7e,0x34,0x60,0xa3,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e,0x37,0x2a,0x53,0x22,0x7e,0xa3,0x2a,0x6e,0x7e, +0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d,0x22, +0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b, +0x14,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e, +0x7b,0x60,0xbc,0x6b,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x2e,0x14,0x1, 0x30,0x6d, +0x0, 0x7e,0x18,0x3, 0x60,0x22,0x2e,0x14,0x0, 0x50,0x6d,0x0, 0x7e,0x18,0x34,0x0, +0x22,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x26,0xfa,0x22,0xe4,0x7a,0xb3,0x36,0x69, +0x7a,0xb3,0x36,0x71,0x22,0x74,0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7a,0x37, +0x2a,0x4f,0x7e,0x34,0x61,0x57,0x22,0x7a,0x37,0x28,0xa1,0x7e,0x34,0x61,0xc2,0x22, +0x90,0x60,0xaa,0xe4,0x93,0xbe,0xb0,0x1, 0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b, +0xf, 0x22,0x74,0x5, 0xac,0xbc,0x9, 0xb5,0x26,0x33,0x22,0x7e,0x8, 0x0, 0x25,0x7e, +0x18,0x0, 0x24,0x22,0x7e,0xe3,0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x6d,0x33,0xe4, +0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x37,0x25,0xf4,0x7a,0x37,0x31,0xcc,0x22,0x7e,0x34, +0xd, 0xc8,0x7a,0x37,0x31,0xce,0x22,0x7e,0x73,0x37,0xbd,0x7a,0x73,0x2b,0x20,0x22, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x22,0x7c,0xbe,0x7c,0x7d,0x2, 0x2c,0x40,0x7e, +0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0,0x1, 0x22,0x12, +0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xb3,0x37,0x31,0xbe,0xb0,0x1, 0x22,0x7e, +0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7,0xe4,0x93,0x7c,0xab,0x22,0xff, +0xc1,0x20,0x3e,0xdf,0x94,0x6b,0x10,0x51, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_nt.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_nt.txt new file mode 100644 index 0000000000000..e9262ef468551 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_nt.txt @@ -0,0 +1,3091 @@ +0x2, 0x1f,0xd2,0x2, 0xb5,0x8a,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x42,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x70,0x2d,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x7d,0x45,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x32,0x2, 0x7d,0xa4,0xe4,0x2, 0x29,0xfa,0x22,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xa2,0x13,0x22,0x32,0xff,0x2, 0x0, 0x69,0x2, 0x31, +0xb3,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x38,0xc8, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x38,0xd8,0x7e,0x73,0x38,0xd8,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x7f,0x5, 0x7e,0x1f,0x38,0xc8,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x38,0xc8,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x38,0xcc,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x38,0xd4,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x38,0xd2,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf7,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0xb7,0x9d,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d,0xe2,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xb2,0x61,0x3f,0x7e,0x34,0x1d,0x96,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xc6,0x61,0x3f,0x7e,0x34,0x1e,0xa, 0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d, +0xf1,0x61,0x3f,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x69,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x6a,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xc8,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x38,0xc8,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x20,0xde,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x38,0xc0,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf7,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x38,0xc0,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xb9,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x38,0xc8,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x39,0xd, 0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x86,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x39,0xd, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x39,0xd, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x39,0xd, 0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xf3,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xf3,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xc0,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x38,0xc8,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x38, +0xc8,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x38,0xc8,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x38,0xc8,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x38,0xc8,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x38, +0xc8,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x38,0xc8, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x38,0xc8,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x38,0xc8,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x38,0xc8,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xb9,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xb9,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xf3,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xf3,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x39, +0xd, 0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x38,0xc8, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x38,0xc8,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x39,0xd, 0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x39,0xd, 0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x39,0xd, 0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf7,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xf2,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf7,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf7,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x39, +0xd, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x39,0xd, 0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x39,0xd, 0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x58,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1e,0xeb,0x7d,0x1e,0x12,0x1f,0x5, 0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x38,0xc8,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf7,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xf2,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf7,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x7f,0x5, 0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x38,0xc0,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc8,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x38,0xd8,0x7e,0x1f,0x38,0xc0, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xf3,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x39,0xd, 0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x20,0x8f,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x20,0x90,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e, +0x1f,0x38,0xc0,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x38,0xc0,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x38,0xc8,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x6, 0xe, 0x15,0x1a,0x1f,0x26,0x2b,0x2d,0x2e,0x2f, +0x2c,0x2a,0x24,0x1f,0x1a,0x14,0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10,0x15,0x1c,0x22, +0x28,0x2d,0x34,0x39,0x3d,0x40,0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x11,0x16, +0x1c,0x23,0x2b,0x32,0x37,0x3c,0x40,0x45,0x4a,0x4d,0x4c,0x4b,0x4a,0x48,0x46,0x46, +0x45,0x45,0x44,0x44,0x43,0x44,0x45,0x78,0x65,0x55,0x2, 0xd, 0x14,0x1b,0x21,0x25, +0x2b,0x31,0x37,0x36,0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, +0x10,0x18,0x1e,0x23,0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40, +0x3f,0x3e,0x3d,0x3d,0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29, +0x27,0x1e,0x14,0x11,0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21, +0x2b,0x32,0x30,0x2a,0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, +0x10,0x19,0x23,0x2d,0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71, +0x50,0x55,0x28,0x12,0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39, +0x31,0x28,0x1e,0x15,0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32, +0x37,0x39,0x20,0x29,0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, +0x1, 0x0, 0x1, 0x5, 0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c, +0x34,0x31,0x26,0xcb,0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31, +0x2e,0x2d,0x35,0x3d,0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, +0x10,0x1b,0x24,0x2f,0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d, +0x28,0x31,0x34,0x2a,0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40, +0x47,0x47,0x44,0x3c,0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b, +0x22,0x2d,0x30,0x2e,0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, +0x0, 0x0, 0x3, 0xb, 0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26, +0x1b,0x14,0x1c,0x25,0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c, +0x25,0x30,0x38,0x40,0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c, +0x29,0x1e,0x14,0x13,0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39, +0x30,0x25,0x1b,0x10,0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a, +0x23,0x2f,0x33,0x29,0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, +0x2, 0x0, 0x1, 0x8, 0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e, +0x50,0x55,0x16,0x2b,0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36, +0x3b,0x3d,0x3b,0x37,0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33, +0x3d,0x3f,0x13,0x21,0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37, +0x2d,0x22,0x18,0xc, 0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38, +0x2e,0x2a,0x31,0x62,0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, +0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26, +0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b, +0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48, +0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x9, 0x17,0x1d,0x26,0x2e,0x37, +0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, +0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30,0x2f,0x2c,0x26,0x1e, +0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c,0x32,0x3a,0x41,0x48, +0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c,0x33,0x55,0x26,0x1c, +0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18,0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, +0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44,0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49, +0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f,0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54, +0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c, +0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22,0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c, +0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a,0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32, +0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, +0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22, +0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, 0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39, +0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68,0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70, +0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80,0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10, +0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, +0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39,0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24, +0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50,0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff, +0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a,0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, +0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22, +0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33,0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29, +0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d,0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26, +0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10,0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b, +0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19, +0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22,0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39, +0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34,0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, +0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18,0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37, +0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e, +0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21, +0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c, +0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, +0x0, 0x2, 0x5, 0x9, 0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f, +0x3d,0x38,0x30,0x27,0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36, +0x3f,0x49,0x53,0x5c,0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b, +0x15,0xb, 0x4, 0x0, 0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c, +0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, +0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, +0x8, 0xe, 0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58, +0x51,0x48,0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf, +0x30,0x55,0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28, +0x30,0x38,0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16, +0xf, 0xc, 0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, +0x3, 0xa, 0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a, +0x58,0x57,0xc6,0x55,0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38, +0x3c,0x3e,0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, +0xd, 0x17,0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57, +0x4f,0x47,0x40,0x38,0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, +0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f, +0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22, +0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25, +0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f, +0x3d,0x3a,0x36,0x2e,0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0x9, 0xe, 0x14,0x1c,0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a, +0x10,0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47, +0x4f,0x56,0x5a,0x5b,0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9, +0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e, +0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25, +0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25, +0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d, +0x3a,0x34,0x2d,0x27,0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, +0xa, 0xf, 0x15,0x1b,0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11, +0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36, +0x3c,0x42,0x47,0x48,0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29, +0x22,0x1b,0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c, +0x24,0x2a,0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, +0x4, 0x7, 0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b, +0x38,0x31,0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35, +0x3d,0x45,0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17, +0x11,0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6, +0x30,0x55,0xa, 0x5, 0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3c,0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, +0x1, 0x2, 0x35,0x46,0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37, +0x2e,0x25,0x1e,0x16,0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39, +0x41,0x45,0xf0,0xbc,0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28, +0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, +0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d, +0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19, +0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36, +0x2f,0x27,0x21,0x19,0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, +0x16,0x1f,0x26,0x2d,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d, +0x56,0x59,0x5a,0x58,0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, +0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38, +0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40, +0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3, +0x30,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, +0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f, +0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40, +0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32, +0x39,0x3e,0x7, 0x90,0x30,0x55,0x39,0x2b,0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, +0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b,0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f, +0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24, +0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b,0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65, +0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a,0x46,0x55,0x0, 0x1, 0x3, 0x5, 0x7, 0x8, +0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22,0x24,0x27,0x2a,0x2c, +0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, 0x14,0x1b,0x23,0x28, +0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53,0x4e,0x47,0x40,0x3b, +0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x1f,0x7, 0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x1f,0x7, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0x13,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x4c,0x0, 0xc2,0x14,0x75,0x4d,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x4e,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x21,0x10,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x36,0x72,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xd0,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33,0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0x9b,0x0, 0x0, 0x2, 0x37,0xed,0x0, 0x0, 0x0, 0x2, 0x37, +0xef,0x0, 0x0, 0x0, 0x1, 0x37,0xf1,0x0, 0x0, 0x1, 0x34,0x4f,0x0, 0x0, 0x1, 0x39, +0x11,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x2, 0x34,0x9f,0x0, 0x0, 0x0, 0x1, 0x34, +0xa1,0x0, 0x0, 0x1, 0x34,0xaf,0x0, 0x0, 0x1, 0x34,0xc4,0x0, 0x0, 0x1, 0x34,0xc5, +0x0, 0x0, 0x1, 0x35,0x3e,0x0, 0x0, 0x1, 0x35,0x3f,0x1, 0x0, 0x1, 0x35,0x40,0x0, +0x0, 0x3c,0x35,0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x36,0x61,0x0, 0x0, 0x1, 0x36,0x62,0x0, 0x0, 0x1, 0x36,0x63,0x0, 0x0, +0x1, 0x35,0xe2,0x1, 0x0, 0x2, 0x35,0xe5,0x0, 0x0, 0x0, 0x1, 0x2f,0xa9,0x0, 0x0, +0x1, 0x2f,0xaa,0x0, 0x0, 0x1, 0x2f,0xab,0x0, 0x0, 0x1, 0x2f,0xac,0x0, 0x0, 0x1, +0x36,0x66,0x1, 0x0, 0x1, 0x36,0xe0,0x0, 0x0, 0x1, 0x39,0x12,0x0, 0x0, 0x6, 0x38, +0xfb,0x3f,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x39,0x1, 0x24,0x0, 0x1, 0x39,0x8, +0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x1, 0x39,0xb, 0x0, +0x0, 0x1, 0x39,0xc, 0x0, 0x0, 0x1, 0x0, 0x4f,0x0, 0x0, 0x1, 0x3, 0xec,0x0, 0x0, +0x4, 0x37,0x40,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39,0x3, +0x0, 0x0, 0x2, 0x39,0x4, 0x0, 0x0, 0x0, 0x1, 0x39,0x6, 0x64,0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x39,0x13,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x2, 0x2b,0xb9,0x2b,0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, +0x0, 0x1, 0x38,0xdd,0x0, 0x0, 0x1, 0x38,0x3e,0xff,0x0, 0x1, 0x38,0x3f,0x0, 0x0, +0x1, 0x38,0x40,0x0, 0x0, 0x1, 0x38,0x41,0x40,0x0, 0x1, 0x38,0x42,0x40,0x0, 0x4, +0x38,0xf3,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf7,0x0, 0x0, 0x64,0x0, 0x0, 0x4, +0x38,0xc0,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x38,0xc4,0x0, 0x0, 0x68,0xc0,0x0, 0x4, +0x38,0xc8,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x38,0xd9,0x0, 0x0, 0x40,0x0, 0x0, 0x4, +0x39,0xd, 0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58, +0x0, 0xc, 0x1, 0x5e,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78, +0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, +0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, +0x0, 0x1e,0x12,0x3f,0x13,0x12,0x69,0x8e,0x12,0x23,0xb, 0x12,0x28,0x48,0x12,0x8d, +0xec,0x2, 0x23,0x4, 0x74,0x1, 0x7a,0xb3,0x36,0x6a,0x22,0x12,0x73,0x71,0x12,0x23, +0x40,0x2, 0x23,0x14,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x1d,0x7d,0x43,0x7e, +0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34, +0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22, +0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x23,0x1d,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, +0x7a,0x2, 0x23,0x1d,0x7e,0x34,0x60,0xa3,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x46, +0xa2,0x12,0x73,0x28,0x12,0x3f,0x13,0x12,0x69,0x87,0x12,0xc0,0x5, 0x12,0x23,0xb, +0x12,0x28,0x48,0x12,0x68,0x23,0x12,0x8d,0xec,0x2, 0x23,0x4, 0x7e,0x34,0x61,0x4f, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x7a,0x37,0x28, +0x95,0x7e,0x34,0x61,0xba,0x12,0x23,0x9e,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8, +0x12,0x23,0x9e,0x7a,0x37,0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0x9e,0x7a,0x37, +0x28,0x9b,0x7e,0x34,0x61,0xbc,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61, +0xbe,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0x9e,0x12, +0xc0,0x87,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x20,0xde,0x12,0x25,0xc3,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0x9e, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0x9e,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x3c,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0xb7,0x9d,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x36, +0xe1,0x7e,0x34,0x61,0x51,0x12,0x23,0x9e,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x36,0xe2, +0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe3,0x7e,0x34, +0x61,0x57,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe4,0x7e,0x34,0x61,0x59, +0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe5,0x7e,0x34,0x61,0x5b,0x12,0x23, +0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe6,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x36,0xe7,0x12,0x20,0xb9,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x37,0x12,0xe5,0x28,0x7a,0xb3,0x37,0x1, 0x22,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a,0x4d,0x90,0x60, +0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0xc0, +0x7e,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93, +0x7a,0xb3,0x2a,0x59,0x12,0x23,0x7c,0x12,0xc0,0x35,0x7e,0x34,0x62,0x12,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60, +0xa0,0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3, +0x16,0x92,0x22,0x12,0x23,0x7c,0x12,0xc0,0x35,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e, +0x12,0xc0,0x7e,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x37,0xa0,0xbe,0xf0,0x5, 0x78, +0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78, +0x13,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12,0x26,0x5b,0xe4,0x7a,0xb3,0x2b,0x2, 0x12, +0x7a,0x2d,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x49,0xd, 0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x69,0xab,0x12,0xc0,0xd7, +0x80,0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12,0x26,0x5b, +0x12,0x2f,0xf4,0x50,0xfb,0x12,0x88,0x17,0x12,0x69,0x97,0x12,0x28,0x48,0x74,0x2, +0x7a,0xb3,0x37,0xa0,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3, +0xed,0x7a,0x37,0x3, 0xef,0x22,0x7e,0xb3,0x37,0x6, 0x14,0x68,0x60,0x14,0x78,0x2, +0xe1,0x10,0x14,0x68,0x73,0x24,0x3, 0x68,0x2, 0xe1,0x5, 0x12,0xc1,0xf, 0x38,0x8, +0x30,0x10,0xf, 0x12,0xc1,0x7, 0x68,0xa, 0x12,0x63,0x2, 0xe4,0x7a,0xb3,0x38,0x85, +0x80,0x7e,0x7e,0xb3,0x36,0xe7,0x30,0xe0,0x77,0x7e,0x73,0x36,0xe8,0xa, 0x27,0x7e, +0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64, +0x12,0x23,0x9e,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x83,0x50,0x53,0x12,0x63,0x2, +0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x38,0x87,0x80,0x43,0x12,0xc1,0xf, +0x28,0x39,0xe4,0x7a,0xb3,0x37,0x6, 0x7e,0xb3,0x38,0x85,0xb4,0x1, 0x6, 0x74,0x1, +0x7a,0xb3,0x37,0x6, 0xd2,0x17,0x80,0x23,0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x45,0x73,0x12,0x23,0x54,0xe4,0x7a,0xb3,0x37,0x6, 0x7a,0xb3,0x39, +0x7, 0xd2,0x17,0x80,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x39,0x7, +0x12,0x90,0xd2,0x2, 0x27,0x16,0xca,0xd8,0xca,0x79,0x7e,0xb3,0x37,0x6, 0xb4,0x1, +0x2, 0x80,0x3, 0x2, 0x28,0x38,0x6c,0xdd,0x6c,0xff,0x12,0x91,0x11,0x7d,0xf3,0x12, +0x2f,0xf4,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x38,0x86,0x12,0x3d,0xac,0x12,0x13,0xc7, +0x12,0x0, 0x1e,0x74,0xa, 0x12,0x45,0x15,0x12,0xc0,0xbd,0x7e,0xe7,0x2b,0xd, 0x7a, +0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3,0x2a,0xfa,0x7e,0xe7,0x2b,0xd, +0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3,0x2a,0xfa,0x12,0x7b,0xd0,0x7c, +0x7b,0x74,0x6, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x1e,0xb9,0x7d,0x23,0x7d,0x3f, +0x12,0x25,0x3c,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12,0x4e,0xe0,0x12,0x26,0x57,0x7e, +0xb3,0x37,0x31,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, 0x74,0xa, 0x12,0x91,0x5d,0x12, +0x4f,0xaf,0x80,0xf, 0x80,0x7, 0x12,0x45,0xcf,0xe4,0x12,0x46,0x7, 0x20,0x93,0xf6, +0x12,0x45,0x9f,0x30,0x18,0xf7,0x30,0x17,0xf4,0xd2,0x4, 0x12,0x45,0x5a,0xe4,0x12, +0x13,0xde,0xb, 0xd0,0x12,0x4c,0x83,0x12,0x91,0x76,0x7e,0xa3,0x38,0x85,0x4c,0xaa, +0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x86,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x31, +0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x85,0x12,0x28,0x3d,0x78,0x18,0x7e,0xb3,0x38,0x85, +0x60,0x12,0xe4,0x7a,0xb3,0x38,0x85,0x7a,0xb3,0x2a,0x2, 0x7a,0xb3,0x2a,0x3, 0x7e, +0xf0,0x1, 0x80,0x1d,0x12,0x28,0x3d,0x68,0x10,0x7e,0xb3,0x38,0x85,0x70,0xa, 0x7e, +0xf0,0x1, 0xe4,0x7a,0xb3,0x37,0x6, 0x80,0x8, 0xbe,0xd0,0x32,0x50,0x3, 0x2, 0x27, +0x8c,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a,0x37,0x2b,0xd, 0x7a,0xe3,0x2a, +0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x48,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x38, +0xf2,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34, +0x39,0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34, +0x3a,0x22,0xca,0x3b,0x12,0x2f,0xf4,0x50,0xfb,0x7e,0xf3,0x2b,0xf, 0x7c,0xbf,0x12, +0xb3,0xd2,0x12,0xb3,0xe9,0x7e,0xb3,0x2b,0x1f,0xf5,0x28,0x7e,0xb3,0x2b,0x20,0xf5, +0x29,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0xf, 0x12,0x8d,0x6c,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x28,0x48,0xc3,0x21,0x6c,0x12,0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x7, 0x12,0xab,0xfd,0x7a,0x37,0x37,0xe3,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x69,0x8e,0x12,0xab,0xeb,0x7e,0xc3,0x3, 0xec,0x12,0x6e,0x31, +0xe4,0x12,0x13,0xde,0x12,0x28,0x48,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x2a,0x7e,0x18, +0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x7a,0xc8,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x2a, +0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x7a,0xc8,0x7e,0xd3,0x2b,0x1f,0x7e, +0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5,0x29,0x12,0x6e,0x8b,0x50,0x5, +0x7c,0xbc,0x12,0xb3,0x2a,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d, +0x10,0x12,0x6a,0xd4,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3,0x2b,0x20,0x7c,0xbf,0x12,0x86, +0xf8,0x12,0xa9,0xf5,0x7e,0xb3,0x39,0x7, 0x4, 0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39, +0x7, 0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x7, 0x7e,0xb3,0x16,0x90, +0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e, +0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, 0x37,0x2d,0x32,0x22,0x12,0x48, +0x7, 0x7e,0xb3,0x37,0x8, 0xb4,0x3, 0x6c,0x12,0xb6,0xb8,0x12,0x26,0x57,0x12,0x3f, +0xfb,0x7e,0xb3,0x37,0x9c,0x30,0xe7,0xe9,0x12,0x28,0x62,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18,0x12,0xab,0xb8,0x12,0x75,0xe9, +0x12,0xaf,0x66,0x12,0xa7,0xbd,0x12,0x88,0x5f,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x58,0x52,0x12,0x48,0x39,0x12,0x3a,0x9f,0x7e,0xb3,0x37,0x9c,0x54,0x7f,0x7a,0xb3, +0x37,0x9c,0x80,0x8d,0x12,0x2f,0xee,0x2, 0x0, 0x46,0x7a,0xb3,0x2b,0x2, 0x7a,0xb3, +0x2b,0x1e,0x22,0x12,0x52,0x6d,0x12,0x2b,0xfa,0x12,0x2b,0xfa,0x12,0x36,0xac,0x12, +0x9c,0xfd,0x12,0x9f,0xef,0x12,0x2b,0xfa,0x12,0x9b,0xe7,0x12,0x2b,0xfa,0x12,0xa0, +0xae,0x12,0x2b,0xfa,0x2, 0x2a,0x27,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c,0xdd, +0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x25,0x7e,0x8, 0x35,0xe9,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18,0x26, +0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0x41,0xfb, +0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9,0x9, +0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x36,0x74, +0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36, +0x26,0xa, 0x37,0x12,0x81,0xbf,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x25,0x12,0xa1,0x4b,0x2d,0x13,0xbd,0xc1,0x28, +0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68,0x39, +0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x2c,0x40, +0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34,0x74, +0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71,0x74, +0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe8,0xbc, +0x7e,0x28,0x2, 0x41,0x60,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x33,0x12,0x2f,0xe4,0xbe,0xb0,0xff,0x68, +0x2b,0x9, 0x73,0x1f,0x35,0x12,0x30,0x3, 0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54,0x0, +0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, 0x12, +0x2f,0xe4,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc,0xf9, +0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19,0x75, +0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19,0xa3, +0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe,0x38,0x8a,0x90, +0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e, +0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xfd,0x12,0x97,0x4, 0x7e,0x8, 0x36, +0x25,0x74,0xff,0x12,0x20,0xde,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b, +0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xf5, +0x7a,0xf3,0x35,0xe8,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb3,0x28, +0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee, +0x80,0x2e,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x25,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac, +0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa, +0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbf,0x12,0x2f,0xd0,0xb, 0xf0,0xb, 0xe0, +0x12,0x9c,0xf6,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c,0xba,0x7c,0x7d, +0x12,0x30,0x3, 0xb, 0x1a,0x30,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3, +0x2a,0x6f,0xf5,0x40,0x7e,0xb3,0x2a,0x70,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a, +0xb3,0x33,0xc2,0x7a,0xb3,0x33,0xc0,0x7a,0xb3,0x33,0xc1,0x7e,0x8, 0x1f,0x34,0x12, +0x2f,0xdd,0xe4,0x12,0x20,0xde,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x33,0xc3,0xe4, +0x12,0x20,0xde,0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa2,0x6c,0xcc,0xe1,0x91,0x12,0xc0, +0x61,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, +0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34,0x7c, +0xbd,0x14,0xbc,0xbc,0x78,0x2, 0xe1,0x97,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x88, +0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, 0xb3, +0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x28,0xe5, +0x27,0xa, 0x2b,0xe5,0x25,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0, +0x4, 0x40,0x2, 0xe1,0x86,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x86,0x85,0x25, +0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb0,0x3f,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x40,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83,0x80, +0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2b, +0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x40,0x2d,0x34, +0xbd,0x38,0x18,0x2, 0xe1,0x1d,0x75,0x30,0x1, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x1, +0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x4, +0x40,0x2, 0xe1,0x1d,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x1d,0x7c,0xbf,0x20, +0xe0,0x2, 0xe1,0x1d,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26,0xbe, +0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1, +0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25, +0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50, +0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29, +0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x5, +0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24,0xe5, +0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29, +0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x5, +0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24,0xe5, +0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85,0x2b, +0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x2c,0x40,0x7a,0x35,0x3e,0xe5,0x2a, +0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe,0xb1, +0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93,0x5, +0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0,0x5, +0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c,0x50, +0xad,0xe5,0x2c,0x12,0x2f,0xae,0xe5,0x2a,0x12,0x2f,0xa5,0xe5,0x2a,0x12,0x2f,0xae, +0xe5,0x2c,0x12,0x2f,0xa5,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20,0x5, +0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x42, +0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0xe5,0x42,0xa, 0x1b, +0x6d,0x0, 0x12,0x1e,0xeb,0x7f,0x21,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, +0x28,0x12,0x1e,0xfc,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23, +0x3e,0x24,0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe, +0xb0,0x0, 0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x33,0xbf,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f, +0x34,0xf5,0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x1f,0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0xc0,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x8e,0x7e,0x8, 0x1f,0x34,0x12,0xaf,0x71,0x7a,0xb3, +0x33,0xc2,0xda,0x3b,0x22,0x7e,0x71,0x2d,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7e,0x71, +0x2b,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7c,0x7b,0x12,0x77,0xf6,0x9, 0xa2,0x27,0x72, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x91,0x6d,0x5c,0xba,0x22, +0x7e,0x70,0x1, 0x2, 0x51,0x5f,0xa, 0x3b,0x9d,0x32,0x2, 0x21,0x0, 0x90,0x60,0x9a, +0x93,0xa, 0x3b,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x12,0x2f, +0xf4,0x50,0xfb,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x7c,0x5b,0x7e,0x43,0x28, +0x84,0xbe,0x40,0x1, 0x28,0x2, 0x21,0x14,0x7e,0xa3,0x2a,0x6e,0x7e,0x70,0x2, 0xac, +0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x30,0x3, +0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc,0x7c,0x9d,0x7e,0x83,0x2a, +0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc,0xa, 0xa8,0x1b,0xa5,0xa, +0x5f,0xbd,0x5a,0x58,0x2, 0x21,0x14,0xa, 0x59,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48, +0x4e,0x7c,0xb9,0x14,0x12,0x31,0x5a,0x50,0x46,0x7c,0xb9,0x14,0x12,0x31,0x17,0xb, +0x1a,0xe0,0x7d,0x3b,0x12,0x31,0x4c,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf, +0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12, +0x31,0x1e,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x31,0x20,0x1b,0x1a,0xa0,0xa, +0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9,0x4, 0x12,0x31,0x5a,0x50, +0x43,0x7c,0xb9,0x4, 0x12,0x31,0x17,0xb, 0x1a,0xe0,0x7d,0x3c,0x12,0x31,0x4c,0x8, +0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12, +0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x31,0x1e,0xb, 0x1a,0x50,0xbd,0x5a,0x8, +0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x31,0x27,0x7d,0xd3,0x7d,0x5d,0x3e,0x54, +0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43,0x2a,0x6e,0x90,0x60,0xab, +0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7c,0x75,0xac,0x74,0xa, +0x2a,0x2d,0x32,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40, +0x2d,0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xab,0x6c,0x77,0x80,0x12, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x51,0x4f,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22, +0xb, 0x70,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe5,0xc3,0x22,0x12,0x36,0x9c, +0x60,0x30,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1b,0x7c,0xb2,0x12, +0x31,0x27,0x7d,0x3, 0x12,0x36,0x94,0x49,0x55,0x38,0xe8,0x7d,0x40,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd4,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc0,0xb4,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0x41,0xdd,0x6c,0xcc,0x41,0xcf,0x12,0xc0,0x61,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xb, 0x7e,0xb3,0x36,0x71,0x70, +0x5, 0x12,0x32,0xe0,0x80,0x6, 0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x30, +0x19,0xd2,0x3, 0x12,0x32,0xe7,0x7e,0xb3,0x36,0xec,0xb4,0x1, 0x1b,0x7e,0xb3,0x2a, +0x3, 0xb4,0x1, 0x14,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xd, 0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x3, 0x12,0x32,0xe0,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x27,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, +0x2d,0x1b,0x24,0xe5,0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24, +0x0, 0x80,0x3c,0xe5,0x24,0xbc,0xbc,0x68,0x34,0x12,0x35,0xda,0x9, 0xa3,0x26,0xfa, +0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5,0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x2f,0xd6, +0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a,0xa, 0x2b,0xe5,0x28,0x12,0x2f,0xd6,0xbe, +0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12, +0x36,0xa4,0x38,0xbf,0xe5,0x27,0x7e,0x71,0x28,0x12,0xa0,0x94,0x50,0x8, 0x12,0x31, +0x7d,0x12,0x35,0xd3,0x80,0x8, 0x12,0x69,0x84,0x50,0x3, 0x12,0x32,0xe0,0xe5,0x25, +0x7e,0x71,0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x33,0x21,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x16,0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e, +0x34,0x27,0x78,0x6d,0x22,0x12,0x7f,0xc5,0x12,0x31,0x7d,0xb, 0xf0,0xb, 0xc0,0x7e, +0x73,0x28,0x84,0xbc,0x7c,0x28,0x2, 0x21,0xc9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22, +0x75,0x25,0x3, 0x75,0x26,0x3, 0x22,0x12,0x36,0x9c,0x60,0x34,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1f,0x7c,0xb2,0x12,0x31,0x27,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x36,0x94,0x59,0x35,0x38,0xe8,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72,0x38,0xd0, +0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x35, +0x80,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x35,0x80,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x30,0x3, 0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x90,0x50,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0xc7,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0xb1,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0xaf,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0xaf,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x40,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0xaf,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x35,0x65,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x35,0x65,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0xb8,0x88,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x35,0x56,0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x35,0x56,0x9f,0x51,0x12,0x35,0x5d,0x9f,0x41,0x12,0x35,0x5d,0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0xeb,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xdf,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x35,0x71,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x35,0x71,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1e,0xeb,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x0, 0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x7, 0x2e,0x18,0x0, 0x20,0x22, +0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34, +0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39, +0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39, +0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d, +0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba, +0xda,0xf8,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x74,0xf5,0x27,0x12,0x0, 0x66,0x50,0x2, 0xc1, +0x6f,0x6d,0x33,0x9e,0x37,0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x70,0x7e, +0xb3,0x16,0x92,0x70,0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x60,0x7e,0x77,0x2a,0x51, +0x7e,0x67,0x2a,0x53,0x75,0x24,0x0, 0x80,0x4e,0xe5,0x24,0x12,0x2f,0xb7,0x60,0x45, +0x12,0x35,0xda,0x12,0x9d,0x80,0xf5,0x26,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90, +0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26,0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26, +0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0xd, 0xe5,0x25,0xa, 0x2b,0xe5, +0x27,0x12,0x9b,0x18,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x51,0x5f,0x12, +0x35,0xda,0x12,0x37,0x9f,0x5, 0x24,0x12,0x36,0xa4,0x38,0xad,0x12,0xa6,0x5, 0xda, +0x3b,0x22,0x12,0x46,0xa2,0x12,0x24,0x9a,0x12,0x73,0x28,0x12,0x22,0xf2,0x7e,0xb3, +0x37,0x8, 0x24,0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x58,0xf0,0x80,0xef,0x12, +0x29,0x7e,0x80,0xea,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x90,0x60, +0xa7,0xe4,0x93,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x12,0xa5,0xee,0x12, +0x9b,0x49,0x12,0x35,0xe2,0x12,0x9a,0x38,0x2, 0x36,0xbb,0xca,0x3b,0x12,0x2b,0xfa, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x9, 0xe4,0x7a,0xb3,0x35, +0xe4,0x7a,0xb3,0x35,0x69,0x7e,0xb3,0x35,0xe2,0x70,0x69,0x6c,0x99,0x80,0x5d,0x74, +0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x9a,0xed, +0x40,0x48,0x6c,0xee,0x80,0x3c,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x6a,0x9, 0xc5, +0x35,0x6b,0xa, 0x28,0xa, 0x3d,0x12,0x37,0x67,0x78,0x25,0xa, 0x2f,0xa, 0x3c,0x12, +0x37,0x67,0x78,0x1c,0x7c,0xb9,0x12,0x37,0x6f,0x7e,0x14,0x62,0x2b,0x12,0x87,0xee, +0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x51,0x5f,0x7c,0xb8,0x7c,0x7f,0x12,0x37,0xa7, +0xb, 0xe0,0x7e,0x73,0x35,0xe4,0xbc,0x7e,0x38,0xbc,0xb, 0x90,0x7e,0x73,0x28,0x84, +0xbc,0x79,0x38,0x9b,0x7e,0x73,0x35,0x69,0x7a,0x73,0x35,0xe4,0xa, 0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x35,0xa6,0x7e,0x8, 0x35,0x6a,0x12,0x20,0xb9,0x1b,0xfd,0xe4, +0x7a,0xb3,0x35,0xe2,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x0, 0x4d,0x33,0x22,0x7c, +0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x2, 0x2c, +0x40,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0x99,0x6c,0x7f,0x71,0x7c,0xbf,0x12, +0x37,0x6f,0x12,0xa4,0xcf,0x7f,0x17,0x12,0x1f,0x58,0x7c,0xb7,0xda,0xf8,0x22,0x9, +0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c,0x6b,0x7e,0xa3,0x35,0x69,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x62,0x35,0xa6,0x19,0x72,0x35,0xa7,0x7c,0xba,0x4, 0x7a,0xb3,0x35, +0x69,0x22,0xca,0xf8,0x6c,0xff,0x80,0x18,0x7c,0xbf,0x12,0x37,0x6f,0xbe,0x37,0x2a, +0x5c,0x58,0xb, 0x12,0x51,0x5b,0x7e,0x70,0x2, 0xac,0x7f,0x12,0x37,0x9f,0xb, 0xf0, +0x12,0x52,0x66,0x38,0xe3,0x12,0x2b,0xfa,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe, +0xa0,0x34,0x38,0x3, 0x2, 0x38,0xfd,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x10, +0x41,0x1c,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d, +0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x31,0xce,0x7e,0x39,0xb0,0xbe,0xa0,0x37, +0x68,0x2, 0x41,0x1c,0x75,0x1a,0x36,0x41,0x1c,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0, +0x39,0x78,0x1b,0x7e,0xf3,0x37,0xc0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc0,0xbe,0xa0, +0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x1c,0xbe,0xa0, +0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xc2,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc2,0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b, +0x44,0x41,0x1c,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x1c,0xbe,0xa0, +0x5e,0x78,0x26,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, +0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x1c,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0, +0x3d,0x78,0x1b,0x7e,0xf3,0x37,0xc4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc4,0xbe,0xa0, +0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x1c,0xbe,0xa0, +0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xc6,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc6,0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a, +0x9d,0x41,0x1c,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x37,0x9c,0x41,0x1c,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e, +0xf3,0x37,0xe1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xe1,0xbe,0xa0,0x4f,0x78,0x3, 0x75, +0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x31,0xcc,0x7e,0x39,0xb0,0x41,0x1c,0xbe,0xa0,0x51, +0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, +0xff,0x7e,0xb3,0x37,0xec,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a, +0xb3,0x37,0xec,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0x1c,0xbe, +0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xb5,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xb5,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x3a, +0x1f,0x41,0x1c,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0x91,0x41,0x1c,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e,0xbe,0xa0, +0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0xa, 0x9, 0xb3,0x31,0xd4,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1a,0xf4,0x80,0x5c, +0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5, +0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10, +0x3e,0x14,0x7e,0x1f,0x31,0xd0,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, +0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80, +0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c, +0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, +0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e, +0x3, 0x2a,0x6d,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x60,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, +0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, +0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x62,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca, +0xf8,0x80,0x38,0x7c,0xbf,0x12,0x3a,0x1f,0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70, +0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x12,0x3a,0xde,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x3a,0xde,0x7e,0x73,0x2a, +0x6e,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3, +0x2a,0x6d,0x74,0x2, 0xa4,0x22,0x12,0x3f,0xaa,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x37,0xdc,0x7e,0x8, 0x25,0xee,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x3f,0x49,0x80,0x12, +0xca,0x39,0x7e,0x18,0x37,0xdc,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x3f,0x67,0x2, 0x3b,0x15,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0xca,0xf8, +0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x7d,0xab,0xd2,0x6, 0xa1,0xa0,0xa5, +0xbe,0x1, 0x3d,0x7a,0x73,0x37,0x9d,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5,0xbf,0xae, +0x4, 0xd2,0x7, 0xa1,0xa0,0xa5,0xbf,0xaa,0x5, 0x12,0xc0,0xce,0x80,0x1e,0xa5,0xbf, +0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xce,0x80,0x10,0xa5,0xbf,0xac,0x2, +0x80,0x2, 0xa1,0xa0,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xce,0x6d,0x33,0x81,0x1c, +0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x3d,0xa3,0xa5,0xbe,0x7, +0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xa0,0xa5,0xbe,0x8, 0x2, 0x80,0x2, 0xa1,0xa0, +0x12,0x7, 0xfb,0xa1,0xa0,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73,0x37,0xa6, +0xa1,0xa0,0xa5,0xbe,0xb, 0x8, 0x12,0x3d,0xa3,0x12,0x3f,0xc8,0xa1,0xa0,0xbe,0x60, +0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x38,0xbe,0x60,0x1e,0x40,0xd, 0xbe, +0x60,0x23,0x38,0x8, 0x12,0x3d,0xa5,0x43,0xc, 0x40,0xa1,0xa0,0xbe,0x60,0x15,0x40, +0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x3d,0xa5,0xd2,0x6, 0xa5,0xbe,0x15,0x2, 0x80, +0x2, 0xa1,0xa0,0x74,0x7, 0x7a,0xb3,0x37,0xa0,0xa1,0xa0,0xa5,0xbe,0x19,0x7, 0xe4, +0x7a,0xb3,0x37,0xb5,0xa1,0xa0,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c,0x38,0x2, +0xa1,0x38,0xa5,0xbe,0x2d,0x1b,0x12,0x3d,0xa5,0x20,0x7, 0x2, 0xa1,0xa0,0x7e,0x63, +0x37,0xc8,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35,0x8, 0xa1, +0xa0,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, 0xa1,0x38, +0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1,0x38,0x7e,0x70, +0x64,0xa1,0x38,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, 0x1, 0x7e, +0xf3,0x37,0xc1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc1,0xa, 0x2f,0x19,0x72,0x2b,0x21, +0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x38,0xa1,0xa0,0xbe,0x60,0x3a, +0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xc3,0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, 0x80,0x2, +0xa1,0xa0,0x75,0x1a,0x3a,0xa1,0xa0,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, 0x7a,0x73, +0x2b,0x12,0xa1,0xa0,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xec,0xa1,0xa0,0xbe,0x60, +0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc5,0x7c,0xbf, +0x4, 0x7a,0xb3,0x37,0xc5,0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d,0x2, 0x80, +0x2, 0xa1,0xa0,0x75,0x1a,0x3c,0xa1,0xa0,0xbe,0x60,0x3e,0x68,0x4, 0xa5,0xbe,0x3f, +0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc7,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc7,0xa, +0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x3e, +0xa1,0xa0,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x3d,0xa5,0x75, +0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x3d,0xa5,0x75,0xd, 0x2, 0x12,0x3a, +0xe6,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x3d,0xa5,0x12,0x3f,0x70,0x80,0x71,0xbe, +0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x3d,0xa5,0x80,0x63,0xbe,0x60,0x4e, +0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xe2,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xe2,0xa, 0x2f,0x2e,0x27,0x31,0xcc,0x7a,0x29,0x70,0xa5,0xbe,0x4f, +0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80,0x31,0xbe, +0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20,0x7c,0xb7, +0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, 0x7e,0x1f, +0x31,0xd0,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a,0x71,0xf, +0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0x9c,0x22,0x7a,0xb3,0x2b,0x0, +0x70,0x14,0x12,0x3f,0x67,0x12,0x3b,0x15,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4, +0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x3f,0x49,0x12,0x3b,0x15,0x12, +0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12,0x0, 0x1e, +0xe4,0x12,0x3d,0xac,0x12,0x3d,0xf3,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12,0x3d,0xac, +0x2, 0x3d,0xf3,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e,0x8, 0x1f, +0x44,0x12,0x3f,0xe9,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x20,0xde,0x7e, +0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x1f,0xda,0x7e, +0x34,0x0, 0xa, 0x12,0x20,0xde,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc,0x7a,0x1d, +0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, 0x2a,0xb9, +0x12,0xba,0x4c,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, 0x3a,0x2e, +0x34,0x20,0x73,0x12,0x91,0x6d,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12, +0x3f,0xb, 0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a, +0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9, +0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x3f,0xb, 0xa, 0x4a, +0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde, +0x38,0xd8,0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0, +0x12,0xb8,0xe2,0x80,0x3, 0x12,0x3f,0xd9,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f, +0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e, +0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34, +0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e, +0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x12,0xae,0xfc,0x12,0x13,0xf5,0x12, +0xb9,0x6e,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x3f,0xcb,0x74,0x1, 0x12, +0x3d,0xac,0x12,0x3f,0xd2,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x3d,0xdb,0x7e, +0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25, +0xee,0x22,0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x3f,0x67,0x80,0x6, 0xb4,0x1, 0x6, +0x12,0x3f,0x49,0x12,0x3b,0x15,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22, +0x12,0x3f,0xaa,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x37,0xdc, +0x12,0x20,0xb9,0x1b,0xfd,0x12,0xc0,0xc5,0x12,0x3f,0x49,0x80,0x1a,0xca,0x39,0x7e, +0x18,0x2b,0x70,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x37,0x2b,0x76, +0x7a,0x37,0x31,0xcc,0x12,0x3f,0x67,0x2, 0x3b,0x15,0x7e,0xb3,0x37,0xe0,0x7e,0x34, +0x0, 0x4, 0x22,0x7c,0x6b,0x12,0x3f,0xe1,0x78,0x5, 0x7c,0xb6,0x2, 0x7d,0xd6,0xb4, +0x4, 0x5, 0x7c,0xb6,0x2, 0x3b,0x1e,0x22,0xb2,0x82,0x22,0x7d,0x32,0x74,0xfa,0x2, +0x12,0xd0,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x20, +0xde,0x7e,0xb3,0x37,0x9c,0xc4,0x54,0x7, 0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, +0x20,0xde,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x30,0x6, 0x3b,0xc2,0x6, +0x12,0x25,0xe6,0x7e,0x73,0x37,0xa1,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x37,0xa2,0x7a, +0x73,0x2b,0x1d,0x7e,0x73,0x37,0xa2,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x37,0xa3,0x60, +0x18,0x7e,0x34,0x0, 0x2, 0x12,0x41,0x5d,0x7e,0x34,0x0, 0x1, 0x12,0x41,0x5d,0x6d, +0x33,0x12,0x41,0x5d,0xe4,0x7a,0xb3,0x37,0xa3,0x12,0x4f,0xfa,0x2, 0x40,0x3f,0xe5, +0xc, 0x70,0x2, 0x21,0x5c,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x72,0x92, +0x12,0x79,0x31,0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53, +0xc, 0xfd,0x12,0xba,0x3, 0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b, +0x12,0x60,0x9, 0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65, +0x7e,0x73,0x2b,0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x4, +0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3, +0x45,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xce,0x7a,0x73,0x2b,0xf, 0x12,0x87,0x52,0x7a, +0xb3,0x0, 0x4f,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x4f,0x7a, +0x73,0x37,0xa6,0x12,0x6e,0x29,0x12,0xc0,0x22,0x7e,0x73,0x37,0xcf,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xae,0xfa,0xe4, +0x12,0xa, 0x66,0x12,0x8d,0xec,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43, +0x37,0xd0,0x7e,0x50,0xa, 0xac,0x45,0x12,0x3f,0xcb,0xe5,0xc, 0x30,0xe6,0x4e,0x53, +0xc, 0xbf,0x7e,0x73,0x37,0xbc,0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37, +0xbc,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x43,0xeb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63, +0x37,0xbc,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12,0x47,0x81,0x7c,0x65,0x4c,0x76,0x74, +0xe, 0x12,0x43,0x5f,0x12,0x43,0xeb,0x12,0x43,0xf3,0x7e,0x73,0x37,0xbf,0x7a,0x73, +0x2b,0x14,0x7e,0x73,0x37,0xbe,0x7a,0x73,0x2b,0x1f,0x12,0xc0,0xd7,0xe5,0xc, 0x30, +0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xa6,0x2, 0x48,0x77,0x22,0xca,0xd8,0xca, +0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c, +0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x57, +0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x43,0xeb,0x7c,0x8b,0x74,0x7, 0x7e, +0x70,0xf, 0x12,0x43,0xf0,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, +0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, +0xc, 0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e, +0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x38,0xc4,0x12,0x43, +0x48,0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x38,0xc4,0x78,0x7, 0x12,0x43, +0x48,0x54,0xfb,0x80,0x5, 0x12,0x43,0x48,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x38, +0xc0,0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e, +0xa0,0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0x12,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff, +0xe, 0x12,0x43,0x53,0x54,0xe6,0x12,0x43,0x50,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12, +0x43,0x53,0x5e,0x54,0xfe,0xe6,0x12,0x43,0x50,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4, +0x0, 0x2, 0x78,0x2d,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e,0x54,0x0, 0xf, 0x1b, +0x1a,0x50,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34, +0x0, 0x2, 0x12,0x44,0x72,0x12,0x44,0x4b,0x12,0x44,0x28,0x7a,0x37,0x31,0xd4,0x61, +0x4, 0x6c,0xdd,0x41,0xfe,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40, +0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, +0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c, +0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e, +0x54,0x0, 0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4, +0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, +0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, +0x3b,0x12,0x44,0x72,0x12,0x44,0x4b,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x44,0x4b, +0x12,0x44,0x28,0x74,0x2, 0xac,0xbd,0x59,0x35,0x31,0xd6,0x80,0xf, 0x12,0x44,0x28, +0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x31,0xd6,0xb, 0xd0,0xbc,0xed, +0x28,0x2, 0x41,0x65,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x43,0xf0,0xa9,0xc0, +0xc4,0x7e,0x1f,0x38,0xc0,0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x38,0xc0,0x79,0xf1,0x0, +0x90,0x6d,0x33,0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0x8, 0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x10,0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22, +0x1b,0x1a,0x50,0x7e,0x1f,0x38,0xc0,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5, +0xfd,0x7a,0x71,0xfe,0x22,0xca,0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12, +0x43,0x5f,0x74,0xf, 0x12,0x43,0xeb,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe, +0x12,0x43,0x5f,0x74,0xc, 0x12,0x43,0xeb,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, +0x7e,0x70,0xf8,0x12,0x43,0x5f,0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, +0x38,0xb, 0x12,0x45,0x6, 0x7c,0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17, +0xe4,0x93,0xb4,0x1, 0xe, 0xbe,0xa0,0x7, 0x28,0x9, 0x12,0x45,0x6, 0xa, 0x77,0x2e, +0x74,0x0, 0x7, 0x74,0xe, 0x7c,0x7f,0x12,0x43,0x5f,0x74,0x7, 0x12,0x43,0xeb,0x7c, +0xfb,0x5e,0xf0,0xfb,0x90,0x60,0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c, +0xf7,0x74,0x7, 0x7c,0x7f,0x12,0x43,0xf0,0xda,0x79,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x12,0x43,0x5f,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24, +0x7e,0x24,0x0, 0x12,0x12,0xb7,0x9d,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74, +0x3, 0x7e,0x71,0x27,0x12,0x43,0x5f,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x43,0x5f,0x74, +0xc, 0x7e,0x71,0x30,0x12,0x43,0xf0,0x22,0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0xa, +0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e, +0xf, 0x38,0xc4,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0x12,0x5e, +0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34, +0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x45,0x15, +0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6, +0x22,0x12,0x47,0xf8,0xc2,0x3, 0x12,0xb6,0x2d,0xc2,0x5, 0x12,0x45,0x51,0xc2,0x3, +0x12,0x47,0x21,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0xeb,0x7a,0x1b,0xb0,0x74,0xf, +0x6c,0x77,0x12,0x43,0x5f,0xe5,0xfc,0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x43,0xf3, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x2a,0x12,0x44,0x6e,0x12,0xb5, +0xe5,0x2, 0xb6,0x9a,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x1a,0x12,0x44,0x6e,0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0xc, 0x12,0x44,0x6e,0x2, 0xb6,0x94,0x74, +0x1, 0x7a,0xb3,0x33,0xff,0x22,0xa, 0x3a,0x2e,0x34,0x0, 0x3, 0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0x5f,0x7a,0x61,0xfc,0x12,0x43,0xf3, +0x12,0x46,0x68,0xd2,0x3, 0x12,0x47,0x21,0x12,0x45,0x6b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x45,0x6b, +0x2, 0x13,0x96,0x12,0x47,0xf8,0xc2,0x5, 0x2, 0x45,0x51,0xd2,0x5, 0x12,0x45,0x51, +0x74,0x1, 0x22,0x12,0x45,0xcf,0x12,0x91,0x8, 0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0xc0,0xab,0x12,0x44,0x91,0x74,0x1, 0x12,0x46,0x7, 0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x45,0x30,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x45,0x5a,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x45,0xcf,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x46, +0x7, 0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x45,0x5a,0x74, +0x81,0x7a,0xb3,0x39,0x2, 0x22,0x80,0x1d,0x12,0x45,0xcf,0x12,0x47,0xff,0x68,0x5, +0xc2,0x4, 0x12,0x45,0x5a,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x17, +0x15,0xe4,0x12,0x46,0x7, 0x20,0x93,0xe0,0x12,0x45,0xcf,0xa9,0xd1,0xcd,0xa9,0xc5, +0xea,0x74,0x2, 0x2, 0x46,0x7, 0x22,0x7c,0xab,0x7e,0xb3,0x39,0x2, 0xb4,0x81,0x38, +0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf, +0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, +0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87, +0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0x2, 0x22,0xd2,0x3, +0x80,0x12,0x30,0x3, 0xc, 0x12,0x47,0xff,0x68,0x7, 0xc2,0x3, 0xc2,0x4, 0x12,0x45, +0x5a,0x12,0x45,0xd6,0x30,0x17,0xeb,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb, +0xd2,0x3, 0x12,0xb6,0x2d,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, +0xa9,0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74, +0x41,0x12,0x45,0x15,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda, +0xf8,0x22,0xe4,0x12,0x46,0xf0,0x12,0xb6,0x36,0x12,0x26,0x57,0x12,0xb6,0xb1,0x12, +0x43,0x65,0x12,0xb5,0xdb,0x12,0xb6,0x4d,0x12,0x0, 0x4a,0x12,0xb6,0x59,0x12,0x7e, +0xa0,0x12,0xb6,0x69,0xd2,0xaf,0x12,0x47,0x8a,0x12,0xb8,0x6e,0x12,0x43,0xfa,0x12, +0x46,0x68,0x7e,0x8, 0x3, 0xf1,0x12,0xa9,0x80,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34, +0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0xa9,0xd0, +0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x45,0x51,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75, +0xc2,0xc, 0xd2,0x3, 0x12,0x47,0x21,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1, +0x22,0xa2,0x3, 0xa9,0x97,0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x7e,0x34,0x36,0xe1, +0x30,0xd, 0x4b,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x4f, +0x9, 0x53,0x0, 0x3, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12, +0x47,0x7f,0x7a,0x27,0x2a,0x53,0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a, +0x27,0x2a,0x5a,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a, +0x5c,0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0x45,0xc, 0x7a,0x37,0x2a,0x62,0x22,0xa, +0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12, +0x43,0xeb,0x7c,0x7b,0x12,0x43,0xf3,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e, +0x24,0x0, 0xef,0x7e,0xf, 0x38,0xc0,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e, +0xf, 0x38,0xc0,0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x38,0xc0,0x79, +0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x38,0xc0,0x79, +0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8a,0x7e, +0x34,0x6a,0xd1,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e, +0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8e,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x12,0xc0,0xce,0x12,0xc0,0xc5,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x48,0x56,0x12,0x48,0x30,0x74,0x50,0x7a,0xb3,0x37,0xd0,0x7e,0x24, +0x3, 0x20,0x12,0x3f,0xcb,0xe4,0x12,0xc0,0x7, 0x6d,0x33,0x7a,0x37,0x39,0x4, 0x22, +0x7e,0x73,0x2b,0x62,0x7a,0x73,0x37,0xcf,0x22,0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37, +0xca,0x7e,0x73,0x37,0xce,0xbe,0x73,0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12, +0x48,0x56,0x12,0x48,0x30,0x22,0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x7e,0x73, +0x2b,0x1f,0x7a,0x73,0x37,0xbe,0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x7e,0x73, +0x2b,0x14,0x7a,0x73,0x37,0xbf,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, +0x12,0x48,0xe8,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80, +0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x48,0xe8,0x40, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c, +0xdd,0x7c,0xbd,0x12,0x8d,0xb3,0x12,0x48,0x6e,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x37, +0xbe,0x12,0x49,0x4, 0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x12,0x48,0x30,0x7a, +0xd3,0x37,0xa6,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26, +0x33,0xbc,0xbe,0x22,0x30,0x3, 0x3, 0x12,0x48,0x6e,0xa2,0x4, 0x92,0x5, 0x12,0x49, +0xc3,0x2, 0x49,0x4, 0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x22,0x74,0x40,0x12, +0x6e,0x8b,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x48,0xf4,0x80,0x1c,0x74,0x1, 0x12, +0x49,0x47,0x7e,0x43,0x37,0xbb,0x7e,0x50,0x64,0xac,0x45,0x12,0x87,0xf8,0x7a,0xb3, +0x2b,0x1f,0x7e,0xf, 0x38,0xd9,0x12,0x4d,0x9b,0x12,0x49,0x4, 0x7e,0x73,0x2b,0x1f, +0x7a,0x73,0x37,0xbe,0x2, 0x48,0x6e,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14, +0x12,0xc0,0x22,0x7e,0xc0,0xa, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x1f,0x38,0xd9,0x12,0x90,0x58,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, +0x12,0x49,0xb7,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12, +0x49,0xb7,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x49,0xb7,0xb, +0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x38, +0xd9,0x12,0x8f,0xfb,0x7d,0x73,0x7e,0x1f,0x38,0xc8,0x69,0x31,0x0, 0x1a,0x7a,0x73, +0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, 0x1a,0xb, +0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x37,0xb1, +0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5,0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3, +0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a,0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35, +0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x31,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x4e,0x5f,0x6c,0xff,0x80,0x35,0x12,0x4c, +0x40,0x6c,0xee,0x80,0x19,0x7e,0x11,0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac, +0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x10,0x12,0x4c,0x47,0xe5,0x2e, +0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12,0x4c,0x56,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34, +0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xc5,0x12,0xc0,0x90,0x68,0xb, 0x7e,0x34, +0x10,0x0, 0x12,0x4c,0x7c,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x78,0x12,0x4c,0x40, +0x6c,0xee,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2a,0xbc,0xbe,0x38,0xe6,0xe5,0x2a, +0x12,0x4c,0x56,0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x60,0xe5,0x2a,0xbe,0xb1,0x2d, +0x50,0x35,0x12,0x4c,0x40,0x7e,0xe1,0x2a,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2d, +0xbc,0xbe,0x38,0xe6,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5,0x2d,0xa, 0x1b,0x6d,0x0, +0x9f,0x1, 0x12,0x4c,0x5a,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x3, 0x62,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x82,0xe5,0x2d,0xa, 0x1b,0x6d, +0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x1f,0x7, 0x6c,0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, 0x9d,0x15,0xad,0x12, +0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21, +0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xcc, +0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x7, 0x6c,0xff,0x80, +0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x60,0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10, +0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x60,0xe5,0x2a, +0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x62,0x2e,0x14,0x10, +0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x62,0xb, 0xf0,0xe5,0x2b,0xbc, +0xbf,0x38,0x9e,0x7e,0x73,0x37,0xb3,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14, +0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x5, 0x7d,0xe3,0x7a,0xe5,0x35, +0x7e,0x73,0x37,0xb4,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d, +0x1f,0x12,0x1f,0x5, 0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, 0xac,0xbf,0x49,0x45, +0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x34,0x0, 0x80,0x8, +0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xda, +0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x60,0xbe,0x45,0x35,0x28, +0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x60,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65, +0x3, 0x60,0x49,0x45,0x3, 0x62,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35, +0x3, 0x62,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x62,0xb, 0xf0,0xe5,0x2b, +0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x31,0x12,0x4d,0x9b,0xda,0x3b,0x22, +0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a, +0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f, +0x7, 0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x1f,0x5, 0x7e,0xa1,0x2c,0x74, +0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x4e,0x5f,0x7e,0x1f,0x38,0xf3, +0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x6, +0x7e,0x38,0x38,0x88,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x87,0x70,0xe, 0x7e,0xb3,0x38,0x85,0x70,0x8, +0x74,0x1, 0x7a,0xb3,0x38,0x87,0xa1,0x57,0x7e,0xb3,0x38,0x87,0x70,0x6, 0x74,0x1, +0x7a,0xb3,0x38,0x87,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0, +0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61, +0x59,0x12,0x23,0x9e,0x7a,0x35,0x2e,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0xa6,0x56, +0x75,0x2c,0x0, 0x80,0x16,0x12,0x4c,0x7c,0x12,0x4d,0x84,0xbe,0x35,0x2a,0x8, 0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x84,0x7a,0x35,0x2a,0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c, +0x38,0xe3,0x12,0x4d,0x93,0x40,0x25,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x1e,0x5, 0x1c, +0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c,0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20,0xb9,0x1b,0xfd,0x74,0x2, 0x12,0x0, +0x1e,0x12,0x4d,0x93,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x38,0xf2,0xe4,0x7a,0xb3,0x38, +0x87,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, 0x21,0x0, 0x7f,0x13,0x2d,0x35,0xb, +0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35,0x2a,0x22,0x12,0x4d,0xa5,0xb, 0x34, +0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x12,0xc1,0x17,0x4c,0xaa, +0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c,0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4, +0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60, +0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e,0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, +0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc, +0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, +0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12,0x1f,0x7, 0x7f,0x1, 0xb, 0xc, 0x7e, +0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f,0x7, 0xbe,0x34,0x0, 0xfa,0x28,0x4, +0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, 0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d, +0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e,0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e, +0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27, +0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e, +0x34,0x0, 0x38,0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12, +0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, +0x12,0x4e,0x8d,0x80,0x2, 0xe4,0x22,0x12,0x4e,0x72,0x74,0x1, 0x22,0x12,0xc0,0x75, +0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0x12,0x7f,0x6f,0x38,0x2, +0xe4,0x22,0x12,0x7f,0x67,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x4e, +0xb4,0x2, 0x4e,0x7d,0x7e,0xd7,0x2b,0xd, 0xbe,0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12, +0x7e,0xf8,0x12,0x4e,0xe0,0x7a,0xd7,0x2b,0xd, 0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e, +0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, 0x12,0x4f,0xaf,0x74,0x1, 0x22, +0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b,0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a, +0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x4e,0xe0,0x12,0xc0,0xbd,0x12,0x29,0x6f, +0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x20,0xde,0x7e,0xd0,0x7, 0x12,0x26,0x57,0x6c, +0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x12,0x4f,0xf0,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, +0x3c,0xbd,0x32,0x48,0xde,0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x7e,0xb3, +0x2a,0x73,0x7c,0x7e,0x12,0x7b,0x31,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49, +0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0x4f,0xf0,0x5c,0x7b,0x7a, +0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe, +0xd0,0x0, 0x58,0x88,0x12,0x7b,0x39,0x74,0x2, 0x12,0xc0,0xe0,0x12,0x50,0x51,0x74, +0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2a,0xfa,0x12,0x4e,0xe0,0xda,0x3b,0x22,0x74,0x2, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x12,0x50,0x51,0x74,0x2, 0x12,0x0, 0x1e,0x74, +0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x4f,0xc1,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, +0x94,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x2e,0x34,0x20,0x73,0x12, +0x91,0x6d,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x38,0xc0,0x2d, +0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x74,0xbc,0x6a,0x38,0xd6,0x22, +0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, +0x30,0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x4e,0xe0,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, +0xfd,0x7e,0xb3,0x37,0xe0,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc0,0xe0,0x12, +0x50,0xd4,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xe1,0x7e, +0xb3,0x37,0xe0,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x3f,0x67,0x80,0x7, 0xe4, +0x12,0x0, 0x1e,0x12,0x3f,0x49,0x12,0x3b,0x15,0x7e,0xb3,0x2a,0xfc,0x2, 0x50,0x51, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x3f,0xe9,0x7e,0xa3,0x2a,0x73, +0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x62,0x2a,0xdc,0xa, 0x26, +0x12,0x51,0x4b,0x93,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x50,0xca, +0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xde,0x6c,0xee,0x80,0x1a,0xa, 0x2e, +0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12, +0x50,0xca,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30, +0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba, +0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27,0x2a,0xfe,0x7e,0x29, +0xb0,0xa, 0x26,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xe9,0x7e, +0xa3,0x2a,0x73,0x7e,0x63,0x2a,0x74,0x6c,0xee,0x80,0x1f,0xa, 0x2e,0x9, 0x72,0x2a, +0xdc,0xbe,0x70,0x1c,0x50,0x12,0xa, 0x27,0x12,0x51,0x4b,0x93,0x7c,0x7b,0x7e,0xb3, +0x2a,0xfb,0xa, 0x27,0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xdd,0x6c,0xee, +0x80,0x17,0xa, 0x3e,0x9, 0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a, +0xfb,0xa, 0x27,0x19,0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e, +0x30,0xe, 0xac,0x3e,0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11, +0xf8,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0x73,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7a,0xb3,0x34,0xc4,0x7c,0xbf,0x6c,0x77,0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x51,0x4f,0x93,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff, +0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0xca, +0xf8,0x6c,0xaa,0x6d,0x33,0x7e,0x24,0x7f,0xff,0x7e,0xf0,0x1, 0x80,0x32,0xa, 0x1f, +0x7e,0xb3,0x2a,0x6e,0xa, 0xb, 0x2d,0x1, 0x3e,0x4, 0x49,0x10,0x4, 0xfc,0xbe,0x14, +0x3, 0xe8,0x8, 0x1a,0xb, 0xa0,0xbd,0x13,0x8, 0x4, 0x7d,0x31,0x80,0x10,0xbd,0x12, +0x58,0xc, 0x7d,0x21,0xbe,0x24,0x0, 0x0, 0x18,0x4, 0x7e,0x24,0x0, 0x1, 0xb, 0xf0, +0x7e,0xb3,0x2a,0x6f,0xa, 0xb, 0x1b,0x4, 0xa, 0x1f,0xbd,0x10,0x48,0xc0,0x7e,0xb3, +0x34,0xa1,0x7a,0xb3,0x36,0xf3,0x7a,0xa3,0x36,0xf7,0xe4,0x7a,0xb3,0x36,0xf5,0xbe, +0xa0,0xb, 0x78,0x18,0x9d,0x32,0xbe,0x34,0x4, 0xb0,0x58,0x10,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x1, 0x5e,0x58,0x6, 0x74,0x1, 0x7a,0xb3,0x34,0xa1,0x7e,0x73,0x34,0xa1, +0xbe,0x70,0x0, 0x28,0x3e,0x6c,0xff,0x80,0x35,0x7c,0xbf,0x12,0x97,0xfc,0x60,0x22, +0x74,0x22,0x7a,0xb3,0x36,0xf4,0x7e,0xb3,0x34,0xc4,0x4, 0x12,0x51,0x57,0x7e,0x73, +0x34,0xc4,0xbe,0x70,0x5, 0x40,0x15,0xe4,0x7a,0xb3,0x34,0xc4,0x7a,0xb3,0x34,0xa1, +0x80,0xa, 0xe4,0x12,0x51,0x57,0x74,0x33,0x7a,0xb3,0x36,0xf5,0xb, 0xf0,0x12,0x52, +0x66,0x38,0xc6,0xda,0xf8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xca,0xd8,0xca, +0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x3c,0xe4,0x7a,0xb3,0x1f,0x58,0xe5,0x1d, +0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60,0xc, 0x12,0x8c,0x87, +0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x10,0x6d,0x88,0x7a,0x87,0x37, +0xfd,0x61,0xa0,0x12,0x93,0x91,0x60,0x12,0x7e,0x34,0x62,0xe, 0x12,0x87,0xc4,0x7a, +0x87,0x37,0xf3,0x12,0x54,0x2b,0x7a,0x87,0x37,0xfd,0x7e,0x87,0x37,0xf3,0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x7b,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x52,0x7c,0xbd, +0x7c,0x7e,0x12,0x55,0xb9,0x7d,0x93,0x7e,0x87,0x37,0xfd,0xbd,0x89,0x50,0x4, 0x7a, +0x97,0x37,0xfd,0x7e,0x87,0x38,0x3c,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x3c,0xe5, +0x1d,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x37,0xff,0x12,0x54,0x4e,0x50,0x7, 0x12, +0x54,0x45,0xd2,0x3, 0x80,0x2f,0x7e,0x8, 0x37,0xff,0x7e,0x18,0x1f,0x52,0x12,0x57, +0x0, 0x50,0x22,0x80,0x10,0x12,0x54,0x2b,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f,0x52, +0x12,0x91,0x86,0x50,0x10,0x12,0x54,0x45,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52, +0x12,0x93,0x6b,0xd2,0x3, 0xb, 0xf0,0x12,0x52,0x66,0x38,0x80,0x30,0x3, 0x37,0x6c, +0xff,0x80,0x20,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x58,0x12,0x54, +0x4e,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x54, +0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdb,0x75,0x1d,0x0, 0x7e,0x34,0x62,0xe, 0x12, +0x23,0x9e,0x7a,0x37,0x37,0xf3,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, 0xac,0x67,0xb, +0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x37,0xff,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x37,0x37,0xf3,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93,0xa, 0x3b,0xbe, +0x37,0x37,0xfd,0x38,0x40,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37,0x38,0x3c,0x38, +0x34,0x90,0x60,0x51,0x12,0x54,0x33,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, +0x24,0x90,0x60,0x50,0x12,0x54,0x33,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, +0x14,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x54,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf4,0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0xa2,0x3, 0x92,0x10,0x12, +0x56,0xe9,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xb, 0x70,0x1b,0x7e, +0xb3,0x28,0xa8,0x70,0x15,0x12,0xc1,0x7, 0x68,0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0, +0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x51,0x5f,0x22,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0xd5,0x26,0xfa,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x7c,0xbd, +0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f, +0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0, +0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, +0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38, +0xc9,0xa2,0x4, 0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28,0x99, +0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73, +0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f, +0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, +0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x55,0xa6,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3, +0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e, +0xb3,0x26,0x83,0x70,0x40,0x12,0x8f,0xe3,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x55,0xa6,0x49,0x2, +0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49, +0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, +0xf0,0xbc,0x7f,0x38,0xc9,0x12,0xb1,0x64,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28, +0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28, +0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x55,0xaf,0x49,0x25, +0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x0, 0xbe,0x37,0x28,0x9d,0x8, +0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdc,0x6c, +0xff,0x80,0x9, 0x12,0x55,0xaf,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf2,0xda,0x79,0xda,0xd8,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0x7c, +0xbf,0x12,0x37,0x6f,0x74,0x2, 0xac,0xbf,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f, +0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c,0xcc, +0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c, +0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14, +0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12, +0x20,0xde,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a, +0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1c,0x75,0x26,0x0, +0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56,0xd3,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf1,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xdf,0x7c,0xec, +0x80,0x23,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80,0xa, 0x12,0x91,0xd5, +0x70,0xd, 0x12,0x56,0xd3,0xb, 0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5, +0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd8,0x1a,0x3c,0xb, 0x34,0x7c,0xe7, +0x80,0x1c,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56, +0xd3,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf1,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73, +0x2a,0x6e,0xbc,0x7e,0x18,0xdc,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x21,0x75,0x26, +0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xa, 0x12,0x91,0xd5,0x70,0xd, 0x12,0x56,0xd3,0xb, +0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e, +0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd7,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, +0xda,0x3b,0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35,0x24,0x22,0x12,0x57, +0x32,0x12,0x51,0x9f,0x7a,0xb3,0x2a,0xc, 0x22,0x30,0x10,0x13,0x12,0xc0,0xf7,0x68, +0x6, 0x7e,0xb3,0x39,0xb, 0x60,0x8, 0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x37,0xfb,0x22, +0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f, +0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x54,0x52,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76, +0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9, +0xc3,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34,0xa2,0x6c,0x33,0x80,0x3d,0x7e, +0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc, +0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32, +0x12,0x35,0x67,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3, +0x34,0xa2,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf, +0x2, 0x57,0x83,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac, +0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c, +0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26, +0xfb,0xa, 0x28,0xa, 0x31,0x12,0x35,0x67,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x35, +0x67,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0, +0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3e,0xbe,0xb0,0x0, 0x28,0x12,0x14, +0x7a,0xb3,0x35,0x3e,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2a, +0x5a,0x7e,0xb3,0x36,0xec,0x70,0x58,0x7e,0xb3,0x39,0xb, 0x70,0x52,0x7e,0xb3,0x36, +0x71,0x70,0x4c,0x7e,0x37,0x37,0xfd,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28, +0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f, +0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3, +0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, +0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x35,0x3e,0xda, +0xf8,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e,0x7e,0xf3,0x2a,0x6d,0xac,0xf7, +0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x20,0xde,0x7e,0xb3,0x37,0xb7, +0xb4,0x1, 0x64,0x7e,0x73,0x37,0xb8,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c, +0x12,0x26,0x57,0x12,0x28,0x62,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49, +0x33,0xd, 0xc8,0x12,0x21,0x0, 0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14, +0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34, +0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xb8, +0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, +0xd, 0xc8,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0x4, 0xe4,0x2, 0x58,0xe8,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0x12,0x68,0x10,0x12,0x7d,0x94,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0x74,0x12,0xb6,0xb8, +0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x91,0x18,0x12,0x47,0x2c, +0x12,0x28,0x62,0x50,0xde,0x12,0xab,0xb8,0x12,0x75,0xe9,0x7e,0xb3,0x37,0x5, 0xb4, +0x1, 0x4, 0xe4,0x12,0x58,0xe8,0x12,0xaf,0x66,0x12,0xa7,0xbd,0x12,0x5e,0xaa,0x40, +0xc2,0x12,0x88,0x5f,0x12,0x5e,0xaa,0x40,0xba,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x0, 0x6e,0x12,0x5f,0x2f,0x12,0x5f,0x83,0x12,0x5b,0x94,0x12,0x96,0x24,0x12,0x5e, +0xc2,0x12,0x5f,0xcd,0x12,0xaa,0xc3,0x12,0x87,0x74,0x7e,0xb3,0x36,0xf1,0xbe,0xb0, +0x88,0x68,0x3, 0x12,0x59,0x77,0x12,0x67,0xfa,0x12,0x26,0x66,0x12,0x62,0xa5,0x80, +0x82,0x12,0x2f,0xee,0x2, 0x58,0xdc,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x12,0x35, +0xd3,0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, +0x7e,0xb3,0x2a,0x7, 0x70,0x8, 0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0x61,0x6b,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x28,0x80,0x4, 0x7e,0x68,0x32,0xea,0x7f,0x6, 0x12,0x7e,0xef, +0x7e,0x73,0x2a,0x4, 0x7a,0x6b,0x70,0x6c,0xdd,0x61,0x1c,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x5e,0x3d,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x61,0x1a,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x61,0x1a,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x9e,0xec,0x50,0x2, 0x61,0x1a,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3, +0x2a,0x9, 0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xd6,0x6d,0x22,0x74,0x1, 0x12,0x7f,0xd4,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xe0,0x6d,0x22,0x74,0x10,0x12,0x7f,0xd4,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xd6,0xf5,0x25,0x9, 0xb3,0x32,0xe0,0xf5,0x26,0xa, 0x3c,0x12,0x5e, +0x3d,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xd6,0x19,0xb3,0x32,0xe0,0x12, +0x35,0xd3,0x7e,0xb3,0x2a,0x64,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd, +0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac, +0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x2c,0x75,0x27, +0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x6a,0x54,0xf, +0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x66,0x49,0xa3,0x33,0x68,0x80,0xc, 0x5, 0x27, +0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, 0xff,0x5e,0xa4, +0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5, +0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0, +0xe5,0x28,0xa, 0x5b,0x12,0xb9,0x3c,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e, +0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13, +0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26, +0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x4d, +0xbc,0x7d,0x28,0x2, 0x21,0xbb,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x31, +0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38, +0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0xa, 0xb2,0xe, 0x12,0x7e,0x81,0x74,0x1, 0x12,0x58, +0xe8,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x5e,0x61,0xe4,0x7a,0xb3,0x2a, +0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, 0xe4,0x12,0x58,0xe8,0x12, +0x5f,0xc2,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x66,0x12,0x20,0xb9,0x1b, +0xfd,0x4c,0xff,0x78,0xc, 0x12,0x73,0xe5,0x7e,0x8, 0x33,0x66,0x74,0xff,0x12,0x20, +0xde,0xda,0x3b,0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70, +0xff,0x12,0x5e,0x8b,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f, +0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe2,0x7e,0x73,0x2a,0x2, +0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x2, 0xa1,0xab,0x6c,0xaa,0x80,0x10, +0x7e,0x44,0x7f,0xff,0x12,0x5e,0x95,0x79,0x40,0x0, 0x14,0x12,0x5e,0x45,0xb, 0xa0, +0x12,0x5e,0x25,0x38,0xeb,0xa1,0xab,0x7e,0xb3,0x34,0x4f,0x70,0x3d,0xbe,0x70,0x0, +0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12, +0x5e,0x95,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30, +0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0, +0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xce,0xa1,0xab,0x6c,0xaa,0x80,0x17,0x12,0x5e, +0x57,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe4,0x6c,0xaa,0x80,0x41,0x6c,0xff, +0x80,0x36,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe, +0x34,0x7f,0xff,0x68,0x21,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x18,0x12,0x5e, +0x35,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x5e,0x4e, +0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xc5,0xb, 0xa0,0x7e, +0xb3,0x34,0x4f,0xbc,0xba,0x38,0xb7,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x9, 0xb3,0x1f, +0x46,0xb4,0xff,0x1d,0x6c,0xff,0x80,0x14,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x9, 0x12,0x5e,0x4e,0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38, +0xe7,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xd3,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac, +0x7a,0x49,0x43,0x28,0xae,0x12,0x5e,0x35,0x59,0x42,0x15,0x76,0x49,0x33,0x28,0xb0, +0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xde,0x7e,0x34, +0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e,0x7e,0x73, +0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80, +0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0x12,0x5e,0x2d,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x5e,0x8b,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x5e,0x45,0xb, 0xa0,0x7e,0x63,0x2a,0x2, 0xbc,0x6a, +0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68, +0x13,0x12,0x5e,0x57,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c, +0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x7e,0xf3,0x2a,0x2, 0x7a, +0xf3,0x34,0x4f,0x6c,0xaa,0x80,0x66,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2b, +0x12,0x5e,0x9f,0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0xa, 0x3a,0x2d,0x3d, +0x7d,0x2c,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x2e, +0xa5,0xbb,0x0, 0x2a,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x23,0x12,0x5e,0x9f,0xbe,0xb0, +0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30, +0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0xa, 0x3a, +0x2d,0x3d,0x7d,0x2c,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0x12,0x5e,0x25, +0x38,0x95,0xda,0xf8,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0x90,0x60,0x99, +0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0xb0,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40,0x0, 0x28,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x22,0x6c,0xaa,0x80,0x20,0x74,0x3, 0x12,0xa9,0x76,0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0xa, 0x12,0x5e,0x57,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79, +0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x22,0x7e,0x50,0x9, 0xac,0x5a, +0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, +0x3a,0x2d,0x3d,0x7d,0x2c,0x29,0xb1,0x0, 0xa, 0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91, +0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x9b,0xdf,0x28,0x2, 0xd2,0x3, 0xa2, +0x3, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x3, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x5f,0xc2,0xca,0x59,0x7e,0x18,0x28, +0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xb9,0x1b,0xfd,0x90,0x61,0x35,0xe4,0x93,0xbe, +0xb0,0x0, 0x28,0x28,0x6c,0xff,0x80,0x1f,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae, +0x12,0x80,0x16,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12, +0x64,0xdb,0x12,0xab,0x78,0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xdc,0xda,0xf8,0x22,0x2, +0x5f,0x32,0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe, +0x12,0x37,0x6f,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x23,0x7e,0xc4, +0x0, 0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0xb, +0xf0,0xb, 0xe0,0x12,0x9c,0xf6,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, +0xda,0x79,0x22,0x12,0x9d,0xda,0x2, 0x5f,0x89,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, +0x38,0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x35,0x40, +0x28,0x14,0x7e,0xb3,0x35,0x40,0x4, 0x7a,0xb3,0x35,0x40,0x7a,0xa3,0x2a,0x2, 0x80, +0x5, 0xe4,0x7a,0xb3,0x35,0x40,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a, +0xb, 0x22,0x90,0x60,0x99,0xe4,0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x12,0x68,0x38, +0x2, 0x5f,0xd3,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x34,0xa2,0x4c,0xaa,0x78, +0x3, 0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x34,0xad,0x7e, +0x73,0x34,0xae,0xbe,0x73,0x34,0xad,0x28,0x4, 0x7a,0x73,0x34,0xad,0x22,0xff,0xff, +0x70,0x8f,0x0, 0xff,0x51,0xae,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x37,0x31,0x1, 0xc3,0x1, 0x34,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x10,0xef,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0x18,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xd, 0xc, 0xb, 0xa, 0x9, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x11,0x12,0x13,0x14,0x18,0x17,0xc, 0xd, 0xe, 0xf, 0x15, +0x16,0x10,0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x3d,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x4, 0x5d,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x69,0x40,0xd, 0x18,0x25,0x17,0x25,0x6, 0x80,0x17,0x25,0x6, +0x80,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x32,0x32,0x1, 0xd8,0x1, 0xec,0x0, +0xe1,0x0, 0xe1,0x5, 0x0, 0x37,0x37,0x1, 0xae,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0x96,0x1, 0x18,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, 0x68,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15,0x0, 0x1, 0x54,0x1, 0x0, 0x10, +0x1, 0x51,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0x10,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x3d,0x2, 0x5d,0x69,0x20,0x26,0x3, 0x52,0x59,0x20,0x34, +0x2, 0x5a,0x64,0x20,0x46,0x2, 0x47,0x49,0x30,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, +0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x4, 0x5, 0x25, +0x26,0x27,0x28,0x29,0x4, 0x0, 0xd2,0x2, 0x30,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x0, 0x78,0x0, 0x78,0x14,0x8, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, 0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x8, 0x37,0xf3,0x12,0x62,0xdf,0x7e,0x8, 0x37,0xfb, +0x12,0x62,0xdf,0x12,0x62,0xf4,0x12,0x62,0xfb,0x2, 0x62,0xbc,0x7e,0x37,0x37,0xf3, +0xbe,0x34,0x0, 0x0, 0x28,0x18,0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x50,0xf, 0x7e, +0xb3,0x37,0x31,0x70,0x9, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0x22,0xb, +0xa, 0x30,0xe5,0x4e,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33, +0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x2b,0xb7,0x2, 0x62,0xdf,0x7e,0x8, 0x38,0xe6,0x2, +0x62,0xdf,0x6d,0x33,0x7a,0x37,0x38,0x83,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e, +0xb3,0x2a,0x3, 0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28, +0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68, +0x17,0x7e,0x47,0x2b,0xb7,0x4d,0x44,0x78,0xf, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3, +0x38,0x85,0x7a,0xb3,0x37,0x6, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e, +0x37,0x2b,0xb7,0x7a,0x37,0x2f,0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37, +0x2b,0xb7,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37, +0x2f,0x98,0x7e,0x27,0x2f,0x9a,0x12,0x64,0x1a,0x81,0x13,0x80,0x0, 0x12,0xbd,0xbd, +0x81,0x13,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57, +0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xbd,0x58,0x12,0x64,0x16,0x74, +0x1, 0x7a,0xb3,0x2f,0x80,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88, +0x9e,0x27,0x2f,0x90,0x7e,0x14,0x62,0x8a,0x12,0x64,0xd3,0xbd,0x23,0x38,0x13,0x7e, +0x27,0x2f,0x96,0x9e,0x27,0x2f,0x8e,0x7e,0x14,0x62,0x8c,0x12,0x64,0xd3,0xbd,0x23, +0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a, +0xc7,0x2f,0x98,0x7a,0xd7,0x2f,0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d, +0x2d,0x7e,0x17,0x2b,0xbb,0x7e,0x7, 0x2b,0xbd,0x12,0x66,0xce,0xa, 0x2b,0x7e,0x73, +0x2f,0x7f,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0x64,0x16,0x7a,0xc7,0x2b,0xbb,0x7a, +0xd7,0x2b,0xbd,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24, +0x12,0x67,0xca,0x7d,0x31,0x12,0x85,0xfd,0x2, 0x64,0x2b,0x7e,0x3, 0x2f,0xa8,0xbe, +0x0, 0xf0,0x50,0x2, 0x81,0xc4,0x81,0xb9,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0, +0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34, +0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b, +0xc1,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0x66,0xce,0x7c,0x1b,0x7e,0x3, +0x2f,0x7f,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b, +0xbf,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x1f,0x8c,0x7e,0x34,0x1f,0x34,0x7e,0x30, +0x4, 0xac,0x39,0x2e,0x14,0x2b,0xbf,0x74,0x4, 0x12,0x1f,0x8c,0xb, 0x80,0x7e,0x3, +0x2f,0xa8,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8, +0x7e,0x3, 0x2f,0x7f,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec, +0x40,0x2, 0x81,0x38,0x22,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e, +0x14,0x61,0x49,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e, +0x14,0x61,0x43,0x12,0x83,0x62,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22, +0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83, +0x2a,0x70,0x12,0x87,0xd4,0xbe,0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d, +0x2e,0x7e,0x14,0x61,0x47,0x12,0x64,0xd3,0x12,0x66,0x10,0x90,0x61,0x45,0x12,0x66, +0x7, 0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0x12,0xc1,0x17,0xbe,0xa0,0x0, 0x28, +0x32,0x7d,0x14,0x9e,0x14,0x0, 0x3f,0xbd,0x1e,0x38,0x13,0x12,0x66,0xb8,0x40,0xe, +0x12,0x64,0xc5,0x12,0x65,0xfa,0x48,0x32,0x7f,0x10,0x1b,0x1c,0x80,0x2c,0x12,0x66, +0xb8,0x50,0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x64,0xcb,0x12,0x66,0x10,0x7d, +0x1f,0x80,0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x66,0xb1,0xbd,0x5e,0x38,0x16,0x12,0x64, +0xc5,0x12,0x65,0xfa,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10, +0x6d,0x0, 0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x66,0xb1,0xbd,0x5e,0x28, +0x68,0x7d,0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d, +0x35,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d, +0x22,0x7e,0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1e,0xfc,0x12, +0x66,0x14,0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, +0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x66,0x7, +0x58,0x4, 0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76, +0x7c,0x65,0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x36,0x69,0x7a, +0x73,0x36,0xdf,0x7e,0x27,0x38,0xd6,0x7e,0x14,0x61,0xc8,0x12,0x64,0xd3,0x1e,0x34, +0xbd,0x32,0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x14,0x61,0xc8,0x12,0x64, +0xd3,0xbd,0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x36,0x67,0x12,0x67,0x62,0x7e,0x37,0x36, +0x6f,0xbd,0x32,0x50,0x4, 0x7a,0x27,0x36,0x6f,0x12,0xc0,0xef,0x38,0xa, 0x12,0x8f, +0xf3,0x38,0x5, 0x12,0x8f,0xeb,0x28,0x3d,0x12,0x67,0x69,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x36,0x67,0x4, 0x7a, +0xb3,0x36,0x67,0x7e,0x73,0x36,0x67,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3, +0x36,0x67,0x12,0xc0,0x6b,0x7a,0xb3,0x36,0xdc,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x67, +0x7d,0x32,0x2, 0xad,0x89,0x2, 0x66,0xa8,0x12,0x67,0xc0,0xe4,0x7a,0xb3,0x36,0x75, +0x22,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4, +0x60,0xd1,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0xbd,0x1e,0x22,0x7d,0x51, +0x7d,0x12,0x9d,0x35,0x12,0x21,0x0, 0x7c,0xa7,0x12,0x67,0xeb,0x7c,0xb7,0xbc,0xba, +0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x67,0x15,0x50, +0x21,0x7e,0x54,0x62,0x5a,0x12,0x67,0x15,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x64, +0xd3,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x5e,0x12,0x64,0xd3,0xbd,0x32,0x28,0x2, +0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12, +0x66,0x1b,0x2, 0x67,0x25,0x7e,0xb3,0x36,0x69,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36, +0x71,0x7e,0xb3,0x36,0xdf,0x70,0x3, 0x12,0xaf,0xc, 0x7e,0xb3,0x36,0x71,0xb4,0x1, +0xc, 0x74,0x3, 0x12,0x67,0x59,0x12,0x23,0x9e,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x67, +0x59,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x34,0xae,0x7e,0x34,0x61, +0x5b,0x22,0x74,0x2, 0x7a,0xb3,0x36,0x69,0x22,0x7e,0xb3,0x36,0x75,0xb4,0x1, 0x3, +0x2, 0x67,0x62,0x7e,0xb3,0x36,0xdb,0x4, 0x7a,0xb3,0x36,0xdb,0x7e,0xb3,0x36,0x69, +0xb4,0x2, 0x18,0x7e,0xb3,0x36,0xda,0x4, 0x7a,0xb3,0x36,0xda,0xb4,0x1, 0x6, 0x74, +0x1, 0x7a,0xb3,0x36,0xdb,0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x73,0x36,0xda,0xbe, +0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x75,0x12,0x67,0x62,0x12,0xaf,0xc, +0x12,0x67,0xc0,0x7e,0x73,0x36,0xdb,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x67,0xc0,0x22, +0xe4,0x7a,0xb3,0x36,0xdb,0x7a,0xb3,0x36,0xda,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0, +0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xbf,0x12,0x67,0xf2,0x59,0x25,0x2b, +0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a,0xb3,0x2f,0xa8,0x22,0x7d,0x31,0x9d,0x30,0x2, +0x21,0x0, 0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x73,0x28,0x93,0x7a,0x73, +0x28,0x94,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22, +0x12,0xc0,0x5, 0x12,0x63,0x2, 0x7a,0x37,0x39,0x4, 0x12,0x69,0x87,0x12,0x28,0x48, +0x2, 0x68,0x23,0x12,0x69,0x84,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3, +0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca,0x79,0x7e,0x13,0x2a,0x2, 0x7e,0x78, +0x29,0xbc,0x12,0x69,0x84,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0x19, +0x7e,0xa0,0x5, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12, +0x68,0x23,0x21,0x6d,0xbc,0x20,0x50,0x3, 0x12,0x68,0x23,0x6c,0x0, 0x21,0x62,0x7e, +0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x21,0x60,0xa, +0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x21,0x43,0x12, +0x69,0x7a,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x21,0x0, 0x7d,0xd3,0x7e,0x70,0x4, +0xac,0x79,0x49,0x23,0x35,0x43,0x12,0x69,0x70,0x9d,0x32,0x12,0x21,0x0, 0x7d,0xc3, +0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x69, +0x7a,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x43,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28, +0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, 0x7a,0xb3,0x34,0x89, +0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3, +0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80,0x53,0x7e,0x50,0x9, +0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x35,0x41,0x49, +0x22,0x29,0xa, 0x59,0x27,0x35,0x43,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x34,0x88,0x80, +0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34, +0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, +0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x41,0x12,0x69,0x70,0x59,0x32,0x35,0x43, +0xb, 0x0, 0x90,0x60,0x99,0xe4,0x93,0xbc,0xb0,0x28,0x2, 0x1, 0x6f,0xda,0x79,0x22, +0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x41,0x22,0xa2,0x8, 0x22,0x7e,0x34,0xd, 0xac,0x12,0x26,0x5b,0x12,0x7a, +0x2d,0x12,0x69,0xab,0x2, 0x69,0x97,0x30,0xf, 0x10,0x12,0x6e,0x8f,0x50,0x3, 0x12, +0x6f,0x6e,0x12,0x6a,0x50,0x12,0x69,0xd1,0xc2,0xf, 0x22,0x7e,0xb3,0x2b,0x1e,0x70, +0x1f,0x12,0x26,0x57,0x12,0x2f,0xf4,0x50,0xfb,0x12,0x6a,0x50,0x12,0x88,0x17,0x20, +0xf, 0x3, 0x12,0x69,0xd1,0x74,0x2, 0x7a,0xb3,0x2b,0x1e,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12, +0x87,0x56,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0xc0,0xa2,0xf5,0x2a, +0x7e,0x73,0x2b,0xf, 0xbe,0x71,0x2a,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x91,0x67,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x44,0x6d,0x22,0x7a,0x1f,0x37,0x40,0x7c,0xbc,0x12,0x6c,0x20,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x62,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x6d,0x13,0xda,0x3b,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12, +0xbf,0xfb,0x7a,0x55,0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d, +0x7f,0x3, 0x7e,0x1d,0x2a,0x12,0x79,0x7a,0x12,0xc0,0x75,0x12,0xc0,0x22,0x75,0x2e, +0x0, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0xc0,0xff,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6a,0xd4,0x12,0xb3,0x5f,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x30,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12, +0x7b,0x20,0x7e,0x35,0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30, +0x38,0xdc,0x5, 0x2e,0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b, +0x1d,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x6d,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d, +0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x6e,0x8f,0x50,0x7c,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x6e,0x12,0x6b,0xff,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x8, 0x12,0x6d,0x34,0x38,0xea,0x6c,0xcc,0x80,0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a, +0x12,0x6b,0xff,0x75,0x3b,0x0, 0x80,0x27,0x7e,0xb3,0x37,0xb1,0xbe,0xb1,0x3b,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x60,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x62,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e, +0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12,0xc0,0x90,0x68,0xb, 0x7e,0x34,0x10, +0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x50,0x12, +0x6c,0x8, 0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70, +0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a, +0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, +0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x7f,0x78,0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe, +0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x6b,0xf6,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d, +0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80, +0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x35,0x7a,0x37,0x25,0xba,0x7e,0x35, +0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12, +0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25, +0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac, +0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37, +0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22, +0xca,0x3b,0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b, +0xf, 0xf5,0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xb9, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x60,0x7e,0x8, 0x25,0x2a, +0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbc,0x12,0xb3,0x2a,0x74,0x1, 0x7a,0xb3,0x2b,0x1d, +0x74,0x5, 0xac,0xbc,0x12,0xc0,0x19,0x74,0x5, 0xac,0xbc,0x12,0x6f,0xff,0x74,0x5, +0xac,0xbc,0x12,0xc0,0x10,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0xc2,0x3, 0x12,0xc0,0xa2,0x12,0x6d, +0x13,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, +0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x6a,0xd4,0x12, +0xbf,0xfb,0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xa8,0xef,0x12, +0xa9,0xa6,0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3, +0x2b,0x14,0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39, +0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, +0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd, +0xda,0x3b,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6e,0x29,0x30,0xc, 0xa, 0x12,0xae,0xfa, +0x30,0x3, 0x4, 0xe4,0x12,0xa, 0x66,0x30,0x3, 0x9, 0x12,0xae,0xaf,0x12,0x8d,0xef, +0x2, 0x8c,0x90,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f, +0x50,0x7e,0x14,0x22,0xe2,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x7a,0x1d,0x2c,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f, +0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c,0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x34,0x6c, +0xcc,0x80,0x4f,0x12,0x6e,0x19,0x40,0x48,0x12,0x6e,0xf, 0x50,0x43,0x74,0x2, 0xac, +0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x0, 0x7d,0x3, 0x7d, +0x31,0x12,0x21,0x0, 0xbd,0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e, +0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d, +0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34, +0xb, 0xc0,0x12,0x6d,0x34,0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12, +0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, +0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12, +0x6e,0x19,0x40,0x8, 0x12,0x6e,0xf, 0x50,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x12,0x6d, +0x34,0x38,0xec,0xb, 0xd0,0xbe,0xd0,0x3, 0x50,0x2, 0xa1,0x68,0xda,0x3b,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xb9,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x12,0x6e,0xa0,0x7a,0x37,0x2b,0x1b, +0x22,0x7e,0xa3,0x0, 0x4f,0xbe,0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xec,0x68,0x42, +0x74,0x5, 0xa4,0x12,0xc0,0x99,0x12,0x6e,0x83,0x12,0xc0,0x19,0x12,0x6e,0x83,0x12, +0xc0,0x10,0x12,0x6e,0x8f,0x50,0x9, 0x7e,0xb3,0x0, 0x4f,0x12,0xb3,0x2a,0x80,0x6, +0x12,0x6e,0x83,0x12,0x6f,0xff,0x12,0x6e,0x29,0x12,0x6f,0xf8,0x7e,0x73,0x2b,0x14, +0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x4f,0x7a,0x73, +0x3, 0xec,0x22,0x7e,0xa3,0x0, 0x4f,0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x20,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xb2,0x70,0x2, 0xc3,0x22,0xd3,0x22, +0x7e,0x23,0x2b,0xf, 0x7e,0x33,0x37,0xcd,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x0, 0xac,0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, +0xa, 0x7e,0x63,0x2b,0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe, +0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61, +0x1b,0xe4,0x93,0x7c,0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73, +0x2b,0x10,0x80,0x9, 0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b, +0x10,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c, +0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x38,0xc0,0x69,0x51,0x0, +0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d, +0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, +0x1f,0x58,0x7e,0xb, 0x70,0x7a,0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b, +0x62,0x29,0x70,0x0, 0x1, 0x7a,0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b, +0x20,0x12,0x6e,0x29,0x12,0x6f,0xf8,0xd2,0x3, 0xc2,0x4, 0x2, 0x48,0xf4,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x4f,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6f,0xea,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0xc0,0x56,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0xc0, +0x4b,0x12,0x20,0xb9,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6f,0xea,0xca,0x39,0x7e, +0x23,0x0, 0x4f,0x7e,0x30,0x38,0xac,0x23,0x12,0xc0,0x56,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x8c,0xac,0x23,0x12, +0xc0,0x4b,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6f,0x42,0x7e,0x34,0x0, 0x38,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x3, 0x8b,0x9, +0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0x7e,0x37,0x3, 0xed,0xb, 0x34,0x7a,0x37, +0x3, 0xed,0x7e,0x37,0x3, 0xef,0xbe,0x37,0x3, 0xed,0x28,0x3, 0x2, 0x70,0x23,0x22, +0x2, 0x70,0x8, 0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x70,0x20,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b, +0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e, +0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a,0xb3,0x2b,0x74,0x7a,0xb3,0x2b, +0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x25,0xee,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2, +0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93, +0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74,0xbc,0x7e,0x28, +0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3,0x2a,0x6e,0x7a, +0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3,0x2a,0x74,0x90, +0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9,0xe4,0x93,0xa, +0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a,0xa, 0x3e,0x9d, +0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a,0x78,0x90,0x60, +0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f,0xca,0x39, +0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12,0x20,0xb9,0x1b, +0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x2b,0x21,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x72,0x92,0x12,0x79,0x31,0x90,0x60, +0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76,0x12,0x70,0x59, +0x74,0x1, 0x12,0x3d,0xac,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x2, 0x12,0x73, +0xf1,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a,0xb3,0x2b,0x4, +0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0x9e,0x7a,0x37,0x2b, +0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x9, 0x7e, +0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a,0xb3,0x2b,0x62, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4,0x93,0x7a,0xb3, +0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x2b, +0xf, 0x12,0x6e,0x29,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61, +0x22,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12, +0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3, +0x2b,0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61, +0x20,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b, +0x14,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d, +0x7a,0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64, +0xe4,0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61, +0x7e,0x34,0x20,0x5b,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x12,0xc0,0xab,0x12,0x72,0xf4,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x72,0xdb,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x72,0xdb,0xa, +0x1b,0x2e,0x14,0x2a,0x7c,0x12,0x72,0xe8,0xe5,0x25,0x12,0x72,0xdf,0xa, 0x1b,0x2e, +0x14,0x2b,0x23,0x12,0x72,0xe8,0xe5,0x24,0x2, 0x20,0xde,0x7e,0x34,0x0, 0x2, 0x12, +0x20,0xde,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, +0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a, +0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x73,0x20,0x38,0xef,0x12,0x73,0x20,0x68,0x7, +0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22, +0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x12,0x77,0xfd,0x12,0x70,0xa7,0x12,0x0, +0xa, 0x12,0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8, +0x7e,0x1f,0x6, 0xf4,0x12,0x79,0x9d,0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e, +0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12, +0x79,0x7a,0x12,0x79,0x2e,0x12,0x25,0x45,0x12,0x73,0xa7,0x12,0x73,0x7f,0x2, 0x73, +0x71,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x12, +0x73,0xe5,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, 0x28,0xae,0x74,0xff,0x12,0x20, +0xde,0x12,0x9f,0xe3,0x7e,0x8, 0x29,0xbc,0x12,0x5e,0x61,0x7e,0x8, 0x2a,0x2, 0x7e, +0x34,0x0, 0xb, 0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4, +0x12,0x20,0xde,0x90,0x60,0x9c,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74, +0xff,0x12,0x20,0xde,0x90,0x60,0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26, +0xb4,0x74,0xff,0x12,0x20,0xde,0x90,0x60,0x9a,0x12,0x73,0xe8,0x7e,0x8, 0x27,0x76, +0x74,0xff,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78, +0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc, +0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, +0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80, +0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73, +0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d, +0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a, +0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26, +0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x75,0xb2, +0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d, +0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53, +0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x75,0x9f,0xb, +0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80, +0x19,0x12,0x75,0xa8,0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58, +0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3, +0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x75,0x97,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12, +0x75,0xb2,0xb, 0x6a,0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d, +0x2d,0x7e,0x67,0x2a,0x51,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, +0x90,0x12,0x75,0x9f,0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, +0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x75,0xa8,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c, +0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12, +0x74,0x3c,0x38,0xab,0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, +0x12,0x75,0x97,0x2d,0x15,0x6c,0xaa,0x80,0xe, 0x12,0xa5,0xe4,0xb, 0x7a,0x90,0xbd, +0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xed,0x7a,0xb7,0x8, 0x4, +0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32, +0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e, +0x74,0x62,0x10,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d, +0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31, +0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0xa6, +0x56,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x75,0x97,0x7e,0xd, 0x24,0x2d,0x15,0x7f, +0x13,0x2d,0x35,0x12,0x6d,0x3b,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a, +0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x75,0xbc,0x7e,0x37,0x28, +0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x75, +0xbc,0x12,0x76,0x2b,0x12,0xa7,0x45,0x2, 0x76,0x1a,0xe4,0x7a,0xb3,0x3, 0xff,0x7e, +0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x3, 0xff,0x22,0xca,0x3b,0x7e,0xf3,0x2a, +0x6e,0x12,0xc0,0xb4,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, +0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0xa7,0xcd,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda, +0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0xbb,0x95,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, +0xf8,0x12,0x3f,0xf2,0x12,0x76,0x9a,0x12,0x74,0x43,0x7e,0xb3,0x16,0x90,0xb4,0x1, +0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26, +0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x20, +0xde,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26, +0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0xbf,0xeb, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0xbf,0xc7, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x86,0x12,0xc0, +0x40,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x89,0x12,0xc0, +0x40,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3, +0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0xbf,0xeb,0x7e,0x50,0x1, 0x12,0x77,0x60,0x7a, +0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0xbf,0xc7,0x7e,0x50,0x1, 0x12,0x77,0x60, +0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22, +0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0, +0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4, +0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0, +0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, +0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c, +0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b, +0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f, +0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0xe4,0x7a,0xb3, +0x37,0x9c,0x7a,0xb3,0x37,0x9d,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0x9e,0x90,0x60, +0x51,0xe4,0x93,0x7a,0xb3,0x37,0x9f,0xe4,0x7a,0xb3,0x37,0xa0,0x90,0x60,0x99,0x93, +0x7a,0xb3,0x37,0xa1,0xe4,0x7a,0xb3,0x37,0xa2,0x7a,0xb3,0x37,0xa3,0x90,0x61,0xc4, +0x93,0x7a,0xb3,0x37,0xa5,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34, +0x7a,0x73,0x37,0xa9,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a, +0x73,0x37,0xaa,0x74,0x64,0x7a,0xb3,0x37,0xbb,0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3, +0x37,0xbc,0x90,0x61,0x17,0xe4,0x93,0x7a,0xb3,0x37,0xa8,0x90,0x61,0x19,0xe4,0x93, +0x7a,0xb3,0x37,0xbe,0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x37,0xbd,0x90,0x61,0x1d, +0xe4,0x93,0x7a,0xb3,0x37,0xbf,0x90,0x61,0x25,0xe4,0x93,0x7a,0xb3,0x37,0xba,0xe4, +0x7a,0xb3,0x37,0xb5,0x74,0xfa,0x7a,0xb3,0x37,0xb3,0x74,0x1e,0x7a,0xb3,0x37,0xb4, +0x74,0x1, 0x7a,0xb3,0x37,0xb2,0x74,0xc, 0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3, +0x37,0xb6,0xe4,0x7a,0xb3,0x37,0xb7,0x7a,0xb3,0x37,0xb8,0x7e,0x8, 0x37,0xc0,0x7e, +0x34,0x0, 0x2c,0x12,0x20,0xde,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0xa, 0x36,0x7a, +0x73,0x37,0xcb,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0x7a,0x73,0x37,0xcc,0x90,0x60, +0xd4,0x93,0x7a,0xb3,0x37,0xcd,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x37,0xce,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b, +0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xe9,0x74,0x1, 0x7a,0xb3,0x37,0xe0,0x7e,0x34,0x0, +0x28,0xca,0x39,0x7e,0x34,0x61,0xd5,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12, +0x20,0xb9,0x1b,0xfd,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0x2, 0x23, +0xa6,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x6d, +0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x20, +0xde,0x7f,0x6, 0x7d,0x3f,0x12,0x20,0xde,0x7a,0xb3,0x16,0x91,0x22,0x7f,0x70,0x7e, +0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c, +0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x20,0xde,0x7f,0x7, 0xa, +0x3a,0x2, 0x20,0xde,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15, +0x12,0x79,0x9d,0x12,0x3f,0xd2,0x7e,0xe0,0x1, 0x12,0x4f,0xaf,0x30,0x18,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x7b,0x29,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac, +0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15, +0x12,0x7b,0x20,0xb, 0xd0,0x7e,0x73,0x2a,0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, +0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c, +0xbf,0x2e,0x73,0x2a,0x73,0x12,0x7a,0x8e,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b, +0x2, 0x70,0x41,0x12,0x2f,0xf4,0x50,0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x7a,0x75, +0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x72,0x12,0x79,0xc4,0x74, +0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x7a,0x75,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f, +0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x79,0xc4,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4, +0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x3d,0xac,0x7c,0xba,0x12,0x13, +0xc7,0x74,0xa, 0x12,0x45,0x15,0x7c,0xb9,0x12,0x0, 0x1e,0x2, 0x4e,0xe7,0xca,0xd8, +0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0x7b,0xd0,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74, +0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11, +0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x1f,0x7, 0x1b,0x6a,0x30,0xb, 0xd0,0xbc, +0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3, +0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73,0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c, +0x7f,0x12,0x7a,0x8e,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12, +0x20,0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, 0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, +0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22, +0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, +0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x29,0x6f,0x7c,0xe7,0x80,0x5d,0x12,0x26,0x57, +0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x12,0x7b,0x29,0x6c,0xdd,0x80,0x3d, +0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, +0x1d,0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19, +0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x3f,0xb, 0xbe,0xb0, +0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x7b,0xb7, +0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa, +0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53,0x2a, +0x73,0xa, 0x25,0x2d,0x23,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22, +0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa, +0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38, +0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, +0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e, +0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x37,0xed,0x40,0x39,0x7e,0x37,0x37,0xed,0xb, 0x34,0x7a,0x37, +0x37,0xed,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x34,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x38,0xfb,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x70,0x5, 0x7e,0xb3,0x37,0x9c,0x22,0xbe,0xb0,0x3, 0x38,0x15, +0x75,0x1b,0x0, 0x30,0xe, 0x6, 0x7e,0x18,0x32,0xea,0x80,0x4, 0x7e,0x18,0x33,0x28, +0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e, +0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4, +0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xed,0x80,0x2, 0x15,0x1a,0x2, +0x7c,0x17,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x7d,0x61,0xbe,0xb0,0x80, +0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x61,0x22,0xb4,0xfc, +0x5, 0x7e,0xb3,0x37,0x8, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60, +0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x36,0x71,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22, +0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74,0xff,0x22,0x7c,0x7b,0x6c,0xaa,0x12, +0x3f,0xe1,0x78,0x9, 0x7c,0xb7,0x12,0x7c,0x64,0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, +0x7c,0xb7,0x12,0x37,0xeb,0x7c,0xab,0x7c,0xba,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5, +0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5, +0x1a,0x12,0x3f,0xb3,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12, +0x7c,0xfb,0xf5,0x91,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0, +0x82,0x12,0x7d,0x1a,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b, +0x32,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x37,0xf2,0x7e,0x73,0x37,0xf2,0xa, 0x27,0x2e, +0x24,0x0, 0x6, 0x12,0x51,0x4f,0x93,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x37,0xf2, +0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x37,0xf2,0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0x9b,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0x9b,0x7a, +0xa3,0x36,0xf2,0x22,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37,0x9c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, +0xe4,0x7a,0xb3,0x37,0x9c,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba, +0x12,0x7d,0xab,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3, +0x7c,0x7a,0x12,0x7e,0x45,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xdf,0x38, +0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x7e,0x21,0xa5,0xbb,0x8f,0x3, 0x75,0x19, +0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x44,0xc0,0x74,0x1, 0x7a,0xb3,0x33,0xff, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68,0x17,0x1b,0x61,0x68, +0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x36,0xe1,0xd2,0xd, 0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37, +0xef,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37, +0xef,0x15,0x1a,0x7e,0x27,0x37,0xef,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, +0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a,0xea, +0x22,0x7e,0xb3,0x37,0xf1,0x4, 0x7a,0xb3,0x37,0xf1,0xe5,0x19,0xb4,0x1, 0x8, 0xe4, +0x7a,0xb3,0x37,0xf1,0x75,0x19,0x0, 0x7e,0x73,0x37,0xf1,0x7a,0x73,0x36,0xf0,0x22, +0xe4,0x7a,0xb3,0x37,0x9c,0x7e,0x8, 0x32,0xea,0x12,0x7e,0xef,0x7e,0x8, 0x33,0x28, +0x7e,0x34,0x0, 0x3e,0x12,0x20,0xde,0x7e,0x18,0x32,0xea,0x7a,0x1d,0x14,0x12,0x7e, +0xd1,0x2, 0x7e,0xc4,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0x9c,0xf5,0x91, +0x22,0x2, 0x7e,0xd4,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e, +0x34,0x0, 0x3e,0x74,0xff,0x2, 0x20,0xde,0x7c,0xab,0x12,0x3f,0x52,0x7c,0xba,0x12, +0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x7f,0x67,0x49,0x35,0x34,0x3b,0x49,0x15, +0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40,0x15,0xbe, +0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12,0x7f,0x6f, +0x28,0xe, 0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, 0x80,0x2, +0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c, +0x7c,0xb9,0x12,0x31,0x27,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, +0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88,0x7f,0x10, +0x7f,0x4, 0x12,0x1e,0xeb,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x75, +0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b,0x2a,0x0, +0x1b,0x1a,0x10,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e, +0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12, +0x21,0x0, 0xe5,0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0, +0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e, +0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12,0x87,0xbc,0x90, +0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, +0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x87,0xd4,0xbe,0xc4, +0x0, 0x3f,0x38,0x1c,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61,0x3b,0x12,0x81, +0x2, 0x12,0x80,0xf1,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xee, +0x12,0x66,0xb1,0xbd,0x5c,0x38,0x21,0x7d,0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12, +0x81,0x2, 0x90,0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b, +0x7c,0x12,0x80,0xf9,0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b, +0x1b,0x54,0xbd,0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f, +0x80,0xa, 0x7d,0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x87,0xcc,0x7f, +0x17,0x12,0x1e,0xfc,0x7f,0x71,0x12,0x81,0x1c,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40, +0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d, +0x22,0x2f,0x71,0x12,0x80,0xf1,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, +0x90,0x61,0x3a,0xe4,0x93,0x12,0x80,0xf9,0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f, +0x22,0x90,0x61,0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d, +0x22,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d, +0x2e,0x7c,0x76,0x7c,0x65,0x7f,0x71,0x22,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65, +0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12, +0x9f,0x40,0x7d,0x3, 0x74,0x9, 0xac,0xbf,0x12,0x87,0xe5,0x49,0x35,0x28,0xae,0x12, +0x81,0xbf,0x12,0x81,0x18,0x7d,0x13,0x5e,0x30,0xfc,0x7e,0x70,0x9, 0xac,0x7f,0x49, +0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d, +0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34, +0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x12,0x81,0xb3,0x12,0x81, +0x18,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, +0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30, +0xda,0x79,0x22,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d, +0x32,0x12,0x21,0x0, 0x7d,0x13,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b,0x74, +0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3,0x49, +0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x81,0xbf,0x7d,0x3f,0x9d,0x35,0x12,0x21, +0x0, 0x9d,0x34,0x12,0x21,0x0, 0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0xf, 0x12,0x67,0xeb,0x7e,0x14,0x62,0x6a,0x12,0x87,0xee,0x50, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7, +0x2f,0x9e,0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7, +0x2f,0x9a,0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x81,0xc7, +0x70,0x2, 0x61,0x45,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70, +0x9, 0x7e,0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45, +0x7e,0x73,0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f, +0xa4,0x7e,0x17,0x2f,0xa6,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45,0x7e,0x34,0x62,0x72, +0x12,0x83,0x4a,0x28,0x4a,0x7e,0x34,0x62,0x70,0x12,0x83,0x54,0x50,0x41,0x7e,0xb3, +0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0x9e,0x12,0x83,0x5e,0x7d,0x8f, +0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0x87,0xc4,0x9d, +0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40,0x2, 0x61, +0x45,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7b,0x7e,0xf0,0x21,0x80,0x76,0x7e, +0x34,0x62,0x7a,0x12,0x83,0x54,0x28,0x6d,0x7e,0x34,0x62,0x78,0x12,0x83,0x4a,0x50, +0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62,0x7e,0x12,0x23,0x9e,0x12,0x83, +0x5e,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50,0x4a,0x7e,0x34,0x62,0x7c,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7,0x2f,0x82,0x28,0x37,0x7d,0xfb, +0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x26,0x12, +0x67,0xf2,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd,0x49,0x25,0x2b,0xab,0x49,0x5, +0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, 0x9d,0x32,0xbe,0x34,0x0, 0x10, +0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xf0,0xbd,0xfc,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xbd,0xfb,0x22,0x7e,0x14, +0x62,0x8e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22,0x12,0x86,0x69,0x7a,0x37,0x2f, +0x9c,0x12,0x85,0xf4,0x7a,0x37,0x2f,0x9e,0x12,0x82,0x16,0x60,0x1, 0x22,0x7e,0x73, +0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f,0x80,0x2, +0x83,0x92,0xca,0xf8,0x7e,0x45,0x24,0x7c,0xb9,0x7a,0xb3,0x38,0x3f,0x74,0xff,0x7a, +0xb3,0x38,0x3e,0x6d,0x55,0x80,0x19,0x7d,0xf5,0x3e,0xf4,0x12,0x86,0x74,0x7d,0xe5, +0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54, +0xbd,0x45,0x38,0xe3,0x7e,0x33,0x38,0x3f,0xbe,0x30,0x4, 0x38,0x2, 0x81,0x54,0x69, +0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e, +0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x40,0x7a,0xb3, +0x38,0x42,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f, +0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x38,0x42,0x7d,0xf, 0x2d,0xf, 0xbd, +0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x38,0x42,0xa, 0x37,0x6d,0x22,0x12, +0x1e,0xeb,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7a,0x73,0x38,0x42,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x84,0x73,0x12, +0xbf,0x1c,0x12,0x84,0x73,0x12,0x84,0x7c,0x12,0x84,0x73,0x12,0xa5,0x28,0x80,0xa, +0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x38,0x3e,0xe4,0x7a,0xb3,0x38,0x3f,0x7e, +0x73,0x39,0x1, 0xbe,0x73,0x38,0x3e,0x48,0x6, 0x7e,0xb3,0x38,0x40,0x80,0x1, 0xe4, +0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71, +0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a, +0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0xa1,0x9d,0x7e,0x90,0x2, 0xac,0x9a, +0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x26,0x7f,0x67,0x2d, +0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f, +0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a, +0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe, +0xf0,0x2, 0x58,0x2, 0xa1,0x9b,0xbe,0x60,0x0, 0x18,0x2, 0xa1,0x83,0xbe,0x70,0xec, +0x28,0x2, 0xa1,0xa7,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7, +0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x85,0xeb,0x19,0xba,0x22, +0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x85,0xeb,0x19,0xba,0x23,0xe4,0x9, 0xba, +0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7, +0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0x85, +0xeb,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12,0x85,0xe2,0x19,0xbd,0x22,0xf5,0xa, 0xd9, +0x12,0x85,0xe0,0x19,0xbd,0x23,0xe5,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe, +0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12, +0x85,0xe0,0x19,0xbd,0x22,0xf4,0xa, 0xc9,0xa, 0xd4,0x12,0x85,0xe0,0x19,0xbd,0x23, +0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f,0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, +0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23,0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x38, +0x3f,0xbc,0xba,0x28,0x2, 0x81,0x9b,0x7a,0x73,0x38,0x3f,0x7e,0xa0,0x1, 0x80,0x25, +0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d, +0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e, +0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x38,0x3f,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22, +0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c, +0xbd,0xa, 0xa7,0x22,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0x86,0x69,0x7a,0x37,0x2f,0xa0,0x12, +0x85,0xf4,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0x86,0x69,0x7a,0x37,0x2f, +0xa4,0x12,0x85,0xf4,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7c,0xab, +0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4,0x14, +0x78,0xfb,0x12,0x86,0x72,0x2d,0xfe,0x80,0xf, 0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x12,0x86,0x72,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a, +0xbd,0xf4,0x38,0xd0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61, +0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b, +0x7e,0x63,0x2a,0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10, +0x7d,0x21,0x12,0x87,0xdc,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34, +0x37,0x44,0x6d,0x22,0xe4,0x2, 0x86,0x7e,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b, +0x68,0x4f,0x12,0x87,0x56,0x7c,0x3b,0x7c,0xb2,0x12,0x87,0x56,0x7c,0xab,0xbe,0x30, +0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12, +0x91,0x67,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e, +0x34,0x16,0x93,0x6d,0x22,0x30,0x16,0x3, 0x2, 0x86,0xc7,0x7e,0xb3,0x2b,0x1d,0xb4, +0x1, 0xf, 0x12,0xbf,0xfb,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x86, +0x7e,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, +0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40, +0xe9,0x74,0xff,0x22,0x7e,0xb3,0x37,0x31,0x70,0x6, 0x12,0x87,0xad,0x2, 0x87,0xb6, +0x12,0x63,0x9, 0x12,0xbd,0x4d,0x50,0xa, 0x12,0x83,0x6a,0x7c,0x3b,0x12,0x87,0xad, +0x80,0x5, 0x12,0xbd,0xf4,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xbc,0xd1, +0x60,0xa, 0x7a,0x33,0x37,0x34,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4,0x7a,0xb3, +0x2f,0x80,0x22,0x2, 0x81,0x23,0xe4,0x7a,0xb3,0x38,0xdd,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x3e,0x24,0x7e,0xf, +0x38,0xd9,0x2d,0x12,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x32,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74,0x6, +0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x5, 0x7d,0x53,0xbe,0x54,0x0, 0xff, +0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x12,0x6e,0x8f,0x50,0x3, 0xd2,0xf, 0x22,0xc2, +0xf, 0x22,0x12,0xac,0xc6,0x12,0x88,0x2b,0x2, 0x88,0x17,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x20,0xde,0x12,0xaa,0x3e,0x12,0xaa,0x35,0xa9,0xd1,0xcb, +0x12,0xc0,0xff,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0xb4,0x4d,0x2, 0xd, 0x7, 0x12, +0x54,0x94,0x12,0x88,0xb9,0x12,0x8c,0xad,0x7e,0xb3,0x37,0x6, 0xb4,0x1, 0x1e,0x7e, +0x34,0x61,0xc0,0x12,0x87,0xcc,0x7e,0x24,0x0, 0x5, 0xad,0x12,0x7a,0x17,0x28,0xa1, +0x7e,0x14,0x61,0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39, +0x11,0x60,0x7, 0x14,0x7a,0xb3,0x39,0x11,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, +0x12,0x88,0x22,0x12,0x8c,0x90,0x12,0xb3,0xa9,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12, +0xbb,0x10,0x12,0xaa,0x47,0x2, 0x8d,0x10,0x22,0x7e,0x90,0x1, 0x7e,0xb3,0x2f,0xa9, +0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xa9,0x7e,0x34,0x61,0xc0,0x12,0x23, +0x9e,0x12,0xc0,0x87,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x12,0x8c,0x87,0xb, 0x1a, +0xf0,0x7e,0x34,0x61,0x4f,0x12,0x87,0xbc,0xe4,0x7a,0xb3,0x28,0xac,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x7e,0x34,0xff,0xfa,0xad,0x3f,0x12,0x8f,0xdc,0x7d,0xc3,0xe, 0xc4, +0x7e,0xe7,0x7, 0xfe,0xbd,0xe3,0x58,0x15,0x7e,0xe7,0x7, 0xfc,0xbd,0xec,0x58,0xd, +0x12,0x8a,0x7c,0x8, 0x8, 0x12,0x8b,0xe, 0x60,0x3, 0x12,0x8a,0x95,0x12,0x8b,0xe, +0xa, 0xeb,0x4d,0xee,0x68,0x3b,0x6d,0xee,0x9d,0xef,0xbe,0xe7,0x7, 0xfe,0x18,0x6, +0xbe,0xe7,0x7, 0xfc,0x8, 0x2b,0x12,0x8a,0x7c,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12, +0x21,0x0, 0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x8a,0x74,0x28,0x14,0x7e,0x83,0x28, +0x85,0xbe,0x80,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xcf,0x58,0x3, 0x12,0x8a, +0x95,0x12,0xad,0x5, 0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xc0,0xf7,0x68,0x6, +0x7e,0xb3,0x39,0xb, 0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x7d,0x12,0x8a,0x74, +0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0xad,0x43,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x12,0x8a,0xa6,0x7c,0x9b,0x80, +0x1a,0x7e,0xb3,0x26,0x84,0x70,0x14,0x7e,0xb3,0x26,0x85,0x70,0xe, 0x12,0x8a,0x74, +0x28,0x9, 0x7e,0x90,0x3, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0xc7,0x7, 0xfa,0xbe, +0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x8a,0x74,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7, +0x28,0x8e,0x58,0x8, 0x12,0x8a,0x87,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0x29,0x7e,0x14, +0x61,0xc0,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0x7e,0x14,0x61, +0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x12,0x0, 0x66,0x50,0xd, 0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x8f,0xe3,0x28,0x3, 0x12,0x8a,0x87,0x7e,0xc7,0x28,0x8a, +0xbd,0xcd,0x8, 0x19,0x12,0x9b,0xf, 0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28, +0x8e,0x58,0xa, 0x12,0x0, 0x66,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x8b,0x8e, +0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x2, 0x12,0xac,0x6d,0x7e,0xb3,0x2f,0xaa,0xbe, +0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xaa,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8c,0x7f,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0x6d,0xee,0x9e,0xe7, +0x2a,0x5a,0xbe,0xe7,0x28,0x8e,0x22,0xe4,0x7a,0xb3,0x2f,0xaa,0x7a,0xb3,0x28,0xac, +0x74,0x2, 0x2, 0x29,0xfa,0x74,0x2, 0x7a,0xb3,0x2f,0xaa,0xe4,0x7a,0xb3,0x2f,0xa9, +0x12,0x8c,0x7f,0x2, 0x29,0xfa,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x8c,0x87, +0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x8b,0x6, +0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e, +0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x4, +0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11, +0x7e,0x34,0xff,0xfd,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0, +0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x1e,0xb9,0xbd,0x34,0x22,0x6c,0x66, +0x90,0x60,0xa7,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28, +0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14, +0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x9d,0x8b,0x50, +0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, +0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e, +0x73,0x2a,0x6d,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0xca,0x3b, +0x12,0xa6,0x4e,0x38,0x2, 0x81,0x55,0x7e,0xc3,0x2f,0xad,0x4c,0xcc,0x78,0x3d,0x7a, +0xb3,0x2f,0xad,0xe4,0x7a,0xb3,0x2f,0xaf,0x6c,0xaa,0x80,0x26,0x12,0x8c,0x60,0x7e, +0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a,0x49,0xd0,0x19, +0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8c,0x6a,0x59,0x34,0x0, 0x2, +0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c,0xfc,0x6c,0xaa, +0x80,0x35,0x12,0x8c,0x60,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, 0xb4,0x0, 0x8, +0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8c,0x6a,0x7d,0x23,0x49,0x34,0x0, 0x2, 0x9d, +0x32,0x12,0x21,0x0, 0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x4c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x2f,0xaf,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x8c, +0x60,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x4c,0x0, 0x12,0x8c,0x71,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x2f,0xaf,0x80,0x6, 0x12,0x8c,0x71,0x75,0x4c,0x0, 0xe5,0x4c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xb0,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x40,0xe4,0x7a,0xb3,0x2f,0xae,0x7a,0xb3,0x2f,0xad,0x7a,0xb3,0x2f,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22, +0x12,0x8c,0xcd,0x6d,0x33,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x5, 0x12,0x8d,0x5e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xf6,0xe4,0x7a,0xb3,0x36,0x72,0x22,0x12,0xb0,0x94, +0x60,0x1a,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x7e,0x37,0x38, +0xd2,0x12,0x25,0x3c,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x23,0x12,0x8d,0x8, 0x28, +0x26,0xa, 0x4a,0x9, 0x64,0x36,0x76,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x42,0x38,0xcc,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x80,0xb, 0xa0,0x7e, +0xb3,0x36,0x73,0xbc,0xba,0x38,0xd5,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xae,0xa2,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x8d,0x5e,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x84, +0x49,0x12,0x36,0x80,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x84,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x36, +0x84,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x36,0x80,0x59,0x32,0x36,0x84,0x22,0x7e,0xb3,0x36,0x66, +0x60,0x6, 0x14,0x7a,0xb3,0x36,0x66,0x22,0x12,0x8c,0xcd,0x90,0x61,0xc5,0xe4,0x93, +0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x8d,0xef,0x7e,0xb3,0x36,0xec,0x70,0xe, 0x7e,0xb3, +0x39,0x12,0xb4,0x1, 0x7, 0xe4,0x12,0x8d,0xb3,0x12,0xc0,0x6b,0x12,0x67,0x1f,0x12, +0x8e,0xa2,0x7e,0xa3,0x36,0xec,0x7a,0xa3,0x39,0x12,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x8d,0xb3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf,0x12,0xc0,0x99,0x12,0xc0, +0x19,0x12,0x6f,0xff,0x12,0xc0,0x10,0x7a,0xf3,0x0, 0x4f,0x7c,0xbf,0x12,0xb3,0x2a, +0x12,0x6e,0x29,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37,0x12,0xae,0xe1,0x12,0x8d, +0xef,0x12,0x23,0x4, 0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8,0x22,0x12,0x8f,0xd2,0x7e, +0xb3,0x2b,0xf, 0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xc0,0x7e,0x73,0x37,0xcd,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36, +0x12,0x8f,0xca,0xbe,0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x36,0x72,0xa, 0x3e,0xad, +0x3b,0x7d,0xa3,0x2d,0xac,0x75,0x35,0x0, 0x7e,0xa3,0x36,0x72,0xbc,0xad,0x40,0x2, +0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e, +0x78,0xe, 0x7c,0xbd,0x14,0xbe,0xb3,0x36,0x72,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x72, +0x7e,0xc3,0x36,0x72,0x80,0x41,0x7e,0xb3,0x36,0x72,0x4, 0x7a,0xb3,0x36,0x72,0x7e, +0x90,0x5, 0xac,0x9c,0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb, +0x19,0xcd,0x36,0x76,0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, +0xf5,0x35,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0, +0xbe,0xf0,0x3, 0x50,0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x36,0x73,0xda, +0x3b,0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0x37,0x7e,0xb3,0x36,0x6b, +0xb4,0x1, 0x8, 0x12,0x88,0x22,0xe4,0x7a,0xb3,0x36,0x6b,0x7e,0xb3,0x36,0x6a,0x60, +0x4, 0x74,0xff,0xe1,0xc5,0x7e,0xb3,0x36,0x69,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xb9, +0x12,0xc0,0xef,0x38,0xc, 0x12,0x8f,0xf3,0x38,0x7, 0x12,0x8f,0xeb,0x38,0x2, 0xe1, +0xb9,0x12,0x8f,0xca,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, +0x80,0x3, 0x7c,0xbd,0x14,0x12,0xae,0x11,0x7c,0xfb,0x7e,0xb3,0x36,0x68,0x4, 0x7a, +0xb3,0x36,0x68,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xae,0x11,0x7c,0xab,0xbe,0xa0, +0xff,0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x36, +0x7e,0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, +0x12,0xae,0x98,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe, +0xf0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x68,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36, +0x75,0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x36,0x68,0x50,0x59, +0x74,0xc, 0xac,0xbf,0x49,0x25,0x36,0x7e,0x7e,0x14,0x61,0xcc,0x12,0x64,0xd3,0xbd, +0x23,0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0x9e,0xbe,0x37,0x36,0x64,0x40,0xd, +0x7e,0x34,0x61,0xd2,0x12,0x23,0x9e,0xbe,0x37,0x36,0x6f,0x50,0x23,0x74,0x5, 0xac, +0xbf,0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, +0x50,0x8, 0x12,0x87,0x52,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x6b, +0xe4,0x7a,0xb3,0x36,0x75,0x7a,0xb3,0x36,0x69,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a, +0xb3,0x36,0x68,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x90,0x61,0xc5,0xe4,0x93,0x7c, +0xdb,0x22,0x12,0xae,0xaf,0x74,0x1, 0x7a,0xb3,0x36,0x66,0x22,0x7e,0x24,0x0, 0x2, +0x2, 0x1e,0xb9,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26,0xf5,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf3,0x2a, +0x70,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3, +0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3, +0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x90, +0x50,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f, +0x36,0x6d,0x0, 0x12,0x1f,0x7, 0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x7, 0xda,0xf8,0x22, +0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8, +0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x6f, +0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x5c, +0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x60, +0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, +0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f, +0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x74,0xc8,0x7a,0xb3,0x39,0x6, 0xc2,0x17, +0x80,0xa, 0x12,0x45,0xd6,0x30,0x17,0x4, 0x75,0xe9,0xff,0x22,0x12,0x47,0xff,0x68, +0xf1,0x22,0x74,0x1, 0x12,0x90,0xf1,0x20,0x17,0x6, 0x12,0x46,0x4e,0x12,0x90,0xfa, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x90,0xb8,0x12,0x90,0xfa,0xe4,0x2, 0x90, +0xf1,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0x22,0xd2,0x4, 0x2, 0x45,0x5a,0xa, +0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x47,0xff,0x68,0xfb,0x20,0x93,0xfd, +0x22,0x7e,0x34,0x61,0x59,0x2, 0x23,0x9e,0x7e,0xb3,0x37,0x6, 0x70,0x2e,0x7e,0x73, +0x36,0xe9,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0x3, +0x7e,0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x91,0x6d,0x7c,0xab,0xe5,0x4e, +0xa, 0x3b,0x2e,0x37,0x38,0x83,0x7a,0x37,0x38,0x83,0x80,0xc, 0x7e,0xa3,0x36,0xea, +0xbe,0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x91,0x5d,0x75,0x4e,0x0, +0x7a,0xb3,0x39,0x6, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x20,0xf0,0x7a,0x71,0x82, +0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xb3,0x38,0x86,0x70,0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x38,0x86,0x22,0x7f,0x20,0xc2,0x4, 0x7e,0x2b,0x60,0x29,0x72,0x0, +0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21,0x0, 0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32, +0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x21,0x0, 0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d, +0x32,0x12,0x21,0x0, 0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60, +0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x37,0xf3,0x4d,0x33,0x68,0x2, +0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f,0x70,0x7c, +0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e, +0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12,0x87,0xbc,0x6c,0xff,0x12,0x2f,0xff,0x7f,0x51, +0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, 0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b, +0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e,0x14,0x62,0xa, 0x12,0x87,0xee,0x8, 0xc, 0x7e, +0x27,0x28,0x8a,0xbe,0x24,0x3, 0x20,0x8, 0x2, 0x61,0x2a,0xb, 0xa, 0xc0,0x1e,0xc4, +0xbd,0x3c,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x61,0x2a, +0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0, +0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca, +0x18,0x5, 0x4e,0xf0,0x1, 0x61,0x2a,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a, +0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa, +0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc, +0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90, +0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd, +0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b, +0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, +0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, +0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b, +0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0x40,0xbd,0x3d,0x22,0x7f,0x60,0x7e,0x6b,0xa0, +0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, +0x2d,0x15,0xb, 0x14,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0, +0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76,0x7d,0x13,0x1e, +0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e, +0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b, +0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xca,0x3b,0x6d,0x11,0x7e,0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c, +0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12,0x95,0x90,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x34,0xca,0x74,0x2, 0xa, 0x3f,0x19,0xb3,0x35,0x34,0xb, 0xf0,0x12,0x5e,0x2d, +0x38,0xe1,0x12,0x97,0xc0,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0xa1,0x69,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, +0x12,0x95,0xa1,0x38,0x2, 0xa1,0x67,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x4d,0x75,0x24,0x0, 0xa1,0x3f,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xca,0xbc,0xcd,0x68,0x2, 0xa1,0x3d,0x49,0x25,0x34,0xc8,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x0, 0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc6,0x74,0x9, 0xac,0xbf,0x12,0x96,0x1b,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x34,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x20,0xa, 0x1c,0x2e,0x14,0x35,0x34,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x67,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x69,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x1f,0x8c,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x97,0xae,0xac,0x3f,0x12,0x95,0x98,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x95,0x98,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x20,0x80,0x2a,0x5, 0x24,0x90, +0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0x81,0x49,0x80,0x1a,0x6d,0x11,0x74, +0x2, 0xac,0xbd,0x12,0x95,0x90,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1,0x34,0xca,0x74, +0x2, 0xa, 0x1d,0x19,0xb1,0x35,0x34,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x25,0xe4, +0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x5f,0xc6,0xca,0x59,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x34,0xc6,0x12,0x20,0xb9,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, 0xda,0x3b,0x22, +0x59,0x15,0x35,0x20,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x1f, +0x8c,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80, +0x63,0x6c,0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac, +0xbe,0x9, 0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x95,0xa1,0x38,0xe5, +0x12,0x95,0xa1,0x28,0x43,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x81,0xb3, +0x74,0x9, 0xac,0xbd,0x12,0x87,0xe5,0x12,0x96,0x1b,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8b,0x59,0x35,0x34,0xb0,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x87,0xb3,0xb, 0xe0,0xbc,0xfe,0x38,0x99,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x21,0x0, 0x7e,0xb3,0x37,0x31,0x70,0x3, 0x12,0x93,0xe3,0x2, 0x96,0x30, +0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x96, +0x7c,0x7c,0xbf,0x12,0x97,0x10,0x4c,0xee,0x78,0x14,0x12,0x5f,0xc2,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0x80,0xb, 0x7e,0xb3, +0x2a,0x9, 0x70,0x5, 0x7c,0xbf,0x12,0x95,0xa9,0x7c,0xbf,0x12,0x9f,0x90,0xbe,0xf0, +0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4, +0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, 0x2, 0x96,0xeb,0xa5,0xbe,0x0, 0x1d,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, +0xa0,0x12,0x5e,0x25,0x38,0xed,0x74,0x1, 0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x47,0x81,0x1b, +0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x47, +0x81,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0x12,0x97,0x4, 0x7e,0x8, +0x34,0xb0,0xe4,0x12,0x20,0xde,0x90,0x60,0x99,0x12,0x97,0x8, 0x7e,0x8, 0x34,0x8b, +0xe4,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60,0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x97,0xb6,0x7c,0x7d, +0x7c,0x6f,0x12,0x97,0xb6,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x97,0xae,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x1f,0x8c,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x2e,0x34, +0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x8, 0x1f,0x34,0x12,0x9e,0x37,0x7c,0x1b,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x34,0x9f,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x34,0x9f,0x1e,0x34,0x7a,0x37,0x34,0x9f,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9f,0x7e,0x37,0x34,0x9f,0x22,0xca,0xf8,0x7c,0xfb, +0x6d,0xdd,0x7c,0xbf,0x12,0x98,0xea,0x7d,0xe3,0x7c,0xbf,0x12,0x37,0x6f,0x7d,0xf3, +0x74,0x2, 0xac,0xbf,0x9, 0x95,0x26,0xfb,0x7c,0xbf,0x12,0x9a,0xed,0x40,0x2, 0x1, +0xd4,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0xbe,0xa0,0x0, 0x28,0x9, 0xa, 0x3a, +0x1b,0x34,0x12,0x98,0xd8,0x7d,0xd3,0x12,0x98,0xdf,0xbd,0xc3,0x58,0xb, 0xa, 0xca, +0xb, 0xc4,0x7d,0x3c,0x12,0x98,0xd8,0x2d,0xd3,0x12,0x9b,0xf, 0x7d,0xd3,0xbe,0xa0, +0x0, 0x28,0x56,0x12,0x98,0xdf,0xbd,0xc3,0x58,0x4f,0xbe,0x90,0x0, 0x28,0x4a,0xbe, +0x90,0x0, 0x28,0x45,0xbe,0xf4,0x0, 0xc8,0x8, 0x3f,0x7d,0x3d,0x3e,0x34,0x3e,0x34, +0xbd,0x3f,0x8, 0x35,0x7e,0x70,0x2, 0xac,0x79,0x49,0x33,0x4, 0xfc,0xbe,0x34,0x1, +0x2c,0x8, 0x26,0xa, 0x2a,0x7e,0xb3,0x2a,0x74,0x12,0x9b,0x18,0xbe,0x34,0x1, 0x90, +0x8, 0x17,0xbe,0xf4,0x1, 0x5e,0x58,0xd, 0x7e,0x34,0x0, 0x3, 0xad,0x3e,0xbd,0x3f, +0x8, 0x3, 0xe4,0x80,0x30,0x74,0x1, 0x80,0x2c,0x90,0x60,0xab,0xe4,0x93,0xbc,0xb9, +0x78,0x22,0x7c,0xba,0x7c,0x79,0x12,0x2c,0x40,0xbe,0x34,0x0, 0x96,0x8, 0x12,0x74, +0x2, 0xac,0xb9,0x49,0x35,0x4, 0xfc,0xbe,0x34,0x0, 0x32,0x8, 0x4, 0x74,0x1, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xb7,0x7c,0x79,0x2, 0x2c,0x40,0x7e, +0xb3,0x2a,0x6f,0xa, 0x3b,0x1b,0x34,0xa, 0xca,0x22,0xca,0x79,0x7c,0x8b,0x6c,0xaa, +0x9f,0x77,0x12,0x9a,0x2a,0x1a,0x79,0x1b,0x74,0x80,0x4c,0x1a,0x38,0x1b,0x34,0x7c, +0xe7,0x80,0x38,0xbc,0x9f,0x78,0x4, 0xbc,0x8e,0x68,0x2e,0xbe,0xf0,0x0, 0x48,0x29, +0x7e,0xb3,0x2a,0x6f,0xa, 0x2b,0x1a,0x3f,0xbd,0x32,0x58,0x1d,0xbe,0xe0,0x0, 0x48, +0x18,0x7e,0xb3,0x2a,0x70,0xa, 0x2b,0x1a,0x3e,0xbd,0x32,0x58,0xc, 0x7c,0xbf,0x7c, +0x7e,0x12,0x2c,0x40,0x12,0x99,0x65,0xb, 0xa0,0xb, 0xe0,0x1a,0x28,0xb, 0x24,0x1a, +0x3e,0xbd,0x32,0x8, 0xbe,0xb, 0xf0,0x1a,0x29,0xb, 0x24,0x1a,0x3f,0xbd,0x32,0x8, +0xaa,0x4c,0xaa,0x78,0x4, 0x6d,0x33,0x80,0x9, 0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12, +0x1f,0x58,0xda,0x79,0x22,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7, +0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f,0x34,0x7e,0xb3,0x2a,0x70,0x7a,0xb3, +0x1f,0x35,0x12,0x9a,0x2a,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x41,0x17,0x7a, +0xf1,0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d, +0x32,0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a, +0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d, +0x32,0x7c,0xb7,0xf5,0x2c,0x80,0x40,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58, +0x10,0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5, +0x2e,0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b, +0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12, +0x2c,0x40,0x12,0x99,0x65,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x2c,0x1a, +0x3b,0xbd,0x32,0x8, 0xb2,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd, +0x32,0x18,0x2, 0x21,0x8f,0x7f,0x17,0xda,0x79,0x22,0x7e,0x70,0x2, 0xac,0x78,0x9, +0x93,0x26,0xfa,0x9, 0x83,0x26,0xfb,0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x62,0x27, +0x12,0x9a,0xe5,0x12,0x9b,0x23,0x50,0x2, 0x41,0xe0,0x7e,0x34,0x62,0x2b,0x12,0x23, +0x9e,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, 0x41,0xe0,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x9a,0xe5,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x4, 0x4c,0x8, 0x6b,0x6c,0xdd,0x80,0x5f,0xc2,0x3, 0x7c,0xbd,0x12,0x37,0x6f, +0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x99,0x6c,0x7a,0x35,0x24,0x9e,0x35, +0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0xdc,0x7a,0x35, +0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, +0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x9a,0xed, +0x50,0x2, 0xc2,0x3, 0x30,0x3, 0xf, 0x7c,0xbd,0x6c,0x77,0x12,0x51,0x5f,0x7e,0x70, +0x2, 0xac,0x7d,0x12,0x37,0x9f,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x99, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x7c,0x4b,0x74, +0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc, +0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x2, 0x1e,0xb9,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33, +0x4, 0xfc,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x37,0x6f,0xbe,0x34, +0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0xe9, +0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0x3b,0x7e,0x77,0x2a,0x5c,0x12, +0x9d,0xa1,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x9b,0xd7,0x7e, +0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x35,0xe5,0xbd,0x36,0x48,0x7, 0x3e,0x34,0x3e, +0x34,0x12,0x9b,0xd7,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0x9b,0x23,0x50,0x6, 0x7e, +0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60,0xc, 0x7e, +0xb3,0x35,0xe3,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xe3, +0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x45,0xe, 0x7e,0x53,0x35,0xe3,0xbe,0x50,0x0, +0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, 0x7d,0xfe, +0x7a,0xf7,0x2a,0x5c,0x12,0x9b,0xdf,0x28,0x3, 0x12,0x37,0xc2,0x7a,0x67,0x35,0xe5, +0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xb9,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x79,0xc2,0x3, 0x7e,0xf0,0x3, 0x7e,0xe3, +0x2a,0x3, 0x12,0x9b,0xdf,0x28,0x72,0x7c,0xbf,0x12,0x2c,0x47,0x4c,0xee,0x68,0xe, +0x7e,0x63,0x33,0xc0,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x33,0xc1,0x70,0x4, 0xd2,0x3, +0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x4d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x3, +0x80,0x1e,0xd2,0x3, 0x12,0x9c,0xf6,0x78,0xa, 0xa5,0xbe,0x0, 0x6, 0x6c,0xff,0xc2, +0x3, 0x80,0xd, 0x9e,0x73,0x33,0xc0,0xbc,0x7e,0x78,0x5, 0x7e,0xf0,0x2, 0xc2,0x3, +0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x2c,0x47,0x7e,0xa3,0x33,0xc2,0x7a,0xa3,0x28,0x84, +0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x33,0xc3,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9, +0x1b,0xfd,0x12,0x9c,0x6f,0xf5,0x4d,0x80,0x3, 0x75,0x4d,0x64,0xda,0x79,0x22,0x7e, +0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80, +0x42,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x9c,0xee,0x9, 0xb3,0x26, +0xfa,0x12,0x2f,0xd6,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12, +0x9c,0xee,0x9, 0xb3,0x26,0xfb,0x12,0x2f,0xd6,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, +0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c, +0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28, +0x84,0xbc,0xb1,0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c, +0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0xca,0x79,0x6c, +0x88,0x80,0x72,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a, +0x71,0x24,0x7c,0xbf,0x12,0x9d,0x8b,0x50,0x5a,0x6c,0xee,0x80,0x51,0xbc,0xe8,0x68, +0x4b,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9d,0x80,0xf5,0x26,0x6c,0x99,0x90,0x60,0xaa, +0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, 0x2f, +0xe5,0x25,0xa, 0x3b,0x12,0x35,0x67,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, 0x78, +0x1b,0x7c,0xbe,0x12,0x37,0x6f,0x7d,0xf3,0x7c,0xb8,0x12,0x37,0x6f,0xbd,0x3f,0x8, +0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x51,0x5f,0xb, 0xe0,0x12,0x9c, +0xf6,0x38,0xaa,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0x86,0xda,0x79,0x22, +0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0x22,0x7c,0xab,0x90,0x60,0xab, +0xe4,0x93,0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x31,0x5a,0x50,0x2, 0xd3,0x22,0xc3, +0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84,0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12, +0x2f,0xb7,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb, +0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x40,0x7d,0xf3,0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, +0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x2, 0x70,0x2d, +0x7e,0x73,0x2a,0x3, 0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc5,0x70,0x18,0x12, +0x9e,0x17,0x7e,0x73,0x2a,0x3, 0x7a,0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, +0x7e,0xb3,0x34,0xc5,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc5,0x22,0xe4,0x7a,0xb3, +0x34,0xc5,0x7a,0xb3,0x2a,0x9, 0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x35, +0xe9,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73, +0x35,0xe8,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0xc1, +0xd2,0x7c,0x57,0xc1,0xca,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98, +0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff, +0x68,0x66,0x12,0x9e,0xe2,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e, +0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, +0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x9e,0xe2, +0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7, +0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0xc1,0x45, +0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6,0x28,0x2, 0xc1,0x41,0x7c,0xba,0xda, +0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0x7c,0xab,0x7e,0xb, +0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x34,0xa3,0xbe,0x73,0x34,0xad, +0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa3,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22, +0xbe,0x73,0x34,0xad,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74, +0xff,0x19,0xb4,0x34,0xa3,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x34,0xa3,0xbe,0xb0,0xff, +0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa3,0xd3,0x22,0xe4,0x19,0xb3,0x34,0xa3,0xc3,0x22, +0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34, +0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x5, 0xbe, +0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34, +0xb0,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x34,0x8b,0x80,0x4, 0x59,0x35,0x34,0x8b,0x59, +0xf5,0x34,0xb0,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x25,0x3c, +0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x25,0x3c, +0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28, +0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90, +0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0x12,0x5e,0x25, +0x38,0xb2,0x22,0x7e,0x8, 0x34,0xa2,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20,0xde,0x6c, +0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12,0x2f,0xb7,0x60,0xa, 0x12,0xa0,0x84,0x40, +0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5, +0x7c,0xb0,0x6c,0x77,0x12,0xa0,0x49,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70, +0x1, 0x12,0xa0,0x49,0xb4,0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x2f,0xb7, +0x60,0xc, 0x12,0xa0,0x84,0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x51,0x5f,0xb, 0x10, +0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3,0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e, +0xb3,0x36,0x61,0x7a,0xb3,0x36,0x62,0x7a,0xa3,0x36,0x61,0x7e,0xb3,0x36,0x62,0x60, +0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e,0xb3,0x36,0x63,0x60, +0x5, 0x14,0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x0, 0x28,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c, +0xa7,0x90,0x60,0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, +0x80,0x71,0xbe,0xb0,0x2, 0x38,0x66,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27, +0x7e,0x73,0x26,0xfa,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26, +0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x2, +0x80,0x4e,0x6c,0xff,0x80,0x30,0x7c,0xbf,0x12,0x37,0x81,0x1a,0x4b,0x7c,0xbf,0x12, +0x37,0x6f,0x7d,0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d, +0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, 0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75, +0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xcb,0x80,0x6, 0xe5,0x1e,0x24, +0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, +0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22,0x7e,0x39,0x70,0xa, 0x37,0x9d,0x32,0x2, +0x21,0x0, 0xca,0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6, +0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd, +0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f,0x46,0x75,0x2b,0x0, 0x61,0x43,0x12,0xa4, +0xde,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b, +0x2e,0x34,0x14,0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x22,0xff,0x12,0x20,0xb9,0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a,0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35, +0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff,0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a, +0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5,0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xa4, +0xe6,0x2e,0x35,0x36,0x12,0xa1,0x48,0x7d,0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58, +0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, 0x3b,0x7f,0x3, 0x12,0xa4,0xe6,0x2e,0x35, +0x38,0x12,0xa1,0x48,0x7d,0xc3,0x7e,0x35,0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32, +0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37,0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a, +0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c, +0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5,0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb, +0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0x61, +0x41,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60, +0x8, 0x2, 0x61,0x41,0x80,0x28,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, +0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x61,0x41,0xbe,0x34,0x0, 0x30,0x8, +0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x61,0x41,0x7e,0xa3, +0x38,0x41,0x74,0xc, 0xa4,0xbe,0x57,0x22,0xf9,0x58,0x2, 0x61,0x41,0x7e,0xa3,0x38, +0x42,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58,0x2, 0x61,0x41,0x7e,0x15,0x36,0x6d,0x0, +0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xa3,0x7e,0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d, +0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xa3,0x7e,0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73, +0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38,0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b, +0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4,0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10, +0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33,0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7c,0xb7,0xf5,0x2e,0xe5,0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37, +0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34,0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e, +0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22, +0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35,0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a, +0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a,0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22, +0xf6,0x5, 0x2b,0x12,0xa4,0xde,0x28,0x2, 0x21,0x7e,0x7e,0xa3,0x22,0xf7,0xbe,0xa1, +0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe,0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50, +0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, 0x34,0x7a,0x73,0x38,0x3e,0x7a,0xb3,0x38, +0x40,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x38,0x3e,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a, +0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43,0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14, +0x12,0xa4,0xd6,0x7a,0x55,0x4a,0xa, 0x5e,0x7f,0x16,0x12,0xa4,0xd6,0x7a,0x55,0x48, +0x7e,0x35,0x48,0x12,0xa4,0xcf,0x2f,0x50,0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a, +0x0, 0x2f,0x70,0x12,0xa4,0xcf,0x12,0xa4,0xc5,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d, +0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4a,0x12,0xa4,0xc5,0x7e,0x1d,0x40, +0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12, +0xa4,0xc5,0x7e,0x1d,0x44,0x2f,0x10,0x7a,0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c, +0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x1f,0x58,0x7f,0x51,0x7f,0x17,0x7f, +0x6, 0x12,0x1f,0x58,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12, +0x1e,0xfc,0x7e,0x87,0x23,0x43,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x3c,0x7e,0x1d,0x40,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x40,0x7e,0x1d,0x44,0x7d,0x19,0x12,0x1e,0xfc,0x7d,0x18, +0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x58,0x7a,0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1e, +0xeb,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12,0x1e,0xeb,0x7e,0x5d,0x3c, +0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1e,0xeb,0x7e,0x7d,0x40,0x9f,0x71,0xbe,0x58, +0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18, +0x7f,0x16,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x5, 0x12,0x1f,0x58,0x7f,0x6, 0x12,0x1e, +0xeb,0x7f,0x7, 0x12,0x1f,0x58,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44, +0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0x7f,0x1, 0x22,0x7d, +0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x39,0x1, 0xbe,0x71,0x2b,0x22,0x2d,0x13,0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79, +0x6c,0xaa,0x12,0xa5,0xe4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf, +0x38,0x43,0x7f,0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x38, +0x63,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda,0x7e,0x8, 0x38,0x43,0x7e,0x18,0x38,0x63, +0x74,0x20,0x12,0xa1,0x52,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73, +0x38,0x3f,0xbe,0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22, +0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0x33,0x38,0x3f,0xa, 0x13,0x6d,0x0, 0x12, +0x1f,0x7, 0x7c,0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64, +0xa, 0x3e,0x1b,0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xa5,0x92,0x7f,0x6, 0x7c, +0xbd,0x7c,0x7c,0x12,0xa5,0x92,0xb, 0xf0,0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x50,0xbc, +0x7f,0x5, 0x7f,0x16,0x12,0xa4,0xee,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x38,0x3e,0xda, +0x3b,0x22,0x7c,0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d, +0x2, 0xb, 0xa, 0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, +0x7c,0x21,0xa5,0xba,0x0, 0x14,0x1a,0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d, +0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, +0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35, +0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xe4,0x7a, +0xb3,0x35,0x69,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x5, 0xe4, +0x7a,0xb3,0x35,0xe4,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x4f,0x12,0xa6,0x4e,0x28, +0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0xdc,0xbe,0x37, +0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x3, 0x70,0x17,0x7e, +0xb3,0x37,0x8, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28, +0x5, 0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0xb3, +0x28,0x84,0xbe,0xb0,0x0, 0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x6e, +0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c, +0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x4a,0x12,0xa6,0xff,0x78, +0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x21, +0x0, 0x7d,0x13,0x7d,0x3e,0x12,0x21,0x0, 0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5, +0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33,0x9e,0x35,0x2e,0xbd,0x3e,0x8, +0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, +0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xae,0x7e,0x73, +0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80, +0xa, 0x12,0xa6,0xff,0x78,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc, +0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0xc1,0x71,0xda,0x3b,0x22,0xa, +0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22, +0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d, +0x0, 0x7f,0x14,0x12,0x1f,0x58,0x7d,0x73,0x12,0x21,0x0, 0x7d,0xe3,0x7d,0x3f,0x12, +0x21,0x0, 0xbd,0x3e,0x22,0x7e,0x63,0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c, +0xc2,0x12,0x6c,0x33,0x80,0x56,0x90,0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac, +0x93,0x90,0x60,0xab,0xe4,0x93,0xa, 0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4, +0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a, +0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x31,0x5a,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f, +0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, 0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, +0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75, +0xbc,0x73,0x38,0xa2,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x32,0xe7,0x22,0x90,0x60,0xa7, +0xe4,0x93,0x60,0x8, 0x30,0x12,0x5, 0x12,0x31,0x7d,0xc2,0x12,0x22,0xca,0xd8,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x22,0xe6,0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x1f,0xad,0x6d,0x11,0x7e,0x4, +0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0xa8,0xe1,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d, +0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, +0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x1, 0xd2,0xbe,0xd4,0x4, +0xb0,0x8, 0x2, 0xd2,0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd, +0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7, +0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x1, 0xd2,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, +0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0xa8,0xe1,0x1a,0x26,0x1a,0x24,0x2f, +0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0xa8,0xd7,0x9f,0x55,0x6c,0xee, +0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12, +0x21,0x0, 0x7d,0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, +0x1d,0x12,0xa8,0xd7,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, +0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea, +0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x58,0x7d,0x13, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x0, 0xca, +0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x7f,0xc2,0x3, 0x6d,0x44,0x80,0x1e, +0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x12,0xa8,0xe9,0xbd,0x3d,0x48,0xd, 0x7d, +0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa8,0xe9,0x7d,0xd3,0xb, 0x44,0x7e,0xc5, +0x35,0xbd,0xc4,0x38,0xdb,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba, +0x7d,0x3d,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f, +0x10,0x2e,0x35,0x35,0x7a,0x1b,0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f, +0x17,0x2d,0x35,0xb, 0x1a,0x30,0x7f,0x60,0x2e,0xd5,0x35,0x7e,0x6b,0xb0,0x60,0x5, +0xe, 0x34,0x14,0x78,0xfb,0x7c,0xb7,0x12,0xa9,0x78,0xb, 0x44,0x7e,0x55,0x35,0xbd, +0x54,0x38,0xd8,0xda,0xf8,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xb0,0x22, +0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5,0x1, 0x6c,0xaa, +0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0xa9,0x76,0xb, 0xa0,0xbe,0xa0, +0xd, 0x40,0xed,0xc2,0xc9,0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, 0x7e,0x73,0x2a, +0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0xad,0x13,0x7d,0x21,0x6c, +0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x38,0xd9,0x2d,0xf0,0xb, +0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, 0x59,0x4, 0x25, +0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35,0x35,0x7e,0xf, 0x37,0x40,0x7e,0x18, +0x25,0xb6,0x2, 0xa8,0xef,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12,0xaa,0x2e,0x7e, +0x1f,0x38,0xd9,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x24,0xf6,0x12, +0xaa,0x35,0x12,0xaa,0x3e,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, 0x20,0x7a,0x37, +0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, 0x22,0xa9,0xd1, +0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2,0x22,0x7e,0x73, +0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53,0x2a,0x6d,0xac, +0x54,0x7e,0x17,0x28,0xa1,0x12,0xaa,0x2e,0x6d,0x0, 0x80,0x37,0x7d,0x40,0x3e,0x44, +0x7e,0x7f,0x38,0xd9,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10,0x7d,0xf4,0x2e, +0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14,0x6d,0x55,0x9d, +0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d,0x51,0x1b,0x48, +0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22,0x7c,0xab,0x7e,0x8, 0x29,0xbc,0x12,0x5e, +0x25,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0,0xb4,0x2, 0x4, 0x74, +0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31,0x7d,0x20,0x39,0xb1, +0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e,0x24,0x0, 0xff,0xb, +0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0x61,0x73,0x90,0x60,0xa7,0xe4,0x93, +0x70,0x2, 0x61,0x73,0x6c,0xff,0x61,0x6c,0x7e,0x70,0x9, 0xac,0x7f,0x9, 0xe3,0x29, +0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, 0x7d,0x3d,0x12, +0xab,0x81,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, 0x7d,0x34,0x1b, +0x34,0x12,0xab,0x78,0x7c,0xbe,0x12,0xaa,0x98,0x80,0x3f,0x7e,0x70,0x2, 0xac,0x7d, +0x2e,0x34,0x60,0xc5,0x12,0x87,0xbc,0x74,0x9, 0xac,0xbf,0x59,0xd5,0x29,0x8, 0x7e, +0x34,0x60,0xcf,0x12,0x23,0x9e,0x12,0xab,0x78,0x80,0x1f,0xbd,0xc4,0x40,0x1b,0x7d, +0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0xaa,0x98,0x7d,0xc4, +0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12,0x5e,0x2d,0x28, +0x2, 0x41,0xe8,0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0xa, +0x22,0x6c,0xaa,0x80,0x27,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x60,0xb1, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14,0x60,0xb3,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0xb, 0xb, 0xa0,0x90,0x60,0xa7,0xe4, +0x93,0xbc,0xba,0x38,0xd0,0x7c,0xba,0x22,0x90,0x60,0xa7,0xe4,0x93,0x60,0x2b,0x6c, +0x33,0x80,0x1f,0x7c,0xb3,0x12,0x31,0x5a,0x40,0x16,0x7c,0xb3,0x12,0x31,0x27,0x7d, +0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x1b,0x1a,0x50, +0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0xab,0xfd,0x7e,0x14, +0x62,0x7, 0x12,0x87,0xee,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22,0x6d,0x11,0xe4, +0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x7f,0x38,0xf3, +0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12,0x21,0x0, 0xbd, +0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xf3,0x2d,0x13,0x69,0x20, +0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x81,0xbf,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x1f, +0x38,0xf3,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14, +0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff, +0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22,0x6c,0x66,0x7e, +0x27,0x39,0x4, 0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e,0xb3,0x28,0xac, +0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xab,0xbc,0x76,0x50,0xf, 0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8a,0x87,0x7e,0xb3,0x2f,0xab,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3, +0x2f,0xab,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xac,0xbe,0xa0,0x5, +0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74,0x5, 0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xac,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, 0xac,0x5a,0x49, +0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8,0x30,0x1, 0xe, +0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d,0x23,0xa, 0x3a, +0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f,0x7e,0x63,0x2a, +0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac,0x56,0x49,0x22, +0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e,0xb3,0x2a,0x6d, +0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, 0x2, 0xc2,0x3, +0xa2,0x3, 0x22,0xc2,0x3, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1,0x60,0x4, 0xd2, +0x3, 0x80,0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57,0x49,0x12,0x4, +0xfc,0x7e,0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d,0x22,0x9d,0x20, +0xbd,0x12,0x58,0x4, 0xd2,0x3, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e,0x14,0x0, 0x3, +0xa, 0x27,0xbd,0x21,0x48,0xd2,0xa2,0x3, 0x22,0x7d,0x23,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x7e,0x14,0x0, 0x5, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33, +0x36,0xdc,0xbe,0x30,0x8, 0x50,0x45,0x74,0x8, 0x80,0x3d,0x7d,0x13,0x3e,0x14,0xbd, +0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x6, 0x50,0x30,0x74,0x6, 0x80,0x28, +0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc, +0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, 0x80,0xf, 0xbd,0x32,0x50,0xf, 0x7e,0x73,0x36, +0xdc,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xdc,0x7e,0xb3,0x36,0xdc, +0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a,0xb3,0x36,0xdc,0x74,0x1, 0x7a,0xb3,0x16,0x92, +0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3,0x36,0xdc,0x50,0x5, 0xe4,0x7a,0xb3,0x16,0x91, +0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0xae,0x8a,0x68,0x23, +0x7e,0x70,0xc, 0xac,0x72,0x12,0xae,0xa2,0x7d,0x23,0x7e,0x70,0xc, 0xac,0x72,0x59, +0x23,0x36,0x82,0x49,0x3, 0x36,0x82,0x49,0x23,0x36,0x7e,0xbd,0x20,0x50,0x4, 0x59, +0x3, 0x36,0x7e,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22,0x80,0x18,0x12, +0xae,0x8a,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7e,0xbd,0x4, 0x50, +0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37,0x36,0x64,0xbe, +0x37,0x36,0xdd,0x50,0x8, 0x7e,0x37,0x36,0xdd,0x7a,0x37,0x36,0x64,0x12,0xae,0x98, +0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, 0xac,0x12,0x9, +0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, 0x22,0x7e,0x70,0xc, 0xac,0x7a,0x49,0x33,0x36, +0x7e,0x22,0x49,0x23,0x36,0x84,0x49,0x33,0x36,0x80,0x9d,0x32,0x2, 0x21,0x0, 0x7e, +0x8, 0x36,0x7a,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x20,0xde,0x6c,0xaa,0x7e,0x44,0xff, +0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7c,0x59,0x43,0x36,0x84,0xb, 0xa0, +0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x68,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20, +0xde,0x7e,0xa3,0x2b,0x62,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62,0xd2,0xc, 0x30, +0xc, 0x7, 0x12,0xae,0xfa,0xe4,0x2, 0xa, 0x66,0x22,0xc2,0xc, 0x7e,0x8, 0x2a,0x6d, +0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x6d,0x74,0x3, 0x2, 0x11,0x7a,0xe4,0x7a,0xb3,0x36, +0x67,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xee,0xe4,0x7a,0xb3,0x36,0x68,0x6d,0x33,0x7a,0x37, +0x36,0x6f,0x7a,0x37,0x36,0x64,0x22,0x7e,0xb3,0x36,0x6a,0xb4,0x1, 0x27,0x7e,0xb3, +0x36,0xe0,0x4, 0x7a,0xb3,0x36,0xe0,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x3, 0x40,0x15, +0x12,0x8c,0x90,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x6, 0x40,0x9, 0xe4,0x7a,0xb3,0x36, +0xe0,0x7a,0xb3,0x36,0x6a,0x22,0x12,0x24,0x14,0xe4,0x7a,0xb3,0x3, 0xfe,0x2, 0x76, +0x52,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88,0x7e,0xf0,0x1, +0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f,0x7f,0x7, 0x2d, +0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc,0x9f,0x38,0xe2, +0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0,0x1, 0x2, 0xb0, +0x31,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, 0x80,0x36,0x7e, +0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0xe5,0x44, +0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16,0x5, 0x45,0xa, +0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0xc0,0xe8,0xbd,0x3d,0x8, 0x5, 0x12,0xc0, +0xe8,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe,0xb0,0x0, 0x28, +0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x72,0x33,0xc3,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x33, +0xc4,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x30,0x3, 0x1b,0x1a,0xd0,0xb, 0xa0,0xb, +0xf0,0xbc,0x8f,0x40,0x3, 0x2, 0xaf,0xb1,0x7c,0xba,0xda,0x79,0xda,0xd8,0x22,0x7c, +0x9b,0x7f,0x71,0x7f,0x60,0x7e,0x34,0x22,0xb8,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f, +0x52,0x74,0x2a,0x12,0x1f,0xad,0x7e,0x58,0x1f,0x52,0x7c,0xb9,0x7e,0x71,0x44,0x12, +0x2c,0x40,0x7d,0x43,0xe5,0x45,0x7e,0x71,0x46,0x12,0x2c,0x40,0x2d,0x34,0xe, 0x34, +0x7f,0x5, 0x7e,0x50,0x7, 0xb, 0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, +0x1b,0x6a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b, +0x50,0x78,0xe2,0x22,0x6d,0x33,0x7d,0x23,0x7d,0x3, 0x6c,0x33,0x80,0x45,0x6c,0x22, +0x80,0x37,0x7e,0xb3,0x2a,0x6e,0xac,0xb3,0xa, 0x42,0x2d,0x54,0x7d,0x45,0x3e,0x44, +0x7e,0x7f,0x13,0x8a,0x2d,0xf4,0xb, 0x7a,0x40,0xbe,0x44,0x0, 0x32,0x8, 0x8, 0xbe, +0x44,0x2, 0x58,0x58,0x2, 0xb, 0x24,0xbe,0x44,0xff,0xce,0x58,0x8, 0xbe,0x44,0xfd, +0xa8,0x8, 0x2, 0xb, 0x4, 0xb, 0x34,0xb, 0x21,0x7e,0x93,0x2a,0x6e,0xbc,0x92,0x38, +0xc1,0xb, 0x31,0x7e,0xb3,0x2a,0x6d,0xbc,0xb3,0x38,0xb3,0x7e,0x54,0x0, 0x6, 0xad, +0x53,0x7d,0x15,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x12,0x25,0x3e,0xbd,0x12,0x50,0x22, +0xbd,0x30,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x8, 0x7e,0xb3,0x39,0x9, 0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x9, 0x80,0x3c,0xe4,0x7a,0xb3,0x39,0x9, 0x74,0x1, +0x80,0x2f,0xbd,0x10,0x50,0x22,0xbd,0x32,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x9, 0x7e, +0xb3,0x39,0x8, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x8, 0x80,0x16,0xe4, +0x7a,0xb3,0x39,0x8, 0x74,0x2, 0x80,0x9, 0xe4,0x7a,0xb3,0x39,0x8, 0x7a,0xb3,0x39, +0x9, 0x7a,0xb3,0x39,0xa, 0x7e,0xb3,0x39,0xa, 0x22,0xe4,0x7a,0xb3,0x28,0xa8,0x7a, +0xb3,0x39,0xb, 0x22,0xca,0xd8,0xca,0x79,0xc2,0x3, 0x6c,0xdd,0x7e,0x57,0x28,0x99, +0x7d,0xf5,0x7e,0xe7,0x28,0x97,0x7e,0x37,0x37,0xfb,0x4d,0x33,0x68,0x4, 0x7d,0xf5, +0xe, 0xf4,0x6c,0xff,0x7e,0xa3,0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68, +0x21,0x14,0x68,0x14,0x24,0xc2,0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10, +0x7c,0xfa,0x7e,0x83,0x2a,0x6d,0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, +0x6c,0x88,0x6c,0x99,0x80,0xf, 0x7c,0xb9,0x12,0x37,0x6f,0xbe,0x34,0x2, 0x58,0x8, +0x2, 0xb, 0xd0,0xb, 0x90,0x7e,0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, +0x40,0x2, 0x61,0x25,0x7e,0xa3,0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, +0x28,0x37,0x7e,0xb3,0x26,0x83,0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f, +0x2d,0x32,0x3e,0x34,0x49,0x23,0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc, +0xbd,0xe, 0x58,0xf, 0x6d,0x33,0x9d,0x3e,0x12,0x8f,0xdc,0xbd,0x3, 0x8, 0x4, 0xd2, +0x3, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe, +0xe7,0x7, 0xf8,0x8, 0x2, 0xc2,0x3, 0x30,0x3, 0x20,0x7e,0xb3,0x39,0xb, 0x4, 0x7a, +0xb3,0x39,0xb, 0x7e,0x23,0x39,0xb, 0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3, +0x39,0xb, 0x74,0x1, 0x7a,0xb3,0x28,0xa8,0x80,0xf, 0x7e,0x23,0x39,0xb, 0xbe,0x20, +0x0, 0x28,0x6, 0x1e,0x20,0x7a,0x23,0x39,0xb, 0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, +0xbe,0xa0,0x0, 0x28,0x69,0x7e,0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa, +0xbe,0xb0,0x1, 0x68,0x59,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d, +0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x2c,0x3c, +0xbe,0x34,0x0, 0x96,0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28, +0x84,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3, +0x27,0x36,0x9, 0xd3,0x27,0x37,0x12,0x2c,0x3c,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e, +0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99, +0x80,0x17,0xa, 0xe9,0xa, 0x5f,0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f, +0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78, +0x25,0x7e,0xb3,0x39,0xc, 0x4, 0x7a,0xb3,0x39,0xc, 0x7e,0x73,0x39,0xc, 0xbe,0x70, +0x5, 0x28,0x22,0x74,0x5, 0x7a,0xb3,0x39,0xc, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2, +0x15,0x12,0xb1,0x5a,0x80,0xf, 0x7e,0x73,0x39,0xc, 0xbe,0x70,0x0, 0x28,0x6, 0x1e, +0x70,0x7a,0x73,0x39,0xc, 0xda,0x79,0xda,0xd8,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34, +0x0, 0x38,0xca,0x39,0xac,0x7f,0x2e,0x34,0x0, 0x50,0x6d,0x22,0x7e,0x8, 0x34,0x0, +0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, +0x30,0x6d,0x22,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x7e, +0xa3,0x2a,0x6e,0xa, 0x3a,0x3e,0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x20,0xde,0x90, +0x60,0x93,0x93,0xa, 0x3b,0x7e,0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad, +0x32,0x7d,0x43,0x6c,0x77,0x80,0x1d,0xa, 0x27,0x2d,0x24,0x12,0x87,0xdc,0xb, 0xa, +0x0, 0x7e,0x30,0x2, 0xac,0x37,0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b, +0x18,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xdf,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x13,0xc6,0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24, +0x13,0x8e,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38, +0xdc,0x22,0x7c,0xab,0x12,0xb3,0xe1,0xd2,0x16,0x7c,0xba,0x12,0x86,0xf8,0xc2,0x16, +0x22,0xa9,0xd1,0xcb,0x74,0x1, 0x2, 0x0, 0xe, 0x12,0xb3,0xe1,0x7e,0x34,0xd, 0xc8, +0x7e,0xb3,0x2a,0x6d,0x12,0xb4,0x22,0x12,0xb4,0x5, 0x7a,0x37,0x38,0xd6,0x74,0x1, +0x7a,0xb3,0x16,0x91,0x22,0x6d,0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28, +0x3, 0x2, 0xb4,0xef,0x90,0x60,0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb4, +0x56,0x22,0x7a,0xb3,0x24,0xf2,0x7e,0x53,0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37, +0x24,0xfa,0xe4,0x7a,0xb3,0x24,0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a, +0x37,0x24,0xf6,0x7e,0x34,0x0, 0x20,0x12,0xb4,0x4d,0x2, 0xd, 0x7, 0x7a,0x37,0x24, +0xfc,0x7e,0x8, 0x24,0xf2,0x22,0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e, +0xa, 0xd8,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa, +0x80,0x18,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, +0x5a,0xc0,0x9d,0xc2,0x59,0xc3,0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60, +0x92,0xe4,0x93,0x7c,0x9b,0x6d,0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92, +0xe4,0x93,0xa, 0xcb,0x1b,0xc4,0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa, +0x80,0x28,0xa, 0x3a,0x7d,0x23,0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d, +0x3e,0x34,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x0, +0x7d,0xa3,0xbd,0xfa,0x58,0x2, 0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8, +0x2d,0xec,0x2d,0xdc,0xb, 0xf0,0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca, +0xf8,0x6d,0x44,0x7e,0xf3,0x2a,0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3, +0x2a,0x6d,0xa, 0xeb,0x2d,0xef,0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60, +0x94,0xe4,0x93,0xb4,0xff,0x31,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda, +0x2d,0xdf,0x3e,0xd4,0x7e,0x1f,0x38,0xd9,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, +0xac,0x5a,0x7f,0x50,0x2d,0xb2,0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, +0xa0,0xbc,0xfa,0x38,0xd9,0x80,0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x38,0xd9,0x2d, +0x15,0x6c,0xaa,0x80,0x2c,0xa, 0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x38,0xd9,0x2d, +0x3e,0xb, 0x1a,0xe0,0x7e,0x70,0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0, +0x7d,0x3e,0x9d,0x3d,0x12,0x21,0x0, 0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, +0xa0,0xbc,0xfa,0x38,0xd0,0x7d,0x34,0xda,0xf8,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, +0xa9,0xd5,0xea,0xa9,0xc5,0xea,0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e, +0x5, 0x4e,0x7e,0x73,0x39,0x6, 0xbe,0x71,0x4e,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e, +0xa9,0xd7,0x9e,0xa9,0x34,0xe5,0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, +0xa9,0xc2,0xcd,0xa9,0x33,0xe5,0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7, +0xcd,0xa9,0x36,0xe5,0x3, 0xa9,0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6, +0xc2,0x88,0xd2,0xa8,0x22,0x7e,0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47, +0x52,0x7e,0x24,0x55,0x50,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20, +0x7e,0x24,0x41,0x44,0x79,0x30,0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33, +0x7e,0x24,0x66,0xcc,0x79,0x30,0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47, +0x7e,0x24,0x46,0x4c,0x79,0x30,0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd0,0xce, +0xa2,0x3, 0xa9,0x95,0xc9,0x22,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2, +0x86,0xa9,0xc2,0xeb,0xa9,0xd2,0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f, +0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d, +0x1, 0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75, +0xf7,0x0, 0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9, +0xd0,0xf7,0xd2,0xf8,0xa9,0xc1,0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6, +0xb7,0xc2,0xbe,0x22,0x75,0xe7,0x6b,0x2, 0xb6,0x9a,0xe4,0x7e,0x34,0xd7,0xfc,0x7e, +0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff, +0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e,0x37,0x39,0x4, 0xb, 0x34,0x7a,0x37, +0x39,0x4, 0xbe,0x34,0xff,0x0, 0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37,0x39,0x4, +0x22,0x7c,0x6b,0x6c,0x77,0x6c,0xaa,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x46,0x12,0xb7, +0x8f,0x75,0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12, +0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc, +0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1, +0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0xa9,0xc6,0xb3, +0x75,0xb5,0x0, 0x22,0x74,0x6, 0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73, +0x7d,0x52,0x7c,0xab,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x3c,0x12,0xb7,0x8f,0x75,0xb5, +0x1, 0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0xb7,0x38,0xa9, +0xc2,0xb4,0xa9,0xc6,0xb3,0x22,0x74,0x2, 0x7d,0x3f,0x2, 0xb7,0x38,0x7d,0x42,0x7f, +0x60,0x7d,0x3, 0x12,0xb7,0xef,0x74,0x2, 0x12,0xb6,0xd1,0x7d,0xf3,0x4e,0xf4,0x0, +0x1, 0x4e,0xf4,0x0, 0xa, 0x12,0xb7,0x96,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f, +0x6, 0x12,0xb7,0xd7,0x5e,0xf4,0xff,0xfd,0x12,0xb7,0x96,0x2, 0xb7,0xce,0xa9,0xc5, +0xca,0xe4,0x7a,0xb3,0x39,0x13,0x22,0x12,0xb8,0x38,0x7e,0x35,0x36,0x12,0xb8,0x1c, +0xa9,0xd2,0xb4,0xd3,0x22,0x74,0x6, 0x12,0xb6,0xd1,0x7d,0x3, 0x6c,0x11,0x22,0xa9, +0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1,0xea,0x74,0xa5,0x7a,0xb3,0x39,0x13,0x22,0xca, +0xf8,0x7c,0xfb,0x74,0x2, 0x12,0xb6,0xd1,0x4c,0xff,0x78,0x5, 0x5e,0x70,0xdf,0x80, +0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0xb7,0x38,0xda,0xf8,0x22,0x6d,0x22,0x80,0x13, +0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, +0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5, +0xa, 0x44,0xf5,0x39,0x7f,0x21,0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xb8,0x63, +0xe5,0x3a,0x12,0xb8,0x63,0xe5,0x39,0x12,0xb8,0x63,0xe5,0x38,0x12,0xb8,0x63,0xe4, +0x2, 0xb8,0x63,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0xd2,0xc8, +0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0xb7, +0xef,0xe4,0x12,0xb7,0xff,0x2, 0xb7,0xce,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c, +0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, +0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74, +0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x97,0xbe,0x90,0x1, +0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe, +0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18, +0xb2,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xb9,0x3c,0xb, 0x7a,0x20, +0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d, +0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25, +0x3c,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, +0xf9,0x2d,0xf1,0x7d,0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77, +0x14,0x78,0xfb,0x4d,0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xd9,0x7e,0x8, +0x1f,0x3c,0x12,0xb9,0xfa,0xd2,0x3, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xb9,0x44, +0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32, +0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, +0x12,0xba,0x42,0x50,0x7, 0x12,0xba,0x39,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7, +0x38,0xee,0x12,0xb9,0xe7,0xe4,0x12,0xb9,0xef,0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a, +0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xb9,0xe7,0x74,0x1, 0x12,0xb9,0xef,0x74, +0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12, +0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x1c,0x74,0x3f, +0x2, 0x20,0xde,0x7e,0x8, 0x1f,0x34,0x12,0xb9,0xfa,0x6c,0x77,0x80,0xe, 0x12,0xba, +0x42,0x50,0x7, 0x12,0xba,0x39,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x6e, +0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9, +0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x44,0xa, +0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57,0x7c,0xab, +0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46, +0x2e,0x44,0x20,0x73,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b,0xbe,0x60, +0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb, +0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b, +0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70, +0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbb,0x9, 0x60,0x5, 0x3e, +0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16, +0x9e,0x60,0xe, 0x12,0xbb,0x9, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbb,0x9, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b, +0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72, +0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12,0x77,0xf6,0xb, 0x24,0xa, 0x33,0xbd,0x32, +0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28, +0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f, +0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d, +0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a, +0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a, +0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a, +0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3, +0xff,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, +0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85, +0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88, +0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53, +0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e, +0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91, +0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12,0x2f,0xd0,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xfb,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x37,0x32,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xbd,0x44, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x38,0xfc,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x37,0x33,0x80,0x1a,0x12,0xbd,0x44,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x38,0xfb,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x34,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f, +0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x80, +0x7e,0x34,0x0, 0x28,0xe4,0x12,0x20,0xde,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, 0xc0, +0x12,0x20,0xde,0x7a,0xb3,0x37,0x34,0x7e,0x34,0x62,0x8e,0x12,0x23,0x9e,0x7a,0x37, +0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a,0xe7, +0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a,0xf7, +0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a,0xf7, +0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe,0x7a, +0xb3,0x37,0x34,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x7e,0x37,0x38,0xe2,0x9e,0x37,0x38,0xde,0x12,0x21,0x0, 0xbd,0x31,0x38,0x12, +0x7e,0x37,0x38,0xe4,0x9e,0x37,0x38,0xe0,0x12,0x21,0x0, 0xbd,0x31,0x38,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd, +0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x38,0xdd,0x60,0x11,0x7e,0xc7, +0x38,0xe6,0x4d,0xcc,0x78,0x2, 0xc1,0xe8,0xbe,0xd0,0x1, 0x28,0x2, 0xc1,0xe8,0xbe, +0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xc1,0xe8,0x7e,0xe7,0x29,0x8, 0x7e, +0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x66,0xe6,0xbe,0xb0,0x1, 0x78,0x2, 0xc1, +0xe8,0x7e,0xa3,0x38,0xdd,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23, +0x14,0x78,0x2, 0xc1,0xe5,0xb, 0xb2,0x68,0x2, 0xc1,0xe8,0xbe,0xd0,0x1, 0x68,0x2, +0xc1,0xf7,0x4c,0xee,0x68,0x2, 0xc1,0xf7,0x74,0x1, 0x7a,0xb3,0x38,0xdd,0x12,0xbf, +0xa, 0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3, +0x38,0xdd,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xdd,0x7e,0x34, +0x62,0x68,0x80,0x48,0x12,0xbf,0x13,0x90,0x62,0x57,0x12,0xbe,0xfe,0x68,0x49,0x80, +0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xbf,0x13,0x7e,0x34,0x62, +0x60,0x12,0x23,0x9e,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d, +0xc3,0xbe,0xc7,0x38,0xe6,0x40,0x21,0x90,0x62,0x56,0x12,0xbe,0xfe,0x68,0x19,0x12, +0xbf,0xa, 0x74,0x3, 0x7a,0xb3,0x38,0xdd,0x7e,0x34,0x62,0x64,0x12,0x23,0x9e,0x7a, +0x37,0x38,0xe6,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xdd,0x6d,0x33,0x7a, +0x37,0x38,0xe6,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93, +0xa, 0x3b,0x12,0xbd,0xc9,0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x38,0xde,0x7a,0xf7, +0x38,0xe0,0x22,0x7a,0xe7,0x38,0xe2,0x7a,0xf7,0x38,0xe4,0x22,0xca,0xf8,0x7f,0x51, +0x7f,0x40,0x7e,0x37,0x2f,0x90,0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c, +0x7e,0x37,0x2f,0x9c,0x7a,0x35,0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff, +0x80,0x1e,0x7e,0x34,0x0, 0x26,0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0x8c,0x74, +0x2, 0xac,0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xbf,0x6b,0xb, 0xf0, +0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e, +0x35,0x2f,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e, +0x35,0x31,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, +0x6a,0x30,0x9e,0x35,0x33,0x6d,0x22,0x7e,0x33,0x38,0x41,0x12,0xbf,0xc0,0x7e,0x15, +0x2f,0x12,0x1f,0x5, 0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e, +0x33,0x38,0x42,0x12,0xbf,0xc0,0x7e,0x15,0x31,0x12,0x1f,0x5, 0x1b,0x7a,0x30,0x22, +0xa, 0x13,0x6d,0x0, 0x2, 0x1e,0xeb,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, +0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22, +0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x7e,0x34,0x60,0xa3,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e,0x37,0x2a,0x53,0x22,0x7e,0xa3,0x2a,0x6e,0x7e, +0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d,0x22, +0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b, +0x14,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e, +0x7b,0x60,0xbc,0x6b,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x2e,0x14,0x1, 0x30,0x6d, +0x0, 0x7e,0x18,0x3, 0x60,0x22,0x2e,0x14,0x0, 0x50,0x6d,0x0, 0x7e,0x18,0x34,0x0, +0x22,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x26,0xfa,0x22,0xe4,0x7a,0xb3,0x36,0x69, +0x7a,0xb3,0x36,0x71,0x22,0x74,0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7a,0x37, +0x2a,0x4f,0x7e,0x34,0x61,0x57,0x22,0x7a,0x37,0x28,0xa1,0x7e,0x34,0x61,0xc2,0x22, +0x90,0x60,0xaa,0xe4,0x93,0xbe,0xb0,0x1, 0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b, +0xf, 0x22,0x74,0x5, 0xac,0xbc,0x9, 0xb5,0x26,0x33,0x22,0x7e,0x8, 0x0, 0x25,0x7e, +0x18,0x0, 0x24,0x22,0x7e,0xe3,0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x6d,0x33,0xe4, +0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x37,0x25,0xf4,0x7a,0x37,0x31,0xcc,0x22,0x7e,0x34, +0xd, 0xc8,0x7a,0x37,0x31,0xce,0x22,0x7e,0x73,0x37,0xbd,0x7a,0x73,0x2b,0x20,0x22, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x22,0x7c,0xbe,0x7c,0x7d,0x2, 0x2c,0x40,0x7e, +0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0,0x1, 0x22,0x12, +0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xb3,0x37,0x31,0xbe,0xb0,0x1, 0x22,0x7e, +0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7,0xe4,0x93,0x7c,0xab,0x22,0xff, +0xc1,0x20,0x3e,0xdf,0x94,0x6b,0x10,0x51, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_tianma.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_tianma.txt new file mode 100644 index 0000000000000..f65bdd64e5341 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_tianma.txt @@ -0,0 +1,3093 @@ +0x2, 0x1f,0xd2,0x2, 0xb5,0xb4,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x42,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x70,0x2d,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x7d,0x45,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x32,0x2, 0x7d,0xa4,0xe4,0x2, 0x29,0xfa,0x22,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xa2,0x13,0x22,0x32,0xff,0x2, 0x0, 0x69,0x2, 0x31, +0xb3,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x38,0xc8, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x38,0xd8,0x7e,0x73,0x38,0xd8,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x7f,0x5, 0x7e,0x1f,0x38,0xc8,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x38,0xc8,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x38,0xcc,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x38,0xd4,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x38,0xd2,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf7,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0xb7,0xc7,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d,0xe2,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xb2,0x61,0x3f,0x7e,0x34,0x1d,0x96,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xc6,0x61,0x3f,0x7e,0x34,0x1e,0xa, 0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d, +0xf1,0x61,0x3f,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x69,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x6a,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xc8,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x38,0xc8,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x20,0xde,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x38,0xc0,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf7,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x38,0xc0,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xb9,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x38,0xc8,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x39,0xd, 0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x86,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x39,0xd, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x39,0xd, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x39,0xd, 0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xf3,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xf3,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xc0,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x38,0xc8,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x38, +0xc8,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x38,0xc8,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x38,0xc8,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x38,0xc8,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x38, +0xc8,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x38,0xc8, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x38,0xc8,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x38,0xc8,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x38,0xc8,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xb9,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xb9,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xf3,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xf3,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x39, +0xd, 0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x38,0xc8, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x38,0xc8,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x39,0xd, 0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x39,0xd, 0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x39,0xd, 0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf7,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xf2,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf7,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf7,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x39, +0xd, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x39,0xd, 0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x39,0xd, 0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x58,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1e,0xeb,0x7d,0x1e,0x12,0x1f,0x5, 0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x38,0xc8,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf7,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xf2,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf7,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x7f,0x5, 0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x38,0xc0,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc8,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x38,0xd8,0x7e,0x1f,0x38,0xc0, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xf3,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x39,0xd, 0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x20,0x8f,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x20,0x90,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e, +0x1f,0x38,0xc0,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x38,0xc0,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x38,0xc8,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x6, 0xe, 0x15,0x1a,0x1f,0x26,0x2b,0x2d,0x2e,0x2f, +0x2c,0x2a,0x24,0x1f,0x1a,0x14,0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10,0x15,0x1c,0x22, +0x28,0x2d,0x34,0x39,0x3d,0x40,0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x11,0x16, +0x1c,0x23,0x2b,0x32,0x37,0x3c,0x40,0x45,0x4a,0x4d,0x4c,0x4b,0x4a,0x48,0x46,0x46, +0x45,0x45,0x44,0x44,0x43,0x44,0x45,0x78,0x65,0x55,0x2, 0xd, 0x14,0x1b,0x21,0x25, +0x2b,0x31,0x37,0x36,0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, +0x10,0x18,0x1e,0x23,0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40, +0x3f,0x3e,0x3d,0x3d,0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29, +0x27,0x1e,0x14,0x11,0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21, +0x2b,0x32,0x30,0x2a,0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, +0x10,0x19,0x23,0x2d,0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71, +0x50,0x55,0x28,0x12,0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39, +0x31,0x28,0x1e,0x15,0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32, +0x37,0x39,0x20,0x29,0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, +0x1, 0x0, 0x1, 0x5, 0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c, +0x34,0x31,0x26,0xcb,0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31, +0x2e,0x2d,0x35,0x3d,0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, +0x10,0x1b,0x24,0x2f,0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d, +0x28,0x31,0x34,0x2a,0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40, +0x47,0x47,0x44,0x3c,0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b, +0x22,0x2d,0x30,0x2e,0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, +0x0, 0x0, 0x3, 0xb, 0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26, +0x1b,0x14,0x1c,0x25,0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c, +0x25,0x30,0x38,0x40,0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c, +0x29,0x1e,0x14,0x13,0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39, +0x30,0x25,0x1b,0x10,0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a, +0x23,0x2f,0x33,0x29,0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, +0x2, 0x0, 0x1, 0x8, 0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e, +0x50,0x55,0x16,0x2b,0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36, +0x3b,0x3d,0x3b,0x37,0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33, +0x3d,0x3f,0x13,0x21,0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37, +0x2d,0x22,0x18,0xc, 0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38, +0x2e,0x2a,0x31,0x62,0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, +0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26, +0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b, +0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48, +0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x9, 0x17,0x1d,0x26,0x2e,0x37, +0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, +0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30,0x2f,0x2c,0x26,0x1e, +0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c,0x32,0x3a,0x41,0x48, +0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c,0x33,0x55,0x26,0x1c, +0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18,0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, +0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44,0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49, +0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f,0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54, +0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c, +0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22,0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c, +0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a,0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32, +0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, +0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22, +0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, 0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39, +0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68,0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70, +0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80,0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10, +0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, +0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39,0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24, +0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50,0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff, +0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a,0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, +0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22, +0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33,0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29, +0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d,0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26, +0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10,0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b, +0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19, +0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22,0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39, +0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34,0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, +0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18,0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37, +0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e, +0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21, +0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c, +0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, +0x0, 0x2, 0x5, 0x9, 0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f, +0x3d,0x38,0x30,0x27,0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36, +0x3f,0x49,0x53,0x5c,0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b, +0x15,0xb, 0x4, 0x0, 0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c, +0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, +0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, +0x8, 0xe, 0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58, +0x51,0x48,0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf, +0x30,0x55,0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28, +0x30,0x38,0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16, +0xf, 0xc, 0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, +0x3, 0xa, 0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a, +0x58,0x57,0xc6,0x55,0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38, +0x3c,0x3e,0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, +0xd, 0x17,0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57, +0x4f,0x47,0x40,0x38,0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, +0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f, +0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22, +0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25, +0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f, +0x3d,0x3a,0x36,0x2e,0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0x9, 0xe, 0x14,0x1c,0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a, +0x10,0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47, +0x4f,0x56,0x5a,0x5b,0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9, +0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e, +0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25, +0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25, +0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d, +0x3a,0x34,0x2d,0x27,0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, +0xa, 0xf, 0x15,0x1b,0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11, +0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36, +0x3c,0x42,0x47,0x48,0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29, +0x22,0x1b,0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c, +0x24,0x2a,0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, +0x4, 0x7, 0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b, +0x38,0x31,0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35, +0x3d,0x45,0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17, +0x11,0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6, +0x30,0x55,0xa, 0x5, 0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3c,0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, +0x1, 0x2, 0x35,0x46,0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37, +0x2e,0x25,0x1e,0x16,0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39, +0x41,0x45,0xf0,0xbc,0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28, +0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, +0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d, +0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19, +0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36, +0x2f,0x27,0x21,0x19,0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, +0x16,0x1f,0x26,0x2d,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d, +0x56,0x59,0x5a,0x58,0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, +0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38, +0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40, +0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3, +0x30,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, +0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f, +0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40, +0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32, +0x39,0x3e,0x7, 0x90,0x30,0x55,0x39,0x2b,0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, +0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b,0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f, +0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24, +0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b,0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65, +0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a,0x46,0x55,0x0, 0x1, 0x3, 0x5, 0x7, 0x8, +0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22,0x24,0x27,0x2a,0x2c, +0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, 0x14,0x1b,0x23,0x28, +0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53,0x4e,0x47,0x40,0x3b, +0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x1f,0x7, 0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x1f,0x7, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0x13,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x4c,0x0, 0xc2,0x14,0x75,0x4d,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x4e,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x21,0x10,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x36,0x72,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xd0,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33,0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0x9b,0x0, 0x0, 0x2, 0x37,0xed,0x0, 0x0, 0x0, 0x2, 0x37, +0xef,0x0, 0x0, 0x0, 0x1, 0x37,0xf1,0x0, 0x0, 0x1, 0x34,0x4f,0x0, 0x0, 0x1, 0x39, +0x11,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x2, 0x34,0x9f,0x0, 0x0, 0x0, 0x1, 0x34, +0xa1,0x0, 0x0, 0x1, 0x34,0xaf,0x0, 0x0, 0x1, 0x34,0xc4,0x0, 0x0, 0x1, 0x34,0xc5, +0x0, 0x0, 0x1, 0x35,0x3e,0x0, 0x0, 0x1, 0x35,0x3f,0x1, 0x0, 0x1, 0x35,0x40,0x0, +0x0, 0x3c,0x35,0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x36,0x61,0x0, 0x0, 0x1, 0x36,0x62,0x0, 0x0, 0x1, 0x36,0x63,0x0, 0x0, +0x1, 0x35,0xe2,0x1, 0x0, 0x2, 0x35,0xe5,0x0, 0x0, 0x0, 0x1, 0x2f,0xa9,0x0, 0x0, +0x1, 0x2f,0xaa,0x0, 0x0, 0x1, 0x2f,0xab,0x0, 0x0, 0x1, 0x2f,0xac,0x0, 0x0, 0x1, +0x36,0x66,0x1, 0x0, 0x1, 0x36,0xe0,0x0, 0x0, 0x1, 0x39,0x12,0x0, 0x0, 0x6, 0x38, +0xfb,0x3f,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x39,0x1, 0x24,0x0, 0x1, 0x39,0x8, +0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x1, 0x39,0xb, 0x0, +0x0, 0x1, 0x39,0xc, 0x0, 0x0, 0x1, 0x0, 0x4f,0x0, 0x0, 0x1, 0x3, 0xec,0x0, 0x0, +0x4, 0x37,0x40,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39,0x3, +0x0, 0x0, 0x2, 0x39,0x4, 0x0, 0x0, 0x0, 0x1, 0x39,0x6, 0x64,0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x39,0x13,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x2, 0x2b,0xb9,0x2b,0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, +0x0, 0x1, 0x38,0xdd,0x0, 0x0, 0x1, 0x38,0x3e,0xff,0x0, 0x1, 0x38,0x3f,0x0, 0x0, +0x1, 0x38,0x40,0x0, 0x0, 0x1, 0x38,0x41,0x40,0x0, 0x1, 0x38,0x42,0x40,0x0, 0x4, +0x38,0xf3,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf7,0x0, 0x0, 0x64,0x0, 0x0, 0x4, +0x38,0xc0,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x38,0xc4,0x0, 0x0, 0x68,0xc0,0x0, 0x4, +0x38,0xc8,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x38,0xd9,0x0, 0x0, 0x40,0x0, 0x0, 0x4, +0x39,0xd, 0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58, +0x0, 0xc, 0x1, 0x5e,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78, +0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, +0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, +0x0, 0x1e,0x12,0x3f,0x13,0x12,0x69,0x8e,0x12,0x23,0xb, 0x12,0x28,0x48,0x12,0x8d, +0xec,0x2, 0x23,0x4, 0x74,0x1, 0x7a,0xb3,0x36,0x6a,0x22,0x12,0x73,0x71,0x12,0x23, +0x40,0x2, 0x23,0x14,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x1d,0x7d,0x43,0x7e, +0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34, +0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22, +0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x23,0x1d,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, +0x7a,0x2, 0x23,0x1d,0x7e,0x34,0x60,0xa3,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x46, +0xa2,0x12,0x73,0x28,0x12,0x3f,0x13,0x12,0x69,0x87,0x12,0xc0,0x25,0x12,0x23,0xb, +0x12,0x28,0x48,0x12,0x68,0x23,0x12,0x8d,0xec,0x2, 0x23,0x4, 0x7e,0x34,0x61,0x4f, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x7a,0x37,0x28, +0x95,0x7e,0x34,0x61,0xba,0x12,0x23,0x9e,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8, +0x12,0x23,0x9e,0x7a,0x37,0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0x9e,0x7a,0x37, +0x28,0x9b,0x7e,0x34,0x61,0xbc,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61, +0xbe,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0x9e,0x12, +0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x20,0xde,0x12,0x25,0xc3,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0x9e, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0x9e,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x3c,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0xb7,0xc7,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x36, +0xe1,0x7e,0x34,0x61,0x51,0x12,0x23,0x9e,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x36,0xe2, +0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe3,0x7e,0x34, +0x61,0x57,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe4,0x7e,0x34,0x61,0x59, +0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe5,0x7e,0x34,0x61,0x5b,0x12,0x23, +0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe6,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x36,0xe7,0x12,0x20,0xb9,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x37,0x12,0xe5,0x28,0x7a,0xb3,0x37,0x1, 0x22,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a,0x4d,0x90,0x60, +0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0xc0, +0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93, +0x7a,0xb3,0x2a,0x59,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x62,0x12,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60, +0xa0,0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3, +0x16,0x92,0x22,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e, +0x12,0xc0,0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x37,0xa0,0xbe,0xf0,0x5, 0x78, +0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78, +0x13,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b,0xe4,0x7a,0xb3,0x2b,0x2, 0x12, +0x7a,0x2d,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x49,0xd, 0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x69,0xab,0x12,0xc1,0x1, +0x80,0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b, +0x12,0x2f,0xf4,0x50,0xfb,0x12,0x88,0x17,0x12,0x69,0x97,0x12,0x28,0x48,0x74,0x2, +0x7a,0xb3,0x37,0xa0,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3, +0xed,0x7a,0x37,0x3, 0xef,0x22,0x7e,0xb3,0x37,0x6, 0x14,0x68,0x60,0x14,0x78,0x2, +0xe1,0x10,0x14,0x68,0x73,0x24,0x3, 0x68,0x2, 0xe1,0x5, 0x12,0xc1,0x32,0x38,0x8, +0x30,0x10,0xf, 0x12,0xc1,0x2a,0x68,0xa, 0x12,0x63,0x2, 0xe4,0x7a,0xb3,0x38,0x85, +0x80,0x7e,0x7e,0xb3,0x36,0xe7,0x30,0xe0,0x77,0x7e,0x73,0x36,0xe8,0xa, 0x27,0x7e, +0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64, +0x12,0x23,0x9e,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x83,0x50,0x53,0x12,0x63,0x2, +0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x38,0x87,0x80,0x43,0x12,0xc1,0x32, +0x28,0x39,0xe4,0x7a,0xb3,0x37,0x6, 0x7e,0xb3,0x38,0x85,0xb4,0x1, 0x6, 0x74,0x1, +0x7a,0xb3,0x37,0x6, 0xd2,0x17,0x80,0x23,0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x45,0x73,0x12,0x23,0x54,0xe4,0x7a,0xb3,0x37,0x6, 0x7a,0xb3,0x39, +0x7, 0xd2,0x17,0x80,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x39,0x7, +0x12,0x90,0xd2,0x2, 0x27,0x16,0xca,0xd8,0xca,0x79,0x7e,0xb3,0x37,0x6, 0xb4,0x1, +0x2, 0x80,0x3, 0x2, 0x28,0x38,0x6c,0xdd,0x6c,0xff,0x12,0x91,0x11,0x7d,0xf3,0x12, +0x2f,0xf4,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x38,0x86,0x12,0x3d,0xac,0x12,0x13,0xc7, +0x12,0x0, 0x1e,0x74,0xa, 0x12,0x45,0x15,0x12,0xc0,0xe7,0x7e,0xe7,0x2b,0xd, 0x7a, +0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3,0x2a,0xfa,0x7e,0xe7,0x2b,0xd, +0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3,0x2a,0xfa,0x12,0x7b,0xd0,0x7c, +0x7b,0x74,0x6, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x1e,0xb9,0x7d,0x23,0x7d,0x3f, +0x12,0x25,0x3c,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12,0x4e,0xe0,0x12,0x26,0x57,0x7e, +0xb3,0x37,0x31,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, 0x74,0xa, 0x12,0x91,0x5d,0x12, +0x4f,0xaf,0x80,0xf, 0x80,0x7, 0x12,0x45,0xcf,0xe4,0x12,0x46,0x7, 0x20,0x93,0xf6, +0x12,0x45,0x9f,0x30,0x18,0xf7,0x30,0x17,0xf4,0xd2,0x4, 0x12,0x45,0x5a,0xe4,0x12, +0x13,0xde,0xb, 0xd0,0x12,0x4c,0x83,0x12,0x91,0x76,0x7e,0xa3,0x38,0x85,0x4c,0xaa, +0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x86,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x31, +0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x85,0x12,0x28,0x3d,0x78,0x18,0x7e,0xb3,0x38,0x85, +0x60,0x12,0xe4,0x7a,0xb3,0x38,0x85,0x7a,0xb3,0x2a,0x2, 0x7a,0xb3,0x2a,0x3, 0x7e, +0xf0,0x1, 0x80,0x1d,0x12,0x28,0x3d,0x68,0x10,0x7e,0xb3,0x38,0x85,0x70,0xa, 0x7e, +0xf0,0x1, 0xe4,0x7a,0xb3,0x37,0x6, 0x80,0x8, 0xbe,0xd0,0x32,0x50,0x3, 0x2, 0x27, +0x8c,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a,0x37,0x2b,0xd, 0x7a,0xe3,0x2a, +0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x48,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x38, +0xf2,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34, +0x39,0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34, +0x3a,0x22,0xca,0x3b,0x12,0x2f,0xf4,0x50,0xfb,0x7e,0xf3,0x2b,0xf, 0x7c,0xbf,0x12, +0xb3,0xfc,0x12,0xb4,0x13,0x7e,0xb3,0x2b,0x1f,0xf5,0x28,0x7e,0xb3,0x2b,0x20,0xf5, +0x29,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0xf, 0x12,0x8d,0x6c,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x28,0x48,0xc3,0x21,0x6c,0x12,0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x7, 0x12,0xac,0x20,0x7a,0x37,0x37,0xe3,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x69,0x8e,0x12,0xac,0xe, 0x7e,0xc3,0x3, 0xec,0x12,0x6e,0x31, +0xe4,0x12,0x13,0xde,0x12,0x28,0x48,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x2a,0x7e,0x18, +0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x7a,0xc8,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x2a, +0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x7a,0xc8,0x7e,0xd3,0x2b,0x1f,0x7e, +0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5,0x29,0x12,0x6e,0x8b,0x50,0x5, +0x7c,0xbc,0x12,0xb3,0x54,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d, +0x10,0x12,0x6a,0xd4,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3,0x2b,0x20,0x7c,0xbf,0x12,0x86, +0xf8,0x12,0xaa,0x18,0x7e,0xb3,0x39,0x7, 0x4, 0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39, +0x7, 0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x7, 0x7e,0xb3,0x16,0x90, +0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e, +0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, 0x37,0x2d,0x32,0x22,0x12,0x48, +0x7, 0x7e,0xb3,0x37,0x8, 0xb4,0x3, 0x6c,0x12,0xb6,0xe2,0x12,0x26,0x57,0x12,0x3f, +0xfb,0x7e,0xb3,0x37,0x9c,0x30,0xe7,0xe9,0x12,0x28,0x62,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18,0x12,0xab,0xdb,0x12,0x75,0xe9, +0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x88,0x5f,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x58,0x52,0x12,0x48,0x39,0x12,0x3a,0x9f,0x7e,0xb3,0x37,0x9c,0x54,0x7f,0x7a,0xb3, +0x37,0x9c,0x80,0x8d,0x12,0x2f,0xee,0x2, 0x0, 0x46,0x7a,0xb3,0x2b,0x2, 0x7a,0xb3, +0x2b,0x1e,0x22,0x12,0x52,0x6d,0x12,0x2b,0xfa,0x12,0x2b,0xfa,0x12,0x36,0xac,0x12, +0x9c,0xfd,0x12,0x9f,0xef,0x12,0x2b,0xfa,0x12,0x9b,0xe7,0x12,0x2b,0xfa,0x12,0xa0, +0xae,0x12,0x2b,0xfa,0x2, 0x2a,0x27,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c,0xdd, +0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x25,0x7e,0x8, 0x35,0xe9,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18,0x26, +0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0x41,0xfb, +0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9,0x9, +0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x36,0x74, +0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36, +0x26,0xa, 0x37,0x12,0x81,0xbf,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x25,0x12,0xa1,0x4b,0x2d,0x13,0xbd,0xc1,0x28, +0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68,0x39, +0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x2c,0x40, +0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34,0x74, +0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71,0x74, +0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe8,0xbc, +0x7e,0x28,0x2, 0x41,0x60,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x33,0x12,0x2f,0xe4,0xbe,0xb0,0xff,0x68, +0x2b,0x9, 0x73,0x1f,0x35,0x12,0x30,0x3, 0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54,0x0, +0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, 0x12, +0x2f,0xe4,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc,0xf9, +0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19,0x75, +0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19,0xa3, +0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe,0x38,0x8a,0x90, +0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e, +0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xfd,0x12,0x97,0x4, 0x7e,0x8, 0x36, +0x25,0x74,0xff,0x12,0x20,0xde,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b, +0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xf5, +0x7a,0xf3,0x35,0xe8,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb3,0x28, +0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee, +0x80,0x2e,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x25,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac, +0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa, +0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbf,0x12,0x2f,0xd0,0xb, 0xf0,0xb, 0xe0, +0x12,0x9c,0xf6,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c,0xba,0x7c,0x7d, +0x12,0x30,0x3, 0xb, 0x1a,0x30,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3, +0x2a,0x6f,0xf5,0x40,0x7e,0xb3,0x2a,0x70,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a, +0xb3,0x33,0xc2,0x7a,0xb3,0x33,0xc0,0x7a,0xb3,0x33,0xc1,0x7e,0x8, 0x1f,0x34,0x12, +0x2f,0xdd,0xe4,0x12,0x20,0xde,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x33,0xc3,0xe4, +0x12,0x20,0xde,0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa2,0x6c,0xcc,0xe1,0x91,0x12,0xc0, +0x8b,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, +0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34,0x7c, +0xbd,0x14,0xbc,0xbc,0x78,0x2, 0xe1,0x97,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x88, +0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, 0xb3, +0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x28,0xe5, +0x27,0xa, 0x2b,0xe5,0x25,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0, +0x4, 0x40,0x2, 0xe1,0x86,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x86,0x85,0x25, +0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb0,0x69,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x40,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83,0x80, +0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2b, +0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x40,0x2d,0x34, +0xbd,0x38,0x18,0x2, 0xe1,0x1d,0x75,0x30,0x1, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x1, +0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x4, +0x40,0x2, 0xe1,0x1d,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x1d,0x7c,0xbf,0x20, +0xe0,0x2, 0xe1,0x1d,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26,0xbe, +0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1, +0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25, +0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50, +0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29, +0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x5, +0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24,0xe5, +0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29, +0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x5, +0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24,0xe5, +0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85,0x2b, +0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x2c,0x40,0x7a,0x35,0x3e,0xe5,0x2a, +0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe,0xb1, +0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93,0x5, +0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0,0x5, +0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c,0x50, +0xad,0xe5,0x2c,0x12,0x2f,0xae,0xe5,0x2a,0x12,0x2f,0xa5,0xe5,0x2a,0x12,0x2f,0xae, +0xe5,0x2c,0x12,0x2f,0xa5,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20,0x5, +0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x42, +0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0xe5,0x42,0xa, 0x1b, +0x6d,0x0, 0x12,0x1e,0xeb,0x7f,0x21,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, +0x28,0x12,0x1e,0xfc,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23, +0x3e,0x24,0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe, +0xb0,0x0, 0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x33,0xbf,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f, +0x34,0xf5,0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x1f,0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0xc0,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x8e,0x7e,0x8, 0x1f,0x34,0x12,0xaf,0x94,0x7a,0xb3, +0x33,0xc2,0xda,0x3b,0x22,0x7e,0x71,0x2d,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7e,0x71, +0x2b,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7c,0x7b,0x12,0x77,0xf6,0x9, 0xa2,0x27,0x72, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x91,0x6d,0x5c,0xba,0x22, +0x7e,0x70,0x1, 0x2, 0x51,0x5f,0xa, 0x3b,0x9d,0x32,0x2, 0x21,0x0, 0x90,0x60,0x9a, +0x93,0xa, 0x3b,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x12,0x2f, +0xf4,0x50,0xfb,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x7c,0x5b,0x7e,0x43,0x28, +0x84,0xbe,0x40,0x1, 0x28,0x2, 0x21,0x14,0x7e,0xa3,0x2a,0x6e,0x7e,0x70,0x2, 0xac, +0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x30,0x3, +0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc,0x7c,0x9d,0x7e,0x83,0x2a, +0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc,0xa, 0xa8,0x1b,0xa5,0xa, +0x5f,0xbd,0x5a,0x58,0x2, 0x21,0x14,0xa, 0x59,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48, +0x4e,0x7c,0xb9,0x14,0x12,0x31,0x5a,0x50,0x46,0x7c,0xb9,0x14,0x12,0x31,0x17,0xb, +0x1a,0xe0,0x7d,0x3b,0x12,0x31,0x4c,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf, +0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12, +0x31,0x1e,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x31,0x20,0x1b,0x1a,0xa0,0xa, +0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9,0x4, 0x12,0x31,0x5a,0x50, +0x43,0x7c,0xb9,0x4, 0x12,0x31,0x17,0xb, 0x1a,0xe0,0x7d,0x3c,0x12,0x31,0x4c,0x8, +0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12, +0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x31,0x1e,0xb, 0x1a,0x50,0xbd,0x5a,0x8, +0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x31,0x27,0x7d,0xd3,0x7d,0x5d,0x3e,0x54, +0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43,0x2a,0x6e,0x90,0x60,0xab, +0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7c,0x75,0xac,0x74,0xa, +0x2a,0x2d,0x32,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40, +0x2d,0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xab,0x6c,0x77,0x80,0x12, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x51,0x4f,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22, +0xb, 0x70,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe5,0xc3,0x22,0x12,0x36,0x9c, +0x60,0x30,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1b,0x7c,0xb2,0x12, +0x31,0x27,0x7d,0x3, 0x12,0x36,0x94,0x49,0x55,0x38,0xe8,0x7d,0x40,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd4,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc0,0xde,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0x41,0xdd,0x6c,0xcc,0x41,0xcf,0x12,0xc0,0x8b,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xb, 0x7e,0xb3,0x36,0x71,0x70, +0x5, 0x12,0x32,0xe0,0x80,0x6, 0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x30, +0x19,0xd2,0x3, 0x12,0x32,0xe7,0x7e,0xb3,0x36,0xec,0xb4,0x1, 0x1b,0x7e,0xb3,0x2a, +0x3, 0xb4,0x1, 0x14,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xd, 0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x3, 0x12,0x32,0xe0,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x27,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, +0x2d,0x1b,0x24,0xe5,0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24, +0x0, 0x80,0x3c,0xe5,0x24,0xbc,0xbc,0x68,0x34,0x12,0x35,0xda,0x9, 0xa3,0x26,0xfa, +0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5,0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x2f,0xd6, +0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a,0xa, 0x2b,0xe5,0x28,0x12,0x2f,0xd6,0xbe, +0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12, +0x36,0xa4,0x38,0xbf,0xe5,0x27,0x7e,0x71,0x28,0x12,0xa0,0x94,0x50,0x8, 0x12,0x31, +0x7d,0x12,0x35,0xd3,0x80,0x8, 0x12,0x69,0x84,0x50,0x3, 0x12,0x32,0xe0,0xe5,0x25, +0x7e,0x71,0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x33,0x21,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x16,0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e, +0x34,0x27,0x78,0x6d,0x22,0x12,0x7f,0xc5,0x12,0x31,0x7d,0xb, 0xf0,0xb, 0xc0,0x7e, +0x73,0x28,0x84,0xbc,0x7c,0x28,0x2, 0x21,0xc9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22, +0x75,0x25,0x3, 0x75,0x26,0x3, 0x22,0x12,0x36,0x9c,0x60,0x34,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1f,0x7c,0xb2,0x12,0x31,0x27,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x36,0x94,0x59,0x35,0x38,0xe8,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72,0x38,0xd0, +0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x35, +0x80,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x35,0x80,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x30,0x3, 0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x90,0x50,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0xc7,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0xb1,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0xaf,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0xaf,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x40,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0xaf,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x35,0x65,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x35,0x65,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0xb8,0xa8,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x35,0x56,0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x35,0x56,0x9f,0x51,0x12,0x35,0x5d,0x9f,0x41,0x12,0x35,0x5d,0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0xeb,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xdf,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x35,0x71,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x35,0x71,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1e,0xeb,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x0, 0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x7, 0x2e,0x18,0x0, 0x20,0x22, +0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34, +0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39, +0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39, +0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d, +0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba, +0xda,0xf8,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x74,0xf5,0x27,0x12,0x0, 0x66,0x50,0x2, 0xc1, +0x6f,0x6d,0x33,0x9e,0x37,0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x70,0x7e, +0xb3,0x16,0x92,0x70,0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x60,0x7e,0x77,0x2a,0x51, +0x7e,0x67,0x2a,0x53,0x75,0x24,0x0, 0x80,0x4e,0xe5,0x24,0x12,0x2f,0xb7,0x60,0x45, +0x12,0x35,0xda,0x12,0x9d,0x80,0xf5,0x26,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90, +0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26,0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26, +0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0xd, 0xe5,0x25,0xa, 0x2b,0xe5, +0x27,0x12,0x9b,0x18,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x51,0x5f,0x12, +0x35,0xda,0x12,0x37,0x9f,0x5, 0x24,0x12,0x36,0xa4,0x38,0xad,0x12,0xa6,0x5, 0xda, +0x3b,0x22,0x12,0x46,0xa2,0x12,0x24,0x9a,0x12,0x73,0x28,0x12,0x22,0xf2,0x7e,0xb3, +0x37,0x8, 0x24,0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x58,0xf0,0x80,0xef,0x12, +0x29,0x7e,0x80,0xea,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x90,0x60, +0xa7,0xe4,0x93,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x12,0xa5,0xee,0x12, +0x9b,0x49,0x12,0x35,0xe2,0x12,0x9a,0x38,0x2, 0x36,0xbb,0xca,0x3b,0x12,0x2b,0xfa, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x9, 0xe4,0x7a,0xb3,0x35, +0xe4,0x7a,0xb3,0x35,0x69,0x7e,0xb3,0x35,0xe2,0x70,0x69,0x6c,0x99,0x80,0x5d,0x74, +0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x9a,0xed, +0x40,0x48,0x6c,0xee,0x80,0x3c,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x6a,0x9, 0xc5, +0x35,0x6b,0xa, 0x28,0xa, 0x3d,0x12,0x37,0x67,0x78,0x25,0xa, 0x2f,0xa, 0x3c,0x12, +0x37,0x67,0x78,0x1c,0x7c,0xb9,0x12,0x37,0x6f,0x7e,0x14,0x62,0x2b,0x12,0x87,0xee, +0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x51,0x5f,0x7c,0xb8,0x7c,0x7f,0x12,0x37,0xa7, +0xb, 0xe0,0x7e,0x73,0x35,0xe4,0xbc,0x7e,0x38,0xbc,0xb, 0x90,0x7e,0x73,0x28,0x84, +0xbc,0x79,0x38,0x9b,0x7e,0x73,0x35,0x69,0x7a,0x73,0x35,0xe4,0xa, 0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x35,0xa6,0x7e,0x8, 0x35,0x6a,0x12,0x20,0xb9,0x1b,0xfd,0xe4, +0x7a,0xb3,0x35,0xe2,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x0, 0x4d,0x33,0x22,0x7c, +0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x2, 0x2c, +0x40,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0x99,0x6c,0x7f,0x71,0x7c,0xbf,0x12, +0x37,0x6f,0x12,0xa4,0xcf,0x7f,0x17,0x12,0x1f,0x58,0x7c,0xb7,0xda,0xf8,0x22,0x9, +0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c,0x6b,0x7e,0xa3,0x35,0x69,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x62,0x35,0xa6,0x19,0x72,0x35,0xa7,0x7c,0xba,0x4, 0x7a,0xb3,0x35, +0x69,0x22,0xca,0xf8,0x6c,0xff,0x80,0x18,0x7c,0xbf,0x12,0x37,0x6f,0xbe,0x37,0x2a, +0x5c,0x58,0xb, 0x12,0x51,0x5b,0x7e,0x70,0x2, 0xac,0x7f,0x12,0x37,0x9f,0xb, 0xf0, +0x12,0x52,0x66,0x38,0xe3,0x12,0x2b,0xfa,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe, +0xa0,0x34,0x38,0x3, 0x2, 0x38,0xfd,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x10, +0x41,0x1c,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d, +0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x31,0xce,0x7e,0x39,0xb0,0xbe,0xa0,0x37, +0x68,0x2, 0x41,0x1c,0x75,0x1a,0x36,0x41,0x1c,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0, +0x39,0x78,0x1b,0x7e,0xf3,0x37,0xc0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc0,0xbe,0xa0, +0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x1c,0xbe,0xa0, +0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xc2,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc2,0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b, +0x44,0x41,0x1c,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x1c,0xbe,0xa0, +0x5e,0x78,0x26,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, +0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x1c,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0, +0x3d,0x78,0x1b,0x7e,0xf3,0x37,0xc4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc4,0xbe,0xa0, +0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x1c,0xbe,0xa0, +0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xc6,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc6,0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a, +0x9d,0x41,0x1c,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x37,0x9c,0x41,0x1c,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e, +0xf3,0x37,0xe1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xe1,0xbe,0xa0,0x4f,0x78,0x3, 0x75, +0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x31,0xcc,0x7e,0x39,0xb0,0x41,0x1c,0xbe,0xa0,0x51, +0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, +0xff,0x7e,0xb3,0x37,0xec,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a, +0xb3,0x37,0xec,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0x1c,0xbe, +0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xb5,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xb5,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x3a, +0x1f,0x41,0x1c,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0x91,0x41,0x1c,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e,0xbe,0xa0, +0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0xa, 0x9, 0xb3,0x31,0xd4,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1a,0xf4,0x80,0x5c, +0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5, +0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10, +0x3e,0x14,0x7e,0x1f,0x31,0xd0,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, +0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80, +0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c, +0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, +0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e, +0x3, 0x2a,0x6d,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x60,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, +0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, +0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x62,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca, +0xf8,0x80,0x38,0x7c,0xbf,0x12,0x3a,0x1f,0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70, +0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x12,0x3a,0xde,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x3a,0xde,0x7e,0x73,0x2a, +0x6e,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3, +0x2a,0x6d,0x74,0x2, 0xa4,0x22,0x12,0x3f,0xaa,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x37,0xdc,0x7e,0x8, 0x25,0xee,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x3f,0x49,0x80,0x12, +0xca,0x39,0x7e,0x18,0x37,0xdc,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x3f,0x67,0x2, 0x3b,0x15,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0xca,0xf8, +0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x7d,0xab,0xd2,0x6, 0xa1,0xa0,0xa5, +0xbe,0x1, 0x3d,0x7a,0x73,0x37,0x9d,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5,0xbf,0xae, +0x4, 0xd2,0x7, 0xa1,0xa0,0xa5,0xbf,0xaa,0x5, 0x12,0xc0,0xf8,0x80,0x1e,0xa5,0xbf, +0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xce,0x80,0x10,0xa5,0xbf,0xac,0x2, +0x80,0x2, 0xa1,0xa0,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xce,0x6d,0x33,0x81,0x1c, +0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x3d,0xa3,0xa5,0xbe,0x7, +0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xa0,0xa5,0xbe,0x8, 0x2, 0x80,0x2, 0xa1,0xa0, +0x12,0x7, 0xfb,0xa1,0xa0,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73,0x37,0xa6, +0xa1,0xa0,0xa5,0xbe,0xb, 0x8, 0x12,0x3d,0xa3,0x12,0x3f,0xc8,0xa1,0xa0,0xbe,0x60, +0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x38,0xbe,0x60,0x1e,0x40,0xd, 0xbe, +0x60,0x23,0x38,0x8, 0x12,0x3d,0xa5,0x43,0xc, 0x40,0xa1,0xa0,0xbe,0x60,0x15,0x40, +0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x3d,0xa5,0xd2,0x6, 0xa5,0xbe,0x15,0x2, 0x80, +0x2, 0xa1,0xa0,0x74,0x7, 0x7a,0xb3,0x37,0xa0,0xa1,0xa0,0xa5,0xbe,0x19,0x7, 0xe4, +0x7a,0xb3,0x37,0xb5,0xa1,0xa0,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c,0x38,0x2, +0xa1,0x38,0xa5,0xbe,0x2d,0x1b,0x12,0x3d,0xa5,0x20,0x7, 0x2, 0xa1,0xa0,0x7e,0x63, +0x37,0xc8,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35,0x8, 0xa1, +0xa0,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, 0xa1,0x38, +0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1,0x38,0x7e,0x70, +0x64,0xa1,0x38,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, 0x1, 0x7e, +0xf3,0x37,0xc1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc1,0xa, 0x2f,0x19,0x72,0x2b,0x21, +0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x38,0xa1,0xa0,0xbe,0x60,0x3a, +0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xc3,0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, 0x80,0x2, +0xa1,0xa0,0x75,0x1a,0x3a,0xa1,0xa0,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, 0x7a,0x73, +0x2b,0x12,0xa1,0xa0,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xec,0xa1,0xa0,0xbe,0x60, +0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc5,0x7c,0xbf, +0x4, 0x7a,0xb3,0x37,0xc5,0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d,0x2, 0x80, +0x2, 0xa1,0xa0,0x75,0x1a,0x3c,0xa1,0xa0,0xbe,0x60,0x3e,0x68,0x4, 0xa5,0xbe,0x3f, +0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc7,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc7,0xa, +0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x3e, +0xa1,0xa0,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x3d,0xa5,0x75, +0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x3d,0xa5,0x75,0xd, 0x2, 0x12,0x3a, +0xe6,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x3d,0xa5,0x12,0x3f,0x70,0x80,0x71,0xbe, +0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x3d,0xa5,0x80,0x63,0xbe,0x60,0x4e, +0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xe2,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xe2,0xa, 0x2f,0x2e,0x27,0x31,0xcc,0x7a,0x29,0x70,0xa5,0xbe,0x4f, +0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80,0x31,0xbe, +0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20,0x7c,0xb7, +0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, 0x7e,0x1f, +0x31,0xd0,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a,0x71,0xf, +0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0x9c,0x22,0x7a,0xb3,0x2b,0x0, +0x70,0x14,0x12,0x3f,0x67,0x12,0x3b,0x15,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4, +0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x3f,0x49,0x12,0x3b,0x15,0x12, +0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12,0x0, 0x1e, +0xe4,0x12,0x3d,0xac,0x12,0x3d,0xf3,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12,0x3d,0xac, +0x2, 0x3d,0xf3,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e,0x8, 0x1f, +0x44,0x12,0x3f,0xe9,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x20,0xde,0x7e, +0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x1f,0xda,0x7e, +0x34,0x0, 0xa, 0x12,0x20,0xde,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc,0x7a,0x1d, +0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, 0x2a,0xb9, +0x12,0xba,0x6c,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, 0x3a,0x2e, +0x34,0x20,0x73,0x12,0x91,0x6d,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12, +0x3f,0xb, 0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a, +0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9, +0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x3f,0xb, 0xa, 0x4a, +0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde, +0x38,0xd8,0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0, +0x12,0xb9,0x2, 0x80,0x3, 0x12,0x3f,0xd9,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f, +0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e, +0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34, +0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e, +0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x12,0xaf,0x1f,0x12,0x13,0xf5,0x12, +0xb9,0x8e,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x3f,0xcb,0x74,0x1, 0x12, +0x3d,0xac,0x12,0x3f,0xd2,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x3d,0xdb,0x7e, +0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25, +0xee,0x22,0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x3f,0x67,0x80,0x6, 0xb4,0x1, 0x6, +0x12,0x3f,0x49,0x12,0x3b,0x15,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22, +0x12,0x3f,0xaa,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x37,0xdc, +0x12,0x20,0xb9,0x1b,0xfd,0x12,0xc0,0xef,0x12,0x3f,0x49,0x80,0x1a,0xca,0x39,0x7e, +0x18,0x2b,0x70,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x37,0x2b,0x76, +0x7a,0x37,0x31,0xcc,0x12,0x3f,0x67,0x2, 0x3b,0x15,0x7e,0xb3,0x37,0xe0,0x7e,0x34, +0x0, 0x4, 0x22,0x7c,0x6b,0x12,0x3f,0xe1,0x78,0x5, 0x7c,0xb6,0x2, 0x7d,0xd6,0xb4, +0x4, 0x5, 0x7c,0xb6,0x2, 0x3b,0x1e,0x22,0xb2,0x82,0x22,0x7d,0x32,0x74,0xfa,0x2, +0x12,0xd0,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x20, +0xde,0x7e,0xb3,0x37,0x9c,0xc4,0x54,0x7, 0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, +0x20,0xde,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x30,0x6, 0x3b,0xc2,0x6, +0x12,0x25,0xe6,0x7e,0x73,0x37,0xa1,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x37,0xa2,0x7a, +0x73,0x2b,0x1d,0x7e,0x73,0x37,0xa2,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x37,0xa3,0x60, +0x18,0x7e,0x34,0x0, 0x2, 0x12,0x41,0x5d,0x7e,0x34,0x0, 0x1, 0x12,0x41,0x5d,0x6d, +0x33,0x12,0x41,0x5d,0xe4,0x7a,0xb3,0x37,0xa3,0x12,0x4f,0xfa,0x2, 0x40,0x3f,0xe5, +0xc, 0x70,0x2, 0x21,0x5c,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x72,0x92, +0x12,0x79,0x31,0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53, +0xc, 0xfd,0x12,0xba,0x23,0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b, +0x12,0x60,0x9, 0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65, +0x7e,0x73,0x2b,0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x4, +0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3, +0x45,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xce,0x7a,0x73,0x2b,0xf, 0x12,0x87,0x52,0x7a, +0xb3,0x0, 0x4f,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x4f,0x7a, +0x73,0x37,0xa6,0x12,0x6e,0x29,0x12,0xc0,0x42,0x7e,0x73,0x37,0xcf,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4, +0x12,0xa, 0x66,0x12,0x8d,0xec,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43, +0x37,0xd0,0x7e,0x50,0xa, 0xac,0x45,0x12,0x3f,0xcb,0xe5,0xc, 0x30,0xe6,0x4e,0x53, +0xc, 0xbf,0x7e,0x73,0x37,0xbc,0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37, +0xbc,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x43,0xeb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63, +0x37,0xbc,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12,0x47,0x81,0x7c,0x65,0x4c,0x76,0x74, +0xe, 0x12,0x43,0x5f,0x12,0x43,0xeb,0x12,0x43,0xf3,0x7e,0x73,0x37,0xbf,0x7a,0x73, +0x2b,0x14,0x7e,0x73,0x37,0xbe,0x7a,0x73,0x2b,0x1f,0x12,0xc1,0x1, 0xe5,0xc, 0x30, +0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xa6,0x2, 0x48,0x77,0x22,0xca,0xd8,0xca, +0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c, +0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x57, +0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x43,0xeb,0x7c,0x8b,0x74,0x7, 0x7e, +0x70,0xf, 0x12,0x43,0xf0,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, +0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, +0xc, 0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e, +0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x38,0xc4,0x12,0x43, +0x48,0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x38,0xc4,0x78,0x7, 0x12,0x43, +0x48,0x54,0xfb,0x80,0x5, 0x12,0x43,0x48,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x38, +0xc0,0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e, +0xa0,0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0x12,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff, +0xe, 0x12,0x43,0x53,0x54,0xe6,0x12,0x43,0x50,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12, +0x43,0x53,0x5e,0x54,0xfe,0xe6,0x12,0x43,0x50,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4, +0x0, 0x2, 0x78,0x2d,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e,0x54,0x0, 0xf, 0x1b, +0x1a,0x50,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34, +0x0, 0x2, 0x12,0x44,0x72,0x12,0x44,0x4b,0x12,0x44,0x28,0x7a,0x37,0x31,0xd4,0x61, +0x4, 0x6c,0xdd,0x41,0xfe,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40, +0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, +0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c, +0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e, +0x54,0x0, 0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4, +0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, +0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, +0x3b,0x12,0x44,0x72,0x12,0x44,0x4b,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x44,0x4b, +0x12,0x44,0x28,0x74,0x2, 0xac,0xbd,0x59,0x35,0x31,0xd6,0x80,0xf, 0x12,0x44,0x28, +0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x31,0xd6,0xb, 0xd0,0xbc,0xed, +0x28,0x2, 0x41,0x65,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x43,0xf0,0xa9,0xc0, +0xc4,0x7e,0x1f,0x38,0xc0,0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x38,0xc0,0x79,0xf1,0x0, +0x90,0x6d,0x33,0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0x8, 0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x10,0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22, +0x1b,0x1a,0x50,0x7e,0x1f,0x38,0xc0,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5, +0xfd,0x7a,0x71,0xfe,0x22,0xca,0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12, +0x43,0x5f,0x74,0xf, 0x12,0x43,0xeb,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe, +0x12,0x43,0x5f,0x74,0xc, 0x12,0x43,0xeb,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, +0x7e,0x70,0xf8,0x12,0x43,0x5f,0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, +0x38,0xb, 0x12,0x45,0x6, 0x7c,0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17, +0xe4,0x93,0xb4,0x1, 0xe, 0xbe,0xa0,0x7, 0x28,0x9, 0x12,0x45,0x6, 0xa, 0x77,0x2e, +0x74,0x0, 0x7, 0x74,0xe, 0x7c,0x7f,0x12,0x43,0x5f,0x74,0x7, 0x12,0x43,0xeb,0x7c, +0xfb,0x5e,0xf0,0xfb,0x90,0x60,0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c, +0xf7,0x74,0x7, 0x7c,0x7f,0x12,0x43,0xf0,0xda,0x79,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x12,0x43,0x5f,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24, +0x7e,0x24,0x0, 0x12,0x12,0xb7,0xc7,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74, +0x3, 0x7e,0x71,0x27,0x12,0x43,0x5f,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x43,0x5f,0x74, +0xc, 0x7e,0x71,0x30,0x12,0x43,0xf0,0x22,0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0xa, +0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e, +0xf, 0x38,0xc4,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0x12,0x5e, +0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34, +0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x45,0x15, +0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6, +0x22,0x12,0x47,0xf8,0xc2,0x3, 0x12,0xb6,0x57,0xc2,0x5, 0x12,0x45,0x51,0xc2,0x3, +0x12,0x47,0x21,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0xeb,0x7a,0x1b,0xb0,0x74,0xf, +0x6c,0x77,0x12,0x43,0x5f,0xe5,0xfc,0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x43,0xf3, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x2a,0x12,0x44,0x6e,0x12,0xb6, +0xf, 0x2, 0xb6,0xc4,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x1a,0x12,0x44,0x6e,0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0xc, 0x12,0x44,0x6e,0x2, 0xb6,0xbe,0x74, +0x1, 0x7a,0xb3,0x33,0xff,0x22,0xa, 0x3a,0x2e,0x34,0x0, 0x3, 0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0x5f,0x7a,0x61,0xfc,0x12,0x43,0xf3, +0x12,0x46,0x68,0xd2,0x3, 0x12,0x47,0x21,0x12,0x45,0x6b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x45,0x6b, +0x2, 0x13,0x96,0x12,0x47,0xf8,0xc2,0x5, 0x2, 0x45,0x51,0xd2,0x5, 0x12,0x45,0x51, +0x74,0x1, 0x22,0x12,0x45,0xcf,0x12,0x91,0x8, 0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0xc0,0xd5,0x12,0x44,0x91,0x74,0x1, 0x12,0x46,0x7, 0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x45,0x30,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x45,0x5a,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x45,0xcf,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x46, +0x7, 0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x45,0x5a,0x74, +0x81,0x7a,0xb3,0x39,0x2, 0x22,0x80,0x1d,0x12,0x45,0xcf,0x12,0x47,0xff,0x68,0x5, +0xc2,0x4, 0x12,0x45,0x5a,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x17, +0x15,0xe4,0x12,0x46,0x7, 0x20,0x93,0xe0,0x12,0x45,0xcf,0xa9,0xd1,0xcd,0xa9,0xc5, +0xea,0x74,0x2, 0x2, 0x46,0x7, 0x22,0x7c,0xab,0x7e,0xb3,0x39,0x2, 0xb4,0x81,0x38, +0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf, +0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, +0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87, +0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0x2, 0x22,0xd2,0x3, +0x80,0x12,0x30,0x3, 0xc, 0x12,0x47,0xff,0x68,0x7, 0xc2,0x3, 0xc2,0x4, 0x12,0x45, +0x5a,0x12,0x45,0xd6,0x30,0x17,0xeb,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb, +0xd2,0x3, 0x12,0xb6,0x57,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, +0xa9,0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74, +0x41,0x12,0x45,0x15,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda, +0xf8,0x22,0xe4,0x12,0x46,0xf0,0x12,0xb6,0x60,0x12,0x26,0x57,0x12,0xb6,0xdb,0x12, +0x43,0x65,0x12,0xb6,0x5, 0x12,0xb6,0x77,0x12,0x0, 0x4a,0x12,0xb6,0x83,0x12,0x7e, +0xa0,0x12,0xb6,0x93,0xd2,0xaf,0x12,0x47,0x8a,0x12,0xb8,0x1e,0x12,0x43,0xfa,0x12, +0x46,0x68,0x7e,0x8, 0x3, 0xf1,0x12,0xa9,0xa3,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34, +0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0xa9,0xd0, +0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x45,0x51,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75, +0xc2,0xc, 0xd2,0x3, 0x12,0x47,0x21,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1, +0x22,0xa2,0x3, 0xa9,0x97,0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x7e,0x34,0x36,0xe1, +0x30,0xd, 0x4b,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x4f, +0x9, 0x53,0x0, 0x3, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12, +0x47,0x7f,0x7a,0x27,0x2a,0x53,0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a, +0x27,0x2a,0x5a,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a, +0x5c,0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0x45,0xc, 0x7a,0x37,0x2a,0x62,0x22,0xa, +0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12, +0x43,0xeb,0x7c,0x7b,0x12,0x43,0xf3,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e, +0x24,0x0, 0xef,0x7e,0xf, 0x38,0xc0,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e, +0xf, 0x38,0xc0,0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x38,0xc0,0x79, +0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x38,0xc0,0x79, +0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8a,0x7e, +0x34,0x6a,0xd1,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e, +0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8e,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x12,0xc0,0xf8,0x12,0xc0,0xef,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x48,0x56,0x12,0x48,0x30,0x74,0x50,0x7a,0xb3,0x37,0xd0,0x7e,0x24, +0x3, 0x20,0x12,0x3f,0xcb,0xe4,0x12,0xc0,0x27,0x6d,0x33,0x7a,0x37,0x39,0x4, 0x22, +0x7e,0x73,0x2b,0x62,0x7a,0x73,0x37,0xcf,0x22,0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37, +0xca,0x7e,0x73,0x37,0xce,0xbe,0x73,0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12, +0x48,0x56,0x12,0x48,0x30,0x22,0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x7e,0x73, +0x2b,0x1f,0x7a,0x73,0x37,0xbe,0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x7e,0x73, +0x2b,0x14,0x7a,0x73,0x37,0xbf,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, +0x12,0x48,0xe8,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80, +0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x48,0xe8,0x40, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c, +0xdd,0x7c,0xbd,0x12,0x8d,0xb3,0x12,0x48,0x6e,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x37, +0xbe,0x12,0x49,0x4, 0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x12,0x48,0x30,0x7a, +0xd3,0x37,0xa6,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26, +0x33,0xbc,0xbe,0x22,0x30,0x3, 0x3, 0x12,0x48,0x6e,0xa2,0x4, 0x92,0x5, 0x12,0x49, +0xc3,0x2, 0x49,0x4, 0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x22,0x74,0x40,0x12, +0x6e,0x8b,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x48,0xf4,0x80,0x1c,0x74,0x1, 0x12, +0x49,0x47,0x7e,0x43,0x37,0xbb,0x7e,0x50,0x64,0xac,0x45,0x12,0x87,0xf8,0x7a,0xb3, +0x2b,0x1f,0x7e,0xf, 0x38,0xd9,0x12,0x4d,0x9b,0x12,0x49,0x4, 0x7e,0x73,0x2b,0x1f, +0x7a,0x73,0x37,0xbe,0x2, 0x48,0x6e,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14, +0x12,0xc0,0x42,0x7e,0xc0,0xa, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x1f,0x38,0xd9,0x12,0x90,0x58,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, +0x12,0x49,0xb7,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12, +0x49,0xb7,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x49,0xb7,0xb, +0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x38, +0xd9,0x12,0x8f,0xfb,0x7d,0x73,0x7e,0x1f,0x38,0xc8,0x69,0x31,0x0, 0x1a,0x7a,0x73, +0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, 0x1a,0xb, +0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x37,0xb1, +0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5,0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3, +0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a,0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35, +0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x31,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x4e,0x5f,0x6c,0xff,0x80,0x35,0x12,0x4c, +0x40,0x6c,0xee,0x80,0x19,0x7e,0x11,0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac, +0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x10,0x12,0x4c,0x47,0xe5,0x2e, +0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12,0x4c,0x56,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34, +0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xc5,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34, +0x10,0x0, 0x12,0x4c,0x7c,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x78,0x12,0x4c,0x40, +0x6c,0xee,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2a,0xbc,0xbe,0x38,0xe6,0xe5,0x2a, +0x12,0x4c,0x56,0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x60,0xe5,0x2a,0xbe,0xb1,0x2d, +0x50,0x35,0x12,0x4c,0x40,0x7e,0xe1,0x2a,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2d, +0xbc,0xbe,0x38,0xe6,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5,0x2d,0xa, 0x1b,0x6d,0x0, +0x9f,0x1, 0x12,0x4c,0x5a,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x3, 0x62,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x82,0xe5,0x2d,0xa, 0x1b,0x6d, +0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x1f,0x7, 0x6c,0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, 0x9d,0x15,0xad,0x12, +0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21, +0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xcc, +0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x7, 0x6c,0xff,0x80, +0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x60,0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10, +0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x60,0xe5,0x2a, +0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x62,0x2e,0x14,0x10, +0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x62,0xb, 0xf0,0xe5,0x2b,0xbc, +0xbf,0x38,0x9e,0x7e,0x73,0x37,0xb3,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14, +0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x5, 0x7d,0xe3,0x7a,0xe5,0x35, +0x7e,0x73,0x37,0xb4,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d, +0x1f,0x12,0x1f,0x5, 0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, 0xac,0xbf,0x49,0x45, +0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x34,0x0, 0x80,0x8, +0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xda, +0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x60,0xbe,0x45,0x35,0x28, +0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x60,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65, +0x3, 0x60,0x49,0x45,0x3, 0x62,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35, +0x3, 0x62,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x62,0xb, 0xf0,0xe5,0x2b, +0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x31,0x12,0x4d,0x9b,0xda,0x3b,0x22, +0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a, +0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f, +0x7, 0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x1f,0x5, 0x7e,0xa1,0x2c,0x74, +0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x4e,0x5f,0x7e,0x1f,0x38,0xf3, +0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x6, +0x7e,0x38,0x38,0x88,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x87,0x70,0xe, 0x7e,0xb3,0x38,0x85,0x70,0x8, +0x74,0x1, 0x7a,0xb3,0x38,0x87,0xa1,0x57,0x7e,0xb3,0x38,0x87,0x70,0x6, 0x74,0x1, +0x7a,0xb3,0x38,0x87,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0, +0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61, +0x59,0x12,0x23,0x9e,0x7a,0x35,0x2e,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0xa6,0x56, +0x75,0x2c,0x0, 0x80,0x16,0x12,0x4c,0x7c,0x12,0x4d,0x84,0xbe,0x35,0x2a,0x8, 0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x84,0x7a,0x35,0x2a,0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c, +0x38,0xe3,0x12,0x4d,0x93,0x40,0x25,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x1e,0x5, 0x1c, +0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c,0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20,0xb9,0x1b,0xfd,0x74,0x2, 0x12,0x0, +0x1e,0x12,0x4d,0x93,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x38,0xf2,0xe4,0x7a,0xb3,0x38, +0x87,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, 0x21,0x0, 0x7f,0x13,0x2d,0x35,0xb, +0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35,0x2a,0x22,0x12,0x4d,0xa5,0xb, 0x34, +0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x12,0xc1,0x3a,0x4c,0xaa, +0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c,0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4, +0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60, +0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e,0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, +0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc, +0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, +0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12,0x1f,0x7, 0x7f,0x1, 0xb, 0xc, 0x7e, +0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f,0x7, 0xbe,0x34,0x0, 0xfa,0x28,0x4, +0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, 0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d, +0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e,0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e, +0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27, +0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e, +0x34,0x0, 0x38,0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12, +0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, +0x12,0x4e,0x8d,0x80,0x2, 0xe4,0x22,0x12,0x4e,0x72,0x74,0x1, 0x22,0x12,0xc0,0x9f, +0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0x12,0x7f,0x6f,0x38,0x2, +0xe4,0x22,0x12,0x7f,0x67,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x4e, +0xb4,0x2, 0x4e,0x7d,0x7e,0xd7,0x2b,0xd, 0xbe,0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12, +0x7e,0xf8,0x12,0x4e,0xe0,0x7a,0xd7,0x2b,0xd, 0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e, +0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, 0x12,0x4f,0xaf,0x74,0x1, 0x22, +0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b,0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a, +0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x4e,0xe0,0x12,0xc0,0xe7,0x12,0x29,0x6f, +0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x20,0xde,0x7e,0xd0,0x7, 0x12,0x26,0x57,0x6c, +0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x12,0x4f,0xf0,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, +0x3c,0xbd,0x32,0x48,0xde,0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x7e,0xb3, +0x2a,0x73,0x7c,0x7e,0x12,0x7b,0x31,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49, +0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0x4f,0xf0,0x5c,0x7b,0x7a, +0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe, +0xd0,0x0, 0x58,0x88,0x12,0x7b,0x39,0x74,0x2, 0x12,0xc1,0xa, 0x12,0x50,0x51,0x74, +0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2a,0xfa,0x12,0x4e,0xe0,0xda,0x3b,0x22,0x74,0x2, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x12,0x50,0x51,0x74,0x2, 0x12,0x0, 0x1e,0x74, +0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x4f,0xc1,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, +0x94,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x2e,0x34,0x20,0x73,0x12, +0x91,0x6d,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x38,0xc0,0x2d, +0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x74,0xbc,0x6a,0x38,0xd6,0x22, +0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, +0x30,0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x4e,0xe0,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, +0xfd,0x7e,0xb3,0x37,0xe0,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc1,0xa, 0x12, +0x50,0xd4,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xe1,0x7e, +0xb3,0x37,0xe0,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x3f,0x67,0x80,0x7, 0xe4, +0x12,0x0, 0x1e,0x12,0x3f,0x49,0x12,0x3b,0x15,0x7e,0xb3,0x2a,0xfc,0x2, 0x50,0x51, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x3f,0xe9,0x7e,0xa3,0x2a,0x73, +0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x62,0x2a,0xdc,0xa, 0x26, +0x12,0x51,0x4b,0x93,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x50,0xca, +0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xde,0x6c,0xee,0x80,0x1a,0xa, 0x2e, +0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12, +0x50,0xca,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30, +0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba, +0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27,0x2a,0xfe,0x7e,0x29, +0xb0,0xa, 0x26,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xe9,0x7e, +0xa3,0x2a,0x73,0x7e,0x63,0x2a,0x74,0x6c,0xee,0x80,0x1f,0xa, 0x2e,0x9, 0x72,0x2a, +0xdc,0xbe,0x70,0x1c,0x50,0x12,0xa, 0x27,0x12,0x51,0x4b,0x93,0x7c,0x7b,0x7e,0xb3, +0x2a,0xfb,0xa, 0x27,0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xdd,0x6c,0xee, +0x80,0x17,0xa, 0x3e,0x9, 0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a, +0xfb,0xa, 0x27,0x19,0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e, +0x30,0xe, 0xac,0x3e,0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11, +0xf8,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0x73,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7a,0xb3,0x34,0xc4,0x7c,0xbf,0x6c,0x77,0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x51,0x4f,0x93,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff, +0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0xca, +0xf8,0x6c,0xaa,0x6d,0x33,0x7e,0x24,0x7f,0xff,0x7e,0xf0,0x1, 0x80,0x32,0xa, 0x1f, +0x7e,0xb3,0x2a,0x6e,0xa, 0xb, 0x2d,0x1, 0x3e,0x4, 0x49,0x10,0x4, 0xfc,0xbe,0x14, +0x3, 0xe8,0x8, 0x1a,0xb, 0xa0,0xbd,0x13,0x8, 0x4, 0x7d,0x31,0x80,0x10,0xbd,0x12, +0x58,0xc, 0x7d,0x21,0xbe,0x24,0x0, 0x0, 0x18,0x4, 0x7e,0x24,0x0, 0x1, 0xb, 0xf0, +0x7e,0xb3,0x2a,0x6f,0xa, 0xb, 0x1b,0x4, 0xa, 0x1f,0xbd,0x10,0x48,0xc0,0x7e,0xb3, +0x34,0xa1,0x7a,0xb3,0x36,0xf3,0x7a,0xa3,0x36,0xf7,0xe4,0x7a,0xb3,0x36,0xf5,0xbe, +0xa0,0xb, 0x78,0x18,0x9d,0x32,0xbe,0x34,0x4, 0xb0,0x58,0x10,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x1, 0x5e,0x58,0x6, 0x74,0x1, 0x7a,0xb3,0x34,0xa1,0x7e,0x73,0x34,0xa1, +0xbe,0x70,0x0, 0x28,0x3e,0x6c,0xff,0x80,0x35,0x7c,0xbf,0x12,0x97,0xfc,0x60,0x22, +0x74,0x22,0x7a,0xb3,0x36,0xf4,0x7e,0xb3,0x34,0xc4,0x4, 0x12,0x51,0x57,0x7e,0x73, +0x34,0xc4,0xbe,0x70,0x5, 0x40,0x15,0xe4,0x7a,0xb3,0x34,0xc4,0x7a,0xb3,0x34,0xa1, +0x80,0xa, 0xe4,0x12,0x51,0x57,0x74,0x33,0x7a,0xb3,0x36,0xf5,0xb, 0xf0,0x12,0x52, +0x66,0x38,0xc6,0xda,0xf8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xca,0xd8,0xca, +0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x3c,0xe4,0x7a,0xb3,0x1f,0x58,0xe5,0x1d, +0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60,0xc, 0x12,0x8c,0x87, +0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x10,0x6d,0x88,0x7a,0x87,0x37, +0xfd,0x61,0xa0,0x12,0x93,0x91,0x60,0x12,0x7e,0x34,0x62,0xe, 0x12,0x87,0xc4,0x7a, +0x87,0x37,0xf3,0x12,0x54,0x2b,0x7a,0x87,0x37,0xfd,0x7e,0x87,0x37,0xf3,0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x7b,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x52,0x7c,0xbd, +0x7c,0x7e,0x12,0x55,0xb9,0x7d,0x93,0x7e,0x87,0x37,0xfd,0xbd,0x89,0x50,0x4, 0x7a, +0x97,0x37,0xfd,0x7e,0x87,0x38,0x3c,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x3c,0xe5, +0x1d,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x37,0xff,0x12,0x54,0x4e,0x50,0x7, 0x12, +0x54,0x45,0xd2,0x3, 0x80,0x2f,0x7e,0x8, 0x37,0xff,0x7e,0x18,0x1f,0x52,0x12,0x57, +0x0, 0x50,0x22,0x80,0x10,0x12,0x54,0x2b,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f,0x52, +0x12,0x91,0x86,0x50,0x10,0x12,0x54,0x45,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52, +0x12,0x93,0x6b,0xd2,0x3, 0xb, 0xf0,0x12,0x52,0x66,0x38,0x80,0x30,0x3, 0x37,0x6c, +0xff,0x80,0x20,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x58,0x12,0x54, +0x4e,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x54, +0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdb,0x75,0x1d,0x0, 0x7e,0x34,0x62,0xe, 0x12, +0x23,0x9e,0x7a,0x37,0x37,0xf3,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, 0xac,0x67,0xb, +0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x37,0xff,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x37,0x37,0xf3,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93,0xa, 0x3b,0xbe, +0x37,0x37,0xfd,0x38,0x40,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37,0x38,0x3c,0x38, +0x34,0x90,0x60,0x51,0x12,0x54,0x33,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, +0x24,0x90,0x60,0x50,0x12,0x54,0x33,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, +0x14,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x54,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf4,0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0xa2,0x3, 0x92,0x10,0x12, +0x56,0xe9,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xb, 0x70,0x1b,0x7e, +0xb3,0x28,0xa8,0x70,0x15,0x12,0xc1,0x2a,0x68,0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0, +0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x51,0x5f,0x22,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0xd5,0x26,0xfa,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x7c,0xbd, +0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f, +0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0, +0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, +0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38, +0xc9,0xa2,0x4, 0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28,0x99, +0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73, +0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f, +0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, +0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x55,0xa6,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3, +0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e, +0xb3,0x26,0x83,0x70,0x40,0x12,0x8f,0xe3,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x55,0xa6,0x49,0x2, +0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49, +0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, +0xf0,0xbc,0x7f,0x38,0xc9,0x12,0xb1,0x8e,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28, +0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28, +0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x55,0xaf,0x49,0x25, +0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x0, 0xbe,0x37,0x28,0x9d,0x8, +0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdc,0x6c, +0xff,0x80,0x9, 0x12,0x55,0xaf,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf2,0xda,0x79,0xda,0xd8,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0x7c, +0xbf,0x12,0x37,0x6f,0x74,0x2, 0xac,0xbf,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f, +0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c,0xcc, +0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c, +0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14, +0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12, +0x20,0xde,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a, +0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1c,0x75,0x26,0x0, +0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56,0xd3,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf1,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xdf,0x7c,0xec, +0x80,0x23,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80,0xa, 0x12,0x91,0xd5, +0x70,0xd, 0x12,0x56,0xd3,0xb, 0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5, +0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd8,0x1a,0x3c,0xb, 0x34,0x7c,0xe7, +0x80,0x1c,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56, +0xd3,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf1,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73, +0x2a,0x6e,0xbc,0x7e,0x18,0xdc,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x21,0x75,0x26, +0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xa, 0x12,0x91,0xd5,0x70,0xd, 0x12,0x56,0xd3,0xb, +0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e, +0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd7,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, +0xda,0x3b,0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35,0x24,0x22,0x12,0x57, +0x32,0x12,0x51,0x9f,0x7a,0xb3,0x2a,0xc, 0x22,0x30,0x10,0x13,0x12,0xc1,0x1a,0x68, +0x6, 0x7e,0xb3,0x39,0xb, 0x60,0x8, 0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x37,0xfb,0x22, +0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f, +0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x54,0x52,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76, +0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9, +0xc3,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34,0xa2,0x6c,0x33,0x80,0x3d,0x7e, +0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc, +0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32, +0x12,0x35,0x67,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3, +0x34,0xa2,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf, +0x2, 0x57,0x83,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac, +0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c, +0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26, +0xfb,0xa, 0x28,0xa, 0x31,0x12,0x35,0x67,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x35, +0x67,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0, +0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3e,0xbe,0xb0,0x0, 0x28,0x12,0x14, +0x7a,0xb3,0x35,0x3e,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2a, +0x5a,0x7e,0xb3,0x36,0xec,0x70,0x58,0x7e,0xb3,0x39,0xb, 0x70,0x52,0x7e,0xb3,0x36, +0x71,0x70,0x4c,0x7e,0x37,0x37,0xfd,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28, +0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f, +0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3, +0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, +0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x35,0x3e,0xda, +0xf8,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e,0x7e,0xf3,0x2a,0x6d,0xac,0xf7, +0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x20,0xde,0x7e,0xb3,0x37,0xb7, +0xb4,0x1, 0x64,0x7e,0x73,0x37,0xb8,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c, +0x12,0x26,0x57,0x12,0x28,0x62,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49, +0x33,0xd, 0xc8,0x12,0x21,0x0, 0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14, +0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34, +0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xb8, +0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, +0xd, 0xc8,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0x4, 0xe4,0x2, 0x58,0xe8,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0x12,0x68,0x10,0x12,0x7d,0x94,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0x74,0x12,0xb6,0xe2, +0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x91,0x18,0x12,0x47,0x2c, +0x12,0x28,0x62,0x50,0xde,0x12,0xab,0xdb,0x12,0x75,0xe9,0x7e,0xb3,0x37,0x5, 0xb4, +0x1, 0x4, 0xe4,0x12,0x58,0xe8,0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x5e,0xaa,0x40, +0xc2,0x12,0x88,0x5f,0x12,0x5e,0xaa,0x40,0xba,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x0, 0x6e,0x12,0x5f,0x2f,0x12,0x5f,0x83,0x12,0x5b,0x94,0x12,0x96,0x24,0x12,0x5e, +0xc2,0x12,0x5f,0xcd,0x12,0xaa,0xe6,0x12,0x87,0x74,0x7e,0xb3,0x36,0xf1,0xbe,0xb0, +0x88,0x68,0x3, 0x12,0x59,0x77,0x12,0x67,0xfa,0x12,0x26,0x66,0x12,0x62,0xa5,0x80, +0x82,0x12,0x2f,0xee,0x2, 0x58,0xdc,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x12,0x35, +0xd3,0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, +0x7e,0xb3,0x2a,0x7, 0x70,0x8, 0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0x61,0x6b,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x28,0x80,0x4, 0x7e,0x68,0x32,0xea,0x7f,0x6, 0x12,0x7e,0xef, +0x7e,0x73,0x2a,0x4, 0x7a,0x6b,0x70,0x6c,0xdd,0x61,0x1c,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x5e,0x3d,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x61,0x1a,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x61,0x1a,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x9e,0xec,0x50,0x2, 0x61,0x1a,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3, +0x2a,0x9, 0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xd6,0x6d,0x22,0x74,0x1, 0x12,0x7f,0xd4,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xe0,0x6d,0x22,0x74,0x10,0x12,0x7f,0xd4,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xd6,0xf5,0x25,0x9, 0xb3,0x32,0xe0,0xf5,0x26,0xa, 0x3c,0x12,0x5e, +0x3d,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xd6,0x19,0xb3,0x32,0xe0,0x12, +0x35,0xd3,0x7e,0xb3,0x2a,0x64,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd, +0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac, +0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x2c,0x75,0x27, +0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x6a,0x54,0xf, +0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x66,0x49,0xa3,0x33,0x68,0x80,0xc, 0x5, 0x27, +0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, 0xff,0x5e,0xa4, +0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5, +0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0, +0xe5,0x28,0xa, 0x5b,0x12,0xb9,0x5c,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e, +0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13, +0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26, +0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x4d, +0xbc,0x7d,0x28,0x2, 0x21,0xbb,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x31, +0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38, +0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0xa, 0xb2,0xe, 0x12,0x7e,0x81,0x74,0x1, 0x12,0x58, +0xe8,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x5e,0x61,0xe4,0x7a,0xb3,0x2a, +0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, 0xe4,0x12,0x58,0xe8,0x12, +0x5f,0xc2,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x66,0x12,0x20,0xb9,0x1b, +0xfd,0x4c,0xff,0x78,0xc, 0x12,0x73,0xe5,0x7e,0x8, 0x33,0x66,0x74,0xff,0x12,0x20, +0xde,0xda,0x3b,0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70, +0xff,0x12,0x5e,0x8b,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f, +0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe2,0x7e,0x73,0x2a,0x2, +0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x2, 0xa1,0xab,0x6c,0xaa,0x80,0x10, +0x7e,0x44,0x7f,0xff,0x12,0x5e,0x95,0x79,0x40,0x0, 0x14,0x12,0x5e,0x45,0xb, 0xa0, +0x12,0x5e,0x25,0x38,0xeb,0xa1,0xab,0x7e,0xb3,0x34,0x4f,0x70,0x3d,0xbe,0x70,0x0, +0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12, +0x5e,0x95,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30, +0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0, +0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xce,0xa1,0xab,0x6c,0xaa,0x80,0x17,0x12,0x5e, +0x57,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe4,0x6c,0xaa,0x80,0x41,0x6c,0xff, +0x80,0x36,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe, +0x34,0x7f,0xff,0x68,0x21,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x18,0x12,0x5e, +0x35,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x5e,0x4e, +0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xc5,0xb, 0xa0,0x7e, +0xb3,0x34,0x4f,0xbc,0xba,0x38,0xb7,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x9, 0xb3,0x1f, +0x46,0xb4,0xff,0x1d,0x6c,0xff,0x80,0x14,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x9, 0x12,0x5e,0x4e,0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38, +0xe7,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xd3,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac, +0x7a,0x49,0x43,0x28,0xae,0x12,0x5e,0x35,0x59,0x42,0x15,0x76,0x49,0x33,0x28,0xb0, +0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xde,0x7e,0x34, +0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e,0x7e,0x73, +0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80, +0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0x12,0x5e,0x2d,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x5e,0x8b,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x5e,0x45,0xb, 0xa0,0x7e,0x63,0x2a,0x2, 0xbc,0x6a, +0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68, +0x13,0x12,0x5e,0x57,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c, +0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x7e,0xf3,0x2a,0x2, 0x7a, +0xf3,0x34,0x4f,0x6c,0xaa,0x80,0x66,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2b, +0x12,0x5e,0x9f,0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0xa, 0x3a,0x2d,0x3d, +0x7d,0x2c,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x2e, +0xa5,0xbb,0x0, 0x2a,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x23,0x12,0x5e,0x9f,0xbe,0xb0, +0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30, +0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0xa, 0x3a, +0x2d,0x3d,0x7d,0x2c,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0x12,0x5e,0x25, +0x38,0x95,0xda,0xf8,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0x90,0x60,0x99, +0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0xb0,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40,0x0, 0x28,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x22,0x6c,0xaa,0x80,0x20,0x74,0x3, 0x12,0xa9,0x99,0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0xa, 0x12,0x5e,0x57,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79, +0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x22,0x7e,0x50,0x9, 0xac,0x5a, +0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, +0x3a,0x2d,0x3d,0x7d,0x2c,0x29,0xb1,0x0, 0xa, 0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91, +0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x9b,0xdf,0x28,0x2, 0xd2,0x3, 0xa2, +0x3, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x3, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x5f,0xc2,0xca,0x59,0x7e,0x18,0x28, +0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xb9,0x1b,0xfd,0x90,0x61,0x35,0xe4,0x93,0xbe, +0xb0,0x0, 0x28,0x28,0x6c,0xff,0x80,0x1f,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae, +0x12,0x80,0x16,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12, +0x64,0xdb,0x12,0xab,0x9b,0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xdc,0xda,0xf8,0x22,0x2, +0x5f,0x32,0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe, +0x12,0x37,0x6f,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x23,0x7e,0xc4, +0x0, 0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0xb, +0xf0,0xb, 0xe0,0x12,0x9c,0xf6,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, +0xda,0x79,0x22,0x12,0x9d,0xda,0x2, 0x5f,0x89,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, +0x38,0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x35,0x40, +0x28,0x14,0x7e,0xb3,0x35,0x40,0x4, 0x7a,0xb3,0x35,0x40,0x7a,0xa3,0x2a,0x2, 0x80, +0x5, 0xe4,0x7a,0xb3,0x35,0x40,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a, +0xb, 0x22,0x90,0x60,0x99,0xe4,0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x12,0x68,0x38, +0x2, 0x5f,0xd3,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x34,0xa2,0x4c,0xaa,0x78, +0x3, 0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x34,0xad,0x7e, +0x73,0x34,0xae,0xbe,0x73,0x34,0xad,0x28,0x4, 0x7a,0x73,0x34,0xad,0x22,0xff,0xff, +0x70,0x8f,0x0, 0xff,0x51,0xae,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x36,0x31,0x1, 0xc3,0x1, 0x34,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x7, 0xf8,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0x18,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xd, 0xc, 0xb, 0xa, 0x9, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x11,0x12,0x13,0x14,0x18,0x17,0xc, 0xd, 0xe, 0xf, 0x15, +0x16,0x10,0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x3d,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x4, 0x5d,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x69,0x40,0xd, 0x18,0x25,0x17,0x25,0x6, 0x80,0x17,0x25,0x6, +0x80,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x32,0x32,0x1, 0xd8,0x1, 0xec,0x0, +0xe1,0x0, 0xe1,0x5, 0x0, 0x37,0x37,0x1, 0xae,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0x96,0x1, 0x18,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, 0x68,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15,0x0, 0x1, 0x54,0x1, 0x0, 0x7, +0x1, 0x51,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0x10,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x3d,0x2, 0x5d,0x69,0x20,0x26,0x3, 0x52,0x59,0x20,0x34, +0x2, 0x5a,0x64,0x20,0x46,0x2, 0x47,0x49,0x30,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, +0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x4, 0x5, 0x25, +0x26,0x27,0x28,0x29,0x4, 0x0, 0xd2,0x2, 0x30,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x0, 0x78,0x0, 0x78,0x14,0x8, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, 0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x8, 0x37,0xf3,0x12,0x62,0xdf,0x7e,0x8, 0x37,0xfb, +0x12,0x62,0xdf,0x12,0x62,0xf4,0x12,0x62,0xfb,0x2, 0x62,0xbc,0x7e,0x37,0x37,0xf3, +0xbe,0x34,0x0, 0x0, 0x28,0x18,0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x50,0xf, 0x7e, +0xb3,0x37,0x31,0x70,0x9, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0x22,0xb, +0xa, 0x30,0xe5,0x4e,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33, +0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x2b,0xb7,0x2, 0x62,0xdf,0x7e,0x8, 0x38,0xe6,0x2, +0x62,0xdf,0x6d,0x33,0x7a,0x37,0x38,0x83,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e, +0xb3,0x2a,0x3, 0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28, +0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68, +0x17,0x7e,0x47,0x2b,0xb7,0x4d,0x44,0x78,0xf, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3, +0x38,0x85,0x7a,0xb3,0x37,0x6, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e, +0x37,0x2b,0xb7,0x7a,0x37,0x2f,0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37, +0x2b,0xb7,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37, +0x2f,0x98,0x7e,0x27,0x2f,0x9a,0x12,0x64,0x1a,0x81,0x13,0x80,0x0, 0x12,0xbd,0xdd, +0x81,0x13,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57, +0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xbd,0x78,0x12,0x64,0x16,0x74, +0x1, 0x7a,0xb3,0x2f,0x80,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88, +0x9e,0x27,0x2f,0x90,0x7e,0x14,0x62,0x8a,0x12,0x64,0xd3,0xbd,0x23,0x38,0x13,0x7e, +0x27,0x2f,0x96,0x9e,0x27,0x2f,0x8e,0x7e,0x14,0x62,0x8c,0x12,0x64,0xd3,0xbd,0x23, +0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a, +0xc7,0x2f,0x98,0x7a,0xd7,0x2f,0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d, +0x2d,0x7e,0x17,0x2b,0xbb,0x7e,0x7, 0x2b,0xbd,0x12,0x66,0xce,0xa, 0x2b,0x7e,0x73, +0x2f,0x7f,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0x64,0x16,0x7a,0xc7,0x2b,0xbb,0x7a, +0xd7,0x2b,0xbd,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24, +0x12,0x67,0xca,0x7d,0x31,0x12,0x85,0xfd,0x2, 0x64,0x2b,0x7e,0x3, 0x2f,0xa8,0xbe, +0x0, 0xf0,0x50,0x2, 0x81,0xc4,0x81,0xb9,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0, +0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34, +0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b, +0xc1,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0x66,0xce,0x7c,0x1b,0x7e,0x3, +0x2f,0x7f,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b, +0xbf,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x1f,0x8c,0x7e,0x34,0x1f,0x34,0x7e,0x30, +0x4, 0xac,0x39,0x2e,0x14,0x2b,0xbf,0x74,0x4, 0x12,0x1f,0x8c,0xb, 0x80,0x7e,0x3, +0x2f,0xa8,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8, +0x7e,0x3, 0x2f,0x7f,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec, +0x40,0x2, 0x81,0x38,0x22,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e, +0x14,0x61,0x49,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e, +0x14,0x61,0x43,0x12,0x83,0x62,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22, +0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83, +0x2a,0x70,0x12,0x87,0xd4,0xbe,0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d, +0x2e,0x7e,0x14,0x61,0x47,0x12,0x64,0xd3,0x12,0x66,0x10,0x90,0x61,0x45,0x12,0x66, +0x7, 0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0x12,0xc1,0x3a,0xbe,0xa0,0x0, 0x28, +0x32,0x7d,0x14,0x9e,0x14,0x0, 0x3f,0xbd,0x1e,0x38,0x13,0x12,0x66,0xb8,0x40,0xe, +0x12,0x64,0xc5,0x12,0x65,0xfa,0x48,0x32,0x7f,0x10,0x1b,0x1c,0x80,0x2c,0x12,0x66, +0xb8,0x50,0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x64,0xcb,0x12,0x66,0x10,0x7d, +0x1f,0x80,0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x66,0xb1,0xbd,0x5e,0x38,0x16,0x12,0x64, +0xc5,0x12,0x65,0xfa,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10, +0x6d,0x0, 0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x66,0xb1,0xbd,0x5e,0x28, +0x68,0x7d,0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d, +0x35,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d, +0x22,0x7e,0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1e,0xfc,0x12, +0x66,0x14,0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, +0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x66,0x7, +0x58,0x4, 0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76, +0x7c,0x65,0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x36,0x69,0x7a, +0x73,0x36,0xdf,0x7e,0x27,0x38,0xd6,0x7e,0x14,0x61,0xc8,0x12,0x64,0xd3,0x1e,0x34, +0xbd,0x32,0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x14,0x61,0xc8,0x12,0x64, +0xd3,0xbd,0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x36,0x67,0x12,0x67,0x62,0x7e,0x37,0x36, +0x6f,0xbd,0x32,0x50,0x4, 0x7a,0x27,0x36,0x6f,0x12,0xc1,0x12,0x38,0xa, 0x12,0x8f, +0xf3,0x38,0x5, 0x12,0x8f,0xeb,0x28,0x3d,0x12,0x67,0x69,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x36,0x67,0x4, 0x7a, +0xb3,0x36,0x67,0x7e,0x73,0x36,0x67,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3, +0x36,0x67,0x12,0xc0,0x95,0x7a,0xb3,0x36,0xdc,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x67, +0x7d,0x32,0x2, 0xad,0xac,0x2, 0x66,0xa8,0x12,0x67,0xc0,0xe4,0x7a,0xb3,0x36,0x75, +0x22,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4, +0x60,0xd1,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0xbd,0x1e,0x22,0x7d,0x51, +0x7d,0x12,0x9d,0x35,0x12,0x21,0x0, 0x7c,0xa7,0x12,0x67,0xeb,0x7c,0xb7,0xbc,0xba, +0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x67,0x15,0x50, +0x21,0x7e,0x54,0x62,0x5a,0x12,0x67,0x15,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x64, +0xd3,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x5e,0x12,0x64,0xd3,0xbd,0x32,0x28,0x2, +0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12, +0x66,0x1b,0x2, 0x67,0x25,0x7e,0xb3,0x36,0x69,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36, +0x71,0x7e,0xb3,0x36,0xdf,0x70,0x3, 0x12,0xaf,0x2f,0x7e,0xb3,0x36,0x71,0xb4,0x1, +0xc, 0x74,0x3, 0x12,0x67,0x59,0x12,0x23,0x9e,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x67, +0x59,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x34,0xae,0x7e,0x34,0x61, +0x5b,0x22,0x74,0x2, 0x7a,0xb3,0x36,0x69,0x22,0x7e,0xb3,0x36,0x75,0xb4,0x1, 0x3, +0x2, 0x67,0x62,0x7e,0xb3,0x36,0xdb,0x4, 0x7a,0xb3,0x36,0xdb,0x7e,0xb3,0x36,0x69, +0xb4,0x2, 0x18,0x7e,0xb3,0x36,0xda,0x4, 0x7a,0xb3,0x36,0xda,0xb4,0x1, 0x6, 0x74, +0x1, 0x7a,0xb3,0x36,0xdb,0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x73,0x36,0xda,0xbe, +0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x75,0x12,0x67,0x62,0x12,0xaf,0x2f, +0x12,0x67,0xc0,0x7e,0x73,0x36,0xdb,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x67,0xc0,0x22, +0xe4,0x7a,0xb3,0x36,0xdb,0x7a,0xb3,0x36,0xda,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0, +0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xbf,0x12,0x67,0xf2,0x59,0x25,0x2b, +0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a,0xb3,0x2f,0xa8,0x22,0x7d,0x31,0x9d,0x30,0x2, +0x21,0x0, 0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x73,0x28,0x93,0x7a,0x73, +0x28,0x94,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22, +0x12,0xc0,0x25,0x12,0x63,0x2, 0x7a,0x37,0x39,0x4, 0x12,0x69,0x87,0x12,0x28,0x48, +0x2, 0x68,0x23,0x12,0x69,0x84,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3, +0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca,0x79,0x7e,0x13,0x2a,0x2, 0x7e,0x78, +0x29,0xbc,0x12,0x69,0x84,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0x19, +0x7e,0xa0,0x5, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12, +0x68,0x23,0x21,0x6d,0xbc,0x20,0x50,0x3, 0x12,0x68,0x23,0x6c,0x0, 0x21,0x62,0x7e, +0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x21,0x60,0xa, +0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x21,0x43,0x12, +0x69,0x7a,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x21,0x0, 0x7d,0xd3,0x7e,0x70,0x4, +0xac,0x79,0x49,0x23,0x35,0x43,0x12,0x69,0x70,0x9d,0x32,0x12,0x21,0x0, 0x7d,0xc3, +0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x69, +0x7a,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x43,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28, +0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, 0x7a,0xb3,0x34,0x89, +0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3, +0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80,0x53,0x7e,0x50,0x9, +0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x35,0x41,0x49, +0x22,0x29,0xa, 0x59,0x27,0x35,0x43,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x34,0x88,0x80, +0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34, +0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, +0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x41,0x12,0x69,0x70,0x59,0x32,0x35,0x43, +0xb, 0x0, 0x90,0x60,0x99,0xe4,0x93,0xbc,0xb0,0x28,0x2, 0x1, 0x6f,0xda,0x79,0x22, +0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x41,0x22,0xa2,0x8, 0x22,0x7e,0x34,0xd, 0xac,0x12,0x26,0x5b,0x12,0x7a, +0x2d,0x12,0x69,0xab,0x2, 0x69,0x97,0x30,0xf, 0x10,0x12,0x6e,0x8f,0x50,0x3, 0x12, +0x6f,0x6e,0x12,0x6a,0x50,0x12,0x69,0xd1,0xc2,0xf, 0x22,0x7e,0xb3,0x2b,0x1e,0x70, +0x1f,0x12,0x26,0x57,0x12,0x2f,0xf4,0x50,0xfb,0x12,0x6a,0x50,0x12,0x88,0x17,0x20, +0xf, 0x3, 0x12,0x69,0xd1,0x74,0x2, 0x7a,0xb3,0x2b,0x1e,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12, +0x87,0x56,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0xc0,0xcc,0xf5,0x2a, +0x7e,0x73,0x2b,0xf, 0xbe,0x71,0x2a,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x91,0x67,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x44,0x6d,0x22,0x7a,0x1f,0x37,0x40,0x7c,0xbc,0x12,0x6c,0x20,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x62,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x6d,0x13,0xda,0x3b,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12, +0xc0,0x1b,0x7a,0x55,0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d, +0x7f,0x3, 0x7e,0x1d,0x2a,0x12,0x79,0x7a,0x12,0xc0,0x9f,0x12,0xc0,0x42,0x75,0x2e, +0x0, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0xc1,0x22,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6a,0xd4,0x12,0xb3,0x89,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x30,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12, +0x7b,0x20,0x7e,0x35,0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30, +0x38,0xdc,0x5, 0x2e,0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b, +0x1d,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x6d,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d, +0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x6e,0x8f,0x50,0x7c,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x6e,0x12,0x6b,0xff,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x8, 0x12,0x6d,0x34,0x38,0xea,0x6c,0xcc,0x80,0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a, +0x12,0x6b,0xff,0x75,0x3b,0x0, 0x80,0x27,0x7e,0xb3,0x37,0xb1,0xbe,0xb1,0x3b,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x60,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x62,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e, +0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34,0x10, +0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x50,0x12, +0x6c,0x8, 0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70, +0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a, +0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, +0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x7f,0x78,0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe, +0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x6b,0xf6,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d, +0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80, +0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x35,0x7a,0x37,0x25,0xba,0x7e,0x35, +0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12, +0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25, +0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac, +0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37, +0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22, +0xca,0x3b,0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b, +0xf, 0xf5,0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xb9, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x60,0x7e,0x8, 0x25,0x2a, +0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbc,0x12,0xb3,0x54,0x74,0x1, 0x7a,0xb3,0x2b,0x1d, +0x74,0x5, 0xac,0xbc,0x12,0xc0,0x39,0x74,0x5, 0xac,0xbc,0x12,0x6f,0xff,0x74,0x5, +0xac,0xbc,0x12,0xc0,0x30,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0xc2,0x3, 0x12,0xc0,0xcc,0x12,0x6d, +0x13,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, +0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x6a,0xd4,0x12, +0xc0,0x1b,0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xa8,0xef,0x12, +0xa9,0xc9,0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3, +0x2b,0x14,0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39, +0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, +0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd, +0xda,0x3b,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6e,0x29,0x30,0xc, 0xa, 0x12,0xaf,0x1d, +0x30,0x3, 0x4, 0xe4,0x12,0xa, 0x66,0x30,0x3, 0x9, 0x12,0xae,0xd2,0x12,0x8d,0xef, +0x2, 0x8c,0x90,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f, +0x50,0x7e,0x14,0x22,0xe2,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x7a,0x1d,0x2c,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f, +0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c,0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x34,0x6c, +0xcc,0x80,0x4f,0x12,0x6e,0x19,0x40,0x48,0x12,0x6e,0xf, 0x50,0x43,0x74,0x2, 0xac, +0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x0, 0x7d,0x3, 0x7d, +0x31,0x12,0x21,0x0, 0xbd,0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e, +0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d, +0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34, +0xb, 0xc0,0x12,0x6d,0x34,0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12, +0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, +0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12, +0x6e,0x19,0x40,0x8, 0x12,0x6e,0xf, 0x50,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x12,0x6d, +0x34,0x38,0xec,0xb, 0xd0,0xbe,0xd0,0x3, 0x50,0x2, 0xa1,0x68,0xda,0x3b,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xb9,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x12,0x6e,0xa0,0x7a,0x37,0x2b,0x1b, +0x22,0x7e,0xa3,0x0, 0x4f,0xbe,0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xec,0x68,0x42, +0x74,0x5, 0xa4,0x12,0xc0,0xc3,0x12,0x6e,0x83,0x12,0xc0,0x39,0x12,0x6e,0x83,0x12, +0xc0,0x30,0x12,0x6e,0x8f,0x50,0x9, 0x7e,0xb3,0x0, 0x4f,0x12,0xb3,0x54,0x80,0x6, +0x12,0x6e,0x83,0x12,0x6f,0xff,0x12,0x6e,0x29,0x12,0x6f,0xf8,0x7e,0x73,0x2b,0x14, +0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x4f,0x7a,0x73, +0x3, 0xec,0x22,0x7e,0xa3,0x0, 0x4f,0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x20,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xb2,0x70,0x2, 0xc3,0x22,0xd3,0x22, +0x7e,0x23,0x2b,0xf, 0x7e,0x33,0x37,0xcd,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x0, 0xac,0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, +0xa, 0x7e,0x63,0x2b,0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe, +0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61, +0x1b,0xe4,0x93,0x7c,0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73, +0x2b,0x10,0x80,0x9, 0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b, +0x10,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c, +0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x38,0xc0,0x69,0x51,0x0, +0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d, +0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, +0x1f,0x58,0x7e,0xb, 0x70,0x7a,0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b, +0x62,0x29,0x70,0x0, 0x1, 0x7a,0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b, +0x20,0x12,0x6e,0x29,0x12,0x6f,0xf8,0xd2,0x3, 0xc2,0x4, 0x2, 0x48,0xf4,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x4f,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6f,0xea,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0xc0,0x76,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0xc0, +0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6f,0xea,0xca,0x39,0x7e, +0x23,0x0, 0x4f,0x7e,0x30,0x38,0xac,0x23,0x12,0xc0,0x76,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x8c,0xac,0x23,0x12, +0xc0,0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6f,0x42,0x7e,0x34,0x0, 0x38,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x3, 0x8b,0x9, +0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0x7e,0x37,0x3, 0xed,0xb, 0x34,0x7a,0x37, +0x3, 0xed,0x7e,0x37,0x3, 0xef,0xbe,0x37,0x3, 0xed,0x28,0x3, 0x2, 0x70,0x23,0x22, +0x2, 0x70,0x8, 0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x70,0x20,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b, +0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e, +0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a,0xb3,0x2b,0x74,0x7a,0xb3,0x2b, +0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x25,0xee,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2, +0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93, +0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74,0xbc,0x7e,0x28, +0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3,0x2a,0x6e,0x7a, +0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3,0x2a,0x74,0x90, +0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9,0xe4,0x93,0xa, +0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a,0xa, 0x3e,0x9d, +0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a,0x78,0x90,0x60, +0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f,0xca,0x39, +0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12,0x20,0xb9,0x1b, +0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x2b,0x21,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x72,0x92,0x12,0x79,0x31,0x90,0x60, +0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76,0x12,0x70,0x59, +0x74,0x1, 0x12,0x3d,0xac,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x2, 0x12,0x73, +0xf1,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a,0xb3,0x2b,0x4, +0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0x9e,0x7a,0x37,0x2b, +0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x9, 0x7e, +0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a,0xb3,0x2b,0x62, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4,0x93,0x7a,0xb3, +0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x2b, +0xf, 0x12,0x6e,0x29,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61, +0x22,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12, +0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3, +0x2b,0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61, +0x20,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b, +0x14,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d, +0x7a,0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64, +0xe4,0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61, +0x7e,0x34,0x20,0x5b,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x12,0xc0,0xd5,0x12,0x72,0xf4,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x72,0xdb,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x72,0xdb,0xa, +0x1b,0x2e,0x14,0x2a,0x7c,0x12,0x72,0xe8,0xe5,0x25,0x12,0x72,0xdf,0xa, 0x1b,0x2e, +0x14,0x2b,0x23,0x12,0x72,0xe8,0xe5,0x24,0x2, 0x20,0xde,0x7e,0x34,0x0, 0x2, 0x12, +0x20,0xde,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, +0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a, +0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x73,0x20,0x38,0xef,0x12,0x73,0x20,0x68,0x7, +0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22, +0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x12,0x77,0xfd,0x12,0x70,0xa7,0x12,0x0, +0xa, 0x12,0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8, +0x7e,0x1f,0x6, 0xf4,0x12,0x79,0x9d,0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e, +0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12, +0x79,0x7a,0x12,0x79,0x2e,0x12,0x25,0x45,0x12,0x73,0xa7,0x12,0x73,0x7f,0x2, 0x73, +0x71,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x12, +0x73,0xe5,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, 0x28,0xae,0x74,0xff,0x12,0x20, +0xde,0x12,0x9f,0xe3,0x7e,0x8, 0x29,0xbc,0x12,0x5e,0x61,0x7e,0x8, 0x2a,0x2, 0x7e, +0x34,0x0, 0xb, 0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4, +0x12,0x20,0xde,0x90,0x60,0x9c,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74, +0xff,0x12,0x20,0xde,0x90,0x60,0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26, +0xb4,0x74,0xff,0x12,0x20,0xde,0x90,0x60,0x9a,0x12,0x73,0xe8,0x7e,0x8, 0x27,0x76, +0x74,0xff,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78, +0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc, +0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, +0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80, +0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73, +0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d, +0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a, +0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26, +0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x75,0xb2, +0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d, +0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53, +0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x75,0x9f,0xb, +0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80, +0x19,0x12,0x75,0xa8,0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58, +0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3, +0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x75,0x97,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12, +0x75,0xb2,0xb, 0x6a,0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d, +0x2d,0x7e,0x67,0x2a,0x51,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, +0x90,0x12,0x75,0x9f,0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, +0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x75,0xa8,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c, +0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12, +0x74,0x3c,0x38,0xab,0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, +0x12,0x75,0x97,0x2d,0x15,0x6c,0xaa,0x80,0xe, 0x12,0xa5,0xe4,0xb, 0x7a,0x90,0xbd, +0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xed,0x7a,0xb7,0x8, 0x4, +0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32, +0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e, +0x74,0x62,0x10,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d, +0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31, +0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0xa6, +0x56,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x75,0x97,0x7e,0xd, 0x24,0x2d,0x15,0x7f, +0x13,0x2d,0x35,0x12,0x6d,0x3b,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a, +0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x75,0xbc,0x7e,0x37,0x28, +0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x75, +0xbc,0x12,0x76,0x2b,0x12,0xa7,0x45,0x2, 0x76,0x1a,0xe4,0x7a,0xb3,0x3, 0xff,0x7e, +0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x3, 0xff,0x22,0xca,0x3b,0x7e,0xf3,0x2a, +0x6e,0x12,0xc0,0xde,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, +0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0xa7,0xcd,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda, +0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0xbb,0xb5,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, +0xf8,0x12,0x3f,0xf2,0x12,0x76,0x9a,0x12,0x74,0x43,0x7e,0xb3,0x16,0x90,0xb4,0x1, +0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26, +0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x20, +0xde,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26, +0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0xc0,0xb, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0xbf,0xe7, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x86,0x12,0xc0, +0x60,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x89,0x12,0xc0, +0x60,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3, +0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0xc0,0xb, 0x7e,0x50,0x1, 0x12,0x77,0x60,0x7a, +0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0xbf,0xe7,0x7e,0x50,0x1, 0x12,0x77,0x60, +0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22, +0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0, +0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4, +0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0, +0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, +0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c, +0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b, +0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f, +0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0xe4,0x7a,0xb3, +0x37,0x9c,0x7a,0xb3,0x37,0x9d,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0x9e,0x90,0x60, +0x51,0xe4,0x93,0x7a,0xb3,0x37,0x9f,0xe4,0x7a,0xb3,0x37,0xa0,0x90,0x60,0x99,0x93, +0x7a,0xb3,0x37,0xa1,0xe4,0x7a,0xb3,0x37,0xa2,0x7a,0xb3,0x37,0xa3,0x90,0x61,0xc4, +0x93,0x7a,0xb3,0x37,0xa5,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34, +0x7a,0x73,0x37,0xa9,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a, +0x73,0x37,0xaa,0x74,0x64,0x7a,0xb3,0x37,0xbb,0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3, +0x37,0xbc,0x90,0x61,0x17,0xe4,0x93,0x7a,0xb3,0x37,0xa8,0x90,0x61,0x19,0xe4,0x93, +0x7a,0xb3,0x37,0xbe,0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x37,0xbd,0x90,0x61,0x1d, +0xe4,0x93,0x7a,0xb3,0x37,0xbf,0x90,0x61,0x25,0xe4,0x93,0x7a,0xb3,0x37,0xba,0xe4, +0x7a,0xb3,0x37,0xb5,0x74,0xfa,0x7a,0xb3,0x37,0xb3,0x74,0x1e,0x7a,0xb3,0x37,0xb4, +0x74,0x1, 0x7a,0xb3,0x37,0xb2,0x74,0xc, 0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3, +0x37,0xb6,0xe4,0x7a,0xb3,0x37,0xb7,0x7a,0xb3,0x37,0xb8,0x7e,0x8, 0x37,0xc0,0x7e, +0x34,0x0, 0x2c,0x12,0x20,0xde,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0xa, 0x36,0x7a, +0x73,0x37,0xcb,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0x7a,0x73,0x37,0xcc,0x90,0x60, +0xd4,0x93,0x7a,0xb3,0x37,0xcd,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x37,0xce,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b, +0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xe9,0x74,0x1, 0x7a,0xb3,0x37,0xe0,0x7e,0x34,0x0, +0x28,0xca,0x39,0x7e,0x34,0x61,0xd5,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12, +0x20,0xb9,0x1b,0xfd,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0x2, 0x23, +0xa6,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x6d, +0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x20, +0xde,0x7f,0x6, 0x7d,0x3f,0x12,0x20,0xde,0x7a,0xb3,0x16,0x91,0x22,0x7f,0x70,0x7e, +0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c, +0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x20,0xde,0x7f,0x7, 0xa, +0x3a,0x2, 0x20,0xde,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15, +0x12,0x79,0x9d,0x12,0x3f,0xd2,0x7e,0xe0,0x1, 0x12,0x4f,0xaf,0x30,0x18,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x7b,0x29,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac, +0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15, +0x12,0x7b,0x20,0xb, 0xd0,0x7e,0x73,0x2a,0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, +0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c, +0xbf,0x2e,0x73,0x2a,0x73,0x12,0x7a,0x8e,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b, +0x2, 0x70,0x41,0x12,0x2f,0xf4,0x50,0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x7a,0x75, +0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x72,0x12,0x79,0xc4,0x74, +0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x7a,0x75,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f, +0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x79,0xc4,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4, +0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x3d,0xac,0x7c,0xba,0x12,0x13, +0xc7,0x74,0xa, 0x12,0x45,0x15,0x7c,0xb9,0x12,0x0, 0x1e,0x2, 0x4e,0xe7,0xca,0xd8, +0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0x7b,0xd0,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74, +0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11, +0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x1f,0x7, 0x1b,0x6a,0x30,0xb, 0xd0,0xbc, +0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3, +0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73,0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c, +0x7f,0x12,0x7a,0x8e,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12, +0x20,0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, 0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, +0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22, +0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, +0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x29,0x6f,0x7c,0xe7,0x80,0x5d,0x12,0x26,0x57, +0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x12,0x7b,0x29,0x6c,0xdd,0x80,0x3d, +0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, +0x1d,0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19, +0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x3f,0xb, 0xbe,0xb0, +0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x7b,0xb7, +0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa, +0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53,0x2a, +0x73,0xa, 0x25,0x2d,0x23,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22, +0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa, +0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38, +0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, +0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e, +0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x37,0xed,0x40,0x39,0x7e,0x37,0x37,0xed,0xb, 0x34,0x7a,0x37, +0x37,0xed,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x34,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x38,0xfb,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x70,0x5, 0x7e,0xb3,0x37,0x9c,0x22,0xbe,0xb0,0x3, 0x38,0x15, +0x75,0x1b,0x0, 0x30,0xe, 0x6, 0x7e,0x18,0x32,0xea,0x80,0x4, 0x7e,0x18,0x33,0x28, +0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e, +0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4, +0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xed,0x80,0x2, 0x15,0x1a,0x2, +0x7c,0x17,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x7d,0x61,0xbe,0xb0,0x80, +0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x61,0x22,0xb4,0xfc, +0x5, 0x7e,0xb3,0x37,0x8, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60, +0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x36,0x71,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22, +0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74,0xff,0x22,0x7c,0x7b,0x6c,0xaa,0x12, +0x3f,0xe1,0x78,0x9, 0x7c,0xb7,0x12,0x7c,0x64,0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, +0x7c,0xb7,0x12,0x37,0xeb,0x7c,0xab,0x7c,0xba,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5, +0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5, +0x1a,0x12,0x3f,0xb3,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12, +0x7c,0xfb,0xf5,0x91,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0, +0x82,0x12,0x7d,0x1a,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b, +0x32,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x37,0xf2,0x7e,0x73,0x37,0xf2,0xa, 0x27,0x2e, +0x24,0x0, 0x6, 0x12,0x51,0x4f,0x93,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x37,0xf2, +0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x37,0xf2,0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0x9b,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0x9b,0x7a, +0xa3,0x36,0xf2,0x22,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37,0x9c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, +0xe4,0x7a,0xb3,0x37,0x9c,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba, +0x12,0x7d,0xab,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3, +0x7c,0x7a,0x12,0x7e,0x45,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xdf,0x38, +0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x7e,0x21,0xa5,0xbb,0x8f,0x3, 0x75,0x19, +0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x44,0xc0,0x74,0x1, 0x7a,0xb3,0x33,0xff, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68,0x17,0x1b,0x61,0x68, +0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x36,0xe1,0xd2,0xd, 0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37, +0xef,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37, +0xef,0x15,0x1a,0x7e,0x27,0x37,0xef,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, +0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a,0xea, +0x22,0x7e,0xb3,0x37,0xf1,0x4, 0x7a,0xb3,0x37,0xf1,0xe5,0x19,0xb4,0x1, 0x8, 0xe4, +0x7a,0xb3,0x37,0xf1,0x75,0x19,0x0, 0x7e,0x73,0x37,0xf1,0x7a,0x73,0x36,0xf0,0x22, +0xe4,0x7a,0xb3,0x37,0x9c,0x7e,0x8, 0x32,0xea,0x12,0x7e,0xef,0x7e,0x8, 0x33,0x28, +0x7e,0x34,0x0, 0x3e,0x12,0x20,0xde,0x7e,0x18,0x32,0xea,0x7a,0x1d,0x14,0x12,0x7e, +0xd1,0x2, 0x7e,0xc4,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0x9c,0xf5,0x91, +0x22,0x2, 0x7e,0xd4,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e, +0x34,0x0, 0x3e,0x74,0xff,0x2, 0x20,0xde,0x7c,0xab,0x12,0x3f,0x52,0x7c,0xba,0x12, +0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x7f,0x67,0x49,0x35,0x34,0x3b,0x49,0x15, +0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40,0x15,0xbe, +0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12,0x7f,0x6f, +0x28,0xe, 0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, 0x80,0x2, +0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c, +0x7c,0xb9,0x12,0x31,0x27,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, +0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88,0x7f,0x10, +0x7f,0x4, 0x12,0x1e,0xeb,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x75, +0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b,0x2a,0x0, +0x1b,0x1a,0x10,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e, +0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12, +0x21,0x0, 0xe5,0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0, +0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e, +0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12,0x87,0xbc,0x90, +0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, +0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x87,0xd4,0xbe,0xc4, +0x0, 0x3f,0x38,0x1c,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61,0x3b,0x12,0x81, +0x2, 0x12,0x80,0xf1,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xee, +0x12,0x66,0xb1,0xbd,0x5c,0x38,0x21,0x7d,0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12, +0x81,0x2, 0x90,0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b, +0x7c,0x12,0x80,0xf9,0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b, +0x1b,0x54,0xbd,0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f, +0x80,0xa, 0x7d,0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x87,0xcc,0x7f, +0x17,0x12,0x1e,0xfc,0x7f,0x71,0x12,0x81,0x1c,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40, +0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d, +0x22,0x2f,0x71,0x12,0x80,0xf1,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, +0x90,0x61,0x3a,0xe4,0x93,0x12,0x80,0xf9,0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f, +0x22,0x90,0x61,0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d, +0x22,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d, +0x2e,0x7c,0x76,0x7c,0x65,0x7f,0x71,0x22,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65, +0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12, +0x9f,0x40,0x7d,0x3, 0x74,0x9, 0xac,0xbf,0x12,0x87,0xe5,0x49,0x35,0x28,0xae,0x12, +0x81,0xbf,0x12,0x81,0x18,0x7d,0x13,0x5e,0x30,0xfc,0x7e,0x70,0x9, 0xac,0x7f,0x49, +0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d, +0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34, +0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x12,0x81,0xb3,0x12,0x81, +0x18,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, +0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30, +0xda,0x79,0x22,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d, +0x32,0x12,0x21,0x0, 0x7d,0x13,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b,0x74, +0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3,0x49, +0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x81,0xbf,0x7d,0x3f,0x9d,0x35,0x12,0x21, +0x0, 0x9d,0x34,0x12,0x21,0x0, 0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0xf, 0x12,0x67,0xeb,0x7e,0x14,0x62,0x6a,0x12,0x87,0xee,0x50, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7, +0x2f,0x9e,0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7, +0x2f,0x9a,0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x81,0xc7, +0x70,0x2, 0x61,0x45,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70, +0x9, 0x7e,0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45, +0x7e,0x73,0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f, +0xa4,0x7e,0x17,0x2f,0xa6,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45,0x7e,0x34,0x62,0x72, +0x12,0x83,0x4a,0x28,0x4a,0x7e,0x34,0x62,0x70,0x12,0x83,0x54,0x50,0x41,0x7e,0xb3, +0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0x9e,0x12,0x83,0x5e,0x7d,0x8f, +0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0x87,0xc4,0x9d, +0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40,0x2, 0x61, +0x45,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7b,0x7e,0xf0,0x21,0x80,0x76,0x7e, +0x34,0x62,0x7a,0x12,0x83,0x54,0x28,0x6d,0x7e,0x34,0x62,0x78,0x12,0x83,0x4a,0x50, +0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62,0x7e,0x12,0x23,0x9e,0x12,0x83, +0x5e,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50,0x4a,0x7e,0x34,0x62,0x7c,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7,0x2f,0x82,0x28,0x37,0x7d,0xfb, +0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x26,0x12, +0x67,0xf2,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd,0x49,0x25,0x2b,0xab,0x49,0x5, +0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, 0x9d,0x32,0xbe,0x34,0x0, 0x10, +0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xf0,0xbd,0xfc,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xbd,0xfb,0x22,0x7e,0x14, +0x62,0x8e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22,0x12,0x86,0x69,0x7a,0x37,0x2f, +0x9c,0x12,0x85,0xf4,0x7a,0x37,0x2f,0x9e,0x12,0x82,0x16,0x60,0x1, 0x22,0x7e,0x73, +0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f,0x80,0x2, +0x83,0x92,0xca,0xf8,0x7e,0x45,0x24,0x7c,0xb9,0x7a,0xb3,0x38,0x3f,0x74,0xff,0x7a, +0xb3,0x38,0x3e,0x6d,0x55,0x80,0x19,0x7d,0xf5,0x3e,0xf4,0x12,0x86,0x74,0x7d,0xe5, +0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54, +0xbd,0x45,0x38,0xe3,0x7e,0x33,0x38,0x3f,0xbe,0x30,0x4, 0x38,0x2, 0x81,0x54,0x69, +0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e, +0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x40,0x7a,0xb3, +0x38,0x42,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f, +0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x38,0x42,0x7d,0xf, 0x2d,0xf, 0xbd, +0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x38,0x42,0xa, 0x37,0x6d,0x22,0x12, +0x1e,0xeb,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7a,0x73,0x38,0x42,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x84,0x73,0x12, +0xbf,0x3c,0x12,0x84,0x73,0x12,0x84,0x7c,0x12,0x84,0x73,0x12,0xa5,0x28,0x80,0xa, +0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x38,0x3e,0xe4,0x7a,0xb3,0x38,0x3f,0x7e, +0x73,0x39,0x1, 0xbe,0x73,0x38,0x3e,0x48,0x6, 0x7e,0xb3,0x38,0x40,0x80,0x1, 0xe4, +0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71, +0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a, +0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0xa1,0x9d,0x7e,0x90,0x2, 0xac,0x9a, +0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x26,0x7f,0x67,0x2d, +0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f, +0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a, +0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe, +0xf0,0x2, 0x58,0x2, 0xa1,0x9b,0xbe,0x60,0x0, 0x18,0x2, 0xa1,0x83,0xbe,0x70,0xec, +0x28,0x2, 0xa1,0xa7,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7, +0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x85,0xeb,0x19,0xba,0x22, +0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x85,0xeb,0x19,0xba,0x23,0xe4,0x9, 0xba, +0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7, +0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0x85, +0xeb,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12,0x85,0xe2,0x19,0xbd,0x22,0xf5,0xa, 0xd9, +0x12,0x85,0xe0,0x19,0xbd,0x23,0xe5,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe, +0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12, +0x85,0xe0,0x19,0xbd,0x22,0xf4,0xa, 0xc9,0xa, 0xd4,0x12,0x85,0xe0,0x19,0xbd,0x23, +0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f,0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, +0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23,0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x38, +0x3f,0xbc,0xba,0x28,0x2, 0x81,0x9b,0x7a,0x73,0x38,0x3f,0x7e,0xa0,0x1, 0x80,0x25, +0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d, +0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e, +0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x38,0x3f,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22, +0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c, +0xbd,0xa, 0xa7,0x22,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0x86,0x69,0x7a,0x37,0x2f,0xa0,0x12, +0x85,0xf4,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0x86,0x69,0x7a,0x37,0x2f, +0xa4,0x12,0x85,0xf4,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7c,0xab, +0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4,0x14, +0x78,0xfb,0x12,0x86,0x72,0x2d,0xfe,0x80,0xf, 0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x12,0x86,0x72,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a, +0xbd,0xf4,0x38,0xd0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61, +0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b, +0x7e,0x63,0x2a,0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10, +0x7d,0x21,0x12,0x87,0xdc,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34, +0x37,0x44,0x6d,0x22,0xe4,0x2, 0x86,0x7e,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b, +0x68,0x4f,0x12,0x87,0x56,0x7c,0x3b,0x7c,0xb2,0x12,0x87,0x56,0x7c,0xab,0xbe,0x30, +0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12, +0x91,0x67,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e, +0x34,0x16,0x93,0x6d,0x22,0x30,0x16,0x3, 0x2, 0x86,0xc7,0x7e,0xb3,0x2b,0x1d,0xb4, +0x1, 0xf, 0x12,0xc0,0x1b,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x86, +0x7e,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, +0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40, +0xe9,0x74,0xff,0x22,0x7e,0xb3,0x37,0x31,0x70,0x6, 0x12,0x87,0xad,0x2, 0x87,0xb6, +0x12,0x63,0x9, 0x12,0xbd,0x6d,0x50,0xa, 0x12,0x83,0x6a,0x7c,0x3b,0x12,0x87,0xad, +0x80,0x5, 0x12,0xbe,0x14,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xbc,0xf1, +0x60,0xa, 0x7a,0x33,0x37,0x34,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4,0x7a,0xb3, +0x2f,0x80,0x22,0x2, 0x81,0x23,0xe4,0x7a,0xb3,0x38,0xdd,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x3e,0x24,0x7e,0xf, +0x38,0xd9,0x2d,0x12,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x32,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74,0x6, +0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x5, 0x7d,0x53,0xbe,0x54,0x0, 0xff, +0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x12,0x6e,0x8f,0x50,0x3, 0xd2,0xf, 0x22,0xc2, +0xf, 0x22,0x12,0xac,0xe9,0x12,0x88,0x2b,0x2, 0x88,0x17,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x20,0xde,0x12,0xaa,0x61,0x12,0xaa,0x58,0xa9,0xd1,0xcb, +0x12,0xc1,0x22,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x12, +0x54,0x94,0x12,0x88,0xb9,0x12,0x8c,0xad,0x7e,0xb3,0x37,0x6, 0xb4,0x1, 0x1e,0x7e, +0x34,0x61,0xc0,0x12,0x87,0xcc,0x7e,0x24,0x0, 0x5, 0xad,0x12,0x7a,0x17,0x28,0xa1, +0x7e,0x14,0x61,0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39, +0x11,0x60,0x7, 0x14,0x7a,0xb3,0x39,0x11,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, +0x12,0x88,0x22,0x12,0x8c,0x90,0x12,0xb3,0xd3,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12, +0xbb,0x30,0x12,0xaa,0x6a,0x2, 0x8d,0x10,0x22,0x7e,0x90,0x1, 0x7e,0xb3,0x2f,0xa9, +0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xa9,0x7e,0x34,0x61,0xc0,0x12,0x23, +0x9e,0x12,0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x12,0x8c,0x87,0xb, 0x1a, +0xf0,0x7e,0x34,0x61,0x4f,0x12,0x87,0xbc,0xe4,0x7a,0xb3,0x28,0xac,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x7e,0x34,0xff,0xfa,0xad,0x3f,0x12,0x8f,0xdc,0x7d,0xc3,0xe, 0xc4, +0x7e,0xe7,0x7, 0xfe,0xbd,0xe3,0x58,0x15,0x7e,0xe7,0x7, 0xfc,0xbd,0xec,0x58,0xd, +0x12,0x8a,0x7c,0x8, 0x8, 0x12,0x8b,0xe, 0x60,0x3, 0x12,0x8a,0x95,0x12,0x8b,0xe, +0xa, 0xeb,0x4d,0xee,0x68,0x3b,0x6d,0xee,0x9d,0xef,0xbe,0xe7,0x7, 0xfe,0x18,0x6, +0xbe,0xe7,0x7, 0xfc,0x8, 0x2b,0x12,0x8a,0x7c,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12, +0x21,0x0, 0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x8a,0x74,0x28,0x14,0x7e,0x83,0x28, +0x85,0xbe,0x80,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xcf,0x58,0x3, 0x12,0x8a, +0x95,0x12,0xad,0x28,0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xc1,0x1a,0x68,0x6, +0x7e,0xb3,0x39,0xb, 0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x7d,0x12,0x8a,0x74, +0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0xad,0x66,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x12,0x8a,0xa6,0x7c,0x9b,0x80, +0x1a,0x7e,0xb3,0x26,0x84,0x70,0x14,0x7e,0xb3,0x26,0x85,0x70,0xe, 0x12,0x8a,0x74, +0x28,0x9, 0x7e,0x90,0x3, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0xc7,0x7, 0xfa,0xbe, +0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x8a,0x74,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7, +0x28,0x8e,0x58,0x8, 0x12,0x8a,0x87,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0x29,0x7e,0x14, +0x61,0xc0,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0x7e,0x14,0x61, +0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x12,0x0, 0x66,0x50,0xd, 0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x8f,0xe3,0x28,0x3, 0x12,0x8a,0x87,0x7e,0xc7,0x28,0x8a, +0xbd,0xcd,0x8, 0x19,0x12,0x9b,0xf, 0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28, +0x8e,0x58,0xa, 0x12,0x0, 0x66,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x8b,0x8e, +0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x2, 0x12,0xac,0x90,0x7e,0xb3,0x2f,0xaa,0xbe, +0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xaa,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8c,0x7f,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0x6d,0xee,0x9e,0xe7, +0x2a,0x5a,0xbe,0xe7,0x28,0x8e,0x22,0xe4,0x7a,0xb3,0x2f,0xaa,0x7a,0xb3,0x28,0xac, +0x74,0x2, 0x2, 0x29,0xfa,0x74,0x2, 0x7a,0xb3,0x2f,0xaa,0xe4,0x7a,0xb3,0x2f,0xa9, +0x12,0x8c,0x7f,0x2, 0x29,0xfa,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x8c,0x87, +0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x8b,0x6, +0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e, +0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x4, +0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11, +0x7e,0x34,0xff,0xfd,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0, +0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x1e,0xb9,0xbd,0x34,0x22,0x6c,0x66, +0x90,0x60,0xa7,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28, +0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14, +0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x9d,0x8b,0x50, +0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, +0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e, +0x73,0x2a,0x6d,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0xca,0x3b, +0x12,0xa6,0x4e,0x38,0x2, 0x81,0x55,0x7e,0xc3,0x2f,0xad,0x4c,0xcc,0x78,0x3d,0x7a, +0xb3,0x2f,0xad,0xe4,0x7a,0xb3,0x2f,0xaf,0x6c,0xaa,0x80,0x26,0x12,0x8c,0x60,0x7e, +0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a,0x49,0xd0,0x19, +0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8c,0x6a,0x59,0x34,0x0, 0x2, +0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c,0xfc,0x6c,0xaa, +0x80,0x35,0x12,0x8c,0x60,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, 0xb4,0x0, 0x8, +0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8c,0x6a,0x7d,0x23,0x49,0x34,0x0, 0x2, 0x9d, +0x32,0x12,0x21,0x0, 0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x4c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x2f,0xaf,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x8c, +0x60,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x4c,0x0, 0x12,0x8c,0x71,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x2f,0xaf,0x80,0x6, 0x12,0x8c,0x71,0x75,0x4c,0x0, 0xe5,0x4c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xb0,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x40,0xe4,0x7a,0xb3,0x2f,0xae,0x7a,0xb3,0x2f,0xad,0x7a,0xb3,0x2f,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22, +0x12,0x8c,0xcd,0x6d,0x33,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x5, 0x12,0x8d,0x5e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xf6,0xe4,0x7a,0xb3,0x36,0x72,0x22,0x12,0xb0,0xbe, +0x60,0x1a,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x7e,0x37,0x38, +0xd2,0x12,0x25,0x3c,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x23,0x12,0x8d,0x8, 0x28, +0x26,0xa, 0x4a,0x9, 0x64,0x36,0x76,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x42,0x38,0xcc,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x80,0xb, 0xa0,0x7e, +0xb3,0x36,0x73,0xbc,0xba,0x38,0xd5,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xae,0xc5,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x8d,0x5e,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x84, +0x49,0x12,0x36,0x80,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x84,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x36, +0x84,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x36,0x80,0x59,0x32,0x36,0x84,0x22,0x7e,0xb3,0x36,0x66, +0x60,0x6, 0x14,0x7a,0xb3,0x36,0x66,0x22,0x12,0x8c,0xcd,0x90,0x61,0xc5,0xe4,0x93, +0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x8d,0xef,0x7e,0xb3,0x36,0xec,0x70,0xe, 0x7e,0xb3, +0x39,0x12,0xb4,0x1, 0x7, 0xe4,0x12,0x8d,0xb3,0x12,0xc0,0x95,0x12,0x67,0x1f,0x12, +0x8e,0xa2,0x7e,0xa3,0x36,0xec,0x7a,0xa3,0x39,0x12,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x8d,0xb3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf,0x12,0xc0,0xc3,0x12,0xc0, +0x39,0x12,0x6f,0xff,0x12,0xc0,0x30,0x7a,0xf3,0x0, 0x4f,0x7c,0xbf,0x12,0xb3,0x54, +0x12,0x6e,0x29,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37,0x12,0xaf,0x4, 0x12,0x8d, +0xef,0x12,0x23,0x4, 0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8,0x22,0x12,0x8f,0xd2,0x7e, +0xb3,0x2b,0xf, 0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xc0,0x7e,0x73,0x37,0xcd,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36, +0x12,0x8f,0xca,0xbe,0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x36,0x72,0xa, 0x3e,0xad, +0x3b,0x7d,0xa3,0x2d,0xac,0x75,0x35,0x0, 0x7e,0xa3,0x36,0x72,0xbc,0xad,0x40,0x2, +0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e, +0x78,0xe, 0x7c,0xbd,0x14,0xbe,0xb3,0x36,0x72,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x72, +0x7e,0xc3,0x36,0x72,0x80,0x41,0x7e,0xb3,0x36,0x72,0x4, 0x7a,0xb3,0x36,0x72,0x7e, +0x90,0x5, 0xac,0x9c,0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb, +0x19,0xcd,0x36,0x76,0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, +0xf5,0x35,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0, +0xbe,0xf0,0x3, 0x50,0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x36,0x73,0xda, +0x3b,0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0x5a,0x7e,0xb3,0x36,0x6b, +0xb4,0x1, 0x8, 0x12,0x88,0x22,0xe4,0x7a,0xb3,0x36,0x6b,0x7e,0xb3,0x36,0x6a,0x60, +0x4, 0x74,0xff,0xe1,0xc5,0x7e,0xb3,0x36,0x69,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xb9, +0x12,0xc1,0x12,0x38,0xc, 0x12,0x8f,0xf3,0x38,0x7, 0x12,0x8f,0xeb,0x38,0x2, 0xe1, +0xb9,0x12,0x8f,0xca,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, +0x80,0x3, 0x7c,0xbd,0x14,0x12,0xae,0x34,0x7c,0xfb,0x7e,0xb3,0x36,0x68,0x4, 0x7a, +0xb3,0x36,0x68,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xae,0x34,0x7c,0xab,0xbe,0xa0, +0xff,0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x36, +0x7e,0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, +0x12,0xae,0xbb,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe, +0xf0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x68,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36, +0x75,0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x36,0x68,0x50,0x59, +0x74,0xc, 0xac,0xbf,0x49,0x25,0x36,0x7e,0x7e,0x14,0x61,0xcc,0x12,0x64,0xd3,0xbd, +0x23,0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0x9e,0xbe,0x37,0x36,0x64,0x40,0xd, +0x7e,0x34,0x61,0xd2,0x12,0x23,0x9e,0xbe,0x37,0x36,0x6f,0x50,0x23,0x74,0x5, 0xac, +0xbf,0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, +0x50,0x8, 0x12,0x87,0x52,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x6b, +0xe4,0x7a,0xb3,0x36,0x75,0x7a,0xb3,0x36,0x69,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a, +0xb3,0x36,0x68,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x90,0x61,0xc5,0xe4,0x93,0x7c, +0xdb,0x22,0x12,0xae,0xd2,0x74,0x1, 0x7a,0xb3,0x36,0x66,0x22,0x7e,0x24,0x0, 0x2, +0x2, 0x1e,0xb9,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26,0xf5,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf3,0x2a, +0x70,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3, +0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3, +0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x90, +0x50,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f, +0x36,0x6d,0x0, 0x12,0x1f,0x7, 0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x7, 0xda,0xf8,0x22, +0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8, +0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x6f, +0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x5c, +0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x60, +0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, +0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f, +0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x74,0xc8,0x7a,0xb3,0x39,0x6, 0xc2,0x17, +0x80,0xa, 0x12,0x45,0xd6,0x30,0x17,0x4, 0x75,0xe9,0xff,0x22,0x12,0x47,0xff,0x68, +0xf1,0x22,0x74,0x1, 0x12,0x90,0xf1,0x20,0x17,0x6, 0x12,0x46,0x4e,0x12,0x90,0xfa, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x90,0xb8,0x12,0x90,0xfa,0xe4,0x2, 0x90, +0xf1,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0x22,0xd2,0x4, 0x2, 0x45,0x5a,0xa, +0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x47,0xff,0x68,0xfb,0x20,0x93,0xfd, +0x22,0x7e,0x34,0x61,0x59,0x2, 0x23,0x9e,0x7e,0xb3,0x37,0x6, 0x70,0x2e,0x7e,0x73, +0x36,0xe9,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0x3, +0x7e,0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x91,0x6d,0x7c,0xab,0xe5,0x4e, +0xa, 0x3b,0x2e,0x37,0x38,0x83,0x7a,0x37,0x38,0x83,0x80,0xc, 0x7e,0xa3,0x36,0xea, +0xbe,0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x91,0x5d,0x75,0x4e,0x0, +0x7a,0xb3,0x39,0x6, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x20,0xf0,0x7a,0x71,0x82, +0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xb3,0x38,0x86,0x70,0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x38,0x86,0x22,0x7f,0x20,0xc2,0x4, 0x7e,0x2b,0x60,0x29,0x72,0x0, +0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21,0x0, 0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32, +0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x21,0x0, 0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d, +0x32,0x12,0x21,0x0, 0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60, +0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x37,0xf3,0x4d,0x33,0x68,0x2, +0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f,0x70,0x7c, +0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e, +0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12,0x87,0xbc,0x6c,0xff,0x12,0x2f,0xff,0x7f,0x51, +0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, 0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b, +0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e,0x14,0x62,0xa, 0x12,0x87,0xee,0x8, 0xc, 0x7e, +0x27,0x28,0x8a,0xbe,0x24,0x3, 0x20,0x8, 0x2, 0x61,0x2a,0xb, 0xa, 0xc0,0x1e,0xc4, +0xbd,0x3c,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x61,0x2a, +0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0, +0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca, +0x18,0x5, 0x4e,0xf0,0x1, 0x61,0x2a,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a, +0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa, +0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc, +0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90, +0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd, +0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b, +0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, +0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, +0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b, +0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0x40,0xbd,0x3d,0x22,0x7f,0x60,0x7e,0x6b,0xa0, +0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, +0x2d,0x15,0xb, 0x14,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0, +0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76,0x7d,0x13,0x1e, +0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e, +0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b, +0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xca,0x3b,0x6d,0x11,0x7e,0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c, +0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12,0x95,0x90,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x34,0xca,0x74,0x2, 0xa, 0x3f,0x19,0xb3,0x35,0x34,0xb, 0xf0,0x12,0x5e,0x2d, +0x38,0xe1,0x12,0x97,0xc0,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0xa1,0x69,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, +0x12,0x95,0xa1,0x38,0x2, 0xa1,0x67,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x4d,0x75,0x24,0x0, 0xa1,0x3f,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xca,0xbc,0xcd,0x68,0x2, 0xa1,0x3d,0x49,0x25,0x34,0xc8,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x0, 0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc6,0x74,0x9, 0xac,0xbf,0x12,0x96,0x1b,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x34,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x20,0xa, 0x1c,0x2e,0x14,0x35,0x34,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x67,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x69,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x1f,0x8c,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x97,0xae,0xac,0x3f,0x12,0x95,0x98,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x95,0x98,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x20,0x80,0x2a,0x5, 0x24,0x90, +0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0x81,0x49,0x80,0x1a,0x6d,0x11,0x74, +0x2, 0xac,0xbd,0x12,0x95,0x90,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1,0x34,0xca,0x74, +0x2, 0xa, 0x1d,0x19,0xb1,0x35,0x34,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x25,0xe4, +0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x5f,0xc6,0xca,0x59,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x34,0xc6,0x12,0x20,0xb9,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, 0xda,0x3b,0x22, +0x59,0x15,0x35,0x20,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x1f, +0x8c,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80, +0x63,0x6c,0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac, +0xbe,0x9, 0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x95,0xa1,0x38,0xe5, +0x12,0x95,0xa1,0x28,0x43,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x81,0xb3, +0x74,0x9, 0xac,0xbd,0x12,0x87,0xe5,0x12,0x96,0x1b,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8b,0x59,0x35,0x34,0xb0,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x87,0xb3,0xb, 0xe0,0xbc,0xfe,0x38,0x99,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x21,0x0, 0x7e,0xb3,0x37,0x31,0x70,0x3, 0x12,0x93,0xe3,0x2, 0x96,0x30, +0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x96, +0x7c,0x7c,0xbf,0x12,0x97,0x10,0x4c,0xee,0x78,0x14,0x12,0x5f,0xc2,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0x80,0xb, 0x7e,0xb3, +0x2a,0x9, 0x70,0x5, 0x7c,0xbf,0x12,0x95,0xa9,0x7c,0xbf,0x12,0x9f,0x90,0xbe,0xf0, +0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4, +0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, 0x2, 0x96,0xeb,0xa5,0xbe,0x0, 0x1d,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, +0xa0,0x12,0x5e,0x25,0x38,0xed,0x74,0x1, 0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x47,0x81,0x1b, +0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x47, +0x81,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0x12,0x97,0x4, 0x7e,0x8, +0x34,0xb0,0xe4,0x12,0x20,0xde,0x90,0x60,0x99,0x12,0x97,0x8, 0x7e,0x8, 0x34,0x8b, +0xe4,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60,0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x97,0xb6,0x7c,0x7d, +0x7c,0x6f,0x12,0x97,0xb6,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x97,0xae,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x1f,0x8c,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x2e,0x34, +0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x8, 0x1f,0x34,0x12,0x9e,0x37,0x7c,0x1b,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x34,0x9f,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x34,0x9f,0x1e,0x34,0x7a,0x37,0x34,0x9f,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9f,0x7e,0x37,0x34,0x9f,0x22,0xca,0xf8,0x7c,0xfb, +0x6d,0xdd,0x7c,0xbf,0x12,0x98,0xea,0x7d,0xe3,0x7c,0xbf,0x12,0x37,0x6f,0x7d,0xf3, +0x74,0x2, 0xac,0xbf,0x9, 0x95,0x26,0xfb,0x7c,0xbf,0x12,0x9a,0xed,0x40,0x2, 0x1, +0xd4,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0xbe,0xa0,0x0, 0x28,0x9, 0xa, 0x3a, +0x1b,0x34,0x12,0x98,0xd8,0x7d,0xd3,0x12,0x98,0xdf,0xbd,0xc3,0x58,0xb, 0xa, 0xca, +0xb, 0xc4,0x7d,0x3c,0x12,0x98,0xd8,0x2d,0xd3,0x12,0x9b,0xf, 0x7d,0xd3,0xbe,0xa0, +0x0, 0x28,0x56,0x12,0x98,0xdf,0xbd,0xc3,0x58,0x4f,0xbe,0x90,0x0, 0x28,0x4a,0xbe, +0x90,0x0, 0x28,0x45,0xbe,0xf4,0x0, 0xc8,0x8, 0x3f,0x7d,0x3d,0x3e,0x34,0x3e,0x34, +0xbd,0x3f,0x8, 0x35,0x7e,0x70,0x2, 0xac,0x79,0x49,0x33,0x4, 0xfc,0xbe,0x34,0x1, +0x2c,0x8, 0x26,0xa, 0x2a,0x7e,0xb3,0x2a,0x74,0x12,0x9b,0x18,0xbe,0x34,0x1, 0x90, +0x8, 0x17,0xbe,0xf4,0x1, 0x5e,0x58,0xd, 0x7e,0x34,0x0, 0x3, 0xad,0x3e,0xbd,0x3f, +0x8, 0x3, 0xe4,0x80,0x30,0x74,0x1, 0x80,0x2c,0x90,0x60,0xab,0xe4,0x93,0xbc,0xb9, +0x78,0x22,0x7c,0xba,0x7c,0x79,0x12,0x2c,0x40,0xbe,0x34,0x0, 0x96,0x8, 0x12,0x74, +0x2, 0xac,0xb9,0x49,0x35,0x4, 0xfc,0xbe,0x34,0x0, 0x32,0x8, 0x4, 0x74,0x1, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xb7,0x7c,0x79,0x2, 0x2c,0x40,0x7e, +0xb3,0x2a,0x6f,0xa, 0x3b,0x1b,0x34,0xa, 0xca,0x22,0xca,0x79,0x7c,0x8b,0x6c,0xaa, +0x9f,0x77,0x12,0x9a,0x2a,0x1a,0x79,0x1b,0x74,0x80,0x4c,0x1a,0x38,0x1b,0x34,0x7c, +0xe7,0x80,0x38,0xbc,0x9f,0x78,0x4, 0xbc,0x8e,0x68,0x2e,0xbe,0xf0,0x0, 0x48,0x29, +0x7e,0xb3,0x2a,0x6f,0xa, 0x2b,0x1a,0x3f,0xbd,0x32,0x58,0x1d,0xbe,0xe0,0x0, 0x48, +0x18,0x7e,0xb3,0x2a,0x70,0xa, 0x2b,0x1a,0x3e,0xbd,0x32,0x58,0xc, 0x7c,0xbf,0x7c, +0x7e,0x12,0x2c,0x40,0x12,0x99,0x65,0xb, 0xa0,0xb, 0xe0,0x1a,0x28,0xb, 0x24,0x1a, +0x3e,0xbd,0x32,0x8, 0xbe,0xb, 0xf0,0x1a,0x29,0xb, 0x24,0x1a,0x3f,0xbd,0x32,0x8, +0xaa,0x4c,0xaa,0x78,0x4, 0x6d,0x33,0x80,0x9, 0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12, +0x1f,0x58,0xda,0x79,0x22,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7, +0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f,0x34,0x7e,0xb3,0x2a,0x70,0x7a,0xb3, +0x1f,0x35,0x12,0x9a,0x2a,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x41,0x17,0x7a, +0xf1,0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d, +0x32,0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a, +0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d, +0x32,0x7c,0xb7,0xf5,0x2c,0x80,0x40,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58, +0x10,0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5, +0x2e,0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b, +0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12, +0x2c,0x40,0x12,0x99,0x65,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x2c,0x1a, +0x3b,0xbd,0x32,0x8, 0xb2,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd, +0x32,0x18,0x2, 0x21,0x8f,0x7f,0x17,0xda,0x79,0x22,0x7e,0x70,0x2, 0xac,0x78,0x9, +0x93,0x26,0xfa,0x9, 0x83,0x26,0xfb,0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x62,0x27, +0x12,0x9a,0xe5,0x12,0x9b,0x23,0x50,0x2, 0x41,0xe0,0x7e,0x34,0x62,0x2b,0x12,0x23, +0x9e,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, 0x41,0xe0,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x9a,0xe5,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x4, 0x4c,0x8, 0x6b,0x6c,0xdd,0x80,0x5f,0xc2,0x3, 0x7c,0xbd,0x12,0x37,0x6f, +0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x99,0x6c,0x7a,0x35,0x24,0x9e,0x35, +0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0xdc,0x7a,0x35, +0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, +0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x9a,0xed, +0x50,0x2, 0xc2,0x3, 0x30,0x3, 0xf, 0x7c,0xbd,0x6c,0x77,0x12,0x51,0x5f,0x7e,0x70, +0x2, 0xac,0x7d,0x12,0x37,0x9f,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x99, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x7c,0x4b,0x74, +0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc, +0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x2, 0x1e,0xb9,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33, +0x4, 0xfc,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x37,0x6f,0xbe,0x34, +0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0xe9, +0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0x3b,0x7e,0x77,0x2a,0x5c,0x12, +0x9d,0xa1,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x9b,0xd7,0x7e, +0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x35,0xe5,0xbd,0x36,0x48,0x7, 0x3e,0x34,0x3e, +0x34,0x12,0x9b,0xd7,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0x9b,0x23,0x50,0x6, 0x7e, +0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60,0xc, 0x7e, +0xb3,0x35,0xe3,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xe3, +0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x45,0xe, 0x7e,0x53,0x35,0xe3,0xbe,0x50,0x0, +0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, 0x7d,0xfe, +0x7a,0xf7,0x2a,0x5c,0x12,0x9b,0xdf,0x28,0x3, 0x12,0x37,0xc2,0x7a,0x67,0x35,0xe5, +0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xb9,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x79,0xc2,0x3, 0x7e,0xf0,0x3, 0x7e,0xe3, +0x2a,0x3, 0x12,0x9b,0xdf,0x28,0x72,0x7c,0xbf,0x12,0x2c,0x47,0x4c,0xee,0x68,0xe, +0x7e,0x63,0x33,0xc0,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x33,0xc1,0x70,0x4, 0xd2,0x3, +0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x4d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x3, +0x80,0x1e,0xd2,0x3, 0x12,0x9c,0xf6,0x78,0xa, 0xa5,0xbe,0x0, 0x6, 0x6c,0xff,0xc2, +0x3, 0x80,0xd, 0x9e,0x73,0x33,0xc0,0xbc,0x7e,0x78,0x5, 0x7e,0xf0,0x2, 0xc2,0x3, +0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x2c,0x47,0x7e,0xa3,0x33,0xc2,0x7a,0xa3,0x28,0x84, +0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x33,0xc3,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9, +0x1b,0xfd,0x12,0x9c,0x6f,0xf5,0x4d,0x80,0x3, 0x75,0x4d,0x64,0xda,0x79,0x22,0x7e, +0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80, +0x42,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x9c,0xee,0x9, 0xb3,0x26, +0xfa,0x12,0x2f,0xd6,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12, +0x9c,0xee,0x9, 0xb3,0x26,0xfb,0x12,0x2f,0xd6,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, +0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c, +0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28, +0x84,0xbc,0xb1,0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c, +0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0xca,0x79,0x6c, +0x88,0x80,0x72,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a, +0x71,0x24,0x7c,0xbf,0x12,0x9d,0x8b,0x50,0x5a,0x6c,0xee,0x80,0x51,0xbc,0xe8,0x68, +0x4b,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9d,0x80,0xf5,0x26,0x6c,0x99,0x90,0x60,0xaa, +0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, 0x2f, +0xe5,0x25,0xa, 0x3b,0x12,0x35,0x67,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, 0x78, +0x1b,0x7c,0xbe,0x12,0x37,0x6f,0x7d,0xf3,0x7c,0xb8,0x12,0x37,0x6f,0xbd,0x3f,0x8, +0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x51,0x5f,0xb, 0xe0,0x12,0x9c, +0xf6,0x38,0xaa,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0x86,0xda,0x79,0x22, +0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0x22,0x7c,0xab,0x90,0x60,0xab, +0xe4,0x93,0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x31,0x5a,0x50,0x2, 0xd3,0x22,0xc3, +0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84,0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12, +0x2f,0xb7,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb, +0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x40,0x7d,0xf3,0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, +0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x2, 0x70,0x2d, +0x7e,0x73,0x2a,0x3, 0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc5,0x70,0x18,0x12, +0x9e,0x17,0x7e,0x73,0x2a,0x3, 0x7a,0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, +0x7e,0xb3,0x34,0xc5,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc5,0x22,0xe4,0x7a,0xb3, +0x34,0xc5,0x7a,0xb3,0x2a,0x9, 0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x35, +0xe9,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73, +0x35,0xe8,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0xc1, +0xd2,0x7c,0x57,0xc1,0xca,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98, +0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff, +0x68,0x66,0x12,0x9e,0xe2,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e, +0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, +0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x9e,0xe2, +0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7, +0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0xc1,0x45, +0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6,0x28,0x2, 0xc1,0x41,0x7c,0xba,0xda, +0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0x7c,0xab,0x7e,0xb, +0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x34,0xa3,0xbe,0x73,0x34,0xad, +0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa3,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22, +0xbe,0x73,0x34,0xad,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74, +0xff,0x19,0xb4,0x34,0xa3,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x34,0xa3,0xbe,0xb0,0xff, +0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa3,0xd3,0x22,0xe4,0x19,0xb3,0x34,0xa3,0xc3,0x22, +0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34, +0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x5, 0xbe, +0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34, +0xb0,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x34,0x8b,0x80,0x4, 0x59,0x35,0x34,0x8b,0x59, +0xf5,0x34,0xb0,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x25,0x3c, +0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x25,0x3c, +0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28, +0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90, +0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0x12,0x5e,0x25, +0x38,0xb2,0x22,0x7e,0x8, 0x34,0xa2,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20,0xde,0x6c, +0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12,0x2f,0xb7,0x60,0xa, 0x12,0xa0,0x84,0x40, +0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5, +0x7c,0xb0,0x6c,0x77,0x12,0xa0,0x49,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70, +0x1, 0x12,0xa0,0x49,0xb4,0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x2f,0xb7, +0x60,0xc, 0x12,0xa0,0x84,0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x51,0x5f,0xb, 0x10, +0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3,0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e, +0xb3,0x36,0x61,0x7a,0xb3,0x36,0x62,0x7a,0xa3,0x36,0x61,0x7e,0xb3,0x36,0x62,0x60, +0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e,0xb3,0x36,0x63,0x60, +0x5, 0x14,0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x0, 0x28,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c, +0xa7,0x90,0x60,0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, +0x80,0x71,0xbe,0xb0,0x2, 0x38,0x66,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27, +0x7e,0x73,0x26,0xfa,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26, +0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x2, +0x80,0x4e,0x6c,0xff,0x80,0x30,0x7c,0xbf,0x12,0x37,0x81,0x1a,0x4b,0x7c,0xbf,0x12, +0x37,0x6f,0x7d,0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d, +0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, 0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75, +0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xcb,0x80,0x6, 0xe5,0x1e,0x24, +0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, +0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22,0x7e,0x39,0x70,0xa, 0x37,0x9d,0x32,0x2, +0x21,0x0, 0xca,0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6, +0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd, +0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f,0x46,0x75,0x2b,0x0, 0x61,0x43,0x12,0xa4, +0xde,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b, +0x2e,0x34,0x14,0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x22,0xff,0x12,0x20,0xb9,0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a,0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35, +0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff,0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a, +0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5,0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xa4, +0xe6,0x2e,0x35,0x36,0x12,0xa1,0x48,0x7d,0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58, +0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, 0x3b,0x7f,0x3, 0x12,0xa4,0xe6,0x2e,0x35, +0x38,0x12,0xa1,0x48,0x7d,0xc3,0x7e,0x35,0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32, +0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37,0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a, +0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c, +0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5,0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb, +0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0x61, +0x41,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60, +0x8, 0x2, 0x61,0x41,0x80,0x28,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, +0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x61,0x41,0xbe,0x34,0x0, 0x30,0x8, +0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x61,0x41,0x7e,0xa3, +0x38,0x41,0x74,0xc, 0xa4,0xbe,0x57,0x22,0xf9,0x58,0x2, 0x61,0x41,0x7e,0xa3,0x38, +0x42,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58,0x2, 0x61,0x41,0x7e,0x15,0x36,0x6d,0x0, +0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xa3,0x7e,0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d, +0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xa3,0x7e,0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73, +0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38,0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b, +0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4,0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10, +0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33,0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7c,0xb7,0xf5,0x2e,0xe5,0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37, +0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34,0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e, +0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22, +0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35,0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a, +0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a,0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22, +0xf6,0x5, 0x2b,0x12,0xa4,0xde,0x28,0x2, 0x21,0x7e,0x7e,0xa3,0x22,0xf7,0xbe,0xa1, +0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe,0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50, +0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, 0x34,0x7a,0x73,0x38,0x3e,0x7a,0xb3,0x38, +0x40,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x38,0x3e,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a, +0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43,0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14, +0x12,0xa4,0xd6,0x7a,0x55,0x4a,0xa, 0x5e,0x7f,0x16,0x12,0xa4,0xd6,0x7a,0x55,0x48, +0x7e,0x35,0x48,0x12,0xa4,0xcf,0x2f,0x50,0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a, +0x0, 0x2f,0x70,0x12,0xa4,0xcf,0x12,0xa4,0xc5,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d, +0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4a,0x12,0xa4,0xc5,0x7e,0x1d,0x40, +0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12, +0xa4,0xc5,0x7e,0x1d,0x44,0x2f,0x10,0x7a,0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c, +0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x1f,0x58,0x7f,0x51,0x7f,0x17,0x7f, +0x6, 0x12,0x1f,0x58,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12, +0x1e,0xfc,0x7e,0x87,0x23,0x43,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x3c,0x7e,0x1d,0x40,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x40,0x7e,0x1d,0x44,0x7d,0x19,0x12,0x1e,0xfc,0x7d,0x18, +0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x58,0x7a,0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1e, +0xeb,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12,0x1e,0xeb,0x7e,0x5d,0x3c, +0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1e,0xeb,0x7e,0x7d,0x40,0x9f,0x71,0xbe,0x58, +0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18, +0x7f,0x16,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x5, 0x12,0x1f,0x58,0x7f,0x6, 0x12,0x1e, +0xeb,0x7f,0x7, 0x12,0x1f,0x58,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44, +0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0x7f,0x1, 0x22,0x7d, +0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x39,0x1, 0xbe,0x71,0x2b,0x22,0x2d,0x13,0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79, +0x6c,0xaa,0x12,0xa5,0xe4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf, +0x38,0x43,0x7f,0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x38, +0x63,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda,0x7e,0x8, 0x38,0x43,0x7e,0x18,0x38,0x63, +0x74,0x20,0x12,0xa1,0x52,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73, +0x38,0x3f,0xbe,0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22, +0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0x33,0x38,0x3f,0xa, 0x13,0x6d,0x0, 0x12, +0x1f,0x7, 0x7c,0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64, +0xa, 0x3e,0x1b,0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xa5,0x92,0x7f,0x6, 0x7c, +0xbd,0x7c,0x7c,0x12,0xa5,0x92,0xb, 0xf0,0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x50,0xbc, +0x7f,0x5, 0x7f,0x16,0x12,0xa4,0xee,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x38,0x3e,0xda, +0x3b,0x22,0x7c,0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d, +0x2, 0xb, 0xa, 0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, +0x7c,0x21,0xa5,0xba,0x0, 0x14,0x1a,0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d, +0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, +0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35, +0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xe4,0x7a, +0xb3,0x35,0x69,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x5, 0xe4, +0x7a,0xb3,0x35,0xe4,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x4f,0x12,0xa6,0x4e,0x28, +0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0xdc,0xbe,0x37, +0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x3, 0x70,0x17,0x7e, +0xb3,0x37,0x8, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28, +0x5, 0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0xb3, +0x28,0x84,0xbe,0xb0,0x0, 0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x6e, +0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c, +0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x4a,0x12,0xa6,0xff,0x78, +0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x21, +0x0, 0x7d,0x13,0x7d,0x3e,0x12,0x21,0x0, 0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5, +0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33,0x9e,0x35,0x2e,0xbd,0x3e,0x8, +0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, +0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xae,0x7e,0x73, +0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80, +0xa, 0x12,0xa6,0xff,0x78,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc, +0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0xc1,0x71,0xda,0x3b,0x22,0xa, +0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22, +0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d, +0x0, 0x7f,0x14,0x12,0x1f,0x58,0x7d,0x73,0x12,0x21,0x0, 0x7d,0xe3,0x7d,0x3f,0x12, +0x21,0x0, 0xbd,0x3e,0x22,0x7e,0x63,0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c, +0xc2,0x12,0x6c,0x33,0x80,0x56,0x90,0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac, +0x93,0x90,0x60,0xab,0xe4,0x93,0xa, 0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4, +0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a, +0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x31,0x5a,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f, +0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, 0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, +0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75, +0xbc,0x73,0x38,0xa2,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x32,0xe7,0x22,0x90,0x60,0xa7, +0xe4,0x93,0x60,0x8, 0x30,0x12,0x5, 0x12,0x31,0x7d,0xc2,0x12,0x22,0xca,0xd8,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x22,0xe6,0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x1f,0xad,0x6d,0x11,0x7e,0x4, +0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0xa8,0xe1,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d, +0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, +0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x1, 0xd2,0xbe,0xd4,0x4, +0xb0,0x8, 0x2, 0xd2,0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd, +0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7, +0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x1, 0xd2,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, +0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0xa8,0xe1,0x1a,0x26,0x1a,0x24,0x2f, +0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0xa8,0xd7,0x9f,0x55,0x6c,0xee, +0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12, +0x21,0x0, 0x7d,0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, +0x1d,0x12,0xa8,0xd7,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, +0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea, +0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x58,0x7d,0x13, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x0, 0xca, +0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x80,0xc2,0x3, 0x6d,0x44,0x80,0x32, +0x12,0xa9,0x90,0x12,0xa8,0xe9,0xbd,0x3d,0x48,0x26,0x12,0xa9,0x90,0xb, 0x1a,0x30, +0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0xd2,0x3, 0x80,0x9, 0x12,0x21,0x0, 0xbd,0x3d,0x68, +0x2, 0xc2,0x3, 0x7d,0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa8,0xe9,0x7d,0xd3, +0xb, 0x44,0x7e,0xc5,0x35,0xbd,0xc4,0x38,0xc7,0x30,0x3, 0xc, 0x7e,0xf0,0x7f,0x80, +0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba,0x7d,0x3d,0x60,0x5, 0xe, 0x34, +0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f,0x10,0x2e,0x35,0x35,0x7a,0x1b, +0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30, +0x7f,0x60,0x2e,0xd5,0x35,0x7e,0x6b,0xb0,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0x7c, +0xb7,0x12,0xa9,0x9b,0xb, 0x44,0x7e,0x55,0x35,0xbd,0x54,0x38,0xd8,0xda,0xf8,0x22, +0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a, +0x1b,0xb0,0x22,0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5, +0x1, 0x6c,0xaa,0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0xa9,0x99,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xed,0xc2,0xc9,0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, +0x7e,0x73,0x2a,0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0xad,0x13, +0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x38,0xd9, +0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, +0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35,0x35,0x7e,0xf, 0x37, +0x40,0x7e,0x18,0x25,0xb6,0x2, 0xa8,0xef,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12, +0xaa,0x51,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37, +0x24,0xf6,0x12,0xaa,0x58,0x12,0xaa,0x61,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, +0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, +0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2, +0x22,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53, +0x2a,0x6d,0xac,0x54,0x7e,0x17,0x28,0xa1,0x12,0xaa,0x51,0x6d,0x0, 0x80,0x37,0x7d, +0x40,0x3e,0x44,0x7e,0x7f,0x38,0xd9,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10, +0x7d,0xf4,0x2e,0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14, +0x6d,0x55,0x9d,0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d, +0x51,0x1b,0x48,0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22,0x7c,0xab,0x7e,0x8, 0x29, +0xbc,0x12,0x5e,0x25,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0,0xb4, +0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31,0x7d, +0x20,0x39,0xb1,0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0x61,0x96,0x90,0x60, +0xa7,0xe4,0x93,0x70,0x2, 0x61,0x96,0x6c,0xff,0x61,0x8f,0x7e,0x70,0x9, 0xac,0x7f, +0x9, 0xe3,0x29,0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, +0x7d,0x3d,0x12,0xab,0xa4,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, +0x7d,0x34,0x1b,0x34,0x12,0xab,0x9b,0x7c,0xbe,0x12,0xaa,0xbb,0x80,0x3f,0x7e,0x70, +0x2, 0xac,0x7d,0x2e,0x34,0x60,0xc5,0x12,0x87,0xbc,0x74,0x9, 0xac,0xbf,0x59,0xd5, +0x29,0x8, 0x7e,0x34,0x60,0xcf,0x12,0x23,0x9e,0x12,0xab,0x9b,0x80,0x1f,0xbd,0xc4, +0x40,0x1b,0x7d,0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0xaa, +0xbb,0x7d,0xc4,0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12, +0x5e,0x2d,0x28,0x2, 0x61,0xb, 0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59, +0x35,0x29,0xa, 0x22,0x6c,0xaa,0x80,0x27,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e, +0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14, +0x60,0xb3,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0xb, 0xb, 0xa0,0x90, +0x60,0xa7,0xe4,0x93,0xbc,0xba,0x38,0xd0,0x7c,0xba,0x22,0x90,0x60,0xa7,0xe4,0x93, +0x60,0x2b,0x6c,0x33,0x80,0x1f,0x7c,0xb3,0x12,0x31,0x5a,0x40,0x16,0x7c,0xb3,0x12, +0x31,0x27,0x7d,0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x1b,0x1a,0x50,0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0xac, +0x20,0x7e,0x14,0x62,0x7, 0x12,0x87,0xee,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22, +0x6d,0x11,0xe4,0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x7f,0x38,0xf3,0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12, +0x21,0x0, 0xbd,0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xf3,0x2d, +0x13,0x69,0x20,0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x81,0xbf,0x7e,0x10,0x2, 0xac, +0x1a,0x7e,0x1f,0x38,0xf3,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78, +0x4, 0x7e,0x14,0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e, +0x14,0x7f,0xff,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22, +0x6c,0x66,0x7e,0x27,0x39,0x4, 0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e, +0xb3,0x28,0xac,0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xab,0xbc,0x76,0x50,0xf, 0xe4,0x7a, +0xb3,0x28,0xad,0x12,0x8a,0x87,0x7e,0xb3,0x2f,0xab,0x4, 0x80,0x4, 0xe4,0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xab,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xac, +0xbe,0xa0,0x5, 0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74, +0x5, 0x80,0x1, 0xe4,0x7a,0xb3,0x2f,0xac,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8, +0x30,0x1, 0xe, 0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, +0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d, +0x23,0xa, 0x3a,0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f, +0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac, +0x56,0x49,0x22,0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e, +0xb3,0x2a,0x6d,0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, +0x2, 0xc2,0x3, 0xa2,0x3, 0x22,0xc2,0x3, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1, +0x60,0x4, 0xd2,0x3, 0x80,0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57, +0x49,0x12,0x4, 0xfc,0x7e,0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d, +0x22,0x9d,0x20,0xbd,0x12,0x58,0x4, 0xd2,0x3, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e, +0x14,0x0, 0x3, 0xa, 0x27,0xbd,0x21,0x48,0xd2,0xa2,0x3, 0x22,0x7d,0x23,0x7e,0x14, +0x61,0xc8,0x12,0x64,0xd3,0x7e,0x14,0x0, 0x5, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50, +0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x8, 0x50,0x45,0x74,0x8, 0x80,0x3d,0x7d,0x13, +0x3e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x6, 0x50,0x30,0x74, +0x6, 0x80,0x28,0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e, +0x33,0x36,0xdc,0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, 0x80,0xf, 0xbd,0x32,0x50,0xf, +0x7e,0x73,0x36,0xdc,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xdc,0x7e, +0xb3,0x36,0xdc,0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a,0xb3,0x36,0xdc,0x74,0x1, 0x7a, +0xb3,0x16,0x92,0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3,0x36,0xdc,0x50,0x5, 0xe4,0x7a, +0xb3,0x16,0x91,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0xae, +0xad,0x68,0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0xae,0xc5,0x7d,0x23,0x7e,0x70,0xc, +0xac,0x72,0x59,0x23,0x36,0x82,0x49,0x3, 0x36,0x82,0x49,0x23,0x36,0x7e,0xbd,0x20, +0x50,0x4, 0x59,0x3, 0x36,0x7e,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22, +0x80,0x18,0x12,0xae,0xad,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7e, +0xbd,0x4, 0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37, +0x36,0x64,0xbe,0x37,0x36,0xdd,0x50,0x8, 0x7e,0x37,0x36,0xdd,0x7a,0x37,0x36,0x64, +0x12,0xae,0xbb,0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, +0xac,0x12,0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, 0x22,0x7e,0x70,0xc, 0xac,0x7a, +0x49,0x33,0x36,0x7e,0x22,0x49,0x23,0x36,0x84,0x49,0x33,0x36,0x80,0x9d,0x32,0x2, +0x21,0x0, 0x7e,0x8, 0x36,0x7a,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x20,0xde,0x6c,0xaa, +0x7e,0x44,0xff,0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7c,0x59,0x43,0x36, +0x84,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x68,0x7e,0x34,0x0, 0xd, +0xe4,0x2, 0x20,0xde,0x7e,0xa3,0x2b,0x62,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62, +0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4,0x2, 0xa, 0x66,0x22,0xc2,0xc, 0x7e, +0x8, 0x2a,0x6d,0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x6d,0x74,0x3, 0x2, 0x11,0x7a,0xe4, +0x7a,0xb3,0x36,0x67,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59, +0x43,0x36,0x7e,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xee,0xe4,0x7a,0xb3,0x36,0x68,0x6d, +0x33,0x7a,0x37,0x36,0x6f,0x7a,0x37,0x36,0x64,0x22,0x7e,0xb3,0x36,0x6a,0xb4,0x1, +0x27,0x7e,0xb3,0x36,0xe0,0x4, 0x7a,0xb3,0x36,0xe0,0x7e,0x73,0x36,0xe0,0xbe,0x70, +0x3, 0x40,0x15,0x12,0x8c,0x90,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x6, 0x40,0x9, 0xe4, +0x7a,0xb3,0x36,0xe0,0x7a,0xb3,0x36,0x6a,0x22,0x12,0x24,0x14,0xe4,0x7a,0xb3,0x3, +0xfe,0x2, 0x76,0x52,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88, +0x7e,0xf0,0x1, 0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f, +0x7f,0x7, 0x2d,0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc, +0x9f,0x38,0xe2,0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0, +0x1, 0x2, 0xb0,0x54,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, +0x80,0x36,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26, +0xfb,0xe5,0x44,0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16, +0x5, 0x45,0xa, 0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0xb0,0x62,0xbd,0x3d,0x8, +0x5, 0x12,0xb0,0x62,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe, +0xb0,0x0, 0x28,0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba, +0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x33,0xc3,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a, +0x19,0x72,0x33,0xc4,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x30,0x3, 0x1b,0x1a,0xd0, +0xb, 0xa0,0xb, 0xf0,0xbc,0x8f,0x40,0x3, 0x2, 0xaf,0xd4,0x7c,0xba,0xda,0x79,0xda, +0xd8,0x22,0x7c,0xbe,0x7c,0x7d,0x2, 0x2c,0x40,0x7c,0x9b,0x7f,0x71,0x7f,0x60,0x7e, +0x34,0x22,0xb8,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f,0x52,0x74,0x2a,0x12,0x1f,0xad, +0x7e,0x58,0x1f,0x52,0x7c,0xb9,0x7e,0x71,0x44,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x45, +0x7e,0x71,0x46,0x12,0x2c,0x40,0x2d,0x34,0xe, 0x34,0x7f,0x5, 0x7e,0x50,0x7, 0xb, +0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, 0x1b,0x6a,0x30,0x69,0x30,0x0, +0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe2,0x22,0x6d,0x33, +0x7d,0x23,0x7d,0x3, 0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x6e, +0xac,0xb3,0xa, 0x42,0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4, +0xb, 0x7a,0x40,0xbe,0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, +0x24,0xbe,0x44,0xff,0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, +0x34,0xb, 0x21,0x7e,0x93,0x2a,0x6e,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb3,0x38,0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e, +0x14,0x1e,0x14,0x12,0x25,0x3e,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a, +0xb3,0x39,0x8, 0x7e,0xb3,0x39,0x9, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39, +0x9, 0x80,0x3c,0xe4,0x7a,0xb3,0x39,0x9, 0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22, +0xbd,0x32,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x9, 0x7e,0xb3,0x39,0x8, 0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x8, 0x80,0x16,0xe4,0x7a,0xb3,0x39,0x8, 0x74,0x2, +0x80,0x9, 0xe4,0x7a,0xb3,0x39,0x8, 0x7a,0xb3,0x39,0x9, 0x7a,0xb3,0x39,0xa, 0x7e, +0xb3,0x39,0xa, 0x22,0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x39,0xb, 0x22,0xca,0xd8, +0xca,0x79,0xc2,0x3, 0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7,0x28,0x97, +0x7e,0x37,0x37,0xfb,0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff,0x7e,0xa3, +0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14,0x24,0xc2, +0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83,0x2a,0x6d, +0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99,0x80,0xf, +0x7c,0xb9,0x12,0x37,0x6f,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, 0x90,0x7e, +0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x61,0x4f,0x7e,0xa3, +0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3,0x26,0x83, +0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34,0x49,0x23, +0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, 0x6d,0x33, +0x9d,0x3e,0x12,0x8f,0xdc,0xbd,0x3, 0x8, 0x4, 0xd2,0x3, 0x80,0x6, 0xb, 0x90,0xbc, +0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe,0xe7,0x7, 0xf8,0x8, 0x2, 0xc2, +0x3, 0x30,0x3, 0x20,0x7e,0xb3,0x39,0xb, 0x4, 0x7a,0xb3,0x39,0xb, 0x7e,0x23,0x39, +0xb, 0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x39,0xb, 0x74,0x1, 0x7a,0xb3, +0x28,0xa8,0x80,0xf, 0x7e,0x23,0x39,0xb, 0xbe,0x20,0x0, 0x28,0x6, 0x1e,0x20,0x7a, +0x23,0x39,0xb, 0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28,0x69,0x7e, +0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68,0x59,0x7e, +0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, +0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x2c,0x3c,0xbe,0x34,0x0, 0x96,0x8, 0x5, +0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38,0xdb,0x6c, +0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3,0x27,0x37, +0x12,0x2c,0x3c,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90, +0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x17,0xa, 0xe9,0xa, 0x5f, +0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x39,0xc, 0x4, +0x7a,0xb3,0x39,0xc, 0x7e,0x73,0x39,0xc, 0xbe,0x70,0x5, 0x28,0x22,0x74,0x5, 0x7a, +0xb3,0x39,0xc, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x15,0x12,0xb1,0x84,0x80,0xf, +0x7e,0x73,0x39,0xc, 0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x39,0xc, 0xda, +0x79,0xda,0xd8,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34,0x0, 0x38,0xca,0x39,0xac,0x7f, +0x2e,0x34,0x0, 0x50,0x6d,0x22,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, 0x30,0x6d,0x22,0x7e,0x8, 0x3, +0x60,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0x3e, +0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x20,0xde,0x90,0x60,0x93,0x93,0xa, 0x3b,0x7e, +0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43,0x6c,0x77,0x80, +0x1d,0xa, 0x27,0x2d,0x24,0x12,0x87,0xdc,0xb, 0xa, 0x0, 0x7e,0x30,0x2, 0xac,0x37, +0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, 0x70,0xbc,0xa7, +0x38,0xdf,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x13,0xc6, +0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24,0x13,0x8e,0x9d,0x31,0x1b,0x28, +0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38,0xdc,0x22,0x7c,0xab,0x12,0xb4, +0xb, 0xd2,0x16,0x7c,0xba,0x12,0x86,0xf8,0xc2,0x16,0x22,0xa9,0xd1,0xcb,0x74,0x1, +0x2, 0x0, 0xe, 0x12,0xb4,0xb, 0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x6d,0x12,0xb4, +0x4c,0x12,0xb4,0x2f,0x7a,0x37,0x38,0xd6,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x6d, +0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb5,0x19,0x90,0x60, +0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb4,0x80,0x22,0x7a,0xb3,0x24,0xf2, +0x7e,0x53,0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa,0xe4,0x7a,0xb3,0x24, +0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24,0xf6,0x7e,0x34,0x0, +0x20,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x7a,0x37,0x24,0xfc,0x7e,0x8, 0x24,0xf2,0x22, +0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e,0xa, 0xd8,0x90,0x60,0x94,0xe4, +0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x18,0x7e,0x70,0x2, 0xac, +0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, 0x5a,0xc0,0x9d,0xc2,0x59,0xc3, +0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60,0x92,0xe4,0x93,0x7c,0x9b,0x6d, +0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92,0xe4,0x93,0xa, 0xcb,0x1b,0xc4, +0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x7d,0x23, +0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d,0x3e,0x34,0x2d,0x31,0x7d,0x20, +0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x0, 0x7d,0xa3,0xbd,0xfa,0x58,0x2, +0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8,0x2d,0xec,0x2d,0xdc,0xb, 0xf0, +0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca,0xf8,0x6d,0x44,0x7e,0xf3,0x2a, +0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3,0x2a,0x6d,0xa, 0xeb,0x2d,0xef, +0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x31, +0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda,0x2d,0xdf,0x3e,0xd4,0x7e,0x1f, +0x38,0xd9,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x50,0x2d,0xb2, +0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, 0xa0,0xbc,0xfa,0x38,0xd9,0x80, +0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x38,0xd9,0x2d,0x15,0x6c,0xaa,0x80,0x2c,0xa, +0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x38,0xd9,0x2d,0x3e,0xb, 0x1a,0xe0,0x7e,0x70, +0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0,0x7d,0x3e,0x9d,0x3d,0x12,0x21, +0x0, 0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, 0xa0,0xbc,0xfa,0x38,0xd0,0x7d, +0x34,0xda,0xf8,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9,0xc5,0xea, +0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x4e,0x7e,0x73,0x39,0x6, +0xbe,0x71,0x4e,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9,0x34,0xe5, +0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x33,0xe5, +0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5,0x3, 0xa9, +0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8,0x22,0x7e, +0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79,0x30, +0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79,0x30, +0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79,0x30, +0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd0,0xce,0xa2,0x3, 0xa9,0x95,0xc9,0x22, +0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0xa9,0xc2,0xeb,0xa9,0xd2, +0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9, +0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, 0x75,0x8b,0x0, 0xd2,0x8e, +0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7,0x0, 0x75,0xf8,0x0, 0xa9, +0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xc1, +0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7,0xc2,0xbe,0x22,0x75,0xe7, +0x6b,0x2, 0xb6,0xc4,0xe4,0x7e,0x34,0xd7,0xfc,0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0, +0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0x7e,0x37,0x39,0x4, 0xb, 0x34,0x7a,0x37,0x39,0x4, 0xbe,0x34,0xff,0x0, +0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37,0x39,0x4, 0x22,0x7c,0x6b,0x6c,0x77,0x6c, +0xaa,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x46,0x12,0xb7,0xb9,0x75,0xb5,0x5, 0xa9,0x36, +0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3, +0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5, +0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47, +0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0x22,0x74,0x6, +0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73,0x7d,0x52,0x7c,0xab,0x7e,0xb3, +0x39,0x13,0xb4,0xa5,0x3c,0x12,0xb7,0xb9,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0x12, +0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2, +0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0xb7,0x62,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x22, +0x74,0x2, 0x7d,0x3f,0x2, 0xb7,0x62,0x7d,0x42,0x7f,0x60,0x7d,0x3, 0x12,0xb8,0x38, +0x74,0x2, 0x12,0xb6,0xfb,0x7d,0xf3,0x4e,0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, 0x12, +0xb7,0xc0,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f,0x6, 0x12,0xb8,0x64,0x5e,0xf4, +0xff,0xfd,0x12,0xb7,0xc0,0x2, 0xb7,0xf8,0xa9,0xc5,0xca,0xe4,0x7a,0xb3,0x39,0x13, +0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12,0xb6,0xfb,0x4c,0xff,0x78,0x5, 0x5e,0x70, +0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0xb7,0x62,0xda,0xf8,0x22,0xd2,0xc8, +0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0xb8, +0x38,0xe4,0x12,0xb8,0x1, 0x2, 0xb7,0xf8,0xa9,0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1, +0xea,0x74,0xa5,0x7a,0xb3,0x39,0x13,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24,0xbd, +0x32,0x38,0xe9,0x22,0x12,0xb8,0x72,0x7e,0x35,0x36,0x12,0xb8,0x48,0xa9,0xd2,0xb4, +0xd3,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5,0xa, 0x44,0xf5,0x39,0x7f,0x21, +0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xb8,0x9d,0xe5,0x3a,0x12,0xb8,0x9d,0xe5, +0x39,0x12,0xb8,0x9d,0xe5,0x38,0x12,0xb8,0x9d,0xe4,0x2, 0xb8,0x9d,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c, +0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, +0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74, +0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x97,0xbe,0x90,0x1, +0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe, +0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18, +0xb2,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xb9,0x5c,0xb, 0x7a,0x20, +0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d, +0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25, +0x3c,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, +0xf9,0x2d,0xf1,0x7d,0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77, +0x14,0x78,0xfb,0x4d,0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xd9,0x7e,0x8, +0x1f,0x3c,0x12,0xba,0x1a,0xd2,0x3, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xb9,0x64, +0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32, +0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, +0x12,0xba,0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7, +0x38,0xee,0x12,0xba,0x7, 0xe4,0x12,0xba,0xf, 0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a, +0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xba,0x7, 0x74,0x1, 0x12,0xba,0xf, 0x74, +0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12, +0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x1c,0x74,0x3f, +0x2, 0x20,0xde,0x7e,0x8, 0x1f,0x34,0x12,0xba,0x1a,0x6c,0x77,0x80,0xe, 0x12,0xba, +0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x6e, +0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9, +0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x44,0xa, +0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57,0x7c,0xab, +0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46, +0x2e,0x44,0x20,0x73,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b,0xbe,0x60, +0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb, +0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b, +0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70, +0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbb,0x29,0x60,0x5, 0x3e, +0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16, +0x9e,0x60,0xe, 0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b, +0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72, +0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12,0x77,0xf6,0xb, 0x24,0xa, 0x33,0xbd,0x32, +0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28, +0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f, +0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d, +0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a, +0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a, +0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a, +0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3, +0xff,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, +0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85, +0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88, +0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53, +0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e, +0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91, +0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12,0x2f,0xd0,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xfb,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x37,0x32,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xbd,0x64, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x38,0xfc,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x37,0x33,0x80,0x1a,0x12,0xbd,0x64,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x38,0xfb,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x34,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f, +0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x80, +0x7e,0x34,0x0, 0x28,0xe4,0x12,0x20,0xde,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, 0xc0, +0x12,0x20,0xde,0x7a,0xb3,0x37,0x34,0x7e,0x34,0x62,0x8e,0x12,0x23,0x9e,0x7a,0x37, +0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a,0xe7, +0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a,0xf7, +0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a,0xf7, +0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe,0x7a, +0xb3,0x37,0x34,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x7e,0x37,0x38,0xe2,0x9e,0x37,0x38,0xde,0x12,0x21,0x0, 0xbd,0x31,0x38,0x12, +0x7e,0x37,0x38,0xe4,0x9e,0x37,0x38,0xe0,0x12,0x21,0x0, 0xbd,0x31,0x38,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd, +0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x38,0xdd,0x60,0x11,0x7e,0xc7, +0x38,0xe6,0x4d,0xcc,0x78,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x28,0x2, 0xe1,0x8, 0xbe, +0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xe1,0x8, 0x7e,0xe7,0x29,0x8, 0x7e, +0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x66,0xe6,0xbe,0xb0,0x1, 0x78,0x2, 0xe1, +0x8, 0x7e,0xa3,0x38,0xdd,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23, +0x14,0x78,0x2, 0xe1,0x5, 0xb, 0xb2,0x68,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x68,0x2, +0xe1,0x17,0x4c,0xee,0x68,0x2, 0xe1,0x17,0x74,0x1, 0x7a,0xb3,0x38,0xdd,0x12,0xbf, +0x2a,0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3, +0x38,0xdd,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xdd,0x7e,0x34, +0x62,0x68,0x80,0x48,0x12,0xbf,0x33,0x90,0x62,0x57,0x12,0xbf,0x1e,0x68,0x49,0x80, +0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xbf,0x33,0x7e,0x34,0x62, +0x60,0x12,0x23,0x9e,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d, +0xc3,0xbe,0xc7,0x38,0xe6,0x40,0x21,0x90,0x62,0x56,0x12,0xbf,0x1e,0x68,0x19,0x12, +0xbf,0x2a,0x74,0x3, 0x7a,0xb3,0x38,0xdd,0x7e,0x34,0x62,0x64,0x12,0x23,0x9e,0x7a, +0x37,0x38,0xe6,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xdd,0x6d,0x33,0x7a, +0x37,0x38,0xe6,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93, +0xa, 0x3b,0x12,0xbd,0xe9,0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x38,0xde,0x7a,0xf7, +0x38,0xe0,0x22,0x7a,0xe7,0x38,0xe2,0x7a,0xf7,0x38,0xe4,0x22,0xca,0xf8,0x7f,0x51, +0x7f,0x40,0x7e,0x37,0x2f,0x90,0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c, +0x7e,0x37,0x2f,0x9c,0x7a,0x35,0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff, +0x80,0x1e,0x7e,0x34,0x0, 0x26,0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0x8c,0x74, +0x2, 0xac,0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xbf,0x8b,0xb, 0xf0, +0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e, +0x35,0x2f,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e, +0x35,0x31,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, +0x6a,0x30,0x9e,0x35,0x33,0x6d,0x22,0x7e,0x33,0x38,0x41,0x12,0xbf,0xe0,0x7e,0x15, +0x2f,0x12,0x1f,0x5, 0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e, +0x33,0x38,0x42,0x12,0xbf,0xe0,0x7e,0x15,0x31,0x12,0x1f,0x5, 0x1b,0x7a,0x30,0x22, +0xa, 0x13,0x6d,0x0, 0x2, 0x1e,0xeb,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, +0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22, +0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x7e,0x34,0x60,0xa3,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e,0x37,0x2a,0x53,0x22,0x7e,0xa3,0x2a,0x6e,0x7e, +0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d,0x22, +0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b, +0x14,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e, +0x7b,0x60,0xbc,0x6b,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x2e,0x14,0x1, 0x30,0x6d, +0x0, 0x7e,0x18,0x3, 0x60,0x22,0x2e,0x14,0x0, 0x50,0x6d,0x0, 0x7e,0x18,0x34,0x0, +0x22,0x74,0x6, 0x12,0xb6,0xfb,0x7d,0x3, 0x6c,0x11,0x22,0x7e,0x70,0x2, 0xac,0x7c, +0x9, 0xb3,0x26,0xfa,0x22,0xe4,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36,0x71,0x22,0x74, +0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x61,0x57, +0x22,0x7a,0x37,0x28,0xa1,0x7e,0x34,0x61,0xc2,0x22,0x90,0x60,0xaa,0xe4,0x93,0xbe, +0xb0,0x1, 0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b,0xf, 0x22,0x74,0x5, 0xac,0xbc, +0x9, 0xb5,0x26,0x33,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22,0x7e,0xe3, +0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e, +0x37,0x25,0xf4,0x7a,0x37,0x31,0xcc,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x31,0xce, +0x22,0x7e,0x73,0x37,0xbd,0x7a,0x73,0x2b,0x20,0x22,0x12,0x0, 0x1e,0x7e,0xb3,0x2a, +0xfc,0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0, +0x1, 0x22,0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xb3,0x37,0x31,0xbe,0xb0, +0x1, 0x22,0x7e,0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7,0xe4,0x93,0x7c, +0xab,0x22,0xc1,0x42,0x3e,0xbd,0x6, 0xf9,0x7, 0x51, diff --git a/drivers/input/touchscreen/FT8006m/Kconfig b/drivers/input/touchscreen/FT8006m/Kconfig new file mode 100755 index 0000000000000..b9155aa01ebb7 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/Kconfig @@ -0,0 +1,17 @@ +# +# Focaltech Touchscreen driver configuration +# + +config TOUCHSCREEN_FT8006M + bool "Focaltech Touchscreen" + depends on I2C + default n + help + Say Y here if you have Focaltech touch panel. + If unsure, say N. + +config TOUCHSCREEN_FTS_DIRECTORY + string "Focaltech ts directory name" + default "focaltech_touch" + depends on TOUCHSCREEN_FT8006M + diff --git a/drivers/input/touchscreen/FT8006m/Makefile b/drivers/input/touchscreen/FT8006m/Makefile new file mode 100755 index 0000000000000..7f41c31569a5c --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/Makefile @@ -0,0 +1,18 @@ +# +# Makefile for the focaltech touchscreen drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_core.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_ex_fun.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_ex_mode.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_flash.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_gesture.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_esdcheck.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_i2c.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_sensor.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_point_report_check.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_flash/ +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test/ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_common.h b/drivers/input/touchscreen/FT8006m/focaltech_common.h new file mode 100755 index 0000000000000..b1398d20fca43 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_common.h @@ -0,0 +1,222 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/***************************************************************************** +* +* File Name: focaltech_common.h +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-16 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +#ifndef __LINUX_FOCALTECH_COMMON_H__ +#define __LINUX_FOCALTECH_COMMON_H__ + +#include "focaltech_config.h" + +/***************************************************************************** +* Macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_VERSION "Focaltech V1.3 20170306" + +#define FLAGBIT(x) (0x00000001 << (x)) +#define FLAGBITS(x, y) ((0xFFFFFFFF >> (32 - (y) - 1)) << (x)) + +#define FLAG_ICSERIALS_LEN 5 +#define FLAG_IDC_BIT 11 + +#define IC_SERIALS (FTS_CHIP_TYPE & FLAGBITS(0, FLAG_ICSERIALS_LEN-1)) +#define FTS_CHIP_IDC ((FTS_CHIP_TYPE & FLAGBIT(FLAG_IDC_BIT)) == FLAGBIT(FLAG_IDC_BIT)) + +#define FTS_CHIP_TYPE_MAPPING {{0x07, 0x80, 0x06, 0x80, 0x06, 0x80, 0xC6, 0x80, 0xB6} } + +#define I2C_BUFFER_LENGTH_MAXINUM 256 +#define FILE_NAME_LENGTH 128 +#define ENABLE 1 +#define DISABLE 0 +/*register address*/ +#define FTS_REG_INT_CNT 0x8F +#define FTS_REG_FLOW_WORK_CNT 0x91 +#define FTS_REG_WORKMODE 0x00 +#define FTS_REG_WORKMODE_FACTORY_VALUE 0x40 +#define FTS_REG_WORKMODE_WORK_VALUE 0x00 +#define FTS_REG_CHIP_ID 0xA3 +#define FTS_REG_CHIP_ID2 0x9F +#define FTS_REG_POWER_MODE 0xA5 +#define FTS_REG_POWER_MODE_SLEEP_VALUE 0x03 +#define FTS_REG_FW_VER 0xA6 +#define FTS_REG_VENDOR_ID 0xA8 +#define FTS_REG_LCD_BUSY_NUM 0xAB +#define FTS_REG_FACE_DEC_MODE_EN 0xB0 +#define FTS_REG_GLOVE_MODE_EN 0xC0 +#define FTS_REG_COVER_MODE_EN 0xC1 +#define FTS_REG_CHARGER_MODE_EN 0x8B +#define FTS_REG_GESTURE_EN 0xD0 +#define FTS_REG_GESTURE_OUTPUT_ADDRESS 0xD3 +#define FTS_REG_ESD_SATURATE 0xED + + + +/***************************************************************************** +* Alternative mode (When something goes wrong, the modules may be able to solve the problem.) +*****************************************************************************/ +/* + * point report check + * default: disable + */ +#define FTS_POINT_REPORT_CHECK_EN 0 + + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct ft_chip_t { + unsigned long type; + unsigned char chip_idh; + unsigned char chip_idl; + unsigned char rom_idh; + unsigned char rom_idl; + unsigned char pramboot_idh; + unsigned char pramboot_idl; + unsigned char bootloader_idh; + unsigned char bootloader_idl; +}; + +/* i2c communication*/ +int ft8006m_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue); +int ft8006m_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue); +int ft8006m_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen); +int ft8006m_i2c_write(struct i2c_client *client, char *writebuf, int writelen); +int ft8006m_i2c_init(void); +int ft8006m_i2c_exit(void); + +/* Gesture functions */ +#if FTS_GESTURE_EN +int ft8006m_gesture_init(struct input_dev *input_dev, struct i2c_client *client); +int ft8006m_gesture_exit(struct i2c_client *client); +void ft8006m_gesture_recovery(struct i2c_client *client); +int ft8006m_gesture_readdata(struct i2c_client *client); +int ft8006m_gesture_suspend(struct i2c_client *i2c_client); +int ft8006m_gesture_resume(struct i2c_client *client); +#endif + +/* Apk and functions */ +#if FTS_APK_NODE_EN +int ft8006m_create_apk_debug_channel(struct i2c_client *client); +void ft8006m_release_apk_debug_channel(void); +#endif + +/* ADB functions */ +#if FTS_SYSFS_NODE_EN +int ft8006m_create_sysfs(struct i2c_client *client); +int ft8006m_remove_sysfs(struct i2c_client *client); +#endif + +/* ESD */ +#if FTS_ESDCHECK_EN +int ft8006m_esdcheck_init(void); +int ft8006m_esdcheck_exit(void); +int ft8006m_esdcheck_switch(bool enable); +int ft8006m_esdcheck_proc_busy(bool proc_debug); +int ft8006m_esdcheck_set_intr(bool intr); +int ft8006m_esdcheck_suspend(void); +int ft8006m_esdcheck_resume(void); +int ft8006m_esdcheck_get_status(void); +#endif + +/* Production test */ +#if FTS_TEST_EN +int ft8006m_test_init(struct i2c_client *client); +int ft8006m_test_exit(struct i2c_client *client); +#endif + +#if FTS_LOCK_DOWN_INFO +int ft8006m_lockdown_init(struct i2c_client *client); +#endif + +#if FTS_CAT_RAWDATA +int ft8006m_rawdata_init(struct i2c_client *client); +#endif + +/* Point Report Check*/ +#if FTS_POINT_REPORT_CHECK_EN +int ft8006m_point_report_check_init(void); +int ft8006m_point_report_check_exit(void); +void ft8006m_point_report_check_queue_work(void); +#endif + +/* Other */ +extern int ft8006m_g_show_log; +int ft8006m_reset_proc(int hdelayms); +int ft8006m_wait_tp_to_valid(struct i2c_client *client); +void ft8006m_tp_state_recovery(struct i2c_client *client); +int ft8006m_ex_mode_init(struct i2c_client *client); +int ft8006m_ex_mode_exit(struct i2c_client *client); +int ft8006m_ex_mode_recovery(struct i2c_client *client); + +void ft8006m_irq_disable(void); +void ft8006m_irq_enable(void); + +/***************************************************************************** +* DEBUG function define here +*****************************************************************************/ +#if FTS_DEBUG_EN +#define FTS_DEBUG_LEVEL 1 + +#if (FTS_DEBUG_LEVEL == 2) +#define FTS_DEBUG(fmt, args...) printk(KERN_ERR "[FTS8006m][%s]"fmt"\n", __func__, ##args) +#define FTS_FUNC_ENTER() printk(KERN_ERR "[FTS8006m]%s: Enter\n", __func__) +#define FTS_FUNC_EXIT() printk(KERN_ERR "[FTS8006m]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_DEBUG(fmt, args...) printk(KERN_ERR "[FTS8006m]"fmt"\n", ##args) +#define FTS_FUNC_ENTER() +#define FTS_FUNC_EXIT() +#endif + +#else +#define FTS_DEBUG(fmt, args...) +#define FTS_FUNC_ENTER() +#define FTS_FUNC_EXIT() +#endif + +#define FTS_INFO(fmt, args...) do { \ + if (ft8006m_g_show_log) {printk(KERN_ERR "[FTS8006m][Info]"fmt"\n", ##args); } \ + } while (0) + +#define FTS_ERROR(fmt, args...) do { \ + if (ft8006m_g_show_log) {printk(KERN_ERR "[FTS8006m][Error]"fmt"\n", ##args); } \ + } while (0) + + +#if FTS_GESTURE_EN +#define GESTURE_NODE "onoff" +#define GESTURE_DATA "data" +#define DOUBLE_CLICK 143 +struct gesture_struct { + int gesture_all_switch; + unsigned long gesture_mask; +}; +#endif + +#endif /* __LINUX_FOCALTECH_COMMON_H__ */ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_config.h b/drivers/input/touchscreen/FT8006m/focaltech_config.h new file mode 100644 index 0000000000000..c8b2eb0b35a68 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_config.h @@ -0,0 +1,268 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/************************************************************************ +* +* File Name: focaltech_config.h +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: global configurations +* +* Version: v1.0 +* +************************************************************************/ +#ifndef _LINUX_FOCLATECH_CONFIG_H_ +#define _LINUX_FOCLATECH_CONFIG_H_ + +/**************************************************/ +/****** G: A, I: B, S: C, U: D ******************/ +/****** chip type defines, do not modify *********/ +#define _FT8716 0x87160805 +#define _FT8736 0x87360806 +#define _FT8006 0x80060807 +#define _FT8606 0x86060808 +#define _FT8607 0x86070809 +#define _FTE716 0xE716080a + +#define _FT5416 0x54160002 +#define _FT5426 0x54260002 +#define _FT5435 0x54350002 +#define _FT5436 0x54360002 +#define _FT5526 0x55260002 +#define _FT5526I 0x5526B002 +#define _FT5446 0x54460002 +#define _FT5346 0x53460002 +#define _FT5446I 0x5446B002 +#define _FT5346I 0x5346B002 +#define _FT7661 0x76610002 +#define _FT7511 0x75110002 +#define _FT7421 0x74210002 +#define _FT7681 0x76810002 +#define _FT3C47U 0x3C47D002 +#define _FT3417 0x34170002 +#define _FT3517 0x35170002 +#define _FT3327 0x33270002 +#define _FT3427 0x34270002 + +#define _FT5626 0x56260001 +#define _FT5726 0x57260001 +#define _FT5826B 0x5826B001 +#define _FT5826S 0x5826C001 +#define _FT7811 0x78110001 +#define _FT3D47 0x3D470001 +#define _FT3617 0x36170001 +#define _FT3717 0x37170001 +#define _FT3817B 0x3817B001 + +#define _FT6236U 0x6236D003 +#define _FT6336G 0x6336A003 +#define _FT6336U 0x6336D003 +#define _FT6436U 0x6436D003 + +#define _FT3267 0x32670004 +#define _FT3367 0x33670004 + + + +/*************************************************/ + +/* + * choose your ic chip type of focaltech + */ +#define FTS_CHIP_TYPE _FT8006 + +/******************* Enables *********************/ +/*********** 1 to enable, 0 to disable ***********/ + +/* + * show debug log info + * enable it for debug, disable it for release + */ +#define FTS_DEBUG_EN 1 + +#define FTS_LOCK_DOWN_INFO 1 + +#define FTS_CAT_RAWDATA 1 + +/* + * Linux MultiTouch Protocol + * 1: Protocol B(default), 0: Protocol A + */ + +#define FTS_MT_PROTOCOL_B_EN 0 + + +/* + * Report Pressure in multitouch + * 1:enable(default),0:disable +*/ +#define FTS_REPORT_PRESSURE_EN 1 + +/* + * Force touch support + * different pressure for multitouch + * 1: true pressure for force touch + * 0: constant pressure(default) + */ +#define FTS_FORCE_TOUCH_EN 0 + +/* + * Gesture function enable + * default: disable + */ +#define FTS_GESTURE_EN 1 + +/* + * ESD check & protection + * default: disable + */ +#define FTS_ESDCHECK_EN 1 + +/* + * Production test enable + * 1: enable, 0:disable(default) + */ +#define FTS_TEST_EN 1 + +/* + * Glove mode enable + * 1: enable, 0:disable(default) + */ +#define FTS_GLOVE_EN 0 +/* + * cover enable + * 1: enable, 0:disable(default) + */ +#define FTS_COVER_EN 0 +/* + * Charger enable + * 1: enable, 0:disable(default) + */ +#define FTS_CHARGER_EN 0 + +/* + * Proximity sensor + * default: disable + */ +#define FTS_PSENSOR_EN 0 + +/* + * Nodes for tools, please keep enable + */ +#define FTS_SYSFS_NODE_EN 1 +#define FTS_APK_NODE_EN 1 + +/* + * Customer power enable + * enable it when customer need control TP power + * default: disable + */ +#define FTS_POWER_SOURCE_CUST_EN 1 + +/****************************************************/ + +/********************** Upgrade ****************************/ +/* + * auto upgrade, please keep enable + */ +#ifdef WT_COMPILE_FACTORY_VERSION + #define FTS_AUTO_UPGRADE_EN 0 +#else +#define FTS_AUTO_UPGRADE_EN 1 +#endif + +/* + * auto upgrade for lcd cfg + * default: 0 + */ +#ifdef WT_COMPILE_FACTORY_VERSION + #define FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN 0 +#else +#define FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN 1 +#endif + +/* auto cb check + * default: disable + */ +#define FTS_AUTO_CLB_EN 0 + +/* + * Check vendor_id number + * 0:No check vendor_id (default) + * 1/2/3: Check vendor_id for vendor compatibility + */ +#define FTS_GET_VENDOR_ID_NUM 0 + +/* + * vendor_id(s) for vendor(s) to be compatible with. + * a confirmation of vendor_id(s) is recommended. + * FTS_GET_VENDOR_ID_NUM == 0, no check vendor id, you may ignore them + * FTS_GET_VENDOR_ID_NUM >= 1, compatible with FTS_VENDOR_1_ID + * FTS_GET_VENDOR_ID_NUM >= 2, compatible with FTS_VENDOR_2_ID + * FTS_GET_VENDOR_ID_NUM == 3, compatible with FTS_VENDOR_3_ID + */ +#define FTS_VENDOR_1_ID 0x00 +#define FTS_VENDOR_2_ID 0x00 +#define FTS_VENDOR_3_ID 0x00 + +/* + * FW_APP.i file for auto upgrade, you must replace it with your own + * define your own fw_app, the sample one to be replaced is invalid + * NOTE: if FTS_GET_VENDOR_ID_NUM >= 1, it's the fw corresponding with FTS_VENDOR_1_ID + */ +#define FTS_UPGRADE_FW_APP "include/firmware/FT8006m_app_sample.i" + +#define FTS_UPGRADE_FW_ALL_WHITE "include/firmware/white_all.i" + +#define FTS_UPGRADE_FW_ALL_BLACK "include/firmware/black_all.i" + + +/* + * if FTS_GET_VENDOR_ID_NUM >= 2, fw corrsponding with FTS_VENDOR_2_ID + * define your own fw_app, the sample one is invalid + */ +#define FTS_UPGRADE_FW2_APP "include/firmware/FT8006m_app_sample.i" + +/* + * if FTS_GET_VENDOR_ID_NUM == 3, fw corrsponding with FTS_VENDOR_3_ID + * define your own fw_app, the sample one is invalid + */ +#define FTS_UPGRADE_FW3_APP "include/firmware/FT8006m_app_sample.i" + +/* + * lcd_cfg.i file for lcd cfg upgrade + * define your own lcd_cfg.i, the sample one is invalid + */ + + + +/* + * upgrade stress test for debug + * enable it for upgrade debug if needed + * default: disable + */ +#define FTS_UPGRADE_STRESS_TEST 0 +/* stress test times, default: 1000 */ +#define FTS_UPGRADE_TEST_NUMBER 1000 + +/*********************************************************/ + +#endif /* _LINUX_FOCLATECH_CONFIG_H_ */ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_core.c b/drivers/input/touchscreen/FT8006m/focaltech_core.c new file mode 100755 index 0000000000000..aeb660b0b9a16 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_core.c @@ -0,0 +1,1715 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/***************************************************************************** +* +* File Name: focaltech_core.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#if FTS_GESTURE_EN +extern struct gesture_struct ft8006m_gesture_data; +#define MXT_INPUT_EVENT_START 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define MXT_INPUT_EVENT_STYLUS_MODE_OFF 2 +#define MXT_INPUT_EVENT_STYLUS_MODE_ON 3 +#define MXT_INPUT_EVENT_WAKUP_MODE_OFF 4 +#define MXT_INPUT_EVENT_WAKUP_MODE_ON 5 +#define MXT_INPUT_EVENT_EDGE_DISABLE 6 +#define MXT_INPUT_EVENT_EDGE_FINGER 7 +#define MXT_INPUT_EVENT_EDGE_HANDGRIP 8 +#define MXT_INPUT_EVENT_EDGE_FINGER_HANDGRIP 9 +#define MXT_INPUT_EVENT_END 9 +#endif +#if defined(CONFIG_FB) +#include +#include +#elif defined(CONFIG_HAS_EARLYSUSPEND) +#include +#define FTS_SUSPEND_LEVEL 1 /* Early-suspend level */ +#endif +#include +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_NAME "ft8006m_ts" +#define INTERVAL_READ_REG 20 +#define TIMEOUT_READ_REG 300 +#if FTS_POWER_SOURCE_CUST_EN +#define FTS_VTG_MIN_UV 1600000 +#define FTS_VTG_MAX_UV 2000000 +#define FTS_I2C_VTG_MIN_UV 1800000 +#define FTS_I2C_VTG_MAX_UV 1800000 +#endif +#define FTS_READ_TOUCH_BUFFER_DIVIDED 0 +/***************************************************************************** +* Global variable or extern global variabls/functions +******************************************************************************/ +struct i2c_client *ft8006m_i2c_client; +struct fts_ts_data *ft8006m_wq_data; +struct input_dev *ft8006m_input_dev; +extern char Lcm_name[HARDWARE_MAX_ITEM_LONGTH]; + +#if FTS_DEBUG_EN +int ft8006m_g_show_log = 1; +#else +int ft8006m_g_show_log = 0; +#endif + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) +char g_sz_debug[1024] = {0}; +#endif + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static void fts_release_all_finger(void); +int ft8006m_ts_suspend(struct device *dev); +static int ft8006m_ts_resume(struct device *dev); + +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" + + +extern int panel_dead2tp; + + +/***************************************************************************** +* Name: ft8006m_wait_tp_to_valid +* Brief: Read chip id until TP FW become valid, need call when reset/power on/resume... +* 1. Read Chip ID per INTERVAL_READ_REG(20ms) +* 2. Timeout: TIMEOUT_READ_REG(300ms) +* Input: +* Output: +* Return: 0 - Get correct Device ID +*****************************************************************************/ +int ft8006m_wait_tp_to_valid(struct i2c_client *client) +{ + int ret = 0; + int cnt = 0; + u8 reg_value = 0; + + do { + ret = ft8006m_i2c_read_reg(client, FTS_REG_CHIP_ID, ®_value); + if ((ret < 0) || (reg_value != ft8006m_chip_types.chip_idh)) { + FTS_INFO("TP Not Ready, ReadData = 0x%x", reg_value); + } else if (reg_value == ft8006m_chip_types.chip_idh) { + FTS_INFO("TP Ready, Device ID = 0x%x", reg_value); + return 0; + } + cnt++; + msleep(INTERVAL_READ_REG); + } while ((cnt * INTERVAL_READ_REG) < TIMEOUT_READ_REG); + + /* error: not get correct reg data */ + return -EPERM; +} + +/***************************************************************************** +* Name: fts_recover_state +* Brief: Need execute this function when reset +* Input: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_tp_state_recovery(struct i2c_client *client) +{ + /* wait tp stable */ + ft8006m_wait_tp_to_valid(client); + /* recover TP charger state 0x8B */ + /* recover TP glove state 0xC0 */ + /* recover TP cover state 0xC1 */ + ft8006m_ex_mode_recovery(client); + /* recover TP gesture state 0xD0 */ +#if FTS_GESTURE_EN + if (ft8006m_gesture_data.gesture_all_switch) + ft8006m_gesture_recovery(client); +#endif +} + + +/***************************************************************************** +* Name: ft8006m_reset_proc +* Brief: Execute reset operation +* Input: hdelayms - delay time unit:ms +* Output: +* Return: +*****************************************************************************/ +int ft8006m_reset_proc(int hdelayms) +{ + gpio_direction_output(ft8006m_wq_data->pdata->reset_gpio, 0); + msleep(20); + gpio_direction_output(ft8006m_wq_data->pdata->reset_gpio, 1); + msleep(hdelayms); + + return 0; +} + +/***************************************************************************** +* Name: ft8006m_irq_disable +* Brief: disable irq +* Input: +* sync: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_irq_disable(void) +{ + unsigned long irqflags; + spin_lock_irqsave(&ft8006m_wq_data->irq_lock, irqflags); + + if (!ft8006m_wq_data->irq_disable) { + disable_irq_nosync(ft8006m_wq_data->client->irq); + ft8006m_wq_data->irq_disable = 1; + } + + spin_unlock_irqrestore(&ft8006m_wq_data->irq_lock, irqflags); +} + +/***************************************************************************** +* Name: ft8006m_irq_enable +* Brief: enable irq +* Input: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_irq_enable(void) +{ + unsigned long irqflags = 0; + spin_lock_irqsave(&ft8006m_wq_data->irq_lock, irqflags); + + if (ft8006m_wq_data->irq_disable) { + enable_irq(ft8006m_wq_data->client->irq); + ft8006m_wq_data->irq_disable = 0; + } + + spin_unlock_irqrestore(&ft8006m_wq_data->irq_lock, irqflags); +} +#if FTS_GESTURE_EN +static int fts_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + char buffer[16]; + + if (type == EV_SYN && code == SYN_CONFIG) { + sprintf(buffer, "%d", value); + + FTS_INFO("FTS:Gesture on/off : %d", value); + if (value >= MXT_INPUT_EVENT_START && value <= MXT_INPUT_EVENT_END) { + if (value == MXT_INPUT_EVENT_WAKUP_MODE_ON) { + ft8006m_gesture_data.gesture_all_switch = 1; + } else if (value == MXT_INPUT_EVENT_WAKUP_MODE_OFF) { + ft8006m_gesture_data.gesture_all_switch = 0; + } else { + ft8006m_gesture_data.gesture_all_switch = 0; + FTS_ERROR("Failed Open/Close Gesture Function!\n"); + return -ENOMEM; + } + } + } + + return 0; +} +#endif + +/***************************************************************************** +* Name: ft8006m_input_dev_init +* Brief: input dev init +* Input: +* Output: +* Return: +*****************************************************************************/ +static int ft8006m_input_dev_init(struct i2c_client *client, struct fts_ts_data *data, struct input_dev *input_dev, struct fts_ts_platform_data *pdata) +{ + int err, len; + + FTS_FUNC_ENTER(); + + /* Init and register Input device */ + input_dev->name = FTS_DRIVER_NAME; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; +#if FTS_GESTURE_EN + input_dev->event = fts_input_event; +#endif + + input_set_drvdata(input_dev, data); + i2c_set_clientdata(client, data); + + __set_bit(EV_KEY, input_dev->evbit); + if (data->pdata->have_key) { + FTS_DEBUG("set key capabilities"); + for (len = 0; len < data->pdata->key_number; len++) { + input_set_capability(input_dev, EV_KEY, data->pdata->keys[len]); + } + } + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + +#if FTS_MT_PROTOCOL_B_EN + input_mt_init_slots(input_dev, pdata->max_touch_number, INPUT_MT_DIRECT); +#else + input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 0x0f, 0, 0); +#endif + input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, pdata->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, pdata->y_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 0xFF, 0, 0); +#if FTS_REPORT_PRESSURE_EN + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 0xFF, 0, 0); +#endif + + err = input_register_device(input_dev); + if (err) { + FTS_ERROR("Input device registration failed"); + goto free_inputdev; + } + + FTS_FUNC_EXIT(); + + return 0; + +free_inputdev: + input_free_device(input_dev); + FTS_FUNC_EXIT(); + return err; + +} + +/***************************************************************************** +* Power Control +*****************************************************************************/ +#if FTS_POWER_SOURCE_CUST_EN +static int fts_power_source_init(struct fts_ts_data *data) +{ + int rc; + + FTS_FUNC_ENTER(); + + data->vcc_i2c = regulator_get(&data->client->dev, "vcc_i2c"); + if (IS_ERR(data->vcc_i2c)) { + rc = PTR_ERR(data->vcc_i2c); + FTS_ERROR("Regulator get failed vcc_i2c rc=%d", rc); + goto reg_vdd_set_vtg; + } + + data->lab = regulator_get(&data->client->dev, "lab"); + if (IS_ERR(data->lab)) { + rc = PTR_ERR(data->lab); + FTS_ERROR("Regulator get failed lab rc=%d", rc); + } + + data->ibb = regulator_get(&data->client->dev, "ibb"); + if (IS_ERR(data->ibb)) { + rc = PTR_ERR(data->ibb); + FTS_ERROR("Regulator get failed ibb rc=%d", rc); + } + + data->panel_iovdd = regulator_get(&data->client->dev, "panel_iovdd"); + if (IS_ERR(data->panel_iovdd)) { + + FTS_ERROR("!!! panel_iovdd not present !!!"); + } + + FTS_FUNC_EXIT(); + return 0; + + + +reg_vdd_set_vtg: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FTS_VTG_MAX_UV); + + + FTS_FUNC_EXIT(); + return rc; +} + +static int fts_power_source_ctrl(struct fts_ts_data *data, int enable) +{ + int rc; + + FTS_FUNC_ENTER(); + if (enable) { + rc = regulator_enable(data->vcc_i2c); + if (rc) { + FTS_ERROR("Regulator vcc_i2c enable failed rc=%d", rc); + } + } else { + rc = regulator_disable(data->vcc_i2c); + if (rc) { + FTS_ERROR("Regulator vcc_i2c disable failed rc=%d", rc); + } + } + FTS_FUNC_EXIT(); + return 0; +} + +static int lcd_power_ctrl(struct fts_ts_data *data, int enable) +{ + int rc; + + FTS_FUNC_ENTER(); + if (enable) { + rc = regulator_enable(data->panel_iovdd); + if (rc) { + FTS_ERROR("Regulator panel_iovdd enable failed rc=%d\n", rc); + } + + rc = regulator_enable(data->lab); + if (rc) { + FTS_ERROR("Regulator labenable failed rc=%d\n", rc); + } + + rc = regulator_enable(data->ibb); + if (rc) { + FTS_ERROR("Regulator ibb enable failed rc=%d\n", rc); + } + } else { + rc = regulator_disable(data->lab); + if (rc) { + FTS_ERROR("Regulator lab disable failed rc=%d\n", rc); + } + + rc = regulator_disable(data->ibb); + if (rc) { + FTS_ERROR("Regulator ibb disable failed rc=%d\n", rc); + } + + mdelay(10); + rc = regulator_disable(data->panel_iovdd); + if (rc) { + FTS_ERROR("Regulator panel_iovdd disable failed rc=%d\n", rc); + } + + } + FTS_FUNC_EXIT(); + return 0; +} + + +#endif + + +/***************************************************************************** +* Reprot related +*****************************************************************************/ +/***************************************************************************** +* Name: fts_release_all_finger +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_release_all_finger(void) +{ +#if FTS_MT_PROTOCOL_B_EN + unsigned int finger_count = 0; +#endif + + mutex_lock(&ft8006m_wq_data->report_mutex); +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < ft8006m_wq_data->pdata->max_touch_number; finger_count++) { + input_mt_slot(ft8006m_input_dev, finger_count); + input_mt_report_slot_state(ft8006m_input_dev, MT_TOOL_FINGER, false); + } +#else + input_mt_sync(ft8006m_input_dev); +#endif + input_report_key(ft8006m_input_dev, BTN_TOUCH, 0); + input_sync(ft8006m_input_dev); + mutex_unlock(&ft8006m_wq_data->report_mutex); +} + + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) +static void fts_show_touch_buffer(u8 *buf, int point_num) +{ + int len = point_num * FTS_ONE_TCH_LEN; + int count = 0; + int i; + + memset(g_sz_debug, 0, 1024); + if (len > (POINT_READ_BUF-3)) { + len = POINT_READ_BUF-3; + } else if (len == 0) { + len += FTS_ONE_TCH_LEN; + } + count += sprintf(g_sz_debug, "%02X,%02X,%02X", buf[0], buf[1], buf[2]); + for (i = 0; i < len; i++) { + count += sprintf(g_sz_debug+count, ",%02X", buf[i+3]); + } + +} +#endif + +static int ft8006m_input_dev_report_key_event(struct ts_event *event, struct fts_ts_data *data) +{ + int i; + + if (data->pdata->have_key) { + if ((1 == event->touch_point || 1 == event->point_num) && + (event->au16_y[0] == data->pdata->key_y_coord)) { + + if (event->point_num == 0) { + FTS_DEBUG("Keys All Up!"); + for (i = 0; i < data->pdata->key_number; i++) { + input_report_key(data->input_dev, data->pdata->keys[i], 0); + } + } else { + for (i = 0; i < data->pdata->key_number; i++) { + if (event->au16_x[0] > (data->pdata->key_x_coords[i] - FTS_KEY_WIDTH) && + event->au16_x[0] < (data->pdata->key_x_coords[i] + FTS_KEY_WIDTH)) { + + if (event->au8_touch_event[i] == 0 || + event->au8_touch_event[i] == 2) { + input_report_key(data->input_dev, data->pdata->keys[i], 1); + FTS_DEBUG("Key%d(%d, %d) DOWN!", i, event->au16_x[0], event->au16_y[0]); + } else { + input_report_key(data->input_dev, data->pdata->keys[i], 0); + FTS_DEBUG("Key%d(%d, %d) Up!", i, event->au16_x[0], event->au16_y[0]); + } + break; + } + } + } + input_sync(data->input_dev); + return 0; + } + } + + return -EPERM; +} + +#if FTS_MT_PROTOCOL_B_EN +static int ft8006m_input_dev_report_b(struct ts_event *event, struct fts_ts_data *data) +{ + int i = 0; + int uppoint = 0; + int touchs = 0; + for (i = 0; i < event->touch_point; i++) { + if (event->au8_finger_id[i] >= data->pdata->max_touch_number) { + break; + } + input_mt_slot(data->input_dev, event->au8_finger_id[i]); + + if (event->au8_touch_event[i] == FTS_TOUCH_DOWN || event->au8_touch_event[i] == FTS_TOUCH_CONTACT) { + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, true); + +#if FTS_REPORT_PRESSURE_EN +#if FTS_FORCE_TOUCH_EN + if (event->pressure[i] <= 0) { + FTS_ERROR("[B]Illegal pressure: %d", event->pressure[i]); + event->pressure[i] = 1; + } +#else + event->pressure[i] = 0x3f; +#endif + input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]); +#endif + + if (event->area[i] <= 0) { + FTS_ERROR("[B]Illegal touch-major: %d", event->area[i]); + event->area[i] = 1; + } + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]); + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]); + touchs |= BIT(event->au8_finger_id[i]); + data->touchs |= BIT(event->au8_finger_id[i]); + +#if FTS_REPORT_PRESSURE_EN + + +#else + +#endif + } else { + uppoint++; + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); +#if FTS_REPORT_PRESSURE_EN + input_report_abs(data->input_dev, ABS_MT_PRESSURE, 0); +#endif + data->touchs &= ~BIT(event->au8_finger_id[i]); + + } + } + + if (unlikely(data->touchs ^ touchs)) { + for (i = 0; i < data->pdata->max_touch_number; i++) { + if (BIT(i) & (data->touchs ^ touchs)) { + + input_mt_slot(data->input_dev, i); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); +#if FTS_REPORT_PRESSURE_EN + input_report_abs(data->input_dev, ABS_MT_PRESSURE, 0); +#endif + } + } + } + + data->touchs = touchs; + if (event->touch_point == uppoint) { + + input_report_key(data->input_dev, BTN_TOUCH, 0); + } else { + input_report_key(data->input_dev, BTN_TOUCH, event->touch_point > 0); + } + + input_sync(data->input_dev); + + return 0; + +} + +#else +static int ft8006m_input_dev_report_a(struct ts_event *event, struct fts_ts_data *data) +{ + int i = 0; + int uppoint = 0; + int touchs = 0; + for (i = 0; i < event->touch_point; i++) { + + if (event->au8_touch_event[i] == FTS_TOUCH_DOWN || event->au8_touch_event[i] == FTS_TOUCH_CONTACT) { + input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, event->au8_finger_id[i]); +#if FTS_REPORT_PRESSURE_EN +#if FTS_FORCE_TOUCH_EN + if (event->pressure[i] <= 0) { + FTS_ERROR("[B]Illegal pressure: %d", event->pressure[i]); + event->pressure[i] = 1; + } +#else + event->pressure[i] = 0x3f; +#endif + input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]); +#endif + + if (event->area[i] <= 0) { + FTS_ERROR("[B]Illegal touch-major: %d", event->area[i]); + event->area[i] = 1; + } + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]); + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]); + + input_mt_sync(data->input_dev); + +#if FTS_REPORT_PRESSURE_EN + + +#else + FTS_DEBUG("[B]P%d(%d, %d)[tm:%d] DOWN!", event->au8_finger_id[i], event->au16_x[i], event->au16_y[i], event->area[i]); +#endif + } else { + uppoint++; + } + } + + data->touchs = touchs; + if (event->touch_point == uppoint) { + + input_report_key(data->input_dev, BTN_TOUCH, 0); + input_mt_sync(data->input_dev); + } else { + input_report_key(data->input_dev, BTN_TOUCH, event->touch_point > 0); + } + + input_sync(data->input_dev); + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_read_touchdata +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_read_touchdata(struct fts_ts_data *data) +{ + u8 buf[POINT_READ_BUF] = { 0 }; + u8 pointid = FTS_MAX_ID; + int ret = -1; + int i; + struct ts_event *event = &(data->event); + +#if FTS_GESTURE_EN + if (ft8006m_gesture_data.gesture_all_switch) { + u8 state; + if (data->suspended) { + ft8006m_i2c_read_reg(data->client, FTS_REG_GESTURE_EN, &state); + if (state == 1) { + ft8006m_gesture_readdata(data->client); + return 1; + } + } + } +#endif + +#if FTS_PSENSOR_EN + if ((fts_sensor_read_data(data) != 0) && (data->suspended == 1)) { + return 1; + } +#endif + + +#if FTS_READ_TOUCH_BUFFER_DIVIDED + memset(buf, 0xFF, POINT_READ_BUF); + memset(event, 0, sizeof(struct ts_event)); + + buf[0] = 0x00; + ret = ft8006m_i2c_read(data->client, buf, 1, buf, (3 + FTS_ONE_TCH_LEN)); + if (ret < 0) { + FTS_ERROR("%s read touchdata failed.", __func__); + return ret; + } + event->touch_point = 0; + event->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F; + if (event->point_num > data->pdata->max_touch_number) + event->point_num = data->pdata->max_touch_number; + + if (event->point_num > 1) { + buf[9] = 0x09; + ft8006m_i2c_read(data->client, buf+9, 1, buf+9, (event->point_num - 1) * FTS_ONE_TCH_LEN); + } +#else + ret = ft8006m_i2c_read(data->client, buf, 1, buf, POINT_READ_BUF); + if (ret < 0) { + FTS_ERROR("[B]Read touchdata failed, ret: %d", ret); + return ret; + } + +#if FTS_POINT_REPORT_CHECK_EN + ft8006m_point_report_check_queue_work(); +#endif + + memset(event, 0, sizeof(struct ts_event)); + event->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F; + if (event->point_num > data->pdata->max_touch_number) + event->point_num = data->pdata->max_touch_number; + event->touch_point = 0; +#endif + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) + fts_show_touch_buffer(buf, event->point_num); +#endif + + for (i = 0; i < data->pdata->max_touch_number; i++) { + pointid = (buf[FTS_TOUCH_ID_POS + FTS_ONE_TCH_LEN * i]) >> 4; + if (pointid >= FTS_MAX_ID) + break; + else + event->touch_point++; + + event->au16_x[i] = + (s16) (buf[FTS_TOUCH_X_H_POS + FTS_ONE_TCH_LEN * i] & 0x0F) << + 8 | (s16) buf[FTS_TOUCH_X_L_POS + FTS_ONE_TCH_LEN * i]; + event->au16_y[i] = + (s16) (buf[FTS_TOUCH_Y_H_POS + FTS_ONE_TCH_LEN * i] & 0x0F) << + 8 | (s16) buf[FTS_TOUCH_Y_L_POS + FTS_ONE_TCH_LEN * i]; + event->au8_touch_event[i] = + buf[FTS_TOUCH_EVENT_POS + FTS_ONE_TCH_LEN * i] >> 6; + event->au8_finger_id[i] = + (buf[FTS_TOUCH_ID_POS + FTS_ONE_TCH_LEN * i]) >> 4; + event->area[i] = + (buf[FTS_TOUCH_AREA_POS + FTS_ONE_TCH_LEN * i]) >> 4; + event->pressure[i] = + (s16) buf[FTS_TOUCH_PRE_POS + FTS_ONE_TCH_LEN * i]; + + if (0 == event->area[i]) + event->area[i] = 0x09; + + if (0 == event->pressure[i]) + event->pressure[i] = 0x3f; + + if ((event->au8_touch_event[i] == 0 || event->au8_touch_event[i] == 2) && (event->point_num == 0)) { + FTS_DEBUG("abnormal touch data from fw"); + return -EPERM; + } + } + if (event->touch_point == 0) { + return -EPERM; + } + return 0; +} + +/***************************************************************************** +* Name: fts_report_value +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_report_value(struct fts_ts_data *data) +{ + struct ts_event *event = &data->event; + + + + + + if (0 == ft8006m_input_dev_report_key_event(event, data)) { + return; + } + +#if FTS_MT_PROTOCOL_B_EN + ft8006m_input_dev_report_b(event, data); +#else + ft8006m_input_dev_report_a(event, data); +#endif + + + return; + +} + +/***************************************************************************** +* Name: fts_ts_interrupt +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static irqreturn_t fts_ts_interrupt(int irq, void *dev_id) +{ + struct fts_ts_data *fts_ts = dev_id; + int ret = -1; + + if (!fts_ts) { + FTS_ERROR("[INTR]: Invalid fts_ts"); + return IRQ_HANDLED; + } + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_set_intr(1); +#endif + + ret = fts_read_touchdata(ft8006m_wq_data); + + if (ret == 0) { + mutex_lock(&ft8006m_wq_data->report_mutex); + fts_report_value(ft8006m_wq_data); + mutex_unlock(&ft8006m_wq_data->report_mutex); + } + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_set_intr(0); +#endif + + return IRQ_HANDLED; +} + +/***************************************************************************** +* Name: fts_gpio_configure +* Brief: Configure IRQ&RESET GPIO +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_gpio_configure(struct fts_ts_data *data) +{ + int err = 0; + + FTS_FUNC_ENTER(); + /* request irq gpio */ + if (gpio_is_valid(data->pdata->irq_gpio)) { + err = gpio_request(data->pdata->irq_gpio, "fts_irq_gpio"); + if (err) { + FTS_ERROR("[GPIO]irq gpio request failed"); + goto err_irq_gpio_req; + } + + err = gpio_direction_input(data->pdata->irq_gpio); + if (err) { + FTS_ERROR("[GPIO]set_direction for irq gpio failed"); + goto err_irq_gpio_dir; + } + } + /* request reset gpio */ + if (gpio_is_valid(data->pdata->reset_gpio)) { + err = gpio_request(data->pdata->reset_gpio, "fts_reset_gpio"); + if (err) { + FTS_ERROR("[GPIO]reset gpio request failed"); + goto err_irq_gpio_dir; + } + + err = gpio_direction_output(data->pdata->reset_gpio, 1); + if (err) { + FTS_ERROR("[GPIO]set_direction for reset gpio failed"); + goto err_reset_gpio_dir; + } + } + + FTS_FUNC_EXIT(); + return 0; + +err_reset_gpio_dir: + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); +err_irq_gpio_dir: + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); +err_irq_gpio_req: + FTS_FUNC_EXIT(); + return err; +} + + +/***************************************************************************** +* Name: fts_get_dt_coords +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_get_dt_coords(struct device *dev, char *name, + struct fts_ts_platform_data *pdata) { + u32 coords[FTS_COORDS_ARR_SIZE]; + struct property *prop; + struct device_node *np = dev->of_node; + int coords_size, rc; + + prop = of_find_property(np, name, NULL); + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + + coords_size = prop->length / sizeof(u32); + if (coords_size != FTS_COORDS_ARR_SIZE) { + FTS_ERROR("invalid %s", name); + return -EINVAL; + } + + rc = of_property_read_u32_array(np, name, coords, coords_size); + if (rc && (rc != -EINVAL)) { + FTS_ERROR("Unable to read %s", name); + return rc; + } + + if (!strcmp(name, "focaltech,display-coords")) { + if (!strcmp(Lcm_name, "ft8613_ebbg_5p5_1080p_video")) { + pdata->x_min = 0; + pdata->y_min = 0; + pdata->x_max = 1080; + pdata->y_max = 1920; + } else { + pdata->x_min = coords[0]; + pdata->y_min = coords[1]; + pdata->x_max = coords[2]; + pdata->y_max = coords[3]; + } + FTS_INFO("Lcdname:%s \n", Lcm_name); + FTS_INFO("x_min:%d y_min:%d x_max:%d y_max:%d", pdata->x_min, pdata->y_min, pdata->x_max, pdata->y_max); + + } else { + FTS_ERROR("unsupported property %s", name); + return -EINVAL; + } + + return 0; +} + +/***************************************************************************** +* Name: fts_parse_dt +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_parse_dt(struct device *dev, struct fts_ts_platform_data *pdata) +{ + int rc; + struct device_node *np = dev->of_node; + u32 temp_val; + + FTS_FUNC_ENTER(); + + rc = fts_get_dt_coords(dev, "focaltech,display-coords", pdata); + if (rc) + FTS_ERROR("Unable to get display-coords"); + + /* key */ + pdata->have_key = of_property_read_bool(np, "focaltech,have-key"); + if (pdata->have_key) { + rc = of_property_read_u32(np, "focaltech,key-number", &pdata->key_number); + if (rc) { + FTS_ERROR("Key number undefined!"); + } + rc = of_property_read_u32_array(np, "focaltech,keys", + pdata->keys, pdata->key_number); + if (rc) { + FTS_ERROR("Keys undefined!"); + } + rc = of_property_read_u32(np, "focaltech,key-y-coord", &pdata->key_y_coord); + if (rc) { + FTS_ERROR("Key Y Coord undefined!"); + } + rc = of_property_read_u32_array(np, "focaltech,key-x-coords", + pdata->key_x_coords, pdata->key_number); + if (rc) { + FTS_ERROR("Key X Coords undefined!"); + } + FTS_DEBUG("%d: (%d, %d, %d), [%d, %d, %d][%d]", + pdata->key_number, pdata->keys[0], pdata->keys[1], pdata->keys[2], + pdata->key_x_coords[0], pdata->key_x_coords[1], pdata->key_x_coords[2], + pdata->key_y_coord); + } + + /* reset, irq gpio info */ + pdata->reset_gpio = of_get_named_gpio_flags(np, "focaltech,reset-gpio", 0, &pdata->reset_gpio_flags); + if (pdata->reset_gpio < 0) { + FTS_ERROR("Unable to get reset_gpio"); + } + + pdata->irq_gpio = of_get_named_gpio_flags(np, "focaltech,irq-gpio", 0, &pdata->irq_gpio_flags); + if (pdata->irq_gpio < 0) { + FTS_ERROR("Unable to get irq_gpio"); + } + + rc = of_property_read_u32(np, "focaltech,max-touch-number", &temp_val); + if (!rc) { + pdata->max_touch_number = temp_val; + FTS_DEBUG("max_touch_number=%d", pdata->max_touch_number); + } else { + FTS_ERROR("Unable to get max-touch-number"); + pdata->max_touch_number = FTS_MAX_POINTS; + } + + + + FTS_FUNC_EXIT(); + return 0; +} + +#if defined(CONFIG_FB) +/***************************************************************************** +* Name: fb_notifier_callback +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fb_notifier_callback(struct notifier_block *self, + unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct fts_ts_data *fts_data = + container_of(self, struct fts_ts_data, fb_notif); + + if (evdata && evdata->data && event == FB_EVENT_BLANK && + fts_data && fts_data->client) { + blank = evdata->data; + if (*blank == FB_BLANK_UNBLANK) + ft8006m_ts_resume(&fts_data->client->dev); + else if (*blank == FB_BLANK_POWERDOWN) + ft8006m_ts_suspend(&fts_data->client->dev); + } + + return 0; +} +#elif defined(CONFIG_HAS_EARLYSUSPEND) +/***************************************************************************** +* Name: fts_ts_early_suspend +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_early_suspend(struct early_suspend *handler) +{ + struct fts_ts_data *data = container_of(handler, + struct fts_ts_data, + early_suspend); + + ft8006m_ts_suspend(&data->client->dev); +} + +/***************************************************************************** +* Name: fts_ts_late_resume +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_late_resume(struct early_suspend *handler) +{ + struct fts_ts_data *data = container_of(handler, + struct fts_ts_data, + early_suspend); + + ft8006m_ts_resume(&data->client->dev); +} +#endif +#if 1 +static int fts_ts_pinctrl_init(struct fts_ts_data *data) +{ + int retval; + + /* Get pinctrl if target uses pinctrl */ + data->ts_pinctrl = devm_pinctrl_get(&(data->client->dev)); + if (IS_ERR_OR_NULL(data->ts_pinctrl)) { + retval = PTR_ERR(data->ts_pinctrl); + dev_dbg(&data->client->dev, + "Target does not use pinctrl %d\n", retval); + goto err_pinctrl_get; + } + + data->pinctrl_state_active + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_ACTIVE); + if (IS_ERR_OR_NULL(data->pinctrl_state_active)) { + retval = PTR_ERR(data->pinctrl_state_active); + dev_err(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_lookup; + } + + data->pinctrl_state_suspend + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_SUSPEND); + if (IS_ERR_OR_NULL(data->pinctrl_state_suspend)) { + retval = PTR_ERR(data->pinctrl_state_suspend); + dev_err(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_SUSPEND, retval); + goto err_pinctrl_lookup; + } + + data->pinctrl_state_release + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_RELEASE); + if (IS_ERR_OR_NULL(data->pinctrl_state_release)) { + retval = PTR_ERR(data->pinctrl_state_release); + dev_dbg(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_RELEASE, retval); + } + + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(data->ts_pinctrl); +err_pinctrl_get: + data->ts_pinctrl = NULL; + return retval; +} +#endif + +void hardwareinfo_set(void *drv_data) +{ + char firmware_ver[HARDWARE_MAX_ITEM_LONGTH]; + char vendor_for_id[HARDWARE_MAX_ITEM_LONGTH]; + char ic_name[HARDWARE_MAX_ITEM_LONGTH]; + int err; + u8 vendor_id; + u8 ic_type; + u8 fw_ver; + + ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_VENDOR_ID, &vendor_id); + ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_FW_VER, &fw_ver); + ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_CHIP_ID, &ic_type); + + if (vendor_id == BOE_VENDOR) { + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "BOE"); + } else{ + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "Other vendor"); + } + + if (ic_type == TP_IC_FT8006M) { + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT8006M"); + } else{ + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "Other IC"); + } + + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x", vendor_for_id, ic_name, fw_ver); + FTS_INFO("firmware_ver=%s\n", firmware_ver); + + err = hardwareinfo_set_prop(HARDWARE_TP, firmware_ver); + if (err < 0) + return ; + + return ; + +} + + +#ifndef WT_COMPILE_FACTORY_VERSION +static int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, strlen("ffbm")); + FTS_INFO("cmd_line =%s \n", cmd_line); + if (ret == 0) { + FTS_INFO("mode: ffbm\n"); + return 1;/* factory mode*/ + } else { + FTS_INFO("mode: no ffbm\n"); + return 2;/* not factory mode*/ + } + } + FTS_INFO("Normal mode \n"); + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_ts_probe +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_shutdown(struct i2c_client *client) +{ + lcd_power_ctrl(ft8006m_wq_data, 0); +} + +static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct fts_ts_platform_data *pdata; + struct fts_ts_data *data; + struct input_dev *input_dev; + int err; + int i; + u8 reg_addr, reg_value; + + FTS_FUNC_ENTER(); + /* 1. Get Platform data */ + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, + sizeof(struct fts_ts_platform_data), + GFP_KERNEL); + if (!pdata) { + FTS_ERROR("[MEMORY]Failed to allocate memory"); + FTS_FUNC_EXIT(); + return -ENOMEM; + } + err = fts_parse_dt(&client->dev, pdata); + if (err) { + FTS_ERROR("[DTS]DT parsing failed"); + } + } else { + pdata = client->dev.platform_data; + } + + if (!pdata) { + FTS_ERROR("Invalid pdata"); + FTS_FUNC_EXIT(); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + FTS_ERROR("I2C not supported"); + FTS_FUNC_EXIT(); + goto free_platform_data; + } + + data = devm_kzalloc(&client->dev, sizeof(struct fts_ts_data), GFP_KERNEL); + if (!data) { + FTS_ERROR("[MEMORY]Failed to allocate memory"); + FTS_FUNC_EXIT(); + return -ENOMEM; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + FTS_ERROR("[INPUT]Failed to allocate input device"); + FTS_FUNC_EXIT(); + goto free_ts_data; + } + + + + data->input_dev = input_dev; + data->client = client; + data->pdata = pdata; + + ft8006m_wq_data = data; + ft8006m_i2c_client = client; + ft8006m_input_dev = input_dev; + + spin_lock_init(&ft8006m_wq_data->irq_lock); + mutex_init(&ft8006m_wq_data->report_mutex); + + ft8006m_input_dev_init(client, data, input_dev, pdata); + + ft8006m_ctpm_get_upgrade_array(); + + err = fts_gpio_configure(data); + if (err < 0) { + FTS_ERROR("[GPIO]Failed to configure the gpios"); + goto input_destroy; + } + + +#if 1 + err = fts_ts_pinctrl_init(data); + if (!err && data->ts_pinctrl) { + /* + * Pinctrl handle is optional. If pinctrl handle is found + * let pins to be configured in active state. If not + * found continue further without error. + */ + err = pinctrl_select_state(data->ts_pinctrl, + data->pinctrl_state_active); + if (err < 0) { + dev_err(&client->dev, + "failed to select pin to active state"); + } + } +#endif + + +#if FTS_POWER_SOURCE_CUST_EN + fts_power_source_init(data); + fts_power_source_ctrl(data, 1); + lcd_power_ctrl(data, 1); +#endif +ft8006m_reset_proc(200); + + /* check the controller id */ + reg_addr = 0xA3; + for (i = 0; i < 5; i++) { + err = ft8006m_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + msleep(5); + else + break; + + } + if (i >= 5) { + dev_err(&client->dev, "version read failed"); + goto free_gpio; + } + + ft8006m_wait_tp_to_valid(client); + + ft8006m_i2c_read_reg(client, FTS_REG_CHIP_ID, ®_value); + + err = request_threaded_irq(client->irq, NULL, fts_ts_interrupt, + /*pdata->irq_gpio_flags | */IRQF_ONESHOT | IRQF_TRIGGER_FALLING, + client->dev.driver->name, data); + if (err) { + FTS_ERROR("Request irq failed!"); + goto free_gpio; + } + + ft8006m_irq_disable(); + +#if FTS_PSENSOR_EN + if (fts_sensor_init(data) != 0) { + FTS_ERROR("fts_sensor_init failed!"); + FTS_FUNC_EXIT(); + goto irq_free; + } +#endif + +#if FTS_APK_NODE_EN + ft8006m_create_apk_debug_channel(client); +#endif + +#if FTS_SYSFS_NODE_EN + ft8006m_create_sysfs(client); +#endif + +#if FTS_POINT_REPORT_CHECK_EN + ft8006m_point_report_check_init(); +#endif + + ft8006m_ex_mode_init(client); + +#if FTS_GESTURE_EN + ft8006m_gesture_init(input_dev, client); +#endif + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_init(); +#endif + + ft8006m_irq_enable(); + ft8006m_i2c_read_reg(client, FTS_REG_VENDOR_ID, &data->fw_vendor_id); + ft8006m_i2c_read_reg(client, FTS_REG_FW_VER, data->fw_ver); + FTS_INFO("vendor_id=0x%x\n", data->fw_vendor_id); + FTS_INFO("tp_fw=0x%x\n", data->fw_ver[0]); +#if FTS_TEST_EN + ft8006m_test_init(client); +#endif +#if FTS_LOCK_DOWN_INFO + ft8006m_lockdown_init(client); +#endif + +#if FTS_CAT_RAWDATA + ft8006m_rawdata_init(client); +#endif + +#if FTS_AUTO_UPGRADE_EN + err = get_boot_mode(client); + if (err == 0) { + ft8006m_ctpm_upgrade_init(); + } else { + FTS_INFO("Not in normal mode!\n"); + } + +#endif + + +#if defined(CONFIG_FB) + data->fb_notif.notifier_call = fb_notifier_callback; + err = fb_register_client(&data->fb_notif); + if (err) + FTS_ERROR("[FB]Unable to register fb_notifier: %d", err); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + FTS_SUSPEND_LEVEL; + data->early_suspend.suspend = fts_ts_early_suspend; + data->early_suspend.resume = fts_ts_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + hardwareinfo_tp_register(hardwareinfo_set, data); + + FTS_FUNC_EXIT(); + return 0; + +#if FTS_PSENSOR_EN +irq_free: + free_irq(client->irq, data); +#endif +free_gpio: + if (gpio_is_valid(pdata->reset_gpio)) + gpio_free(pdata->reset_gpio); + if (gpio_is_valid(pdata->irq_gpio)) + gpio_free(pdata->irq_gpio); +input_destroy: + input_unregister_device(input_dev); + input_dev = NULL; + input_free_device(input_dev); +free_ts_data: + devm_kfree(&client->dev, data); +free_platform_data: + devm_kfree(&client->dev, pdata); + + return err; + +} + +/***************************************************************************** +* Name: fts_ts_remove +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_ts_remove(struct i2c_client *client) +{ + struct fts_ts_data *data = i2c_get_clientdata(client); + + FTS_FUNC_ENTER(); + cancel_work_sync(&data->touch_event_work); + +#if FTS_PSENSOR_EN + fts_sensor_remove(data); +#endif + +#if FTS_POINT_REPORT_CHECK_EN + ft8006m_point_report_check_exit(); +#endif + +#if FTS_APK_NODE_EN + ft8006m_release_apk_debug_channel(); +#endif + +#if FTS_SYSFS_NODE_EN + ft8006m_remove_sysfs(client); +#endif + + ft8006m_ex_mode_exit(client); + +#if FTS_AUTO_UPGRADE_EN + cancel_work_sync(&ft8006m_fw_update_work); +#endif + +#if defined(CONFIG_FB) + if (fb_unregister_client(&data->fb_notif)) + FTS_ERROR("Error occurred while unregistering fb_notifier."); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&data->early_suspend); +#endif + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + input_unregister_device(data->input_dev); + +#if FTS_TEST_EN + ft8006m_test_exit(client); +#endif + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_exit(); +#endif + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: ft8006m_ts_suspend +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_ts_suspend(struct device *dev) +{ + struct fts_ts_data *data = ft8006m_wq_data; + int retval = 0, i = 0; + + FTS_FUNC_ENTER(); + if (data->suspended) { + FTS_INFO("Already in suspend state"); + FTS_FUNC_EXIT(); + return -EPERM; + } +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_suspend(); +#endif + +#if FTS_GESTURE_EN + if (ft8006m_gesture_data.gesture_all_switch) { + + if (panel_dead2tp) { + FTS_ERROR("%s:panel_dead2tp=%d", __func__, panel_dead2tp); + lcd_power_ctrl(data, 0); + data->suspended = true; + return 0; + } + + retval = ft8006m_gesture_suspend(data->client); + if (retval == 0) { + /* Enter into gesture mode(suspend) */ + retval = enable_irq_wake(ft8006m_wq_data->client->irq); + if (retval) + FTS_ERROR("%s: set_irq_wake failed", __func__); + data->suspended = true; + FTS_FUNC_EXIT(); + return 0; + } + } + +#endif + +#if FTS_PSENSOR_EN + if (fts_sensor_suspend(data) != 0) { + enable_irq_wake(data->client->irq); + data->suspended = true; + return 0; + } +#endif + + ft8006m_irq_disable(); + + for (; i < 5; i++) { + /* TP enter sleep mode */ + retval = ft8006m_i2c_write_reg(data->client, FTS_REG_POWER_MODE, FTS_REG_POWER_MODE_SLEEP_VALUE); + if (retval < 0) { + FTS_ERROR("Set TP to sleep mode fail, ret=%d!", retval); + } else { + FTS_INFO("go into sleep mode successfully\n"); + break; + } + msleep(20); + } + + +if (!(ft8006m_gesture_data.gesture_all_switch)) { + lcd_power_ctrl(data, 0); +} + + data->suspended = true; + + FTS_FUNC_EXIT(); + + return 0; +} +EXPORT_SYMBOL(ft8006m_ts_suspend); +/***************************************************************************** +* Name: fts_ts_resume +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int ft8006m_ts_resume(struct device *dev) +{ + struct fts_ts_data *data = dev_get_drvdata(dev); + + FTS_FUNC_ENTER(); + if (!data->suspended) { + FTS_DEBUG("Already in awake state"); + FTS_FUNC_EXIT(); + return -EPERM; + } + fts_release_all_finger(); + + + + if ((!(ft8006m_gesture_data.gesture_all_switch)) || panel_dead2tp) { + FTS_ERROR("%s:panel_dead2tp=%d", __func__, panel_dead2tp); + panel_dead2tp = 0; + lcd_power_ctrl(data, 1); + } + +#if (!FTS_CHIP_IDC) + ft8006m_reset_proc(200); +#endif + + ft8006m_tp_state_recovery(data->client); + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_resume(); +#endif + +#if FTS_GESTURE_EN + if (ft8006m_gesture_data.gesture_all_switch) { + if (ft8006m_gesture_resume(data->client) == 0) { + int err; + err = disable_irq_wake(data->client->irq); + if (err) + FTS_ERROR("%s: disable_irq_wake failed", __func__); + data->suspended = false; + FTS_FUNC_EXIT(); + return 0; + } + } + +#endif + +#if FTS_PSENSOR_EN + if (fts_sensor_resume(data) != 0) { + disable_irq_wake(data->client->irq); + data->suspended = false; + FTS_FUNC_EXIT(); + return 0; + } +#endif + + data->suspended = false; + + ft8006m_irq_enable(); + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* I2C Driver +*****************************************************************************/ +static const struct i2c_device_id fts_ts_id[] = { + {FTS_DRIVER_NAME, 0}, + {}, +}; +MODULE_DEVICE_TABLE(i2c, fts_ts_id); + +static struct of_device_id fts_match_table[] = { + { .compatible = "focaltech,ft8006m", }, + { }, +}; + +static struct i2c_driver fts_ts_driver = { + .probe = fts_ts_probe, + .remove = fts_ts_remove, + .shutdown = fts_ts_shutdown, + .driver = { + .name = FTS_DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = fts_match_table, + }, + .id_table = fts_ts_id, +}; + +/***************************************************************************** +* Name: fts_ts_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int __init fts_ts_init(void) +{ + int ret = 0; + FTS_FUNC_ENTER(); + ret = i2c_add_driver(&fts_ts_driver); + if (ret != 0) { + FTS_ERROR("Focaltech touch screen driver init failed!"); + } + FTS_FUNC_EXIT(); + return ret; +} + +/***************************************************************************** +* Name: fts_ts_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void __exit fts_ts_exit(void) +{ + i2c_del_driver(&fts_ts_driver); +} + +module_init(fts_ts_init); +module_exit(fts_ts_exit); + +MODULE_AUTHOR("FocalTech Driver Team"); +MODULE_DESCRIPTION("FocalTech Touchscreen Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/FT8006m/focaltech_core.h b/drivers/input/touchscreen/FT8006m/focaltech_core.h new file mode 100755 index 0000000000000..66339c1949316 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_core.h @@ -0,0 +1,212 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/***************************************************************************** +* +* File Name: focaltech_core.h + +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +#ifndef __LINUX_FOCALTECH_CORE_H__ +#define __LINUX_FOCALTECH_CORE_H__ +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "focaltech_common.h" +#include "focaltech_flash.h" +#if FTS_PSENSOR_EN +#include +#endif +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define LEN_FLASH_ECC_MAX 0xFFFE + +#define FTS_WORKQUEUE_NAME "fts_wq" + +#define FTS_MAX_POINTS 10 +#define FTS_KEY_WIDTH 50 +#define FTS_ONE_TCH_LEN 6 +#define POINT_READ_BUF (3 + FTS_ONE_TCH_LEN * FTS_MAX_POINTS) + +#define FTS_MAX_ID 0x0F +#define FTS_TOUCH_X_H_POS 3 +#define FTS_TOUCH_X_L_POS 4 +#define FTS_TOUCH_Y_H_POS 5 +#define FTS_TOUCH_Y_L_POS 6 +#define FTS_TOUCH_PRE_POS 7 +#define FTS_TOUCH_AREA_POS 8 +#define FTS_TOUCH_POINT_NUM 2 +#define FTS_TOUCH_EVENT_POS 3 +#define FTS_TOUCH_ID_POS 5 +#define FTS_COORDS_ARR_SIZE 4 + +#define FTS_TOUCH_DOWN 0 +#define FTS_TOUCH_UP 1 +#define FTS_TOUCH_CONTACT 2 + +#define FTS_SYSFS_ECHO_ON(buf) ((strnicmp(buf, "1", 1) == 0) || \ + (strnicmp(buf, "on", 2) == 0)) +#define FTS_SYSFS_ECHO_OFF(buf) ((strnicmp(buf, "0", 1) == 0) || \ + (strnicmp(buf, "off", 3) == 0)) + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + + +struct fts_ts_platform_data { + u32 irq_gpio; + u32 irq_gpio_flags; + u32 reset_gpio; + u32 reset_gpio_flags; + bool have_key; + u32 key_number; + u32 keys[4]; + u32 key_y_coord; + u32 key_x_coords[4]; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; + u32 max_touch_number; +}; + +struct ts_event { + u16 au16_x[FTS_MAX_POINTS]; /*x coordinate */ + u16 au16_y[FTS_MAX_POINTS]; /*y coordinate */ + u16 pressure[FTS_MAX_POINTS]; + u8 au8_touch_event[FTS_MAX_POINTS]; /* touch event: 0 -- down; 1-- up; 2 -- contact */ + u8 au8_finger_id[FTS_MAX_POINTS]; /*touch ID */ + u8 area[FTS_MAX_POINTS]; + u8 touch_point; + u8 point_num; +}; + +struct fts_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct ts_event event; + const struct fts_ts_platform_data *pdata; +#if FTS_PSENSOR_EN + struct fts_psensor_platform_data *psensor_pdata; +#endif + struct work_struct touch_event_work; + struct workqueue_struct *ts_workqueue; + struct regulator *vdd; + struct regulator *vcc_i2c; + struct regulator *lab; + struct regulator *ibb; + struct regulator *panel_iovdd; + spinlock_t irq_lock; + struct mutex report_mutex; + u16 addr; + bool suspended; + u8 fw_ver[3]; + u8 fw_vendor_id; + int touchs; + int irq_disable; + char lockdown_info[128]; + +#if defined(CONFIG_FB) + struct notifier_block fb_notif; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + struct pinctrl_state *pinctrl_state_release; +}; + + +#if FTS_PSENSOR_EN +struct fts_psensor_platform_data { + struct input_dev *input_psensor_dev; + struct sensors_classdev ps_cdev; + int tp_psensor_opened; + char tp_psensor_data; /* 0 near, 1 far */ + struct fts_ts_data *data; +}; + +int fts_sensor_init(struct fts_ts_data *data); +int fts_sensor_read_data(struct fts_ts_data *data); +int fts_sensor_suspend(struct fts_ts_data *data); +int fts_sensor_resume(struct fts_ts_data *data); +int fts_sensor_remove(struct fts_ts_data *data); +#endif + +/***************************************************************************** +* Static variables +*****************************************************************************/ +extern struct i2c_client *ft8006m_i2c_client; +extern struct fts_ts_data *ft8006m_wq_data; +extern struct input_dev *ft8006m_input_dev; + + +#define EACHOPTO_VENDOR 0x80 +#define OFILM_VENDOR 0x51 +#define JUNDA_VENDOR 0x85 +#define HOLITECH_VENDOR 0x82 +#define TXD_VENDOR 0xe9 +#define BOE_VENDOR 0Xda +#define FW_NO_UPGRADE 0 +#define FW_UPGRADING 1 +#define FW_UPGRADED 2 +#define TP_IC_FT8716 0x87 +#define TP_IC_FT8006M 0x80 +extern u8 ft8006m_fw_upgrade_status; +#endif /* __LINUX_FOCALTECH_CORE_H__ */ diff --git a/drivers/input/touchscreen/FT8006m/focaltech_esdcheck.c b/drivers/input/touchscreen/FT8006m/focaltech_esdcheck.c new file mode 100755 index 0000000000000..665ab7fb23f43 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_esdcheck.c @@ -0,0 +1,458 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_esdcheck.c +* +* Author: luoguojin +* +* Created: 2016-08-03 +* +* Abstract: ESD check function +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By luougojin 2016-08-03 +* v1.1: By luougojin 2017-02-15 +* 1. Add LCD_ESD_PATCH to control idc_esdcheck_lcderror +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_ESDCHECK_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define ESDCHECK_WAIT_TIME 4000 +#define LCD_ESD_PATCH 0 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_esdcheck_st { + u8 active:1; /* 1- esd check active, need check esd 0- no esd check */ + u8 suspend:1; + u8 proc_debug:1; /* apk or adb is accessing I2C */ + u8 intr:1; /* 1- Interrupt trigger */ + u8 unused:4; + u8 flow_work_hold_cnt; /* Flow Work Cnt(reg0x91) keep a same value for x times. >=5 times is ESD, need reset */ + u8 flow_work_cnt_last; /* Save Flow Work Cnt(reg0x91) value */ + u32 hardware_reset_cnt; + u32 i2c_nack_cnt; + u32 i2c_dataerror_cnt; +}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct delayed_work fts_esdcheck_work; +static struct workqueue_struct *fts_esdcheck_workqueue; +static struct fts_esdcheck_st fts_esdcheck_data; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ +#if LCD_ESD_PATCH +/***************************************************************************** +* Name: lcd_esdcheck +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int lcd_need_reset; +static int tp_need_recovery; /* LCD reset cause Tp reset */ +int idc_esdcheck_lcderror(void) +{ + u8 val; + int ret; + + FTS_DEBUG("[ESD]Check LCD ESD"); + if ((tp_need_recovery == 1) && (lcd_need_reset == 0)) { + tp_need_recovery = 0; + /* LCD reset, need recover TP state */ + ft8006m_tp_state_recovery(ft8006m_i2c_client); + } + + ret = ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_ESD_SATURATE, &val); + if (ret < 0) { + FTS_ERROR("[ESD]: Read ESD_SATURATE(0xED) failed ret=%d!", ret); + return -EIO; + } + + if (val == 0xAA) { + /* + * 1. Set flag lcd_need_reset = 1; + * 2. LCD driver need reset(recovery) LCD and set lcd_need_reset to 0 + * 3. recover TP state + */ + FTS_INFO("LCD ESD, Execute LCD reset!"); + lcd_need_reset = 1; + tp_need_recovery = 1; + } + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_esdcheck_tp_reset +* Brief: esd check algorithm +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_esdcheck_tp_reset(void) +{ + FTS_FUNC_ENTER(); + + fts_esdcheck_data.flow_work_hold_cnt = 0; + fts_esdcheck_data.hardware_reset_cnt++; + + ft8006m_reset_proc(200); + ft8006m_tp_state_recovery(ft8006m_i2c_client); + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: get_chip_id +* Brief: Read Chip Id 3 times +* Input: +* Output: +* Return: 1 - Read Chip Id 3 times failed +* 0 - Read Chip Id pass +*****************************************************************************/ +static bool get_chip_id(void) +{ + int err = 0; + int i = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + + for (i = 0; i < 3; i++) { + reg_addr = FTS_REG_CHIP_ID; + err = ft8006m_i2c_read(ft8006m_i2c_client, ®_addr, 1, ®_value, 1); + + if (err < 0) { + FTS_ERROR("[ESD]: Read Reg 0xA3 failed ret = %d!!", err); + fts_esdcheck_data.i2c_nack_cnt++; + } else { + if ((reg_value == ft8006m_chip_types.chip_idh) || (reg_value == 0xEF)) /* Upgrade sometimes can't detect */ + break; + else + fts_esdcheck_data.i2c_dataerror_cnt++; + } + } + + /* if can't get correct data in 3 times, then need hardware reset */ + if (i >= 3) { + FTS_ERROR("[ESD]: Read Chip id 3 times failed, need execute TP reset!!"); + return 1; + } + + return 0; +} + +/***************************************************************************** +* Name: get_flow_cnt +* Brief: Read flow cnt(0x91) +* Input: +* Output: +* Return: 1 - Reg 0x91(flow cnt) abnormal: hold a value for 5 times +* 0 - Reg 0x91(flow cnt) normal +*****************************************************************************/ +static bool get_flow_cnt(void) +{ + int err = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + + reg_addr = FTS_REG_FLOW_WORK_CNT; + err = ft8006m_i2c_read(ft8006m_i2c_client, ®_addr, 1, ®_value, 1); + if (err < 0) { + FTS_ERROR("[ESD]: Read Reg 0x91 failed ret = %d!!", err); + fts_esdcheck_data.i2c_nack_cnt++; + } else { + if (reg_value == fts_esdcheck_data.flow_work_cnt_last) { + fts_esdcheck_data.flow_work_hold_cnt++; + } else { + fts_esdcheck_data.flow_work_hold_cnt = 0; + } + + fts_esdcheck_data.flow_work_cnt_last = reg_value; + } + + /* if read flow work cnt 5 times and the value are all the same, then need hardware_reset */ + if (fts_esdcheck_data.flow_work_hold_cnt >= 5) { + FTS_DEBUG("[ESD]: Flow Work Cnt(reg0x91) keep a value for 5 times, need execute TP reset!!"); + return 1; + } + + return 0; +} + +/***************************************************************************** +* Name: esdcheck_algorithm +* Brief: esd check algorithm +* Input: +* Output: +* Return: +*****************************************************************************/ +static int esdcheck_algorithm(void) +{ + int err = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + bool hardware_reset = 0; + + /* 1. esdcheck is interrupt, then return */ + if (fts_esdcheck_data.intr == 1) { + FTS_INFO("[ESD]: In interrupt state, not check esd, return immediately!!"); + return 0; + } + + /* 2. check power state, if suspend, no need check esd */ + if (fts_esdcheck_data.suspend == 1) { + FTS_INFO("[ESD]: In suspend, not check esd, return immediately!!"); + /* because in suspend state, adb can be used, when upgrade FW, will active ESD check(active = 1) + * But in suspend, then will don't queue_delayed_work, when resume, don't check ESD again + */ + fts_esdcheck_data.active = 0; + return 0; + } + + /* 3. check fts_esdcheck_data.proc_debug state, if 1-proc busy, no need check esd*/ + if (fts_esdcheck_data.proc_debug == 1) { + FTS_INFO("[ESD]: In apk or adb command mode, not check esd, return immediately!!"); + return 0; + } + + /* 4. In factory mode, can't check esd */ + reg_addr = FTS_REG_WORKMODE; + err = ft8006m_i2c_read(ft8006m_i2c_client, ®_addr, 1, ®_value, 1); + if (err < 0) { + fts_esdcheck_data.i2c_nack_cnt++; + } else if ((reg_value & 0x70) == FTS_REG_WORKMODE_FACTORY_VALUE) { + FTS_INFO("[ESD]: In factory mode, not check esd, return immediately!!"); + return 0; + } + + /* 5. IDC esd check lcd default:close */ +#if LCD_ESD_PATCH + idc_esdcheck_lcderror(); +#endif + + /* 6. Get Chip ID */ + hardware_reset = get_chip_id(); + + /* 7. get Flow work cnt: 0x91 If no change for 5 times, then ESD and reset */ + if (!hardware_reset) { + + hardware_reset = get_flow_cnt(); + } + + /* 8. If need hardware reset, then handle it here */ + if (hardware_reset == 1) { + fts_esdcheck_tp_reset(); + } + + + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_func +* Brief: fts_esdcheck_func +* Input: +* Output: +* Return: +*****************************************************************************/ +static void esdcheck_func(struct work_struct *work) +{ + FTS_FUNC_ENTER(); + + esdcheck_algorithm(); + + if (fts_esdcheck_data.suspend == 0) { + queue_delayed_work(fts_esdcheck_workqueue, &fts_esdcheck_work, msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } + + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_set_intr +* Brief: interrupt flag (main used in interrupt tp report) +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_set_intr(bool intr) +{ + /* interrupt don't add debug message */ + fts_esdcheck_data.intr = intr; + return 0; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_get_status(void) +* Brief: get current status +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_get_status(void) +{ + /* interrupt don't add debug message */ + return fts_esdcheck_data.active; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_proc_busy +* Brief: When APK or ADB command access TP via driver, then need set proc_debug, +* then will not check ESD. +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_proc_busy(bool proc_debug) +{ + fts_esdcheck_data.proc_debug = proc_debug; + return 0; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_switch +* Brief: FTS esd check function switch. +* Input: enable: 1 - Enable esd check +* 0 - Disable esd check +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_switch(bool enable) +{ + FTS_FUNC_ENTER(); + if (enable == 1) { + if (fts_esdcheck_data.active == 0) { + FTS_INFO("[ESD]: ESD check start!!"); + fts_esdcheck_data.active = 1; + queue_delayed_work(fts_esdcheck_workqueue, &fts_esdcheck_work, msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } + } else { + if (fts_esdcheck_data.active == 1) { + FTS_INFO("[ESD]: ESD check stop!!"); + fts_esdcheck_data.active = 0; + cancel_delayed_work_sync(&fts_esdcheck_work); + } + } + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_suspend +* Brief: Run when tp enter into suspend +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_suspend(void) +{ + FTS_FUNC_ENTER(); + ft8006m_esdcheck_switch(DISABLE); + fts_esdcheck_data.suspend = 1; + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_resume +* Brief: Run when tp resume +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_resume(void) +{ + FTS_FUNC_ENTER(); + ft8006m_esdcheck_switch(ENABLE); + fts_esdcheck_data.suspend = 0; + FTS_FUNC_EXIT(); + return 0; +} + + +/***************************************************************************** +* Name: ft8006m_esdcheck_init +* Brief: Init and create a queue work to check esd +* Input: +* Output: +* Return: < 0: Fail to create esd check queue +*****************************************************************************/ +int ft8006m_esdcheck_init(void) +{ + FTS_FUNC_ENTER(); + + INIT_DELAYED_WORK(&fts_esdcheck_work, esdcheck_func); + fts_esdcheck_workqueue = create_workqueue("fts_esdcheck_wq"); + if (fts_esdcheck_workqueue == NULL) { + FTS_INFO("[ESD]: Failed to create esd work queue!!"); + } + + memset((u8 *)&fts_esdcheck_data, 0, sizeof(struct fts_esdcheck_st)); + + ft8006m_esdcheck_switch(ENABLE); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_exit +* Brief: When FTS TP driver is removed, then call this function to destory work queue +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_exit(void) +{ + FTS_FUNC_ENTER(); + + destroy_workqueue(fts_esdcheck_workqueue); + + FTS_FUNC_EXIT(); + return 0; +} +#endif /* FTS_ESDCHECK_EN */ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_ex_fun.c b/drivers/input/touchscreen/FT8006m/focaltech_ex_fun.c new file mode 100644 index 0000000000000..b5525f28a1ecd --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_ex_fun.c @@ -0,0 +1,1236 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: Focaltech_ex_fun.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +/*create apk debug channel*/ +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_AUTOCLB 4 +#define PROC_UPGRADE_INFO 5 +#define PROC_WRITE_DATA 6 +#define PROC_READ_DATA 7 +#define PROC_SET_TEST_FLAG 8 +#define PROC_SET_SLAVE_ADDR 10 +#define PROC_HW_RESET 11 +#define PROC_NAME "ftxxxx-debug" +#define WRITE_BUF_SIZE 512 +#define READ_BUF_SIZE 512 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static unsigned char proc_operate_mode = PROC_UPGRADE; +static struct proc_dir_entry *fts_proc_entry; +static struct +{ + int op; + int reg; + int value; + int result; +} g_rwreg_result; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if FTS_ESDCHECK_EN +static void esd_process(u8 *writebuf, int buflen, bool flag) +{ + if (flag) { + if ((writebuf[1] == 0xFC) && (writebuf[2] == 0x55) && (buflen == 0x03)) { + /* Upgrade command */ + FTS_DEBUG("[ESD]: Upgrade command(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + ft8006m_esdcheck_switch(DISABLE); + } else if ((writebuf[1] == 0x00) && (writebuf[2] == 0x40) && (buflen == 0x03)) { + /* factory mode bit 4 5 6 */ + FTS_DEBUG("[ESD]: Entry factory mode(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + ft8006m_esdcheck_switch(DISABLE); + } else if ((writebuf[1] == 0x00) && (writebuf[2] == 0x00) && (buflen == 0x03)) { + /* normal mode bit 4 5 6 */ + FTS_DEBUG("[ESD]: Exit factory mode(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + ft8006m_esdcheck_switch(ENABLE); + } else { + ft8006m_esdcheck_proc_busy(1); + } + } else { + if ((writebuf[1] == 0x07) && (buflen == 0x02)) { + FTS_DEBUG("[ESD]: Upgrade finish-trigger reset(07)(%x %x)!!", writebuf[0], writebuf[1]); + ft8006m_esdcheck_switch(ENABLE); + } else { + ft8006m_esdcheck_proc_busy(0); + } + } +} +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) +/*interface of write proc*/ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static ssize_t fts_debug_write(struct file *filp, const char __user *buff, size_t count, loff_t *ppos) +{ + unsigned char writebuf[WRITE_BUF_SIZE]; + int buflen = count; + int writelen = 0; + int ret = 0; + char tmp[25]; + + if (copy_from_user(&writebuf, buff, buflen)) { + FTS_DEBUG("[APK]: copy from user error!!"); + return -EFAULT; + } +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 1); +#endif + proc_operate_mode = writebuf[0]; + switch (proc_operate_mode) { + case PROC_UPGRADE: + { + char upgrade_file_path[FILE_NAME_LENGTH]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + FTS_DEBUG("%s\n", upgrade_file_path); + ft8006m_irq_disable(); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(DISABLE); +#endif + if (ft8006m_updatefun_curr.upgrade_with_app_bin_file) + ret = ft8006m_updatefun_curr.upgrade_with_app_bin_file(ft8006m_i2c_client, upgrade_file_path); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(ENABLE); +#endif + ft8006m_irq_enable(); + if (ret < 0) { + FTS_ERROR("[APK]: upgrade failed!!"); + } + } + break; + + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]); +#if FTS_ESDCHECK_EN + if (writebuf[1] == 0) { + ft8006m_esdcheck_switch(DISABLE); + } else { + ft8006m_esdcheck_switch(ENABLE); + } +#endif + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_SET_SLAVE_ADDR: + + ret = ft8006m_i2c_client->addr; + FTS_DEBUG("Original i2c addr 0x%x ", ret<<1); + if (writebuf[1] != ft8006m_i2c_client->addr) { + ft8006m_i2c_client->addr = writebuf[1]; + FTS_DEBUG("Change i2c addr 0x%x to 0x%x", ret<<1, writebuf[1]<<1); + + } + break; + + case PROC_HW_RESET: + + sprintf(tmp, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_DEBUG("Begin HW Reset"); + ft8006m_reset_proc(1); + } + + break; + + case PROC_AUTOCLB: + FTS_DEBUG("[APK]: autoclb!!"); + ft8006m_ctpm_auto_clb(ft8006m_i2c_client); + break; + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = count - 1; + if (writelen > 0) { + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + } + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 0); +#endif + + if (ret < 0) { + return ret; + } else { + return count; + } +} + +/* interface of read proc */ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static ssize_t fts_debug_read(struct file *filp, char __user *buff, size_t count, loff_t *ppos) +{ + int ret = 0; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + unsigned char buf[READ_BUF_SIZE]; + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(1); +#endif + switch (proc_operate_mode) { + case PROC_UPGRADE: + + regaddr = FTS_REG_FW_VER; + ret = ft8006m_i2c_read_reg(ft8006m_i2c_client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = ft8006m_i2c_read(ft8006m_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = ft8006m_i2c_read(ft8006m_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + + if (copy_to_user(buff, buf, num_read_chars)) { + FTS_ERROR("[APK]: copy to user error!!"); + return -EFAULT; + } + + return num_read_chars; +} +static const struct file_operations fts_proc_fops = { + .owner = THIS_MODULE, + .read = fts_debug_read, + .write = fts_debug_write, +}; +#else +/* interface of write proc */ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static int fts_debug_write(struct file *filp, + const char __user *buff, unsigned long len, void *data) +{ + unsigned char writebuf[WRITE_BUF_SIZE]; + int buflen = len; + int writelen = 0; + int ret = 0; + char tmp[25]; + + if (copy_from_user(&writebuf, buff, buflen)) { + FTS_ERROR("[APK]: copy from user error!!"); + return -EFAULT; + } +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 1); +#endif + proc_operate_mode = writebuf[0]; + switch (proc_operate_mode) { + + case PROC_UPGRADE: + { + char upgrade_file_path[FILE_NAME_LENGTH]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + FTS_DEBUG("%s\n", upgrade_file_path); + ft8006m_irq_disable(); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(DISABLE); +#endif + if (ft8006m_updatefun_curr.upgrade_with_app_bin_file) + ret = ft8006m_updatefun_curr.upgrade_with_app_bin_file(ft8006m_i2c_client, upgrade_file_path); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(ENABLE); +#endif + ft8006m_irq_enable(); + if (ret < 0) { + FTS_ERROR("[APK]: upgrade failed!!"); + } + } + break; + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]); +#if FTS_ESDCHECK_EN + if (writebuf[1] == 0) { + ft8006m_esdcheck_switch(DISABLE); + } else { + ft8006m_esdcheck_switch(ENABLE); + } +#endif + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!n"); + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_SET_SLAVE_ADDR: + + ret = ft8006m_i2c_client->addr; + FTS_DEBUG("Original i2c addr 0x%x ", ret<<1); + if (writebuf[1] != ft8006m_i2c_client->addr) { + ft8006m_i2c_client->addr = writebuf[1]; + FTS_DEBUG("Change i2c addr 0x%x to 0x%x", ret<<1, writebuf[1]<<1); + + } + break; + + case PROC_HW_RESET: + + sprintf(tmp, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_DEBUG("Begin HW Reset"); + ft8006m_reset_proc(1); + } + + break; + + case PROC_AUTOCLB: + FTS_DEBUG("[APK]: autoclb!!"); + ft8006m_ctpm_auto_clb(ft8006m_i2c_client); + break; + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = len - 1; + if (writelen > 0) { + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + } + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 0); +#endif + + if (ret < 0) { + return ret; + } else { + return len; + } +} + +/* interface of read proc */ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static int fts_debug_read(char *page, char **start, + off_t off, int count, int *eof, void *data) +{ + int ret = 0; + unsigned char buf[READ_BUF_SIZE]; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(1); +#endif + switch (proc_operate_mode) { + case PROC_UPGRADE: + + regaddr = FTS_REG_FW_VER; + ret = ft8006m_i2c_read_reg(ft8006m_i2c_client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = ft8006m_i2c_read(ft8006m_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = ft8006m_i2c_read(ft8006m_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + + memcpy(page, buf, num_read_chars); + return num_read_chars; +} +#endif +/************************************************************************ +* Name: ft8006m_create_apk_debug_channel +* Brief: create apk debug channel +* Input: i2c info +* Output: no +* Return: success =0 +***********************************************************************/ +int ft8006m_create_apk_debug_channel(struct i2c_client *client) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + fts_proc_entry = proc_create(PROC_NAME, 0777, NULL, &fts_proc_fops); +#else + fts_proc_entry = create_proc_entry(PROC_NAME, 0777, NULL); +#endif + if (NULL == fts_proc_entry) { + FTS_ERROR("Couldn't create proc entry!"); + return -ENOMEM; + } else { + FTS_INFO("Create proc entry success!"); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)) + fts_proc_entry->write_proc = fts_debug_write; + fts_proc_entry->read_proc = fts_debug_read; +#endif + } + return 0; +} +/************************************************************************ +* Name: ft8006m_release_apk_debug_channel +* Brief: release apk debug channel +* Input: no +* Output: no +* Return: no +***********************************************************************/ +void ft8006m_release_apk_debug_channel(void) +{ + + if (fts_proc_entry) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + proc_remove(fts_proc_entry); +#else + remove_proc_entry(PROC_NAME, NULL); +#endif +} + +/* + * fts_hw_reset interface + */ +static ssize_t fts_hw_reset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} +static ssize_t fts_hw_reset_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t count = 0; + + ft8006m_reset_proc(200); + + count = snprintf(buf, PAGE_SIZE, "hw reset executed\n"); + + return count; +} + +/* + * fts_irq interface + */ +static ssize_t fts_irq_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[EX-FUN]enable irq"); + ft8006m_irq_enable(); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[EX-FUN]disable irq"); + ft8006m_irq_disable(); + } + return count; +} + +static ssize_t fts_irq_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return -EPERM; +} + +/************************************************************************ +* Name: fts_tpfwver_show +* Brief: show tp fw vwersion +* Input: device, device attribute, char buf +* Output: no +* Return: char number +***********************************************************************/ +static ssize_t fts_tpfwver_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t num_read_chars = 0; + u8 fwver = 0; + + mutex_lock(&ft8006m_input_dev->mutex); + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(1); +#endif + if (ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_FW_VER, &fwver) < 0) { + num_read_chars = snprintf(buf, PAGE_SIZE, "I2c transfer error!\n"); + } +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + if (fwver == 255) + num_read_chars = snprintf(buf, PAGE_SIZE, "get tp fw version fail!\n"); + else { + num_read_chars = snprintf(buf, PAGE_SIZE, "%02X\n", fwver); + } + + mutex_unlock(&ft8006m_input_dev->mutex); + + return num_read_chars; +} +/************************************************************************ +* Name: fts_tpfwver_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tpfwver_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +static int fts_is_hex_char(const char ch) +{ + int result = 0; + if (ch >= '0' && ch <= '9') { + result = 1; + } else if (ch >= 'a' && ch <= 'f') { + result = 1; + } else if (ch >= 'A' && ch <= 'F') { + result = 1; + } else { + result = 0; + } + + return result; +} + +static int fts_hex_char_to_int(const char ch) +{ + int result = 0; + if (ch >= '0' && ch <= '9') { + result = (int)(ch - '0'); + } else if (ch >= 'a' && ch <= 'f') { + result = (int)(ch - 'a') + 10; + } else if (ch >= 'A' && ch <= 'F') { + result = (int)(ch - 'A') + 10; + } else { + result = -1; + } + + return result; +} + +static int fts_hex_to_str(char *hex, int iHexLen, char *ch, int *iChLen) +{ + int high = 0; + int low = 0; + int tmp = 0; + int i = 0; + int iCharLen = 0; + if (hex == NULL || ch == NULL) { + return -EPERM; + } + + FTS_DEBUG("iHexLen: %d in function:%s!!\n\n", iHexLen, __func__); + + if (iHexLen % 2 == 1) { + return -ENOENT; + } + + for (i = 0; i < iHexLen; i += 2) { + high = fts_hex_char_to_int(hex[i]); + if (high < 0) { + ch[iCharLen] = '\0'; + return -ESRCH; + } + + low = fts_hex_char_to_int(hex[i+1]); + if (low < 0) { + ch[iCharLen] = '\0'; + return -ESRCH; + } + tmp = (high << 4) + low; + ch[iCharLen++] = (char)tmp; + } + ch[iCharLen] = '\0'; + *iChLen = iCharLen; + FTS_DEBUG("iCharLen: %d, iChLen: %d in function:%s!!\n\n", iCharLen, *iChLen, __func__); + return 0; +} + +static void fts_str_to_bytes(char *bufStr, int iLen, char *uBytes, int *iBytesLen) +{ + int i = 0; + int iNumChLen = 0; + + *iBytesLen = 0; + + for (i = 0; i < iLen; i++) { + if (fts_is_hex_char(bufStr[i])) { + bufStr[iNumChLen++] = bufStr[i]; + } + } + + bufStr[iNumChLen] = '\0'; + + fts_hex_to_str(bufStr, iNumChLen, uBytes, iBytesLen); +} +/************************************************************************ +* Name: fts_tprwreg_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tprwreg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&ft8006m_input_dev->mutex); + + if (!g_rwreg_result.op) { + if (g_rwreg_result.result == 0) { + count = sprintf(buf, "Read %02X: %02X\n", g_rwreg_result.reg, g_rwreg_result.value); + } else { + count = sprintf(buf, "Read %02X failed, ret: %d\n", g_rwreg_result.reg, g_rwreg_result.result); + } + } else { + if (g_rwreg_result.result == 0) { + count = sprintf(buf, "Write %02X, %02X success\n", g_rwreg_result.reg, g_rwreg_result.value); + } else { + count = sprintf(buf, "Write %02X failed, ret: %d\n", g_rwreg_result.reg, g_rwreg_result.result); + } + } + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_tprwreg_store +* Brief: read/write register +* Input: device, device attribute, char buf, char count +* Output: print register value +* Return: char count +***********************************************************************/ +static ssize_t fts_tprwreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + ssize_t num_read_chars = 0; + int retval; + long unsigned int wmreg = 0; + u8 regaddr = 0xff, regvalue = 0xff; + u8 valbuf[5] = {0}; + + memset(valbuf, 0, sizeof(valbuf)); + mutex_lock(&ft8006m_input_dev->mutex); + num_read_chars = count - 1; + if (num_read_chars != 2) { + if (num_read_chars != 4) { + FTS_ERROR("please input 2 or 4 character"); + goto error_return; + } + } + memcpy(valbuf, buf, num_read_chars); + retval = kstrtoul(valbuf, 16, &wmreg); + fts_str_to_bytes((char *)buf, num_read_chars, valbuf, &retval); + + if (1 == retval) { + regaddr = valbuf[0]; + retval = 0; + } else if (2 == retval) { + regaddr = valbuf[0]; + regvalue = valbuf[1]; + retval = 0; + } else + retval = -1; + + if (0 != retval) { + FTS_ERROR("%s() - ERROR: Could not convert the given input to a number. The given input was: \"%s\"", __FUNCTION__, buf); + goto error_return; + } +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(1); +#endif + if (2 == num_read_chars) { + g_rwreg_result.op = 0; + g_rwreg_result.reg = regaddr; + /*read register*/ + regaddr = wmreg; + g_rwreg_result.result = ft8006m_i2c_read_reg(client, regaddr, ®value); + if (g_rwreg_result.result < 0) { + FTS_ERROR("Could not read the register(0x%02x)", regaddr); + } else { + FTS_INFO("the register(0x%02x) is 0x%02x", regaddr, regvalue); + g_rwreg_result.value = regvalue; + g_rwreg_result.result = 0; + } + } else { + regaddr = wmreg>>8; + regvalue = wmreg; + + g_rwreg_result.op = 1; + g_rwreg_result.reg = regaddr; + g_rwreg_result.value = regvalue; + g_rwreg_result.result = ft8006m_i2c_write_reg(client, regaddr, regvalue); + if (g_rwreg_result.result < 0) { + FTS_ERROR("Could not write the register(0x%02x)", regaddr); + + } else { + FTS_INFO("Write 0x%02x into register(0x%02x) successful", regvalue, regaddr); + g_rwreg_result.result = 0; + } + } +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif +error_return: + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_fwupdate_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_fwupdate_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_fwupdate_store +* Brief: upgrade from *.i +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_fwupdate_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&ft8006m_input_dev->mutex); + ft8006m_irq_disable(); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(DISABLE); +#endif + if (ft8006m_updatefun_curr.upgrade_with_app_i_file) + ft8006m_updatefun_curr.upgrade_with_app_i_file(client); +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN + if (ft8006m_updatefun_curr.upgrade_with_lcd_cfg_i_file) + ft8006m_updatefun_curr.upgrade_with_lcd_cfg_i_file(client); +#endif +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(ENABLE); +#endif + ft8006m_irq_enable(); + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_fwupgradeapp_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_fwupgradeapp_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_fwupgradeapp_store +* Brief: upgrade from app.bin +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_fwupgradeapp_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + char fwname[FILE_NAME_LENGTH]; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + + mutex_lock(&ft8006m_input_dev->mutex); + ft8006m_irq_disable(); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(DISABLE); +#endif + if (ft8006m_updatefun_curr.upgrade_with_app_bin_file) + ft8006m_updatefun_curr.upgrade_with_app_bin_file(client, fwname); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(ENABLE); +#endif + ft8006m_irq_enable(); + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_driverversion_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_driverversion_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&ft8006m_input_dev->mutex); + + count = sprintf(buf, FTS_DRIVER_VERSION "\n"); + + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_driverversion_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_driverversion_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +#if FTS_ESDCHECK_EN +/************************************************************************ +* Name: fts_esdcheck_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_esdcheck_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + mutex_lock(&ft8006m_input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_DEBUG("enable esdcheck"); + ft8006m_esdcheck_switch(ENABLE); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_DEBUG("disable esdcheck"); + ft8006m_esdcheck_switch(DISABLE); + } + mutex_unlock(&ft8006m_input_dev->mutex); + + return -EPERM; +} + +/************************************************************************ +* Name: fts_esdcheck_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_esdcheck_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&ft8006m_input_dev->mutex); + + count = sprintf(buf, "Esd check: %s\n", ft8006m_esdcheck_get_status() ? "On" : "Off"); + + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +#endif +/************************************************************************ +* Name: fts_module_config_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_module_config_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + + mutex_lock(&ft8006m_input_dev->mutex); + + count += sprintf(buf, "FTS_CHIP_TYPE: \t\t\t%04X\n", FTS_CHIP_TYPE); + count += sprintf(buf+count, "FTS_DEBUG_EN: \t\t\t%s\n", FTS_DEBUG_EN ? "ON" : "OFF"); +#if defined(FTS_MT_PROTOCOL_B_EN) + count += sprintf(buf+count, "TS_MT_PROTOCOL_B_EN: \t\t%s\n", FTS_MT_PROTOCOL_B_EN ? "ON" : "OFF"); +#endif + count += sprintf(buf+count, "FTS_GESTURE_EN: \t\t%s\n", FTS_GESTURE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_ESDCHECK_EN: \t\t%s\n", FTS_ESDCHECK_EN ? "ON" : "OFF"); +#if defined(FTS_PSENSOR_EN) + count += sprintf(buf+count, "FTS_PSENSOR_EN: \t\t%s\n", FTS_PSENSOR_EN ? "ON" : "OFF"); +#endif + count += sprintf(buf+count, "FTS_GLOVE_EN: \t\t\t%s\n", FTS_GLOVE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_COVER_EN: \t\t%s\n", FTS_COVER_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_CHARGER_EN: \t\t\t%s\n", FTS_CHARGER_EN ? "ON" : "OFF"); + + count += sprintf(buf+count, "FTS_REPORT_PRESSURE_EN: \t\t%s\n", FTS_REPORT_PRESSURE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_FORCE_TOUCH_EN: \t\t%s\n", FTS_FORCE_TOUCH_EN ? "ON" : "OFF"); + + count += sprintf(buf+count, "FTS_TEST_EN: \t\t\t%s\n", FTS_TEST_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_APK_NODE_EN: \t\t%s\n", FTS_APK_NODE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_POWER_SOURCE_CUST_EN: \t%s\n", FTS_POWER_SOURCE_CUST_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_AUTO_UPGRADE_EN: \t\t%s\n", FTS_AUTO_UPGRADE_EN ? "ON" : "OFF"); + + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_module_config_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_module_config_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_show_log_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_show_log_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&ft8006m_input_dev->mutex); + + count = sprintf(buf, "Log: %s\n", ft8006m_g_show_log ? "On" : "Off"); + + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_show_log_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_show_log_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + + mutex_lock(&ft8006m_input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_DEBUG("enable show log info/error"); + ft8006m_g_show_log = 1; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_DEBUG("disable show log info/error"); + ft8006m_g_show_log = 0; + } + mutex_unlock(&ft8006m_input_dev->mutex); + return count; +} +/************************************************************************ +* Name: fts_dumpreg_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_dumpreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_dumpreg_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_dumpreg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + char tmp[256]; + int count = 0; + u8 regvalue = 0; + struct i2c_client *client; + + mutex_lock(&ft8006m_input_dev->mutex); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(1); +#endif + client = container_of(dev, struct i2c_client, dev); + ft8006m_i2c_read_reg(client, FTS_REG_POWER_MODE, ®value); + count += sprintf(tmp + count, "Power Mode:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_FW_VER, ®value); + count += sprintf(tmp + count, "FW Ver:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_VENDOR_ID, ®value); + count += sprintf(tmp + count, "Vendor ID:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_LCD_BUSY_NUM, ®value); + count += sprintf(tmp + count, "LCD Busy Number:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_GESTURE_EN, ®value); + count += sprintf(tmp + count, "Gesture Mode:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_CHARGER_MODE_EN, ®value); + count += sprintf(tmp + count, "charge stat:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_INT_CNT, ®value); + count += sprintf(tmp + count, "INT count:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_FLOW_WORK_CNT, ®value); + count += sprintf(tmp + count, "ESD count:0x%02x\n", regvalue); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + memcpy(buf, tmp, count); + mutex_unlock(&ft8006m_input_dev->mutex); + return count; +} + +/****************************************/ +/* sysfs */ +/* get the fw version +* example:cat fw_version +*/ +static DEVICE_ATTR(fts_fw_version, S_IRUGO|S_IWUSR, fts_tpfwver_show, fts_tpfwver_store); + +/* upgrade from *.i +* example: echo 1 > fw_update +*/ +static DEVICE_ATTR(fts_fw_update, S_IRUGO|S_IWUSR, fts_fwupdate_show, fts_fwupdate_store); +/* read and write register +* read example: echo 88 > rw_reg ---read register 0x88 +* write example:echo 8807 > rw_reg ---write 0x07 into register 0x88 +* +* note:the number of input must be 2 or 4.if it not enough,please fill in the 0. +*/ +static DEVICE_ATTR(fts_rw_reg, S_IRUGO|S_IWUSR, fts_tprwreg_show, fts_tprwreg_store); +/* upgrade from app.bin +* example:echo "*_app.bin" > upgrade_app +*/ +static DEVICE_ATTR(fts_upgrade_app, S_IRUGO|S_IWUSR, fts_fwupgradeapp_show, fts_fwupgradeapp_store); +static DEVICE_ATTR(fts_driver_version, S_IRUGO|S_IWUSR, fts_driverversion_show, fts_driverversion_store); +static DEVICE_ATTR(fts_dump_reg, S_IRUGO|S_IWUSR, fts_dumpreg_show, fts_dumpreg_store); +static DEVICE_ATTR(fts_show_log, S_IRUGO|S_IWUSR, fts_show_log_show, fts_show_log_store); +static DEVICE_ATTR(fts_module_config, S_IRUGO|S_IWUSR, fts_module_config_show, fts_module_config_store); +static DEVICE_ATTR(fts_hw_reset, S_IRUGO|S_IWUSR, fts_hw_reset_show, fts_hw_reset_store); +static DEVICE_ATTR(fts_irq, S_IRUGO|S_IWUSR, fts_irq_show, fts_irq_store); + +#if FTS_ESDCHECK_EN +static DEVICE_ATTR(fts_esd_check, S_IRUGO|S_IWUSR, fts_esdcheck_show, fts_esdcheck_store); +#endif + +/* add your attr in here*/ +static struct attribute *fts_attributes[] = { + &dev_attr_fts_fw_version.attr, + &dev_attr_fts_fw_update.attr, + &dev_attr_fts_rw_reg.attr, + &dev_attr_fts_dump_reg.attr, + &dev_attr_fts_upgrade_app.attr, + &dev_attr_fts_driver_version.attr, + &dev_attr_fts_show_log.attr, + &dev_attr_fts_module_config.attr, + &dev_attr_fts_hw_reset.attr, + &dev_attr_fts_irq.attr, +#if FTS_ESDCHECK_EN + &dev_attr_fts_esd_check.attr, +#endif + NULL +}; + +static struct attribute_group fts_attribute_group = { + .attrs = fts_attributes +}; + +/************************************************************************ +* Name: ft8006m_create_sysfs +* Brief: create sysfs for debug +* Input: i2c info +* Output: no +* Return: success =0 +***********************************************************************/ +int ft8006m_create_sysfs(struct i2c_client *client) +{ + int err; + err = sysfs_create_group(&client->dev.kobj, &fts_attribute_group); + if (0 != err) { + FTS_ERROR("[EX]: sysfs_create_group() failed!!"); + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return -EIO; + } else { + FTS_INFO("[EX]: sysfs_create_group() succeeded!!"); + } + return err; +} +/************************************************************************ +* Name: ft8006m_remove_sysfs +* Brief: remove sys +* Input: i2c info +* Output: no +* Return: no +***********************************************************************/ +int ft8006m_remove_sysfs(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return 0; +} diff --git a/drivers/input/touchscreen/FT8006m/focaltech_ex_mode.c b/drivers/input/touchscreen/FT8006m/focaltech_ex_mode.c new file mode 100755 index 0000000000000..43327f7fd371d --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_ex_mode.c @@ -0,0 +1,347 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_ex_mode.c +* +* Author: Liu WeiGuang +* +* Created: 2016-08-31 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* 2.Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* 3.Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_mode_flag { + int fts_glove_mode_flag; + int fts_cover_mode_flag; + int fts_charger_mode_flag; +}; + +struct fts_mode_flag g_ft8006m_mode_flag; + +/***************************************************************************** +* 4.Static variables +*****************************************************************************/ + +/***************************************************************************** +* 5.Global variable or extern global variabls/functions +*****************************************************************************/ +int ft8006m_enter_glove_mode(struct i2c_client *client, int mode); +int ft8006m_glove_init(struct i2c_client *client); +int ft8006m_glove_exit(struct i2c_client *client); + +int ft8006m_enter_cover_mode(struct i2c_client *client, int mode); +int ft8006m_cover_init(struct i2c_client *client); +int ft8006m_cover_exit(struct i2c_client *client); + +int ft8006m_enter_charger_mode(struct i2c_client *client, int mode); +int ft8006m_charger_init(struct i2c_client *client); +int ft8006m_charger_exit(struct i2c_client *client); + +/***************************************************************************** +* 6.Static function prototypes +*******************************************************************************/ + +#if FTS_GLOVE_EN +static ssize_t fts_touch_glove_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Glove: %s\n", g_ft8006m_mode_flag.fts_glove_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_glove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_ft8006m_mode_flag.fts_glove_mode_flag) { + FTS_INFO("[Mode]enter glove mode"); + ret = ft8006m_enter_glove_mode(ft8006m_i2c_client, true); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_glove_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_ft8006m_mode_flag.fts_glove_mode_flag) { + FTS_INFO("[Mode]exit glove mode"); + ret = ft8006m_enter_glove_mode(ft8006m_i2c_client, false); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_glove_mode_flag = false; + } + } + } + FTS_INFO("[Mode]glove mode status: %d", g_ft8006m_mode_flag.fts_glove_mode_flag); + return count; +} + +/************************************************************************ +* Name: ft8006m_enter_glove_mode +* Brief: change glove mode +* Input: glove mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int ft8006m_enter_glove_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_GLOVE_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = ft8006m_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_ERROR("[Mode]ft8006m_enter_glove_mode write value fail"); + } + + return ret ; + +} + +/* read and write glove mode +* read example: cat fts_touch_glove_mode---read glove mode +* write example:echo 01 > fts_touch_glove_mode ---write glove mode to 01 +* +*/ +static DEVICE_ATTR (fts_glove_mode, S_IRUGO|S_IWUSR, fts_touch_glove_show, fts_touch_glove_store); + +#endif + +#if FTS_COVER_EN +static ssize_t fts_touch_cover_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Cover: %s\n", g_ft8006m_mode_flag.fts_cover_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_cover_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_ft8006m_mode_flag.fts_cover_mode_flag) { + FTS_INFO("[Mode]enter cover mode"); + ret = ft8006m_enter_cover_mode(ft8006m_i2c_client, true); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_cover_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_ft8006m_mode_flag.fts_cover_mode_flag) { + FTS_INFO("[Mode]exit cover mode"); + ret = ft8006m_enter_cover_mode(ft8006m_i2c_client, false); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_cover_mode_flag = false; + } + } + } + FTS_INFO("[Mode]cover mode status: %d", g_ft8006m_mode_flag.fts_cover_mode_flag); + return count; +} + +/************************************************************************ +* Name: ft8006m_enter_cover_mode +* Brief: change cover mode +* Input: cover mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int ft8006m_enter_cover_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_COVER_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = ft8006m_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_ERROR("[Mode] ft8006m_enter_cover_mode write value fail \n"); + } + + return ret ; + +} + +/* read and write cover mode +* read example: cat fts_touch_cover_mode---read cover mode +* write example:echo 01 > fts_touch_cover_mode ---write cover mode to 01 +* +*/ +static DEVICE_ATTR (fts_cover_mode, S_IRUGO|S_IWUSR, fts_touch_cover_show, fts_touch_cover_store); + +#endif + +#if FTS_CHARGER_EN +static ssize_t fts_touch_charger_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Charger: %s\n", g_ft8006m_mode_flag.fts_charger_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_charger_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_ft8006m_mode_flag.fts_charger_mode_flag) { + FTS_INFO("[Mode]enter charger mode"); + ret = ft8006m_enter_charger_mode(ft8006m_i2c_client, true); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_charger_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_ft8006m_mode_flag.fts_charger_mode_flag) { + FTS_INFO("[Mode]exit charger mode"); + ret = ft8006m_enter_charger_mode(ft8006m_i2c_client, false); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_charger_mode_flag = false; + } + } + } + FTS_INFO("[Mode]charger mode status: %d", g_ft8006m_mode_flag.fts_charger_mode_flag); + return count; +} + +/************************************************************************ +* Name: ft8006m_enter_charger_mode +* Brief: change charger mode +* Input: charger mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int ft8006m_enter_charger_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_CHARGER_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = ft8006m_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_DEBUG("[Mode]ft8006m_enter_charger_mode write value fail"); + } + + return ret ; + +} + +/* read and write charger mode +* read example: cat fts_touch_charger_mode---read charger mode +* write example:echo 01 > fts_touch_charger_mode ---write charger mode to 01 +* +*/ +static DEVICE_ATTR (fts_charger_mode, S_IRUGO|S_IWUSR, fts_touch_charger_show, fts_touch_charger_store); + +#endif + +static struct attribute *fts_touch_mode_attrs[] = { +#if FTS_GLOVE_EN + &dev_attr_fts_glove_mode.attr, +#endif + +#if FTS_COVER_EN + &dev_attr_fts_cover_mode.attr, +#endif + +#if FTS_CHARGER_EN + &dev_attr_fts_charger_mode.attr, +#endif + + NULL, +}; + +static struct attribute_group fts_touch_mode_group = { + .attrs = fts_touch_mode_attrs, +}; + +int ft8006m_ex_mode_init(struct i2c_client *client) +{ + int err = 0; + + g_ft8006m_mode_flag.fts_glove_mode_flag = false; + g_ft8006m_mode_flag.fts_cover_mode_flag = false; + g_ft8006m_mode_flag.fts_charger_mode_flag = false; + + err = sysfs_create_group(&client->dev.kobj, &fts_touch_mode_group); + if (0 != err) { + FTS_ERROR("[Mode]create sysfs failed."); + sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group); + return -EIO; + } else { + FTS_DEBUG("[Mode]create sysfs succeeded"); + } + + return err; + +} + +int ft8006m_ex_mode_exit(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group); + return 0; +} + +int ft8006m_ex_mode_recovery(struct i2c_client *client) +{ + int ret = 0; +#if FTS_GLOVE_EN + if (g_ft8006m_mode_flag.fts_glove_mode_flag) + ret = ft8006m_enter_glove_mode(client, true); +#endif + +#if FTS_COVER_EN + if (g_ft8006m_mode_flag.fts_cover_mode_flag) + ret = ft8006m_enter_cover_mode(client, true); +#endif + +#if FTS_CHARGER_EN + if (g_ft8006m_mode_flag.fts_charger_mode_flag) + ret = ft8006m_enter_charger_mode(client, true); +#endif + + return ret; +} + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash.c b/drivers/input/touchscreen/FT8006m/focaltech_flash.c new file mode 100644 index 0000000000000..b1f697ef44730 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash.c @@ -0,0 +1,808 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_flash.c +* +* Author: fupeipei +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#include "focaltech_flash.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ +struct ft_chip_t ft8006m_chip_types; +u8 ft8006m_fw_upgrade_status = FW_NO_UPGRADE; +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +/* Upgrade FW/PRAMBOOT/LCD CFG */ +u8 FT8006M_CTPM_FW[] = { +#include FTS_UPGRADE_FW_APP +}; + +u8 FT8006M_CTPM_FW_WHITE[] = { +#include FTS_UPGRADE_FW_ALL_WHITE +}; + +u8 FT8006M_CTPM_FW_BLACK[] = { +#include FTS_UPGRADE_FW_ALL_BLACK +}; +#if (FTS_GET_VENDOR_ID_NUM >= 2) +u8 FT8006M_FT8006M_CTPM_FW2[] = { +#include FTS_UPGRADE_FW2_APP +}; +#endif + +#if (FTS_GET_VENDOR_ID_NUM >= 3) +u8 FT8006M_FT8006M_CTPM_FW3[] = { +#include FTS_UPGRADE_FW3_APP +}; +#endif + +u8 ft8006m_aucFW_PRAM_BOOT[] = { +#ifdef FTS_UPGRADE_PRAMBOOT +#include FTS_UPGRADE_PRAMBOOT +#endif +}; + +struct fts_upgrade_fun ft8006m_updatefun_curr; +struct workqueue_struct *ft8006m_touch_wq; +struct work_struct ft8006m_fw_update_work; +u8 *ft8006m_g_fw_file; +int ft8006m_g_fw_len; +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/************************************************************************ +* Name: ft8006m_ctpm_upgrade_delay +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +void ft8006m_ctpm_upgrade_delay(u32 i) +{ + do { + i--; + } while (i > 0); +} + +/************************************************************************ +* Name: ft8006m_ctpm_i2c_hid2std +* Brief: HID to I2C +* Input: i2c info +* Output: no +* Return: fail =0 +***********************************************************************/ +int ft8006m_ctpm_i2c_hid2std(struct i2c_client *client) +{ +#if (FTS_CHIP_IDC) + return 0; +#else + u8 buf[5] = {0}; + int bRet = 0; + + buf[0] = 0xeb; + buf[1] = 0xaa; + buf[2] = 0x09; + bRet = ft8006m_i2c_write(client, buf, 3); + msleep(10); + buf[0] = buf[1] = buf[2] = 0; + ft8006m_i2c_read(client, buf, 0, buf, 3); + + if ((0xeb == buf[0]) && (0xaa == buf[1]) && (0x08 == buf[2])) { + FTS_DEBUG("hidi2c change to stdi2c successful!!"); + bRet = 1; + } else { + FTS_ERROR("hidi2c change to stdi2c error!!"); + bRet = 0; + } + + return bRet; +#endif +} + +/************************************************************************ +* Name: fts_get_ft8006m_chip_types +* Brief: get correct chip information +* Input: +* Output: +* Return: +***********************************************************************/ +void fts_get_ft8006m_chip_types(void) +{ + struct ft_chip_t ctype[] = FTS_CHIP_TYPE_MAPPING; + int ic_type = 0; + + if (sizeof(ctype) != sizeof(struct ft_chip_t)) /* only one array */ + ic_type = IC_SERIALS - 1; + + ft8006m_chip_types = ctype[ic_type]; + + FTS_INFO("CHIP TYPE ID = 0x%02x%02x", ft8006m_chip_types.chip_idh, ft8006m_chip_types.chip_idl); +} + +/************************************************************************ +* Name: ft8006m_ctpm_get_upgrade_array +* Brief: decide which ic +* Input: no +* Output: get ic info in fts_updateinfo_curr +* Return: no +***********************************************************************/ +void ft8006m_ctpm_get_upgrade_array(void) +{ + + FTS_FUNC_ENTER(); + + fts_get_ft8006m_chip_types(); + + ft8006m_ctpm_i2c_hid2std(ft8006m_i2c_client); + + /* Get functin pointer */ + memcpy(&ft8006m_updatefun_curr, &ft8006m_updatefun, sizeof(struct fts_upgrade_fun)); + + FTS_FUNC_EXIT(); +} + +/************************************************************************ +* Name: ft8006m_ctpm_rom_or_pram_reset +* Brief: RST CMD(07), reset to romboot(maybe->bootloader) +* Input: +* Output: +* Return: +***********************************************************************/ +void ft8006m_ctpm_rom_or_pram_reset(struct i2c_client *client) +{ + u8 rst_cmd = FTS_REG_RESET_FW; + + FTS_INFO("[UPGRADE]******Reset to romboot/bootloader******"); + ft8006m_i2c_write(client, &rst_cmd, 1); + /* The delay can't be changed */ + msleep(300); +} + +/************************************************************************ +* Name: ft8006m_ctpm_auto_clb +* Brief: auto calibration +* Input: i2c info +* Output: no +* Return: 0 +***********************************************************************/ +int ft8006m_ctpm_auto_clb(struct i2c_client *client) +{ +#if FTS_AUTO_CLB_EN + u8 uc_temp = 0x00; + u8 i = 0; + + /*start auto CLB */ + msleep(200); + + ft8006m_i2c_write_reg(client, 0, FTS_REG_WORKMODE_FACTORY_VALUE); + /*make sure already enter factory mode */ + msleep(100); + /*write command to start calibration */ + ft8006m_i2c_write_reg(client, 2, 0x4); + msleep(300); + if ((ft8006m_chip_types.chip_idh == 0x11) || (ft8006m_chip_types.chip_idh == 0x12) || (ft8006m_chip_types.chip_idh == 0x13) || (ft8006m_chip_types.chip_idh == 0x14)) { + for (i = 0; i < 100; i++) { + ft8006m_i2c_read_reg(client, 0x02, &uc_temp); + if (0x02 == uc_temp || + 0xFF == uc_temp) { + break; + } + msleep(20); + } + } else { + for (i = 0; i < 100; i++) { + ft8006m_i2c_read_reg(client, 0, &uc_temp); + if (0x0 == ((uc_temp&0x70)>>4)) { + break; + } + msleep(20); + } + } + ft8006m_i2c_write_reg(client, 0, 0x40); + msleep(200); + ft8006m_i2c_write_reg(client, 2, 0x5); + msleep(300); + ft8006m_i2c_write_reg(client, 0, FTS_REG_WORKMODE_WORK_VALUE); + msleep(300); +#endif + + return 0; +} + +/************************************************************************ +* Name: ft8006m_GetFirmwareSize +* Brief: get file size +* Input: file name +* Output: no +* Return: file size +***********************************************************************/ +int ft8006m_GetFirmwareSize(char *firmware_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[FILE_NAME_LENGTH]; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTXXXX_INI_FILEPATH_CONFIG, firmware_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_ERROR("error occured while opening file %s", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +/************************************************************************ +* Name: ft8006m_ReadFirmware +* Brief: read firmware buf for .bin file. +* Input: file name, data buf +* Output: data buf +* Return: 0 +***********************************************************************/ +int ft8006m_ReadFirmware(char *firmware_name, u8 *firmware_buf) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[FILE_NAME_LENGTH]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTXXXX_INI_FILEPATH_CONFIG, firmware_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_ERROR("[UPGRADE] Error occured while opening file %s.\n", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, firmware_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +/************************************************************************ +* Name: ft8006m_getsize +* Brief: Get different file's size +* Input: +* Output: +* Return: file's size +***********************************************************************/ +u32 ft8006m_getsize(u8 fw_type) +{ + int fw_len = 0; + + if (fw_type == FW_SIZE) + fw_len = sizeof(FT8006M_CTPM_FW_WHITE); +#if (FTS_GET_VENDOR_ID_NUM >= 2) + else if (fw_type == FW2_SIZE) + fw_len = sizeof(FT8006M_FT8006M_CTPM_FW2); +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 3) + else if (fw_type == FW3_SIZE) + fw_len = sizeof(FT8006M_FT8006M_CTPM_FW3); +#endif +#if FTS_CHIP_IDC + else if (fw_type == PRAMBOOT_SIZE) + fw_len = sizeof(ft8006m_aucFW_PRAM_BOOT); +#endif + + return fw_len; +} + +/************************************************************************ +* Name: ft8006m_ctpm_get_pram_or_rom_id +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +enum FW_STATUS ft8006m_ctpm_get_pram_or_rom_id(struct i2c_client *client) +{ + u8 buf[4]; + u8 reg_val[2] = {0}; + enum FW_STATUS inRomBoot = FTS_RUN_IN_ERROR; + + ft8006m_ctpm_i2c_hid2std(client); + + /*Enter upgrade mode*/ + /*send 0x55 in time windows*/ + buf[0] = FTS_UPGRADE_55; + buf[1] = FTS_UPGRADE_AA; + ft8006m_i2c_write(client, buf, 2); + + msleep(20); + + buf[0] = 0x90; + buf[1] = buf[2] = buf[3] = 0x00; + ft8006m_i2c_read(client, buf, 4, reg_val, 2); + + FTS_DEBUG("[UPGRADE] Read ROM/PRAM/Bootloader id:0x%02x%02x", reg_val[0], reg_val[1]); + if ((reg_val[0] == 0x00) || (reg_val[0] == 0xFF)) { + inRomBoot = FTS_RUN_IN_ERROR; + } else if (reg_val[0] == ft8006m_chip_types.pramboot_idh && reg_val[1] == ft8006m_chip_types.pramboot_idl) { + inRomBoot = FTS_RUN_IN_PRAM; + } else if (reg_val[0] == ft8006m_chip_types.rom_idh && reg_val[1] == ft8006m_chip_types.rom_idl) { + inRomBoot = FTS_RUN_IN_ROM; + } else if (reg_val[0] == ft8006m_chip_types.bootloader_idh && reg_val[1] == ft8006m_chip_types.bootloader_idl) { + inRomBoot = FTS_RUN_IN_BOOTLOADER; + } + + return inRomBoot; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_file +* Brief: get app file by Vendor ID +* Input: +* Output: +* Return: <0: vendor id not correct,not upgrade +***********************************************************************/ +int ft8006m_ctpm_get_i_file(struct i2c_client *client, int fw_valid) +{ + int ret; + + if (ft8006m_updatefun_curr.get_i_file) + ret = ft8006m_updatefun_curr.get_i_file(client, fw_valid); + else + ret = -EIO; + + return ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_get_app_ver +* Brief: get app file version +* Input: +* Output: +* Return: fw version +***********************************************************************/ +int ft8006m_ctpm_get_app_ver(void) +{ + int i_ret = 0; + + if (ft8006m_updatefun_curr.get_app_i_file_ver) + i_ret = ft8006m_updatefun_curr.get_app_i_file_ver(); + + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_fw_upgrade +* Brief: fw upgrade entry funciotn +* Input: +* Output: +* Return: 0 - upgrade successfully +* <0 - upgrade failed +***********************************************************************/ +int ft8006m_ctpm_fw_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + if (ft8006m_updatefun_curr.upgrade_with_app_i_file) + i_ret = ft8006m_updatefun_curr.upgrade_with_app_i_file(client); + + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_fw_upgrade +* Brief: fw upgrade entry funciotn +* Input: +* Output: +* Return: 0 - upgrade successfully +* <0 - upgrade failed +***********************************************************************/ +int ft8006m_ctpm_lcd_cfg_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + if (ft8006m_updatefun_curr.upgrade_with_lcd_cfg_i_file) + i_ret = ft8006m_updatefun_curr.upgrade_with_lcd_cfg_i_file(client); + + return i_ret; +} + +bool fts_check_fw_valid(struct i2c_client *client) +{ + int i = 0; + u8 chip_id = 0; + + for (i = 0; i < 3; i++) { + ft8006m_i2c_read_reg(client, FTS_REG_CHIP_ID, &chip_id); + if (chip_id == ft8006m_chip_types.chip_idh) + return true; + } + + return false; +} + +#if (!(FTS_UPGRADE_STRESS_TEST)) +/************************************************************************ +* Name: fts_ctpm_check_fw_status +* Brief: Check App is valid or not +* Input: +* Output: +* Return: -EIO - I2C communication error +* FTS_RUN_IN_APP - APP valid +* 0 - APP invalid +***********************************************************************/ +static int fts_ctpm_check_fw_status(struct i2c_client *client) +{ + u8 chip_id1 = 0; + u8 chip_id2 = 0; + int fw_status = FTS_RUN_IN_ERROR; + int i = 0; + int ret = 0; + int i2c_noack_retry = 0; + + for (i = 0; i < 5; i++) { + ret = ft8006m_i2c_read_reg(client, FTS_REG_CHIP_ID, &chip_id1); + if (ret < 0) { + i2c_noack_retry++; + continue; + } + ret = ft8006m_i2c_read_reg(client, FTS_REG_CHIP_ID2, &chip_id2); + if (ret < 0) { + i2c_noack_retry++; + continue; + } + + if ((chip_id1 == ft8006m_chip_types.chip_idh) +#if FTS_CHIP_IDC + && (chip_id2 == ft8006m_chip_types.chip_idl) +#endif + ) { + fw_status = FTS_RUN_IN_APP; + break; + } + } + + FTS_DEBUG("[UPGRADE]: chip_id = %02x%02x, ft8006m_chip_types.chip_idh = %02x%02x", + chip_id1, chip_id2, ft8006m_chip_types.chip_idh, ft8006m_chip_types.chip_idl); + + /* I2C No ACK 5 times, then return -EIO */ + if (i2c_noack_retry >= 5) + return -EIO; + + /* I2C communication ok, but not get correct ID, need check pram/rom/bootloader */ + if (i >= 5) { + fw_status = ft8006m_ctpm_get_pram_or_rom_id(client); + } + + return fw_status; +} + +/************************************************************************ +* Name: fts_ctpm_check_fw_ver +* Brief: Check vendor id is valid or not +* Input: +* Output: +* Return: 1 - vendor id valid +* 0 - vendor id invalid +***********************************************************************/ +static int fts_ctpm_check_fw_ver(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + u8 uc_host_fm_ver = 0; + + ft8006m_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + uc_host_fm_ver = ft8006m_ctpm_get_app_ver(); + + FTS_DEBUG("[UPGRADE]: uc_tp_fm_ver = 0x%x, uc_host_fm_ver = 0x%x!!", uc_tp_fm_ver, uc_host_fm_ver); + if (uc_tp_fm_ver < uc_host_fm_ver) { + return 1; + } else { + return 0; + } +} + +/************************************************************************ +* Name: fts_ctpm_check_need_upgrade +* Brief: +* Input: +* Output: +* Return: 1 - Need upgrade +* 0 - No upgrade +***********************************************************************/ +static int fts_ctpm_check_need_upgrade(struct i2c_client *client) +{ + int fw_status = 0; + int bUpgradeFlag = false; + + FTS_FUNC_ENTER(); + + /* 1. veriry FW APP is valid or not */ + fw_status = fts_ctpm_check_fw_status(client); + FTS_DEBUG("[UPGRADE]: fw_status = %d!!", fw_status); + if (fw_status < 0) { + /* I2C no ACK, return immediately */ + FTS_ERROR("[UPGRADE]******I2C NO ACK,exit upgrade******"); + return -EIO; + } else if (fw_status == FTS_RUN_IN_ERROR) { + FTS_ERROR("[UPGRADE]******IC Type Fail******"); + } else if (fw_status == FTS_RUN_IN_APP) { + FTS_INFO("[UPGRADE]**********FW APP valid**********"); + + if (ft8006m_ctpm_get_i_file(client, 1) != 0) { + FTS_DEBUG("[UPGRADE]******Get upgrade file(fw) fail******"); + return -EIO; + } + + if (fts_ctpm_check_fw_ver(client) == 1) { + FTS_DEBUG("[UPGRADE]**********need upgrade fw**********"); + bUpgradeFlag = true; + } else { + FTS_DEBUG("[UPGRADE]**********Don't need upgrade fw**********"); + bUpgradeFlag = false; + } + } else { + /* if app is invalid, reset to run ROM */ + FTS_INFO("[UPGRADE]**********FW APP invalid**********"); + ft8006m_ctpm_rom_or_pram_reset(client); + if (ft8006m_ctpm_get_i_file(client, 0) != 0) { + FTS_DEBUG("[UPGRADE]******Get upgrade file(flash) fail******"); + ft8006m_ctpm_rom_or_pram_reset(client); + return -EIO; + } + ft8006m_ctpm_rom_or_pram_reset(client); + bUpgradeFlag = true; + } + + FTS_FUNC_EXIT(); + + return bUpgradeFlag; +} + +/************************************************************************ +* Name: ft8006m_ctpm_auto_upgrade +* Brief: auto upgrade +* Input: +* Output: +* Return: 0 - no upgrade +***********************************************************************/ +int ft8006m_ctpm_auto_upgrade(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + int i_ret = 0; + int bUpgradeFlag = false; + u8 uc_upgrade_times = 0; + + FTS_DEBUG("[UPGRADE]********************check upgrade need or not********************"); + bUpgradeFlag = fts_ctpm_check_need_upgrade(client); + FTS_DEBUG("[UPGRADE]**********bUpgradeFlag = 0x%x**********", bUpgradeFlag); + if (bUpgradeFlag <= 0) { + FTS_DEBUG("[UPGRADE]**********No Upgrade, exit**********"); + + return bUpgradeFlag; + } else { + /* FW Upgrade */ + ft8006m_fw_upgrade_status = FW_UPGRADING; + do { + uc_upgrade_times++; + FTS_DEBUG("[UPGRADE]********************star upgrade(%d)********************", uc_upgrade_times); + + i_ret = ft8006m_ctpm_fw_upgrade(client); + if (i_ret == 0) { + /* upgrade success */ + ft8006m_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + FTS_DEBUG("[UPGRADE]********************Success upgrade to new fw version 0x%x********************", uc_tp_fm_ver); + + ft8006m_ctpm_auto_clb(client); + break; + } else { + /* upgrade fail, reset to run ROM BOOT.. + * if app in flash is ok, TP will work success + */ + FTS_ERROR("[UPGRADE]********************upgrade fail, reset now********************"); + ft8006m_ctpm_rom_or_pram_reset(client); + } + } while (uc_upgrade_times < 2); /* if upgrade fail, upgrade again. then return */ + ft8006m_fw_upgrade_status = FW_UPGRADED; + } + + return i_ret; +} +#endif + +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN +int fts_get_host_lic_ver(u8 *ver) +{ + int i_ret = 0; + + if (ft8006m_updatefun_curr.get_hlic_ver) + i_ret = ft8006m_updatefun_curr.get_hlic_ver(); + + if (i_ret > 0) + *ver = i_ret; + return i_ret; +} + +/* check if lcd init code need upgrade +* true-need false-no need +*/ +static bool fts_lic_need_upgrade(struct i2c_client *client) +{ + int ret = 0; + u8 initcode_ver_in_tp = 0; + u8 initcode_ver_in_host = 0; + bool fwvalid = false; + + fwvalid = fts_check_fw_valid(client); + if (!fwvalid) { + FTS_INFO("fw is invalid, no upgrade lcd init code"); + return false; + } + + ret = fts_get_host_lic_ver(&initcode_ver_in_host); + if (ret < 0) { + FTS_ERROR("init code in host invalid"); + return false; + } + + ret = ft8006m_i2c_read_reg(client, 0xE4, &initcode_ver_in_tp); + if (ret < 0) { + FTS_ERROR("read reg0xE4 fail"); + return false; + } + + FTS_DEBUG("tp init ver:%x, fw init ver:%x", initcode_ver_in_tp, initcode_ver_in_host); + if (0xA5 == initcode_ver_in_tp) { + FTS_INFO("lcd init code ver is 0xA5, don't upgade init code"); + return false; + } else if (0xFF == initcode_ver_in_tp) { + FTS_DEBUG("lcd init code in tp is invalid, need upgrade init code"); + return true; + } else if (initcode_ver_in_tp < initcode_ver_in_host) + return true; + else + return false; +} + +int fts_lic_upgrade(struct i2c_client *client) +{ + int ret = 0; + bool hlic_upgrade = false; + int upgrade_count = 0; + + hlic_upgrade = fts_lic_need_upgrade(client); + FTS_INFO("lcd init code upgrade flag:%d", hlic_upgrade); + if (hlic_upgrade) { + FTS_INFO("lcd init code upgrade..."); + do { + upgrade_count++; + ret = ft8006m_ctpm_lcd_cfg_upgrade(client); + if (0 == ret) { + FTS_INFO("lcd init code upgrade succussfully"); + break; + } else { + ft8006m_ctpm_rom_or_pram_reset(client); + } + } while (upgrade_count < 2); + } + + return ret; +} +#endif /* FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN */ + +#if FTS_AUTO_UPGRADE_EN +static void fts_ctpm_update_work_func(struct work_struct *work) +{ + int i_ret = 0; + + FTS_DEBUG("[UPGRADE]******************************FTS enter upgrade******************************"); + ft8006m_irq_disable(); + + /* esd check */ +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(DISABLE); +#endif + + i_ret = ft8006m_ctpm_auto_upgrade(ft8006m_i2c_client); + if (i_ret < 0) + FTS_ERROR("[UPGRADE]**********TP FW upgrade failed**********"); + +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN + + if (i_ret >= 0) { + i_ret = fts_lic_upgrade(ft8006m_i2c_client); + if (i_ret < 0) + FTS_ERROR("**********lcd init code upgrade failed**********"); + } +#endif + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(ENABLE); +#endif + ft8006m_irq_enable(); + + FTS_DEBUG("[UPGRADE]******************************FTS exit upgrade******************************"); +} + +/***************************************************************************** +* Name: ft8006m_ctpm_upgrade_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_ctpm_upgrade_init(void) +{ + FTS_FUNC_ENTER(); + + ft8006m_touch_wq = create_singlethread_workqueue("ft8006m_touch_wq"); + if (ft8006m_touch_wq) { + INIT_WORK(&ft8006m_fw_update_work, fts_ctpm_update_work_func); + queue_work(ft8006m_touch_wq, &ft8006m_fw_update_work); + } else { + FTS_ERROR("[UPGRADE]create_singlethread_workqueue failed\n"); + } + + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: ft8006m_ctpm_upgrade_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_ctpm_upgrade_exit(void) +{ + FTS_FUNC_ENTER(); + destroy_workqueue(ft8006m_touch_wq); + FTS_FUNC_EXIT(); +} + +#endif /* #if FTS_AUTO_UPGRADE_EN */ diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash.h b/drivers/input/touchscreen/FT8006m/focaltech_flash.h new file mode 100644 index 0000000000000..93e7c95700882 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash.h @@ -0,0 +1,131 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_flash.h +* +* Author: fupeipei +* +* Created: 2016-08-07 +* +* Abstract: +* +************************************************************************/ +#ifndef __LINUX_FOCALTECH_FLASH_H__ +#define __LINUX_FOCALTECH_FLASH_H__ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_flash/focaltech_upgrade_common.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_REG_ECC 0xCC +#define FTS_RST_CMD_REG2 0xBC +#define FTS_READ_ID_REG 0x90 +#define FTS_ERASE_APP_REG 0x61 +#define FTS_ERASE_PARAMS_CMD 0x63 +#define FTS_FW_WRITE_CMD 0xBF +#define FTS_REG_RESET_FW 0x07 +#define FTS_RST_CMD_REG1 0xFC +#define LEN_FLASH_ECC_MAX 0xFFFE + +#define FTS_PACKET_LENGTH 128 +#define FTS_SETTING_BUF_LEN 128 + +#define FTS_UPGRADE_LOOP 30 +#define AUTO_CLB_NEED 1 +#define AUTO_CLB_NONEED 0 +#define FTS_UPGRADE_AA 0xAA +#define FTS_UPGRADE_55 0x55 +#define FTXXXX_INI_FILEPATH_CONFIG "/sdcard/" + +enum FW_STATUS { + FTS_RUN_IN_ERROR, + FTS_RUN_IN_APP, + FTS_RUN_IN_ROM, + FTS_RUN_IN_PRAM, + FTS_RUN_IN_BOOTLOADER +}; + +enum FILE_SIZE_TYPE { + FW_SIZE, + FW2_SIZE, + FW3_SIZE, + PRAMBOOT_SIZE, +}; + +/* pramboot for 8716 */ +#define FTS_PRAMBOOT_8716 "include/pramboot/FT8716_Pramboot_V0.5_20160723.i" +#define FTS_UPGRADE_PRAMBOOT FTS_PRAMBOOT_8716 + + +#define FTS_PRAMBOOT_E716 "include/pramboot/FT8716_Pramboot_V0.5_20160723.i" +#define FTS_UPGRADE_PRAMBOOT FTS_PRAMBOOT_8716 + + + + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* IC info */ + +struct fts_upgrade_fun { + int (*get_i_file)(struct i2c_client *, int); + int (*get_app_bin_file_ver)(char *); + int (*get_app_i_file_ver)(void); + int (*upgrade_with_app_i_file)(struct i2c_client *); + int (*upgrade_with_app_bin_file)(struct i2c_client *, char *); + int (*get_hlic_ver)(void); + int (*upgrade_with_lcd_cfg_i_file)(struct i2c_client *); + int (*upgrade_with_lcd_cfg_bin_file)(struct i2c_client *, char *); +}; +extern struct fts_upgrade_fun ft8006m_updatefun; + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern u8 FT8006M_CTPM_FW[]; +extern u8 FT8006M_CTPM_FW_WHITE[]; +extern u8 FT8006M_CTPM_FW_BLACK[]; +extern u8 FT8006M_FT8006M_CTPM_FW2[]; +extern u8 FT8006M_FT8006M_CTPM_FW3[]; +extern u8 ft8006m_aucFW_PRAM_BOOT[]; +extern u8 FT8006M_CTPM_LCD_CFG[]; +extern u8 *ft8006m_g_fw_file; +extern int ft8006m_g_fw_len; +extern struct fts_upgrade_fun ft8006m_updatefun_curr; +extern struct ft_chip_t ft8006m_chip_types; + +#if FTS_AUTO_UPGRADE_EN +extern struct workqueue_struct *ft8006m_touch_wq; +extern struct work_struct ft8006m_fw_update_work; +#endif + +void ft8006m_ctpm_upgrade_init(void); +void ft8006m_ctpm_upgrade_exit(void); +void ft8006m_ctpm_upgrade_delay(u32 i); +void ft8006m_ctpm_get_upgrade_array(void); +int ft8006m_ctpm_auto_upgrade(struct i2c_client *client); +int ft8006m_fw_upgrade(struct device *dev, bool force); +int ft8006m_ctpm_auto_clb(struct i2c_client *client); + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +u32 ft8006m_getsize(u8 fw_type); +int ft8006m_GetFirmwareSize(char *firmware_name); +int ft8006m_ctpm_i2c_hid2std(struct i2c_client *client); +int ft8006m_ReadFirmware(char *firmware_name, u8 *firmware_buf); +void ft8006m_ctpm_rom_or_pram_reset(struct i2c_client *client); +enum FW_STATUS ft8006m_ctpm_get_pram_or_rom_id(struct i2c_client *client); +#endif + + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash/Makefile b/drivers/input/touchscreen/FT8006m/focaltech_flash/Makefile new file mode 100755 index 0000000000000..4c1c999d1932a --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for the focaltech touchscreen drivers. +# + +# Each configuration option enables a list of files. + + +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_upgrade_idc.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_upgrade_ft8006.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_upgrade_test.o diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_common.h b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_common.h new file mode 100755 index 0000000000000..f09d1cf50cfe9 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_common.h @@ -0,0 +1,57 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_upgrade_common.h +* +* Author: fupeipei +* +* Created: 2016-08-16 +* +* Abstract: +* +************************************************************************/ +#ifndef __LINUX_FOCALTECH_UPGRADE_COMMON_H__ +#define __LINUX_FOCALTECH_UPGRADE_COMMON_H__ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_flash.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +int ft8006m_ctpm_erase_flash(struct i2c_client *client); +int ft8006m_ctpm_pramboot_ecc(struct i2c_client *client); +bool ft8006m_ctpm_check_run_state(struct i2c_client *client, int state); +void ft8006m_ctpm_start_pramboot(struct i2c_client *client); +int ft8006m_ctpm_start_fw_upgrade(struct i2c_client *client); +bool ft8006m_ctpm_check_in_pramboot(struct i2c_client *client); +int ft8006m_ctpm_upgrade_idc_init(struct i2c_client *client); +int ft8006m_ctpm_write_app_for_idc(struct i2c_client *client, u32 length, u8 *readbuf); +int ft8006m_ctpm_upgrade_ecc(struct i2c_client *client, u32 startaddr, u32 length); +int ft8006m_ctpm_write_pramboot_for_idc(struct i2c_client *client, u32 length, u8 *readbuf); +int ft8006m_writeflash(struct i2c_client *client, u32 writeaddr, u32 length, u8 *readbuf, u32 cnt); +bool ft8006m_check_app_bin_valid_idc(u8 *pbt_buf); + +int ft8006m_ctpm_get_app_ver(void); +int ft8006m_ctpm_fw_upgrade(struct i2c_client *client); +int ft8006m_ctpm_lcd_cfg_upgrade(struct i2c_client *client); + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_ft8006.c b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_ft8006.c new file mode 100644 index 0000000000000..c26159b09d091 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_ft8006.c @@ -0,0 +1,1348 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_ft8006.c +* +* Author: fupeipei +* +* Created: 2016-08-15 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" + +#if (FTS_CHIP_TYPE == _FT8006) +#include "../focaltech_flash.h" +#include "focaltech_upgrade_common.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN +#define APP_OFFSET 0x5000 +#define APP_FILE_MAX_SIZE (116 * 1024) +#else +#define APP_OFFSET 0x0 +#define APP_FILE_MAX_SIZE (96 * 1024) +#endif + +#define APP_FILE_MIN_SIZE (8) +#define APP_FILE_VER_MAPPING (0x10E + APP_OFFSET) +#define APP_FILE_VENDORID_MAPPING (0x10C + APP_OFFSET) +#define APP_FILE_CHIPID_MAPPING (0x11E + APP_OFFSET) +#define CONFIG_START_ADDR (0xF80) +#define CONFIG_START_ADDR_LEN (0x80) +#define CONFIG_VENDOR_ID_OFFSET (0x04) +#define CONFIG_PROJECT_ID_OFFSET (0x20) +#define CONFIG_VENDOR_ID_ADDR (CONFIG_START_ADDR+CONFIG_VENDOR_ID_OFFSET) +#define CONFIG_PROJECT_ID_ADDR (CONFIG_START_ADDR+CONFIG_PROJECT_ID_OFFSET) +#define LCD_CFG_MAX_SIZE (4 * 1024) +#define LCD_CFG_MIN_SIZE (8) + +#define TP_WHITE_LOCKDOWN "44353102D1003100" +#define TP_BLACK_LOCKDOWN "44353202D1003100" + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +static int ft8006m_ctpm_get_i_file(struct i2c_client *client, int fw_valid); +static int fts_ctpm_get_app_i_file_ver(void); +static int fts_ctpm_get_app_bin_file_ver(char *firmware_name); +static int ft8006m_ctpm_fw_upgrade_with_app_i_file(struct i2c_client *client); +static int ft8006m_ctpm_fw_upgrade_with_app_bin_file(struct i2c_client *client, char *firmware_name); +static int ft8006m_ctpm_fw_upgrade_with_lcd_cfg_i_file(struct i2c_client *client); +static int fts_get_host_lic_ver(void); +static int Ft8006m_Read_Lockdown_From_Boot(struct i2c_client *client); + + +struct fts_upgrade_fun ft8006m_updatefun = { + .get_i_file = ft8006m_ctpm_get_i_file, + .get_app_bin_file_ver = fts_ctpm_get_app_bin_file_ver, + .get_app_i_file_ver = fts_ctpm_get_app_i_file_ver, + .upgrade_with_app_i_file = ft8006m_ctpm_fw_upgrade_with_app_i_file, + .upgrade_with_app_bin_file = ft8006m_ctpm_fw_upgrade_with_app_bin_file, + .get_hlic_ver = fts_get_host_lic_ver, + .upgrade_with_lcd_cfg_i_file = ft8006m_ctpm_fw_upgrade_with_lcd_cfg_i_file, + + .upgrade_with_lcd_cfg_bin_file = NULL, +}; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if (FTS_GET_VENDOR_ID_NUM != 0) +/************************************************************************ +* Name: fts_ctpm_get_vendor_id_flash +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +static int fts_ctpm_get_vendor_id_flash(struct i2c_client *client, u8 *vendor_id) +{ + bool inbootloader = false; + u8 rw_buf[10]; + int i_ret; + + ft8006m_ctpm_i2c_hid2std(client); + + i_ret = fts_ctpm_start_fw_upgrade(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: send upgrade cmd to FW error!!"); + return i_ret; + } + + /*Enter upgrade mode*/ + ft8006m_ctpm_i2c_hid2std(client); + msleep(10); + + inbootloader = ft8006m_ctpm_check_run_state(client, FTS_RUN_IN_BOOTLOADER); + if (!inbootloader) { + FTS_ERROR("[UPGRADE]: not run in bootloader, upgrade fail!!"); + return -EIO; + } + + /*read vendor id*/ + rw_buf[0] = 0x03; + rw_buf[1] = 0x00; + rw_buf[2] = (u8)(CONFIG_VENDOR_ID_ADDR >> 8); + rw_buf[3] = (u8)(CONFIG_VENDOR_ID_ADDR); + i_ret = ft8006m_i2c_write(client, rw_buf, 4); + msleep(10); /* must wait, otherwise read vendor id wrong */ + i_ret = ft8006m_i2c_read(client, NULL, 0, vendor_id, 1); + if (i_ret < 0) { + return -EIO; + } + FTS_DEBUG("Vendor ID from Flash:%x", *vendor_id); + return 0; +} +#endif + +/************************************************************************ +* Name: fts_ft5x46_get_i_file +* Brief: get .i file +* Input: +* Output: +* Return: 0 - ok +* <0 - fail +***********************************************************************/ +static int ft8006m_ctpm_get_i_file(struct i2c_client *client, int fw_valid) +{ + int ret = 0; + struct fts_ts_data *data; + data = i2c_get_clientdata(client); + +#if (FTS_GET_VENDOR_ID_NUM != 0) + u8 vendor_id = 0; + + if (fw_valid) { + ret = ft8006m_i2c_read_reg(client, FTS_REG_VENDOR_ID, &vendor_id); + } else + ret = fts_ctpm_get_vendor_id_flash(client, &vendor_id); + if (ret < 0) { + FTS_ERROR("Get upgrade file fail because of Vendor ID wrong"); + return ret; + } + FTS_INFO("[UPGRADE] vendor id in tp=%x", vendor_id); + FTS_INFO("[UPGRADE] vendor id in driver:%x, FTS_VENDOR_ID:%02x %02x %02x", + vendor_id, FTS_VENDOR_1_ID, FTS_VENDOR_2_ID, FTS_VENDOR_3_ID); + + ret = 0; + switch (vendor_id) { +#if (FTS_GET_VENDOR_ID_NUM >= 1) + case FTS_VENDOR_1_ID: + ft8006m_g_fw_file = FT8006M_CTPM_FW; + ft8006m_g_fw_len = ft8006m_getsize(FW_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:FT8006M_CTPM_FW, SIZE:%x", ft8006m_g_fw_len); + break; +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 2) + case FTS_VENDOR_2_ID: + ft8006m_g_fw_file = FT8006M_FT8006M_CTPM_FW2; + ft8006m_g_fw_len = ft8006m_getsize(FW2_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:FT8006M_FT8006M_CTPM_FW2, SIZE:%x", ft8006m_g_fw_len); + break; +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 3) + case FTS_VENDOR_3_ID: + ft8006m_g_fw_file = FT8006M_FT8006M_CTPM_FW3; + ft8006m_g_fw_len = ft8006m_getsize(FW3_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:FT8006M_FT8006M_CTPM_FW3, SIZE:%x", ft8006m_g_fw_len); + break; +#endif + default: + FTS_ERROR("[UPGRADE]Vendor ID check fail, get fw file fail"); + ret = -EIO; + break; + } +#else + /* (FTS_GET_VENDOR_ID_NUM == 0) */ + if (!strncmp(data->lockdown_info, TP_WHITE_LOCKDOWN, 16)) { + FTS_DEBUG(" TP color is WHITE\n"); + ret = 1; + } else if (!strncmp(data->lockdown_info, TP_BLACK_LOCKDOWN, 16)) { + FTS_DEBUG("TP color is BLACK\n"); + ret = 2; + } else{ + ret = Ft8006m_Read_Lockdown_From_Boot(client); + } + FTS_DEBUG("ret = %d\n", ret); + + if (ret == 1) { + ft8006m_g_fw_file = FT8006M_CTPM_FW_WHITE; + } else if (ret == 2) { + ft8006m_g_fw_file = FT8006M_CTPM_FW_BLACK; + } else{ + ft8006m_g_fw_file = NULL; + FTS_DEBUG("[UPGRADE] request tp FW fail!!!\n"); + } + ft8006m_g_fw_len = ft8006m_getsize(FW_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:FT8006M_CTPM_FW, SIZE:%x", ft8006m_g_fw_len); +#endif + + return ret?0:1; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_bin_file_ver +* Brief: get .i file version +* Input: no +* Output: no +* Return: fw version +***********************************************************************/ +static int fts_ctpm_get_app_bin_file_ver(char *firmware_name) +{ + u8 *pbt_buf = NULL; + int fwsize = 0; + int fw_ver = 0; + + FTS_FUNC_ENTER(); + + fwsize = ft8006m_GetFirmwareSize(firmware_name); + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fwsize); + return -EIO; + } + + pbt_buf = (unsigned char *)kmalloc(fwsize + 1, GFP_KERNEL); + if (ft8006m_ReadFirmware(firmware_name, pbt_buf)) { + FTS_ERROR("[UPGRADE]: request_firmware failed!!"); + kfree(pbt_buf); + return -EIO; + } + + fw_ver = pbt_buf[APP_FILE_VER_MAPPING]; + + kfree(pbt_buf); + FTS_FUNC_EXIT(); + + return fw_ver; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_i_file_ver +* Brief: get .i file version +* Input: no +* Output: no +* Return: fw version +***********************************************************************/ +static int fts_ctpm_get_app_i_file_ver(void) +{ + int fwsize = ft8006m_g_fw_len; + + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fwsize); + return 0; + } + + return ft8006m_g_fw_file[APP_FILE_VER_MAPPING]; +} + +/* read host lcd init code ver +* return 0 if host lcd init code is valid, otherwise return error code +*/ +static int fts_get_host_lic_ver(void) +{ + u8 *hlic_buf = ft8006m_g_fw_file; + u32 hlic_len = 0; + u8 hlic_ver[2] = { 0 }; + u32 upgfile_len = ft8006m_g_fw_len; + + if (upgfile_len < 4096) { + FTS_ERROR("upgrade file len fail"); + return -EINVAL; + } + hlic_len = (u32)(((u32)hlic_buf[2]) << 8) + hlic_buf[3]; + FTS_DEBUG("host lcd init code len:%x", hlic_len); + if (hlic_len >= upgfile_len) { + FTS_ERROR("host lcd init code len is too large"); + return -EINVAL; + } + + hlic_ver[0] = hlic_buf[hlic_len]; + hlic_ver[1] = hlic_buf[hlic_len + 1]; + + FTS_DEBUG("host lcd init code ver:%x %x", hlic_ver[0], hlic_ver[1]); + if (0xFF != (hlic_ver[0] + hlic_ver[1])) { + FTS_ERROR("host lcd init code version check fail"); + return -EINVAL; + } + + return hlic_ver[0]; +} + + +#define MAX_BANK_DATA 0x80 +#define MAX_GAMMA_LEN 0x180 +int gamma_analog[] = { 0x003A, 0x85, 0x00, 0x00, 0x2C, 0x2B }; +int gamma_digital1[] = { 0x0355, 0x8D, 0x00, 0x00, 0x80, 0x80 }; +int gamma_digital2[] = { 0x03d9, 0x8D, 0x80, 0x00, 0x14, 0x13 }; +int gamma_enable[] = { 0x040d, 0x91, 0x80, 0x00, 0x19, 0x01 }; +union short_bits{ + u16 dshort; + struct bits{ + u16 bit0:1; + u16 bit1:1; + u16 bit2:1; + u16 bit3:1; + u16 bit4:1; + u16 bit5:1; + u16 bit6:1; + u16 bit7:1; + u16 bit8:1; + u16 bit9:1; + u16 bit10:1; + u16 bit11:1; + u16 bit12:1; + u16 bit13:1; + u16 bit14:1; + u16 bit15:1; + } bits; +}; + +/* calculate lcd init code ecc */ +static int cal_lcdinitcode_ecc(u8 *buf, u16 *ecc_val) +{ + u32 bank_crc_en = 0; + u8 bank_data[MAX_BANK_DATA] = { 0 }; + u16 bank_len = 0; + u16 bank_addr = 0; + u32 bank_num = 0; + u16 file_len = 0; + u16 pos = 0; + int i = 0; + union short_bits ecc; + union short_bits ecc_last; + union short_bits temp_byte; + u8 bank_mapping[] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, + 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, 0x18, + 0x19, 0x1A, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x22, 0x23, 0x24}; + u8 banknum_8006 = 0; + + ecc.dshort = 0; + ecc_last.dshort = 0; + temp_byte.dshort = 0; + + file_len = (u16)(((u16)buf[2] << 8) + buf[3]); + bank_crc_en = (u32)(((u32)buf[9] << 24) + ((u32)buf[8] << 16) +\ + ((u32)buf[7] << 8) + (u32)buf[6]); + FTS_INFO("lcd init code len=%x bank en=%x", file_len, bank_crc_en); + + pos = 0x0A; + while (pos < file_len) { + bank_addr = (u16)(((u16)buf[pos + 0] << 8) + buf[pos + 1]); + bank_len = (u16)(((u16)buf[pos + 2] << 8) + buf[pos + 3]); + FTS_INFO("bank pos=%x bank_addr=%x bank_len=%x", pos, bank_addr, bank_len); + if (bank_len > MAX_BANK_DATA) + return -EINVAL; + memset(bank_data, 0, MAX_BANK_DATA); + memcpy(bank_data, buf + pos + 4, bank_len); + + bank_num = (bank_addr - 0x8000)/MAX_BANK_DATA; + FTS_INFO("actual mipi bank number = %x", bank_num); + for (i = 0; i < sizeof(bank_mapping)/sizeof(u8); i++) { + if (bank_num == bank_mapping[i]) { + banknum_8006 = i; + break; + } + } + if (i >= sizeof(bank_mapping)/sizeof(u8)) { + FTS_INFO("actual mipi bank(%d) not find in bank mapping, need jump", bank_num); + } else{ + FTS_INFO("8006 bank number = %d", banknum_8006); + if ((bank_crc_en >> banknum_8006) & 0x01) { + for (i = 0; i < MAX_BANK_DATA; i++) { + temp_byte.dshort = (u16)bank_data[i]; + if (i == 0) + FTS_INFO("data0=%x, %d %d %d %d %d %d %d %d", temp_byte.dshort, temp_byte.bits.bit0, + temp_byte.bits.bit1, temp_byte.bits.bit2, temp_byte.bits.bit3, temp_byte.bits.bit4, + temp_byte.bits.bit5, temp_byte.bits.bit6, temp_byte.bits.bit7); + + ecc.bits.bit0 = ecc_last.bits.bit8 ^ ecc_last.bits.bit9 ^ ecc_last.bits.bit10 ^ ecc_last.bits.bit11 + ^ ecc_last.bits.bit12 ^ ecc_last.bits.bit13 ^ ecc_last.bits.bit14 ^ ecc_last.bits.bit15 + ^ temp_byte.bits.bit0 ^ temp_byte.bits.bit1 ^ temp_byte.bits.bit2 ^ temp_byte.bits.bit3 + ^ temp_byte.bits.bit4 ^ temp_byte.bits.bit5 ^ temp_byte.bits.bit6 ^ temp_byte.bits.bit7; + + ecc.bits.bit1 = ecc_last.bits.bit9 ^ ecc_last.bits.bit10 ^ ecc_last.bits.bit11 ^ ecc_last.bits.bit12 + ^ ecc_last.bits.bit13 ^ ecc_last.bits.bit14 ^ ecc_last.bits.bit15 + ^ temp_byte.bits.bit1 ^ temp_byte.bits.bit2 ^ temp_byte.bits.bit3 ^ temp_byte.bits.bit4 + ^ temp_byte.bits.bit5 ^ temp_byte.bits.bit6 ^ temp_byte.bits.bit7; + + ecc.bits.bit2 = ecc_last.bits.bit8 ^ ecc_last.bits.bit9 ^ temp_byte.bits.bit0 ^ temp_byte.bits.bit1; + + ecc.bits.bit3 = ecc_last.bits.bit9 ^ ecc_last.bits.bit10 ^ temp_byte.bits.bit1 ^ temp_byte.bits.bit2; + + ecc.bits.bit4 = ecc_last.bits.bit10 ^ ecc_last.bits.bit11 ^ temp_byte.bits.bit2 ^ temp_byte.bits.bit3; + + ecc.bits.bit5 = ecc_last.bits.bit11 ^ ecc_last.bits.bit12 ^ temp_byte.bits.bit3 ^ temp_byte.bits.bit4; + + ecc.bits.bit6 = ecc_last.bits.bit12 ^ ecc_last.bits.bit13 ^ temp_byte.bits.bit4 ^ temp_byte.bits.bit5; + + ecc.bits.bit7 = ecc_last.bits.bit13 ^ ecc_last.bits.bit14 ^ temp_byte.bits.bit5 ^ temp_byte.bits.bit6; + + ecc.bits.bit8 = ecc_last.bits.bit0 ^ ecc_last.bits.bit14 ^ ecc_last.bits.bit15 ^ temp_byte.bits.bit6 ^ temp_byte.bits.bit7; + + ecc.bits.bit9 = ecc_last.bits.bit1 ^ ecc_last.bits.bit15 ^ temp_byte.bits.bit7; + + ecc.bits.bit10 = ecc_last.bits.bit2; + + ecc.bits.bit11 = ecc_last.bits.bit3; + + ecc.bits.bit12 = ecc_last.bits.bit4; + + ecc.bits.bit13 = ecc_last.bits.bit5; + + ecc.bits.bit14 = ecc_last.bits.bit6; + + ecc.bits.bit15 = ecc_last.bits.bit7 ^ ecc_last.bits.bit8 ^ ecc_last.bits.bit9 ^ ecc_last.bits.bit10 + ^ ecc_last.bits.bit11 ^ ecc_last.bits.bit12 ^ ecc_last.bits.bit13 ^ ecc_last.bits.bit14 ^ ecc_last.bits.bit15 + ^ temp_byte.bits.bit0 ^ temp_byte.bits.bit1 ^ temp_byte.bits.bit2 ^ temp_byte.bits.bit3 + ^ temp_byte.bits.bit4 ^ temp_byte.bits.bit5 ^ temp_byte.bits.bit6 ^ temp_byte.bits.bit7; + + ecc_last.dshort = ecc.dshort; + } + } + } + pos += bank_len + 4; + } + + *ecc_val = ecc.dshort; + FTS_INFO(""); + return 0; +} + +/* calculate lcd init code checksum */ +static unsigned short cal_lcdinitcode_checksum(u8 *ptr , int length) +{ + + u16 cFcs = 0; + int i, j; + + if (length%2) { + return 0xFFFF; + } + + for (i = 0; i < length; i += 2) { + cFcs ^= ((ptr[i] << 8) + ptr[i+1]); + for (j = 0; j < 16; j++) { + if (cFcs & 1) { + cFcs = (unsigned short)((cFcs >> 1) ^ ((1 << 15) + (1 << 10) + (1 << 3))); + } else { + cFcs >>= 1; + } + } + } + return cFcs; +} + +static int print_data(u8 *buf, u32 len) +{ + int i = 0; + int n = 0; + u8 *p = NULL; + + p = kmalloc(len*4, GFP_KERNEL); + memset(p, 0, len*4); + + for (i = 0; i < len; i++) { + n += sprintf(p + n, "%02x ", buf[i]); + } + + FTS_DEBUG("%s", p); + + kfree(p); + return 0; +} + +static int read_3gamma(struct i2c_client *client, u8 **gamma, u16 *len) +{ + int ret = 0; + int i = 0; + int packet_num = 0; + int packet_len = 0; + int remainder = 0; + u8 cmd[4] = { 0 }; + u32 addr = 0x01D000; + u8 gamma_header[0x20] = { 0 }; + u16 gamma_len = 0; + u16 gamma_len_n = 0; + u16 pos = 0; + bool gamma_has_enable = false; + u8 *pgamma = NULL; + int j = 0; + u8 gamma_ecc = 0; + + cmd[0] = 0x03; + cmd[1] = (u8)(addr >> 16); + cmd[2] = (u8)(addr >> 8); + cmd[3] = (u8)addr; + ret = ft8006m_i2c_write(client, cmd, 4); + msleep(10); + ret = ft8006m_i2c_read(client, NULL, 0, gamma_header, 0x20); + if (ret < 0) { + FTS_ERROR("read 3-gamma header fail"); + return ret; + } + + gamma_len = (u16)((u16)gamma_header[0] << 8) + gamma_header[1]; + gamma_len_n = (u16)((u16)gamma_header[2] << 8) + gamma_header[3]; + + if ((gamma_len + gamma_len_n) != 0xFFFF) { + FTS_INFO("gamma length check fail:%x %x", gamma_len, gamma_len); + return -EIO; + } + + if ((gamma_header[4] + gamma_header[5]) != 0xFF) { + FTS_INFO("gamma ecc check fail:%x %x", gamma_header[4], gamma_header[5]); + return -EIO; + } + + if (gamma_len > MAX_GAMMA_LEN) { + FTS_ERROR("gamma data len(%d) is too long", gamma_len); + return -EINVAL; + } + + *gamma = kmalloc(MAX_GAMMA_LEN, GFP_KERNEL); + if (NULL == *gamma) { + FTS_ERROR("malloc gamma memory fail"); + return -ENOMEM; + } + pgamma = *gamma; + + packet_num = gamma_len/256; + packet_len = 256; + remainder = gamma_len%256; + if (remainder) + packet_num++; + FTS_INFO("3-gamma len:%d", gamma_len); + cmd[0] = 0x03; + addr += 0x20; + for (i = 0; i < packet_num; i++) { + addr += i * 256; + cmd[1] = (u8)(addr >> 16); + cmd[2] = (u8)(addr >> 8); + cmd[3] = (u8)addr; + if ((i == packet_num - 1) && remainder) + packet_len = remainder; + ret = ft8006m_i2c_write(client, cmd, 4); + msleep(10); + ret = ft8006m_i2c_read(client, NULL, 0, pgamma + i*256, packet_len); + if (ret < 0) { + FTS_ERROR("read 3-gamma data fail"); + return ret; + } + } + + + + for (j = 0; j < gamma_len; j++) { + gamma_ecc ^= pgamma[j]; + } + FTS_INFO("back_3gamma_ecc: 0x%x, 0x%x", gamma_ecc, gamma_header[0x04]); + if (gamma_ecc != gamma_header[0x04]) { + FTS_ERROR("back gamma ecc check fail:%x %x", gamma_ecc, gamma_header[0x04]); + return -EIO; + } + + + /* check last byte is 91 80 00 19 01 */ + pos = gamma_len - 5; + if ((gamma_enable[1] == pgamma[pos]) && (gamma_enable[2] == pgamma[pos+1]) + && (gamma_enable[3] == pgamma[pos+2]) && (gamma_enable[4] == pgamma[pos+3])) { + gamma_has_enable = true; + } + + if (false == gamma_has_enable) { + FTS_INFO("3-gamma has no gamma enable info"); + pgamma[gamma_len++] = gamma_enable[1]; + pgamma[gamma_len++] = gamma_enable[2]; + pgamma[gamma_len++] = gamma_enable[3]; + pgamma[gamma_len++] = gamma_enable[4]; + pgamma[gamma_len++] = gamma_enable[5]; + } + + *len = gamma_len; + + FTS_DEBUG("read 3-gamma data:"); + print_data(*gamma, gamma_len); + + return 0; +} + +static int replace_3gamma(u8 *initcode, u8 *gamma, u16 gamma_len) +{ + u16 gamma_pos = 0; + + /* Analog Gamma */ + if ((initcode[gamma_analog[0]] == gamma[gamma_pos]) + && (initcode[gamma_analog[0] + 1] == gamma[gamma_pos + 1])) { + memcpy(initcode + gamma_analog[0] + 4 , gamma + gamma_pos + 4, gamma_analog[5]); + gamma_pos += gamma_analog[5] + 4; + } else + goto find_gamma_bank_err; + + /* Digital1 Gamma */ + if ((initcode[gamma_digital1[0]] == gamma[gamma_pos]) + && (initcode[gamma_digital1[0] + 1] == gamma[gamma_pos + 1])) { + memcpy(initcode + gamma_digital1[0] + 4 , gamma + gamma_pos + 4, gamma_digital1[5]); + gamma_pos += gamma_digital1[5] + 4; + } else + goto find_gamma_bank_err; + + /* Digital2 Gamma */ + if ((initcode[gamma_digital2[0]] == gamma[gamma_pos]) + && (initcode[gamma_digital2[0] + 1] == gamma[gamma_pos + 1])) { + memcpy(initcode + gamma_digital2[0] + 4 , gamma + gamma_pos + 4, gamma_digital2[5]); + gamma_pos += gamma_digital2[5] + 4; + } else + goto find_gamma_bank_err; + + /* enable Gamma */ + if ((initcode[gamma_enable[0]] == gamma[gamma_pos]) + && (initcode[gamma_enable[0] + 1] == gamma[gamma_pos + 1])) { + if (gamma[gamma_pos + 4]) + initcode[gamma_enable[0] + 4 + 15] |= 0x01; + else + initcode[gamma_enable[0] + 4 + 15] &= 0xFE; + gamma_pos += 1 + 4; + } else + goto find_gamma_bank_err; + + FTS_DEBUG("replace 3-gamma data:"); + print_data(initcode, 1100); + + return 0; + +find_gamma_bank_err: + FTS_INFO("3-gamma bank(%02x %02x) not find", + gamma[gamma_pos], gamma[gamma_pos+1]); + return -ENODATA; +} + +static int read_replace_3gamma(struct i2c_client *client, u8 *buf) +{ + int ret = 0; + u16 initcode_ecc = 0; + u16 initcode_checksum = 0; + u8 *gamma = NULL; + u16 gamma_len = 0; + + FTS_FUNC_ENTER(); + + ret = read_3gamma(client, &gamma, &gamma_len); + if (ret < 0) { + FTS_INFO("no vaid 3-gamma data, not replace"); + return 0; + } + + ret = replace_3gamma(buf, gamma, gamma_len); + if (ret < 0) { + FTS_ERROR("replace 3-gamma fail"); + kfree(gamma); + return ret; + } + + ret = cal_lcdinitcode_ecc(buf, &initcode_ecc); + if (ret < 0) { + FTS_ERROR("lcd init code ecc calculate fail"); + kfree(gamma); + return ret; + } + FTS_INFO("lcd init code cal ecc:%04x", initcode_ecc); + buf[4] = (u8)(initcode_ecc >> 8); + buf[5] = (u8)(initcode_ecc); + buf[0x43d] = (u8)(initcode_ecc >> 8); + buf[0x43c] = (u8)(initcode_ecc); + + initcode_checksum = cal_lcdinitcode_checksum(buf + 2, 0x43e - 2); + FTS_INFO("lcd init code calc checksum:%04x", initcode_checksum); + buf[0] = (u8)(initcode_checksum >> 8); + buf[1] = (u8)(initcode_checksum); + + FTS_FUNC_EXIT(); + + kfree(gamma); + return 0; +} + + +int check_initial_code_valid(struct i2c_client *client, u8 *buf) +{ + int ret = 0; + u16 initcode_ecc = 0; + u16 initcode_checksum = 0; + + initcode_checksum = cal_lcdinitcode_checksum(buf + 2, 0x43e - 2); + FTS_INFO("lcd init code calc checksum:%04x", initcode_checksum); + if (initcode_checksum != ((u16)((u16)buf[0] << 8) + buf[1])) { + FTS_ERROR("Initial Code checksum fail"); + return -EINVAL; + } + + ret = cal_lcdinitcode_ecc(buf, &initcode_ecc); + if (ret < 0) { + FTS_ERROR("lcd init code ecc calculate fail"); + return ret; + } + FTS_INFO("lcd init code cal ecc:%04x", initcode_ecc); + if (initcode_ecc != ((u16)((u16)buf[4] << 8) + buf[5])) { + FTS_ERROR("Initial Code ecc check fail"); + return -EINVAL; + } + + return 0; +} + +static int Ft8006m_Read_Lockdown_From_Boot(struct i2c_client *client) +{ + u8 buf[16] = {0}; + u8 rbuf[4] = {0}; + u32 i = 0; + u8 auc_i2c_write_buf[10]; + int i_ret = 0; + int ret = 0; + bool inbootloader = false; + + ft8006m_ctpm_i2c_hid2std(client); + + i_ret = ft8006m_ctpm_start_fw_upgrade(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: send upgrade cmd to FW error!!"); + return i_ret; + } + + /*Enter upgrade mode*/ + ft8006m_ctpm_i2c_hid2std(client); + msleep(10); + + inbootloader = ft8006m_ctpm_check_run_state(client, FTS_RUN_IN_BOOTLOADER); + if (!inbootloader) { + FTS_ERROR("[UPGRADE]: not run in bootloader, upgrade fail!!"); + return -EIO; + } + + rbuf[0] = 0x03; + rbuf[1] = 0x00; + for (i = 0; i < 30; i++) { + rbuf[2] = 0x0f; + rbuf[3] = 0xa0; + + i_ret = ft8006m_i2c_write(client, rbuf, 4); + if (i_ret < 0) { + FTS_ERROR("[FTS] Step 4: read lcm id from flash error when i2c write, i_ret = %d\n", i_ret); + continue; + } + + msleep(10); + + i_ret = ft8006m_i2c_read(client, rbuf, 0, buf, 16); + if (i_ret < 0) { + FTS_ERROR("[FTS] Step 4: read lcm id from flash error when i2c write, i_ret = %d\n", i_ret); + continue; + } + } + + FTS_DEBUG("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", \ + buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], + buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]); + FTS_DEBUG("[UPGRADE]: reset the new FW!!"); + auc_i2c_write_buf[0] = FTS_REG_RESET_FW; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1000); + + ft8006m_ctpm_i2c_hid2std(client); +if (!strncmp(buf, TP_WHITE_LOCKDOWN, 16)) { + FTS_DEBUG(" BOOT status:TP color is WHITE\n"); + ret = 1; +} else if (!strncmp(buf, TP_BLACK_LOCKDOWN, 16)) { + FTS_DEBUG("BOOT status:TP color is BLACK\n"); + ret = 2; +} + + return ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_use_buf +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +static int ft8006m_ctpm_fw_upgrade_use_buf(struct i2c_client *client, u8 *pbt_buf, u32 dw_lenth) +{ + u8 reg_val[4] = {0}; + u32 i = 0; + u32 packet_number; + u32 j = 0; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 upgrade_ecc; + int i_ret = 0; + bool inbootloader = false; + + ft8006m_ctpm_i2c_hid2std(client); + + i_ret = ft8006m_ctpm_start_fw_upgrade(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: send upgrade cmd to FW error!!"); + return i_ret; + } + + /*Enter upgrade mode*/ + ft8006m_ctpm_i2c_hid2std(client); + msleep(10); + + inbootloader = ft8006m_ctpm_check_run_state(client, FTS_RUN_IN_BOOTLOADER); + if (!inbootloader) { + FTS_ERROR("[UPGRADE]: not run in bootloader, upgrade fail!!"); + return -EIO; + } + + /*send upgrade type to reg 0x09: 0x0B: upgrade; 0x0A: download*/ + auc_i2c_write_buf[0] = 0x09; + auc_i2c_write_buf[1] = 0x0B; + ft8006m_i2c_write(client, auc_i2c_write_buf, 2); + + /* + * All.bin <= 128K + * APP.bin <= 94K + * LCD_CFG <= 4K + */ + auc_i2c_write_buf[0] = 0xB0; + auc_i2c_write_buf[1] = (u8) ((dw_lenth >> 16) & 0xFF); + auc_i2c_write_buf[2] = (u8) ((dw_lenth >> 8) & 0xFF); + auc_i2c_write_buf[3] = (u8) (dw_lenth & 0xFF); + ft8006m_i2c_write(client, auc_i2c_write_buf, 4); + + + /*erase the app erea in flash*/ + i_ret = ft8006m_ctpm_erase_flash(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: erase flash error!!"); + return i_ret; + } + + /*write FW to ctpm flash*/ + upgrade_ecc = 0; + FTS_DEBUG("[UPGRADE]: write FW to ctpm flash!!"); + temp = 0; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = FTS_FW_WRITE_CMD; + + for (j = 0; j < packet_number; j++) { + temp = 0x5000 + j * FTS_PACKET_LENGTH; + packet_buf[1] = (u8) (temp >> 16); + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + upgrade_ecc ^= packet_buf[6 + i]; + } + ft8006m_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + + + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((j + 0x1000 + (0x5000/FTS_PACKET_LENGTH)) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + if (i > 15) { + msleep(1); + FTS_DEBUG("[UPGRADE]: write flash: host : %x status : %x!!", (j + 0x1000 + (0x5000/FTS_PACKET_LENGTH)), (((reg_val[0]) << 8) | reg_val[1])); + } + + ft8006m_ctpm_upgrade_delay(10000); + } + } + + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = 0x5000 + packet_number * FTS_PACKET_LENGTH; + packet_buf[1] = (u8) (temp >> 16); + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + upgrade_ecc ^= packet_buf[6 + i]; + } + ft8006m_i2c_write(client, packet_buf, temp + 6); + + + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((0x1000 + ((0x5000 + packet_number * FTS_PACKET_LENGTH)/((dw_lenth) % FTS_PACKET_LENGTH))) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + if (i > 15) { + msleep(1); + FTS_DEBUG("[UPGRADE]: write flash: host : %x status : %x!!", (j + 0x1000 + (0x5000/FTS_PACKET_LENGTH)), (((reg_val[0]) << 8) | reg_val[1])); + } + + ft8006m_ctpm_upgrade_delay(10000); + } + } + + msleep(50); + + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + FTS_DEBUG("[UPGRADE]: read out checksum!!"); + auc_i2c_write_buf[0] = 0x64; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); + + temp = 0x5000; + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(temp >> 16); + auc_i2c_write_buf[2] = (u8)(temp >> 8); + auc_i2c_write_buf[3] = (u8)(temp); + temp = (64*1024-1); + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 6); + msleep(dw_lenth/256); + + temp = (0x5000+(64*1024-1)); + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(temp >> 16); + auc_i2c_write_buf[2] = (u8)(temp >> 8); + auc_i2c_write_buf[3] = (u8)(temp); + temp = (dw_lenth-(64*1024-1)); + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 6); + msleep(dw_lenth/256); + + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + FTS_DEBUG("[UPGRADE]: reg_val[0]=%02x reg_val[0]=%02x!!", reg_val[0], reg_val[1]); + break; + } + msleep(1); + + } + auc_i2c_write_buf[0] = 0x66; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != upgrade_ecc) { + FTS_ERROR("[UPGRADE]: ecc error! FW=%02x upgrade_ecc=%02x!!", reg_val[0], upgrade_ecc); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: checksum %x %x!!", reg_val[0], upgrade_ecc); + + FTS_DEBUG("[UPGRADE]: reset the new FW!!"); + auc_i2c_write_buf[0] = FTS_REG_RESET_FW; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1000); + + ft8006m_ctpm_i2c_hid2std(client); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_use_buf +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +static int ft8006m_ctpm_lcd_cfg_upgrade_use_buf(struct i2c_client *client, u8 *pbt_buf, u32 dw_lenth) +{ + u8 reg_val[4] = {0}; + u32 i = 0; + u32 packet_number; + u32 j = 0; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 upgrade_ecc; + int i_ret; + + ft8006m_ctpm_i2c_hid2std(client); + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + /*write 0xaa to register FTS_RST_CMD_REG1 */ + ft8006m_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_AA); + msleep(10); + + /*write 0x55 to register FTS_RST_CMD_REG1*/ + ft8006m_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_55); + msleep(200); + + /*Enter upgrade mode*/ + ft8006m_ctpm_i2c_hid2std(client); + + msleep(10); + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + auc_i2c_write_buf[1] = FTS_UPGRADE_AA; + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 2); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: failed writing 0x55 and 0xaa!!"); + continue; + } + + /*check run in bootloader or not*/ + msleep(1); + auc_i2c_write_buf[0] = FTS_READ_ID_REG; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = auc_i2c_write_buf[3] = 0x00; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + + if (reg_val[0] == ft8006m_chip_types.bootloader_idh + && reg_val[1] == ft8006m_chip_types.bootloader_idl) { + FTS_DEBUG("[UPGRADE]: read bootload id ok!! ID1 = 0x%x, ID2 = 0x%x!!", reg_val[0], reg_val[1]); + break; + } else { + FTS_ERROR("[UPGRADE]: read bootload id fail!! ID1 = 0x%x, ID2 = 0x%x!!", reg_val[0], reg_val[1]); + continue; + } + } + + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + + + i_ret = read_replace_3gamma(client, pbt_buf); + if (i_ret < 0) { + FTS_ERROR("replace 3-gamma fail, not upgrade lcd init code"); + return i_ret; + } + + i_ret = check_initial_code_valid(client, pbt_buf); + if (i_ret < 0) { + FTS_ERROR("initial code invalid, not upgrade lcd init code"); + return i_ret; + } + + /*send upgrade type to reg 0x09: 0x0B: upgrade; 0x0A: download*/ + auc_i2c_write_buf[0] = 0x09; + auc_i2c_write_buf[1] = 0x0C; + ft8006m_i2c_write(client, auc_i2c_write_buf, 2); + + /*Step 4:erase app and panel paramenter area*/ + FTS_DEBUG("[UPGRADE]: erase app and panel paramenter area!!"); + auc_i2c_write_buf[0] = FTS_ERASE_APP_REG; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1000); + + for (i = 0; i < 15; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + if (0xF0 == reg_val[0] && 0xAA == reg_val[1]) { + break; + } + msleep(50); + } + FTS_DEBUG("[UPGRADE]: erase app area reg_val[0] = %x reg_val[1] = %x!!", reg_val[0], reg_val[1]); + + auc_i2c_write_buf[0] = 0xB0; + auc_i2c_write_buf[1] = 0; + auc_i2c_write_buf[2] = (u8) ((dw_lenth >> 8) & 0xFF); + auc_i2c_write_buf[3] = (u8) (dw_lenth & 0xFF); + ft8006m_i2c_write(client, auc_i2c_write_buf, 4); + + /*write FW to ctpm flash*/ + upgrade_ecc = 0; + FTS_DEBUG("[UPGRADE]: write FW to ctpm flash!!"); + temp = 0; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = FTS_FW_WRITE_CMD; + packet_buf[1] = 0; + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + upgrade_ecc ^= packet_buf[6 + i]; + } + ft8006m_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + + + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((j + 0x1000) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + if (i > 15) { + msleep(1); + FTS_DEBUG("[UPGRADE]: write flash: host : %x status : %x!!", (j + 0x1000 + (0x5000/FTS_PACKET_LENGTH)), (((reg_val[0]) << 8) | reg_val[1])); + } + + ft8006m_ctpm_upgrade_delay(10000); + } + } + + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + upgrade_ecc ^= packet_buf[6 + i]; + } + ft8006m_i2c_write(client, packet_buf, temp + 6); + + + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((0x1000 + ((packet_number * FTS_PACKET_LENGTH)/((dw_lenth) % FTS_PACKET_LENGTH))) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + if (i > 15) { + msleep(1); + FTS_DEBUG("[UPGRADE]: write flash: host : %x status : %x!!", (j + 0x1000 + (0x5000/FTS_PACKET_LENGTH)), (((reg_val[0]) << 8) | reg_val[1])); + } + + ft8006m_ctpm_upgrade_delay(10000); + } + } + + msleep(50); + + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + FTS_DEBUG("[UPGRADE]: read out checksum!!"); + auc_i2c_write_buf[0] = 0x64; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); + + temp = 0x00; + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = 0; + auc_i2c_write_buf[2] = (u8)(temp >> 8); + auc_i2c_write_buf[3] = (u8)(temp); + temp = dw_lenth; + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 6); + msleep(dw_lenth/256); + + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + FTS_DEBUG("[UPGRADE]: reg_val[0]=%02x reg_val[0]=%02x!!", reg_val[0], reg_val[1]); + break; + } + msleep(1); + + } + auc_i2c_write_buf[0] = 0x66; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != upgrade_ecc) { + FTS_ERROR("[UPGRADE]: ecc error! FW=%02x upgrade_ecc=%02x!!", reg_val[0], upgrade_ecc); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: checksum %x %x!!", reg_val[0], upgrade_ecc); + + FTS_DEBUG("[UPGRADE]: reset the new FW!!"); + auc_i2c_write_buf[0] = FTS_REG_RESET_FW; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1000); + + ft8006m_ctpm_i2c_hid2std(client); + + return 0; +} +#endif +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_with_app_i_file +* Brief: upgrade with *.i file +* Input: i2c info +* Output: +* Return: fail < 0 +***********************************************************************/ +static int ft8006m_ctpm_fw_upgrade_with_app_i_file(struct i2c_client *client) +{ + int i_ret = 0; + u32 fw_len; + u8 *fw_buf; + + FTS_INFO("[UPGRADE]**********start upgrade with app.i**********"); + + fw_len = ft8006m_g_fw_len - APP_OFFSET; + fw_buf = ft8006m_g_fw_file + APP_OFFSET; + if (fw_len < APP_FILE_MIN_SIZE || fw_len > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fw_len); + return -EIO; + } + + i_ret = ft8006m_ctpm_fw_upgrade_use_buf(client, fw_buf, fw_len); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE] upgrade app.i failed"); + } else { + FTS_INFO("[UPGRADE]: upgrade app.i succeed"); + } + + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_fw_upgrade_with_lcd_cfg_i_file +* Brief: upgrade with *.i file +* Input: i2c info +* Output: no +* Return: fail <0 +***********************************************************************/ +static int ft8006m_ctpm_fw_upgrade_with_lcd_cfg_i_file(struct i2c_client *client) +{ + int i_ret = 0; + u32 fw_len; + u8 *fw_buf; + + FTS_INFO("[UPGRADE]**********start upgrade with lcd init code**********"); + + fw_len = ft8006m_g_fw_len; + fw_buf = ft8006m_g_fw_file; + if (fw_len < APP_FILE_MIN_SIZE || fw_len > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fw_len); + return -EIO; + } + + /*FW upgrade*/ + i_ret = ft8006m_ctpm_lcd_cfg_upgrade_use_buf(client, fw_buf, 4096); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE] init code upgrade fail, ret=%d", i_ret); + } else { + FTS_INFO("[UPGRADE] init code upgrade succeed"); + } + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_with_app_bin_file +* Brief: upgrade with *.bin file +* Input: i2c info, file name +* Output: no +* Return: success =0 +***********************************************************************/ +static int ft8006m_ctpm_fw_upgrade_with_app_bin_file(struct i2c_client *client, char *firmware_name) +{ + u8 *pbt_buf = NULL; + int i_ret = 0; + int fwsize = 0; + + FTS_INFO("[UPGRADE]**********start upgrade with app.bin**********"); + + fwsize = ft8006m_GetFirmwareSize(firmware_name); + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: app.bin length(%x) error, upgrade fail", fwsize); + return -EIO; + } + + pbt_buf = (unsigned char *)kmalloc(fwsize + 1, GFP_KERNEL); + if (NULL == pbt_buf) { + FTS_ERROR(" malloc pbt_buf failed "); + goto ERROR_BIN; + } + + if (ft8006m_ReadFirmware(firmware_name, pbt_buf)) { + FTS_ERROR("[UPGRADE]: request_firmware failed!!"); + goto ERROR_BIN; + } +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN + i_ret = ft8006m_ctpm_lcd_cfg_upgrade_use_buf(client, pbt_buf, 4096); + i_ret = ft8006m_ctpm_fw_upgrade_use_buf(client, pbt_buf + APP_OFFSET, fwsize - APP_OFFSET); +#else + i_ret = ft8006m_ctpm_fw_upgrade_use_buf(client, pbt_buf, fwsize); +#endif + if (i_ret != 0) { + FTS_ERROR("[UPGRADE]: upgrade app.bin failed"); + goto ERROR_BIN; + } else { + FTS_INFO("[UPGRADE]: upgrade app.bin succeed"); + } + + + kfree(pbt_buf); + return i_ret; +ERROR_BIN: + kfree(pbt_buf); + return -EIO; +} + + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_idc.c b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_idc.c new file mode 100755 index 0000000000000..e81b27ada8239 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_idc.c @@ -0,0 +1,575 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_idc.c +* +* Author: fupeipei +* +* Created: 2016-08-22 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" + +#if (FTS_CHIP_IDC == 1) +#include "../focaltech_flash.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +u8 ft8006m_upgrade_ecc; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/************************************************************************ +* Name: ft8006m_ctpm_upgrade_idc_init +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_upgrade_idc_init(struct i2c_client *client) +{ + int i_ret = 0; + u8 reg_val_id[4] = {0}; + u8 auc_i2c_write_buf[10]; + + FTS_INFO("[UPGRADE]**********Upgrade setting Init**********"); + + /*read flash ID*/ + auc_i2c_write_buf[0] = 0x05; + reg_val_id[0] = 0x00; + i_ret = ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val_id, 1); + if (i_ret < 0) { + return -EIO; + } + + /*set flash clk*/ + auc_i2c_write_buf[0] = 0x05; + auc_i2c_write_buf[1] = reg_val_id[0]; + auc_i2c_write_buf[2] = 0x00; + ft8006m_i2c_write(client, auc_i2c_write_buf, 3); + + /*send upgrade type to reg 0x09: 0x0B: upgrade; 0x0A: download*/ + auc_i2c_write_buf[0] = 0x09; + auc_i2c_write_buf[1] = 0x0B; + ft8006m_i2c_write(client, auc_i2c_write_buf, 2); + + return 0; +} + +/************************************************************************ +* Name: ft8006m_ctpm_start_pramboot +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +void ft8006m_ctpm_start_pramboot(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[10]; + + FTS_INFO("[UPGRADE]**********start pramboot**********"); + auc_i2c_write_buf[0] = 0x08; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(20); +} + +/************************************************************************ +* Name: ft8006m_ctpm_start_fw_upgrade +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_start_fw_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + /*send the soft upgrade commond to FW, and start upgrade*/ + FTS_INFO("[UPGRADE]**********send 0xAA and 0x55 to FW, start upgrade**********"); + + i_ret = ft8006m_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_AA); + msleep(10); + i_ret = ft8006m_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_55); + msleep(200); + + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_check_run_state +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +bool ft8006m_ctpm_check_run_state(struct i2c_client *client, int rstate) +{ + int i = 0; + enum FW_STATUS cstate = FTS_RUN_IN_ERROR; + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + cstate = ft8006m_ctpm_get_pram_or_rom_id(client); + FTS_DEBUG("[UPGRADE]: run state = %d", cstate); + + if (cstate == rstate) + return true; + msleep(20); + } + + return false; +} + +/************************************************************************ +* Name: ft8006m_ctpm_pramboot_ecc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_pramboot_ecc(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_FUNC_ENTER(); + + /*read out checksum, if pramboot checksum != host checksum, upgrade fail*/ + FTS_INFO("[UPGRADE]******read out pramboot checksum******"); + auc_i2c_write_buf[0] = 0xcc; + msleep(2); + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != ft8006m_upgrade_ecc) { /*pramboot checksum != host checksum, upgrade fail*/ + FTS_ERROR("[UPGRADE]: checksum fail : pramboot_ecc = %X, host_ecc = %X!!", reg_val[0], ft8006m_upgrade_ecc); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: checksum success : pramboot_ecc = %X, host_ecc = %X!!", reg_val[0], ft8006m_upgrade_ecc); + msleep(100); + + FTS_FUNC_EXIT(); + + return 0; +} + +/************************************************************************ +* Name: ft8006m_ctpm_upgrade_ecc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_upgrade_ecc(struct i2c_client *client, u32 startaddr, u32 length) +{ + u32 i = 0; + u8 auc_i2c_write_buf[10]; + u32 temp; + u8 reg_val[4] = {0}; + int i_ret = 0; + + FTS_INFO("[UPGRADE]**********read out checksum**********"); + + /*check sum init*/ + auc_i2c_write_buf[0] = 0x64; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); + + /*send commond to pramboot to start checksum*/ + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(startaddr >> 16); + auc_i2c_write_buf[2] = (u8)(startaddr >> 8); + auc_i2c_write_buf[3] = (u8)(startaddr); + + if (length > LEN_FLASH_ECC_MAX) { + temp = LEN_FLASH_ECC_MAX; + } else { + temp = length; + } + + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 6); + msleep(length/256); + + /*read status : if check sum is finished?*/ + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + break; + } + msleep(1); + + } + + if (length > LEN_FLASH_ECC_MAX) { + temp = LEN_FLASH_ECC_MAX; + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(temp >> 16); + auc_i2c_write_buf[2] = (u8)(temp >> 8); + auc_i2c_write_buf[3] = (u8)(temp); + temp = length-LEN_FLASH_ECC_MAX; + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 6); + + msleep(length/256); + + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + break; + } + msleep(1); + } + } + + /*read out check sum*/ + auc_i2c_write_buf[0] = 0x66; + i_ret = ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != ft8006m_upgrade_ecc) /*if check sum fail, upgrade fail*/ { + FTS_ERROR("[UPGRADE]: ecc error! FW=%02x ft8006m_upgrade_ecc=%02x!!", reg_val[0], ft8006m_upgrade_ecc); + return -EIO; + } + + FTS_DEBUG("[UPGRADE]: ecc success : FW=%02x ft8006m_upgrade_ecc=%02x!!", reg_val[0], ft8006m_upgrade_ecc); + + ft8006m_upgrade_ecc = 0; + + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_erase_flash +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_erase_flash(struct i2c_client *client) +{ + u32 i = 0; + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_INFO("[UPGRADE]**********erase app now**********"); + + /*send to erase flash*/ + auc_i2c_write_buf[0] = 0x61; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1350); + + for (i = 0; i < 15; i++) { + /*get the erase app status, if get 0xF0AA£¬erase flash success*/ + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0xAA == reg_val[1]) /*erase flash success*/ { + break; + } + msleep(50); + } + + if ((0xF0 != reg_val[0] || 0xAA != reg_val[1]) && (i >= 15)) /*erase flash fail*/ { + FTS_ERROR("[UPGRADE]: erase app error.reset tp and reload FW!!"); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: erase app ok!!"); + + return 0; +} + +/************************************************************************ +* Name: ft8006m_ctpm_write_pramboot_for_idc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_write_pramboot_for_idc(struct i2c_client *client, u32 length, u8 *readbuf) +{ + u32 i = 0; + u32 j; + u32 temp; + u32 packet_number; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + + ft8006m_upgrade_ecc = 0; + FTS_INFO("[UPGRADE]**********write pramboot to pram**********"); + + temp = 0; + packet_number = (length) / FTS_PACKET_LENGTH; + if ((length) % FTS_PACKET_LENGTH > 0) { + packet_number++; + } + packet_buf[0] = 0xae; + packet_buf[1] = 0x00; + + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + if (j < (packet_number-1)) { + temp = FTS_PACKET_LENGTH; + } else { + temp = (length) % FTS_PACKET_LENGTH; + } + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = readbuf[j * FTS_PACKET_LENGTH + i]; + ft8006m_upgrade_ecc ^= packet_buf[6 + i]; + } + ft8006m_i2c_write(client, packet_buf, temp + 6); + } + + return 0; +} + +/************************************************************************ +* Name: ft8006m_ctpm_write_app_for_idc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_write_app_for_idc(struct i2c_client *client, u32 length, u8 *readbuf) +{ + u32 j; + u32 i = 0; + u32 packet_number; + u32 temp; + u32 writelenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_INFO("[UPGRADE]**********write app to flash**********"); + + ft8006m_upgrade_ecc = 0; + + packet_number = (length) / FTS_PACKET_LENGTH; + if (((length) % FTS_PACKET_LENGTH) > 0) { + packet_number++; + } + + packet_buf[0] = 0xbf; + + for (j = 0; j < packet_number; j++) { + temp = 0x1000+j * FTS_PACKET_LENGTH; + + if (j < (packet_number-1)) { + writelenght = FTS_PACKET_LENGTH; + } else { + writelenght = ((length) % FTS_PACKET_LENGTH); + } + packet_buf[1] = (u8) (temp >> 16); + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + packet_buf[4] = (u8) (writelenght >> 8); + packet_buf[5] = (u8) writelenght; + + for (i = 0; i < writelenght; i++) { + packet_buf[6 + i] = readbuf[(temp - 0x1000+i)]; + ft8006m_upgrade_ecc ^= packet_buf[6 + i]; + } + + ft8006m_i2c_write(client, packet_buf, (writelenght + 6)); + + for (i = 0; i < 30; i++) { + /*read status and check if the app writting is finished*/ + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((j + 0x20+0x1000) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + ft8006m_ctpm_upgrade_delay(1000); + } + } + msleep(50); + + return 0; +} + + +typedef enum { + APP_LEN = 0x00, + APP_LEN_NE = 0x02, + APP_P1_ECC = 0x04, + APP_P1_ECC_NE = 0x06, + APP_P2_ECC = 0x08, + APP_P2_ECC_NE = 0x0A, + APP_LEN_H = 0x12, + APP_LEN_H_NE = 0x14, + APP_BLR_ID = 0x1C, + APP_BLR_ID_NE = 0x1D, + PBOOT_ID_H = 0x1E, + PBOOT_ID_L = 0x1F +} ENUM_APP_INFO; + +#define AL2_FCS_COEF ((1 << 15) + (1 << 10) + (1 << 3)) + +#if ((FTS_CHIP_TYPE == _FT8006) || (FTS_CHIP_TYPE == _FT8736)) +#define FW_CFG_TOTAL_SIZE 0x80 +#else +#define FW_CFG_TOTAL_SIZE 0x00 +#endif +#define APP1_START 0x00 +#define APP1_LEN 0x100 +#define APP_VERIF_ADDR (APP1_START + APP1_LEN) +#define APP_VERIF_LEN 0x20 +#define APP1_ECC_ADDR (APP_VERIF_ADDR + APP_P1_ECC) +#define APP2_START (APP_VERIF_ADDR + APP_VERIF_LEN + FW_CFG_TOTAL_SIZE) +#define APP2_ECC_ADDR (APP_VERIF_ADDR + APP_P2_ECC) +/***************************************************************************** +* Name: DrvReadPram16 +* Brief: Get Word +* Input: +* Output: +* Return: +*****************************************************************************/ +static u16 data_word(u8 *pbt_buf, u32 addr) +{ + return (((u16)pbt_buf[addr]<<8) + pbt_buf[addr+1]); +} + +/****************************************************************************** +* Name: GetCrc16 +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +u16 ft8006m_crc_calc(u8 *pbt_buf, u32 addr, u16 length) +{ + u16 cFcs = 0; + u16 i, j; + + FTS_DEBUG("[UPGRADE][ECC] : %04x data:%04x, len:%04x!!", (addr), data_word(pbt_buf, (addr)), length); + for (i = 0; i < length; i++) { + cFcs ^= data_word(pbt_buf, (addr+i*2)); + for (j = 0; j < 16; j++) { + if (cFcs & 1) { + cFcs = (u16)((cFcs >> 1) ^ AL2_FCS_COEF); + } else { + cFcs >>= 1; + } + } + } + return cFcs; +} + +/***************************************************************************** +* Name: task_check_mem +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +bool ft8006m_ecc_check(u8 *pbt_buf, u32 star_addr, u32 len, u16 ecc_addr) +{ + u16 ecc1; + u16 ecc2; + u16 cal_ecc; + + ecc1 = data_word(pbt_buf, ecc_addr); + ecc2 = data_word(pbt_buf, ecc_addr+2); + + if ((ecc1 + ecc2) != 0xFFFF) { + return false; + } + + cal_ecc = ft8006m_crc_calc(pbt_buf, star_addr, (len/2)); + + FTS_DEBUG("[UPGRADE][ECC] : ecc1 = %x, cal_ecc = %x", ecc1, cal_ecc); + if (ecc1 != cal_ecc) { + FTS_DEBUG("[UPGRADE][ECC] : ecc error!!"); + return false; + } + return true; +} + +/***************************************************************************** +* Name: ft8006m_check_app_bin_valid_idc +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +bool ft8006m_check_app_bin_valid_idc(u8 *pbt_buf) +{ + u32 len; +#if (FTS_CHIP_TYPE != _FT8006) + /* 1. First Byte */ + if (pbt_buf[0] != 0x02) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- the first byte(%x) error", pbt_buf[0]); + return false; + } +#endif + /* 2 PART1 ECC */ + if (!ft8006m_ecc_check(pbt_buf, APP1_START, APP1_LEN, APP1_ECC_ADDR)) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- ecc1 error"); + return false; + } + + /* 3. PART2 ECC */ + if ((data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN) + data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_NE)) != 0xFFFF) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- Length XOR error"); + return false; + } + len = data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN); +#if (FTS_CHIP_TYPE == _FT8006) + if ((data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) + data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H_NE)) != 0xFFFF) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- Length2 XOR error"); + return false; + } + len += ((u32)data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) << 16); +#endif + FTS_DEBUG("%x %x %x %x", APP2_START, len, ((u32)data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) << 16), data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN)); + len -= APP2_START; + + return ft8006m_ecc_check(pbt_buf, APP2_START, len, APP2_ECC_ADDR); +} + + +#endif /* IDC */ diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_test.c b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_test.c new file mode 100755 index 0000000000000..ffd34fc52bf66 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_test.c @@ -0,0 +1,167 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_test.c +* +* Author: fupeipei +* +* Created: 2016-08-22 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" +#include "../focaltech_flash.h" +#include +#include + +/***************************************************************************** +* Static variables +*****************************************************************************/ +#define FTS_GET_UPGRADE_TIME 0 + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct wake_lock ft8006m_ps_lock; + +#define FTS_DEBUG_UPGRADE(fmt, args...) do {\ + printk(KERN_ERR "[FTS][UPGRADE]:##############################################################################\n");\ + printk(KERN_ERR "[FTS][UPGRADE]: "fmt"\n", ##args);\ + printk(KERN_ERR "[FTS][UPGRADE]:##############################################################################\n");\ + } while (0)\ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if (FTS_UPGRADE_STRESS_TEST) +/************************************************************************ +* Name: ft8006m_ctpm_auto_upgrade_pingpong +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +static int ft8006m_ctpm_auto_upgrade_pingpong(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + int i_ret = 0; + u8 uc_upgrade_times = 0; + + FTS_FUNC_ENTER(); + + /* pingpong test mode, need upgrade */ + FTS_INFO("[UPGRADE]: pingpong test mode, need upgrade!!"); + do { + uc_upgrade_times++; + + /* fw upgrade */ + i_ret = ft8006m_ctpm_fw_upgrade(client); + + if (i_ret == 0) {/* upgrade success */ + ft8006m_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + FTS_DEBUG("[UPGRADE]: upgrade to new version 0x%x", uc_tp_fm_ver); + } else /* upgrade fail */ { + /* if upgrade fail, reset to run ROM. if app in flash is ok. TP will work success */ + FTS_INFO("[UPGRADE]: upgrade fail, reset now!!"); + ft8006m_ctpm_rom_or_pram_reset(client); + } + } while ((i_ret != 0) && (uc_upgrade_times < 2)); /* if upgrade fail, upgrade again. then return */ + + FTS_FUNC_EXIT(); + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_auto_upgrade +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +void fts_ctpm_display_upgrade_time(bool start_time) +{ +#if FTS_GET_UPGRADE_TIME + static struct timeval tpend; + static struct timeval tpstart; + static int timeuse; + + if (start_time) { + do_gettimeofday(&tpstart); + } else { + do_gettimeofday(&tpend); + timeuse = 1000000 * (tpend.tv_sec-tpstart.tv_sec) + tpend.tv_usec-tpstart.tv_usec; + timeuse /= 1000000; + FTS_DEBUG("[UPGRADE]: upgrade success : Use time: %d Seconds!!", timeuse); + } +#endif +} + +/************************************************************************ +* Name: ft8006m_ctpm_auto_upgrade +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +int ft8006m_ctpm_auto_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + static int uc_ErrorTimes + static int uc_UpgradeTimes + + wake_lock_init(&ft8006m_ps_lock, WAKE_LOCK_SUSPEND, "tp_wakelock"); + + wake_lock(&ft8006m_ps_lock); + + /* (FTS_GET_VENDOR_ID_NUM == 0) */ + ft8006m_g_fw_file = FT8006M_CTPM_FW; + ft8006m_g_fw_len = ft8006m_getsize(FW_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:FT8006M_CTPM_FW, SIZE:%x", ft8006m_g_fw_len); + + do { + uc_UpgradeTimes++; + + FTS_DEBUG_UPGRADE("start to upgrade %d times !!", uc_UpgradeTimes); + + fts_ctpm_display_upgrade_time(true); + + i_ret = ft8006m_ctpm_auto_upgrade_pingpong(client); + if (i_ret == 0) { + fts_ctpm_display_upgrade_time(false); + } else { + uc_ErrorTimes++; + } + + FTS_DEBUG_UPGRADE("upgrade %d times, error %d times!!", uc_UpgradeTimes, uc_ErrorTimes); + } while (uc_UpgradeTimes < (FTS_UPGRADE_TEST_NUMBER)); + + wake_unlock(&ft8006m_ps_lock); + + return 0; +} +#endif + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_gesture.c b/drivers/input/touchscreen/FT8006m/focaltech_gesture.c new file mode 100755 index 0000000000000..f6d1f307d5a58 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_gesture.c @@ -0,0 +1,683 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_gestrue.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#if FTS_GESTURE_EN +/****************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define KEY_GESTURE_U KEY_U +#define KEY_GESTURE_UP KEY_UP +#define KEY_GESTURE_DOWN KEY_DOWN +#define KEY_GESTURE_LEFT KEY_LEFT +#define KEY_GESTURE_RIGHT KEY_RIGHT +#define KEY_GESTURE_O KEY_O +#define KEY_GESTURE_E KEY_E +#define KEY_GESTURE_M KEY_M +#define KEY_GESTURE_L KEY_L +#define KEY_GESTURE_W KEY_W +#define KEY_GESTURE_S KEY_S +#define KEY_GESTURE_V KEY_V +#define KEY_GESTURE_C KEY_C +#define KEY_GESTURE_Z KEY_Z + +#define GESTURE_LEFT 0x20 +#define GESTURE_RIGHT 0x21 +#define GESTURE_UP 0x22 +#define GESTURE_DOWN 0x23 +#define GESTURE_DOUBLECLICK 0x24 +#define GESTURE_O 0x30 +#define GESTURE_W 0x31 +#define GESTURE_M 0x32 +#define GESTURE_E 0x33 +#define GESTURE_L 0x44 +#define GESTURE_S 0x46 +#define GESTURE_V 0x54 +#define GESTURE_Z 0x41 +#define GESTURE_C 0x34 +#define FTS_GESTRUE_POINTS 255 +#define FTS_GESTRUE_POINTS_HEADER 8 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* +* header - byte0:gesture id +* byte1:pointnum +* byte2~7:reserved +* coordinate_x - All gesture point x coordinate +* coordinate_y - All gesture point y coordinate +* mode - 1:enable gesture function(default) +* - 0:disable +* active - 1:enter into gesture(suspend) +* 0:gesture disable or resume +*/ +struct fts_gesture_st { + u8 header[FTS_GESTRUE_POINTS_HEADER]; + u16 coordinate_x[FTS_GESTRUE_POINTS]; + u16 coordinate_y[FTS_GESTRUE_POINTS]; + u8 mode; + u8 active; +}; + + + +struct gesture_struct ft8006m_gesture_data = {0, 0}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct fts_gesture_st fts_ft8006m_gesture_data; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); + +/* sysfs gesture node + * read example: cat fts_gesture_mode ---read gesture mode + * write example:echo 01 > fts_gesture_mode ---write gesture mode to 01 + * + */ +static DEVICE_ATTR (fts_gesture_mode, S_IRUGO|S_IWUSR, fts_gesture_show, fts_gesture_store); +/* + * read example: cat fts_gesture_buf ---read gesture buf + */ +static DEVICE_ATTR (fts_gesture_buf, S_IRUGO|S_IWUSR, fts_gesture_buf_show, fts_gesture_buf_store); +static struct attribute *fts_gesture_mode_attrs[] = { + + &dev_attr_fts_gesture_mode.attr, + &dev_attr_fts_gesture_buf.attr, + NULL, +}; + +static struct attribute_group fts_gesture_group = { + .attrs = fts_gesture_mode_attrs, +}; + +/************************************************************************ +* Name: fts_gesture_show +* Brief: +* Input: device, device attribute, char buf +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + u8 val; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&ft8006m_input_dev->mutex); + ft8006m_i2c_read_reg(client, FTS_REG_GESTURE_EN, &val); + count = sprintf(buf, "Gesture Mode: %s\n", fts_ft8006m_gesture_data.mode ? "On" : "Off"); + count += sprintf(buf + count, "Reg(0xD0) = %d\n", val); + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_store +* Brief: +* Input: device, device attribute, char buf, char count +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + mutex_lock(&ft8006m_input_dev->mutex); + + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[GESTURE]enable gesture"); + fts_ft8006m_gesture_data.mode = ENABLE; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[GESTURE]disable gesture"); + fts_ft8006m_gesture_data.mode = DISABLE; + } + + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_buf_show +* Brief: +* Input: device, device attribute, char buf +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + int i = 0; + + mutex_lock(&ft8006m_input_dev->mutex); + count = snprintf(buf, PAGE_SIZE, "Gesture ID: 0x%x\n", fts_ft8006m_gesture_data.header[0]); + count += snprintf(buf + count, PAGE_SIZE, "Gesture PointNum: %d\n", fts_ft8006m_gesture_data.header[1]); + count += snprintf(buf + count, PAGE_SIZE, "Gesture Point Buf:\n"); + for (i = 0; i < fts_ft8006m_gesture_data.header[1]; i++) { + count += snprintf(buf + count, PAGE_SIZE, "%3d(%4d,%4d) ", i, fts_ft8006m_gesture_data.coordinate_x[i], fts_ft8006m_gesture_data.coordinate_y[i]); + if ((i + 1)%4 == 0) + count += snprintf(buf + count, PAGE_SIZE, "\n"); + } + count += snprintf(buf + count, PAGE_SIZE, "\n"); + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_buf_store +* Brief: +* Input: device, device attribute, char buf, char count +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/***************************************************************************** +* Name: ft8006m_create_gesture_sysfs +* Brief: +* Input: +* Output: +* Return: 0-success or others-error +*****************************************************************************/ +int ft8006m_create_gesture_sysfs(struct i2c_client *client) +{ + int ret = 0; + + ret = sysfs_create_group(&client->dev.kobj, &fts_gesture_group); + if (ret != 0) { + FTS_ERROR("[GESTURE]fts_gesture_mode_group(sysfs) create failed!"); + sysfs_remove_group(&client->dev.kobj, &fts_gesture_group); + return ret; + } + return 0; +} + +/***************************************************************************** +* Name: fts_gesture_report +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_gesture_report(struct input_dev *input_dev, int gesture_id) +{ + int gesture; + + FTS_FUNC_ENTER(); + FTS_DEBUG("fts gesture_id==0x%x ", gesture_id); + switch (gesture_id) { + case GESTURE_LEFT: + gesture = KEY_GESTURE_LEFT; + break; + case GESTURE_RIGHT: + gesture = KEY_GESTURE_RIGHT; + break; + case GESTURE_UP: + gesture = KEY_GESTURE_UP; + break; + case GESTURE_DOWN: + gesture = KEY_GESTURE_DOWN; + break; + case GESTURE_DOUBLECLICK: + gesture = KEY_GESTURE_U; + break; + case GESTURE_O: + gesture = KEY_GESTURE_O; + break; + case GESTURE_W: + gesture = KEY_GESTURE_W; + break; + case GESTURE_M: + gesture = KEY_GESTURE_M; + break; + case GESTURE_E: + gesture = KEY_GESTURE_E; + break; + case GESTURE_L: + gesture = KEY_GESTURE_L; + break; + case GESTURE_S: + gesture = KEY_GESTURE_S; + break; + case GESTURE_V: + gesture = KEY_GESTURE_V; + break; + case GESTURE_Z: + gesture = KEY_GESTURE_Z; + break; + case GESTURE_C: + gesture = KEY_GESTURE_C; + break; + default: + gesture = -1; + break; + } + /* report event key */ + if (gesture != -1) { + if (gesture_id == GESTURE_DOUBLECLICK) { + FTS_DEBUG("Gesture Code=%d", gesture); + input_report_key(input_dev, DOUBLE_CLICK, 1); + input_sync(input_dev); + input_report_key(input_dev, DOUBLE_CLICK, 0); + input_sync(input_dev); + } + } + + FTS_FUNC_EXIT(); +} + +/************************************************************************ +* Name: ft8006m_gesture_readdata +* Brief: read data from TP register +* Input: +* Output: +* Return: fail <0 +***********************************************************************/ +static int fts_gesture_read_buffer(struct i2c_client *client, u8 *buf, int read_bytes) +{ + int remain_bytes; + int ret; + int i; + if (read_bytes <= I2C_BUFFER_LENGTH_MAXINUM) { + ret = ft8006m_i2c_read(client, buf, 1, buf, read_bytes); + } else { + ret = ft8006m_i2c_read(client, buf, 1, buf, I2C_BUFFER_LENGTH_MAXINUM); + remain_bytes = read_bytes - I2C_BUFFER_LENGTH_MAXINUM; + for (i = 1; remain_bytes > 0; i++) { + if (remain_bytes <= I2C_BUFFER_LENGTH_MAXINUM) + ret = ft8006m_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, remain_bytes); + else + ret = ft8006m_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, I2C_BUFFER_LENGTH_MAXINUM); + remain_bytes -= I2C_BUFFER_LENGTH_MAXINUM; + } + } + + return ret; +} + +/************************************************************************ +* Name: fts_gesture_fw +* Brief: Check IC's gesture recognise by FW or not +* Input: +* Output: +* Return: 1- FW 0- Driver +***********************************************************************/ +static int fts_gesture_fw(void) +{ + int ret = 0; + + switch (ft8006m_chip_types.chip_idh) { + case 0x54: + case 0x58: + case 0x64: + case 0x87: + case 0x86: + case 0x80: + case 0xE7: + ret = 1; + break; + default: + ret = 0; + break; + } + return ret; +} + +/************************************************************************ +* Name: ft8006m_gesture_readdata +* Brief: read data from TP register +* Input: +* Output: +* Return: fail <0 +***********************************************************************/ +int ft8006m_gesture_readdata(struct i2c_client *client) +{ + u8 buf[FTS_GESTRUE_POINTS * 4] = { 0 }; + int ret = -1; + int i = 0; + int gestrue_id = 0; + int read_bytes = 0; + u8 pointnum; + + FTS_FUNC_ENTER(); + /* init variable before read gesture point */ + memset(fts_ft8006m_gesture_data.header, 0, FTS_GESTRUE_POINTS_HEADER); + memset(fts_ft8006m_gesture_data.coordinate_x, 0, FTS_GESTRUE_POINTS * sizeof(u16)); + memset(fts_ft8006m_gesture_data.coordinate_y, 0, FTS_GESTRUE_POINTS * sizeof(u16)); + + buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + ret = ft8006m_i2c_read(client, buf, 1, buf, FTS_GESTRUE_POINTS_HEADER); + if (ret < 0) { + FTS_ERROR("[GESTURE]Read gesture header data failed!!"); + FTS_FUNC_EXIT(); + return ret; + } + + /* FW recognize gesture */ + if (fts_gesture_fw()) { + memcpy(fts_ft8006m_gesture_data.header, buf, FTS_GESTRUE_POINTS_HEADER); + gestrue_id = buf[0]; + pointnum = buf[1]; + read_bytes = ((int)pointnum) * 4 + 2; + buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + FTS_DEBUG("[GESTURE]PointNum=%d", pointnum); + ret = fts_gesture_read_buffer(client, buf, read_bytes); + if (ret < 0) { + FTS_ERROR("[GESTURE]Read gesture touch data failed!!"); + FTS_FUNC_EXIT(); + return ret; + } + + fts_gesture_report(ft8006m_input_dev, gestrue_id); + for (i = 0; i < pointnum; i++) { + fts_ft8006m_gesture_data.coordinate_x[i] = (((s16) buf[0 + (4 * i + 2)]) & 0x0F) << 8 + | (((s16) buf[1 + (4 * i + 2)]) & 0xFF); + fts_ft8006m_gesture_data.coordinate_y[i] = (((s16) buf[2 + (4 * i + 2)]) & 0x0F) << 8 + | (((s16) buf[3 + (4 * i + 2)]) & 0xFF); + } + FTS_FUNC_EXIT(); + return 0; + } else { + FTS_ERROR("[GESTURE]IC 0x%x need gesture lib to support gestures.", ft8006m_chip_types.chip_idh); + return 0; + } +} + +/***************************************************************************** +* Name: ft8006m_gesture_recovery +* Brief: recovery gesture state when reset or power on +* Input: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_gesture_recovery(struct i2c_client *client) +{ + if (fts_ft8006m_gesture_data.mode && fts_ft8006m_gesture_data.active) { + ft8006m_i2c_write_reg(client, 0xD1, 0xff); + ft8006m_i2c_write_reg(client, 0xD2, 0xff); + ft8006m_i2c_write_reg(client, 0xD5, 0xff); + ft8006m_i2c_write_reg(client, 0xD6, 0xff); + ft8006m_i2c_write_reg(client, 0xD7, 0xff); + ft8006m_i2c_write_reg(client, 0xD8, 0xff); + ft8006m_i2c_write_reg(client, FTS_REG_GESTURE_EN, ENABLE); + } +} + +/***************************************************************************** +* Name: ft8006m_gesture_suspend +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int ft8006m_gesture_suspend(struct i2c_client *i2c_client) +{ + int i; + u8 state; + + FTS_FUNC_ENTER(); + + /* gesture not enable, return immediately */ + if (fts_ft8006m_gesture_data.mode == 0) { + FTS_DEBUG("gesture is disabled"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + for (i = 0; i < 5; i++) { + ft8006m_i2c_write_reg(i2c_client, 0xd1, 0xff); + ft8006m_i2c_write_reg(i2c_client, 0xd2, 0xff); + ft8006m_i2c_write_reg(i2c_client, 0xd5, 0xff); + ft8006m_i2c_write_reg(i2c_client, 0xd6, 0xff); + ft8006m_i2c_write_reg(i2c_client, 0xd7, 0xff); + ft8006m_i2c_write_reg(i2c_client, 0xd8, 0xff); + ft8006m_i2c_write_reg(i2c_client, FTS_REG_GESTURE_EN, 0x01); + msleep(1); + ft8006m_i2c_read_reg(i2c_client, FTS_REG_GESTURE_EN, &state); + if (state == 1) + break; + } + + if (i >= 5) { + FTS_ERROR("[GESTURE]Enter into gesture(suspend) failed!\n"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + fts_ft8006m_gesture_data.active = 1; + FTS_DEBUG("[GESTURE]Enter into gesture(suspend) successfully!"); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: ft8006m_gesture_resume +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int ft8006m_gesture_resume(struct i2c_client *client) +{ + int i; + u8 state; + FTS_FUNC_ENTER(); + + /* gesture not enable, return immediately */ + if (fts_ft8006m_gesture_data.mode == 0) { + FTS_DEBUG("gesture is disabled"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + if (fts_ft8006m_gesture_data.active == 0) { + FTS_DEBUG("gesture is unactive"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + fts_ft8006m_gesture_data.active = 0; + for (i = 0; i < 5; i++) { + ft8006m_i2c_write_reg(client, FTS_REG_GESTURE_EN, 0x00); + msleep(1); + ft8006m_i2c_read_reg(client, FTS_REG_GESTURE_EN, &state); + if (state == 0) + break; + } + + if (i >= 5) { + FTS_ERROR("[GESTURE]Clear gesture(resume) failed!\n"); + } + + FTS_FUNC_EXIT(); + return 0; +} +extern int tp_gesture_onoff; + + +static ssize_t gesture_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + int num; + + if (*ppos) + return 0; + + num = sprintf(page, "%d\n", ft8006m_gesture_data.gesture_all_switch); + *ppos += num; + + return num; +} + +static ssize_t gesture_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + int ret; + char temp[20] = ""; + + ret = copy_from_user(temp, buff, len); + if (ret) { + FTS_ERROR("<%s> copy_from_user failed.\n", __func__); + return -EPERM; + } + + FTS_DEBUG("%s copy_from_user :%s\n", __func__, temp); +#if 0 + if (strnstr(temp, "on", strlen(temp))) + ft8006m_gesture_data.gesture_all_switch = 1; + else + ft8006m_gesture_data.gesture_all_switch = 0; +#else + ret = kstrtouint(temp, 0, &ft8006m_gesture_data.gesture_all_switch); + if (ret) { + FTS_ERROR("kstrtouint failed.\n"); + return -EFAULT; + } +#endif + + FTS_DEBUG("%s ft8006m_gesture_data.gesture_all_switch :%d\n", __func__, ft8006m_gesture_data.gesture_all_switch); + tp_gesture_onoff = ft8006m_gesture_data.gesture_all_switch; + + return len; +} +static const struct file_operations gesture_fops = { + .owner = THIS_MODULE, + .read = gesture_read, + .write = gesture_write, +}; + +static ssize_t gesture_data_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + int num; + + if (*ppos) + return 0; + + num = sprintf(page, "K\n"); + *ppos += num; + + return num; +} + +static ssize_t gesture_data_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + return len; +} + +static const struct file_operations gesture_data_fops = { + .owner = THIS_MODULE, + .read = gesture_data_read, + .write = gesture_data_write, +}; + +int D1_gesture_init(struct input_dev *input_dev) +{ + struct proc_dir_entry *proc_entry = NULL; + struct proc_dir_entry *proc_data = NULL; + struct proc_dir_entry *parent; + + parent = proc_mkdir("gesture", NULL); + if (!parent) { + pr_err("%s: failed to create proc entry\n", __func__); + return -ENOMEM; + } + + proc_entry = proc_create(GESTURE_NODE, 0666, parent, &gesture_fops); + if (proc_entry == NULL) { + FTS_ERROR("CAN't create proc entry /proc/%s !", GESTURE_NODE); + return -EPERM; + } else { + FTS_DEBUG("Created proc entry /proc/%s !", GESTURE_NODE); + } + + proc_data = proc_create(GESTURE_DATA, 0666, parent, &gesture_data_fops); + if (proc_data == NULL) { + FTS_ERROR("CAN't create proc entry /proc/%s !", GESTURE_DATA); + return -EPERM; + } else { + FTS_DEBUG("Created proc entry /proc/%s !", GESTURE_DATA); + } + input_set_capability(input_dev, EV_KEY, DOUBLE_CLICK); + __set_bit(DOUBLE_CLICK, input_dev->keybit); + + return 0; +} +/***************************************************************************** +* Name: ft8006m_gesture_init +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int ft8006m_gesture_init(struct input_dev *input_dev, struct i2c_client *client) +{ + FTS_FUNC_ENTER(); + D1_gesture_init(input_dev); + fts_ft8006m_gesture_data.mode = 1; + fts_ft8006m_gesture_data.active = 0; + FTS_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: ft8006m_gesture_exit +* Brief: call when driver removed +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_gesture_exit(struct i2c_client *client) +{ + FTS_FUNC_ENTER(); + sysfs_remove_group(&client->dev.kobj, &fts_gesture_group); + FTS_FUNC_EXIT(); + return 0; +} + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_i2c.c b/drivers/input/touchscreen/FT8006m/focaltech_i2c.c new file mode 100644 index 0000000000000..d4bef1090d1e6 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_i2c.c @@ -0,0 +1,217 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/************************************************************************ +* +* File Name: focaltech_i2c.c +* +* Author: fupeipei +* +* Created: 2016-08-04 +* +* Abstract: i2c communication with TP +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By fupeipei 2016-08-04 +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static DEFINE_MUTEX(i2c_rw_access); + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ + +/************************************************************************ +* Name: ft8006m_i2c_read +* Brief: i2c read +* Input: i2c info, write buf, write len, read buf, read len +* Output: get data in the 3rd buf +* Return: fail <0 +***********************************************************************/ +int ft8006m_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen) +{ + int ret = 0; + int i = 0; + + mutex_lock(&i2c_rw_access); + + if (readlen > 0) { + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + for (i = 0; i < 3; i++) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) { + FTS_ERROR("[IIC]: i2c_transfer(write) error, ret=%d!!", ret); + } else + break; + } + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + for (i = 0; i < 3; i++) { + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + FTS_ERROR("[IIC]: i2c_transfer(read) error, ret=%d!!", ret); + } else + break; + } + } + } + + mutex_unlock(&i2c_rw_access); + return ret; +} + +/************************************************************************ +* Name: ft8006m_i2c_write +* Brief: i2c write +* Input: i2c info, write buf, write len +* Output: no +* Return: fail <0 +***********************************************************************/ +int ft8006m_i2c_write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret = 0; + int i = 0; + + mutex_lock(&i2c_rw_access); + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + for (i = 0; i < 3; i++) { + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + FTS_ERROR("%s: i2c_transfer(write) error, ret=%d", __func__, ret); + } else + break; + } + } + mutex_unlock(&i2c_rw_access); + + return ret; +} + +/************************************************************************ +* Name: ft8006m_i2c_write_reg +* Brief: write register +* Input: i2c info, reg address, reg value +* Output: no +* Return: fail <0 +***********************************************************************/ +int ft8006m_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue) +{ + u8 buf[2] = {0}; + + buf[0] = regaddr; + buf[1] = regvalue; + return ft8006m_i2c_write(client, buf, sizeof(buf)); +} + +/************************************************************************ +* Name: ft8006m_i2c_read_reg +* Brief: read register +* Input: i2c info, reg address, reg value +* Output: get reg value +* Return: fail <0 +***********************************************************************/ +int ft8006m_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue) +{ + return ft8006m_i2c_read(client, ®addr, 1, regvalue, 1); +} + +/************************************************************************ +* Name: ft8006m_i2c_init +* Brief: fts i2c init +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_i2c_init(void) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} +/************************************************************************ +* Name: ft8006m_i2c_exit +* Brief: fts i2c exit +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_i2c_exit(void) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_point_report_check.c b/drivers/input/touchscreen/FT8006m/focaltech_point_report_check.c new file mode 100755 index 0000000000000..0671a7882f95d --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_point_report_check.c @@ -0,0 +1,150 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_point_report_check.c +* +* Author: WangTao +* +* Created: 2016-11-16 +* +* Abstract: point report check function +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By WangTao 2016-11-16 +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_POINT_REPORT_CHECK_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define POINT_REPORT_CHECK_WAIT_TIME 200 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct delayed_work fts_point_report_check_work; +static struct workqueue_struct *fts_point_report_check_workqueue + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ + + +/***************************************************************************** +* Name: fts_point_report_check_func +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_point_report_check_func(struct work_struct *work) +{ + +#if FTS_MT_PROTOCOL_B_EN + unsigned int finger_count = 0; +#endif + + FTS_FUNC_ENTER(); + mutex_lock(&ft8006m_wq_data->report_mutex); + +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < ft8006m_wq_data->pdata->max_touch_number; finger_count++) { + input_mt_slot(ft8006m_input_dev, finger_count); + input_mt_report_slot_state(ft8006m_input_dev, MT_TOOL_FINGER, false); + } +#else + input_mt_sync(ft8006m_input_dev); +#endif + input_report_key(ft8006m_input_dev, BTN_TOUCH, 0); + input_sync(ft8006m_input_dev); + + mutex_unlock(&ft8006m_wq_data->report_mutex); + + FTS_FUNC_EXIT(); +} + +void fts_point_report_check_queue_work(void) +{ + cancel_delayed_work(&fts_point_report_check_work); + queue_delayed_work(fts_point_report_check_workqueue, &fts_point_report_check_work, msecs_to_jiffies(POINT_REPORT_CHECK_WAIT_TIME)); +} + +/***************************************************************************** +* Name: fts_point_report_check_init +* Brief: +* Input: +* Output: +* Return: < 0: Fail to create esd check queue +*****************************************************************************/ +int fts_point_report_check_init(void) +{ + FTS_FUNC_ENTER(); + + INIT_DELAYED_WORK(&fts_point_report_check_work, fts_point_report_check_func); + fts_point_report_check_workqueue = create_workqueue("fts_point_report_check_func_wq"); + if (fts_point_report_check_workqueue == NULL) { + FTS_ERROR("[POINT_REPORT]: Failed to create fts_point_report_check_workqueue!!"); + } else { + FTS_DEBUG("[POINT_REPORT]: Success to create fts_point_report_check_workqueue!!"); + } + + FTS_FUNC_EXIT(); + + return 0; +} + +/***************************************************************************** +* Name: fts_point_report_check_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_point_report_check_exit(void) +{ + FTS_FUNC_ENTER(); + + destroy_workqueue(fts_point_report_check_workqueue); + + FTS_FUNC_EXIT(); + return 0; +} +#endif /* FTS_POINT_REPORT_CHECK_EN */ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_sensor.c b/drivers/input/touchscreen/FT8006m/focaltech_sensor.c new file mode 100755 index 0000000000000..088a9a73f1f6b --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_sensor.c @@ -0,0 +1,314 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_esdcheck.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-03 +* +* Abstract: Sensor +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By luougojin 2016-08-03 +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_PSENSOR_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +/* psensor register address*/ +#define FTS_REG_PSENSOR_ENABLE 0xB0 +#define FTS_REG_PSENSOR_STATUS 0x01 + +/* psensor register bits*/ +#define FTS_PSENSOR_ENABLE_MASK 0x01 +#define FTS_PSENSOR_STATUS_NEAR 0xC0 +#define FTS_PSENSOR_STATUS_FAR 0xE0 +#define FTS_PSENSOR_FAR_TO_NEAR 0 +#define FTS_PSENSOR_NEAR_TO_FAR 1 +#define FTS_PSENSOR_ORIGINAL_STATE_FAR 1 +#define FTS_PSENSOR_WAKEUP_TIMEOUT 500 + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct sensors_classdev __maybe_unused sensors_proximity_cdev = { + .name = "fts-proximity", + .vendor = "FocalTech", + .version = 1, + .handle = SENSORS_PROXIMITY_HANDLE, + .type = SENSOR_TYPE_PROXIMITY, + .max_range = "5.0", + .resolution = "5.0", + .sensor_power = "0.1", + .min_delay = 0, + .fifo_reserved_event_count = 0, + .fifo_max_event_count = 0, + .enabled = 0, + .delay_msec = 200, + .sensors_enable = NULL, + .sensors_poll_delay = NULL, +}; + +/***************************************************************************** +* functions body +*****************************************************************************/ +/***************************************************************************** +* Name: fts_psensor_support_enabled +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static inline bool fts_psensor_support_enabled(void) +{ + /*return config_enabled(CONFIG_TOUCHSCREEN_FTS_PSENSOR);*/ + return FTS_PSENSOR_EN; +} + +/***************************************************************************** +* Name: fts_psensor_enable +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_psensor_enable(struct fts_ts_data *data, int enable) +{ + u8 state; + int ret = -1; + + if (data->client == NULL) + return; + + ft8006m_i2c_read_reg(data->client, FTS_REG_PSENSOR_ENABLE, &state); + if (enable) + state |= FTS_PSENSOR_ENABLE_MASK; + else + state &= ~FTS_PSENSOR_ENABLE_MASK; + + ret = ft8006m_i2c_write_reg(data->client, FTS_REG_PSENSOR_ENABLE, state); + if (ret < 0) + FTS_ERROR("write psensor switch command failed"); + return; +} + +/***************************************************************************** +* Name: fts_psensor_enable_set +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_psensor_enable_set(struct sensors_classdev *sensors_cdev, + unsigned int enable) +{ + struct fts_psensor_platform_data *psensor_pdata = + container_of(sensors_cdev, + struct fts_psensor_platform_data, ps_cdev); + struct fts_ts_data *data = psensor_pdata->data; + struct input_dev *input_dev = data->psensor_pdata->input_psensor_dev; + + mutex_lock(&input_dev->mutex); + fts_psensor_enable(data, enable); + psensor_pdata->tp_psensor_data = FTS_PSENSOR_ORIGINAL_STATE_FAR; + if (enable) + psensor_pdata->tp_psensor_opened = 1; + else + psensor_pdata->tp_psensor_opened = 0; + mutex_unlock(&input_dev->mutex); + return enable; +} + +/***************************************************************************** +* Name: fts_read_tp_psensor_data +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_read_tp_psensor_data(struct fts_ts_data *data) +{ + u8 psensor_status; + char tmp; + int ret = 1; + + ft8006m_i2c_read_reg(data->client, + FTS_REG_PSENSOR_STATUS, &psensor_status); + + tmp = data->psensor_pdata->tp_psensor_data; + if (psensor_status == FTS_PSENSOR_STATUS_NEAR) + data->psensor_pdata->tp_psensor_data = + FTS_PSENSOR_FAR_TO_NEAR; + else if (psensor_status == FTS_PSENSOR_STATUS_FAR) + data->psensor_pdata->tp_psensor_data = + FTS_PSENSOR_NEAR_TO_FAR; + + if (tmp != data->psensor_pdata->tp_psensor_data) { + FTS_ERROR("%s sensor data changed", __func__); + ret = 0; + } + return ret; +} + + +int fts_sensor_read_data(struct fts_ts_data *data) +{ + int ret = 0; + if (fts_psensor_support_enabled() && data->psensor_pdata->tp_psensor_opened) { + ret = fts_read_tp_psensor_data(data); + if (!ret) { + if (data->suspended) { + pm_wakeup_event(&data->client->dev, FTS_PSENSOR_WAKEUP_TIMEOUT); + } + input_report_abs(data->psensor_pdata->input_psensor_dev, + ABS_DISTANCE, + data->psensor_pdata->tp_psensor_data); + input_sync(data->psensor_pdata->input_psensor_dev); + } + return 1; + } + return 0; +} + +int fts_sensor_suspend(struct fts_ts_data *data) +{ + int ret = 0; + + if (fts_psensor_support_enabled() && + device_may_wakeup(&data->client->dev) && + data->psensor_pdata->tp_psensor_opened) { + ret = enable_irq_wake(data->client->irq); + if (ret != 0) { + FTS_ERROR("%s: set_irq_wake failed", __func__); + } + data->suspended = true; + return 1; + } + + return 0; +} + + +int fts_sensor_resume(struct fts_ts_data *data) +{ + int ret = 0; + + if (fts_psensor_support_enabled() && + device_may_wakeup(&data->client->dev) && data->psensor_pdata->tp_psensor_opened) { + ret = disable_irq_wake(data->client->irq); + if (ret) { + FTS_ERROR("%s: disable_irq_wake failed", __func__); + } + data->suspended = false; + return 1; + } + + return 0; +} + + +int fts_sensor_init(struct fts_ts_data *data) +{ + struct fts_psensor_platform_data *psensor_pdata; + struct input_dev *psensor_input_dev; + int err; + + if (fts_psensor_support_enabled()) { + device_init_wakeup(&data->client->dev, 1); + psensor_pdata = devm_kzalloc(&data->client->dev, + sizeof(struct fts_psensor_platform_data), + GFP_KERNEL); + if (!psensor_pdata) { + FTS_ERROR("Failed to allocate memory"); + goto irq_free; + } + data->psensor_pdata = psensor_pdata; + + psensor_input_dev = input_allocate_device(); + if (!psensor_input_dev) { + FTS_ERROR("Failed to allocate device"); + goto free_psensor_pdata; + } + + __set_bit(EV_ABS, psensor_input_dev->evbit); + input_set_abs_params(psensor_input_dev, ABS_DISTANCE, 0, 1, 0, 0); + psensor_input_dev->name = "proximity"; + psensor_input_dev->id.bustype = BUS_I2C; + psensor_input_dev->dev.parent = &data->client->dev; + data->psensor_pdata->input_psensor_dev = psensor_input_dev; + + err = input_register_device(psensor_input_dev); + if (err) { + FTS_ERROR("Unable to register device, err=%d", err); + goto free_psensor_input_dev; + } + + psensor_pdata->ps_cdev = sensors_proximity_cdev; + psensor_pdata->ps_cdev.sensors_enable = fts_psensor_enable_set; + psensor_pdata->data = data; + + err = sensors_classdev_register(&data->client->dev, &psensor_pdata->ps_cdev); + if (err) { + goto unregister_psensor_input_device; + } + } + + return 0; +unregister_psensor_input_device: + if (fts_psensor_support_enabled()) + input_unregister_device(data->psensor_pdata->input_psensor_dev); +free_psensor_input_dev: + if (fts_psensor_support_enabled()) + input_free_device(data->psensor_pdata->input_psensor_dev); +free_psensor_pdata: + if (fts_psensor_support_enabled()) { + devm_kfree(&data->client->dev, psensor_pdata); + data->psensor_pdata = NULL; + } +irq_free: + if (fts_psensor_support_enabled()) + device_init_wakeup(&data->client->dev, 0); + free_irq(data->client->irq, data); + + return 1; +} + +int fts_sensor_remove(struct fts_ts_data *data) +{ + if (fts_psensor_support_enabled()) { + device_init_wakeup(&data->client->dev, 0); + sensors_classdev_unregister(&data->psensor_pdata->ps_cdev); + input_unregister_device(data->psensor_pdata->input_psensor_dev); + devm_kfree(&data->client->dev, data->psensor_pdata); + data->psensor_pdata = NULL; + } + return 0; +} +#endif /* FTS_PSENSOR_EN */ diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/Makefile b/drivers/input/touchscreen/FT8006m/focaltech_test/Makefile new file mode 100755 index 0000000000000..df3a77207ed96 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/Makefile @@ -0,0 +1,10 @@ +#drivers/input/touchscreen/focaltech_touch/focaltech_test +# +#Makefile for test module +# + + + +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += src/ +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += supported_ic/ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/focaltech_test_config.h b/drivers/input/touchscreen/FT8006m/focaltech_test/focaltech_test_config.h new file mode 100755 index 0000000000000..1b368c60720ff --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/focaltech_test_config.h @@ -0,0 +1,63 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_config.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +************************************************************************/ +#include "../focaltech_core.h" + + +/*----------------------------------------------------------- +IC Type Test +-----------------------------------------------------------*/ +#define FT5X46_TEST 0x20 +#define FT6X36_TEST 0x40 +#define FT5822_TEST 0x70 +#define FT8606_TEST 0x90 +#define FT8716_TEST 0xA0 +#define FT3C47_TEST 0xB0 +#define FT8607_TEST 0xC0 +#define FT8736_TEST 0xE0 +#define FT3D47_TEST 0xF0 +#define FTE716_TEST 0x100 +#define FTE736_TEST 0x140 +#define FT8006_TEST 0x130 + + +#ifdef FTS_CHIP_TYPE + +#if (FTS_CHIP_TYPE == _FT8716) +#define FTS_CHIP_TEST_TYPE FT8716_TEST +#elif(FTS_CHIP_TYPE == _FT8736) +#define FTS_CHIP_TEST_TYPE FT8736_TEST +#elif(FTS_CHIP_TYPE == _FT8006) +#define FTS_CHIP_TEST_TYPE FT8006_TEST +#elif(FTS_CHIP_TYPE == _FT8606) +#define FTS_CHIP_TEST_TYPE FT8606_TEST +#elif(FTS_CHIP_TYPE == _FT8607) +#define FTS_CHIP_TEST_TYPE FT8607_TEST +#elif(FTS_CHIP_TYPE == _FTE716) +#define FTS_CHIP_TEST_TYPE FTE716_TEST +#elif(FTS_CHIP_TYPE == _FT3D47) +#define FTS_CHIP_TEST_TYPE FT3D47_TEST +#elif(IC_SERIALS == 0x01) +#define FTS_CHIP_TEST_TYPE FT5822_TEST +#elif(FTS_CHIP_TYPE == _FT3C47U) +#define FTS_CHIP_TEST_TYPE FT3C47_TEST +#elif(IC_SERIALS == 0x02) +#define FTS_CHIP_TEST_TYPE FT5X46_TEST +#elif((IC_SERIALS == 0x03) || (IC_SERIALS == 0x04)) +#define FTS_CHIP_TEST_TYPE FT6X36_TEST +#endif + +#else +#define FTS_CHIP_TEST_TYPE FT8716_TEST + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_ic_table.h b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_ic_table.h new file mode 100755 index 0000000000000..9d7452ac5705d --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_ic_table.h @@ -0,0 +1,115 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __FOCALTECH_IC_TABLE_H__ +#define __FOCALTECH_IC_TABLE_H__ +/***************************************************************************** +* +* File Name: focaltech_ic_table.h +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ + +/*----------------------------------------------------------- +IC corresponding code, each of the IC code is 8 bit, high 4 bit on behalf of the same series, low 4 bit on behalf of the specific IC +-----------------------------------------------------------*/ +enum IC_Type { + IC_FT5X36 = 0x10, + IC_FT5X36i = 0x11, + IC_FT3X16 = 0x12, + IC_FT3X26 = 0x13, + + IC_FT5X46 = 0x21, + IC_FT5X46i = 0x22, + IC_FT5526 = 0x23, + IC_FT3X17 = 0x24, + IC_FT5436 = 0x25, + IC_FT3X27 = 0x26, + IC_FT5526I = 0x27, + IC_FT5416 = 0x28, + IC_FT5426 = 0x29, + IC_FT5435 = 0x2A, + IC_FT7681 = 0x2B, + IC_FT7661 = 0x2C, + IC_FT7511 = 0x2D, + IC_FT7421 = 0x2E, + IC_FT6X06 = 0x30, + IC_FT3X06 = 0x31, + IC_FT6X36 = 0x40, + IC_FT3X07 = 0x41, + IC_FT6416 = 0x42, + IC_FT6426 = 0x43, + IC_FT7401 = 0x44, + IC_FT3407U = 0x45, + IC_FT6236U = 0x46, + IC_FT6436U = 0x47, + IC_FT3267 = 0x48, + IC_FT3367 = 0x49, + IC_FT5X16 = 0x50, + IC_FT5X12 = 0x51, + IC_FT5506 = 0x60, + IC_FT5606 = 0x61, + IC_FT5816 = 0x62, + IC_FT5822 = 0x70, + IC_FT5626 = 0x71, + IC_FT5726 = 0x72, + IC_FT5826B = 0x73, + IC_FT3617 = 0x74, + IC_FT3717 = 0x75, + IC_FT7811 = 0x76, + IC_FT5826S = 0x77, + IC_FT5306 = 0x80, + IC_FT5406 = 0x81, + IC_FT8606 = 0x90, + IC_FT8716 = 0xA0, + IC_FT3C47U = 0xB0, + IC_FT8607 = 0xC0, + IC_FT8707 = 0xD0, + IC_FT8736 = 0xE0, + IC_FT3D47 = 0xF0, + IC_FTE716 = 0x100, + IC_FT5442 = 0x110, + IC_FT3428U = 0x120, + IC_FT8201 = 0x130, + IC_FT8006M = 0x131, + IC_FTE736 = 0x140 +}; + + + +extern unsigned int ft8006m_ic_table_get_ic_code_from_ic_name(char *strIcName); +extern void ft8006m_ic_table_get_ic_name_from_ic_code(unsigned int ic_code, char *strIcName); + +extern unsigned int ft8006m_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2); +extern unsigned int ft8006m_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2); +extern int ft8006m_ic_table_need_chip_id2(unsigned int chip_id); + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_detail_threshold.h b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_detail_threshold.h new file mode 100755 index 0000000000000..9518f6900da0a --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_detail_threshold.h @@ -0,0 +1,131 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ + +#ifndef _DETAIL_THRESHOLD_H +#define _DETAIL_THRESHOLD_H + +#define TX_NUM_MAX 60 +#define RX_NUM_MAX 60 +#define NUM_MAX (TX_NUM_MAX)*(RX_NUM_MAX) +#define MAX_PATH 256 + +#define BUFFER_LENGTH 512 +#define MAX_TEST_ITEM 20 +#define MAX_GRAPH_ITEM 20 +#define MAX_CHANNEL_NUM 144 + +#define FORCETOUCH_ROW 1 + +struct stCfg_Incell_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + + int (*CBTest_Min)[RX_NUM_MAX]; + int (*CBTest_Max)[RX_NUM_MAX]; + + int (*CBUniformityTest_CHX_Linearity)[RX_NUM_MAX]; + int (*CBUniformityTest_CHY_Linearity)[RX_NUM_MAX]; + +}; + +struct stCfg_MCap_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + unsigned char (*InvalidNode_SC)[RX_NUM_MAX]; + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + int (*RawDataTest_Low_Min)[RX_NUM_MAX]; + int (*RawDataTest_Low_Max)[RX_NUM_MAX]; + int (*RawDataTest_High_Min)[RX_NUM_MAX]; + int (*RawDataTest_High_Max)[RX_NUM_MAX]; + int (*RxLinearityTest_Max)[RX_NUM_MAX]; + int (*TxLinearityTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Min)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Max)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Min)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Max)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Min)[RX_NUM_MAX]; + int (*NoistTest_Coefficient)[RX_NUM_MAX]; + int (*LCDNoistTest_Coefficient)[RX_NUM_MAX]; + + int ForceTouch_SCapRawDataTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; +}; + +struct stCfg_SCap_DetailThreshold { + int TempData[MAX_CHANNEL_NUM]; + int RawDataTest_Max[MAX_CHANNEL_NUM]; + int RawDataTest_Min[MAX_CHANNEL_NUM]; + int CiTest_Max[MAX_CHANNEL_NUM]; + int CiTest_Min[MAX_CHANNEL_NUM]; + int DeltaCiTest_Base[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase1[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase2[MAX_CHANNEL_NUM]; + int CiDeviationTest_Base[MAX_CHANNEL_NUM]; + + int NoiseTest_Max[MAX_CHANNEL_NUM]; + int DeltaCxTest_Sort[MAX_CHANNEL_NUM]; + int DeltaCxTest_Area[MAX_CHANNEL_NUM]; + + int CbTest_Max[MAX_CHANNEL_NUM]; + int CbTest_Min[MAX_CHANNEL_NUM]; + int DeltaCbTest_Base[MAX_CHANNEL_NUM]; + int DifferTest_Base[MAX_CHANNEL_NUM]; + int CBDeviationTest_Base[MAX_CHANNEL_NUM]; + int K1DifferTest_Base[MAX_CHANNEL_NUM]; +}; + +void Ft8006m_OnInit_MCap_DetailThreshold(char *strIniFile); +void Ft8006m_OnInit_SCap_DetailThreshold(char *strIniFile); +void Ft8006m_OnInit_Incell_DetailThreshold(char *strIniFile); + +void ft8006m_set_max_channel_num(void); + +void Ft8006m_OnInit_InvalidNode(char *strIniFile); +void Ft8006m_OnInit_DThreshold_RawDataTest(char *strIniFile); +void Ft8006m_OnInit_DThreshold_SCapRawDataTest(char *strIniFile); +void Ft8006m_OnInit_DThreshold_SCapCbTest(char *strIniFile); + +void Ft8006m_OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile); +void Ft8006m_OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile); + + +void Ft8006m_OnInit_DThreshold_RxLinearityTest(char *strIniFile); +void Ft8006m_OnInit_DThreshold_TxLinearityTest(char *strIniFile); + +void Ft8006m_OnInit_DThreshold_PanelDifferTest(char *strIniFile); + +void Ft8006m_OnInit_DThreshold_CBTest(char *strIniFile); +void Ft8006m_OnInit_DThreshold_AllButtonCBTest(char *strIniFile); +void Ft8006m_OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile); + +void Ft8006m_OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue); + +int ft8006m_malloc_struct_DetailThreshold(void); +void ft8006m_free_struct_DetailThreshold(void); +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_ini.h b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_ini.h new file mode 100755 index 0000000000000..8342218bae1ea --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_ini.h @@ -0,0 +1,66 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#ifndef INI_H +#define INI_H + +#define MAX_KEY_NUM 300 +#define MAX_KEY_NAME_LEN 50 +#define MAX_KEY_VALUE_LEN 360 + +#define MAX_CFG_BUF 480 +#define SUCCESS 0 +/* return value */ +#define CFG_OK SUCCESS +#define CFG_SECTION_NOT_FOUND -1 +#define CFG_KEY_NOT_FOUND -2 +#define CFG_ERR -10 + +#define CFG_ERR_OPEN_FILE -10 +#define CFG_ERR_CREATE_FILE -11 +#define CFG_ERR_READ_FILE -12 +#define CFG_ERR_WRITE_FILE -13 +#define CFG_ERR_FILE_FORMAT -14 +#define CFG_ERR_TOO_MANY_KEY_NUM -15 +#define CFG_ERR_OUT_OF_LEN -16 + +#define CFG_ERR_EXCEED_BUF_SIZE -22 + +#define COPYF_OK SUCCESS +#define COPYF_ERR_OPEN_FILE -10 +#define COPYF_ERR_CREATE_FILE -11 +#define COPYF_ERR_READ_FILE -12 +#define COPYF_ERR_WRITE_FILE -13 + +typedef struct _ST_INI_FILE_DATA { + char pSectionName[MAX_KEY_NAME_LEN]; + char pKeyName[MAX_KEY_NAME_LEN]; + char pKeyValue[MAX_KEY_VALUE_LEN]; + int iSectionNameLen; + int iKeyNameLen; + int iKeyValueLen; +} ST_INI_FILE_DATA; + + + +int ft8006m_ini_get_key(char *filedata, char *section, char *key, char *value); + + +int ft8006m_atoi(char *nptr); +char *ft8006m_ini_str_trim_r(char *buf); +char *ft8006m_ini_str_trim_l(char *buf); + +int ft8006m_init_key_data(void); +int ft8006m_ini_get_key_data(char *filedata); +int ft8006m_release_key_data(void); +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_main.h b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_main.h new file mode 100755 index 0000000000000..ec53aafc7e770 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_main.h @@ -0,0 +1,240 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#ifndef _TEST_LIB_H +#define _TEST_LIB_H + +#include "focaltech_test_detail_threshold.h" +#include "../focaltech_test_config.h" + +#define boolean unsigned char +#define bool unsigned char +#define BYTE unsigned char +#define false 0 +#define true 1 + +enum NodeType { + NODE_INVALID_TYPE = 0, + NODE_VALID_TYPE = 1, + NODE_KEY_TYPE = 2, + NODE_AST_TYPE = 3, +}; + + +typedef int (*FTS_I2C_READ_FUNCTION)(unsigned char *, int , unsigned char *, int); +typedef int (*FTS_I2C_WRITE_FUNCTION)(unsigned char *, int); + +extern FTS_I2C_READ_FUNCTION ft8006m_i2c_read_test; +extern FTS_I2C_WRITE_FUNCTION ft8006m_i2c_write_test; + +extern int ft8006m_init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read); +extern int ft8006m_init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write); + + + + + + +int ft8006m_set_param_data(char *TestParamData); +boolean ft8006m_start_test_tp(void); +int m_get_test_data(char *pTestData); + + +int ft8006m_focaltech_test_main_init(void); +int ft8006m_focaltech_test_main_exit(void); + + +#define MIN_HOLE_LEVEL (-1) +#define MAX_HOLE_LEVEL 0x7F +/*----------------------------------------------------------- +Error Code for Comm +-----------------------------------------------------------*/ +#define ERROR_CODE_OK 0x00 +#define ERROR_CODE_CHECKSUM_ERROR 0x01 +#define ERROR_CODE_INVALID_COMMAND 0x02 +#define ERROR_CODE_INVALID_PARAM 0x03 +#define ERROR_CODE_IIC_WRITE_ERROR 0x04 +#define ERROR_CODE_IIC_READ_ERROR 0x05 +#define ERROR_CODE_WRITE_USB_ERROR 0x06 +#define ERROR_CODE_WAIT_RESPONSE_TIMEOUT 0x07 +#define ERROR_CODE_PACKET_RE_ERROR 0x08 +#define ERROR_CODE_NO_DEVICE 0x09 +#define ERROR_CODE_WAIT_WRITE_TIMEOUT 0x0a +#define ERROR_CODE_READ_USB_ERROR 0x0b +#define ERROR_CODE_COMM_ERROR 0x0c +#define ERROR_CODE_ALLOCATE_BUFFER_ERROR 0x0d +#define ERROR_CODE_DEVICE_OPENED 0x0e +#define ERROR_CODE_DEVICE_CLOSED 0x0f + +/*----------------------------------------------------------- +Test Status +-----------------------------------------------------------*/ +#define RESULT_NULL 0 +#define RESULT_PASS 1 +#define RESULT_NG 2 +#define RESULT_TESTING 3 +#define RESULT_TBD 4 +#define RESULT_REPLACE 5 +#define RESULT_CONNECTING 6 + +/*----------------------------------------------------------- + +read write max bytes per time +-----------------------------------------------------------*/ + +#define BYTES_PER_TIME 128 + +extern void ft8006m_test_funcs(void); +struct StTestFuncs { + void (*OnInit_TestItem)(char *); + void (*OnInit_BasicThreshold)(char *) ; + void (*SetTestItem)(void) ; + boolean (*Start_Test)(void); + int (*Get_test_data)(char *); +}; +extern struct StTestFuncs ft8006m_g_stTestFuncs; + +struct StruScreenSeting { + int iSelectedIC; + int iTxNum; + int iRxNum; + int isNormalize; + int iUsedMaxTxNum; + int iUsedMaxRxNum; + + unsigned char iChannelsNum; + unsigned char iKeyNum; +}; +extern struct StruScreenSeting ft8006m_g_ScreenSetParam; +struct stTestItem { + unsigned char ItemType; + unsigned char TestNum; + unsigned char TestResult; + unsigned char ItemCode; + + +}; +extern struct stTestItem ft8006m_g_stTestItem[1][MAX_TEST_ITEM]; + +struct structSCapConfEx { + unsigned char ChannelXNum; + unsigned char ChannelYNum; + unsigned char KeyNum; + unsigned char KeyNumTotal; + bool bLeftKey1; + bool bLeftKey2; + bool bLeftKey3; + bool bRightKey1; + bool bRightKey2; + bool bRightKey3; +}; +extern struct structSCapConfEx ft8006m_g_stSCapConfEx; + +enum NORMALIZE_Type { + Overall_Normalize = 0, + Auto_Normalize = 1, +}; + +enum PROOF_TYPE { + Proof_Normal, + Proof_Level0, + Proof_NoWaterProof, +}; + +/*----------------------------------------------------------- +IC Capacitance Type 0:Self Capacitance, 1:Mutual Capacitance, 2:IDC +-----------------------------------------------------------*/ +enum enum_Report_Protocol_Type { + Self_Capacitance = 0, + Mutual_Capacitance = 1, + IDC_Capacitance = 2, +}; + +#if (FTS_CHIP_TEST_TYPE == FT6X36_TEST) +#define IC_Capacitance_Type 0 +#elif ((FTS_CHIP_TEST_TYPE == FT3C47_TEST) || (FTS_CHIP_TEST_TYPE == FT5822_TEST) || (FTS_CHIP_TEST_TYPE == FT5X46_TEST) || (FTS_CHIP_TEST_TYPE == FT3D47_TEST)) +#define IC_Capacitance_Type 1 +#elif ((FTS_CHIP_TEST_TYPE == FT8606_TEST) || (FTS_CHIP_TEST_TYPE == FT8607_TEST) || (FTS_CHIP_TEST_TYPE == FT8716_TEST) || (FTS_CHIP_TEST_TYPE == FT8736_TEST) || (FTS_CHIP_TEST_TYPE == FTE716_TEST) || (FTS_CHIP_TEST_TYPE == FTE736_TEST) || (FTS_CHIP_TEST_TYPE == FT8006_TEST)) +#define IC_Capacitance_Type 2 +#endif + + + + +extern struct stCfg_MCap_DetailThreshold ft8006m_g_stCfg_MCap_DetailThreshold; +extern struct stCfg_SCap_DetailThreshold ft8006m_g_stCfg_SCap_DetailThreshold; +extern struct stCfg_Incell_DetailThreshold ft8006m_g_stCfg_Incell_DetailThreshold; + + +extern int ft8006m_g_TestItemNum;/*test item num*/ +extern char ft8006m_g_strIcName[20];/*IC Name*/ +extern char *ft8006m_g_pStoreAllData; + +int Ft8006m_GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile); +void ft8006m_focal_msleep(int ms); +void Ft8006m_SysDelay(int ms); +int ft8006m_focal_abs(int value); + + +void Ft8006m_OnInit_InterfaceCfg(char *strIniFile); + +int Ft8006m_ReadReg(unsigned char RegAddr, unsigned char *RegData); +int Ft8006m_WriteReg(unsigned char RegAddr, unsigned char RegData); +unsigned char Ft8006m_Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead); + +unsigned char Ft8006m_EnterWork(void); +unsigned char Ft8006m_EnterFactory(void); + +void ft8006m_SetTestItemCodeName(unsigned char ucitemcode); + +extern void *Ft8006m_fts_malloc(size_t size); +extern void Ft8006m_fts_free(void *p); + +extern int Ft8006m_InitTest(void); +extern void Ft8006m_FinishTest(void); +extern void Ft8006m_InitStoreParamOfTestData(void); +extern void Ft8006m_MergeAllTestData(void); +extern int Ft8006m_AllocateMemory(void); +extern void Ft8006m_FreeMemory(void); + +extern char *ft8006m_g_pTmpBuff; +extern char *ft8006m_g_pStoreMsgArea; +extern int ft8006m_g_lenStoreMsgArea; +extern char *ft8006m_g_pMsgAreaLine2; +extern int ft8006m_g_lenMsgAreaLine2; +extern char *ft8006m_g_pStoreDataArea; +extern int ft8006m_g_lenStoreDataArea; +extern unsigned char ft8006m_m_ucTestItemCode; +extern int ft8006m_m_iStartLine; +extern int ft8006m_m_iTestDataCount; + +extern char *Ft8006m_TestResult ; +extern int Ft8006m_TestResultLen; + +#define FOCAL_TEST_DEBUG_EN 0 +#if (FOCAL_TEST_DEBUG_EN) +#define FTS_TEST_DBG(fmt, args...) do {printk(KERN_ERR "[FTS] [TEST]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_FUNC_ENTER() printk(KERN_ERR "[FTS][TEST]%s: Enter(%d)\n", __func__, __LINE__) +#define FTS_TEST_FUNC_EXIT() printk(KERN_ERR "[FTS][TEST]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_TEST_DBG(fmt, args...) do {} while (0) +#define FTS_TEST_FUNC_ENTER() +#define FTS_TEST_FUNC_EXIT() +#endif + +#define FTS_TEST_INFO(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Info]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_ERROR(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Error]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) + + + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_supported_ic.h b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_supported_ic.h new file mode 100755 index 0000000000000..206aefb1650ff --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_supported_ic.h @@ -0,0 +1,1576 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R) All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ + +#include +#include + +#include "../focaltech_test_config.h" +#include "focaltech_test_main.h" + +#if (FTS_CHIP_TEST_TYPE == FT8716_TEST) + +struct stCfg_FT8716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + +}; +struct ft8006m_stCfg_FT8716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + bool bCBTest_VKey_DCheck_Check; + int CbTest_Min_DCheck_Vkey; + int CbTest_Max_DCheck_Vkey; + + bool bLcdBusyAdjust; + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + int LCDNoiseTest_SequenceFrame; + int LCDNoiseTest_MaxFrame; + +}; +enum enumTestItem_FT8716 { + Code_FT8716_ENTER_FACTORY_MODE, + Code_FT8716_DOWNLOAD, + Code_FT8716_UPGRADE, + Code_FT8716_FACTORY_ID_TEST, + Code_FT8716_PROJECT_CODE_TEST, + Code_FT8716_FW_VERSION_TEST, + Code_FT8716_IC_VERSION_TEST, + Code_FT8716_RAWDATA_TEST, + Code_FT8716_CHANNEL_NUM_TEST, + + Code_FT8716_INT_PIN_TEST, + Code_FT8716_RESET_PIN_TEST, + Code_FT8716_NOISE_TEST, + Code_FT8716_CB_TEST, + Code_FT8716_WRITE_CONFIG, + + Code_FT8716_SHORT_CIRCUIT_TEST, + Code_FT8716_OPEN_TEST, + Code_FT8716_CB_UNIFORMITY_TEST, + Code_FT8716_DIFFER_UNIFORMITY_TEST, + Code_FT8716_DIFFER2_UNIFORMITY_TEST, + Code_FT8716_LCD_NOISE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT3D47_TEST) + +struct stCfg_FT3D47_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + + bool FORCETOUCH_CHANNEL_NUM_TEST; + bool FORCETOUCH_RAWDATA_TEST; + bool FORCETOUCH_CB_TEST; + bool FORCETOUCH_WEAK_SHORT_CIRCUIT_TEST; + bool FORCETOUCH_FLATNESS_TEST; +}; + +struct stCfg_FT3D47_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int ForceTouch_ChannelNumTest_ChannelNum; + + int ForceTouch_SCapRawDataTest_OFF_Min; + int ForceTouch_SCapRawDataTest_OFF_Max; + int ForceTouch_SCapRawDataTest_ON_Min; + int ForceTouch_SCapRawDataTest_ON_Max; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_ON; + + int ForceTouch_SCapCbTest_OFF_Min; + int ForceTouch_SCapCbTest_OFF_Max; + int ForceTouch_SCapCbTest_ON_Min; + int ForceTouch_SCapCbTest_ON_Max; + BYTE ForceTouch_SCapCBTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapCBTest_SetWaterproof_ON; + + int ForceTouch_WeakShortTest_CG; + int ForceTouch_WeakShortTest_CC; + bool bForceTouch_WeakShortTest_CapShortTest; + + int ForceTouch_FlatnessTest_Differ_Threshold; + int ForceTouch_FlatnessTest_Differ_Coefficient; + bool ForceTouch_FlatnessTest_Differ_Threshold_Check; + bool ForceTouch_FlatnessTest_Differ_Coefficient_Check; + +}; +enum enumTestItem_FT3D47 { + Code_FT3D47_ENTER_FACTORY_MODE, + Code_FT3D47_DOWNLOAD, + Code_FT3D47_UPGRADE, + Code_FT3D47_FACTORY_ID_TEST, + Code_FT3D47_PROJECT_CODE_TEST, + Code_FT3D47_FW_VERSION_TEST, + Code_FT3D47_IC_VERSION_TEST, + Code_FT3D47_RAWDATA_TEST, + Code_FT3D47_ADCDETECT_TEST, + Code_FT3D47_SCAP_CB_TEST, + Code_FT3D47_SCAP_RAWDATA_TEST, + Code_FT3D47_CHANNEL_NUM_TEST, + Code_FT3D47_INT_PIN_TEST, + Code_FT3D47_RESET_PIN_TEST, + Code_FT3D47_NOISE_TEST, + Code_FT3D47_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3D47_UNIFORMITY_TEST, + Code_FT3D47_CM_TEST, + Code_FT3D47_RAWDATA_MARGIN_TEST, + Code_FT3D47_WRITE_CONFIG, + Code_FT3D47_PANELDIFFER_TEST, + Code_FT3D47_PANELDIFFER_UNIFORMITY_TEST, + Code_FT3D47_LCM_ID_TEST, + Code_FT3D47_JUDEG_NORMALIZE_TYPE, + Code_FT3D47_TE_TEST, + Code_FT3D47_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT3D47_PATTERN_TEST, + + Code_FT3D47_GPIO_TEST, + Code_FT3D47_LCD_NOISE_TEST, + Code_FT3D47_FORCE_TOUCH_CHANNEL_NUM_TEST, + Code_FT3D47_FORCE_TOUCH_SCAP_RAWDATA_TEST, + Code_FT3D47_FORCE_TOUCH_SCAP_CB_TEST, + Code_FT3D47_FORCE_TOUCH_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3D47_FORCE_TOUCH_FLATNESS_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT8607_TEST) + +struct stCfg_FT8607_TESTItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool OPEN_TEST; +}; + +struct stCfg_FT8607_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMax; + + int iLCDNoiseCoefficient; + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Open_Test_CBMin; +}; + + +enum enumTestItem_FT8607 { + Code_FT8607_ENTER_FACTORY_MODE, + Code_FT8607_DOWNLOAD, + Code_FT8607_UPGRADE, + Code_FT8607_FACTORY_ID_TEST, + Code_FT8607_PROJECT_CODE_TEST, + Code_FT8607_FW_VERSION_TEST, + Code_FT8607_IC_VERSION_TEST, + Code_FT8607_RAWDATA_TEST, + Code_FT8607_CHANNEL_NUM_TEST, + + Code_FT8607_INT_PIN_TEST, + Code_FT8607_RESET_PIN_TEST, + Code_FT8607_NOISE_TEST, + Code_FT8607_CB_TEST, + Code_FT8607_WRITE_CONFIG, + + Code_FT8607_SHORT_CIRCUIT_TEST, + Code_FT8607_LCD_NOISE_TEST, + + Code_FT8607_OSC60MHZ_TEST, + Code_FT8607_OSCTRM_TEST, + Code_FT8607_SNR_TEST, + Code_FT8607_DIFFER_TEST, + Code_FT8607_DIFFER_UNIFORMITY_TEST, + + Code_FT8607_LPWG_RAWDATA_TEST, + Code_FT8607_LPWG_CB_TEST, + Code_FT8607_LPWG_NOISE_TEST, + + Code_FT8607_OPEN_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT5X46_TEST) +/*----------------------------------------------- +FT5X46 and FT5X22 is the same series of chips +FT5422\FT5X22 is the chip code for internally develope +FT5X46 is the chip code for market +------------------------------------------------*/ +struct stCfg_FT5X46_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + bool PANEL_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + bool GPIO_TEST; + bool LCD_NOISE_TEST; +}; +struct stCfg_FT5X46_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int Lcd_Noise_MaxFrame; + int Lcd_Noise_Conficient; + int Lcd_Noise_Noise_Mode; + int Lcd_Noise_MaxNgPoint; + int Lcd_Noise_FrameNum; + + bool Lcd_Noise_NoiseThresholdMode; + int Lcd_Noise_NoiseCoefficient; + int Lcd_Noise_NoiseMax; + int Lcd_Noise_SetFrequency; +}; +enum enumTestItem_FT5X46 { + Code_FT5X46_ENTER_FACTORY_MODE, + Code_FT5X46_DOWNLOAD, + Code_FT5X46_UPGRADE, + Code_FT5X46_FACTORY_ID_TEST, + Code_FT5X46_PROJECT_CODE_TEST, + Code_FT5X46_FW_VERSION_TEST, + Code_FT5X46_IC_VERSION_TEST, + Code_FT5X46_RAWDATA_TEST, + Code_FT5X46_ADCDETECT_TEST, + Code_FT5X46_SCAP_CB_TEST, + Code_FT5X46_SCAP_RAWDATA_TEST, + Code_FT5X46_CHANNEL_NUM_TEST, + Code_FT5X46_INT_PIN_TEST, + Code_FT5X46_RESET_PIN_TEST, + Code_FT5X46_NOISE_TEST, + Code_FT5X46_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5X46_UNIFORMITY_TEST, + Code_FT5X46_CM_TEST, + Code_FT5X46_RAWDATA_MARGIN_TEST, + Code_FT5X46_WRITE_CONFIG, + Code_FT5X46_PANELDIFFER_TEST, + Code_FT5X46_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5X46_LCM_ID_TEST, + Code_FT5X46_JUDEG_NORMALIZE_TYPE, + Code_FT5X46_TE_TEST, + Code_FT5X46_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5X46_PATTERN_TEST, + Code_FT5X46_GPIO_TEST, + Code_FT5X46_LCD_NOISE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT6X36_TEST) + +struct stCfg_FT6X36_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool CHANNEL_SHORT_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool DELTA_CB_TEST; + bool CHANNELS_DEVIATION_TEST; + bool TWO_SIDES_DEVIATION_TEST; + bool FPC_SHORT_TEST; + bool FPC_OPEN_TEST; + bool SREF_OPEN_TEST; + bool TE_TEST; + bool CB_DEVIATION_TEST; + bool DIFFER_TEST; + bool WEAK_SHORT_TEST; + bool DIFFER_TEST2; + bool K1_DIFFER_TEST; +}; + +struct stCfg_FT6X36_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelNum; + BYTE ChannelNumTest_KeyNum; + int ChannelShortTest_K1; + int ChannelShortTest_K2; + int ChannelShortTest_CB; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int WeakShortThreshold; + int NoiseTest_Max; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int FPCShort_CB_Min; + int FPCShort_CB_Max; + int FPCShort_RawData_Min; + int FPCShort_RawData_Max; + int FPCOpen_CB_Min; + int FPCOpen_CB_Max; + int FPCOpen_RawData_Min; + int FPCOpen_RawData_Max; + int SREFOpen_Hole_Base1; + int SREFOpen_Hole_Base2; + int SREFOpen_Hole; + int CBDeviationTest_Hole; + int Differ_Ave_Hole; + int Differ_Max_Hole; + int CbTest_Min; + int CbTest_Max; + int DeltaCbTest_Base; + int DeltaCbTest_Differ_Max; + bool DeltaCbTest_Include_Key_Test; + int DeltaCbTest_Key_Differ_Max; + int DeltaCbTest_Deviation_S1; + int DeltaCbTest_Deviation_S2; + int DeltaCbTest_Deviation_S3; + int DeltaCbTest_Deviation_S4; + int DeltaCbTest_Deviation_S5; + int DeltaCbTest_Deviation_S6; + bool DeltaCbTest_Set_Critical; + int DeltaCbTest_Critical_S1; + int DeltaCbTest_Critical_S2; + int DeltaCbTest_Critical_S3; + int DeltaCbTest_Critical_S4; + int DeltaCbTest_Critical_S5; + int DeltaCbTest_Critical_S6; + + int ChannelsDeviationTest_Deviation_S1; + int ChannelsDeviationTest_Deviation_S2; + int ChannelsDeviationTest_Deviation_S3; + int ChannelsDeviationTest_Deviation_S4; + int ChannelsDeviationTest_Deviation_S5; + int ChannelsDeviationTest_Deviation_S6; + bool ChannelsDeviationTest_Set_Critical; + int ChannelsDeviationTest_Critical_S1; + int ChannelsDeviationTest_Critical_S2; + int ChannelsDeviationTest_Critical_S3; + int ChannelsDeviationTest_Critical_S4; + int ChannelsDeviationTest_Critical_S5; + int ChannelsDeviationTest_Critical_S6; + + int TwoSidesDeviationTest_Deviation_S1; + int TwoSidesDeviationTest_Deviation_S2; + int TwoSidesDeviationTest_Deviation_S3; + int TwoSidesDeviationTest_Deviation_S4; + int TwoSidesDeviationTest_Deviation_S5; + int TwoSidesDeviationTest_Deviation_S6; + bool TwoSidesDeviationTest_Set_Critical; + int TwoSidesDeviationTest_Critical_S1; + int TwoSidesDeviationTest_Critical_S2; + int TwoSidesDeviationTest_Critical_S3; + int TwoSidesDeviationTest_Critical_S4; + int TwoSidesDeviationTest_Critical_S5; + int TwoSidesDeviationTest_Critical_S6; + + int DifferTest2_Data_H_Min; + int DifferTest2_Data_H_Max; + int DifferTest2_Data_M_Min; + int DifferTest2_Data_M_Max; + int DifferTest2_Data_L_Min; + int DifferTest2_Data_L_Max; + bool bDifferTest2_Data_H; + bool bDifferTest2_Data_M; + bool bDifferTest2_Data_L; + int K1DifferTest_StartK1; + int K1DifferTest_EndK1; + int K1DifferTest_MinHold2; + int K1DifferTest_MaxHold2; + int K1DifferTest_MinHold4; + int K1DifferTest_MaxHold4; + int K1DifferTest_Deviation2; + int K1DifferTest_Deviation4; +}; + +enum enumTestItem_FT6X36 { + Code_FT6X36_ENTER_FACTORY_MODE, + Code_FT6X36_DOWNLOAD, + Code_FT6X36_UPGRADE, + Code_FT6X36_FACTORY_ID_TEST, + Code_FT6X36_PROJECT_CODE_TEST, + Code_FT6X36_FW_VERSION_TEST, + Code_FT6X36_IC_VERSION_TEST, + Code_FT6X36_RAWDATA_TEST, + Code_FT6X36_CHANNEL_NUM_TEST, + Code_FT6X36_CHANNEL_SHORT_TEST, + Code_FT6X36_INT_PIN_TEST, + Code_FT6X36_RESET_PIN_TEST, + Code_FT6X36_NOISE_TEST, + Code_FT6X36_CB_TEST, + Code_FT6X36_DELTA_CB_TEST, + Code_FT6X36_CHANNELS_DEVIATION_TEST, + Code_FT6X36_TWO_SIDES_DEVIATION_TEST, + Code_FT6X36_FPC_SHORT_TEST, + Code_FT6X36_FPC_OPEN_TEST, + Code_FT6X36_SREF_OPEN_TEST, + Code_FT6X36_TE_TEST, + Code_FT6X36_CB_DEVIATION_TEST, + Code_FT6X36_WRITE_CONFIG, + Code_FT6X36_DIFFER_TEST, + Code_FT6X36_WEAK_SHORT_TEST, + Code_FT6X36_DIFFER_TEST2, + Code_FT6X36_K1_DIFFER_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT5822_TEST) + +struct stCfg_FT5822_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; +}; +struct stCfg_FT5822_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + + int WeakShortTest_CG; + int WeakShortTest_CC; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; +}; +enum enumTestItem_FT5822 { + Code_FT5822_ENTER_FACTORY_MODE, + Code_FT5822_DOWNLOAD, + Code_FT5822_UPGRADE, + Code_FT5822_FACTORY_ID_TEST, + Code_FT5822_PROJECT_CODE_TEST, + Code_FT5822_FW_VERSION_TEST, + Code_FT5822_IC_VERSION_TEST, + Code_FT5822_RAWDATA_TEST, + Code_FT5822_ADCDETECT_TEST, + Code_FT5822_SCAP_CB_TEST, + Code_FT5822_SCAP_RAWDATA_TEST, + Code_FT5822_CHANNEL_NUM_TEST, + Code_FT5822_INT_PIN_TEST, + Code_FT5822_RESET_PIN_TEST, + Code_FT5822_NOISE_TEST, + Code_FT5822_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5822_UNIFORMITY_TEST, + Code_FT5822_CM_TEST, + Code_FT5822_RAWDATA_MARGIN_TEST, + Code_FT5822_WRITE_CONFIG, + Code_FT5822_PANELDIFFER_TEST, + Code_FT5822_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5822_LCM_ID_TEST, + Code_FT5822_JUDEG_NORMALIZE_TYPE, + Code_FT5822_TE_TEST, + Code_FT5822_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5822_PATTERN_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT8006_TEST) + +struct stCfg_FT8006_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_TEST; + +}; +struct stCfg_FT8006_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Differ2Test_Min; + int Differ2Test_Max; + +}; +enum enumTestItem_FT8006 { + Code_FT8006_ENTER_FACTORY_MODE, + Code_FT8006_DOWNLOAD, + Code_FT8006_UPGRADE, + Code_FT8006_FACTORY_ID_TEST, + Code_FT8006_PROJECT_CODE_TEST, + Code_FT8006_FW_VERSION_TEST, + Code_FT8006_IC_VERSION_TEST, + Code_FT8006_RAWDATA_TEST, + Code_FT8006_CHANNEL_NUM_TEST, + Code_FT8006_INT_PIN_TEST, + Code_FT8006_RESET_PIN_TEST, + Code_FT8006_NOISE_TEST, + Code_FT8006_CB_TEST, + Code_FT8006_WRITE_CONFIG, + Code_FT8006_SHORT_CIRCUIT_TEST, + Code_FT8006_LCD_NOISE_TEST, + + Code_FT8006_OSC60MHZ_TEST, + Code_FT8006_OSCTRM_TEST, + Code_FT8006_SNR_TEST, + Code_FT8006_DIFFER_TEST, + Code_FT8006_DIFFER_UNIFORMITY_TEST, + + Code_FT8006_LPWG_RAWDATA_TEST, + Code_FT8006_LPWG_CB_TEST, + Code_FT8006_LPWG_NOISE_TEST, + Code_FT8006_DIFFER2_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT8736_TEST) + +struct stCfg_FT8736_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool CB_DECREASE_TEST; + bool VREF_DECREASE_TEST; +}; +struct stCfg_FT8736_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + + int CBDecrease_Step; + int CBDecrease_OrgMin; + int CBDecrease_OrgMax; + int CBDecrease_CalcMin; + int CBDecrease_CalcMax; + + int VRefDecrease_StepBegin; + int VRefDecrease_StepEnd; + int VRefDecrease_OrgMin; + int VRefDecrease_OrgMax; + int VRefDecrease_CalcMin; + int VRefDecrease_CalcMax; +}; + +enum enumTestItem_FT8736 { + Code_FT8736_ENTER_FACTORY_MODE, + Code_FT8736_DOWNLOAD, + Code_FT8736_UPGRADE, + Code_FT8736_FACTORY_ID_TEST, + Code_FT8736_PROJECT_CODE_TEST, + Code_FT8736_FW_VERSION_TEST, + Code_FT8736_IC_VERSION_TEST, + Code_FT8736_RAWDATA_TEST, + Code_FT8736_CHANNEL_NUM_TEST, + + Code_FT8736_INT_PIN_TEST, + Code_FT8736_RESET_PIN_TEST, + Code_FT8736_NOISE_TEST, + Code_FT8736_CB_TEST, + Code_FT8736_WRITE_CONFIG, + + Code_FT8736_SHORT_CIRCUIT_TEST, + Code_FT8736_OPEN_TEST, + Code_FT8736_CB_UNIFORMITY_TEST, + Code_FT8736_DIFFER_UNIFORMITY_TEST, + Code_FT8736_DIFFER2_UNIFORMITY_TEST, + Code_FT8736_LCD_NOISE_TEST, + Code_FT8736_CB_DECREASE_TEST, + Code_FT8736_VREF_DECREASE_TEST, + Code_FT8736_IC_TYPE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FTE716_TEST) +struct stCfg_FTE716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool GPIO_TEST; +}; +struct stCfg_FTE716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + bool bOri_ProjectCode; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + BYTE LCDNoiseTest_NoiseMode; +}; + +enum enumTestItem_FTE716 { + Code_FTE716_ENTER_FACTORY_MODE, + Code_FTE716_DOWNLOAD, + Code_FTE716_UPGRADE, + Code_FTE716_FACTORY_ID_TEST, + Code_FTE716_PROJECT_CODE_TEST, + Code_FTE716_FW_VERSION_TEST, + Code_FTE716_IC_VERSION_TEST, + Code_FTE716_RAWDATA_TEST, + Code_FTE716_CHANNEL_NUM_TEST, + + Code_FTE716_INT_PIN_TEST, + Code_FTE716_RESET_PIN_TEST, + Code_FTE716_NOISE_TEST, + Code_FTE716_CB_TEST, + Code_FTE716_WRITE_CONFIG, + + Code_FTE716_SHORT_CIRCUIT_TEST, + Code_FTE716_OPEN_TEST, + Code_FTE716_CB_UNIFORMITY_TEST, + Code_FTE716_DIFFER_UNIFORMITY_TEST, + Code_FTE716_DIFFER2_UNIFORMITY_TEST, + Code_FTE716_LCD_NOISE_TEST, + Code_FTE716_GPIO_TEST, + Code_FTE716_IC_TYPE_TEST, +}; +#elif(FTS_CHIP_TEST_TYPE == FT8606_TEST) + +struct stCfg_FT8606_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool IVSN_TEST; +}; +struct stCfg_FT8606_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int CbTest_Min; + int CbTest_Max; + int ShortTest_Max; + int ShortTest_K2Value; + bool ShortTest_Tip; + bool IsDifferMode; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; +}; + + +enum enumTestItem_FT8606 { + Code_FT8606_ENTER_FACTORY_MODE, + Code_FT8606_DOWNLOAD, + Code_FT8606_UPGRADE, + Code_FT8606_FACTORY_ID_TEST, + Code_FT8606_PROJECT_CODE_TEST, + Code_FT8606_FW_VERSION_TEST, + Code_FT8606_IC_VERSION_TEST, + Code_FT8606_RAWDATA_TEST, + Code_FT8606_CHANNEL_NUM_TEST, + + Code_FT8606_INT_PIN_TEST, + Code_FT8606_RESET_PIN_TEST, + Code_FT8606_NOISE_TEST, + Code_FT8606_CB_TEST, + Code_FT8606_WRITE_CONFIG, + + Code_FT8606_SHORT_CIRCUIT_TEST, + Code_FT8606_LCD_NOISE_TEST, + Code_FT8606_OSC60MHZ_TEST, + Code_FT8606_OSCTRM_TEST, + Code_FT8606_IVSN_TEST, +}; +#elif(FTS_CHIP_TEST_TYPE == FT3C47_TEST) + +struct stCfg_FT3C47_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + + bool FORCETOUCH_CHANNEL_NUM_TEST; + bool FORCETOUCH_RAWDATA_TEST; + bool FORCETOUCH_CB_TEST; + bool FORCETOUCH_WEAK_SHORT_CIRCUIT_TEST; + bool FORCETOUCH_FLATNESS_TEST; +}; + +struct stCfg_FT3C47_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int ForceTouch_ChannelNumTest_ChannelNum; + + int ForceTouch_SCapRawDataTest_OFF_Min; + int ForceTouch_SCapRawDataTest_OFF_Max; + int ForceTouch_SCapRawDataTest_ON_Min; + int ForceTouch_SCapRawDataTest_ON_Max; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_ON; + + int ForceTouch_SCapCbTest_OFF_Min; + int ForceTouch_SCapCbTest_OFF_Max; + int ForceTouch_SCapCbTest_ON_Min; + int ForceTouch_SCapCbTest_ON_Max; + BYTE ForceTouch_SCapCBTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapCBTest_SetWaterproof_ON; + + int ForceTouch_WeakShortTest_CG; + int ForceTouch_WeakShortTest_CC; + bool bForceTouch_WeakShortTest_CapShortTest; + + int ForceTouch_FlatnessTest_Differ_Threshold; + int ForceTouch_FlatnessTest_Differ_Coefficient; + bool ForceTouch_FlatnessTest_Differ_Threshold_Check; + bool ForceTouch_FlatnessTest_Differ_Coefficient_Check; + +}; +enum enumTestItem_FT3C47 { + Code_FT3C47_ENTER_FACTORY_MODE, + Code_FT3C47_DOWNLOAD, + Code_FT3C47_UPGRADE, + Code_FT3C47_FACTORY_ID_TEST, + Code_FT3C47_PROJECT_CODE_TEST, + Code_FT3C47_FW_VERSION_TEST, + Code_FT3C47_IC_VERSION_TEST, + Code_FT3C47_RAWDATA_TEST, + Code_FT3C47_ADCDETECT_TEST, + Code_FT3C47_SCAP_CB_TEST, + Code_FT3C47_SCAP_RAWDATA_TEST, + Code_FT3C47_CHANNEL_NUM_TEST, + Code_FT3C47_INT_PIN_TEST, + Code_FT3C47_RESET_PIN_TEST, + Code_FT3C47_NOISE_TEST, + Code_FT3C47_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_UNIFORMITY_TEST, + Code_FT3C47_CM_TEST, + Code_FT3C47_RAWDATA_MARGIN_TEST, + Code_FT3C47_WRITE_CONFIG, + Code_FT3C47_PANELDIFFER_TEST, + Code_FT3C47_PANELDIFFER_UNIFORMITY_TEST, + Code_FT3C47_LCM_ID_TEST, + Code_FT3C47_JUDEG_NORMALIZE_TYPE, + Code_FT3C47_TE_TEST, + Code_FT3C47_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT3C47_PATTERN_TEST, + + Code_FT3C47_GPIO_TEST, + Code_FT3C47_LCD_NOISE_TEST, + Code_FT3C47_FORCE_TOUCH_CHANNEL_NUM_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_RAWDATA_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_CB_TEST, + Code_FT3C47_FORCE_TOUCH_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_FORCE_TOUCH_FLATNESS_TEST, +}; +#endif + + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/Makefile b/drivers/input/touchscreen/FT8006m/focaltech_test/src/Makefile new file mode 100755 index 0000000000000..fd1ac825e691e --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/Makefile @@ -0,0 +1,12 @@ +#drivers/input/touchscreen/focaltech_touch/focaltech_test/src +# +# Makefile for test module +# +# Linux driver folder + +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_main.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_ini.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_global.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_detail_threshold.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_ic_table.o diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_ic_table.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_ic_table.c new file mode 100755 index 0000000000000..a3ba92ca67cee --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_ic_table.c @@ -0,0 +1,532 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: Focaltech_ic_table.c +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ + +#include +#include +#include "../include/focaltech_ic_table.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FOCALTECH_IC_TABLE_INFO "File Version of focaltech_ic_table.c: V1.0.0 2016-03-22" + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + + +/***************************************************************************** +* functions body +*****************************************************************************/ + + +unsigned int ft8006m_ic_table_get_ic_code_from_ic_name(char *strIcName) +{ + + if (strncmp(strIcName, "FT5X36", 6) == 0) + return IC_FT5X36; + if (strncmp(strIcName, "FT5X36i", 7) == 0) + return IC_FT5X36i; + if (strncmp(strIcName, "FT3X16", 6) == 0) + return IC_FT3X16; + if (strncmp(strIcName, "FT3X26", 6) == 0) + return IC_FT3X26; + + if (strncmp(strIcName, "FT5X22", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46i", 7) == 0) + return IC_FT5X46i; + if (strncmp(strIcName, "FT5526", 6) == 0) + return IC_FT5526; + if (strncmp(strIcName, "FT3X17", 6) == 0) + return IC_FT3X17; + if (strncmp(strIcName, "FT5436", 6) == 0) + return IC_FT5436; + if (strncmp(strIcName, "FT3X27", 6) == 0) + return IC_FT3X27; + if (strncmp(strIcName, "FT5526i", 7) == 0) + return IC_FT5526I; + if (strncmp(strIcName, "FT5416", 6) == 0) + return IC_FT5416; + if (strncmp(strIcName, "FT5426", 6) == 0) + return IC_FT5426; + if (strncmp(strIcName, "FT5435", 6) == 0) + return IC_FT5435; + if (strncmp(strIcName, "FT7681", 6) == 0) + return IC_FT7681; + if (strncmp(strIcName, "FT7661", 6) == 0) + return IC_FT7661; + if (strncmp(strIcName, "FT7511", 6) == 0) + return IC_FT7511; + if (strncmp(strIcName, "FT7421", 6) == 0) + return IC_FT7421; + + if (strncmp(strIcName, "FT6X06", 6) == 0) + return IC_FT6X06; + if (strncmp(strIcName, "FT3X06", 6) == 0) + return IC_FT3X06; + + if (strncmp(strIcName, "FT6X36", 6) == 0) + return IC_FT6X36; + if (strncmp(strIcName, "FT3X07", 6) == 0) + return IC_FT3X07; + if (strncmp(strIcName, "FT6416", 6) == 0) + return IC_FT6416; + if (strncmp(strIcName, "FT6336G/U", 9) == 0) + return IC_FT6426; + if (strncmp(strIcName, "FT6236U", 7) == 0) + return IC_FT6236U; + if (strncmp(strIcName, "FT6436U", 7) == 0) + return IC_FT6436U; + if (strncmp(strIcName, "FT3267", 6) == 0) + return IC_FT3267; + if (strncmp(strIcName, "FT3367", 6) == 0) + return IC_FT3367; + if (strncmp(strIcName, "FT7401", 6) == 0) + return IC_FT7401; + if (strncmp(strIcName, "FT3407U", 7) == 0) + return IC_FT3407U; + + + if (strncmp(strIcName, "FT5X16", 6) == 0) + return IC_FT5X16; + if (strncmp(strIcName, "FT5X12", 6) == 0) + return IC_FT5X12; + + if (strncmp(strIcName, "FT5506", 6) == 0) + return IC_FT5506; + if (strncmp(strIcName, "FT5606", 6) == 0) + return IC_FT5606; + if (strncmp(strIcName, "FT5816", 6) == 0) + return IC_FT5816; + + if (strncmp(strIcName, "FT5822", 6) == 0) + return IC_FT5822; + if (strncmp(strIcName, "FT5626", 6) == 0) + return IC_FT5626; + if (strncmp(strIcName, "FT5726", 6) == 0) + return IC_FT5726; + if (strncmp(strIcName, "FT5826B", 7) == 0) + return IC_FT5826B; + if (strncmp(strIcName, "FT3617", 6) == 0) + return IC_FT3617; + if (strncmp(strIcName, "FT3717", 6) == 0) + return IC_FT3717; + if (strncmp(strIcName, "FT7811", 6) == 0) + return IC_FT7811; + if (strncmp(strIcName, "FT5826S", 7) == 0) + return IC_FT5826S; + + if (strncmp(strIcName, "FT5306", 6) == 0) + return IC_FT5306; + if (strncmp(strIcName, "FT5406", 6) == 0) + return IC_FT5406; + + if (strncmp(strIcName, "FT8606", 6) == 0) + return IC_FT8606; + if (strncmp(strIcName, "FT8716", 6) == 0) + return IC_FT8716; + + if (strncmp(strIcName, "FT3C47U", 7) == 0) + return IC_FT3C47U; + + if (strncmp(strIcName, "FT8607", 6) == 0) + return IC_FT8607; + if (strncmp(strIcName, "FT8707", 6) == 0) + return IC_FT8707; + + + if (strncmp(strIcName, "FT8736", 6) == 0) + return IC_FT8736; + + if (strncmp(strIcName, "FT3D47", 6) == 0) + return IC_FT3D47; + + if (strncmp(strIcName, "FTE716", 6) == 0) + return IC_FTE716; + + if (strncmp(strIcName, "FT5442", 6) == 0) + return IC_FT5442; + + if (strncmp(strIcName, "FT3428U", 7) == 0) + return IC_FT3428U; + + if (strncmp(strIcName, "FT8006M", 7) == 0) + return IC_FT8006M; + + if (strncmp(strIcName, "FT8201", 6) == 0) + return IC_FT8201; + + if (strncmp(strIcName, "FTE736", 6) == 0) + return IC_FTE736; + + printk("%s. can NOT get ic code. ERROR !!! \n", __func__); + + return 0xff; +} + + +void ft8006m_ic_table_get_ic_name_from_ic_code(unsigned int ucIcCode, char *strIcName) +{ + if (NULL == strIcName) + return; + + sprintf(strIcName, "%s", "NA");/*if can't find IC , set 'NA'*/ + + if (ucIcCode == IC_FT5X36) + sprintf(strIcName, "%s", "FT5X36"); + if (ucIcCode == IC_FT5X36i) + sprintf(strIcName, "%s", "FT5X36i"); + if (ucIcCode == IC_FT3X16) + sprintf(strIcName, "%s", "FT3X16"); + if (ucIcCode == IC_FT3X26) + sprintf(strIcName, "%s", "FT3X26"); + + + if (ucIcCode == IC_FT5X46) + sprintf(strIcName, "%s", "FT5X46"); + if (ucIcCode == IC_FT5X46i) + sprintf(strIcName, "%s", "FT5X46i"); + if (ucIcCode == IC_FT5526) + sprintf(strIcName, "%s", "FT5526"); + if (ucIcCode == IC_FT3X17) + sprintf(strIcName, "%s", "FT3X17"); + if (ucIcCode == IC_FT5436) + sprintf(strIcName, "%s", "FT5436"); + if (ucIcCode == IC_FT3X27) + sprintf(strIcName, "%s", "FT3X27"); + if (ucIcCode == IC_FT5526I) + sprintf(strIcName, "%s", "FT5526i"); + if (ucIcCode == IC_FT5416) + sprintf(strIcName, "%s", "FT5416"); + if (ucIcCode == IC_FT5426) + sprintf(strIcName, "%s", "FT5426"); + if (ucIcCode == IC_FT5435) + sprintf(strIcName, "%s", "FT5435"); + if (ucIcCode == IC_FT7681) + sprintf(strIcName, "%s", "FT7681"); + if (ucIcCode == IC_FT7661) + sprintf(strIcName, "%s", "FT7661"); + if (ucIcCode == IC_FT7511) + sprintf(strIcName, "%s", "FT7511"); + if (ucIcCode == IC_FT7421) + sprintf(strIcName, "%s", "FT7421"); + + if (ucIcCode == IC_FT6X06) + sprintf(strIcName, "%s", "FT6X06"); + if (ucIcCode == IC_FT3X06) + sprintf(strIcName, "%s", "FT3X06"); + + if (ucIcCode == IC_FT6X36) + sprintf(strIcName, "%s", "FT6X36"); + if (ucIcCode == IC_FT3X07) + sprintf(strIcName, "%s", "FT3X07"); + if (ucIcCode == IC_FT6416) + sprintf(strIcName, "%s", "FT6416"); + if (ucIcCode == IC_FT6426) + sprintf(strIcName, "%s", "FT6336G/U"); + if (ucIcCode == IC_FT6236U) + sprintf(strIcName, "%s", "FT6236U"); + if (ucIcCode == IC_FT6436U) + sprintf(strIcName, "%s", "FT6436U"); + if (ucIcCode == IC_FT3267) + sprintf(strIcName, "%s", "FT3267"); + if (ucIcCode == IC_FT3367) + sprintf(strIcName, "%s", "FT3367"); + if (ucIcCode == IC_FT7401) + sprintf(strIcName, "%s", "FT7401"); + if (ucIcCode == IC_FT3407U) + sprintf(strIcName, "%s", "FT3407U"); + + if (ucIcCode == IC_FT5X16) + sprintf(strIcName, "%s", "FT5X16"); + if (ucIcCode == IC_FT5X12) + sprintf(strIcName, "%s", "FT5X12"); + + if (ucIcCode == IC_FT5506) + sprintf(strIcName, "%s", "FT5506"); + if (ucIcCode == IC_FT5606) + sprintf(strIcName, "%s", "FT5606"); + if (ucIcCode == IC_FT5816) + sprintf(strIcName, "%s", "FT5816"); + + if (ucIcCode == IC_FT5822) + sprintf(strIcName, "%s", "FT5822"); + if (ucIcCode == IC_FT5626) + sprintf(strIcName, "%s", "FT5626"); + if (ucIcCode == IC_FT5726) + sprintf(strIcName, "%s", "FT5726"); + if (ucIcCode == IC_FT5826B) + sprintf(strIcName, "%s", "FT5826B"); + if (ucIcCode == IC_FT3617) + sprintf(strIcName, "%s", "FT3617"); + if (ucIcCode == IC_FT3717) + sprintf(strIcName, "%s", "FT3717"); + if (ucIcCode == IC_FT7811) + sprintf(strIcName, "%s", "FT7811"); + if (ucIcCode == IC_FT5826S) + sprintf(strIcName, "%s", "FT5826S"); + + if (ucIcCode == IC_FT5306) + sprintf(strIcName, "%s", "FT5306"); + if (ucIcCode == IC_FT5406) + sprintf(strIcName, "%s", "FT5406"); + + if (ucIcCode == IC_FT8606) + sprintf(strIcName, "%s", "FT8606"); + if (ucIcCode == IC_FT8716) + sprintf(strIcName, "%s", "FT8716"); + + if (ucIcCode == IC_FT3C47U) + sprintf(strIcName, "%s", "FT3C47U"); + + if (ucIcCode == IC_FT8607) + sprintf(strIcName, "%s", "FT8607"); + if (ucIcCode == IC_FT8707) + sprintf(strIcName, "%s", "FT8707"); + if (ucIcCode == IC_FT8736) + sprintf(strIcName, "%s", "FT8736"); + + if (ucIcCode == IC_FT3D47) + sprintf(strIcName, "%s", "FT3D47"); + + if (ucIcCode == IC_FTE716) + sprintf(strIcName, "%s", "FTE716"); + + if (ucIcCode == IC_FT5442) + sprintf(strIcName, "%s", "FT5442"); + + if (ucIcCode == IC_FT3428U) + sprintf(strIcName, "%s", "FT3428U"); + + if (ucIcCode == IC_FT8006M) + sprintf(strIcName, "%s", "FT8006M"); + + if (ucIcCode == IC_FT8201) + sprintf(strIcName, "%s", "FT8201"); + + if (ucIcCode == IC_FTE736) + sprintf(strIcName, "%s", "FTE736"); + + + + return ; +} + + +unsigned int ft8006m_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2) +{ + unsigned int ic_code = 0; + switch (chip_id) { + case 0x55: + ic_code = IC_FT5306; + break; + case 0x08: + ic_code = IC_FT5606; + break; + case 0x0a: + ic_code = IC_FT5X16; + break; + case 0x06: + ic_code = IC_FT6X06; + break; + case 0x36: + ic_code = IC_FT6X36; + break; + case 0x14: + ic_code = IC_FT5X36; + break; + case 0x13: + ic_code = IC_FT3X16; + break; + case 0x12: + ic_code = IC_FT5X36i; + break; + case 0x11: + ic_code = IC_FT5X36i; + break; + case 0x54: + ic_code = IC_FT5X46; + break; + case 0x58: + ic_code = IC_FT5822; + break; + + + case 0x86: + if (0x06 == chip_id2) + ic_code = IC_FT8606; + else if (0x07 == chip_id2) + ic_code = IC_FT8607; + break; + case 0x87: + if (0x07 == chip_id2) + ic_code = IC_FT8707; + else if (0x16 == chip_id2) + ic_code = IC_FT8716; + else if (0x36 == chip_id2) + ic_code = IC_FT8736; + break; + case 0xE7: + if (0x16 == chip_id2) + ic_code = IC_FTE716; + else if (0x36 == chip_id2) + ic_code = IC_FTE736; + break; + default: + ic_code = 0; + break; + } + return ic_code; +} + +unsigned int ft8006m_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2) +{ + unsigned char uc_chip_id = 0; + unsigned char uc_chip_id2 = 0; + switch (ic_code>>4) { + case (IC_FT5306>>4): + uc_chip_id = 0x55; + break; + case (IC_FT5606>>4): + uc_chip_id = 0x08; + break; + case (IC_FT5X16>>4): + uc_chip_id = 0x0a; + break; + case (IC_FT6X06>>4): + uc_chip_id = 0x06; + break; + case (IC_FT6X36>>4): + uc_chip_id = 0x36; + break; + case (IC_FT5X36>>4): + switch (ic_code) { + case (IC_FT5X36): + uc_chip_id = 0x14; + break; + case (IC_FT3X26): + uc_chip_id = 0x13; + break; + case (IC_FT3X16): + uc_chip_id = 0x12; + break; + case (IC_FT5X36i): + uc_chip_id = 0x11; + break; + } + break; + case (IC_FT5X46>>4): + uc_chip_id = 0x54; + break; + case (IC_FT5822>>4): + uc_chip_id = 0x58; + break; + + + case (IC_FT8606>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x06; + break; + case (IC_FT8607>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x07; + break; + case (IC_FT8707>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x07; + break; + case (IC_FT8716>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x16; + break; + case (IC_FT8736>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x36; + break; + case (IC_FTE716>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x16; + break; + case (IC_FTE736>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x36; + break; + + default: + uc_chip_id = 0; + break; + + } + + *chip_id = uc_chip_id; + *chip_id2 = uc_chip_id2; + + return 0; +} +int ft8006m_ic_table_need_chip_id2(unsigned int chip_id) +{ + int b_need_id2 = -1; + switch (chip_id) { + case 0x86: + case 0x87: + case 0xE7: + b_need_id2 = 0; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + default: + b_need_id2 = -1; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + } + return b_need_id2; +} diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test.c new file mode 100755 index 0000000000000..36624ade2a094 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test.c @@ -0,0 +1,812 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/************************************************************************ +* +* File Name: focaltech_test.c +* +* Author: Software Department, FocalTech +* +* Created: 2016-08-01 +* +* Modify: +* +* Abstract: create char device and proc node for the comm between APK and TP +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include +#include +#include +#include +#include + +#include +#include + +#include "../../focaltech_core.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_test_ini.h" + +#include +#include +#define CTP_PARENT_PROC_NAME "touchscreen" +#define CTP_OPEN_PROC_NAME "ctp_openshort_test" + +#if FTS_LOCK_DOWN_INFO +static char tp_lockdown_info[128]; +#define FTS_PROC_LOCKDOWN_FILE "lockdown_info" +static int fts_lockdown_proc_show(struct seq_file *file, void *data) +{ + char temp[40] = {0}; + + sprintf(temp, "%s\n", tp_lockdown_info); + seq_printf(file, "%s\n", temp); + + return 0; +} + +static int fts_lockdown_proc_open (struct inode *inode, struct file *file) +{ + return single_open(file, fts_lockdown_proc_show, inode->i_private); +} + +static const struct file_operations fts_lockdown_proc_fops = { + .open = fts_lockdown_proc_open, + .read = seq_read, +}; + +#endif + +#if FTS_CAT_RAWDATA +#define FTS_PROC_RAWDATA "rawdata" +static u8 g_isdiff = 1; +/************************************************************************ +* Name: StartScan(Same function name as FT_MultipleTest) +* Brief: Scan TP, do it before read Raw Data +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static int StartScan(struct i2c_client *client) +{ + u8 RegVal = 0x00; + u8 times = 0; + const u8 MaxTimes = 20; + u8 ReCode = -1; + + ReCode = ft8006m_i2c_write_reg(client, 0x00, 0xC0); + if (ReCode >= 0) { + while (times++ < MaxTimes) { + msleep(8); + ReCode = ft8006m_i2c_read_reg(client, 0x00, &RegVal); + if (RegVal == 0x40) + break; + } + + if (times > MaxTimes) + return -EPERM; + } + return ReCode; +} + +int ft8006m_read_rawdata(struct i2c_client *client, int is_diff, s16 *data, int len) +{ + u8 reg = 0x6A; + u8 regdata[1280] = { 0 }; + int remain_bytes; + int pos = 0; + int i = 0; + + FTS_DEBUG("len=%d, is_diff=%d", len, is_diff); + ft8006m_i2c_write_reg(client, 0x06, is_diff); + + if (StartScan(client) < 0) + return -EPERM; + + ft8006m_i2c_write_reg(client, 0x01, 0xAD); + + if (len <= 256) + ft8006m_i2c_read(client, ®, 1, regdata, len); + else { + ft8006m_i2c_read(client, ®, 1, regdata, 256); + remain_bytes = len - 256; + for (i = 1; remain_bytes > 0; i++) { + if (remain_bytes > 256) + ft8006m_i2c_read(client, ®, 0, regdata + i * 256, 256); + else + ft8006m_i2c_read(client, ®, 0, regdata + i * 256, remain_bytes); + remain_bytes -= 256; + } + } + + for (i = 0; i < len;) { + data[pos++] = ((s16)(regdata[i]) << 8) + regdata[i+1]; + i += 2; + } + return 0; +} + +int ft8006m_get_rawdata(struct i2c_client *client, s16 *data, u8 *txlen, u8 *rxlen) +{ + u8 val; + int i; + + /* 0xEE = 1, not clb */ + ft8006m_i2c_write_reg(client, 0xEE, 1); + + /* Enter Factory Mode */ + ft8006m_i2c_write_reg(client, 0x00, 0x40); + do { + ft8006m_i2c_read_reg(client, 0x00, &val); + if (val == 0x40) + break; + msleep(1); + } while (i < 10); + + /* Get Tx/Rx Num */ + ft8006m_i2c_read_reg(client, 0x02, txlen); + ft8006m_i2c_read_reg(client, 0x03, rxlen); + + /* read_rawdata */ + ft8006m_read_rawdata(client, g_isdiff, data, (*txlen) * (*rxlen) * 2); + + /* Enter in work mode */ + ft8006m_i2c_write_reg(client, 0x00, 0x00); + do { + ft8006m_i2c_read_reg(client, 0x00, &val); + if (val == 0x00) + break; + msleep(1); + } while (i < 10); + + return 0; +} + +static char temp_8006m[PAGE_SIZE] = {0}; + +static int fts_rawdata_proc_show(struct seq_file *file, void *buf) +{ + int count; + int i = 0, j = 0; + u8 val; + s16 data[600] = { 0 }; + u8 txlen = 0; + u8 rxlen = 0; + struct i2c_client *client = ft8006m_i2c_client; + + if (ft8006m_wq_data->suspended) { + FTS_INFO("Already in suspend state"); + return -EPERM; + } + mutex_lock(&ft8006m_input_dev->mutex); + + ft8006m_get_rawdata(client, data, &txlen, &rxlen); + + ft8006m_i2c_read_reg(client, 0xEE, &val); + count = snprintf(temp_8006m, PAGE_SIZE, "0xEE = %d\n", val); + count += snprintf(temp_8006m + count, PAGE_SIZE-count, "%s :\n", g_isdiff ? "DIFF DATA" : "RAWDATA"); + for (i = 0; i < txlen; i++) { + for (j = 0; j < rxlen; j++) { + count += snprintf(temp_8006m + count, PAGE_SIZE-count, "%5d ", data[i*rxlen + j]); + } + count += snprintf(temp_8006m + count, PAGE_SIZE-count, "\n"); + } + count += snprintf(temp_8006m + count, PAGE_SIZE-count, "\n\n"); + seq_printf(file, "%s\n", temp_8006m); + memset(temp_8006m, 0, PAGE_SIZE); + mutex_unlock(&ft8006m_input_dev->mutex); + + return 0; +} + +static int fts_rawdata_proc_open (struct inode *inode, struct file *file) +{ + return single_open(file, fts_rawdata_proc_show, inode->i_private); +} + +static ssize_t fts_rawdata_proc_store(struct file *file, const char __user *buf, size_t count, loff_t *len) +{ + unsigned long val; + int ret; + char *buff[5] = {0}; + if (ft8006m_wq_data->suspended) { + FTS_INFO("Already in suspend state"); + return -EPERM; + } + ret = copy_from_user(buff, buf, 5); + mutex_lock(&ft8006m_input_dev->mutex); + val = simple_strtoul((char *)buff, NULL, 10); + if (val) + g_isdiff = 1; + else + g_isdiff = 0; + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +static const struct file_operations fts_rawdata_proc_fops = { + .open = fts_rawdata_proc_open, + .read = seq_read, + .write = fts_rawdata_proc_store, +}; +#endif +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); +static const struct file_operations ctp_open_procs_fops = { + .write = ctp_open_proc_write, + .read = ctp_open_proc_read, + .owner = THIS_MODULE, +}; +static struct proc_dir_entry *ctp_device_proc; +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define IC_TEST_VERSION "Test version: V1.0.0--2016-12-28, (sync version of FT_MultipleTest: V4.0.0.0 ------ 2016-07-18)" + + +#define FTS_INI_FILE_PATH "/etc/" + +#define FTS_SAVE_DATA_FILE_PATH "/mnt/sdcard/" + + +#define FTS_TEST_BUFFER_SIZE 80*1024 +#define FTS_TEST_PRINT_SIZE 128 +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static int fts_test_get_ini_size(char *config_name); +static int fts_test_read_ini_data(char *config_name, char *config_buf); +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen); +static int fts_test_get_testparam_from_ini(char *config_name); +static int fts_test_entry(char *ini_file_name); + +static int fts_test_i2c_read(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen); +static int fts_test_i2c_write(unsigned char *writebuf, int writelen); + + +/***************************************************************************** +* functions body +*****************************************************************************/ +static int fts_test_i2c_read(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen) +{ + int iret = -1; +#if 1 + iret = ft8006m_i2c_read(ft8006m_i2c_client, writebuf, writelen, readbuf, readlen); +#else + iret = ft8006m_i2c_read(writebuf, writelen, readbuf, readlen); +#endif + + return iret; + +} + +static int fts_test_i2c_write(unsigned char *writebuf, int writelen) +{ + int iret = -1; +#if 1 + iret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf, writelen); +#else + iret = ft8006m_i2c_write(writebuf, writelen); +#endif + + return iret; +} + + +static int fts_test_get_ini_size(char *config_name) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + filp_close(pfile, NULL); + + FTS_TEST_FUNC_ENTER(); + + return fsize; +} + + +static int fts_test_read_ini_data(char *config_name, char *config_buf) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + loff_t pos = 0; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, config_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen) +{ + struct file *pfile = NULL; + + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_SAVE_DATA_FILE_PATH, file_name); + if (NULL == pfile) { + + pfile = filp_open(filepath, O_TRUNC|O_CREAT|O_RDWR, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_write(pfile, data_buf, iLen, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_get_testparam_from_ini(char *config_name) +{ + char *pcfiledata = NULL; + int ret = 0; + int inisize = 0; + + FTS_TEST_FUNC_ENTER(); + + inisize = fts_test_get_ini_size(config_name); + FTS_TEST_DBG("ini_size = %d ", inisize); + if (inisize <= 0) { + FTS_TEST_ERROR("%s ERROR:Get firmware size failed", __func__); + return -EIO; + } + + pcfiledata = Ft8006m_fts_malloc(inisize + 1); + if (NULL == pcfiledata) { + FTS_TEST_ERROR("Ft8006m_fts_malloc failed in function:%s", __func__); + return -EPERM; + } + + memset(pcfiledata, 0, inisize + 1); + + if (fts_test_read_ini_data(config_name, pcfiledata)) { + FTS_TEST_ERROR(" - ERROR: fts_test_read_ini_data failed"); + Ft8006m_fts_free(pcfiledata); + pcfiledata = NULL; + + return -EIO; + } else { + FTS_TEST_DBG("fts_test_read_ini_data successful"); + } + + ret = ft8006m_set_param_data(pcfiledata); + + Ft8006m_fts_free(pcfiledata); + pcfiledata = NULL; + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} + +static int fts_test_entry(char *ini_file_name) +{ + /* place holder for future use */ + char cfgname[128]; + char *testdata = NULL; + char *printdata = NULL; + int iTestDataLen = 0; + int ret = 0; + int icycle = 0, i = 0; + int print_index = 0; + + + FTS_TEST_FUNC_ENTER(); + FTS_TEST_DBG("ini_file_name:%s.", ini_file_name); + /*Used to obtain the test data stored in the library, pay attention to the size of the distribution space.*/ + FTS_TEST_DBG("Allocate memory, size: %d", FTS_TEST_BUFFER_SIZE); + testdata = Ft8006m_fts_malloc(FTS_TEST_BUFFER_SIZE); + if (NULL == testdata) { + FTS_TEST_ERROR("Ft8006m_fts_malloc failed in function:%s", __func__); + return -EPERM; + } + printdata = Ft8006m_fts_malloc(FTS_TEST_PRINT_SIZE); + if (NULL == printdata) { + FTS_TEST_ERROR("Ft8006m_fts_malloc failed in function:%s", __func__); + return -EPERM; + } + /*Initialize the platform related I2C read and write functions*/ + +#if 0 + ft8006m_init_i2c_write_func(ft8006m_i2c_write); + ft8006m_init_i2c_read_func(ft8006m_i2c_read); +#else + ft8006m_init_i2c_write_func(fts_test_i2c_write); + ft8006m_init_i2c_read_func(fts_test_i2c_read); +#endif + + /*Initialize pointer memory*/ + ret = ft8006m_focaltech_test_main_init(); + if (ret < 0) { + FTS_TEST_ERROR("ft8006m_focaltech_test_main_init() error."); + goto TEST_ERR; + } + + /*Read parse configuration file*/ + memset(cfgname, 0, sizeof(cfgname)); + sprintf(cfgname, "%s", ini_file_name); + FTS_TEST_DBG("ini_file_name = %s", cfgname); + + ft8006m_test_funcs(); + + if (fts_test_get_testparam_from_ini(cfgname) < 0) { + FTS_TEST_ERROR("get testparam from ini failure"); + goto TEST_ERR; + } + + + if ((ft8006m_g_ScreenSetParam.iSelectedIC >> 4 != FTS_CHIP_TEST_TYPE >> 4)) { + FTS_TEST_ERROR("Select IC and Read IC from INI does not match "); + + } + + + /*Start testing according to the test configuration*/ + if (true == ft8006m_start_test_tp()) { + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "Tp test pass. \n\n"); + FTS_TEST_INFO("tp test pass"); + ret = 0; + } else { + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "Tp test failure. \n\n"); + FTS_TEST_INFO("tp test failure"); + ret = 1; + } + + + /*Gets the number of tests in the test library and saves it*/ + iTestDataLen = m_get_test_data(testdata); + + + icycle = 0; + /*Print test data packets */ + FTS_TEST_DBG("print test data: \n"); + for (i = 0; i < iTestDataLen; i++) { + if (('\0' == testdata[i]) + || (icycle == FTS_TEST_PRINT_SIZE - 2) + || (i == iTestDataLen-1) + ) { + if (icycle == 0) { + print_index++; + } else { + memcpy(printdata, testdata + print_index, icycle); + printdata[FTS_TEST_PRINT_SIZE-1] = '\0'; + FTS_TEST_DBG("%s", printdata); + print_index += icycle; + icycle = 0; + } + } else { + icycle++; + } + } + FTS_TEST_DBG("\n"); + + + + fts_test_save_test_data("testdata.csv", testdata, iTestDataLen); + fts_test_save_test_data("testresult.txt", Ft8006m_TestResult, Ft8006m_TestResultLen); + + + /*Release memory */ + ft8006m_focaltech_test_main_exit(); + + + + if (NULL != testdata) + Ft8006m_fts_free(testdata); + if (NULL != printdata) + Ft8006m_fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return ret; + +TEST_ERR: + if (NULL != testdata) + Ft8006m_fts_free(testdata); + if (NULL != printdata) + Ft8006m_fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return -EPERM; +} + +static int fts_set_ini_name(char *cfgname) +{ + int ret; + u8 vid; + + ret = ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_VENDOR_ID, &vid); + FTS_TEST_DBG("vendor id:0x%x\n", vid); + if (vid == OFILM_VENDOR) { + sprintf(cfgname, "%s", "fts_ofilm.ini"); + } else if (vid == EACHOPTO_VENDOR) { + sprintf(cfgname, "%s", "fts_eachopto.ini"); + } else if (vid == TXD_VENDOR) { + + sprintf(cfgname, "%s", "fts_holitech.ini"); + } else if (vid == BOE_VENDOR) { + sprintf(cfgname, "%s", "fts_boe.ini"); + } else { + pr_err("ctp test not found test config \n"); + } + + return ret; +} + +#if FTS_AUTO_UPGRADE_EN +void ft8006m_waite_for_fw_upgrading(void) +{ + int vid = 0; + if (ft8006m_fw_upgrade_status == FW_UPGRADING) { + for (; ft8006m_fw_upgrade_status == FW_UPGRADING; ) { + if ((vid%4) == 0) + FTS_TEST_DBG("tp firmware upgrading status:%d\n", ft8006m_fw_upgrade_status); + msleep(200); + vid++; + if (vid > 30) { + FTS_TEST_DBG("takes 6s tp still upgrading status:%d\n", ft8006m_fw_upgrade_status); + break; + } + } + } + return; +} +#endif + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + char fwname[128] = {0}; + int ret; + u8 result = 0; + struct i2c_client *client = ft8006m_i2c_client; + + FTS_TEST_FUNC_ENTER(); +#if FTS_AUTO_UPGRADE_EN + ft8006m_waite_for_fw_upgrading(); +#endif + + if (*ppos) { + FTS_TEST_ERROR("tp test again return\n"); + return 0; + } + *ppos += count; + + memset(fwname, 0, sizeof(fwname)); + fts_set_ini_name(fwname); + fwname[strlen(fwname)] = '\0'; + FTS_TEST_DBG("fwname:%s.", fwname); + + mutex_lock(&ft8006m_input_dev->mutex); + + disable_irq(client->irq); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + ft8006m_esdcheck_switch(DISABLE); +#endif + ret = fts_test_entry(fwname); + if (0 != ret) { + result = 0; + FTS_TEST_ERROR("fts open short test fail \n"); + } else { + result = 1; + FTS_TEST_ERROR("fts open short test success \n"); + } +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + ft8006m_esdcheck_switch(ENABLE); +#endif + enable_irq(client->irq); + + mutex_unlock(&ft8006m_input_dev->mutex); + + FTS_TEST_FUNC_EXIT(); + + return sprintf(ptr, "result=%d\n", result); +} + + +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + void ft8006m_create_ctp_proc(void) +{ + + struct proc_dir_entry *ctp_open_proc = NULL; + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return; + } + } + ctp_open_proc = proc_create(CTP_OPEN_PROC_NAME, 0777, ctp_device_proc, &ctp_open_procs_fops); + if (ctp_open_proc == NULL) { + FTS_TEST_ERROR("create open_proc fail\n"); + } +} + +int ft8006m_test_init(struct i2c_client *client) +{ + int err = 0; + + FTS_TEST_FUNC_ENTER(); + + FTS_TEST_INFO("%s\n", IC_TEST_VERSION); + + ft8006m_create_ctp_proc(); + + FTS_TEST_FUNC_EXIT(); + + return err; +} +int ft8006m_test_exit(struct i2c_client *client) +{ + FTS_TEST_FUNC_ENTER(); + + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +#if FTS_LOCK_DOWN_INFO +int ft8006m_lockdown_init(struct i2c_client *client) +{ + int err = 0; + unsigned char auc_i2c_write_buf[10]; + u8 buf[18] = {0}; + struct proc_dir_entry *fts_lockdown_status_proc = NULL; + struct fts_ts_data *data; + data = i2c_get_clientdata(client); + err = ft8006m_i2c_write_reg(client, 0x90, 0x20); + if (err < 0) + FTS_ERROR("[FTS] i2c write 0x90 err\n"); + + msleep(5); + auc_i2c_write_buf[0] = 0x99; + err = ft8006m_i2c_read(client, auc_i2c_write_buf, 1, buf, 16); + if (err < 0) + FTS_ERROR("[FTS] i2c read 0x99 err\n"); + + sprintf(tp_lockdown_info, "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", \ + buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], + buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]); + FTS_INFO("tpd_probe, ft8006m_ctpm_LockDownInfo_get_from_boot, tp_lockdown_info=%s\n", tp_lockdown_info); + memset(data->lockdown_info, 0, 128); + strncpy(data->lockdown_info, tp_lockdown_info, 16); + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return 1; + } + } + fts_lockdown_status_proc = proc_create(FTS_PROC_LOCKDOWN_FILE, 0644, ctp_device_proc, &fts_lockdown_proc_fops); + if (fts_lockdown_status_proc == NULL) { + FTS_ERROR("fts, create_proc_entry ctp_lockdown_status_proc failed\n"); + return 1; + } + return 0 ; +} +#endif + +#if FTS_CAT_RAWDATA +int ft8006m_rawdata_init(struct i2c_client *client) +{ + + struct proc_dir_entry *fts_rawdata_status_proc = NULL; + + + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return 1; + } + } + fts_rawdata_status_proc = proc_create(FTS_PROC_RAWDATA, 0777, ctp_device_proc, &fts_rawdata_proc_fops); + if (fts_rawdata_status_proc == NULL) { + FTS_ERROR("fts, create_proc_entry ctp_lockdown_status_proc failed\n"); + return 1; + } + return 0 ; +} +#endif + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_detail_threshold.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_detail_threshold.c new file mode 100755 index 0000000000000..aa39ff78c1244 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_detail_threshold.c @@ -0,0 +1,1812 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_ic_table.h" + + +struct stCfg_MCap_DetailThreshold ft8006m_g_stCfg_MCap_DetailThreshold; +struct stCfg_SCap_DetailThreshold ft8006m_g_stCfg_SCap_DetailThreshold; +struct stCfg_Incell_DetailThreshold ft8006m_g_stCfg_Incell_DetailThreshold; + +void ft8006m_set_max_channel_num(void) +{ + + FTS_TEST_FUNC_ENTER(); + switch (ft8006m_g_ScreenSetParam.iSelectedIC>>4) { + case IC_FT5822>>4: + case IC_FT8006M>>4: + case IC_FTE716>>4: + case IC_FT3D47>>4: + ft8006m_g_ScreenSetParam.iUsedMaxTxNum = TX_NUM_MAX; + ft8006m_g_ScreenSetParam.iUsedMaxRxNum = RX_NUM_MAX; + break; + default: + ft8006m_g_ScreenSetParam.iUsedMaxTxNum = 30; + ft8006m_g_ScreenSetParam.iUsedMaxRxNum = 30; + break; + } + + FTS_TEST_DBG("MaxTxNum = %d, MaxRxNum = %d. ", ft8006m_g_ScreenSetParam.iUsedMaxTxNum, ft8006m_g_ScreenSetParam.iUsedMaxRxNum); + + FTS_TEST_FUNC_EXIT(); + +} + +int ft8006m_malloc_struct_DetailThreshold(void) +{ + FTS_TEST_FUNC_ENTER(); + + + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC = (unsigned char (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max = (short (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min = (short (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max = (short (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min = (short (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) + goto ERR; + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) + goto ERR; + + + + ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode) { + FTS_TEST_DBG("InvalidNode. \n"); + goto ERR; + } + + + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + FTS_TEST_DBG("RawDataTest_Min. \n"); + goto ERR; + } + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + FTS_TEST_DBG("RawDataTest_Max. \n"); + goto ERR; + } + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min) { + FTS_TEST_DBG("CBTest_Min. \n"); + goto ERR; + } + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max) { + FTS_TEST_DBG("CBTest_Max. \n"); + goto ERR; + } + + ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHY_Linearity. \n"); + goto ERR; + } + ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHX_Linearity. \n"); + goto ERR; + } + + FTS_TEST_FUNC_EXIT(); + + return 0; + +ERR: + FTS_TEST_ERROR("Ft8006m_fts_malloc memory failed in function."); + return -EPERM; +} + +void ft8006m_free_struct_DetailThreshold(void) +{ + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode); + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode = NULL; + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC); + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC = NULL; + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient); + ft8006m_g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = NULL; + } + + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max); + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = NULL; + } + + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min); + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode); + ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min); + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min); + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max); + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity); + ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity); + ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = NULL; + } + + + +} + +void Ft8006m_OnInit_SCap_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + Ft8006m_OnGetTestItemParam("RawDataTest_Max", strIniFile, 12500); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.RawDataTest_Max, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("RawDataTest_Min", strIniFile, 16500); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.RawDataTest_Min, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("CiTest_Max", strIniFile, 5); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CiTest_Max, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("CiTest_Min", strIniFile, 250); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CiTest_Min, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("DeltaCiTest_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCiTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("DeltaCiTest_AnotherBase1", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase1, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("DeltaCiTest_AnotherBase2", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase2, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("NoiseTest_Max", strIniFile, 20); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.NoiseTest_Max, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("CiDeviation_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CiDeviationTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("DeltaCxTest_Sort", strIniFile, 1); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCxTest_Sort, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("DeltaCxTest_Area", strIniFile, 1); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCxTest_Area, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + + Ft8006m_OnGetTestItemParam("CbTest_Max", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CbTest_Max, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + Ft8006m_OnGetTestItemParam("CbTest_Min", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CbTest_Min, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + Ft8006m_OnGetTestItemParam("DeltaCbTest_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCbTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + Ft8006m_OnGetTestItemParam("DifferTest_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DifferTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + Ft8006m_OnGetTestItemParam("CBDeviation_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CBDeviationTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + Ft8006m_OnGetTestItemParam("K1DifferTest_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.K1DifferTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue) +{ + + char strValue[800]; + char str_tmp[128]; + int iValue = 0; + int dividerPos = 0; + int index = 0; + int i = 0, j = 0, k = 0; + memset(ft8006m_g_stCfg_SCap_DetailThreshold.TempData, 0, sizeof(ft8006m_g_stCfg_SCap_DetailThreshold.TempData)); + sprintf(str_tmp, "%d", iDefautValue); + Ft8006m_GetPrivateProfileString("Basic_Threshold", strItemName, str_tmp, strValue, strIniFile); + iValue = ft8006m_atoi(strValue); + for (i = 0; i < MAX_CHANNEL_NUM; i++) { + ft8006m_g_stCfg_SCap_DetailThreshold.TempData[i] = iValue; + } + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", strItemName, "", strValue, strIniFile); + if (dividerPos > 0) { + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_SCap_DetailThreshold.TempData[k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } +} + +void Ft8006m_OnInit_MCap_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + ft8006m_set_max_channel_num(); + + Ft8006m_OnInit_InvalidNode(strIniFile); + Ft8006m_OnInit_DThreshold_RawDataTest(strIniFile); + Ft8006m_OnInit_DThreshold_SCapRawDataTest(strIniFile); + Ft8006m_OnInit_DThreshold_SCapCbTest(strIniFile); + + Ft8006m_OnInit_DThreshold_ForceTouch_SCapRawDataTest(strIniFile); + Ft8006m_OnInit_DThreshold_ForceTouch_SCapCbTest(strIniFile); + + Ft8006m_OnInit_DThreshold_RxLinearityTest(strIniFile); + Ft8006m_OnInit_DThreshold_TxLinearityTest(strIniFile); + + Ft8006m_OnInit_DThreshold_PanelDifferTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} +void Ft8006m_OnInit_InvalidNode(char *strIniFile) +{ + + char str[MAX_PATH] = {0}, strTemp[MAX_PATH] = {0}; + int i = 0, j = 0; + + + + FTS_TEST_FUNC_ENTER(); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + sprintf(strTemp, "InvalidNode[%d][%d]", (i+1), (j+1)); + + Ft8006m_GetPrivateProfileString("INVALID_NODE", strTemp, "1", str, strIniFile); + if (ft8006m_atoi(str) == 0) { + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 0; + ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 0; + FTS_TEST_DBG("node (%d, %d) \n", (i+1), (j+1)); + + } else if (ft8006m_atoi(str) == 2) { + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 2; + ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 2; + } else { + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 1; + ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 1; + } + + + + + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + sprintf(strTemp, "InvalidNodeS[%d][%d]", (i+1), (j+1)); + Ft8006m_GetPrivateProfileString("INVALID_NODES", strTemp, "1", str, strIniFile); + if (ft8006m_atoi(str) == 0) { + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 0; + } else if (ft8006m_atoi(str) == 2) { + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 2; + } else + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 1; + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_RawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if ((ft8006m_g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8716 >> 4) || (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8736 >> 4) || (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 == IC_FTE716 >> 4)) { + return; + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "10000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + + } + } + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "7000", str, strIniFile); + MinValue = ft8006m_atoi(str); + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + } + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Max", "15000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][j] = MaxValue; + } + } + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Low_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Min", "3000", str, strIniFile); + MinValue = ft8006m_atoi(str); + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][j] = MinValue; + } + } + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Low_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Max", "15000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][j] = MaxValue; + } + } + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Min", "3000", str, strIniFile); + MinValue = ft8006m_atoi(str); + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][j] = MinValue; + } + } + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_High_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_High_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_PanelDifferTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + int index = 0; + int k = 0, i = 0, j = 0; + char str_tmp[128]; + + FTS_TEST_FUNC_ENTER(); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Max", "1000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Max_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Min", "150", str, strIniFile); + MinValue = ft8006m_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Min_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); + +} + + + +void Ft8006m_OnInit_DThreshold_RxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RxLinearityTest_Max", "50", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Rx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_TxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "TxLinearityTest_Max", "50", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Tx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + FTS_TEST_DBG("%s\r", strTemp); + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_Incell_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + ft8006m_set_max_channel_num(); + + Ft8006m_OnInit_InvalidNode(strIniFile); + + Ft8006m_OnInit_DThreshold_RawDataTest(strIniFile); + Ft8006m_OnInit_DThreshold_CBTest(strIniFile); + Ft8006m_OnInit_DThreshold_AllButtonCBTest(strIniFile); + Ft8006m_OnThreshold_VkAndVaRawDataSeparateTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_CBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + if (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8606 >> 4) { + return; + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, strIniFile); + MaxValue_Vkey = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = ft8006m_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, strIniFile); + MinValue_Vkey = ft8006m_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + + +void Ft8006m_OnInit_DThreshold_AllButtonCBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8606 >> 4) { + return; + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = ft8006m_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + + +void Ft8006m_OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + + FTS_TEST_FUNC_ENTER(); + + if ((ft8006m_g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8716 >> 4) && (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8736 >> 4) && (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 != IC_FTE716 >> 4)) { + return; + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max_VKey", "11000", str, strIniFile); + MaxValue_Vkey = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = ft8006m_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, strIniFile); + MinValue = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min_VKey", "5000", str, strIniFile); + MinValue_Vkey = ft8006m_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + FTS_TEST_FUNC_EXIT(); +} + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_global.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_global.c new file mode 100755 index 0000000000000..3cf03de031621 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_global.c @@ -0,0 +1,498 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_global.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_ic_table.h" + +#define DEVIDE_MODE_ADDR 0x00 + +/*buff length*/ +#define BUFF_LEN_STORE_MSG_AREA 1024*10 +#define BUFF_LEN_MSG_AREA_LINE2 1024*4 +#define BUFF_LEN_STORE_DATA_AREA 1024*80 +#define BUFF_LEN_TMP_BUFFER 1024*16 + + +char *ft8006m_g_pTmpBuff = NULL; +char *ft8006m_g_pStoreMsgArea = NULL; +int ft8006m_g_lenStoreMsgArea = 0; +char *ft8006m_g_pMsgAreaLine2 = NULL; +int ft8006m_g_lenMsgAreaLine2 = 0; +char *ft8006m_g_pStoreDataArea = NULL; +int ft8006m_g_lenStoreDataArea = 0; +unsigned char ft8006m_m_ucTestItemCode = 0; +int ft8006m_m_iStartLine = 0; +int ft8006m_m_iTestDataCount = 0; + +char *Ft8006m_TestResult = NULL; +int Ft8006m_TestResultLen = 0; + +#define FTS_MALLOC_TYPE 1 +enum enum_malloc_mode { + kmalloc_mode = 0, + vmalloc_mode = 1, +}; + +struct StruScreenSeting ft8006m_g_ScreenSetParam; +struct stTestItem ft8006m_g_stTestItem[1][MAX_TEST_ITEM]; +struct structSCapConfEx ft8006m_g_stSCapConfEx; + +int ft8006m_g_TestItemNum = 0; +char ft8006m_g_strIcName[20] = {0}; +char *ft8006m_g_pStoreAllData = NULL; + +int Ft8006m_GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile) +{ + char value[512] = {0}; + int len = 0; + + if (NULL == returnValue) { + FTS_TEST_DBG("[FTS] returnValue==NULL in function %s.", __func__); + return 0; + } + + if (ft8006m_ini_get_key(IniFile, section, ItemName, value) < 0) { + if (NULL != defaultvalue) + memcpy(value, defaultvalue, strlen(defaultvalue)); + sprintf(returnValue, "%s", value); + return 0; + } else { + len = sprintf(returnValue, "%s", value); + } + + return len; +} + +void ft8006m_focal_msleep(int ms) +{ + msleep(ms); +} + +void Ft8006m_SysDelay(int ms) +{ + msleep(ms); +} + +int ft8006m_focal_abs(int value) +{ + if (value < 0) + value = 0 - value; + + return value; +} + +void *Ft8006m_fts_malloc(size_t size) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kmalloc(size, GFP_ATOMIC); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vmalloc(size); + } else { + FTS_TEST_DBG("invalid malloc. \n"); + return NULL; + } + + return NULL; +} + +void Ft8006m_fts_free(void *p) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kfree(p); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vfree(p); + } else { + FTS_TEST_DBG("invalid free. \n"); + return ; + } + + return ; +} + +void Ft8006m_OnInit_InterfaceCfg(char *strIniFile) +{ + char str[128] = {0}; + + FTS_TEST_FUNC_ENTER(); + + Ft8006m_GetPrivateProfileString("Interface", "IC_Type", "FT5X36", str, strIniFile); + ft8006m_g_ScreenSetParam.iSelectedIC = ft8006m_ic_table_get_ic_code_from_ic_name(str); + FTS_TEST_INFO(" IC code :0x%02x. ", ft8006m_g_ScreenSetParam.iSelectedIC); + + + Ft8006m_GetPrivateProfileString("Interface", "Normalize_Type", 0, str, strIniFile); + ft8006m_g_ScreenSetParam.isNormalize = ft8006m_atoi(str); + + FTS_TEST_FUNC_EXIT(); + +} +/************************************************************************ +* Name: Ft8006m_ReadReg(Same function name as FT_MultipleTest) +* Brief: Read Register +* Input: RegAddr +* Output: RegData +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int Ft8006m_ReadReg(unsigned char RegAddr, unsigned char *RegData) +{ + int iRet; + + if (NULL == ft8006m_i2c_read_test) { + FTS_TEST_DBG("[focal] %s ft8006m_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + iRet = ft8006m_i2c_read_test(&RegAddr, 1, RegData, 1); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} + +/************************************************************************ +* Name: Ft8006m_WriteReg(Same function name as FT_MultipleTest) +* Brief: Write Register +* Input: RegAddr, RegData +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int Ft8006m_WriteReg(unsigned char RegAddr, unsigned char RegData) +{ + int iRet; + unsigned char cmd[2] = {0}; + + if (NULL == ft8006m_i2c_write_test) { + FTS_TEST_DBG("[focal] %s ft8006m_i2c_write_test == NULL !!!", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + cmd[0] = RegAddr; + cmd[1] = RegData; + iRet = ft8006m_i2c_write_test(cmd, 2); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: Ft8006m_Comm_Base_IIC_IO(Same function name as FT_MultipleTest) +* Brief: Write/Read Data by IIC +* Input: pWriteBuffer, iBytesToWrite, iBytesToRead +* Output: pReadBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char Ft8006m_Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead) +{ + int iRet; + + if (NULL == ft8006m_i2c_read_test) { + FTS_TEST_DBG("[focal] %s ft8006m_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + if (iBytesToRead > 0) { + iRet = ft8006m_i2c_read_test(pWriteBuffer, iBytesToWrite, pReadBuffer, iBytesToRead); + } else { + iRet = ft8006m_i2c_write_test(pWriteBuffer, iBytesToWrite); + } + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: Ft8006m_EnterWork(Same function name as FT_MultipleTest) +* Brief: Enter Work Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char Ft8006m_EnterWork(void) +{ + unsigned char RunState = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = Ft8006m_WriteReg(DEVIDE_MODE_ADDR, 0); + if (ReCode == ERROR_CODE_OK) { + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } else + FTS_TEST_ERROR("Ft8006m_EnterWork read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("Ft8006m_EnterWork write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("Ft8006m_EnterWork read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} +/************************************************************************ +* Name: Ft8006m_EnterFactory +* Brief: enter Fcatory Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0 is OK, else fail. +***********************************************************************/ +unsigned char Ft8006m_EnterFactory(void) +{ + unsigned char RunState = 0; + int index = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = Ft8006m_WriteReg(DEVIDE_MODE_ADDR, 0x40); + if (ReCode == ERROR_CODE_OK) { + for (index = 0; index < 20; ++index) { + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + break; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } + Ft8006m_SysDelay(50); + } + if (ReCode != ERROR_CODE_OK) + FTS_TEST_ERROR("Ft8006m_EnterFactory read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("Ft8006m_EnterFactory write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("Ft8006m_EnterFactory read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + return ReCode; +} + +/************************************************************************ +* Name: ft8006m_SetTestItemCodeName +* Brief: set test item code and name +* Input: null +* Output: null +* Return: +**********************************************************************/ + +void ft8006m_SetTestItemCodeName(unsigned char ucitemcode) +{ + ft8006m_g_stTestItem[0][ft8006m_g_TestItemNum].ItemCode = ucitemcode; + + ft8006m_g_stTestItem[0][ft8006m_g_TestItemNum].TestNum = ft8006m_g_TestItemNum; + ft8006m_g_stTestItem[0][ft8006m_g_TestItemNum].TestResult = RESULT_NULL; + ft8006m_g_TestItemNum++; +} + +/************************************************************************ +* Name: Ft8006m_InitTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int Ft8006m_InitTest(void) +{ + int ret = 0; + ret = Ft8006m_AllocateMemory(); + if (ret < 0) + return -EPERM; + + Ft8006m_InitStoreParamOfTestData(); + + ft8006m_g_stSCapConfEx.ChannelXNum = 0; + ft8006m_g_stSCapConfEx.ChannelYNum = 0; + ft8006m_g_stSCapConfEx.KeyNum = 0; + ft8006m_g_stSCapConfEx.KeyNumTotal = 6; + + return 0; + +} + +/************************************************************************ +* Name: Ft8006m_FinishTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void Ft8006m_FinishTest(void) +{ + Ft8006m_MergeAllTestData(); + Ft8006m_FreeMemory(); +} + + +/************************************************************************ +* Name: Ft8006m_InitStoreParamOfTestData +* Brief: Init store param of test data +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void Ft8006m_InitStoreParamOfTestData(void) +{ + ft8006m_g_lenStoreMsgArea = 0; + + ft8006m_g_lenStoreMsgArea += sprintf(ft8006m_g_pStoreMsgArea, "ECC, 85, 170, IC Name, %s, IC Code, %x\n", ft8006m_g_strIcName, ft8006m_g_ScreenSetParam.iSelectedIC); + + + + ft8006m_g_lenMsgAreaLine2 = 0; + + + + ft8006m_g_lenStoreDataArea = 0; + ft8006m_m_iStartLine = 11; + + ft8006m_m_iTestDataCount = 0; +} +/************************************************************************ +* Name: Ft8006m_MergeAllTestData +* Brief: Merge All Data of test result +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void Ft8006m_MergeAllTestData(void) +{ + int iLen = 0; + + + iLen = sprintf(ft8006m_g_pTmpBuff, "TestItem, %d, ", ft8006m_m_iTestDataCount); + memcpy(ft8006m_g_pStoreMsgArea+ft8006m_g_lenStoreMsgArea, ft8006m_g_pTmpBuff, iLen); + ft8006m_g_lenStoreMsgArea += iLen; + + + memcpy(ft8006m_g_pStoreMsgArea+ft8006m_g_lenStoreMsgArea, ft8006m_g_pMsgAreaLine2, ft8006m_g_lenMsgAreaLine2); + ft8006m_g_lenStoreMsgArea += ft8006m_g_lenMsgAreaLine2; + + + iLen = sprintf(ft8006m_g_pTmpBuff, "\n\n\n\n\n\n\n\n\n"); + memcpy(ft8006m_g_pStoreMsgArea+ft8006m_g_lenStoreMsgArea, ft8006m_g_pTmpBuff, iLen); + ft8006m_g_lenStoreMsgArea += iLen; + + + memcpy(ft8006m_g_pStoreAllData, ft8006m_g_pStoreMsgArea, ft8006m_g_lenStoreMsgArea); + + + if (0 != ft8006m_g_lenStoreDataArea) { + memcpy(ft8006m_g_pStoreAllData+ft8006m_g_lenStoreMsgArea, ft8006m_g_pStoreDataArea, ft8006m_g_lenStoreDataArea); + } + + FTS_TEST_DBG("lenStoreMsgArea=%d, lenStoreDataArea = %d", ft8006m_g_lenStoreMsgArea, ft8006m_g_lenStoreDataArea); +} + + + +/************************************************************************ +* Name: Ft8006m_AllocateMemory +* Brief: Allocate pointer Memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int Ft8006m_AllocateMemory(void) +{ + + ft8006m_g_pStoreMsgArea = NULL; + if (NULL == ft8006m_g_pStoreMsgArea) + ft8006m_g_pStoreMsgArea = Ft8006m_fts_malloc(BUFF_LEN_STORE_MSG_AREA); + if (NULL == ft8006m_g_pStoreMsgArea) + goto ERR; + + ft8006m_g_pMsgAreaLine2 = NULL; + if (NULL == ft8006m_g_pMsgAreaLine2) + ft8006m_g_pMsgAreaLine2 = Ft8006m_fts_malloc(BUFF_LEN_MSG_AREA_LINE2); + if (NULL == ft8006m_g_pMsgAreaLine2) + goto ERR; + + ft8006m_g_pStoreDataArea = NULL; + if (NULL == ft8006m_g_pStoreDataArea) + ft8006m_g_pStoreDataArea = Ft8006m_fts_malloc(BUFF_LEN_STORE_DATA_AREA); + if (NULL == ft8006m_g_pStoreDataArea) + goto ERR; + + ft8006m_g_pTmpBuff = NULL; + if (NULL == ft8006m_g_pTmpBuff) + ft8006m_g_pTmpBuff = Ft8006m_fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == ft8006m_g_pTmpBuff) + goto ERR; + + Ft8006m_TestResult = NULL; + if (NULL == Ft8006m_TestResult) + Ft8006m_TestResult = Ft8006m_fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == Ft8006m_TestResult) + goto ERR; + + return 0; + +ERR: + FTS_TEST_ERROR("Ft8006m_fts_malloc memory failed in function."); + return -EPERM; + +} + +/************************************************************************ +* Name: Ft8006m_FreeMemory +* Brief: Release pointer memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void Ft8006m_FreeMemory(void) +{ + + if (NULL != ft8006m_g_pStoreMsgArea) + Ft8006m_fts_free(ft8006m_g_pStoreMsgArea); + + if (NULL != ft8006m_g_pMsgAreaLine2) + Ft8006m_fts_free(ft8006m_g_pMsgAreaLine2); + + if (NULL != ft8006m_g_pStoreDataArea) + Ft8006m_fts_free(ft8006m_g_pStoreDataArea); + + if (NULL != ft8006m_g_pTmpBuff) + Ft8006m_fts_free(ft8006m_g_pTmpBuff); +} diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_ini.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_ini.c new file mode 100755 index 0000000000000..5e60498f6b3c8 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_ini.c @@ -0,0 +1,433 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_main.h" + + +char FT8006M_CFG_SSL = '['; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char FT8006M_CFG_SSR = ']'; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char FT8006M_CFG_NIS = ':'; /* Separator between name and index */ +char FT8006M_CFG_NTS = '#'; /* annotator */ +char FT8006M_CFG_EQS = '='; /* The equal sign */ + + +ST_INI_FILE_DATA *ft8006m_g_st_ini_file_data = NULL; +int ft8006m_g_used_key_num = 0; + + +static int ini_file_get_line(char *filedata, char *buffer, int maxlen); +static long fts_atol(char *nptr); + + +/* Works only for digits and letters, but small and fast */ +#define TOLOWER(x) ((x) | 0x20) + +int ft8006m_strncmp(const char *cs, const char *ct, size_t count) +{ + unsigned char c1 = 0, c2 = 0; + + while (count) { + c1 = TOLOWER(*cs++); + c2 = TOLOWER(*ct++); + if (c1 != c2) + return c1 < c2 ? -1 : 1; + if (!c1) + break; + count--; + } + return 0; +} + +/************************************************************* +Function: Get the value of key +Input: char * filedata; char * section; char * key +Output: char * value¡¡key +Return: 0 SUCCESS + -1 can not find section + -2 can not find key + -10 File open failed + -12 File read failed + -14 File format error + -22 Out of buffer size +Note: +*************************************************************/ +int ft8006m_ini_get_key(char *filedata, char *section, char *key, char *value) +{ + int i = 0; + int ret = -2; + for (i = 0; i < ft8006m_g_used_key_num; i++) { + if (ft8006m_strncmp(section, ft8006m_g_st_ini_file_data[i].pSectionName, + ft8006m_g_st_ini_file_data[i].iSectionNameLen) != 0) + continue; + + if (strlen(key) == ft8006m_g_st_ini_file_data[i].iKeyNameLen) { + if (ft8006m_strncmp(key, ft8006m_g_st_ini_file_data[i].pKeyName, ft8006m_g_st_ini_file_data[i].iKeyNameLen) == 0) + + { + memcpy(value, ft8006m_g_st_ini_file_data[i].pKeyValue, ft8006m_g_st_ini_file_data[i].iKeyValueLen); + ret = 0; + break; + } + } + } + + return ret; +} + +/************************************************************* +Function: Remove empty character on the right side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ft8006m_ini_str_trim_r(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + for (i = 0; i < len; i++) { + if (buf[i] != ' ') + break; + } + if (i < len) { + strncpy(tmp, (buf+i), (len-i)); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Remove empty character on the left side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ft8006m_ini_str_trim_l(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + + for (i = 0; i < len; i++) { + if (buf[len-i-1] != ' ') + break; + } + if (i < len) { + strncpy(tmp, buf, len-i); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Read a line from file +Input: FILE *fp; int maxlen-- Maximum length of buffer +Output: char *buffer -- A string +Return: >0 Actual read length + -1 End of file + -2 Error reading file +Note: +*************************************************************/ +static int ini_file_get_line(char *filedata, char *buffer, int maxlen) +{ + int i = 0; + int j = 0; + int iRetNum = -1; + char ch1 = '\0'; + + for (i = 0, j = 0; i < maxlen; j++) { + ch1 = filedata[j]; + iRetNum = j+1; + if (ch1 == '\n' || ch1 == '\r') { + ch1 = filedata[j+1]; + if (ch1 == '\n' || ch1 == '\r') { + iRetNum++; + } + + break; + } else if (ch1 == 0x00) { + iRetNum = -1; + break; + } else { + buffer[i++] = ch1; /* ignore carriage return */ + } + } + buffer[i] = '\0'; + + return iRetNum; +} + +int my_ft8006m_atoi(const char *str) +{ + int result = 0; + int signal = 1; /* The default is positive number*/ + if ((*str >= '0' && *str <= '9') || *str == '-' || *str == '+') { + if (*str == '-' || *str == '+') { + if (*str == '-') + signal = -1; /*enter negative number*/ + str++; + } + } else + return 0; + /*start transform*/ + while (*str >= '0' && *str <= '9') + result = result*10 + (*str++ - '0'); + + return signal*result; +} + +int ft8006m_isspace(int x) +{ + if (x == ' ' || x == '\t' || x == '\n' || x == '\f' || x == '\b' || x == '\r') + return 1; + else + return 0; +} + +int ft8006m_isdigit(int x) +{ + if (x <= '9' && x >= '0') + return 1; + else + return 0; + +} + +static long fts_atol(char *nptr) +{ + int c; /* current char */ + long total; /* current total */ + int sign; /* if ''-'', then negative, otherwise positive */ + /* skip whitespace */ + while (ft8006m_isspace((int)(unsigned char)*nptr)) + ++nptr; + c = (int)(unsigned char)*nptr++; + sign = c; /* save sign indication */ + if (c == '-' || c == '+') + c = (int)(unsigned char)*nptr++; /* skip sign */ + total = 0; + while (ft8006m_isdigit(c)) { + total = 10 * total + (c - '0'); /* accumulate digit */ + c = (int)(unsigned char)*nptr++; /* get next char */ + } + if (sign == '-') + return -total; + else + return total; /* return result, negated if necessary */ +} + +int ft8006m_atoi(char *nptr) +{ + return (int)fts_atol(nptr); +} + +int ft8006m_init_key_data(void) +{ + int i = 0; + + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_used_key_num = 0; + + ft8006m_g_st_ini_file_data = NULL; + if (NULL == ft8006m_g_st_ini_file_data) + ft8006m_g_st_ini_file_data = Ft8006m_fts_malloc(sizeof(ST_INI_FILE_DATA)*MAX_KEY_NUM); + if (NULL == ft8006m_g_st_ini_file_data) { + FTS_TEST_ERROR("Ft8006m_fts_malloc failed in function."); + return -EPERM; + } + for (i = 0; i < MAX_KEY_NUM; i++) { + memset(ft8006m_g_st_ini_file_data[i].pSectionName, 0, MAX_KEY_NAME_LEN); + memset(ft8006m_g_st_ini_file_data[i].pKeyName, 0, MAX_KEY_NAME_LEN); + memset(ft8006m_g_st_ini_file_data[i].pKeyValue, 0, MAX_KEY_VALUE_LEN); + ft8006m_g_st_ini_file_data[i].iSectionNameLen = 0; + ft8006m_g_st_ini_file_data[i].iKeyNameLen = 0; + ft8006m_g_st_ini_file_data[i].iKeyValueLen = 0; + } + + FTS_TEST_FUNC_EXIT(); + return 1; +} + +int ft8006m_release_key_data(void) +{ + if (NULL != ft8006m_g_st_ini_file_data) + Ft8006m_fts_free(ft8006m_g_st_ini_file_data); + + return 0; +} +int ft8006m_print_key_data(void) +{ + int i = 0; + + + + FTS_TEST_DBG("ft8006m_g_used_key_num = %d", ft8006m_g_used_key_num); + for (i = 0; i < MAX_KEY_NUM; i++) { + + FTS_TEST_DBG("pSectionName_%d:%s, pKeyName_%d:%s\n,pKeyValue_%d:%s", + i, ft8006m_g_st_ini_file_data[i].pSectionName, + i, ft8006m_g_st_ini_file_data[i].pKeyName, + i, ft8006m_g_st_ini_file_data[i].pKeyValue + ); + + } + + return 1; +} +/************************************************************* +Function: Read all the parameters and values to the structure. +Return: Returns the number of key. If you go wrong, return a negative number. + -10 File open failed + -12 File read failed + -14 File format error +Note: +*************************************************************/ +int ft8006m_ini_get_key_data(char *filedata) +{ + + char buf1[MAX_CFG_BUF + 1] = {0}; + int n = 0; + int ret = 0; + int dataoff = 0; + int iEqualSign = 0; + int i = 0; + char tmpSectionName[MAX_CFG_BUF + 1] = {0}; + + + + FTS_TEST_FUNC_ENTER(); + + ret = ft8006m_init_key_data();/*init*/ + if (ret < 0) { + return -EPERM; + } + + ft8006m_g_used_key_num = 0; + while (1) { /*find section */ + ret = CFG_ERR_READ_FILE; + n = ini_file_get_line(filedata+dataoff, buf1, MAX_CFG_BUF); + + if (n < -1) + goto cfg_scts_end; + if (n < 0) + break;/* file end */ + if (n >= MAX_CFG_BUF) { + FTS_TEST_ERROR("Error Length:%d\n", n); + goto cfg_scts_end; + } + + dataoff += n; + + n = strlen(ft8006m_ini_str_trim_l(ft8006m_ini_str_trim_r(buf1))); + if (n == 0 || buf1[0] == FT8006M_CFG_NTS) + continue; /* A blank line or a comment line */ + ret = CFG_ERR_FILE_FORMAT; + + if (n > 2 && ((buf1[0] == FT8006M_CFG_SSL && buf1[n-1] != FT8006M_CFG_SSR))) { + FTS_TEST_ERROR("Bad Section:%s\n", buf1); + goto cfg_scts_end; + } + + + if (buf1[0] == FT8006M_CFG_SSL) { + ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iSectionNameLen = n-2; + if (MAX_KEY_NAME_LEN < ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iSectionNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + + buf1[n-1] = 0x00; + strcpy((char *)tmpSectionName, buf1+1); + + + continue; + } + + + strcpy(ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].pSectionName, tmpSectionName); + ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iSectionNameLen = strlen(tmpSectionName); + + iEqualSign = 0; + for (i = 0; i < n; i++) { + if (buf1[i] == FT8006M_CFG_EQS) { + iEqualSign = i; + break; + } + } + if (0 == iEqualSign) + continue; + /* before equal sign is assigned to the key name*/ + ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyNameLen = iEqualSign; + if (MAX_KEY_NAME_LEN < ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].pKeyName, + buf1, ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyNameLen); + + /* After equal sign is assigned to the key value*/ + ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyValueLen = n-iEqualSign-1; + if (MAX_KEY_VALUE_LEN < ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyValueLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_VALUE_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].pKeyValue, + buf1 + iEqualSign+1, ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyValueLen); + + + ret = ft8006m_g_used_key_num; + + ft8006m_g_used_key_num++; /*Parameter number accumulation*/ + if (MAX_KEY_NUM < ft8006m_g_used_key_num) { + ret = CFG_ERR_TOO_MANY_KEY_NUM; + FTS_TEST_ERROR("MAX_KEY_NUM: CFG_ERR_TOO_MANY_KEY_NUM\n"); + goto cfg_scts_end; + } + } + + + + FTS_TEST_FUNC_EXIT(); + + return 0; + +cfg_scts_end: + + FTS_TEST_FUNC_EXIT(); + return ret; +} + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_main.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_main.c new file mode 100755 index 0000000000000..33c95453123ed --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_main.c @@ -0,0 +1,253 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#include +#include +#include +#include + +#include "../../focaltech_core.h" +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_ic_table.h" + + +#define FTS_TEST_STORE_DATA_SIZE 80*1024 + + + +FTS_I2C_READ_FUNCTION ft8006m_i2c_read_test; +FTS_I2C_WRITE_FUNCTION ft8006m_i2c_write_test; + +char *ft8006m_g_testparamstring = NULL; + +struct StTestFuncs ft8006m_g_stTestFuncs; + + +int ft8006m_init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read) +{ + unsigned char value = 0; + unsigned char recode = 0; + + FTS_TEST_FUNC_ENTER(); + + ft8006m_i2c_read_test = fpI2C_Read; + if (NULL == ft8006m_i2c_read_test) { + FTS_TEST_DBG("[focal] %s ft8006m_i2c_read_test == NULL ", __func__); + } + + + recode = Ft8006m_ReadReg(0xa6, &value); + if (recode != ERROR_CODE_OK) { + FTS_TEST_ERROR("[focal] Ft8006m_ReadReg Error, code: %d ", recode); + } else { + FTS_TEST_DBG("[focal] Ft8006m_ReadReg successed, Addr: 0xa6, value: 0x%02x ", value); + } + + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +int ft8006m_init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_i2c_write_test = fpI2C_Write; + if (NULL == ft8006m_i2c_write_test) { + FTS_TEST_ERROR("[focal] ft8006m_i2c_read_test == NULL "); + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + + +/************************************************************************ +* Name: ft8006m_set_param_data +* Brief: load Config. Set IC series, init test items, init basic threshold, int detailThreshold, and set order of test items +* Input: TestParamData, from ini file. +* Output: none +* Return: 0. No sense, just according to the old format. +***********************************************************************/ +int ft8006m_set_param_data(char *TestParamData) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + ft8006m_g_testparamstring = TestParamData; + ret = ft8006m_ini_get_key_data(ft8006m_g_testparamstring); + if (ret < 0) { + FTS_TEST_ERROR("ft8006m_ini_get_key_data error."); + return ret; + } + + + + Ft8006m_OnInit_InterfaceCfg(ft8006m_g_testparamstring); + + /*Get IC Name*/ + ft8006m_ic_table_get_ic_name_from_ic_code(ft8006m_g_ScreenSetParam.iSelectedIC, ft8006m_g_strIcName); + + + + if (ft8006m_g_stTestFuncs.OnInit_TestItem) { + ft8006m_g_stTestFuncs.OnInit_TestItem(ft8006m_g_testparamstring); + + } + + if (ft8006m_g_stTestFuncs.OnInit_BasicThreshold) { + ft8006m_g_stTestFuncs.OnInit_BasicThreshold(ft8006m_g_testparamstring); + + + } + + if (IC_Capacitance_Type == Self_Capacitance) { + Ft8006m_OnInit_SCap_DetailThreshold(ft8006m_g_testparamstring); + } else if (IC_Capacitance_Type == Mutual_Capacitance) { + Ft8006m_OnInit_MCap_DetailThreshold(ft8006m_g_testparamstring); + } else if (IC_Capacitance_Type == IDC_Capacitance) { + Ft8006m_OnInit_Incell_DetailThreshold(ft8006m_g_testparamstring); + } + + if (ft8006m_g_stTestFuncs.SetTestItem) { + + ft8006m_g_stTestFuncs.SetTestItem(); + + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: ft8006m_start_test_tp +* Brief: Test entry. Select test items based on IC series +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ + +boolean ft8006m_start_test_tp(void) +{ + boolean bFt8006m_TestResult = false; + + FTS_TEST_FUNC_ENTER(); + FTS_TEST_DBG("IC_%s Test", ft8006m_g_strIcName); + + if (ft8006m_g_stTestFuncs.Start_Test) { + + bFt8006m_TestResult = ft8006m_g_stTestFuncs.Start_Test(); + + } else { + FTS_TEST_DBG("[Focal]Start_Test func null!\n"); + bFt8006m_TestResult = false; + } + + Ft8006m_EnterWork(); + + FTS_TEST_FUNC_EXIT(); + + return bFt8006m_TestResult; +} +/************************************************************************ +* Name: m_get_test_data +* Brief: Get test data based on IC series +* Input: none +* Output: pTestData, External application for memory, buff size >= 1024*8 +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int m_get_test_data(char *pTestData) +{ + int iLen = 0; + FTS_TEST_DBG("[focal] %s start ", __func__); + + + if (ft8006m_g_stTestFuncs.Get_test_data) { + + iLen = ft8006m_g_stTestFuncs.Get_test_data(pTestData); + + } else { + FTS_TEST_DBG("[Focal]Get_test_data func null!\n"); + } + + FTS_TEST_FUNC_EXIT(); + return iLen; +} + +int ft8006m_focaltech_test_main_init(void) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + + /*Allocate memory, storage test results*/ + ft8006m_g_pStoreAllData = NULL; + if (NULL == ft8006m_g_pStoreAllData) + ft8006m_g_pStoreAllData = Ft8006m_fts_malloc(FTS_TEST_STORE_DATA_SIZE); + if (NULL == ft8006m_g_pStoreAllData) + return -EPERM; + + /* Allocate memory, assigned to detail threshold structure*/ + ret = ft8006m_malloc_struct_DetailThreshold(); + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} +/************************************************************************ +* Name: free_test_param_data +* Brief: release printer memory +* Input: none +* Output: none +* Return: none. +***********************************************************************/ +int ft8006m_focaltech_test_main_exit(void) +{ + + FTS_TEST_DBG("[focal] release memory -start."); + + Ft8006m_TestResultLen = 0; + + + /* Release memory test results */ + if (NULL != ft8006m_g_pStoreAllData) { + FTS_TEST_DBG("[FTS] release memory ft8006m_g_pStoreAllData."); + Ft8006m_fts_free(ft8006m_g_pStoreAllData); + ft8006m_g_pStoreAllData = NULL; + } + + + if (NULL != Ft8006m_TestResult) { + FTS_TEST_DBG(" release memory Ft8006m_TestResult."); + Ft8006m_fts_free(Ft8006m_TestResult); + Ft8006m_TestResult = NULL; + } + + + /* Releasing the memory of the detailed threshold structure */ + FTS_TEST_DBG("[FTS] release memory ft8006m_free_struct_DetailThreshold."); + ft8006m_free_struct_DetailThreshold(); + + /* release memory of key data for ini file */ + ft8006m_release_key_data(); + FTS_TEST_DBG("[focal] release memory -end."); + return 0; +} + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/Makefile b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/Makefile new file mode 100755 index 0000000000000..b35796681d5f1 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/Makefile @@ -0,0 +1,9 @@ +#drivers/input/touchscreen/focaltech_ts/focaltech_test +# +# Makefile for test module +# +# Linux driver folder +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_ft8006.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_config_ft8006.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_supported_ic.o + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_config_ft8006.c b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_config_ft8006.c new file mode 100644 index 0000000000000..6459af8f99d24 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_config_ft8006.c @@ -0,0 +1,430 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: Focaltech_test_config_ft8006.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Config for FT8006 +* +************************************************************************/ +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + +#if (FTS_CHIP_TEST_TYPE == FT8006_TEST) + + +struct stCfg_FT8006_TestItem g_stCfg_FT8006_TestItem; +struct stCfg_FT8006_BasicThreshold g_stCfg_FT8006_BasicThreshold; + +void OnInit_FT8006_TestItem(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + + Ft8006m_GetPrivateProfileString("TestItem", "FW_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.FW_VERSION_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "FACTORY_ID_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.FACTORY_ID_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "PROJECT_CODE_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.PROJECT_CODE_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "IC_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.IC_VERSION_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "RAWDATA_TEST", "1", str, strIniFile); + g_stCfg_FT8006_TestItem.RAWDATA_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "CHANNEL_NUM_TEST", "1", str, strIniFile); + g_stCfg_FT8006_TestItem.CHANNEL_NUM_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "INT_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.INT_PIN_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "RESET_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.RESET_PIN_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.NOISE_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "CB_TEST", "1", str, strIniFile); + g_stCfg_FT8006_TestItem.CB_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "SHORT_CIRCUIT_TEST", "1", str, strIniFile); + g_stCfg_FT8006_TestItem.SHORT_CIRCUIT_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "LCD_NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.LCD_NOISE_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "OSC60MHZ_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.OSC60MHZ_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "OSCTRM_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.OSCTRM_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "SNR_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.SNR_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "DIFFER_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.DIFFER_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "DIFFER_UNIFORMITY_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.DIFFER_UNIFORMITY_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "LPWG_RAWDATA_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.LPWG_RAWDATA_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "LPWG_CB_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.LPWG_CB_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "LPWG_NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.LPWG_NOISE_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "DIFFER2_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.DIFFER2_TEST = ft8006m_atoi(str); + + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_FT8006_BasicThreshold(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "FW_VER_VALUE", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.FW_VER_VALUE = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "Factory_ID_Number", "255", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.Factory_ID_Number = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "Project_Code", " ", str, strIniFile); + sprintf(g_stCfg_FT8006_BasicThreshold.Project_Code, "%s", str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "IC_Version", "3", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.IC_Version = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.RawDataTest_Min = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.RawDataTest_Max = ft8006m_atoi(str); + + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelXNum = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelYNum = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_KeyNum", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.ChannelNumTest_KeyNum = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ResetPinTest_RegAddr", "136", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.ResetPinTest_RegAddr = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "IntPinTest_RegAddr", "175", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.IntPinTest_RegAddr = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_Coefficient", "50", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_Coefficient = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_Frames", "32", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_Frames = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_Time", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_Time = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_SampeMode", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_SampeMode = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_NoiseMode", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_NoiseMode = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_ShowTip", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_ShowTip = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_IsDiffer", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.IsDifferMode = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_VA_Check", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.bCBTest_VA_Check = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.CbTest_Min = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.CbTest_Max = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_VKey_Check", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.bCBTest_VKey_Check = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.CbTest_Min_Vkey = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.CbTest_Max_Vkey = ft8006m_atoi(str); + + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ShortCircuit_ResMin", "200", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.ShortCircuit_ResMin = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Frame", "50", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.iLCDNoiseTestFrame = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Max_Screen", "32", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.iLCDNoiseTestMaxScreen = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Max_Frame", "32", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.iLCDNoiseTestMaxFrame = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Coefficient", "50", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.iLCDNoiseCoefficient = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSC60MHZTest_OSCMin", "12", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSC60MHZTest_OSCMin = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSC60MHZTest_OSCMax", "17", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSC60MHZTest_OSCMax = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSCTRMTest_OSCMin", "15", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSCTRMTest_OSCMin = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSCTRMTest_OSCMax", "17", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSCTRMTest_OSCMax = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSCTRMTest_OSCDetMin", "15", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSCTRMTest_OSCDetMin = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSCTRMTest_OSCDetMax", "17", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSCTRMTest_OSCDetMax = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SNRTest_FrameNum", "32", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.SNRTest_FrameNum = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SNRTest_Min", "10", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.SNRTest_Min = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DIFFERTest_Frame_Num", "32", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DIFFERTest_FrameNum = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DIFFERTest_Differ_Max", "100", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DIFFERTest_DifferMax = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DIFFERTest_Differ_Min", "10", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DIFFERTest_DifferMin = ft8006m_atoi(str); + + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_CHX", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_Check_CHX = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_CHY", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_Check_CHY = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_MinMax", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_Check_MinMax = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_CHX_Hole", "20", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_CHX_Hole = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_CHY_Hole", "20", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_CHY_Hole = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_MinMax_Hole", "70", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_MinMax_Hole = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_RawDataTest_Min", "5000", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_RawDataTest_Min = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_RawDataTest_Max", "11000", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_RawDataTest_Max = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_VA_Check", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.bLPWG_CBTest_VA_Check = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_Min", "3", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_CbTest_Min = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_Max", "60", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_CbTest_Max = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_VKey_Check", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.bLPWG_CBTest_VKey_Check = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_Min_Vkey", "3", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_CbTest_Min_Vkey = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_Max_Vkey", "100", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_CbTest_Max_Vkey = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_NoiseTest_Coefficient", "50", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_NoiseTest_Coefficient = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_NoiseTest_Frames", "50", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_NoiseTest_Frames = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "Differ2Test_Min", "1500", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.Differ2Test_Min = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "Differ2Test_Max", "2000", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.Differ2Test_Max = ft8006m_atoi(str); + + + + + FTS_TEST_FUNC_EXIT(); + +} +void SetTestItem_FT8006(void) +{ + ft8006m_g_TestItemNum = 0; + + FTS_TEST_FUNC_ENTER(); + + + if (g_stCfg_FT8006_TestItem.FACTORY_ID_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_FACTORY_ID_TEST); + } + + + if (g_stCfg_FT8006_TestItem.PROJECT_CODE_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_PROJECT_CODE_TEST); + } + + + if (g_stCfg_FT8006_TestItem.FW_VERSION_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_FW_VERSION_TEST); + } + + + if (g_stCfg_FT8006_TestItem.IC_VERSION_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_IC_VERSION_TEST); + } + + + ft8006m_SetTestItemCodeName(Code_FT8006_ENTER_FACTORY_MODE); + + + if (g_stCfg_FT8006_TestItem.CHANNEL_NUM_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_CHANNEL_NUM_TEST); + } + + + if (g_stCfg_FT8006_TestItem.SHORT_CIRCUIT_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_SHORT_CIRCUIT_TEST) ; + } + + + if (g_stCfg_FT8006_TestItem.OSC60MHZ_TEST == 1) { + + ft8006m_SetTestItemCodeName(Code_FT8006_OSC60MHZ_TEST); + } + + + if (g_stCfg_FT8006_TestItem.OSCTRM_TEST == 1) { + + ft8006m_SetTestItemCodeName(Code_FT8006_OSCTRM_TEST); + } + + + if (g_stCfg_FT8006_TestItem.DIFFER2_TEST == 1) { + + ft8006m_SetTestItemCodeName(Code_FT8006_DIFFER2_TEST); + } + + + if (g_stCfg_FT8006_TestItem.CB_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_CB_TEST); + } + + + if (g_stCfg_FT8006_TestItem.NOISE_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_NOISE_TEST); + } + + + if (g_stCfg_FT8006_TestItem.LCD_NOISE_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_LCD_NOISE_TEST); + } + + + if (g_stCfg_FT8006_TestItem.RAWDATA_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_RAWDATA_TEST); + } + + + if (g_stCfg_FT8006_TestItem.SNR_TEST == 1) { + + ft8006m_SetTestItemCodeName(Code_FT8006_SNR_TEST); + } + + + + if (g_stCfg_FT8006_TestItem.DIFFER_TEST == 1) { + + ft8006m_SetTestItemCodeName(Code_FT8006_DIFFER_TEST); + } + + + + if (g_stCfg_FT8006_TestItem.DIFFER_UNIFORMITY_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_DIFFER_UNIFORMITY_TEST); + } + + + if (g_stCfg_FT8006_TestItem.RESET_PIN_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_RESET_PIN_TEST); + } + + + if (g_stCfg_FT8006_TestItem.INT_PIN_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_RESET_PIN_TEST); + } + + + if (g_stCfg_FT8006_TestItem.RESET_PIN_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_INT_PIN_TEST); + } + + + if (g_stCfg_FT8006_TestItem.LPWG_CB_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_LPWG_CB_TEST); + } + + + if (g_stCfg_FT8006_TestItem.LPWG_NOISE_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_LPWG_NOISE_TEST); + } + + + if (g_stCfg_FT8006_TestItem.LPWG_RAWDATA_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_LPWG_RAWDATA_TEST); + } + + + + FTS_TEST_FUNC_EXIT(); + +} + +#endif + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_ft8006.c b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_ft8006.c new file mode 100644 index 0000000000000..f3ae146f96247 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_ft8006.c @@ -0,0 +1,2101 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R),All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ft8006.c +* +* Author: Software Development +* +* Created: 2016-08-01 +* +* Abstract: test item for FT8006 +* +************************************************************************/ + +/******************************************************************************* +* Included header files +*******************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" +#include "../../focaltech_core.h" + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ +#if (FTS_CHIP_TEST_TYPE == FT8006_TEST) + + +#define DEVIDE_MODE_ADDR 0x00 +#define REG_LINE_NUM 0x01 +#define REG_TX_NUM 0x02 +#define REG_RX_NUM 0x03 +#define FT8006_LEFT_KEY_REG 0X1E +#define FT8006_RIGHT_KEY_REG 0X1F + +#define REG_CbAddrH 0x18 +#define REG_CbAddrL 0x19 +#define REG_OrderAddrH 0x1A +#define REG_OrderAddrL 0x1B + +#define REG_RawBuf0 0x6A +#define REG_RawBuf1 0x6B +#define REG_OrderBuf0 0x6C +#define REG_CbBuf0 0x6E + +#define REG_K1Delay 0x31 +#define REG_K2Delay 0x32 +#define REG_SCChannelCf 0x34 + +#define REG_FACTORYID 0xA8 + +#define pre 1 +#define REG_CLB 0x04 + +#define DOUBLE_TX_NUM_MAX 160 +#define DOUBLE_RX_NUM_MAX 160 + +#define REG_8006_LCD_NOISE_FRAME 0X12 +#define REG_8006_LCD_NOISE_START 0X11 +#define REG_8006_LCD_NOISE_NUMBER 0X13 + + + +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ + +enum NOISE_TYPE { + NT_AvgData = 0, + NT_MaxData = 1, + NT_MaxDevication = 2, + NT_DifferData = 3, +}; + +enum CS_TYPE { + CS_TWO_SINGLE_MASTER = 1, + CS_TWO_SINGLE_SLAVE = 0, + CS_SINGLE_CHIP = 3, +}; +enum CS_DIRECTION { + CS_LEFT_RIGHT = 0x00, + CS_UP_DOWN = 0x40, +}; +enum CD_S0_ROLE { + CS_S0_AS_MASTER = 0x00, + CS_S0_AS_SLAVE = 0x80, +}; + +struct CSInfoPacket { + enum CS_TYPE csType; + enum CS_DIRECTION csDirection; + enum CD_S0_ROLE csS0Role; + BYTE csMasterAddr; + BYTE csSalveAddr; + BYTE csMarterTx; + BYTE csMasterRx; + BYTE csSlaveTx; + BYTE csSlaveRx; +}; + +struct FT8006 { + struct CSInfoPacket *m_csInfo; + unsigned char m_currentSlaveAddr; + +}; + +struct CSChipAddrMgr { + struct FT8006 *m_parent; + BYTE m_slaveAddr; +}; + + + +/******************************************************************************* +* Static variables +*******************************************************************************/ + +static int m_RawData[TX_NUM_MAX][RX_NUM_MAX] = {{0, 0} } ; +static int m_CBData[TX_NUM_MAX][RX_NUM_MAX] = {{0, 0} } ; +static BYTE m_ucTempData[TX_NUM_MAX * RX_NUM_MAX*2] = {0}; +static int m_iTempRawData[TX_NUM_MAX * RX_NUM_MAX] = {0}; + +static int bufferMaster[TX_NUM_MAX * RX_NUM_MAX] = {0}; +static int bufferSlave[TX_NUM_MAX * RX_NUM_MAX] = {0}; +static int bufferCated[DOUBLE_TX_NUM_MAX * DOUBLE_RX_NUM_MAX] = {0}; +static int iAdcData[TX_NUM_MAX * RX_NUM_MAX] = {0}; +static unsigned char pReadBuffer[80 * 80 * 2] = {0}; +static int shortRes[TX_NUM_MAX][RX_NUM_MAX] = { {0} }; +static unsigned char ScreenNoiseData[TX_NUM_MAX*RX_NUM_MAX*2] = {0}; +static int LCD_Noise[TX_NUM_MAX][RX_NUM_MAX] = {{0, 0} } ; + + + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ +extern struct stCfg_FT8006_BasicThreshold g_stCfg_FT8006_BasicThreshold; + + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ + + +static int StartScan(void); +static unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer); +static unsigned char GetPanelRows(unsigned char *pPanelRows); +static unsigned char GetPanelCols(unsigned char *pPanelCols); +static unsigned char GetTxRxCB(unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer); +static unsigned char GetRawData(struct FT8006 *g_FT8006); +static unsigned char GetChannelNum(void); +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount); +static unsigned char ChipClb(unsigned char *pClbResult); +void CatSingleToOneScreen(struct FT8006 *g_FT8006); +void ReleaseCSInfo(struct FT8006 *g_FT8006); +unsigned char FT8006_EnterFactory(struct FT8006 *g_FT8006); +unsigned char FT8006_ChipClb(struct FT8006 *g_FT8006, unsigned char *pClbResult); +static unsigned char FT8006_GetTxRxCB(struct FT8006 *g_FT8006, unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer); +unsigned char FT8006_WeakShort_GetAdcData(struct FT8006 *g_FT8006, int AllAdcDataLen, int *pRevBuffer); +unsigned char ReadBytesByKey(BYTE key, int ByteNum, unsigned char *byteData); +unsigned char FT8006_EnterWork(struct FT8006 *g_FT8006); +int HY_SetSlaveAddr(struct FT8006 *g_FT8006, BYTE SlaveAddr); +unsigned char FT8006_WriteReg(struct FT8006 *g_FT8006, unsigned char RegAddr, unsigned char RegData); +bool ChipHasTwoHeart(struct FT8006 *g_FT8006); +unsigned char FT8006_StartScan(struct FT8006 *g_FT8006); +unsigned char FT8006_ReadRawData(struct FT8006 *g_FT8006, unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer); +unsigned char WeakShort_StartAdcScan(void); +unsigned char WeakShort_GetScanResult(void); +unsigned char WeakShort_GetAdcResult(int AllAdcDataLen, int *pRevBuffer); +static unsigned char WeakShort_GetAdcData(int AllAdcDataLen, int *pRevBuffer); +void InitCurrentAddress(struct FT8006 *g_FT8006); +void CSInfoPacket(struct CSInfoPacket *cspt); + + + + +boolean FT8006_StartTest(void); +int FT8006M_get_test_data(char *pTestData); + +unsigned char FT8006_TestItem_EnterFactoryMode(struct FT8006 *g_FT8006); +unsigned char FT8006_TestItem_RawDataTest(struct FT8006 *g_FT8006, bool *bTestResult); +unsigned char FT8006_TestItem_CbTest(struct FT8006 *g_FT8006, bool *bTestResult); +unsigned char FT8006_TestItem_ShortCircuitTest(struct FT8006 *g_FT8006, bool *bTestResult); +unsigned char FT8006_TestItem_LCDNoiseTest(struct FT8006 *g_FT8006, bool *bTestResult); +unsigned char FT8006_TestItem_ChannelsTest(struct FT8006 *g_FT8006, bool *bTestResult); +unsigned char FT8006_CheckItem_FactoryIdTest(struct FT8006 *g_FT8006, bool *bTestResult); +/************************************************************************ +* Name: FT8006_StartTest +* Brief: Test entry. Determine which test item to test +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ + +boolean FT8006_StartTest() +{ + bool bTestResult = true, bTempResult = 1; + unsigned char ReCode; + unsigned char ucDevice = 0; + int iItemCount = 0; + + struct FT8006 g_FT8006; + struct CSInfoPacket cspt; + + + + CSInfoPacket(&cspt); + InitCurrentAddress(&g_FT8006); + g_FT8006.m_csInfo = &cspt; + + + + if (Ft8006m_InitTest() < 0) { + FTS_TEST_ERROR("[focal] Failed to init test."); + return false; + } + + + if (0 == ft8006m_g_TestItemNum) + bTestResult = false; + + + for (iItemCount = 0; iItemCount < ft8006m_g_TestItemNum; iItemCount++) { + ft8006m_m_ucTestItemCode = ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode; + + + if (Code_FT8006_ENTER_FACTORY_MODE == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8006_TestItem_EnterFactoryMode(&g_FT8006); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + break; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8006_RAWDATA_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8006_TestItem_RawDataTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8006_CB_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8006_TestItem_CbTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8006_CHANNEL_NUM_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode) { + ReCode = FT8006_TestItem_ChannelsTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + break; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + + } + + + if (Code_FT8006_SHORT_CIRCUIT_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8006_TestItem_ShortCircuitTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8006_LCD_NOISE_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8006_TestItem_LCDNoiseTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8006_FACTORY_ID_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode) { + ReCode = FT8006_CheckItem_FactoryIdTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + } + + + Ft8006m_FinishTest(); + + + return bTestResult; + +} + + +/************************************************************************ +* Name: +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +void InitCurrentAddress(struct FT8006 *g_FT8006) +{ + g_FT8006->m_currentSlaveAddr = 0x70; +} +struct CSInfoPacket *GetCSInfo(struct FT8006 *g_FT8006) +{ + return g_FT8006->m_csInfo; +} +unsigned char GetCurrentAddr(struct FT8006 *g_FT8006) +{ + return g_FT8006->m_currentSlaveAddr; +} +int GetCSType(struct CSInfoPacket *cspt) +{ + return cspt->csType; +} +int GetCSDirection(struct CSInfoPacket *cspt) +{ + return cspt->csDirection; +} +int GetS0Role(struct CSInfoPacket *cspt) +{ + return cspt->csS0Role; +} +void SetMasterAddr(struct CSInfoPacket *cspt, BYTE master) +{ + cspt->csMasterAddr = master; +} +BYTE GetMasterAddr(struct CSInfoPacket *cspt) +{ + return cspt->csMasterAddr; +} +void SetSlaveAddr(struct CSInfoPacket *cspt, BYTE slave) +{ + cspt->csSalveAddr = slave; +} +BYTE GetSlaveAddr(struct CSInfoPacket *cspt) +{ + return cspt->csSalveAddr; +} +void SetMasterTx(struct CSInfoPacket *cspt, BYTE tx) +{ + cspt->csMarterTx = tx; +} +BYTE GetMasterTx(struct CSInfoPacket *cspt) +{ + return cspt->csMarterTx; +} +void SetMasterRx(struct CSInfoPacket *cspt, BYTE rx) +{ + cspt->csMasterRx = rx; +} +BYTE GetMasterRx(struct CSInfoPacket *cspt) +{ + return cspt->csMasterRx; +} +void SetSlaveTx(struct CSInfoPacket *cspt, BYTE tx) +{ + cspt->csSlaveTx = tx; +} +BYTE GetSlaveTx(struct CSInfoPacket *cspt) +{ + return cspt->csSlaveTx; +} +void SetSlaveRx(struct CSInfoPacket *cspt, BYTE rx) +{ + cspt->csSlaveRx = rx; +} +BYTE GetSlaveRx(struct CSInfoPacket *cspt) +{ + return cspt->csSlaveRx; +} +void Initialize(struct CSInfoPacket *cspt, BYTE bRegCfg) +{ + cspt->csType = (enum CS_TYPE)(bRegCfg & 0x3F); + cspt->csDirection = (enum CS_DIRECTION)(bRegCfg & 0x40); + cspt->csS0Role = (enum CD_S0_ROLE)(bRegCfg & 0x80); + cspt->csMasterAddr = 0x70; + cspt->csSalveAddr = 0x72; + cspt->csMarterTx = 0; + cspt->csMasterRx = 0; + cspt->csSlaveTx = 0; + cspt->csSlaveRx = 0; +} +void CSInfoPacket(struct CSInfoPacket *cspt) +{ + cspt->csType = CS_SINGLE_CHIP; + cspt->csDirection = CS_UP_DOWN; + cspt->csS0Role = CS_S0_AS_MASTER; + cspt->csMasterAddr = 0x72; + cspt->csSalveAddr = 0x70; + cspt->csMarterTx = 0; + cspt->csMasterRx = 0; + cspt->csSlaveTx = 0; + cspt->csSlaveRx = 0; +} + + +void ReleaseCSInfo(struct FT8006 *g_FT8006) +{ + + memset(g_FT8006->m_csInfo, 0, sizeof(struct CSInfoPacket)); + +} + +void UpDateCSInfo(struct FT8006 *g_FT8006) +{ + unsigned char ReCode = ERROR_CODE_OK, RegValue = 0; + + ReCode = Ft8006m_ReadReg(0x26, &RegValue); + Initialize(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_ReadReg(0x50, &RegValue); + SetMasterTx(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_ReadReg(0x51, &RegValue); + SetMasterRx(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_ReadReg(0x52, &RegValue); + SetSlaveTx(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_ReadReg(0x53, &RegValue); + SetSlaveRx(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_WriteReg(0x17, 0); + ReCode = Ft8006m_ReadReg(0x81, &RegValue); + SetMasterAddr(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_WriteReg(0x17, 12); + ReCode = Ft8006m_ReadReg(0x81, &RegValue); + SetSlaveAddr(g_FT8006->m_csInfo, RegValue); + + FTS_TEST_DBG("csType = %d, csDirection = %d, csS0Role = %d, csMasterAddr = 0x%x, csSalveAddr = 0x%x,\ + csMarterTx = %d, csMasterRx = %d, csSlaveTx = %d, csSlaveRx = %d.", + g_FT8006->m_csInfo->csType, + g_FT8006->m_csInfo->csDirection, + g_FT8006->m_csInfo->csS0Role, + g_FT8006->m_csInfo->csMasterAddr, + g_FT8006->m_csInfo->csSalveAddr, + g_FT8006->m_csInfo->csMarterTx, + g_FT8006->m_csInfo->csMasterRx, + g_FT8006->m_csInfo->csSlaveTx, + g_FT8006->m_csInfo->csSlaveRx + ); + +} + +bool ChipHasTwoHeart(struct FT8006 *g_FT8006) +{ + if (GetCSType(g_FT8006->m_csInfo) == CS_SINGLE_CHIP) + return false; + + return true; +} +void CSChipAddrMgr_Init(struct CSChipAddrMgr *pMgr, struct FT8006 *parent) +{ + + pMgr->m_parent = parent; + pMgr->m_slaveAddr = GetCurrentAddr(parent); + +} + +void CSChipAddrMgr_Exit(struct CSChipAddrMgr *pMgr) +{ + + if (pMgr->m_slaveAddr != GetCurrentAddr(pMgr->m_parent)) { + + HY_SetSlaveAddr(pMgr->m_parent, pMgr->m_slaveAddr); + } + + +} + +int HY_SetSlaveAddr(struct FT8006 *g_FT8006, BYTE SlaveAddr) +{ + unsigned char value = 0; + unsigned char ReCode = ERROR_CODE_OK; + int tmp = 0; + + g_FT8006->m_currentSlaveAddr = SlaveAddr; + tmp = ft8006m_i2c_client->addr; + + FTS_TEST_DBG("Original i2c addr 0x%x ", ft8006m_i2c_client->addr); + FTS_TEST_DBG("CurrentAddr 0x%x ", (SlaveAddr>>1)); + + if (ft8006m_i2c_client->addr != (SlaveAddr>>1)) { + ft8006m_i2c_client->addr = (SlaveAddr>>1); + FTS_TEST_DBG("Change i2c addr 0x%x to 0x%x", tmp, ft8006m_i2c_client->addr); + } + + + ReCode = Ft8006m_ReadReg(0x20, &value); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("[focal] Ft8006m_ReadReg Error, code: %d ", ReCode); + } else { + FTS_TEST_DBG("[focal] Ft8006m_ReadReg successed, Addr: 0x20, value: 0x%02x ", value); + } + + + return 0; +} + +void WorkAsMaster(struct CSChipAddrMgr *pMgr) +{ + struct CSInfoPacket *pcs = GetCSInfo(pMgr->m_parent); + + if (GetMasterAddr(pcs) != GetCurrentAddr(pMgr->m_parent)) { + HY_SetSlaveAddr(pMgr->m_parent, GetMasterAddr(pcs)); + } + +} + +void WorkAsSlave(struct CSChipAddrMgr *pMgr) +{ + struct CSInfoPacket *pcs = GetCSInfo(pMgr->m_parent); + + if (GetSlaveAddr(pcs) != GetCurrentAddr(pMgr->m_parent)) { + HY_SetSlaveAddr(pMgr->m_parent, GetSlaveAddr(pcs)); + } +} + +void CatSingleToOneScreen(struct FT8006 *g_FT8006) +{ + int leftChannelNum = 0, rightChannelNum = 0; + int upChannelNum = 0, downChannelNum = 0; + unsigned char splitRx = 0; + unsigned char splitTx = 0; + int iRow = 0, iCol = 0; + int iRelativeRx = 0; + int iRelativeTx = 0; + int iTotalRx = 0; + int iTotalTx = 0; + int *bufferLeft = NULL; + int *bufferRight = NULL; + int *bufferUp = NULL; + int *bufferDown = NULL; + + FTS_TEST_FUNC_ENTER(); + + + if (CS_SINGLE_CHIP == GetCSType(g_FT8006->m_csInfo)) + return; + + + if (CS_LEFT_RIGHT == GetCSDirection(g_FT8006->m_csInfo)) { + bufferLeft = Ft8006m_fts_malloc(TX_NUM_MAX * RX_NUM_MAX*sizeof(int)); + bufferRight = Ft8006m_fts_malloc(TX_NUM_MAX * RX_NUM_MAX*sizeof(int)); + + if (CS_S0_AS_MASTER == GetS0Role(g_FT8006->m_csInfo)) { + splitRx = GetMasterRx(g_FT8006->m_csInfo); + bufferLeft = bufferMaster; + bufferRight = bufferSlave; + leftChannelNum = GetMasterTx(g_FT8006->m_csInfo) * GetMasterRx(g_FT8006->m_csInfo); + rightChannelNum = GetSlaveTx(g_FT8006->m_csInfo) * GetSlaveRx(g_FT8006->m_csInfo); + } else { + splitRx = GetSlaveRx(g_FT8006->m_csInfo); + bufferLeft = bufferSlave; + bufferRight = bufferMaster; + leftChannelNum = GetSlaveTx(g_FT8006->m_csInfo) * GetSlaveRx(g_FT8006->m_csInfo); + rightChannelNum = GetMasterTx(g_FT8006->m_csInfo) * GetMasterRx(g_FT8006->m_csInfo); + } + + for (iRow = 0; iRow < GetMasterTx(g_FT8006->m_csInfo); ++iRow) { + for (iCol = 0; iCol < GetMasterRx(g_FT8006->m_csInfo) + GetSlaveRx(g_FT8006->m_csInfo); ++iCol) { + iRelativeRx = iCol - splitRx; + iTotalRx = GetMasterRx(g_FT8006->m_csInfo) + GetSlaveRx(g_FT8006->m_csInfo); + if (iCol >= splitRx) { + + bufferCated[iRow * iTotalRx + iCol] = bufferRight[iRow * (iTotalRx - splitRx) + iRelativeRx]; + } else { + + bufferCated[iRow * iTotalRx + iCol] = bufferLeft[iRow * splitRx + iCol]; + } + } + } + + memcpy(bufferCated + GetMasterTx(g_FT8006->m_csInfo) * (GetMasterRx(g_FT8006->m_csInfo) + GetSlaveRx(g_FT8006->m_csInfo)), bufferLeft + leftChannelNum, 6); + memcpy(bufferCated + GetMasterTx(g_FT8006->m_csInfo) * (GetMasterRx(g_FT8006->m_csInfo) + GetSlaveRx(g_FT8006->m_csInfo)) + 6, bufferRight + rightChannelNum, 6); + } + + else if (CS_UP_DOWN == GetCSDirection(g_FT8006->m_csInfo)) { + bufferUp = Ft8006m_fts_malloc(TX_NUM_MAX * RX_NUM_MAX*sizeof(int)); + bufferDown = Ft8006m_fts_malloc(TX_NUM_MAX * RX_NUM_MAX*sizeof(int)); + + if (CS_S0_AS_MASTER == GetS0Role(g_FT8006->m_csInfo)) { + splitTx = GetMasterTx(g_FT8006->m_csInfo); + bufferUp = bufferMaster; + bufferDown = bufferSlave; + upChannelNum = GetMasterTx(g_FT8006->m_csInfo) * GetMasterRx(g_FT8006->m_csInfo); + downChannelNum = GetSlaveTx(g_FT8006->m_csInfo) * GetSlaveRx(g_FT8006->m_csInfo); + } else { + splitTx = GetSlaveTx(g_FT8006->m_csInfo); + bufferUp = bufferSlave; + bufferDown = bufferMaster; + upChannelNum = GetSlaveTx(g_FT8006->m_csInfo) * GetSlaveRx(g_FT8006->m_csInfo); + downChannelNum = GetMasterTx(g_FT8006->m_csInfo) * GetMasterRx(g_FT8006->m_csInfo); + } + for (iRow = 0; iRow < GetMasterTx(g_FT8006->m_csInfo) + GetSlaveTx(g_FT8006->m_csInfo); ++iRow) { + for (iCol = 0; iCol < GetMasterRx(g_FT8006->m_csInfo); ++iCol) { + iRelativeTx = iRow - splitTx; + iTotalTx = GetMasterTx(g_FT8006->m_csInfo) + GetSlaveTx(g_FT8006->m_csInfo); + if (iRow >= splitTx) { + + bufferCated[iRow * GetMasterRx(g_FT8006->m_csInfo) + iCol] = bufferDown[iRelativeTx * GetMasterRx(g_FT8006->m_csInfo) + iCol]; + } else { + + bufferCated[iRow * GetMasterRx(g_FT8006->m_csInfo) + iCol] = bufferUp[iRow * GetMasterRx(g_FT8006->m_csInfo) + iCol]; + } + } + } + + memcpy(bufferCated + (GetMasterTx(g_FT8006->m_csInfo) + GetSlaveTx(g_FT8006->m_csInfo)) * GetMasterRx(g_FT8006->m_csInfo), bufferUp + upChannelNum, 6); + memcpy(bufferCated + (GetMasterTx(g_FT8006->m_csInfo) + GetSlaveTx(g_FT8006->m_csInfo)) * GetMasterRx(g_FT8006->m_csInfo) + 6, bufferDown + downChannelNum, 6); + } + + + if (bufferLeft != NULL) { + Ft8006m_fts_free(bufferLeft); + } + if (bufferRight != NULL) { + Ft8006m_fts_free(bufferRight); + } + if (bufferUp != NULL) { + Ft8006m_fts_free(bufferUp); + } + if (bufferDown != NULL) { + Ft8006m_fts_free(bufferDown); + } + + FTS_TEST_FUNC_EXIT(); + +} + +/************************************************************************ +* Name: FT8006_TestItem_EnterFactoryMode +* Brief: Check whether TP can enter Factory Mode, and do some thing +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8006_TestItem_EnterFactoryMode(struct FT8006 *g_FT8006) +{ + + unsigned char ReCode = ERROR_CODE_INVALID_PARAM; + int iRedo = 5; + int i ; + Ft8006m_SysDelay(150); + FTS_TEST_DBG("Enter factory mode..."); + for (i = 1; i <= iRedo; i++) { + ReCode = FT8006_EnterFactory(g_FT8006); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Enter factory mode..."); + if (i < iRedo) { + Ft8006m_SysDelay(50); + continue; + } + } else { + FTS_TEST_DBG(" success to Enter factory mode..."); + break; + } + + } + Ft8006m_SysDelay(300); + + if (ReCode == ERROR_CODE_OK) { + ReCode = GetChannelNum(); + + } + return ReCode; +} + +/************************************************************************ +* Name: FT8006_TestItem_RawDataTest +* Brief: TestItem: RawDataTest. Check if MCAP RawData is within the range. +* Input: bTestResult +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8006_TestItem_RawDataTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + unsigned char ReCode; + bool btmpresult = true; + int RawDataMin; + int RawDataMax; + int iValue = 0; + int i = 0; + int iRow, iCol; + + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Raw Data Test\n"); + + + + for (i = 0 ; i < 3; i++) { + ReCode = GetRawData(g_FT8006); + } + + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to get Raw Data!! Error Code: %d", ReCode); + return ReCode; + } + + + + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; iRow++) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + FTS_TEST_DBG("%5d, ", m_RawData[iRow][iCol]); + } + } + + FTS_TEST_DBG("\nKeys: "); + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; iCol++) + FTS_TEST_DBG("%5d, ", m_RawData[ft8006m_g_stSCapConfEx.ChannelXNum][iCol]); + + + + + + + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; iRow++) { + + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + if (ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[iRow][iCol]; + RawDataMax = ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + + + + iRow = ft8006m_g_stSCapConfEx.ChannelXNum; + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; iCol++) { + if (ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[iRow][iCol]; + RawDataMax = ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + + + + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "RawData Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + Save_Test_Data(m_RawData, 0, ft8006m_g_stSCapConfEx.ChannelXNum+1, ft8006m_g_stSCapConfEx.ChannelYNum, 1); + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//RawData Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//RawData Test is NG!"); + } + return ReCode; +} + + +/************************************************************************ +* Name: FT8006_TestItem_CbTest +* Brief: TestItem: Cb Test. Check if Cb is within the range. +* Input: none +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8006_TestItem_CbTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + bool btmpresult = true; + unsigned char ReCode = ERROR_CODE_OK; + int iRow = 0; + int iCol = 0; + int i = 0; + int iMaxValue = 0; + int iMinValue = 0; + int iValue = 0; + bool bIncludeKey = false; + unsigned char bClbResult = 0; + + + bIncludeKey = g_stCfg_FT8006_BasicThreshold.bCBTest_VKey_Check; + + FTS_TEST_INFO("\n\n==============================Test Item: -------- CB Test\n"); + + for (i = 0; i < 10; i++) { + ReCode = FT8006_ChipClb(g_FT8006, &bClbResult); + Ft8006m_SysDelay(50); + if (0 != bClbResult) { + break; + } + } + if (false == bClbResult) { + FTS_TEST_ERROR("\r\nReCalib Failed\r\n"); + btmpresult = false; + } + + ReCode = FT8006_GetTxRxCB(g_FT8006, 0, (short)(ft8006m_g_stSCapConfEx.ChannelXNum * ft8006m_g_stSCapConfEx.ChannelYNum + ft8006m_g_stSCapConfEx.KeyNumTotal), m_ucTempData); + if (ERROR_CODE_OK != ReCode) { + btmpresult = false; + FTS_TEST_ERROR("\nFailed to get CB value...\n"); + goto TEST_ERR; + } + + memset(m_CBData, 0, sizeof(m_CBData)); + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + m_CBData[iRow][iCol] = m_ucTempData[iRow * ft8006m_g_stSCapConfEx.ChannelYNum + iCol]; + } + } + + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; ++iCol) { + m_CBData[ft8006m_g_stSCapConfEx.ChannelXNum][iCol] = m_ucTempData[ft8006m_g_stSCapConfEx.ChannelXNum*ft8006m_g_stSCapConfEx.ChannelYNum + iCol]; + + } + + + + + + + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; iRow++) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + FTS_TEST_DBG("%3d, ", m_CBData[iRow][iCol]); + } + } + + FTS_TEST_DBG("\nKeys: "); + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; iCol++) + FTS_TEST_DBG("%3d, ", m_CBData[ft8006m_g_stSCapConfEx.ChannelXNum][iCol]); + + + + + + + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; iRow++) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + if ((0 == ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol])) { + continue; + } + iMinValue = ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[iRow][iCol]; + iMaxValue = ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[iRow][iCol]; + iValue = ft8006m_focal_abs(m_CBData[iRow][iCol]); + + if (iValue < iMinValue || iValue > iMaxValue) { + btmpresult = false; + FTS_TEST_ERROR("CB test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, iMinValue, iMaxValue); + } + } + } + + + if (bIncludeKey) { + + iRow = ft8006m_g_stSCapConfEx.ChannelXNum; + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; iCol++) { + if (ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) { + continue; + } + iMinValue = ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[iRow][iCol]; + iMaxValue = ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[iRow][iCol]; + iValue = ft8006m_focal_abs(m_CBData[iRow][iCol]); + if (iValue < iMinValue || iValue > iMaxValue) { + btmpresult = false; + FTS_TEST_ERROR("CB test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, iMinValue, iMaxValue); + } + } + + + } + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "CB Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + Save_Test_Data(m_CBData, 0, ft8006m_g_stSCapConfEx.ChannelXNum+1, ft8006m_g_stSCapConfEx.ChannelYNum, 1); + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//CB Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//CB Test is NG!"); + } + + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO("\n\n//CB Test is NG!"); + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "CB Test is NG. \n\n"); + return ReCode; +} + + +/************************************************************************ +* Name: FT8006_TestItem_ChannelsTest +* Brief: Check whether TP can enter Factory Mode, and do some thing +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8006_TestItem_ChannelsTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + unsigned char ReCode; + + FTS_TEST_DBG("\n\n==============================Test Item: -------- Channel Test "); + + ReCode = GetChannelNum(); + if (ReCode == ERROR_CODE_OK) { + if ((g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelXNum == ft8006m_g_stSCapConfEx.ChannelXNum) + && (g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelYNum == ft8006m_g_stSCapConfEx.ChannelYNum) + && (g_stCfg_FT8006_BasicThreshold.ChannelNumTest_KeyNum == ft8006m_g_stSCapConfEx.KeyNum)) { + *bTestResult = true; + FTS_TEST_DBG("\n\nGet channels: (CHx: %d, CHy: %d, Key: %d), Set channels: (CHx: %d, CHy: %d, Key: %d)", + ft8006m_g_stSCapConfEx.ChannelXNum, ft8006m_g_stSCapConfEx.ChannelYNum, ft8006m_g_stSCapConfEx.KeyNum, + g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelXNum, g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelYNum, g_stCfg_FT8006_BasicThreshold.ChannelNumTest_KeyNum); + + FTS_TEST_INFO("\n//Channel Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_ERROR("\n\nGet channels: (CHx: %d, CHy: %d, Key: %d), Set channels: (CHx: %d, CHy: %d, Key: %d)", + ft8006m_g_stSCapConfEx.ChannelXNum, ft8006m_g_stSCapConfEx.ChannelYNum, ft8006m_g_stSCapConfEx.KeyNum, + g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelXNum, g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelYNum, g_stCfg_FT8006_BasicThreshold.ChannelNumTest_KeyNum); + + FTS_TEST_INFO("\n//Channel Test is NG!"); + } + } + + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "Channel Test is %s. \n\n", (*bTestResult ? "OK" : "NG")); + + return ReCode; +} + +/************************************************************************ +* Name: FT8006_CheckItem_FactoryIdTest +* Brief: Factory Id Testt. +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8006_CheckItem_FactoryIdTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + unsigned char ReCode = ERROR_CODE_OK; + bool btmpresult = true; + unsigned char regData = 0; + unsigned char FactoryId = 0; + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Factory Id Test\n"); + + ReCode = Ft8006m_EnterWork(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR(" EnterWork failed.. Error Code: %d \n", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + + Ft8006m_SysDelay(60); + ReCode = Ft8006m_ReadReg(REG_FACTORYID, ®Data); + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR(" Failed to Read Register: %x. Error Code: %d \n", REG_FACTORYID, ReCode); + goto TEST_ERR; + } + + FactoryId = g_stCfg_FT8006_BasicThreshold.Factory_ID_Number; + + FTS_TEST_DBG("\r\nGet FactoryId:0x%02x, Set FactoryId: 0x%02x \n", regData, FactoryId); + + if (FactoryId == regData) { + btmpresult = true; + + } else { + btmpresult = false; + } + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, " FactoryId Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//FactoryId Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//FactoryId Test is NG!"); + } + return ReCode; + +TEST_ERR: + *bTestResult = false; + FTS_TEST_INFO("\n\n//FactoryId Test is NG!"); + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, " FactoryId Test is NG. \n\n"); + + return ReCode; +} + + +unsigned char FT8006_TestItem_ShortCircuitTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + unsigned char ReCode = ERROR_CODE_OK; + bool bTempResult = true; + int ResMin = 0; + int iAllAdcDataNum = 0; + unsigned char iTxNum = 0, iRxNum = 0, iChannelNum = 0; + int iRow = 0, iCol = 0; + int tmpAdc = 0; + int iValueMin = 0; + int iValueMax = 0; + int iValue = 0; + int i = 0; + + FTS_TEST_INFO("\r\n\r\n==============================Test Item: -------- Short Circuit Test \r\n"); + + ReCode = FT8006_EnterFactory(g_FT8006); + if (ERROR_CODE_OK != ReCode) { + bTempResult = false; + FTS_TEST_ERROR("\r\n\r\n// Failed to Enter factory mode. Error Code: %d", ReCode); + goto TEST_END; + } + + ResMin = g_stCfg_FT8006_BasicThreshold.ShortCircuit_ResMin; + ReCode = Ft8006m_ReadReg(0x02, &iTxNum); + ReCode = Ft8006m_ReadReg(0x03, &iRxNum); + if (ERROR_CODE_OK != ReCode) { + bTempResult = false; + FTS_TEST_ERROR("\r\n\r\n// Failed to read reg. Error Code: %d", ReCode); + goto TEST_END; + } + + iChannelNum = iTxNum + iRxNum; + iAllAdcDataNum = iTxNum * iRxNum + ft8006m_g_stSCapConfEx.KeyNumTotal; + memset(iAdcData, 0, sizeof(iAdcData)); + + for (i = 0; i < 1; i++) { + ReCode = FT8006_WeakShort_GetAdcData(g_FT8006, iAllAdcDataNum*2, iAdcData); + Ft8006m_SysDelay(50); + if (ERROR_CODE_OK != ReCode) { + bTempResult = false; + FTS_TEST_ERROR("\r\n\r\n// Failed to get AdcData. Error Code: %d", ReCode); + goto TEST_END; + } + } + + + FTS_TEST_DBG("shortRes data:\n"); + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum + 1; ++iRow) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + tmpAdc = iAdcData[iRow * iRxNum + iCol]; + if (tmpAdc > 4050) + tmpAdc = 4050; + shortRes[iRow][iCol] = (tmpAdc * 100) / (4095 - tmpAdc); + + FTS_TEST_DBG("%-4d ", shortRes[iRow][iCol]); + } + FTS_TEST_DBG(" \n"); + } + FTS_TEST_DBG(" \n"); + + + + + iValueMin = ResMin; + iValueMax = 100000000; + FTS_TEST_DBG(" Short Circuit test , Set_Range=(%d, %d). \n", \ + iValueMin, iValueMax); + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; iRow++) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + if (ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + + iValue = shortRes[iRow][iCol]; + if (iValue < iValueMin || iValue > iValueMax) { + bTempResult = false; + FTS_TEST_ERROR(" Short Circuit test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d). \n", \ + iRow+1, iCol+1, iValue, iValueMin, iValueMax); + } + } + } + +TEST_END: + + if (bTempResult) { + FTS_TEST_INFO("\r\n\r\n//Short Circuit Test is OK!"); + *bTestResult = true; + } else { + FTS_TEST_INFO("\r\n\r\n//Short Circuit Test is NG!"); + *bTestResult = false; + } + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "Short Circuit Test is %s. \n\n", (bTempResult ? "OK" : "NG")); + + return ReCode; +} +unsigned char FT8006_TestItem_LCDNoiseTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + unsigned char ReCode = ERROR_CODE_OK; + bool bResultFlag = true; + unsigned char oldMode = 0; + int iRetry = 0; + unsigned char status = 0xff; + int iRow = 0, iCol = 0; + int index = 0; + unsigned char chNoiseValue = 0xff; + int iValueMin = 0; + int iValueMax = 0; + int iValue = 0; + + FTS_TEST_INFO("\r\n\r\n==============================Test Item: -------- LCD Noise Test \r\n"); + + + Ft8006m_ReadReg(0x06, &oldMode); + FT8006_WriteReg(g_FT8006, 0x06, 1); + + + ReCode = FT8006_WriteReg(g_FT8006, REG_8006_LCD_NOISE_FRAME, g_stCfg_FT8006_BasicThreshold.iLCDNoiseTestFrame & 0xff); + ReCode = FT8006_WriteReg(g_FT8006, REG_8006_LCD_NOISE_FRAME+1, (g_stCfg_FT8006_BasicThreshold.iLCDNoiseTestFrame >> 8) & 0xff); + + + ReCode = FT8006_WriteReg(g_FT8006, 0x01, 0xAD); + + + ReCode = FT8006_WriteReg(g_FT8006, REG_8006_LCD_NOISE_START, 0x01); + + + for (iRetry = 0; iRetry < 50; ++iRetry) { + + ReCode = Ft8006m_ReadReg(REG_8006_LCD_NOISE_START, &status); + if (status == 0x00) + break; + Ft8006m_SysDelay(500); + } + + if (iRetry == 50) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nScan Noise Time Out!"); + goto TEST_END; + } + + + memset(m_RawData, 0, sizeof(m_RawData)); + memset(ScreenNoiseData, 0, sizeof(ScreenNoiseData)); + + ReadBytesByKey(0x6A, ft8006m_g_stSCapConfEx.ChannelXNum * ft8006m_g_stSCapConfEx.ChannelYNum * 2 + ft8006m_g_stSCapConfEx.KeyNumTotal * 2, ScreenNoiseData); + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + index = iRow * ft8006m_g_stSCapConfEx.ChannelYNum + iCol; + m_RawData[iRow][iCol] = (int)(short)((ScreenNoiseData[index * 2] << 8) + ScreenNoiseData[index * 2 + 1]); + } + } + + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; ++iCol) { + index = ft8006m_g_stSCapConfEx.ChannelXNum * ft8006m_g_stSCapConfEx.ChannelYNum + iCol; + m_RawData[ft8006m_g_stSCapConfEx.ChannelXNum][iCol] = (int)(short)((ScreenNoiseData[index * 2] << 8) + ScreenNoiseData[index * 2 + 1]); + } + + ReCode = FT8006_EnterWork(g_FT8006); + Ft8006m_SysDelay(100); + ReCode = Ft8006m_ReadReg(0x80, &chNoiseValue); + ReCode = FT8006_EnterFactory(g_FT8006); + Ft8006m_SysDelay(100); + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum + 1; ++iRow) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + LCD_Noise[iRow][iCol] = ft8006m_focal_abs(m_RawData[iRow][iCol]); + } + } + + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum+1; ++iRow) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + + FTS_TEST_DBG("%4d, ", LCD_Noise[iRow][iCol]); + } + } + FTS_TEST_DBG("\n"); + + iValueMin = 0; + iValueMax = g_stCfg_FT8006_BasicThreshold.iLCDNoiseCoefficient * chNoiseValue * 32 / 100; + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum+1; iRow++) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + if (ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + + iValue = LCD_Noise[iRow][iCol]; + if (iValue < iValueMin || iValue > iValueMax) { + bResultFlag = false; + FTS_TEST_ERROR(" LCD Noise test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d). \n", + iRow+1, iCol+1, iValue, iValueMin, iValueMax); + } + } + } + + Save_Test_Data(LCD_Noise, 0, ft8006m_g_stSCapConfEx.ChannelXNum, ft8006m_g_stSCapConfEx.ChannelYNum, 1); + + +TEST_END: + + FT8006_WriteReg(g_FT8006, 0x06, oldMode); + Ft8006m_SysDelay(20); + + if (bResultFlag) { + FTS_TEST_INFO("\r\n\r\n//LCD Noise Test is OK!"); + *bTestResult = true; + } else { + FTS_TEST_INFO("\r\n\r\n//LCD Noise Test is NG!"); + *bTestResult = false; + } + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "LCD Noise Test is %s. \n\n", (bResultFlag ? "OK" : "NG")); + + return ReCode; +} + + +static unsigned char ChipClb(unsigned char *pClbResult) +{ + unsigned char RegData = 0; + unsigned char TimeOutTimes = 50; + unsigned char ReCode = ERROR_CODE_OK; + + ReCode = Ft8006m_WriteReg(REG_CLB, 4); + + if (ReCode == ERROR_CODE_OK) { + while (TimeOutTimes--) { + Ft8006m_SysDelay(100); + ReCode = Ft8006m_WriteReg(DEVIDE_MODE_ADDR, 0x04<<4); + ReCode = Ft8006m_ReadReg(0x04, &RegData); + if (ReCode == ERROR_CODE_OK) { + if (RegData == 0x02) { + *pClbResult = 1; + break; + } + } else { + break; + } + } + + if (TimeOutTimes == 0) { + *pClbResult = 0; + } + } + return ReCode; +} +/************************************************************************ +* Name: FT8006M_get_test_data +* Brief: get data of test result +* Input: none +* Output: pTestData, the returned buff +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int FT8006M_get_test_data(char *pTestData) +{ + if (NULL == pTestData) { + FTS_TEST_DBG(" pTestData == NULL "); + return -EPERM; + } + memcpy(pTestData, ft8006m_g_pStoreAllData, (ft8006m_g_lenStoreMsgArea+ft8006m_g_lenStoreDataArea)); + return (ft8006m_g_lenStoreMsgArea+ft8006m_g_lenStoreDataArea); +} + + +/************************************************************************ +* Name: Save_Test_Data +* Brief: Storage format of test data +* Input: int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount +* Output: none +* Return: none +***********************************************************************/ +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount) +{ + int iLen = 0; + int i = 0, j = 0; + + + iLen = sprintf(ft8006m_g_pTmpBuff, "NA, %d, %d, %d, %d, %d, ", \ + ft8006m_m_ucTestItemCode, Row, Col, ft8006m_m_iStartLine, ItemCount); + memcpy(ft8006m_g_pMsgAreaLine2+ft8006m_g_lenMsgAreaLine2, ft8006m_g_pTmpBuff, iLen); + ft8006m_g_lenMsgAreaLine2 += iLen; + + ft8006m_m_iStartLine += Row; + ft8006m_m_iTestDataCount++; + + + for (i = 0+iArrayIndex; (i < Row+iArrayIndex) && (i < TX_NUM_MAX); i++) { + for (j = 0; (j < Col) && (j < RX_NUM_MAX); j++) { + if (j == (Col - 1)) + iLen = sprintf(ft8006m_g_pTmpBuff, "%d, \n", iData[i][j]); + else + iLen = sprintf(ft8006m_g_pTmpBuff, "%d, ", iData[i][j]); + + memcpy(ft8006m_g_pStoreDataArea+ft8006m_g_lenStoreDataArea, ft8006m_g_pTmpBuff, iLen); + ft8006m_g_lenStoreDataArea += iLen; + } + } + +} + + +/************************************************************************ +* Name: StartScan(Same function name as FT_MultipleTest) +* Brief: Scan TP, do it before read Raw Data +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static int StartScan() +{ + unsigned char RegVal = 0x00; + unsigned char times = 0; + const unsigned char MaxTimes = 250; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + + + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RegVal); + printk("hb1 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + if (ReCode == ERROR_CODE_OK) { + RegVal |= 0x80; + ReCode = Ft8006m_WriteReg(DEVIDE_MODE_ADDR, RegVal); + printk("hb2 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + if (ReCode == ERROR_CODE_OK) { + while (times++ < MaxTimes) { + Ft8006m_SysDelay(16); + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RegVal); + printk("hb3 :RegVal:0x%x, ReCode:0x%x, times:0x%x\n", RegVal, ReCode, times); + if (ReCode == ERROR_CODE_OK) { + if ((RegVal>>7) == 0) { + printk("hb4 :RegVal>>7:0x%x, ReCode:0x%x\n", RegVal>>7, ReCode); + break; + } + } else { + printk("hb5 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + break; + } + } + if (times < MaxTimes) { + printk("hb6 :times:0x%x, MaxTimes:0x%x ------OK\n", times, MaxTimes); + ReCode = ERROR_CODE_OK; + } else { + printk("hb6 :times:0x%x, MaxTimes:0x%x ------FAIL\n", times, MaxTimes); + ReCode = ERROR_CODE_COMM_ERROR; + } + } + } + return ReCode; + +} +/************************************************************************ +* Name: ReadRawData(Same function name as FT_MultipleTest) +* Brief: read Raw Data +* Input: Freq(No longer used, reserved), LineNum, ByteNum +* Output: pRevBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + unsigned char I2C_wBuffer[3] = {0}; + unsigned char pReadData[ByteNum]; + + int i, iReadNum; + unsigned short BytesNumInTestMode1 = 0; + + iReadNum = ByteNum/BYTES_PER_TIME; + + if (0 != (ByteNum%BYTES_PER_TIME)) + iReadNum++; + + if (ByteNum <= BYTES_PER_TIME) { + BytesNumInTestMode1 = ByteNum; + } else { + BytesNumInTestMode1 = BYTES_PER_TIME; + } + + ReCode = Ft8006m_WriteReg(REG_LINE_NUM, LineNum); + + + + I2C_wBuffer[0] = REG_RawBuf0; + if (ReCode == ERROR_CODE_OK) { + ft8006m_focal_msleep(10); + ReCode = Ft8006m_Comm_Base_IIC_IO(I2C_wBuffer, 1, pReadData, BytesNumInTestMode1); + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) + break; + + if (i == iReadNum-1) { + ft8006m_focal_msleep(10); + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadData+BYTES_PER_TIME*i, ByteNum-BYTES_PER_TIME*i); + } else { + ft8006m_focal_msleep(10); + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadData+BYTES_PER_TIME*i, BYTES_PER_TIME); + } + + } + + if (ReCode == ERROR_CODE_OK) { + for (i = 0; i < (ByteNum>>1); i++) { + pRevBuffer[i] = (pReadData[i<<1]<<8)+pReadData[(i<<1)+1]; + } + } + + + return ReCode; + +} +static unsigned char FT8006_GetTxRxCB(struct FT8006 *g_FT8006, unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + struct CSChipAddrMgr mgr; + + FTS_TEST_FUNC_ENTER(); + + if (ChipHasTwoHeart(g_FT8006)) { + memset(bufferMaster, 0, sizeof(bufferMaster)); + memset(bufferSlave, 0, sizeof(bufferSlave)); + memset(bufferCated, 0, sizeof(bufferCated)); + + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = GetTxRxCB(0, GetMasterTx(g_FT8006->m_csInfo) * GetMasterRx(g_FT8006->m_csInfo) + 6, (unsigned char *)bufferMaster); + + + WorkAsSlave(&mgr); + ReCode = GetTxRxCB(0, GetSlaveTx(g_FT8006->m_csInfo) * GetSlaveRx(g_FT8006->m_csInfo) + 6, (unsigned char *)bufferSlave); + + CatSingleToOneScreen(g_FT8006); + + memcpy(pReadBuffer, (unsigned char *)bufferCated + StartNodeNo, ReadNum); + + CSChipAddrMgr_Exit(&mgr); + } else { + ReCode = GetTxRxCB(StartNodeNo, ReadNum, pReadBuffer); + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} +/************************************************************************ +* Name: GetTxRxCB(Same function name as FT_MultipleTest) +* Brief: get CB of Tx/Rx +* Input: StartNodeNo, ReadNum +* Output: pReadBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetTxRxCB(unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + unsigned short usReturnNum = 0; + unsigned short usTotalReturnNum = 0; + unsigned char wBuffer[4] = {0}; + int i, iReadNum; + + iReadNum = ReadNum/BYTES_PER_TIME; + + if (0 != (ReadNum%BYTES_PER_TIME)) + iReadNum++; + + wBuffer[0] = REG_CbBuf0; + + usTotalReturnNum = 0; + + for (i = 1; i <= iReadNum; i++) { + if (i*BYTES_PER_TIME > ReadNum) + usReturnNum = ReadNum - (i-1)*BYTES_PER_TIME; + else + usReturnNum = BYTES_PER_TIME; + + wBuffer[1] = (StartNodeNo+usTotalReturnNum) >> 8; + wBuffer[2] = (StartNodeNo+usTotalReturnNum)&0xff; + + ReCode = Ft8006m_WriteReg(REG_CbAddrH, wBuffer[1]); + ReCode = Ft8006m_WriteReg(REG_CbAddrL, wBuffer[2]); + + ReCode = Ft8006m_Comm_Base_IIC_IO(wBuffer, 1, pReadBuffer+usTotalReturnNum, usReturnNum); + + usTotalReturnNum += usReturnNum; + + if (ReCode != ERROR_CODE_OK) + return ReCode; + + + } + + return ReCode; +} + + + + +static unsigned char GetPanelRows(unsigned char *pPanelRows) +{ + return Ft8006m_ReadReg(REG_TX_NUM, pPanelRows); +} + + + + +static unsigned char GetPanelCols(unsigned char *pPanelCols) +{ + return Ft8006m_ReadReg(REG_RX_NUM, pPanelCols); +} + + +/************************************************************************ +* Name: GetChannelNum +* Brief: Get Num of Ch_X, Ch_Y and key +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetChannelNum(void) +{ + unsigned char ReCode; + + int i ; + unsigned char rBuffer[1]; + + + + for (i = 0; i < 3; i++) { + ReCode = GetPanelRows(rBuffer); + if (ReCode == ERROR_CODE_OK) { + if (0 < rBuffer[0] && rBuffer[0] < 80) { + ft8006m_g_stSCapConfEx.ChannelXNum = rBuffer[0]; + if (ft8006m_g_stSCapConfEx.ChannelXNum > ft8006m_g_ScreenSetParam.iUsedMaxTxNum) { + FTS_TEST_ERROR("Failed to get Channel X number, Get num = %d, UsedMaxNum = %d", + ft8006m_g_stSCapConfEx.ChannelXNum, ft8006m_g_ScreenSetParam.iUsedMaxTxNum); + ft8006m_g_stSCapConfEx.ChannelXNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + + break; + } else { + Ft8006m_SysDelay(150); + continue; + } + } else { + FTS_TEST_ERROR("Failed to get Channel X number"); + Ft8006m_SysDelay(150); + } + } + + + for (i = 0; i < 3; i++) { + ReCode = GetPanelCols(rBuffer); + if (ReCode == ERROR_CODE_OK) { + if (0 < rBuffer[0] && rBuffer[0] < 80) { + ft8006m_g_stSCapConfEx.ChannelYNum = rBuffer[0]; + if (ft8006m_g_stSCapConfEx.ChannelYNum > ft8006m_g_ScreenSetParam.iUsedMaxRxNum) { + + FTS_TEST_ERROR("Failed to get Channel Y number, Get num = %d, UsedMaxNum = %d", + ft8006m_g_stSCapConfEx.ChannelYNum, ft8006m_g_ScreenSetParam.iUsedMaxRxNum); + ft8006m_g_stSCapConfEx.ChannelYNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + break; + } else { + Ft8006m_SysDelay(150); + continue; + } + } else { + FTS_TEST_ERROR("Failed to get Channel Y number"); + Ft8006m_SysDelay(150); + } + } + + + for (i = 0; i < 3; i++) { + unsigned char regData = 0; + ft8006m_g_stSCapConfEx.KeyNum = 0; + ReCode = Ft8006m_ReadReg(FT8006_LEFT_KEY_REG, ®Data); + if (ReCode == ERROR_CODE_OK) { + if (((regData >> 0) & 0x01)) { + ft8006m_g_stSCapConfEx.bLeftKey1 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + if (((regData >> 1) & 0x01)) { + ft8006m_g_stSCapConfEx.bLeftKey2 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + if (((regData >> 2) & 0x01)) { + ft8006m_g_stSCapConfEx.bLeftKey3 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + + } else { + FTS_TEST_ERROR("Failed to get Key number"); + Ft8006m_SysDelay(150); + continue; + } + ReCode = Ft8006m_ReadReg(FT8006_RIGHT_KEY_REG, ®Data); + if (ReCode == ERROR_CODE_OK) { + if (((regData >> 0) & 0x01)) { + ft8006m_g_stSCapConfEx.bRightKey1 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + if (((regData >> 1) & 0x01)) { + ft8006m_g_stSCapConfEx.bRightKey2 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + if (((regData >> 2) & 0x01)) { + ft8006m_g_stSCapConfEx.bRightKey3 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + + + break; + } else { + FTS_TEST_ERROR("Failed to get Key number"); + Ft8006m_SysDelay(150); + continue; + } + } + + + + FTS_TEST_INFO("CH_X = %d, CH_Y = %d, Key = %d", ft8006m_g_stSCapConfEx.ChannelXNum , ft8006m_g_stSCapConfEx.ChannelYNum, ft8006m_g_stSCapConfEx.KeyNum); + return ReCode; +} + +/************************************************************************ +* Name: GetRawData +* Brief: Get Raw Data of VA area and Key area +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetRawData(struct FT8006 *g_FT8006) +{ + int ReCode = ERROR_CODE_OK; + int iRow, iCol; + + FTS_TEST_FUNC_ENTER(); + + + + ReCode = FT8006_StartScan(g_FT8006); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Scan ..."); + return ReCode; + } + + + + + memset(m_RawData, 0, sizeof(m_RawData)); + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + ReCode = FT8006_ReadRawData(g_FT8006, 0, 0xAD, ft8006m_g_stSCapConfEx.ChannelXNum * ft8006m_g_stSCapConfEx.ChannelYNum * 2, m_iTempRawData); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Get RawData"); + return ReCode; + } + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + m_RawData[iRow][iCol] = m_iTempRawData[iRow * ft8006m_g_stSCapConfEx.ChannelYNum + iCol]; + } + } + + + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + ReCode = FT8006_ReadRawData(g_FT8006, 0, 0xAE, ft8006m_g_stSCapConfEx.KeyNumTotal * 2, m_iTempRawData); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Get RawData"); + return ReCode; + } + + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; ++iCol) { + + m_RawData[ft8006m_g_stSCapConfEx.ChannelXNum][iCol] = m_iTempRawData[iCol]; + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} +unsigned char FT8006_ReadRawData(struct FT8006 *g_FT8006, unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + + FTS_TEST_FUNC_ENTER(); + + if (ChipHasTwoHeart(g_FT8006)) { + + struct CSChipAddrMgr mgr; + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = ReadRawData(Freq, LineNum, ByteNum, pRevBuffer); + + CSChipAddrMgr_Exit(&mgr); + } else { + + ReCode = ReadRawData(Freq, LineNum, ByteNum, pRevBuffer); + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} + +unsigned char FT8006_EnterFactory(struct FT8006 *g_FT8006) +{ + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + + ReleaseCSInfo(g_FT8006); + + ReCode = Ft8006m_EnterFactory(); + + + UpDateCSInfo(g_FT8006); + + + return ReCode; +} +unsigned char FT8006_EnterWork(struct FT8006 *g_FT8006) +{ + unsigned char ReCode = ERROR_CODE_OK; + if (ChipHasTwoHeart(g_FT8006)) { + + struct CSChipAddrMgr mgr; + + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = Ft8006m_EnterWork(); + CSChipAddrMgr_Exit(&mgr); + + } else { + + ReCode = Ft8006m_EnterWork(); + } + + return ReCode; +} + +unsigned char FT8006_ChipClb(struct FT8006 *g_FT8006, unsigned char *pClbResult) +{ + unsigned char ReCode = ERROR_CODE_OK; + + FTS_TEST_FUNC_ENTER(); + + if (ChipHasTwoHeart(g_FT8006)) { + + struct CSChipAddrMgr mgr; + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? ChipClb(pClbResult) : ReCode; + + WorkAsSlave(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? ChipClb(pClbResult) : ReCode; + + CSChipAddrMgr_Exit(&mgr); + } else { + + ReCode = ChipClb(pClbResult); + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} +unsigned char FT8006_WeakShort_GetAdcData(struct FT8006 *g_FT8006, int AllAdcDataLen, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + struct CSChipAddrMgr mgr; + + FTS_TEST_FUNC_ENTER(); + + if (ChipHasTwoHeart(g_FT8006)) { + memset(bufferMaster, 0, sizeof(bufferMaster)); + memset(bufferSlave, 0, sizeof(bufferSlave)); + memset(bufferCated, 0, sizeof(bufferCated)); + + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = WeakShort_StartAdcScan(); + + WorkAsMaster(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? WeakShort_GetScanResult() : ReCode; + ReCode = (ReCode == ERROR_CODE_OK) ? WeakShort_GetAdcResult(AllAdcDataLen, bufferMaster) : ReCode; + + WorkAsSlave(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? WeakShort_GetScanResult() : ReCode; + ReCode = (ReCode == ERROR_CODE_OK) ? WeakShort_GetAdcResult(AllAdcDataLen, bufferSlave) : ReCode; + + + CatSingleToOneScreen(g_FT8006); + + memcpy(pRevBuffer, bufferCated, AllAdcDataLen * sizeof(unsigned int)); + + CSChipAddrMgr_Exit(&mgr); + + } else { + ReCode = WeakShort_GetAdcData(AllAdcDataLen, pRevBuffer); + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} +unsigned char WeakShort_StartAdcScan() +{ + return Ft8006m_WriteReg(0x0F, 1); +} + +unsigned char FT8006_WriteReg(struct FT8006 *g_FT8006, unsigned char RegAddr, unsigned char RegData) +{ + unsigned char ReCode = ERROR_CODE_OK; + if (ChipHasTwoHeart(g_FT8006)) { + + struct CSChipAddrMgr mgr; + + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? Ft8006m_WriteReg(RegAddr, RegData) : ReCode; + + WorkAsSlave(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? Ft8006m_WriteReg(RegAddr, RegData) : ReCode; + + CSChipAddrMgr_Exit(&mgr); + } else { + + ReCode = Ft8006m_WriteReg(RegAddr, RegData); + } + + return ReCode; +} + +unsigned char WeakShort_GetScanResult() +{ + unsigned char RegMark = 0; + unsigned char ReCode = ERROR_CODE_OK; + int index = 0; + + for (index = 0; index < 50; ++index) { + Ft8006m_SysDelay(50); + ReCode = Ft8006m_ReadReg(0x10, &RegMark); + if (ERROR_CODE_OK == ReCode && 0 == RegMark) + break; + } + + return ReCode; +} + +unsigned char WeakShort_GetAdcResult(int AllAdcDataLen, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + int index = 0; + int i = 0; + int usReturnNum = 0; + unsigned char wBuffer[2] = {0}; + int iReadNum = 0; + + FTS_TEST_FUNC_ENTER(); + + iReadNum = AllAdcDataLen / BYTES_PER_TIME; + if ((AllAdcDataLen % BYTES_PER_TIME) > 0) + ++iReadNum; + + memset(wBuffer, 0, sizeof(wBuffer)); + wBuffer[0] = 0x89; + memset(pReadBuffer, 0, sizeof(pReadBuffer)); + + usReturnNum = BYTES_PER_TIME; + if (ReCode == ERROR_CODE_OK) { + ReCode = Ft8006m_Comm_Base_IIC_IO(wBuffer, 1, pReadBuffer, usReturnNum); + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Comm_Base_IIC_IO error. !!!"); + break; + } + + if (i == iReadNum-1) { + usReturnNum = AllAdcDataLen-BYTES_PER_TIME*i; + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadBuffer+BYTES_PER_TIME*i, usReturnNum); + } else { + usReturnNum = BYTES_PER_TIME; + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadBuffer+BYTES_PER_TIME*i, usReturnNum); + } + } + + for (index = 0; index < AllAdcDataLen/2; ++index) { + pRevBuffer[index] = (pReadBuffer[index * 2] << 8) + pReadBuffer[index * 2 + 1]; + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} +/************************************************************************ +* Name: WeakShort_GetAdcData +* Brief: Get Adc Data +* Input: AllAdcDataLen +* Output: pRevBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char WeakShort_GetAdcData(int AllAdcDataLen, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + unsigned char RegMark = 0; + int index = 0; + int i = 0; + int usReturnNum = 0; + unsigned char wBuffer[2] = {0}; + + int iReadNum = 0; + + FTS_TEST_FUNC_ENTER(); + + memset(wBuffer, 0, sizeof(wBuffer)); + wBuffer[0] = 0x89; + + iReadNum = AllAdcDataLen / BYTES_PER_TIME; + if ((AllAdcDataLen % BYTES_PER_TIME) > 0) + ++iReadNum; + + ReCode = Ft8006m_WriteReg(0x0F, 1); + + for (index = 0; index < 50; ++index) { + Ft8006m_SysDelay(50); + ReCode = Ft8006m_ReadReg(0x10, &RegMark); + if (ERROR_CODE_OK == ReCode && 0 == RegMark) + break; + } + if (index >= 50) { + FTS_TEST_ERROR("Ft8006m_ReadReg failed, ADC data not OK."); + return 6; + } + + { + usReturnNum = BYTES_PER_TIME; + if (ReCode == ERROR_CODE_OK) { + ReCode = Ft8006m_Comm_Base_IIC_IO(wBuffer, 1, pReadBuffer, usReturnNum); + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Comm_Base_IIC_IO error. !!!"); + break; + } + + if (i == iReadNum-1) { + usReturnNum = AllAdcDataLen-BYTES_PER_TIME*i; + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadBuffer+BYTES_PER_TIME*i, usReturnNum); + } else { + usReturnNum = BYTES_PER_TIME; + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadBuffer+BYTES_PER_TIME*i, usReturnNum); + } + } + } + + for (index = 0; index < AllAdcDataLen/2; ++index) { + pRevBuffer[index] = (pReadBuffer[index * 2] << 8) + pReadBuffer[index * 2 + 1]; + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} + +unsigned char ReadBytesByKey(BYTE key, int ByteNum, unsigned char *byteData) +{ + + unsigned char ReCode = ERROR_CODE_OK; + unsigned char I2C_wBuffer[3] = {0}; + unsigned short BytesNumInTestMode1 = 0; + int i = 0; + int iReadNum = 0; + + FTS_TEST_FUNC_ENTER(); + + iReadNum = ByteNum/BYTES_PER_TIME; + + if (0 != (ByteNum%BYTES_PER_TIME)) + iReadNum++; + + if (ByteNum <= BYTES_PER_TIME) { + BytesNumInTestMode1 = ByteNum; + } else { + BytesNumInTestMode1 = BYTES_PER_TIME; + } + + + I2C_wBuffer[0] = key; + if (ReCode == ERROR_CODE_OK) { + ReCode = Ft8006m_Comm_Base_IIC_IO(I2C_wBuffer, 1, byteData, BytesNumInTestMode1); + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) + break; + + if (i == iReadNum-1) { + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, byteData + BYTES_PER_TIME*i, ByteNum-BYTES_PER_TIME*i); + } else + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, byteData + BYTES_PER_TIME*i, BYTES_PER_TIME); + + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} + +unsigned char FT8006_StartScan(struct FT8006 *g_FT8006) +{ + unsigned char ReCode = ERROR_CODE_OK; + + FTS_TEST_FUNC_ENTER(); + + if (ChipHasTwoHeart(g_FT8006)) { + + struct CSChipAddrMgr mgr; + + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = StartScan(); + CSChipAddrMgr_Exit(&mgr); + } else { + + ReCode = StartScan(); + } + + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} + + + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_supported_ic.c b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_supported_ic.c new file mode 100755 index 0000000000000..a723150a6b9f4 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_supported_ic.c @@ -0,0 +1,268 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.c +* +* Author: Software Development +* +* Created: 2016-08-01 +* +* Abstract: test item for FT8716 +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ + + +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + + + +#if (FTS_CHIP_TEST_TYPE == FT8607_TEST) +void OnInit_FT8607_TestItem(char *strIniFile); +void OnInit_FT8607_BasicThreshold(char *strIniFile); +void SetTestItem_FT8607(void); +boolean FT8607_StartTest(void); +int FT8607_ft8006m_get_test_data(char *pTestData); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT8607_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8607_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT8607; + ft8006m_g_stTestFuncs.Start_Test = FT8607_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT8607_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FTS_CHIP_TEST_TYPE == FT8716_TEST) + +boolean FT8006m_StartTest(void); +int FT8006M_get_test_data(char *pTestData); + +void OnInit_FT8006m_TestItem(char *strIniFile); +void OnInit_FT8006M_BasicThreshold(char *strIniFile); +void SetTestItem_FT8006m(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT8006m_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8006M_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT8006m; + ft8006m_g_stTestFuncs.Start_Test = FT8006m_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT8006M_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT3D47_TEST) +boolean FT3D47_StartTest(void); + +int FT3D47_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT3D47_TestItem(char *strIniFile); +void OnInit_FT3D47_BasicThreshold(char *strIniFile); +void SetTestItem_FT3D47(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT3D47_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT3D47_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT3D47; + ft8006m_g_stTestFuncs.Start_Test = FT3D47_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT3D47_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT5X46_TEST) + +boolean FT5X46_StartTest(void); +int FT5X46_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT5X46_TestItem(char *strIniFile); +void OnInit_FT5X46_BasicThreshold(char *strIniFile); +void SetTestItem_FT5X46(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT5X46_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5X46_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT5X46; + ft8006m_g_stTestFuncs.Start_Test = FT5X46_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT5X46_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT6X36_TEST) + +boolean FT6X36_StartTest(void); +int FT6X36_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT6X36_TestItem(char *strIniFile); +void OnInit_FT6X36_BasicThreshold(char *strIniFile); +void SetTestItem_FT6X36(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT6X36_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT6X36_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT6X36; + ft8006m_g_stTestFuncs.Start_Test = FT6X36_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT6X36_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT5822_TEST) + +boolean FT5822_StartTest(void); +int FT5822_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT5822_TestItem(char *strIniFile); +void OnInit_FT5822_BasicThreshold(char *strIniFile); +void SetTestItem_FT5822(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT5822_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5822_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT5822; + ft8006m_g_stTestFuncs.Start_Test = FT5822_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT5822_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT8006_TEST) + +boolean FT8006_StartTest(void); +int FT8006M_get_test_data(char *pTestData); + +void OnInit_FT8006_TestItem(char *strIniFile); +void OnInit_FT8006_BasicThreshold(char *strIniFile); +void SetTestItem_FT8006(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT8006_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8006_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT8006; + ft8006m_g_stTestFuncs.Start_Test = FT8006_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT8006M_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FTS_CHIP_TEST_TYPE == FT8736_TEST) + +boolean FT8736_StartTest(void); +int FT8736_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT8736_TestItem(char *strIniFile); +void OnInit_FT8736_BasicThreshold(char *strIniFile); +void SetTestItem_FT8736(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT8736_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8736_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT8736; + ft8006m_g_stTestFuncs.Start_Test = FT8736_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT8736_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FTE716_TEST) + +boolean FTE716_StartTest(void); +int FTE716_ft8006m_get_test_data(char *pTestData); + +void OnInit_FTE716_TestItem(char *strIniFile); +void OnInit_FTE716_BasicThreshold(char *strIniFile); +void SetTestItem_FTE716(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FTE716_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FTE716_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FTE716; + ft8006m_g_stTestFuncs.Start_Test = FTE716_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FTE716_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT8606_TEST) + +boolean FT8606_StartTest(void); +int FT8606_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT8606_TestItem(char *strIniFile); +void OnInit_FT8606_BasicThreshold(char *strIniFile); +void SetTestItem_FT8606(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT8606_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8606_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT8606; + ft8006m_g_stTestFuncs.Start_Test = FT8606_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT8606_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT3C47_TEST) + +boolean FT3C47_StartTest(void); +int FT3C47_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT3C47_TestItem(char *strIniFile); +void OnInit_FT3C47_BasicThreshold(char *strIniFile); +void SetTestItem_FT3C47(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT3C47_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT3C47_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT3C47; + ft8006m_g_stTestFuncs.Start_Test = FT3C47_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT3C47_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} +#endif + + diff --git a/drivers/input/touchscreen/FT8006m/include/firmware/FT8006m_app_sample.i b/drivers/input/touchscreen/FT8006m/include/firmware/FT8006m_app_sample.i new file mode 100644 index 0000000000000..e0c4cd30147b6 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/include/firmware/FT8006m_app_sample.i @@ -0,0 +1,5329 @@ +0x0, 0x0, 0x0, 0x60,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0xe0,0x60,0x3c,0x0, 0xcc,0x2, 0xe0,0x60,0x3c,0x10,0xea,0x0, 0xc8,0x3, 0xe0,0xff, +0xc8,0x7c,0xfa,0x0, 0xcf,0x82,0xf0,0x36,0xcf,0xd8,0xea,0x0, 0xcc,0x0, 0xe0,0x0, +0xcc,0x0, 0xe0,0x60,0x3c,0x17,0xea,0x0, 0xcc,0x2, 0xe0,0x0, 0xcc,0x0, 0xea,0x0, +0xcc,0x81,0xe0,0x55,0xcc,0xf8,0x3c,0x79,0x1, 0x8, 0xea,0x0, 0xcd,0x2, 0xe0,0x44, +0xcd,0x10,0x3d,0x28,0xe0,0x9, 0xd2,0x8, 0xea,0x0, 0xcc,0x0, 0xe0,0xaf,0xcc,0x44, +0x3c,0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x4d,0x8, 0xb2,0xf7,0xe, 0x87,0xf1,0x78,0x3, 0x12,0xfc,0xed,0xda,0x25,0x6, 0xf9, +0x0, 0x0, 0x0, 0x1, 0xff,0xfe,0x0, 0x0, 0x0, 0x0, 0xc8,0x37,0x0, 0x0, 0x80,0xa6, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x31,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xe0,0x1, 0x1f,0xde,0xe6,0x1, 0x16,0xff,0xa7,0x8f,0x34,0x28,0xa7,0x5f,0x3f,0x5d, +0xbf,0x5f,0xa7,0x5f,0x3c,0x4e,0xbc,0x5f,0x38,0x82,0xe0,0x2, 0x1e,0xbf,0xe0,0x2, +0x1f,0x51,0x8f,0xdd,0x8e,0x4d,0xe0,0x1, 0x1e,0xe0,0x3f,0xbc,0x37,0xa1,0xb7,0x8e, +0x9f,0x8e,0x37,0xc9,0xe0,0x3, 0xaf,0xcd,0x9f,0x8e,0x37,0xc1,0xe0,0x3, 0xaf,0xdd, +0x38,0x82,0x8, 0xb2,0xe0,0x1, 0x19,0x60,0xe0,0x6, 0x8c,0x12,0xe0,0x6, 0x8c,0xa2, +0xe0,0x2, 0xda,0xe0,0xe4,0x8, 0x34,0x21,0xe0,0x3, 0x9f,0xc2,0xe4,0x8, 0x34,0x40, +0x3c,0x7f,0x3, 0x88,0xe0,0x1, 0x1f,0x28,0xe0,0x3, 0xb4,0x42,0x9f,0x8e,0xcf,0xa0, +0xb7,0x8e,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xa3,0xe0,0x1a,0x17,0x20,0x3f,0x1f, +0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0xe0,0x1, 0x19,0x60,0x37,0x28,0x3c,0x4e, +0x17,0x81,0xaf,0xc2,0xe0,0x6, 0xda,0xf7,0xe0,0x2, 0x1f,0xbf,0xe0,0x19,0x16,0x9d, +0x17,0x7, 0x3e,0x9f,0xaf,0xd, 0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0xe0,0x1, 0xd9,0xa5, +0x17,0x82,0xaf,0xc2,0x9, 0x61,0xe0,0x1, 0x1f,0xb1,0x16,0x7b,0xa6,0x8f,0xa7,0xcd, +0xa7,0x4d,0x37,0xc2,0xe2,0x0, 0xc7,0x81,0xe4,0x0, 0xcf,0x81,0x37,0xa2,0x3f,0x5c, +0x3f,0xce,0xbf,0xcd,0x38,0x82,0xe0,0x0, 0xc4,0x70,0xe2,0x1, 0xc4,0x7f,0xe2,0x0, +0xcc,0x4, 0x2, 0xa2,0xea,0x15,0x7f,0x84,0xe9,0xff,0xc7,0xff,0x34,0x22,0x3c,0x1f, +0xa7,0x88,0x3f,0x82,0xe0,0x1, 0x1f,0xac,0xe0,0x2, 0x8c,0x6f,0x38,0x82,0xe0,0x1, +0x1f,0xac,0xe0,0x2, 0x8c,0x7f,0x38,0x82,0xe0,0x1, 0x1f,0xac,0xe0,0x2, 0x8c,0x3f, +0x38,0x82,0xe0,0x1, 0x1f,0xac,0xe0,0x2, 0x8c,0x4f,0x38,0x82,0xe0,0x1, 0x1f,0xac, +0xe0,0x2, 0x8c,0x5f,0x38,0x82,0xe0,0x1, 0x14,0x7e,0x38,0x82,0xe0,0x2, 0x1f,0x73, +0xe0,0x2, 0x1f,0xda,0xa6,0xe, 0x15,0xfe,0xa6,0xcc,0x97,0xf, 0xe2,0x0, 0xc6,0x81, +0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0xfd,0xa6,0xcc,0x97,0xf, 0x36,0xc9,0xe2,0x0, +0xc6,0x82,0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0x77,0x97,0xf, 0x3d,0xe8,0xe3,0xff, +0xc7,0x7b,0xb7,0xf, 0xe7,0xff,0x17,0x10,0xa6,0x4c,0x96,0x8f,0x3f,0x18,0x36,0x4c, +0xe2,0x0, 0xc6,0x8, 0x3e,0xda,0xe2,0x1, 0xc7,0x7f,0x3e,0xcc,0xe2,0x0, 0xcf,0xd, +0xb6,0x8f,0x9e,0x8f,0x2, 0x89,0xea,0x15,0x7f,0x98,0xe9,0xff,0xc7,0xff,0x37,0x22, +0x3f,0x1f,0xa7,0x8e,0x3f,0x82,0xe0,0x1, 0x14,0x7f,0x38,0x82,0x3c,0x6d,0xe2,0x1, +0xc4,0x7f,0x38,0x82,0xe0,0x8, 0x36,0xc8,0x38,0x82,0xe0,0x1, 0x1f,0xb1,0xa7,0x8f, +0xe0,0x1, 0xa4,0x7f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x1, 0x1f,0xde,0xa7,0x8f, +0xa4,0x5f,0x34,0x48,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x1, 0x1e,0xe6,0x16,0x1, +0x8f,0xd, 0xe0,0x1, 0x1f,0xe0,0x3e,0x1e,0xae,0xd, 0xe0,0x1, 0x1e,0xac,0x3e,0x9e, +0xe0,0x4, 0x8f,0x4f,0x8c,0xd, 0xc7,0x1, 0xe0,0x4, 0xaf,0x4f,0xe0,0x4, 0x8f,0x4f, +0x2f,0x6, 0xe0,0x4, 0x8f,0x3f,0xc7,0x1, 0xe0,0x4, 0xaf,0x3f,0xe2,0x0, 0xcd,0xfd, +0x1, 0xcd,0xe0,0x1, 0x1f,0xae,0xe0,0x0, 0x17,0x7c,0xaf,0xf, 0x38,0x82,0xe2,0x0, +0xcc,0x7b,0x1, 0x84,0x3c,0x69,0xe7,0xfd,0x0, 0xf5,0x38,0x82,0xe2,0x1, 0xcc,0x2d, +0x1, 0x7, 0xe2,0x1, 0xcc,0x2e,0x1, 0x83,0xe7,0xfd,0x0, 0xf9,0x38,0x82,0xe0,0x2, +0x1f,0xd1,0x17,0x0, 0xb7,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xd3,0xe1,0xff,0x17,0x7e, +0xa7,0x8f,0x3f,0x58,0x3f,0x9e,0x97,0x8f,0xe2,0x0, 0xc4,0x1, 0xc7,0x81,0xe3,0xff, +0xc7,0xff,0xe2,0x0, 0xcc,0x0, 0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0x37,0xc8,0xe0,0x68, +0x39,0x2f,0x38,0x82,0x8, 0xb1,0x2c,0x17,0xe0,0x0, 0x1f,0xa3,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0xe0,0x0, 0x1, 0x48,0x3c,0x69,0xe0,0x4, 0xd6,0xa3,0xe0,0x1, 0x1f,0xa8, +0x9f,0x8f,0x27,0x88,0xe0,0x1, 0x1f,0x60,0xe0,0x1, 0x8f,0xee,0xcf,0x82,0xe0,0x1, +0xaf,0xee,0x8, 0xe1,0xe2,0x0, 0xcc,0xf, 0x1, 0x3b,0xe2,0x0, 0xcc,0x12,0xe0,0x0, +0x1, 0x52,0xe2,0x0, 0xcc,0x13,0xe0,0x0, 0x1, 0x53,0xe2,0x0, 0xcc,0x11,0x1, 0x3e, +0xe2,0x0, 0xcc,0x1, 0xe0,0x2, 0x1, 0x1b,0xe2,0x0, 0xcc,0x9, 0xe0,0x2, 0x1, 0x35, +0xe2,0x0, 0xcc,0x5b,0xe0,0x0, 0x5, 0xce,0xe7,0xff,0x17,0x94,0x3f,0x98,0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x5, 0xdb,0xe7,0xff,0x17,0x92,0x3f,0x98,0xe2,0x0, 0xcf,0x81, +0xe0,0x3, 0x5, 0xb9,0xe7,0xff,0x17,0x90,0xe0,0xf, 0x3f,0x98,0xe2,0x0, 0xcf,0x8f, +0xe0,0x2, 0x2, 0xe8,0xe2,0x0, 0xcc,0x7b,0xe0,0x3, 0x1, 0x5e,0xe0,0x1, 0x1f,0xa8, +0x0, 0xc0,0xe0,0x2, 0x1f,0xa8,0x8f,0x8f,0xe7,0xff,0x2f,0xb7,0x8, 0xe1,0xe0,0x0, +0x1f,0xa3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x1f,0xe0,0x1, 0x1f,0xe0,0x17,0x1, +0xe0,0x1, 0xaf,0x7f,0xe0,0x2, 0xaf,0xf, 0x8, 0xe1,0xe2,0x0, 0xcc,0x81,0x1, 0x29, +0xe7,0xff,0x2c,0xb1,0xe0,0x1, 0x1f,0xd1,0xa7,0xf, 0xe0,0x2, 0x1f,0xa5,0xbf,0xf, +0x8, 0xe1,0xe0,0x1, 0x1f,0xe0,0xe0,0x2, 0xac,0xaf,0x8, 0xe1,0xe0,0x1, 0x1f,0xe0, +0xe0,0x2, 0xac,0xbf,0x8, 0xe1,0xe0,0x2, 0x1f,0xa8,0x8f,0x8f,0x2f,0xdf,0x8, 0xe1, +0xe2,0x0, 0xcc,0x30,0xe0,0x1, 0x1, 0x6f,0xe2,0x0, 0xcc,0x53,0x2, 0x98,0xea,0x15, +0x7f,0xd0,0xe9,0xff,0xc7,0xff,0xe0,0xe, 0x34,0x22,0x3f,0x9e,0xa7,0x8f,0x3f,0x82, +0xe0,0x1, 0x1f,0xe0,0xe0,0x2, 0x8f,0x1f,0xe7,0xff,0x2f,0x5, 0xe0,0x2, 0xac,0x9f, +0xe7,0xff,0x16,0x80,0x87,0xf, 0x3f,0x4d,0xaf,0xf, 0x8, 0xe1,0xe0,0x0, 0x1f,0xa3, +0x3e,0xe8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x62,0x17,0xf8,0xe0,0x1, +0x1f,0x60,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0x3e,0x9e,0xe2,0x0, 0xcf,0xaf,0xac,0x8d, +0x2, 0x89,0xea,0x18,0x7e,0xa0,0xe9,0xff,0xc6,0xff,0x37,0xa2,0x3f,0x9d,0xa7,0x8f, +0x3f,0x82,0xe0,0x1, 0x1f,0xa8,0x17,0x48,0x3f,0x18,0xe2,0x0, 0xcf,0x1e,0xe0,0x2, +0x5, 0x99,0xe2,0x0, 0xcc,0x57,0xe0,0x2, 0x5, 0x99,0x9f,0xf, 0xe0,0x4, 0xcf,0x0, +0xb7,0xf, 0xe7,0xfe,0x0, 0xc7,0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xcf,0x8, 0xb7,0xf, +0xe7,0xfe,0x0, 0xc0,0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xcf,0x4, 0xb7,0xf, 0xe7,0xfe, +0x0, 0xb9,0xe0,0x4, 0x87,0xbe,0xe0,0x1, 0x1f,0x66,0xe0,0x1, 0x1f,0xa8,0xac,0x8e, +0xe7,0xfe,0x0, 0xb0,0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xe0,0x40,0xcf,0x0, 0xb7,0xf, +0x0, 0xd3,0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xe0,0x80,0xcf,0x0, 0xb7,0xf, 0x0, 0xcc, +0xe0,0x3, 0x8f,0xce,0xe0,0x2, 0x1f,0x51,0x37,0xa8,0x3f,0x99,0x37,0xa1,0xb7,0x8e, +0xe0,0x1, 0x1f,0xa8,0xe7,0xfe,0x0, 0x96,0xe0,0x3, 0x8f,0xae,0xe0,0x2, 0x1f,0x34, +0x37,0xa8,0x3f,0x99,0x37,0xa1,0xb7,0x8e,0x97,0xe, 0xe0,0x0, 0x1f,0xb3,0xb7,0xf, +0xe7,0xfe,0x0, 0xc6,0xe0,0x3, 0x8f,0x8e,0x37,0xa8,0x3c,0x9f,0xe0,0x2, 0x1f,0xc8, +0xb4,0x8f,0xe0,0x1, 0x1f,0xa8,0xe7,0xfd,0x0, 0xfd,0xe0,0x1, 0x1f,0xb1,0x15,0xfb, +0xa6,0xf, 0xe0,0x1, 0x1f,0xa8,0xa7,0x4c,0xa6,0xcc,0x37,0x42,0xe2,0x0, 0xc7,0x1, +0xe4,0x0, 0xcf,0x1, 0x37,0x22,0x3e,0xdb,0x3f,0x4d,0xbf,0x4c,0xe7,0xfd,0x0, 0xea, +0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xcf,0x2, 0xb7,0xf, 0xe7,0xfd,0x0, 0xe3,0xe0,0x1, +0x1f,0xa8,0x9f,0xf, 0xcf,0x1, 0xb7,0xf, 0xe7,0xfd,0x0, 0xdc,0xe0,0x1, 0x1f,0xa8, +0x9f,0xf, 0xe0,0x2, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfe,0x0, 0xff,0xe0,0x1, 0x1f,0xa8, +0x9f,0xf, 0xcf,0x10,0xb7,0xf, 0xe7,0xfd,0x0, 0xcd,0xe0,0x1, 0x1f,0xda,0x8f,0x8f, +0x2f,0x87,0xe0,0x1, 0x1f,0xd1,0xa7,0xf, 0xe0,0x2, 0x1f,0xa5,0xbf,0xf, 0x17,0x0, +0xe0,0x2, 0x1f,0xd1,0xe0,0x1, 0x1e,0xe0,0xb7,0xf, 0xe2,0x1, 0xcc,0xad,0xac,0x9d, +0xe7,0xff,0x1, 0x2f,0xe2,0x1, 0xcc,0xae,0xe7,0xfd,0x1, 0xf2,0xdd,0x7f,0xe0,0x1, +0x1f,0xa8,0xe7,0xfd,0x0, 0xaf,0xe2,0x0, 0xcc,0x85,0xe7,0xfd,0x2, 0xb4,0xe0,0x1, +0x1f,0x60,0xe0,0x1, 0xac,0x9e,0xe0,0x0, 0x2c,0xfb,0xe0,0x2, 0xac,0xde,0xe7,0xfd, +0x0, 0xdf,0xe0,0x1, 0x1f,0x60,0xe0,0x6, 0x8f,0x8e,0xe0,0x2f,0x3c,0x8f,0xe7,0xfd, +0x2f,0xa2,0x17,0x82,0xe1,0x2f,0x3c,0x9f,0xe7,0xfd,0x2f,0x9d,0xe0,0x0, 0x1f,0xa3, +0x16,0xb0,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0xd3,0xe0,0x2, 0x1f,0xa8, +0x8f,0x8f,0xe7,0xfe,0x2f,0x9d,0xe2,0x0, 0xcc,0x4, 0xe7,0xfd,0x1, 0xc, 0xe2,0x0, +0xcc,0x30,0xe7,0xfe,0x1, 0x95,0x8, 0xe1,0xe0,0x1, 0x1f,0xa8,0xe0,0x0, 0x1e,0x33, +0x9f,0xf, 0x15,0x81,0xe0,0x1, 0xcf,0x0, 0xb7,0xf, 0xe2,0x0, 0xcc,0x6d,0xe0,0x2, +0x1f,0x53,0x9e,0x8c,0xa7,0xe, 0x3d,0x9d,0xb5,0x8c,0x3f,0x1d,0xac,0x8e,0xe7,0xfc, +0x1, 0xe9,0xe0,0x1, 0x1f,0x2e,0xe0,0x0, 0x16,0xec,0xae,0x8e,0xe7,0xfc,0x0, 0xe2, +0xe2,0x1, 0xcc,0x6, 0xe0,0x0, 0x1, 0x7e,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x11, +0xe2,0x1, 0xcc,0x8, 0xe7,0xfd,0x1, 0x14,0xe2,0x1, 0xcc,0xb, 0xe0,0x1, 0x1, 0x23, +0xe2,0x1, 0xcc,0xc, 0xe0,0x1, 0x1, 0x33,0xe2,0x1, 0xcc,0xd, 0xe0,0x1, 0x1f,0xa8, +0xe7,0xfc,0x1, 0xc8,0xe0,0x2, 0x1f,0x73,0x16,0x60,0xa6,0x8e,0xe2,0x0, 0xc4,0x9f, +0xe0,0x1, 0xa7,0x5d,0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x5d,0xe7,0xfc,0x0, 0xba, +0x17,0x1, 0x3f,0x58,0xe0,0x0, 0x2f,0x4b,0xe2,0x0, 0xcc,0xa, 0xe7,0xfc,0x1, 0xb2, +0x9f,0xf, 0xe0,0x8, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfc,0x0, 0xac,0xe2,0x0, 0xcc,0x82, +0xe0,0x0, 0x1, 0x58,0xe0,0x1, 0x17,0xfd,0x3f,0xd9,0xe2,0x0, 0xcf,0x81,0x1, 0x6, +0xe2,0x0, 0xcc,0x84,0xe7,0xfc,0x1, 0xdc,0x17,0x82,0xe0,0x2, 0xaf,0xde,0xe7,0xfc, +0x0, 0xd7,0xe0,0x1, 0x1f,0xa8,0xe0,0x1, 0x1e,0xe0,0x9f,0xf, 0xcf,0x40,0xb7,0xf, +0xe0,0x3, 0x8f,0xd, 0xe0,0x3, 0x8d,0x9d,0xe0,0x3, 0x8e,0x1d,0x37,0x28,0xc6,0x1, +0xe0,0x3, 0xae,0x1d,0x3f,0x1b,0xe0,0x3, 0x8e,0x1d,0xe3,0xff,0xc7,0x7f,0x2e,0x6, +0xe0,0x3, 0x8e,0xd, 0xc6,0x1, 0xe0,0x3, 0xae,0xd, 0xe2,0x0, 0xcc,0x6f,0xe0,0x2, +0x1e,0xd9,0xa6,0x8d,0x3f,0x1d,0xac,0x8e,0xe7,0xfb,0x1, 0xf4,0xe0,0x1, 0x1f,0x2e, +0xe0,0x0, 0x16,0xee,0xae,0x8e,0xe7,0xfb,0x0, 0xed,0x9f,0xf, 0xcf,0x20,0xb7,0xf, +0xe7,0xfb,0x0, 0xe8,0x3c,0x69,0xdc,0xa5,0xe0,0x1, 0x1f,0xa8,0xe7,0xfb,0x0, 0xe2, +0xe0,0x1, 0x1f,0xb1,0x16,0x78,0xa6,0x8f,0xe2,0x0, 0xc4,0x87,0xe0,0x1, 0xa7,0x2d, +0xe0,0x1, 0x1f,0xa8,0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x2d,0xe7,0xfb,0x0, 0xd2, +0x16,0x83,0xe0,0x2, 0xae,0xde,0xe0,0x1, 0x1f,0xa8,0xe7,0xfb,0x0, 0xcb,0xe0,0x1, +0x1f,0xb1,0x17,0x3, 0xa6,0x8f,0x3f,0x59,0xe0,0x1, 0xa7,0xad,0xe7,0x9f,0x16,0x7f, +0x37,0x2c,0x3f,0xdc,0x3f,0xce,0xe0,0x1, 0xbf,0xad,0xe7,0xfb,0x0, 0xf9,0xe0,0x6, +0xac,0x8e,0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xe1,0x0, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfb, +0x0, 0xb1,0xe0,0x1, 0x1f,0xb1,0x15,0xe0,0xa7,0xf, 0x16,0x9f,0xe0,0x1, 0xa6,0x3e, +0x3e,0xd9,0x3e,0x5b,0xe0,0x1, 0xbe,0x3e,0xe0,0x1, 0xa6,0x3e,0xe0,0x1, 0x1f,0xa8, +0x3e,0xcc,0xe0,0x1, 0xbe,0xbe,0xe7,0xfb,0x0, 0x9d,0xe0,0x2, 0x1f,0xcc,0x3c,0x69, +0xac,0x8f,0xe0,0x2, 0xd4,0x93,0xe7,0xfb,0x0, 0xd3,0xe2,0x0, 0xcc,0x5b,0x3f,0xe8, +0xe0,0x0, 0x5, 0xf4,0xe7,0xff,0x17,0x16,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, +0x5, 0xf2,0xe0,0x0, 0x17,0x64,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, +0xe0,0x1, 0x5, 0x8c,0xe7,0xff,0x17,0x12,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, +0x5, 0x99,0xe7,0xff,0x17,0x14,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xea, +0xe7,0xff,0x17,0x18,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xc3,0xe0,0x0, +0x17,0x77,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xe0, +0xe7,0xff,0x17,0x10,0x3f,0x18,0xe2,0x0, 0xcf,0xf, 0xe0,0x1, 0x5, 0xee,0xe0,0x0, +0x17,0x7f,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x8c, +0xe2,0x1, 0xcc,0x6, 0xe0,0x1, 0x1, 0x63,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x6f, +0xe2,0x1, 0xcc,0x8, 0xe0,0x2, 0x1, 0x3, 0xe2,0x1, 0xcc,0xb, 0xe0,0x2, 0x1, 0x1, +0xe2,0x1, 0xcc,0xc, 0xe0,0x2, 0x1, 0x5, 0xe2,0x1, 0xcc,0xd, 0xe0,0x2, 0x1, 0x5, +0xe0,0x0, 0x17,0x70,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x4, 0xe0,0x1, +0x2, 0xdf,0xe2,0x1, 0xcc,0x12,0xe0,0x2, 0x1, 0x12,0xe0,0x1, 0x5, 0xfe,0xe2,0x1, +0xcc,0x13,0xe0,0x2, 0x1, 0x2, 0xe2,0x1, 0xcc,0x14,0xe0,0x2, 0x1, 0x83,0xe0,0x1, +0x1f,0xac,0xe0,0x2, 0x8c,0x7f,0x38,0x82,0xe0,0x1, 0x1f,0x60,0x3f,0x9e,0x8c,0xf, +0x38,0x82,0xe0,0x2, 0x1e,0x51,0xe0,0x2, 0x1f,0x25,0x9e,0x8c,0xa7,0xe, 0x15,0x81, +0x3d,0x9d,0xe2,0x0, 0xcf,0xeb,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0x3e,0x38,0x82, +0xe0,0x2, 0x1e,0x34,0xe0,0x2, 0x1f,0x53,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d, +0xe2,0x0, 0xcf,0xed,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xf2,0xe0,0x1, 0x1f,0xae, +0xe0,0x0, 0x17,0x6c,0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1e,0x63,0xe0,0x0, 0x1f,0x35, +0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x9d,0xb5,0x8c,0x3f,0x1d, +0x8c,0xe, 0x1, 0xde,0xe0,0x1, 0x1f,0xae,0xe7,0xff,0x17,0x1c,0xaf,0xf, 0x38,0x82, +0xe0,0x2, 0x1e,0x48,0xe0,0x2, 0x1f,0x59,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d, +0xe2,0x0, 0xcf,0xef,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xca,0xe0,0x1, 0x1f,0xae, +0xe0,0x0, 0x17,0x6e,0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xae,0xe0,0x0, 0x17,0x6a, +0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x60,0x16,0x60,0xe0,0x2, 0x8e,0xfe,0x3e,0x1d, +0xe2,0x0, 0xce,0x1f,0xe0,0x0, 0x2, 0xdb,0xe0,0x1, 0x1e,0x2a,0x3e,0x9c,0xe0,0x44, +0x8c,0xd, 0xe0,0x2, 0x8e,0xfe,0xe2,0x1, 0xcf,0x82,0xc6,0x81,0xe0,0x2, 0xae,0xfe, +0xe7,0xff,0x1, 0xa7,0xe0,0x1, 0x1f,0xae,0xe7,0xff,0x17,0x1, 0xaf,0xf, 0x38,0x82, +0xe0,0x2, 0x1e,0x34,0xe0,0x2, 0x1f,0x53,0x9e,0x8c,0xa7,0xe, 0xe1,0xff,0x15,0xfe, +0x3d,0xdd,0x3f,0x1b,0x97,0xe, 0xe2,0x0, 0xc6,0x81,0xc7,0x1, 0xe3,0xff,0xc7,0x7f, +0xe2,0x0, 0xce,0x80,0x9d,0x8c,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0x37,0x48,0x16,0x81, +0x3e,0x9b,0xe0,0x68,0x39,0x2e,0xe2,0x0, 0xcf,0xe9,0xb6,0x8c,0xe7,0xff,0x1, 0x81, +0xe0,0x1, 0x1f,0xae,0xe0,0x0, 0x17,0x68,0xaf,0xf, 0x38,0x82,0xe0,0x0, 0x1e,0x30, +0xe0,0x1, 0x1f,0x6e,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x8a, +0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0xe7,0xfe,0x1, 0xec,0xe0,0x1, 0x1f,0xae,0xe7,0xff, +0x17,0x9, 0xaf,0xf, 0x38,0x82,0xe7,0xf7,0x0, 0xc3,0xe0,0x1, 0x1f,0xb1,0xa7,0x8f, +0xe0,0x1, 0xa4,0x2f,0xe2,0x0, 0xc4,0x7, 0x38,0x82,0xe0,0x2, 0x8e,0x7e,0xe0,0x1, +0x1e,0xa3,0x3e,0x9c,0x8c,0xd, 0xe7,0xff,0x0, 0xa6,0xe0,0x1, 0x1f,0xb1,0xa7,0x8f, +0xe0,0x1, 0xa4,0x2f,0x34,0x4c,0xe2,0x0, 0xc4,0x3, 0x38,0x82,0xe2,0x1, 0xcf,0xfe, +0x14,0x0, 0xe7,0xfe,0x1, 0xc6,0xe0,0x2, 0x1f,0x8d,0x17,0x5, 0x8f,0x8f,0x3f,0x3f, +0xe0,0x2, 0x1f,0xed,0x3f,0x9e,0x8c,0xf, 0x38,0x82,0x14,0x0, 0x38,0x82,0xe0,0x1, +0x1f,0xb1,0xa7,0x8f,0xe0,0x1, 0xa4,0x3f,0xe2,0x0, 0xc4,0x1f,0x38,0x82,0xe0,0x2, +0x1f,0xcc,0x8c,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xe0,0x1, 0xa4,0x5f, +0xe2,0x0, 0xc4,0x1f,0x38,0x82,0xe2,0x1, 0xcc,0x11,0x1, 0x8b,0xe0,0x1, 0x1f,0xac, +0xe0,0x2, 0x8c,0x4f,0x38,0x82,0xe0,0x1, 0x1f,0xac,0xe0,0x2, 0x8c,0x6f,0x38,0x82, +0xe0,0x1, 0x1f,0xac,0xe0,0x2, 0x8c,0x3f,0x38,0x82,0xe0,0x1, 0x1f,0xac,0xe0,0x2, +0x8c,0x5f,0x38,0x82,0x8, 0xb3,0xe0,0x1, 0x19,0x60,0xe0,0x2, 0x19,0xbf,0xe0,0x3, +0x8f,0xe2,0xe0,0x1, 0x8f,0x3, 0x3f,0x7f,0x1, 0x16,0xe0,0x3, 0x8f,0xe2,0xe0,0x1, +0x8c,0x93,0xe2,0x0, 0xc7,0xbf,0xe0,0x3, 0xaf,0xe2,0xe0,0x3, 0x8f,0xe2,0x3c,0x6f, +0xe0,0x1, 0xaf,0x83,0xe0,0x2, 0xdd,0xaa,0xe0,0x2, 0x1f,0xa8,0x87,0x8f,0xe2,0x0, +0xc7,0x81,0x2f,0xa2,0xe0,0x3, 0x8f,0xf2,0xe0,0x1, 0x8f,0x13,0x3f,0x7f,0x1, 0x16, +0xe0,0x3, 0x8f,0xf2,0xe0,0x1, 0x8c,0x3, 0xe2,0x0, 0xc7,0xbf,0xe0,0x3, 0xaf,0xf2, +0xe0,0x3, 0x8f,0xf2,0x3c,0xef,0xe0,0x1, 0xaf,0x93,0xe0,0x2, 0xdd,0x8f,0xe0,0x2, +0x1f,0xa8,0x87,0x8f,0xe2,0x0, 0xc7,0x81,0x27,0x82,0x9, 0xe1,0xe0,0x1, 0x8c,0x13, +0x9, 0xa1,0xe0,0xd, 0x0, 0x99,0xe0,0x1, 0x8c,0x3, 0xd6,0x95,0x0, 0xdc,0x8, 0xb2, +0xe0,0x1, 0x1f,0xe0,0x16,0x85,0xe0,0x5, 0x8f,0x1f,0x3e,0xb8,0xe0,0x2, 0x1f,0xed, +0x39,0x68,0x3f,0x9d,0x8c,0x3f,0xe0,0x2, 0x1f,0xcd,0x3c,0xee,0x3f,0x92,0xaf,0xf, +0xe0,0x6, 0xdb,0xd7,0xe2,0x0, 0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0x14,0x80,0x14,0x3, +0xe0,0x6, 0xdb,0xcf,0x14,0x80,0x14,0x4, 0xe0,0x6, 0xdb,0xcb,0x14,0x80,0x14,0x0, +0xe0,0x6, 0xdb,0xc7,0x9, 0x61,0xe0,0x0, 0x1f,0xb7,0x8f,0x8f,0x2f,0x82,0x38,0x82, +0xe7,0xf5,0x0, 0x89,0x17,0x86,0x34,0x23,0xe0,0x28,0x3c,0x1f,0x38,0x82,0x17,0x8b, +0x34,0x23,0xe0,0x28,0x3c,0x1f,0x38,0x82,0x8, 0xb5,0xe0,0x2, 0x19,0x6d,0xe0,0x2, +0x1a,0xec,0x3a,0x68,0xe0,0x3, 0x34,0x23,0x8c,0x32,0xaa,0x2, 0x3c,0xe3,0xe0,0x6, +0xdc,0x22,0xc1,0x5, 0x39,0x75,0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x6, 0xdc,0x1b, +0x3c,0xe3,0x14,0x4, 0xa, 0xa1,0xe0,0xd8,0x0, 0x96,0x8, 0xb5,0xe0,0x2, 0x19,0x6d, +0xe0,0x2, 0x1a,0xec,0x3a,0x68,0xe0,0x3, 0x34,0x23,0x8c,0x32,0xaa,0x12,0x3c,0xe3, +0xe0,0x6, 0xdc,0x2c,0xc1,0x5, 0x39,0x75,0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x6, +0xdc,0x25,0x3c,0xe3,0x14,0x4, 0xa, 0xa1,0xe0,0xd8,0x0, 0xa0,0x8, 0xb4,0xe0,0x2, +0x19,0x6d,0xe0,0x2, 0x1a,0x6c,0x39,0xe8,0x8c,0x32,0xa9,0xa2,0x3d,0x63,0x3c,0xe3, +0xe0,0x6, 0xdc,0x39,0xc1,0x5, 0x39,0x74,0x1, 0xf8,0x3d,0x63,0x3c,0xe3,0x14,0x3, +0xe0,0x6, 0xdc,0x31,0x3d,0x63,0x3c,0xe3,0x14,0x4, 0xa, 0x21,0xe0,0xd8,0x0, 0xab, +0x8, 0xb2,0xe0,0x0, 0x1f,0xb7,0x39,0x68,0x8f,0x8f,0x2f,0xa2,0xe0,0x1, 0x1f,0xe0, +0x16,0x85,0xe0,0x3, 0x9f,0x4f,0x3e,0xb2,0xe0,0x2, 0x1f,0xed,0xe2,0x1, 0xc7,0x7f, +0x3f,0x9d,0x8c,0x3f,0x3c,0xee,0xaf,0x4f,0xe0,0x6, 0xdb,0x28,0xe2,0x0, 0xc9,0x1, +0x1, 0x2, 0x9, 0x61,0x14,0x8a,0x14,0x3, 0xe0,0x6, 0xdb,0x20,0x14,0x8a,0x14,0x4, +0xe0,0x6, 0xdb,0x1c,0x14,0x85,0x14,0x0, 0x9, 0x21,0xe0,0xd6,0x0, 0x97,0xda,0xa, +0x0, 0xde,0x16,0x83,0xe0,0x2, 0x1f,0x89,0x3e,0xb8,0xe0,0x1, 0x1f,0x60,0xe0,0xc, +0x3f,0x9d,0xe0,0x4, 0x8d,0x8e,0x8d,0xc, 0x3d,0x7b,0x1, 0x4, 0xe0,0x4, 0x8d,0x8e, +0xad,0x8c,0xe0,0xc, 0x3f,0x9d,0xe0,0x4, 0x8d,0x9e,0x8d,0x1c,0x3d,0x7b,0x1, 0x4, +0xe0,0x4, 0x8d,0x9e,0xad,0x9c,0x3f,0x9d,0x8e,0x2f,0xe0,0x4, 0x8e,0xae,0x3e,0x7d, +0x1, 0x4, 0xe0,0x4, 0x8f,0x2e,0xaf,0x2f,0xe0,0xf, 0x0, 0xc9,0x8, 0xb3,0xe0,0x2, +0x1f,0x73,0xe0,0x2, 0x19,0xd, 0xa7,0x8e,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x86, +0x8f,0x82,0xe2,0x0, 0xcf,0x82,0x1, 0x2, 0x17,0x81,0xe0,0x0, 0x19,0xb7,0xaf,0x82, +0xaf,0x83,0x8c,0x82,0x24,0x94,0xe2,0x0, 0xcc,0x82,0x1, 0x89,0xa7,0x8e,0xa7,0xcf, +0xe2,0x0, 0xc7,0x81,0x27,0x83,0xac,0x82,0xac,0x83,0x9, 0xe1,0x14,0x81,0x14,0x0, +0xe0,0x0, 0xd7,0xda,0x17,0x81,0xaf,0x82,0xaf,0x83,0x9, 0xe1,0x3c,0x69,0x9, 0xa1, +0xe0,0xf, 0x0, 0xd2,0x8, 0xb3,0xe0,0x1, 0x1f,0xd1,0xe0,0x1, 0x19,0x60,0xa6,0x8f, +0xe0,0x2, 0x1f,0x25,0xe0,0x2, 0x8f,0xd2,0xbe,0x8e,0xe0,0x0, 0x27,0xfd,0xe0,0x2, +0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x77,0xe0,0x2, 0x8f,0xd2,0xe0,0x2, +0x19,0x8d,0xe2,0x0, 0xcf,0x83,0x1, 0x86,0xe0,0x2, 0x1f,0x70,0xe0,0x2, 0x1f,0xd9, +0xbf,0xf, 0x16,0x0, 0xe0,0x2, 0x1f,0xa8,0xe0,0x2, 0x1f,0x3f,0x87,0x8f,0xe0,0x3, +0x8f,0x2e,0xe2,0x0, 0xc7,0x81,0xe0,0x2, 0x1e,0xc8,0x3f,0x7f,0xb6,0xd, 0xe0,0x0, +0x1, 0x69,0xe0,0x2, 0x1f,0x3e,0xe0,0x2, 0x1f,0xd3,0xbf,0xf, 0x16,0x0, 0x8f,0x3, +0xe0,0x2, 0x1f,0xed,0xe4,0x0, 0xc7,0x5, 0x3f,0x1f,0x87,0xe, 0xe0,0x6, 0xaf,0x12, +0x8f,0x3, 0xe4,0x0, 0xc7,0x5, 0x3f,0x1f,0x87,0x1e,0xe0,0x6, 0xaf,0x22,0x8f,0x3, +0xe4,0x0, 0xc7,0x5, 0x3f,0x1f,0x87,0x2e,0xe0,0x6, 0xaf,0x42,0x8f,0x3, 0xe4,0x0, +0xc7,0x5, 0x3f,0x1f,0x87,0x3e,0xe0,0x6, 0xaf,0x52,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, +0x3f,0x9e,0x8f,0xcf,0xe0,0x3, 0xb7,0xc2,0x17,0x80,0xe0,0x6, 0xaf,0xb2,0xe0,0x3, +0xb6,0x32,0x8f,0x3, 0xe0,0x2, 0x1f,0xcd,0x8c,0x3, 0x3f,0x9e,0x87,0x8f,0xe0,0x5, +0xaf,0x92,0xd7,0x34,0x8f,0x3, 0xe0,0x2, 0x1f,0x89,0xe4,0x0, 0xc7,0x3, 0x3f,0x1f, +0x87,0xe, 0xe0,0x4, 0xaf,0x2, 0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x1f,0x87,0x1e, +0xe0,0x4, 0xaf,0x12,0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x9e,0x87,0xaf,0xe0,0x4, +0xaf,0xa2,0x81,0x83,0xe0,0x0, 0x1f,0xb7,0xe0,0x6, 0xa9,0x82,0x87,0x8f,0xe0,0x1, +0xaf,0xc2,0x9, 0xe1,0xe0,0x2, 0x19,0x8d,0x8f,0x83,0xe2,0x0, 0xcf,0x82,0xe7,0xff, +0x1, 0x8d,0xe0,0x2, 0x1f,0x6f,0xe0,0x2, 0x1f,0xd9,0xbf,0xf, 0xe7,0xff,0x0, 0x8b, +0xe0,0x2, 0x1f,0x3d,0xe0,0x2, 0x1f,0xd3,0xbf,0xf, 0xe7,0xff,0x0, 0x99,0x8, 0xb1, +0xe0,0x2, 0x1f,0xd1,0x17,0x0, 0x14,0x1, 0xb7,0xf, 0xe0,0x1, 0xd0,0x32,0xdf,0x2f, +0xe0,0x0, 0x1f,0xb7,0x8c,0xf, 0xe0,0x0, 0xde,0x62,0x8, 0xa1,0xe7,0xfe,0x0, 0xd4, +0x8, 0xb7,0xf8,0x0, 0xc, 0x38,0xe0,0x2, 0x1f,0x8d,0xe0,0x1, 0x19,0xe0,0x8a,0xf, +0xe0,0x1, 0x19,0x28,0x13,0x5, 0xe0,0x2, 0x1a,0xed,0x3b,0x34,0xe0,0x6, 0x8d,0x13, +0xe0,0x6, 0x8d,0xa3,0xe0,0x6, 0x8e,0x43,0xe0,0x3, 0x9e,0xc3,0x9f,0x2, 0xe0,0xf, +0x3a,0x96,0xf0,0x0, 0x8c,0xf, 0x8b,0x9f,0xad,0xf, 0xe2,0x2, 0xc7,0x0, 0xad,0x9f, +0xae,0x2f,0xae,0xcf,0xe0,0x1, 0x2f,0x3f,0x9f,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x92, +0x9f,0x82,0xe3,0xff,0xc7,0xfe,0xb7,0x82,0xe0,0x6, 0x8f,0x93,0x37,0xa3,0xe2,0x0, +0xcf,0x86,0xe0,0x0, 0x2, 0x78,0xe0,0xf, 0x3a,0x96,0xf0,0x0, 0xac,0xf, 0xf0,0x6, +0xac,0x13,0x9f,0x82,0xe2,0x0, 0xc7,0x82,0x27,0x90,0x9f,0x82,0xe3,0xff,0xc7,0xfd, +0xb7,0x82,0xe0,0x6, 0x8f,0xa3,0x37,0xa3,0xe2,0x0, 0xcf,0x8b,0xe0,0x0, 0x2, 0x6e, +0x3a,0x96,0xab,0x95,0xe0,0x6, 0xab,0xa3,0x9f,0x82,0xe2,0x0, 0xc7,0x84,0xe0,0x1, +0x2f,0x9a,0x9f,0x82,0xe2,0x0, 0xc7,0x88,0xe0,0x1, 0x2f,0xa4,0x9f,0x82,0xe2,0x0, +0xc7,0xa0,0xe0,0x1, 0x2f,0xab,0x9f,0x82,0xe2,0x0, 0xc7,0xc0,0xe0,0x0, 0x2f,0xf9, +0x9f,0x82,0xe2,0x1, 0xc7,0x80,0xe0,0x0, 0x2f,0xed,0x9f,0x82,0xe2,0x4, 0xc7,0x80, +0x27,0xa6,0x9f,0x82,0xe0,0x2, 0x1f,0x73,0xe3,0xfb,0xc7,0xff,0xa6,0x8e,0xb7,0x82, +0xe7,0xbf,0x17,0x7f,0xe0,0x1, 0xa7,0xed,0xe7,0xc0,0x15,0x80,0x3f,0xde,0xe0,0x1, +0xbf,0xed,0xe0,0x0, 0x1f,0xb1,0xe0,0xb, 0x8f,0x23,0xa6,0xf, 0xe4,0x0, 0xc7,0x32, +0xe0,0x1d,0xc6,0x40,0xa7,0xfc,0xe2,0x3f,0xc7,0x7e,0x3f,0xdb,0x3f,0xce,0xbf,0xfc, +0xe0,0x1, 0xa7,0xed,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x9f,0x82,0xe2,0x8, +0xc7,0x80,0x27,0x85,0x9f,0x82,0xe3,0xf7,0xc7,0xff,0xb7,0x82,0x9f,0x82,0xe2,0x20, +0xc7,0x80,0x27,0x85,0x9f,0x82,0xe3,0xdf,0xc7,0xff,0xb7,0x82,0x9f,0x82,0xe2,0x40, +0xc7,0x80,0x2f,0xa8,0x9f,0x82,0xe2,0x80,0xc7,0x80,0x2f,0x9a,0xf8,0x0, 0xc, 0x28, +0xb, 0xe1,0xe0,0x6, 0x8c,0x13,0xdd,0xe1,0xe0,0x0, 0x1f,0xb7,0x8f,0x8f,0xe7,0xff, +0x27,0x8a,0xd8,0x58,0xe7,0xff,0x0, 0x87,0xe0,0x6, 0x8c,0x23,0xdd,0xef,0xe0,0x0, +0x1f,0xb7,0x8f,0x8f,0xe7,0xff,0x27,0x92,0xd8,0x4d,0xe7,0xff,0x0, 0x8f,0x9f,0x82, +0x3c,0x64,0xe3,0x7f,0xc7,0xff,0xb7,0x82,0xf8,0x0, 0xc, 0x28,0xb, 0xa1,0xe7,0xfa, +0x0, 0xcb,0x9f,0x82,0x3c,0x64,0xe3,0xbf,0xc7,0xff,0xb7,0x82,0xde,0x33,0x0, 0xd3, +0x9f,0x82,0xe3,0xfe,0xc7,0xff,0xb7,0x82,0xd5,0x6b,0xe7,0xff,0x0, 0x90,0x9f,0x82, +0xe0,0x2, 0x1c,0x70,0xe3,0xff,0xc7,0xbf,0x3c,0xe4,0xb7,0x82,0xd4,0x5a,0xe7,0xff, +0x0, 0x81,0x9f,0x82,0x3c,0x64,0xe3,0xfd,0xc7,0xff,0xb7,0x82,0xdd,0x71,0xe7,0xfe, +0x0, 0xbd,0x9f,0x82,0x3c,0x64,0xe3,0xff,0xc7,0xfb,0xb7,0x82,0x9f,0x82,0xe0,0x20, +0xcf,0x80,0xb7,0x82,0xdd,0xe6,0x9f,0x82,0xe2,0x0, 0xc7,0x88,0xe7,0xfe,0x27,0xe0, +0x9f,0x82,0xe3,0xff,0xc7,0xf7,0xb7,0x82,0xe0,0x6, 0x8c,0x43,0xdd,0xc0,0x9f,0x82, +0xe2,0x0, 0xc7,0xa0,0xe7,0xfe,0x27,0xd9,0x9f,0x82,0x3c,0x64,0xe3,0xff,0xc7,0xdf, +0xb7,0x82,0x9f,0x82,0xe0,0x4, 0xcf,0x80,0xb7,0x82,0x9f,0x82,0xe0,0x20,0xcf,0x80, +0xb7,0x82,0xdd,0xc7,0xe7,0xfe,0x0, 0xc9,0xe0,0x1, 0x1f,0x60,0x8f,0xce,0xe2,0x0, +0xcf,0x85,0x1, 0x5, 0xe2,0x0, 0xcf,0x84,0x1, 0x7, 0x38,0x82,0x17,0x81,0xaf,0xce, +0x17,0x82,0xaf,0xce,0x38,0x82,0xe7,0xef,0x0, 0xff,0xe0,0x1, 0x1f,0x60,0xe0,0x2, +0x1f,0x8d,0xe0,0x6, 0x8e,0xe, 0x8e,0x8f,0x3e,0x7d,0x1, 0x6, 0xe0,0x6, 0x87,0xe, +0xaf,0xf, 0xe7,0xfd,0x0, 0xbe,0x38,0x82,0xe0,0x1, 0x1f,0xe0,0xe0,0x1, 0x8f,0xff, +0x2f,0x82,0x38,0x82,0xe0,0xcc,0x0, 0x89,0x8, 0xb4,0xe0,0x1, 0x19,0x60,0x8f,0xc2, +0xe2,0x0, 0xcf,0x85,0x1, 0x21,0xe2,0x0, 0xcf,0x84,0x1, 0x33,0xe0,0x1, 0x8f,0xf2, +0x2f,0x98,0xe0,0x1, 0x1a,0x28,0x99,0x84,0x29,0x82,0xa, 0x61,0x14,0x1, 0xe0,0x0, +0xde,0xd8,0xe0,0x43,0x39,0x93,0xe2,0x0, 0xc9,0x80,0x4, 0x13,0xde,0xaa,0xe0,0x1, +0x8f,0xe2,0xe2,0x1, 0xc7,0xfd,0xe0,0x1, 0xaf,0xe2,0xa, 0x21,0xe0,0x1c,0x0, 0xf8, +0xe0,0x6, 0xd5,0xe3,0x0, 0xe7,0x17,0x81,0xaf,0xc2,0x17,0x82,0xaf,0xc2,0x0, 0xdf, +0x9f,0x84,0xe0,0x2, 0x1f,0xd, 0xe2,0xff,0xc7,0xff,0xb7,0x84,0xe0,0x6, 0x8e,0x82, +0x8f,0x8e,0x3e,0xff,0x1, 0x64,0xe0,0x6, 0x87,0x82,0xaf,0x8e,0xde,0x79,0x0, 0xdf, +0xef,0xff,0xd7,0xaa,0x0, 0xcc,0xe0,0x1, 0x1f,0xe0,0xe0,0x2, 0x8f,0x5f,0x27,0xc, +0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0x7, 0xe0,0x2, 0x8f,0xdf,0xe2,0x0, +0xcf,0x83,0x1, 0x12,0x38,0x82,0xe0,0x2, 0x1f,0xd, 0x8f,0xe, 0xe2,0x0, 0xcf,0x2, +0x1, 0x11,0xe0,0x2, 0x8f,0xdf,0xe0,0x2, 0x1e,0xf0,0xe0,0x2, 0x1f,0x59,0xe2,0x0, +0xcf,0x83,0xbe,0x8e,0x1, 0xf0,0xe0,0x2, 0x1f,0x70,0xe0,0x2, 0x1f,0xd9,0xbf,0xf, +0x38,0x82,0xe0,0x2, 0x8f,0xdf,0xe0,0x2, 0x1e,0xef,0xe0,0x2, 0x1f,0x59,0xe2,0x0, +0xcf,0x83,0xbe,0x8e,0x1, 0xe0,0x0, 0xf0,0x8, 0xb1,0xe0,0x2, 0x1e,0x85,0xe0,0x1, +0x1e,0x5f,0x17,0x80,0xe0,0x4, 0xaf,0xdd,0x17,0x80,0x97,0xc, 0xe3,0xfe,0xc7,0x7f, +0xb7,0xc, 0xe0,0x2, 0x1f,0x51,0xe0,0x4, 0x8e,0xdd,0xb7,0x8e,0xe0,0x2, 0x1f,0x34, +0xb7,0x8e,0xe0,0x0, 0x1f,0x33,0xb7,0x8e,0xe0,0x1, 0x1f,0xe0,0x8f,0x6f,0xe0,0x0, +0x1f,0xa1,0xae,0x8f,0xe0,0x2, 0x1f,0xbc,0xaf,0xf, 0xe0,0x2, 0xd2,0x7f,0xdd,0x83, +0xe0,0x1, 0x1f,0xd1,0xe0,0xc, 0x15,0x52,0xa4,0xf, 0xe0,0x1, 0x1f,0xd0,0xa4,0x8f, +0xe0,0x8, 0xd8,0x9a,0xe0,0x2, 0x1f,0xbb,0xe0,0x2, 0x1f,0xd, 0x8f,0x8f,0x8f,0xe, +0x37,0xde,0xe2,0x0, 0xc7,0x81,0x27,0x82,0x8, 0xe1,0x8, 0xa1,0xe0,0x1b,0x0, 0xf0, +0x38,0x82,0xe0,0x0, 0x1f,0xb7,0xe0,0x1, 0x1f,0x60,0x87,0x8f,0xe0,0x1, 0x1e,0xa6, +0xe0,0x1, 0xaf,0xce,0x14,0x3, 0x86,0x8d,0xe0,0x2, 0x1f,0xa1,0xae,0xfe,0xe0,0x2, +0x16,0xfd,0x8d,0xee,0xe0,0x2, 0x1e,0x3c,0x17,0x0, 0x3e,0x9f,0xe0,0x2, 0xc7,0xfc, +0xad,0x8c,0xaf,0xd, 0xaf,0xf, 0xe0,0x3, 0x0, 0x9f,0x8, 0xb1,0xe0,0x1, 0x1f,0xd1, +0xe0,0x0, 0x1c,0x19,0xa4,0x8f,0xe0,0xc, 0x15,0x52,0xe0,0x8, 0xd8,0x65,0xe0,0x0, +0x1e,0x18,0xe0,0x0, 0x1f,0x17,0xe0,0x0, 0x1d,0x16,0x9f,0x9e,0xe0,0x43,0x3d,0x9f, +0xe2,0x0, 0xcd,0x80,0xe0,0x41,0x3e,0xcf,0xe3,0xff,0xc6,0xff,0xe0,0x6f,0x3d,0x2d, +0xe0,0x80,0xb7,0x9e,0x9e,0x8c,0x3e,0xff,0x3, 0x82,0xb7,0x8c,0x3f,0x7a,0xc6,0x2, +0x1, 0xed,0x8, 0xe1,0x8, 0xb6,0xea,0xf, 0x7b,0x28,0xe0,0x1, 0x1a,0x60,0x99,0x6, +0xe0,0x2, 0xa9,0x44,0xe0,0x2, 0x8f,0x94,0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0x21,0x8, +0xe0,0x1, 0x1f,0x5f,0x16,0x80,0x97,0x8e,0xb6,0x86,0xcf,0x84,0xb7,0x8e,0xb, 0x61, +0x87,0x84,0xe7,0xff,0x17,0x0, 0x3f,0xce,0xe2,0x0, 0xc9,0x5, 0xaf,0x84,0x2, 0x9d, +0xe0,0x0, 0x1c,0x18,0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd8,0x5f,0xe0,0x1, +0x1c,0x58,0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd8,0x58,0xe0,0x0, 0x1c,0x19, +0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd8,0x51,0xe0,0x1, 0x1c,0x57,0xe0,0xc, +0x15,0x52,0x14,0x80,0xe0,0x8, 0xd8,0x4a,0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x0, +0xc9,0x5, 0xb1,0x6, 0x2, 0xb8,0xe0,0x2, 0x8f,0xb4,0xe0,0x2, 0x8f,0x24,0x37,0xa8, +0x3f,0x9e,0xc7,0x85,0x39,0x7f,0x1, 0xcc,0xe0,0x2, 0x1f,0x51,0x17,0x80,0xe0,0x1, +0x1e,0xe3,0xb7,0x8e,0x11,0x0, 0xb7,0x8d,0x12,0x8a,0xe0,0x0, 0x1f,0x18,0xe0,0x2, +0xaf,0x94,0x39,0xee,0xe0,0x2, 0x1f,0xa5,0xbf,0xf, 0x9a,0x3, 0xe2,0x0, 0xca,0x46, +0x5, 0x8c,0x21,0x1b,0xe0,0x40,0x9f,0x93,0x9c,0x13,0x3c,0xe5,0x3c,0x1f,0xe0,0x8, +0xd5,0xdb,0xe0,0x8, 0x3a,0x28,0xb4,0x3, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x6, +0xc9,0x29,0xc1,0x82,0x1, 0xeb,0x17,0x80,0xb7,0x86,0x17,0x1, 0xe0,0x1, 0x1f,0xda, +0xaf,0xf, 0xb, 0x61,0xdf,0x63,0x0, 0xc8,0x3f,0xe2,0x0, 0xe7,0x8, 0xb7,0xf8,0x0, +0xc, 0x3c,0xe0,0x2, 0x19,0xff,0xdf,0x1, 0x8f,0x83,0xe2,0x0, 0xcf,0x83,0xe0,0x0, +0x1, 0xe5,0xe0,0x1, 0x19,0x60,0xf0,0x2, 0x1c,0xd, 0xe0,0x2, 0x1b,0x59,0xe0,0x2, +0x1a,0xf0,0xe0,0x2, 0x1b,0xef,0xf0,0x2, 0x1d,0x3c,0xf0,0x2, 0x1c,0xa8,0xf0,0x1, +0x1e,0x51,0xf0,0x1, 0x1d,0xd7,0xe0,0x13,0x12,0x44,0x0, 0x96,0xe0,0x2, 0x8f,0xd2, +0xe2,0x0, 0xcf,0x81,0x1, 0x17,0xe0,0x2, 0x8f,0xd2,0xe2,0x0, 0xcf,0x83,0x1, 0x1f, +0x3c,0x64,0xe0,0x6, 0xd1,0x58,0x8f,0x82,0x37,0xc7,0x2f,0xa0,0xdf,0x13,0x8f,0x83, +0xe2,0x0, 0xcf,0x83,0x1, 0xba,0xde,0x61,0xe0,0x1, 0xd0,0x7, 0xe0,0x2, 0x8f,0xd2, +0x2f,0xe6,0xe8,0x0, 0x8f,0x88,0xe2,0x0, 0xcf,0x82,0x3f,0xe7,0xe0,0x6f,0x39,0xa5, +0xbf,0x86,0xe0,0x2, 0x8f,0xd2,0xe2,0x0, 0xcf,0x83,0x1, 0xe3,0x3c,0x64,0xba,0x86, +0xe0,0x6, 0xd1,0x39,0x8f,0x82,0x37,0xc7,0x27,0xe2,0x14,0x1, 0xe0,0x0, 0xdd,0x31, +0xe0,0x2, 0xd1,0x98,0xe0,0x2, 0xd8,0x4, 0xe8,0x0, 0x8f,0x8a,0xe2,0x0, 0xcf,0x81, +0x1, 0x1a,0xe0,0x2, 0x8f,0x92,0x2f,0x97,0xe8,0x0, 0x8f,0x89,0x27,0x82,0xdf,0x23, +0xe0,0x2, 0x8f,0x92,0x2f,0xcc,0x87,0x82,0xe2,0x0, 0xc7,0xff,0xaf,0x82,0xde,0xda, +0x8f,0x83,0xe2,0x0, 0xcf,0x83,0x1, 0x48,0x14,0x1, 0xf8,0x0, 0xe, 0x28,0xb, 0xa1, +0xe0,0x1a,0x0, 0x8f,0xe8,0x0, 0x8f,0x89,0x27,0xec,0xe0,0x3, 0xdd,0x16,0xe0,0x2, +0x8f,0x92,0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0xe0,0x3, 0xdb,0x64,0xe0,0x7, 0xd6,0xc8, +0xe0,0x2, 0xd2,0xb8,0xe0,0x4, 0xd8,0xf5,0x0, 0xd8,0xe8,0x0, 0xa4,0x8c,0xe0,0xc, +0x15,0x52,0xe8,0x40,0x3c,0x6b,0xe0,0x8, 0xd7,0x3f,0x0, 0xef,0x8, 0xb1,0xe2,0x0, +0xcc,0x66,0x1, 0x2f,0x5, 0x98,0xe2,0x1, 0xcc,0x8, 0x1, 0x9, 0xe2,0x1, 0xcc,0x2a, +0x1, 0xa3,0xe0,0x2, 0x1f,0xd8,0x17,0x5, 0xaf,0xf, 0x8, 0xe1,0xe0,0x2, 0x1f,0xd8, +0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xfa,0x14,0x1, 0xe0,0x1, 0xdc,0xa0,0x8, 0xa1, +0xe0,0x38,0x0, 0xf8,0xe2,0x0, 0xcc,0x55,0x1, 0x8f,0xe0,0x2, 0x1f,0xd8,0x8f,0x8f, +0xe2,0x0, 0xcf,0x85,0x1, 0xeb,0x14,0x1, 0xe0,0x1, 0xdc,0x91,0xe0,0x1, 0xdc,0x44, +0x8, 0xa1,0xe0,0x38,0x0, 0xd6,0xe0,0x2, 0x1f,0xd8,0x17,0x1, 0xaf,0xf, 0x8, 0xe1, +0xe0,0x2, 0x1f,0xd8,0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xd8,0x14,0x1, 0xe0,0x1, +0xdc,0x7e,0xe0,0x1, 0x1f,0xb1,0x17,0x7f,0xa7,0x8f,0xe0,0x7, 0xaf,0x3f,0x8, 0xe1, +0xe0,0x0, 0x1f,0xe, 0xe0,0x2, 0x1f,0xa1,0xe0,0x3, 0x16,0x3d,0x3e,0x1e,0xe0,0x0, +0x1d,0xaa,0xe0,0x2, 0x16,0xfc,0x3e,0x9f,0x85,0xc, 0x84,0x8b,0xe0,0x3, 0xc7,0x3e, +0x86,0x8d,0xe0,0x1, 0x1e,0x2d,0xe0,0x2, 0x15,0xfd,0xe0,0x1, 0x1c,0x26,0x3d,0x9f, +0xad,0xe, 0xe0,0x3, 0xc7,0x80,0x17,0x0, 0x3e,0x99,0xaf,0xf, 0xe0,0x3, 0x86,0x1c, +0xe0,0x2, 0x1c,0x85,0x84,0x8, 0xe0,0x1, 0x1f,0xf1,0xe0,0x5, 0xac,0x39,0xae,0x8b, +0xae,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x5, 0xe0,0x2, 0x1f,0xff,0xe0,0x4, 0x87,0x7e, +0xaf,0xf, 0x38,0x82,0x8, 0xb1,0xe0,0x7, 0xd8,0x86,0x8, 0xa1,0xe0,0xed,0x0, 0xa0, +0x8, 0xb1,0xe0,0x5, 0xd0,0xf2,0xe0,0x2, 0x1f,0x5, 0xe0,0x2, 0x1f,0xff,0xe0,0x4, +0x87,0x7e,0xaf,0xf, 0x8, 0xe1,0x8, 0xb2,0xe0,0x2, 0x1f,0x85,0x17,0x0, 0xe0,0x4, +0xaf,0x5f,0x17,0x0, 0xe0,0x4, 0x8e,0x5f,0xe0,0x0, 0x1e,0xa1,0xe0,0x2, 0x1f,0xac, +0xe0,0x2, 0x19,0x3f,0xae,0xd, 0xb7,0xf, 0xe0,0x19,0x17,0x1c,0xe0,0x2, 0x1e,0x8d, +0x3f,0x12,0x17,0x81,0xaf,0x8d,0xaf,0x8e,0xe0,0x2, 0xd0,0x78,0xdb,0x7c,0xe0,0x1b, +0x14,0x2c,0xe0,0x6, 0xd0,0x50,0xe0,0x5, 0xda,0xe5,0xe0,0x5, 0xd0,0xcf,0xe0,0x19, +0x17,0x1d,0x17,0x87,0x3f,0x12,0xaf,0x8e,0xe0,0x19,0xc1,0x1e,0xaf,0x82,0x9, 0x61, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xe0,0x2, 0x19,0x7f,0xe0,0x2, 0x1b,0x85,0xe0,0x1, +0x1b,0x22,0xe0,0x1, 0x1a,0xa1,0xe0,0x2, 0x1a,0x28,0xe0,0x1, 0x19,0xcf,0xf0,0x1, +0x1c,0x2d,0xf0,0x2, 0x1d,0xd, 0xf0,0x1, 0x1c,0xce,0xf0,0x0, 0x1e,0xd, 0xf0,0x0, +0x1d,0x8c,0xdf,0xba,0x8f,0x82,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0xf1,0xe0,0x1, +0xd6,0x89,0xe0,0x4, 0xd2,0x88,0xe0,0x0, 0xde,0xd8,0x8f,0x86,0x8c,0x5, 0x37,0xa8, +0x3c,0x4f,0xe0,0x6, 0xd0,0x18,0xe0,0x2, 0xd6,0x6f,0x8f,0x84,0xe0,0x0, 0x27,0xf1, +0x8f,0x83,0xe0,0x0, 0x27,0xf4,0xe0,0x3, 0xdc,0x18,0xe8,0x3, 0x8f,0x98,0xe0,0x0, +0x27,0xf6,0xe0,0x2, 0xd1,0xbf,0xe8,0x0, 0x8c,0x8a,0xe8,0x0, 0x8c,0x9, 0xe0,0x2, +0xd6,0x3e,0x8f,0x83,0xe0,0x0, 0x27,0xe3,0x14,0x1, 0xe0,0x5, 0xdc,0xed,0xe0,0x4, +0xd7,0xf0,0xe0,0x4, 0x8f,0xc7,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x66,0xe0,0x2, +0xd2,0x88,0xe0,0x2, 0xdb,0x7, 0x14,0x2, 0xe0,0x5, 0xdc,0xde,0xe0,0x5, 0xdd,0x87, +0x14,0x3, 0xe0,0x5, 0xdc,0xd9,0xe0,0x4, 0xd2,0x4, 0x14,0x4, 0xe0,0x5, 0xdc,0xd4, +0xe0,0x7, 0xd9,0xa0,0xe0,0x6, 0xd2,0xad,0xe0,0x0, 0x1f,0x2a,0xe0,0x2, 0x1f,0xa0, +0x86,0x8e,0x87,0x8f,0xe8,0x3, 0x87,0x18,0x3f,0x9d,0xe8,0x0, 0x86,0x8b,0xe8,0x0, +0xae,0x8c,0xe0,0x2, 0x1e,0x9f,0xaf,0x8d,0x16,0x80,0xe0,0x2, 0x1f,0x9e,0xae,0x8f, +0xe0,0x1, 0x1f,0xa6,0x87,0x8f,0xe0,0x5, 0xaf,0xb7,0xe0,0x1, 0x1f,0xf1,0xaf,0xf, +0xe0,0x1, 0xd9,0xa2,0xe0,0x7, 0xd7,0xc7,0xe0,0x7, 0xd5,0xe2,0xe0,0x4, 0x87,0xf7, +0xaf,0x82,0x8f,0x82,0xe2,0x0, 0xcf,0x81,0xe7,0xff,0x1, 0x13,0x14,0x1, 0xe0,0x0, +0xdb,0xb0,0xe0,0x4, 0x8f,0xc7,0xe2,0x0, 0xcf,0x81,0x1, 0x87,0xe0,0x1, 0x1f,0xb1, +0xa7,0xf, 0xa7,0xce,0xcf,0x84,0xbf,0xce,0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0x8f,0x83, +0xe7,0xfe,0x27,0xfa,0xe0,0x1, 0xd9,0x80,0x0, 0xe2,0x87,0x82,0xe0,0x5, 0xd0,0x15, +0xe0,0x4, 0x87,0xf7,0xaf,0x82,0xe7,0xfe,0x0, 0xef,0xe0,0x3, 0xd6,0x55,0xe0,0x7, +0xd5,0x57,0xe7,0xff,0x0, 0x88,0xe0,0x1, 0x1f,0xb1,0xa7,0xf, 0xa7,0xce,0xcf,0x84, +0xbf,0xce,0xe7,0xff,0x0, 0x96,0x8, 0xb2,0xe0,0x2, 0x1f,0x5, 0x16,0x81,0xe0,0x4, +0xae,0xfe,0x14,0x2, 0xe0,0x4, 0x87,0x7e,0xe0,0x2, 0x1e,0xff,0xe0,0x2, 0x1f,0xbf, +0xaf,0xd, 0x16,0x80,0xe0,0x1, 0x1f,0x60,0xe0,0x1, 0x1e,0x31,0xae,0x8e,0xe0,0x19, +0x16,0x9d,0x3e,0x9f,0x17,0x7, 0xa1,0xc, 0xaf,0xd, 0xe0,0x19,0xc7,0x9e,0xaf,0xf, +0x17,0x7b,0xa7,0xc2,0x3f,0xde,0xbf,0xc2,0xe0,0x1, 0xdb,0x29,0xa7,0xc2,0xcf,0x84, +0xbf,0xc2,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x19,0x5, 0xe0,0x5, 0xdf,0x2, 0xe0,0x2, +0xd7,0xa9,0xe0,0x2, 0xd9,0x83,0xe0,0x1, 0xdf,0x73,0xe0,0x3, 0xde,0x19,0xe0,0x3, +0xde,0xa5,0xdf,0xca,0xe0,0x4, 0x8f,0xf2,0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0xe2,0x0, +0xcf,0x83,0x1, 0xf9,0xdd,0xc4,0xe0,0x4, 0x8f,0xf2,0xe2,0x0, 0xcf,0x81,0x1, 0xf8, +0xdf,0x0, 0x0, 0xf1,0xe0,0xe, 0x34,0x22,0xe0,0xf, 0x34,0x42,0xe0,0x43,0x3f,0xe, +0xe0,0x2, 0x1d,0xf3,0x16,0x4, 0x16,0x81,0x3e,0xdf,0x3e,0x5e,0xf0,0x0, 0xa3,0x8b, +0x3e,0x4d,0xe2,0x0, 0xc4,0x12,0x16,0x88,0xe2,0x0, 0xc7,0x20,0x3e,0xdf,0x3e,0x48, +0xe0,0x0, 0x1f,0xb1,0xe8,0x1, 0xa5,0xe7,0x3e,0x4e,0x3e,0xcc,0xa7,0x8f,0xe7,0xbf, +0x17,0x7f,0x3f,0x5b,0xe4,0xd, 0x36,0xa5,0xe0,0x24,0x15,0xf0,0xe0,0x3, 0x1c,0x80, +0xe0,0x3, 0x1d,0x1, 0xe8,0x1, 0xbf,0x67,0xe4,0xc, 0x36,0x2c,0xea,0xe, 0xc6,0x80, +0x3d,0x9f,0xe0,0x1a,0xa7,0x2f,0xe0,0x7, 0xc7,0xb0,0x3f,0x59,0xe0,0x43,0xbf,0x2f, +0x3f,0xfb,0xe0,0x43,0xa7,0x2f,0x3f,0x4c,0xe0,0x43,0xbf,0x2f,0xe0,0x40,0xa7,0x1f, +0x3f,0x5a,0xe0,0x40,0xbf,0x1f,0xe0,0x40,0xa7,0x1f,0x3f,0x4d,0xe0,0x40,0xbf,0x1f, +0x1, 0xe9,0xe8,0x1, 0xa7,0xe7,0xe0,0x40,0xcf,0x80,0xe8,0x1, 0xbf,0xe7,0x38,0x82, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3b,0xe0,0x2, 0x1f,0x28,0xe0,0x2, 0x1f,0xbf,0x87,0xe, +0x15,0x85,0xe0,0x3, 0x8e,0x2f,0x3d,0xb9,0xe0,0x2, 0x1e,0xed,0xe2,0x0, 0xc7,0x1, +0x3e,0x7e,0x3e,0x9b,0xf0,0x40,0x3d,0x69,0xf0,0x40,0x3c,0xe8,0x8a,0xbd,0xe0,0x1, +0x1, 0x69,0x9b,0x5f,0xe0,0x1, 0x8a,0xf, 0xf0,0x2, 0x1d,0xbe,0xe0,0x2, 0x1f,0xf3, +0xe4,0x7, 0xc2,0xb0,0xa1,0x8f,0xe0,0x0, 0x1f,0xb1,0xe7,0xbf,0x17,0x7f,0xa1,0xf, +0xe0,0x1, 0xa7,0xe3,0x3a,0x92,0x13,0xa0,0x3f,0xde,0xf2,0x0, 0xcd,0x2, 0x3b,0x95, +0xe0,0x6, 0x17,0x26,0xe8,0xe, 0x3f,0x19,0xe0,0x6, 0x15,0x28,0x14,0x80,0xe0,0x1, +0xbf,0xe3,0x3c,0x67,0xf0,0x6, 0x14,0x48,0xe0,0x79,0x39,0x2e,0xf0,0x18,0x3c,0x15, +0xe0,0x8, 0xd5,0x34,0xe0,0x0, 0x15,0x68,0x14,0x80,0xe8,0x40,0x3c,0x68,0xe0,0x8, +0xd5,0x2d,0x23,0x2e,0x14,0x7f,0x3c,0x16,0xe3,0xff,0xc4,0x7f,0x14,0xfe,0x15,0x7f, +0xe8,0x9, 0x3c,0x9b,0xe8,0xa, 0x3d,0x19,0xe8,0x8, 0x3c,0x19,0xf0,0x0, 0x13,0x81, +0xe0,0x80,0x9f,0x19,0x17,0x84,0x3f,0x9e,0xe0,0xd, 0x37,0x82,0x36,0xa2,0xe0,0x80, +0x8d,0x9a,0x3e,0x97,0xe0,0x41,0x3f,0xe, 0xa6,0xd, 0x37,0x23,0x35,0xbe,0xe0,0xe, +0x37,0x85,0x3e,0x4b,0x37,0x22,0xbe,0xd, 0xe8,0xe, 0x3f,0x18,0xa6,0x8e,0xe0,0x41, +0x3f,0x8f,0xf0,0xf, 0x33,0xbf,0x3f,0xcd,0x3c,0x7a,0xbf,0x8e,0x1, 0xe2,0xe0,0x1, +0xa6,0x5, 0xe0,0x1a,0xa6,0x95,0xe8,0x6, 0x3b,0x19,0x17,0x90,0xe1,0x80,0x8f,0x16, +0x37,0x3f,0x3e,0x4e,0xe0,0x1, 0xbe,0x5, 0x8f,0x26,0x37,0x3f,0xc7,0xf8,0x3e,0xce, +0xe3,0xff,0xcf,0xf8,0xe0,0x1a,0xbe,0x95,0x1, 0xf2,0xf2,0x0, 0xcd,0x1, 0x1, 0xe, +0xe0,0x1, 0xa7,0xe3,0x3c,0x64,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xe3,0xf8,0x0, +0xd, 0xa8,0xb, 0xa1,0xe7,0xfe,0x0, 0x98,0x3d,0x2, 0x16,0x9c,0x3e,0x95,0xe0,0x16, +0x15,0x90,0x3e,0x6d,0x17,0x0, 0x3d,0x92,0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, +0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x1, 0xcf,0x4a,0xbd,0xf, 0x1, 0xf6,0xe0,0x6, +0xc2,0xc4,0xe0,0x16,0x15,0x90,0x3e,0x65,0x17,0x0, 0x3d,0x92,0xe0,0x1, 0x17,0xd2, +0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x0, 0xcf,0x1a, +0xbd,0xf, 0x1, 0xf5,0xe0,0x1d,0x15,0xc0,0x3e,0x6d,0x17,0x0, 0x3d,0x92,0x17,0x88, +0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x1, 0xcf,0x4a, +0xbd,0xf, 0x1, 0xf6,0xe0,0x1d,0x15,0xc0,0x3e,0x65,0x17,0x0, 0xe0,0xb, 0x3d,0x92, +0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b, +0xe2,0x0, 0xcf,0x1a,0xbd,0xf, 0x1, 0xf5,0x17,0x0, 0x17,0x88,0x3f,0x9e,0x37,0xa2, +0xc7,0x1, 0xe0,0x80,0xa6,0x1d,0x3f,0x92,0xe2,0x1, 0xcf,0x4a,0xbe,0xf, 0x1, 0xf6, +0xe0,0x0, 0x17,0x0, 0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80, +0xa6,0x95,0x3f,0x92,0xe2,0x0, 0xcf,0x1a,0xbe,0x8f,0x1, 0xf5,0xe7,0xff,0x0, 0x92, +0x9b,0x6f,0xe0,0x1, 0x8a,0x1f,0xf0,0x2, 0x1d,0xbd,0xe7,0xfe,0x0, 0x99,0x8, 0xb5, +0xe0,0x2, 0x1f,0xa8,0xe0,0x2, 0x1f,0x3f,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0xe0,0x0, 0x1, 0x49,0x9a,0x5e,0xe0,0x2, 0x19,0x3e,0xe0,0x2, +0x1f,0xf3,0xe7,0xbf,0x17,0x7f,0xa2,0x8f,0xe0,0xc, 0x15,0x40,0xe0,0x1, 0xa7,0xe5, +0x14,0x80,0x3f,0xde,0xe0,0x2, 0x1f,0x79,0xe0,0x1, 0xbf,0xe5,0xa1,0x8e,0xe0,0xc, +0xc1,0xd0,0x3c,0x63,0xe0,0x8, 0xd4,0x4a,0x3e,0x62,0x16,0x80,0x2a,0xe, 0x0, 0xa5, +0x9d,0x8c,0xa7,0xf, 0xc6,0x81,0xe4,0xb, 0x35,0xa0,0xe3,0xff,0xc6,0xff,0x3f,0x4b, +0x3a,0x7d,0xbf,0xf, 0xc6,0x2, 0x1, 0x19,0xe0,0xf, 0x36,0xc1,0x3f,0x6f,0x15,0x81, +0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc7,0x7f,0x37,0xa2,0x3d,0xdd,0x37,0x22,0x3f,0x93, +0x25,0xe8,0x3f,0x13,0x9d,0x8c,0xa7,0x8e,0xc6,0x81,0xe3,0xff,0xc6,0xff,0x3f,0xcb, +0x3a,0x7d,0xbf,0x8e,0xc6,0x2, 0x1, 0xe9,0xe0,0x1, 0xa7,0xe5,0xe0,0x40,0xcf,0x80, +0xe0,0x1, 0xbf,0xe5,0xa, 0xe1,0x9a,0x6e,0xe0,0x2, 0x19,0x3d,0xe7,0xff,0x0, 0xb9, +0xe0,0x2, 0x1f,0x81,0x8f,0x8f,0x27,0x88,0xe2,0x0, 0xcf,0x81,0x1, 0x3f,0xe2,0x0, +0xcf,0x82,0x1, 0x1e,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe7,0xe0,0x16,0xff,0xa7,0x8f, +0xe0,0x1, 0xa7,0x5f,0x3f,0x5d,0xe0,0x2, 0xcf,0x0, 0xe0,0x1, 0xbf,0x5f,0x16,0xe0, +0xe0,0x4, 0xa7,0x2f,0x3f,0x5d,0xcf,0x1, 0xe0,0x4, 0xbf,0x2f,0xe7,0xf8,0x16,0x9f, +0xe0,0x4, 0xa7,0x2f,0x3f,0x5d,0xcf,0x20,0xe0,0x4, 0xbf,0x2f,0x38,0x82,0xe0,0x2, +0x1f,0xf3,0xe2,0x0, 0xcc,0x82,0xa7,0x8f,0xe7,0xe0,0x16,0xff,0xe0,0x1, 0xa7,0x5f, +0x3f,0x5d,0x1, 0x62,0xe0,0x1, 0xbf,0x5f,0x16,0xe0,0xe0,0x4, 0xa7,0x2f,0x3f,0x5d, +0xcf,0x2, 0xe0,0x4, 0xbf,0x2f,0xe7,0xf8,0x16,0x9f,0xe0,0x4, 0xa7,0x2f,0x3f,0x5d, +0xe0,0x7, 0xcf,0x40,0xe0,0x4, 0xbf,0x2f,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe7,0xe0, +0x16,0xff,0xa7,0x8f,0xe0,0x1, 0xa7,0x5f,0x3f,0x5d,0xe0,0x1, 0xbf,0x5f,0x16,0xe0, +0xe0,0x4, 0xa7,0x2f,0x3f,0x5d,0xcf,0x1, 0x0, 0xe5,0x8, 0xb5,0x11,0x3, 0x39,0x38, +0xe0,0x2, 0x1a,0x9, 0x17,0x5, 0x3f,0x38,0x39,0x14,0xe0,0x2, 0x1f,0xed,0x39,0xe8, +0x8c,0x2, 0x3f,0x9e,0x8a,0xbf,0xe0,0x6, 0xd4,0xbf,0x8c,0x92,0x3c,0x65,0xe0,0x6, +0xd4,0xf1,0x8c,0xa2,0x3c,0x65,0xe0,0x6, 0xd5,0x2a,0xe2,0x0, 0xc9,0x81,0x1, 0x2, +0xa, 0xe1,0x8c,0xc4,0x14,0x3, 0xe0,0x6, 0xd4,0xe5,0x8c,0xd4,0x14,0x3, 0xe0,0x6, +0xd5,0x1e,0x8c,0xc4,0x14,0x4, 0xe0,0x6, 0xd4,0xdd,0x8c,0xd4,0x14,0x4, 0xe0,0x6, +0xd5,0x16,0x8c,0xc4,0x14,0x0, 0xe0,0x6, 0xd4,0xd5,0x8c,0xd4,0x14,0x0, 0xa, 0xa1, +0xe0,0xca,0x0, 0x8d,0xe2,0x0, 0xcc,0x82,0xe0,0x0, 0x2, 0xe1,0x8, 0xb5,0x17,0xfd, +0x3f,0x98,0xe2,0x0, 0xcf,0x81,0x39,0x68,0x3a,0x69,0xe0,0x1, 0x5, 0x88,0xe0,0x0, +0x2c,0x57,0xe0,0x2, 0x1f,0xf3,0xe7,0xbf,0x16,0x7f,0xa6,0x8f,0xe0,0x0, 0x1f,0xb1, +0xe0,0x1, 0xa7,0x6d,0xa7,0x8f,0x3f,0x5c,0xe0,0x1, 0xbf,0x6d,0xe2,0x0, 0xcc,0x81, +0xa7,0x4f,0xe6,0x7, 0x16,0x7f,0x3f,0x5c,0xe0,0x0, 0x1, 0x4a,0xe0,0x28,0xcf,0x0, +0xbf,0x4f,0x16,0x40,0xa7,0x4f,0xe7,0xf8,0x15,0x80,0x3f,0x5c,0xcf,0x5, 0xbf,0x4f, +0x12,0x85,0xa7,0x5f,0xe0,0x3, 0x1e,0x2, 0x3a,0xb9,0x3f,0x5c,0xe8,0x0, 0xcf,0x5, +0xbf,0x5f,0xa7,0x5f,0xe0,0x2, 0x19,0xed,0x3f,0x5b,0xcf,0x5, 0xbf,0x5f,0xe0,0xc, +0x39,0x95,0xe0,0x1, 0xa7,0xed,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x8c,0xcc, +0xe0,0x6, 0xd2,0xac,0xe0,0x2, 0x1f,0xcd,0x3c,0x62,0x3f,0x94,0x84,0x8f,0xe0,0x6, +0xd2,0xd0,0x39,0x95,0x8d,0x23,0x3c,0x62,0x3c,0xea,0xe0,0x6, 0xd3,0x8c,0x8c,0x83, +0x3c,0x62,0x34,0xa3,0xe0,0x6, 0xd3,0x3f,0x8c,0x93,0x3c,0x62,0x34,0xa3,0xe0,0x6, +0xd3,0x5d,0x3c,0x64,0xa, 0xa1,0xe7,0xfe,0x0, 0xea,0x38,0x82,0x12,0x85,0x3a,0xb9, +0xe0,0x2, 0x19,0xed,0xe0,0xf, 0x39,0x95,0x8c,0xcf,0x0, 0xdb,0xe0,0x50,0xcf,0x0, +0xbf,0x4f,0x16,0x40,0xa7,0x4f,0x14,0x85,0x3f,0x5c,0xcf,0xa, 0xbf,0x4f,0x3a,0xe9, +0xa7,0x5f,0xe0,0x3, 0x1e,0x2, 0xe0,0x2, 0x19,0xed,0x3f,0x5c,0xe8,0x0, 0xcf,0xa, +0xbf,0x5f,0xe7,0xf8,0x16,0x0, 0xa7,0x5f,0x3f,0x5c,0xcf,0xa, 0xbf,0x5f,0xe0,0x1, +0xa7,0xed,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0xe0,0x6, 0xd2,0x67,0x3c,0xe2, +0x3c,0x62,0xe0,0x6, 0xd2,0x8e,0xe7,0xff,0x0, 0xbe,0x14,0x8a,0xe0,0x6, 0xd2,0x5e, +0x14,0x80,0x3c,0x62,0x12,0x85,0xe0,0x6, 0xd2,0x84,0xe0,0x2, 0x19,0xed,0x3a,0xb4, +0xe7,0xff,0x0, 0xb1,0xe0,0x2, 0x1f,0x28,0xe0,0x0, 0x1d,0x2b,0xe0,0x2, 0x1f,0xbf, +0x87,0xe, 0xf0,0x1, 0x8b,0xfa,0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, 0xe8,0xc, +0x3d,0x17,0x3e,0xfe,0xf0,0x6, 0x89,0xc, 0xe0,0x1, 0x1, 0x35,0xf0,0x0, 0x9a,0x5f, +0xf0,0x1, 0x89,0x8f,0xe0,0x1, 0x24,0x25,0xe0,0x0, 0x1f,0xa9,0xf0,0x2, 0x1b,0x7b, +0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe0,0x1, 0x27,0xa5,0x8, 0xb2,0xe0,0x1, 0x1f,0xb1, +0xe7,0x7f,0x16,0xff,0xa4,0xf, 0xa7,0x88,0xa7,0x8, 0x37,0xce,0xe2,0x0, 0xc7,0x81, +0xe4,0x0, 0xcf,0x81,0x3f,0x5d,0x37,0xae,0x3f,0xce,0xbf,0x88,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe0,0x1, 0x1f,0xa7,0xf0,0xe, 0x33,0xa2,0x96,0xfb,0x3f,0x9e,0xb6,0x8f, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0,0x1, 0x97,0xb, 0xf0,0x0, 0x12,0x82,0xb7,0x1f, +0xf0,0x15,0x3a,0x9b,0xf0,0x2, 0x18,0x8d,0xf0,0x1, 0x18,0x4d,0xe8,0x40,0x3f,0x64, +0x16,0x0, 0x0, 0x96,0xe8,0x0, 0x8e,0x81,0xe0,0xf, 0x37,0x21,0xe2,0x0, 0xce,0x81, +0x3f,0x99,0xe0,0x0, 0x1, 0x49,0xe8,0x0, 0x96,0x85,0xb6,0x8f,0xc6,0x1, 0xe2,0x0, +0xce,0x6, 0xc7,0x1, 0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82,0x1, 0x13,0xf0,0xf, +0x31,0xdc,0xe0,0xd, 0x37,0x21,0xe2,0x0, 0xc7,0x81,0x3e,0x99,0x2f,0xe4,0xc6,0x1, +0xe2,0x0, 0xce,0x6, 0xc7,0x1, 0xb7,0x8d,0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82, +0x1, 0xef,0xe8,0x0, 0x8f,0x81,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x52,0xf0,0x0, +0x22,0x14,0x16,0x89,0xe8,0xd, 0x3e,0x94,0xe3,0xff,0xc6,0xff,0xe0,0x0, 0x17,0x89, +0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff,0x97,0xe, 0x3f,0xfd, +0xe1,0x80,0xb7,0x19,0x1, 0xf6,0xe0,0x6, 0x8f,0xda,0xc7,0xff,0xf0,0x40,0x3b,0xff, +0x4, 0x6, 0xa7,0x88,0xe7,0x7f,0x17,0x7f,0x3f,0xde,0xbf,0x88,0x17,0x80,0xe8,0x0, +0xaf,0x86,0x9, 0x61,0xf2,0x0, 0xc9,0x4, 0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe7,0xff, +0x1, 0xb4,0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe0,0x3f,0x16,0x9a,0xe8,0x0, 0x98,0x85, +0x3e,0x9e,0x99,0xf, 0x36,0xa1,0x38,0xa2,0xe8,0xd, 0x3e,0x90,0xb0,0x8d,0x9e,0x8f, +0xe8,0x0, 0x98,0x85,0x3e,0x91,0x36,0xc1,0xb6,0x8f,0xe7,0xff,0x0, 0xa1,0xe0,0x2, +0x1f,0xc9,0xf0,0x2, 0x1b,0x7b,0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe7,0xfe,0x2f,0xdf, +0x38,0x82,0xf0,0x0, 0x9a,0x6f,0xf0,0x1, 0x89,0x9f,0xe7,0xfe,0x0, 0xcd,0xf2,0x0, +0xc9,0x4, 0x1, 0x17,0xf7,0xff,0x22,0x41,0xf0,0x0, 0xc2,0x9, 0xf3,0xff,0xc2,0x7f, +0xe0,0x0, 0x17,0x89,0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x97,0xe, 0xe8,0x40,0x3f,0xf4,0xe1,0x80,0xb7,0x19,0x1, 0xf5,0xe7,0xff,0x0, 0xad, +0xf0,0x0, 0x22,0x27,0xf7,0xff,0x11,0xff,0xf8,0x13,0x39,0x94,0xf3,0xff,0xc1,0xff, +0xf0,0x1, 0x19,0x4d,0xc5,0x92,0x3e,0xe9,0xf0,0x0, 0xc1,0x81,0xe0,0x0, 0x17,0x0, +0xe0,0x3f,0x17,0x9a,0x9e,0xb, 0x3f,0x9e,0xf0,0x0, 0x9a,0x8d,0x37,0xa1,0xe8,0xc, +0x3e,0x25,0xe8,0xf, 0x3f,0x92,0xb6,0xf, 0xc7,0x1, 0x9f,0x8d,0xe1,0x80,0x9e,0x1b, +0xf0,0x40,0x39,0xfe,0x3f,0x9c,0x37,0xc1,0xe1,0x80,0xb7,0x9d,0x1, 0xea,0x17,0x86, +0xe8,0xf, 0x3f,0x94,0x37,0xa1,0x3c,0x9f,0x17,0x0, 0xb7,0x9, 0xe7,0xfe,0x0, 0xfd, +0xe0,0x2, 0x1f,0x81,0x86,0xc8,0x8f,0x8f,0x87,0x68,0xe2,0x0, 0xcf,0x82,0xe0,0x1, +0x1f,0xa6,0x8f,0x8f,0x1, 0x22,0x37,0xc1,0x16,0x60,0xc7,0x81,0x3e,0xdc,0xe2,0x0, +0xc7,0x9f,0x3f,0x5c,0xce,0x81,0x3f,0xce,0xae,0xc8,0xaf,0xe8,0x15,0x80,0x87,0x48, +0x87,0xe8,0x86,0x58,0x86,0xf8,0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xc7,0x9f,0xcf,0x20, +0xce,0x40,0xcf,0xa0,0xce,0xc0,0x15,0x1, 0xad,0x8, 0xad,0x98,0xad,0xb8,0xaf,0x48, +0xae,0x58,0xaf,0xe8,0xae,0xf8,0x38,0x82,0xc7,0x81,0x37,0x81,0x16,0x60,0xc7,0x81, +0x3e,0xdc,0xe2,0x0, 0xc7,0x9f,0x3f,0x5c,0xce,0x82,0x3f,0xce,0xae,0xc8,0xaf,0xe8, +0x0, 0xde,0xe0,0x2, 0x1f,0x81,0xf0,0x0, 0x11,0x81,0x8d,0x8f,0xe2,0x0, 0xcd,0x82, +0x1, 0x4, 0xf0,0x0, 0x11,0x80,0x15,0x81,0xc4,0x82,0xe2,0x1, 0xc4,0xff,0x17,0x81, +0xf0,0x1, 0x1a,0x26,0xac,0x88,0x17,0x0, 0xaf,0xb8,0x15,0x47,0xf7,0xff,0x13,0xe0, +0xf7,0xff,0x12,0x80,0xf7,0xff,0x13,0x3f,0x0, 0x92,0x87,0xc8,0x86,0xd8,0xe2,0x0, +0xc7,0x9f,0xcf,0xe0,0xe8,0xf, 0x3f,0xd7,0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xd8, +0xaf,0xc8,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0x4, 0xac,0x17,0x82,0x3f,0x9e, +0x37,0xa1,0x3f,0x98,0x86,0x9f,0x3e,0xda,0xae,0x9f,0x27,0x68,0xe2,0x0, 0xcf,0x1, +0xf0,0x0, 0x11,0x1f,0xf0,0x0, 0x10,0x81,0xf0,0x12,0x39,0x5b,0xce,0xc0,0xf0,0x11, +0x38,0x9b,0x1, 0x19,0x86,0xf, 0xe2,0x0, 0xcf,0x2, 0xe8,0xc, 0x3e,0x57,0xe8,0xc, +0x3e,0x42,0xe8,0x40,0x3d,0xe1,0xae,0xf, 0xe2,0x0, 0xc6,0x1f,0xe2,0x1, 0xc5,0xff, +0xce,0x20,0x1, 0x17,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0xae,0xf, 0xae,0x9f, +0x3, 0xd6,0x38,0x82,0x87,0xe8,0x86,0xf8,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0xc5, +0xe8,0xf, 0x3f,0xd7,0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xf8,0xaf,0xe8,0x0, 0xc2, +0xe0,0x1, 0x86,0x98,0xe0,0x1, 0x87,0x88,0xce,0xc0,0xe0,0x1, 0xae,0x98,0xe2,0x0, +0xc7,0x9f,0xe8,0x0, 0x8d,0x84,0xcf,0xa0,0xe8,0xb, 0x3d,0x93,0x35,0x81,0xc5,0x81, +0xe0,0x1, 0xaf,0x88,0xe2,0x1, 0xc5,0xff,0xe7,0xff,0x0, 0xad,0xe0,0x2, 0x1f,0x81, +0xf0,0x0, 0x12,0x81,0x8d,0xf, 0xe2,0x0, 0xcd,0x2, 0x1, 0x4, 0xf0,0x0, 0x12,0x80, +0x15,0x1, 0x17,0x80,0xf0,0x1, 0x1b,0x26,0xac,0x88,0x17,0x0, 0xaf,0x98,0xf7,0xff, +0x13,0xe0,0x17,0x82,0x3f,0x9e,0x37,0xa1,0x3f,0x98,0x86,0x8f,0x86,0x1f,0x15,0x9f, +0xe8,0xd, 0x3e,0xd7,0x3d,0xda,0xce,0x40,0x3e,0xcb,0xae,0x1f,0x16,0x3, 0xae,0x8f, +0x3e,0x1a,0x27,0x13,0x3d,0x6c,0xe2,0x1, 0xc5,0x7f,0x17,0x82,0x3f,0x9e,0x37,0xa1, +0x3f,0x98,0x86,0x8f,0xc7,0x1, 0xe2,0x0, 0xc6,0x9f,0xe2,0x1, 0xc7,0x7f,0xce,0xa0, +0x3c,0xfe,0xae,0x8f,0x3, 0xdf,0x38,0x82,0xe8,0x0, 0x8f,0x86,0xe8,0xf, 0x3f,0x95, +0x37,0x81,0xc7,0x81,0x3d,0x7f,0x2, 0x6a,0xe8,0x0, 0x8d,0x6, 0xe8,0xa, 0x3d,0x15, +0x35,0x1, 0xc5,0x1, 0xe2,0x1, 0xc5,0x7f,0x0, 0xe1,0x17,0x0, 0x3f,0xe8,0xe1,0x80, +0xaf,0x1f,0xc7,0x81,0xaf,0x18,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xaf,0xf, 0xe7,0xfe,0x0, 0x9f,0xe0,0x2, 0x1f,0x81,0x16,0x82,0x8f,0x8f, +0x87,0x58,0xe0,0x2f,0x3f,0x8d,0xc7,0x81,0x16,0x80,0xcf,0x40,0xcf,0xa0,0xae,0x88, +0xae,0x98,0xae,0xb8,0xaf,0x58,0xaf,0xc8,0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x19,0x69, +0x15,0x2a,0x14,0x80,0x3c,0x62,0xe0,0x8, 0xd0,0xa1,0xe0,0x2, 0x1f,0x81,0x17,0x1, +0xaf,0x42,0xe0,0x0, 0x17,0x41,0x8f,0x8f,0xe0,0x4, 0xaf,0x2, 0x2f,0x8c,0xe0,0x2, +0x87,0xa2,0x17,0x60,0xe2,0x0, 0xc7,0x9f,0xcf,0xa0,0x3f,0xde,0xcf,0x81,0xe0,0x2, +0xaf,0xa2,0x9, 0x61,0xe0,0x2, 0x1e,0xe8,0x17,0x0, 0xe0,0x2, 0x1f,0xe7,0xaf,0xd, +0x3c,0x6d,0xaf,0x1d,0xaf,0xf, 0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1e,0xfd,0xaf,0xf, +0xe0,0x2, 0x1f,0xe5,0x8c,0x8d,0xaf,0xf, 0xe0,0x2, 0x1f,0xe4,0xaf,0xf, 0xe0,0x2, +0x1f,0xe3,0xaf,0xf, 0xe0,0x2, 0x1f,0xe2,0xaf,0xf, 0xe0,0x2, 0x1f,0xe1,0xaf,0xf, +0xe0,0x2, 0x1f,0xe0,0xaf,0xf, 0xe0,0x2, 0x1f,0xdf,0xaf,0xf, 0xe0,0x2, 0x1f,0xde, +0xaf,0xf, 0xe0,0x2, 0x1f,0xdd,0xaf,0xf, 0xe0,0x2, 0x1f,0xdc,0xaf,0xf, 0x9, 0x21, +0xe7,0xfd,0x0, 0xc1,0xe0,0x0, 0x1f,0xab,0x17,0x0, 0xaf,0xf, 0x16,0xff,0xaf,0x1f, +0xae,0xaf,0xaf,0x3f,0xaf,0x4f,0xaf,0x5f,0xaf,0x6f,0xaf,0x7f,0xe0,0x1, 0xaf,0xf, +0xe0,0x1, 0xaf,0x6f,0xe0,0x1, 0xae,0xff,0xe0,0x2, 0xaf,0xf, 0xe0,0x2, 0xaf,0x1f, +0x38,0x82,0xe0,0x0, 0x1f,0x2b,0x8e,0x8e,0xe0,0x0, 0x2e,0xdc,0x8f,0x8e,0x85,0x89, +0x37,0xa5,0x3f,0x9e,0xbc,0x6f,0xc5,0x81,0x8f,0x8e,0xe2,0x1, 0xc5,0xff,0x37,0xa5, +0x3f,0x9e,0x8c,0x39,0xe0,0x6, 0xad,0xdf,0x15,0x7f,0x3e,0x6d,0x8f,0x8e,0x37,0xa5, +0x3f,0x9e,0x3f,0x9d,0xe0,0x6, 0xad,0xf, 0x8f,0x8e,0x37,0xa3,0x3f,0x9d,0xc7,0x87, +0x37,0xa2,0xc6,0x81,0x3f,0x9e,0xe2,0x0, 0xce,0x85,0xbe,0xf, 0x1, 0xf0,0xe0,0x2, +0xae,0x2e,0xe0,0x2, 0xae,0x3e,0xe0,0x2, 0xae,0x4e,0xe0,0x2, 0xae,0x5e,0xe0,0x2, +0xae,0x6e,0xe0,0x2, 0x1f,0x8d,0xe0,0x2, 0xae,0x7e,0x8d,0xf, 0xe2,0x0, 0xcd,0x1, +0x1, 0x2a,0x8f,0x8e,0x8e,0x99,0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0xf, 0x3d,0xad, +0xe0,0x2, 0xae,0x2e,0xe2,0x0, 0xcd,0x81,0x8f,0x8e,0xe0,0x1, 0x1e,0xcc,0x37,0xa5, +0x3f,0x9e,0xbe,0xff,0x5, 0x11,0x8f,0x8e,0x16,0x82,0x37,0xa5,0x3f,0x9e,0xe0,0x6, +0xae,0x9f,0x17,0x81,0xe0,0x2, 0xaf,0xce,0x8f,0x8e,0xe0,0x1, 0x1e,0xcb,0xc7,0x81, +0x37,0xa5,0x3f,0x9e,0xbe,0x8f,0x14,0x0, 0x8f,0x8e,0xc7,0x81,0xaf,0x8e,0x38,0x82, +0x14,0x1, 0x38,0x82,0xe0,0x0, 0x24,0x50,0x8f,0x8e,0xf0,0x1, 0x1b,0x4a,0x37,0xa5, +0x3f,0x9e,0xe0,0x6, 0xae,0x8f,0x16,0x84,0xe0,0x2, 0xae,0x7e,0x14,0x82,0x8f,0x8e, +0x16,0x3, 0x37,0xa5,0x3f,0x9e,0xf0,0x0, 0xbb,0x7f,0xf0,0x40,0x3b,0xe9,0x8f,0x8e, +0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0x9f,0xe0,0x2, 0xad,0x6e,0x8e,0x8e,0xc6,0x81, +0x36,0xa5,0x3e,0x9e,0xf0,0x0, 0xbb,0xd, 0x17,0x80,0x8e,0x8e,0x34,0x21,0x36,0xa5, +0x3e,0x9e,0x3e,0x99,0xe0,0x6, 0xaf,0x8d,0x3d,0xa8,0xf0,0x2, 0xab,0xae,0xe2,0x0, +0xcd,0x81,0x8f,0x8e,0xe0,0x1, 0x1e,0xcc,0x37,0xa3,0x3f,0x99,0xc7,0x87,0x37,0xa2, +0x3f,0x9e,0xbe,0x8f,0x5, 0x41,0x8e,0x8e,0x17,0x82,0x36,0xa5,0x3e,0x9e,0x3e,0x9c, +0xe0,0x6, 0xaf,0x8d,0x14,0x0, 0xe0,0x2, 0xae,0x4e,0x8f,0x8e,0xe0,0x1, 0x1e,0xcb, +0x37,0xa3,0x3f,0x9c,0xc7,0x87,0x37,0xa2,0x3f,0x9e,0xbe,0x8f,0x8f,0x8e,0xc7,0x81, +0xaf,0x8e,0x38,0x82,0xf0,0x40,0x3b,0xe8,0x3e,0x6a,0x3c,0xe8,0x0, 0xce,0xe2,0x0, +0xcc,0x4, 0x1, 0x20,0x5, 0x92,0xe2,0x0, 0xcc,0x6, 0x2, 0x9f,0x17,0x80,0x8f,0x39, +0xaf,0x89,0xaf,0x99,0x27,0x7, 0x87,0xd9,0xe2,0x1, 0xc7,0xbf,0xaf,0xd9,0x17,0xa1, +0xaf,0xc9,0x17,0x80,0xaf,0xb9,0x38,0x82,0xe2,0x0, 0xcc,0x3, 0x1, 0x8f,0x87,0xd9, +0x17,0x47,0x3f,0xde,0xcf,0x90,0x17,0x0, 0xaf,0x9, 0xaf,0x19,0xaf,0x39,0xaf,0xd9, +0x38,0x82,0x3c,0x69,0xe7,0xfb,0x0, 0x96,0x38,0x82,0x38,0x82,0xe0,0x0, 0x1f,0x2b, +0x16,0x80,0xe0,0x2, 0xae,0x9e,0x17,0x80,0x8e,0x8e,0x26,0x91,0xe0,0xd, 0x37,0xa5, +0x3e,0x9e,0xe0,0x6, 0x8e,0xdd,0xe0,0x2, 0x8e,0x1e,0xc7,0x81,0x3e,0x9c,0xe0,0x2, +0xae,0x9e,0xe2,0x1, 0xc7,0xff,0x8e,0x8e,0x3e,0xff,0x2, 0xf1,0x38,0x82,0x8, 0xb4, +0xc0,0x60,0xe0,0x0, 0x19,0x2b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0x11,0x94, +0xaf,0x22,0x39,0x90,0xaf,0xb2,0x3c,0x63,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2, +0xe0,0x1, 0xaf,0x82,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0x17,0xe, 0xe0,0x2, +0xaf,0x82,0xe0,0x2, 0x1a,0xd, 0xe0,0x2, 0xaf,0x92,0x8f,0x84,0x3f,0x3f,0xe0,0x2, +0x1f,0xe9,0x3f,0x9e,0xf0,0x0, 0x80,0x8f,0xf0,0x0, 0x81,0x1f,0xf0,0x0, 0x81,0xaf, +0xf0,0x0, 0x82,0x3f,0xf0,0x0, 0x68,0x94,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f, +0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x84,0x8f,0xe0,0x1, 0x85,0x1f,0xe0,0x1, 0x85,0xaf, +0xe0,0x1, 0x86,0x3f,0xe0,0x1, 0x86,0xcf,0xe0,0x1, 0x87,0x5f,0x87,0xcf,0xf0,0x0, +0xa9,0x13,0xf0,0x0, 0xa9,0xa3,0xf0,0x0, 0xaa,0x33,0xaf,0xc3,0xf0,0x0, 0xaa,0xd3, +0xf0,0x0, 0xab,0x63,0xf0,0x0, 0xab,0xf3,0xe0,0x1, 0xac,0x83,0xe0,0x1, 0xad,0x13, +0xe0,0x1, 0xad,0xa3,0xe0,0x1, 0xae,0x33,0xe0,0x1, 0xae,0xc3,0xe0,0x1, 0xaf,0x53, +0xdd,0x20,0xf8,0x3, 0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef, +0x57,0x90,0x14,0x4, 0x77,0x88,0xde,0xa6,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x84, +0xc7,0x81,0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, +0xaf,0x92,0x17,0x80,0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0xa, 0x61,0x8, 0xb3,0xc0,0x60, +0xe0,0x0, 0x19,0x2b,0x17,0x0, 0xaf,0x2, 0x17,0xff,0xaf,0x12,0x16,0x8e,0xaf,0xa2, +0xaf,0x32,0xaf,0x42,0xaf,0x52,0xaf,0x62,0xaf,0x72,0xe0,0x1, 0xaf,0x2, 0xe0,0x1, +0xaf,0x62,0xe0,0x1, 0xaf,0xf2,0xe0,0x2, 0xaf,0x2, 0xe0,0x2, 0x19,0x8d,0xe0,0x2, +0xaf,0x12,0x8f,0x83,0x3e,0xbf,0xe0,0x2, 0x1f,0xe9,0x3f,0x9d,0xf0,0x0, 0x81,0x2f, +0xf0,0x0, 0x81,0xcf,0xf0,0x0, 0x82,0x5f,0xf0,0x0, 0x82,0xef,0xf0,0x0, 0x83,0x7f, +0xf0,0x1, 0x83,0x8f,0x86,0xbf,0xe0,0x1, 0x84,0xaf,0xe0,0x1, 0x85,0x3f,0xe0,0x1, +0x85,0xcf,0xe0,0x1, 0x86,0x5f,0xe0,0x1, 0x84,0x1f,0xf0,0x0, 0x69,0x16,0x3f,0xed, +0xf0,0x0, 0x69,0x98,0xe2,0x1, 0xc7,0xff,0xf0,0x0, 0x6a,0x19,0xf0,0x0, 0x6a,0x9a, +0xf0,0x0, 0x6b,0x1b,0xf0,0x0, 0x6b,0x9c,0x6c,0x1d,0x6c,0x9e,0x6d,0x1f,0x6d,0xa0, +0x6e,0x21,0x6f,0x14,0x6f,0x15,0x27,0x87,0x57,0x8c,0xe2,0x1, 0xc7,0xbf,0xe0,0x42, +0xcf,0x80,0x77,0x8c,0x17,0x80,0xf0,0x0, 0x11,0x14,0x6f,0x97,0xf0,0x12,0x39,0x10, +0xf8,0x12,0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x5, 0x77,0x88,0xde,0x1f,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x83,0xc7,0x81, +0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, 0xaf,0x92, +0x17,0x80,0xe0,0x0, 0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0x9, 0xe1,0x8, 0xb3,0xc0,0x60, +0xe0,0x0, 0x19,0x2b,0x17,0x0, 0xaf,0x2, 0x17,0xff,0xaf,0x12,0x16,0x8e,0xaf,0xa2, +0xaf,0x32,0xaf,0x42,0xaf,0x52,0xaf,0x62,0xaf,0x72,0xe0,0x1, 0xaf,0x2, 0xe0,0x1, +0xaf,0x62,0xe0,0x1, 0xaf,0xf2,0xe0,0x2, 0xaf,0x2, 0xe0,0x2, 0x19,0x8d,0xe0,0x2, +0xaf,0x12,0x8f,0x83,0x3e,0xbf,0xe0,0x2, 0x1f,0xe9,0x3f,0x9d,0xf0,0x0, 0x81,0x2f, +0xf0,0x0, 0x81,0xcf,0xf0,0x0, 0x82,0x5f,0xf0,0x0, 0x82,0xef,0xf0,0x0, 0x83,0x7f, +0xf0,0x1, 0x83,0x8f,0x86,0xbf,0xe0,0x1, 0x84,0xaf,0xe0,0x1, 0x85,0x3f,0xe0,0x1, +0x85,0xcf,0xe0,0x1, 0x86,0x5f,0xe0,0x1, 0x84,0x1f,0xf0,0x0, 0x69,0x16,0x3f,0xed, +0xf0,0x0, 0x69,0x98,0xe2,0x1, 0xc7,0xff,0xf0,0x0, 0x6a,0x19,0xf0,0x0, 0x6a,0x9a, +0xf0,0x0, 0x6b,0x1b,0xf0,0x0, 0x6b,0x9c,0x6c,0x1d,0x6c,0x9e,0x6d,0x1f,0x6d,0xa0, +0x6e,0x21,0x6f,0x14,0x6f,0x15,0x27,0x87,0x57,0x8c,0xe2,0x1, 0xc7,0xbf,0xe0,0x42, +0xcf,0x80,0x77,0x8c,0x17,0x80,0xf0,0x0, 0x11,0x14,0x6f,0x97,0xf0,0x12,0x39,0x10, +0xf8,0x12,0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x6, 0x77,0x88,0xdd,0x97,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x83,0xc7,0x81, +0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, 0xaf,0x92, +0x17,0x80,0xe0,0x0, 0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0x9, 0xe1,0x8, 0xb3,0xc0,0x60, +0xe0,0x0, 0x19,0x2b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0x16,0xe, 0xaf,0x22, +0xf0,0x0, 0x11,0x14,0xaf,0xb2,0xf0,0x12,0x39,0x10,0xaf,0xc2,0x16,0x84,0xaf,0xd2, +0x3e,0x90,0xaf,0xe2,0x3c,0xed,0xaf,0xf2,0x14,0x3, 0xe0,0x1, 0xaf,0x82,0xe0,0x1, +0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82,0xe0,0x2, 0x19,0x8d,0xe0,0x2, +0xaf,0x92,0x8f,0x3, 0x3e,0x3e,0xe0,0x2, 0x1f,0x69,0x3f,0x1c,0xf0,0x0, 0x81,0xae, +0xf0,0x0, 0x82,0x4e,0xf0,0x0, 0x82,0xde,0xf0,0x0, 0x83,0x6e,0x85,0x7e,0xe0,0x1, +0x85,0x8e,0xe0,0x1, 0x86,0x1e,0xf0,0x1, 0x83,0xae,0xf8,0x0, 0xa9,0xa2,0xf8,0x0, +0xaa,0x42,0xf8,0x0, 0xaa,0xd2,0xf8,0x0, 0xab,0x62,0xe8,0x0, 0xad,0x72,0xe8,0x1, +0xad,0x82,0xe0,0x1, 0x85,0x3e,0xe8,0x1, 0xae,0x12,0xe0,0x1, 0x85,0xce,0xe0,0x1, +0x86,0x5e,0xf8,0x1, 0xab,0xa2,0xe8,0x0, 0x97,0x22,0xe8,0x1, 0xad,0x32,0x15,0x47, +0x3f,0x5a,0x6f,0x94,0xcf,0x10,0xe8,0x0, 0xaf,0x92,0xe8,0x0, 0xaf,0xb2,0xe8,0x0, +0xb7,0x22,0xe8,0x1, 0xad,0xc2,0xe8,0x1, 0xae,0x52,0xf8,0x12,0x8, 0x2, 0xf8,0xd, +0x8, 0x12,0x57,0x90,0x77,0x88,0xdd,0xe, 0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x83, +0xc7,0x81,0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, +0xaf,0x92,0x17,0x80,0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0x9, 0xe1,0x8, 0xb1,0xc0,0x70, +0xe0,0x2, 0x1f,0xe9,0xe2,0x0, 0x7c,0x84,0xf0,0x0, 0x80,0xf, 0xf0,0x0, 0x80,0x9f, +0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf, +0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f, +0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf, +0x14,0x0, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, +0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, +0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdc,0xb2, +0xe0,0x0, 0x1f,0xab,0x17,0x0, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, +0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x8, 0xb1, +0xc0,0x70,0xe0,0x2, 0x1f,0x69,0x17,0x8e,0x3f,0x9e,0xf0,0x1, 0x80,0x6e,0xf0,0x0, +0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, +0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, +0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, +0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x1, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, +0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, +0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d, +0x6e,0xe, 0x6e,0x8f,0xdc,0x67,0xe0,0x0, 0x1f,0xab,0x17,0x1, 0xe0,0x1, 0xaf,0x1f, +0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f, +0xc0,0x10,0x8, 0xe1,0x8, 0xb1,0xc0,0x70,0xe0,0x2, 0x1f,0x69,0x17,0x9c,0x3f,0x9e, +0xf0,0x3, 0x80,0x4e,0xf0,0x0, 0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf, +0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff, +0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf, +0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x2, 0x6f,0x10, +0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, +0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, +0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdc,0x1c,0xe0,0x0, 0x1f,0xab, +0x17,0x2, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, +0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x8, 0xb2,0xe0,0x0, 0x19,0x2b, +0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0xe2,0x0, 0xcc,0x1, 0xaf,0x22,0xaf,0xb2, +0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, 0xaf,0x82,0xe0,0x1, 0xaf,0xe2, +0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82,0xe0,0x2, 0xaf,0x92,0x1, 0x21,0x4, 0x9e, +0xe2,0x0, 0xcc,0x2, 0x1, 0x19,0x17,0x80,0xe0,0x2, 0xaf,0x92,0x17,0x80,0xe0,0x0, +0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, 0x8f,0x5e,0xe0,0x2, +0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, 0xc7,0xff,0x8f,0x2, +0x3f,0xfe,0x4, 0xf1,0x9, 0x61,0xdf,0x7f,0x0, 0xe7,0xde,0xe9,0x0, 0xe5,0xdf,0x30, +0x0, 0xe3,0xe0,0x0, 0x1f,0xab,0xe0,0x2, 0x8f,0xcf,0x27,0x96,0xe0,0x2, 0x1f,0x1, +0x8f,0xe, 0xe2,0x0, 0xcf,0x2, 0x1, 0x11,0xe0,0x1, 0x1f,0x26,0xc7,0x82,0x8e,0x8e, +0x37,0xa1,0x3f,0x98,0x87,0xf, 0x36,0xc1,0xc6,0x81,0x16,0x60,0xe2,0x0, 0xc6,0x9f, +0x3f,0x5c,0x3e,0xce,0xae,0x8f,0x38,0x82,0x3f,0x1f,0xe0,0x1, 0x1f,0xa6,0x37,0x21, +0x8f,0x8f,0x3c,0x1e,0xc7,0x81,0x87,0x8, 0x37,0x81,0xc7,0x81,0x16,0xe0,0xe2,0x0, +0xc7,0x9f,0x3f,0x5d,0x3f,0xce,0xaf,0x88,0x38,0x82,0x8, 0xb1,0xe0,0x0, 0x1f,0xb7, +0x8f,0x8f,0x27,0x99,0xe0,0x2, 0x1f,0x81,0x8f,0x8f,0x27,0xaf,0xe0,0x2, 0x1f,0xd, +0x16,0x82,0x8f,0x8e,0xe0,0x2f,0x3f,0x8d,0x2f,0xa8,0x17,0x83,0xe0,0x2f,0x3c,0xf, +0x2f,0xa4,0x8f,0x8e,0x17,0x1, 0xe0,0x2f,0x3f,0x8e,0x2f,0x9f,0x17,0x86,0xe0,0x28, +0x3c,0xf, 0x2c,0x1b,0xe0,0x6, 0xd5,0x8a,0xe0,0x0, 0xdf,0x49,0xe0,0x2, 0x1f,0xf3, +0xe0,0x1, 0x1e,0xdf,0xa7,0x8f,0xe7,0xfb,0x16,0x7f,0xa7,0x4f,0x97,0x8d,0xe2,0x0, +0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0x17,0x1, 0xe0,0x0, 0x1f,0xab, +0xaf,0x3f,0x8, 0xa1,0xe0,0xbd,0x0, 0x88,0xe0,0x6, 0xd5,0x70,0xe0,0x0, 0xdf,0x2f, +0xe0,0x2, 0x1f,0xf3,0xe0,0x1, 0x1e,0xdf,0xa7,0x8f,0xe7,0xfb,0x16,0x7f,0xa7,0x4f, +0x97,0x8d,0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0x17,0x1, +0xe0,0x0, 0x1f,0xab,0xaf,0x3f,0x8, 0xa1,0xe0,0xbd,0x0, 0x80,0x8, 0xb2,0xc0,0x70, +0xe2,0x0, 0xcc,0x2, 0x39,0x68,0xe0,0x0, 0x5, 0xed,0xe2,0x0, 0xc9,0x6, 0x14,0x0, +0x5, 0x83,0xc0,0x10,0x9, 0x61,0xe0,0x2, 0x1f,0x8d,0x17,0xe, 0x8f,0x8f,0x3f,0x3f, +0xe0,0x2, 0x1f,0xe9,0x3f,0x9e,0xf0,0x0, 0x80,0x8f,0xf0,0x0, 0x81,0x1f,0xf0,0x0, +0x81,0xaf,0xf0,0x0, 0x82,0x3f,0xf0,0x0, 0x82,0xcf,0xf0,0x0, 0x83,0x5f,0xf0,0x0, +0x83,0xef,0x84,0x7f,0xe0,0x1, 0x84,0x8f,0xe0,0x1, 0x85,0x1f,0xe0,0x1, 0x85,0xaf, +0xe0,0x1, 0x86,0x3f,0xe0,0x1, 0x86,0xcf,0xe0,0x1, 0x87,0x5f,0xe0,0x0, 0x1f,0xab, +0xf0,0x0, 0x68,0x84,0xe0,0x2, 0x8f,0xcf,0xf0,0x0, 0x69,0x5, 0xf0,0x0, 0x69,0x86, +0xf0,0x0, 0x6a,0x7, 0xf0,0x0, 0x6a,0x88,0xf0,0x0, 0x6b,0x9, 0xf0,0x0, 0x6b,0x8a, +0x6c,0xb, 0x6c,0x8c,0x6d,0xd, 0x6d,0x8e,0x6e,0xf, 0x6e,0x90,0x6f,0x11,0x27,0x9c, +0xe0,0x2, 0x1f,0x1, 0xc7,0x82,0x8f,0xe, 0x37,0xa1,0xe2,0x0, 0xcf,0x2, 0xe0,0x1, +0x1f,0x26,0x8f,0xe, 0xe0,0x0, 0x1, 0x4b,0xe2,0x0, 0x7e,0x84,0x3f,0x9d,0x37,0x41, +0x96,0x8f,0x37,0x28,0xe0,0x2, 0xc7,0x0, 0xe7,0xc1,0x16,0x7f,0xe2,0x3e,0xc7,0x0, +0x3e,0xdc,0x3f,0x4d,0xb7,0xf, 0x3c,0x62,0xe2,0x0, 0x7c,0x84,0xdb,0xa1,0xe2,0x0, +0x7c,0x4, 0xe0,0x5, 0xdd,0x7a,0x3c,0x62,0xdf,0x41,0x14,0x1, 0xc0,0x10,0x9, 0x61, +0xe0,0x0, 0x1f,0x2b,0x14,0xe, 0x3c,0x32,0xe0,0x2, 0x1f,0xe9,0xe0,0x2, 0x8f,0x4e, +0x3c,0x1f,0x27,0x70,0xe0,0x2, 0x1e,0x81,0x8e,0x8d,0xe2,0x0, 0xce,0x82,0x16,0x87, +0x3e,0xb2,0x3e,0x9e,0x1, 0x11,0xc6,0x82,0xe0,0x1, 0x1f,0x26,0x36,0xa1,0x8f,0xe, +0x3f,0x9d,0x86,0x8f,0x37,0x41,0xc7,0x1, 0x16,0x60,0xe2,0x0, 0xc7,0x1f,0x3e,0xdc, +0x3f,0x4d,0xaf,0xf, 0x0, 0xd7,0xe0,0x1, 0x1f,0x26,0xc6,0x82,0x8f,0xe, 0x36,0xa1, +0x3f,0x9d,0xc7,0x1, 0x86,0x8f,0x37,0x1, 0x0, 0xef,0xe2,0x0, 0x7e,0x84,0xc7,0x1, +0x3f,0x9d,0x37,0x1, 0x96,0x8f,0xc7,0x1, 0xe2,0x0, 0xc7,0x1f,0xe7,0xc1,0x16,0x7f, +0x37,0x28,0x3e,0xdc,0x3f,0x4d,0xb7,0xf, 0xe7,0xff,0x0, 0xb7,0xe0,0x0, 0x1f,0xab, +0x8e,0x9f,0x8f,0xf, 0x3e,0xfe,0x4, 0x83,0x14,0x0, 0x38,0x82,0x8f,0x1f,0x37,0x25, +0x3f,0x9e,0xa4,0x6f,0xe2,0x1, 0xc4,0x7f,0xe7,0xfe,0x0, 0xc2,0x8, 0xb2,0xe0,0x2, +0x1f,0x7f,0xe0,0x1, 0x1f,0xe1,0x8e,0x8e,0x87,0x6f,0xe2,0x0, 0xc6,0x87,0x36,0xa5, +0xe2,0x0, 0xc7,0x1f,0x3f,0x4d,0xaf,0x6f,0x16,0x60,0x9f,0x3f,0x86,0xef,0x37,0x48, +0xc7,0x1, 0xe2,0x0, 0xc7,0x1f,0x3e,0xdc,0x3f,0x4d,0xaf,0x6f,0x9f,0x3f,0x37,0x48, +0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xcf,0x1f,0x1, 0x85,0x87,0x6f,0x3f,0x5c,0xcf,0x4, +0xaf,0x6f,0x17,0x80,0xe0,0x0, 0x19,0x2b,0x17,0x7f,0xaf,0xb2,0x14,0x0, 0xaf,0x92, +0xaf,0x22,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, 0xaf,0x82,0xe0,0x1, +0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82,0xe0,0x1, 0xd2,0x6e,0x8f,0x12, +0x8f,0x82,0x3f,0x7f,0x4, 0x87,0x17,0x83,0x14,0x1, 0xaf,0xb2,0x9, 0x21,0xe0,0x24, +0x0, 0xe4,0x8f,0x92,0x37,0xa5,0x3f,0x92,0xa4,0x6f,0xe2,0x1, 0xc4,0x7f,0xde,0xf7, +0xe2,0x0, 0xcc,0x1, 0x1, 0xf1,0x14,0x1, 0x9, 0x21,0xe0,0x24,0x0, 0xd6,0x8, 0xb5, +0xe0,0x0, 0x19,0x2b,0x3a,0xe8,0x8f,0xb2,0xe2,0x0, 0xcf,0x81,0x1, 0x97,0xe0,0x1, +0x19,0xdf,0xe0,0x2, 0x1a,0x73,0x97,0x83,0xe2,0x0, 0xc7,0x81,0x2f,0x87,0xa7,0x84, +0xe0,0x4, 0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x27,0x83,0xe0,0x1, 0xd2,0x4, 0xe0,0x3, +0xd4,0xac,0x8f,0xb2,0xe2,0x0, 0xcf,0x81,0x1, 0x6f,0x2a,0x82,0xa, 0xe1,0xa, 0xa1, +0xe0,0xb8,0x0, 0xf2,0x8, 0xb1,0xe0,0x1, 0x1f,0xdf,0x97,0x8f,0xe2,0x0, 0xc7,0x81, +0x2f,0xa0,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xe0,0x4, 0xa7,0xff,0xe2,0x0, 0xc7,0x81, +0x2f,0x98,0xe0,0x3, 0xd4,0x92,0xe0,0x0, 0x1f,0x2b,0xe0,0x2, 0x8c,0x1e,0x24,0x10, +0x8f,0xce,0x27,0x84,0x0, 0x91,0x8e,0xcc,0x2e,0x8f,0xe0,0x2, 0x8e,0x9e,0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe0,0xc, 0x3f,0x1f,0x2, 0xf6,0x14,0x0, 0x8, 0xe1, +0xe0,0x1, 0xd1,0xd1,0x0, 0xe7,0x14,0x1, 0x8, 0xe1,0xe2,0x0, 0xcc,0x5, 0x2, 0x87, +0xe0,0x0, 0x1f,0xab,0x3c,0x1f,0xe0,0x2, 0x8c,0x28,0x38,0x82,0x14,0x0, 0x38,0x82, +0x8, 0xb2,0xe0,0x1, 0x1f,0xdf,0x39,0x68,0x97,0x8f,0xe2,0x0, 0xc7,0x81,0x2f,0x9f, +0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xe0,0x4, 0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x2f,0x97, +0xe0,0x3, 0xd4,0x5b,0xe2,0x0, 0xc9,0x5, 0xe0,0x0, 0x1f,0xab,0x17,0x0, 0x2, 0x84, +0x39,0x1f,0xe0,0x2, 0x8f,0x22,0xe0,0x2, 0x8e,0x9f,0x14,0x1, 0x3e,0xfe,0x5, 0x86, +0x3f,0x9e,0x8c,0x4f,0x17,0x80,0xe1,0x28,0x3c,0xf, 0x9, 0x61,0xe0,0x1, 0xd1,0x9b, +0x0, 0xe8,0x8, 0xb1,0xe0,0x5, 0xdc,0x10,0xe0,0x0, 0x1f,0xab,0x16,0x83,0xae,0xbf, +0x17,0x2, 0xaf,0x4f,0x16,0x80,0xaf,0x5f,0xaf,0x6f,0xaf,0x7f,0xe0,0x1, 0x1e,0x5f, +0xe0,0x1, 0xaf,0xf, 0x97,0x8c,0xe0,0x2, 0x1f,0x5a,0xe3,0xff,0xc7,0xef,0xb7,0x8c, +0x97,0x8e,0xe3,0xff,0xc7,0xdf,0xb7,0x8e,0xe0,0x1, 0x1f,0xfa,0xae,0x8f,0xe0,0x1, +0x1f,0xb1,0xa7,0xf, 0xe0,0x0, 0x1f,0x90,0xae,0x8f,0xe7,0x7f,0x16,0xff,0xa7,0x8e, +0x3f,0xdd,0xbf,0x8e,0x8, 0xe1,0xe0,0x0, 0x1f,0xab,0x8f,0x3f,0xe2,0x0, 0xcf,0x1, +0x1, 0x2, 0x38,0x82,0x87,0x1f,0xaf,0x2f,0xe0,0x1, 0x8f,0x7f,0xc7,0x1, 0xe0,0x1, +0xaf,0x7f,0xe0,0x1, 0x8f,0x6f,0xc7,0x1, 0xe0,0x1, 0xaf,0x6f,0xe0,0x1, 0x8e,0xef, +0x8f,0x1f,0x37,0x25,0x3f,0x1f,0xe0,0x6, 0x8f,0x5e,0x3e,0xfe,0x4, 0xeb,0x17,0x0, +0xe0,0x1, 0xaf,0x6f,0x8f,0x1f,0xc7,0x1, 0xaf,0x1f,0x8e,0x9f,0x8f,0xf, 0x3e,0xfe, +0x3, 0xe1,0x17,0x3, 0xaf,0x3f,0x38,0x82,0x8, 0xb4,0xe0,0x0, 0x19,0x2b,0xe0,0x1, +0x8f,0x72,0x8f,0xa2,0x89,0xb2,0xe2,0x0, 0xc9,0x81,0x1, 0x2, 0xa, 0x61,0x8e,0x22, +0x8e,0x82,0x3e,0x7d,0x3, 0xa8,0x37,0xa3,0x8e,0xa2,0x3f,0x9e,0xc7,0x87,0x36,0xa5, +0x37,0xa2,0x3f,0x92,0xe0,0x4, 0x39,0x1e,0x3e,0x92,0xa6,0xed,0xa4,0x8f,0xe0,0x1, +0x8f,0x94,0xe4,0x0, 0xc7,0x87,0x3f,0x9e,0xc7,0x82,0xe0,0x2, 0x1f,0x69,0x37,0xa1, +0x3f,0x9e,0x8c,0x1f,0x34,0x47,0x24,0x8f,0xe0,0x1, 0x17,0xff,0x3f,0xdd,0xe0,0x2, +0x1f,0x7b,0xe2,0x0, 0xcf,0x86,0xa9,0x8e,0x2, 0x86,0xe0,0xf, 0x31,0xbf,0xe2,0x0, +0xc7,0xd7,0x2f,0x8c,0x8f,0x12,0x8f,0x82,0x3f,0x7f,0x4, 0xd1,0x17,0x82,0xaf,0xb2, +0x17,0x0, 0xe0,0x0, 0x1f,0x94,0xaf,0xf, 0xa, 0x61,0xef,0xff,0xd6,0x85,0xe0,0x1, +0x1f,0xdf,0x9f,0x8f,0x37,0xc4,0xe2,0x0, 0xc7,0x81,0x27,0x86,0x17,0x2, 0xaf,0x44, +0xe0,0x5, 0xdb,0x72,0x0, 0xe8,0xa9,0xc4,0x0, 0xfc,0x0, 0x0, 0x8, 0xb1,0xc0,0x68, +0xe0,0x2, 0x1f,0xbf,0xe9,0xff,0xc4,0x7e,0x87,0x5f,0x86,0xcf,0xe0,0xf, 0x34,0x41, +0x6f,0x5, 0x14,0x85,0x17,0x0, 0x7f,0x83,0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0x80, +0x6e,0x84,0x6f,0x6, 0x77,0x84,0xe0,0x5, 0xdd,0xd9,0xc0,0x18,0x8, 0xe1,0xe0,0x2, +0x1f,0xa8,0xe0,0x2, 0x1f,0x3f,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, 0xc7,0x81, +0x3e,0xff,0x1, 0x2e,0x9f,0xde,0xe0,0x2, 0x1e,0xf0,0xe2,0x0, 0xcc,0x2, 0xe0,0x2, +0x1f,0x6f,0x3d,0xed,0xe0,0x6b,0x39,0x2e,0xe2,0x0, 0xcc,0x85,0x16,0x1, 0x36,0x39, +0x2, 0x12,0x27,0x91,0x15,0x7f,0x3d,0x1f,0xe3,0xff,0xc5,0x7f,0x17,0x7f,0xe2,0x1, +0xc6,0x7f,0x3f,0x1b,0x3d,0x1b,0x86,0x9e,0x3e,0xcc,0xe0,0x80,0xae,0x9e,0x3f,0x7a, +0x1, 0xfb,0x0, 0x83,0xe2,0x1, 0xc6,0x7f,0x16,0x86,0x3e,0x9f,0x3e,0x9b,0x3f,0x9b, +0x87,0xf, 0x3f,0x4c,0xe1,0x80,0xaf,0x1f,0x3e,0xff,0x1, 0xfb,0x38,0x82,0x9f,0xee, +0x0, 0xd3,0xe0,0x2, 0x1f,0xa8,0xe0,0x2, 0x1f,0x3f,0x87,0x8f,0xe0,0x3, 0x8e,0xae, +0xe2,0x0, 0xc7,0x81,0x3e,0xff,0x1, 0x3c,0x9f,0xde,0xe0,0x2, 0x1f,0x70,0xe2,0x0, +0xcc,0x2, 0xe0,0x2, 0x1e,0xef,0x3e,0x6e,0xe0,0x6c,0x39,0x2d,0xe2,0x0, 0xcc,0x85, +0x14,0x1, 0x34,0x39,0x2, 0x18,0x27,0x97,0x14,0xff,0x3c,0x9f,0xe3,0xff,0xc4,0xff, +0xc4,0x81,0x3e,0xea,0x3f,0x6c,0x3c,0x9c,0xf0,0x41,0x3b,0x88,0x9d,0x8d,0xc6,0x82, +0xe2,0x9, 0xcd,0xaf,0x2, 0x85,0x85,0x8e,0xe8,0xb, 0x3d,0xd7,0xad,0x8e,0xc7,0x1, +0x3f,0x79,0x1, 0xf5,0x17,0x6, 0xe0,0xd, 0x37,0xa1,0x3f,0x1f,0x3f,0x1c,0x3f,0x9c, +0x3d,0x1d,0xe0,0x41,0x3e,0x8, 0x9e,0x8a,0xc5,0x2, 0xe2,0x9, 0xce,0xaf,0x2, 0x84, +0x86,0x8f,0x3e,0xdc,0xae,0x8f,0xc7,0x81,0x3f,0x7f,0x1, 0xf6,0x38,0x82,0x9f,0xee, +0x0, 0xc5,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0x39,0x68,0xe0,0x1, 0xd2,0x26,0xe0,0x2, +0x1f,0xa8,0xe0,0x2, 0x1f,0x3f,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, 0xc7,0x81, +0x3e,0xff,0x3b,0x68,0xe0,0x0, 0x1, 0x77,0x95,0x5e,0xc5,0x6, 0xe3,0xff,0xc5,0x7f, +0xe2,0x0, 0xc9,0x2, 0xe0,0x2, 0x1c,0x6f,0xe0,0x2, 0x1f,0xf0,0x14,0x80,0xe0,0x68, +0x39,0xaf,0xe0,0x7, 0xd8,0xa3,0xe0,0x0, 0x2b,0x62,0xe0,0x2, 0x1f,0xf3,0xe0,0x1, +0x1e,0xdf,0xa7,0x8f,0x16,0x5f,0xa7,0x4f,0x97,0x8d,0x37,0x45,0xe2,0x0, 0xc7,0x20, +0x3f,0xdc,0x3f,0xce,0xe0,0x2, 0x1a,0xf0,0xf0,0x1, 0x1c,0x4c,0xf0,0x1, 0x1c,0xcb, +0xb7,0x8d,0x11,0x85,0xe0,0x13,0x13,0xc4,0x12,0x1, 0x3c,0x67,0xe0,0x5, 0xd2,0x3, +0x3c,0xe3,0x3c,0x62,0xdf,0x3d,0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd3,0xb, 0xdd,0xa7, +0x23,0x2d,0x3c,0xe2,0x3c,0x64,0xde,0x4d,0x24,0x7d,0xe8,0x40,0x3d,0x68,0x3c,0xe3, +0x3c,0x62,0xc1,0xff,0xdf,0x67,0xe0,0x43,0x39,0x83,0x3c,0xe3,0x3c,0x62,0xdf,0x28, +0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd2,0xf6,0x3c,0x64,0xdd,0xe2,0xe8,0x40,0x3d,0x69, +0x3c,0xe3,0x3c,0x62,0xdf,0x57,0xe0,0x1, 0xd2,0x36,0x2c,0xd, 0xc1,0xff,0xe0,0x43, +0x39,0x83,0xe2,0x0, 0xc9,0x80,0x3, 0x52,0xe0,0x2, 0x1c,0x70,0x3c,0xe2,0xef,0xff, +0xd2,0xe1,0x2b,0xc, 0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x3c,0x64,0xdd,0xc9,0xe8,0x40, +0x3d,0x68,0x3c,0xe3,0x3c,0x62,0xdf,0x3e,0x0, 0xe7,0xe0,0x0, 0x1f,0xb7,0x8c,0xf, +0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xf7,0x0, 0xf2,0xd8,0xf2,0x13,0x1, 0xe7,0xff, +0x0, 0x9e,0x95,0x6e,0xc5,0x6, 0xe3,0xff,0xc5,0x7f,0xe7,0xff,0x0, 0x8b,0x8, 0xb1, +0xe0,0x2, 0x1f,0x87,0x17,0x0, 0xb7,0xf, 0xdf,0x6d,0x14,0x1, 0x8, 0xe1,0x8, 0xb6, +0xe0,0x2, 0x1f,0x8d,0x8a,0xf, 0xe0,0x1, 0xd1,0xfe,0x2c,0x1e,0xe0,0x2, 0x1a,0xba, +0x11,0x1, 0x8f,0x85,0x37,0xd4,0x3f,0xd2,0x2f,0x83,0x3c,0x62,0xb, 0x61,0xe0,0x2, +0x1f,0x3b,0xe0,0x6, 0x31,0x34,0x8f,0x8e,0xe2,0x1, 0xc3,0x7f,0x3f,0xc6,0x39,0xe8, +0x3c,0x62,0xaf,0x8e,0xdd,0x8d,0xe0,0x2, 0x1f,0x87,0x3c,0x64,0xb1,0x8f,0xdf,0x4a, +0xe0,0x1, 0xd1,0xe1,0x24,0x4, 0x11,0x0, 0x3c,0x62,0xb, 0x61,0x8f,0x85,0xe3,0x6, +0x3f,0xd6,0xab,0x5, 0xd7,0xe6,0xe0,0x1, 0xd1,0x23,0x0, 0xe0,0x8, 0xb5,0xe0,0x2, +0x1f,0x8d,0x3a,0xe8,0x89,0x8f,0xe0,0x1, 0xd1,0xce,0x2c,0x1a,0xe0,0x2, 0x1a,0x3b, +0x39,0x68,0x8f,0x84,0x14,0x1, 0x37,0xd3,0x3f,0xd8,0x2f,0x82,0xa, 0xe1,0xdd,0x68, +0x3c,0xe3,0x3c,0x62,0xe0,0x6, 0xd5,0xec,0xe0,0x1, 0x1f,0xd0,0xe0,0x1, 0x1d,0x49, +0xe0,0x1, 0x1c,0xc8,0xa4,0xf, 0x3d,0xe3,0xe0,0x6, 0xd2,0x42,0x2c,0x3, 0x14,0x0, +0xa, 0xe1,0xe0,0x1, 0xd1,0xb0,0x2c,0x7c,0x2a,0x8d,0x8f,0x84,0x11,0x1, 0xe0,0x3, +0x31,0x33,0xe3,0x3, 0x3f,0xd3,0xa9,0x84,0xe0,0x1, 0xd0,0xf2,0xd7,0xb2,0x3c,0x62, +0xa, 0xe1,0xdc,0xf5,0x0, 0xf3,0x8, 0xb3,0xe0,0x3, 0xd0,0x98,0xe0,0x1, 0xd1,0xaa, +0xe0,0x2, 0x1f,0xba,0x8f,0x8f,0x27,0x8b,0xe0,0x13,0x11,0x44,0x0, 0x86,0x3c,0x62, +0xe0,0x5, 0xd1,0x39,0xe0,0x1, 0xd1,0x9e,0xdf,0x8b,0x24,0x7a,0xe0,0x2, 0x1f,0xbb, +0x11,0x1, 0x8f,0x8f,0xe0,0x13,0x11,0xc4,0x2f,0x87,0x0, 0x89,0x3c,0x63,0xe0,0x5, +0xd1,0x2a,0xe0,0x1, 0xd1,0x8f,0x3c,0x62,0xdf,0xaa,0x24,0x79,0x9, 0xe1,0xe0,0x1, +0x1f,0xde,0x16,0x7e,0xa6,0x8f,0xe0,0x0, 0x1f,0xac,0xa7,0x1d,0xa7,0x8f,0xcf,0x40, +0xbf,0x1d,0x17,0x0, 0xaf,0x7f,0x15,0xfd,0xa7,0xf, 0xe0,0x1, 0x1e,0xb1,0x3f,0x5c, +0xbf,0xf, 0xa7,0xf, 0xa6,0x8d,0x3f,0x5b,0xbf,0xf, 0xe0,0x1, 0xa7,0xd, 0x37,0x48, +0xe2,0x0, 0xc7,0x1, 0x2f,0x1c,0xe0,0x1, 0x1f,0x23,0x87,0xe, 0xe2,0x1, 0xc7,0x7e, +0xe0,0x1, 0xaf,0x3f,0x17,0x8, 0xe0,0x61,0x3f,0x11,0x17,0x10,0xe0,0x61,0x3f,0x11, +0xa7,0x4f,0xcf,0x10,0xbf,0x4f,0xe0,0x61,0x3f,0x82,0xcf,0x88,0xe0,0x61,0x3f,0x92, +0xe0,0x61,0x3f,0x82,0xcf,0x90,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x1, 0xa7,0xd, +0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x2f,0x60,0xe0,0x1, 0x1f,0x23,0xe0,0x1, 0x87,0x4e, +0x3e,0x5e,0xe0,0x1, 0xae,0x3f,0x0, 0xdf,0xd, 0xbf,0xe0,0x1, 0x1f,0xde,0xa7,0x8f, +0xa7,0x6f,0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa6,0x8e, +0xe0,0x2, 0xa7,0xd, 0x37,0x49,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x57,0xa7,0x6f, +0x37,0x41,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, +0xa7,0xe, 0x37,0x41,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x32,0xa7,0x6f,0x37,0x4a, +0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x16,0xa7,0x6f,0xe2,0x0, 0xc7,0x1, +0x27,0xa, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0xe2,0x0, 0xc7,0x1, +0xe0,0x2, 0x2f,0x7e,0xa7,0x6f,0x37,0x48,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x48,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, +0x2f,0x62,0xa7,0x6f,0x37,0x43,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x48, +0xa7,0x6f,0x37,0x42,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x42,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x25,0xa7,0x6f, +0x37,0x47,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, +0xa7,0xe, 0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x9, 0xa7,0x6f,0x37,0x4b, +0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0x37,0x4b,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x60,0xa7,0x6f,0x37,0x4c,0xe2,0x0, +0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4d, +0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x44,0xa7,0x6f,0x37,0x4d,0xe2,0x0, 0xc7,0x1, +0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4c,0xe2,0x0, +0xc7,0x1, 0xe0,0x1, 0x2f,0x28,0xa7,0x6f,0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0xb, +0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, +0xe0,0x1, 0x2f,0xc, 0xa7,0x6f,0x37,0x4f,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4f,0xe2,0x0, 0xc7,0x1, 0xe0,0x0, +0x2f,0x69,0xa7,0x6f,0x37,0x44,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x44,0xe2,0x0, 0xc7,0x1, 0xe0,0x0, 0x2f,0x4f, +0xa7,0x6f,0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x27,0xa, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x2f,0x29,0xa7,0x6f,0x37,0x46, +0xe2,0x0, 0xc7,0x1, 0x27,0x1f,0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0x37,0x46,0xe2,0x0, 0xc7,0x1, 0x27,0x16,0xa7,0x5f,0xa6,0xdf,0x37,0x46,0xe2,0x0, +0xc7,0x1, 0xe7,0xff,0x16,0x3f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc,0x37,0x26,0x3f,0x4d, +0xbf,0x5f,0xa7,0x6f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0x8d,0xcf,0xc0, +0xb7,0x8d,0x17,0x81,0xe0,0x61,0x3f,0x91,0xf, 0xab,0x38,0x0, 0xa7,0x5f,0xa6,0xdf, +0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe7,0xfe,0x16,0x7f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc, +0x37,0x27,0x3f,0x4d,0xbf,0x5f,0x16,0x5f,0xa7,0x6f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c, +0xbf,0x6f,0x9f,0xd, 0xcf,0x20,0xb7,0xd, 0x0, 0xc2,0xa7,0x6f,0x16,0x6f,0xe0,0x2, +0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x10,0xb7,0xd, 0xe7,0xff,0x0, 0xaa, +0xa7,0x6f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xe0,0x2, 0x1e,0x83,0xbf,0x6f,0x17,0x1, +0xe0,0x0, 0x1e,0x1a,0xaf,0xd, 0xe0,0x2, 0x1e,0xaa,0xaf,0xc, 0x9f,0xd, 0xe1,0x0, +0xcf,0x0, 0xb7,0xd, 0xe7,0xff,0x0, 0x87,0xa7,0x6f,0xe7,0x7f,0x16,0x7f,0xe0,0x2, +0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x80,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe, +0x0, 0xeb,0xa7,0x6f,0xe7,0xbf,0x16,0x7f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f, +0x9f,0xd, 0xe0,0x40,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0xcf,0xa7,0x6f,0xe7,0xdf, +0x16,0x7f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x20,0xcf,0x0, +0xb7,0xd, 0xe7,0xfe,0x0, 0xb3,0xa7,0x5f,0xa6,0xdf,0x37,0x4f,0xe2,0x0, 0xc7,0x1, +0xe6,0xff,0x16,0x7f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc,0x37,0x2f,0x3f,0x4d,0xbf,0x5f, +0xe7,0xef,0x16,0x7f,0xa7,0x6f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, +0xe0,0x10,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0x8a,0xa7,0x6f,0xe7,0xfe,0x16,0x7f, +0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x1, 0xcf,0x0, 0xb7,0xd, +0xe7,0xfd,0x0, 0xee,0xa6,0xef,0xe0,0x0, 0x1f,0x22,0x16,0x7b,0xa7,0xe, 0x3e,0xdc, +0xbe,0xef,0xa6,0x9e,0xe0,0x2, 0x1e,0x2a,0xce,0x81,0xbe,0x9e,0xa6,0x9e,0xce,0x90, +0xbe,0x9e,0x9f,0xc, 0xcf,0x4, 0xb7,0xc, 0xe7,0xfd,0x0, 0xcb,0xa7,0x6f,0x16,0x77, +0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x8, 0xb7,0xd, 0xe7,0xfd, +0x0, 0xb1,0xa7,0x6f,0xe7,0xfd,0x16,0x7f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f, +0x9f,0xd, 0xe0,0x2, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfd,0x0, 0x95,0xa7,0x6f,0x16,0x7e, +0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x1, 0xb7,0xd, 0xe7,0xfc, +0x0, 0xfb,0xa7,0x6f,0xe7,0xf7,0x16,0x7f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f, +0x9f,0xd, 0xe0,0x8, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfc,0x0, 0xe1,0xe0,0x1, 0x1f,0x59, +0x16,0x81,0xae,0x8e,0x16,0x5f,0xe0,0x0, 0x1f,0x2c,0xa6,0x8e,0xa7,0xd, 0x3f,0x5c, +0xbf,0xd, 0x16,0x7d,0xa7,0x6f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, +0xcf,0x2, 0xb7,0xd, 0xe7,0xfc,0x0, 0xbc,0xe0,0x1, 0xa7,0x6d,0xe7,0xef,0x15,0xff, +0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6d,0xe0,0x1, 0xa7,0x6d,0xe0,0x2, 0x1e,0x2a, +0x3f,0x5b,0xe0,0x1, 0xbf,0x6d,0xe7,0xfb,0x16,0xff,0xa7,0x6f,0x3f,0x5d,0xbf,0x6f, +0x9f,0xc, 0xe0,0x4, 0xcf,0x0, 0xb7,0xc, 0xe7,0xfc,0x0, 0x93,0xf, 0x3f,0xe0,0x1, +0x1f,0x61,0x97,0xde,0xe0,0x40,0xcf,0x80,0xb7,0xde,0x17,0x82,0xe0,0x61,0x3f,0x91, +0xf, 0xae,0x38,0x0, 0xf, 0xbf,0x17,0x84,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0xf, 0xbf,0x17,0xa0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x0, +0x17,0xc0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xe, 0x3f,0xe0,0x2, 0x1f,0x7, +0xe0,0x0, 0x1e,0x9e,0x9f,0x8e,0xe0,0x2, 0x1e,0xc, 0xc7,0x81,0xb7,0x8e,0x9f,0x8d, +0x9f,0xc, 0xc7,0x81,0xb7,0x8d,0x27,0x3, 0xc7,0x7f,0xb7,0xc, 0xe0,0x2, 0x1f,0xd4, +0x8f,0xf, 0x27,0x4, 0x8f,0xf, 0xc7,0x7f,0xaf,0xf, 0x8f,0x8f,0x2f,0x86,0xe0,0x1, +0x1f,0x5f,0x97,0x8e,0xcf,0x88,0xb7,0x8e,0xe0,0x2, 0x1e,0xac,0xe0,0x2, 0x1f,0x0, +0x9f,0x8d,0xc7,0x81,0xb7,0x8d,0x9f,0x8e,0x27,0x84,0x9f,0x8e,0xc7,0xff,0xb7,0x8e, +0xe0,0x2, 0x1f,0xea,0x9f,0xf, 0x27,0x4, 0x9f,0xf, 0xc7,0x7f,0xb7,0xf, 0xe0,0x2, +0x1f,0xc0,0xe0,0x0, 0x1f,0x2e,0xa7,0x8f,0x97,0xe, 0xb7,0x3f,0xa7,0xf, 0xcf,0x1, +0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe0,0x2, 0x17,0x80,0xe0,0x61, +0x3f,0x91,0xf, 0xac,0x38,0x0, 0xf, 0xbf,0xe0,0x4, 0x17,0x80,0xe0,0x61,0x3f,0x91, +0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x8, 0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf, +0x38,0x0, 0xf, 0xbf,0xe0,0x10,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0xf, 0xbf,0xe0,0x80,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf, +0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0x8, 0xb1,0xe8,0x0, +0xc, 0x37,0xe0,0x2, 0xdc,0x56,0x17,0x88,0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8, +0x8, 0xa1,0x38,0x0, 0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x2, 0xdc,0x85,0x17,0x90, +0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x8, 0xb1,0xe8,0x0, +0xc, 0x37,0xe0,0x2, 0x1f,0xa6,0xe7,0xfe,0x16,0xff,0xa7,0xf, 0xa7,0xbe,0x3f,0xdd, +0xbf,0xbe,0xe0,0x4, 0xde,0x38,0xe0,0x40,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf0,0x0, +0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x3f,0x83,0xe0,0x1, 0x1f,0xab,0xe0,0x6, 0x8f,0xf, +0xc7,0x7f,0xe0,0x6, 0xaf,0xf, 0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f,0xa7,0xe, +0xe0,0x60,0x3f,0x19,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f,0xa7,0x1e,0xe0,0x60, +0x3f,0x1a,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f,0xa7,0x2e,0xe0,0x60,0x3f,0x18, +0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x9e,0xa7,0xbf,0xe0,0x61,0x3f,0x92,0x3b,0x0, +0x38,0x82,0xe0,0x1, 0x1d,0x54,0x16,0x84,0xae,0x8a,0x17,0x81,0xaf,0x9a,0x17,0x2, +0xaf,0xaa,0xf0,0x0, 0x13,0x80,0xae,0xba,0xf8,0x40,0x3a,0xe7,0xae,0xca,0x14,0x1, +0xaf,0x5a,0xaf,0x6a,0xaf,0x7a,0xe0,0x1, 0xaf,0xa, 0x17,0x3, 0xe0,0x1, 0xaf,0x9a, +0xe0,0x1, 0xaf,0xaa,0xe0,0x1, 0xaf,0xba,0xe0,0x1, 0xaf,0xca,0xe0,0x1, 0xaf,0xda, +0xe0,0x0, 0x17,0x80,0xe0,0x1, 0xaf,0x6a,0xf0,0x2, 0x1b,0x33,0xe0,0x1, 0xaf,0xfa, +0xf0,0xb, 0x33,0xa2,0xe8,0xb, 0x3d,0x96,0xf0,0x0, 0xba,0x8b,0xe0,0x0, 0x17,0x80, +0xe8,0x9, 0x3d,0x17,0xe0,0xe, 0x3d,0x1f,0x8e,0xe, 0x8e,0x89,0xe0,0xe, 0x34,0x3f, +0x3e,0x7d,0xc7,0x81,0x5, 0x84,0xa6,0x8b,0x3f,0x4d,0xbf,0xb, 0xe2,0x0, 0xcf,0x90, +0x1, 0xf2,0xf0,0x0, 0xc3,0x81,0xf2,0x0, 0xcb,0x90,0x1, 0xe3,0xe0,0x1, 0x1f,0xab, +0x17,0x0, 0xe0,0x6, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x33,0xe0,0xf, 0x34,0x22, +0x3f,0x1f,0xa7,0x8e,0x27,0xb3,0x3f,0x83,0xe0,0x1, 0x1f,0xab,0xe0,0x6, 0x8e,0x8f, +0xe0,0x60,0x3e,0x9, 0x36,0xa4,0x3e,0x9f,0xbe,0xd, 0xe0,0x6, 0x8e,0x8f,0xe0,0x60, +0x3e,0xa, 0x36,0xa4,0x3e,0x9f,0xbe,0x1d,0xe0,0x6, 0x8e,0x8f,0xe0,0x60,0x3e,0x8, +0x36,0xa4,0x3e,0x9f,0xbe,0x2d,0xe0,0x6, 0x8e,0x8f,0xe0,0x61,0x3e,0x2, 0x36,0xa4, +0x3e,0x9f,0xbe,0x3d,0xe0,0x6, 0x8e,0x8f,0xc6,0x81,0xe0,0x6, 0xae,0x8f,0xa7,0x8e, +0xe0,0x61,0x3f,0x92,0x17,0x81,0xe0,0x8, 0x37,0xb8,0xe0,0x61,0x3c,0x11,0xe0,0x60, +0x3f,0x80,0xcf,0x82,0xe0,0x60,0x3f,0x90,0x3b,0x0, 0x38,0x82,0x8, 0xb4,0xe8,0x0, +0xc, 0x37,0xe0,0x2, 0x1f,0xf3,0xa1,0xf, 0xa7,0xb2,0x37,0xcf,0xe2,0x0, 0xc7,0x81, +0x27,0x87,0xa7,0x82,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xf2,0xa7,0xb2, +0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xf1, +0xa7,0xb2,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xc1,0xe2,0x0, +0xc7,0x81,0xe0,0x0, 0x2f,0xed,0xa7,0xb2,0x37,0xca,0xe2,0x0, 0xc7,0x81,0x27,0x87, +0xa7,0x82,0x37,0xca,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xe9,0xa7,0xb2,0x37,0xcb, +0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0x37,0xcb,0xe2,0x0, 0xc7,0x81,0x2f,0xbd, +0xa7,0xb2,0x37,0xcc,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xcc,0xe2,0x0, +0xc7,0x81,0xe0,0x0, 0x2f,0xe6,0xa7,0xb2,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0xa5, +0xa7,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0xa0,0xa7,0x92,0xe0,0x0, 0x1a,0x10, +0xe0,0x1, 0xcf,0x80,0xbf,0x92,0x8f,0x84,0xe0,0x1, 0x19,0xdf,0x27,0x89,0x99,0x3, +0x31,0x4c,0xe2,0x0, 0xc1,0x1, 0x29,0x4, 0xe0,0x5, 0xd6,0x76,0xa9,0x4, 0x97,0x83, +0xe0,0x2, 0x1f,0x72,0xe3,0xdf,0xc7,0xff,0xb7,0x83,0x97,0x83,0xe3,0xbf,0xc7,0xff, +0xb7,0x83,0x9f,0x8e,0xc7,0x81,0xb7,0x8e,0xe0,0x1, 0x17,0x80,0xe0,0x61,0x3f,0x91, +0xf0,0x0, 0xb, 0xa8,0xa, 0x21,0x38,0x0, 0xa7,0x92,0xe0,0x2, 0x1f,0x5a,0xe0,0x10, +0xcf,0x80,0xbf,0x92,0x97,0x8e,0xcf,0xa0,0xb7,0x8e,0xe7,0xff,0x0, 0xbb,0xa7,0x92, +0xe1,0x0, 0xcf,0x80,0xbf,0x92,0xe0,0x0, 0xdb,0x32,0xe7,0xff,0x0, 0x8a,0xa7,0x92, +0xcf,0x81,0xbf,0x92,0xe0,0x0, 0xdb,0x18,0xe7,0xff,0x0, 0x8c,0xa7,0x92,0xcf,0x82, +0xbf,0x92,0xe0,0x0, 0xdb,0x24,0xe7,0xff,0x0, 0x90,0xa7,0x92,0xe0,0x1, 0x19,0xdf, +0xe0,0x8, 0xcf,0x80,0xbf,0x92,0x97,0x83,0xe0,0x1, 0x1f,0x61,0xcf,0x82,0xb7,0x83, +0x97,0xce,0xcf,0x88,0xb7,0xce,0xe0,0x0, 0xda,0xee,0xe7,0xff,0x0, 0x89,0xa7,0x92, +0x14,0x7, 0xe0,0x20,0xcf,0x80,0xbf,0x92,0xdf,0x18,0xe0,0x2, 0x1e,0xda,0xe0,0x1, +0x19,0xdf,0x9f,0xd, 0x97,0x83,0x16,0x6f,0x37,0x41,0xe2,0x0, 0xc7,0x10,0x3f,0xdc, +0x3f,0xce,0xb7,0x83,0x97,0x8d,0xe3,0xff,0xc7,0xdf,0xb7,0x8d,0xd9,0x65,0xd9,0x8d, +0xa7,0x92,0xe0,0x1, 0x1f,0x61,0xe0,0x20,0xcf,0x80,0xbf,0x92,0xe7,0x0, 0x16,0x80, +0x97,0xde,0x3f,0xcd,0xb7,0xde,0xe0,0x2, 0x1f,0xb3,0xa7,0xff,0x2f,0x87,0xe0,0x1, +0x17,0x80,0xe0,0x61,0x3f,0x91,0xe7,0xfe,0x0, 0xf0,0xde,0x7e,0xe7,0xfe,0x0, 0xed, +0xe0,0x2, 0x1f,0xb3,0xe0,0xe, 0x34,0x22,0x3f,0x9e,0xa7,0x8f,0x2f,0x87,0x17,0x81, +0xe0,0x8, 0x37,0xb8,0xe0,0x61,0x3c,0x11,0x38,0x82,0xe7,0xfc,0x0, 0xee,0x8, 0xb1, +0xe0,0x7, 0xd3,0x61,0xe0,0x60,0x3f,0x87,0xe0,0x1, 0x1f,0x29,0xe0,0x1, 0xbf,0xf, +0xe0,0x2, 0x1f,0x27,0xe0,0x1, 0xbf,0x1f,0xe0,0x2, 0x1f,0x4f,0xe0,0x1, 0xbf,0x2f, +0xe0,0x1, 0x1f,0x25,0xe0,0x1, 0xbf,0x3f,0xe0,0x2, 0x1f,0x52,0xe0,0x1, 0xbf,0x4f, +0xe0,0x0, 0x1f,0x34,0xe0,0x1, 0xbf,0x5f,0xe0,0x0, 0x1f,0x11,0xe0,0x1, 0xbf,0x6f, +0xe0,0x1, 0x1f,0x73,0xe0,0x1, 0xbf,0x7f,0xe0,0x1, 0x1f,0x67,0xe0,0x2, 0xbf,0xf, +0xe0,0x2, 0x1f,0x23,0xe0,0x2, 0xbf,0x1f,0xe0,0x1, 0x1f,0x52,0xe0,0x2, 0xbf,0x2f, +0xe0,0x2, 0x1f,0x7c,0xe0,0x2, 0xbf,0x3f,0xe0,0x0, 0x1f,0x26,0xe0,0x2, 0xbf,0x4f, +0xe0,0x2, 0x1f,0x2e,0xe0,0x2, 0xbf,0x5f,0xe0,0x0, 0x1f,0x27,0xe0,0x2, 0xbf,0x6f, +0x8, 0xe1,0x0, 0x0, 0xe0,0x1, 0x1f,0xed,0x16,0xfb,0xa7,0xf, 0xa7,0x8e,0x3f,0xdd, +0xbf,0x8e,0x24,0x11,0x17,0x86,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e,0xa7,0x8e,0xcf,0x84, +0xbf,0x8e,0x38,0x82,0x17,0x84,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0x0, 0xf0,0xe0,0x1, 0x1f,0xde,0xe7,0x7f,0x16,0x7f,0xa7,0xf, 0xe0,0x1, +0x1f,0xb1,0xa6,0xae,0xa7,0x8f,0x3e,0xdc,0xbe,0xae,0xe0,0xa0,0x17,0x0, 0x9e,0xbf, +0xe0,0x1e,0xce,0x80,0xb6,0xbf,0xb7,0x7f,0xa7,0x4f,0x3f,0x5c,0xbf,0x4f,0xa7,0x4f, +0xe0,0x20,0xcf,0x0, 0xbf,0x4f,0x38,0x82,0xe0,0x1, 0x1f,0xde,0xe7,0x7f,0x16,0x7f, +0xa6,0x8f,0xe0,0x1, 0x1f,0xed,0xa7,0x1d,0xa7,0x8f,0xcf,0x1, 0xbf,0x1d,0xe6,0xff, +0x16,0xff,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0xa6,0x8f,0xe0,0x1, 0x1f,0x31,0x3e,0xdc, +0xa7,0xe, 0xbe,0x8f,0x9e,0xbe,0xe0,0x1e,0xce,0x80,0xb6,0xbe,0xe0,0x61,0x3e,0x82, +0xe7,0xef,0x15,0xff,0x3e,0xdb,0xe0,0x61,0x3e,0x92,0xe0,0x46,0x16,0x80,0xbe,0x8f, +0x15,0xfe,0xa6,0x8f,0xce,0x84,0xbe,0x8f,0xa6,0x8f,0xce,0x82,0xbe,0x8f,0xa6,0x8f, +0x3e,0xdb,0xbe,0x8f,0xa7,0xce,0x3f,0xdc,0xbf,0xce,0x17,0x0, 0xe0,0x0, 0x1f,0x9f, +0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xed,0xa7,0xf, 0xac,0x7e,0xa7,0x8e,0x37,0xce, +0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e, +0x14,0x1, 0x38,0x82,0x24,0x9b,0xe0,0x1, 0x1f,0xed,0xc4,0xff,0xe3,0xff,0xc4,0xff, +0x16,0xff,0xa7,0xf, 0xe0,0xd, 0x3e,0x98,0xe0,0xc, 0x3c,0x19,0xe7,0x7f,0x15,0xff, +0xe0,0x80,0x87,0x9d,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa7,0x8e,0x3e,0xfc,0x3f,0xdb,0xbf,0x8e,0x1, 0xf4,0x14,0x1, 0x38,0x82,0xe0,0x1, +0x1f,0xed,0xa7,0xf, 0x17,0x80,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e,0x8c,0x7e,0x38,0x82, +0x24,0x9c,0xe0,0x1, 0x1f,0xed,0xc4,0xff,0xe3,0xff,0xc4,0xff,0x16,0xff,0xa7,0xf, +0x3e,0x98,0xe0,0xc, 0x3c,0x19,0x15,0x0, 0xe7,0x7f,0x15,0xff,0xad,0x7e,0xa7,0x8e, +0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0x3f,0xdb,0xbf,0x8e,0x8f,0xfe, +0xe0,0x80,0xaf,0x9d,0x3e,0xfc,0x1, 0xf3,0x38,0x82,0xe0,0x1, 0x1f,0xed,0x16,0xfb, +0xa7,0x8f,0xe4,0xc, 0x34,0x40,0xa7,0xf, 0xe2,0x1, 0xc6,0x7f,0x3f,0x5d,0xbf,0xf, +0xe0,0xd, 0x34,0x48,0x17,0xb, 0xaf,0x7f,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc4,0x7f, +0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x15,0xff, +0x3f,0x5b,0xbf,0xf, 0xae,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c, +0xa7,0xf, 0xe7,0x7f,0x16,0x7f,0x3f,0x5c,0xbf,0xf, 0xae,0xff,0xa7,0xf, 0x37,0x4e, +0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, +0xac,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f, +0x16,0xff,0x3f,0x5d,0xbf,0xf, 0x17,0x0, 0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, 0x38,0x82, +0x8, 0xb3,0x39,0xea,0x39,0x69,0xdf,0xb2,0x21,0xa1,0xe0,0x1, 0x1f,0xed,0xc1,0xff, +0xe3,0xff,0xc1,0xff,0x16,0xff,0xa7,0xf, 0x3e,0x92,0xe0,0xc, 0x39,0x13,0x15,0x0, +0xe7,0x7f,0x15,0xff,0xad,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa7,0x8e,0x3f,0xdb,0xbf,0x8e,0x8f,0xfe,0xe0,0x80,0xaf,0x9d,0x3e,0xfc,0x1, 0xf3, +0xa7,0x8e,0x14,0x1, 0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0xe0,0x1, 0x1f,0xed,0x14,0x1, +0xa7,0xf, 0xa7,0x8e,0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0xe0,0x0, 0x1f,0x9f,0x8f,0x8f, +0xe2,0x1, 0xcf,0xa5,0x1, 0x2, 0x38,0x82,0xe7,0xfd,0x0, 0xb6,0x3f,0x82,0xe0,0x0, +0x1f,0x9f,0x14,0x0, 0x8f,0x8f,0xe2,0x1, 0xcf,0xa5,0x1, 0x2, 0x38,0x82,0xe0,0x1, +0x1f,0xed,0x16,0xfb,0xa7,0xf, 0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0x17,0x85,0xaf,0xfe, +0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff, +0x3f,0xdd,0xbf,0x8e,0x17,0x80,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e,0x8c,0x7e,0xa7,0x8e, +0xe2,0x0, 0xc4,0x1, 0xcf,0x84,0xbf,0x8e,0x38,0x82,0xe0,0x0, 0x1f,0x9f,0x8f,0x8f, +0xe2,0x1, 0xcf,0xa5,0x1, 0x2, 0x38,0x82,0xe0,0x1, 0x1f,0xed,0x16,0xfb,0xa7,0xf, +0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0xac,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e,0xe4,0xf, 0x34,0xc0, +0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0xe7,0x7f, +0x16,0xff,0x3f,0xdd,0xbf,0x8e,0xe0,0xf, 0x34,0xc8,0xaf,0xfe,0xa7,0x8e,0x37,0xce, +0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e, +0xac,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0xe7,0x7f, +0x16,0xff,0x3f,0xdd,0xbf,0x8e,0x38,0x82,0x8, 0xb4,0x3a,0x68,0x14,0x1, 0x39,0xea, +0x39,0x69,0xde,0x41,0x3c,0xe4,0x14,0x2, 0xdf,0xb9,0x21,0xa0,0xe0,0x1, 0x1f,0xed, +0xc1,0xff,0xe3,0xff,0xc1,0xff,0x16,0xff,0xa7,0xf, 0x3e,0x92,0xe0,0xc, 0x39,0x13, +0xe7,0x7f,0x15,0xff,0xe0,0x80,0x87,0x9d,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, +0xc7,0x81,0x27,0xfc,0xa7,0x8e,0x3e,0xfc,0x3f,0xdb,0xbf,0x8e,0x1, 0xf4,0xa7,0x8e, +0xcf,0x84,0xbf,0x8e,0xdf,0x6d,0x2c,0x7f,0xa, 0x61,0xe0,0x1, 0x1f,0xed,0xa7,0xf, +0x0, 0xf7,0xe0,0x0, 0x1f,0x9f,0x8f,0x8f,0xe2,0x1, 0xcf,0xa5,0x1, 0x2, 0x38,0x82, +0xe7,0xff,0x0, 0xcc,0x3f,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x0, 0x17,0xff, +0x3f,0xd8,0xe0,0x1, 0x11,0x0, 0x39,0x2f,0xe3,0xff,0xc1,0x7f,0x39,0x7a,0x4, 0x8c, +0xe0,0x0, 0x1f,0x9f,0x8f,0x8f,0xe2,0x1, 0xcf,0xa5,0xe0,0x0, 0x1, 0x5f,0x14,0x1, +0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x0, 0x1b,0x1f,0x3b,0xe8,0x8f,0x86,0x3a,0xea, +0xe2,0x1, 0xcf,0xa5,0xf0,0x40,0x3c,0x69,0xe0,0x0, 0x1, 0x55,0x3a,0xa2,0xe3,0xff, +0xc2,0xff,0xe2,0x0, 0xca,0xff,0x3b,0x92,0xf0,0x18,0x3c,0x12,0xe0,0x0, 0x5, 0xcf, +0x39,0x65,0xe8,0x40,0x3a,0x68,0x39,0xe7,0xf0,0x1, 0x14,0x80,0x0, 0x8c,0xe1,0xff, +0xc1,0x0, 0xe3,0xff,0xc1,0x7f,0xe2,0x0, 0xc9,0x7f,0xe0,0x1, 0xc2,0x0, 0xe0,0x1, +0xc1,0x80,0x5, 0x95,0x8f,0x86,0xe2,0x1, 0xcf,0xa5,0x1, 0xf2,0x3c,0xe4,0x3c,0x63, +0xe8,0x40,0x3d,0x69,0xe1,0xff,0xc1,0x0, 0xdf,0x80,0xe3,0xff,0xc1,0x7f,0xe2,0x0, +0xc9,0x7f,0xe0,0x1, 0xc2,0x0, 0xe0,0x1, 0xc1,0x80,0x2, 0xed,0xe7,0xff,0x17,0x80, +0x3f,0x95,0xe3,0xff,0xc7,0xff,0x37,0xc7,0x17,0x1, 0x3f,0x1f,0xe0,0x1, 0x12,0x0, +0xe0,0x0, 0x15,0x7f,0x3a,0x17,0x37,0x27,0xe0,0x7, 0x37,0xa7,0x3d,0x55,0xf0,0x18, +0x3c,0x1e,0x3b,0x94,0xe7,0xff,0x25,0x2d,0x8f,0x86,0xe2,0x1, 0xcf,0xa5,0xe7,0xff, +0x1, 0xa8,0xe8,0x40,0x3c,0xe8,0x3c,0x67,0xdf,0x58,0x14,0x1, 0xf8,0x0, 0xc, 0xa8, +0xb, 0xe1,0x3d,0x62,0xdf,0x52,0xe7,0xff,0x0, 0xab,0x3d,0x65,0x0, 0xee,0xe0,0x0, +0x1f,0x9f,0x8f,0x8f,0xe2,0x1, 0xcf,0xa5,0x1, 0x3, 0x14,0x1, 0x38,0x82,0x8, 0xb2, +0x39,0x68,0x14,0x1, 0xdd,0x88,0xe0,0x9, 0x31,0x2c,0x14,0x20,0xde,0xff,0xe0,0x1, +0x1f,0xed,0xa7,0xf, 0xa7,0x8e,0xcf,0x84,0xe0,0x0, 0xbf,0x8e,0xde,0xc9,0x2c,0x7f, +0x14,0x1, 0x9, 0x61,0x8, 0xb2,0x14,0x1, 0xef,0xff,0xd5,0xc3,0xe0,0x1, 0x14,0xc8, +0x14,0x0, 0xe0,0x5, 0xd3,0x4e,0x24,0x14,0xe0,0x2, 0x1f,0xd, 0x17,0x82,0xe0,0x0, +0x19,0x37,0xaf,0x8e,0xe0,0x1, 0x1f,0x5f,0xaf,0x82,0x97,0x8e,0xe0,0x20,0xcf,0x80, +0xb7,0x8e,0x8c,0x2, 0xef,0xff,0xd3,0xe3,0x9, 0x21,0xe7,0xea,0x0, 0xd9,0xe0,0x2, +0x1f,0x8d,0x17,0x1, 0xe0,0x0, 0x19,0x37,0xaf,0xf, 0x3c,0xe8,0xaf,0x2, 0x8f,0x8f, +0xe0,0x2, 0x1c,0x69,0xe4,0x0, 0xc7,0x8e,0x3c,0x1f,0xef,0xfe,0xdf,0x67,0x0, 0xea, +0x8, 0xb2,0xe0,0x2, 0x19,0x5, 0xe0,0x1, 0x8c,0xa2,0xe0,0x4, 0x8f,0xd2,0x2f,0x95, +0xe0,0x0, 0x1f,0xb7,0x8f,0x8f,0xe0,0x0, 0x2f,0xcb,0xe0,0x1, 0x8c,0x82,0x14,0x5, +0xe2,0x0, 0xcc,0x94,0x2, 0x98,0xe0,0x0, 0x14,0x64,0x24,0x95,0xe0,0x0, 0x14,0x63, +0x3c,0x19,0xe0,0x6, 0xdd,0x91,0x0, 0x8f,0xe0,0x0, 0x1f,0xb7,0x8f,0x8f,0x2f,0xa3, +0xe0,0x1, 0x8f,0x92,0xe0,0x0, 0x14,0x7f,0xe0,0x43,0x3f,0xf, 0xe2,0x0, 0xcf,0x0, +0xe0,0x68,0x3b,0x2f,0xe0,0x5, 0x8f,0xc2,0x14,0x98,0x3c,0x3f,0xe0,0x6, 0xdd,0x7c, +0xe0,0x0, 0x1f,0xa5,0xe0,0x2, 0x1f,0x54,0xac,0xf, 0x87,0x8f,0xaf,0x8e,0xe0,0x1, +0x1f,0x5f,0x97,0x8e,0xe3,0xff,0xc7,0xf7,0xb7,0x8e,0x17,0x0, 0xe0,0x2, 0x1f,0x87, +0xb7,0xf, 0x9, 0x61,0xe0,0x2, 0x1f,0xfe,0x8f,0x8f,0xe2,0x0, 0xcf,0xba,0x5, 0x87, +0xe0,0x2, 0x1f,0xfd,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x17,0xe0,0x7, 0x14,0x68, +0xe0,0x6, 0xdd,0x5a,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0x0, 0xd5,0xe0,0x2, 0x1f,0xfd, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xf3,0xe0,0x3, 0x14,0x74,0xe0,0x6, 0xdd,0x4c, +0xc4,0x7e,0xe2,0x1, 0xc4,0x7f,0x0, 0xc7,0xe0,0x3, 0x14,0x74,0xe0,0x6, 0xdd,0x44, +0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0xe7,0xff,0x0, 0xbf,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f, +0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x2, 0x1f,0xfd,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0x2, 0x38,0x82,0xe7,0xfe,0x0, 0xd7,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f, +0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x1, 0x1f,0x5f,0x97,0x8e,0xe0,0x1, +0xcf,0x80,0xb7,0x8e,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, +0xc7,0x81,0x27,0x95,0xe0,0x1, 0x1f,0x5f,0x9f,0x8e,0x37,0xc7,0xe2,0x0, 0xc7,0x81, +0x27,0x8e,0x8, 0xb3,0xe0,0x2, 0x1e,0xfd,0x97,0x8e,0x89,0xd, 0xe3,0xfe,0xc7,0xff, +0xe2,0x0, 0xc9,0x1, 0xb7,0x8e,0x1, 0x5, 0x14,0x1, 0x9, 0xe1,0x14,0x1, 0x38,0x82, +0x3c,0x62,0xef,0xff,0xd4,0xee,0xe0,0x1, 0x14,0xc8,0x3c,0x62,0xe0,0x5, 0xd2,0x79, +0xe0,0x0, 0x19,0xb7,0x2c,0x5, 0x8c,0x3, 0xef,0xff,0xd3,0x19,0x0, 0xee,0xe0,0x2, +0x1f,0x8d,0xe0,0x2, 0x1c,0x69,0xa9,0xf, 0x3c,0xe2,0xa9,0x3, 0x8f,0x8f,0xe4,0x0, +0xc7,0x8e,0x3c,0x1f,0xef,0xfe,0xde,0x83,0x0, 0xef,0x38,0x82,0x8, 0xb6,0xe0,0x0, +0x1f,0xac,0xe0,0x2, 0x19,0x71,0xa1,0x8f,0xa7,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81, +0x27,0x99,0xe0,0x1, 0x1b,0x5f,0xe7,0xff,0x12,0x81,0xe0,0x1, 0x12,0x7f,0x0, 0x8c, +0x9f,0x86,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xd4,0xed,0xa7,0x83,0x37,0xc3, +0xe2,0x0, 0xc7,0x81,0x27,0x87,0xaa,0x82,0xef,0xff,0xd4,0xd6,0x3c,0xe4,0x24,0x71, +0xb, 0x61,0xe0,0x1, 0x1f,0xb1,0xe7,0xef,0x16,0xff,0xa7,0x8f,0xe0,0x4, 0x14,0x89, +0xe0,0x1, 0xa7,0x6f,0x14,0x2, 0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6f,0xe0,0x1, +0xa7,0x6f,0x3f,0x5d,0xe0,0x1, 0xbf,0x6f,0xe7,0xff,0x17,0x81,0xaf,0x82,0xb, 0x21, +0xe0,0x9, 0x0, 0xca,0x8, 0xb2,0xe0,0x1, 0x19,0x5f,0x9f,0x82,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x2f,0x87,0xdf,0xbc,0x9f,0x82,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0xfb, +0x9, 0x61,0x8, 0xb1,0x0, 0x82,0xdf,0xb3,0xef,0xff,0xd4,0xa6,0x24,0x7d,0x8, 0xe1, +0x8, 0xb1,0x14,0x1, 0xef,0xff,0xd4,0x7d,0xe0,0x0, 0x1f,0xac,0xa7,0xf, 0xa7,0x8e, +0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0xfc,0x8, 0xe1,0xe0,0x1, 0x1f,0xde,0xe2,0x0, +0xc4,0x1, 0xa7,0x8f,0xe7,0xdf,0x16,0x7f,0xa7,0x1f,0xe0,0xd, 0x34,0x2c,0x3f,0x5c, +0x3f,0x4d,0xbf,0x1f,0xe7,0xfb,0x16,0x7f,0xa7,0x1f,0xe0,0xd, 0x34,0x29,0x3f,0x5c, +0x3f,0x4d,0xbf,0x1f,0xe7,0xfd,0x16,0x7f,0xa7,0x1f,0xe0,0xd, 0x34,0x28,0x3f,0x5c, +0x3f,0x4d,0xbf,0x1f,0xe7,0xfe,0x16,0xff,0xa7,0x2f,0x34,0x27,0x3f,0x5d,0x3c,0x4e, +0xbc,0x2f,0x38,0x82,0x8, 0xb2,0xe0,0x1, 0x19,0x5f,0x9f,0x82,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x2f,0x8d,0x9f,0x82,0xe0,0xf, 0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x87, +0xdf,0x6e,0x9f,0x82,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0xfb,0xef,0xff,0xd4,0x5c, +0x24,0x3, 0x0, 0x85,0xdf,0x64,0xef,0xff,0xd4,0x57,0x24,0x7d,0x9, 0x61,0xe0,0x0, +0x1f,0xac,0xa7,0x8f,0xa7,0x8f,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x94,0xe0,0x2, +0x1e,0xf1,0xe0,0x1, 0x1f,0x59,0xe7,0xff,0x16,0x1, 0xae,0xd, 0x8e,0x8e,0xe2,0x0, +0xce,0x81,0x1, 0xa, 0xe0,0x2, 0x1f,0x8c,0x9f,0x8f,0x2f,0x8c,0x14,0x83,0x14,0x1, +0xe0,0x8, 0x0, 0xca,0x38,0x82,0xe0,0x2, 0x1e,0x8c,0xe0,0x1f,0x16,0x20,0xb6,0xd, +0xaf,0x8e,0xe0,0x4, 0x14,0x81,0x14,0x2, 0xe0,0x8, 0x0, 0xbe,0x8, 0xb5,0xef,0xff, +0xd4,0x2b,0xe0,0x0, 0x24,0x4b,0x14,0x0, 0xd5,0xf1,0xe0,0x1, 0x1f,0xde,0xe7,0xdf, +0x17,0x7f,0xa1,0xf, 0xe0,0x1, 0x1a,0xe2,0xa7,0x92,0xe0,0x1, 0x19,0xdf,0x3f,0xde, +0xbf,0x92,0xe7,0xfb,0x17,0x7f,0xa7,0x92,0xe0,0x2, 0x1a,0x5, 0x3f,0xde,0xbf,0x92, +0xe7,0xfd,0x17,0x7f,0xa7,0x92,0x3f,0xde,0xbf,0x92,0xe7,0xfe,0x17,0x7f,0xa7,0xa2, +0x3f,0xde,0xbf,0xa2,0x9f,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xe0,0xa, +0x8f,0x84,0x27,0xa8,0x8f,0x85,0x2f,0xa6,0xdf,0xab,0x9f,0x83,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x27,0xf6,0x8f,0x85,0x27,0x84,0x8f,0x85,0xc7,0xff,0xaf,0x85,0x14,0x1, +0xa7,0x92,0xe0,0x20,0xcf,0x80,0xbf,0x92,0xa7,0x92,0xe0,0x4, 0xcf,0x80,0xbf,0x92, +0xa7,0x92,0xe0,0x2, 0xcf,0x80,0xbf,0x92,0xa7,0xa2,0xe0,0x1, 0xcf,0x80,0xbf,0xa2, +0xa, 0xa1,0xe0,0xb, 0x0, 0xac,0xde,0xeb,0xef,0xff,0xd3,0xde,0x24,0x7d,0xe7,0xff, +0x0, 0xb4,0xde,0xe5,0x0, 0xd0,0x8, 0xb3,0x14,0x1, 0xef,0xff,0xd3,0xb2,0xe0,0x0, +0x1f,0xac,0xa7,0x8f,0xa1,0xf, 0x31,0x43,0xe2,0x0, 0xc1,0x1, 0x29,0x7c,0x3c,0x62, +0xd5,0x95,0xe0,0x1, 0x1f,0xde,0xe7,0xdf,0x17,0x7f,0xa1,0x8f,0x14,0x1, 0xa7,0x93, +0x3c,0xe2,0x3f,0xde,0xbf,0x93,0xe7,0xfb,0x17,0x7f,0xa7,0x93,0x3f,0xde,0xbf,0x93, +0xe7,0xfd,0x17,0x7f,0xa7,0x93,0x3f,0xde,0xbf,0x93,0xe7,0xfe,0x17,0x7f,0xa7,0xa3, +0x3f,0xde,0xbf,0xa3,0xe7,0xff,0x17,0x1, 0xe0,0x2, 0x1f,0xf1,0xaf,0xf, 0xd3,0xbb, +0xa7,0x93,0x14,0x1, 0xe0,0x20,0xcf,0x80,0xbf,0x93,0xa7,0x93,0xe0,0x4, 0xcf,0x80, +0xbf,0x93,0xa7,0x93,0xe0,0x2, 0xcf,0x80,0xbf,0x93,0xa7,0xa3,0xe0,0x1, 0xcf,0x80, +0xbf,0xa3,0x9, 0xa1,0xe0,0xa, 0x0, 0xe3,0x8, 0xb1,0xe0,0x1, 0x1f,0xa3,0xe0,0x1a, +0x17,0x20,0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0x37,0x28,0x3c,0x4e, +0xe0,0x4, 0xd7,0x69,0xe0,0x4, 0xd7,0xd, 0xe0,0x1, 0xd1,0x90,0xe0,0x2, 0x1f,0x5, +0x17,0x81,0xe0,0x4, 0xaf,0xfe,0xe0,0x1b,0x14,0x2c,0xe0,0x2, 0x1f,0x7f,0xaf,0x8e, +0xe0,0x4, 0xd7,0x59,0xe0,0x2, 0x1f,0xbf,0xe0,0x19,0x16,0x9d,0x17,0x7, 0x3e,0x9f, +0xaf,0xd, 0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0x8, 0xe1,0xe0,0x2, 0x1f,0x85,0x17,0x1, +0xe0,0x4, 0xaf,0x5f,0x17,0x0, 0xe0,0x2, 0x1e,0xd4,0xe0,0x0, 0x1f,0xa5,0x8f,0x8f, +0x8e,0xd, 0x3f,0x9c,0xaf,0x8d,0x17,0x80,0xe0,0x2, 0x1e,0xac,0xe0,0x1, 0x1e,0x56, +0xb7,0xd, 0xe0,0x2, 0x1e,0x8d,0xaf,0x8c,0xe0,0x2, 0x1e,0x41,0x8e,0x8d,0xaf,0xc, +0xe2,0x0, 0xce,0x82,0xe0,0x2, 0x1f,0x7e,0xaf,0x8e,0x1, 0x2, 0x38,0x82,0xe0,0x2, +0x1f,0x3b,0x8f,0x8e,0xcf,0x84,0xaf,0x8e,0x38,0x82,0xe0,0x2, 0x1f,0x85,0x17,0x0, +0xe0,0x0, 0x1e,0xa5,0xe0,0x4, 0xaf,0x5f,0xe0,0x2, 0x1f,0x54,0x8f,0x8d,0x8e,0xe, +0x37,0xc1,0x3f,0xfc,0x3, 0x98,0x8e,0x8d,0x8f,0x8e,0x36,0xc1,0x3f,0xad,0xaf,0x8e, +0x17,0x0, 0xe0,0x2, 0x1f,0xac,0xb7,0xf, 0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf, +0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x1, 0x1f,0x5f,0x97,0x8e,0xe0,0x1, 0xcf,0x80, +0xb7,0x8e,0x38,0x82,0xe0,0x1, 0x1f,0x5f,0x97,0x8e,0xcf,0x88,0xb7,0x8e,0x0, 0xe9, +0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0x8f,0x8f,0x27,0x86,0xe0,0x1, 0x1f,0xd6,0x8f,0x8f, +0x27,0x89,0x38,0x82,0x8, 0xb1,0xdf,0xca,0xe0,0x2, 0x1f,0xab,0x17,0x1, 0xaf,0xf, +0x8, 0xe1,0x0, 0xc4,0x8, 0xb1,0xe0,0x1, 0x1f,0xa3,0xe0,0x1a,0x17,0x22,0x3f,0x1f, +0x8f,0xe, 0xe0,0x1a,0xc7,0xa3,0x8c,0xf, 0x37,0x28,0x3c,0x4e,0xe0,0x4, 0xd6,0xdb, +0xdf,0x23,0xdf,0x63,0xdf,0xb3,0xdd,0xc8,0x8, 0xa1,0xe7,0xe5,0x0, 0x81,0x8, 0xb4, +0xe0,0x2, 0x1f,0x81,0x11,0x3c,0x8f,0x8f,0x27,0x88,0xe0,0x2, 0x1f,0xfd,0x89,0xf, +0x17,0x80,0xe0,0x22,0x39,0xf, 0xc1,0x3b,0xe0,0x2, 0x19,0x85,0xe0,0x2, 0x1a,0x41, +0xe0,0x4, 0x8f,0xd3,0xe2,0x0, 0xcf,0x81,0x1, 0x1b,0x8f,0x4, 0xe0,0x4, 0x8f,0xd3, +0xe2,0x0, 0xcf,0x81,0x1, 0x2, 0xa, 0x61,0xe0,0x0, 0x1f,0xb7,0x8f,0x8f,0x27,0xfc, +0x39,0x7e,0x1, 0x23,0x17,0x81,0x3f,0x9e,0xe2,0x1, 0xc7,0xff,0xe0,0x2, 0x1e,0xfe, +0xe2,0x0, 0xcf,0xbc,0xaf,0xd, 0x5, 0x82,0x17,0x80,0xaf,0x84,0xa, 0x61,0xe0,0x0, +0x1f,0xb7,0x8f,0x8f,0x27,0xe3,0x8f,0x4, 0x2f,0x62,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f, +0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0xdb,0xe0,0x2, 0x1f,0xfd,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0xd5,0xdc,0xc8,0x0, 0xd2,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf, +0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x1, 0x1f,0x5f,0x97,0x8e,0xe0,0x1, 0xcf,0x80, +0xb7,0x8e,0xdd,0x72,0xef,0xff,0xd2,0x2c,0x8f,0x4, 0x0, 0xcd,0x8, 0xb2,0xe0,0x2, +0x1f,0xa2,0xe0,0x2, 0x19,0x5, 0x8f,0xf, 0x27,0xc, 0x16,0x80,0xe0,0x4, 0x8f,0x52, +0xae,0x8f,0x27,0x36,0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x49, +0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0x1, 0x24,0x4, 0x8b,0xe2,0x0, 0xcf,0x83, +0x1, 0x84,0x9, 0x21,0xe7,0xfe,0x0, 0xf8,0x17,0x1, 0xe0,0x4, 0xaf,0x52,0x9, 0x61, +0xe0,0x2, 0x1f,0xa0,0x8f,0x8f,0x2f,0x9e,0x8f,0xe2,0xe2,0x0, 0xc7,0x81,0x27,0xf8, +0xe0,0x2, 0x1f,0xac,0x9f,0xf, 0xe2,0x6, 0xcf,0x33,0x2, 0xa7,0xe0,0xa, 0x8f,0x2, +0xe2,0x0, 0xcf,0x1, 0x1, 0xed,0x9f,0x8f,0xe2,0x7, 0xcf,0xe7,0x2, 0x9e,0x0, 0xe8, +0xe0,0x2, 0x1f,0xa0,0x8f,0x8f,0x27,0xe4,0x9, 0x21,0xe7,0xfe,0x0, 0xc3,0xdf,0x16, +0x0, 0xd0,0xe0,0x2, 0x1f,0xac,0x17,0x0, 0xb7,0xf, 0x8f,0xe2,0xe2,0x0, 0xc7,0x81, +0x27,0xd7,0xe0,0xa, 0x8f,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0xd2,0xe0,0x1, 0x1f,0xd6, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xcc,0x9, 0x21,0xe7,0xfd,0x0, 0xd8,0xde,0xd6, +0xe7,0xff,0x0, 0xb8,0x8, 0xb1,0xe0,0x2, 0x1f,0xa8,0x8f,0x8f,0x2f,0x8d,0xe0,0x0, +0x1f,0xb7,0x8f,0x8f,0x27,0x85,0xdd,0xc7,0x8, 0xa1,0xe7,0xfe,0x0, 0xc2,0xde,0x7, +0x8, 0xa1,0xe7,0xfe,0x0, 0xbe,0xdf,0x93,0x0, 0xf3,0x0, 0x0, 0xe0,0x2, 0x1f,0x6a, +0xe0,0x1, 0x1e,0xdf,0x0, 0x86,0x9f,0x8d,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x83, +0x9f,0x8e,0x2f,0xfa,0x17,0x87,0xb7,0x8e,0x38,0x82,0xe0,0x0, 0x1f,0xb7,0x8f,0x8f, +0x2f,0x9f,0x8, 0xb2,0xe0,0x2, 0x19,0x0, 0x9f,0x82,0x2f,0xff,0xdc,0x5a,0xe0,0x2, +0x1f,0x85,0xe0,0x4, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0x13,0xe0,0x1, 0x8c,0x8f, +0xe0,0x0, 0x14,0x64,0xe0,0x6, 0xd9,0xf8,0xc4,0x7f,0xb4,0x2, 0xe0,0x1, 0x1f,0xf9, +0x9e,0x82,0x9f,0xf, 0x3e,0xfe,0x5, 0x83,0x97,0x8f,0xb7,0x82,0x9, 0x61,0x38,0x82, +0xe0,0x1, 0x8f,0x9f,0xc7,0xff,0xb7,0x82,0x0, 0xf2,0xe0,0x1, 0x1f,0xde,0xe7,0x7f, +0x16,0xff,0xa7,0x8f,0xe2,0x0, 0xcc,0x7, 0xa7,0x1f,0xe1,0x0, 0xcf,0x0, 0xbf,0x1f, +0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0xe7,0xdf,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0xe7,0xbf,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x2, 0x88,0xa7,0x2f,0x16,0xf8, +0xe2,0x0, 0xc4,0x7, 0x3f,0x5d,0x3c,0x4e,0xbc,0x2f,0x38,0x82,0xe0,0x2, 0x1f,0xa6, +0x16,0xdf,0xa7,0xf, 0x15,0xfe,0xa7,0xbe,0x3f,0xdd,0xbf,0xbe,0xe7,0xfe,0x16,0xff, +0xa6,0x3e,0xe0,0x0, 0x1f,0xac,0x3e,0x5d,0xa7,0x8f,0xbe,0x3e,0x17,0x0, 0xaf,0x7f, +0x16,0xfd,0xa6,0xf, 0xe0,0x1, 0x1f,0x31,0x3e,0x5b,0xbe,0xf, 0xa6,0xf, 0xa7,0xe, +0x3e,0x5d,0xbe,0xf, 0xa6,0xbf,0x3e,0xdb,0xbe,0xbf,0x16,0xfc,0xa7,0x8e,0x3f,0xdd, +0xbf,0x8e,0x17,0x80,0xe0,0x3, 0xb7,0x9e,0x17,0x80,0xe0,0x61,0x3f,0x92,0xe1,0xff, +0x17,0xff,0xe0,0x61,0x3f,0x91,0x38,0x82,0xe0,0x2, 0x1f,0xa6,0xe0,0x0, 0x1f,0x2c, +0xa6,0x8f,0x16,0x7e,0xa7,0xbd,0xa7,0xe, 0x3f,0xdc,0xbf,0xbd,0xe7,0xff,0x16,0xbf, +0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0xe0,0x61,0x3f,0x82,0xcf,0x81,0xe0,0x61,0x3f,0x92, +0x38,0x82,0xe0,0x1, 0x1f,0xde,0xe0,0x1, 0x1f,0x31,0xa6,0x8f,0x16,0x6f,0xa7,0x9d, +0xa7,0xe, 0x3f,0xdc,0xbf,0x9d,0xe0,0x1, 0xa7,0xee,0xe0,0x20,0xcf,0x80,0xe0,0x1, +0xbf,0xee,0x38,0x82,0xe0,0x1, 0x1f,0xde,0xa7,0x8f,0xa7,0x3f,0xcf,0x1, 0xbf,0x3f, +0xa7,0xf, 0x2c,0x5, 0x16,0xfd,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xcf,0x2, 0xbf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0xde,0xa6,0x8f,0xe0,0x2, 0x1f,0xa6,0xa7,0x1d,0xa7,0x8f, +0xcf,0x8, 0xbf,0x1d,0xe7,0xff,0x16,0xbf,0xa7,0x3f,0x3f,0x5d,0xbf,0x3f,0xa7,0x2f, +0xe2,0x1, 0xc7,0x4f,0xcf,0x20,0xbf,0x2f,0xe0,0x2, 0x17,0x0, 0xb7,0x3f,0xa7,0x3f, +0xcf,0x40,0xbf,0x3f,0xe0,0x61,0x3f,0x82,0xe0,0x40,0xcf,0x80,0xe0,0x61,0x3f,0x92, +0x38,0x82,0x8, 0xb2,0xe0,0x1, 0x1f,0x31,0x17,0xff,0xa1,0xe, 0xb7,0xd2,0xe0,0x1, +0xb7,0xd2,0xe0,0x5, 0xd4,0x71,0xe0,0x2, 0x1f,0xa8,0xe0,0x41,0x3f,0x8, 0xac,0xf, +0xe7,0xfb,0x16,0xff,0xa7,0x82,0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdd,0x3f,0xce, +0xbf,0x82,0xe0,0x1, 0x17,0xc3,0xb7,0xb2,0xd8,0xe6,0xa7,0xb2,0x16,0xef,0xcf,0x84, +0xbf,0xb2,0x17,0xfb,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0x17,0xf7,0xa7,0x32,0xcf,0x8, +0xbf,0x32,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0xa7,0x32,0xcf,0x10,0xbf,0x32,0xa7,0x12, +0x3f,0x5d,0xbf,0x12,0xa7,0xc2,0x3f,0xdd,0xbf,0xc2,0x9, 0x61,0xe0,0x1, 0x1f,0xdd, +0xe7,0xff,0x16,0xbf,0xa7,0x8f,0xa7,0x1f,0xcf,0x1, 0xbf,0x1f,0xa7,0xf, 0x3f,0x5d, +0xbf,0xf, 0xe7,0xfe,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x17,0x2f,0xbf,0x2f, +0xa7,0x1f,0xcf,0x2, 0xbf,0x1f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0xa7,0xf, 0xcf,0x40, +0xbf,0xf, 0xe0,0x61,0x3f,0x82,0xe7,0xf7,0x17,0x7f,0x3f,0xde,0xe0,0x61,0x3f,0x92, +0x38,0x82,0xe0,0x1, 0x1f,0xdd,0xa7,0x8f,0xa7,0x2f,0x27,0x7, 0xa7,0x3f,0xcf,0x10, +0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xdd,0xe7,0xff, +0x16,0xbf,0xa7,0x8f,0xa7,0x1f,0xcf,0x1, 0xbf,0x1f,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0xde,0xe0,0x0, 0x1e,0x2e,0xa7,0xf, 0xe7,0xfe,0x15,0x7f, +0xa7,0xbe,0xe0,0x0, 0x1d,0xaf,0xcf,0x81,0xbf,0xbe,0xa6,0x8e,0xe0,0x2, 0x1f,0xc0, +0xce,0x82,0xbe,0x8e,0x16,0xa0,0xb6,0x8c,0xa6,0x9e,0xa7,0x8f,0x3e,0xda,0xbe,0x9e, +0xa6,0x9e,0xa5,0x8b,0xe0,0x8, 0xce,0x80,0xbe,0x9e,0x16,0xf7,0xa7,0xf, 0xcf,0x1, +0xbf,0xf, 0xa7,0xf, 0xcf,0x8, 0xbf,0xf, 0xa7,0xb, 0x3f,0x5d,0xbf,0xb, 0x17,0x0, +0xe0,0x1, 0xaf,0x3f,0x96,0xc, 0xb6,0x3f,0xe0,0x61,0x3f,0x2, 0xe0,0x2, 0xcf,0x0, +0xe0,0x61,0x3f,0x12,0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, +0xbf,0xf, 0x38,0x82,0xe0,0x3, 0x1f,0x3, 0xe2,0xff,0x17,0xf0,0xbf,0xf, 0xe2,0xff, +0x17,0xf4,0xe0,0x3, 0x1f,0x4, 0xbf,0xf, 0xe2,0xff,0x17,0xf8,0xe0,0x3, 0x1f,0x5, +0xbf,0xf, 0xe2,0xff,0x17,0xfc,0xe0,0x3, 0x1f,0x6, 0xbf,0xf, 0x38,0x82,0xe0,0x1, +0x1f,0xb1,0x16,0x80,0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf,0xe0,0x2, 0x16,0x84, +0xbf,0xd, 0xe0,0x2, 0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x38,0x82, +0xe0,0x1, 0x1f,0xb1,0xe0,0x0, 0x16,0xeb,0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf, +0xe0,0x2, 0x16,0x84,0xbf,0xd, 0xe0,0x2, 0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, +0xaf,0x3f,0x38,0x82,0xc4,0x7f,0xe1,0xff,0x17,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7e, +0x1, 0xc, 0x17,0x88,0x0, 0x0, 0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc4,0x7f, +0xe3,0xff,0xc4,0x7f,0x3c,0x7e,0x1, 0xf6,0x38,0x82,0xc4,0x7f,0xe1,0xff,0x16,0x7f, +0xe3,0xff,0xc4,0x7f,0x3c,0x7c,0x1, 0x17,0x16,0x84,0xe0,0x1, 0x17,0x7a,0x17,0x88, +0x0, 0x0, 0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc7,0x7f,0xe3,0xff,0xc7,0x7f, +0x2f,0x77,0xc6,0xff,0xe2,0x1, 0xc6,0xff,0x2e,0xf1,0xc4,0x7f,0xe3,0xff,0xc4,0x7f, +0x3c,0x7c,0x1, 0xeb,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0xf, 0xa7,0xce,0xe2,0x0, +0xc7,0x81,0x27,0x98,0xe0,0x1, 0x1f,0xde,0xe7,0xff,0x16,0x3f,0xa7,0x8f,0xa6,0xdf, +0xe0,0x1, 0xce,0x80,0xbe,0xdf,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a, +0xe2,0x0, 0xc7,0x1, 0x2f,0x1e,0xa7,0x5f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xbf,0x5f, +0x38,0x82,0xa7,0xce,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0x98,0xe0,0x1, 0x1f,0xde, +0xe7,0xff,0x16,0x3f,0xa7,0x8f,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xe7,0xfe,0x16,0x7f, +0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0x27,0x64, +0xa7,0x5f,0xe1,0x0, 0xcf,0x0, 0xbf,0x5f,0x38,0x82,0xe0,0x1, 0x1f,0xde,0xa7,0x8f, +0xa6,0xdf,0xce,0xc0,0x0, 0xeb,0x8, 0xb2,0x39,0x68,0xdf,0xbe,0xe0,0x1, 0x1f,0xde, +0xe0,0x2, 0x1f,0x56,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0x21,0x4, 0xa4,0x6f,0x39,0x48, +0xb9,0x6f,0x9, 0x61,0x8, 0xb4,0xe0,0x2, 0x19,0x71,0x8f,0x82,0xe2,0x1, 0xcf,0x81, +0x1, 0x4, 0x17,0x80,0xaf,0x82,0xa, 0x61,0x24,0x2b,0xe2,0x0, 0xcc,0x1, 0x39,0xe9, +0x1, 0x30,0xe2,0x0, 0xcc,0x2, 0x1, 0xf6,0x3f,0x83,0xdf,0x9e,0xe0,0x1, 0x1f,0xde, +0xe0,0x2, 0x1f,0x56,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0x21,0x84,0xa4,0xef,0x3c,0xc3, +0xbc,0xef,0xe0,0x0, 0x1f,0x2c,0xa7,0xe, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, +0x2f,0xe, 0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,0x80,0xaf,0x82,0xa, 0x61, +0x3f,0x83,0x17,0x82,0x3f,0xd9,0x2f,0xae,0xdf,0x6f,0xe0,0x1, 0x1f,0xde,0xe0,0x2, +0x1f,0x56,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xe0,0x0, 0x1f,0x2c,0xa2,0xe, 0x29,0xb0, +0xa7,0x3f,0xe7,0xfe,0x16,0xff,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7,0x84,0x37,0xc5,0xe2,0x0, +0xc7,0x81,0xe7,0xff,0x27,0xa0,0xa7,0x84,0x17,0x5f,0x3f,0xde,0xbf,0x84,0xe7,0xff, +0x0, 0x9a,0xe0,0x0, 0x1f,0xac,0xa2,0xf, 0xa7,0x84,0xcf,0xa0,0xbf,0x84,0xdf,0x3c, +0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1f,0x56,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xa4,0xef, +0x3c,0xc3,0xbc,0xef,0x0, 0xce,0x8, 0xb1,0xe0,0x1, 0x1f,0xb1,0x17,0x0, 0xa6,0x8f, +0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0xbf,0xd, 0x16,0x6f,0xa7,0x8f,0xbf,0x6f,0xa6,0xdf, +0xe0,0x80,0xce,0x80,0xbe,0xdf,0xa6,0xdf,0xe0,0x40,0xce,0x80,0xbe,0xdf,0xa6,0xdf, +0xe0,0x20,0xce,0x80,0xbe,0xdf,0xa6,0xef,0xce,0xc0,0xbe,0xef,0xa6,0xef,0xce,0xa0, +0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0x7f,0x16,0x7f,0xa6,0xef,0xe1,0x0, +0xce,0x80,0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0xbf,0x16,0x7f,0xa6,0xef, +0x3e,0xdc,0xbe,0xef,0xe7,0xdf,0x16,0x7f,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xa6,0xef, +0xe0,0x10,0xce,0x80,0xbe,0xef,0xe0,0x2, 0x1f,0xd6,0xb7,0xf, 0xde,0xf5,0xe0,0x61, +0x3f,0x82,0x17,0x7d,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82,0x17,0x7b, +0x3f,0xde,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0xe0,0x1, 0x1f,0xb1,0xe2,0x0, 0xcc,0x2, +0xa7,0x8f,0xe0,0x0, 0x1, 0x57,0xe2,0x0, 0xcc,0x3, 0x1, 0x36,0xe2,0x0, 0xcc,0x1, +0x1, 0x19,0xa6,0x8f,0xe0,0x1, 0x1f,0x5e,0x16,0x7b,0xa7,0xe, 0x3e,0xdc,0xbe,0x8f, +0xe6,0xff,0x16,0x7f,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0x16,0x78,0xa6,0xce,0x3e,0xdc, +0xbe,0xce,0x16,0xf7,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0x16,0x80,0xe0,0x1, 0xbe,0xbf, +0x38,0x82,0xa7,0xf, 0x16,0x77,0x3f,0x5c,0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f, +0x16,0x78,0xa7,0xf, 0xe0,0x1, 0x1e,0xde,0xcf,0x4, 0xa6,0x8d,0xbf,0xf, 0xa7,0x4d, +0xe1,0x0, 0xcf,0x0, 0xbf,0x4d,0xa7,0x4d,0x3f,0x5c,0xcf,0x1, 0xbf,0x4d,0xa7,0x1f, +0xcf,0x8, 0xbf,0x1f,0x38,0x82,0xa7,0xf, 0xe0,0x1, 0x1e,0xde,0x16,0x7b,0x3f,0x5c, +0xa6,0x8d,0xbf,0xf, 0xe6,0xff,0x16,0x7f,0xa7,0x4d,0x3f,0x5c,0xbf,0x4d,0xa7,0xf, +0xcf,0x8, 0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, +0xbf,0x1f,0xa7,0x1f,0xcf,0x10,0xbf,0x1f,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f,0x38,0x82, +0xa6,0x8f,0x16,0x77,0x3e,0xdc,0xbe,0x8f,0x16,0x80,0xe0,0x1, 0xbe,0xbf,0x16,0x78, +0xa6,0x8f,0xe0,0x1, 0x1f,0x5e,0xce,0x84,0xa7,0xe, 0xbe,0x8f,0xa6,0xce,0xe1,0x0, +0xce,0x80,0xbe,0xce,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f, +0x38,0x82,0x8, 0xb3,0xe0,0x1, 0x1f,0xde,0xa1,0x8f,0xe0,0x1, 0x1f,0xb1,0xa1,0xf, +0xa7,0xb3,0xcf,0x81,0xbf,0xb3,0xa7,0x83,0xcf,0x88,0xbf,0x83,0xe0,0x1, 0xa7,0x92, +0xcf,0x82,0xe0,0x1, 0xbf,0x92,0xe0,0x1, 0xa7,0x92,0xcf,0x81,0xe0,0x1, 0xbf,0x92, +0xe0,0x2, 0x1f,0xcc,0x8c,0xf, 0xdf,0x71,0xa7,0xd3,0x17,0x7d,0xcf,0x81,0xbf,0xd3, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x7b,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x77, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x6f,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x78, +0xa7,0xd3,0xcf,0xa0,0xbf,0xd3,0xe0,0x1, 0xa7,0xa2,0xe1,0x0, 0xcf,0x80,0xe0,0x1, +0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x60,0xcf,0x80,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, +0xa7,0xa2,0xcf,0x88,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0x3f,0xde,0xcf,0x85, +0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x2, 0xcf,0x80,0xe0,0x1, 0xbf,0xa2, +0xe0,0x1, 0xa7,0xa2,0xe0,0x4, 0xcf,0x80,0xe0,0x1, 0xbf,0xa2,0x9, 0xe1,0xe0,0x1, +0x1f,0xde,0xe7,0xfd,0x16,0xff,0xa7,0x8f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, 0xbf,0x1f, +0xa7,0x1f,0xe0,0x2, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0xe7,0xff, +0x16,0xbf,0xa7,0x1f,0xe0,0x4, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0xe0,0x1, 0xcf,0x0, +0xbf,0x2f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x16,0xef,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0x16,0xf7,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x38,0x82,0xe0,0x1, 0x1f,0xb1,0xe2,0x0, +0xc4,0x1, 0xa7,0x8f,0x16,0x77,0xe0,0x1, 0xa7,0x2f,0xe0,0xd, 0x34,0x23,0x3f,0x5c, +0x3f,0x4d,0xe0,0x1, 0xbf,0x2f,0xe6,0xff,0x16,0x7f,0xe0,0x1, 0xa7,0x2f,0xe0,0xd, +0x34,0x2f,0x3f,0x5c,0x3f,0x4d,0xe0,0x1, 0xbf,0x2f,0xe7,0xfd,0x16,0x7f,0xe0,0x1, +0xa7,0x2f,0xe0,0xd, 0x34,0x28,0x3f,0x5c,0x3f,0x4d,0xe0,0x1, 0xbf,0x2f,0xe7,0xfb, +0x16,0xff,0xe0,0x1, 0xa7,0x2f,0x34,0x29,0x3f,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x2f, +0x38,0x82,0x8, 0xb1,0xe0,0x4, 0xdb,0xae,0x24,0x6, 0xe0,0x1, 0x1f,0x61,0x97,0xce, +0xcf,0x82,0xb7,0xce,0xe0,0x1, 0x1f,0xfa,0x8f,0x8f,0x27,0x82,0x8, 0xe1,0x8, 0xa1, +0xe7,0xdc,0x0, 0xd9,0xe0,0x1, 0x1e,0xdf,0xe0,0x1, 0x1f,0x61,0x97,0x8d,0xcf,0x81, +0xb7,0x8d,0x97,0xce,0xcf,0x84,0xb7,0xce,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf, +0xe2,0x0, 0xc7,0x81,0x2f,0x82,0x38,0x82,0x0, 0xdd,0xe0,0x1, 0x1f,0x5f,0xe0,0x1, +0x1e,0xe1,0x97,0x8e,0xcf,0x81,0xb7,0x8e,0x97,0x4d,0xe0,0x2, 0x1f,0xf3,0xcf,0x4, +0xa7,0x8f,0xb7,0x4d,0xa7,0x5f,0xcf,0x8, 0xbf,0x5f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81, +0x27,0x82,0x38,0x82,0x0, 0xc7,0xe0,0x61,0x3f,0x82,0xe0,0x61,0x3f,0x2, 0xe7,0xfe, +0x16,0xff,0x3f,0x5d,0xe0,0x61,0x3f,0x12,0xe0,0x2, 0x1f,0x73,0x16,0x7e,0xa7,0xe, +0xe2,0x0, 0xc4,0x1, 0xa6,0xbe,0x15,0xfd,0x3e,0xdc,0x3e,0xc8,0xbe,0xbe,0xe0,0xc, +0x34,0x21,0xa6,0xbe,0x34,0x2a,0x3e,0xdb,0x3e,0xcc,0xbe,0xbe,0xe7,0xf7,0x16,0x7f, +0xa6,0xbe,0x37,0xc7,0x3e,0xdc,0x3c,0x4d,0xbc,0x3e,0xe2,0x0, 0xc7,0x81,0x27,0x87, +0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0x8, 0xb1, +0xe0,0x1, 0x1f,0xb1,0xe7,0x7f,0x16,0xff,0xa7,0xf, 0xe7,0xfb,0x16,0x7f,0xa7,0x8e, +0xe7,0xe0,0x14,0x80,0x3f,0xdd,0xbf,0x8e,0xf0,0x1a,0x13,0x98,0xe0,0x1, 0xa6,0xee, +0xe0,0x2, 0x1f,0xf3,0xe0,0x4, 0xce,0x80,0xe0,0x1, 0xbe,0xee,0xe0,0x1a,0x15,0x19, +0xe0,0x1, 0xa6,0xee,0xa7,0x8f,0x3e,0xdc,0xe0,0x1, 0xbe,0xee,0x16,0x81,0xbe,0xdf, +0xe7,0xf8,0x16,0x0, 0xa6,0xef,0x17,0x0, 0xe3,0xfe,0xc6,0x9f,0xbe,0xef,0xe7,0x80, +0x14,0x0, 0xa6,0xef,0xe0,0x1, 0x1d,0xa3,0xbe,0xef,0xf0,0x17,0x3b,0x9b,0xe0,0x1, +0xa6,0xdf,0x3d,0x1b,0xe3,0xff,0xc6,0x80,0xe0,0x1, 0xbe,0xdf,0xe0,0x1, 0xa6,0xdf, +0xe0,0x1, 0xbe,0xdf,0xe0,0x3, 0x16,0xe0,0xe0,0x1, 0xbe,0xef,0xe0,0x1, 0xa6,0xff, +0x3e,0xdc,0xe0,0x1, 0xbe,0xff,0xe7,0xf0,0x16,0x0, 0xe0,0x2, 0xa6,0x8f,0x3e,0xd9, +0xe0,0x2, 0xbe,0x8f,0xe0,0x2, 0xa6,0x9f,0x3e,0xd9,0xe0,0x2, 0xbe,0x9f,0xe0,0x17, +0x16,0xb8,0xe0,0x4, 0xb6,0xdf,0xe0,0x2, 0xa6,0xcf,0x3e,0xdc,0xe0,0x2, 0xbe,0xcf, +0xe0,0x9, 0x16,0x88,0xe0,0x2, 0xbe,0xbf,0xe0,0x12,0x16,0xd8,0xe0,0x2, 0xbe,0xdf, +0xe1,0x20,0x16,0x80,0xe0,0x2, 0xbf,0x6f,0xe0,0x2, 0xbe,0xff,0xe0,0x3, 0xa5,0xef, +0x3d,0xd8,0xcd,0xe4,0xe0,0x3, 0xbd,0xef,0xe0,0x3, 0xa6,0x7f,0x3e,0x58,0xce,0x64, +0xe0,0x3, 0xbe,0x7f,0xe0,0x4, 0xa6,0x8f,0x3e,0xd9,0xe0,0x7, 0xce,0xe8,0xe0,0x4, +0xbe,0x8f,0xe1,0xff,0x16,0xff,0xe0,0x4, 0xbf,0x1f,0xbe,0x9f,0xe1,0x39,0x16,0x83, +0xbf,0x3f,0xbe,0xbf,0xe0,0x1, 0x1e,0xdf,0xb7,0xd, 0xa6,0xbf,0xbe,0xaf,0xe0,0x2, +0x1f,0xda,0xe8,0x0, 0x86,0x87,0xb7,0xf, 0xe0,0x2, 0x1f,0x81,0x87,0xa, 0xae,0x8f, +0xe0,0x2, 0x1f,0xfd,0xaf,0xf, 0xef,0xfe,0xd7,0x17,0xe0,0x4, 0xd9,0x7d,0xe0,0x61, +0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0x8, 0xb3,0xf0,0x2, +0x18,0xf3,0xe7,0xbf,0x16,0x7f,0xe8,0x0, 0xa7,0x1, 0xe0,0x2, 0x1e,0xbf,0xe0,0x1, +0xa7,0xee,0xf0,0x3, 0x19,0x87,0x3f,0xdc,0xe0,0x1, 0xbf,0xee,0xfa,0xd7,0xcb,0xa8, +0xe0,0x2, 0x1f,0xa8,0xe0,0x1, 0x9d,0x2d,0x85,0x8f,0xe0,0x1, 0x1f,0xa3,0xe0,0x1, +0x9e,0x1d,0xf0,0x10,0x89,0x7f,0xe0,0x0, 0x1f,0xb1,0xe0,0x3, 0x1e,0x88,0xe4,0xa, +0x35,0x20,0xe4,0xc, 0x36,0x20,0xa7,0x8f,0xe0,0x3, 0x1c,0x89,0xf0,0x3, 0x1a,0xa, +0xf0,0x3, 0x1a,0x8b,0xe0,0x3, 0x19,0x8c,0xe0,0x3, 0x19,0xd, 0xe0,0x3, 0x18,0x8e, +0xf0,0x3, 0x18,0xf, 0xf0,0x3, 0x1b,0x10,0x17,0x0, 0xe2,0x0, 0xc5,0x81,0x3d,0x4d, +0x3e,0x4d,0xe0,0xa9,0x14,0x15,0xe8,0x40,0x3d,0xf2,0xf0,0x0, 0xb9,0x8f,0x1, 0x25, +0xbe,0x1f,0x16,0xfd,0x3e,0x9e,0xe2,0x1, 0xc6,0xff,0xf0,0x0, 0xbb,0xaf,0xe2,0x0, +0xce,0x81,0xbc,0x3f,0x5, 0x9f,0x27,0x1b,0xf0,0x0, 0xba,0x4f,0xf0,0x0, 0xba,0xdf, +0xbc,0xef,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x5, 0xf0,0x0, 0xbb,0x7f, +0xe0,0x7, 0xc7,0xb0,0x1, 0xe1,0xe8,0x0, 0xa7,0x1, 0xe0,0x1, 0xa7,0xee,0xe0,0x40, +0xcf,0x80,0xe0,0x1, 0xbf,0xee,0x9, 0xe1,0xbd,0x1f,0x0, 0xdc,0xb9,0xcf,0xb9,0x5f, +0x0, 0xe8,0xb8,0xcf,0xe2,0x0, 0xcf,0x4, 0xf0,0x0, 0xb8,0x5f,0xbc,0xef,0x1, 0xe2, +0xe0,0x3, 0x1f,0x11,0xbf,0x7f,0x0, 0xe8,0x8, 0xb2,0xe0,0x2, 0x19,0x3, 0x8f,0x82, +0x27,0x8d,0xe0,0x0, 0x14,0xda,0x14,0x11,0xe0,0x4, 0xda,0x6e,0xe0,0x0, 0x14,0xda, +0x14,0x29,0xe0,0x4, 0xda,0x69,0x17,0x80,0xaf,0x82,0x9, 0x61,0xe0,0x2, 0x1f,0xac, +0x17,0x0, 0xb7,0xf, 0xe0,0x1, 0x1f,0xe5,0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x65, +0x87,0x8e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xcf,0xc8,0x5, 0x82,0x17,0xc8, +0xaf,0x8e,0x38,0x82,0xe0,0x0, 0x1f,0xb7,0x14,0x1, 0x8f,0x8f,0x2f,0x89,0xe0,0x1, +0x1f,0xe5,0x8c,0xf, 0xe0,0x2, 0x1f,0xd0,0x8f,0x8f,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0x8, 0xb1,0x3c,0x98,0x34,0xa4,0xe1,0x77,0x14,0x0, 0xe0,0x6, 0xd4,0x45,0xe3,0xff, +0xc4,0x7f,0x8, 0xe1,0xea,0x0, 0xcc,0x2, 0xe0,0x46,0xcc,0x0, 0x14,0x80,0xea,0x0, +0xcd,0x2, 0xe1,0x8d,0xcd,0x70,0x3d,0x28,0xe0,0x6, 0xd6,0xa8,0xea,0x0, 0xcc,0x0, +0xe0,0x0, 0xcc,0x0, 0x24,0x2, 0x3c,0x1, 0x14,0x0, 0x14,0x80,0xef,0xfe,0xd0,0xbc, +0x3a,0x80,0x0, 0x0, 0x3a,0x80,0xe0,0x2, 0x1f,0xfd,0xe0,0x1, 0x17,0x7d,0x8f,0x8f, +0x3f,0x58,0xe2,0x0, 0xcf,0x80,0x3c,0x6f,0x17,0x80,0xe1,0x2f,0x3f,0xf, 0xe0,0x68, +0x39,0xaf,0x38,0x82,0xe7,0xfe,0x0, 0xa4,0xe7,0xc4,0x0, 0x9b,0x8, 0xb3,0xe0,0x2, +0x19,0xed,0x11,0x0, 0x8c,0x33,0x3c,0xe2,0xc1,0x1, 0xef,0xfe,0xd2,0xf5,0xe2,0x1, +0xc1,0x7f,0xe2,0x0, 0xc9,0x3, 0xc1,0x85,0x1, 0xf6,0x14,0x81,0x3c,0x62,0xef,0xfe, +0xd2,0xeb,0x14,0x81,0x14,0x4, 0xef,0xfe,0xd2,0xe7,0xe0,0x2, 0x1f,0x8d,0x8c,0x8f, +0x24,0x82,0x14,0x81,0x14,0x0, 0x9, 0xa1,0xe7,0xc5,0x0, 0xde,0x8, 0xb1,0xde,0xff, +0xef,0xfe,0xd1,0xf7,0x8, 0xa1,0x0, 0xdb,0x8, 0xb2,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, +0x19,0x37,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0x95,0xe0,0x2, 0x1f,0xd, +0xaf,0x82,0x3c,0xef,0xaf,0x8e,0x3c,0x6f,0xe0,0x1, 0x1f,0x26,0xaf,0x8e,0xe0,0x2, +0x1f,0x41,0xaf,0x8e,0xef,0xfe,0xd2,0xc0,0xef,0xfe,0xd5,0xa1,0x8c,0x2, 0x9, 0x21, +0xe7,0xd3,0x0, 0xf5,0x17,0x81,0xe0,0x2, 0x1f,0xd, 0xe0,0x2, 0x1c,0x29,0xaf,0x82, +0xaf,0x8e,0xe0,0x2, 0xd0,0x33,0xe0,0x1, 0x1f,0xa6,0xe0,0x2, 0x1f,0x5b,0xac,0xf, +0x87,0x8f,0xaf,0x8e,0xe0,0x1, 0xde,0xde,0x14,0x81,0x14,0x0, 0xef,0xfe,0xd2,0xa4, +0x0, 0xe4,0x8, 0xb3,0x14,0x0, 0xdd,0xf8,0xe0,0x1, 0x1f,0xdf,0x14,0x1, 0x91,0x8f, +0x99,0xf, 0x39,0xd8,0x31,0x58,0x39,0x58,0xdd,0xef,0xe0,0x8, 0x39,0xc2,0x9, 0xe1, +0x8, 0xb2,0xe0,0x2, 0xd0,0x5a,0xdf,0x29,0x14,0x0, 0xdd,0xe6,0xe0,0x1, 0x1f,0x5f, +0x9f,0x8e,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x8b,0x97,0x8e,0xe0,0x1, 0x1e,0xe1, +0xe3,0xff,0xc7,0xfd,0xb7,0x8e,0x97,0xcd,0xe3,0xff,0xc7,0xf7,0xb7,0xcd,0x97,0x8e, +0xe0,0x2, 0x19,0x3b,0xe2,0x0, 0xc7,0x81,0x2f,0x97,0x14,0x1, 0xdd,0xcd,0xe0,0x2, +0x1f,0xd, 0x8f,0x82,0x8e,0x8e,0x37,0xdd,0xe2,0x0, 0xc7,0x81,0x2f,0x89,0xe0,0x2, +0x1f,0xba,0x8f,0x8f,0x8f,0xe, 0x37,0xde,0xe2,0x0, 0xc7,0x81,0x27,0x84,0x9, 0x21, +0xe7,0xec,0x0, 0xdb,0x9, 0x61,0x97,0x8e,0xe0,0x1, 0x1e,0xe1,0xe3,0xff,0xc7,0xfe, +0xb7,0x8e,0x97,0xcd,0xe3,0xff,0xc7,0xfb,0xb7,0xcd,0xdf,0x7f,0xef,0xfd,0xda,0x84, +0xe0,0x2, 0x1f,0x3a,0x17,0x87,0xaf,0x8e,0xaf,0x82,0x0, 0xd8,0xe0,0x1, 0x1f,0xce, +0xe0,0x2, 0x1f,0x43,0x8f,0x8f,0xe0,0x1, 0x8e,0xce,0xe2,0x0, 0xcf,0x85,0x2, 0x8c, +0x26,0x9c,0xe0,0x1, 0x1e,0x6a,0xe0,0x1, 0x8d,0x9e,0x3f,0x9c,0x8e,0xf, 0x3d,0xfc, +0x5, 0xb6,0xc6,0x1, 0xae,0xf, 0xe2,0x0, 0xce,0x81,0x1, 0x1f,0xe0,0x1, 0x1f,0xfb, +0x16,0x80,0xae,0x8f,0xe0,0x1, 0x8f,0xee,0xe2,0x0, 0xcf,0x81,0xeb,0xe6,0x7f,0x93, +0x1, 0x9, 0x17,0x1, 0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1e,0x6a,0x3f,0x9c,0xae,0x8f, +0x0, 0xee,0x8e,0x8f,0xe0,0x1, 0x8e,0xe, 0x3e,0x7d,0x5, 0xf4,0xc6,0x81,0x16,0x0, +0xe0,0x1, 0xae,0x6e,0xae,0x8f,0x38,0x82,0xe0,0x1, 0x1e,0x7b,0xe0,0x1, 0x8e,0x9e, +0x8f,0x8c,0x15,0x80,0x3e,0xff,0xe0,0x1, 0xad,0xee,0x5, 0x8c,0x16,0x81,0x3e,0x9f, +0xeb,0xe6,0x7f,0x93,0xe0,0x1, 0xad,0xce,0xae,0x8c,0x0, 0xdc,0x16,0x80,0xae,0x8f, +0x0, 0xd2,0xeb,0xe6,0x7f,0x93,0xad,0x8c,0x0, 0xd5,0x8, 0xb3,0xe0,0x2, 0x19,0x43, +0x17,0x1, 0x9f,0xd2,0xe0,0x1, 0xaf,0x62,0xe0,0x43,0x3f,0x1f,0xe2,0x0, 0xcf,0x0, +0xe0,0x1, 0x4, 0x17,0xe0,0x2, 0x1f,0x1f,0x8f,0xe, 0x27,0x4, 0x17,0x0, 0xe0,0x1, +0xaf,0x62,0xe2,0x0, 0xc7,0xa0,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, +0x19,0xcf,0x8f,0x83,0x2f,0x83,0xe0,0x1, 0xaf,0xe2,0xe0,0x2, 0x1f,0x8d,0x8c,0xf, +0xde,0xcb,0xe0,0x2, 0x1d,0x5, 0x24,0x7, 0xe0,0x4, 0x8f,0xda,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x1, 0x6b,0x9e,0xd2,0x17,0x80,0xe0,0x80,0x17,0x0, 0xe0,0x1, 0xaf,0xc2, +0x3f,0x5d,0xe0,0x1, 0xaf,0xd2,0x27,0x4, 0x17,0x81,0xe0,0x1, 0xaf,0xc2,0xe0,0x4, +0x17,0x80,0x3f,0xdd,0x2f,0x83,0xe0,0x1, 0xaf,0xc2,0x8f,0x83,0x2f,0x83,0xe0,0x1, +0xaf,0xc2,0xe0,0x1, 0x17,0x80,0x3f,0xdd,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xc2, +0x17,0x4, 0xe0,0x1, 0x1f,0xad,0x96,0x3f,0xe0,0x0, 0x1f,0x8e,0xe0,0x1b,0x95,0x9f, +0xe0,0xf, 0x36,0x21,0x3d,0xff,0x4, 0x4, 0x3d,0xfc,0x17,0x3, 0x3, 0x34,0xe0,0x1, +0x1f,0xa0,0x15,0x84,0x8e,0xf, 0xe0,0x2, 0x17,0x80,0x3f,0xdd,0xe2,0x0, 0xcf,0x80, +0xe0,0x1, 0x1f,0x9f,0x36,0x28,0x8f,0x8f,0xe0,0x6b,0x39,0x2e,0x3f,0xcc,0xe0,0x1, +0x1f,0x1e,0x3f,0xbb,0xe0,0x0, 0x1e,0xb, 0x8f,0xe, 0xe0,0x43,0x3f,0x9f,0x8e,0xc, +0xb7,0xb2,0xe0,0x1, 0xaf,0x2, 0x26,0xb, 0xe0,0x43,0x3e,0x9d,0xe2,0x0, 0xce,0x80, +0x4, 0x6, 0xe2,0x0, 0xcf,0x81,0x5, 0x29,0x37,0x81,0xb7,0xb2,0xe0,0x4, 0x8f,0xda, +0xe2,0x0, 0xcf,0x81,0x1, 0x85,0x97,0xb2,0xe4,0x0, 0xc7,0x85,0xb7,0xb2,0x9, 0xa1, +0xe7,0xfe,0x0, 0xa6,0xe4,0xf, 0x36,0x4f,0x3f,0x9c,0x37,0x81,0xe0,0x2f,0x3f,0x9b, +0x17,0x1, 0x3f,0x1f,0x0, 0xc5,0xe0,0x2, 0x1f,0xfe,0x8f,0x8f,0xe2,0x0, 0xcf,0xba, +0xe7,0xff,0x2, 0x92,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe7,0xff,0x0, 0x8d,0x17,0x0, +0xe0,0x1, 0xaf,0x62,0xe7,0xfe,0x0, 0xe8,0x37,0x21,0xe0,0x1, 0xaf,0x2, 0x0, 0xd7, +0xe0,0x1, 0x1e,0xea,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xaf,0x1f,0xc7,0x81,0xaf,0x1d, +0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xaf,0xf, 0x38,0x82, +0x8, 0xb2,0xc0,0x7c,0xe0,0x1, 0xd1,0xee,0xdf,0x41,0xdd,0xfd,0xe0,0x1, 0x1f,0xdc, +0x2c,0x10,0x8f,0xf, 0xe0,0x2, 0x19,0x43,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0xac,0x42, +0x1, 0x25,0xdd,0xf1,0x24,0x11,0xe0,0x1, 0x8f,0xe2,0x2f,0x9b,0xc0,0x4, 0x9, 0x61, +0x8f,0xf, 0xe0,0x2, 0x19,0x43,0xe2,0x0, 0xcf,0x1, 0x1, 0x18,0xe0,0x1, 0x8f,0xc2, +0x2f,0x9a,0xdd,0xe1,0x2c,0x71,0x7c,0x1, 0xe0,0x4, 0xdf,0xe1,0xe0,0x0, 0x1f,0x8b, +0x64,0x1, 0xac,0xf, 0xe0,0x0, 0x1f,0x8a,0xac,0xf, 0xe0,0x1, 0x8f,0xe2,0x27,0xe7, +0x14,0x0, 0xc0,0x4, 0x9, 0x21,0xe0,0x9c,0x0, 0xe1,0x17,0x1, 0x16,0x0, 0xe0,0x1, +0xaf,0x42,0xae,0xf, 0x17,0x80,0xe0,0x1, 0x1e,0xea,0xe0,0x1, 0x1f,0x69,0xaf,0x8d, +0x16,0x7, 0xaf,0x9d,0xe0,0x2, 0x1e,0xbb,0xaf,0x8e,0xae,0xd, 0xe0,0x1, 0x1f,0x68, +0xe0,0x1, 0x1e,0xfb,0xaf,0x8e,0xaf,0x8d,0x0, 0xc5,0x0, 0x0, 0xe0,0x0, 0x1f,0x8d, +0x8f,0xf, 0xe0,0x0, 0x1f,0x8e,0xe0,0x0, 0x27,0x60,0xe0,0x0, 0x1f,0xb, 0x8e,0xe, +0xe2,0x0, 0xce,0x2, 0x1, 0x8, 0x17,0xa, 0x3f,0x38,0x3f,0x9e,0xf0,0x10,0x8b,0xaf, +0x5, 0xb4,0x38,0x82,0x8e,0xbf,0xf0,0x0, 0x8b,0x9f,0xf0,0x0, 0x8b,0xf, 0xf0,0xe, +0x3b,0xad,0x8d,0xaf,0xe2,0x0, 0xcf,0x0, 0xe8,0x17,0x3e,0xa7,0xf2,0x1, 0xc3,0xff, +0xf0,0xd, 0x3b,0x2b,0xe2,0x1, 0xc7,0x7f,0xe8,0x6e,0x3d,0x27,0xe8,0xb, 0x3d,0xa6, +0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc5,0xff,0xe2,0x1, 0xc6,0xff,0xe0,0x6d,0x3d,0x2b, +0xf0,0x40,0x3b,0xee,0x3d,0xed,0xf2,0x1, 0xc3,0xff,0xe2,0x1, 0xc5,0xff,0xf0,0x40, +0x3b,0xfb,0x3, 0x82,0x3f,0x6d,0x15,0x8a,0x3d,0xb8,0x3e,0xee,0xe0,0xf, 0x3f,0x9b, +0xf0,0x10,0x8b,0xaf,0xe2,0x1, 0xc6,0xff,0xf2,0x0, 0xcb,0x94,0x2, 0x99,0xf2,0x0, +0xcb,0x8a,0x2, 0xad,0xea,0xf, 0x7f,0x58,0xe0,0xf, 0x3f,0x18,0x8d,0x89,0xf0,0x0, +0x8b,0xf, 0xe8,0x40,0x3d,0xf6,0x3, 0x86,0xf0,0x0, 0xab,0x9, 0x8f,0x8f,0xaf,0x8a, +0x8d,0x89,0xe2,0x0, 0xce,0x2, 0x1, 0x1f,0x3f,0x18,0xad,0x8e,0x38,0x82,0x17,0x85, +0xaf,0x89,0xaf,0x8a,0x0, 0xe8,0xea,0xf, 0x7e,0xd8,0x3f,0xed,0xe1,0x80,0xbf,0x1f, +0xc7,0x84,0xbf,0x1d,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f, +0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xb7,0xf, 0x38,0x82,0x17,0x84,0xaf,0x89, +0xaf,0x8a,0x0, 0xd1,0xe0,0xf, 0x36,0xc1,0xe2,0x1, 0xc7,0xff,0x3f,0xfb,0x3, 0x8d, +0xf2,0x0, 0xcb,0x95,0x16,0x83,0xe0,0x6d,0x3c,0xac,0x3e,0xff,0xe0,0x6f,0x3b,0xad, +0x3d,0xef,0xe2,0x1, 0xc5,0xff,0xad,0x89,0xad,0x8a,0x8d,0x89,0x0, 0xce,0xe0,0x1, +0x1f,0xcf,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x2, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x78,0xe0,0x0, 0x19,0xb, 0xf0,0x0, 0x8e,0x2, 0xf0,0x1, 0x26,0x1c, +0xf0,0x0, 0x16,0x0, 0xe0,0x0, 0x1a,0xe, 0xe0,0x2, 0x19,0xbf,0xf0,0x1, 0x1c,0xd1, +0xe0,0x1, 0x1b,0x2d,0xf0,0x1, 0x1c,0x1d,0xf8,0x40,0x3d,0xec,0x12,0x83,0x13,0x84, +0x0, 0x9e,0x14,0x84,0x3c,0x69,0xe8,0x40,0x3d,0xec,0xe8,0x40,0x3d,0x6b,0x6b,0x8a, +0x6b,0x8b,0xe0,0x4, 0xdf,0xc1,0xe8,0x0, 0x8f,0x88,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x1, 0x6d,0xf0,0x0, 0xc6,0x1, 0xf2,0x1, 0xc6,0x7f,0xf0,0x0, 0xc5,0x81,0x8f,0x82, +0xf2,0x1, 0xc5,0xff,0xe8,0x40,0x3f,0xfb,0xe0,0x0, 0x5, 0xee,0xf0,0xe, 0x35,0xa1, +0x3f,0x14,0xf0,0x0, 0x8e,0x8e,0x8f,0xd3,0xf0,0x0, 0x8d,0x1e,0xe8,0xf, 0x3f,0xbd, +0xe8,0x0, 0xa7,0x9, 0xe8,0xf, 0x3f,0x9a,0x37,0xa1,0x3f,0x9e,0x97,0xf, 0x97,0xa6, +0x3f,0x7f,0x4, 0x64,0xe0,0x3, 0x8f,0x96,0x6a,0x8a,0x6a,0x8b,0x2f,0xcb,0x8f,0xf3, +0x15,0x80,0xe8,0x40,0x3d,0x6b,0xe8,0x40,0x3c,0xea,0xe8,0x40,0x3c,0x6d,0x7f,0x81, +0xf0,0x0, 0x8f,0x63,0xe0,0x4, 0xde,0xf8,0x8f,0x82,0xe2,0x0, 0xcf,0x83,0x5, 0x84, +0x17,0x82,0x6f,0x8a,0x6f,0x8b,0xe2,0x1, 0xcc,0x7f,0x1, 0x4, 0x17,0x82,0x6f,0x8a, +0x6f,0x8b,0xf2,0x0, 0xce,0x81,0x5, 0x86,0xf1,0xff,0xc7,0x7e,0xf8,0x40,0x3e,0xfe, +0x4, 0x3, 0x17,0x81,0x6f,0x8a,0xf2,0x0, 0xcd,0x1, 0x5, 0x88,0xf0,0x0, 0x66,0x81, +0xf1,0xff,0xc6,0xfe,0xf8,0x40,0x3d,0x7d,0x4, 0x3, 0x17,0x81,0x6f,0x8b,0xe2,0x0, +0x7d,0xb, 0xe2,0x0, 0x7c,0x8a,0xe8,0x40,0x3c,0x6b,0xde,0xe1,0x4c,0xa, 0x4c,0x8b, +0xe8,0x40,0x3d,0xec,0xe8,0x40,0x3d,0x6b,0xe0,0x4, 0xdf,0x56,0xe8,0x0, 0x8f,0x88, +0xe2,0x0, 0xcf,0x81,0xe7,0xff,0x1, 0x97,0x17,0x8a,0xe8,0xf, 0x3f,0xbc,0x3f,0x94, +0xe0,0x7, 0x9e,0xef,0xe0,0x7, 0x97,0x7f,0xe0,0x7, 0xb6,0xff,0xe0,0x7, 0xb7,0x6f, +0xe7,0xff,0x0, 0x89,0xf0,0x0, 0xae,0x2, 0xc0,0x8, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0x8f,0x8, 0x3f,0xe8,0x3f,0x79,0x2, 0x8c,0x8f,0x28,0x14,0x0, 0x3f,0x79,0x5, 0x89, +0x8f,0x1f,0x3f,0x7a,0x2, 0x86,0x8c,0x3f,0xe1,0x28,0x3c,0x1a,0x38,0x82,0x14,0x0, +0x38,0x82,0xe0,0x2, 0x1f,0xbf,0x8f,0xdf,0x3c,0x3f,0x3c,0x19,0xe3,0xff,0xc4,0x7f, +0x38,0x82,0x24,0x9b,0xc4,0xff,0xe2,0x1, 0xc4,0xff,0x17,0x7f,0xe0,0xe, 0x3f,0x18, +0xe0,0xb, 0x3c,0x19,0xe0,0x1, 0x14,0x7f,0xe0,0x80,0x87,0x9e,0xe4,0xd, 0x34,0x28, +0xe4,0xf, 0x37,0xa8,0xe4,0xc, 0x37,0xc8,0x3e,0x78,0xe0,0x6f,0x3a,0xad,0x3f,0x7b, +0xe4,0x8, 0x37,0xc8,0x1, 0xf2,0x38,0x82,0xe0,0x1, 0x14,0x7f,0x38,0x82,0x24,0x99, +0xc4,0xff,0xe2,0x1, 0xc4,0xff,0x17,0x7f,0x3f,0x18,0x3c,0x98,0xe0,0x0, 0x14,0x0, +0xe0,0x80,0x87,0x9e,0xe4,0xd, 0x34,0x28,0xe4,0xf, 0x37,0xa8,0xe4,0xc, 0x37,0xc8, +0x3e,0x78,0xe0,0x6f,0x3c,0xad,0x3f,0x79,0xe4,0x8, 0x37,0xc8,0x1, 0xf2,0x38,0x82, +0x3c,0x69,0x38,0x82,0x24,0xb2,0xc4,0xff,0xe3,0xff,0xc4,0xff,0x16,0x7f,0x3e,0x18, +0xe0,0xb, 0x3c,0x19,0xe1,0xff,0x14,0x7f,0xe0,0x80,0x8f,0x9c,0x17,0x8, 0x37,0xbe, +0x0, 0x8d,0xc7,0x7f,0xe4,0x8, 0x34,0x21,0xe4,0xf, 0x37,0xa1,0xe3,0xff,0xc7,0x7f, +0xe4,0x8, 0x34,0x40,0xe4,0xf, 0x37,0xc0,0x27,0x15,0xe2,0xd, 0x3c,0x4f,0xe0,0x43, +0x3e,0x9d,0xe2,0x0, 0xce,0x80,0x3, 0x6e,0x34,0x21,0xc7,0x7f,0xe4,0x20,0xcc,0x21, +0xe4,0xf, 0x37,0xa1,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc4,0x7f,0xe4,0xf, 0x37,0xc0, +0x2f,0x6d,0x3d,0xfc,0x1, 0xda,0x38,0x82,0xe1,0xff,0x14,0x7f,0x38,0x82,0xe0,0x2, +0x1f,0x7, 0x9f,0x88,0x9e,0x8e,0x3f,0xfd,0x2, 0x84,0x17,0x80,0xb7,0x88,0x38,0x82, +0x9f,0xe, 0x3f,0xae,0xb7,0x88,0x38,0x82,0xe0,0xf, 0x3c,0x2a,0x3e,0xef,0xe2,0x1, +0xc6,0xff,0xf0,0x43,0x3a,0x8d,0xe0,0x13,0x3c,0x1a,0xe0,0x2, 0x1e,0x3f,0xf8,0x40, +0x3a,0xf3,0xf0,0x0, 0x80,0xec,0xf0,0x0, 0x83,0x7c,0xe0,0x0, 0x2, 0x59,0xe0,0xf, +0x34,0x21,0xe0,0x12,0x3c,0xaa,0x3f,0xad,0xe0,0x1, 0x1e,0xd1,0xe8,0x40,0x3f,0x62, +0xe2,0x1, 0xc7,0x7f,0xe0,0x12,0x34,0xa1,0x3d,0x19,0xf0,0x0, 0xa3,0x8d,0x3c,0xef, +0xf0,0x0, 0x88,0x5c,0xf0,0x43,0x3a,0xe, 0xe2,0x1, 0xc4,0xff,0xe0,0x0, 0x14,0x0, +0xf0,0x12,0x39,0x2e,0xf2,0x0, 0xca,0x80,0xe0,0x43,0x3f,0x89,0xe8,0x40,0x3d,0xe5, +0xe0,0x6b,0x3c,0x2f,0xf8,0x40,0x38,0xf5,0xe0,0x6b,0x3d,0x2f,0xf0,0x40,0x3a,0x7a, +0x2, 0x23,0xe8,0x40,0x3e,0xe2,0xe8,0xb, 0x3d,0xb0,0xe2,0x1, 0xc6,0xff,0xe8,0x40, +0x3f,0x64,0x0, 0x0, 0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0xd, 0x3f,0xee,0xe0,0x6f, +0x3c,0x2c,0xf0,0x40,0x3b,0x7e,0xc7,0x1, 0xe0,0x6f,0x3d,0x2c,0x3f,0x9b,0x37,0xa1, +0xe8,0xf, 0x3f,0x97,0xe0,0x43,0x3f,0xe, 0x97,0x8f,0x3f,0x7a,0xc6,0xff,0x3c,0x1f, +0xe2,0x1, 0xc6,0xff,0x5, 0x68,0xf0,0x0, 0xc2,0x81,0xf8,0x43,0x3a,0x85,0xf8,0x40, +0x3a,0xf3,0xc4,0xff,0xe2,0x1, 0xc4,0xff,0x5, 0x46,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe0,0x0, 0x1f,0x8e,0x34,0x21,0x3f,0x98,0x3d,0x69,0x8c,0xf, 0x8c,0x9f,0xe2,0x1, +0xc5,0x7f,0xe7,0xff,0x0, 0x8b,0x8, 0xb1,0xc0,0x68,0xe4,0x0, 0x17,0x80,0xe0,0x2, +0x1e,0xbf,0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd,0x3d,0x1f,0xe0,0xf, +0x34,0x41,0x7f,0x1, 0x34,0xc1,0x7f,0x6, 0x35,0x41,0x7f,0x85,0xe2,0x0, 0x7c,0x4, +0x17,0x90,0x7f,0x2, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, 0x77,0x8c,0xe0,0x4, +0xd6,0x70,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, 0x1e,0xbf,0xe4,0x0, +0x17,0x80,0x17,0x0, 0x86,0x5d,0x3c,0x1f,0x86,0xcd,0x3c,0x9f,0x3d,0x1f,0x7f,0x1, +0xe0,0xf, 0x34,0x41,0x34,0xc1,0x35,0x41,0xe2,0x0, 0x7c,0x4, 0x7f,0x2, 0x7f,0x6, +0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, 0x7f,0x85,0x6d,0x87,0xe0,0x4, 0xd6,0x51, +0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe4,0x0, 0x17,0x80,0xe0,0x2, 0x1e,0xbf, +0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd,0xe0,0xf, 0x34,0x41,0x7f,0x1, +0x34,0xc1,0x7f,0x6, 0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0xa0,0x7f,0x2, 0x7f,0x4, +0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x77,0x8c,0xe0,0x4, 0xd6,0x33,0xc0,0x18,0x8, 0xe1, +0x8, 0xb1,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0x2d,0xe0,0x2, 0x1e,0xbf,0xe4,0x0, +0x17,0x80,0xe2,0x0, 0x7d,0xae,0x3c,0x1f,0xf0,0x0, 0x93,0x2e,0xf0,0x0, 0x93,0xbe, +0x95,0x7e,0x3f,0x9b,0xe0,0x1, 0x95,0x8e,0xe0,0x1, 0x1f,0x47,0xf0,0x0, 0x82,0x4d, +0xf0,0x0, 0x82,0xdd,0x16,0x1, 0xe0,0xd, 0x34,0x41,0x37,0xc1,0x37,0x41,0xe2,0x0, +0x7c,0x14,0xe2,0x0, 0x7c,0x84,0x7e,0x86,0x7f,0x88,0x7f,0x7, 0x75,0x95,0x6e,0x16, +0x6e,0x17,0xf0,0x0, 0x6a,0x15,0xf0,0x0, 0x6a,0x94,0xf0,0x0, 0x73,0x12,0xf0,0x0, +0x73,0x93,0x75,0x14,0xe0,0x4, 0xd6,0x5d,0x5c,0x7, 0x5f,0x5, 0xe0,0x43,0x3f,0x98, +0xe2,0x0, 0xcf,0x80,0xe0,0x41,0x3e,0x4f,0xe0,0x43,0x3e,0x9e,0x3d,0xe8,0xe0,0x6b, +0x3d,0x2c,0xe2,0x0, 0xce,0x80,0x5, 0x13,0x3d,0xfe,0x5, 0xd, 0xe0,0x41,0x3f,0x48, +0xe2,0x0, 0xcf,0x80,0x3f,0xee,0xe3,0xff,0xc7,0xff,0xe0,0x68,0x3d,0x2f,0xe0,0x0, +0xc0,0x68,0x8, 0xe1,0x3c,0x6e,0xe0,0x0, 0xc0,0x68,0x8, 0xe1,0xe0,0x41,0x3e,0xcd, +0x3d,0xfd,0x2, 0x6d,0xe0,0x41,0x3c,0x4e,0xe3,0xff,0xc4,0x7f,0xe0,0x0, 0xc0,0x68, +0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, 0x1f,0x3f,0xe4,0x0, 0x17,0x80,0x16,0x80, +0x3c,0x9f,0xf0,0x0, 0x81,0xde,0xf0,0x0, 0x82,0x4e,0x3f,0x98,0xe0,0x16,0x35,0x41, +0xe0,0x17,0x35,0x42,0x17,0x1, 0x7e,0x81,0xe0,0x15,0x34,0xc1,0x7e,0x86,0x3f,0x5a, +0x37,0xc1,0xf2,0x0, 0xc3,0x1, 0xf2,0x0, 0xc3,0x81,0x3d,0x6c,0x3c,0xeb,0xe2,0x0, +0x7c,0x4, 0x7e,0x82,0x7e,0x84,0xf0,0x0, 0x69,0x85,0xf0,0x0, 0x6a,0x4, 0xf0,0x0, +0x7a,0x83,0x7f,0x85,0x6f,0x7, 0xf0,0x0, 0x6b,0x1a,0xf0,0x0, 0x6b,0x9b,0xe0,0x4, +0xd8,0x4e,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe4,0x0, 0x17,0x80,0xe0,0x2, +0x1f,0x3f,0x3c,0x1f,0xf0,0x0, 0x13,0x80,0x3c,0x9f,0xf0,0x0, 0x82,0xde,0xf0,0x0, +0x83,0x4e,0x3d,0x1f,0xe0,0xe, 0x34,0x41,0xe0,0xf, 0x36,0x41,0x36,0x42,0xf0,0x0, +0x7b,0x81,0xe0,0xd, 0x34,0xc1,0xf0,0x0, 0x7b,0x86,0x35,0x41,0xe2,0x0, 0xc7,0x81, +0xe2,0x0, 0xc6,0x1, 0x7f,0x5, 0x3c,0xeb,0x17,0x1, 0xe2,0x0, 0x7c,0x4, 0xf0,0x0, +0x7b,0x82,0xf0,0x0, 0x6a,0x85,0xf0,0x0, 0x6b,0x4, 0x7e,0x83,0x7d,0x4, 0x6f,0x7, +0x6f,0x9a,0x6e,0x1b,0xe0,0x4, 0xd7,0xd6,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68, +0xe0,0x2, 0x1f,0x3f,0xe4,0x0, 0x17,0x80,0x16,0x0, 0x3c,0x1f,0xf0,0x0, 0x83,0x5e, +0xf0,0x0, 0x83,0xce,0x3c,0x9f,0x3d,0x1f,0xe0,0xe, 0x35,0xc1,0xe0,0xf, 0x35,0xc2, +0x7e,0x1, 0xe0,0xd, 0x34,0x41,0x7e,0x6, 0x34,0xc1,0x35,0x41,0xe2,0x0, 0xc5,0x81, +0xe2,0x0, 0xc7,0x1, 0xe2,0x0, 0xc7,0x81,0xe2,0x0, 0x7c,0x4, 0x7e,0x2, 0xf0,0x0, +0x6b,0x5, 0xf0,0x0, 0x6b,0x84,0x7c,0x83,0x7d,0x4, 0x7e,0x85,0x6d,0x87,0x6f,0x1a, +0x6f,0x9b,0xe0,0x4, 0xd8,0x55,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, +0x1f,0x3f,0xe4,0x0, 0x17,0x80,0x16,0x80,0xf0,0x0, 0x83,0xde,0x85,0xce,0x3c,0x9f, +0x3c,0x1f,0xe0,0xe, 0x35,0x41,0xe0,0xf, 0x35,0x42,0x16,0x1, 0x7e,0x81,0x3e,0x5a, +0x34,0xc1,0x34,0x41,0xe2,0x0, 0xc7,0x1, 0xe2,0x0, 0xc7,0x81,0x7e,0x82,0x35,0x43, +0x7e,0x84,0xf0,0x0, 0x6b,0x85,0x6d,0x84,0x7c,0x83,0x7c,0x5, 0x6e,0x7, 0x6f,0x1a, +0x6f,0x9b,0x2d,0x9, 0x14,0x4, 0x17,0xa0,0x3c,0x10,0x77,0x8c,0xe0,0x4, 0xd7,0xf5, +0xc0,0x18,0x8, 0xe1,0x14,0x4, 0x17,0x90,0x3c,0x10,0x77,0x8c,0xe0,0x4, 0xd7,0xed, +0xc0,0x18,0x8, 0xe1,0x8, 0xb2,0xc0,0x70,0xf0,0x1, 0x1b,0xc6,0xf0,0x1, 0x1a,0xc5, +0xe0,0x1, 0x19,0x44,0xe4,0x0, 0x17,0x80,0xe0,0x1, 0x1f,0x4d,0xf0,0xc, 0x3a,0x9f, +0xf0,0xd, 0x3b,0x9f,0xe8,0x0, 0xb4,0x5, 0x3f,0x92,0xf0,0x8d,0x12,0x86,0xf0,0x0, +0x13,0x1, 0xf0,0x15,0x3a,0x9e,0x36,0x41,0x36,0xc1,0x37,0xc1,0xe0,0x8d,0xc7,0x2e, +0xe2,0x0, 0x7c,0x4, 0x7e,0x2, 0x7e,0x83,0x7f,0x84,0xf0,0x0, 0x6b,0x4, 0xf0,0x0, +0x6b,0x5, 0xe8,0x0, 0xb4,0x85,0xe8,0x0, 0xb5,0x7, 0xb5,0x8e,0xe0,0x4, 0xd5,0xc2, +0x9c,0x2, 0xc0,0x10,0x9, 0x61,0x0, 0x0, 0xe0,0x2, 0x1f,0xff,0x8f,0x8f,0xe2,0x0, +0xcf,0x83,0x1, 0x3, 0x14,0x1, 0x38,0x82,0x8, 0xb2,0x39,0x68,0x3c,0x69,0xd9,0xd4, +0xe0,0x1, 0x1f,0xe0,0xe0,0x1, 0x8f,0x1f,0xe2,0x0, 0xcf,0x5, 0x24,0x7, 0x1, 0x8, +0xe0,0x1, 0x8c,0x1f,0xe0,0x28,0x39,0x8, 0x9, 0x61,0x1, 0xfb,0x0, 0xfc,0xe2,0x1, +0xc1,0x7d,0x14,0x0, 0x29,0x7a,0xea,0xf, 0x7f,0xf6,0x8e,0xf, 0x17,0x1, 0x3f,0x1c, +0xe0,0x1, 0x1e,0xa4,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x3, 0x3e,0x9c,0x8c,0xd, +0x2, 0x83,0xaf,0xf, 0x9, 0x61,0xa9,0xf, 0x9, 0x61,0xe0,0x2, 0x1f,0xe9,0xe4,0x0, +0xc4,0x8e,0xe0,0xe, 0x3f,0x99,0x8f,0x1e,0x27,0x5, 0x17,0x1, 0xe0,0x2e,0x3c,0xe, +0x2f,0xd, 0x3f,0x99,0x8f,0xbf,0x27,0x89,0x17,0x84,0xe0,0x28,0x3c,0xf, 0x24,0x5, +0xe0,0x1, 0x1f,0xcf,0x17,0x0, 0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x4f,0x16,0x80, +0xae,0x8e,0x0, 0xf0,0x8, 0xb5,0xe0,0x2, 0x1f,0x8d,0x8a,0xf, 0xef,0xfe,0xd5,0xc4, +0x24,0x7e,0xe0,0x0, 0x19,0x2b,0xe0,0x2, 0x8f,0x82,0xe0,0xe, 0x39,0x1f,0xe0,0x6, +0x8a,0x8e,0x8e,0xce,0x2e,0xa3,0xe0,0x1, 0x19,0xcf,0x8f,0x83,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x1, 0x3d,0xe0,0x2, 0x1f,0xff,0x8f,0x8f,0xe2,0x0, 0xcf,0x83,0x1, 0x36, +0xe0,0x2, 0x8f,0x2, 0xe0,0x2, 0x8f,0x92,0x3f,0x7f,0x4, 0x8b,0xef,0xff,0xd0,0x75, +0xac,0x3, 0xe0,0x1, 0xd8,0xd3,0xe0,0x1, 0xd8,0x56,0xd9,0xe3,0xef,0xfe,0xd5,0x28, +0xd9,0x26,0xa, 0xa1,0xe7,0xf2,0x0, 0xb0,0x3f,0x2, 0x8e,0xce,0xe0,0x1, 0x1e,0x60, +0xc6,0xff,0xe0,0x5, 0xae,0xbc,0x8f,0x4e,0xe0,0x1, 0x19,0xcf,0xe2,0x0, 0xcf,0x1, +0x1, 0x2, 0x17,0x0, 0xaf,0x3, 0x3f,0x92,0x17,0x0, 0xaf,0x4f,0x3c,0x65,0xe0,0x1, +0x8a,0x1f,0x3c,0xe4,0xe0,0x4, 0xdd,0xe4,0xe0,0x2, 0x8f,0x82,0xc7,0x81,0xe0,0x2, +0xaf,0x82,0x8f,0x83,0xe2,0x0, 0xcf,0x81,0x1, 0xc6,0xe0,0x2, 0x1f,0xa8,0x8f,0x8f, +0x27,0xc8,0xe2,0x0, 0xca,0x85,0x1, 0x1f,0x17,0x5, 0x3f,0x34,0xe0,0x2, 0x1f,0xed, +0x3f,0x9e,0x8c,0xcf,0xe0,0x1, 0x1f,0xc3,0xa4,0xf, 0xef,0xfe,0xd6,0x69,0x3c,0xe4, +0x3c,0x65,0xdf,0x4b,0xe7,0xff,0x24,0x36,0xe0,0x4, 0xdd,0xf4,0xe0,0x1, 0x1f,0xce, +0xaa,0x8f,0xe0,0x1, 0x1f,0xe0,0xe0,0x5, 0xaa,0xcf,0xe0,0x2, 0x1f,0xce,0xaa,0xf, +0xe7,0xff,0x0, 0xa8,0x17,0x80,0xaf,0x83,0xe7,0xff,0x0, 0xa4,0x8, 0xb3,0xe0,0x0, +0x19,0xab,0x11,0x0, 0xdf,0x80,0xc1,0x1, 0xe0,0x2, 0x8f,0x93,0xe2,0x1, 0xc1,0x7f, +0x39,0x7f,0x4, 0xf9,0xe0,0x1, 0x1f,0xe0,0xe0,0x5, 0x8c,0x4f,0xe0,0x2, 0x1f,0xce, +0x8c,0x8f,0x9, 0xa1,0xe0,0x9b,0x0, 0x9c,0xe0,0x1, 0x1c,0xaa,0x15,0x20,0xe0,0x22, +0x14,0x40,0xe7,0xdb,0x0, 0xd7,0xe0,0x1, 0x1f,0x23,0xe0,0x1, 0x1f,0xe0,0xe0,0xe, +0x85,0x9e,0x16,0x0, 0xae,0xf, 0x15,0x2, 0xad,0xaf,0xe0,0x2, 0x1e,0xa8,0xe0,0xe, +0x85,0xae,0x8e,0x8d,0xad,0xbf,0x3d,0x5d,0xe0,0xe, 0x85,0xde,0xe0,0x3, 0xad,0xef, +0x2d,0x2d,0xe0,0x10,0x86,0x5e,0xe0,0x10,0x85,0xee,0x3e,0x1b,0xe0,0x2, 0xae,0x6f, +0xe0,0xe, 0x86,0x6e,0xe0,0x3, 0xae,0x7f,0x16,0x3f,0x3e,0x5d,0xe0,0x11,0x8e,0x8e, +0xe0,0x10,0x8d,0xfe,0x36,0xa6,0x3e,0xcc,0xe0,0xc, 0x35,0xa7,0x3e,0xcc,0xe0,0x4, +0xae,0xef,0x2d,0x9b,0xe0,0xd, 0x86,0x5e,0xe0,0xd, 0x86,0xfe,0xe0,0xa, 0xae,0xf, +0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x2d,0x72,0xe0,0xd, 0x85,0xee,0xe0,0xe, 0x87,0xe, +0xe0,0xa, 0xad,0xaf,0xe0,0xa, 0xaf,0x3f,0x0, 0x97,0xe0,0x10,0x85,0xde,0xe0,0x2, +0xad,0xef,0xe0,0x3, 0xae,0x7f,0x0, 0xd9,0xe0,0xd, 0x86,0x6e,0xe0,0xe, 0x86,0x8e, +0xe0,0xa, 0xae,0xf, 0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x25,0x4e,0x17,0x0, 0xe0,0xa, +0xaf,0x2f,0xe0,0xa, 0xaf,0x3f,0x17,0x0, 0xe0,0x1, 0x1e,0x9c,0xe0,0x2, 0x1e,0x9, +0x86,0x8d,0x15,0x81,0xae,0xdf,0xaf,0x6f,0xe0,0x1, 0xaf,0x3f,0xe0,0x2, 0xaf,0xf, +0xe0,0x0, 0x1e,0xb7,0xe0,0x1, 0xaf,0x7f,0x86,0x8d,0xe0,0x1, 0xae,0xcf,0xe0,0x1, +0xaf,0x5f,0x86,0xbc,0xe0,0x1, 0xaf,0x6f,0x87,0x4c,0xe0,0x4, 0xae,0x8f,0xe0,0x4, +0xaf,0x1f,0xe0,0x1, 0x1f,0x1b,0x86,0x5c,0x8e,0x8e,0xe0,0x1, 0x1f,0x1a,0xe0,0x4, +0xae,0x2f,0x36,0xa8,0xe0,0x2, 0x1e,0x4d,0x8f,0xe, 0x86,0x1c,0x3f,0x4d,0xe0,0x2, +0x1e,0xfd,0xe0,0x5, 0xae,0x1f,0xe0,0x6, 0xad,0x8f,0x8e,0x8d,0xe0,0x5, 0xb7,0x5f, +0x26,0xa2,0xe0,0x2, 0x1f,0x73,0xa7,0xe, 0xa7,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x1b, +0x16,0x85,0xe0,0x1, 0xae,0x9f,0x17,0x0, 0xe0,0x2, 0xaf,0x5f,0xe0,0x2, 0xaf,0x1f, +0xaf,0x4f,0x38,0x82,0xe0,0xd, 0x85,0xde,0xe0,0xd, 0x87,0x7e,0xe0,0xa, 0xad,0xaf, +0xe0,0xa, 0xaf,0x3f,0xe7,0xff,0x0, 0xb1,0xe0,0xa, 0xad,0xaf,0xe0,0xa, 0xad,0xbf, +0xe7,0xff,0x0, 0xab,0x16,0x0, 0xe0,0x1, 0xae,0x1f,0x17,0x0, 0xe0,0x2, 0xaf,0x5f, +0xe0,0x2, 0xaf,0x1f,0xaf,0x4f,0x38,0x82,0xe0,0x2, 0x1f,0x39,0x34,0xa6,0xf0,0x2, +0x1b,0xb8,0x3c,0x19,0x17,0x80,0xb4,0xe, 0x17,0x0, 0x3d,0xef,0xe8,0x0, 0xaf,0x7, +0x3e,0xef,0x15,0x1, 0xe0,0xe, 0x34,0x1f,0x16,0x1, 0xe2,0x0, 0xc7,0x1, 0xc7,0x81, +0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0xea,0xe2,0x0, 0xcf,0x8c, +0x1, 0xf2,0x2d,0x82,0x38,0x82,0xe8,0x0, 0xae,0x87,0x38,0x82,0x8, 0xb1,0xf0,0x2, +0x1b,0xbf,0xe0,0x1, 0x1c,0x99,0xe8,0x40,0x3c,0x67,0xe0,0x19,0x15,0x1c,0xe0,0x5, +0xde,0x73,0xe0,0x2, 0x1f,0xa8,0xf0,0x40,0x3b,0xe8,0x87,0x8f,0xe2,0x0, 0xc7,0x82, +0x2f,0xbe,0xe0,0x3, 0x8e,0x98,0xe0,0x3, 0x8f,0x88,0x97,0x58,0x96,0x68,0x3f,0x9d, +0xe0,0x2, 0x1e,0xb7,0x3f,0x1c,0xb7,0xd, 0xe0,0x2, 0x1f,0x36,0xb7,0x8e,0x17,0x80, +0xe0,0x1, 0x1e,0xa3,0xe0,0x2, 0x1c,0x38,0xe0,0xe, 0x8f,0x6d,0xe0,0xe, 0x8d,0xdd, +0x37,0x26,0x3d,0x9e,0xe0,0x2, 0x1f,0x39,0x3d,0x6f,0xb5,0x8e,0x17,0x0, 0xaf,0x8, +0x3e,0xef,0x14,0x81,0xe0,0xe, 0x35,0x9f,0x16,0x1, 0xe2,0x0, 0xc7,0x1, 0xc7,0x81, +0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0x69,0xe2,0x0, 0xcf,0x8c, +0x1, 0xf2,0x2d,0x1f,0xe0,0x1, 0x1f,0x9d,0x8f,0x8f,0x27,0x93,0xe8,0x0, 0x8f,0xc7, +0xe0,0x2, 0x1f,0x35,0x37,0xa6,0xc7,0xff,0xb7,0x8e,0x8, 0xe1,0xe0,0x2, 0x1f,0xb7, +0x96,0xd8,0xe0,0x3, 0x8f,0x8, 0xb6,0x8f,0xe0,0x2, 0x1f,0xb6,0xb7,0xf, 0x0, 0xc8, +0xe8,0x0, 0x8f,0xd7,0xe0,0x2, 0x1f,0x35,0x37,0xa6,0xc7,0xff,0xb7,0x8e,0x8, 0xe1, +0xae,0x88,0x0, 0xe1,0x8, 0xb3,0xe0,0x1, 0x19,0x4d,0xe0,0x1, 0x1f,0xc2,0xe0,0xc, +0x11,0xd2,0xe0,0x8c,0x16,0xfc,0xe0,0x8d,0x17,0x0, 0x3e,0x92,0x3f,0x12,0x3d,0x63, +0x3c,0x6f,0x14,0x80,0xbf,0x8d,0xb9,0xe, 0xe0,0x5, 0xde,0x40,0x3d,0x63,0x14,0x80, +0x3c,0x62,0xe0,0x5, 0xde,0x3b,0xe0,0x8f,0xc1,0x46,0x17,0x80,0xaf,0x82,0x9, 0xe1, +0x8, 0xb2,0xe0,0x1, 0x1f,0xa3,0xe0,0x1a,0x17,0x24,0x3f,0x1f,0xe0,0x1a,0x16,0x25, +0xe0,0x1a,0x15,0x2a,0x8e,0x8e,0x3e,0x1f,0x3d,0x1f,0xe0,0x1a,0x17,0x26,0x8d,0x8c, +0x8c,0xa, 0x3f,0x1f,0xe0,0x1a,0x16,0x27,0xe0,0x1a,0x14,0xab,0xe0,0x1a,0x15,0x2c, +0x8f,0xe, 0x3c,0x9f,0x3d,0x1f,0x3e,0x1f,0x36,0xa8,0xe0,0x2, 0x19,0x5, 0x8e,0xc, +0x3d,0xcd,0xf0,0x1a,0x13,0xad,0x8e,0x89,0x8c,0x8a,0xe0,0x1a,0x15,0x34,0xf0,0x17, +0x3b,0x9f,0x3d,0x1f,0x37,0x28,0x35,0xc5,0x8d,0xa, 0x3e,0x4e,0x34,0x28,0xe8,0x0, +0x8f,0x7, 0xe0,0x1a,0xc7,0xb5,0xad,0x82,0x36,0x45,0x8f,0x8f,0xe0,0xb, 0x34,0xa8, +0x3e,0xc8,0xae,0x12,0x36,0xc5,0xe0,0xc, 0x35,0x28,0x3f,0x4b,0xae,0xa2,0x37,0x45, +0x3f,0xcc,0xe0,0x1, 0x1c,0x98,0xe0,0x2, 0x1c,0x4, 0xaf,0x32,0x37,0xc5,0xe0,0x0, +0x15,0x69,0xaf,0xd2,0xe0,0x5, 0xdd,0xb0,0xe0,0x4, 0x8f,0xe2,0xe0,0x1, 0x1c,0xaa, +0xe0,0x41,0x3f,0x8f,0x15,0x20,0xe0,0x22,0x14,0x40,0xe0,0x6, 0xaf,0xc2,0xef,0xfe, +0xdc,0x21,0x9, 0x21,0xe0,0x2f,0x0, 0xed,0x8, 0xb6,0xe0,0x1, 0x1f,0xa3,0xe0,0x1a, +0x15,0xa8,0xe0,0x1a,0x16,0x2e,0xe0,0x1a,0x16,0xb2,0x3d,0x9f,0x3e,0x1f,0x3e,0x9f, +0xe0,0x1a,0x14,0x2a,0xe0,0x1a,0x14,0xac,0xe0,0x1a,0x15,0x30,0x8a,0x8b,0x8a,0xc, +0x89,0x8d,0x3c,0x1f,0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x11,0x24,0xe0,0x1a,0x10,0xa6, +0xe0,0x1a,0x15,0xa9,0xe0,0x1a,0x16,0x2f,0xe0,0x1a,0x16,0xb3,0xf0,0x1a,0x13,0xa5, +0xe0,0x1a,0x13,0x27,0xf0,0x0, 0x89,0x88,0xf0,0x0, 0x8a,0x9, 0xf0,0x0, 0x8a,0x8a, +0xf0,0x17,0x3b,0x9f,0x3b,0x1f,0x39,0x1f,0x38,0x9f,0x3d,0x9f,0x3e,0x1f,0x3e,0x9f, +0xe0,0x1a,0x14,0x2b,0xe0,0x1a,0x14,0xad,0xe0,0x1a,0x15,0x31,0xf8,0x0, 0x8b,0x7, +0x89,0x2, 0xf0,0x0, 0x8b,0x86,0x88,0x81,0x8d,0x8b,0x8e,0xc, 0x8e,0x8d,0x3c,0x1f, +0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x13,0x1a,0xf0,0x1a,0x10,0x1c,0xf0,0x1a,0x10,0xe4, +0xf0,0x1a,0x11,0x1d,0x8c,0x8, 0x8c,0x89,0x8d,0xa, 0x3b,0x1f,0xf0,0x10,0x38,0x1f, +0xf0,0x11,0x38,0x9f,0xf0,0x12,0x39,0x1f,0x32,0xa8,0x32,0x28,0x31,0xa8,0xe0,0x1, +0x1f,0x2d,0x83,0x6, 0xf8,0x0, 0x80,0x0, 0xf8,0x0, 0x88,0x81,0xf8,0x0, 0x81,0x2, +0x31,0x28,0x30,0xa8,0x3d,0xc5,0xf0,0x13,0x31,0xa8,0xf0,0x14,0x32,0x28,0x3e,0x44, +0xf0,0x15,0x32,0xa8,0x3e,0xc3,0xf0,0x16,0x3b,0x42,0xf0,0x17,0x3b,0xc1,0xe0,0x41, +0x3d,0xcb,0xe0,0x41,0x3e,0x4c,0xe0,0x41,0x3e,0xcd,0xe8,0x8, 0x3c,0x43,0xe8,0x9, +0x3c,0xc4,0xe8,0xa, 0x3d,0x45,0xe0,0x1a,0x12,0x1e,0xe0,0x1a,0x11,0xb4,0x3a,0x1f, +0x39,0x9f,0xb6,0x6e,0xe0,0x1a,0x11,0x1f,0xe0,0x1, 0xb6,0x8e,0x39,0x1f,0xab,0xe, +0xe0,0x1a,0xc7,0xb5,0xf0,0x0, 0xa8,0x1e,0x10,0x80,0xf0,0x0, 0xb3,0x1e,0xf0,0x0, +0xb3,0xae,0xb5,0xbe,0xb4,0x4e,0xb4,0xde,0xb5,0x7e,0xf0,0x2, 0xa8,0xce,0xf0,0x2, +0xa9,0x5e,0x8d,0x84,0x8e,0x3, 0x8e,0x82,0x8f,0x8f,0x35,0xa8,0x36,0x28,0x3e,0xcb, +0x3f,0xcc,0xe0,0x1, 0xb6,0xbe,0xe0,0x1, 0xb7,0x9e,0xe0,0x3, 0xa8,0x8e,0xe0,0x3, +0xa8,0x9e,0xb, 0x61,0x8, 0xb1,0xe0,0x0, 0x1c,0xe, 0xe0,0x3, 0x15,0x40,0x14,0x80, +0xe0,0x5, 0xdd,0x24,0xe0,0x1, 0x1f,0x97,0xe0,0x0, 0x1c,0x9, 0x8d,0xf, 0xe0,0x1, +0x14,0xff,0xe4,0x0, 0xc5,0xa, 0x8, 0xa1,0xe0,0xba,0x0, 0x98,0x8, 0xb2,0xe0,0x1, +0x1f,0x9c,0xe0,0x2, 0x1c,0x21,0x89,0xf, 0xe0,0x1, 0x14,0xff,0xe4,0x0, 0xc1,0xa, +0x3d,0x62,0xe0,0x5, 0xdd,0xb, 0xe0,0x2, 0x1c,0x1d,0x3d,0x62,0xe0,0x1, 0x14,0xff, +0xe0,0x5, 0xdd,0x4, 0xe0,0x2, 0x1c,0x1c,0x3d,0x62,0xe0,0x1, 0x14,0xff,0xe0,0x5, +0xdc,0xfd,0xe0,0x2, 0x1c,0x1b,0xe0,0x3, 0xd3,0xa3,0xe0,0x2, 0x1e,0xa0,0x17,0x0, +0x3f,0xed,0xe1,0x80,0xb7,0x1f,0xc7,0x82,0xb7,0x1d,0xe1,0x80,0xb7,0x1f,0xe1,0x80, +0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80, +0xb7,0x1f,0xb7,0xf, 0x9, 0x61,0xe0,0x1, 0x1f,0xa3,0xe0,0x2, 0x1e,0xc3,0xe0,0x1b, +0x16,0x61,0x3e,0x1f,0x97,0x5d,0xe0,0x1b,0x15,0x5d,0xe0,0x1b,0x15,0xdf,0x8c,0x8c, +0x3d,0x1f,0x3d,0x9f,0xf7,0xef,0x13,0x7f,0xe0,0x1b,0x16,0x62,0xf0,0x0, 0x8b,0x8a, +0x8c,0xb, 0x3e,0x1f,0xe8,0xe, 0x3f,0x56,0xe0,0x1b,0x15,0x5e,0xe0,0x1b,0x15,0xe0, +0xf0,0x1b,0x13,0x63,0x8e,0xc, 0xf0,0x16,0x3b,0x1f,0x3d,0x1f,0x3d,0x9f,0xf7,0xf7, +0x12,0xff,0xe0,0x1b,0xc7,0xe4,0x8d,0xa, 0x8d,0x8b,0xe8,0xe, 0x3f,0x55,0x34,0xa8, +0xf8,0x0, 0x82,0x86,0xf0,0x0, 0x83,0xf, 0xe7,0xfe,0x17,0xff,0x3f,0xde,0xf0,0x17, +0x33,0xa8,0xe0,0xe, 0x3e,0x49,0x34,0x28,0xe7,0xff,0x16,0x3f,0xe8,0xa, 0x3d,0x47, +0x3d,0xc8,0x3f,0xdc,0xb5,0x1d,0xb5,0xad,0xb7,0x3d,0xf0,0x1, 0xaa,0x8d,0xf0,0x1, +0xab,0x1d,0xb7,0xdd,0x38,0x82,0x8, 0xb1,0xe0,0x1, 0x1f,0x23,0xe0,0x1a,0x16,0x9, +0xe0,0x1a,0x16,0x8e,0x3e,0x1e,0x3e,0x9e,0xe0,0x2, 0x1f,0xed,0xf0,0x0, 0x80,0x2c, +0xf0,0x0, 0x80,0xbc,0xf0,0x0, 0x81,0x4c,0xf0,0x0, 0x81,0x8d,0xe0,0x1a,0xc7,0x13, +0x85,0x9c,0xf0,0x0, 0x82,0x1d,0xf0,0x0, 0x82,0xad,0xf0,0x0, 0x83,0x3d,0xf0,0x0, +0x83,0xcd,0x16,0x85,0x3e,0x9f,0xf0,0x0, 0xa9,0xdf,0xf0,0x0, 0xa9,0x4f,0x84,0xe, +0xf0,0x0, 0xa8,0xbf,0xf0,0x0, 0xa8,0x2f,0xf0,0x0, 0xab,0xcd,0xf0,0x0, 0xab,0x3d, +0x80,0x8c,0x84,0x9e,0x85,0x2e,0x86,0x4e,0xf0,0x0, 0xaa,0xad,0xad,0x9f,0xf0,0x0, +0xaa,0x1d,0x85,0xbe,0x17,0xa, 0x3f,0x1f,0xe0,0x1, 0xac,0x2f,0xa8,0x8f,0xac,0x9e, +0xad,0x2e,0xad,0xbe,0xae,0x4e,0x8, 0xe1,0x8, 0xb4,0xdc,0xc6,0xdd,0xa0,0xde,0x3, +0xe0,0x1, 0x1f,0xa3,0xe0,0x1a,0x15,0x89,0x3d,0x9f,0xe0,0x2, 0x1f,0x6d,0x82,0xb, +0xe0,0x1b,0x15,0x5d,0x3d,0x1f,0xe0,0x1a,0x16,0xe, 0x8c,0x8a,0x3e,0x1f,0x84,0x1b, +0xaa,0xe, 0xe0,0x1a,0x16,0x93,0x82,0x3b,0xf0,0x0, 0x82,0xab,0xf0,0x0, 0x83,0x4b, +0xf0,0x0, 0x83,0x8c,0xe0,0x1b,0x15,0x5e,0x80,0xcc,0x3e,0x9f,0xaa,0x3e,0x3d,0x1f, +0x81,0x9c,0x81,0x3c,0xac,0x1e,0x15,0x85,0x84,0x2c,0x8d,0xa, 0xf0,0x0, 0x80,0xd, +0x3d,0x9e,0xf0,0x0, 0xab,0xde,0x16,0xa, 0xf0,0x0, 0xab,0x4e,0x3e,0x1e,0xf0,0x0, +0xaa,0xae,0x34,0xa8,0xa8,0xcb,0x3d,0x49,0xf0,0x0, 0x80,0x9d,0xf0,0x0, 0x81,0x2d, +0xf0,0x0, 0x81,0xbd,0xf0,0x0, 0x82,0x4d,0xa9,0x3b,0xf0,0x1b,0x12,0xe1,0xac,0x2b, +0xf0,0x15,0x3a,0x9f,0xa9,0x9b,0xf0,0x1b,0x13,0xe2,0xe0,0x2, 0x1e,0xc3,0xf0,0x1, +0xa8,0x2e,0xf0,0x17,0x3b,0x9f,0xf0,0x0, 0xa8,0x9c,0xe0,0x1b,0x14,0xdf,0xf0,0x0, +0xa9,0x2c,0xf0,0x1b,0x13,0x60,0xf0,0x0, 0xa9,0xbc,0xe0,0x1b,0x14,0x63,0xf0,0x0, +0xaa,0x4c,0xe7,0xef,0x16,0x7f,0xb5,0x1d,0xf0,0x16,0x3b,0x1f,0x97,0x5d,0xe8,0x0, +0x8d,0x5, 0x3c,0x1f,0x3c,0x9f,0x3f,0x5c,0xe0,0x1b,0xc7,0xe4,0xe8,0x0, 0x8e,0x7, +0xf7,0xf7,0x13,0xff,0x8c,0x89,0x35,0x28,0xe8,0xe, 0x3f,0x57,0xf0,0x0, 0x83,0x88, +0x84,0xf, 0xe7,0xfe,0x17,0xff,0xe8,0x0, 0x8d,0x86,0x3f,0xde,0xe0,0xe, 0x3e,0x4a, +0xe7,0xff,0x16,0x3f,0x34,0xa8,0x3f,0xdc,0x3d,0xc9,0xb7,0xdd,0xb5,0xad,0xb7,0x3d, +0xf0,0x1, 0xab,0x8d,0xe0,0x1, 0xac,0x1d,0xef,0xff,0xd6,0xf4,0xdd,0xf6,0xde,0xa3, +0xde,0xb6,0xa, 0x21,0xe7,0xea,0x0, 0xea,0xe0,0x1, 0x1f,0x96,0x8f,0xf, 0xe0,0x1, +0x1f,0x95,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xe2,0x1, 0xcf,0xdf,0x3c,0x6f,0x2, 0x83, +0xe0,0x1, 0x14,0x60,0x34,0x45,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x8, 0xb7,0xe0,0x0, +0x1a,0xb, 0x8b,0x4, 0xe0,0x0, 0x23,0x44,0x13,0x0, 0xe0,0x0, 0x1a,0x8e,0xe0,0x2, +0x1b,0xa1,0x39,0x66,0x0, 0x87,0xc1,0x1, 0x8f,0x84,0xe2,0x1, 0xc1,0x7f,0x3f,0xf2, +0x5, 0xaf,0x3c,0x62,0xe0,0x1, 0xd8,0xab,0xe0,0xf, 0x31,0x21,0x3f,0x95,0x39,0xe8, +0x8c,0xf, 0xe0,0x1, 0xd8,0xb6,0xe0,0x43,0x3c,0x18,0x39,0xf8,0x4, 0x6d,0x3c,0x62, +0xe0,0x1, 0xd8,0x76,0x24,0x69,0x17,0x8a,0x3f,0xb2,0x17,0xa, 0xe0,0x0, 0xc7,0xfc, +0x3f,0x95,0x3f,0x36,0x94,0x8f,0x95,0x1f,0x95,0xaf,0x96,0x3f,0x96,0xcf,0xe0,0xf, +0x3f,0x17,0xb4,0x8f,0xc1,0x1, 0xb5,0x1f,0xe2,0x1, 0xc1,0x7f,0xb5,0xaf,0xc3,0x1, +0xb6,0x3f,0xe2,0x1, 0xc3,0x7f,0xb6,0xcf,0x8f,0x84,0x3f,0xf2,0x2, 0xd3,0xe0,0x0, +0x1f,0xc, 0xaf,0x8e,0xe0,0x2, 0x1f,0xa0,0xab,0xf, 0xb, 0xe1,0x3f,0xe6,0x0, 0xf8, +0xe7,0xff,0x0, 0xb6,0x8, 0xb4,0xe0,0x1, 0x1e,0xa3,0xe0,0x1, 0x1e,0x51,0xf0,0xe, +0x8b,0xad,0xa6,0xc, 0xe8,0xe, 0x3d,0x37,0xf0,0xf, 0x3b,0xb8,0x3f,0x1b,0x3f,0x99, +0x37,0x21,0x37,0xa1,0x3f,0x1c,0x3f,0x9c,0x97,0xe, 0x97,0x8f,0xe0,0x1, 0x37,0x1, +0x3f,0x7f,0x37,0x81,0xe0,0x6f,0x3d,0x21,0xe2,0x3, 0xcf,0xf4,0xf0,0x3, 0x13,0x74, +0x2, 0x3, 0xf0,0x40,0x3b,0x6f,0xe0,0x11,0x3d,0xa9,0xf8,0x43,0x38,0x91,0xf2,0x0, +0xc8,0x80,0xf0,0x0, 0x10,0x4, 0x10,0xfc,0xe1,0x32,0x3d,0xa9,0xe1,0x33,0x3d,0x28, +0xe0,0xf, 0x3d,0xa9,0xe0,0xe, 0x89,0x1d,0xf8,0x41,0x39,0x42,0xf8,0x41,0x39,0xc3, +0xe8,0x2f,0x3f,0x90,0xe8,0x31,0x38,0x91,0xf0,0x40,0x3a,0x69,0xf8,0x43,0x3b,0x16, +0xf0,0x0, 0xc9,0x1, 0xf0,0x0, 0xc9,0x81,0xf0,0x40,0x3a,0xe8,0xe0,0x71,0x3a,0x2f, +0xc1,0x7f,0x11,0x80,0x0, 0x90,0xe8,0xa, 0x3d,0x13,0xe2,0x1, 0xc5,0x7f,0xe8,0xe, +0x3d,0x37,0x3f,0xeb,0x3f,0x1b,0x37,0x21,0x3f,0x1c,0x96,0x8e,0xe8,0x40,0x3e,0xf6, +0x4, 0x2a,0x3d,0xef,0xe8,0xe, 0x3d,0x25,0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x0, +0xe8,0xf, 0x3d,0xa4,0xe0,0x43,0x3f,0x9f,0xe0,0x41,0x3f,0x4e,0xe0,0xd, 0x3d,0x28, +0xe0,0x6d,0x3d,0x2e,0xe2,0x0, 0xcf,0x80,0xe0,0xe, 0x3d,0xa9,0xe0,0x41,0x3f,0xcf, +0xe0,0x6e,0x3d,0x2f,0x3e,0xfe,0x1, 0x39,0x2, 0x57,0xe8,0xf, 0x3d,0x92,0xe8,0xe, +0x3d,0x37,0xe2,0x1, 0xc7,0xff,0x3f,0x1f,0x37,0x21,0x3f,0x1c,0x96,0x8e,0xe8,0x40, +0x3e,0xf6,0x3, 0x58,0xf0,0x0, 0x20,0xe5,0xe8,0xe, 0x3d,0x25,0xe0,0x43,0x3f,0x1e, +0xe2,0x0, 0xcf,0x0, 0xe0,0xd, 0x3d,0x28,0xf0,0x2d,0x38,0x2d,0xe0,0x2e,0x3f,0x21, +0xe1,0x2f,0x3d,0x8f,0xe0,0x6d,0x3d,0x2e,0xe0,0x0, 0x27,0xd3,0xe0,0x0, 0x26,0xd1, +0xe0,0x0, 0x2d,0x51,0xe2,0x0, 0xc9,0x0, 0x3f,0x63,0x5, 0x30,0x17,0x81,0x3f,0x9a, +0xe8,0xf, 0x3f,0xb7,0x3f,0x9b,0x37,0xa1,0x3f,0x9c,0x96,0x8f,0x3f,0x7d,0x5, 0x25, +0xc5,0x7f,0xe2,0x1, 0xc5,0x7f,0x0, 0xa5,0x3d,0x78,0xe0,0x0, 0x1, 0x4a,0xf0,0x4, +0x39,0x9a,0xe8,0xd, 0x3a,0x37,0xf0,0xe, 0x3b,0xba,0xf0,0xf, 0x39,0x1b,0x3e,0x9b, +0x3f,0x1f,0x36,0xa1,0x37,0x21,0x3e,0x9c,0x3f,0x1c,0x96,0x8d,0x97,0xe, 0x3e,0xfe, +0x3, 0x6, 0xe2,0x1, 0xc7,0xff,0x3e,0xee,0xe7,0xff,0x0, 0x92,0x3d,0x64,0xe2,0x1, +0xc5,0x7f,0x3f,0xeb,0xe7,0xff,0x0, 0x8c,0x3f,0x6d,0xc5,0x1, 0xe2,0x1, 0xc5,0x7f, +0xe1,0x33,0x3d,0x28,0xe8,0x40,0x3f,0x76,0xf8,0x41,0x39,0xc3,0xf0,0x0, 0xc9,0x81, +0x4, 0xf, 0xe8,0xb, 0x3d,0x92,0xe8,0xf, 0x3d,0x37,0xe2,0x1, 0xc5,0xff,0x3f,0x9b, +0x37,0xa1,0x3f,0x9c,0x97,0x8f,0xe8,0x40,0x3f,0xf6,0xe7,0xfe,0x3, 0x75,0x14,0x0, +0xa, 0x61,0x17,0xff,0x3f,0x9a,0xe8,0xf, 0x3f,0xb7,0x3d,0x72,0x3f,0x9b,0x37,0xa1, +0x3f,0x9c,0x3e,0xe3,0x97,0xf, 0xe7,0xff,0x3, 0x33,0xe7,0xff,0x0, 0xa9,0x14,0x1, +0xa, 0x61,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x2, 0x1f,0xa1,0xe4,0x0, +0xc4,0xa, 0x11,0x7c,0xe0,0xe, 0x3f,0x98,0xe0,0x1, 0x8e,0xe, 0x3b,0xe9,0x39,0x1c, +0xe0,0x43,0x39,0x2, 0xe2,0x0, 0xc9,0x0, 0x3b,0x6a,0x8a,0xfe,0xe0,0x3, 0x4, 0x67, +0x12,0x4, 0x3a,0x1c,0xe0,0x43,0x3a,0x4, 0x3e,0xe4,0xe0,0x1, 0x1f,0x23,0xf0,0xe, +0x8c,0xce,0xf0,0x40,0x3c,0xfd,0xe0,0x2, 0x2, 0x7a,0xe0,0x2, 0x1e,0x85,0x12,0x7f, +0x11,0x77,0xe0,0x1, 0x8e,0xcd,0xe8,0x4, 0x3a,0x19,0xe8,0x2, 0x39,0x19,0xe0,0x43, +0x3a,0x4, 0xe0,0x43,0x39,0x2, 0xe0,0x2, 0x26,0xc9,0xf0,0xe, 0x8e,0x1e,0x11,0x81, +0xe2,0x0, 0xca,0x82,0xe0,0x3, 0x5, 0xac,0x17,0xfd,0xe8,0xf, 0x3f,0x9c,0x3a,0xff, +0xf0,0x0, 0x14,0x1, 0xe0,0x3, 0x4, 0x4f,0xe8,0x40,0x3f,0xe8,0xf0,0x0, 0x10,0x0, +0xe4,0x0, 0xcf,0x81,0xe9,0x30,0x3b,0x0, 0xf0,0x1d,0x38,0x5f,0xf0,0x2, 0x2e,0xe1, +0xe2,0x0, 0xca,0x83,0xe0,0x3, 0x5, 0x9a,0x17,0xfc,0xe8,0xf, 0x3f,0x9c,0x3a,0xff, +0x3d,0x65,0xe0,0x2, 0x3, 0x79,0xe8,0x40,0x3e,0x79,0xe0,0x79,0x3d,0xac,0xe8,0x40, +0x3c,0x69,0xe2,0x1, 0xc4,0x7f,0xf1,0xff,0xc6,0x7f,0x17,0xff,0x3f,0x95,0xe8,0x40, +0x3a,0xfc,0xe2,0x1, 0xc7,0xff,0xf0,0x0, 0x13,0x80,0xe0,0x77,0x39,0x2f,0xe0,0x2, +0x1f,0xbf,0x3a,0x72,0xf0,0x0, 0x8a,0x5f,0xe0,0x3, 0x4, 0x3e,0xf0,0x0, 0x13,0x0, +0xe0,0x1, 0x1f,0xd1,0xe8,0x40,0x3c,0xe6,0xa5,0x8f,0xe8,0xa, 0x3d,0x34,0xf8,0x17, +0x3b,0xb4,0xf0,0x2, 0x19,0x5, 0xe8,0x36,0x3b,0x6, 0x3e,0x69,0x3f,0xe9,0x38,0xe9, +0xf0,0x2, 0x12,0xac,0xf0,0x0, 0x11,0xe4,0xf0,0x0, 0x10,0x93,0x0, 0x98,0xf0,0x0, +0x23,0x36,0xe8,0x1, 0x8f,0x42,0x27,0xb, 0xe0,0xe, 0x37,0xa1,0x38,0xfe,0x2, 0x7, +0xe8,0x2d,0x3e,0x93,0x26,0xb1,0xf0,0x2e,0x38,0xaf,0x27,0x2e,0xc1,0x1, 0xe0,0x43, +0x39,0x2, 0x3a,0x72,0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0x4, 0x35,0xe0,0xd, 0x39,0x1a, +0x36,0xa1,0x3e,0x9b,0xf0,0x0, 0x9c,0x8d,0xe8,0xd, 0x39,0x17,0x36,0xa1,0x17,0x44, +0x3e,0x9b,0xe8,0xe, 0x3f,0x19,0xf0,0x0, 0x95,0xd, 0xe3,0xff,0xc7,0x7f,0xe0,0x43, +0x3e,0x9e,0xc7,0xc4,0xe8,0xf, 0x3f,0x9a,0x3f,0x11,0xe8,0x3a,0x3e,0x95,0xe0,0x43, +0x38,0x9e,0xe0,0x43,0x3f,0x9f,0xf7,0xff,0x2d,0x4c,0xe2,0x1, 0xce,0x8c,0x2, 0x4d, +0xe8,0x2d,0x3e,0x93,0x2e,0xd1,0xf1,0xff,0xc4,0x87,0x17,0x1, 0x3f,0x19,0xf2,0x0, +0xcc,0xce,0xc1,0x1, 0xe2,0x1, 0xc7,0x7f,0xe0,0x43,0x39,0x2, 0xe0,0x69,0x3d,0xae, +0x3a,0x72,0x3, 0x4d,0xe2,0x0, 0xcf,0x80,0xe0,0x4, 0x30,0x81,0x39,0x6c,0x3f,0x6f, +0xe0,0x2, 0x4, 0x4f,0xe0,0x43,0x3f,0x1e,0xe0,0xf, 0x30,0x82,0xe0,0x2f,0x3f,0x9e, +0xf0,0x16,0x3b,0x5f,0xea,0x11,0x7f,0xec,0x3d,0x18,0x35,0x21,0x3f,0x97,0x3d,0x1b, +0x8e,0x8f,0x95,0xa, 0x36,0xa2,0x3e,0xfa,0x3, 0xc, 0xe2,0x7, 0xcd,0x7f,0xe0,0x2, +0x5, 0x27,0x16,0xff,0xae,0x8f,0xea,0x11,0x7f,0xf8,0x3f,0x97,0x3c,0x9c,0xac,0x8f, +0xe2,0x0, 0xce,0x5, 0x5, 0x8c,0xe2,0x0, 0xce,0x6, 0xe0,0x2, 0x1, 0x41,0xe2,0x0, +0xce,0x7, 0xe0,0x2, 0x1, 0x38,0xc1,0x83,0xe2,0x1, 0xc1,0xff,0xf0,0x0, 0x23,0xc, +0xe0,0xd, 0x38,0x9e,0x17,0x81,0x3f,0x93,0xe2,0x12,0xce,0xe1,0xe2,0x1, 0xc7,0xff, +0xe0,0x63,0x3b,0x2f,0x3a,0x7e,0x5, 0xa, 0x3f,0x11,0x17,0x81,0x3f,0x93,0xe2,0x2e, +0xcf,0x71,0xe2,0x1, 0xc7,0xff,0xe0,0x63,0x3b,0x2f,0xc3,0x3, 0x17,0x81,0x3f,0x93, +0x3b,0x72,0xe2,0x1, 0xc7,0xff,0xe0,0x63,0x3c,0x2f,0xe2,0x0, 0xce,0x0, 0x17,0x80, +0xe0,0x6f,0x39,0xa3,0x39,0xef,0xf0,0x0, 0x24,0x2f,0xe0,0x1, 0x22,0xe6,0x17,0xfb, +0x3f,0x95,0xe0,0x43,0x3d,0x5, 0xe0,0x43,0x3a,0x8f,0x3d,0x75,0x5, 0x24,0x17,0x0, +0xe8,0xf, 0x3a,0xb4,0x16,0x81,0x3f,0x98,0x37,0xa1,0x3f,0x9b,0x97,0x8f,0x3e,0x9e, +0xe2,0x4, 0xcf,0xd9,0xc2,0x81,0x3f,0xed,0xe2,0x1, 0xc7,0xff,0xe0,0x43,0x3a,0x85, +0xe0,0x6e,0x3b,0x2f,0x3d,0x75,0x2, 0x6d,0x17,0x82,0xe1,0x2e,0x3f,0x1f,0x27,0xb, +0xe1,0x2c,0x3e,0x1f,0x17,0x81,0x3f,0x93,0xe2,0x0, 0xce,0x0, 0xe2,0x1, 0xc7,0xff, +0xe0,0x63,0x39,0xaf,0xea,0x12,0x7f,0x84,0xe0,0xe, 0x3f,0x97,0xf0,0x0, 0x28,0x2f, +0x8e,0x8e,0x3e,0xf3,0x4, 0xab,0x29,0xac,0x3b,0x9f,0x8f,0x87,0x11,0x83,0xe1,0x23, +0x3f,0x93,0xe2,0x0, 0xcf,0x85,0x17,0x82,0xe0,0x6f,0x3c,0xa3,0x39,0xef,0x3c,0x63, +0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x3f,0x98,0x9d,0x9f,0xf0,0xd, 0x34,0xa6, +0xe1,0xff,0xc6,0xb1,0x3e,0xfb,0x9f,0x8f,0xf0,0xe, 0x8e,0x1e,0xe0,0x1, 0x2, 0x1c, +0xe2,0x0, 0xcf,0xaf,0x5, 0x88,0xf0,0xe, 0x36,0x26,0xc7,0x51,0x3f,0x7f,0x11,0x81, +0xe7,0xfd,0x2, 0x28,0x11,0x83,0xe7,0xfd,0x0, 0xa5,0xa9,0x8e,0x21,0xd6,0xe2,0x0, +0xc9,0x81,0x1, 0xde,0x3f,0x97,0x8f,0x8f,0x0, 0xd5,0xe2,0x0, 0xca,0x82,0xe0,0x0, +0x2, 0xe7,0xf0,0x0, 0x10,0x0, 0x17,0x81,0xe9,0x30,0x3b,0x0, 0xf0,0x1d,0x38,0x5f, +0xf0,0xe, 0x8e,0x1e,0xf0,0x0, 0x14,0x0, 0x39,0xef,0xf7,0xfd,0x26,0xa3,0xfa,0x11, +0x7d,0x60,0xfa,0x10,0x7d,0x98,0xf0,0x0, 0x17,0xa, 0xf8,0x1e,0x3f,0x1a,0x0, 0x87, +0xf8,0x40,0x3f,0x7a,0xf0,0x0, 0xc5,0x8a,0xe0,0x0, 0x1, 0x5b,0xe9,0x80,0x8f,0x9a, +0xe2,0x0, 0xcf,0x82,0x1, 0xf6,0xe8,0x1, 0x8d,0x8b,0xe8,0x0, 0x8d,0x7b,0x3c,0xec, +0x3c,0x65,0x7e,0x1, 0xdd,0x40,0x66,0x1, 0x24,0x6c,0xf8,0x40,0x38,0x6d,0x11,0x83, +0xe7,0xfd,0x0, 0x80,0xe8,0x40,0x3e,0x79,0x12,0xff,0xe8,0x5, 0x3a,0x9c,0xe0,0x79, +0x3d,0xac,0xe2,0x1, 0xc2,0xff,0xe8,0x40,0x3c,0x69,0x3d,0x65,0xe2,0x1, 0xc4,0x7f, +0xf0,0x0, 0x13,0x81,0xe7,0xfd,0x22,0x8d,0xe7,0xfc,0x0, 0xff,0xf0,0x0, 0x10,0x0, +0xe9,0x30,0x3b,0x0, 0xf0,0x0, 0x14,0x1, 0xf2,0x0, 0xce,0x4, 0x5, 0x64,0xe8,0x40, +0x3e,0x79,0x15,0x0, 0xe0,0x79,0x3d,0xac,0xe8,0x40,0x3c,0x69,0xe2,0x1, 0xc4,0x7f, +0x3a,0xea,0xf0,0x0, 0x13,0x81,0xe7,0xfc,0x0, 0xf4,0xe0,0x2, 0x1f,0x5, 0x16,0x88, +0xe0,0x1, 0x87,0x4e,0x3a,0x6d,0x11,0x0, 0xe7,0xfc,0x0, 0x99,0xf0,0xe, 0x8e,0x1e, +0x17,0xfd,0xe8,0xf, 0x3f,0x9c,0x3a,0xff,0xf0,0x0, 0x14,0x0, 0x11,0x81,0xe7,0xfc, +0x3, 0x35,0x11,0x80,0x3c,0x63,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf8,0x40, +0x38,0x6d,0xe7,0xfc,0x0, 0xb7,0x15,0x5, 0xe7,0xfe,0x0, 0xa3,0x35,0x2, 0xad,0xf, +0xe7,0xfd,0x0, 0xdb,0xe2,0x0, 0xcf,0xb6,0x5, 0x88,0xf0,0xe, 0x36,0x26,0xc7,0x51, +0x3f,0x7f,0x11,0x81,0xe7,0xfc,0x2, 0xe, 0x11,0x82,0xe7,0xfc,0x0, 0x8b,0x17,0x0, +0xe7,0xfd,0x0, 0xb2,0xe0,0x1, 0x1f,0xd1,0x17,0x0, 0xa5,0x8f,0xe8,0xa, 0x3d,0x34, +0xf0,0x40,0x3b,0x6e,0x39,0x6e,0x3a,0x6e,0x3c,0xee,0x3e,0x6e,0x38,0xee,0xe7,0xfd, +0x0, 0xab,0xc1,0x82,0xe2,0x1, 0xc1,0xff,0xe7,0xfd,0x0, 0xca,0xc1,0x81,0xe2,0x1, +0xc1,0xff,0xe7,0xfd,0x0, 0xc5,0xe7,0xf9,0x0, 0xbf,0x15,0x1, 0xe7,0xfb,0x0, 0xb3, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x48,0xe0,0x2, 0x1e,0xa0,0xe0,0x0, 0x1b,0x2a, +0x17,0x0, 0x8f,0x8d,0xaf,0x6, 0x2f,0x98,0xea,0xf, 0x7f,0xfa,0x8f,0xf, 0xe0,0x6, +0x2f,0x44,0xfa,0x10,0x7c,0xfc,0xe0,0x2, 0x1a,0x21,0xfa,0x10,0x7d,0x18,0xfa,0x11, +0x7e,0xf8,0xfa,0x11,0x7e,0x6c,0xea,0x11,0x7b,0xe0,0xfa,0x10,0x7c,0xc, 0xfa,0x12, +0x7d,0x84,0xe0,0x1, 0x0, 0xda,0xe0,0x2, 0x1a,0x21,0xfa,0x11,0x7e,0x6c,0xea,0x11, +0x7b,0xe0,0xea,0x10,0x7f,0x80,0x11,0x80,0xea,0xf, 0x7f,0x78,0xfa,0x10,0x7c,0xfc, +0xfa,0x10,0x7d,0x18,0xfa,0x11,0x7e,0xf8,0xfa,0x10,0x7c,0xc, 0xfa,0x12,0x7d,0x84, +0xf0,0x40,0x3f,0x67,0x12,0x8c,0x3b,0xe4,0x7f,0x8d,0x3a,0x63,0xf0,0x0, 0x7e,0xe, +0x0, 0x91,0xe2,0x0, 0xc9,0x82,0xe0,0x3, 0x1, 0x6f,0xc2,0x1, 0xe2,0x1, 0xc2,0x7f, +0xc2,0xff,0xe2,0x1, 0xc2,0xff,0xe0,0x1, 0x22,0xab,0x8f,0x8d,0x3f,0xf4,0xe0,0x1, +0x5, 0xa7,0xf0,0x0, 0x16,0xa, 0xf0,0x1c,0x3e,0x34,0x8e,0xe, 0xe8,0xf, 0x3b,0x9c, +0x81,0x4f,0xe2,0x0, 0xc1,0xf, 0xe0,0x6, 0x31,0x23,0xe0,0xf, 0x3b,0x96,0xe0,0x2, +0xc7,0xac,0x89,0x8f,0x26,0x3, 0xc6,0x7f,0xae,0xe, 0xe2,0x0, 0xc9,0x9, 0x2, 0xde, +0x29,0xd9,0xe8,0xf, 0x3b,0x9c,0xf0,0x0, 0x91,0x8f,0xf0,0x0, 0x92,0x1f,0xf0,0x0, +0x92,0xaf,0x90,0xbf,0x95,0xcf,0x17,0x8a,0x3f,0xb2,0xf0,0x0, 0x60,0xd, 0xf0,0x0, +0x61,0xe, 0xf0,0xc, 0x3c,0x9f,0xf0,0x10,0x38,0x12,0xe8,0xf, 0x3f,0x9a,0xf0,0x11, +0x3e,0x92,0xf0,0x12,0x39,0x12,0xf0,0x0, 0xb1,0x8f,0x15,0x1, 0xf0,0x0, 0xb2,0x1f, +0x3c,0xe2,0xf0,0x0, 0xb2,0xaf,0x3c,0x64,0xb0,0xbf,0xb5,0xcf,0xf0,0x0, 0xb1,0x8c, +0xf0,0x0, 0xb2,0x1c,0xf0,0x0, 0xb2,0xac,0xb0,0xbc,0xb5,0xcc,0xe8,0x0, 0xa9,0x80, +0xe8,0x0, 0xa9,0x81,0xe8,0x0, 0xa9,0x82,0x7e,0x81,0x7f,0x2, 0x7f,0x83,0xdd,0x12, +0x66,0x81,0x67,0x2, 0x67,0x83,0x2c,0x11,0x9f,0x8f,0xf0,0xc, 0x3f,0x12,0xe2,0x0, +0xcf,0xa5,0xa9,0x8c,0x5, 0x8a,0xe0,0x1, 0x1c,0xa3,0xe0,0xe, 0x8e,0x19,0x36,0x26, +0xc6,0x5b,0x3e,0x7f,0xe0,0x5, 0x2, 0x53,0x85,0x8d,0xf0,0xf, 0x3f,0x12,0x16,0x2, +0xc5,0xff,0xae,0xf, 0xe2,0x1, 0xc5,0xff,0x16,0xa, 0x3e,0x3b,0xe0,0x0, 0x1c,0xaa, +0x3e,0x17,0xf0,0x0, 0x92,0x2c,0xf0,0x0, 0x91,0xc, 0xf0,0x0, 0x91,0x9c,0xf0,0x0, +0x92,0xbc,0x91,0xcc,0xe8,0x16,0x3b,0x9c,0x85,0x9, 0xf0,0x0, 0x63,0x8d,0x14,0x80, +0xe0,0xf, 0x3b,0x96,0xf0,0x1, 0x3c,0x12,0xf0,0x8, 0x3d,0x92,0xf8,0x0, 0xb1,0x6, +0xe8,0x2, 0x39,0x17,0xf8,0x0, 0xb1,0x96,0xe0,0x2, 0xc7,0xac,0xf8,0x0, 0xb2,0x26, +0xc5,0x1, 0xf8,0x0, 0xb2,0xb6,0xc2,0xff,0xe8,0x0, 0xb1,0xc6,0xe2,0x1, 0xc2,0xff, +0xad,0x8d,0x15,0xff,0xe0,0x0, 0x1b,0x2a,0xac,0x81,0xac,0x88,0x14,0x8f,0xad,0xcc, +0x16,0x3, 0xac,0x82,0xae,0xf, 0xad,0x6, 0xe7,0xfe,0x2a,0xd9,0xf0,0x0, 0x66,0xe, +0x3a,0x67,0xe8,0x40,0x3b,0xee,0x12,0x80,0xea,0xf, 0x7f,0x7b,0xf0,0x2, 0x1f,0x1b, +0xf0,0x2, 0x1b,0x1a,0xf0,0x2, 0x19,0x3f,0xf0,0x1, 0x19,0xd1,0xf0,0x1, 0x18,0x2d, +0xf0,0x1, 0x1a,0xa3,0x11,0x9, 0x3e,0x65,0xf0,0x0, 0x12,0x64,0xe0,0x40,0x3f,0xe5, +0xf0,0x0, 0x13,0x87,0xf0,0x0, 0x10,0xd0,0xe0,0xb, 0x31,0x23,0x3d,0x94,0xe0,0x2, +0xc5,0xac,0x8d,0x8b,0x39,0xe2,0xe2,0x0, 0xcd,0x83,0x1, 0x19,0x21,0x3f,0x14,0x7f, +0x3c,0x12,0xe2,0x1, 0xc4,0x7f,0xe0,0xb, 0x34,0x23,0xe0,0x2, 0xc5,0xac,0x3d,0x94, +0x15,0x0, 0x0, 0x83,0xc5,0xf8,0x21,0x32,0x8c,0x8b,0xc1,0x7f,0xe2,0x0, 0xcc,0x83, +0xe0,0x3, 0x3c,0x2a,0xe2,0x1, 0xc1,0x7f,0xc5,0x1, 0x1, 0xf5,0xe8,0x0, 0x8b,0xe, +0xe2,0x0, 0xcb,0x1, 0x1, 0x29,0xc2,0x81,0xe2,0x1, 0xc2,0xff,0xe2,0x0, 0xca,0x8a, +0xf0,0x0, 0xc5,0x81,0xf0,0x0, 0xc4,0x8a,0xf0,0x0, 0xc4,0x1, 0xf0,0x0, 0xc5,0xa, +0xc3,0x81,0xf0,0x0, 0xc7,0x8, 0xf0,0x0, 0xc6,0x81,0xf0,0x0, 0xc6,0x1, 0x1, 0xc5, +0xe0,0x0, 0x1e,0x2a,0x8f,0x8c,0xe0,0x4, 0x27,0x94,0x8e,0x8e,0x3e,0xff,0x3, 0x82, +0xaf,0x8e,0xc0,0x38,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe8,0x0, 0x8b,0xe, 0x39,0xec, +0xe2,0x0, 0xcb,0x1, 0x1, 0xd9,0x8d,0x87,0xe2,0x0, 0xcd,0x82,0x1, 0xd5,0xe8,0x0, +0x8d,0x86,0xab,0x7, 0x2d,0xd1,0x8d,0x8e,0xe2,0x0, 0xcd,0x81,0xe0,0x0, 0x5, 0xc4, +0xe8,0x0, 0x9c,0x19,0x7e,0x81,0x7f,0x2, 0x7f,0x83,0xf0,0x0, 0x78,0x8, 0xf0,0x0, +0x78,0x86,0xf0,0x0, 0x79,0xb, 0xf0,0x0, 0x79,0x8a,0xf0,0x0, 0x7a,0x9, 0xf0,0x0, +0x7a,0x84,0xf0,0x0, 0x7b,0xc, 0xf0,0x0, 0x7b,0x87,0x7e,0x5, 0xe0,0x5, 0xd3,0xda, +0x66,0x5, 0xe0,0x3, 0x1d,0x12,0x3d,0xec,0xe0,0x5, 0xd3,0x92,0xe2,0x0, 0xcc,0x0, +0x66,0x5, 0x66,0x81,0x67,0x2, 0x67,0x83,0xf0,0x0, 0x60,0x8, 0xf0,0x0, 0x60,0x86, +0xf0,0x0, 0x61,0xb, 0xf0,0x0, 0x61,0x8a,0xf0,0x0, 0x62,0x9, 0xf0,0x0, 0x62,0x84, +0xf0,0x0, 0x63,0xc, 0xf0,0x0, 0x63,0x87,0x5, 0xe, 0xe8,0x0, 0x9d,0x9, 0xe2,0x0, +0xcd,0x25,0xe7,0xff,0x5, 0x92,0xe8,0xe, 0x8d,0x95,0x35,0xa6,0xc5,0xda,0x3d,0x7b, +0xe7,0xff,0x2, 0xb, 0xe8,0x0, 0x8d,0x52,0xe8,0x0, 0x8d,0xfa,0xe8,0x1, 0x8c,0x8a, +0x3d,0xba,0xe8,0x0, 0xa5,0x3, 0x3d,0x99,0x35,0xa1,0x3d,0x1b,0xea,0xf, 0x7d,0xfa, +0x94,0x8a,0x8d,0xb, 0xe8,0x2b,0x3c,0x94,0xe1,0x2a,0x3d,0xc, 0x25,0x83,0xe7,0xfe, +0x2d,0x74,0xe8,0x0, 0x8d,0x8c,0xe2,0x1, 0xcd,0x9f,0xe0,0x3, 0x5, 0xa5,0xe8,0x0, +0x8d,0x88,0xc5,0xff,0xe2,0x1, 0xc5,0xff,0xe2,0x0, 0xcd,0x97,0xe7,0xfe,0x2, 0xe5, +0xe8,0x0, 0x95,0x90,0x3d,0xf9,0xe7,0xfe,0x5, 0x60,0x8d,0xd, 0xe0,0x5, 0x25,0x2f, +0xe0,0x2, 0x1b,0x5, 0xe0,0x1, 0x8d,0xc6,0x2d,0x95,0xe8,0x0, 0x9c,0x89,0xe2,0x0, +0xcc,0xbf,0x5, 0x87,0xe8,0xe, 0x8d,0x95,0xc5,0xff,0x35,0xa6,0x3c,0xfb,0x5, 0xa, +0xe8,0xe, 0x8d,0xc5,0xe8,0x0, 0x9c,0x99,0xc5,0xff,0x35,0xa6,0x3c,0xfb,0xe7,0xfe, +0x2, 0x44,0xe8,0x0, 0x8d,0x8b,0xe2,0x0, 0xcd,0x83,0xe7,0xfe,0x2, 0xbe,0xe2,0x0, +0xcd,0x9, 0xe7,0xfe,0x2, 0xba,0x15,0x8a,0x3d,0xba,0x13,0x1, 0x3b,0x1a,0xe8,0x0, +0x95,0x29,0x3d,0x94,0xe0,0x9, 0x31,0xa3,0x3c,0x94,0xb5,0x2b,0xe0,0x2, 0x15,0x2c, +0x3d,0x19,0xe0,0x2, 0xc4,0xad,0xe2,0x1, 0xc3,0x7f,0xe8,0x0, 0x90,0x89,0xe8,0x0, +0x94,0x19,0xe8,0x0, 0x91,0xb9,0xaf,0x89,0xe2,0x0, 0xcb,0xa, 0xe8,0x0, 0x94,0xc9, +0xaf,0x8a,0xb0,0x8b,0xb4,0x1b,0xb1,0xbb,0xb4,0xcb,0xa9,0x4b,0xab,0xd, 0xe0,0x5, +0x1, 0x8e,0xe8,0x0, 0xaf,0x88,0xe7,0xfe,0x21,0x25,0xc1,0x7f,0xe2,0x1, 0xc1,0x7f, +0xe7,0xfe,0x0, 0x8b,0xf0,0xf, 0x3f,0x12,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x1, 0x2e, +0x11,0x8a,0x39,0xb2,0xe8,0xf, 0x3b,0x9c,0xf0,0xc, 0x3d,0x13,0x9c,0x9f,0x9c,0xf, +0x9d,0x9c,0x9d,0xc, 0x7e,0x81,0x7f,0x2, 0xef,0xff,0xd5,0x36,0xe2,0x0, 0xcc,0x3c, +0xea,0xf, 0x7f,0xfa,0x66,0x81,0x67,0x2, 0xe0,0x3, 0x5, 0x9b,0x16,0xf, 0xae,0xf, +0xe8,0x16,0x3b,0x9c,0xe8,0x0, 0x94,0x86,0xe8,0x0, 0x95,0x16,0xe8,0x0, 0x95,0xa6, +0xe8,0x0, 0x96,0x36,0xe8,0x0, 0x97,0xc6,0xe8,0x3, 0x39,0x9a,0xb4,0x83,0xb5,0x13, +0xb5,0xa3,0xb6,0x33,0xb7,0xc3,0xe7,0xfb,0x0, 0xe2,0x11,0x8a,0xf0,0xb, 0x3c,0x12, +0xe8,0xf, 0x3b,0x9c,0x39,0xb2,0x8e,0xb, 0xf0,0x0, 0x92,0x8f,0x90,0x9f,0x94,0x2f, +0x94,0xbf,0x95,0x4f,0xe2,0x1, 0xce,0x7f,0xf0,0xf, 0x3d,0x13,0xf0,0x0, 0xb2,0x8f, +0xb0,0x9f,0xb4,0x2f,0xb4,0xbf,0xb5,0x4f,0x1, 0x3, 0xc6,0x1, 0xae,0xb, 0x15,0x0, +0x3c,0xe2,0x3c,0x64,0x7e,0x81,0x7f,0x2, 0xdb,0x2d,0xe0,0x1, 0x1d,0x23,0xf0,0xc, +0x3c,0x93,0xe0,0xe, 0x8f,0xca,0x96,0x1c,0x37,0xa6,0x3f,0xac,0xe0,0x43,0x3f,0x9f, +0xe2,0x1, 0xcf,0x94,0x16,0x30,0x66,0x81,0x67,0x2, 0x2, 0xe, 0xe0,0x2, 0x1e,0x5, +0xe0,0x1, 0x8d,0xcc,0x16,0x30,0x25,0x88,0xe0,0x1, 0x16,0x14,0x3e,0x2f,0xe4,0x0, +0xc6,0xf, 0x36,0x6, 0xc6,0x30,0xf0,0x2, 0x1b,0xbf,0xf0,0xa, 0x3c,0x93,0xe8,0x0, +0x8c,0xd7,0x8f,0xfa,0xe0,0x1, 0x8d,0x8a,0x3f,0xb9,0xe0,0x1, 0x1c,0xd1,0x3f,0x9b, +0xa5,0x89,0x37,0xa1,0x3f,0x9b,0x97,0x8f,0xe2,0x0, 0xcf,0xbb,0xe0,0x1, 0x5, 0x39, +0x17,0xff,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xe0,0x3, 0x2, 0xc2, +0x9d,0x8a,0x3f,0xec,0xe2,0x1, 0xc7,0xff,0x3d,0xff,0xe0,0x3, 0x4, 0xc5,0xe0,0x1, +0x1d,0x23,0xe2,0x1, 0xc6,0x7f,0xe0,0xe, 0x8f,0x9a,0x37,0xa6,0xe0,0xc, 0x3f,0xac, +0x3d,0xfc,0x17,0x81,0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0xea,0xf, 0x7f,0xfa,0x8f,0x8f, +0xf0,0xc, 0x3d,0x13,0x9e,0xc, 0xe0,0x3, 0x27,0xab,0x17,0xae,0x3d,0xef,0x3e,0x7f, +0xe0,0x2, 0x4, 0x8e,0xf0,0x1, 0x1b,0xa3,0xe8,0xe, 0x8f,0x97,0x37,0xa6,0x3f,0xab, +0x3e,0x7f,0xe0,0x2, 0x2, 0x5, 0xe0,0x2, 0x2c,0x4, 0x67,0x8d,0x3f,0x92,0x8f,0x8f, +0xe2,0x0, 0xcf,0x8f,0xe0,0x1, 0x2, 0xc7,0x14,0x0, 0xe0,0x2, 0x1c,0x85,0xe0,0x1, +0x8f,0xc9,0xe0,0x1, 0x27,0x9d,0xf0,0xf, 0x3d,0x13,0x9e,0xf, 0xe2,0x0, 0xce,0x2f, +0xe0,0x1, 0x2, 0x8d,0x17,0x80,0xe0,0x1, 0x24,0x36,0x66,0xd, 0x3e,0x12,0x8e,0xc, +0xe0,0x1, 0x26,0x35,0xf0,0xb, 0x3d,0x13,0xf0,0x0, 0x9a,0x9b,0xf0,0xb, 0x3d,0x92, +0x8d,0x8b,0xe2,0x0, 0xcd,0x82,0xe0,0x2, 0x5, 0xc0,0xe0,0x1, 0x1d,0x23,0xf0,0x0, +0x63,0x8d,0xe0,0xe, 0x8d,0xaa,0xe0,0xf, 0x3e,0x2f,0xe0,0xc, 0x35,0xa5,0xe8,0x2, +0x39,0x17,0xe8,0x40,0x3e,0x75,0xaf,0x82,0x3, 0x5, 0xea,0xf, 0x7f,0xf9,0x16,0x1, +0xae,0xf, 0x17,0x8a,0x86,0xd, 0xe0,0x0, 0x1c,0xaa,0xc6,0x7f,0xe2,0x1, 0xc6,0x7f, +0x3f,0xbc,0x85,0x89,0x3f,0x97,0x90,0xaf,0x91,0x8f,0x91,0x1f,0x94,0x3f,0x94,0xcf, +0xe8,0x16,0x3b,0x9c,0xe0,0xa, 0x3b,0x96,0xe8,0x0, 0xb1,0x86,0xe0,0x2, 0xc5,0x2c, +0xe8,0x0, 0xb1,0x16,0xc5,0x81,0xe8,0x0, 0xb0,0xa6,0xe8,0x0, 0xb4,0x36,0xe8,0x0, +0xb4,0xc6,0xae,0xd, 0x16,0x7f,0xae,0x4f,0x17,0x83,0xaf,0x8a,0xe0,0x0, 0x1d,0x2a, +0xad,0x8a,0xe7,0xf9,0x0, 0xf7,0xc7,0x7f,0xfa,0x10,0x7c,0xfc,0xfa,0x10,0x7d,0x18, +0xfa,0x11,0x7e,0xf8,0xfa,0x11,0x7e,0x6c,0xea,0x11,0x7b,0xe0,0xfa,0x10,0x7c,0xc, +0xfa,0x12,0x7d,0x84,0xaf,0xf, 0xe0,0x2, 0x1a,0x21,0xe7,0xf9,0x0, 0xbc,0xea,0xf, +0x7e,0xf9,0xaf,0x8d,0xaf,0x8e,0xc0,0x38,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x14,0x0, +0xe7,0xfe,0x0, 0xe5,0xe8,0x0, 0x8d,0x8d,0xe2,0x0, 0xcd,0x85,0xe8,0x0, 0x8d,0x88, +0xe7,0xfc,0x5, 0xd9,0xe9,0x28,0x3d,0x97,0x3d,0x48,0xe7,0xfb,0x2d,0x3e,0xe8,0x2a, +0x3c,0x91,0xe7,0xfc,0x25,0x50,0xe7,0xfb,0x0, 0xb8,0xf0,0xf, 0x3c,0x12,0xe8,0x2, +0x39,0x1b,0xa9,0x8f,0xa9,0x82,0xe7,0xf9,0x0, 0xba,0xe0,0x1, 0x1d,0x23,0xe0,0xe, +0x8f,0x9a,0x37,0xa6,0xc7,0xd0,0x3e,0x7f,0xe7,0xfe,0x2, 0x6e,0xf0,0xf, 0x3d,0x92, +0x8e,0xf, 0xe2,0x0, 0xce,0x4, 0xe7,0xfe,0x2, 0xe7,0xf0,0xf, 0x3c,0x12,0x8f,0x8f, +0xe2,0x0, 0xcf,0x8e,0xe0,0x2, 0x2, 0xa4,0xf0,0xf, 0x3d,0x13,0x9d,0x8f,0xe2,0x0, +0xcd,0xbf,0xe0,0x2, 0x5, 0x9d,0xf0,0x1, 0x1b,0xa3,0xe8,0xe, 0x8f,0x97,0x37,0xa6, +0xc7,0xc0,0x3d,0xff,0xe0,0x2, 0x2, 0x14,0x67,0x8d,0x16,0x0, 0x3f,0x92,0xae,0xf, +0x2c,0x5, 0x67,0x8d,0x16,0x0, 0x3f,0x92,0xae,0xf, 0xe8,0x3, 0x39,0x99,0x3b,0x17, +0xe0,0x2, 0x16,0x2c,0xf0,0x2, 0x1b,0xd7,0x90,0x83,0x17,0x80,0x94,0x13,0x94,0xa3, +0x95,0x33,0x95,0xc3,0x3e,0x16,0xe0,0x2, 0xc3,0x2d,0xe8,0x16,0x3b,0x9c,0xf0,0x3, +0x3f,0x12,0xf0,0x0, 0x12,0x83,0xe8,0x2, 0x39,0x17,0xaf,0x8c,0xaf,0x86,0x17,0x88, +0xf0,0x0, 0xaa,0x83,0xe8,0x0, 0xb0,0x86,0xe8,0x0, 0xb4,0x16,0xe8,0x0, 0xb4,0xa6, +0xe8,0x0, 0xb5,0x36,0xe8,0x0, 0xb5,0xc6,0xaf,0x82,0xe7,0xf8,0x0, 0xe0,0x8e,0xf, +0xe7,0xfc,0x26,0x68,0xc6,0x7f,0xae,0xf, 0xe7,0xfc,0x0, 0xe4,0x14,0x3, 0xf0,0xf, +0x3c,0x93,0x9e,0xf, 0xe2,0x0, 0xce,0x7f,0x2, 0x8c,0xe8,0xf, 0x3b,0x9c,0xf0,0xb, +0x3d,0x13,0x97,0x8f,0x95,0x8b,0x3f,0xab,0xe2,0x0, 0xcf,0xc0,0xe7,0xfd,0x2, 0x6f, +0xf0,0x1, 0x1b,0xa3,0xe8,0xe, 0x8f,0x97,0xc7,0xfe,0x37,0xa6,0x3e,0x7f,0x5, 0xc, +0xf0,0xf, 0x3d,0x13,0xe8,0xc, 0x3b,0x9c,0x97,0x8f,0x96,0xc, 0x3f,0xac,0xe2,0x0, +0xcf,0xc0,0xe7,0xfd,0x2, 0x5c,0x67,0x8d,0x3f,0x92,0x8e,0xf, 0x17,0x8f,0xe1,0x2f, +0x3f,0xac,0x27,0x86,0x17,0x82,0xe1,0x2f,0x3f,0xa8,0xe7,0xfd,0x2f,0xd8,0xe0,0x2, +0x1c,0x85,0xe0,0x1, 0x8d,0xc9,0xe0,0x0, 0x2d,0xd1,0xea,0xf, 0x7f,0xf9,0x8f,0x8f, +0xe1,0x2f,0x3f,0x8b,0xe0,0x0, 0x27,0xca,0x17,0x84,0xe1,0x28,0x3f,0xa8,0xe0,0x0, +0x24,0x45,0xf0,0xf, 0x3d,0x13,0xf0,0x0, 0x9a,0x9f,0x7e,0x5, 0xe8,0x40,0x3c,0x65, +0x7e,0x81,0x7f,0x2, 0xf0,0x0, 0x7a,0x84,0x7d,0x8c,0xe0,0x5, 0xd1,0x23,0xe0,0x3, +0x1d,0x12,0x65,0x8c,0xe0,0x5, 0xd0,0xfd,0xe2,0x0, 0xcc,0x0, 0x66,0x5, 0x66,0x81, +0x67,0x2, 0xf0,0x0, 0x62,0x84,0x3, 0x2d,0xf0,0xf, 0x3d,0x92,0x15,0x82,0xad,0x8f, +0x17,0x81,0xe7,0xfe,0x26,0x6c,0xe0,0x0, 0x1d,0xb, 0x8d,0x8a,0xe2,0x0, 0xcd,0x81, +0xe7,0xfd,0x2, 0xbd,0xf0,0x2, 0x1b,0x85,0xe8,0x1, 0x8d,0xc7,0xe0,0x0, 0x25,0xef, +0xe8,0x3, 0x39,0x9a,0x9d,0x3, 0xe2,0x0, 0xcd,0x2f,0xe7,0xfd,0x5, 0xb0,0xe0,0x1, +0x1c,0xa3,0xe0,0xe, 0x8d,0x99,0x35,0xa6,0xc5,0xd0,0x3d,0x7b,0x15,0x81,0xe0,0x6b, +0x3a,0x2f,0x3f,0xeb,0xe7,0xfd,0x0, 0xa3,0xf0,0xf, 0x3d,0x13,0xf0,0x0, 0x9a,0x9f, +0x67,0x8d,0x16,0xf, 0x3f,0x92,0xae,0xf, 0x17,0x80,0x16,0xf, 0xe7,0xfd,0x0, 0x90, +0xe2,0x0, 0xcc,0x2, 0xe7,0xfe,0x2, 0xed,0xe7,0xfc,0x0, 0xd1,0x17,0xa6,0x3d,0xef, +0xe7,0xfc,0x0, 0xd7,0x14,0x1, 0xe7,0xfc,0x0, 0xca,0xe8,0x0, 0x8d,0x8b,0xe2,0x0, +0xcd,0x83,0xe7,0xf9,0x2, 0xaa,0xe0,0xb, 0x31,0xa3,0x3d,0x94,0xe0,0x2, 0x10,0xac, +0x38,0x9b,0xe8,0x0, 0x94,0xa9,0xe0,0x2, 0xc5,0xad,0xad,0xb, 0xe8,0x0, 0x94,0x9, +0xe8,0x0, 0x91,0xb9,0xad,0x1, 0xe8,0x0, 0x95,0xc9,0xe8,0x0, 0x95,0x19,0xb4,0xa4, +0x14,0x81,0xb4,0x4, 0xb5,0x14,0xb1,0xb4,0xb5,0xc4,0xa9,0x44,0xac,0x8d,0x0, 0x86, +0x2d,0x92,0xe2,0x0, 0xcb,0xa, 0xe7,0xfa,0x1, 0x76,0x15,0xa, 0x3d,0x36,0xc3,0x1, +0xe0,0xb, 0x3a,0x1a,0x8d,0xcb,0xe2,0x1, 0xc3,0x7f,0xe0,0x29,0x39,0xb, 0xe0,0x2b, +0x3d,0x85,0x24,0xef,0x3d,0x14,0x15,0xff,0xad,0xca,0x0, 0xec,0x17,0x83,0xe1,0x2f, +0x3f,0xac,0xe7,0xfc,0x2c,0x3c,0xe7,0xfd,0x0, 0xee,0x17,0x81,0xe7,0xfc,0x0, 0xc7, +0xe0,0x0, 0x1f,0x8b,0x14,0x0, 0xf0,0x0, 0x8b,0x8f,0xf2,0x0, 0xcb,0x84,0xe0,0x0, +0x2, 0xee,0xe0,0x1, 0x1f,0x96,0xe0,0x0, 0x1f,0xe, 0x8e,0x8f,0xe0,0x1, 0x1f,0x95, +0x36,0xa8,0x8f,0x8f,0xe0,0x1a,0x96,0x7e,0x3f,0xcd,0x3e,0x7f,0xe0,0x0, 0x5, 0x5f, +0xf0,0x0, 0x23,0xde,0x8, 0xb1,0xf0,0x0, 0x13,0x7f,0x3d,0x68,0x3c,0xe8,0xf8,0x40, +0x3a,0xe6,0x8f,0x8e,0xe8,0x40,0x3e,0x65,0x8e,0x9e,0xe2,0x1, 0xc6,0x7f,0x3f,0xfc, +0xc4,0x1, 0x38,0xe9,0xf8,0x40,0x38,0x66,0xf0,0x40,0x38,0xea,0xe4,0xb, 0x37,0xa8, +0xe4,0xc, 0x36,0xa8,0xe2,0x1, 0xc0,0xff,0xf2,0x1, 0xc0,0x7f,0xf2,0x1, 0xc0,0xff, +0xe2,0x1, 0xc4,0x7f,0xf0,0x40,0x39,0x6f,0xe4,0xb, 0x35,0xc8,0xf0,0x40,0x39,0xed, +0xf0,0x40,0x3a,0x6d,0xe4,0xc, 0x36,0x48,0xc7,0x2, 0x5, 0x83,0xf8,0x40,0x39,0x65, +0x3d,0xf1,0xf8,0x40,0x3a,0xe2,0xf2,0x1, 0xc2,0xff,0x3, 0x82,0x3f,0xe9,0xe8,0x40, +0x3e,0xf0,0x3c,0xef,0xe2,0x1, 0xc4,0xff,0x5, 0x83,0xf8,0x40,0x39,0xe6,0xe8,0x40, +0x3e,0x71,0xf8,0x40,0x3b,0x63,0xf2,0x1, 0xc3,0x7f,0x3, 0x83,0xf0,0x40,0x3a,0x6a, +0xf0,0x40,0x3b,0xf8,0xe8,0x40,0x3d,0x64,0xe2,0x1, 0xc5,0x7f,0xe7,0xff,0x1, 0xbb, +0xe8,0x9, 0x3c,0xa5,0xe8,0xa, 0x3d,0x26,0xe2,0x0, 0xcc,0x84,0x17,0x84,0xe0,0x2a, +0x3f,0xaa,0x14,0x0, 0xe0,0x68,0x3d,0x2a,0x8, 0xe1,0x38,0x82,0x14,0x1, 0x38,0x82, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3a,0xc0,0x7c,0xe0,0x2, 0x19,0xc3,0xe0,0x2, 0x1a,0xbf, +0x97,0xd3,0xe0,0x0, 0x1b,0xb, 0x86,0x45,0x8e,0xd5,0x17,0x0, 0xe2,0xff,0xc7,0xff, +0x8d,0x86,0x6f,0x4, 0xb7,0xd3,0x6f,0x5, 0x6e,0x6, 0x6e,0x87,0xe0,0x1, 0x25,0xfb, +0xe0,0x1, 0x1f,0xad,0xe0,0x0, 0x19,0xe, 0xf0,0x0, 0x94,0x2f,0x93,0xdf,0xf0,0x1, +0x1d,0x51,0x12,0x0, 0x0, 0x89,0xf8,0x40,0x3c,0x79,0x4, 0x1e,0x8d,0x86,0x8e,0xd5, +0x3a,0x7b,0xe0,0x1, 0x3, 0xed,0xe0,0xf, 0x32,0x21,0x3f,0x92,0x8c,0x8f,0x8d,0x1f, +0x3e,0xb9,0xe8,0x0, 0xa7,0x8a,0x3e,0x9a,0x36,0xa1,0x3e,0x9f,0xe2,0x0, 0x7c,0x4, +0xf0,0x0, 0x94,0x8d,0xc2,0x1, 0xef,0xfe,0xdf,0x65,0xe2,0x1, 0xc2,0x7f,0x2c,0x64, +0xe8,0x40,0x3b,0xf9,0x3, 0x64,0x8d,0x86,0x8e,0xd5,0x16,0x1, 0xe0,0x1a,0x9a,0x52, +0xe0,0x1a,0x9f,0xe2,0x97,0x53,0x9d,0x23,0x3f,0x94,0x36,0x2f,0xe2,0xf7,0xc7,0x7f, +0xe0,0x2f,0x3f,0x9a,0x37,0xaa,0x3f,0x4c,0xe0,0x2, 0x1a,0xcb,0x3f,0x4f,0xe0,0x4, +0xcf,0x0, 0x8f,0x85,0xb7,0x53,0x27,0xbb,0xe0,0x1, 0x1e,0x70,0xe0,0x1, 0x1c,0xd1, +0x8f,0xc, 0x8d,0x1c,0x3f,0x3d,0xa4,0x9, 0x3f,0x1a,0x37,0x21,0xe0,0x1, 0x1d,0x77, +0x3f,0x18,0x94,0x8a,0x97,0xe, 0x9b,0x93,0x3f,0x29,0xe0,0x43,0x3f,0x1e,0xe4,0x9, +0x37,0xf, 0xe2,0xe, 0x3c,0xce,0x3f,0x29,0x3f,0x77,0xe0,0x0, 0x2, 0x78,0x13,0x7f, +0x3b,0x1f,0xe2,0x1, 0xc3,0x7f,0x33,0x21,0x3b,0x1c,0x0, 0x95,0x8f,0x2f,0x8f,0xbf, +0x3f,0x3d,0xe0,0x80,0x94,0x9a,0x3f,0x1f,0x37,0x21,0x3f,0x18,0x97,0x8e,0x3f,0xa9, +0xe0,0x43,0x3f,0x9f,0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x3f,0xae,0x3f,0xf7, +0xe0,0x0, 0x2, 0x5d,0x3b,0x7c,0x3f,0xec,0xc6,0x2, 0x1, 0xe9,0x17,0x81,0x2d,0x82, +0xad,0x85,0xe7,0xfb,0x17,0x7f,0x92,0xd3,0x37,0xa9,0x3a,0xde,0x3a,0xcf,0xe7,0x7f, +0x17,0xff,0x3a,0xdf,0xe0,0x0, 0x1f,0x8a,0x8f,0x8f,0xb2,0xd3,0x27,0xa9,0xe0,0x1b, +0x97,0x92,0xe0,0x17,0xc7,0xb7,0xe3,0xff,0xc7,0xff,0xe2,0x14,0xcf,0xd8,0x2, 0x8c, +0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0x8f,0x8f,0xe0,0x0, 0x2f,0xe5,0xde,0xd2,0x2c,0x4, +0xe0,0x80,0xca,0x80,0xb2,0xd3,0x16,0x83,0xe0,0x1, 0x1f,0xad,0xe0,0x1b,0x97,0x42, +0x97,0xef,0xe4,0x0, 0xc7,0x8a,0xe2,0x0, 0xcf,0x80,0x3e,0x9f,0xe0,0x6f,0x3c,0x2d, +0x37,0x82,0x3f,0x7f,0x3, 0x5, 0x97,0xd3,0xe0,0x40,0xcf,0x80,0xb7,0xd3,0x97,0xd3, +0xe3,0xdf,0xc7,0xff,0xb7,0xd3,0xe7,0xef,0x16,0xff,0xe0,0x2, 0x1f,0x37,0x97,0xd3, +0x9f,0xe, 0x3f,0xdd,0x37,0x42,0xe7,0xfd,0x16,0xff,0x3f,0xdd,0x3f,0x74,0xb7,0xd3, +0x4, 0x85,0xe0,0x1a,0x9f,0xe2,0x3f,0xfe,0x5, 0x85,0x97,0xd3,0xe0,0x2, 0xcf,0x80, +0xb7,0xd3,0xc0,0x4, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0x25,0xa0,0x13,0xff,0x3b,0x9b, +0xe2,0x1, 0xc3,0xff,0xc3,0x81,0x33,0xa1,0xe0,0x0, 0x1f,0xe, 0xe0,0x1, 0x1b,0x76, +0xe0,0x1, 0x1e,0x70,0x3b,0x92,0x8c,0x8e,0x8d,0x1e,0xe0,0xf, 0x3c,0xbd,0xc7,0x2, +0x3f,0x9a,0x37,0xa1,0x3f,0x98,0x97,0x8f,0xc6,0x2, 0x3f,0x77,0xe0,0x40,0xac,0xac, +0xe0,0x40,0xad,0x1c,0xe0,0x80,0xb7,0x96,0x1, 0xef,0xad,0x85,0x17,0x80,0xe7,0xff, +0x0, 0x88,0xe0,0x0, 0x19,0xe, 0x3e,0x6b,0xe7,0xfe,0x0, 0xb2,0x16,0x0, 0xe7,0xfe, +0x0, 0xaf,0xe0,0x2, 0x1f,0xbb,0x17,0x7, 0xaf,0xf, 0x17,0x0, 0xe0,0x1, 0x1f,0xcf, +0xaf,0xf, 0xe7,0xff,0x0, 0xb2,0x0, 0x0, 0x8, 0xb7,0xc0,0x70,0xea,0x1a,0x7f,0xac, +0xe9,0xff,0xc7,0xff,0xf0,0x0, 0x83,0xf, 0xf0,0x0, 0x83,0x9f,0x83,0xaf,0x83,0x3f, +0x82,0xcf,0x82,0x5f,0x81,0xef,0x81,0x7f,0xe0,0x1, 0x84,0xf, 0xe0,0x1, 0x84,0x9f, +0xe0,0x1, 0x85,0x2f,0xe0,0x1, 0x85,0xbf,0xe0,0x1, 0x86,0x4f,0xe0,0x1, 0x86,0xdf, +0xe0,0x1, 0x87,0x6f,0xe0,0x1, 0x87,0xff,0xf0,0x0, 0x6b,0x4, 0x6f,0x93,0xe0,0x0, +0x1f,0x8b,0xf0,0x0, 0x6b,0x85,0x6b,0x86,0x6b,0x7, 0x6a,0x88,0x6a,0x9, 0x69,0x8a, +0x69,0xb, 0x6c,0xc, 0x6c,0x8d,0x6d,0xe, 0x6d,0x8f,0x6e,0x10,0x6e,0x91,0x6f,0x12, +0x8f,0x8f,0xe0,0x1, 0x27,0x9c,0xe0,0x2, 0x1f,0x9f,0x89,0x8f,0xe0,0x1, 0x29,0x97, +0xe0,0x0, 0x1b,0xe, 0xf0,0x2, 0x1a,0xbf,0xe0,0x1, 0x1f,0xd1,0x89,0x16,0x8b,0x86, +0xe8,0x0, 0x8a,0xd5,0xf7,0xff,0x13,0xff,0xf7,0xff,0x13,0x7f,0x14,0x81,0xa2,0xf, +0xe0,0x43,0x3e,0x97,0x3d,0x63,0xf0,0x17,0x3b,0x92,0xf0,0x16,0x3b,0x15,0x3c,0x92, +0xe0,0xb, 0x3e,0xb5,0xe8,0x40,0x3f,0x67,0xe0,0xc, 0x3d,0x92,0x36,0x21,0x3e,0x14, +0x96,0xc, 0x3f,0xe9,0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0x3f,0x1b,0x3f,0x9b, +0xe2,0x1, 0xce,0x20,0x37,0x21,0x37,0xa1,0xc6,0xff,0x16,0x1, 0x3f,0x14,0x3f,0x94, +0xe0,0x43,0x3e,0x9d,0x3e,0x13,0x5, 0x18,0x21,0x8, 0x94,0xe, 0x39,0xec,0x3d,0x18, +0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0xe8,0x40,0x39,0x76,0x17,0x1, 0x3f,0x13, +0x3, 0x8, 0x94,0xf, 0x39,0xee,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a, +0xe3,0xff,0xce,0xff,0x1, 0xce,0xf8,0x0, 0x8b,0x45,0x16,0x1, 0xf7,0xff,0x13,0xff, +0xf7,0xff,0x12,0xff,0x14,0x81,0x3e,0x17,0xf0,0x17,0x3b,0x92,0xf0,0x15,0x3a,0x95, +0x3c,0x92,0x3f,0xec,0xe2,0x1, 0xc7,0xff,0xe0,0xd, 0x3f,0xb5,0xe8,0x40,0x3f,0x67, +0x3f,0xe9,0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0xe0,0xb, 0x3e,0x92,0x3f,0x1d, +0x3f,0x9d,0xe0,0x43,0x3e,0x9c,0xe8,0x40,0x3e,0xf6,0x35,0xa1,0x37,0x21,0x37,0xa1, +0xf0,0x0, 0x12,0x1, 0x3d,0x94,0x3f,0x14,0x3f,0x94,0xc6,0x1, 0xf0,0x14,0x3a,0x13, +0x3, 0x24,0x96,0x8b,0xe3,0xff,0xc6,0x7f,0xe2,0x1, 0xce,0xa0,0x5, 0x1e,0x21,0x9, +0x94,0xe, 0xe8,0x40,0x39,0xe4,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a, +0xe8,0x40,0x39,0x75,0x17,0x1, 0x3f,0x13,0x3, 0x4d,0x94,0xf, 0x39,0xee,0x3d,0x18, +0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0x0, 0xc5,0xea,0x12,0x7f,0x91,0x17,0x0, +0xaf,0xf, 0x14,0x0, 0xc0,0x10,0xb, 0xe1,0xe4,0x8, 0x35,0xf, 0xe2,0xa, 0x3c,0x4a, +0x3c,0xe3,0xe0,0x8, 0x3d,0x28,0xe0,0x4, 0xde,0x67,0xe2,0x0, 0xcc,0x64,0x2, 0x6e, +0x29,0xe, 0xe0,0x0, 0x1f,0xa, 0xea,0x12,0x7f,0x91,0x16,0x81,0x8f,0xe, 0xae,0x8f, +0x14,0x1, 0x27,0x69,0x17,0x3, 0xaf,0xf, 0x14,0x3, 0x0, 0xe5,0x16,0xff,0x3e,0x95, +0x39,0x7d,0x1, 0x70,0x17,0xff,0x3a,0xb7,0x3f,0x92,0xe2,0x0, 0xc9,0x8f,0xe2,0x1, +0xc7,0xff,0x16,0x3, 0x3f,0x95,0x17,0x0, 0xe0,0x6e,0x3a,0xac,0x37,0xa1,0x39,0x7d, +0x3f,0x94,0x96,0xf, 0xe0,0x0, 0x4, 0x4d,0x17,0x84,0x15,0xf4,0x36,0x1, 0x3f,0x90, +0xe0,0xb, 0x3d,0x90,0xe0,0x1, 0x86,0xef,0x3e,0xfc,0x5, 0x6, 0xe0,0x1, 0x86,0xff, +0x3f,0x1d,0xe3,0xff,0xc7,0x7f,0xc7,0xfe,0x3d,0xff,0x1, 0xf5,0x39,0x15,0x31,0x21, +0x3a,0x12,0x97,0x84,0x16,0xa8,0xe4,0xc, 0x37,0x8f,0xe2,0xf, 0x3e,0x4f,0x3e,0x9e, +0x3f,0xac,0xe2,0xb, 0xcf,0xdd,0x3f,0xed,0xe3,0xff,0xc7,0xff,0xe0,0x1a,0x96,0x76, +0xe0,0x0, 0x1e,0x9a,0xe0,0x6e,0x3b,0x2f,0x17,0xa8,0xe2,0xb, 0xce,0x5d,0x3f,0x9e, +0x8e,0xd, 0xe3,0xff,0xc7,0xff,0xe0,0x6e,0x3b,0x2f,0xe2,0x0, 0xce,0x1, 0x1, 0x25, +0x3f,0xee,0xe3,0xff,0xc7,0xff,0xe2,0x1, 0xcf,0xfa,0x2, 0x8f,0xea,0x12,0x7f,0x91, +0x8c,0xf, 0xe3,0xff,0xc7,0x7f,0x3f,0x78,0xe7,0xff,0x5, 0x8e,0x3c,0x6e,0xe2,0x1, +0xc4,0x7f,0xac,0xf, 0xe7,0xff,0x0, 0x88,0xe0,0x1, 0x17,0x7a,0x0, 0xf0,0x17,0x81, +0x3f,0x92,0xe2,0x1, 0xc7,0xff,0x3f,0x95,0x37,0xa1,0x3f,0x94,0x97,0x8f,0x3e,0x1f, +0xe0,0x43,0x3e,0x1c,0xe7,0xff,0x0, 0xaa,0xc7,0x28,0x17,0x80,0xaf,0x8d,0xe3,0xff, +0xc7,0x7f,0x0, 0xd7,0x8, 0xb7,0xe0,0x2, 0x19,0x85,0xe0,0x2, 0x1a,0x6b,0xe0,0xa, +0x8f,0x83,0x17,0x1, 0xe2,0x0, 0xcf,0x81,0xaf,0x4, 0xe0,0x0, 0x1, 0x63,0xe0,0x1, +0x1a,0x94,0xe0,0x1, 0x19,0x2d,0x8f,0x85,0xe0,0x1, 0x13,0xa0,0x37,0xc1,0xe0,0x1, +0x13,0x16,0xaf,0x92,0xb3,0x92,0xb3,0x22,0xe0,0x3, 0xde,0xb4,0xe0,0x0, 0x1f,0x8b, +0xe0,0x0, 0x1f,0xe, 0x8f,0x8f,0x2f,0xaf,0x17,0x80,0xaf,0x84,0xe0,0x1, 0x1f,0x96, +0x8d,0xf, 0xe0,0x1, 0x1f,0x93,0x35,0x28,0x8d,0x8f,0xe0,0x1, 0x1f,0x92,0x35,0xa8, +0x8e,0xf, 0xe0,0x1, 0x1f,0x95,0x36,0x28,0x8e,0x8f,0xe0,0x1, 0x1f,0x91,0x3e,0xca, +0x8f,0xf, 0xe0,0x1, 0x1f,0x90,0x3f,0x4b,0x8f,0x8f,0xe0,0x43,0x3f,0x1e,0x3f,0xcc, +0xe0,0x43,0x3f,0x9f,0xe0,0xc, 0x36,0xc5,0x85,0x5, 0xae,0x3, 0xe0,0x41,0x3d,0xcf, +0xe0,0xc, 0x37,0x5, 0xad,0x12,0xb6,0x92,0xb7,0x22,0xb7,0xf2,0xe0,0x1, 0xb5,0x82, +0xae,0x13,0xb, 0xe1,0xe2,0x0, 0xcf,0x83,0x5, 0x9f,0xe0,0x1a,0x97,0xfe,0xe2,0x2, +0xcf,0xab,0x2, 0x1e,0x8f,0x85,0x17,0x5, 0x37,0xc1,0xaf,0x92,0xe7,0xfe,0x17,0xea, +0xe0,0x1, 0xb7,0x82,0x17,0x84,0xaf,0x3, 0xb3,0x92,0xb3,0x22,0xb3,0x72,0xaf,0x93, +0x8f,0x84,0xe7,0xff,0x27,0xbd,0xe0,0x0, 0x1f,0xb8,0x17,0x1, 0xaf,0xf, 0xb, 0xe1, +0x17,0x80,0xaf,0x84,0xb, 0xe1,0xe7,0xff,0x1, 0xb1,0xe0,0x1a,0x97,0xfe,0xe2,0x3, +0xcf,0x8f,0xe7,0xff,0x2, 0x2b,0x86,0x85,0xe0,0x1, 0x17,0x20,0x17,0x85,0xae,0x92, +0xe0,0x1, 0x16,0xaa,0xb7,0x22,0xb7,0x72,0xe7,0xfe,0x17,0x60,0xaf,0x83,0xb6,0x92, +0xe0,0x1, 0xb7,0x2, 0xaf,0x93,0x0, 0xdd,0xe0,0x2, 0x1f,0xeb,0x17,0x7f,0xaf,0xf, +0xe7,0xfe,0x0, 0xf2,0x8, 0xb4,0xe0,0x2, 0x19,0x85,0xe0,0xa, 0x8f,0x83,0xe2,0x0, +0xcf,0x81,0xe0,0x1, 0x1, 0x0, 0xe0,0x1, 0x19,0x2d,0xe0,0x3, 0x8f,0xc2,0xe2,0x0, +0xcf,0x81,0xe0,0x0, 0x1, 0x4f,0xe0,0x2, 0x1a,0x6b,0x17,0xff,0xaf,0x84,0xdf,0x5b, +0x8f,0x84,0xe0,0x1, 0x27,0x99,0xe0,0x1, 0x8f,0xb3,0x27,0xa1,0x9f,0x12,0x97,0xa2, +0x96,0xf2,0xe4,0x0, 0xc7,0xa, 0xe4,0x0, 0xc7,0x8a,0x37,0x3, 0xe4,0x0, 0xc6,0x8a, +0xe3,0xff,0xc7,0x7f,0x37,0x83,0xe0,0x43,0x3e,0x1f,0x36,0x83,0xe0,0xb, 0x37,0x45, +0xad,0x83,0xe0,0x41,0x3f,0xcf,0xe0,0x41,0x3d,0x4d,0xe0,0xb, 0x36,0x5, 0xb7,0x12, +0xb6,0x22,0xb7,0xb2,0xb6,0xf2,0xe0,0x1, 0xb5,0x2, 0xad,0x93,0x8f,0xc3,0xe2,0x1, +0xcf,0xaa,0x1, 0x13,0xe0,0x1, 0x1f,0x8f,0x8e,0xf, 0xe0,0x1, 0x1f,0x8e,0x36,0x28, +0x8e,0x8f,0xe0,0x1, 0x1f,0x8d,0x36,0xa8,0x8f,0xf, 0xe0,0x1, 0x1f,0x8c,0x3f,0x4c, +0x8f,0x8f,0xb7,0x42,0x3f,0xcd,0xb7,0xd2,0xe0,0x1, 0x1f,0x8b,0x8f,0xf, 0xe0,0x1, +0x1f,0x8a,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xe0,0x41,0x3f,0xcf,0xb7,0xb2,0xa, 0x61, +0xe0,0x1, 0x1f,0x89,0xe0,0x1, 0x1f,0x10,0x8e,0xf, 0xe0,0x1, 0x1f,0x92,0x8f,0xe, +0x8e,0x8f,0xe0,0x1, 0x1f,0x88,0x36,0xa8,0x8f,0x8f,0x3f,0x4d,0x16,0x84,0x36,0x28, +0xae,0x83,0xe0,0x1, 0x16,0x96,0xe0,0x1, 0x1d,0x94,0x3f,0xcc,0xb6,0x92,0xe0,0x0, +0x16,0xf8,0xe0,0x41,0x3f,0xcf,0x85,0x8b,0xb6,0xa2,0x16,0x0, 0xe0,0x2, 0x1e,0xeb, +0xe0,0x1, 0xb7,0x82,0x17,0x83,0xad,0x92,0xae,0xd, 0xb7,0x72,0xaf,0x93,0xe7,0xff, +0x0, 0x94,0xe0,0x1, 0x1f,0x89,0xe0,0x1, 0x1f,0x10,0x8e,0xf, 0xe0,0x1, 0x1f,0x92, +0x8f,0xe, 0x8e,0x8f,0xe0,0x1, 0x1f,0x88,0x36,0xa8,0x8f,0x8f,0xe0,0x1, 0x19,0x2d, +0x3f,0x4d,0x16,0x89,0x36,0x28,0xae,0x83,0xe0,0x2, 0x16,0xac,0xe0,0x1, 0x1d,0x94, +0x3f,0xcc,0xb6,0x92,0xe0,0x2, 0x16,0x8e,0xe0,0x41,0x3f,0xcf,0x85,0x8b,0xb6,0xa2, +0x16,0x0, 0xe0,0x2, 0x1e,0xeb,0xe0,0x1, 0xb7,0x82,0x17,0x88,0xad,0x92,0xae,0xd, +0xb7,0x72,0xaf,0x93,0xe0,0x2, 0x1f,0xa0,0x8f,0x8f,0xe7,0xfe,0x2f,0xe6,0xe0,0x3, +0x8f,0xc2,0xe7,0xfe,0x2f,0xe2,0xe0,0x1, 0x1f,0x87,0x8f,0xf, 0xe0,0x1, 0x1f,0x86, +0x37,0x28,0x8f,0x8f,0x3f,0xce,0xb7,0x92,0xe7,0xfe,0x0, 0xd7,0x3c,0xe8,0xe0,0x1, +0x1c,0x41,0xe7,0x0, 0x16,0x0, 0xe0,0xff,0x15,0xff,0x15,0x0, 0xe7,0xdb,0x0, 0x83, +0x8, 0xb7,0xf8,0x0, 0xc, 0x38,0xe0,0x2, 0x1f,0x3f,0x8f,0xfe,0x8a,0x6e,0x89,0xde, +0xe0,0x0, 0x27,0xc1,0x11,0x7f,0x39,0x1f,0xe2,0x1, 0xc1,0x7f,0xe0,0x2, 0x1f,0xb0, +0x31,0x21,0xe0,0x2, 0x1b,0x2f,0xf0,0x1, 0x1c,0x40,0x3a,0xe8,0x39,0x1f,0x13,0x80, +0x22,0x34,0x14,0x0, 0x3f,0x67,0xf0,0x40,0x3b,0x63,0xe3,0xff,0xc7,0x7f,0xe0,0xff, +0x16,0x7f,0x3f,0xe8,0xe0,0xd, 0x37,0x21,0x3e,0x95,0x96,0x8d,0xe4,0x17,0x36,0xf, +0xe4,0x9, 0x36,0x8f,0xf2,0xa, 0x3b,0xcc,0xe2,0xb, 0x3c,0xcd,0xe8,0xa, 0x3d,0x27, +0x3d,0xa9,0x3d,0x7b,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3c,0x1d,0xe0,0x6d,0x3d,0x2c, +0x3a,0x7f,0xe8,0xe, 0x3f,0x16,0x3e,0x6d,0xe3,0xff,0xc7,0x7f,0x1, 0xe4,0xe0,0x80, +0xb6,0x16,0x3c,0xe4,0xe0,0x4, 0xdc,0x40,0x3b,0x72,0xe8,0x80,0xb4,0x18,0xc3,0x81, +0x1, 0xd0,0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe0,0xff,0x16,0x7f,0x3c,0x64,0x0, 0xf0, +0x24,0xbd,0x8, 0xb3,0x16,0x7f,0x3e,0x19,0xe2,0x1, 0xc6,0x7f,0x11,0x7e,0x39,0x18, +0x36,0x21,0x3e,0x18,0x39,0xe2,0x14,0x0, 0xe0,0x43,0x3d,0x9a,0xe0,0x80,0x97,0x13, +0xe4,0xd, 0x37,0xf, 0xe2,0xf, 0x3e,0xce,0x3f,0xad,0xe0,0x43,0x3f,0x9f,0x3f,0xfa, +0xe0,0x6f,0x3a,0x2b,0x39,0xfc,0x3c,0x1f,0x1, 0xf2,0xe0,0x4, 0xdc,0x15,0xe2,0x0, +0xcc,0x8, 0x16,0x88,0xe0,0x6d,0x3b,0x28,0x0, 0x88,0x3f,0xad,0xe0,0x43,0x3f,0x9f, +0xe0,0x80,0xb7,0x92,0x39,0xf2,0x1, 0x11,0x97,0x92,0xe2,0x0, 0xcf,0x87,0xe0,0xe, +0x3e,0x9f,0xe0,0x43,0x3f,0x1e,0x2, 0x72,0xe3,0xff,0xcf,0xf8,0xe0,0x6f,0x3d,0x2e, +0xe0,0x80,0xb7,0x92,0x39,0xf2,0x1, 0xf1,0x9, 0xe1,0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x39,0xe0,0x2, 0x1f,0xbf,0xe0,0x1, 0x1b,0x51,0x8a,0x6f,0xa4,0x86,0xe0,0x1, +0x1c,0x41,0xe7,0x0, 0x16,0x0, 0xe0,0xff,0x15,0xff,0x15,0x0, 0x8a,0xff,0xef,0xfe, +0xdc,0xe2,0x22,0x2f,0xc2,0x7f,0xe2,0x1, 0xc2,0x7f,0xe0,0x45,0xc2,0x43,0xe0,0x1, +0x1f,0xcd,0x32,0x21,0xe0,0x1, 0x19,0xbf,0xe0,0x19,0x32,0xa1,0x3a,0x1f,0x11,0x0, +0xf0,0x0, 0x14,0x3, 0xe0,0x0, 0x13,0xda,0xe0,0x80,0x97,0x93,0xe8,0x40,0x3c,0xe8, +0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f,0xe0,0x8, 0x3f,0xa8,0xe0,0x4, 0xdb,0xc4, +0xe2,0x0, 0xcc,0x5a,0xa7,0x86,0x3d,0x67,0xe0,0x6a,0x3b,0x28,0xe3,0xff,0xc5,0x7f, +0xe0,0x8, 0x3f,0x92,0x3c,0xe5,0xdf,0x85,0x3a,0x73,0xe8,0x2, 0x39,0x19,0x1, 0xe5, +0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x8, 0xb3,0xe0,0x2, 0x1f,0xbf,0xe0,0x1, 0x1c,0x4d, +0x89,0xff,0x89,0x6f,0xdf,0x26,0x21,0xa5,0x14,0x7f,0x3c,0x13,0xe2,0x1, 0xc4,0x7f, +0xe0,0x2, 0x1d,0xb0,0xc4,0x1, 0x34,0x21,0xe0,0x1, 0x1c,0xcd,0x3c,0x1b,0xe0,0xa, +0x31,0xa1,0x3e,0xe9,0x17,0x80,0x21,0x11,0x97,0xd, 0x96,0xb, 0xe2,0x0, 0xcf,0x0, +0x4, 0x4, 0xe2,0x0, 0xce,0x0, 0x5, 0x3, 0x3f,0x2c,0xb7,0xd, 0xc7,0x81,0xe2,0x1, +0xc7,0xff,0x39,0x7f,0x3e,0x9a,0x1, 0xf1,0xc5,0x82,0x3d,0xf8,0xc4,0x82,0x1, 0xea, +0x9, 0xe1,0xe2,0x0, 0xcc,0x80,0x4, 0x5, 0x3c,0x5a,0xe4,0x8, 0x34,0x4f,0x38,0x82, +0xe0,0x41,0x3d,0xa, 0xe3,0x8, 0x3d,0x58,0xe4,0x8, 0x34,0x4f,0x38,0x82,0x8, 0xb3, +0xe4,0xe, 0x34,0x8f,0xe2,0xf, 0x3f,0x49,0x3f,0xae,0xe4,0x0, 0xc7,0x8a,0x39,0x68, +0xe1,0xff,0x14,0x7e,0x14,0x94,0x3c,0x5f,0x39,0xea,0xe0,0x4, 0xdb,0xa9,0xe4,0xf, +0x31,0xf, 0xe4,0xa, 0x31,0x8f,0xe2,0x2, 0x3f,0xc2,0xe2,0x3, 0x3d,0x43,0x39,0x2f, +0x39,0xaa,0xe3,0xff,0xc4,0x7f,0xe3,0xff,0xc1,0xff,0xe3,0xff,0xc1,0x7f,0xe1,0x22, +0x3c,0x12,0xe1,0x28,0x3c,0x13,0x3c,0x52,0x9, 0xe1,0xe3,0xff,0xc4,0x7f,0x24,0x94, +0x16,0xff,0x3e,0x99,0xe2,0x1, 0xc6,0xff,0xe0,0x1, 0x1f,0x4d,0xe0,0xf, 0x34,0x21, +0x3e,0x98,0xc7,0xfe,0x36,0xa1,0x3f,0x9e,0x3e,0x9e,0x97,0x1f,0x37,0x2, 0xe0,0x80, +0xb7,0x1f,0x3f,0xfd,0x1, 0xfb,0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x6c, +0xe0,0x2, 0x1f,0xff,0xf0,0x2, 0x1e,0xbf,0x8f,0xf, 0xe8,0x0, 0x8e,0x4d,0xe8,0x0, +0x8e,0xdd,0xe2,0x0, 0xcf,0x1, 0x7e,0x4, 0x3b,0xe8,0x7e,0x83,0x3b,0x69,0x1, 0x6, +0x8f,0x8f,0xe2,0x0, 0xcf,0x83,0xe0,0x2, 0x1, 0x4a,0xe0,0x1, 0x1f,0x96,0xe0,0x1, +0x1f,0x15,0x8f,0x8f,0xf0,0x0, 0x8c,0x8e,0x37,0xa8,0xf0,0x19,0x3c,0xcf,0xf0,0x0, +0x7c,0x81,0xe0,0x1, 0x23,0xf7,0x67,0x84,0x11,0x80,0x3f,0x6f,0xc7,0x7f,0x7f,0x5, +0xf0,0x40,0x3f,0x63,0xf0,0x0, 0x1e,0xe, 0xe0,0x1, 0x1a,0x4d,0xe0,0x0, 0x12,0x83, +0xe0,0x1, 0x2b,0x19,0xe8,0x0, 0x8f,0xc, 0xf8,0x0, 0x8d,0x1c,0x3f,0x7f,0xe0,0x1, +0x1, 0x1, 0xe8,0x0, 0x89,0x5d,0x66,0x1, 0x39,0x3e,0xe8,0x2, 0x39,0x1a,0xf0,0x40, +0x3d,0x62,0xf3,0xff,0xc5,0x7f,0xf0,0xf, 0x35,0x21,0x3f,0x94,0x96,0x8f,0xe4,0x9, +0x36,0x8f,0xe2,0xf, 0x3c,0xcd,0x3f,0xa9,0x3f,0xfc,0xe0,0x0, 0x2, 0x6b,0xe0,0x1, +0x27,0x0, 0x66,0x3, 0xf0,0x9, 0x3d,0x2c,0x66,0x5, 0x34,0xa1,0x3e,0x7e,0x3c,0x94, +0x91,0x9, 0x5, 0x7, 0x64,0x83,0xe8,0x9, 0x3c,0x9a,0x34,0xa1,0x3c,0x94,0x91,0x89, +0x66,0x5, 0x3e,0x7e,0x3f,0x62,0xe0,0x6e,0x39,0xa3,0x39,0xee,0xe2,0x0, 0xce,0x80, +0xe0,0x0, 0x4, 0x76,0x3f,0x63,0xe3,0xff,0xc7,0x7f,0x37,0x4f,0xe0,0x0, 0x27,0x7d, +0x3f,0x62,0xe3,0xff,0xc7,0x7f,0x37,0x4f,0xe0,0x0, 0x27,0x77,0x17,0x8e,0xe8,0xf, +0x3f,0x9a,0x37,0xa1,0xe8,0xf, 0x3f,0x9d,0x9c,0xf, 0x3c,0xe5,0xe0,0x4, 0xda,0xf8, +0x11,0x7c,0xe8,0x2, 0x39,0x1a,0xf0,0x40,0x3c,0x68,0xf3,0xff,0xc4,0x7f,0xe3,0xff, +0xc1,0x7f,0x17,0x7f,0xe8,0xe, 0x3f,0x1a,0xf0,0x40,0x3c,0xee,0xf3,0xff,0xc4,0xff, +0x17,0x8e,0xe8,0xf, 0x3f,0x99,0x37,0xa1,0x3c,0xe5,0xe8,0xf, 0x3f,0x9d,0xf0,0x1, +0x25,0x63,0xf0,0x40,0x3c,0xf2,0xe0,0x1, 0x1, 0x1, 0x9c,0xf, 0xe0,0x4, 0xda,0xd8, +0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0x78,0xe0,0x1, 0x1, 0xd0,0xf8,0x40,0x3d,0x69, +0x0, 0xe1,0x17,0xff,0xe8,0xf, 0x3f,0x9b,0xf0,0x40,0x3d,0xef,0xf2,0x1, 0xc5,0xff, +0xf0,0x1, 0x2d,0x96,0x2b,0x6, 0x14,0x80,0xe8,0x40,0x3c,0x6e,0xe0,0x0, 0xd9,0xe1, +0x15,0x81,0xe8,0xb, 0x3d,0x9e,0xf0,0x40,0x3f,0x6b,0xf2,0x1, 0xc7,0x7f,0xe8,0x40, +0x3b,0xfe,0xf0,0x0, 0xc6,0x2, 0xe0,0x0, 0x1, 0x55,0xe8,0x0, 0x8f,0xcd,0xe7,0xfe, +0x23,0x6b,0xe8,0x7, 0x8f,0x4c,0xf8,0x7, 0x8d,0x5c,0xe7,0xfe,0x0, 0xe9,0x67,0x4, +0x39,0x63,0xe2,0x0, 0xcf,0x1, 0xe7,0xff,0x5, 0x13,0x67,0x3, 0xe8,0xe, 0x3f,0x1a, +0x37,0x21,0x3f,0x14,0x91,0x8e,0x39,0x63,0xe7,0xff,0x0, 0x8a,0xe0,0x41,0x3f,0x2, +0xe3,0xff,0xc7,0x7f,0x37,0x4f,0x27,0x8, 0xe0,0x41,0x3f,0x3, 0xe3,0xff,0xc7,0x7f, +0x37,0x4f,0xe7,0xff,0x2f,0xd, 0xe4,0x0, 0xc7,0x8a,0xe1,0xff,0x14,0x7e,0x3c,0x5f, +0x14,0x94,0xe0,0x4, 0xda,0x85,0xe4,0xe, 0x31,0xf, 0xe2,0xf, 0x3f,0x42,0x3f,0xae, +0xe3,0xff,0xc4,0x7f,0xe3,0xff,0xc7,0xff,0xe1,0x2f,0x3c,0x1f,0xe7,0xff,0x27,0xba, +0xe4,0xe, 0x31,0x8f,0xe2,0xf, 0x3f,0x43,0x3f,0xae,0xe3,0xff,0xc7,0xff,0xe1,0x2f, +0x3c,0x1f,0xe7,0xfe,0x2f,0xed,0x15,0x81,0xe8,0xb, 0x3d,0x9e,0xf0,0x40,0x3f,0x6b, +0xf2,0x1, 0xc7,0x7f,0xe8,0x40,0x3b,0xfe,0xf0,0x0, 0xc6,0x2, 0xe7,0xff,0x1, 0xaf, +0xc0,0x14,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x79,0x2, 0xf0,0xd, 0x34,0xa1,0xc6,0x9a, +0xf8,0x0, 0x9d,0x5d,0xf0,0x2, 0x3e,0x9d,0xf0,0x0, 0x15,0x81,0xe0,0x80,0x9c,0x12, +0x3c,0xe5,0xe0,0x4, 0xda,0x4d,0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0x78,0xf0,0x0, +0x13,0x81,0x14,0x81,0xf8,0x17,0x3b,0x9b,0xe8,0x9, 0x3c,0x99,0xe7,0xfe,0x1, 0xf3, +0xf8,0x40,0x3d,0x79,0xf0,0x40,0x3c,0xe9,0xf3,0xff,0xc4,0xff,0x5, 0x88,0xf8,0x40, +0x3d,0xe7,0xf2,0x1, 0xc5,0xff,0xf2,0x0, 0xcd,0x85,0x1, 0xe1,0x16,0xff,0xe8,0xd, +0x3e,0x9b,0x67,0x82,0x66,0x2, 0xe2,0x1, 0xc6,0xff,0x37,0xa1,0x3e,0x9c,0xc7,0xfe, +0x36,0xa1,0x3f,0x94,0x3e,0x94,0x97,0x1f,0x37,0x2, 0xe0,0x80,0xb7,0x1f,0x3f,0xfd, +0x1, 0xfb,0xe7,0xfe,0x2b,0x5f,0xe7,0xfe,0x0, 0xd8,0xe0,0x1, 0x1f,0x96,0xe0,0x1, +0x1f,0x15,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x3c,0x4f,0xe0,0x4, 0xd9,0x7b,0xe0,0x3, +0x1d,0x13,0xe0,0x3, 0x1d,0x94,0xe0,0x4, 0xd8,0x1c,0xe0,0x4, 0xd9,0xa1,0xe3,0xff, +0xc4,0x7f,0x7c,0x1, 0xe7,0xfd,0x0, 0xaf,0xf0,0x0, 0x7d,0x2, 0xf8,0x40,0x3c,0xea, +0xe7,0xff,0x0, 0xa5,0xf8,0x40,0x3c,0xea,0xf0,0x0, 0x7d,0x2, 0xe7,0xff,0x0, 0x9f, +0xe0,0x2, 0x1f,0xff,0x8f,0x8f,0xe2,0x0, 0xcf,0x83,0x1, 0x2, 0x38,0x82,0x8, 0xb1, +0xe0,0x1, 0x1f,0x14,0xe0,0x1, 0x1f,0xad,0x86,0x8e,0xe0,0x0, 0x17,0x5a,0xb7,0x1f, +0xb7,0x2f,0xe7,0xff,0x17,0x26,0xae,0x9f,0xb7,0x3f,0xe0,0x3, 0xda,0x8b,0xe0,0x0, +0x1f,0x8b,0x8c,0xf, 0x2c,0xa, 0xe0,0x0, 0x1f,0x8a,0x8c,0xf, 0x2c,0x2, 0x8, 0xe1, +0x14,0x81,0x8, 0xa1,0xe7,0xfc,0x0, 0xda,0x14,0x80,0xde,0x57,0x0, 0xf5,0xe0,0x2, +0x1f,0xff,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x2, 0x38,0x82,0xe0,0x0, 0x1f,0x8b, +0x8c,0xf, 0x24,0x7c,0x14,0x80,0xe7,0xfc,0x0, 0xc9,0x8, 0xb7,0xe1,0xff,0xc0,0x30, +0x14,0xc, 0xe0,0x0, 0x15,0x48,0x14,0x80,0x3c,0x10,0xe0,0x4, 0xdb,0xe7,0xe0,0x3, +0xda,0x61,0xe0,0x2, 0x1f,0xa8,0xe0,0x2, 0x1a,0x3f,0x87,0x8f,0xe0,0x3, 0x8f,0x24, +0xe2,0x0, 0xc7,0x81,0x3f,0x7f,0xe0,0x2, 0x1, 0x44,0x89,0x4, 0x8f,0xa4,0x3f,0x6f, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x20,0x3c,0xef,0x5, 0x82,0x14,0xa0,0xe2,0x1, +0xc4,0xff,0x39,0xe9,0xe0,0x2, 0x24,0xb9,0x12,0xff,0xe0,0x1, 0x1f,0xd1,0xfa,0x1a, +0x7b,0xbc,0x3a,0x99,0x8d,0x54,0xf9,0xff,0xc3,0xff,0xe3,0xff,0xc2,0xff,0x3d,0xe2, +0xf0,0x0, 0xa3,0xf, 0xe2,0x1, 0xc5,0xff,0xe8,0x5, 0x3a,0x97,0x35,0x21,0x17,0x80, +0x25,0x9c,0x14,0x98,0x3c,0xbf,0xe2,0x0, 0x7f,0x8c,0x3f,0x99,0xe0,0x1, 0x9c,0x1f, +0xa6,0x8f,0xe8,0x40,0x3f,0x66,0x17,0x80,0xc7,0x81,0xe3,0xff,0xc7,0xff,0x96,0xe, +0x3f,0xfb,0x3e,0x9c,0x3f,0x1a,0x1, 0xf9,0xe2,0x0, 0x7f,0x8c,0x3f,0x99,0xe0,0xe, +0x3d,0x98,0xbe,0x8f,0xe0,0x1, 0xb7,0x1f,0xe8,0x40,0x3a,0xf7,0xf0,0x0, 0xc3,0x2, +0x1, 0x4, 0xe8,0x80,0x8f,0x97,0x0, 0xdd,0x64,0x3, 0x5c,0x8f,0x12,0x8c,0x3a,0x90, +0xe0,0x4, 0xd9,0x1a,0xb4,0x65,0xe0,0x2, 0x9c,0xd5,0xa4,0x65,0xe0,0x4, 0xd9,0x14, +0xe0,0x2, 0xb4,0x25,0xe0,0x4, 0x9c,0x95,0xe0,0x1, 0xa4,0x45,0xe0,0x4, 0xd9,0xc, +0xe0,0x3, 0xb4,0x65,0xe0,0x0, 0x21,0xdc,0xf7,0xff,0x10,0x7f,0xe0,0x1, 0x1f,0xd1, +0xfa,0x1a,0x79,0xbc,0xf0,0x10,0x38,0x13,0xf0,0x0, 0x8a,0x54,0xf9,0xff,0xc1,0xff, +0xf3,0xff,0xc0,0x7f,0x3c,0xe2,0xf0,0x0, 0xa1,0xf, 0xe2,0x1, 0xc4,0xff,0xf8,0x10, +0x38,0x13,0xf0,0x14,0x32,0x21,0x15,0x0, 0xf0,0x40,0x38,0xe5,0x24,0xb8,0xe4,0x0, +0xc5,0x18,0xf0,0x0, 0x13,0x8, 0xe8,0xa, 0x3d,0x11,0xf0,0x0, 0x13,0x96,0x14,0x4, +0xf0,0x0, 0x92,0xea,0xf0,0x16,0x3b,0x1a,0xf0,0x17,0x3b,0x9a,0x3c,0x1a,0xe8,0x40, +0x3f,0x62,0x17,0x80,0xc5,0x14,0x0, 0x8e,0xa5,0x88,0x96,0xa, 0xc7,0x81,0xe3,0xff, +0xc7,0xff,0x3e,0x9b,0xc6,0x1, 0x3f,0xf9,0xbe,0x88,0xe8,0xe, 0x3f,0x14,0xb6,0xa, +0x1, 0x16,0x96,0x8e,0xe8,0x40,0x3e,0xf5,0x5, 0x70,0xe8,0x0, 0xa5,0x86,0xe8,0x0, +0x96,0x7, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3e,0x9b,0xc6,0x1, 0x3f,0xf9,0xe8,0x0, +0xbe,0x86,0xe8,0xe, 0x3f,0x14,0xe8,0x0, 0xb6,0x7, 0x1, 0xec,0xf8,0x40,0x39,0xf0, +0xf0,0x0, 0xc1,0x2, 0x1, 0x4, 0xe8,0x80,0x8d,0x13,0x0, 0xc1,0x13,0xc, 0x3b,0x10, +0xe0,0x0, 0x13,0xd4,0x3b,0x90,0x3a,0xe6,0xe0,0x1, 0x9f,0xa5,0x3c,0xef,0xe0,0x0, +0x27,0xfa,0xa4,0x15,0xe0,0x4, 0xd8,0xa0,0xb4,0x75,0xe0,0x1, 0x9f,0xb5,0x3c,0xef, +0xe0,0x0, 0x27,0xed,0xa4,0x25,0xe0,0x4, 0xd8,0x97,0xe0,0x1, 0xb4,0x5, 0xc2,0x98, +0x3b,0xf5,0x1, 0xeb,0xe0,0x0, 0x1f,0x8e,0x17,0x4, 0x3f,0x10,0xe0,0x1b,0x95,0x1f, +0x3d,0xee,0x17,0x80,0xe0,0x1, 0x14,0x16,0xe7,0xfe,0x14,0xea,0xe3,0xfe,0xcd,0x38, +0xe0,0x0, 0x3, 0x44,0xe0,0x1, 0x9e,0xb6,0xe2,0x0, 0xce,0xe3,0x5, 0xbe,0xe0,0x1, +0x96,0x86,0xe0,0xc, 0x37,0xa1,0xe3,0xfe,0xce,0xea,0xb6,0x8e,0x3e,0x1b,0x3, 0x3d, +0xb4,0x8c,0xc7,0x81,0xe2,0x0, 0xcf,0x83,0xc3,0x18,0xc7,0x2, 0x1, 0xe8,0xe0,0x0, +0x21,0xc5,0xe0,0x1, 0x1f,0xd1,0xea,0x1a,0x7a,0xbc,0xc1,0xff,0xe9,0xff,0xc2,0xff, +0xe3,0xff,0xc1,0xff,0xa4,0x8f,0xe2,0x1, 0xc1,0x7f,0x39,0x95,0x3c,0x65,0x17,0x80, +0xe0,0xb, 0x3c,0x25,0x21,0x15,0xe2,0x0, 0x7f,0x4, 0x37,0xa1,0x3f,0x9e,0x9d,0xf, +0x17,0x0, 0x8f,0xd4,0x3f,0xbe,0xc7,0x1, 0x3f,0x9b,0x37,0xa1,0x3f,0x99,0x96,0x8f, +0x3e,0x6e,0xe3,0xff,0xc6,0x7f,0x3e,0xaa,0x3e,0x72,0xb6,0x8f,0x4, 0xf3,0x3c,0x73, +0x1, 0x1c,0xe0,0x80,0x8f,0x98,0x0, 0xe5,0x96,0xf6,0xe0,0xc, 0x37,0xa1,0xe3,0xfe, +0xce,0xea,0xb6,0x8e,0x3e,0x1b,0x4, 0x45,0xe2,0x1, 0xce,0x96,0xe0,0xd, 0x37,0xa1, +0x3e,0x9b,0x5, 0x40,0xb4,0xd, 0xe7,0xff,0x0, 0xbe,0xe0,0x1, 0xb7,0x85,0xe7,0xff, +0x0, 0x98,0xb7,0xf5,0xe7,0xff,0x0, 0x8b,0xe0,0x0, 0xc0,0x50,0xb, 0xe1,0x89,0x14, +0x8f,0xb4,0xe7,0xfd,0x0, 0xbe,0x3c,0x69,0x39,0xe9,0xe7,0xfe,0x0, 0x81,0xe0,0x1, +0x1f,0xd1,0xe0,0x1, 0x1c,0x3e,0xa4,0x8f,0xe7,0xd1,0x0, 0x96,0x8, 0xb1,0xe0,0x1, +0xd1,0xaa,0x2c,0x5, 0xe0,0x2, 0x1f,0xfa,0xac,0xf, 0x8, 0xe1,0xe0,0x2, 0x1f,0xfa, +0x17,0x1, 0xaf,0xf, 0x8, 0xe1,0x8, 0xb1,0xe0,0x1, 0x1f,0xd1,0xe0,0x1, 0x1c,0x3e, +0xa4,0x8f,0xef,0xfe,0xd8,0x81,0xde,0x82,0xdc,0xa, 0xdc,0x4e,0xe0,0x1, 0xd1,0x93, +0x2c,0x5, 0xe0,0x2, 0x1f,0xfa,0xac,0xf, 0x8, 0xe1,0xe0,0x2, 0x1f,0xfa,0x17,0x1, +0xaf,0xf, 0x8, 0xe1,0xea,0x12,0x7f,0x98,0xe0,0x1, 0x17,0x2a,0xe0,0x2e,0x3c,0xe, +0xa6,0x8f,0x27,0x2, 0x26,0x89,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1f,0x2e,0x1, 0xe, +0x17,0xea,0xaf,0x8e,0x38,0x82,0xe0,0x1, 0x1f,0x2e,0x8e,0x8e,0xc6,0xff,0xae,0x8e, +0x16,0x80,0xbe,0x8f,0x17,0xea,0xaf,0x8e,0x38,0x82,0xe2,0x0, 0xcc,0x9, 0x1, 0xf9, +0x16,0x82,0xbe,0x8f,0x0, 0xee,0xe2,0x1, 0xcc,0x6b,0x1, 0x22,0xea,0x12,0x7f,0x14, +0x8e,0xe, 0x16,0x81,0x3e,0x9c,0xea,0x1a,0x7f,0xdc,0xe2,0x1, 0xc6,0xff,0xe9,0xff, +0xc7,0xff,0xe2,0x0, 0xce,0x83,0x3f,0x9c,0x8c,0xf, 0x1, 0x8c,0x16,0x80,0xea,0x12, +0x7f,0x98,0xae,0x8e,0x17,0x0, 0xbf,0xf, 0x17,0x6b,0xe0,0x1, 0x1f,0xae,0xaf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0xae,0xae,0x8e,0x17,0x6b,0xaf,0xf, 0x38,0x82,0xea,0x12, +0x7f,0x94,0x17,0x1, 0xaf,0xf, 0x17,0x6b,0xe0,0x1, 0x1f,0xae,0xaf,0xf, 0x38,0x82, +0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0x5, 0x82,0x38,0x82, +0x3c,0x69,0xe7,0xff,0x0, 0xa9,0xe0,0x1, 0x1f,0xfd,0xea,0x12,0x7f,0x16,0x8c,0xf, +0xe0,0xd, 0x34,0x22,0x9f,0x8e,0xc6,0x81,0x3f,0xfd,0x5, 0x4, 0xe0,0x1, 0x14,0x7f, +0x38,0x82,0xc7,0x81,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xb7,0x8e,0x1, 0xb, +0xe2,0x0, 0xcf,0x82,0x1, 0x76,0xe0,0x2, 0x1f,0x74,0xa7,0xe, 0x3f,0x9e,0xe0,0x40, +0x8c,0x3f,0x38,0x82,0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0x8c,0x3f,0x38,0x82,0xe0,0x1, +0x1e,0xe0,0x17,0x6, 0xac,0xd, 0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f, +0xe2,0x0, 0xc7,0x5, 0x27,0xc, 0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0x85,0x17,0x1, +0xe0,0x4, 0xaf,0x7f,0x5, 0x8a,0x17,0x80,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1f,0x85, +0x17,0x3, 0xe0,0x4, 0xaf,0x7f,0x38,0x82,0x38,0x82,0x8, 0xb3,0x39,0xe9,0x2c,0x1d, +0xe0,0x0, 0x1f,0x23,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0x3a,0xe0,0x1, 0x1e,0xe0, +0x17,0x6, 0xa9,0x8d,0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f,0xe2,0x0, +0xc7,0x5, 0x2f,0x23,0xe0,0x2, 0x1f,0x85,0x17,0x3, 0xe0,0x4, 0xaf,0x7f,0x17,0x1, +0xe0,0x2, 0x1f,0xd8,0xaf,0xf, 0x9, 0xe1,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x81,0x39,0x68,0x5, 0xa1,0xe4,0x1, 0xcc,0x0, 0xe2,0x0, 0xcc,0x6f, +0x5, 0xa3,0xe2,0x1, 0xc9,0x7c,0x1, 0x22,0xe2,0x1, 0xc9,0x7d,0x1, 0x19,0xe0,0x2, +0x1f,0xd8,0x17,0x1, 0xaf,0xf, 0x9, 0xe1,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0x85, +0x17,0x1, 0xe0,0x4, 0xaf,0x7f,0x5, 0xf4,0x17,0x80,0xaf,0x8d,0x0, 0xf1,0xe0,0x2, +0x1f,0x28,0x8f,0xe, 0x2f,0x44,0x9, 0xe1,0x3c,0x69,0xdf,0x1d,0x0, 0xe6,0xe0,0x0, +0x1f,0xa0,0xa9,0x8f,0x9, 0xe1,0xd5,0x9e,0x0, 0xdd,0x3c,0x63,0x9, 0xa1,0xe7,0x83, +0x0, 0xff,0xe0,0x0, 0x24,0x52,0xe2,0x0, 0xcc,0x3, 0x2, 0x91,0xe0,0x0, 0x1f,0x95, +0x8f,0x8f,0xe0,0x0, 0x2f,0xcf,0xe0,0x0, 0x1f,0x13,0xe0,0x1, 0x1e,0xf8,0x3f,0xee, +0xbf,0xd, 0x3c,0x1f,0xe0,0x40,0x8f,0x98,0x3c,0x6f,0x38,0x82,0xe2,0x0, 0xcc,0x5f, +0xe0,0x0, 0x5, 0xc8,0x17,0xad,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x5, 0xc5,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x5, 0xd5,0xe0,0x0, 0x17,0xe7,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x81,0xe0,0x0, 0x5, 0xe6,0xe7,0xff,0x17,0x80,0x3f,0x98,0x3f,0x6f,0xe2,0x1, +0xc7,0x7f,0xe2,0x0, 0xcf,0x6f,0x5, 0xb4,0xe2,0x1, 0xcc,0x7c,0xe0,0x1, 0x1, 0xd, +0xe2,0x1, 0xcc,0x7d,0xe0,0x1, 0x1, 0xf, 0xe2,0x1, 0xcc,0x7e,0xe0,0x1, 0x17,0xff, +0x1, 0x8e,0xe0,0x2, 0x1f,0x8d,0x17,0x5, 0x8f,0x8f,0x3f,0x3f,0xe0,0x2, 0x1f,0xed, +0x3f,0x9e,0x8f,0x8f,0x0, 0x84,0xe0,0x1, 0x1f,0xe0,0x8f,0x8f,0x3c,0x6f,0x38,0x82, +0xe0,0x1, 0x1f,0x2f,0xe0,0x1, 0x1e,0xf8,0x3f,0xee,0xbf,0xd, 0xe7,0xff,0x0, 0xb3, +0xe0,0x1, 0x1f,0xf8,0xa7,0x8f,0xe7,0xff,0x0, 0xae,0xe2,0x1, 0xcc,0x53,0x1, 0x11, +0xe0,0x1, 0x1f,0x2e,0x8f,0x8e,0xc7,0xff,0xaf,0x8e,0xe7,0xfd,0x0, 0xfe,0xe2,0x1, +0xcc,0x0, 0xe0,0x0, 0x1, 0x65,0xe0,0x2, 0x1f,0x5, 0x3f,0x9e,0x8f,0x8f,0x0, 0xdf, +0xea,0x12,0x7f,0x96,0x17,0x0, 0xb7,0xf, 0x0, 0xf1,0xe2,0x1, 0xcc,0x6b,0xe0,0x0, +0x1, 0x46,0xea,0x12,0x7f,0x14,0x8e,0xe, 0x16,0x81,0x3e,0x9c,0xea,0x1a,0x7f,0xdc, +0xe2,0x1, 0xc6,0xff,0xe9,0xff,0xc7,0xff,0xe2,0x0, 0xce,0x83,0x3f,0x9c,0x8f,0x8f, +0x1, 0x25,0xae,0x8e,0x16,0xeb,0xe0,0x1, 0x1f,0x2e,0xae,0x8e,0x0, 0xc0,0xe0,0x2, +0x1f,0x5, 0x16,0xe0,0xe0,0x2, 0x8f,0x8e,0x3e,0x9f,0xe2,0x0, 0xce,0x9f,0x2, 0x9d, +0xe0,0x1, 0x1e,0xaa,0x3f,0x9d,0xe0,0x44,0x8f,0x8f,0xe0,0x2, 0x8e,0x8e,0xe2,0x1, +0xcc,0x1a,0xc6,0x81,0xe0,0x2, 0xae,0x8e,0xe7,0xff,0x1, 0xaa,0xe0,0x1, 0x1f,0x2e, +0xe7,0xff,0x16,0x99,0xae,0x8e,0xe7,0xff,0x0, 0xa3,0xea,0x12,0x7e,0x98,0x16,0x0, +0xae,0xe, 0x17,0x0, 0xbf,0xd, 0x0, 0xd7,0xe0,0x1, 0x1f,0xa3,0xe0,0x2, 0x8e,0x8e, +0xe3,0xff,0xc7,0xff,0x3f,0x9d,0x8f,0x8f,0x0, 0xe1,0xea,0x12,0x7f,0x94,0x17,0x1, +0xaf,0xf, 0x3f,0xe8,0x0, 0xc8,0xe0,0x2, 0x1f,0x85,0xe0,0x4, 0x8f,0xff,0xe7,0xff, +0x0, 0x87,0xe0,0x0, 0x1f,0xa0,0x8f,0x8f,0xe7,0xff,0x0, 0x82,0xe7,0xd9,0x0, 0xd6, +0xe0,0x1, 0x1f,0xe0,0x9f,0x8f,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x86,0xe2,0x0, +0xcf,0x84,0x1, 0x5, 0x14,0x0, 0x38,0x82,0xe7,0xfe,0x0, 0x9d,0xe7,0x74,0x0, 0xf7, +0xe0,0x1, 0x1f,0xe0,0x9f,0x8f,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x85,0xe2,0x0, +0xcf,0x84,0x1, 0x4, 0x38,0x82,0xe7,0xfd,0x0, 0xba,0xe7,0x6f,0x0, 0xed,0x8, 0xb4, +0xe0,0x0, 0x1f,0xac,0xa1,0xf, 0xa7,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x97,0xa7,0x2, +0x17,0xfe,0x3f,0x5f,0xea,0x12,0x7f,0x9e,0xbf,0x2, 0x8f,0xf, 0x27,0x22,0xe0,0x0, +0x1a,0x23,0xe0,0x1, 0x19,0xae,0x17,0x81,0x8c,0xf2,0xaf,0x84,0x8c,0x3, 0xdf,0xd9, +0x17,0x0, 0xaf,0x4, 0x8f,0x83,0xc7,0x81,0xaf,0x83,0xa7,0x82,0x37,0xc1,0xe2,0x0, +0xc7,0x81,0x2f,0x82,0xa, 0x61,0xa7,0x2, 0x16,0xfd,0xe0,0x1, 0x1f,0xae,0x3f,0x5d, +0xbf,0x2, 0x8f,0xf, 0xc7,0x1, 0xaf,0xf, 0x8c,0xf, 0xdf,0xb3,0xac,0x72,0xa, 0x61, +0x17,0x1, 0xaf,0xf, 0x87,0x72,0xe0,0x1, 0x1f,0xae,0xaf,0xf, 0x8c,0xf, 0xdf,0xa9, +0xac,0x72,0xa, 0x61,0xe0,0x0, 0x1f,0xac,0x16,0x7e,0xa6,0x8f,0xea,0x12,0x7f,0x9e, +0xa7,0x3d,0x3f,0x5c,0xbf,0x3d,0x17,0x0, 0xaf,0xf, 0x38,0x82,0x8, 0xb4,0xe0,0x1, +0x1a,0x2f,0xe0,0x1, 0x19,0xe0,0x11,0x0, 0x15,0x3e,0xe0,0x1, 0x14,0xff,0x3c,0x64, +0xa9,0x3, 0xe0,0x4, 0xd8,0x2b,0xe0,0x0, 0x1c,0x13,0x15,0x3e,0xe0,0x1, 0x14,0xff, +0xe0,0x4, 0xd8,0x24,0xe0,0x1, 0x1f,0xf8,0xba,0xf, 0xef,0xfd,0xd0,0x7a,0xea,0x12, +0x7f,0x9e,0xe0,0x1, 0x1f,0x2e,0xa9,0xf, 0xe0,0x0, 0x1f,0xac,0xa9,0xe, 0xa7,0x8f, +0x81,0x83,0xa9,0xff,0xa, 0x61,0x0, 0x0, 0x8, 0xb2,0xe0,0x0, 0x14,0x50,0xe0,0x2, +0xdb,0x75,0xe0,0x0, 0x14,0xda,0x39,0x68,0xe0,0x0, 0x14,0x50,0xe0,0x2, 0xdb,0x8c, +0xe1,0xd, 0x14,0x6, 0xe0,0x2, 0xdb,0x6a,0xe0,0x0, 0x14,0xff,0x3c,0xd8,0xe0,0x1, +0xcc,0x80,0xe1,0xd, 0x14,0x6, 0xe0,0x2, 0xdb,0x7f,0xe2,0x0, 0xc9,0x5a,0x1, 0x6, +0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x2, 0xdb,0x77,0xe0,0x0, 0x14,0xda,0x14,0x4, +0xe0,0x2, 0xdb,0x72,0xe0,0x0, 0x14,0xda,0x14,0x5, 0x9, 0x21,0xe0,0x56,0x0, 0xec, +0x8, 0xb4,0xe0,0x1, 0x19,0xff,0x15,0x4, 0x3c,0xe3,0x14,0x0, 0xef,0xfd,0xd6,0x22, +0x9d,0x13,0x17,0xf8,0x3f,0x9a,0xe2,0x1e,0xcf,0xf7,0x12,0x0, 0x2, 0x96,0x11,0x7e, +0x39,0x1a,0xe3,0xff,0xc1,0x7f,0x3c,0xe3,0x3d,0x62,0x14,0x2, 0x99,0x83,0xef,0xfd, +0xd6,0x11,0xe0,0x1, 0x1c,0x7e,0x3d,0xe4,0x3d,0x64,0xe0,0x9, 0x31,0x41,0x34,0x41, +0xe0,0x2, 0xdf,0xcc,0xe0,0x24,0x39,0x88,0x3c,0x64,0xa, 0x61,0xe0,0x2, 0x1f,0xa8, +0x8f,0x8f,0x27,0x8f,0x8, 0xb2,0xe0,0x0, 0x19,0x28,0xdf,0xd3,0xac,0x2, 0x8f,0x82, +0x2f,0x87,0xdf,0xcf,0xac,0x2, 0x8f,0x82,0x2f,0x83,0xdf,0xcb,0xac,0x2, 0x9, 0x61, +0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8a, +0xe0,0x2, 0x1f,0x81,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0x5, 0x82,0x38,0x82,0xe0,0x2, 0x1f,0x8d,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xfa, +0x8, 0xb4,0xe0,0x2, 0x19,0x72,0x9f,0x82,0xe2,0x0, 0xcf,0x82,0x2, 0x82,0xa, 0x61, +0xe0,0x0, 0x1f,0x9e,0xeb,0xe6,0x79,0x98,0x9c,0xf, 0xe0,0x4, 0xd7,0xc2,0xe0,0x4, +0xd7,0xc4,0xe0,0x0, 0x14,0xff,0xe0,0x4, 0xd5,0x3f,0xe0,0x1, 0x17,0x8b,0x3f,0x98, +0xe0,0x0, 0x14,0x50,0xb7,0x83,0xe0,0x2, 0xda,0xe1,0x3a,0x68,0xe0,0x0, 0x14,0xda, +0xe0,0x0, 0x14,0x50,0xe0,0x2, 0xda,0xf8,0x8c,0x93,0xe1,0x20,0x14,0x0, 0xe0,0x2, +0xda,0xf3,0x8c,0x83,0xe1,0x20,0x14,0x1, 0xe2,0x0, 0xc4,0x83,0xe0,0x2, 0xda,0xec, +0x14,0x8a,0xe1,0x23,0x14,0x4, 0xe0,0x2, 0xda,0xe7,0xe2,0x0, 0xca,0x5a,0x1, 0x6, +0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x2, 0xda,0xdf,0x17,0x80,0xb7,0x82,0xa, 0x61, +0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8b,0xe0,0x2, +0x1f,0x81,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x1, 0x6, 0x27,0x8c,0xe2,0x0, 0xcf,0x81, +0x1, 0xe, 0x38,0x82,0xe0,0x2, 0x1f,0xfd,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x7, +0x2f,0xf9,0xe0,0x1, 0x14,0xc8,0x14,0x0, 0xe0,0x54,0x0, 0xc3,0xe0,0x1, 0x14,0xc8, +0x14,0x1, 0xe0,0x54,0x0, 0xbe,0x3f,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe0,0x1, +0x1f,0xb1,0xe0,0x1, 0x1f,0x6c,0x16,0x0, 0xa7,0x8f,0xae,0xe, 0xe0,0x1, 0xa7,0xff, +0x37,0xc2,0xe2,0x0, 0xc7,0x81,0x27,0x95,0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1e,0xee, +0xa7,0x8f,0xa6,0xd, 0xa6,0x9f,0xce,0x90,0xbe,0x9f,0xe0,0x0, 0x16,0xd4,0xb6,0xdc, +0x8e,0xfc,0x16,0x6f,0xe2,0x0, 0xc6,0x83,0xae,0x8e,0xa6,0x9f,0x3e,0xdc,0xbe,0x9f, +0xe0,0x2, 0x1b,0xa8,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x5d,0x8f,0xe, +0xe0,0x1, 0x27,0x1b,0xe0,0x0, 0x1f,0x28,0x8a,0xe, 0xe0,0x0, 0x22,0x72,0xe0,0x1, +0x1f,0xde,0x12,0x3, 0xa2,0x8f,0xe0,0x2, 0x1f,0xee,0xe0,0x1, 0x19,0xff,0xa1,0xf, +0xf0,0x0, 0x17,0x54,0xf0,0x40,0x3e,0xe4,0xf0,0x0, 0x14,0x50,0xf0,0x0, 0x16,0x5a, +0x13,0x5, 0xf7,0x24,0x15,0x82,0xf7,0x24,0x15,0x3, 0xf7,0x24,0x14,0x84,0xa7,0x95, +0xcf,0x90,0xbf,0x95,0x17,0xf8,0x9c,0x3, 0x3f,0x98,0xe2,0x1e,0xcf,0xf8,0xe0,0x1, +0x2, 0x96,0xf0,0x0, 0xb7,0x52,0xc4,0x7e,0xf0,0x0, 0xae,0xb2,0xe3,0xff,0xc4,0x7f, +0xf0,0x0, 0xb4,0x52,0xe2,0x0, 0xcc,0x8, 0xf0,0x0, 0xae,0x32,0xe0,0x0, 0x5, 0xeb, +0x16,0x80,0xf7,0xff,0x13,0xfd,0x3f,0x6d,0x17,0x88,0x3e,0x6d,0xf0,0x17,0x3b,0x98, +0x26,0x21,0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0xf0,0x40,0x3b,0x6c,0xe0,0xb, 0x39,0x9f, +0x8c,0x8b,0x15,0x83,0x15,0x1, 0x3d,0x9d,0xb7,0x52,0x3d,0x1e,0xe8,0x40,0x3d,0xf6, +0xc7,0x81,0x3f,0x6a,0xac,0xb2,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc7,0xff,0xe0,0x0, +0x3, 0x47,0xf0,0x2e,0x3b,0x9f,0xe0,0x0, 0x27,0x46,0xe1,0x2e,0x3c,0x1f,0xe0,0x0, +0x27,0x42,0xe0,0xc, 0x39,0x9f,0x8d,0xc, 0x8d,0xac,0x8f,0x1c,0x8e,0xbc,0x35,0x28, +0xe0,0xc, 0x35,0xa8,0x3e,0x9c,0x3f,0x1a,0xc7,0x84,0xe3,0xff,0xc7,0x7f,0xe3,0xff, +0xc6,0xff,0xe3,0xff,0xc7,0xff,0xf0,0x40,0x3b,0x66,0x16,0x5, 0x0, 0xd0,0xe0,0x1, +0x1f,0x5e,0xa2,0x8e,0xe0,0x2, 0x1f,0x6e,0xa1,0xe, 0xe0,0x0, 0x2f,0xcc,0xa7,0x15, +0xe0,0x0, 0x16,0xd0,0xcf,0x10,0xbf,0x15,0xe0,0x0, 0x16,0x5a,0xb6,0xd2,0xe7,0x24, +0x17,0x10,0xae,0x32,0xb7,0x52,0xaf,0xb2,0xb6,0xd2,0x17,0x6f,0xaf,0xb2,0xa7,0x95, +0x3f,0xde,0xbf,0x95,0x22,0x9, 0xdf,0x1d,0xe0,0x2, 0x1f,0x3a,0x17,0x87,0xaf,0x8e, +0xe0,0x2, 0x1f,0x3b,0xaf,0x8e,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x3c,0x7f,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0xb5,0xd2,0xe7,0x24,0x16,0x5, 0x8f,0xf2,0xf0,0x0, 0xb5,0x52, +0xe4,0xd, 0x37,0xa8,0x8f,0xf2,0xf0,0x0, 0xb4,0xd2,0xe4,0xf, 0x37,0xa0,0x8f,0x72, +0xb6,0x52,0x3f,0x9d,0x8e,0xf2,0x37,0x28,0x3f,0x9d,0xa6,0x93,0x3f,0x9e,0xf0,0x0, +0xb4,0x52,0x17,0x0, 0x3f,0xfd,0xaf,0x32,0x1, 0x22,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xc2,0x7f,0xbf,0x95,0xe2,0x1, 0xc2,0x7f,0xe7,0xfe,0x2a,0x5b,0x8f,0x87,0xe7,0xff, +0x27,0xb8,0xa7,0x95,0xe0,0x0, 0x17,0x50,0xcf,0x90,0xbf,0x95,0xe0,0x0, 0x16,0x5a, +0xb7,0x52,0xe7,0x24,0x16,0x90,0xae,0x32,0x17,0x80,0xb6,0xd2,0xaf,0xb2,0xb7,0x52, +0xe7,0xff,0x0, 0xb5,0x86,0xe, 0xae,0xe, 0xe7,0xfe,0x0, 0xa3,0xe0,0x0, 0x17,0xf0, +0xb7,0xd2,0x16,0x2a,0xae,0x32,0x3c,0x66,0xef,0xfd,0xdb,0x61,0xe0,0x0, 0x16,0xf6, +0xb6,0xd2,0xe0,0x0, 0x17,0x75,0x8f,0xf2,0xb7,0x52,0x37,0xa8,0x8e,0xf2,0x9f,0x13, +0x3f,0x9d,0xe3,0xff,0xc7,0xff,0x3f,0x7f,0x1, 0xc9,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xbf,0x95,0x12,0x1, 0x8f,0x87,0x0, 0xcc,0x8, 0xb3,0x39,0x68,0xe0,0x0, 0x14,0x50, +0xe0,0x2, 0xd9,0x6c,0x39,0xe8,0xe0,0x0, 0x14,0xda,0xe0,0x0, 0x14,0x50,0xe0,0x2, +0xd9,0x83,0x3c,0x62,0xe0,0x2, 0xd8,0xed,0xe2,0x0, 0xc9,0xda,0x39,0x68,0x1, 0x6, +0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x2, 0xd9,0x77,0x3c,0x62,0x9, 0xe1,0x8, 0xb1, +0xc0,0x7c,0x15,0x2, 0x14,0x86,0x3c,0x90,0x3c,0x6a,0xef,0xfd,0xd4,0x2b,0x5c,0x3, +0x15,0x2, 0xe2,0x0, 0x7c,0x84,0xef,0xfd,0xd4,0x25,0x4f,0x4, 0x4f,0x85,0x3f,0x9e, +0xe2,0x1, 0xcf,0xff,0xe0,0x2, 0x1f,0x85,0x1, 0x2, 0x17,0x7f,0xe0,0xc, 0xaf,0x4f, +0xc0,0x4, 0x8, 0xe1,0xe0,0x0, 0x1f,0xa0,0x8f,0x8f,0xe2,0x0, 0xcf,0xda,0x1, 0x2, +0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf,0x37,0xcf,0xe2,0x0, 0xc7,0x81, +0x2f,0xf8,0xe7,0xfb,0x0, 0xb3,0xe0,0x0, 0x1f,0xa0,0x8f,0x8f,0xe2,0x0, 0xcf,0xda, +0x1, 0x2, 0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf,0x37,0xcf,0xe2,0x0, +0xc7,0x81,0x2f,0xf8,0xe7,0xfb,0x0, 0xa2,0xe0,0x1, 0x1f,0xa3,0xe0,0xa, 0x8f,0xdf, +0x27,0xab,0xe0,0x1, 0x1f,0x9d,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xbf, +0xe0,0x0, 0x1, 0x65,0x8f,0x6f,0x37,0x26,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe2,0x0, +0xcc,0x3f,0x2, 0x9b,0xe0,0x1, 0x1f,0x85,0xe0,0x1, 0x1f,0x4, 0x8f,0x8f,0x8f,0xe, +0xe0,0xd, 0x37,0xa8,0x17,0xbf,0xe0,0x8, 0x3f,0xa8,0xe0,0xf, 0x3f,0x4d,0xe0,0x1, +0x1f,0x3, 0x3f,0xb8,0x8c,0xe, 0x37,0xc8,0x3f,0xf8,0x3f,0x68,0xe0,0x6e,0x3d,0xaf, +0x3c,0x2e,0xe3,0xff,0xc4,0x7f,0x38,0x82,0xe0,0x1, 0x1f,0x82,0xe0,0x1, 0x1e,0x81, +0x8f,0x8f,0xc7,0x41,0x8e,0x8d,0x3c,0x7e,0x37,0xa8,0xe0,0xc, 0x3e,0xcf,0x3, 0x3d, +0xe0,0x1, 0x1f,0x80,0xe0,0x0, 0x1f,0x7f,0x8d,0x8f,0x8e,0x8e,0xe0,0x0, 0x1f,0xfe, +0xe0,0x0, 0x1f,0x7d,0x35,0xa8,0x8f,0x8f,0x3e,0xcb,0x8f,0xe, 0x3c,0x7d,0x37,0xa8, +0x3f,0x4f,0xe0,0x0, 0x3, 0x46,0xe0,0x0, 0x1f,0xfc,0xc6,0xff,0x8d,0x8f,0xe0,0x0, +0x1f,0xfb,0x35,0xa8,0x8f,0x8f,0x3e,0xa8,0xe0,0x8, 0x3f,0xcb,0x3e,0xb8,0xc7,0x7f, +0x36,0xc8,0x3f,0x2d,0xe0,0x1, 0x1f,0x83,0x8c,0xf, 0x3f,0x78,0x4, 0xcb,0xe0,0x0, +0x1f,0xfa,0x3c,0x6e,0x8f,0x8f,0xe0,0xf, 0x3e,0x2f,0x3e,0xef,0xe3,0xff,0xc6,0xff, +0x3f,0x7d,0xe0,0x68,0x3a,0xaf,0xe7,0xff,0x0, 0xbe,0x8f,0x7f,0x37,0x26,0xc7,0x7f, +0xe3,0xff,0xc7,0x7f,0xe7,0xff,0x0, 0x9d,0xe0,0x0, 0x1f,0xf9,0xe0,0xe, 0x3c,0x2e, +0x8e,0x8f,0xe0,0x0, 0x1f,0xf8,0x36,0xa8,0x8f,0x8f,0xe0,0x8, 0x3f,0xcd,0xe0,0x0, +0x1f,0xfa,0x3c,0x3e,0x8f,0x8f,0xe0,0xe, 0x34,0x48,0x3f,0x7f,0x16,0xff,0x3e,0x9f, +0xe0,0x6e,0x3b,0xad,0xe0,0x8, 0x3e,0x2f,0x3c,0x1e,0xe7,0xff,0x0, 0x9c,0xe0,0x0, +0x1f,0xf7,0xe0,0xd, 0x3c,0x2d,0x8d,0x8f,0xe0,0x0, 0x1f,0xf6,0x35,0xa8,0x8f,0x8f, +0xe0,0x8, 0x3f,0xcb,0x3e,0xb8,0x36,0xc8,0x3f,0x1d,0xe7,0xff,0x0, 0xbd,0xe0,0x1, +0x1f,0xa3,0x3e,0xe8,0xe0,0xa, 0x8f,0xdf,0x27,0xaa,0xe0,0x1, 0x1f,0x9d,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xbf,0xe0,0x0, 0x1, 0x58,0x8f,0x7f,0x37,0x26, +0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe2,0x0, 0xce,0xbf,0x2, 0x9a,0xe0,0x0, 0x1f,0xf5, +0xe0,0x0, 0x1f,0x74,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x17,0x3f,0x3f,0x2d,0xe0,0xd, +0x3c,0x4f,0xe0,0x0, 0x1f,0xf3,0x3f,0x3d,0x8c,0xf, 0x37,0x8, 0x3f,0x78,0x3f,0xe8, +0xe0,0x6f,0x3d,0x2e,0x3c,0x2f,0xe3,0xff,0xc4,0x7f,0x38,0x82,0x38,0x82,0xe0,0x0, +0x1e,0x72,0xe0,0x0, 0x1f,0xf1,0x8c,0xc, 0x16,0x41,0x8f,0x8f,0x3e,0x1e,0x3e,0xfc, +0x37,0xa8,0xe0,0xb, 0x3c,0x4f,0x3, 0x30,0xe0,0x0, 0x1f,0xf0,0x8e,0xf, 0xe0,0x0, +0x1f,0xef,0x36,0x28,0x8c,0xf, 0xe0,0x0, 0x1f,0xee,0x34,0x28,0x8f,0xf, 0xe0,0x0, +0x1f,0xed,0x3f,0x4c,0x8f,0x8f,0x3e,0xfe,0x3f,0xc8,0xe0,0x0, 0x3, 0x4a,0xe0,0x0, +0x1e,0x6c,0xe0,0x0, 0x1d,0x6b,0x8e,0xc, 0x8c,0xa, 0x36,0x28,0x3c,0x4c,0x3f,0x2d, +0x3f,0x38,0x14,0x7f,0x3c,0x1f,0x37,0x8, 0x3c,0x2e,0xe0,0x0, 0x1f,0xf3,0x8f,0x8f, +0x3c,0x7f,0x3, 0x2b,0x3c,0x6f,0x38,0x82,0x8f,0x6f,0x37,0x26,0xc7,0x7f,0xe3,0xff, +0xc7,0x7f,0xe7,0xff,0x0, 0xaa,0x17,0xe2,0x3f,0x9e,0x3e,0xff,0x14,0x0, 0xe7,0xff, +0x3, 0x3f,0xe0,0x0, 0x1f,0xea,0xe0,0x0, 0x1e,0x69,0x8f,0x8f,0x8c,0xc, 0xc7,0x40, +0x37,0xa8,0xe0,0xe, 0x3e,0xae,0x3c,0x4f,0xe0,0x0, 0x1f,0xe8,0x3f,0x38,0x8f,0x8f, +0x37,0x8, 0x3f,0x7f,0x16,0xff,0x3e,0x9f,0xe0,0x6e,0x3b,0x2d,0xe0,0x8, 0x3d,0xaf, +0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x38,0x82,0xe0,0x0, 0x1f,0xe8,0x8f,0x8f,0xe0,0xf, +0x3d,0xaf,0x3f,0xf8,0xe0,0x68,0x3d,0x2f,0xe3,0xff,0xc4,0x7f,0x38,0x82,0xe0,0x0, +0x1e,0x67,0xe0,0x0, 0x1d,0x66,0x8e,0xc, 0x8c,0xa, 0x36,0x28,0x3c,0x4c,0xe0,0xe, +0x3e,0xae,0x3f,0x38,0xe0,0x8, 0x37,0x8, 0x3c,0x1f,0xe7,0xff,0x0, 0xb8,0x8, 0xb3, +0xe0,0x2, 0x1f,0xa0,0x8f,0x8f,0x2f,0xb2,0xe0,0x2, 0x1f,0x1f,0xe0,0x2, 0x1e,0x99, +0x8f,0xe, 0xaf,0x8d,0x2f,0x37,0xe0,0x1, 0x1f,0x9c,0x15,0xa, 0x89,0x8f,0xe0,0x2, +0x1c,0xa1,0x3d,0x33,0xe0,0x2, 0x1c,0x1c,0xe0,0x4, 0xd4,0x16,0xe0,0x1, 0x1f,0xa3, +0xe0,0xa, 0x8f,0xdf,0x27,0x9a,0x21,0x99,0xc1,0xff,0x39,0x63,0xe2,0x1, 0xc1,0x7f, +0x11,0x81,0x39,0x92,0x17,0x8a,0xe0,0x2, 0x19,0x21,0x3f,0xb3,0x39,0xe2,0x39,0x9f, +0x9c,0x2, 0xc1,0xa, 0xde,0x8a,0xe0,0x5, 0xb4,0x52,0xe0,0x40,0x9c,0x42,0xdf,0x28, +0x39,0x73,0xe0,0x5, 0xb4,0x62,0x1, 0xf5,0x9, 0xe1,0xe0,0x2, 0x1f,0x1f,0xe0,0x2, +0x1e,0x99,0x17,0x81,0x8f,0xe, 0xaf,0x8d,0x2f,0x4f,0xe0,0x2, 0x1f,0x1e,0xaf,0x8e, +0x0, 0xcb,0xe0,0x2, 0x1f,0x18,0x16,0x81,0xae,0x8e,0xe0,0x2, 0x1f,0x17,0xaf,0x8e, +0x0, 0xc3,0xe0,0x0, 0x1e,0x38,0x8f,0x8c,0x2f,0x97,0xea,0x12,0x7f,0xac,0x9e,0x8f, +0xe0,0x1, 0x1f,0x2d,0x2e,0x8a,0xe0,0x1, 0x1e,0x96,0x8e,0xd, 0xe0,0x1, 0x1e,0x95, +0x36,0x28,0x8e,0x8d,0x3e,0xcc,0xb6,0x8f,0xe0,0x2, 0x1e,0xa0,0x8e,0x8d,0x26,0xa0, +0x97,0x8f,0xb7,0x9e,0x38,0x82,0xe0,0x2, 0x1f,0x85,0xe0,0x1, 0x1f,0x2d,0x8e,0x8f, +0x8c,0x1f,0x8c,0xaf,0x8d,0x3f,0x8d,0xdf,0xea,0x12,0x7f,0xac,0x36,0xa5,0x34,0x25, +0x34,0xa5,0x35,0x25,0x35,0xa5,0xf0,0x0, 0x13,0x80,0xf0,0x0, 0xab,0x8c,0xb6,0x9e, +0xb4,0x2e,0xb4,0xce,0xb5,0x5e,0xe0,0x1, 0xb5,0x9e,0xb6,0x8f,0x0, 0xd4,0xe0,0x1, +0x1f,0x87,0x8e,0x8f,0xe0,0x1, 0x1f,0x86,0x36,0xa8,0x8f,0x8f,0x3f,0xcd,0xb7,0x9e, +0x38,0x82,0x17,0xdd,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8c,0x2, 0x9b, +0x17,0x1, 0xe0,0xf, 0x37,0x3f,0xe2,0x30,0xc7,0xa9,0x2f,0x9d,0xe2,0x0, 0xcc,0x25, +0x1, 0x92,0xe0,0x0, 0x1f,0xa3,0x8f,0x8f,0x3f,0xfe,0x1, 0x16,0xe0,0x2, 0x1f,0x5, +0x17,0x81,0xe0,0x4, 0xac,0xde,0xe0,0x0, 0x1f,0x38,0xaf,0x8e,0xe0,0x2, 0x1f,0x22, +0xaf,0x8e,0x38,0x82,0xe0,0x2, 0x1f,0x85,0x17,0x1, 0x3c,0x1f,0xe0,0x0, 0x1f,0xb8, +0xac,0x88,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xa8,0x8f,0x8f,0x2f,0xe8,0x0, 0xfb, +0xe0,0x43,0x3f,0x9, 0x3f,0x7a,0x2, 0x23,0xe0,0x2, 0x1f,0xbf,0xf0,0x0, 0x8b,0x5f, +0xe0,0x1, 0x1f,0xd1,0xf0,0x0, 0xa3,0x8f,0xe8,0xf, 0x3f,0x36,0x3f,0x98,0x37,0xa1, +0xe8,0xf, 0x3f,0x97,0x97,0x8f,0x3f,0xfb,0x4, 0x7, 0xe0,0x0, 0x0, 0xf4,0x97,0x8f, +0x3f,0xfb,0xe0,0x0, 0x3, 0x70,0xc7,0x1, 0xe0,0x43,0x3f,0xe, 0xe8,0xf, 0x3f,0x36, +0x3f,0x7a,0x3f,0x98,0x37,0xa1,0xe8,0xf, 0x3f,0x97,0x5, 0x72,0x17,0x7f,0x3f,0x19, +0xe2,0x1, 0xc7,0x7f,0xe0,0x43,0x3d,0xe, 0xe2,0x0, 0xcd,0x0, 0x4, 0x25,0xe0,0x2, +0x1f,0xbf,0xf0,0x0, 0x8b,0x5f,0xe0,0x1, 0x1f,0xd1,0xf0,0x0, 0xa3,0x8f,0xe8,0xf, +0x3d,0x36,0x3f,0x98,0x37,0xa1,0xe8,0xf, 0x3f,0x97,0x97,0x8f,0x3f,0xfb,0x3, 0x5, +0x0, 0x94,0x97,0x8f,0x3d,0xff,0x2, 0x11,0x17,0x7f,0x3f,0x1a,0xe2,0x1, 0xc7,0x7f, +0xe0,0x43,0x3d,0xe, 0xe8,0xf, 0x3d,0x36,0xe3,0xff,0xcd,0x7f,0x3f,0x98,0x37,0xa1, +0xe8,0xf, 0x3f,0x97,0x1, 0xef,0x17,0x0, 0xe0,0x1, 0x1f,0xa3,0xaf,0xc, 0xc4,0x81, +0xe0,0xe, 0x8f,0x1f,0xe0,0x43,0x3c,0x89,0x3f,0x79,0x5, 0x1e,0xe0,0x2, 0x1f,0xbf, +0xf0,0x0, 0x8b,0xdf,0xe0,0x1, 0x1f,0xd1,0xa5,0xf, 0xe8,0xf, 0x3c,0xb7,0x3f,0x98, +0x37,0xa1,0x3f,0x9a,0x97,0x8f,0x3f,0xfb,0x3, 0x5, 0x0, 0x92,0x97,0x8f,0x3f,0xfb, +0x4, 0xf, 0xc4,0x81,0xe0,0x43,0x3c,0x89,0xe8,0xf, 0x3c,0xb7,0x3c,0xfe,0x3f,0x98, +0x37,0xa1,0x3f,0x9a,0x4, 0x74,0x14,0xff,0x3c,0x9e,0xe0,0x43,0x3c,0x89,0xe2,0x1, +0xc4,0xff,0xac,0x8d,0x84,0xc, 0x3c,0xa8,0x14,0x1, 0x3c,0x19,0xe2,0x1, 0xc4,0x7f, +0x38,0x82,0x3c,0xee,0xe2,0x1, 0xc4,0xff,0xe7,0xff,0x0, 0x9a,0xe0,0x0, 0x1f,0xe, +0xe0,0xf, 0x34,0x43,0x3f,0x1f,0xe0,0x0, 0x1f,0xb2,0xe2,0x0, 0xc4,0x7, 0x3f,0x98, +0x87,0x8f,0xe0,0xf, 0x84,0xe, 0x3c,0x5f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x17,0x7, +0xe0,0x0, 0x1f,0xb2,0x3f,0x58,0x3f,0x9e,0xe0,0x0, 0x1f,0xe, 0x34,0x43,0x3c,0x1e, +0x8f,0x8f,0xe0,0xf, 0x87,0x8, 0x2c,0x86,0xe3,0xf, 0x3f,0x5f,0xe0,0xf, 0xaf,0x88, +0x38,0x82,0x3f,0xce,0xe0,0xf, 0xaf,0x88,0x38,0x82,0xe0,0x0, 0x1f,0x8e,0xe0,0x2, +0x1f,0x3f,0x34,0x21,0x3c,0x1f,0x8f,0x88,0x8e,0xde,0x8f,0x18,0x3f,0xbd,0x3f,0x9e, +0xe0,0x1, 0x1f,0x51,0x37,0xa1,0xa7,0xe, 0x3f,0x9e,0x94,0xf, 0x38,0x82,0xe0,0x2, +0x1f,0xbf,0xe0,0x1, 0x1f,0x2d,0x8e,0xef,0x9f,0x9e,0x3e,0xf8,0x2, 0x82,0x9f,0xce, +0x3c,0x6f,0x38,0x82,0xf0,0x0, 0x1a,0x8b,0xe8,0x0, 0x8e,0x5, 0x26,0x3d,0x16,0x0, +0xe0,0x0, 0x1d,0x8e,0xf0,0x0, 0x1b,0x32,0xe0,0x40,0x3f,0xec,0xe0,0xd, 0x37,0xc3, +0x15,0x7, 0x3d,0x5f,0xe2,0x0, 0xc6,0x9f,0x3e,0x9b,0xe8,0xa, 0x3d,0x16,0x85,0xa, +0xe0,0xf, 0x86,0x8d,0xe0,0xe, 0x37,0xa1,0x3e,0xda,0xe0,0x17,0x3d,0x9e,0x14,0x7, +0xe0,0xe, 0x36,0x43,0xe0,0x9, 0x36,0x21,0x3c,0x5c,0xe2,0x0, 0xc7,0x1f,0xc7,0x81, +0x15,0x1, 0xe2,0x1, 0xc6,0xff,0x3c,0x9b,0x3f,0x1b,0xe8,0x8, 0x3c,0x16,0xe2,0x1, +0xc7,0xff,0x3d,0x1c,0x26,0x8d,0xe8,0x0, 0x9e,0x7, 0x86,0x88,0xb6,0x9, 0x3e,0x6a, +0xe0,0xf, 0x85,0xe, 0xe2,0x1, 0xc6,0x7f,0x3e,0xca,0xe0,0xf, 0xae,0x8e,0xe8,0x0, +0x8f,0x5, 0x3f,0x7f,0x2, 0xcc,0xe8,0x0, 0xae,0x5, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x78,0xf0,0x0, 0x1c,0xb, 0xe8,0x0, 0x8f,0x88,0x27,0xa0,0xe0,0x0, +0x1a,0x8e,0xe0,0x0, 0x1b,0xb2,0xe0,0x1, 0x1b,0x23,0xf0,0x1, 0x1e,0xd1,0x11,0x80, +0xe0,0xf, 0x31,0xc3,0x17,0x7, 0xe2,0x0, 0xc7,0x9f,0x3f,0x53,0x3f,0x95,0x3f,0x17, +0xe0,0xf, 0x87,0x8f,0x87,0xe, 0x3f,0xde,0xe2,0x1, 0xc7,0xff,0x2f,0xa4,0xe8,0x0, +0x8f,0x88,0xc1,0x81,0xe2,0x1, 0xc1,0xff,0x39,0xff,0x4, 0xeb,0xdf,0x94,0xea,0x12, +0x7f,0xf1,0x8f,0xf, 0xe0,0x2, 0x27,0x69,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x1, 0x74, +0xe2,0x0, 0xcf,0x2, 0xe0,0x3, 0x1, 0x18,0xe0,0x2, 0x1f,0x9f,0x8f,0xf, 0x2f,0x7, +0xe8,0x0, 0x8f,0x88,0xe0,0x0, 0x1a,0x8e,0xe0,0x2, 0x2f,0xf3,0xc0,0x8, 0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe0,0x1a,0x92,0x75,0xe0,0x19,0x31,0xa1,0xe8,0xf, 0x3a,0x99, +0xe4,0x0, 0xc2,0x5, 0x89,0x1f,0x8d,0xf, 0x32,0x3, 0xe2,0x0, 0x7e,0x8a,0xe2,0x0, +0x7e,0xb, 0x3d,0xe4,0x3c,0xea,0x3c,0x62,0xde,0x94,0x17,0x7f,0x3f,0x12,0xf0,0x40, +0x3e,0x6e,0xf0,0x0, 0x45,0x8b,0xf0,0x0, 0x45,0xa, 0xf2,0x1, 0xc6,0x7f,0xf0,0x0, +0x17,0x0, 0x0, 0x94,0x4d,0xa, 0x4c,0x8b,0xde,0x84,0x17,0x7f,0xe8,0xf, 0x3c,0x1e, +0xe8,0xe, 0x3f,0x1c,0xe2,0x0, 0xcc,0x3, 0xf0,0x40,0x3f,0x6f,0xf0,0x40,0x3e,0x6e, +0xf2,0x1, 0xc7,0x7f,0xf2,0x1, 0xc6,0x7f,0x5, 0x8d,0xe8,0x43,0x3d,0xc, 0xe2,0x0, +0xcd,0x0, 0xe8,0x40,0x3c,0x6c,0xe2,0x0, 0x7e,0x8a,0xe2,0x0, 0x7e,0xb, 0x3d,0xe4, +0x3, 0x62,0xc1,0x1, 0xf0,0x0, 0x6d,0x8b,0xe2,0x1, 0xc1,0x7f,0xf0,0x0, 0x6d,0xa, +0x0, 0x90,0x4d,0xa, 0x4c,0x8b,0xc1,0x1, 0xde,0x5c,0xe8,0xf, 0x3c,0x1e,0xe2,0x0, +0xcc,0x3, 0xf0,0x40,0x3f,0x6f,0xf2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc1,0x7f,0x5, 0x8d, +0xe0,0xe, 0x8f,0x26,0xe0,0x43,0x3d,0x2, 0x3d,0x7e,0x3c,0x62,0xe2,0x0, 0x7e,0x8a, +0xe2,0x0, 0x7e,0xb, 0x3d,0xe4,0x4, 0x66,0xf2,0x0, 0xcf,0x15,0xe7,0xfe,0x5, 0xf9, +0xe8,0x0, 0x8d,0x8, 0xe7,0xfe,0x25,0x7c,0x17,0xeb,0xe8,0xf, 0x3f,0x9e,0xe4,0x0, +0xc7,0x85,0x37,0x84,0xc7,0x83,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x86,0x3c,0xef, +0x5, 0x82,0x14,0x86,0xe0,0x2, 0x1f,0x3f,0xf0,0x19,0x3c,0x95,0x12,0x1, 0xe8,0x0, +0xa1,0xd, 0x8c,0x5e,0xe0,0x0, 0x1e,0xe, 0xe2,0x1, 0xc4,0xff,0xe0,0x0, 0x17,0x80, +0xe8,0x4, 0x3a,0x19,0xe0,0xe, 0x37,0xc3,0x16,0x87,0x3f,0xf3,0x3e,0xdf,0xe2,0x0, +0xc7,0x1f,0x3f,0x15,0x3e,0x97,0xe0,0x0, 0x1, 0x46,0xf0,0xf, 0x8b,0xe, 0xf0,0x0, +0x8a,0x8d,0xf8,0xd, 0x3b,0x55,0x26,0xbe,0x8d,0x8c,0xf8,0x0, 0x8b,0x89,0xe0,0x43, +0x3e,0x8b,0xf8,0x43,0x3a,0x7, 0xe8,0xd, 0x3e,0xa4,0xe4,0x14,0x36,0x8f,0xf2,0xd, +0x3a,0x4d,0xe8,0xd, 0x3e,0xa4,0x3e,0xf9,0x2, 0x2d,0xf0,0x17,0x3b,0xb8,0xf0,0x0, +0x89,0x9c,0xf0,0x0, 0x8a,0x4, 0xe0,0xd, 0x3d,0xb8,0xf8,0xb, 0x3b,0x94,0xf8,0x43, +0x3a,0x4, 0xf8,0x43,0x3b,0x83,0xf8,0x17,0x3b,0xa4,0xf4,0x14,0x33,0x8f,0xfa,0x17, +0x3a,0x47,0xf8,0x17,0x3b,0xa4,0xe8,0xd, 0x3e,0x93,0xe8,0x40,0x3c,0xf7,0x35,0xa1, +0x36,0xa1,0x3d,0x92,0x3e,0x92,0x4, 0xe, 0x95,0x8b,0xf0,0x0, 0x93,0x8d,0x16,0x8b, +0x3e,0xbb,0xfb,0x16,0x3b,0x55,0x36,0x84,0xe8,0x40,0x3e,0xf7,0x5, 0x3, 0xf0,0xf, +0xab,0xe, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0xfa,0xc6,0x2, 0xe7,0xff,0x1, 0xac, +0xe7,0xfe,0x0, 0x81,0xf0,0x2, 0x1d,0x1f,0xe8,0x0, 0x8f,0xa, 0xe0,0x1, 0x27,0x16, +0xe8,0x0, 0x8f,0x8, 0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x9a,0x11,0x80,0xea,0x12, +0x7b,0x70,0xe0,0x0, 0x1a,0x8e,0xf0,0x1, 0x1d,0xd1,0xf0,0x2, 0x1c,0xbf,0xe0,0x0, +0x1a,0x8, 0xf0,0x0, 0x1e,0x7, 0xf0,0x40,0x3e,0xe3,0x13,0x83,0xf0,0x1e,0x36,0xa1, +0xe8,0xf, 0x3a,0x9e,0x8d,0xf, 0xe0,0x1a,0x94,0x75,0x3c,0xe7,0x89,0x1f,0x7d,0x1, +0xe0,0x3, 0xde,0xda,0xe8,0x0, 0x8f,0xd9,0x65,0x1, 0xe8,0x0, 0xa6,0x8b,0x3f,0xba, +0xe0,0x43,0x3c,0x18,0x3f,0x92,0x37,0xa1,0x3f,0x9d,0x97,0x8f,0x3d,0xe2,0x3f,0xf8, +0x3, 0x3, 0x8f,0x86,0x2f,0x8b,0x8c,0x84,0xe8,0x0, 0x8c,0xc, 0xf0,0x1e,0x3f,0x15, +0xef,0xfe,0xd9,0xb, 0x24,0x1a,0xe8,0x0, 0x89,0x1e,0x8f,0x84,0xeb,0xe6,0x7e,0x9c, +0xe0,0x2, 0x3f,0xa2,0xe4,0xc, 0x31,0xf, 0xe2,0x2, 0x3e,0x42,0x39,0x2c,0xe2,0x0, +0xc9,0xa, 0xc1,0x81,0xc7,0x8a,0xe2,0x1, 0xc1,0xff,0x5, 0x7, 0x8e,0x8d,0x17,0x48, +0x3f,0xfd,0xaf,0x6, 0xe0,0x2, 0x4, 0xa, 0x17,0x1, 0xe8,0xe, 0x3f,0x1d,0xe8,0x0, +0x8f,0x88,0xf0,0x40,0x3e,0xee,0xf2,0x1, 0xc6,0xff,0xe8,0x40,0x3f,0xfd,0xe7,0xff, +0x2, 0xb7,0x39,0xff,0x1, 0x16,0x8f,0x86,0x27,0xba,0xc7,0xff,0xaf,0x86,0xe8,0x0, +0x8f,0xa, 0xe7,0xfd,0x0, 0xa6,0xf0,0x2, 0x1d,0x1f,0xe8,0x0, 0x8f,0xa, 0xe2,0x0, +0xcf,0x1, 0xe7,0xfd,0x1, 0x9e,0xaf,0xf, 0xe8,0x0, 0x8f,0x8, 0xe7,0xff,0x0, 0x8c, +0xe0,0x0, 0x1f,0x87,0x16,0x48,0x87,0xf, 0x86,0x84,0xae,0x6, 0x16,0x1, 0xe8,0x0, +0x8f,0x8a,0xe8,0x0, 0xae,0x8, 0xae,0x95,0xaf,0x5, 0xe7,0xfd,0x2f,0x91,0xde,0xb, +0xe8,0x0, 0x8f,0x88,0xe2,0x0, 0xcf,0x81,0xe7,0xfd,0x1, 0x8a,0xeb,0xe6,0x7f,0x9c, +0x87,0x15,0xaf,0xf, 0xe7,0xfd,0x0, 0x84,0xe8,0x0, 0x8f,0x8, 0xe7,0xfe,0x2f,0x6c, +0xea,0x12,0x7f,0x70,0x8f,0xe, 0x2f,0x3, 0x17,0x2, 0xaf,0xf, 0xe8,0x0, 0x8f,0xa, +0xe7,0xfc,0x0, 0xef,0xe8,0x0, 0x8f,0x88,0xf0,0x2, 0x1d,0x1f,0xe2,0x0, 0xcf,0x81, +0x5, 0xf6,0xe0,0x0, 0x1a,0x8e,0xf0,0x2, 0x1d,0x1f,0xe0,0x1, 0x1b,0xd1,0xe0,0x2, +0x1b,0x3f,0xf0,0x0, 0x1c,0xb2,0x11,0x81,0xe0,0x4, 0x31,0xc3,0xe2,0x0, 0xc2,0x1f, +0xe0,0x1d,0x31,0xa1,0xf0,0x1d,0x3e,0x95,0x3a,0x15,0xf0,0x0, 0x17,0x1, 0xf0,0x0, +0x15,0x87,0xf0,0x0, 0x1e,0xe, 0x11,0x0, 0xf8,0x1e,0x3f,0x1d,0xe0,0x0, 0xc2,0x78, +0xf0,0x1b,0x3d,0xd3,0x0, 0xb4,0xe8,0x0, 0x8f,0x8a,0xe2,0x0, 0xcf,0x82,0xe0,0x0, +0x2, 0xd8,0x8f,0xd6,0xa7,0x7, 0x3d,0x3f,0x3c,0x3f,0x3d,0x9a,0x35,0xa1,0x3c,0x98, +0x3d,0x9e,0x34,0xa1,0x3c,0x9e,0x96,0x8b,0x97,0x89,0xe0,0xe, 0x36,0xa1,0x3f,0x7f, +0xe0,0x0, 0x4, 0x61,0x37,0xa1,0xe0,0x40,0x3e,0xff,0x5, 0x11,0xe0,0xf, 0x31,0x43, +0x16,0x87,0xe2,0x0, 0xc7,0x9f,0x3e,0xd2,0x3f,0x95,0xe8,0xd, 0x3e,0x99,0xe0,0xf, +0x86,0xf, 0x87,0xd, 0xe3,0xe, 0x3e,0x5e,0xe0,0xf, 0xaf,0xf, 0xc1,0x1, 0xe2,0x1, +0xc1,0x7f,0x39,0xf2,0xf0,0x0, 0xc6,0x2, 0xe0,0x0, 0x1, 0x54,0xe8,0x0, 0x8c,0xc, +0xe8,0x0, 0x8d,0xd, 0xe0,0x43,0x3f,0x88,0xe0,0x43,0x3f,0xa, 0x3f,0xae,0x17,0x2, +0x3f,0x1f,0xe2,0x0, 0xcf,0x4, 0xe8,0x0, 0x8c,0x9c,0xe8,0x0, 0x8d,0x8e,0x2, 0x8a, +0xe0,0x43,0x3f,0x9, 0xe0,0x43,0x3e,0x8b,0x3f,0x2d,0xc7,0x2, 0xe2,0x0, 0xcf,0x4, +0x5, 0xde,0xc7,0x84,0xe2,0x0, 0xcf,0x88,0x2, 0x8b,0xe0,0x43,0x3f,0x89,0xe0,0x43, +0x3f,0xb, 0x3f,0xae,0xc7,0x84,0xe2,0x0, 0xcf,0x88,0xe7,0xff,0x5, 0xa6,0xef,0xfe, +0xd8,0x1c,0x24,0x4d,0x8e,0xd6,0xe8,0x0, 0x8f,0x8c,0xe8,0x0, 0x8f,0xd, 0x3f,0xbd, +0x3f,0x3d,0xe8,0x0, 0x8d,0x9c,0xe8,0x0, 0x8e,0xe, 0xa6,0x87,0x3f,0x9b,0x3f,0x1c, +0x37,0xa1,0x37,0x21,0x3f,0x9d,0x3f,0x1d,0x96,0x8f,0x97,0x8e,0x3e,0xff,0xe7,0xff, +0x5, 0x27,0xf8,0xf, 0x3c,0x9b,0x87,0x4, 0x87,0x8f,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f, +0xe3,0xf, 0x3f,0x5f,0x39,0xf2,0xaf,0x84,0xf0,0x0, 0xc6,0x2, 0xe7,0xff,0x1, 0xb0, +0xc1,0x81,0xe8,0x0, 0x8f,0x88,0xe2,0x1, 0xc1,0xff,0x3f,0xf3,0xe7,0xfe,0x2, 0xde, +0xe8,0x0, 0x8f,0xa, 0xe7,0xfb,0x0, 0xb5,0x17,0x80,0xe8,0x0, 0xaf,0x88,0xe7,0xfb, +0x0, 0xb7,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0x8, 0xe0,0x0, 0x1f,0xb, +0x13,0x84,0x89,0xe, 0x3b,0x90,0xe0,0x0, 0x1c,0x8e,0xe0,0xa, 0x31,0x21,0x3c,0x67, +0xe0,0x3, 0xdf,0xc2,0xea,0x12,0x7f,0xb0,0x88,0x8f,0xe0,0x2, 0x20,0xe5,0xe0,0x2, +0x1f,0x3f,0xe0,0x1, 0x1f,0xad,0xe0,0x1, 0x1e,0xd1,0xea,0x12,0x79,0xb4,0x12,0x0, +0xf0,0x0, 0xa7,0xd, 0xf0,0x0, 0x8e,0xde,0xf0,0x0, 0x9e,0x1f,0xf0,0x0, 0x8d,0xee, +0xf0,0x0, 0x9d,0x4f,0xf0,0x0, 0x19,0xe, 0xf0,0x0, 0x19,0xb2,0xf0,0x40,0x38,0xe3, +0xe0,0x40,0x3c,0x64,0xf0,0x7, 0x14,0xff,0xf0,0x1, 0x14,0x7f,0xe0,0x0, 0x21,0x7b, +0x16,0x4, 0x3e,0x10,0xe8,0x40,0x3d,0xe9,0xe8,0x40,0x3d,0x68,0xe0,0x0, 0x16,0x80, +0xe0,0xf, 0x36,0xc3,0x17,0x7, 0x3f,0x5d,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0x92, +0xe8,0xe, 0x3f,0x13,0xe0,0xf, 0x87,0x8f,0x87,0xe, 0x14,0x81,0x3f,0xde,0xe2,0x1, +0xc7,0xff,0x3c,0x9d,0x27,0xb4,0x8f,0x8c,0xe2,0x1, 0xcf,0xff,0xf0,0x40,0x3b,0xef, +0x1, 0x2e,0xf8,0x0, 0x8a,0x1, 0xf0,0x0, 0x8b,0x1c,0xf8,0x0, 0x8a,0x91,0xf0,0xf, +0x3a,0x2f,0xe3,0xff,0xc7,0xff,0xf0,0x43,0x38,0x1f,0xf8,0xe, 0x3a,0xa6,0xe3,0xff, +0xc7,0x7f,0xf2,0x0, 0xc8,0x0, 0xf8,0x17,0x3b,0xa4,0xf3,0xff,0xc3,0xff,0xf0,0x43, +0x3a,0x1e,0xe8,0x6f,0x3d,0x27,0xf8,0x16,0x3b,0x25,0xf2,0x0, 0xca,0x0, 0xf3,0xff, +0xc3,0x7f,0xe8,0x6e,0x3d,0x26,0x3f,0x9e,0xe3,0xff,0xc7,0xff,0x3f,0xfb,0x3f,0x6b, +0xe0,0x6e,0x3c,0xaf,0x3f,0xfb,0x3d,0xee,0xe0,0x6a,0x3c,0xad,0x3e,0xe9,0xe2,0x1, +0xc6,0xff,0x39,0x7d,0xc6,0x2, 0xe7,0xff,0x1, 0xb5,0xe2,0x1, 0xcd,0x7f,0x1, 0x22, +0x35,0x21,0x3d,0x17,0x8e,0x8a,0x8e,0x1a,0xe8,0xf, 0x3e,0xbd,0xe8,0x40,0x3e,0xfb, +0x3f,0x9c,0x37,0xa1,0xe8,0xf, 0x3f,0x9e,0xe8,0x40,0x3f,0x6c,0xe8,0x6e,0x3b,0xaa, +0x95,0x8f,0xe0,0x43,0x3f,0x9e,0x3d,0xff,0x4, 0xd, 0xe0,0xf, 0x32,0x21,0xe2,0x0, +0x7f,0x40,0x3f,0x9e,0xc2,0x1, 0xae,0x8f,0xe2,0x1, 0xc2,0x7f,0xae,0x1f,0x17,0xff, +0xaf,0x8a,0xc4,0x1, 0xe2,0x1, 0xc4,0x7f,0x3c,0x71,0xf0,0x0, 0xc0,0x82,0xe7,0xfe, +0x1, 0xff,0xe0,0x1, 0x1f,0x9c,0xf0,0x0, 0x8c,0xf, 0xf0,0x40,0x3c,0x74,0xe0,0x0, +0x5, 0xe6,0xe0,0x1, 0x1f,0xd1,0xe0,0x0, 0x1c,0x8e,0xf0,0x0, 0xa3,0xf, 0xe0,0x2, +0x1f,0xbf,0xe0,0x0, 0x1d,0x32,0x8b,0xdf,0xf0,0x40,0x3b,0xe4,0xf0,0x1, 0x12,0x7f, +0xf0,0x0, 0x12,0x80,0xf7,0xff,0x11,0xff,0xe0,0x0, 0x21,0x49,0x16,0x4, 0x3e,0x10, +0xe8,0x40,0x3d,0xe4,0xe8,0x40,0x3c,0x65,0xe0,0x0, 0x17,0x0, 0xe0,0xf, 0x37,0x43, +0x16,0x87,0x3e,0xde,0xe2,0x0, 0xc7,0x9f,0x3e,0x9a,0x3f,0x99,0x80,0x8d,0xe0,0xf, +0x87,0x8f,0x16,0x81,0x3f,0xd1,0xe2,0x1, 0xc7,0xff,0x3e,0x9e,0x27,0x96,0x88,0x8c, +0xe2,0x1, 0xc8,0xff,0xe0,0xf, 0x38,0xb7,0x1, 0x10,0xf0,0x0, 0x89,0x1c,0xe8,0xf, +0x3f,0x92,0x37,0xa1,0xe8,0xf, 0x3f,0x96,0x97,0x8f,0x3f,0xf8,0x5, 0x6, 0x3d,0xee, +0xe8,0x40,0x3b,0x62,0x3a,0xe1,0x3c,0x6f,0x3f,0x6d,0xe2,0x1, 0xc7,0x7f,0x39,0x7e, +0xc6,0x2, 0x1, 0xd5,0xe2,0x1, 0xcd,0xff,0x1, 0x11,0xe0,0xf, 0x32,0x21,0xe2,0x0, +0x7f,0x40,0x3f,0x9e,0x35,0xa1,0xe2,0x0, 0x7f,0x4, 0x3d,0x9e,0xc2,0x1, 0xaa,0x8f, +0xe2,0x1, 0xc2,0x7f,0xab,0x1f,0xf0,0x0, 0xa9,0x8b,0xf0,0x0, 0xc3,0x81,0xf2,0x1, +0xc3,0xff,0xf8,0x40,0x3c,0x77,0xe7,0xff,0x1, 0xb1,0xe0,0x1, 0x1f,0x97,0xe0,0x0, +0x14,0xc0,0x8d,0xf, 0x3c,0x90,0x35,0x21,0xe2,0x0, 0x7c,0x4, 0xe0,0x3, 0xde,0xa4, +0xf0,0xa, 0x34,0x21,0xe0,0x1, 0x14,0xff,0x3c,0x63,0xe0,0x3, 0xde,0xd7,0x2a,0xc, +0xe0,0x0, 0x1f,0xb, 0xea,0x12,0x7f,0xb0,0xaa,0xf, 0xaa,0xe, 0xe0,0x0, 0xc0,0x78, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x32,0x21,0xe0,0x0, 0x1c,0xe, 0x3d,0x62, +0xe2,0x0, 0x7c,0x84,0xe0,0x3, 0xde,0x88,0x3d,0x62,0xe2,0x0, 0x7c,0x84,0x3c,0x63, +0xe0,0x3, 0xde,0x82,0xe0,0x0, 0x1d,0xe, 0xe0,0x0, 0x1d,0xb2,0xe0,0x0, 0x17,0x80, +0xe0,0xe, 0x37,0xc3,0x16,0x7, 0x3e,0x5f,0xe2,0x0, 0xc7,0x1f,0x3f,0x1a,0x3e,0x1b, +0xe0,0xf, 0x84,0x8e,0x86,0x8c,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3e,0xc9,0x3f,0xf4, +0xe0,0xf, 0xae,0x8e,0x1, 0xee,0xea,0x12,0x7f,0x30,0xf0,0x40,0x3c,0x7f,0xaf,0x8e, +0xe8,0x6f,0x3c,0xa8,0xe0,0x0, 0x1f,0xb, 0xaf,0x8e,0xe0,0x0, 0xc0,0x78,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xea,0x12,0x79,0xb4,0x3a,0x61,0xe7,0xfe,0x0, 0xbc,0x8, 0xb1, +0xe0,0x1, 0x1f,0xad,0xe0,0x3, 0x8f,0x8f,0x2f,0x84,0xef,0xff,0xd2,0x8a,0xdb,0xab, +0xdb,0xaa,0xdb,0xa9,0xd5,0xb5,0xdb,0xa7,0xdb,0xea,0xdb,0xa5,0x8, 0xa1,0xe7,0xfc, +0x0, 0xf2,0x0, 0x0, 0x8, 0xb6,0xc0,0x74,0x3c,0x7a,0xe4,0xf, 0x35,0x28,0xe4,0xe, +0x34,0x28,0x39,0x68,0x4, 0x82,0x39,0x6a,0x3f,0x7f,0x3f,0xe8,0xe0,0x6f,0x3d,0xaa, +0x3c,0xfb,0x38,0xef,0xe2,0x1, 0xc1,0x7f,0xe2,0x1, 0xc0,0xff,0x39,0xeb,0xe4,0xf, +0x35,0xa8,0xe4,0xe, 0x34,0xa8,0x3, 0x82,0x39,0xe9,0x3f,0x7f,0xe2,0x1, 0xc1,0xff, +0x3f,0xe9,0xe0,0x6f,0x3d,0xab,0x3c,0xf3,0xf0,0x40,0x3b,0x6f,0xf2,0x1, 0xc3,0x7f, +0xe0,0x1, 0x1, 0x1e,0x3d,0x72,0xe0,0x1, 0x2, 0x9e,0xf0,0x40,0x3a,0xe2,0xf0,0x0, +0x11,0x81,0xe0,0x1, 0x1f,0xd1,0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0xa2,0xf, 0xe0,0x2, +0x1f,0xbf,0xe0,0x0, 0x1a,0x1d,0xf0,0x0, 0x8b,0xdf,0xf8,0x12,0x39,0x16,0x3c,0xe3, +0x15,0x0, 0xf0,0x1, 0x10,0x7f,0xf7,0x0, 0x10,0x81,0x14,0x7f,0xf0,0x40,0x39,0x79, +0xe0,0x0, 0x1, 0x62,0xe8,0x40,0x3c,0xf6,0xf0,0x1, 0x21,0x83,0xe0,0x1, 0x3, 0x65, +0x17,0x1, 0x3f,0x19,0xf0,0x40,0x3a,0xf1,0xf0,0x0, 0x6a,0x84,0x6f,0x5, 0xe0,0x1, +0x3, 0x61,0x17,0x81,0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88,0x6c,0x89, +0x6f,0x8c,0x6f,0xd, 0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0x60,0xe8,0x40,0x3b,0x61, +0x16,0x80,0x8d,0x8e,0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d,0xe8,0xf, 0x3d,0xb7, +0x1, 0x10,0x8d,0x9e,0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1,0xe8,0xf, 0x3f,0x94, +0x1, 0x8, 0x97,0x8f,0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6,0xe0,0x66,0x3a,0x2f, +0x3e,0xe5,0xe2,0x1, 0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, 0x1, 0xe3,0xe0,0xf, +0x36,0x22,0xe2,0x0, 0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40,0x3b,0x7d,0xe0,0x1, +0x1, 0x34,0xe8,0x40,0x39,0xf6,0xe0,0x1, 0x1, 0x30,0xe2,0x1, 0xce,0x7f,0xe7,0xff, +0x1, 0x2f,0xe0,0xe, 0x35,0x21,0x3c,0xed,0x3f,0x14,0xe2,0x0, 0x7e,0x4, 0xf0,0x40, +0x39,0x79,0x3f,0x9c,0xc5,0x1, 0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0xf0,0x0, 0x8a,0x8f, +0xe7,0xff,0x1, 0xa2,0xe0,0xff,0x14,0x7f,0x25,0x18,0x17,0xff,0x3f,0x9a,0x3d,0x6f, +0xe2,0x1, 0xc5,0x7f,0xe0,0x0, 0x1e,0x9d,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1f,0x1c, +0xe0,0xf, 0x3f,0x9d,0xe0,0xff,0x14,0x7f,0xe0,0x80,0x96,0x9e,0x3e,0xf8,0xe0,0x6d, +0x3a,0x28,0x3f,0x7f,0x3c,0x6d,0x1, 0xf9,0xc0,0xc, 0xb, 0x61,0x3c,0x72,0xe7,0xfe, +0x5, 0xe6,0xf0,0x40,0x3a,0xe1,0xf0,0x0, 0x11,0x80,0xe7,0xfe,0x0, 0xe4,0xe0,0x0, +0x3, 0x59,0x17,0x1, 0x3f,0x19,0xe8,0x40,0x39,0x75,0xf0,0x0, 0x6a,0x84,0x6f,0x5, +0xe0,0x0, 0x3, 0x55,0x17,0xff,0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88, +0x6c,0x89,0x6f,0x8c,0x6f,0xd, 0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0xe3,0xe8,0x40, +0x3e,0x60,0xe8,0x40,0x3b,0x61,0x8d,0x8e,0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d, +0xe8,0xf, 0x3d,0xb7,0x1, 0x10,0x8d,0x9e,0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1, +0xe8,0xf, 0x3f,0x94,0x1, 0x8, 0x97,0x8f,0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6, +0xe0,0x66,0x3a,0x2f,0x3e,0xe5,0xe2,0x1, 0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, +0x1, 0xe3,0xe0,0xf, 0x36,0x22,0xe2,0x0, 0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40, +0x3b,0x7d,0x1, 0x2d,0xe8,0x40,0x39,0xf6,0x1, 0x2a,0xe2,0x1, 0xce,0x7f,0xe7,0xfe, +0x1, 0x2f,0xe0,0xe, 0x35,0x21,0xe2,0x0, 0x7e,0x4, 0x3f,0x9c,0x3f,0x14,0xc5,0x1, +0xf0,0x0, 0x8a,0x8f,0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0x3c,0xed,0xe7,0xfe,0x0, 0xa0, +0xf0,0x40,0x3a,0xf2,0x6c,0x4, 0x6c,0x5, 0x2, 0x23,0x6c,0x8, 0x6c,0x9, 0x6c,0xc, +0x6c,0xd, 0xe7,0xff,0x0, 0xb2,0xe8,0x40,0x38,0xf5,0x6c,0x4, 0x6c,0x5, 0x2, 0x12, +0x6c,0x8, 0x6c,0x9, 0x6c,0xc, 0x6c,0xd, 0xe7,0xfe,0x0, 0xa6,0x8f,0xe, 0x3f,0x72, +0x1, 0xd5,0xe7,0xfe,0x0, 0xe9,0x8f,0xe, 0x3f,0x71,0xe7,0xfe,0x1, 0xd0,0xe7,0xfe, +0x0, 0xe3,0x17,0x81,0xe8,0xf, 0x3f,0x95,0x6f,0x88,0x6c,0x89,0x0, 0xec,0x17,0xff, +0xe8,0xf, 0x3f,0x95,0x6f,0x88,0x6c,0x89,0x0, 0xdb,0x8, 0xb3,0xf7,0xff,0x12,0x7f, +0xf0,0x43,0x38,0x8, 0xf0,0x14,0x3a,0x18,0xf0,0x0, 0x10,0x81,0xf8,0x43,0x3a,0x4, +0xf8,0x11,0x38,0x90,0xe0,0x2, 0x1f,0xbf,0xf8,0x40,0x3a,0x71,0x80,0xef,0xf0,0x0, +0x82,0xff,0xe0,0x0, 0x2, 0x66,0xe0,0x1, 0x1f,0x51,0xf7,0xff,0x11,0x7f,0xf0,0x0, +0x11,0x81,0xf0,0x13,0x39,0x98,0xf0,0x43,0x3b,0x89,0xf0,0x12,0x39,0x19,0x15,0x1, +0x11,0x81,0xf0,0x0, 0xa3,0xe, 0x89,0x5f,0xf8,0x43,0x39,0x2, 0xe8,0xa, 0x3d,0x17, +0xf2,0x1, 0xc1,0xff,0xe7,0x0, 0x14,0x1, 0xe0,0x3, 0x39,0x99,0xf2,0x0, 0xca,0x0, +0xe8,0x43,0x3f,0x83,0xe8,0x40,0x3d,0xe4,0xe0,0x6b,0x3c,0x2f,0xe8,0x40,0x38,0xf4, +0xe0,0x6b,0x3d,0x2f,0xe8,0x40,0x3d,0x72,0x4, 0x2e,0x3e,0x63,0xe0,0x9, 0x39,0x3b, +0xe2,0x1, 0xc6,0x7f,0xe8,0x2b,0x3d,0x80,0xe8,0x40,0x3f,0xe2,0x0, 0x84,0x25,0x9c, +0x3f,0xfa,0x2, 0x21,0xe2,0x0, 0xcf,0x80,0xe0,0x43,0x3e,0x8c,0x3f,0x6f,0xe0,0x6e, +0x3c,0x2d,0xf0,0x40,0x3a,0xff,0xc6,0x7f,0xe0,0x6e,0x3d,0x2d,0xe0,0xd, 0x3f,0x19, +0xc7,0x81,0x36,0xa1,0xe8,0x2e,0x3f,0x7, 0xe0,0x43,0x3f,0x8f,0xe8,0xd, 0x3e,0x96, +0xe2,0x1, 0xc6,0x7f,0x2f,0x65,0x97,0xd, 0x3f,0x78,0xe0,0x6e,0x3c,0x28,0x3f,0xfa, +0x3c,0x6e,0x5, 0x61,0xf0,0x0, 0xc2,0x1, 0xf8,0x43,0x3a,0x4, 0xf8,0x40,0x3a,0x71, +0xf1,0xff,0xc1,0xff,0xf2,0x1, 0xc1,0xff,0xe7,0xff,0x5, 0x3a,0x9, 0xe1,0xe7,0x0, +0x14,0x1, 0x9, 0xe1,0x8, 0xb4,0xc0,0x78,0x39,0xea,0x3a,0x6b,0x7e,0x2, 0x7e,0x81, +0xdf,0x7d,0x39,0x68,0x3c,0xe4,0x3c,0x63,0xdf,0x79,0x39,0x18,0xe4,0x8, 0x31,0x4f, +0x3c,0x12,0x34,0x1, 0x66,0x81,0x3f,0xe8,0xe3,0xff,0xc6,0xff,0xe3,0xff,0xc7,0xff, +0xe0,0xe, 0x3e,0xaf,0xe0,0x43,0x3f,0x1e,0x66,0x2, 0xe2,0x0, 0xcf,0x0, 0xe0,0x8, +0x3e,0xa8,0xe0,0xe, 0x3f,0xad,0xe3,0xff,0xc6,0x7f,0xe0,0x43,0x3f,0x1e,0xe0,0x43, +0x3c,0x18,0xe0,0xf, 0x3e,0xac,0xe0,0x68,0x3d,0x2e,0xe0,0x2, 0x1f,0x6, 0xe0,0x43, +0x3f,0x9f,0x3e,0x2d,0xe2,0x0, 0xcf,0x80,0x9f,0xe, 0xe0,0x43,0x3e,0x1c,0xe0,0x6f, +0x3d,0x2c,0xe2,0x0, 0xcf,0xb, 0x16,0x86,0x17,0x3, 0xe0,0x6e,0x3c,0xad,0x3f,0x38, +0x3f,0xfe,0x5, 0xa, 0xe0,0x0, 0x17,0x64,0xe0,0x2f,0x3f,0x9e,0xe0,0x28,0x3c,0x1e, +0x3c,0x5f,0xc0,0x8, 0xa, 0x61,0x14,0x0, 0xc0,0x8, 0xa, 0x61,0x8, 0xb1,0xc0,0x44, +0x15,0x3c,0x14,0x80,0xe2,0x0, 0x7c,0x4, 0xe0,0x3, 0xdc,0x58,0xe0,0x0, 0x1f,0x8b, +0x14,0x0, 0x8d,0x8f,0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5, 0xc8,0x15,0x7f,0x3d,0x1b, +0xe2,0x1, 0xc5,0x7f,0xc5,0x1, 0xe0,0x0, 0x1f,0x8e,0xf2,0x0, 0x7b,0x4, 0x35,0x21, +0x3d,0x1f,0xe8,0x40,0x3f,0x66,0x86,0xf, 0x86,0x9f,0xc7,0x82,0xae,0xe, 0x3f,0xfa, +0xc7,0x2, 0xe0,0x40,0xae,0x9e,0x1, 0xf8,0xf0,0x0, 0x13,0x80,0xe8,0x40,0x3e,0xe7, +0xf0,0x0, 0xc3,0x81,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3d,0xf7,0x14,0x1, 0x1, 0x25, +0xe8,0x0, 0x8c,0x86,0xe8,0x0, 0x8d,0x16,0xe8,0x40,0x3f,0xe7,0xe0,0xe, 0x37,0xa1, +0xe2,0x0, 0x7e,0x4, 0x3f,0x1c,0x8e,0xe, 0x8f,0x1e,0x3e,0x79,0x3e,0x6d,0xe0,0x6c, +0x39,0xa8,0xc7,0x81,0x3f,0x7a,0xe2,0x1, 0xc7,0xff,0x3f,0x6d,0xe0,0x6e,0x39,0xac, +0x3d,0xff,0x3c,0x6e,0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf2,0x1, 0xc3,0xff,0xe8,0x40, +0x3d,0xf7,0xf0,0x0, 0xc3,0x2, 0x1, 0xdd,0xc0,0x3c,0x8, 0xe1,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x40,0xe0,0x0, 0x1f,0xb, 0xe0,0x1, 0x1f,0x97,0x8f,0xe, 0x89,0xf, +0x7f,0xb, 0x17,0x80,0xe0,0x2, 0x1f,0x2, 0xea,0x1a,0x7e,0xe0,0xaf,0x8e,0xe9,0xff, +0xc6,0xff,0xf0,0x2, 0x1b,0x8, 0xe0,0x1, 0x1f,0x6b,0xf0,0x40,0x38,0xe8,0xa4,0xd, +0xe8,0x7, 0xaf,0xd6,0x3d,0x62,0xe8,0x7, 0xaf,0xe6,0x14,0x80,0xaf,0x8e,0xf0,0x0, +0x78,0x85,0xf0,0x0, 0x7b,0x1, 0xe0,0x3, 0xdb,0xe1,0xf0,0x0, 0x63,0x1, 0xe0,0xa, +0x31,0x21,0xe8,0x40,0x3c,0x66,0x14,0x80,0xe0,0x3, 0xdb,0xd8,0x67,0x8b,0xf0,0x0, +0x60,0x85,0xe2,0x0, 0xcf,0x81,0xf0,0x0, 0x63,0x1, 0xe0,0x3, 0x5, 0x88,0xea,0x1a, +0x7e,0xe0,0xe9,0xff,0xc6,0xff,0xf0,0x0, 0xa4,0xd, 0xf0,0x0, 0x16,0x1, 0xf8,0xe, +0x3e,0x28,0xf0,0x0, 0x1f,0x6, 0xf8,0x40,0x3e,0xec,0x7f,0x10,0xf8,0x40,0x3a,0xec, +0xf8,0x40,0x3a,0x61,0xf2,0x0, 0xca,0x81,0xf8,0x40,0x8d,0x3e,0xf8,0x40,0x8c,0xae, +0xe0,0x2, 0x1, 0x66,0xe8,0x0, 0x8f,0x88,0xe0,0x2, 0x27,0xe2,0x67,0x8b,0xe8,0x40, +0x3f,0xf5,0xe0,0x2, 0x5, 0xe4,0x3b,0x6f,0xc3,0x7f,0xe2,0x1, 0xc3,0x7f,0x67,0x10, +0xe8,0xf, 0x3b,0x25,0xe8,0xe, 0x3f,0x18,0xe2,0x1, 0xc7,0xff,0x3f,0x9e,0xe0,0x0, +0x1e,0x8e,0x37,0xa1,0xc7,0x83,0x3f,0x9d,0xf0,0x0, 0x10,0x81,0xe0,0x2, 0x1e,0xc5, +0xf8,0x11,0x38,0x98,0xc3,0x1, 0xe8,0x40,0x3a,0xee,0xf0,0x0, 0x7a,0x8d,0xf8,0x40, +0x3b,0xea,0xf0,0x0, 0x7f,0xe, 0xe8,0x40,0x3a,0x61,0xf0,0x0, 0x15,0x85,0x3b,0x1d, +0xf0,0x0, 0x78,0x8c,0xf0,0x40,0x3a,0xef,0xf8,0x40,0x3f,0x69,0x0, 0x9e,0xf0,0x0, +0x21,0xc9,0x16,0x81,0xe8,0xd, 0x3e,0xd4,0xe0,0x0, 0x26,0xc4,0xe0,0x2, 0x1f,0x2, +0xe8,0x7, 0x86,0xd6,0x86,0xe, 0xc6,0x81,0xc6,0x1, 0xae,0xe, 0xe8,0x7, 0xae,0xd6, +0x8d,0x84,0xe0,0x2, 0x2d,0xa9,0xe8,0x0, 0x8e,0x88,0xae,0x84,0xc2,0x82,0xf0,0x40, +0x3a,0xf5,0xc2,0x1, 0xe0,0x2, 0x1, 0x4, 0xe0,0x40,0x8b,0x95,0xf0,0x0, 0x8e,0x5, +0xf0,0xd, 0x3b,0xa7,0xe2,0x0, 0xce,0x80,0xf0,0x2, 0x3d,0x27,0xe8,0xd, 0x3b,0xaa, +0xe2,0x1, 0xc6,0xff,0xf8,0xc, 0x3f,0x2c,0xe2,0x1, 0xc1,0x7f,0xe0,0x62,0x3d,0x2d, +0xf8,0x3, 0x3c,0xac,0xe2,0x0, 0xce,0x0, 0xf8,0xd, 0x3e,0x29,0xe2,0x1, 0xc1,0xff, +0xe2,0x1, 0xc6,0xff,0xe9,0x2c,0x39,0x1b,0xe0,0x63,0x3d,0x2d,0x2e,0x58,0xe9,0x2d, +0x39,0x9b,0x2e,0xd5,0xf1,0x2d,0x3e,0xa3,0xf1,0x33,0x3e,0xa2,0xe7,0xff,0x2e,0xb9, +0xe9,0x2d,0x39,0x1d,0x2e,0x84,0xe9,0x2d,0x39,0x9d,0x26,0xc9,0x16,0x82,0xe8,0xd, +0x3e,0xd4,0x26,0xc5,0xe0,0x2, 0x1f,0xbf,0xe0,0x1, 0x1f,0x51,0x8e,0xdf,0xa5,0x8e, +0xf0,0xc, 0x3d,0x3d,0x3e,0xb7,0xe8,0xc, 0x3e,0x19,0xe8,0xd, 0x3e,0x9c,0x36,0x21, +0x36,0xa1,0x3e,0x1b,0x3e,0x9b,0xf0,0x0, 0x90,0xc, 0xf0,0x0, 0x91,0xd, 0x16,0x82, +0xe1,0x2f,0x3e,0xa2,0xe8,0x40,0x3d,0xec,0x3d,0x67,0xe1,0x2d,0x3e,0xa3,0xe8,0x40, +0x3c,0xe9,0xe8,0x40,0x3c,0x6a,0xf0,0x0, 0x79,0x86,0xf0,0x0, 0x7a,0x2, 0xf0,0x0, +0x7a,0x84,0xf0,0x0, 0x7b,0x1, 0xf0,0x0, 0x7b,0x83,0x7f,0x8f,0x7e,0x8a,0xf0,0x0, +0x78,0x8, 0xf0,0x0, 0x79,0x7, 0xdc,0x7f,0xf0,0x0, 0x60,0x8, 0xf0,0x0, 0x61,0x7, +0xe2,0xff,0xcc,0x7f,0xf8,0xc, 0x38,0x12,0xe4,0xd, 0x36,0x4f,0x3e,0x9c,0x16,0x0, +0xe0,0x6c,0x39,0xa8,0xf8,0x40,0x38,0x72,0xe8,0x40,0x3f,0xe2,0x36,0x81,0xe8,0x6f, +0x3b,0x20,0xe8,0x40,0x3d,0xec,0x3d,0x67,0xe0,0x43,0x3e,0x9d,0xe8,0x40,0x3c,0xe9, +0xe8,0x40,0x3c,0x6a,0x7f,0x89,0x7e,0x5, 0xde,0x2e,0x67,0xa, 0xf0,0x0, 0x66,0xf, +0x3b,0xe8,0xf0,0x1c,0x3e,0x5e,0xde,0x73,0x67,0x89,0xf0,0x0, 0x60,0x8, 0xf0,0x0, +0x60,0x85,0xf0,0x0, 0x61,0x7, 0xf0,0x0, 0x61,0x86,0xf0,0x0, 0x62,0x2, 0xf0,0x0, +0x62,0x84,0xf0,0x0, 0x63,0x1, 0xf0,0x0, 0x63,0x83,0xe0,0x1, 0x24,0x45,0xf0,0x40, +0x39,0x6f,0xe0,0x2, 0x1e,0x86,0xe0,0x0, 0x1f,0x24,0x9d,0xd, 0xe0,0x0, 0x15,0xd1, +0xe2,0x0, 0xcd,0xa, 0xe0,0x0, 0x16,0xc7,0xe0,0x6d,0x3a,0xab,0x9d,0x8e,0xe0,0x72, +0x3a,0xaf,0xe2,0x0, 0xcd,0x8b,0x15,0x3c,0x15,0x80,0xe0,0x6a,0x3c,0xad,0xe0,0x6b, +0x3c,0xa7,0x3e,0xea,0x3b,0xeb,0xf0,0x0, 0x2e,0x7e,0x15,0x83,0xe1,0x2b,0x3d,0xa3, +0xe0,0x1, 0x25,0xa8,0x67,0x8f,0xe0,0x1, 0x27,0xa5,0x16,0xb4,0xf0,0x0, 0x21,0xf6, +0x67,0x8a,0xe0,0x0, 0x27,0xf3,0xe0,0x2, 0x1f,0x16,0x14,0x1e,0x8e,0x8e,0xe0,0x0, +0x2e,0xf3,0x16,0x9e,0xf0,0x8, 0x39,0x3d,0xe0,0x0, 0x14,0xe4,0xf0,0x0, 0x78,0x85, +0xf0,0x0, 0x7a,0x2, 0xf0,0x0, 0x7a,0x84,0xf0,0x0, 0x7b,0x1, 0xf0,0x0, 0x7b,0x83, +0xe0,0x3, 0xd8,0xa, 0xf0,0x0, 0x60,0x85,0xf0,0x0, 0x62,0x2, 0xf0,0x40,0x38,0xf8, +0xf0,0x0, 0x62,0x84,0xf0,0x0, 0x63,0x1, 0xf0,0x0, 0x63,0x83,0xe7,0xfe,0x5, 0x8, +0x16,0x80,0xe1,0x2c,0x3b,0x8d,0xe8,0x40,0x3e,0x7c,0xe7,0xfd,0x5, 0xfb,0xc2,0x82, +0xf0,0x40,0x3a,0xf5,0xe0,0x0, 0xc2,0x1, 0xe7,0xfe,0x1, 0x80,0xf0,0x0, 0x62,0x8d, +0xf0,0x0, 0x60,0x8c,0xf0,0x0, 0x67,0xe, 0xf0,0x0, 0xc2,0x81,0xf0,0x0, 0xc7,0x2, +0xf2,0x1, 0xc2,0xff,0xf8,0x40,0x3c,0x61,0xe7,0xfd,0x0, 0x96,0x67,0x8b,0xf8,0x0, +0xaa,0x88,0xe8,0x40,0x3f,0xf5,0xe7,0xfd,0x2, 0xa0,0xe0,0x0, 0xc0,0x40,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe8,0x0, 0x8e,0x8, 0x3e,0xeb,0xe2,0x1, 0xc6,0xff,0x3e,0xfc, +0x3d,0x6b,0x5, 0x82,0x3d,0x6c,0xea,0x1a,0x7f,0x60,0xe9,0xff,0xc7,0x7f,0xe2,0x1, +0xc5,0x7f,0xa6,0x8e,0x0, 0x8a,0xe8,0x0, 0x8f,0x8, 0x3f,0x7f,0x1, 0x9, 0xc6,0x81, +0x3e,0xf6,0xe7,0xfd,0x1, 0x45,0x8d,0x84,0x8f,0x8d,0x3f,0xfb,0x1, 0xf5,0xad,0xd, +0x0, 0xf7,0x16,0xb2,0xf7,0xff,0x29,0x8e,0xe0,0x2, 0x1f,0x96,0x8d,0x8f,0xe7,0xff, +0x25,0x93,0x14,0x2d,0xe8,0x8, 0x3c,0x32,0xe0,0x0, 0x14,0xe4,0xf0,0x0, 0x78,0x85, +0xf0,0x0, 0x7a,0x2, 0xf0,0x0, 0x7a,0x84,0xf0,0x0, 0x7b,0x1, 0xf0,0x0, 0x7b,0x83, +0xe0,0x3, 0xd7,0x9a,0xf0,0x0, 0x60,0x85,0xf0,0x0, 0x62,0x2, 0xf0,0x40,0x38,0xf8, +0xf0,0x0, 0x62,0x84,0xf0,0x0, 0x63,0x1, 0xf0,0x0, 0x63,0x83,0xe7,0xfd,0x5, 0x18, +0xe7,0xfd,0x0, 0x90,0xf8,0x40,0x38,0x72,0xe8,0x72,0x3d,0x20,0xe7,0xfe,0x0, 0xbb, +0x15,0x84,0xe1,0x23,0x3d,0xa3,0x21,0x86,0x67,0xf, 0x27,0x4, 0x16,0xba,0xe7,0xfe, +0x0, 0xd7,0xe2,0x0, 0xc9,0x2, 0xe7,0xfe,0x2, 0xd3,0x16,0xbc,0x0, 0xc6,0xe0,0x0, +0x1f,0xd, 0xe0,0x0, 0x1f,0x8e,0x8c,0xe, 0x24,0x1a,0xe0,0x10,0x8f,0x2f,0xe2,0x0, +0xcf,0x10,0x2, 0x94,0x17,0x7f,0x3f,0x18,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0x17,0xa, +0x3f,0x38,0x3f,0x1f,0x0, 0x86,0xe0,0x10,0x8e,0xaf,0xe2,0x0, 0xce,0x90,0x2, 0x86, +0x3f,0xfe,0xc7,0x8a,0x1, 0xf9,0x14,0x0, 0x38,0x82,0x14,0x1, 0x38,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x38,0xe0,0x0, 0x1f,0x8b,0xf0,0x0, 0x8c,0xf, 0xf0,0x1, 0x24,0x5d, +0xe0,0x0, 0x1e,0xe, 0xe0,0x2, 0x1f,0xbf,0x8b,0xc, 0x8a,0xdf,0x89,0x1c,0xe0,0xf, +0x3b,0x35,0xe0,0x1, 0x1f,0x51,0x14,0xff,0xa2,0xe, 0x3f,0x92,0xe8,0x9, 0x3c,0x98, +0x37,0xa1,0xe2,0x1, 0xc4,0xff,0x3f,0x94,0x34,0xa1,0x94,0xf, 0x39,0xe6,0x3b,0xe2, +0x3c,0x9c,0xe0,0x0, 0x0, 0xc5,0x3e,0x79,0xe0,0x0, 0x1, 0x50,0x8f,0x2c,0x8f,0xbc, +0xe0,0xd, 0x3f,0x35,0x3d,0x6e,0x3e,0x9f,0x36,0xa1,0x3e,0x94,0x96,0x8d,0xe4,0xb, +0x37,0x28,0x3e,0xf8,0xe0,0x6d,0x3a,0x28,0x3c,0x6d,0x3e,0xe6,0xe2,0x1, 0xc6,0xff, +0x3f,0x7d,0x5, 0x82,0x3d,0x66,0x3e,0xe3,0xe4,0xb, 0x35,0xc8,0xe2,0x1, 0xc6,0xff, +0x3d,0xfd,0x3b,0x6a,0xe2,0x1, 0xc3,0x7f,0x3, 0x82,0x3f,0x63,0x39,0xee,0x3f,0x62, +0xe2,0x1, 0xc7,0x7f,0x3f,0xfe,0xe2,0x1, 0xc1,0xff,0x3d,0xef,0xe4,0xd, 0x37,0xa8, +0x5, 0x82,0x3d,0xe2,0x3f,0x67,0xe4,0xd, 0x36,0xc8,0xe2,0x1, 0xc7,0x7f,0x3e,0xfe, +0x39,0x6b,0xe2,0x1, 0xc1,0x7f,0x3, 0x82,0x3f,0xe7,0xe0,0xe, 0x39,0xa6,0xe2,0x0, +0xcf,0x7, 0x3b,0xef,0xe2,0x1, 0xc3,0xff,0xc6,0x2, 0x2, 0x7, 0xe0,0xf, 0x3b,0xa2, +0xe2,0x0, 0xcf,0x87,0xe7,0xff,0x5, 0x39,0xe0,0x2, 0x1f,0x86,0xe0,0x3, 0x17,0x74, +0xb7,0xf, 0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0x14,0x83,0x34,0x21,0xe0,0x3, 0xd6,0xdc, +0x3b,0xf2,0x15,0x80,0xe0,0x43,0x3c,0x18,0x3e,0xeb,0x4, 0xa2,0x39,0xf6,0x4, 0x9b, +0xe0,0x40,0x3f,0x66,0xe0,0xf, 0x3f,0x35,0x16,0x1, 0x3f,0x92,0x37,0xa1,0x3f,0x94, +0x97,0x8f,0x3e,0x1d,0x3f,0xf8,0xc7,0x1, 0x3f,0xec,0xe2,0x1, 0xc7,0xff,0x16,0x1, +0xe2,0x1, 0xc7,0x7f,0x3e,0x1b,0xe0,0x6d,0x3a,0x2f,0x3f,0x73,0x3d,0xec,0xe2,0x1, +0xc5,0xff,0x5, 0xe9,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x39,0x77,0x5, 0xe0,0xe0,0x2, +0x1f,0x9f,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x5, 0xa0,0xe0,0x2, 0x1f,0x6, 0x9f,0x8e, +0xe2,0x7, 0xcf,0xe7,0x2, 0x83,0xc7,0x81,0xb7,0x8e,0xf7,0xff,0x24,0x44,0xe4,0x0, +0xc6,0x83,0xe0,0xf, 0x35,0xa1,0x3e,0xff,0x5, 0x20,0xe0,0x0, 0x1f,0x24,0xe0,0x2, +0x1e,0x86,0x9f,0x8e,0x16,0x0, 0xe2,0x3, 0xcf,0xf3,0xb6,0xd, 0xe7,0xff,0x2, 0xb3, +0xc7,0x81,0xb7,0x8e,0xe7,0xff,0x0, 0xaf,0x1, 0x69,0xe0,0x2, 0x1f,0x6, 0x9f,0x8e, +0xe2,0x0, 0xcf,0x82,0x5, 0x83,0xc7,0xfe,0xb7,0x8e,0xe0,0x0, 0x1f,0x24,0x9f,0x8e, +0xe2,0x3, 0xcf,0xf3,0x2, 0xdb,0x0, 0xd8,0xe0,0x2, 0x1f,0x6, 0x9f,0x8e,0xe2,0x7, +0xcf,0xe7,0x2, 0x83,0xc7,0x82,0xb7,0x8e,0x17,0x0, 0xe0,0x0, 0x1f,0xa4,0xb7,0xf, +0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe8,0x40,0x3d,0xe8,0xe8,0x40,0x3e,0xe8,0xe7,0xff, +0x0, 0xb8,0xe0,0x2, 0x1f,0x86,0x9c,0xf, 0x17,0x8a,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0xe0,0x0, 0x1f,0xa4,0x9c,0xf, 0x17,0x8a,0xe1,0x28,0x3c,0x1f,0x38,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x2, 0x1b,0x88,0x17,0x80,0xe0,0x7, 0xaf,0xc7, +0xe0,0x2, 0x1f,0x9f,0xe0,0x0, 0x1a,0xb, 0x8b,0xf, 0xde,0xfa,0x8f,0x84,0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x5, 0xf3,0x14,0x3, 0xdc,0xb2,0xeb,0xe6,0x7f,0xa8,0x7f,0x81, +0xe0,0x2, 0x23,0x2a,0xe2,0x0, 0xcb,0x1, 0x5, 0x86,0x8f,0x8f,0xe2,0x0, 0xcf,0x86, +0xe0,0x2, 0x2, 0xa2,0xf0,0x0, 0x88,0x84,0xe0,0x0, 0x1a,0x8e,0xe8,0x40,0x3b,0x71, +0xe0,0x2, 0x1, 0x6f,0xe0,0x7, 0x8f,0xd7,0xfa,0x12,0x7c,0x74,0xf0,0xf, 0x38,0xaf, +0xc7,0x81,0x3b,0x7f,0xe0,0x3, 0x1, 0x19,0xe0,0x2, 0x1f,0x82,0x8f,0x8f,0xe8,0x0, +0x8f,0x8, 0xf0,0xf, 0x38,0xaf,0xc7,0x81,0x3f,0x7f,0x14,0x3, 0xe0,0x2, 0x1, 0x75, +0xf0,0x3, 0x20,0x83,0x16,0x7f,0xe8,0xc, 0x3e,0x11,0xf0,0x2, 0x1c,0xc5,0xe2,0x1, +0xc6,0x7f,0xc6,0x1, 0xe8,0xc, 0x3e,0x19,0xf8,0x40,0x3b,0xe9,0xf0,0x0, 0x13,0x0, +0xe9,0x80,0x8f,0x17,0xe8,0x40,0x3f,0xe6,0xe2,0x1, 0xc7,0xff,0x3f,0x7f,0x3e,0xee, +0x3, 0x83,0xe8,0x40,0x3e,0xe6,0xe8,0x40,0x3e,0x77,0xf0,0x40,0x3b,0x6d,0xf2,0x1, +0xc3,0x7f,0x1, 0xef,0xf8,0x40,0x38,0xe6,0xf0,0x2, 0x23,0x5f,0xe0,0x1, 0x1f,0xd1, +0xfb,0xe6,0x7e,0x2a,0xfb,0xe6,0x7d,0xa9,0xf0,0x0, 0xa2,0xf, 0xe0,0x2, 0x1f,0xbf, +0xf8,0x0, 0x89,0xc, 0xf8,0x0, 0x88,0xb, 0xf0,0x0, 0x10,0x80,0xf0,0x0, 0x8a,0xdf, +0xe8,0x40,0x3b,0x62,0xe8,0x40,0x38,0xe0,0x16,0x1, 0xf0,0x1, 0x11,0xff,0xf8,0x40, +0x3d,0x61,0x3d,0x62,0xe0,0x0, 0x1f,0xe, 0xe8,0x40,0x3f,0xe9,0xf8,0x40,0x3e,0xea, +0x15,0x80,0x0, 0x85,0xf0,0x40,0x3b,0xff,0xc7,0x2, 0x1, 0x2b,0xe1,0x80,0x8e,0x9f, +0x3e,0xfc,0x1, 0xf9,0x8c,0x8e,0xc5,0x81,0xe2,0x1, 0xc5,0xff,0xe2,0x0, 0xcd,0x81, +0x8c,0x1e,0xe8,0xd, 0x3c,0xb5,0xe0,0x6a,0x39,0x28,0x3e,0x98,0xe0,0x63,0x39,0x29, +0xf2,0x0, 0xcb,0x1, 0x36,0xa1,0xe8,0xd, 0x3e,0x94,0xe0,0x1, 0x1, 0x25,0x96,0x8d, +0xc7,0x2, 0xe8,0x40,0x3e,0xfd,0xe0,0x6a,0x3a,0x28,0xe8,0x40,0x3e,0xfd,0xe0,0x63, +0x3a,0x29,0xe8,0x40,0x3e,0xfd,0xe0,0x7d,0x3a,0x2d,0xf0,0x40,0x3b,0xff,0x1, 0xd7, +0x25,0x8a,0xf0,0xf, 0x30,0xa1,0x3f,0x97,0xf0,0x0, 0xc0,0x81,0xa9,0x8f,0xf2,0x1, +0xc0,0xff,0xad,0x1f,0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0xe8,0x40,0x3e,0x76,0xe7,0xff, +0x5, 0xbb,0xf2,0x0, 0xc8,0x81,0xf0,0xa, 0x30,0xa1,0xe0,0x1, 0x1, 0x6b,0x17,0xff, +0xe8,0x0, 0xaf,0x8c,0xe8,0x0, 0xaf,0x8b,0xe0,0x2, 0x1c,0x88,0xe0,0x0, 0x1c,0xe, +0xf0,0x7, 0xa8,0xc7,0xf0,0x0, 0xa8,0x84,0xe0,0x3, 0xd7,0xb6,0x88,0x84,0xe8,0x0, +0xa8,0x88,0xe0,0x1, 0x20,0xdf,0x12,0x0, 0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0x38,0xf4, +0xe0,0x0, 0x1b,0xe, 0xe0,0x0, 0x15,0xe4,0xe0,0x0, 0x1, 0x4a,0x8c,0x86,0x8d,0x16, +0x3b,0xe9,0x39,0xea,0xe0,0x40,0x3e,0x64,0xe0,0xf, 0x36,0x21,0xe0,0xe, 0x3a,0x9f, +0x8e,0x8e,0x8f,0x1e,0xe0,0x8, 0x3b,0xad,0xe2,0x0, 0xcc,0x0, 0xe0,0xf, 0x3c,0xad, +0x3e,0xa9,0xe0,0x8, 0x39,0xae,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0xe0,0x6f, +0x3d,0x2d,0xe2,0x0, 0xcc,0x0, 0xe0,0xd, 0x3d,0x2e,0x3f,0x2a,0xe2,0x1, 0xc7,0x7f, +0xe2,0x1, 0xc6,0xff,0xe0,0x6d,0x3d,0x2e,0x3c,0x6d,0x39,0x6f,0xe2,0x1, 0xc1,0x7f, +0xe2,0x1, 0xc4,0x7f,0x39,0x78,0x3f,0x6d,0xc6,0x1, 0x3e,0xeb,0xe2,0x1, 0xc6,0xff, +0xe2,0x1, 0xc6,0x7f,0x3, 0x82,0x3f,0xee,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3f,0x7d, +0x5, 0x82,0x3f,0xeb,0x38,0xfc,0x3d,0xef,0xe2,0x1, 0xc5,0xff,0x1, 0xc6,0xc2,0x1, +0xe2,0x1, 0xc2,0x7f,0x38,0xf4,0xc3,0x2, 0xe7,0xff,0x1, 0xba,0xe2,0x0, 0xcd,0xe4, +0x17,0x80,0xe0,0x6f,0x39,0xab,0x3d,0xef,0x67,0x1, 0xad,0x8e,0xc0,0x4, 0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xfa,0x12,0x7c,0x74,0xf0,0x0, 0x88,0x84,0xe0,0x0, 0x1a,0x8e, +0xe7,0xfd,0x0, 0xf8,0xf2,0x1, 0xc9,0x7f,0xe7,0xfe,0x1, 0x5b,0xe0,0xd, 0x3c,0xa6, +0xe0,0x43,0x3e,0x9d,0xe2,0x0, 0xce,0x80,0xf0,0x2, 0x39,0x29,0xe8,0xd, 0x3c,0xa2, +0xe2,0x1, 0xc1,0x7f,0xe0,0x1e,0x3c,0x21,0xe2,0x1, 0xc6,0xff,0xe0,0x6d,0x3d,0x22, +0xf8,0x43,0x3f,0x1e,0x39,0x6d,0xf2,0x0, 0xcf,0x0, 0xe8,0xd, 0x3c,0x20,0xf0,0x1e, +0x38,0x28,0xe2,0x1, 0xc6,0xff,0xf2,0x1, 0xc7,0x7f,0xe8,0x6d,0x3d,0x2e,0x3e,0x92, +0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf3,0xe8,0x40,0x39,0x63,0xe0,0x62,0x3c,0xad, +0xe8,0x40,0x3e,0xf3,0xe0,0x6a,0x3c,0xa8,0xe8,0x40,0x3e,0xf3,0xf0,0x40,0x39,0xe2, +0xe0,0x63,0x3c,0xa9,0xe7,0xfe,0x0, 0x88,0xeb,0xe6,0x7d,0xa8,0xea,0x12,0x7e,0x74, +0xeb,0xe6,0x7e,0xaa,0xeb,0xe6,0x7f,0x29,0x15,0x7f,0xe0,0x0, 0x14,0xe4,0xac,0x8b, +0xaf,0x8c,0xad,0xd, 0xad,0xe, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x0, +0x1f,0x8d,0x8f,0x8f,0x27,0x96,0xe0,0x10,0x8f,0x25,0xe2,0x0, 0xcf,0x10,0x2, 0xae, +0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe4,0x0, 0xc7,0x8a,0x3f,0x65,0x3f,0x95,0x0, 0x86, +0xe0,0x10,0x8e,0xae,0xe2,0x0, 0xce,0x90,0x2, 0xa1,0x3f,0x7f,0xc7,0xa, 0x1, 0xf9, +0xfa,0x12,0x7c,0x74,0x14,0x1, 0xdb,0x13,0xf0,0x0, 0x88,0x84,0xe7,0xfd,0x0, 0x8a, +0x87,0x7, 0x87,0x97,0xe8,0x0, 0xaf,0xc, 0xe8,0x0, 0xaf,0x8b,0xe7,0xfe,0x0, 0x96, +0x3d,0xe1,0xe7,0xfe,0x0, 0xfb,0xfb,0xe6,0x7e,0x2a,0xfb,0xe6,0x7d,0xa9,0xe8,0x40, +0x3d,0x61,0xe7,0xfe,0x0, 0x86,0x14,0x1, 0x0, 0xe7,0xfa,0x12,0x7c,0x74,0x14,0x3, +0x0, 0xe3,0x0, 0x0, 0xe0,0x1, 0x1f,0x9c,0x8f,0x8f,0xe0,0x1, 0x27,0x82,0x8, 0xb4, +0xf7,0xff,0x11,0x7f,0xf0,0x12,0x39,0x1f,0xf0,0x0, 0x12,0x1, 0xf2,0x1, 0xc1,0x7f, +0xf0,0x14,0x3a,0x19,0xf0,0x0, 0x10,0xa, 0xe0,0x2, 0x1a,0x21,0xf4,0x0, 0xc1,0xa, +0xf2,0x1, 0xc2,0x7f,0x11,0xa, 0xf0,0x10,0x38,0x39,0xe8,0x2, 0x39,0x34,0x10,0xff, +0xf0,0x1, 0xc1,0x52,0xf0,0x10,0x38,0x14,0x38,0x9a,0xf0,0x2, 0x19,0x9d,0xf0,0x12, +0x39,0x14,0x39,0x14,0xe0,0x1, 0x11,0xff,0xf0,0x0, 0xc0,0x4, 0x38,0xa9,0x3c,0xfa, +0x3, 0xa4,0xe8,0x0, 0x8e,0x43,0xe8,0x0, 0x8f,0x80,0xf8,0x40,0x38,0xe3,0xe0,0x2f, +0x3f,0x8c,0xf0,0x40,0x3b,0xe9,0xe1,0x35,0x3e,0x3, 0x27,0x83,0xf0,0x0, 0x2a,0x9c, +0xf0,0x40,0x3b,0x61,0xf2,0x1, 0xc3,0x7f,0x3e,0xe2,0x17,0x0, 0x0, 0x89,0x8f,0xcd, +0xc7,0x1, 0xe0,0x2f,0x3f,0x8c,0xe8,0xf, 0x3f,0xd5,0xc6,0x8a,0x2f,0x8c,0xe8,0x40, +0x3f,0x76,0xe8,0x17,0x3f,0x14,0x1, 0xf4,0xf0,0x0, 0xc1,0x8a,0xf8,0x40,0x39,0xf2, +0x1, 0xd7,0xa, 0x61,0xe0,0xf, 0x36,0x23,0x3f,0x94,0xe0,0x2, 0xc7,0xac,0x8f,0x8f, +0xf4,0x0, 0xc3,0x8a,0x2f,0x83,0xe8,0x11,0x3a,0x17,0x17,0xa, 0x3f,0x38,0xe8,0x0, +0x8f,0xc1,0x3f,0x1b,0xaf,0xce,0xe8,0xf, 0x3a,0x17,0xe8,0x0, 0x9e,0x91,0xe8,0x0, +0x9e,0x1, 0xb6,0x9e,0xf0,0x0, 0xc1,0x8a,0xb6,0xe, 0xf8,0x40,0x39,0xf2,0x8e,0xdf, +0xc4,0x1, 0xae,0xde,0xe2,0x1, 0xc4,0x7f,0x8e,0xef,0xae,0xee,0x8e,0xff,0xae,0xfe, +0xe0,0x1, 0x8f,0x8f,0xe0,0x1, 0xaf,0x8e,0xe7,0xff,0x1, 0xab,0x0, 0xd3,0x38,0x82, +0xe0,0x2, 0x1f,0x9f,0xe0,0x2, 0x1f,0x15,0x8f,0x8f,0x8f,0xe, 0x2f,0x82,0x27,0x20, +0xe0,0x2, 0x1e,0x94,0xe0,0x2, 0x1e,0x1a,0x8e,0x8d,0x3e,0xfe,0x4, 0x9a,0xae,0x8c, +0xe0,0x2, 0x1f,0x20,0x8e,0x8e,0x3e,0xff,0x5, 0x8f,0xea,0x22,0x7e,0xc6,0x8d,0x8d, +0x8e,0xc, 0x3e,0x7b,0x5, 0x8d,0xaf,0x8e,0xc5,0x81,0xe0,0x0, 0x1f,0xad,0xad,0x8d, +0x17,0x1, 0xaf,0xf, 0x38,0x82,0xea,0x22,0x7f,0xc6,0x17,0x0, 0xaf,0xf, 0x38,0x82, +0xaf,0xc, 0x0, 0xe7,0xe0,0x2, 0x1f,0x20,0xe0,0x0, 0x1f,0xad,0x16,0x0, 0x8e,0x8e, +0xae,0xf, 0x2e,0x9f,0xe0,0x2, 0x1e,0x9f,0x8e,0xd, 0x26,0x1b,0xe0,0x2, 0x1e,0x95, +0x8d,0x8d,0xe0,0x2, 0x1e,0x94,0x8e,0x8d,0x3d,0xfd,0x2, 0x9b,0xe0,0x2, 0x1d,0x1a, +0x3d,0xed,0xae,0x8a,0xea,0x22,0x7e,0xc7,0x8d,0xd, 0x3d,0x7b,0x3, 0x9a,0xae,0xe, +0x15,0x81,0xe0,0x2, 0x1f,0x13,0xc5,0x1, 0xad,0x8e,0xad,0xd, 0xad,0x8f,0x38,0x82, +0xea,0x22,0x7f,0xc7,0x17,0x0, 0xaf,0xf, 0xe0,0x2, 0x1f,0x93,0xaf,0xf, 0x38,0x82, +0xe0,0x2, 0x1e,0x9a,0xad,0x8d,0xea,0x22,0x7e,0xc7,0x8d,0xd, 0x3d,0x7b,0x4, 0xe8, +0x17,0x80,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0x8f,0x8f,0x2f,0x83, +0xe7,0xff,0x0, 0x98,0x38,0x82,0xe0,0x2, 0x1f,0x55,0x8f,0x8e,0xe2,0x1, 0xcf,0xf9, +0x2, 0x83,0xc7,0x81,0xaf,0x8e,0x38,0x82,0xe0,0x2, 0x1c,0x78,0xe0,0x4, 0x15,0x6a, +0x14,0x80,0xe0,0x6b,0x0, 0xfb,0xe0,0x2, 0x1c,0xf8,0xe0,0x2, 0x1f,0x20,0x8d,0x9, +0x8c,0xe, 0xe0,0xf, 0x3c,0x9a,0x17,0x0, 0xaf,0x2f,0x24,0x1b,0x15,0xff,0x3d,0x98, +0xe2,0x1, 0xc5,0xff,0xc5,0x81,0x17,0x28,0x3f,0x3a,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, +0x1f,0xa1,0x3f,0x19,0x3d,0x9f,0x96,0xf, 0x96,0x9f,0xc7,0x8a,0xe0,0x1, 0xb6,0x1e, +0x3f,0xfb,0xc7,0x4, 0xe0,0x1, 0xb6,0x8e,0x1, 0xf7,0xe0,0xf, 0x3c,0x9a,0xac,0x2f, +0xc5,0x1, 0xe2,0x1, 0xc5,0x7f,0xe2,0x0, 0xcd,0xf, 0x1, 0x17,0xad,0x9, 0x16,0x0, +0xe0,0x2, 0x1f,0x77,0xe0,0x2, 0x1d,0x76,0xe1,0x80,0x8e,0x9e,0x3f,0xec,0xe2,0x1, +0xc7,0xff,0x3e,0xff,0x3d,0xed,0x3, 0x82,0x3d,0xec,0x3f,0x7a,0x3e,0x6b,0xe2,0x1, +0xc6,0x7f,0x1, 0xf3,0xae,0x19,0x38,0x82,0x17,0x80,0xaf,0x89,0x0, 0xe9,0xf0,0x2, +0x1b,0x77,0xf0,0x2, 0x1a,0x75,0xf0,0x2, 0x19,0x76,0xf0,0x2, 0x19,0xf8,0xf0,0x0, +0x12,0x80,0xf0,0x0, 0x13,0xcf,0xe9,0x80,0x8f,0x96,0x27,0xb5,0x15,0x7f,0x3d,0x1f, +0xe2,0x1, 0xc5,0x7f,0xe8,0xa, 0x3d,0x15,0x35,0x22,0xc5,0x16,0xe8,0xa, 0x3d,0x13, +0xe8,0x40,0x3d,0xe4,0x0, 0x83,0x3d,0x7b,0x1, 0x26,0x9e,0xb, 0x9e,0x9b,0xe0,0xf, +0x3c,0x2c,0xe3,0xff,0xc7,0xff,0xf0,0x43,0x38,0x9f,0xe0,0xe, 0x3c,0xad,0xf2,0x0, +0xc8,0x80,0xe3,0xff,0xc7,0x7f,0x3e,0x28,0xf0,0x43,0x38,0x9e,0xe3,0xff,0xc6,0x7f, +0xe0,0x6f,0x3d,0x2c,0x3e,0xa9,0xf2,0x0, 0xc8,0x80,0xe3,0xff,0xc6,0xff,0xe0,0x6e, +0x3d,0x2d,0xf1,0x2f,0x3b,0xaf,0xc5,0x84,0xf1,0x2e,0x3b,0xae,0x27,0xdd,0x27,0x5c, +0x14,0x1, 0x38,0x82,0xf8,0x40,0x3b,0x72,0xf0,0x0, 0xc2,0x28,0xf0,0x0, 0xc2,0x8a, +0x1, 0xc3,0x14,0x0, 0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfe,0xc0,0xc, +0xe0,0x2, 0x1f,0x20,0xea,0x22,0x7f,0xc4,0xf0,0x0, 0x8d,0x8e,0x7f,0x8a,0xf0,0x2, +0x25,0xff,0x97,0x8f,0xc7,0x81,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0xe4,0xe0,0x3, +0x2, 0x80,0x67,0xa, 0xb7,0x8e,0xe0,0x2, 0x1f,0x85,0xe0,0x4, 0x8f,0xdf,0xe2,0x0, +0xcf,0x81,0xea,0x22,0x7f,0xc2,0x7f,0x89,0xe0,0x7, 0x1, 0x15,0x8f,0x8f,0xe0,0x2, +0x2f,0xeb,0xe0,0x2, 0x1f,0x93,0xf0,0x0, 0x8c,0x8f,0xf0,0x2, 0x2c,0xdc,0xe0,0x0, +0x1f,0x9e,0xe0,0x2, 0x1f,0x24,0x9e,0xf, 0x9e,0xf, 0x9e,0x8e,0x9d,0x8f,0xe0,0xd, +0x3e,0x2d,0xe2,0x1, 0xc6,0xff,0xe0,0x1, 0x1f,0xce,0x7e,0x83,0x8e,0x8f,0x67,0x83, +0xe2,0x0, 0xce,0x82,0x66,0x3, 0xc7,0x82,0xe2,0x1, 0xc7,0xff,0xe0,0x6c,0x39,0x2f, +0xe0,0x2, 0x1f,0x8e,0x16,0x80,0xb5,0x8e,0x7e,0x3, 0xae,0x8f,0xf0,0x2, 0x2d,0xcd, +0xe0,0x1, 0x1f,0x9c,0x89,0xf, 0x7f,0x8f,0xe0,0xa, 0x21,0x58,0x11,0xff,0x39,0x92, +0xfa,0x21,0x7b,0x20,0xea,0x22,0x7f,0x38,0xe2,0x1, 0xc1,0xff,0xe8,0x40,0x3b,0x66, +0xea,0x22,0x7f,0xac,0xea,0x22,0x7d,0x18,0xea,0x22,0x7d,0x84,0xea,0x21,0x7e,0x14, +0xc1,0x81,0x3e,0xe6,0x39,0x9e,0x14,0x80,0x14,0x0, 0x12,0xff,0xe0,0x0, 0x12,0x1, +0xe1,0x80,0xac,0x9e,0xc6,0x8a,0x3f,0x73,0xe0,0x40,0xaa,0xed,0xe1,0x80,0xac,0x9f, +0xe1,0x80,0xb4,0x1a,0xe1,0x80,0xb4,0x1b,0xe1,0x80,0xaa,0x1c,0x1, 0xf2,0xe0,0x0, +0x1f,0x3b,0x7f,0x16,0xac,0x8e,0xf0,0xa, 0x25,0xaf,0x67,0x83,0x67,0x3, 0x37,0xa3, +0xc7,0x94,0x7f,0x97,0xea,0x22,0x7f,0xac,0x7f,0x87,0xea,0x22,0x7f,0x98,0x7f,0x86, +0xea,0x22,0x7f,0xb8,0xe4,0x0, 0xc7,0x1e,0x7f,0x8b,0xea,0x21,0x7f,0x94,0xf0,0x2, +0x1c,0x21,0xf8,0x40,0x3f,0x6b,0x7f,0x18,0xe8,0x40,0x3a,0x69,0xe0,0x0, 0x7f,0x91, +0xf0,0x40,0x3d,0xe6,0xf0,0x0, 0x7c,0x95,0xf0,0x0, 0x16,0xa, 0xf0,0x1c,0x3e,0x34, +0xf8,0xe, 0x3c,0x1c,0x81,0xce,0xe2,0x0, 0xc1,0x8f,0x39,0xf2,0x3, 0xb9,0xe0,0x1a, +0x31,0xa3,0xf8,0xb, 0x3c,0x1a,0xe0,0x2, 0xc5,0xac,0x8c,0xb, 0xe2,0x0, 0xcc,0x1, +0xe0,0x3, 0x1, 0x44,0x64,0x86,0xe0,0x5, 0x31,0xa1,0x3c,0x95,0x95,0x89,0xc5,0x81, +0xb5,0x89,0x2c,0xe, 0xea,0x20,0x7d,0xec,0xea,0x22,0x7d,0x4, 0xe0,0x9, 0x31,0xa2, +0x93,0x8e,0x93,0x1e,0x3d,0x99,0x3d,0x15,0xb3,0x8b,0xb3,0x1b,0xb4,0xa, 0x21,0x18, +0xe8,0x0, 0x8a,0xcb,0xe8,0x40,0x3d,0xeb,0x39,0xf5,0x17,0x1, 0x1, 0x89,0xe0,0x9, +0x0, 0x94,0xe0,0x1, 0x8f,0xeb,0xc5,0x8a,0x39,0xff,0xe0,0x1, 0x1, 0x60,0x3f,0xee, +0xe2,0x1, 0xc7,0xff,0x39,0x7f,0x3d,0x6e,0x17,0x1, 0x3f,0x1a,0x2, 0xf3,0xc2,0x1, +0xe2,0x1, 0xc2,0x7f,0xf0,0x40,0x3f,0x74,0xe7,0xff,0x2, 0xb8,0x12,0x8a,0x3a,0xb2, +0xe0,0x1, 0x14,0x14,0xe0,0x2, 0x1c,0xa1,0x3d,0x65,0x3c,0x10,0xe8,0x40,0x3b,0x6b, +0xf8,0x40,0x3d,0xee,0xe0,0x3, 0xd4,0x38,0xf0,0xa, 0x27,0x3e,0x11,0xff,0xe8,0x3, +0x39,0x9e,0xe2,0x1, 0xc1,0xff,0xc1,0x81,0xe4,0x0, 0xc1,0x8a,0xea,0x22,0x7f,0xac, +0x3a,0x6f,0xea,0x16,0x7c,0x58,0xe0,0x2, 0x1c,0xa1,0xe8,0x3, 0x39,0x98,0x8d,0x49, +0xe0,0xf, 0x3a,0x1a,0x8d,0x8f,0x25,0x9f,0x21,0x1e,0x3f,0x66,0x3e,0xe8,0x17,0x80, +0x0, 0x8d,0xe2,0x0, 0xcd,0x82,0xe0,0x1, 0x1, 0x15,0xc7,0x81,0x3e,0x6f,0xe2,0x1, +0xc6,0x7f,0x3e,0x72,0xc7,0xa, 0xc6,0x8a,0x3, 0x8e,0xe2,0x0, 0xcd,0x81,0x1, 0xf2, +0x8e,0x4e,0x3e,0x7a,0x1, 0xf3,0xe4,0x0, 0xc7,0x8a,0x3f,0x96,0x97,0xf, 0x97,0x9f, +0xb7,0x9, 0xb7,0x99,0xc4,0x8a,0x39,0xf9,0x1, 0xdb,0x3c,0xe6,0x3d,0x65,0xe0,0x3, +0xd3,0xfb,0xe0,0x1, 0x14,0x94,0x3d,0x65,0x3c,0x90,0x3c,0x66,0xe0,0x3, 0xd3,0xf4, +0xe0,0x0, 0x21,0x41,0x11,0xff,0x39,0x92,0xe2,0x1, 0xc1,0xff,0xc1,0x81,0xe4,0x0, +0xc1,0x8a,0xe0,0x2, 0x1a,0x21,0xf0,0x40,0x3b,0x66,0x39,0x96,0x13,0xfd,0x13,0x0, +0xe0,0x0, 0x12,0x80,0xf7,0xff,0x13,0xff,0xe8,0x0, 0x8f,0x46,0xe0,0xf, 0x37,0x23, +0x3f,0x72,0x3f,0x94,0xe0,0x2, 0xc7,0xac,0x3, 0xa0,0x87,0x8f,0xea,0x22,0x7c,0xb8, +0x3f,0xd7,0xe2,0x1, 0xc7,0xfd,0xea,0x22,0x7d,0x2c,0xea,0x22,0x7d,0x98,0xea,0x22, +0x7e,0x4, 0xea,0x21,0x7e,0x94,0xe2,0x0, 0xcf,0x81,0xe0,0x8, 0x37,0x21,0x3c,0x9e, +0x3d,0x1e,0x3d,0x98,0x3e,0x18,0x3f,0x1d,0x1, 0x88,0xf8,0x0, 0xab,0xc6,0xab,0x9, +0xab,0xa, 0xb2,0x8b,0xb2,0x8c,0xaf,0x8e,0xf0,0x0, 0xc3,0xa, 0xe8,0x40,0x39,0xf6, +0x1, 0xd4,0xe0,0x2, 0x1f,0xa0,0x17,0x0, 0xf0,0x0, 0xad,0x8f,0xe0,0x2, 0x1f,0xd5, +0xaf,0xf, 0xe0,0x1, 0xc0,0x74,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x0, 0xb5,0x8f, +0xe7,0xfd,0x0, 0x8b,0x67,0x9, 0xc7,0xff,0xaf,0x8e,0xe7,0xfd,0x0, 0x94,0xe0,0x0, +0x17,0xe4,0xe7,0xfd,0x0, 0x80,0xe0,0x2, 0x1f,0x9f,0x8f,0x8f,0xe0,0x5, 0x2f,0xe8, +0xe0,0x1, 0x1f,0x9c,0x89,0xf, 0x7f,0x8f,0xe7,0xfd,0x29,0x32,0xe0,0x0, 0x1f,0x3b, +0xfa,0x21,0x7b,0x20,0xe8,0x40,0x3b,0x66,0x7f,0x16,0xa9,0xe, 0xe7,0xfd,0x0, 0xd7, +0x8e,0x4d,0x3e,0x7a,0xe7,0xfe,0x1, 0xeb,0xe4,0x0, 0xc7,0x8a,0x3f,0x98,0x97,0xf, +0x97,0x9f,0xb7,0x9, 0xb7,0x99,0xe7,0xfe,0x0, 0xf7,0x3a,0xe3,0xf0,0x0, 0x14,0x8a, +0xf0,0x19,0x3c,0xba,0xf8,0x1d,0x3e,0x18,0xf8,0xe, 0x3d,0x99,0xe0,0x0, 0x11,0x78, +0x9d,0x9e,0x9d,0xe, 0xe8,0x0, 0x9c,0x9d,0x39,0x35,0xea,0x17,0x7f,0x3c,0xe8,0x0, +0x9c,0xd, 0xe0,0x6, 0x39,0x1e,0xef,0xfd,0xd2,0xef,0xea,0x20,0x7d,0xec,0xe0,0xa, +0x32,0xa2,0x3d,0x1b,0x9d,0x9a,0x3b,0xe8,0x9d,0xa, 0xe8,0x0, 0x9c,0x9d,0xe8,0x0, +0x9c,0xd, 0xef,0xfd,0xd2,0xe1,0xea,0x22,0x7d,0x84,0xe0,0x16,0x32,0xa1,0xe8,0xb, +0x3d,0x96,0x91,0xb, 0x7c,0x12,0x39,0x17,0xe3,0xff,0xc1,0x7f,0xe2,0x1f,0xc9,0x20, +0xe0,0x3, 0x2, 0xc2,0xb1,0xb, 0xf8,0xa, 0x3d,0x99,0x65,0x8b,0xe8,0x0, 0x9f,0x8d, +0xe8,0x0, 0x9f,0x1d,0x94,0xa, 0x95,0x1a,0x3d,0x95,0xf8,0x0, 0x8e,0xed,0x8c,0x8b, +0xe0,0x8, 0x3f,0xa8,0x65,0x86,0xe0,0xa, 0x3f,0x2a,0xe0,0x43,0x3c,0x18,0xe0,0x43, +0x3d,0x1a,0xe8,0xb, 0x3d,0x96,0xf0,0x0, 0x7e,0x8c,0x7f,0x84,0x7f,0x8, 0x7c,0x13, +0x7d,0x14,0xf0,0x0, 0x9e,0x8b,0xe0,0x1, 0x24,0x92,0x15,0x98,0x3d,0xb9,0xf7,0xff, +0x12,0xe8,0x3d,0x96,0xf0,0x15,0x3a,0x9b,0xe0,0x0, 0x15,0x64,0xf8,0x15,0x8, 0x5, +0x3d,0x10,0xe2,0x0, 0xcc,0x81,0xf8,0xa, 0x8, 0x15,0xf0,0x0, 0x9c,0xda,0xe0,0x8, +0x5, 0x97,0xf7,0xff,0x12,0xd0,0xf0,0x15,0x3a,0x9b,0xf8,0x15,0x8, 0x5, 0xe0,0x0, +0x15,0xfc,0x3d,0x90,0xf8,0xb, 0x8, 0x15,0xf0,0x40,0x3a,0xe6,0x65,0x15,0x14,0x0, +0xc5,0x1, 0xe8,0x0, 0x97,0xd5,0xe2,0x1, 0xc5,0x7f,0x3c,0xfa,0x3c,0x1f,0xe3,0xff, +0xc4,0x7f,0xf0,0x0, 0xc2,0x98,0x2, 0xf5,0xe0,0x3, 0xd0,0xb6,0x65,0x91,0xe3,0xff, +0xc4,0x7f,0x3d,0x95,0x8d,0x8b,0x7c,0xd, 0xe0,0x0, 0x2d,0xed,0x67,0x97,0xe8,0x40, +0x3d,0x69,0xf0,0x40,0x3c,0xff,0x5, 0x5, 0x67,0x17,0x3f,0x77,0xe0,0x4, 0x4, 0x4b, +0xe0,0x0, 0x4d,0xe4,0x5c,0xb7,0xe4,0x0, 0xc5,0x85,0x17,0x0, 0x3c,0xfb,0x7f,0x10, +0x5, 0xa, 0xe0,0x0, 0x4d,0xfc,0xe0,0x0, 0x5c,0xc3,0xe4,0x0, 0xc5,0x85,0x3c,0xfb, +0xe0,0x4, 0x2, 0x32,0x65,0x98,0x3d,0x9a,0x3d,0xf7,0xe0,0x3, 0x4, 0x15,0xe0,0x0, +0xc5,0x40,0x3d,0x77,0xe0,0x4, 0x3, 0x22,0x67,0x10,0xe0,0x5, 0x2f,0x79,0xe0,0x1, +0x17,0xc8,0x7f,0x8e,0xe0,0x3, 0x0, 0x8b,0xea,0x22,0x7f,0x4, 0x14,0x8a,0xe0,0x7, +0x31,0xa1,0xea,0x22,0x7d,0x38,0xea,0x22,0x7d,0x98,0x3c,0xb3,0xea,0x21,0x7f,0x94, +0xf0,0x0, 0x63,0x87,0xc2,0x1, 0x12,0x80,0x3f,0x17,0xe2,0x1, 0xc2,0x7f,0x13,0x0, +0x3d,0x13,0xf0,0x17,0x3b,0x93,0x3d,0x97,0xe8,0x9, 0x3c,0x9b,0x3f,0x93,0xb2,0x8e, +0xf0,0x40,0x3f,0x74,0x17,0x7f,0xab,0xa, 0xe8,0x0, 0xab,0x7, 0xb2,0x8b,0xaf,0x49, +0xac,0xf, 0xe7,0xfc,0x2, 0x83,0xe7,0xfc,0x0, 0xcb,0x65,0x91,0x7c,0x99,0x3d,0x95, +0x8d,0x8b,0x7c,0x9a,0x7c,0x9b,0x7c,0x9c,0x7c,0x9d,0x7c,0x9e,0x7c,0x9f,0x7c,0xa0, +0x7c,0xa1,0x7c,0xa2,0x7c,0xa3,0x7c,0xa4,0xe0,0x3, 0x25,0xcc,0xf0,0x40,0x3c,0xe9, +0x7c,0x8d,0xc5,0xff,0x65,0x7, 0x67,0x95,0x64,0x91,0x3d,0x15,0x3c,0x95,0x7f,0x90, +0xe0,0x0, 0x17,0x78,0x17,0x81,0x8d,0xa, 0xad,0x89,0x7f,0xe, 0x7f,0x85,0xe0,0x1, +0x2d,0x48,0xe0,0x0, 0x15,0xe4,0xe1,0x2b,0x3b,0x9b,0xe0,0x1, 0x25,0xba,0x67,0x5, +0xe0,0x1, 0x27,0x37,0x65,0x87,0xf0,0x0, 0x62,0x83,0x3d,0x95,0x14,0x81,0xac,0x8b, +0xf2,0x1, 0xc2,0xff,0xf0,0x40,0x3c,0xea,0xe0,0x0, 0x15,0xe4,0xe8,0xb, 0x3d,0xb5, +0xe3,0xff,0xc5,0xfc,0xe2,0x5, 0xcd,0x80,0x5, 0x8a,0x67,0x9, 0x8d,0xe, 0xe2,0x0, +0xcd,0x0, 0xe0,0x5, 0x15,0x0, 0xe0,0x6a,0x39,0xab,0x3d,0xea,0x3d,0xf7,0xe0,0x1, +0x3, 0x8d,0xf2,0x0, 0xce,0x82,0xe0,0x1, 0x5, 0x89,0xf8,0xb, 0x3c,0x1a,0x64,0x87, +0xe0,0x2, 0xc5,0xac,0x3c,0x95,0x14,0x0, 0x8d,0xb, 0xac,0x9, 0xe0,0x2, 0x2d,0x18, +0x15,0x3, 0xad,0xb, 0xe0,0xb, 0x32,0xa3,0xe8,0xb, 0x3d,0x98,0xe0,0x2, 0xc5,0xad, +0x15,0x3, 0xad,0xb, 0xf0,0x0, 0x27,0x3d,0x16,0xff,0xe8,0xd, 0x3e,0x9e,0xf0,0x40, +0x3f,0x6d,0xf2,0x1, 0xc7,0x7f,0x15,0x8a,0xe8,0xb, 0x3d,0xbe,0xf8,0xf, 0x3e,0x18, +0xe8,0xb, 0x3d,0x98,0xf0,0x0, 0x91,0xab,0xf0,0x0, 0x92,0x3b,0xf0,0x0, 0x90,0xb, +0xf0,0x0, 0x91,0x1b,0xf0,0x0, 0x90,0xcb,0xf0,0x0, 0x9a,0x8f,0xf0,0x0, 0x9b,0x1f, +0xf0,0x0, 0x8b,0xcf,0x89,0xdf,0x8c,0x6f,0x8c,0xff,0xe0,0x1, 0x8d,0xf, 0xf0,0x0, +0xb0,0xf, 0xc2,0x7f,0xf0,0x0, 0xb1,0x1f,0xe2,0x1, 0xc2,0x7f,0xf0,0x0, 0xb1,0xaf, +0xf0,0x0, 0xb2,0x3f,0xf0,0x0, 0xb0,0xcf,0xf0,0x0, 0xb2,0x8b,0xf0,0x0, 0xb3,0x1b, +0xf0,0x0, 0xab,0xcb,0xa9,0xdb,0xac,0x6b,0xac,0xfb,0xe0,0x1, 0xad,0xb, 0x67,0xb, +0x3a,0x9e,0x8d,0x85,0xe2,0x0, 0xcd,0x85,0xe0,0x0, 0x1, 0x72,0x17,0x98,0x3f,0xbb, +0xc2,0x1, 0xe0,0xe, 0x3b,0x1f,0x67,0x83,0xe2,0x1, 0xc2,0x7f,0xaf,0x8e,0xc5,0x81, +0x67,0x8e,0xe0,0x1, 0xb1,0x3e,0xf0,0x40,0x3f,0x74,0xaf,0x9e,0x67,0x8c,0xb3,0xde, +0xaf,0xae,0x67,0x90,0xf0,0x1, 0xb6,0x9e,0xaf,0xbe,0x67,0x85,0xad,0x85,0xaf,0xce, +0x67,0x93,0xb7,0xbe,0x67,0x94,0xb7,0xce,0x67,0x92,0xb7,0xee,0x67,0x84,0xb7,0xfe, +0x67,0x88,0xe0,0x1, 0xb7,0x8e,0x67,0x8d,0xe0,0x1, 0xb7,0xae,0x67,0xf, 0x89,0xe, +0xe7,0xfa,0x2, 0xac,0xe7,0xfa,0x0, 0xf4,0xf7,0xff,0x24,0xcb,0xe7,0xfe,0x0, 0xf7, +0x15,0x0, 0xe0,0x0, 0x17,0xee,0x17,0x0, 0xad,0xb, 0x7f,0x8e,0x7f,0x5, 0xf0,0x0, +0x14,0x80,0xf0,0x0, 0x62,0x83,0xf2,0x1, 0xc2,0xff,0xe7,0xfe,0x0, 0xcf,0xe2,0x0, +0xcd,0x1, 0xe0,0x2, 0x1, 0x16,0xe2,0x0, 0xcd,0x2, 0x1, 0xf2,0xf0,0x0, 0x62,0x83, +0xe0,0x0, 0x4c,0xfc,0xe0,0x0, 0x5c,0x43,0xf2,0x1, 0xc2,0xff,0xf0,0x0, 0x7a,0x81, +0xe0,0x2, 0xdf,0x5a,0xf0,0x0, 0x62,0x81,0xe0,0xa, 0x34,0x1, 0xe8,0xa, 0x3d,0x35, +0x65,0x87,0xe3,0xff,0xc5,0x7f,0x3d,0x95,0xe1,0x39,0x3d,0x17,0x15,0x0, 0xad,0xb, +0xe7,0xfe,0x0, 0xac,0xe0,0x1f,0x15,0x20,0xb5,0xb, 0xe0,0x1f,0x11,0x20,0xe7,0xfc, +0x0, 0xbc,0x67,0x9, 0x17,0x83,0xaf,0x8e,0xe7,0xf8,0x0, 0xed,0xe0,0x0, 0x12,0xe0, +0xf0,0x40,0x3c,0xe6,0x3a,0x96,0x11,0x98,0xe8,0x40,0x3c,0x69,0xf0,0x0, 0xc4,0x98, +0x3d,0x63,0xe8,0x40,0x3c,0xe9,0xe0,0x3, 0xd1,0x67,0xe8,0x40,0x3a,0xf9,0x1, 0xf5, +0x67,0x83,0x67,0xe, 0xe0,0xc, 0xaf,0x86,0xc2,0x1, 0x67,0x8c,0xe0,0xc, 0xaf,0x16, +0xe2,0x1, 0xc2,0x7f,0x67,0x10,0xe0,0xc, 0xaf,0xa6,0xf0,0x40,0x3f,0x74,0x67,0x85, +0xe0,0xc, 0xaf,0x36,0x67,0x13,0xe0,0xc, 0xaf,0xc6,0x67,0x94,0xe0,0x6, 0xb7,0x36, +0x67,0x12,0xe0,0x6, 0xb7,0xc6,0x67,0x84,0xe0,0x6, 0xb7,0x66,0x67,0x8, 0xe0,0x6, +0xb7,0xf6,0x67,0x8d,0xe0,0x7, 0xb7,0x6, 0x67,0xf, 0xe0,0x7, 0xb1,0x36,0xe0,0x6, +0xb3,0xd6,0xf0,0x7, 0xb6,0x96,0xe0,0x7, 0xb7,0xa6,0x89,0xe, 0xe7,0xf9,0x2, 0xa6, +0xe7,0xf9,0x0, 0xee,0xe0,0x0, 0x17,0x64,0x7f,0xe, 0x67,0x8d,0xe2,0x0, 0xcf,0x8a, +0x2, 0xb4,0x17,0x1, 0x7f,0x5, 0x67,0x16,0x8d,0x8e,0xe2,0x0, 0xcd,0x81,0x65,0x87, +0x3d,0x95,0xe7,0xfe,0x1, 0x6f,0x8d,0xb, 0xe7,0xfd,0x0, 0xb3,0x67,0x8f,0x15,0x1, +0x8c,0xf, 0xad,0xb, 0xe7,0xfd,0x24,0x68,0xe8,0x19,0x8d,0xc8,0x3d,0xf3,0xe0,0x3, +0x1, 0x7f,0xe0,0x2, 0x1d,0x21,0x15,0x81,0x3f,0xeb,0xe2,0x1, 0xc7,0xff,0x3c,0x7f, +0xf0,0x40,0x3b,0xeb,0xc5,0x81,0xe7,0xfd,0x5, 0xd7,0xe0,0x1a,0x8f,0xea,0xc5,0xa, +0x39,0xff,0x1, 0xf3,0x15,0x8a,0xe8,0xb, 0x3d,0xb7,0x15,0x7f,0xe8,0xb, 0x3d,0x98, +0xe0,0x19,0xad,0x4b,0xe7,0xfd,0x0, 0xc8,0xf0,0x0, 0x5a,0xbc,0x17,0x81,0xf2,0x0, +0xca,0x8a,0x7f,0x85,0x5, 0xc9,0xe0,0x0, 0x5d,0xc8,0xe2,0x0, 0xcd,0x8a,0x5, 0xc4, +0x55,0xba,0x54,0x36,0x55,0x35,0x3d,0x98,0xe0,0x43,0x3d,0x9b,0x54,0xb9,0xe2,0x0, +0xcd,0x80,0x3c,0x9a,0xe0,0x43,0x3c,0x99,0x3d,0x6b,0xe0,0x3, 0x4, 0x62,0xe2,0x0, +0xcc,0x80,0x3d,0xea,0xe3,0xff,0xc5,0xff,0x3d,0x69,0xe0,0x3, 0x4, 0x57,0x64,0x88, +0x64,0x4, 0xe3,0xff,0xc5,0x7f,0xf0,0x0, 0x7a,0x81,0xef,0xfd,0xd0,0x5d,0x5d,0xbd, +0xe0,0x43,0x3c,0x18,0xe2,0x1f,0xcd,0x9f,0xf0,0x0, 0x62,0x81,0xe0,0x3, 0x5, 0xb4, +0x15,0x8f,0xe8,0xb, 0x3d,0xb5,0xe3,0xff,0xc5,0xff,0x3c,0x7b,0x67,0x8e,0xe0,0x28, +0x3c,0x2b,0x15,0xa8,0xe0,0x6b,0x3b,0x2f,0x7c,0x5, 0x7d,0x8e,0xe7,0xff,0x0, 0x8d, +0xf0,0x40,0x3c,0xeb,0x3d,0x6b,0x7d,0x8d,0xe7,0xfb,0x0, 0xd4,0xe0,0x0, 0x1f,0xbb, +0xe0,0x1, 0x1f,0x1c,0xfa,0x21,0x7b,0x20,0xe8,0x40,0x3b,0x66,0x7f,0x96,0x7f,0xf, +0xae,0x8f,0x89,0xe, 0xe7,0xf7,0x0, 0xf3,0x17,0x94,0x17,0x0, 0x7f,0x8e,0x7f,0x5, +0xe7,0xfe,0x0, 0xf3,0x5c,0xbc,0x15,0x94,0xe1,0x2b,0x3c,0x9b,0x7d,0x90,0xe7,0xfb, +0x0, 0xcb,0xe0,0x2, 0x1f,0x8e,0x15,0x81,0xad,0x8f,0xe7,0xfb,0x0, 0xb3,0xe0,0x0, +0x5d,0xc8,0xe2,0x0, 0xcd,0x82,0x2, 0x98,0x5d,0x37,0xe2,0x0, 0xcd,0x4f,0x2, 0x94, +0xf2,0x0, 0xce,0x93,0xe0,0x0, 0x2, 0xc7,0xe0,0x0, 0x5d,0x44,0xe2,0x0, 0xcd,0x1d, +0x2, 0x8b,0x5d,0x38,0xe2,0x0, 0xcd,0x4f,0x2, 0x87,0xf0,0x0, 0x62,0x83,0xf2,0x1, +0xc2,0xff,0xe0,0x1, 0x0, 0x87,0xf2,0x0, 0xce,0x89,0x2, 0xb4,0xf0,0x0, 0x5a,0x3c, +0xf2,0x0, 0xca,0x8, 0x5, 0xbc,0x67,0x8c,0xe2,0x0, 0xcf,0x8e,0x2, 0xad,0xe0,0x0, +0x4d,0xe4,0xe8,0x40,0x3c,0x69,0x3c,0xeb,0x7d,0x82,0xe0,0x2, 0xde,0x25,0xf0,0x0, +0x62,0x83,0xe0,0x16,0x34,0x2, 0xf2,0x1, 0xc2,0xff,0xf8,0x16,0x3b,0x35,0x65,0x82, +0xf8,0x40,0x3c,0xe6,0xf3,0xff,0xc4,0xff,0xf2,0x0, 0xcc,0xf8,0xe0,0x2, 0x2, 0xb0, +0xe2,0x0, 0xcd,0x8a,0xe0,0x0, 0x5, 0xde,0xf2,0x0, 0xcc,0xcf,0xe8,0x40,0x3d,0xe9, +0x2, 0x83,0xe0,0x0, 0x15,0xd0,0xf0,0x40,0x3c,0xeb,0xf3,0xff,0xc4,0xff,0xe0,0x0, +0x0, 0xd1,0xf0,0x0, 0x5a,0x3c,0x15,0xf, 0xf1,0x29,0x3a,0x1a,0x24,0x88,0xe1,0x2b, +0x3d,0x9a,0x25,0x85,0x67,0xc, 0xe2,0x0, 0xcf,0x9, 0x5, 0xca,0xe0,0x0, 0x4d,0xff, +0xe0,0x0, 0x2d,0xec,0xf0,0x0, 0x62,0x83,0xe0,0x0, 0x4c,0xe4,0x5c,0x37,0xf2,0x1, +0xc2,0xff,0xf0,0x0, 0x7a,0x2, 0xf0,0x0, 0x7a,0x81,0xe0,0x2, 0xdd,0xe5,0xe0,0x0, +0x4d,0x66,0xf0,0x0, 0x62,0x81,0xe0,0xb, 0x34,0x1, 0x67,0x8c,0xe8,0xb, 0x3d,0xb5, +0x35,0x21,0xe0,0x2a,0x3f,0x9a,0xe3,0xff,0xc5,0xff,0xf0,0x0, 0x62,0x2, 0x25,0x37, +0x15,0x1d,0xe9,0x34,0x3d,0x24,0xf0,0x0, 0x22,0x33,0xe0,0x2, 0x1d,0x12,0x8d,0xa, +0x2d,0x2e,0xe0,0x0, 0x4d,0x7e,0xe0,0xa, 0x3f,0xaa,0xe0,0x43,0x3c,0x9a,0xe2,0x0, +0xcc,0x80,0x5, 0x22,0xe2,0x0, 0xcd,0x5, 0x5, 0x22,0xe2,0x1, 0xcd,0xc7,0xf0,0x40, +0x3b,0x6b,0x2, 0x83,0xf0,0x1, 0x13,0x48,0xf8,0x40,0x3c,0xe6,0xf3,0xff,0xc4,0xff, +0xf0,0x40,0x3c,0xf7,0x5, 0xae,0xf2,0x0, 0xce,0x87,0xe0,0x1, 0x2, 0x9c,0xe2,0x0, +0xcb,0x94,0xe0,0x1, 0x5, 0xaa,0x65,0x87,0x15,0x2, 0x3d,0x95,0xad,0xb, 0xf0,0x0, +0x14,0x80,0xe7,0xfb,0x0, 0x83,0xe3,0xff,0xcc,0xfb,0x4, 0x60,0x67,0xc, 0xf0,0x40, +0x3b,0x6b,0xe2,0x0, 0xcf,0xf, 0xe0,0x0, 0x2, 0xdf,0xe2,0x0, 0xcd,0xf8,0x5, 0xdd, +0xf0,0x0, 0x13,0x78,0x0, 0xda,0x15,0x0, 0xe7,0xf8,0x0, 0xd2,0x17,0xa, 0x17,0x80, +0x7f,0xe, 0x7f,0x85,0xe7,0xfd,0x0, 0x99,0xf0,0x0, 0x62,0x83,0xf2,0x1, 0xc2,0xff, +0xe0,0x0, 0x15,0xe4,0xe1,0x2b,0x3b,0x9b,0xe0,0x0, 0x25,0xcc,0x67,0x5, 0xe0,0x0, +0x27,0x49,0x65,0x87,0x15,0x3, 0x3d,0x95,0xf2,0x0, 0xce,0x9d,0xad,0xb, 0xe0,0x1, +0x2, 0x93,0xe0,0x2, 0x1f,0xf8,0x8d,0x9f,0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5d,0xc4, +0xe0,0x0, 0x5, 0xee,0xe0,0x0, 0x4d,0x67,0xe0,0x0, 0x2d,0x6a,0xe2,0x0, 0xcd,0x9d, +0xf0,0x40,0x3c,0xea,0xe0,0x1, 0x5, 0xad,0x65,0x87,0x3d,0x95,0x8d,0x8b,0xe2,0x0, +0xcd,0x81,0x1, 0x2d,0xe2,0x0, 0xcd,0x83,0xe7,0xfa,0x1, 0xb8,0x65,0x87,0x15,0x1, +0x3d,0x95,0xad,0xb, 0xe7,0xfa,0x0, 0xb2,0xe0,0x0, 0x1f,0xbb,0xea,0x21,0x7b,0x20, +0xf0,0x0, 0xad,0x8f,0x12,0x8a,0x3a,0xb2,0xe0,0x2, 0x1c,0xa1,0xe0,0x1, 0x14,0x14, +0x3d,0x65,0x3c,0x10,0xe0,0x2, 0xdf,0x78,0xea,0x16,0x7c,0x58,0xf8,0x40,0x3d,0xe9, +0xe7,0xf6,0x0, 0xf5,0xe2,0x1, 0xcd,0xc8,0xe7,0xff,0x5, 0x80,0xe7,0xfe,0x0, 0xfc, +0xf2,0x0, 0xce,0x9d,0xf0,0x0, 0x14,0x80,0xe7,0xff,0x5, 0xbd,0xe0,0x0, 0x5d,0xc6, +0xe0,0x0, 0x5d,0x45,0x64,0x88,0x64,0x4, 0xf0,0x0, 0x7a,0x81,0xef,0xfc,0xde,0xec, +0xe2,0x0, 0xcc,0x3b,0xf0,0x0, 0x62,0x81,0x2, 0x87,0x65,0x8b,0x15,0x0, 0x3d,0x95, +0xad,0xb, 0xf0,0x0, 0x14,0x80,0x65,0x87,0x15,0x0, 0x3d,0x95,0xad,0xb, 0xe7,0xf9, +0x0, 0xf5,0xe0,0x0, 0x5d,0xc4,0xe2,0x0, 0xcd,0xe4,0x5, 0x8e,0x15,0x93,0xe9,0x2b, +0x3d,0xad,0x25,0x8a,0x15,0x94,0xe1,0x2b,0x3b,0x9b,0x25,0x86,0x67,0x8c,0xe2,0x0, +0xcf,0x93,0xe7,0xfe,0x5, 0xda,0xf0,0x0, 0x14,0x81,0x0, 0xd1,0xe2,0x0, 0xcd,0x9d, +0xf0,0x0, 0x14,0x80,0xe7,0xff,0x2, 0x9a,0x67,0x12,0xe2,0x0, 0xcf,0x1d,0xe7,0xff, +0x2, 0x95,0x67,0x8a,0x9d,0x8f,0xe2,0x0, 0xcd,0xf7,0xe7,0xff,0x2, 0x8f,0xe0,0x2, +0x1d,0x92,0x8d,0x8b,0xe8,0x39,0x3d,0x89,0xe7,0xff,0x0, 0x88,0xf0,0x0, 0x14,0xf8, +0xe7,0xfe,0x0, 0xb0,0xf0,0x0, 0x14,0x80,0xe7,0xff,0x0, 0x8a,0xf0,0x0, 0x13,0x80, +0xe7,0xfc,0x0, 0x92,0x15,0x9, 0x15,0x86,0x67,0xc, 0xe8,0xa, 0x3d,0x35,0xe8,0xb, +0x3d,0xb5,0xe2,0x0, 0xcf,0xb, 0xe3,0xff,0xc5,0xfe,0xe3,0xff,0xc5,0x7f,0xe0,0x6a, +0x3c,0xab,0x3d,0xea,0xe7,0xfc,0x0, 0xc3,0x15,0x0, 0xe7,0xfc,0x0, 0xaa,0x15,0x0, +0xe7,0xfc,0x0, 0x9f,0xea,0x16,0x7c,0x58,0xe7,0xf5,0x0, 0xf9,0x15,0x80,0x7d,0x9f, +0x7d,0xa0,0x7d,0xa1,0x7d,0xa2,0x7d,0xa3,0x7d,0xa4,0xe7,0xf7,0x0, 0xef,0x64,0x88, +0x64,0x4, 0xf0,0x0, 0x7a,0x81,0xd9,0x6c,0xf0,0x40,0x3c,0xe8,0xf0,0x0, 0x62,0x81, +0xe7,0xfe,0x24,0x4c,0xe7,0xfe,0x0, 0x81,0x8, 0xb2,0xe0,0x1, 0x1f,0x9c,0xea,0x22, +0x7c,0x4c,0x89,0xf, 0x14,0x80,0x31,0x21,0x3d,0x62,0xe0,0x2, 0xdf,0xf, 0xea,0x22, +0x7c,0x60,0x3d,0x62,0x14,0x80,0x9, 0x21,0xe0,0x5e,0x0, 0x88,0x3f,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3e,0xe1,0xfe,0xc0,0x5c,0xe0,0x2, 0x19,0x20,0xea,0x16,0x78,0xd6, +0xf0,0x0, 0x8f,0x2, 0xf0,0x2, 0x1c,0xa1,0x89,0x81,0xf0,0x0, 0x2f,0x6e,0x21,0x85, +0xe0,0x2, 0x1f,0x93,0xf0,0x0, 0xaf,0xf, 0xdf,0xd8,0xe0,0x1, 0x1e,0x9c,0x8a,0x8d, +0x13,0xa, 0x3b,0x35,0xe0,0x1, 0x14,0xff,0x3d,0x66,0xe2,0x0, 0x7c,0x44,0x7e,0x81, +0xe0,0x2, 0xde,0xe4,0x14,0x80,0xe2,0x0, 0x7d,0xc4,0xe8,0x40,0x3d,0x6e,0x3c,0x69, +0xef,0xff,0xd7,0xe2,0x3d,0x65,0xe8,0x40,0x3c,0xee,0xe2,0x0, 0x7d,0xc4,0xef,0xff, +0xd7,0xdb,0xe0,0x2, 0x1c,0xa1,0x15,0x0, 0xe2,0x0, 0x7a,0x44,0x66,0x81,0x22,0xad, +0x24,0x11,0x8d,0xc9,0x8f,0xc4,0x3f,0xfb,0x1, 0x21,0x3f,0x64,0x17,0x80,0x0, 0x84, +0x8e,0x4e,0x3e,0x7b,0x1, 0x1b,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0xf8,0xc7,0xa, +0x1, 0xf8,0x17,0xa, 0x3f,0x3a,0x17,0x8a,0xe8,0xe, 0x3f,0x19,0x3f,0xb8,0x93,0x8e, +0x90,0x9e,0x95,0xae,0x96,0x3e,0x97,0x4e,0x3f,0x94,0xc4,0x1, 0xb3,0x8f,0xe2,0x1, +0xc4,0x7f,0xb0,0x9f,0xb5,0xaf,0xb6,0x3f,0xb7,0x4f,0xc5,0x1, 0x3f,0xea,0xe2,0x1, +0xc7,0xff,0x3a,0xff,0xc4,0x8a,0x2, 0xd5,0xe0,0x2, 0x1c,0x1d,0xe0,0x0, 0x14,0xc4, +0x3d,0x66,0x3c,0x90,0x7e,0x81,0xe0,0x2, 0xde,0x5f,0x66,0x81,0xe0,0x5, 0x21,0x9b, +0xe0,0x2, 0x1f,0x93,0xf0,0x2, 0x19,0x21,0x8f,0x8f,0x27,0xb4,0x8b,0x8d,0xf0,0x1, +0x27,0x2, 0xe0,0x0, 0x0, 0xfc,0xe0,0x1, 0x1e,0x9c,0x8a,0x8d,0x29,0x93,0x22,0x92, +0x17,0x7f,0x3f,0x15,0xe2,0x1, 0xc7,0x7f,0xc7,0x1, 0xe4,0x0, 0xc7,0xa, 0xe8,0x40, +0x3f,0xe9,0xe8,0xe, 0x3f,0x19,0x16,0x7f,0xe0,0x19,0xae,0x4f,0xc7,0x8a,0x3f,0xfe, +0x1, 0xfc,0x15,0xff,0xe8,0xb, 0x3d,0x9e,0xe2,0x1, 0xc5,0xff,0xc5,0x81,0xe4,0x0, +0xc5,0x8a,0xe0,0x2, 0x1f,0xa1,0xe8,0xb, 0x3d,0x99,0x96,0xf, 0x97,0x1f,0x36,0x24, +0xb6,0xf, 0xc7,0x8a,0x37,0x24,0x3f,0xfb,0xe0,0x40,0xb7,0x4f,0x1, 0xf7,0xe7,0xfe, +0x0, 0xf1,0xf0,0x4, 0x27,0x6c,0xe0,0x1, 0x1f,0xad,0xf7,0xff,0x12,0xff,0xf8,0x15, +0x3a,0x9e,0xf0,0x1, 0x9a,0x1f,0xf2,0x1, 0xc2,0xff,0xe0,0x2, 0x1f,0x96,0xf0,0x0, +0xc2,0x81,0xf4,0x0, 0xc2,0x8a,0xf0,0x0, 0x88,0x8f,0x89,0x2, 0xea,0x22,0x7d,0x4c, +0xea,0x22,0x7d,0xe0,0xf8,0x19,0x88,0x49,0xf0,0x2, 0x19,0xd7,0x8b,0x8d,0xf0,0x0, +0x7f,0xd, 0xf8,0x15,0x3a,0x99,0x7e,0x8e,0xf8,0x40,0x3e,0x62,0x79,0xf, 0x7d,0x90, +0xf7,0xff,0x13,0xfc,0xf8,0x40,0x3f,0x61,0xe8,0x40,0x3e,0xe4,0xe8,0x40,0x3f,0x62, +0x23,0x98,0xe8,0x0, 0x8c,0xcc,0xe8,0x40,0x3c,0xf0,0xe0,0x1, 0x1, 0x52,0xe8,0x40, +0x3e,0x62,0x17,0x81,0x0, 0x87,0xe0,0x1a,0x89,0x6c,0xc6,0xa, 0x39,0x79,0xe0,0x1, +0x1, 0x4b,0x3d,0xef,0xe2,0x1, 0xc5,0xff,0x3b,0xfb,0x3a,0x6f,0xc7,0x81,0x2, 0xf4, +0xf0,0x0, 0x67,0xd, 0x66,0x8e,0xf0,0x40,0x3c,0xee,0xe0,0x2, 0x1f,0x9f,0x8f,0x8f, +0x2f,0x8a,0xea,0x16,0x7c,0x4c,0x3d,0x67,0xe0,0x1, 0x14,0xff,0x7e,0x81,0xe0,0x2, +0xde,0x5, 0x66,0x81,0xf0,0x0, 0x15,0x0, 0xe0,0x1, 0x23,0xa2,0xfa,0x16,0x7d,0xcc, +0xf0,0x2, 0x1e,0x13,0x11,0x83,0xe8,0x40,0x3a,0xea,0x3a,0x6d,0xe0,0x0, 0x0, 0xd4, +0xf0,0xd, 0x3d,0x92,0x8f,0xd, 0x34,0x44,0xe2,0x1, 0xcf,0x7f,0x34,0xc4,0xe0,0x3, +0x1, 0x4e,0xe2,0x0, 0xcf,0x2, 0xe0,0x3, 0x2, 0xc4,0x13,0x81,0x3b,0x9e,0xe2,0x1, +0xc3,0xff,0x13,0x1e,0xe4,0x0, 0xc7,0xa, 0x3b,0x32,0xea,0x14,0x7e,0xa0,0xe0,0xf, +0x3f,0x16,0x3f,0x9d,0xe8,0x0, 0x8f,0xc, 0xb4,0xf, 0xb4,0x9f,0xe0,0x3, 0x2f,0x2b, +0x3b,0x1d,0x97,0x56,0x94,0x6, 0xe0,0x1, 0x97,0xa6,0x3c,0x1e,0x3c,0x1f,0x17,0xa, +0x3f,0x16,0x3c,0xe3,0xe3,0xff,0xc4,0x7f,0xf0,0x18,0x3c,0x9c,0x7f,0x2, 0xe0,0x2, +0xdb,0x97,0x67,0x2, 0xf0,0x0, 0x16,0x94,0x96,0x9e,0xf0,0x1d,0x3e,0x96,0x97,0x96, +0xe8,0x0, 0x97,0x1d,0x3f,0x9d,0x3f,0x9e,0xe8,0x0, 0xb4,0x8, 0x3c,0x6f,0x3c,0xe3, +0xe3,0xff,0xc4,0x7f,0xe0,0x2, 0xdb,0x84,0xe8,0x0, 0xb4,0x18,0xe8,0x2, 0x39,0x1b, +0xab,0x82,0xf0,0x0, 0xc5,0x1, 0x8b,0x84,0xf2,0x1, 0xc5,0x7f,0xe8,0x40,0x3b,0xfa, +0xe0,0x0, 0x5, 0xc6,0x16,0xa, 0xe8,0xc, 0x3e,0x3a,0xf8,0x40,0x3f,0x7a,0xf0,0xf, +0x3c,0x9c,0xe0,0x19,0x89,0x4f,0xe0,0xc, 0x9c,0x4f,0xa9,0x4f,0xe0,0xc, 0x9c,0xdf, +0x5, 0x87,0x9e,0x8f,0x9f,0x1f,0x36,0xc4,0x37,0x44,0xb6,0x8f,0xb7,0x1f,0xf0,0xf, +0x3c,0x9c,0xe0,0x19,0x85,0x5f,0xe0,0x19,0x85,0xef,0xe0,0x19,0x86,0xff,0xe0,0x1a, +0x87,0xf, 0xe2,0x0, 0xc1,0xf, 0x39,0x77,0xad,0x5f,0xad,0xef,0xae,0xff,0xe0,0x1, +0xaf,0xf, 0x3, 0x50,0xe0,0xe, 0x31,0x23,0xe8,0xe, 0x3f,0x19,0xe0,0x2, 0xc7,0x2c, +0x8f,0xe, 0xe2,0x0, 0xcf,0x3, 0x1, 0x46,0xe2,0x0, 0xcf,0x1, 0xe7,0xfe,0x1, 0xfa, +0xea,0x16,0x7f,0xcc,0xf0,0x0, 0xc5,0x1, 0x8b,0x84,0xf2,0x1, 0xc5,0x7f,0x3f,0x92, +0x10,0xff,0xe8,0x40,0x3b,0xfa,0xa8,0x8f,0xe7,0xff,0x2, 0xbe,0xea,0x16,0x7f,0x56, +0xf0,0x0, 0xaf,0xe, 0xe0,0x1, 0xc0,0x24,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe8,0x40, +0x39,0x60,0x12,0x0, 0xe4,0x0, 0xc2,0xa, 0xf8,0x0, 0x9c,0x8c,0xe0,0xf, 0x3f,0x14, +0xf0,0xc, 0x9d,0xcf,0x3e,0x6f,0xf0,0xc, 0x9d,0x5c,0xe8,0x0, 0x9f,0x9c,0xf8,0x3, +0x3c,0xab,0xe3,0xff,0xc1,0xff,0xe0,0x43,0x3e,0x13,0xe8,0x6, 0x3f,0xaa,0xe0,0x9, +0x31,0x23,0xe2,0x0, 0xce,0x0, 0xe3,0xff,0xc3,0x7f,0xf8,0x1, 0x3d,0xa9,0x3c,0x9e, +0xe3,0xff,0xc0,0xff,0xe0,0x43,0x3d,0x96,0x3c,0x63,0xe0,0x2, 0xc4,0xac,0xe0,0x68, +0x3d,0x21,0x8c,0x89,0xe2,0x0, 0xcd,0x80,0xf0,0x1, 0x3d,0x2f,0x3a,0xe6,0xe3,0xff, +0xc0,0xff,0xe0,0x65,0x3d,0x21,0xe2,0x0, 0xcc,0x81,0x3a,0x98,0xe3,0xff,0xc2,0xff, +0xe0,0x18,0x31,0x21,0xe0,0x1, 0x1, 0x20,0x3a,0xfd,0xe8,0x9, 0x3d,0x18,0xfa,0x22, +0x7e,0xe0,0xf0,0x0, 0x9b,0x9, 0xe0,0x1, 0x4, 0xb2,0xe0,0x2, 0x14,0x0, 0xe8,0x40, +0x3a,0xf6,0xe0,0x1, 0x3, 0xa0,0xf8,0x1d,0x3e,0x98,0xe8,0x0, 0x9c,0xd, 0xf0,0x1, +0x39,0x92,0xf0,0x18,0x3c,0x1a,0x8c,0x81,0xe8,0x0, 0xb2,0x88,0xe0,0x0, 0x24,0xec, +0xe2,0x1, 0xcc,0xff,0xe0,0x1, 0x1, 0x7b,0xe2,0x0, 0xcc,0x82,0xe0,0x1, 0x10,0xc0, +0xe0,0x1, 0x12,0x80,0xe0,0x65,0x39,0xa1,0x10,0xff,0x38,0x99,0xe8,0x2, 0x39,0x13, +0xe0,0x0, 0x14,0xc1,0xe0,0x69,0x3d,0xa5,0xa8,0x82,0x3c,0x79,0xe0,0x0, 0x5, 0xd4, +0xf0,0x0, 0x27,0x13,0x61,0xf, 0x3c,0x69,0xe2,0x0, 0xc9,0x1, 0xe0,0x0, 0x1, 0x53, +0x38,0xe8,0xe3,0xff,0xc0,0xff,0xe2,0x2, 0xc8,0x80,0x3c,0xe8,0x5, 0x83,0xe0,0x2, +0x14,0x80,0xe3,0xff,0xc4,0xff,0xf8,0x8, 0x3d,0xa9,0xe2,0x0, 0xce,0x0, 0x3e,0x68, +0xe3,0xff,0xc6,0x7f,0xe0,0x63,0x3d,0x2c,0xe0,0xc, 0x39,0xb9,0xf8,0x40,0x3c,0xfb, +0x36,0x48,0xe8,0xc, 0x3e,0x57,0xe3,0xff,0xc6,0x7c,0xe0,0x8, 0x3f,0x14,0x5, 0xbe, +0xe8,0xc, 0x3e,0x1b,0xe0,0xc, 0xb6,0x48,0xe2,0x0, 0xcd,0x80,0xf0,0xc, 0x3d,0x2f, +0xe3,0xff,0xc6,0x7f,0xe0,0x66,0x3d,0x2c,0xe0,0xc, 0x3b,0x39,0xe8,0x40,0x3f,0xfa, +0x36,0x48,0xe8,0xc, 0x3e,0x57,0xe3,0xff,0xc6,0x7c,0x3a,0x1e,0xe0,0x0, 0x2, 0xc1, +0xf0,0x1a,0x3d,0x2c,0xf0,0xc, 0xb5,0x54,0xf0,0x0, 0xc6,0xa, 0xf8,0x40,0x3a,0xfc, +0xe7,0xfc,0x1, 0xf0,0x66,0x8e,0xf0,0x0, 0x67,0xd, 0xf0,0x40,0x3c,0xee,0x8b,0x8d, +0xe7,0xfd,0x0, 0x85,0xf7,0xff,0x27,0x36,0x61,0xf, 0xe2,0x0, 0xc9,0x1, 0xe7,0xff, +0x1, 0xb1,0xe8,0x0, 0x8c,0xec,0xe0,0x1, 0x34,0x41,0xe2,0x0, 0xcc,0x8f,0xe3,0xff, +0xc0,0xff,0xe0,0x68,0x3b,0xa1,0xe7,0xff,0x0, 0xa5,0xf0,0xc, 0x3d,0xac,0xe0,0xc, +0xb6,0x48,0x0, 0xc3,0xf0,0x0, 0x66,0x90,0x10,0x80,0xf8,0x8, 0x3e,0x98,0xe8,0x9, +0x3d,0x18,0x3a,0xfd,0xb0,0x88,0xf0,0x0, 0x13,0x0, 0xb0,0x89,0xe0,0x2, 0x14,0x0, +0x4, 0x8d,0xf8,0x1d,0x3e,0x98,0xe8,0x0, 0xb4,0xd, 0xe7,0xfe,0x0, 0xe2,0xe8,0xc, +0x3e,0x1a,0xe0,0xc, 0xb6,0x54,0xe7,0xff,0x0, 0xc1,0x3c,0xed,0xe0,0x8, 0x32,0xa8, +0x7d,0x3, 0x7d,0x8a,0x7e,0xc, 0x7e,0x81,0x7f,0x2, 0x7f,0x8b,0xf0,0x0, 0x78,0x5, +0xf0,0x0, 0x79,0x8, 0xf0,0x0, 0x79,0x87,0xf0,0x0, 0x7a,0x84,0xf0,0x0, 0x7b,0x9, +0xf0,0x0, 0x7b,0x86,0xe0,0x2, 0xda,0x1c,0x3c,0xe8,0xe3,0xff,0xc4,0xff,0xe2,0x0, +0xcc,0x90,0x65,0x3, 0x65,0x8a,0x66,0xc, 0x66,0x81,0x67,0x2, 0x67,0x8b,0xf0,0x0, +0x60,0x5, 0xf0,0x0, 0x61,0x8, 0xf0,0x0, 0x61,0x87,0xf0,0x0, 0x62,0x84,0xf0,0x0, +0x63,0x9, 0xf0,0x0, 0x63,0x86,0x3, 0x82,0x14,0x10,0xe3,0xff,0xc4,0x7f,0xe7,0xfe, +0x0, 0xa0,0xf0,0xf, 0x3c,0x9c,0xb4,0xf, 0xb4,0x9f,0xe7,0xfc,0x0, 0xf9,0x15,0x80, +0xad,0x8d,0x13,0x81,0x3f,0x65,0xe7,0xfc,0x0, 0xbe,0x17,0x1e,0x3f,0x32,0xea,0x14, +0x7e,0x20,0x11,0x1, 0xa9,0xd, 0x3f,0x1c,0xb4,0xf, 0x16,0x83,0xb4,0x9f,0xc7,0xa, +0x94,0xf, 0x94,0x9f,0x95,0x2f,0x95,0xbf,0x96,0x4f,0xe0,0x40,0xb4,0x5e,0xc6,0xff, +0xe0,0x40,0xb4,0xce,0xe2,0x1, 0xc6,0xff,0xe0,0x40,0xb5,0x3e,0xe0,0x40,0xb5,0xae, +0xe0,0x40,0xb6,0x1e,0x2e,0xed,0xe7,0xfc,0x0, 0xd6,0x11,0x0, 0xa9,0x1, 0xe7,0xfe, +0x0, 0x96,0x8b,0x8d,0x15,0xa, 0xe0,0x2, 0x1c,0xa1,0x3d,0x37,0xe0,0x2, 0x1c,0x1d, +0xe0,0x2, 0xdb,0xba,0x66,0x81,0xe7,0xfa,0x0, 0xe4,0x8b,0x8d,0xe7,0xfb,0x0, 0xe3, +0x8, 0xb1,0xe0,0x2, 0x1c,0x2d,0x15,0xa, 0x14,0x88,0xe0,0x2, 0xdb,0xe7,0xe0,0x1, +0x1e,0xdb,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xaf,0x1f,0xc7,0x81,0xaf,0x1d,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xaf,0xf, 0x8, 0xe1,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3e,0xe0,0x2, 0x1f,0xa0,0x8b,0xf, 0xe0,0x3, 0x23,0xa, 0xe0,0x2, +0x1f,0x9f,0x8f,0x8f,0x3f,0xf6,0x5, 0x85,0xea,0x14,0x7f,0x91,0x17,0x3, 0xaf,0xf, +0xea,0x14,0x7f,0x10,0x87,0x8e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8a, +0xe0,0x2, 0x2, 0xc0,0xaf,0x8e,0xe0,0x1, 0x1f,0x9c,0x8f,0x8f,0xe0,0x1, 0x27,0x80, +0xf7,0xff,0x11,0xff,0xf0,0x13,0x39,0x9f,0xe0,0x1, 0x1f,0x82,0xe0,0x1, 0x1e,0x1, +0x8e,0x8f,0xe0,0x0, 0x1f,0xf1,0xf0,0x0, 0x88,0xc, 0xe0,0x0, 0x1e,0x72,0x8f,0x8f, +0xf2,0x1, 0xc1,0xff,0xf0,0x0, 0x88,0x8c,0xf0,0x0, 0xc1,0x81,0x36,0xa8,0x37,0xa8, +0xf4,0x0, 0xc1,0x8a,0xea,0x14,0x7d,0x91,0xf0,0x0, 0x8e,0x8e,0xe0,0x2, 0x1f,0x21, +0xf0,0x10,0x38,0x4d,0xf0,0x11,0x38,0xcf,0xea,0x14,0x7d,0x14,0xea,0x13,0x79,0x68, +0xea,0x13,0x78,0xc0,0xfa,0x13,0x7d,0xb4,0xf0,0x0, 0x16,0x0, 0x8b,0x8b,0xe0,0x1, +0x1c,0x5b,0xe0,0x2, 0x1c,0xad,0xe0,0x2, 0x19,0x9b,0xf1,0xff,0xc0,0x7f,0xf1,0xff, +0xc0,0xff,0xf0,0x13,0x39,0x9e,0x0, 0x93,0xea,0x13,0x7a,0xe8,0xea,0x13,0x7a,0x40, +0x37,0xa2,0x3a,0x9f,0x3f,0x94,0xb6,0x5, 0xb6,0x95,0xb5,0x8f,0xb5,0x9f,0xc7,0xa, +0xe8,0x40,0x3f,0x73,0xc4,0x1, 0xc4,0x81,0xc5,0x1, 0x1, 0x2f,0xe0,0xd, 0x8f,0x8e, +0xe2,0x1, 0xcf,0xff,0x1, 0x75,0xe0,0x6, 0x9e,0x2e,0xe0,0x6, 0x9e,0xbe,0xe2,0x0, +0xce,0x0, 0x12,0x1, 0xe0,0xb, 0x37,0xa3,0xe8,0x25,0x3e,0x0, 0x3d,0x93,0xf0,0x40, +0x3b,0x64,0xe0,0x76,0x39,0xa5,0x8d,0x8b,0xe2,0x0, 0xce,0x80,0xe8,0x25,0x3e,0x81, +0xf0,0x40,0x3b,0xe4,0xe0,0x77,0x39,0xa5,0xe2,0x0, 0xcd,0x82,0x1, 0x13,0x25,0xcd, +0xe2,0x0, 0xcd,0x81,0x1, 0xd5,0xc7,0xa, 0x16,0x80,0xe8,0x40,0x3f,0x73,0xae,0x8a, +0xc4,0x1, 0xc4,0x81,0xc5,0x1, 0x1, 0xd3,0xf0,0x1, 0x2e,0x7e,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe0,0x5, 0x37,0xa2,0xe0,0xb, 0x39,0x15,0xf0,0x0, 0x9c,0x8b,0xf0,0x0, +0x9c,0x1b,0xe8,0x4, 0x3e,0x29,0xe3,0xff,0xc2,0x7f,0xf0,0x43,0x3d,0x14,0xe8,0xb, +0x3e,0xa8,0xe3,0xff,0xc5,0xff,0xf2,0x0, 0xcd,0x0, 0xf0,0x15,0x3c,0xac,0xf0,0x43, +0x3a,0x1b,0xf3,0xff,0xc2,0xff,0xe8,0x64,0x3d,0x25,0xf2,0x0, 0xca,0x0, 0xf0,0x15, +0x3c,0x2d,0xf3,0xff,0xc2,0xff,0xe8,0x6b,0x3d,0x25,0xe2,0x0, 0xcb,0x7, 0xe0,0x0, +0x5, 0xff,0xf0,0x0, 0x11,0xa, 0xf0,0x0, 0xa9,0x9, 0x23,0x8a,0xc3,0xff,0xf0,0x0, +0x11,0x9, 0xf0,0x0, 0xa9,0x9, 0xe2,0x1, 0xc3,0xff,0xf0,0x0, 0x16,0x1, 0xe0,0x15, +0x38,0x95,0xf8,0x0, 0x92,0x85,0xf8,0x15,0x3a,0xba,0xf2,0x0, 0xca,0x80,0xf0,0x15, +0x3d,0x9f,0xe0,0x1, 0x4, 0x24,0xf8,0x0, 0x89,0x5, 0xe0,0x15,0x38,0x95,0xf8,0x0, +0x92,0x95,0xf8,0x15,0x3a,0xb4,0xf2,0x0, 0xca,0x80,0xe0,0x1, 0x4, 0xc, 0xf2,0x0, +0xc9,0x1, 0xe0,0x0, 0x5, 0xf8,0xf0,0x0, 0x11,0xa, 0xf0,0x0, 0x12,0x8a,0xf0,0x0, +0xa9,0x9, 0xf8,0x40,0x39,0x65,0xe0,0x1e,0x38,0x95,0xf2,0x0, 0xce,0x8a,0xf8,0x0, +0xb5,0xe, 0xf8,0x0, 0xb2,0x1e,0xe0,0x0, 0x1, 0x58,0x8f,0x8a,0x2f,0x89,0xe0,0x14, +0x3a,0x1b,0xf2,0x0, 0xca,0x4, 0xe0,0x6b,0x3c,0x2f,0xe0,0x64,0x3c,0x2b,0xf1,0x2b, +0x3a,0x9b,0x25,0xa2,0xf1,0x24,0x3a,0x94,0x22,0x1f,0xf0,0x0, 0x2b,0x4, 0xf0,0x6, +0xb4,0xae,0xf0,0x0, 0x2b,0x84,0xf0,0x6, 0xb4,0x3e,0xf0,0x0, 0x12,0x89,0x87,0x88, +0xf9,0x2d,0x3a,0xa2,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xaf,0x88,0xe7,0xfe,0x26,0xc1, +0x15,0xb1,0xe1,0x2f,0x3f,0x9b,0xe7,0xfe,0x27,0xbc,0xf0,0x0, 0xc1,0x1, 0xf0,0x0, +0xa9,0x9, 0xe7,0xfe,0x0, 0xb6,0xe0,0xf, 0x39,0x15,0xf0,0x0, 0x12,0x1, 0xf2,0x0, +0xc9,0x9, 0xf0,0x0, 0xaa,0xa, 0xb6,0xf, 0xb6,0x9f,0x5, 0x93,0xf0,0x0, 0x12,0x85, +0xf0,0x0, 0xaa,0x89,0x15,0x80,0xad,0x88,0xe7,0xfe,0x0, 0xa3,0xe2,0x0, 0xcb,0x2, +0xe7,0xff,0x5, 0x85,0xf0,0x0, 0x12,0x89,0xf0,0x0, 0xaa,0x89,0xe7,0xfe,0x0, 0xff, +0xf2,0x0, 0xc9,0x1, 0x5, 0xf0,0xf1,0xff,0xc1,0x7f,0xf0,0x0, 0xa9,0x9, 0x0, 0xeb, +0x17,0x80,0xe7,0xfd,0x0, 0xc1,0xfa,0x13,0x7a,0x28,0xf0,0x1a,0x3d,0x9f,0xe8,0xf, +0x3f,0x94,0xf0,0x0, 0x12,0x0, 0xf8,0x0, 0xaa,0xa, 0xf0,0x0, 0xaa,0xf, 0xe7,0xff, +0x0, 0x9e,0xfa,0x13,0x7a,0xa8,0xf0,0x15,0x3a,0x9f,0xf8,0x0, 0x8a,0x85,0xf2,0x0, +0xca,0x81,0xe7,0xff,0x2, 0x82,0xf0,0x0, 0x89,0x9, 0xf8,0x40,0x3a,0xe2,0xe7,0xff, +0x0, 0x84,0xfa,0x13,0x7a,0xa8,0xf0,0x15,0x3a,0x9f,0xf8,0x0, 0x87,0x5, 0xf0,0x0, +0xc7,0x1, 0xf8,0x0, 0xaf,0x5, 0xe7,0xfe,0x0, 0xec,0xf8,0x0, 0x81,0x5, 0xf0,0x0, +0xc1,0x1, 0xf2,0x1, 0xc1,0x7f,0xf8,0x0, 0xa9,0x5, 0xe7,0xfe,0x0, 0xd8,0xde,0x51, +0xea,0x14,0x7f,0x94,0x3f,0x6f,0xe1,0x80,0xbb,0x1e,0xbb,0x1f,0xb3,0x2e,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xea,0x14,0x7f,0x91,0xab,0x8f,0xe7,0xfe,0x0, 0x81,0xe0,0x2, +0x1f,0xa1,0xe0,0x3, 0x15,0x88,0xe0,0x3, 0x16,0x9, 0xe0,0x3, 0x16,0x8a,0x17,0x0, +0x3d,0x9f,0x3e,0x1f,0x3e,0x9f,0xe0,0x3, 0xc7,0x8b,0xaf,0xb, 0xaf,0xc, 0xaf,0xd, +0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xa0,0xe0,0x2, 0x1f,0x21,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0xea,0x13,0x7f,0xa4,0x1, 0x6, 0xe0,0x0, 0x5, 0xcc,0x17,0x1, 0xaf,0xf, +0x38,0x82,0x8f,0x8f,0xe0,0x0, 0x2f,0xc8,0xe0,0x2, 0x1e,0x9f,0x8e,0x8d,0xe0,0x0, +0x26,0xc4,0xe0,0x0, 0x1e,0xad,0x8e,0x8d,0xe0,0x0, 0x26,0xd9,0xea,0x13,0x7e,0x1e, +0xea,0x13,0x7d,0x22,0x96,0x8a,0x96,0xc, 0x3e,0x9c,0xe0,0x43,0x3e,0x9d,0xe2,0x0, +0xce,0x80,0x3c,0xed,0xe0,0x0, 0x4, 0x48,0xea,0x13,0x7e,0x9c,0xea,0x13,0x7d,0xa0, +0x97,0x8b,0x96,0x8d,0xe0,0x43,0x3c,0x99,0x3f,0x9d,0xe0,0x43,0x3f,0x9f,0xe2,0x0, +0xcf,0x80,0xf0,0x40,0x3b,0xef,0x4, 0x34,0xe0,0x2, 0x1c,0x3f,0xe8,0x43,0x3e,0x17, +0x8e,0xd8,0x36,0xa6,0xc6,0xdf,0x3e,0xfc,0x3f,0xed,0x2, 0x27,0x8e,0xc8,0xe0,0x43, +0x3f,0x9f,0x36,0xa6,0xc6,0xdf,0x3e,0xf9,0x3e,0x6d,0x2, 0x1d,0x3e,0xec,0xe3,0xff, +0xc6,0xff,0xe3,0xff,0xc7,0xff,0xb6,0x8e,0xb7,0x9e,0xb6,0x8a,0xb7,0x8b,0x38,0x82, +0x17,0x0, 0xaf,0xf, 0x38,0x82,0x94,0x8e,0x95,0x1e,0xea,0x13,0x7d,0xa2,0xea,0x13, +0x7e,0x20,0xea,0x13,0x7f,0x1e,0xea,0x13,0x7f,0x9c,0xb4,0x8b,0xb5,0xc, 0xb6,0x8e, +0xb6,0x8f,0x38,0x82,0x3e,0x69,0x0, 0xe3,0xe8,0x40,0x3f,0xe7,0x0, 0xd8,0xf0,0x0, +0x13,0x80,0x0, 0xcb,0x3c,0xef,0xe7,0xff,0x0, 0xb9,0xea,0x13,0x7e,0xa2,0xea,0x13, +0x7f,0xa0,0x9c,0xe, 0x9c,0x9e,0x95,0xd, 0x96,0xf, 0xea,0x13,0x7d,0x9e,0xea,0x13, +0x7f,0x1c,0xe0,0xa, 0x3c,0x2a,0xe0,0xc, 0x3c,0xac,0xb5,0xb, 0xb6,0xe, 0xb4,0xd, +0xb4,0x8f,0x38,0x82,0x8, 0xb1,0xe2,0x0, 0xcc,0x2, 0x1, 0x2a,0x5, 0x93,0xe2,0x0, +0xcc,0x3, 0x1, 0x7, 0xe2,0x0, 0xcc,0x4, 0x1, 0xa2,0x8, 0xa1,0xe7,0xfb,0x0, 0xb9, +0xef,0xff,0xd4,0x1b,0xef,0xff,0xd3,0x89,0xef,0xfd,0xd1,0x5c,0x8, 0xa1,0xe7,0xf4, +0x0, 0xf8,0xe2,0x0, 0xcc,0x1, 0x1, 0x93,0xef,0xfd,0xd7,0xc0,0xe0,0x2, 0x1f,0x15, +0x17,0x80,0xac,0xe, 0xe0,0x2, 0x1f,0x14,0xaf,0x8e,0xe0,0x2, 0x1f,0x16,0xaf,0x8e, +0xe0,0x2, 0x1f,0x12,0xaf,0x8e,0xe0,0x2, 0x1f,0x11,0xaf,0x8e,0x8, 0xe1,0xe0,0x2, +0x1f,0x9a,0x17,0x0, 0xaf,0xf, 0xef,0xff,0xd3,0x17,0xe0,0x2, 0x1f,0x85,0xe0,0xa, +0x8f,0x8f,0x2f,0xf5,0x8, 0xa1,0xe7,0xe5,0x0, 0xe5,0x0, 0x0, 0xe0,0x1, 0x1f,0x9c, +0x8f,0x8f,0x27,0x98,0x16,0xff,0x3e,0x9f,0xe2,0x1, 0xc6,0xff,0xc6,0x81,0x36,0xa3, +0x3e,0x98,0x17,0x3, 0xe0,0xff,0x17,0xff,0x16,0x0, 0xaf,0x8, 0xc4,0x8, 0x3c,0x7d, +0xe0,0x40,0xaf,0x78,0xe0,0x40,0xb7,0xb8,0xe0,0x40,0xb7,0xa8,0xe0,0x40,0xae,0x28, +0x1, 0xf5,0x38,0x82,0xe0,0x1, 0x1f,0x9c,0x8d,0x8f,0xe0,0x2, 0x1f,0xa0,0x8e,0xf, +0xe0,0x0, 0x25,0xc6,0x17,0x80,0x16,0x81,0xf0,0x2, 0x1a,0xa1,0xc4,0xff,0x3e,0x98, +0x15,0x7d,0xf0,0x0, 0x13,0x83,0xf0,0x0, 0x13,0x1, 0xf0,0x40,0x39,0xef,0xf0,0x0, +0x12,0x2, 0x0, 0x95,0x17,0xa, 0x3f,0x3c,0xf0,0x40,0xab,0x1d,0xe8,0xe, 0x3f,0x15, +0xc6,0x1, 0xaf,0xce,0xe2,0x1, 0xc6,0x7f,0xe0,0x40,0x8f,0x1d,0xc7,0x81,0xe2,0x1, +0xc7,0xff,0x3f,0xfb,0xaf,0x18,0xc6,0x88,0xc4,0x8, 0x1, 0x21,0xe0,0x80,0x8f,0x19, +0xe2,0x0, 0xcf,0x1, 0x1, 0xa, 0x87,0x18,0x3f,0x5a,0xe2,0x1, 0xc7,0x7d,0x27,0x63, +0xf0,0x40,0xab,0x9d,0x17,0x3, 0x0, 0xeb,0x8f,0x18,0xe2,0x0, 0xcf,0x1, 0x1, 0x10, +0xe2,0x0, 0xcf,0x3, 0x1, 0xf, 0x2f,0x5, 0xf0,0x40,0xaa,0x1d,0x17,0x2, 0x0, 0xdf, +0xe2,0x0, 0xcf,0x2, 0x1, 0xda,0xe0,0x40,0xaf,0x1d,0x0, 0xd9,0x38,0x82,0xf0,0x0, +0xab,0x98,0x17,0x0, 0xf0,0x40,0xa9,0x9d,0x0, 0xd2,0x8, 0xb6,0xc0,0x4c,0xe0,0x1, +0x1a,0x9c,0xe0,0x2, 0x1f,0xbf,0x8d,0x5, 0xf0,0x0, 0x8a,0x6f,0xf0,0x0, 0x89,0x7f, +0xe0,0x3, 0x25,0x6a,0x14,0x7f,0x3c,0x1a,0xe2,0x1, 0xc4,0x7f,0xc4,0x1, 0xe0,0x2, +0x19,0x21,0xe4,0x0, 0xc4,0xa, 0x14,0x9c,0x15,0x84,0x16,0x10,0x3f,0xe2,0x3c,0x90, +0x3d,0x90,0x3e,0x10,0x3c,0x12,0x16,0xff,0x17,0x0, 0xae,0xcf,0xc7,0x8a,0x3f,0xf8, +0xe1,0x80,0xae,0x99,0xe1,0x80,0xaf,0x1b,0xe1,0x80,0xaf,0x1c,0x1, 0xf7,0xe0,0x2, +0x1a,0x20,0xea,0x23,0x79,0xa0,0xf0,0x0, 0x8b,0x4, 0xf0,0x0, 0x2b,0x21,0x8f,0x3, +0x27,0x16,0xe0,0x3, 0x25,0x4f,0x17,0x7f,0x3f,0x1a,0xe2,0x1, 0xc7,0x7f,0xc7,0x1, +0x37,0x23,0xe0,0x2, 0x1f,0xa1,0x39,0x1e,0xe0,0xff,0x17,0x7f,0xe0,0x12,0xb7,0x7f, +0xc7,0x88,0x39,0x7f,0xe0,0x12,0xb7,0x4f,0x1, 0xfa,0x8f,0x4, 0xe0,0x2, 0x1c,0x1b, +0x14,0x84,0x3c,0x90,0xaf,0x3, 0xdf,0x5f,0xc0,0x34,0xb, 0x61,0xf0,0x0, 0x8b,0x83, +0xf0,0x2, 0x23,0x8f,0xe0,0x3, 0x25,0x31,0x16,0xff,0x3e,0x9a,0xe2,0x1, 0xc6,0xff, +0xe0,0x1, 0x1f,0x4d,0xf0,0x1, 0x1a,0xc5,0xe0,0x23,0xc6,0xa2,0x36,0xa2,0x3e,0x9e, +0xe8,0x40,0x3f,0xe5,0xe0,0xff,0x17,0x7f,0xb7,0xf, 0xc7,0x84,0x3f,0xfd,0xe0,0x40, +0xb7,0x1f,0xe0,0x2, 0xb7,0x2f,0xe0,0x2, 0xb7,0x3f,0x1, 0xf7,0x17,0x81,0xf0,0x13, +0x32,0x26,0xf0,0x14,0x31,0x26,0xf9,0x31,0x3b,0x96,0xf1,0x2e,0x3b,0x9f,0xf1,0xff, +0xc1,0xdf,0xf1,0xff,0xc2,0x5f,0x14,0x0, 0xf0,0x11,0x38,0xde,0xf8,0x43,0x39,0x93, +0xf8,0x43,0x3a,0x14,0xf0,0x40,0x39,0x6f,0xf0,0x40,0x38,0x68,0x25,0x19,0x17,0x80, +0x16,0x10,0xe0,0x2, 0x1f,0x1b,0x3e,0x10,0x3e,0xef,0x9d,0x9e,0xe4,0xd, 0x36,0xc8, +0xe2,0xff,0xcd,0xff,0x1, 0x4, 0x8c,0x8c,0xe0,0x1, 0x24,0xed,0xc7,0x81,0xe4,0xd, +0x37,0xa8,0xe4,0xb, 0x36,0xc8,0x3d,0x7b,0xc7,0x8, 0xc6,0x1, 0x2, 0xef,0xc4,0x1, +0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40,0x3b,0xff,0xf0,0x0, 0xc2,0x84,0x2, 0xdf, +0xe0,0x0, 0x25,0x40,0x14,0x7f,0x3c,0x1a,0xe2,0x1, 0xc4,0x7f,0xc4,0x1, 0xea,0x23, +0x7e,0x8c,0xea,0x22,0x7f,0x78,0xe0,0x9, 0x34,0x23,0xe0,0x2, 0x1f,0xa1,0x3c,0x92, +0xe0,0x12,0x95,0xff,0xe0,0x13,0x96,0xf, 0xc7,0x88,0x3f,0xf9,0xe1,0x80,0xb5,0x9d, +0xe1,0x80,0xb6,0x1e,0x1, 0xf6,0x15,0x9c,0x3d,0x90,0x3c,0x1b,0x10,0x81,0x13,0x0, +0x0, 0x84,0xc5,0x81,0x3d,0xf8,0x1, 0x1d,0x8f,0x8b,0xe2,0x1, 0xcf,0xff,0x1, 0xfa, +0x4f,0x10,0x16,0x91,0x3e,0x90,0x17,0x81,0xe0,0x2, 0x27,0x29,0x3f,0x6f,0xe2,0x1, +0xc7,0x7f,0x3f,0x7a,0x3c,0xef,0x3, 0xee,0xe1,0x80,0x8e,0x1d,0xc7,0x81,0x2e,0x77, +0xaf,0xb, 0xe2,0x0, 0x7e,0x90,0xc5,0x81,0x3c,0x9d,0x3d,0xf8,0xa8,0x89,0x1, 0xe5, +0x15,0xff,0xe8,0xb, 0x3d,0x96,0xe2,0x1, 0xc5,0xff,0xc5,0x81,0xe4,0x0, 0xc5,0x8a, +0xe0,0x2, 0x1f,0xa1,0xe0,0x1, 0x1f,0x46,0x3d,0x92,0x96,0xf, 0x96,0x9f,0xc7,0x8a, +0xb6,0xe, 0x3f,0xfb,0xc7,0x4, 0xe0,0x40,0xb6,0x9e,0x1, 0xf8,0xe0,0x1, 0x1e,0xbd, +0xe0,0x1, 0x1f,0x3c,0xe0,0x1, 0x1f,0xc7,0x36,0xc1,0x37,0xc1,0x37,0x41,0xe2,0x0, +0x7c,0x28,0x7f,0x8d,0x7e,0x8b,0x7f,0xc, 0xf0,0x0, 0x6b,0xa8,0xf0,0x0, 0x6b,0x29, +0xe0,0x0, 0xdd,0x3e,0x8f,0x84,0x8c,0x5, 0x27,0xae,0x15,0x7f,0xe0,0x1, 0x1f,0xc4, +0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0x46,0xc5,0x6a,0x9a,0x8f,0xe0,0x1, 0x1f,0xcd, +0x35,0x21,0x14,0x80,0xf0,0x2, 0x1b,0x9b,0x3d,0x1f,0xf0,0x0, 0x13,0x1, 0x38,0xe9, +0x24,0x14,0x3d,0xe9,0xe2,0x1, 0xc5,0xff,0x3a,0xfb,0xe0,0x1, 0x1f,0x44,0x17,0x81, +0x1, 0x88,0xe0,0x1, 0x0, 0x9e,0xe0,0x80,0x9e,0x9e,0x3e,0xfb,0xe0,0x1, 0x1, 0x1a, +0x3d,0x7e,0x3e,0x6f,0xc7,0x81,0x1, 0xf8,0xc4,0x81,0x8f,0x84,0xe2,0x1, 0xc4,0xff, +0x3f,0xf9,0x2, 0xe7,0xe7,0xfe,0x24,0x3, 0x16,0xff,0x3e,0x98,0xe2,0x1, 0xc6,0xff, +0x17,0x4, 0x3f,0x10,0xc6,0x81,0xe0,0x2, 0x1f,0xa1,0x3e,0x9e,0xe0,0xff,0x15,0xff, +0xe1,0x80,0x8e,0x1e,0xe2,0x0, 0xce,0x1, 0x1, 0x5, 0xe0,0x12,0xb5,0xff,0xe0,0x13, +0xb5,0x8f,0x3e,0xfe,0xc7,0x88,0x1, 0xf5,0x8f,0x4, 0xe7,0xfd,0x0, 0xe9,0xe0,0x2, +0x1d,0x1b,0x15,0x81,0x17,0x8a,0xe8,0xf, 0x3f,0xb7,0xf0,0xe, 0x33,0xa3,0x3f,0x92, +0x96,0xf, 0x96,0x9f,0x3f,0x1a,0xb6,0x1e,0x16,0x1, 0xb6,0xae,0xe8,0xc, 0x3e,0x17, +0xe2,0x0, 0x7e,0x84,0xe8,0xd, 0x3e,0x97,0x8f,0x4, 0xf0,0x0, 0xab,0xcf,0xf0,0x40, +0x3b,0xec,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3f,0x77,0xad,0x8d,0x2, 0xe4,0xe7,0xfd, +0x0, 0xc7,0xf0,0x0, 0x28,0x9c,0x97,0x2e,0xe8,0x0, 0xb5,0x85,0xe8,0x0, 0xb7,0x15, +0xe2,0x0, 0x7f,0x1c,0xe2,0x0, 0x7e,0x10,0x3f,0x18,0x3f,0x9c,0xc4,0x1, 0xf0,0x0, +0xa9,0xf, 0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40,0x3b,0xff,0xae,0x8e,0xf0,0x0, +0xc2,0x84,0xe7,0xfd,0x2, 0xed,0xe7,0xfe,0x0, 0x8d,0xea,0x23,0x7e,0xc, 0xe0,0x6, +0x37,0xa1,0x3e,0x16,0x98,0x8c,0xe2,0xff,0xc8,0xff,0x1, 0x5e,0xea,0x22,0x7c,0xf8, +0x9e,0x2e,0xe0,0xe, 0x35,0xa1,0x3c,0x96,0x3f,0x21,0x95,0x89,0xe0,0x43,0x3f,0x1e, +0x36,0x21,0xe2,0x0, 0xcf,0x0, 0x3e,0x2b,0xe0,0x43,0x3e,0x1c,0x3d,0xee,0xe0,0x0, +0x4, 0x42,0xe2,0x0, 0xce,0x0, 0xe0,0x43,0x3d,0x9b,0x3f,0x6c,0x4, 0x38,0xf0,0x40, +0x39,0xfb,0xe0,0x43,0x3f,0x1e,0xe8,0x6b,0x3d,0x23,0xf0,0x40,0x3a,0x7e,0xe8,0x0, +0xb5,0x85,0xe8,0x6e,0x3d,0x24,0xe8,0x0, 0xb7,0x15,0xe7,0xff,0x0, 0xbb,0x3e,0x61, +0xe2,0x0, 0x7f,0x9c,0x3e,0x1f,0x8f,0x8c,0xe2,0x1, 0xcf,0xff,0xe7,0xfe,0x1, 0x66, +0x17,0xa, 0x3f,0x39,0xe0,0xd, 0x37,0xa3,0x3f,0x12,0x96,0x1e,0x95,0x8e,0xaf,0xce, +0xe8,0xe, 0x3e,0x97,0xe2,0x0, 0x7e,0x84,0x3f,0x9d,0xb5,0x9e,0xc4,0x81,0xb6,0x2e, +0xe2,0x1, 0xc4,0xff,0xf0,0x0, 0xab,0xf, 0x8f,0x84,0x3f,0xf9,0xe7,0xfe,0x2, 0xba, +0xe7,0xfe,0x0, 0xd2,0xe0,0x2, 0x19,0x21,0xe7,0xfc,0x0, 0xb3,0xe8,0x40,0x3f,0x60, +0x0, 0xc7,0xe8,0x40,0x3d,0xe0,0xe7,0xff,0x0, 0xbe,0x3c,0xe6,0xe7,0xfd,0x0, 0xe2, +0x3f,0x6a,0xe7,0xfc,0x0, 0xc5,0xf0,0x1, 0x1a,0xc5,0xe7,0xfc,0x0, 0xe9,0x8, 0xb3, +0x3f,0x83,0xef,0xfb,0xda,0xa5,0x14,0x0, 0xef,0xfb,0xda,0x81,0xef,0xfb,0xde,0x19, +0xef,0xfb,0xda,0xe1,0xef,0xfb,0xd2,0x4f,0xef,0xfb,0xd3,0xbb,0xef,0xfb,0xdb,0x1b, +0xea,0x23,0x7f,0x24,0x16,0x80,0xea,0x23,0x7f,0xa2,0xb6,0x8e,0xe0,0x13,0x17,0x44, +0xb7,0xf, 0xef,0xfb,0xda,0xbb,0xe0,0x2, 0x19,0xa8,0xef,0xfb,0xdc,0xee,0xef,0xfb, +0xda,0xea,0xef,0xfb,0xdb,0x3d,0x17,0x83,0xaf,0x83,0xef,0xfd,0xde,0x81,0xef,0xfb, +0xdb,0x72,0xef,0xfb,0xde,0xae,0xef,0xfb,0xdd,0x9e,0x3b,0x0, 0xe0,0x1, 0x19,0x23, +0xef,0xfb,0xd4,0x14,0xe0,0xe, 0x8c,0xa2,0xe0,0xe, 0x8c,0x12,0xe0,0x1, 0x15,0x78, +0xe0,0x0, 0xda,0xa8,0x87,0x83,0xe0,0x10,0x8f,0x72,0xe2,0x0, 0xc7,0x81,0x3f,0x7f, +0x1, 0xd, 0xe0,0xe, 0x8d,0x82,0xe0,0xd, 0x8d,0x62,0xe0,0xd, 0x8c,0xf2,0xe0,0xd, +0x8c,0x52,0x16,0x18,0x9, 0xa1,0xe0,0x15,0x0, 0xad,0xe0,0xd, 0x8d,0xf2,0xe0,0xd, +0x8d,0x52,0xe0,0xe, 0x8c,0x82,0xe0,0xd, 0x8c,0x62,0x16,0x18,0x9, 0xa1,0xe0,0x15, +0x0, 0xa1,0xea,0x23,0x7f,0x24,0xea,0x23,0x7f,0xa2,0x16,0x80,0xb6,0x8e,0xb4,0xf, +0x38,0x82,0xea,0x23,0x7f,0x24,0x97,0x8e,0xea,0x23,0x7e,0xa2,0xc7,0x81,0x9e,0x8d, +0xe3,0xff,0xc7,0xff,0x3e,0xff,0xb7,0x8e,0x2, 0x82,0x38,0x82,0xe7,0x76,0x0, 0x93, +0x8f,0x89,0x27,0x96,0x8e,0x8, 0xe0,0xe, 0x3e,0x2f,0xe0,0x43,0x3e,0x9e,0xe2,0x0, +0xce,0x80,0xe0,0x41,0x3e,0xcd,0xe0,0x6e,0x3d,0x2d,0x3f,0x7b,0x5, 0x7, 0x3f,0xfc, +0x3, 0x8a,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xaf,0x89,0xaf,0x88,0x38,0x82,0x8f,0x88, +0xaf,0x89,0x38,0x82,0x3f,0xaa,0xe2,0x1, 0xc7,0xff,0xaf,0x89,0xaf,0x88,0x38,0x82, +0xf0,0x2, 0x1b,0x21,0xe4,0x0, 0xc5,0xa, 0xf0,0x1, 0x1a,0xad,0xf0,0xe, 0x3b,0x1a, +0xf0,0xd, 0x8b,0x8e,0xe8,0x0, 0x8e,0x85,0xe0,0xd, 0x87,0xae,0xe8,0x40,0x3e,0xf7, +0xe4,0xf, 0x37,0xac,0xe0,0xd, 0x8f,0x1e,0xe4,0xf, 0x37,0xc8,0x5, 0x99,0xe0,0x2, +0x1e,0x93,0xe0,0x1, 0x1d,0xef,0x8e,0x8d,0x26,0xa1,0xe0,0x0, 0x1e,0x39,0xe8,0xe, +0x3d,0x97,0xe8,0xf, 0x3e,0x17,0x8f,0xe, 0x8f,0x8f,0xf0,0xd, 0x33,0xa3,0xe8,0xd, +0x3e,0x96,0xe0,0x2, 0xc6,0xac,0x8e,0x8d,0xe2,0x0, 0xce,0x81,0x1, 0x31,0xe8,0x2, +0x8e,0xc5,0xe2,0x1, 0xce,0xff,0x1, 0x87,0xe8,0xa, 0x3d,0x16,0xe0,0xd, 0x8f,0xa, +0xe1,0x2e,0x3f,0xd, 0xaf,0x8, 0xaf,0x89,0x38,0x82,0xe8,0xc, 0x3d,0x97,0x8e,0x8c, +0x2e,0xa9,0xaf,0xc, 0xe0,0x0, 0x1e,0x39,0xe8,0x14,0x3e,0x17,0xe8,0x0, 0x8e,0x84, +0x26,0xb9,0xe0,0x13,0x3f,0xad,0xf8,0x43,0x39,0x13,0xf2,0x0, 0xc9,0x0, 0xf8,0x41, +0x39,0x42,0xe8,0x73,0x3d,0x22,0xf2,0x0, 0xc9,0xa0,0x5, 0x30,0x3f,0xfd,0x5, 0xa6, +0x17,0x90,0x3f,0x9d,0xe2,0x1, 0xc7,0xff,0xe8,0x0, 0xaf,0x84,0x0, 0xc7,0x16,0x80, +0xe8,0xb, 0x3d,0x97,0xe8,0xc, 0x3e,0x17,0x17,0x80,0xae,0x8b,0x3f,0x6f,0xae,0x8c, +0x0, 0xc7,0xe0,0x14,0x3f,0x2d,0xf8,0x43,0x39,0x94,0xf2,0x0, 0xc9,0x80,0xf8,0x41, +0x39,0xc3,0xe8,0x74,0x3d,0x23,0xf2,0x0, 0xca,0xf, 0x5, 0x13,0x3f,0x7d,0x5, 0x94, +0x17,0x1, 0x3f,0x1d,0xe2,0x1, 0xc7,0x7f,0x0, 0xc5,0x17,0xf0,0x3f,0x9d,0xe2,0x1, +0xc7,0xff,0xe8,0x0, 0xaf,0x84,0xe7,0xff,0x0, 0xa2,0x3f,0xed,0xe7,0xff,0x0, 0x9f, +0x3f,0x6d,0xe7,0xff,0x0, 0xb9,0x17,0x7f,0x3f,0x1d,0xe2,0x1, 0xc7,0x7f,0xaf,0xc, +0xe7,0xff,0x0, 0xb2,0xe0,0x0, 0x1f,0x95,0xe0,0x1, 0x1c,0x2f,0x8f,0x8f,0xe2,0x0, +0xcf,0x80,0xe0,0x0, 0x1f,0x93,0xe0,0x68,0x39,0xaf,0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x6c,0xe0,0x2, 0x1e,0x85,0x17,0x80,0xe0,0xa, 0x8f,0xd, 0xe0,0x1, +0x1e,0xaf,0x6f,0x96,0x7c,0x4, 0x6f,0x97,0xaf,0x9d,0xe0,0x2, 0x27,0x3e,0xe0,0x2, +0x1f,0x10,0xf0,0x2, 0x1c,0xa1,0x7f,0x3, 0xe0,0x2, 0x1f,0x19,0x8f,0x8e,0xe0,0x2, +0x27,0x8a,0xe0,0x2, 0x1f,0x98,0x7f,0x82,0x15,0x3e,0xe0,0x0, 0x1e,0x95,0xe0,0x1, +0x19,0xaf,0x8f,0x8d,0xe0,0x1, 0x1b,0xad,0xe2,0x0, 0xcf,0x80,0xe0,0x0, 0x1f,0x93, +0xe0,0x1, 0x14,0xff,0xe0,0x63,0x39,0xaf,0x3c,0x63,0xe0,0x2, 0xd5,0x7f,0xf0,0x0, +0x8d,0x87,0xf0,0x2, 0x25,0xad,0xf0,0x0, 0x15,0x80,0xf0,0x1, 0x1e,0x1c,0xe0,0x2, +0x1a,0x1b,0xf8,0x40,0x3f,0x6b,0xf8,0x40,0x3d,0x6b,0xe8,0x40,0x39,0x6b,0xe0,0x0, +0x0, 0xcc,0xe8,0x40,0x3d,0xea,0x3d,0x62,0xe2,0x0, 0x7c,0x97,0xe2,0x0, 0x7c,0x16, +0xdf,0x18,0xe0,0xd, 0x8f,0x85,0xe0,0x1f,0x17,0x7f,0xe8,0xe, 0x3f,0x58,0xe0,0x12, +0x37,0xac,0xe2,0x1, 0xcf,0xff,0xe8,0xe, 0x3f,0x12,0xf2,0x1f,0xc6,0xff,0xe3,0xff, +0xc7,0x7f,0xe0,0x1, 0x1, 0xa, 0xf0,0x0, 0x13,0x81,0xf8,0x17,0x3b,0x9a,0xf8,0x40, +0x3d,0x67,0xf2,0x1, 0xc5,0x7f,0x16,0x1, 0xe0,0xf, 0x33,0x2e,0xe8,0xc, 0x3e,0x1b, +0xe8,0xf, 0x3f,0x9d,0xf0,0x40,0x3d,0xec,0xf2,0x1, 0xc5,0xff,0xe3,0xff,0xc7,0xff, +0x16,0x86,0xe8,0xd, 0x3e,0xbe,0xe0,0xa, 0x37,0xc8,0x3e,0x93,0xaf,0xbd,0xe0,0xb, +0x37,0x48,0x47,0x96,0xf0,0x0, 0xc7,0x1, 0xaf,0xed,0xf2,0x1, 0xc7,0x7f,0x47,0x97, +0xad,0x2d,0xad,0xcd,0xaf,0x5d,0xaf,0xfd,0xc1,0x1, 0x8f,0x87,0xe2,0x1, 0xc1,0x7f, +0x3f,0xf2,0xe0,0x0, 0x5, 0xe2,0xf0,0x0, 0x10,0x8a,0xf0,0x11,0x38,0xb2,0xe8,0x0, +0x8d,0x8c,0xf8,0x5, 0x3c,0x91,0xe0,0xd, 0x8e,0x85,0x3e,0xfb,0x3, 0xee,0x17,0x8f, +0x3f,0xdd,0x37,0xa3,0x3f,0x94,0x8b,0xf, 0xe2,0x0, 0xcb,0x3, 0x1, 0x66,0xe2,0x0, +0xcb,0x1, 0xf0,0x6, 0x9e,0xa5,0xf0,0x6, 0x9c,0x35,0xe7,0xff,0x1, 0x9c,0x25,0x9c, +0xe0,0x1, 0x1f,0x64,0x87,0xce,0xe2,0x0, 0xc7,0x8f,0x3e,0xff,0xe0,0x1, 0x1, 0x66, +0xe0,0x1, 0x1d,0x64,0x3f,0xe6,0x0, 0x89,0xe0,0x1, 0x87,0x6a,0xc5,0xa, 0xe2,0x0, +0xc7,0xf, 0x3f,0x7d,0xe0,0x1, 0x1, 0x5c,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3f,0x7b, +0x3c,0xef,0xc7,0x81,0x4, 0xf2,0xe8,0x40,0x3d,0xea,0x3d,0x62,0xe2,0x0, 0x7c,0x97, +0xe2,0x0, 0x7c,0x16,0xf0,0x0, 0x78,0x81,0xde,0x94,0xf0,0x0, 0x60,0x81,0xe0,0x1f, +0x17,0x7f,0xf8,0x11,0x38,0x99,0xe8,0xd, 0x8f,0x81,0xe8,0xe, 0x3f,0x58,0xe0,0x12, +0x37,0xac,0xe2,0x1, 0xcf,0xff,0xe8,0xe, 0x3f,0x12,0xf2,0x1f,0xc6,0xff,0xe3,0xff, +0xc7,0x7f,0xe7,0xff,0x1, 0x82,0xe7,0x80,0x17,0x80,0xe8,0xf, 0x3f,0x9d,0xe3,0xff, +0xc7,0xff,0xe7,0xff,0x0, 0x87,0xe0,0x2, 0x1e,0x85,0xe0,0x2, 0x1f,0xf, 0xe0,0xa, +0x8f,0x8d,0x87,0xe, 0xe2,0x0, 0xcf,0x81,0xf0,0x0, 0xad,0x13,0xaf,0x3, 0xe0,0x1, +0x1, 0x2a,0xf0,0x0, 0x25,0xf4,0x67,0x84,0x11,0x81,0xe0,0x1, 0x2f,0xb2,0x67,0x2, +0x8f,0x8e,0x27,0x86,0xe0,0x0, 0x1f,0xaa,0x8f,0x8f,0xe0,0x1, 0x27,0xd9,0xe8,0x0, +0x89,0xc, 0xe0,0x2, 0x1e,0x99,0x17,0x80,0xe4,0x0, 0xc1,0xa, 0xaf,0x8d,0x3d,0x62, +0x67,0x2, 0x66,0x83,0xe0,0x2, 0x1c,0x9c,0xe0,0x1, 0x1c,0x64,0xaf,0x8e,0xaf,0x8d, +0xe0,0x2, 0xd4,0x5a,0xf0,0x0, 0x25,0xa5,0x3c,0x63,0xc0,0x14,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe0,0x2, 0x1e,0x98,0x8f,0x8d,0x7e,0x82,0xe7,0xfd,0x2f,0xf7,0x67,0x3, +0x89,0x8e,0xe7,0xfd,0x29,0xf3,0x67,0x4, 0x27,0x7, 0xe0,0x1, 0x1f,0xb1,0xa7,0xf, +0xa7,0xce,0xcf,0x84,0xbf,0xce,0xe0,0x1, 0x1f,0x9c,0xe0,0x2, 0x1c,0x9c,0x89,0xf, +0xe0,0x1, 0x1c,0x64,0xe4,0x0, 0xc1,0xa, 0x3d,0x62,0xe0,0x2, 0xd4,0x35,0xe0,0x1, +0x1c,0x64,0x3d,0x62,0xe0,0x1, 0x14,0xff,0xe0,0x2, 0xd4,0x68,0x3c,0x63,0xc0,0x14, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1f,0xf, 0xf0,0x2, 0x1c,0xa1,0x8f,0x8e, +0x2f,0xbe,0xe0,0x2, 0x1f,0x90,0x7f,0x83,0x16,0xb7,0xe0,0x0, 0x1f,0x8e,0xe0,0x1a, +0x9f,0xdf,0xe1,0x2f,0x3f,0x9d,0xaf,0x8e,0xe7,0xfd,0x0, 0xb8,0xe0,0x2, 0x1e,0x85, +0xe0,0x2, 0x1f,0xf, 0xe0,0xa, 0x8f,0x8d,0x87,0xe, 0xe2,0x0, 0xcf,0x81,0xf0,0x0, +0xad,0x93,0xaf,0x3, 0xf0,0x1, 0x1e,0x1c,0x1, 0x35,0x67,0x3, 0x8f,0x8e,0x2f,0xba, +0x67,0x2, 0x89,0x8e,0xe0,0x0, 0x21,0xf1,0xe0,0x0, 0x1f,0x2a,0x89,0x8e,0xe0,0x0, +0x21,0xe5,0xe8,0x0, 0x89,0xc, 0xe0,0x2, 0x1e,0x99,0xe4,0x0, 0xc1,0xa, 0xaf,0x8d, +0x3d,0x62,0x67,0x2, 0x66,0x83,0xe0,0x2, 0x1c,0x9c,0xe0,0x1, 0x1c,0x64,0x39,0xef, +0xaf,0x8e,0xaf,0x8d,0xe0,0x2, 0xd3,0xe8,0xe7,0xff,0x0, 0xb3,0xe0,0x2, 0x1e,0x90, +0x17,0x81,0x7e,0x83,0xaf,0x8d,0x0, 0xc1,0xe0,0x0, 0x14,0x80,0xe4,0x0, 0xc4,0x8a, +0xe0,0x1, 0x1f,0xe4,0x3c,0x9f,0xf0,0x0, 0x9e,0x89,0xf0,0x0, 0x9c,0x19,0xe7,0xfe, +0x0, 0xa4,0x67,0x3, 0x89,0x8e,0xe2,0x0, 0xc9,0x81,0x1, 0x1c,0x11,0x80,0xe7,0xfe, +0x0, 0xd8,0x67,0x84,0xf0,0x0, 0x15,0x80,0x11,0x81,0xe7,0xfe,0x27,0xd2,0xe0,0x0, +0x1e,0x95,0x17,0x0, 0x8f,0x8d,0xe0,0x2f,0x3f,0x8e,0xaf,0x8d,0xef,0xfb,0xd7,0x68, +0xe0,0x1, 0x1f,0xb1,0x16,0xfb,0xa7,0xf, 0xa7,0xce,0x3f,0xdd,0xbf,0xce,0xe7,0xfe, +0x0, 0xc0,0xe0,0x1, 0x1f,0xe2,0x16,0x85,0x67,0x4, 0xae,0x8f,0xe7,0xfe,0x27,0x39, +0xef,0xfb,0xd7,0x56,0xe0,0x0, 0x1e,0x95,0xe0,0x1, 0x1f,0x31,0x8f,0x8d,0x16,0x80, +0xe0,0x2f,0x3f,0x8d,0xe0,0x0, 0x1e,0x95,0xa7,0xe, 0xaf,0x8d,0x16,0xfb,0xa7,0xce, +0x3f,0xdd,0xbf,0xce,0xe7,0xfe,0x0, 0xa5,0xf0,0x40,0x3d,0xe3,0xe0,0x2, 0x1c,0x1b, +0xda,0x76,0xe7,0xfe,0x0, 0xa6,0xe8,0x0, 0x89,0xc, 0xe0,0x2, 0x1f,0x19,0xe4,0x0, +0xc1,0xa, 0x67,0x82,0x66,0x83,0xe0,0x2, 0x1c,0x9c,0xe0,0x1, 0x1c,0x64,0x3d,0x62, +0xa9,0x8e,0xa9,0x8f,0xa9,0x8d,0xe0,0x2, 0xd3,0x7f,0xe7,0xfe,0x0, 0xca,0x14,0x1, +0xe7,0xfc,0x0, 0x86,0x8, 0xb3,0xe0,0x2, 0x1f,0xf3,0x17,0x1, 0xa1,0xf, 0x16,0xfe, +0xe0,0x1, 0xa7,0xe2,0x3f,0x58,0x3f,0xdd,0x3f,0xce,0xe0,0x1, 0xbf,0xe2,0x2c,0x21, +0xe0,0x2, 0x19,0x8d,0x17,0x3, 0x8f,0x83,0x3f,0x3f,0xe0,0x2, 0x1f,0x89,0x3f,0x9e, +0x8c,0xf, 0xd4,0xa9,0xe0,0x2, 0xa7,0xd2,0x17,0x43,0x3f,0xde,0xcf,0x98,0xe0,0x2, +0xbf,0xd2,0x8e,0x83,0x8f,0x83,0xe0,0x2, 0x1f,0x6d,0xe4,0x0, 0xc6,0x85,0xe4,0x0, +0xc7,0x85,0x3f,0x9e,0x3f,0x1d,0x8c,0xcf,0x8c,0x3e,0x9, 0xa1,0xe0,0x5, 0x0, 0xee, +0x14,0x28,0xd4,0x91,0xe0,0x2, 0xa7,0xd2,0xe0,0x2, 0x1f,0xd, 0xcf,0xbc,0xe0,0x2, +0xbf,0xd2,0x8e,0x8e,0x8f,0x8e,0xe0,0x2, 0x1f,0x6d,0xe4,0x0, 0xc7,0x85,0xe4,0x0, +0xc6,0x85,0x3f,0x9e,0x84,0xcf,0x3f,0x1d,0xc4,0xfc,0x8c,0x3e,0xe2,0x1, 0xc4,0xff, +0x9, 0xa1,0xe0,0x5, 0x0, 0xd3,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x64,0xe0,0x2, +0x1f,0x28,0xe0,0x2, 0x1f,0xbf,0x87,0xe, 0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, +0x3e,0xfe,0xe0,0x5, 0x1, 0x0, 0x8d,0x8f,0x89,0xaf,0x7d,0x85,0x3e,0x6b,0xe0,0x2, +0x1d,0xbe,0x99,0x5f,0x8f,0x1f,0x8f,0xbf,0x3e,0xe3,0x7d,0x83,0x3d,0x6e,0x3d,0xec, +0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc5,0xff,0x3d,0x7b,0x3, 0x82,0x3f,0x6c,0xf0,0x40, +0x3d,0xee,0x3e,0x6f,0x3f,0x6d,0xe2,0x1, 0xc6,0x7f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e, +0xf2,0x1, 0xc5,0xff,0x3, 0x82,0x3f,0xed,0xe0,0x0, 0x1f,0x30,0x15,0x80,0xf0,0x1, +0x1f,0x3b,0xb5,0x8e,0xe2,0x1, 0xc7,0xff,0xe0,0x2, 0x1f,0xb, 0xe0,0x1, 0x1d,0xba, +0xe0,0x0, 0x7f,0x82,0xf8,0x40,0x3e,0x6e,0xe0,0x1f,0x17,0xff,0xe8,0x80,0xb7,0x9c, +0xf0,0x40,0x3e,0x7b,0xe0,0x80,0xb7,0x9e,0x1, 0xfa,0x14,0x1, 0xef,0xfa,0xd8,0x99, +0xef,0xfb,0xdd,0x0, 0xef,0xfa,0xd4,0xdc,0xe0,0x2, 0x1e,0x8d,0x17,0x5, 0x8f,0x8d, +0xf8,0x40,0x3c,0xeb,0x3f,0x3f,0xe0,0x2, 0x1f,0xed,0x3f,0x9e,0x8f,0xbf,0xe0,0x0, +0x1f,0x31,0xe4,0x7, 0xc7,0xb0,0xf0,0x0, 0xa4,0xe, 0xf0,0x18,0x3c,0x1f,0xe8,0x40, +0x3f,0x68,0xe0,0x6, 0xc7,0x48,0xf0,0x0, 0x7c,0x1, 0x7f,0x4, 0xf0,0x1, 0x25,0xe0, +0xf0,0x40,0x3d,0xe3,0x62,0x5, 0xf2,0x1, 0xc5,0xff,0xf0,0x0, 0x7f,0x6, 0x13,0x81, +0xe2,0x1, 0xc2,0x7f,0xe8,0x40,0x3b,0x6b,0x12,0x80,0xf0,0x1, 0x1e,0xcd,0xf8,0x40, +0x3f,0x6b,0xf0,0x0, 0x7e,0x7, 0x0, 0x96,0x14,0x1, 0xdf,0x35,0xef,0xfa,0xd8,0x10, +0x14,0x1, 0xef,0xfa,0xd8,0x5e,0x17,0x81,0xe8,0x40,0x3b,0xf9,0x3f,0x97,0xe8,0x6, +0x3b,0x1e,0xc2,0x81,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc3,0x7f,0xe0,0x1, 0x3, 0xb4, +0x3b,0xef,0xf0,0x40,0x3d,0xe5,0xf3,0xff,0xc5,0xff,0xf0,0x40,0x3d,0xf4,0x3, 0xe5, +0xe0,0x2, 0x1d,0xf3,0xe7,0xbf,0x16,0xff,0xf0,0x0, 0xa4,0xb, 0xe0,0x0, 0x15,0x68, +0xe8,0x1, 0xa7,0xe8,0xe0,0x1, 0x14,0xff,0x3f,0xdd,0xe8,0x1, 0xbf,0xe8,0xf0,0x0, +0x16,0x0, 0x64,0x4, 0xe0,0x2, 0xd2,0xba,0xf0,0x0, 0x65,0x3, 0x29,0x6, 0x0, 0xa9, +0x39,0x7d,0xf0,0x0, 0xc5,0x2, 0x5, 0xa5,0xe8,0x40,0x3c,0x6c,0x3c,0xe3,0xe0,0x2, +0xd0,0x3b,0xf0,0x0, 0xc6,0x1, 0x3c,0x75,0xe8,0x40,0x3e,0xec,0xe3,0xff,0xc6,0xff, +0x1, 0xf0,0xe8,0x0, 0x9f,0x8a,0x67,0x1, 0xc7,0x84,0xe0,0xc, 0x37,0x85,0x36,0x22, +0x3e,0x1e,0xe0,0x1a,0xa5,0xac,0xe0,0x41,0x3f,0x8f,0x17,0x1, 0xe0,0xf, 0x37,0x3f, +0xe3,0xf, 0x3d,0xdf,0x39,0x7d,0xe0,0x1a,0xbf,0xac,0xf0,0x0, 0xc5,0x2, 0x2, 0xdd, +0xe8,0x1, 0xa7,0xe8,0x14,0x1, 0xe0,0x40,0xcf,0x80,0xe8,0x1, 0xbf,0xe8,0xde,0xd3, +0xef,0xfa,0xd7,0xae,0x14,0x1, 0xef,0xfa,0xd7,0xfc,0x14,0x0, 0xf0,0x40,0x3b,0x68, +0xf0,0x0, 0x25,0xaa,0xf0,0xa, 0x3f,0x18,0xe3,0xff,0xc5,0x7f,0xe0,0x40,0x3f,0xe8, +0xf0,0x0, 0x27,0x17,0xe0,0xc, 0x17,0x52,0x3f,0x1f,0xe0,0xd, 0x37,0xa1,0x37,0x21, +0xe8,0xe, 0x3f,0x1d,0xe8,0xd, 0x3e,0x9d,0x9d,0x8e,0x96,0xd, 0xc7,0x81,0x3d,0xfc, +0xe3,0xff,0xc7,0xff,0x3, 0x3, 0x9f,0xe, 0xb7,0xd, 0x3f,0xfa,0x1, 0xec,0xf0,0x0, +0xc3,0x1, 0xf3,0xff,0xc3,0x7f,0xf8,0x40,0x3b,0x7b,0xe8,0x8, 0x3c,0x1e,0xe3,0xff, +0xc4,0x7f,0x1, 0xd9,0x3b,0xf4,0x3c,0x66,0xf0,0x40,0x3b,0xe7,0xe7,0xfe,0x3, 0xed, +0xf0,0xa, 0x3f,0x18,0xe3,0xff,0xc5,0x7f,0xe0,0x40,0x3f,0xe8,0xf0,0x0, 0x27,0x17, +0xe0,0xc, 0x17,0x52,0x3f,0x1f,0xe0,0xd, 0x37,0xa1,0x37,0x21,0xe8,0xe, 0x3f,0x1d, +0xe8,0xd, 0x3e,0x9d,0x9d,0x8e,0x96,0xd, 0xc7,0x81,0x3d,0xfc,0xe3,0xff,0xc7,0xff, +0x3, 0x3, 0x9f,0xe, 0xb7,0xd, 0x3f,0xfa,0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf3,0xff, +0xc3,0xff,0xf0,0x40,0x3b,0xf4,0xe8,0x8, 0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x1, 0xd9, +0xe7,0xfe,0x0, 0xc3,0xf0,0x0, 0x67,0x6, 0xf0,0x0, 0x66,0x7, 0x67,0x82,0xf0,0x2, +0x1e,0x8a,0xe0,0x2, 0x27,0x95,0xf0,0x0, 0x65,0x5, 0xf0,0x40,0x3c,0xe3,0xf2,0x1, +0xc4,0xff,0xf2,0x1, 0xc5,0x7f,0xf8,0x7, 0x3c,0xba,0xf0,0x2, 0x1e,0x8a,0x3f,0xe7, +0xe3,0xff,0xc7,0xff,0xf0,0x0, 0x7f,0x6, 0x12,0x81,0xf0,0x0, 0x7e,0x7, 0x3b,0x6f, +0xf8,0x40,0x3e,0x69,0x7f,0x85,0x12,0x0, 0xf0,0x1, 0x1d,0xcd,0xf8,0x40,0x3f,0x6a, +0xf8,0x40,0x3c,0xed,0x0, 0x92,0x14,0x1, 0xde,0x46,0xef,0xfa,0xd7,0x21,0x14,0x1, +0xef,0xfa,0xd7,0x6f,0x66,0x82,0x17,0x81,0x3e,0xf5,0x3f,0x95,0xc2,0x1, 0xe3,0xff, +0xc7,0xff,0xe0,0x1, 0x5, 0xdf,0x3a,0xef,0xf0,0x40,0x3d,0x64,0xf3,0xff,0xc5,0x7f, +0xf8,0x40,0x3d,0x7c,0x3, 0xe9,0xe0,0x2, 0x1d,0xf3,0xe7,0xbf,0x16,0xff,0xf0,0x0, +0xa6,0x8b,0xe0,0x0, 0x15,0x68,0xe8,0x1, 0xa7,0xed,0xe0,0x1, 0x14,0xff,0x3f,0xdd, +0xe8,0x1, 0xbf,0xed,0xf0,0x0, 0x14,0x0, 0x64,0x4, 0xe0,0x2, 0xd1,0xcf,0x63,0x83, +0x29,0x5, 0x0, 0xa6,0x39,0x79,0xc3,0x82,0x5, 0xa3,0xe8,0x40,0x3c,0x68,0x3c,0xe3, +0xe0,0x1, 0xdf,0x82,0xf0,0x0, 0xc4,0x1, 0x3c,0x74,0xe8,0x40,0x3c,0xe8,0xe3,0xff, +0xc4,0xff,0x1, 0xf1,0x9f,0x7, 0x67,0x81,0xc7,0x4, 0xe0,0x8, 0x37,0x5, 0x34,0x22, +0x3c,0x1f,0xf0,0x1a,0xa3,0x28,0xe0,0x41,0x3f,0xe, 0x15,0x81,0xe0,0xe, 0x35,0xbe, +0xf3,0xe, 0x3b,0x5e,0x39,0x79,0xe0,0x1a,0xbf,0x28,0xc3,0x82,0x2, 0xdf,0x17,0x80, +0x3f,0x6f,0xe3,0xff,0xc7,0x7f,0xe8,0x40,0x3f,0x7a,0xe0,0x1, 0x1, 0x68,0xc7,0x81, +0xe2,0x0, 0xcf,0x86,0x1, 0xf6,0xe8,0x1, 0xa7,0xed,0x14,0x1, 0xe0,0x40,0xcf,0x80, +0xe8,0x1, 0xbf,0xed,0xdd,0xe0,0xef,0xfa,0xd6,0xbb,0x14,0x1, 0xef,0xfa,0xd7,0x9, +0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x25,0x30,0xe8,0x40,0x3f,0x65,0xe0,0x0, 0x15,0x0, +0xf0,0x0, 0x27,0x1f,0xe0,0xc, 0x17,0xd2,0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1, +0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99,0x9c,0xf, 0xf0,0x0, 0x9b,0x9, 0xc5,0x1, +0xf0,0x40,0x3b,0x78,0xe8,0xe, 0x3f,0x1c,0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f, +0x5, 0x84,0x9f,0x8f,0xe0,0x0, 0xb7,0x89,0xe8,0x40,0x3d,0x7e,0x1, 0xe4,0xf2,0x0, +0xca,0x85,0xe0,0x1, 0x5, 0x95,0xf0,0x0, 0xc2,0x81,0xf3,0xff,0xc2,0xff,0xf8,0x40, +0x3a,0xfa,0x1, 0xd3,0xf0,0x40,0x3e,0x75,0xf0,0x40,0x3b,0x65,0xe7,0xfe,0x5, 0xe4, +0xe8,0x40,0x3f,0x66,0xe0,0x0, 0x15,0x0, 0xf0,0x0, 0x27,0x1e,0xe0,0xc, 0x17,0xd2, +0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1,0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99, +0x9c,0xf, 0xf0,0x0, 0x9b,0x89,0xc5,0x1, 0xf0,0x40,0x3b,0xf8,0xe8,0xe, 0x3f,0x1c, +0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f,0x5, 0x83,0x9f,0x8f,0xb7,0x89,0xe8,0x40, +0x3d,0x7e,0x1, 0xe5,0xf2,0x0, 0xcb,0x5, 0x2, 0x94,0xe8,0xf, 0x3b,0x16,0xe3,0xff, +0xc7,0xff,0xe0,0xc, 0x17,0x52,0x3f,0x1f,0x37,0x21,0x37,0xa1,0xe8,0xe, 0x3f,0x1b, +0xe8,0xf, 0x3f,0x99,0x9d,0xe, 0x9c,0x8f,0x3c,0xfa,0x5, 0x83,0x9f,0xe, 0xb7,0xf, +0xf0,0x0, 0xc3,0x1, 0xf3,0xff,0xc3,0x7f,0xf8,0x40,0x3b,0x7c,0x1, 0xc2,0x66,0x82, +0x17,0x81,0x3e,0xf5,0x3f,0x95,0xc2,0x1, 0xe3,0xff,0xc7,0xff,0xe7,0xfe,0x2, 0xa5, +0xf0,0x0, 0x67,0x6, 0xf0,0x0, 0x66,0x7, 0xf8,0x40,0x3e,0xe9,0xe0,0x2, 0x1f,0x8a, +0xe8,0x80,0x97,0x1e,0x9e,0x8f,0x3f,0x7d,0x3, 0x2, 0xb7,0xf, 0xf8,0x40,0x3f,0x7c, +0xc7,0x82,0x1, 0xf7,0xe0,0x1, 0x1f,0xe0,0x17,0x0, 0xe0,0x1, 0x1e,0xee,0xe0,0x2, +0xaf,0xf, 0x14,0x0, 0xe0,0x1, 0xaf,0x7f,0xf0,0x0, 0xbe,0x8d,0xdd,0x3c,0xe0,0x2, +0x1f,0xd, 0x8c,0xe, 0xef,0xfa,0xd4,0x9b,0xe0,0x2, 0x1f,0x3a,0x17,0x87,0xaf,0x8e, +0xe0,0x2, 0x1f,0x3b,0xaf,0x8e,0xc0,0x1c,0xf8,0x0, 0xf, 0x28,0xb, 0xa1,0xe7,0x52, +0x0, 0x94,0x8e,0x9f,0xe0,0x2, 0x1f,0x3d,0x89,0xbf,0x7e,0x85,0x99,0x6f,0x8e,0xf, +0x8e,0xaf,0x7f,0x3, 0x3f,0xe3,0x67,0x5, 0xe7,0xfb,0x0, 0x82,0x67,0x85,0xe0,0xc, +0x17,0x52,0xe8,0xf, 0x3f,0x95,0xe3,0xff,0xc7,0xff,0x3f,0x1f,0x37,0x21,0x37,0xa1, +0xe8,0xe, 0x3f,0x1b,0xe8,0xf, 0x3f,0x99,0x9d,0xe, 0x9c,0x8f,0x3c,0xfa,0xe7,0xfe, +0x5, 0xdc,0x9f,0xe, 0xb7,0xf, 0xe7,0xfe,0x0, 0xd8,0x17,0x1e,0xf2,0x0, 0xcd,0x2, +0x3f,0x2f,0x16,0x81,0xe0,0xe, 0x36,0xbe,0x2, 0x8a,0x65,0x81,0xe0,0x1a,0xa5,0x2b, +0xe3,0xe, 0x3d,0x5e,0xe0,0x1a,0xbf,0x2b,0xe7,0xfe,0x0, 0x8b,0x66,0x81,0x17,0x1d, +0xe0,0x1d,0xa5,0x3d,0x3f,0x2f,0x15,0x81,0xe0,0xe, 0x35,0xbe,0xe3,0xe, 0x3d,0x5e, +0xe0,0x1d,0xbf,0x3d,0xe7,0xfd,0x0, 0xfd,0xe0,0x2, 0x1f,0xf3,0x16,0x80,0xa6,0xf, +0xe0,0x1, 0xa7,0x6c,0x37,0x4d,0xe2,0x0, 0xc7,0x1, 0x24,0x85,0xc4,0xff,0xe0,0x7, +0x16,0xff,0x3e,0xd9,0xe0,0x1, 0xa5,0xec,0xe7,0xbf,0x17,0xff,0x3d,0xdf,0xe0,0x1, +0xbd,0xec,0xe4,0x7, 0xc4,0x30,0xe0,0x0, 0x1d,0xb1,0xe4,0xd, 0x36,0xa0,0xa5,0x8b, +0x37,0x2d,0x3c,0x1b,0xa5,0x8, 0xe0,0x3, 0x1d,0x95,0x3d,0xda,0x3e,0xcb,0xbe,0x88, +0xe0,0x1, 0xa6,0xec,0x3f,0xdd,0x3f,0xce,0xe0,0x1, 0xbf,0xec,0x38,0x82,0xe0,0x2, +0x1f,0xf3,0xe0,0x0, 0x1d,0xb1,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f, +0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef, +0x3c,0x1b,0xa5,0x88,0xe2,0x0, 0xc4,0x8f,0xe0,0xd, 0x34,0xab,0xe7,0xf, 0x14,0xff, +0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d, +0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1d,0xb1, +0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b, +0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0x88,0xe2,0x0, +0xc4,0x81,0xe0,0xd, 0x34,0xaa,0xe7,0xf7,0x14,0xff,0x3c,0xdb,0x3c,0xcd,0xbc,0x88, +0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f, +0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1d,0xb1,0xa7,0x8f,0xe7,0xbf,0x16,0x7f, +0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc, +0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xe2,0x0, 0xc4,0x81,0xa5,0x88,0xe4,0xd, 0x34,0xac, +0xe0,0x3, 0x1c,0x96,0xe2,0x0, 0xc5,0x3, 0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe4,0xd, +0x35,0x2a,0xa4,0x88,0xe0,0x3, 0x1d,0x97,0xe2,0x40,0xc7,0x0, 0xe0,0xa, 0x3c,0xdb, +0x3d,0x4d,0xbd,0x8, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f, +0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1d,0xb1,0xa7,0x8f,0xe7,0xbf,0x16,0xff, +0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0x6f,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0x5d, +0xe0,0x1, 0xbe,0x6f,0x3c,0x1b,0xa5,0xa8,0xe7,0xf0,0x16,0x0, 0x3e,0x5b,0xe2,0xf, +0xc4,0xff,0x3c,0xcc,0xbc,0xa8,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0x6f,0x3e,0xdc, +0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1d,0xb1, +0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b, +0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xe2,0xf, 0xc4,0xff, +0xa5,0xb8,0xe4,0xd, 0x34,0xa0,0xe0,0x3, 0x1c,0x98,0xe2,0x40,0xc7,0x0, 0x3c,0xdb, +0x3c,0xcd,0xbc,0xb8,0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f, +0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1d,0xb1,0xa7,0x8f,0xe7,0xbf,0x16,0x7f, +0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc, +0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0xe8,0xe2,0x0, 0xc4,0x87,0xe0,0xd, 0x34,0xa6, +0xe7,0xfc,0x14,0xbf,0x3c,0xdb,0x3c,0xcd,0xbc,0xe8,0xe2,0x0, 0xc5,0xf, 0xa4,0xe8, +0x15,0xc3,0xe0,0xd, 0x35,0x22,0xe0,0xa, 0x3c,0xdb,0x3d,0x4d,0xbd,0x68,0xe2,0x40, +0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x2, 0x1f,0xf3,0xe2,0x1f,0xc4,0x7f,0xa7,0xf, 0xe7,0xe0,0x17,0x80,0xe0,0x4, +0xa6,0x8e,0x3f,0xdd,0x3c,0x4f,0xe0,0x4, 0xbc,0xe, 0x38,0x82,0xe0,0x2, 0x1f,0xf3, +0xe2,0x0, 0xc4,0x1, 0xa7,0x8f,0x17,0x7b,0xe0,0x1, 0xa6,0x6f,0xe0,0xd, 0x34,0x22, +0x3f,0x5c,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x17,0x7d,0xe0,0x1, 0xa6,0xef,0x34,0x21, +0x3f,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x6f,0xe2,0x0, 0xc4,0x8f,0xe0,0x2, 0xa6,0x3f, +0xe7,0xfe,0x17,0xf, 0xe0,0xd, 0x34,0xa4,0x3f,0x5c,0x3f,0x4d,0xe0,0x2, 0xbf,0x3f, +0x17,0x70,0xe0,0x2, 0xa6,0xbf,0x3f,0x5d,0x3c,0xce,0xe0,0x2, 0xbc,0xbf,0x38,0x82, +0xe0,0x2, 0x1f,0xf3,0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xdf,0x16,0xff,0xe0,0x1, +0xa6,0x6e,0xe0,0xf, 0x34,0x2c,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e, +0xe7,0xf0,0x17,0x80,0xe0,0x2, 0xa6,0xce,0xe2,0xf, 0xc4,0xff,0x3f,0xdd,0x3c,0xcf, +0xe0,0x2, 0xbc,0xce,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe2,0x0, 0xc4,0x1, 0xa7,0xf, +0xe7,0xef,0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, 0x34,0x2b,0xe0,0x8, 0x3e,0x5d, +0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe0,0x4, 0xb4,0xde,0x38,0x82,0xe0,0x2, 0x1f,0xf3, +0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x3, 0xa6,0x8f,0x3f,0x5d, +0x3c,0x4e,0xe0,0x3, 0xbc,0xf, 0xe0,0x6, 0xb4,0xbf,0xe0,0x6, 0xb5,0x5f,0x38,0x82, +0xe0,0x2, 0x1f,0xf3,0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x3, +0xa6,0xbf,0x3f,0x5d,0x3c,0x4e,0xe0,0x3, 0xbc,0x3f,0xe0,0x7, 0xb4,0x9f,0xe0,0x7, +0xb5,0x3f,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe7,0xbf,0x15,0x7f,0xa7,0x8f,0xe0,0xb, +0x34,0x46,0xe0,0x1, 0xa6,0xef,0xe0,0x1, 0xa7,0x6f,0x35,0xa2,0x3f,0x5a,0xe0,0x1, +0xbf,0x6f,0x17,0x73,0xe0,0x2, 0xa6,0x6f,0xe2,0x40,0xc6,0x80,0x3e,0x5e,0x3e,0x4b, +0xe0,0x2, 0xbe,0x6f,0xe0,0xb, 0x34,0x26,0xe0,0x2, 0xa6,0x6f,0xe7,0xe7,0x17,0x7f, +0xe2,0x18,0xc5,0x80,0x3e,0x5e,0x3e,0x4b,0xe0,0x2, 0xbe,0x6f,0x34,0x42,0xe0,0x2, +0xa5,0xef,0x17,0x3, 0x16,0x7c,0x3f,0x58,0xe0,0x8, 0x3d,0xdc,0x3c,0x4e,0xe0,0x2, +0xbc,0x6f,0xe0,0x1, 0xa7,0x6f,0x3f,0x5a,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1f,0x31,0xa6,0x8f,0xe7,0xbf,0x15,0xff,0xe0,0x1, +0xa6,0x6d,0xe0,0x1, 0xa7,0xed,0xa7,0xe, 0xe4,0x7, 0xc4,0x30,0x3f,0xdb,0xe0,0x1, +0xbf,0xed,0x3c,0x1e,0xa5,0x28,0xe0,0xe, 0x34,0xc2,0xe0,0x3, 0x1f,0x99,0xe2,0x0, +0xc7,0x3, 0xe4,0xe, 0x37,0x2d,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0xe0,0xe, 0x34,0xc6, +0xa5,0x28,0xe0,0x3, 0x1f,0x9a,0xe4,0xe, 0x37,0x2b,0x3f,0xda,0x3f,0xce,0xbf,0xa8, +0x34,0xc4,0xa5,0x28,0xe0,0x3, 0x1f,0x1b,0xe2,0x0, 0xc4,0x83,0xe4,0xf, 0x34,0xa9, +0xe0,0x9, 0x3d,0x5e,0x3c,0xcf,0xbc,0xa8,0xe2,0x40,0xc6,0x0, 0xe0,0x1, 0xa7,0xed, +0x3d,0xdf,0x3e,0x4b,0xe0,0x1, 0xbe,0x6d,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, +0x1f,0x31,0xa6,0x8f,0xe7,0xbf,0x15,0xff,0xe0,0x1, 0xa6,0x6d,0xe0,0x1, 0xa7,0xed, +0xa7,0xe, 0xe4,0x7, 0xc4,0x30,0x3f,0xdb,0xe0,0x1, 0xbf,0xed,0x3c,0x1e,0xa5,0x28, +0xe0,0xe, 0x34,0xc2,0xe0,0x3, 0x1f,0x9c,0xe2,0x0, 0xc7,0x3, 0xe4,0xe, 0x37,0x27, +0x3f,0xda,0x3f,0xce,0xbf,0xa8,0xe0,0xe, 0x34,0xc6,0xa5,0x28,0xe0,0x3, 0x1f,0x9d, +0xe4,0xe, 0x37,0x25,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0x34,0xc4,0xa5,0x28,0xe0,0x3, +0x1f,0x1e,0xe2,0x0, 0xc4,0x83,0xe4,0xf, 0x34,0xa3,0xe0,0x9, 0x3d,0x5e,0x3c,0xcf, +0xbc,0xa8,0xe2,0x40,0xc6,0x0, 0xe0,0x1, 0xa7,0xed,0x3d,0xdf,0x3e,0x4b,0xe0,0x1, +0xbe,0x6d,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0x17,0x77, +0xe0,0x1, 0xa6,0x6d,0xe0,0xf, 0x34,0x23,0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xe0,0x1, +0xbc,0x6d,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xfb, +0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, 0x34,0x29,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f, +0xe0,0x1, 0xbc,0x6e,0xe2,0x0, 0xc4,0x81,0xe0,0x1, 0xa6,0x6e,0xe7,0xf7,0x16,0xff, +0xe0,0xf, 0x34,0xaa,0xe0,0x9, 0x3e,0x5d,0x3c,0xcf,0xe0,0x1, 0xbc,0xee,0x38,0x82, +0xe0,0x2, 0x1f,0xf3,0xa7,0xf, 0xe7,0xf8,0x17,0x80,0xe0,0x1, 0xa6,0xfe,0x3f,0xdd, +0x3c,0x4f,0xe0,0x1, 0xbc,0x7e,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe7,0xe0,0x17,0x0, +0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x2, 0xa6,0x8f,0xe2,0x1f,0xc4,0xff,0x3e,0xde, +0x3c,0x4d,0xe0,0x2, 0xbc,0xf, 0xe0,0x2, 0xa6,0x9f,0x3f,0x5d,0x3f,0x49,0xe0,0x2, +0xbf,0x1f,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa6,0x8f,0xa7,0x3d,0x37,0x4c,0xe2,0x0, +0xc7,0x1, 0xe0,0x61,0x3e,0x2, 0xe7,0xfe,0x17,0xff,0x3f,0xdc,0xe0,0x61,0x3f,0x92, +0xa7,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x81,0x27,0x85,0xa7,0x9d,0xe0,0x20,0xcf,0x80, +0xbf,0x9d,0xe7,0xdf,0x17,0xff,0xa6,0x3d,0x37,0x2c,0x3f,0xdc,0x3f,0xce,0xbf,0xbd, +0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x61, +0x3f,0x2, 0xe7,0xfe,0x17,0xff,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x2, 0x1f,0xf3, +0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0xe7,0xdf,0x17,0x7f,0xa6,0x3d,0xe0,0xf, 0x34,0x2c, +0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xbc,0x3d,0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xf0,0x3, 0x1b,0x1f,0xf0,0x0, +0xa2,0xf, 0xe7,0xbf,0x17,0xff,0xf8,0x1, 0xa1,0xe4,0xe8,0x1, 0xa7,0x64,0xf0,0x13, +0x31,0xcd,0x3f,0xde,0xe8,0x1, 0xbf,0xe4,0xf2,0x0, 0xc1,0x81,0x87,0x88,0xe8,0x1, +0xa6,0xd4,0xe2,0x0, 0xc7,0x87,0xe0,0xe, 0x37,0xac,0xe7,0x1f,0x17,0xff,0x3f,0xdd, +0x3f,0xce,0xe0,0x0, 0x1f,0x31,0xf0,0x3, 0x1b,0xa0,0xf0,0x0, 0xa2,0x8e,0xe0,0x3, +0x1c,0xa1,0xe8,0x1, 0xbf,0xd4,0xf0,0x0, 0x10,0x80,0x15,0x78,0xe7,0xfe,0x15,0x87, +0xe7,0xf7,0x16,0x7f,0xf0,0x0, 0x11,0x2, 0xf8,0x12,0x39,0x11,0xf0,0x10,0x30,0xa2, +0xf0,0x12,0x31,0x21,0xf0,0x12,0x39,0x18,0xf8,0x10,0x38,0x16,0xe8,0x0, 0xa7,0x0, +0xe8,0x0, 0x8f,0x82,0x3f,0x5a,0x37,0xc5,0x3f,0x4f,0xe8,0x0, 0xbf,0x0, 0xe4,0x7, +0xc7,0xb0,0xe8,0x0, 0x86,0x82,0xe8,0x0, 0xa7,0x0, 0xe2,0x0, 0xc6,0x9f,0x36,0xa3, +0x3f,0x5b,0x3f,0x4d,0xe8,0x0, 0xbf,0x0, 0xe8,0xf, 0x3f,0x95,0xe8,0x0, 0x8e,0x92, +0xa7,0xf, 0x36,0xc6,0xe2,0x0, 0xc6,0x81,0xe4,0xd, 0x36,0xac,0xe8,0xe, 0x3f,0x57, +0x3f,0x4d,0xbf,0xf, 0xf0,0x0, 0xc0,0x81,0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc3, +0xe2,0x0, 0xc6,0x83,0xe4,0xd, 0x36,0xaa,0x3f,0x59,0x3f,0x4d,0xbf,0xf, 0xf2,0x1, +0xc0,0xff,0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc7,0x36,0xaa,0x3f,0x5c,0x3f,0x4d, +0xbf,0xf, 0x8f,0x88,0xe8,0x40,0x3f,0xf1,0xe7,0xff,0x3, 0xb6,0xe8,0x1, 0xa7,0x64, +0xe7,0xbf,0x17,0xff,0xf0,0x13,0x31,0xad,0x3f,0xde,0xf0,0x13,0x39,0xcf,0xf8,0x1, +0xb9,0xe4,0x38,0x82,0xe0,0x0, 0x1f,0x94,0x17,0x1, 0xaf,0xf, 0xe0,0x2, 0x1f,0xf3, +0xe0,0x1, 0x1e,0xfa,0xa7,0x8f,0xaf,0xd, 0x17,0x7d,0xa6,0xdf,0x3f,0x5d,0xbf,0x5f, +0xa7,0x5f,0xcf,0x4, 0xbf,0x5f,0x38,0x82,0xe0,0x0, 0x1f,0x14,0x17,0x81,0xaf,0x8e, +0xe0,0x1, 0x1f,0x7a,0xaf,0x8e,0xe0,0x0, 0x1f,0x10,0xaf,0x8e,0x38,0x82,0x8, 0xb2, +0x39,0x68,0x15,0x4, 0xe1,0xf, 0x14,0x0, 0x3c,0xe2,0xd0,0xac,0xa7,0x82,0xa7,0x2, +0xa4,0x2, 0x37,0xc5,0xe4,0xe, 0x37,0x45,0xe2,0x0, 0xc7,0x7, 0xea,0x2, 0xc4,0x0, +0xe2,0x0, 0xc7,0x88,0x3f,0xce,0xe4,0x8, 0x34,0x48,0x3c,0x1f,0x9, 0x61,0xe0,0x2, +0x1e,0xf3,0xe0,0x2, 0x1e,0x29,0xa6,0x8d,0xa7,0xc, 0xa7,0x8c,0xa6,0xcd,0xe2,0x0, +0xc6,0x81,0x26,0xab,0x37,0x48,0xe4,0xf, 0x37,0xc5,0xe2,0x0, 0xc7,0x1, 0xa6,0x8c, +0x37,0x23,0xe2,0x0, 0xc7,0x87,0x3f,0xce,0xea,0x2, 0xcf,0x0, 0x3f,0x5d,0x16,0x85, +0xe0,0x2f,0x3f,0x9d,0xe4,0xe, 0x37,0x48,0x27,0x98,0x27,0x17,0x8, 0xb4,0x11,0x0, +0xe0,0x23,0x3c,0x2, 0x3a,0x69,0x14,0x9, 0x3c,0xe3,0xd0,0x55,0x14,0x9, 0xd0,0x35, +0x39,0xf8,0x14,0x5, 0x1, 0xc, 0xc1,0x1, 0xef,0xfb,0xd1,0xf6,0xe3,0xff,0xc1,0x7f, +0x3a,0x72,0x3, 0xf5,0x14,0x0, 0xa, 0x61,0x14,0x0, 0x38,0x82,0x14,0x1, 0xa, 0x61, +0xe0,0x0, 0x1f,0x94,0x8c,0xf, 0x8f,0xf, 0x27,0x1f,0xe0,0x2, 0x1f,0x73,0x16,0x80, +0xa5,0x8e,0xe0,0x0, 0x1f,0x10,0xae,0x8e,0xa6,0x5b,0xe0,0x1, 0x1f,0x31,0xce,0x1, +0xa7,0xe, 0xbe,0x5b,0xe0,0x1, 0xa6,0x6e,0xe0,0x4, 0xce,0x0, 0xe0,0x1, 0xbe,0x6e, +0xe7,0xfb,0x16,0x7f,0xe0,0x1, 0xa5,0xee,0x3e,0x5b,0xe0,0x1, 0xbe,0x6e,0xae,0x8f, +0xe0,0x1, 0x1f,0xfa,0xae,0x8f,0x38,0x82,0x8, 0xb3,0xe0,0x2, 0x1f,0xf3,0x39,0xe8, +0xa7,0x8f,0x14,0x0, 0xa1,0x3f,0xde,0xc4,0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1f,0x6e, +0xa7,0x8f,0xa6,0x8e,0xa7,0x1f,0x31,0x4c,0xcf,0x10,0xbf,0x1f,0xe2,0x0, 0xc1,0x1, +0xb1,0xdd,0x3c,0x62,0x89,0x7d,0xa6,0x9f,0x17,0x6f,0x3f,0x5d,0xbf,0x1f,0xde,0xb0, +0x3c,0x62,0x9, 0xe1,0x8, 0xb4,0xe0,0x2, 0x1f,0xf3,0x3a,0x68,0xa7,0x8f,0x14,0x0, +0xa1,0x3f,0x39,0xe9,0xde,0xa5,0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1f,0x6e,0xa7,0x8f, +0xa6,0x8e,0xa7,0x1f,0x31,0x4c,0xcf,0x10,0xbf,0x1f,0xe2,0x0, 0xc1,0x1, 0xb2,0x5d, +0x17,0x6f,0xa9,0xbd,0x3c,0x62,0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0xa, 0x21,0xe7,0xfd, +0x0, 0x90,0x8, 0xb5,0xe0,0x2, 0x1f,0xf3,0x39,0x68,0xa7,0x8f,0x14,0x0, 0xa7,0xbf, +0x12,0x81,0x37,0xcc,0x3a,0xdf,0x39,0xe9,0x3a,0x6a,0xde,0x82,0xe0,0x1, 0x1f,0xde, +0xa6,0x8f,0xa7,0x9d,0xcf,0x90,0xbf,0x9d,0x22,0x13,0xe0,0x2, 0x1f,0xee,0xe0,0xa, +0x39,0x14,0x14,0xff,0xa7,0x8f,0x3c,0x93,0xe3,0xff,0xc5,0x7f,0xb1,0x5f,0xc1,0x1, +0x8f,0x7f,0xe3,0xff,0xc1,0x7f,0x39,0x7a,0xe0,0x80,0xaf,0x19,0x1, 0xf8,0xa7,0x1d, +0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d,0xa, 0xa1,0xe7,0xfc,0x0, 0xe2,0x8, 0xb5, +0xe0,0x2, 0x1f,0xf3,0x39,0x68,0xa7,0x8f,0x14,0x0, 0xa7,0xbf,0x12,0x81,0x37,0xcc, +0x3a,0xdf,0x39,0xe9,0x3a,0x6a,0xde,0x54,0xe0,0x1, 0x1f,0xde,0xa6,0x8f,0xa7,0x9d, +0xcf,0x90,0xbf,0x9d,0x22,0x15,0xe0,0x2, 0x1f,0xee,0xe0,0xa, 0x39,0x14,0x14,0xff, +0xa7,0x8f,0x3c,0x93,0xe3,0xff,0xc5,0x7f,0x17,0x1, 0x3f,0x12,0xb1,0x5f,0x39,0x6e, +0xe3,0xff,0xc1,0x7f,0xe0,0x80,0x87,0x19,0x39,0x7a,0xaf,0x3f,0x1, 0xf6,0xa7,0x1d, +0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d,0xa, 0xa1,0xe7,0xfc,0x0, 0xb2,0x0, 0x0, +0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1f,0x42,0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28, +0xe0,0x40,0xce,0x80,0xbe,0x9f,0x16,0xa1,0xb6,0xbe,0x3c,0x98,0xe0,0x6, 0xb4,0xbe, +0xe0,0x2, 0xb5,0x5e,0xe7,0xbf,0x17,0x7f,0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0x38,0x82, +0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1f,0x42,0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28, +0xe0,0x40,0xce,0x80,0xbe,0x9f,0x3c,0x98,0x35,0x28,0xe0,0x7, 0xb4,0xfe,0x3d,0x9a, +0xe0,0x8, 0xb5,0x9e,0xe0,0x7, 0xb6,0x5e,0xe7,0xbf,0x17,0x7f,0xa6,0x9f,0x3f,0x5d, +0xbf,0x1f,0x38,0x82,0xe0,0x2, 0x1f,0xc2,0xe0,0x0, 0x1d,0x92,0xa7,0xf, 0x8e,0xb, +0x9f,0x9e,0x16,0x80,0xcf,0x81,0x3c,0x4f,0xb4,0x1e,0x0, 0x85,0x9f,0x9e,0xe2,0x0, +0xc7,0x88,0x2f,0x8e,0xe0,0x7, 0x97,0x9e,0xe2,0x0, 0xcf,0x80,0x3, 0x78,0x2e,0x8e, +0x9f,0x9e,0xe0,0x80,0xcf,0x80,0xb7,0x9e,0x17,0x80,0xb7,0x9e,0x38,0x82,0x9f,0x9e, +0x16,0x1, 0xcf,0x84,0xb7,0x9e,0x3e,0xec,0x0, 0xee,0xae,0xb, 0x0, 0xf2,0x8, 0xb2, +0xe0,0x1, 0x1f,0xde,0x16,0x0, 0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0xf, +0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xd8,0xb6,0xde,0x96,0xf8,0xb6,0xfe, +0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9e,0xe0,0x0, 0x1e,0x92,0xae,0xd, 0x8e,0x88, +0x8e,0x18,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xa8,0xe0,0x1, 0x9c,0x28, +0xe0,0x9, 0xb6,0xde,0x8e,0xaf,0xe0,0x1, 0xb6,0xfe,0x87,0xbf,0xe2,0x0, 0xc7,0x81, +0xe4,0xf, 0x37,0xa8,0xe4,0xf, 0x37,0xc0,0xb7,0x9e,0xdf,0xad,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0x3f,0x68, +0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92, +0xe0,0x0, 0x14,0x40,0x96,0xde,0xb6,0xdf,0xe0,0x1, 0x96,0x9e,0xe0,0x1, 0xb6,0x9f, +0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, +0xb6,0xdf,0x8f,0x2e,0xe0,0x1, 0xb7,0x7f,0x17,0x0, 0xe0,0x1, 0xb4,0xbf,0xb7,0x1f, +0xdf,0x82,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb4, +0xe0,0x1, 0x1f,0xde,0x39,0xe9,0xa2,0xf, 0xe0,0x2, 0x1f,0xc2,0xa7,0x14,0xa1,0xf, +0xe0,0x40,0xcf,0x0, 0xbf,0x14,0x3f,0xe8,0xa7,0x14,0xe0,0x1, 0x14,0x20,0xe0,0x40, +0xcf,0x0, 0xbf,0x14,0x97,0x3f,0xb7,0x52,0x97,0x7f,0xb7,0x72,0x97,0x5f,0xe0,0x1, +0xb7,0x12,0x8f,0x1f,0x8e,0x8f,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f, +0xe0,0x1, 0xb7,0x32,0x17,0x0, 0xe0,0x9, 0xb7,0x52,0xe0,0x1, 0x97,0xf, 0xe0,0x1, +0xb7,0x72,0xe0,0x1, 0x97,0x1f,0xe0,0x2, 0xb7,0x12,0xe0,0x1, 0x97,0x2f,0xe0,0x2, +0xb7,0x32,0xe0,0x1, 0x97,0x3f,0xe0,0x6, 0xb7,0x12,0x8f,0xbf,0x37,0xa8,0xb7,0x92, +0xdf,0x42,0xe0,0x3, 0x9f,0xb2,0xaf,0x83,0xe0,0x3, 0x9f,0xd2,0xaf,0x93,0xe0,0x2, +0x9d,0x72,0xe0,0x3, 0x9d,0x92,0xe0,0x4, 0x9e,0x32,0xe0,0x4, 0x9e,0xd2,0xe0,0x3, +0x9f,0x72,0xe0,0x4, 0x9f,0x92,0xb5,0x13,0xb7,0xe3,0xe7,0xbf,0x17,0xff,0xb5,0xa3, +0xb6,0x33,0xb6,0xc3,0xb7,0x53,0xa7,0x14,0x3f,0xde,0xbf,0x94,0xa, 0x61,0x8, 0xb2, +0xe0,0x1, 0x1f,0xde,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0xf, 0xe0,0x40, +0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xdf,0xe0,0x1, 0x14,0x40,0xb6,0xde,0x96,0xff, +0xe0,0x1, 0xb6,0x9e,0x8e,0xbf,0x8e,0x2f,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde, +0x8e,0x9f,0x8e,0xf, 0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xbe,0x8e,0xcf,0xe0,0x1, +0xb6,0xfe,0x16,0x80,0xe0,0x9, 0xb6,0xde,0x87,0xdf,0xe2,0x0, 0xc7,0x83,0x37,0xa8, +0xb7,0x9e,0xde,0xf9,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0x3e,0xe8,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa7,0x12, +0xa7,0x8f,0xe0,0x40,0xcf,0x0, 0xbf,0x12,0x16,0x0, 0x97,0x38,0xb7,0x5f,0x97,0x58, +0xb7,0x7f,0x97,0x78,0xe0,0x0, 0x14,0x60,0xe0,0x1, 0xb7,0x1f,0x8f,0xd, 0x8e,0x9d, +0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x5f,0xe0,0x9, 0xb6,0x5f,0xb6,0x1f,0xde,0xd3, +0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb5,0x8f,0x8, +0x8f,0x98,0x39,0x68,0xa4,0x38,0x3f,0x7f,0x34,0x21,0xe0,0x6f,0x3b,0xae,0xe0,0x1, +0x14,0xff,0xe0,0x1, 0x15,0x72,0xe8,0x0, 0xc4,0x2, 0x3a,0xef,0xe0,0x1, 0xda,0x86, +0xe0,0x1, 0x1f,0xde,0x17,0x0, 0xa1,0x8f,0xe0,0x2, 0x1f,0xc2,0xe0,0x0, 0x14,0x60, +0xa2,0xf, 0xa7,0x93,0xe2,0x1, 0xc2,0xff,0xe0,0x40,0xcf,0x80,0xbf,0x93,0x97,0xb2, +0xb7,0xd4,0x97,0xd2,0xb7,0xf4,0x97,0xf2,0xe0,0x1, 0xb7,0x94,0x8f,0x82,0x8e,0x92, +0x37,0xa8,0x3f,0x9d,0xe0,0x1, 0xb7,0xd4,0xe0,0x9, 0xb7,0x54,0xb7,0x14,0xde,0x9b, +0x87,0x2, 0xa4,0xb2,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x27,0xa9,0xe0,0xb, 0x34,0xa1, +0x87,0x92,0x15,0x0, 0xe8,0x0, 0xc5,0x82,0x3e,0xef,0xe2,0x1, 0xc6,0xff,0x26,0x97, +0x16,0xb, 0x3e,0x3a,0xe0,0x0, 0x17,0x0, 0xe0,0xf, 0x3f,0x1c,0x37,0xa1,0x3f,0x9b, +0x96,0x8f,0xc7,0x1, 0xe0,0x41,0x3e,0x8d,0xb6,0x8f,0xe2,0x1, 0xc7,0x7f,0x87,0x92, +0x3e,0xef,0xe2,0x1, 0xc6,0xff,0x3e,0xfe,0x2, 0xf0,0x87,0x2, 0xc5,0x1, 0x3e,0xee, +0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc6,0xff,0x3e,0xfa,0x2, 0xdf,0xe4,0x2, 0xc2,0x81, +0xb4,0xd4,0x17,0x80,0xe0,0x1, 0xb2,0xd4,0xe0,0x1, 0x14,0x50,0xb7,0x94,0xde,0x63, +0xa5,0x32,0x17,0x0, 0x15,0xf0,0x3f,0xee,0x35,0x21,0x0, 0x92,0xe2,0x0, 0xcf,0x87, +0x2, 0xb2,0xe0,0x5, 0x9e,0x14,0x36,0x1b,0xe2,0x0, 0xc6,0xf, 0xb6,0xd, 0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8b,0xc7,0x2, 0xc5,0x84,0x1, 0x1e,0xe2,0x0, +0xcf,0x83,0xe0,0xd, 0x3f,0x1a,0xe8,0x0, 0xc6,0x82,0x2, 0xe9,0xe0,0x4, 0x9e,0x74, +0xe0,0xd, 0x37,0x21,0xc7,0x81,0xe0,0x9, 0x3f,0x1a,0xe0,0xd, 0x36,0x1d,0xe2,0x1, +0xc7,0xff,0xea,0x0, 0xce,0x2, 0x3e,0x19,0xe2,0x0, 0xc6,0x8f,0xe2,0x0, 0xcf,0x8b, +0xb6,0x8c,0xc7,0x2, 0xc5,0x84,0x1, 0xe4,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x93,0xa, 0xe1,0xe0,0x5, 0x9e,0xb4,0x14,0xf0,0x3c,0x9b,0xe0,0xc, 0x3f,0x1a, +0x36,0x99,0xe8,0x0, 0xc6,0x2, 0xe2,0x0, 0xc6,0x8f,0xb6,0x8c,0x0, 0xc9,0x8, 0xb2, +0xe0,0x1, 0x1f,0xde,0x3f,0x68,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0x8f, +0xe0,0x40,0xce,0x80,0xbe,0x92,0xe7,0xbf,0x16,0x7f,0x96,0xd8,0xb6,0xdf,0x96,0xf8, +0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x14,0x60,0xe0,0x1, 0xb6,0x9f,0x8e,0x8e, +0x8d,0x9e,0x36,0xa8,0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, 0xb6,0xdf, +0x8e,0xae,0xe0,0x1, 0xb6,0xff,0xe0,0x7, 0x9e,0x9f,0x3e,0xdc,0xe0,0x7, 0xb6,0x9f, +0x8f,0x3e,0xe0,0x7, 0x9e,0x9f,0x37,0x2d,0x3f,0x4d,0xe0,0x7, 0xb7,0x1f,0x9f,0x1f, +0x3e,0x5e,0xb6,0x1f,0xdd,0xe8,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92, +0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0x3f,0x68,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2, +0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe0,0x1, 0x14,0x60,0x96,0xde, +0xb6,0xdf,0x96,0xfe,0xb6,0xff,0xe0,0x1, 0x96,0x9e,0xe0,0x1, 0xb6,0x9f,0x8e,0x8e, +0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, 0xb6,0xdf, +0x8f,0x2e,0xe0,0x1, 0xb7,0x7f,0x9f,0x1f,0xe0,0x40,0xcf,0x0, 0xb7,0x1f,0xdd,0xbb, +0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x1, +0x1f,0xde,0x3f,0x68,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0x8f,0xe0,0x40, +0xce,0x80,0xbe,0x92,0x16,0x0, 0x96,0xd8,0x34,0xa8,0xb6,0xdf,0x3d,0x49,0x96,0xf8, +0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9f,0x8e,0x88,0x8d,0x98,0x36,0xa8, +0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xa8,0x14,0x30,0xe0,0x9, 0xb6,0xdf,0xe0,0x7, +0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8f,0x3e,0xe0,0x7, 0x9e,0x9f, +0x37,0x2e,0x3f,0x4d,0xe0,0x7, 0xb7,0x1f,0xe0,0x1, 0xb6,0x7f,0xe0,0x2, 0xb5,0x1f, +0xe0,0x1, 0x9f,0x7f,0xe0,0x1, 0xcf,0x3, 0xe0,0x1, 0xb7,0x7f,0xe0,0x1, 0xb6,0x3f, +0xb6,0x1f,0xdd,0x79,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0x3f,0x68,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92, +0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0x15,0x80,0x96,0xd8,0xb6,0xdf,0x96,0xf8, +0xb6,0xff,0xe0,0x1, 0x96,0x98,0x14,0x30,0xe0,0x1, 0xb6,0x9f,0x8e,0x8e,0x8e,0x1e, +0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, 0xb6,0xdf,0xe0,0x7, +0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8e,0xbe,0xe0,0x7, 0x9e,0x1f, +0x36,0xae,0x3e,0xcc,0xe0,0x7, 0xb6,0x9f,0xe0,0x1, 0xb5,0xff,0xe0,0x2, 0xb4,0x9f, +0xe0,0x1, 0x9e,0xff,0xe0,0x1, 0xce,0x83,0xe0,0x1, 0xb6,0xff,0xe0,0x1, 0xb5,0xbf, +0xe0,0x2, 0x8f,0x7e,0x9e,0x9f,0x37,0x2a,0x3f,0x4d,0xb7,0x1f,0xdd,0x34,0xa7,0x12, +0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xde, +0x3f,0x68,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80, +0xbe,0x92,0x14,0x0, 0x96,0xde,0xb6,0xdf,0xe0,0x1, 0x96,0x9e,0xe0,0x1, 0xb6,0x9f, +0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, +0xb6,0xdf,0xe0,0x1, 0xb4,0xff,0xe0,0x2, 0xb5,0x1f,0xe0,0x2, 0x8e,0x7e,0xe0,0x2, +0x8e,0xee,0x8f,0x3e,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0x28,0x3f,0x4d,0xb7,0x1f, +0x9f,0x1f,0xe1,0x0, 0xcf,0x0, 0xb7,0x1f,0xdc,0xfe,0xa7,0x12,0xe7,0xbf,0x17,0xff, +0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0xa1,0xf, 0xe0,0x2, +0x1f,0xc2,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xd8, +0xb6,0xde,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28,0xe0,0x1, 0xb6,0x9e,0x8e,0x8f, +0x8e,0x1f,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xaf,0xe0,0x9, 0xb6,0xde, +0xe0,0x2, 0x8e,0x7f,0xe0,0x2, 0x8e,0xef,0x8f,0xbf,0x36,0x2a,0x36,0xa9,0x3e,0xcc, +0x37,0xa8,0x3f,0xcd,0xb7,0x9e,0x9f,0x9e,0xe1,0x0, 0xcf,0x80,0xb7,0x9e,0xdc,0xcb, +0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x1, +0x1f,0xde,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80, +0xbe,0x92,0x3f,0xe8,0x96,0xdf,0x14,0x30,0xb6,0xde,0x96,0xff,0xb6,0xfe,0xe0,0x1, +0x96,0x9f,0xe0,0x1, 0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x3e,0x9c,0xe0,0x1, +0xb6,0xde,0x96,0xaf,0xe0,0x9, 0xb6,0xde,0xe0,0x2, 0x8e,0x7f,0xe0,0x2, 0x8e,0xef, +0x8f,0xbf,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0xa8,0x3f,0xcd,0xb7,0x9e,0x9f,0x9e, +0xe1,0x0, 0xcf,0x80,0xb7,0x9e,0xdc,0x97,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0x8, 0xb3,0xe0,0x1, 0x1f,0xde,0x3f,0x68,0xa1,0x8f,0xe0,0x2, +0x1f,0xc2,0xe0,0x0, 0x14,0x40,0xa1,0xf, 0xa7,0x93,0xe0,0x40,0xcf,0x80,0xbf,0x93, +0x97,0xde,0xb7,0xd2,0x8f,0x8e,0x8e,0x9e,0x37,0xa8,0x97,0x2e,0x3f,0x9d,0xe0,0x1, +0xb7,0xd2,0x17,0x80,0xe0,0x9, 0xb7,0x52,0xe0,0x1, 0xb5,0x72,0xe0,0x2, 0xb4,0x92, +0xb7,0x92,0x9f,0x92,0xe1,0x0, 0xcf,0x80,0xb7,0x92,0xdc,0x6d,0xe0,0x7, 0x9c,0x32, +0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1,0x8, 0xb3,0xe0,0x1, +0x1f,0xde,0x16,0x80,0xa1,0x8f,0xe0,0x2, 0x1f,0xc2,0xa7,0x13,0xa1,0xf, 0xe0,0x40, +0xcf,0x0, 0xbf,0x13,0x3f,0xe8,0x97,0x58,0xb7,0x52,0x97,0x78,0xb7,0x72,0xe0,0x1, +0x97,0x18,0x14,0x0, 0xe0,0x1, 0xb7,0x12,0xe0,0x0, 0x1f,0x12,0xae,0x8e,0x8f,0xf, +0x8e,0x9f,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f,0xe0,0x1, 0xb7,0x72, +0x97,0x2f,0xe0,0x9, 0xb7,0x52,0x87,0xbf,0xe2,0x0, 0xc7,0x81,0xe4,0xf, 0x37,0xa8, +0xe4,0xf, 0x37,0xc0,0xb7,0x92,0xdc,0x37,0xe0,0x6, 0x9c,0x72,0xa7,0x13,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1,0x8, 0xb3,0xe0,0x1, 0x1f,0xde,0xe2,0x0, +0xc5,0x3, 0xa1,0x8f,0xa7,0x93,0xe0,0x40,0xcf,0x80,0xbf,0x93,0xe0,0x2, 0x1f,0xc2, +0xa1,0xf, 0x2d,0x17,0xe0,0x9, 0xb5,0x52,0x35,0xaa,0xb4,0x52,0x35,0x28,0xe0,0x1, +0xb4,0xd2,0xe0,0x1, 0x14,0x10,0xb5,0x92,0x9f,0x92,0x3d,0x4f,0xb5,0x12,0xdc,0x13, +0xe0,0x5, 0x9c,0x52,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1, +0x17,0x82,0xe0,0x9, 0xb7,0xd2,0x0, 0xe9,0xe0,0x1, 0x1f,0xde,0x34,0xa3,0xa6,0xf, +0xe0,0x2, 0x1f,0xc2,0xf0,0x0, 0x1b,0x92,0xa7,0xf, 0xa7,0x9c,0xa6,0x9c,0xe0,0x40, +0xce,0x80,0xbe,0x9c,0x96,0xd8,0xe8,0x0, 0x8d,0x7, 0xe0,0x8, 0xb6,0xfe,0x96,0xf8, +0xe0,0x9, 0xb6,0x9e,0xe0,0x1, 0x96,0x98,0xe0,0x9, 0xb6,0xbe,0x8e,0xc8,0x8d,0xd8, +0x36,0xa8,0x3e,0x9b,0xe0,0x8, 0xb6,0xbe,0xe0,0xd, 0x37,0xcd,0x8f,0xe8,0x8d,0xf8, +0x37,0xa8,0xe0,0x1, 0x94,0x28,0x3f,0x9b,0xe0,0x8, 0xb7,0xde,0xe2,0x0, 0xc6,0x81, +0xe0,0x9, 0xb4,0x5e,0x15,0x80,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe,0xc7,0x80,0xe0,0x7, +0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0x3c,0xcf,0xe0,0x7, 0xb4,0x9e,0xe0,0x7, 0x9f,0x9e, +0xcf,0x90,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xcf,0x81,0xe0,0x7, 0xb7,0x9e, +0x0, 0x86,0xe0,0x7, 0x9f,0x9e,0xe2,0x0, 0xc7,0xa0,0x2f,0x9a,0xe0,0x7, 0x9f,0x9e, +0xe2,0x1, 0xc7,0x80,0x27,0xf7,0x2d,0x9c,0xe0,0x7, 0x9f,0x9e,0x36,0xad,0xcf,0x84, +0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe,0xc7,0x80,0xe0,0x7, 0xb7,0x9e, +0xe7,0xbf,0x17,0xff,0xa7,0x1c,0x3f,0xde,0x3f,0xcd,0xbf,0x9c,0x38,0x82,0xe0,0x7, +0x9f,0x9e,0x15,0x1, 0xcf,0x82,0xe0,0x7, 0xb7,0x9e,0x3d,0xea,0x0, 0xe0,0xe8,0x0, +0xad,0x7, 0x0, 0xe3,0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2, +0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xd8,0xb6,0xde, +0x96,0xf8,0xb6,0xfe,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28,0xe0,0x1, 0xb6,0x9e, +0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x97,0xaf,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0xe0,0x9, +0xb7,0xde,0x17,0x80,0xb7,0x9e,0xdb,0x77,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0xe0,0x1, 0x1f,0xb1,0x14,0x3, 0xa7,0xf, 0xe0,0x1, 0xa7,0x8e, +0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x2f,0x82,0x38,0x82,0xe0,0x1, 0xa4,0xe, 0x34,0x49, +0xe2,0x0, 0xc4,0x1, 0x38,0x82,0xe0,0x2, 0x1f,0xb1,0xa7,0xf, 0xe0,0x1, 0x1f,0xb1, +0xa6,0x8f,0x17,0x80,0xe0,0x1, 0xaf,0xbe,0xa7,0x9e,0xe2,0x0, 0xc7,0x81,0x27,0xfd, +0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa6,0x9e,0x17,0xfe, +0x3f,0xdd,0xbf,0x9e,0xe0,0x1, 0x8c,0x3e,0x38,0x82,0xe0,0x2, 0x1f,0xb1,0xa7,0xf, +0xe0,0x1, 0x1f,0xb1,0xe0,0x1, 0xac,0x3e,0xa6,0x8f,0xa7,0x9e,0xe2,0x0, 0xc7,0x81, +0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa6,0x9e, +0x17,0xfe,0x3f,0xdd,0xbf,0x9e,0x38,0x82,0x24,0xa6,0x17,0xff,0xe0,0x2, 0x1f,0x31, +0xe0,0x1, 0x1e,0xb1,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f,0xa7,0xe, 0xa6,0x8d, +0x3e,0x18,0xe0,0xb, 0x3c,0x1f,0x14,0x80,0x15,0x7e,0xe0,0x1, 0xac,0xbe,0xa7,0x9e, +0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0xf7,0xa7,0x9e,0x3f,0xda,0xbf,0x9e,0xe0,0x1, 0x8f,0xbe,0xe0,0x80,0xaf,0x9c, +0x3e,0x7b,0x1, 0xec,0x38,0x82,0x24,0xa3,0x17,0xff,0xe0,0x2, 0x1f,0x31,0xe0,0x1, +0x1e,0xb1,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f,0xa7,0xe, 0xa6,0x8d,0x3e,0x18, +0xe0,0xb, 0x3c,0x1f,0x15,0x7e,0xe0,0x80,0x87,0x9c,0xe0,0x1, 0xaf,0xbe,0xa7,0x9e, +0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0xf7,0xa7,0x9e,0x3e,0x7b,0x3f,0xda,0xbf,0x9e,0x1, 0xee,0x38,0x82,0xe0,0x2, +0x1f,0xb1,0x17,0x1, 0xa7,0x8f,0x3f,0x58,0xa5,0xbf,0x16,0xfb,0xe0,0xc, 0x37,0x22, +0x3e,0xdb,0x3e,0xcc,0xbe,0xbf,0x15,0xef,0xa6,0xbf,0xe0,0xc, 0x37,0x24,0x3e,0xdb, +0x3e,0xcc,0xbe,0xbf,0x16,0xf7,0xa5,0xf, 0xe0,0xc, 0x37,0x23,0x3e,0xda,0x3e,0xcc, +0xbe,0x8f,0x16,0xfe,0xa6,0x3f,0x3e,0xdc,0x3f,0x4d,0xbf,0x3f,0xe0,0x2, 0x1f,0x28, +0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0xc, 0x2f,0xa, 0xa6,0x8f,0xe0,0x2e,0x3c,0xe, +0xe0,0x8, 0x37,0x24,0xe0,0xe, 0x3e,0xdb,0x3f,0x48,0xbf,0xf, 0x38,0x82,0xa7,0xf, +0xcf,0x40,0xbf,0xf, 0x24,0x7, 0xa6,0x8f,0xe7,0xfe,0x17,0x7f,0x3f,0x5d,0xbf,0xf, +0x38,0x82,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe7,0xff,0x17,0x3f,0xa6,0x8f, +0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x31,0x97,0x88,0xa6,0x8e,0xe2,0xff, +0xc7,0xff,0xe0,0x1, 0xb7,0x9d,0x97,0x98,0xe2,0x7f,0xc7,0xff,0xe0,0x1, 0xb7,0xbd, +0x17,0xf7,0x9f,0x8, 0xa6,0x3d,0x37,0x4f,0x37,0x23,0x3f,0xdc,0x3f,0xce,0xbf,0xbd, +0x17,0xfc,0x9f,0x18,0xa6,0x6d,0x37,0x4e,0x3f,0xdc,0x3f,0xce,0xbf,0xed,0x38,0x82, +0xe0,0x1, 0x1e,0xe1,0xe0,0x2, 0x1f,0x31,0x87,0xcd,0xa7,0xe, 0xcf,0x82,0xaf,0xcd, +0xa7,0xbe,0xcf,0x82,0xbf,0xbe,0x38,0x82,0xe0,0x1, 0x1f,0x61,0x9f,0xae,0x37,0xc9, +0xe2,0x0, 0xc7,0x81,0x2f,0xfc,0x38,0x82,0x8, 0xb5,0xc0,0x68,0xe0,0x2, 0x1f,0xc3, +0x15,0x80,0x95,0x3f,0xe0,0x2, 0x1f,0xbf,0x3e,0x6a,0xe3,0xff,0xc6,0x7f,0xf0,0x0, +0x8b,0x4f,0xf0,0x0, 0x8b,0xdf,0xe0,0x2, 0x1f,0xb7,0xe4,0x3, 0x36,0x22,0x7d,0x81, +0xe4,0x3, 0x31,0xc0,0x7d,0x82,0x7d,0x83,0x7d,0x84,0x7d,0x85,0x7d,0x86,0x99,0xf, +0x24,0x39,0xe2,0x0, 0xcc,0x1, 0x1, 0x3, 0xc0,0x18,0xa, 0xe1,0xf0,0x0, 0x23,0x73, +0x14,0xff,0xe0,0x1, 0x1f,0xd0,0xe8,0x9, 0x3c,0x97,0xa4,0xf, 0xe2,0x1, 0xc4,0xff, +0x34,0xa1,0xf0,0x4, 0x33,0xa1,0x3d,0x68,0xe0,0x0, 0xc4,0x82,0xf0,0x0, 0x23,0x8b, +0xe0,0xd, 0x3c,0x9a,0x3f,0xea,0x97,0xf, 0x3f,0x1c,0xe1,0x80,0xb7,0x1f,0x3e,0xff, +0x1, 0xfb,0xc5,0x81,0xe2,0x1, 0xc5,0xff,0xf0,0x40,0x3b,0x7b,0x3d,0x14,0x1, 0xef, +0x16,0x8c,0x3e,0x92,0xe3,0xff,0xc6,0xff,0xe0,0xf, 0x31,0x21,0x3f,0x98,0x97,0xf, +0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0x3f,0x13,0x39,0x7d,0xb7,0xf, 0x1, 0xf6,0xc0,0x18, +0xa, 0xe1,0xe0,0x1, 0x1a,0xd0,0xe0,0x1, 0x1f,0x39,0xa7,0x85,0xe2,0x1, 0xc5,0x7f, +0xe9,0xff,0xc7,0xfe,0x37,0xc1,0x3c,0xea,0x37,0x41,0xe2,0x0, 0x7c,0x4, 0xf0,0x0, +0x6b,0x85,0xe0,0x43,0x3a,0x13,0xf0,0x0, 0x6b,0x4, 0x7f,0x3, 0x7f,0x84,0x7f,0x85, +0xdc,0x4e,0x15,0x8c,0x3d,0x92,0xa6,0x5, 0xe0,0x1, 0x1d,0x4d,0xe3,0xff,0xc5,0xff, +0xe0,0x41,0x3c,0xc4,0x0, 0x8a,0x97,0xf, 0x3f,0x13,0xb7,0xf, 0xc1,0x1, 0xe3,0xff, +0xc1,0x7f,0x39,0x7b,0xe7,0xff,0x1, 0x22,0xe0,0x6, 0x17,0xa8,0x3f,0x92,0x37,0xa1, +0x3f,0x9a,0x96,0x9f,0xe0,0xe, 0x31,0x21,0x3a,0x7d,0x3f,0xee,0x3f,0x9c,0x4, 0x6c, +0x3e,0xf9,0xe0,0xf, 0x31,0x21,0x3f,0x9c,0x3, 0x6a,0x97,0xf, 0x3f,0x23,0xb7,0xf, +0x0, 0xe6,0xe0,0x1, 0x1f,0xd0,0xa4,0xf, 0xe7,0xff,0x0, 0xac,0x8, 0xb7,0xf8,0x0, +0xc, 0x3a,0xe0,0x2, 0x1f,0xa8,0xe0,0x2, 0x1e,0xbf,0x87,0xf, 0x39,0xeb,0xe0,0x3, +0x8e,0x2d,0x15,0x8e,0x3d,0xb3,0xe0,0x2, 0x1f,0xe9,0xe2,0x0, 0xc7,0x1, 0x3e,0x7e, +0x3f,0x9b,0x3a,0x68,0x3a,0xe9,0x3b,0x6a,0x8b,0x9f,0xf0,0x0, 0x8d,0x3f,0xe0,0x1, +0x1, 0x3b,0x99,0x5d,0x3c,0x63,0xef,0xfa,0xde,0xe8,0xf0,0x40,0x3c,0x68,0xef,0xf9, +0xda,0xa7,0xe0,0xc, 0x15,0x52,0x14,0x80,0x3c,0x64,0xe0,0x1, 0xd5,0x77,0xf0,0x1, +0x2c,0x23,0xe8,0x7, 0x3b,0xca,0xe0,0x0, 0x2b,0xec,0xe0,0x2, 0x1f,0xf3,0xe0,0x1, +0x1e,0xdf,0xa7,0x8f,0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, +0xc7,0x40,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0xc1,0x5, 0xf0,0x0, 0x14,0x80,0x3c,0xe3, +0xe8,0x40,0x3c,0x69,0xef,0xf9,0xdb,0x2e,0x24,0x7b,0xe0,0x1, 0x1d,0xcc,0x17,0x80, +0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3a,0x1e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81, +0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0x14,0x1, 0xef,0xf9, +0xda,0xc0,0xf0,0x0, 0x24,0x27,0xe0,0x1, 0x1d,0xcb,0x17,0x80,0xe0,0xe, 0x37,0xa1, +0xe0,0xd, 0x3a,0x9e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0xe0,0x2, 0x19,0x6d,0xe4,0x0, 0xc1,0x85, +0x3c,0x64,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0xef,0xf9,0xdb,0xca,0x2b,0x95,0x39,0x13, +0x8c,0xc2,0x3c,0x65,0xef,0xf9,0xdb,0xc4,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1, +0xe0,0x2, 0x19,0x6d,0xe4,0x0, 0xc1,0x85,0x3c,0x64,0xe0,0xf, 0x39,0x13,0x8c,0xcf, +0xef,0xf9,0xdb,0xb6,0x23,0xf2,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0x3c,0x66,0xef,0xf9, +0xdb,0xaf,0xf7,0xff,0x2c,0x66,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0xe0,0xc, +0x15,0x52,0x14,0x80,0x3c,0x66,0xe0,0x1, 0xd5,0x1, 0xe0,0x2, 0x1f,0xf3,0xe0,0x1, +0x1e,0xdf,0xa7,0x8f,0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, +0xc7,0x40,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0xf0,0x0, 0x14,0x84,0xf7,0xff,0x25,0xe, +0x3c,0xe3,0xe8,0x40,0x3c,0x69,0xef,0xf9,0xda,0xbd,0x24,0x7b,0xe0,0x1, 0x1d,0xca, +0xc1,0x5, 0x17,0x80,0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3b,0x1e,0x3f,0x1b,0x9f,0xe, +0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73, +0xe7,0xfe,0x0, 0xf5,0xe0,0xc, 0x15,0x52,0x14,0x80,0x3c,0x65,0xe0,0x1, 0xd4,0xce, +0xe7,0xfe,0x0, 0xd9,0x99,0x6d,0xe7,0xfe,0x0, 0xc7,0xe0,0x1, 0x1f,0xd0,0xe0,0x1, +0x1d,0x3e,0xa4,0x8f,0x3c,0x69,0xe7,0x65,0x0, 0x90,0xe0,0x2, 0x1f,0xb7,0xe0,0x1, +0x1f,0x50,0x9f,0x8f,0x15,0xc, 0x3d,0x1f,0xa5,0x8e,0xe0,0x1, 0x1c,0xcd,0xf0,0x2, +0x1b,0xba,0xe3,0xff,0xc5,0x7f,0xe0,0xd, 0x37,0xa1,0x14,0x7, 0xe0,0x6, 0x17,0x28, +0x3f,0x1f,0x37,0x21,0xe0,0xc, 0x3d,0x9d,0x3f,0x19,0x96,0x8c,0x97,0x1e,0xc7,0x81, +0xe3,0xff,0xc7,0xff,0x3f,0x1d,0xe0,0xd, 0x37,0xa1,0xb7,0xc, 0xe0,0xe, 0x3d,0x9d, +0x9f,0xe, 0xe2,0x1f,0xcf,0x1f,0x2, 0x83,0xe8,0x0, 0xac,0x7, 0x3f,0xfa,0x1, 0xe7, +0x38,0x82,0x0, 0x0, 0xe0,0x0, 0x1f,0x8b,0xf0,0x40,0x3a,0x68,0xf0,0x0, 0x88,0x8f, +0xe0,0x1, 0x14,0x7f,0xf0,0x0, 0x20,0xe5,0xf0,0x0, 0x1b,0xe, 0xf0,0x40,0x3a,0xe8, +0x17,0x0, 0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0x11,0x82,0xf0,0x0, 0x10,0x3, 0x0, 0x9e, +0xf1,0x2c,0x39,0xad,0xe0,0x0, 0x26,0x43,0xf0,0x0, 0x12,0x82,0xe8,0x40,0x3e,0xe5, +0x3f,0xe8,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe8,0x40,0x3e,0x65, +0x5, 0x82,0x3e,0x68,0x3c,0x6c,0xe2,0x1, 0xc4,0x7f,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f, +0xe8,0x40,0x3f,0x71,0xf0,0x0, 0xc3,0x2, 0x1, 0x38,0x3d,0x7e,0x1, 0x77,0xe8,0x0, +0x8e,0x86,0xe8,0x0, 0x8e,0x16,0xf0,0xf, 0x3a,0x2d,0xe2,0x0, 0xcf,0x80,0xe8,0x17, +0x3e,0xa4,0xf2,0x1, 0xc3,0xff,0xe0,0xd, 0x3c,0xac,0xe2,0x1, 0xc7,0xff,0xe8,0x6f, +0x3d,0x27,0x3e,0x29,0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc6,0x7f,0xe2,0x1, 0xc6,0xff, +0xf1,0x37,0x39,0x2f,0xe0,0x6d,0x3d,0x2c,0xf0,0x0, 0x23,0x85,0xf1,0x2c,0x39,0x2d, +0x2e,0x15,0xf1,0x2c,0x39,0xaf,0xe7,0xff,0x2e,0x3d,0x25,0xc1,0xf1,0x2f,0x38,0x2f, +0xe7,0xff,0x27,0xbe,0xf0,0x40,0x38,0x7d,0xe8,0x40,0x3f,0xe0,0xe8,0x6f,0x3c,0xa5, +0xf0,0x40,0x3a,0xef,0xe7,0xff,0x0, 0xb4,0x38,0x82,0x14,0x1, 0x38,0x82,0x38,0x82, +0x3d,0x78,0x5, 0x88,0xc4,0x1, 0x3c,0x1a,0x17,0x80,0xe2,0x1, 0xc4,0x7f,0xaf,0x8b, +0x38,0x82,0x17,0xff,0x3f,0x99,0x3f,0xaa,0x3c,0x7f,0x5, 0xb, 0xe0,0xf, 0x3d,0x28, +0x3c,0x9f,0xe0,0xa, 0x3c,0x2a,0x3c,0x69,0xe2,0x1, 0xc4,0x7f,0xad,0xb, 0x38,0x82, +0xe0,0x9, 0x35,0x21,0xc4,0x81,0xe0,0xa, 0x3c,0x2a,0x3c,0x69,0xe2,0x1, 0xc4,0x7f, +0xad,0xb, 0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0x34,0xf0,0x40, +0x3e,0x6a,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1d,0xe, 0xe4,0x0, 0xc5,0x8a,0x3e,0xea, +0x3e,0x9b,0x3f,0x9a,0x16,0x0, 0xe0,0x2, 0x1f,0x3f,0xe0,0x10,0xae,0x1d,0xf0,0x40, +0x3c,0xe8,0xe0,0x10,0xae,0x2d,0xe8,0x40,0x3c,0x6c,0x8e,0xf, 0x8f,0x9f,0x89,0x4e, +0x89,0xde,0x7d,0x8f,0xf0,0x40,0x3f,0x69,0x7e,0xa, 0x7f,0x88,0xef,0xfd,0xd0,0xe7, +0x14,0x83,0xe0,0x1, 0xd1,0x69,0xe0,0x1, 0x1e,0xad,0xe0,0x43,0x3c,0x18,0xe0,0x1, +0x93,0xbd,0x67,0xa, 0x3b,0xf8,0xe0,0x67,0x3c,0x28,0xe8,0x40,0x3f,0x79,0xe0,0x3, +0x3, 0x82,0x17,0x81,0x66,0xa, 0xe8,0xf, 0x3f,0x99,0x3f,0x9c,0x17,0x0, 0xe2,0x1, +0xc7,0xff,0x3b,0x6e,0x66,0x8, 0xe8,0x40,0x3e,0x7e,0xe0,0x2, 0x3, 0xe2,0x66,0x8, +0x16,0x81,0xe8,0xd, 0x3e,0x9e,0x3e,0x9c,0x16,0x0, 0xe2,0x1, 0xc6,0xff,0x7e,0x9, +0x3e,0x1e,0xe0,0x1, 0x1a,0x51,0x36,0x21,0xa7,0x4, 0xe0,0xa, 0x3f,0x96,0x3f,0x1c, +0xe0,0x1, 0x1e,0x2d,0xe9,0xff,0xc7,0x7e,0x85,0x9c,0x37,0x41,0xe0,0x1, 0x1e,0x47, +0x61,0x9, 0x7f,0x12,0x36,0x41,0x67,0x9, 0xe2,0x1, 0xc5,0x7f,0xe0,0x0, 0x6f,0xc3, +0xe2,0x0, 0x7c,0x40,0x17,0x80,0x39,0x1d,0xe0,0x0, 0x6f,0x40,0xe2,0x1, 0xc1,0x7f, +0xe0,0x0, 0x6e,0xc2,0xe0,0x0, 0x6f,0xc5,0x7d,0xb, 0x7e,0x13,0xe0,0x0, 0x6b,0x41, +0xe0,0x0, 0x6d,0xc4,0xd8,0x9d,0xe0,0x1, 0x1f,0xc4,0xf0,0x0, 0x9c,0xf, 0xe0,0x1, +0x1f,0xb8,0xf4,0x18,0x34,0x20,0xf0,0x0, 0x9d,0x8f,0xe0,0x1, 0x1f,0xb7,0xf4,0x1b, +0x35,0xa0,0xf0,0x0, 0x9d,0xf, 0xe0,0x1, 0x1f,0xb6,0xf4,0x1a,0x35,0x20,0x9e,0x8f, +0xe0,0x1, 0x1f,0xb5,0xf0,0x18,0x3c,0x1d,0x9f,0xf, 0xe0,0x1, 0x1f,0xb4,0xf0,0x1b, +0x3d,0x9e,0x9f,0x8f,0x16,0x80,0xf0,0x1a,0x3d,0x1f,0x67,0x8b,0x3f,0xf6,0xe0,0x1, +0x5, 0xc3,0xe0,0xf, 0x3b,0x33,0x66,0x89,0xa5,0x84,0x3f,0x9d,0x66,0x8a,0x37,0xa1, +0xe0,0xc, 0x3b,0x2d,0xe3,0xff,0xc6,0x7f,0x3d,0x9f,0x7e,0x7, 0x17,0x2, 0x66,0x9, +0x67,0x88,0xe0,0x1, 0x1d,0x2d,0x3e,0x2f,0x7e,0xd, 0x31,0xa1,0x66,0x9, 0xf1,0x39, +0x3c,0x9e,0x79,0x8c,0xe4,0xc, 0x36,0x28,0xe4,0x3, 0x33,0x28,0xf1,0x2e,0x3f,0x1e, +0x8a,0x9a,0x16,0x80,0x7d,0x86,0x3a,0x63,0x7e,0xe, 0xf0,0x0, 0x7c,0x82,0x7f,0x5, +0xe4,0x4, 0x32,0x48,0x67,0x9, 0x39,0x7e,0xe0,0x1, 0x5, 0x84,0xf0,0x0, 0x67,0x6, +0x67,0x87,0x67,0xd, 0x66,0xa, 0xf0,0x0, 0x66,0x89,0xe3,0xff,0xc7,0x7f,0xe0,0x43, +0x39,0x9f,0xe0,0xc, 0x3b,0x2c,0xe8,0x40,0x3f,0xee,0x64,0x8e,0xf8,0x40,0x3f,0x6d, +0x7e,0x3, 0xf0,0x40,0x3c,0xee,0x7b,0x4, 0xf0,0x40,0x3e,0xef,0x0, 0xbe,0x66,0x3, +0xe2,0x0, 0xce,0x1, 0xe0,0x0, 0x5, 0x53,0x67,0x82,0xe0,0x0, 0x27,0xdf,0x66,0x5, +0x15,0x81,0xe0,0x0, 0x26,0x5b,0xe8,0x40,0x3d,0x6c,0x3c,0x64,0x7e,0x81,0xde,0x7b, +0x15,0x7e,0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0xb, 0x33,0x1, 0xe2,0x0, 0xcd,0x1, +0xc4,0x7f,0xe0,0x43,0x3d,0x9b,0xe2,0x1, 0xc4,0x7f,0xe0,0x66,0x3d,0xab,0xe2,0x0, +0xcc,0x2, 0x66,0x81,0x2, 0x8b,0x65,0x4, 0xe8,0xb, 0x3b,0x3e,0x3d,0x36,0xf0,0x1a, +0x3d,0x2b,0xf0,0x1b,0x3d,0xaa,0xf0,0x18,0x3c,0x26,0xf0,0x0, 0xc7,0x1, 0xf4,0x9, +0x37,0x28,0x17,0x1, 0xe4,0xf, 0x34,0xc8,0xe8,0xe, 0x3f,0x19,0x39,0x7f,0xf0,0x40, +0x3c,0xee,0xf3,0xff,0xc4,0xff,0x5, 0xac,0xe9,0x80,0x97,0x9d,0xe4,0x9, 0x34,0xc8, +0x3f,0xa5,0xe0,0x43,0x3b,0x1f,0xe2,0x0, 0xcb,0x0, 0x5, 0x68,0x15,0x81,0x3d,0x9d, +0x3b,0xf6,0xe2,0x1, 0xc5,0xff,0xe0,0x6d,0x3d,0x2b,0xe2,0x0, 0xc9,0x80,0xe7,0xff, +0x2, 0x30,0xe3,0xff,0xc9,0xff,0xe7,0xff,0x4, 0x31,0xe8,0x43,0x3d,0x99,0xe2,0x0, +0xcd,0x80,0xe0,0x0, 0x5, 0x60,0x67,0x8, 0xf0,0xb, 0x3f,0x2e,0xe2,0x0, 0xcd,0x81, +0x5, 0x4d,0x67,0x82,0xe7,0xff,0x2f,0xa5,0x15,0x80,0xe7,0xff,0x0, 0xa6,0x63,0x4, +0x66,0x6, 0x65,0xc, 0x67,0x7, 0x3e,0x1a,0xc3,0x1, 0xe4,0x4, 0x33,0x28,0x7e,0x6, +0xc7,0x1, 0x66,0xb, 0xe4,0xf, 0x32,0x48,0xe3,0xff,0xc7,0x7f,0x3e,0x7f,0x7f,0x7, +0xe7,0xfe,0x2, 0xe8,0xf2,0x0, 0xcc,0x0, 0x17,0x81,0xe8,0x6f,0x39,0xa8,0x3c,0xef, +0xf0,0x8, 0x35,0xa6,0xf0,0x40,0x3c,0x6f,0x7e,0x81,0xe0,0x1, 0xd0,0x69,0x67,0xf, +0xe0,0x0, 0x19,0xe, 0xc4,0x20,0x39,0x1e,0xe0,0x7, 0xb4,0x62,0xe8,0x40,0x3c,0xe8, +0xf0,0x8, 0x35,0x26,0xe0,0x1, 0xd0,0x5c,0xe0,0x1, 0x1d,0x2d,0x66,0xa, 0xe0,0x2, +0x8f,0xda,0x67,0x8, 0xf0,0x18,0x34,0x5f,0xf2,0x0, 0xcc,0x7f,0xe0,0x0, 0x17,0xff, +0xe8,0x6f,0x3d,0xa8,0xe0,0x10,0xaf,0x92,0xc4,0x20,0x66,0x81,0xe0,0x7, 0xb4,0x72, +0xe2,0x0, 0xce,0xad,0xe0,0x10,0xae,0xa2,0xe0,0x10,0xae,0x32,0xe0,0x10,0xaf,0x42, +0x5, 0x84,0x17,0xad,0xe0,0x10,0xaf,0xa2,0xe0,0x0, 0xc0,0x4c,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe3,0xff,0xcd,0xff,0xe7,0xfe,0x3, 0x72,0xe7,0xfe,0x0, 0xc7,0x16,0xff, +0x3e,0x93,0xe8,0xd, 0x3e,0xae,0x3e,0x7d,0x2, 0x30,0xf0,0xd, 0x37,0x21,0xe8,0xc, +0x3e,0x2e,0xc6,0x81,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, 0xc6,0xff,0xe7,0xfd, +0x0, 0x99,0x17,0xff,0x3f,0x92,0xe8,0xf, 0x3f,0xa9,0x3f,0x7f,0x2, 0xf, 0x3b,0x6e, +0xf0,0xf, 0x34,0xa1,0xe8,0x6, 0x3b,0x29,0xc7,0x81,0xe2,0x1, 0xc3,0x7f,0xe2,0x1, +0xc7,0xff,0xe0,0xe, 0x3b,0x33,0xe7,0xfc,0x0, 0xf7,0x63,0xa, 0x66,0x8a,0xe8,0x6, +0x3b,0x29,0xe8,0xf, 0x39,0x19,0xe2,0x1, 0xc3,0x7f,0x3f,0xad,0xe0,0xe, 0x3b,0x33, +0xe2,0x1, 0xc7,0xff,0xe7,0xfc,0x0, 0xe8,0x66,0x8, 0x65,0x8, 0xe8,0xd, 0x39,0x9e, +0xe8,0xc, 0x3e,0x2e,0x3e,0xaa,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, 0xc6,0xff, +0xe7,0xfc,0x0, 0xe8,0xe0,0x1, 0x1f,0x1d,0xe0,0x0, 0x1f,0x8e,0x34,0x21,0x8f,0xe, +0x3c,0x1f,0x8e,0x98,0x27,0x10,0xe0,0x2, 0x1f,0x3f,0x8f,0x4e,0xe4,0x0, 0xc4,0x8a, +0x36,0xa6,0x37,0x26,0x3f,0x99,0xc6,0xa0,0xc7,0x20,0xe0,0x7, 0xb6,0xef,0xe0,0x7, +0xb7,0x7f,0x38,0x82,0xe0,0x2, 0x1f,0x3f,0x8f,0x5e,0x0, 0xf1,0xe2,0x0, 0xcc,0x1, +0x1, 0x11,0x4, 0x9b,0xc4,0x7c,0xe2,0x0, 0xcc,0x1, 0x5, 0x8c,0xe0,0x1, 0x1f,0x4b, +0xe0,0x1, 0x1f,0xc3,0xbf,0xf, 0xe0,0x1, 0x1f,0x48,0xe0,0x1, 0x1f,0xd0,0xbf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0x4a,0xe0,0x1, 0x1f,0xc3,0xbf,0xf, 0xe0,0x1, 0x1f,0x49, +0xe0,0x1, 0x1f,0xd0,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x4c,0xe0,0x1, 0x1f,0xc3, +0xe2,0x0, 0xcc,0x82,0xbf,0xf, 0x1, 0x7, 0xe0,0x1, 0x1f,0x42,0xe0,0x1, 0x1f,0xd0, +0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x33,0xe0,0x1, 0x1f,0xd0,0xbf,0xf, 0x38,0x82, +0x8, 0xb5,0xe0,0x2, 0x19,0x3c,0x8f,0x82,0x2f,0xb6,0xe0,0x1, 0x19,0xc3,0xe0,0x1, +0x1a,0x51,0xa4,0x83,0xa4,0x4, 0xe0,0x1, 0x1a,0xd0,0xef,0xfa,0xdf,0xcd,0xe0,0x2, +0x1f,0xb7,0x14,0x8c,0x9f,0x8f,0xa5,0x4, 0x3c,0x9f,0xa5,0x83,0xa4,0x5, 0xe3,0xff, +0xc4,0xff,0x0, 0x88,0xc7,0x81,0x9e,0x8c,0xe3,0xff,0xc7,0xff,0x3f,0xf9,0xb6,0x8e, +0x1, 0x19,0x8e,0x82,0xe0,0xe, 0x37,0xa1,0xe2,0x0, 0xce,0x81,0xe0,0xc, 0x3d,0x9e, +0x3f,0x1a,0x1, 0xf1,0xe0,0xe, 0x37,0xa1,0x3e,0xec,0xe0,0xc, 0x3c,0x1e,0x9e,0x8d, +0x96,0xc, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1a,0x3e,0xac,0x3f,0xf9,0xb6,0x8e, +0x1, 0xe9,0xa, 0xe1,0xe0,0x1, 0x1a,0xd0,0xe0,0x1, 0x19,0xc3,0xe0,0x1, 0x1a,0x51, +0xa5,0x5, 0xa4,0x83,0xa4,0x4, 0x15,0x81,0xef,0xfa,0xdf,0x77,0x0, 0xc9,0x0, 0x0, +0x8, 0xb4,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0x97,0x17,0x0, 0x8d,0x8f,0xe0,0x0, +0x19,0xe, 0xe0,0xc, 0x35,0xc3,0x3f,0xee,0x3e,0xee,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0x3f,0x12,0x3f,0xfc,0xe0,0xf, 0xae,0x8e,0x3f,0x6f,0x5, 0x78,0xe0,0x1, 0x1e,0x2d, +0xe0,0x1, 0x1f,0xd1,0xe0,0x2, 0x1d,0x3f,0xf0,0x1, 0x93,0xc, 0xa7,0xf, 0xf0,0x0, +0x91,0xac,0xf0,0x0, 0x92,0x3c,0xf0,0x0, 0x92,0xfc,0xe0,0x2, 0x1e,0x7a,0xf0,0x0, +0x80,0xca,0xf0,0x0, 0x81,0x5a,0xe4,0x0, 0x17,0x80,0xe2,0x0, 0x7c,0xae,0xe0,0x1, +0x1d,0x47,0xf0,0x0, 0x83,0x8c,0xe0,0x0, 0x1a,0xb, 0xe0,0x0, 0x19,0x8a,0x3f,0x1f, +0x3f,0x99,0x16,0x0, 0x37,0x41,0x37,0xc1,0x35,0x41,0xc5,0xff,0xe2,0x0, 0x7c,0x84, +0xe2,0x0, 0x7c,0x14,0xae,0x84,0xae,0x83,0xe0,0x1a,0xb6,0x52,0xe0,0x1a,0xb6,0x62, +0xe0,0x1a,0xb6,0x72,0xe0,0x1b,0xb6,0x12,0x7f,0x6, 0x7f,0x88,0x7d,0x7, 0xf0,0x0, +0x73,0x15,0x6d,0x96,0xf0,0x0, 0x6b,0x97,0xf0,0x0, 0x68,0x95,0xf0,0x0, 0x69,0x14, +0xf0,0x0, 0x71,0x92,0xf0,0x0, 0x72,0x13,0xf0,0x0, 0x72,0x94,0xef,0xff,0xd5,0xe1, +0x55,0x7, 0x5f,0x8, 0xe0,0x1a,0xb5,0x72,0xe0,0xb, 0x37,0x48,0xe0,0x0, 0x1d,0x7, +0x5f,0x86,0xaf,0xa, 0xe0,0xd, 0x37,0xc8,0xe0,0x0, 0x1f,0x8, 0xf0,0x0, 0x4b,0x84, +0xad,0x8e,0xe0,0x0, 0x1f,0x5, 0x4c,0x5, 0xf0,0x0, 0x53,0x3, 0x54,0x84,0x56,0x5, +0xaf,0x8e,0xe0,0x0, 0x1f,0x84,0xf0,0x0, 0xab,0x84,0xac,0x3, 0xf0,0x1a,0xb3,0x52, +0xe0,0x1a,0xb4,0xe2,0xe0,0x1b,0xb6,0x12,0xae,0x8f,0xf0,0x0, 0x23,0xa5,0xe0,0x1, +0x1d,0x32,0xe0,0x0, 0x1e,0xe, 0x17,0x80,0xf0,0x0, 0x13,0x1, 0xe0,0xe, 0x37,0xc3, +0xe2,0x0, 0xc7,0x1f,0x3f,0x12,0x16,0x87,0xe0,0xf, 0x84,0x8e,0x3e,0xdf,0xe0,0x80, +0x9d,0x9a,0xf0,0xd, 0x33,0x3d,0x3e,0xc9,0xc7,0x81,0xe0,0xf, 0xae,0x8e,0xe2,0x1, +0xc7,0xff,0xe0,0xe, 0x35,0xc8,0xaf,0xc, 0xf0,0x40,0x3b,0xff,0xc6,0x2, 0xe0,0x40, +0xad,0x9c,0x1, 0xe5,0x24,0x19,0x15,0xff,0x3d,0x98,0xe2,0x1, 0xc5,0xff,0x35,0xa1, +0xe2,0x0, 0x7e,0xae,0xe0,0x0, 0x1f,0x8e,0xe2,0x0, 0x7f,0x2c,0xe0,0xb, 0x3d,0x9d, +0xe0,0x80,0x9e,0x9e,0xc7,0x82,0xe0,0xc, 0x36,0xc8,0x3d,0xfe,0xe0,0x7, 0xae,0x2f, +0xe0,0x7, 0xae,0xbf,0x1, 0xf6,0xe0,0x0, 0xc0,0x68,0xa, 0x61,0x8, 0xb1,0xe0,0x0, +0x1f,0x8c,0x17,0x0, 0xaf,0xf, 0xdf,0x35,0xe0,0x0, 0x1f,0x8b,0x8f,0xf, 0x27,0x12, +0xea,0x23,0x7e,0xa9,0x87,0x8d,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0xb2, +0x2, 0x96,0xaf,0x8d,0xe0,0x1, 0x1f,0xcf,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xb, +0x8, 0xe1,0xea,0x23,0x7f,0xa9,0xaf,0xf, 0xe0,0x1, 0x1f,0xcf,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0xf7,0xe0,0x0, 0x1f,0x83,0xaf,0xf, 0x8, 0xe1,0x17,0xb2,0x0, 0xea, +0xea,0x23,0x7f,0xb0,0xea,0x23,0x7f,0x34,0x97,0x8f,0x9e,0x8e,0xe4,0x8, 0x34,0x23, +0xe0,0xe, 0x3f,0xad,0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d, +0x3f,0xad,0xe0,0x41,0x3f,0x4e,0xe4,0x8, 0x34,0x40,0xe0,0x6f,0x3d,0x2e,0x3f,0xf8, +0x2, 0x17,0xea,0x23,0x7f,0xae,0xea,0x23,0x7f,0x32,0x97,0x8f,0x9e,0x8e,0xe0,0xe, +0x3f,0xad,0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d,0x3f,0xad, +0xe0,0x41,0x3f,0x4e,0xe0,0x6f,0x3d,0x2e,0xe0,0x28,0x3c,0x2f,0x38,0x82,0x14,0x0, +0x38,0x82,0xea,0x23,0x7f,0xac,0x17,0x0, 0xaf,0xf, 0x38,0x82,0xea,0x23,0x7c,0x36, +0xe7,0x5b,0x0, 0xa7,0x3f,0x82,0x8, 0xb6,0xea,0x23,0x79,0x2c,0xe0,0x2, 0x1f,0xa0, +0x8e,0x82,0xe0,0x2, 0x1f,0x21,0x8e,0xf, 0x26,0x8f,0xea,0x23,0x79,0xb6,0x9f,0x83, +0x27,0x85,0x17,0x81,0xe1,0x2f,0x3e,0x1f,0x27,0x96,0x14,0x0, 0x17,0x80,0xaf,0x82, +0x17,0x80,0xb7,0x83,0xb, 0x61,0xe0,0x2, 0x1f,0x9f,0xe2,0x0, 0xce,0x1, 0x8c,0xf, +0x1, 0x14,0xea,0x1a,0x7f,0xe4,0xe9,0xff,0xc7,0xff,0xe0,0xe, 0x36,0xa2,0x3f,0x9e, +0xa7,0x8f,0x3f,0x82,0xe0,0x2, 0x1d,0x9f,0xe2,0x0, 0xce,0x1, 0x8c,0xb, 0xe0,0x1, +0x1, 0xa5,0xe2,0x0, 0xce,0x84,0x1, 0x62,0xe0,0x0, 0x1f,0xe5,0xe0,0x6, 0x9a,0x2e, +0x8d,0x8f,0xe0,0x0, 0x1f,0xe4,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0x7f,0xe0,0x1, +0x5, 0x91,0xe0,0x0, 0x1f,0xe3,0x8d,0x8f,0xe0,0x0, 0x1f,0xe2,0x35,0xa8,0x8f,0x8f, +0x3f,0xcb,0x3a,0x7f,0xe0,0x1, 0x3, 0x86,0xe0,0x0, 0x1f,0xe1,0xe0,0x6, 0x9a,0xbe, +0x8d,0x8f,0xe0,0x0, 0x1f,0xe0,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0xff,0xe0,0x0, +0x5, 0xf9,0xe0,0x0, 0x1f,0xdf,0x8f,0xf, 0xe0,0x0, 0x1f,0xde,0x37,0x28,0x8f,0x8f, +0x3f,0xce,0x3a,0xff,0xe0,0x0, 0x3, 0xee,0xe2,0x0, 0xce,0x84,0xe0,0x1, 0x2, 0x9d, +0xea,0x1a,0x7f,0xf8,0xe9,0xff,0xc7,0xff,0x36,0xa2,0x3f,0x9d,0xa7,0x8f,0x3f,0x82, +0x12,0x80,0x3a,0x65,0x17,0x81,0xe0,0x2c,0x3e,0xf, 0xe0,0x0, 0x26,0x59,0xe0,0x0, +0x2c,0x57,0xea,0x23,0x7f,0xae,0xea,0x23,0x7f,0x30,0xb2,0x8f,0xe0,0x0, 0x1f,0xdd, +0xb2,0xe, 0xea,0x23,0x79,0xb6,0x8e,0x8f,0xe0,0x0, 0x1f,0xdc,0x8f,0xf, 0xe0,0x0, +0x1f,0xdb,0x37,0x28,0x8b,0xf, 0xe0,0x0, 0x1f,0xda,0x36,0xa8,0x8f,0x8f,0x3b,0x4d, +0x3f,0xce,0x9f,0x3, 0xe0,0xf, 0x3b,0x2f,0x3f,0x7f,0xe7,0xff,0x2, 0x0, 0xe0,0x0, +0x1f,0xd9,0x8c,0xf, 0xdf,0x2e,0xe7,0xfe,0x24,0x7a,0xea,0x23,0x7f,0xb2,0xea,0x23, +0x7f,0x34,0x14,0x0, 0xb2,0x8f,0x17,0x83,0xb2,0xe, 0xaf,0x82,0xb3,0x3, 0xb, 0x61, +0xea,0x23,0x79,0xb6,0x14,0x24,0xe7,0xfe,0x0, 0xeb,0x2e,0x14,0xe2,0x0, 0xce,0x81, +0xe0,0x0, 0x1, 0x44,0xe0,0x0, 0x1f,0xd8,0x3c,0x6c,0x8e,0x8f,0xe0,0x0, 0x1f,0xd7, +0x36,0xa8,0x8f,0xf, 0xea,0x23,0x7f,0xb6,0x3f,0x4d,0x16,0x84,0xae,0x82,0xb7,0xf, +0xb, 0x61,0x12,0x80,0x3a,0x65,0xe0,0x0, 0x1e,0xd6,0xea,0x23,0x7f,0x30,0xea,0x23, +0x7f,0xae,0x8c,0xd, 0xb2,0xe, 0xb2,0x8f,0xde,0xfc,0x24,0x3, 0x14,0x0, 0xb, 0x61, +0xea,0x23,0x79,0xb6,0xe7,0xfe,0x0, 0xc3,0xe2,0x0, 0xce,0x84,0xe7,0xfe,0x5, 0xcb, +0xe7,0xfe,0x0, 0xbd,0xe0,0x43,0x3a,0x14,0xe0,0x43,0x3a,0x95,0x0, 0xe5,0x2c,0x6f, +0xea,0x23,0x7f,0x32,0xea,0x23,0x7f,0xb4,0xb2,0x8e,0xe0,0x0, 0x1f,0x5d,0xb2,0xf, +0xea,0x23,0x7f,0xb6,0x8e,0x8e,0xe0,0x0, 0x1f,0x5b,0x36,0xa8,0x8f,0xe, 0x3f,0x4d, +0x16,0x81,0xae,0x82,0xb7,0xf, 0xb, 0x61,0xe0,0x0, 0x1f,0xdd,0x3c,0x6c,0x8e,0x8f, +0xe0,0x0, 0x1f,0xdb,0x36,0xa8,0x8f,0xf, 0xea,0x23,0x7f,0xb6,0x3f,0x4d,0x16,0x82, +0xae,0x82,0xb7,0xf, 0xb, 0x61,0xea,0x23,0x79,0xb6,0x14,0x0, 0xe7,0xfe,0x0, 0x90, +0xf0,0x1, 0x1b,0x7d,0xe8,0x0, 0x8d,0x6, 0xe2,0x1, 0xcd,0x6f,0x2, 0x90,0xf0,0x1, +0x1b,0xf5,0xe0,0xf, 0x35,0x22,0xc5,0x1, 0xf0,0x17,0x3b,0x9f,0xe2,0x1, 0xc5,0x7f, +0xe8,0x0, 0xb4,0x7, 0xe8,0x0, 0xb4,0x97,0xe8,0x0, 0xad,0x6, 0xe0,0x2, 0x1f,0xc7, +0xe0,0x1, 0x9f,0xf, 0x3f,0x78,0xe0,0x1, 0x5, 0xa5,0xe0,0x1, 0xb4,0xf, 0xe0,0x1, +0xb4,0x9f,0x9f,0x7f,0x3f,0x79,0xe0,0x1, 0x5, 0x83,0xb4,0xff,0xb4,0x6f,0xe2,0x0, +0xcd,0xa, 0xe0,0x1, 0x1, 0xa, 0xe2,0x0, 0xcd,0x14,0xe0,0x1, 0x1, 0x1b,0xe2,0x1, +0xcd,0x6f,0xe0,0x1, 0x5, 0xa7,0x8, 0xb1,0xf0,0x0, 0x19,0x8f,0xf0,0x1, 0x1b,0xf5, +0xe8,0x0, 0x8c,0x83,0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x12,0x1, 0xe8,0x40,0x3c,0x67, +0xe2,0x0, 0xcc,0x9f,0x2, 0x86,0xc4,0x81,0xe2,0x1, 0xc4,0xff,0xf8,0x40,0x3a,0xe4, +0x17,0xfe,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xc7,0x81,0x37,0xa2,0xe8,0x0, 0x98,0x87, +0xf8,0x0, 0x99,0x17,0xe0,0x1, 0x1e,0xf5,0xe0,0x10,0x3c,0x1f,0xf0,0x40,0x3b,0xe8, +0x15,0x0, 0x0, 0xad,0xe8,0xe, 0x3f,0x22,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x3e,0x1e, +0xe2,0x0, 0xce,0x0, 0xe2,0x1, 0xc7,0xff,0x5, 0x30,0xe2,0x1, 0xc7,0x7f,0xf0,0x40, +0x38,0xef,0x3e,0x6e,0xf2,0x1, 0xc0,0xff,0xe2,0x1, 0xc6,0x7f,0xf0,0x40,0x38,0xfc, +0x3, 0x82,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x3f,0xf9,0x4, 0x8d,0xc5,0x1, 0xe2,0x1, +0xc5,0x7f,0xf0,0x0, 0x99,0x3d,0xe0,0xf, 0x35,0x22,0x3f,0x98,0xb5,0x8f,0x38,0xeb, +0xf0,0x0, 0xb1,0x1f,0xc6,0x84,0xe8,0x40,0x3e,0xf0,0x1, 0x12,0x9d,0xad,0x9f,0x3d, +0xe0,0xf, 0x3d,0xa1,0xe3,0xff,0xc7,0xff,0xe0,0x43,0x3e,0x1f,0xe2,0x0, 0xce,0x0, +0x2, 0x4a,0xe0,0x41,0x3f,0xcf,0x0, 0xc7,0xe0,0x41,0x3f,0x4e,0x0, 0xcf,0xe2,0x0, +0xcc,0x9f,0xc5,0x1, 0xe2,0x1, 0xc5,0x7f,0x2, 0x85,0xe2,0x1, 0xcd,0x6b,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0x2a,0xb4,0xe8,0x0, 0xad,0x6, 0x8, 0xe1,0xe0,0x1, 0x9f,0x3f, +0x3f,0x79,0xe7,0xfe,0x3, 0xfe,0xe2,0x0, 0xcd,0xa, 0xe0,0x1, 0xb4,0xbf,0xe0,0x1, +0xb4,0x2f,0xe7,0xfe,0x1, 0xfa,0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f, +0x96,0x7f,0x3e,0xab,0x3f,0x2c,0xe0,0x2, 0xb6,0x8f,0xe0,0x2, 0xb7,0x1f,0x38,0x82, +0x9f,0x4f,0x3f,0x78,0xe7,0xfe,0x3, 0xdf,0xb4,0x4f,0xb4,0xdf,0xe7,0xfe,0x0, 0xdb, +0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f,0x96,0x7f,0x3e,0xab,0x3f,0x2c, +0xe0,0x2, 0xb6,0xaf,0xe0,0x2, 0xb7,0x3f,0x38,0x82,0xe8,0x0, 0xac,0x83,0x0, 0xcc, +0x38,0x82,0xe0,0x1, 0x1c,0x30,0xe7,0x57,0x0, 0xc4,0xe0,0x2, 0x1f,0xc7,0x8c,0xf, +0x17,0x84,0xe0,0x28,0x3c,0xf, 0x38,0x82,0x17,0xe0,0x3f,0x98,0xe2,0x0, 0xcf,0x83, +0x5, 0x96,0x24,0x14,0xe0,0x1, 0x1e,0xfd,0x16,0x6, 0xe0,0x2, 0x1f,0xc7,0xe0,0x1, +0x1f,0x75,0xe0,0x2, 0x1d,0xc6,0xae,0xd, 0xc7,0x84,0x96,0xf, 0x96,0x9f,0xb6,0xe, +0x3f,0xfb,0xc7,0x4, 0xe0,0x40,0xb6,0x9e,0x1, 0xf8,0x38,0x82,0xe0,0x2, 0x1f,0x47, +0xe0,0x1, 0x1f,0xf5,0x95,0xae,0x96,0x3e,0xe0,0x1, 0x96,0xce,0xe0,0x1, 0x1d,0x7d, +0xe0,0x1, 0x97,0x5e,0x14,0x82,0xac,0x8a,0xb5,0x8f,0xb6,0x1f,0xb6,0xaf,0xb7,0x3f, +0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x2, 0x1f,0xa0,0xe0,0x2, 0x1f,0x1f, +0x8f,0x8f,0x8e,0xe, 0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x5, 0xfa,0xe0,0x1, 0x1f,0x30, +0x9e,0x8e,0xe0,0x0, 0x26,0xe6,0xe0,0x2, 0x19,0x47,0x8d,0x82,0x2f,0x95,0x16,0x81, +0xe0,0x2d,0x3e,0xd, 0x26,0x91,0x9f,0x8e,0xe2,0x0, 0xcd,0x83,0xb7,0x92,0xe0,0x1, +0x1, 0x61,0xe0,0x2, 0x1f,0x85,0x17,0x7e,0xe0,0xa, 0xaf,0x3f,0x17,0x80,0xaf,0x82, +0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x2, 0x1f,0x21,0xe0,0xd, 0x8e,0x8e,0xe2,0x0, +0xce,0x81,0x1, 0x70,0xe0,0x6, 0x9a,0xae,0xe0,0x6, 0x9a,0x3e,0xe0,0x0, 0x25,0xfb, +0xe2,0x0, 0xcd,0x81,0xe0,0x1, 0x1, 0x55,0xea,0x23,0x7b,0x3c,0xea,0x23,0x7b,0xba, +0x97,0x86,0x94,0x87,0xe2,0x0, 0xcd,0x83,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29, +0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff,0xe0,0x2, 0x1, 0x14,0xe0,0x43,0x3e,0x9f, +0xe0,0x43,0x3f,0x19,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xc4,0xff,0xe2,0x0, 0xce,0x80, +0xf0,0x0, 0x1c,0xf, 0xe0,0x1, 0x5, 0x20,0xe2,0x0, 0xcf,0x0, 0xe0,0x1, 0x5, 0x2b, +0x3e,0xef,0x3f,0x69,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0x7f,0x3e,0xfe,0x3, 0x82, +0x3f,0xe9,0xe8,0x0, 0x8f,0x8, 0xe2,0x1, 0xc7,0xff,0x3f,0x7f,0xe7,0xff,0x3, 0xba, +0x3c,0xe4,0x3c,0x65,0xde,0x7e,0xb2,0x86,0xb2,0x7, 0xe7,0xff,0x0, 0xb3,0xe0,0x1, +0x1f,0xd6,0x17,0x1, 0xaf,0xf, 0x17,0x7e,0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0xaf,0x3f, +0xe0,0x2, 0x1f,0xc7,0xae,0x8f,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x0, 0x1f,0xe, +0xe0,0x1a,0x9f,0x5e,0xe2,0x0, 0xcf,0x1e,0xe7,0xff,0x2, 0x82,0xe0,0x2, 0x19,0x47, +0x8d,0x82,0xe0,0x1, 0x25,0xdd,0xe0,0x1, 0x1f,0x30,0x9e,0x8e,0xe7,0xff,0x2e,0x80, +0xe0,0x1, 0x1f,0xd6,0x17,0x1, 0xaf,0xf, 0x17,0x7e,0xe0,0x2, 0x1f,0x85,0xae,0x82, +0xe0,0xa, 0xaf,0x3f,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x2, 0x1f,0x21,0xe0,0xd, +0x8e,0x8e,0xe2,0x0, 0xce,0x81,0xe7,0xfe,0x1, 0x76,0xe0,0x6, 0x9a,0xae,0xe0,0x6, +0x9a,0x3e,0x11,0x80,0xe7,0xfe,0x2e,0x76,0xf0,0x0, 0x14,0x81,0xe8,0x2f,0x3f,0x89, +0xe7,0xfe,0x27,0xf0,0xe0,0x2, 0x1c,0x47,0x15,0x28,0x3c,0xe3,0xe0,0x0, 0xdd,0x86, +0xe0,0x1, 0x1c,0x75,0xe0,0x7, 0x15,0x40,0x3c,0xe3,0xe0,0x0, 0xdd,0x7f,0xe0,0x0, +0x1f,0xd5,0xea,0x23,0x7b,0x3c,0x8f,0xf, 0xe0,0x0, 0x1f,0xd4,0x37,0x28,0x8f,0x8f, +0xea,0x23,0x7b,0xba,0x3f,0xce,0xe0,0x2, 0x1f,0x5, 0xf0,0x0, 0x1c,0xf, 0xe0,0xa, +0xa9,0xbe,0x3c,0xe4,0xe0,0x1, 0x1f,0x30,0xb7,0x8e,0xe0,0x1, 0x1f,0xfd,0x3c,0x65, +0xa9,0x8f,0x17,0x82,0xe8,0x0, 0xaf,0x88,0xb2,0xa2,0xb2,0x32,0xb2,0xc2,0xb2,0xe2, +0xe0,0x1, 0xb2,0x82,0xe0,0x1, 0xb2,0xa2,0xb2,0x52,0xb2,0x72,0xe0,0x1, 0xb2,0x12, +0xe0,0x1, 0xb2,0x32,0xb2,0x86,0xb2,0x7, 0xdd,0xfc,0x3c,0xe3,0xf0,0x0, 0xac,0x82, +0x3f,0x63,0x3f,0xe3,0xe0,0x41,0x3f,0xcf,0xe2,0x1, 0xc7,0xff,0xe7,0xfe,0x0, 0xde, +0x2f,0xbb,0xaf,0x82,0x17,0x7e,0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0xaf,0x3f,0xe7,0xfe, +0x0, 0xa1,0xe0,0x41,0x3c,0xc9,0xe2,0x1, 0xc4,0xff,0xe7,0xfe,0x0, 0xd3,0xe0,0x0, +0x1f,0xd3,0x9f,0x42,0x8e,0x8f,0xe0,0x0, 0x1f,0xd2,0xe0,0x1, 0x9e,0x2, 0x8f,0x8f, +0x36,0xa8,0x3f,0x2c,0x3f,0xcd,0x3f,0x7f,0xea,0x23,0x7b,0x3c,0xea,0x23,0x7b,0xba, +0x2, 0x26,0xe0,0x0, 0x1f,0xd1,0xe0,0x1, 0x9f,0x32,0x8e,0x8f,0xe0,0x0, 0x1f,0xd0, +0x9e,0x72,0x8f,0x8f,0x36,0xa8,0x3f,0x2c,0x3f,0xcd,0x3f,0x7f,0x2, 0x18,0x97,0x86, +0x94,0x87,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff,0xc7,0xff,0xe3,0xff, +0xc4,0xff,0xe7,0xfe,0x0, 0x95,0xe0,0x1, 0x9c,0xd2,0xe0,0x1, 0x9c,0x42,0x17,0x84, +0xaf,0x82,0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xfb,0x0, 0xac,0x97,0x86,0x94,0x87, +0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff, +0x17,0x3, 0xaf,0x2, 0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe0,0x1, 0xb2,0xc2, +0xe2,0x1, 0xc7,0xff,0xe0,0x1, 0xb2,0x52,0xe2,0x1, 0xc4,0xff,0xe7,0xfd,0x0, 0xf8, +0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe0,0x1, 0xb2,0xc2,0xe2,0x1, 0xc7,0xff, +0xe0,0x1, 0xb2,0x52,0xe2,0x1, 0xc4,0xff,0xe7,0xfd,0x0, 0xea,0x17,0x1, 0xe0,0x2e, +0x3e,0xe, 0xe7,0xfe,0x27,0x34,0x3f,0x6f,0xe4,0x0, 0xcf,0x1, 0xe2,0x0, 0xc7,0x1, +0xe7,0xfe,0x27,0x2d,0xe0,0x1, 0x1f,0xb0,0x97,0x8f,0xb7,0x92,0xe7,0xfd,0x0, 0xa3, +0x8, 0xb4,0xe0,0x2, 0x19,0x85,0xe0,0xa, 0x8f,0x83,0x27,0x92,0xe0,0x2, 0x19,0x47, +0xde,0x79,0x8f,0x82,0xe2,0x0, 0xcf,0x84,0x1, 0x11,0xdc,0x5e,0x3a,0x68,0x22,0x7, +0xe0,0x2, 0x1f,0x90,0x17,0x1, 0xe0,0xa, 0xaa,0x33,0xaf,0xf, 0xa, 0x61,0xe0,0x2, +0x1f,0x47,0xaf,0x8e,0xa, 0x21,0xe7,0xf8,0x0, 0xc6,0x97,0x42,0xe0,0x1, 0x96,0x2, +0xe0,0x1, 0x97,0xb2,0x96,0xf2,0x3f,0x2c,0x3f,0xad,0xe0,0x1, 0xb7,0x62,0xe0,0x1, +0xb7,0xf2,0xd2,0xea,0x3a,0x68,0x24,0xc, 0xe2,0x1, 0xca,0x7f,0x17,0x80,0xe0,0x6f, +0x39,0xa4,0x3a,0x6f,0x3c,0x64,0xde,0x21,0x17,0x80,0xaf,0x82,0x0, 0xd9,0xe0,0x1, +0x1f,0xfd,0xe0,0x1, 0x1c,0x75,0x8d,0xf, 0x3c,0xe2,0xd6,0x6d,0x3a,0x68,0x0, 0xf3, +0x8, 0xb4,0xe2,0x0, 0xcc,0x1, 0x39,0xe8,0x39,0x68,0x17,0x80,0x5, 0x89,0x31,0x41, +0xe2,0x0, 0xc9,0x1, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x1, 0xfa,0x37,0xc1,0x31,0x3f, +0xe4,0x0, 0xc1,0x3, 0x12,0x1, 0x31,0x54,0x3c,0xe2,0x3c,0x63,0xe0,0x0, 0xda,0x40, +0x3c,0x12,0x34,0x41,0xe0,0x2, 0x3c,0x22,0xe0,0x43,0x3f,0x92,0xe0,0x41,0x3f,0x4f, +0xe2,0x0, 0xcf,0x80,0xe1,0x2e,0x3f,0x14,0xe1,0x2f,0x39,0x14,0xe0,0x6f,0x3d,0x2e, +0x39,0x68,0x2f,0xeb,0xa, 0x61,0xe0,0x1, 0x1f,0xf5,0x34,0x22,0x34,0xa2,0x3c,0x9f, +0x3c,0x1f,0x9f,0x88,0x9f,0x9, 0x9c,0x18,0x3f,0xae,0x9f,0x19,0xe0,0x43,0x3e,0x9f, +0xe2,0x0, 0xce,0x80,0x3c,0x2e,0xe0,0x43,0x3f,0x18,0xe0,0x41,0x3e,0xcd,0xe0,0x6f, +0x3d,0x2d,0xe2,0x0, 0xcf,0x0, 0xe0,0x41,0x3f,0x4e,0xe0,0x68,0x3d,0x2e,0x3f,0xbf, +0x3c,0x38,0x3c,0x1f,0xe2,0x0, 0xcc,0x5, 0x2, 0x88,0xe2,0x0, 0xcc,0x2, 0xe0,0xf, +0x34,0x41,0xe0,0x68,0x3b,0xaf,0x38,0x82,0xe7,0xff,0x0, 0xac,0x3f,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x0, 0x1f,0xcf,0x13,0x0, 0xf0,0x0, 0x8e,0xf, +0xe0,0x0, 0x1f,0xce,0x3a,0x68,0x8f,0x8f,0xf0,0x0, 0x14,0x81,0x7f,0x81,0xf0,0x40, +0x3d,0x66,0xf0,0x40,0x3d,0xe6,0x11,0xa8,0xe2,0x0, 0xca,0x1, 0xf0,0x0, 0x14,0x0, +0x5, 0xba,0x11,0x1, 0xf8,0x40,0x3e,0xe8,0xe8,0x40,0x3a,0xe8,0x0, 0x8b,0xe8,0x40, +0x3a,0xed,0x3b,0xe8,0xf0,0x40,0x3e,0xe2,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x3a,0x72, +0x1, 0x2a,0xe8,0x40,0x3c,0xed,0x3c,0x62,0xdf,0xa7,0x3c,0x73,0xf0,0x40,0x3f,0x68, +0x4, 0xf4,0xf7,0xff,0x26,0xee,0x3c,0xe2,0x3c,0x65,0xdf,0x9e,0xe8,0x8, 0x3c,0x1c, +0xe8,0xe, 0x3b,0x9e,0x3f,0x78,0x4, 0xbe,0xe2,0x0, 0xcb,0x5, 0x17,0x1, 0xe8,0xe, +0x3f,0x18,0xe0,0x0, 0x2, 0xe8,0xe8,0x40,0x3a,0xed,0xf0,0x40,0x3e,0xe2,0xc1,0x1, +0xe2,0x1, 0xc1,0x7f,0x3a,0x72,0xf0,0x40,0x3c,0x6e,0xf2,0x1, 0xc4,0x7f,0xe8,0x40, +0x3b,0xee,0x1, 0xd8,0xe2,0x0, 0xcb,0x5, 0x3f,0x66,0xe2,0x1, 0xc7,0x7f,0xc1,0x8a, +0x2, 0xb3,0xe8,0x40,0x3e,0xe8,0xe8,0x40,0x3f,0xeb,0xe2,0x1, 0xc6,0xff,0xe2,0x1, +0xc7,0xff,0x3e,0xff,0xe2,0x1, 0xc1,0xff,0x3, 0x83,0xf8,0x40,0x3c,0x6b,0xe2,0x0, +0xcf,0x5, 0xf8,0x40,0x3d,0xe8,0xf2,0x1, 0xc5,0xff,0xe0,0x0, 0x1, 0x59,0xf2,0x0, +0xcc,0x8c,0x1, 0x27,0xf0,0x0, 0xc4,0x81,0xc3,0x1, 0xf2,0x1, 0xc4,0xff,0xe7,0xff, +0x0, 0x9d,0xe2,0x0, 0xcb,0x5, 0xe8,0x40,0x3f,0xed,0xe0,0x6f,0x3a,0xa5,0x3a,0xef, +0x3f,0xe2,0xe0,0x7e,0x3a,0xa7,0xe8,0x6f,0x3a,0xad,0xe8,0x40,0x3b,0xee,0xf0,0x40, +0x3e,0xef,0xe7,0xff,0x0, 0x9b,0xe2,0x1, 0xc1,0xff,0xf0,0x0, 0x2d,0xaa,0xf0,0x0, +0x2d,0x10,0xf2,0x0, 0xcc,0x8c,0xf8,0x40,0x3d,0xea,0xf0,0x0, 0x66,0x1, 0x1, 0xdb, +0xf2,0x0, 0xcd,0x8a,0x2, 0x95,0xf0,0x0, 0x2d,0xa8,0xf0,0x0, 0x25,0x6, 0xf0,0x0, +0xc5,0x10,0xf2,0x1, 0xc5,0x7f,0xe8,0x40,0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xf0,0x0, 0xc5,0x1, 0xf2,0x1, 0xc5,0x7f,0xe7,0xfe,0x0, 0xf7,0xf0,0x0, +0x15,0xf, 0xe8,0x40,0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf2,0x0, +0xcd,0x8b,0xf0,0x0, 0x15,0xf, 0xe8,0x7a,0x3c,0xab,0xe8,0x40,0x3c,0x6a,0xc0,0x4, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf8,0x40,0x3d,0x6b,0x0, 0xde,0x11,0xb2,0xe7,0xff, +0x0, 0xab,0xe2,0x0, 0xcc,0x5, 0x5, 0x83,0xe7,0xfd,0x0, 0xdc,0xe2,0x0, 0xcc,0x2, +0xe0,0xe, 0x34,0x41,0xe0,0x68,0x3b,0xae,0x38,0x82,0xf0,0x2, 0x1a,0x47,0xf8,0x0, +0x9b,0xb4,0xe8,0x1, 0x9c,0xd4,0xe8,0x0, 0x9e,0x44,0xf0,0xa, 0x3b,0xa9,0xf0,0x40, +0x39,0x6a,0xe8,0x1, 0x9f,0x4, 0xf3,0xff,0xc1,0x7f,0xe8,0x43,0x3e,0x92,0xe0,0xf, +0x3e,0x2e,0xe2,0x0, 0xce,0x80,0xe8,0xd, 0x3c,0xa7,0xf8,0x1, 0x9b,0x34,0xf8,0x0, +0x9a,0xf4,0xf0,0x40,0x39,0xef,0xe3,0xff,0xc6,0xff,0xf3,0xff,0xc1,0xff,0xe0,0x72, +0x3d,0x2d,0xe0,0x0, 0x1e,0xcd,0xe8,0x43,0x3d,0x93,0xf8,0x8, 0x3b,0x25,0xe2,0x0, +0xcd,0x80,0x3f,0xe8,0x8d,0x8d,0xe0,0x0, 0x1e,0xcc,0xe3,0xff,0xc7,0xff,0x3f,0x2c, +0xe0,0x43,0x3d,0x1f,0xe3,0xff,0xc7,0x7f,0x8e,0x8d,0xe0,0x73,0x3d,0x2e,0xf8,0xc, +0x3a,0xa6,0xe2,0x0, 0xcd,0x0, 0xe0,0xe, 0x35,0xa8,0xe3,0xff,0xc6,0x7f,0x3f,0x4d, +0xe0,0x6f,0x3d,0x2c,0xf0,0x40,0x39,0xfe,0x14,0x0, 0xe0,0x0, 0x3, 0xd2,0xe0,0x0, +0x1f,0x4b,0xe0,0x0, 0x1e,0xca,0x8f,0xe, 0x8e,0x8d,0x37,0x28,0x3f,0x4d,0xe1,0x2d, +0x3f,0x9e,0xe0,0x0, 0x26,0xc5,0xe9,0x2f,0x3f,0x93,0xe0,0x0, 0x27,0xc1,0xe8,0x0, +0x8c,0x14,0x2c,0x3d,0xe0,0x0, 0x1f,0xd5,0xe0,0x0, 0x1e,0xc9,0x8d,0x8f,0xe0,0x0, +0x1f,0xc8,0x8e,0x8d,0x8e,0xf, 0xe0,0x0, 0x1f,0xd4,0x36,0x28,0x8f,0x8f,0x35,0xa8, +0x3e,0xcc,0x3f,0xcb,0xe8,0x0, 0x9e,0x14,0xe0,0xd, 0x3f,0xad,0x3e,0x7d,0x5, 0x28, +0xe0,0x0, 0x1e,0xc7,0x8d,0x8d,0xe0,0x0, 0x1e,0xc6,0x35,0xa8,0x8e,0x8d,0x3e,0xcb, +0x3f,0xad,0xe0,0x2f,0x3f,0x9c,0x27,0x9c,0xf1,0x2f,0x39,0x1e,0x27,0x99,0xe0,0x0, +0x1f,0xc5,0xe0,0x0, 0x1f,0x44,0x8f,0x8f,0x8f,0xe, 0xf0,0x40,0x3b,0xf9,0x37,0xa8, +0x3f,0x4f,0x3, 0x8f,0xf8,0xf, 0x3b,0xa5,0x3f,0xfe,0x3, 0xa, 0xf0,0xf, 0x3b,0x29, +0x3f,0x7f,0x17,0xa3,0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe8,0xf, 0x3c,0xa5,0x3f,0xfe,0x3, 0x7c,0xf8,0xf, 0x3b,0x27,0x3f,0x7f,0x17,0xa2, +0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0xe0,0x2, 0x1e,0x47,0xf0,0x0, 0x9b,0xac, +0xf0,0x1, 0x9a,0xcc,0xf0,0x0, 0x9a,0x4c,0xf0,0x1, 0x9b,0xc, 0xf8,0xd, 0x3b,0xa5, +0xe3,0xff,0xc6,0xff,0xe0,0x43,0x3f,0x1d,0xf8,0xf, 0x3a,0x26,0xe2,0x0, 0xcf,0x0, +0xe3,0xff,0xc7,0xff,0xf8,0xa, 0x3a,0xa7,0xe0,0x43,0x3c,0x9f,0xe0,0x1, 0x9c,0x3c, +0x9d,0xfc,0xe3,0xff,0xc5,0x7f,0xe0,0x6d,0x3d,0x2a,0xe2,0x0, 0xcc,0x80,0xf8,0xa, +0x3b,0x24,0xe0,0xe, 0x3c,0x2b,0xe3,0xff,0xc5,0x7f,0xe0,0x0, 0x1c,0xc3,0xe3,0xff, +0xc7,0x7f,0xe0,0x6f,0x3d,0x2a,0xe0,0x0, 0x1d,0x42,0xf0,0x43,0x39,0x9e,0x8c,0x89, +0x3d,0xa8,0xf2,0x0, 0xc9,0x80,0x8d,0xa, 0xe3,0xff,0xc5,0xff,0x34,0xa8,0xe0,0x6e, +0x3d,0x2b,0xe0,0xb, 0x3d,0x49,0xe1,0x2b,0x3d,0x9e,0xe0,0x0, 0x25,0xcd,0xe1,0x2f, +0x3f,0x9e,0xe0,0x0, 0x27,0xc9,0x8c,0x1c,0xe0,0x0, 0x2c,0x46,0xe0,0x0, 0x1f,0xd5, +0x9e,0x1c,0x8d,0xf, 0xe0,0x0, 0x1f,0xc1,0x35,0x28,0x8d,0x8f,0xe0,0x0, 0x1f,0xd4, +0x35,0xa8,0x8f,0xf, 0xe0,0x0, 0x1f,0xc0,0x3f,0x4a,0x8f,0x8f,0x3f,0xcb,0xe0,0xf, +0x3f,0x2f,0x3e,0x7f,0x5, 0x31,0xe0,0x0, 0x1f,0xbf,0x8d,0x8f,0xe0,0x0, 0x1f,0xbe, +0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3f,0x2f,0x3e,0x7e,0x3, 0x26,0xe0,0x0, 0x1f,0xbd, +0x8f,0xf, 0xe0,0x0, 0x1f,0xbc,0x37,0x28,0x8f,0x8f,0x3f,0xce,0x3e,0xff,0x5, 0x9c, +0xe0,0x0, 0x1f,0xc5,0xf8,0x40,0x3b,0xf5,0x8f,0xf, 0xe0,0x0, 0x1f,0xc4,0x37,0x28, +0x8f,0x8f,0x3f,0xce,0x37,0xc1,0x5, 0x91,0xf8,0x16,0x3a,0xa6,0xf0,0x40,0x3b,0x7f, +0x3, 0xb, 0xf8,0x17,0x3a,0x27,0xe8,0x40,0x3f,0xf7,0x17,0xa0,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82,0xf8,0x17,0x3b,0xa6,0xf0,0x40,0x3b,0xff, +0x3, 0x7b,0xf8,0x15,0x3a,0x25,0xe8,0x40,0x3f,0xf5,0x17,0xa1,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0xe0,0x2, 0x1e,0xc7,0x9d,0xad,0xe0,0x1, 0x9e,0x4d,0xf0,0x0, +0x9b,0x3d,0xe0,0xe, 0x3d,0xac,0xe0,0x1, 0x9c,0xdd,0xe3,0xff,0xc7,0x7f,0xe0,0x43, +0x3d,0x1e,0xf0,0xf, 0x3b,0x29,0xe2,0x0, 0xcd,0x0, 0xf0,0x0, 0x9b,0xcd,0xe0,0x1, +0x9d,0xd, 0xe3,0xff,0xc7,0xff,0x3e,0x2b,0xe3,0xff,0xc6,0x7f,0xe0,0x43,0x3d,0x9f, +0xe0,0x1, 0x9c,0x3d,0xe0,0x6e,0x3d,0x2c,0xe2,0x0, 0xcd,0x80,0xf0,0xc, 0x3b,0xaa, +0x9d,0xfd,0xe3,0xff,0xc6,0x7f,0xe8,0x9, 0x3c,0xa6,0xe0,0xd, 0x3c,0x2b,0xf0,0x43, +0x3b,0x1c,0xe3,0xff,0xc4,0xff,0xe0,0x6f,0x3d,0x29,0xe3,0xff,0xc6,0xff,0xf2,0x0, +0xcb,0x0, 0xe8,0xa, 0x3d,0x27,0xe0,0x43,0x3c,0x9d,0xe3,0xff,0xc5,0x7f,0x3d,0xa8, +0xe0,0x6c,0x3d,0x2a,0xe2,0x0, 0xcc,0x80,0xe3,0xff,0xc5,0xff,0xe0,0x6d,0x3d,0x2b, +0x3f,0xad,0xe0,0x43,0x3d,0x9f,0x16,0x9f,0xe2,0x0, 0xcd,0x80,0xe0,0x2f,0x3e,0xaf, +0x16,0xe1,0xe0,0x2b,0x3d,0xad,0xe0,0x6f,0x3d,0x2b,0x14,0x0, 0x27,0x8c,0x3f,0x2c, +0xe0,0x43,0x3f,0x9e,0x3f,0xf8,0x14,0x1f,0xe0,0x28,0x3c,0x2e,0xe0,0x2f,0x3f,0xad, +0xe0,0x68,0x3d,0x2f,0x38,0x82,0x8, 0xb1,0xe0,0x1, 0x1f,0xfd,0x84,0xf, 0xc4,0x7f, +0xe2,0x1, 0xc4,0x7f,0xdd,0x7d,0x17,0x80,0x2c,0xc, 0xde,0x50,0x3f,0xe8,0x2c,0x9, +0xde,0xf4,0xe2,0x0, 0xcc,0x0, 0xe0,0x1, 0x17,0x7f,0xe0,0x6e,0x39,0xa8,0x3f,0xee, +0x3c,0x6f,0x8, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe2,0x0, 0xcc,0x1, 0x39,0x69, +0xe0,0x0, 0x5, 0xcf,0x12,0xfe,0xf0,0x0, 0x1d,0xba,0x3a,0x98,0xe0,0x0, 0x1f,0xb6, +0xea,0x23,0x7a,0x44,0xe2,0x1, 0xc2,0xff,0xfa,0x23,0x7f,0x64,0xc2,0x81,0xf0,0x0, +0x14,0x80,0xe8,0x0, 0x93,0x8b,0x93,0xf, 0x3a,0x94,0xf8,0x40,0x3e,0x69,0xf0,0x0, +0x14,0x1, 0x8c,0x4, 0xf0,0x80,0x8e,0x94,0xe8,0x0, 0x8c,0x8e,0xf8,0x80,0x8d,0x1e, +0xe8,0x8, 0x3c,0x2d,0xe8,0x9, 0x3c,0xaa,0x34,0x24,0xd6,0xfd,0x39,0xe8,0x8c,0x14, +0xe8,0x0, 0x8c,0x9e,0xf0,0x8, 0x3e,0xa8,0xf0,0x9, 0x3d,0x29,0x34,0x24,0xd6,0xf3, +0xe0,0xf, 0x39,0xa8,0x16,0x85,0x3e,0x9f,0x17,0x1, 0x3f,0x12,0xe2,0x0, 0xce,0x8b, +0xe2,0x1, 0xc7,0x7f,0xe0,0x62,0x3b,0xae,0x3f,0xf7,0x39,0xef,0x5, 0x5, 0xe0,0x43, +0x3b,0x9f,0xf8,0x40,0x3e,0x68,0x3f,0xf6,0x3, 0x5, 0xe0,0x43,0x3b,0x13,0xf8,0x40, +0x3c,0xe8,0x3a,0x75,0x1, 0xcf,0xf0,0x0, 0x2e,0x8, 0xf0,0x0, 0x2c,0x89,0x3c,0x62, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe8,0x0, 0xb3,0x8b,0x0, 0xf8,0xe0,0x0, 0x1f,0xb6, +0xb3,0xf, 0x0, 0xf6,0x8, 0xb7,0x12,0x0, 0x16,0xff,0xf0,0x0, 0x13,0x9f,0x3e,0x98, +0xf0,0x17,0x3b,0x98,0xc4,0xff,0x3d,0x64,0x3c,0x64,0x3d,0xe4,0xe0,0x40,0x3e,0x64, +0xe0,0x80,0x8f,0x9d,0xe0,0x80,0x8f,0x19,0xe0,0x3, 0x3f,0xbf,0xe0,0x5, 0x3f,0x3e, +0xe0,0x2, 0x3f,0x3f,0xf0,0x40,0x3b,0xfd,0x3e,0x1e,0x3d,0x9f,0x3c,0x15,0x3d,0x13, +0x3a,0x12,0x1, 0xef,0xe0,0x2, 0x36,0x5, 0xe4,0x0, 0xc4,0x64,0xe0,0x0, 0x12,0xe4, +0x3a,0xba,0xe0,0x4, 0x14,0xb5,0xe0,0x6, 0x39,0x32,0xe0,0x3, 0x35,0x85,0xd6,0x9b, +0xe0,0x6, 0x3c,0x26,0xe0,0x4, 0x14,0xb5,0x3c,0x65,0xd6,0x95,0xe0,0x7, 0x39,0xb3, +0x17,0x80,0xe0,0x2f,0x3b,0xf, 0xe0,0x7, 0x3c,0x27,0xe0,0x0, 0x14,0x64,0x2f,0x9b, +0xe0,0x25,0x3b,0x8f,0x2a,0x98,0x3c,0x34,0xe0,0x4, 0x14,0xb5,0x39,0x33,0xd6,0x83, +0xe0,0x2, 0x3c,0x22,0xe0,0x0, 0x14,0x64,0x3c,0x32,0x3c,0xe6,0xd6,0x7c,0x3c,0x32, +0x3c,0xe7,0xe0,0x0, 0xd6,0x79,0xe0,0x43,0x3f,0x98,0xe2,0x0, 0xcf,0x80,0x4, 0x6, +0xe0,0x43,0x3c,0x18,0xe2,0x1, 0xc4,0x7f,0xb, 0xe1,0x3c,0x65,0x0, 0xfa,0x8, 0xb1, +0xea,0x23,0x7f,0xc1,0x8f,0x8f,0xe0,0xe, 0x34,0xa1,0xe0,0xd, 0x35,0x21,0x3f,0x18, +0xc7,0xff,0x3c,0x1d,0x86,0x9e,0x3c,0xff,0x16,0x0, 0x38,0xed,0x85,0x98,0xe0,0x61, +0x39,0xac,0x3e,0x61,0x2d,0x88,0x3c,0xfa,0xb6,0x88,0x1, 0x2, 0xb5,0x8e,0x3c,0xff, +0x1, 0xb, 0x8, 0xe1,0x3c,0xfa,0x1, 0x7c,0x3e,0x9b,0x36,0x81,0xb6,0x88,0x3c,0xff, +0x16,0x80,0xb6,0x8e,0x1, 0xf7,0xb6,0x8, 0x8, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xe1,0xff,0xc0,0xc, 0xea,0x23,0x7b,0xe3,0xea,0x23,0x7e,0x43,0x16,0xa0,0x7e,0x6, +0xc4,0x7e,0xc4,0xfe,0x3e,0x97,0x3f,0xec,0xe0,0x80,0x97,0x18,0xe0,0x80,0xaf,0x17, +0x3e,0xf7,0xe0,0x80,0x97,0x19,0xe0,0x80,0xaf,0x1f,0x1, 0xf7,0xe0,0x1, 0x1f,0xd5, +0x8a,0xf, 0xe0,0x4, 0x22,0x59,0xfa,0x23,0x79,0xe4,0xf8,0x40,0x3c,0x63,0xe0,0x1, +0x1f,0x72,0xf8,0x0, 0x8d,0x88,0x17,0x80,0xf0,0x40,0x3d,0x6e,0x7f,0x9, 0xf0,0xc, +0x35,0xa4,0xe0,0x7, 0x17,0x68,0xf0,0x0, 0x16,0xd3,0xe8,0x40,0x39,0xea,0x7f,0x87, +0xf0,0x40,0x3c,0xef,0x7e,0xb, 0xf0,0x1d,0x3e,0x90,0x7f,0x88,0xf0,0x40,0x3e,0x6f, +0x7f,0x8a,0x13,0x20,0xe0,0x0, 0x7f,0xc, 0xf0,0x40,0x3d,0x67,0xe0,0x0, 0x15,0x44, +0x3c,0xe3,0xe2,0x0, 0x7c,0x34,0xe0,0x0, 0xd8,0x37,0xe0,0x0, 0x1f,0xb6,0xe0,0xff, +0x16,0x7f,0xe0,0x0, 0x1f,0x3a,0xb6,0xf, 0x16,0x33,0x17,0x80,0x15,0x0, 0x3e,0x10, +0xb7,0x8e,0xe8,0x40,0x3d,0xe8,0xe8,0x40,0x3c,0x6d,0x64,0x86,0xf8,0x40,0x3b,0x68, +0xe8,0x40,0x3e,0xeb,0xe8,0x40,0x3a,0xec,0xe8,0x40,0x39,0x6c,0xe8,0x40,0x3b,0xec, +0xf8,0x40,0x3f,0x6c,0x0, 0x83,0xe8,0x80,0x8e,0x96,0xf0,0x80,0x8b,0x9c,0xe3,0xff, +0xc6,0xff,0xf0,0xe, 0x3b,0xad,0xe0,0x43,0x3f,0x9e,0xe8,0xd, 0x3e,0xa7,0xe2,0x0, +0xcf,0x80,0xe0,0x43,0x3e,0x9d,0xe0,0x6f,0x3d,0x2d,0xf0,0x80,0x8b,0x98,0xe0,0x80, +0x8e,0x99,0xe8,0x40,0x3f,0xfe,0xf0,0xe, 0x3b,0xad,0xe0,0x7e,0x3b,0x2f,0xe2,0x0, +0xcf,0x0, 0xe8,0xd, 0x3e,0xa7,0xe0,0x6e,0x3d,0x2d,0xf0,0x40,0x3b,0xee,0xf3,0xff, +0xc3,0xff,0xe3,0xff,0xc7,0xff,0xe8,0xd, 0x3f,0x97,0x3f,0x77,0xe8,0x5, 0x3a,0x97, +0xf0,0x43,0x3b,0x9d,0xe0,0x67,0x3b,0x2e,0xf0,0x40,0x3b,0xfa,0x3f,0x92,0xe0,0x43, +0x39,0x1f,0xe0,0x43,0x3a,0x95,0x3, 0x2, 0x3e,0xea,0xf0,0x40,0x3e,0xfc,0xe0,0x43, +0x3d,0x1d,0x1, 0xc2,0xe8,0x40,0x3e,0x6b,0x17,0x0, 0xe0,0x0, 0x16,0xff,0x0, 0x83, +0xe0,0x80,0x8e,0x1b,0xe4,0xf, 0x36,0x28,0xf0,0x40,0x3b,0xed,0xe4,0x8, 0x37,0xc8, +0xf2,0x1, 0xc3,0xff,0xf0,0x40,0x3b,0xf8,0x3c,0xee,0xe2,0x1, 0xc4,0xff,0x3f,0xe8, +0x5, 0x82,0x3e,0xec,0x3c,0xff,0xe2,0x1, 0xc6,0xff,0x3, 0x82,0x3f,0x6c,0xf0,0x40, +0x3d,0x7b,0xe2,0x1, 0xc7,0x7f,0x1, 0xe5,0xf0,0x2f,0x3f,0x16,0xe0,0x1, 0x27,0xdb, +0xe0,0x2f,0x3b,0x96,0xe0,0x1, 0x27,0xd7,0xf0,0x0, 0xc4,0x81,0xf2,0x1, 0xc4,0xff, +0xf0,0x40,0x3c,0xf4,0xe0,0x0, 0xc1,0xc4,0xe7,0xfe,0x1, 0xea,0xe0,0x9, 0x3f,0x2d, +0x64,0xb, 0xe2,0x1, 0xc4,0xff,0xd5,0x67,0x67,0x88,0x3a,0x68,0xc7,0xff,0x3f,0x6f, +0xe2,0x1, 0xc7,0x7f,0xe0,0x1, 0x17,0xfd,0xe1,0x2f,0x3f,0xae,0xe2,0x1, 0xc2,0x7f, +0xe0,0x2, 0x27,0xc8,0x66,0xa, 0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3e,0x1f,0xe0,0x2, +0x27,0xc1,0x67,0x87,0xeb,0xff,0x79,0x79,0xea,0x23,0x79,0xc2,0x67,0x8, 0xc7,0x81, +0xf0,0x0, 0x66,0x7, 0xaf,0x82,0xaf,0x3, 0xe0,0x0, 0x17,0xc4,0xe8,0xf, 0x3f,0xbc, +0x67,0x9, 0x3f,0x1f,0xe0,0x8, 0x87,0x2e,0xc7,0x4f,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, +0xcf,0x1, 0xe0,0x2, 0x5, 0x9b,0x67,0x8, 0xe2,0x0, 0xcf,0x31,0xe0,0x1, 0x1, 0x7f, +0x67,0x8, 0xe2,0x0, 0xcf,0x50,0xe0,0x2, 0x1, 0x56,0x67,0x88,0xe2,0x0, 0xcf,0xb3, +0xe0,0x1, 0x1, 0x84,0xe2,0x0, 0xca,0x8, 0xe0,0x0, 0x2, 0xfb,0x14,0x80,0x14,0x1e, +0xdd,0xfa,0xe0,0x0, 0x1f,0xb6,0x97,0x8f,0xe3,0xff,0xcf,0xca,0xe0,0x2, 0x3, 0x53, +0xf0,0x1, 0x1a,0xf4,0xf0,0x1, 0x1a,0x53,0xf0,0x1, 0x19,0x7c,0xf0,0x0, 0x18,0x9b, +0xea,0x23,0x7d,0x64,0x12,0x0, 0x17,0x80,0xea,0x23,0x7c,0xc4,0xf0,0x0, 0x13,0x9d, +0xe8,0x0, 0xb7,0x85,0xe8,0x0, 0xb7,0x84,0xf0,0x17,0x3b,0x9a,0xe8,0x0, 0xb7,0x82, +0x3a,0xe4,0xe8,0x0, 0xb7,0x81,0xf0,0x40,0x39,0xe4,0x3c,0x64,0xf0,0x40,0x3b,0x64, +0x3b,0x64,0xf0,0x40,0x3c,0x64,0xf0,0x40,0x38,0x64,0x3e,0xe4,0x13,0x81,0x0, 0x90, +0xe2,0x0, 0xcd,0x80,0xe0,0x43,0x3a,0x9e,0x3a,0x67,0xe0,0xe, 0x3f,0x96,0x4, 0x28, +0xe0,0x43,0x3b,0x1e,0xf0,0x40,0x3b,0x67,0xf0,0x40,0x3b,0xfa,0x1, 0x29,0x8d,0x8a, +0x8f,0x1a,0x8f,0x99,0xf0,0x0, 0x8c,0x89,0x3f,0x2b,0x3e,0x6e,0xe8,0xf, 0x3f,0xa9, +0xe2,0x0, 0xcf,0x0, 0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc6,0x7f,0xc5,0x1, 0xe0,0x43, +0x3d,0x9f,0xc4,0x81,0xe0,0xe, 0x3e,0x15,0x3, 0x5c,0xe2,0x0, 0xcd,0x80,0x3e,0x18, +0xe0,0x43,0x3c,0x1c,0xf0,0x40,0x39,0xe7,0xe0,0xe, 0x3f,0x96,0x3, 0x5a,0x3f,0x9d, +0xe0,0x43,0x3e,0x9f,0xf0,0x40,0x38,0x6d,0xf0,0x40,0x3c,0x67,0x0, 0xd6,0xf0,0x2, +0x2c,0xf, 0xf0,0x0, 0x23,0x4, 0xe8,0x0, 0xb3,0x2, 0xf0,0x0, 0x21,0x84,0xe8,0x0, +0xb4,0x4, 0x22,0x3, 0xe8,0x0, 0xb2,0x85,0xe3,0xff,0xce,0xe3,0x4, 0x6, 0xe0,0x0, +0x17,0xfc,0xaf,0x82,0x17,0x80,0xaf,0x83,0xe0,0x0, 0xc0,0x74,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0x16,0x30,0xf0,0x2f,0x3f,0x1c,0xe7,0xfe,0x2f,0xa8,0xe0,0x2f,0x3b,0x9c, +0xe7,0xfe,0x2f,0xa4,0xe2,0x6, 0xc9,0x0, 0xe7,0xfe,0x2, 0x20,0xeb,0xff,0x7f,0xfa, +0x8f,0x8f,0x16,0xc, 0x3e,0x3f,0x3a,0xfc,0xe7,0xfe,0x2, 0x18,0xe8,0x40,0x3c,0xe8, +0xe2,0x0, 0x7c,0x34,0x7e,0x82,0x7f,0x1, 0x7d,0x3, 0x7f,0x84,0xdd,0xbc,0xea,0x23, +0x7c,0xc4,0x3d,0xe8,0xe2,0x0, 0x7c,0x54,0x7d,0x85,0xdd,0xb5,0x16,0x3b,0xe1,0x29, +0x3e,0x28,0x65,0x85,0x66,0x82,0x67,0x1, 0xe7,0xfe,0x2c,0x80,0xe1,0x2c,0x3e,0x2b, +0xe7,0xfd,0x2e,0x7c,0xe0,0x16,0x3d,0xbb,0xe0,0xc, 0x3c,0x38,0xe0,0x9, 0x3d,0x98, +0xf0,0x8, 0x3b,0x1c,0xd4,0xac,0x3d,0xe8,0xe2,0x1, 0xc5,0xff,0xe2,0x0, 0xcd,0xd9, +0x65,0x3, 0x66,0x82,0x67,0x1, 0x67,0x84,0xe0,0x0, 0x5, 0xd9,0xe0,0x0, 0x16,0x64, +0xf0,0xf, 0x3f,0x17,0x3e,0x2b,0x36,0x21,0x3f,0x9a,0x3f,0x9c,0x66,0xc, 0xe0,0x43, +0x3f,0x9f,0x3f,0xfc,0x3, 0x8, 0xe0,0x0, 0x4e,0x76,0x7f,0x8c,0x7e,0x8, 0x7d,0x8a, +0xf0,0x0, 0x7c,0x87,0xe0,0x0, 0x17,0xc5,0x66,0xa, 0xe1,0x2f,0x3e,0x1f,0xe7,0xfd, +0x27,0xcd,0x66,0x8, 0xe0,0x1, 0x17,0xff,0xe0,0x2f,0x3e,0xf, 0xe7,0xfd,0x27,0xc6, +0x17,0x80,0x7f,0x88,0x7f,0x8a,0xe7,0xfd,0x0, 0xc1,0x66,0x9, 0x3f,0x9c,0xe0,0x8, +0x8f,0xf, 0xe2,0x0, 0xcf,0x5, 0xe7,0xff,0x1, 0x89,0xe0,0x8, 0x8f,0x9f,0xe2,0x1, +0xcf,0xb3,0xe7,0xff,0x1, 0x83,0x14,0x80,0x14,0xa, 0xdc,0xfd,0xe2,0x0, 0xcc,0x2, +0xe7,0xfe,0x2, 0xfc,0xe7,0xfe,0x0, 0xf5,0xea,0x23,0x7f,0x40,0x87,0xe, 0xe2,0x0, +0xcf,0x2, 0xe7,0xfd,0x5, 0x62,0xe0,0x0, 0x17,0x7c,0xaf,0x2, 0xe7,0xfd,0x0, 0xdd, +0xf0,0x0, 0x66,0x7, 0xea,0x23,0x79,0xc2,0xeb,0xff,0x79,0x79,0x8e,0x3, 0xe0,0x0, +0x17,0xfc,0x7e,0x8, 0xaf,0x82,0xe7,0xfd,0x0, 0xc1,0xf2,0x0, 0xcf,0x1f,0xe7,0xff, +0x2, 0x3b,0xe0,0xc, 0x37,0x81,0x3b,0xfc,0xe7,0xff,0x3, 0x36,0xf2,0x0, 0xcf,0xf, +0x5, 0x6, 0xe0,0xc, 0x37,0x82,0x3b,0xfc,0xe7,0xff,0x3, 0x2e,0xe2,0x1, 0xc9,0x7f, +0x2, 0x38,0x14,0x86,0xe0,0x8, 0x37,0xa5,0x7d,0x3, 0x7d,0x85,0x7e,0x82,0x7f,0x1, +0xd3,0xea,0xe0,0x28,0x3c,0x15,0x65,0x3, 0x65,0x85,0x66,0x82,0x67,0x1, 0xe7,0xff, +0x24,0x1b,0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3d,0x9f,0xe7,0xff,0x27,0x95,0xe7,0xfe, +0x0, 0xff,0x14,0x80,0x14,0xa, 0xdc,0xaf,0xe2,0x0, 0xcc,0x6, 0xe7,0xfe,0x2, 0xae, +0xe7,0xfe,0x0, 0xa7,0xe0,0x1, 0x1f,0xf2,0xf0,0x40,0x3e,0x64,0x7f,0x89,0xe7,0xff, +0x0, 0xbb,0xe0,0x0, 0x1e,0xba,0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x96,0x8d, +0x3f,0xae,0x3f,0x9d,0xe2,0x1, 0xcf,0x95,0xe7,0xfd,0x2, 0x24,0xe7,0xfe,0x0, 0x91, +0xe0,0xc, 0x37,0xa2,0xe0,0x2c,0x3a,0xac,0xe7,0xfe,0x2e,0x6e,0xe0,0x2, 0x16,0x54, +0xe0,0x22,0x39,0x1c,0xe7,0xfe,0x29,0x68,0xe7,0xff,0x0, 0xbd,0xf8,0x0, 0xb0,0x1, +0xe7,0xfd,0x0, 0xf1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xf4,0xc0,0x58,0xea,0x23, +0x79,0xc1,0x3a,0x6a,0xeb,0xff,0x79,0x79,0xe2,0x1, 0xc2,0x7f,0x17,0xff,0xaa,0x3, +0xaf,0x82,0xe0,0x0, 0x25,0x62,0x16,0x7f,0x3e,0x1a,0xe3,0xff,0xc6,0x7f,0xc6,0x1, +0x36,0x22,0xe0,0x3, 0x17,0x6a,0xe0,0x7, 0x17,0xca,0x3f,0x10,0x3f,0x90,0x3e,0x18, +0x96,0x88,0xc4,0x4, 0xe0,0x80,0xb6,0x9e,0x3e,0x78,0xe0,0x40,0x96,0x98,0xe0,0x80, +0xb6,0x9f,0x1, 0xf7,0xe2,0x0, 0xca,0x4, 0xe0,0x0, 0x5, 0xc7,0xf0,0x1, 0x94,0x69, +0xf0,0x1, 0x94,0xf9,0xf8,0x40,0x3c,0x79,0xe0,0x0, 0x4, 0x54,0xe8,0x40,0x3c,0xe9, +0xf0,0x2, 0x24,0xa8,0xe8,0x40,0x3c,0x68,0xd3,0x6e,0xeb,0xff,0x7b,0x7a,0xe0,0x0, +0x17,0xc0,0xe0,0x43,0x3a,0x88,0xaf,0x86,0xea,0x23,0x7f,0xc0,0xe2,0x0, 0xca,0x84, +0xaa,0x8f,0xe0,0x0, 0x5, 0x5c,0xe0,0x0, 0x17,0xfd,0xaf,0x82,0x14,0x87,0xe0,0x1, +0x1f,0x82,0xe0,0x1, 0x1f,0x1, 0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x3c,0x4f,0x34,0x21, +0xd3,0x52,0xe8,0x40,0x3c,0x78,0xe0,0x1, 0x5, 0x7d,0xe0,0x0, 0x1f,0xf1,0xe0,0x0, +0x1f,0x72,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x14,0x86,0x3c,0x4f,0xd3,0x88,0xe3,0xff, +0xc4,0x7f,0xf0,0x40,0x3c,0xf8,0xe0,0x1, 0x3, 0x6d,0xe0,0x0, 0x17,0xfd,0xaf,0x82, +0xe0,0x0, 0x16,0xfd,0x0, 0x86,0xe0,0x0, 0x17,0xff,0xaf,0x82,0xe0,0x0, 0x16,0xff, +0xe0,0x1, 0x1f,0xd5,0x17,0x0, 0x87,0x8f,0xaf,0x3, 0x3f,0xfd,0x14,0x0, 0x4, 0x4, +0xea,0x23,0x7f,0xc2,0x8c,0xf, 0xe0,0xb, 0xc0,0x28,0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0xf0,0x7, 0x34,0x21,0xf0,0x1, 0x24,0x5b,0xe8,0x40,0x3c,0xe8,0xe8,0x40,0x3c,0x69, +0xd3,0x1a,0xf0,0x40,0x3c,0xf7,0xe0,0x43,0x3a,0x88,0xeb,0xff,0x7b,0x7a,0xe0,0x1, +0x3, 0x44,0x3c,0xe7,0xf0,0x8, 0x34,0xa7,0xd3,0x52,0xea,0x23,0x7f,0xc0,0xe2,0x0, +0xca,0x84,0xac,0x6, 0xaa,0x8f,0xe7,0xff,0x2, 0x28,0xe0,0x2, 0x1f,0xc7,0xf0,0x0, +0x15,0x1, 0xe0,0x1, 0x9f,0x6f,0xe0,0x1, 0x9e,0xff,0xe2,0x0, 0xcf,0x0, 0xf8,0x40, +0x3d,0xea,0xe0,0x7b,0x39,0xae,0x8b,0x6, 0xe0,0x3, 0x12,0xec,0xe2,0x0, 0xce,0x80, +0xf0,0x7, 0x16,0xcc,0xe0,0x1, 0x9f,0xf, 0x3a,0x90,0xf0,0x1d,0x3e,0x90,0xf0,0x0, +0x9e,0x7f,0x7b,0x2, 0xe0,0x7a,0x39,0xad,0x7f,0x1, 0xe8,0x40,0x3b,0xed,0x3b,0x65, +0xf0,0x0, 0x17,0x0, 0x67,0x81,0x94,0x6, 0xe8,0x40,0x3c,0xeb,0x3c,0x2f,0x34,0x26, +0xd3,0x1e,0x97,0x87,0xe1,0x80,0xb4,0x16,0xe8,0xf, 0x3f,0xac,0x64,0x2, 0xe8,0x40, +0x3c,0xea,0x3c,0x3f,0xd3,0x14,0x15,0x1, 0xe8,0xa, 0x3d,0x1e,0xf0,0x40,0x3f,0x6a, +0xf2,0x1, 0xc7,0x7f,0xe8,0x40,0x3a,0x7e,0xe1,0x80,0xb4,0x17,0x1, 0xe4,0xe0,0x3, +0x53,0x66,0xe0,0x3, 0x4b,0xed,0xf0,0x0, 0x11,0x8c,0xf0,0x1, 0x12,0x7c,0x12,0x1, +0xf0,0x13,0x39,0x90,0xf0,0x14,0x3a,0x10,0xe2,0x1, 0xc3,0x7f,0xe8,0x0, 0xab,0x83, +0xf8,0x40,0x3b,0x6d,0xe8,0x0, 0xab,0x4, 0xf0,0x40,0x3b,0xe5,0x3c,0x64,0xf0,0x40, +0x3a,0xe4,0xf0,0x0, 0x11,0x7, 0xf0,0x0, 0x10,0x83,0x0, 0x8b,0xe8,0x2f,0x3d,0x95, +0x2f,0xaf,0xc4,0x1, 0xe2,0x1, 0xc4,0x7f,0xe8,0x40,0x3c,0x7e,0xe0,0x1, 0x1, 0x23, +0xe8,0x80,0x94,0x97,0xf8,0x80,0x90,0x16,0xe2,0x1, 0xc4,0xff,0xe0,0xd, 0x3c,0xa7, +0xe2,0x1, 0xc6,0xff,0xf2,0x1, 0xc0,0x7f,0xe0,0x43,0x3e,0xd, 0xf0,0xf, 0x38,0x26, +0xe2,0x0, 0xce,0x0, 0xe2,0x1, 0xc7,0xff,0xe0,0x41,0x3e,0xcd,0xe0,0x43,0x3d,0x8f, +0xe0,0x43,0x3e,0x8d,0xe0,0x6c,0x3c,0x2d,0xe0,0x41,0x3f,0xcf,0xe2,0x0, 0xcd,0x80, +0xe0,0x43,0x3f,0x8f,0xe8,0x2d,0x3e,0x15,0xe0,0x6b,0x3c,0x2f,0x26,0xd0,0xe2,0x1, +0xca,0x6c,0xe0,0x1, 0x2, 0xc3,0xe8,0x2f,0x3e,0x12,0x2f,0xad,0xe8,0x2f,0x3d,0x92, +0x2f,0xaa,0xe8,0x2c,0x3e,0x11,0xe0,0x0, 0x2e,0x5d,0xe8,0x2b,0x3d,0x91,0xe0,0x0, +0x2d,0xd9,0xf0,0xd, 0x39,0x94,0xf0,0xf, 0x3a,0x14,0xc2,0x1, 0xac,0x8d,0xe2,0x1, +0xc2,0x7f,0xf0,0x0, 0xa8,0xf, 0xe8,0x40,0x3b,0x60,0x3b,0xe9,0xe7,0xff,0x0, 0xb3, +0x86,0x82,0xe7,0xfe,0x0, 0x9f,0xe7,0xff,0x17,0x80,0xaf,0x86,0xe7,0xfd,0x0, 0xe6, +0x14,0x81,0xf0,0x40,0x3c,0xe9,0xe7,0xfd,0x0, 0xd7,0x13,0x82,0xf0,0x0, 0x14,0x1, +0xe7,0xfe,0x0, 0xa4,0x17,0x81,0x3f,0x94,0xe0,0xb, 0x3b,0x99,0xe8,0xc, 0x3b,0x10, +0xe2,0x1, 0xc7,0xff,0x35,0x81,0x36,0x1, 0x16,0xff,0xf0,0x1b,0x39,0x9f,0xf0,0x1a, +0x3a,0x1f,0x3e,0x9f,0x3b,0x9b,0x3b,0x1c,0xe8,0x0, 0xad,0x8b,0xf0,0x1c,0x39,0x9d, +0xe8,0x0, 0xae,0xa, 0xe0,0xb, 0x33,0x81,0xe8,0xd, 0x3e,0x94,0xe0,0xc, 0x33,0x1, +0xe8,0x0, 0xad,0x8c,0xc7,0x81,0xae,0xd, 0xf0,0xb, 0x39,0x9f,0xe8,0x0, 0x8e,0xb, +0xe8,0x0, 0x8e,0x8a,0x3e,0x19,0xe8,0xd, 0x3e,0x90,0x36,0x1, 0xe8,0xf, 0x3f,0x94, +0x36,0x81,0xc2,0x3, 0xae,0xb, 0xe2,0x1, 0xc2,0x7f,0xae,0x8f,0xe7,0xff,0x0, 0xab, +0xe0,0xd, 0x3b,0x99,0xe8,0xf, 0x3b,0x10,0xf0,0xb, 0x39,0x94,0xf0,0xc, 0x3a,0x14, +0x36,0x81,0x37,0x81,0xc2,0x1, 0xae,0x8b,0xe2,0x1, 0xc2,0x7f,0xaf,0x8c,0xe7,0xff, +0x0, 0x9a,0xe2,0x0, 0xca,0x1, 0xaa,0x3, 0x1, 0x19,0x15,0x7e,0x3d,0x14,0xe2,0x1, +0xc5,0x7f,0x17,0x8c,0x3f,0x90,0xc5,0x1, 0xe0,0x1, 0x16,0xfc,0x3e,0x90,0x3d,0x1f, +0xe0,0x80,0x8d,0x9f,0xe0,0x80,0x8e,0x1d,0x3f,0xfa,0xe0,0x80,0xb5,0x95,0xe8,0x80, +0xb6,0x1d,0x1, 0xf7,0xe2,0x0, 0xca,0x1f,0x2, 0x86,0xe0,0x0, 0x17,0xfe,0xaf,0x82, +0xe7,0xfc,0x0, 0xfe,0x12,0x82,0xf0,0x40,0x3d,0x65,0x3c,0xe4,0xe0,0x8, 0x32,0xa5, +0xd2,0x16,0xe2,0x0, 0xcc,0x2, 0xe8,0x40,0x3b,0x6a,0xe0,0x66,0x3b,0xa8,0x13,0xff, +0x3b,0x95,0xc3,0x7f,0xe2,0x1, 0xc3,0xff,0xe2,0x1, 0xc3,0x7f,0x3c,0xe7,0x3d,0x66, +0xe2,0x3, 0x7c,0x6c,0xdb,0x55,0x3d,0x66,0x3c,0xe7,0xe2,0x7, 0x7c,0x4c,0xc2,0x81, +0xdb,0x4f,0xe2,0x1, 0xc2,0xff,0x3a,0xf4,0x5, 0xe1,0xe2,0x7, 0x7c,0xcc,0xe2,0x3, +0x7c,0x6c,0xdb,0x6c,0xe7,0xfc,0x0, 0xd4,0xaa,0x3, 0xe7,0xff,0x0, 0xb8,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3d,0xe1,0xff,0xc0,0x2c,0x7c,0x3, 0x14,0xc, 0x7c,0x84,0x14,0x9c, +0x3c,0x90,0x3c,0x10,0x7d,0x5, 0x7d,0x86,0xd2,0xff,0x14,0xb0,0x3c,0x90,0xe2,0x0, +0x7c,0x14,0xd2,0xfa,0x67,0x7, 0xe2,0x0, 0xcf,0x1, 0x2, 0x8e,0x67,0x88,0x67,0xd, +0xe2,0x0, 0x7c,0x1c,0xe1,0x2f,0x3f,0x8e,0x7f,0x88,0xd2,0x38,0xe0,0x0, 0xc0,0x54, +0xf8,0x0, 0xe, 0xa8,0xb, 0xe1,0x67,0x8c,0xe2,0x0, 0xcf,0x81,0x2, 0x89,0x67,0xd, +0x67,0x88,0xe2,0x0, 0x7c,0x30,0xe1,0x2f,0x3f,0x8e,0x7f,0x8d,0x0, 0xef,0xe2,0x0, +0xcf,0x4, 0x1, 0x87,0xe2,0x0, 0xcf,0x82,0x1, 0xe2,0xe0,0x2, 0x1c,0x32,0x0, 0xe6, +0xe2,0x0, 0xcf,0x84,0x1, 0x85,0xe2,0x0, 0xcf,0x2, 0x1, 0xea,0x0, 0xf7,0xe2,0x0, +0xcf,0x2, 0x1, 0x55,0xe2,0x0, 0xcf,0x82,0x1, 0x63,0x17,0xa8,0x3f,0x90,0xe0,0xf, +0xe, 0xd, 0x17,0xbc,0x3f,0x90,0xe0,0xf, 0xd, 0xb, 0x17,0x0, 0x3f,0xeb,0xf0,0x0, +0x16,0x0, 0x3d,0xed,0x3b,0xea,0x3c,0x6e,0x3c,0xef,0xe8,0x40,0x3d,0x6c,0xf0,0x40, +0x3c,0xec,0xf0,0x40,0x3e,0xed,0xf0,0x0, 0x14,0x0, 0x7f,0x2, 0x7f,0x81,0xd1,0x92, +0xe8,0x40,0x3d,0x6c,0xe8,0x40,0x3d,0xed,0xf0,0x40,0x3d,0x68,0xf0,0x40,0x3d,0xe9, +0xe8,0x40,0x3c,0x68,0x3c,0xe7,0xd1,0x86,0xf0,0x40,0x3e,0x68,0x3d,0xe7,0xf0,0x40, +0x3e,0xe9,0xe8,0x40,0x3d,0x68,0xe8,0x40,0x3c,0x68,0xe8,0x40,0x3c,0xe9,0xd1,0x7a, +0x67,0x2, 0x67,0x81,0x3b,0x68,0x3b,0xe9,0x3d,0x6e,0x3d,0xef,0xe8,0x40,0x3c,0x68, +0xe8,0x40,0x3c,0xe9,0xd1,0x6f,0xe8,0x9, 0x3c,0x9d,0xe8,0x28,0x3c,0x7c,0xf0,0x40, +0x3e,0x78,0x2, 0x87,0xe0,0x0, 0x1, 0xc8,0xf0,0x40,0x3e,0xf9,0xe0,0x0, 0x5, 0xc4, +0x15,0x1, 0x16,0x80,0xe8,0xd, 0x3e,0x9b,0xe8,0x2c,0x3c,0xfa,0xf0,0x40,0x3d,0x7c, +0x15,0x80,0x2, 0x85,0x1, 0x88,0xf0,0x40,0x3d,0xfd,0x5, 0x85,0xc5,0x81,0x17,0x80, +0xe0,0x2a,0x3d,0x7f,0x17,0x0, 0xe0,0x9, 0x3c,0x17,0xe0,0x28,0x3f,0x76,0x3c,0x9b, +0x67,0xe, 0x67,0x89,0xe0,0x28,0x3c,0x7a,0x3f,0x9e,0x65,0x8d,0x67,0x8, 0xc7,0x84, +0xe1,0x2e,0x3f,0xb, 0xe0,0x3, 0x1d,0xa2,0x7f,0x12,0x15,0x1, 0x7f,0x93,0x17,0x0, +0x3c,0x7b,0x2, 0x9c,0x27,0x2, 0x7f,0x93,0x17,0x0, 0x67,0x93,0xe0,0x3, 0x1d,0xa3, +0x15,0x1, 0x3c,0x7b,0x2, 0xad,0xe2,0x0, 0xce,0x0, 0x3c,0x99,0xe0,0x28,0x3c,0x78, +0x3, 0x4, 0x12,0x81,0x3a,0xc9,0x3c,0xe5,0x3e,0x9d,0xe0,0x2c,0x3e,0x7c,0xc7,0xff, +0x3f,0x6a,0x0, 0xf0,0x15,0x0, 0xe7,0xff,0x0, 0xbe,0x17,0x1, 0x3f,0x59,0x27,0xc, +0xe4,0x6, 0x36,0x2f,0xe0,0x7, 0x36,0x41,0xe0,0xe, 0x36,0xc1,0xeb,0x0, 0xce,0x0, +0x3e,0x47,0xe0,0xd, 0x3b,0x4e,0xe4,0xe, 0x34,0x2f,0xe0,0x3, 0x34,0xc1,0x39,0xce, +0xe0,0x2, 0x34,0x41,0x3c,0x62,0x3c,0xe3,0xc7,0x81,0x3f,0x6a,0x0, 0xca,0x27,0x2, +0x7f,0x93,0xe0,0x1, 0x17,0xff,0x3f,0xd9,0xe2,0x1, 0xcf,0x80,0x1, 0x94,0xe0,0x2, +0x17,0x80,0x3f,0xd9,0x2f,0x90,0x3f,0xec,0x3f,0xcd,0x27,0x8d,0xe0,0x1, 0x16,0x80, +0xe0,0xf, 0x3c,0x9d,0x16,0x0, 0xe0,0x2e,0x3c,0x7c,0x3c,0x6e,0xe7,0xfe,0x17,0x0, +0xe0,0x9, 0x3f,0x5f,0xe0,0x0, 0x17,0xd0,0x3f,0x90,0xe0,0xf, 0xc, 0x19,0x17,0x83, +0xe0,0x0, 0x14,0x44,0x7f,0x91,0x3c,0x10,0xe7,0xfe,0x0, 0x89,0x8, 0xb1,0xc0,0x48, +0x7c,0x1, 0xe2,0x0, 0x7c,0x4, 0x7c,0x82,0xe2,0x0, 0x7c,0x94,0x7d,0x3, 0x7d,0x84, +0xd1,0xeb,0xe2,0x0, 0x7c,0xa8,0xe2,0x0, 0x7c,0xc, 0xd1,0xe6,0x67,0x85,0xe2,0x0, +0xcf,0x81,0x5, 0x8c,0x67,0x8a,0xe2,0x0, 0xcf,0x81,0x5, 0x88,0xe2,0x0, 0x7c,0xa8, +0xe2,0x0, 0x7c,0x14,0xd2,0x30,0xc0,0x38,0x8, 0xe1,0x14,0x7f,0x0, 0xfd,0x8, 0xb1, +0xc0,0x48,0x7c,0x1, 0xe2,0x0, 0x7c,0x4, 0x7c,0x82,0xe2,0x0, 0x7c,0x94,0x7d,0x3, +0x7d,0x84,0xd1,0xca,0xe2,0x0, 0x7c,0xa8,0xe2,0x0, 0x7c,0xc, 0xd1,0xc5,0x67,0x85, +0xe2,0x0, 0xcf,0x81,0x5, 0x8c,0x67,0x8a,0xe2,0x0, 0xcf,0x81,0x5, 0x88,0xe2,0x0, +0x7c,0xa8,0xe2,0x0, 0x7c,0x14,0xd2,0xf, 0xc0,0x38,0x8, 0xe1,0x14,0x1, 0x0, 0xfd, +0x8, 0xb4,0xc0,0x6c,0x17,0x83,0x7f,0x81,0xe4,0xf, 0x34,0x4f,0x7f,0x82,0x2c,0x8, +0x17,0x82,0x7f,0x81,0x14,0x4, 0x3c,0x10,0xd0,0xf1,0xc0,0x14,0xa, 0x61,0xe2,0x0, +0xcc,0x0, 0x3, 0x17,0xeb,0x0, 0xcf,0x80,0x3c,0x7f,0x1, 0x15,0xe0,0x41,0x39,0x48, +0x3c,0x62,0xd0,0xc8,0x11,0x9d,0x39,0x98,0x3d,0x63,0x3c,0xe2,0x14,0x0, 0xd0,0xac, +0x12,0x10,0x15,0x3c,0x3a,0x10,0x3d,0x23,0xe0,0x4, 0xc, 0x19,0x7d,0x3, 0x0, 0xe3, +0x39,0x68,0x0, 0xef,0xeb,0x83,0xcc,0x60,0x14,0x80,0x0, 0xe0,0xe4,0xa, 0x34,0x44, +0xe1,0xf7,0xc5,0x6c,0xe0,0xb, 0x34,0x2c,0x35,0xcb,0xe8,0x0, 0xcd,0xa0,0x6, 0x9, +0xe3,0xff,0xcd,0x6a,0x5, 0x16,0xe0,0x41,0x3d,0x4a,0xe0,0x8, 0x35,0xda,0x38,0x82, +0xe2,0x0, 0xcd,0xa, 0x2, 0x8, 0x35,0xba,0xe0,0x41,0x3d,0xa, 0x34,0xda,0xe0,0x8, +0x3c,0xcb,0x38,0x82,0xea,0xff,0xcd,0x70,0x3c,0x7a,0x2, 0x83,0x14,0x7f,0x38,0x82, +0x14,0x0, 0x38,0x82,0xe0,0xd, 0x3c,0x49,0xe2,0x0, 0xce,0x8f,0x3f,0xe8,0x3f,0x69, +0x2, 0x8a,0xea,0x1b,0x7c,0xa0,0xe9,0xff,0xc4,0xff,0x3c,0x9e,0x37,0xa4,0x3f,0x99, +0x8c,0xf, 0x38,0x82,0x8, 0xb2,0xe2,0x0, 0xcc,0x0, 0x3, 0x18,0xe2,0x0, 0xcc,0x80, +0xe0,0x41,0x3f,0xc8,0x3, 0xb, 0x11,0x1, 0x15,0x0, 0xe0,0x41,0x3c,0xce,0x3c,0x6f, +0xd1,0xe7,0x29,0x3, 0xe0,0x41,0x3c,0x48,0x9, 0x61,0x15,0x0, 0x3c,0x6f,0xd1,0xe0, +0x0, 0xfa,0x15,0x0, 0x9, 0x21,0xe0,0x3, 0x0, 0xdc,0xe2,0x0, 0xcc,0x80,0x3, 0x7a, +0x11,0x0, 0x0, 0xeb,0x8, 0xb2,0xe2,0x0, 0xcc,0x0, 0x3, 0xf, 0xe0,0x41,0x3c,0x48, +0x11,0x1, 0xe2,0x0, 0xcc,0x80,0x3, 0x3, 0xe0,0x41,0x3c,0xc9,0x15,0x1, 0xd1,0xc8, +0x21,0x3, 0xe0,0x41,0x3c,0x48,0x9, 0x61,0x11,0x0, 0x0, 0xf4,0x15,0x0, 0xe0,0x3, +0x0, 0xc0,0xe1,0xff,0x17,0x7f,0x3f,0x59,0xe4,0xd, 0x34,0xc0,0x3f,0xe9,0xe1,0xff, +0x14,0xff,0xe4,0xc, 0x35,0xc0,0x3c,0xdb,0xf0,0x40,0x39,0x6a,0xe0,0xa, 0x3f,0x39, +0x3c,0xbd,0x3f,0x3c,0x3e,0xbc,0xe0,0xc, 0x3f,0x19,0xe4,0xe, 0x35,0x40,0x3f,0x1c, +0x3c,0xfe,0xf0,0x40,0x3a,0x68,0x5, 0x84,0xe2,0x0, 0x16,0x0, 0x3e,0x9c,0xe8,0xf, +0x3f,0xb2,0xe8,0xb, 0x3d,0xb4,0xe4,0xc, 0x37,0x40,0xe3,0xff,0xc5,0x7f,0xe4,0xe, +0x37,0x20,0xe0,0x16,0x3e,0x1d,0xe0,0x17,0x3f,0x1a,0x3f,0x9b,0xe8,0x40,0x3c,0xe7, +0xe8,0x8, 0x3f,0x96,0x38,0x82,0x25,0xd, 0x17,0xa0,0x3f,0xaa,0xe2,0x0, 0xcf,0x80, +0x2, 0x9, 0xe0,0x41,0x3f,0xcf,0x16,0x80,0xe0,0xc, 0x34,0xbf,0x3c,0x6c,0x3c,0xed, +0x38,0x82,0x34,0x3a,0xe0,0xf, 0x34,0xdf,0xe0,0xd, 0x34,0xba,0xe0,0xc, 0x3c,0x4f, +0x0, 0xf6,0xe1,0xff,0x17,0xff,0x3c,0x7f,0x2, 0x91,0xe0,0x2, 0x17,0x80,0xe1,0x2f, +0x3c,0x2f,0x37,0xa3,0x17,0x20,0x3f,0x2f,0xe0,0xf, 0x34,0x5f,0xe0,0x2, 0x1c,0x44, +0x3f,0x98,0x8c,0xf, 0xe0,0x8, 0x3f,0x28,0x38,0x82,0xe0,0x3, 0x1f,0xa4,0x17,0x10, +0x3c,0x7f,0x17,0x98,0xe0,0x6f,0x3d,0xae,0x0, 0xee,0x8, 0xb7,0x17,0x8c,0x3f,0x98, +0xe0,0xf, 0x9, 0x3, 0xa7,0x88,0xa2,0x98,0xe2,0x0, 0xcf,0x81,0x2, 0x9c,0xe0,0xf, +0x31,0x25,0xe4,0xd, 0x31,0x28,0x37,0xcd,0xe0,0xe, 0x31,0xc8,0xea,0x0, 0xc9,0x8, +0x39,0x4f,0xe0,0x3, 0x3e,0xce,0xe0,0xf, 0x17,0xff,0xe0,0x3, 0x1c,0x25,0xe4,0x5, +0x32,0xaf,0x3c,0x52,0xe4,0xf, 0x37,0xa4,0x3c,0x45,0xea,0xff,0xc7,0xf0,0x3c,0x4f, +0x3c,0xe3,0xb, 0xe1,0xe2,0x0, 0xcf,0x84,0xe0,0x1, 0x1, 0xc, 0xe2,0x0, 0xcf,0x82, +0xe0,0x1, 0x1, 0x3, 0x3f,0xe2,0x3f,0xc3,0x27,0xe9,0xa7,0xa8,0xe3,0xf8,0xcf,0x82, +0xe0,0x0, 0x3, 0x49,0xe7,0xf8,0x12,0x2, 0x3a,0x2f,0xe2,0x0, 0xca,0x38,0x2, 0x39, +0x3d,0x64,0x3c,0x62,0x3c,0xe3,0xd1,0x38,0x3b,0x68,0x3b,0xe9,0x3d,0x64,0x14,0x0, +0x14,0x81,0xdf,0x8a,0xc4,0xff,0x17,0x7f,0xe0,0x28,0x3c,0x7e,0xe0,0xf, 0x3c,0x52, +0xe0,0xe, 0x3c,0xd3,0x3f,0xce,0x17,0x0, 0xe1,0x2b,0x3f,0x8e,0x3e,0x66,0xe0,0xd, +0x3b,0xcb,0xe0,0x1, 0x17,0xff,0x3f,0xdd,0xe2,0x1, 0xcf,0x80,0x1, 0x9d,0xe0,0x2, +0x17,0x80,0x3f,0xdd,0x27,0x86,0xe0,0x1, 0xc6,0x80,0x17,0x80,0xe0,0x2c,0x3e,0x7f, +0xe0,0x3, 0x1f,0xa6,0x17,0x1, 0x3f,0xfc,0x17,0x80,0xe0,0x6f,0x3c,0xae,0xe0,0x3, +0x36,0xc8,0xe4,0xe, 0x36,0x28,0x39,0xce,0xe0,0x2, 0x36,0x48,0xe7,0xff,0x0, 0xa7, +0x16,0x0, 0x16,0x80,0x0, 0xdf,0xe0,0x0, 0xc6,0xff,0x17,0x0, 0xe0,0x2c,0x3e,0x7e, +0x0, 0xe8,0xe2,0x7, 0xcf,0xff,0x2, 0x35,0xe0,0x1, 0x17,0x7f,0x3f,0x53,0xe2,0x1, +0xcf,0x0, 0x1, 0x9b,0xe0,0x2, 0x17,0x0, 0x3f,0x53,0x27,0x6, 0xe0,0x1, 0xc1,0x80, +0x17,0x0, 0xe0,0x22,0x39,0x7e,0xe0,0x3, 0x1f,0x27,0x39,0x7e,0x2, 0x91,0xe0,0x7, +0xc7,0xff,0xe4,0xe, 0x31,0x28,0xe0,0xd, 0x31,0xc8,0x3e,0xce,0xe0,0xc, 0x31,0x48, +0x39,0x6c,0x39,0xed,0xe7,0xfe,0x0, 0xfb,0xe0,0x0, 0xc1,0xff,0x0, 0xea,0xe4,0xe, +0x31,0x2f,0xe0,0xd, 0x31,0xc1,0x3e,0xce,0xe0,0xc, 0x31,0x41,0x39,0x6c,0x39,0xed, +0xe0,0x8, 0xc7,0x80,0x0, 0xe7,0x17,0x80,0x11,0x0, 0x11,0x80,0xe7,0xfe,0x0, 0xe7, +0xe0,0xf, 0x17,0xff,0x0, 0xfa,0xe0,0x8, 0xe, 0xd, 0xe0,0x3, 0x1f,0xa8,0xe4,0xb, +0x36,0x44,0xe4,0xa, 0x36,0x4f,0xe2,0xf, 0xc5,0xff,0xbd,0x19,0x3f,0xdc,0x3f,0x6d, +0x2d,0x9f,0xe0,0xd, 0x3f,0xcd,0x2e,0x84,0x17,0x82,0xbf,0x89,0x38,0x82,0xe4,0xb, +0x37,0x48,0xe0,0xc, 0x37,0xa8,0xe0,0xd, 0x37,0x28,0x17,0x83,0xe0,0x3, 0x1f,0x29, +0xbf,0x89,0x3e,0x4b,0xe7,0xf8,0x17,0x82,0x3e,0x9d,0xe0,0x2c,0x3e,0x7c,0x3e,0x7e, +0xc7,0xff,0x5, 0xfb,0xbf,0xa9,0xc4,0x8c,0xe0,0x9, 0xe, 0x1d,0x38,0x82,0xe2,0xf, +0xcd,0xff,0x1, 0x98,0x3f,0xcd,0x2f,0x83,0x17,0x84,0x0, 0xe0,0xea,0x0, 0xcf,0x88, +0x3f,0xdc,0x27,0x82,0x17,0x81,0xe4,0xe, 0x36,0xc8,0xbf,0x89,0xe0,0xf, 0x36,0x28, +0x3f,0xce,0xe0,0x3, 0x1f,0x2a,0x3f,0xde,0xbf,0xb9,0xe0,0xf, 0x36,0xa8,0xbf,0xc9, +0x38,0x82,0xe1,0xf8,0xc5,0x81,0xbd,0xa9,0x3e,0xe9,0x16,0x3, 0xe1,0x80,0xbe,0x3d, +0x37,0xa8,0xe4,0xc, 0x37,0x48,0x3f,0xcc,0xe8,0x20,0xcf,0x80,0x37,0x28,0xbf,0xb9, +0xbf,0x1d,0x38,0x82,0xa7,0x8, 0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xc8,0xa7,0x89, +0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x5, 0xc3,0xe2,0x0, 0xcf,0x4, 0x1, 0x91,0xe2,0x0, +0xcf,0x84,0x1, 0x86,0xa7,0x99,0xa4,0x18,0xe0,0x8, 0x3f,0xa8,0x38,0x82,0xa7,0x98, +0xe2,0x0, 0xcf,0x80,0x14,0x7f,0x17,0x81,0xe0,0x68,0x39,0x2f,0x38,0x82,0xe2,0x0, +0xcf,0x84,0x1, 0x87,0xa7,0x99,0xe2,0x0, 0xcf,0x80,0x14,0x1, 0x17,0xff,0x0, 0xf5, +0xe2,0x0, 0xcf,0x2, 0x1, 0x86,0xe2,0x0, 0xcf,0x82,0x1, 0xf5,0x14,0x0, 0x38,0x82, +0xe2,0x0, 0xcf,0x82,0x1, 0x65,0xa7,0x98,0xa7,0x19,0x3f,0xfe,0x1, 0xe2,0xa6,0xa8, +0xa7,0x29,0x3e,0xfe,0x2, 0x5e,0x4, 0x68,0xc4,0xc, 0xc4,0x8c,0xe0,0x8, 0xe, 0xd, +0xe0,0x9, 0xd, 0xb, 0x3e,0x7a,0x2, 0xd5,0x1, 0x83,0x3e,0xfb,0x2, 0xd2,0x3d,0x7c, +0x2, 0xdb,0x1, 0xe5,0x3d,0xfd,0x2, 0xd8,0x0, 0xe2,0x14,0x1, 0x38,0x82,0x17,0x81, +0x17,0x0, 0xe1,0x2d,0x3c,0x19,0x26,0x84,0xe1,0x2d,0x3f,0x8e,0x2e,0x88,0x17,0x0, +0x2f,0x8c,0xe2,0x0, 0xcd,0x0, 0xe0,0x68,0x39,0x2e,0x38,0x82,0xe2,0x0, 0xcc,0x80, +0x4, 0x77,0x34,0xa1,0x37,0xa1,0x0, 0xee,0x3c,0x79,0x4, 0x83,0x3c,0x29,0x3f,0x4f, +0x37,0xc1,0x34,0xc1,0x0, 0xee,0x25,0xd, 0x17,0xa0,0x3f,0xaa,0xe2,0x0, 0xcf,0x80, +0x2, 0x9, 0xe0,0x41,0x3f,0xcf,0x16,0x0, 0xe0,0xd, 0x34,0x5f,0x3c,0x6c,0x3c,0xed, +0x38,0x82,0xe0,0xc, 0x34,0x5a,0xe0,0xf, 0x34,0x3f,0xe0,0xa, 0x34,0xda,0xe0,0xd, +0x3d,0x4f,0x0, 0xf5,0x3d,0xe8,0xe2,0x0, 0xcd,0x3, 0x5, 0xad,0xe0,0xc, 0x3c,0x49, +0xe2,0x0, 0xc6,0x3, 0x2e,0x28,0xc5,0x7c,0xe0,0xc, 0x35,0x21,0xe2,0x0, 0xc6,0x18, +0xe1,0x80,0xa7,0x99,0x26,0x8, 0xea,0x0, 0xce,0x81,0xe0,0x4a,0xce,0x88,0x3e,0xac, +0x3f,0x6f,0x3e,0x82,0xc5,0x70,0x6, 0x93,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b, +0xe1,0x80,0xa7,0x99,0xe1,0x80,0xbf,0x1b,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b, +0xe1,0x80,0xa7,0x99,0xc5,0x70,0xe1,0x80,0xbf,0x1b,0x6, 0x6f,0xe1,0x80,0xbf,0x9b, +0xe2,0x0, 0xc5,0x3, 0xc5,0x7f,0x6, 0x87,0xe1,0x80,0x86,0x19,0xc5,0x7f,0xe1,0x80, +0xae,0x1b,0x6, 0x7b,0x38,0x82,0x0, 0x0, 0xe2,0x0, 0xcd,0x3, 0x5, 0xb1,0xe2,0x1, +0xc4,0xff,0xe0,0xc, 0x34,0xa8,0x3c,0xcc,0xe4,0xc, 0x34,0xa0,0x3c,0xcc,0xe0,0x41, +0x3e,0x48,0xe2,0x0, 0xc6,0x3, 0xe0,0xb, 0x3e,0x18,0xe0,0xd, 0x3d,0x2c,0x3e,0x6d, +0xe2,0x0, 0xc6,0xc, 0x26,0x7, 0xea,0x0, 0xcf,0x81,0xe0,0x4a,0xcf,0xf8,0x3f,0xac, +0x3f,0x82,0xe1,0xff,0xc6,0xf0,0x6, 0x8b,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b, +0xe1,0x80,0xbc,0x9b,0xc6,0xf0,0xe1,0x80,0xbc,0x9b,0x6, 0x77,0x3d,0x18,0xe0,0xc0, +0xac,0xba,0xac,0x9a,0xac,0xaa,0xac,0x88,0xac,0x98,0xac,0xa8,0x38,0x82,0x3d,0xe8, +0xc5,0x7f,0x6, 0x85,0xe1,0x80,0xac,0x9b,0xc5,0x7f,0x6, 0x7d,0x38,0x82,0xe0,0x2, +0x1f,0xca,0xbc,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x4a,0xe0,0x3, 0x1c,0x2b,0xa7,0x8e, +0x3f,0xb8,0xe0,0x3, 0x1c,0x2c,0x3f,0x98,0xe0,0x3, 0x1c,0x2d,0xbf,0x8e,0x3c,0x5f, +0x38,0x82,0x8, 0xb1,0xe0,0x60,0x3c,0x87,0xea,0x25,0x7f,0xa8,0xe0,0x0, 0x15,0x60, +0x3c,0x6f,0xdf,0x71,0xe0,0x60,0x3c,0x17,0x8, 0xe1,0x0, 0x0, 0x0, 0x0, 0x2, 0xa8, +0x0, 0x0, 0x2, 0xb2,0x0, 0x0, 0x2, 0xbc,0x0, 0x0, 0x2, 0x94,0x0, 0x0, 0x2, 0x9e, +0x0, 0x0, 0x3, 0x3c,0x0, 0x0, 0x3, 0x44,0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x36, +0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x36, +0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x4a,0x0, 0x0, 0x3, 0x5a, +0x0, 0x0, 0x3, 0x6a,0x0, 0x0, 0x3, 0x6a,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32, +0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32, +0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32, +0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x6, 0x2a,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x6, 0x14, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0xf8,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0xe0, +0x0, 0x0, 0x5, 0xd2,0x0, 0x0, 0x5, 0xd2,0x0, 0x0, 0x5, 0xc4,0x0, 0x0, 0x5, 0xc4, +0x0, 0x0, 0x5, 0xc4,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0xb2,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x6, 0x6c,0x0, 0x0, 0x6, 0x6c, +0x0, 0x0, 0x6, 0x6c,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x8, 0xb2,0x0, 0x0, 0x6, 0x5e, +0x0, 0x0, 0x6, 0x50,0x0, 0x0, 0x5, 0xa4,0x0, 0x0, 0x5, 0x96,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x6, 0x7c,0x80,0x0, 0xd, 0x0, 0x80,0x0, 0xc, 0x0, +0x80,0x0, 0xb, 0x0, 0x80,0x0, 0xa, 0x0, 0x80,0x0, 0x9, 0x0, 0x80,0x0, 0x7, 0x0, +0x80,0x0, 0x5, 0x0, 0x80,0x0, 0x4, 0x0, 0x80,0x0, 0x3, 0x0, 0x80,0x0, 0x2, 0x0, +0x80,0x0, 0x1, 0x0, 0x80,0x0, 0x0, 0x0, 0x80,0x1, 0x20,0x0, 0x0, 0x3, 0x86,0x60, +0x0, 0x3, 0x80,0x0, 0x80,0x1, 0x40,0x0, 0x80,0x1, 0x10,0x0, 0x80,0x0, 0x6, 0x0, +0x80,0x0, 0x8, 0x0, 0x50,0x1, 0x32,0x2, 0x0, 0x3, 0xf0,0x4, 0xce,0x5, 0x9c,0x6, +0x84,0x7, 0x81,0x8, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, +0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, +0x2, 0x1, 0x0, 0x2, 0xeb,0xaa,0x8, 0x0, 0x0, 0x2, 0xb8,0xac,0x0, 0x1, 0x6, 0xc, +0x0, 0x1, 0x5, 0xca,0x0, 0x1, 0x5, 0x50,0x0, 0x1, 0x5, 0xca,0x0, 0x1, 0x5, 0xc0, +0x0, 0x1, 0x6, 0x2e,0x0, 0x1, 0x6, 0x24,0x0, 0x1, 0x5, 0x54,0x0, 0x1, 0x6, 0x24, +0x0, 0x1, 0x5, 0xc0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x3, 0x2, 0x1, 0x1, 0x1, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x4, 0x2, 0x2, 0x1, 0x1, 0x1, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, +0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, +0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0xd, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0xe, 0x7, 0x4, 0x3, 0x2, 0x2, 0x2, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0xf, 0x7, 0x5, 0x3, 0x3, 0x2, 0x2, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x2, 0x2, 0x3, 0x3, 0x3, 0x3, +0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, +0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, +0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, +0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, +0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, +0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, +0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, +0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7, +0x24,0x87,0x55,0x56,0x72,0x8d,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x31, +0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x0, 0x1, 0x1, 0x12,0x0, 0x20,0x0, 0x12,0x20,0x12,0x20,0x0, 0x0, 0x2, +0x40,0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, 0x1b,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, 0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, +0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, 0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, +0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, 0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, +0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, 0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, +0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, 0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, +0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, 0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, +0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, 0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, +0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, 0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, +0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, 0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, +0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, 0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, +0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, 0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, +0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, 0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, +0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, 0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, +0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, 0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, +0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, 0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, +0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, 0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, +0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, 0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, +0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, 0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, +0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, 0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, +0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, 0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, +0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, 0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, +0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, 0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, +0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, 0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, +0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, 0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, +0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, 0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, +0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, 0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, +0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, 0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, +0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, 0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, +0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, 0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, +0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, 0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, +0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, 0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, +0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, 0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, +0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, 0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, +0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, 0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, +0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, 0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, +0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, 0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, +0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, 0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, +0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, 0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, +0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, 0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, +0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, 0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, +0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, 0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, +0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, 0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, +0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, 0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, +0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, 0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, +0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, 0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, +0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, 0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, +0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, +0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, 0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, +0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, 0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, +0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, 0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, +0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, 0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, +0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, 0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, +0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, 0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, +0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, 0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, +0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, 0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, +0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, 0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, +0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, 0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, +0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, 0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, +0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, 0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, +0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, 0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, +0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, 0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, +0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, 0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, +0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, 0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, +0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, 0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, +0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, 0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, +0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, 0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, +0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, 0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, +0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, 0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, +0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, 0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, +0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, 0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, +0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, 0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, +0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, 0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, +0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, 0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, +0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, 0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, +0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, 0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, +0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, 0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, +0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, 0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, +0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, 0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, +0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, 0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, +0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, 0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, +0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, 0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, +0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, 0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, +0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, 0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, +0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, 0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, +0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, 0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, +0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, 0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, +0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, 0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, +0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, 0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, +0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, 0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, +0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, 0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, +0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, 0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, +0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, 0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, +0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, 0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, +0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, 0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, +0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, 0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, +0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, 0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, +0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, 0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, +0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, 0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, +0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, 0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, +0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, 0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, +0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, 0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, +0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, 0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, +0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, 0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, +0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, 0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, +0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, 0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, +0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, 0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, +0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, 0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, +0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, 0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, +0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, 0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, +0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, 0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, +0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, 0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, +0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, 0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, +0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, 0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, +0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, 0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, +0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, 0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, +0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, 0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, +0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, 0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, +0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, 0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, +0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, +0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, 0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, +0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, 0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, +0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, 0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, +0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, 0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, +0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, 0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, +0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, 0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, +0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, 0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, +0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, 0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, +0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, 0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, +0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, 0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, +0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, 0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, +0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, 0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, +0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, 0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, +0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, 0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, +0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, 0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, +0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, 0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, +0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, 0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, +0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, 0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, +0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, 0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, +0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, 0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, +0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, 0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, +0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, 0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, +0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, 0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, +0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, 0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, +0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, 0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, +0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x17,0x3, 0x5, 0x0, 0xd, 0x17,0x3, 0x5, 0x1, 0x10,0x17,0x3, 0x5, 0x2, 0x10, +0x2, 0x1, 0xa, 0x1e,0x24,0x8, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x0, 0xdc,0x0, 0xdc, +0x0, 0xd2,0x1, 0xf4,0x1, 0x90,0x1, 0x90,0x1, 0x2c,0x1, 0x2c,0xa, 0x0, 0x1, 0x1e, +0x1, 0x1, 0xc, 0x1e,0x3c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x1, 0x0, 0x1, 0x80,0x1, 0x0, +0x6, 0x1, 0xda,0x0, 0x1, 0x0, 0x16,0x1, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0xf9,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0xff,0xff,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8,0x5, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40,0x4, 0x0, 0x2, 0xd0, +0x1, 0x68,0x28,0x28,0x1, 0x40,0x1, 0x40,0x0, 0xa0,0x0, 0xa0,0x5, 0xa0,0x2, 0xd0, +0x2e,0x2e,0x1, 0x70,0x1, 0x70,0x0, 0xb4,0x0, 0xb4,0x12,0x0, 0xb4,0x1, 0x68,0x2, +0x1c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x7, 0xa8,0x1, 0x2c,0x0, 0x48,0x0, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x80,0x0, 0x64,0x7, 0xd0,0x8, 0x5, 0x6, 0x1, 0x2c,0x2, 0x58,0x1, +0x90,0x1f,0x40,0x37,0x1, 0x86,0x1, 0x86,0x0, 0x2, 0x17,0x11,0x12,0x1, 0x2c,0x0, +0xdc,0x3, 0x70,0x1, 0xb8,0x3, 0xa, 0xa, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x5, 0x50, +0x0, 0x32,0x1, 0x5e,0x1, 0x5e,0x3, 0x20,0x0, 0xc8,0x0, 0x28,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x2, 0xd0,0x0, 0x3c,0x3, 0xe8,0x1, 0x68,0x1, 0x68,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0xa0,0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0x0, 0x0, 0x2, 0x3b,0x8, 0x1, 0x0, 0x4, 0x0, 0x0, 0x5, 0x0, 0x20, +0x1, 0x0, 0x0, 0x0, 0x0, 0x5c,0x5c,0x0, 0x5c,0x5c,0x0, 0x5c,0x5c,0x0, 0x0, 0x0, +0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x0, 0x8b,0x0, 0x0, 0xff,0x0, 0x0, 0x0, +0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x64,0xff,0xff,0xff,0x30,0x0, 0xc, 0xc0, +0x40,0x33,0x2d,0x24,0x1e,0x18,0x10,0xa, 0xa, 0xe, 0x15,0x1e,0x24,0x2b,0x32,0x35, +0x2f,0x28,0x22,0x1a,0x13,0xa, 0x3, 0x0, 0x1, 0x4, 0xa, 0x12,0x1b,0x25,0x2c,0x31, +0x9, 0x0, 0x0, 0x2, 0x4, 0x8, 0xf, 0x19,0x20,0x27,0x2b,0x2d,0x2e,0x2e,0x2e,0x2c, +0x2c,0x2d,0x2e,0x32,0x35,0x3b,0x43,0x4d,0x56,0x5d,0x62,0x67,0x6a,0x6d,0x6e,0x70, +0xda,0xe1,0xff,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, 0x6, 0x4, +0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26,0x2a,0x30, +0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b,0x1f,0x23, +0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48,0x46,0x43, +0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x40,0x39,0x34,0x2f,0x2a,0x24,0x20,0x1b, +0x15,0x10,0xb, 0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x7, 0xa, 0xc, +0x10,0x15,0x19,0x1d,0x22,0x28,0x2d,0x31,0x4, 0x0, 0x0, 0x0, 0x1, 0x4, 0x6, 0x9, +0xd, 0x11,0x16,0x1b,0x21,0x27,0x2c,0x30,0x35,0x3c,0x42,0x46,0x4a,0x51,0x57,0x5b, +0x60,0x63,0x65,0x64,0x61,0x5d,0x59,0x56,0x89,0x65,0x34,0x55,0x0, 0x3, 0x4, 0x6, +0x7, 0x9, 0x9, 0xb, 0xd, 0xf, 0x13,0x16,0x19,0x1d,0x20,0x22,0x26,0x29,0x2b,0x2b, +0x2d,0x2e,0x30,0x31,0x33,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x13,0x19,0x1e,0x22, +0x26,0x29,0x2c,0x31,0x35,0x39,0x3c,0x3e,0x3f,0x3e,0x3b,0x38,0x35,0x32,0x2f,0x2c, +0x28,0x24,0x20,0x1c,0x19,0x16,0x12,0xe, 0xa, 0x6, 0x3, 0x1, 0x97,0xae,0xff,0x55, +0x14,0x1a,0x1f,0x25,0x2a,0x2d,0x2d,0x28,0x24,0x1f,0x1b,0x17,0x12,0xe, 0xc, 0xa, +0x8, 0x8, 0x8, 0x8, 0xa, 0xe, 0x13,0x17,0x1b,0x20,0x26,0x2c,0x32,0x36,0x3c,0x3d, +0x2c,0x2b,0x2a,0x27,0x24,0x21,0x1c,0x1a,0x1a,0x1c,0x1e,0x20,0x25,0x2a,0x2e,0x32, +0x37,0x3b,0x3f,0x43,0x47,0x4c,0x50,0x51,0x53,0x54,0x55,0x56,0x57,0x57,0x57,0x57, +0xdd,0x4, 0x33,0x55,0xe, 0x15,0x1b,0x21,0x26,0x2a,0x30,0x36,0x3a,0x3d,0x3e,0x3d, +0x3a,0x36,0x32,0x2d,0x28,0x1c,0x16,0x10,0xa, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xa, +0x15,0x29,0x39,0x39,0x37,0x35,0x32,0x2f,0x2c,0x29,0x24,0x1e,0x18,0x12,0xd, 0x9, +0x5, 0x1, 0x0, 0x0, 0x0, 0x5, 0x9, 0xe, 0x14,0x1c,0x24,0x2c,0x35,0x3e,0x45,0x4a, +0x4b,0x45,0x3f,0x3f,0xf3,0x41,0x33,0x55,0xa, 0x12,0x1a,0x1e,0x23,0x26,0x25,0x1f, +0x1b,0x12,0xa, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, 0x2, 0x6, 0x11,0x19,0x1d,0x26,0x31, +0x36,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x33,0x2c,0x23,0x1e,0x16,0xe, 0x9, 0x1, +0x1, 0x6, 0x11,0x16,0x1f,0x25,0x2e,0x39,0x3e,0x46,0x49,0x48,0x43,0x3f,0x35,0x2a, +0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa2,0x28,0x33,0x55,0x3, 0xb, 0x10,0x15, +0x1a,0x1e,0x21,0x27,0x29,0x28,0x25,0x20,0x1b,0xe, 0x9, 0x7, 0x5, 0x3, 0x1, 0x0, +0x0, 0x1, 0x3, 0x5, 0x9, 0x16,0x1f,0x29,0x33,0x36,0x36,0x36,0x22,0x20,0x1f,0x1e, +0x1b,0x18,0x15,0xc, 0x7, 0x2, 0x0, 0x0, 0x2, 0xb, 0x10,0x14,0x18,0x1c,0x21,0x2b, +0x2f,0x33,0x37,0x3b,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3b,0x3b,0x6, 0x43,0x33,0x55, +0x4, 0xc, 0x13,0x1a,0x20,0x26,0x2c,0x32,0x34,0x31,0x2b,0x24,0x1b,0x14,0xd, 0x6, +0x3, 0x1, 0x0, 0x0, 0x0, 0x2, 0x7, 0xe, 0x16,0x1d,0x23,0x29,0x30,0x36,0x3d,0x3e, +0x1b,0x1c,0x1d,0x1d,0x1d,0x1c,0x1a,0x16,0x10,0x9, 0x3, 0x0, 0x0, 0x3, 0xa, 0x12, +0x19,0x1f,0x25,0x2c,0x32,0x39,0x3f,0x44,0x47,0x48,0x47,0x46,0x43,0x3f,0x3b,0x3a, +0x7c,0x49,0x33,0x55,0xb, 0x14,0x1b,0x23,0x2e,0x34,0x38,0x39,0x36,0x32,0x2b,0x24, +0x18,0x12,0xd, 0x9, 0x4, 0x2, 0x0, 0x0, 0x2, 0x6, 0xd, 0x13,0x1f,0x25,0x2c,0x33, +0x3e,0x3f,0x3f,0x3f,0x24,0x26,0x26,0x26,0x25,0x22,0x1d,0x16,0xb, 0x5, 0x2, 0x0, +0x2, 0x6, 0xc, 0x13,0x1d,0x23,0x29,0x2f,0x3a,0x40,0x45,0x47,0x49,0x49,0x48,0x46, +0x42,0x41,0x41,0x41,0xd3,0x80,0x33,0x55,0x0, 0x8, 0x10,0x16,0x1d,0x23,0x2b,0x30, +0x32,0x32,0x30,0x2c,0x26,0x1e,0x18,0x11,0xb, 0x9, 0x6, 0x5, 0x4, 0x4, 0x6, 0xa, +0x11,0x19,0x21,0x28,0x2f,0x36,0x3c,0x3f,0x1f,0x21,0x22,0x22,0x21,0x20,0x1d,0x18, +0x12,0xc, 0x6, 0x2, 0x0, 0x0, 0x3, 0x9, 0x12,0x19,0x20,0x26,0x2c,0x34,0x3b,0x41, +0x45,0x48,0x49,0x48,0x46,0x42,0x3e,0x3c,0xdb,0x35,0x33,0x55,0x4, 0xb, 0x13,0x1b, +0x23,0x2a,0x29,0x1f,0x16,0xe, 0x6, 0x2, 0x0, 0x0, 0x3, 0x7, 0x10,0x19,0x22,0x2b, +0x33,0x38,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x2c,0x27,0x21,0x1b, +0x15,0xd, 0x4, 0x0, 0x1, 0x5, 0xc, 0x14,0x1d,0x28,0x32,0x36,0x3d,0x3f,0x3e,0x3c, +0x36,0x2e,0x26,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xb5,0x6c,0x33,0x55, +0x17,0x1c,0x20,0x27,0x2b,0x30,0x39,0x3d,0x3f,0x3d,0x3a,0x35,0x2b,0x25,0x20,0x17, +0x13,0xe, 0x6, 0x3, 0x0, 0x0, 0x2, 0x9, 0xd, 0x11,0x19,0x1a,0x1a,0x1a,0x1a,0x1a, +0xa, 0x11,0x16,0x1d,0x20,0x23,0x23,0x1f,0x1a,0x10,0xb, 0x7, 0x1, 0x0, 0x0, 0x2, +0x4, 0x7, 0x10,0x16,0x21,0x26,0x2b,0x35,0x39,0x3c,0x3f,0x40,0x40,0x40,0x40,0x40, +0x68,0xc0,0x33,0x55,0xa, 0x10,0x1a,0x1e,0x26,0x2c,0x2d,0x2c,0x29,0x20,0x15,0xf, +0x6, 0x3, 0x0, 0x0, 0x0, 0x3, 0x7, 0x10,0x1c,0x22,0x2d,0x37,0x3c,0x3f,0x3f,0x3f, +0x3f,0x3f,0x3f,0x3f,0x2b,0x29,0x24,0x21,0x1a,0x12,0xe, 0x5, 0x2, 0x0, 0x1, 0x3, +0xb, 0x10,0x1a,0x25,0x29,0x32,0x36,0x3d,0x3f,0x3e,0x3a,0x33,0x2e,0x29,0x29,0x29, +0x29,0x29,0x29,0x29,0x1e,0x4d,0x33,0x55,0x0, 0x1, 0x3, 0x5, 0x6, 0x8, 0xb, 0xd, +0x11,0x13,0x16,0x16,0x1a,0x1f,0x21,0x24,0x26,0x28,0x2a,0x2f,0x35,0x36,0x38,0x39, +0x3a,0x3c,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x42,0x37,0x2d,0x23,0x1d,0x12,0x7, 0x1, +0x9, 0x13,0x1f,0x25,0x31,0x3b,0x36,0x2c,0x20,0x1a,0xf, 0x2, 0x9, 0x11,0x20,0x2d, +0x35,0x40,0x47,0x47,0x47,0x47,0x47,0x47,0xff,0x1f,0x32,0x55,0x0, 0x0, 0x2, 0x3, +0x6, 0x9, 0xc, 0xf, 0x13,0x18,0x1c,0x1d,0x1e,0x1e,0x1e,0x1d,0x1d,0x23,0x26,0x2a, +0x2d,0x32,0x38,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3a,0x3a,0x3a,0x40,0x35,0x2f,0x28, +0x21,0x1a,0x13,0xd, 0x7, 0x1, 0x4, 0xb, 0x11,0x17,0x1d,0x24,0x2b,0x2a,0x22,0x1c, +0x15,0xf, 0x8, 0x3, 0x8, 0xf, 0x16,0x1d,0x23,0x29,0x31,0x32,0xa5,0xf2,0x32,0x55, +0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6, 0xe, 0x13,0x16,0x18,0x1b,0x1e,0x1e,0x1e, +0x1f,0x1f,0x21,0x24,0x2c,0x30,0x35,0x3a,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x40,0x39,0x30,0x27,0x22,0x19,0x10,0xd, 0x13,0x1c,0x25,0x2a,0x33,0x32,0x2d,0x23, +0x18,0x12,0x9, 0x1, 0x3, 0x9, 0x13,0x1e,0x23,0x26,0x26,0x26,0x26,0x26,0x26,0x26, +0x7b,0x12,0x32,0x55,0x19,0x14,0x11,0xc, 0x9, 0x5, 0x2, 0x0, 0x4, 0x9, 0xd, 0x11, +0x1b,0x20,0x22,0x23,0x23,0x23,0x26,0x27,0x2a,0x2d,0x30,0x37,0x39,0x3c,0x3d,0x3f, +0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x10,0x1d,0x23,0x2e,0x36,0x3d,0x35,0x27,0x1e,0x16, +0xe, 0x14,0x21,0x28,0x34,0x39,0x30,0x29,0x1d,0x16,0x10,0x16,0x1d,0x2c,0x34,0x3f, +0x3f,0x3f,0x3f,0x3f,0xe1,0xb1,0x32,0x55,0xb, 0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, +0x5, 0xf, 0x13,0x17,0x1b,0x1e,0x21,0x20,0x1d,0x19,0x17,0x16,0x16,0x19,0x1e,0x23, +0x28,0x31,0x35,0x39,0x3c,0x3f,0x3f,0x3f,0x40,0x3a,0x35,0x30,0x2b,0x25,0x20,0x1b, +0x17,0x16,0x1a,0x1e,0x23,0x27,0x2a,0x27,0x22,0x17,0x12,0xd, 0x8, 0x4, 0x1, 0x0, +0x0, 0x7, 0xb, 0xf, 0x13,0x15,0x15,0x15,0x4b,0xbb,0x32,0x55,0x0, 0x3, 0x8, 0xa, +0x11,0x14,0x1c,0x20,0x24,0x25,0x25,0x24,0x23,0x25,0x27,0x2d,0x30,0x36,0x3b,0x3f, +0x3f,0x3f,0x3f,0x3e,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x29,0x22,0x18,0x12, +0x8, 0x4, 0x0, 0x1, 0xc, 0x12,0x1c,0x22,0x2b,0x2a,0x24,0x18,0x12,0xa, 0x8, 0xf, +0x14,0x1e,0x23,0x2e,0x34,0x3d,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0xc6,0x28,0x32,0x55, +0x1f,0x1b,0x17,0x14,0x13,0x12,0x11,0x11,0x12,0x14,0x1a,0x1d,0x21,0x23,0x24,0x24, +0x25,0x24,0x24,0x23,0x21,0x21,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1a,0x1d,0x23,0x29,0x2c,0x34,0x3b,0x3e,0x47,0x4e,0x53,0x51,0x4b,0x44,0x42,0x3c, +0x35,0x32,0x2c,0x25,0x1e,0x1c,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, +0xfa,0xf6,0x30,0x55,0x23,0x1e,0x1c,0x1a,0x18,0x17,0x16,0x15,0x15,0x14,0x14,0x14, +0x14,0x16,0x19,0x1d,0x21,0x25,0x28,0x2a,0x2b,0x2c,0x2d,0x2d,0x2c,0x2b,0x2a,0x29, +0x28,0x27,0x27,0x27,0x2f,0x36,0x3a,0x3e,0x43,0x48,0x4d,0x52,0x56,0x5b,0x60,0x65, +0x6a,0x6e,0x71,0x72,0x72,0x70,0x6c,0x67,0x62,0x5d,0x57,0x51,0x4c,0x47,0x43,0x3e, +0x38,0x34,0x31,0x31,0xe4,0xae,0x30,0x55,0x7, 0x5, 0x4, 0x4, 0x5, 0x6, 0xd, 0x14, +0x1c,0x22,0x28,0x2f,0x34,0x37,0x39,0x3a,0x39,0x38,0x36,0x32,0x2c,0x26,0x1a,0x14, +0xe, 0xb, 0x8, 0x6, 0x6, 0x5, 0x5, 0x5, 0x33,0x3d,0x43,0x4b,0x51,0x58,0x64,0x69, +0x68,0x65,0x61,0x55,0x4d,0x43,0x3b,0x32,0x22,0x1a,0x13,0xb, 0x7, 0x5, 0x8, 0xf, +0x16,0x1e,0x24,0x30,0x37,0x3c,0x3c,0x3c,0x71,0x75,0x30,0x55,0x3, 0x0, 0x0, 0x0, +0x0, 0x3, 0x7, 0xe, 0x1b,0x22,0x2d,0x32,0x37,0x3a,0x3c,0x3d,0x3c,0x3a,0x38,0x34, +0x29,0x21,0x15,0xc, 0x7, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2a,0x34,0x3c,0x47, +0x4d,0x59,0x60,0x66,0x67,0x66,0x5e,0x58,0x51,0x45,0x3e,0x30,0x29,0x22,0x17,0xf, +0x5, 0x3, 0x6, 0xb, 0x11,0x1b,0x21,0x2d,0x2e,0x2e,0x2e,0x2e,0x6a,0x73,0x30,0x55, +0xc, 0x5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5, 0xc, 0x13,0x1e,0x25,0x30,0x35,0x3b, +0x3d,0x3f,0x3f,0x3d,0x3c,0x38,0x33,0x28,0x22,0x18,0x12,0xe, 0xd, 0xd, 0xd, 0xd, +0x11,0x19,0x1f,0x2a,0x30,0x3c,0x42,0x4f,0x55,0x5f,0x63,0x64,0x61,0x59,0x51,0x44, +0x3d,0x2e,0x26,0x1c,0x16,0xa, 0x3, 0x0, 0x0, 0x4, 0x8, 0xe, 0xf, 0xf, 0xf, 0xf, +0x7d,0xd0,0x30,0x55,0x15,0xd, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8, 0xf, +0x17,0x1f,0x2d,0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3e,0x3a,0x32,0x2c,0x26,0x20,0x19, +0xf, 0xc, 0xc, 0xc, 0x3, 0x9, 0xf, 0x17,0x1e,0x28,0x2e,0x35,0x3b,0x42,0x50,0x56, +0x57,0x56,0x50,0x49,0x41,0x39,0x31,0x25,0x1e,0x17,0xf, 0x5, 0x1, 0x0, 0x0, 0x1, +0x7, 0x9, 0x9, 0x9, 0xca,0xac,0x30,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, +0x0, 0x0, 0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40, +0x3f,0x3e,0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14, +0x1b,0x21,0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26, +0x20,0x1c,0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x21,0x13,0xc, 0x8, +0x5, 0x2, 0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d, +0x3e,0x3f,0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14, +0x1a,0x22,0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31, +0x2b,0x25,0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55, +0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, +0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e,0x3f,0x3f, +0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25,0x2c,0x35, +0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25,0x1f,0x1c, +0xf9,0xa2,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x3e,0x3d,0x3a,0x35, +0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x1, 0x4, 0x8, 0xd, +0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29,0x22,0x1b,0x15,0x10,0xa, 0x5, +0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c,0x24,0x2a,0x30,0x35,0x3b,0x40, +0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, 0x4, 0x7, 0xa, 0x10,0x17,0x21, +0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b,0x38,0x31,0x29,0x21,0x18,0xf, +0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35,0x3d,0x45,0x4b,0x51,0x53,0x52, +0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17,0x11,0x9, 0x3, 0x0, 0x0, 0x2, +0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6,0x30,0x55,0x7, 0x3, 0x3, 0x3, +0x4, 0x7, 0xf, 0x17,0x20,0x28,0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d, +0x25,0x1d,0x16,0xd, 0x8, 0x2, 0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50, +0x59,0x5f,0x67,0x68,0x63,0x5d,0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, +0x0, 0x0, 0x1, 0x7, 0xe, 0x19,0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55, +0x37,0x38,0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, +0x2, 0x5, 0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e, +0x30,0x40,0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20, +0x1a,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c, +0x37,0xc3,0x57,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, +0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40, +0x3f,0x3f,0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53, +0x4a,0x40,0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21, +0x2a,0x32,0x39,0x3e,0x7, 0x90,0x57,0x55,0x18,0x2c,0x34,0x39,0x3c,0x3d,0x3f,0x3f, +0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, 0x6, 0x1, 0x0, 0x0, 0x0, 0x1, +0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, 0x8, 0xe, 0x14,0x1a,0x21,0x28, +0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58,0x51,0x48,0x3f,0x38,0x31,0x2b, +0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf,0x57,0x55,0x16,0x7, 0x2, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28,0x30,0x38,0x3c,0x3e,0x3f,0x40, +0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16,0xf, 0xc, 0x53,0x46,0x3e,0x35, +0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, 0x13,0x1a,0x20,0x27, +0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a,0x58,0x57,0xc6,0x55,0x57,0x55, +0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38,0x3c,0x3e,0x3f,0x3e,0x3d,0x3b, +0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, +0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17,0x20,0x2a,0x32,0x3b, +0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57,0x4f,0x47,0x40,0x38,0x32,0x2f, +0x1a,0xb5,0x57,0x55,0x0, 0xb, 0x14,0x1b,0x21,0x28,0x2f,0x37,0x3d,0x3f,0x3e,0x3c, +0x39,0x33,0x2b,0x23,0x1c,0x15,0xc, 0x5, 0x3, 0x3, 0x6, 0x9, 0xd, 0x12,0x18,0x1e, +0x24,0x2c,0x33,0x36,0x19,0x13,0x10,0x10,0xf, 0xf, 0x11,0x16,0x1c,0x25,0x2d,0x33, +0x39,0x40,0x47,0x4a,0x4c,0x4c,0x49,0x43,0x3b,0x33,0x2d,0x26,0x20,0x1a,0x14,0xe, +0xa, 0x5, 0x1, 0x0, 0xb0,0xb5,0x57,0x55,0x2, 0x9, 0xf, 0x1a,0x1f,0x29,0x2f,0x38, +0x3b,0x3e,0x3f,0x3f,0x3b,0x37,0x2e,0x29,0x1e,0x18,0xe, 0xa, 0x3, 0x1, 0x0, 0x0, +0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x3, 0x5, 0x9, 0xd, 0x18, +0x1e,0x27,0x2d,0x32,0x3c,0x3f,0x45,0x46,0x45,0x44,0x3e,0x39,0x2f,0x2a,0x25,0x1a, +0x14,0xc, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x2b,0x77,0x57,0x55,0x0, 0x1, 0x2, 0x4, +0x5, 0x8, 0xa, 0xf, 0x12,0x15,0x18,0x1a,0x1f,0x22,0x24,0x25,0x26,0x26,0x28,0x2a, +0x2c,0x2f,0x33,0x36,0x37,0x39,0x3a,0x3c,0x3e,0x3f,0x3f,0x3f,0x1, 0xf, 0x1b,0x2d, +0x3d,0x52,0x5f,0x6a,0x60,0x4a,0x39,0x2a,0x17,0xb, 0x4, 0xe, 0x1e,0x2e,0x42,0x50, +0x62,0x6b,0x65,0x53,0x43,0x31,0x23,0x13,0x7, 0x2, 0x2, 0x2, 0xa2,0x22,0x31,0x55, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x6, 0xa, 0xe, 0x12,0x15,0x18,0x1a, +0x1e,0x21,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x29,0x2f,0x34,0x3a,0x3e,0x3e,0x3e, +0x1, 0xa, 0x11,0x17,0x1e,0x24,0x29,0x2e,0x34,0x34,0x2d,0x24,0x1c,0x14,0xe, 0x8, +0x3, 0x9, 0x10,0x19,0x22,0x2a,0x31,0x36,0x3b,0x38,0x2f,0x24,0x19,0x11,0x11,0x11, +0x4c,0x9f,0x31,0x55,0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0xa, 0xc, 0x10,0x15,0x19, +0x1b,0x1f,0x1e,0x1e,0x1d,0x1c,0x1c,0x1e,0x21,0x29,0x31,0x3a,0x3e,0x3f,0x3f,0x3f, +0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x14,0x1d,0x23,0x2d,0x34,0x2d,0x29,0x1e,0x13,0xb, +0x6, 0x6, 0x10,0x19,0x1e,0x29,0x32,0x3c,0x3e,0x34,0x28,0x1b,0x14,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0xef,0x5, 0x31,0x55,0x0, 0x2, 0x4, 0x5, 0x6, 0x7, 0x9, 0xa, +0xd, 0xf, 0x11,0x12,0x14,0x16,0x19,0x1c,0x1f,0x22,0x24,0x24,0x26,0x29,0x2f,0x31, +0x33,0x35,0x37,0x39,0x3a,0x3c,0x3e,0x3e,0x6, 0x10,0x17,0x1d,0x23,0x2a,0x31,0x39, +0x3c,0x36,0x2f,0x28,0x21,0x1a,0x13,0x10,0x16,0x22,0x29,0x2f,0x36,0x3d,0x3b,0x34, +0x2e,0x27,0x21,0x1a,0x13,0xc, 0x4, 0x2, 0x56,0x3f,0x31,0x55,0x0, 0x2, 0x5, 0x7, +0xa, 0xc, 0xe, 0x14,0x17,0x1b,0x1f,0x25,0x27,0x28,0x28,0x29,0x29,0x2d,0x30,0x33, +0x36,0x39,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x8, 0xf, 0x18,0x23, +0x2d,0x37,0x40,0x41,0x3d,0x34,0x2b,0x24,0x2d,0x35,0x3e,0x47,0x4a,0x42,0x38,0x2c, +0x20,0x15,0xb, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xf6,0x5, 0x31,0x55, +0x0, 0x1, 0x3, 0x5, 0x6, 0x7, 0x9, 0xa, 0xc, 0xd, 0xf, 0x13,0x14,0x15,0x18,0x1a, +0x21,0x25,0x26,0x27,0x27,0x27,0x2c,0x2f,0x36,0x3a,0x3d,0x3f,0x3f,0x3f,0x3f,0x3f, +0x0, 0x6, 0xb, 0x14,0x1a,0x1f,0x29,0x2e,0x37,0x3b,0x3e,0x37,0x32,0x2e,0x25,0x20, +0x18,0x1c,0x21,0x29,0x2d,0x31,0x33,0x2d,0x21,0x1b,0x15,0x10,0x10,0x10,0x10,0x10, +0x22,0x55,0x31,0x55,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x7, 0xc, 0x10,0x13,0x16, +0x19,0x1b,0x1f,0x22,0x22,0x23,0x23,0x23,0x23,0x26,0x2c,0x31,0x34,0x36,0x38,0x3a, +0x3b,0x3d,0x3f,0x3f,0xa, 0x12,0x1b,0x24,0x2d,0x34,0x3c,0x43,0x42,0x3b,0x33,0x2b, +0x22,0x1c,0x15,0x15,0x1b,0x26,0x2d,0x34,0x3a,0x41,0x41,0x3b,0x33,0x2b,0x22,0x1a, +0x11,0xa, 0x2, 0x1, 0xfa,0x31,0x31,0x55,0x2, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x6, +0xa, 0x12,0x15,0x1b,0x1d,0x1f,0x1e,0x1e,0x1d,0x1d,0x1d,0x1f,0x23,0x2a,0x2f,0x36, +0x39,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x0, 0x8, 0xe, 0x19,0x1e,0x29,0x2e,0x30, +0x2d,0x23,0x1d,0x13,0xe, 0x13,0x17,0x21,0x25,0x30,0x35,0x3e,0x3f,0x3a,0x35,0x2b, +0x27,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xc8,0x46,0x31,0x55,0x0, 0x3, 0x5, 0xc, +0x11,0x18,0x1c,0x1f,0x1f,0x1e,0x1e,0x1d,0x1d,0x23,0x26,0x2e,0x32,0x3b,0x3d,0x3f, +0x3f,0x3f,0x40,0x40,0x3f,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x1e,0x25,0x29,0x31, +0x36,0x3d,0x3f,0x39,0x35,0x2c,0x27,0x1c,0x17,0x1b,0x1f,0x2a,0x2f,0x37,0x34,0x2b, +0x27,0x1f,0x1b,0x11,0xc, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x5, 0xb3,0x31,0x55, +0x1, 0x3, 0x0, 0x0, 0x0, 0x2, 0xc2,0xfc,0x2, 0xff,0x40,0x0, 0x0, 0x0, 0x0, 0x1, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x51,0x0, +0x0, 0x2, 0x50,0xf9,0x0, 0x2, 0x50,0xf8,0x0, 0x2, 0x4f,0x47,0x0, 0x2, 0x50,0xf4, +0x0, 0x2, 0x50,0xf5,0x0, 0x2, 0x4f,0xc0,0x0, 0x2, 0x50,0xed,0x0, 0x2, 0x50,0xec, +0x0, 0x2, 0x51,0x1, 0x0, 0x2, 0x51,0x2, 0x0, 0x2, 0x4f,0x44,0x0, 0x2, 0x1b,0x50, +0x0, 0x2, 0x2c,0xff,0x0, 0x0, 0x3a,0x9c,0x0, 0x2, 0xc2,0xe0,0x0, 0x2, 0xbb,0x6c, +0x0, 0x2, 0x2d,0x0, 0x0, 0x2, 0x2c,0xfe,0x0, 0x2, 0x3b,0x2, 0x0, 0x2, 0x34,0xb0, +0x0, 0x2, 0x2e,0x60,0x0, 0x2, 0x34,0xb2,0x0, 0x2, 0x23,0x12,0x0, 0x2, 0xc6,0xe4, +0x0, 0x2, 0x24,0xd2,0x0, 0x2, 0x24,0xd4,0x0, 0x2, 0x23,0x22,0x0, 0x2, 0x23,0xa, +0x0, 0x2, 0x24,0x74,0x0, 0x2, 0x23,0xf, 0x0, 0x1, 0x28,0x40,0x0, 0x2, 0x24,0x75, +0x0, 0x2, 0x24,0xce,0x0, 0x2, 0x4e,0xfc,0x0, 0x0, 0x3b,0x6e,0x0, 0x0, 0x3b,0x60, +0x0, 0x2, 0x24,0x79,0x0, 0x1, 0x28,0x6c,0x0, 0x2, 0x23,0x54,0x0, 0x2, 0x4e,0x10, +0x0, 0x1, 0x28,0x54,0x0, 0x2, 0x2c,0xa2,0x0, 0x2, 0xe, 0x56,0x0, 0x1, 0x28,0x44, +0x0, 0x2, 0xbc,0x6c,0x0, 0x1, 0x28,0x74,0x0, 0x2, 0xe, 0x78,0x0, 0x2, 0x3b,0x4, +0x0, 0x0, 0x3a,0x90,0x0, 0x2, 0xe, 0x4c,0x0, 0x2, 0xc6,0xe6,0x0, 0x2, 0x23,0x27, +0x0, 0x2, 0x24,0x87,0x0, 0x2, 0xbb,0xac,0x0, 0x2, 0xc6,0xe8,0x0, 0x2, 0x2c,0xa0, +0x0, 0x2, 0xe, 0x29,0x0, 0x2, 0xe, 0x28,0x0, 0x2, 0xe, 0x2d,0x0, 0x2, 0xe, 0x2c, +0x0, 0x2, 0xe, 0x2f,0x0, 0x2, 0xe, 0x2e,0x0, 0x2, 0xe, 0x2b,0x0, 0x2, 0xe, 0x2a, +0x0, 0x2, 0xe, 0x41,0x0, 0x2, 0xe, 0x40,0x0, 0x2, 0xe, 0x35,0x0, 0x2, 0xe, 0x34, +0x0, 0x2, 0xe, 0x36,0x0, 0x2, 0xe, 0x37,0x0, 0x2, 0xe, 0x31,0x0, 0x2, 0xe, 0x30, +0x0, 0x2, 0xe, 0x33,0x0, 0x2, 0xe, 0x32,0x0, 0x2, 0xe, 0x27,0x0, 0x2, 0xe, 0x25, +0x0, 0x2, 0xe, 0x45,0x0, 0x2, 0xe, 0x44,0x0, 0x2, 0xe, 0x43,0x0, 0x2, 0xe, 0x42, +0x0, 0x2, 0xe, 0x47,0x0, 0x2, 0xe, 0x46,0x0, 0x2, 0xe, 0xf, 0x0, 0x2, 0xe, 0x21, +0x0, 0x2, 0xe, 0x20,0x0, 0x2, 0xe, 0xe, 0x0, 0x2, 0xe, 0x19,0x0, 0x2, 0xe, 0x1d, +0x0, 0x2, 0xe, 0x18,0x0, 0x2, 0xe, 0x1c,0x0, 0x2, 0xe, 0x17,0x0, 0x2, 0xe, 0x16, +0x0, 0x2, 0xe, 0x15,0x0, 0x2, 0xe, 0x14,0x0, 0x2, 0xe, 0x13,0x0, 0x2, 0xe, 0x12, +0x0, 0x2, 0xe, 0x11,0x0, 0x2, 0xe, 0x10,0x0, 0x2, 0xd, 0xc1,0x0, 0x2, 0xd, 0xc0, +0x0, 0x2, 0xd, 0xb9,0x0, 0x2, 0xd, 0xbd,0x0, 0x2, 0xd, 0xbc,0x0, 0x2, 0xd, 0xbf, +0x0, 0x2, 0xd, 0xbe,0x0, 0x2, 0xd, 0xb7,0x0, 0x2, 0xd, 0xa5,0x0, 0x2, 0xd, 0xb6, +0x0, 0x2, 0xd, 0xa4,0x0, 0x2, 0xd, 0xb4,0x0, 0x2, 0xd, 0xb5,0x0, 0x2, 0xd, 0xb8, +0x0, 0x2, 0xd, 0xbb,0x0, 0x2, 0xd, 0xba,0x0, 0x2, 0xd, 0xb3,0x0, 0x2, 0xd, 0xb2, +0x0, 0x2, 0xd, 0xaf,0x0, 0x2, 0xd, 0xae,0x0, 0x2, 0xd, 0xab,0x0, 0x2, 0xd, 0xb1, +0x0, 0x2, 0xd, 0xb0,0x0, 0x2, 0xd, 0xa9,0x0, 0x2, 0xd, 0xa8,0x0, 0x2, 0xd, 0xa3, +0x0, 0x2, 0xd, 0xa2,0x0, 0x2, 0xd, 0xa7,0x0, 0x2, 0xd, 0xa6,0x0, 0x2, 0xd, 0xaa, +0x0, 0x2, 0xd, 0xad,0x0, 0x2, 0xd, 0xac,0x0, 0x2, 0xd, 0x37,0x0, 0x2, 0xd, 0x36, +0x0, 0x2, 0xd, 0x33,0x0, 0x2, 0xd, 0x32,0x0, 0x2, 0xd, 0x29,0x0, 0x2, 0xd, 0x28, +0x0, 0x2, 0xd, 0x2d,0x0, 0x2, 0xd, 0x2b,0x0, 0x2, 0xd, 0x2c,0x0, 0x2, 0xd, 0x2a, +0x0, 0x2, 0xd, 0x31,0x0, 0x2, 0xd, 0x27,0x0, 0x2, 0xd, 0x30,0x0, 0x2, 0xd, 0x26, +0x0, 0x2, 0xd, 0x1c,0x0, 0x2, 0xd, 0x25,0x0, 0x2, 0xd, 0x24,0x0, 0x2, 0xd, 0x1b, +0x0, 0x2, 0xd, 0x38,0x0, 0x2, 0x0, 0x6d,0x0, 0x2, 0xe, 0xc, 0x0, 0x2, 0xe, 0xb, +0x0, 0x2, 0xd, 0x1a,0x0, 0x2, 0xd, 0xa1,0x0, 0x2, 0xd, 0xe3,0x0, 0x2, 0xd, 0xe2, +0x0, 0x2, 0xd, 0xe1,0x0, 0x2, 0xd, 0x23,0x0, 0x2, 0xd, 0x22,0x0, 0x2, 0x0, 0x0, +0x0, 0x2, 0xe, 0x6c,0x0, 0x0, 0x3b,0x7c,0x0, 0x2, 0x23,0x21,0x0, 0x2, 0xc2,0xc8, +0x0, 0x2, 0x23,0x6, 0x0, 0x0, 0x36,0x68,0x0, 0x2, 0x51,0x4, 0x0, 0x2, 0x4e,0x74, +0x0, 0x2, 0x4f,0x0, 0x0, 0x2, 0x51,0x24,0x0, 0x2, 0xa8,0x18,0x0, 0x2, 0xbb,0xb8, +0x0, 0x2, 0xc2,0xf8,0x0, 0x1, 0x28,0x60,0x0, 0x2, 0xa6,0xde,0x0, 0x2, 0x85,0xf8, +0x0, 0x2, 0xa6,0xea,0x0, 0x2, 0xa6,0xe6,0x0, 0x2, 0xa6,0xe2,0x0, 0x2, 0xa6,0xe8, +0x0, 0x2, 0xa6,0xe4,0x0, 0x0, 0x66,0x5e,0x0, 0x2, 0x66,0x5c,0x0, 0x2, 0x60,0xa, +0x0, 0x0, 0xa6,0xb8,0x0, 0x0, 0xa6,0x90,0x0, 0x2, 0x66,0x5e,0x0, 0x2, 0xa5,0x90, +0x0, 0x2, 0xa6,0x8, 0x0, 0x2, 0xa5,0x92,0x0, 0x2, 0x79,0x54,0x0, 0x2, 0xa6,0x84, +0x0, 0x2, 0xa6,0xe0,0x0, 0x2, 0xa6,0x90,0x0, 0x2, 0xa6,0xb8,0x0, 0x0, 0xa6,0xe0, +0x0, 0x2, 0x7f,0xa6,0x0, 0x2, 0x98,0xee,0x0, 0x2, 0x92,0x9c,0x0, 0x2, 0x73,0x2, +0x0, 0x2, 0x6c,0xb0,0x0, 0x2, 0x60,0xc, 0x0, 0x2, 0xa7,0xd3,0x0, 0x2, 0xa7,0xd2, +0x0, 0x2, 0xa6,0x88,0x0, 0x2, 0xa6,0x8c,0x0, 0x0, 0x3b,0x44,0x0, 0x2, 0xc6,0xea, +0x0, 0x2, 0x4e,0xa8,0x0, 0x2, 0xe, 0x84,0x0, 0x2, 0x23,0x2a,0x0, 0x2, 0x41,0x5a, +0x0, 0x2, 0x3b,0x8, 0x0, 0x2, 0x23,0x9, 0x0, 0x2, 0x23,0x3, 0x0, 0x2, 0xb8,0xcc, +0x0, 0x2, 0x24,0x80,0x0, 0x1, 0x28,0x58,0x0, 0x1, 0x28,0x64,0x0, 0x2, 0x4f,0x20, +0x0, 0x2, 0xa8,0x1c,0x0, 0x2, 0xc2,0xe4,0x0, 0x2, 0x23,0x29,0x0, 0x2, 0x47,0xac, +0x0, 0x2, 0xbb,0xf8,0x0, 0x2, 0x23,0x1a,0x0, 0x2, 0x23,0x15,0x0, 0x0, 0x3a,0xaa, +0x0, 0x2, 0x4f,0x3f,0x0, 0x2, 0x4f,0x3e,0x0, 0x2, 0x4f,0x3c,0x0, 0x2, 0xb8,0x68, +0x0, 0x2, 0x24,0x78,0x0, 0x1, 0x28,0x4c,0x0, 0x2, 0xbc,0x70,0x0, 0x2, 0xbc,0x5c, +0x0, 0x2, 0x5f,0x90,0x0, 0x2, 0xe, 0x83,0x0, 0x2, 0xe, 0x88,0x0, 0x0, 0x3d,0x2c, +0x0, 0x2, 0xc6,0xec,0x0, 0x2, 0xc2,0xfc,0x0, 0x2, 0x5f,0xca,0x0, 0x2, 0x5f,0xcc, +0x0, 0x2, 0xbc,0x68,0x0, 0x2, 0xe, 0x54,0x0, 0x2, 0x1b,0x48,0x0, 0x2, 0x23,0x2d, +0x0, 0x2, 0xc6,0xee,0x0, 0x2, 0x2d,0x10,0x0, 0x0, 0xa8,0x78,0x0, 0x2, 0xa8,0x78, +0x0, 0x2, 0x23,0x1e,0x0, 0x2, 0x4f,0x22,0x0, 0x2, 0xb8,0x69,0x0, 0x2, 0x23,0x13, +0x0, 0x2, 0xb7,0xfe,0x0, 0x2, 0xb7,0xf8,0x0, 0x2, 0x24,0xd0,0x0, 0x2, 0x23,0x24, +0x0, 0x2, 0xb8,0x6c,0x0, 0x2, 0xe, 0x5c,0x0, 0x2, 0xbc,0x74,0x0, 0x2, 0xbc,0x72, +0x0, 0x2, 0x23,0xc, 0x0, 0x2, 0xe, 0x58,0x0, 0x2, 0x2c,0xa1,0x0, 0x2, 0x52,0xc2, +0x0, 0x2, 0x52,0xc6,0x0, 0x2, 0x52,0xcf,0x0, 0x2, 0x52,0xce,0x0, 0x2, 0x52,0xc7, +0x0, 0x2, 0x52,0xcc,0x0, 0x2, 0x52,0xcb,0x0, 0x2, 0x52,0xcd,0x0, 0x2, 0x52,0xc8, +0x0, 0x2, 0x52,0xc5,0x0, 0x2, 0x52,0xc9,0x0, 0x2, 0x52,0xca,0x0, 0x2, 0x52,0x70, +0x0, 0x2, 0x51,0xa8,0x0, 0x2, 0x52,0xc, 0x0, 0x2, 0x52,0xc4,0x0, 0x2, 0x52,0xc1, +0x0, 0x2, 0x52,0xc0,0x0, 0x2, 0x51,0x44,0x0, 0x2, 0x24,0x86,0x0, 0x0, 0x3b,0x36, +0x0, 0x2, 0xb8,0xd6,0x0, 0x2, 0x47,0xb0,0x0, 0x1, 0x28,0x5c,0x0, 0x0, 0x3a,0x6c, +0x0, 0x2, 0x1b,0x49,0x0, 0x2, 0xc2,0xdc,0x0, 0x2, 0x23,0x16,0x0, 0x2, 0x23,0xe, +0x0, 0x2, 0x4f,0x24,0x0, 0x2, 0xb8,0xd8,0x0, 0x0, 0x3b,0xac,0x0, 0x2, 0xa7,0xd2, +0x0, 0x2, 0xa7,0xd4,0x0, 0x1, 0x28,0x38,0x0, 0x1, 0x28,0xe4,0x0, 0x2, 0x4e,0xb8, +0x0, 0x2, 0x47,0xb4,0x0, 0x2, 0x5f,0x76,0x0, 0x2, 0x5f,0x7c,0x0, 0x2, 0x5f,0x74, +0x0, 0x2, 0x5f,0x7a,0x0, 0x2, 0x5f,0x78,0x0, 0x2, 0x5f,0x71,0x0, 0x2, 0x5f,0x72, +0x0, 0x2, 0x5f,0x70,0x0, 0x2, 0x59,0x30,0x0, 0x2, 0x52,0xf0,0x0, 0x2, 0x52,0xd4, +0x0, 0x1, 0x28,0x50,0x0, 0x2, 0x4e,0xf8,0x0, 0x1, 0x28,0x7c,0x0, 0x2, 0x5f,0x80, +0x0, 0x1, 0x29,0xf8,0x0, 0x2, 0xb8,0xac,0x0, 0x2, 0xc6,0xd4,0x0, 0x2, 0xc6,0xbc, +0x0, 0x2, 0x47,0xb6,0x0, 0x1, 0x28,0x70,0x0, 0x2, 0x1b,0x54,0x0, 0x2, 0x24,0x68, +0x0, 0x2, 0x23,0x2, 0x0, 0x2, 0xe, 0x68,0x0, 0x2, 0x23,0x28,0x0, 0x0, 0x3a,0x84, +0x0, 0x2, 0xe, 0x52,0x0, 0x2, 0x47,0xb8,0x0, 0x0, 0x3b,0x94,0x0, 0x2, 0x47,0xbc, +0x0, 0x2, 0x23,0x26,0x0, 0x2, 0x2c,0xcc,0x0, 0x2, 0x23,0x18,0x0, 0x2, 0xb8,0xe4, +0x0, 0x2, 0xe, 0x50,0x0, 0x2, 0x47,0xc0,0x0, 0x2, 0x4f,0x28,0x0, 0x2, 0x23,0x20, +0x0, 0x2, 0x4e,0x63,0x0, 0x2, 0x4e,0x62,0x0, 0x2, 0x4e,0x61,0x0, 0x2, 0x4e,0x60, +0x0, 0x2, 0x4e,0x5f,0x0, 0x2, 0x4e,0x5e,0x0, 0x2, 0x4e,0x5d,0x0, 0x2, 0x4e,0x5c, +0x0, 0x2, 0x4e,0x5b,0x0, 0x2, 0x4e,0x5a,0x0, 0x2, 0x4e,0x59,0x0, 0x2, 0x4e,0x58, +0x0, 0x2, 0x4e,0x56,0x0, 0x2, 0x4e,0x48,0x0, 0x2, 0x23,0x1c,0x0, 0x2, 0x60,0x8, +0x0, 0x2, 0x4f,0x3b,0x0, 0x2, 0x4f,0x2c,0x0, 0x1, 0x28,0x80,0x0, 0x2, 0x4a,0xea, +0x0, 0x2, 0x47,0xc4,0x0, 0x2, 0x23,0x2b,0x0, 0x2, 0x24,0x82,0x0, 0x1, 0x28,0x78, +0x0, 0x2, 0x1b,0x4c,0x0, 0x2, 0xb9,0x2, 0x0, 0x2, 0xb9,0x1, 0x0, 0x2, 0xb8,0xf2, +0x0, 0x2, 0xb8,0xf0,0x0, 0x1, 0x28,0x68,0x0, 0x2, 0x2d,0x2, 0x0, 0x2, 0x23,0x8, +0x0, 0x0, 0x3b,0x52,0x0, 0x2, 0x4f,0x2a,0x0, 0x2, 0x23,0x10,0x0, 0x2, 0xbb,0x69, +0xf, 0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xc0,0xff,0xff,0x55,0x50,0x47,0x52, +0x41,0x44,0x45,0x20,0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0xa0,0x0, 0x3, 0xff, +0x8, 0x0, 0x0, 0x8, 0x0, 0x82,0x32,0x1, 0x6, 0xc3,0x10,0x4, 0x8, 0x4, 0x8, 0x4, +0x6, 0xc3,0x14,0x5, 0x8, 0x5, 0x8, 0x5, 0x6, 0xc3,0x18,0x6, 0x8, 0x6, 0x8, 0x6, +0x3, 0x28,0x0, 0xfa,0x3, 0x28,0x1, 0x2c,0x40,0x8b,0x80,0x0, 0x3f,0xe9,0x99,0x99, +0x99,0x99,0x99,0x9a,0xfc,0x0, 0xff,0xff,0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff, +0xf8,0x0, 0xff,0xff,0x9f,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xf9,0xff,0xff,0xff, +0xfe,0x7f,0xff,0xff,0xff,0x9f,0xff,0xff,0xff,0xe7,0xff,0xff,0x80,0x1, 0x10,0x20, +0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0x1f,0xff,0xff,0xff,0xf, 0xff,0xff,0xff, +0x0, 0xff,0xff,0xff,0x0, 0xf, 0xff,0xff,0xf, 0xff,0xff,0xff,0x1f,0xff,0xff,0xff, +0x0, 0xf, 0xff,0xff,0xf, 0xff,0xff,0xff,0x7, 0xff,0xff,0xff,0x0, 0x19,0x66,0xd, +0x3c,0x6e,0xf3,0x5f,0x7f,0xff,0xff,0xff, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT8006m/include/firmware/black_all.i b/drivers/input/touchscreen/FT8006m/include/firmware/black_all.i new file mode 100644 index 0000000000000..f0b0e50999db4 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/include/firmware/black_all.i @@ -0,0 +1,7029 @@ +0x10,0x71,0x4, 0x3e,0x16,0xd9,0x0, 0x9d,0xbf,0x10,0x84,0x0, 0x0, 0x2, 0xc8,0x0, +0x84,0x80,0x0, 0x26,0x5a,0x51,0xb5,0x2a,0x6c,0xc5,0x4a,0x1, 0x60,0xe1,0xf, 0xc1, +0x10,0xc, 0x30,0x4b,0x0, 0x0, 0x42,0xa, 0xe3,0x29,0x99,0xf0,0xb9,0xe1,0x6b,0x68, +0x5f,0x81,0x26,0x0, 0xa1,0x80,0x8, 0x20,0x6, 0x0, 0x85,0x0, 0x0, 0x2c,0xb8,0x71, +0x3, 0x0, 0x8, 0x10,0x1b,0x27,0x35,0x38,0x6a,0x2d,0x72,0xbb,0x7b,0x94,0x62,0x5c, +0x4a,0x38,0x25,0x15,0x6, 0x0, 0x8, 0x10,0x1b,0x27,0x35,0x38,0x6a,0x2d,0x72,0xbb, +0x7b,0x94,0x62,0x5c,0x4a,0x38,0x25,0x15,0x0, 0x0, 0x85,0x80,0x0, 0x12,0x0, 0x0, +0x20,0x44,0x8, 0x0, 0x60,0x47,0x0, 0x0, 0x10,0x22,0x4, 0x0, 0xb0,0x23,0x15,0x0, +0x86,0x0, 0x0, 0x30,0xfa,0x68,0x68,0x1, 0x2d,0x6e,0x10,0x4, 0x0, 0x60,0x15,0x0, +0x50,0x15,0x56,0x51,0x15,0x55,0x61,0x15,0x0, 0x60,0x15,0x0, 0x50,0x15,0x56,0x51, +0x15,0x55,0x61,0x95,0xab,0x18,0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x80,0x4c,0x29,0x84, +0x52,0x1, 0x9, 0x0, 0x86,0x80,0x0, 0xe, 0xf0,0xb1,0x71,0xef,0x49,0xc0,0x80,0x1a, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87,0x0, 0x0, 0xc, 0xff,0x81,0x68,0xac,0xb4,0x6d, +0x24,0x0, 0x0, 0x0, 0x0, 0x0, 0x87,0x80,0x0, 0x17,0x19,0xc6,0x3e,0x20,0x1c,0x58, +0x64,0x10,0x53,0x33,0xe8,0x50,0x1, 0x32,0x8c,0x8c,0x24,0x69,0x81,0x71,0x44,0x7c, +0x14,0x88,0x0, 0x0, 0x1f,0x0, 0x80,0x3, 0xe7,0x1f,0x17,0x0, 0x48,0x40,0x2, 0xcf, +0x18,0x30,0x88,0x41,0x8a,0x39,0x28,0xa9,0xc5,0x9a,0x7b,0xf0,0x7, 0x7e,0xe0,0x7, +0x7e,0x20,0x10,0x0, 0x88,0x80,0x0, 0x79,0x43,0x77,0x3, 0x40,0x8a,0xf1,0xff,0x43, +0x30,0x8, 0xc1,0x46,0xa0,0x80,0x24,0x18,0x30,0x6, 0x64,0xc1,0x80,0x11,0x7, 0xc4, +0xe1,0xd0,0x68,0x40,0x20,0x1d,0x4, 0x48,0x40,0x40,0x28,0x10,0x60,0x70,0x38,0x1a, +0x10,0x47,0x3, 0xe2,0x20,0x0, 0x10,0x80,0x50,0x30,0x0, 0xe0,0xe1,0x1, 0x0, 0x28, +0xe, 0x6, 0xc3,0xcc,0xcc,0xcc,0xcc,0xcc,0x8c,0x88,0x88,0x88,0x88,0x88,0xc8,0x8, +0x86,0xc6,0xe3,0x81,0x0, 0x20,0x0, 0x21,0x42,0x88,0x0, 0x0, 0x0, 0x0, 0x40,0x0, +0x0, 0x31,0x4, 0x41,0x6, 0x0, 0x0, 0x0, 0x0, 0x92,0x4, 0x0, 0x92,0x4, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x85,0x11,0xc, 0x0, 0x0, 0x40,0x0, 0x0, 0x0, 0x0, 0x5e, +0x0, 0x89,0x0, 0x0, 0x19,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89,0x80, +0x0, 0x13,0x1, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7, 0x1, 0x5, 0x44,0xc, +0xce,0xe7,0x62,0xe, 0x0, 0x8a,0x0, 0x0, 0x80,0x91,0x1, 0x88,0xa6,0xe8,0xef,0xf7, +0xfb,0xfd,0x7e,0x0, 0x0, 0x0, 0x68,0xc5,0x7, 0xe8,0x3c,0x20,0x36,0x40,0xe7,0x1, +0x71,0x1, 0x3a,0xf, 0x88,0x9, 0xd0,0x79,0x80,0x39,0xbc,0xdf,0x8, 0xcc,0x20,0x83, +0x46,0x0, 0x18,0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1c,0xad,0xd1,0x2a,0x0, 0x40,0xa1,0x50,0x78,0x7, 0xa0,0xf3,0x80,0x73, +0x0, 0x6f,0x0, 0x74,0x1e,0x70,0xe, 0xe0,0x5, 0x80,0xce,0x3, 0xce,0x1, 0xbc,0x2, +0xd0,0x79,0xc0,0x39,0x80,0x77,0x1, 0x3a,0xf, 0x38,0x7, 0xf0,0x26,0x40,0xe7,0x1, +0xe7,0x0, 0xde,0x3, 0xe8,0x3c,0xe0,0x1c,0xc0,0x5b,0x0, 0x9d,0x7, 0x9c,0x3, 0x0, +0x1, 0xbf,0x1f,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a,0x80,0x0, 0x80,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, +0x6a,0xc4,0xa8,0xd5,0x96,0xa2,0xe0,0x1f,0x31,0x6a,0xb5,0xa5,0x28,0x78,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x13,0x0, 0xf0,0x0, 0x94,0xd6,0xc, 0x2d,0x49,0x30,0x14, +0xc7,0x4, 0xd5,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x4d,0x15,0xa2,0x18,0x84, +0x0, 0x4c,0x30,0x6c,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xd6,0xc, 0x29,0x8, 0x20, +0x10,0xc6,0x4, 0xd5,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x4d,0x55,0xb2,0x1c, +0xc5,0x10,0x4c,0x30,0x6c,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x5b,0x10,0x8b,0x0, 0x0, +0x16,0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xd0,0x40,0x8c,0x0, 0x0, 0x3f,0xef,0xbd,0xf7,0xde,0x7b, +0xef,0xbd,0x7, 0x8, 0x8, 0xa, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0x5c,0x9, +0xa8,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x5a,0x59,0x59,0x59,0x59,0x59, +0x59,0x59,0x59,0x59,0x59,0x59,0x9, 0x4, 0xff,0x5, 0x80,0x80,0x0, 0x4, 0x20,0x0, +0x1, 0x8, 0x40,0x0, 0x2, 0x10,0x80,0x0, 0x4, 0xf, 0x8c,0x80,0x0, 0x27,0xea,0xd3, +0xc6,0xb8,0xaf,0xa6,0x9e,0x98,0x92,0x8e,0x8a,0x85,0x0, 0x60,0xf6,0xcf,0xfc,0x6f, +0xf6,0xef,0xcf,0xaf,0xf, 0xff,0xaf,0xb5,0x71,0xe, 0x6c,0x4a,0x69,0x8, 0x0, 0x0, +0x44,0x0, 0x0, 0x0, 0x0, 0x8d,0x0, 0x0, 0x80,0x0, 0x4, 0x8, 0xc, 0x50,0x10,0x14, +0x18,0x1c,0xa5,0x20,0x28,0x30,0x39,0x3e,0x41,0x49,0x51,0x59,0x54,0x61,0x69,0x71, +0x79,0xaa,0x81,0x89,0x91,0x99,0x5a,0xa1,0xa9,0xb1,0xb9,0x1, 0xc0,0xc8,0xd0,0xd8, +0x6f,0xe0,0xe7,0xef,0xf7,0x5c,0xfb,0xfd,0xfe,0x0, 0x0, 0x4, 0x7, 0xb, 0xf0,0xf, +0x13,0x17,0x1b,0x6b,0x1f,0x27,0x2f,0x36,0xc1,0x3e,0x46,0x4e,0x56,0x1a,0x5e,0x65, +0x6d,0x75,0xac,0x7d,0x85,0x8d,0x95,0x16,0x9d,0xa4,0xac,0xb4,0xbc,0xbc,0xc4,0xcc, +0xd4,0x5a,0xdc,0xe4,0xec,0xf3,0xc1,0xf7,0xf9,0xfa,0x3f,0x0, 0x4, 0x8, 0xc, 0x0, +0x10,0x14,0x18,0x1c,0x55,0x20,0x28,0x30,0x38,0x55,0x40,0x48,0x50,0x58,0x55,0x60, +0x68,0x70,0x78,0x1, 0x7f,0x87,0x8f,0x97,0xaf,0x8d,0x80,0x0, 0x14,0x9f,0xa7,0xaf, +0xb7,0x55,0xbf,0xc7,0xcf,0xd7,0x0, 0xdf,0xe7,0xef,0xf7,0xe5,0xfb,0xfe,0xff,0x3, +0x0, 0x90,0x0, 0x0, 0x7, 0x8b,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x91,0x0, 0x0, 0xd, +0x2d,0xd3,0x0, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x1f,0x0, 0x91,0x80,0x0, +0x19,0x1, 0x5, 0x0, 0x5, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1, 0xff,0xf, 0x0, 0x0, 0x2c,0x1, 0x0, 0x0, 0x0, 0x92,0x0, 0x0, 0x10,0x0, 0x3, +0x0, 0x9d,0xbf,0x10,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd9,0x16,0xb, 0xf4, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0x0, 0x0, 0x60,0x0, 0x1, 0x79,0x84,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0xe0,0x60,0x3c,0x0, 0xcc,0x2, 0xe0,0x60,0x3c,0x10,0xea,0x0, 0xc8,0x3, 0xe0,0xff, +0xc8,0x7c,0xfa,0x0, 0xcf,0x82,0xf0,0x0, 0xcf,0x80,0xea,0x0, 0xcc,0x0, 0xe0,0x0, +0xcc,0x0, 0xe0,0x60,0x3c,0x17,0xea,0x0, 0xcc,0x2, 0xe0,0x0, 0xcc,0x0, 0xea,0x0, +0xcc,0x80,0xe0,0x32,0xcc,0xe8,0x3c,0x79,0x1, 0x8, 0xea,0x0, 0xcd,0x2, 0xe0,0x1, +0xcd,0x34,0x3d,0x28,0xe0,0x0, 0xdb,0xe2,0xea,0x0, 0xcc,0x0, 0xe0,0x2e,0xcc,0x60, +0x3c,0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x56,0x31,0x2e,0x34,0x30,0x53,0x65,0x70,0x20,0x20,0x31,0x20,0x32,0x30,0x31,0x37, +0x46,0x54,0x38,0x30,0x30,0x36,0x5f,0x42,0x4f,0x4f,0x54,0x4c,0x4f,0x41,0x44,0x45, +0x26,0x40,0xd9,0xbf,0x38,0xce,0xc7,0x31,0xd5,0xbe,0x2a,0x41,0xff,0x0, 0xff,0x0, +0x0, 0x0, 0x0, 0x0, 0xff,0xff,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80,0xb6, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xe8,0x2, 0x4f,0xa1,0xe2,0x0, 0xcf,0xe6,0x1, 0x35,0x2, 0x88,0xe2,0x0, 0xcf,0x83, +0x1, 0x2b,0xe2,0x0, 0xcf,0x85,0x1, 0x14,0x0, 0xbd,0xe2,0x1, 0xcf,0x90,0x1, 0x8, +0xe2,0x1, 0xcf,0xcc,0x1, 0x27,0xe2,0x0, 0xcf,0xea,0x1, 0xb4,0x0, 0xa6,0xe2,0x0, +0xcc,0x1, 0x2, 0xb0,0xea,0x0, 0x7f,0xd0,0x3c,0x1f,0x8c,0x8, 0x38,0x82,0x2c,0x4, +0xe8,0x0, 0x64,0x46,0x0, 0xa4,0xe2,0x0, 0xcc,0x1, 0x1, 0x86,0xe8,0x0, 0x67,0xc6, +0xe0,0x8, 0x37,0xc8,0x0, 0x9c,0xe2,0x0, 0xcc,0x2, 0x1, 0x9c,0xe8,0x0, 0x67,0xc6, +0xe4,0x8, 0x37,0xc0,0x0, 0x94,0xe8,0x2, 0x67,0xca,0x3c,0x1f,0xe0,0x1, 0x8c,0x8, +0x38,0x82,0xe8,0x2, 0x4c,0x38,0x38,0x82,0x2c,0x5, 0xe8,0x1, 0x5c,0xe, 0x34,0x48, +0x38,0x82,0xe2,0x0, 0xcc,0x1, 0x1, 0x86,0xe8,0x1, 0x5c,0xe, 0xe2,0x1, 0xc4,0x7f, +0x38,0x82,0xe0,0x1, 0x14,0x6b,0x38,0x82,0x17,0x0, 0xe8,0x2, 0x6f,0x23,0xe8,0x2, +0x4f,0xa1,0xe2,0x0, 0xcf,0xe4,0xe0,0x2, 0x1, 0x2, 0x2, 0xa6,0xe2,0x0, 0xcf,0x87, +0xe0,0x1, 0x1, 0x5a,0x2, 0x8f,0xe2,0x0, 0xcf,0x83,0xe0,0x1, 0x1, 0x27,0xe2,0x0, +0xcf,0x85,0xe0,0x1, 0x1, 0x70,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1, 0xa3,0xe0,0x1, +0x0, 0xea,0xe2,0x0, 0xcf,0x90,0xe0,0x1, 0x1, 0x63,0x2, 0x86,0xe2,0x0, 0xcf,0x89, +0xe0,0x1, 0x1, 0x52,0x38,0x82,0xe2,0x0, 0xcf,0xd5,0x1, 0x25,0xe2,0x0, 0xcf,0xe1, +0xe0,0x2, 0x1, 0x8, 0x38,0x82,0xe2,0x1, 0xcf,0x90,0x1, 0x20,0x2, 0x8c,0xe2,0x0, +0xcf,0xe6,0xe0,0x1, 0x1, 0x50,0xe0,0x1, 0x4, 0xd8,0xe2,0x0, 0xcf,0xea,0xe0,0x1, +0x1, 0x4a,0x38,0x82,0xe2,0x1, 0xcf,0xb0,0x1, 0x1f,0x2, 0x85,0xe2,0x1, 0xcf,0xaa, +0x1, 0xa, 0x38,0x82,0xe2,0x1, 0xcf,0xbf,0x1, 0x32,0xe2,0x1, 0xcf,0xcc,0xe0,0x1, +0x1, 0x3a,0x38,0x82,0xe8,0x2, 0x6f,0x38,0x38,0x82,0xe2,0x0, 0xcc,0x3, 0xe0,0x1, +0x2, 0xe9,0xe0,0x0, 0x1f,0x93,0xe8,0x2, 0x6f,0x38,0x3f,0x98,0xac,0x8f,0xe0,0x1, +0x24,0x2a,0xe0,0x1, 0x0, 0xdf,0xe2,0x0, 0xcc,0x3, 0xe0,0x1, 0x2, 0xdb,0xea,0x6, +0x7f,0x8e,0xe9,0xff,0xc7,0xfe,0x3c,0x1f,0x8c,0x8, 0x3c,0x1f,0x3c,0x2, 0x4, 0x4, +0xa, 0x18,0xe4,0x9, 0x34,0xa0,0x0, 0x85,0xe8,0x0, 0x67,0xc5,0x34,0xa8,0x3c,0x9f, +0xe8,0x0, 0x7c,0xc5,0x38,0x82,0xe8,0x0, 0x67,0xc5,0x0, 0xfa,0xe2,0x0, 0xcc,0x5, +0x2, 0xa3,0xea,0x6, 0x7f,0xc4,0xe9,0xff,0xc7,0xfe,0x34,0x21,0x3c,0x1f,0x9c,0x8, +0x3c,0x1f,0x3c,0x2, 0x1, 0x6c,0x0, 0x78,0x0, 0x98,0x0, 0xc, 0x0, 0x18,0x0, 0x22, +0xe8,0x2, 0x67,0x4a,0xa7,0x8e,0x3c,0x9f,0xbc,0x8e,0x38,0x82,0x34,0xa8,0xe8,0x2, +0x67,0xca,0xe0,0x1, 0x0, 0x96,0xe8,0x2, 0x67,0xca,0x9f,0x2f,0x3c,0x9e,0xb4,0xaf, +0x17,0x0, 0xb7,0x3f,0x38,0x82,0xe8,0x2, 0x67,0xca,0x16,0x81,0x9f,0x3f,0x3e,0x9e, +0xb6,0xbf,0x3f,0x1f,0xe0,0x1, 0xac,0x8e,0x9e,0xbf,0x9f,0x2f,0x3e,0xfe,0xe0,0x1, +0x4, 0x91,0xe8,0xa, 0x4e,0xa6,0x17,0x0, 0xe0,0x2e,0x3e,0x8e,0xe8,0x2, 0x7f,0xc6, +0x17,0x82,0xe8,0xa, 0x6f,0x26,0x0, 0xac,0xe2,0x0, 0xcc,0x2, 0x1, 0x18,0xe2,0x0, +0xcc,0x3, 0x1, 0x1b,0xe2,0x0, 0xcc,0x1, 0xe0,0x0, 0x1, 0xfc,0xe8,0xa, 0x4f,0xa6, +0x27,0x84,0xe0,0x0, 0x1f,0x8f,0x0, 0x83,0xe0,0x0, 0x1f,0x8e,0xe8,0x2, 0x7f,0xca, +0xe4,0x9, 0x34,0xa0,0xe8,0x2, 0x67,0xca,0xe0,0x0, 0x0, 0xd8,0xe8,0x2, 0x67,0x4a, +0x34,0xa8,0xa7,0x8e,0xe7,0xff,0x0, 0xb9,0xe8,0x2, 0x67,0xca,0xa7,0xf, 0x3c,0x9e, +0xbc,0x8f,0x17,0x1, 0xe8,0x2, 0x7f,0xc6,0x17,0x81,0xe8,0x2, 0x6f,0x23,0xe8,0x0, +0x7f,0xc2,0x38,0x82,0xe8,0x0, 0x67,0x9f,0x17,0x0, 0xe0,0x3, 0xb7,0x1f,0x17,0x80, +0xe0,0x2, 0x17,0x4, 0xbf,0x8e,0xe0,0x2, 0x17,0x8, 0xbf,0x8e,0x17,0x81,0xe8,0x2, +0x6f,0xa0,0x38,0x82,0xe2,0x0, 0xcc,0x1, 0x1, 0x84,0xe8,0x0, 0x6c,0xd3,0x38,0x82, +0xe2,0x0, 0xcc,0x2, 0x1, 0xbe,0xe8,0x2, 0x6c,0x9f,0x38,0x82,0xe8,0x2, 0x6c,0x9e, +0x38,0x82,0x17,0x1, 0xe8,0x2, 0x6f,0x23,0x38,0x82,0xe8,0x2, 0x6f,0x38,0x17,0x80, +0xe8,0x0, 0x7f,0xc4,0x38,0x82,0xc4,0x7f,0xe2,0x0, 0xcc,0x4, 0x2, 0xaa,0xea,0x8, +0x7f,0xf2,0xe9,0xff,0xc7,0xfe,0x3c,0x1f,0x8c,0x8, 0x3c,0x1f,0xe8,0x2, 0x67,0xca, +0x3c,0x2, 0x6, 0xc, 0x12,0x1a,0x20,0x0, 0xe4,0x9, 0x34,0xa0,0x0, 0x86,0xa7,0xf, +0x34,0xa8,0x0, 0x82,0xa7,0xf, 0x3c,0x9e,0xbc,0x8f,0x38,0x82,0x34,0xa8,0xb4,0xaf, +0x38,0x82,0x9f,0x2f,0x3c,0x9e,0xb4,0xaf,0x17,0x3, 0xe8,0x0, 0x7f,0x42,0x38,0x82, +0x17,0x84,0xe8,0x0, 0x7f,0xc2,0xe8,0x2, 0x6f,0x38,0x17,0x0, 0xe8,0x0, 0x7f,0x44, +0x38,0x82,0x8, 0xb2,0xe8,0x0, 0xc, 0x37,0xf8,0x0, 0xf, 0xbf,0x17,0x81,0xe8,0x0, +0x61,0x1c,0xe8,0x0, 0x6f,0xd4,0xa7,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x99,0xa7,0x2, +0x17,0xfe,0x3f,0xde,0xbf,0x82,0x8c,0xf2,0xe8,0x2, 0x4f,0xa2,0x2f,0x83,0xe8,0x2, +0x6c,0xa1,0xe8,0x2, 0x4c,0x22,0xde,0xa9,0xe8,0x2, 0x4f,0xa2,0xc7,0x81,0xe8,0x2, +0x6f,0xa2,0xe8,0x2, 0x4f,0xa3,0x27,0x84,0x14,0x0, 0xde,0x53,0xac,0x72,0xa7,0x82, +0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x8e,0xa7,0x2, 0x17,0xfd,0x3f,0xde,0xbf,0x82, +0xe8,0x2, 0x4f,0xa2,0xc7,0x81,0xe8,0x2, 0x6f,0xa2,0xe8,0x2, 0x4c,0x22,0xde,0x41, +0xac,0x72,0x17,0x88,0xe0,0x61,0x3f,0x91,0xf8,0x0, 0xf, 0xaf,0xf0,0x0, 0xb, 0xa8, +0x9, 0x21,0x38,0x0, 0xe, 0xbf,0xe8,0x0, 0x67,0x1c,0x17,0xfe,0xa6,0xbe,0x3f,0xdd, +0xbf,0xbe,0x17,0x80,0xe8,0x2, 0x6f,0xa2,0x17,0x90,0xe0,0x61,0x3f,0x91,0xf, 0xad, +0x38,0x0, 0x8, 0xb6,0xe1,0xff,0xc0,0x0, 0xe8,0x0, 0x67,0xc4,0x39,0xe8,0x3f,0x99, +0x39,0x69,0x3b,0x6a,0xe8,0x0, 0x7f,0xc4,0x21,0x27,0xe2,0x0, 0xc9,0x7f,0x2, 0x85, +0x3a,0xe2,0xe2,0x1, 0xc2,0xff,0x0, 0x83,0xe0,0x1, 0x12,0x80,0x3a,0x65,0xe2,0x1, +0xc2,0x7f,0x3c,0x63,0x3d,0x64,0xe2,0x0, 0x7c,0x84,0xd7,0xb0,0x39,0x24,0x8f,0x86, +0xe3,0xff,0xc1,0x7f,0x39,0x95,0xe2,0x0, 0x7e,0x84,0x17,0x0, 0xc7,0x1, 0xe1,0x80, +0x8e,0x1d,0xe3,0xff,0xc7,0x7f,0x3a,0x7e,0xe2,0xf, 0x3e,0x4f,0xe2,0x1, 0xc7,0xff, +0x2, 0xf6,0xaf,0x86,0x0, 0xda,0xe0,0x1, 0xc0,0x0, 0xb, 0x61,0xe8,0x0, 0x4f,0xd3, +0xe2,0x0, 0xcf,0x8b,0xe0,0x0, 0x1, 0xd1,0x8, 0xb6,0xe2,0x9f,0xcc,0x7f,0x3a,0xe8, +0xe0,0x0, 0x5, 0xca,0xe8,0x0, 0x67,0x45,0xe2,0xf0,0x17,0x80,0x3f,0x7f,0xe0,0x0, +0x2, 0xc3,0xe8,0x0, 0x67,0xc4,0x3b,0x69,0x39,0xea,0x2f,0x83,0xe8,0x2, 0x6f,0x84, +0xe8,0x0, 0x67,0xc4,0xe8,0x2, 0x4a,0x4, 0x3f,0x93,0xe2,0x0, 0xca,0x3, 0xe8,0x0, +0x7f,0xc4,0x2, 0x9a,0x17,0x84,0xe0,0x2, 0x3f,0xa4,0xe2,0x1, 0xc1,0x7f,0x39,0xf2, +0x3, 0x84,0x39,0x63,0xe2,0x1, 0xc1,0x7f,0xea,0x2, 0x7c,0x0, 0x3c,0xe6,0x3c,0x14, +0x3d,0x62,0x3a,0x12,0x39,0xa2,0xe0,0x0, 0xd9,0x21,0x3a,0x92,0xe8,0x2, 0x6a,0x4, +0x3b,0x12,0xe3,0xff,0xc1,0xff,0x21,0x85,0x3d,0x63,0x3c,0xe6,0x3c,0x65,0xd6,0xf7, +0xe8,0x0, 0x67,0x44,0xe8,0x0, 0x67,0xc5,0x3f,0x7f,0x1, 0x8d,0x15,0x4, 0xea,0x2, +0x7c,0x80,0xe0,0xa0,0x14,0x0, 0xd6,0xeb,0x17,0x80,0xe8,0x0, 0x7f,0xc4,0xb, 0x21, +0xe0,0x9, 0x0, 0x9f,0xb, 0x61,0x38,0x82,0x8, 0xb1,0xe8,0x0, 0x67,0xc2,0xc7,0xff, +0xe2,0x0, 0xcf,0x83,0xe0,0x0, 0x2, 0xe4,0xea,0xd, 0x7f,0xe, 0xe9,0xff,0xc7,0x7e, +0x3f,0x9e,0x8f,0x8f,0x3f,0x9e,0x17,0x0, 0xe8,0x0, 0x7f,0x42,0x3f,0x82,0x4c,0x4, +0x70,0x8e,0xe8,0x1, 0x77,0xe, 0xe8,0x0, 0x4f,0xd3,0xe8,0x2, 0x64,0xc6,0xe2,0x0, +0xcf,0x8b,0x1, 0x86,0xa4,0x9, 0x9d,0x29,0xc4,0x88,0xdf,0x89,0x0, 0x8b,0xa7,0x89, +0x9f,0x29,0x3f,0x9e,0xe2,0x20,0xcf,0x80,0x2, 0x85,0xa4,0x9, 0x9d,0x29,0xc4,0x88, +0xd6,0xb6,0xe8,0x2, 0x67,0xc6,0xa4,0xf, 0x9c,0xaf,0xe0,0x0, 0xd8,0xa9,0xe0,0x20, +0xc4,0x0, 0xe8,0x1, 0x74,0xe, 0xd5,0x23,0x0, 0xb2,0xe8,0x2, 0x64,0xc6,0xe0,0x2, +0x15,0x0, 0xe1,0x80,0xa4,0x29,0xd7,0x2, 0xe8,0x0, 0x4f,0xd4,0x27,0xa8,0xe8,0x2, +0x67,0x46,0xe8,0x0, 0x67,0x9c,0xe0,0x1, 0x87,0xe, 0xaf,0x7f,0x0, 0xa0,0xe8,0x2, +0x67,0xc6,0xe8,0x1, 0x77,0xe, 0xea,0x2, 0x7d,0x38,0xa4,0xf, 0x9c,0xaf,0xdf,0x22, +0xd5,0x6, 0xe7,0xe0,0x17,0x55,0xe8,0x1, 0x77,0xe, 0x0, 0x91,0xe8,0x1, 0x77,0xe, +0xe8,0x0, 0x4f,0xd3,0xe2,0x0, 0xcf,0x8b,0x1, 0x83,0xd3,0x49,0x0, 0x83,0x14,0x0, +0xd6,0xbb,0xd4,0xf5,0xe7,0xe1,0x17,0xaa,0xe8,0x1, 0x77,0x8e,0xe8,0x2, 0x4f,0xa0, +0x27,0x89,0xe0,0x27,0x14,0x8, 0xd4,0xdc,0xe8,0x0, 0x67,0x9f,0x17,0x7f,0xe0,0x7, +0xaf,0x3f,0x8, 0xe1,0xe0,0x0, 0x1f,0x83,0xe0,0x2, 0x8f,0xf, 0xe0,0x2, 0x8e,0x9f, +0x3e,0x9e,0xe2,0x1, 0xce,0xff,0x1, 0x84,0xe2,0x0, 0xcf,0x4, 0x5, 0x8e,0xe0,0x0, +0x1f,0x88,0xe0,0x2, 0x8f,0xf, 0xe0,0x2, 0x8e,0x9f,0x3e,0x9e,0xe2,0x1, 0xce,0xff, +0x1, 0x9c,0xe2,0x0, 0xcf,0x4, 0x2, 0x99,0xe0,0x2, 0x8e,0x2f,0xe0,0x2, 0x8e,0xbf, +0x3e,0x9c,0xe2,0x1, 0xce,0xff,0x1, 0x91,0xe0,0x2, 0x8e,0xcf,0xe0,0x2, 0x8f,0xdf, +0x3f,0x9d,0xe2,0x1, 0xcf,0xff,0x1, 0x89,0xe8,0x2, 0x6f,0x26,0x14,0x1, 0xe8,0x2, +0x6e,0x25,0xe8,0x2, 0x6e,0xa4,0x38,0x82,0x14,0x0, 0x38,0x82,0xc0,0x78,0xe8,0x0, +0x66,0xa0,0xe0,0x0, 0x17,0x50,0xa7,0x9d,0x16,0x4, 0xcf,0x90,0xbf,0x9d,0x3e,0x10, +0xe8,0x0, 0x67,0x99,0xe1,0x2, 0x15,0x5, 0xb7,0x5f,0x8d,0xff,0xb7,0x5f,0xe0,0x0, +0x17,0x5a,0xaf,0x3f,0xe0,0x0, 0x17,0x51,0xb7,0x5f,0x17,0x2, 0xaf,0x3f,0xe1,0x2, +0x17,0x0, 0xb7,0x5f,0xc7,0x1, 0x8c,0xff,0xe3,0xff,0xc7,0x7f,0x3f,0x7a,0xe1,0x80, +0xac,0x9c,0x1, 0xf8,0xe2,0x0, 0xcd,0xda,0x1, 0x6, 0xe0,0x0, 0x17,0x50,0xb7,0x5f, +0x17,0x0, 0xaf,0x3f,0x17,0xef,0xa7,0x1d,0x3f,0xde,0xbf,0x9d,0xe2,0x0, 0x7f,0x88, +0x3c,0x1f,0xe0,0x40,0x8c,0x48,0xc0,0x8, 0x38,0x82,0x16,0x80,0xe8,0x0, 0x67,0x9f, +0xae,0x88,0xe0,0x1, 0xa7,0xff,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0x93,0xe8,0x0, +0x67,0xa0,0xe0,0x0, 0x16,0xd4,0xa7,0x1f,0xcf,0x10,0xbf,0x1f,0xe8,0x0, 0x67,0x19, +0xb6,0xde,0x8f,0x7e,0xe2,0x0, 0xc7,0x3, 0xaf,0x8, 0x17,0x6f,0xa6,0x9f,0x3f,0x5d, +0xbf,0x1f,0x38,0x82,0x8, 0xb5,0xc0,0x7c,0xdf,0x76,0x2c,0x4, 0x12,0x82,0x14,0x0, +0x0, 0x90,0xe8,0x2, 0x4c,0x26,0xdf,0xa3,0xe8,0x2, 0x6c,0x27,0xe8,0x2, 0x4f,0x27, +0xe8,0x2, 0x4f,0xa4,0x3f,0x7f,0x1, 0xf3,0xe0,0xf, 0x12,0xc2,0xe0,0xf, 0x14,0x40, +0x15,0x4, 0xe2,0x0, 0x7c,0x84,0xd6,0x2a,0x49,0x6, 0x4f,0x87,0x31,0x28,0x39,0x1f, +0xe3,0xff,0xc1,0x7f,0x17,0xf8,0x3f,0x92,0xe2,0x1e,0xcf,0xf7,0x2, 0xa3,0xc1,0x7e, +0xe3,0xff,0xc1,0x7f,0xe0,0x0, 0x1c,0x8d,0x3c,0x65,0x3d,0x62,0x4a,0x4, 0x49,0x85, +0xe8,0x1, 0x71,0x16,0xd6,0x13,0xe0,0x0, 0x1c,0xc, 0x32,0x28,0x34,0x41,0x15,0x0, +0xe0,0x9, 0x31,0x41,0xe3,0xff,0xc4,0x7f,0x39,0x94,0xe0,0xb, 0xd7,0xeb,0xe3,0xff, +0xc1,0xff,0x39,0xf8,0xe0,0x0, 0x1a,0x8d,0x1, 0x7, 0x14,0x0, 0xbc,0x5, 0xbc,0x15, +0x0, 0x84,0x14,0x0, 0x0, 0x82,0x14,0x1, 0xc0,0x4, 0xa, 0xe1,0x8, 0xb2,0x11,0x3, +0xdf,0xb2,0xe8,0x2, 0x6c,0x2e,0xe8,0x2, 0x4f,0xae,0x2f,0x85,0xc1,0x7f,0xe2,0x1, +0xc1,0x7f,0x29,0x77,0x9, 0x61,0xe8,0x0, 0x67,0x20,0xe0,0x0, 0x16,0xd0,0xa7,0x9e, +0xe0,0x0, 0x16,0x5a,0xcf,0x90,0xbf,0x9e,0xe8,0x0, 0x67,0x99,0xb6,0xdf,0x8d,0xff, +0xb6,0xdf,0xe2,0x0, 0xcd,0xda,0xae,0x3f,0xe7,0x24,0x16,0x10,0xb6,0x5f,0x16,0x0, +0xae,0x3f,0x1, 0x3, 0xb6,0xdf,0xae,0x3f,0x17,0xef,0xa6,0x9e,0x3f,0xdd,0xbf,0x9e, +0x38,0x82,0x8, 0xb3,0xe8,0x0, 0x61,0x19,0xe0,0x0, 0x16,0xd4,0xb6,0xd2,0x17,0x3, +0xaf,0x32,0x8f,0x88,0x8f,0x18,0x37,0xa8,0x3f,0x9e,0xe3,0xff,0xc7,0xff,0x17,0x74, +0x3f,0x1f,0xe2,0x1e,0xcf,0x74,0x5, 0x84,0x14,0x1, 0xe0,0x0, 0x0, 0xfb,0xe0,0x0, +0x16,0xd0,0xc7,0xfe,0xb6,0xd2,0xe0,0x0, 0x17,0x5a,0x16,0x0, 0xe3,0xff,0xc7,0xff, +0x15,0x7d,0xaf,0x32,0x3e,0xec,0x3d,0xec,0x17,0x8, 0x3d,0x1f,0x2d,0x93,0xe0,0xb, +0x3c,0x1e,0x8e,0x8b,0x8e,0x1b,0x36,0xa8,0x3e,0x9c,0x8e,0x2b,0x8d,0xbb,0x36,0x28, +0x3e,0x1b,0xc7,0x4, 0xe3,0xff,0xc6,0xff,0xe3,0xff,0xc6,0x7f,0xe3,0xff,0xc7,0x7f, +0x15,0x84,0xe0,0x9, 0x3c,0x1e,0x8c,0x89,0xb6,0xd2,0xc5,0x81,0xac,0xb2,0x14,0x83, +0xe3,0xff,0xc5,0xff,0x3c,0x9c,0x3c,0xfb,0xc6,0x81,0xc7,0x1, 0xe3,0xff,0xc6,0xff, +0xe3,0xff,0xc7,0x7f,0x3, 0x5, 0x3d,0x7e,0x2, 0x2, 0x3f,0x6f,0x15,0x80,0x3f,0xfe, +0x2, 0xd6,0xe7,0x24,0x17,0x82,0xb7,0xd2,0xe7,0x24,0x16,0x83,0x8f,0x72,0xe7,0x24, +0x17,0x84,0xb6,0xd2,0xe4,0xc, 0x37,0x28,0xe7,0x24,0x16,0x85,0x8f,0x72,0xb7,0xd2, +0xe4,0xe, 0x37,0x20,0x8f,0xf2,0xb6,0xd2,0x3f,0x1c,0x8e,0xf2,0x37,0xa8,0x3f,0x1d, +0x3f,0x9e,0xa7,0x18,0xe0,0x0, 0x16,0xd0,0xb6,0xd2,0x3f,0xfe,0x16,0x80,0xae,0xb2, +0xe7,0xff,0x1, 0xa4,0xe0,0x0, 0x17,0xf0,0xb7,0xd2,0x17,0x2a,0xae,0xb2,0x39,0xe8, +0xb7,0xd2,0xe0,0x27,0x14,0x8, 0xaf,0x32,0xd3,0x5b,0xe0,0x0, 0x17,0xf6,0xb7,0xd2, +0xe0,0x0, 0x16,0xf5,0x8c,0x72,0xb6,0xd2,0x34,0x28,0x8f,0x23,0x8f,0xf2,0xe0,0xd, +0x37,0x28,0x8f,0x33,0x3c,0x1f,0x3f,0x1d,0xe3,0xff,0xc4,0x7f,0xe1,0x28,0x3f,0x8, +0x9, 0xe1,0x8, 0xb5,0xe8,0x0, 0x61,0xa0,0x3a,0x68,0x11,0x3, 0x12,0xef,0xa7,0x93, +0x3c,0x64,0xcf,0x90,0xbf,0x93,0xdf,0x66,0xa7,0x93,0x3f,0xd5,0xbf,0x93,0x24,0x5, +0xc1,0x7f,0xe2,0x1, 0xc1,0x7f,0x29,0x74,0xa, 0xe1,0x8, 0xb4,0xe8,0x0, 0x4f,0xd9, +0x39,0x68,0xe2,0x0, 0xcf,0x81,0x1, 0xaa,0xe1,0x11,0x14,0x2a,0xe0,0xb, 0xd8,0x56, +0xe0,0xb, 0xd7,0x54,0x3a,0x68,0x2c,0x7d,0xe8,0x0, 0x61,0x9f,0xe0,0x1, 0x14,0x14, +0xe0,0x2, 0x9f,0x93,0xe3,0xff,0xc7,0xfe,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd7,0x2c, +0x3c,0x64,0xe0,0xb, 0xd7,0x29,0xac,0x2, 0xe8,0x2, 0x4f,0xae,0x27,0x85,0xe8,0x2, +0x4f,0x29,0x8f,0x82,0x3f,0xce,0xaf,0x82,0x8c,0x2, 0xe0,0xb, 0xd7,0x1d,0xe0,0x2, +0x9f,0x93,0xcf,0x81,0xe0,0x2, 0xb7,0x93,0x0, 0xac,0x2f,0xa8,0xe1,0x11,0x14,0x2a, +0xe0,0xb, 0xd8,0x2c,0xe8,0x0, 0x67,0x9f,0xe0,0x2, 0x9f,0x1f,0xe2,0xff,0xc7,0x7f, +0xe0,0x2, 0xb7,0x1f,0xe0,0x2, 0x9f,0x1f,0xcf,0x4, 0xe0,0x2, 0xb7,0x1f,0xe8,0x2, +0x4f,0x49,0x27,0x7e,0x17,0x0, 0xe8,0x2, 0x6f,0x49,0xe0,0x2, 0x9f,0x1f,0xe1,0x0, +0xcf,0x0, 0xe0,0x2, 0xb7,0x1f,0xe0,0x2, 0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x2, +0xb7,0x1f,0xe0,0x0, 0x1f,0x84,0x87,0x8f,0x0, 0x83,0xe8,0x2, 0x47,0xa9,0xaf,0x82, +0xa, 0x61,0x8, 0xb7,0xf8,0x0, 0xc, 0x3d,0xc0,0x7c,0x17,0x80,0xe2,0x0, 0x79,0x4, +0xe0,0x80,0xaf,0xb2,0xde,0xcc,0xea,0x2, 0x7c,0x29,0xde,0x60,0x3c,0x62,0xdf,0x96, +0x4f,0x87,0xe0,0x0, 0x27,0xf9,0xe8,0x0, 0x4f,0xd9,0xe2,0x0, 0xcf,0x81,0x1, 0x10, +0xe0,0x0, 0x1c,0xd, 0xdf,0x77,0xe8,0x2, 0x6c,0x29,0x14,0x7, 0x3c,0x10,0xdf,0x86, +0xe8,0x0, 0x4f,0xd8,0xe0,0x0, 0x27,0xe8,0xde,0xbf,0xe0,0x0, 0x0, 0xe5,0xe0,0x0, +0x1a,0xc, 0x11,0x80,0x32,0x42,0xe8,0x0, 0x61,0x17,0xe3,0xff,0xc2,0x7f,0xe0,0x7, +0x13,0x60,0x13,0xfc,0xf0,0xe, 0x14,0x41,0xf0,0x0, 0x14,0x9f,0xf0,0x0, 0x15,0x60, +0xf0,0x40,0x3d,0xe3,0xf0,0xe, 0x16,0x1, 0xe1,0x33,0x14,0x3b,0xe0,0xb, 0xd7,0xc6, +0xe0,0xb, 0xd6,0xc4,0x2c,0x7e,0xe0,0x1, 0xb2,0x12,0xe0,0x1, 0xb3,0x32,0xa7,0xe2, +0x3f,0xd7,0xcf,0x82,0xbf,0xe2,0xf0,0x0, 0xbc,0x2, 0xf0,0x0, 0xbc,0xb2,0xa7,0x92, +0x37,0xca,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x12,0x17,0xfe,0x3f,0xde,0xbf,0x92, +0xa7,0x82,0xe0,0x1, 0xcf,0x80,0xbf,0x82,0xe0,0xb, 0xd6,0xa8,0x24,0x7e,0xf0,0x0, +0xbd,0x12,0xf0,0x0, 0xbd,0xb2,0xf0,0x0, 0xbe,0x2, 0xe0,0xb, 0xd6,0x9f,0x3a,0xe8, +0x2c,0x7d,0xf8,0x0, 0x66,0x9f,0x14,0x5, 0xe8,0x2, 0x9f,0x9d,0xc1,0x81,0xe3,0xff, +0xc7,0xfe,0xe8,0x2, 0xb7,0x9d,0xe0,0xb, 0xd6,0x77,0x3c,0x65,0xe0,0xb, 0xd6,0x74, +0xe8,0x2, 0x9f,0x9d,0xe0,0x28,0x3c,0x5, 0xcf,0x81,0xe8,0x2, 0xb7,0x9d,0xe2,0x1, +0xc1,0xff,0xe7,0xff,0x24,0x17,0x17,0x82,0xe1,0x2f,0x3f,0xa3,0xe7,0xff,0x2f,0xb6, +0xe7,0xff,0x0, 0x90,0xc0,0x4, 0xf8,0x0, 0xe, 0xa8,0xb, 0xe1,0x8, 0xb7,0xf8,0x0, +0xc, 0x3c,0xc0,0x7c,0xe8,0x0, 0x61,0x1f,0xe2,0x0, 0x79,0x84,0x17,0x80,0xe0,0x80, +0xaf,0xb3,0xea,0x2, 0x7c,0x28,0xe0,0x2, 0x9f,0x92,0xe1,0x0, 0xcf,0x80,0xe0,0x2, +0xb7,0x92,0xdd,0xcc,0x3c,0x63,0xdf,0x2, 0x4f,0x87,0xe0,0x1, 0x27,0x86,0xe0,0x0, +0x1a,0xc, 0xe8,0x0, 0x61,0x97,0x32,0x42,0xe3,0xff,0xc2,0x7f,0x12,0x83,0xf0,0x7, +0x14,0x60,0xf7,0xff,0x14,0xfc,0xf0,0xe, 0x15,0x0, 0xe7,0x0, 0x13,0x0, 0x13,0xfb, +0xf0,0x0, 0x15,0xe0,0xf0,0x1e,0x16,0x10,0xe1,0x33,0x14,0x3b,0xe0,0xb, 0xd7,0x46, +0xe0,0x1, 0xb2,0x13,0xf0,0x1, 0xb4,0x33,0xa7,0xe3,0xe8,0xf, 0x3f,0xd9,0xcf,0x82, +0xbf,0xe3,0x17,0x97,0xf0,0x0, 0xbd,0x3, 0xbf,0xb3,0xa7,0x83,0xe0,0x10,0xcf,0x80, +0xbf,0x83,0xe0,0x2, 0x9f,0x92,0xe2,0xff,0xc7,0xff,0xe0,0x2, 0xb7,0x92,0xe0,0x2, +0x9f,0x92,0xcf,0x84,0xe0,0x2, 0xb7,0x92,0xa7,0x93,0x37,0xca,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x93,0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x2f,0x84,0x17,0x81,0xe8,0x2, +0x6f,0xaa,0xe0,0x2, 0x9f,0x92,0x3f,0xc6,0xe0,0x2, 0xb7,0x92,0xe0,0x2, 0x9f,0x92, +0x3f,0xd7,0xe0,0x2, 0xb7,0x92,0x17,0x80,0xf0,0x0, 0xbd,0x93,0xbf,0xb3,0xf0,0x0, +0xbe,0x3, 0xe8,0x2, 0x6f,0xc9,0xe0,0x2, 0x9f,0x92,0xe2,0xff,0xc7,0xff,0xe0,0x2, +0xb7,0x92,0xe0,0x2, 0x9f,0x92,0xcf,0x84,0xe0,0x2, 0xb7,0x92,0xe8,0x2, 0x4f,0xc9, +0x27,0xfe,0x17,0x80,0xe8,0x2, 0x6f,0xc9,0xe0,0x2, 0x9f,0x92,0x3f,0xc6,0xe0,0x2, +0xb7,0x92,0xe0,0x2, 0x9f,0x92,0x3f,0xd7,0xe0,0x2, 0xb7,0x92,0xe8,0x2, 0x4f,0xaa, +0x2f,0x84,0xc2,0xff,0xe7,0xff,0x2a,0xa2,0xe8,0x2, 0x4f,0xaa,0x27,0x8d,0xe0,0x0, +0x1c,0xd, 0x17,0x80,0xe8,0x2, 0x6f,0xaa,0xde,0x6d,0xe8,0x2, 0x6c,0x28,0xdd,0xbc, +0x14,0x7, 0x3c,0x10,0xde,0x7b,0xc0,0x4, 0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe8,0x0, +0x4f,0xd9,0x2f,0x83,0xe7,0xfe,0x0, 0xdc,0xe7,0xfd,0x0, 0xcd,0x8, 0xb2,0x11,0x5, +0x3c,0x62,0xc1,0x1, 0xd3,0x71,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, 0xc9,0x1d,0x1, 0xf9, +0x9, 0x61,0xe2,0xff,0x17,0xf0,0xa7,0xf, 0xe0,0x0, 0x1f,0xa1,0x3f,0x7f,0x1, 0x97, +0xe2,0xff,0x17,0xf4,0xa7,0xf, 0xe0,0x0, 0x1f,0xa2,0x3f,0x7f,0x1, 0x90,0xe2,0xff, +0x17,0xf8,0xa7,0xf, 0xe0,0x0, 0x1f,0xa3,0x3f,0x7f,0x1, 0x89,0xe2,0xff,0x17,0xfc, +0xa4,0xf, 0xe0,0x0, 0x1f,0xa4,0xe0,0x28,0x3c,0xf, 0x38,0x82,0x14,0x0, 0x38,0x82, +0xe8,0x0, 0x4f,0xd9,0x27,0x9b,0x8, 0xb1,0xe8,0x0, 0x67,0x9f,0xe0,0x1, 0xa7,0xef, +0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x27,0x85,0xe2,0xff,0x17,0xf8,0x17,0x0, 0xbf,0xf, +0xdf,0xd1,0x24,0x9, 0xe2,0xff,0x17,0xf8,0x17,0x0, 0xbf,0xf, 0x17,0x81,0xe8,0x2, +0x6f,0xb0,0x0, 0x83,0xe8,0x2, 0x6c,0x30,0x8, 0xe1,0x38,0x82,0xe8,0x2, 0x4c,0x30, +0x38,0x82,0x8, 0xb1,0xd5,0x7d,0xe0,0x60,0x3f,0x87,0xe0,0x0, 0x1f,0x9, 0xe0,0x1, +0xbf,0x3f,0xe0,0x0, 0x1f,0x11,0xe0,0x1, 0xbf,0x4f,0xe0,0x0, 0x1f,0x5, 0xe0,0x1, +0xbf,0x6f,0xe0,0x0, 0x1f,0x6, 0xe0,0x2, 0xbf,0x4f,0x8, 0xe1,0xe0,0x0, 0x1e,0xa5, +0xe0,0x2, 0x9f,0x9d,0xe2,0x2, 0xc7,0x80,0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0, +0x27,0x93,0xe0,0x2, 0x9f,0x9d,0x37,0xc9,0xe2,0x0, 0xc7,0x81,0xe8,0x0, 0x6f,0xd9, +0xe4,0x0, 0xcf,0x81,0xa6,0xd, 0xe0,0xe, 0x37,0xa9,0xe7,0xfb,0x17,0xff,0x3f,0xdc, +0x3f,0xce,0xbf,0x8d,0x38,0x82,0x17,0x83,0xe8,0x0, 0x6f,0xd9,0x38,0x82,0xe0,0x0, +0x1f,0xa5,0x17,0x7f,0xb7,0x5f,0xe0,0x1, 0xb7,0x5f,0xe0,0x1e,0x17,0x3, 0xb7,0x3f, +0xe8,0x0, 0x4f,0x59,0x27,0xf, 0xe0,0xa0,0x17,0x14,0xb7,0x7f,0xe0,0x20,0x17,0x4, +0xe0,0x1, 0xb7,0x1f,0xe0,0x1, 0x9f,0x7f,0xe3,0xff,0xc7,0x7b,0xe0,0x1, 0xb7,0x7f, +0x0, 0x90,0x17,0x4, 0xb7,0x7f,0xe0,0x1, 0xb7,0x1f,0xe0,0x1, 0x9f,0x7f,0xcf,0x4, +0xe0,0x1, 0xb7,0x7f,0xe0,0x2, 0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x2, 0xb7,0x1f, +0xa7,0xf, 0xe0,0x10,0xcf,0x0, 0xbf,0xf, 0x17,0x7b,0xe0,0x1, 0xb7,0x3f,0xeb,0x0, +0xcf,0x80,0xa6,0xaf,0x17,0x78,0x3f,0x5d,0xbf,0x2f,0xe1,0x80,0x17,0xb, 0xbf,0x1f, +0x38,0x82,0x8f,0x8, 0x8f,0x98,0xe0,0x1, 0x14,0x7f,0x3f,0x9e,0xe0,0x28,0x3f,0x88, +0x38,0x82,0x8, 0xb4,0xe0,0x0, 0x19,0x83,0x39,0x68,0x39,0x98,0x3c,0x63,0x3a,0x69, +0xdf,0xf1,0x24,0x3, 0x8f,0x83,0x0, 0x88,0xe0,0x0, 0x1f,0x88,0x39,0x1f,0x3c,0x62, +0xdf,0xe9,0x24,0x3, 0x8f,0x82,0xaf,0x84,0xa, 0x61,0xe8,0x0, 0x4f,0xd9,0x27,0x97, +0x8, 0xb1,0xe0,0x0, 0x1c,0x83,0x15,0x16,0xe0,0x1f,0x14,0x0, 0xd2,0xb7,0xe0,0x0, +0x1c,0x88,0x15,0x16,0xe0,0x22,0x14,0x20,0xd2,0xb1,0xea,0x0, 0x7c,0xda,0x14,0x0, +0xdf,0xd9,0xea,0x0, 0x7c,0xd8,0x14,0xe, 0x8, 0xa1,0x0, 0xd4,0x38,0x82,0xe8,0x0, +0x4f,0xd9,0x27,0x9e,0x8, 0xb1,0xc0,0x7c,0x14,0x86,0x15,0x2, 0x3c,0x90,0xe0,0x1f, +0x14,0x0, 0xd2,0x9c,0x5f,0x3, 0xe1,0xff,0x17,0xff,0x3f,0x7f,0x1, 0x8f,0xe0,0x0, +0x1c,0x88,0xe0,0x1, 0x15,0x0, 0xe0,0xa2,0x14,0x20,0xd2,0x90,0xe0,0x0, 0x1c,0x88, +0xe0,0x1, 0x15,0x0, 0xe0,0x1f,0x14,0x0, 0xd2,0x2a,0xc0,0x4, 0x8, 0xe1,0x38,0x82, +0xe0,0x0, 0x1f,0xa6,0x17,0x0, 0xaf,0x7f,0x17,0x7c,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, +0x17,0x88,0xe0,0x61,0x3f,0x91,0x17,0x90,0xe0,0x61,0x3f,0x91,0x38,0x82,0x8, 0xb1, +0xeb,0x0, 0xcf,0x0, 0xa7,0x9e,0xcf,0xc0,0xbf,0x9e,0xdf,0xeb,0xe8,0x0, 0x4f,0xd9, +0x27,0x92,0xe8,0x0, 0x47,0xda,0xe0,0x0, 0x1f,0x26,0xe2,0x1, 0xc7,0xfe,0xe0,0x1, +0xaf,0xbe,0xe0,0x61,0x3f,0x82,0xcf,0x88,0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82, +0xcf,0x90,0x0, 0x8b,0xe0,0x61,0x3f,0x2, 0x17,0xf7,0x3f,0xde,0xe0,0x61,0x3f,0x92, +0xe0,0x61,0x3f,0x2, 0x17,0xef,0x3f,0xde,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0xe, 0xbf, +0xe8,0x0, 0x67,0xcf,0xe0,0x0, 0x1f,0x27,0xc7,0x81,0xe8,0x0, 0x7f,0xcf,0x17,0xdf, +0xa6,0xbe,0x3f,0xdd,0xbf,0xbe,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xad, +0x38,0x0, 0xe0,0x0, 0x1f,0x27,0x17,0x80,0xe8,0x0, 0x7f,0xcf,0x17,0x81,0xbf,0xbe, +0x17,0xfc,0xa6,0xae,0x3f,0xdd,0xcf,0x82,0xbf,0xae,0xe0,0x2, 0x17,0x80,0xb7,0x9e, +0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xe0,0x61,0x3f,0x82,0xe0,0x20,0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x0, 0x1f,0xa7,0x17,0x6f,0xa6,0xbf,0x3f,0x5d, +0xbf,0x3f,0x17,0x0, 0xe8,0x0, 0x7f,0x4f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0x38,0x82, +0xe0,0x0, 0x1f,0x27,0x17,0xef,0xa6,0xbe,0x3f,0xdd,0xbf,0xbe,0x17,0x80,0xe8,0x0, +0x7f,0xcf,0x38,0x82,0xe0,0x0, 0x1f,0xa7,0x17,0x0, 0xbf,0x3f,0xb7,0x1f,0x17,0x7c, +0xa6,0xaf,0x3f,0x5d,0xbf,0x2f,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xe0,0x61, +0x3f,0x2, 0xe7,0xdf,0x17,0xff,0x3f,0xde,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe1,0xff, +0x17,0x7f,0xc4,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7e,0x1, 0x8, 0x17,0x89,0xc7,0xff, +0xe2,0x1, 0xc7,0xff,0x27,0xf7,0x0, 0x0, 0x0, 0xfb,0x38,0x82,0xc0,0x7c,0xe0,0xa0, +0x17,0x80,0x7f,0x81,0xe8,0x2, 0x4f,0x9e,0x27,0x93,0xe0,0x0, 0x1f,0xa5,0xe0,0x1, +0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x1, 0xb7,0x1f,0x16,0xff,0x67,0x1, 0x3e,0x9e, +0x7e,0x81,0x2f,0x7c,0xe0,0x1, 0x9f,0x1f,0xcf,0x4, 0xe0,0x1, 0xb7,0x1f,0xc0,0x4, +0x38,0x82,0xe0,0x0, 0x1f,0xa8,0xa7,0x2f,0xe2,0x0, 0xc7,0x7f,0x27,0xd, 0xa6,0xaf, +0xe7,0xff,0x17,0x0, 0x3f,0x5d,0xcf,0x60,0xbf,0x2f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f, +0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x38,0x82,0xe0,0x0, 0x1f,0xa8,0xa7,0x1f,0xcf,0x1, +0xbf,0x1f,0xe7,0xff,0x17,0x3f,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0x8, 0xb1, +0xdf,0xf4,0xe8,0x0, 0x4f,0xd9,0x27,0x96,0xe0,0x0, 0x1f,0xa8,0xa7,0x2f,0xe0,0x1, +0xcf,0x0, 0xbf,0x2f,0xe7,0xff,0x17,0x0, 0xa6,0xaf,0x3f,0x5d,0xcf,0x60,0xbf,0x2f, +0xa7,0x1f,0xcf,0x2, 0xbf,0x1f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0xa7,0xf, 0xcf,0x40, +0xbf,0xf, 0xe0,0x61,0x3f,0x2, 0xe7,0xf7,0x17,0xff,0x3f,0xde,0xe0,0x61,0x3f,0x92, +0x8, 0xe1,0xe0,0x0, 0x1d,0x8b,0x17,0x80,0x16,0x1, 0xe0,0xe, 0x3d,0x9f,0xc7,0x81, +0xe2,0x0, 0xcf,0x90,0xae,0xe, 0xe0,0x0, 0x1e,0x8b,0x1, 0xf8,0x17,0x83,0xaf,0xbd, +0x17,0x2, 0xaf,0xcd,0x14,0x1, 0xaf,0x6d,0x17,0x0, 0xe0,0x0, 0x1d,0x10,0x3c,0xee, +0xe0,0xf, 0x37,0x22,0x3f,0x9a,0xbc,0x8f,0x16,0x0, 0xe0,0x17,0x3e,0x9e,0xe0,0xb, +0x3e,0x9c,0xf0,0x0, 0x8b,0xb, 0xe8,0x0, 0x8d,0x87,0xf0,0x40,0x3b,0x7b,0x5, 0x87, +0xa5,0x8f,0xe0,0x16,0x34,0x3c,0xe8,0xb, 0x3d,0xc6,0xbd,0x8f,0xc6,0x1, 0xe2,0x0, +0xce,0x10,0x1, 0xee,0xc7,0x1, 0xe2,0x0, 0xcf,0x10,0x1, 0xe3,0xe0,0x0, 0x1f,0x8a, +0x17,0x0, 0xe0,0x6, 0xaf,0xf, 0x38,0x82,0xe8,0x0, 0x4f,0xd9,0x27,0x98,0xe8,0x0, +0x67,0x20,0xa7,0x9e,0xcf,0x81,0xbf,0x9e,0xe8,0x0, 0x67,0x1f,0x9f,0xbe,0xe0,0x1e, +0xcf,0x80,0xb7,0xbe,0xe0,0x61,0x3f,0x2, 0xe7,0xef,0x17,0xff,0x3f,0xde,0xe0,0x61, +0x3f,0x92,0xe8,0x0, 0x67,0x9a,0xe0,0x6, 0x17,0x6, 0xbf,0xf, 0x38,0x82,0xe8,0x0, +0x67,0x9a,0x17,0x0, 0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c, +0xa6,0x8f,0xe7,0x7f,0x17,0x7f,0x3f,0x5d,0xbf,0xf, 0x8c,0x7f,0x38,0x82,0x8, 0xb2, +0xe8,0x0, 0x61,0x1a,0x17,0xfb,0xa7,0x2, 0xe2,0x0, 0xcc,0x1, 0x3f,0xde,0xbf,0x82, +0x1, 0x83,0x14,0x6, 0x0, 0x82,0x14,0x4, 0xe0,0xb, 0xd2,0xa4,0xa7,0x82,0xcf,0x84, +0xbf,0x82,0x9, 0x61,0x8, 0xb2,0xe8,0x0, 0x61,0x1a,0x17,0xfb,0xa7,0x2, 0x14,0x5, +0x3f,0xde,0xbf,0x82,0xe0,0xb, 0xd2,0x96,0xdf,0xd3,0xa7,0x82,0xe2,0x0, 0xc4,0x1, +0xcf,0x84,0xbf,0x82,0x9, 0x61,0x8, 0xb4,0xe8,0x0, 0x61,0x9a,0x17,0xfb,0xa7,0x3, +0xe0,0x1, 0x14,0x1f,0x3f,0xde,0xbf,0x83,0xe0,0xb, 0xd2,0x84,0xdf,0xc1,0x3a,0x68, +0xdf,0xbf,0xe4,0x2, 0x34,0x28,0xe4,0x2, 0x31,0x40,0xdf,0xba,0xa7,0x83,0x3c,0x42, +0xe4,0x4, 0x32,0x20,0xe3,0xff,0xc4,0x7f,0xcf,0x84,0x3c,0x14,0xbf,0x83,0xa, 0x61, +0x8, 0xb4,0xe8,0x0, 0x67,0x1f,0x14,0x1, 0xe0,0x1, 0x9f,0x9e,0x11,0xfb,0xe0,0x80, +0xcf,0x80,0xe0,0x1, 0xb7,0x9e,0xdf,0xb4,0xe8,0x0, 0x61,0x1a,0x14,0x5, 0xa7,0x82, +0x3f,0xd3,0xbf,0x82,0xe0,0xb, 0xd2,0x5e,0xdf,0x9b,0xa7,0x82,0x3a,0x68,0xcf,0x84, +0xbf,0x82,0x14,0x6, 0xa7,0x82,0x3f,0xd3,0xbf,0x82,0xe0,0xb, 0xd2,0x53,0xa7,0x82, +0x14,0x1, 0xcf,0x84,0xbf,0x82,0xa7,0x82,0x39,0xdf,0xb9,0x82,0xe0,0xb, 0xd2,0x4a, +0xe0,0x1, 0x14,0x3, 0x3c,0x54,0xe0,0xb, 0xd2,0x45,0xa7,0x82,0xcf,0x84,0xbf,0x82, +0xdf,0xa2,0x2c,0x7f,0xa, 0x61,0x8, 0xb2,0xe8,0x0, 0x67,0x1a,0x17,0xfb,0xa6,0x8e, +0x39,0x69,0x3f,0xdd,0xbf,0x8e,0xe0,0xb, 0xd2,0x35,0xe4,0xf, 0x31,0x40,0x3c,0x6f, +0xe2,0x1, 0xc4,0x7f,0xe0,0xb, 0xd2,0x2e,0xe0,0xf, 0x31,0x48,0x3c,0x6f,0xe2,0x1, +0xc4,0x7f,0xe0,0xb, 0xd2,0x27,0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0x9, 0x21,0xe1,0x64, +0x0, 0xa1,0x8, 0xb4,0x3a,0x68,0x14,0x1, 0x39,0x69,0x39,0xea,0xdf,0x69,0x3c,0xe4, +0x14,0x2, 0xdf,0xda,0xe8,0x0, 0x67,0x9a,0x3c,0xe2,0x39,0x92,0xe7,0x7f,0x16,0xff, +0x3c,0xf3,0x1, 0xd, 0xe1,0x80,0x87,0x19,0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0x0, 0xf3,0xa7,0xf, 0xcf,0x4, +0xbf,0xf, 0xde,0x52,0xdf,0x60,0x24,0x6, 0xe8,0x0, 0x67,0xcf,0xe2,0x0, 0xcf,0xb2, +0x5, 0xfa,0xe8,0x0, 0x67,0xcf,0xe2,0x0, 0xcf,0xb2,0x2, 0x84,0xa, 0x21,0xe7,0xfc, +0x0, 0xd1,0xe0,0x27,0x14,0x8, 0xa, 0x21,0xe7,0xfc,0x0, 0xeb,0x8, 0xb7,0xe0,0x1, +0x11,0x7f,0x39,0x58,0xe0,0x2, 0x17,0x80,0xe0,0x2, 0x3f,0xa2,0xe3,0xff,0xc1,0x7f, +0x39,0x7a,0x3, 0xaf,0x39,0xea,0x3d,0x62,0x3a,0xe9,0x3a,0x68,0xdf,0xbb,0xe0,0xa, +0x39,0xa2,0x39,0xea,0x3a,0x12,0xe3,0xff,0xc1,0xff,0x39,0x15,0x3b,0x62,0x3a,0xe3, +0xe0,0x7, 0x3a,0x22,0xe2,0x1, 0xca,0xff,0xe0,0x8, 0x3b,0x17,0x5, 0x8c,0x3c,0xe6, +0xe0,0x2, 0x15,0x0, 0xe1,0xfe,0xc2,0x80,0xdf,0xa5,0xe3,0xff,0xc2,0xff,0xe0,0x2, +0xc3,0x0, 0x0, 0xf1,0xe0,0xf, 0x31,0xc8,0xe7,0xfe,0x15,0x0, 0x3d,0x3f,0xe0,0x9, +0x37,0xa8,0x3d,0x13,0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x3a,0x19,0x3c,0x92,0x25,0x2, +0xdf,0x91,0x14,0x1, 0xb, 0xe1,0x8, 0xb2,0x39,0x68,0x14,0x1, 0xde,0xf9,0xe0,0x9, +0x31,0x2c,0x14,0x20,0xdf,0x69,0xe8,0x0, 0x67,0x1a,0xa7,0x8e,0xcf,0x84,0xbf,0x8e, +0xdd,0xf3,0xdf,0x1, 0x24,0x6, 0xe8,0x0, 0x67,0xcf,0xe2,0x3, 0xcf,0xf4,0x5, 0xfa, +0xe8,0x0, 0x67,0xcf,0xe2,0x3, 0xcf,0xf4,0x2, 0x84,0x9, 0x21,0xe7,0xfb,0x0, 0xf2, +0xe0,0x27,0x14,0x8, 0x9, 0x21,0xe7,0xfc,0x0, 0x8c,0x8, 0xb3,0x39,0x69,0x39,0xea, +0xe0,0xb, 0xd1,0x97,0xe8,0x0, 0x67,0x9a,0x39,0x92,0x16,0x80,0xe7,0x7f,0x16,0x7f, +0x39,0x73,0x1, 0xe, 0xae,0xff,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c, +0xa7,0xf, 0x3f,0x5c,0xbf,0xf, 0x8f,0x7f,0xe1,0x80,0xaf,0x12,0x0, 0xf2,0xa7,0xf, +0xcf,0x4, 0xbf,0xf, 0x9, 0xe1,0x8, 0xb1,0xe0,0x0, 0x1c,0x87,0xe0,0xa2,0x14,0x0, +0x15,0x16,0xdf,0xdc,0xe0,0x0, 0x1f,0x87,0xe1,0xff,0x17,0x7f,0x9c,0xf, 0x9e,0x9f, +0x3e,0x98,0x3e,0xfe,0x1, 0x9f,0xe0,0x1, 0x9f,0x1f,0xe0,0x1, 0x9e,0x2f,0x3e,0x1e, +0x3e,0x7d,0x1, 0x98,0x24,0x18,0x9d,0xaf,0x9e,0xbf,0x3e,0x9b,0x3e,0xfc,0x1, 0x92, +0x9e,0x4f,0x9f,0xdf,0x3f,0x9c,0x3f,0xfd,0x1, 0x8d,0xe4,0xe, 0x37,0x20,0x3c,0x4e, +0xe8,0x0, 0x7c,0x4d,0xe2,0xf0,0x17,0x80,0xe8,0x0, 0x64,0x4d,0xe1,0x28,0x3f,0xa8, +0x0, 0x82,0x14,0x0, 0x8, 0xe1,0xe8,0x0, 0x67,0x20,0xa7,0x9e,0xe0,0x80,0xcf,0x80, +0xbf,0x9e,0xe0,0x0, 0x17,0x60,0xe8,0x0, 0x67,0x97,0xbf,0x1f,0x17,0x0, 0xbf,0x3f, +0xe8,0x0, 0x4f,0x59,0xe2,0x0, 0xcf,0x1, 0x1, 0x8d,0x17,0x35,0xe0,0x3, 0xaf,0x7f, +0xe0,0xe, 0x17,0x1, 0xbf,0xf, 0xe0,0x61,0x3f,0x2, 0xe7,0xff,0x17,0xbf,0x3f,0xde, +0x0, 0x88,0x2f,0x9, 0xe0,0x1e,0x17,0x10,0xbf,0xf, 0xe0,0x61,0x3f,0x82,0xcf,0xc0, +0xe0,0x61,0x3f,0x92,0xe0,0x0, 0x17,0xc0,0xe0,0x61,0x3f,0x91,0x38,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3d,0xe8,0x0, 0x4f,0xd9,0xe8,0x0, 0x61,0x9f,0xe2,0x0, 0xcf,0x81, +0xe0,0x1, 0x1, 0xae,0xe0,0x3, 0x9f,0x93,0xe2,0x1, 0xc7,0xf0,0xe2,0x1, 0xcf,0xf0, +0xe0,0x1, 0x1, 0x26,0xe0,0x2, 0x12,0x80,0xe0,0x2, 0x17,0x82,0x9f,0x5, 0x9f,0x8f, +0x3f,0x9e,0xe1,0xff,0x17,0x7f,0x3f,0xfe,0x1, 0xd, 0xe0,0x2, 0x17,0x9c,0xa7,0xf, +0xe3,0xff,0xc7,0x7f,0xbf,0xf, 0xa7,0xf, 0xe8,0xab,0xcf,0x3b,0xbf,0xf, 0xe0,0x1, +0x0, 0x8f,0xe8,0x0, 0x61,0x17,0x13,0x0, 0x13,0xfe,0xf0,0xe, 0x15,0x41,0xf7,0xff, +0x15,0xfc,0xf0,0x0, 0x14,0xe0,0xf0,0xe, 0x14,0x1, 0x9a,0x5, 0x32,0x42,0xe0,0x1d, +0x32,0x48,0xe2,0x1, 0xc2,0x7f,0xf2,0xf, 0x3e,0xc4,0xe2,0x6, 0x3b,0x4f,0xe2,0x1, +0xc3,0x7f,0xe0,0xb, 0xd1,0x7b,0xf0,0x40,0x3e,0x68,0x2c,0x7c,0xe0,0x2, 0x9f,0x93, +0x14,0xd, 0x3f,0xd7,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd1,0x56,0x14,0x5, 0xe0,0xb, +0xd1,0x53,0xe8,0x40,0x3c,0x6c,0xe0,0xb, 0xd1,0x4f,0xe8,0x40,0x3c,0x6c,0xe0,0xb, +0xd1,0x4b,0xe8,0x40,0x3c,0x6d,0xe0,0xb, 0xd1,0x47,0x3c,0x64,0xe0,0xb, 0xd1,0x44, +0x3c,0x66,0xe0,0xb, 0xd1,0x41,0x14,0xe, 0xe0,0xb, 0xd1,0x3e,0xe0,0x1, 0x14,0x1, +0xe0,0xb, 0xd1,0x3a,0xe8,0x40,0x3c,0x6c,0xe0,0xb, 0xd1,0x36,0xe0,0x2, 0x9f,0x93, +0xcf,0x81,0xe0,0x2, 0xb7,0x93,0x24,0x20,0xa7,0xb2,0xcf,0x81,0xbf,0xb2,0xf0,0x0, +0xbd,0x2, 0xf0,0x1, 0xb6,0x12,0x9f,0x85,0x37,0xc2,0xe0,0x1, 0xb7,0xb2,0xa7,0xe2, +0xe8,0xf, 0x3f,0xdb,0xcf,0x81,0xbf,0xe2,0x17,0x9f,0xbf,0xb2,0xa7,0x92,0x37,0xca, +0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x12,0x17,0xfe,0x3f,0xde,0xbf,0x92,0xa7,0x82, +0xe0,0x1, 0xcf,0x80,0xbf,0x82,0xe0,0xb, 0xd1,0x29,0x3a,0x68,0x2c,0x7d,0xe8,0x0, +0x67,0x97,0xf0,0x0, 0xbc,0x9f,0xbc,0x3f,0x14,0xf, 0xf0,0x0, 0xbc,0xf, 0xe0,0x2, +0x9f,0x93,0x3f,0xd7,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd0,0xfe,0xe0,0x1, 0x14,0x1, +0xe0,0xb, 0xd0,0xfa,0x3c,0x64,0xe0,0xb, 0xd0,0xf7,0xe0,0x2, 0x9f,0x93,0xcf,0x81, +0xe0,0x2, 0xb7,0x93,0xe7,0xff,0x24,0x3, 0xe7,0xfe,0x0, 0xe9,0xe0,0xef,0x14,0x19, +0xe0,0xb, 0xd2,0x4, 0x17,0x80,0xe0,0x3, 0xb7,0x93,0xf8,0x0, 0xe, 0xa8,0xb, 0xe1, +0xea,0x0, 0xcc,0x2, 0xe0,0x2, 0xcc,0x0, 0x14,0x80,0xea,0x0, 0xcd,0x2, 0xe0,0x2c, +0xcd,0x58,0x3d,0x28,0xd0,0xb4,0xea,0x0, 0xcc,0x0, 0xe0,0x0, 0xcc,0x0, 0x24,0x2, +0x3c,0x1, 0x14,0x0, 0x14,0x80,0xd0,0x3e,0x3a,0x80,0x0, 0x0, 0x3a,0x80,0xe0,0x40, +0x17,0x80,0xe2,0xb0,0x16,0x80,0xa6,0xf, 0xe0,0xe, 0x3f,0x9d,0xc7,0x84,0xe2,0x4f, +0xcf,0xf0,0xbe,0xe, 0x1, 0xf9,0x38,0x82,0x8, 0xb1,0x3f,0x83,0xdb,0x68,0xdb,0x88, +0xdf,0xef,0xe0,0x61,0x3f,0x2, 0x17,0xf7,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x61, +0x3f,0x2, 0x17,0xef,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xdd,0x3f,0xde,0xdd,0xdb,0xce, +0xdc,0x51,0xdb,0x40,0xdc,0xff,0x3b,0x0, 0xdb,0x1c,0x8, 0xa1,0xe7,0xf9,0x0, 0xd9, +0xe8,0x0, 0x4f,0xd9,0x27,0x8e,0x8, 0xb1,0xdb,0x32,0x24,0xa, 0xdd,0x7d,0xe8,0x0, +0x7c,0x46,0xdd,0x97,0xdc,0x5, 0xef,0xff,0xd7,0x39,0xdc,0xac,0x0, 0xfd,0x8, 0xe1, +0x38,0x82,0x8, 0xb1,0xdf,0xd2,0xde,0xec,0xdc,0xa5,0xde,0xbe,0xda,0xd1,0xdf,0xe9, +0xdc,0x62,0xdc,0xa0,0xde,0xb9,0xe0,0xb, 0xd2,0xfc,0x0, 0x80,0x15,0x0, 0x0, 0x81, +0x3c,0xf8,0x17,0x81,0x3, 0x90,0xe2,0x0, 0xcc,0x80,0x4, 0xd, 0x16,0x0, 0x34,0xa1, +0x37,0xa1,0xe1,0x2e,0x3c,0x19,0xe1,0x2d,0x3f,0x8c,0x27,0x13,0x26,0x92,0xe2,0x0, +0xcc,0x80,0x3, 0x76,0x17,0x0, 0x3c,0x79,0x4, 0x83,0x3c,0x29,0x3f,0x4f,0x37,0xc1, +0x34,0xc1,0x2f,0xfa,0xe2,0x0, 0xcd,0x0, 0xe0,0x6e,0x39,0xa8,0x3c,0x6e,0x38,0x82, +0x3f,0x6f,0x2f,0xf1,0x0, 0xf8,0x0, 0x0, 0x3d,0xe8,0xe2,0x0, 0xcd,0x3, 0x5, 0xad, +0xe0,0xc, 0x3c,0x49,0xe2,0x0, 0xc6,0x3, 0x2e,0x28,0xc5,0x7c,0xe0,0xc, 0x35,0x21, +0xea,0x0, 0xce,0x80,0xe0,0x31,0xce,0xbc,0xe2,0x0, 0xc6,0x18,0xe1,0x80,0xa7,0x19, +0x3e,0xac,0xe0,0xc, 0x35,0x44,0x3f,0xee,0xe0,0x0, 0x3e,0x82,0xe1,0x80,0xa7,0x19, +0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99,0xe1,0x80,0xbf,0x1b,0xe1,0x80,0xa7,0x19, +0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99,0xe1,0x80,0xbf,0x1b,0xc6,0x7f,0x6, 0x6f, +0xe1,0x80,0xbf,0x9b,0xe2,0x0, 0xc5,0x3, 0xc5,0x7f,0x6, 0x87,0xe1,0x80,0x86,0x19, +0xc5,0x7f,0xe1,0x80,0xae,0x1b,0x6, 0x7b,0x38,0x82,0x0, 0x0, 0xe2,0x0, 0xcd,0x3, +0x5, 0xaf,0xe2,0x1, 0xc4,0xff,0xe0,0xc, 0x34,0xa8,0x3c,0xcc,0xe4,0xc, 0x34,0xa0, +0x3c,0xcc,0xe0,0x41,0x3e,0x48,0xe2,0x0, 0xc6,0x3, 0xe0,0xb, 0x3e,0x18,0xe0,0xc, +0x3d,0x2c,0xe0,0xd, 0x36,0x44,0xe2,0x0, 0xc6,0xc, 0xea,0x0, 0xcf,0x80,0xe0,0x32, +0xcf,0xa8,0x3f,0xac,0xe0,0x0, 0x3f,0x82,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b, +0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b,0xc6,0xff,0x6, 0x77,0x3d,0x18,0xe0,0xc0, +0xac,0xba,0xac,0x9a,0xac,0xaa,0xac,0x88,0xac,0x98,0xac,0xa8,0x38,0x82,0x3d,0xe8, +0xc5,0x7f,0x6, 0x85,0xe1,0x80,0xac,0x9b,0xc5,0x7f,0x6, 0x7d,0x38,0x82,0x8, 0xb1, +0xe0,0x60,0x3c,0x87,0xea,0x4, 0x7f,0x80,0xe0,0x0, 0x15,0x60,0x3c,0x6f,0xdf,0x85, +0xe0,0x60,0x3c,0x17,0x8, 0xe1,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x14,0xc4,0x0, 0x2, 0x16,0x48,0x0, 0x1, 0x79,0x88, +0x0, 0x0, 0x10,0x4e,0x0, 0x2, 0x14,0xac,0x0, 0x2, 0x15,0x44,0x0, 0x0, 0x4, 0xb2, +0x0, 0x2, 0x15,0xc4,0x0, 0x2, 0x15,0xf8,0x0, 0x0, 0x5, 0x2c,0x0, 0x2, 0x5, 0x2c, +0x0, 0x2, 0x3, 0x0, 0x0, 0x2, 0x4, 0xc, 0x0, 0x2, 0x16,0x8, 0x0, 0x0, 0x5, 0x34, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5, 0x1c,0x80,0xb6,0x80,0xb, 0x1, 0x0, 0x0, 0x0, +0x1, 0x3, 0x70,0x0, 0x80,0x0, 0xd, 0x0, 0x80,0x0, 0x9, 0x0, 0x80,0x0, 0x8, 0x0, +0x80,0x0, 0x7, 0x0, 0x80,0x0, 0x6, 0x0, 0x80,0x0, 0x4, 0x0, 0x80,0x0, 0x3, 0x0, +0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x1, 0x0, 0x80,0x0, 0x0, 0x0, 0x55,0x50,0x47,0x52, +0x41,0x44,0x45,0x20,0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0x80,0x0, 0x1, 0x0, +0x80,0x0, 0x4, 0x0, 0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x3, 0x0, 0x55,0x50,0x47,0x52, +0x41,0x44,0x45,0x20,0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xe8,0x0, 0x67,0x1a,0xac,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa6,0x8e,0xe7,0x7f,0x17,0xff,0x3f,0xdd,0xbf,0x8e,0x14,0x1, 0x38,0x82,0x8, 0xb2, +0xe8,0x0, 0x67,0x1a,0x17,0xfb,0xa6,0x8e,0x39,0x68,0x3f,0xdd,0xbf,0x8e,0x14,0xb, +0xdf,0xe8,0xe4,0xf, 0x31,0x40,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdf,0xe2,0xe0,0xf, +0x31,0x48,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdf,0xdc,0x3c,0x62,0xe2,0x1, 0xc4,0x7f, +0xdf,0xd8,0x14,0x0, 0x9, 0x21,0x0, 0xd5,0x8, 0xb3,0xc0,0x7c,0x39,0x6a,0x39,0xe9, +0xdf,0xdf,0x16,0x8, 0xe8,0x0, 0x67,0x9a,0xe0,0xa, 0x31,0x42,0x3e,0x10,0x15,0x80, +0xe7,0x7f,0x14,0xff,0xc5,0x7f,0xe3,0xff,0xcd,0x7f,0x1, 0x15,0xe2,0x0, 0x7f,0x4, +0xad,0xff,0xa6,0x8f,0xe2,0x80,0xc6,0x80,0x26,0xfd,0xa6,0x8f,0x3e,0xd9,0xbe,0x8f, +0x8e,0xff,0xe1,0x80,0xae,0x9e,0x3f,0x7c,0x1, 0xf4,0x67,0x1, 0xc1,0x84,0xe0,0x40, +0xbf,0x13,0x0, 0xe9,0xa7,0xf, 0x14,0x1, 0xcf,0x4, 0xbf,0xf, 0xc0,0x4, 0x9, 0xe1, +0xe8,0x0, 0x66,0xa0,0xe2,0x0, 0xcd,0x1, 0xa7,0x9d,0xe0,0x40,0xcf,0x80,0xbf,0x9d, +0xe8,0x0, 0x67,0x9b,0x1, 0x83,0x17,0x2, 0x0, 0x82,0x17,0x0, 0xe0,0x9, 0xb7,0x5f, +0x17,0x21,0xb4,0x5f,0x35,0x28,0xe0,0x1, 0xb4,0xdf,0xe0,0x1, 0xcd,0x11,0xb7,0x3f, +0x17,0x18,0xe0,0x2, 0xb7,0x5f,0xb5,0x1f,0xe0,0x7, 0x97,0x1f,0xe2,0x0, 0xcf,0x0, +0x9f,0x1f,0x4, 0xc, 0xe2,0x0, 0xc7,0x8, 0xe4,0xe, 0x37,0x20,0xe4,0xe, 0x37,0x40, +0x27,0x74,0x9f,0x1f,0xcf,0x4, 0xb7,0x1f,0x0, 0xf0,0xe0,0x80,0xcf,0x0, 0xb7,0x1f, +0x17,0x0, 0xb7,0x1f,0xe0,0x5, 0x9c,0x5f,0xa7,0x1d,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x9d,0x38,0x82,0xe8,0x0, 0x67,0x17,0xe0,0x1, 0xac,0x3e,0xa7,0x9e,0xe2,0x0, +0xc7,0x81,0x27,0xfd,0xe8,0x0, 0x66,0x9f,0xe0,0x2, 0x9f,0x9d,0xe2,0x0, 0xc7,0x82, +0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0,0x27,0xf8,0xa6,0x9e,0x17,0xfe,0x3f,0xdd, +0xbf,0x9e,0xe0,0x1, 0x8c,0x3e,0x38,0x82,0xe8,0x0, 0x67,0x9f,0xe0,0x6, 0x8f,0x7f, +0xe0,0x2, 0x9c,0x1f,0xe2,0x1, 0xcf,0x2b,0x1, 0x87,0x17,0x80,0xe2,0x0, 0xc4,0x4, +0xe0,0x28,0x3c,0xf, 0x38,0x82,0xe3,0x0, 0xc4,0x0, 0xe4,0x8, 0x34,0x20,0xe4,0x8, +0x34,0x40,0x38,0x82,0x0, 0x80,0x0, 0x80,0xe, 0x3f,0xe8,0x0, 0x4f,0xd9,0xe0,0x1, +0x2f,0x88,0xe8,0x0, 0x66,0x97,0xa7,0xbd,0xe2,0x0, 0xc7,0x81,0xe0,0x1, 0x2f,0x81, +0xa7,0x9d,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x27,0xfc,0xa7,0x1d,0x17,0xfe,0x3f,0xde, +0xbf,0x9d,0xe8,0x2, 0x4f,0xc4,0xe0,0x1, 0x8e,0x3d,0x2f,0x85,0xe8,0x2, 0x6e,0x43, +0xe8,0x2, 0x6f,0xc2,0xe8,0x2, 0x4f,0x43,0xe2,0x1, 0xcf,0x2, 0x1, 0x19,0x2, 0x86, +0xe2,0x0, 0xcf,0x5, 0x1, 0xa, 0xe0,0x0, 0x0, 0xc7,0xe2,0x1, 0xcf,0x14,0x1, 0x21, +0xe2,0x1, 0xcf,0x21,0x1, 0x2e,0x0, 0xbf,0x2f,0x87,0xe8,0x2, 0x46,0x2a,0x17,0x2, +0xe0,0x1, 0xae,0x3d,0x0, 0xa8,0xe2,0x0, 0xcf,0x81,0x1, 0xba,0x0, 0xa0,0x2f,0x88, +0x17,0x1, 0xe8,0x2, 0x6f,0x40,0xe8,0x2, 0x6f,0x41,0x17,0x1, 0x0, 0xb2,0xe2,0x0, +0xcf,0x81,0x1, 0xae,0xe0,0x0, 0x1f,0x4, 0xe8,0x2, 0x6f,0xc2,0xae,0xe, 0x0, 0xa8, +0x2f,0x86,0xe8,0x2, 0x47,0x28,0xe0,0x1, 0xaf,0x3d,0x0, 0x8c,0xe2,0x0, 0xcf,0x82, +0x1, 0x9f,0xe0,0x0, 0x1f,0x4, 0xe0,0x1, 0x86,0x3d,0xae,0xe, 0x17,0x1, 0x0, 0x96, +0x2f,0x86,0x17,0x3, 0xe8,0x2, 0x6f,0x41,0x3f,0x6f,0x0, 0x93,0xe0,0x0, 0x1f,0x4, +0xe0,0x1, 0x86,0x3d,0x3f,0x1f,0xae,0xe, 0xe8,0x2, 0x4f,0x41,0x3f,0x7f,0x5, 0xef, +0x17,0x0, 0x0, 0x8b,0x17,0x1, 0xe8,0x2, 0x6f,0x41,0xe8,0x2, 0x6f,0x42,0x17,0x0, +0xe8,0x2, 0x4e,0x41,0x3e,0x7f,0x5, 0x84,0xc7,0x81,0xe8,0x2, 0x6f,0xc4,0xe8,0x2, +0x4f,0xc2,0x27,0x89,0x17,0x80,0xe8,0x2, 0x6f,0xc4,0xe8,0x2, 0x6f,0xc3,0x17,0x81, +0xe8,0x2, 0x6f,0xc9,0x2f,0x5, 0xa7,0x8d,0xe0,0x10,0xcf,0x80,0xbf,0x8d,0xe0,0x0, +0x17,0xc0,0xe0,0x61,0x3f,0x91,0xf, 0xac,0x38,0x0, 0x8, 0xb2,0x99,0xa, 0x9f,0x9a, +0xe1,0xff,0x17,0x7f,0x3f,0x92,0x3f,0xfe,0x1, 0x8c,0x34,0xc1,0x34,0x41,0x15,0x1, +0xe3,0xff,0xc4,0xff,0xe3,0xff,0xc4,0x7f,0xde,0xf4,0xe0,0x28,0x39,0x8, 0x0, 0x82, +0x14,0x0, 0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x11,0x0, 0xe0,0x2, 0x15,0x4, 0x3c,0xe2, +0x14,0x0, 0xdf,0xe4,0x24,0x26,0xe0,0x2, 0x17,0x92,0x9c,0x8f,0xe0,0x2, 0x17,0x94, +0x9f,0xf, 0xe1,0xff,0x16,0x7f,0x3f,0x19,0xe0,0x2, 0x16,0x82,0x3f,0x7c,0x9f,0x82, +0x9e,0x8d,0x1, 0x97,0x3e,0x9f,0x3e,0xfe,0x1, 0x94,0xe4,0x9, 0x34,0xa0,0x3c,0xcf, +0xe2,0xf0,0x17,0x80,0x3c,0xff,0x2, 0x8d,0x17,0x83,0x3f,0xd9,0x2f,0x8a,0xe0,0x2, +0x15,0x8, 0xe1,0xfc,0xc4,0xe0,0xe0,0x3, 0x14,0x20,0x9, 0x21,0xe7,0xff,0x0, 0xbf, +0x14,0x0, 0x9, 0x61,0x8, 0xb2,0x11,0x3, 0xe8,0x0, 0x65,0x4d,0x14,0x80,0xe0,0xa0, +0x14,0x0, 0xde,0x8b,0xdf,0xc8,0x2c,0x7, 0xc1,0x7f,0xe2,0x1, 0xc1,0x7f,0x29,0x75, +0x3c,0x62,0x0, 0x82,0x14,0x1, 0x9, 0x61,0x8, 0xb5,0xe8,0x0, 0x4f,0xd9,0x3a,0x68, +0xe2,0x0, 0xcf,0x81,0xe2,0x1, 0xc2,0x7f,0xe0,0x2, 0x34,0x48,0x1, 0x96,0xe8,0x0, +0x61,0x9f,0x12,0xfe,0xe0,0x2, 0x9f,0x93,0xe0,0x1, 0x14,0x2, 0x3f,0xd5,0xe0,0x2, +0xb7,0x93,0xde,0xd1,0x3c,0x62,0xde,0xcf,0xe0,0x2, 0x9f,0x93,0x3a,0x78,0xcf,0x81, +0xe0,0x2, 0xb7,0x93,0x1, 0xf0,0x0, 0xa9,0x2f,0xa8,0xe8,0x0, 0x67,0x1f,0xe8,0x2, +0x6f,0xc9,0xe0,0x2, 0x9e,0x9e,0xe0,0x0, 0x1e,0x4, 0xe1,0x0, 0xce,0x80,0xe0,0x2, +0xb6,0x9e,0xe0,0x2, 0x9e,0x9e,0xe3,0xff,0xc6,0xfb,0xe0,0x2, 0xb6,0x9e,0xe8,0x0, +0x67,0x17,0xe8,0x2, 0x4e,0xc0,0x26,0xfe,0xe8,0x2, 0x6f,0xc0,0xe0,0x1, 0xaa,0x3e, +0xa6,0x8e,0xe0,0x10,0xce,0x80,0xbe,0x8e,0xe8,0x2, 0x4e,0xc9,0x26,0xfe,0xe8,0x2, +0x6f,0xc9,0x8e,0x8c,0x39,0x7d,0x1, 0xee,0xa, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xe8,0x0, 0x61,0x17,0xe8,0x0, 0x61,0x9f,0x13,0x3, 0x12,0x82,0xf0,0x0, 0x14,0x0, +0x13,0xfc,0xf0,0x1e,0x14,0x80,0xf0,0x0, 0x15,0x17,0xf7,0x0, 0x15,0x80,0xf7,0xef, +0x16,0x7f,0xf0,0xe, 0x16,0xc1,0xe8,0x0, 0x4f,0xd9,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x1, 0xce,0xde,0x9b,0x2c,0x7f,0xe8,0x0, 0x67,0xcd,0xe8,0x0, 0x62,0x4d,0xe2,0x20, +0xcf,0x80,0x5, 0x83,0x32,0x43,0x3a,0x57,0x3d,0x64,0x14,0x80,0xe0,0xa0,0x14,0x0, +0xde,0xc, 0xf8,0x0, 0x67,0x17,0xe0,0xa0,0x14,0x0, 0xe8,0x0, 0xa7,0xee,0x3c,0xe4, +0x3f,0xd7,0xcf,0x81,0xe8,0x0, 0xbf,0xee,0x3c,0x14,0xf8,0x1, 0xb4,0x1e,0xe8,0x0, +0x67,0xcd,0x37,0xc2,0xe8,0x1, 0xb7,0xbe,0x17,0x9f,0xf8,0x0, 0xbe,0x8e,0xe8,0x0, +0xbf,0xbe,0xe8,0x0, 0x65,0x4d,0x3d,0x24,0xdd,0xf0,0xe8,0x0, 0xa7,0x9e,0x37,0xca, +0xe2,0x0, 0xc7,0x81,0x27,0xfb,0xdf,0x27,0xe2,0x0, 0xcc,0x0, 0x17,0x80,0xe0,0x6f, +0x39,0xa5,0x3a,0xef,0xde,0x62,0x24,0x7f,0xe8,0x0, 0x67,0x9f,0xe0,0x2, 0x9f,0x9f, +0xe2,0x0, 0xc7,0x82,0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0,0xe2,0x0, 0xcf,0x80, +0x17,0x81,0xe0,0x6f,0x39,0x25,0x3a,0xef,0x0, 0xb7,0xe8,0x0, 0x67,0xcd,0x37,0xc2, +0xe0,0x1, 0xb7,0xb2,0xf0,0x1, 0xb4,0x12,0xa7,0xe2,0x3f,0xd7,0xcf,0x81,0xbf,0xe2, +0xf0,0x0, 0xbc,0x82,0xf0,0x0, 0xbd,0x32,0xe0,0x2, 0x9f,0x93,0xe2,0xff,0xc7,0xff, +0xe0,0x2, 0xb7,0x93,0xe0,0x2, 0x9f,0x93,0xcf,0x84,0xe0,0x2, 0xb7,0x93,0xa7,0x92, +0x37,0xca,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xde,0xee,0xa7,0x82,0x24,0x6, 0xe0,0x10, +0xcf,0x80,0xbf,0x82,0x12,0x81,0x0, 0x84,0xe8,0xf, 0x3f,0xdc,0xbf,0x82,0xe0,0x2, +0x9f,0x93,0xe8,0xf, 0x3f,0xcb,0xe0,0x2, 0xb7,0x93,0xe0,0x2, 0x9f,0x93,0xe3,0xff, +0xc7,0xfb,0xe0,0x2, 0xb7,0x93,0xc3,0x7f,0xe2,0x1, 0xc3,0x7f,0x23,0x5, 0xe2,0x0, +0xca,0x81,0xe7,0xfe,0x1, 0xf2,0x3c,0x65,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x8, 0xb2, +0xe8,0x0, 0x4c,0x59,0x24,0x5, 0xef,0xf4,0xdb,0xf0,0xe0,0x0, 0x24,0x4c,0xe8,0x0, +0x4f,0xd9,0xe2,0x0, 0xcf,0x83,0x1, 0x84,0x9, 0x21,0xe7,0xfd,0x0, 0xed,0xe2,0x0, +0xcf,0x81,0x1, 0xa9,0xe1,0x76,0x14,0x55,0xde,0xf8,0xe8,0x0, 0x61,0x1f,0xe0,0x1, +0x14,0x21,0xe0,0x2, 0x9f,0x92,0xe3,0xff,0xc7,0xfe,0xe0,0x2, 0xb7,0x92,0xdd,0xd3, +0xe8,0x0, 0x67,0xcd,0xe4,0xf, 0x37,0xc0,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdd,0xcb, +0xe8,0x0, 0x67,0xcd,0x37,0xc8,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdd,0xc4,0xe8,0x0, +0x64,0x4d,0xe2,0x1, 0xc4,0x7f,0xdd,0xbf,0xe0,0x2, 0x9f,0x92,0xcf,0x81,0xe0,0x2, +0xb7,0x92,0x0, 0x95,0x2f,0x97,0xe1,0x76,0x14,0x55,0xde,0xcf,0xe8,0x2, 0x4f,0xc9, +0x27,0xfe,0x17,0x80,0xe0,0x0, 0x1f,0x4, 0xe8,0x2, 0x6f,0xc9,0xaf,0x8e,0x9f,0x8e, +0x9f,0x1e,0xe4,0xf, 0x37,0xa0,0x3f,0xce,0xe8,0x0, 0x7f,0xcd,0x9, 0x21,0xe7,0xfe, +0x0, 0x86,0x9, 0x61,0xe0,0x0, 0x1f,0x29,0xe2,0xff,0x17,0xf0,0xbf,0xf, 0xe2,0xff, +0x17,0xf4,0xe0,0x0, 0x1f,0x2a,0xbf,0xf, 0xe2,0xff,0x17,0xf8,0xe0,0x0, 0x1f,0x2b, +0xbf,0xf, 0xe2,0xff,0x17,0xfc,0xe0,0x0, 0x1f,0x2c,0xbf,0xf, 0x38,0x82,0x8, 0xb1, +0xdf,0x97,0xe8,0x0, 0x4f,0xd9,0x27,0x93,0xe2,0x0, 0xcc,0x1, 0x1, 0xa, 0x17,0x80, +0xe0,0x2, 0x17,0x4, 0xbf,0x8e,0xe0,0x2, 0x17,0x8, 0xbf,0x8e,0x2c,0x2, 0xdf,0xdb, +0x3f,0x83,0xe8,0x0, 0x67,0x9f,0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x0, 0x80,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0x0, 0x0, 0x60,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0xe0,0x60,0x3c,0x0, 0xcc,0x2, 0xe0,0x60,0x3c,0x10,0xea,0x0, 0xc8,0x3, 0xe0,0xff, +0xc8,0x7c,0xfa,0x0, 0xcf,0x82,0xf0,0x37,0xcf,0x88,0xea,0x0, 0xcc,0x0, 0xe0,0x0, +0xcc,0x0, 0xe0,0x60,0x3c,0x17,0xea,0x0, 0xcc,0x2, 0xe0,0x0, 0xcc,0x0, 0xea,0x0, +0xcc,0x81,0xe0,0x88,0xcc,0xa4,0x3c,0x79,0x1, 0x8, 0xea,0x0, 0xcd,0x2, 0xe0,0x46, +0xcd,0x28,0x3d,0x28,0xe0,0x9, 0xdf,0x36,0xea,0x0, 0xcc,0x0, 0xe0,0xf7,0xcc,0x44, +0x3c,0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x67,0x4c,0x98,0xb3,0xec,0x7c,0x13,0x83,0xf0,0xa, 0xf, 0xf5,0xda,0x25,0x14,0xeb, +0x0, 0x0, 0x0, 0x1, 0xff,0xfe,0x0, 0x0, 0x0, 0x0, 0xc8,0x37,0x0, 0x0, 0x80,0xa6, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x8, 0xb5,0xc0,0x68,0xe0,0x3, 0x1f,0x84,0x15,0x80,0x95,0x3f,0xe0,0x2, 0x1f,0xfd, +0x3e,0x6a,0xe3,0xff,0xc6,0x7f,0xf0,0x0, 0x8b,0x4f,0xf0,0x0, 0x8b,0xdf,0xe0,0x2, +0x1f,0xfc,0xe4,0x3, 0x36,0x22,0x7d,0x81,0xe4,0x3, 0x31,0xc0,0x7d,0x82,0x7d,0x83, +0x7d,0x84,0x7d,0x85,0x7d,0x86,0x99,0xf, 0x24,0x39,0xe2,0x0, 0xcc,0x1, 0x1, 0x3, +0xc0,0x18,0xa, 0xe1,0xf0,0x0, 0x23,0x74,0x14,0xff,0xe0,0x2, 0x1f,0x81,0xe8,0x9, +0x3c,0x97,0xa4,0xf, 0xe2,0x1, 0xc4,0xff,0x34,0xa1,0xf0,0x4, 0x33,0xa1,0x3d,0x68, +0xe0,0x0, 0xc4,0x82,0xf0,0x0, 0x23,0x8b,0xe0,0xd, 0x3c,0x9a,0x3f,0xea,0x97,0xf, +0x3f,0x1c,0xe1,0x80,0xb7,0x1f,0x3e,0xff,0x1, 0xfb,0xc5,0x81,0xe2,0x1, 0xc5,0xff, +0xf0,0x40,0x3b,0x7b,0x3d,0x14,0x1, 0xef,0x16,0x8c,0x3e,0x92,0xe3,0xff,0xc6,0xff, +0xe0,0xf, 0x31,0x21,0x3f,0x98,0x97,0xf, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0x3f,0x13, +0x39,0x7d,0xb7,0xf, 0x1, 0xf6,0xc0,0x18,0xa, 0xe1,0xe0,0x2, 0x1a,0x81,0xe0,0x2, +0x1f,0x0, 0xa7,0x85,0xe2,0x1, 0xc5,0x7f,0xe9,0xff,0xc7,0xfe,0x37,0xc1,0x3c,0xea, +0x37,0x41,0xe2,0x0, 0x7c,0x4, 0xf0,0x0, 0x6b,0x85,0xe0,0x43,0x3a,0x13,0xf0,0x0, +0x6b,0x4, 0x7f,0x3, 0x7f,0x84,0x7f,0x85,0xe0,0x9, 0xda,0xa4,0x15,0x8c,0x3d,0x92, +0xa6,0x5, 0xe0,0x1, 0x1d,0x7f,0xe3,0xff,0xc5,0xff,0xe0,0x41,0x3c,0xc4,0x0, 0x8a, +0x97,0xf, 0x3f,0x13,0xb7,0xf, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0x39,0x7b,0xe7,0xff, +0x1, 0x21,0xe0,0x6, 0x17,0xa8,0x3f,0x92,0x37,0xa1,0x3f,0x9a,0x96,0x9f,0xe0,0xe, +0x31,0x21,0x3a,0x7d,0x3f,0xee,0x3f,0x9c,0x4, 0x6c,0x3e,0xf9,0xe0,0xf, 0x31,0x21, +0x3f,0x9c,0x3, 0x6a,0x97,0xf, 0x3f,0x23,0xb7,0xf, 0x0, 0xe6,0xe0,0x2, 0x1f,0x81, +0xa4,0xf, 0xe7,0xff,0x0, 0xab,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3a,0xe0,0x2, +0x1f,0xe6,0xe0,0x2, 0x1e,0xfd,0x87,0xf, 0x39,0xeb,0xe0,0x3, 0x8e,0x2d,0x15,0x8e, +0x3d,0xb3,0xe0,0x3, 0x1f,0xac,0xe2,0x0, 0xc7,0x1, 0x3e,0x7e,0x3f,0x9b,0x3a,0x68, +0x3a,0xe9,0x3b,0x6a,0x8b,0x9f,0xf0,0x0, 0x8d,0x3f,0xe0,0x1, 0x1, 0x3b,0x99,0x5d, +0x3c,0x63,0xe0,0x3, 0xdc,0x72,0xf0,0x40,0x3c,0x68,0xe0,0x2, 0xd9,0xf4,0xe0,0xc, +0x15,0x52,0x14,0x80,0x3c,0x64,0xe0,0x9, 0xde,0x2f,0xf0,0x1, 0x2c,0x23,0xe8,0x7, +0x3b,0xca,0xe0,0x0, 0x2b,0xec,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f, +0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, 0xc7,0x40,0x3f,0xdc, +0x3f,0xce,0xb7,0x8d,0xc1,0x5, 0xf0,0x0, 0x14,0x80,0x3c,0xe3,0xe8,0x40,0x3c,0x69, +0xe0,0x2, 0xda,0x7b,0x24,0x7b,0xe0,0x1, 0x1d,0xfe,0x17,0x80,0xe0,0xe, 0x37,0xa1, +0xe0,0xd, 0x3a,0x1e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0x14,0x1, 0xe0,0x2, 0xda,0xd, 0xf0,0x0, +0x24,0x27,0xe0,0x1, 0x1d,0xfd,0x17,0x80,0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3a,0x9e, +0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2, +0xb7,0xd, 0x5, 0x73,0xe0,0x3, 0x19,0x30,0xe4,0x0, 0xc1,0x85,0x3c,0x64,0xe0,0xf, +0x39,0x13,0x8c,0xcf,0xe0,0x2, 0xdb,0x3c,0x2b,0x95,0x39,0x13,0x8c,0xc2,0x3c,0x65, +0xe0,0x2, 0xdb,0x36,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0xe0,0x3, 0x19,0x30, +0xe4,0x0, 0xc1,0x85,0x3c,0x64,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0xe0,0x2, 0xdb,0x28, +0x23,0xf2,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0x3c,0x66,0xe0,0x2, 0xdb,0x21,0xf7,0xff, +0x2c,0x66,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0xe0,0xc, 0x15,0x52,0x14,0x80, +0x3c,0x66,0xe0,0x9, 0xdd,0xb9,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f, +0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, 0xc7,0x40,0x3f,0xdc, +0x3f,0xce,0xb7,0x8d,0xf0,0x0, 0x14,0x84,0xf7,0xff,0x25,0xe, 0x3c,0xe3,0xe8,0x40, +0x3c,0x69,0xe0,0x2, 0xda,0xa, 0x24,0x7b,0xe0,0x1, 0x1d,0xfc,0xc1,0x5, 0x17,0x80, +0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3b,0x1e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81, +0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0xe7,0xfe,0x0, 0xf5, +0xe0,0xc, 0x15,0x52,0x14,0x80,0x3c,0x65,0xe0,0x9, 0xdd,0x86,0xe7,0xfe,0x0, 0xd9, +0x99,0x6d,0xe7,0xfe,0x0, 0xc7,0xe0,0x2, 0x1f,0x81,0xe0,0x1, 0x1d,0x7b,0xa4,0x8f, +0x3c,0x69,0xe0,0x8e,0x0, 0x9c,0xe0,0x0, 0x1f,0x8e,0xf0,0x40,0x3a,0x68,0xf0,0x0, +0x88,0x8f,0xe0,0x1, 0x14,0x7f,0xf0,0x0, 0x20,0xe5,0xf0,0x0, 0x1b,0xd, 0xf0,0x40, +0x3a,0xe8,0x17,0x0, 0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0x11,0x82,0xf0,0x0, 0x10,0x3, +0x0, 0x9e,0xf1,0x2c,0x39,0xad,0xe0,0x0, 0x26,0x43,0xf0,0x0, 0x12,0x82,0xe8,0x40, +0x3e,0xe5,0x3f,0xe8,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe8,0x40, +0x3e,0x65,0x5, 0x82,0x3e,0x68,0x3c,0x6c,0xe2,0x1, 0xc4,0x7f,0xc7,0x1, 0xe2,0x1, +0xc7,0x7f,0xe8,0x40,0x3f,0x71,0xf0,0x0, 0xc3,0x2, 0x1, 0x38,0x3d,0x7e,0x1, 0x77, +0xe8,0x0, 0x8e,0x86,0xe8,0x0, 0x8e,0x16,0xf0,0xf, 0x3a,0x2d,0xe2,0x0, 0xcf,0x80, +0xe8,0x17,0x3e,0xa4,0xf2,0x1, 0xc3,0xff,0xe0,0xd, 0x3c,0xac,0xe2,0x1, 0xc7,0xff, +0xe8,0x6f,0x3d,0x27,0x3e,0x29,0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc6,0x7f,0xe2,0x1, +0xc6,0xff,0xf1,0x37,0x39,0x2f,0xe0,0x6d,0x3d,0x2c,0xf0,0x0, 0x23,0x85,0xf1,0x2c, +0x39,0x2d,0x2e,0x15,0xf1,0x2c,0x39,0xaf,0xe7,0xff,0x2e,0x3d,0x25,0xc1,0xf1,0x2f, +0x38,0x2f,0xe7,0xff,0x27,0xbe,0xf0,0x40,0x38,0x7d,0xe8,0x40,0x3f,0xe0,0xe8,0x6f, +0x3c,0xa5,0xf0,0x40,0x3a,0xef,0xe7,0xff,0x0, 0xb4,0x38,0x82,0x14,0x1, 0x38,0x82, +0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0x30,0xf0,0x40, +0x3e,0x6a,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1d,0xd, 0xe4,0x0, 0xc5,0x8a,0x3e,0xea, +0x3e,0x9b,0x3f,0x9a,0x16,0x0, 0xe0,0x2, 0x1f,0x7d,0xe0,0x10,0xae,0x1d,0xf0,0x40, +0x3c,0xe8,0xe0,0x10,0xae,0x2d,0xe8,0x40,0x3c,0x6c,0x8e,0xf, 0x8f,0x9f,0x89,0x4e, +0x89,0xde,0x7d,0x90,0xf0,0x40,0x3f,0x69,0x7e,0xa, 0x7f,0x88,0xe0,0x6, 0xd6,0xc4, +0x14,0x83,0xe0,0x9, 0xdc,0x45,0xe0,0x1, 0x1e,0xd7,0xe0,0x43,0x3c,0x18,0xe0,0x1, +0x93,0xcd,0x67,0xa, 0x3b,0xf8,0xe0,0x67,0x3c,0x28,0xe8,0x40,0x3f,0x79,0xe0,0x3, +0x3, 0xa9,0x67,0x8a,0x17,0x1, 0xe8,0xe, 0x3f,0x19,0x3f,0x1f,0x17,0x80,0xe2,0x1, +0xc7,0x7f,0x3b,0x6f,0x66,0x88,0xe8,0x40,0x3e,0xfe,0xe0,0x3, 0x3, 0x87,0x66,0x88, +0x11,0x1, 0xe8,0x2, 0x39,0x1e,0x39,0x1d,0x16,0x80,0xe2,0x1, 0xc1,0x7f,0x7e,0x89, +0x3f,0x9d,0xe0,0x1, 0x1e,0xfa,0x37,0xa1,0x3f,0x9d,0xe0,0x1, 0x1e,0xd7,0x37,0xc1, +0x65,0x89,0x86,0x1d,0x7f,0x93,0xe0,0xa, 0x3f,0x16,0x67,0x89,0xe0,0x1, 0x1e,0xf9, +0x3d,0x92,0x36,0xc1,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc5,0xff,0xe0,0x0, 0x6f,0xc4, +0xe2,0x0, 0x7c,0x44,0x17,0x80,0x7e,0x94,0xe0,0x0, 0x6f,0x47,0xe0,0x0, 0x6e,0x48, +0xe0,0x0, 0x6f,0xc9,0x7d,0xb, 0x7d,0x8c,0xe0,0x0, 0x6b,0x45,0xe0,0x0, 0x69,0x46, +0xe0,0x9, 0xd7,0x43,0xe0,0x1, 0x1f,0xf8,0x66,0xb, 0xf0,0x0, 0x9c,0xf, 0xe0,0x1, +0x1f,0xf7,0x3e,0x76,0xf0,0x0, 0x9d,0x8f,0xe0,0x1, 0x1f,0xf6,0xf4,0x18,0x34,0x20, +0xf0,0x0, 0x9d,0xf, 0xe0,0x1, 0x1f,0xf5,0xf4,0x1b,0x35,0xa0,0x9e,0x8f,0xe0,0x1, +0x1f,0xf4,0xf4,0x1a,0x35,0x20,0x9f,0xf, 0xe0,0x1, 0x1f,0xf3,0xf0,0x18,0x3c,0x1d, +0x9f,0x8f,0xf0,0x1b,0x3d,0x9e,0xf0,0x1a,0x3d,0x1f,0x16,0x80,0xe0,0x1, 0x5, 0xcc, +0xe0,0xe, 0x39,0xb6,0x66,0x89,0xe0,0x1, 0x1d,0x57,0xe0,0x2c,0xc7,0x1f,0x3f,0x1d, +0x37,0x21,0x8a,0x9a,0xe0,0x1, 0x1d,0x7f,0xc7,0x7e,0x3f,0x1a,0x67,0x8a,0xc1,0x7f, +0xe2,0x1, 0xc1,0x7f,0x7f,0x6, 0x16,0x2, 0x67,0x9, 0x65,0x8, 0xe0,0xb, 0x3b,0x2f, +0x31,0xa1,0xe0,0xf, 0x31,0x21,0x3f,0x9c,0xf1,0x39,0x3c,0x9c,0x79,0x8d,0xe3,0xff, +0xc5,0xff,0xe4,0x3, 0x33,0x28,0x3f,0x2a,0xf1,0x2c,0x3f,0x1c,0x16,0x80,0x7d,0x87, +0x3a,0x63,0x7f,0xe, 0x7f,0x8f,0xf0,0x0, 0x7c,0x82,0x7e,0x5, 0xe4,0x4, 0x32,0x48, +0x66,0xc, 0x67,0x9, 0x3e,0x7e,0xe0,0x1, 0x5, 0x85,0x67,0x86,0x61,0xf, 0xf0,0x40, +0x3f,0x6f,0x39,0x1f,0x67,0x8a,0x67,0xe, 0xf0,0x0, 0x66,0x89,0xe0,0xf, 0x3b,0x2f, +0x66,0x7, 0xe3,0xff,0xc7,0x7f,0x7f,0x83,0xe8,0x40,0x3f,0xee,0xe0,0x43,0x39,0x9c, +0xf8,0x40,0x3f,0x6d,0xf0,0x40,0x3c,0xee,0x7b,0x4, 0xf0,0x40,0x3e,0xef,0x0, 0xbb, +0x67,0x3, 0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0x52,0x66,0x2, 0xe0,0x0, 0x26,0x5e, +0x67,0x5, 0x15,0x81,0xe0,0x0, 0x27,0x5a,0xe8,0x40,0x3d,0x6c,0x3c,0x64,0x7e,0x81, +0xde,0x93,0x15,0x7e,0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0xb, 0x33,0x1, 0xe2,0x0, +0xcd,0x1, 0xc4,0x7f,0xe0,0x43,0x3d,0x9b,0xe2,0x1, 0xc4,0x7f,0xe0,0x66,0x3d,0xab, +0xe2,0x0, 0xcc,0x2, 0x66,0x81,0x2, 0x8b,0x65,0x4, 0xe8,0xb, 0x3b,0x3e,0x3d,0x36, +0xf0,0x1a,0x3d,0x2b,0xf0,0x1b,0x3d,0xaa,0xf0,0x18,0x3c,0x26,0x17,0x1, 0xe8,0xe, +0x3f,0x19,0xf0,0x40,0x3e,0xf2,0xf0,0x40,0x3c,0xee,0xf3,0xff,0xc4,0xff,0xf0,0x0, +0xc7,0x1, 0x1, 0x2e,0xe8,0x80,0x97,0x9d,0xe8,0x40,0x3c,0xee,0x3f,0xa5,0xe0,0x43, +0x3b,0x1f,0xe2,0x0, 0xcb,0x0, 0xe2,0x1, 0xc4,0xff,0x5, 0x69,0x15,0x81,0x3d,0x9d, +0x3b,0xf6,0xe2,0x1, 0xc5,0xff,0xe0,0x6d,0x3d,0x2b,0xe2,0x0, 0xc9,0x80,0xe7,0xff, +0x2, 0x31,0xe3,0xff,0xc9,0xff,0xe7,0xff,0x4, 0x32,0xe8,0x43,0x3d,0x99,0xe2,0x0, +0xcd,0x80,0xe0,0x0, 0x5, 0x7d,0x67,0x88,0xf0,0xb, 0x3f,0x2f,0xe2,0x0, 0xcd,0x81, +0x5, 0x4e,0x66,0x2, 0xe7,0xff,0x2e,0x26,0x15,0x80,0xe7,0xff,0x0, 0xa7,0x63,0x4, +0x66,0x6, 0x65,0xd, 0x67,0x7, 0x3e,0x1a,0xc3,0x1, 0xe4,0x4, 0x33,0x28,0x7e,0x6, +0xc7,0x1, 0x66,0xb, 0xe4,0xf, 0x32,0x48,0xe3,0xff,0xc7,0x7f,0x3e,0x7f,0x7f,0x7, +0xe7,0xfe,0x2, 0xe6,0xf2,0x0, 0xcc,0x0, 0x11,0x81,0x3d,0x63,0xe8,0x6a,0x39,0xa8, +0x3c,0xea,0xf0,0x8, 0x35,0xa6,0xf0,0x40,0x3c,0x6a,0x7e,0x81,0xe0,0x9, 0xdb,0x3b, +0x66,0x10,0xe0,0x0, 0x19,0xd, 0xc4,0x20,0x39,0x1c,0xe0,0x7, 0xb4,0x62,0xe8,0x40, +0x3c,0xe8,0xf0,0x8, 0x35,0x26,0xe0,0x9, 0xdb,0x2e,0x17,0xa0,0x3f,0x98,0xe0,0x7, +0xb7,0xf2,0xe8,0x40,0x3c,0x6c,0xe0,0x6, 0xd5,0x5f,0xe2,0x0, 0xcc,0x0, 0x39,0x68, +0x66,0x81,0xe0,0x1, 0x5, 0x0, 0xe0,0x1, 0x1f,0x57,0xe0,0x43,0x39,0x12,0xe0,0x2, +0x8c,0xfe,0x2c,0x85,0x17,0x94,0xe0,0x2, 0xaf,0xfe,0x14,0x94,0xe8,0x40,0x3c,0x68, +0x7e,0x81,0xe0,0x9, 0xdb,0x10,0x3c,0x72,0x3c,0xe2,0xe0,0x62,0x3d,0xa8,0xe0,0x0, +0x14,0x7f,0x3c,0x32,0x66,0x10,0xe0,0x0, 0x19,0xd, 0x39,0x1c,0xe0,0x9, 0xdb,0x3, +0xe0,0x10,0xac,0x12,0x66,0x81,0x67,0xa, 0x67,0x88,0xe2,0x0, 0xce,0xad,0xe0,0x10, +0xae,0xa2,0xe0,0x10,0xaf,0x32,0xe0,0x10,0xaf,0xc2,0x5, 0x84,0x17,0xad,0xe0,0x10, +0xaf,0xa2,0xe0,0x0, 0xc0,0x50,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe3,0xff,0xcd,0xff, +0xe7,0xfe,0x3, 0x56,0xe7,0xfe,0x0, 0xab,0x16,0xff,0x3e,0x93,0x66,0x8, 0xe8,0xd, +0x3e,0xae,0x3e,0x7d,0x2, 0x31,0x3e,0xec,0xf0,0x2, 0x37,0x21,0xe8,0xd, 0x3e,0xae, +0xc1,0x1, 0xe2,0x1, 0xc6,0xff,0x7e,0x89,0xe2,0x1, 0xc1,0x7f,0xe7,0xfc,0x0, 0xf2, +0x17,0xff,0x3f,0x92,0xe8,0xf, 0x3f,0xa9,0x3f,0x7f,0x2, 0xf, 0x63,0xa, 0xf0,0xe, +0x34,0xa1,0xe8,0x6, 0x3b,0x29,0xc7,0x1, 0xe2,0x1, 0xc3,0x7f,0xe2,0x1, 0xc7,0x7f, +0xe0,0xf, 0x3b,0x33,0xe7,0xfc,0x0, 0xd0,0x63,0xa, 0x66,0xa, 0xe8,0x6, 0x3b,0x29, +0xe8,0xe, 0x39,0x19,0xe2,0x1, 0xc3,0x7f,0x3f,0x2c,0xe0,0xf, 0x3b,0x33,0xe2,0x1, +0xc7,0x7f,0xe7,0xfc,0x0, 0xc1,0x66,0x88,0x66,0x8, 0xe8,0x2, 0x39,0x9e,0xe8,0xd, +0x3e,0xae,0x39,0x2c,0xe2,0x1, 0xc6,0xff,0x7e,0x89,0xe2,0x1, 0xc1,0x7f,0xe7,0xfc, +0x0, 0xc1,0x39,0x63,0xe7,0xff,0x0, 0x81,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff, +0xc0,0x34,0xf0,0x40,0x3e,0x6a,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1d,0xd, 0xe4,0x0, +0xc5,0x8a,0x3e,0xea,0x3e,0x9b,0x3f,0x9a,0x16,0x0, 0xe0,0x2, 0x1f,0x7d,0xe0,0x10, +0xae,0x1d,0xf0,0x40,0x3c,0xe8,0xe0,0x10,0xae,0x2d,0xe8,0x40,0x3c,0x6c,0x8e,0xf, +0x8f,0x9f,0x89,0x4e,0x89,0xde,0x7d,0x8f,0xf0,0x40,0x3f,0x69,0x7e,0xa, 0x7f,0x88, +0xe0,0x6, 0xd4,0xb2,0x14,0x83,0xe0,0x9, 0xda,0x33,0xe0,0x1, 0x1e,0xd7,0xe0,0x43, +0x3c,0x18,0xe0,0x1, 0x93,0xcd,0x67,0xa, 0x3b,0xf8,0xe0,0x67,0x3c,0x28,0xe8,0x40, +0x3f,0x79,0xe0,0x3, 0x3, 0xa1,0x17,0x81,0x66,0xa, 0xe8,0xf, 0x3f,0x99,0x3f,0x9c, +0x17,0x0, 0xe2,0x1, 0xc7,0xff,0x3b,0x6e,0x66,0x8, 0xe8,0x40,0x3e,0x7e,0xe0,0x3, +0x3, 0x81,0x66,0x8, 0x16,0x81,0xe8,0xd, 0x3e,0x9e,0x3e,0x9c,0x16,0x0, 0xe2,0x1, +0xc6,0xff,0x7e,0x9, 0x3e,0x1e,0xe0,0x1, 0x1a,0x72,0x36,0x21,0xa7,0x4, 0xe0,0xa, +0x3f,0x96,0x3f,0x1c,0xe0,0x1, 0x1e,0x57,0xe9,0xff,0xc7,0x7e,0x85,0x9c,0x37,0x41, +0xe0,0x1, 0x1e,0x79,0x61,0x9, 0x7f,0x12,0x36,0x41,0x67,0x9, 0xe2,0x1, 0xc5,0x7f, +0xe0,0x0, 0x6f,0xc3,0xe2,0x0, 0x7c,0x40,0x17,0x80,0x39,0x1d,0xe0,0x0, 0x6f,0x40, +0xe2,0x1, 0xc1,0x7f,0xe0,0x0, 0x6e,0xc2,0xe0,0x0, 0x6f,0xc5,0x7d,0xb, 0x7e,0x13, +0xe0,0x0, 0x6b,0x41,0xe0,0x0, 0x6d,0xc4,0xe0,0x9, 0xd5,0x2f,0xe0,0x1, 0x1f,0xf8, +0xf0,0x0, 0x9c,0xf, 0xe0,0x1, 0x1f,0xf7,0xf4,0x18,0x34,0x20,0xf0,0x0, 0x9d,0x8f, +0xe0,0x1, 0x1f,0xf6,0xf4,0x1b,0x35,0xa0,0xf0,0x0, 0x9d,0xf, 0xe0,0x1, 0x1f,0xf5, +0xf4,0x1a,0x35,0x20,0x9e,0x8f,0xe0,0x1, 0x1f,0xf4,0xf0,0x18,0x3c,0x1d,0x9f,0xf, +0xe0,0x1, 0x1f,0xf3,0xf0,0x1b,0x3d,0x9e,0x9f,0x8f,0x16,0x80,0xf0,0x1a,0x3d,0x1f, +0x67,0x8b,0x3f,0xf6,0xe0,0x1, 0x5, 0xc4,0xe0,0xf, 0x3b,0x33,0x66,0x89,0xa5,0x84, +0x3f,0x9d,0x66,0x8a,0x37,0xa1,0xe0,0xc, 0x3b,0x2d,0xe3,0xff,0xc6,0x7f,0x3d,0x9f, +0x7e,0x7, 0x17,0x2, 0x66,0x9, 0x67,0x88,0xe0,0x1, 0x1d,0x57,0x3e,0x2f,0x7e,0xd, +0x31,0xa1,0x66,0x9, 0xf1,0x39,0x3c,0x9e,0x79,0x8c,0xe4,0xc, 0x36,0x28,0xe4,0x3, +0x33,0x28,0xf1,0x2e,0x3f,0x1e,0x8a,0x9a,0x16,0x80,0x7d,0x86,0x3a,0x63,0x7e,0xe, +0xf0,0x0, 0x7c,0x82,0xe0,0x0, 0x7f,0x5, 0xe4,0x4, 0x32,0x48,0x67,0x9, 0x39,0x7e, +0xe0,0x1, 0x5, 0x84,0xf0,0x0, 0x67,0x6, 0x67,0x87,0x67,0xd, 0x66,0xa, 0xf0,0x0, +0x66,0x89,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x39,0x9f,0xe0,0xc, 0x3b,0x2c,0xe8,0x40, +0x3f,0xee,0x64,0x8e,0xf8,0x40,0x3f,0x6d,0x7e,0x3, 0xf0,0x40,0x3c,0xee,0x7b,0x4, +0xf0,0x40,0x3e,0xef,0x0, 0xbe,0x66,0x3, 0xe2,0x0, 0xce,0x1, 0xe0,0x0, 0x5, 0x53, +0x67,0x82,0xe0,0x0, 0x27,0xdf,0x66,0x5, 0x15,0x81,0xe0,0x0, 0x26,0x5b,0xe8,0x40, +0x3d,0x6c,0x3c,0x64,0x7e,0x81,0xdc,0x88,0x15,0x7e,0x3d,0x18,0xe2,0x1, 0xc5,0x7f, +0xe0,0xb, 0x33,0x1, 0xe2,0x0, 0xcd,0x1, 0xc4,0x7f,0xe0,0x43,0x3d,0x9b,0xe2,0x1, +0xc4,0x7f,0xe0,0x66,0x3d,0xab,0xe2,0x0, 0xcc,0x2, 0x66,0x81,0x2, 0x8b,0x65,0x4, +0xe8,0xb, 0x3b,0x3e,0x3d,0x36,0xf0,0x1a,0x3d,0x2b,0xf0,0x1b,0x3d,0xaa,0xf0,0x18, +0x3c,0x26,0xf0,0x0, 0xc7,0x1, 0xf4,0x9, 0x37,0x28,0x17,0x1, 0xe4,0xf, 0x34,0xc8, +0xe8,0xe, 0x3f,0x19,0x39,0x7f,0xf0,0x40,0x3c,0xee,0xf3,0xff,0xc4,0xff,0x5, 0xac, +0xe9,0x80,0x97,0x9d,0xe4,0x9, 0x34,0xc8,0x3f,0xa5,0xe0,0x43,0x3b,0x1f,0xe2,0x0, +0xcb,0x0, 0x5, 0x68,0x15,0x81,0x3d,0x9d,0x3b,0xf6,0xe2,0x1, 0xc5,0xff,0xe0,0x6d, +0x3d,0x2b,0xe2,0x0, 0xc9,0x80,0xe7,0xff,0x2, 0x30,0xe3,0xff,0xc9,0xff,0xe7,0xff, +0x4, 0x31,0xe8,0x43,0x3d,0x99,0xe2,0x0, 0xcd,0x80,0xe0,0x0, 0x5, 0x7d,0x67,0x8, +0xf0,0xb, 0x3f,0x2e,0xe2,0x0, 0xcd,0x81,0x5, 0x4d,0x67,0x82,0xe7,0xff,0x2f,0xa5, +0x15,0x80,0xe7,0xff,0x0, 0xa6,0x63,0x4, 0x66,0x6, 0x65,0xc, 0x67,0x7, 0x3e,0x1a, +0xc3,0x1, 0xe4,0x4, 0x33,0x28,0x7e,0x6, 0xc7,0x1, 0x66,0xb, 0xe4,0xf, 0x32,0x48, +0xe3,0xff,0xc7,0x7f,0x3e,0x7f,0x7f,0x7, 0xe7,0xfe,0x2, 0xe8,0xf2,0x0, 0xcc,0x0, +0x11,0x81,0x3f,0x63,0xe8,0x6e,0x39,0xa8,0x3c,0xee,0xf0,0x8, 0x35,0xa6,0xf0,0x40, +0x3c,0x6e,0x7e,0x81,0xe0,0x9, 0xd9,0x2f,0x67,0x8f,0xe0,0x0, 0x19,0xd, 0xc4,0x20, +0x39,0x1f,0xe0,0x7, 0xb4,0x62,0xe8,0x40,0x3c,0xe8,0xf0,0x8, 0x35,0x26,0xe0,0x9, +0xd9,0x22,0x17,0xa0,0x3f,0x98,0xe0,0x7, 0xb7,0xf2,0xe8,0x40,0x3c,0x6c,0xe0,0x6, +0xd3,0x53,0xe2,0x0, 0xcc,0x0, 0x39,0x68,0x66,0x81,0xe0,0x0, 0x5, 0x7e,0xe0,0x1, +0x1d,0x57,0xe0,0x43,0x39,0x12,0xe0,0x2, 0x8c,0xfa,0x2c,0x85,0x17,0x94,0xe0,0x2, +0xaf,0xfa,0x14,0x94,0xe8,0x40,0x3c,0x68,0x7e,0x81,0xe0,0x9, 0xd9,0x4, 0x3c,0x72, +0x3c,0xe2,0xe0,0x62,0x3d,0xa8,0xe0,0x0, 0x14,0x7f,0x3c,0x32,0x66,0xf, 0xe0,0x0, +0x19,0xd, 0x39,0x1c,0xe0,0x9, 0xd8,0xf7,0xe0,0x10,0xac,0x12,0x66,0x81,0x67,0xa, +0x67,0x88,0xe2,0x0, 0xce,0xad,0xe0,0x10,0xae,0xa2,0xe0,0x10,0xaf,0x32,0xe0,0x10, +0xaf,0xc2,0x5, 0x84,0x17,0xad,0xe0,0x10,0xaf,0xa2,0xe0,0x0, 0xc0,0x4c,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe3,0xff,0xcd,0xff,0xe7,0xfe,0x3, 0x55,0xe7,0xfe,0x0, 0xaa, +0x16,0xff,0x3e,0x93,0xe8,0xd, 0x3e,0xae,0x3e,0x7d,0x2, 0x30,0xf0,0xd, 0x37,0x21, +0xe8,0xc, 0x3e,0x2e,0xc6,0x81,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, 0xc6,0xff, +0xe7,0xfc,0x0, 0xfa,0x17,0xff,0x3f,0x92,0xe8,0xf, 0x3f,0xa9,0x3f,0x7f,0x2, 0xf, +0x3b,0x6e,0xf0,0xf, 0x34,0xa1,0xe8,0x6, 0x3b,0x29,0xc7,0x81,0xe2,0x1, 0xc3,0x7f, +0xe2,0x1, 0xc7,0xff,0xe0,0xe, 0x3b,0x33,0xe7,0xfc,0x0, 0xd8,0x63,0xa, 0x66,0x8a, +0xe8,0x6, 0x3b,0x29,0xe8,0xf, 0x39,0x19,0xe2,0x1, 0xc3,0x7f,0x3f,0xad,0xe0,0xe, +0x3b,0x33,0xe2,0x1, 0xc7,0xff,0xe7,0xfc,0x0, 0xc9,0x66,0x8, 0x65,0x8, 0xe8,0xd, +0x39,0x9e,0xe8,0xc, 0x3e,0x2e,0x3e,0xaa,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, +0xc6,0xff,0xe7,0xfc,0x0, 0xc9,0x39,0x63,0xe7,0xff,0x0, 0x83,0xe2,0x0, 0xcc,0x1, +0x1, 0x11,0x4, 0x9b,0xc4,0x7c,0xe2,0x0, 0xcc,0x1, 0x5, 0x8c,0xe0,0x1, 0x1f,0x7d, +0xe0,0x1, 0x1f,0xf1,0xbf,0xf, 0xe0,0x1, 0x1f,0x70,0xe0,0x2, 0x1f,0x81,0xbf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0x7c,0xe0,0x1, 0x1f,0xf1,0xbf,0xf, 0xe0,0x1, 0x1f,0x6f, +0xe0,0x2, 0x1f,0x81,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x7e,0xe0,0x1, 0x1f,0xf1, +0xe2,0x0, 0xcc,0x82,0xbf,0xf, 0x1, 0x7, 0xe0,0x1, 0x1f,0x6e,0xe0,0x2, 0x1f,0x81, +0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x6d,0xe0,0x2, 0x1f,0x81,0xbf,0xf, 0x38,0x82, +0x8, 0xb5,0xe0,0x2, 0x19,0x7a,0x8f,0x82,0x2f,0xb6,0xe0,0x1, 0x19,0xf1,0xe0,0x1, +0x1a,0x72,0xa4,0x83,0xa4,0x4, 0xe0,0x2, 0x1a,0x81,0xe0,0x4, 0xd2,0x8f,0xe0,0x2, +0x1f,0xfc,0x14,0x8c,0x9f,0x8f,0xa5,0x4, 0x3c,0x9f,0xa5,0x83,0xa4,0x5, 0xe3,0xff, +0xc4,0xff,0x0, 0x88,0xc7,0x81,0x9e,0x8c,0xe3,0xff,0xc7,0xff,0x3f,0xf9,0xb6,0x8e, +0x1, 0x19,0x8e,0x82,0xe0,0xe, 0x37,0xa1,0xe2,0x0, 0xce,0x81,0xe0,0xc, 0x3d,0x9e, +0x3f,0x1a,0x1, 0xf1,0xe0,0xe, 0x37,0xa1,0x3e,0xec,0xe0,0xc, 0x3c,0x1e,0x9e,0x8d, +0x96,0xc, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1a,0x3e,0xac,0x3f,0xf9,0xb6,0x8e, +0x1, 0xe9,0xa, 0xe1,0xe0,0x2, 0x1a,0x81,0xe0,0x1, 0x19,0xf1,0xe0,0x1, 0x1a,0x72, +0xa5,0x5, 0xa4,0x83,0xa4,0x4, 0x15,0x81,0xe0,0x4, 0xd2,0x39,0x0, 0xc9,0xe0,0x0, +0x1f,0x8e,0x8f,0x8f,0x27,0xbc,0x14,0x7f,0x3c,0x1f,0xe0,0x2, 0x1f,0xfd,0xe2,0x1, +0xc4,0x7f,0xf0,0x0, 0x8b,0x5f,0xc4,0x1, 0xe0,0x0, 0x1e,0x8d,0xe0,0x1, 0x1f,0xf2, +0x34,0x21,0xf7,0xff,0x12,0xff,0xf0,0x0, 0xa3,0x8f,0xf8,0x15,0x3a,0x96,0x3c,0x1d, +0x14,0x80,0x0, 0x88,0x3e,0x7b,0x4, 0x1e,0xc7,0x7f,0xaf,0x1d,0xc6,0x82,0x3c,0x7d, +0x1, 0x1e,0x8f,0x8d,0x8f,0x1d,0xe8,0xf, 0x3f,0xb6,0x3e,0x69,0x3f,0x9e,0x37,0xa1, +0xf0,0xb, 0x3b,0x9f,0x95,0xb, 0x27,0x3, 0xe0,0x40,0x96,0x1b,0xe8,0x40,0x3f,0x75, +0x3d,0xe9,0x3, 0x4, 0xe8,0xf, 0x3f,0x97,0x95,0x9f,0x3d,0x7c,0x4, 0x64,0x3d,0x7b, +0x3, 0x66,0xc7,0x1, 0xaf,0x1d,0xc6,0x82,0x3c,0x7d,0x1, 0xe4,0x38,0x82,0x0, 0x0, +0x8, 0xb4,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0xc3,0x17,0x0, 0x8d,0x8f,0xe0,0x0, +0x19,0xd, 0xe0,0xc, 0x35,0xc3,0x3f,0xee,0x3e,0xee,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0x3f,0x12,0x3f,0xfc,0xe0,0xf, 0xae,0x8e,0x3f,0x6f,0x5, 0x78,0xe0,0x1, 0x1e,0x57, +0xe0,0x1, 0x1f,0xf2,0xe0,0x2, 0x1d,0x7d,0xf0,0x1, 0x93,0xc, 0xa7,0xf, 0xf0,0x0, +0x91,0xac,0xf0,0x0, 0x92,0x3c,0xf0,0x0, 0x92,0xfc,0xe0,0x3, 0x1e,0x40,0xf0,0x0, +0x80,0xca,0xf0,0x0, 0x81,0x5a,0xe4,0x0, 0x17,0x80,0xe2,0x0, 0x7c,0xae,0xe0,0x1, +0x1d,0x79,0xf0,0x0, 0x83,0x8c,0xe0,0x0, 0x1a,0xe, 0xe0,0x0, 0x19,0x8c,0x3f,0x1f, +0x3f,0x99,0x16,0x0, 0x37,0x41,0x37,0xc1,0x35,0x41,0xc5,0xff,0xe2,0x0, 0x7c,0x84, +0xe2,0x0, 0x7c,0x14,0xae,0x84,0xae,0x83,0xe0,0x1a,0xb6,0x52,0xe0,0x1a,0xb6,0x62, +0xe0,0x1a,0xb6,0x72,0xe0,0x1b,0xb6,0x12,0x7f,0x6, 0x7f,0x88,0x7d,0x7, 0xf0,0x0, +0x73,0x15,0x6d,0x96,0xf0,0x0, 0x6b,0x97,0xf0,0x0, 0x68,0x95,0xf0,0x0, 0x69,0x14, +0xf0,0x0, 0x71,0x92,0xf0,0x0, 0x72,0x13,0xf0,0x0, 0x72,0x94,0xe0,0x9, 0xd2,0x2d, +0x55,0x7, 0x5f,0x8, 0xe0,0x1a,0xb5,0x72,0xe0,0xb, 0x37,0x48,0xe0,0x0, 0x1d,0xb, +0x5f,0x86,0xaf,0xa, 0xe0,0xd, 0x37,0xc8,0xe0,0x0, 0x1f,0xa, 0xf0,0x0, 0x4b,0x84, +0xad,0x8e,0xe0,0x0, 0x1f,0x9, 0x4c,0x5, 0xf0,0x0, 0x53,0x3, 0x54,0x84,0x56,0x5, +0xaf,0x8e,0xe0,0x0, 0x1f,0x88,0xf0,0x0, 0xab,0x84,0xac,0x3, 0xf0,0x1a,0xb3,0x52, +0xe0,0x1a,0xb4,0xe2,0xe0,0x1b,0xb6,0x12,0xae,0x8f,0xf0,0x0, 0x23,0xa5,0xe0,0x1, +0x1d,0x6c,0xe0,0x0, 0x1e,0xd, 0x17,0x80,0xf0,0x0, 0x13,0x1, 0xe0,0xe, 0x37,0xc3, +0xe2,0x0, 0xc7,0x1f,0x3f,0x12,0x16,0x87,0xe0,0xf, 0x84,0x8e,0x3e,0xdf,0xe0,0x80, +0x9d,0x9a,0xf0,0xd, 0x33,0x3d,0x3e,0xc9,0xc7,0x81,0xe0,0xf, 0xae,0x8e,0xe2,0x1, +0xc7,0xff,0xe0,0xe, 0x35,0xc8,0xaf,0xc, 0xf0,0x40,0x3b,0xff,0xc6,0x2, 0xe0,0x40, +0xad,0x9c,0x1, 0xe5,0x24,0x19,0x15,0xff,0x3d,0x98,0xe2,0x1, 0xc5,0xff,0x35,0xa1, +0xe2,0x0, 0x7e,0xae,0xe0,0x0, 0x1f,0x8d,0xe2,0x0, 0x7f,0x2c,0xe0,0xb, 0x3d,0x9d, +0xe0,0x80,0x9e,0x9e,0xc7,0x82,0xe0,0xc, 0x36,0xc8,0x3d,0xfe,0xe0,0x7, 0xae,0x2f, +0xe0,0x7, 0xae,0xbf,0x1, 0xf6,0xe0,0x0, 0xc0,0x68,0xa, 0x61,0xe0,0x2, 0x1f,0xfd, +0xf0,0x0, 0x89,0xdf,0xf0,0xa, 0x31,0xc1,0xf0,0x0, 0x21,0xde,0xe0,0x1, 0x1f,0x72, +0x14,0x0, 0xf0,0x0, 0xa2,0x8e,0x8d,0xef,0xf0,0x1, 0x19,0x7f,0xf0,0x17,0x31,0xa1, +0x35,0x21,0xf8,0x40,0x3a,0x65,0x3c,0xe8,0xf0,0x40,0x3b,0x68,0x17,0x81,0xe8,0xf, +0x3f,0xd6,0x27,0xa6,0x25,0x97,0xe0,0x1, 0x17,0x7e,0xe8,0xe, 0x3f,0x56,0xe0,0x65, +0xc7,0x10,0xe8,0xe, 0x3f,0x12,0xe8,0x40,0x3e,0xe5,0x17,0x80,0xc7,0x81,0x96,0xd, +0xe2,0x1, 0xc7,0xff,0x3f,0xfb,0xb6,0xe, 0x3c,0x9c,0xe8,0xd, 0x3e,0x97,0x3f,0x1a, +0x1, 0xf6,0xf0,0x0, 0xc3,0x1, 0xf2,0x1, 0xc3,0x7f,0xf8,0x40,0x39,0xf6,0xf0,0x0, +0xc2,0x82,0xf0,0x0, 0xc2,0x2, 0x1, 0xdb,0xe0,0x28,0x3c,0x19,0x38,0x82,0x25,0xf2, +0xe0,0x1, 0x17,0x7e,0xe8,0xe, 0x3f,0x56,0xe0,0x6b,0xc7,0x38,0xe8,0xe, 0x3f,0x12, +0xe8,0x40,0x3e,0xe4,0xc7,0x81,0x96,0xd, 0xe2,0x1, 0xc7,0xff,0x3f,0xfb,0xb6,0xe, +0x3c,0x1c,0xe8,0xd, 0x3e,0x97,0x3f,0x1a,0x1, 0xf6,0xf0,0x0, 0xc3,0x1, 0xf2,0x1, +0xc3,0x7f,0xf8,0x40,0x39,0xf6,0xf0,0x0, 0xc2,0x82,0xf0,0x0, 0xc2,0x2, 0xe7,0xff, +0x1, 0xb7,0x0, 0xdb,0xe8,0x40,0x3c,0x63,0x38,0x82,0x0, 0x0, 0x8, 0xb6,0xe1,0xff, +0xc0,0x18,0xe0,0x1, 0x1f,0xc3,0x17,0x0, 0x8d,0x8f,0xe0,0x0, 0x19,0x8d,0x39,0x68, +0xe0,0xc, 0x35,0xc3,0x3f,0xee,0x3e,0xee,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0x13, +0x3f,0xfc,0xe0,0xf, 0xae,0x8e,0x3f,0x6f,0x5, 0x78,0xe0,0x0, 0x1b,0xe, 0xe0,0x0, +0x1a,0x8c,0x17,0x80,0xae,0x86,0xae,0x85,0xe0,0x1a,0xb7,0xd3,0xe0,0x1a,0xb7,0xe3, +0xe0,0x1a,0xb7,0xf3,0xe0,0x1b,0xb7,0x93,0xe0,0x1, 0x21,0x7f,0xe0,0x1, 0x1f,0xeb, +0x37,0xc1,0x7f,0x86,0xe2,0x0, 0x7e,0x2e,0xe0,0x2, 0x1e,0xfd,0xe0,0x1, 0x1a,0x42, +0x8f,0x5d,0xe0,0x1, 0x1f,0xd7,0xf0,0x0, 0x81,0xcd,0xe0,0xe, 0x8c,0xa4,0xe0,0x1, +0x1e,0xf9,0xf0,0x0, 0x92,0x2f,0xf0,0x0, 0x92,0xbf,0xf0,0x0, 0x93,0x7f,0xf0,0x1, +0x93,0x8f,0xe0,0xe, 0x8c,0x14,0xe0,0xf, 0x37,0x41,0xe9,0xff,0xc6,0x7e,0x36,0x41, +0x36,0xc1,0xc5,0xff,0xe0,0x1, 0x15,0x78,0x34,0xc1,0x6f,0x94,0x17,0x81,0x7e,0x8, +0x7e,0x87,0xf0,0x0, 0x69,0x95,0xf0,0x0, 0x72,0x12,0xf0,0x0, 0x72,0x93,0xf0,0x0, +0x73,0x14,0x6d,0x96,0x6f,0x97,0xf0,0x0, 0x73,0x95,0xe0,0x9, 0xd0,0x47,0xe2,0x0, +0x7c,0x84,0xe2,0x0, 0x7c,0x14,0xe0,0x9, 0xd0,0xf8,0xe0,0xe, 0x8c,0xa4,0xe0,0xe, +0x8c,0x14,0xe0,0x1, 0x15,0x78,0xe0,0x9, 0xd0,0x39,0x56,0x7, 0x5f,0x8, 0x5f,0x86, +0xe0,0x1a,0xb6,0x73,0xe0,0x16,0x37,0x47,0xe0,0x0, 0x1e,0xb, 0x4c,0x84,0x4d,0x5, +0x54,0x3, 0x55,0x84,0xf0,0x0, 0x1a,0xa, 0x56,0x85,0xe0,0x15,0x37,0xc7,0xf0,0x0, +0x19,0x88,0xaf,0xc, 0xf2,0x1, 0xc3,0x7e,0xe0,0x0, 0x1f,0x9, 0xf2,0x1, 0xc2,0xfe, +0xac,0x86,0xad,0x5, 0xe0,0x1a,0xb4,0x53,0xe0,0x1a,0xb5,0xe3,0xf8,0x0, 0xab,0x4, +0xe0,0x1b,0xb6,0x93,0xaf,0x8e,0xf8,0x0, 0xaa,0x83,0xe0,0x0, 0x29,0x4d,0x24,0xa5, +0xf0,0x1, 0x1b,0xec,0xe0,0x0, 0x1e,0xd, 0x3c,0x62,0x11,0x1, 0xe0,0xf, 0x34,0x43, +0xe2,0x0, 0xc7,0x9f,0x3f,0x93,0x17,0x7, 0xe0,0xf, 0x85,0x8f,0x3f,0x58,0xe8,0x80, +0x9e,0x97,0xe0,0xe, 0x31,0x3e,0x3f,0x4b,0xc4,0x1, 0xe0,0xf, 0xaf,0xf, 0xe0,0xb, +0x36,0xa1,0x17,0x81,0x36,0xc8,0xe2,0x1, 0xc4,0x7f,0xae,0x8c,0x3f,0x9b,0xc6,0x2, +0x3c,0xf8,0xe0,0x40,0xaf,0x9c,0x1, 0xe3,0x25,0x1b,0x15,0xff,0x3d,0x9a,0xe2,0x1, +0xc5,0xff,0x35,0xa1,0xe2,0x0, 0x7f,0xae,0xe0,0x0, 0x1f,0xd, 0xe2,0x0, 0x7e,0x2c, +0xe0,0xb, 0x3d,0x9f,0xe0,0x80,0x9f,0x9c,0xc7,0x2, 0xe0,0xd, 0x37,0xa1,0xc6,0x81, +0x37,0xc8,0x3d,0xfc,0xe0,0x7, 0xaf,0xae,0xe0,0x7, 0xae,0xbe,0x1, 0xf4,0xf0,0x0, +0xc3,0x1, 0xf0,0x0, 0xc2,0x81,0xf8,0x0, 0xab,0x4, 0xf8,0x0, 0xaa,0x83,0xe0,0x0, +0xc0,0x68,0xb, 0x61,0x24,0xa4,0xe0,0x1, 0x1c,0x6c,0xe0,0x0, 0x1d,0x8d,0x17,0x80, +0xf0,0x0, 0x13,0x81,0xe0,0xe, 0x37,0xc3,0xe2,0x0, 0xc7,0x1f,0x3f,0x13,0x16,0x87, +0xe0,0xf, 0x81,0xe, 0x3e,0xdf,0xe0,0x80,0x9e,0x18,0xf0,0xd, 0x33,0xbd,0x3e,0xc2, +0xc7,0x81,0xe0,0xf, 0xae,0x8e,0xe2,0x1, 0xc7,0xff,0xe0,0xe, 0x36,0x48,0xaf,0xb, +0x36,0x21,0xc5,0x82,0x3c,0xff,0xe0,0x40,0xae,0x1b,0x1, 0xe5,0x25,0x59,0x15,0xff, +0x3d,0x9a,0xe2,0x1, 0xc5,0xff,0x35,0xa1,0xe2,0x0, 0x7f,0xae,0xe0,0x0, 0x1f,0xd, +0xe2,0x0, 0x7e,0xac,0xe0,0xb, 0x3d,0x9f,0xe0,0x80,0x9f,0x9d,0xc7,0x2, 0xe0,0xc, +0x37,0xc8,0x3d,0xfd,0x37,0xa1,0xe0,0x7, 0xae,0x2e,0xe0,0x7, 0xaf,0xbe,0x1, 0xf5, +0xe0,0x0, 0xc0,0x68,0xb, 0x61,0xe0,0x1, 0x1f,0xea,0x37,0xc1,0x7f,0x86,0xe7,0xfe, +0x0, 0x83,0x8, 0xb4,0xe0,0x0, 0x1f,0x87,0x17,0x0, 0xaf,0xf, 0xdd,0xa2,0xe0,0x3, +0x1f,0xc7,0xea,0x10,0x79,0x78,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x21,0xe0,0x0, +0x1f,0x8e,0x8f,0xf, 0x27,0x10,0x87,0x82,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0xb2,0x2, 0x94,0xaf,0x82,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x9, 0xa, 0x61,0xe0,0x1, 0x1f,0xe9,0xaf,0x2, 0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0xf9,0xe0,0x0, 0x1f,0x86,0xaf,0xf, 0xa, 0x61,0x17,0xb2,0x0, 0xec,0x8c,0x2, +0xe0,0x0, 0x19,0x8e,0xe0,0x6, 0xd2,0xae,0xe0,0x0, 0x1f,0x93,0x8f,0x3, 0x8f,0x8f, +0xe0,0x0, 0x1e,0x9a,0x3f,0x7f,0xac,0xd, 0x1, 0x56,0x8e,0x82,0x17,0xb1,0xe1,0x2f, +0x3f,0xad,0x27,0xd1,0x2c,0x50,0xe0,0x1, 0x1f,0xe8,0x87,0x8f,0xe2,0x1, 0xc7,0xfd, +0x2f,0xca,0xe0,0x2, 0x1a,0x48,0x8f,0x84,0xe2,0x0, 0xcf,0x81,0x1, 0xc, 0x8f,0x84, +0xe2,0x0, 0xcf,0x81,0x1, 0x4, 0x8f,0x3, 0xe7,0xff,0x0, 0xbe,0xdd,0x11,0x8f,0x3, +0xe7,0xff,0x0, 0xba,0xde,0x14,0xde,0x7b,0x0, 0xf3,0xea,0x10,0x7f,0xfe,0xea,0x11, +0x7f,0x2, 0x97,0x8f,0x9e,0x8e,0xe4,0x8, 0x34,0x23,0xe0,0xe, 0x3f,0xad,0xe0,0x43, +0x3f,0x1e,0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d,0x3f,0xad,0xe0,0x41,0x3f,0x4e, +0xe4,0x8, 0x34,0x40,0xe0,0x6f,0x3d,0x2e,0x3f,0xf8,0x2, 0x17,0xea,0x10,0x7f,0xfc, +0xea,0x11,0x7f,0x0, 0x97,0x8f,0x9e,0x8e,0xe0,0xe, 0x3f,0xad,0xe0,0x43,0x3f,0x1e, +0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d,0x3f,0xad,0xe0,0x41,0x3f,0x4e,0xe0,0x6f, +0x3d,0x2e,0xe0,0x28,0x3c,0x2f,0x38,0x82,0x14,0x0, 0x38,0x82,0xea,0x10,0x7f,0xfa, +0x17,0x0, 0xaf,0xf, 0x38,0x82,0xea,0x11,0x7c,0x4, 0xe0,0x7d,0x0, 0xdb,0x0, 0x0, +0x8, 0xb6,0xea,0x10,0x79,0x7a,0xe0,0x2, 0x1f,0xdf,0x8e,0x82,0xe0,0x2, 0x1f,0x5e, +0x8e,0xf, 0x26,0x8f,0xea,0x11,0x79,0x84,0x9f,0x83,0x27,0x85,0x17,0x81,0xe1,0x2f, +0x3e,0x1f,0x27,0x96,0x14,0x0, 0x17,0x80,0xaf,0x82,0x17,0x80,0xb7,0x83,0xb, 0x61, +0xe0,0x2, 0x1f,0xdd,0xe2,0x0, 0xce,0x1, 0x8c,0xf, 0x1, 0x15,0xea,0x49,0x7f,0xb0, +0xe9,0xff,0xc7,0xff,0xe0,0xe, 0x36,0xa2,0x3f,0x9e,0xa7,0x8f,0x3f,0x82,0xe0,0x2, +0x1d,0xdd,0xe2,0x0, 0xce,0x1, 0xe0,0x0, 0x8c,0xb, 0xe0,0x1, 0x1, 0xa5,0xe2,0x0, +0xce,0x84,0x1, 0x61,0xe0,0x1, 0x1f,0xc1,0xe0,0x6, 0x9a,0x2e,0x8d,0x8f,0xe0,0x1, +0x1f,0xc0,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0x7f,0xe0,0x1, 0x5, 0x91,0xe0,0x1, +0x1f,0xbf,0x8d,0x8f,0xe0,0x1, 0x1f,0xbe,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0x7f, +0xe0,0x1, 0x3, 0x86,0xe0,0x1, 0x1f,0xbd,0xe0,0x6, 0x9a,0xbe,0x8d,0x8f,0xe0,0x1, +0x1f,0xbc,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0xff,0xe0,0x0, 0x5, 0xf9,0xe0,0x1, +0x1f,0xbb,0x8f,0xf, 0xe0,0x1, 0x1f,0xba,0x37,0x28,0x8f,0x8f,0x3f,0xce,0x3a,0xff, +0xe0,0x0, 0x3, 0xee,0xe2,0x0, 0xce,0x84,0xe0,0x1, 0x2, 0x9d,0xea,0x49,0x7f,0xc4, +0xe9,0xff,0xc7,0xff,0x36,0xa2,0x3f,0x9d,0xa7,0x8f,0x3f,0x82,0x12,0x80,0x3a,0x65, +0x17,0x81,0xe0,0x2c,0x3e,0xf, 0xe0,0x0, 0x26,0x59,0xe0,0x0, 0x2c,0x57,0xea,0x10, +0x7f,0xfc,0xea,0x10,0x7f,0x7e,0xb2,0x8f,0xe0,0x1, 0x1f,0xb9,0xb2,0xe, 0xea,0x11, +0x79,0x84,0x8e,0x8f,0xe0,0x1, 0x1f,0xb8,0x8f,0xf, 0xe0,0x1, 0x1f,0xb7,0x37,0x28, +0x8b,0xf, 0xe0,0x1, 0x1f,0xb6,0x36,0xa8,0x8f,0x8f,0x3b,0x4d,0x3f,0xce,0x9f,0x3, +0xe0,0xf, 0x3b,0x2f,0x3f,0x7f,0xe7,0xfe,0x2, 0x7f,0xe0,0x1, 0x1f,0xb5,0x8c,0xf, +0xdf,0x2d,0xe7,0xfe,0x24,0x79,0xea,0x11,0x7f,0x80,0xea,0x11,0x7f,0x2, 0x14,0x0, +0xb2,0x8f,0x17,0x83,0xb2,0xe, 0xaf,0x82,0xb3,0x3, 0xb, 0x61,0xea,0x11,0x79,0x84, +0x14,0x24,0xe7,0xfe,0x0, 0xea,0x2e,0x14,0xe2,0x0, 0xce,0x81,0xe0,0x0, 0x1, 0x44, +0xe0,0x1, 0x1f,0xb4,0x3c,0x6c,0x8e,0x8f,0xe0,0x1, 0x1f,0xb3,0x36,0xa8,0x8f,0xf, +0xea,0x11,0x7f,0x84,0x3f,0x4d,0x16,0x84,0xae,0x82,0xb7,0xf, 0xb, 0x61,0x12,0x80, +0x3a,0x65,0xe0,0x1, 0x1e,0xb2,0xea,0x10,0x7f,0x7e,0xea,0x10,0x7f,0xfc,0x8c,0xd, +0xb2,0xe, 0xb2,0x8f,0xde,0xfb,0x24,0x3, 0x14,0x0, 0xb, 0x61,0xea,0x11,0x79,0x84, +0xe7,0xfe,0x0, 0xc2,0xe2,0x0, 0xce,0x84,0xe7,0xfe,0x5, 0xca,0xe7,0xfe,0x0, 0xbc, +0xe0,0x43,0x3a,0x14,0xe0,0x43,0x3a,0x95,0x0, 0xe5,0x2c,0x6f,0xea,0x11,0x7f,0x0, +0xea,0x11,0x7f,0x82,0xb2,0x8e,0xe0,0x1, 0x1f,0x39,0xb2,0xf, 0xea,0x11,0x7f,0x84, +0x8e,0x8e,0xe0,0x1, 0x1f,0x37,0x36,0xa8,0x8f,0xe, 0x3f,0x4d,0x16,0x81,0xae,0x82, +0xb7,0xf, 0xb, 0x61,0xe0,0x1, 0x1f,0xb9,0x3c,0x6c,0x8e,0x8f,0xe0,0x1, 0x1f,0xb7, +0x36,0xa8,0x8f,0xf, 0xea,0x11,0x7f,0x84,0x3f,0x4d,0x16,0x82,0xae,0x82,0xb7,0xf, +0xb, 0x61,0xea,0x11,0x79,0x84,0x14,0x0, 0xe7,0xfe,0x0, 0x8f,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xe2,0x0, 0xcc,0x1, 0x39,0x69,0xe0,0x0, 0x5, 0xd1,0x12,0xfe,0xf0,0x0, +0x1d,0xd0,0x3a,0x98,0xe0,0x0, 0x1f,0xcc,0xea,0x11,0x7a,0xc, 0xe2,0x1, 0xc2,0xff, +0xfa,0x11,0x7f,0x2c,0xc2,0x81,0xf0,0x0, 0x14,0x80,0xe8,0x0, 0x93,0x8b,0x93,0xf, +0x3a,0x94,0xf8,0x40,0x3e,0x69,0xf0,0x0, 0x14,0x1, 0x8c,0x4, 0xf0,0x80,0x8e,0x94, +0xe8,0x0, 0x8c,0x8e,0xf8,0x80,0x8d,0x1e,0xe8,0x8, 0x3c,0x2d,0xe8,0x9, 0x3c,0xaa, +0x34,0x24,0xe0,0x9, 0xd3,0x75,0x39,0xe8,0x8c,0x14,0xe8,0x0, 0x8c,0x9e,0xf0,0x8, +0x3e,0xa8,0xf0,0x9, 0x3d,0x29,0x34,0x24,0xe0,0x9, 0xd3,0x6a,0xe0,0xf, 0x39,0xa8, +0x16,0x85,0x3e,0x9f,0x17,0x1, 0x3f,0x12,0xe2,0x0, 0xce,0x8b,0xe2,0x1, 0xc7,0x7f, +0xe0,0x62,0x3b,0xae,0x3f,0xf7,0x39,0xef,0x5, 0x5, 0xe0,0x43,0x3b,0x9f,0xf8,0x40, +0x3e,0x68,0x3f,0xf6,0x3, 0x5, 0xe0,0x43,0x3b,0x13,0xf8,0x40,0x3c,0xe8,0x3a,0x75, +0x1, 0xcd,0xf0,0x0, 0x2e,0x8, 0xf0,0x0, 0x2c,0x89,0x3c,0x62,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe8,0x0, 0xb3,0x8b,0x0, 0xf8,0xe0,0x0, 0x1f,0xcc,0xb3,0xf, 0x0, 0xf6, +0x8, 0xb7,0x12,0x0, 0x16,0xff,0xf0,0x0, 0x13,0x9f,0x3e,0x98,0xf0,0x17,0x3b,0x98, +0xc4,0xff,0x3d,0x64,0x3c,0x64,0x3d,0xe4,0xe0,0x40,0x3e,0x64,0xe0,0x80,0x8f,0x9d, +0xe0,0x80,0x8f,0x19,0xe0,0x3, 0x3f,0xbf,0xe0,0x5, 0x3f,0x3e,0xe0,0x2, 0x3f,0x3f, +0xf0,0x40,0x3b,0xfd,0x3e,0x1e,0x3d,0x9f,0x3c,0x15,0x3d,0x13,0x3a,0x12,0x1, 0xef, +0xe0,0x2, 0x36,0x5, 0xe4,0x0, 0xc4,0x64,0xe0,0x0, 0x12,0xe4,0x3a,0xba,0xe0,0x4, +0x14,0xb5,0xe0,0x6, 0x39,0x32,0xe0,0x3, 0x35,0x85,0xe0,0x9, 0xd3,0x11,0xe0,0x6, +0x3c,0x26,0xe0,0x4, 0x14,0xb5,0x3c,0x65,0xe0,0x9, 0xd3,0xa, 0xe0,0x7, 0x39,0xb3, +0x17,0x80,0xe0,0x2f,0x3b,0xf, 0xe0,0x7, 0x3c,0x27,0xe0,0x0, 0x14,0x64,0x2f,0x9d, +0xe0,0x25,0x3b,0x8f,0x2a,0x9a,0x3c,0x34,0xe0,0x4, 0x14,0xb5,0x39,0x33,0xe0,0x9, +0xd2,0xf7,0xe0,0x2, 0x3c,0x22,0xe0,0x0, 0x14,0x64,0x3c,0x32,0x3c,0xe6,0xe0,0x9, +0xd2,0xef,0x3c,0x32,0x3c,0xe7,0xe0,0x9, 0xd2,0xeb,0xe0,0x43,0x3f,0x98,0xe2,0x0, +0xcf,0x80,0x4, 0x6, 0xe0,0x43,0x3c,0x18,0xe2,0x1, 0xc4,0x7f,0xb, 0xe1,0x3c,0x65, +0x0, 0xfa,0x8, 0xb1,0xea,0x11,0x7f,0x87,0x8f,0x8f,0xe0,0xe, 0x34,0xa1,0xe0,0xd, +0x35,0x21,0x3f,0x18,0xc7,0xff,0x3c,0x1d,0x86,0x9e,0x3c,0xff,0x16,0x0, 0x38,0xed, +0x85,0x98,0xe0,0x61,0x39,0xac,0x3e,0x61,0x2d,0x88,0x3c,0xfa,0xb6,0x88,0x1, 0x2, +0xb5,0x8e,0x3c,0xff,0x1, 0xb, 0x8, 0xe1,0x3c,0xfa,0x1, 0x7c,0x3e,0x9b,0x36,0x81, +0xb6,0x88,0x3c,0xff,0x16,0x80,0xb6,0x8e,0x1, 0xf7,0xb6,0x8, 0x8, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0xc, 0xea,0x11,0x7b,0xab,0xea,0x11, +0x7e,0xb, 0x16,0xa0,0x7e,0x6, 0xc4,0x7e,0xc4,0xfe,0x3e,0x97,0xe0,0x40,0x3f,0xec, +0xe0,0x80,0x97,0x18,0xe0,0x80,0xaf,0x17,0x3e,0xf7,0xe0,0x80,0x97,0x19,0xe0,0x80, +0xaf,0x1f,0x1, 0xf7,0xe0,0x2, 0x1f,0x86,0x8a,0xf, 0xe0,0x4, 0x22,0x5c,0xfa,0x11, +0x79,0xac,0xf8,0x40,0x3c,0x63,0xe0,0x2, 0x1f,0x29,0xf8,0x0, 0x8d,0x88,0x17,0x80, +0xf0,0x40,0x3d,0x6e,0x7f,0x9, 0xf0,0xc, 0x35,0xa4,0xe0,0x7, 0x17,0x68,0xf0,0x0, +0x16,0xd3,0xe8,0x40,0x39,0xea,0x7f,0x87,0xf0,0x40,0x3c,0xef,0x7e,0xb, 0xf0,0x1d, +0x3e,0x90,0x7f,0x88,0xf0,0x40,0x3e,0x6f,0x7f,0x8a,0x13,0x20,0xe0,0x0, 0x7f,0xc, +0xf0,0x40,0x3d,0x67,0xe0,0x0, 0x15,0x44,0x3c,0xe3,0xe2,0x0, 0x7c,0x34,0xe0,0x9, +0xd2,0xd1,0xe0,0x0, 0x1f,0xcc,0xe0,0xff,0x16,0x7f,0xe0,0x0, 0x1f,0x50,0xb6,0xf, +0x16,0x33,0x17,0x80,0x15,0x0, 0x3e,0x10,0xb7,0x8e,0xe8,0x40,0x3d,0xe8,0xe8,0x40, +0x3c,0x6d,0x64,0x86,0xf8,0x40,0x3b,0x68,0xe8,0x40,0x3e,0xeb,0xe8,0x40,0x3a,0xec, +0xe8,0x40,0x39,0x6c,0xe8,0x40,0x3b,0xec,0xf8,0x40,0x3f,0x6c,0x0, 0x83,0xe8,0x80, +0x8e,0x96,0xf0,0x80,0x8b,0x9c,0xe3,0xff,0xc6,0xff,0xf0,0xe, 0x3b,0xad,0xe0,0x43, +0x3f,0x9e,0xe8,0xd, 0x3e,0xa7,0xe2,0x0, 0xcf,0x80,0xe0,0x43,0x3e,0x9d,0xe0,0x6f, +0x3d,0x2d,0xf0,0x80,0x8b,0x98,0xe0,0x80,0x8e,0x99,0xe8,0x40,0x3f,0xfe,0xf0,0xe, +0x3b,0xad,0xe0,0x7e,0x3b,0x2f,0xe2,0x0, 0xcf,0x0, 0xe8,0xd, 0x3e,0xa7,0xe0,0x6e, +0x3d,0x2d,0xf0,0x40,0x3b,0xee,0xf3,0xff,0xc3,0xff,0xe3,0xff,0xc7,0xff,0xe8,0xd, +0x3f,0x97,0x3f,0x77,0xe8,0x5, 0x3a,0x97,0xf0,0x43,0x3b,0x9d,0xe0,0x67,0x3b,0x2e, +0xf0,0x40,0x3b,0xfa,0x3f,0x92,0xe0,0x43,0x39,0x1f,0xe0,0x43,0x3a,0x95,0x3, 0x2, +0x3e,0xea,0xf0,0x40,0x3e,0xfc,0xe0,0x43,0x3d,0x1d,0x1, 0xc2,0xe8,0x40,0x3e,0x6b, +0x17,0x0, 0xe0,0x0, 0x16,0xff,0x0, 0x83,0xe0,0x80,0x8e,0x1b,0xe4,0xf, 0x36,0x28, +0xf0,0x40,0x3b,0xed,0xe4,0x8, 0x37,0xc8,0xf2,0x1, 0xc3,0xff,0xf0,0x40,0x3b,0xf8, +0x3c,0xee,0xe2,0x1, 0xc4,0xff,0x3f,0xe8,0x5, 0x82,0x3e,0xec,0x3c,0xff,0xe2,0x1, +0xc6,0xff,0x3, 0x82,0x3f,0x6c,0xf0,0x40,0x3d,0x7b,0xe2,0x1, 0xc7,0x7f,0x1, 0xe5, +0xf0,0x2f,0x3f,0x16,0xe0,0x1, 0x27,0xdc,0xe0,0x2f,0x3b,0x96,0xe0,0x1, 0x27,0xd8, +0xf0,0x0, 0xc4,0x81,0xf2,0x1, 0xc4,0xff,0xf0,0x40,0x3c,0xf4,0xe0,0x0, 0xc1,0xc4, +0xe7,0xfe,0x1, 0xea,0xe0,0x9, 0x3f,0x2d,0x64,0xb, 0xe2,0x1, 0xc4,0xff,0xe0,0x9, +0xd1,0xd7,0x67,0x88,0x3a,0x68,0xc7,0xff,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0xe0,0x1, +0x17,0xfd,0xe1,0x2f,0x3f,0xae,0xe2,0x1, 0xc2,0x7f,0xe0,0x2, 0x27,0xc9,0x66,0xa, +0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3e,0x1f,0xe0,0x2, 0x27,0xc2,0x67,0x87,0xeb,0xc8, +0x79,0x78,0xea,0x11,0x79,0x88,0x67,0x8, 0xc7,0x81,0xf0,0x0, 0x66,0x7, 0xaf,0x82, +0xaf,0x3, 0xe0,0x0, 0x17,0xc4,0xe8,0xf, 0x3f,0xbc,0x67,0x9, 0x3f,0x1f,0xe0,0x8, +0x87,0x2e,0xc7,0x4f,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x2, 0x5, 0x9c, +0x67,0x8, 0xe2,0x0, 0xcf,0x31,0xe0,0x2, 0x1, 0x0, 0x67,0x8, 0xe2,0x0, 0xcf,0x50, +0xe0,0x2, 0x1, 0x58,0x67,0x88,0xe2,0x0, 0xcf,0xb3,0xe0,0x1, 0x1, 0x84,0xe2,0x0, +0xca,0x8, 0xe0,0x0, 0x2, 0xfb,0x14,0x80,0x14,0x1e,0xdd,0xf1,0xe0,0x0, 0x1f,0xcc, +0x97,0x8f,0xe3,0xff,0xcf,0xca,0xe0,0x2, 0x3, 0x55,0xf0,0x2, 0x1a,0xad,0xf0,0x2, +0x1a,0x3, 0xf0,0x2, 0x19,0x35,0xf0,0x0, 0x18,0xa5,0xea,0x11,0x7d,0x2c,0x12,0x0, +0x17,0x80,0xea,0x11,0x7c,0x8c,0xf0,0x0, 0x13,0x9d,0xe8,0x0, 0xb7,0x85,0xe8,0x0, +0xb7,0x84,0xf0,0x17,0x3b,0x9a,0xe8,0x0, 0xb7,0x82,0x3a,0xe4,0xe8,0x0, 0xb7,0x81, +0xf0,0x40,0x39,0xe4,0x3c,0x64,0xf0,0x40,0x3b,0x64,0x3b,0x64,0xf0,0x40,0x3c,0x64, +0xf0,0x40,0x38,0x64,0x3e,0xe4,0x13,0x81,0x0, 0x90,0xe2,0x0, 0xcd,0x80,0xe0,0x43, +0x3a,0x9e,0x3a,0x67,0xe0,0xe, 0x3f,0x96,0x4, 0x28,0xe0,0x43,0x3b,0x1e,0xf0,0x40, +0x3b,0x67,0xf0,0x40,0x3b,0xfa,0x1, 0x29,0x8d,0x8a,0x8f,0x1a,0x8f,0x99,0xf0,0x0, +0x8c,0x89,0x3f,0x2b,0x3e,0x6e,0xe8,0xf, 0x3f,0xa9,0xe2,0x0, 0xcf,0x0, 0xe3,0xff, +0xc7,0xff,0xe3,0xff,0xc6,0x7f,0xc5,0x1, 0xe0,0x43,0x3d,0x9f,0xc4,0x81,0xe0,0xe, +0x3e,0x15,0x3, 0x5c,0xe2,0x0, 0xcd,0x80,0x3e,0x18,0xe0,0x43,0x3c,0x1c,0xf0,0x40, +0x39,0xe7,0xe0,0xe, 0x3f,0x96,0x3, 0x5a,0x3f,0x9d,0xe0,0x43,0x3e,0x9f,0xf0,0x40, +0x38,0x6d,0xf0,0x40,0x3c,0x67,0x0, 0xd6,0xf0,0x2, 0x2c,0x11,0xf0,0x0, 0x23,0x4, +0xe8,0x0, 0xb3,0x2, 0xf0,0x0, 0x21,0x84,0xe8,0x0, 0xb4,0x4, 0x22,0x3, 0xe8,0x0, +0xb2,0x85,0xe3,0xff,0xce,0xe3,0x4, 0x6, 0xe0,0x0, 0x17,0xfc,0xaf,0x82,0x17,0x80, +0xaf,0x83,0xe0,0x0, 0xc0,0x74,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x16,0x30,0xf0,0x2f, +0x3f,0x1c,0xe7,0xfe,0x2f,0xa7,0xe0,0x2f,0x3b,0x9c,0xe7,0xfe,0x2f,0xa3,0xe2,0x6, +0xc9,0x0, 0xe7,0xfe,0x2, 0x1f,0xeb,0xc8,0x7f,0xf9,0x8f,0x8f,0x16,0xc, 0x3e,0x3f, +0x3a,0xfc,0xe7,0xfe,0x2, 0x17,0xe8,0x40,0x3c,0xe8,0xe2,0x0, 0x7c,0x34,0x7e,0x82, +0x7f,0x1, 0x7d,0x3, 0x7f,0x84,0xdd,0xb5,0xea,0x11,0x7c,0x8c,0x3d,0xe8,0xe2,0x0, +0x7c,0x54,0x7d,0x85,0xdd,0xae,0x16,0x3b,0xe1,0x29,0x3e,0x28,0x65,0x85,0x66,0x82, +0x67,0x1, 0xe7,0xfd,0x2c,0xff,0xe1,0x2c,0x3e,0x2b,0xe7,0xfd,0x2e,0x7b,0xe0,0x16, +0x3d,0xbb,0xe0,0xc, 0x3c,0x38,0xe0,0x9, 0x3d,0x98,0xf0,0x8, 0x3b,0x1c,0xe0,0x9, +0xd1,0x1a,0x3d,0xe8,0xe2,0x1, 0xc5,0xff,0xe2,0x0, 0xcd,0xd9,0x65,0x3, 0x66,0x82, +0x67,0x1, 0x67,0x84,0xe0,0x0, 0x5, 0xd9,0xe0,0x0, 0x16,0x64,0xf0,0xf, 0x3f,0x17, +0x3e,0x2b,0x36,0x21,0x3f,0x9a,0x3f,0x9c,0x66,0xc, 0xe0,0x43,0x3f,0x9f,0x3f,0xfc, +0x3, 0x8, 0xe0,0x0, 0x4e,0x76,0x7f,0x8c,0x7e,0x8, 0x7d,0x8a,0xf0,0x0, 0x7c,0x87, +0xe0,0x0, 0x17,0xc5,0x66,0xa, 0xe1,0x2f,0x3e,0x1f,0xe7,0xfd,0x27,0xcb,0x66,0x8, +0xe0,0x1, 0x17,0xff,0xe0,0x2f,0x3e,0xf, 0xe7,0xfd,0x27,0xc4,0x17,0x80,0x7f,0x88, +0x7f,0x8a,0xe7,0xfd,0x0, 0xbf,0x66,0x9, 0x3f,0x9c,0xe0,0x8, 0x8f,0xf, 0xe2,0x0, +0xcf,0x5, 0xe7,0xff,0x1, 0x88,0xe0,0x8, 0x8f,0x9f,0xe2,0x1, 0xcf,0xb3,0xe7,0xff, +0x1, 0x82,0x14,0x80,0x14,0xa, 0xdc,0xf3,0xe2,0x0, 0xcc,0x2, 0xe7,0xfe,0x2, 0xfb, +0xe7,0xfe,0x0, 0xf4,0xea,0x11,0x7f,0x6, 0x87,0xe, 0xe2,0x0, 0xcf,0x2, 0xe7,0xfd, +0x5, 0x61,0xe0,0x0, 0x17,0x7c,0xaf,0x2, 0xe7,0xfd,0x0, 0xdc,0xf0,0x0, 0x66,0x7, +0xea,0x11,0x79,0x88,0xeb,0xc8,0x79,0x78,0x8e,0x3, 0xe0,0x0, 0x17,0xfc,0x7e,0x8, +0xaf,0x82,0xe7,0xfd,0x0, 0xc0,0xf2,0x0, 0xcf,0x1f,0xe7,0xff,0x2, 0x3b,0xe0,0xc, +0x37,0x81,0x3b,0xfc,0xe7,0xff,0x3, 0x36,0xf2,0x0, 0xcf,0xf, 0x5, 0x6, 0xe0,0xc, +0x37,0x82,0x3b,0xfc,0xe7,0xff,0x3, 0x2e,0xe2,0x1, 0xc9,0x7f,0x2, 0x39,0x14,0x86, +0xe0,0x8, 0x37,0xa5,0x7d,0x3, 0x7d,0x85,0x7e,0x82,0x7f,0x1, 0xe0,0x9, 0xd0,0x58, +0xe0,0x28,0x3c,0x15,0x65,0x3, 0x65,0x85,0x66,0x82,0x67,0x1, 0xe7,0xff,0x24,0x1a, +0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3d,0x9f,0xe7,0xff,0x27,0x94,0xe7,0xfe,0x0, 0xfe, +0x14,0x80,0x14,0xa, 0xdc,0xa4,0xe2,0x0, 0xcc,0x6, 0xe7,0xfe,0x2, 0xac,0xe7,0xfe, +0x0, 0xa5,0xe0,0x2, 0x1f,0xa9,0xf0,0x40,0x3e,0x64,0x7f,0x89,0xe7,0xff,0x0, 0xba, +0xe0,0x0, 0x1e,0xd0,0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x96,0x8d,0x3f,0xae, +0x3f,0x9d,0xe2,0x1, 0xcf,0x95,0xe7,0xfd,0x2, 0x22,0xe7,0xfe,0x0, 0x8f,0xe0,0xc, +0x37,0xa2,0xe0,0x2c,0x3a,0xac,0xe7,0xfe,0x2e,0x6d,0xe0,0x2, 0x16,0x54,0xe0,0x22, +0x39,0x1c,0xe7,0xfe,0x29,0x67,0xe7,0xff,0x0, 0xbc,0xf8,0x0, 0xb0,0x1, 0xe7,0xfd, +0x0, 0xef,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xf4,0xc0,0x58,0xea,0x11, +0x79,0x87,0x3a,0x6a,0xeb,0xc8,0x79,0x78,0xe2,0x1, 0xc2,0x7f,0x17,0xff,0xaa,0x3, +0xaf,0x82,0xe0,0x0, 0x25,0x65,0x16,0x7f,0x3e,0x1a,0xe3,0xff,0xc6,0x7f,0xc6,0x1, +0x36,0x22,0xe0,0x3, 0x17,0x6a,0xe0,0x7, 0x17,0xca,0x3f,0x10,0x3f,0x90,0x3e,0x18, +0x96,0x88,0xc4,0x4, 0xe0,0x80,0xb6,0x9e,0x3e,0x78,0xe0,0x40,0x96,0x98,0xe0,0x80, +0xb6,0x9f,0x1, 0xf7,0xe2,0x0, 0xca,0x4, 0xe0,0x0, 0x5, 0xca,0xf0,0x1, 0x94,0x69, +0xf0,0x1, 0x94,0xf9,0xf8,0x40,0x3c,0x79,0xe0,0x0, 0x4, 0x57,0xe8,0x40,0x3c,0xe9, +0xf0,0x2, 0x24,0xaf,0xe8,0x40,0x3c,0x68,0xe0,0x8, 0xdf,0xda,0xeb,0xc8,0x7b,0x79, +0xe0,0x0, 0x17,0xc0,0xe0,0x43,0x3a,0x88,0xaf,0x86,0xea,0x11,0x7f,0x86,0xe2,0x0, +0xca,0x84,0xaa,0x8f,0xe0,0x0, 0x5, 0x60,0xe0,0x0, 0x17,0xfd,0xaf,0x82,0x14,0x87, +0xe0,0x1, 0x1f,0xb1,0xe0,0x1, 0x1f,0x30,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x3c,0x4f, +0x34,0x21,0xe0,0x8, 0xdf,0xbd,0xe8,0x40,0x3c,0x78,0xe0,0x2, 0x5, 0x2, 0xe0,0x1, +0x1f,0xaf,0xe0,0x1, 0x1f,0x2e,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x14,0x86,0x3c,0x4f, +0xe0,0x8, 0xdf,0xf1,0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0xf8,0xe0,0x1, 0x3, 0x71, +0xe0,0x0, 0x17,0xfd,0xaf,0x82,0xe0,0x0, 0x16,0xfd,0x0, 0x86,0xe0,0x0, 0x17,0xff, +0xaf,0x82,0xe0,0x0, 0x16,0xff,0xe0,0x2, 0x1f,0x86,0x17,0x0, 0x87,0x8f,0xaf,0x3, +0x3f,0xfd,0x14,0x0, 0x4, 0x4, 0xea,0x11,0x7f,0x88,0x8c,0xf, 0xe0,0xb, 0xc0,0x28, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x7, 0x34,0x21,0xf0,0x1, 0x24,0x5f,0xe8,0x40, +0x3c,0xe8,0xe8,0x40,0x3c,0x69,0xe0,0x8, 0xdf,0x83,0xf0,0x40,0x3c,0xf7,0xe0,0x43, +0x3a,0x88,0xeb,0xc8,0x7b,0x79,0xe0,0x1, 0x3, 0x47,0x3c,0xe7,0xf0,0x8, 0x34,0xa7, +0xe0,0x8, 0xdf,0xb9,0xea,0x11,0x7f,0x86,0xe2,0x0, 0xca,0x84,0xac,0x6, 0xaa,0x8f, +0xe7,0xff,0x2, 0x24,0xe0,0x3, 0x1f,0x88,0xf0,0x0, 0x15,0x1, 0xe0,0x1, 0x9f,0x6f, +0xe0,0x1, 0x9e,0xff,0xe2,0x0, 0xcf,0x0, 0xf8,0x40,0x3d,0xea,0xe0,0x7b,0x39,0xae, +0x8b,0x6, 0xe0,0x3, 0x12,0xec,0xe2,0x0, 0xce,0x80,0xf0,0x7, 0x16,0xcc,0xe0,0x1, +0x9f,0xf, 0x3a,0x90,0xf0,0x1d,0x3e,0x90,0xf0,0x0, 0x9e,0x7f,0x7b,0x2, 0xe0,0x7a, +0x39,0xad,0x7f,0x1, 0xe8,0x40,0x3b,0xed,0x3b,0x65,0xf0,0x0, 0x17,0x0, 0x67,0x81, +0x94,0x6, 0xe8,0x40,0x3c,0xeb,0x3c,0x2f,0x34,0x26,0xe0,0x8, 0xdf,0x84,0x97,0x87, +0xe1,0x80,0xb4,0x16,0xe8,0xf, 0x3f,0xac,0x64,0x2, 0xe8,0x40,0x3c,0xea,0x3c,0x3f, +0xe0,0x8, 0xdf,0x79,0x15,0x1, 0xe8,0xa, 0x3d,0x1e,0xf0,0x40,0x3f,0x6a,0xf2,0x1, +0xc7,0x7f,0xe8,0x40,0x3a,0x7e,0xe1,0x80,0xb4,0x17,0x1, 0xe2,0xe0,0x3, 0x53,0x66, +0xe0,0x3, 0x4b,0xed,0xf0,0x0, 0x11,0x8c,0xf0,0x1, 0x12,0x7c,0x12,0x1, 0xf0,0x13, +0x39,0x90,0xf0,0x14,0x3a,0x10,0xe2,0x1, 0xc3,0x7f,0xe8,0x0, 0xab,0x83,0xf8,0x40, +0x3b,0x6d,0xe8,0x0, 0xab,0x4, 0xf0,0x40,0x3b,0xe5,0x3c,0x64,0xf0,0x40,0x3a,0xe4, +0xf0,0x0, 0x11,0x7, 0xf0,0x0, 0x10,0x83,0x0, 0x8b,0xe8,0x2f,0x3d,0x95,0x2f,0xaf, +0xc4,0x1, 0xe2,0x1, 0xc4,0x7f,0xe8,0x40,0x3c,0x7e,0xe0,0x1, 0x1, 0x23,0xe8,0x80, +0x94,0x97,0xf8,0x80,0x90,0x16,0xe2,0x1, 0xc4,0xff,0xe0,0xd, 0x3c,0xa7,0xe2,0x1, +0xc6,0xff,0xf2,0x1, 0xc0,0x7f,0xe0,0x43,0x3e,0xd, 0xf0,0xf, 0x38,0x26,0xe2,0x0, +0xce,0x0, 0xe2,0x1, 0xc7,0xff,0xe0,0x41,0x3e,0xcd,0xe0,0x43,0x3d,0x8f,0xe0,0x43, +0x3e,0x8d,0xe0,0x6c,0x3c,0x2d,0xe0,0x41,0x3f,0xcf,0xe2,0x0, 0xcd,0x80,0xe0,0x43, +0x3f,0x8f,0xe8,0x2d,0x3e,0x15,0xe0,0x6b,0x3c,0x2f,0x26,0xd0,0xe2,0x1, 0xca,0x6c, +0xe0,0x1, 0x2, 0xc5,0xe8,0x2f,0x3e,0x12,0x2f,0xad,0xe8,0x2f,0x3d,0x92,0x2f,0xaa, +0xe8,0x2c,0x3e,0x11,0xe0,0x0, 0x2e,0x5d,0xe8,0x2b,0x3d,0x91,0xe0,0x0, 0x2d,0xd9, +0xf0,0xd, 0x39,0x94,0xf0,0xf, 0x3a,0x14,0xc2,0x1, 0xac,0x8d,0xe2,0x1, 0xc2,0x7f, +0xf0,0x0, 0xa8,0xf, 0xe8,0x40,0x3b,0x60,0x3b,0xe9,0xe7,0xff,0x0, 0xb3,0x86,0x82, +0xe7,0xfe,0x0, 0x9b,0xe7,0xff,0x17,0x80,0xaf,0x86,0xe7,0xfd,0x0, 0xe0,0x14,0x81, +0xf0,0x40,0x3c,0xe9,0xe7,0xfd,0x0, 0xd0,0x13,0x82,0xf0,0x0, 0x14,0x1, 0xe7,0xfe, +0x0, 0xa0,0x17,0x81,0x3f,0x94,0xe0,0xb, 0x3b,0x99,0xe8,0xc, 0x3b,0x10,0xe2,0x1, +0xc7,0xff,0x35,0x81,0x36,0x1, 0x16,0xff,0xf0,0x1b,0x39,0x9f,0xf0,0x1a,0x3a,0x1f, +0x3e,0x9f,0x3b,0x9b,0x3b,0x1c,0xe8,0x0, 0xad,0x8b,0xf0,0x1c,0x39,0x9d,0xe8,0x0, +0xae,0xa, 0xe0,0xb, 0x33,0x81,0xe8,0xd, 0x3e,0x94,0xe0,0xc, 0x33,0x1, 0xe8,0x0, +0xad,0x8c,0xc7,0x81,0xae,0xd, 0xf0,0xb, 0x39,0x9f,0xe8,0x0, 0x8e,0xb, 0xe8,0x0, +0x8e,0x8a,0x3e,0x19,0xe8,0xd, 0x3e,0x90,0x36,0x1, 0xe8,0xf, 0x3f,0x94,0x36,0x81, +0xc2,0x3, 0xae,0xb, 0xe2,0x1, 0xc2,0x7f,0xae,0x8f,0xe7,0xff,0x0, 0xab,0xe0,0xd, +0x3b,0x99,0xe8,0xf, 0x3b,0x10,0xf0,0xb, 0x39,0x94,0xf0,0xc, 0x3a,0x14,0x36,0x81, +0x37,0x81,0xc2,0x1, 0xae,0x8b,0xe2,0x1, 0xc2,0x7f,0xaf,0x8c,0xe7,0xff,0x0, 0x9a, +0xe2,0x0, 0xca,0x1, 0xaa,0x3, 0x1, 0x1a,0x15,0x7e,0x3d,0x14,0xe2,0x1, 0xc5,0x7f, +0x17,0x8c,0x3f,0x90,0xc5,0x1, 0xe0,0x1, 0x16,0xfc,0x3e,0x90,0xe0,0xa, 0x3d,0x1f, +0xe0,0x80,0x8d,0x9f,0xe0,0x80,0x8e,0x1d,0x3f,0xfa,0xe0,0x80,0xb5,0x95,0xe8,0x80, +0xb6,0x1d,0x1, 0xf7,0xe2,0x0, 0xca,0x1f,0x2, 0x86,0xe0,0x0, 0x17,0xfe,0xaf,0x82, +0xe7,0xfc,0x0, 0xf7,0x12,0x82,0xf0,0x40,0x3d,0x65,0x3c,0xe4,0xe0,0x8, 0x32,0xa5, +0xe0,0x8, 0xde,0x79,0xe2,0x0, 0xcc,0x2, 0xe8,0x40,0x3b,0x6a,0xe0,0x66,0x3b,0xa8, +0x13,0xff,0x3b,0x95,0xc3,0x7f,0xe2,0x1, 0xc3,0xff,0xe2,0x1, 0xc3,0x7f,0x3c,0xe7, +0x3d,0x66,0xe2,0x3, 0x7c,0x6c,0xdb,0x46,0x3d,0x66,0x3c,0xe7,0xe2,0x7, 0x7c,0x4c, +0xc2,0x81,0xdb,0x40,0xe2,0x1, 0xc2,0xff,0x3a,0xf4,0x5, 0xe0,0xe2,0x7, 0x7c,0xcc, +0xe2,0x3, 0x7c,0x6c,0xdb,0x5e,0xe7,0xfc,0x0, 0xcc,0xaa,0x3, 0xe7,0xff,0x0, 0xb6, +0xf0,0x2, 0x1b,0x36,0xe8,0x0, 0x8d,0x6, 0xe2,0x1, 0xcd,0x6f,0x2, 0x90,0xf0,0x2, +0x1b,0xae,0xe0,0xf, 0x35,0x22,0xc5,0x1, 0xf0,0x17,0x3b,0x9f,0xe2,0x1, 0xc5,0x7f, +0xe8,0x0, 0xb4,0x7, 0xe8,0x0, 0xb4,0x97,0xe8,0x0, 0xad,0x6, 0xe0,0x3, 0x1f,0x88, +0xe0,0x1, 0x9f,0xf, 0x3f,0x78,0xe0,0x1, 0x5, 0xa5,0xe0,0x1, 0xb4,0xf, 0xe0,0x1, +0xb4,0x9f,0x9f,0x7f,0x3f,0x79,0xe0,0x1, 0x5, 0x83,0xb4,0xff,0xb4,0x6f,0xe2,0x0, +0xcd,0xa, 0xe0,0x1, 0x1, 0xa, 0xe2,0x0, 0xcd,0x14,0xe0,0x1, 0x1, 0x1b,0xe2,0x1, +0xcd,0x6f,0xe0,0x1, 0x5, 0xa7,0x8, 0xb1,0xf0,0x0, 0x19,0x8f,0xf0,0x2, 0x1b,0xae, +0xe8,0x0, 0x8c,0x83,0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x12,0x1, 0xe8,0x40,0x3c,0x67, +0xe2,0x0, 0xcc,0x9f,0x2, 0x86,0xc4,0x81,0xe2,0x1, 0xc4,0xff,0xf8,0x40,0x3a,0xe4, +0x17,0xfe,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xc7,0x81,0x37,0xa2,0xe8,0x0, 0x98,0x87, +0xf8,0x0, 0x99,0x17,0xe0,0x2, 0x1e,0xae,0xe0,0x10,0x3c,0x1f,0xf0,0x40,0x3b,0xe8, +0x15,0x0, 0x0, 0xad,0xe8,0xe, 0x3f,0x22,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x3e,0x1e, +0xe2,0x0, 0xce,0x0, 0xe2,0x1, 0xc7,0xff,0x5, 0x30,0xe2,0x1, 0xc7,0x7f,0xf0,0x40, +0x38,0xef,0x3e,0x6e,0xf2,0x1, 0xc0,0xff,0xe2,0x1, 0xc6,0x7f,0xf0,0x40,0x38,0xfc, +0x3, 0x82,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x3f,0xf9,0x4, 0x8d,0xc5,0x1, 0xe2,0x1, +0xc5,0x7f,0xf0,0x0, 0x99,0x3d,0xe0,0xf, 0x35,0x22,0x3f,0x98,0xb5,0x8f,0x38,0xeb, +0xf0,0x0, 0xb1,0x1f,0xc6,0x84,0xe8,0x40,0x3e,0xf0,0x1, 0x12,0x9d,0xad,0x9f,0x3d, +0xe0,0xf, 0x3d,0xa1,0xe3,0xff,0xc7,0xff,0xe0,0x43,0x3e,0x1f,0xe2,0x0, 0xce,0x0, +0x2, 0x4a,0xe0,0x41,0x3f,0xcf,0x0, 0xc7,0xe0,0x41,0x3f,0x4e,0x0, 0xcf,0xe2,0x0, +0xcc,0x9f,0xc5,0x1, 0xe2,0x1, 0xc5,0x7f,0x2, 0x85,0xe2,0x1, 0xcd,0x6b,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0x2a,0xb4,0xe8,0x0, 0xad,0x6, 0x8, 0xe1,0xe0,0x1, 0x9f,0x3f, +0x3f,0x79,0xe7,0xfe,0x3, 0xfe,0xe2,0x0, 0xcd,0xa, 0xe0,0x1, 0xb4,0xbf,0xe0,0x1, +0xb4,0x2f,0xe7,0xfe,0x1, 0xfa,0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f, +0x96,0x7f,0x3e,0xab,0x3f,0x2c,0xe0,0x2, 0xb6,0x8f,0xe0,0x2, 0xb7,0x1f,0x38,0x82, +0x9f,0x4f,0x3f,0x78,0xe7,0xfe,0x3, 0xdf,0xb4,0x4f,0xb4,0xdf,0xe7,0xfe,0x0, 0xdb, +0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f,0x96,0x7f,0x3e,0xab,0x3f,0x2c, +0xe0,0x2, 0xb6,0xaf,0xe0,0x2, 0xb7,0x3f,0x38,0x82,0xe8,0x0, 0xac,0x83,0x0, 0xcc, +0x38,0x82,0xe0,0x1, 0x1c,0x5b,0xe0,0x6e,0x0, 0xe5,0x0, 0x0, 0x17,0xe0,0x3f,0x98, +0xe2,0x0, 0xcf,0x83,0x5, 0x96,0x24,0x14,0xe0,0x2, 0x1e,0xb6,0x16,0x6, 0xe0,0x3, +0x1f,0x88,0xe0,0x2, 0x1f,0x2e,0xe0,0x3, 0x1d,0x87,0xae,0xd, 0xc7,0x84,0x96,0xf, +0x96,0x9f,0xb6,0xe, 0x3f,0xfb,0xc7,0x4, 0xe0,0x40,0xb6,0x9e,0x1, 0xf8,0x38,0x82, +0xe0,0x3, 0x1f,0x8, 0xe0,0x2, 0x1f,0xae,0x95,0xae,0x96,0x3e,0xe0,0x1, 0x96,0xce, +0xe0,0x2, 0x1d,0x36,0xe0,0x1, 0x97,0x5e,0x14,0x82,0xac,0x8a,0xb5,0x8f,0xb6,0x1f, +0xb6,0xaf,0xb7,0x3f,0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x2, +0x1f,0xdf,0xe0,0x2, 0x1f,0x5d,0x8f,0x8f,0x8e,0xe, 0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xfa,0xe0,0x1, 0x1f,0x5b,0x9e,0x8e,0xe0,0x0, 0x26,0xe6,0xe0,0x3, 0x19,0x8, +0x8d,0x82,0x2f,0x95,0x16,0x81,0xe0,0x2d,0x3e,0xd, 0x26,0x91,0x9f,0x8e,0xe2,0x0, +0xcd,0x83,0xb7,0x92,0xe0,0x1, 0x1, 0x61,0xe0,0x2, 0x1f,0xc0,0x17,0x7e,0xe0,0xa, +0xaf,0x3f,0x17,0x80,0xaf,0x82,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x2, 0x1f,0x5e, +0xe0,0xd, 0x8e,0x8e,0xe2,0x0, 0xce,0x81,0x1, 0x70,0xe0,0x6, 0x9a,0xae,0xe0,0x6, +0x9a,0x3e,0xe0,0x0, 0x25,0xfb,0xe2,0x0, 0xcd,0x81,0xe0,0x1, 0x1, 0x55,0xea,0x11, +0x7b,0x50,0xea,0x11,0x7b,0xce,0x97,0x86,0x94,0x87,0xe2,0x0, 0xcd,0x83,0xe0,0xf, +0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff,0xe0,0x2, +0x1, 0x14,0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe2,0x1, 0xc7,0xff,0xe2,0x1, +0xc4,0xff,0xe2,0x0, 0xce,0x80,0xf0,0x0, 0x1c,0xf, 0xe0,0x1, 0x5, 0x20,0xe2,0x0, +0xcf,0x0, 0xe0,0x1, 0x5, 0x2b,0x3e,0xef,0x3f,0x69,0xe2,0x1, 0xc6,0xff,0xe2,0x1, +0xc7,0x7f,0x3e,0xfe,0x3, 0x82,0x3f,0xe9,0xe8,0x0, 0x8f,0x8, 0xe2,0x1, 0xc7,0xff, +0x3f,0x7f,0xe7,0xff,0x3, 0xba,0x3c,0xe4,0x3c,0x65,0xde,0x83,0xb2,0x86,0xb2,0x7, +0xe7,0xff,0x0, 0xb3,0xe0,0x2, 0x1f,0x87,0x17,0x1, 0xaf,0xf, 0x17,0x7e,0xe0,0x2, +0x1f,0xc0,0xe0,0xa, 0xaf,0x3f,0xe0,0x3, 0x1f,0x88,0xae,0x8f,0xf8,0x0, 0xc, 0xa8, +0xb, 0xe1,0xe0,0x0, 0x1f,0xd, 0xe0,0x1a,0x9f,0x5e,0xe2,0x0, 0xcf,0x1e,0xe7,0xff, +0x2, 0x82,0xe0,0x3, 0x19,0x8, 0x8d,0x82,0xe0,0x1, 0x25,0xdd,0xe0,0x1, 0x1f,0x5b, +0x9e,0x8e,0xe7,0xff,0x2e,0x80,0xe0,0x2, 0x1f,0x87,0x17,0x1, 0xaf,0xf, 0x17,0x7e, +0xe0,0x2, 0x1f,0xc0,0xae,0x82,0xe0,0xa, 0xaf,0x3f,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1, +0xe0,0x2, 0x1f,0x5e,0xe0,0xd, 0x8e,0x8e,0xe2,0x0, 0xce,0x81,0xe7,0xfe,0x1, 0x76, +0xe0,0x6, 0x9a,0xae,0xe0,0x6, 0x9a,0x3e,0x11,0x80,0xe7,0xfe,0x2e,0x76,0xf0,0x0, +0x14,0x81,0xe8,0x2f,0x3f,0x89,0xe7,0xfe,0x27,0xf0,0xe0,0x3, 0x1c,0x8, 0x15,0x28, +0x3c,0xe3,0xe0,0x8, 0xdc,0xe1,0xe0,0x2, 0x1c,0x2e,0xe0,0x7, 0x15,0x40,0x3c,0xe3, +0xe0,0x8, 0xdc,0xda,0xe0,0x1, 0x1f,0xad,0xea,0x11,0x7b,0x50,0x8f,0xf, 0xe0,0x1, +0x1f,0xac,0x37,0x28,0x8f,0x8f,0xea,0x11,0x7b,0xce,0x3f,0xce,0xe0,0x2, 0x1f,0x40, +0xf0,0x0, 0x1c,0xf, 0xe0,0xa, 0xa9,0xbe,0x3c,0xe4,0xe0,0x1, 0x1f,0x5b,0xb7,0x8e, +0xe0,0x2, 0x1f,0xb6,0x3c,0x65,0xa9,0x8f,0x17,0x82,0xe8,0x0, 0xaf,0x88,0xb2,0xa2, +0xb2,0x32,0xb2,0xc2,0xb2,0xe2,0xe0,0x1, 0xb2,0x82,0xe0,0x1, 0xb2,0xa2,0xb2,0x52, +0xb2,0x72,0xe0,0x1, 0xb2,0x12,0xe0,0x1, 0xb2,0x32,0xb2,0x86,0xb2,0x7, 0xde,0x1, +0x3c,0xe3,0xf0,0x0, 0xac,0x82,0x3f,0x63,0x3f,0xe3,0xe0,0x41,0x3f,0xcf,0xe2,0x1, +0xc7,0xff,0xe7,0xfe,0x0, 0xde,0x2f,0xbb,0xaf,0x82,0x17,0x7e,0xe0,0x2, 0x1f,0xc0, +0xe0,0xa, 0xaf,0x3f,0xe7,0xfe,0x0, 0xa1,0xe0,0x41,0x3c,0xc9,0xe2,0x1, 0xc4,0xff, +0xe7,0xfe,0x0, 0xd3,0xe0,0x1, 0x1f,0xab,0x9f,0x42,0x8e,0x8f,0xe0,0x1, 0x1f,0xaa, +0xe0,0x1, 0x9e,0x2, 0x8f,0x8f,0x36,0xa8,0x3f,0x2c,0x3f,0xcd,0x3f,0x7f,0xea,0x11, +0x7b,0x50,0xea,0x11,0x7b,0xce,0x2, 0x26,0xe0,0x1, 0x1f,0xa9,0xe0,0x1, 0x9f,0x32, +0x8e,0x8f,0xe0,0x1, 0x1f,0xa8,0x9e,0x72,0x8f,0x8f,0x36,0xa8,0x3f,0x2c,0x3f,0xcd, +0x3f,0x7f,0x2, 0x18,0x97,0x86,0x94,0x87,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29, +0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff,0xe7,0xfe,0x0, 0x95,0xe0,0x1, 0x9c,0xd2, +0xe0,0x1, 0x9c,0x42,0x17,0x84,0xaf,0x82,0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xfb, +0x0, 0xb1,0x97,0x86,0x94,0x87,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff, +0xc7,0xff,0xe3,0xff,0xc4,0xff,0x17,0x3, 0xaf,0x2, 0xe0,0x43,0x3e,0x9f,0xe0,0x43, +0x3f,0x19,0xe0,0x1, 0xb2,0xc2,0xe2,0x1, 0xc7,0xff,0xe0,0x1, 0xb2,0x52,0xe2,0x1, +0xc4,0xff,0xe7,0xfd,0x0, 0xf8,0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe0,0x1, +0xb2,0xc2,0xe2,0x1, 0xc7,0xff,0xe0,0x1, 0xb2,0x52,0xe2,0x1, 0xc4,0xff,0xe7,0xfd, +0x0, 0xea,0x17,0x1, 0xe0,0x2e,0x3e,0xe, 0xe7,0xfe,0x27,0x34,0x3f,0x6f,0xe4,0x0, +0xcf,0x1, 0xe2,0x0, 0xc7,0x1, 0xe7,0xfe,0x27,0x2d,0xe0,0x1, 0x1f,0xdb,0x97,0x8f, +0xb7,0x92,0xe7,0xfd,0x0, 0xa3,0x8, 0xb4,0xe0,0x2, 0x19,0xc0,0xe0,0xa, 0x8f,0x83, +0x27,0x93,0xe0,0x3, 0x19,0x8, 0xde,0x79,0x8f,0x82,0xe2,0x0, 0xcf,0x84,0x1, 0x12, +0xef,0xff,0xd6,0xd0,0x3a,0x68,0x22,0x7, 0xe0,0x2, 0x1f,0xdc,0x17,0x1, 0xe0,0xa, +0xaa,0x33,0xaf,0xf, 0xa, 0x61,0xe0,0x3, 0x1f,0x8, 0xaf,0x8e,0xa, 0x21,0xe7,0xed, +0x0, 0xb7,0x97,0x42,0xe0,0x1, 0x96,0x2, 0xe0,0x1, 0x97,0xb2,0x96,0xf2,0x3f,0x2c, +0x3f,0xad,0xe0,0x1, 0xb7,0x62,0xe0,0x1, 0xb7,0xf2,0xd2,0x7d,0x3a,0x68,0x24,0xc, +0xe2,0x1, 0xca,0x7f,0x17,0x80,0xe0,0x6f,0x39,0xa4,0x3a,0x6f,0x3c,0x64,0xde,0x1f, +0x17,0x80,0xaf,0x82,0x0, 0xd9,0xe0,0x2, 0x1f,0xb6,0xe0,0x2, 0x1c,0x2e,0x8d,0xf, +0x3c,0xe2,0xdb,0x31,0x3a,0x68,0x0, 0xf3,0x8, 0xb4,0xe2,0x0, 0xcc,0x1, 0x39,0xe8, +0x39,0x68,0x17,0x80,0x5, 0x89,0x31,0x41,0xe2,0x0, 0xc9,0x1, 0xc7,0x81,0xe2,0x1, +0xc7,0xff,0x1, 0xfa,0x37,0xc1,0x31,0x3f,0xe4,0x0, 0xc1,0x3, 0x12,0x1, 0x31,0x54, +0x3c,0xe2,0x3c,0x63,0xe0,0x8, 0xdb,0x6f,0x3c,0x12,0x34,0x41,0xe0,0x2, 0x3c,0x22, +0xe0,0x43,0x3f,0x92,0xe0,0x41,0x3f,0x4f,0xe2,0x0, 0xcf,0x80,0xe1,0x2e,0x3f,0x14, +0xe1,0x2f,0x39,0x14,0xe0,0x6f,0x3d,0x2e,0x39,0x68,0x2f,0xeb,0xa, 0x61,0xe0,0x2, +0x1f,0xae,0x34,0x22,0x34,0xa2,0x3c,0x9f,0x3c,0x1f,0x9f,0x88,0x9f,0x9, 0x9c,0x18, +0x3f,0xae,0x9f,0x19,0xe0,0x43,0x3e,0x9f,0xe2,0x0, 0xce,0x80,0x3c,0x2e,0xe0,0x43, +0x3f,0x18,0xe0,0x41,0x3e,0xcd,0xe0,0x6f,0x3d,0x2d,0xe2,0x0, 0xcf,0x0, 0xe0,0x41, +0x3f,0x4e,0xe0,0x68,0x3d,0x2e,0x3f,0xbf,0x3c,0x38,0x3c,0x1f,0xe2,0x0, 0xcc,0x5, +0x2, 0x88,0xe2,0x0, 0xcc,0x2, 0xe0,0xf, 0x34,0x41,0xe0,0x68,0x3b,0xaf,0x38,0x82, +0xe7,0xff,0x0, 0xac,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x1, 0x1f,0xa7, +0x13,0x0, 0xf0,0x0, 0x8e,0xf, 0xe0,0x1, 0x1f,0xa6,0x3a,0x68,0x8f,0x8f,0xf0,0x0, +0x14,0x81,0x7f,0x81,0xf0,0x40,0x3d,0x66,0xf0,0x40,0x3d,0xe6,0xe0,0x0, 0x11,0xa8, +0xe2,0x0, 0xca,0x1, 0xf0,0x0, 0x14,0x0, 0x5, 0xba,0x11,0x1, 0xf8,0x40,0x3e,0xe8, +0xe8,0x40,0x3a,0xe8,0x0, 0x8b,0xe8,0x40,0x3a,0xed,0x3b,0xe8,0xf0,0x40,0x3e,0xe2, +0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x3a,0x72,0x1, 0x2a,0xe8,0x40,0x3c,0xed,0x3c,0x62, +0xdf,0xa7,0x3c,0x73,0xf0,0x40,0x3f,0x68,0x4, 0xf4,0xf7,0xff,0x26,0xee,0x3c,0xe2, +0x3c,0x65,0xdf,0x9e,0xe8,0x8, 0x3c,0x1c,0xe8,0xe, 0x3b,0x9e,0x3f,0x78,0x4, 0xbe, +0xe2,0x0, 0xcb,0x5, 0x17,0x1, 0xe8,0xe, 0x3f,0x18,0xe0,0x0, 0x2, 0xe8,0xe8,0x40, +0x3a,0xed,0xf0,0x40,0x3e,0xe2,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x3a,0x72,0xf0,0x40, +0x3c,0x6e,0xf2,0x1, 0xc4,0x7f,0xe8,0x40,0x3b,0xee,0x1, 0xd8,0xe2,0x0, 0xcb,0x5, +0x3f,0x66,0xe2,0x1, 0xc7,0x7f,0xc1,0x8a,0x2, 0xb3,0xe8,0x40,0x3e,0xe8,0xe8,0x40, +0x3f,0xeb,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe2,0x1, 0xc1,0xff, +0x3, 0x83,0xf8,0x40,0x3c,0x6b,0xe2,0x0, 0xcf,0x5, 0xf8,0x40,0x3d,0xe8,0xf2,0x1, +0xc5,0xff,0xe0,0x0, 0x1, 0x59,0xf2,0x0, 0xcc,0x8c,0x1, 0x27,0xf0,0x0, 0xc4,0x81, +0xc3,0x1, 0xf2,0x1, 0xc4,0xff,0xe7,0xff,0x0, 0x9d,0xe2,0x0, 0xcb,0x5, 0xe8,0x40, +0x3f,0xed,0xe0,0x6f,0x3a,0xa5,0x3a,0xef,0x3f,0xe2,0xe0,0x7e,0x3a,0xa7,0xe8,0x6f, +0x3a,0xad,0xe8,0x40,0x3b,0xee,0xf0,0x40,0x3e,0xef,0xe7,0xff,0x0, 0x9b,0xe2,0x1, +0xc1,0xff,0xf0,0x0, 0x2d,0xaa,0xf0,0x0, 0x2d,0x10,0xf2,0x0, 0xcc,0x8c,0xf8,0x40, +0x3d,0xea,0xf0,0x0, 0x66,0x1, 0x1, 0xdb,0xf2,0x0, 0xcd,0x8a,0x2, 0x95,0xf0,0x0, +0x2d,0xa8,0xf0,0x0, 0x25,0x6, 0xf0,0x0, 0xc5,0x10,0xf2,0x1, 0xc5,0x7f,0xe8,0x40, +0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x0, 0xc5,0x1, 0xf2,0x1, +0xc5,0x7f,0xe7,0xfe,0x0, 0xf7,0xf0,0x0, 0x15,0xf, 0xe8,0x40,0x3c,0x6a,0xc0,0x4, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf2,0x0, 0xcd,0x8b,0xf0,0x0, 0x15,0xf, 0xe8,0x7a, +0x3c,0xab,0xe8,0x40,0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf8,0x40, +0x3d,0x6b,0x0, 0xde,0x11,0xb2,0xe7,0xff,0x0, 0xab,0xf0,0x3, 0x1a,0x8, 0xf8,0x0, +0x9b,0xb4,0xe8,0x1, 0x9c,0xd4,0xe8,0x0, 0x9e,0x44,0xf0,0xa, 0x3b,0xa9,0xf0,0x40, +0x39,0x6a,0xe8,0x1, 0x9f,0x4, 0xf3,0xff,0xc1,0x7f,0xe8,0x43,0x3e,0x92,0xe0,0xf, +0x3e,0x2e,0xe2,0x0, 0xce,0x80,0xe8,0xd, 0x3c,0xa7,0xf8,0x1, 0x9b,0x34,0xf8,0x0, +0x9a,0xf4,0xf0,0x40,0x39,0xef,0xe3,0xff,0xc6,0xff,0xf3,0xff,0xc1,0xff,0xe0,0x72, +0x3d,0x2d,0xe0,0x1, 0x1e,0xa5,0xe8,0x43,0x3d,0x93,0xf8,0x8, 0x3b,0x25,0xe2,0x0, +0xcd,0x80,0x3f,0xe8,0x8d,0x8d,0xe0,0x1, 0x1e,0xa4,0xe3,0xff,0xc7,0xff,0x3f,0x2c, +0xe0,0x43,0x3d,0x1f,0xe3,0xff,0xc7,0x7f,0x8e,0x8d,0xe0,0x73,0x3d,0x2e,0xf8,0xc, +0x3a,0xa6,0xe2,0x0, 0xcd,0x0, 0xe0,0xe, 0x35,0xa8,0xe3,0xff,0xc6,0x7f,0x3f,0x4d, +0xe0,0x6f,0x3d,0x2c,0xf0,0x40,0x39,0xfe,0x14,0x0, 0xe0,0x0, 0x3, 0xd2,0xe0,0x1, +0x1f,0x23,0xe0,0x1, 0x1e,0xa2,0x8f,0xe, 0x8e,0x8d,0x37,0x28,0x3f,0x4d,0xe1,0x2d, +0x3f,0x9e,0xe0,0x0, 0x26,0xc5,0xe9,0x2f,0x3f,0x93,0xe0,0x0, 0x27,0xc1,0xe8,0x0, +0x8c,0x14,0x2c,0x3d,0xe0,0x1, 0x1f,0xad,0xe0,0x1, 0x1e,0xa1,0x8d,0x8f,0xe0,0x1, +0x1f,0xa0,0x8e,0x8d,0x8e,0xf, 0xe0,0x1, 0x1f,0xac,0x36,0x28,0x8f,0x8f,0x35,0xa8, +0x3e,0xcc,0x3f,0xcb,0xe8,0x0, 0x9e,0x14,0xe0,0xd, 0x3f,0xad,0x3e,0x7d,0x5, 0x28, +0xe0,0x1, 0x1e,0x9f,0x8d,0x8d,0xe0,0x1, 0x1e,0x9e,0x35,0xa8,0x8e,0x8d,0x3e,0xcb, +0x3f,0xad,0xe0,0x2f,0x3f,0x9c,0x27,0x9c,0xf1,0x2f,0x39,0x1e,0x27,0x99,0xe0,0x1, +0x1f,0x9d,0xe0,0x1, 0x1f,0x1c,0x8f,0x8f,0x8f,0xe, 0xf0,0x40,0x3b,0xf9,0x37,0xa8, +0x3f,0x4f,0x3, 0x8f,0xf8,0xf, 0x3b,0xa5,0x3f,0xfe,0x3, 0xa, 0xf0,0xf, 0x3b,0x29, +0x3f,0x7f,0x17,0xa3,0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe8,0xf, 0x3c,0xa5,0x3f,0xfe,0x3, 0x7c,0xf8,0xf, 0x3b,0x27,0x3f,0x7f,0x17,0xa2, +0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0xe0,0x3, 0x1e,0x8, 0xf0,0x0, 0x9b,0xac, +0xf0,0x1, 0x9a,0xcc,0xf0,0x0, 0x9a,0x4c,0xf0,0x1, 0x9b,0xc, 0xf8,0xd, 0x3b,0xa5, +0xe3,0xff,0xc6,0xff,0xe0,0x43,0x3f,0x1d,0xf8,0xf, 0x3a,0x26,0xe2,0x0, 0xcf,0x0, +0xe3,0xff,0xc7,0xff,0xf8,0xa, 0x3a,0xa7,0xe0,0x43,0x3c,0x9f,0xe0,0x1, 0x9c,0x3c, +0x9d,0xfc,0xe3,0xff,0xc5,0x7f,0xe0,0x6d,0x3d,0x2a,0xe2,0x0, 0xcc,0x80,0xf8,0xa, +0x3b,0x24,0xe0,0xe, 0x3c,0x2b,0xe3,0xff,0xc5,0x7f,0xe0,0x1, 0x1c,0x9b,0xe3,0xff, +0xc7,0x7f,0xe0,0x6f,0x3d,0x2a,0xe0,0x1, 0x1d,0x1a,0xf0,0x43,0x39,0x9e,0x8c,0x89, +0x3d,0xa8,0xf2,0x0, 0xc9,0x80,0x8d,0xa, 0xe3,0xff,0xc5,0xff,0x34,0xa8,0xe0,0x6e, +0x3d,0x2b,0xe0,0xb, 0x3d,0x49,0xe1,0x2b,0x3d,0x9e,0xe0,0x0, 0x25,0xcd,0xe1,0x2f, +0x3f,0x9e,0xe0,0x0, 0x27,0xc9,0x8c,0x1c,0xe0,0x0, 0x2c,0x46,0xe0,0x1, 0x1f,0xad, +0x9e,0x1c,0x8d,0xf, 0xe0,0x1, 0x1f,0x99,0x35,0x28,0x8d,0x8f,0xe0,0x1, 0x1f,0xac, +0x35,0xa8,0x8f,0xf, 0xe0,0x1, 0x1f,0x98,0x3f,0x4a,0x8f,0x8f,0x3f,0xcb,0xe0,0xf, +0x3f,0x2f,0x3e,0x7f,0x5, 0x31,0xe0,0x1, 0x1f,0x97,0x8d,0x8f,0xe0,0x1, 0x1f,0x96, +0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3f,0x2f,0x3e,0x7e,0x3, 0x26,0xe0,0x1, 0x1f,0x95, +0x8f,0xf, 0xe0,0x1, 0x1f,0x94,0x37,0x28,0x8f,0x8f,0x3f,0xce,0x3e,0xff,0x5, 0x9c, +0xe0,0x1, 0x1f,0x9d,0xf8,0x40,0x3b,0xf5,0x8f,0xf, 0xe0,0x1, 0x1f,0x9c,0x37,0x28, +0x8f,0x8f,0x3f,0xce,0x37,0xc1,0x5, 0x91,0xf8,0x16,0x3a,0xa6,0xf0,0x40,0x3b,0x7f, +0x3, 0xb, 0xf8,0x17,0x3a,0x27,0xe8,0x40,0x3f,0xf7,0x17,0xa0,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82,0xf8,0x17,0x3b,0xa6,0xf0,0x40,0x3b,0xff, +0x3, 0x7b,0xf8,0x15,0x3a,0x25,0xe8,0x40,0x3f,0xf5,0x17,0xa1,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0x8, 0xb1,0xe0,0x2, 0x1f,0xb6,0x84,0xf, 0xc4,0x7f,0xe2,0x1, +0xc4,0x7f,0xdd,0xe9,0x17,0x80,0x2c,0xc, 0xde,0xb1,0x3f,0xe8,0x2c,0x9, 0xdf,0x55, +0xe2,0x0, 0xcc,0x0, 0xe0,0x1, 0x17,0x7f,0xe0,0x6e,0x39,0xa8,0x3f,0xee,0x3c,0x6f, +0x8, 0xe1,0xe0,0x2, 0x1f,0x91,0xe6,0x1, 0x16,0xff,0xa7,0x8f,0x34,0x28,0xa7,0x5f, +0x3f,0x5d,0xbf,0x5f,0xa7,0x5f,0x3c,0x4e,0xbc,0x5f,0x38,0x82,0xe0,0x2, 0x1e,0xfd, +0xe0,0x3, 0x1f,0x13,0x8f,0xdd,0x8e,0x4d,0xe0,0x2, 0x1e,0x93,0x3f,0xbc,0x37,0xa1, +0xb7,0x8e,0x9f,0x8e,0x37,0xc9,0xe0,0x3, 0xaf,0xcd,0x9f,0x8e,0x37,0xc1,0xe0,0x3, +0xaf,0xdd,0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x19,0x13,0xe0,0x6, 0x8c,0x12,0xe0,0x6, +0x8c,0xa2,0xe0,0x2, 0xd7,0x4f,0xe4,0x8, 0x34,0x21,0xe0,0x3, 0x9f,0xc2,0xe4,0x8, +0x34,0x40,0x3c,0x7f,0x3, 0x88,0xe0,0x1, 0x1f,0x4f,0xe0,0x3, 0xb4,0x42,0x9f,0x8e, +0xcf,0xa0,0xb7,0x8e,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x20, +0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0x37,0x28,0xe0,0x2, 0x19,0x13, +0x3c,0x4e,0x17,0x81,0xaf,0xc2,0xe0,0x7, 0xd3,0x42,0x14,0x1, 0xe0,0x4, 0xd0,0xa2, +0xe0,0x2, 0x1f,0xfd,0xe0,0x19,0x16,0x9d,0x17,0x7, 0x3e,0x9f,0xaf,0xd, 0xe0,0x19, +0xc7,0x9e,0xaf,0xf, 0xe0,0x1, 0xd8,0x2b,0x17,0x82,0xaf,0xc2,0x9, 0x61,0xe0,0x3, +0x1f,0x38,0xe0,0x3, 0x1f,0x9d,0xa6,0xe, 0x15,0xfe,0xa6,0xcc,0x97,0xf, 0xe2,0x0, +0xc6,0x81,0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0xfd,0xa6,0xcc,0x97,0xf, 0x36,0xc9, +0xe2,0x0, 0xc6,0x82,0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0x77,0x97,0xf, 0x3d,0xe8, +0xe3,0xff,0xc7,0x7b,0xb7,0xf, 0xe7,0xff,0x17,0x10,0xa6,0x4c,0x96,0x8f,0x3f,0x18, +0x36,0x4c,0xe2,0x0, 0xc6,0x8, 0x3e,0xda,0xe2,0x1, 0xc7,0x7f,0x3e,0xcc,0xe2,0x0, +0xcf,0xd, 0xb6,0x8f,0x9e,0x8f,0x2, 0x89,0xea,0x49,0x7f,0xd8,0xe9,0xff,0xc7,0xff, +0x37,0x22,0x3f,0x1f,0xa7,0x8e,0x3f,0x82,0xe0,0x1, 0x14,0x7f,0x38,0x82,0x3c,0x6d, +0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x8, 0x36,0xc8,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0xa7,0x8f,0xe0,0x1, 0xa4,0x7f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x2, 0x1f,0x91, +0xa7,0x8f,0xa4,0x5f,0x34,0x48,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x2, 0x1e,0x9a, +0x16,0x1, 0x8f,0xd, 0xe0,0x2, 0x1f,0x93,0x3e,0x1e,0xae,0xd, 0xe0,0x1, 0x1e,0xd6, +0x3e,0x9e,0xe0,0x4, 0x8f,0x4f,0x8c,0xd, 0xc7,0x1, 0xe0,0x4, 0xaf,0x4f,0xe0,0x4, +0x8f,0x4f,0x2f,0x6, 0xe0,0x4, 0x8f,0x3f,0xc7,0x1, 0xe0,0x4, 0xaf,0x3f,0xe2,0x0, +0xcd,0xfd,0x1, 0xcd,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x7c,0xaf,0xf, 0x38,0x82, +0x8, 0xb1,0x2c,0x17,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x1, 0x48,0x3c,0x69,0xe0,0x4, 0xd9,0x33,0xe0,0x1, 0x1f,0xcf,0x9f,0x8f,0x27,0x88, +0xe0,0x2, 0x1f,0x13,0xe0,0x1, 0x8f,0xee,0xcf,0x82,0xe0,0x1, 0xaf,0xee,0x8, 0xe1, +0xe2,0x0, 0xcc,0xf, 0x1, 0x3b,0xe2,0x0, 0xcc,0x12,0xe0,0x0, 0x1, 0x52,0xe2,0x0, +0xcc,0x13,0xe0,0x0, 0x1, 0x53,0xe2,0x0, 0xcc,0x11,0x1, 0x3e,0xe2,0x0, 0xcc,0x1, +0xe0,0x2, 0x1, 0x1b,0xe2,0x0, 0xcc,0x9, 0xe0,0x2, 0x1, 0x35,0xe2,0x0, 0xcc,0x5b, +0xe0,0x0, 0x5, 0xce,0xe7,0xff,0x17,0x94,0x3f,0x98,0xe2,0x0, 0xcf,0x81,0xe0,0x2, +0x5, 0xdb,0xe7,0xff,0x17,0x92,0x3f,0x98,0xe2,0x0, 0xcf,0x81,0xe0,0x3, 0x5, 0xb9, +0xe7,0xff,0x17,0x90,0xe0,0xf, 0x3f,0x98,0xe2,0x0, 0xcf,0x8f,0xe0,0x2, 0x2, 0xe8, +0xe2,0x0, 0xcc,0x7b,0xe0,0x3, 0x1, 0x5e,0xe0,0x1, 0x1f,0xcf,0x0, 0xc0,0xe0,0x2, +0x1f,0xe6,0x8f,0x8f,0xe7,0xff,0x2f,0xb7,0x8, 0xe1,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0x93,0x17,0x1, 0xe0,0x1, 0xaf,0x7f, +0xe0,0x2, 0xaf,0xf, 0x8, 0xe1,0xe2,0x0, 0xcc,0x81,0x1, 0x29,0xe7,0xff,0x2c,0xb1, +0xe0,0x1, 0x1f,0xf2,0xa7,0xf, 0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x8, 0xe1,0xe0,0x2, +0x1f,0x93,0xe0,0x2, 0xac,0xaf,0x8, 0xe1,0xe0,0x2, 0x1f,0x93,0xe0,0x2, 0xac,0xbf, +0x8, 0xe1,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x2f,0xdf,0x8, 0xe1,0xe2,0x0, 0xcc,0x30, +0xe0,0x1, 0x1, 0x6f,0xe2,0x0, 0xcc,0x53,0x2, 0x98,0xea,0x4a,0x7f,0x90,0xe9,0xff, +0xc7,0xff,0xe0,0xe, 0x34,0x22,0x3f,0x9e,0xa7,0x8f,0x3f,0x82,0xe0,0x2, 0x1f,0x93, +0xe0,0x2, 0x8f,0x1f,0xe7,0xff,0x2f,0x5, 0xe0,0x2, 0xac,0x9f,0xe7,0xff,0x16,0x80, +0x87,0xf, 0x3f,0x4d,0xaf,0xf, 0x8, 0xe1,0xe0,0x0, 0x1f,0xb0,0x3e,0xe8,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x62,0x17,0xf8,0xe0,0x2, 0x1f,0x13,0x3f,0x98, +0xe2,0x1, 0xc7,0xff,0x3e,0x9e,0xe2,0x0, 0xcf,0xaf,0xac,0x8d,0x2, 0x89,0xea,0x4c, +0x7e,0xe0,0xe9,0xff,0xc6,0xff,0x37,0xa2,0x3f,0x9d,0xa7,0x8f,0x3f,0x82,0xe0,0x1, +0x1f,0xcf,0x17,0x48,0x3f,0x18,0xe2,0x0, 0xcf,0x1e,0xe0,0x2, 0x5, 0x99,0xe2,0x0, +0xcc,0x57,0xe0,0x2, 0x5, 0x99,0x9f,0xf, 0xe0,0x4, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfe, +0x0, 0xc7,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x8, 0xb7,0xf, 0xe7,0xfe,0x0, 0xc0, +0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x4, 0xb7,0xf, 0xe7,0xfe,0x0, 0xb9,0xe0,0x4, +0x87,0xbe,0xe0,0x2, 0x1f,0x1a,0xe0,0x1, 0x1f,0xcf,0xac,0x8e,0xe7,0xfe,0x0, 0xb0, +0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xe0,0x40,0xcf,0x0, 0xb7,0xf, 0x0, 0xd3,0xe0,0x1, +0x1f,0xcf,0x9f,0xf, 0xe0,0x80,0xcf,0x0, 0xb7,0xf, 0x0, 0xcc,0xe0,0x3, 0x8f,0xce, +0xe0,0x3, 0x1f,0x13,0x37,0xa8,0x3f,0x99,0x37,0xa1,0xb7,0x8e,0xe0,0x1, 0x1f,0xcf, +0xe7,0xfe,0x0, 0x96,0xe0,0x3, 0x8f,0xae,0xe0,0x2, 0x1f,0x72,0x37,0xa8,0x3f,0x99, +0x37,0xa1,0xb7,0x8e,0x97,0xe, 0xe0,0x0, 0x1f,0xc8,0xb7,0xf, 0xe7,0xfe,0x0, 0xc6, +0xe0,0x3, 0x8f,0x8e,0x37,0xa8,0x3c,0x9f,0xe0,0x3, 0x1f,0x89,0xb4,0x8f,0xe0,0x1, +0x1f,0xcf,0xe7,0xfd,0x0, 0xfd,0xe0,0x1, 0x1f,0xdc,0x15,0xfb,0xa6,0xf, 0xe0,0x1, +0x1f,0xcf,0xa7,0x4c,0xa6,0xcc,0x37,0x42,0xe2,0x0, 0xc7,0x1, 0xe4,0x0, 0xcf,0x1, +0x37,0x22,0x3e,0xdb,0x3f,0x4d,0xbf,0x4c,0xe7,0xfd,0x0, 0xea,0xe0,0x1, 0x1f,0xcf, +0x9f,0xf, 0xcf,0x2, 0xb7,0xf, 0xe7,0xfd,0x0, 0xe3,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, +0xcf,0x1, 0xb7,0xf, 0xe7,0xfd,0x0, 0xdc,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xe0,0x2, +0xcf,0x0, 0xb7,0xf, 0xe7,0xfe,0x0, 0xff,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x10, +0xb7,0xf, 0xe7,0xfd,0x0, 0xcd,0xe0,0x2, 0x1f,0x8d,0x8f,0x8f,0x2f,0x87,0xe0,0x1, +0x1f,0xf2,0xa7,0xf, 0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x17,0x0, 0xe0,0x3, 0x1f,0x93, +0xe0,0x2, 0x1e,0x93,0xb7,0xf, 0xe2,0x1, 0xcc,0xad,0xac,0x9d,0xe7,0xff,0x1, 0x2f, +0xe2,0x1, 0xcc,0xae,0xe7,0xfd,0x1, 0xf2,0xdd,0xe2,0xe0,0x1, 0x1f,0xcf,0xe7,0xfd, +0x0, 0xaf,0xe2,0x0, 0xcc,0x85,0xe7,0xfd,0x2, 0xb4,0xe0,0x2, 0x1f,0x13,0xe0,0x1, +0xac,0x9e,0xe0,0x0, 0x2c,0xfb,0xe0,0x2, 0xac,0xde,0xe7,0xfd,0x0, 0xdf,0xe0,0x2, +0x1f,0x13,0xe0,0x6, 0x8f,0x8e,0xe0,0x2f,0x3c,0x8f,0xe7,0xfd,0x2f,0xa2,0x17,0x82, +0xe1,0x2f,0x3c,0x9f,0xe7,0xfd,0x2f,0x9d,0xe0,0x0, 0x1f,0xb0,0x16,0xb0,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0xd3,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0xe7,0xfe, +0x2f,0x9d,0xe2,0x0, 0xcc,0x4, 0xe7,0xfd,0x1, 0xc, 0xe2,0x0, 0xcc,0x30,0xe7,0xfe, +0x1, 0x95,0x8, 0xe1,0xe0,0x1, 0x1f,0xcf,0xe0,0x0, 0x1e,0x48,0x9f,0xf, 0x15,0x81, +0xe0,0x1, 0xcf,0x0, 0xb7,0xf, 0xe2,0x0, 0xcc,0x6d,0xe0,0x3, 0x1f,0x15,0x9e,0x8c, +0xa7,0xe, 0x3d,0x9d,0xb5,0x8c,0x3f,0x1d,0xac,0x8e,0xe7,0xfc,0x1, 0xe9,0xe0,0x1, +0x1f,0x58,0xe0,0x0, 0x16,0xec,0xae,0x8e,0xe7,0xfc,0x0, 0xe2,0xe2,0x1, 0xcc,0x6, +0xe0,0x0, 0x1, 0x7e,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x11,0xe2,0x1, 0xcc,0x8, +0xe7,0xfd,0x1, 0x14,0xe2,0x1, 0xcc,0xb, 0xe0,0x1, 0x1, 0x23,0xe2,0x1, 0xcc,0xc, +0xe0,0x1, 0x1, 0x33,0xe2,0x1, 0xcc,0xd, 0xe0,0x1, 0x1f,0xcf,0xe7,0xfc,0x1, 0xc8, +0xe0,0x3, 0x1f,0x38,0x16,0x60,0xa6,0x8e,0xe2,0x0, 0xc4,0x9f,0xe0,0x1, 0xa7,0x5d, +0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x5d,0xe7,0xfc,0x0, 0xba,0x17,0x1, 0x3f,0x58, +0xe0,0x0, 0x2f,0x4b,0xe2,0x0, 0xcc,0xa, 0xe7,0xfc,0x1, 0xb2,0x9f,0xf, 0xe0,0x8, +0xcf,0x0, 0xb7,0xf, 0xe7,0xfc,0x0, 0xac,0xe2,0x0, 0xcc,0x82,0xe0,0x0, 0x1, 0x58, +0xe0,0x1, 0x17,0xfd,0x3f,0xd9,0xe2,0x0, 0xcf,0x81,0x1, 0x6, 0xe2,0x0, 0xcc,0x84, +0xe7,0xfc,0x1, 0xdc,0x17,0x82,0xe0,0x2, 0xaf,0xde,0xe7,0xfc,0x0, 0xd7,0xe0,0x1, +0x1f,0xcf,0xe0,0x2, 0x1e,0x93,0x9f,0xf, 0xcf,0x40,0xb7,0xf, 0xe0,0x3, 0x8f,0xd, +0xe0,0x3, 0x8d,0x9d,0xe0,0x3, 0x8e,0x1d,0x37,0x28,0xc6,0x1, 0xe0,0x3, 0xae,0x1d, +0x3f,0x1b,0xe0,0x3, 0x8e,0x1d,0xe3,0xff,0xc7,0x7f,0x2e,0x6, 0xe0,0x3, 0x8e,0xd, +0xc6,0x1, 0xe0,0x3, 0xae,0xd, 0xe2,0x0, 0xcc,0x6f,0xe0,0x3, 0x1e,0x9b,0xa6,0x8d, +0x3f,0x1d,0xac,0x8e,0xe7,0xfb,0x1, 0xf4,0xe0,0x1, 0x1f,0x58,0xe0,0x0, 0x16,0xee, +0xae,0x8e,0xe7,0xfb,0x0, 0xed,0x9f,0xf, 0xcf,0x20,0xb7,0xf, 0xe7,0xfb,0x0, 0xe8, +0x3c,0x69,0xdd,0x8, 0xe0,0x1, 0x1f,0xcf,0xe7,0xfb,0x0, 0xe2,0xe0,0x1, 0x1f,0xdc, +0x16,0x78,0xa6,0x8f,0xe2,0x0, 0xc4,0x87,0xe0,0x1, 0xa7,0x2d,0xe0,0x1, 0x1f,0xcf, +0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x2d,0xe7,0xfb,0x0, 0xd2,0x16,0x83,0xe0,0x2, +0xae,0xde,0xe0,0x1, 0x1f,0xcf,0xe7,0xfb,0x0, 0xcb,0xe0,0x1, 0x1f,0xdc,0x17,0x3, +0xa6,0x8f,0x3f,0x59,0xe0,0x1, 0xa7,0xad,0xe7,0x9f,0x16,0x7f,0x37,0x2c,0x3f,0xdc, +0x3f,0xce,0xe0,0x1, 0xbf,0xad,0xe7,0xfb,0x0, 0xf9,0xe0,0x6, 0xac,0x8e,0xe0,0x1, +0x1f,0xcf,0x9f,0xf, 0xe1,0x0, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfb,0x0, 0xb1,0xe0,0x1, +0x1f,0xdc,0x15,0xe0,0xa7,0xf, 0x16,0x9f,0xe0,0x1, 0xa6,0x3e,0x3e,0xd9,0x3e,0x5b, +0xe0,0x1, 0xbe,0x3e,0xe0,0x1, 0xa6,0x3e,0xe0,0x1, 0x1f,0xcf,0x3e,0xcc,0xe0,0x1, +0xbe,0xbe,0xe7,0xfb,0x0, 0x9d,0xe0,0x3, 0x1f,0x8d,0x3c,0x69,0xac,0x8f,0xe0,0x2, +0xd1,0x75,0xe7,0xfb,0x0, 0xd3,0xe2,0x0, 0xcc,0x5b,0x3f,0xe8,0xe0,0x0, 0x5, 0xf4, +0xe7,0xff,0x17,0x16,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xf2,0xe0,0x0, +0x17,0x64,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x8c, +0xe7,0xff,0x17,0x12,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x99,0xe7,0xff, +0x17,0x14,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xea,0xe7,0xff,0x17,0x18, +0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xc3,0xe0,0x0, 0x17,0x77,0x3f,0x18, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xe0,0xe7,0xff,0x17,0x10, +0x3f,0x18,0xe2,0x0, 0xcf,0xf, 0xe0,0x1, 0x5, 0xee,0xe0,0x0, 0x17,0x7f,0x3f,0x18, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x8c,0xe2,0x1, 0xcc,0x6, +0xe0,0x1, 0x1, 0x63,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x6f,0xe2,0x1, 0xcc,0x8, +0xe0,0x2, 0x1, 0x3, 0xe2,0x1, 0xcc,0xb, 0xe0,0x2, 0x1, 0x1, 0xe2,0x1, 0xcc,0xc, +0xe0,0x2, 0x1, 0x5, 0xe2,0x1, 0xcc,0xd, 0xe0,0x2, 0x1, 0x5, 0xe0,0x0, 0x17,0x70, +0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x4, 0xe0,0x1, 0x2, 0xdf,0xe2,0x1, +0xcc,0x12,0xe0,0x2, 0x1, 0x12,0xe0,0x1, 0x5, 0xfe,0xe2,0x1, 0xcc,0x13,0xe0,0x2, +0x1, 0x2, 0xe2,0x1, 0xcc,0x14,0xe0,0x2, 0x1, 0x83,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, +0x8c,0x7f,0x38,0x82,0xe0,0x2, 0x1f,0x13,0x3f,0x9e,0x8c,0xf, 0x38,0x82,0xe0,0x3, +0x1e,0x13,0xe0,0x2, 0x1f,0x63,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, +0xcf,0xeb,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0x3e,0x38,0x82,0xe0,0x2, 0x1e,0x72, +0xe0,0x3, 0x1f,0x15,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, 0xcf,0xed, +0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xf2,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6c, +0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x17,0xe0,0x0, 0x1f,0x4a,0x9e,0x8c,0xa7,0xe, +0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x9d,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xde, +0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x1c,0xaf,0xf, 0x38,0x82,0xe0,0x3, 0x1e,0x9, +0xe0,0x3, 0x1f,0x1b,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, 0xcf,0xef, +0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xca,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6e, +0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6a,0xaf,0xf, 0x38,0x82, +0xe0,0x2, 0x1f,0x13,0x16,0x60,0xe0,0x2, 0x8e,0xfe,0x3e,0x1d,0xe2,0x0, 0xce,0x1f, +0xe0,0x0, 0x2, 0xdb,0xe0,0x1, 0x1e,0x53,0x3e,0x9c,0xe0,0x44,0x8c,0xd, 0xe0,0x2, +0x8e,0xfe,0xe2,0x1, 0xcf,0x82,0xc6,0x81,0xe0,0x2, 0xae,0xfe,0xe7,0xff,0x1, 0xa7, +0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x1, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x72, +0xe0,0x3, 0x1f,0x15,0x9e,0x8c,0xa7,0xe, 0xe1,0xff,0x15,0xfe,0x3d,0xdd,0x3f,0x1b, +0x97,0xe, 0xe2,0x0, 0xc6,0x81,0xc7,0x1, 0xe3,0xff,0xc7,0x7f,0xe2,0x0, 0xce,0x80, +0x9d,0x8c,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0x37,0x48,0x16,0x81,0x3e,0x9b,0xe0,0x68, +0x39,0x2e,0xe2,0x0, 0xcf,0xe9,0xb6,0x8c,0xe7,0xff,0x1, 0x81,0xe0,0x1, 0x1f,0xd8, +0xe0,0x0, 0x17,0x68,0xaf,0xf, 0x38,0x82,0xe0,0x0, 0x1e,0x43,0xe0,0x2, 0x1f,0x25, +0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x8a,0xb5,0x8c,0x3f,0x1d, +0x8c,0xe, 0xe7,0xfe,0x1, 0xec,0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x9, 0xaf,0xf, +0x38,0x82,0xe7,0xf7,0x0, 0xee,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f,0xe0,0x1, 0xa4,0x2f, +0xe2,0x0, 0xc4,0x7, 0x38,0x82,0xe0,0x2, 0x8e,0x7e,0xe0,0x1, 0x1e,0xc2,0x3e,0x9c, +0x8c,0xd, 0xe7,0xff,0x0, 0xa6,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f,0xe0,0x1, 0xa4,0x2f, +0x34,0x4c,0xe2,0x0, 0xc4,0x3, 0x38,0x82,0xe2,0x1, 0xcf,0xfe,0x14,0x0, 0xe7,0xfe, +0x1, 0xc6,0xe0,0x2, 0x1f,0xc8,0x17,0x5, 0x8f,0x8f,0x3f,0x3f,0xe0,0x3, 0x1f,0xb0, +0x3f,0x9e,0x8c,0xf, 0x38,0x82,0x14,0x0, 0x38,0x82,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f, +0xe0,0x1, 0xa4,0x3f,0xe2,0x0, 0xc4,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0x8d,0x8c,0xf, +0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x1, 0xa4,0x5f,0xe2,0x0, 0xc4,0x1f, +0x38,0x82,0xe2,0x1, 0xcc,0x11,0x1, 0x8b,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x4f, +0x38,0x82,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x6f,0x38,0x82,0xe0,0x1, 0x1f,0xd6, +0xe0,0x2, 0x8c,0x3f,0x38,0x82,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x5f,0x38,0x82, +0x8, 0xb3,0xe0,0x2, 0x19,0x13,0xe0,0x2, 0x19,0xfd,0xe0,0x3, 0x8f,0xe2,0xe0,0x1, +0x8f,0x3, 0x3f,0x7f,0x1, 0x16,0xe0,0x3, 0x8f,0xe2,0xe0,0x1, 0x8c,0x93,0xe2,0x0, +0xc7,0xbf,0xe0,0x3, 0xaf,0xe2,0xe0,0x3, 0x8f,0xe2,0x3c,0x6f,0xe0,0x1, 0xaf,0x83, +0xe0,0x3, 0xd1,0x2e,0xe0,0x2, 0x1f,0xe6,0x87,0x8f,0xe2,0x0, 0xc7,0x81,0x2f,0xa2, +0xe0,0x3, 0x8f,0xf2,0xe0,0x1, 0x8f,0x13,0x3f,0x7f,0x1, 0x16,0xe0,0x3, 0x8f,0xf2, +0xe0,0x1, 0x8c,0x3, 0xe2,0x0, 0xc7,0xbf,0xe0,0x3, 0xaf,0xf2,0xe0,0x3, 0x8f,0xf2, +0x3c,0xef,0xe0,0x1, 0xaf,0x93,0xe0,0x3, 0xd1,0x13,0xe0,0x2, 0x1f,0xe6,0x87,0x8f, +0xe2,0x0, 0xc7,0x81,0x27,0x82,0x9, 0xe1,0xe0,0x1, 0x8c,0x13,0x9, 0xa1,0xe0,0xe, +0x0, 0x9f,0xe0,0x1, 0x8c,0x3, 0xd7,0x1b,0x0, 0xdc,0x8, 0xb2,0xe0,0x2, 0x1f,0x93, +0x16,0x85,0xe0,0x5, 0x8f,0x1f,0x3e,0xb8,0xe0,0x3, 0x1f,0xb0,0x39,0x68,0x3f,0x9d, +0x8c,0x3f,0xe0,0x3, 0x1f,0x8e,0x3c,0xee,0x3f,0x92,0xaf,0xf, 0xe0,0x7, 0xd9,0x75, +0xe2,0x0, 0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0x14,0x80,0x14,0x3, 0xe0,0x7, 0xd9,0x6d, +0x14,0x80,0x14,0x4, 0xe0,0x7, 0xd9,0x69,0x14,0x80,0x14,0x0, 0xe0,0x7, 0xd9,0x65, +0x9, 0x61,0x8, 0xb5,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0xaf,0x3a,0x68,0xe0,0x3, +0x34,0x23,0x8c,0x32,0xaa,0x2, 0x3c,0xe3,0xe0,0x7, 0xd9,0xd1,0xc1,0x5, 0x39,0x75, +0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xca,0x3c,0xe3,0x14,0x4, 0xa, 0xa1, +0xe0,0xf3,0x0, 0xc5,0x8, 0xb5,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0xaf,0x3a,0x68, +0xe0,0x3, 0x34,0x23,0x8c,0x32,0xaa,0x12,0x3c,0xe3,0xe0,0x7, 0xd9,0xdb,0xc1,0x5, +0x39,0x75,0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xd4,0x3c,0xe3,0x14,0x4, +0xa, 0xa1,0xe0,0xf3,0x0, 0xcf,0x8, 0xb4,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0x2f, +0x39,0xe8,0x8c,0x32,0xa9,0xa2,0x3d,0x63,0x3c,0xe3,0xe0,0x7, 0xd9,0xe8,0xc1,0x5, +0x39,0x74,0x1, 0xf8,0x3d,0x63,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xe0,0x3d,0x63, +0x3c,0xe3,0x14,0x4, 0xa, 0x21,0xe0,0xf3,0x0, 0xda,0x8, 0xb2,0xe0,0x0, 0x1f,0xcd, +0x39,0x68,0x8f,0x8f,0x2f,0xa2,0xe0,0x2, 0x1f,0x93,0x16,0x85,0xe0,0x3, 0x9f,0x4f, +0x3e,0xb2,0xe0,0x3, 0x1f,0xb0,0xe2,0x1, 0xc7,0x7f,0x3f,0x9d,0x8c,0x3f,0x3c,0xee, +0xaf,0x4f,0xe0,0x7, 0xd8,0xd7,0xe2,0x0, 0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0x14,0x8a, +0x14,0x3, 0xe0,0x7, 0xd8,0xcf,0x14,0x8a,0x14,0x4, 0xe0,0x7, 0xd8,0xcb,0x14,0x85, +0x14,0x0, 0x9, 0x21,0xe0,0xf1,0x0, 0xc6,0xda,0x7e,0x0, 0xde,0x16,0x83,0xe0,0x2, +0x1f,0xc4,0x3e,0xb8,0xe0,0x2, 0x1f,0x13,0xe0,0xc, 0x3f,0x9d,0xe0,0x4, 0x8d,0x8e, +0x8d,0xc, 0x3d,0x7b,0x1, 0x4, 0xe0,0x4, 0x8d,0x8e,0xad,0x8c,0xe0,0xc, 0x3f,0x9d, +0xe0,0x4, 0x8d,0x9e,0x8d,0x1c,0x3d,0x7b,0x1, 0x4, 0xe0,0x4, 0x8d,0x9e,0xad,0x9c, +0x3f,0x9d,0x8e,0x2f,0xe0,0x4, 0x8e,0xae,0x3e,0x7d,0x1, 0x4, 0xe0,0x4, 0x8f,0x2e, +0xaf,0x2f,0xe0,0x10,0x0, 0x8b,0x8, 0xb3,0xe0,0x3, 0x1f,0x38,0xe0,0x2, 0x19,0x48, +0xa7,0x8e,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x86,0x8f,0x82,0xe2,0x0, 0xcf,0x82, +0x1, 0x2, 0x17,0x81,0xe0,0x0, 0x19,0xcd,0xaf,0x82,0xaf,0x83,0x8c,0x82,0x24,0x94, +0xe2,0x0, 0xcc,0x82,0x1, 0x89,0xa7,0x8e,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x83, +0xac,0x82,0xac,0x83,0x9, 0xe1,0x14,0x81,0x14,0x0, 0xe0,0x0, 0xd8,0x1c,0x17,0x81, +0xaf,0x82,0xaf,0x83,0x9, 0xe1,0x3c,0x69,0x9, 0xa1,0xe0,0x10,0x0, 0x94,0x0, 0x0, +0x8, 0xb3,0xe0,0x1, 0x1f,0xf2,0xe0,0x2, 0x19,0x13,0xa6,0x8f,0xe0,0x2, 0x1f,0x63, +0xe0,0x2, 0x8f,0xd2,0xbe,0x8e,0xe0,0x0, 0x27,0xfd,0xe0,0x2, 0x8f,0xd2,0xe2,0x0, +0xcf,0x81,0xe0,0x0, 0x1, 0x77,0xe0,0x2, 0x8f,0xd2,0xe0,0x2, 0x19,0xc8,0xe2,0x0, +0xcf,0x83,0x1, 0x86,0xe0,0x3, 0x1f,0x33,0xe0,0x3, 0x1f,0x9b,0xbf,0xf, 0x16,0x0, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8f,0x2e,0xe2,0x0, +0xc7,0x81,0xe0,0x3, 0x1e,0x89,0x3f,0x7f,0xb6,0xd, 0xe0,0x0, 0x1, 0x69,0xe0,0x2, +0x1f,0x79,0xe0,0x3, 0x1f,0x95,0xbf,0xf, 0x16,0x0, 0x8f,0x3, 0xe0,0x3, 0x1f,0xb0, +0xe4,0x0, 0xc7,0x5, 0x3f,0x1f,0x87,0xe, 0xe0,0x6, 0xaf,0x12,0x8f,0x3, 0xe4,0x0, +0xc7,0x5, 0x3f,0x1f,0x87,0x1e,0xe0,0x6, 0xaf,0x22,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, +0x3f,0x1f,0x87,0x2e,0xe0,0x6, 0xaf,0x42,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, 0x3f,0x1f, +0x87,0x3e,0xe0,0x6, 0xaf,0x52,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, 0x3f,0x9e,0x8f,0xcf, +0xe0,0x3, 0xb7,0xc2,0x17,0x80,0xe0,0x6, 0xaf,0xb2,0xe0,0x3, 0xb6,0x32,0x8f,0x3, +0xe0,0x3, 0x1f,0x8e,0x8c,0x3, 0x3f,0x9e,0x87,0x8f,0xe0,0x5, 0xaf,0x92,0xd7,0x75, +0x8f,0x3, 0xe0,0x2, 0x1f,0xc4,0xe4,0x0, 0xc7,0x3, 0x3f,0x1f,0x87,0xe, 0xe0,0x4, +0xaf,0x2, 0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x1f,0x87,0x1e,0xe0,0x4, 0xaf,0x12, +0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x9e,0x87,0xaf,0xe0,0x4, 0xaf,0xa2,0x81,0x83, +0xe0,0x0, 0x1f,0xcd,0xe0,0x6, 0xa9,0x82,0x87,0x8f,0xe0,0x1, 0xaf,0xc2,0x9, 0xe1, +0xe0,0x2, 0x19,0xc8,0x8f,0x83,0xe2,0x0, 0xcf,0x82,0xe7,0xff,0x1, 0x8d,0xe0,0x3, +0x1f,0x32,0xe0,0x3, 0x1f,0x9b,0xbf,0xf, 0xe7,0xff,0x0, 0x8b,0xe0,0x2, 0x1f,0x78, +0xe0,0x3, 0x1f,0x95,0xbf,0xf, 0xe7,0xff,0x0, 0x99,0x8, 0xb1,0xe0,0x3, 0x1f,0x93, +0x17,0x0, 0x14,0x1, 0xb7,0xf, 0xe0,0x0, 0xde,0xd7,0xdf,0x2e,0xe0,0x0, 0x1f,0xcd, +0x8c,0xf, 0xe0,0x0, 0xdd,0x3d,0x8, 0xa1,0xe7,0xfe,0x0, 0xd4,0x8, 0xb7,0xf8,0x0, +0xc, 0x38,0xe0,0x2, 0x1f,0xc8,0xe0,0x2, 0x19,0x93,0x8a,0xf, 0xe0,0x1, 0x19,0x4f, +0x13,0x5, 0xe0,0x3, 0x1a,0xb0,0x3b,0x34,0xe0,0x6, 0x8d,0x13,0xe0,0x6, 0x8d,0xa3, +0xe0,0x6, 0x8e,0x43,0xe0,0x3, 0x9e,0xc3,0x9f,0x2, 0xe0,0xf, 0x3a,0x96,0x8b,0x8f, +0xf0,0x0, 0x8c,0x1f,0xad,0xf, 0xe2,0x2, 0xc7,0x0, 0xad,0x9f,0xae,0x2f,0xae,0xcf, +0xe0,0x1, 0x2f,0x72,0x9f,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x91,0x9f,0x82,0xe3,0xff, +0xc7,0xfe,0xb7,0x82,0xe0,0x6, 0x8f,0x93,0x37,0xa3,0xe2,0x0, 0xcf,0x86,0xe0,0x0, +0x2, 0x76,0xe0,0xf, 0x3a,0x96,0xab,0x8f,0xe0,0x6, 0xab,0x93,0x9f,0x82,0xe2,0x0, +0xc7,0x82,0x27,0x91,0x9f,0x82,0xe3,0xff,0xc7,0xfd,0xb7,0x82,0xe0,0x6, 0x8f,0xa3, +0x37,0xa3,0xe2,0x0, 0xcf,0x8b,0xe0,0x0, 0x2, 0x73,0x3a,0x96,0xf0,0x0, 0xac,0x15, +0xf0,0x6, 0xac,0x23,0x9f,0x82,0xe2,0x0, 0xc7,0x84,0xe0,0x0, 0x2f,0xfe,0x9f,0x82, +0xe2,0x0, 0xc7,0x88,0xe0,0x1, 0x2f,0x88,0x9f,0x82,0xe2,0x0, 0xc7,0xa0,0xe0,0x1, +0x2f,0x8f,0x9f,0x82,0xe2,0x0, 0xc7,0xc0,0xe0,0x1, 0x2f,0x9d,0x9f,0x82,0xe2,0x1, +0xc7,0x80,0xe0,0x1, 0x2f,0xaa,0x9f,0x82,0xe2,0x4, 0xc7,0x80,0x27,0xa6,0x9f,0x82, +0xe0,0x3, 0x1f,0x38,0xe3,0xfb,0xc7,0xff,0xa6,0x8e,0xb7,0x82,0xe7,0xbf,0x17,0x7f, +0xe0,0x1, 0xa7,0xed,0xe7,0xc0,0x15,0x80,0x3f,0xde,0xe0,0x1, 0xbf,0xed,0xe0,0x0, +0x1f,0xc4,0xe0,0xb, 0x8f,0x23,0xa6,0xf, 0xe4,0x0, 0xc7,0x32,0xe0,0x1d,0xc6,0x40, +0xa7,0xfc,0xe2,0x3f,0xc7,0x7e,0x3f,0xdb,0x3f,0xce,0xbf,0xfc,0xe0,0x1, 0xa7,0xed, +0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x9f,0x82,0xe2,0x8, 0xc7,0x80,0xe0,0x1, +0x2f,0x93,0x9f,0x82,0xe2,0x20,0xc7,0x80,0x27,0x85,0x9f,0x82,0xe3,0xdf,0xc7,0xff, +0xb7,0x82,0x9f,0x82,0xe2,0x40,0xc7,0x80,0xe0,0x0, 0x2f,0xfe,0x9f,0x82,0xe2,0x80, +0xc7,0x80,0x2f,0xa0,0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe0,0x6, 0x8c,0x13,0xe0,0x3, +0xdd,0x6d,0xe7,0xff,0x24,0x8, 0xe0,0x6, 0x8c,0x13,0xdd,0xdc,0xe0,0x0, 0x1f,0xcd, +0x8f,0x8f,0xe7,0xff,0x27,0x85,0xd8,0xc7,0xe7,0xff,0x0, 0x82,0xe0,0x6, 0x8c,0x23, +0xdd,0xea,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0xe7,0xff,0x27,0x8e,0xd8,0xbc,0xe7,0xff, +0x0, 0x8b,0x9f,0x82,0x3c,0x64,0xe3,0x7f,0xc7,0xff,0xb7,0x82,0xf8,0x0, 0xc, 0x28, +0xb, 0xa1,0xe7,0xfa,0x0, 0xd7,0x9f,0x82,0x3c,0x64,0xe3,0xff,0xc7,0xfb,0xb7,0x82, +0x9f,0x82,0xe0,0x20,0xcf,0x80,0xb7,0x82,0xde,0x1, 0x9f,0x82,0xe2,0x0, 0xc7,0x88, +0xe7,0xfe,0x27,0xfc,0x9f,0x82,0xe3,0xff,0xc7,0xf7,0xb7,0x82,0xe0,0x6, 0x8c,0x43, +0xdd,0xdb,0x9f,0x82,0xe2,0x0, 0xc7,0xa0,0xe7,0xfe,0x27,0xf5,0x9f,0x82,0x3c,0x64, +0xe3,0xff,0xc7,0xdf,0xb7,0x82,0x9f,0x82,0xe0,0x4, 0xcf,0x80,0xb7,0x82,0x9f,0x82, +0xe0,0x20,0xcf,0x80,0xb7,0x82,0xdd,0xe2,0x9f,0x82,0xe2,0x0, 0xc7,0xc0,0xe7,0xfe, +0x27,0xe7,0xe0,0x2, 0x1f,0xac,0x9f,0x2, 0x8e,0x8f,0xe3,0xff,0xc7,0x3f,0xe4,0x0, +0xc6,0x9c,0x3c,0xe4,0x3f,0x9d,0xa4,0x4f,0xb7,0x2, 0xd4,0xc7,0x9f,0x82,0xe2,0x1, +0xc7,0x80,0xe7,0xfe,0x27,0xda,0x9f,0x82,0xe3,0xfe,0xc7,0xff,0xb7,0x82,0xd5,0xc4, +0xe7,0xfe,0x0, 0xd3,0x9f,0x82,0x3c,0x64,0xe3,0xfd,0xc7,0xff,0xb7,0x82,0xdd,0x4e, +0xe7,0xfe,0x0, 0x8a,0x9f,0x82,0x3c,0x64,0xe3,0xbf,0xc7,0xff,0xb7,0x82,0xdd,0xdf, +0xe7,0xfe,0x0, 0xfe,0x9f,0x82,0x3c,0x64,0xe3,0xf7,0xc7,0xff,0xb7,0x82,0xe0,0x1, +0x8c,0xa3,0xe0,0x3, 0xdc,0xff,0xe7,0xfe,0x0, 0xe6,0x8, 0xb4,0xe0,0x2, 0x19,0x13, +0x8f,0xc2,0xe2,0x0, 0xcf,0x85,0x1, 0x21,0xe2,0x0, 0xcf,0x84,0x1, 0x36,0xe0,0x1, +0x8f,0xf2,0x2f,0x98,0xe0,0x1, 0x1a,0x4f,0x99,0x84,0x29,0x82,0xa, 0x61,0x14,0x1, +0xe0,0x0, 0xdd,0x8a,0xe0,0x43,0x39,0x93,0xe2,0x0, 0xc9,0x80,0x4, 0x13,0xde,0xb7, +0xe0,0x1, 0x8f,0xe2,0xe2,0x1, 0xc7,0xfd,0xe0,0x1, 0xaf,0xe2,0xa, 0x21,0xe0,0x1a, +0x0, 0xaa,0xe0,0x7, 0xd3,0x9f,0x0, 0xe7,0x17,0x81,0xaf,0xc2,0x17,0x82,0xaf,0xc2, +0x0, 0xdf,0x9f,0x84,0xe0,0x2, 0x1f,0x48,0xe2,0xff,0xc7,0xff,0xb7,0x84,0xe0,0x6, +0x8e,0x82,0x8f,0x8e,0x3e,0xff,0x1, 0x64,0xe0,0x6, 0x87,0x82,0xaf,0x8e,0xde,0x86, +0x14,0x1, 0xe0,0x3, 0xd8,0xdf,0x0, 0xdc,0xd8,0x27,0x0, 0xca,0xe0,0x2, 0x1f,0x93, +0xe0,0x2, 0x8f,0x5f,0x27,0x12,0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0xd, +0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x3, 0x1, 0x1d,0xe0,0x0, 0x1f,0x33,0x8e,0x8e, +0xe2,0x0, 0xce,0x81,0x1, 0x27,0x38,0x82,0xe0,0x2, 0x1f,0x48,0x8f,0xe, 0xe2,0x0, +0xcf,0x2, 0xe0,0x2, 0x1f,0x2c,0x8e,0x8e,0xe4,0x0, 0xc6,0x9c,0x3f,0x1d,0x1, 0x2f, +0xa6,0xce,0xe0,0x3, 0x1f,0x1b,0xbe,0x8e,0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x3, +0x1, 0xe5,0xe0,0x2, 0x1f,0x2c,0x8e,0x8e,0xe4,0x0, 0xc6,0x9c,0x3f,0x1d,0xa6,0xce, +0xe0,0x3, 0x1f,0x1b,0xbe,0x8e,0xe0,0x0, 0x1f,0x33,0x8e,0x8e,0xe2,0x0, 0xce,0x81, +0x1, 0xdb,0xe0,0x2, 0x1d,0xc8,0xe0,0x3, 0x1e,0x30,0x8e,0x8b,0xe4,0x0, 0xc6,0x85, +0x3e,0x9c,0x86,0x8d,0xe0,0x6, 0xae,0x9f,0x8e,0x8b,0xe4,0x0, 0xc6,0x85,0x3e,0x1d, +0x86,0x1c,0xe0,0x6, 0xae,0x2f,0x17,0x80,0xaf,0x8e,0x38,0x82,0xa7,0x4e,0xe0,0x3, +0x1e,0x9b,0xe0,0x6, 0xc7,0x26,0xbf,0xd, 0xe7,0xff,0x0, 0xb4,0x8, 0xb1,0xe0,0x2, +0x1e,0xc0,0xe0,0x2, 0x1e,0x12,0x17,0x80,0xe0,0x4, 0xaf,0xdd,0x17,0x80,0x97,0xc, +0xe3,0xfe,0xc7,0x7f,0xb7,0xc, 0xe0,0x3, 0x1f,0x13,0xe0,0x4, 0x8e,0xdd,0xb7,0x8e, +0xe0,0x2, 0x1f,0x72,0xb7,0x8e,0xe0,0x0, 0x1f,0x48,0xb7,0x8e,0xe0,0x2, 0x1f,0x93, +0x8f,0x6f,0xe0,0x0, 0x1f,0xae,0xae,0x8f,0xe0,0x2, 0x1f,0xfa,0xaf,0xf, 0xe0,0x1, +0xdf,0x41,0xdd,0x67,0x14,0x0, 0xe0,0x3, 0xd8,0x5d,0xe0,0x1, 0x1f,0xf2,0xe0,0xc, +0x15,0x52,0xa4,0xf, 0xe0,0x2, 0x1f,0x81,0xa4,0x8f,0xe0,0x8, 0xd0,0x8b,0xe0,0x3, +0xd6,0x1e,0xe0,0x2, 0x1f,0xf7,0xe0,0x2, 0x1f,0x48,0x8f,0x8f,0x8f,0xe, 0x37,0xde, +0xe2,0x0, 0xc7,0x81,0x27,0x82,0x8, 0xe1,0x8, 0xa1,0xe0,0x18,0x0, 0xf4,0xe0,0x0, +0x1f,0xcd,0xe0,0x2, 0x1f,0x13,0x87,0x8f,0xe0,0x1, 0x1e,0xcc,0xe0,0x1, 0xaf,0xce, +0x14,0x3, 0x86,0x8d,0xe0,0x2, 0x1f,0xde,0xae,0xfe,0xe0,0x3, 0x16,0x91,0x8d,0xee, +0xe0,0x2, 0x1e,0x7a,0x17,0x0, 0x3e,0x9f,0xe0,0x3, 0xc7,0x90,0xad,0x8c,0xaf,0xd, +0xaf,0xf, 0xe0,0x3, 0x0, 0xa8,0x0, 0x0, 0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, +0x1c,0x1f,0xa4,0x8f,0xe0,0xc, 0x15,0x52,0xe0,0x8, 0xd0,0x54,0xe0,0x0, 0x1e,0x1e, +0xe0,0x0, 0x1f,0x1d,0xe0,0x0, 0x1d,0x1c,0x9f,0x9e,0xe0,0x43,0x3d,0x9f,0xe2,0x0, +0xcd,0x80,0xe0,0x41,0x3e,0xcf,0xe3,0xff,0xc6,0xff,0xe0,0x6f,0x3d,0x2d,0xe0,0x80, +0xb7,0x9e,0x9e,0x8c,0x3e,0xff,0x3, 0x82,0xb7,0x8c,0x3f,0x7a,0xc6,0x2, 0x1, 0xed, +0x8, 0xe1,0x0, 0x0, 0x8, 0xb6,0xea,0x11,0x7b,0x52,0xe0,0x2, 0x1a,0x13,0x99,0x6, +0xe0,0x2, 0xa9,0x44,0xe0,0x2, 0x8f,0x94,0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0x21,0x8, +0xe0,0x2, 0x1f,0x12,0x16,0x80,0x97,0x8e,0xb6,0x86,0xcf,0x84,0xb7,0x8e,0xb, 0x61, +0x87,0x84,0xe7,0xff,0x17,0x0, 0x3f,0xce,0xe2,0x0, 0xc9,0x5, 0xaf,0x84,0x2, 0x9d, +0xe0,0x0, 0x1c,0x1e,0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x4d,0xe0,0x2, +0x1c,0xa, 0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x46,0xe0,0x0, 0x1c,0x1f, +0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x3f,0xe0,0x2, 0x1c,0x9, 0xe0,0xc, +0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x38,0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x0, +0xc9,0x5, 0xb1,0x6, 0x2, 0xb8,0xe0,0x2, 0x8f,0xb4,0xe0,0x2, 0x8f,0x24,0x37,0xa8, +0x3f,0x9e,0xc7,0x85,0x39,0x7f,0x1, 0xcc,0xe0,0x3, 0x1f,0x13,0x17,0x80,0xe0,0x2, +0x1e,0x97,0xb7,0x8e,0x11,0x0, 0xb7,0x8d,0x12,0x8a,0xe0,0x0, 0x1f,0x1e,0xe0,0x2, +0xaf,0x94,0x39,0xee,0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x9a,0x3, 0xe2,0x0, 0xca,0x46, +0x5, 0x8c,0x21,0x1b,0xe0,0x40,0x9f,0x93,0x9c,0x13,0x3c,0xe5,0x3c,0x1f,0xe0,0x7, +0xdf,0x9e,0xe0,0x8, 0x3a,0x28,0xb4,0x3, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x6, +0xc9,0x29,0xc1,0x82,0x1, 0xeb,0x17,0x80,0xb7,0x86,0x17,0x1, 0xe0,0x2, 0x1f,0x8d, +0xaf,0xf, 0xb, 0x61,0xdf,0x62,0x0, 0xc8,0x3f,0xe2,0x0, 0xe7,0x8, 0xb7,0xf8,0x0, +0xc, 0x3b,0xe0,0x3, 0x19,0xc7,0xde,0xfb,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0xe0,0x0, +0x1, 0xc0,0xe0,0x2, 0x19,0x13,0xe0,0x2, 0x1b,0xfa,0xe0,0x2, 0x1a,0xe6,0xf0,0x1, +0x1d,0xf2,0xf0,0x2, 0x1d,0x9, 0xe0,0x13,0x12,0x44,0x13,0x1, 0xf0,0x0, 0x14,0x0, +0xf0,0xc, 0x14,0xd2,0x0, 0x86,0xdf,0x24,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0x1, 0xa8, +0xde,0x45,0xe0,0x0, 0xde,0xf4,0xde,0x83,0x3c,0x64,0xe0,0x6, 0xd9,0xf8,0x8f,0x82, +0x37,0xc7,0x27,0xf2,0x3c,0x66,0xe0,0x0, 0xdb,0xd7,0xe0,0x1, 0xde,0x77,0xe0,0x2, +0xdb,0x9f,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0x1, 0x1d,0xe0,0x2, 0x8f,0x92,0x2f,0x9a, +0x8f,0x85,0x27,0x82,0xdf,0x48,0xe0,0x2, 0x8f,0x92,0x2f,0xde,0x87,0x82,0xe2,0x0, +0xc7,0xff,0xaf,0x82,0xde,0xfd,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0x1, 0x5a,0xe0,0x1, +0x1f,0xc5,0x17,0x1, 0x14,0x1, 0xaf,0xf, 0xf8,0x0, 0xd, 0xa8,0xb, 0xa1,0xe0,0x17, +0x0, 0xb3,0x8f,0x85,0x27,0xe9,0xe0,0x3, 0xdf,0xee,0xe0,0x2, 0x8f,0x92,0xe2,0x0, +0xcf,0x81,0x1, 0xc, 0xe0,0x3, 0xde,0x4b,0xef,0xfe,0xd9,0xbd,0xe0,0x1, 0xdf,0xcc, +0xe8,0x40,0x3c,0x68,0xe0,0x4, 0xdf,0xe4,0x0, 0xd4,0xe8,0x0, 0xa4,0x8b,0xe8,0x40, +0x3d,0x69,0xe8,0x40,0x3c,0x6a,0xe0,0x7, 0xdf,0x4d,0x0, 0xed,0x8, 0xb1,0xe2,0x0, +0xcc,0x66,0x1, 0x2f,0x5, 0x98,0xe2,0x1, 0xcc,0x8, 0x1, 0x9, 0xe2,0x1, 0xcc,0x2a, +0x1, 0xa3,0xe0,0x3, 0x1f,0x9a,0x17,0x5, 0xaf,0xf, 0x8, 0xe1,0xe0,0x3, 0x1f,0x9a, +0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xfa,0x14,0x1, 0xe0,0x1, 0xd9,0x9f,0x8, 0xa1, +0xe0,0x32,0x0, 0xf6,0xe2,0x0, 0xcc,0x55,0x1, 0x8f,0xe0,0x3, 0x1f,0x9a,0x8f,0x8f, +0xe2,0x0, 0xcf,0x85,0x1, 0xeb,0x14,0x1, 0xe0,0x1, 0xd9,0x90,0xe0,0x1, 0xd9,0x42, +0x8, 0xa1,0xe0,0x32,0x0, 0xd4,0xe0,0x3, 0x1f,0x9a,0x17,0x1, 0xaf,0xf, 0x8, 0xe1, +0xe0,0x3, 0x1f,0x9a,0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xd8,0x14,0x1, 0xe0,0x1, +0xd9,0x7d,0xe0,0x1, 0x1f,0xdc,0x17,0x7f,0xa7,0x8f,0xe0,0x7, 0xaf,0x3f,0x8, 0xe1, +0x8, 0xb4,0xe0,0x1, 0x1a,0x72,0xe0,0xc, 0x11,0xd2,0xa4,0x84,0xe0,0x3, 0x1c,0x10, +0x3d,0x63,0xe0,0x7, 0xde,0xff,0xe0,0x4, 0xdc,0x37,0xe0,0x0, 0x1c,0x8d,0xe0,0x0, +0x1c,0x12,0xe0,0x3, 0x19,0x3e,0xe0,0x3, 0x15,0x40,0xe0,0x7, 0xde,0xf3,0x3d,0x63, +0x14,0x80,0x3c,0x62,0xe0,0x7, 0xdf,0x28,0xa4,0x84,0x3d,0x63,0x3c,0x62,0xe0,0x7, +0xde,0xe9,0x17,0xac,0xb7,0x82,0xa, 0x61,0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x3, +0x1c,0x10,0xa4,0x8f,0xe0,0xc, 0x15,0x52,0xe0,0x7, 0xde,0xdc,0xe0,0x0, 0x1c,0x8d, +0xe0,0x0, 0x1c,0x12,0xe0,0x3, 0x15,0x40,0xe0,0x7, 0xde,0xd4,0x8, 0xe1,0x8, 0xb1, +0xe0,0x1, 0x1f,0xf2,0xe0,0x3, 0x1c,0x90,0xa4,0xf, 0xe0,0xc, 0x15,0x52,0xe0,0x7, +0xde,0xc9,0xe0,0x1, 0x1f,0xd7,0xe0,0x3, 0x8f,0xbf,0x2f,0x85,0xe0,0x3, 0xd3,0x7f, +0xef,0xfe,0xd9,0x21,0x14,0x1, 0xe0,0x6, 0xd6,0xe, 0x14,0x1, 0x8, 0xa1,0xe0,0x9e, +0x0, 0xc7,0xe0,0x2, 0x1f,0x40,0xe0,0x3, 0x1f,0xc7,0xe0,0x4, 0x87,0x7e,0xaf,0xf, +0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x1f,0xc0,0x17,0x0, 0xe0,0x4, 0xaf,0x5f,0x17,0x0, +0xe0,0x4, 0x8e,0x5f,0xe0,0x0, 0x1e,0xae,0xe0,0x2, 0x1f,0xec,0xe0,0x2, 0x19,0x7d, +0xae,0xd, 0xb7,0xf, 0xe0,0x19,0x17,0x1c,0xe0,0x2, 0x1e,0xc8,0x3f,0x12,0x17,0x81, +0xaf,0x8d,0xaf,0x8e,0xe0,0x1, 0xdd,0x3e,0xdb,0x64,0xe0,0x1b,0x14,0x2c,0xe0,0x6, +0xd8,0xf6,0xe0,0x6, 0xd2,0x9b,0xe0,0x3, 0xd4,0x22,0x14,0x1, 0xe0,0x3, 0xd6,0x52, +0xe0,0x5, 0xd7,0x9a,0xe0,0x19,0x17,0x1d,0x17,0x87,0x3f,0x12,0xaf,0x8e,0xe0,0x19, +0xc1,0x1e,0xaf,0x82,0x9, 0x61,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe0,0x1, +0x1f,0xc5,0xe0,0x2, 0x19,0x40,0x8f,0x8f,0x27,0x87,0xe0,0xd, 0x8f,0xe2,0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x1, 0x19,0xdf,0xbe,0xe0,0x3, 0x19,0xc7,0xe0,0x0, 0x1b,0xb8, +0xf0,0x0, 0x1d,0x9a,0xe0,0x0, 0x1a,0x39,0xe0,0x0, 0x1a,0xbc,0xf0,0x1, 0x1d,0x13, +0xf0,0x1, 0x1c,0x92,0xf0,0x2, 0x1c,0x66,0xe0,0x1, 0x1b,0x69,0xf0,0x1, 0x1e,0x68, +0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x96,0x87,0x84,0x17,0x0, 0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0xe0,0x2, 0xaf,0x92,0xe0,0xa, 0x8e,0x82,0xaf,0x7, 0xe8,0x0, +0xaf,0xb, 0xaf,0x84,0xe0,0x1, 0x2e,0x98,0x9f,0x85,0xe2,0x0, 0xcf,0xe3,0xe0,0x1, +0x2, 0x93,0x9f,0x85,0xc7,0x81,0xb7,0x85,0xe0,0x1, 0xd3,0x77,0xe0,0x4, 0xd7,0xbe, +0xe0,0x0, 0xdd,0x95,0xe8,0x0, 0x8f,0x8a,0xe8,0x0, 0x8c,0x9, 0x37,0xa8,0x3c,0x4f, +0xe0,0x6, 0xd8,0x95,0xe0,0x2, 0xd9,0x94,0xe0,0x4, 0xde,0x97,0xe8,0x0, 0x8f,0x88, +0xe0,0x0, 0x27,0xfe,0x8f,0x86,0xe0,0x0, 0x27,0xdb,0xe0,0x3, 0xde,0xac,0xe8,0x0, +0x8f,0x8c,0xe2,0x0, 0xcf,0x84,0xe0,0x1, 0x1, 0x15,0xf0,0x1, 0x1f,0x57,0xe8,0x3, +0x8f,0xbe,0xe0,0x0, 0x27,0xf7,0xf0,0x2, 0x1e,0xc8,0xe0,0x1, 0xde,0x85,0xe8,0x0, +0x8c,0x8d,0xe8,0x0, 0x8c,0xc, 0xe0,0x2, 0xd9,0x56,0xe8,0x0, 0x8f,0xd, 0xe8,0x0, +0x8f,0x8d,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x6b,0xe0,0x0, 0x1f,0x93,0x17,0x0, +0xaf,0xf, 0x8f,0x86,0x27,0xb4,0x14,0x1, 0xe0,0x6, 0xd5,0x4d,0x14,0x0, 0xe0,0x4, +0xde,0x87,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x23,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x1, 0x18,0xe8,0x0, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x1d, +0xe0,0x4, 0x8f,0xc2,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x6, 0xe0,0x2, 0xd6,0xb2, +0xe0,0x2, 0xde,0x2f,0x14,0x2, 0xe0,0x6, 0xd5,0x2e,0xe0,0x6, 0xd5,0xd3,0x14,0x3, +0xe0,0x6, 0xd5,0x29,0xe0,0x4, 0xd4,0xd0,0x14,0x4, 0xe0,0x6, 0xd5,0x24,0xe0,0x6, +0xd8,0x4d,0xef,0xff,0xd1,0xea,0x8f,0x86,0xe0,0x0, 0x2f,0xca,0x87,0x83,0xe0,0x5, +0xd6,0xd2,0xe0,0x4, 0x87,0xf2,0xaf,0x83,0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe7,0xfe, +0x1, 0x6e,0x14,0x1, 0xe0,0x0, 0xda,0x8, 0xe0,0x4, 0x8f,0xc2,0xe2,0x0, 0xcf,0x81, +0x1, 0x87,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xa7,0xce,0xcf,0x84,0xbf,0xce,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0x17,0x80,0xb7,0x85,0xe7,0xfe,0x0, 0xf0,0x8f,0x86,0xe7,0xfe, +0x27,0xd1,0xe0,0x1, 0xd6,0x4a,0xe0,0x4, 0x87,0xf2,0xaf,0x83,0xe7,0xfe,0x0, 0xca, +0xe0,0x3, 0xd2,0x5d,0xef,0xfe,0xd7,0xff,0xe7,0xff,0x0, 0x87,0xe8,0x0, 0x8f,0x8c, +0x16,0x84,0xe0,0x2f,0x3f,0x8d,0xe7,0xff,0x27,0x96,0xe0,0x3, 0x1f,0xac,0xe4,0x0, +0xc7,0xe, 0x3f,0x1f,0x8f,0xbe,0xe7,0xff,0x27,0x8e,0xde,0x83,0xe7,0xff,0x0, 0x8b, +0xe0,0x3, 0x1f,0xc0,0x17,0x1, 0xaf,0xf, 0xe7,0xfe,0x0, 0xe9,0xe0,0x6, 0xdf,0xa5, +0xe0,0x0, 0x1f,0x87,0xe8,0x3, 0x87,0x3e,0x86,0xf, 0xe0,0x2, 0x1f,0xdf,0x86,0x8f, +0xe0,0x0, 0x1f,0x85,0xae,0xf, 0xe0,0x2, 0x1f,0xdd,0xae,0x8f,0x16,0x80,0xe0,0x2, +0x1f,0xdb,0xae,0x8f,0xe0,0x1, 0x1f,0xcc,0x87,0x8f,0xe0,0x5, 0xaf,0xb2,0xe0,0x2, +0x1f,0xa8,0xaf,0xf, 0xe0,0x1, 0xd6,0x9, 0xef,0xfe,0xdf,0xcd,0xef,0xfe,0xd8,0x55, +0xe7,0xff,0x0, 0xbb,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xa7,0xce,0xcf,0x84,0xbf,0xce, +0xe7,0xfe,0x0, 0xf6,0xe0,0x2, 0x1f,0x7a,0xaf,0x8e,0xe7,0xfd,0x0, 0xe7,0xde,0x80, +0x8f,0x87,0xe7,0xfe,0x0, 0xdd,0xde,0x69,0xe7,0xfe,0x0, 0xe4,0x8, 0xb2,0xe0,0x2, +0x1f,0x40,0x16,0x81,0xe0,0x4, 0xae,0xfe,0x14,0x2, 0xe0,0x4, 0x87,0x7e,0xe0,0x3, +0x1e,0xc7,0xe0,0x2, 0x1f,0xfd,0xaf,0xd, 0x16,0x80,0xe0,0x2, 0x1f,0x13,0xe0,0x1, +0x1e,0x5c,0xae,0x8e,0xe0,0x19,0x16,0x9d,0x3e,0x9f,0x17,0x7, 0xa1,0xc, 0xaf,0xd, +0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0x17,0x7b,0xa7,0xc2,0x3f,0xde,0xbf,0xc2,0xe0,0x1, +0xd7,0x95,0xa7,0xc2,0xcf,0x84,0xbf,0xc2,0x9, 0x61,0x0, 0x0, 0x8, 0xb2,0xe0,0x2, +0x19,0x40,0xe0,0x6, 0xd7,0x22,0xe0,0x2, 0xda,0xa7,0xe0,0x2, 0xdb,0xf8,0xe0,0x1, +0xdb,0xbb,0xe0,0x4, 0xd0,0x21,0xe0,0x4, 0xd1,0x49,0xdf,0xc9,0xe0,0x4, 0x8f,0xf2, +0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0xe2,0x0, 0xcf,0x83,0x1, 0xf9,0xdd,0x50,0xe0,0x4, +0x8f,0xf2,0xe2,0x0, 0xcf,0x81,0x1, 0xf8,0xde,0x88,0x0, 0xf1,0xe0,0xe, 0x34,0x22, +0xe0,0xf, 0x34,0x42,0xe0,0x43,0x3f,0xe, 0xe0,0x3, 0x1d,0xb8,0x16,0x4, 0x16,0x81, +0x3e,0xdf,0x3e,0x5e,0xf0,0x0, 0xa3,0x8b,0x3e,0x4d,0xe2,0x0, 0xc4,0x12,0x16,0x88, +0xe2,0x0, 0xc7,0x20,0x3e,0xdf,0x3e,0x48,0xe0,0x0, 0x1f,0xc4,0xe8,0x1, 0xa5,0xe7, +0x3e,0x4e,0x3e,0xcc,0xa7,0x8f,0xe7,0xbf,0x17,0x7f,0x3f,0x5b,0xe4,0xd, 0x36,0xa5, +0xe0,0x24,0x15,0xf0,0xe0,0x3, 0x1c,0xc8,0xe0,0x3, 0x1d,0x49,0xe8,0x1, 0xbf,0x67, +0xe4,0xc, 0x36,0x2c,0xea,0xe, 0xc6,0x80,0x3d,0x9f,0xe0,0x1a,0xa7,0x2f,0xe0,0x7, +0xc7,0xb0,0x3f,0x59,0xe0,0x43,0xbf,0x2f,0x3f,0xfb,0xe0,0x43,0xa7,0x2f,0x3f,0x4c, +0xe0,0x43,0xbf,0x2f,0xe0,0x40,0xa7,0x1f,0x3f,0x5a,0xe0,0x40,0xbf,0x1f,0xe0,0x40, +0xa7,0x1f,0x3f,0x4d,0xe0,0x40,0xbf,0x1f,0x1, 0xe9,0xe8,0x1, 0xa7,0xe7,0xe0,0x40, +0xcf,0x80,0xe8,0x1, 0xbf,0xe7,0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3b,0xe0,0x2, +0x1f,0x66,0xe0,0x2, 0x1f,0xfd,0x87,0xe, 0x15,0x85,0xe0,0x3, 0x8e,0x2f,0x3d,0xb9, +0xe0,0x3, 0x1e,0xb0,0xe2,0x0, 0xc7,0x1, 0x3e,0x7e,0x3e,0x9b,0xf0,0x40,0x3d,0x69, +0xf0,0x40,0x3c,0xe8,0x8a,0xbd,0xe0,0x1, 0x1, 0x69,0x9b,0x5f,0xe0,0x1, 0x8a,0xf, +0xf0,0x2, 0x1d,0xf9,0xe0,0x3, 0x1f,0xb8,0xe4,0x7, 0xc2,0xb0,0xa1,0x8f,0xe0,0x0, +0x1f,0xc4,0xe7,0xbf,0x17,0x7f,0xa1,0xf, 0xe0,0x1, 0xa7,0xe3,0x3a,0x92,0x13,0xa0, +0x3f,0xde,0xf2,0x0, 0xcd,0x2, 0x3b,0x95,0xe0,0x6, 0x17,0x26,0xe8,0xe, 0x3f,0x19, +0xe0,0x6, 0x15,0x28,0x14,0x80,0xe0,0x1, 0xbf,0xe3,0x3c,0x67,0xf0,0x6, 0x14,0x48, +0xe0,0x79,0x39,0x2e,0xf0,0x18,0x3c,0x15,0xe0,0x7, 0xdc,0xae,0xe0,0x0, 0x15,0x68, +0x14,0x80,0xe8,0x40,0x3c,0x68,0xe0,0x7, 0xdc,0xa7,0x23,0x2e,0x14,0x7f,0x3c,0x16, +0xe3,0xff,0xc4,0x7f,0x14,0xfe,0x15,0x7f,0xe8,0x9, 0x3c,0x9b,0xe8,0xa, 0x3d,0x19, +0xe8,0x8, 0x3c,0x19,0xf0,0x0, 0x13,0x81,0xe0,0x80,0x9f,0x19,0x17,0x84,0x3f,0x9e, +0xe0,0xd, 0x37,0x82,0x36,0xa2,0xe0,0x80,0x8d,0x9a,0x3e,0x97,0xe0,0x41,0x3f,0xe, +0xa6,0xd, 0x37,0x23,0x35,0xbe,0xe0,0xe, 0x37,0x85,0x3e,0x4b,0x37,0x22,0xbe,0xd, +0xe8,0xe, 0x3f,0x18,0xa6,0x8e,0xe0,0x41,0x3f,0x8f,0xf0,0xf, 0x33,0xbf,0x3f,0xcd, +0x3c,0x7a,0xbf,0x8e,0x1, 0xe2,0xe0,0x1, 0xa6,0x5, 0xe0,0x1a,0xa6,0x95,0xe8,0x6, +0x3b,0x19,0x17,0x90,0xe1,0x80,0x8f,0x16,0x37,0x3f,0x3e,0x4e,0xe0,0x1, 0xbe,0x5, +0x8f,0x26,0x37,0x3f,0xc7,0xf8,0x3e,0xce,0xe3,0xff,0xcf,0xf8,0xe0,0x1a,0xbe,0x95, +0x1, 0xf2,0xf2,0x0, 0xcd,0x1, 0x1, 0xe, 0xe0,0x1, 0xa7,0xe3,0x3c,0x64,0xe0,0x40, +0xcf,0x80,0xe0,0x1, 0xbf,0xe3,0xf8,0x0, 0xd, 0xa8,0xb, 0xa1,0xe7,0xfe,0x0, 0x98, +0x3d,0x2, 0x16,0x9c,0x3e,0x95,0xe0,0x16,0x15,0x90,0x3e,0x6d,0x17,0x0, 0x3d,0x92, +0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x1, +0xcf,0x4a,0xbd,0xf, 0x1, 0xf6,0xe0,0x6, 0xc2,0xc4,0xe0,0x16,0x15,0x90,0x3e,0x65, +0x17,0x0, 0x3d,0x92,0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80, +0xa5,0x1c,0x3f,0x9b,0xe2,0x0, 0xcf,0x1a,0xbd,0xf, 0x1, 0xf5,0xe0,0x1d,0x15,0xc0, +0x3e,0x6d,0x17,0x0, 0x3d,0x92,0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80, +0xa5,0x1c,0x3f,0x9b,0xe2,0x1, 0xcf,0x4a,0xbd,0xf, 0x1, 0xf6,0xe0,0x1d,0x15,0xc0, +0x3e,0x65,0x17,0x0, 0xe0,0xb, 0x3d,0x92,0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2, +0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x0, 0xcf,0x1a,0xbd,0xf, 0x1, 0xf5, +0x17,0x0, 0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa6,0x1d,0x3f,0x92, +0xe2,0x1, 0xcf,0x4a,0xbe,0xf, 0x1, 0xf6,0xe0,0x0, 0x17,0x0, 0xe0,0x1, 0x17,0xd2, +0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa6,0x95,0x3f,0x92,0xe2,0x0, 0xcf,0x1a, +0xbe,0x8f,0x1, 0xf5,0xe7,0xff,0x0, 0x92,0x9b,0x6f,0xe0,0x1, 0x8a,0x1f,0xf0,0x2, +0x1d,0xf8,0xe7,0xfe,0x0, 0x99,0x8, 0xb5,0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d, +0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, 0xc7,0x81,0x3e,0xff,0xe0,0x0, 0x1, 0x49, +0x9a,0x5e,0xe0,0x2, 0x19,0x79,0xe0,0x3, 0x1f,0xb8,0xe7,0xbf,0x17,0x7f,0xa2,0x8f, +0xe0,0xc, 0x15,0x40,0xe0,0x1, 0xa7,0xe5,0x14,0x80,0x3f,0xde,0xe0,0x3, 0x1f,0x3f, +0xe0,0x1, 0xbf,0xe5,0xa1,0x8e,0xe0,0xc, 0xc1,0xd0,0x3c,0x63,0xe0,0x7, 0xdb,0xc4, +0x3e,0x62,0x16,0x80,0x2a,0xe, 0x0, 0xa5,0x9d,0x8c,0xa7,0xf, 0xc6,0x81,0xe4,0xb, +0x35,0xa0,0xe3,0xff,0xc6,0xff,0x3f,0x4b,0x3a,0x7d,0xbf,0xf, 0xc6,0x2, 0x1, 0x19, +0xe0,0xf, 0x36,0xc1,0x3f,0x6f,0x15,0x81,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc7,0x7f, +0x37,0xa2,0x3d,0xdd,0x37,0x22,0x3f,0x93,0x25,0xe8,0x3f,0x13,0x9d,0x8c,0xa7,0x8e, +0xc6,0x81,0xe3,0xff,0xc6,0xff,0x3f,0xcb,0x3a,0x7d,0xbf,0x8e,0xc6,0x2, 0x1, 0xe9, +0xe0,0x1, 0xa7,0xe5,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xe5,0xa, 0xe1,0x9a,0x6e, +0xe0,0x2, 0x19,0x78,0xe7,0xff,0x0, 0xb9,0x8, 0xb5,0x11,0x3, 0x39,0x38,0xe0,0x2, +0x1a,0x44,0x17,0x5, 0x3f,0x38,0x39,0x14,0xe0,0x3, 0x1f,0xb0,0x39,0xe8,0x8c,0x2, +0x3f,0x9e,0x8a,0xbf,0xe0,0x7, 0xd2,0x2c,0x8c,0x92,0x3c,0x65,0xe0,0x7, 0xd2,0x5e, +0x8c,0xa2,0x3c,0x65,0xe0,0x7, 0xd2,0x97,0xe2,0x0, 0xc9,0x81,0x1, 0x2, 0xa, 0xe1, +0x8c,0xc4,0x14,0x3, 0xe0,0x7, 0xd2,0x52,0x8c,0xd4,0x14,0x3, 0xe0,0x7, 0xd2,0x8b, +0x8c,0xc4,0x14,0x4, 0xe0,0x7, 0xd2,0x4a,0x8c,0xd4,0x14,0x4, 0xe0,0x7, 0xd2,0x83, +0x8c,0xc4,0x14,0x0, 0xe0,0x7, 0xd2,0x42,0x8c,0xd4,0x14,0x0, 0xa, 0xa1,0xe0,0xe4, +0x0, 0xfa,0xe2,0x0, 0xcc,0x82,0xe0,0x0, 0x2, 0xe1,0x8, 0xb5,0x17,0xfd,0x3f,0x98, +0xe2,0x0, 0xcf,0x81,0x39,0x68,0x3a,0x69,0xe0,0x1, 0x5, 0x88,0xe0,0x0, 0x2c,0x57, +0xe0,0x3, 0x1f,0xb8,0xe7,0xbf,0x16,0x7f,0xa6,0x8f,0xe0,0x0, 0x1f,0xc4,0xe0,0x1, +0xa7,0x6d,0xa7,0x8f,0x3f,0x5c,0xe0,0x1, 0xbf,0x6d,0xe2,0x0, 0xcc,0x81,0xa7,0x4f, +0xe6,0x7, 0x16,0x7f,0x3f,0x5c,0xe0,0x0, 0x1, 0x4a,0xe0,0x28,0xcf,0x0, 0xbf,0x4f, +0x16,0x40,0xa7,0x4f,0xe7,0xf8,0x15,0x80,0x3f,0x5c,0xcf,0x5, 0xbf,0x4f,0x12,0x85, +0xa7,0x5f,0xe0,0x3, 0x1e,0x4a,0x3a,0xb9,0x3f,0x5c,0xe8,0x0, 0xcf,0x5, 0xbf,0x5f, +0xa7,0x5f,0xe0,0x3, 0x19,0xb0,0x3f,0x5b,0xcf,0x5, 0xbf,0x5f,0xe0,0xc, 0x39,0x95, +0xe0,0x1, 0xa7,0xed,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x8c,0xcc,0xe0,0x7, +0xd0,0x19,0xe0,0x3, 0x1f,0x8e,0x3c,0x62,0x3f,0x94,0x84,0x8f,0xe0,0x7, 0xd0,0x3d, +0x39,0x95,0x8d,0x23,0x3c,0x62,0x3c,0xea,0xe0,0x7, 0xd0,0xf9,0x8c,0x83,0x3c,0x62, +0x34,0xa3,0xe0,0x7, 0xd0,0xac,0x8c,0x93,0x3c,0x62,0x34,0xa3,0xe0,0x7, 0xd0,0xca, +0x3c,0x64,0xa, 0xa1,0xe7,0xfe,0x0, 0xea,0x38,0x82,0x12,0x85,0x3a,0xb9,0xe0,0x3, +0x19,0xb0,0xe0,0xf, 0x39,0x95,0x8c,0xcf,0x0, 0xdb,0xe0,0x50,0xcf,0x0, 0xbf,0x4f, +0x16,0x40,0xa7,0x4f,0x14,0x85,0x3f,0x5c,0xcf,0xa, 0xbf,0x4f,0x3a,0xe9,0xa7,0x5f, +0xe0,0x3, 0x1e,0x4a,0xe0,0x3, 0x19,0xb0,0x3f,0x5c,0xe8,0x0, 0xcf,0xa, 0xbf,0x5f, +0xe7,0xf8,0x16,0x0, 0xa7,0x5f,0x3f,0x5c,0xcf,0xa, 0xbf,0x5f,0xe0,0x1, 0xa7,0xed, +0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0xe0,0x6, 0xdf,0xd4,0x3c,0xe2,0x3c,0x62, +0xe0,0x6, 0xdf,0xfb,0xe7,0xff,0x0, 0xbe,0x14,0x8a,0xe0,0x6, 0xdf,0xcb,0x14,0x80, +0x3c,0x62,0x12,0x85,0xe0,0x6, 0xdf,0xf1,0xe0,0x3, 0x19,0xb0,0x3a,0xb4,0xe7,0xff, +0x0, 0xb1,0x0, 0x0, 0xe0,0x2, 0x1f,0x66,0xe0,0x0, 0x1d,0x3b,0xe0,0x2, 0x1f,0xfd, +0x87,0xe, 0xf0,0x1, 0x8b,0xfa,0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, 0xe8,0xc, +0x3d,0x17,0x3e,0xfe,0xf0,0x6, 0x89,0xc, 0xe0,0x1, 0x1, 0x35,0xf0,0x0, 0x9a,0x5f, +0xf0,0x1, 0x89,0x8f,0xe0,0x1, 0x24,0x25,0xe0,0x0, 0x1f,0xba,0xf0,0x3, 0x1b,0x41, +0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe0,0x1, 0x27,0xa5,0x8, 0xb2,0xe0,0x1, 0x1f,0xdc, +0xe7,0x7f,0x16,0xff,0xa4,0xf, 0xa7,0x88,0xa7,0x8, 0x37,0xce,0xe2,0x0, 0xc7,0x81, +0xe4,0x0, 0xcf,0x81,0x3f,0x5d,0x37,0xae,0x3f,0xce,0xbf,0x88,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe0,0x1, 0x1f,0xcd,0xf0,0xe, 0x33,0xa2,0x96,0xfb,0x3f,0x9e,0xb6,0x8f, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0,0x1, 0x97,0xb, 0xf0,0x0, 0x12,0x82,0xb7,0x1f, +0xf0,0x15,0x3a,0x9b,0xf0,0x2, 0x18,0xc8,0xf0,0x1, 0x18,0x7f,0xe8,0x40,0x3f,0x64, +0x16,0x0, 0x0, 0x96,0xe8,0x0, 0x8e,0x81,0xe0,0xf, 0x37,0x21,0xe2,0x0, 0xce,0x81, +0x3f,0x99,0xe0,0x0, 0x1, 0x49,0xe8,0x0, 0x96,0x85,0xb6,0x8f,0xc6,0x1, 0xe2,0x0, +0xce,0x6, 0xc7,0x1, 0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82,0x1, 0x13,0xf0,0xf, +0x31,0xdc,0xe0,0xd, 0x37,0x21,0xe2,0x0, 0xc7,0x81,0x3e,0x99,0x2f,0xe4,0xc6,0x1, +0xe2,0x0, 0xce,0x6, 0xc7,0x1, 0xb7,0x8d,0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82, +0x1, 0xef,0xe8,0x0, 0x8f,0x81,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x52,0xf0,0x0, +0x22,0x14,0x16,0x89,0xe8,0xd, 0x3e,0x94,0xe3,0xff,0xc6,0xff,0xe0,0x0, 0x17,0x89, +0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff,0x97,0xe, 0x3f,0xfd, +0xe1,0x80,0xb7,0x19,0x1, 0xf6,0xe0,0x6, 0x8f,0xda,0xc7,0xff,0xf0,0x40,0x3b,0xff, +0x4, 0x6, 0xa7,0x88,0xe7,0x7f,0x17,0x7f,0x3f,0xde,0xbf,0x88,0x17,0x0, 0xe8,0x0, +0xaf,0x6, 0x9, 0x61,0xf2,0x0, 0xc9,0x4, 0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe7,0xff, +0x1, 0xb4,0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe0,0x45,0x16,0xc2,0xe8,0x0, 0x98,0x85, +0x3e,0x9e,0x99,0xf, 0x36,0xa1,0x38,0xa2,0xe8,0xd, 0x3e,0x90,0xb0,0x8d,0x9e,0x8f, +0xe8,0x0, 0x98,0x85,0x3e,0x91,0x36,0xc1,0xb6,0x8f,0xe7,0xff,0x0, 0xa1,0xe0,0x3, +0x1f,0x8a,0xf0,0x3, 0x1b,0x41,0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe7,0xfe,0x2f,0xdf, +0x38,0x82,0xf0,0x0, 0x9a,0x6f,0xf0,0x1, 0x89,0x9f,0xe7,0xfe,0x0, 0xcd,0xf2,0x0, +0xc9,0x4, 0x1, 0x17,0xf7,0xff,0x22,0x41,0xf0,0x0, 0xc2,0x9, 0xf3,0xff,0xc2,0x7f, +0xe0,0x0, 0x17,0x89,0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x97,0xe, 0xe8,0x40,0x3f,0xf4,0xe1,0x80,0xb7,0x19,0x1, 0xf5,0xe7,0xff,0x0, 0xad, +0xf0,0x0, 0x22,0x27,0xf7,0xff,0x11,0xff,0xf8,0x13,0x39,0x94,0xf3,0xff,0xc1,0xff, +0xf0,0x1, 0x19,0x7f,0xc5,0x92,0x3e,0xe9,0xf0,0x0, 0xc1,0x81,0xe0,0x0, 0x17,0x0, +0xe0,0x45,0x17,0xc2,0x9e,0xb, 0x3f,0x9e,0xf0,0x0, 0x9a,0x8d,0x37,0xa1,0xe8,0xc, +0x3e,0x25,0xe8,0xf, 0x3f,0x92,0xb6,0xf, 0xc7,0x1, 0x9f,0x8d,0xe1,0x80,0x9e,0x1b, +0xf0,0x40,0x39,0xfe,0x3f,0x9c,0x37,0xc1,0xe1,0x80,0xb7,0x9d,0x1, 0xea,0x17,0x86, +0xe0,0x3, 0x1f,0x44,0xf0,0xc, 0x33,0xa1,0xe8,0xf, 0x3f,0x94,0x16,0x80,0x3f,0x1c, +0x37,0xa1,0xb6,0x8e,0x3c,0x9f,0xb6,0x89,0xe7,0xfe,0x0, 0xf7,0xe0,0x2, 0x1f,0xba, +0x86,0xc8,0x8f,0x8f,0x87,0x68,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1f,0xcc,0x8f,0x8f, +0x1, 0x22,0x37,0xc1,0x16,0x60,0xc7,0x81,0x3e,0xdc,0xe2,0x0, 0xc7,0x9f,0x3f,0x5c, +0xce,0x81,0x3f,0xce,0xae,0xc8,0xaf,0xe8,0x15,0x80,0x87,0x48,0x87,0xe8,0x86,0x58, +0x86,0xf8,0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xc7,0x9f,0xcf,0x20,0xce,0x40,0xcf,0xa0, +0xce,0xc0,0x15,0x1, 0xad,0x8, 0xad,0x98,0xad,0xb8,0xaf,0x48,0xae,0x58,0xaf,0xe8, +0xae,0xf8,0x38,0x82,0xc7,0x81,0x37,0x81,0x16,0x60,0xc7,0x81,0x3e,0xdc,0xe2,0x0, +0xc7,0x9f,0x3f,0x5c,0xce,0x82,0x3f,0xce,0xae,0xc8,0xaf,0xe8,0x0, 0xde,0xe0,0x2, +0x1f,0xba,0xf0,0x0, 0x11,0x81,0x8d,0x8f,0xe2,0x0, 0xcd,0x82,0x1, 0x4, 0xf0,0x0, +0x11,0x80,0x15,0x81,0xc4,0x82,0xe2,0x1, 0xc4,0xff,0x17,0x81,0xf0,0x1, 0x1a,0x4c, +0xac,0x88,0x17,0x0, 0xaf,0xb8,0x15,0x47,0xf7,0xff,0x13,0xe0,0xf7,0xff,0x12,0x80, +0xf7,0xff,0x13,0x3f,0x0, 0x92,0x87,0xc8,0x86,0xd8,0xe2,0x0, 0xc7,0x9f,0xcf,0xe0, +0xe8,0xf, 0x3f,0xd7,0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xd8,0xaf,0xc8,0xc7,0x1, +0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0x4, 0xac,0x17,0x82,0x3f,0x9e,0x37,0xa1,0x3f,0x98, +0x86,0x9f,0x3e,0xda,0xae,0x9f,0x27,0x68,0xe2,0x0, 0xcf,0x1, 0xf0,0x0, 0x11,0x1f, +0xf0,0x0, 0x10,0x81,0xf0,0x12,0x39,0x5b,0xce,0xc0,0xf0,0x11,0x38,0x9b,0x1, 0x19, +0x86,0xf, 0xe2,0x0, 0xcf,0x2, 0xe8,0xc, 0x3e,0x57,0xe8,0xc, 0x3e,0x42,0xe8,0x40, +0x3d,0xe1,0xae,0xf, 0xe2,0x0, 0xc6,0x1f,0xe2,0x1, 0xc5,0xff,0xce,0x20,0x1, 0x17, +0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0xae,0xf, 0xae,0x9f,0x3, 0xd6,0x38,0x82, +0x87,0xe8,0x86,0xf8,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0xc5,0xe8,0xf, 0x3f,0xd7, +0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xf8,0xaf,0xe8,0x0, 0xc2,0xe0,0x1, 0x86,0x98, +0xe0,0x1, 0x87,0x88,0xce,0xc0,0xe0,0x1, 0xae,0x98,0xe2,0x0, 0xc7,0x9f,0xe8,0x0, +0x8d,0x84,0xcf,0xa0,0xe8,0xb, 0x3d,0x93,0x35,0x81,0xc5,0x81,0xe0,0x1, 0xaf,0x88, +0xe2,0x1, 0xc5,0xff,0xe7,0xff,0x0, 0xad,0x17,0x0, 0x3f,0xe8,0xe1,0x80,0xaf,0x1f, +0xc7,0x81,0xaf,0x18,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xaf,0xf, 0xe7,0xfe,0x0, 0xe6,0xe0,0x2, 0x1f,0xba,0x16,0x82,0x8f,0x8f,0x87,0x58, +0xe0,0x2f,0x3f,0x8d,0xc7,0x81,0x16,0x80,0xcf,0x40,0xcf,0xa0,0xae,0x88,0xae,0x98, +0xae,0xb8,0xaf,0x58,0xaf,0xc8,0x38,0x82,0x8, 0xb2,0xe0,0x3, 0x19,0x2c,0x15,0x2a, +0x14,0x80,0x3c,0x62,0xe0,0x7, 0xd8,0xb0,0xe0,0x2, 0x1f,0xba,0x17,0x1, 0xaf,0x42, +0xe0,0x0, 0x17,0x41,0x8f,0x8f,0xe0,0x4, 0xaf,0x2, 0x2f,0x8c,0xe0,0x2, 0x87,0xa2, +0x17,0x60,0xe2,0x0, 0xc7,0x9f,0xcf,0xa0,0x3f,0xde,0xcf,0x81,0xe0,0x2, 0xaf,0xa2, +0x9, 0x61,0xe0,0x3, 0x1e,0xab,0x17,0x0, 0xe0,0x3, 0x1f,0xaa,0xaf,0xd, 0x3c,0x6d, +0xaf,0x1d,0xaf,0xf, 0xe0,0x3, 0x1f,0xa9,0xe0,0x3, 0x1e,0xc3,0xaf,0xf, 0xe0,0x3, +0x1f,0xa8,0x8c,0x8d,0xaf,0xf, 0xe0,0x3, 0x1f,0xa7,0xaf,0xf, 0xe0,0x3, 0x1f,0xa6, +0xaf,0xf, 0xe0,0x3, 0x1f,0xa5,0xaf,0xf, 0xe0,0x3, 0x1f,0xa4,0xaf,0xf, 0xe0,0x3, +0x1f,0xa3,0xaf,0xf, 0xe0,0x3, 0x1f,0xa2,0xaf,0xf, 0xe0,0x3, 0x1f,0xa1,0xaf,0xf, +0xe0,0x3, 0x1f,0xa0,0xaf,0xf, 0xe0,0x3, 0x1f,0x9f,0xaf,0xf, 0x9, 0x21,0xe7,0xfe, +0x0, 0x88,0xe0,0x0, 0x1f,0xbb,0x17,0x0, 0xaf,0xf, 0x16,0xff,0xaf,0x1f,0xae,0xaf, +0xaf,0x3f,0xaf,0x4f,0xaf,0x5f,0xaf,0x6f,0xaf,0x7f,0xe0,0x1, 0xaf,0xf, 0xe0,0x1, +0xaf,0x6f,0xe0,0x1, 0xae,0xff,0xe0,0x2, 0xaf,0xf, 0xe0,0x2, 0xaf,0x1f,0x38,0x82, +0xe0,0x0, 0x1f,0x3b,0x8e,0x8e,0xe0,0x0, 0x2e,0xdc,0x8f,0x8e,0x85,0x89,0x37,0xa5, +0x3f,0x9e,0xbc,0x6f,0xc5,0x81,0x8f,0x8e,0xe2,0x1, 0xc5,0xff,0x37,0xa5,0x3f,0x9e, +0x8c,0x39,0xe0,0x6, 0xad,0xdf,0x15,0x7f,0x3e,0x6d,0x8f,0x8e,0x37,0xa5,0x3f,0x9e, +0x3f,0x9d,0xe0,0x6, 0xad,0xf, 0x8f,0x8e,0x37,0xa3,0x3f,0x9d,0xc7,0x87,0x37,0xa2, +0xc6,0x81,0x3f,0x9e,0xe2,0x0, 0xce,0x85,0xbe,0xf, 0x1, 0xf0,0xe0,0x2, 0xae,0x2e, +0xe0,0x2, 0xae,0x3e,0xe0,0x2, 0xae,0x4e,0xe0,0x2, 0xae,0x5e,0xe0,0x2, 0xae,0x6e, +0xe0,0x2, 0x1f,0xc8,0xe0,0x2, 0xae,0x7e,0x8d,0xf, 0xe2,0x0, 0xcd,0x1, 0x1, 0x2a, +0x8f,0x8e,0x8e,0x99,0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0xf, 0x3d,0xad,0xe0,0x2, +0xae,0x2e,0xe2,0x0, 0xcd,0x81,0x8f,0x8e,0xe0,0x1, 0x1e,0xfe,0x37,0xa5,0x3f,0x9e, +0xbe,0xff,0x5, 0x11,0x8f,0x8e,0x16,0x82,0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0x9f, +0x17,0x81,0xe0,0x2, 0xaf,0xce,0x8f,0x8e,0xe0,0x1, 0x1e,0xfd,0xc7,0x81,0x37,0xa5, +0x3f,0x9e,0xbe,0x8f,0x14,0x0, 0x8f,0x8e,0xc7,0x81,0xaf,0x8e,0x38,0x82,0x14,0x1, +0x38,0x82,0xe0,0x0, 0x24,0x50,0x8f,0x8e,0xf0,0x1, 0x1b,0x7c,0x37,0xa5,0x3f,0x9e, +0xe0,0x6, 0xae,0x8f,0x16,0x84,0xe0,0x2, 0xae,0x7e,0x14,0x82,0x8f,0x8e,0x16,0x3, +0x37,0xa5,0x3f,0x9e,0xf0,0x0, 0xbb,0x7f,0xf0,0x40,0x3b,0xe9,0x8f,0x8e,0x37,0xa5, +0x3f,0x9e,0xe0,0x6, 0xae,0x9f,0xe0,0x2, 0xad,0x6e,0x8e,0x8e,0xc6,0x81,0x36,0xa5, +0x3e,0x9e,0xf0,0x0, 0xbb,0xd, 0x17,0x80,0x8e,0x8e,0x34,0x21,0x36,0xa5,0x3e,0x9e, +0x3e,0x99,0xe0,0x6, 0xaf,0x8d,0x3d,0xa8,0xf0,0x2, 0xab,0xae,0xe2,0x0, 0xcd,0x81, +0x8f,0x8e,0xe0,0x1, 0x1e,0xfe,0x37,0xa3,0x3f,0x99,0xc7,0x87,0x37,0xa2,0x3f,0x9e, +0xbe,0x8f,0x5, 0x41,0x8e,0x8e,0x17,0x82,0x36,0xa5,0x3e,0x9e,0x3e,0x9c,0xe0,0x6, +0xaf,0x8d,0x14,0x0, 0xe0,0x2, 0xae,0x4e,0x8f,0x8e,0xe0,0x1, 0x1e,0xfd,0x37,0xa3, +0x3f,0x9c,0xc7,0x87,0x37,0xa2,0x3f,0x9e,0xbe,0x8f,0x8f,0x8e,0xc7,0x81,0xaf,0x8e, +0x38,0x82,0xf0,0x40,0x3b,0xe8,0x3e,0x6a,0x3c,0xe8,0x0, 0xce,0xe2,0x0, 0xcc,0x4, +0x1, 0x20,0x5, 0x92,0xe2,0x0, 0xcc,0x6, 0x2, 0x9f,0x17,0x80,0x8f,0x39,0xaf,0x89, +0xaf,0x99,0x27,0x7, 0x87,0xd9,0xe2,0x1, 0xc7,0xbf,0xaf,0xd9,0x17,0xa1,0xaf,0xc9, +0x17,0x80,0xaf,0xb9,0x38,0x82,0xe2,0x0, 0xcc,0x3, 0x1, 0x8f,0x87,0xd9,0x17,0x47, +0x3f,0xde,0xcf,0x90,0x17,0x0, 0xaf,0x9, 0xaf,0x19,0xaf,0x39,0xaf,0xd9,0x38,0x82, +0x3c,0x69,0xe7,0xfb,0x0, 0xdd,0x38,0x82,0x38,0x82,0x0, 0x0, 0x8, 0xb4,0xc0,0x60, +0xe0,0x0, 0x19,0x3b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0x11,0x94,0xaf,0x22, +0x39,0x90,0xaf,0xb2,0x3c,0x63,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, +0xaf,0x82,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0x17,0xe, 0xe0,0x2, 0xaf,0x82, +0xe0,0x2, 0x1a,0x48,0xe0,0x2, 0xaf,0x92,0x8f,0x84,0x3f,0x3f,0xe0,0x3, 0x1f,0xac, +0x3f,0x9e,0xf0,0x0, 0x80,0x8f,0xf0,0x0, 0x81,0x1f,0xf0,0x0, 0x81,0xaf,0xf0,0x0, +0x82,0x3f,0xf0,0x0, 0x68,0x94,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, +0x83,0xff,0xe0,0x1, 0x84,0x8f,0xe0,0x1, 0x85,0x1f,0xe0,0x1, 0x85,0xaf,0xe0,0x1, +0x86,0x3f,0xe0,0x1, 0x86,0xcf,0xe0,0x1, 0x87,0x5f,0x87,0xcf,0xf0,0x0, 0xa9,0x13, +0xf0,0x0, 0xa9,0xa3,0xf0,0x0, 0xaa,0x33,0xaf,0xc3,0xf0,0x0, 0xaa,0xd3,0xf0,0x0, +0xab,0x63,0xf0,0x0, 0xab,0xf3,0xe0,0x1, 0xac,0x83,0xe0,0x1, 0xad,0x13,0xe0,0x1, +0xad,0xa3,0xe0,0x1, 0xae,0x33,0xe0,0x1, 0xae,0xc3,0xe0,0x1, 0xaf,0x53,0xdd,0x7f, +0xf8,0x3, 0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x4, 0x77,0x88,0xde,0xbe,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x84,0xc7,0x81, +0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, 0xaf,0x92, +0x17,0x80,0xe0,0x0, 0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0xa, 0x61,0x8, 0xb3,0xc0,0x60, +0xe0,0x0, 0x19,0x3b,0x17,0x0, 0xaf,0x2, 0x17,0xff,0xaf,0x12,0x16,0x8e,0xaf,0xa2, +0xaf,0x32,0xaf,0x42,0xaf,0x52,0xaf,0x62,0xaf,0x72,0xe0,0x1, 0xaf,0x2, 0xe0,0x1, +0xaf,0x62,0xe0,0x1, 0xaf,0xf2,0xe0,0x2, 0xaf,0x2, 0xe0,0x2, 0x19,0xc8,0xe0,0x2, +0xaf,0x12,0x8f,0x83,0x3e,0xbf,0xe0,0x3, 0x1f,0xac,0x3f,0x9d,0xf0,0x0, 0x81,0x2f, +0xf0,0x0, 0x81,0xcf,0xf0,0x0, 0x82,0x5f,0xf0,0x0, 0x82,0xef,0xf0,0x0, 0x83,0x7f, +0xf0,0x1, 0x83,0x8f,0x86,0xbf,0xe0,0x1, 0x84,0xaf,0xe0,0x1, 0x85,0x3f,0xe0,0x1, +0x85,0xcf,0xe0,0x1, 0x86,0x5f,0xe0,0x1, 0x84,0x1f,0xf0,0x0, 0x69,0x16,0x3f,0xed, +0xf0,0x0, 0x69,0x98,0xe2,0x1, 0xc7,0xff,0xf0,0x0, 0x6a,0x19,0xf0,0x0, 0x6a,0x9a, +0xf0,0x0, 0x6b,0x1b,0xf0,0x0, 0x6b,0x9c,0x6c,0x1d,0x6c,0x9e,0x6d,0x1f,0x6d,0xa0, +0x6e,0x21,0x6f,0x14,0x6f,0x15,0x27,0x87,0x57,0x8c,0xe2,0x1, 0xc7,0xbf,0xe0,0x42, +0xcf,0x80,0x77,0x8c,0x17,0x80,0xf0,0x0, 0x11,0x14,0x6f,0x97,0xf0,0x12,0x39,0x10, +0xf8,0x12,0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x6, 0x77,0x88,0xef,0xff,0xde,0x36,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x83, +0xc7,0x81,0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, +0xaf,0x92,0x17,0x80,0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0x9, 0xe1,0x8, 0xb1,0xc0,0x70, +0xe0,0x3, 0x1f,0xac,0xe2,0x0, 0x7c,0x84,0xf0,0x0, 0x80,0xf, 0xf0,0x0, 0x80,0x9f, +0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf, +0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f, +0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf, +0x14,0x0, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, +0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, +0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdd,0xd9, +0xe0,0x0, 0x1f,0xbb,0x17,0x0, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, +0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x8, 0xb1, +0xc0,0x70,0xe0,0x3, 0x1f,0x2c,0x17,0x8e,0x3f,0x9e,0xf0,0x1, 0x80,0x6e,0xf0,0x0, +0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, +0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, +0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, +0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x1, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, +0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, +0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d, +0x6e,0xe, 0x6e,0x8f,0xdd,0x8e,0xe0,0x0, 0x1f,0xbb,0x17,0x1, 0xe0,0x1, 0xaf,0x1f, +0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f, +0xc0,0x10,0x8, 0xe1,0x8, 0xb1,0xc0,0x70,0xe0,0x3, 0x1f,0x2c,0x17,0x9c,0x3f,0x9e, +0xf0,0x3, 0x80,0x4e,0xf0,0x0, 0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf, +0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff, +0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf, +0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x2, 0x6f,0x10, +0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, +0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, +0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdd,0x43,0xe0,0x0, 0x1f,0xbb, +0x17,0x2, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, +0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x0, 0x0, 0x8, 0xb2,0xe0,0x0, +0x19,0x3b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0xe2,0x0, 0xcc,0x1, 0xaf,0x22, +0xaf,0xb2,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, 0xaf,0x82,0xe0,0x1, +0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82,0xe0,0x2, 0xaf,0x92,0x1, 0x20, +0x4, 0x9d,0xe2,0x0, 0xcc,0x2, 0x1, 0x18,0x17,0x80,0xe0,0x2, 0xaf,0x92,0x17,0x80, +0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, 0x8f,0x5e,0xe0,0x2, +0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, 0xc7,0xff,0x8f,0x2, +0x3f,0xfe,0x4, 0xf1,0x9, 0x61,0xdf,0x7f,0x0, 0xe8,0xde,0xe9,0x0, 0xe6,0xdf,0x30, +0x0, 0xe4,0x8, 0xb2,0xe0,0x0, 0x1f,0xbb,0xe0,0x2, 0x8f,0xcf,0x27,0x96,0xe0,0x2, +0x1f,0x3a,0x8f,0xe, 0xe2,0x0, 0xcf,0x2, 0x1, 0x27,0xe0,0x1, 0x1f,0x4c,0xc7,0x82, +0x8f,0xe, 0x37,0xa1,0x3f,0x98,0x86,0x8f,0x37,0x41,0xc7,0x1, 0x16,0x60,0xe2,0x0, +0xc7,0x1f,0x3e,0xdc,0x3f,0x4d,0xaf,0xf, 0xe0,0x2, 0x1f,0xc8,0x89,0xf, 0xe2,0x0, +0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xcd,0xe2,0x0, +0xc7,0x81,0x2f,0x9b,0x14,0x8a,0x14,0x3, 0xe0,0x6, 0xda,0x24,0x14,0x8a,0x14,0x4, +0x9, 0x21,0xe0,0xd4,0x0, 0x9f,0x3f,0x1f,0xe0,0x1, 0x1f,0xcc,0x37,0x21,0x8f,0x8f, +0x3c,0x1e,0xc7,0x81,0x87,0x8, 0x37,0x81,0xc7,0x81,0x16,0xe0,0xe2,0x0, 0xc7,0x9f, +0x3f,0x5d,0x3f,0xce,0xaf,0x88,0x0, 0xd9,0x97,0x8e,0xe7,0x0, 0x16,0x80,0xe3,0xbf, +0xc7,0xff,0xb7,0x8e,0x3c,0xe2,0x97,0x8e,0x14,0x3, 0x3f,0xcd,0xb7,0x8e,0xe0,0x6, +0xda,0x1, 0x3c,0xe2,0x14,0x4, 0x9, 0x21,0xe0,0xd3,0x0, 0xfc,0x8, 0xb1,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x27,0x99,0xe0,0x2, 0x1f,0xba,0x8f,0x8f,0x27,0xaf,0xe0,0x2, +0x1f,0x48,0x16,0x82,0x8f,0x8e,0xe0,0x2f,0x3f,0x8d,0x2f,0xa8,0x17,0x83,0xe0,0x2f, +0x3c,0xf, 0x2f,0xa4,0x8f,0x8e,0x17,0x1, 0xe0,0x2f,0x3f,0x8e,0x2f,0x9f,0x17,0x86, +0xe0,0x28,0x3c,0xf, 0x2c,0x1b,0xe0,0x7, 0xd4,0x33,0xe0,0x0, 0xdd,0x61,0xe0,0x3, +0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0xe7,0xfb,0x16,0x7f,0xa7,0x4f,0x97,0x8d, +0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0x17,0x1, 0xe0,0x0, +0x1f,0xbb,0xaf,0x3f,0x8, 0xa1,0xe0,0xda,0x0, 0xb3,0xe0,0x7, 0xd4,0x19,0xe0,0x0, +0xdd,0x47,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0xe7,0xfb,0x16,0x7f, +0xa7,0x4f,0x97,0x8d,0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d, +0x17,0x1, 0xe0,0x0, 0x1f,0xbb,0xaf,0x3f,0x8, 0xa1,0xe0,0xda,0x0, 0xab,0x8, 0xb3, +0xc0,0x70,0xe2,0x0, 0xcc,0x2, 0x39,0x68,0xe0,0x0, 0x5, 0xce,0xe2,0x0, 0xc9,0x6, +0x14,0x0, 0x5, 0x83,0xc0,0x10,0x9, 0xe1,0xe0,0x2, 0x1f,0xc8,0x17,0xe, 0x8f,0x8f, +0xe2,0x0, 0x7c,0x4, 0x3f,0x3f,0xe0,0x3, 0x1f,0xac,0x3f,0x9e,0xf0,0x0, 0x81,0xf, +0xf0,0x0, 0x81,0x9f,0xf0,0x0, 0x82,0x2f,0xf0,0x0, 0x82,0xbf,0xf0,0x0, 0x83,0x4f, +0xf0,0x0, 0x83,0xdf,0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f,0xe0,0x1, 0x86,0x2f, +0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0x81,0xef,0x84,0xff,0xe0,0x1, 0x87,0xdf, +0xf0,0x0, 0x69,0x4, 0xf0,0x0, 0x69,0x85,0xf0,0x0, 0x6a,0x6, 0xf0,0x0, 0x6a,0x87, +0xf0,0x0, 0x6b,0x8, 0xf0,0x0, 0x6b,0x89,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f, +0x6f,0x10,0x6f,0x91,0x6c,0x8b,0x69,0x8a,0xdf,0x15,0xe2,0x0, 0x7c,0x84,0x3c,0x62, +0xdc,0xbe,0xe2,0x0, 0x7c,0x4, 0xe0,0x6, 0xdc,0x44,0x3c,0x62,0xdf,0x60,0x14,0x1, +0xc0,0x10,0x9, 0xe1,0x11,0x8e,0xe0,0x3, 0x1f,0xac,0x39,0xb8,0x39,0x9f,0x3c,0x63, +0xdf,0x1, 0x3c,0x63,0xe0,0x6, 0xdc,0x35,0x3c,0x62,0xdf,0x51,0x14,0x1, 0xc0,0x10, +0x9, 0xe1,0x8, 0xb2,0xe0,0x3, 0x1f,0x47,0xe0,0x2, 0x1f,0x94,0x8e,0x8e,0x87,0x6f, +0xe2,0x0, 0xc6,0x87,0x36,0xa5,0xe2,0x0, 0xc7,0x1f,0x3f,0x4d,0xaf,0x6f,0x16,0x60, +0x9f,0x3f,0x86,0xef,0x37,0x48,0xc7,0x1, 0xe2,0x0, 0xc7,0x1f,0x3e,0xdc,0x3f,0x4d, +0xaf,0x6f,0x9f,0x3f,0x37,0x48,0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xcf,0x1f,0x1, 0x85, +0x87,0x6f,0x3f,0x5c,0xcf,0x4, 0xaf,0x6f,0x17,0x80,0xe0,0x0, 0x19,0x3b,0x17,0x7f, +0xaf,0xb2,0x14,0x0, 0xaf,0x92,0xaf,0x22,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2, +0xe0,0x1, 0xaf,0x82,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82, +0xe0,0x1, 0xd0,0xb2,0x8f,0x12,0x8f,0x82,0x3f,0x7f,0x4, 0x87,0x17,0x83,0x14,0x1, +0xaf,0xb2,0x9, 0x21,0xe0,0x21,0x0, 0xa8,0x8f,0x92,0x37,0xa5,0x3f,0x92,0xa4,0x6f, +0xe2,0x1, 0xc4,0x7f,0xdf,0x55,0xe2,0x0, 0xcc,0x1, 0x1, 0xf1,0x14,0x1, 0x9, 0x21, +0xe0,0x21,0x0, 0x9a,0x8, 0xb5,0xe0,0x0, 0x19,0x3b,0x3a,0xe8,0x8f,0xb2,0xe2,0x0, +0xcf,0x81,0x1, 0x97,0xe0,0x2, 0x19,0x92,0xe0,0x3, 0x1a,0x38,0x97,0x83,0xe2,0x0, +0xc7,0x81,0x2f,0x87,0xa7,0x84,0xe0,0x4, 0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x27,0x83, +0xe0,0x1, 0xd0,0x48,0xe0,0x3, 0xd9,0x37,0x8f,0xb2,0xe2,0x0, 0xcf,0x81,0x1, 0x6f, +0x2a,0x82,0xa, 0xe1,0xa, 0xa1,0xe0,0xd6,0x0, 0xfb,0x8, 0xb1,0xe0,0x2, 0x1f,0x92, +0x97,0x8f,0xe2,0x0, 0xc7,0x81,0x2f,0xa0,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x4, +0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x2f,0x98,0xe0,0x3, 0xd9,0x1d,0xe0,0x0, 0x1f,0x3b, +0xe0,0x2, 0x8c,0x1e,0x24,0x10,0x8f,0xce,0x27,0x84,0x0, 0x91,0x8e,0xcc,0x2e,0x8f, +0xe0,0x2, 0x8e,0x9e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe0,0xc, 0x3f,0x1f, +0x2, 0xf6,0x14,0x0, 0x8, 0xe1,0xe0,0x1, 0xd0,0x15,0x0, 0xe7,0x14,0x1, 0x8, 0xe1, +0xe2,0x0, 0xcc,0x5, 0x2, 0x87,0xe0,0x0, 0x1f,0xbb,0x3c,0x1f,0xe0,0x2, 0x8c,0x28, +0x38,0x82,0x14,0x0, 0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x1f,0x92,0x39,0x68,0x97,0x8f, +0xe2,0x0, 0xc7,0x81,0x2f,0x9f,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x4, 0xa7,0xff, +0xe2,0x0, 0xc7,0x81,0x2f,0x97,0xe0,0x3, 0xd8,0xe6,0xe2,0x0, 0xc9,0x5, 0xe0,0x0, +0x1f,0xbb,0x17,0x0, 0x2, 0x84,0x39,0x1f,0xe0,0x2, 0x8f,0x22,0xe0,0x2, 0x8e,0x9f, +0x14,0x1, 0x3e,0xfe,0x5, 0x86,0x3f,0x9e,0x8c,0x4f,0x17,0x80,0xe1,0x28,0x3c,0xf, +0x9, 0x61,0xe0,0x0, 0xdf,0xdf,0x0, 0xe8,0x8, 0xb1,0xe0,0x6, 0xdb,0x19,0xe0,0x0, +0x1f,0xbb,0x16,0x83,0xae,0xbf,0x17,0x2, 0xaf,0x4f,0x16,0x80,0xaf,0x5f,0xaf,0x6f, +0xaf,0x7f,0xe0,0x2, 0x1e,0x12,0xe0,0x1, 0xaf,0xf, 0x97,0x8c,0xe0,0x3, 0x1f,0x1d, +0xe3,0xff,0xc7,0xef,0xb7,0x8c,0x97,0x8e,0xe3,0xff,0xc7,0xdf,0xb7,0x8e,0xe0,0x2, +0x1f,0xb3,0xae,0x8f,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xe0,0x0, 0x1f,0x90,0xae,0x8f, +0xe7,0x7f,0x16,0xff,0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0x8, 0xe1,0xe0,0x0, 0x1f,0xbb, +0x8f,0x3f,0xe2,0x0, 0xcf,0x1, 0x1, 0x2, 0x38,0x82,0x87,0x1f,0xaf,0x2f,0xe0,0x1, +0x8f,0x7f,0xc7,0x1, 0xe0,0x1, 0xaf,0x7f,0xe0,0x1, 0x8f,0x6f,0xc7,0x1, 0xe0,0x1, +0xaf,0x6f,0xe0,0x1, 0x8e,0xef,0x8f,0x1f,0x37,0x25,0x3f,0x1f,0xe0,0x6, 0x8f,0x5e, +0x3e,0xfe,0x4, 0xeb,0x17,0x0, 0xe0,0x1, 0xaf,0x6f,0x8f,0x1f,0xc7,0x1, 0xaf,0x1f, +0x8e,0x9f,0x8f,0xf, 0x3e,0xfe,0x3, 0xe1,0x17,0x3, 0xaf,0x3f,0x38,0x82,0x0, 0x0, +0x8, 0xb4,0xc0,0x7c,0xe0,0x0, 0x19,0x3b,0xe0,0x1, 0x89,0xf2,0x8f,0xa2,0x8f,0x32, +0xe2,0x0, 0xcf,0x1, 0x1, 0x3, 0xc0,0x4, 0xa, 0x61,0x8e,0x22,0x8e,0x82,0x3e,0x7d, +0xe0,0x0, 0x3, 0xc7,0x37,0xa3,0x8e,0xa2,0x3f,0x93,0xc7,0x87,0x36,0xa5,0x37,0xa2, +0x3e,0x92,0x3f,0x92,0xe0,0xb, 0x39,0x13,0xa6,0x6d,0xa4,0x8f,0xe0,0x1, 0x8f,0x9b, +0xe0,0x3, 0x1e,0xac,0xe4,0x0, 0xc7,0x87,0x3f,0x93,0xc7,0x82,0x37,0xa1,0x3f,0x9d, +0x8c,0x1f,0xe0,0x4, 0x34,0x47,0x24,0xac,0xe0,0x1, 0x17,0xff,0x3f,0xdc,0xe0,0x3, +0x1e,0xc1,0xe2,0x0, 0xcf,0x86,0xaf,0xd, 0x2, 0xa3,0x37,0x3f,0xe2,0x0, 0xc7,0x57, +0x27,0x1f,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8a, +0xe0,0x2, 0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0x5, 0x9f,0x3c,0x64,0xd8,0x18,0xe0,0x2, 0x1f,0x92,0x39,0x92,0x9f,0x8f,0x37,0xc4, +0xe2,0x0, 0xc7,0x81,0x27,0x92,0x17,0x2, 0xaf,0x43,0xe0,0x6, 0xda,0x71,0x8f,0x12, +0x8f,0x82,0x3f,0x7f,0xe7,0xff,0x4, 0xb1,0x17,0x2, 0xe0,0x0, 0x1f,0x99,0xaf,0x32, +0x17,0x0, 0xaf,0xf, 0xc0,0x4, 0xa, 0x61,0x17,0x81,0xaf,0xc3,0x0, 0xef,0xe0,0x2, +0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xdd,0x7c,0x81,0xe0,0x3, 0xd5,0xc3, +0xe0,0x1, 0x1f,0xd7,0x64,0x81,0xe0,0x1, 0xb4,0x2f,0x0, 0xd4,0x8, 0xb1,0xc0,0x68, +0xe0,0x2, 0x1f,0xfd,0xe9,0xff,0xc4,0x7e,0x87,0x5f,0x86,0xcf,0xe0,0xf, 0x34,0x41, +0x6f,0x5, 0x14,0x85,0x17,0x0, 0x7f,0x83,0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0x80, +0x6e,0x84,0x6f,0x6, 0x77,0x84,0xe0,0x6, 0xdc,0xbd,0xc0,0x18,0x8, 0xe1,0x0, 0x0, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0x1, 0x2e,0x9f,0xde,0xe0,0x3, 0x1e,0xb3,0xe2,0x0, 0xcc,0x2, +0xe0,0x3, 0x1f,0x32,0x3d,0xed,0xe0,0x6b,0x39,0x2e,0xe2,0x0, 0xcc,0x85,0x16,0x1, +0x36,0x39,0x2, 0x12,0x27,0x91,0x15,0x7f,0x3d,0x1f,0xe3,0xff,0xc5,0x7f,0x17,0x7f, +0xe2,0x1, 0xc6,0x7f,0x3f,0x1b,0x3d,0x1b,0x86,0x9e,0x3e,0xcc,0xe0,0x80,0xae,0x9e, +0x3f,0x7a,0x1, 0xfb,0x0, 0x83,0xe2,0x1, 0xc6,0x7f,0x16,0x86,0x3e,0x9f,0x3e,0x9b, +0x3f,0x9b,0x87,0xf, 0x3f,0x4c,0xe1,0x80,0xaf,0x1f,0x3e,0xff,0x1, 0xfb,0x38,0x82, +0x9f,0xee,0x0, 0xd3,0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, +0x8e,0xae,0xe2,0x0, 0xc7,0x81,0x3e,0xff,0x1, 0x3c,0x9f,0xde,0xe0,0x3, 0x1f,0x33, +0xe2,0x0, 0xcc,0x2, 0xe0,0x3, 0x1e,0xb2,0x3e,0x6e,0xe0,0x6c,0x39,0x2d,0xe2,0x0, +0xcc,0x85,0x14,0x1, 0x34,0x39,0x2, 0x18,0x27,0x97,0x14,0xff,0x3c,0x9f,0xe3,0xff, +0xc4,0xff,0xc4,0x81,0x3e,0xea,0x3f,0x6c,0x3c,0x9c,0xf0,0x41,0x3b,0x88,0x9d,0x8d, +0xc6,0x82,0xe2,0x9, 0xcd,0xaf,0x2, 0x85,0x85,0x8e,0xe8,0xb, 0x3d,0xd7,0xad,0x8e, +0xc7,0x1, 0x3f,0x79,0x1, 0xf5,0x17,0x6, 0xe0,0xd, 0x37,0xa1,0x3f,0x1f,0x3f,0x1c, +0x3f,0x9c,0x3d,0x1d,0xe0,0x41,0x3e,0x8, 0x9e,0x8a,0xc5,0x2, 0xe2,0x9, 0xce,0xaf, +0x2, 0x84,0x86,0x8f,0x3e,0xdc,0xae,0x8f,0xc7,0x81,0x3f,0x7f,0x1, 0xf6,0x38,0x82, +0x9f,0xee,0x0, 0xc5,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0x39,0x68,0xe0,0x1, 0xd0,0x3d, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0x3b,0x68,0xe0,0x0, 0x1, 0x77,0x95,0x5e,0xc5,0x6, 0xe3,0xff, +0xc5,0x7f,0xe2,0x0, 0xc9,0x2, 0xe0,0x3, 0x1c,0x32,0xe0,0x3, 0x1f,0xb3,0x14,0x80, +0xe0,0x68,0x39,0xaf,0xe0,0x7, 0xd1,0xe8,0xe0,0x0, 0x2b,0x62,0xe0,0x3, 0x1f,0xb8, +0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0x16,0x5f,0xa7,0x4f,0x97,0x8d,0x37,0x45,0xe2,0x0, +0xc7,0x20,0x3f,0xdc,0x3f,0xce,0xe0,0x3, 0x1a,0xb3,0xf0,0x1, 0x1c,0x7e,0xf0,0x1, +0x1c,0xfd,0xb7,0x8d,0x11,0x85,0xe0,0x13,0x13,0xc4,0x12,0x1, 0x3c,0x67,0xe0,0x5, +0xdb,0xf6,0x3c,0xe3,0x3c,0x62,0xdf,0x3d,0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd4,0xd6, +0xdd,0x81,0x23,0x2d,0x3c,0xe2,0x3c,0x64,0xde,0x27,0x24,0x7d,0xe8,0x40,0x3d,0x68, +0x3c,0xe3,0x3c,0x62,0xc1,0xff,0xdf,0x67,0xe0,0x43,0x39,0x83,0x3c,0xe3,0x3c,0x62, +0xdf,0x28,0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd4,0xc1,0x3c,0x64,0xdd,0xbc,0xe8,0x40, +0x3d,0x69,0x3c,0xe3,0x3c,0x62,0xdf,0x57,0xe0,0x1, 0xd0,0x49,0x2c,0xd, 0xc1,0xff, +0xe0,0x43,0x39,0x83,0xe2,0x0, 0xc9,0x80,0x3, 0x52,0xe0,0x3, 0x1c,0x33,0x3c,0xe2, +0xef,0xff,0xd4,0xac,0x2b,0xc, 0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x3c,0x64,0xdd,0xa3, +0xe8,0x40,0x3d,0x68,0x3c,0xe3,0x3c,0x62,0xdf,0x3e,0x0, 0xe7,0xe0,0x0, 0x1f,0xcd, +0x8c,0xf, 0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xf8,0x0, 0x82,0xda,0x10,0x13,0x1, +0xe7,0xff,0x0, 0x9e,0x95,0x6e,0xc5,0x6, 0xe3,0xff,0xc5,0x7f,0xe7,0xff,0x0, 0x8b, +0x8, 0xb3,0xe0,0x2, 0x1f,0xc2,0x17,0x0, 0x39,0xe8,0xb7,0xf, 0xe0,0x2, 0xd9,0xf3, +0xe2,0x0, 0xcc,0x1, 0x39,0x68,0x1, 0x3, 0x3c,0x62,0x9, 0xe1,0x3c,0x63,0xdf,0x63, +0x3c,0x62,0x9, 0xe1,0x8, 0xb4,0xe0,0x2, 0x1f,0xc8,0x89,0xf, 0xe0,0x1, 0xd0,0x7, +0x2c,0x19,0xe0,0x2, 0x19,0xfb,0x14,0x1, 0x8f,0x83,0x37,0xd2,0x3f,0xd8,0x2f,0x82, +0xa, 0x61,0xe0,0x2, 0x1f,0x77,0xe0,0x4, 0x34,0x32,0x8f,0x8e,0xe2,0x1, 0xc2,0x7f, +0x3f,0xc4,0xaf,0x8e,0xdd,0x60,0xe2,0x0, 0xc9,0x1, 0x1, 0x12,0x3c,0x62,0xdf,0xd1, +0x2c,0x3, 0x14,0x0, 0xa, 0x61,0xe0,0x0, 0xdf,0xea,0x2c,0x7c,0x8f,0x83,0xe3,0x4, +0x3f,0xd4,0xaa,0x3, 0xd6,0x41,0xe0,0x0, 0xdf,0x33,0x14,0x1, 0xa, 0x61,0x3c,0x62, +0xe0,0x3, 0xd4,0xe2,0xe0,0x2, 0x1f,0xe7,0xa9,0xf, 0x0, 0xe9,0x8, 0xb5,0xe0,0x2, +0x1f,0xc8,0x3a,0xe8,0x89,0xf, 0xe0,0x0, 0xdf,0xd2,0x2c,0x17,0xe0,0x2, 0x1a,0x77, +0x39,0xe8,0x8f,0x84,0x14,0x1, 0x37,0xd2,0x3f,0xd8,0x2f,0x82,0xa, 0xe1,0xdd,0x33, +0xe2,0x0, 0xc9,0x1, 0x1, 0x86,0xe0,0x2, 0x1f,0xe7,0x8f,0xf, 0x27,0x39,0xa9,0x8f, +0x3c,0x62,0xe0,0x2, 0xd9,0xc5,0x2c,0x3, 0x14,0x0, 0xa, 0xe1,0xe0,0x2, 0x1f,0xea, +0x3c,0x62,0x8c,0x8f,0xe0,0x2, 0xda,0xb4,0x3c,0xe2,0x14,0x0, 0xef,0xfd,0xd8,0x20, +0xe0,0x2, 0x1f,0x81,0xe0,0x1, 0x1d,0x6f,0xe0,0x1, 0x1c,0xf0,0xa4,0xf, 0x3d,0xe2, +0xef,0xfd,0xd2,0xac,0x24,0x6a,0xe0,0x2, 0x1f,0xac,0x3c,0x62,0x8c,0x8f,0xe0,0x2, +0xda,0x9f,0xe0,0x0, 0xdf,0x9c,0x2c,0x61,0x2a,0x97,0x3c,0x62,0xe0,0x2, 0xd9,0xf3, +0x14,0x0, 0xe0,0x2, 0xd8,0x7f,0x8f,0x84,0x11,0x81,0xe0,0x2, 0x31,0xb2,0xe3,0x2, +0x3f,0xd2,0xa9,0x4, 0xe0,0x0, 0xde,0xdc,0xd5,0xe7,0x3c,0x63,0xa, 0xe1,0x3c,0x62, +0xe0,0x3, 0xd4,0x8a,0x0, 0xc6,0xdc,0x9e,0x0, 0xe9,0x8, 0xb3,0xe0,0x3, 0xd4,0xd6, +0xe0,0x0, 0xdf,0x8c,0xe0,0x2, 0x1f,0xfb,0x8f,0x8f,0x27,0x8b,0xe0,0x13,0x11,0x44, +0x0, 0x86,0x3c,0x62,0xe0,0x5, 0xda,0xfb,0xe0,0x0, 0xdf,0x80,0xdf,0x64,0x24,0x7a, +0xe0,0x2, 0x1f,0xf7,0x11,0x1, 0x8f,0x8f,0xe0,0x13,0x11,0xc4,0x2f,0x87,0x0, 0x89, +0x3c,0x63,0xe0,0x5, 0xda,0xec,0xe0,0x0, 0xdf,0x71,0x3c,0x62,0xdf,0x88,0x24,0x79, +0x9, 0xe1,0xe0,0x2, 0x1f,0x91,0x16,0x7e,0xa6,0x8f,0xe0,0x0, 0x1f,0xbd,0xa7,0x1d, +0xa7,0x8f,0xcf,0x40,0xbf,0x1d,0x17,0x0, 0xaf,0x7f,0x15,0xfd,0xa7,0xf, 0xe0,0x1, +0x1e,0xdc,0x3f,0x5c,0xbf,0xf, 0xa7,0xf, 0xa6,0x8d,0x3f,0x5b,0xbf,0xf, 0xe0,0x1, +0xa7,0xd, 0x37,0x48,0xe2,0x0, 0xc7,0x1, 0x2f,0x1c,0xe0,0x1, 0x1f,0x42,0x87,0xe, +0xe2,0x1, 0xc7,0x7e,0xe0,0x1, 0xaf,0x3f,0x17,0x8, 0xe0,0x61,0x3f,0x11,0x17,0x10, +0xe0,0x61,0x3f,0x11,0xa7,0x4f,0xcf,0x10,0xbf,0x4f,0xe0,0x61,0x3f,0x82,0xcf,0x88, +0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82,0xcf,0x90,0xe0,0x61,0x3f,0x92,0x38,0x82, +0xe0,0x1, 0xa7,0xd, 0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x2f,0x60,0xe0,0x1, 0x1f,0x42, +0xe0,0x1, 0x87,0x4e,0x3e,0x5e,0xe0,0x1, 0xae,0x3f,0x0, 0xdf,0xd, 0xbf,0xe0,0x2, +0x1f,0x91,0xa7,0x8f,0xa7,0x6f,0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x5c,0xa6,0x8e,0xe0,0x2, 0xa7,0xd, 0x37,0x49,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, +0x2f,0x57,0xa7,0x6f,0x37,0x41,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x41,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x32, +0xa7,0x6f,0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x16,0xa7,0x6f, +0xe2,0x0, 0xc7,0x1, 0x27,0xa, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x7e,0xa7,0x6f,0x37,0x48,0xe2,0x0, 0xc7,0x1, +0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x48,0xe2,0x0, +0xc7,0x1, 0xe0,0x2, 0x2f,0x62,0xa7,0x6f,0x37,0x43,0xe2,0x0, 0xc7,0x1, 0x27,0xb, +0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, +0xe0,0x2, 0x2f,0x48,0xa7,0x6f,0x37,0x42,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x42,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, +0x2f,0x25,0xa7,0x6f,0x37,0x47,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x9, +0xa7,0x6f,0x37,0x4b,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x4b,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x60,0xa7,0x6f, +0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, +0xa7,0xe, 0x37,0x4d,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x44,0xa7,0x6f,0x37,0x4d, +0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x28,0xa7,0x6f,0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4e, +0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0xc, 0xa7,0x6f,0x37,0x4f,0xe2,0x0, 0xc7,0x1, +0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4f,0xe2,0x0, +0xc7,0x1, 0xe0,0x0, 0x2f,0x69,0xa7,0x6f,0x37,0x44,0xe2,0x0, 0xc7,0x1, 0x27,0xb, +0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x44,0xe2,0x0, 0xc7,0x1, +0xe0,0x0, 0x2f,0x4f,0xa7,0x6f,0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x27,0xa, 0xe0,0x1, +0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x2f,0x29, +0xa7,0x6f,0x37,0x46,0xe2,0x0, 0xc7,0x1, 0x27,0x1f,0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x46,0xe2,0x0, 0xc7,0x1, 0x27,0x16,0xa7,0x5f,0xa6,0xdf, +0x37,0x46,0xe2,0x0, 0xc7,0x1, 0xe7,0xff,0x16,0x3f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc, +0x37,0x26,0x3f,0x4d,0xbf,0x5f,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f, +0x9f,0x8d,0xcf,0xc0,0xb7,0x8d,0x17,0x81,0xe0,0x61,0x3f,0x91,0xf, 0xab,0x38,0x0, +0xa7,0x5f,0xa6,0xdf,0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe7,0xfe,0x16,0x7f,0xe4,0x0, +0xcf,0x1, 0x3e,0xdc,0x37,0x27,0x3f,0x4d,0xbf,0x5f,0x16,0x5f,0xa7,0x6f,0xe0,0x2, +0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x20,0xb7,0xd, 0x0, 0xc2,0xa7,0x6f, +0x16,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x10,0xb7,0xd, +0xe7,0xff,0x0, 0xaa,0xa7,0x6f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xe0,0x2, 0x1e,0xbd, +0xbf,0x6f,0x17,0x1, 0xe0,0x0, 0x1e,0x21,0xaf,0xd, 0xe0,0x2, 0x1e,0xe9,0xaf,0xc, +0x9f,0xd, 0xe1,0x0, 0xcf,0x0, 0xb7,0xd, 0xe7,0xff,0x0, 0x87,0xa7,0x6f,0xe7,0x7f, +0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x80,0xcf,0x0, +0xb7,0xd, 0xe7,0xfe,0x0, 0xeb,0xa7,0x6f,0xe7,0xbf,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x40,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0xcf, +0xa7,0x6f,0xe7,0xdf,0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, +0xe0,0x20,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0xb3,0xa7,0x5f,0xa6,0xdf,0x37,0x4f, +0xe2,0x0, 0xc7,0x1, 0xe6,0xff,0x16,0x7f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc,0x37,0x2f, +0x3f,0x4d,0xbf,0x5f,0xe7,0xef,0x16,0x7f,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c, +0xbf,0x6f,0x9f,0xd, 0xe0,0x10,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0x8a,0xa7,0x6f, +0xe7,0xfe,0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x1, +0xcf,0x0, 0xb7,0xd, 0xe7,0xfd,0x0, 0xee,0xa6,0xef,0xe0,0x0, 0x1f,0x2f,0x16,0x7b, +0xa7,0xe, 0x3e,0xdc,0xbe,0xef,0xa6,0x9e,0xe0,0x2, 0x1e,0x69,0xce,0x81,0xbe,0x9e, +0xa6,0x9e,0xce,0x90,0xbe,0x9e,0x9f,0xc, 0xcf,0x4, 0xb7,0xc, 0xe7,0xfd,0x0, 0xcb, +0xa7,0x6f,0x16,0x77,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x8, +0xb7,0xd, 0xe7,0xfd,0x0, 0xb1,0xa7,0x6f,0xe7,0xfd,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x2, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfd,0x0, 0x95, +0xa7,0x6f,0x16,0x7e,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x1, +0xb7,0xd, 0xe7,0xfc,0x0, 0xfb,0xa7,0x6f,0xe7,0xf7,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x8, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfc,0x0, 0xe1, +0xe0,0x2, 0x1f,0xc, 0x16,0x81,0xae,0x8e,0x16,0x5f,0xe0,0x0, 0x1f,0x3d,0xa6,0x8e, +0xa7,0xd, 0x3f,0x5c,0xbf,0xd, 0x16,0x7d,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c, +0xbf,0x6f,0x9f,0xd, 0xcf,0x2, 0xb7,0xd, 0xe7,0xfc,0x0, 0xbc,0xe0,0x1, 0xa7,0x6d, +0xe7,0xef,0x15,0xff,0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6d,0xe0,0x1, 0xa7,0x6d, +0xe0,0x2, 0x1e,0x69,0x3f,0x5b,0xe0,0x1, 0xbf,0x6d,0xe7,0xfb,0x16,0xff,0xa7,0x6f, +0x3f,0x5d,0xbf,0x6f,0x9f,0xc, 0xe0,0x4, 0xcf,0x0, 0xb7,0xc, 0xe7,0xfc,0x0, 0x93, +0xf, 0x3f,0xe0,0x2, 0x1f,0x14,0x97,0xde,0xe0,0x40,0xcf,0x80,0xb7,0xde,0x17,0x82, +0xe0,0x61,0x3f,0x91,0xf, 0xae,0x38,0x0, 0xf, 0xbf,0x17,0x84,0xe0,0x61,0x3f,0x91, +0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0x17,0xa0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0xf, 0xbf,0xe0,0x0, 0x17,0xc0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xe, 0x3f, +0xe0,0x2, 0x1f,0x42,0xe0,0x0, 0x1e,0xaa,0x9f,0x8e,0xe0,0x2, 0x1e,0x47,0xc7,0x81, +0xb7,0x8e,0x9f,0x8d,0x9f,0xc, 0xc7,0x81,0xb7,0x8d,0x27,0x3, 0xc7,0x7f,0xb7,0xc, +0xe0,0x3, 0x1f,0x96,0x8f,0xf, 0x27,0x4, 0x8f,0xf, 0xc7,0x7f,0xaf,0xf, 0x8f,0x8f, +0x2f,0x86,0xe0,0x2, 0x1f,0x12,0x97,0x8e,0xcf,0x88,0xb7,0x8e,0xe0,0x2, 0x1e,0xec, +0xe0,0x2, 0x1f,0x39,0x9f,0x8d,0xc7,0x81,0xb7,0x8d,0x9f,0x8e,0x27,0x84,0x9f,0x8e, +0xc7,0xff,0xb7,0x8e,0xe0,0x3, 0x1f,0xad,0x9f,0xf, 0x27,0x4, 0x9f,0xf, 0xc7,0x7f, +0xb7,0xf, 0xe0,0x3, 0x1f,0x81,0xe0,0x0, 0x1f,0x40,0xa7,0x8f,0x97,0xe, 0xb7,0x3f, +0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe0,0x2, +0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xac,0x38,0x0, 0xf, 0xbf,0xe0,0x4, 0x17,0x80, +0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x8, 0x17,0x80,0xe0,0x61, +0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x10,0x17,0x80,0xe0,0x61,0x3f,0x91, +0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x80,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf, +0x38,0x0, 0xf, 0xbf,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x2, 0xdf,0xf9,0x17,0x88,0xe0,0x61,0x3f,0x91, +0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x3, +0xd0,0x28,0x17,0x90,0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, +0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x2, 0x1f,0xe4,0xe7,0xfe,0x16,0xff,0xa7,0xf, +0xa7,0xbe,0x3f,0xdd,0xbf,0xbe,0xe0,0x5, 0xd7,0xfa,0xe0,0x40,0x17,0x80,0xe0,0x61, +0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x3f,0x83,0xe0,0x1, 0x1f,0xd4, +0xe0,0x6, 0x8f,0xf, 0xc7,0x7f,0xe0,0x6, 0xaf,0xf, 0xe0,0x6, 0x8f,0xf, 0x37,0x24, +0x3f,0x1f,0xa7,0xe, 0xe0,0x60,0x3f,0x19,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f, +0xa7,0x1e,0xe0,0x60,0x3f,0x1a,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f,0xa7,0x2e, +0xe0,0x60,0x3f,0x18,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x9e,0xa7,0xbf,0xe0,0x61, +0x3f,0x92,0x3b,0x0, 0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1d,0x5, 0x16,0x84,0xae,0x8a, +0x17,0x81,0xaf,0x9a,0x17,0x2, 0xaf,0xaa,0xf0,0x0, 0x13,0x80,0xae,0xba,0xf8,0x40, +0x3a,0xe7,0xae,0xca,0x14,0x1, 0xaf,0x5a,0xaf,0x6a,0xaf,0x7a,0xe0,0x1, 0xaf,0xa, +0x17,0x3, 0xe0,0x1, 0xaf,0x9a,0xe0,0x1, 0xaf,0xaa,0xe0,0x1, 0xaf,0xba,0xe0,0x1, +0xaf,0xca,0xe0,0x1, 0xaf,0xda,0x17,0x80,0xe0,0x1, 0xaf,0x6a,0xf0,0x2, 0x1b,0x71, +0xe0,0x1, 0xaf,0xfa,0xf0,0xb, 0x33,0xa2,0xe8,0xb, 0x3d,0x96,0xf0,0x0, 0xba,0x8b, +0xe0,0x0, 0x17,0x80,0xe8,0x9, 0x3d,0x17,0xe0,0xe, 0x3d,0x1f,0x8e,0xe, 0x8e,0x89, +0xe0,0xe, 0x34,0x3f,0x3e,0x7d,0xc7,0x81,0x5, 0x84,0xa6,0x8b,0x3f,0x4d,0xbf,0xb, +0xe2,0x0, 0xcf,0x90,0x1, 0xf2,0xf0,0x0, 0xc3,0x81,0xf2,0x0, 0xcb,0x90,0x1, 0xe3, +0xe0,0x1, 0x1f,0xd4,0x17,0x0, 0xe0,0x6, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x71, +0xe0,0xf, 0x34,0x22,0x3f,0x1f,0xa7,0x8e,0x27,0xb3,0x3f,0x83,0xe0,0x1, 0x1f,0xd4, +0xe0,0x6, 0x8e,0x8f,0xe0,0x60,0x3e,0x9, 0x36,0xa4,0x3e,0x9f,0xbe,0xd, 0xe0,0x6, +0x8e,0x8f,0xe0,0x60,0x3e,0xa, 0x36,0xa4,0x3e,0x9f,0xbe,0x1d,0xe0,0x6, 0x8e,0x8f, +0xe0,0x60,0x3e,0x8, 0x36,0xa4,0x3e,0x9f,0xbe,0x2d,0xe0,0x6, 0x8e,0x8f,0xe0,0x61, +0x3e,0x2, 0x36,0xa4,0x3e,0x9f,0xbe,0x3d,0xe0,0x6, 0x8e,0x8f,0xc6,0x81,0xe0,0x6, +0xae,0x8f,0xa7,0x8e,0xe0,0x61,0x3f,0x92,0x17,0x81,0xe0,0x8, 0x37,0xb8,0xe0,0x61, +0x3c,0x11,0xe0,0x60,0x3f,0x80,0xcf,0x82,0xe0,0x60,0x3f,0x90,0x3b,0x0, 0x38,0x82, +0x8, 0xb4,0xe8,0x0, 0xc, 0x37,0xe0,0x3, 0x1f,0xb8,0xa1,0xf, 0xa7,0xb2,0x37,0xcf, +0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0xe0,0x0, +0x2f,0xf2,0xa7,0xb2,0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0xe2,0x0, 0xc7,0x81, +0xe0,0x0, 0x2f,0xf1,0xa7,0xb2,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82, +0x37,0xc1,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xed,0xa7,0xb2,0x37,0xca,0xe2,0x0, +0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xca,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xe9, +0xa7,0xb2,0x37,0xcb,0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0x37,0xcb,0xe2,0x0, +0xc7,0x81,0x2f,0xbd,0xa7,0xb2,0x37,0xcc,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82, +0x37,0xcc,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xe6,0xa7,0xb2,0x37,0xc7,0xe2,0x0, +0xc7,0x81,0x27,0xa5,0xa7,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0xa0,0xa7,0x92, +0xe0,0x0, 0x1a,0x10,0xe0,0x1, 0xcf,0x80,0xbf,0x92,0x8f,0x84,0xe0,0x2, 0x19,0x92, +0x27,0x89,0x99,0x3, 0x31,0x4c,0xe2,0x0, 0xc1,0x1, 0x29,0x4, 0xe0,0x6, 0xd5,0x28, +0xa9,0x4, 0x97,0x83,0xe0,0x3, 0x1f,0x37,0xe3,0xdf,0xc7,0xff,0xb7,0x83,0x97,0x83, +0xe3,0xbf,0xc7,0xff,0xb7,0x83,0x9f,0x8e,0xc7,0x81,0xb7,0x8e,0xe0,0x1, 0x17,0x80, +0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0xa, 0x21,0x38,0x0, 0xa7,0x92,0xe0,0x3, +0x1f,0x1d,0xe0,0x10,0xcf,0x80,0xbf,0x92,0x97,0x8e,0xcf,0xa0,0xb7,0x8e,0xe7,0xff, +0x0, 0xbb,0xa7,0x92,0xe1,0x0, 0xcf,0x80,0xbf,0x92,0xe0,0x0, 0xd9,0x1f,0xe7,0xff, +0x0, 0x8a,0xa7,0x92,0xcf,0x81,0xbf,0x92,0xe0,0x0, 0xd9,0x5, 0xe7,0xff,0x0, 0x8c, +0xa7,0x92,0xcf,0x82,0xbf,0x92,0xe0,0x0, 0xd9,0x11,0xe7,0xff,0x0, 0x90,0xa7,0x92, +0xe0,0x2, 0x19,0x92,0xe0,0x8, 0xcf,0x80,0xbf,0x92,0x97,0x83,0xe0,0x2, 0x1f,0x14, +0xcf,0x82,0xb7,0x83,0x97,0xce,0xcf,0x88,0xb7,0xce,0xe0,0x0, 0xd8,0xdb,0xe7,0xff, +0x0, 0x89,0xa7,0x92,0x14,0x7, 0xe0,0x20,0xcf,0x80,0xbf,0x92,0xdf,0x18,0xe0,0x3, +0x1e,0x9d,0xe0,0x2, 0x19,0x92,0x9f,0xd, 0x97,0x83,0x16,0x6f,0x37,0x41,0xe2,0x0, +0xc7,0x10,0x3f,0xdc,0x3f,0xce,0xb7,0x83,0x97,0x8d,0xe3,0xff,0xc7,0xdf,0xb7,0x8d, +0xd9,0xe, 0xd9,0x37,0xa7,0x92,0xe0,0x2, 0x1f,0x14,0xe0,0x20,0xcf,0x80,0xbf,0x92, +0xe7,0x0, 0x16,0x80,0x97,0xde,0x3f,0xcd,0xb7,0xde,0xe0,0x2, 0x1f,0xf1,0xa7,0xff, +0x2f,0x87,0xe0,0x1, 0x17,0x80,0xe0,0x61,0x3f,0x91,0xe7,0xfe,0x0, 0xf0,0xde,0x7e, +0xe7,0xfe,0x0, 0xed,0x8, 0xb1,0xe0,0x6, 0xdc,0x84,0xe0,0x60,0x3f,0x87,0xe0,0x1, +0x1f,0x50,0xe0,0x1, 0xbf,0xf, 0xe0,0x2, 0x1f,0x65,0xe0,0x1, 0xbf,0x1f,0xe0,0x3, +0x1f,0x11,0xe0,0x1, 0xbf,0x2f,0xe0,0x1, 0x1f,0x4b,0xe0,0x1, 0xbf,0x3f,0xe0,0x3, +0x1f,0x14,0xe0,0x1, 0xbf,0x4f,0xe0,0x0, 0x1f,0x49,0xe0,0x1, 0xbf,0x5f,0xe0,0x0, +0x1f,0x14,0xe0,0x1, 0xbf,0x6f,0xe0,0x2, 0x1f,0x2a,0xe0,0x1, 0xbf,0x7f,0xe0,0x2, +0x1f,0x1d,0xe0,0x2, 0xbf,0xf, 0xe0,0x2, 0x1f,0x61,0xe0,0x2, 0xbf,0x1f,0xe0,0x2, +0x1f,0x2, 0xe0,0x2, 0xbf,0x2f,0xe0,0x3, 0x1f,0x42,0xe0,0x2, 0xbf,0x3f,0xe0,0x0, +0x1f,0x35,0xe0,0x2, 0xbf,0x4f,0xe0,0x2, 0x1f,0x6e,0xe0,0x2, 0xbf,0x5f,0xe0,0x0, +0x1f,0x36,0xe0,0x2, 0xbf,0x6f,0x8, 0xe1,0xe0,0x2, 0x1f,0x91,0xe7,0x7f,0x16,0x7f, +0xa7,0xf, 0xe0,0x1, 0x1f,0xdc,0xa6,0xae,0xa7,0x8f,0x3e,0xdc,0xbe,0xae,0xe0,0xa0, +0x17,0x0, 0x9e,0xbf,0xe0,0x1e,0xce,0x80,0xb6,0xbf,0xb7,0x7f,0xa7,0x4f,0x3f,0x5c, +0xbf,0x4f,0xa7,0x4f,0xe0,0x20,0xcf,0x0, 0xbf,0x4f,0x38,0x82,0xe0,0x2, 0x1f,0x91, +0xe7,0x7f,0x16,0x7f,0xa6,0x8f,0xe0,0x2, 0x1f,0xa4,0xa7,0x1d,0xa7,0x8f,0xcf,0x1, +0xbf,0x1d,0xe6,0xff,0x16,0xff,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0xa6,0x8f,0xe0,0x1, +0x1f,0x5c,0x3e,0xdc,0xa7,0xe, 0xbe,0x8f,0x9e,0xbe,0xe0,0x1e,0xce,0x80,0xb6,0xbe, +0xe0,0x61,0x3e,0x82,0xe7,0xef,0x15,0xff,0x3e,0xdb,0xe0,0x61,0x3e,0x92,0xe0,0x46, +0x16,0x80,0xbe,0x8f,0x15,0xfe,0xa6,0x8f,0xce,0x84,0xbe,0x8f,0xa6,0x8f,0xce,0x82, +0xbe,0x8f,0xa6,0x8f,0x3e,0xdb,0xbe,0x8f,0xa7,0xce,0x3f,0xdc,0xbf,0xce,0x17,0x0, +0xe0,0x0, 0x1f,0xab,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xa4,0x16,0xfb,0xa7,0x8f, +0xe4,0xc, 0x34,0x40,0xa7,0xf, 0xe2,0x1, 0xc6,0x7f,0x3f,0x5d,0xbf,0xf, 0xe0,0xd, +0x34,0x48,0x17,0xb, 0xaf,0x7f,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc4,0x7f,0xa7,0xf, +0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x15,0xff,0x3f,0x5b, +0xbf,0xf, 0xae,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, +0xe7,0x7f,0x16,0x7f,0x3f,0x5c,0xbf,0xf, 0xae,0xff,0xa7,0xf, 0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, 0xac,0x7f, +0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff, +0x3f,0x5d,0xbf,0xf, 0x17,0x0, 0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, +0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0x0, 0x0, +0x8, 0xb3,0x39,0xea,0x39,0x69,0xdf,0xb1,0x21,0xa1,0xe0,0x2, 0x1f,0xa4,0xc1,0xff, +0xe3,0xff,0xc1,0xff,0x16,0xff,0xa7,0xf, 0x3e,0x92,0xe0,0xc, 0x39,0x13,0x15,0x0, +0xe7,0x7f,0x15,0xff,0xad,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa7,0x8e,0x3f,0xdb,0xbf,0x8e,0x8f,0xfe,0xe0,0x80,0xaf,0x9d,0x3e,0xfc,0x1, 0xf3, +0xa7,0x8e,0x14,0x1, 0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0xe0,0x2, 0x1f,0xa4,0x14,0x1, +0xa7,0xf, 0xa7,0x8e,0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0x8, 0xb2,0x14,0x1, 0xef,0xff, +0xd7,0x3b,0xe0,0x1, 0x14,0xc8,0x14,0x0, 0xe0,0x6, 0xd3,0xcf,0x24,0x14,0xe0,0x2, +0x1f,0x48,0x17,0x82,0xe0,0x0, 0x19,0x4d,0xaf,0x8e,0xe0,0x2, 0x1f,0x12,0xaf,0x82, +0x97,0x8e,0xe0,0x20,0xcf,0x80,0xb7,0x8e,0x8c,0x2, 0xef,0xff,0xd5,0x91,0x9, 0x21, +0xe7,0xed,0x0, 0xd1,0xe0,0x2, 0x1f,0xc8,0x17,0x1, 0xe0,0x0, 0x19,0x4d,0xaf,0xf, +0x3c,0xe8,0xaf,0x2, 0x8f,0x8f,0xe0,0x3, 0x1c,0x2c,0xe4,0x0, 0xc7,0x8e,0x3c,0x1f, +0xef,0xff,0xd2,0x3b,0x0, 0xea,0x8, 0xb2,0xe0,0x2, 0x19,0x40,0xe0,0x1, 0x8c,0xa2, +0xe0,0x4, 0x8f,0xd2,0x2f,0x95,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0xe0,0x0, 0x2f,0xcb, +0xe0,0x1, 0x8c,0x82,0x14,0x5, 0xe2,0x0, 0xcc,0x94,0x2, 0x98,0xe0,0x0, 0x14,0x64, +0x24,0x95,0xe0,0x0, 0x14,0x63,0x3c,0x19,0xe0,0x6, 0xda,0x4a,0x0, 0x8f,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x2f,0xa3,0xe0,0x1, 0x8f,0x92,0xe0,0x0, 0x14,0x7f,0xe0,0x43, +0x3f,0xf, 0xe2,0x0, 0xcf,0x0, 0xe0,0x68,0x3b,0x2f,0xe0,0x5, 0x8f,0xc2,0x14,0x98, +0x3c,0x3f,0xe0,0x6, 0xda,0x35,0xe0,0x0, 0x1f,0xb2,0xe0,0x3, 0x1f,0x16,0xac,0xf, +0x87,0x8f,0xaf,0x8e,0xe0,0x2, 0x1f,0x12,0x97,0x8e,0xe3,0xff,0xc7,0xf7,0xb7,0x8e, +0x17,0x0, 0xe0,0x2, 0x1f,0xc2,0xb7,0xf, 0x9, 0x61,0xe0,0x3, 0x1f,0xc6,0x8f,0x8f, +0xe2,0x0, 0xcf,0xb8,0x5, 0x87,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x17,0xe0,0x7, 0x14,0x68,0xe0,0x6, 0xda,0x13,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f, +0x0, 0xd5,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xf3,0xe0,0x3, +0x14,0x74,0xe0,0x6, 0xda,0x5, 0xc4,0x7e,0xe2,0x1, 0xc4,0x7f,0x0, 0xc7,0xe0,0x3, +0x14,0x74,0xe0,0x6, 0xd9,0xfd,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0xe7,0xff,0x0, 0xbf, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0xa0,0x8, 0xb4, +0xe0,0x2, 0x19,0x12,0x9f,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0x96,0xe0,0x3, +0x1f,0x43,0x97,0x82,0x89,0x8e,0xe3,0xfe,0xc7,0xff,0xe2,0x0, 0xc9,0x81,0xb7,0x82, +0x1, 0x10,0x9f,0x82,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0x87,0x97,0x82,0x14,0x0, +0xe3,0x7f,0xc7,0xff,0xb7,0x82,0xa, 0x61,0x14,0x1, 0xa, 0x61,0x14,0x1, 0x38,0x82, +0x3c,0x63,0xef,0xff,0xd6,0x79,0xe0,0x1, 0x14,0xc8,0x3c,0x63,0xe0,0x6, 0xd3,0xd, +0xe0,0x0, 0x1a,0x4d,0x2c,0x5, 0x8c,0x4, 0xef,0xff,0xd4,0xda,0x0, 0xe3,0x97,0x82, +0xe0,0x2, 0x1f,0x48,0xe3,0xdf,0xc7,0xff,0xb7,0x82,0x3c,0xe3,0x97,0x82,0xe0,0x3, +0x1c,0x2c,0xe0,0x40,0xcf,0x80,0xb7,0x82,0xa9,0x8e,0xa9,0x84,0x8f,0x8e,0xe4,0x0, +0xc7,0x8e,0x3c,0x1f,0xef,0xff,0xd1,0x62,0x0, 0xe7,0x8, 0xb6,0xe0,0x0, 0x1f,0xbd, +0xe0,0x3, 0x19,0x36,0xa1,0x8f,0xa7,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0x99, +0xe0,0x2, 0x1b,0x12,0xe7,0xff,0x12,0x81,0xe0,0x1, 0x12,0x7f,0x0, 0x8c,0x9f,0x86, +0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xd4,0xbe,0xa7,0x83,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x27,0x87,0xaa,0x82,0xef,0xff,0xd6,0x5a,0x3c,0xe4,0x24,0x71,0xb, 0x61, +0xe0,0x1, 0x1f,0xdc,0xe7,0xef,0x16,0xff,0xa7,0x8f,0xe0,0x4, 0x14,0x89,0xe0,0x1, +0xa7,0x6f,0x14,0x2, 0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6f,0xe0,0x1, 0xa7,0x6f, +0x3f,0x5d,0xe0,0x1, 0xbf,0x6f,0xe7,0xff,0x17,0x81,0xaf,0x82,0xb, 0x21,0xe0,0x9, +0x0, 0x9b,0x0, 0x0, 0x8, 0xb2,0xe0,0x2, 0x19,0x12,0x9f,0x82,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x2f,0x8d,0x9f,0x82,0xe0,0xf, 0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x87, +0xdf,0xb5,0x9f,0x82,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0xfb,0xef,0xff,0xd6,0x27, +0x24,0x3, 0x0, 0x85,0xdf,0xab,0xef,0xff,0xd6,0x22,0x24,0x7d,0x9, 0x61,0xe0,0x0, +0x1f,0xbd,0xa7,0x8f,0xa7,0x8f,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x94,0xe0,0x3, +0x1e,0xb6,0xe0,0x2, 0x1f,0xc, 0xe7,0xff,0x16,0x1, 0xae,0xd, 0x8e,0x8e,0xe2,0x0, +0xce,0x81,0x1, 0xa, 0xe0,0x2, 0x1f,0xc7,0x9f,0x8f,0x2f,0x8c,0x14,0x83,0x14,0x1, +0xe0,0x8, 0x0, 0xe2,0x38,0x82,0xe0,0x2, 0x1e,0xc7,0xe0,0x1f,0x16,0x20,0xb6,0xd, +0xaf,0x8e,0xe0,0x4, 0x14,0x81,0x14,0x2, 0xe0,0x8, 0x0, 0xd6,0x8, 0xb5,0xef,0xff, +0xd5,0xf6,0xe0,0x0, 0x24,0x4b,0x14,0x0, 0xd6,0xa, 0xe0,0x2, 0x1f,0x91,0xe7,0xdf, +0x17,0x7f,0xa1,0xf, 0xe0,0x2, 0x1a,0x96,0xa7,0x92,0xe0,0x2, 0x19,0x92,0x3f,0xde, +0xbf,0x92,0xe7,0xfb,0x17,0x7f,0xa7,0x92,0xe0,0x2, 0x1a,0x40,0x3f,0xde,0xbf,0x92, +0xe7,0xfd,0x17,0x7f,0xa7,0x92,0x3f,0xde,0xbf,0x92,0xe7,0xfe,0x17,0x7f,0xa7,0xa2, +0x3f,0xde,0xbf,0xa2,0x9f,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xe0,0xa, +0x8f,0x84,0x27,0xa8,0x8f,0x85,0x2f,0xa6,0xdf,0xab,0x9f,0x83,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x27,0xf6,0x8f,0x85,0x27,0x84,0x8f,0x85,0xc7,0xff,0xaf,0x85,0x14,0x1, +0xa7,0x92,0xe0,0x20,0xcf,0x80,0xbf,0x92,0xa7,0x92,0xe0,0x4, 0xcf,0x80,0xbf,0x92, +0xa7,0x92,0xe0,0x2, 0xcf,0x80,0xbf,0x92,0xa7,0xa2,0xe0,0x1, 0xcf,0x80,0xbf,0xa2, +0xa, 0xa1,0xe0,0xb, 0x0, 0xc5,0xdf,0x32,0xef,0xff,0xd5,0xa9,0x24,0x7d,0xe7,0xff, +0x0, 0xb4,0xdf,0x2c,0x0, 0xd0,0x0, 0x0, 0x8, 0xb3,0x14,0x1, 0xef,0xff,0xd5,0x7c, +0xe0,0x0, 0x1f,0xbd,0xa7,0x8f,0xa1,0xf, 0x31,0x43,0xe2,0x0, 0xc1,0x1, 0x29,0x7c, +0x3c,0x62,0xd5,0xad,0xe0,0x2, 0x1f,0x91,0xe7,0xdf,0x17,0x7f,0xa1,0x8f,0x14,0x1, +0xa7,0x93,0x3c,0xe2,0x3f,0xde,0xbf,0x93,0xe7,0xfb,0x17,0x7f,0xa7,0x93,0x3f,0xde, +0xbf,0x93,0xe7,0xfd,0x17,0x7f,0xa7,0x93,0x3f,0xde,0xbf,0x93,0xe7,0xfe,0x17,0x7f, +0xa7,0xa3,0x3f,0xde,0xbf,0xa3,0xe7,0xff,0x17,0x1, 0xe0,0x3, 0x1f,0xb6,0xaf,0xf, +0xd3,0xd2,0xa7,0x93,0x14,0x1, 0xe0,0x20,0xcf,0x80,0xbf,0x93,0xa7,0x93,0xe0,0x4, +0xcf,0x80,0xbf,0x93,0xa7,0x93,0xe0,0x2, 0xcf,0x80,0xbf,0x93,0xa7,0xa3,0xe0,0x1, +0xcf,0x80,0xbf,0xa3,0x9, 0xa1,0xe0,0xa, 0x0, 0xfb,0x8, 0xb1,0xe0,0x1, 0x1f,0xc2, +0xe0,0x1a,0x17,0x20,0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0x37,0x28, +0x3c,0x4e,0xe0,0x5, 0xd3,0x4c,0xe0,0x5, 0xd2,0xe8,0xe0,0x1, 0xd7,0xc0,0xe0,0x2, +0x1f,0x40,0x17,0x81,0xe0,0x4, 0xaf,0xfe,0xe0,0x1b,0x14,0x2c,0xe0,0x3, 0x1f,0x47, +0xaf,0x8e,0xe0,0x5, 0xd3,0x3c,0xe0,0x2, 0x1f,0xfd,0xe0,0x19,0x16,0x9d,0x17,0x7, +0x3e,0x9f,0xaf,0xd, 0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0x8, 0xe1,0x8, 0xb2,0xe0,0x2, +0x1f,0xc0,0x17,0x0, 0xe0,0x0, 0x1e,0xb2,0xe0,0x4, 0xaf,0x5f,0xe0,0x3, 0x1f,0x16, +0x8f,0x8d,0x8e,0xe, 0x37,0xc1,0x3f,0xfc,0x3, 0x9d,0x8e,0x8d,0x8f,0x8e,0x36,0xc1, +0x3f,0xad,0xe0,0x2, 0x19,0x12,0xaf,0x8e,0x17,0x0, 0xe0,0x2, 0x1f,0xec,0xb7,0xf, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x85,0x97,0x82, +0xe0,0x1, 0xcf,0x80,0xb7,0x82,0x9f,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x2f,0x88, +0x9, 0x61,0xe0,0x2, 0x19,0x12,0x97,0x82,0xcf,0x88,0xb7,0x82,0x0, 0xe6,0xd5,0x41, +0x97,0x82,0xcf,0x88,0xb7,0x82,0x97,0x82,0xe0,0x80,0xcf,0x80,0xb7,0x82,0x9, 0x61, +0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f,0x27,0x86,0xe0,0x2, 0x1f,0x87,0x8f,0x8f, +0x27,0x89,0x38,0x82,0x8, 0xb1,0xdf,0xbb,0xe0,0x2, 0x1f,0xeb,0x17,0x2, 0xaf,0xf, +0x8, 0xe1,0xe7,0xff,0x0, 0xb5,0x8, 0xb1,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x22, +0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa3,0x8c,0xf, 0x37,0x28,0x3c,0x4e,0xe0,0x5, +0xd2,0xd6,0xdf,0x3b,0xdf,0x7b,0xdf,0xa3,0xde,0x14,0x8, 0xa1,0xe7,0xe8,0x0, 0xe3, +0x8, 0xb4,0xe0,0x2, 0x1f,0xba,0x12,0x3c,0x8f,0x8f,0x27,0x8a,0xe0,0x3, 0x1f,0xc3, +0x8f,0x8f,0xe2,0x0, 0xcf,0x80,0x17,0xb9,0xe0,0x6f,0x39,0x24,0x3a,0x6f,0xe0,0x2, +0x19,0x40,0xe0,0x3, 0x19,0x82,0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0x1, 0x1b, +0x8f,0x3, 0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0x1, 0x2, 0xa, 0x61,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x27,0xfc,0x3a,0x7e,0x1, 0x23,0x17,0x81,0x3f,0x9e,0xe2,0x1, +0xc7,0xff,0xe0,0x3, 0x1e,0xc6,0xe2,0x0, 0xcf,0xbc,0xaf,0xd, 0x5, 0x82,0x17,0x80, +0xaf,0x83,0xa, 0x61,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0x27,0xe3,0x8f,0x3, 0x2f,0x62, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0xdb,0xe0,0x3, +0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xd5,0xdd,0x30,0x0, 0xd2,0xe0,0x3, +0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x2, 0x1f,0x12, +0x97,0x8e,0xe0,0x1, 0xcf,0x80,0xb7,0x8e,0xdd,0xbc,0xef,0xff,0xd4,0xc, 0x8f,0x3, +0x0, 0xcd,0x8, 0xb4,0xe0,0x2, 0x1f,0xe0,0xe0,0x2, 0x19,0x40,0x8f,0xf, 0x27,0xd, +0x17,0x0, 0xe0,0x4, 0x8e,0xd2,0xaf,0xf, 0xe0,0x0, 0x26,0xce,0xe0,0x4, 0x8f,0xd2, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x3, 0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81, +0x1, 0x3b,0x4, 0x8b,0xe2,0x0, 0xcf,0x83,0x1, 0x84,0xa, 0x21,0xe7,0xfe,0x0, 0xf5, +0x17,0x81,0xe0,0x4, 0xaf,0xd2,0xa, 0x61,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x27,0xb6, +0xe0,0x2, 0x1e,0xec,0x17,0x0, 0xb7,0xd, 0x8f,0xe2,0xe2,0x0, 0xc7,0x81,0x27,0xf4, +0xe0,0xa, 0x8f,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0xef,0xe0,0x2, 0x1f,0x87,0x8e,0xf, +0xe2,0x0, 0xce,0x1, 0x1, 0xe9,0xe0,0x4, 0xae,0x52,0xe0,0x3, 0x1d,0x16,0xe0,0x0, +0x1e,0x32,0xe0,0x2, 0x1d,0xf7,0x8e,0xc, 0x8c,0x8a,0xaf,0xf, 0x3e,0x19,0xae,0xa, +0xb7,0xd, 0xe0,0x3, 0x1f,0x82,0x8e,0x8b,0xaf,0xf, 0xce,0x84,0xe0,0x3, 0x1f,0xc6, +0xae,0x8b,0xaf,0xf, 0xa, 0x61,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x27,0xcd,0xa, 0x21, +0xe7,0xfe,0x0, 0xa8,0xde,0xec,0xe7,0xff,0x0, 0xb9,0x8f,0xe2,0xe2,0x0, 0xc7,0x81, +0x27,0xc3,0xe0,0x2, 0x19,0xec,0xe0,0x7, 0x14,0xe8,0x9c,0x3, 0x8a,0x72,0xe0,0x6, +0xd7,0x8a,0xe3,0xff,0xc4,0x7f,0x3c,0x74,0x3, 0x8c,0xe0,0xa, 0x8f,0x82,0xe2,0x0, +0xcf,0x81,0xe7,0xff,0x1, 0xb2,0x9f,0x83,0xe2,0x7, 0xcf,0xe7,0xe7,0xff,0x5, 0xad, +0x17,0x81,0xe0,0x4, 0xaf,0xd2,0x16,0x0, 0xe0,0x3, 0x1e,0x96,0xe0,0x0, 0x1f,0xb2, +0xe0,0x2, 0x1f,0x77,0x8f,0x8f,0x8d,0x8d,0x3f,0x9b,0xe0,0x2, 0x1d,0x87,0xaf,0x8d, +0x16,0x80,0xb6,0x3, 0xae,0x8b,0xe0,0x3, 0x1d,0x82,0x8f,0x8e,0xae,0xb, 0xcf,0x84, +0xe0,0x3, 0x1e,0x46,0xaf,0x8e,0xae,0x8c,0xa, 0x61,0xe0,0x4, 0xaf,0xd2,0x16,0x0, +0xe0,0x3, 0x1e,0x96,0xe0,0x0, 0x1f,0xb2,0x8f,0x8f,0x8d,0x8d,0x3f,0x9b,0xaf,0x8d, +0xe0,0x2, 0x1d,0x87,0xe0,0x2, 0x1f,0xec,0xe0,0x2, 0x1e,0xf7,0xb6,0xf, 0xaf,0xb, +0xe0,0x3, 0x1d,0x82,0x8f,0x8d,0xae,0xb, 0xcf,0x84,0xe0,0x3, 0x1e,0x46,0xaf,0x8d, +0xaf,0xc, 0xe7,0xfe,0x0, 0xe3,0x8, 0xb1,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x2f,0x8d, +0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0x27,0x85,0xdd,0x86,0x8, 0xa1,0xe7,0xfd,0x0, 0xea, +0xdd,0xc6,0x8, 0xa1,0xe7,0xfd,0x0, 0xe6,0xdf,0x3d,0x0, 0xf3,0xe0,0x3, 0x1f,0x2d, +0xe0,0x2, 0x1e,0x92,0x0, 0x86,0x9f,0x8d,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x83, +0x9f,0x8e,0x2f,0xfa,0x17,0x87,0xb7,0x8e,0x38,0x82,0x0, 0x0, 0xe0,0x0, 0x1f,0xcd, +0x8f,0x8f,0x2f,0x9f,0x8, 0xb2,0xe0,0x2, 0x19,0x39,0x9f,0x82,0x2f,0xff,0xdc,0x6c, +0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0x13,0xe0,0x1, +0x8c,0x8f,0xe0,0x0, 0x14,0x64,0xe0,0x6, 0xd6,0xc3,0xc4,0x7f,0xb4,0x2, 0xe0,0x2, +0x1f,0xb2,0x9e,0x82,0x9f,0xf, 0x3e,0xfe,0x5, 0x83,0x97,0x8f,0xb7,0x82,0x9, 0x61, +0x38,0x82,0xe0,0x1, 0x8f,0x9f,0xc7,0xff,0xb7,0x82,0x0, 0xf2,0xe0,0x2, 0x1f,0x91, +0xe7,0x7f,0x16,0xff,0xa7,0x8f,0xe2,0x0, 0xcc,0x7, 0xa7,0x1f,0xe1,0x0, 0xcf,0x0, +0xbf,0x1f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0xe7,0xdf,0x16,0xff,0xa7,0x2f,0x3f,0x5d, +0xbf,0x2f,0xe7,0xbf,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x2, 0x88,0xa7,0x2f, +0x16,0xf8,0xe2,0x0, 0xc4,0x7, 0x3f,0x5d,0x3c,0x4e,0xbc,0x2f,0x38,0x82,0xe0,0x2, +0x1f,0xe4,0x16,0xdf,0xa7,0xf, 0x15,0xfe,0xa7,0xbe,0x3f,0xdd,0xbf,0xbe,0xe7,0xfe, +0x16,0xff,0xa6,0x3e,0xe0,0x0, 0x1f,0xbd,0x3e,0x5d,0xa7,0x8f,0xbe,0x3e,0x17,0x0, +0xaf,0x7f,0x16,0xfd,0xa6,0xf, 0xe0,0x1, 0x1f,0x5c,0x3e,0x5b,0xbe,0xf, 0xa6,0xf, +0xa7,0xe, 0x3e,0x5d,0xbe,0xf, 0xa6,0xbf,0x3e,0xdb,0xbe,0xbf,0x16,0xfc,0xa7,0x8e, +0x3f,0xdd,0xbf,0x8e,0x17,0x80,0xe0,0x3, 0xb7,0x9e,0x17,0x80,0xe0,0x61,0x3f,0x92, +0xe1,0xff,0x17,0xff,0xe0,0x61,0x3f,0x91,0x38,0x82,0xe0,0x2, 0x1f,0xe4,0xe0,0x0, +0x1f,0x3d,0xa6,0x8f,0x16,0x7e,0xa7,0xbd,0xa7,0xe, 0x3f,0xdc,0xbf,0xbd,0xe7,0xff, +0x16,0xbf,0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0xe0,0x61,0x3f,0x82,0xcf,0x81,0xe0,0x61, +0x3f,0x92,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xe0,0x1, 0x1f,0x5c,0xa6,0x8f,0x16,0x6f, +0xa7,0x9d,0xa7,0xe, 0x3f,0xdc,0xbf,0x9d,0xe0,0x1, 0xa7,0xee,0xe0,0x20,0xcf,0x80, +0xe0,0x1, 0xbf,0xee,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xe0,0x2, 0x1f,0xe4, +0xa7,0x1d,0xa7,0x8f,0xcf,0x8, 0xbf,0x1d,0xe7,0xff,0x16,0xbf,0xa7,0x3f,0x3f,0x5d, +0xbf,0x3f,0xa7,0x2f,0xe2,0x1, 0xc7,0x4f,0xcf,0x20,0xbf,0x2f,0xe0,0x2, 0x17,0x0, +0xb7,0x3f,0xa7,0x3f,0xcf,0x40,0xbf,0x3f,0xe0,0x61,0x3f,0x82,0xe0,0x40,0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0x8, 0xb2,0xe0,0x1, 0x1f,0x5c,0x17,0xff,0xa1,0xe, +0xb7,0xd2,0xe0,0x1, 0xb7,0xd2,0xe0,0x6, 0xd5,0x11,0xe0,0x2, 0x1f,0xe6,0xe0,0x41, +0x3f,0x8, 0xac,0xf, 0xe7,0xfb,0x16,0xff,0xa7,0x82,0xe2,0x0, 0xc7,0x1, 0x37,0x29, +0x3f,0xdd,0x3f,0xce,0xbf,0x82,0xe0,0x1, 0x17,0xc3,0xb7,0xb2,0xda,0xa6,0xa7,0xb2, +0x16,0xef,0xcf,0x84,0xbf,0xb2,0x17,0xfb,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0x17,0xf7, +0xa7,0x32,0xcf,0x8, 0xbf,0x32,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0xa7,0x32,0xcf,0x10, +0xbf,0x32,0xa7,0x12,0x3f,0x5d,0xbf,0x12,0xa7,0xc2,0x3f,0xdd,0xbf,0xc2,0x9, 0x61, +0xe0,0x2, 0x1f,0x90,0xe7,0xff,0x16,0xbf,0xa7,0x8f,0xa7,0x1f,0xcf,0x1, 0xbf,0x1f, +0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0xe7,0xfe,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0x17,0x2f,0xbf,0x2f,0xa7,0x1f,0xcf,0x2, 0xbf,0x1f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f, +0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0xe0,0x61,0x3f,0x82,0xe7,0xf7,0x17,0x7f,0x3f,0xde, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x2, 0x1f,0x90,0xa7,0x8f,0xa7,0x2f,0x27,0x7, +0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x38,0x82,0xe0,0x2, +0x1f,0x91,0xe0,0x0, 0x1e,0x40,0xa7,0xf, 0xe7,0xfe,0x15,0x7f,0xa7,0xbe,0xe0,0x0, +0x1d,0xc2,0xcf,0x81,0xbf,0xbe,0xa6,0x8e,0xe0,0x3, 0x1f,0x81,0xce,0x82,0xbe,0x8e, +0x16,0xa0,0xb6,0x8c,0xa6,0x9e,0xa7,0x8f,0x3e,0xda,0xbe,0x9e,0xa6,0x9e,0xa5,0x8b, +0xe0,0x8, 0xce,0x80,0xbe,0x9e,0x16,0xf7,0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, +0xcf,0x8, 0xbf,0xf, 0xa7,0xb, 0x3f,0x5d,0xbf,0xb, 0x17,0x0, 0xe0,0x1, 0xaf,0x3f, +0x96,0xc, 0xb6,0x3f,0xe0,0x61,0x3f,0x2, 0xe0,0x2, 0xcf,0x0, 0xe0,0x61,0x3f,0x12, +0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0x38,0x82, +0xe0,0x3, 0x1f,0x4b,0xe2,0xff,0x17,0xf0,0xbf,0xf, 0xe2,0xff,0x17,0xf4,0xe0,0x3, +0x1f,0x4c,0xbf,0xf, 0xe2,0xff,0x17,0xf8,0xe0,0x3, 0x1f,0x4d,0xbf,0xf, 0xe2,0xff, +0x17,0xfc,0xe0,0x3, 0x1f,0x4e,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xdc,0x16,0x80, +0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf,0xe0,0x2, 0x16,0x84,0xbf,0xd, 0xe0,0x2, +0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0xe0,0x0, 0x16,0xeb,0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf,0xe0,0x2, 0x16,0x84, +0xbf,0xd, 0xe0,0x2, 0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x38,0x82, +0xc4,0x7f,0xe1,0xff,0x17,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7e,0x1, 0xc, 0x17,0x88, +0x0, 0x0, 0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc4,0x7f,0xe3,0xff,0xc4,0x7f, +0x3c,0x7e,0x1, 0xf6,0x38,0x82,0x0, 0x0, 0xc4,0x7f,0xe1,0xff,0x16,0x7f,0xe3,0xff, +0xc4,0x7f,0x3c,0x7c,0x1, 0x17,0x16,0x84,0xe0,0x1, 0x17,0x7a,0x17,0x88,0x0, 0x0, +0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0x2f,0x77, +0xc6,0xff,0xe2,0x1, 0xc6,0xff,0x2e,0xf1,0xc4,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7c, +0x1, 0xeb,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0xf, 0xa7,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0x98,0xe0,0x2, 0x1f,0x91,0xe7,0xff,0x16,0x3f,0xa7,0x8f,0xa6,0xdf,0xe0,0x1, +0xce,0x80,0xbe,0xdf,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a,0xe2,0x0, +0xc7,0x1, 0x2f,0x1e,0xa7,0x5f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xbf,0x5f,0x38,0x82, +0xa7,0xce,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0x98,0xe0,0x2, 0x1f,0x91,0xe7,0xff, +0x16,0x3f,0xa7,0x8f,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xe7,0xfe,0x16,0x7f,0xa6,0xdf, +0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0x27,0x64,0xa7,0x5f, +0xe1,0x0, 0xcf,0x0, 0xbf,0x5f,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xa7,0x8f,0xa6,0xdf, +0xce,0xc0,0x0, 0xeb,0x8, 0xb4,0xe0,0x3, 0x19,0x36,0x8f,0x82,0xe2,0x1, 0xcf,0x81, +0x1, 0x4, 0x17,0x80,0xaf,0x82,0xa, 0x61,0x24,0x2b,0xe2,0x0, 0xcc,0x1, 0x39,0xe9, +0x1, 0x30,0xe2,0x0, 0xcc,0x2, 0x1, 0xf6,0x3f,0x83,0xdf,0xad,0xe0,0x2, 0x1f,0x91, +0xe0,0x3, 0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0x21,0x84,0xa4,0xef,0x3c,0xc3, +0xbc,0xef,0xe0,0x0, 0x1f,0x3d,0xa7,0xe, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, +0x2f,0xe, 0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,0x80,0xaf,0x82,0xa, 0x61, +0x3f,0x83,0x17,0x82,0x3f,0xd9,0x2f,0xae,0xdf,0x7e,0xe0,0x2, 0x1f,0x91,0xe0,0x3, +0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xe0,0x0, 0x1f,0x3d,0xa2,0xe, 0x29,0xb0, +0xa7,0x3f,0xe7,0xfe,0x16,0xff,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7,0x84,0x37,0xc5,0xe2,0x0, +0xc7,0x81,0xe7,0xff,0x27,0xa0,0xa7,0x84,0x17,0x5f,0x3f,0xde,0xbf,0x84,0xe7,0xff, +0x0, 0x9a,0xe0,0x0, 0x1f,0xbd,0xa2,0xf, 0xa7,0x84,0xcf,0xa0,0xbf,0x84,0xdf,0x4b, +0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xa4,0xef, +0x3c,0xc3,0xbc,0xef,0x0, 0xce,0x8, 0xb1,0xe0,0x1, 0x1f,0xdc,0x17,0x0, 0xa6,0x8f, +0xe0,0x2, 0x1f,0x91,0xe0,0x2, 0xbf,0xd, 0x16,0x6f,0xa7,0x8f,0xbf,0x6f,0xa6,0xdf, +0xe0,0x80,0xce,0x80,0xbe,0xdf,0xa6,0xdf,0xe0,0x40,0xce,0x80,0xbe,0xdf,0xa6,0xdf, +0xe0,0x20,0xce,0x80,0xbe,0xdf,0xa6,0xef,0xce,0xc0,0xbe,0xef,0xa6,0xef,0xce,0xa0, +0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0x7f,0x16,0x7f,0xa6,0xef,0xe1,0x0, +0xce,0x80,0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0xbf,0x16,0x7f,0xa6,0xef, +0x3e,0xdc,0xbe,0xef,0xe7,0xdf,0x16,0x7f,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xa6,0xef, +0xe0,0x10,0xce,0x80,0xbe,0xef,0xe0,0x3, 0x1f,0x98,0xb7,0xf, 0xdf,0x4, 0xe0,0x61, +0x3f,0x82,0x17,0x7d,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82,0x17,0x7b, +0x3f,0xde,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0xe0,0x1, 0x1f,0xdc,0xe2,0x0, 0xcc,0x2, +0xa7,0x8f,0xe0,0x0, 0x1, 0x57,0xe2,0x0, 0xcc,0x3, 0x1, 0x36,0xe2,0x0, 0xcc,0x1, +0x1, 0x19,0xa6,0x8f,0xe0,0x2, 0x1f,0x11,0x16,0x7b,0xa7,0xe, 0x3e,0xdc,0xbe,0x8f, +0xe6,0xff,0x16,0x7f,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0x16,0x78,0xa6,0xce,0x3e,0xdc, +0xbe,0xce,0x16,0xf7,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0x16,0x80,0xe0,0x1, 0xbe,0xbf, +0x38,0x82,0xa7,0xf, 0x16,0x77,0x3f,0x5c,0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f, +0x16,0x78,0xa7,0xf, 0xe0,0x2, 0x1e,0x91,0xcf,0x4, 0xa6,0x8d,0xbf,0xf, 0xa7,0x4d, +0xe1,0x0, 0xcf,0x0, 0xbf,0x4d,0xa7,0x4d,0x3f,0x5c,0xcf,0x1, 0xbf,0x4d,0xa7,0x1f, +0xcf,0x8, 0xbf,0x1f,0x38,0x82,0xa7,0xf, 0xe0,0x2, 0x1e,0x91,0x16,0x7b,0x3f,0x5c, +0xa6,0x8d,0xbf,0xf, 0xe6,0xff,0x16,0x7f,0xa7,0x4d,0x3f,0x5c,0xbf,0x4d,0xa7,0xf, +0xcf,0x8, 0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, +0xbf,0x1f,0xa7,0x1f,0xcf,0x10,0xbf,0x1f,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f,0x38,0x82, +0xa6,0x8f,0x16,0x77,0x3e,0xdc,0xbe,0x8f,0x16,0x80,0xe0,0x1, 0xbe,0xbf,0x16,0x78, +0xa6,0x8f,0xe0,0x2, 0x1f,0x11,0xce,0x84,0xa7,0xe, 0xbe,0x8f,0xa6,0xce,0xe1,0x0, +0xce,0x80,0xbe,0xce,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f, +0x38,0x82,0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0xa1,0x8f,0xe0,0x1, 0x1f,0xdc,0xa1,0xf, +0xa7,0xb3,0xcf,0x81,0xbf,0xb3,0xa7,0x83,0xcf,0x88,0xbf,0x83,0xe0,0x1, 0xa7,0x92, +0xcf,0x82,0xe0,0x1, 0xbf,0x92,0xe0,0x1, 0xa7,0x92,0xcf,0x81,0xe0,0x1, 0xbf,0x92, +0xe0,0x3, 0x1f,0x8d,0x8c,0xf, 0xdf,0x71,0xa7,0xd3,0x17,0x7d,0xcf,0x81,0xbf,0xd3, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x7b,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x77, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x6f,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0xe6,0xff, +0x17,0x7f,0xa7,0xd3,0xcf,0xa0,0xbf,0xd3,0xe0,0x1, 0xa7,0xa2,0x3f,0xde,0xe0,0x1, +0xbf,0xa2,0x17,0x78,0xe0,0x1, 0xa7,0xa2,0xe0,0x60,0xcf,0x80,0xe0,0x1, 0xbf,0xa2, +0xe0,0x1, 0xa7,0xa2,0xcf,0x88,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0x3f,0xde, +0xcf,0x85,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x2, 0xcf,0x80,0xe0,0x1, +0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x4, 0xcf,0x80,0xe0,0x1, 0xbf,0xa2,0x9, 0xe1, +0xe0,0x2, 0x1f,0x91,0xe7,0xfd,0x16,0xff,0xa7,0x8f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, +0xbf,0x1f,0xa7,0x1f,0xe0,0x2, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0xe7,0xff,0x16,0xbf,0xa7,0x1f,0xe0,0x4, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0xe0,0x1, +0xcf,0x0, 0xbf,0x2f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x16,0xef,0xa7,0x2f,0x3f,0x5d, +0xbf,0x2f,0x16,0xf7,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0x17,0x1, 0xa7,0x8f,0x3f,0x58,0xe0,0x1, 0xa6,0xaf,0x15,0xf7,0xe0,0xc, 0x37,0x23, +0x3e,0xdb,0x3e,0xcc,0xe0,0x1, 0xbe,0xaf,0xe7,0xfd,0x15,0xff,0xe0,0x1, 0xa6,0xaf, +0xe0,0xc, 0x37,0x28,0x3e,0xdb,0x3e,0xcc,0xe0,0x1, 0xbe,0xaf,0xe7,0xfb,0x16,0xff, +0xe0,0x1, 0xa4,0x2f,0x37,0x29,0x3c,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x2f,0x38,0x82, +0x8, 0xb1,0xe0,0x5, 0xdc,0x73,0x24,0x6, 0xe0,0x2, 0x1f,0x14,0x97,0xce,0xcf,0x82, +0xb7,0xce,0xe0,0x2, 0x1f,0xb3,0x8f,0x8f,0x27,0x82,0x8, 0xe1,0x8, 0xa1,0xe7,0xe0, +0x0, 0x95,0xe0,0x2, 0x1e,0x92,0xe0,0x2, 0x1f,0x14,0x97,0x8d,0xcf,0x81,0xb7,0x8d, +0x97,0xce,0xcf,0x84,0xb7,0xce,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, +0xc7,0x81,0x2f,0x82,0x38,0x82,0x0, 0xdd,0xe0,0x2, 0x1f,0x12,0xe0,0x2, 0x1e,0x94, +0x97,0x8e,0xcf,0x81,0xb7,0x8e,0x97,0x4d,0xe0,0x3, 0x1f,0xb8,0xcf,0x4, 0xa7,0x8f, +0xb7,0x4d,0xa7,0x5f,0xcf,0x8, 0xbf,0x5f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x82, +0x38,0x82,0x0, 0xc7,0xe0,0x61,0x3f,0x82,0xe0,0x61,0x3f,0x2, 0xe7,0xfe,0x16,0xff, +0x3f,0x5d,0xe0,0x61,0x3f,0x12,0xe0,0x3, 0x1f,0x38,0x16,0x7e,0xa7,0xe, 0xe2,0x0, +0xc4,0x1, 0xa6,0xbe,0x15,0xfd,0x3e,0xdc,0x3e,0xc8,0xbe,0xbe,0xe0,0xc, 0x34,0x21, +0xa6,0xbe,0x34,0x2a,0x3e,0xdb,0x3e,0xcc,0xbe,0xbe,0xe7,0xf7,0x16,0x7f,0xa6,0xbe, +0x37,0xc7,0x3e,0xdc,0x3c,0x4d,0xbc,0x3e,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x61, +0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0x8, 0xb1,0xe0,0x1, +0x1f,0xdc,0xe7,0x7f,0x16,0xff,0xa7,0xf, 0xe7,0xfb,0x16,0x7f,0xa7,0x8e,0xe7,0xe0, +0x14,0x80,0x3f,0xdd,0xbf,0x8e,0xf0,0x1a,0x13,0x98,0xe0,0x1, 0xa6,0xee,0xe0,0x3, +0x1f,0xb8,0xe0,0x4, 0xce,0x80,0xe0,0x1, 0xbe,0xee,0xe0,0x1a,0x15,0x19,0xe0,0x1, +0xa6,0xee,0xa7,0x8f,0x3e,0xdc,0xe0,0x1, 0xbe,0xee,0x16,0x81,0xbe,0xdf,0xe7,0xf8, +0x16,0x0, 0xa6,0xef,0x17,0x0, 0xe3,0xfe,0xc6,0x9f,0xbe,0xef,0xe7,0x80,0x14,0x0, +0xa6,0xef,0xe0,0x1, 0x1d,0xc2,0xbe,0xef,0xf0,0x17,0x3b,0x9b,0xe0,0x1, 0xa6,0xdf, +0x3d,0x1b,0xe3,0xff,0xc6,0x80,0xe0,0x1, 0xbe,0xdf,0xe0,0x1, 0xa6,0xdf,0xe0,0x1, +0xbe,0xdf,0xe0,0x3, 0x16,0xe0,0xe0,0x1, 0xbe,0xef,0xe0,0x1, 0xa6,0xff,0x3e,0xdc, +0xe0,0x1, 0xbe,0xff,0xe7,0xf0,0x16,0x0, 0xe0,0x2, 0xa6,0x8f,0x3e,0xd9,0xe0,0x2, +0xbe,0x8f,0xe0,0x2, 0xa6,0x9f,0x3e,0xd9,0xe0,0x2, 0xbe,0x9f,0xe0,0x17,0x16,0xb8, +0xe0,0x4, 0xb6,0xdf,0xe0,0x2, 0xa6,0xcf,0x3e,0xdc,0xe0,0x2, 0xbe,0xcf,0xe0,0x9, +0x16,0x88,0xe0,0x2, 0xbe,0xbf,0xe0,0x12,0x16,0xdc,0xe0,0x2, 0xbe,0xdf,0xe1,0x20, +0x16,0x80,0xe0,0x2, 0xbf,0x6f,0xe0,0x2, 0xbe,0xff,0xe0,0x3, 0xa5,0xef,0x3d,0xd8, +0xcd,0xe4,0xe0,0x3, 0xbd,0xef,0xe0,0x3, 0xa6,0x7f,0x3e,0x58,0xce,0x64,0xe0,0x3, +0xbe,0x7f,0xe0,0x4, 0xa6,0x8f,0x3e,0xd9,0xe0,0x7, 0xce,0xe8,0xe0,0x4, 0xbe,0x8f, +0xe1,0xff,0x16,0xff,0xe0,0x4, 0xbf,0x1f,0xbe,0x9f,0xe1,0x39,0x16,0x83,0xbf,0x3f, +0xbe,0xbf,0xe0,0x2, 0x1e,0x92,0xb7,0xd, 0xa6,0xbf,0xbe,0xaf,0xe0,0x3, 0x1f,0x9d, +0xe8,0x0, 0x86,0x87,0xb7,0xf, 0xe0,0x2, 0x1f,0xba,0x87,0xa, 0xae,0x8f,0xe0,0x3, +0x1f,0xc3,0xaf,0xf, 0xef,0xfe,0xda,0x2f,0xe0,0x5, 0xda,0x42,0xe0,0x61,0x3f,0x82, +0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0x8, 0xb1,0xf0,0x3, 0x18,0xb8, +0xe7,0xbf,0x16,0x7f,0xe8,0x0, 0xa7,0x1, 0xe0,0x2, 0x1e,0xfd,0xe0,0x1, 0xa7,0xee, +0xf0,0x3, 0x19,0xcf,0x3f,0xdc,0xe0,0x1, 0xbf,0xee,0xfa,0xd7,0xca,0xa8,0xe0,0x2, +0x1f,0xe6,0xe0,0x1, 0x9d,0x2d,0x85,0x8f,0xe0,0x1, 0x1f,0xc2,0xe0,0x1, 0x9e,0x1d, +0xf0,0x10,0x89,0x7f,0xe0,0x0, 0x1f,0xc4,0xe0,0x3, 0x1e,0xd0,0xe4,0xa, 0x35,0x20, +0xe4,0xc, 0x36,0x20,0xa7,0x8f,0xf0,0x3, 0x1b,0xd1,0xe0,0x3, 0x1c,0x52,0xe0,0x3, +0x1c,0xd3,0xe0,0x3, 0x18,0xd4,0xf0,0x3, 0x18,0x55,0xf0,0x3, 0x1a,0x56,0x17,0x0, +0xe2,0x0, 0xc5,0x81,0x3d,0x4d,0x3e,0x4d,0xf0,0xa9,0x13,0x15,0xe8,0x40,0x3d,0xf2, +0xf0,0x0, 0xb9,0x8f,0x1, 0x24,0xbe,0x1f,0x16,0xfd,0x3e,0x9e,0xe2,0x1, 0xc6,0xff, +0xf0,0x0, 0xba,0xaf,0xe2,0x0, 0xce,0x81,0xf0,0x0, 0xbb,0x3f,0x5, 0x9a,0xbc,0x4f, +0xbc,0xdf,0xf0,0x0, 0xbb,0xef,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x5, +0xf0,0x0, 0xba,0x7f,0xe0,0x7, 0xc7,0xb0,0x1, 0xe2,0xe8,0x0, 0xa7,0x1, 0xe0,0x1, +0xa7,0xee,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xee,0x8, 0xe1,0xbd,0x1f,0x0, 0xdd, +0xb8,0xcf,0xe2,0x0, 0xcf,0x4, 0xf0,0x0, 0xb8,0x5f,0xf0,0x0, 0xbb,0xef,0x1, 0xe4, +0xe0,0x3, 0x1f,0x57,0xbf,0x7f,0x0, 0xea,0x8, 0xb2,0xe0,0x2, 0x19,0x3d,0x8f,0x82, +0x27,0x8d,0xe0,0x0, 0x14,0xda,0x14,0x11,0xe0,0x5, 0xdb,0x3a,0xe0,0x0, 0x14,0xda, +0x14,0x29,0xe0,0x5, 0xdb,0x35,0x17,0x80,0xaf,0x82,0x9, 0x61,0xe0,0x2, 0x1f,0xec, +0x17,0x0, 0xb7,0xf, 0xe0,0x2, 0x1f,0x99,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x19, +0x87,0x8e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xcf,0xc8,0x5, 0x82,0x17,0xc8, +0xaf,0x8e,0x38,0x82,0xe0,0x0, 0x1f,0xcd,0x14,0x1, 0x8f,0x8f,0x2f,0x89,0xe0,0x2, +0x1f,0x99,0x8c,0xf, 0xe0,0x3, 0x1f,0x92,0x8f,0x8f,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0x8, 0xb1,0x3c,0x98,0x34,0xa4,0xe1,0x77,0x14,0x0, 0xe0,0x6, 0xd1,0x49,0xe3,0xff, +0xc4,0x7f,0x8, 0xe1,0xea,0x0, 0xcc,0x2, 0xe0,0x48,0xcc,0x0, 0x14,0x80,0xea,0x0, +0xcd,0x3, 0xe0,0x22,0xcd,0x7c,0x3d,0x28,0xe0,0x6, 0xd1,0xd6,0xea,0x0, 0xcc,0x0, +0xe0,0x0, 0xcc,0x0, 0x24,0x2, 0x3c,0x1, 0x14,0x0, 0x14,0x80,0xef,0xfe,0xd4,0x70, +0x3a,0x80,0x0, 0x0, 0x3a,0x80,0xe0,0x3, 0x1f,0xc3,0xe0,0x1, 0x17,0x7d,0x8f,0x8f, +0x3f,0x58,0xe2,0x0, 0xcf,0x80,0x3c,0x6f,0x17,0x80,0xe1,0x2f,0x3f,0xf, 0xe0,0x68, +0x39,0xaf,0x38,0x82,0x8, 0xb3,0xe0,0x3, 0x19,0xb0,0x11,0x0, 0x8c,0x33,0x3c,0xe2, +0xc1,0x1, 0xef,0xfe,0xd6,0x58,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, 0xc9,0x3, 0xc1,0x85, +0x1, 0xf6,0x14,0x81,0x3c,0x62,0xef,0xfe,0xd6,0x4e,0x14,0x81,0x14,0x4, 0xef,0xfe, +0xd6,0x4a,0xe0,0x2, 0x1f,0xc8,0x8c,0x8f,0x24,0x82,0x14,0x81,0x14,0x0, 0x9, 0xa1, +0xe7,0xcc,0x0, 0xc1,0x8, 0xb1,0xdf,0xa, 0xef,0xfe,0xd5,0xaf,0x8, 0xa1,0x0, 0xdb, +0x8, 0xb2,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x19,0x4d,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, +0xc7,0x81,0x2f,0x95,0xe0,0x2, 0x1f,0x48,0xaf,0x82,0x3c,0xef,0xaf,0x8e,0x3c,0x6f, +0xe0,0x1, 0x1f,0x4c,0xaf,0x8e,0xe0,0x3, 0x1f,0x2, 0xaf,0x8e,0xef,0xfe,0xd6,0x23, +0xef,0xfe,0xd8,0xc4,0x8c,0x2, 0x9, 0x21,0xe7,0xd7,0x0, 0xf2,0x17,0x81,0xe0,0x2, +0x1f,0x48,0xe0,0x2, 0x1c,0x68,0xaf,0x82,0xaf,0x8e,0xe0,0x2, 0xd6,0x8f,0xe0,0x1, +0x1f,0xcc,0xe0,0x3, 0x1f,0x1e,0xac,0xf, 0x87,0x8f,0xaf,0x8e,0xe0,0x2, 0xd5,0x3b, +0x14,0x81,0x14,0x0, 0xef,0xfe,0xd6,0x7, 0x0, 0xe4,0x8, 0xb3,0x14,0x0, 0xde,0x3, +0xe0,0x2, 0x1f,0x92,0x14,0x1, 0x91,0x8f,0x99,0xf, 0x39,0xd8,0x31,0x58,0x39,0x58, +0xdd,0xfa,0xe0,0x8, 0x39,0xc2,0x9, 0xe1,0x8, 0xb2,0xe0,0x2, 0xd6,0xac,0xdf,0x2d, +0x14,0x0, 0xdd,0xf1,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0x8b,0x97,0x8e,0xe0,0x2, 0x1e,0x94,0xe3,0xff,0xc7,0xfd,0xb7,0x8e,0x97,0xcd, +0xe3,0xff,0xc7,0xf7,0xb7,0xcd,0x97,0x8e,0xe0,0x2, 0x19,0x77,0xe2,0x0, 0xc7,0x81, +0x2f,0x97,0x14,0x1, 0xdd,0xd8,0xe0,0x2, 0x1f,0x48,0x8f,0x82,0x8e,0x8e,0x37,0xdd, +0xe2,0x0, 0xc7,0x81,0x2f,0x89,0xe0,0x2, 0x1f,0xfb,0x8f,0x8f,0x8f,0xe, 0x37,0xde, +0xe2,0x0, 0xc7,0x81,0x27,0x84,0x9, 0x21,0xe7,0xed,0x0, 0x8c,0x9, 0x61,0x97,0x8e, +0xe0,0x2, 0x1e,0x94,0xe3,0xff,0xc7,0xfe,0xb7,0x8e,0x97,0xcd,0xe3,0xff,0xc7,0xfb, +0xb7,0xcd,0xdf,0x7f,0xef,0xfd,0xdd,0xa6,0x14,0x1, 0xe0,0x1, 0xd8,0x9b,0xe0,0x2, +0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xaf,0x82,0x0, 0xd5,0xe0,0x1, 0x1f,0xe8,0xe0,0x3, +0x1f,0x4, 0x8f,0x8f,0xe0,0x1, 0x8e,0xce,0xe2,0x0, 0xcf,0x85,0x2, 0x8c,0x26,0x9c, +0xe0,0x2, 0x1e,0x21,0xe0,0x1, 0x8d,0x9e,0x3f,0x9c,0x8e,0xf, 0x3d,0xfc,0x5, 0xb6, +0xc6,0x1, 0xae,0xf, 0xe2,0x0, 0xce,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0xb4,0x16,0x80, +0xae,0x8f,0xe0,0x1, 0x8f,0xee,0xe2,0x0, 0xcf,0x81,0xeb,0xe5,0x7f,0xeb,0x1, 0x9, +0x17,0x1, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x21,0x3f,0x9c,0xae,0x8f,0x0, 0xee, +0x8e,0x8f,0xe0,0x1, 0x8e,0xe, 0x3e,0x7d,0x5, 0xf4,0xc6,0x81,0x16,0x0, 0xe0,0x1, +0xae,0x6e,0xae,0x8f,0x38,0x82,0xe0,0x2, 0x1e,0x34,0xe0,0x1, 0x8e,0x9e,0x8f,0x8c, +0x15,0x80,0x3e,0xff,0xe0,0x1, 0xad,0xee,0x5, 0x8c,0x16,0x81,0x3e,0x9f,0xeb,0xe5, +0x7f,0xeb,0xe0,0x1, 0xad,0xce,0xae,0x8c,0x0, 0xdc,0x16,0x80,0xae,0x8f,0x0, 0xd2, +0xeb,0xe5,0x7f,0xeb,0xad,0x8c,0x0, 0xd5,0x8, 0xb5,0xe0,0x3, 0x19,0x4, 0x17,0x1, +0x9f,0xd2,0xe0,0x1, 0xaf,0x62,0xe0,0x43,0x3f,0x1f,0xe2,0x0, 0xcf,0x0, 0xe0,0x1, +0x4, 0x4a,0xe0,0x2, 0x1f,0x5d,0x8f,0xe, 0x27,0x4, 0x17,0x0, 0xe0,0x1, 0xaf,0x62, +0xe2,0x0, 0xc7,0xa0,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0x19,0xe9, +0x8f,0x83,0x2f,0x83,0xe0,0x1, 0xaf,0xe2,0xe0,0x2, 0x1a,0x48,0xe0,0x2, 0x1a,0xc0, +0x8c,0x4, 0xde,0xca,0x24,0x7, 0xe0,0x4, 0x8f,0xd5,0xe2,0x0, 0xcf,0x81,0xe0,0x1, +0x1, 0x1e,0x9f,0x52,0x17,0x80,0xe0,0x80,0x16,0x80,0xe0,0x1, 0xaf,0xc2,0x3e,0xde, +0xe0,0x1, 0xaf,0xd2,0x26,0x84,0x17,0x81,0xe0,0x1, 0xaf,0xc2,0xe0,0x4, 0x17,0x80, +0x3f,0xde,0x2f,0x83,0xe0,0x1, 0xaf,0xc2,0xe0,0x1, 0x1f,0xc7,0x9f,0x8f,0xe2,0x4, +0xcf,0xd8,0xe0,0x2, 0x1f,0xfe,0xe0,0x0, 0x5, 0xe5,0x16,0x8f,0xae,0x8f,0x8e,0x84, +0xe2,0x0, 0xce,0x81,0xe0,0x0, 0x1, 0x68,0x16,0x80,0xae,0x8f,0x17,0xa0,0x3f,0xde, +0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xc2,0x8f,0x83,0x2f,0x83,0xe0,0x1, 0xaf,0xc2, +0xe0,0x1, 0x17,0x80,0x3f,0xde,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xc2,0x11,0x84, +0xe0,0x1, 0x1f,0xd7,0x96,0xbf,0xe0,0x0, 0x1f,0x8d,0xe0,0x1b,0x96,0x1f,0xe0,0xf, +0x36,0xa1,0x3e,0x7f,0x4, 0x5, 0x3e,0x7d,0x11,0x83,0xe0,0x0, 0x3, 0x4e,0xe2,0x2, +0xc7,0x0, 0xe2,0x0, 0xcf,0x0, 0x17,0x84,0xe0,0x6f,0x39,0x23,0x39,0xef,0xe0,0x1, +0xda,0x3d,0xe0,0x1, 0x1f,0x91,0xe2,0x0, 0xcc,0x0, 0x8f,0xf, 0xe0,0x1, 0x1f,0x90, +0x37,0x28,0x8f,0x8f,0x16,0x81,0xe0,0x6d,0x39,0x23,0x3f,0xce,0xe0,0x1, 0x1f,0xf, +0x3f,0xbd,0xe0,0x0, 0x1e,0x8e,0x8f,0xe, 0xe0,0x43,0x3f,0x9f,0x8e,0x8d,0xb7,0xb2, +0xe0,0x1, 0xaf,0x2, 0x26,0x8a,0x96,0xd2,0xe2,0x0, 0xce,0x80,0x4, 0x6, 0xe2,0x0, +0xcf,0x81,0x5, 0x3d,0x37,0x81,0xb7,0xb2,0xe0,0x4, 0x8f,0xd5,0xe2,0x0, 0xcf,0x81, +0x1, 0x85,0x97,0xb2,0xe4,0x0, 0xc7,0x85,0xb7,0xb2,0xa, 0xa1,0xe7,0xfe,0x0, 0x87, +0x8e,0x8f,0xe7,0xff,0x26,0x9e,0xc6,0xff,0xae,0x8f,0x8e,0x84,0xe2,0x0, 0xce,0x81, +0xe7,0xff,0x1, 0x9c,0x16,0xa0,0x3e,0xde,0xe7,0xff,0x2e,0x9d,0x8f,0x8f,0xe7,0xff, +0x2f,0x9a,0xe7,0xff,0x0, 0x9b,0xe4,0xf, 0x36,0xcf,0x3f,0x9d,0x37,0x81,0xe0,0x2f, +0x3f,0x9c,0x11,0x81,0x39,0x9f,0xe7,0xff,0x0, 0xac,0xe0,0x3, 0x1f,0xc6,0x8f,0x8f, +0xe2,0x0, 0xcf,0xb8,0xe7,0xfe,0x2, 0xdf,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe7,0xfe, +0x0, 0xda,0x17,0x0, 0xe0,0x1, 0xaf,0x62,0xe7,0xfe,0x0, 0xb5,0x37,0x21,0xe0,0x1, +0xaf,0x2, 0x0, 0xc3,0xe0,0x2, 0x1e,0xa1,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xaf,0x1f, +0xc7,0x81,0xaf,0x1d,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xaf,0xf, 0x38,0x82,0x8, 0xb2,0xc0,0x7c,0xe0,0x1, 0xd1,0x1a,0xdf,0xe, 0xdd,0xcb, +0xe0,0x2, 0x1f,0x8f,0x2c,0x10,0x8f,0xf, 0xe0,0x3, 0x19,0x4, 0xe2,0x0, 0xcf,0x1, +0xe0,0x1, 0xac,0x42,0x1, 0x25,0xdd,0xbf,0x24,0x11,0xe0,0x1, 0x8f,0xe2,0x2f,0x9b, +0xc0,0x4, 0x9, 0x61,0x8f,0xf, 0xe0,0x3, 0x19,0x4, 0xe2,0x0, 0xcf,0x1, 0x1, 0x18, +0xe0,0x1, 0x8f,0xc2,0x2f,0x9a,0xdd,0xaf,0x2c,0x71,0x7c,0x1, 0xef,0xfc,0xd2,0x25, +0xe0,0x0, 0x1f,0x8e,0x64,0x1, 0xac,0xf, 0xe0,0x0, 0x1f,0x8c,0xac,0xf, 0xe0,0x1, +0x8f,0xe2,0x27,0xe7,0x14,0x0, 0xc0,0x4, 0x9, 0x21,0xe7,0x81,0x0, 0xa3,0x17,0x1, +0x16,0x0, 0xe0,0x1, 0xaf,0x42,0xae,0xf, 0x17,0x80,0xe0,0x2, 0x1e,0xa1,0xe0,0x2, +0x1f,0x20,0xaf,0x8d,0x16,0x7, 0xaf,0x9d,0xe0,0x2, 0x1e,0xf7,0xaf,0x8e,0xae,0xd, +0xe0,0x2, 0x1f,0x1f,0xe0,0x2, 0x1e,0xb4,0xaf,0x8e,0xaf,0x8d,0x0, 0xc5,0x0, 0x0, +0xe0,0x0, 0x1f,0x85,0x8f,0xf, 0xe0,0x0, 0x1f,0x8d,0xe0,0x0, 0x27,0x60,0xe0,0x0, +0x1f,0xe, 0x8e,0xe, 0xe2,0x0, 0xce,0x2, 0x1, 0x8, 0x17,0xa, 0x3f,0x38,0x3f,0x9e, +0xf0,0x10,0x8b,0xaf,0x5, 0xb4,0x38,0x82,0x8e,0xbf,0xf0,0x0, 0x8b,0x9f,0xf0,0x0, +0x8b,0xf, 0xf0,0xe, 0x3b,0xad,0x8d,0xaf,0xe2,0x0, 0xcf,0x0, 0xe8,0x17,0x3e,0xa7, +0xf2,0x1, 0xc3,0xff,0xf0,0xd, 0x3b,0x2b,0xe2,0x1, 0xc7,0x7f,0xe8,0x6e,0x3d,0x27, +0xe8,0xb, 0x3d,0xa6,0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc5,0xff,0xe2,0x1, 0xc6,0xff, +0xe0,0x6d,0x3d,0x2b,0xf0,0x40,0x3b,0xee,0x3d,0xed,0xf2,0x1, 0xc3,0xff,0xe2,0x1, +0xc5,0xff,0xf0,0x40,0x3b,0xfb,0x3, 0x82,0x3f,0x6d,0x15,0x8a,0x3d,0xb8,0x3e,0xee, +0xe0,0xf, 0x3f,0x9b,0xf0,0x10,0x8b,0xaf,0xe2,0x1, 0xc6,0xff,0xf2,0x0, 0xcb,0x94, +0x2, 0x99,0xf2,0x0, 0xcb,0x8a,0x2, 0xad,0xea,0x12,0x7f,0x4, 0xe0,0xf, 0x3f,0x18, +0x8d,0x89,0xf0,0x0, 0x8b,0xf, 0xe8,0x40,0x3d,0xf6,0x3, 0x86,0xf0,0x0, 0xab,0x9, +0x8f,0x8f,0xaf,0x8a,0x8d,0x89,0xe2,0x0, 0xce,0x2, 0x1, 0x1f,0x3f,0x18,0xad,0x8e, +0x38,0x82,0x17,0x85,0xaf,0x89,0xaf,0x8a,0x0, 0xe8,0xea,0x12,0x7e,0x84,0x3f,0xed, +0xe1,0x80,0xbf,0x1f,0xc7,0x84,0xbf,0x1d,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f, +0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xb7,0xf, 0x38,0x82, +0x17,0x84,0xaf,0x89,0xaf,0x8a,0x0, 0xd1,0xe0,0xf, 0x36,0xc1,0xe2,0x1, 0xc7,0xff, +0x3f,0xfb,0x3, 0x8d,0xf2,0x0, 0xcb,0x95,0x16,0x83,0xe0,0x6d,0x3c,0xac,0x3e,0xff, +0xe0,0x6f,0x3b,0xad,0x3d,0xef,0xe2,0x1, 0xc5,0xff,0xad,0x89,0xad,0x8a,0x8d,0x89, +0x0, 0xce,0x0, 0x0, 0x8, 0xb3,0x39,0x68,0xe0,0x1, 0x1c,0x67,0x39,0xe9,0xe0,0xc, +0x15,0x52,0x14,0x80,0xe0,0x5, 0xde,0xe0,0xe0,0x2, 0x1f,0xfd,0x16,0x7a,0x8c,0x5f, +0x3e,0x12,0xf0,0x2c,0x13,0x99,0xe0,0xe, 0x3e,0x38,0xf0,0x17,0x3b,0x93,0xf0,0x17, +0x3b,0x9e,0x8c,0xcf,0xe0,0x1, 0x1f,0xff,0xf0,0x17,0x33,0xa1,0xf0,0x0, 0x12,0x87, +0x15,0xd, 0xf0,0x1, 0x1b,0x4a,0xe0,0x14,0x34,0x21,0xf0,0x17,0x3b,0x9f,0xf0,0x15, +0x3a,0x92,0xe0,0xa, 0x3d,0x13,0x3f,0xe3,0xe8,0x40,0x3e,0xe7,0xe8,0x40,0x3f,0x66, +0xe2,0x0, 0xce,0x0, 0x4, 0xc, 0x3c,0xfc,0x15,0xfa,0x3d,0x9f,0x5, 0x8, 0xe2,0x0, +0xcd,0x80,0x4, 0x5, 0x3c,0x7b,0x5, 0x3, 0x95,0x8e,0xb5,0x8d,0xc7,0x81,0x3f,0xfa, +0xc7,0x2, 0xc6,0x82,0x1, 0xee,0xc6,0x1, 0xe8,0x40,0x3e,0x75,0xf0,0x0, 0xc3,0x1a, +0xf8,0x17,0x3b,0x94,0x1, 0xe1,0x9, 0xe1,0xe0,0x0, 0x1f,0xe, 0xf0,0x2, 0x1a,0x1c, +0x17,0x80,0xf0,0x0, 0x89,0x8e,0xe8,0x7, 0xaf,0xc4,0xe8,0xf, 0xaf,0x94,0xe8,0x16, +0xaf,0xe4,0xe8,0x1e,0xaf,0xb4,0xf0,0x1, 0x21,0xb9,0x8, 0xb7,0x11,0x0, 0xe4,0x8, +0x34,0x29,0xe4,0x9, 0x34,0xa9,0xf0,0x0, 0x1b,0xd, 0xe4,0x8, 0x34,0x48,0xe4,0x9, +0x34,0xc8,0xf0,0x40,0x39,0x62,0x3a,0x62,0xf0,0x40,0x38,0xe2,0x3a,0xe2,0xf0,0x40, +0x38,0x62,0x39,0xe2,0x38,0xe2,0x3e,0xe2,0x3d,0x7d,0xe0,0x1, 0x1, 0xd, 0xe8,0x0, +0x8f,0x6, 0xe8,0x0, 0x8f,0x96,0xe4,0xe, 0x37,0x29,0xe4,0xf, 0x37,0xa9,0xe4,0xe, +0x37,0x48,0xe4,0xf, 0x37,0xc8,0xe0,0xb, 0x3f,0x18,0xe0,0xc, 0x3f,0x99,0xe4,0xb, +0x35,0xa7,0xe4,0xc, 0x36,0x27,0xe1,0x37,0x3c,0x2e,0xe4,0xb, 0x35,0xc8,0xe4,0xc, +0x36,0x48,0xe1,0x35,0x3c,0xaf,0xf0,0x0, 0x23,0x94,0xf0,0x0, 0x22,0x92,0xe1,0x26, +0x3c,0x2b,0xe1,0x27,0x3c,0xac,0x3b,0x57,0x23,0xb, 0xe0,0x3, 0x30,0xa1,0xe8,0x3, +0x39,0x94,0xc0,0x81,0xad,0x83,0xe2,0x1, 0xc0,0xff,0xae,0x13,0x39,0xe6,0xe1,0x2e, +0x3f,0x28,0xf0,0x0, 0x22,0x9e,0x27,0x1c,0xe1,0x35,0x3d,0xa8,0xe1,0x26,0x3c,0xac, +0xf0,0x15,0x3a,0xd6,0xf0,0x0, 0x22,0x95,0x12,0xbc,0xe8,0x5, 0x3a,0x90,0x32,0xa1, +0xf0,0x6, 0x30,0x21,0xe8,0x5, 0x3a,0x94,0xad,0xa5,0xf0,0x0, 0xc0,0x1, 0xf0,0x5, +0x3a,0x16,0xe0,0xf, 0xae,0x35,0xf2,0x1, 0xc0,0x7f,0xe8,0x40,0x3a,0xe5,0xe1,0x2f, +0x3f,0xa9,0xf0,0x0, 0x23,0x9e,0x27,0x9c,0xe1,0x37,0x3c,0x2b,0xe1,0x26,0x3e,0x29, +0xf0,0x17,0x3b,0xd6,0xf0,0x0, 0x23,0x95,0x12,0x1e,0xe8,0x4, 0x3a,0x11,0x32,0x21, +0xf0,0x6, 0x30,0xa1,0xe8,0x4, 0x3a,0x14,0xad,0x94,0xf0,0x0, 0xc0,0x81,0xf0,0x4, +0x3a,0x16,0xe0,0x7, 0xae,0x64,0xf2,0x1, 0xc0,0xff,0xe8,0x40,0x3a,0x67,0x27,0x1b, +0x27,0x9a,0xe1,0x2f,0x3d,0xa8,0xe1,0x2e,0x3e,0x29,0x3f,0xde,0x27,0x94,0xe0,0x0, +0x17,0x5a,0xe8,0xe, 0x3f,0x12,0x37,0x21,0xf0,0x2, 0x31,0x21,0xe8,0xe, 0x3f,0x14, +0xad,0xbe,0xf0,0x0, 0xc1,0x1, 0xf0,0xe, 0x3a,0x12,0xe0,0x17,0xae,0xe, 0xf2,0x1, +0xc1,0x7f,0x39,0x6f,0xc6,0x81,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf3,0xf0,0x0, +0xc3,0x2, 0xe7,0xfe,0x1, 0xeb,0x29,0x8a,0x22,0x83,0xf8,0x16,0xa8,0x64,0x22,0x3, +0xf8,0xf, 0xa8,0x94,0x29,0x6, 0xb, 0xe1,0x38,0x82,0xe8,0x7, 0xa8,0xc4,0x0, 0xf5, +0xf8,0x1e,0xa9,0x34,0xb, 0xe1,0x2c,0x2a,0x3f,0xe9,0x24,0x95,0x3f,0xe8,0x17,0xd, +0x3f,0x38,0x3f,0x19,0xe0,0xd, 0x37,0x21,0x3e,0x9b,0xe0,0x40,0x96,0x9d,0x3f,0x1a, +0xe2,0x0, 0xce,0x80,0xe0,0x0, 0x5, 0x47,0x16,0x81,0xe0,0x40,0xae,0x9e,0xe2,0x0, +0xcc,0xb, 0x2, 0x90,0x17,0x1, 0x3f,0x1f,0xe4,0x0, 0xc7,0xd, 0x3f,0x19,0xe0,0xd, +0x37,0x21,0x3e,0x9b,0x96,0x8d,0x3f,0x1a,0xe2,0x0, 0xce,0x80,0x5, 0x2d,0x16,0x81, +0xae,0x8e,0xe2,0x0, 0xcc,0x8b,0x5, 0x96,0x38,0x82,0x17,0x7f,0x3f,0x18,0xe4,0x0, +0xc7,0xd, 0x3f,0xe8,0x3f,0x19,0xe0,0xd, 0x37,0x21,0x3e,0x9b,0x96,0x8d,0x3f,0x1a, +0xe2,0x0, 0xce,0x80,0x5, 0x1c,0x16,0x81,0xae,0x8e,0x2c,0xca,0xe2,0x0, 0xcc,0xb, +0x5, 0xda,0xe4,0x0, 0xc7,0x8d,0x3f,0x99,0xc7,0x81,0xe0,0xe, 0x37,0xa1,0x3d,0x9e, +0x97,0xb, 0x3f,0x9a,0xe2,0x0, 0xcf,0x0, 0x5, 0x4, 0x17,0x1, 0xaf,0xf, 0x38,0x82, +0x17,0x2, 0xaf,0xf, 0x38,0x82,0x16,0x82,0xae,0x8e,0x0, 0xd4,0x16,0x82,0xae,0x8e, +0x0, 0xe5,0x16,0x82,0xe0,0x40,0xae,0x9e,0xe7,0xff,0x0, 0xbb,0x8, 0xb7,0xe1,0xfc, +0xc0,0x0, 0xe0,0x2, 0x1f,0xdd,0x17,0x1, 0x8f,0x8f,0xe0,0x2f,0x3f,0x8e,0xe0,0x1, +0x27,0x83,0x17,0x94,0xe1,0x28,0x3c,0x1f,0xe0,0x0, 0x24,0x7e,0xe0,0x1, 0x1f,0xca, +0x16,0x0, 0xe0,0xa, 0x97,0xcf,0xe2,0x7, 0xcf,0xe8,0xe0,0x0, 0x5, 0x79,0xe0,0x1, +0x1a,0x49,0x11,0x0, 0xe0,0x1, 0x1d,0xc8,0x39,0xe4,0x3c,0xe2,0x17,0xe6,0x3f,0x93, +0xe0,0x80,0x97,0x1f,0x16,0x81,0x3e,0x7e,0x3e,0x99,0x3, 0x5, 0x3c,0xed,0x39,0x1e, +0xe3,0xff,0xc4,0xff,0x3f,0xf3,0x1, 0xf5,0xc1,0x9a,0x39,0xfb,0x1, 0xf0,0x24,0x85, +0x3c,0x62,0xe0,0x5, 0xdc,0xe8,0x39,0x68,0xe0,0x2, 0x15,0x52,0x14,0x80,0xe2,0x1, +0x7c,0x30,0xe0,0x5, 0xdd,0x39,0xe2,0x1, 0x7d,0xb0,0x15,0x0, 0x17,0x66,0x3f,0x14, +0x3e,0x6b,0x0, 0x85,0xb7,0x8c,0x3f,0x74,0xc6,0x2, 0x1, 0x11,0xe0,0x80,0x96,0x9e, +0xe2,0x0, 0xce,0x80,0xe0,0xf, 0x3e,0xa2,0xe0,0x43,0x3f,0x9f,0x5, 0x75,0xe2,0x0, +0xcf,0x80,0x3, 0x71,0x3f,0x74,0xb5,0xc, 0xc6,0x2, 0x1, 0xf1,0x12,0x1a,0x3a,0x1e, +0x3a,0x73,0xc5,0x9a,0x1, 0xe4,0x13,0x4, 0x3b,0x10,0x14,0x80,0xe0,0x1, 0x15,0x29, +0x3c,0x66,0xe0,0x5, 0xdd,0x11,0x17,0x81,0x14,0x86,0xe0,0x0, 0x12,0xd7,0xe0,0xa, +0xaf,0xc6,0x3a,0x90,0x17,0x81,0x3b,0xe9,0x3a,0x69,0xe7,0xff,0x11,0xb3,0xe2,0x1, +0xc2,0x7f,0x39,0x95,0x39,0x67,0x0, 0x83,0xe0,0x9, 0x8f,0xe3,0xe2,0x0, 0xcf,0x81, +0xc1,0xf3,0x1, 0x19,0xc1,0x7f,0xe0,0x43,0x39,0x2, 0xe3,0xff,0xc9,0x7f,0x1, 0xf5, +0x14,0xff,0x3c,0x94,0xe0,0x43,0x3c,0x89,0xe3,0xff,0xcc,0xff,0x1, 0x15,0xe1,0xc0, +0x8f,0x95,0x0, 0xe3,0xe0,0x1, 0x1f,0xca,0xe0,0xa, 0x97,0xcf,0xe0,0xc, 0x37,0x82, +0xe7,0xff,0x0, 0x87,0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0x3d,0x66, +0x3c,0xe4,0xdf,0xa, 0x0, 0xe0,0x12,0x8a,0x3a,0x90,0x14,0x86,0x13,0x7, 0x3a,0x69, +0xe2,0x1, 0xc2,0x7f,0x39,0x65,0x39,0xe6,0xe0,0xb, 0x8f,0xb2,0xc1,0xd, 0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x1, 0xa, 0x17,0x81,0x3f,0x93,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xe0,0x43,0x39,0x8f,0x1, 0xf1,0x14,0xff,0x3c,0x94,0xe0,0x43,0x3c,0x89, +0xe3,0xff,0xcc,0xff,0xc2,0xff,0x1, 0xe4,0x12,0x8b,0x3a,0x90,0x3b,0x65,0x12,0x7, +0xe0,0x0, 0x13,0x86,0xe2,0x1, 0xc2,0x7f,0x39,0xe6,0x39,0x67,0xe0,0x9, 0x8f,0xe3, +0xc1,0xf3,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x5d,0xc1,0x7f,0xe0,0x43,0x39,0x2, +0xe3,0xff,0xc9,0x7f,0x1, 0xf4,0x17,0x81,0x3f,0x94,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xc3,0x1, 0xe0,0x43,0x3a,0xf, 0x1, 0xe6,0x12,0x7, 0xe0,0x40,0x3b,0x64, +0xe2,0x1, 0xc2,0x7f,0x39,0x65,0x39,0xe6,0xe0,0xb, 0x8f,0xb2,0xc1,0xd, 0xe2,0x0, +0xcf,0x81,0xe0,0x1, 0x1, 0x55,0x17,0x81,0x3f,0x93,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xe0,0x43,0x39,0x8f,0x1, 0xf1,0x17,0x81,0x3f,0x94,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x8d,0xc2,0x81,0xe0,0x43,0x3a,0xf, 0x1, 0xe3,0x15,0x0, 0x14,0x11, +0x3c,0x10,0x39,0x6a,0x14,0x82,0x12,0x82,0x12,0x1, 0x39,0xea,0x17,0x72,0x3f,0x18, +0x3e,0xe8,0x3d,0xe2,0x8e,0x1e,0xe0,0x0, 0x2e,0x56,0xe0,0x1, 0x25,0x47,0xe0,0x43, +0x8f,0xad,0xe2,0x0, 0xcf,0x82,0xe0,0x0, 0x1, 0x6a,0xe0,0x0, 0x25,0xda,0x8f,0x8e, +0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x0, 0xe2,0x0, 0xcd,0xc, 0xe0,0x1, 0x1, 0x5d, +0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x46,0xe2,0x0, 0xcd,0x8c,0xe0,0x1, +0x1, 0xd8,0x17,0x81,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8d,0xc4,0xd, +0xe0,0x43,0x3d,0xf, 0x1, 0xd4,0x16,0x10,0xe0,0x1, 0x15,0x39,0xe0,0x1, 0x1d,0xca, +0x3e,0x10,0x3d,0x10,0x17,0xf3,0x3f,0x9c,0xe0,0x40,0x3f,0x6b,0xe0,0x80,0x8e,0x9f, +0x2e,0x82,0xb6,0x8e,0x3f,0xfc,0xc7,0x2, 0x1, 0xfa,0x16,0xd, 0x3e,0x1f,0x3d,0x7c, +0xc5,0x9a,0x1, 0xf1,0xe0,0x4, 0xc0,0x0, 0xb, 0xe1,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, +0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x0, 0x1, 0x41,0x8f,0xae,0xe2,0x0, 0xcf,0x82, +0x1, 0x89,0x16,0x1, 0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0xe2,0x0, 0xce,0x1, 0x5, 0x82, +0xac,0x9e,0x17,0x81,0x3f,0x9b,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8d,0xc6,0x81, +0xc7,0x1, 0xe0,0x43,0x3d,0x8f,0xe7,0xff,0x1, 0x9f,0xe7,0xff,0x0, 0xbc,0xe2,0x0, +0xcd,0xc, 0xe0,0x0, 0x1, 0x5c,0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0x8f,0xae,0x1, 0x5f, +0xe2,0x0, 0xcf,0x82,0x1, 0xe7,0x3e,0x6b,0x0, 0xde,0x25,0xd0,0x8f,0x8e,0xe2,0x0, +0xcf,0x82,0x1, 0x8, 0xe2,0x0, 0xcd,0xc, 0x1, 0x99,0xe2,0x0, 0xcd,0x8c,0x1, 0xce, +0x0, 0xd9,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x0, +0x1, 0x6a,0xe2,0x0, 0xcd,0x8c,0x1, 0x4d,0x8e,0x2e,0xe2,0x0, 0xce,0x2, 0x1, 0x43, +0xac,0x9e,0x0, 0xc8,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82, +0xe0,0x0, 0x1, 0x57,0xe2,0x0, 0xcd,0x8c,0xe7,0xff,0x1, 0xb1,0xe7,0xff,0x0, 0x83, +0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0xe2,0x0, 0x7d,0x4, 0x3c,0xe4, +0xdd,0xf3,0xe7,0xfe,0x0, 0x9c,0x3c,0x63,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0, +0xe2,0x0, 0x7d,0x4, 0x3c,0xe4,0xdd,0xe8,0xe7,0xfd,0x0, 0xef,0x3c,0x63,0xe2,0x1, +0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0xe2,0x0, 0x7d,0x4, 0x3c,0xe4,0xdd,0xdd,0xe7,0xfe, +0x0, 0xa4,0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0x1, 0x1d,0x8f,0xae,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x1, 0x91,0xe7,0xff,0x0, 0xa9,0x25,0xf5,0x8f,0x8e,0xe2,0x0, 0xcf,0x82, +0x8f,0x8d,0x1, 0x45,0xe2,0x0, 0xcf,0x82,0x1, 0xd, 0xe2,0x0, 0xcd,0x8c,0xe7,0xfe, +0x1, 0x4a,0x8f,0xae,0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xfd,0x3e,0x6a,0xe7,0xfe, +0x0, 0xf3,0x3e,0x63,0xe2,0x0, 0xcd,0x8c,0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0x1, 0x17, +0x8f,0xae,0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xea,0xe7,0xfe,0x0, 0xe5,0x3e,0x64, +0x0, 0xf2,0x3e,0x65,0x0, 0xf0,0xe2,0x0, 0xcd,0x8c,0xe7,0xfe,0x1, 0x64,0x8f,0xae, +0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xdf,0xe7,0xfe,0x0, 0xd6,0xe2,0x0, 0xce,0x1, +0xe7,0xfe,0x2, 0xd8,0xe7,0xfe,0x0, 0x9f,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x64, +0xe0,0x2, 0x1e,0xfd,0x39,0x68,0x8e,0xdd,0xf0,0x40,0x3d,0x69,0x3f,0xed,0x7e,0x86, +0x3f,0xb8,0xe0,0x1, 0x1e,0xf2,0x3f,0x99,0xa7,0xd, 0x37,0xa1,0x3f,0x9e,0x94,0xf, +0x14,0x8a,0x7d,0x1, 0xe0,0x5, 0xda,0xb4,0xe0,0x2, 0x1f,0x7d,0x65,0x1, 0x8f,0x4e, +0xe0,0x43,0x39,0x98,0xe8,0x40,0x3c,0xea,0x3c,0x62,0x7f,0x3, 0xdc,0xa6,0xe8,0x43, +0x3f,0x8a,0xe2,0x0, 0xcf,0x80,0x7f,0x85,0xe0,0x5, 0x4, 0x7b,0xe0,0x2, 0x1e,0xdd, +0x17,0x0, 0x7e,0x84,0xf7,0xff,0x14,0x7a,0x7f,0x2, 0xf0,0x0, 0x16,0x86,0xe0,0x1, +0x1f,0xf2,0xe0,0x2, 0x1d,0x9c,0xe0,0x2, 0x1e,0xfd,0x67,0x4, 0x63,0x82,0xa2,0x8f, +0x8a,0x5d,0xe0,0x43,0x3f,0x82,0xe0,0x7, 0x8c,0xcb,0xf0,0x0, 0x8d,0x8e,0x60,0x85, +0x7f,0x87,0x3b,0x67,0x66,0x87,0xe2,0x0, 0xce,0x80,0xe0,0x1, 0x4, 0xc, 0x67,0x2, +0xf0,0x0, 0x11,0x80,0xf0,0x43,0x3c,0x8e,0xe8,0x14,0x38,0xaa,0xf8,0x3c,0x3c,0x19, +0xf8,0x3e,0x3c,0x9d,0xe0,0x8, 0x30,0xa1,0xf0,0x40,0x39,0x62,0xf8,0x40,0x38,0x63, +0xf8,0x43,0x3b,0x14,0xf0,0x0, 0xc4,0x86,0xe8,0x43,0x3d,0x2, 0xe0,0xf, 0x3d,0x34, +0x3f,0x91,0x37,0xa1,0x3f,0x95,0xf0,0x0, 0x90,0x8f,0x24,0xaa,0xe0,0x15,0x3d,0x22, +0x3e,0xe7,0x35,0x21,0x3f,0xe6,0xf8,0x43,0x3b,0x95,0x0, 0x8e,0xf2,0x0, 0xca,0x1, +0x2, 0x1d,0xf2,0x0, 0xcb,0x80,0xe0,0x0, 0x5, 0x4a,0xf2,0x0, 0xca,0x81,0x2, 0x16, +0x3c,0xff,0x3e,0xef,0x5, 0x15,0xe0,0xe, 0x36,0xa1,0x3f,0x1b,0x8e,0xe, 0xc7,0x81, +0x3e,0x7a,0xe0,0x43,0x3f,0x8f,0x4, 0x75,0x8f,0x1e,0x3c,0x7e,0x2, 0x72,0xf2,0x0, +0xcb,0x0, 0x2, 0x65,0xf3,0xff,0xcb,0x7f,0x3, 0x65,0x3c,0xfd,0x2, 0x35,0xe8,0x40, +0x39,0xf1,0xe0,0x0, 0x2, 0x51,0xe8,0x43,0x3f,0x83,0xf0,0x2e,0x3c,0x1f,0x2f,0x13, +0xf0,0x0, 0x2e,0x12,0xe8,0x2e,0x3f,0x9d,0x2f,0xe, 0xf0,0x0, 0x2f,0xd, 0xc7,0x86, +0xe4,0x0, 0xc7,0x8d,0xe0,0x1, 0x1e,0xca,0xe8,0xf, 0x3f,0x99,0x37,0xa1,0x3f,0x9d, +0xf0,0x0, 0xb0,0x8f,0xf0,0x0, 0xc0,0x1, 0xf3,0xff,0xc0,0x7f,0x17,0xff,0xe8,0xf, +0x3f,0x92,0xf1,0xff,0xc1,0xff,0xe2,0x1, 0xc7,0xff,0xf2,0x1, 0xc1,0xff,0xf0,0x0, +0x21,0xc, 0xf0,0x40,0x39,0x6f,0xe7,0xff,0x0, 0xa1,0xf3,0xff,0xcb,0xff,0xe7,0xff, +0x3, 0x39,0x3c,0xfd,0x5, 0x4d,0xf0,0x0, 0x20,0xe, 0x67,0x82,0xc0,0xff,0xc7,0xff, +0xe0,0x43,0x38,0x81,0xe2,0x1, 0xc7,0xff,0xe3,0xff,0xc8,0xff,0x7f,0x82,0xe7,0xfe, +0x1, 0xf3,0xf0,0x0, 0x61,0x83,0xf1,0xff,0xc1,0xff,0xe8,0x40,0x39,0x73,0x4, 0xf, +0x67,0x86,0xc7,0xff,0xe8,0x40,0x3f,0xfa,0xe0,0x1, 0x2, 0x3b,0xc0,0x1c,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xf2,0x0, 0xcd,0x81,0x5, 0xca,0x0, 0xde,0x66,0x84,0xe0,0x1, +0x1f,0x72,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, 0x15,0x81,0x8e,0x8d,0xf0,0x0, 0x13,0x0, +0xf0,0x1b,0x3d,0x92,0xf0,0x0, 0xa0,0x8e,0xf0,0x0, 0x8c,0xdf,0xe0,0x16,0x8d,0x6b, +0xf0,0x0, 0x62,0x85,0x7e,0x82,0xf2,0x1, 0xc5,0xff,0xf8,0x40,0x3e,0x66,0xf7,0xff, +0x16,0xfa,0xf0,0x0, 0x17,0x6, 0xf8,0x40,0x38,0x66,0x67,0x3, 0xe8,0x40,0x3f,0x7b, +0x5, 0xd0,0xe8,0x43,0x3f,0x86,0xe8,0x2d,0x3f,0x9e,0xf8,0x6, 0x3a,0xaa,0xf0,0x38, +0x3e,0x9f,0xc7,0x86,0xf0,0x8, 0x32,0xa1,0xe8,0x40,0x3b,0xeb,0xf0,0x0, 0x13,0x81, +0xf0,0x0, 0x12,0x0, 0xe0,0x43,0x38,0x96,0x7e,0x84,0x7f,0x85,0xe8,0xf, 0x3b,0xb9, +0xe8,0xf, 0x3f,0x95,0x37,0xa1,0xe8,0xf, 0x3f,0x91,0xf0,0x0, 0x91,0xf, 0x25,0x32, +0xe0,0x5, 0x3b,0xa2,0xe0,0x9, 0x33,0xa1,0xe8,0x40,0x3e,0x6c,0xe8,0x40,0x3f,0xe0, +0xe0,0x43,0x3a,0x15,0x0, 0x8e,0xe2,0x0, 0xcb,0x1, 0x2, 0x22,0xe2,0x0, 0xca,0x0, +0xe0,0x2, 0x5, 0xa, 0xe2,0x0, 0xca,0x81,0x2, 0x1b,0x3f,0xfa,0x3e,0x6f,0x3, 0x1a, +0x17,0x3c,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x2e,0xe0,0xd, 0x36,0x21,0x3f,0x79, +0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x2, 0x71,0xe0,0xf, 0x8f,0x3d,0x3c,0x7e, +0x2, 0x6d,0xe2,0x0, 0xc8,0x80,0x2, 0x60,0xe3,0xff,0xc8,0xff,0x3, 0x60,0x3e,0x7a, +0x4, 0x2b,0xe8,0x40,0x39,0xf2,0xe0,0x1, 0x2, 0x6d,0xe8,0x43,0x3f,0x87,0xf0,0x2e, +0x3e,0x9f,0x2f,0x13,0xf0,0x0, 0x2c,0x12,0xe8,0x2e,0x3f,0x9e,0x2f,0xe, 0x67,0x4, +0x2f,0xc, 0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0x66,0x85,0xe0,0x1, 0x1f,0x4a,0x3f,0x9d, +0x37,0xa1,0x3f,0x9e,0xf0,0x0, 0xb1,0xf, 0xf0,0x0, 0xc2,0x1, 0xf3,0xff,0xc2,0x7f, +0xc3,0x81,0x66,0x83,0xe2,0x1, 0xc3,0xff,0x3e,0xf7,0xf0,0x0, 0xc3,0x81,0xf2,0x1, +0xc3,0xff,0xe7,0xff,0x2, 0x9d,0xf7,0xfe,0x22,0x55,0xf1,0xff,0xc2,0xff,0xf8,0x43, +0x3a,0x85,0xf3,0xff,0xca,0xff,0xf1,0xff,0xc3,0x7f,0xf2,0x1, 0xc3,0x7f,0xe7,0xfe, +0x1, 0xf6,0x67,0x86,0xc7,0xff,0xe8,0x40,0x3f,0xfa,0xe7,0xfe,0x5, 0x49,0x13,0x81, +0xe8,0x7, 0x3b,0x9a,0x67,0x6, 0xe2,0x1, 0xc3,0xff,0x3f,0x77,0xe7,0xfe,0x5, 0xc0, +0xe0,0x2, 0x1f,0xdd,0xe0,0x1, 0x1e,0xf2,0xe0,0x2, 0x1d,0x9c,0xe0,0x2, 0x1f,0x7d, +0x7f,0x84,0xf0,0x40,0x3b,0x67,0x8f,0x8f,0xf0,0x0, 0xa6,0xd, 0xf0,0x0, 0x8e,0xde, +0xe0,0x43,0x3e,0x82,0xe0,0xf, 0x8c,0x9b,0x7f,0x82,0xf0,0x0, 0x15,0x81,0x7e,0x85, +0xf0,0x0, 0x14,0x80,0xf7,0xff,0x17,0x7a,0xf0,0x0, 0x10,0x6, 0x67,0x5, 0xe2,0x0, +0xcf,0x0, 0xe0,0x1, 0x4, 0x23,0xe8,0x43,0x3f,0x8b,0xf0,0x0, 0x13,0x80,0xf8,0x6, +0x3b,0x2a,0xf0,0x38,0x3f,0x1f,0xe8,0x31,0x3f,0x90,0xc7,0x86,0xf0,0x8, 0x33,0x21, +0xf0,0x40,0x3a,0xe2,0xf8,0x40,0x3a,0x67,0xe0,0x43,0x38,0x96,0x7f,0x87,0xe8,0x43, +0x3d,0x5, 0xe8,0xf, 0x3d,0x3d,0xe8,0xf, 0x3f,0x96,0x37,0xa1,0xe8,0xf, 0x3f,0x9c, +0xf0,0x0, 0x91,0xf, 0x24,0xb2,0xe0,0x5, 0x3d,0x22,0xe8,0x40,0x3e,0x69,0x35,0x21, +0xe8,0x40,0x3f,0xe9,0xe0,0x43,0x3a,0x15,0x0, 0x8e,0xe2,0x0, 0xcb,0x1, 0x2, 0x22, +0xe2,0x0, 0xca,0x0, 0xe0,0x0, 0x5, 0x5d,0xe2,0x0, 0xca,0x81,0x2, 0x1b,0x3f,0xf9, +0x3e,0x6f,0x3, 0x1b,0x17,0x1e,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x1e,0xe0,0xd, +0x36,0x21,0x3f,0x7a,0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x4, 0x71,0xe0,0x7, +0x8f,0x6d,0x3c,0x7e,0x4, 0x6d,0xe2,0x0, 0xc8,0x80,0x2, 0x60,0xe3,0xff,0xc8,0xff, +0x3, 0x60,0x3e,0x79,0xe0,0x0, 0x4, 0x43,0xe8,0x40,0x39,0xf2,0xe0,0x1, 0x2, 0x4e, +0xe8,0x43,0x3f,0x87,0xf0,0x2e,0x3f,0x1f,0x2f,0x13,0xf0,0x0, 0x2c,0x12,0xe8,0x2e, +0x3f,0x90,0x2f,0xe, 0xf0,0x0, 0x28,0x8d,0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0x66,0x87, +0xe0,0x1, 0x1f,0x4a,0x3f,0x9d,0x37,0xa1,0x3f,0x9e,0xf0,0x0, 0xb1,0xf, 0xf0,0x0, +0xc2,0x1, 0xf3,0xff,0xc2,0x7f,0x17,0xff,0xe8,0xf, 0x3f,0x95,0xf1,0xff,0xc3,0xff, +0xe2,0x1, 0xc7,0xff,0xf2,0x1, 0xc3,0xff,0xf0,0x0, 0x22,0x99,0xf0,0x40,0x3a,0xef, +0xe7,0xff,0x0, 0x97,0xe3,0xff,0xca,0x7f,0xe7,0xfd,0x3, 0x79,0xe7,0xfe,0x0, 0x91, +0x67,0x82,0xe2,0x0, 0xcf,0x81,0xe7,0xfe,0x5, 0xad,0xe7,0xfe,0x0, 0xb6,0xe3,0xff, +0xca,0x7f,0xe7,0xff,0x3, 0x26,0x3e,0x79,0x3, 0x40,0xf0,0x0, 0x22,0xf, 0xf0,0x0, +0xc3,0x1, 0x66,0x86,0xf2,0x1, 0xc3,0x7f,0xe8,0x40,0x3e,0xf6,0xf0,0x0, 0xc5,0x81, +0xf2,0x1, 0xc5,0xff,0xe7,0xfe,0x2, 0xdc,0xe8,0x40,0x39,0x73,0xe7,0xfc,0x3, 0x78, +0x66,0x84,0xe0,0x1, 0x1f,0x72,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, 0x13,0x1, 0x8e,0x8d, +0xf0,0x16,0x3b,0x12,0xf0,0x0, 0xa6,0x8e,0xf0,0x0, 0x8f,0x5f,0xe0,0x1e,0x8d,0x3b, +0x7e,0x82,0xf2,0x1, 0xc3,0x7f,0x12,0x1, 0xf0,0x0, 0x10,0x80,0xf7,0xff,0x11,0x7a, +0xf0,0x0, 0x11,0x86,0x67,0x3, 0xe8,0x40,0x3f,0x76,0xe7,0xfc,0x5, 0xd9,0xe0,0x43, +0x38,0x84,0xe8,0x10,0x3b,0xaa,0xf0,0x3c,0x39,0x11,0xe8,0x3b,0x38,0x93,0xe0,0x17, +0x33,0xa1,0xe8,0x40,0x3c,0x66,0x13,0x1, 0x12,0x80,0xf8,0x43,0x3a,0x90,0xc0,0x86, +0xe8,0xf, 0x3c,0x3e,0x3f,0x97,0x37,0xa1,0xe8,0xf, 0x3f,0x9d,0xf0,0x0, 0x94,0xf, +0xe0,0x0, 0x25,0x51,0xe0,0x19,0x3c,0x22,0xe0,0x9, 0x34,0x21,0xe8,0x40,0x3e,0x61, +0xe8,0x40,0x3f,0xe1,0xf8,0x43,0x3a,0x19,0x0, 0x8d,0xf2,0x0, 0xc8,0x1, 0x2, 0x23, +0xf2,0x0, 0xca,0x0, 0x5, 0x39,0xf2,0x0, 0xcc,0x81,0x2, 0x1d,0x3f,0xfa,0x3e,0x6f, +0x3, 0x39,0xe0,0x0, 0x17,0x5a,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x3e,0xe0,0xd, +0x36,0x21,0x3f,0x79,0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x2, 0x70,0xe0,0x17, +0x8f,0xd, 0xf0,0x40,0x3b,0xfe,0x4, 0x6b,0xf2,0x0, 0xca,0x80,0x2, 0x5f,0xf3,0xff, +0xca,0xff,0x3, 0x5f,0x3e,0x7a,0x3, 0x1e,0xe7,0xfc,0x22,0x8a,0xc3,0x81,0x66,0x86, +0xe2,0x1, 0xc3,0xff,0x3e,0xf7,0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0xe7,0xff,0x2, 0xa4, +0xc0,0x1c,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x67,0x82,0xe2,0x0, 0xcf,0x81,0xe7,0xfe, +0x5, 0xcc,0xe7,0xfe,0x0, 0xec,0xf3,0xff,0xca,0x7f,0x4, 0x65,0x3f,0xfa,0x3e,0x6f, +0x4, 0x49,0xe8,0x40,0x39,0xf8,0x2, 0x26,0xe0,0x43,0x3f,0x86,0xf0,0x2e,0x39,0x1f, +0x2f,0x12,0xf0,0x0, 0x2e,0x11,0xe8,0x2e,0x3f,0x93,0x2f,0xd, 0xf0,0x0, 0x2d,0x8c, +0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0xe0,0x1, 0x1e,0xca,0x3f,0x91,0x37,0xa1,0x3f,0x9d, +0xf0,0x0, 0xb4,0xf, 0xc2,0x81,0xe3,0xff,0xc2,0xff,0xc4,0x1, 0x67,0x83,0xe2,0x1, +0xc4,0x7f,0x3f,0xf8,0xc3,0x1, 0xe2,0x1, 0xc3,0x7f,0xe7,0xff,0x2, 0x83,0xe7,0xff, +0x0, 0xbd,0x67,0x2, 0xe2,0x0, 0xcf,0x1, 0x5, 0xf1,0xe7,0xff,0x0, 0xb7,0xf0,0x0, +0x61,0x83,0xf1,0xff,0xc1,0xff,0xe7,0xfb,0x0, 0xb5,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xc0,0x70,0x3b,0xe8,0xe0,0x1, 0x1c,0x4a,0xe0,0x0, 0x4a,0xcf,0x39,0x6a,0xf0,0x40, +0x3c,0x69,0xe0,0x2, 0x15,0x52,0x14,0x80,0x39,0xec,0x3a,0x6d,0x3b,0x6b,0xe0,0x5, +0xd8,0x2b,0x3d,0xe5,0x3d,0x62,0x3c,0xe4,0x3c,0x63,0xdc,0xbf,0xe0,0x2, 0x1f,0xda, +0x8f,0x8f,0x27,0x87,0xe0,0x2, 0x1f,0xdd,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x11, +0x3c,0x65,0xda,0xa5,0x3c,0xe4,0x3c,0x63,0xd9,0x2e,0x3d,0xe6,0x3d,0x62,0xe8,0x40, +0x3c,0xe8,0x3c,0x67,0xc0,0x10,0xf8,0x0, 0xf, 0x28,0xb, 0xa1,0xe7,0x76,0x0, 0x84, +0xe0,0x0, 0x1f,0x8e,0xf0,0x2, 0x1f,0x5e,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x5, +0xe0,0x3, 0x1f,0x9c,0x8f,0x8f,0x27,0xe5,0xf0,0x0, 0x15,0x8a,0xf0,0x1b,0x3d,0xb6, +0x3c,0xe4,0x3c,0x63,0xd9,0x10,0xf0,0x0, 0x1e,0xd, 0xf0,0x0, 0x14,0xfc,0x3d,0x62, +0x3d,0xe6,0xe8,0x40,0x3c,0xe8,0x3c,0x67,0xf8,0x19,0x3c,0x9b,0xef,0xfb,0xda,0xe4, +0xf8,0x19,0x3c,0x9c,0xe8,0x0, 0x8f,0xd9,0x3c,0x65,0x7f,0x81,0xe8,0x0, 0x8f,0xe9, +0xf8,0x0, 0x9d,0x9, 0x7f,0x82,0xe8,0x0, 0x8f,0xf9,0xe8,0x0, 0x9a,0x99,0x7f,0x83, +0xe8,0x1, 0x8f,0x89,0xf8,0x0, 0x8e,0xc9,0x7f,0x84,0xda,0x61,0x3c,0xe4,0x3c,0x63, +0xd8,0xea,0x3d,0x62,0x3d,0xe6,0xe8,0x40,0x3c,0xe8,0x3c,0x67,0xef,0xfb,0xda,0xc4, +0xe8,0x0, 0x9c,0x8e,0xe8,0x0, 0x9d,0x1e,0xf0,0xe, 0x3d,0x29,0xe3,0xff,0xc7,0x7f, +0xf8,0xb, 0x3e,0x1b,0xe0,0x43,0x3e,0x9e,0xe0,0x7, 0x99,0xeb,0xe0,0xb, 0x3a,0xaa, +0xe2,0x0, 0xce,0x80,0xe3,0xff,0xc5,0xff,0xe8,0xd, 0x3c,0xaa,0xf8,0xf, 0x3e,0x1b, +0xe0,0x43,0x3a,0x1b,0xe0,0x7, 0x99,0x7f,0xe3,0xff,0xc6,0xff,0xe0,0xf, 0x39,0xa9, +0xe0,0x6e,0x3d,0x2d,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xca,0x0, 0xe0,0x8, 0x3d,0x25, +0xe0,0x43,0x3a,0x1f,0xe3,0xff,0xc4,0x7f,0xe0,0xd, 0x39,0x2a,0xe0,0x6b,0x3d,0x28, +0xe3,0xff,0xc6,0xff,0xe2,0x0, 0xca,0x0, 0x3c,0xa3,0xe0,0x43,0x3c,0x1d,0xe3,0xff, +0xc4,0xff,0xe0,0x6f,0x3d,0x29,0x3d,0x22,0xe2,0x0, 0xcc,0x0, 0xe3,0xff,0xc5,0x7f, +0xe0,0x6d,0x3d,0x2a,0x3f,0x1b,0x3f,0x9d,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc7,0xff, +0x3f,0x7f,0x3, 0x93,0x67,0x81,0xf8,0x0, 0xb5,0x9, 0xe8,0x0, 0xaf,0xd9,0x67,0x82, +0xe8,0x0, 0xb2,0x99,0xe8,0x0, 0xaf,0xe9,0x67,0x83,0xf8,0x0, 0xae,0xc9,0xe8,0x0, +0xaf,0xf9,0x67,0x84,0xe8,0x1, 0xaf,0x89,0xc0,0x10,0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x6c,0xe0,0x2, 0x1f,0xdd,0xf0,0x0, 0x1e,0xe, +0x8f,0x8f,0x2f,0x9f,0xea,0x12,0x7a,0x3, 0xf8,0x0, 0x8d,0x8c,0xaf,0x84,0xf0,0x0, +0x25,0xa1,0x17,0x1, 0xaf,0x4, 0x17,0x4, 0xe1,0x2f,0x3f,0x2f,0x2f,0x9a,0x17,0x82, +0xe9,0x2f,0x3f,0xab,0x2f,0x96,0xe0,0x1, 0x1f,0x69,0xea,0x12,0x79,0x82,0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0xaf,0x83,0x1, 0x19,0xc0,0x14,0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0xf8,0x0, 0x8d,0x8c,0xf0,0x0, 0x2d,0xed,0xea,0x12,0x7a,0x3, 0xf0,0x0, 0xad,0x84, +0xea,0x12,0x79,0x82,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0x17,0x1, 0xe2,0x0, 0xcf,0x81, +0xaf,0x3, 0x1, 0xeb,0xf0,0x0, 0x25,0xea,0xf0,0x0, 0x15,0x80,0xf0,0x3, 0x1e,0x9c, +0xe0,0x0, 0x1b,0xd, 0xe0,0x2, 0x1a,0xfd,0xf0,0x1, 0x1c,0x72,0xf0,0x1, 0x1c,0xd7, +0xf0,0x1, 0x1d,0x44,0xe0,0x2, 0x1b,0xff,0xe8,0x40,0x39,0x6b,0x0, 0x90,0x8f,0x87, +0x3f,0xf2,0x1, 0x10,0xf0,0x0, 0xc5,0x81,0xf2,0x1, 0xc5,0xff,0xc1,0x1, 0xe8,0x0, +0x8f,0x8c,0xe2,0x1, 0xc1,0x7f,0x3f,0xf2,0xe0,0x0, 0x5, 0xc8,0xe8,0x0, 0x8f,0x8d, +0x2f,0xef,0xe0,0xe, 0x31,0x21,0x3f,0x16,0x8e,0xe, 0x8f,0xd5,0x8e,0x9e,0x3f,0xbc, +0xe8,0x0, 0xa7,0x8, 0x3f,0x9d,0x37,0xa1,0x3f,0x9e,0x97,0xf, 0xe8,0x0, 0x97,0xa9, +0x3f,0x7f,0x4, 0x65,0x8f,0x83,0x2f,0xb7,0x17,0x83,0xe8,0x3, 0x8d,0xb9,0x6f,0x96, +0x6f,0x97,0x25,0xbd,0x17,0x84,0x14,0x84,0x6f,0x96,0x3c,0x69,0x6f,0x97,0xe8,0x40, +0x3d,0xeb,0x3d,0x62,0xef,0xfb,0xdb,0xf2,0xe8,0x0, 0x8f,0x8a,0xe2,0x0, 0xcf,0x81, +0x1, 0xca,0x17,0x8a,0xe8,0xf, 0x3f,0xbb,0x3f,0x96,0xe0,0x7, 0x9e,0xef,0xe0,0x7, +0x97,0x7f,0xe0,0x7, 0xb6,0xff,0xe0,0x7, 0xb7,0x6f,0xe7,0xff,0x0, 0xbd,0xea,0x12, +0x7a,0x3, 0x87,0x4, 0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x32,0xe7,0xfe, +0x5, 0xf3,0x17,0x32,0xe7,0xfe,0x0, 0xf0,0xf8,0x0, 0xad,0x8c,0xc0,0x14,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0x8f,0x4, 0x14,0x86,0x17,0x86,0x7f,0x1, 0xe8,0x40,0x3d,0xeb, +0x3d,0x62,0x3c,0x69,0x6f,0x96,0x6f,0x97,0xde,0x79,0x0, 0xcf,0x8f,0xf5,0x3c,0xed, +0x3c,0x6c,0x3d,0x62,0x7f,0x84,0x7e,0x3, 0x7e,0x82,0xf0,0x0, 0x8f,0x65,0xef,0xfb, +0xd9,0x34,0xe8,0x0, 0x8f,0x8c,0x66,0x3, 0xe2,0x0, 0xcf,0x83,0x66,0x82,0x5, 0x84, +0x17,0x82,0x6f,0x96,0x6f,0x97,0xe2,0x1, 0xcc,0x7f,0x1, 0x4, 0x17,0x82,0x6f,0x96, +0x6f,0x97,0xe2,0x0, 0xce,0x1, 0x5, 0x86,0xf1,0xff,0xc7,0x7e,0xe8,0x40,0x3e,0x7e, +0x4, 0x3, 0x17,0x82,0x6f,0x96,0xe2,0x0, 0xce,0x81,0x5, 0x85,0x67,0x84,0xc7,0xfe, +0x3e,0xff,0x4, 0x3, 0x17,0x82,0x6f,0x97,0x14,0x96,0x3c,0x90,0x3c,0x62,0xe2,0x0, +0x7d,0x17,0xef,0xff,0xd7,0x7, 0x4c,0x16,0x4c,0x97,0xe7,0xff,0x0, 0x92,0x8f,0x8, +0x3f,0xe8,0x3f,0x79,0x2, 0x8c,0x8f,0x28,0x14,0x0, 0x3f,0x79,0x5, 0x89,0x8f,0x1f, +0x3f,0x7a,0x2, 0x86,0x8c,0x3f,0xe1,0x28,0x3c,0x1a,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe0,0x2, 0x1f,0x42,0x9f,0x88,0x9e,0x8e,0x3f,0xfd,0x2, 0x84,0x17,0x80,0xb7,0x88, +0x38,0x82,0x9f,0xe, 0x3f,0xae,0xb7,0x88,0x38,0x82,0x8, 0xb1,0xc0,0x68,0xe4,0x0, +0x17,0x80,0xe0,0x2, 0x1e,0xfd,0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd, +0x3d,0x1f,0xe0,0xf, 0x34,0x41,0x7f,0x1, 0x34,0xc1,0x7f,0x6, 0x35,0x41,0x7f,0x85, +0xe2,0x0, 0x7c,0x4, 0x17,0x90,0x7f,0x2, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, +0x77,0x8c,0xe0,0x5, 0xd0,0x3a,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, +0x1e,0xfd,0xe4,0x0, 0x17,0x80,0x17,0x0, 0x86,0x5d,0x3c,0x1f,0x86,0xcd,0x3c,0x9f, +0x3d,0x1f,0x7f,0x1, 0xe0,0xf, 0x34,0x41,0x34,0xc1,0x35,0x41,0xe2,0x0, 0x7c,0x4, +0x7f,0x2, 0x7f,0x6, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, 0x7f,0x85,0x6d,0x87, +0xe0,0x5, 0xd0,0x1b,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe4,0x0, 0x17,0x80, +0xe0,0x2, 0x1e,0xfd,0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd,0xe0,0xf, +0x34,0x41,0x7f,0x1, 0x34,0xc1,0x7f,0x6, 0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0xa0, +0x7f,0x2, 0x7f,0x4, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x77,0x8c,0xe0,0x4, 0xdf,0xfd, +0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0x57,0xe0,0x2, +0x1e,0xfd,0xe4,0x0, 0x17,0x80,0xe2,0x0, 0x7d,0xae,0x3c,0x1f,0xf0,0x0, 0x93,0x2e, +0xf0,0x0, 0x93,0xbe,0x95,0x7e,0x3f,0x9b,0xe0,0x1, 0x95,0x8e,0xe0,0x1, 0x1f,0x79, +0xf0,0x0, 0x82,0x4d,0xf0,0x0, 0x82,0xdd,0x16,0x1, 0xe0,0xd, 0x34,0x41,0x37,0xc1, +0x37,0x41,0xe2,0x0, 0x7c,0x14,0xe2,0x0, 0x7c,0x84,0x7e,0x86,0x7f,0x88,0x7f,0x7, +0x75,0x95,0x6e,0x16,0x6e,0x17,0xf0,0x0, 0x6a,0x15,0xf0,0x0, 0x6a,0x94,0xf0,0x0, +0x73,0x12,0xf0,0x0, 0x73,0x93,0x75,0x14,0xe0,0x5, 0xd0,0x27,0x5c,0x7, 0x5f,0x5, +0xe0,0x43,0x3f,0x98,0xe2,0x0, 0xcf,0x80,0xe0,0x41,0x3e,0x4f,0xe0,0x43,0x3e,0x9e, +0x3d,0xe8,0xe0,0x6b,0x3d,0x2c,0xe2,0x0, 0xce,0x80,0x5, 0x13,0x3d,0xfe,0x5, 0xd, +0xe0,0x41,0x3f,0x48,0xe2,0x0, 0xcf,0x80,0x3f,0xee,0xe3,0xff,0xc7,0xff,0xe0,0x68, +0x3d,0x2f,0xe0,0x0, 0xc0,0x68,0x8, 0xe1,0x3c,0x6e,0xe0,0x0, 0xc0,0x68,0x8, 0xe1, +0xe0,0x41,0x3e,0xcd,0x3d,0xfd,0x2, 0x6d,0xe0,0x41,0x3c,0x4e,0xe3,0xff,0xc4,0x7f, +0xe0,0x0, 0xc0,0x68,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, 0x1f,0x7d,0xe4,0x0, +0x17,0x80,0x16,0x80,0x3c,0x9f,0xf0,0x0, 0x81,0xde,0xf0,0x0, 0x82,0x4e,0x3f,0x98, +0xe0,0x16,0x35,0x41,0xe0,0x17,0x35,0x42,0x17,0x1, 0x7e,0x81,0xe0,0x15,0x34,0xc1, +0x7e,0x86,0x3f,0x5a,0x37,0xc1,0xf2,0x0, 0xc3,0x1, 0xf2,0x0, 0xc3,0x81,0x3d,0x6c, +0x3c,0xeb,0xe2,0x0, 0x7c,0x4, 0x7e,0x82,0x7e,0x84,0xf0,0x0, 0x69,0x85,0xf0,0x0, +0x6a,0x4, 0xf0,0x0, 0x7a,0x83,0x7f,0x85,0x6f,0x7, 0xf0,0x0, 0x6b,0x1a,0xf0,0x0, +0x6b,0x9b,0xe0,0x5, 0xd2,0x16,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, +0x1f,0x7d,0x17,0x80,0x86,0x5e,0x86,0xce,0xe9,0xff,0xc4,0x7e,0x7f,0x81,0xe0,0xe, +0x34,0x41,0xe2,0x0, 0x7c,0x4, 0x7f,0x82,0x7f,0x84,0x7f,0x85,0x7f,0x86,0x6e,0x5, +0x6e,0x84,0x7f,0x3, 0xe0,0x5, 0xd2,0x9a,0xc0,0x18,0x8, 0xe1,0x8, 0xb2,0xc0,0x70, +0xf0,0x1, 0x1b,0xe6,0xf0,0x1, 0x1a,0xe5,0xe0,0x1, 0x19,0x78,0xe4,0x0, 0x17,0x80, +0xe0,0x1, 0x1f,0x7f,0xf0,0xc, 0x3a,0x9f,0xf0,0xd, 0x3b,0x9f,0xe8,0x0, 0xb4,0x5, +0x3f,0x92,0xf0,0x99,0x12,0xd6,0xf0,0x0, 0x13,0x1, 0xf0,0x15,0x3a,0x9e,0x36,0x41, +0x36,0xc1,0x37,0xc1,0xe0,0x99,0xc7,0x7e,0xe2,0x0, 0x7c,0x4, 0x7e,0x2, 0x7e,0x83, +0x7f,0x84,0xf0,0x0, 0x6b,0x4, 0xf0,0x0, 0x6b,0x5, 0xe8,0x0, 0xb4,0x85,0xe8,0x0, +0xb5,0x7, 0xb5,0x8e,0xe0,0x5, 0xd0,0xa, 0x9c,0x2, 0xc0,0x10,0x9, 0x61,0xe0,0x3, +0x1f,0xc7,0x8f,0x8f,0xe2,0x0, 0xcf,0x83,0x1, 0x3, 0x14,0x1, 0x38,0x82,0x8, 0xb2, +0x39,0x68,0x3c,0x69,0xef,0xff,0xd3,0x51,0xe0,0x2, 0x1f,0x93,0xe0,0x1, 0x8f,0x1f, +0xe2,0x0, 0xcf,0x5, 0x24,0x7, 0x1, 0x8, 0xe0,0x1, 0x8c,0x1f,0xe0,0x28,0x39,0x8, +0x9, 0x61,0x1, 0xfb,0x0, 0xfc,0xe2,0x1, 0xc1,0x7d,0x14,0x0, 0x29,0x7a,0xea,0x12, +0x7f,0xa2,0x8e,0xf, 0x17,0x1, 0x3f,0x1c,0xe0,0x1, 0x1e,0xc6,0xe2,0x1, 0xc7,0x7f, +0xe2,0x0, 0xcf,0x3, 0x3e,0x9c,0x8c,0xd, 0x2, 0x83,0xaf,0xf, 0x9, 0x61,0xa9,0xf, +0x9, 0x61,0xe0,0x3, 0x1f,0xac,0xe4,0x0, 0xc4,0x8e,0xe0,0xe, 0x3f,0x99,0x8f,0x1e, +0x27,0x5, 0x17,0x1, 0xe0,0x2e,0x3c,0xe, 0x2f,0xd, 0x3f,0x99,0x8f,0xbf,0x27,0x89, +0x17,0x84,0xe0,0x28,0x3c,0xf, 0x24,0x5, 0xe0,0x1, 0x1f,0xe9,0x17,0x0, 0xaf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0x69,0x16,0x80,0xae,0x8e,0x0, 0xf0,0x8, 0xb7,0xe0,0x2, +0x1b,0xc8,0x89,0x87,0xef,0xfe,0xd1,0x3, 0x24,0x7e,0xe0,0x0, 0x19,0x3b,0xe0,0x2, +0x8a,0x2, 0xe0,0xf, 0x39,0x14,0xe0,0x6, 0x8b,0xf, 0x8f,0x4f,0x2f,0x1f,0xe0,0x1, +0x1a,0xe9,0x8f,0x85,0xe2,0x0, 0xcf,0x81,0x1, 0x3f,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f, +0xe2,0x0, 0xcf,0x83,0x1, 0x39,0xe0,0x2, 0x8f,0x2, 0xe0,0x2, 0x8f,0x92,0x3f,0x7f, +0xe0,0x0, 0x3, 0xe6,0xef,0xff,0xd2,0xac,0xef,0xff,0xd2,0xb6,0x24,0x6, 0xe0,0x2, +0x1f,0xe6,0x8f,0x8f,0xe0,0x0, 0x2f,0xd7,0xb, 0xe1,0x8f,0x4f,0xe0,0x2, 0x1e,0x93, +0xc7,0x7f,0xe0,0x5, 0xaf,0x3d,0x8f,0xcf,0xe0,0x1, 0x1a,0xe9,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x1, 0x5e,0x17,0x0, 0xaf,0x5, 0xe0,0xf, 0x39,0x14,0x17,0x0, 0xaf,0x4f, +0x3c,0x66,0xe0,0x1, 0x89,0x9f,0x3c,0xe3,0xef,0xfb,0xdb,0xa2,0x3c,0xe3,0x3c,0x64, +0xe0,0x0, 0xdb,0xf3,0xe0,0x2, 0x8f,0x82,0xc7,0x81,0xe0,0x2, 0xaf,0x82,0x8f,0x85, +0xe2,0x0, 0xcf,0x81,0x1, 0xc3,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x27,0xc5,0xe2,0x0, +0xcb,0x5, 0xe0,0x0, 0x1, 0x40,0x17,0x5, 0x3f,0x33,0xe0,0x3, 0x1f,0xb0,0x3f,0x9e, +0x8c,0xcf,0xe0,0x1, 0x1f,0xf1,0xa4,0xf, 0xef,0xfe,0xd1,0xca,0x3c,0xe3,0x3c,0x66, +0xdf,0x47,0x3a,0x68,0x3c,0xe3,0x3c,0x66,0xe0,0x0, 0xda,0x4c,0x2a,0x2f,0xe2,0x0, +0xcb,0x4, 0xe7,0xff,0x1, 0xaa,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xcf,0xe7,0xff, +0x27,0xa4,0x97,0x8e,0xe2,0xff,0xc7,0xff,0xb7,0x8e,0x17,0x80,0xaf,0x85,0xe7,0xff, +0x0, 0x9c,0x3c,0xe6,0x3c,0x63,0xb, 0xa1,0xe0,0x1c,0x0, 0xd4,0xef,0xfe,0xd9,0xba, +0xac,0x5, 0xe0,0x1, 0xd8,0x43,0xe0,0x1, 0xd7,0x8d,0xef,0xff,0xd2,0xf7,0x8c,0x7, +0xe0,0x0, 0xdd,0xf3,0xef,0xfd,0xdf,0xff,0xe7,0xff,0x0, 0x8e,0xaf,0x85,0xe7,0xff, +0x0, 0xa5,0x17,0x0, 0xaf,0x5, 0xe7,0xff,0x0, 0x80,0xef,0xfb,0xdb,0x7b,0x3c,0xe3, +0x3c,0x66,0xe0,0x0, 0xdd,0x7f,0xe0,0x1, 0x1f,0xe8,0xab,0xf, 0xe0,0x2, 0x1f,0x93, +0xe0,0x5, 0xab,0x4f,0xe0,0x3, 0x1f,0x8f,0xa9,0x8f,0x0, 0xc2,0x8, 0xb3,0xe0,0x0, +0x19,0xbb,0x11,0x0, 0xdf,0x4c,0xc1,0x1, 0xe0,0x2, 0x8f,0x93,0xe2,0x1, 0xc1,0x7f, +0x39,0x7f,0x4, 0xf9,0xe0,0x2, 0x1f,0x93,0xe0,0x5, 0x8c,0x4f,0xe0,0x3, 0x1f,0x8f, +0x8c,0x8f,0x9, 0xa1,0xe7,0x76,0x0, 0xa4,0xe0,0x1, 0x1f,0x42,0xe0,0x2, 0x1f,0x93, +0xe0,0xe, 0x85,0x9e,0x16,0x0, 0xae,0xf, 0x15,0x2, 0xad,0xaf,0xe0,0x2, 0x1e,0xe6, +0xe0,0xe, 0x85,0xae,0x8e,0x8d,0xad,0xbf,0x3d,0x5d,0xe0,0xe, 0x85,0xde,0xe0,0x3, +0xad,0xef,0x2d,0x2d,0xe0,0x10,0x86,0x5e,0xe0,0x10,0x85,0xee,0x3e,0x1b,0xe0,0x2, +0xae,0x6f,0xe0,0xe, 0x86,0x6e,0xe0,0x3, 0xae,0x7f,0x16,0x3f,0x3e,0x5d,0xe0,0x11, +0x8e,0x8e,0xe0,0x10,0x8d,0xfe,0x36,0xa6,0x3e,0xcc,0xe0,0xc, 0x35,0xa7,0x3e,0xcc, +0xe0,0x4, 0xae,0xef,0x2d,0x9b,0xe0,0xd, 0x86,0x5e,0xe0,0xd, 0x86,0xfe,0xe0,0xa, +0xae,0xf, 0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x2d,0x72,0xe0,0xd, 0x85,0xee,0xe0,0xe, +0x87,0xe, 0xe0,0xa, 0xad,0xaf,0xe0,0xa, 0xaf,0x3f,0x0, 0x97,0xe0,0x10,0x85,0xde, +0xe0,0x2, 0xad,0xef,0xe0,0x3, 0xae,0x7f,0x0, 0xd9,0xe0,0xd, 0x86,0x6e,0xe0,0xe, +0x86,0x8e,0xe0,0xa, 0xae,0xf, 0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x25,0x4e,0x17,0x0, +0xe0,0xa, 0xaf,0x2f,0xe0,0xa, 0xaf,0x3f,0x17,0x0, 0xe0,0x1, 0x1e,0x8e,0xe0,0x2, +0x1e,0x44,0x86,0x8d,0x15,0x81,0xae,0xdf,0xaf,0x6f,0xe0,0x1, 0xaf,0x3f,0xe0,0x2, +0xaf,0xf, 0xe0,0x0, 0x1e,0xcd,0xe0,0x1, 0xaf,0x7f,0x86,0x8d,0xe0,0x1, 0xae,0xcf, +0xe0,0x1, 0xaf,0x5f,0x86,0xbc,0xe0,0x1, 0xaf,0x6f,0x87,0x4c,0xe0,0x4, 0xae,0x8f, +0xe0,0x4, 0xaf,0x1f,0xe0,0x1, 0x1f,0xd, 0x86,0x5c,0x8e,0x8e,0xe0,0x1, 0x1f,0xc, +0xe0,0x4, 0xae,0x2f,0x36,0xa8,0xe0,0x3, 0x1e,0xe, 0x8f,0xe, 0x86,0x1c,0x3f,0x4d, +0xe0,0x3, 0x1e,0xc3,0xe0,0x5, 0xae,0x1f,0xe0,0x6, 0xad,0x8f,0x8e,0x8d,0xe0,0x5, +0xb7,0x5f,0x26,0xa2,0xe0,0x3, 0x1f,0x38,0xa7,0xe, 0xa7,0x4e,0xe2,0x0, 0xc7,0x1, +0x27,0x1b,0x16,0x85,0xe0,0x1, 0xae,0x9f,0x17,0x0, 0xe0,0x2, 0xaf,0x5f,0xe0,0x2, +0xaf,0x1f,0xaf,0x4f,0x38,0x82,0xe0,0xd, 0x85,0xde,0xe0,0xd, 0x87,0x7e,0xe0,0xa, +0xad,0xaf,0xe0,0xa, 0xaf,0x3f,0xe7,0xff,0x0, 0xb1,0xe0,0xa, 0xad,0xaf,0xe0,0xa, +0xad,0xbf,0xe7,0xff,0x0, 0xab,0x16,0x0, 0xe0,0x1, 0xae,0x1f,0x17,0x0, 0xe0,0x2, +0xaf,0x5f,0xe0,0x2, 0xaf,0x1f,0xaf,0x4f,0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1f,0x76, +0x34,0xa6,0xf0,0x2, 0x1b,0xf5,0x3c,0x19,0x17,0x80,0xb4,0xe, 0x17,0x0, 0x3d,0xef, +0xe8,0x0, 0xaf,0x7, 0x3e,0xef,0x15,0x1, 0xe0,0xe, 0x34,0x1f,0x16,0x1, 0xe2,0x0, +0xc7,0x1, 0xc7,0x81,0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0xea, +0xe2,0x0, 0xcf,0x8c,0x1, 0xf2,0x2d,0x82,0x38,0x82,0xe8,0x0, 0xae,0x87,0x38,0x82, +0x8, 0xb1,0xf0,0x2, 0x1b,0xfd,0xe0,0x1, 0x1c,0x8b,0xe8,0x40,0x3c,0x67,0xe0,0x19, +0x15,0x1c,0xe0,0x5, 0xd2,0xef,0xe0,0x2, 0x1f,0xe6,0xf0,0x40,0x3b,0xe8,0x87,0x8f, +0xe2,0x0, 0xc7,0x82,0x2f,0xbe,0xe0,0x3, 0x8e,0x98,0xe0,0x3, 0x8f,0x88,0x97,0x58, +0x96,0x68,0x3f,0x9d,0xe0,0x2, 0x1e,0xfc,0x3f,0x1c,0xb7,0xd, 0xe0,0x2, 0x1f,0x74, +0xb7,0x8e,0x17,0x80,0xe0,0x1, 0x1e,0xc2,0xe0,0x2, 0x1c,0x75,0xe0,0xe, 0x8f,0x6d, +0xe0,0xe, 0x8d,0xdd,0x37,0x26,0x3d,0x9e,0xe0,0x2, 0x1f,0x76,0x3d,0x6f,0xb5,0x8e, +0x17,0x0, 0xaf,0x8, 0x3e,0xef,0x14,0x81,0xe0,0xe, 0x35,0x9f,0x16,0x1, 0xe2,0x0, +0xc7,0x1, 0xc7,0x81,0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0x69, +0xe2,0x0, 0xcf,0x8c,0x1, 0xf2,0x2d,0x1f,0xe0,0x1, 0x1f,0xc4,0x8f,0x8f,0x27,0x93, +0xe8,0x0, 0x8f,0xc7,0xe0,0x2, 0x1f,0x73,0x37,0xa6,0xc7,0xff,0xb7,0x8e,0x8, 0xe1, +0xe0,0x2, 0x1f,0xfc,0x96,0xd8,0xe0,0x3, 0x8f,0x8, 0xb6,0x8f,0xe0,0x2, 0x1f,0xf4, +0xb7,0xf, 0x0, 0xc8,0xe8,0x0, 0x8f,0xd7,0xe0,0x2, 0x1f,0x73,0x37,0xa6,0xc7,0xff, +0xb7,0x8e,0x8, 0xe1,0xae,0x88,0x0, 0xe1,0x8, 0xb3,0xe0,0x1, 0x19,0x7f,0xe0,0x1, +0x1f,0xee,0xe0,0xc, 0x11,0xd2,0xe0,0x99,0x16,0xcc,0xe0,0x99,0x17,0x50,0x3e,0x92, +0x3f,0x12,0x3d,0x63,0x3c,0x6f,0x14,0x80,0xbf,0x8d,0xb9,0xe, 0xe0,0x5, 0xd2,0xbc, +0x3d,0x63,0x14,0x80,0x3c,0x62,0xe0,0x5, 0xd2,0xb7,0xe0,0x9c,0xc1,0x16,0x17,0x80, +0xaf,0x82,0x9, 0xe1,0x8, 0xb2,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x24,0x3f,0x1f, +0xe0,0x1a,0x16,0x25,0xe0,0x1a,0x15,0x2a,0x8e,0x8e,0x3e,0x1f,0x3d,0x1f,0xe0,0x1a, +0x17,0x26,0x8d,0x8c,0x8c,0xa, 0x3f,0x1f,0xe0,0x1a,0x16,0x27,0xe0,0x1a,0x14,0xab, +0xe0,0x1a,0x15,0x2c,0x8f,0xe, 0x3c,0x9f,0x3d,0x1f,0x3e,0x1f,0x36,0xa8,0xe0,0x2, +0x19,0x40,0x8e,0xc, 0x3d,0xcd,0xf0,0x1a,0x13,0xad,0x8e,0x89,0x8c,0x8a,0xe0,0x1a, +0x15,0x34,0xf0,0x17,0x3b,0x9f,0x3d,0x1f,0x37,0x28,0x35,0xc5,0x8d,0xa, 0x3e,0x4e, +0x34,0x28,0xe8,0x0, 0x8f,0x7, 0xe0,0x1a,0xc7,0xb5,0xad,0x82,0x36,0x45,0x8f,0x8f, +0xe0,0xb, 0x34,0xa8,0x3e,0xc8,0xae,0x12,0x36,0xc5,0xe0,0xc, 0x35,0x28,0x3f,0x4b, +0xae,0xa2,0x37,0x45,0x3f,0xcc,0xe0,0x1, 0x1c,0x8a,0xe0,0x2, 0x1c,0x3f,0xaf,0x32, +0x37,0xc5,0xe0,0x0, 0x15,0x6a,0xaf,0xd2,0xe0,0x5, 0xd2,0x2c,0xe0,0x4, 0x8f,0xe2, +0xe0,0x1, 0x1c,0xd3,0xe0,0x41,0x3f,0x8f,0x15,0x20,0xe0,0x22,0x14,0x40,0xe0,0x6, +0xaf,0xc2,0xef,0xfe,0xd6,0xff,0x9, 0x21,0xe0,0x2f,0x0, 0x93,0x8, 0xb6,0xe0,0x1, +0x1f,0xc2,0xe0,0x1a,0x15,0xa8,0xe0,0x1a,0x16,0x2e,0xe0,0x1a,0x16,0xb2,0x3d,0x9f, +0x3e,0x1f,0x3e,0x9f,0xe0,0x1a,0x14,0x2a,0xe0,0x1a,0x14,0xac,0xe0,0x1a,0x15,0x30, +0x8a,0x8b,0x8a,0xc, 0x89,0x8d,0x3c,0x1f,0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x11,0x24, +0xe0,0x1a,0x10,0xa6,0xe0,0x1a,0x15,0xa9,0xe0,0x1a,0x16,0x2f,0xe0,0x1a,0x16,0xb3, +0xf0,0x1a,0x13,0xa5,0xe0,0x1a,0x13,0x27,0xf0,0x0, 0x89,0x88,0xf0,0x0, 0x8a,0x9, +0xf0,0x0, 0x8a,0x8a,0xf0,0x17,0x3b,0x9f,0x3b,0x1f,0x39,0x1f,0x38,0x9f,0x3d,0x9f, +0x3e,0x1f,0x3e,0x9f,0xe0,0x1a,0x14,0x2b,0xe0,0x1a,0x14,0xad,0xe0,0x1a,0x15,0x31, +0xf8,0x0, 0x8b,0x7, 0x89,0x2, 0xf0,0x0, 0x8b,0x86,0x88,0x81,0x8d,0x8b,0x8e,0xc, +0x8e,0x8d,0x3c,0x1f,0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x13,0x1a,0xf0,0x1a,0x10,0x1c, +0xf0,0x1a,0x10,0xe4,0xf0,0x1a,0x11,0x1d,0x8c,0x8, 0x8c,0x89,0x8d,0xa, 0x3b,0x1f, +0xf0,0x10,0x38,0x1f,0xf0,0x11,0x38,0x9f,0xf0,0x12,0x39,0x1f,0x32,0xa8,0x32,0x28, +0x31,0xa8,0xe0,0x1, 0x1f,0x57,0x83,0x6, 0xf8,0x0, 0x80,0x0, 0xf8,0x0, 0x88,0x81, +0xf8,0x0, 0x81,0x2, 0x31,0x28,0x30,0xa8,0x3d,0xc5,0xf0,0x13,0x31,0xa8,0xf0,0x14, +0x32,0x28,0x3e,0x44,0xf0,0x15,0x32,0xa8,0x3e,0xc3,0xf0,0x16,0x3b,0x42,0xf0,0x17, +0x3b,0xc1,0xe0,0x41,0x3d,0xcb,0xe0,0x41,0x3e,0x4c,0xe0,0x41,0x3e,0xcd,0xe8,0x8, +0x3c,0x43,0xe8,0x9, 0x3c,0xc4,0xe8,0xa, 0x3d,0x45,0xe0,0x1a,0x12,0x1e,0xe0,0x1a, +0x11,0xb4,0x3a,0x1f,0x39,0x9f,0xb6,0x6e,0xe0,0x1a,0x11,0x1f,0xe0,0x1, 0xb6,0x8e, +0x39,0x1f,0xab,0xe, 0xe0,0x1a,0xc7,0xb5,0xf0,0x0, 0xa8,0x1e,0x10,0x80,0xf0,0x0, +0xb3,0x1e,0xf0,0x0, 0xb3,0xae,0xb5,0xbe,0xb4,0x4e,0xb4,0xde,0xb5,0x7e,0xf0,0x2, +0xa8,0xee,0xf0,0x2, 0xa9,0x7e,0x8d,0x84,0x8e,0x3, 0x8e,0x82,0x8f,0x8f,0x35,0xa8, +0x36,0x28,0x3e,0xcb,0x3f,0xcc,0xe0,0x1, 0xb6,0xce,0xe0,0x1, 0xb7,0x9e,0xe0,0x3, +0xa8,0xae,0xe0,0x3, 0xa8,0xbe,0xb, 0x61,0x8, 0xb1,0xe0,0x0, 0x1c,0xd, 0xe0,0x3, +0x15,0x40,0x14,0x80,0xe0,0x5, 0xd1,0xa0,0xe0,0x1, 0x1f,0xc3,0xe0,0x0, 0x1c,0x4, +0x8d,0xf, 0xe0,0x1, 0x14,0xff,0xe4,0x0, 0xc5,0xa, 0x8, 0xa1,0xe0,0xa3,0x0, 0x94, +0x8, 0xb2,0xe0,0x1, 0x1f,0x8e,0xe0,0x2, 0x1c,0x5e,0x89,0xf, 0xe0,0x1, 0x14,0xff, +0xe4,0x0, 0xc1,0xa, 0x3d,0x62,0xe0,0x5, 0xd1,0x87,0xe0,0x2, 0x1c,0x59,0x3d,0x62, +0xe0,0x1, 0x14,0xff,0xe0,0x5, 0xd1,0x80,0xe0,0x2, 0x1c,0x58,0x3d,0x62,0xe0,0x1, +0x14,0xff,0xe0,0x5, 0xd1,0x79,0xe0,0x2, 0x1c,0x57,0xe0,0x3, 0xd8,0xc3,0xe0,0x2, +0x1e,0xdf,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xb7,0x1f,0xc7,0x82,0xb7,0x1d,0xe1,0x80, +0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80, +0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xb7,0xf, 0x9, 0x61,0x8, 0xb4,0xdd,0x4e,0xde,0x29, +0xde,0x8c,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x15,0x89,0x3d,0x9f,0xe0,0x3, 0x1f,0x30, +0x82,0xb, 0xe0,0x1b,0x15,0x5e,0x3d,0x1f,0xe0,0x1a,0x16,0xe, 0x8c,0x8a,0x3e,0x1f, +0x84,0x1b,0xaa,0xe, 0xe0,0x1a,0x16,0x93,0x82,0x3b,0xf0,0x0, 0x82,0xab,0xf0,0x0, +0x83,0x4b,0xf0,0x0, 0x83,0x8c,0xe0,0x1b,0x15,0x5f,0x80,0xcc,0x3e,0x9f,0xaa,0x3e, +0x3d,0x1f,0x81,0x9c,0x81,0x3c,0xac,0x1e,0x15,0x85,0x84,0x2c,0x8d,0xa, 0xf0,0x0, +0x80,0xd, 0x3d,0x9e,0xf0,0x0, 0xab,0xde,0x16,0xa, 0xf0,0x0, 0xab,0x4e,0x3e,0x1e, +0xf0,0x0, 0xaa,0xae,0x34,0xa8,0xa8,0xcb,0x3d,0x49,0xf0,0x0, 0x80,0x9d,0xf0,0x0, +0x81,0x2d,0xf0,0x0, 0x81,0xbd,0xf0,0x0, 0x82,0x4d,0xa9,0x3b,0xf0,0x1b,0x12,0xe2, +0xac,0x2b,0xf0,0x15,0x3a,0x9f,0xa9,0x9b,0xf0,0x1b,0x13,0xe3,0xe0,0x3, 0x1e,0x84, +0xf0,0x1, 0xa8,0x2e,0xf0,0x17,0x3b,0x9f,0xf0,0x0, 0xa8,0x9c,0xe0,0x1b,0x14,0xe0, +0xf0,0x0, 0xa9,0x2c,0xf0,0x1b,0x13,0x61,0xf0,0x0, 0xa9,0xbc,0xe0,0x1b,0x14,0x64, +0xf0,0x0, 0xaa,0x4c,0xe7,0xef,0x16,0x7f,0xb5,0x1d,0xf0,0x16,0x3b,0x1f,0x97,0x5d, +0xe8,0x0, 0x8d,0x5, 0x3c,0x1f,0x3c,0x9f,0x3f,0x5c,0xe0,0x1b,0xc7,0xe5,0xe8,0x0, +0x8e,0x7, 0xf7,0xf7,0x13,0xff,0x35,0x28,0x8c,0x89,0xe8,0xe, 0x3f,0x57,0xf0,0x0, +0x83,0x88,0x84,0xf, 0xe7,0xfe,0x17,0xff,0xe8,0x0, 0x8d,0x86,0x3f,0xde,0xe0,0xe, +0x3e,0x4a,0xe7,0xff,0x16,0x3f,0x34,0xa8,0x3f,0xdc,0x3d,0xc9,0xb7,0xdd,0xb5,0xad, +0xb7,0x3d,0xf0,0x1, 0xab,0x8d,0xe0,0x1, 0xac,0x1d,0xef,0xff,0xd0,0xfd,0xde,0x7f, +0xdf,0x2c,0xdf,0x3f,0xe0,0x1, 0xd8,0x2a,0xef,0xfe,0xdf,0x3c,0xa, 0x21,0xe0,0x11, +0x0, 0x99,0xe0,0x1, 0x1f,0x89,0x8f,0xf, 0xe0,0x1, 0x1f,0x88,0x37,0x28,0x8f,0x8f, +0x3f,0xce,0xe2,0x1, 0xcf,0xdf,0x3c,0x6f,0x2, 0x83,0xe0,0x1, 0x14,0x60,0x34,0x45, +0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x0, 0x0, 0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0xe0,0x0, +0x24,0x4e,0xe0,0x1, 0x1f,0xc2,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0x16,0x1, 0xe0,0xe, +0x8c,0x9f,0xf0,0xe, 0x8a,0x2f,0x3e,0x18,0xe0,0x0, 0x1f,0x8d,0x14,0x0, 0x36,0x21, +0xf7,0xff,0x12,0xfd,0xf7,0xff,0x11,0xfd,0xf0,0x15,0x3a,0x99,0xf8,0x13,0x39,0x94, +0xc4,0xff,0xf1,0xff,0xc2,0x7f,0x3e,0x1f,0x3d,0xe8,0xf0,0x40,0x3b,0x68,0xf0,0x0, +0x13,0x81,0x0, 0x95,0xe8,0x40,0x3f,0x75,0x3, 0x17,0x15,0x81,0xe8,0x2a,0x3e,0x86, +0x2d,0x1e,0xe0,0x2e,0x3f,0x9, 0x2f,0x1b,0xe8,0x40,0x3e,0xf4,0xe8,0x40,0x3f,0x67, +0xc7,0x82,0xe0,0x6e,0x39,0xa8,0x3e,0x7f,0x3c,0x6e,0x1, 0x15,0x8f,0xf, 0x8e,0x9f, +0xe2,0x0, 0xcf,0x2, 0x2, 0xe8,0xe2,0x0, 0xce,0x82,0x5, 0x88,0xe8,0x40,0x3e,0xf3, +0xe8,0x40,0x3d,0x67,0xe0,0x6a,0x3b,0x2b,0x3d,0xea,0x2f,0x61,0xc7,0x82,0x3e,0x7f, +0x14,0x1, 0x1, 0xed,0x3c,0x5b,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3c,0xe0,0x3, 0x1a,0x99,0xdf,0xa9,0xe0,0x0, 0x19,0x8e,0xac,0x5, 0xf0,0x0, +0x8d,0x83,0x24,0x3, 0xf0,0x0, 0x2d,0xe6,0xe0,0x2, 0x1b,0xbc,0x17,0x80,0xaf,0x87, +0xaf,0x85,0xf0,0x0, 0x25,0xe3,0xf0,0x0, 0x15,0x80,0xe0,0x3, 0x1a,0x1c,0xf0,0x0, +0x1c,0x9a,0xe0,0x0, 0x1b,0xd, 0xf0,0x2, 0x1c,0x5e,0xf0,0x2, 0x1d,0x7f,0xe8,0x40, +0x39,0x6b,0x0, 0x8b,0xe8,0x0, 0x8f,0x8a,0x3f,0xf2,0x1, 0x9, 0xc1,0x1, 0x8f,0x83, +0xe2,0x1, 0xc1,0x7f,0x3f,0xf2,0x5, 0xb9,0x8f,0x84,0x2f,0xf5,0xe8,0x0, 0x8f,0x89, +0x2f,0xf6,0x3c,0x62,0xe0,0x1, 0xda,0x10,0xe0,0xf, 0x31,0x21,0x3f,0x96,0xf0,0x40, +0x3e,0x68,0x8c,0x9f,0x8c,0xf, 0xe0,0x1, 0xda,0x19,0xe0,0x43,0x3c,0x18,0xf0,0x40, +0x3e,0x78,0x4, 0x65,0x3c,0x62,0xe0,0x1, 0xd9,0xd8,0x24,0x61,0x17,0x8a,0x3f,0xb2, +0x17,0xa, 0xe0,0x0, 0xc7,0xfc,0x3f,0x96,0xe8,0xe, 0x3f,0x3b,0x94,0x8f,0x95,0x1f, +0x95,0xaf,0x96,0x3f,0x96,0xcf,0xe8,0xf, 0x3f,0x18,0xb4,0x8f,0xc1,0x1, 0xb5,0x1f, +0xe2,0x1, 0xc1,0x7f,0xb5,0xaf,0xf0,0x0, 0xc5,0x81,0xb6,0x3f,0xf2,0x1, 0xc5,0xff, +0xb6,0xcf,0x8f,0x83,0x3f,0xf2,0x2, 0xc9,0x87,0x5, 0xaf,0x7, 0xe0,0x0, 0x1f,0x7, +0xaf,0x8e,0xe0,0x2, 0x1f,0xdf,0xf0,0x0, 0xad,0x8f,0xf8,0x0, 0xe, 0x28,0xb, 0xe1, +0xe0,0x2, 0x1b,0xbc,0xe7,0xff,0x0, 0xa1,0xe8,0x40,0x3f,0xeb,0x0, 0xee,0xe7,0xff, +0x0, 0x87,0x0, 0x0, 0xe0,0x0, 0x1f,0x97,0xe0,0x0, 0x1d,0x96,0x16,0x7f,0x17,0x0, +0x16,0x83,0xae,0xf, 0xc7,0x84,0x3f,0xfb,0xe0,0x40,0xaf,0x3f,0xe0,0x40,0xae,0xaf, +0xe0,0x40,0xaf,0x1f,0x1, 0xf7,0x38,0x82,0xe0,0x0, 0x1f,0x8e,0x8f,0x8f,0x2f,0x86, +0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x2f,0x82,0x0, 0xe6,0x38,0x82,0xe0,0x3, 0x1f,0x4, +0x3f,0xe8,0x94,0x5e,0xe2,0x10,0xc4,0x0, 0x24,0xc, 0xe0,0x0, 0x1f,0x8e,0x14,0x0, +0x8f,0x8f,0x2f,0x86,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0xe0,0x1, 0x27,0x87,0x38,0x82, +0xe2,0x0, 0xcd,0xa, 0x2, 0xfd,0xf0,0x0, 0x1b,0x97,0x35,0x22,0xf0,0xe, 0x3b,0x9a, +0xe0,0x43,0x3c,0xf, 0x17,0x83,0xaf,0xae,0x3f,0x68,0xf0,0x2, 0x1b,0x7d,0xe0,0x1, +0x1f,0xf2,0xe8,0x0, 0x8d,0xd6,0xa6,0xf, 0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4, +0x5, 0x10,0x3e,0xee,0xe2,0x1, 0xc6,0xff,0x17,0x7f,0x3f,0x1d,0xe0,0x43,0x3f,0xe, +0xe0,0xf, 0x3f,0x3b,0xe2,0x0, 0xcf,0x0, 0x3f,0x99,0x37,0xa1,0x3f,0x9c,0x3, 0x6e, +0xf8,0x0, 0x8a,0xe6,0xf8,0x43,0x3b,0x5, 0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4, +0x5, 0x10,0x3f,0x68,0xe2,0x1, 0xc7,0x7f,0x14,0x1, 0x3c,0x1e,0xe0,0x43,0x3c,0x8, +0xe0,0xf, 0x3c,0x3b,0xf0,0x40,0x3b,0x78,0x3f,0x99,0x37,0xa1,0x3f,0x9c,0x2, 0x6e, +0xf1,0xff,0xc2,0xff,0xf0,0x40,0x3a,0xfe,0xe0,0x0, 0x1, 0x47,0x2e,0xb8,0xe0,0x43, +0x3c,0x89,0x3e,0xbb,0x3f,0xe9,0x0, 0x85,0x97,0xe, 0xe2,0x3, 0xcf,0x74,0x5, 0xf, +0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0x17,0xff,0x3f,0x98,0xe0,0x43,0x3f,0x8f,0xe0,0xe, +0x3f,0x9d,0xe2,0x0, 0xcf,0x80,0x37,0x21,0x3f,0x1c,0x3, 0x6f,0xe0,0x43,0x3d,0x8b, +0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4,0x5, 0xe, 0x3f,0x69,0xe2,0x1, 0xc7,0x7f, +0x14,0x81,0x3c,0x9e,0xe0,0x43,0x3c,0x89,0xe0,0xf, 0x3c,0x9d,0x3d,0xf9,0x37,0xa1, +0x3f,0x9c,0x2, 0x70,0x3f,0x28,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x3, 0x5, 0x97, +0xe8,0xa, 0x3d,0x17,0x17,0x81,0xaf,0x9a,0x14,0x1, 0x38,0x82,0xe8,0xa, 0x3d,0x17, +0x17,0x80,0xaf,0x9a,0x14,0x0, 0x38,0x82,0x8, 0xb1,0xc0,0x7c,0x7c,0x1, 0xdf,0x4b, +0x64,0x1, 0xc0,0x4, 0x8, 0xe1,0x3e,0xee,0xe7,0xff,0x0, 0xbb,0xf0,0xf, 0x3b,0x9a, +0x8f,0x1f,0x27,0x6d,0x17,0x1, 0xaf,0x1f,0x14,0x1, 0x38,0x82,0xe0,0x0, 0x1f,0x8e, +0x14,0x0, 0xf0,0x0, 0x8b,0x8f,0xf2,0x0, 0xcb,0x84,0xe0,0x0, 0x2, 0xee,0xe0,0x1, +0x1f,0x89,0xe0,0x0, 0x1f,0xd, 0x8e,0x8f,0xe0,0x1, 0x1f,0x88,0x36,0xa8,0x8f,0x8f, +0xe0,0x1a,0x96,0x7e,0x3f,0xcd,0x3e,0x7f,0xe0,0x0, 0x5, 0x5f,0xf0,0x0, 0x23,0xde, +0x8, 0xb1,0xf0,0x0, 0x13,0x7f,0x3d,0x68,0x3c,0xe8,0xf8,0x40,0x3a,0xe6,0x8f,0x8e, +0xe8,0x40,0x3e,0x65,0x8e,0x9e,0xe2,0x1, 0xc6,0x7f,0x3f,0xfc,0xc4,0x1, 0x38,0xe9, +0xf8,0x40,0x38,0x66,0xf0,0x40,0x38,0xea,0xe4,0xb, 0x37,0xa8,0xe4,0xc, 0x36,0xa8, +0xe2,0x1, 0xc0,0xff,0xf2,0x1, 0xc0,0x7f,0xf2,0x1, 0xc0,0xff,0xe2,0x1, 0xc4,0x7f, +0xf0,0x40,0x39,0x6f,0xe4,0xb, 0x35,0xc8,0xf0,0x40,0x39,0xed,0xf0,0x40,0x3a,0x6d, +0xe4,0xc, 0x36,0x48,0xc7,0x2, 0x5, 0x83,0xf8,0x40,0x39,0x65,0x3d,0xf1,0xf8,0x40, +0x3a,0xe2,0xf2,0x1, 0xc2,0xff,0x3, 0x82,0x3f,0xe9,0xe8,0x40,0x3e,0xf0,0x3c,0xef, +0xe2,0x1, 0xc4,0xff,0x5, 0x83,0xf8,0x40,0x39,0xe6,0xe8,0x40,0x3e,0x71,0xf8,0x40, +0x3b,0x63,0xf2,0x1, 0xc3,0x7f,0x3, 0x83,0xf0,0x40,0x3a,0x6a,0xf0,0x40,0x3b,0xf8, +0xe8,0x40,0x3d,0x64,0xe2,0x1, 0xc5,0x7f,0xe7,0xff,0x1, 0xbb,0xe8,0x9, 0x3c,0xa5, +0xe8,0xa, 0x3d,0x26,0xe2,0x0, 0xcc,0x84,0x17,0x84,0xe0,0x2a,0x3f,0xaa,0x14,0x0, +0xe0,0x68,0x3d,0x2a,0x8, 0xe1,0x38,0x82,0x14,0x1, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3a,0xc0,0x7c,0xe0,0x3, 0x19,0x84,0xe0,0x2, 0x1a,0xfd,0x97,0xd3,0xe0,0x0, +0x1b,0xe, 0x86,0x45,0x8e,0xd5,0x17,0x0, 0xe2,0xff,0xc7,0xff,0x8d,0x86,0x6f,0x4, +0xb7,0xd3,0x6f,0x5, 0x6e,0x6, 0x6e,0x87,0xe0,0x1, 0x25,0xfb,0xe0,0x1, 0x1f,0xd7, +0xe0,0x0, 0x19,0xd, 0xf0,0x0, 0x94,0x2f,0x93,0xdf,0xf0,0x1, 0x1d,0x72,0x12,0x0, +0x0, 0x89,0xf8,0x40,0x3c,0x79,0x4, 0x1e,0x8d,0x86,0x8e,0xd5,0x3a,0x7b,0xe0,0x1, +0x3, 0xed,0xe0,0xf, 0x32,0x21,0x3f,0x92,0x8c,0x8f,0x8d,0x1f,0x3e,0xb9,0xe8,0x0, +0xa7,0x8a,0x3e,0x9a,0x36,0xa1,0x3e,0x9f,0xe2,0x0, 0x7c,0x4, 0xf0,0x0, 0x94,0x8d, +0xc2,0x1, 0xef,0xff,0xd7,0xf6,0xe2,0x1, 0xc2,0x7f,0x2c,0x64,0xe8,0x40,0x3b,0xf9, +0x3, 0x64,0x8d,0x86,0x8e,0xd5,0x16,0x1, 0xe0,0x1a,0x9a,0x52,0xe0,0x1a,0x9f,0xe2, +0x97,0x53,0x9d,0x23,0x3f,0x94,0x36,0x2f,0xe2,0xf7,0xc7,0x7f,0xe0,0x2f,0x3f,0x9a, +0x37,0xaa,0x3f,0x4c,0xe0,0x3, 0x1a,0x8c,0x3f,0x4f,0xe0,0x4, 0xcf,0x0, 0x8f,0x85, +0xb7,0x53,0x27,0xbb,0xe0,0x2, 0x1e,0x27,0xe0,0x1, 0x1c,0xf2,0x8f,0xc, 0x8d,0x1c, +0x3f,0x3d,0xa4,0x9, 0x3f,0x1a,0x37,0x21,0xe0,0x2, 0x1d,0x30,0x3f,0x18,0x94,0x8a, +0x97,0xe, 0x9b,0x93,0x3f,0x29,0xe0,0x43,0x3f,0x1e,0xe4,0x9, 0x37,0xf, 0xe2,0xe, +0x3c,0xce,0x3f,0x29,0x3f,0x77,0xe0,0x0, 0x2, 0x78,0x13,0x7f,0x3b,0x1f,0xe2,0x1, +0xc3,0x7f,0x33,0x21,0x3b,0x1c,0x0, 0x95,0x8f,0x2f,0x8f,0xbf,0x3f,0x3d,0xe0,0x80, +0x94,0x9a,0x3f,0x1f,0x37,0x21,0x3f,0x18,0x97,0x8e,0x3f,0xa9,0xe0,0x43,0x3f,0x9f, +0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x3f,0xae,0x3f,0xf7,0xe0,0x0, 0x2, 0x5d, +0x3b,0x7c,0x3f,0xec,0xc6,0x2, 0x1, 0xe9,0x17,0x81,0x2d,0x82,0xad,0x85,0xe7,0xfb, +0x17,0x7f,0x92,0xd3,0x37,0xa9,0x3a,0xde,0x3a,0xcf,0xe7,0x7f,0x17,0xff,0x3a,0xdf, +0xe0,0x0, 0x1f,0x8c,0x8f,0x8f,0xb2,0xd3,0x27,0xa9,0xe0,0x1b,0x97,0x92,0xe0,0x17, +0xc7,0xb7,0xe3,0xff,0xc7,0xff,0xe2,0x14,0xcf,0xd8,0x2, 0x8c,0xe0,0x2, 0x1f,0xc0, +0xe0,0xa, 0x8f,0x8f,0xe0,0x0, 0x2f,0xe5,0xde,0xd2,0x2c,0x4, 0xe0,0x80,0xca,0x80, +0xb2,0xd3,0x16,0x83,0xe0,0x1, 0x1f,0xd7,0xe0,0x1b,0x97,0x42,0x97,0xef,0xe4,0x0, +0xc7,0x8a,0xe2,0x0, 0xcf,0x80,0x3e,0x9f,0xe0,0x6f,0x3c,0x2d,0x37,0x82,0x3f,0x7f, +0x3, 0x5, 0x97,0xd3,0xe0,0x40,0xcf,0x80,0xb7,0xd3,0x97,0xd3,0xe3,0xdf,0xc7,0xff, +0xb7,0xd3,0xe7,0xef,0x16,0xff,0xe0,0x2, 0x1f,0x7c,0x97,0xd3,0x9f,0xe, 0x3f,0xdd, +0x37,0x42,0xe7,0xfd,0x16,0xff,0x3f,0xdd,0x3f,0x74,0xb7,0xd3,0x4, 0x85,0xe0,0x1a, +0x9f,0xe2,0x3f,0xfe,0x5, 0x85,0x97,0xd3,0xe0,0x2, 0xcf,0x80,0xb7,0xd3,0xc0,0x4, +0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0x25,0xa0,0x13,0xff,0x3b,0x9b,0xe2,0x1, 0xc3,0xff, +0xc3,0x81,0x33,0xa1,0xe0,0x0, 0x1f,0xd, 0xe0,0x2, 0x1b,0x2f,0xe0,0x2, 0x1e,0x27, +0x3b,0x92,0x8c,0x8e,0x8d,0x1e,0xe0,0xf, 0x3c,0xbd,0xc7,0x2, 0x3f,0x9a,0x37,0xa1, +0x3f,0x98,0x97,0x8f,0xc6,0x2, 0x3f,0x77,0xe0,0x40,0xac,0xac,0xe0,0x40,0xad,0x1c, +0xe0,0x80,0xb7,0x96,0x1, 0xef,0xad,0x85,0x17,0x80,0xe7,0xff,0x0, 0x88,0xe0,0x0, +0x19,0xd, 0x3e,0x6b,0xe7,0xfe,0x0, 0xb2,0x16,0x0, 0xe7,0xfe,0x0, 0xaf,0xe0,0x2, +0x1f,0xf7,0x17,0x7, 0xaf,0xf, 0x17,0x0, 0xe0,0x1, 0x1f,0xe9,0xaf,0xf, 0xe7,0xff, +0x0, 0xb2,0x0, 0x0, 0x8, 0xb7,0xc0,0x70,0xea,0x4e,0x7f,0xe4,0xe9,0xff,0xc7,0xff, +0xf0,0x0, 0x83,0xf, 0xf0,0x0, 0x83,0x9f,0x83,0xaf,0x83,0x3f,0x82,0xcf,0x82,0x5f, +0x81,0xef,0x81,0x7f,0xe0,0x1, 0x84,0xf, 0xe0,0x1, 0x84,0x9f,0xe0,0x1, 0x85,0x2f, +0xe0,0x1, 0x85,0xbf,0xe0,0x1, 0x86,0x4f,0xe0,0x1, 0x86,0xdf,0xe0,0x1, 0x87,0x6f, +0xe0,0x1, 0x87,0xff,0xf0,0x0, 0x6b,0x4, 0x6f,0x93,0xe0,0x0, 0x1f,0x8e,0xf0,0x0, +0x6b,0x85,0x6b,0x86,0x6b,0x7, 0x6a,0x88,0x6a,0x9, 0x69,0x8a,0x69,0xb, 0x6c,0xc, +0x6c,0x8d,0x6d,0xe, 0x6d,0x8f,0x6e,0x10,0x6e,0x91,0x6f,0x12,0x8f,0x8f,0xe0,0x1, +0x27,0x9c,0xe0,0x2, 0x1f,0xdd,0x89,0x8f,0xe0,0x1, 0x29,0x97,0xe0,0x0, 0x1b,0xd, +0xf0,0x2, 0x1a,0xfd,0xe0,0x1, 0x1f,0xf2,0x89,0x16,0x8b,0x86,0xe8,0x0, 0x8a,0xd5, +0xf7,0xff,0x13,0xff,0xf7,0xff,0x13,0x7f,0x14,0x81,0xa2,0xf, 0xe0,0x43,0x3e,0x97, +0x3d,0x63,0xf0,0x17,0x3b,0x92,0xf0,0x16,0x3b,0x15,0x3c,0x92,0xe0,0xb, 0x3e,0xb5, +0xe8,0x40,0x3f,0x67,0xe0,0xc, 0x3d,0x92,0x36,0x21,0x3e,0x14,0x96,0xc, 0x3f,0xe9, +0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0x3f,0x1b,0x3f,0x9b,0xe2,0x1, 0xce,0x20, +0x37,0x21,0x37,0xa1,0xc6,0xff,0x16,0x1, 0x3f,0x14,0x3f,0x94,0xe0,0x43,0x3e,0x9d, +0x3e,0x13,0x5, 0x18,0x21,0x8, 0x94,0xe, 0x39,0xec,0x3d,0x18,0xe2,0x1, 0xc1,0xff, +0xe0,0x43,0x3d,0x1a,0xe8,0x40,0x39,0x76,0x17,0x1, 0x3f,0x13,0x3, 0x8, 0x94,0xf, +0x39,0xee,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0xe3,0xff,0xce,0xff, +0x1, 0xce,0xf8,0x0, 0x8b,0x45,0x16,0x1, 0xf7,0xff,0x13,0xff,0xf7,0xff,0x12,0xff, +0x14,0x81,0x3e,0x17,0xf0,0x17,0x3b,0x92,0xf0,0x15,0x3a,0x95,0x3c,0x92,0x3f,0xec, +0xe2,0x1, 0xc7,0xff,0xe0,0xd, 0x3f,0xb5,0xe8,0x40,0x3f,0x67,0x3f,0xe9,0xe2,0x1, +0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0xe0,0xb, 0x3e,0x92,0x3f,0x1d,0x3f,0x9d,0xe0,0x43, +0x3e,0x9c,0xe8,0x40,0x3e,0xf6,0x35,0xa1,0x37,0x21,0x37,0xa1,0xf0,0x0, 0x12,0x1, +0x3d,0x94,0x3f,0x14,0x3f,0x94,0xc6,0x1, 0xf0,0x14,0x3a,0x13,0x3, 0x24,0x96,0x8b, +0xe3,0xff,0xc6,0x7f,0xe2,0x1, 0xce,0xa0,0x5, 0x1e,0x21,0x9, 0x94,0xe, 0xe8,0x40, +0x39,0xe4,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0xe8,0x40,0x39,0x75, +0x17,0x1, 0x3f,0x13,0x3, 0x4d,0x94,0xf, 0x39,0xee,0x3d,0x18,0xe2,0x1, 0xc1,0xff, +0xe0,0x43,0x3d,0x1a,0x0, 0xc5,0xea,0x12,0x7f,0xa7,0x17,0x0, 0xaf,0xf, 0x14,0x0, +0xc0,0x10,0xb, 0xe1,0xe4,0x8, 0x35,0xf, 0xe2,0xa, 0x3c,0x4a,0x3c,0xe3,0xe0,0x8, +0x3d,0x28,0xe0,0x4, 0xdc,0xd, 0xe2,0x0, 0xcc,0x64,0x2, 0x6e,0x29,0xe, 0xe0,0x0, +0x1f,0xc, 0xea,0x12,0x7f,0xa7,0x16,0x81,0x8f,0xe, 0xae,0x8f,0x14,0x1, 0x27,0x69, +0x17,0x3, 0xaf,0xf, 0x14,0x3, 0x0, 0xe5,0x16,0xff,0x3e,0x95,0x39,0x7d,0x1, 0x70, +0x17,0xff,0x3a,0xb7,0x3f,0x92,0xe2,0x0, 0xc9,0x8f,0xe2,0x1, 0xc7,0xff,0x16,0x3, +0x3f,0x95,0x17,0x0, 0xe0,0x6e,0x3a,0xac,0x37,0xa1,0x39,0x7d,0x3f,0x94,0x96,0xf, +0xe0,0x0, 0x4, 0x4d,0x17,0x84,0x15,0xf4,0x36,0x1, 0x3f,0x90,0xe0,0xb, 0x3d,0x90, +0xe0,0x1, 0x86,0xef,0x3e,0xfc,0x5, 0x6, 0xe0,0x1, 0x86,0xff,0x3f,0x1d,0xe3,0xff, +0xc7,0x7f,0xc7,0xfe,0x3d,0xff,0x1, 0xf5,0x39,0x15,0x31,0x21,0x3a,0x12,0x97,0x84, +0x16,0xa8,0xe4,0xc, 0x37,0x8f,0xe2,0xf, 0x3e,0x4f,0x3e,0x9e,0x3f,0xac,0xe2,0xb, +0xcf,0xdd,0x3f,0xed,0xe3,0xff,0xc7,0xff,0xe0,0x1a,0x96,0x76,0xe0,0x0, 0x1e,0xa1, +0xe0,0x6e,0x3b,0x2f,0x17,0xa8,0xe2,0xb, 0xce,0x5d,0x3f,0x9e,0x8e,0xd, 0xe3,0xff, +0xc7,0xff,0xe0,0x6e,0x3b,0x2f,0xe2,0x0, 0xce,0x1, 0x1, 0x25,0x3f,0xee,0xe3,0xff, +0xc7,0xff,0xe2,0x1, 0xcf,0xfa,0x2, 0x8f,0xea,0x12,0x7f,0xa7,0x8c,0xf, 0xe3,0xff, +0xc7,0x7f,0x3f,0x78,0xe7,0xff,0x5, 0x8e,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0xac,0xf, +0xe7,0xff,0x0, 0x88,0xe0,0x1, 0x17,0x7a,0x0, 0xf0,0x17,0x81,0x3f,0x92,0xe2,0x1, +0xc7,0xff,0x3f,0x95,0x37,0xa1,0x3f,0x94,0x97,0x8f,0x3e,0x1f,0xe0,0x43,0x3e,0x1c, +0xe7,0xff,0x0, 0xaa,0xc7,0x28,0x17,0x80,0xaf,0x8d,0xe3,0xff,0xc7,0x7f,0x0, 0xd7, +0x8, 0xb6,0xe0,0x2, 0x19,0xc0,0xe0,0x3, 0x1a,0x2e,0xe0,0xa, 0x8f,0x83,0x17,0x1, +0xe2,0x0, 0xcf,0x81,0xaf,0x4, 0xe0,0x0, 0x1, 0x62,0xe0,0x1, 0x1b,0x7, 0xe0,0x1, +0x19,0x57,0x8f,0x86,0xe0,0x0, 0x12,0xee,0x37,0xc1,0xaf,0x92,0xb2,0x92,0xb2,0xa2, +0xef,0xfb,0xd3,0xd8,0xe0,0x0, 0x1f,0x8e,0xe0,0x0, 0x1f,0xd, 0x8f,0x8f,0x2f,0xaf, +0x17,0x80,0xaf,0x84,0xe0,0x1, 0x1f,0x89,0x8d,0xf, 0xe0,0x1, 0x1f,0x86,0x35,0x28, +0x8d,0x8f,0xe0,0x1, 0x1f,0x85,0x35,0xa8,0x8e,0xf, 0xe0,0x1, 0x1f,0x88,0x36,0x28, +0x8e,0x8f,0xe0,0x1, 0x1f,0x84,0x3e,0xca,0x8f,0xf, 0xe0,0x1, 0x1f,0x83,0x3f,0x4b, +0x8f,0x8f,0xe0,0x43,0x3f,0x1e,0x3f,0xcc,0xe0,0x43,0x3f,0x9f,0xe0,0xc, 0x36,0xc5, +0x85,0x6, 0xae,0x3, 0xe0,0x41,0x3d,0xcf,0xe0,0xc, 0x37,0x5, 0xad,0x12,0xb6,0x92, +0xb7,0x22,0xb7,0xf2,0xe0,0x1, 0xb5,0x82,0xae,0x13,0xb, 0x61,0xe2,0x0, 0xcf,0x88, +0x5, 0xa0,0xe0,0x1a,0x97,0xfe,0xe2,0x2, 0xcf,0xab,0x2, 0x32,0x8f,0x86,0x17,0x3, +0x37,0xc1,0xaf,0x92,0xe0,0x1, 0x17,0x96,0xaf,0x3, 0xb7,0xf2,0xe7,0xfe,0x17,0xea, +0xb2,0x92,0xb2,0xa2,0xe0,0x1, 0xb7,0x82,0xaf,0x13,0x8f,0x84,0xe7,0xff,0x27,0xbc, +0xe0,0x0, 0x1f,0xce,0x17,0x1, 0xaf,0xf, 0xb, 0x61,0x17,0x80,0xaf,0x84,0xb, 0x61, +0xe2,0x0, 0xcf,0x86,0x2, 0x93,0xe2,0x0, 0xcf,0x84,0x2, 0xa6,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x5, 0xa8,0xe0,0x1a,0x97,0xfe,0xe2,0x5, 0xcf,0xbb,0xe7,0xff,0x2, 0x22, +0x17,0x84,0x86,0x86,0xe0,0x1, 0x17,0x1b,0x0, 0x8a,0xe0,0x1a,0x97,0xfe,0xe2,0x3, +0xcf,0x8f,0x2, 0x14,0x86,0x86,0x17,0x83,0xe0,0x0, 0x17,0x78,0xaf,0x83,0xb7,0x12, +0xb7,0x22,0xe0,0x1, 0x17,0x20,0xb7,0x72,0xe7,0xfe,0x17,0x60,0xae,0x92,0xe0,0x1, +0xb7,0x2, 0xaf,0x93,0x0, 0xcb,0xe0,0x1a,0x97,0xfe,0xe2,0x3, 0xcf,0xf3,0x2, 0x5d, +0x17,0x84,0x86,0x86,0xe0,0x1, 0x17,0x7, 0x0, 0xea,0x8, 0xb4,0xe0,0x2, 0x19,0xc0, +0xe0,0xa, 0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x0, 0xe0,0x1, 0x19,0x57, +0xe0,0x3, 0x8f,0xe2,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x4f,0xe0,0x3, 0x1a,0x2e, +0x17,0xff,0xaf,0x84,0xdf,0x46,0x8f,0x84,0xe0,0x1, 0x27,0x99,0xe0,0x1, 0x8f,0xb3, +0x27,0xa1,0x9f,0x12,0x97,0xa2,0x96,0xf2,0xe4,0x0, 0xc7,0xa, 0xe4,0x0, 0xc7,0x8a, +0x37,0x3, 0xe4,0x0, 0xc6,0x8a,0xe3,0xff,0xc7,0x7f,0x37,0x83,0xe0,0x43,0x3e,0x1f, +0x36,0x83,0xe0,0xb, 0x37,0x45,0xad,0x83,0xe0,0x41,0x3f,0xcf,0xe0,0x41,0x3d,0x4d, +0xe0,0xb, 0x36,0x5, 0xb7,0x12,0xb6,0x22,0xb7,0xb2,0xb6,0xf2,0xe0,0x1, 0xb5,0x2, +0xad,0x93,0x8f,0xc3,0xe2,0x1, 0xcf,0xaa,0x1, 0x13,0xe0,0x1, 0x1f,0x82,0x8e,0xf, +0xe0,0x1, 0x1f,0x81,0x36,0x28,0x8e,0x8f,0xe0,0x1, 0x1f,0x80,0x36,0xa8,0x8f,0xf, +0xe0,0x0, 0x1f,0xff,0x3f,0x4c,0x8f,0x8f,0xb7,0x42,0x3f,0xcd,0xb7,0xd2,0xe0,0x0, +0x1f,0xfe,0x8f,0xf, 0xe0,0x0, 0x1f,0xfd,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xe0,0x41, +0x3f,0xcf,0xb7,0xb2,0xa, 0x61,0xe0,0x0, 0x1f,0xfc,0xe0,0x1, 0x1f,0x3, 0x8e,0xf, +0xe0,0x1, 0x1f,0x85,0x8f,0xe, 0x8e,0x8f,0xe0,0x0, 0x1f,0xfb,0x36,0xa8,0x8f,0x8f, +0x3f,0x4d,0x16,0x84,0x36,0x28,0xae,0x83,0xe0,0x1, 0x16,0x96,0xe0,0x1, 0x1d,0x87, +0x3f,0xcc,0xb6,0x92,0xe0,0x0, 0x16,0xf8,0xe0,0x41,0x3f,0xcf,0x85,0x8b,0xb6,0xa2, +0x16,0x0, 0xe0,0x3, 0x1e,0xae,0xe0,0x1, 0xb7,0x82,0x17,0x83,0xad,0x92,0xae,0xd, +0xb7,0x72,0xaf,0x93,0xe7,0xff,0x0, 0x94,0xe0,0x0, 0x1f,0xfc,0xe0,0x1, 0x1f,0x3, +0x8e,0xf, 0xe0,0x1, 0x1f,0x85,0x8f,0xe, 0x8e,0x8f,0xe0,0x0, 0x1f,0xfb,0x36,0xa8, +0x8f,0x8f,0xe0,0x1, 0x19,0x57,0x3f,0x4d,0x16,0x89,0x36,0x28,0xae,0x83,0xe0,0x2, +0x16,0xac,0xe0,0x1, 0x1d,0x87,0x3f,0xcc,0xb6,0x92,0xe0,0x2, 0x16,0x8e,0xe0,0x41, +0x3f,0xcf,0x85,0x8b,0xb6,0xa2,0x16,0x0, 0xe0,0x3, 0x1e,0xae,0xe0,0x1, 0xb7,0x82, +0x17,0x88,0xad,0x92,0xae,0xd, 0xb7,0x72,0xaf,0x93,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f, +0xe7,0xfe,0x2f,0xe6,0xe0,0x3, 0x8f,0xe2,0xe7,0xfe,0x2f,0xe2,0xe0,0x0, 0x1f,0xfa, +0x8f,0xf, 0xe0,0x0, 0x1f,0xf9,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xb7,0x92,0xe7,0xfe, +0x0, 0xd7,0x8, 0xb4,0x17,0x9c,0xe0,0x2, 0x19,0xac,0x3f,0xb8,0x3a,0x68,0x3f,0x93, +0xe0,0x1, 0x8c,0xf, 0xe0,0x2, 0x1f,0x9e,0x11,0x1, 0xa9,0xf, 0xef,0xfc,0xd6,0x7b, +0xe0,0x0, 0x1f,0xb3,0xaa,0x3, 0xa9,0xf, 0xa, 0x61,0xe0,0x1, 0x1e,0xc7,0x17,0x0, +0x3f,0xed,0xe1,0x80,0xb7,0x1f,0xc7,0x82,0xb7,0x1d,0xe1,0x80,0xb7,0x1f,0xb7,0xf, +0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xe1,0xff,0xc0,0x8, 0xe0,0x2, +0x1f,0x66,0xe0,0x2, 0x1f,0xfd,0x87,0xe, 0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, +0x3e,0xfe,0x3a,0x68,0xe0,0x0, 0x1, 0x68,0x8b,0xf, 0xf0,0x0, 0x8e,0x2f,0x3c,0x64, +0xe0,0x0, 0xd6,0x38,0xf0,0x0, 0x26,0x52,0x13,0xff,0xe8,0x7, 0x3b,0x9c,0x11,0xff, +0xe2,0x1, 0xc3,0xff,0x39,0x96,0xe0,0x4c,0xc3,0xa7,0xe2,0x1, 0xc1,0xff,0xf0,0x0, +0x14,0x4, 0xe0,0x1, 0x1f,0xff,0xf0,0x18,0x3c,0x10,0x33,0xa1,0x31,0xa1,0xe0,0x1, +0x1a,0xe4,0x3b,0x9f,0xf0,0x1c,0x36,0x21,0xe8,0x3, 0x39,0x98,0xf0,0x0, 0x15,0x3, +0xf0,0x0, 0x14,0xda,0xf0,0x0, 0x15,0x80,0xe0,0x80,0x97,0x95,0xe8,0x40,0x3c,0xea, +0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f,0xe0,0x8, 0x3f,0xa8,0xe0,0x4, 0xd9,0xb8, +0xe2,0x0, 0xcc,0x5a,0xe8,0x40,0x3d,0x69,0xe0,0x6a,0x3b,0x28,0xe3,0xff,0xc5,0x7f, +0x23,0x21,0x11,0x2, 0x39,0x10,0x3f,0x62,0x3f,0xe4,0x96,0x8f,0xe8,0xf, 0x3f,0x9c, +0xe0,0x80,0xb6,0x9e,0x3f,0x73,0x1, 0xfa,0x3c,0xe6,0xe8,0x40,0x3c,0x68,0xe0,0x0, +0xd6,0x2f,0x3f,0xe4,0xe0,0x80,0x97,0x12,0x39,0x73,0xb7,0xf, 0xe8,0xf, 0x3f,0x9c, +0x1, 0xfa,0x3a,0xf7,0xc2,0x2, 0x1, 0xd1,0xe0,0x0, 0xc0,0x78,0xf8,0x0, 0xe, 0x28, +0xb, 0xe1,0xe8,0x40,0x3c,0xeb,0xe8,0x40,0x3c,0x68,0xd6,0x19,0x3a,0xf7,0xc2,0x2, +0x1, 0xc4,0x0, 0xf3,0x8b,0x1f,0xf0,0x0, 0x8e,0x3f,0xe7,0xff,0x0, 0x9a,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe1,0xe6,0xc0,0x58,0x3b,0xe8,0x3c,0x69,0x3b,0x69, +0xef,0xfe,0xd8,0x4b,0xe2,0x0, 0xcb,0x1, 0xe0,0x1, 0x1, 0x4d,0xe0,0x3, 0x19,0x4, +0xe0,0x1, 0x19,0xc7,0x97,0xd2,0x17,0x0, 0xe3,0xff,0xc7,0xdf,0xb7,0x3, 0x3a,0xe8, +0xb7,0xd2,0x3c,0x66,0xef,0xfe,0xd8,0x39,0xe2,0x0, 0xcc,0x0, 0x12,0x2, 0x3f,0xe4, +0xe0,0x6f,0x39,0x28,0x3b,0xff,0x1, 0x6, 0xe0,0x19,0xc0,0x28,0xf8,0x0, 0xc, 0xa8, +0xb, 0xe1,0xe0,0x0, 0x1f,0xbf,0xe0,0x0, 0x1f,0x78,0x8f,0x8f,0x8f,0xe, 0x3f,0x7f, +0xe0,0x2, 0x1, 0x42,0xe0,0x0, 0x1f,0x77,0x8f,0xe, 0x3f,0x7f,0xe0,0x2, 0x1, 0x46, +0xe0,0x0, 0x1f,0x76,0x8f,0xe, 0x3f,0x7f,0xe0,0x2, 0x1, 0x44,0x17,0x80,0x3a,0x6f, +0xe2,0x0, 0xcb,0x2, 0xe0,0x1, 0x1, 0x63,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, 0x1f,0x2c, +0xe0,0x1, 0x1b,0x6e,0x3f,0x9e,0xf0,0x0, 0xa4,0x5f,0xa3,0xef,0xfb,0xe5,0x7c,0xf0, +0xe8,0x0, 0x8f,0x89,0x27,0x8c,0xe0,0x1, 0x22,0xcb,0xe0,0x1, 0x1c,0xf0,0xe0,0x1, +0x1c,0x7d,0xef,0xff,0xd3,0xa3,0x17,0x80,0xe8,0x0, 0xaf,0x89,0x15,0x81,0xe0,0x1, +0x1d,0x7e,0xe0,0x1, 0x1c,0xfd,0xe2,0x0, 0x7c,0x6, 0xef,0xff,0xd3,0x78,0xe0,0x2, +0x1f,0xfc,0x15,0x8c,0x9f,0x8f,0xe0,0x1, 0x1c,0xfd,0x3d,0x9f,0xe0,0x1, 0x1d,0x7e, +0xe3,0xff,0xc5,0xff,0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3c,0x9e,0xe0,0xc, 0x3d,0x1e, +0x96,0x8d,0x96,0xc, 0xc7,0x81,0xe2,0x0, 0x7c,0x6, 0xe3,0xff,0xc7,0xff,0x3f,0x18, +0x3e,0xac,0x3f,0xfb,0xb6,0x8e,0x1, 0xef,0x22,0xad,0xe0,0x2, 0x1f,0xea,0x8f,0x8f, +0x3f,0xf4,0xe0,0x1, 0x1, 0x53,0x3c,0xe6,0xe2,0xc, 0x7c,0x5a,0xe8,0x40,0x3d,0x68, +0xef,0xff,0xd3,0x2d,0xe0,0x1, 0x1c,0xf0,0x3d,0x67,0xe2,0x0, 0x7c,0x6, 0xef,0xff, +0xd3,0x26,0xe2,0xc, 0x7c,0xda,0x3c,0x69,0xe2,0x0, 0x7d,0x6, 0x15,0x81,0xef,0xff, +0xd3,0x3e,0xe0,0x1, 0x1d,0x7e,0xe0,0x1, 0x1c,0xfd,0xe2,0x0, 0x7c,0x6, 0x15,0x81, +0xef,0xff,0xd3,0x35,0xe2,0x0, 0x7d,0x6, 0xe2,0xc, 0x7c,0xda,0x3c,0x6a,0xef,0xff, +0xd3,0xe, 0xe2,0x0, 0x7c,0x6, 0xef,0xff,0xd3,0x67,0xe0,0x43,0x3f,0x98,0xe2,0x0, +0xcf,0x80,0xe0,0xff,0x17,0xff,0xe0,0x6f,0x3b,0x28,0x3c,0x6f,0xe0,0x0, 0x1f,0xf5, +0x8f,0x8f,0xb4,0x3, 0xe0,0xe, 0x37,0xa8,0xe0,0x0, 0x1f,0xf4,0x9e,0x83,0x8f,0x8f, +0x3f,0xce,0x3e,0xff,0x97,0xd2,0xe0,0x0, 0x5, 0xce,0xcf,0xa0,0xb7,0xd2,0xe7,0xfe, +0x2a,0xd5,0xe0,0x1, 0x1c,0xfe,0xe0,0x1, 0x1c,0x7d,0xef,0xff,0xd3,0x27,0xe7,0xfe, +0x0, 0xcd,0xe2,0x0, 0xcb,0x84,0xe7,0xfe,0x1, 0xc9,0xe0,0x1, 0x1c,0x63,0xde,0xa3, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0xe0,0x1, 0x1, 0xc, 0x97,0xde,0xc7,0x86,0xe3,0xff,0xc7,0xff, +0xe0,0x0, 0x27,0xd7,0xc7,0xff,0xe3,0xff,0xc7,0xff,0x17,0x0, 0x15,0x1, 0xe0,0x1, +0x1d,0xff,0x3d,0x1f,0x3e,0x6e,0x0, 0x91,0x9e,0x8f,0xe0,0x45,0x17,0xc2,0x3f,0x9e, +0x3e,0xfc,0x37,0xa1,0x3f,0x9b,0x5, 0x6, 0x96,0x8f,0x9e,0xf, 0xe2,0x0, 0xce,0x80, +0x5, 0x2e,0xc7,0x1, 0x3f,0x7a,0x1, 0x30,0xe0,0x45,0x17,0xc2,0x3f,0x9e,0x37,0xa1, +0x3f,0x9b,0x96,0x8f,0xe2,0x0, 0xce,0x80,0x2, 0x68,0x96,0x8f,0xe0,0x41,0x3e,0xcd, +0x0, 0xe5,0xe3,0xff,0xc7,0xdf,0xb7,0xd2,0xe7,0xff,0x0, 0xb3,0xe0,0x1, 0x1c,0x7d, +0x3c,0xe6,0xef,0xff,0xd2,0xdb,0xe7,0xfe,0x0, 0xb8,0x17,0x1, 0x3f,0x1f,0xe0,0x2, +0x1e,0xac,0xe4,0x0, 0xc7,0x1c,0xe4,0x0, 0xc7,0x9c,0x3f,0x1d,0x3f,0x9d,0xf0,0x0, +0xa4,0xe, 0xa3,0xef,0xe0,0x1, 0x1b,0x6d,0xe7,0xfe,0x0, 0x9a,0xe0,0x41,0x3e,0x4c, +0xe3,0xff,0xc6,0x7f,0x0, 0xcf,0xe0,0x43,0x3f,0x9c,0xe4,0x0, 0xc6,0x5, 0xe2,0x0, +0xcf,0x80,0xe3,0xff,0xc6,0x7f,0xe0,0xff,0x17,0xfb,0xe0,0x6f,0x3b,0x2c,0xe0,0x1, +0x1e,0xc7,0xe0,0x0, 0x1f,0x75,0x8f,0xe, 0xb7,0x8d,0x37,0x28,0xe0,0x0, 0x1f,0xf4, +0x9e,0x8d,0x8f,0x8f,0x3f,0xce,0x3e,0xff,0xe0,0x3, 0x1f,0x4, 0x97,0xde,0x5, 0x96, +0xcf,0xa0,0xb7,0xde,0xe7,0xfd,0x0, 0xca,0xe0,0x1, 0x1d,0x70,0x3c,0xe6,0xe2,0xc, +0x7c,0x5a,0x15,0x81,0xef,0xff,0xd2,0x7b,0xe2,0x0, 0x7c,0x86,0xe2,0xc, 0x7d,0x5a, +0x3c,0x69,0xef,0xff,0xd2,0x54,0xe7,0xfe,0x0, 0xc6,0xe3,0xff,0xc7,0xdf,0xb7,0xde, +0xe7,0xfd,0x0, 0xb4,0x12,0x0, 0x3f,0xe4,0xe7,0xfd,0x0, 0xcc,0x97,0xee,0xc7,0x86, +0xe3,0xff,0xc7,0xff,0xe7,0xfe,0x0, 0xf6,0x12,0x1, 0x3f,0xe4,0xe7,0xfd,0x0, 0xc2, +0x3f,0xe4,0xe7,0xfd,0x0, 0xbf,0xe0,0x1, 0x1f,0x4d,0xe0,0x1, 0x1f,0xc7,0x34,0x22, +0x3c,0x1e,0x9e,0x88,0x97,0x2f,0x16,0x7d,0xe2,0x0, 0xc6,0x82,0x3f,0x5c,0x3f,0x4d, +0xb7,0x2f,0x16,0x7e,0x96,0x88,0x97,0x2f,0xe2,0x0, 0xc6,0x81,0x3f,0x5c,0x3f,0x4d, +0xb7,0x2f,0xe4,0x0, 0xc4,0x85,0x9f,0x18,0xe0,0x3, 0x1e,0xb0,0xe4,0x0, 0xc7,0x5, +0x3c,0x9d,0x86,0x89,0xb7,0x1f,0xe0,0x0, 0x1f,0xbf,0xae,0x8f,0x38,0x82,0x0, 0x0, +0x8, 0xb3,0xe0,0x2, 0x19,0x2c,0x39,0xe8,0x8f,0xb2,0x2f,0xab,0xe0,0x0, 0x1f,0xa4, +0xe0,0x0, 0x1e,0xa3,0xe0,0x0, 0x17,0x0, 0xe0,0x80,0xaf,0x1f,0x3e,0xff,0x1, 0xfd, +0x17,0x80,0x16,0xff,0xaf,0x12,0xaf,0x22,0xaf,0x42,0xaf,0x32,0xae,0xd2,0xb7,0xd2, +0xb7,0xe2,0xe0,0x1, 0xaf,0x12,0xe0,0x2, 0xb7,0xb2,0xe0,0x2, 0xb7,0xc2,0xe0,0x4, +0xaf,0x52,0xe0,0x4, 0xb7,0x92,0xe0,0x4, 0xb7,0xa2,0xe0,0x8, 0xaf,0x12,0x21,0x88, +0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0x9, 0xe1, +0x8f,0x82,0x17,0x1, 0xe4,0x0, 0xc7,0x9c,0x3f,0x92,0xe0,0x1, 0x8c,0xf, 0xe0,0x2, +0x1f,0xc8,0x87,0x8f,0xe0,0x2, 0x1f,0x9e,0xaf,0xf, 0xef,0xfc,0xd4,0x4, 0x0, 0xc7, +0x8, 0xb1,0x14,0x1, 0xdf,0xbe,0xe0,0x2, 0x1f,0xac,0x15,0x0, 0x8c,0x8f,0xe0,0x0, +0x1c,0x78,0xf0,0x2, 0x19,0xc8,0xf0,0x3, 0x1a,0x30,0x3f,0x6f,0xf0,0x40,0x3a,0xef, +0x3d,0xef,0x3e,0xea,0xf0,0x0, 0x13,0x1, 0xe8,0x0, 0x8f,0x83,0xe1,0x80,0x8e,0x18, +0xe4,0x0, 0xc7,0x85,0xf0,0x0, 0x13,0x81,0xe8,0xf, 0x3f,0x94,0x8f,0x8f,0xf0,0x17, +0x3b,0x9d,0x3f,0xfc,0xe0,0x1, 0xae,0xb, 0xe0,0x6d,0x39,0xa9,0x3c,0xed,0x3f,0xfc, +0xe8,0x40,0x3e,0xe7,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3f,0xe6,0xe0,0x6f,0x39,0xaa, +0xe2,0x0, 0xce,0x83,0xc5,0x9c,0x3d,0x6f,0x1, 0xe0,0xe0,0x0, 0x2f,0xd1,0xf8,0x0, +0x8b,0x85,0xf2,0x0, 0xcb,0x82,0x5, 0x86,0x17,0x80,0xe8,0x0, 0xaf,0x85,0xf0,0x0, +0x13,0x80,0xe0,0x0, 0x1f,0xc6,0xf0,0xb, 0x33,0xa2,0xf0,0x3, 0x1b,0x33,0xe0,0x0, +0x1e,0x4b,0xf0,0x1, 0x18,0xee,0xf0,0x1, 0x19,0x70,0xf0,0x1, 0x19,0xef,0xf0,0x1, +0x1a,0x6d,0x3d,0x9f,0x16,0x80,0xf0,0x40,0x3b,0xfd,0x1, 0x26,0x8f,0x8b,0xe0,0xc, +0x14,0x52,0xe4,0x32,0xc7,0xc8,0xe0,0x25,0x14,0xf6,0xe0,0x19,0x15,0x24,0x3c,0x1f, +0x3c,0x9f,0x3d,0x1f,0x3c,0x1c,0x3f,0x9c,0x3c,0x9c,0x3d,0x1c,0xf0,0x0, 0xbb,0x4e, +0xbf,0xde,0xbc,0x6e,0xe0,0x1, 0xbc,0x8e,0xbd,0x7e,0xc6,0x81,0xe2,0x1, 0xc6,0xff, +0xe2,0x0, 0xce,0x83,0xc7,0x1c,0xc5,0x81,0x1, 0xdf,0xe8,0x0, 0x87,0x5, 0xe0,0x2, +0x1f,0xea,0xaf,0xf, 0x8, 0xe1,0xf0,0x0, 0xbb,0x4e,0xf0,0x0, 0xb8,0xde,0xf0,0x0, +0xb9,0x6e,0xf0,0x1, 0xb9,0x8e,0xf0,0x0, 0xba,0x7e,0x0, 0xe8,0xe8,0x0, 0xac,0x85, +0xe7,0xff,0x0, 0xaf,0xe0,0x2, 0x1f,0x6a,0x16,0x81,0x17,0x80,0x8d,0x8e,0xe0,0x2, +0x1c,0xfb,0xe0,0x2, 0x1f,0x2c,0xe0,0x2, 0x1d,0x77,0xe0,0x8, 0x36,0xb8,0x3e,0x6d, +0xf0,0x40,0x3b,0xef,0x3d,0xff,0x1, 0x13,0x8e,0x89,0x3e,0xd8,0x26,0x83,0xe0,0x1, +0xae,0x7e,0x8e,0x8a,0x3e,0xd8,0x26,0x83,0xe0,0x1, 0xae,0x7e,0xc7,0x81,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xee,0x38,0x82,0xf0,0x1, 0xab,0xfe, +0x0, 0xf6,0xe0,0x2, 0x1f,0x6a,0xe0,0x2, 0x1d,0xac,0x16,0x81,0x17,0x80,0xe0,0x2, +0x1c,0xfb,0x8d,0xe, 0xe0,0x8, 0x36,0xb8,0x3f,0x6b,0x3e,0x6d,0xf0,0x40,0x3b,0xef, +0x3d,0x7f,0x1, 0x18,0x8e,0x89,0x3e,0xd8,0x26,0x85,0xe0,0x1, 0xae,0x6e,0xe0,0x1, +0xae,0x7e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xf1, +0x17,0x80,0xe0,0x1, 0xaf,0xeb,0x14,0x1, 0xe0,0x5, 0xaf,0xab,0xe0,0x8, 0xaf,0xeb, +0x38,0x82,0xf0,0x1, 0xab,0xee,0xf0,0x1, 0xab,0xfe,0x0, 0xec,0x8, 0xb7,0xf8,0x0, +0xc, 0x39,0xe0,0x2, 0x1a,0xac,0x11,0x81,0xe0,0x2, 0x1a,0x2b,0xf0,0x2, 0x1c,0x9e, +0x3b,0xe8,0x39,0x65,0xdf,0xa0,0x13,0x0, 0xf0,0x40,0x3c,0x63,0xe0,0x1, 0x8f,0xf2, +0x2f,0x98,0xc1,0x1c,0xef,0xfe,0xd5,0xe3,0x2c,0x2c,0x39,0x74,0x1, 0xf8,0x11,0x1, +0x23,0xc, 0x8f,0x85,0xe0,0x2, 0x1f,0x1e,0xe4,0x0, 0xc7,0x9c,0xa9,0xe, 0x3a,0x9f, +0xe0,0x1, 0x8c,0x5, 0xef,0xfc,0xd2,0xff,0x3c,0x62,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1, +0x3c,0x63,0xef,0xfd,0xd3,0x39,0xe0,0x1, 0x8c,0x2, 0xf8,0x0, 0xac,0x9, 0xef,0xfc, +0xd2,0xf2,0xe2,0x0, 0xcb,0x82,0x1, 0x1c,0xa4,0x52,0xe0,0x1, 0xa5,0x2, 0xa4,0xe2, +0x3d,0xe7,0xef,0xfa,0xd8,0xc3,0x3b,0x63,0xc1,0x1c,0xef,0xfe,0xd5,0xb8,0x24,0x56, +0x11,0x0, 0x23,0x63,0x8f,0x85,0x17,0x1, 0xe4,0x0, 0xc7,0x9c,0x3a,0x9f,0xe0,0x1, +0x8c,0x5, 0xe0,0x2, 0x1f,0x9e,0xaf,0xf, 0xef,0xfc,0xd2,0xd5,0x0, 0xd6,0xa4,0x72, +0x0, 0xe5,0x8, 0xb7,0xf8,0x0, 0xc, 0x3b,0x17,0xe, 0x3f,0x38,0xe0,0x3, 0x1f,0xac, +0x3a,0xe8,0x3f,0x9e,0xf0,0x0, 0x8c,0x3f,0x89,0x9f,0xef,0xfe,0xd5,0x2e,0xe2,0x0, +0xca,0x82,0xe0,0x1, 0x1a,0x6e,0xe0,0x1, 0x1f,0xed,0xe0,0x2, 0x19,0x2c,0xe0,0x2, +0x1b,0x2b,0xf0,0x1, 0x1d,0xef,0xf0,0x1, 0x1d,0x70,0xe8,0x3, 0x39,0xc8,0xf0,0x40, +0x3c,0xe8,0xe0,0x64,0x39,0x2f,0x13,0x81,0xf0,0x0, 0x14,0x0, 0xe0,0x1, 0x8f,0xf2, +0x27,0x8f,0xe2,0x0, 0xca,0x82,0x1, 0x23,0xa4,0xd2,0x3d,0xe7,0x3d,0x64,0x3c,0x69, +0xef,0xff,0xd0,0x95,0xf0,0x0, 0x2c,0x8b,0x29,0x91,0xf0,0x1, 0xac,0x72,0xc1,0x1c, +0x39,0x76,0x1, 0xed,0xf8,0x0, 0xd, 0xa8,0xb, 0xe1,0xa4,0xe2,0x3d,0xe7,0xe8,0x40, +0x3d,0x6a,0x3c,0x69,0xef,0xff,0xd0,0x83,0x21,0xf1,0xe0,0x1, 0xa4,0x82,0x3d,0xe7, +0xe8,0x40,0x3d,0x6b,0x3c,0x69,0xef,0xff,0xd0,0x7a,0x0, 0xe8,0xa4,0xf2,0x0, 0xde, +0xe0,0x2, 0x1f,0xfa,0x8f,0x8f,0x27,0xac,0xe0,0x0, 0x1f,0xbf,0x8f,0xf, 0xe0,0x0, +0x1f,0xf8,0x8f,0x8f,0x3f,0xfe,0xe0,0x0, 0x1, 0x47,0xe0,0x0, 0x1f,0xf7,0x8f,0x8f, +0x3f,0xfe,0xe0,0x0, 0x1, 0x43,0xe0,0x0, 0x1f,0xf6,0x8f,0x8f,0xe0,0x2f,0x3f,0x8e, +0x37,0xa1,0xe0,0x2, 0x1f,0x6a,0x8f,0xe, 0x3f,0x7f,0x1, 0x12,0x2c,0x12,0x17,0x1c, +0xe0,0x2, 0x1e,0xac,0x3f,0x3f,0xe2,0x0, 0xcc,0x82,0x3f,0x1d,0xa5,0x5e,0x1, 0x1e, +0xe0,0x1, 0x1f,0xf2,0x15,0x80,0xa4,0x8f,0x3c,0x69,0xe7,0xe0,0x0, 0xc8,0x38,0x82, +0x17,0x7e,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0x5, 0x97,0x15,0x1, 0xe0,0x2a,0x3c,0xa, +0x2d,0x5, 0x17,0x4, 0xe0,0x28,0x3c,0xe, 0x24,0x6c,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, +0x1f,0x2c,0x3f,0x9e,0xe0,0x1, 0xa5,0xf, 0x0, 0xe4,0xc7,0x81,0xe4,0x0, 0xc7,0x9c, +0x3f,0x9d,0xa5,0xf, 0x0, 0xde,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, 0x1f,0x2c,0x3f,0x9e, +0xa5,0x6f,0x0, 0xd7,0x17,0x80,0x0, 0xc6,0x17,0x81,0x0, 0xc4,0xe0,0x2, 0x1f,0xac, +0xe4,0x0, 0xc4,0x9c,0x17,0x1, 0x3c,0x9f,0xe0,0x1, 0x8c,0x9, 0xe0,0x2, 0x1f,0x9e, +0xaf,0xf, 0xe7,0x84,0x0, 0xa0,0x8, 0xb3,0xe0,0x2, 0x1f,0x66,0xe0,0x2, 0x19,0x9e, +0x17,0x80,0x8f,0xe, 0xaf,0x83,0x27,0xa, 0xe0,0x2, 0x19,0x2c,0x8f,0x32,0xe2,0x0, +0xcf,0x2, 0x1, 0x19,0xe2,0x0, 0xcf,0x3, 0x1, 0x2, 0x9, 0xe1,0x8c,0x52,0x8f,0x82, +0xe2,0x1, 0xcc,0x7f,0x1, 0x30,0x17,0x2, 0xe1,0x2f,0x3f,0x9e,0x2f,0x85,0xe1,0x2e, +0x3c,0x1e,0x2f,0x2, 0xdb,0x77,0x17,0x80,0xaf,0xc2,0x17,0xff,0xaf,0xd2,0x17,0x80, +0xaf,0xb2,0x9, 0xe1,0xe0,0x1, 0x1e,0x51,0x16,0x9c,0x8f,0xc, 0x3e,0xbe,0x3e,0x92, +0xe0,0x1, 0x8d,0x9d,0x25,0xe3,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x2, +0xe0,0x1, 0xaf,0x9d,0x2, 0x8d,0xaf,0xc, 0xe4,0x0, 0xc7,0x1c,0x17,0x81,0x3f,0x12, +0xe0,0x1, 0x8c,0xe, 0xaf,0x83,0xef,0xfc,0xd1,0xde,0x8f,0x32,0x0, 0xcc,0xaf,0x8c, +0x17,0x0, 0x0, 0xf3,0xe4,0x0, 0xc7,0x9c,0x17,0x1, 0x3f,0x92,0xe0,0x1, 0x8c,0xf, +0xaf,0x3, 0xef,0xfc,0xd1,0xd0,0x0, 0xd4,0xe0,0x2, 0x1f,0xac,0x8c,0x4f,0x38,0x82, +0xe0,0x2, 0x1f,0xfa,0x8f,0x8f,0xe0,0x0, 0x27,0xdf,0xe0,0x2, 0x1f,0xc0,0xe0,0x4, +0x8f,0xdf,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x57,0x8, 0xb5,0xe2,0x0, 0xcc,0x1, +0x39,0x68,0x39,0xe9,0x17,0x84,0x1, 0x9, 0xef,0xfe,0xd4,0x1f,0xe2,0x0, 0xcc,0x0, +0x17,0x2, 0xe0,0x6e,0x39,0x28,0x3f,0xee,0x39,0xff,0xe0,0x2, 0x1a,0x2c,0xe0,0x1, +0x1, 0x54,0x8f,0xb4,0x2f,0xa0,0xe0,0x0, 0x1e,0xa4,0xe0,0x0, 0x1d,0xa3,0x17,0x80, +0xe0,0x80,0x8e,0x1d,0x17,0x1, 0x3f,0x1f,0xe2,0x0, 0xce,0x1, 0xe2,0x1, 0xc7,0x7f, +0xe0,0x6f,0x39,0x2e,0x3d,0xfd,0x1, 0xf5,0xe2,0x0, 0xcf,0x87,0xea,0x12,0x7f,0xa8, +0xe0,0x1, 0x2, 0xe0,0x8f,0xf, 0xe2,0x0, 0xcf,0x1f,0x5, 0x85,0x17,0x20,0xaf,0xf, +0x17,0x80,0xaf,0xc4,0x3c,0xe2,0x3c,0x63,0xef,0xfd,0xd2,0x14,0x8a,0xb4,0xe2,0x0, +0xca,0x81,0xe0,0x1, 0x1, 0x5, 0xe2,0x0, 0xca,0x82,0x1, 0x94,0xe2,0x0, 0xc9,0x1, +0xe0,0x1, 0x1, 0x44,0x3c,0x62,0xef,0xfe,0xd3,0xe0,0xe2,0x0, 0xcc,0x0, 0x17,0x80, +0xe0,0x65,0x39,0x28,0x3c,0x65,0xe1,0x2f,0x39,0x8f,0x27,0x86,0xe1,0x29,0x39,0x88, +0x24,0x83,0xa, 0xe1,0x38,0x82,0x8f,0x94,0x16,0x9c,0x3e,0xbf,0xe0,0xc, 0x3a,0x1d, +0xe0,0x1, 0x87,0x1c,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, +0xaf,0x1c,0x5, 0xf0,0xe0,0x1, 0x1d,0xc7,0x9d,0x5c,0x9f,0xb, 0x3f,0x1a,0xe2,0xff, +0xcf,0x7e,0xe0,0x1, 0x5, 0x34,0xe0,0xff,0x17,0x7f,0xb7,0x5c,0x3e,0x94,0x9f,0xb, +0x9e,0x6d,0x3e,0x7e,0x3, 0x83,0x9f,0xb, 0xb7,0x6d,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x2, 0xac,0xaf,0x94,0x8d,0x84,0x3f,0xfb,0xe0,0x1, +0x1, 0x2c,0x8f,0xa4,0xe0,0x0, 0x1f,0x73,0x8f,0xe, 0x3f,0x7f,0x2, 0xcb,0x14,0x0, +0xe0,0x2, 0x1f,0x2c,0x3c,0xe8,0xe1,0xff,0x16,0x7f,0x3f,0xe8,0x9e,0xde,0x15,0x1, +0x3e,0xfc,0x3d,0x1f,0x3, 0x84,0x9c,0x6e,0x3c,0xef,0x3e,0x6d,0x3f,0xea,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xf2,0x3d,0xf9,0x1, 0x1a,0xe4,0x0, +0xc5,0x9c,0xe0,0xf, 0x3a,0x1b,0x9f,0xdf,0xe0,0xe, 0x37,0xc2,0xe4,0x0, 0xc7,0x3, +0x3f,0x7c,0x5, 0x8b,0xe0,0x0, 0x1f,0x75,0x8e,0x8e,0xe0,0x0, 0x1f,0x74,0x36,0xa8, +0x8f,0xe, 0x3f,0x4d,0x3f,0x78,0x2, 0x87,0x37,0xc1,0x3f,0xfc,0xe0,0x0, 0x2, 0xfc, +0xe0,0x1, 0x14,0xff,0x17,0x83,0xac,0xd4,0xaf,0xb4,0xa, 0xe1,0xe0,0x0, 0x1f,0xbb, +0xe0,0x6, 0x8f,0xdf,0xc7,0xff,0x3c,0x7f,0xe7,0xff,0x1, 0x8d,0x17,0x80,0x8e,0x84, +0xb7,0xd4,0x17,0x0, 0xb7,0xe4,0x16,0x7f,0xe0,0x1, 0xaf,0x94,0xe0,0x2, 0xb7,0xb4, +0xe0,0x2, 0xb7,0xc4,0xe0,0x4, 0xb7,0x94,0xe0,0x4, 0xb7,0xa4,0xe0,0x1, 0x1f,0xd1, +0xae,0x94,0xae,0x8f,0x17,0x82,0xaf,0x24,0xae,0x54,0xe0,0x4, 0xaf,0x54,0xe0,0x8, +0xaf,0x14,0xaf,0xb4,0xa, 0xe1,0x8f,0x34,0xe7,0xfe,0x2f,0x4e,0xea,0x12,0x7e,0xa9, +0x87,0x8d,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x93,0x2, 0xac,0xaf,0x8d, +0xe0,0x0, 0x1f,0x75,0xe0,0x1, 0x1e,0x47,0x8e,0x8e,0xe0,0x0, 0x1f,0x74,0x9e,0xc, +0x8f,0xe, 0x36,0xa8,0x3f,0x4d,0x3e,0x7e,0xe0,0x0, 0x1f,0x22,0x3f,0x9e,0x5, 0xa3, +0x17,0x1, 0xaf,0xf, 0xe7,0xfe,0x0, 0x91,0x17,0x85,0x14,0x4, 0xe7,0xfe,0x0, 0xc5, +0xe0,0x0, 0x1c,0x22,0x17,0x1, 0x16,0x80,0x15,0x14,0x14,0x80,0xae,0x8f,0xaf,0x44, +0xaf,0x34,0xe0,0x4, 0xd4,0xd9,0xe0,0x0, 0x1f,0x91,0xe0,0x2, 0x17,0x68,0xb7,0xf, +0xe7,0xfe,0x0, 0x9a,0xaf,0xd, 0x3f,0xee,0x0, 0xd4,0x9f,0xb, 0x3d,0x1e,0xb5,0x5c, +0xe7,0xfe,0x0, 0xce,0x17,0x0, 0xaf,0xf, 0xe7,0xfd,0x0, 0xef,0x17,0x80,0xaf,0x94, +0x17,0x80,0xe7,0xfe,0x0, 0xd4,0x87,0xa4,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xaf,0xa4, +0xe7,0xfe,0x0, 0xd2,0xe0,0x0, 0x1f,0xf5,0x3d,0x94,0x8f,0xf, 0xe0,0x0, 0x1f,0xf4, +0x37,0x28,0x8f,0x8f,0x9e,0xeb,0x3f,0xce,0x3e,0xff,0xe0,0x1, 0x17,0xff,0xe0,0x6f, +0x3a,0xa9,0x3c,0xef,0xe7,0xfe,0x0, 0xf8,0xe0,0x2, 0x1f,0xac,0xe0,0x1, 0x8f,0xf, +0x3f,0x78,0x1, 0xd, 0xe0,0x4, 0x8f,0x4f,0x3f,0x78,0x1, 0x9, 0xe0,0x8, 0x8f,0xf, +0x3f,0x78,0x1, 0x5, 0xe0,0x1, 0xac,0xf, 0x14,0x1, 0x38,0x82,0x14,0x0, 0x38,0x82, +0xe2,0x1, 0xcc,0x80,0xe0,0x2, 0x1f,0xac,0x1, 0x1f,0xe2,0x1, 0xcc,0x81,0x1, 0x2b, +0xe2,0x0, 0xcc,0x82,0x5, 0x82,0x14,0x80,0x8f,0x8f,0x3c,0xff,0x1, 0x4, 0xe2,0x0, +0xcf,0x82,0x5, 0x86,0xe0,0x2, 0x1f,0x93,0xe0,0x1, 0xac,0xaf,0x38,0x82,0x8, 0xb1, +0xc0,0x7c,0x3c,0x69,0x7c,0x81,0xd9,0xbe,0x64,0x81,0xe0,0x2, 0x1f,0x93,0xe0,0x1, +0xac,0xaf,0xc0,0x4, 0x8, 0xe1,0xe0,0x1, 0x8f,0xf, 0xe0,0x4, 0x8e,0xcf,0x14,0x80, +0x3f,0x7d,0x3, 0x9b,0xe0,0x8, 0x8e,0x8f,0x3e,0xfe,0x17,0x2, 0xe0,0x6e,0x3a,0xa9, +0x3c,0xee,0x0, 0xdb,0xe0,0x1, 0x8f,0xf, 0xe0,0x4, 0x8e,0xcf,0x14,0x80,0x3f,0x7d, +0x5, 0x89,0xe0,0x8, 0x8e,0x8f,0x3e,0xfe,0x17,0x2, 0xe0,0x6e,0x3c,0xa9,0x3c,0xee, +0x0, 0xcc,0x3f,0x6d,0x14,0x81,0x0, 0xf6,0x3f,0x6d,0x14,0x81,0x0, 0xe4,0x0, 0x0, +0x8, 0xb7,0xe0,0x2, 0x1f,0x7d,0x8f,0xfe,0x89,0x6e,0x8a,0x5e,0x27,0xad,0x12,0xff, +0x3a,0x9f,0xe2,0x1, 0xc2,0xff,0xe0,0x4c,0xc2,0xa7,0xe0,0x1, 0x1f,0xff,0x32,0xa1, +0xe0,0x1, 0x1b,0x64,0x39,0xe8,0x3a,0x9f,0xe0,0x0, 0x13,0x80,0x21,0x1e,0x14,0x0, +0x3f,0x67,0x3e,0x64,0xe3,0xff,0xc7,0x7f,0xe0,0x40,0x3f,0xe8,0xe0,0xd, 0x37,0x21, +0xc7,0x81,0x3e,0x93,0xe2,0x1, 0xc7,0xff,0x96,0x8d,0x39,0x7f,0x3f,0x1c,0x3c,0x1d, +0xe3,0xff,0xc7,0x7f,0x1, 0xf4,0x3c,0xe2,0xe0,0x4, 0xd3,0x82,0xe0,0x80,0xb4,0x16, +0x3a,0xf6,0xc3,0x81,0x1, 0xe4,0xb, 0xe1,0x3c,0x62,0x3c,0xe2,0xe0,0x4, 0xd3,0x78, +0xe0,0x80,0xb4,0x16,0x3a,0xf6,0xc3,0x81,0x1, 0xda,0x0, 0xf6,0xe0,0x0, 0x24,0xd3, +0x8, 0xb3,0x16,0x7f,0x3e,0x19,0xe2,0x1, 0xc6,0x7f,0x11,0x7e,0x39,0x18,0x36,0x21, +0x3e,0x18,0x39,0xe2,0xe0,0x0, 0x14,0x0, 0xe0,0x43,0x3d,0x9a,0xe0,0x80,0x97,0x13, +0xe4,0xd, 0x37,0xf, 0xe2,0xf, 0x3e,0xce,0x3f,0xad,0xe0,0x43,0x3f,0x9f,0x3f,0xfa, +0xe0,0x6f,0x3a,0x2b,0x3e,0x73,0x3c,0x1f,0x1, 0xf2,0xe0,0x4, 0xd3,0x51,0xe2,0x0, +0xcc,0x8, 0x15,0x88,0xe0,0x6b,0x3b,0x28,0xe7,0xfe,0x16,0x2f,0xe0,0x0, 0x15,0x6d, +0x0, 0x91,0xe0,0xe, 0x3f,0xab,0xe0,0x2d,0x3f,0xac,0xe0,0x43,0x3f,0x1e,0x26,0x99, +0xe0,0x2d,0x3e,0x1e,0x26,0x96,0xe0,0xf, 0x37,0x2, 0xe0,0x80,0xb7,0x92,0x39,0xf2, +0x1, 0x18,0xe0,0x0, 0x97,0x92,0xe2,0x0, 0xcf,0x87,0x2, 0x6c,0xe3,0xff,0xcf,0xf9, +0x3, 0x75,0xe0,0xe, 0x3d,0x9f,0xe0,0x2d,0x3f,0xac,0xe0,0x43,0x3f,0x1e,0x2e,0xe9, +0xe0,0x2f,0x3d,0x2f,0x27,0x84,0xe0,0x2f,0x3f,0x1a,0x2f,0xe6,0x3f,0xee,0x0, 0xe6, +0x9, 0xe1,0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x2, 0x1f,0xfd,0xe0,0x1, +0x1b,0x72,0x8a,0x6f,0xa4,0x86,0xe0,0x1, 0x1c,0x62,0xe7,0x0, 0x16,0x0, 0xe0,0xff, +0x15,0xff,0x15,0x0, 0x8a,0xff,0xef,0xfe,0xde,0x8, 0x22,0x2f,0xc2,0x7f,0xe2,0x1, +0xc2,0x7f,0xe0,0x4b,0xc2,0x6b,0xe0,0x1, 0x1f,0xff,0x32,0x21,0xe0,0x1, 0x19,0xe1, +0xe0,0x19,0x32,0xa1,0x3a,0x1f,0x11,0x0, 0xf0,0x0, 0x14,0x3, 0xe0,0x0, 0x13,0xda, +0xe0,0x80,0x97,0x93,0xe8,0x40,0x3c,0xe8,0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f, +0xe0,0x8, 0x3f,0xa8,0xe0,0x4, 0xd2,0xec,0xe2,0x0, 0xcc,0x5a,0xa7,0x86,0x3d,0x67, +0xe0,0x6a,0x3b,0x28,0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x3f,0x92,0x3c,0xe5,0xdf,0x6f, +0x3a,0x73,0xe8,0x2, 0x39,0x19,0x1, 0xe5,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xe1,0xff,0xc0,0x8, 0xe0,0x2, 0x1f,0xfd,0xf0,0x1, +0x1e,0x7f,0x8a,0x7f,0xe8,0x40,0x3c,0x6c,0x8b,0x6f,0xef,0xff,0xdf,0x1b,0xe0,0x0, +0x22,0x4f,0x13,0xff,0x3b,0x94,0x11,0xff,0xe2,0x1, 0xc3,0xff,0x39,0x96,0xe0,0x4c, +0xc3,0xa7,0xe2,0x1, 0xc1,0xff,0xf0,0x0, 0x14,0x4, 0xf0,0x18,0x3c,0x10,0x33,0xa1, +0x31,0xa1,0xe0,0x1, 0x1a,0xe4,0xe8,0x7, 0x3b,0x9c,0x32,0x21,0xe8,0x3, 0x39,0x98, +0xf0,0x0, 0x15,0x3, 0xf0,0x0, 0x14,0xda,0xf0,0x0, 0x15,0x80,0xe0,0x80,0x97,0x95, +0xe8,0x40,0x3c,0xea,0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f,0xe0,0x8, 0x3f,0xa8, +0xe0,0x4, 0xd2,0x9e,0xe2,0x0, 0xcc,0x5a,0xe8,0x40,0x3d,0x69,0xe0,0x6a,0x3b,0x28, +0xe3,0xff,0xc5,0x7f,0x23,0x21,0x11,0x2, 0x39,0x10,0x3f,0x62,0xe8,0x40,0x3f,0xec, +0x96,0x8f,0x3f,0x94,0xe0,0x80,0xb6,0x9e,0x3f,0x73,0x1, 0xfb,0x3c,0xe6,0xe8,0x40, +0x3c,0x68,0xdf,0x15,0xe8,0x40,0x3f,0xec,0xe0,0x80,0x97,0x12,0x39,0x73,0xb7,0xf, +0x3f,0x94,0x1, 0xfb,0x3a,0xf7,0xf0,0x0, 0xc6,0x2, 0x1, 0xd1,0xe0,0x0, 0xc0,0x78, +0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe8,0x40,0x3c,0xeb,0xe8,0x40,0x3c,0x68,0xde,0xff, +0x3a,0xf7,0xf0,0x0, 0xc6,0x2, 0x1, 0xc3,0x0, 0xf2,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x68,0xe0,0x3, 0x1f,0xc7,0xf0,0x2, 0x1e,0x7d,0x8f,0xf, 0xe8,0x0, +0x8e,0x4c,0xe8,0x0, 0x8e,0xdc,0xe2,0x0, 0xcf,0x1, 0x7e,0x4, 0x3a,0x68,0x7e,0x85, +0x39,0xe9,0xe0,0x2, 0x1, 0x77,0x8f,0x8f,0xe0,0x1, 0x1f,0x8, 0xe2,0x0, 0xcf,0x83, +0xe0,0x1, 0x1f,0x89,0x8f,0x8f,0xe0,0x2, 0x1, 0x73,0xf0,0x0, 0x8d,0xe, 0x37,0xa8, +0xf0,0x1a,0x3d,0x4f,0xf0,0x0, 0x7d,0x1, 0xe0,0x2, 0x22,0x1f,0x67,0x4, 0x12,0x80, +0x3f,0xee,0xc7,0xff,0x7f,0x86,0xf0,0x40,0x3f,0x65,0xf0,0x0, 0x1e,0x8d,0xf0,0x2, +0x1c,0xbc,0xe0,0x1, 0x1b,0xff,0x13,0x3, 0xe0,0x1, 0x29,0x8e,0xe8,0x0, 0x8f,0x8d, +0xf8,0x0, 0x8d,0x9d,0x3f,0xfe,0xe0,0x0, 0x1, 0x76,0xe8,0x0, 0x8f,0x9, 0xe2,0x0, +0xcf,0x1, 0xe0,0x1, 0x1, 0x7, 0xe8,0x0, 0x89,0x5c,0x66,0x1, 0x39,0x3f,0xe8,0x2, +0x39,0x1b,0xf0,0x40,0x3d,0xe2,0xf3,0xff,0xc5,0xff,0xf0,0xe, 0x35,0xa1,0x3f,0x17, +0x96,0x8e,0xe4,0x9, 0x36,0x8f,0xe2,0xe, 0x3c,0xcd,0x3f,0x29,0x3f,0x7c,0xe0,0x0, +0x2, 0x5a,0xe0,0x1, 0x2f,0x96,0x67,0x84,0x39,0x65,0xe2,0x0, 0xcf,0x81,0xe0,0x2, +0x2, 0x47,0xe2,0x0, 0xce,0x80,0xe0,0x1, 0x4, 0x26,0x3f,0xe5,0xe3,0xff,0xc7,0xff, +0x37,0xcf,0xe0,0x1, 0x27,0xad,0x3f,0xe2,0xe3,0xff,0xc7,0xff,0x37,0xcf,0xe0,0x1, +0x27,0xa7,0x17,0x8e,0xe8,0xf, 0x3f,0x9b,0x37,0xa1,0xe8,0xf, 0x3f,0x9c,0x9c,0xf, +0x3c,0xe6,0xe0,0x4, 0xd2,0x30,0x11,0x7c,0xe8,0x2, 0x39,0x1b,0xf0,0x40,0x3c,0x68, +0xf3,0xff,0xc4,0x7f,0xe3,0xff,0xc1,0x7f,0x17,0x7f,0xe8,0xe, 0x3f,0x1b,0xf0,0x40, +0x3d,0x6e,0xf3,0xff,0xc5,0x7f,0x17,0x8e,0xe8,0xf, 0x3f,0x9a,0x37,0xa1,0x3c,0xe6, +0xe8,0xf, 0x3f,0x9c,0xf0,0x2, 0x25,0x8e,0xf0,0x40,0x3d,0x72,0xe0,0x1, 0x1, 0x31, +0x9c,0xf, 0xe0,0x4, 0xd2,0x10,0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0x78,0xe0,0x1, +0x1, 0xfb,0xf8,0x40,0x3d,0xea,0x0, 0xe1,0x17,0xff,0x3f,0x92,0x39,0x6f,0xe2,0x1, +0xc1,0x7f,0xe0,0x1, 0x29,0x49,0x29,0x86,0x14,0x80,0xe8,0x40,0x3c,0x6e,0xe0,0x0, +0xdc,0x1d,0x16,0x1, 0xe8,0xc, 0x3e,0x1e,0xf0,0x40,0x3f,0x6c,0xf2,0x1, 0xc7,0x7f, +0xe8,0x40,0x3a,0x7e,0xf0,0x0, 0xc6,0x82,0xe0,0x1, 0x1, 0x7, 0xe8,0x0, 0x8f,0x4c, +0xe7,0xfe,0x21,0xf6,0xe8,0x7, 0x8f,0xcd,0xf8,0x7, 0x8d,0xdd,0xe7,0xfe,0x0, 0xf4, +0x27,0xe9,0xe0,0x1, 0x1e,0x42,0xe0,0xe, 0x8f,0x1c,0xc7,0x7f,0xe0,0x2e,0x3f,0xf, +0x2f,0x61,0xf0,0x2e,0x3d,0x8e,0x2f,0x5e,0xe0,0xe, 0x8f,0x2c,0xc7,0x7f,0xf0,0x40, +0x3d,0xfe,0x1, 0x58,0xe8,0x0, 0x89,0x5c,0x66,0x1, 0x39,0x3f,0xe8,0x2, 0x39,0x1b, +0xf0,0x40,0x3d,0xe2,0xf3,0xff,0xc5,0xff,0xf0,0xe, 0x35,0xa1,0x3f,0x17,0x96,0x8e, +0xe4,0x9, 0x36,0x8f,0xe2,0xe, 0x3c,0xcd,0x3f,0x29,0x3f,0x7c,0x2, 0x43,0x66,0x5, +0xf0,0x9, 0x3d,0xac,0x66,0x6, 0x34,0xa1,0x3e,0x7f,0x3c,0x97,0x91,0x9, 0xe0,0x1, +0x5, 0x38,0x64,0x85,0xe2,0x0, 0xcf,0x80,0xe8,0x9, 0x3c,0x9b,0x34,0xa1,0x3c,0x97, +0x92,0x89,0x3f,0xe5,0xe0,0x6f,0x39,0xa2,0xe2,0x0, 0xce,0x80,0x39,0x6f,0xe7,0xfe, +0x3, 0x5e,0xe0,0x41,0x3f,0x82,0xe3,0xff,0xc7,0xff,0x37,0xcf,0x27,0x88,0xe0,0x41, +0x3f,0x85,0xe3,0xff,0xc7,0xff,0x37,0xcf,0xe7,0xfe,0x2f,0xdd,0xe4,0x0, 0xc7,0xa, +0xe1,0xff,0x14,0x7e,0x3c,0x5e,0x14,0x9e,0xe0,0x4, 0xd1,0x8d,0xe4,0xe, 0x31,0xf, +0xe2,0xf, 0x3f,0x42,0x3f,0xae,0xe3,0xff,0xc4,0x7f,0xe3,0xff,0xc7,0xff,0xe1,0x2f, +0x3c,0x1f,0xe7,0xff,0x27,0x88,0xe4,0xe, 0x32,0x8f,0xe2,0xf, 0x3f,0x45,0x3f,0xae, +0xe3,0xff,0xc7,0xff,0xe1,0x2f,0x3c,0x1f,0xe7,0xfe,0x2f,0xbd,0x16,0x1, 0xe8,0xc, +0x3e,0x1e,0xf0,0x40,0x3f,0x6c,0xf2,0x1, 0xc7,0x7f,0xe8,0x40,0x3a,0x7e,0xf0,0x0, +0xc6,0x82,0xe7,0xfe,0x1, 0xfd,0xc0,0x18,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x79,0x3, +0xf0,0xd, 0x35,0x21,0xe8,0x0, 0x9f,0x5c,0xc6,0x9a,0x7f,0x2, 0xf0,0x1b,0x3e,0x1d, +0x11,0x1, 0xe8,0x80,0x9c,0x1b,0x3c,0xe6,0xe0,0x4, 0xd1,0x55,0xe3,0xff,0xc4,0x7f, +0xf0,0x40,0x3c,0x78,0xf0,0x0, 0x13,0x81,0x14,0x81,0xf0,0x17,0x3b,0x92,0xe8,0x9, +0x3c,0x9a,0xe7,0xfe,0x1, 0xc3,0x67,0x82,0xe8,0x40,0x3f,0xfa,0xf0,0x40,0x3d,0x69, +0xf3,0xff,0xc5,0x7f,0x5, 0x88,0xe8,0x40,0x39,0x67,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, +0xc9,0x5, 0x1, 0xe0,0x16,0xff,0x3e,0x92,0x67,0x83,0x66,0x3, 0xe2,0x1, 0xc6,0xff, +0x37,0xa1,0x3e,0x9c,0xc7,0xfe,0x36,0xa1,0x3f,0x97,0x3e,0x97,0x97,0x1f,0x37,0x2, +0xe0,0x80,0xb7,0x1f,0x3f,0xfd,0x1, 0xfb,0xe7,0xfe,0x29,0xad,0xe7,0xfe,0x0, 0xa6, +0xe0,0x1, 0x1f,0xd7,0x9f,0xaf,0x7f,0x81,0xe7,0xfd,0x0, 0x98,0x8c,0xe, 0x37,0xa8, +0x3c,0x4f,0x14,0x8a,0x34,0x23,0xe0,0x4, 0xd0,0xd3,0xe3,0xff,0xc4,0x7f,0x7c,0x1, +0xe7,0xfd,0x0, 0x8c,0xf0,0x0, 0x7d,0x83,0xf8,0x40,0x3d,0x6b,0xe7,0xff,0x0, 0xaa, +0xf8,0x40,0x3d,0x6b,0xf0,0x0, 0x7d,0x83,0xe7,0xff,0x0, 0xa4,0x67,0x85,0xe8,0xf, +0x3f,0x9b,0x37,0xa1,0x3f,0x97,0x92,0x8f,0x39,0x65,0xe7,0xfd,0x0, 0xb4,0x3e,0x62, +0xe0,0x6c,0x39,0xa5,0x3a,0xec,0xe7,0xfd,0x0, 0xae,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f, +0xe2,0x0, 0xcf,0x83,0x1, 0x2, 0x38,0x82,0x8, 0xb1,0xe0,0x1, 0x1f,0x7, 0xe0,0x1, +0x1f,0xd7,0x86,0x8e,0xe0,0x0, 0x17,0x5a,0xb7,0x1f,0xb7,0x2f,0xe7,0xff,0x17,0x26, +0xae,0x9f,0xb7,0x3f,0xef,0xfa,0xd9,0x6, 0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0x2c,0xa, +0xe0,0x0, 0x1f,0x8c,0x8c,0xf, 0x2c,0x2, 0x8, 0xe1,0x14,0x81,0x8, 0xa1,0xe7,0xfc, +0x0, 0xa7,0x14,0x80,0xde,0x24,0x0, 0xf5,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0x2, 0x38,0x82,0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0x24,0x7c,0x14,0x80, +0xe7,0xfc,0x0, 0x96,0x8, 0xb7,0xe1,0xff,0xc0,0x30,0x12,0x8c,0x3a,0x90,0xe0,0x0, +0x15,0x48,0x14,0x80,0x3c,0x65,0xe0,0x4, 0xd1,0xf, 0xef,0xfa,0xd8,0xdb,0xe0,0x2, +0x1f,0xe6,0xe0,0x2, 0x1a,0x7d,0x87,0x8f,0xe0,0x3, 0x8f,0x24,0xe2,0x0, 0xc7,0x81, +0x3f,0x7f,0xe0,0x2, 0x1, 0x45,0x87,0xa4,0x89,0x4, 0xe4,0xf, 0x37,0xa8,0xe4,0xe, +0x37,0xc8,0xe2,0x0, 0xcf,0x21,0xea,0x40,0xcf,0x0, 0xe0,0x6f,0x3b,0xae,0xe4,0xf, +0x37,0xc8,0x39,0xef,0xe0,0x2, 0x27,0xba,0xf7,0xff,0x12,0x7f,0xf0,0x14,0x3a,0x1f, +0xfa,0x4e,0x7b,0xf4,0xe0,0x1, 0x1f,0xf2,0x8d,0x54,0xf9,0xff,0xc3,0xff,0xf3,0xff, +0xc2,0x7f,0xf0,0x0, 0xa3,0xf, 0x3d,0xe2,0xf8,0x14,0x3a,0x17,0x35,0x21,0x17,0x80, +0xf0,0x40,0x3a,0xe5,0x25,0x9a,0x14,0x98,0x3c,0xbf,0xe8,0x40,0x3f,0x66,0xf0,0xf, +0x3a,0x99,0xe0,0x1, 0x9c,0x1f,0xa6,0x8f,0x17,0x80,0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x96,0xe, 0x3f,0xfb,0x3e,0x9c,0x3f,0x1a,0x1, 0xf9,0xf0,0xf, 0x3a,0x99,0xe0,0xe, +0x3d,0x98,0xbe,0x8f,0xe0,0x1, 0xb7,0x1f,0xf8,0x40,0x3a,0x77,0xf0,0x0, 0xc3,0x2, +0x1, 0x4, 0xe8,0x80,0x8f,0x97,0x0, 0xdf,0x64,0x3, 0x5c,0x8f,0x12,0x8c,0x3a,0x90, +0xe0,0x4, 0xd0,0x16,0xb4,0x65,0xe0,0x2, 0x9c,0xd5,0xa4,0x65,0xe0,0x4, 0xd0,0x10, +0xe0,0x2, 0xb4,0x25,0xe0,0x4, 0x9c,0x95,0xe0,0x1, 0xa4,0x45,0xe0,0x4, 0xd0,0x8, +0xe0,0x3, 0xb4,0x65,0xe0,0x0, 0x21,0xd9,0xf7,0xff,0x10,0xff,0xe0,0x1, 0x1f,0xf2, +0xfa,0x4e,0x79,0xf4,0xf0,0x11,0x38,0x93,0xf0,0x0, 0x8a,0x54,0xf9,0xff,0xc1,0xff, +0xf3,0xff,0xc0,0xff,0x3c,0xe2,0xf0,0x0, 0xa1,0xf, 0xe2,0x1, 0xc4,0xff,0xf8,0x11, +0x38,0x93,0xf0,0x14,0x32,0x21,0x15,0x0, 0x24,0xb7,0xe4,0x0, 0xc5,0x18,0xf0,0x0, +0x13,0x8, 0x3d,0x15,0xf0,0x0, 0x13,0x96,0x14,0x4, 0xf0,0x0, 0x92,0xea,0xf0,0x16, +0x3b,0x1a,0xf0,0x17,0x3b,0x9a,0x3c,0x1a,0xe8,0x40,0x3f,0x62,0x17,0x80,0xc5,0x14, +0x0, 0x8e,0xa5,0x88,0x96,0xa, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3e,0x9b,0xc6,0x1, +0x3f,0xf9,0xbe,0x88,0xe8,0xe, 0x3f,0x14,0xb6,0xa, 0x1, 0x16,0x96,0x8e,0xe8,0x40, +0x3e,0xf5,0x5, 0x70,0xe8,0x0, 0xa5,0x86,0xe8,0x0, 0x96,0x7, 0xc7,0x81,0xe3,0xff, +0xc7,0xff,0x3e,0x9b,0xc6,0x1, 0x3f,0xf9,0xe8,0x0, 0xbe,0x86,0xe8,0xe, 0x3f,0x14, +0xe8,0x0, 0xb6,0x7, 0x1, 0xec,0xf8,0x40,0x39,0xf1,0xf0,0x0, 0xc1,0x2, 0x1, 0x4, +0xe8,0x80,0x8d,0x13,0x0, 0xc2,0x13,0xc, 0x3b,0x10,0xe0,0x0, 0x13,0xd4,0x3b,0x90, +0x3a,0xe6,0xe0,0x1, 0x9f,0xa5,0x3c,0xef,0xe0,0x0, 0x27,0xfc,0xa4,0x15,0xe0,0x3, +0xdf,0x9f,0xb4,0x75,0xe0,0x1, 0x9f,0xb5,0x3c,0xef,0xe0,0x0, 0x27,0xef,0xa4,0x25, +0xe0,0x3, 0xdf,0x96,0xe0,0x1, 0xb4,0x5, 0xc2,0x98,0x3b,0xf5,0x1, 0xeb,0xe0,0x0, +0x1f,0x8d,0x17,0x4, 0x3f,0x10,0xe0,0x1b,0x95,0x1f,0x3d,0xee,0x17,0x80,0xe0,0x1, +0x14,0x16,0xe7,0xfe,0x14,0xea,0xe3,0xfe,0xcd,0x38,0xe0,0x0, 0x3, 0x45,0xe0,0x1, +0x9e,0xb6,0xe2,0x0, 0xce,0xe3,0x5, 0xbf,0xe0,0x1, 0x96,0x86,0xe0,0xc, 0x37,0xa1, +0xe3,0xfe,0xce,0xea,0xb6,0x8e,0x3e,0x1b,0x3, 0x3e,0xb4,0x8c,0xc7,0x81,0xe2,0x0, +0xcf,0x83,0xc3,0x18,0xc7,0x2, 0x1, 0xe8,0xe0,0x0, 0x21,0xc7,0xe0,0x1, 0x1f,0xf2, +0xea,0x4e,0x7a,0xf4,0xc1,0xff,0xe9,0xff,0xc2,0xff,0xe3,0xff,0xc1,0xff,0xa4,0x8f, +0xe2,0x1, 0xc1,0x7f,0x39,0x95,0x3c,0x65,0xe0,0x0, 0x17,0x80,0xe0,0xb, 0x3c,0x25, +0x21,0x15,0xe2,0x0, 0x7f,0x4, 0x37,0xa1,0x3f,0x9e,0x9d,0xf, 0x17,0x0, 0x8f,0xd4, +0x3f,0xbe,0xc7,0x1, 0x3f,0x9b,0x37,0xa1,0x3f,0x99,0x96,0x8f,0x3e,0x6e,0xe3,0xff, +0xc6,0x7f,0x3e,0xaa,0x3e,0x72,0xb6,0x8f,0x4, 0xf3,0x3c,0x73,0x1, 0x1d,0xe0,0x80, +0x8f,0x98,0x0, 0xe5,0x96,0xf6,0xe0,0xc, 0x37,0xa1,0xe3,0xfe,0xce,0xea,0xb6,0x8e, +0x3e,0x1b,0x4, 0x44,0xe2,0x1, 0xce,0x96,0xe0,0xd, 0x37,0xa1,0x3e,0x9b,0xe7,0xff, +0x5, 0x3f,0xb4,0xd, 0xe7,0xff,0x0, 0xbc,0xe0,0x1, 0xb7,0x85,0xe7,0xff,0x0, 0x96, +0xb7,0xf5,0xe7,0xff,0x0, 0x89,0xe0,0x0, 0xc0,0x50,0xb, 0xe1,0x14,0x80,0x3c,0x69, +0x39,0x69,0x39,0xe9,0xe7,0xfe,0x0, 0x84,0x3c,0xef,0x3c,0x6f,0x39,0xef,0xe7,0xfd, +0x0, 0xff,0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x1, 0x1c,0x7b,0xa4,0x8f,0xef,0xfe, +0xd9,0x8d,0xde,0x91,0xdb,0xf0,0xdc,0x35,0xe0,0x1, 0xd5,0x7d,0x2c,0x5, 0xe0,0x3, +0x1f,0xc0,0xac,0xf, 0x8, 0xe1,0xe0,0x3, 0x1f,0xc0,0x17,0x1, 0xaf,0xf, 0x8, 0xe1, +0xea,0x12,0x7f,0xb4,0xe0,0x1, 0x17,0x2a,0xe0,0x2e,0x3c,0xe, 0xa6,0x8f,0x27,0x2, +0x26,0x89,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1f,0x58,0x1, 0xe, 0x17,0xea,0xaf,0x8e, +0x38,0x82,0xe0,0x1, 0x1f,0x58,0x8e,0x8e,0xc6,0xff,0xae,0x8e,0x16,0x80,0xbe,0x8f, +0x17,0xea,0xaf,0x8e,0x38,0x82,0xe2,0x0, 0xcc,0x9, 0x1, 0xf9,0x16,0x82,0xbe,0x8f, +0x0, 0xee,0xe0,0x2, 0x1f,0xb6,0xea,0x12,0x7f,0x32,0x8c,0xf, 0xe0,0xd, 0x34,0x22, +0x9f,0x8e,0xc6,0x81,0x3f,0xfd,0x5, 0x4, 0xe0,0x1, 0x14,0x7f,0x38,0x82,0xc7,0x81, +0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xb7,0x8e,0x1, 0xb, 0xe2,0x0, 0xcf,0x82, +0x1, 0x76,0xe0,0x3, 0x1f,0x39,0xa7,0xe, 0x3f,0x9e,0xe0,0x40,0x8c,0x3f,0x38,0x82, +0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8c,0x3f,0x38,0x82,0xe0,0x2, 0x1e,0x93,0x17,0x6, +0xac,0xd, 0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f,0xe2,0x0, 0xc7,0x5, +0x27,0xc, 0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xc0,0x17,0x1, 0xe0,0x4, 0xaf,0x7f, +0x5, 0x8a,0x17,0x80,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1f,0xc0,0x17,0x3, 0xe0,0x4, +0xaf,0x7f,0x38,0x82,0x38,0x82,0x8, 0xb3,0x39,0xe9,0x2c,0x1d,0xe0,0x0, 0x1f,0x30, +0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0x3a,0xe0,0x2, 0x1e,0x93,0x17,0x6, 0xa9,0x8d, +0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f,0xe2,0x0, 0xc7,0x5, 0x2f,0x23, +0xe0,0x2, 0x1f,0xc0,0x17,0x3, 0xe0,0x4, 0xaf,0x7f,0x17,0x1, 0xe0,0x3, 0x1f,0x9a, +0xaf,0xf, 0x9, 0xe1,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0x39,0x68,0x5, 0xa1,0xe4,0x1, 0xcc,0x0, 0xe2,0x0, 0xcc,0x6f,0x5, 0xa3,0xe2,0x1, +0xc9,0x7c,0x1, 0x23,0xe2,0x1, 0xc9,0x7d,0x1, 0x19,0xe0,0x3, 0x1f,0x9a,0x17,0x1, +0xaf,0xf, 0x9, 0xe1,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xc0,0x17,0x1, 0xe0,0x4, +0xaf,0x7f,0x5, 0xf4,0x17,0x80,0xaf,0x8d,0x0, 0xf1,0xe0,0x2, 0x1f,0x66,0x8f,0xe, +0x2f,0x44,0x9, 0xe1,0x3c,0x69,0xdf,0x55,0x0, 0xe6,0xe0,0x0, 0x1f,0xad,0xa9,0x8f, +0x9, 0xe1,0xe0,0x0, 0xd8,0x73,0x0, 0xdc,0x3c,0x63,0x9, 0xa1,0xe7,0x7e,0x0, 0xe0, +0xe0,0x0, 0x24,0x52,0xe2,0x0, 0xcc,0x3, 0x2, 0x91,0xe0,0x0, 0x1f,0x9b,0x8f,0x8f, +0xe0,0x0, 0x2f,0xcf,0xe0,0x0, 0x1f,0x18,0xe0,0x2, 0x1e,0xb1,0x3f,0xee,0xbf,0xd, +0x3c,0x1f,0xe0,0x40,0x8f,0x98,0x3c,0x6f,0x38,0x82,0xe2,0x0, 0xcc,0x5f,0xe0,0x0, +0x5, 0xc8,0x17,0xad,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xc5,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xd5,0xe0,0x0, 0x17,0xe7,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x5, 0xe6,0xe7,0xff,0x17,0x80,0x3f,0x98,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f, +0xe2,0x0, 0xcf,0x6f,0x5, 0xb4,0xe2,0x1, 0xcc,0x7c,0xe0,0x1, 0x1, 0xb, 0xe2,0x1, +0xcc,0x7d,0xe0,0x1, 0x1, 0xd, 0xe2,0x1, 0xcc,0x7e,0xe0,0x1, 0x17,0xff,0x1, 0x8e, +0xe0,0x2, 0x1f,0xc8,0x17,0x5, 0x8f,0x8f,0x3f,0x3f,0xe0,0x3, 0x1f,0xb0,0x3f,0x9e, +0x8f,0x8f,0x0, 0x84,0xe0,0x2, 0x1f,0x93,0x8f,0x8f,0x3c,0x6f,0x38,0x82,0xe0,0x1, +0x1f,0x5a,0xe0,0x2, 0x1e,0xb1,0x3f,0xee,0xbf,0xd, 0xe7,0xff,0x0, 0xb3,0xe0,0x2, +0x1f,0xb1,0xa7,0x8f,0xe7,0xff,0x0, 0xae,0xe2,0x1, 0xcc,0x53,0x1, 0x11,0xe0,0x1, +0x1f,0x58,0x8f,0x8e,0xc7,0xff,0xaf,0x8e,0xe7,0xfd,0x0, 0xfd,0xe2,0x1, 0xcc,0x0, +0xe0,0x0, 0x1, 0x63,0xe0,0x2, 0x1f,0x40,0x3f,0x9e,0x8f,0x8f,0x0, 0xdf,0xea,0x12, +0x7f,0xb2,0x17,0x0, 0xb7,0xf, 0x0, 0xf1,0xe2,0x1, 0xcc,0x6b,0xe0,0x0, 0x1, 0x44, +0xea,0x12,0x7f,0x30,0x8e,0xe, 0x16,0x81,0x3e,0x9c,0xea,0x4f,0x7f,0x94,0xe2,0x1, +0xc6,0xff,0xe9,0xff,0xc7,0xff,0xe2,0x0, 0xce,0x83,0x3f,0x9c,0x8f,0x8f,0x1, 0x25, +0xae,0x8e,0x16,0xeb,0xe0,0x1, 0x1f,0x58,0xae,0x8e,0x0, 0xc0,0xe0,0x2, 0x1f,0x40, +0x16,0xe0,0xe0,0x2, 0x8f,0x8e,0x3e,0x9f,0xe2,0x0, 0xce,0x9f,0x2, 0x9d,0xe0,0x1, +0x1e,0xd3,0x3f,0x9d,0xe0,0x44,0x8f,0x8f,0xe0,0x2, 0x8e,0x8e,0xe2,0x1, 0xcc,0x1a, +0xc6,0x81,0xe0,0x2, 0xae,0x8e,0xe7,0xff,0x1, 0xaa,0xe0,0x1, 0x1f,0x58,0xe7,0xff, +0x16,0x99,0xae,0x8e,0xe7,0xff,0x0, 0xa3,0xea,0x12,0x7e,0xb4,0x16,0x0, 0xae,0xe, +0x17,0x0, 0xbf,0xd, 0x0, 0xd7,0xe0,0x2, 0x8e,0x8e,0xe0,0x1, 0x1f,0xc2,0x3f,0x9d, +0x8f,0x8f,0x0, 0xe3,0xea,0x12,0x7f,0xb0,0x17,0x1, 0xaf,0xf, 0x3f,0xe8,0x0, 0xca, +0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0xff,0xe7,0xff,0x0, 0x89,0xe0,0x0, 0x1f,0xad, +0x8f,0x8f,0xe7,0xff,0x0, 0x84,0xe7,0xda,0x0, 0xc6,0xe0,0x2, 0x1f,0x93,0x9f,0x8f, +0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x86,0xe2,0x0, 0xcf,0x84,0x1, 0x5, 0x14,0x0, +0x38,0x82,0xe7,0xfe,0x0, 0x9f,0xe7,0x6f,0x0, 0xe8,0xe0,0x2, 0x1f,0x93,0x9f,0x8f, +0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x85,0xe2,0x0, 0xcf,0x84,0x1, 0x4, 0x38,0x82, +0xe7,0xfd,0x0, 0xbb,0xe7,0x6a,0x0, 0xde,0x8, 0xb4,0xe0,0x0, 0x1f,0xbd,0xa1,0xf, +0xa7,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x97,0xa7,0x2, 0x17,0xfe,0x3f,0x5f,0xea,0x12, +0x7f,0xba,0xbf,0x2, 0x8f,0xf, 0x27,0x22,0xe0,0x0, 0x1a,0x30,0xe0,0x1, 0x19,0xd8, +0x17,0x81,0x8c,0xf2,0xaf,0x84,0x8c,0x3, 0xdf,0xd9,0x17,0x0, 0xaf,0x4, 0x8f,0x83, +0xc7,0x81,0xaf,0x83,0xa7,0x82,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x2f,0x82,0xa, 0x61, +0xa7,0x2, 0x16,0xfd,0xe0,0x1, 0x1f,0xd8,0x3f,0x5d,0xbf,0x2, 0x8f,0xf, 0xc7,0x1, +0xaf,0xf, 0x8c,0xf, 0xdf,0xb3,0xac,0x72,0xa, 0x61,0x17,0x1, 0xaf,0xf, 0x87,0x72, +0xe0,0x1, 0x1f,0xd8,0xaf,0xf, 0x8c,0xf, 0xdf,0xa9,0xac,0x72,0xa, 0x61,0xe0,0x0, +0x1f,0xbd,0x16,0x7e,0xa6,0x8f,0xea,0x12,0x7f,0xba,0xa7,0x3d,0x3f,0x5c,0xbf,0x3d, +0x17,0x0, 0xaf,0xf, 0x38,0x82,0x8, 0xb4,0xe0,0x1, 0x1a,0x5a,0xe0,0x2, 0x19,0x93, +0x11,0x0, 0x15,0x3e,0xe0,0x1, 0x14,0xff,0x3c,0x64,0xa9,0x3, 0xe0,0x3, 0xdd,0x9c, +0xe0,0x0, 0x1c,0x18,0x15,0x3e,0xe0,0x1, 0x14,0xff,0xe0,0x3, 0xdd,0x95,0xe0,0x2, +0x1f,0xb1,0xba,0xf, 0xef,0xfc,0xdc,0xd7,0xea,0x12,0x7f,0xba,0xe0,0x1, 0x1f,0x58, +0xa9,0xf, 0xe0,0x0, 0x1f,0xbd,0xa9,0xe, 0xa7,0x8f,0x81,0x83,0xa9,0xff,0xa, 0x61, +0x8, 0xb2,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x85,0xe0,0x0, 0x14,0xda,0x39,0x68, +0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x9c,0xe1,0xd, 0x14,0x6, 0xe0,0x3, 0xd6,0x7a, +0xe0,0x0, 0x14,0xff,0x3c,0xd8,0xe0,0x1, 0xcc,0x80,0xe1,0xd, 0x14,0x6, 0xe0,0x3, +0xd6,0x8f,0xe2,0x0, 0xc9,0x5a,0x1, 0x6, 0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x3, +0xd6,0x87,0xe0,0x0, 0x14,0xda,0x14,0x4, 0xe0,0x3, 0xd6,0x82,0xe0,0x0, 0x14,0xda, +0x14,0x5, 0x9, 0x21,0xe0,0x6c,0x0, 0xfc,0x8, 0xb4,0xe0,0x2, 0x19,0xb8,0x15,0x4, +0x3c,0xe3,0x14,0x0, 0xef,0xfd,0xd1,0xf6,0x9d,0x13,0x17,0xf8,0x3f,0x9a,0xe2,0x1e, +0xcf,0xf7,0x12,0x0, 0x2, 0x96,0x11,0x7e,0x39,0x1a,0xe3,0xff,0xc1,0x7f,0x3c,0xe3, +0x3d,0x62,0x14,0x2, 0x99,0x83,0xef,0xfd,0xd1,0xe5,0xe0,0x2, 0x1c,0x37,0x3d,0xe4, +0x3d,0x64,0xe0,0x9, 0x31,0x41,0x34,0x41,0xe0,0x3, 0xda,0xda,0xe0,0x24,0x39,0x88, +0x3c,0x64,0xa, 0x61,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x27,0x8f,0x8, 0xb2,0xe0,0x0, +0x19,0x37,0xdf,0xd3,0xac,0x2, 0x8f,0x82,0x2f,0x87,0xdf,0xcf,0xac,0x2, 0x8f,0x82, +0x2f,0x83,0xdf,0xcb,0xac,0x2, 0x9, 0x61,0x38,0x82,0x8, 0xb4,0xe0,0x2, 0x1f,0x91, +0x39,0xe8,0xa1,0xf, 0xe0,0x0, 0x14,0x50,0xa7,0x92,0xcf,0x90,0xbf,0x92,0xe0,0x3, +0xd6,0x19,0x3a,0x68,0xe0,0x0, 0x14,0xda,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x30, +0x3c,0xe3,0xe2,0x1, 0xc4,0xff,0xe1,0x20,0x14,0x0, 0xe0,0x3, 0xd6,0x29,0xe0,0x9, +0x31,0xc8,0xe2,0x0, 0xc4,0x83,0xe1,0x20,0x14,0x1, 0xe0,0x3, 0xd6,0x21,0x14,0x8a, +0xe1,0x23,0x14,0x4, 0xe0,0x3, 0xd6,0x1c,0xe2,0x0, 0xca,0x5a,0x1, 0x6, 0x14,0x80, +0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x14,0xa7,0x92,0x17,0x6f,0x3f,0xde,0xbf,0x92, +0xa, 0x61,0x8, 0xb4,0xe0,0x2, 0x1f,0x91,0xe0,0x0, 0x14,0x50,0xa1,0x8f,0xa7,0x93, +0xcf,0x90,0xbf,0x93,0xe0,0x3, 0xd5,0xe6,0xe0,0x0, 0x14,0xda,0x3a,0x68,0xe0,0x0, +0x14,0x50,0xe0,0x3, 0xd5,0xfd,0xe1,0x20,0x14,0x1, 0xe0,0x3, 0xd5,0xdb,0x39,0x68, +0xe1,0x20,0x14,0x0, 0xe0,0x3, 0xd5,0xd6,0x31,0x28,0xe2,0x6, 0xc1,0x0, 0xe2,0x0, +0xca,0x5a,0x39,0x48,0xe3,0xff,0xc1,0x7f,0x1, 0x6, 0x14,0x80,0xe0,0x0, 0x14,0x50, +0xe0,0x3, 0xd5,0xe6,0xa7,0x93,0x17,0x6f,0x3f,0xde,0x3c,0x62,0xbf,0x93,0xa, 0x61, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8a,0xe0,0x2, +0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0x5, 0x82, +0x38,0x82,0xe0,0x2, 0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xfa,0x8, 0xb2, +0xe0,0x3, 0x19,0x37,0x9f,0x82,0xe2,0x0, 0xcf,0x82,0x2, 0x82,0x9, 0x61,0xe0,0x0, +0x1f,0xaa,0x9c,0xf, 0xe0,0x3, 0xdc,0xd3,0xe0,0x3, 0xdc,0xd5,0xe0,0x0, 0x14,0xd3, +0xe0,0x3, 0xdc,0x25,0xeb,0xe6,0x7f,0x4, 0xe3,0xff,0xc4,0x7f,0xe0,0x1, 0x17,0xbc, +0x3f,0x98,0x9e,0x8e,0xe3,0xff,0xc7,0xff,0xea,0x12,0x7e,0x3c,0x3f,0xfd,0xb7,0x8c, +0x3, 0x98,0xc6,0xf9,0x3f,0xfd,0x4, 0xf, 0xe0,0x1, 0x17,0xb4,0x3f,0x98,0xe3,0xff, +0xc7,0xff,0xe2,0x1, 0xcf,0xbb,0x2, 0x86,0xe0,0x2, 0x17,0x87,0x3f,0x98,0xe3,0xff, +0xc7,0xff,0xb7,0x8c,0x3c,0x6f,0xb7,0x8e,0xdf,0x51,0x17,0x80,0xb7,0x82,0x9, 0x61, +0xc6,0x87,0x3f,0xfd,0x2, 0x78,0xe0,0x1, 0x17,0xc4,0x3f,0x98,0xe3,0xff,0xc7,0xff, +0xe2,0x2, 0xcf,0x8e,0x5, 0xef,0xe0,0x0, 0x17,0xf1,0x3f,0x98,0xe3,0xff,0xc7,0xff, +0xb7,0x8c,0x0, 0xe9,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81, +0x27,0x8a,0xe0,0x2, 0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x81,0x5, 0x82,0x38,0x82,0xe0,0x2, 0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0xfa,0x8, 0xb5,0x39,0x68,0xe0,0x1, 0x14,0x4e,0xdf,0x20,0xe0,0x3, 0x1a,0x37, +0x17,0x80,0xb7,0x84,0x11,0x83,0x12,0x90,0x21,0xc, 0x9f,0x84,0x3c,0x65,0xe2,0x0, +0xcf,0x82,0x2, 0x87,0xc1,0xff,0xe2,0x1, 0xc1,0xff,0xef,0xfd,0xd6,0x5f,0x29,0xf6, +0xa, 0xe1,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8b, +0xe0,0x2, 0x1f,0xba,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x1, 0x6, 0x27,0x8c,0xe2,0x0, +0xcf,0x81,0x1, 0xe, 0x38,0x82,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x7, 0x2f,0xf9,0xe0,0x1, 0x14,0xc8,0x14,0x0, 0xe0,0x69,0x0, 0xb6,0xe0,0x1, +0x14,0xc8,0x14,0x1, 0xe0,0x69,0x0, 0xb1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe0,0x1, +0x1f,0xdc,0xe0,0x2, 0x1f,0x23,0x16,0x0, 0xa7,0x8f,0xae,0xe, 0xe0,0x1, 0xa7,0xff, +0x37,0xc2,0xe2,0x0, 0xc7,0x81,0x27,0x95,0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1e,0xb1, +0xa7,0x8f,0xa6,0xd, 0xa6,0x9f,0xce,0x90,0xbe,0x9f,0xe0,0x0, 0x16,0xd4,0xb6,0xdc, +0x8e,0xfc,0x16,0x6f,0xe2,0x0, 0xc6,0x83,0xae,0x8e,0xa6,0x9f,0x3e,0xdc,0xbe,0x9f, +0xe0,0x2, 0x1b,0xe6,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x5d,0x8f,0xe, +0xe0,0x1, 0x27,0x1b,0xe0,0x0, 0x1f,0x37,0x8a,0xe, 0xe0,0x0, 0x22,0x72,0xe0,0x2, +0x1f,0x91,0x12,0x3, 0xa2,0x8f,0xe0,0x3, 0x1f,0xb1,0xe0,0x2, 0x19,0xb8,0xa1,0xf, +0xf0,0x0, 0x17,0x54,0xf0,0x40,0x3e,0xe4,0xf0,0x0, 0x14,0x50,0xf0,0x0, 0x16,0x5a, +0x13,0x5, 0xf7,0x24,0x15,0x82,0xf7,0x24,0x15,0x3, 0xf7,0x24,0x14,0x84,0xa7,0x95, +0xcf,0x90,0xbf,0x95,0x17,0xf8,0x9c,0x3, 0x3f,0x98,0xe2,0x1e,0xcf,0xf8,0xe0,0x1, +0x2, 0x96,0xf0,0x0, 0xb7,0x52,0xc4,0x7e,0xf0,0x0, 0xae,0xb2,0xe3,0xff,0xc4,0x7f, +0xf0,0x0, 0xb4,0x52,0xe2,0x0, 0xcc,0x8, 0xf0,0x0, 0xae,0x32,0xe0,0x0, 0x5, 0xeb, +0x16,0x80,0xf7,0xff,0x13,0xfd,0x3f,0x6d,0x17,0x88,0x3e,0x6d,0xf0,0x17,0x3b,0x98, +0x26,0x21,0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0xf0,0x40,0x3b,0x6c,0xe0,0xb, 0x39,0x9f, +0x8c,0x8b,0x15,0x83,0x15,0x1, 0x3d,0x9d,0xb7,0x52,0x3d,0x1e,0xe8,0x40,0x3d,0xf6, +0xc7,0x81,0x3f,0x6a,0xac,0xb2,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc7,0xff,0xe0,0x0, +0x3, 0x47,0xf0,0x2e,0x3b,0x9f,0xe0,0x0, 0x27,0x46,0xe1,0x2e,0x3c,0x1f,0xe0,0x0, +0x27,0x42,0xe0,0xc, 0x39,0x9f,0x8d,0xc, 0x8d,0xac,0x8f,0x1c,0x8e,0xbc,0x35,0x28, +0xe0,0xc, 0x35,0xa8,0x3e,0x9c,0x3f,0x1a,0xc7,0x84,0xe3,0xff,0xc7,0x7f,0xe3,0xff, +0xc6,0xff,0xe3,0xff,0xc7,0xff,0xf0,0x40,0x3b,0x66,0x16,0x5, 0x0, 0xd0,0xe0,0x2, +0x1f,0x11,0xa2,0x8e,0xe0,0x3, 0x1f,0x31,0xa1,0xe, 0xe0,0x0, 0x2f,0xcc,0xa7,0x15, +0xe0,0x0, 0x16,0xd0,0xcf,0x10,0xbf,0x15,0xe0,0x0, 0x16,0x5a,0xb6,0xd2,0xe7,0x24, +0x17,0x10,0xae,0x32,0xb7,0x52,0xaf,0xb2,0xb6,0xd2,0x17,0x6f,0xaf,0xb2,0xa7,0x95, +0x3f,0xde,0xbf,0x95,0x22,0x9, 0xdf,0x1e,0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e, +0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x3c,0x7f,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0xb5,0xd2,0xe7,0x24,0x16,0x5, 0x8f,0xf2,0xf0,0x0, 0xb5,0x52, +0xe4,0xd, 0x37,0xa8,0x8f,0xf2,0xf0,0x0, 0xb4,0xd2,0xe4,0xf, 0x37,0xa0,0x8f,0x72, +0xb6,0x52,0x3f,0x9d,0x8e,0xf2,0x37,0x28,0x3f,0x9d,0xa6,0x93,0x3f,0x9e,0xf0,0x0, +0xb4,0x52,0x17,0x0, 0x3f,0xfd,0xaf,0x32,0x1, 0x22,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xc2,0x7f,0xbf,0x95,0xe2,0x1, 0xc2,0x7f,0xe7,0xfe,0x2a,0x5b,0x8f,0x87,0xe7,0xff, +0x27,0xb8,0xa7,0x95,0xe0,0x0, 0x17,0x50,0xcf,0x90,0xbf,0x95,0xe0,0x0, 0x16,0x5a, +0xb7,0x52,0xe7,0x24,0x16,0x90,0xae,0x32,0x17,0x80,0xb6,0xd2,0xaf,0xb2,0xb7,0x52, +0xe7,0xff,0x0, 0xb5,0x86,0xe, 0xae,0xe, 0xe7,0xfe,0x0, 0xa3,0xe0,0x0, 0x17,0xf0, +0xb7,0xd2,0x16,0x2a,0xae,0x32,0x3c,0x66,0xef,0xfd,0xd5,0x28,0xe0,0x0, 0x16,0xf6, +0xb6,0xd2,0xe0,0x0, 0x17,0x75,0x8f,0xf2,0xb7,0x52,0x37,0xa8,0x8e,0xf2,0x9f,0x13, +0x3f,0x9d,0xe3,0xff,0xc7,0xff,0x3f,0x7f,0x1, 0xc9,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xbf,0x95,0x12,0x1, 0x8f,0x87,0x0, 0xcc,0x8, 0xb3,0x39,0x68,0xe0,0x0, 0x14,0x50, +0xe0,0x3, 0xd3,0xe0,0x39,0xe8,0xe0,0x0, 0x14,0xda,0xe0,0x0, 0x14,0x50,0xe0,0x3, +0xd3,0xf7,0x3c,0x62,0xe0,0x3, 0xd3,0x61,0xe2,0x0, 0xc9,0xda,0x39,0x68,0x1, 0x6, +0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd3,0xeb,0x3c,0x62,0x9, 0xe1,0x8, 0xb1, +0xc0,0x7c,0x15,0x2, 0x14,0x86,0x3c,0x90,0x3c,0x6a,0xef,0xfc,0xdf,0x63,0x5c,0x3, +0x15,0x2, 0xe2,0x0, 0x7c,0x84,0xef,0xfc,0xdf,0x5d,0x4f,0x4, 0x4f,0x85,0xe0,0xd, +0x3f,0x1f,0xe2,0x1, 0xce,0xff,0x1, 0x8, 0xe0,0x2, 0x1f,0xc0,0x17,0x7f,0xe0,0xc, +0xaf,0x4f,0xc0,0x4, 0x8, 0xe1,0xe0,0x2, 0x1f,0xc0,0xe0,0xc, 0xaf,0x4f,0xc0,0x4, +0x8, 0xe1,0xe0,0x0, 0x1f,0xad,0x8f,0x8f,0xe2,0x0, 0xcf,0xda,0x1, 0x2, 0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0xf8, +0xe7,0xfa,0x0, 0x90,0xe0,0x1, 0x1f,0xc2,0xe0,0xa, 0x8f,0xdf,0x27,0xb1,0xe0,0x1, +0x1f,0xc4,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, 0x1, 0x6b, +0x8f,0xef,0x37,0xa6,0xc7,0xff,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcc,0x3f,0x2, 0xa1, +0xe0,0x0, 0x1f,0xf2,0xe0,0x0, 0x1f,0x71,0x8f,0x8f,0x8f,0xe, 0xe0,0xd, 0x37,0xa8, +0x17,0xbf,0xe0,0x8, 0x3f,0xa8,0xe0,0xf, 0x3f,0x4d,0x3c,0x3f,0xe0,0x0, 0x1f,0xf0, +0x34,0x48,0x8f,0x8f,0x3c,0x7f,0x3f,0x6f,0xe0,0x6e,0x3d,0xa8,0x3f,0xae,0xe2,0x5, +0xcf,0xcf,0xe0,0x5, 0x14,0x4f,0xe0,0x68,0x3d,0xaf,0xe3,0xff,0xc4,0x7f,0x38,0x82, +0xe0,0x1, 0x1f,0x31,0xe0,0x1, 0x1e,0xb0,0x8f,0xe, 0xc7,0xc1,0x8e,0x8d,0x3c,0x7f, +0x37,0x28,0xe0,0xc, 0x3e,0xce,0x3, 0x3d,0xe0,0x0, 0x1f,0xef,0x8d,0x8f,0xe0,0x0, +0x1f,0xee,0x35,0xa8,0x8f,0xf, 0xe0,0x0, 0x1f,0xed,0x37,0x28,0x8e,0x8f,0xe0,0x0, +0x1f,0xec,0x3e,0xcb,0x8f,0x8f,0x3c,0x7d,0x3f,0xce,0xe0,0x0, 0x3, 0x45,0xe0,0x0, +0x1f,0x6b,0xc6,0xff,0x8d,0x8e,0xe0,0x0, 0x1f,0x6a,0x35,0xa8,0x8f,0xe, 0xe0,0x8, +0x3e,0xa8,0xe0,0xd, 0x3f,0x4b,0x3c,0x3d,0xc7,0xff,0x34,0x48,0x3f,0xa8,0xe0,0x0, +0x1f,0x70,0x8c,0xe, 0x3f,0xf8,0x4, 0xca,0xe0,0x0, 0x1f,0x69,0x8f,0xe, 0xe0,0xe, +0x3e,0x2e,0x3e,0xee,0xe3,0xff,0xc6,0xff,0x3f,0xfd,0xe0,0x6f,0x3a,0xae,0xe7,0xff, +0x0, 0xb8,0x8f,0xff,0x37,0xa6,0xc7,0xff,0xe3,0xff,0xc7,0xff,0xe7,0xff,0x0, 0x97, +0xe0,0x0, 0x1f,0x68,0xe0,0xf, 0x3c,0x2f,0x8e,0x8e,0xe0,0x0, 0x1f,0x67,0x36,0xa8, +0x8f,0xe, 0xe0,0x8, 0x3f,0x4d,0xe0,0x0, 0x1f,0x69,0x3f,0xb8,0x8f,0xe, 0x37,0xc8, +0x3f,0xfe,0x16,0xff,0x3e,0x9e,0xe0,0x6f,0x3b,0xad,0xe0,0xe, 0x3e,0x2e,0x3f,0x9e, +0xe7,0xff,0x0, 0x97,0xe0,0x0, 0x1f,0x66,0x3c,0x2d,0x8d,0x8e,0xe0,0x0, 0x1f,0x65, +0x35,0xa8,0x8f,0xe, 0xe0,0xd, 0x3f,0x4b,0x3c,0x3d,0xe0,0xd, 0x34,0x48,0x3f,0x9d, +0xe7,0xff,0x0, 0xbf,0xe0,0x1, 0x1f,0xc2,0x3e,0xe8,0xe0,0xa, 0x8f,0xdf,0x27,0xaa, +0xe0,0x1, 0x1f,0xc4,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, +0x1, 0x58,0x8f,0x7f,0x37,0x26,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe2,0x0, 0xce,0xbf, +0x2, 0x9a,0xe0,0x0, 0x1f,0xe4,0xe0,0x0, 0x1f,0x63,0x8f,0x8f,0x8c,0xe, 0x37,0xa8, +0x17,0x3f,0x3f,0x2d,0xe0,0xd, 0x3c,0x4f,0xe0,0x0, 0x1f,0xe2,0x3f,0x3d,0x8c,0xf, +0x37,0x8, 0x3f,0x78,0x3f,0xe8,0xe0,0x6f,0x3d,0x2e,0x3c,0x2f,0xe3,0xff,0xc4,0x7f, +0x38,0x82,0x38,0x82,0xe0,0x1, 0x1e,0x2e,0xe0,0x1, 0x1f,0xaf,0x8c,0xc, 0x16,0x41, +0x8f,0x8f,0x3e,0x1e,0x3e,0xfc,0x37,0xa8,0xe0,0xb, 0x3c,0x4f,0x3, 0x30,0xe0,0x0, +0x1f,0xe1,0x8e,0xf, 0xe0,0x0, 0x1f,0xe0,0x36,0x28,0x8c,0xf, 0xe0,0x0, 0x1f,0xdf, +0x34,0x28,0x8f,0xf, 0xe0,0x0, 0x1f,0xde,0x3f,0x4c,0x8f,0x8f,0x3e,0xfe,0x3f,0xc8, +0xe0,0x0, 0x3, 0x4a,0xe0,0x0, 0x1e,0x5d,0xe0,0x0, 0x1d,0x5c,0x8e,0xc, 0x8c,0xa, +0x36,0x28,0x3c,0x4c,0x3f,0x2d,0x3f,0x38,0x14,0x7f,0x3c,0x1f,0x37,0x8, 0x3c,0x2e, +0xe0,0x0, 0x1f,0xe2,0x8f,0x8f,0x3c,0x7f,0x3, 0x2b,0x3c,0x6f,0x38,0x82,0x8f,0x6f, +0x37,0x26,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe7,0xff,0x0, 0xaa,0x17,0xe2,0x3f,0x9e, +0x3e,0xff,0x14,0x0, 0xe7,0xff,0x3, 0x3f,0xe0,0x0, 0x1f,0xdb,0xe0,0x0, 0x1e,0x5a, +0x8f,0x8f,0x8c,0xc, 0xc7,0x40,0x37,0xa8,0xe0,0xe, 0x3e,0xae,0x3c,0x4f,0xe0,0x0, +0x1f,0xd9,0x3f,0x38,0x8f,0x8f,0x37,0x8, 0x3f,0x7f,0x16,0xff,0x3e,0x9f,0xe0,0x6e, +0x3b,0x2d,0xe0,0x8, 0x3d,0xaf,0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x38,0x82,0xe0,0x0, +0x1f,0xd9,0x8f,0x8f,0xe0,0xf, 0x3d,0xaf,0x3f,0xf8,0xe0,0x68,0x3d,0x2f,0xe3,0xff, +0xc4,0x7f,0x38,0x82,0xe0,0x0, 0x1e,0x58,0xe0,0x0, 0x1d,0x57,0x8e,0xc, 0x8c,0xa, +0x36,0x28,0x3c,0x4c,0xe0,0xe, 0x3e,0xae,0x3f,0x38,0xe0,0x8, 0x37,0x8, 0x3c,0x1f, +0xe7,0xff,0x0, 0xb8,0x8, 0xb5,0xe0,0x2, 0x1a,0xdf,0xe0,0x2, 0x1a,0x5e,0x8f,0x85, +0xe0,0x0, 0x2f,0xc5,0xe0,0x2, 0x1f,0x5d,0xe0,0x2, 0x1e,0xd5,0x8f,0xe, 0xaf,0x8d, +0xe0,0x0, 0x2f,0x4b,0xe0,0x1, 0x1f,0x8e,0x15,0xa, 0x89,0x8f,0xe0,0x2, 0x1c,0xde, +0x3d,0x33,0xe0,0x2, 0x1c,0x58,0xe0,0x3, 0xd8,0xed,0xe0,0x1, 0x1f,0xc2,0xe0,0xa, +0x8f,0xdf,0x27,0xab,0x21,0x96,0xc1,0xff,0xe2,0x1, 0xc1,0xff,0xc1,0x81,0xe4,0x0, +0xc1,0x8a,0xe0,0x2, 0x19,0x5e,0x39,0x94,0x9c,0x2, 0xc1,0xa, 0xde,0x84,0xe0,0x5, +0xb4,0x52,0xe0,0x40,0x9c,0x42,0xdf,0x27,0x39,0xf2,0xe0,0x5, 0xb4,0x62,0x1, 0xf5, +0xe0,0x19,0x9f,0x84,0xe2,0x2, 0xcf,0x81,0x1, 0x28,0xe2,0x2, 0xcf,0x80,0xe0,0x0, +0x1, 0x4c,0x8f,0x85,0x2f,0x8a,0xe0,0x0, 0x1f,0x34,0xb7,0x8e,0xe0,0x2, 0x1f,0x1b, +0xb7,0x8e,0xe0,0x1, 0x1f,0x59,0xaf,0x8e,0xa, 0xe1,0xe0,0x2, 0x1f,0x5d,0xe0,0x2, +0x1e,0xd5,0x17,0x81,0x8f,0xe, 0xaf,0x8d,0xe7,0xff,0x2f,0x3e,0xe0,0x2, 0x1f,0x5b, +0xaf,0x8e,0xe7,0xff,0x0, 0xb9,0xe0,0x2, 0x1f,0x54,0x16,0x81,0xae,0x8e,0xe0,0x2, +0x1f,0x53,0xaf,0x8e,0xe7,0xff,0x0, 0xb0,0xe0,0x0, 0x1f,0xb4,0xe0,0x2, 0x1f,0x1b, +0xe0,0x6, 0x9e,0x24,0x9f,0xe, 0xe0,0x6, 0x9e,0xb4,0x9f,0x8f,0xe0,0xe, 0x3e,0xae, +0xe0,0xf, 0x3e,0x2f,0xe4,0xa, 0x37,0x8f,0xe4,0xb, 0x37,0xf, 0xe2,0xf, 0x3d,0x4f, +0xe2,0xe, 0x3d,0xce,0x3f,0x2b,0x3f,0xaa,0x3f,0x9e,0xe0,0x0, 0x1f,0x26,0xe2,0x1, +0xcf,0x96,0xb6,0xe, 0xe0,0x0, 0x1f,0x20,0xb6,0x8e,0x5, 0x47,0xe0,0x1, 0x1f,0xd9, +0x17,0x1, 0xaf,0xf, 0xa, 0xe1,0xe0,0x6, 0x9f,0x24,0xe0,0x0, 0x1e,0xa6,0xe0,0x6, +0x9f,0xb4,0xb7,0xd, 0xe0,0x0, 0x1e,0xa0,0xb7,0x8d,0xe0,0x0, 0x1e,0xb4,0xb7,0xd, +0xe0,0x2, 0x1f,0x1b,0xb7,0x8e,0xa, 0xe1,0xe0,0x3, 0x1f,0x80,0x17,0x0, 0xb7,0x1f, +0xaf,0xf, 0xaf,0x1f,0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f, +0xe0,0x3, 0x2f,0xba,0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xf0,0x3, 0x18,0x0, 0xe8,0x0, +0x9f,0x90,0x2f,0x93,0xea,0x12,0x7f,0x47,0xe0,0x0, 0x19,0xe, 0xaf,0x8e,0x8f,0x82, +0xe0,0x0, 0x19,0x8d,0x2f,0x93,0xea,0x12,0x7f,0xc6,0x8f,0xf, 0x27,0x3, 0xc7,0x7f, +0xaf,0xf, 0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe0,0x0, 0x19,0xe, 0xc7,0xff,0xe8,0x0, +0xb7,0x90,0x8f,0x82,0xe0,0x0, 0x19,0x8d,0x27,0xef,0xe0,0x0, 0x1f,0x56,0xe0,0x0, +0x1e,0xd5,0x8f,0xe, 0xf0,0x0, 0x88,0x8d,0x37,0x28,0xf0,0x11,0x38,0xce,0xe0,0x1a, +0x97,0x73,0xf8,0x43,0x38,0x91,0xe0,0x2, 0x1e,0xfd,0xf0,0x40,0x38,0xfe,0x8c,0x4d, +0x8e,0x5d,0x5, 0xa, 0xe0,0x1, 0x1e,0xd7,0x37,0x1, 0xe0,0x3, 0x8e,0xbd,0xe2,0x0, +0xce,0x82,0xe0,0x71,0x39,0xae,0xf7,0xff,0x11,0x7f,0xf0,0x12,0x39,0x1f,0xe0,0x1, +0x1f,0xf2,0xf2,0x1, 0xc1,0x7f,0xa4,0x8f,0xe0,0x0, 0x1f,0xd4,0xf0,0x0, 0xc1,0x1, +0xf0,0x12,0x31,0x21,0x10,0xff,0x12,0x7f,0x8a,0x8f,0xf0,0x0, 0x1b,0xd, 0xf0,0x12, +0x39,0x13,0x38,0x98,0xe0,0x4, 0x3a,0x1c,0xf8,0x0, 0x8a,0x6, 0xf8,0x0, 0x89,0x96, +0xf0,0xf, 0x3a,0x3c,0xe8,0xf, 0x3f,0x93,0x37,0xa1,0x3f,0x99,0x95,0x8f,0xe8,0x40, +0x3d,0xf1,0xe0,0x2, 0x4, 0x1a,0xf1,0x2f,0x3a,0x28,0xe0,0x2, 0x2f,0x96,0xf1,0x2d, +0x39,0xac,0xe0,0x2, 0x2e,0x92,0xe8,0x43,0x3b,0x3, 0xf0,0x0, 0x12,0x81,0xe2,0x0, +0xcb,0x0, 0xe0,0xa, 0x35,0x82,0xe0,0xf, 0x35,0x81,0xf8,0x15,0x3a,0x94,0xf8,0x43, +0x3b,0x84,0x3d,0x1f,0xf2,0x1, 0xc2,0xff,0xf0,0x40,0x3c,0xe6,0xf8,0x40,0x3d,0x67, +0xe0,0x0, 0x4, 0x75,0xf2,0x0, 0xcb,0x80,0x4, 0x37,0xe8,0x40,0x3f,0x67,0x13,0x80, +0x0, 0x92,0x27,0xa7,0xe8,0x40,0x3e,0xe8,0xe8,0x40,0x3b,0xec,0xe3,0xff,0xc6,0xff, +0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3d,0x6e,0xc7,0x7f,0xe0,0x43,0x3f,0xe, 0xe3,0xff, +0xcf,0x7f,0x1, 0x1a,0xe0,0xf, 0x3f,0x3c,0xf0,0x0, 0x14,0x1, 0xe8,0xf, 0x3f,0x99, +0x37,0xa1,0x3f,0x99,0xe0,0x0, 0x97,0x8f,0xf0,0x0, 0x16,0x1, 0xe0,0x3b,0x3f,0xaa, +0xf0,0x18,0x3c,0x1d,0xf0,0x1c,0x3e,0x17,0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2d,0xdb, +0xe8,0x40,0x3f,0x7a,0x2, 0x62,0x23,0x88,0xf1,0xff,0xc4,0xff,0xf8,0x43,0x3c,0x89, +0xf3,0xff,0xcc,0xff,0x1, 0xc8,0xf0,0x40,0x3a,0x71,0x3, 0x38,0xf8,0x40,0x3c,0xe5, +0xe8,0x40,0x3c,0x75,0x5, 0xb3,0xe8,0x40,0x3f,0x65,0x13,0x80,0x0, 0x91,0x27,0xa4, +0xe8,0x40,0x3e,0xe8,0xe8,0x40,0x3b,0xeb,0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff, +0xf0,0x40,0x3c,0xee,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0x7e,0x5, 0x98,0xe0,0xf, +0x3f,0x3c,0xf0,0x0, 0x14,0x1, 0x3f,0x96,0x37,0xa1,0x3f,0x99,0x97,0x8f,0xf0,0x0, +0x15,0x81,0xe0,0x3a,0x3f,0xaa,0xf0,0x18,0x3c,0x1d,0xf0,0x1b,0x3d,0x97,0xe0,0x2f, +0x3d,0xaf,0xf7,0xff,0x2d,0x5e,0xe8,0x40,0x3f,0x79,0x4, 0xe5,0x23,0x87,0xc3,0x7f, +0xe0,0x43,0x3b,0x6, 0xe3,0xff,0xcb,0x7f,0x1, 0xcc,0xf0,0x40,0x39,0xf4,0xe0,0x1, +0x3, 0x1, 0x13,0x1, 0xe8,0x6, 0x3b,0x13,0xe2,0x1, 0xc3,0x7f,0xe0,0x40,0x3e,0x76, +0xf0,0x40,0x3c,0xe6,0xf8,0x40,0x3d,0x67,0xe0,0x0, 0x5, 0xf4,0xf2,0x0, 0xcb,0x80, +0x4, 0x37,0xe8,0x40,0x3f,0x67,0x13,0x80,0x0, 0x92,0x27,0xa7,0xe8,0x40,0x3e,0xe8, +0xe8,0x40,0x3b,0xec,0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3d,0x6e, +0xc7,0x7f,0xe0,0x43,0x3f,0xe, 0xe3,0xff,0xcf,0x7f,0x1, 0x1a,0xe0,0xf, 0x3f,0x3c, +0xf0,0x0, 0x14,0x1, 0xe8,0xf, 0x3f,0x99,0x37,0xa1,0x3f,0x99,0xe0,0x0, 0x97,0x8f, +0xf0,0x0, 0x16,0x1, 0xe0,0x3b,0x3f,0xaa,0xf0,0x18,0x3c,0x1d,0xf0,0x1c,0x3e,0x17, +0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2d,0xdb,0xe8,0x40,0x3f,0x7a,0x2, 0x62,0x23,0x88, +0xf0,0x0, 0xc4,0x81,0xf2,0x1, 0xc4,0xff,0xe8,0x40,0x3e,0x79,0x2, 0xc8,0xf0,0x40, +0x3a,0x71,0x3, 0x37,0xf8,0x40,0x3c,0x65,0xe8,0x40,0x3c,0x75,0x5, 0xb2,0xe8,0x40, +0x3f,0x65,0x13,0x80,0x0, 0x91,0x27,0xa4,0xe8,0x40,0x3e,0xe7,0xe8,0x40,0x3b,0xea, +0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3c,0x6e,0xc7,0x1, 0xe2,0x1, +0xc7,0x7f,0x3c,0x7e,0x5, 0x98,0xe0,0xf, 0x3f,0x3c,0xf0,0x0, 0x13,0x81,0x3f,0x96, +0x37,0xa1,0x3f,0x99,0x97,0x8f,0xf0,0x0, 0x15,0x1, 0xe0,0x39,0x3f,0xaa,0xf0,0x17, +0x3b,0x9d,0xf0,0x1a,0x3d,0x17,0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2c,0xde,0xe8,0x40, +0x3f,0x78,0x4, 0xe5,0x23,0x86,0xc3,0x1, 0xe2,0x1, 0xc3,0x7f,0x3e,0x76,0x2, 0xcd, +0x3a,0xfd,0xe0,0x0, 0x5, 0xd3,0xf0,0x0, 0xc3,0x2, 0xf8,0x40,0x39,0x76,0xe7,0xfd, +0x1, 0xd5,0xe8,0x0, 0x9f,0x90,0x27,0x88,0xc7,0xff,0xe8,0x0, 0xb7,0x90,0xea,0x12, +0x7f,0xc7,0x17,0x1, 0xaf,0xf, 0xe0,0xf, 0x3e,0x38,0xe0,0x1a,0x9f,0x53,0xe0,0x1a, +0x9e,0xe3,0xe0,0xc, 0x37,0x81,0xe0,0xb, 0x3f,0x1d,0x3d,0xfc,0x2, 0x1d,0x37,0x82, +0xe0,0x2d,0x3e,0x9f,0x2e,0x99,0xe0,0x2f,0x3f,0x1f,0x2f,0x96,0xea,0x12,0x7f,0xc7, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x10,0xea,0x12,0x7e,0xc5,0x8f,0x8d,0xe2,0x0, +0xcf,0x81,0xe7,0xfc,0x1, 0xe8,0xea,0x12,0x7f,0xc6,0x8f,0xf, 0x2f,0xc, 0xaf,0xd, +0xe7,0xfc,0x0, 0xe1,0x38,0x82,0xea,0x12,0x7f,0x45,0xea,0x12,0x7f,0xc6,0x16,0x81, +0xae,0x8e,0x17,0x14,0xc7,0x7f,0x8e,0x82,0xaf,0xf, 0xe7,0xfc,0x26,0xd4,0x11,0x80, +0x3a,0x63,0x3c,0x63,0x3c,0xe4,0xd0,0x99,0xc1,0x81,0x8f,0x82,0xe2,0x1, 0xc1,0xff, +0x3f,0xf3,0x2, 0xf8,0xe7,0xfc,0x0, 0xc7,0xe0,0x0, 0x1f,0xd3,0x8f,0xf, 0xe0,0x0, +0x1f,0xd2,0x37,0x28,0x8f,0x8f,0xf8,0x0, 0xaa,0x0, 0x3f,0xce,0xf8,0x0, 0xa9,0x90, +0xe8,0x0, 0xb7,0x90,0xe7,0xff,0x0, 0xad,0xe0,0x0, 0x1e,0x4e,0x8f,0x8c,0x2f,0x97, +0xea,0x12,0x7f,0xc8,0x9e,0x8f,0xe0,0x1, 0x1f,0x57,0x2e,0x8a,0xe0,0x1, 0x1e,0x89, +0x8e,0xd, 0xe0,0x1, 0x1e,0x88,0x36,0x28,0x8e,0x8d,0x3e,0xcc,0xb6,0x8f,0xe0,0x2, +0x1e,0xdf,0x8e,0x8d,0x26,0xa0,0x97,0x8f,0xb7,0x9e,0x38,0x82,0xe0,0x2, 0x1f,0xc0, +0xe0,0x1, 0x1f,0x57,0x8e,0x8f,0x8c,0x1f,0x8c,0xaf,0x8d,0x3f,0x8d,0xdf,0xea,0x12, +0x7f,0xc8,0x36,0xa5,0x34,0x25,0x34,0xa5,0x35,0x25,0x35,0xa5,0xf0,0x0, 0x13,0x80, +0xf0,0x0, 0xab,0x8c,0xb6,0x9e,0xb4,0x2e,0xb4,0xce,0xb5,0x5e,0xe0,0x1, 0xb5,0x9e, +0xb6,0x8f,0x0, 0xd4,0xe0,0x0, 0x1f,0xfa,0x8e,0x8f,0xe0,0x0, 0x1f,0xf9,0x36,0xa8, +0x8f,0x8f,0x3f,0xcd,0xb7,0x9e,0x38,0x82,0x17,0xdd,0x3f,0x98,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x8c,0x2, 0x9b,0x17,0x1, 0xe0,0xf, 0x37,0x3f,0xe2,0x30,0xc7,0xa9, +0x2f,0x9d,0xe2,0x0, 0xcc,0x25,0x1, 0x92,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f,0x3f,0xfe, +0x1, 0x16,0xe0,0x2, 0x1f,0x40,0x17,0x81,0xe0,0x4, 0xac,0xde,0xe0,0x0, 0x1f,0x4e, +0xaf,0x8e,0xe0,0x2, 0x1f,0x60,0xaf,0x8e,0x38,0x82,0xe0,0x2, 0x1f,0xc0,0x17,0x1, +0x3c,0x1f,0xe0,0x0, 0x1f,0xce,0xac,0x88,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xe6, +0x8f,0x8f,0x2f,0xe8,0x0, 0xfb,0xe0,0x0, 0x1f,0xd, 0xe0,0xf, 0x34,0x43,0x3f,0x1f, +0xe0,0x0, 0x1f,0xc7,0xe2,0x0, 0xc4,0x7, 0x3f,0x98,0x87,0x8f,0xe0,0xf, 0x84,0xe, +0x3c,0x5f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x17,0x7, 0xe0,0x0, 0x1f,0xc7,0x3f,0x58, +0x3f,0x9e,0xe0,0x0, 0x1f,0xd, 0x34,0x43,0x3c,0x1e,0x8f,0x8f,0xe0,0xf, 0x87,0x8, +0x2c,0x86,0xe3,0xf, 0x3f,0x5f,0xe0,0xf, 0xaf,0x88,0x38,0x82,0x3f,0xce,0xe0,0xf, +0xaf,0x88,0x38,0x82,0xe0,0x0, 0x1f,0x8d,0xe0,0x2, 0x1f,0x7d,0x34,0x21,0x3c,0x1f, +0x8f,0x88,0x8e,0xde,0x8f,0x18,0x3f,0xbd,0x3f,0x9e,0xe0,0x1, 0x1f,0x72,0x37,0xa1, +0xa7,0xe, 0x3f,0x9e,0x94,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xfd,0xe0,0x1, 0x1f,0x57, +0x8e,0xef,0x9f,0x9e,0x3e,0xf8,0x2, 0x82,0x9f,0xce,0xe0,0x2, 0x1f,0x3c,0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0x1, 0x3, 0x3c,0x6f,0x38,0x82,0x2c,0x5, 0xe0,0x1, 0x17,0x87, +0x3c,0x6f,0x38,0x82,0xe0,0x1, 0x1e,0xc2,0xe0,0xe, 0x8f,0x1d,0xc7,0x7f,0xe0,0x28, +0x3f,0x8, 0x2c,0x75,0xe0,0x28,0x3c,0x88,0x2c,0x72,0xe0,0xe, 0x8f,0x2d,0xc7,0x7f, +0x3c,0xfe,0xe0,0x1, 0x17,0x7, 0xe0,0x6e,0x39,0xaf,0x3f,0xee,0x0, 0xe5,0x0, 0x0, +0xf0,0x0, 0x1a,0x8e,0xe8,0x0, 0x8e,0x5, 0x26,0x3d,0x16,0x0, 0xe0,0x0, 0x1d,0x8d, +0xf0,0x0, 0x1b,0x47,0xe0,0x40,0x3f,0xec,0xe0,0xd, 0x37,0xc3,0x15,0x7, 0x3d,0x5f, +0xe2,0x0, 0xc6,0x9f,0x3e,0x9b,0xe8,0xa, 0x3d,0x16,0x85,0xa, 0xe0,0xf, 0x86,0x8d, +0xe0,0xe, 0x37,0xa1,0x3e,0xda,0xe0,0x17,0x3d,0x9e,0x14,0x7, 0xe0,0xe, 0x36,0x43, +0xe0,0x9, 0x36,0x21,0x3c,0x5c,0xe2,0x0, 0xc7,0x1f,0xc7,0x81,0x15,0x1, 0xe2,0x1, +0xc6,0xff,0x3c,0x9b,0x3f,0x1b,0xe8,0x8, 0x3c,0x16,0xe2,0x1, 0xc7,0xff,0x3d,0x1c, +0x26,0x8d,0xe8,0x0, 0x9e,0x7, 0x86,0x88,0xb6,0x9, 0x3e,0x6a,0xe0,0xf, 0x85,0xe, +0xe2,0x1, 0xc6,0x7f,0x3e,0xca,0xe0,0xf, 0xae,0x8e,0xe8,0x0, 0x8f,0x5, 0x3f,0x7f, +0x2, 0xcc,0xe8,0x0, 0xae,0x5, 0x38,0x82,0x8, 0xb5,0xe0,0x0, 0x19,0x41,0xe0,0x3, +0x1a,0x45,0x17,0x81,0xe0,0x1, 0x19,0xd2,0xaf,0x82,0xaf,0x84,0x17,0x80,0xaf,0x83, +0xef,0xff,0xdf,0xb0,0xe0,0x0, 0x1f,0x8e,0xe0,0x0, 0x1c,0x8d,0x8d,0xf, 0xe0,0x1, +0x25,0x46,0xf7,0xff,0x13,0xff,0xe0,0x2, 0x1f,0xfd,0xf0,0x17,0x3b,0x9a,0xf2,0x1, +0xc3,0xff,0xf0,0x0, 0x89,0x4f,0xe0,0x1, 0x1f,0x72,0xf0,0x0, 0xc3,0x81,0xf0,0x0, +0x11,0x80,0xf0,0x17,0x33,0xa1,0x12,0xfe,0xa0,0x8e,0xe8,0x5, 0x3a,0x92,0xf0,0x0, +0x88,0x5f,0xf0,0x0, 0x88,0x82,0x8d,0x84,0x3f,0x69,0xf0,0x17,0x3b,0x99,0xe8,0x40, +0x3e,0xe3,0xe8,0x40,0x3e,0x63,0xf8,0x40,0x3b,0x63,0xf1,0xff,0xc1,0x7f,0xf0,0x0, +0x12,0x1, 0xf8,0x40,0x3a,0xe3,0x0, 0xb1,0x3f,0xf5,0x14,0x1, 0xe8,0x8, 0x3c,0x16, +0x3, 0x38,0xf0,0x40,0x3b,0x68,0xf2,0x1, 0xc3,0x7f,0xf0,0x40,0x39,0x7f,0xe8,0x40, +0x3c,0x64,0xe8,0x68,0x3d,0x23,0xf0,0x40,0x39,0x7f,0xf0,0x40,0x39,0xe8,0xe8,0x40, +0x3c,0x65,0xe8,0x68,0x3d,0x21,0xf0,0x40,0x38,0xe8,0x8c,0x1e,0xe8,0xf, 0x3f,0xb0, +0xc7,0x2, 0x3f,0x98,0x37,0xa1,0x3f,0x91,0x97,0x8f,0xe8,0x40,0x3c,0x64,0xe2,0x3, +0xcf,0xf3,0xe8,0x40,0x3f,0xe5,0xe0,0x68,0x3a,0x2d,0xe0,0x6f,0x3a,0x2b,0xf0,0x40, +0x3b,0xfe,0x3e,0xe8,0x3d,0xef,0x1, 0x15,0x8f,0x8e,0xe2,0x0, 0xcf,0x82,0x2, 0xcd, +0x14,0x1, 0x3c,0x1c,0x1, 0xa, 0x3e,0x68,0xe2,0x1, 0xc6,0x7f,0x27,0xdf,0x0, 0xce, +0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0x0, 0xca,0xe2,0x0, 0xca,0x82,0x5, 0x75,0x0, 0xc6, +0xe0,0x0, 0x2c,0x7d,0xf0,0x0, 0x29,0xf7,0x8f,0x4, 0xf1,0xff,0xc3,0x7f,0xe2,0x0, +0xcf,0x1, 0xe0,0x0, 0x1, 0x63,0x17,0x1, 0xf2,0x1, 0xc3,0x7f,0xe9,0x2f,0x3f,0x26, +0xe1,0x2c,0x3e,0x1e,0x3e,0x5f,0xe0,0x0, 0x26,0x46,0xe0,0x3, 0x1f,0x86,0x16,0x80, +0x87,0xf, 0xae,0x82,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xaf,0xf, 0xe0,0x0, 0x27,0x43, +0x17,0x0, 0xaf,0xf, 0x17,0x81,0xaf,0x83,0xe0,0x3, 0x17,0x74,0xe0,0x3, 0x1f,0xb5, +0x10,0x81,0xb7,0xf, 0x25,0x2a,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, 0x1e,0xd, 0x89,0x4f, +0xe0,0x0, 0x1c,0x47,0xc1,0x7f,0x17,0x80,0xe0,0xe, 0x37,0xc3,0x16,0x87,0x8d,0x8c, +0x3e,0xdf,0xe2,0x0, 0xc7,0x1f,0xc7,0x81,0x3f,0x19,0x3e,0x98,0xe2,0x1, 0xc7,0xff, +0xc6,0x2, 0x25,0x83,0x3d,0xf2,0x4, 0x8, 0xe0,0xf, 0x85,0x8e,0x86,0x8d,0xe3,0xd, +0x3d,0xdd,0xe0,0xf, 0xae,0x8e,0x3f,0xfa,0x4, 0xe8,0x28,0x87,0xe0,0x3, 0x1f,0x35, +0x9f,0x8e,0x27,0x83,0xc7,0xff,0xb7,0x8e,0xa, 0xe1,0x8f,0x84,0xe2,0x0, 0xcf,0x81, +0x1, 0x1f,0xe0,0x3, 0x1f,0x86,0x8f,0xf, 0x2f,0x44,0x8f,0x2, 0xe2,0x0, 0xcf,0x1, +0x1, 0x40,0x88,0x83,0xe2,0x0, 0xc8,0x81,0x1, 0x1c,0xe0,0x3, 0x1f,0xb5,0x9f,0x8f, +0x27,0xec,0x2d,0x42,0x20,0xe4,0x0, 0xe9,0xf2,0x1, 0xc3,0x7f,0xe9,0x2f,0x3f,0x26, +0xe1,0x2c,0x3e,0x1e,0x3e,0x5f,0x17,0x80,0xaf,0x82,0xe7,0xff,0x0, 0x9e,0x3e,0x6a, +0x0, 0xfb,0xf0,0x0, 0xa8,0x82,0xe7,0xff,0x0, 0x89,0xaf,0x84,0xe7,0xff,0x0, 0x84, +0xe7,0xff,0x2d,0x2b,0xa, 0xe1,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfe, +0xc0,0x7c,0xe0,0x0, 0x1f,0xe, 0x11,0x90,0xf0,0x0, 0x8e,0xe, 0x39,0x90,0xe0,0x0, +0x1c,0x8d,0xf0,0xa, 0x36,0x21,0x3c,0x63,0xe0,0x3, 0xd4,0x4c,0xea,0x12,0x7f,0xce, +0x89,0xf, 0xea,0x12,0x7a,0xd0,0xe0,0x2, 0x21,0x7a,0xe0,0x1, 0x1f,0xf2,0xa7,0x8f, +0x7a,0x83,0xf0,0x0, 0x16,0x80,0x7f,0x81,0xe8,0x40,0x3b,0xed,0xe0,0x2, 0x1f,0xfd, +0xf0,0x0, 0x1c,0x8d,0x8f,0xdf,0xe0,0x0, 0x1a,0xc7,0x63,0x3, 0xe0,0x0, 0x7f,0x82, +0xf0,0x7, 0x14,0x7f,0xf0,0x1, 0x26,0xb, 0x14,0x90,0x3c,0x90,0xe8,0x40,0x3c,0x68, +0xf0,0x1, 0x13,0x7f,0xe0,0x0, 0x16,0x80,0xe0,0xf, 0x36,0xc3,0xf0,0x0, 0x12,0x87, +0xf0,0x15,0x3a,0xdd,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0x99,0xf0,0x15,0x3a,0x95, +0xe0,0xf, 0x87,0x8f,0xf8,0x0, 0x82,0x85,0xf0,0x0, 0x12,0x1, 0xe8,0xf, 0x3f,0xd5, +0xe2,0x1, 0xc7,0xff,0xf0,0x14,0x3a,0x1d,0x27,0xb7,0x8f,0x89,0xe2,0x1, 0xcf,0xff, +0xf0,0x40,0x39,0xef,0x1, 0x31,0xf0,0x0, 0x88,0x6, 0xf0,0x0, 0x89,0x19,0xf0,0x0, +0x88,0x96,0xf0,0xf, 0x38,0x2f,0xe3,0xff,0xc7,0xff,0xe0,0x43,0x38,0x9f,0xf8,0x15, +0x38,0xa2,0xf3,0xff,0xc2,0xff,0xe2,0x0, 0xc8,0x80,0xf8,0x13,0x39,0xa0,0xf3,0xff, +0xc1,0xff,0xf8,0x43,0x38,0x15,0xe8,0x6f,0x3d,0x23,0xf8,0x12,0x39,0x21,0xf2,0x0, +0xc8,0x0, 0xf3,0xff,0xc1,0x7f,0xe8,0x75,0x3d,0x22,0xe8,0xf, 0x3f,0x95,0xe3,0xff, +0xc7,0xff,0x3f,0xf8,0xf0,0x40,0x3a,0xe8,0xe0,0x75,0x3c,0xaf,0x3f,0xf8,0xe8,0x40, +0x3c,0x65,0xe0,0x76,0x3c,0xad,0xe8,0x40,0x3e,0xe4,0xe2,0x1, 0xc6,0xff,0xf0,0x40, +0x3e,0x7d,0xc4,0x82,0xe7,0xff,0x1, 0xaa,0xf2,0x1, 0xcb,0x7f,0x1, 0x27,0xf0,0x16, +0x33,0x21,0xf2,0x0, 0x7d,0x10,0xf8,0x1a,0x3d,0x16,0xe8,0x0, 0x8a,0xa, 0xe8,0x0, +0x89,0x9a,0x3c,0x64,0x3c,0xe3,0xdd,0xe9,0x67,0x82,0x67,0x1, 0x3f,0xb4,0xe0,0x43, +0x3c,0x18,0x3f,0x93,0x37,0xa1,0x3f,0x9e,0x97,0x8f,0x3f,0xf8,0x4, 0xf, 0xf0,0xf, +0x36,0xa1,0xe2,0x0, 0x7f,0x4c,0x3f,0x9e,0xf0,0x0, 0xc6,0x81,0xaa,0xf, 0xf2,0x1, +0xc6,0xff,0xa9,0x9f,0x17,0xff,0xe8,0x0, 0xaf,0x8a,0xf0,0x0, 0x13,0x81,0xf0,0x17, +0x3b,0x97,0xe8,0x40,0x3b,0xe7,0xe2,0x1, 0xc3,0xff,0x3b,0xf2,0xc3,0x2, 0xe7,0xfe, +0x1, 0xeb,0xe0,0x1, 0x1f,0x8e,0xf0,0x0, 0x8c,0xf, 0xf8,0x40,0x3c,0x7d,0xe0,0x0, +0x5, 0xed,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, 0x1c,0x8d,0xf0,0x0, 0xa3,0x8f,0xe0,0x2, +0x1f,0xfd,0xe0,0x0, 0x1d,0x47,0x89,0xdf,0xe8,0x40,0x3a,0x6d,0xf0,0x1, 0x12,0xff, +0xf0,0x0, 0x13,0x0, 0xf7,0xff,0x12,0x7f,0xf0,0x0, 0x26,0x51,0x15,0x90,0x3d,0x90, +0xe8,0x40,0x3c,0x65,0xe8,0x40,0x39,0x66,0xe0,0x0, 0x16,0x0, 0xe0,0xf, 0x36,0x43, +0x16,0x87,0x3e,0xdc,0xe2,0x0, 0xc7,0x9f,0x3e,0x9a,0x3f,0x99,0xf0,0x0, 0x81,0x8d, +0xe0,0xf, 0x87,0x8f,0x16,0x81,0xe8,0xf, 0x3f,0xd3,0xe2,0x1, 0xc7,0xff,0x3e,0x9c, +0x27,0x98,0xf0,0x0, 0x89,0x8b,0xf2,0x1, 0xc9,0xff,0xf0,0xf, 0x39,0xb3,0x1, 0x11, +0xf0,0x0, 0x89,0x1b,0xe8,0xf, 0x3f,0x92,0x37,0xa1,0xe8,0xf, 0x3f,0x97,0x97,0x8f, +0x3f,0xf2,0x5, 0x7, 0x3c,0x6c,0xf8,0x40,0x3d,0xe2,0xf8,0x40,0x3f,0x63,0x39,0x6f, +0x3e,0x6d,0xe2,0x1, 0xc6,0x7f,0xf0,0x40,0x3e,0x7c,0xc5,0x82,0x1, 0xd0,0xe2,0x1, +0xcc,0x7f,0x1, 0x14,0xf0,0xf, 0x36,0xa1,0xe2,0x0, 0x7f,0x4c,0x3f,0x9e,0x34,0x21, +0xe2,0x0, 0x7f,0x10,0x3c,0x1e,0xf0,0x0, 0xc6,0x81,0xf0,0x0, 0xaf,0xf, 0xf2,0x1, +0xc6,0xff,0xf0,0x0, 0xad,0x9f,0xf0,0x0, 0xaa,0x8, 0xc2,0x1, 0xe2,0x1, 0xc2,0x7f, +0xf0,0x40,0x3c,0x74,0xe7,0xff,0x1, 0xaa,0xe0,0x1, 0x1f,0xc3,0xe0,0x0, 0x14,0xcc, +0x8d,0xf, 0x3c,0x90,0x35,0x21,0xe2,0x0, 0x7c,0x10,0xe0,0x3, 0xd3,0x1b,0x64,0x3, +0xf0,0xa, 0x34,0x21,0xe0,0x1, 0x14,0xff,0xe0,0x3, 0xd3,0x4e,0xf0,0x0, 0x2e,0x8f, +0xe0,0x0, 0x1f,0xe, 0xea,0x12,0x7f,0xce,0xf0,0x0, 0xae,0x8f,0xf0,0x0, 0xae,0x8e, +0xe0,0x1, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x2, 0x36,0xa1,0xe0,0x0, +0x1c,0xd, 0x3d,0x62,0xe2,0x0, 0x7c,0x90,0xe0,0x3, 0xd2,0xfc,0x64,0x3, 0x3d,0x62, +0xe2,0x0, 0x7c,0x90,0xe0,0x3, 0xd2,0xf6,0xe0,0x0, 0x1c,0x8d,0xe0,0x0, 0x1d,0x47, +0xe0,0x0, 0x17,0x80,0xe0,0xe, 0x37,0xc3,0x16,0x7, 0x3e,0x5f,0xe2,0x0, 0xc7,0x1f, +0x3f,0x19,0x3e,0x1a,0xe0,0xf, 0x85,0x8e,0x86,0x8c,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0x3e,0xcb,0xe8,0x40,0x3f,0xfd,0xe0,0xf, 0xae,0x8e,0x1, 0xed,0xea,0x12,0x7f,0x4e, +0xf0,0x40,0x3c,0x7f,0xaf,0x8e,0xe8,0x6f,0x3c,0xa8,0xe0,0x0, 0x1f,0xe, 0xaf,0x8e, +0xe0,0x1, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x40,0x3e,0xe2,0x7a,0x83, +0xe7,0xfe,0x0, 0xb1,0x8, 0xb1,0xe0,0x0, 0xd8,0xdd,0x8, 0xa1,0xe7,0xfa,0x0, 0x9a, +0xe0,0x2, 0x1f,0xc8,0x17,0x1, 0x8f,0x8f,0xe0,0x2f,0x3f,0x8e,0xe0,0x1, 0x27,0x87, +0xe0,0x1, 0x2c,0x5, 0xe0,0x0, 0x1f,0x93,0xf0,0x0, 0x88,0x8f,0xf0,0x1, 0x28,0x81, +0xe0,0x0, 0x1f,0x8e,0xf0,0x0, 0x8a,0x8f,0xf0,0x40,0x3a,0xfe,0xe0,0x0, 0x5, 0xf9, +0xe0,0x0, 0x8, 0xb1,0xf7,0xff,0x10,0x7f,0xf0,0x0, 0x1a,0xd, 0xf8,0x10,0x38,0x15, +0xe8,0x40,0x3d,0x61,0xe8,0x40,0x3d,0xe1,0xf8,0x40,0x38,0xf0,0xe0,0x0, 0x3, 0x5e, +0xf0,0xf, 0x30,0xa1,0xf0,0x0, 0xc0,0x81,0xf2,0x1, 0xc0,0xff,0xf8,0x40,0x3a,0xf1, +0xe8,0xf, 0x3f,0x94,0x8c,0xf, 0xe0,0x0, 0x8c,0x9f,0x5, 0xef,0xf0,0x40,0x39,0x68, +0xf0,0x40,0x39,0xe9,0xe8,0x40,0x3e,0x61,0xe0,0xe, 0x36,0x21,0xe8,0xe, 0x3f,0x14, +0x8f,0x8e,0x8e,0x9e,0xe8,0xe, 0x3f,0xa2,0xe2,0x0, 0xcf,0x0, 0xe0,0xe, 0x3f,0xa8, +0xe0,0xf, 0x3c,0x2f,0xe8,0x1, 0x3e,0xa3,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xc7,0x7f, +0xe0,0x6e,0x3d,0x2f,0xe2,0x0, 0xc8,0x80,0xe0,0xf, 0x3e,0xa9,0xe0,0xd, 0x3c,0xad, +0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0xe0,0x6f,0x3d,0x2d,0x38,0xee,0x3e,0xeb, +0xe2,0x1, 0xc0,0xff,0xe2,0x1, 0xc6,0xff,0x38,0xfd,0xc6,0x1, 0xf0,0x40,0x3b,0xea, +0xf0,0x40,0x3b,0x6f,0xf2,0x1, 0xc3,0xff,0xe2,0x1, 0xc6,0x7f,0xf2,0x1, 0xc3,0x7f, +0x3, 0x82,0x3f,0x6b,0xf8,0x40,0x3b,0x77,0x3d,0xee,0xe2,0x1, 0xc5,0xff,0x3, 0x82, +0x3f,0xea,0xf0,0x40,0x3a,0xfc,0x3d,0x6f,0xe2,0x1, 0xc5,0x7f,0xe7,0xff,0x1, 0xbe, +0xf8,0x40,0x38,0xf0,0xe7,0xff,0x4, 0x26,0x14,0x4, 0xe1,0x2a,0x3c,0x2a,0x14,0x3, +0xe1,0x2b,0x3c,0x2b,0xe0,0x8, 0x3d,0x5b,0x8, 0xe1,0x14,0x0, 0x38,0x82,0x38,0x82, +0xe0,0x0, 0x1f,0x8e,0x8e,0x8f,0xe0,0x1, 0x26,0xcf,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xc0,0x70,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, 0x1a,0xd, 0xf0,0x0, 0xa4,0xf, 0xe0,0x2, +0x1f,0xfd,0xe0,0x1, 0x12,0xff,0x8b,0xdf,0xf0,0x40,0x3e,0xe9,0xf0,0x40,0x3f,0x68, +0x3d,0xe8,0x3e,0x69,0xf0,0x40,0x3e,0x64,0x3b,0x65,0xf0,0x40,0x3c,0xe5,0x3f,0x65, +0xe0,0x0, 0x11,0x80,0xf8,0x0, 0x8d,0xc, 0xf8,0x0, 0x8d,0x9c,0xf0,0xf, 0x3d,0x2b, +0xe2,0x0, 0xcf,0x80,0xf8,0x2, 0x3d,0x2e,0xf8,0xf, 0x3f,0x2a,0xe2,0x1, 0xc7,0xff, +0xe2,0x1, 0xc1,0x7f,0xe0,0x62,0x3d,0x2f,0xf0,0xa, 0x3d,0xac,0xe2,0x0, 0xcd,0x0, +0x3f,0xe2,0xf8,0xa, 0x3e,0xab,0xf8,0x2, 0x3d,0xad,0xe2,0x1, 0xc1,0x7f,0xe2,0x1, +0xc5,0x7f,0xe0,0x62,0x3d,0x2a,0x39,0x1f,0x39,0x7e,0xe8,0x40,0x3c,0x6a,0xe8,0x40, +0x3c,0xeb,0xf0,0x0, 0xc6,0x2, 0x3, 0x1f,0x7d,0x82,0x7e,0x1, 0x7e,0x83,0x7f,0x4, +0xdc,0xc, 0xf0,0xf, 0x3d,0x37,0xe0,0x43,0x3c,0x18,0xe8,0xf, 0x3f,0x9b,0x37,0xa1, +0xe8,0xf, 0x3f,0x98,0x97,0x8f,0x65,0x82,0x3f,0xf8,0x66,0x1, 0x66,0x83,0x67,0x4, +0x5, 0xa, 0x3f,0x62,0xf0,0x40,0x3c,0xe3,0xe2,0x1, 0xc7,0x7f,0xe8,0x40,0x3a,0xeb, +0xe8,0x40,0x3b,0x6a,0xc1,0x81,0xe2,0x1, 0xc1,0xff,0x39,0xfd,0xe7,0xff,0x1, 0xb4, +0xe0,0xa, 0x3b,0x37,0xf0,0x2, 0x1b,0xff,0x3d,0x15,0x35,0x21,0xf8,0x0, 0xac,0x87, +0xe8,0xa, 0x3d,0x18,0x16,0x80,0x11,0x1, 0x14,0x2, 0x14,0x84,0x0, 0x8e,0x27,0x3e, +0x97,0xc, 0x97,0x8a,0x3f,0x7f,0xe0,0x0, 0x2, 0x49,0xc6,0x81,0xe2,0x1, 0xc6,0xff, +0x39,0xfd,0xc2,0x2, 0xe0,0x0, 0x1, 0x44,0xf0,0x40,0x3c,0xfd,0x1, 0x77,0x8d,0x84, +0xf0,0x0, 0x8b,0x14,0xe0,0xe, 0x3d,0xa6,0xf0,0x43,0x3a,0x1e,0xf2,0x0, 0xca,0x0, +0xf0,0xf, 0x3b,0x25,0xe0,0x15,0x3b,0x2b,0xf2,0x1, 0xc2,0xff,0xf0,0x43,0x3a,0x1f, +0xe2,0x1, 0xc7,0x7f,0xe8,0x6e,0x3d,0x25,0xe0,0xc, 0x3d,0xb7,0xe8,0x15,0x3a,0xa6, +0xf2,0x0, 0xca,0x0, 0xf2,0x1, 0xc2,0xff,0xe2,0x1, 0xc7,0xff,0xe8,0x6f,0x3d,0x25, +0xe8,0xc, 0x3e,0x16,0x36,0x21,0xe1,0x35,0x3c,0x2f,0xe8,0xc, 0x3e,0x18,0xe1,0x2f, +0x3c,0xaf,0xe1,0x2e,0x39,0x2e,0xf7,0xff,0x2a,0xc4,0x3d,0xb7,0x27,0xc7,0xe8,0xb, +0x3d,0x96,0x35,0xa1,0xe8,0xb, 0x3d,0x98,0x27,0x41,0x97,0x8a,0x97,0xb, 0xe0,0x1, +0xc7,0xc8,0x3f,0x7f,0xe7,0xff,0x5, 0x3b,0xe8,0x0, 0xae,0x87,0xc0,0x10,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1f,0xff,0x17,0x7f,0xaf,0xf, 0x38,0x82,0x0, 0x0, +0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1e,0xde,0x8f,0xf, 0xe0,0x0, 0x2f,0x56,0xe0,0x0, +0x1f,0x8e,0xf0,0x0, 0x1a,0x8d,0xf0,0x0, 0x8b,0xf, 0xf0,0x0, 0x23,0x4d,0xe0,0x1, +0x1f,0xf2,0xf0,0x0, 0x18,0x8b,0xf0,0x0, 0xa1,0x8f,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, +0x19,0xa, 0xf0,0x0, 0x8a,0x5f,0xe8,0x40,0x3e,0x65,0x3e,0xee,0xe0,0x1, 0x14,0x7f, +0xf0,0x40,0x3b,0xee,0x8d,0xc, 0x8d,0x9c,0xe8,0xf, 0x3d,0x34,0x14,0x81,0x3f,0x9b, +0x37,0xa1,0xe8,0xf, 0x3f,0x93,0x97,0x8f,0x3c,0x9d,0xe8,0x40,0x3f,0xf7,0xc6,0x2, +0x5, 0x8, 0xe8,0x0, 0xad,0x1, 0x3c,0x6d,0xe8,0x0, 0xad,0x82,0xf0,0x40,0x3b,0xef, +0x3e,0xe9,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf6,0x1, 0xe5,0xe0,0x0, 0x1d,0x47, +0x15,0x81,0xe0,0xf, 0x37,0x43,0x16,0x7, 0x3d,0x9e,0x3c,0x7e,0x3e,0x5e,0xe2,0x0, +0xc7,0x9f,0x3f,0x6b,0xe8,0xf, 0x3f,0x95,0x3e,0x1a,0xe2,0x1, 0xc7,0x7f,0x1, 0x8, +0xe0,0xf, 0x85,0x8f,0x86,0xc, 0xe3,0xc, 0x3d,0xdc,0xe0,0xf, 0xae,0xf, 0x3e,0xfe, +0x1, 0xe8,0x38,0x82,0x38,0x82,0xe0,0x1, 0x8c,0x8d,0x8c,0x7d,0xe7,0xfd,0x0, 0xca, +0xe0,0x0, 0x1f,0x8e,0xe0,0x1, 0x1c,0xce,0x8d,0xf, 0x17,0x80,0xaf,0x89,0xea,0x12, +0x7f,0xcd,0x2d,0xd, 0xe0,0x2, 0x1f,0x48,0xad,0xf, 0x8f,0xe, 0xe2,0x0, 0xcf,0x1, +0x1, 0x15,0xea,0x12,0x7f,0xcc,0x17,0x0, 0xaf,0xf, 0x38,0x82,0x87,0xf, 0xc7,0x1, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x6, 0x5, 0x82,0x17,0x6, 0xaf,0xf, 0xe0,0x2, +0x1f,0x48,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0xed,0x8, 0xb3,0xe0,0x2, 0x1e,0xeb, +0xe0,0x3, 0x19,0x1c,0x16,0x0, 0x8f,0xd, 0xae,0x2, 0xe0,0x0, 0x2f,0x5a,0xe2,0x0, +0xcd,0xf, 0xe0,0x0, 0x2, 0xd1,0xe2,0x0, 0xcd,0x1, 0xe0,0x0, 0x5, 0xd6,0x8f,0x8f, +0xe2,0x0, 0xcf,0x85,0xe0,0x0, 0x2, 0xd1,0xfa,0x12,0x78,0xcc,0xf8,0x0, 0x89,0x81, +0xf0,0x1, 0x29,0xd9,0xf7,0xff,0x11,0x7f,0xf0,0x0, 0x1a,0x8d,0xf0,0x12,0x39,0x1a, +0xe8,0x40,0x3e,0xe3,0xf8,0x40,0x39,0xf2,0xe0,0x1, 0x3, 0x2e,0xf0,0xf, 0x31,0xa1, +0xf0,0x0, 0xc1,0x81,0xf2,0x1, 0xc1,0xff,0xe8,0x40,0x3d,0x73,0xe8,0xf, 0x3f,0x95, +0xf0,0x0, 0x8b,0x1f,0x5, 0xf0,0xf8,0x40,0x3a,0x66,0xe8,0x40,0x3f,0xe3,0x0, 0x89, +0x3d,0xfd,0xe8,0x6d,0x3a,0x27,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3d,0x7f,0x1, 0x63, +0xe0,0xe, 0x37,0xa1,0xe8,0xe, 0x3f,0x15,0x8f,0x1e,0xe8,0xc, 0x3f,0x24,0xe8,0xb, +0x3f,0x26,0xe2,0x0, 0xce,0x0, 0xf0,0x40,0x3b,0xeb,0xf2,0x1, 0xc3,0xff,0x2, 0x69, +0xe0,0x41,0x3e,0x4c,0x3e,0x7d,0xf0,0xe, 0x3b,0x2e,0xe2,0x1, 0xc7,0x7f,0xe0,0x6d, +0x3a,0x2e,0x0, 0xe2,0xea,0x12,0x7f,0xcc,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xc7,0x7f, +0xaf,0xd, 0xe7,0xff,0x0, 0xa6,0xea,0x12,0x7f,0xcc,0x8f,0xf, 0x27,0x3, 0xc7,0x7f, +0xaf,0xf, 0xe0,0x0, 0x1f,0x93,0xe0,0x0, 0x1f,0x12,0x89,0x8f,0x3d,0x73,0x5, 0x96, +0xe0,0x0, 0x21,0xfd,0xe2,0x0, 0xc9,0x81,0xe0,0x1, 0x1, 0x7, 0xe0,0x1, 0x1f,0xe8, +0x17,0x3, 0x8f,0x8f,0xaf,0x9, 0xe0,0x0, 0x27,0xfb,0xe2,0x0, 0xcf,0x82,0x1, 0xdf, +0xe0,0x0, 0x1f,0x38,0xaf,0x8e,0xe0,0x0, 0x9, 0xe1,0xe0,0x0, 0x4, 0xd5,0xe2,0x0, +0xcd,0x1, 0x5, 0xd5,0xf0,0x0, 0x1b,0x8d,0xf0,0x0, 0x11,0x1, 0xf8,0x40,0x38,0xe7, +0xf0,0x0, 0x13,0x2, 0xe8,0x0, 0x8c,0x1, 0xe8,0x0, 0x8d,0x91,0xf0,0x40,0x39,0xe8, +0xf0,0x40,0x3a,0x6b,0xe8,0x40,0x3e,0x62,0xe0,0xf, 0x36,0x21,0xf0,0xe, 0x3b,0x9f, +0x8e,0x8e,0x8f,0x1e,0xf0,0xf, 0x39,0xad,0xe2,0x0, 0xcf,0x80,0xe0,0xf, 0x3c,0x2d, +0x3e,0xa8,0xe2,0x1, 0xc6,0xff,0xf0,0x15,0x3a,0x2e,0xe2,0x1, 0xc7,0xff,0xe0,0x6f, +0x3d,0x2d,0xe0,0xd, 0x3d,0xae,0xf2,0x0, 0xca,0x80,0x3f,0x2b,0xe2,0x1, 0xc7,0x7f, +0xe2,0x1, 0xc6,0xff,0xc6,0x1, 0xe0,0x6d,0x3d,0x2e,0xf1,0x2f,0x3b,0x2f,0xe2,0x1, +0xc6,0x7f,0xf1,0x2e,0x3b,0x2d,0x27,0x83,0xe7,0xff,0x2f,0x32,0x3d,0x7c,0x2, 0xd5, +0xf0,0x0, 0xc1,0x1, 0xf2,0x1, 0xc1,0x7f,0xe8,0x40,0x3d,0x72,0xf0,0x0, 0xc0,0x82, +0x1, 0xc2,0x9, 0xe1,0xe2,0x0, 0xce,0x85,0xe7,0xff,0x5, 0x95,0x17,0x81,0xe8,0x0, +0xaf,0x81,0x9, 0xe1,0xe2,0x0, 0xcd,0x1, 0xe7,0xff,0x1, 0x9a,0xe0,0x2, 0x1f,0xdd, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe7,0xff,0x1, 0x93,0xe0,0x1, 0x1f,0xc7,0x9f,0x8f, +0xe2,0x1, 0xcf,0xc8,0xe7,0xff,0x5, 0x8c,0x9, 0xe1,0xde,0x8b,0x17,0x81,0xaf,0x82, +0x9, 0xe1,0xf1,0xff,0xc1,0xff,0xf8,0x0, 0xa9,0x81,0x9, 0xe1,0xe0,0x0, 0x1f,0xb8, +0x17,0x1, 0xaf,0xf, 0x9, 0xe1,0x8c,0x9e,0x8c,0xe, 0xdd,0xa3,0xa9,0x82,0x9, 0xe1, +0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x1, 0x15,0x48,0xa4,0xf, 0x14,0xa8,0xef,0xfd, +0xda,0x96,0xe0,0x0, 0x1d,0x8d,0xe0,0x1a,0x97,0xfb,0xe2,0x1b,0xcf,0xac,0xe0,0x0, +0x1f,0x8e,0x8d,0xf, 0x2, 0x6, 0xe0,0x1b,0x97,0x9b,0xe3,0xe4,0xcf,0xd4,0x3, 0x19, +0x25,0x17,0xe0,0x0, 0x1c,0xc7,0x16,0x80,0x3f,0xed,0xe2,0x1, 0xc7,0xff,0xe0,0xe, +0x37,0xc3,0xe2,0x0, 0xc7,0x87,0x3f,0x1b,0x3f,0x99,0xe0,0xf, 0x86,0xe, 0x87,0x8f, +0xc6,0x81,0xe3,0xf, 0x3e,0x5f,0x3e,0xfa,0xe0,0xf, 0xaf,0x8e,0x1, 0xee,0x8, 0xe1, +0xe0,0xf, 0x35,0x24,0x3c,0x7f,0x5, 0x7c,0xe0,0x3, 0x1f,0xae,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0x5f,0x8, 0xe1,0xe0,0x0, 0x1f,0xbb,0xe0,0x2, 0x8f,0xf, 0x3f,0x9e, +0xe0,0x6, 0x8c,0x8f,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x2, +0x38,0x82,0xe2,0x1, 0xc4,0xfd,0x2c,0xfd,0x8, 0xb1,0xe0,0x1, 0x1f,0xf1,0xe0,0x13, +0x15,0x44,0xa4,0xf, 0xef,0xfd,0xda,0x4b,0xe2,0x0, 0xcc,0x64,0x5, 0x87,0xe0,0x1, +0x1f,0xdc,0x17,0x7f,0xa7,0x8f,0xe0,0x7, 0xaf,0x3f,0x8, 0xe1,0x8, 0xb2,0xe0,0x1, +0x1f,0xd7,0xe0,0x3, 0x8f,0xaf,0x27,0xb1,0xe0,0x0, 0x19,0xe, 0xdf,0x9a,0xd9,0xc1, +0xd9,0xc0,0xef,0xff,0xd7,0x3, 0xd9,0xbd,0xe0,0x0, 0x1f,0xa7,0x87,0x2, 0xaf,0xf, +0xd5,0x78,0xd9,0xb7,0xd9,0xb6,0x8f,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0x9, 0xd9,0xf5, +0xd9,0xb0,0xda,0xfb,0xe0,0x0, 0x1f,0xb8,0x8f,0x8f,0x27,0x93,0x9, 0x61,0xe0,0x3, +0x1f,0x6, 0x16,0x80,0xae,0x8e,0x17,0x80,0xe0,0x3, 0x1f,0x35,0xb7,0x8e,0xe0,0x0, +0x1f,0x41,0xaf,0x8e,0xd9,0x9e,0xda,0xe9,0xe0,0x0, 0x1f,0xb8,0x8f,0x8f,0x2f,0xef, +0xde,0x48,0x9, 0x21,0xe7,0xf3,0x0, 0x96,0xef,0xfe,0xde,0x50,0xd9,0x92,0x0, 0xcd, +0x8, 0xb6,0xc0,0x74,0x3c,0x7a,0xe4,0xf, 0x35,0x28,0xe4,0xe, 0x34,0x28,0x39,0x68, +0x4, 0x82,0x39,0x6a,0x3f,0x7f,0x3f,0xe8,0xe0,0x6f,0x3d,0xaa,0x3c,0xfb,0x38,0xef, +0xe2,0x1, 0xc1,0x7f,0xe2,0x1, 0xc0,0xff,0x39,0xeb,0xe4,0xf, 0x35,0xa8,0xe4,0xe, +0x34,0xa8,0x3, 0x82,0x39,0xe9,0x3f,0x7f,0xe2,0x1, 0xc1,0xff,0x3f,0xe9,0xe0,0x6f, +0x3d,0xab,0x3c,0xf3,0xf0,0x40,0x3b,0x6f,0xf2,0x1, 0xc3,0x7f,0xe0,0x1, 0x1, 0x1e, +0x3d,0x72,0xe0,0x1, 0x2, 0x9e,0xf0,0x40,0x3a,0xe2,0xf0,0x0, 0x11,0x81,0xe0,0x1, +0x1f,0xf2,0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0xa2,0xf, 0xe0,0x2, 0x1f,0xfd,0xe0,0x0, +0x1a,0x29,0xf0,0x0, 0x8b,0xdf,0xf8,0x12,0x39,0x16,0x3c,0xe3,0x15,0x0, 0xf0,0x1, +0x10,0x7f,0xf7,0x0, 0x10,0x81,0x14,0x7f,0xf0,0x40,0x39,0x79,0xe0,0x0, 0x1, 0x62, +0xe8,0x40,0x3c,0xf6,0xf0,0x1, 0x21,0x83,0xe0,0x1, 0x3, 0x65,0x17,0x1, 0x3f,0x19, +0xf0,0x40,0x3a,0xf1,0xf0,0x0, 0x6a,0x84,0x6f,0x5, 0xe0,0x1, 0x3, 0x61,0x17,0x81, +0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88,0x6c,0x89,0x6f,0x8c,0x6f,0xd, +0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0x60,0xe8,0x40,0x3b,0x61,0x16,0x80,0x8d,0x8e, +0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d,0xe8,0xf, 0x3d,0xb7,0x1, 0x10,0x8d,0x9e, +0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1,0xe8,0xf, 0x3f,0x94,0x1, 0x8, 0x97,0x8f, +0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6,0xe0,0x66,0x3a,0x2f,0x3e,0xe5,0xe2,0x1, +0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, 0x1, 0xe3,0xe0,0xf, 0x36,0x22,0xe2,0x0, +0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40,0x3b,0x7d,0xe0,0x1, 0x1, 0x34,0xe8,0x40, +0x39,0xf6,0xe0,0x1, 0x1, 0x30,0xe2,0x1, 0xce,0x7f,0xe7,0xff,0x1, 0x2f,0xe0,0xe, +0x35,0x21,0x3c,0xed,0x3f,0x14,0xe2,0x0, 0x7e,0x4, 0xf0,0x40,0x39,0x79,0x3f,0x9c, +0xc5,0x1, 0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0xf0,0x0, 0x8a,0x8f,0xe7,0xff,0x1, 0xa2, +0xe0,0xff,0x14,0x7f,0x25,0x18,0x17,0xff,0x3f,0x9a,0x3d,0x6f,0xe2,0x1, 0xc5,0x7f, +0xe0,0x0, 0x1e,0xa9,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1f,0x28,0xe0,0xf, 0x3f,0x9d, +0xe0,0xff,0x14,0x7f,0xe0,0x80,0x96,0x9e,0x3e,0xf8,0xe0,0x6d,0x3a,0x28,0x3f,0x7f, +0x3c,0x6d,0x1, 0xf9,0xc0,0xc, 0xb, 0x61,0x3c,0x72,0xe7,0xfe,0x5, 0xe6,0xf0,0x40, +0x3a,0xe1,0xf0,0x0, 0x11,0x80,0xe7,0xfe,0x0, 0xe4,0xe0,0x0, 0x3, 0x59,0x17,0x1, +0x3f,0x19,0xe8,0x40,0x39,0x75,0xf0,0x0, 0x6a,0x84,0x6f,0x5, 0xe0,0x0, 0x3, 0x55, +0x17,0xff,0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88,0x6c,0x89,0x6f,0x8c, +0x6f,0xd, 0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0xe3,0xe8,0x40,0x3e,0x60,0xe8,0x40, +0x3b,0x61,0x8d,0x8e,0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d,0xe8,0xf, 0x3d,0xb7, +0x1, 0x10,0x8d,0x9e,0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1,0xe8,0xf, 0x3f,0x94, +0x1, 0x8, 0x97,0x8f,0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6,0xe0,0x66,0x3a,0x2f, +0x3e,0xe5,0xe2,0x1, 0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, 0x1, 0xe3,0xe0,0xf, +0x36,0x22,0xe2,0x0, 0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40,0x3b,0x7d,0x1, 0x2d, +0xe8,0x40,0x39,0xf6,0x1, 0x2a,0xe2,0x1, 0xce,0x7f,0xe7,0xfe,0x1, 0x2f,0xe0,0xe, +0x35,0x21,0xe2,0x0, 0x7e,0x4, 0x3f,0x9c,0x3f,0x14,0xc5,0x1, 0xf0,0x0, 0x8a,0x8f, +0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0x3c,0xed,0xe7,0xfe,0x0, 0xa0,0xf0,0x40,0x3a,0xf2, +0x6c,0x4, 0x6c,0x5, 0x2, 0x23,0x6c,0x8, 0x6c,0x9, 0x6c,0xc, 0x6c,0xd, 0xe7,0xff, +0x0, 0xb2,0xe8,0x40,0x38,0xf5,0x6c,0x4, 0x6c,0x5, 0x2, 0x12,0x6c,0x8, 0x6c,0x9, +0x6c,0xc, 0x6c,0xd, 0xe7,0xfe,0x0, 0xa6,0x8f,0xe, 0x3f,0x72,0x1, 0xd5,0xe7,0xfe, +0x0, 0xe9,0x8f,0xe, 0x3f,0x71,0xe7,0xfe,0x1, 0xd0,0xe7,0xfe,0x0, 0xe3,0x17,0x81, +0xe8,0xf, 0x3f,0x95,0x6f,0x88,0x6c,0x89,0x0, 0xec,0x17,0xff,0xe8,0xf, 0x3f,0x95, +0x6f,0x88,0x6c,0x89,0x0, 0xdb,0x0, 0x0, 0x8, 0xb3,0xf7,0xff,0x12,0x7f,0xf0,0x43, +0x38,0x8, 0xf0,0x14,0x3a,0x18,0xf0,0x0, 0x10,0x81,0xf8,0x43,0x3a,0x4, 0xf8,0x11, +0x38,0x90,0xe0,0x2, 0x1f,0xfd,0xf8,0x40,0x3a,0x71,0x80,0xef,0xf0,0x0, 0x82,0xff, +0xe0,0x0, 0x2, 0x65,0xe0,0x1, 0x1f,0x72,0xf7,0xff,0x11,0x7f,0xf0,0x0, 0x11,0x81, +0xf0,0x13,0x39,0x98,0xf0,0x43,0x3b,0x89,0xf0,0x12,0x39,0x19,0x15,0x1, 0x11,0x81, +0xf0,0x0, 0xa3,0xe, 0x89,0x5f,0xf8,0x43,0x39,0x2, 0xe8,0xa, 0x3d,0x17,0xf2,0x1, +0xc1,0xff,0xe7,0x0, 0x14,0x1, 0x39,0x99,0xf2,0x0, 0xca,0x0, 0xe8,0x43,0x3f,0x83, +0xe8,0x40,0x3d,0xe4,0xe0,0x6b,0x3c,0x2f,0xe8,0x40,0x38,0xf4,0xe0,0x6b,0x3d,0x2f, +0xe8,0x40,0x3d,0x72,0x4, 0x2e,0x3e,0x63,0xe0,0x9, 0x39,0x3b,0xe2,0x1, 0xc6,0x7f, +0xe8,0x2b,0x3d,0x80,0xe8,0x40,0x3f,0xe2,0x0, 0x84,0x25,0x9c,0x3f,0xfa,0x2, 0x21, +0xe2,0x0, 0xcf,0x80,0xe0,0x43,0x3e,0x8c,0x3f,0x6f,0xe0,0x6e,0x3c,0x2d,0xf0,0x40, +0x3a,0xff,0xc6,0x7f,0xe0,0x6e,0x3d,0x2d,0xe0,0xd, 0x3f,0x19,0xc7,0x81,0x36,0xa1, +0xe8,0x2e,0x3f,0x7, 0xe0,0x43,0x3f,0x8f,0xe8,0xd, 0x3e,0x96,0xe2,0x1, 0xc6,0x7f, +0x2f,0x65,0x97,0xd, 0x3f,0x78,0xe0,0x6e,0x3c,0x28,0x3f,0xfa,0x3c,0x6e,0x5, 0x61, +0xf0,0x0, 0xc2,0x1, 0xf8,0x43,0x3a,0x4, 0xf8,0x40,0x3a,0x71,0xf1,0xff,0xc1,0xff, +0xf2,0x1, 0xc1,0xff,0xe7,0xff,0x5, 0x3a,0x9, 0xe1,0xe7,0x0, 0x14,0x1, 0x9, 0xe1, +0x8, 0xb4,0xc0,0x78,0x39,0xea,0x3a,0x6b,0x7e,0x2, 0x7e,0x81,0xdf,0x7e,0x39,0x68, +0x3c,0xe4,0x3c,0x63,0xdf,0x7a,0x39,0x18,0xe4,0x8, 0x31,0x4f,0x3c,0x12,0x34,0x1, +0x66,0x81,0x3f,0xe8,0xe3,0xff,0xc6,0xff,0xe3,0xff,0xc7,0xff,0xe0,0xe, 0x3e,0xaf, +0xe0,0x43,0x3f,0x1e,0x66,0x2, 0xe2,0x0, 0xcf,0x0, 0xe0,0x8, 0x3e,0xa8,0xe0,0xe, +0x3f,0xad,0xe3,0xff,0xc6,0x7f,0xe0,0x43,0x3f,0x1e,0xe0,0x43,0x3c,0x18,0xe0,0xf, +0x3e,0xac,0xe0,0x68,0x3d,0x2e,0xe0,0x2, 0x1f,0x41,0xe0,0x43,0x3f,0x9f,0x3e,0x2d, +0xe2,0x0, 0xcf,0x80,0x9f,0xe, 0xe0,0x43,0x3e,0x1c,0xe0,0x6f,0x3d,0x2c,0xe2,0x0, +0xcf,0xb, 0x16,0x86,0x17,0x3, 0xe0,0x6e,0x3c,0xad,0x3f,0x38,0x3f,0xfe,0x5, 0xa, +0xe0,0x0, 0x17,0x64,0xe0,0x2f,0x3f,0x9e,0xe0,0x28,0x3c,0x1e,0x3c,0x5f,0xc0,0x8, +0xa, 0x61,0x14,0x0, 0xc0,0x8, 0xa, 0x61,0x8, 0xb1,0xc0,0x44,0x15,0x3c,0x14,0x80, +0xe2,0x0, 0x7c,0x4, 0xe0,0x2, 0xdd,0x50,0xe0,0x0, 0x1f,0x8e,0x14,0x0, 0x8d,0x8f, +0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5, 0xc8,0x15,0x7f,0x3d,0x1b,0xe2,0x1, 0xc5,0x7f, +0xc5,0x1, 0xe0,0x0, 0x1f,0x8d,0xf2,0x0, 0x7b,0x4, 0x35,0x21,0x3d,0x1f,0xe8,0x40, +0x3f,0x66,0x86,0xf, 0x86,0x9f,0xc7,0x82,0xae,0xe, 0x3f,0xfa,0xc7,0x2, 0xe0,0x40, +0xae,0x9e,0x1, 0xf8,0xf0,0x0, 0x13,0x80,0xe8,0x40,0x3e,0xe7,0xf0,0x0, 0xc3,0x81, +0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3d,0xf7,0x14,0x1, 0x1, 0x25,0xe8,0x0, 0x8c,0x86, +0xe8,0x0, 0x8d,0x16,0xe8,0x40,0x3f,0xe7,0xe0,0xe, 0x37,0xa1,0xe2,0x0, 0x7e,0x4, +0x3f,0x1c,0x8e,0xe, 0x8f,0x1e,0x3e,0x79,0x3e,0x6d,0xe0,0x6c,0x39,0xa8,0xc7,0x81, +0x3f,0x7a,0xe2,0x1, 0xc7,0xff,0x3f,0x6d,0xe0,0x6e,0x39,0xac,0x3d,0xff,0x3c,0x6e, +0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3d,0xf7,0xf0,0x0, +0xc3,0x2, 0x1, 0xdd,0xc0,0x3c,0x8, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x40, +0xe0,0x0, 0x1f,0xe, 0xe0,0x1, 0x1f,0xc3,0x8f,0xe, 0xea,0x4f,0x7d,0x98,0x89,0xf, +0xe9,0xff,0xc5,0xff,0xe0,0x2, 0x1e,0x3b,0x7f,0xa, 0x17,0x80,0xe0,0x2, 0x1f,0x22, +0xf0,0x40,0x38,0xe8,0xf0,0x2, 0x1c,0xc3,0xa4,0xb, 0xaf,0x8e,0x3d,0x62,0xaf,0x8c, +0x14,0x80,0xf0,0x0, 0x78,0x81,0xe8,0x7, 0xaf,0xd9,0xe8,0x7, 0xaf,0xe9,0xe0,0x2, +0xdc,0xdb,0xe0,0xa, 0x31,0x21,0x14,0x80,0xe8,0x40,0x3c,0x69,0xe0,0x2, 0xdc,0xd4, +0x67,0xa, 0xf0,0x0, 0x60,0x81,0xe2,0x0, 0xcf,0x1, 0xe0,0x2, 0x5, 0xe1,0xea,0x4f, +0x7f,0x98,0xe9,0xff,0xc7,0xff,0xf0,0x0, 0xa6,0x8f,0xf0,0x0, 0x15,0x81,0xf8,0xe, +0x3d,0xad,0xf0,0x0, 0x18,0x3, 0xf8,0x40,0x3e,0x6b,0x7f,0xe, 0xf2,0x0, 0xcd,0x81, +0xf8,0x40,0x8c,0x30,0xe8,0x40,0x8b,0xa0,0xe0,0x2, 0x1, 0x43,0xe8,0x0, 0x8f,0xd, +0xe0,0x2, 0x27,0x3f,0x67,0x8a,0xf0,0x40,0x3d,0xff,0xe0,0x2, 0x3, 0xc1,0x3b,0x6f, +0xc3,0x7f,0xe2,0x1, 0xc3,0x7f,0x67,0xe, 0xe8,0x17,0x3b,0x2b,0xe8,0xe, 0x3f,0x1d, +0xf2,0x1, 0xc3,0xff,0xf0,0x17,0x3b,0x9e,0xf0,0x17,0x33,0xa1,0xe0,0x0, 0x1f,0x8d, +0x17,0x1, 0xf0,0x0, 0xc3,0x83,0xe0,0x3, 0x1d,0x85,0xe8,0xe, 0x3f,0x1d,0xc3,0x1, +0xf0,0x17,0x3b,0x9f,0x7f,0x9, 0x3a,0x6e,0xf0,0x0, 0x7d,0x8b,0xf8,0x40,0x3a,0xe8, +0xe8,0x40,0x3a,0xe0,0x17,0x5, 0x3b,0x1b,0xf8,0x40,0x3d,0xe7,0xf0,0x0, 0x78,0xc, +0xf0,0x40,0x3f,0x67,0x0, 0x9e,0xe0,0x0, 0x27,0xc9,0x16,0x81,0xe8,0xd, 0x3e,0xd1, +0xe0,0x0, 0x26,0xc4,0xe0,0x2, 0x1e,0x3b,0xe8,0x7, 0x87,0xd9,0x86,0x8c,0xc7,0x81, +0xc6,0x81,0xae,0x8c,0xe8,0x7, 0xaf,0xd9,0x8e,0x4, 0xe0,0x2, 0x2e,0x6, 0xe8,0x0, +0x8f,0x8d,0xaf,0x84,0xc2,0x82,0xf0,0x40,0x3d,0xf5,0xc2,0x1, 0xe0,0x1, 0x1, 0x60, +0xf0,0x40,0x8d,0x15,0xf0,0x0, 0x88,0x5, 0xf8,0xf, 0x3a,0xaa,0xe2,0x0, 0xcf,0x80, +0xf8,0x2, 0x3c,0x2a,0xf8,0xf, 0x3d,0x28,0xe2,0x1, 0xc7,0xff,0xf8,0xd, 0x3f,0x20, +0xe2,0x1, 0xc1,0x7f,0xe0,0x62,0x3d,0x2f,0xe8,0x3, 0x3b,0xa0,0xe2,0x0, 0xce,0x80, +0xf0,0xf, 0x38,0x27,0xe2,0x1, 0xc1,0xff,0xe2,0x1, 0xc7,0xff,0xe1,0x2d,0x39,0x1e, +0xe0,0x63,0x3d,0x2f,0x2e,0xd8,0xe1,0x2f,0x39,0x9e,0x2f,0xd5,0xf1,0x2d,0x3e,0x23, +0xf1,0x2f,0x3e,0x22,0xe7,0xff,0x2e,0xb9,0xe9,0x2d,0x39,0x1c,0x2e,0x84,0xe9,0x2d, +0x39,0x9c,0x26,0xc9,0x16,0x82,0xe8,0xd, 0x3e,0xd1,0x26,0xc5,0xe0,0x2, 0x1d,0xfd, +0xe0,0x1, 0x1e,0x72,0x8e,0xdb,0xa5,0x8c,0xf0,0xc, 0x3c,0x3d,0xe8,0xd, 0x3e,0xba, +0x3e,0x17,0xe8,0xd, 0x3e,0x90,0x36,0x21,0x36,0xa1,0x3e,0x1b,0x3e,0x9b,0xf0,0x0, +0x91,0xc, 0xf0,0x0, 0x92,0xd, 0x16,0x82,0xe1,0x2c,0x3e,0xa2,0xe8,0x40,0x3d,0xe0, +0xe8,0x40,0x3d,0x6a,0xe1,0x2d,0x3e,0xa3,0x3c,0xe7,0xe8,0x40,0x3c,0x68,0x7f,0x3, +0x7f,0x84,0xf0,0x0, 0x78,0x81,0xf0,0x0, 0x7a,0x82,0x7e,0x8, 0x7e,0x8d,0xf0,0x0, +0x78,0x7, 0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x7a,0x5, 0xdc,0x8b,0xf0,0x0, 0x61,0x6, +0xf0,0x0, 0x62,0x5, 0xe2,0xff,0xcc,0x7f,0xf8,0xc, 0x39,0x14,0xe4,0xd, 0x36,0x4f, +0xf0,0x0, 0x60,0x7, 0x3e,0x9c,0x16,0x0, 0xe0,0x6c,0x39,0xa8,0x36,0x81,0xf8,0x40, +0x39,0x74,0xe8,0x40,0x3d,0xe0,0xe8,0x40,0x3d,0x6a,0xe0,0x43,0x3e,0x9d,0xf8,0x40, +0x3d,0x64,0x3c,0xe7,0xe8,0x40,0x3c,0x68,0xe8,0x7a,0x3b,0x22,0x7e,0x7, 0xde,0x39, +0x65,0x8d,0x66,0x88,0x7c,0x10,0x3e,0xdb,0x7e,0x8f,0xde,0x7f,0x67,0x3, 0x67,0x84, +0xf0,0x0, 0x60,0x81,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x61,0x87,0xf0,0x0, 0x62,0x5, +0xf0,0x0, 0x62,0x82,0xe0,0x1, 0x24,0x1d,0xf8,0x40,0x3a,0x6a,0xe0,0x2, 0x1e,0xc1, +0xe0,0x0, 0x1d,0xb1,0x9e,0xd, 0x9e,0x8b,0xe2,0x0, 0xce,0xb, 0xe8,0x7a,0x3c,0xa4, +0xe2,0x0, 0xce,0x8a,0xf8,0x40,0x3a,0x6a,0xe0,0x0, 0x2, 0xee,0xe0,0x2, 0x1e,0x5d, +0xe0,0x0, 0x14,0x51,0x8e,0x8c,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1, 0xa, 0xe8,0x8, +0x3c,0x34,0xe0,0x0, 0x14,0xe4,0x7f,0x3, 0xf0,0x0, 0x78,0x81,0xf0,0x0, 0x79,0x87, +0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xdb,0x4, 0xf0,0x0, 0x61,0x87,0x67,0x3, 0xf0,0x40, +0x39,0xf8,0xf0,0x0, 0x60,0x81,0xf0,0x0, 0x62,0x82,0xe7,0xfe,0x5, 0x2d,0x65,0x90, +0x17,0x80,0x66,0xf, 0xe1,0x3a,0x3d,0x8f,0xf0,0x40,0x3d,0x7c,0xe7,0xfe,0x5, 0x9e, +0xc2,0x82,0xf0,0x40,0x3d,0xf5,0xc2,0x1, 0xe7,0xfe,0x1, 0xa4,0xf0,0x0, 0x65,0x8b, +0x17,0x81,0xf0,0x0, 0x60,0xc, 0xe8,0xf, 0x3f,0x9b,0xf0,0x40,0x3d,0xef,0xf0,0x0, +0xc0,0x2, 0xf2,0x1, 0xc5,0xff,0xf0,0x0, 0x66,0x89,0xe7,0xfd,0x0, 0xb9,0x67,0x8a, +0xf8,0x0, 0xad,0x8d,0xf0,0x40,0x3d,0xff,0xe7,0xfd,0x4, 0xc3,0xe0,0x0, 0xc0,0x40, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe8,0x0, 0x8e,0x8d,0x3f,0xec,0xe2,0x1, 0xc7,0xff, +0x3f,0xfd,0x3d,0xec,0x5, 0x82,0x3d,0xed,0xea,0x4f,0x7e,0x98,0xe9,0xff,0xc6,0xff, +0xe2,0x1, 0xc5,0xff,0xa7,0x8d,0x0, 0x8a,0xe8,0x0, 0x8e,0xd, 0x3e,0x7d,0x1, 0x9, +0xc7,0x81,0x3b,0x7f,0xe7,0xfd,0x1, 0x68,0x8e,0x4, 0x8e,0x8f,0x3e,0xfc,0x1, 0xf5, +0xad,0x8f,0x0, 0xf7,0xe0,0x2, 0x1d,0xdd,0xe0,0x0, 0x14,0x51,0x8e,0x8b,0xe2,0x0, +0xce,0x81,0xe7,0xff,0x1, 0x96,0x15,0x80,0x16,0xbc,0x7d,0x90,0x66,0xf, 0x2e,0x16, +0x16,0x3, 0xe1,0x2c,0x3e,0x23,0x26,0x16,0x65,0x88,0x25,0x94,0x16,0xb4,0x27,0x85, +0x67,0x8d,0x14,0x1e,0xe7,0xff,0x2f,0x85,0x3c,0x6d,0xe7,0xff,0x0, 0x82,0xf8,0x40, +0x39,0x74,0xe8,0x74,0x3d,0x22,0xe7,0xfe,0x0, 0xe3,0x16,0xb2,0x0, 0xf1,0x3e,0xe8, +0x0, 0xe6,0x16,0x4, 0xe1,0x23,0x3e,0x23,0x21,0x85,0x66,0x8, 0x26,0x3, 0x16,0xba, +0x0, 0xe7,0xe2,0x0, 0xc9,0x2, 0x14,0x3c,0xe7,0xfe,0x5, 0xeb,0x0, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x38,0xe0,0x0, 0x1f,0x8e,0xf0,0x0, 0x8c,0xf, 0xf0,0x1, +0x24,0x5c,0xe0,0x0, 0x1e,0xd, 0xe0,0x2, 0x1f,0xfd,0x8b,0xc, 0x8a,0xdf,0x89,0x1c, +0xe0,0xf, 0x3b,0x35,0xe0,0x1, 0x1f,0x72,0x14,0xff,0xa2,0xe, 0x3f,0x92,0xe8,0x9, +0x3c,0x98,0x37,0xa1,0xe2,0x1, 0xc4,0xff,0x3f,0x94,0x34,0xa1,0x94,0xf, 0x39,0xe6, +0x3b,0xe2,0x3c,0x9c,0xe0,0x0, 0x0, 0xc5,0x3e,0x79,0xe0,0x0, 0x1, 0x50,0x8f,0x2c, +0x8f,0xbc,0xe0,0xd, 0x3f,0x35,0x3d,0x6e,0x3e,0x9f,0x36,0xa1,0x3e,0x94,0x96,0x8d, +0xe4,0xb, 0x37,0x28,0x3e,0xf8,0xe0,0x6d,0x3a,0x28,0x3c,0x6d,0x3e,0xe6,0xe2,0x1, +0xc6,0xff,0x3f,0x7d,0x5, 0x82,0x3d,0x66,0x3e,0xe3,0xe4,0xb, 0x35,0xc8,0xe2,0x1, +0xc6,0xff,0x3d,0xfd,0x3b,0x6a,0xe2,0x1, 0xc3,0x7f,0x3, 0x82,0x3f,0x63,0x39,0xee, +0x3f,0x62,0xe2,0x1, 0xc7,0x7f,0x3f,0xfe,0xe2,0x1, 0xc1,0xff,0x3d,0xef,0xe4,0xd, +0x37,0xa8,0x5, 0x82,0x3d,0xe2,0x3f,0x67,0xe4,0xd, 0x36,0xc8,0xe2,0x1, 0xc7,0x7f, +0x3e,0xfe,0x39,0x6b,0xe2,0x1, 0xc1,0x7f,0x3, 0x82,0x3f,0xe7,0xe0,0xe, 0x39,0xa6, +0xe2,0x0, 0xcf,0x7, 0x3b,0xef,0xe2,0x1, 0xc3,0xff,0xc6,0x2, 0x2, 0x7, 0xe0,0xf, +0x3b,0xa2,0xe2,0x0, 0xcf,0x87,0xe7,0xff,0x5, 0x39,0xe0,0x2, 0x1f,0xc1,0xe0,0x3, +0x17,0x74,0xb7,0xf, 0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0x14,0x83,0x34,0x21,0xe0,0x2, +0xd9,0xff,0x3b,0xf2,0x15,0x80,0xe0,0x43,0x3c,0x18,0x3e,0xeb,0x4, 0xa1,0x39,0xf6, +0x4, 0x9a,0x3f,0x66,0xe0,0xf, 0x3f,0x35,0x16,0x1, 0x3f,0x92,0x37,0xa1,0x3f,0x94, +0x97,0x8f,0x3e,0x1d,0x3f,0xf8,0xc7,0x1, 0x3f,0xec,0xe2,0x1, 0xc7,0xff,0x16,0x1, +0xe2,0x1, 0xc7,0x7f,0x3e,0x1b,0xe0,0x6d,0x3a,0x2f,0x3f,0x73,0x3d,0xec,0xe2,0x1, +0xc5,0xff,0x5, 0xe9,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x39,0x77,0x5, 0xe1,0xe0,0x2, +0x1f,0xdd,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x5, 0xa0,0xe0,0x2, 0x1f,0x41,0x9f,0x8e, +0xe2,0x7, 0xcf,0xe7,0x2, 0x83,0xc7,0x81,0xb7,0x8e,0xf7,0xff,0x24,0x45,0xe4,0x0, +0xc6,0x83,0xe0,0xf, 0x35,0xa1,0x3e,0xff,0x5, 0x20,0xe0,0x0, 0x1f,0x31,0xe0,0x2, +0x1e,0xc1,0x9f,0x8e,0x16,0x0, 0xe2,0x3, 0xcf,0xf3,0xb6,0xd, 0xe7,0xff,0x2, 0xb4, +0xc7,0x81,0xb7,0x8e,0xe7,0xff,0x0, 0xb0,0x1, 0x69,0xe0,0x2, 0x1f,0x41,0x9f,0x8e, +0xe2,0x0, 0xcf,0x82,0x5, 0x83,0xc7,0xfe,0xb7,0x8e,0xe0,0x0, 0x1f,0x31,0x9f,0x8e, +0xe2,0x3, 0xcf,0xf3,0x2, 0xdb,0x0, 0xd8,0xe0,0x2, 0x1f,0x41,0x9f,0x8e,0xe2,0x7, +0xcf,0xe7,0x2, 0x83,0xc7,0x82,0xb7,0x8e,0x17,0x0, 0xe0,0x0, 0x1f,0xb1,0xb7,0xf, +0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe8,0x40,0x3d,0xe8,0xe8,0x40,0x3e,0xe8,0xe7,0xff, +0x0, 0xb8,0xe0,0x2, 0x1f,0xc1,0x9c,0xf, 0x17,0x8a,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x2, 0x1b,0xc3,0x17,0x80,0xe0,0x7, +0xaf,0xc7,0xe0,0x2, 0x1f,0xdd,0xe0,0x0, 0x1a,0xe, 0x8b,0xf, 0xdf,0x2, 0x8f,0x84, +0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x5, 0xf4,0x14,0x3, 0xdd,0xf, 0xeb,0xe6,0x7f,0x90, +0x7f,0x81,0xe0,0x2, 0x23,0x2b,0xe2,0x0, 0xcb,0x1, 0x5, 0x86,0x8f,0x8f,0xe2,0x0, +0xcf,0x86,0xe0,0x2, 0x2, 0xa3,0xf0,0x0, 0x88,0x84,0xe0,0x0, 0x1a,0x8d,0xe8,0x40, +0x3b,0x71,0xe0,0x2, 0x1, 0x70,0xe0,0x7, 0x8f,0xd7,0xfa,0x13,0x7c,0x11,0xf0,0xf, +0x38,0xaf,0xc7,0x81,0x3b,0x7f,0xe0,0x3, 0x1, 0x1a,0xe0,0x2, 0x1f,0xbb,0x8f,0x8f, +0xe8,0x0, 0x8f,0x8, 0xf0,0xf, 0x38,0xaf,0xc7,0x81,0x3f,0x7f,0x14,0x3, 0xe0,0x2, +0x1, 0x76,0xf0,0x3, 0x20,0x84,0x16,0x7f,0xe8,0xc, 0x3e,0x11,0xf0,0x3, 0x1c,0x85, +0xe2,0x1, 0xc6,0x7f,0xe0,0x0, 0xc6,0x1, 0xe8,0xc, 0x3e,0x19,0xf8,0x40,0x3b,0xe9, +0xf0,0x0, 0x13,0x0, 0xe9,0x80,0x8f,0x17,0xe8,0x40,0x3f,0xe6,0xe2,0x1, 0xc7,0xff, +0x3f,0x7f,0x3e,0xee,0x3, 0x83,0xe8,0x40,0x3e,0xe6,0xe8,0x40,0x3e,0x77,0xf0,0x40, +0x3b,0x6d,0xf2,0x1, 0xc3,0x7f,0x1, 0xef,0xf8,0x40,0x38,0xe6,0xf0,0x2, 0x23,0x5f, +0xe0,0x1, 0x1f,0xf2,0xfb,0xe6,0x7e,0x12,0xfb,0xe6,0x7d,0x91,0xf0,0x0, 0xa2,0xf, +0xe0,0x2, 0x1f,0xfd,0xf8,0x0, 0x89,0xc, 0xf8,0x0, 0x88,0xb, 0xf0,0x0, 0x10,0x80, +0xf0,0x0, 0x8a,0xdf,0xe8,0x40,0x3b,0x62,0xe8,0x40,0x38,0xe0,0x16,0x1, 0xf0,0x1, +0x11,0xff,0xf8,0x40,0x3d,0x61,0x3d,0x62,0xe0,0x0, 0x1f,0xd, 0xe8,0x40,0x3f,0xe9, +0xf8,0x40,0x3e,0xea,0x15,0x80,0x0, 0x85,0xf0,0x40,0x3b,0xff,0xc7,0x2, 0x1, 0x2b, +0xe1,0x80,0x8e,0x9f,0x3e,0xfc,0x1, 0xf9,0x8c,0x8e,0xc5,0x81,0xe2,0x1, 0xc5,0xff, +0xe2,0x0, 0xcd,0x81,0x8c,0x1e,0xe8,0xd, 0x3c,0xb5,0xe0,0x6a,0x39,0x28,0x3e,0x98, +0xe0,0x63,0x39,0x29,0xf2,0x0, 0xcb,0x1, 0x36,0xa1,0xe8,0xd, 0x3e,0x94,0xe0,0x1, +0x1, 0x25,0x96,0x8d,0xc7,0x2, 0xe8,0x40,0x3e,0xfd,0xe0,0x6a,0x3a,0x28,0xe8,0x40, +0x3e,0xfd,0xe0,0x63,0x3a,0x29,0xe8,0x40,0x3e,0xfd,0xe0,0x7d,0x3a,0x2d,0xf0,0x40, +0x3b,0xff,0x1, 0xd7,0x25,0x8a,0xf0,0xf, 0x30,0xa1,0x3f,0x97,0xf0,0x0, 0xc0,0x81, +0xa9,0x8f,0xf2,0x1, 0xc0,0xff,0xad,0x1f,0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0xe8,0x40, +0x3e,0x76,0xe7,0xff,0x5, 0xbb,0xf2,0x0, 0xc8,0x81,0xf0,0xa, 0x30,0xa1,0xe0,0x1, +0x1, 0x6b,0x17,0xff,0xe8,0x0, 0xaf,0x8c,0xe8,0x0, 0xaf,0x8b,0xe0,0x2, 0x1c,0xc3, +0xe0,0x0, 0x1c,0xd, 0xf0,0x7, 0xa8,0xc7,0xf0,0x0, 0xa8,0x84,0xe0,0x2, 0xd9,0xa, +0x88,0x84,0xe8,0x0, 0xa8,0x88,0xe0,0x1, 0x20,0xdf,0x12,0x0, 0xc2,0x1, 0xe2,0x1, +0xc2,0x7f,0x38,0xf4,0xe0,0x0, 0x1b,0xd, 0xe0,0x0, 0x15,0xe4,0xe0,0x0, 0x1, 0x4a, +0x8c,0x86,0x8d,0x16,0x3b,0xe9,0x39,0xea,0xe0,0x40,0x3e,0x64,0xe0,0xf, 0x36,0x21, +0xe0,0xe, 0x3a,0x9f,0x8e,0x8e,0x8f,0x1e,0xe0,0x8, 0x3b,0xad,0xe2,0x0, 0xcc,0x0, +0xe0,0xf, 0x3c,0xad,0x3e,0xa9,0xe0,0x8, 0x39,0xae,0xe2,0x1, 0xc6,0xff,0xe2,0x1, +0xc7,0xff,0xe0,0x6f,0x3d,0x2d,0xe2,0x0, 0xcc,0x0, 0xe0,0xd, 0x3d,0x2e,0x3f,0x2a, +0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc6,0xff,0xe0,0x6d,0x3d,0x2e,0x3c,0x6d,0x39,0x6f, +0xe2,0x1, 0xc1,0x7f,0xe2,0x1, 0xc4,0x7f,0x39,0x78,0x3f,0x6d,0xc6,0x1, 0x3e,0xeb, +0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc6,0x7f,0x3, 0x82,0x3f,0xee,0x3f,0x6f,0xe2,0x1, +0xc7,0x7f,0x3f,0x7d,0x5, 0x82,0x3f,0xeb,0x38,0xfc,0x3d,0xef,0xe2,0x1, 0xc5,0xff, +0x1, 0xc6,0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0x38,0xf4,0xc3,0x2, 0xe7,0xff,0x1, 0xba, +0xe2,0x0, 0xcd,0xe4,0x17,0x80,0xe0,0x6f,0x39,0xab,0x3d,0xef,0x67,0x1, 0xad,0x8e, +0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xfa,0x13,0x7c,0x11,0xf0,0x0, 0x88,0x84, +0xe0,0x0, 0x1a,0x8d,0xe7,0xfd,0x0, 0xf7,0xf2,0x1, 0xc9,0x7f,0xe7,0xfe,0x1, 0x5b, +0xe0,0xd, 0x3c,0xa6,0xe0,0x43,0x3e,0x9d,0xe2,0x0, 0xce,0x80,0xf0,0x2, 0x39,0x29, +0xe8,0xd, 0x3c,0xa2,0xe2,0x1, 0xc1,0x7f,0xe0,0x1e,0x3c,0x21,0xe2,0x1, 0xc6,0xff, +0xe0,0x6d,0x3d,0x22,0xf8,0x43,0x3f,0x1e,0x39,0x6d,0xf2,0x0, 0xcf,0x0, 0xe8,0xd, +0x3c,0x20,0xf0,0x1e,0x38,0x28,0xe2,0x1, 0xc6,0xff,0xf2,0x1, 0xc7,0x7f,0xe8,0x6d, +0x3d,0x2e,0x3e,0x92,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf3,0xe8,0x40,0x39,0x63, +0xe0,0x62,0x3c,0xad,0xe8,0x40,0x3e,0xf3,0xe0,0x6a,0x3c,0xa8,0xe8,0x40,0x3e,0xf3, +0xf0,0x40,0x39,0xe2,0xe0,0x63,0x3c,0xa9,0xe7,0xfe,0x0, 0x88,0xeb,0xe6,0x7d,0x90, +0xea,0x13,0x7e,0x11,0xeb,0xe6,0x7e,0x92,0xeb,0xe6,0x7f,0x11,0x15,0x7f,0xe0,0x0, +0x14,0xe4,0xac,0x8b,0xaf,0x8c,0xad,0xd, 0xad,0xe, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe0,0x0, 0x1f,0x85,0x8f,0x8f,0x27,0x96,0xe0,0x10,0x8f,0x25,0xe2,0x0, +0xcf,0x10,0x2, 0xae,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe4,0x0, 0xc7,0x8a,0x3f,0x65, +0x3f,0x95,0x0, 0x86,0xe0,0x10,0x8e,0xae,0xe2,0x0, 0xce,0x90,0x2, 0xa1,0x3f,0x7f, +0xc7,0xa, 0x1, 0xf9,0xfa,0x13,0x7c,0x11,0x14,0x1, 0xdb,0x6f,0xf0,0x0, 0x88,0x84, +0xe7,0xfd,0x0, 0x89,0x87,0x7, 0x87,0x97,0xe8,0x0, 0xaf,0xc, 0xe8,0x0, 0xaf,0x8b, +0xe7,0xfe,0x0, 0x96,0x3d,0xe1,0xe7,0xfe,0x0, 0xfb,0xfb,0xe6,0x7e,0x12,0xfb,0xe6, +0x7d,0x91,0xe8,0x40,0x3d,0x61,0xe7,0xfe,0x0, 0x86,0x14,0x1, 0x0, 0xe7,0xfa,0x13, +0x7c,0x11,0x14,0x3, 0x0, 0xe3,0x0, 0x0, 0xe0,0x1, 0x1f,0x8e,0x8f,0x8f,0xe0,0x1, +0x27,0x82,0x8, 0xb4,0xf7,0xff,0x11,0x7f,0xf0,0x12,0x39,0x1f,0xf0,0x0, 0x12,0x1, +0xf2,0x1, 0xc1,0x7f,0xf0,0x14,0x3a,0x19,0xf0,0x0, 0x10,0xa, 0xe0,0x2, 0x1a,0x5e, +0xf4,0x0, 0xc1,0xa, 0xf2,0x1, 0xc2,0x7f,0x11,0xa, 0xf0,0x10,0x38,0x39,0xe8,0x2, +0x39,0x34,0x10,0xff,0xf0,0x1, 0xc1,0x52,0xf0,0x10,0x38,0x14,0x38,0x9a,0xf0,0x2, +0x19,0xd9,0xf0,0x12,0x39,0x14,0x39,0x14,0xe0,0x1, 0x11,0xff,0xf0,0x0, 0xc0,0x4, +0x38,0xa9,0x3c,0xfa,0x3, 0xa4,0xe8,0x0, 0x8e,0x43,0xe8,0x0, 0x8f,0x80,0xf8,0x40, +0x38,0xe3,0xe0,0x2f,0x3f,0x8c,0xf0,0x40,0x3b,0xe9,0xe1,0x35,0x3e,0x3, 0x27,0x83, +0xf0,0x0, 0x2a,0x9c,0xf0,0x40,0x3b,0x61,0xf2,0x1, 0xc3,0x7f,0x3e,0xe2,0x17,0x0, +0x0, 0x89,0x8f,0xcd,0xc7,0x1, 0xe0,0x2f,0x3f,0x8c,0xe8,0xf, 0x3f,0xd5,0xc6,0x8a, +0x2f,0x8c,0xe8,0x40,0x3f,0x76,0xe8,0x17,0x3f,0x14,0x1, 0xf4,0xf0,0x0, 0xc1,0x8a, +0xf8,0x40,0x39,0xf2,0x1, 0xd7,0xa, 0x61,0x17,0x8a,0x3f,0xbc,0xf4,0x0, 0xc3,0x8a, +0x3f,0x94,0xe0,0x2, 0xc7,0xac,0x8f,0x8f,0x2f,0x83,0xe8,0x11,0x3a,0x17,0x17,0xa, +0x3f,0x38,0xe8,0x0, 0x8f,0xc1,0x3f,0x1b,0xaf,0xce,0xe8,0xf, 0x3a,0x17,0xe8,0x0, +0x9e,0x91,0xe8,0x0, 0x9e,0x1, 0xb6,0x9e,0xf0,0x0, 0xc1,0x8a,0xb6,0xe, 0xf8,0x40, +0x39,0xf2,0x8e,0xdf,0xc4,0x1, 0xae,0xde,0xe2,0x1, 0xc4,0x7f,0x8e,0xef,0xae,0xee, +0x8e,0xff,0xae,0xfe,0xe0,0x1, 0x8f,0x8f,0xe0,0x1, 0xaf,0x8e,0xe7,0xff,0x1, 0xab, +0x0, 0xd3,0x38,0x82,0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1f,0x52,0x8f,0x8f,0x8f,0xe, +0x2f,0x9a,0x2f,0x19,0xe0,0x0, 0x1f,0xe, 0x8e,0x8e,0xe0,0x0, 0x1f,0x13,0x8f,0xe, +0x3e,0xfe,0x5, 0x90,0xe0,0x2, 0x1f,0x51,0xe0,0x2, 0x1e,0xd0,0x8e,0xe, 0xe0,0x2, +0x1f,0x5f,0xae,0xd, 0x8e,0xe, 0x3e,0x7f,0x2, 0xa2,0xea,0x22,0x7f,0xba,0x17,0x0, +0xaf,0xf, 0x38,0x82,0xe0,0x0, 0x1e,0x8e,0xe0,0x0, 0x1d,0x8d,0x8e,0xd, 0xe0,0x0, +0x1e,0x93,0x8e,0x8d,0x3e,0xfc,0xe0,0x2, 0x1e,0xd0,0x3, 0x86,0x15,0x1, 0xe2,0x0, +0xce,0x1, 0xad,0xd, 0x1, 0x1a,0xe0,0x2, 0x1e,0x51,0x8e,0xc, 0x3e,0x7e,0x3, 0xe0, +0xaf,0xd, 0xe0,0x2, 0x1f,0x5f,0x8e,0xe, 0x3e,0x7f,0x5, 0xe0,0xea,0x22,0x7e,0x3a, +0x8d,0x8c,0x8e,0x8d,0x3e,0xfb,0x5, 0xde,0xaf,0x8e,0xc5,0x81,0xe0,0x0, 0x1f,0xbe, +0xad,0x8c,0x17,0x1, 0xaf,0xf, 0x38,0x82,0x8d,0xb, 0xe2,0x0, 0xcd,0x1, 0x5, 0x87, +0xe0,0x2, 0x1e,0x7d,0x8e,0x4c,0xc6,0x7e,0x3e,0x7a,0x2, 0x5e,0x8d,0x9b,0xe2,0x0, +0xcd,0x81,0x5, 0x87,0xe0,0x2, 0x1e,0x7d,0x8e,0x5c,0xc6,0x7e,0x3e,0x7b,0x2, 0x54, +0x16,0x0, 0xae,0xd, 0x0, 0xd1,0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1e,0x5f,0x8d,0x8f, +0x8f,0xc, 0xe0,0x0, 0x1e,0xbe,0x17,0x80,0x3f,0x7b,0xaf,0x8d,0x3, 0x9e,0xe0,0x2, +0x1f,0xd2,0xe0,0x2, 0x1f,0x51,0x8f,0x8f,0x8f,0xe, 0xe0,0x2, 0x1d,0x50,0x3f,0xfe, +0x5, 0x9b,0xaf,0x8a,0x2f,0x84,0x17,0x81,0xaf,0x8a,0x17,0x81,0xea,0x22,0x7f,0x3b, +0x8d,0xe, 0x3d,0x7f,0x3, 0x94,0xad,0x8c,0x17,0x81,0xe0,0x2, 0x1e,0x4f,0xc5,0x1, +0xaf,0x8c,0xad,0xe, 0xaf,0x8d,0x38,0x82,0xea,0x22,0x7f,0x3b,0xaf,0x8e,0xe0,0x2, +0x1f,0x4f,0xaf,0x8e,0x38,0x82,0x3f,0xee,0xaf,0xa, 0x0, 0xe5,0x17,0x80,0xaf,0x8e, +0x38,0x82,0xe0,0x3, 0x1f,0x17,0x8f,0x8e,0xe2,0x1, 0xcf,0xf9,0x2, 0x83,0xc7,0x81, +0xaf,0x8e,0x38,0x82,0xe0,0x3, 0x1c,0x3d,0xe0,0x4, 0x15,0x6a,0x14,0x80,0xe0,0x4e, +0x0, 0xa3,0x0, 0x0, 0xe0,0x3, 0x1c,0xbd,0xe0,0x2, 0x1f,0x5f,0x8d,0x9, 0x8c,0xe, +0xe0,0xf, 0x3c,0x9a,0x17,0x0, 0xaf,0x2f,0x24,0x1b,0x15,0xff,0x3d,0x98,0xe2,0x1, +0xc5,0xff,0xc5,0x81,0x17,0x28,0x3f,0x3a,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1f,0xde, +0x3f,0x19,0x3d,0x9f,0x96,0xf, 0x96,0x9f,0xc7,0x8a,0xe0,0x1, 0xb6,0x1e,0x3f,0xfb, +0xc7,0x4, 0xe0,0x1, 0xb6,0x8e,0x1, 0xf7,0xe0,0xf, 0x3c,0x9a,0xac,0x2f,0xc5,0x1, +0xe2,0x1, 0xc5,0x7f,0xe2,0x0, 0xcd,0xf, 0x1, 0x18,0xad,0x9, 0xe0,0x0, 0x16,0x0, +0xe0,0x3, 0x1f,0x3c,0xe0,0x3, 0x1d,0x3b,0xe1,0x80,0x8e,0x9e,0x3f,0xec,0xe2,0x1, +0xc7,0xff,0x3e,0xff,0x3d,0xed,0x3, 0x82,0x3d,0xec,0x3f,0x7a,0x3e,0x6b,0xe2,0x1, +0xc6,0x7f,0x1, 0xf3,0xae,0x19,0x38,0x82,0x17,0x80,0xaf,0x89,0x0, 0xe8,0xf0,0x3, +0x1b,0x3c,0xf0,0x3, 0x1a,0x3a,0xf0,0x3, 0x19,0x3b,0xf0,0x3, 0x19,0xbd,0xf0,0x0, +0x12,0x80,0xf0,0x0, 0x13,0xcf,0xe9,0x80,0x8f,0x96,0x27,0xb5,0x15,0x7f,0x3d,0x1f, +0xe2,0x1, 0xc5,0x7f,0xe8,0xa, 0x3d,0x15,0x35,0x22,0xc5,0x16,0xe8,0xa, 0x3d,0x13, +0xe8,0x40,0x3d,0xe4,0x0, 0x83,0x3d,0x7b,0x1, 0x26,0x9e,0xb, 0x9e,0x9b,0xe0,0xf, +0x3c,0x2c,0xe3,0xff,0xc7,0xff,0xf0,0x43,0x38,0x9f,0xe0,0xe, 0x3c,0xad,0xf2,0x0, +0xc8,0x80,0xe3,0xff,0xc7,0x7f,0x3e,0x28,0xf0,0x43,0x38,0x9e,0xe3,0xff,0xc6,0x7f, +0xe0,0x6f,0x3d,0x2c,0x3e,0xa9,0xf2,0x0, 0xc8,0x80,0xe3,0xff,0xc6,0xff,0xe0,0x6e, +0x3d,0x2d,0xf1,0x2f,0x3b,0xaf,0xc5,0x84,0xf1,0x2e,0x3b,0xae,0x27,0xdd,0x27,0x5c, +0x14,0x1, 0x38,0x82,0xf8,0x40,0x3b,0x72,0xf0,0x0, 0xc2,0x28,0xf0,0x0, 0xc2,0x8a, +0x1, 0xc3,0x14,0x0, 0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfd, +0xc0,0x60,0xe0,0x2, 0x1e,0xdf,0xea,0x22,0x7f,0xb8,0xf0,0x0, 0x8d,0xd, 0x7f,0x8b, +0xf0,0x0, 0x25,0xf, 0x97,0x8f,0xc7,0x81,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0xe4, +0xe0,0x3, 0x5, 0xc1,0x66,0x8b,0xe0,0x0, 0x17,0xe4,0xb7,0x8d,0x0, 0x83,0xf0,0x0, +0xb5,0xf, 0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0xdf,0xe2,0x0, 0xcf,0x81,0xea,0x22, +0x7f,0xb6,0x7f,0x8a,0xe0,0x8, 0x1, 0xc, 0x8f,0x8f,0xe0,0x3, 0x2f,0xa7,0xe0,0x2, +0x1f,0xcf,0x8f,0x8f,0x7f,0x87,0xe0,0x3, 0x2f,0x9c,0xe0,0x0, 0x1f,0xaa,0xe0,0x2, +0x1e,0xe2,0x9e,0xf, 0x9f,0xd, 0x9e,0xf, 0x9d,0x8f,0xe0,0xe, 0x3e,0x2e,0xe2,0x1, +0xc7,0x7f,0xe0,0x1, 0x1f,0xe8,0x7f,0x5, 0x8e,0xf, 0x67,0x5, 0xe2,0x0, 0xce,0x2, +0xc7,0x2, 0x66,0x5, 0xe2,0x1, 0xc7,0x7f,0xb5,0x8d,0x17,0x80,0xe0,0x2, 0x1e,0xc9, +0xe0,0x6c,0x39,0x2e,0x17,0x0, 0x7e,0x5, 0xaf,0xd, 0x7f,0xa6,0x7f,0xa7,0x7f,0xa8, +0x7f,0xa9,0x7f,0xaa,0x7f,0xab,0x7f,0xac,0x7f,0xad,0x7f,0xae,0x7f,0xaf,0xf0,0x2, +0x2d,0x7e,0xe0,0x1, 0x1f,0x8e,0x89,0xf, 0x7f,0x91,0xe0,0xb, 0x21,0x66,0x11,0xff, +0xea,0x21,0x7f,0x14,0x39,0x92,0xf0,0x40,0x3c,0xee,0xea,0x22,0x7f,0xac,0xe2,0x1, +0xc1,0xff,0xea,0x22,0x7e,0xa0,0xea,0x22,0x7d,0xc, 0xea,0x21,0x7d,0xf8,0xea,0x21, +0x7e,0x8, 0xc1,0x81,0xe8,0x40,0x3f,0x69,0x39,0x9f,0x14,0x80,0x14,0x0, 0x12,0xff, +0xe0,0x0, 0x12,0x1, 0xe1,0x80,0xac,0x9f,0xc7,0xa, 0x3f,0xf3,0xe0,0x40,0xaa,0xee, +0xe1,0x80,0xac,0x9d,0xe1,0x80,0xb4,0x1a,0xe1,0x80,0xb4,0x1b,0xe1,0x80,0xaa,0x1c, +0x1, 0xf2,0xe0,0x0, 0x1f,0x51,0x7f,0x17,0xac,0x8e,0xf0,0xb, 0x25,0x3c,0x67,0x85, +0x66,0x85,0x37,0xa3,0xc7,0x94,0x7f,0x98,0xea,0x22,0x7f,0xa0,0x3b,0x6f,0xea,0x22, +0x7f,0x8c,0x7f,0x89,0xea,0x22,0x7f,0xac,0xe4,0x0, 0xc6,0x9e,0xf0,0x0, 0x63,0x7, +0x7f,0x8d,0xea,0x21,0x7f,0x88,0xf0,0x2, 0x1c,0x5e,0x7e,0x99,0x7f,0x93,0xe8,0x40, +0x3a,0x66,0xf8,0x40,0x3f,0x69,0x17,0x8a,0x3f,0xb4,0xf0,0xe, 0x3c,0x1f,0x81,0xce, +0xe2,0x0, 0xc1,0x8f,0x39,0xf2,0x3, 0xbd,0xf0,0x0, 0x14,0x8a,0xf0,0x19,0x3c,0xb3, +0xf8,0xb, 0x3c,0x19,0xe0,0x2, 0xc5,0xac,0x8c,0xb, 0xe2,0x0, 0xcc,0x1, 0xe0,0x4, +0x1, 0x28,0x64,0x89,0xe0,0x5, 0x31,0xa1,0x3c,0x95,0x95,0x89,0xc5,0x81,0xb5,0x89, +0x2c,0x10,0xea,0x20,0x7d,0xe0,0xea,0x21,0x7d,0x78,0xe0,0x9, 0x31,0xa2,0xf0,0x0, +0x93,0xe, 0x93,0x9e,0x3d,0x99,0x3d,0x15,0xf0,0x0, 0xb3,0xb, 0xb3,0x9b,0xb4,0xa, +0x21,0x18,0xe8,0x0, 0x8a,0xce,0xe8,0x40,0x3d,0xee,0x39,0xf5,0x17,0x1, 0x1, 0x89, +0xe0,0xa, 0x0, 0xda,0xe0,0x1, 0x8e,0xeb,0xc5,0x8a,0x39,0xfd,0xe0,0x2, 0x1, 0x31, +0x3e,0xee,0xe2,0x1, 0xc6,0xff,0x3e,0xf2,0x3d,0x6e,0x17,0x1, 0x3f,0x1a,0x4, 0xf3, +0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0xf0,0x40,0x3d,0x74,0xe7,0xff,0x2, 0xb6,0x12,0x8a, +0x3a,0xb2,0xe0,0x1, 0x14,0x40,0xe0,0x2, 0x1c,0xde,0x3d,0x65,0x3c,0x10,0xf8,0x40, +0x3c,0xee,0xe0,0x2, 0xd5,0x4f,0xf0,0xb, 0x25,0x77,0xe0,0x2, 0x1f,0xfd,0x12,0x7f, +0xe8,0x4, 0x3a,0x1a,0x8b,0xcf,0x8b,0x5f,0xe2,0x1, 0xc2,0x7f,0xc2,0x1, 0x33,0xa6, +0x33,0x26,0xe4,0x0, 0xc2,0xa, 0xea,0x22,0x7e,0xa0,0xc3,0xe0,0xc3,0x60,0x39,0xed, +0xea,0x16,0x7c,0x4c,0xe0,0x2, 0x1c,0xde,0xe0,0x43,0x3b,0x97,0xe0,0x43,0x3b,0x16, +0xe8,0x4, 0x3a,0x18,0xf0,0x0, 0x13,0xa0,0x8d,0x49,0xe0,0xf, 0x39,0x9a,0x8d,0x8f, +0xe0,0x0, 0x25,0xc6,0xe0,0x0, 0x21,0x44,0xe8,0x40,0x3f,0x69,0x3e,0xe8,0x17,0x80, +0x0, 0x8d,0xe2,0x0, 0xcd,0x82,0xe0,0x1, 0x1, 0x37,0xc7,0x81,0x3e,0x6f,0xe2,0x1, +0xc6,0x7f,0x3e,0x72,0xc7,0xa, 0xc6,0x8a,0x3, 0xb2,0xe2,0x0, 0xcd,0x81,0x1, 0xf2, +0x8e,0x4e,0x3e,0x7a,0x1, 0xf3,0xe4,0x0, 0xc7,0x8a,0x35,0x22,0xe2,0x1, 0x7e,0x98, +0x3e,0x9a,0xf0,0xe, 0x3c,0x9f,0x96,0xd, 0x97,0xe, 0xe8,0x40,0x3e,0xe7,0x3f,0x1c, +0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x1f,0x5, 0x5, 0x3b,0xfe,0x3e,0xee,0xe0,0x6d, +0x3d,0x27,0xe2,0x1, 0x7f,0x18,0xe8,0xf, 0x3f,0x99,0x3d,0x1e,0x97,0x1a,0x97,0x9f, +0xb6,0x89,0x3f,0x9e,0xe0,0x43,0x3f,0x9f,0xe2,0x0, 0xcf,0x9f,0xe8,0x40,0x3f,0x67, +0x5, 0x5, 0x3b,0x7f,0x3f,0x6f,0xe0,0x6e,0x3d,0x26,0xb7,0x19,0xc4,0x8a,0x3a,0x79, +0xe7,0xff,0x1, 0xb4,0xe8,0x40,0x3c,0xe9,0x3d,0x65,0xe0,0x2, 0xd4,0xdb,0xe0,0x1, +0x14,0xc0,0x3d,0x65,0x3c,0x90,0xe8,0x40,0x3c,0x69,0xe0,0x2, 0xd4,0xd3,0xe0,0x0, +0x21,0x40,0x12,0x7f,0x3a,0x12,0xe2,0x1, 0xc2,0x7f,0xc2,0x1, 0xe4,0x0, 0xc2,0xa, +0xe0,0x2, 0x1a,0xde,0xe8,0x40,0x3e,0xe9,0xe8,0x4, 0x3a,0x19,0xf7,0xff,0x13,0xfd, +0x13,0x80,0x13,0x0, 0xf7,0xff,0x13,0x7f,0x8f,0x4d,0x17,0x8a,0x3f,0xbe,0x3f,0x72, +0x3f,0x95,0xe0,0x2, 0xc7,0xac,0x3, 0xa1,0x87,0x8f,0xea,0x22,0x7c,0x2c,0xe8,0xf, +0x3f,0xd7,0xe2,0x1, 0xc7,0xfd,0xea,0x22,0x7c,0xa0,0xea,0x22,0x7d,0xc, 0xea,0x21, +0x7d,0xf8,0xea,0x21,0x7e,0x8, 0xe2,0x0, 0xcf,0x81,0xe0,0x3, 0x37,0x21,0x3c,0x1e, +0x3c,0x9e,0x3d,0x13,0x3d,0x93,0x3f,0x1c,0x1, 0x88,0xf0,0x0, 0xab,0x4d,0xab,0x88, +0xab,0x89,0xb3,0xa, 0xb3,0xb, 0xaf,0x8e,0xc6,0x8a,0x3e,0xf4,0x1, 0xd6,0xe0,0x2, +0x1f,0xdf,0x17,0x0, 0xf0,0x0, 0xad,0xf, 0xe0,0x3, 0x1f,0x97,0xaf,0xf, 0xe0,0x2, +0xc0,0x20,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x66,0x8a,0xc7,0xff,0xaf,0x8d,0xe7,0xfc, +0x0, 0xd8,0x67,0xb, 0xb7,0x8e,0xe7,0xfc,0x0, 0xc6,0xe0,0x2, 0x1f,0x5d,0x8f,0xe, +0xe0,0x6, 0x2f,0x44,0xe0,0x1, 0x1f,0xe, 0x89,0xe, 0x7f,0x11,0xe7,0xfd,0x29,0x1, +0xe0,0x0, 0x1e,0xd1,0xea,0x21,0x7f,0x14,0xf0,0x40,0x3c,0xee,0x7e,0x97,0xa9,0xd, +0xe7,0xfd,0x0, 0xa7,0x8e,0x4d,0x3e,0x7a,0xe7,0xfe,0x1, 0xc9,0xe4,0x0, 0xc7,0x8a, +0x35,0x22,0xe2,0x1, 0x7e,0x98,0x3e,0x9a,0xe0,0xe, 0x3c,0x1f,0x96,0xd, 0x97,0xe, +0xe8,0x40,0x3e,0xe7,0x3f,0x1c,0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x1f,0xe0,0x5, +0x2, 0x46,0xe2,0x1, 0x7f,0x18,0x3f,0x98,0x3d,0x1e,0x97,0x1a,0x97,0x9f,0xb6,0x89, +0x3f,0x9e,0xe0,0x43,0x3f,0x9f,0xe2,0x0, 0xcf,0x9f,0xe8,0x40,0x3f,0x67,0xe7,0xfe, +0x5, 0x5e,0x3f,0xf6,0x3f,0x66,0xe0,0x6e,0x3d,0x2f,0xe7,0xfe,0x0, 0xd8,0x3a,0xe3, +0xf0,0x0, 0x15,0x8a,0xf0,0x1b,0x3d,0xba,0xe8,0x1d,0x3f,0x98,0xf8,0xe, 0x3f,0x1b, +0xe0,0x0, 0x11,0x78,0x9d,0x9e,0x9d,0xe, 0xe8,0x0, 0x9c,0x9d,0xe8,0x0, 0x9c,0xd, +0x39,0x35,0xea,0x17,0x7f,0x30,0xe0,0x1c,0x39,0x1e,0x7f,0x81,0xef,0xfc,0xdf,0x8, +0xe0,0xe, 0x32,0xa2,0xea,0x20,0x7d,0xe0,0x3d,0x6e,0x3d,0x1b,0x9d,0x9a,0x3b,0xe8, +0x9d,0xa, 0xe8,0x0, 0x9c,0x9d,0xe8,0x0, 0x9c,0xd, 0x7f,0x10,0xef,0xfc,0xde,0xf8, +0xea,0x21,0x7d,0xf8,0xe0,0x16,0x32,0xa1,0xe8,0xb, 0x3d,0x96,0x91,0xb, 0x7c,0x14, +0x39,0x17,0xe3,0xff,0xc1,0x7f,0xe2,0x1f,0xc9,0x20,0x67,0x81,0xe0,0x3, 0x2, 0xd9, +0xb1,0xb, 0xf8,0xa, 0x3f,0x1b,0x65,0x8d,0xe8,0x0, 0x9e,0x9d,0xf8,0x0, 0x9d,0x8d, +0x94,0xa, 0x95,0x1a,0x3d,0x95,0xf8,0x0, 0x8e,0xed,0x8c,0x8b,0xf0,0x8, 0x3d,0xa8, +0x65,0x89,0xe0,0xa, 0x3e,0xaa,0xe0,0x43,0x3c,0x18,0xe0,0x43,0x3d,0x1a,0xe8,0xb, +0x3d,0x96,0xf0,0x0, 0x7e,0x8e,0x7e,0x86,0x7c,0x15,0x7d,0x16,0xf0,0x0, 0x9e,0x8b, +0xe0,0x1, 0x24,0x9d,0x15,0x98,0x3d,0xb9,0xf7,0xff,0x12,0xe8,0xe8,0xb, 0x3d,0x9c, +0xf0,0x15,0x3a,0x9b,0xe0,0x0, 0x15,0x68,0xf8,0x15,0x8, 0x5, 0x3d,0x10,0xe2,0x0, +0xcc,0x81,0xf8,0xa, 0x8, 0x15,0xf0,0x0, 0x9b,0x5a,0xe0,0x8, 0x5, 0xf9,0xf7,0xff, +0x12,0xd0,0xf0,0x15,0x3a,0x9b,0xf8,0x15,0x8, 0x5, 0xe0,0x1, 0x15,0x80,0x3d,0x90, +0xf8,0xb, 0x8, 0x15,0xf8,0x40,0x3a,0xec,0x65,0x7, 0x14,0x0, 0xc5,0x1, 0xe8,0x0, +0x97,0x55,0xe2,0x1, 0xc5,0x7f,0x3c,0xfa,0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0xf0,0x0, +0xc2,0x98,0x2, 0xf5,0x7f,0x81,0xf0,0x0, 0x7b,0x4, 0xe0,0x2, 0xd3,0x49,0x65,0x93, +0xe3,0xff,0xc4,0x7f,0x3d,0x95,0x8d,0x8b,0x7c,0xf, 0x67,0x81,0xf0,0x0, 0x63,0x4, +0xe0,0x0, 0x2d,0xf1,0x67,0x18,0xe8,0x40,0x3d,0xe6,0xf0,0x40,0x3b,0x7e,0x5, 0x5, +0x66,0x98,0x3e,0xf7,0xe0,0x4, 0x4, 0x79,0xe0,0x0, 0x4d,0x68,0x5c,0xb9,0xe4,0x0, +0xc5,0x5, 0x16,0x80,0x3c,0xfa,0x7e,0x92,0x5, 0xa, 0xe0,0x1, 0x4d,0x0, 0xe0,0x0, +0x5c,0xc5,0xe4,0x0, 0xc5,0x5, 0x3c,0xfa,0xe0,0x4, 0x2, 0x60,0x65,0x19,0x3d,0x1b, +0x3d,0x77,0xe0,0x3, 0x4, 0x38,0xe4,0x0, 0xc5,0x83,0xe0,0x2b,0x3b,0x9b,0xe0,0x4, +0x25,0xe2,0xe0,0x0, 0x15,0xe4,0xe1,0x2b,0x3b,0x9b,0xe0,0x4, 0x25,0xdc,0x66,0x92, +0xe0,0x6, 0x2e,0xdd,0xe0,0x1, 0x17,0x48,0x7f,0xc, 0xe0,0x3, 0x0, 0xa7,0xea,0x21, +0x7f,0x78,0xe0,0x7, 0x31,0xa1,0xea,0x22,0x7d,0x2c,0xea,0x22,0x7d,0x8c,0xea,0x21, +0x7f,0x88,0xc2,0x1, 0x14,0x80,0x3f,0x17,0xe2,0x1, 0xc2,0x7f,0x12,0x80,0x3d,0x13, +0xe0,0x16,0x3b,0x13,0x3d,0x97,0xf8,0x17,0x3f,0x19,0x3f,0x93,0xb4,0x8e,0xf0,0x40, +0x3d,0x74,0x17,0x7f,0xaa,0x8a,0xe8,0x0, 0xaa,0x86,0xb4,0x8b,0xe8,0x0, 0xaf,0x47, +0xac,0xf, 0xe7,0xfb,0x2, 0xa2,0xe7,0xfb,0x0, 0xec,0x65,0x93,0x7c,0x9a,0x3d,0x95, +0x8d,0x8b,0x7c,0x9b,0x7c,0x9c,0x7c,0x9d,0x7c,0x9e,0x7c,0x9f,0x7c,0xa0,0x7c,0xa1, +0x7c,0xa2,0x7c,0xa3,0x7c,0xa4,0x7c,0xa5,0xe0,0x3, 0x25,0xfb,0xf0,0x40,0x3b,0x69, +0x7c,0x8f,0xe0,0xa, 0x3b,0x15,0x67,0x7, 0x64,0x93,0xc5,0xff,0x3c,0x95,0x7f,0x12, +0xe0,0x0, 0x16,0xf8,0x17,0x1, 0x8d,0xa, 0xad,0x89,0xe0,0x1, 0x15,0xb4,0x7e,0x8c, +0x7f,0x8, 0xe0,0x1, 0x2d,0x51,0xe1,0x2b,0x3b,0x9b,0xe0,0x1, 0x25,0xc5,0x66,0x88, +0xe0,0x1, 0x26,0xc2,0xf0,0x0, 0x62,0x85,0xe0,0xb, 0x3b,0x15,0x14,0x81,0xac,0x8b, +0xf2,0x1, 0xc2,0xff,0xf0,0x40,0x3b,0x6a,0xe0,0x0, 0x15,0xe4,0xe8,0xb, 0x3d,0xb5, +0xe3,0xff,0xc5,0xfc,0xe2,0x5, 0xcd,0x80,0x5, 0x8a,0x66,0x8a,0x8d,0xd, 0xe2,0x0, +0xcd,0x0, 0xe0,0x5, 0x15,0x0, 0xe0,0x6a,0x39,0xab,0x3d,0xea,0x3d,0xf7,0xe0,0x1, +0x3, 0x98,0xf2,0x0, 0xce,0x82,0xe0,0x1, 0x5, 0x94,0xf8,0xb, 0x3c,0x19,0xe0,0x2, +0xc5,0xac,0xe0,0x9, 0x3b,0x15,0x14,0x0, 0x8d,0xb, 0xac,0x9, 0xe0,0x2, 0x2d,0x39, +0x15,0x3, 0xad,0xb, 0x15,0x8a,0x3d,0xb5,0x15,0x3, 0xe8,0xb, 0x3d,0x98,0xe0,0x2, +0xc5,0xad,0xad,0xb, 0xf0,0x0, 0x25,0x3d,0x16,0xff,0xe8,0xd, 0x3e,0x9a,0xf0,0x40, +0x3d,0x6d,0xf2,0x1, 0xc5,0x7f,0x15,0x8a,0xe8,0xb, 0x3d,0xba,0xe8,0xf, 0x3f,0x98, +0xe8,0xb, 0x3d,0x98,0xf0,0x0, 0x91,0xab,0xf0,0x0, 0x92,0x3b,0xf0,0x0, 0x90,0xb, +0xf0,0x0, 0x91,0x1b,0xf0,0x0, 0x90,0xcb,0xf0,0x0, 0x9a,0x8f,0xf0,0x0, 0x9b,0x1f, +0xf0,0x0, 0x8b,0xcf,0x89,0xdf,0x8c,0x6f,0x8c,0xff,0xe0,0x1, 0x8d,0xf, 0xf0,0x0, +0xb0,0xf, 0xc2,0x7f,0xf0,0x0, 0xb1,0x1f,0xe2,0x1, 0xc2,0x7f,0xf0,0x0, 0xb1,0xaf, +0xf0,0x0, 0xb2,0x3f,0xf0,0x0, 0xb0,0xcf,0xf0,0x0, 0xb2,0x8b,0xf0,0x0, 0xb3,0x1b, +0xf0,0x0, 0xab,0xcb,0xa9,0xdb,0xac,0x6b,0xac,0xfb,0xe0,0x1, 0xad,0xb, 0xe0,0xf, +0x3b,0x15,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x43,0xe2,0x0, 0xcf,0x82, +0xe0,0x3, 0x1, 0x7, 0x67,0x8d,0x3a,0x9f,0x8d,0x85,0xe2,0x0, 0xcd,0x85,0xe0,0x0, +0x1, 0x74,0x17,0x98,0x3f,0xbb,0x66,0x8c,0xf0,0xe, 0x3e,0x1f,0x67,0x85,0xae,0x9e, +0xc2,0x1, 0xaf,0x8e,0xe2,0x1, 0xc2,0x7f,0x67,0x8e,0x66,0x92,0xaf,0xae,0xc5,0x81, +0xae,0xbe,0xf0,0x40,0x3d,0x74,0x67,0x88,0x66,0x95,0xaf,0xce,0xb6,0xbe,0x67,0x96, +0x66,0x94,0xb7,0xce,0xb6,0xee,0x67,0x86,0x66,0x8f,0xe0,0x1, 0xb1,0x3e,0xb3,0xde, +0xf0,0x0, 0xb5,0xfe,0xe0,0x1, 0xb7,0x8e,0xf0,0x1, 0xb6,0x9e,0xe0,0x1, 0xb6,0xae, +0x67,0x11,0xad,0x85,0x89,0xe, 0xe7,0xf9,0x2, 0xc0,0xe7,0xfa,0x0, 0x8a,0xf7,0xff, +0x23,0x40,0xe7,0xfe,0x0, 0xec,0x15,0x0, 0xe0,0x0, 0x17,0x6e,0x16,0x80,0xad,0xb, +0x7f,0xc, 0x7e,0x88,0xf0,0x0, 0x13,0x0, 0xf0,0x0, 0x62,0x85,0xf2,0x1, 0xc2,0xff, +0xe7,0xfe,0x0, 0xc4,0xe2,0x0, 0xcd,0x1, 0xe0,0x2, 0x1, 0x52,0xe2,0x0, 0xcd,0x2, +0x1, 0xf2,0xf0,0x0, 0x62,0x85,0xe0,0x1, 0x4c,0x80,0xe0,0x0, 0x5c,0x45,0xf2,0x1, +0xc2,0xff,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xd1,0xda,0xf0,0x0, 0x62,0x82, +0xe0,0xa, 0x34,0x1, 0xe8,0xa, 0x3d,0x35,0xe0,0xb, 0x3b,0x15,0xe3,0xff,0xc5,0x7f, +0xe1,0x36,0x3d,0x17,0x15,0x0, 0xad,0xb, 0x67,0x81,0xe7,0xfe,0x0, 0x9f,0xe0,0x1f, +0x15,0x20,0xb5,0xb, 0xe0,0x1f,0x11,0x20,0xe7,0xfc,0x0, 0xa5,0x67,0xa, 0x17,0x83, +0xaf,0x8e,0xe7,0xf7,0x0, 0xf6,0xe0,0x0, 0x12,0xe0,0xf8,0x40,0x3c,0xec,0xe8,0x5, +0x3a,0x9c,0x11,0x98,0xe8,0x40,0x3c,0x69,0xf0,0x0, 0xc4,0x98,0x3d,0x63,0xe8,0x40, +0x3c,0xe9,0xe0,0x2, 0xd2,0xf, 0xe8,0x40,0x3a,0xf9,0x1, 0xf5,0x66,0x85,0x67,0xc, +0x67,0x8e,0xe8,0xc, 0xae,0x8c,0xc2,0x1, 0x66,0x92,0xe8,0xc, 0xaf,0x1c,0xe2,0x1, +0xc2,0x7f,0x67,0x8, 0xe8,0xc, 0xaf,0xac,0xf0,0x40,0x3d,0x74,0x67,0x95,0xe8,0xc, +0xae,0xbc,0x66,0x96,0xe8,0xc, 0xaf,0x4c,0x67,0x14,0xe8,0x6, 0xb7,0xbc,0xe8,0x6, +0xb6,0xcc,0x67,0x86,0x66,0x8f,0xe8,0x6, 0xb7,0x6c,0x67,0x11,0xe8,0x7, 0xb1,0x3c, +0xe8,0x6, 0xb3,0xdc,0xf8,0x6, 0xb5,0xfc,0xe8,0x7, 0xb7,0x8c,0xf8,0x7, 0xb6,0x9c, +0xe8,0x7, 0xb6,0xac,0x89,0xe, 0xe7,0xf8,0x2, 0xb8,0xe7,0xf9,0x0, 0x82,0x67,0x8c, +0xe2,0x0, 0xcf,0xf8,0xe7,0xfe,0x1, 0x40,0x66,0x90,0x55,0xb7,0x57,0xb8,0xf2,0x1, +0x7c,0x98,0xf0,0x19,0x3c,0x9d,0xe8,0x0, 0xb5,0x89,0xe8,0x0, 0xb7,0x99,0xe7,0xfe, +0x0, 0xb3,0xe0,0x0, 0x16,0xe4,0x7e,0x8c,0x67,0xf, 0xe2,0x0, 0xcf,0xa, 0x2, 0xbc, +0x16,0x81,0x7e,0x88,0x66,0x97,0x8d,0x8d,0xe2,0x0, 0xcd,0x81,0xe0,0xb, 0x3b,0x15, +0xe7,0xfe,0x1, 0x5b,0x8d,0xb, 0xe0,0x0, 0x15,0xe4,0xe7,0xfd,0x0, 0x94,0x67,0x11, +0x15,0x1, 0x8c,0xe, 0xad,0xb, 0xe7,0xfd,0x24,0x47,0xe8,0x19,0x8d,0xc8,0x3d,0xf3, +0xe0,0x4, 0x1, 0x26,0xe0,0x2, 0x1d,0x5e,0x15,0x81,0x3f,0x6b,0xe2,0x1, 0xc7,0x7f, +0x3c,0x7e,0xf0,0x40,0x3b,0xeb,0xc5,0x81,0xe7,0xfd,0x5, 0xb6,0xe0,0x1a,0x8f,0x6a, +0xc5,0xa, 0x39,0xfe,0x1, 0xf3,0x15,0x8a,0xe8,0xb, 0x3d,0xb7,0x15,0x7f,0xe8,0xb, +0x3d,0x98,0xe0,0x19,0xad,0x4b,0xe7,0xfd,0x0, 0xa7,0x3f,0x77,0x3e,0xe7,0xe0,0x6d, +0x3d,0x2e,0xe7,0xfa,0x0, 0xb8,0xf0,0x0, 0x5a,0xbe,0x17,0x1, 0xf2,0x0, 0xca,0x8a, +0x7f,0x8, 0x5, 0xc1,0xe0,0x0, 0x5d,0xca,0xe2,0x0, 0xcd,0x8a,0xe7,0xff,0x5, 0xbc, +0x55,0xbc,0x54,0x38,0x55,0x37,0x3d,0x98,0xe0,0x43,0x3d,0x9b,0x54,0xbb,0xe2,0x0, +0xcd,0x80,0x3c,0x9a,0xe0,0x43,0x3c,0x99,0x3d,0x6b,0xe0,0x4, 0x4, 0x2, 0xe2,0x0, +0xcc,0x80,0x3d,0xea,0xe3,0xff,0xc5,0xff,0x3d,0x69,0xe0,0x3, 0x4, 0x77,0x64,0x86, +0xe3,0xff,0xc5,0x7f,0xe8,0x40,0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xf0,0x0, +0x7b,0x4, 0xef,0xfc,0xdc,0x3d,0x5d,0xbf,0xe0,0x43,0x3c,0x18,0xe2,0x1f,0xcd,0x9f, +0x67,0x81,0xf0,0x0, 0x62,0x82,0xf0,0x0, 0x63,0x4, 0xe0,0x3, 0x5, 0xcd,0x15,0x8f, +0xe8,0xb, 0x3d,0xb5,0xe3,0xff,0xc5,0xff,0x3c,0x7b,0x67,0xc, 0xe0,0x28,0x3c,0x2b, +0x15,0xa8,0xe0,0x6b,0x3b,0x2e,0x7c,0x8, 0x7d,0x8c,0xe7,0xfe,0x0, 0xfd,0xf0,0x40, +0x3b,0x6b,0x7d,0x8f,0xe7,0xfb,0x0, 0xa2,0xe0,0x0, 0x1f,0x51,0xe0,0x1, 0x1e,0x8e, +0x7f,0x17,0xea,0x21,0x7f,0x14,0x7e,0x91,0xf0,0x40,0x3c,0xee,0x66,0x97,0x67,0x11, +0xaf,0x8d,0x89,0xe, 0xe7,0xf6,0x0, 0xe5,0x5c,0xbe,0x15,0x14,0xe1,0x2a,0x3c,0x9a, +0x7d,0x12,0xe7,0xfb,0x0, 0x9d,0xe0,0x2, 0x1f,0x49,0x15,0x1, 0xad,0xe, 0xe7,0xfb, +0x0, 0x85,0x17,0x14,0x16,0x80,0x7f,0xc, 0x7e,0x88,0xe7,0xfe,0x0, 0xd5,0xe0,0x0, +0x4f,0xe9,0xe2,0x0, 0xcf,0xf8,0xe7,0xfc,0x1, 0x77,0xe0,0x0, 0x55,0xc3,0xe0,0x0, +0x57,0xc4,0x67,0x10,0xf2,0x1, 0x7c,0x98,0xf0,0x19,0x3c,0x9e,0x35,0xa1,0x37,0xa1, +0xe8,0x0, 0xb5,0x89,0xe8,0x0, 0xb7,0x99,0xe7,0xfc,0x0, 0xe6,0xe0,0x0, 0x5d,0x4a, +0xe2,0x0, 0xcd,0x2, 0x2, 0x98,0x5c,0xb9,0xe2,0x0, 0xcc,0xcf,0x2, 0x94,0xf2,0x0, +0xce,0x93,0xe0,0x0, 0x2, 0xc9,0xe0,0x0, 0x5c,0xc6,0xe2,0x0, 0xcc,0x9d,0x2, 0x8b, +0x5c,0xba,0xe2,0x0, 0xcc,0xcf,0x2, 0x87,0xf0,0x0, 0x62,0x85,0xf2,0x1, 0xc2,0xff, +0xe0,0x1, 0x0, 0xb7,0xf2,0x0, 0xce,0x89,0x2, 0xb6,0xf0,0x0, 0x5a,0x3e,0xf2,0x0, +0xca,0x8, 0x5, 0xbe,0x67,0xe, 0xe2,0x0, 0xcf,0xe, 0x2, 0xaf,0xe0,0x0, 0x4d,0x68, +0xe8,0x40,0x3c,0x66,0x3c,0xea,0x7d,0x4, 0x7d,0x83,0x7f,0x81,0xe0,0x2, 0xd0,0x68, +0xf0,0x0, 0x62,0x85,0xe0,0x16,0x34,0x2, 0xf2,0x1, 0xc2,0xff,0xf8,0x16,0x3b,0x35, +0x65,0x4, 0xf3,0xff,0xc3,0x7f,0xf2,0x0, 0xcb,0x78,0x65,0x83,0x67,0x81,0xe0,0x2, +0x2, 0xb3,0xe2,0x0, 0xcd,0xa, 0xe0,0x1, 0x5, 0x8c,0xf2,0x0, 0xcb,0x4f,0xe8,0x40, +0x3d,0x66,0x2, 0x83,0xe0,0x0, 0x15,0x50,0xf0,0x40,0x3b,0x6a,0xf3,0xff,0xc3,0x7f, +0xe0,0x0, 0x0, 0xff,0xf0,0x0, 0x5a,0x3e,0x14,0x8f,0xf1,0x28,0x3a,0x19,0x24,0x8, +0xe1,0x2a,0x3d,0x19,0x25,0x5, 0x66,0x8e,0xe2,0x0, 0xce,0x89,0x5, 0xc8,0xe0,0x1, +0x4d,0x3, 0x25,0x20,0xe0,0x1, 0x1d,0x4e,0x8d,0xa, 0x25,0x1c,0xf0,0x0, 0x62,0x85, +0xf2,0x1, 0xc2,0xff,0xe1,0x2b,0x3b,0x9b,0xe0,0x1, 0x25,0xd0,0x66,0x88,0xe0,0x1, +0x26,0xcd,0xe0,0xb, 0x3b,0x15,0x15,0x3, 0xf2,0x0, 0xce,0x9d,0xad,0xb, 0xf0,0x0, +0x13,0x0, 0xe0,0x1, 0x5, 0xc8,0xe0,0xb, 0x3b,0x15,0x15,0x1, 0xad,0xb, 0xe7,0xfa, +0x0, 0xed,0xf0,0x0, 0x62,0x85,0xe0,0x0, 0x4c,0xe8,0x5c,0x39,0xf2,0x1, 0xc2,0xff, +0x7d,0x83,0x7f,0x81,0xf0,0x0, 0x7a,0x4, 0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xd0,0x8, +0xe0,0x0, 0x4c,0xea,0xf0,0x0, 0x62,0x82,0xe0,0xa, 0x34,0x1, 0x67,0xe, 0xe8,0xa, +0x3d,0x35,0x34,0xa1,0xe0,0x29,0x3f,0x19,0xe3,0xff,0xc5,0x7f,0x65,0x83,0x67,0x81, +0xf0,0x0, 0x62,0x4, 0x24,0xa0,0x14,0x9d,0xe9,0x34,0x3c,0xa4,0xf0,0x0, 0x22,0x1c, +0xe0,0x2, 0x1c,0xce,0x8c,0x89,0x2c,0x97,0xe0,0x1, 0x4c,0x82,0xe0,0x9, 0x3f,0x29, +0xe0,0x43,0x3c,0x19,0xe2,0x0, 0xcc,0x0, 0x5, 0xb, 0xe2,0x0, 0xcc,0x85,0x5, 0xb, +0xe2,0x1, 0xcd,0x47,0xf0,0x40,0x3b,0x6a,0x2, 0x91,0xe0,0x0, 0x0, 0xc7,0xe3,0xff, +0xcc,0x7b,0x4, 0x77,0x66,0x8e,0xf0,0x40,0x3b,0x6a,0xe2,0x0, 0xce,0x8f,0x2, 0xba, +0xe2,0x0, 0xcd,0x78,0x5, 0x83,0xf0,0x0, 0x13,0x78,0xf3,0xff,0xc3,0x7f,0xf0,0x40, +0x3b,0x77,0xe7,0xff,0x5, 0x99,0xf2,0x0, 0xce,0x87,0x2, 0xb2,0xe2,0x0, 0xcb,0x94, +0xe0,0x0, 0x5, 0xc0,0xe0,0xb, 0x3b,0x15,0x15,0x2, 0xad,0xb, 0xf0,0x0, 0x13,0x0, +0xe7,0xfa,0x0, 0x8c,0x15,0x0, 0xe7,0xf7,0x0, 0xdd,0x16,0x8a,0x17,0x0, 0x7e,0x8c, +0x7f,0x8, 0xe7,0xfc,0x0, 0xd1,0xe0,0x0, 0x1f,0xd1,0xfa,0x21,0x7c,0x94,0xf0,0x0, +0xad,0xf, 0x12,0x8a,0x3a,0xb2,0xe0,0x2, 0x1c,0xde,0xe0,0x1, 0x14,0x40,0x3d,0x65, +0x3c,0x10,0xe0,0x1, 0xdf,0xff,0xea,0x16,0x7c,0x4c,0xf0,0x0, 0x65,0x7, 0xe7,0xf6, +0x0, 0x9b,0xe2,0x1, 0xcd,0x48,0x5, 0xca,0xf0,0x1, 0x13,0x48,0x0, 0xc7,0xe0,0x0, +0x5d,0xc6,0xe2,0x0, 0xcd,0xe4,0x5, 0x8d,0x15,0x94,0xe1,0x2b,0x3b,0x9b,0x25,0x89, +0x15,0x93,0xe9,0x2b,0x3d,0xad,0x25,0x85,0x67,0xe, 0xe2,0x0, 0xcf,0x13,0x5, 0xc3, +0xf0,0x0, 0x13,0x1, 0xe0,0x0, 0x5d,0xc8,0xe0,0x0, 0x5d,0x47,0x64,0x86,0xe8,0x40, +0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xf0,0x0, 0x7b,0x4, 0xef,0xfc,0xda,0xb8, +0xe2,0x0, 0xcc,0x3b,0x67,0x81,0xf0,0x0, 0x62,0x82,0xf0,0x0, 0x63,0x4, 0x2, 0x87, +0x65,0x8d,0x15,0x0, 0x3d,0x95,0xad,0xb, 0xf0,0x0, 0x13,0x0, 0xe0,0xb, 0x3b,0x15, +0x15,0x0, 0xad,0xb, 0xe7,0xf9,0x0, 0xb2,0xf2,0x0, 0xce,0x9d,0xf0,0x0, 0x13,0x0, +0x2, 0xda,0xe0,0x3, 0x1f,0x3d,0x8d,0x9e,0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5d,0xc6, +0x5, 0x96,0xe0,0x0, 0x4d,0x6b,0x2d,0x13,0xe2,0x0, 0xcd,0x9d,0xf0,0x40,0x3b,0x6a, +0xe0,0x0, 0x5, 0xc2,0xe0,0xb, 0x3b,0x15,0x8d,0x8b,0xe2,0x0, 0xcd,0x81,0x1, 0x43, +0xe2,0x0, 0xcd,0x83,0xe7,0xf9,0x1, 0x92,0xe7,0xfe,0x0, 0x9f,0xe2,0x0, 0xcd,0x9d, +0xf0,0x0, 0x13,0x0, 0x2, 0xf0,0x66,0x94,0xe2,0x0, 0xce,0x9d,0x2, 0xec,0x67,0xb, +0x9d,0x8e,0xe2,0x0, 0xcd,0xf7,0x2, 0xe7,0xe0,0x2, 0x1d,0xce,0x8d,0x8b,0xe8,0x36, +0x3d,0x86,0x0, 0xe1,0xf0,0x0, 0x13,0x78,0xe7,0xfe,0x0, 0xdb,0xf0,0x0, 0x13,0x80, +0xe7,0xfb,0x0, 0xeb,0x15,0x9, 0x15,0x86,0x66,0x8e,0xe8,0xa, 0x3d,0x35,0xe8,0xb, +0x3d,0xb5,0xe2,0x0, 0xce,0x8b,0xe3,0xff,0xc5,0xfe,0xe3,0xff,0xc5,0x7f,0xe0,0x6a, +0x3c,0xab,0x3d,0xea,0xe7,0xfc,0x0, 0xaa,0x15,0x0, 0xe7,0xfc,0x0, 0x8a,0x15,0x0, +0xe7,0xfb,0x0, 0xff,0x64,0x86,0xe8,0x40,0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82, +0xd8,0xbf,0xf0,0x40,0x3b,0x68,0x67,0x81,0xf0,0x0, 0x62,0x82,0xe7,0xff,0x24,0x34, +0xe7,0xfe,0x0, 0xba,0xea,0x16,0x7c,0x4c,0xe7,0xf4,0x0, 0xf6,0x15,0x80,0x7d,0xa0, +0x7d,0xa1,0x7d,0xa2,0x7d,0xa3,0x7d,0xa4,0x7d,0xa5,0xe7,0xf7,0x0, 0x8d,0x8, 0xb2, +0xe0,0x1, 0x1f,0x8e,0xea,0x22,0x7c,0x40,0x89,0xf, 0x14,0x80,0x31,0x21,0x3d,0x62, +0xe0,0x1, 0xdf,0x7a,0xea,0x22,0x7c,0x54,0x3d,0x62,0x14,0x80,0x9, 0x21,0xe0,0x3e, +0x0, 0xf3,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfe,0xc0,0x64,0xe0,0x2, +0x19,0x5f,0xea,0x16,0x7d,0xca,0xf0,0x0, 0x8e,0x82,0xf0,0x2, 0x1d,0x5e,0x8f,0x8b, +0xf0,0x0, 0x2e,0x90,0xe0,0x3, 0x27,0xa4,0xe0,0x2, 0x1f,0x4f,0x7f,0xa, 0xf0,0x0, +0xae,0x8e,0xef,0xff,0xdf,0xd6,0xf0,0x1, 0x1e,0xe, 0xe8,0x0, 0x89,0x8c,0x0, 0xb1, +0xf0,0x1, 0x1e,0xe, 0xe8,0x0, 0x89,0x8c,0x2f,0x93,0x21,0x92,0x17,0x7f,0x3f,0x13, +0xe2,0x1, 0xc7,0x7f,0xc7,0x1, 0xe4,0x0, 0xc7,0xa, 0xe8,0x40,0x3f,0xea,0xe8,0xe, +0x3f,0x1a,0x16,0xff,0xe0,0x19,0xae,0xcf,0xc7,0x8a,0x3f,0x7f,0x1, 0xfc,0x15,0xff, +0xe8,0xb, 0x3d,0x9d,0xe2,0x1, 0xc5,0xff,0xc5,0x81,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, +0x1f,0xde,0xe8,0xb, 0x3d,0x9a,0x96,0x8f,0x97,0x1f,0x36,0xa4,0xb6,0x8f,0xc7,0x8a, +0x37,0x24,0x3d,0xff,0xe0,0x40,0xb7,0x4f,0x1, 0xf7,0xe0,0x2, 0x1f,0xcf,0x7f,0x8a, +0x12,0xa, 0x3a,0x33,0xe0,0x1, 0x14,0xff,0x3d,0x64,0xe2,0x0, 0x7c,0x3c,0xe0,0x1, +0xdf,0x1b,0x14,0x80,0xe2,0x0, 0x7d,0xbc,0xe8,0x40,0x3d,0x6d,0x3c,0x69,0xef,0xff, +0xd6,0xc5,0x3d,0x63,0xe8,0x40,0x3c,0xed,0xe2,0x0, 0x7d,0xbc,0xef,0xff,0xd6,0xbe, +0xe0,0x2, 0x1c,0xde,0x15,0x0, 0xe2,0x0, 0x78,0xbc,0x21,0xad,0x24,0x11,0x8e,0x49, +0x8f,0xc1,0x3f,0xfc,0x1, 0x21,0x3f,0x61,0x17,0x80,0x0, 0x84,0x8e,0xce,0x3e,0xfc, +0x1, 0x1b,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0xf8,0xc7,0xa, 0x1, 0xf8,0x17,0xa, +0x3f,0x3a,0x17,0x8a,0xe8,0xe, 0x3f,0x1a,0x3f,0xb8,0x92,0x8e,0x95,0x9e,0x96,0x2e, +0x96,0xbe,0x97,0x4e,0x3f,0x91,0xc4,0x1, 0xb2,0x8f,0xe2,0x1, 0xc4,0x7f,0xb5,0x9f, +0xb6,0x2f,0xb6,0xbf,0xb7,0x4f,0xc5,0x1, 0x3f,0xea,0xe2,0x1, 0xc7,0xff,0x3f,0xf3, +0xc4,0x8a,0x4, 0xd5,0xe0,0x2, 0x1c,0x59,0x14,0xbc,0x3d,0x64,0x3c,0x90,0xe0,0x1, +0xde,0x99,0x66,0x8a,0xf0,0x2, 0x19,0x5e,0x8f,0x8d,0xe0,0x5, 0x2f,0x89,0xea,0x16, +0x7d,0xca,0x8f,0xb, 0xe0,0x5, 0x27,0xa, 0xf0,0x5, 0x26,0x94,0xf7,0xff,0x12,0x7f, +0xe0,0x1, 0x1f,0xd7,0xf8,0x14,0x3a,0x1d,0xf2,0x1, 0xc2,0x7f,0xf0,0x1, 0x99,0x9f, +0xf0,0x0, 0xc2,0x1, 0xe0,0x2, 0x1f,0xcd,0xf4,0x0, 0xc2,0xa, 0xf8,0x19,0x88,0xca, +0xf0,0x0, 0x88,0xf, 0x89,0x2, 0xfa,0x22,0x7b,0x40,0xf8,0x14,0x3a,0x1a,0xea,0x22, +0x7d,0xd4,0xf8,0x40,0x3f,0x66,0xf8,0x0, 0x8c,0xc, 0xf8,0x40,0x3d,0x62,0x79,0xe, +0xf8,0x40,0x3d,0xe2,0xe0,0x0, 0x7d,0x8b,0xf7,0xff,0x12,0xfc,0xf0,0x0, 0x7e,0x8c, +0xe8,0x40,0x3a,0x63,0xe8,0x40,0x3b,0xe0,0xe8,0x40,0x3a,0xe1,0xe8,0x40,0x3b,0x64, +0xf0,0x0, 0x7e,0xd, 0xf0,0x0, 0x24,0x19,0xe8,0x0, 0x8e,0x4b,0x3e,0x75,0xe0,0x1, +0x1, 0x54,0xe8,0x40,0x3f,0x62,0x17,0x81,0x0, 0x87,0xe0,0x1a,0x8e,0xee,0xc7,0xa, +0x3e,0x7d,0xe0,0x1, 0x1, 0x4d,0x3e,0xef,0xe2,0x1, 0xc6,0xff,0xf0,0x40,0x3c,0x7d, +0x3d,0xef,0xc7,0x81,0x2, 0xf3,0xf0,0x0, 0x66,0x8c,0xf0,0x0, 0x66,0xd, 0xe0,0x2, +0x1f,0xdd,0x8f,0x8f,0x2f,0x89,0xea,0x16,0x7c,0x40,0xe8,0x40,0x3d,0x68,0xe0,0x1, +0x14,0xff,0xe0,0x1, 0xde,0x69,0xf0,0x0, 0x14,0x80,0xf0,0x1, 0x24,0x20,0xfa,0x16, +0x7d,0xc0,0x11,0x3, 0xe8,0x40,0x3a,0x69,0xe0,0x0, 0x0, 0xd3,0xf0,0xc, 0x3d,0x93, +0x8f,0xc, 0x34,0x44,0xe2,0x1, 0xcf,0x7f,0x34,0xc4,0xe0,0x3, 0x1, 0x69,0xe2,0x0, +0xcf,0x2, 0xe0,0x3, 0x2, 0xdf,0x13,0x81,0x3b,0x9e,0xe2,0x1, 0xc3,0xff,0x13,0x1e, +0xe4,0x0, 0xc7,0xa, 0x3b,0x33,0xea,0x14,0x7e,0x14,0x65,0x8a,0xe0,0xf, 0x3f,0x16, +0x3f,0x9c,0x8f,0xb, 0xb4,0xf, 0xb4,0x9f,0xe0,0x3, 0x2f,0x46,0x3b,0x1c,0x97,0x56, +0x94,0x6, 0xe0,0x1, 0x97,0xa6,0x3c,0x1e,0x3c,0x1f,0x3c,0xe2,0x12,0x8a,0xe3,0xff, +0xc4,0x7f,0xf0,0x18,0x3d,0x1d,0x3a,0x96,0xe0,0x1, 0xdd,0xd5,0xf0,0x0, 0x17,0x14, +0x96,0x95,0xf0,0x1e,0x3f,0x16,0x97,0x96,0xe8,0x0, 0x97,0x1e,0x3f,0x9d,0x3f,0x9e, +0xe8,0x0, 0xb4,0x8, 0x3c,0x6f,0x3c,0xe2,0xe3,0xff,0xc4,0x7f,0xe0,0x1, 0xdd,0xc3, +0xe8,0x0, 0xb4,0x18,0xe8,0x3, 0x39,0x9b,0xab,0x83,0xf0,0x0, 0xc4,0x81,0xf8,0x0, +0x8c,0xc, 0xf2,0x1, 0xc4,0xff,0xf8,0x40,0x3c,0x79,0xe0,0x0, 0x5, 0xc8,0x16,0x8a, +0xe8,0xd, 0x3e,0xb9,0xf8,0x40,0x3e,0xf9,0xf0,0xf, 0x3d,0x1d,0xe0,0x19,0x89,0xcf, +0xe0,0xc, 0x9c,0x4f,0xa9,0xcf,0xe0,0xc, 0x9c,0xdf,0x5, 0x87,0x9e,0xf, 0x9f,0x1f, +0x36,0x44,0x37,0x44,0xb6,0xf, 0xb7,0x1f,0xf0,0xf, 0x3d,0x1d,0xe0,0x19,0x85,0x5f, +0xe0,0x19,0x85,0xef,0xe0,0x19,0x86,0x7f,0xe0,0x1a,0x87,0xf, 0xe2,0x0, 0xc1,0x8f, +0xe8,0x40,0x39,0xf8,0xad,0x5f,0xad,0xef,0xae,0x7f,0xe0,0x1, 0xaf,0xf, 0x3, 0x4e, +0x17,0xa, 0x3f,0x33,0xe8,0xe, 0x3f,0x1a,0xe0,0x2, 0xc7,0x2c,0x8f,0xe, 0xe2,0x0, +0xcf,0x3, 0x1, 0x44,0xe2,0x0, 0xcf,0x1, 0xe7,0xfe,0x1, 0xfa,0xea,0x16,0x7f,0xc0, +0xf0,0x0, 0xc4,0x81,0xf8,0x0, 0x8c,0xc, 0xf2,0x1, 0xc4,0xff,0x3f,0x93,0x17,0x7f, +0xf8,0x40,0x3c,0x79,0xaf,0xf, 0xe7,0xff,0x2, 0xbc,0xea,0x16,0x7e,0xca,0xf0,0x0, +0xae,0x8d,0xe0,0x1, 0xc0,0x1c,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1e,0xcf, +0x7e,0x8a,0xe7,0xfc,0x0, 0xe0,0x3e,0x65,0xe0,0x0, 0x15,0x80,0xf0,0x0, 0x14,0x8a, +0xf0,0x19,0x3c,0xbb,0xf8,0x0, 0x9e,0x9b,0xf8,0xf, 0x3d,0x19,0xe0,0xc, 0x9e,0xdf, +0xe0,0xc, 0x99,0x4f,0xe8,0x0, 0x99,0x8b,0xf0,0xf, 0x3e,0xad,0x3d,0x6f,0xe0,0xe, +0x39,0xa2,0x17,0x8a,0xe3,0xff,0xc7,0x7f,0x3f,0xbc,0xf0,0x43,0x3e,0x1e,0xf2,0x0, +0xce,0x0, 0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x39,0x23,0xe8,0xf, 0x3f,0x9a,0xe3,0xff, +0xc4,0x7f,0xf0,0x43,0x3b,0x9a,0x3c,0xee,0xe0,0x2, 0xc7,0xac,0xe0,0x69,0x3d,0x28, +0x8f,0x8f,0xf2,0x0, 0xcb,0x80,0xe8,0x8, 0x3e,0xad,0xf0,0x40,0x39,0xea,0xe3,0xff, +0xc4,0x7f,0xe0,0x73,0x3d,0x28,0xe2,0x0, 0xcf,0x81,0xf0,0x13,0x39,0x99,0xf3,0xff, +0xc1,0xff,0x36,0x21,0xe0,0x1, 0x1, 0x37,0xf0,0x40,0x39,0xf4,0xf0,0xf, 0x3f,0x1c, +0xe0,0x0, 0x3, 0xff,0x9f,0x8f,0xf0,0x8, 0x31,0xa8,0x3c,0xe4,0x7d,0x6, 0x7e,0x2, +0x7e,0x87,0x7f,0x8, 0x7f,0x89,0xf0,0x0, 0x79,0x3, 0xf0,0x0, 0x79,0x84,0xf0,0x0, +0x7a,0x81,0xf0,0x0, 0x7b,0x85,0xe0,0x1, 0xdd,0x6, 0xe3,0xff,0xc4,0x7f,0xe2,0x0, +0xcc,0xf, 0x65,0x6, 0x66,0x2, 0x66,0x87,0x67,0x8, 0x67,0x89,0xf0,0x0, 0x61,0x3, +0xf0,0x0, 0x61,0x84,0xf0,0x0, 0x62,0x81,0xf0,0x0, 0x63,0x85,0xe0,0x2, 0x2, 0x80, +0xf0,0x40,0x39,0xff,0xe0,0x1, 0x3, 0xbf,0xf0,0x0, 0x60,0xb, 0xf0,0x10,0x38,0x1c, +0xe8,0x0, 0x9c,0x0, 0xe8,0xc, 0x3e,0x1e,0xf0,0x0, 0xb1,0x8c,0xe0,0x0, 0x2b,0xe0, +0x3e,0x68,0xe3,0xff,0xc6,0x7f,0xe2,0x2, 0xce,0x0, 0x3f,0xe8,0x5, 0x83,0xe0,0x2, +0x17,0x80,0xe3,0xff,0xc7,0xff,0xf2,0x0, 0xce,0x0, 0xe0,0xc, 0x39,0x23,0xe3,0xff, +0xc6,0x7f,0xe0,0x6e,0x3d,0x2c,0x3f,0x3f,0x39,0xf2,0x37,0x48,0xe8,0xe, 0x3f,0x55, +0xe3,0xff,0xc7,0x7c,0xf8,0xc, 0x3d,0x19,0xe0,0x0, 0x5, 0xd3,0x3f,0x12,0xe0,0xc, +0xb7,0x4c,0xf2,0x0, 0xcb,0x80,0xe8,0xe, 0x3e,0xad,0xe3,0xff,0xc7,0x7f,0xe0,0x6a, +0x3d,0x2e,0x3f,0xba,0xf0,0x40,0x3e,0xfd,0x37,0xc8,0xe8,0xf, 0x3f,0xd5,0xe3,0xff, +0xc7,0xfc,0xf8,0xb, 0x3d,0x19,0xe0,0x0, 0x2, 0xc2,0xe0,0xf, 0x3e,0xaf,0xe0,0xc, +0xb7,0xdb,0xf0,0x0, 0xc5,0x8a,0xf0,0x40,0x3d,0xf6,0xe7,0xfc,0x1, 0xed,0xf0,0x0, +0x66,0xd, 0xf0,0x0, 0x66,0x8c,0xf8,0x0, 0x8c,0xc, 0xe7,0xfd,0x0, 0x82,0x9f,0x8f, +0xe8,0x40,0x3f,0xf3,0xe7,0xff,0x2, 0xaa,0xfa,0x22,0x78,0x54,0xf0,0x10,0x38,0x1c, +0xe0,0x2, 0x17,0x80,0xe8,0xc, 0x3e,0x1e,0xe8,0x0, 0xb7,0x80,0xe0,0x2, 0x17,0x80, +0xf0,0x0, 0xb1,0x8c,0xe7,0xff,0x23,0xb1,0xe0,0x2, 0x14,0x0, 0x67,0x8e,0xe2,0x0, +0xcf,0x81,0xe7,0xff,0x1, 0x9f,0xe8,0x0, 0x8f,0xeb,0xe0,0xc, 0x34,0x41,0xe2,0x0, +0xcf,0x8f,0xe3,0xff,0xc6,0x7f,0xe0,0x68,0x3b,0xac,0xe7,0xff,0x0, 0x93,0xe0,0xe, +0x39,0x2e,0xe0,0xc, 0xb7,0x4c,0xe7,0xff,0x0, 0xae,0x3f,0x9d,0xe0,0xc, 0xb7,0xdb, +0x0, 0xc1,0xf0,0x0, 0x60,0xb, 0x15,0x80,0xf0,0x9, 0x38,0x1c,0xf0,0xf, 0x3f,0x1c, +0xf0,0x40,0x39,0xf4,0xb5,0x89,0xb5,0x8f,0x3, 0xca,0xf0,0x8, 0x31,0xa8,0x3c,0xe4, +0x7d,0x6, 0x7e,0x2, 0x7e,0x87,0x7f,0x8, 0xf0,0x0, 0x78,0x9, 0xf0,0x0, 0x79,0x3, +0xf0,0x0, 0x79,0x84,0xf0,0x0, 0x7a,0x81,0xf0,0x0, 0x7b,0x85,0xe0,0x1, 0xdc,0x4b, +0xe3,0xff,0xc4,0x7f,0xe2,0x0, 0xcc,0xf, 0x65,0x6, 0x66,0x2, 0x66,0x87,0x67,0x8, +0xf0,0x0, 0x60,0x9, 0xf0,0x0, 0x61,0x3, 0xf0,0x0, 0x61,0x84,0xf0,0x0, 0x62,0x81, +0xf0,0x0, 0x63,0x85,0x5, 0x89,0xf0,0x10,0x38,0x1c,0xe8,0x0, 0xb4,0x0, 0xe7,0xfe, +0x0, 0xcb,0xfa,0x22,0x78,0x54,0xf0,0x10,0x38,0x1c,0x15,0x90,0xe8,0xc, 0x3e,0x1e, +0xe8,0x0, 0xb5,0x80,0x17,0x90,0xf0,0x0, 0xb1,0x8c,0xe7,0xfe,0x23,0xce,0x14,0x10, +0xe7,0xff,0x0, 0x9e,0xf0,0xf, 0x3d,0x1d,0xb4,0xf, 0xb4,0x9f,0xe7,0xfc,0x0, 0xdc, +0x17,0x0, 0xaf,0xc, 0x13,0x81,0x3f,0x64,0xe7,0xfc,0x0, 0xa3,0x17,0x1e,0x3f,0x33, +0xea,0x14,0x7e,0x94,0x15,0x81,0x3f,0x1d,0xad,0x8c,0x16,0x83,0xb4,0xf, 0xb4,0x9f, +0xc7,0xa, 0x94,0xf, 0x94,0x9f,0x95,0x2f,0x95,0xbf,0x96,0x4f,0xe0,0x40,0xb4,0x5e, +0xc6,0xff,0xe0,0x40,0xb4,0xce,0xe2,0x1, 0xc6,0xff,0xe0,0x40,0xb5,0x3e,0xe0,0x40, +0xb5,0xae,0xe0,0x40,0xb6,0x1e,0x2e,0xed,0xe7,0xfc,0x0, 0xb9,0xf0,0x40,0x39,0xff, +0xe7,0xfe,0x4, 0x84,0xfa,0x22,0x78,0x54,0xe7,0xff,0x0, 0xb7,0xf8,0x0, 0x8c,0xc, +0xf7,0xfb,0x26,0xd3,0xe7,0xfb,0x0, 0xcd,0xf8,0x0, 0x8c,0xc, 0x15,0xa, 0xe8,0xa, +0x3d,0x38,0xe0,0x2, 0x1c,0x59,0xe8,0x40,0x3c,0xe2,0xe0,0x1, 0xdb,0xfb,0x0, 0xf1, +0xf8,0x0, 0x8c,0xc, 0xe7,0xfb,0x0, 0xc1,0x8, 0xb1,0xe0,0x2, 0x1c,0x6d,0x15,0xa, +0x14,0x99,0xe0,0x1, 0xdc,0x29,0xe0,0x2, 0x1e,0x8e,0x17,0x0, 0x3f,0xed,0xe1,0x80, +0xaf,0x1f,0xc7,0x81,0xaf,0x1d,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xaf,0xf, 0x8, 0xe1,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x58, +0xf0,0x2, 0x19,0xdf,0xe8,0x0, 0x89,0x3, 0xe0,0x3, 0x21,0x69,0xe0,0x1, 0x1f,0x8e, +0xe0,0x1, 0x1f,0x42,0x8f,0x8f,0xe0,0x0, 0x27,0xf3,0x13,0xff,0x3b,0x9f,0xe2,0x1, +0xc3,0xff,0xf0,0xe, 0x8c,0x9e,0xf0,0xe, 0x8c,0x2e,0xc3,0x81,0xe4,0x0, 0xc3,0x8a, +0xe0,0x2, 0x19,0xde,0xea,0x13,0x7c,0xba,0xfa,0x13,0x7f,0x3c,0xf0,0x19,0x34,0xa6, +0xf0,0x18,0x34,0x26,0xf0,0x0, 0x10,0x80,0xea,0x13,0x7d,0xf0,0xfa,0x13,0x7a,0xe4, +0xfa,0x13,0x7b,0x7c,0xfa,0x14,0x7b,0x88,0xf0,0x0, 0x8e,0x89,0xf0,0x2, 0x1e,0x57, +0xf0,0x2, 0x19,0x6d,0xf1,0xff,0xc4,0xe0,0xf1,0xff,0xc4,0x60,0x3b,0x93,0xf8,0x40, +0x38,0x61,0x7d,0x8a,0xf8,0x40,0x3a,0x6e,0x0, 0x8a,0xea,0x13,0x7f,0x3c,0x31,0x22, +0x3f,0x12,0xb2,0xe, 0xb7,0x9e,0xc1,0x8a,0x3b,0xf3,0x1, 0x37,0x89,0x43,0xe2,0x1, +0xc9,0x7f,0x1, 0x7a,0x9a,0x3, 0x17,0xa, 0x3f,0x32,0xe2,0x0, 0xca,0x21,0x9f,0x93, +0xe8,0x2d,0x3a,0x29,0xe8,0xe, 0x3f,0x1c,0x15,0x81,0xe0,0x6b,0x3b,0xad,0x8f,0xe, +0xe2,0x0, 0xcf,0xa1,0xe8,0x2d,0x3f,0xa8,0x16,0x1, 0xe0,0x6c,0x3b,0xad,0xe2,0x0, +0xcf,0x2, 0x1, 0x21,0x27,0x5b,0xe2,0x0, 0xcf,0x1, 0x1, 0xde,0x66,0x8a,0xea,0x14, +0x7d,0x88,0xea,0x13,0x7e,0x7c,0xea,0x13,0x7f,0xe4,0x3d,0x92,0x3e,0x12,0x3e,0x92, +0xc1,0x8a,0x39,0x1f,0xf0,0x0, 0xa8,0xb, 0x3b,0xf3,0xf0,0x0, 0xa8,0xc, 0xe0,0x0, +0xaf,0xd, 0xf0,0x0, 0xa8,0x2, 0x1, 0xcb,0xf0,0x3, 0x28,0xd0,0xc0,0x28,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe0,0x6, 0x31,0x22,0xf0,0xe, 0x3a,0x16,0xf0,0x0, 0x9d,0xe, +0xf0,0x0, 0x9d,0x9e,0xe8,0xe, 0x3a,0x2a,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x3c,0x1e, +0xe8,0xd, 0x3f,0xab,0xe3,0xff,0xc6,0xff,0xe0,0x41,0x3c,0xce,0xe2,0x0, 0xcc,0x0, +0xf0,0x43,0x3f,0x1d,0xe3,0xff,0xc4,0xff,0xf0,0x1, 0x3a,0x92,0xe0,0x41,0x3d,0x4d, +0xe0,0x6e,0x3d,0x29,0xf2,0x0, 0xcf,0x0, 0x8c,0x81,0xe3,0xff,0xc5,0x7f,0xe0,0x6d, +0x3d,0x2a,0xe2,0x0, 0xcc,0xe3,0x2, 0x83,0xc4,0x81,0xac,0x81,0xe8,0x0, 0x8d,0x3, +0xe2,0x0, 0xcd,0x7, 0xe0,0x2, 0x5, 0x8a,0xf0,0xa, 0x3b,0x92,0x88,0x8a,0x15,0xa, +0xf0,0x0, 0x26,0x89,0xf1,0xff,0xc6,0xff,0xf2,0x1, 0xc6,0xff,0xf0,0x0, 0x10,0x81, +0x15,0xa, 0xf0,0x9, 0x39,0x12,0x8a,0x89,0x3d,0x75,0x5, 0x83,0xad,0x9, 0x3a,0xea, +0x28,0x99,0xf0,0xa, 0x3a,0x92,0x8d,0xa, 0xe2,0x0, 0xcd,0x11,0x2, 0x8d,0x8d,0x53, +0x14,0xa2,0xe1,0x2a,0x3c,0xaa,0xe0,0x2, 0x2d,0x3, 0x8c,0xe3,0x15,0x7, 0xe1,0x2a, +0x3d,0x29,0xe0,0x1, 0x2d,0x7d,0xe0,0xa, 0x3f,0x1d,0xe2,0x0, 0xcd,0x3, 0xe0,0x2, +0x5, 0x0, 0x3d,0x65,0xe3,0xff,0xc5,0x7f,0xe1,0x29,0x3d,0x1e,0xe0,0x0, 0x24,0xdb, +0xe1,0x2a,0x3d,0x1d,0xe0,0x0, 0x25,0x57,0x2d,0x83,0xf0,0x0, 0xb5,0x3, 0x2e,0x3, +0xf0,0x0, 0xb5,0x93,0xe0,0x2, 0x1f,0xe, 0x3f,0x12,0x87,0x8e,0xc7,0x81,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x9d,0xaf,0x8e,0xe7,0xfe,0x5, 0xc7,0x8c,0x53,0x14,0x83, +0xf0,0x0, 0x78,0x7, 0xf0,0x0, 0x78,0x85,0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x79,0x88, +0xf0,0x0, 0x7a,0x4, 0xf0,0x0, 0x7a,0x83,0xf0,0x0, 0x7b,0x2, 0xf0,0x0, 0x7b,0x81, +0xe0,0x1, 0xda,0xa1,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x9e,0xf0,0x0, +0x60,0x7, 0xf0,0x0, 0x60,0x85,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x61,0x88,0xf0,0x0, +0x62,0x4, 0xf0,0x0, 0x62,0x83,0xf0,0x0, 0x63,0x2, 0xf0,0x0, 0x63,0x81,0xe0,0x2, +0x2, 0x84,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8e,0x3f,0x6f,0xe0,0x2, +0x5, 0x85,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x3f,0xf5,0x5, 0x85,0xf0,0xf, 0x39,0x12, +0xc2,0x81,0xaa,0x8f,0xea,0x13,0x7f,0xfc,0x39,0x1f,0x15,0x81,0xad,0x82,0xe7,0xfe, +0x0, 0x84,0xf0,0xc, 0x3b,0x12,0x8e,0xc, 0x26,0x1c,0x14,0x94,0xe1,0x2c,0x3f,0x19, +0xe0,0x1, 0x2e,0x1b,0xe1,0x2c,0x3e,0x99,0xe0,0x1, 0x2e,0x17,0x14,0x89,0xe1,0x2c, +0x3f,0x19,0xe0,0x1, 0x2e,0x6c,0xe1,0x2c,0x3e,0x99,0xe0,0x1, 0x2e,0x68,0x15,0x84, +0xe1,0x2e,0x3f,0x1b,0xe0,0x1, 0x2f,0x69,0xe1,0x2d,0x3e,0x9b,0xe0,0x1, 0x2e,0xe5, +0x66,0x8a,0xe0,0xe, 0x3e,0x92,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x5, 0xbc,0x17,0xff, +0x3f,0x9e,0xe2,0x1, 0xc7,0xff,0x3f,0x6f,0x3e,0x92,0xaf,0x8d,0x3c,0xee,0xf0,0x0, +0x78,0x7, 0xf0,0x0, 0x78,0x85,0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x79,0x88,0xf0,0x0, +0x7a,0x4, 0xf0,0x0, 0x7a,0x83,0xf0,0x0, 0x7b,0x2, 0xf0,0x0, 0x7b,0x81,0x7f,0x9, +0xe0,0x1, 0xd9,0xee,0xf0,0x4, 0x3d,0x18,0x67,0x9, 0xe3,0xff,0xc2,0x7f,0xb2,0x3, +0x3c,0xee,0xe8,0x40,0x3c,0x6e,0xe0,0x1, 0xd9,0xe3,0xf0,0xf, 0x3d,0x98,0xe3,0xff, +0xc7,0xff,0xf0,0x0, 0x63,0x81,0xf0,0x0, 0x63,0x2, 0xf0,0x0, 0x62,0x83,0xf0,0x0, +0x62,0x4, 0xf0,0x0, 0x61,0x88,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x60,0x85,0xf0,0x0, +0x60,0x7, 0xb7,0x93,0xe8,0x6, 0x3b,0x14,0xf0,0xd, 0x3b,0x92,0xf0,0xe, 0x3b,0x12, +0x16,0x1, 0xe2,0x0, 0xca,0x8e,0xae,0xd, 0xf0,0x0, 0xa8,0xe, 0xb2,0x6, 0xb7,0x96, +0x5, 0x95,0xf0,0xf, 0x39,0x12,0x17,0x5, 0xaf,0xf, 0xe0,0x2, 0x1f,0x8e,0x39,0x1f, +0xf0,0x0, 0xa8,0x2, 0xe7,0xfd,0x0, 0x89,0xe2,0x0, 0xcd,0x2, 0x5, 0x8f,0xf0,0xa, +0x3b,0x92,0x88,0x8a,0x15,0x9, 0xe7,0xfd,0x0, 0xf5,0xe2,0x0, 0xca,0x81,0x5, 0xee, +0xf0,0xf, 0x39,0x12,0xc2,0xff,0xaa,0x8f,0x0, 0xe9,0xe0,0x0, 0x1, 0x4e,0xf0,0x0, +0x26,0xbe,0xf0,0xa, 0x3b,0x92,0x88,0x8a,0xe7,0xfd,0x0, 0xe6,0x14,0x9f,0xe1,0x2a, +0x3c,0xae,0xe7,0xfe,0x25,0x2, 0xe1,0x2a,0x3c,0xad,0xe7,0xfd,0x25,0x7e,0x16,0x80, +0x3f,0x6d,0xe7,0xfe,0x0, 0x80,0x8f,0x53,0xe2,0x0, 0xcf,0x3c,0x5, 0xaf,0xea,0x13, +0x7e,0xf0,0x17,0xb, 0x3f,0xee,0xe7,0xff,0x0, 0x81,0xdd,0xef,0xea,0x14,0x7f,0x8, +0xea,0x13,0x7f,0xfc,0x3e,0x6e,0x3e,0xef,0xe1,0x80,0xb9,0x1c,0xea,0x13,0x7c,0x70, +0xe1,0x80,0xb9,0x1d,0x15,0xa, 0xb9,0x1e,0x14,0x81,0xb9,0x1f,0xb1,0x2c,0xb1,0x2d, +0xe0,0x1, 0xda,0xa, 0xea,0x13,0x7f,0xe4,0x3f,0x6f,0xe1,0x80,0xb9,0x1e,0xb9,0x1f, +0xb1,0x2e,0xc0,0x28,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x9, 0x39,0x12,0xf0,0xa, +0x3b,0x92,0x8a,0x89,0x88,0x8a,0xe7,0xfd,0x0, 0xb5,0x66,0x8a,0x15,0x81,0x3e,0x92, +0xad,0x8d,0xe7,0xff,0x0, 0x89,0x8d,0x53,0xe2,0x0, 0xcd,0x3c,0xe7,0xff,0x5, 0xb1, +0xf0,0xa, 0x3b,0x92,0x88,0x8a,0x20,0xa6,0xf7,0xfd,0x2e,0x96,0xf0,0xa, 0x39,0x12, +0x8a,0x8a,0xe7,0xfd,0x0, 0xb8,0x14,0x1e,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8e,0x3f,0x6f,0xe7,0xfd,0x2, 0xff,0x17,0xf, 0x3f,0xee,0xe2,0x1, 0xc7,0xff, +0x3f,0xf5,0xe7,0xfe,0x5, 0x81,0xe7,0xfd,0x0, 0xfb,0xea,0x13,0x7e,0xf0,0x17,0x5, +0x3f,0xee,0xe7,0xfe,0x0, 0xab,0xea,0x13,0x7e,0xf0,0x17,0x2, 0x3f,0xee,0xe7,0xfe, +0x0, 0xa5,0x15,0x12,0xe7,0xfc,0x0, 0xee,0xea,0x13,0x7c,0xba,0xf0,0x0, 0xae,0x89, +0xe7,0xfc,0x0, 0xae,0xe0,0x2, 0x1f,0x40,0xe0,0x2, 0x1f,0xc8,0xe0,0xa, 0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x1, 0x77,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0xe0,0x0, +0x1, 0x75,0xea,0x13,0x7f,0xb8,0x8f,0xf, 0x27,0x37,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, +0x1e,0xc7,0xe0,0x1, 0x1, 0xb, 0xe0,0x2, 0x1f,0xd1,0x17,0x0, 0xaf,0xf, 0x9f,0x8d, +0xe2,0x1, 0xcf,0x96,0xe0,0x0, 0x5, 0xce,0xea,0x13,0x7f,0x36,0x87,0x8e,0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xaf,0x8e,0xe0,0x1, 0x5, 0x97,0xe0,0x2, +0x1e,0xda,0x16,0x28,0xe2,0x0, 0xcf,0x83,0xae,0xd, 0xe0,0x0, 0x5, 0xed,0x17,0x80, +0xe0,0x2, 0x1e,0x4e,0xe0,0x2, 0x1d,0x4d,0xaf,0x8e,0xe0,0x0, 0x15,0xf7,0x17,0x1e, +0xaf,0xc, 0x17,0xa8,0x17,0x1e,0xad,0x8a,0x27,0x3, 0xc7,0x7f,0xaf,0xc, 0x27,0xb9, +0xc7,0xff,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1e,0xdd,0x8e,0x8d,0xe0,0x0, 0x26,0xd0, +0xe0,0x1, 0x1e,0xc7,0x9e,0xd, 0xe2,0x3, 0xce,0x10,0xe0,0x0, 0x5, 0xe1,0xea,0x13, +0x7d,0xb7,0x86,0xb, 0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0xe2,0x0, 0xce,0x1, 0xae,0xb, +0xe7,0xff,0x5, 0xbb,0xea,0x13,0x7e,0x39,0xaf,0xc, 0x17,0x1, 0xaf,0xf, 0x17,0x4, +0xe0,0x2, 0x1f,0xd1,0xaf,0xf, 0x9f,0x8d,0xe2,0x1, 0xcf,0x96,0xe7,0xff,0x2, 0xb6, +0xea,0x13,0x7f,0xb6,0xe0,0x2, 0x1e,0xda,0x17,0x0, 0xaf,0xf, 0x8f,0x8d,0xe0,0x2, +0x1d,0x4d,0xe0,0x2, 0x1e,0x4e,0x8f,0xa, 0xe0,0x0, 0x2f,0x4d,0x8f,0xc, 0x0, 0xc5, +0x38,0x82,0x8f,0xf, 0xe7,0xff,0x2f,0xa, 0xea,0x13,0x7f,0x36,0x17,0x80,0xaf,0x8e, +0xea,0x13,0x7d,0xb9,0xe0,0x2, 0x1f,0x51,0xea,0x13,0x7e,0x38,0xaf,0x8e,0xea,0x13, +0x7e,0xb7,0xe0,0x2, 0x1f,0x4d,0xaf,0x8e,0xe0,0x2, 0x1f,0x4e,0xaf,0x8e,0xe0,0x2, +0x1f,0x5a,0xaf,0x8b,0xaf,0x8c,0xaf,0x8d,0xaf,0x8e,0x38,0x82,0xe0,0x1, 0x1e,0xc7, +0xe7,0xfe,0x0, 0xfb,0x17,0xa8,0x0, 0xd4,0x9f,0xd, 0xe2,0x2, 0xcf,0x2b,0x2, 0x94, +0xea,0x13,0x7e,0x39,0x87,0xc, 0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x32, +0x5, 0x91,0x17,0x0, 0xaf,0xc, 0xaf,0xf, 0xe7,0xfe,0x0, 0xe7,0xea,0x13,0x7f,0xb7, +0xaf,0xf, 0xe7,0xfe,0x0, 0xe2,0xea,0x13,0x7f,0xb9,0x17,0x0, 0xaf,0xf, 0xe7,0xff, +0x0, 0xa8,0xaf,0xc, 0xe7,0xff,0x0, 0xa5,0xe0,0x2, 0x1e,0xda,0x8f,0x8d,0xe7,0xff, +0x0, 0xb0,0x15,0xff,0x3d,0x9e,0xe2,0x1, 0xc5,0xff,0x8f,0xc, 0xad,0x8a,0xe7,0xfe, +0x0, 0xf5,0x8, 0xb1,0xe2,0x0, 0xcc,0x2, 0x1, 0x21,0xe2,0x0, 0xcc,0x3, 0x1, 0x16, +0xe2,0x0, 0xcc,0x1, 0x1, 0x2, 0x8, 0xe1,0xef,0xfc,0xdb,0x56,0xe0,0x2, 0x1f,0xd2, +0xac,0xf, 0xe0,0x2, 0x1f,0x84,0x24,0x20,0x17,0x0, 0xaf,0xf, 0x17,0xa, 0xe0,0x2, +0x1f,0x88,0xb7,0xf, 0x8, 0xa1,0xe7,0xfe,0x0, 0x97,0xef,0xff,0xd2,0x3f,0xef,0xff, +0xd1,0xab,0xdc,0xbb,0x8, 0xa1,0xe7,0xf2,0x0, 0xd7,0xe0,0x2, 0x1f,0xd0,0x17,0x0, +0xaf,0xf, 0xef,0xff,0xd1,0x5a,0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f,0x2f,0xdc, +0x8, 0xa1,0xe7,0xe1,0x0, 0xf1,0x8f,0xf, 0xe2,0x0, 0xcf,0x1, 0x1, 0xe4,0x0, 0xdd, +0xe0,0x1, 0x1f,0x8e,0x8f,0x8f,0x27,0x9b,0x16,0x7f,0x3e,0x1f,0xe2,0x1, 0xc6,0x7f, +0xc6,0x1, 0xe4,0x0, 0xc6,0xa, 0x16,0x83,0x3e,0x18,0xe0,0xff,0x17,0x7f,0x17,0x80, +0xae,0x88,0xc4,0xa, 0x3c,0x7c,0xe0,0x41,0xae,0x98,0xe0,0x40,0xb7,0x48,0xe0,0x40, +0xb7,0x38,0xe0,0x40,0xaf,0xc8,0xe0,0x40,0xaf,0xa8,0x1, 0xf3,0x38,0x82,0x0, 0x0, +0xe0,0x1, 0x1f,0x8e,0xc4,0xff,0x8e,0xf, 0xe0,0x2, 0x1f,0xdf,0x8e,0x8f,0x17,0x80, +0xe0,0x0, 0x26,0x41,0xf0,0x2, 0x1b,0xde,0xf0,0x40,0x3a,0x6f,0xf0,0x0, 0x12,0x82, +0xf0,0x0, 0x13,0x3, 0x15,0xfd,0x15,0x1, 0x0, 0x8f,0x8f,0x78,0x27,0x17,0xf0,0x0, +0xab,0x8, 0x17,0x3, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xaf,0x18,0x3f,0xfc,0xc4,0xa, +0xe0,0x40,0xaf,0x38,0x1, 0x27,0xe0,0x80,0x8f,0x19,0xe2,0x0, 0xcf,0x1, 0x1, 0x11, +0x87,0x18,0x3f,0x5b,0xe2,0x1, 0xc7,0x7d,0x2f,0x69,0x17,0xa, 0x3f,0x3d,0xad,0x8, +0xe8,0xe, 0x3f,0x17,0xc6,0x81,0xaf,0xce,0xe2,0x1, 0xc6,0xff,0x8f,0x8, 0x0, 0xe3, +0x8f,0x18,0xe2,0x0, 0xcf,0x1, 0x1, 0xf, 0xe2,0x0, 0xcf,0x3, 0x1, 0xe, 0x2f,0x5, +0xf0,0x0, 0xaa,0x88,0x17,0x2, 0x0, 0xd7,0xe2,0x0, 0xcf,0x2, 0x1, 0xf0,0xaf,0x8, +0x0, 0xd2,0x38,0x82,0xf0,0x0, 0xab,0x18,0x17,0x0, 0xf0,0x0, 0xaa,0x8, 0x0, 0xcb, +0x8, 0xb6,0xc0,0x4c,0xe0,0x1, 0x1a,0x8e,0xe0,0x2, 0x1f,0xfd,0x8d,0x5, 0xf0,0x0, +0x8a,0x6f,0xf0,0x0, 0x89,0x7f,0xe0,0x3, 0x25,0x6b,0x14,0x7f,0x3c,0x1a,0xe2,0x1, +0xc4,0x7f,0xc4,0x1, 0xe0,0x2, 0x19,0x5e,0xe4,0x0, 0xc4,0xa, 0x14,0x9c,0x15,0x84, +0x16,0x10,0x3f,0xe2,0x3c,0x90,0x3d,0x90,0x3e,0x10,0x3c,0x12,0x16,0xff,0x17,0x0, +0xae,0xcf,0xc7,0x8a,0x3f,0xf8,0xe1,0x80,0xae,0x99,0xe1,0x80,0xaf,0x1b,0xe1,0x80, +0xaf,0x1c,0x1, 0xf7,0xe0,0x2, 0x1a,0x5f,0xea,0x23,0x79,0x94,0xf0,0x0, 0x8b,0x4, +0xf0,0x0, 0x2b,0x22,0x8f,0x83,0x27,0x97,0xe0,0x3, 0x25,0x50,0x17,0x7f,0x3f,0x1a, +0xe2,0x1, 0xc7,0x7f,0xc7,0x1, 0xe4,0x0, 0xc7,0xa, 0xe0,0x2, 0x1f,0xde,0x39,0x1e, +0xe0,0xff,0x17,0x7f,0xe0,0x12,0xb7,0x7f,0xc7,0x8a,0x39,0x7f,0xe0,0x12,0xb7,0x3f, +0x1, 0xfa,0x8f,0x84,0xe0,0x2, 0x1c,0x57,0x14,0x84,0x3c,0x90,0xaf,0x83,0xdf,0x61, +0xc0,0x34,0xb, 0x61,0xf0,0x0, 0x8b,0x83,0xf0,0x2, 0x23,0x8f,0xe0,0x3, 0x25,0x31, +0x16,0xff,0x3e,0x9a,0xe2,0x1, 0xc6,0xff,0xe0,0x1, 0x1f,0x7f,0xf0,0x1, 0x1a,0xe5, +0xe0,0x26,0xc6,0xb6,0x36,0xa2,0x3e,0x9e,0xe8,0x40,0x3f,0xe5,0xe0,0xff,0x17,0x7f, +0xb7,0xf, 0xc7,0x84,0x3f,0xfd,0xe0,0x40,0xb7,0x1f,0xe0,0x2, 0xb7,0x2f,0xe0,0x2, +0xb7,0x3f,0x1, 0xf7,0x17,0x81,0xf0,0x13,0x32,0x26,0xf0,0x14,0x31,0x26,0xf9,0x31, +0x3b,0x96,0xf1,0x2e,0x3b,0x9f,0xf1,0xff,0xc1,0xdf,0xf1,0xff,0xc2,0x5f,0x14,0x0, +0xf0,0x11,0x38,0xde,0xf8,0x43,0x39,0x93,0xf8,0x43,0x3a,0x14,0xf0,0x40,0x39,0x6f, +0xf0,0x40,0x38,0x68,0x25,0x19,0x17,0x80,0x16,0x10,0xe0,0x2, 0x1f,0x57,0x3e,0x10, +0x3e,0xef,0x9d,0x9e,0xe4,0xd, 0x36,0xc8,0xe2,0xff,0xcd,0xff,0x1, 0x4, 0x8c,0x8c, +0xe0,0x1, 0x24,0xec,0xc7,0x81,0xe4,0xd, 0x37,0xa8,0xe4,0xb, 0x36,0xc8,0x3d,0x7b, +0xc7,0xa, 0xc6,0x1, 0x2, 0xef,0xc4,0x1, 0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40, +0x3b,0xff,0xf0,0x0, 0xc2,0x84,0x2, 0xdf,0xe0,0x0, 0x25,0x40,0x14,0x7f,0x3c,0x1a, +0xe2,0x1, 0xc4,0x7f,0xc4,0x1, 0x14,0x8a,0x3c,0xb8,0xea,0x23,0x7e,0x80,0xea,0x22, +0x7f,0x6c,0xe0,0x2, 0x1f,0xde,0x3c,0x92,0xe0,0x12,0x95,0xff,0xe0,0x13,0x96,0xf, +0xc7,0x8a,0x3f,0xf9,0xe1,0x80,0xb5,0x9d,0xe1,0x80,0xb6,0x1e,0x1, 0xf6,0x15,0x9c, +0x3d,0x90,0x3c,0x1b,0x10,0x81,0x13,0x0, 0x0, 0x84,0xc5,0x81,0x3d,0xf8,0x1, 0x1d, +0x8f,0x8b,0xe2,0x1, 0xcf,0xff,0x1, 0xfa,0x4f,0x10,0x16,0x91,0x3e,0x90,0x17,0x81, +0xe0,0x2, 0x27,0x29,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3f,0x7a,0x3c,0xef,0x3, 0xee, +0xe1,0x80,0x8e,0x1d,0xc7,0x81,0x2e,0x77,0xaf,0xb, 0xe2,0x0, 0x7e,0x90,0xc5,0x81, +0x3c,0x9d,0x3d,0xf8,0xa8,0x89,0x1, 0xe5,0x15,0xff,0xe8,0xb, 0x3d,0x96,0xe2,0x1, +0xc5,0xff,0xc5,0x81,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1f,0xde,0xe0,0x1, 0x1f,0x66, +0x3d,0x92,0x96,0xf, 0x96,0x9f,0xc7,0x8a,0xb6,0xe, 0x3f,0xfb,0xc7,0x4, 0xe0,0x40, +0xb6,0x9e,0x1, 0xf8,0xe0,0x1, 0x1e,0xe0,0xe0,0x1, 0x1f,0x5f,0xe0,0x1, 0x1f,0xf9, +0x36,0xc1,0x37,0xc1,0x37,0x41,0xe2,0x0, 0x7c,0x28,0x7f,0x8d,0x7e,0x8b,0x7f,0xc, +0xf0,0x0, 0x6b,0xa8,0xf0,0x0, 0x6b,0x29,0xe0,0x1, 0xd2,0x36,0x8f,0x84,0x8c,0x5, +0x27,0xae,0x15,0x7f,0xe0,0x1, 0x1f,0xf8,0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0x4d, +0xc5,0x12,0x9a,0x8f,0xe0,0x1, 0x1f,0xff,0x35,0x21,0x14,0x80,0xf0,0x2, 0x1b,0xd7, +0x3d,0x1f,0xf0,0x0, 0x13,0x1, 0x38,0xe9,0x24,0x14,0x3d,0xe9,0xe2,0x1, 0xc5,0xff, +0x3a,0xfb,0xe0,0x1, 0x1f,0x78,0x17,0x81,0x1, 0x88,0xe0,0x1, 0x0, 0x9d,0xe0,0x80, +0x9e,0x9e,0x3e,0xfb,0xe0,0x1, 0x1, 0x1a,0x3d,0x7e,0x3e,0x6f,0xc7,0x81,0x1, 0xf8, +0xc4,0x81,0x8f,0x84,0xe2,0x1, 0xc4,0xff,0x3f,0xf9,0x2, 0xe7,0xe7,0xfe,0x24,0x3, +0x16,0xff,0x3e,0x98,0xe2,0x1, 0xc6,0xff,0x17,0x4, 0x3f,0x10,0xc6,0x81,0xe0,0x2, +0x1f,0xde,0x3e,0x9e,0xe0,0xff,0x15,0xff,0xe1,0x80,0x8e,0x1e,0xe2,0x0, 0xce,0x1, +0x1, 0x5, 0xe0,0x12,0xb5,0xff,0xe0,0x13,0xb5,0x8f,0x3e,0xfe,0xc7,0x8a,0x1, 0xf5, +0x8f,0x84,0xe7,0xfd,0x0, 0xe9,0xe0,0x2, 0x1c,0xd7,0x15,0x1, 0x17,0x8a,0xe8,0xf, +0x3f,0xb7,0x16,0x1, 0xe0,0xe, 0x39,0x1f,0x96,0x8e,0x95,0x9e,0x3f,0x99,0xb6,0x9f, +0xe8,0xc, 0x3e,0x17,0xb5,0xaf,0xe2,0x0, 0x7e,0x84,0xe8,0xd, 0x3e,0x97,0x8f,0x84, +0xf0,0x0, 0xab,0xce,0xf0,0x40,0x3b,0xec,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3f,0xf7, +0xad,0xd, 0x2, 0xe5,0xe7,0xfd,0x0, 0xc8,0xf0,0x0, 0x28,0x9c,0x97,0x2e,0xe8,0x0, +0xb5,0x85,0xe8,0x0, 0xb7,0x15,0xe2,0x0, 0x7f,0x1c,0xe2,0x0, 0x7e,0x10,0x3f,0x18, +0x3f,0x9c,0xc4,0x1, 0xf0,0x0, 0xa9,0xf, 0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40, +0x3b,0xff,0xae,0x8e,0xf0,0x0, 0xc2,0x84,0xe7,0xfd,0x2, 0xee,0xe7,0xfe,0x0, 0x8e, +0xea,0x23,0x7e,0x0, 0xe0,0x6, 0x37,0xa1,0x3e,0x16,0x98,0x8c,0xe2,0xff,0xc8,0xff, +0x1, 0x5e,0xea,0x22,0x7c,0xec,0x9e,0x2e,0xe0,0xe, 0x35,0xa1,0x3c,0x96,0x3f,0x21, +0x95,0x89,0xe0,0x43,0x3f,0x1e,0x36,0x21,0xe2,0x0, 0xcf,0x0, 0x3e,0x2b,0xe0,0x43, +0x3e,0x1c,0x3d,0xee,0xe0,0x0, 0x4, 0x43,0xe2,0x0, 0xce,0x0, 0xe0,0x43,0x3d,0x9b, +0x3f,0x6c,0x4, 0x39,0xf0,0x40,0x39,0xfb,0xe0,0x43,0x3f,0x1e,0xe8,0x6b,0x3d,0x23, +0xf0,0x40,0x3a,0x7e,0xe8,0x0, 0xb5,0x85,0xe8,0x6e,0x3d,0x24,0xe8,0x0, 0xb7,0x15, +0xe7,0xff,0x0, 0xbb,0xe0,0x40,0x3e,0x61,0xe2,0x0, 0x7f,0x9c,0x3e,0x1f,0x8f,0x8c, +0xe2,0x1, 0xcf,0xff,0xe7,0xfe,0x1, 0x66,0x17,0xa, 0x3f,0x39,0x16,0x8a,0x3f,0x12, +0x3e,0xbf,0x96,0x1e,0x95,0x8e,0xaf,0xce,0xe8,0xe, 0x3e,0x97,0xe2,0x0, 0x7e,0x84, +0x3f,0x9d,0xb5,0x9e,0xc4,0x81,0xb6,0x2e,0xe2,0x1, 0xc4,0xff,0xf0,0x0, 0xab,0xf, +0x8f,0x84,0x3f,0xf9,0xe7,0xfe,0x2, 0xba,0xe7,0xfe,0x0, 0xd2,0xe0,0x2, 0x19,0x5e, +0xe7,0xfc,0x0, 0xb2,0xe8,0x40,0x3f,0x60,0x0, 0xc6,0xe8,0x40,0x3d,0xe0,0xe7,0xff, +0x0, 0xbd,0x3c,0xe6,0xe7,0xfd,0x0, 0xe2,0x3f,0xea,0xe7,0xfc,0x0, 0xc5,0xf0,0x1, +0x1a,0xe5,0xe7,0xfc,0x0, 0xe9,0x8, 0xb3,0x3f,0x83,0xef,0xfa,0xdf,0xa, 0x14,0x0, +0xef,0xfa,0xde,0xe6,0xef,0xfb,0xd2,0x56,0xef,0xfa,0xdf,0x46,0xef,0xfa,0xd8,0x96, +0xef,0xfa,0xd9,0xf2,0xef,0xfa,0xdf,0x71,0xea,0x23,0x7f,0x18,0x16,0x80,0xea,0x23, +0x7f,0x96,0xb6,0x8e,0xe0,0x13,0x17,0x44,0xb7,0xf, 0xef,0xfa,0xdf,0x20,0xe0,0x2, +0x19,0xe6,0xef,0xfb,0xd1,0x2a,0xef,0xfa,0xdf,0x40,0xef,0xfa,0xdf,0x93,0x17,0x83, +0xaf,0x83,0xef,0xfd,0xd8,0x6a,0xef,0xfa,0xdf,0xbc,0xef,0xfb,0xd2,0xe1,0xef,0xfb, +0xd1,0xda,0x3b,0x0, 0xe0,0x1, 0x19,0x42,0xef,0xfa,0xda,0x2a,0xe0,0xe, 0x8c,0xa2, +0xe0,0xe, 0x8c,0x12,0xe0,0x1, 0x15,0x78,0xe0,0x0, 0xdf,0xa0,0x87,0x83,0xe0,0x10, +0x8f,0x72,0xe2,0x0, 0xc7,0x81,0x3f,0x7f,0x1, 0x11,0xe0,0xe, 0x8d,0x82,0xe0,0xd, +0x8d,0x62,0xe0,0xd, 0x8c,0xf2,0xe0,0xd, 0x8c,0x52,0x16,0x18,0xe0,0x0, 0xdf,0xa6, +0xe0,0x3, 0x1f,0xb4,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xe0,0xd, 0x8d,0xf2,0xe0,0xd, +0x8d,0x52,0xe0,0xe, 0x8c,0x82,0xe0,0xd, 0x8c,0x62,0x16,0x18,0xe0,0x0, 0xdf,0x96, +0xe0,0x3, 0x1f,0xb4,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xea,0x23,0x7f,0x18,0xea,0x23, +0x7f,0x96,0x16,0x80,0xb6,0x8e,0xb4,0xf, 0x38,0x82,0xea,0x23,0x7f,0x18,0x97,0x8e, +0xea,0x23,0x7e,0x96,0xc7,0x81,0x9e,0x8d,0xe3,0xff,0xc7,0xff,0x3e,0xff,0xb7,0x8e, +0x2, 0x82,0x38,0x82,0xe7,0x5e,0x0, 0xe1,0xe0,0x2, 0x1f,0xdf,0xe0,0x2, 0x1e,0xde, +0x8f,0xf, 0xe2,0x0, 0xcf,0x1, 0x1, 0xd, 0xea,0x23,0x7f,0x32,0x16,0x0, 0xea,0x23, +0x7e,0xb3,0xeb,0xff,0x7f,0xd8,0xae,0xe, 0x17,0x1e,0xae,0xd, 0xaf,0xf, 0x38,0x82, +0xfa,0x23,0x7b,0x33,0xe8,0x0, 0x8f,0x86,0x2f,0x96,0xe0,0x19,0x9f,0x8d,0xe2,0x2, +0xcf,0x80,0xe0,0x6, 0x9f,0xbd,0xe0,0x1, 0x1, 0x17,0xe0,0x6, 0x9e,0x2d,0xea,0x23, +0x7d,0xb2,0x8f,0xb, 0xe2,0x0, 0xcf,0x1, 0x1, 0x36,0xea,0x23,0x7f,0x1c,0xb6,0xe, +0xb7,0x9e,0x38,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0xf, 0xea,0x23,0x7d,0xb2,0x8f,0x8b, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x69,0xea,0x23,0x7f,0x1c,0xe0,0x6, 0x9f,0xbd, +0xe0,0x6, 0x9e,0x2d,0x0, 0xed,0xe0,0x19,0x9f,0x8d,0xf0,0x6, 0x9a,0x3d,0xe2,0x2, +0xcf,0x81,0xf0,0x6, 0x99,0xad,0xe0,0x1, 0x1, 0x16,0xea,0x23,0x7d,0xb2,0x8f,0x8b, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x6d,0xf2,0xa, 0xca,0x50,0xe0,0x1, 0x2, 0xd9, +0xeb,0xff,0x7c,0x58,0x17,0x81,0xaf,0x8b,0x17,0x1d,0x17,0x9d,0xaf,0x88,0xf0,0x40, +0x3b,0xee,0x0, 0x8b,0xeb,0xff,0x7c,0x58,0xf0,0x0, 0x8b,0x88,0xf0,0x40,0x3a,0x6f, +0xe8,0x40,0x3f,0x67,0xf0,0x40,0x39,0xec,0xe0,0x1, 0x1f,0xd5,0xe0,0x0, 0x14,0xc0, +0x3f,0x9e,0xea,0x23,0x7f,0x1c,0x8f,0x8f,0x9d,0xe, 0xf0,0x0, 0x9a,0x9e,0x3c,0xaf, +0xe0,0xc, 0x3d,0x3f,0xf0,0x12,0x39,0xb9,0xe8,0xf, 0x3f,0xb5,0xe8,0x9, 0x3c,0xb4, +0xe8,0xc, 0x3e,0x12,0x3f,0x99,0x36,0x46,0x37,0xc6,0xe3,0xff,0xc6,0x7f,0xe3,0xff, +0xc7,0xff,0x14,0x80,0xe8,0x0, 0xac,0x86,0xe0,0x6, 0xb6,0x2d,0xe0,0x6, 0xb7,0xbd, +0xf0,0x0, 0x2b,0x86,0xf0,0x0, 0xab,0x8b,0xe7,0xff,0x0, 0x9b,0xf0,0xa, 0x39,0xaa, +0xe0,0x43,0x3d,0x1a,0xe4,0xb, 0x35,0xf, 0xe2,0xd, 0x3d,0xca,0x3e,0xab,0xe0,0x43, +0x3e,0x9d,0x15,0x82,0xe0,0x2d,0x3e,0x9b,0x2e,0x90,0xf8,0xd, 0x3a,0x25,0xe0,0x43, +0x3e,0x9d,0xe4,0xa, 0x36,0x8f,0xe2,0xd, 0x3d,0x4d,0x3e,0xaa,0xe0,0x43,0x3e,0x9d, +0xe0,0x2d,0x3e,0x9b,0xe7,0xfe,0x26,0xfd,0xf1,0xff,0xc3,0xff,0xf0,0x0, 0xab,0x88, +0xe7,0xfe,0x0, 0xf7,0xe7,0xf5,0x16,0x2f,0x3e,0x1f,0xe2,0x0, 0xce,0x4e,0xe0,0x6, +0x9e,0x2d,0xe7,0xfe,0x2, 0xe6,0xe7,0xff,0x15,0xaf,0x3d,0x9c,0xe2,0x4, 0xcd,0xa4, +0xe7,0xfe,0x2, 0xdf,0xea,0x23,0x7d,0xb2,0x8c,0x8b,0xea,0x23,0x7d,0x28,0xeb,0xff, +0x7c,0x58,0xe8,0x0, 0xaf,0x6, 0xe2,0x0, 0xcc,0x81,0x17,0x1e,0xb6,0xa, 0xb7,0x9a, +0xaf,0x8, 0xe7,0xfe,0x1, 0xd4,0xf0,0x40,0x39,0xec,0xf0,0x40,0x3a,0x6f,0xe7,0xfe, +0x0, 0xfd,0xe7,0xf5,0x17,0xaf,0xe8,0xf, 0x3f,0x94,0xe2,0x0, 0xcf,0xce,0xe7,0xfe, +0x2, 0xe6,0xea,0x23,0x7f,0xa8,0xf0,0x0, 0x9b,0x8f,0x9c,0x1f,0xf8,0xb, 0x39,0xa7, +0xe0,0x43,0x3d,0x9b,0xe4,0xe, 0x35,0x8f,0xf0,0xc, 0x3a,0x28,0xe0,0x43,0x3e,0x1c, +0xe2,0xf, 0x3f,0x4b,0xe4,0x9, 0x36,0xf, 0x3f,0xae,0xe0,0x43,0x3f,0x9f,0xe2,0xe, +0x3c,0xcc,0xe0,0x0, 0x15,0x63,0x3f,0x29,0xe0,0x29,0x3d,0x2f,0xe0,0x43,0x3f,0x1e, +0x24,0xaf,0xe0,0x2a,0x3d,0x2e,0x25,0x2c,0x3f,0x9e,0xe2,0x1, 0xcf,0x95,0x2, 0x28, +0x35,0x82,0x36,0x2, 0xe8,0xb, 0x3d,0x97,0x3e,0x18,0xf0,0x40,0x39,0xeb,0xf0,0x40, +0x3a,0x6c,0xf3,0xff,0xc1,0xff,0xf3,0xff,0xc2,0x7f,0xf0,0x6, 0xb1,0xad,0xf0,0x6, +0xb2,0x3d,0xe7,0xfe,0x0, 0xac,0xeb,0xff,0x7c,0x58,0xf0,0x0, 0x8b,0x88,0xf0,0x6, +0x99,0xad,0xe8,0x40,0x3f,0x67,0xf0,0x6, 0x9a,0x3d,0xe7,0xfe,0x0, 0xbf,0xea,0x23, +0x7f,0x1c,0xe8,0x40,0x3f,0xe4,0xe8,0x40,0x3e,0x63,0xe7,0xfd,0x0, 0xfa,0xea,0x23, +0x7d,0xb2,0xeb,0xff,0x7c,0x58,0x17,0x81,0xaf,0x8b,0xe7,0xfe,0x0, 0x9f,0xeb,0xff, +0x7c,0x58,0xe7,0xfe,0x0, 0x9b,0xf0,0x2, 0x1b,0x5e,0xe4,0x0, 0xc5,0xa, 0xf0,0x1, +0x1a,0xd7,0xf0,0xe, 0x3b,0x1a,0xf0,0xd, 0x8b,0x8e,0xe8,0x0, 0x8e,0x85,0xe0,0xd, +0x87,0xae,0xe8,0x40,0x3e,0xf7,0xe4,0xf, 0x37,0xac,0xe0,0xd, 0x8f,0x1e,0xe4,0xf, +0x37,0xc8,0x5, 0x9a,0xe0,0x2, 0x1e,0xcf,0xe0,0x2, 0x1d,0xa6,0x8e,0x8d,0x26,0xa2, +0xe0,0x0, 0x1e,0x4f,0xe8,0xe, 0x3d,0x97,0xe8,0xf, 0x3e,0x17,0x8f,0xe, 0x8f,0x8f, +0x16,0x8a,0xe8,0xd, 0x3e,0xb7,0xe8,0xd, 0x3e,0x96,0xe0,0x2, 0xc6,0xac,0x8e,0x8d, +0xe2,0x0, 0xce,0x81,0x1, 0x31,0xe8,0x2, 0x8e,0xe5,0xe2,0x1, 0xce,0xff,0x1, 0x87, +0xe8,0xa, 0x3d,0x16,0xe0,0xd, 0x8f,0xa, 0xe1,0x2e,0x3f,0xd, 0xaf,0x8, 0xaf,0x89, +0x38,0x82,0xe8,0xc, 0x3d,0x97,0x8e,0x8c,0x2e,0xa9,0xaf,0xc, 0xe0,0x0, 0x1e,0x4f, +0xe8,0x14,0x3e,0x17,0xe8,0x0, 0x8e,0x84,0x26,0xb9,0xe0,0x13,0x3f,0xad,0xf8,0x43, +0x39,0x13,0xf2,0x0, 0xc9,0x0, 0xf8,0x41,0x39,0x42,0xe8,0x73,0x3d,0x22,0xf2,0x0, +0xc9,0xa0,0x5, 0x30,0x3f,0xfd,0x5, 0xa6,0x17,0x90,0x3f,0x9d,0xe2,0x1, 0xc7,0xff, +0xe8,0x0, 0xaf,0x84,0x0, 0xc6,0x16,0x80,0xe8,0xb, 0x3d,0x97,0xe8,0xc, 0x3e,0x17, +0x17,0x80,0xae,0x8b,0x3f,0x6f,0xae,0x8c,0x0, 0xc7,0xe0,0x14,0x3f,0x2d,0xf8,0x43, +0x39,0x94,0xf2,0x0, 0xc9,0x80,0xf8,0x41,0x39,0xc3,0xe8,0x74,0x3d,0x23,0xf2,0x0, +0xca,0xf, 0x5, 0x13,0x3f,0x7d,0x5, 0x94,0x17,0x1, 0x3f,0x1d,0xe2,0x1, 0xc7,0x7f, +0x0, 0xc5,0x17,0xf0,0x3f,0x9d,0xe2,0x1, 0xc7,0xff,0xe8,0x0, 0xaf,0x84,0xe7,0xff, +0x0, 0xa1,0x3f,0xed,0xe7,0xff,0x0, 0x9e,0x3f,0x6d,0xe7,0xff,0x0, 0xb9,0x17,0x7f, +0x3f,0x1d,0xe2,0x1, 0xc7,0x7f,0xaf,0xc, 0xe7,0xff,0x0, 0xb2,0xe0,0x2, 0x1e,0xde, +0xe0,0x19,0x9f,0x8d,0xe2,0x0, 0xcf,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0xcc,0x8f,0xf, +0x27,0x1a,0xe0,0x0, 0x1f,0xc5,0xe0,0x2, 0x1e,0x58,0x94,0xf, 0x94,0x9f,0x95,0x2f, +0x95,0xbf,0x97,0xcf,0xe0,0x6, 0xb4,0x2d,0xe2,0x0, 0xcf,0x3, 0xb4,0x9c,0xb5,0x2c, +0xb5,0xbc,0xb7,0xcc,0x1, 0x27,0xe2,0x0, 0xcf,0x1, 0x1, 0x2, 0x17,0x2, 0xe0,0x2, +0x1f,0xd7,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xcb,0x87,0x8f,0xc7,0xff,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0xba,0x2, 0xda,0xe0,0x0, 0x1f,0xc5,0xe0,0x2, 0x1f,0x58, +0x94,0x8f,0x95,0x1f,0x95,0xaf,0x96,0x3f,0xe0,0x2, 0x1c,0x4c,0x97,0xcf,0xe0,0x6, +0xb4,0xad,0xf0,0x0, 0x13,0x83,0xf0,0x0, 0xab,0x88,0xb5,0x1e,0xb5,0xae,0xb6,0x3e, +0xb7,0xce,0x17,0x0, 0xe0,0x2, 0x1f,0xd7,0xaf,0xf, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x5c,0xe0,0x2, 0x18,0xc0,0xe0,0x1, 0x1e,0xda,0x17,0x80,0xe0,0xa, +0x8f,0x1, 0x6f,0xa6,0x7c,0x8, 0x6f,0xa7,0xaf,0x9d,0xe0,0x4, 0x27,0x5a,0xe0,0x2, +0x1a,0xdc,0xf0,0x2, 0x1f,0x5e,0x7a,0x86,0xef,0xfc,0xd3,0xb8,0xe0,0x1, 0x1b,0xd7, +0xdf,0x9e,0x8a,0x7, 0xe0,0x0, 0x22,0x4a,0xf0,0x1, 0x1e,0x8e,0xfa,0x23,0x7c,0x38, +0xe8,0x0, 0x8c,0x8d,0xe0,0x2, 0x1e,0x5e,0xe0,0x2, 0x18,0xd7,0x16,0x80,0x0, 0x87, +0xc6,0x81,0x3f,0xed,0xe2,0x1, 0xc7,0xff,0x3f,0xf4,0x3, 0xbb,0xe0,0xd, 0x8f,0x8c, +0x15,0x8a,0x3f,0xf9,0xc6,0xa, 0x3d,0xbf,0x3, 0xf4,0xe0,0xa, 0x3d,0x91,0x8f,0xa, +0xe2,0x0, 0xcf,0x1, 0x1, 0xee,0xf0,0x2, 0x3c,0x1f,0x8f,0x2, 0x2f,0x6a,0xe0,0x1, +0x87,0xa, 0xc7,0x7f,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x3a,0x2, 0xe2,0xea,0x23, +0x7e,0x34,0xe4,0x0, 0xc6,0x8a,0x14,0x83,0xac,0x82,0xe0,0x0, 0xc6,0xe4,0xaf,0x8c, +0xe8,0xd, 0x3e,0x9e,0xe0,0x0, 0x1e,0x45,0x3d,0x9c,0x94,0x9b,0x91,0xb, 0x90,0xab, +0x94,0x3b,0x96,0x4b,0xb4,0x9d,0x14,0x83,0xb1,0xd, 0xb0,0xad,0xb4,0x3d,0xb6,0x4d, +0x16,0x80,0xae,0x8a,0xe0,0x6, 0x0, 0xcd,0xfa,0x23,0x7c,0x38,0xf0,0x1, 0x1e,0x8e, +0xea,0x23,0x7f,0xb4,0x8f,0x8f,0xf0,0xd, 0x3c,0x1f,0x8c,0x8d,0xe0,0x6, 0x2c,0x98, +0xe0,0x2, 0x1e,0xd5,0xe0,0x2, 0x1f,0x54,0x8f,0x8d,0x7e,0x87,0x7f,0x5, 0xe0,0x4, +0x27,0x86,0xe0,0x2, 0x1e,0x4c,0x89,0xc, 0x7e,0x3, 0xe0,0x4, 0x29,0xe, 0xe0,0x0, +0x1f,0x1b,0xf0,0x0, 0x1c,0x98,0x8f,0x8e,0x15,0x3e,0xe2,0x0, 0xcf,0x80,0xe0,0x1, +0x1f,0xda,0xe0,0x1, 0x14,0xff,0xe0,0x79,0x39,0x2f,0xe8,0x40,0x3c,0x69,0xf0,0x0, +0x7c,0x82,0xe0,0x1, 0xd3,0x11,0xe0,0x4, 0x22,0x65,0x12,0x0, 0xf0,0x2, 0x1c,0xd7, +0xf0,0x0, 0x1d,0x17,0xf0,0x0, 0x7c,0x4, 0xf0,0x40,0x3e,0x64,0xf8,0x40,0x3c,0x6d, +0x39,0xe4,0x39,0x64,0xf8,0x40,0x3e,0xee,0xf0,0x0, 0x17,0xa, 0xf0,0x1e,0x3f,0x33, +0xe8,0x0, 0x8e,0x8, 0xf8,0xe, 0x3e,0x9e,0xe0,0xd, 0x8d,0xe, 0x3d,0x7c,0xe0,0x1, +0x3, 0x90,0x17,0x8f,0xe0,0x6, 0x35,0x22,0x3f,0xda,0xe4,0x0, 0xc7,0x8a,0xf0,0xd, +0x3d,0x16,0x8c,0xbd,0xe8,0xf, 0x3f,0x99,0x8a,0x8f,0x24,0xb8,0xe0,0x6, 0x9c,0x2e, +0x2c,0x4, 0xe0,0x6, 0x9f,0xbe,0x27,0xb2,0xe2,0x0, 0xcc,0x84,0x10,0xb8,0x2, 0x8d, +0x10,0xb0,0x1, 0xb, 0xe2,0x0, 0xcc,0x83,0x10,0xa0,0x1, 0x7, 0xe2,0x0, 0xcc,0x82, +0x10,0x98,0x17,0x90,0xe0,0x61,0x39,0xaf,0x26,0x1d,0xf0,0x2, 0x1b,0x98,0xe8,0x0, +0x87,0xc7,0xe2,0x0, 0xc7,0x8f,0x3f,0xfa,0xe0,0x2, 0x1, 0x6d,0xe0,0x2, 0x1e,0x98, +0x17,0x81,0x0, 0x89,0xe0,0x1, 0x87,0x6d,0xc6,0x8a,0xe2,0x0, 0xc7,0xf, 0x3f,0x7a, +0xe0,0x2, 0x1, 0x62,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0x3d,0xef,0xc7,0x81, +0x2, 0xf2,0xf0,0xf, 0x3d,0x16,0xc4,0xff,0xac,0xbf,0x17,0xa, 0x3f,0x3a,0xf0,0xf, +0x3c,0x9e,0x8e,0x8f,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1, 0x2, 0xe0,0x1, 0x2a,0x8c, +0x66,0x84,0x3e,0x9a,0x8e,0x8d,0xe0,0x1, 0x2e,0xdf,0x62,0x83,0x8e,0x85,0xe0,0x1, +0x2e,0xdb,0xf8,0xd, 0x3e,0x9e,0xe0,0x6, 0x9e,0xad,0xe2,0x0, 0xce,0x9e,0xe0,0x3, +0x2, 0x96,0xf8,0x9, 0x3e,0x9e,0xe0,0x6, 0x9e,0x39,0xe2,0x0, 0xce,0x13,0xe0,0x3, +0x5, 0x9b,0xe0,0x1, 0x18,0xaf,0xe0,0x1, 0x1a,0xae,0x8c,0x1, 0x8d,0x85,0x34,0x28, +0x3d,0xc8,0xc5,0xed,0x3d,0xfc,0xe0,0x3, 0x5, 0xf, 0xe0,0x2, 0x1d,0xfd,0xe0,0xd, +0x8c,0x39,0x8d,0xdb,0xe0,0xd, 0x8c,0xc9,0x3d,0xb8,0xe0,0x1, 0x18,0xf2,0x3d,0x99, +0xa0,0x81,0x35,0xa1,0x3d,0x91,0x95,0x8b,0xe2,0x1, 0xcd,0xc7,0xe0,0x6, 0x2, 0x4f, +0xe2,0x0, 0xce,0x9e,0xe0,0x6, 0x2, 0xbe,0x17,0x3, 0xaf,0xf, 0xaf,0x1f,0xc1,0x81, +0x8f,0x87,0xe2,0x1, 0xc1,0xff,0x3f,0xf3,0xe7,0xfe,0x2, 0xe0,0xe0,0x2, 0x1f,0x40, +0xe0,0x2, 0x1e,0x4a,0xe0,0xa, 0x8f,0x8e,0xf0,0x0, 0x63,0x82,0x86,0xc, 0xe2,0x0, +0xcf,0x81,0xe8,0x0, 0xa9,0x17,0xf8,0x40,0x3e,0xe8,0xe8,0x0, 0xae,0x7, 0xe0,0x4, +0x1, 0x71,0xe0,0x3, 0x22,0x2d,0x62,0x88,0x11,0x1, 0xe0,0x5, 0x2a,0xaa,0x66,0x5, +0x8f,0x8c,0xe0,0x2, 0x2f,0xaf,0xe8,0x0, 0x89,0x8d,0x67,0x7, 0xe4,0x0, 0xc1,0x8a, +0xf0,0x0, 0x63,0x85,0x62,0x86,0xe0,0x2, 0x1c,0xd8,0xe0,0x2, 0x1c,0x18,0x17,0x80, +0x3d,0x63,0xaf,0x8e,0xe8,0x0, 0xaf,0x87,0xaf,0x85,0xe0,0x1, 0xd1,0xf3,0xe0,0x3, +0x22,0x33,0x3c,0x62,0xc0,0x24,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x66,0x84,0x3e,0x9a, +0x8e,0x8d,0x2e,0x87,0xf0,0x0, 0x63,0x83,0xe8,0x0, 0x8e,0x87,0xe0,0x2, 0x26,0x93, +0xe0,0x0, 0x22,0xda,0xe2,0x0, 0xca,0x83,0xe7,0xff,0x1, 0x33,0xe2,0x0, 0xca,0x81, +0xf8,0xf, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2f,0xf0,0x6, 0x9d,0xbf,0xe0,0x1, 0x1, 0x18, +0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63,0x3c,0x90,0x3c,0x10,0x7f,0x81,0xdd,0x84, +0x67,0x81,0xf2,0x1f,0xc5,0xff,0xe0,0xd, 0x8f,0x8f,0xe2,0x1f,0xc3,0x7f,0xe0,0xe, +0x37,0xac,0xe2,0x1, 0xcf,0xff,0xf0,0x1b,0x3d,0x9e,0xf3,0xff,0xc5,0xff,0xe0,0x0, +0x1, 0x79,0xe4,0x5, 0x32,0xae,0xe4,0x5, 0x32,0xc0,0xf0,0x0, 0x13,0x81,0xf0,0x17, +0x3b,0x92,0xe8,0x40,0x39,0x67,0xe2,0x1, 0xc1,0x7f,0xc2,0x1, 0x3b,0x15,0xe2,0x1, +0xc2,0x7f,0xe3,0xff,0xc3,0x7f,0x17,0x86,0xe8,0xf, 0x3f,0xbc,0x66,0x82,0xf0,0xe, +0x35,0xc8,0x3f,0x9d,0xaf,0x4f,0xe0,0xd, 0x33,0x48,0x47,0x26,0xae,0xaf,0xc1,0x81, +0xaf,0x6f,0xe2,0x1, 0xc1,0xff,0x47,0x27,0xab,0x3f,0xf0,0x0, 0xc6,0x1, 0xf0,0x0, +0xad,0xdf,0xf2,0x1, 0xc6,0x7f,0xaf,0x7f,0x8f,0x87,0x3f,0xf3,0xe7,0xfd,0x2, 0xc6, +0xe7,0xfe,0x0, 0xe6,0xf8,0xf, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2f,0xf0,0x6, 0x9d,0xbf, +0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63,0x3c,0x90,0x3c,0x10,0xdd,0x35,0xf8,0x1e, +0x3f,0x1d,0xe8,0xd, 0x8f,0x8e,0xf2,0x1f,0xc5,0xff,0xe0,0xe, 0x37,0xac,0xe2,0x1, +0xcf,0xff,0xf0,0x1b,0x3d,0x9e,0xe2,0x1f,0xc3,0x7f,0xf3,0xff,0xc5,0xff,0x1, 0x29, +0x12,0x80,0xe7,0xff,0x0, 0xb4,0x15,0x80,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1e,0x18, +0x3d,0x9c,0x9b,0xb, 0xf0,0x0, 0x9d,0x9b,0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63, +0x3c,0x90,0x3c,0x10,0xef,0xff,0xdd,0x11,0xf8,0x1e,0x3f,0x1d,0xe8,0xd, 0x8f,0x8e, +0xf2,0x1f,0xc5,0xff,0xe0,0xe, 0x37,0xac,0xe2,0x1, 0xcf,0xff,0xf0,0x1b,0x3d,0x9e, +0xe2,0x1f,0xc3,0x7f,0xf3,0xff,0xc5,0xff,0xe0,0x80,0x12,0x80,0xe7,0xff,0x1, 0x97, +0xe1,0x80,0xc3,0x0, 0xe3,0xff,0xc3,0x7f,0xe7,0xff,0x0, 0x97,0x26,0x5e,0xe0,0x2, +0x1c,0x98,0x87,0xc9,0xe2,0x0, 0xc7,0x8f,0x3d,0x7f,0x1, 0x4e,0xe0,0x2, 0x1e,0x98, +0x3f,0xe5,0x0, 0x88,0xe0,0x1, 0x87,0x6d,0xc6,0x8a,0xe2,0x0, 0xc7,0xf, 0x3f,0x7a, +0x1, 0x44,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0x3d,0xef,0xc7,0x81,0x2, 0xf3, +0x0, 0xc4,0x15,0x80,0xe0,0x2, 0x1f,0x18,0xe4,0x0, 0xc5,0x8a,0xf8,0xd, 0x3e,0x9e, +0x3d,0x9e,0xf0,0x6, 0x9a,0xbd,0x9f,0xb, 0x9f,0x9b,0xe0,0x0, 0x15,0xc0,0x3d,0xa1, +0x3c,0x3b,0x3f,0x31,0x3f,0xb1,0xe8,0xb, 0x3d,0xb5,0x3f,0x18,0x3f,0x9b,0x37,0x46, +0x37,0xc6,0xe0,0x6, 0xb7,0x2d,0xe0,0x6, 0xb7,0xbd,0xe7,0xfd,0x0, 0x8c,0xe0,0x2, +0x1f,0x4a,0xf0,0x2, 0x1f,0x5e,0x8f,0x8e,0xe0,0x1, 0x27,0xca,0xe0,0x2, 0x1e,0xdc, +0x17,0x81,0x7e,0x86,0xaf,0x8d,0x16,0xb7,0xe0,0x0, 0x1f,0x8d,0xe0,0x1a,0x9f,0xdf, +0xe1,0x2f,0x3f,0x9d,0xaf,0x8e,0xe7,0xfb,0x0, 0x99,0x62,0x85,0x8f,0x85,0xe7,0xfb, +0x2f,0xfa,0x66,0x6, 0x8c,0x8c,0xe7,0xfb,0x2c,0xf6,0xe0,0x2, 0x1a,0xcc,0x89,0x5, +0x7a,0x83,0xe0,0x4, 0x21,0x7e,0x66,0x83,0xc1,0x7f,0xa9,0xd, 0xe7,0xfb,0x0, 0xf1, +0x66,0x83,0x8f,0x8d,0xe7,0xfd,0x2f,0xd1,0xe0,0x2, 0x1c,0x57,0xd8,0x5a,0xe7,0xfd, +0x0, 0xcc,0xf0,0xb, 0x3d,0x16,0xae,0xbb,0xe0,0x2, 0x1d,0xef,0xe0,0x1, 0xae,0x8f, +0xae,0x8b,0xe7,0xfd,0x2a,0xe9,0xe7,0xfc,0x0, 0xe2,0xe0,0x1, 0x1c,0xb1,0xf0,0x1, +0x1b,0xb0,0x8d,0x89,0xe8,0x0, 0x8e,0x7, 0x35,0xa8,0x3e,0x4b,0xc6,0x62,0x3e,0xfc, +0xe7,0xfc,0x3, 0x61,0xe0,0x1, 0x8d,0x8f,0xe0,0x1, 0x25,0x87,0xe0,0x2, 0x1e,0x6f, +0x8e,0xc, 0xe0,0x1, 0x2e,0x2, 0xe0,0x0, 0x1c,0xc5,0xe0,0xc, 0x3c,0x9e,0x9d,0x8c, +0x9c,0x1c,0x2d,0x82,0x24,0x2b,0xf8,0x1, 0x3e,0x9e,0xe0,0x6, 0x9e,0x31,0xe0,0xb, +0x3e,0xab,0xe0,0xd, 0x3e,0x28,0xe4,0x8, 0x36,0x8f,0xe4,0xc, 0x35,0x8f,0xe2,0xd, +0x3c,0x4d,0xe2,0xb, 0x3e,0x4b,0x3e,0xa8,0xe0,0xc, 0x3d,0xac,0x3e,0x9c,0xe2,0x2, +0xce,0xac,0x2, 0x14,0x3f,0x19,0x94,0xe, 0x94,0x9e,0x95,0xae,0x96,0x3e,0x96,0xce, +0xe0,0x0, 0x17,0x64,0xe0,0x6, 0xb4,0x21,0x3f,0x11,0xf0,0x8, 0x3d,0x16,0x10,0x85, +0xa8,0xb8,0xb4,0x9e,0xb5,0xae,0xb6,0x3e,0xb6,0xce,0x17,0x3c,0xe0,0x1, 0xaf,0xf, +0xf8,0xe, 0x3e,0x9e,0xe0,0xd, 0x8c,0x3e,0xe0,0xd, 0x8c,0xce,0xe0,0x0, 0x0, 0xd1, +0xf0,0x2, 0x1b,0xc0,0xe0,0x2, 0x1e,0xca,0xe8,0xa, 0x8f,0x87,0x62,0x82,0x86,0x8d, +0xe2,0x0, 0xcf,0x81,0xaa,0x15,0xae,0x85,0xe0,0x1, 0x1, 0x44,0xf0,0x0, 0x63,0x86, +0xe8,0x0, 0x8f,0x87,0xe0,0x1, 0x2f,0xf8,0xf0,0x0, 0x63,0x85,0xe8,0x0, 0x89,0x7, +0xe0,0x2, 0x21,0x3a,0x62,0x83,0x89,0x5, 0xe0,0x4, 0x21,0x15,0xe8,0x0, 0x89,0x8d, +0x66,0x87,0xe4,0x0, 0xc1,0x8a,0x67,0x5, 0xf0,0x0, 0x63,0x86,0xe0,0x2, 0x1c,0xd8, +0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xaf,0x8d,0x39,0x6f,0xaf,0x8e,0xe8,0x0, 0xaf,0x87, +0xe0,0x1, 0xd0,0x40,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xe0,0x1, 0x14,0xff,0xe0,0x1, +0xd0,0x73,0x3c,0x62,0xc0,0x24,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1e,0x5c, +0x7e,0x6, 0xe7,0xfe,0x0, 0xba,0xf8,0xc, 0x3e,0x9e,0xe0,0x6, 0x9c,0xbc,0xe2,0x0, +0xcc,0xbc,0xe0,0x1, 0x5, 0x9c,0xe0,0xd, 0x8c,0x3c,0xe0,0xd, 0x8c,0xcc,0x7f,0x81, +0xef,0xfc,0xd0,0x8e,0xe0,0x2, 0x1e,0x8b,0xe2,0x0, 0xcc,0x1, 0xac,0xd, 0x67,0x81, +0xe0,0x3, 0x1, 0x0, 0xf8,0xd, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2d,0xe2,0x0, 0xcb,0x1e, +0xe0,0x1, 0x5, 0xc5,0xe0,0x1, 0x1d,0xb1,0xf0,0x1, 0x1b,0xb0,0x8e,0xb, 0xe8,0x0, +0x8f,0x7, 0x36,0x28,0x3f,0x4c,0xc7,0x62,0x3b,0x7e,0xf0,0x6, 0x9d,0xbd,0xe0,0x2, +0x4, 0x7f,0xf2,0x0, 0xcd,0x94,0x5, 0x94,0xe0,0x1, 0x1f,0x2f,0xf0,0x1, 0x1b,0xae, +0x8e,0x8e,0xe8,0x0, 0x8f,0x7, 0x36,0xa8,0x3f,0x4d,0x16,0xec,0x3e,0x9e,0xf0,0x2d, +0x3d,0xad,0xe7,0xfc,0x26,0xef,0xe9,0x2e,0x3f,0x2b,0xe7,0xfc,0x27,0x6b,0x8f,0x6f, +0xe7,0xfc,0x2f,0x68,0x17,0x2, 0xaf,0x6f,0xe7,0xfc,0x0, 0xe4,0xe2,0x0, 0xcc,0x83, +0xe0,0x3, 0x1, 0x6b,0x22,0x1a,0xe8,0xd, 0x8e,0x8e,0xe2,0x1, 0xce,0xff,0xe0,0x3, +0x1, 0x3e,0xe0,0x2, 0x1e,0x5e,0x16,0x81,0x0, 0x89,0xe0,0xe, 0x8d,0xac,0xc6,0xa, +0xe2,0x1, 0xcd,0xff,0xe0,0x1, 0x1, 0x11,0x3e,0xee,0x3f,0x6d,0xe2,0x1, 0xc7,0x7f, +0x3f,0x74,0x17,0x1, 0x3f,0x1d,0x4, 0xf2,0xe2,0x0, 0xcc,0x81,0x15,0x8a,0x3d,0xbf, +0xe0,0x1, 0x1, 0x1c,0xe0,0x2, 0x1e,0xd7,0x3d,0x9d,0x16,0x82,0xae,0x8b,0xe0,0x2, +0x1a,0xd5,0x8e,0x85,0x7a,0x87,0xe0,0x2, 0x2e,0x98,0xe0,0x2, 0x1f,0x54,0x8e,0x8e, +0x7f,0x5, 0x26,0x9c,0xe7,0xf9,0x24,0xbf,0xe0,0x2, 0x1e,0x4c,0xe8,0xf, 0x3f,0x98, +0xc4,0xff,0x89,0xc, 0xac,0x8f,0x7e,0x3, 0xe7,0xf9,0x21,0x3b,0xe7,0xfd,0x0, 0xc5, +0x62,0x86,0x89,0x5, 0xe2,0x0, 0xc9,0x1, 0xe0,0x1, 0x1, 0x11,0x66,0x5, 0x11,0x0, +0x8f,0x8c,0xe7,0xfb,0x27,0x92,0xe7,0xfd,0x0, 0xbd,0xf0,0x0, 0x63,0x86,0xe8,0x0, +0x8e,0x87,0x2e,0xe1,0x2c,0xe2,0xe7,0xfd,0x0, 0xaa,0xe0,0x1, 0x18,0xb1,0xe0,0x1, +0x1a,0xb0,0x8c,0x1, 0x8c,0x85,0x34,0x28,0x3c,0xc8,0x3e,0xf9,0xe7,0xfe,0x2, 0x5d, +0xe0,0x0, 0x1c,0xac,0x8e,0x89,0xe2,0x0, 0xce,0x81,0xe7,0xfe,0x1, 0xd6,0xe0,0x2, +0x25,0xe2,0xe2,0x0, 0xcd,0xbb,0x2, 0x84,0xc5,0x81,0xe0,0x1, 0xad,0x8f,0x17,0x3, +0xaf,0xf, 0xaf,0x1f,0x17,0x80,0xaf,0x89,0x17,0x1, 0xe0,0x2, 0x1f,0xef,0xaf,0xf, +0xe7,0xfa,0x0, 0xbf,0x62,0x88,0x12,0x0, 0x11,0x1, 0xe7,0xfa,0x22,0xda,0xe0,0x0, +0x1c,0x9b,0x16,0x80,0x8f,0x89,0xe0,0x2f,0x3f,0x8d,0xaf,0x89,0xef,0xfa,0xd8,0x10, +0xe0,0x1, 0x1f,0xdc,0x16,0x7b,0xa6,0x8f,0xa7,0xcd,0x3f,0xdc,0xbf,0xcd,0x66,0x5, +0x8f,0x8c,0xe7,0xfa,0x27,0xca,0xe7,0xfc,0x0, 0xf5,0xf0,0x6, 0x9d,0xbd,0xf2,0x0, +0xcd,0x94,0xe7,0xfe,0x5, 0xde,0xe0,0x1, 0x18,0xaf,0xe0,0x1, 0x1a,0xae,0x8e,0x81, +0x8f,0x5, 0xe7,0xfe,0x0, 0xca,0xe4,0x0, 0xc6,0x8a,0xe0,0x0, 0xc6,0xe4,0x15,0x8a, +0x3d,0xbf,0xe0,0x0, 0x1e,0x45,0xe8,0xd, 0x3e,0x9e,0x3e,0x1b,0x91,0xc, 0x90,0x9c, +0x94,0x2c,0x95,0x3c,0x96,0x4c,0xe2,0x0, 0xcc,0x81,0xb1,0xd, 0xb0,0x9d,0xb4,0x2d, +0xb5,0x3d,0xb6,0x4d,0xe7,0xfe,0x1, 0xe8,0xe0,0x2, 0x1e,0xd7,0x3d,0x9d,0xac,0x8b, +0xe7,0xfe,0x0, 0xe7,0xe8,0x0, 0x89,0x8d,0x66,0x7, 0xe4,0x0, 0xc1,0x8a,0x66,0x85, +0x67,0x6, 0xe0,0x2, 0x1c,0xd8,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xa9,0xc, 0xa9,0xd, +0xa9,0xe, 0xe0,0x0, 0xdf,0xf, 0xe7,0xfd,0x0, 0xcf,0xe0,0x2, 0x1f,0x96,0x14,0x85, +0x66,0x8, 0xac,0x8f,0xe7,0xf9,0x26,0x7d,0xef,0xfa,0xd7,0xba,0xe0,0x0, 0x1e,0x9b, +0x16,0x0, 0x8f,0x8d,0xe0,0x1, 0x1e,0xdc,0xe0,0x0, 0x1f,0x1b,0xe0,0x2f,0x3f,0x8c, +0xa6,0x8d,0xaf,0x8e,0x16,0x7b,0xa7,0xcd,0x3f,0xdc,0xbf,0xcd,0xe7,0xf9,0x0, 0xe9, +0xe0,0x1, 0x1d,0xb1,0xf0,0x1, 0x1b,0xb0,0x88,0x8b,0xe8,0x0, 0x8d,0x87,0x30,0xa8, +0x3d,0xc1,0xc5,0xe2,0x3e,0xfb,0xe7,0xf9,0x3, 0x39,0xe0,0x1, 0x8d,0x8f,0xe0,0x0, +0x25,0xe5,0xe0,0x0, 0x18,0xc5,0x38,0x9e,0xf0,0x0, 0x92,0x81,0xf0,0x0, 0x9a,0x11, +0xe8,0x40,0x3a,0xe5,0xe3,0xff,0xc2,0xff,0xe0,0xe, 0x3e,0xa5,0xe8,0xc, 0x3e,0x24, +0xe4,0xb, 0x37,0xf, 0xe4,0x13,0x36,0xf, 0xe2,0xe, 0x3d,0xce,0xf2,0xc, 0x39,0xcc, +0xe0,0xb, 0x3f,0x2b,0xe8,0xe, 0x3e,0x23,0x3f,0x1b,0xe2,0x0, 0xcf,0x31,0xe0,0x1, +0x2, 0x5, 0xe2,0x0, 0xce,0x9e,0x5, 0x8d,0xe0,0x1, 0x18,0xb1,0xe0,0x1, 0x1a,0xb0, +0x8e,0x1, 0x8f,0x5, 0x36,0x28,0x3f,0x4c,0xc7,0x62,0x3e,0xfe,0xe7,0xfd,0x4, 0x11, +0x7f,0x81,0xef,0xfb,0xdf,0x1d,0xe2,0x0, 0xcc,0x1, 0x67,0x81,0xe0,0x1, 0x1, 0x30, +0xe0,0x1, 0x8f,0xf, 0xe2,0x0, 0xcf,0x3b,0xe7,0xf8,0x2, 0xf8,0xc7,0x1, 0xe0,0x1, +0xaf,0xf, 0xe7,0xf8,0x0, 0xf3,0xe0,0x2, 0x1e,0x54,0x7e,0x5, 0xe7,0xfd,0x0, 0xee, +0xe8,0x6, 0x3b,0x1a,0x16,0x80,0x8f,0x6f,0xae,0xb6,0x27,0x15,0xe2,0x0, 0xcf,0x1, +0xe7,0xfa,0x2, 0x8a,0x16,0xbc,0xe0,0x2, 0x1c,0xbe,0x17,0x3, 0xe0,0x1, 0xae,0x8f, +0x16,0x81,0xae,0x89,0xaf,0xf, 0xaf,0x1f,0xe7,0xf8,0x0, 0xdb,0xf7,0xfd,0x2d,0x99, +0xe7,0xfa,0x0, 0x80,0xac,0x6f,0x0, 0xef,0xe0,0x0, 0x16,0xe4,0xe8,0xd, 0x3e,0x9e, +0xe8,0xd, 0x3e,0x9d,0x94,0xd, 0x94,0x9d,0x95,0x2d,0x95,0xbd,0x96,0x4d,0xe0,0x0, +0x1e,0xc5,0x3f,0x1d,0xb4,0xe, 0x16,0x83,0xb4,0x9e,0xb5,0x2e,0xb5,0xbe,0xb6,0x4e, +0x17,0x1, 0xe0,0x1, 0xaf,0xf, 0xae,0x8f,0xae,0x9f,0xe7,0xf8,0x0, 0xba,0xe0,0x2, +0x1c,0x57,0xef,0xff,0xd5,0xe7,0x16,0x8a,0xe8,0xd, 0x3e,0x98,0x3f,0xe2,0xe9,0x80, +0xaf,0x98,0xe8,0x40,0x3e,0xf8,0x1, 0xfc,0x66,0x8, 0x26,0x7, 0xe0,0x1, 0x1f,0xdc, +0xa6,0x8f,0xa7,0xcd,0xcf,0x84,0xbf,0xcd,0xe8,0x0, 0x89,0x8d,0xe0,0x2, 0x1c,0xd8, +0xe4,0x0, 0xc1,0x8a,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xe0,0x0, 0xde,0x43,0xe7,0xfc, +0x0, 0x83,0x3a,0x62,0xe7,0xfa,0x0, 0xea,0xe2,0x0, 0xce,0x9e,0xe0,0x0, 0x2, 0xce, +0xe8,0x5, 0x3a,0xc4,0xe7,0xfb,0x22,0xbb,0xe2,0x2, 0xcf,0x2c,0xe7,0xfb,0x2, 0x37, +0xf8,0xd, 0x3e,0x9e,0x94,0x11,0x94,0xa1,0x95,0xb1,0x96,0x41,0xe0,0x0, 0x17,0x64, +0x3f,0x1d,0xf0,0x6, 0xb2,0xad,0x10,0x85,0xf0,0xd, 0x3d,0x16,0xa8,0xbd,0xb4,0x1e, +0xb4,0xae,0xb5,0xbe,0xb6,0x4e,0xe7,0xfb,0x0, 0xa2,0xe0,0x0, 0x16,0xe4,0xe7,0xfd, +0x0, 0xe0,0xe0,0x0, 0x16,0x64,0xe8,0xc, 0x3e,0x1e,0xe8,0xc, 0x3e,0x1d,0x90,0x8c, +0x94,0x1c,0x94,0xac,0x95,0x3c,0x95,0xcc,0xe0,0x0, 0x1e,0x45,0xe0,0x1, 0xae,0x8f, +0x3f,0x1c,0xb0,0x8e,0x16,0x3, 0xb4,0x1e,0xb4,0xae,0xb5,0x3e,0xb5,0xce,0xe0,0x2, +0x1f,0x6f,0xae,0xf, 0xae,0x8e,0xae,0x1f,0xe7,0xf7,0x0, 0xd3,0x17,0x3c,0xe0,0x1, +0xaf,0xf, 0xe7,0xf7,0x0, 0xcb,0x15,0x8a,0x3d,0xbf,0xe0,0x2, 0x1d,0x57,0xe0,0x0, +0x16,0xe4,0x3d,0x1b,0xe7,0xf5,0x0, 0xd6,0xe0,0x1, 0x1e,0x31,0xf0,0x1, 0x1b,0xb0, +0x8d,0x8c,0xe8,0x0, 0x8e,0x7, 0x35,0xa8,0x3e,0x4b,0xc6,0x62,0x3e,0xfc,0xe7,0xff, +0x3, 0x29,0xe7,0xfb,0x0, 0xbe,0x14,0x1, 0xe7,0xf4,0x0, 0xf2,0x8, 0xb3,0xe0,0x3, +0x1f,0xb8,0x17,0x1, 0xa1,0xf, 0x16,0xfe,0xe0,0x1, 0xa7,0xe2,0x3f,0x58,0x3f,0xdd, +0x3f,0xce,0xe0,0x1, 0xbf,0xe2,0x2c,0x21,0xe0,0x2, 0x19,0xc8,0x17,0x3, 0x8f,0x83, +0x3f,0x3f,0xe0,0x2, 0x1f,0xc4,0x3f,0x9e,0x8c,0xf, 0xd4,0xa9,0xe0,0x2, 0xa7,0xd2, +0x17,0x43,0x3f,0xde,0xcf,0x9c,0xe0,0x2, 0xbf,0xd2,0x8e,0x83,0x8f,0x83,0xe0,0x3, +0x1f,0x30,0xe4,0x0, 0xc6,0x85,0xe4,0x0, 0xc7,0x85,0x3f,0x9e,0x3f,0x1d,0x8c,0xcf, +0x8c,0x3e,0x9, 0xa1,0xe0,0x5, 0x0, 0xee,0x14,0x28,0xd4,0x91,0xe0,0x2, 0xa7,0xd2, +0xe0,0x2, 0x1f,0x48,0xcf,0xbc,0xe0,0x2, 0xbf,0xd2,0x8e,0x8e,0x8f,0x8e,0xe0,0x3, +0x1f,0x30,0xe4,0x0, 0xc7,0x85,0xe4,0x0, 0xc6,0x85,0x3f,0x9e,0x84,0xcf,0x3f,0x1d, +0xc4,0xfc,0x8c,0x3e,0xe2,0x1, 0xc4,0xff,0x9, 0xa1,0xe0,0x5, 0x0, 0xd3,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x64,0xe0,0x2, 0x1f,0x66,0xe0,0x2, 0x1f,0xfd, +0x87,0xe, 0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, 0x3e,0xfe,0xe0,0x4, 0x1, 0x7f, +0x8d,0x8f,0x89,0xaf,0x7d,0x85,0x3e,0x6b,0xe0,0x2, 0x1d,0xf9,0x99,0x5f,0x8f,0x1f, +0x8f,0xbf,0x3e,0xe3,0x7d,0x83,0x3d,0x6e,0x3d,0xec,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, +0xc5,0xff,0x3d,0x7b,0x3, 0x82,0x3f,0x6c,0xf0,0x40,0x3d,0xee,0x3e,0x6f,0x3f,0x6d, +0xe2,0x1, 0xc6,0x7f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0xf2,0x1, 0xc5,0xff,0x3, 0x82, +0x3f,0xed,0xe0,0x0, 0x1f,0x43,0x15,0x80,0xf0,0x1, 0x1f,0x5e,0xb5,0x8e,0xe2,0x1, +0xc7,0xff,0xe0,0x2, 0x1f,0x46,0xe0,0x1, 0x1d,0xdd,0x7f,0x82,0xf8,0x40,0x3e,0x6e, +0xe0,0x1f,0x17,0xff,0xe8,0x80,0xb7,0x9c,0xf0,0x40,0x3e,0x7b,0xe0,0x80,0xb7,0x9e, +0x1, 0xfa,0x14,0x1, 0xef,0xf9,0xd9,0x90,0xef,0xfa,0xdc,0x30,0xef,0xf9,0xd6,0x90, +0xe0,0x2, 0x1e,0xc8,0x17,0x5, 0x8f,0x8d,0xf8,0x40,0x3c,0xeb,0x3f,0x3f,0xe0,0x3, +0x1f,0xb0,0x3f,0x9e,0x8f,0xbf,0xe0,0x0, 0x1f,0x44,0xe4,0x7, 0xc7,0xb0,0xf0,0x0, +0xa4,0xe, 0xf0,0x18,0x3c,0x1f,0xe8,0x40,0x3f,0x68,0xe0,0x6, 0xc7,0x48,0xf0,0x0, +0x7c,0x1, 0x7f,0x4, 0xf0,0x1, 0x25,0xe0,0xf0,0x40,0x3d,0xe3,0x62,0x5, 0xf2,0x1, +0xc5,0xff,0xf0,0x0, 0x7f,0x6, 0x13,0x81,0xe2,0x1, 0xc2,0x7f,0xe8,0x40,0x3b,0x6b, +0x12,0x80,0xf0,0x1, 0x1e,0xff,0xf8,0x40,0x3f,0x6b,0xf0,0x0, 0x7e,0x7, 0x0, 0x96, +0x14,0x1, 0xdf,0x35,0xef,0xf9,0xd9,0x7, 0x14,0x1, 0xef,0xf9,0xd9,0x55,0x17,0x81, +0xe8,0x40,0x3b,0xf9,0x3f,0x97,0xe8,0x6, 0x3b,0x1e,0xc2,0x81,0xe3,0xff,0xc7,0xff, +0xe3,0xff,0xc3,0x7f,0xe0,0x1, 0x3, 0xb4,0x3b,0xef,0xf0,0x40,0x3d,0xe5,0xf3,0xff, +0xc5,0xff,0xf0,0x40,0x3d,0xf4,0x3, 0xe5,0xe0,0x3, 0x1d,0xb8,0xe7,0xbf,0x16,0xff, +0xf0,0x0, 0xa4,0xb, 0xe0,0x0, 0x15,0x68,0xe8,0x1, 0xa7,0xe8,0xe0,0x1, 0x14,0xff, +0x3f,0xdd,0xe8,0x1, 0xbf,0xe8,0xf0,0x0, 0x16,0x0, 0x64,0x4, 0xe0,0x0, 0xdd,0x1c, +0xf0,0x0, 0x65,0x3, 0x29,0x6, 0x0, 0xa9,0x39,0x7d,0xf0,0x0, 0xc5,0x2, 0x5, 0xa5, +0xe8,0x40,0x3c,0x6c,0x3c,0xe3,0xe0,0x0, 0xdc,0x73,0xf0,0x0, 0xc6,0x1, 0x3c,0x75, +0xe8,0x40,0x3e,0xec,0xe3,0xff,0xc6,0xff,0x1, 0xf0,0xe8,0x0, 0x9f,0x8a,0x67,0x1, +0xc7,0x84,0xe0,0xc, 0x37,0x85,0x36,0x22,0x3e,0x1e,0xe0,0x1a,0xa5,0xac,0xe0,0x41, +0x3f,0x8f,0x17,0x1, 0xe0,0xf, 0x37,0x3f,0xe3,0xf, 0x3d,0xdf,0x39,0x7d,0xe0,0x1a, +0xbf,0xac,0xf0,0x0, 0xc5,0x2, 0x2, 0xdd,0xe8,0x1, 0xa7,0xe8,0x14,0x1, 0xe0,0x40, +0xcf,0x80,0xe8,0x1, 0xbf,0xe8,0xde,0xd3,0xef,0xf9,0xd8,0xa5,0x14,0x1, 0xef,0xf9, +0xd8,0xf3,0x14,0x0, 0xf0,0x40,0x3b,0x68,0xf0,0x0, 0x25,0xaa,0xf0,0xa, 0x3f,0x18, +0xe3,0xff,0xc5,0x7f,0xe0,0x40,0x3f,0xe8,0xf0,0x0, 0x27,0x17,0xe0,0xc, 0x17,0x52, +0x3f,0x1f,0xe0,0xd, 0x37,0xa1,0x37,0x21,0xe8,0xe, 0x3f,0x1d,0xe8,0xd, 0x3e,0x9d, +0x9d,0x8e,0x96,0xd, 0xc7,0x81,0x3d,0xfc,0xe3,0xff,0xc7,0xff,0x3, 0x3, 0x9f,0xe, +0xb7,0xd, 0x3f,0xfa,0x1, 0xec,0xf0,0x0, 0xc3,0x1, 0xf3,0xff,0xc3,0x7f,0xf8,0x40, +0x3b,0x7b,0xe8,0x8, 0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x1, 0xd9,0x3b,0xf4,0x3c,0x66, +0xf0,0x40,0x3b,0xe7,0xe7,0xfe,0x3, 0xed,0xf0,0xa, 0x3f,0x18,0xe3,0xff,0xc5,0x7f, +0xe0,0x40,0x3f,0xe8,0xf0,0x0, 0x27,0x17,0xe0,0xc, 0x17,0x52,0x3f,0x1f,0xe0,0xd, +0x37,0xa1,0x37,0x21,0xe8,0xe, 0x3f,0x1d,0xe8,0xd, 0x3e,0x9d,0x9d,0x8e,0x96,0xd, +0xc7,0x81,0x3d,0xfc,0xe3,0xff,0xc7,0xff,0x3, 0x3, 0x9f,0xe, 0xb7,0xd, 0x3f,0xfa, +0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf3,0xff,0xc3,0xff,0xf0,0x40,0x3b,0xf4,0xe8,0x8, +0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x1, 0xd9,0xe7,0xfe,0x0, 0xc3,0xf0,0x0, 0x67,0x6, +0xf0,0x0, 0x66,0x7, 0x67,0x82,0xf0,0x2, 0x1e,0xc5,0xe0,0x2, 0x27,0x95,0xf0,0x0, +0x65,0x5, 0xf0,0x40,0x3c,0xe3,0xf2,0x1, 0xc4,0xff,0xf2,0x1, 0xc5,0x7f,0xf8,0x7, +0x3c,0xba,0xf0,0x2, 0x1e,0xc5,0x3f,0xe7,0xe3,0xff,0xc7,0xff,0xf0,0x0, 0x7f,0x6, +0x12,0x81,0xf0,0x0, 0x7e,0x7, 0x3b,0x6f,0xf8,0x40,0x3e,0x69,0x7f,0x85,0x12,0x0, +0xf0,0x1, 0x1d,0xff,0xf8,0x40,0x3f,0x6a,0xf8,0x40,0x3c,0xed,0x0, 0x92,0x14,0x1, +0xde,0x46,0xef,0xf9,0xd8,0x18,0x14,0x1, 0xef,0xf9,0xd8,0x66,0x66,0x82,0x17,0x81, +0x3e,0xf5,0x3f,0x95,0xc2,0x1, 0xe3,0xff,0xc7,0xff,0xe0,0x1, 0x5, 0xdf,0x3a,0xef, +0xf0,0x40,0x3d,0x64,0xf3,0xff,0xc5,0x7f,0xf8,0x40,0x3d,0x7c,0x3, 0xe9,0xe0,0x3, +0x1d,0xb8,0xe7,0xbf,0x16,0xff,0xf0,0x0, 0xa6,0x8b,0xe0,0x0, 0x15,0x68,0xe8,0x1, +0xa7,0xed,0xe0,0x1, 0x14,0xff,0x3f,0xdd,0xe8,0x1, 0xbf,0xed,0xf0,0x0, 0x14,0x0, +0x64,0x4, 0xe0,0x0, 0xdc,0x31,0x63,0x83,0x29,0x5, 0x0, 0xa6,0x39,0x79,0xc3,0x82, +0x5, 0xa3,0xe8,0x40,0x3c,0x68,0x3c,0xe3,0xe0,0x0, 0xdb,0xb9,0xf0,0x0, 0xc4,0x1, +0x3c,0x74,0xe8,0x40,0x3c,0xe8,0xe3,0xff,0xc4,0xff,0x1, 0xf1,0x9f,0x7, 0x67,0x81, +0xc7,0x4, 0xe0,0x8, 0x37,0x5, 0x34,0x22,0x3c,0x1f,0xf0,0x1a,0xa3,0x28,0xe0,0x41, +0x3f,0xe, 0x15,0x81,0xe0,0xe, 0x35,0xbe,0xf3,0xe, 0x3b,0x5e,0x39,0x79,0xe0,0x1a, +0xbf,0x28,0xc3,0x82,0x2, 0xdf,0x17,0x80,0x3f,0x6f,0xe3,0xff,0xc7,0x7f,0xe8,0x40, +0x3f,0x7a,0xe0,0x1, 0x1, 0x68,0xc7,0x81,0xe2,0x0, 0xcf,0x86,0x1, 0xf6,0xe8,0x1, +0xa7,0xed,0x14,0x1, 0xe0,0x40,0xcf,0x80,0xe8,0x1, 0xbf,0xed,0xdd,0xe0,0xef,0xf9, +0xd7,0xb2,0x14,0x1, 0xef,0xf9,0xd8,0x0, 0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x25,0x30, +0xe8,0x40,0x3f,0x65,0xe0,0x0, 0x15,0x0, 0xf0,0x0, 0x27,0x1f,0xe0,0xc, 0x17,0xd2, +0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1,0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99, +0x9c,0xf, 0xf0,0x0, 0x9b,0x9, 0xc5,0x1, 0xf0,0x40,0x3b,0x78,0xe8,0xe, 0x3f,0x1c, +0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f,0x5, 0x84,0x9f,0x8f,0xe0,0x0, 0xb7,0x89, +0xe8,0x40,0x3d,0x7e,0x1, 0xe4,0xf2,0x0, 0xca,0x85,0xe0,0x1, 0x5, 0x95,0xf0,0x0, +0xc2,0x81,0xf3,0xff,0xc2,0xff,0xf8,0x40,0x3a,0xfa,0x1, 0xd3,0xf0,0x40,0x3e,0x75, +0xf0,0x40,0x3b,0x65,0xe7,0xfe,0x5, 0xe4,0xe8,0x40,0x3f,0x66,0xe0,0x0, 0x15,0x0, +0xf0,0x0, 0x27,0x1e,0xe0,0xc, 0x17,0xd2,0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1, +0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99,0x9c,0xf, 0xf0,0x0, 0x9b,0x89,0xc5,0x1, +0xf0,0x40,0x3b,0xf8,0xe8,0xe, 0x3f,0x1c,0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f, +0x5, 0x83,0x9f,0x8f,0xb7,0x89,0xe8,0x40,0x3d,0x7e,0x1, 0xe5,0xf2,0x0, 0xcb,0x5, +0x2, 0x94,0xe8,0xf, 0x3b,0x16,0xe3,0xff,0xc7,0xff,0xe0,0xc, 0x17,0x52,0x3f,0x1f, +0x37,0x21,0x37,0xa1,0xe8,0xe, 0x3f,0x1b,0xe8,0xf, 0x3f,0x99,0x9d,0xe, 0x9c,0x8f, +0x3c,0xfa,0x5, 0x83,0x9f,0xe, 0xb7,0xf, 0xf0,0x0, 0xc3,0x1, 0xf3,0xff,0xc3,0x7f, +0xf8,0x40,0x3b,0x7c,0x1, 0xc2,0x66,0x82,0x17,0x81,0x3e,0xf5,0x3f,0x95,0xc2,0x1, +0xe3,0xff,0xc7,0xff,0xe7,0xfe,0x2, 0xa5,0xf0,0x0, 0x67,0x6, 0xf0,0x0, 0x66,0x7, +0xf8,0x40,0x3e,0xe9,0xe0,0x2, 0x1f,0xc5,0xe8,0x80,0x97,0x1e,0x9e,0x8f,0x3f,0x7d, +0x3, 0x2, 0xb7,0xf, 0xf8,0x40,0x3f,0x7c,0xc7,0x82,0x1, 0xf7,0xe0,0x2, 0x1f,0x93, +0x17,0x0, 0xe0,0x2, 0x1e,0xa5,0xe0,0x2, 0xaf,0xf, 0x14,0x0, 0xe0,0x1, 0xaf,0x7f, +0xf0,0x0, 0xbe,0x8d,0xdd,0x3c,0xe0,0x2, 0x1f,0x48,0x8c,0xe, 0xef,0xf9,0xd5,0xc8, +0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0xc0,0x1c, +0xf8,0x0, 0xf, 0x28,0xb, 0xa1,0xe7,0x34,0x0, 0xe2,0x8e,0x9f,0xe0,0x2, 0x1f,0x78, +0x89,0xbf,0x7e,0x85,0x99,0x6f,0x8e,0xf, 0x8e,0xaf,0x7f,0x3, 0x3f,0xe3,0x67,0x5, +0xe7,0xfb,0x0, 0x83,0x67,0x85,0xe0,0xc, 0x17,0x52,0xe8,0xf, 0x3f,0x95,0xe3,0xff, +0xc7,0xff,0x3f,0x1f,0x37,0x21,0x37,0xa1,0xe8,0xe, 0x3f,0x1b,0xe8,0xf, 0x3f,0x99, +0x9d,0xe, 0x9c,0x8f,0x3c,0xfa,0xe7,0xfe,0x5, 0xdc,0x9f,0xe, 0xb7,0xf, 0xe7,0xfe, +0x0, 0xd8,0x17,0x1e,0xf2,0x0, 0xcd,0x2, 0x3f,0x2f,0x16,0x81,0xe0,0xe, 0x36,0xbe, +0x2, 0x8a,0x65,0x81,0xe0,0x1a,0xa5,0x2b,0xe3,0xe, 0x3d,0x5e,0xe0,0x1a,0xbf,0x2b, +0xe7,0xfe,0x0, 0x8b,0x66,0x81,0x17,0x1d,0xe0,0x1d,0xa5,0x3d,0x3f,0x2f,0x15,0x81, +0xe0,0xe, 0x35,0xbe,0xe3,0xe, 0x3d,0x5e,0xe0,0x1d,0xbf,0x3d,0xe7,0xfd,0x0, 0xfd, +0xe0,0x3, 0x1f,0xb8,0x16,0x80,0xa6,0xf, 0xe0,0x1, 0xa7,0x6c,0x37,0x4d,0xe2,0x0, +0xc7,0x1, 0x24,0x85,0xc4,0xff,0xe0,0x7, 0x16,0xff,0x3e,0xd9,0xe0,0x1, 0xa5,0xec, +0xe7,0xbf,0x17,0xff,0x3d,0xdf,0xe0,0x1, 0xbd,0xec,0xe4,0x7, 0xc4,0x30,0xe0,0x0, +0x1d,0xc4,0xe4,0xd, 0x36,0xa0,0xa5,0x8b,0x37,0x2d,0x3c,0x1b,0xa5,0x8, 0xe0,0x3, +0x1d,0xd8,0x3d,0xda,0x3e,0xcb,0xbe,0x88,0xe0,0x1, 0xa6,0xec,0x3f,0xdd,0x3f,0xce, +0xe0,0x1, 0xbf,0xec,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f, +0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, +0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0x88,0xe2,0x0, 0xc4,0x8f, +0xe0,0xd, 0x34,0xab,0xe7,0xf, 0x14,0xff,0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe2,0x40, +0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, +0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, +0xbe,0xef,0x3c,0x1b,0xa5,0x88,0xe2,0x0, 0xc4,0x81,0xe0,0xd, 0x34,0xaa,0xe7,0xf7, +0x14,0xff,0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xe2,0x0, +0xc4,0x81,0xa5,0x88,0xe4,0xd, 0x34,0xac,0xe0,0x3, 0x1c,0xd9,0xe2,0x0, 0xc5,0x3, +0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe4,0xd, 0x35,0x2a,0xa4,0x88,0xe0,0x3, 0x1d,0xda, +0xe2,0x40,0xc7,0x0, 0xe0,0xa, 0x3c,0xdb,0x3d,0x4d,0xbd,0x8, 0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0xff,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0x6f, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0x5d,0xe0,0x1, 0xbe,0x6f,0x3c,0x1b,0xa5,0xa8, +0xe7,0xf0,0x16,0x0, 0x3e,0x5b,0xe2,0xf, 0xc4,0xff,0x3c,0xcc,0xbc,0xa8,0xe2,0x40, +0xc7,0x0, 0xe0,0x1, 0xa6,0x6f,0x3e,0xdc,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, +0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, +0xbe,0xef,0x3c,0x1b,0xe2,0xf, 0xc4,0xff,0xa5,0xb8,0xe4,0xd, 0x34,0xa0,0xe0,0x3, +0x1c,0xdb,0xe2,0x40,0xc7,0x0, 0x3c,0xdb,0x3c,0xcd,0xbc,0xb8,0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0xe8, +0xe2,0x0, 0xc4,0x87,0xe0,0xd, 0x34,0xa6,0xe7,0xfc,0x14,0xbf,0x3c,0xdb,0x3c,0xcd, +0xbc,0xe8,0xe2,0x0, 0xc5,0xf, 0xa4,0xe8,0x15,0xc3,0xe0,0xd, 0x35,0x22,0xe0,0xa, +0x3c,0xdb,0x3d,0x4d,0xbd,0x68,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d, +0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x1f,0xc4,0x7f, +0xa7,0xf, 0xe7,0xe0,0x17,0x80,0xe0,0x4, 0xa6,0x8e,0x3f,0xdd,0x3c,0x4f,0xe0,0x4, +0xbc,0xe, 0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa7,0x8f,0x17,0x7b, +0xe0,0x1, 0xa6,0x6f,0xe0,0xd, 0x34,0x22,0x3f,0x5c,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f, +0x17,0x7d,0xe0,0x1, 0xa6,0xef,0x34,0x21,0x3f,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x6f, +0xe2,0x0, 0xc4,0x8f,0xe0,0x2, 0xa6,0x3f,0xe7,0xfe,0x17,0xf, 0xe0,0xd, 0x34,0xa4, +0x3f,0x5c,0x3f,0x4d,0xe0,0x2, 0xbf,0x3f,0x17,0x70,0xe0,0x2, 0xa6,0xbf,0x3f,0x5d, +0x3c,0xce,0xe0,0x2, 0xbc,0xbf,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, +0xa7,0xf, 0xe7,0xdf,0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, 0x34,0x2c,0xe0,0x8, +0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe7,0xf0,0x17,0x80,0xe0,0x2, 0xa6,0xce, +0xe2,0xf, 0xc4,0xff,0x3f,0xdd,0x3c,0xcf,0xe0,0x2, 0xbc,0xce,0x38,0x82,0xe0,0x3, +0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xef,0x16,0xff,0xe0,0x1, 0xa6,0x6e, +0xe0,0xf, 0x34,0x2b,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe0,0x4, +0xb4,0xde,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f, +0xc4,0x7f,0xe0,0x3, 0xa6,0x8f,0x3f,0x5d,0x3c,0x4e,0xe0,0x3, 0xbc,0xf, 0xe0,0x6, +0xb4,0xbf,0xe0,0x6, 0xb5,0x5f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, +0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x3, 0xa6,0xbf,0x3f,0x5d,0x3c,0x4e,0xe0,0x3, +0xbc,0x3f,0xe0,0x7, 0xb4,0x9f,0xe0,0x7, 0xb5,0x3f,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe7,0xbf,0x15,0x7f,0xa7,0x8f,0xe0,0xb, 0x34,0x46,0xe0,0x1, 0xa6,0xef,0xe0,0x1, +0xa7,0x6f,0x35,0xa2,0x3f,0x5a,0xe0,0x1, 0xbf,0x6f,0x17,0x73,0xe0,0x2, 0xa6,0x6f, +0xe2,0x40,0xc6,0x80,0x3e,0x5e,0x3e,0x4b,0xe0,0x2, 0xbe,0x6f,0xe0,0xb, 0x34,0x26, +0xe0,0x2, 0xa6,0x6f,0xe7,0xe7,0x17,0x7f,0xe2,0x18,0xc5,0x80,0x3e,0x5e,0x3e,0x4b, +0xe0,0x2, 0xbe,0x6f,0x34,0x42,0xe0,0x2, 0xa5,0xef,0x17,0x3, 0x16,0x7c,0x3f,0x58, +0xe0,0x8, 0x3d,0xdc,0x3c,0x4e,0xe0,0x2, 0xbc,0x6f,0xe0,0x1, 0xa7,0x6f,0x3f,0x5a, +0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1f,0x44, +0xa6,0x8f,0xe7,0xbf,0x15,0xff,0xe0,0x1, 0xa6,0x6d,0xe0,0x1, 0xa7,0xed,0xa7,0xe, +0xe4,0x7, 0xc4,0x30,0x3f,0xdb,0xe0,0x1, 0xbf,0xed,0x3c,0x1e,0xa5,0x28,0xe0,0xe, +0x34,0xc2,0xe0,0x3, 0x1f,0xdc,0xe2,0x0, 0xc7,0x3, 0xe4,0xe, 0x37,0x2d,0x3f,0xda, +0x3f,0xce,0xbf,0xa8,0xe0,0xe, 0x34,0xc6,0xa5,0x28,0xe0,0x3, 0x1f,0xdd,0xe4,0xe, +0x37,0x2b,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0x34,0xc4,0xa5,0x28,0xe0,0x3, 0x1f,0x5e, +0xe2,0x0, 0xc4,0x83,0xe4,0xf, 0x34,0xa9,0xe0,0x9, 0x3d,0x5e,0x3c,0xcf,0xbc,0xa8, +0xe2,0x40,0xc6,0x0, 0xe0,0x1, 0xa7,0xed,0x3d,0xdf,0x3e,0x4b,0xe0,0x1, 0xbe,0x6d, +0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1f,0x44,0xa6,0x8f,0xe7,0xbf,0x15,0xff, +0xe0,0x1, 0xa6,0x6d,0xe0,0x1, 0xa7,0xed,0xa7,0xe, 0xe4,0x7, 0xc4,0x30,0x3f,0xdb, +0xe0,0x1, 0xbf,0xed,0x3c,0x1e,0xa5,0x28,0xe0,0xe, 0x34,0xc2,0xe0,0x3, 0x1f,0xdf, +0xe2,0x0, 0xc7,0x3, 0xe4,0xe, 0x37,0x27,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0xe0,0xe, +0x34,0xc6,0xa5,0x28,0xe0,0x3, 0x1f,0xe0,0xe4,0xe, 0x37,0x25,0x3f,0xda,0x3f,0xce, +0xbf,0xa8,0x34,0xc4,0xa5,0x28,0xe0,0x3, 0x1f,0x61,0xe2,0x0, 0xc4,0x83,0xe4,0xf, +0x34,0xa3,0xe0,0x9, 0x3d,0x5e,0x3c,0xcf,0xbc,0xa8,0xe2,0x40,0xc6,0x0, 0xe0,0x1, +0xa7,0xed,0x3d,0xdf,0x3e,0x4b,0xe0,0x1, 0xbe,0x6d,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0x17,0x77,0xe0,0x1, 0xa6,0x6d,0xe0,0xf, 0x34,0x23, +0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xe0,0x1, 0xbc,0x6d,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xfb,0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, +0x34,0x29,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe2,0x0, 0xc4,0x81, +0xe0,0x1, 0xa6,0x6e,0xe7,0xf7,0x16,0xff,0xe0,0xf, 0x34,0xaa,0xe0,0x9, 0x3e,0x5d, +0x3c,0xcf,0xe0,0x1, 0xbc,0xee,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0xf, 0xe7,0xf8, +0x17,0x80,0xe0,0x1, 0xa6,0xfe,0x3f,0xdd,0x3c,0x4f,0xe0,0x1, 0xbc,0x7e,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x2, +0xa6,0x8f,0xe2,0x1f,0xc4,0xff,0x3e,0xde,0x3c,0x4d,0xe0,0x2, 0xbc,0xf, 0xe0,0x2, +0xa6,0x9f,0x3f,0x5d,0x3f,0x49,0xe0,0x2, 0xbf,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xa6,0x8f,0xa7,0x3d,0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0xe0,0x61,0x3e,0x2, 0xe7,0xfe, +0x17,0xff,0x3f,0xdc,0xe0,0x61,0x3f,0x92,0xa7,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x81, +0x27,0x85,0xa7,0x9d,0xe0,0x20,0xcf,0x80,0xbf,0x9d,0xe7,0xdf,0x17,0xff,0xa6,0x3d, +0x37,0x2c,0x3f,0xdc,0x3f,0xce,0xbf,0xbd,0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x61,0x3f,0x2, 0xe7,0xfe,0x17,0xff,0x3f,0xde, +0xe0,0x61,0x3f,0x92,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0xe7,0xdf, +0x17,0x7f,0xa6,0x3d,0xe0,0xf, 0x34,0x2c,0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xbc,0x3d, +0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x3, +0x1f,0xb8,0xf0,0x3, 0x1b,0x62,0xf0,0x0, 0xa2,0xf, 0xe7,0xbf,0x17,0xff,0xf8,0x1, +0xa1,0xe4,0xe8,0x1, 0xa7,0x64,0xf0,0x13,0x31,0xcd,0x3f,0xde,0xe8,0x1, 0xbf,0xe4, +0xf2,0x0, 0xc1,0x81,0x87,0x88,0xe8,0x1, 0xa6,0xd4,0xe2,0x0, 0xc7,0x87,0xe0,0xe, +0x37,0xac,0xe7,0x1f,0x17,0xff,0x3f,0xdd,0x3f,0xce,0xe0,0x0, 0x1f,0x44,0xf0,0x3, +0x1b,0xe3,0xf0,0x0, 0xa2,0x8e,0xe0,0x3, 0x1c,0xe4,0xe8,0x1, 0xbf,0xd4,0xf0,0x0, +0x10,0x80,0x15,0x78,0xe7,0xfe,0x15,0x87,0xe7,0xf7,0x16,0x7f,0xf0,0x0, 0x11,0x2, +0xf8,0x12,0x39,0x11,0xf0,0x10,0x30,0xa2,0xf0,0x12,0x31,0x21,0xf0,0x12,0x39,0x18, +0xf8,0x10,0x38,0x16,0xe8,0x0, 0xa7,0x0, 0xe8,0x0, 0x8f,0x82,0x3f,0x5a,0x37,0xc5, +0x3f,0x4f,0xe8,0x0, 0xbf,0x0, 0xe4,0x7, 0xc7,0xb0,0xe8,0x0, 0x86,0x82,0xe8,0x0, +0xa7,0x0, 0xe2,0x0, 0xc6,0x9f,0x36,0xa3,0x3f,0x5b,0x3f,0x4d,0xe8,0x0, 0xbf,0x0, +0xe8,0xf, 0x3f,0x95,0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc6,0xe2,0x0, 0xc6,0x81, +0xe4,0xd, 0x36,0xac,0xe8,0xe, 0x3f,0x57,0x3f,0x4d,0xbf,0xf, 0xf0,0x0, 0xc0,0x81, +0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc3,0xe2,0x0, 0xc6,0x83,0xe4,0xd, 0x36,0xaa, +0x3f,0x59,0x3f,0x4d,0xbf,0xf, 0xf2,0x1, 0xc0,0xff,0xe8,0x0, 0x8e,0x92,0xa7,0xf, +0x36,0xc7,0x36,0xaa,0x3f,0x5c,0x3f,0x4d,0xbf,0xf, 0x8f,0x88,0xe8,0x40,0x3f,0xf1, +0xe7,0xff,0x3, 0xb6,0xe8,0x1, 0xa7,0x64,0xe7,0xbf,0x17,0xff,0xf0,0x13,0x31,0xad, +0x3f,0xde,0xf0,0x13,0x39,0xcf,0xf8,0x1, 0xb9,0xe4,0x38,0x82,0xe0,0x0, 0x1f,0x99, +0x17,0x1, 0xaf,0xf, 0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0xb3,0xa7,0x8f,0xaf,0xd, +0x17,0x7d,0xa6,0xdf,0x3f,0x5d,0xbf,0x5f,0xa7,0x5f,0xcf,0x4, 0xbf,0x5f,0x38,0x82, +0xe0,0x0, 0x1f,0x19,0x17,0x81,0xaf,0x8e,0xe0,0x2, 0x1f,0x33,0xaf,0x8e,0xe0,0x0, +0x1f,0x10,0xaf,0x8e,0x38,0x82,0x8, 0xb2,0x39,0x68,0x15,0x4, 0xe1,0xf, 0x14,0x0, +0x3c,0xe2,0xd0,0xac,0xa7,0x82,0xa7,0x2, 0xa4,0x2, 0x37,0xc5,0xe4,0xe, 0x37,0x45, +0xe2,0x0, 0xc7,0x7, 0xea,0x2, 0xc4,0x0, 0xe2,0x0, 0xc7,0x88,0x3f,0xce,0xe4,0x8, +0x34,0x48,0x3c,0x1f,0x9, 0x61,0xe0,0x3, 0x1e,0xb8,0xe0,0x2, 0x1e,0x68,0xa6,0x8d, +0xa7,0xc, 0xa7,0x8c,0xa6,0xcd,0xe2,0x0, 0xc6,0x81,0x26,0xab,0x37,0x48,0xe4,0xf, +0x37,0xc5,0xe2,0x0, 0xc7,0x1, 0xa6,0x8c,0x37,0x23,0xe2,0x0, 0xc7,0x87,0x3f,0xce, +0xea,0x2, 0xcf,0x0, 0x3f,0x5d,0x16,0x85,0xe0,0x2f,0x3f,0x9d,0xe4,0xe, 0x37,0x48, +0x27,0x98,0x27,0x17,0x8, 0xb4,0x11,0x0, 0xe0,0x23,0x3c,0x2, 0x3a,0x69,0x14,0x9, +0x3c,0xe3,0xd0,0x55,0x14,0x9, 0xd0,0x35,0x39,0xf8,0x14,0x5, 0x1, 0xc, 0xc1,0x1, +0xef,0xfa,0xd1,0x48,0xe3,0xff,0xc1,0x7f,0x3a,0x72,0x3, 0xf5,0x14,0x0, 0xa, 0x61, +0x14,0x0, 0x38,0x82,0x14,0x1, 0xa, 0x61,0xe0,0x0, 0x1f,0x99,0x8c,0xf, 0x8f,0xf, +0x27,0x1f,0xe0,0x3, 0x1f,0x38,0x16,0x80,0xa5,0x8e,0xe0,0x0, 0x1f,0x10,0xae,0x8e, +0xa6,0x5b,0xe0,0x1, 0x1f,0x5c,0xce,0x1, 0xa7,0xe, 0xbe,0x5b,0xe0,0x1, 0xa6,0x6e, +0xe0,0x4, 0xce,0x0, 0xe0,0x1, 0xbe,0x6e,0xe7,0xfb,0x16,0x7f,0xe0,0x1, 0xa5,0xee, +0x3e,0x5b,0xe0,0x1, 0xbe,0x6e,0xae,0x8f,0xe0,0x2, 0x1f,0xb3,0xae,0x8f,0x38,0x82, +0x8, 0xb3,0xe0,0x3, 0x1f,0xb8,0x39,0xe8,0xa7,0x8f,0x14,0x0, 0xa1,0x3f,0xde,0xc4, +0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x31,0xa7,0x8f,0xa6,0x8e,0xa7,0x1f,0x31,0x4c, +0xcf,0x10,0xbf,0x1f,0xe2,0x0, 0xc1,0x1, 0xb1,0xdd,0x3c,0x62,0x89,0x7d,0xa6,0x9f, +0x17,0x6f,0x3f,0x5d,0xbf,0x1f,0xde,0xb0,0x3c,0x62,0x9, 0xe1,0x8, 0xb4,0xe0,0x3, +0x1f,0xb8,0x3a,0x68,0xa7,0x8f,0x14,0x0, 0xa1,0x3f,0x39,0xe9,0xde,0xa5,0xe0,0x2, +0x1f,0x91,0xe0,0x3, 0x1f,0x31,0xa7,0x8f,0xa6,0x8e,0xa7,0x1f,0x31,0x4c,0xcf,0x10, +0xbf,0x1f,0xe2,0x0, 0xc1,0x1, 0xb2,0x5d,0x17,0x6f,0xa9,0xbd,0x3c,0x62,0xa6,0x9f, +0x3f,0x5d,0xbf,0x1f,0xa, 0x21,0xe7,0xfd,0x0, 0x90,0x8, 0xb5,0xe0,0x3, 0x1f,0xb8, +0x39,0x68,0xa7,0x8f,0x14,0x0, 0xa7,0xbf,0x12,0x81,0x37,0xcc,0x3a,0xdf,0x39,0xe9, +0x3a,0x6a,0xde,0x82,0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xa7,0x9d,0xcf,0x90,0xbf,0x9d, +0x22,0x13,0xe0,0x3, 0x1f,0xb1,0xe0,0xa, 0x39,0x14,0x14,0xff,0xa7,0x8f,0x3c,0x93, +0xe3,0xff,0xc5,0x7f,0xb1,0x5f,0xc1,0x1, 0x8f,0x7f,0xe3,0xff,0xc1,0x7f,0x39,0x7a, +0xe0,0x80,0xaf,0x19,0x1, 0xf8,0xa7,0x1d,0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d, +0xa, 0xa1,0xe7,0xfc,0x0, 0xe2,0x8, 0xb5,0xe0,0x3, 0x1f,0xb8,0x39,0x68,0xa7,0x8f, +0x14,0x0, 0xa7,0xbf,0x12,0x81,0x37,0xcc,0x3a,0xdf,0x39,0xe9,0x3a,0x6a,0xde,0x54, +0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xa7,0x9d,0xcf,0x90,0xbf,0x9d,0x22,0x15,0xe0,0x3, +0x1f,0xb1,0xe0,0xa, 0x39,0x14,0x14,0xff,0xa7,0x8f,0x3c,0x93,0xe3,0xff,0xc5,0x7f, +0x17,0x1, 0x3f,0x12,0xb1,0x5f,0x39,0x6e,0xe3,0xff,0xc1,0x7f,0xe0,0x80,0x87,0x19, +0x39,0x7a,0xaf,0x3f,0x1, 0xf6,0xa7,0x1d,0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d, +0xa, 0xa1,0xe7,0xfc,0x0, 0xb2,0x0, 0x0, 0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x3, +0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28,0xe0,0x40,0xce,0x80,0xbe,0x9f,0x16,0xa1, +0xb6,0xbe,0x3c,0x98,0xe0,0x6, 0xb4,0xbe,0xe0,0x2, 0xb5,0x5e,0xe7,0xbf,0x17,0x7f, +0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x3, +0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28,0xe0,0x40,0xce,0x80,0xbe,0x9f,0x3c,0x98, +0x35,0x28,0xe0,0x7, 0xb4,0xfe,0x3d,0x9a,0xe0,0x8, 0xb5,0x9e,0xe0,0x7, 0xb6,0x5e, +0xe7,0xbf,0x17,0x7f,0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0x83, +0xe0,0x0, 0x1d,0x95,0xa7,0xf, 0x8e,0xb, 0x9f,0x9e,0x16,0x80,0xcf,0x81,0x3c,0x4f, +0xb4,0x1e,0x0, 0x85,0x9f,0x9e,0xe2,0x0, 0xc7,0x88,0x2f,0x8e,0xe0,0x7, 0x97,0x9e, +0xe2,0x0, 0xcf,0x80,0x3, 0x78,0x2e,0x8e,0x9f,0x9e,0xe0,0x80,0xcf,0x80,0xb7,0x9e, +0x17,0x80,0xb7,0x9e,0x38,0x82,0x9f,0x9e,0x16,0x1, 0xcf,0x84,0xb7,0x9e,0x3e,0xec, +0x0, 0xee,0xae,0xb, 0x0, 0xf2,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x16,0x0, 0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8, +0x96,0xd8,0xb6,0xde,0x96,0xf8,0xb6,0xfe,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9e, +0xe0,0x0, 0x1e,0x95,0xae,0xd, 0x8e,0x88,0x8e,0x18,0x36,0xa8,0x3e,0x9c,0xe0,0x1, +0xb6,0xde,0x96,0xa8,0xe0,0x1, 0x9c,0x28,0xe0,0x9, 0xb6,0xde,0x8e,0xaf,0xe0,0x1, +0xb6,0xfe,0x87,0xbf,0xe2,0x0, 0xc7,0x81,0xe4,0xf, 0x37,0xa8,0xe4,0xf, 0x37,0xc0, +0xb7,0x9e,0xdf,0xad,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92, +0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe0,0x0, 0x14,0x40,0x96,0xde,0xb6,0xdf, +0xe0,0x1, 0x96,0x9e,0xe0,0x1, 0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c, +0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, 0xb6,0xdf,0x8f,0x2e,0xe0,0x1, 0xb7,0x7f, +0x17,0x0, 0xe0,0x1, 0xb4,0xbf,0xb7,0x1f,0xdf,0x82,0xa7,0x12,0xe7,0xbf,0x17,0xff, +0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb4,0xe0,0x2, 0x1f,0x91,0x39,0xe9,0xa2,0xf, +0xe0,0x3, 0x1f,0x83,0xa7,0x14,0xa1,0xf, 0xe0,0x40,0xcf,0x0, 0xbf,0x14,0x3f,0xe8, +0xa7,0x14,0xe0,0x1, 0x14,0x20,0xe0,0x40,0xcf,0x0, 0xbf,0x14,0x97,0x3f,0xb7,0x52, +0x97,0x7f,0xb7,0x72,0x97,0x5f,0xe0,0x1, 0xb7,0x12,0x8f,0x1f,0x8e,0x8f,0x37,0x28, +0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f,0xe0,0x1, 0xb7,0x32,0x17,0x0, 0xe0,0x9, +0xb7,0x52,0xe0,0x1, 0x97,0xf, 0xe0,0x1, 0xb7,0x72,0xe0,0x1, 0x97,0x1f,0xe0,0x2, +0xb7,0x12,0xe0,0x1, 0x97,0x2f,0xe0,0x2, 0xb7,0x32,0xe0,0x1, 0x97,0x3f,0xe0,0x6, +0xb7,0x12,0x8f,0xbf,0x37,0xa8,0xb7,0x92,0xdf,0x42,0xe0,0x3, 0x9f,0xb2,0xaf,0x83, +0xe0,0x3, 0x9f,0xd2,0xaf,0x93,0xe0,0x2, 0x9d,0x72,0xe0,0x3, 0x9d,0x92,0xe0,0x4, +0x9e,0x32,0xe0,0x4, 0x9e,0xd2,0xe0,0x3, 0x9f,0x72,0xe0,0x4, 0x9f,0x92,0xb5,0x13, +0xb7,0xe3,0xe7,0xbf,0x17,0xff,0xb5,0xa3,0xb6,0x33,0xb6,0xc3,0xb7,0x53,0xa7,0x14, +0x3f,0xde,0xbf,0x94,0xa, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, 0xe0,0x3, +0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xdf, +0xe0,0x1, 0x14,0x40,0xb6,0xde,0x96,0xff,0xe0,0x1, 0xb6,0x9e,0x8e,0xbf,0x8e,0x2f, +0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x8e,0x9f,0x8e,0xf, 0x36,0xa8,0x3e,0x9c, +0xe0,0x1, 0xb6,0xbe,0x8e,0xcf,0xe0,0x1, 0xb6,0xfe,0x16,0x80,0xe0,0x9, 0xb6,0xde, +0x87,0xdf,0xe2,0x0, 0xc7,0x83,0x37,0xa8,0xb7,0x9e,0xde,0xf9,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3e,0xe8, +0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa7,0x12,0xa7,0x8f,0xe0,0x40,0xcf,0x0, 0xbf,0x12, +0x16,0x0, 0x97,0x38,0xb7,0x5f,0x97,0x58,0xb7,0x7f,0x97,0x78,0xe0,0x0, 0x14,0x60, +0xe0,0x1, 0xb7,0x1f,0x8f,0xd, 0x8e,0x9d,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x5f, +0xe0,0x9, 0xb6,0x5f,0xb6,0x1f,0xde,0xd3,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0x8, 0xb5,0x8f,0x8, 0x8f,0x98,0x39,0x68,0xa4,0x38,0x3f,0x7f, +0x34,0x21,0xe0,0x6f,0x3b,0xae,0xe0,0x1, 0x14,0xff,0xe0,0x1, 0x15,0x72,0xe8,0x0, +0xc4,0x2, 0x3a,0xef,0xd4,0xe8,0xe0,0x2, 0x1f,0x91,0x17,0x0, 0xa1,0x8f,0xe0,0x3, +0x1f,0x83,0xe0,0x0, 0x14,0x60,0xa2,0xf, 0xa7,0x93,0xe2,0x1, 0xc2,0xff,0xe0,0x40, +0xcf,0x80,0xbf,0x93,0x97,0xb2,0xb7,0xd4,0x97,0xd2,0xb7,0xf4,0x97,0xf2,0xe0,0x1, +0xb7,0x94,0x8f,0x82,0x8e,0x92,0x37,0xa8,0x3f,0x9d,0xe0,0x1, 0xb7,0xd4,0xe0,0x9, +0xb7,0x54,0xb7,0x14,0xde,0x9c,0x87,0x2, 0xa4,0xb2,0x3f,0xee,0xe2,0x1, 0xc7,0xff, +0x27,0xa8,0xe0,0xb, 0x34,0xa1,0x87,0x92,0x15,0x0, 0xe8,0x0, 0xc5,0x82,0x3e,0xef, +0xe2,0x1, 0xc6,0xff,0x26,0x96,0x16,0xb, 0x3e,0x3a,0x17,0x0, 0xe0,0xf, 0x3f,0x1c, +0x37,0xa1,0x3f,0x9b,0x96,0x8f,0xc7,0x1, 0xe0,0x41,0x3e,0x8d,0xb6,0x8f,0xe2,0x1, +0xc7,0x7f,0x87,0x92,0x3e,0xef,0xe2,0x1, 0xc6,0xff,0x3e,0xfe,0x2, 0xf0,0x87,0x2, +0xc5,0x1, 0x3e,0xee,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc6,0xff,0x3e,0xfa,0x2, 0xe0, +0xe4,0x2, 0xc2,0x81,0xb4,0xd4,0x17,0x80,0xe0,0x1, 0xb2,0xd4,0xe0,0x1, 0x14,0x50, +0xb7,0x94,0xde,0x65,0xa5,0x32,0x17,0x0, 0x15,0xf0,0x3f,0xee,0x35,0x21,0x0, 0x92, +0xe2,0x0, 0xcf,0x87,0x2, 0xb2,0xe0,0x5, 0x9e,0x14,0x36,0x1b,0xe2,0x0, 0xc6,0xf, +0xb6,0xd, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8b,0xc7,0x2, 0xc5,0x84, +0x1, 0x1e,0xe2,0x0, 0xcf,0x83,0xe0,0xd, 0x3f,0x1a,0xe8,0x0, 0xc6,0x82,0x2, 0xe9, +0xe0,0x4, 0x9e,0x74,0xe0,0xd, 0x37,0x21,0xc7,0x81,0xe0,0x9, 0x3f,0x1a,0xe0,0xd, +0x36,0x1d,0xe2,0x1, 0xc7,0xff,0xea,0x0, 0xce,0x2, 0x3e,0x19,0xe2,0x0, 0xc6,0x8f, +0xe2,0x0, 0xcf,0x8b,0xb6,0x8c,0xc7,0x2, 0xc5,0x84,0x1, 0xe4,0xa7,0x13,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x93,0xa, 0xe1,0xe0,0x5, 0x9e,0xb4,0x14,0xf0,0x3c,0x9b, +0xe0,0xc, 0x3f,0x1a,0x36,0x99,0xe8,0x0, 0xc6,0x2, 0xe2,0x0, 0xc6,0x8f,0xb6,0x8c, +0x0, 0xc9,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83, +0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe7,0xbf,0x16,0x7f,0x96,0xd8, +0xb6,0xdf,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x14,0x60,0xe0,0x1, +0xb6,0x9f,0x8e,0x8e,0x8d,0x9e,0x36,0xa8,0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xae, +0xe0,0x9, 0xb6,0xdf,0x8e,0xae,0xe0,0x1, 0xb6,0xff,0xe0,0x7, 0x9e,0x9f,0x3e,0xdc, +0xe0,0x7, 0xb6,0x9f,0x8f,0x3e,0xe0,0x7, 0x9e,0x9f,0x37,0x2d,0x3f,0x4d,0xe0,0x7, +0xb7,0x1f,0x9f,0x1f,0x3e,0x5e,0xb6,0x1f,0xdd,0xea,0xa7,0x12,0xe7,0xbf,0x17,0xff, +0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe0,0x1, +0x14,0x60,0x96,0xde,0xb6,0xdf,0x96,0xfe,0xb6,0xff,0xe0,0x1, 0x96,0x9e,0xe0,0x1, +0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae, +0xe0,0x9, 0xb6,0xdf,0x8f,0x2e,0xe0,0x1, 0xb7,0x7f,0x9f,0x1f,0xe0,0x40,0xcf,0x0, +0xb7,0x1f,0xdd,0xbd,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92, +0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0x16,0x0, 0x96,0xd8,0x34,0xa8,0xb6,0xdf, +0x3d,0x49,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9f,0x8e,0x88, +0x8d,0x98,0x36,0xa8,0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xa8,0x14,0x30,0xe0,0x9, +0xb6,0xdf,0xe0,0x7, 0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8f,0x3e, +0xe0,0x7, 0x9e,0x9f,0x37,0x2e,0x3f,0x4d,0xe0,0x7, 0xb7,0x1f,0xe0,0x1, 0xb6,0x7f, +0xe0,0x2, 0xb5,0x1f,0xe0,0x1, 0x9f,0x7f,0xe0,0x1, 0xcf,0x3, 0xe0,0x1, 0xb7,0x7f, +0xe0,0x1, 0xb6,0x3f,0xb6,0x1f,0xdd,0x7b,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, +0x1f,0x83,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0x15,0x80,0x96,0xd8, +0xb6,0xdf,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0x14,0x30,0xe0,0x1, 0xb6,0x9f, +0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, +0xb6,0xdf,0xe0,0x7, 0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8e,0xbe, +0xe0,0x7, 0x9e,0x1f,0x36,0xae,0x3e,0xcc,0xe0,0x7, 0xb6,0x9f,0xe0,0x1, 0xb5,0xff, +0xe0,0x2, 0xb4,0x9f,0xe0,0x1, 0x9e,0xff,0xe0,0x1, 0xce,0x83,0xe0,0x1, 0xb6,0xff, +0xe0,0x1, 0xb5,0xbf,0xe0,0x2, 0x8f,0x7e,0x9e,0x9f,0x37,0x2a,0x3f,0x4d,0xb7,0x1f, +0xdd,0x36,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2, +0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0x8f, +0xe0,0x40,0xce,0x80,0xbe,0x92,0x14,0x0, 0x96,0xde,0xb6,0xdf,0xe0,0x1, 0x96,0x9e, +0xe0,0x1, 0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf, +0x96,0xae,0xe0,0x9, 0xb6,0xdf,0xe0,0x1, 0xb4,0xff,0xe0,0x2, 0xb5,0x1f,0xe0,0x2, +0x8e,0x7e,0xe0,0x2, 0x8e,0xee,0x8f,0x3e,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0x28, +0x3f,0x4d,0xb7,0x1f,0x9f,0x1f,0xe1,0x0, 0xcf,0x0, 0xb7,0x1f,0xdd,0x0, 0xa7,0x12, +0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91, +0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92, +0x3f,0xe8,0x96,0xd8,0xb6,0xde,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28,0xe0,0x1, +0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xaf, +0xe0,0x9, 0xb6,0xde,0xe0,0x2, 0x8e,0x7f,0xe0,0x2, 0x8e,0xef,0x8f,0xbf,0x36,0x2a, +0x36,0xa9,0x3e,0xcc,0x37,0xa8,0x3f,0xcd,0xb7,0x9e,0x9f,0x9e,0xe1,0x0, 0xcf,0x80, +0xb7,0x9e,0xdc,0xcd,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, +0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xdf,0x14,0x30,0xb6,0xde,0x96,0xff, +0xb6,0xfe,0xe0,0x1, 0x96,0x9f,0xe0,0x1, 0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8, +0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xaf,0xe0,0x9, 0xb6,0xde,0xe0,0x2, 0x8e,0x7f, +0xe0,0x2, 0x8e,0xef,0x8f,0xbf,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0xa8,0x3f,0xcd, +0xb7,0x9e,0x9f,0x9e,0xe1,0x0, 0xcf,0x80,0xb7,0x9e,0xdc,0x99,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0x3f,0x68, +0xa1,0x8f,0xe0,0x3, 0x1f,0x83,0xe0,0x0, 0x14,0x40,0xa1,0xf, 0xa7,0x93,0xe0,0x40, +0xcf,0x80,0xbf,0x93,0x97,0xde,0xb7,0xd2,0x8f,0x8e,0x8e,0x9e,0x37,0xa8,0x97,0x2e, +0x3f,0x9d,0xe0,0x1, 0xb7,0xd2,0x17,0x80,0xe0,0x9, 0xb7,0x52,0xe0,0x1, 0xb5,0x72, +0xe0,0x2, 0xb4,0x92,0xb7,0x92,0x9f,0x92,0xe1,0x0, 0xcf,0x80,0xb7,0x92,0xdc,0x6f, +0xe0,0x7, 0x9c,0x32,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1, +0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0x16,0x80,0xa1,0x8f,0xe0,0x3, 0x1f,0x83,0xa7,0x13, +0xa1,0xf, 0xe0,0x40,0xcf,0x0, 0xbf,0x13,0x3f,0xe8,0x97,0x58,0xb7,0x52,0x97,0x78, +0xb7,0x72,0xe0,0x1, 0x97,0x18,0x14,0x0, 0xe0,0x1, 0xb7,0x12,0xe0,0x0, 0x1f,0x15, +0xae,0x8e,0x8f,0xf, 0x8e,0x9f,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f, +0xe0,0x1, 0xb7,0x72,0x97,0x2f,0xe0,0x9, 0xb7,0x52,0x87,0xbf,0xe2,0x0, 0xc7,0x81, +0xe4,0xf, 0x37,0xa8,0xe4,0xf, 0x37,0xc0,0xb7,0x92,0xdc,0x39,0xe0,0x6, 0x9c,0x72, +0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1,0x8, 0xb3,0xe0,0x2, +0x1f,0x91,0xe2,0x0, 0xc5,0x3, 0xa1,0x8f,0xa7,0x93,0xe0,0x40,0xcf,0x80,0xbf,0x93, +0xe0,0x3, 0x1f,0x83,0xa1,0xf, 0x2d,0x17,0xe0,0x9, 0xb5,0x52,0x35,0xaa,0xb4,0x52, +0x35,0x28,0xe0,0x1, 0xb4,0xd2,0xe0,0x1, 0x14,0x10,0xb5,0x92,0x9f,0x92,0x3d,0x4f, +0xb5,0x12,0xdc,0x15,0xe0,0x5, 0x9c,0x52,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x93,0x9, 0xe1,0x17,0x82,0xe0,0x9, 0xb7,0xd2,0x0, 0xe9,0xe0,0x2, 0x1f,0x91, +0x34,0xa3,0xa6,0xf, 0xe0,0x3, 0x1f,0x83,0xf0,0x0, 0x1b,0x95,0xa7,0xf, 0xa7,0x9c, +0xa6,0x9c,0xe0,0x40,0xce,0x80,0xbe,0x9c,0x96,0xd8,0xe8,0x0, 0x8d,0x7, 0xe0,0x8, +0xb6,0xfe,0x96,0xf8,0xe0,0x9, 0xb6,0x9e,0xe0,0x1, 0x96,0x98,0xe0,0x9, 0xb6,0xbe, +0x8e,0xc8,0x8d,0xd8,0x36,0xa8,0x3e,0x9b,0xe0,0x8, 0xb6,0xbe,0xe0,0xd, 0x37,0xcd, +0x8f,0xe8,0x8d,0xf8,0x37,0xa8,0xe0,0x1, 0x94,0x28,0x3f,0x9b,0xe0,0x8, 0xb7,0xde, +0xe2,0x0, 0xc6,0x81,0xe0,0x9, 0xb4,0x5e,0x15,0x80,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe, +0xc7,0x80,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0x3c,0xcf,0xe0,0x7, 0xb4,0x9e, +0xe0,0x7, 0x9f,0x9e,0xcf,0x90,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xcf,0x81, +0xe0,0x7, 0xb7,0x9e,0x0, 0x86,0xe0,0x7, 0x9f,0x9e,0xe2,0x0, 0xc7,0xa0,0x2f,0x9a, +0xe0,0x7, 0x9f,0x9e,0xe2,0x1, 0xc7,0x80,0x27,0xf7,0x2d,0x9c,0xe0,0x7, 0x9f,0x9e, +0x36,0xad,0xcf,0x84,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe,0xc7,0x80, +0xe0,0x7, 0xb7,0x9e,0xe7,0xbf,0x17,0xff,0xa7,0x1c,0x3f,0xde,0x3f,0xcd,0xbf,0x9c, +0x38,0x82,0xe0,0x7, 0x9f,0x9e,0x15,0x1, 0xcf,0x82,0xe0,0x7, 0xb7,0x9e,0x3d,0xea, +0x0, 0xe0,0xe8,0x0, 0xad,0x7, 0x0, 0xe3,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8, +0x96,0xd8,0xb6,0xde,0x96,0xf8,0xb6,0xfe,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28, +0xe0,0x1, 0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x97,0xaf,0x3e,0x9c,0xe0,0x1, +0xb6,0xde,0xe0,0x9, 0xb7,0xde,0x17,0x80,0xb7,0x9e,0xdb,0x79,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0xe0,0x1, 0x1f,0xdc,0x14,0x3, 0xa7,0xf, +0xe0,0x1, 0xa7,0x8e,0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x2f,0x82,0x38,0x82,0xe0,0x1, +0xa4,0xe, 0x34,0x49,0xe2,0x0, 0xc4,0x1, 0x38,0x82,0xe0,0x2, 0x1f,0xf0,0xa7,0xf, +0xe0,0x1, 0x1f,0xdc,0xa6,0x8f,0x17,0x80,0xe0,0x1, 0xaf,0xbe,0xa7,0x9e,0xe2,0x0, +0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0xf7, +0xa6,0x9e,0x17,0xfe,0x3f,0xdd,0xbf,0x9e,0xe0,0x1, 0x8c,0x3e,0x38,0x82,0xe0,0x2, +0x1f,0xf0,0xa7,0xf, 0xe0,0x1, 0x1f,0xdc,0xe0,0x1, 0xac,0x3e,0xa6,0x8f,0xa7,0x9e, +0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0xf7,0xa6,0x9e,0x17,0xfe,0x3f,0xdd,0xbf,0x9e,0x38,0x82,0x24,0xa6,0x17,0xff, +0xe0,0x2, 0x1f,0x70,0xe0,0x1, 0x1e,0xdc,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f, +0xa7,0xe, 0xa6,0x8d,0x3e,0x18,0xe0,0xb, 0x3c,0x1f,0x14,0x80,0x15,0x7e,0xe0,0x1, +0xac,0xbe,0xa7,0x9e,0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1, +0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa7,0x9e,0x3f,0xda,0xbf,0x9e,0xe0,0x1, 0x8f,0xbe, +0xe0,0x80,0xaf,0x9c,0x3e,0x7b,0x1, 0xec,0x38,0x82,0x24,0xa3,0x17,0xff,0xe0,0x2, +0x1f,0x70,0xe0,0x1, 0x1e,0xdc,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f,0xa7,0xe, +0xa6,0x8d,0x3e,0x18,0xe0,0xb, 0x3c,0x1f,0x15,0x7e,0xe0,0x80,0x87,0x9c,0xe0,0x1, +0xaf,0xbe,0xa7,0x9e,0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1, +0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa7,0x9e,0x3e,0x7b,0x3f,0xda,0xbf,0x9e,0x1, 0xee, +0x38,0x82,0xe0,0x2, 0x1f,0xf0,0x17,0x1, 0xa7,0x8f,0x3f,0x58,0xa5,0xbf,0x16,0xfb, +0xe0,0xc, 0x37,0x22,0x3e,0xdb,0x3e,0xcc,0xbe,0xbf,0x15,0xef,0xa6,0xbf,0xe0,0xc, +0x37,0x24,0x3e,0xdb,0x3e,0xcc,0xbe,0xbf,0x16,0xf7,0xa5,0xf, 0xe0,0xc, 0x37,0x23, +0x3e,0xda,0x3e,0xcc,0xbe,0x8f,0x16,0xfe,0xa6,0x3f,0x3e,0xdc,0x3f,0x4d,0xbf,0x3f, +0xe0,0x2, 0x1f,0x66,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0xc, 0x2f,0xa, 0xa6,0x8f, +0xe0,0x2e,0x3c,0xe, 0xe0,0x8, 0x37,0x24,0xe0,0xe, 0x3e,0xdb,0x3f,0x48,0xbf,0xf, +0x38,0x82,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x24,0x7, 0xa6,0x8f,0xe7,0xfe,0x17,0x7f, +0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe7,0xff, +0x17,0x3f,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x70,0x97,0x88, +0xa6,0x8e,0xe2,0xff,0xc7,0xff,0xe0,0x1, 0xb7,0x9d,0x97,0x98,0xe2,0x7f,0xc7,0xff, +0xe0,0x1, 0xb7,0xbd,0x17,0xf7,0x9f,0x8, 0xa6,0x3d,0x37,0x4f,0x37,0x23,0x3f,0xdc, +0x3f,0xce,0xbf,0xbd,0x17,0xfc,0x9f,0x18,0xa6,0x6d,0x37,0x4e,0x3f,0xdc,0x3f,0xce, +0xbf,0xed,0x38,0x82,0xe0,0x2, 0x1e,0x94,0xe0,0x2, 0x1f,0x70,0x87,0xcd,0xa7,0xe, +0xcf,0x82,0xaf,0xcd,0xa7,0xbe,0xcf,0x82,0xbf,0xbe,0x38,0x82,0xe0,0x2, 0x1f,0x14, +0x9f,0xae,0x37,0xc9,0xe2,0x0, 0xc7,0x81,0x2f,0xfc,0x38,0x82,0xe0,0xd, 0x3c,0x49, +0xe2,0x0, 0xce,0x8f,0x3f,0xe8,0x3f,0x69,0x2, 0x8a,0xea,0x4f,0x7c,0x9c,0xe9,0xff, +0xc4,0xff,0x3c,0x9e,0x37,0xa4,0x3f,0x99,0x8c,0xf, 0x38,0x82,0x8, 0xb2,0xe2,0x0, +0xcc,0x0, 0x3, 0x17,0xe2,0x0, 0xcc,0x80,0xe0,0x41,0x3f,0xc8,0x3, 0xb, 0x11,0x1, +0x15,0x0, 0xe0,0x41,0x3c,0xce,0x3c,0x6f,0xd0,0x27,0x29,0x3, 0xe0,0x41,0x3c,0x48, +0x9, 0x61,0x15,0x0, 0x3c,0x6f,0xd0,0x20,0x0, 0xfa,0x15,0x0, 0x9, 0x21,0x0, 0x9c, +0xe2,0x0, 0xcc,0x80,0x3, 0x7b,0x11,0x0, 0x0, 0xec,0x8, 0xb2,0xe2,0x0, 0xcc,0x0, +0x3, 0xf, 0xe0,0x41,0x3c,0x48,0x11,0x1, 0xe2,0x0, 0xcc,0x80,0x3, 0x3, 0xe0,0x41, +0x3c,0xc9,0x15,0x1, 0xd0,0x9, 0x21,0x3, 0xe0,0x41,0x3c,0x48,0x9, 0x61,0x11,0x0, +0x0, 0xf4,0x15,0x0, 0x0, 0x81,0x17,0x81,0x17,0x0, 0xe1,0x2d,0x3c,0x19,0x26,0x84, +0xe1,0x2d,0x3f,0x8e,0x2e,0x88,0x17,0x0, 0x2f,0x8c,0xe2,0x0, 0xcd,0x0, 0xe0,0x68, +0x39,0x2e,0x38,0x82,0xe2,0x0, 0xcc,0x80,0x4, 0x77,0x34,0xa1,0x37,0xa1,0x0, 0xee, +0x3c,0x79,0x4, 0x83,0x3c,0x29,0x3f,0x4f,0x37,0xc1,0x34,0xc1,0x0, 0xee,0x0, 0x0, +0x3d,0xe8,0xe2,0x0, 0xcd,0x3, 0x5, 0xad,0xe0,0xc, 0x3c,0x49,0xe2,0x0, 0xc6,0x3, +0x2e,0x28,0xc5,0x7c,0xe0,0xc, 0x35,0x21,0xe2,0x0, 0xc6,0x18,0xe1,0x80,0xa7,0x99, +0x26,0x8, 0xea,0x0, 0xce,0x81,0xe0,0x7e,0xce,0xe4,0x3e,0xac,0x3f,0x6f,0x3e,0x82, +0xc5,0x70,0x6, 0x93,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99, +0xe1,0x80,0xbf,0x1b,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99, +0xc5,0x70,0xe1,0x80,0xbf,0x1b,0x6, 0x6f,0xe1,0x80,0xbf,0x9b,0xe2,0x0, 0xc5,0x3, +0xc5,0x7f,0x6, 0x87,0xe1,0x80,0x86,0x19,0xc5,0x7f,0xe1,0x80,0xae,0x1b,0x6, 0x7b, +0x38,0x82,0x0, 0x0, 0xe2,0x0, 0xcd,0x3, 0x5, 0xb1,0xe2,0x1, 0xc4,0xff,0xe0,0xc, +0x34,0xa8,0x3c,0xcc,0xe4,0xc, 0x34,0xa0,0x3c,0xcc,0xe0,0x41,0x3e,0x48,0xe2,0x0, +0xc6,0x3, 0xe0,0xb, 0x3e,0x18,0xe0,0xd, 0x3d,0x2c,0x3e,0x6d,0xe2,0x0, 0xc6,0xc, +0x26,0x7, 0xea,0x0, 0xcf,0x81,0xe0,0x7f,0xcf,0xd4,0x3f,0xac,0x3f,0x82,0xe1,0xff, +0xc6,0xf0,0x6, 0x8b,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b, +0xc6,0xf0,0xe1,0x80,0xbc,0x9b,0x6, 0x77,0x3d,0x18,0xe0,0xc0,0xac,0xba,0xac,0x9a, +0xac,0xaa,0xac,0x88,0xac,0x98,0xac,0xa8,0x38,0x82,0x3d,0xe8,0xc5,0x7f,0x6, 0x85, +0xe1,0x80,0xac,0x9b,0xc5,0x7f,0x6, 0x7d,0x38,0x82,0xe0,0x3, 0x1f,0x8b,0xbc,0xf, +0x38,0x82,0xe0,0x3, 0x1f,0xb, 0xe0,0x3, 0x1c,0x65,0xa7,0x8e,0x3f,0xb8,0xe0,0x3, +0x1c,0x66,0x3f,0x98,0xe0,0x3, 0x1c,0x67,0xbf,0x8e,0x3c,0x5f,0x38,0x82,0x8, 0xb1, +0xe0,0x60,0x3c,0x87,0xea,0x24,0x7f,0xf8,0xe0,0x0, 0x15,0x60,0x3c,0x6f,0xdf,0x71, +0xe0,0x60,0x3c,0x17,0x8, 0xe1,0x0, 0x0, 0x0, 0x0, 0x16,0x98,0x0, 0x0, 0x16,0x56, +0x0, 0x0, 0x15,0xdc,0x0, 0x0, 0x16,0x56,0x0, 0x0, 0x16,0x4c,0x0, 0x0, 0x16,0xba, +0x0, 0x0, 0x16,0xb0,0x0, 0x0, 0x15,0xe0,0x0, 0x0, 0x16,0xb0,0x0, 0x0, 0x16,0x4c, +0x0, 0x0, 0x2d,0xee,0x0, 0x0, 0x2d,0xf6,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8, +0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8, +0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xfc,0x0, 0x0, 0x2e,0xc, +0x0, 0x0, 0x2e,0x1c,0x0, 0x0, 0x2e,0x1c,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x30,0x86,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x70, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x54,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x3c, +0x0, 0x0, 0x30,0x2e,0x0, 0x0, 0x30,0x2e,0x0, 0x0, 0x30,0x20,0x0, 0x0, 0x30,0x20, +0x0, 0x0, 0x30,0x20,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xe, 0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xc8,0x0, 0x0, 0x30,0xc8, +0x0, 0x0, 0x30,0xc8,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x33,0xe, 0x0, 0x0, 0x30,0xba, +0x0, 0x0, 0x30,0xac,0x0, 0x0, 0x30,0x0, 0x0, 0x0, 0x2f,0xf2,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xd8,0x80,0x0, 0xd, 0x0, 0x80,0x0, 0xb, 0x0, +0x80,0x0, 0xa, 0x0, 0x80,0x0, 0x7, 0x0, 0x80,0x0, 0x5, 0x0, 0x80,0x0, 0x4, 0x0, +0x80,0x0, 0x3, 0x0, 0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x1, 0x0, 0x80,0x0, 0x0, 0x0, +0x80,0x1, 0x20,0x0, 0x0, 0x3, 0x86,0x60,0x0, 0x3, 0x80,0x0, 0x80,0x1, 0x40,0x0, +0x80,0x1, 0x10,0x0, 0x80,0x0, 0x6, 0x0, 0x80,0x0, 0x8, 0x0, 0x50,0x1, 0x32,0x2, +0x0, 0x3, 0xf0,0x4, 0xce,0x5, 0x9c,0x6, 0x84,0x7, 0x81,0x8, 0x0, 0x2, 0x1, 0x0, +0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, +0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0xeb,0xaa,0x8, 0x0, +0x0, 0x3, 0x6, 0xa8,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x3, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x4, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x0, 0x0, 0x0, 0x0, 0xd, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x0, 0x0, 0x0, 0xe, 0x7, 0x4, 0x3, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x0, 0x0, 0xf, 0x7, 0x5, 0x3, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0xff,0x40,0x0, 0x0, 0x0, 0x2, 0x2e,0x70,0x2, 0x0, 0x0, 0x0, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x12,0x0, 0x20, +0x0, 0x12,0x20,0x12,0x20,0x0, 0x0, 0x2, 0x40,0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, +0x1b,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, +0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, 0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, +0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, 0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, +0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, 0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, +0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, 0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, +0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, 0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, +0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, 0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, +0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, 0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, +0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, 0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, +0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, 0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, +0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, 0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, +0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, 0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, +0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, 0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, +0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, 0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, +0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, 0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, +0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, 0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, +0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, 0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, +0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, 0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, +0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, 0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, +0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, 0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, +0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, 0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, +0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, 0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, +0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, 0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, +0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, 0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, +0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, 0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, +0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, 0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, +0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, 0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, +0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, 0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, +0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, 0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, +0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, 0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, +0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, 0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, +0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, 0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, +0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, 0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, +0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, 0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, +0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, 0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, +0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, 0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, +0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, 0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, +0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, 0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, +0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, 0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, +0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, 0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, +0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, 0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, +0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, 0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, +0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, 0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, +0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, 0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, +0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, 0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, +0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, 0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, +0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, 0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, +0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, +0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, 0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, +0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, +0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, +0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, +0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, +0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, +0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, +0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, +0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, +0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, +0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, +0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, +0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, 0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, +0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, +0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, +0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, +0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, +0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, +0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, +0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, +0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, +0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, +0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, +0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, +0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, +0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, 0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, +0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, 0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, +0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, 0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, +0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, 0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, +0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, 0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, +0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, 0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, +0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, 0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, +0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, 0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, +0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, 0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, +0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, 0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, +0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, 0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, +0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, 0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, +0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, 0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, +0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, 0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, +0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, 0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, +0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, 0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, +0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, 0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, +0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, 0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, +0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, 0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, +0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, 0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, +0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, 0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, +0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, 0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, +0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, 0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, +0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, 0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, +0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, 0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, +0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, 0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, +0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, 0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, +0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, 0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, +0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, 0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, +0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, 0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, +0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, 0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, +0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, 0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, +0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, 0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, +0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, 0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, +0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, 0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, +0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, 0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, +0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, 0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, +0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, 0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, +0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, 0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, +0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, 0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, +0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, 0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, +0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, 0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, +0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, 0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, +0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, 0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, +0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, 0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, +0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, 0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, +0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, +0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, 0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, +0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, +0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, +0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, +0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, +0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, +0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, +0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, +0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, +0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, +0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, +0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, +0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, 0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, +0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, +0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, +0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, +0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, +0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, +0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, +0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, +0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, +0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, +0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, +0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, +0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,0x3, 0x5, 0x0, 0xd, 0x17,0x3, +0x5, 0x1, 0xe, 0x17,0x3, 0x5, 0x2, 0x10,0x2, 0x1, 0xa, 0x1e,0x24,0x14,0x0, 0x64, +0xd, 0xac,0x0, 0xc8,0x1, 0x4, 0x0, 0x87,0x0, 0xd2,0x1, 0xf4,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x2c,0xa, 0x0, 0x2, 0x56,0x1, 0x5, 0xc, 0x1e,0x3c,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x6, 0x1, 0x0, 0x1, 0x80,0x1, 0x0, 0x14,0x1, 0xda,0x0, 0x1, 0x0, 0x16,0x1, +0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0xeb,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1d,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x3, 0x3, 0x0, 0xff,0xff,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1, 0xc8,0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x2, 0x40,0x4, 0x0, 0x2, 0xd5,0x1, 0x68,0x28,0x28,0x1, 0x9a,0x1, +0xb8,0x0, 0xa0,0x0, 0xa2,0x5, 0xa0,0x2, 0xd0,0x2e,0x2e,0x1, 0x98,0x1, 0x7a,0x0, +0xb4,0x0, 0xb4,0x12,0x0, 0xb4,0x1, 0x68,0x2, 0x1c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa8,0x1, 0x2c, +0x0, 0x48,0x0, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2, 0x4, 0x4, 0x6, 0x80,0x0, 0x64,0x7, +0xd0,0x8, 0x5, 0x6, 0x1, 0x2c,0x2, 0x58,0x1, 0x90,0x1f,0x40,0x23,0x1, 0x86,0x1, +0x86,0x0, 0xc, 0x17,0x11,0x12,0x1, 0x2c,0x1, 0x4, 0x4, 0x10,0x2, 0x8, 0x3, 0xa, +0xa, 0x0, 0x50,0x2, 0x85,0x0, 0x50,0x5, 0x50,0x0, 0x32,0x1, 0x5e,0x1, 0x5e,0x3, +0x20,0x0, 0xc8,0x0, 0x28,0x0, 0x1e,0x0, 0x80,0x0, 0xb5,0x2, 0xd0,0x0, 0x3c,0x3, +0xe8,0x1, 0x68,0x1, 0x6a,0x0, 0x3c,0x3, 0xe8,0x0, 0x20,0x2, 0xb5,0x0, 0x0, 0x5, +0xa0,0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88,0x1, 0x2c,0x0, 0x0, 0x2, 0x3f,0x0, +0x1, 0x4, 0x0, 0x5, 0x0, 0x20,0x1, 0x0, 0x0, 0x5c,0x5c,0x0, 0x5c,0x5c,0x0, 0x5c, +0x5c,0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7f,0xff,0x1, 0x1, 0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x64,0xff,0xff,0xff, +0x30,0x0, 0x0, 0x0, 0x40,0x33,0x2d,0x24,0x1e,0x18,0x10,0xa, 0xa, 0xe, 0x15,0x1e, +0x24,0x2b,0x32,0x35,0x2f,0x28,0x22,0x1a,0x13,0xa, 0x3, 0x0, 0x1, 0x4, 0xa, 0x12, +0x1b,0x25,0x2c,0x31,0x9, 0x0, 0x0, 0x2, 0x4, 0x8, 0xf, 0x19,0x20,0x27,0x2b,0x2d, +0x2e,0x2e,0x2e,0x2c,0x2c,0x2d,0x2e,0x32,0x35,0x3b,0x43,0x4d,0x56,0x5d,0x62,0x67, +0x6a,0x6d,0x6e,0x70,0xda,0xe1,0xff,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10, +0xc, 0x8, 0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d, +0x22,0x26,0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10, +0x16,0x1b,0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b, +0x4a,0x48,0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x40,0x39,0x34,0x2f, +0x2a,0x24,0x20,0x1b,0x15,0x10,0xb, 0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3, +0x4, 0x7, 0xa, 0xc, 0x10,0x15,0x19,0x1d,0x22,0x28,0x2d,0x31,0x4, 0x0, 0x0, 0x0, +0x1, 0x4, 0x6, 0x9, 0xd, 0x11,0x16,0x1b,0x21,0x27,0x2c,0x30,0x35,0x3c,0x42,0x46, +0x4a,0x51,0x57,0x5b,0x60,0x63,0x65,0x64,0x61,0x5d,0x59,0x56,0x89,0x65,0x34,0x55, +0x0, 0x3, 0x4, 0x6, 0x7, 0x9, 0x9, 0xb, 0xd, 0xf, 0x13,0x16,0x19,0x1d,0x20,0x22, +0x26,0x29,0x2b,0x2b,0x2d,0x2e,0x30,0x31,0x33,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f, +0x13,0x19,0x1e,0x22,0x26,0x29,0x2c,0x31,0x35,0x39,0x3c,0x3e,0x3f,0x3e,0x3b,0x38, +0x35,0x32,0x2f,0x2c,0x28,0x24,0x20,0x1c,0x19,0x16,0x12,0xe, 0xa, 0x6, 0x3, 0x1, +0x97,0xae,0xff,0x55,0x14,0x1a,0x1f,0x25,0x2a,0x2d,0x2d,0x28,0x24,0x1f,0x1b,0x17, +0x12,0xe, 0xc, 0xa, 0x8, 0x8, 0x8, 0x8, 0xa, 0xe, 0x13,0x17,0x1b,0x20,0x26,0x2c, +0x32,0x36,0x3c,0x3d,0x2c,0x2b,0x2a,0x27,0x24,0x21,0x1c,0x1a,0x1a,0x1c,0x1e,0x20, +0x25,0x2a,0x2e,0x32,0x37,0x3b,0x3f,0x43,0x47,0x4c,0x50,0x51,0x53,0x54,0x55,0x56, +0x57,0x57,0x57,0x57,0xdd,0x4, 0x33,0x55,0xe, 0x15,0x1b,0x21,0x26,0x2a,0x30,0x36, +0x3a,0x3d,0x3e,0x3d,0x3a,0x36,0x32,0x2d,0x28,0x1c,0x16,0x10,0xa, 0x6, 0x3, 0x1, +0x0, 0x0, 0x3, 0xa, 0x15,0x29,0x39,0x39,0x37,0x35,0x32,0x2f,0x2c,0x29,0x24,0x1e, +0x18,0x12,0xd, 0x9, 0x5, 0x1, 0x0, 0x0, 0x0, 0x5, 0x9, 0xe, 0x14,0x1c,0x24,0x2c, +0x35,0x3e,0x45,0x4a,0x4b,0x45,0x3f,0x3f,0xf3,0x41,0x33,0x55,0xa, 0x12,0x1a,0x1e, +0x23,0x26,0x25,0x1f,0x1b,0x12,0xa, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, 0x2, 0x6, 0x11, +0x19,0x1d,0x26,0x31,0x36,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x33,0x2c,0x23,0x1e, +0x16,0xe, 0x9, 0x1, 0x1, 0x6, 0x11,0x16,0x1f,0x25,0x2e,0x39,0x3e,0x46,0x49,0x48, +0x43,0x3f,0x35,0x2a,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa2,0x28,0x33,0x55, +0x3, 0xb, 0x10,0x15,0x1a,0x1e,0x21,0x27,0x29,0x28,0x25,0x20,0x1b,0xe, 0x9, 0x7, +0x5, 0x3, 0x1, 0x0, 0x0, 0x1, 0x3, 0x5, 0x9, 0x16,0x1f,0x29,0x33,0x36,0x36,0x36, +0x22,0x20,0x1f,0x1e,0x1b,0x18,0x15,0xc, 0x7, 0x2, 0x0, 0x0, 0x2, 0xb, 0x10,0x14, +0x18,0x1c,0x21,0x2b,0x2f,0x33,0x37,0x3b,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3b,0x3b, +0x6, 0x43,0x33,0x55,0x4, 0xc, 0x13,0x1a,0x20,0x26,0x2c,0x32,0x34,0x31,0x2b,0x24, +0x1b,0x14,0xd, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, 0x2, 0x7, 0xe, 0x16,0x1d,0x23,0x29, +0x30,0x36,0x3d,0x3e,0x1b,0x1c,0x1d,0x1d,0x1d,0x1c,0x1a,0x16,0x10,0x9, 0x3, 0x0, +0x0, 0x3, 0xa, 0x12,0x19,0x1f,0x25,0x2c,0x32,0x39,0x3f,0x44,0x47,0x48,0x47,0x46, +0x43,0x3f,0x3b,0x3a,0x7c,0x49,0x33,0x55,0xb, 0x14,0x1b,0x23,0x2e,0x34,0x38,0x39, +0x36,0x32,0x2b,0x24,0x18,0x12,0xd, 0x9, 0x4, 0x2, 0x0, 0x0, 0x2, 0x6, 0xd, 0x13, +0x1f,0x25,0x2c,0x33,0x3e,0x3f,0x3f,0x3f,0x24,0x26,0x26,0x26,0x25,0x22,0x1d,0x16, +0xb, 0x5, 0x2, 0x0, 0x2, 0x6, 0xc, 0x13,0x1d,0x23,0x29,0x2f,0x3a,0x40,0x45,0x47, +0x49,0x49,0x48,0x46,0x42,0x41,0x41,0x41,0xd3,0x80,0x33,0x55,0x0, 0x8, 0x10,0x16, +0x1d,0x23,0x2b,0x30,0x32,0x32,0x30,0x2c,0x26,0x1e,0x18,0x11,0xb, 0x9, 0x6, 0x5, +0x4, 0x4, 0x6, 0xa, 0x11,0x19,0x21,0x28,0x2f,0x36,0x3c,0x3f,0x1f,0x21,0x22,0x22, +0x21,0x20,0x1d,0x18,0x12,0xc, 0x6, 0x2, 0x0, 0x0, 0x3, 0x9, 0x12,0x19,0x20,0x26, +0x2c,0x34,0x3b,0x41,0x45,0x48,0x49,0x48,0x46,0x42,0x3e,0x3c,0xdb,0x35,0x33,0x55, +0x4, 0xb, 0x13,0x1b,0x23,0x2a,0x29,0x1f,0x16,0xe, 0x6, 0x2, 0x0, 0x0, 0x3, 0x7, +0x10,0x19,0x22,0x2b,0x33,0x38,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x2c,0x27,0x21,0x1b,0x15,0xd, 0x4, 0x0, 0x1, 0x5, 0xc, 0x14,0x1d,0x28,0x32,0x36, +0x3d,0x3f,0x3e,0x3c,0x36,0x2e,0x26,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0xb5,0x6c,0x33,0x55,0x17,0x1c,0x20,0x27,0x2b,0x30,0x39,0x3d,0x3f,0x3d,0x3a,0x35, +0x2b,0x25,0x20,0x17,0x13,0xe, 0x6, 0x3, 0x0, 0x0, 0x2, 0x9, 0xd, 0x11,0x19,0x1a, +0x1a,0x1a,0x1a,0x1a,0xa, 0x11,0x16,0x1d,0x20,0x23,0x23,0x1f,0x1a,0x10,0xb, 0x7, +0x1, 0x0, 0x0, 0x2, 0x4, 0x7, 0x10,0x16,0x21,0x26,0x2b,0x35,0x39,0x3c,0x3f,0x40, +0x40,0x40,0x40,0x40,0x68,0xc0,0x33,0x55,0xa, 0x10,0x1a,0x1e,0x26,0x2c,0x2d,0x2c, +0x29,0x20,0x15,0xf, 0x6, 0x3, 0x0, 0x0, 0x0, 0x3, 0x7, 0x10,0x1c,0x22,0x2d,0x37, +0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x2b,0x29,0x24,0x21,0x1a,0x12,0xe, 0x5, +0x2, 0x0, 0x1, 0x3, 0xb, 0x10,0x1a,0x25,0x29,0x32,0x36,0x3d,0x3f,0x3e,0x3a,0x33, +0x2e,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x1e,0x4d,0x33,0x55,0x0, 0x1, 0x3, 0x5, +0x6, 0x8, 0xb, 0xd, 0x11,0x13,0x16,0x16,0x1a,0x1f,0x21,0x24,0x26,0x28,0x2a,0x2f, +0x35,0x36,0x38,0x39,0x3a,0x3c,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x42,0x37,0x2d,0x23, +0x1d,0x12,0x7, 0x1, 0x9, 0x13,0x1f,0x25,0x31,0x3b,0x36,0x2c,0x20,0x1a,0xf, 0x2, +0x9, 0x11,0x20,0x2d,0x35,0x40,0x47,0x47,0x47,0x47,0x47,0x47,0xff,0x1f,0x32,0x55, +0x0, 0x0, 0x2, 0x3, 0x6, 0x9, 0xc, 0xf, 0x13,0x18,0x1c,0x1d,0x1e,0x1e,0x1e,0x1d, +0x1d,0x23,0x26,0x2a,0x2d,0x32,0x38,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3a,0x3a,0x3a, +0x40,0x35,0x2f,0x28,0x21,0x1a,0x13,0xd, 0x7, 0x1, 0x4, 0xb, 0x11,0x17,0x1d,0x24, +0x2b,0x2a,0x22,0x1c,0x15,0xf, 0x8, 0x3, 0x8, 0xf, 0x16,0x1d,0x23,0x29,0x31,0x32, +0xa5,0xf2,0x32,0x55,0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6, 0xe, 0x13,0x16,0x18, +0x1b,0x1e,0x1e,0x1e,0x1f,0x1f,0x21,0x24,0x2c,0x30,0x35,0x3a,0x3c,0x3f,0x3f,0x3f, +0x3f,0x3f,0x3f,0x3f,0x40,0x39,0x30,0x27,0x22,0x19,0x10,0xd, 0x13,0x1c,0x25,0x2a, +0x33,0x32,0x2d,0x23,0x18,0x12,0x9, 0x1, 0x3, 0x9, 0x13,0x1e,0x23,0x26,0x26,0x26, +0x26,0x26,0x26,0x26,0x7b,0x12,0x32,0x55,0x19,0x14,0x11,0xc, 0x9, 0x5, 0x2, 0x0, +0x4, 0x9, 0xd, 0x11,0x1b,0x20,0x22,0x23,0x23,0x23,0x26,0x27,0x2a,0x2d,0x30,0x37, +0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x10,0x1d,0x23,0x2e,0x36,0x3d, +0x35,0x27,0x1e,0x16,0xe, 0x14,0x21,0x28,0x34,0x39,0x30,0x29,0x1d,0x16,0x10,0x16, +0x1d,0x2c,0x34,0x3f,0x3f,0x3f,0x3f,0x3f,0xe1,0xb1,0x32,0x55,0xb, 0x6, 0x4, 0x2, +0x0, 0x0, 0x0, 0x1, 0x5, 0xf, 0x13,0x17,0x1b,0x1e,0x21,0x20,0x1d,0x19,0x17,0x16, +0x16,0x19,0x1e,0x23,0x28,0x31,0x35,0x39,0x3c,0x3f,0x3f,0x3f,0x40,0x3a,0x35,0x30, +0x2b,0x25,0x20,0x1b,0x17,0x16,0x1a,0x1e,0x23,0x27,0x2a,0x27,0x22,0x17,0x12,0xd, +0x8, 0x4, 0x1, 0x0, 0x0, 0x7, 0xb, 0xf, 0x13,0x15,0x15,0x15,0x4b,0xbb,0x32,0x55, +0x0, 0x3, 0x8, 0xa, 0x11,0x14,0x1c,0x20,0x24,0x25,0x25,0x24,0x23,0x25,0x27,0x2d, +0x30,0x36,0x3b,0x3f,0x3f,0x3f,0x3f,0x3e,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d, +0x29,0x22,0x18,0x12,0x8, 0x4, 0x0, 0x1, 0xc, 0x12,0x1c,0x22,0x2b,0x2a,0x24,0x18, +0x12,0xa, 0x8, 0xf, 0x14,0x1e,0x23,0x2e,0x34,0x3d,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e, +0xc6,0x28,0x32,0x55,0x1f,0x1b,0x17,0x14,0x13,0x12,0x11,0x11,0x12,0x14,0x1a,0x1d, +0x21,0x23,0x24,0x24,0x25,0x24,0x24,0x23,0x21,0x21,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1a,0x1d,0x23,0x29,0x2c,0x34,0x3b,0x3e,0x47,0x4e,0x53,0x51, +0x4b,0x44,0x42,0x3c,0x35,0x32,0x2c,0x25,0x1e,0x1c,0x19,0x19,0x19,0x19,0x19,0x19, +0x19,0x19,0x19,0x19,0xfa,0xf6,0x30,0x55,0x23,0x1e,0x1c,0x1a,0x18,0x17,0x16,0x15, +0x15,0x14,0x14,0x14,0x14,0x16,0x19,0x1d,0x21,0x25,0x28,0x2a,0x2b,0x2c,0x2d,0x2d, +0x2c,0x2b,0x2a,0x29,0x28,0x27,0x27,0x27,0x2f,0x36,0x3a,0x3e,0x43,0x48,0x4d,0x52, +0x56,0x5b,0x60,0x65,0x6a,0x6e,0x71,0x72,0x72,0x70,0x6c,0x67,0x62,0x5d,0x57,0x51, +0x4c,0x47,0x43,0x3e,0x38,0x34,0x31,0x31,0xe4,0xae,0x30,0x55,0x7, 0x5, 0x4, 0x4, +0x5, 0x6, 0xd, 0x14,0x1c,0x22,0x28,0x2f,0x34,0x37,0x39,0x3a,0x39,0x38,0x36,0x32, +0x2c,0x26,0x1a,0x14,0xe, 0xb, 0x8, 0x6, 0x6, 0x5, 0x5, 0x5, 0x33,0x3d,0x43,0x4b, +0x51,0x58,0x64,0x69,0x68,0x65,0x61,0x55,0x4d,0x43,0x3b,0x32,0x22,0x1a,0x13,0xb, +0x7, 0x5, 0x8, 0xf, 0x16,0x1e,0x24,0x30,0x37,0x3c,0x3c,0x3c,0x71,0x75,0x30,0x55, +0x3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7, 0xe, 0x1b,0x22,0x2d,0x32,0x37,0x3a,0x3c,0x3d, +0x3c,0x3a,0x38,0x34,0x29,0x21,0x15,0xc, 0x7, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x2a,0x34,0x3c,0x47,0x4d,0x59,0x60,0x66,0x67,0x66,0x5e,0x58,0x51,0x45,0x3e,0x30, +0x29,0x22,0x17,0xf, 0x5, 0x3, 0x6, 0xb, 0x11,0x1b,0x21,0x2d,0x2e,0x2e,0x2e,0x2e, +0x6a,0x73,0x30,0x55,0xc, 0x5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5, 0xc, 0x13,0x1e, +0x25,0x30,0x35,0x3b,0x3d,0x3f,0x3f,0x3d,0x3c,0x38,0x33,0x28,0x22,0x18,0x12,0xe, +0xd, 0xd, 0xd, 0xd, 0x11,0x19,0x1f,0x2a,0x30,0x3c,0x42,0x4f,0x55,0x5f,0x63,0x64, +0x61,0x59,0x51,0x44,0x3d,0x2e,0x26,0x1c,0x16,0xa, 0x3, 0x0, 0x0, 0x4, 0x8, 0xe, +0xf, 0xf, 0xf, 0xf, 0x7d,0xd0,0x30,0x55,0x15,0xd, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, +0x0, 0x1, 0x8, 0xf, 0x17,0x1f,0x2d,0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3e,0x3a,0x32, +0x2c,0x26,0x20,0x19,0xf, 0xc, 0xc, 0xc, 0x3, 0x9, 0xf, 0x17,0x1e,0x28,0x2e,0x35, +0x3b,0x42,0x50,0x56,0x57,0x56,0x50,0x49,0x41,0x39,0x31,0x25,0x1e,0x17,0xf, 0x5, +0x1, 0x0, 0x0, 0x1, 0x7, 0x9, 0x9, 0x9, 0xca,0xac,0x30,0x55,0x2c,0x23,0x1f,0x19, +0x13,0xc, 0x7, 0x3, 0x0, 0x0, 0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30, +0x36,0x3b,0x3e,0x40,0x3f,0x3e,0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, +0x3, 0x9, 0xe, 0x14,0x1b,0x21,0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a, +0x36,0x2f,0x2b,0x26,0x20,0x1c,0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55, +0x21,0x13,0xc, 0x8, 0x5, 0x2, 0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24, +0x2b,0x32,0x39,0x3d,0x3e,0x3f,0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13, +0x5, 0x9, 0xe, 0x14,0x1a,0x22,0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d, +0x49,0x42,0x39,0x31,0x2b,0x25,0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, +0xaf,0x13,0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, +0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b, +0x3c,0x3e,0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18, +0x1e,0x25,0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33, +0x2c,0x25,0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e,0x3f,0x3f, +0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x1, +0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29,0x22,0x1b, +0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c,0x24,0x2a, +0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, 0x4, 0x7, +0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b,0x38,0x31, +0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35,0x3d,0x45, +0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17,0x11,0x9, +0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6,0x30,0x55, +0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28,0x30,0x36,0x3b,0x3d,0x3f,0x3f, +0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, 0x0, 0x0, 0x1, 0x2, 0x3, 0x5, +0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d,0x52,0x4a,0x3e,0x35,0x2b,0x20, +0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19,0x22,0x2b,0x31,0x3a,0x42,0x47, +0xef,0xc9,0x30,0x55,0x37,0x38,0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, +0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3e,0x30,0x40,0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41, +0x39,0x33,0x2a,0x20,0x1a,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f, +0x25,0x2f,0x38,0x3c,0x37,0xc3,0x57,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c, +0x13,0xe, 0x8, 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31, +0x39,0x3d,0x3f,0x40,0x3f,0x3f,0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a, +0x66,0x63,0x5c,0x53,0x4a,0x40,0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, +0x9, 0x10,0x19,0x21,0x2a,0x32,0x39,0x3e,0x7, 0x90,0x57,0x55,0x18,0x2c,0x34,0x39, +0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, 0x6, 0x1, +0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, 0x8, 0xe, +0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58,0x51,0x48, +0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf,0x57,0x55, +0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28,0x30,0x38, +0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16,0xf, 0xc, +0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, +0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a,0x58,0x57, +0xc6,0x55,0x57,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38,0x3c,0x3e, +0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, 0x1, 0x0, +0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17, +0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57,0x4f,0x47, +0x40,0x38,0x32,0x2f,0x1a,0xb5,0x57,0x55,0x0, 0xb, 0x14,0x1b,0x21,0x28,0x2f,0x37, +0x3d,0x3f,0x3e,0x3c,0x39,0x33,0x2b,0x23,0x1c,0x15,0xc, 0x5, 0x3, 0x3, 0x6, 0x9, +0xd, 0x12,0x18,0x1e,0x24,0x2c,0x33,0x36,0x19,0x13,0x10,0x10,0xf, 0xf, 0x11,0x16, +0x1c,0x25,0x2d,0x33,0x39,0x40,0x47,0x4a,0x4c,0x4c,0x49,0x43,0x3b,0x33,0x2d,0x26, +0x20,0x1a,0x14,0xe, 0xa, 0x5, 0x1, 0x0, 0xb0,0xb5,0x57,0x55,0x2, 0x9, 0xf, 0x1a, +0x1f,0x29,0x2f,0x38,0x3b,0x3e,0x3f,0x3f,0x3b,0x37,0x2e,0x29,0x1e,0x18,0xe, 0xa, +0x3, 0x1, 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x3, +0x5, 0x9, 0xd, 0x18,0x1e,0x27,0x2d,0x32,0x3c,0x3f,0x45,0x46,0x45,0x44,0x3e,0x39, +0x2f,0x2a,0x25,0x1a,0x14,0xc, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x2b,0x77,0x57,0x55, +0x0, 0x1, 0x2, 0x4, 0x5, 0x8, 0xa, 0xf, 0x12,0x15,0x18,0x1a,0x1f,0x22,0x24,0x25, +0x26,0x26,0x28,0x2a,0x2c,0x2f,0x33,0x36,0x37,0x39,0x3a,0x3c,0x3e,0x3f,0x3f,0x3f, +0x1, 0xf, 0x1b,0x2d,0x3d,0x52,0x5f,0x6a,0x60,0x4a,0x39,0x2a,0x17,0xb, 0x4, 0xe, +0x1e,0x2e,0x42,0x50,0x62,0x6b,0x65,0x53,0x43,0x31,0x23,0x13,0x7, 0x2, 0x2, 0x2, +0xa2,0x22,0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x6, 0xa, 0xe, +0x12,0x15,0x18,0x1a,0x1e,0x21,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x29,0x2f,0x34, +0x3a,0x3e,0x3e,0x3e,0x1, 0xa, 0x11,0x17,0x1e,0x24,0x29,0x2e,0x34,0x34,0x2d,0x24, +0x1c,0x14,0xe, 0x8, 0x3, 0x9, 0x10,0x19,0x22,0x2a,0x31,0x36,0x3b,0x38,0x2f,0x24, +0x19,0x11,0x11,0x11,0x4c,0x9f,0x31,0x55,0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0xa, +0xc, 0x10,0x15,0x19,0x1b,0x1f,0x1e,0x1e,0x1d,0x1c,0x1c,0x1e,0x21,0x29,0x31,0x3a, +0x3e,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x14,0x1d,0x23,0x2d,0x34,0x2d, +0x29,0x1e,0x13,0xb, 0x6, 0x6, 0x10,0x19,0x1e,0x29,0x32,0x3c,0x3e,0x34,0x28,0x1b, +0x14,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xef,0x5, 0x31,0x55,0x0, 0x2, 0x4, 0x5, +0x6, 0x7, 0x9, 0xa, 0xd, 0xf, 0x11,0x12,0x14,0x16,0x19,0x1c,0x1f,0x22,0x24,0x24, +0x26,0x29,0x2f,0x31,0x33,0x35,0x37,0x39,0x3a,0x3c,0x3e,0x3e,0x6, 0x10,0x17,0x1d, +0x23,0x2a,0x31,0x39,0x3c,0x36,0x2f,0x28,0x21,0x1a,0x13,0x10,0x16,0x22,0x29,0x2f, +0x36,0x3d,0x3b,0x34,0x2e,0x27,0x21,0x1a,0x13,0xc, 0x4, 0x2, 0x56,0x3f,0x31,0x55, +0x0, 0x2, 0x5, 0x7, 0xa, 0xc, 0xe, 0x14,0x17,0x1b,0x1f,0x25,0x27,0x28,0x28,0x29, +0x29,0x2d,0x30,0x33,0x36,0x39,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x8, 0xf, 0x18,0x23,0x2d,0x37,0x40,0x41,0x3d,0x34,0x2b,0x24,0x2d,0x35,0x3e,0x47, +0x4a,0x42,0x38,0x2c,0x20,0x15,0xb, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0xf6,0x5, 0x31,0x55,0x0, 0x1, 0x3, 0x5, 0x6, 0x7, 0x9, 0xa, 0xc, 0xd, 0xf, 0x13, +0x14,0x15,0x18,0x1a,0x21,0x25,0x26,0x27,0x27,0x27,0x2c,0x2f,0x36,0x3a,0x3d,0x3f, +0x3f,0x3f,0x3f,0x3f,0x0, 0x6, 0xb, 0x14,0x1a,0x1f,0x29,0x2e,0x37,0x3b,0x3e,0x37, +0x32,0x2e,0x25,0x20,0x18,0x1c,0x21,0x29,0x2d,0x31,0x33,0x2d,0x21,0x1b,0x15,0x10, +0x10,0x10,0x10,0x10,0x22,0x55,0x31,0x55,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x7, +0xc, 0x10,0x13,0x16,0x19,0x1b,0x1f,0x22,0x22,0x23,0x23,0x23,0x23,0x26,0x2c,0x31, +0x34,0x36,0x38,0x3a,0x3b,0x3d,0x3f,0x3f,0xa, 0x12,0x1b,0x24,0x2d,0x34,0x3c,0x43, +0x42,0x3b,0x33,0x2b,0x22,0x1c,0x15,0x15,0x1b,0x26,0x2d,0x34,0x3a,0x41,0x41,0x3b, +0x33,0x2b,0x22,0x1a,0x11,0xa, 0x2, 0x1, 0xfa,0x31,0x31,0x55,0x2, 0x2, 0x1, 0x1, +0x0, 0x0, 0x0, 0x6, 0xa, 0x12,0x15,0x1b,0x1d,0x1f,0x1e,0x1e,0x1d,0x1d,0x1d,0x1f, +0x23,0x2a,0x2f,0x36,0x39,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x0, 0x8, 0xe, 0x19, +0x1e,0x29,0x2e,0x30,0x2d,0x23,0x1d,0x13,0xe, 0x13,0x17,0x21,0x25,0x30,0x35,0x3e, +0x3f,0x3a,0x35,0x2b,0x27,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xc8,0x46,0x31,0x55, +0x0, 0x3, 0x5, 0xc, 0x11,0x18,0x1c,0x1f,0x1f,0x1e,0x1e,0x1d,0x1d,0x23,0x26,0x2e, +0x32,0x3b,0x3d,0x3f,0x3f,0x3f,0x40,0x40,0x3f,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d, +0x1e,0x25,0x29,0x31,0x36,0x3d,0x3f,0x39,0x35,0x2c,0x27,0x1c,0x17,0x1b,0x1f,0x2a, +0x2f,0x37,0x34,0x2b,0x27,0x1f,0x1b,0x11,0xc, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x5, 0xb3,0x31,0x55,0x1e,0x0, 0x0, 0x0, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, +0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30, +0x32,0x34,0x36,0x38,0x3a,0x3c,0x1, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x62,0x33,0x0, 0x2, 0x62,0xac, +0x0, 0x2, 0x63,0xee,0x0, 0x2, 0x63,0xec,0x0, 0x2, 0x63,0xed,0x0, 0x2, 0x63,0xe5, +0x0, 0x2, 0x63,0xe4,0x0, 0x2, 0x63,0xe1,0x0, 0x2, 0x63,0xe0,0x0, 0x2, 0x63,0xd9, +0x0, 0x2, 0x62,0x30,0x0, 0x2, 0x63,0xd8,0x0, 0x2, 0x0, 0x8, 0x0, 0x2, 0x2d,0x4d, +0x0, 0x2, 0x24,0xb2,0x0, 0x2, 0x63,0xf0,0x0, 0x2, 0x65,0x98,0x0, 0x0, 0x62,0xd0, +0x0, 0x3, 0x11,0x64,0x0, 0x3, 0x9, 0x88,0x0, 0x3, 0x9, 0x60,0x0, 0x3, 0x9, 0x88, +0x0, 0x2, 0x2d,0x4e,0x0, 0x3, 0x6, 0x5c,0x0, 0x2, 0x2d,0x4c,0x0, 0x2, 0x3e,0xfa, +0x0, 0x2, 0x38,0xa8,0x0, 0x2, 0x32,0x58,0x0, 0x2, 0x38,0xaa,0x0, 0x3, 0x5, 0xe0, +0x0, 0x2, 0x24,0x6f,0x0, 0x2, 0x74,0xcc,0x0, 0x2, 0x74,0xdf,0x0, 0x2, 0x74,0xcb, +0x0, 0x2, 0x2e,0x60,0x0, 0x3, 0x5, 0xe2,0x0, 0x3, 0x6, 0x5d,0x0, 0x2, 0x25,0x1e, +0x0, 0x2, 0x25,0x20,0x0, 0x2, 0x24,0x7e,0x0, 0x2, 0x24,0x62,0x0, 0x3, 0x6, 0xc8, +0x0, 0x2, 0x24,0xc0,0x0, 0x2, 0x24,0x67,0x0, 0x1, 0x42,0xac,0x0, 0x2, 0x24,0xc1, +0x0, 0x2, 0x25,0x1a,0x0, 0x2, 0x5f,0xa0,0x0, 0x2, 0x24,0xb4,0x0, 0x3, 0x5, 0xe4, +0x0, 0x0, 0x63,0xa2,0x0, 0x0, 0x63,0x94,0x0, 0x2, 0x24,0xc7,0x0, 0x2, 0x4b,0xbc, +0x0, 0x2, 0x4b,0xbd,0x0, 0x1, 0x42,0xd4,0x0, 0x2, 0x5e,0xb4,0x0, 0x2, 0x24,0x6a, +0x0, 0x1, 0x42,0xbc,0x0, 0x2, 0x2c,0xc6,0x0, 0x2, 0x74,0xe0,0x0, 0x2, 0xe, 0x60, +0x0, 0x2, 0xe, 0x8f,0x0, 0x1, 0x42,0xb0,0x0, 0x3, 0xa, 0xf0,0x0, 0x1, 0x42,0xdc, +0x0, 0x3, 0x9, 0xc8,0x0, 0x2, 0xe, 0x7c,0x0, 0x2, 0xe, 0x90,0x0, 0x2, 0x3e,0xfc, +0x0, 0x0, 0x62,0xc4,0x0, 0x2, 0xe, 0x58,0x0, 0x2, 0x75,0x54,0x0, 0x2, 0x2e,0x62, +0x0, 0x2, 0x24,0x83,0x0, 0x2, 0x24,0xd3,0x0, 0x3, 0xa, 0x2c,0x0, 0x2, 0x2e,0x64, +0x0, 0x2, 0x2c,0xc4,0x0, 0x2, 0xe, 0xe, 0x0, 0x2, 0xe, 0xd, 0x0, 0x2, 0xe, 0x8, +0x0, 0x2, 0xe, 0xa, 0x0, 0x2, 0xe, 0x9, 0x0, 0x2, 0xd, 0xce,0x0, 0x2, 0xd, 0xcd, +0x0, 0x2, 0xd, 0xc6,0x0, 0x2, 0xd, 0xca,0x0, 0x2, 0xd, 0xc9,0x0, 0x2, 0xd, 0xcc, +0x0, 0x2, 0xd, 0xcb,0x0, 0x2, 0xd, 0xc4,0x0, 0x2, 0xd, 0xb2,0x0, 0x2, 0xd, 0xc3, +0x0, 0x2, 0xd, 0xb1,0x0, 0x2, 0xd, 0xc5,0x0, 0x2, 0xd, 0xc8,0x0, 0x2, 0xd, 0xc7, +0x0, 0x2, 0xd, 0xc0,0x0, 0x2, 0xd, 0xbf,0x0, 0x2, 0xd, 0xbc,0x0, 0x2, 0xd, 0xbb, +0x0, 0x2, 0xd, 0xb8,0x0, 0x2, 0xd, 0xbe,0x0, 0x2, 0xd, 0xbd,0x0, 0x2, 0xd, 0xb6, +0x0, 0x2, 0xd, 0xb0,0x0, 0x2, 0xd, 0xb5,0x0, 0x2, 0xd, 0xaf,0x0, 0x2, 0xd, 0xb7, +0x0, 0x2, 0xd, 0xba,0x0, 0x2, 0xd, 0xb9,0x0, 0x2, 0xe, 0x1a,0x0, 0x2, 0xe, 0x13, +0x0, 0x2, 0xe, 0x12,0x0, 0x2, 0xe, 0x11,0x0, 0x2, 0xe, 0x10,0x0, 0x2, 0xe, 0xf, +0x0, 0x2, 0xd, 0x43,0x0, 0x2, 0xd, 0x42,0x0, 0x2, 0xd, 0x3f,0x0, 0x2, 0xd, 0x3e, +0x0, 0x2, 0xd, 0x35,0x0, 0x2, 0xd, 0x34,0x0, 0x2, 0xd, 0x39,0x0, 0x2, 0xd, 0x37, +0x0, 0x2, 0xd, 0x38,0x0, 0x2, 0xd, 0x36,0x0, 0x2, 0xd, 0x3d,0x0, 0x2, 0xd, 0x33, +0x0, 0x2, 0xd, 0x3c,0x0, 0x2, 0xd, 0x32,0x0, 0x2, 0xd, 0x28,0x0, 0x2, 0xd, 0x31, +0x0, 0x2, 0xd, 0x30,0x0, 0x2, 0xd, 0x44,0x0, 0x2, 0x0, 0x79,0x0, 0x2, 0xe, 0x19, +0x0, 0x2, 0xe, 0x18,0x0, 0x2, 0xd, 0x26,0x0, 0x2, 0xd, 0xf0,0x0, 0x2, 0xd, 0xef, +0x0, 0x2, 0xd, 0xee,0x0, 0x2, 0xd, 0x2f,0x0, 0x2, 0xd, 0x2e,0x0, 0x2, 0xe, 0x36, +0x0, 0x2, 0xe, 0x35,0x0, 0x2, 0xe, 0x3a,0x0, 0x2, 0xe, 0x39,0x0, 0x2, 0xe, 0x3c, +0x0, 0x2, 0xe, 0x3b,0x0, 0x2, 0xe, 0x38,0x0, 0x2, 0xe, 0x37,0x0, 0x2, 0xe, 0x4e, +0x0, 0x2, 0xe, 0x4d,0x0, 0x2, 0xe, 0x42,0x0, 0x2, 0xe, 0x41,0x0, 0x2, 0xe, 0x43, +0x0, 0x2, 0xe, 0x44,0x0, 0x2, 0xe, 0x3e,0x0, 0x2, 0xe, 0x3d,0x0, 0x2, 0xe, 0x40, +0x0, 0x2, 0xe, 0x3f,0x0, 0x2, 0xe, 0x34,0x0, 0x2, 0xe, 0x32,0x0, 0x2, 0xe, 0x52, +0x0, 0x2, 0xe, 0x51,0x0, 0x2, 0xe, 0x50,0x0, 0x2, 0xe, 0x4f,0x0, 0x2, 0xe, 0x54, +0x0, 0x2, 0xe, 0x53,0x0, 0x2, 0xd, 0xc2,0x0, 0x2, 0xd, 0xc1,0x0, 0x2, 0xd, 0xb4, +0x0, 0x2, 0xd, 0xb3,0x0, 0x2, 0xe, 0x1c,0x0, 0x2, 0xe, 0x2e,0x0, 0x2, 0xe, 0x2d, +0x0, 0x2, 0xe, 0x1b,0x0, 0x2, 0xe, 0x26,0x0, 0x2, 0xe, 0x2a,0x0, 0x2, 0xe, 0x25, +0x0, 0x2, 0xe, 0x29,0x0, 0x2, 0xe, 0x24,0x0, 0x2, 0xe, 0x23,0x0, 0x2, 0xe, 0x22, +0x0, 0x2, 0xe, 0x21,0x0, 0x2, 0xe, 0x20,0x0, 0x2, 0xe, 0x1f,0x0, 0x2, 0xe, 0x1e, +0x0, 0x2, 0xe, 0x1d,0x0, 0x2, 0x0, 0xc, 0x0, 0x2, 0xd, 0x27,0x0, 0x2, 0xd, 0xae, +0x0, 0x2, 0x24,0xab,0x0, 0x2, 0xe, 0x74,0x0, 0x2, 0x74,0xe4,0x0, 0x2, 0x61,0x52, +0x0, 0x2, 0x60,0x0, 0x0, 0x2, 0x5f,0xe8,0x0, 0x0, 0x63,0xb0,0x0, 0x2, 0x24,0x7d, +0x0, 0x3, 0x11,0x4c,0x0, 0x3, 0x6, 0x5e,0x0, 0x2, 0x24,0x5e,0x0, 0x0, 0x5e,0x9c, +0x0, 0x2, 0x24,0xb5,0x0, 0x2, 0x25,0x18,0x0, 0x2, 0x65,0xb0,0x0, 0x2, 0x5f,0x18, +0x0, 0x2, 0x1b,0x64,0x0, 0x2, 0x5f,0xa4,0x0, 0x2, 0x65,0xd0,0x0, 0x2, 0xf6,0x0, +0x0, 0x2, 0x24,0xcc,0x0, 0x3, 0xa, 0x38,0x0, 0x2, 0x2e,0x6c,0x0, 0x1, 0x42,0xc8, +0x0, 0x2, 0xae,0x34,0x0, 0x2, 0xa7,0xe2,0x0, 0x0, 0xf4,0xe0,0x0, 0x0, 0xf4,0xb8, +0x0, 0x2, 0xf3,0xb8,0x0, 0x2, 0xf3,0xba,0x0, 0x2, 0xed,0x68,0x0, 0x2, 0xf4,0x30, +0x0, 0x2, 0xf4,0xb8,0x0, 0x2, 0xf4,0xe0,0x0, 0x2, 0xd4,0x22,0x0, 0x2, 0xf5,0xfb, +0x0, 0x2, 0xf5,0xfa,0x0, 0x0, 0xda,0x74,0x0, 0x0, 0xdd,0x9c,0x0, 0x2, 0xf5,0x6, +0x0, 0x2, 0xcd,0xd0,0x0, 0x2, 0xc1,0x2c,0x0, 0x2, 0xe7,0x16,0x0, 0x2, 0xc7,0x7e, +0x0, 0x2, 0xf4,0xac,0x0, 0x2, 0xf4,0xb4,0x0, 0x2, 0xf5,0x12,0x0, 0x2, 0xf5,0xe, +0x0, 0x2, 0xf5,0xa, 0x0, 0x2, 0xf5,0x10,0x0, 0x2, 0xf5,0xc, 0x0, 0x2, 0xf5,0x8, +0x0, 0x0, 0xf5,0x8, 0x0, 0x0, 0xd4,0x22,0x0, 0x2, 0xae,0x36,0x0, 0x2, 0xe0,0xc4, +0x0, 0x2, 0xba,0xda,0x0, 0x2, 0xb4,0x88,0x0, 0x2, 0xa7,0xe4,0x0, 0x0, 0xae,0x36, +0x0, 0x2, 0xf4,0xb0,0x0, 0x0, 0x63,0x78,0x0, 0x2, 0x2e,0x66,0x0, 0x2, 0x24,0x6e, +0x0, 0x2, 0x5f,0x4c,0x0, 0x2, 0xe, 0x9c,0x0, 0x2, 0x24,0x86,0x0, 0x2, 0x24,0x6c, +0x0, 0x2, 0x45,0x52,0x0, 0x2, 0x3f,0x0, 0x0, 0x2, 0x2d,0x4b,0x0, 0x2, 0x24,0x61, +0x0, 0x2, 0x24,0x5d,0x0, 0x3, 0x6, 0xcc,0x0, 0x2, 0x24,0xc9,0x0, 0x1, 0x42,0xc0, +0x0, 0x1, 0x42,0xcc,0x0, 0x2, 0x5f,0xc4,0x0, 0x2, 0xf6,0x4, 0x0, 0x3, 0x11,0x68, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x24,0x85,0x0, 0x2, 0x4b,0xa4,0x0, 0x3, 0xa, 0x78, +0x0, 0x2, 0x24,0x76,0x0, 0x2, 0x24,0x71,0x0, 0x3, 0x5, 0xe6,0x0, 0x2, 0x61,0x3c, +0x0, 0x0, 0x62,0xde,0x0, 0x2, 0x24,0xb6,0x0, 0x2, 0x5f,0xe3,0x0, 0x2, 0x5f,0xe2, +0x0, 0x2, 0x5f,0xe0,0x0, 0x3, 0x6, 0x64,0x0, 0x2, 0x24,0xc6,0x0, 0x1, 0x42,0xb4, +0x0, 0x3, 0xa, 0xf4,0x0, 0x3, 0xa, 0xdc,0x0, 0x2, 0x74,0x50,0x0, 0x2, 0xe, 0x9b, +0x0, 0x2, 0xe, 0xa0,0x0, 0x0, 0x65,0x60,0x0, 0x2, 0x75,0x40,0x0, 0x2, 0x74,0xec, +0x0, 0x2, 0x2e,0x68,0x0, 0x2, 0x2e,0x70,0x0, 0x2, 0x74,0x8a,0x0, 0x2, 0x74,0x8c, +0x0, 0x3, 0xa, 0xe8,0x0, 0x2, 0xe, 0x5e,0x0, 0x2, 0x1b,0x82,0x0, 0x2, 0x24,0x89, +0x0, 0x2, 0x2e,0x6a,0x0, 0x2, 0x24,0x54,0x0, 0x0, 0xf6,0x60,0x0, 0x2, 0xf6,0x60, +0x0, 0x2, 0x24,0x7a,0x0, 0x2, 0x5f,0xc6,0x0, 0x3, 0x6, 0x65,0x0, 0x2, 0x24,0xad, +0x0, 0x2, 0x24,0x70,0x0, 0x2, 0x2d,0x4a,0x0, 0x3, 0x5, 0xf2,0x0, 0x3, 0x5, 0xec, +0x0, 0x2, 0x25,0x1c,0x0, 0x2, 0x24,0x80,0x0, 0x3, 0x6, 0x68,0x0, 0x2, 0xe, 0x64, +0x0, 0x3, 0xa, 0xf8,0x0, 0x3, 0xa, 0xf6,0x0, 0x2, 0x24,0x64,0x0, 0x2, 0xe, 0x62, +0x0, 0x2, 0x2c,0xc5,0x0, 0x2, 0x67,0x82,0x0, 0x2, 0x67,0x24,0x0, 0x2, 0x67,0x91, +0x0, 0x2, 0x67,0x8d,0x0, 0x2, 0x67,0x8e,0x0, 0x2, 0x67,0x87,0x0, 0x2, 0x67,0x8a, +0x0, 0x2, 0x67,0x8c,0x0, 0x2, 0x67,0x8b,0x0, 0x2, 0x67,0x88,0x0, 0x2, 0x67,0x85, +0x0, 0x2, 0x67,0x89,0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67,0x1c,0x0, 0x2, 0x66,0x54, +0x0, 0x2, 0x66,0xb8,0x0, 0x2, 0x67,0x8f,0x0, 0x2, 0x67,0x84,0x0, 0x2, 0x67,0x86, +0x0, 0x2, 0x67,0x81,0x0, 0x2, 0x65,0xf0,0x0, 0x2, 0x67,0x80,0x0, 0x2, 0x24,0xd2, +0x0, 0x0, 0x63,0x6a,0x0, 0x3, 0x6, 0xd6,0x0, 0x2, 0x4b,0xa8,0x0, 0x1, 0x42,0xc4, +0x0, 0x0, 0x62,0xa0,0x0, 0x2, 0x1b,0x83,0x0, 0x2, 0x24,0xc8,0x0, 0x3, 0x11,0x60, +0x0, 0x2, 0x24,0x72,0x0, 0x2, 0x24,0xb7,0x0, 0x2, 0x24,0x66,0x0, 0x2, 0x5f,0xc8, +0x0, 0x3, 0x6, 0xd8,0x0, 0x0, 0x63,0xe0,0x0, 0x3, 0xa, 0xec,0x0, 0x1, 0x42,0xa8, +0x0, 0x2, 0x5f,0x5c,0x0, 0x2, 0x4b,0xac,0x0, 0x2, 0x74,0x36,0x0, 0x2, 0x74,0x3c, +0x0, 0x2, 0x74,0x3a,0x0, 0x2, 0x74,0x38,0x0, 0x2, 0x74,0x32,0x0, 0x2, 0x6d,0xf0, +0x0, 0x2, 0x67,0xb0,0x0, 0x2, 0x74,0x30,0x0, 0x2, 0x74,0x31,0x0, 0x2, 0x74,0x34, +0x0, 0x2, 0x67,0x94,0x0, 0x2, 0x24,0x88,0x0, 0x3, 0x6, 0x5f,0x0, 0x3, 0x5, 0xe8, +0x0, 0x1, 0x42,0xb8,0x0, 0x2, 0x5f,0x9c,0x0, 0x1, 0x42,0xe4,0x0, 0x2, 0x74,0x40, +0x0, 0x3, 0x6, 0xa8,0x0, 0x2, 0x25,0x14,0x0, 0x2, 0x32,0x48,0x0, 0x2, 0x32,0x30, +0x0, 0x2, 0x4b,0xae,0x0, 0x1, 0x42,0xd8,0x0, 0x2, 0x1b,0x84,0x0, 0x2, 0x24,0xae, +0x0, 0x2, 0x24,0x5c,0x0, 0x2, 0xe, 0x70,0x0, 0x2, 0x24,0x84,0x0, 0x2, 0x4b,0xc0, +0x0, 0x0, 0x62,0xb8,0x0, 0x2, 0xe, 0x5d,0x0, 0x2, 0x4b,0xb0,0x0, 0x0, 0x63,0xc8, +0x0, 0x2, 0x4b,0xb4,0x0, 0x2, 0x24,0x82,0x0, 0x2, 0x2c,0xf0,0x0, 0x2, 0x24,0x74, +0x0, 0x2, 0x24,0xac,0x0, 0x2, 0xe, 0x5c,0x0, 0x2, 0x4b,0xb8,0x0, 0x3, 0x6, 0x61, +0x0, 0x2, 0x5f,0xcc,0x0, 0x2, 0x24,0x7c,0x0, 0x2, 0x5f,0x7, 0x0, 0x2, 0x5f,0x6, +0x0, 0x2, 0x5f,0x5, 0x0, 0x2, 0x5f,0x4, 0x0, 0x2, 0x5f,0x3, 0x0, 0x2, 0x5f,0x2, +0x0, 0x2, 0x5f,0x1, 0x0, 0x2, 0x5f,0x0, 0x0, 0x2, 0x5e,0xff,0x0, 0x2, 0x5e,0xfe, +0x0, 0x2, 0x5e,0xfd,0x0, 0x2, 0x5e,0xfc,0x0, 0x2, 0x5e,0xfa,0x0, 0x2, 0x5e,0xec, +0x0, 0x2, 0x24,0x78,0x0, 0x2, 0x74,0xc8,0x0, 0x2, 0x5f,0xdf,0x0, 0x2, 0x5f,0xd0, +0x0, 0x1, 0x42,0xe8,0x0, 0x2, 0x5b,0x8e,0x0, 0x2, 0x58,0x68,0x0, 0x0, 0x1, 0x0, +0x0, 0x2, 0x25,0x16,0x0, 0x2, 0x24,0x87,0x0, 0x2, 0x24,0xca,0x0, 0x1, 0x42,0xe0, +0x0, 0x2, 0x0, 0x4, 0x0, 0x3, 0x6, 0xf6,0x0, 0x3, 0x6, 0xf5,0x0, 0x3, 0x6, 0xe6, +0x0, 0x3, 0x6, 0xe4,0x0, 0x2, 0x52,0x14,0x0, 0x1, 0x42,0xd0,0x0, 0x2, 0x24,0x1, +0x0, 0x2, 0x24,0x60,0x0, 0x0, 0x63,0x86,0x0, 0x2, 0x5f,0xce,0x0, 0x2, 0x75,0x48, +0x0, 0x2, 0xe, 0x8e,0x0, 0x2, 0x24,0x68,0x0, 0x3, 0x9, 0x5d,0xf, 0xff,0xff,0xff, +0xf0,0xff,0xff,0xff,0xff,0xc0,0xff,0xff,0x55,0x50,0x47,0x52,0x41,0x44,0x45,0x20, +0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0xa0,0x0, 0x3, 0xff,0x8, 0x0, 0x0, 0x8, +0x0, 0x82,0x52,0x1, 0x6, 0xc3,0x14,0x5, 0x8, 0x5, 0x8, 0x5, 0x6, 0xc3,0x18,0x6, +0x8, 0x6, 0x8, 0x6, 0x3, 0x28,0x0, 0xfa,0x3, 0x28,0x1, 0x2c,0xfc,0x0, 0xff,0xff, +0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0xf8,0x0, 0xff,0xff,0x9f,0xff,0xff,0xff, +0xe7,0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0xfe,0x7f,0xff,0xff,0xff,0x9f,0xff,0xff, +0xff,0xe7,0xff,0xff,0x80,0x1, 0x10,0x20,0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff, +0x0, 0x19,0x66,0xd, 0x3c,0x6e,0xf3,0x5f,0x7f,0xff,0xff,0xff, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT8006m/include/firmware/white_all.i b/drivers/input/touchscreen/FT8006m/include/firmware/white_all.i new file mode 100644 index 0000000000000..cc3688aa98db6 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/include/firmware/white_all.i @@ -0,0 +1,7029 @@ +0x10,0x71,0x4, 0x3e,0x16,0xd9,0x0, 0x9d,0xbf,0x10,0x84,0x0, 0x0, 0x2, 0xc8,0x0, +0x84,0x80,0x0, 0x26,0x5a,0x51,0xb5,0x2a,0x6c,0xc5,0x4a,0x1, 0x60,0xe1,0xf, 0xc1, +0x10,0xc, 0x30,0x4b,0x0, 0x0, 0x42,0xa, 0xe3,0x29,0x99,0xf0,0xb9,0xe1,0x6b,0x68, +0x5f,0x81,0x26,0x0, 0xa1,0x80,0x8, 0x20,0x6, 0x0, 0x85,0x0, 0x0, 0x2c,0xb8,0x71, +0x3, 0x0, 0x8, 0x10,0x1b,0x27,0x35,0x38,0x6a,0x2d,0x72,0xbb,0x7b,0x94,0x62,0x5c, +0x4a,0x38,0x25,0x15,0x6, 0x0, 0x8, 0x10,0x1b,0x27,0x35,0x38,0x6a,0x2d,0x72,0xbb, +0x7b,0x94,0x62,0x5c,0x4a,0x38,0x25,0x15,0x0, 0x0, 0x85,0x80,0x0, 0x12,0x0, 0x0, +0x20,0x44,0x8, 0x0, 0x60,0x47,0x0, 0x0, 0x10,0x22,0x4, 0x0, 0xb0,0x23,0x15,0x0, +0x86,0x0, 0x0, 0x30,0xfa,0x68,0x68,0x1, 0x2d,0x6e,0x10,0x4, 0x0, 0x60,0x15,0x0, +0x50,0x15,0x56,0x51,0x15,0x55,0x61,0x15,0x0, 0x60,0x15,0x0, 0x50,0x15,0x56,0x51, +0x15,0x55,0x61,0x95,0xab,0x18,0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x80,0x4c,0x29,0x84, +0x52,0x1, 0x9, 0x0, 0x86,0x80,0x0, 0xe, 0xf0,0xb1,0x71,0xef,0x49,0xc0,0x80,0x1a, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87,0x0, 0x0, 0xc, 0xff,0x81,0x68,0xac,0xb4,0x6d, +0x24,0x0, 0x0, 0x0, 0x0, 0x0, 0x87,0x80,0x0, 0x17,0x19,0xc6,0x3e,0x20,0x1c,0x58, +0x64,0x10,0x53,0x33,0xe8,0x50,0x1, 0x32,0x8c,0x8c,0x24,0x69,0x81,0x71,0x44,0x7c, +0x14,0x88,0x0, 0x0, 0x1f,0x0, 0x80,0x3, 0xe7,0x1f,0x17,0x0, 0x48,0x40,0x2, 0xcf, +0x18,0x30,0x88,0x41,0x8a,0x39,0x28,0xa9,0xc5,0x9a,0x7b,0xf0,0x7, 0x7e,0xe0,0x7, +0x7e,0x20,0x10,0x0, 0x88,0x80,0x0, 0x79,0x43,0x77,0x3, 0x40,0x8a,0xf1,0xff,0x43, +0x30,0x8, 0xc1,0x46,0xa0,0x80,0x24,0x18,0x30,0x6, 0x64,0xc1,0x80,0x11,0x7, 0xc4, +0xe1,0xd0,0x68,0x40,0x20,0x1d,0x4, 0x48,0x40,0x40,0x28,0x10,0x60,0x70,0x38,0x1a, +0x10,0x47,0x3, 0xe2,0x20,0x0, 0x10,0x80,0x50,0x30,0x0, 0xe0,0xe1,0x1, 0x0, 0x28, +0xe, 0x6, 0xc3,0xcc,0xcc,0xcc,0xcc,0xcc,0x8c,0x88,0x88,0x88,0x88,0x88,0xc8,0x8, +0x86,0xc6,0xe3,0x81,0x0, 0x20,0x0, 0x21,0x42,0x88,0x0, 0x0, 0x0, 0x0, 0x40,0x0, +0x0, 0x31,0x4, 0x41,0x6, 0x0, 0x0, 0x0, 0x0, 0x92,0x4, 0x0, 0x92,0x4, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x85,0x11,0xc, 0x0, 0x0, 0x40,0x0, 0x0, 0x0, 0x0, 0x5e, +0x0, 0x89,0x0, 0x0, 0x19,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89,0x80, +0x0, 0x13,0x1, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7, 0x1, 0x5, 0x44,0xc, +0xce,0xe7,0x62,0xe, 0x0, 0x8a,0x0, 0x0, 0x80,0x91,0x1, 0x88,0xa6,0xe8,0xef,0xf7, +0xfb,0xfd,0x7e,0x0, 0x0, 0x0, 0x68,0xc5,0x7, 0xe8,0x3c,0x20,0x36,0x40,0xe7,0x1, +0x71,0x1, 0x3a,0xf, 0x88,0x9, 0xd0,0x79,0x80,0x39,0xbc,0xdf,0x8, 0xcc,0x20,0x83, +0x46,0x0, 0x18,0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1c,0xad,0xd1,0x2a,0x0, 0x40,0xa1,0x50,0x78,0x7, 0xa0,0xf3,0x80,0x73, +0x0, 0x6f,0x0, 0x74,0x1e,0x70,0xe, 0xe0,0x5, 0x80,0xce,0x3, 0xce,0x1, 0xbc,0x2, +0xd0,0x79,0xc0,0x39,0x80,0x77,0x1, 0x3a,0xf, 0x38,0x7, 0xf0,0x26,0x40,0xe7,0x1, +0xe7,0x0, 0xde,0x3, 0xe8,0x3c,0xe0,0x1c,0xc0,0x5b,0x0, 0x9d,0x7, 0x9c,0x3, 0x0, +0x1, 0xbf,0x1f,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a,0x80,0x0, 0x80,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, +0x6a,0xc4,0xa8,0xd5,0x96,0xa2,0xe0,0x1f,0x31,0x6a,0xb5,0xa5,0x28,0x78,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x13,0x0, 0xf0,0x0, 0x94,0xd6,0xc, 0x2d,0x49,0x30,0x14, +0xc7,0x4, 0xd5,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x4d,0x15,0xa2,0x18,0x84, +0x0, 0x4c,0x30,0x6c,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xd6,0xc, 0x29,0x8, 0x20, +0x10,0xc6,0x4, 0xd5,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x4d,0x55,0xb2,0x1c, +0xc5,0x10,0x4c,0x30,0x6c,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x5b,0x10,0x8b,0x0, 0x0, +0x16,0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xd0,0x40,0x8c,0x0, 0x0, 0x3f,0xef,0xbd,0xf7,0xde,0x7b, +0xef,0xbd,0x7, 0x8, 0x8, 0xa, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0x5c,0x9, +0xa8,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x5a,0x59,0x59,0x59,0x59,0x59, +0x59,0x59,0x59,0x59,0x59,0x59,0x9, 0x4, 0xff,0x5, 0x80,0x80,0x0, 0x4, 0x20,0x0, +0x1, 0x8, 0x40,0x0, 0x2, 0x10,0x80,0x0, 0x4, 0xf, 0x8c,0x80,0x0, 0x27,0xea,0xd3, +0xc6,0xb8,0xaf,0xa6,0x9e,0x98,0x92,0x8e,0x8a,0x85,0x0, 0x60,0xf6,0xcf,0xfc,0x6f, +0xf6,0xef,0xcf,0xaf,0xf, 0xff,0xaf,0xb5,0x71,0xe, 0x6c,0x4a,0x69,0x8, 0x0, 0x0, +0x44,0x0, 0x0, 0x0, 0x0, 0x8d,0x0, 0x0, 0x80,0x0, 0x4, 0x8, 0xc, 0x50,0x10,0x14, +0x18,0x1c,0xa5,0x20,0x28,0x30,0x39,0x3e,0x41,0x49,0x51,0x59,0x54,0x61,0x69,0x71, +0x79,0xaa,0x81,0x89,0x91,0x99,0x5a,0xa1,0xa9,0xb1,0xb9,0x1, 0xc0,0xc8,0xd0,0xd8, +0x6f,0xe0,0xe7,0xef,0xf7,0x5c,0xfb,0xfd,0xfe,0x0, 0x0, 0x4, 0x7, 0xb, 0xf0,0xf, +0x13,0x17,0x1b,0x6b,0x1f,0x27,0x2f,0x36,0xc1,0x3e,0x46,0x4e,0x56,0x1a,0x5e,0x65, +0x6d,0x75,0xac,0x7d,0x85,0x8d,0x95,0x16,0x9d,0xa4,0xac,0xb4,0xbc,0xbc,0xc4,0xcc, +0xd4,0x5a,0xdc,0xe4,0xec,0xf3,0xc1,0xf7,0xf9,0xfa,0x3f,0x0, 0x4, 0x8, 0xc, 0x0, +0x10,0x14,0x18,0x1c,0x55,0x20,0x28,0x30,0x38,0x55,0x40,0x48,0x50,0x58,0x55,0x60, +0x68,0x70,0x78,0x1, 0x7f,0x87,0x8f,0x97,0xaf,0x8d,0x80,0x0, 0x14,0x9f,0xa7,0xaf, +0xb7,0x55,0xbf,0xc7,0xcf,0xd7,0x0, 0xdf,0xe7,0xef,0xf7,0xe5,0xfb,0xfe,0xff,0x3, +0x0, 0x90,0x0, 0x0, 0x7, 0x8b,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x91,0x0, 0x0, 0xd, +0x2d,0xd3,0x0, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x1f,0x0, 0x91,0x80,0x0, +0x19,0x1, 0x5, 0x0, 0x5, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1, 0xff,0xf, 0x0, 0x0, 0x2c,0x1, 0x0, 0x0, 0x0, 0x92,0x0, 0x0, 0x10,0x0, 0x3, +0x0, 0x9d,0xbf,0x10,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd9,0x16,0xb, 0xf4, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x31,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0x0, 0x0, 0x60,0x0, 0x1, 0x79,0x84,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0xe0,0x60,0x3c,0x0, 0xcc,0x2, 0xe0,0x60,0x3c,0x10,0xea,0x0, 0xc8,0x3, 0xe0,0xff, +0xc8,0x7c,0xfa,0x0, 0xcf,0x82,0xf0,0x0, 0xcf,0x80,0xea,0x0, 0xcc,0x0, 0xe0,0x0, +0xcc,0x0, 0xe0,0x60,0x3c,0x17,0xea,0x0, 0xcc,0x2, 0xe0,0x0, 0xcc,0x0, 0xea,0x0, +0xcc,0x80,0xe0,0x32,0xcc,0xe8,0x3c,0x79,0x1, 0x8, 0xea,0x0, 0xcd,0x2, 0xe0,0x1, +0xcd,0x34,0x3d,0x28,0xe0,0x0, 0xdb,0xe2,0xea,0x0, 0xcc,0x0, 0xe0,0x2e,0xcc,0x60, +0x3c,0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x56,0x31,0x2e,0x34,0x30,0x53,0x65,0x70,0x20,0x20,0x31,0x20,0x32,0x30,0x31,0x37, +0x46,0x54,0x38,0x30,0x30,0x36,0x5f,0x42,0x4f,0x4f,0x54,0x4c,0x4f,0x41,0x44,0x45, +0x26,0x40,0xd9,0xbf,0x38,0xce,0xc7,0x31,0xd5,0xbe,0x2a,0x41,0xff,0x0, 0xff,0x0, +0x0, 0x0, 0x0, 0x0, 0xff,0xff,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80,0xb6, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x31,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xe8,0x2, 0x4f,0xa1,0xe2,0x0, 0xcf,0xe6,0x1, 0x35,0x2, 0x88,0xe2,0x0, 0xcf,0x83, +0x1, 0x2b,0xe2,0x0, 0xcf,0x85,0x1, 0x14,0x0, 0xbd,0xe2,0x1, 0xcf,0x90,0x1, 0x8, +0xe2,0x1, 0xcf,0xcc,0x1, 0x27,0xe2,0x0, 0xcf,0xea,0x1, 0xb4,0x0, 0xa6,0xe2,0x0, +0xcc,0x1, 0x2, 0xb0,0xea,0x0, 0x7f,0xd0,0x3c,0x1f,0x8c,0x8, 0x38,0x82,0x2c,0x4, +0xe8,0x0, 0x64,0x46,0x0, 0xa4,0xe2,0x0, 0xcc,0x1, 0x1, 0x86,0xe8,0x0, 0x67,0xc6, +0xe0,0x8, 0x37,0xc8,0x0, 0x9c,0xe2,0x0, 0xcc,0x2, 0x1, 0x9c,0xe8,0x0, 0x67,0xc6, +0xe4,0x8, 0x37,0xc0,0x0, 0x94,0xe8,0x2, 0x67,0xca,0x3c,0x1f,0xe0,0x1, 0x8c,0x8, +0x38,0x82,0xe8,0x2, 0x4c,0x38,0x38,0x82,0x2c,0x5, 0xe8,0x1, 0x5c,0xe, 0x34,0x48, +0x38,0x82,0xe2,0x0, 0xcc,0x1, 0x1, 0x86,0xe8,0x1, 0x5c,0xe, 0xe2,0x1, 0xc4,0x7f, +0x38,0x82,0xe0,0x1, 0x14,0x6b,0x38,0x82,0x17,0x0, 0xe8,0x2, 0x6f,0x23,0xe8,0x2, +0x4f,0xa1,0xe2,0x0, 0xcf,0xe4,0xe0,0x2, 0x1, 0x2, 0x2, 0xa6,0xe2,0x0, 0xcf,0x87, +0xe0,0x1, 0x1, 0x5a,0x2, 0x8f,0xe2,0x0, 0xcf,0x83,0xe0,0x1, 0x1, 0x27,0xe2,0x0, +0xcf,0x85,0xe0,0x1, 0x1, 0x70,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1, 0xa3,0xe0,0x1, +0x0, 0xea,0xe2,0x0, 0xcf,0x90,0xe0,0x1, 0x1, 0x63,0x2, 0x86,0xe2,0x0, 0xcf,0x89, +0xe0,0x1, 0x1, 0x52,0x38,0x82,0xe2,0x0, 0xcf,0xd5,0x1, 0x25,0xe2,0x0, 0xcf,0xe1, +0xe0,0x2, 0x1, 0x8, 0x38,0x82,0xe2,0x1, 0xcf,0x90,0x1, 0x20,0x2, 0x8c,0xe2,0x0, +0xcf,0xe6,0xe0,0x1, 0x1, 0x50,0xe0,0x1, 0x4, 0xd8,0xe2,0x0, 0xcf,0xea,0xe0,0x1, +0x1, 0x4a,0x38,0x82,0xe2,0x1, 0xcf,0xb0,0x1, 0x1f,0x2, 0x85,0xe2,0x1, 0xcf,0xaa, +0x1, 0xa, 0x38,0x82,0xe2,0x1, 0xcf,0xbf,0x1, 0x32,0xe2,0x1, 0xcf,0xcc,0xe0,0x1, +0x1, 0x3a,0x38,0x82,0xe8,0x2, 0x6f,0x38,0x38,0x82,0xe2,0x0, 0xcc,0x3, 0xe0,0x1, +0x2, 0xe9,0xe0,0x0, 0x1f,0x93,0xe8,0x2, 0x6f,0x38,0x3f,0x98,0xac,0x8f,0xe0,0x1, +0x24,0x2a,0xe0,0x1, 0x0, 0xdf,0xe2,0x0, 0xcc,0x3, 0xe0,0x1, 0x2, 0xdb,0xea,0x6, +0x7f,0x8e,0xe9,0xff,0xc7,0xfe,0x3c,0x1f,0x8c,0x8, 0x3c,0x1f,0x3c,0x2, 0x4, 0x4, +0xa, 0x18,0xe4,0x9, 0x34,0xa0,0x0, 0x85,0xe8,0x0, 0x67,0xc5,0x34,0xa8,0x3c,0x9f, +0xe8,0x0, 0x7c,0xc5,0x38,0x82,0xe8,0x0, 0x67,0xc5,0x0, 0xfa,0xe2,0x0, 0xcc,0x5, +0x2, 0xa3,0xea,0x6, 0x7f,0xc4,0xe9,0xff,0xc7,0xfe,0x34,0x21,0x3c,0x1f,0x9c,0x8, +0x3c,0x1f,0x3c,0x2, 0x1, 0x6c,0x0, 0x78,0x0, 0x98,0x0, 0xc, 0x0, 0x18,0x0, 0x22, +0xe8,0x2, 0x67,0x4a,0xa7,0x8e,0x3c,0x9f,0xbc,0x8e,0x38,0x82,0x34,0xa8,0xe8,0x2, +0x67,0xca,0xe0,0x1, 0x0, 0x96,0xe8,0x2, 0x67,0xca,0x9f,0x2f,0x3c,0x9e,0xb4,0xaf, +0x17,0x0, 0xb7,0x3f,0x38,0x82,0xe8,0x2, 0x67,0xca,0x16,0x81,0x9f,0x3f,0x3e,0x9e, +0xb6,0xbf,0x3f,0x1f,0xe0,0x1, 0xac,0x8e,0x9e,0xbf,0x9f,0x2f,0x3e,0xfe,0xe0,0x1, +0x4, 0x91,0xe8,0xa, 0x4e,0xa6,0x17,0x0, 0xe0,0x2e,0x3e,0x8e,0xe8,0x2, 0x7f,0xc6, +0x17,0x82,0xe8,0xa, 0x6f,0x26,0x0, 0xac,0xe2,0x0, 0xcc,0x2, 0x1, 0x18,0xe2,0x0, +0xcc,0x3, 0x1, 0x1b,0xe2,0x0, 0xcc,0x1, 0xe0,0x0, 0x1, 0xfc,0xe8,0xa, 0x4f,0xa6, +0x27,0x84,0xe0,0x0, 0x1f,0x8f,0x0, 0x83,0xe0,0x0, 0x1f,0x8e,0xe8,0x2, 0x7f,0xca, +0xe4,0x9, 0x34,0xa0,0xe8,0x2, 0x67,0xca,0xe0,0x0, 0x0, 0xd8,0xe8,0x2, 0x67,0x4a, +0x34,0xa8,0xa7,0x8e,0xe7,0xff,0x0, 0xb9,0xe8,0x2, 0x67,0xca,0xa7,0xf, 0x3c,0x9e, +0xbc,0x8f,0x17,0x1, 0xe8,0x2, 0x7f,0xc6,0x17,0x81,0xe8,0x2, 0x6f,0x23,0xe8,0x0, +0x7f,0xc2,0x38,0x82,0xe8,0x0, 0x67,0x9f,0x17,0x0, 0xe0,0x3, 0xb7,0x1f,0x17,0x80, +0xe0,0x2, 0x17,0x4, 0xbf,0x8e,0xe0,0x2, 0x17,0x8, 0xbf,0x8e,0x17,0x81,0xe8,0x2, +0x6f,0xa0,0x38,0x82,0xe2,0x0, 0xcc,0x1, 0x1, 0x84,0xe8,0x0, 0x6c,0xd3,0x38,0x82, +0xe2,0x0, 0xcc,0x2, 0x1, 0xbe,0xe8,0x2, 0x6c,0x9f,0x38,0x82,0xe8,0x2, 0x6c,0x9e, +0x38,0x82,0x17,0x1, 0xe8,0x2, 0x6f,0x23,0x38,0x82,0xe8,0x2, 0x6f,0x38,0x17,0x80, +0xe8,0x0, 0x7f,0xc4,0x38,0x82,0xc4,0x7f,0xe2,0x0, 0xcc,0x4, 0x2, 0xaa,0xea,0x8, +0x7f,0xf2,0xe9,0xff,0xc7,0xfe,0x3c,0x1f,0x8c,0x8, 0x3c,0x1f,0xe8,0x2, 0x67,0xca, +0x3c,0x2, 0x6, 0xc, 0x12,0x1a,0x20,0x0, 0xe4,0x9, 0x34,0xa0,0x0, 0x86,0xa7,0xf, +0x34,0xa8,0x0, 0x82,0xa7,0xf, 0x3c,0x9e,0xbc,0x8f,0x38,0x82,0x34,0xa8,0xb4,0xaf, +0x38,0x82,0x9f,0x2f,0x3c,0x9e,0xb4,0xaf,0x17,0x3, 0xe8,0x0, 0x7f,0x42,0x38,0x82, +0x17,0x84,0xe8,0x0, 0x7f,0xc2,0xe8,0x2, 0x6f,0x38,0x17,0x0, 0xe8,0x0, 0x7f,0x44, +0x38,0x82,0x8, 0xb2,0xe8,0x0, 0xc, 0x37,0xf8,0x0, 0xf, 0xbf,0x17,0x81,0xe8,0x0, +0x61,0x1c,0xe8,0x0, 0x6f,0xd4,0xa7,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x99,0xa7,0x2, +0x17,0xfe,0x3f,0xde,0xbf,0x82,0x8c,0xf2,0xe8,0x2, 0x4f,0xa2,0x2f,0x83,0xe8,0x2, +0x6c,0xa1,0xe8,0x2, 0x4c,0x22,0xde,0xa9,0xe8,0x2, 0x4f,0xa2,0xc7,0x81,0xe8,0x2, +0x6f,0xa2,0xe8,0x2, 0x4f,0xa3,0x27,0x84,0x14,0x0, 0xde,0x53,0xac,0x72,0xa7,0x82, +0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x8e,0xa7,0x2, 0x17,0xfd,0x3f,0xde,0xbf,0x82, +0xe8,0x2, 0x4f,0xa2,0xc7,0x81,0xe8,0x2, 0x6f,0xa2,0xe8,0x2, 0x4c,0x22,0xde,0x41, +0xac,0x72,0x17,0x88,0xe0,0x61,0x3f,0x91,0xf8,0x0, 0xf, 0xaf,0xf0,0x0, 0xb, 0xa8, +0x9, 0x21,0x38,0x0, 0xe, 0xbf,0xe8,0x0, 0x67,0x1c,0x17,0xfe,0xa6,0xbe,0x3f,0xdd, +0xbf,0xbe,0x17,0x80,0xe8,0x2, 0x6f,0xa2,0x17,0x90,0xe0,0x61,0x3f,0x91,0xf, 0xad, +0x38,0x0, 0x8, 0xb6,0xe1,0xff,0xc0,0x0, 0xe8,0x0, 0x67,0xc4,0x39,0xe8,0x3f,0x99, +0x39,0x69,0x3b,0x6a,0xe8,0x0, 0x7f,0xc4,0x21,0x27,0xe2,0x0, 0xc9,0x7f,0x2, 0x85, +0x3a,0xe2,0xe2,0x1, 0xc2,0xff,0x0, 0x83,0xe0,0x1, 0x12,0x80,0x3a,0x65,0xe2,0x1, +0xc2,0x7f,0x3c,0x63,0x3d,0x64,0xe2,0x0, 0x7c,0x84,0xd7,0xb0,0x39,0x24,0x8f,0x86, +0xe3,0xff,0xc1,0x7f,0x39,0x95,0xe2,0x0, 0x7e,0x84,0x17,0x0, 0xc7,0x1, 0xe1,0x80, +0x8e,0x1d,0xe3,0xff,0xc7,0x7f,0x3a,0x7e,0xe2,0xf, 0x3e,0x4f,0xe2,0x1, 0xc7,0xff, +0x2, 0xf6,0xaf,0x86,0x0, 0xda,0xe0,0x1, 0xc0,0x0, 0xb, 0x61,0xe8,0x0, 0x4f,0xd3, +0xe2,0x0, 0xcf,0x8b,0xe0,0x0, 0x1, 0xd1,0x8, 0xb6,0xe2,0x9f,0xcc,0x7f,0x3a,0xe8, +0xe0,0x0, 0x5, 0xca,0xe8,0x0, 0x67,0x45,0xe2,0xf0,0x17,0x80,0x3f,0x7f,0xe0,0x0, +0x2, 0xc3,0xe8,0x0, 0x67,0xc4,0x3b,0x69,0x39,0xea,0x2f,0x83,0xe8,0x2, 0x6f,0x84, +0xe8,0x0, 0x67,0xc4,0xe8,0x2, 0x4a,0x4, 0x3f,0x93,0xe2,0x0, 0xca,0x3, 0xe8,0x0, +0x7f,0xc4,0x2, 0x9a,0x17,0x84,0xe0,0x2, 0x3f,0xa4,0xe2,0x1, 0xc1,0x7f,0x39,0xf2, +0x3, 0x84,0x39,0x63,0xe2,0x1, 0xc1,0x7f,0xea,0x2, 0x7c,0x0, 0x3c,0xe6,0x3c,0x14, +0x3d,0x62,0x3a,0x12,0x39,0xa2,0xe0,0x0, 0xd9,0x21,0x3a,0x92,0xe8,0x2, 0x6a,0x4, +0x3b,0x12,0xe3,0xff,0xc1,0xff,0x21,0x85,0x3d,0x63,0x3c,0xe6,0x3c,0x65,0xd6,0xf7, +0xe8,0x0, 0x67,0x44,0xe8,0x0, 0x67,0xc5,0x3f,0x7f,0x1, 0x8d,0x15,0x4, 0xea,0x2, +0x7c,0x80,0xe0,0xa0,0x14,0x0, 0xd6,0xeb,0x17,0x80,0xe8,0x0, 0x7f,0xc4,0xb, 0x21, +0xe0,0x9, 0x0, 0x9f,0xb, 0x61,0x38,0x82,0x8, 0xb1,0xe8,0x0, 0x67,0xc2,0xc7,0xff, +0xe2,0x0, 0xcf,0x83,0xe0,0x0, 0x2, 0xe4,0xea,0xd, 0x7f,0xe, 0xe9,0xff,0xc7,0x7e, +0x3f,0x9e,0x8f,0x8f,0x3f,0x9e,0x17,0x0, 0xe8,0x0, 0x7f,0x42,0x3f,0x82,0x4c,0x4, +0x70,0x8e,0xe8,0x1, 0x77,0xe, 0xe8,0x0, 0x4f,0xd3,0xe8,0x2, 0x64,0xc6,0xe2,0x0, +0xcf,0x8b,0x1, 0x86,0xa4,0x9, 0x9d,0x29,0xc4,0x88,0xdf,0x89,0x0, 0x8b,0xa7,0x89, +0x9f,0x29,0x3f,0x9e,0xe2,0x20,0xcf,0x80,0x2, 0x85,0xa4,0x9, 0x9d,0x29,0xc4,0x88, +0xd6,0xb6,0xe8,0x2, 0x67,0xc6,0xa4,0xf, 0x9c,0xaf,0xe0,0x0, 0xd8,0xa9,0xe0,0x20, +0xc4,0x0, 0xe8,0x1, 0x74,0xe, 0xd5,0x23,0x0, 0xb2,0xe8,0x2, 0x64,0xc6,0xe0,0x2, +0x15,0x0, 0xe1,0x80,0xa4,0x29,0xd7,0x2, 0xe8,0x0, 0x4f,0xd4,0x27,0xa8,0xe8,0x2, +0x67,0x46,0xe8,0x0, 0x67,0x9c,0xe0,0x1, 0x87,0xe, 0xaf,0x7f,0x0, 0xa0,0xe8,0x2, +0x67,0xc6,0xe8,0x1, 0x77,0xe, 0xea,0x2, 0x7d,0x38,0xa4,0xf, 0x9c,0xaf,0xdf,0x22, +0xd5,0x6, 0xe7,0xe0,0x17,0x55,0xe8,0x1, 0x77,0xe, 0x0, 0x91,0xe8,0x1, 0x77,0xe, +0xe8,0x0, 0x4f,0xd3,0xe2,0x0, 0xcf,0x8b,0x1, 0x83,0xd3,0x49,0x0, 0x83,0x14,0x0, +0xd6,0xbb,0xd4,0xf5,0xe7,0xe1,0x17,0xaa,0xe8,0x1, 0x77,0x8e,0xe8,0x2, 0x4f,0xa0, +0x27,0x89,0xe0,0x27,0x14,0x8, 0xd4,0xdc,0xe8,0x0, 0x67,0x9f,0x17,0x7f,0xe0,0x7, +0xaf,0x3f,0x8, 0xe1,0xe0,0x0, 0x1f,0x83,0xe0,0x2, 0x8f,0xf, 0xe0,0x2, 0x8e,0x9f, +0x3e,0x9e,0xe2,0x1, 0xce,0xff,0x1, 0x84,0xe2,0x0, 0xcf,0x4, 0x5, 0x8e,0xe0,0x0, +0x1f,0x88,0xe0,0x2, 0x8f,0xf, 0xe0,0x2, 0x8e,0x9f,0x3e,0x9e,0xe2,0x1, 0xce,0xff, +0x1, 0x9c,0xe2,0x0, 0xcf,0x4, 0x2, 0x99,0xe0,0x2, 0x8e,0x2f,0xe0,0x2, 0x8e,0xbf, +0x3e,0x9c,0xe2,0x1, 0xce,0xff,0x1, 0x91,0xe0,0x2, 0x8e,0xcf,0xe0,0x2, 0x8f,0xdf, +0x3f,0x9d,0xe2,0x1, 0xcf,0xff,0x1, 0x89,0xe8,0x2, 0x6f,0x26,0x14,0x1, 0xe8,0x2, +0x6e,0x25,0xe8,0x2, 0x6e,0xa4,0x38,0x82,0x14,0x0, 0x38,0x82,0xc0,0x78,0xe8,0x0, +0x66,0xa0,0xe0,0x0, 0x17,0x50,0xa7,0x9d,0x16,0x4, 0xcf,0x90,0xbf,0x9d,0x3e,0x10, +0xe8,0x0, 0x67,0x99,0xe1,0x2, 0x15,0x5, 0xb7,0x5f,0x8d,0xff,0xb7,0x5f,0xe0,0x0, +0x17,0x5a,0xaf,0x3f,0xe0,0x0, 0x17,0x51,0xb7,0x5f,0x17,0x2, 0xaf,0x3f,0xe1,0x2, +0x17,0x0, 0xb7,0x5f,0xc7,0x1, 0x8c,0xff,0xe3,0xff,0xc7,0x7f,0x3f,0x7a,0xe1,0x80, +0xac,0x9c,0x1, 0xf8,0xe2,0x0, 0xcd,0xda,0x1, 0x6, 0xe0,0x0, 0x17,0x50,0xb7,0x5f, +0x17,0x0, 0xaf,0x3f,0x17,0xef,0xa7,0x1d,0x3f,0xde,0xbf,0x9d,0xe2,0x0, 0x7f,0x88, +0x3c,0x1f,0xe0,0x40,0x8c,0x48,0xc0,0x8, 0x38,0x82,0x16,0x80,0xe8,0x0, 0x67,0x9f, +0xae,0x88,0xe0,0x1, 0xa7,0xff,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0x93,0xe8,0x0, +0x67,0xa0,0xe0,0x0, 0x16,0xd4,0xa7,0x1f,0xcf,0x10,0xbf,0x1f,0xe8,0x0, 0x67,0x19, +0xb6,0xde,0x8f,0x7e,0xe2,0x0, 0xc7,0x3, 0xaf,0x8, 0x17,0x6f,0xa6,0x9f,0x3f,0x5d, +0xbf,0x1f,0x38,0x82,0x8, 0xb5,0xc0,0x7c,0xdf,0x76,0x2c,0x4, 0x12,0x82,0x14,0x0, +0x0, 0x90,0xe8,0x2, 0x4c,0x26,0xdf,0xa3,0xe8,0x2, 0x6c,0x27,0xe8,0x2, 0x4f,0x27, +0xe8,0x2, 0x4f,0xa4,0x3f,0x7f,0x1, 0xf3,0xe0,0xf, 0x12,0xc2,0xe0,0xf, 0x14,0x40, +0x15,0x4, 0xe2,0x0, 0x7c,0x84,0xd6,0x2a,0x49,0x6, 0x4f,0x87,0x31,0x28,0x39,0x1f, +0xe3,0xff,0xc1,0x7f,0x17,0xf8,0x3f,0x92,0xe2,0x1e,0xcf,0xf7,0x2, 0xa3,0xc1,0x7e, +0xe3,0xff,0xc1,0x7f,0xe0,0x0, 0x1c,0x8d,0x3c,0x65,0x3d,0x62,0x4a,0x4, 0x49,0x85, +0xe8,0x1, 0x71,0x16,0xd6,0x13,0xe0,0x0, 0x1c,0xc, 0x32,0x28,0x34,0x41,0x15,0x0, +0xe0,0x9, 0x31,0x41,0xe3,0xff,0xc4,0x7f,0x39,0x94,0xe0,0xb, 0xd7,0xeb,0xe3,0xff, +0xc1,0xff,0x39,0xf8,0xe0,0x0, 0x1a,0x8d,0x1, 0x7, 0x14,0x0, 0xbc,0x5, 0xbc,0x15, +0x0, 0x84,0x14,0x0, 0x0, 0x82,0x14,0x1, 0xc0,0x4, 0xa, 0xe1,0x8, 0xb2,0x11,0x3, +0xdf,0xb2,0xe8,0x2, 0x6c,0x2e,0xe8,0x2, 0x4f,0xae,0x2f,0x85,0xc1,0x7f,0xe2,0x1, +0xc1,0x7f,0x29,0x77,0x9, 0x61,0xe8,0x0, 0x67,0x20,0xe0,0x0, 0x16,0xd0,0xa7,0x9e, +0xe0,0x0, 0x16,0x5a,0xcf,0x90,0xbf,0x9e,0xe8,0x0, 0x67,0x99,0xb6,0xdf,0x8d,0xff, +0xb6,0xdf,0xe2,0x0, 0xcd,0xda,0xae,0x3f,0xe7,0x24,0x16,0x10,0xb6,0x5f,0x16,0x0, +0xae,0x3f,0x1, 0x3, 0xb6,0xdf,0xae,0x3f,0x17,0xef,0xa6,0x9e,0x3f,0xdd,0xbf,0x9e, +0x38,0x82,0x8, 0xb3,0xe8,0x0, 0x61,0x19,0xe0,0x0, 0x16,0xd4,0xb6,0xd2,0x17,0x3, +0xaf,0x32,0x8f,0x88,0x8f,0x18,0x37,0xa8,0x3f,0x9e,0xe3,0xff,0xc7,0xff,0x17,0x74, +0x3f,0x1f,0xe2,0x1e,0xcf,0x74,0x5, 0x84,0x14,0x1, 0xe0,0x0, 0x0, 0xfb,0xe0,0x0, +0x16,0xd0,0xc7,0xfe,0xb6,0xd2,0xe0,0x0, 0x17,0x5a,0x16,0x0, 0xe3,0xff,0xc7,0xff, +0x15,0x7d,0xaf,0x32,0x3e,0xec,0x3d,0xec,0x17,0x8, 0x3d,0x1f,0x2d,0x93,0xe0,0xb, +0x3c,0x1e,0x8e,0x8b,0x8e,0x1b,0x36,0xa8,0x3e,0x9c,0x8e,0x2b,0x8d,0xbb,0x36,0x28, +0x3e,0x1b,0xc7,0x4, 0xe3,0xff,0xc6,0xff,0xe3,0xff,0xc6,0x7f,0xe3,0xff,0xc7,0x7f, +0x15,0x84,0xe0,0x9, 0x3c,0x1e,0x8c,0x89,0xb6,0xd2,0xc5,0x81,0xac,0xb2,0x14,0x83, +0xe3,0xff,0xc5,0xff,0x3c,0x9c,0x3c,0xfb,0xc6,0x81,0xc7,0x1, 0xe3,0xff,0xc6,0xff, +0xe3,0xff,0xc7,0x7f,0x3, 0x5, 0x3d,0x7e,0x2, 0x2, 0x3f,0x6f,0x15,0x80,0x3f,0xfe, +0x2, 0xd6,0xe7,0x24,0x17,0x82,0xb7,0xd2,0xe7,0x24,0x16,0x83,0x8f,0x72,0xe7,0x24, +0x17,0x84,0xb6,0xd2,0xe4,0xc, 0x37,0x28,0xe7,0x24,0x16,0x85,0x8f,0x72,0xb7,0xd2, +0xe4,0xe, 0x37,0x20,0x8f,0xf2,0xb6,0xd2,0x3f,0x1c,0x8e,0xf2,0x37,0xa8,0x3f,0x1d, +0x3f,0x9e,0xa7,0x18,0xe0,0x0, 0x16,0xd0,0xb6,0xd2,0x3f,0xfe,0x16,0x80,0xae,0xb2, +0xe7,0xff,0x1, 0xa4,0xe0,0x0, 0x17,0xf0,0xb7,0xd2,0x17,0x2a,0xae,0xb2,0x39,0xe8, +0xb7,0xd2,0xe0,0x27,0x14,0x8, 0xaf,0x32,0xd3,0x5b,0xe0,0x0, 0x17,0xf6,0xb7,0xd2, +0xe0,0x0, 0x16,0xf5,0x8c,0x72,0xb6,0xd2,0x34,0x28,0x8f,0x23,0x8f,0xf2,0xe0,0xd, +0x37,0x28,0x8f,0x33,0x3c,0x1f,0x3f,0x1d,0xe3,0xff,0xc4,0x7f,0xe1,0x28,0x3f,0x8, +0x9, 0xe1,0x8, 0xb5,0xe8,0x0, 0x61,0xa0,0x3a,0x68,0x11,0x3, 0x12,0xef,0xa7,0x93, +0x3c,0x64,0xcf,0x90,0xbf,0x93,0xdf,0x66,0xa7,0x93,0x3f,0xd5,0xbf,0x93,0x24,0x5, +0xc1,0x7f,0xe2,0x1, 0xc1,0x7f,0x29,0x74,0xa, 0xe1,0x8, 0xb4,0xe8,0x0, 0x4f,0xd9, +0x39,0x68,0xe2,0x0, 0xcf,0x81,0x1, 0xaa,0xe1,0x11,0x14,0x2a,0xe0,0xb, 0xd8,0x56, +0xe0,0xb, 0xd7,0x54,0x3a,0x68,0x2c,0x7d,0xe8,0x0, 0x61,0x9f,0xe0,0x1, 0x14,0x14, +0xe0,0x2, 0x9f,0x93,0xe3,0xff,0xc7,0xfe,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd7,0x2c, +0x3c,0x64,0xe0,0xb, 0xd7,0x29,0xac,0x2, 0xe8,0x2, 0x4f,0xae,0x27,0x85,0xe8,0x2, +0x4f,0x29,0x8f,0x82,0x3f,0xce,0xaf,0x82,0x8c,0x2, 0xe0,0xb, 0xd7,0x1d,0xe0,0x2, +0x9f,0x93,0xcf,0x81,0xe0,0x2, 0xb7,0x93,0x0, 0xac,0x2f,0xa8,0xe1,0x11,0x14,0x2a, +0xe0,0xb, 0xd8,0x2c,0xe8,0x0, 0x67,0x9f,0xe0,0x2, 0x9f,0x1f,0xe2,0xff,0xc7,0x7f, +0xe0,0x2, 0xb7,0x1f,0xe0,0x2, 0x9f,0x1f,0xcf,0x4, 0xe0,0x2, 0xb7,0x1f,0xe8,0x2, +0x4f,0x49,0x27,0x7e,0x17,0x0, 0xe8,0x2, 0x6f,0x49,0xe0,0x2, 0x9f,0x1f,0xe1,0x0, +0xcf,0x0, 0xe0,0x2, 0xb7,0x1f,0xe0,0x2, 0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x2, +0xb7,0x1f,0xe0,0x0, 0x1f,0x84,0x87,0x8f,0x0, 0x83,0xe8,0x2, 0x47,0xa9,0xaf,0x82, +0xa, 0x61,0x8, 0xb7,0xf8,0x0, 0xc, 0x3d,0xc0,0x7c,0x17,0x80,0xe2,0x0, 0x79,0x4, +0xe0,0x80,0xaf,0xb2,0xde,0xcc,0xea,0x2, 0x7c,0x29,0xde,0x60,0x3c,0x62,0xdf,0x96, +0x4f,0x87,0xe0,0x0, 0x27,0xf9,0xe8,0x0, 0x4f,0xd9,0xe2,0x0, 0xcf,0x81,0x1, 0x10, +0xe0,0x0, 0x1c,0xd, 0xdf,0x77,0xe8,0x2, 0x6c,0x29,0x14,0x7, 0x3c,0x10,0xdf,0x86, +0xe8,0x0, 0x4f,0xd8,0xe0,0x0, 0x27,0xe8,0xde,0xbf,0xe0,0x0, 0x0, 0xe5,0xe0,0x0, +0x1a,0xc, 0x11,0x80,0x32,0x42,0xe8,0x0, 0x61,0x17,0xe3,0xff,0xc2,0x7f,0xe0,0x7, +0x13,0x60,0x13,0xfc,0xf0,0xe, 0x14,0x41,0xf0,0x0, 0x14,0x9f,0xf0,0x0, 0x15,0x60, +0xf0,0x40,0x3d,0xe3,0xf0,0xe, 0x16,0x1, 0xe1,0x33,0x14,0x3b,0xe0,0xb, 0xd7,0xc6, +0xe0,0xb, 0xd6,0xc4,0x2c,0x7e,0xe0,0x1, 0xb2,0x12,0xe0,0x1, 0xb3,0x32,0xa7,0xe2, +0x3f,0xd7,0xcf,0x82,0xbf,0xe2,0xf0,0x0, 0xbc,0x2, 0xf0,0x0, 0xbc,0xb2,0xa7,0x92, +0x37,0xca,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x12,0x17,0xfe,0x3f,0xde,0xbf,0x92, +0xa7,0x82,0xe0,0x1, 0xcf,0x80,0xbf,0x82,0xe0,0xb, 0xd6,0xa8,0x24,0x7e,0xf0,0x0, +0xbd,0x12,0xf0,0x0, 0xbd,0xb2,0xf0,0x0, 0xbe,0x2, 0xe0,0xb, 0xd6,0x9f,0x3a,0xe8, +0x2c,0x7d,0xf8,0x0, 0x66,0x9f,0x14,0x5, 0xe8,0x2, 0x9f,0x9d,0xc1,0x81,0xe3,0xff, +0xc7,0xfe,0xe8,0x2, 0xb7,0x9d,0xe0,0xb, 0xd6,0x77,0x3c,0x65,0xe0,0xb, 0xd6,0x74, +0xe8,0x2, 0x9f,0x9d,0xe0,0x28,0x3c,0x5, 0xcf,0x81,0xe8,0x2, 0xb7,0x9d,0xe2,0x1, +0xc1,0xff,0xe7,0xff,0x24,0x17,0x17,0x82,0xe1,0x2f,0x3f,0xa3,0xe7,0xff,0x2f,0xb6, +0xe7,0xff,0x0, 0x90,0xc0,0x4, 0xf8,0x0, 0xe, 0xa8,0xb, 0xe1,0x8, 0xb7,0xf8,0x0, +0xc, 0x3c,0xc0,0x7c,0xe8,0x0, 0x61,0x1f,0xe2,0x0, 0x79,0x84,0x17,0x80,0xe0,0x80, +0xaf,0xb3,0xea,0x2, 0x7c,0x28,0xe0,0x2, 0x9f,0x92,0xe1,0x0, 0xcf,0x80,0xe0,0x2, +0xb7,0x92,0xdd,0xcc,0x3c,0x63,0xdf,0x2, 0x4f,0x87,0xe0,0x1, 0x27,0x86,0xe0,0x0, +0x1a,0xc, 0xe8,0x0, 0x61,0x97,0x32,0x42,0xe3,0xff,0xc2,0x7f,0x12,0x83,0xf0,0x7, +0x14,0x60,0xf7,0xff,0x14,0xfc,0xf0,0xe, 0x15,0x0, 0xe7,0x0, 0x13,0x0, 0x13,0xfb, +0xf0,0x0, 0x15,0xe0,0xf0,0x1e,0x16,0x10,0xe1,0x33,0x14,0x3b,0xe0,0xb, 0xd7,0x46, +0xe0,0x1, 0xb2,0x13,0xf0,0x1, 0xb4,0x33,0xa7,0xe3,0xe8,0xf, 0x3f,0xd9,0xcf,0x82, +0xbf,0xe3,0x17,0x97,0xf0,0x0, 0xbd,0x3, 0xbf,0xb3,0xa7,0x83,0xe0,0x10,0xcf,0x80, +0xbf,0x83,0xe0,0x2, 0x9f,0x92,0xe2,0xff,0xc7,0xff,0xe0,0x2, 0xb7,0x92,0xe0,0x2, +0x9f,0x92,0xcf,0x84,0xe0,0x2, 0xb7,0x92,0xa7,0x93,0x37,0xca,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x93,0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x2f,0x84,0x17,0x81,0xe8,0x2, +0x6f,0xaa,0xe0,0x2, 0x9f,0x92,0x3f,0xc6,0xe0,0x2, 0xb7,0x92,0xe0,0x2, 0x9f,0x92, +0x3f,0xd7,0xe0,0x2, 0xb7,0x92,0x17,0x80,0xf0,0x0, 0xbd,0x93,0xbf,0xb3,0xf0,0x0, +0xbe,0x3, 0xe8,0x2, 0x6f,0xc9,0xe0,0x2, 0x9f,0x92,0xe2,0xff,0xc7,0xff,0xe0,0x2, +0xb7,0x92,0xe0,0x2, 0x9f,0x92,0xcf,0x84,0xe0,0x2, 0xb7,0x92,0xe8,0x2, 0x4f,0xc9, +0x27,0xfe,0x17,0x80,0xe8,0x2, 0x6f,0xc9,0xe0,0x2, 0x9f,0x92,0x3f,0xc6,0xe0,0x2, +0xb7,0x92,0xe0,0x2, 0x9f,0x92,0x3f,0xd7,0xe0,0x2, 0xb7,0x92,0xe8,0x2, 0x4f,0xaa, +0x2f,0x84,0xc2,0xff,0xe7,0xff,0x2a,0xa2,0xe8,0x2, 0x4f,0xaa,0x27,0x8d,0xe0,0x0, +0x1c,0xd, 0x17,0x80,0xe8,0x2, 0x6f,0xaa,0xde,0x6d,0xe8,0x2, 0x6c,0x28,0xdd,0xbc, +0x14,0x7, 0x3c,0x10,0xde,0x7b,0xc0,0x4, 0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe8,0x0, +0x4f,0xd9,0x2f,0x83,0xe7,0xfe,0x0, 0xdc,0xe7,0xfd,0x0, 0xcd,0x8, 0xb2,0x11,0x5, +0x3c,0x62,0xc1,0x1, 0xd3,0x71,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, 0xc9,0x1d,0x1, 0xf9, +0x9, 0x61,0xe2,0xff,0x17,0xf0,0xa7,0xf, 0xe0,0x0, 0x1f,0xa1,0x3f,0x7f,0x1, 0x97, +0xe2,0xff,0x17,0xf4,0xa7,0xf, 0xe0,0x0, 0x1f,0xa2,0x3f,0x7f,0x1, 0x90,0xe2,0xff, +0x17,0xf8,0xa7,0xf, 0xe0,0x0, 0x1f,0xa3,0x3f,0x7f,0x1, 0x89,0xe2,0xff,0x17,0xfc, +0xa4,0xf, 0xe0,0x0, 0x1f,0xa4,0xe0,0x28,0x3c,0xf, 0x38,0x82,0x14,0x0, 0x38,0x82, +0xe8,0x0, 0x4f,0xd9,0x27,0x9b,0x8, 0xb1,0xe8,0x0, 0x67,0x9f,0xe0,0x1, 0xa7,0xef, +0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x27,0x85,0xe2,0xff,0x17,0xf8,0x17,0x0, 0xbf,0xf, +0xdf,0xd1,0x24,0x9, 0xe2,0xff,0x17,0xf8,0x17,0x0, 0xbf,0xf, 0x17,0x81,0xe8,0x2, +0x6f,0xb0,0x0, 0x83,0xe8,0x2, 0x6c,0x30,0x8, 0xe1,0x38,0x82,0xe8,0x2, 0x4c,0x30, +0x38,0x82,0x8, 0xb1,0xd5,0x7d,0xe0,0x60,0x3f,0x87,0xe0,0x0, 0x1f,0x9, 0xe0,0x1, +0xbf,0x3f,0xe0,0x0, 0x1f,0x11,0xe0,0x1, 0xbf,0x4f,0xe0,0x0, 0x1f,0x5, 0xe0,0x1, +0xbf,0x6f,0xe0,0x0, 0x1f,0x6, 0xe0,0x2, 0xbf,0x4f,0x8, 0xe1,0xe0,0x0, 0x1e,0xa5, +0xe0,0x2, 0x9f,0x9d,0xe2,0x2, 0xc7,0x80,0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0, +0x27,0x93,0xe0,0x2, 0x9f,0x9d,0x37,0xc9,0xe2,0x0, 0xc7,0x81,0xe8,0x0, 0x6f,0xd9, +0xe4,0x0, 0xcf,0x81,0xa6,0xd, 0xe0,0xe, 0x37,0xa9,0xe7,0xfb,0x17,0xff,0x3f,0xdc, +0x3f,0xce,0xbf,0x8d,0x38,0x82,0x17,0x83,0xe8,0x0, 0x6f,0xd9,0x38,0x82,0xe0,0x0, +0x1f,0xa5,0x17,0x7f,0xb7,0x5f,0xe0,0x1, 0xb7,0x5f,0xe0,0x1e,0x17,0x3, 0xb7,0x3f, +0xe8,0x0, 0x4f,0x59,0x27,0xf, 0xe0,0xa0,0x17,0x14,0xb7,0x7f,0xe0,0x20,0x17,0x4, +0xe0,0x1, 0xb7,0x1f,0xe0,0x1, 0x9f,0x7f,0xe3,0xff,0xc7,0x7b,0xe0,0x1, 0xb7,0x7f, +0x0, 0x90,0x17,0x4, 0xb7,0x7f,0xe0,0x1, 0xb7,0x1f,0xe0,0x1, 0x9f,0x7f,0xcf,0x4, +0xe0,0x1, 0xb7,0x7f,0xe0,0x2, 0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x2, 0xb7,0x1f, +0xa7,0xf, 0xe0,0x10,0xcf,0x0, 0xbf,0xf, 0x17,0x7b,0xe0,0x1, 0xb7,0x3f,0xeb,0x0, +0xcf,0x80,0xa6,0xaf,0x17,0x78,0x3f,0x5d,0xbf,0x2f,0xe1,0x80,0x17,0xb, 0xbf,0x1f, +0x38,0x82,0x8f,0x8, 0x8f,0x98,0xe0,0x1, 0x14,0x7f,0x3f,0x9e,0xe0,0x28,0x3f,0x88, +0x38,0x82,0x8, 0xb4,0xe0,0x0, 0x19,0x83,0x39,0x68,0x39,0x98,0x3c,0x63,0x3a,0x69, +0xdf,0xf1,0x24,0x3, 0x8f,0x83,0x0, 0x88,0xe0,0x0, 0x1f,0x88,0x39,0x1f,0x3c,0x62, +0xdf,0xe9,0x24,0x3, 0x8f,0x82,0xaf,0x84,0xa, 0x61,0xe8,0x0, 0x4f,0xd9,0x27,0x97, +0x8, 0xb1,0xe0,0x0, 0x1c,0x83,0x15,0x16,0xe0,0x1f,0x14,0x0, 0xd2,0xb7,0xe0,0x0, +0x1c,0x88,0x15,0x16,0xe0,0x22,0x14,0x20,0xd2,0xb1,0xea,0x0, 0x7c,0xda,0x14,0x0, +0xdf,0xd9,0xea,0x0, 0x7c,0xd8,0x14,0xe, 0x8, 0xa1,0x0, 0xd4,0x38,0x82,0xe8,0x0, +0x4f,0xd9,0x27,0x9e,0x8, 0xb1,0xc0,0x7c,0x14,0x86,0x15,0x2, 0x3c,0x90,0xe0,0x1f, +0x14,0x0, 0xd2,0x9c,0x5f,0x3, 0xe1,0xff,0x17,0xff,0x3f,0x7f,0x1, 0x8f,0xe0,0x0, +0x1c,0x88,0xe0,0x1, 0x15,0x0, 0xe0,0xa2,0x14,0x20,0xd2,0x90,0xe0,0x0, 0x1c,0x88, +0xe0,0x1, 0x15,0x0, 0xe0,0x1f,0x14,0x0, 0xd2,0x2a,0xc0,0x4, 0x8, 0xe1,0x38,0x82, +0xe0,0x0, 0x1f,0xa6,0x17,0x0, 0xaf,0x7f,0x17,0x7c,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, +0x17,0x88,0xe0,0x61,0x3f,0x91,0x17,0x90,0xe0,0x61,0x3f,0x91,0x38,0x82,0x8, 0xb1, +0xeb,0x0, 0xcf,0x0, 0xa7,0x9e,0xcf,0xc0,0xbf,0x9e,0xdf,0xeb,0xe8,0x0, 0x4f,0xd9, +0x27,0x92,0xe8,0x0, 0x47,0xda,0xe0,0x0, 0x1f,0x26,0xe2,0x1, 0xc7,0xfe,0xe0,0x1, +0xaf,0xbe,0xe0,0x61,0x3f,0x82,0xcf,0x88,0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82, +0xcf,0x90,0x0, 0x8b,0xe0,0x61,0x3f,0x2, 0x17,0xf7,0x3f,0xde,0xe0,0x61,0x3f,0x92, +0xe0,0x61,0x3f,0x2, 0x17,0xef,0x3f,0xde,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0xe, 0xbf, +0xe8,0x0, 0x67,0xcf,0xe0,0x0, 0x1f,0x27,0xc7,0x81,0xe8,0x0, 0x7f,0xcf,0x17,0xdf, +0xa6,0xbe,0x3f,0xdd,0xbf,0xbe,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xad, +0x38,0x0, 0xe0,0x0, 0x1f,0x27,0x17,0x80,0xe8,0x0, 0x7f,0xcf,0x17,0x81,0xbf,0xbe, +0x17,0xfc,0xa6,0xae,0x3f,0xdd,0xcf,0x82,0xbf,0xae,0xe0,0x2, 0x17,0x80,0xb7,0x9e, +0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xe0,0x61,0x3f,0x82,0xe0,0x20,0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x0, 0x1f,0xa7,0x17,0x6f,0xa6,0xbf,0x3f,0x5d, +0xbf,0x3f,0x17,0x0, 0xe8,0x0, 0x7f,0x4f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0x38,0x82, +0xe0,0x0, 0x1f,0x27,0x17,0xef,0xa6,0xbe,0x3f,0xdd,0xbf,0xbe,0x17,0x80,0xe8,0x0, +0x7f,0xcf,0x38,0x82,0xe0,0x0, 0x1f,0xa7,0x17,0x0, 0xbf,0x3f,0xb7,0x1f,0x17,0x7c, +0xa6,0xaf,0x3f,0x5d,0xbf,0x2f,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xe0,0x61, +0x3f,0x2, 0xe7,0xdf,0x17,0xff,0x3f,0xde,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe1,0xff, +0x17,0x7f,0xc4,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7e,0x1, 0x8, 0x17,0x89,0xc7,0xff, +0xe2,0x1, 0xc7,0xff,0x27,0xf7,0x0, 0x0, 0x0, 0xfb,0x38,0x82,0xc0,0x7c,0xe0,0xa0, +0x17,0x80,0x7f,0x81,0xe8,0x2, 0x4f,0x9e,0x27,0x93,0xe0,0x0, 0x1f,0xa5,0xe0,0x1, +0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x1, 0xb7,0x1f,0x16,0xff,0x67,0x1, 0x3e,0x9e, +0x7e,0x81,0x2f,0x7c,0xe0,0x1, 0x9f,0x1f,0xcf,0x4, 0xe0,0x1, 0xb7,0x1f,0xc0,0x4, +0x38,0x82,0xe0,0x0, 0x1f,0xa8,0xa7,0x2f,0xe2,0x0, 0xc7,0x7f,0x27,0xd, 0xa6,0xaf, +0xe7,0xff,0x17,0x0, 0x3f,0x5d,0xcf,0x60,0xbf,0x2f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f, +0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x38,0x82,0xe0,0x0, 0x1f,0xa8,0xa7,0x1f,0xcf,0x1, +0xbf,0x1f,0xe7,0xff,0x17,0x3f,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0x8, 0xb1, +0xdf,0xf4,0xe8,0x0, 0x4f,0xd9,0x27,0x96,0xe0,0x0, 0x1f,0xa8,0xa7,0x2f,0xe0,0x1, +0xcf,0x0, 0xbf,0x2f,0xe7,0xff,0x17,0x0, 0xa6,0xaf,0x3f,0x5d,0xcf,0x60,0xbf,0x2f, +0xa7,0x1f,0xcf,0x2, 0xbf,0x1f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0xa7,0xf, 0xcf,0x40, +0xbf,0xf, 0xe0,0x61,0x3f,0x2, 0xe7,0xf7,0x17,0xff,0x3f,0xde,0xe0,0x61,0x3f,0x92, +0x8, 0xe1,0xe0,0x0, 0x1d,0x8b,0x17,0x80,0x16,0x1, 0xe0,0xe, 0x3d,0x9f,0xc7,0x81, +0xe2,0x0, 0xcf,0x90,0xae,0xe, 0xe0,0x0, 0x1e,0x8b,0x1, 0xf8,0x17,0x83,0xaf,0xbd, +0x17,0x2, 0xaf,0xcd,0x14,0x1, 0xaf,0x6d,0x17,0x0, 0xe0,0x0, 0x1d,0x10,0x3c,0xee, +0xe0,0xf, 0x37,0x22,0x3f,0x9a,0xbc,0x8f,0x16,0x0, 0xe0,0x17,0x3e,0x9e,0xe0,0xb, +0x3e,0x9c,0xf0,0x0, 0x8b,0xb, 0xe8,0x0, 0x8d,0x87,0xf0,0x40,0x3b,0x7b,0x5, 0x87, +0xa5,0x8f,0xe0,0x16,0x34,0x3c,0xe8,0xb, 0x3d,0xc6,0xbd,0x8f,0xc6,0x1, 0xe2,0x0, +0xce,0x10,0x1, 0xee,0xc7,0x1, 0xe2,0x0, 0xcf,0x10,0x1, 0xe3,0xe0,0x0, 0x1f,0x8a, +0x17,0x0, 0xe0,0x6, 0xaf,0xf, 0x38,0x82,0xe8,0x0, 0x4f,0xd9,0x27,0x98,0xe8,0x0, +0x67,0x20,0xa7,0x9e,0xcf,0x81,0xbf,0x9e,0xe8,0x0, 0x67,0x1f,0x9f,0xbe,0xe0,0x1e, +0xcf,0x80,0xb7,0xbe,0xe0,0x61,0x3f,0x2, 0xe7,0xef,0x17,0xff,0x3f,0xde,0xe0,0x61, +0x3f,0x92,0xe8,0x0, 0x67,0x9a,0xe0,0x6, 0x17,0x6, 0xbf,0xf, 0x38,0x82,0xe8,0x0, +0x67,0x9a,0x17,0x0, 0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c, +0xa6,0x8f,0xe7,0x7f,0x17,0x7f,0x3f,0x5d,0xbf,0xf, 0x8c,0x7f,0x38,0x82,0x8, 0xb2, +0xe8,0x0, 0x61,0x1a,0x17,0xfb,0xa7,0x2, 0xe2,0x0, 0xcc,0x1, 0x3f,0xde,0xbf,0x82, +0x1, 0x83,0x14,0x6, 0x0, 0x82,0x14,0x4, 0xe0,0xb, 0xd2,0xa4,0xa7,0x82,0xcf,0x84, +0xbf,0x82,0x9, 0x61,0x8, 0xb2,0xe8,0x0, 0x61,0x1a,0x17,0xfb,0xa7,0x2, 0x14,0x5, +0x3f,0xde,0xbf,0x82,0xe0,0xb, 0xd2,0x96,0xdf,0xd3,0xa7,0x82,0xe2,0x0, 0xc4,0x1, +0xcf,0x84,0xbf,0x82,0x9, 0x61,0x8, 0xb4,0xe8,0x0, 0x61,0x9a,0x17,0xfb,0xa7,0x3, +0xe0,0x1, 0x14,0x1f,0x3f,0xde,0xbf,0x83,0xe0,0xb, 0xd2,0x84,0xdf,0xc1,0x3a,0x68, +0xdf,0xbf,0xe4,0x2, 0x34,0x28,0xe4,0x2, 0x31,0x40,0xdf,0xba,0xa7,0x83,0x3c,0x42, +0xe4,0x4, 0x32,0x20,0xe3,0xff,0xc4,0x7f,0xcf,0x84,0x3c,0x14,0xbf,0x83,0xa, 0x61, +0x8, 0xb4,0xe8,0x0, 0x67,0x1f,0x14,0x1, 0xe0,0x1, 0x9f,0x9e,0x11,0xfb,0xe0,0x80, +0xcf,0x80,0xe0,0x1, 0xb7,0x9e,0xdf,0xb4,0xe8,0x0, 0x61,0x1a,0x14,0x5, 0xa7,0x82, +0x3f,0xd3,0xbf,0x82,0xe0,0xb, 0xd2,0x5e,0xdf,0x9b,0xa7,0x82,0x3a,0x68,0xcf,0x84, +0xbf,0x82,0x14,0x6, 0xa7,0x82,0x3f,0xd3,0xbf,0x82,0xe0,0xb, 0xd2,0x53,0xa7,0x82, +0x14,0x1, 0xcf,0x84,0xbf,0x82,0xa7,0x82,0x39,0xdf,0xb9,0x82,0xe0,0xb, 0xd2,0x4a, +0xe0,0x1, 0x14,0x3, 0x3c,0x54,0xe0,0xb, 0xd2,0x45,0xa7,0x82,0xcf,0x84,0xbf,0x82, +0xdf,0xa2,0x2c,0x7f,0xa, 0x61,0x8, 0xb2,0xe8,0x0, 0x67,0x1a,0x17,0xfb,0xa6,0x8e, +0x39,0x69,0x3f,0xdd,0xbf,0x8e,0xe0,0xb, 0xd2,0x35,0xe4,0xf, 0x31,0x40,0x3c,0x6f, +0xe2,0x1, 0xc4,0x7f,0xe0,0xb, 0xd2,0x2e,0xe0,0xf, 0x31,0x48,0x3c,0x6f,0xe2,0x1, +0xc4,0x7f,0xe0,0xb, 0xd2,0x27,0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0x9, 0x21,0xe1,0x64, +0x0, 0xa1,0x8, 0xb4,0x3a,0x68,0x14,0x1, 0x39,0x69,0x39,0xea,0xdf,0x69,0x3c,0xe4, +0x14,0x2, 0xdf,0xda,0xe8,0x0, 0x67,0x9a,0x3c,0xe2,0x39,0x92,0xe7,0x7f,0x16,0xff, +0x3c,0xf3,0x1, 0xd, 0xe1,0x80,0x87,0x19,0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0x0, 0xf3,0xa7,0xf, 0xcf,0x4, +0xbf,0xf, 0xde,0x52,0xdf,0x60,0x24,0x6, 0xe8,0x0, 0x67,0xcf,0xe2,0x0, 0xcf,0xb2, +0x5, 0xfa,0xe8,0x0, 0x67,0xcf,0xe2,0x0, 0xcf,0xb2,0x2, 0x84,0xa, 0x21,0xe7,0xfc, +0x0, 0xd1,0xe0,0x27,0x14,0x8, 0xa, 0x21,0xe7,0xfc,0x0, 0xeb,0x8, 0xb7,0xe0,0x1, +0x11,0x7f,0x39,0x58,0xe0,0x2, 0x17,0x80,0xe0,0x2, 0x3f,0xa2,0xe3,0xff,0xc1,0x7f, +0x39,0x7a,0x3, 0xaf,0x39,0xea,0x3d,0x62,0x3a,0xe9,0x3a,0x68,0xdf,0xbb,0xe0,0xa, +0x39,0xa2,0x39,0xea,0x3a,0x12,0xe3,0xff,0xc1,0xff,0x39,0x15,0x3b,0x62,0x3a,0xe3, +0xe0,0x7, 0x3a,0x22,0xe2,0x1, 0xca,0xff,0xe0,0x8, 0x3b,0x17,0x5, 0x8c,0x3c,0xe6, +0xe0,0x2, 0x15,0x0, 0xe1,0xfe,0xc2,0x80,0xdf,0xa5,0xe3,0xff,0xc2,0xff,0xe0,0x2, +0xc3,0x0, 0x0, 0xf1,0xe0,0xf, 0x31,0xc8,0xe7,0xfe,0x15,0x0, 0x3d,0x3f,0xe0,0x9, +0x37,0xa8,0x3d,0x13,0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x3a,0x19,0x3c,0x92,0x25,0x2, +0xdf,0x91,0x14,0x1, 0xb, 0xe1,0x8, 0xb2,0x39,0x68,0x14,0x1, 0xde,0xf9,0xe0,0x9, +0x31,0x2c,0x14,0x20,0xdf,0x69,0xe8,0x0, 0x67,0x1a,0xa7,0x8e,0xcf,0x84,0xbf,0x8e, +0xdd,0xf3,0xdf,0x1, 0x24,0x6, 0xe8,0x0, 0x67,0xcf,0xe2,0x3, 0xcf,0xf4,0x5, 0xfa, +0xe8,0x0, 0x67,0xcf,0xe2,0x3, 0xcf,0xf4,0x2, 0x84,0x9, 0x21,0xe7,0xfb,0x0, 0xf2, +0xe0,0x27,0x14,0x8, 0x9, 0x21,0xe7,0xfc,0x0, 0x8c,0x8, 0xb3,0x39,0x69,0x39,0xea, +0xe0,0xb, 0xd1,0x97,0xe8,0x0, 0x67,0x9a,0x39,0x92,0x16,0x80,0xe7,0x7f,0x16,0x7f, +0x39,0x73,0x1, 0xe, 0xae,0xff,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c, +0xa7,0xf, 0x3f,0x5c,0xbf,0xf, 0x8f,0x7f,0xe1,0x80,0xaf,0x12,0x0, 0xf2,0xa7,0xf, +0xcf,0x4, 0xbf,0xf, 0x9, 0xe1,0x8, 0xb1,0xe0,0x0, 0x1c,0x87,0xe0,0xa2,0x14,0x0, +0x15,0x16,0xdf,0xdc,0xe0,0x0, 0x1f,0x87,0xe1,0xff,0x17,0x7f,0x9c,0xf, 0x9e,0x9f, +0x3e,0x98,0x3e,0xfe,0x1, 0x9f,0xe0,0x1, 0x9f,0x1f,0xe0,0x1, 0x9e,0x2f,0x3e,0x1e, +0x3e,0x7d,0x1, 0x98,0x24,0x18,0x9d,0xaf,0x9e,0xbf,0x3e,0x9b,0x3e,0xfc,0x1, 0x92, +0x9e,0x4f,0x9f,0xdf,0x3f,0x9c,0x3f,0xfd,0x1, 0x8d,0xe4,0xe, 0x37,0x20,0x3c,0x4e, +0xe8,0x0, 0x7c,0x4d,0xe2,0xf0,0x17,0x80,0xe8,0x0, 0x64,0x4d,0xe1,0x28,0x3f,0xa8, +0x0, 0x82,0x14,0x0, 0x8, 0xe1,0xe8,0x0, 0x67,0x20,0xa7,0x9e,0xe0,0x80,0xcf,0x80, +0xbf,0x9e,0xe0,0x0, 0x17,0x60,0xe8,0x0, 0x67,0x97,0xbf,0x1f,0x17,0x0, 0xbf,0x3f, +0xe8,0x0, 0x4f,0x59,0xe2,0x0, 0xcf,0x1, 0x1, 0x8d,0x17,0x35,0xe0,0x3, 0xaf,0x7f, +0xe0,0xe, 0x17,0x1, 0xbf,0xf, 0xe0,0x61,0x3f,0x2, 0xe7,0xff,0x17,0xbf,0x3f,0xde, +0x0, 0x88,0x2f,0x9, 0xe0,0x1e,0x17,0x10,0xbf,0xf, 0xe0,0x61,0x3f,0x82,0xcf,0xc0, +0xe0,0x61,0x3f,0x92,0xe0,0x0, 0x17,0xc0,0xe0,0x61,0x3f,0x91,0x38,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3d,0xe8,0x0, 0x4f,0xd9,0xe8,0x0, 0x61,0x9f,0xe2,0x0, 0xcf,0x81, +0xe0,0x1, 0x1, 0xae,0xe0,0x3, 0x9f,0x93,0xe2,0x1, 0xc7,0xf0,0xe2,0x1, 0xcf,0xf0, +0xe0,0x1, 0x1, 0x26,0xe0,0x2, 0x12,0x80,0xe0,0x2, 0x17,0x82,0x9f,0x5, 0x9f,0x8f, +0x3f,0x9e,0xe1,0xff,0x17,0x7f,0x3f,0xfe,0x1, 0xd, 0xe0,0x2, 0x17,0x9c,0xa7,0xf, +0xe3,0xff,0xc7,0x7f,0xbf,0xf, 0xa7,0xf, 0xe8,0xab,0xcf,0x3b,0xbf,0xf, 0xe0,0x1, +0x0, 0x8f,0xe8,0x0, 0x61,0x17,0x13,0x0, 0x13,0xfe,0xf0,0xe, 0x15,0x41,0xf7,0xff, +0x15,0xfc,0xf0,0x0, 0x14,0xe0,0xf0,0xe, 0x14,0x1, 0x9a,0x5, 0x32,0x42,0xe0,0x1d, +0x32,0x48,0xe2,0x1, 0xc2,0x7f,0xf2,0xf, 0x3e,0xc4,0xe2,0x6, 0x3b,0x4f,0xe2,0x1, +0xc3,0x7f,0xe0,0xb, 0xd1,0x7b,0xf0,0x40,0x3e,0x68,0x2c,0x7c,0xe0,0x2, 0x9f,0x93, +0x14,0xd, 0x3f,0xd7,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd1,0x56,0x14,0x5, 0xe0,0xb, +0xd1,0x53,0xe8,0x40,0x3c,0x6c,0xe0,0xb, 0xd1,0x4f,0xe8,0x40,0x3c,0x6c,0xe0,0xb, +0xd1,0x4b,0xe8,0x40,0x3c,0x6d,0xe0,0xb, 0xd1,0x47,0x3c,0x64,0xe0,0xb, 0xd1,0x44, +0x3c,0x66,0xe0,0xb, 0xd1,0x41,0x14,0xe, 0xe0,0xb, 0xd1,0x3e,0xe0,0x1, 0x14,0x1, +0xe0,0xb, 0xd1,0x3a,0xe8,0x40,0x3c,0x6c,0xe0,0xb, 0xd1,0x36,0xe0,0x2, 0x9f,0x93, +0xcf,0x81,0xe0,0x2, 0xb7,0x93,0x24,0x20,0xa7,0xb2,0xcf,0x81,0xbf,0xb2,0xf0,0x0, +0xbd,0x2, 0xf0,0x1, 0xb6,0x12,0x9f,0x85,0x37,0xc2,0xe0,0x1, 0xb7,0xb2,0xa7,0xe2, +0xe8,0xf, 0x3f,0xdb,0xcf,0x81,0xbf,0xe2,0x17,0x9f,0xbf,0xb2,0xa7,0x92,0x37,0xca, +0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x12,0x17,0xfe,0x3f,0xde,0xbf,0x92,0xa7,0x82, +0xe0,0x1, 0xcf,0x80,0xbf,0x82,0xe0,0xb, 0xd1,0x29,0x3a,0x68,0x2c,0x7d,0xe8,0x0, +0x67,0x97,0xf0,0x0, 0xbc,0x9f,0xbc,0x3f,0x14,0xf, 0xf0,0x0, 0xbc,0xf, 0xe0,0x2, +0x9f,0x93,0x3f,0xd7,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd0,0xfe,0xe0,0x1, 0x14,0x1, +0xe0,0xb, 0xd0,0xfa,0x3c,0x64,0xe0,0xb, 0xd0,0xf7,0xe0,0x2, 0x9f,0x93,0xcf,0x81, +0xe0,0x2, 0xb7,0x93,0xe7,0xff,0x24,0x3, 0xe7,0xfe,0x0, 0xe9,0xe0,0xef,0x14,0x19, +0xe0,0xb, 0xd2,0x4, 0x17,0x80,0xe0,0x3, 0xb7,0x93,0xf8,0x0, 0xe, 0xa8,0xb, 0xe1, +0xea,0x0, 0xcc,0x2, 0xe0,0x2, 0xcc,0x0, 0x14,0x80,0xea,0x0, 0xcd,0x2, 0xe0,0x2c, +0xcd,0x58,0x3d,0x28,0xd0,0xb4,0xea,0x0, 0xcc,0x0, 0xe0,0x0, 0xcc,0x0, 0x24,0x2, +0x3c,0x1, 0x14,0x0, 0x14,0x80,0xd0,0x3e,0x3a,0x80,0x0, 0x0, 0x3a,0x80,0xe0,0x40, +0x17,0x80,0xe2,0xb0,0x16,0x80,0xa6,0xf, 0xe0,0xe, 0x3f,0x9d,0xc7,0x84,0xe2,0x4f, +0xcf,0xf0,0xbe,0xe, 0x1, 0xf9,0x38,0x82,0x8, 0xb1,0x3f,0x83,0xdb,0x68,0xdb,0x88, +0xdf,0xef,0xe0,0x61,0x3f,0x2, 0x17,0xf7,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x61, +0x3f,0x2, 0x17,0xef,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xdd,0x3f,0xde,0xdd,0xdb,0xce, +0xdc,0x51,0xdb,0x40,0xdc,0xff,0x3b,0x0, 0xdb,0x1c,0x8, 0xa1,0xe7,0xf9,0x0, 0xd9, +0xe8,0x0, 0x4f,0xd9,0x27,0x8e,0x8, 0xb1,0xdb,0x32,0x24,0xa, 0xdd,0x7d,0xe8,0x0, +0x7c,0x46,0xdd,0x97,0xdc,0x5, 0xef,0xff,0xd7,0x39,0xdc,0xac,0x0, 0xfd,0x8, 0xe1, +0x38,0x82,0x8, 0xb1,0xdf,0xd2,0xde,0xec,0xdc,0xa5,0xde,0xbe,0xda,0xd1,0xdf,0xe9, +0xdc,0x62,0xdc,0xa0,0xde,0xb9,0xe0,0xb, 0xd2,0xfc,0x0, 0x80,0x15,0x0, 0x0, 0x81, +0x3c,0xf8,0x17,0x81,0x3, 0x90,0xe2,0x0, 0xcc,0x80,0x4, 0xd, 0x16,0x0, 0x34,0xa1, +0x37,0xa1,0xe1,0x2e,0x3c,0x19,0xe1,0x2d,0x3f,0x8c,0x27,0x13,0x26,0x92,0xe2,0x0, +0xcc,0x80,0x3, 0x76,0x17,0x0, 0x3c,0x79,0x4, 0x83,0x3c,0x29,0x3f,0x4f,0x37,0xc1, +0x34,0xc1,0x2f,0xfa,0xe2,0x0, 0xcd,0x0, 0xe0,0x6e,0x39,0xa8,0x3c,0x6e,0x38,0x82, +0x3f,0x6f,0x2f,0xf1,0x0, 0xf8,0x0, 0x0, 0x3d,0xe8,0xe2,0x0, 0xcd,0x3, 0x5, 0xad, +0xe0,0xc, 0x3c,0x49,0xe2,0x0, 0xc6,0x3, 0x2e,0x28,0xc5,0x7c,0xe0,0xc, 0x35,0x21, +0xea,0x0, 0xce,0x80,0xe0,0x31,0xce,0xbc,0xe2,0x0, 0xc6,0x18,0xe1,0x80,0xa7,0x19, +0x3e,0xac,0xe0,0xc, 0x35,0x44,0x3f,0xee,0xe0,0x0, 0x3e,0x82,0xe1,0x80,0xa7,0x19, +0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99,0xe1,0x80,0xbf,0x1b,0xe1,0x80,0xa7,0x19, +0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99,0xe1,0x80,0xbf,0x1b,0xc6,0x7f,0x6, 0x6f, +0xe1,0x80,0xbf,0x9b,0xe2,0x0, 0xc5,0x3, 0xc5,0x7f,0x6, 0x87,0xe1,0x80,0x86,0x19, +0xc5,0x7f,0xe1,0x80,0xae,0x1b,0x6, 0x7b,0x38,0x82,0x0, 0x0, 0xe2,0x0, 0xcd,0x3, +0x5, 0xaf,0xe2,0x1, 0xc4,0xff,0xe0,0xc, 0x34,0xa8,0x3c,0xcc,0xe4,0xc, 0x34,0xa0, +0x3c,0xcc,0xe0,0x41,0x3e,0x48,0xe2,0x0, 0xc6,0x3, 0xe0,0xb, 0x3e,0x18,0xe0,0xc, +0x3d,0x2c,0xe0,0xd, 0x36,0x44,0xe2,0x0, 0xc6,0xc, 0xea,0x0, 0xcf,0x80,0xe0,0x32, +0xcf,0xa8,0x3f,0xac,0xe0,0x0, 0x3f,0x82,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b, +0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b,0xc6,0xff,0x6, 0x77,0x3d,0x18,0xe0,0xc0, +0xac,0xba,0xac,0x9a,0xac,0xaa,0xac,0x88,0xac,0x98,0xac,0xa8,0x38,0x82,0x3d,0xe8, +0xc5,0x7f,0x6, 0x85,0xe1,0x80,0xac,0x9b,0xc5,0x7f,0x6, 0x7d,0x38,0x82,0x8, 0xb1, +0xe0,0x60,0x3c,0x87,0xea,0x4, 0x7f,0x80,0xe0,0x0, 0x15,0x60,0x3c,0x6f,0xdf,0x85, +0xe0,0x60,0x3c,0x17,0x8, 0xe1,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x14,0xc4,0x0, 0x2, 0x16,0x48,0x0, 0x1, 0x79,0x88, +0x0, 0x0, 0x10,0x4e,0x0, 0x2, 0x14,0xac,0x0, 0x2, 0x15,0x44,0x0, 0x0, 0x4, 0xb2, +0x0, 0x2, 0x15,0xc4,0x0, 0x2, 0x15,0xf8,0x0, 0x0, 0x5, 0x2c,0x0, 0x2, 0x5, 0x2c, +0x0, 0x2, 0x3, 0x0, 0x0, 0x2, 0x4, 0xc, 0x0, 0x2, 0x16,0x8, 0x0, 0x0, 0x5, 0x34, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5, 0x1c,0x80,0xb6,0x80,0xb, 0x1, 0x0, 0x0, 0x0, +0x1, 0x3, 0x70,0x0, 0x80,0x0, 0xd, 0x0, 0x80,0x0, 0x9, 0x0, 0x80,0x0, 0x8, 0x0, +0x80,0x0, 0x7, 0x0, 0x80,0x0, 0x6, 0x0, 0x80,0x0, 0x4, 0x0, 0x80,0x0, 0x3, 0x0, +0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x1, 0x0, 0x80,0x0, 0x0, 0x0, 0x55,0x50,0x47,0x52, +0x41,0x44,0x45,0x20,0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0x80,0x0, 0x1, 0x0, +0x80,0x0, 0x4, 0x0, 0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x3, 0x0, 0x55,0x50,0x47,0x52, +0x41,0x44,0x45,0x20,0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xe8,0x0, 0x67,0x1a,0xac,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa6,0x8e,0xe7,0x7f,0x17,0xff,0x3f,0xdd,0xbf,0x8e,0x14,0x1, 0x38,0x82,0x8, 0xb2, +0xe8,0x0, 0x67,0x1a,0x17,0xfb,0xa6,0x8e,0x39,0x68,0x3f,0xdd,0xbf,0x8e,0x14,0xb, +0xdf,0xe8,0xe4,0xf, 0x31,0x40,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdf,0xe2,0xe0,0xf, +0x31,0x48,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdf,0xdc,0x3c,0x62,0xe2,0x1, 0xc4,0x7f, +0xdf,0xd8,0x14,0x0, 0x9, 0x21,0x0, 0xd5,0x8, 0xb3,0xc0,0x7c,0x39,0x6a,0x39,0xe9, +0xdf,0xdf,0x16,0x8, 0xe8,0x0, 0x67,0x9a,0xe0,0xa, 0x31,0x42,0x3e,0x10,0x15,0x80, +0xe7,0x7f,0x14,0xff,0xc5,0x7f,0xe3,0xff,0xcd,0x7f,0x1, 0x15,0xe2,0x0, 0x7f,0x4, +0xad,0xff,0xa6,0x8f,0xe2,0x80,0xc6,0x80,0x26,0xfd,0xa6,0x8f,0x3e,0xd9,0xbe,0x8f, +0x8e,0xff,0xe1,0x80,0xae,0x9e,0x3f,0x7c,0x1, 0xf4,0x67,0x1, 0xc1,0x84,0xe0,0x40, +0xbf,0x13,0x0, 0xe9,0xa7,0xf, 0x14,0x1, 0xcf,0x4, 0xbf,0xf, 0xc0,0x4, 0x9, 0xe1, +0xe8,0x0, 0x66,0xa0,0xe2,0x0, 0xcd,0x1, 0xa7,0x9d,0xe0,0x40,0xcf,0x80,0xbf,0x9d, +0xe8,0x0, 0x67,0x9b,0x1, 0x83,0x17,0x2, 0x0, 0x82,0x17,0x0, 0xe0,0x9, 0xb7,0x5f, +0x17,0x21,0xb4,0x5f,0x35,0x28,0xe0,0x1, 0xb4,0xdf,0xe0,0x1, 0xcd,0x11,0xb7,0x3f, +0x17,0x18,0xe0,0x2, 0xb7,0x5f,0xb5,0x1f,0xe0,0x7, 0x97,0x1f,0xe2,0x0, 0xcf,0x0, +0x9f,0x1f,0x4, 0xc, 0xe2,0x0, 0xc7,0x8, 0xe4,0xe, 0x37,0x20,0xe4,0xe, 0x37,0x40, +0x27,0x74,0x9f,0x1f,0xcf,0x4, 0xb7,0x1f,0x0, 0xf0,0xe0,0x80,0xcf,0x0, 0xb7,0x1f, +0x17,0x0, 0xb7,0x1f,0xe0,0x5, 0x9c,0x5f,0xa7,0x1d,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x9d,0x38,0x82,0xe8,0x0, 0x67,0x17,0xe0,0x1, 0xac,0x3e,0xa7,0x9e,0xe2,0x0, +0xc7,0x81,0x27,0xfd,0xe8,0x0, 0x66,0x9f,0xe0,0x2, 0x9f,0x9d,0xe2,0x0, 0xc7,0x82, +0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0,0x27,0xf8,0xa6,0x9e,0x17,0xfe,0x3f,0xdd, +0xbf,0x9e,0xe0,0x1, 0x8c,0x3e,0x38,0x82,0xe8,0x0, 0x67,0x9f,0xe0,0x6, 0x8f,0x7f, +0xe0,0x2, 0x9c,0x1f,0xe2,0x1, 0xcf,0x2b,0x1, 0x87,0x17,0x80,0xe2,0x0, 0xc4,0x4, +0xe0,0x28,0x3c,0xf, 0x38,0x82,0xe3,0x0, 0xc4,0x0, 0xe4,0x8, 0x34,0x20,0xe4,0x8, +0x34,0x40,0x38,0x82,0x0, 0x80,0x0, 0x80,0xe, 0x3f,0xe8,0x0, 0x4f,0xd9,0xe0,0x1, +0x2f,0x88,0xe8,0x0, 0x66,0x97,0xa7,0xbd,0xe2,0x0, 0xc7,0x81,0xe0,0x1, 0x2f,0x81, +0xa7,0x9d,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x27,0xfc,0xa7,0x1d,0x17,0xfe,0x3f,0xde, +0xbf,0x9d,0xe8,0x2, 0x4f,0xc4,0xe0,0x1, 0x8e,0x3d,0x2f,0x85,0xe8,0x2, 0x6e,0x43, +0xe8,0x2, 0x6f,0xc2,0xe8,0x2, 0x4f,0x43,0xe2,0x1, 0xcf,0x2, 0x1, 0x19,0x2, 0x86, +0xe2,0x0, 0xcf,0x5, 0x1, 0xa, 0xe0,0x0, 0x0, 0xc7,0xe2,0x1, 0xcf,0x14,0x1, 0x21, +0xe2,0x1, 0xcf,0x21,0x1, 0x2e,0x0, 0xbf,0x2f,0x87,0xe8,0x2, 0x46,0x2a,0x17,0x2, +0xe0,0x1, 0xae,0x3d,0x0, 0xa8,0xe2,0x0, 0xcf,0x81,0x1, 0xba,0x0, 0xa0,0x2f,0x88, +0x17,0x1, 0xe8,0x2, 0x6f,0x40,0xe8,0x2, 0x6f,0x41,0x17,0x1, 0x0, 0xb2,0xe2,0x0, +0xcf,0x81,0x1, 0xae,0xe0,0x0, 0x1f,0x4, 0xe8,0x2, 0x6f,0xc2,0xae,0xe, 0x0, 0xa8, +0x2f,0x86,0xe8,0x2, 0x47,0x28,0xe0,0x1, 0xaf,0x3d,0x0, 0x8c,0xe2,0x0, 0xcf,0x82, +0x1, 0x9f,0xe0,0x0, 0x1f,0x4, 0xe0,0x1, 0x86,0x3d,0xae,0xe, 0x17,0x1, 0x0, 0x96, +0x2f,0x86,0x17,0x3, 0xe8,0x2, 0x6f,0x41,0x3f,0x6f,0x0, 0x93,0xe0,0x0, 0x1f,0x4, +0xe0,0x1, 0x86,0x3d,0x3f,0x1f,0xae,0xe, 0xe8,0x2, 0x4f,0x41,0x3f,0x7f,0x5, 0xef, +0x17,0x0, 0x0, 0x8b,0x17,0x1, 0xe8,0x2, 0x6f,0x41,0xe8,0x2, 0x6f,0x42,0x17,0x0, +0xe8,0x2, 0x4e,0x41,0x3e,0x7f,0x5, 0x84,0xc7,0x81,0xe8,0x2, 0x6f,0xc4,0xe8,0x2, +0x4f,0xc2,0x27,0x89,0x17,0x80,0xe8,0x2, 0x6f,0xc4,0xe8,0x2, 0x6f,0xc3,0x17,0x81, +0xe8,0x2, 0x6f,0xc9,0x2f,0x5, 0xa7,0x8d,0xe0,0x10,0xcf,0x80,0xbf,0x8d,0xe0,0x0, +0x17,0xc0,0xe0,0x61,0x3f,0x91,0xf, 0xac,0x38,0x0, 0x8, 0xb2,0x99,0xa, 0x9f,0x9a, +0xe1,0xff,0x17,0x7f,0x3f,0x92,0x3f,0xfe,0x1, 0x8c,0x34,0xc1,0x34,0x41,0x15,0x1, +0xe3,0xff,0xc4,0xff,0xe3,0xff,0xc4,0x7f,0xde,0xf4,0xe0,0x28,0x39,0x8, 0x0, 0x82, +0x14,0x0, 0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x11,0x0, 0xe0,0x2, 0x15,0x4, 0x3c,0xe2, +0x14,0x0, 0xdf,0xe4,0x24,0x26,0xe0,0x2, 0x17,0x92,0x9c,0x8f,0xe0,0x2, 0x17,0x94, +0x9f,0xf, 0xe1,0xff,0x16,0x7f,0x3f,0x19,0xe0,0x2, 0x16,0x82,0x3f,0x7c,0x9f,0x82, +0x9e,0x8d,0x1, 0x97,0x3e,0x9f,0x3e,0xfe,0x1, 0x94,0xe4,0x9, 0x34,0xa0,0x3c,0xcf, +0xe2,0xf0,0x17,0x80,0x3c,0xff,0x2, 0x8d,0x17,0x83,0x3f,0xd9,0x2f,0x8a,0xe0,0x2, +0x15,0x8, 0xe1,0xfc,0xc4,0xe0,0xe0,0x3, 0x14,0x20,0x9, 0x21,0xe7,0xff,0x0, 0xbf, +0x14,0x0, 0x9, 0x61,0x8, 0xb2,0x11,0x3, 0xe8,0x0, 0x65,0x4d,0x14,0x80,0xe0,0xa0, +0x14,0x0, 0xde,0x8b,0xdf,0xc8,0x2c,0x7, 0xc1,0x7f,0xe2,0x1, 0xc1,0x7f,0x29,0x75, +0x3c,0x62,0x0, 0x82,0x14,0x1, 0x9, 0x61,0x8, 0xb5,0xe8,0x0, 0x4f,0xd9,0x3a,0x68, +0xe2,0x0, 0xcf,0x81,0xe2,0x1, 0xc2,0x7f,0xe0,0x2, 0x34,0x48,0x1, 0x96,0xe8,0x0, +0x61,0x9f,0x12,0xfe,0xe0,0x2, 0x9f,0x93,0xe0,0x1, 0x14,0x2, 0x3f,0xd5,0xe0,0x2, +0xb7,0x93,0xde,0xd1,0x3c,0x62,0xde,0xcf,0xe0,0x2, 0x9f,0x93,0x3a,0x78,0xcf,0x81, +0xe0,0x2, 0xb7,0x93,0x1, 0xf0,0x0, 0xa9,0x2f,0xa8,0xe8,0x0, 0x67,0x1f,0xe8,0x2, +0x6f,0xc9,0xe0,0x2, 0x9e,0x9e,0xe0,0x0, 0x1e,0x4, 0xe1,0x0, 0xce,0x80,0xe0,0x2, +0xb6,0x9e,0xe0,0x2, 0x9e,0x9e,0xe3,0xff,0xc6,0xfb,0xe0,0x2, 0xb6,0x9e,0xe8,0x0, +0x67,0x17,0xe8,0x2, 0x4e,0xc0,0x26,0xfe,0xe8,0x2, 0x6f,0xc0,0xe0,0x1, 0xaa,0x3e, +0xa6,0x8e,0xe0,0x10,0xce,0x80,0xbe,0x8e,0xe8,0x2, 0x4e,0xc9,0x26,0xfe,0xe8,0x2, +0x6f,0xc9,0x8e,0x8c,0x39,0x7d,0x1, 0xee,0xa, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xe8,0x0, 0x61,0x17,0xe8,0x0, 0x61,0x9f,0x13,0x3, 0x12,0x82,0xf0,0x0, 0x14,0x0, +0x13,0xfc,0xf0,0x1e,0x14,0x80,0xf0,0x0, 0x15,0x17,0xf7,0x0, 0x15,0x80,0xf7,0xef, +0x16,0x7f,0xf0,0xe, 0x16,0xc1,0xe8,0x0, 0x4f,0xd9,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x1, 0xce,0xde,0x9b,0x2c,0x7f,0xe8,0x0, 0x67,0xcd,0xe8,0x0, 0x62,0x4d,0xe2,0x20, +0xcf,0x80,0x5, 0x83,0x32,0x43,0x3a,0x57,0x3d,0x64,0x14,0x80,0xe0,0xa0,0x14,0x0, +0xde,0xc, 0xf8,0x0, 0x67,0x17,0xe0,0xa0,0x14,0x0, 0xe8,0x0, 0xa7,0xee,0x3c,0xe4, +0x3f,0xd7,0xcf,0x81,0xe8,0x0, 0xbf,0xee,0x3c,0x14,0xf8,0x1, 0xb4,0x1e,0xe8,0x0, +0x67,0xcd,0x37,0xc2,0xe8,0x1, 0xb7,0xbe,0x17,0x9f,0xf8,0x0, 0xbe,0x8e,0xe8,0x0, +0xbf,0xbe,0xe8,0x0, 0x65,0x4d,0x3d,0x24,0xdd,0xf0,0xe8,0x0, 0xa7,0x9e,0x37,0xca, +0xe2,0x0, 0xc7,0x81,0x27,0xfb,0xdf,0x27,0xe2,0x0, 0xcc,0x0, 0x17,0x80,0xe0,0x6f, +0x39,0xa5,0x3a,0xef,0xde,0x62,0x24,0x7f,0xe8,0x0, 0x67,0x9f,0xe0,0x2, 0x9f,0x9f, +0xe2,0x0, 0xc7,0x82,0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0,0xe2,0x0, 0xcf,0x80, +0x17,0x81,0xe0,0x6f,0x39,0x25,0x3a,0xef,0x0, 0xb7,0xe8,0x0, 0x67,0xcd,0x37,0xc2, +0xe0,0x1, 0xb7,0xb2,0xf0,0x1, 0xb4,0x12,0xa7,0xe2,0x3f,0xd7,0xcf,0x81,0xbf,0xe2, +0xf0,0x0, 0xbc,0x82,0xf0,0x0, 0xbd,0x32,0xe0,0x2, 0x9f,0x93,0xe2,0xff,0xc7,0xff, +0xe0,0x2, 0xb7,0x93,0xe0,0x2, 0x9f,0x93,0xcf,0x84,0xe0,0x2, 0xb7,0x93,0xa7,0x92, +0x37,0xca,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xde,0xee,0xa7,0x82,0x24,0x6, 0xe0,0x10, +0xcf,0x80,0xbf,0x82,0x12,0x81,0x0, 0x84,0xe8,0xf, 0x3f,0xdc,0xbf,0x82,0xe0,0x2, +0x9f,0x93,0xe8,0xf, 0x3f,0xcb,0xe0,0x2, 0xb7,0x93,0xe0,0x2, 0x9f,0x93,0xe3,0xff, +0xc7,0xfb,0xe0,0x2, 0xb7,0x93,0xc3,0x7f,0xe2,0x1, 0xc3,0x7f,0x23,0x5, 0xe2,0x0, +0xca,0x81,0xe7,0xfe,0x1, 0xf2,0x3c,0x65,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x8, 0xb2, +0xe8,0x0, 0x4c,0x59,0x24,0x5, 0xef,0xf4,0xdb,0xf0,0xe0,0x0, 0x24,0x4c,0xe8,0x0, +0x4f,0xd9,0xe2,0x0, 0xcf,0x83,0x1, 0x84,0x9, 0x21,0xe7,0xfd,0x0, 0xed,0xe2,0x0, +0xcf,0x81,0x1, 0xa9,0xe1,0x76,0x14,0x55,0xde,0xf8,0xe8,0x0, 0x61,0x1f,0xe0,0x1, +0x14,0x21,0xe0,0x2, 0x9f,0x92,0xe3,0xff,0xc7,0xfe,0xe0,0x2, 0xb7,0x92,0xdd,0xd3, +0xe8,0x0, 0x67,0xcd,0xe4,0xf, 0x37,0xc0,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdd,0xcb, +0xe8,0x0, 0x67,0xcd,0x37,0xc8,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdd,0xc4,0xe8,0x0, +0x64,0x4d,0xe2,0x1, 0xc4,0x7f,0xdd,0xbf,0xe0,0x2, 0x9f,0x92,0xcf,0x81,0xe0,0x2, +0xb7,0x92,0x0, 0x95,0x2f,0x97,0xe1,0x76,0x14,0x55,0xde,0xcf,0xe8,0x2, 0x4f,0xc9, +0x27,0xfe,0x17,0x80,0xe0,0x0, 0x1f,0x4, 0xe8,0x2, 0x6f,0xc9,0xaf,0x8e,0x9f,0x8e, +0x9f,0x1e,0xe4,0xf, 0x37,0xa0,0x3f,0xce,0xe8,0x0, 0x7f,0xcd,0x9, 0x21,0xe7,0xfe, +0x0, 0x86,0x9, 0x61,0xe0,0x0, 0x1f,0x29,0xe2,0xff,0x17,0xf0,0xbf,0xf, 0xe2,0xff, +0x17,0xf4,0xe0,0x0, 0x1f,0x2a,0xbf,0xf, 0xe2,0xff,0x17,0xf8,0xe0,0x0, 0x1f,0x2b, +0xbf,0xf, 0xe2,0xff,0x17,0xfc,0xe0,0x0, 0x1f,0x2c,0xbf,0xf, 0x38,0x82,0x8, 0xb1, +0xdf,0x97,0xe8,0x0, 0x4f,0xd9,0x27,0x93,0xe2,0x0, 0xcc,0x1, 0x1, 0xa, 0x17,0x80, +0xe0,0x2, 0x17,0x4, 0xbf,0x8e,0xe0,0x2, 0x17,0x8, 0xbf,0x8e,0x2c,0x2, 0xdf,0xdb, +0x3f,0x83,0xe8,0x0, 0x67,0x9f,0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x0, 0x80,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0x0, 0x0, 0x60,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0xe0,0x60,0x3c,0x0, 0xcc,0x2, 0xe0,0x60,0x3c,0x10,0xea,0x0, 0xc8,0x3, 0xe0,0xff, +0xc8,0x7c,0xfa,0x0, 0xcf,0x82,0xf0,0x37,0xcf,0x88,0xea,0x0, 0xcc,0x0, 0xe0,0x0, +0xcc,0x0, 0xe0,0x60,0x3c,0x17,0xea,0x0, 0xcc,0x2, 0xe0,0x0, 0xcc,0x0, 0xea,0x0, +0xcc,0x81,0xe0,0x88,0xcc,0xa4,0x3c,0x79,0x1, 0x8, 0xea,0x0, 0xcd,0x2, 0xe0,0x46, +0xcd,0x28,0x3d,0x28,0xe0,0x9, 0xdf,0x36,0xea,0x0, 0xcc,0x0, 0xe0,0xf7,0xcc,0x44, +0x3c,0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x67,0x4c,0x98,0xb3,0xec,0x7c,0x13,0x83,0xa9,0x3a,0x56,0xc5,0xda,0x25,0x14,0xeb, +0x0, 0x0, 0x0, 0x1, 0xff,0xfe,0x0, 0x0, 0x0, 0x0, 0xc8,0x37,0x0, 0x0, 0x80,0xa6, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x31,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x8, 0xb5,0xc0,0x68,0xe0,0x3, 0x1f,0x84,0x15,0x80,0x95,0x3f,0xe0,0x2, 0x1f,0xfd, +0x3e,0x6a,0xe3,0xff,0xc6,0x7f,0xf0,0x0, 0x8b,0x4f,0xf0,0x0, 0x8b,0xdf,0xe0,0x2, +0x1f,0xfc,0xe4,0x3, 0x36,0x22,0x7d,0x81,0xe4,0x3, 0x31,0xc0,0x7d,0x82,0x7d,0x83, +0x7d,0x84,0x7d,0x85,0x7d,0x86,0x99,0xf, 0x24,0x39,0xe2,0x0, 0xcc,0x1, 0x1, 0x3, +0xc0,0x18,0xa, 0xe1,0xf0,0x0, 0x23,0x74,0x14,0xff,0xe0,0x2, 0x1f,0x81,0xe8,0x9, +0x3c,0x97,0xa4,0xf, 0xe2,0x1, 0xc4,0xff,0x34,0xa1,0xf0,0x4, 0x33,0xa1,0x3d,0x68, +0xe0,0x0, 0xc4,0x82,0xf0,0x0, 0x23,0x8b,0xe0,0xd, 0x3c,0x9a,0x3f,0xea,0x97,0xf, +0x3f,0x1c,0xe1,0x80,0xb7,0x1f,0x3e,0xff,0x1, 0xfb,0xc5,0x81,0xe2,0x1, 0xc5,0xff, +0xf0,0x40,0x3b,0x7b,0x3d,0x14,0x1, 0xef,0x16,0x8c,0x3e,0x92,0xe3,0xff,0xc6,0xff, +0xe0,0xf, 0x31,0x21,0x3f,0x98,0x97,0xf, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0x3f,0x13, +0x39,0x7d,0xb7,0xf, 0x1, 0xf6,0xc0,0x18,0xa, 0xe1,0xe0,0x2, 0x1a,0x81,0xe0,0x2, +0x1f,0x0, 0xa7,0x85,0xe2,0x1, 0xc5,0x7f,0xe9,0xff,0xc7,0xfe,0x37,0xc1,0x3c,0xea, +0x37,0x41,0xe2,0x0, 0x7c,0x4, 0xf0,0x0, 0x6b,0x85,0xe0,0x43,0x3a,0x13,0xf0,0x0, +0x6b,0x4, 0x7f,0x3, 0x7f,0x84,0x7f,0x85,0xe0,0x9, 0xda,0xa4,0x15,0x8c,0x3d,0x92, +0xa6,0x5, 0xe0,0x1, 0x1d,0x7f,0xe3,0xff,0xc5,0xff,0xe0,0x41,0x3c,0xc4,0x0, 0x8a, +0x97,0xf, 0x3f,0x13,0xb7,0xf, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0x39,0x7b,0xe7,0xff, +0x1, 0x21,0xe0,0x6, 0x17,0xa8,0x3f,0x92,0x37,0xa1,0x3f,0x9a,0x96,0x9f,0xe0,0xe, +0x31,0x21,0x3a,0x7d,0x3f,0xee,0x3f,0x9c,0x4, 0x6c,0x3e,0xf9,0xe0,0xf, 0x31,0x21, +0x3f,0x9c,0x3, 0x6a,0x97,0xf, 0x3f,0x23,0xb7,0xf, 0x0, 0xe6,0xe0,0x2, 0x1f,0x81, +0xa4,0xf, 0xe7,0xff,0x0, 0xab,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3a,0xe0,0x2, +0x1f,0xe6,0xe0,0x2, 0x1e,0xfd,0x87,0xf, 0x39,0xeb,0xe0,0x3, 0x8e,0x2d,0x15,0x8e, +0x3d,0xb3,0xe0,0x3, 0x1f,0xac,0xe2,0x0, 0xc7,0x1, 0x3e,0x7e,0x3f,0x9b,0x3a,0x68, +0x3a,0xe9,0x3b,0x6a,0x8b,0x9f,0xf0,0x0, 0x8d,0x3f,0xe0,0x1, 0x1, 0x3b,0x99,0x5d, +0x3c,0x63,0xe0,0x3, 0xdc,0x72,0xf0,0x40,0x3c,0x68,0xe0,0x2, 0xd9,0xf4,0xe0,0xc, +0x15,0x52,0x14,0x80,0x3c,0x64,0xe0,0x9, 0xde,0x2f,0xf0,0x1, 0x2c,0x23,0xe8,0x7, +0x3b,0xca,0xe0,0x0, 0x2b,0xec,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f, +0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, 0xc7,0x40,0x3f,0xdc, +0x3f,0xce,0xb7,0x8d,0xc1,0x5, 0xf0,0x0, 0x14,0x80,0x3c,0xe3,0xe8,0x40,0x3c,0x69, +0xe0,0x2, 0xda,0x7b,0x24,0x7b,0xe0,0x1, 0x1d,0xfe,0x17,0x80,0xe0,0xe, 0x37,0xa1, +0xe0,0xd, 0x3a,0x1e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0x14,0x1, 0xe0,0x2, 0xda,0xd, 0xf0,0x0, +0x24,0x27,0xe0,0x1, 0x1d,0xfd,0x17,0x80,0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3a,0x9e, +0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2, +0xb7,0xd, 0x5, 0x73,0xe0,0x3, 0x19,0x30,0xe4,0x0, 0xc1,0x85,0x3c,0x64,0xe0,0xf, +0x39,0x13,0x8c,0xcf,0xe0,0x2, 0xdb,0x3c,0x2b,0x95,0x39,0x13,0x8c,0xc2,0x3c,0x65, +0xe0,0x2, 0xdb,0x36,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0xe0,0x3, 0x19,0x30, +0xe4,0x0, 0xc1,0x85,0x3c,0x64,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0xe0,0x2, 0xdb,0x28, +0x23,0xf2,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0x3c,0x66,0xe0,0x2, 0xdb,0x21,0xf7,0xff, +0x2c,0x66,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0xe0,0xc, 0x15,0x52,0x14,0x80, +0x3c,0x66,0xe0,0x9, 0xdd,0xb9,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f, +0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, 0xc7,0x40,0x3f,0xdc, +0x3f,0xce,0xb7,0x8d,0xf0,0x0, 0x14,0x84,0xf7,0xff,0x25,0xe, 0x3c,0xe3,0xe8,0x40, +0x3c,0x69,0xe0,0x2, 0xda,0xa, 0x24,0x7b,0xe0,0x1, 0x1d,0xfc,0xc1,0x5, 0x17,0x80, +0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3b,0x1e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81, +0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0xe7,0xfe,0x0, 0xf5, +0xe0,0xc, 0x15,0x52,0x14,0x80,0x3c,0x65,0xe0,0x9, 0xdd,0x86,0xe7,0xfe,0x0, 0xd9, +0x99,0x6d,0xe7,0xfe,0x0, 0xc7,0xe0,0x2, 0x1f,0x81,0xe0,0x1, 0x1d,0x7b,0xa4,0x8f, +0x3c,0x69,0xe0,0x8e,0x0, 0x9c,0xe0,0x0, 0x1f,0x8e,0xf0,0x40,0x3a,0x68,0xf0,0x0, +0x88,0x8f,0xe0,0x1, 0x14,0x7f,0xf0,0x0, 0x20,0xe5,0xf0,0x0, 0x1b,0xd, 0xf0,0x40, +0x3a,0xe8,0x17,0x0, 0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0x11,0x82,0xf0,0x0, 0x10,0x3, +0x0, 0x9e,0xf1,0x2c,0x39,0xad,0xe0,0x0, 0x26,0x43,0xf0,0x0, 0x12,0x82,0xe8,0x40, +0x3e,0xe5,0x3f,0xe8,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe8,0x40, +0x3e,0x65,0x5, 0x82,0x3e,0x68,0x3c,0x6c,0xe2,0x1, 0xc4,0x7f,0xc7,0x1, 0xe2,0x1, +0xc7,0x7f,0xe8,0x40,0x3f,0x71,0xf0,0x0, 0xc3,0x2, 0x1, 0x38,0x3d,0x7e,0x1, 0x77, +0xe8,0x0, 0x8e,0x86,0xe8,0x0, 0x8e,0x16,0xf0,0xf, 0x3a,0x2d,0xe2,0x0, 0xcf,0x80, +0xe8,0x17,0x3e,0xa4,0xf2,0x1, 0xc3,0xff,0xe0,0xd, 0x3c,0xac,0xe2,0x1, 0xc7,0xff, +0xe8,0x6f,0x3d,0x27,0x3e,0x29,0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc6,0x7f,0xe2,0x1, +0xc6,0xff,0xf1,0x37,0x39,0x2f,0xe0,0x6d,0x3d,0x2c,0xf0,0x0, 0x23,0x85,0xf1,0x2c, +0x39,0x2d,0x2e,0x15,0xf1,0x2c,0x39,0xaf,0xe7,0xff,0x2e,0x3d,0x25,0xc1,0xf1,0x2f, +0x38,0x2f,0xe7,0xff,0x27,0xbe,0xf0,0x40,0x38,0x7d,0xe8,0x40,0x3f,0xe0,0xe8,0x6f, +0x3c,0xa5,0xf0,0x40,0x3a,0xef,0xe7,0xff,0x0, 0xb4,0x38,0x82,0x14,0x1, 0x38,0x82, +0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0x30,0xf0,0x40, +0x3e,0x6a,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1d,0xd, 0xe4,0x0, 0xc5,0x8a,0x3e,0xea, +0x3e,0x9b,0x3f,0x9a,0x16,0x0, 0xe0,0x2, 0x1f,0x7d,0xe0,0x10,0xae,0x1d,0xf0,0x40, +0x3c,0xe8,0xe0,0x10,0xae,0x2d,0xe8,0x40,0x3c,0x6c,0x8e,0xf, 0x8f,0x9f,0x89,0x4e, +0x89,0xde,0x7d,0x90,0xf0,0x40,0x3f,0x69,0x7e,0xa, 0x7f,0x88,0xe0,0x6, 0xd6,0xc4, +0x14,0x83,0xe0,0x9, 0xdc,0x45,0xe0,0x1, 0x1e,0xd7,0xe0,0x43,0x3c,0x18,0xe0,0x1, +0x93,0xcd,0x67,0xa, 0x3b,0xf8,0xe0,0x67,0x3c,0x28,0xe8,0x40,0x3f,0x79,0xe0,0x3, +0x3, 0xa9,0x67,0x8a,0x17,0x1, 0xe8,0xe, 0x3f,0x19,0x3f,0x1f,0x17,0x80,0xe2,0x1, +0xc7,0x7f,0x3b,0x6f,0x66,0x88,0xe8,0x40,0x3e,0xfe,0xe0,0x3, 0x3, 0x87,0x66,0x88, +0x11,0x1, 0xe8,0x2, 0x39,0x1e,0x39,0x1d,0x16,0x80,0xe2,0x1, 0xc1,0x7f,0x7e,0x89, +0x3f,0x9d,0xe0,0x1, 0x1e,0xfa,0x37,0xa1,0x3f,0x9d,0xe0,0x1, 0x1e,0xd7,0x37,0xc1, +0x65,0x89,0x86,0x1d,0x7f,0x93,0xe0,0xa, 0x3f,0x16,0x67,0x89,0xe0,0x1, 0x1e,0xf9, +0x3d,0x92,0x36,0xc1,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc5,0xff,0xe0,0x0, 0x6f,0xc4, +0xe2,0x0, 0x7c,0x44,0x17,0x80,0x7e,0x94,0xe0,0x0, 0x6f,0x47,0xe0,0x0, 0x6e,0x48, +0xe0,0x0, 0x6f,0xc9,0x7d,0xb, 0x7d,0x8c,0xe0,0x0, 0x6b,0x45,0xe0,0x0, 0x69,0x46, +0xe0,0x9, 0xd7,0x43,0xe0,0x1, 0x1f,0xf8,0x66,0xb, 0xf0,0x0, 0x9c,0xf, 0xe0,0x1, +0x1f,0xf7,0x3e,0x76,0xf0,0x0, 0x9d,0x8f,0xe0,0x1, 0x1f,0xf6,0xf4,0x18,0x34,0x20, +0xf0,0x0, 0x9d,0xf, 0xe0,0x1, 0x1f,0xf5,0xf4,0x1b,0x35,0xa0,0x9e,0x8f,0xe0,0x1, +0x1f,0xf4,0xf4,0x1a,0x35,0x20,0x9f,0xf, 0xe0,0x1, 0x1f,0xf3,0xf0,0x18,0x3c,0x1d, +0x9f,0x8f,0xf0,0x1b,0x3d,0x9e,0xf0,0x1a,0x3d,0x1f,0x16,0x80,0xe0,0x1, 0x5, 0xcc, +0xe0,0xe, 0x39,0xb6,0x66,0x89,0xe0,0x1, 0x1d,0x57,0xe0,0x2c,0xc7,0x1f,0x3f,0x1d, +0x37,0x21,0x8a,0x9a,0xe0,0x1, 0x1d,0x7f,0xc7,0x7e,0x3f,0x1a,0x67,0x8a,0xc1,0x7f, +0xe2,0x1, 0xc1,0x7f,0x7f,0x6, 0x16,0x2, 0x67,0x9, 0x65,0x8, 0xe0,0xb, 0x3b,0x2f, +0x31,0xa1,0xe0,0xf, 0x31,0x21,0x3f,0x9c,0xf1,0x39,0x3c,0x9c,0x79,0x8d,0xe3,0xff, +0xc5,0xff,0xe4,0x3, 0x33,0x28,0x3f,0x2a,0xf1,0x2c,0x3f,0x1c,0x16,0x80,0x7d,0x87, +0x3a,0x63,0x7f,0xe, 0x7f,0x8f,0xf0,0x0, 0x7c,0x82,0x7e,0x5, 0xe4,0x4, 0x32,0x48, +0x66,0xc, 0x67,0x9, 0x3e,0x7e,0xe0,0x1, 0x5, 0x85,0x67,0x86,0x61,0xf, 0xf0,0x40, +0x3f,0x6f,0x39,0x1f,0x67,0x8a,0x67,0xe, 0xf0,0x0, 0x66,0x89,0xe0,0xf, 0x3b,0x2f, +0x66,0x7, 0xe3,0xff,0xc7,0x7f,0x7f,0x83,0xe8,0x40,0x3f,0xee,0xe0,0x43,0x39,0x9c, +0xf8,0x40,0x3f,0x6d,0xf0,0x40,0x3c,0xee,0x7b,0x4, 0xf0,0x40,0x3e,0xef,0x0, 0xbb, +0x67,0x3, 0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0x52,0x66,0x2, 0xe0,0x0, 0x26,0x5e, +0x67,0x5, 0x15,0x81,0xe0,0x0, 0x27,0x5a,0xe8,0x40,0x3d,0x6c,0x3c,0x64,0x7e,0x81, +0xde,0x93,0x15,0x7e,0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0xb, 0x33,0x1, 0xe2,0x0, +0xcd,0x1, 0xc4,0x7f,0xe0,0x43,0x3d,0x9b,0xe2,0x1, 0xc4,0x7f,0xe0,0x66,0x3d,0xab, +0xe2,0x0, 0xcc,0x2, 0x66,0x81,0x2, 0x8b,0x65,0x4, 0xe8,0xb, 0x3b,0x3e,0x3d,0x36, +0xf0,0x1a,0x3d,0x2b,0xf0,0x1b,0x3d,0xaa,0xf0,0x18,0x3c,0x26,0x17,0x1, 0xe8,0xe, +0x3f,0x19,0xf0,0x40,0x3e,0xf2,0xf0,0x40,0x3c,0xee,0xf3,0xff,0xc4,0xff,0xf0,0x0, +0xc7,0x1, 0x1, 0x2e,0xe8,0x80,0x97,0x9d,0xe8,0x40,0x3c,0xee,0x3f,0xa5,0xe0,0x43, +0x3b,0x1f,0xe2,0x0, 0xcb,0x0, 0xe2,0x1, 0xc4,0xff,0x5, 0x69,0x15,0x81,0x3d,0x9d, +0x3b,0xf6,0xe2,0x1, 0xc5,0xff,0xe0,0x6d,0x3d,0x2b,0xe2,0x0, 0xc9,0x80,0xe7,0xff, +0x2, 0x31,0xe3,0xff,0xc9,0xff,0xe7,0xff,0x4, 0x32,0xe8,0x43,0x3d,0x99,0xe2,0x0, +0xcd,0x80,0xe0,0x0, 0x5, 0x7d,0x67,0x88,0xf0,0xb, 0x3f,0x2f,0xe2,0x0, 0xcd,0x81, +0x5, 0x4e,0x66,0x2, 0xe7,0xff,0x2e,0x26,0x15,0x80,0xe7,0xff,0x0, 0xa7,0x63,0x4, +0x66,0x6, 0x65,0xd, 0x67,0x7, 0x3e,0x1a,0xc3,0x1, 0xe4,0x4, 0x33,0x28,0x7e,0x6, +0xc7,0x1, 0x66,0xb, 0xe4,0xf, 0x32,0x48,0xe3,0xff,0xc7,0x7f,0x3e,0x7f,0x7f,0x7, +0xe7,0xfe,0x2, 0xe6,0xf2,0x0, 0xcc,0x0, 0x11,0x81,0x3d,0x63,0xe8,0x6a,0x39,0xa8, +0x3c,0xea,0xf0,0x8, 0x35,0xa6,0xf0,0x40,0x3c,0x6a,0x7e,0x81,0xe0,0x9, 0xdb,0x3b, +0x66,0x10,0xe0,0x0, 0x19,0xd, 0xc4,0x20,0x39,0x1c,0xe0,0x7, 0xb4,0x62,0xe8,0x40, +0x3c,0xe8,0xf0,0x8, 0x35,0x26,0xe0,0x9, 0xdb,0x2e,0x17,0xa0,0x3f,0x98,0xe0,0x7, +0xb7,0xf2,0xe8,0x40,0x3c,0x6c,0xe0,0x6, 0xd5,0x5f,0xe2,0x0, 0xcc,0x0, 0x39,0x68, +0x66,0x81,0xe0,0x1, 0x5, 0x0, 0xe0,0x1, 0x1f,0x57,0xe0,0x43,0x39,0x12,0xe0,0x2, +0x8c,0xfe,0x2c,0x85,0x17,0x94,0xe0,0x2, 0xaf,0xfe,0x14,0x94,0xe8,0x40,0x3c,0x68, +0x7e,0x81,0xe0,0x9, 0xdb,0x10,0x3c,0x72,0x3c,0xe2,0xe0,0x62,0x3d,0xa8,0xe0,0x0, +0x14,0x7f,0x3c,0x32,0x66,0x10,0xe0,0x0, 0x19,0xd, 0x39,0x1c,0xe0,0x9, 0xdb,0x3, +0xe0,0x10,0xac,0x12,0x66,0x81,0x67,0xa, 0x67,0x88,0xe2,0x0, 0xce,0xad,0xe0,0x10, +0xae,0xa2,0xe0,0x10,0xaf,0x32,0xe0,0x10,0xaf,0xc2,0x5, 0x84,0x17,0xad,0xe0,0x10, +0xaf,0xa2,0xe0,0x0, 0xc0,0x50,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe3,0xff,0xcd,0xff, +0xe7,0xfe,0x3, 0x56,0xe7,0xfe,0x0, 0xab,0x16,0xff,0x3e,0x93,0x66,0x8, 0xe8,0xd, +0x3e,0xae,0x3e,0x7d,0x2, 0x31,0x3e,0xec,0xf0,0x2, 0x37,0x21,0xe8,0xd, 0x3e,0xae, +0xc1,0x1, 0xe2,0x1, 0xc6,0xff,0x7e,0x89,0xe2,0x1, 0xc1,0x7f,0xe7,0xfc,0x0, 0xf2, +0x17,0xff,0x3f,0x92,0xe8,0xf, 0x3f,0xa9,0x3f,0x7f,0x2, 0xf, 0x63,0xa, 0xf0,0xe, +0x34,0xa1,0xe8,0x6, 0x3b,0x29,0xc7,0x1, 0xe2,0x1, 0xc3,0x7f,0xe2,0x1, 0xc7,0x7f, +0xe0,0xf, 0x3b,0x33,0xe7,0xfc,0x0, 0xd0,0x63,0xa, 0x66,0xa, 0xe8,0x6, 0x3b,0x29, +0xe8,0xe, 0x39,0x19,0xe2,0x1, 0xc3,0x7f,0x3f,0x2c,0xe0,0xf, 0x3b,0x33,0xe2,0x1, +0xc7,0x7f,0xe7,0xfc,0x0, 0xc1,0x66,0x88,0x66,0x8, 0xe8,0x2, 0x39,0x9e,0xe8,0xd, +0x3e,0xae,0x39,0x2c,0xe2,0x1, 0xc6,0xff,0x7e,0x89,0xe2,0x1, 0xc1,0x7f,0xe7,0xfc, +0x0, 0xc1,0x39,0x63,0xe7,0xff,0x0, 0x81,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff, +0xc0,0x34,0xf0,0x40,0x3e,0x6a,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1d,0xd, 0xe4,0x0, +0xc5,0x8a,0x3e,0xea,0x3e,0x9b,0x3f,0x9a,0x16,0x0, 0xe0,0x2, 0x1f,0x7d,0xe0,0x10, +0xae,0x1d,0xf0,0x40,0x3c,0xe8,0xe0,0x10,0xae,0x2d,0xe8,0x40,0x3c,0x6c,0x8e,0xf, +0x8f,0x9f,0x89,0x4e,0x89,0xde,0x7d,0x8f,0xf0,0x40,0x3f,0x69,0x7e,0xa, 0x7f,0x88, +0xe0,0x6, 0xd4,0xb2,0x14,0x83,0xe0,0x9, 0xda,0x33,0xe0,0x1, 0x1e,0xd7,0xe0,0x43, +0x3c,0x18,0xe0,0x1, 0x93,0xcd,0x67,0xa, 0x3b,0xf8,0xe0,0x67,0x3c,0x28,0xe8,0x40, +0x3f,0x79,0xe0,0x3, 0x3, 0xa1,0x17,0x81,0x66,0xa, 0xe8,0xf, 0x3f,0x99,0x3f,0x9c, +0x17,0x0, 0xe2,0x1, 0xc7,0xff,0x3b,0x6e,0x66,0x8, 0xe8,0x40,0x3e,0x7e,0xe0,0x3, +0x3, 0x81,0x66,0x8, 0x16,0x81,0xe8,0xd, 0x3e,0x9e,0x3e,0x9c,0x16,0x0, 0xe2,0x1, +0xc6,0xff,0x7e,0x9, 0x3e,0x1e,0xe0,0x1, 0x1a,0x72,0x36,0x21,0xa7,0x4, 0xe0,0xa, +0x3f,0x96,0x3f,0x1c,0xe0,0x1, 0x1e,0x57,0xe9,0xff,0xc7,0x7e,0x85,0x9c,0x37,0x41, +0xe0,0x1, 0x1e,0x79,0x61,0x9, 0x7f,0x12,0x36,0x41,0x67,0x9, 0xe2,0x1, 0xc5,0x7f, +0xe0,0x0, 0x6f,0xc3,0xe2,0x0, 0x7c,0x40,0x17,0x80,0x39,0x1d,0xe0,0x0, 0x6f,0x40, +0xe2,0x1, 0xc1,0x7f,0xe0,0x0, 0x6e,0xc2,0xe0,0x0, 0x6f,0xc5,0x7d,0xb, 0x7e,0x13, +0xe0,0x0, 0x6b,0x41,0xe0,0x0, 0x6d,0xc4,0xe0,0x9, 0xd5,0x2f,0xe0,0x1, 0x1f,0xf8, +0xf0,0x0, 0x9c,0xf, 0xe0,0x1, 0x1f,0xf7,0xf4,0x18,0x34,0x20,0xf0,0x0, 0x9d,0x8f, +0xe0,0x1, 0x1f,0xf6,0xf4,0x1b,0x35,0xa0,0xf0,0x0, 0x9d,0xf, 0xe0,0x1, 0x1f,0xf5, +0xf4,0x1a,0x35,0x20,0x9e,0x8f,0xe0,0x1, 0x1f,0xf4,0xf0,0x18,0x3c,0x1d,0x9f,0xf, +0xe0,0x1, 0x1f,0xf3,0xf0,0x1b,0x3d,0x9e,0x9f,0x8f,0x16,0x80,0xf0,0x1a,0x3d,0x1f, +0x67,0x8b,0x3f,0xf6,0xe0,0x1, 0x5, 0xc4,0xe0,0xf, 0x3b,0x33,0x66,0x89,0xa5,0x84, +0x3f,0x9d,0x66,0x8a,0x37,0xa1,0xe0,0xc, 0x3b,0x2d,0xe3,0xff,0xc6,0x7f,0x3d,0x9f, +0x7e,0x7, 0x17,0x2, 0x66,0x9, 0x67,0x88,0xe0,0x1, 0x1d,0x57,0x3e,0x2f,0x7e,0xd, +0x31,0xa1,0x66,0x9, 0xf1,0x39,0x3c,0x9e,0x79,0x8c,0xe4,0xc, 0x36,0x28,0xe4,0x3, +0x33,0x28,0xf1,0x2e,0x3f,0x1e,0x8a,0x9a,0x16,0x80,0x7d,0x86,0x3a,0x63,0x7e,0xe, +0xf0,0x0, 0x7c,0x82,0xe0,0x0, 0x7f,0x5, 0xe4,0x4, 0x32,0x48,0x67,0x9, 0x39,0x7e, +0xe0,0x1, 0x5, 0x84,0xf0,0x0, 0x67,0x6, 0x67,0x87,0x67,0xd, 0x66,0xa, 0xf0,0x0, +0x66,0x89,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x39,0x9f,0xe0,0xc, 0x3b,0x2c,0xe8,0x40, +0x3f,0xee,0x64,0x8e,0xf8,0x40,0x3f,0x6d,0x7e,0x3, 0xf0,0x40,0x3c,0xee,0x7b,0x4, +0xf0,0x40,0x3e,0xef,0x0, 0xbe,0x66,0x3, 0xe2,0x0, 0xce,0x1, 0xe0,0x0, 0x5, 0x53, +0x67,0x82,0xe0,0x0, 0x27,0xdf,0x66,0x5, 0x15,0x81,0xe0,0x0, 0x26,0x5b,0xe8,0x40, +0x3d,0x6c,0x3c,0x64,0x7e,0x81,0xdc,0x88,0x15,0x7e,0x3d,0x18,0xe2,0x1, 0xc5,0x7f, +0xe0,0xb, 0x33,0x1, 0xe2,0x0, 0xcd,0x1, 0xc4,0x7f,0xe0,0x43,0x3d,0x9b,0xe2,0x1, +0xc4,0x7f,0xe0,0x66,0x3d,0xab,0xe2,0x0, 0xcc,0x2, 0x66,0x81,0x2, 0x8b,0x65,0x4, +0xe8,0xb, 0x3b,0x3e,0x3d,0x36,0xf0,0x1a,0x3d,0x2b,0xf0,0x1b,0x3d,0xaa,0xf0,0x18, +0x3c,0x26,0xf0,0x0, 0xc7,0x1, 0xf4,0x9, 0x37,0x28,0x17,0x1, 0xe4,0xf, 0x34,0xc8, +0xe8,0xe, 0x3f,0x19,0x39,0x7f,0xf0,0x40,0x3c,0xee,0xf3,0xff,0xc4,0xff,0x5, 0xac, +0xe9,0x80,0x97,0x9d,0xe4,0x9, 0x34,0xc8,0x3f,0xa5,0xe0,0x43,0x3b,0x1f,0xe2,0x0, +0xcb,0x0, 0x5, 0x68,0x15,0x81,0x3d,0x9d,0x3b,0xf6,0xe2,0x1, 0xc5,0xff,0xe0,0x6d, +0x3d,0x2b,0xe2,0x0, 0xc9,0x80,0xe7,0xff,0x2, 0x30,0xe3,0xff,0xc9,0xff,0xe7,0xff, +0x4, 0x31,0xe8,0x43,0x3d,0x99,0xe2,0x0, 0xcd,0x80,0xe0,0x0, 0x5, 0x7d,0x67,0x8, +0xf0,0xb, 0x3f,0x2e,0xe2,0x0, 0xcd,0x81,0x5, 0x4d,0x67,0x82,0xe7,0xff,0x2f,0xa5, +0x15,0x80,0xe7,0xff,0x0, 0xa6,0x63,0x4, 0x66,0x6, 0x65,0xc, 0x67,0x7, 0x3e,0x1a, +0xc3,0x1, 0xe4,0x4, 0x33,0x28,0x7e,0x6, 0xc7,0x1, 0x66,0xb, 0xe4,0xf, 0x32,0x48, +0xe3,0xff,0xc7,0x7f,0x3e,0x7f,0x7f,0x7, 0xe7,0xfe,0x2, 0xe8,0xf2,0x0, 0xcc,0x0, +0x11,0x81,0x3f,0x63,0xe8,0x6e,0x39,0xa8,0x3c,0xee,0xf0,0x8, 0x35,0xa6,0xf0,0x40, +0x3c,0x6e,0x7e,0x81,0xe0,0x9, 0xd9,0x2f,0x67,0x8f,0xe0,0x0, 0x19,0xd, 0xc4,0x20, +0x39,0x1f,0xe0,0x7, 0xb4,0x62,0xe8,0x40,0x3c,0xe8,0xf0,0x8, 0x35,0x26,0xe0,0x9, +0xd9,0x22,0x17,0xa0,0x3f,0x98,0xe0,0x7, 0xb7,0xf2,0xe8,0x40,0x3c,0x6c,0xe0,0x6, +0xd3,0x53,0xe2,0x0, 0xcc,0x0, 0x39,0x68,0x66,0x81,0xe0,0x0, 0x5, 0x7e,0xe0,0x1, +0x1d,0x57,0xe0,0x43,0x39,0x12,0xe0,0x2, 0x8c,0xfa,0x2c,0x85,0x17,0x94,0xe0,0x2, +0xaf,0xfa,0x14,0x94,0xe8,0x40,0x3c,0x68,0x7e,0x81,0xe0,0x9, 0xd9,0x4, 0x3c,0x72, +0x3c,0xe2,0xe0,0x62,0x3d,0xa8,0xe0,0x0, 0x14,0x7f,0x3c,0x32,0x66,0xf, 0xe0,0x0, +0x19,0xd, 0x39,0x1c,0xe0,0x9, 0xd8,0xf7,0xe0,0x10,0xac,0x12,0x66,0x81,0x67,0xa, +0x67,0x88,0xe2,0x0, 0xce,0xad,0xe0,0x10,0xae,0xa2,0xe0,0x10,0xaf,0x32,0xe0,0x10, +0xaf,0xc2,0x5, 0x84,0x17,0xad,0xe0,0x10,0xaf,0xa2,0xe0,0x0, 0xc0,0x4c,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe3,0xff,0xcd,0xff,0xe7,0xfe,0x3, 0x55,0xe7,0xfe,0x0, 0xaa, +0x16,0xff,0x3e,0x93,0xe8,0xd, 0x3e,0xae,0x3e,0x7d,0x2, 0x30,0xf0,0xd, 0x37,0x21, +0xe8,0xc, 0x3e,0x2e,0xc6,0x81,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, 0xc6,0xff, +0xe7,0xfc,0x0, 0xfa,0x17,0xff,0x3f,0x92,0xe8,0xf, 0x3f,0xa9,0x3f,0x7f,0x2, 0xf, +0x3b,0x6e,0xf0,0xf, 0x34,0xa1,0xe8,0x6, 0x3b,0x29,0xc7,0x81,0xe2,0x1, 0xc3,0x7f, +0xe2,0x1, 0xc7,0xff,0xe0,0xe, 0x3b,0x33,0xe7,0xfc,0x0, 0xd8,0x63,0xa, 0x66,0x8a, +0xe8,0x6, 0x3b,0x29,0xe8,0xf, 0x39,0x19,0xe2,0x1, 0xc3,0x7f,0x3f,0xad,0xe0,0xe, +0x3b,0x33,0xe2,0x1, 0xc7,0xff,0xe7,0xfc,0x0, 0xc9,0x66,0x8, 0x65,0x8, 0xe8,0xd, +0x39,0x9e,0xe8,0xc, 0x3e,0x2e,0x3e,0xaa,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, +0xc6,0xff,0xe7,0xfc,0x0, 0xc9,0x39,0x63,0xe7,0xff,0x0, 0x83,0xe2,0x0, 0xcc,0x1, +0x1, 0x11,0x4, 0x9b,0xc4,0x7c,0xe2,0x0, 0xcc,0x1, 0x5, 0x8c,0xe0,0x1, 0x1f,0x7d, +0xe0,0x1, 0x1f,0xf1,0xbf,0xf, 0xe0,0x1, 0x1f,0x70,0xe0,0x2, 0x1f,0x81,0xbf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0x7c,0xe0,0x1, 0x1f,0xf1,0xbf,0xf, 0xe0,0x1, 0x1f,0x6f, +0xe0,0x2, 0x1f,0x81,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x7e,0xe0,0x1, 0x1f,0xf1, +0xe2,0x0, 0xcc,0x82,0xbf,0xf, 0x1, 0x7, 0xe0,0x1, 0x1f,0x6e,0xe0,0x2, 0x1f,0x81, +0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x6d,0xe0,0x2, 0x1f,0x81,0xbf,0xf, 0x38,0x82, +0x8, 0xb5,0xe0,0x2, 0x19,0x7a,0x8f,0x82,0x2f,0xb6,0xe0,0x1, 0x19,0xf1,0xe0,0x1, +0x1a,0x72,0xa4,0x83,0xa4,0x4, 0xe0,0x2, 0x1a,0x81,0xe0,0x4, 0xd2,0x8f,0xe0,0x2, +0x1f,0xfc,0x14,0x8c,0x9f,0x8f,0xa5,0x4, 0x3c,0x9f,0xa5,0x83,0xa4,0x5, 0xe3,0xff, +0xc4,0xff,0x0, 0x88,0xc7,0x81,0x9e,0x8c,0xe3,0xff,0xc7,0xff,0x3f,0xf9,0xb6,0x8e, +0x1, 0x19,0x8e,0x82,0xe0,0xe, 0x37,0xa1,0xe2,0x0, 0xce,0x81,0xe0,0xc, 0x3d,0x9e, +0x3f,0x1a,0x1, 0xf1,0xe0,0xe, 0x37,0xa1,0x3e,0xec,0xe0,0xc, 0x3c,0x1e,0x9e,0x8d, +0x96,0xc, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1a,0x3e,0xac,0x3f,0xf9,0xb6,0x8e, +0x1, 0xe9,0xa, 0xe1,0xe0,0x2, 0x1a,0x81,0xe0,0x1, 0x19,0xf1,0xe0,0x1, 0x1a,0x72, +0xa5,0x5, 0xa4,0x83,0xa4,0x4, 0x15,0x81,0xe0,0x4, 0xd2,0x39,0x0, 0xc9,0xe0,0x0, +0x1f,0x8e,0x8f,0x8f,0x27,0xbc,0x14,0x7f,0x3c,0x1f,0xe0,0x2, 0x1f,0xfd,0xe2,0x1, +0xc4,0x7f,0xf0,0x0, 0x8b,0x5f,0xc4,0x1, 0xe0,0x0, 0x1e,0x8d,0xe0,0x1, 0x1f,0xf2, +0x34,0x21,0xf7,0xff,0x12,0xff,0xf0,0x0, 0xa3,0x8f,0xf8,0x15,0x3a,0x96,0x3c,0x1d, +0x14,0x80,0x0, 0x88,0x3e,0x7b,0x4, 0x1e,0xc7,0x7f,0xaf,0x1d,0xc6,0x82,0x3c,0x7d, +0x1, 0x1e,0x8f,0x8d,0x8f,0x1d,0xe8,0xf, 0x3f,0xb6,0x3e,0x69,0x3f,0x9e,0x37,0xa1, +0xf0,0xb, 0x3b,0x9f,0x95,0xb, 0x27,0x3, 0xe0,0x40,0x96,0x1b,0xe8,0x40,0x3f,0x75, +0x3d,0xe9,0x3, 0x4, 0xe8,0xf, 0x3f,0x97,0x95,0x9f,0x3d,0x7c,0x4, 0x64,0x3d,0x7b, +0x3, 0x66,0xc7,0x1, 0xaf,0x1d,0xc6,0x82,0x3c,0x7d,0x1, 0xe4,0x38,0x82,0x0, 0x0, +0x8, 0xb4,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0xc3,0x17,0x0, 0x8d,0x8f,0xe0,0x0, +0x19,0xd, 0xe0,0xc, 0x35,0xc3,0x3f,0xee,0x3e,0xee,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0x3f,0x12,0x3f,0xfc,0xe0,0xf, 0xae,0x8e,0x3f,0x6f,0x5, 0x78,0xe0,0x1, 0x1e,0x57, +0xe0,0x1, 0x1f,0xf2,0xe0,0x2, 0x1d,0x7d,0xf0,0x1, 0x93,0xc, 0xa7,0xf, 0xf0,0x0, +0x91,0xac,0xf0,0x0, 0x92,0x3c,0xf0,0x0, 0x92,0xfc,0xe0,0x3, 0x1e,0x40,0xf0,0x0, +0x80,0xca,0xf0,0x0, 0x81,0x5a,0xe4,0x0, 0x17,0x80,0xe2,0x0, 0x7c,0xae,0xe0,0x1, +0x1d,0x79,0xf0,0x0, 0x83,0x8c,0xe0,0x0, 0x1a,0xe, 0xe0,0x0, 0x19,0x8c,0x3f,0x1f, +0x3f,0x99,0x16,0x0, 0x37,0x41,0x37,0xc1,0x35,0x41,0xc5,0xff,0xe2,0x0, 0x7c,0x84, +0xe2,0x0, 0x7c,0x14,0xae,0x84,0xae,0x83,0xe0,0x1a,0xb6,0x52,0xe0,0x1a,0xb6,0x62, +0xe0,0x1a,0xb6,0x72,0xe0,0x1b,0xb6,0x12,0x7f,0x6, 0x7f,0x88,0x7d,0x7, 0xf0,0x0, +0x73,0x15,0x6d,0x96,0xf0,0x0, 0x6b,0x97,0xf0,0x0, 0x68,0x95,0xf0,0x0, 0x69,0x14, +0xf0,0x0, 0x71,0x92,0xf0,0x0, 0x72,0x13,0xf0,0x0, 0x72,0x94,0xe0,0x9, 0xd2,0x2d, +0x55,0x7, 0x5f,0x8, 0xe0,0x1a,0xb5,0x72,0xe0,0xb, 0x37,0x48,0xe0,0x0, 0x1d,0xb, +0x5f,0x86,0xaf,0xa, 0xe0,0xd, 0x37,0xc8,0xe0,0x0, 0x1f,0xa, 0xf0,0x0, 0x4b,0x84, +0xad,0x8e,0xe0,0x0, 0x1f,0x9, 0x4c,0x5, 0xf0,0x0, 0x53,0x3, 0x54,0x84,0x56,0x5, +0xaf,0x8e,0xe0,0x0, 0x1f,0x88,0xf0,0x0, 0xab,0x84,0xac,0x3, 0xf0,0x1a,0xb3,0x52, +0xe0,0x1a,0xb4,0xe2,0xe0,0x1b,0xb6,0x12,0xae,0x8f,0xf0,0x0, 0x23,0xa5,0xe0,0x1, +0x1d,0x6c,0xe0,0x0, 0x1e,0xd, 0x17,0x80,0xf0,0x0, 0x13,0x1, 0xe0,0xe, 0x37,0xc3, +0xe2,0x0, 0xc7,0x1f,0x3f,0x12,0x16,0x87,0xe0,0xf, 0x84,0x8e,0x3e,0xdf,0xe0,0x80, +0x9d,0x9a,0xf0,0xd, 0x33,0x3d,0x3e,0xc9,0xc7,0x81,0xe0,0xf, 0xae,0x8e,0xe2,0x1, +0xc7,0xff,0xe0,0xe, 0x35,0xc8,0xaf,0xc, 0xf0,0x40,0x3b,0xff,0xc6,0x2, 0xe0,0x40, +0xad,0x9c,0x1, 0xe5,0x24,0x19,0x15,0xff,0x3d,0x98,0xe2,0x1, 0xc5,0xff,0x35,0xa1, +0xe2,0x0, 0x7e,0xae,0xe0,0x0, 0x1f,0x8d,0xe2,0x0, 0x7f,0x2c,0xe0,0xb, 0x3d,0x9d, +0xe0,0x80,0x9e,0x9e,0xc7,0x82,0xe0,0xc, 0x36,0xc8,0x3d,0xfe,0xe0,0x7, 0xae,0x2f, +0xe0,0x7, 0xae,0xbf,0x1, 0xf6,0xe0,0x0, 0xc0,0x68,0xa, 0x61,0xe0,0x2, 0x1f,0xfd, +0xf0,0x0, 0x89,0xdf,0xf0,0xa, 0x31,0xc1,0xf0,0x0, 0x21,0xde,0xe0,0x1, 0x1f,0x72, +0x14,0x0, 0xf0,0x0, 0xa2,0x8e,0x8d,0xef,0xf0,0x1, 0x19,0x7f,0xf0,0x17,0x31,0xa1, +0x35,0x21,0xf8,0x40,0x3a,0x65,0x3c,0xe8,0xf0,0x40,0x3b,0x68,0x17,0x81,0xe8,0xf, +0x3f,0xd6,0x27,0xa6,0x25,0x97,0xe0,0x1, 0x17,0x7e,0xe8,0xe, 0x3f,0x56,0xe0,0x65, +0xc7,0x10,0xe8,0xe, 0x3f,0x12,0xe8,0x40,0x3e,0xe5,0x17,0x80,0xc7,0x81,0x96,0xd, +0xe2,0x1, 0xc7,0xff,0x3f,0xfb,0xb6,0xe, 0x3c,0x9c,0xe8,0xd, 0x3e,0x97,0x3f,0x1a, +0x1, 0xf6,0xf0,0x0, 0xc3,0x1, 0xf2,0x1, 0xc3,0x7f,0xf8,0x40,0x39,0xf6,0xf0,0x0, +0xc2,0x82,0xf0,0x0, 0xc2,0x2, 0x1, 0xdb,0xe0,0x28,0x3c,0x19,0x38,0x82,0x25,0xf2, +0xe0,0x1, 0x17,0x7e,0xe8,0xe, 0x3f,0x56,0xe0,0x6b,0xc7,0x38,0xe8,0xe, 0x3f,0x12, +0xe8,0x40,0x3e,0xe4,0xc7,0x81,0x96,0xd, 0xe2,0x1, 0xc7,0xff,0x3f,0xfb,0xb6,0xe, +0x3c,0x1c,0xe8,0xd, 0x3e,0x97,0x3f,0x1a,0x1, 0xf6,0xf0,0x0, 0xc3,0x1, 0xf2,0x1, +0xc3,0x7f,0xf8,0x40,0x39,0xf6,0xf0,0x0, 0xc2,0x82,0xf0,0x0, 0xc2,0x2, 0xe7,0xff, +0x1, 0xb7,0x0, 0xdb,0xe8,0x40,0x3c,0x63,0x38,0x82,0x0, 0x0, 0x8, 0xb6,0xe1,0xff, +0xc0,0x18,0xe0,0x1, 0x1f,0xc3,0x17,0x0, 0x8d,0x8f,0xe0,0x0, 0x19,0x8d,0x39,0x68, +0xe0,0xc, 0x35,0xc3,0x3f,0xee,0x3e,0xee,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0x13, +0x3f,0xfc,0xe0,0xf, 0xae,0x8e,0x3f,0x6f,0x5, 0x78,0xe0,0x0, 0x1b,0xe, 0xe0,0x0, +0x1a,0x8c,0x17,0x80,0xae,0x86,0xae,0x85,0xe0,0x1a,0xb7,0xd3,0xe0,0x1a,0xb7,0xe3, +0xe0,0x1a,0xb7,0xf3,0xe0,0x1b,0xb7,0x93,0xe0,0x1, 0x21,0x7f,0xe0,0x1, 0x1f,0xeb, +0x37,0xc1,0x7f,0x86,0xe2,0x0, 0x7e,0x2e,0xe0,0x2, 0x1e,0xfd,0xe0,0x1, 0x1a,0x42, +0x8f,0x5d,0xe0,0x1, 0x1f,0xd7,0xf0,0x0, 0x81,0xcd,0xe0,0xe, 0x8c,0xa4,0xe0,0x1, +0x1e,0xf9,0xf0,0x0, 0x92,0x2f,0xf0,0x0, 0x92,0xbf,0xf0,0x0, 0x93,0x7f,0xf0,0x1, +0x93,0x8f,0xe0,0xe, 0x8c,0x14,0xe0,0xf, 0x37,0x41,0xe9,0xff,0xc6,0x7e,0x36,0x41, +0x36,0xc1,0xc5,0xff,0xe0,0x1, 0x15,0x78,0x34,0xc1,0x6f,0x94,0x17,0x81,0x7e,0x8, +0x7e,0x87,0xf0,0x0, 0x69,0x95,0xf0,0x0, 0x72,0x12,0xf0,0x0, 0x72,0x93,0xf0,0x0, +0x73,0x14,0x6d,0x96,0x6f,0x97,0xf0,0x0, 0x73,0x95,0xe0,0x9, 0xd0,0x47,0xe2,0x0, +0x7c,0x84,0xe2,0x0, 0x7c,0x14,0xe0,0x9, 0xd0,0xf8,0xe0,0xe, 0x8c,0xa4,0xe0,0xe, +0x8c,0x14,0xe0,0x1, 0x15,0x78,0xe0,0x9, 0xd0,0x39,0x56,0x7, 0x5f,0x8, 0x5f,0x86, +0xe0,0x1a,0xb6,0x73,0xe0,0x16,0x37,0x47,0xe0,0x0, 0x1e,0xb, 0x4c,0x84,0x4d,0x5, +0x54,0x3, 0x55,0x84,0xf0,0x0, 0x1a,0xa, 0x56,0x85,0xe0,0x15,0x37,0xc7,0xf0,0x0, +0x19,0x88,0xaf,0xc, 0xf2,0x1, 0xc3,0x7e,0xe0,0x0, 0x1f,0x9, 0xf2,0x1, 0xc2,0xfe, +0xac,0x86,0xad,0x5, 0xe0,0x1a,0xb4,0x53,0xe0,0x1a,0xb5,0xe3,0xf8,0x0, 0xab,0x4, +0xe0,0x1b,0xb6,0x93,0xaf,0x8e,0xf8,0x0, 0xaa,0x83,0xe0,0x0, 0x29,0x4d,0x24,0xa5, +0xf0,0x1, 0x1b,0xec,0xe0,0x0, 0x1e,0xd, 0x3c,0x62,0x11,0x1, 0xe0,0xf, 0x34,0x43, +0xe2,0x0, 0xc7,0x9f,0x3f,0x93,0x17,0x7, 0xe0,0xf, 0x85,0x8f,0x3f,0x58,0xe8,0x80, +0x9e,0x97,0xe0,0xe, 0x31,0x3e,0x3f,0x4b,0xc4,0x1, 0xe0,0xf, 0xaf,0xf, 0xe0,0xb, +0x36,0xa1,0x17,0x81,0x36,0xc8,0xe2,0x1, 0xc4,0x7f,0xae,0x8c,0x3f,0x9b,0xc6,0x2, +0x3c,0xf8,0xe0,0x40,0xaf,0x9c,0x1, 0xe3,0x25,0x1b,0x15,0xff,0x3d,0x9a,0xe2,0x1, +0xc5,0xff,0x35,0xa1,0xe2,0x0, 0x7f,0xae,0xe0,0x0, 0x1f,0xd, 0xe2,0x0, 0x7e,0x2c, +0xe0,0xb, 0x3d,0x9f,0xe0,0x80,0x9f,0x9c,0xc7,0x2, 0xe0,0xd, 0x37,0xa1,0xc6,0x81, +0x37,0xc8,0x3d,0xfc,0xe0,0x7, 0xaf,0xae,0xe0,0x7, 0xae,0xbe,0x1, 0xf4,0xf0,0x0, +0xc3,0x1, 0xf0,0x0, 0xc2,0x81,0xf8,0x0, 0xab,0x4, 0xf8,0x0, 0xaa,0x83,0xe0,0x0, +0xc0,0x68,0xb, 0x61,0x24,0xa4,0xe0,0x1, 0x1c,0x6c,0xe0,0x0, 0x1d,0x8d,0x17,0x80, +0xf0,0x0, 0x13,0x81,0xe0,0xe, 0x37,0xc3,0xe2,0x0, 0xc7,0x1f,0x3f,0x13,0x16,0x87, +0xe0,0xf, 0x81,0xe, 0x3e,0xdf,0xe0,0x80,0x9e,0x18,0xf0,0xd, 0x33,0xbd,0x3e,0xc2, +0xc7,0x81,0xe0,0xf, 0xae,0x8e,0xe2,0x1, 0xc7,0xff,0xe0,0xe, 0x36,0x48,0xaf,0xb, +0x36,0x21,0xc5,0x82,0x3c,0xff,0xe0,0x40,0xae,0x1b,0x1, 0xe5,0x25,0x59,0x15,0xff, +0x3d,0x9a,0xe2,0x1, 0xc5,0xff,0x35,0xa1,0xe2,0x0, 0x7f,0xae,0xe0,0x0, 0x1f,0xd, +0xe2,0x0, 0x7e,0xac,0xe0,0xb, 0x3d,0x9f,0xe0,0x80,0x9f,0x9d,0xc7,0x2, 0xe0,0xc, +0x37,0xc8,0x3d,0xfd,0x37,0xa1,0xe0,0x7, 0xae,0x2e,0xe0,0x7, 0xaf,0xbe,0x1, 0xf5, +0xe0,0x0, 0xc0,0x68,0xb, 0x61,0xe0,0x1, 0x1f,0xea,0x37,0xc1,0x7f,0x86,0xe7,0xfe, +0x0, 0x83,0x8, 0xb4,0xe0,0x0, 0x1f,0x87,0x17,0x0, 0xaf,0xf, 0xdd,0xa2,0xe0,0x3, +0x1f,0xc7,0xea,0x10,0x79,0x78,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x21,0xe0,0x0, +0x1f,0x8e,0x8f,0xf, 0x27,0x10,0x87,0x82,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0xb2,0x2, 0x94,0xaf,0x82,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x9, 0xa, 0x61,0xe0,0x1, 0x1f,0xe9,0xaf,0x2, 0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0xf9,0xe0,0x0, 0x1f,0x86,0xaf,0xf, 0xa, 0x61,0x17,0xb2,0x0, 0xec,0x8c,0x2, +0xe0,0x0, 0x19,0x8e,0xe0,0x6, 0xd2,0xae,0xe0,0x0, 0x1f,0x93,0x8f,0x3, 0x8f,0x8f, +0xe0,0x0, 0x1e,0x9a,0x3f,0x7f,0xac,0xd, 0x1, 0x56,0x8e,0x82,0x17,0xb1,0xe1,0x2f, +0x3f,0xad,0x27,0xd1,0x2c,0x50,0xe0,0x1, 0x1f,0xe8,0x87,0x8f,0xe2,0x1, 0xc7,0xfd, +0x2f,0xca,0xe0,0x2, 0x1a,0x48,0x8f,0x84,0xe2,0x0, 0xcf,0x81,0x1, 0xc, 0x8f,0x84, +0xe2,0x0, 0xcf,0x81,0x1, 0x4, 0x8f,0x3, 0xe7,0xff,0x0, 0xbe,0xdd,0x11,0x8f,0x3, +0xe7,0xff,0x0, 0xba,0xde,0x14,0xde,0x7b,0x0, 0xf3,0xea,0x10,0x7f,0xfe,0xea,0x11, +0x7f,0x2, 0x97,0x8f,0x9e,0x8e,0xe4,0x8, 0x34,0x23,0xe0,0xe, 0x3f,0xad,0xe0,0x43, +0x3f,0x1e,0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d,0x3f,0xad,0xe0,0x41,0x3f,0x4e, +0xe4,0x8, 0x34,0x40,0xe0,0x6f,0x3d,0x2e,0x3f,0xf8,0x2, 0x17,0xea,0x10,0x7f,0xfc, +0xea,0x11,0x7f,0x0, 0x97,0x8f,0x9e,0x8e,0xe0,0xe, 0x3f,0xad,0xe0,0x43,0x3f,0x1e, +0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d,0x3f,0xad,0xe0,0x41,0x3f,0x4e,0xe0,0x6f, +0x3d,0x2e,0xe0,0x28,0x3c,0x2f,0x38,0x82,0x14,0x0, 0x38,0x82,0xea,0x10,0x7f,0xfa, +0x17,0x0, 0xaf,0xf, 0x38,0x82,0xea,0x11,0x7c,0x4, 0xe0,0x7d,0x0, 0xdb,0x0, 0x0, +0x8, 0xb6,0xea,0x10,0x79,0x7a,0xe0,0x2, 0x1f,0xdf,0x8e,0x82,0xe0,0x2, 0x1f,0x5e, +0x8e,0xf, 0x26,0x8f,0xea,0x11,0x79,0x84,0x9f,0x83,0x27,0x85,0x17,0x81,0xe1,0x2f, +0x3e,0x1f,0x27,0x96,0x14,0x0, 0x17,0x80,0xaf,0x82,0x17,0x80,0xb7,0x83,0xb, 0x61, +0xe0,0x2, 0x1f,0xdd,0xe2,0x0, 0xce,0x1, 0x8c,0xf, 0x1, 0x15,0xea,0x49,0x7f,0xb0, +0xe9,0xff,0xc7,0xff,0xe0,0xe, 0x36,0xa2,0x3f,0x9e,0xa7,0x8f,0x3f,0x82,0xe0,0x2, +0x1d,0xdd,0xe2,0x0, 0xce,0x1, 0xe0,0x0, 0x8c,0xb, 0xe0,0x1, 0x1, 0xa5,0xe2,0x0, +0xce,0x84,0x1, 0x61,0xe0,0x1, 0x1f,0xc1,0xe0,0x6, 0x9a,0x2e,0x8d,0x8f,0xe0,0x1, +0x1f,0xc0,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0x7f,0xe0,0x1, 0x5, 0x91,0xe0,0x1, +0x1f,0xbf,0x8d,0x8f,0xe0,0x1, 0x1f,0xbe,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0x7f, +0xe0,0x1, 0x3, 0x86,0xe0,0x1, 0x1f,0xbd,0xe0,0x6, 0x9a,0xbe,0x8d,0x8f,0xe0,0x1, +0x1f,0xbc,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0xff,0xe0,0x0, 0x5, 0xf9,0xe0,0x1, +0x1f,0xbb,0x8f,0xf, 0xe0,0x1, 0x1f,0xba,0x37,0x28,0x8f,0x8f,0x3f,0xce,0x3a,0xff, +0xe0,0x0, 0x3, 0xee,0xe2,0x0, 0xce,0x84,0xe0,0x1, 0x2, 0x9d,0xea,0x49,0x7f,0xc4, +0xe9,0xff,0xc7,0xff,0x36,0xa2,0x3f,0x9d,0xa7,0x8f,0x3f,0x82,0x12,0x80,0x3a,0x65, +0x17,0x81,0xe0,0x2c,0x3e,0xf, 0xe0,0x0, 0x26,0x59,0xe0,0x0, 0x2c,0x57,0xea,0x10, +0x7f,0xfc,0xea,0x10,0x7f,0x7e,0xb2,0x8f,0xe0,0x1, 0x1f,0xb9,0xb2,0xe, 0xea,0x11, +0x79,0x84,0x8e,0x8f,0xe0,0x1, 0x1f,0xb8,0x8f,0xf, 0xe0,0x1, 0x1f,0xb7,0x37,0x28, +0x8b,0xf, 0xe0,0x1, 0x1f,0xb6,0x36,0xa8,0x8f,0x8f,0x3b,0x4d,0x3f,0xce,0x9f,0x3, +0xe0,0xf, 0x3b,0x2f,0x3f,0x7f,0xe7,0xfe,0x2, 0x7f,0xe0,0x1, 0x1f,0xb5,0x8c,0xf, +0xdf,0x2d,0xe7,0xfe,0x24,0x79,0xea,0x11,0x7f,0x80,0xea,0x11,0x7f,0x2, 0x14,0x0, +0xb2,0x8f,0x17,0x83,0xb2,0xe, 0xaf,0x82,0xb3,0x3, 0xb, 0x61,0xea,0x11,0x79,0x84, +0x14,0x24,0xe7,0xfe,0x0, 0xea,0x2e,0x14,0xe2,0x0, 0xce,0x81,0xe0,0x0, 0x1, 0x44, +0xe0,0x1, 0x1f,0xb4,0x3c,0x6c,0x8e,0x8f,0xe0,0x1, 0x1f,0xb3,0x36,0xa8,0x8f,0xf, +0xea,0x11,0x7f,0x84,0x3f,0x4d,0x16,0x84,0xae,0x82,0xb7,0xf, 0xb, 0x61,0x12,0x80, +0x3a,0x65,0xe0,0x1, 0x1e,0xb2,0xea,0x10,0x7f,0x7e,0xea,0x10,0x7f,0xfc,0x8c,0xd, +0xb2,0xe, 0xb2,0x8f,0xde,0xfb,0x24,0x3, 0x14,0x0, 0xb, 0x61,0xea,0x11,0x79,0x84, +0xe7,0xfe,0x0, 0xc2,0xe2,0x0, 0xce,0x84,0xe7,0xfe,0x5, 0xca,0xe7,0xfe,0x0, 0xbc, +0xe0,0x43,0x3a,0x14,0xe0,0x43,0x3a,0x95,0x0, 0xe5,0x2c,0x6f,0xea,0x11,0x7f,0x0, +0xea,0x11,0x7f,0x82,0xb2,0x8e,0xe0,0x1, 0x1f,0x39,0xb2,0xf, 0xea,0x11,0x7f,0x84, +0x8e,0x8e,0xe0,0x1, 0x1f,0x37,0x36,0xa8,0x8f,0xe, 0x3f,0x4d,0x16,0x81,0xae,0x82, +0xb7,0xf, 0xb, 0x61,0xe0,0x1, 0x1f,0xb9,0x3c,0x6c,0x8e,0x8f,0xe0,0x1, 0x1f,0xb7, +0x36,0xa8,0x8f,0xf, 0xea,0x11,0x7f,0x84,0x3f,0x4d,0x16,0x82,0xae,0x82,0xb7,0xf, +0xb, 0x61,0xea,0x11,0x79,0x84,0x14,0x0, 0xe7,0xfe,0x0, 0x8f,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xe2,0x0, 0xcc,0x1, 0x39,0x69,0xe0,0x0, 0x5, 0xd1,0x12,0xfe,0xf0,0x0, +0x1d,0xd0,0x3a,0x98,0xe0,0x0, 0x1f,0xcc,0xea,0x11,0x7a,0xc, 0xe2,0x1, 0xc2,0xff, +0xfa,0x11,0x7f,0x2c,0xc2,0x81,0xf0,0x0, 0x14,0x80,0xe8,0x0, 0x93,0x8b,0x93,0xf, +0x3a,0x94,0xf8,0x40,0x3e,0x69,0xf0,0x0, 0x14,0x1, 0x8c,0x4, 0xf0,0x80,0x8e,0x94, +0xe8,0x0, 0x8c,0x8e,0xf8,0x80,0x8d,0x1e,0xe8,0x8, 0x3c,0x2d,0xe8,0x9, 0x3c,0xaa, +0x34,0x24,0xe0,0x9, 0xd3,0x75,0x39,0xe8,0x8c,0x14,0xe8,0x0, 0x8c,0x9e,0xf0,0x8, +0x3e,0xa8,0xf0,0x9, 0x3d,0x29,0x34,0x24,0xe0,0x9, 0xd3,0x6a,0xe0,0xf, 0x39,0xa8, +0x16,0x85,0x3e,0x9f,0x17,0x1, 0x3f,0x12,0xe2,0x0, 0xce,0x8b,0xe2,0x1, 0xc7,0x7f, +0xe0,0x62,0x3b,0xae,0x3f,0xf7,0x39,0xef,0x5, 0x5, 0xe0,0x43,0x3b,0x9f,0xf8,0x40, +0x3e,0x68,0x3f,0xf6,0x3, 0x5, 0xe0,0x43,0x3b,0x13,0xf8,0x40,0x3c,0xe8,0x3a,0x75, +0x1, 0xcd,0xf0,0x0, 0x2e,0x8, 0xf0,0x0, 0x2c,0x89,0x3c,0x62,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe8,0x0, 0xb3,0x8b,0x0, 0xf8,0xe0,0x0, 0x1f,0xcc,0xb3,0xf, 0x0, 0xf6, +0x8, 0xb7,0x12,0x0, 0x16,0xff,0xf0,0x0, 0x13,0x9f,0x3e,0x98,0xf0,0x17,0x3b,0x98, +0xc4,0xff,0x3d,0x64,0x3c,0x64,0x3d,0xe4,0xe0,0x40,0x3e,0x64,0xe0,0x80,0x8f,0x9d, +0xe0,0x80,0x8f,0x19,0xe0,0x3, 0x3f,0xbf,0xe0,0x5, 0x3f,0x3e,0xe0,0x2, 0x3f,0x3f, +0xf0,0x40,0x3b,0xfd,0x3e,0x1e,0x3d,0x9f,0x3c,0x15,0x3d,0x13,0x3a,0x12,0x1, 0xef, +0xe0,0x2, 0x36,0x5, 0xe4,0x0, 0xc4,0x64,0xe0,0x0, 0x12,0xe4,0x3a,0xba,0xe0,0x4, +0x14,0xb5,0xe0,0x6, 0x39,0x32,0xe0,0x3, 0x35,0x85,0xe0,0x9, 0xd3,0x11,0xe0,0x6, +0x3c,0x26,0xe0,0x4, 0x14,0xb5,0x3c,0x65,0xe0,0x9, 0xd3,0xa, 0xe0,0x7, 0x39,0xb3, +0x17,0x80,0xe0,0x2f,0x3b,0xf, 0xe0,0x7, 0x3c,0x27,0xe0,0x0, 0x14,0x64,0x2f,0x9d, +0xe0,0x25,0x3b,0x8f,0x2a,0x9a,0x3c,0x34,0xe0,0x4, 0x14,0xb5,0x39,0x33,0xe0,0x9, +0xd2,0xf7,0xe0,0x2, 0x3c,0x22,0xe0,0x0, 0x14,0x64,0x3c,0x32,0x3c,0xe6,0xe0,0x9, +0xd2,0xef,0x3c,0x32,0x3c,0xe7,0xe0,0x9, 0xd2,0xeb,0xe0,0x43,0x3f,0x98,0xe2,0x0, +0xcf,0x80,0x4, 0x6, 0xe0,0x43,0x3c,0x18,0xe2,0x1, 0xc4,0x7f,0xb, 0xe1,0x3c,0x65, +0x0, 0xfa,0x8, 0xb1,0xea,0x11,0x7f,0x87,0x8f,0x8f,0xe0,0xe, 0x34,0xa1,0xe0,0xd, +0x35,0x21,0x3f,0x18,0xc7,0xff,0x3c,0x1d,0x86,0x9e,0x3c,0xff,0x16,0x0, 0x38,0xed, +0x85,0x98,0xe0,0x61,0x39,0xac,0x3e,0x61,0x2d,0x88,0x3c,0xfa,0xb6,0x88,0x1, 0x2, +0xb5,0x8e,0x3c,0xff,0x1, 0xb, 0x8, 0xe1,0x3c,0xfa,0x1, 0x7c,0x3e,0x9b,0x36,0x81, +0xb6,0x88,0x3c,0xff,0x16,0x80,0xb6,0x8e,0x1, 0xf7,0xb6,0x8, 0x8, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0xc, 0xea,0x11,0x7b,0xab,0xea,0x11, +0x7e,0xb, 0x16,0xa0,0x7e,0x6, 0xc4,0x7e,0xc4,0xfe,0x3e,0x97,0xe0,0x40,0x3f,0xec, +0xe0,0x80,0x97,0x18,0xe0,0x80,0xaf,0x17,0x3e,0xf7,0xe0,0x80,0x97,0x19,0xe0,0x80, +0xaf,0x1f,0x1, 0xf7,0xe0,0x2, 0x1f,0x86,0x8a,0xf, 0xe0,0x4, 0x22,0x5c,0xfa,0x11, +0x79,0xac,0xf8,0x40,0x3c,0x63,0xe0,0x2, 0x1f,0x29,0xf8,0x0, 0x8d,0x88,0x17,0x80, +0xf0,0x40,0x3d,0x6e,0x7f,0x9, 0xf0,0xc, 0x35,0xa4,0xe0,0x7, 0x17,0x68,0xf0,0x0, +0x16,0xd3,0xe8,0x40,0x39,0xea,0x7f,0x87,0xf0,0x40,0x3c,0xef,0x7e,0xb, 0xf0,0x1d, +0x3e,0x90,0x7f,0x88,0xf0,0x40,0x3e,0x6f,0x7f,0x8a,0x13,0x20,0xe0,0x0, 0x7f,0xc, +0xf0,0x40,0x3d,0x67,0xe0,0x0, 0x15,0x44,0x3c,0xe3,0xe2,0x0, 0x7c,0x34,0xe0,0x9, +0xd2,0xd1,0xe0,0x0, 0x1f,0xcc,0xe0,0xff,0x16,0x7f,0xe0,0x0, 0x1f,0x50,0xb6,0xf, +0x16,0x33,0x17,0x80,0x15,0x0, 0x3e,0x10,0xb7,0x8e,0xe8,0x40,0x3d,0xe8,0xe8,0x40, +0x3c,0x6d,0x64,0x86,0xf8,0x40,0x3b,0x68,0xe8,0x40,0x3e,0xeb,0xe8,0x40,0x3a,0xec, +0xe8,0x40,0x39,0x6c,0xe8,0x40,0x3b,0xec,0xf8,0x40,0x3f,0x6c,0x0, 0x83,0xe8,0x80, +0x8e,0x96,0xf0,0x80,0x8b,0x9c,0xe3,0xff,0xc6,0xff,0xf0,0xe, 0x3b,0xad,0xe0,0x43, +0x3f,0x9e,0xe8,0xd, 0x3e,0xa7,0xe2,0x0, 0xcf,0x80,0xe0,0x43,0x3e,0x9d,0xe0,0x6f, +0x3d,0x2d,0xf0,0x80,0x8b,0x98,0xe0,0x80,0x8e,0x99,0xe8,0x40,0x3f,0xfe,0xf0,0xe, +0x3b,0xad,0xe0,0x7e,0x3b,0x2f,0xe2,0x0, 0xcf,0x0, 0xe8,0xd, 0x3e,0xa7,0xe0,0x6e, +0x3d,0x2d,0xf0,0x40,0x3b,0xee,0xf3,0xff,0xc3,0xff,0xe3,0xff,0xc7,0xff,0xe8,0xd, +0x3f,0x97,0x3f,0x77,0xe8,0x5, 0x3a,0x97,0xf0,0x43,0x3b,0x9d,0xe0,0x67,0x3b,0x2e, +0xf0,0x40,0x3b,0xfa,0x3f,0x92,0xe0,0x43,0x39,0x1f,0xe0,0x43,0x3a,0x95,0x3, 0x2, +0x3e,0xea,0xf0,0x40,0x3e,0xfc,0xe0,0x43,0x3d,0x1d,0x1, 0xc2,0xe8,0x40,0x3e,0x6b, +0x17,0x0, 0xe0,0x0, 0x16,0xff,0x0, 0x83,0xe0,0x80,0x8e,0x1b,0xe4,0xf, 0x36,0x28, +0xf0,0x40,0x3b,0xed,0xe4,0x8, 0x37,0xc8,0xf2,0x1, 0xc3,0xff,0xf0,0x40,0x3b,0xf8, +0x3c,0xee,0xe2,0x1, 0xc4,0xff,0x3f,0xe8,0x5, 0x82,0x3e,0xec,0x3c,0xff,0xe2,0x1, +0xc6,0xff,0x3, 0x82,0x3f,0x6c,0xf0,0x40,0x3d,0x7b,0xe2,0x1, 0xc7,0x7f,0x1, 0xe5, +0xf0,0x2f,0x3f,0x16,0xe0,0x1, 0x27,0xdc,0xe0,0x2f,0x3b,0x96,0xe0,0x1, 0x27,0xd8, +0xf0,0x0, 0xc4,0x81,0xf2,0x1, 0xc4,0xff,0xf0,0x40,0x3c,0xf4,0xe0,0x0, 0xc1,0xc4, +0xe7,0xfe,0x1, 0xea,0xe0,0x9, 0x3f,0x2d,0x64,0xb, 0xe2,0x1, 0xc4,0xff,0xe0,0x9, +0xd1,0xd7,0x67,0x88,0x3a,0x68,0xc7,0xff,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0xe0,0x1, +0x17,0xfd,0xe1,0x2f,0x3f,0xae,0xe2,0x1, 0xc2,0x7f,0xe0,0x2, 0x27,0xc9,0x66,0xa, +0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3e,0x1f,0xe0,0x2, 0x27,0xc2,0x67,0x87,0xeb,0xc8, +0x79,0x78,0xea,0x11,0x79,0x88,0x67,0x8, 0xc7,0x81,0xf0,0x0, 0x66,0x7, 0xaf,0x82, +0xaf,0x3, 0xe0,0x0, 0x17,0xc4,0xe8,0xf, 0x3f,0xbc,0x67,0x9, 0x3f,0x1f,0xe0,0x8, +0x87,0x2e,0xc7,0x4f,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x2, 0x5, 0x9c, +0x67,0x8, 0xe2,0x0, 0xcf,0x31,0xe0,0x2, 0x1, 0x0, 0x67,0x8, 0xe2,0x0, 0xcf,0x50, +0xe0,0x2, 0x1, 0x58,0x67,0x88,0xe2,0x0, 0xcf,0xb3,0xe0,0x1, 0x1, 0x84,0xe2,0x0, +0xca,0x8, 0xe0,0x0, 0x2, 0xfb,0x14,0x80,0x14,0x1e,0xdd,0xf1,0xe0,0x0, 0x1f,0xcc, +0x97,0x8f,0xe3,0xff,0xcf,0xca,0xe0,0x2, 0x3, 0x55,0xf0,0x2, 0x1a,0xad,0xf0,0x2, +0x1a,0x3, 0xf0,0x2, 0x19,0x35,0xf0,0x0, 0x18,0xa5,0xea,0x11,0x7d,0x2c,0x12,0x0, +0x17,0x80,0xea,0x11,0x7c,0x8c,0xf0,0x0, 0x13,0x9d,0xe8,0x0, 0xb7,0x85,0xe8,0x0, +0xb7,0x84,0xf0,0x17,0x3b,0x9a,0xe8,0x0, 0xb7,0x82,0x3a,0xe4,0xe8,0x0, 0xb7,0x81, +0xf0,0x40,0x39,0xe4,0x3c,0x64,0xf0,0x40,0x3b,0x64,0x3b,0x64,0xf0,0x40,0x3c,0x64, +0xf0,0x40,0x38,0x64,0x3e,0xe4,0x13,0x81,0x0, 0x90,0xe2,0x0, 0xcd,0x80,0xe0,0x43, +0x3a,0x9e,0x3a,0x67,0xe0,0xe, 0x3f,0x96,0x4, 0x28,0xe0,0x43,0x3b,0x1e,0xf0,0x40, +0x3b,0x67,0xf0,0x40,0x3b,0xfa,0x1, 0x29,0x8d,0x8a,0x8f,0x1a,0x8f,0x99,0xf0,0x0, +0x8c,0x89,0x3f,0x2b,0x3e,0x6e,0xe8,0xf, 0x3f,0xa9,0xe2,0x0, 0xcf,0x0, 0xe3,0xff, +0xc7,0xff,0xe3,0xff,0xc6,0x7f,0xc5,0x1, 0xe0,0x43,0x3d,0x9f,0xc4,0x81,0xe0,0xe, +0x3e,0x15,0x3, 0x5c,0xe2,0x0, 0xcd,0x80,0x3e,0x18,0xe0,0x43,0x3c,0x1c,0xf0,0x40, +0x39,0xe7,0xe0,0xe, 0x3f,0x96,0x3, 0x5a,0x3f,0x9d,0xe0,0x43,0x3e,0x9f,0xf0,0x40, +0x38,0x6d,0xf0,0x40,0x3c,0x67,0x0, 0xd6,0xf0,0x2, 0x2c,0x11,0xf0,0x0, 0x23,0x4, +0xe8,0x0, 0xb3,0x2, 0xf0,0x0, 0x21,0x84,0xe8,0x0, 0xb4,0x4, 0x22,0x3, 0xe8,0x0, +0xb2,0x85,0xe3,0xff,0xce,0xe3,0x4, 0x6, 0xe0,0x0, 0x17,0xfc,0xaf,0x82,0x17,0x80, +0xaf,0x83,0xe0,0x0, 0xc0,0x74,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x16,0x30,0xf0,0x2f, +0x3f,0x1c,0xe7,0xfe,0x2f,0xa7,0xe0,0x2f,0x3b,0x9c,0xe7,0xfe,0x2f,0xa3,0xe2,0x6, +0xc9,0x0, 0xe7,0xfe,0x2, 0x1f,0xeb,0xc8,0x7f,0xf9,0x8f,0x8f,0x16,0xc, 0x3e,0x3f, +0x3a,0xfc,0xe7,0xfe,0x2, 0x17,0xe8,0x40,0x3c,0xe8,0xe2,0x0, 0x7c,0x34,0x7e,0x82, +0x7f,0x1, 0x7d,0x3, 0x7f,0x84,0xdd,0xb5,0xea,0x11,0x7c,0x8c,0x3d,0xe8,0xe2,0x0, +0x7c,0x54,0x7d,0x85,0xdd,0xae,0x16,0x3b,0xe1,0x29,0x3e,0x28,0x65,0x85,0x66,0x82, +0x67,0x1, 0xe7,0xfd,0x2c,0xff,0xe1,0x2c,0x3e,0x2b,0xe7,0xfd,0x2e,0x7b,0xe0,0x16, +0x3d,0xbb,0xe0,0xc, 0x3c,0x38,0xe0,0x9, 0x3d,0x98,0xf0,0x8, 0x3b,0x1c,0xe0,0x9, +0xd1,0x1a,0x3d,0xe8,0xe2,0x1, 0xc5,0xff,0xe2,0x0, 0xcd,0xd9,0x65,0x3, 0x66,0x82, +0x67,0x1, 0x67,0x84,0xe0,0x0, 0x5, 0xd9,0xe0,0x0, 0x16,0x64,0xf0,0xf, 0x3f,0x17, +0x3e,0x2b,0x36,0x21,0x3f,0x9a,0x3f,0x9c,0x66,0xc, 0xe0,0x43,0x3f,0x9f,0x3f,0xfc, +0x3, 0x8, 0xe0,0x0, 0x4e,0x76,0x7f,0x8c,0x7e,0x8, 0x7d,0x8a,0xf0,0x0, 0x7c,0x87, +0xe0,0x0, 0x17,0xc5,0x66,0xa, 0xe1,0x2f,0x3e,0x1f,0xe7,0xfd,0x27,0xcb,0x66,0x8, +0xe0,0x1, 0x17,0xff,0xe0,0x2f,0x3e,0xf, 0xe7,0xfd,0x27,0xc4,0x17,0x80,0x7f,0x88, +0x7f,0x8a,0xe7,0xfd,0x0, 0xbf,0x66,0x9, 0x3f,0x9c,0xe0,0x8, 0x8f,0xf, 0xe2,0x0, +0xcf,0x5, 0xe7,0xff,0x1, 0x88,0xe0,0x8, 0x8f,0x9f,0xe2,0x1, 0xcf,0xb3,0xe7,0xff, +0x1, 0x82,0x14,0x80,0x14,0xa, 0xdc,0xf3,0xe2,0x0, 0xcc,0x2, 0xe7,0xfe,0x2, 0xfb, +0xe7,0xfe,0x0, 0xf4,0xea,0x11,0x7f,0x6, 0x87,0xe, 0xe2,0x0, 0xcf,0x2, 0xe7,0xfd, +0x5, 0x61,0xe0,0x0, 0x17,0x7c,0xaf,0x2, 0xe7,0xfd,0x0, 0xdc,0xf0,0x0, 0x66,0x7, +0xea,0x11,0x79,0x88,0xeb,0xc8,0x79,0x78,0x8e,0x3, 0xe0,0x0, 0x17,0xfc,0x7e,0x8, +0xaf,0x82,0xe7,0xfd,0x0, 0xc0,0xf2,0x0, 0xcf,0x1f,0xe7,0xff,0x2, 0x3b,0xe0,0xc, +0x37,0x81,0x3b,0xfc,0xe7,0xff,0x3, 0x36,0xf2,0x0, 0xcf,0xf, 0x5, 0x6, 0xe0,0xc, +0x37,0x82,0x3b,0xfc,0xe7,0xff,0x3, 0x2e,0xe2,0x1, 0xc9,0x7f,0x2, 0x39,0x14,0x86, +0xe0,0x8, 0x37,0xa5,0x7d,0x3, 0x7d,0x85,0x7e,0x82,0x7f,0x1, 0xe0,0x9, 0xd0,0x58, +0xe0,0x28,0x3c,0x15,0x65,0x3, 0x65,0x85,0x66,0x82,0x67,0x1, 0xe7,0xff,0x24,0x1a, +0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3d,0x9f,0xe7,0xff,0x27,0x94,0xe7,0xfe,0x0, 0xfe, +0x14,0x80,0x14,0xa, 0xdc,0xa4,0xe2,0x0, 0xcc,0x6, 0xe7,0xfe,0x2, 0xac,0xe7,0xfe, +0x0, 0xa5,0xe0,0x2, 0x1f,0xa9,0xf0,0x40,0x3e,0x64,0x7f,0x89,0xe7,0xff,0x0, 0xba, +0xe0,0x0, 0x1e,0xd0,0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x96,0x8d,0x3f,0xae, +0x3f,0x9d,0xe2,0x1, 0xcf,0x95,0xe7,0xfd,0x2, 0x22,0xe7,0xfe,0x0, 0x8f,0xe0,0xc, +0x37,0xa2,0xe0,0x2c,0x3a,0xac,0xe7,0xfe,0x2e,0x6d,0xe0,0x2, 0x16,0x54,0xe0,0x22, +0x39,0x1c,0xe7,0xfe,0x29,0x67,0xe7,0xff,0x0, 0xbc,0xf8,0x0, 0xb0,0x1, 0xe7,0xfd, +0x0, 0xef,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xf4,0xc0,0x58,0xea,0x11, +0x79,0x87,0x3a,0x6a,0xeb,0xc8,0x79,0x78,0xe2,0x1, 0xc2,0x7f,0x17,0xff,0xaa,0x3, +0xaf,0x82,0xe0,0x0, 0x25,0x65,0x16,0x7f,0x3e,0x1a,0xe3,0xff,0xc6,0x7f,0xc6,0x1, +0x36,0x22,0xe0,0x3, 0x17,0x6a,0xe0,0x7, 0x17,0xca,0x3f,0x10,0x3f,0x90,0x3e,0x18, +0x96,0x88,0xc4,0x4, 0xe0,0x80,0xb6,0x9e,0x3e,0x78,0xe0,0x40,0x96,0x98,0xe0,0x80, +0xb6,0x9f,0x1, 0xf7,0xe2,0x0, 0xca,0x4, 0xe0,0x0, 0x5, 0xca,0xf0,0x1, 0x94,0x69, +0xf0,0x1, 0x94,0xf9,0xf8,0x40,0x3c,0x79,0xe0,0x0, 0x4, 0x57,0xe8,0x40,0x3c,0xe9, +0xf0,0x2, 0x24,0xaf,0xe8,0x40,0x3c,0x68,0xe0,0x8, 0xdf,0xda,0xeb,0xc8,0x7b,0x79, +0xe0,0x0, 0x17,0xc0,0xe0,0x43,0x3a,0x88,0xaf,0x86,0xea,0x11,0x7f,0x86,0xe2,0x0, +0xca,0x84,0xaa,0x8f,0xe0,0x0, 0x5, 0x60,0xe0,0x0, 0x17,0xfd,0xaf,0x82,0x14,0x87, +0xe0,0x1, 0x1f,0xb1,0xe0,0x1, 0x1f,0x30,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x3c,0x4f, +0x34,0x21,0xe0,0x8, 0xdf,0xbd,0xe8,0x40,0x3c,0x78,0xe0,0x2, 0x5, 0x2, 0xe0,0x1, +0x1f,0xaf,0xe0,0x1, 0x1f,0x2e,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x14,0x86,0x3c,0x4f, +0xe0,0x8, 0xdf,0xf1,0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0xf8,0xe0,0x1, 0x3, 0x71, +0xe0,0x0, 0x17,0xfd,0xaf,0x82,0xe0,0x0, 0x16,0xfd,0x0, 0x86,0xe0,0x0, 0x17,0xff, +0xaf,0x82,0xe0,0x0, 0x16,0xff,0xe0,0x2, 0x1f,0x86,0x17,0x0, 0x87,0x8f,0xaf,0x3, +0x3f,0xfd,0x14,0x0, 0x4, 0x4, 0xea,0x11,0x7f,0x88,0x8c,0xf, 0xe0,0xb, 0xc0,0x28, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x7, 0x34,0x21,0xf0,0x1, 0x24,0x5f,0xe8,0x40, +0x3c,0xe8,0xe8,0x40,0x3c,0x69,0xe0,0x8, 0xdf,0x83,0xf0,0x40,0x3c,0xf7,0xe0,0x43, +0x3a,0x88,0xeb,0xc8,0x7b,0x79,0xe0,0x1, 0x3, 0x47,0x3c,0xe7,0xf0,0x8, 0x34,0xa7, +0xe0,0x8, 0xdf,0xb9,0xea,0x11,0x7f,0x86,0xe2,0x0, 0xca,0x84,0xac,0x6, 0xaa,0x8f, +0xe7,0xff,0x2, 0x24,0xe0,0x3, 0x1f,0x88,0xf0,0x0, 0x15,0x1, 0xe0,0x1, 0x9f,0x6f, +0xe0,0x1, 0x9e,0xff,0xe2,0x0, 0xcf,0x0, 0xf8,0x40,0x3d,0xea,0xe0,0x7b,0x39,0xae, +0x8b,0x6, 0xe0,0x3, 0x12,0xec,0xe2,0x0, 0xce,0x80,0xf0,0x7, 0x16,0xcc,0xe0,0x1, +0x9f,0xf, 0x3a,0x90,0xf0,0x1d,0x3e,0x90,0xf0,0x0, 0x9e,0x7f,0x7b,0x2, 0xe0,0x7a, +0x39,0xad,0x7f,0x1, 0xe8,0x40,0x3b,0xed,0x3b,0x65,0xf0,0x0, 0x17,0x0, 0x67,0x81, +0x94,0x6, 0xe8,0x40,0x3c,0xeb,0x3c,0x2f,0x34,0x26,0xe0,0x8, 0xdf,0x84,0x97,0x87, +0xe1,0x80,0xb4,0x16,0xe8,0xf, 0x3f,0xac,0x64,0x2, 0xe8,0x40,0x3c,0xea,0x3c,0x3f, +0xe0,0x8, 0xdf,0x79,0x15,0x1, 0xe8,0xa, 0x3d,0x1e,0xf0,0x40,0x3f,0x6a,0xf2,0x1, +0xc7,0x7f,0xe8,0x40,0x3a,0x7e,0xe1,0x80,0xb4,0x17,0x1, 0xe2,0xe0,0x3, 0x53,0x66, +0xe0,0x3, 0x4b,0xed,0xf0,0x0, 0x11,0x8c,0xf0,0x1, 0x12,0x7c,0x12,0x1, 0xf0,0x13, +0x39,0x90,0xf0,0x14,0x3a,0x10,0xe2,0x1, 0xc3,0x7f,0xe8,0x0, 0xab,0x83,0xf8,0x40, +0x3b,0x6d,0xe8,0x0, 0xab,0x4, 0xf0,0x40,0x3b,0xe5,0x3c,0x64,0xf0,0x40,0x3a,0xe4, +0xf0,0x0, 0x11,0x7, 0xf0,0x0, 0x10,0x83,0x0, 0x8b,0xe8,0x2f,0x3d,0x95,0x2f,0xaf, +0xc4,0x1, 0xe2,0x1, 0xc4,0x7f,0xe8,0x40,0x3c,0x7e,0xe0,0x1, 0x1, 0x23,0xe8,0x80, +0x94,0x97,0xf8,0x80,0x90,0x16,0xe2,0x1, 0xc4,0xff,0xe0,0xd, 0x3c,0xa7,0xe2,0x1, +0xc6,0xff,0xf2,0x1, 0xc0,0x7f,0xe0,0x43,0x3e,0xd, 0xf0,0xf, 0x38,0x26,0xe2,0x0, +0xce,0x0, 0xe2,0x1, 0xc7,0xff,0xe0,0x41,0x3e,0xcd,0xe0,0x43,0x3d,0x8f,0xe0,0x43, +0x3e,0x8d,0xe0,0x6c,0x3c,0x2d,0xe0,0x41,0x3f,0xcf,0xe2,0x0, 0xcd,0x80,0xe0,0x43, +0x3f,0x8f,0xe8,0x2d,0x3e,0x15,0xe0,0x6b,0x3c,0x2f,0x26,0xd0,0xe2,0x1, 0xca,0x6c, +0xe0,0x1, 0x2, 0xc5,0xe8,0x2f,0x3e,0x12,0x2f,0xad,0xe8,0x2f,0x3d,0x92,0x2f,0xaa, +0xe8,0x2c,0x3e,0x11,0xe0,0x0, 0x2e,0x5d,0xe8,0x2b,0x3d,0x91,0xe0,0x0, 0x2d,0xd9, +0xf0,0xd, 0x39,0x94,0xf0,0xf, 0x3a,0x14,0xc2,0x1, 0xac,0x8d,0xe2,0x1, 0xc2,0x7f, +0xf0,0x0, 0xa8,0xf, 0xe8,0x40,0x3b,0x60,0x3b,0xe9,0xe7,0xff,0x0, 0xb3,0x86,0x82, +0xe7,0xfe,0x0, 0x9b,0xe7,0xff,0x17,0x80,0xaf,0x86,0xe7,0xfd,0x0, 0xe0,0x14,0x81, +0xf0,0x40,0x3c,0xe9,0xe7,0xfd,0x0, 0xd0,0x13,0x82,0xf0,0x0, 0x14,0x1, 0xe7,0xfe, +0x0, 0xa0,0x17,0x81,0x3f,0x94,0xe0,0xb, 0x3b,0x99,0xe8,0xc, 0x3b,0x10,0xe2,0x1, +0xc7,0xff,0x35,0x81,0x36,0x1, 0x16,0xff,0xf0,0x1b,0x39,0x9f,0xf0,0x1a,0x3a,0x1f, +0x3e,0x9f,0x3b,0x9b,0x3b,0x1c,0xe8,0x0, 0xad,0x8b,0xf0,0x1c,0x39,0x9d,0xe8,0x0, +0xae,0xa, 0xe0,0xb, 0x33,0x81,0xe8,0xd, 0x3e,0x94,0xe0,0xc, 0x33,0x1, 0xe8,0x0, +0xad,0x8c,0xc7,0x81,0xae,0xd, 0xf0,0xb, 0x39,0x9f,0xe8,0x0, 0x8e,0xb, 0xe8,0x0, +0x8e,0x8a,0x3e,0x19,0xe8,0xd, 0x3e,0x90,0x36,0x1, 0xe8,0xf, 0x3f,0x94,0x36,0x81, +0xc2,0x3, 0xae,0xb, 0xe2,0x1, 0xc2,0x7f,0xae,0x8f,0xe7,0xff,0x0, 0xab,0xe0,0xd, +0x3b,0x99,0xe8,0xf, 0x3b,0x10,0xf0,0xb, 0x39,0x94,0xf0,0xc, 0x3a,0x14,0x36,0x81, +0x37,0x81,0xc2,0x1, 0xae,0x8b,0xe2,0x1, 0xc2,0x7f,0xaf,0x8c,0xe7,0xff,0x0, 0x9a, +0xe2,0x0, 0xca,0x1, 0xaa,0x3, 0x1, 0x1a,0x15,0x7e,0x3d,0x14,0xe2,0x1, 0xc5,0x7f, +0x17,0x8c,0x3f,0x90,0xc5,0x1, 0xe0,0x1, 0x16,0xfc,0x3e,0x90,0xe0,0xa, 0x3d,0x1f, +0xe0,0x80,0x8d,0x9f,0xe0,0x80,0x8e,0x1d,0x3f,0xfa,0xe0,0x80,0xb5,0x95,0xe8,0x80, +0xb6,0x1d,0x1, 0xf7,0xe2,0x0, 0xca,0x1f,0x2, 0x86,0xe0,0x0, 0x17,0xfe,0xaf,0x82, +0xe7,0xfc,0x0, 0xf7,0x12,0x82,0xf0,0x40,0x3d,0x65,0x3c,0xe4,0xe0,0x8, 0x32,0xa5, +0xe0,0x8, 0xde,0x79,0xe2,0x0, 0xcc,0x2, 0xe8,0x40,0x3b,0x6a,0xe0,0x66,0x3b,0xa8, +0x13,0xff,0x3b,0x95,0xc3,0x7f,0xe2,0x1, 0xc3,0xff,0xe2,0x1, 0xc3,0x7f,0x3c,0xe7, +0x3d,0x66,0xe2,0x3, 0x7c,0x6c,0xdb,0x46,0x3d,0x66,0x3c,0xe7,0xe2,0x7, 0x7c,0x4c, +0xc2,0x81,0xdb,0x40,0xe2,0x1, 0xc2,0xff,0x3a,0xf4,0x5, 0xe0,0xe2,0x7, 0x7c,0xcc, +0xe2,0x3, 0x7c,0x6c,0xdb,0x5e,0xe7,0xfc,0x0, 0xcc,0xaa,0x3, 0xe7,0xff,0x0, 0xb6, +0xf0,0x2, 0x1b,0x36,0xe8,0x0, 0x8d,0x6, 0xe2,0x1, 0xcd,0x6f,0x2, 0x90,0xf0,0x2, +0x1b,0xae,0xe0,0xf, 0x35,0x22,0xc5,0x1, 0xf0,0x17,0x3b,0x9f,0xe2,0x1, 0xc5,0x7f, +0xe8,0x0, 0xb4,0x7, 0xe8,0x0, 0xb4,0x97,0xe8,0x0, 0xad,0x6, 0xe0,0x3, 0x1f,0x88, +0xe0,0x1, 0x9f,0xf, 0x3f,0x78,0xe0,0x1, 0x5, 0xa5,0xe0,0x1, 0xb4,0xf, 0xe0,0x1, +0xb4,0x9f,0x9f,0x7f,0x3f,0x79,0xe0,0x1, 0x5, 0x83,0xb4,0xff,0xb4,0x6f,0xe2,0x0, +0xcd,0xa, 0xe0,0x1, 0x1, 0xa, 0xe2,0x0, 0xcd,0x14,0xe0,0x1, 0x1, 0x1b,0xe2,0x1, +0xcd,0x6f,0xe0,0x1, 0x5, 0xa7,0x8, 0xb1,0xf0,0x0, 0x19,0x8f,0xf0,0x2, 0x1b,0xae, +0xe8,0x0, 0x8c,0x83,0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x12,0x1, 0xe8,0x40,0x3c,0x67, +0xe2,0x0, 0xcc,0x9f,0x2, 0x86,0xc4,0x81,0xe2,0x1, 0xc4,0xff,0xf8,0x40,0x3a,0xe4, +0x17,0xfe,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xc7,0x81,0x37,0xa2,0xe8,0x0, 0x98,0x87, +0xf8,0x0, 0x99,0x17,0xe0,0x2, 0x1e,0xae,0xe0,0x10,0x3c,0x1f,0xf0,0x40,0x3b,0xe8, +0x15,0x0, 0x0, 0xad,0xe8,0xe, 0x3f,0x22,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x3e,0x1e, +0xe2,0x0, 0xce,0x0, 0xe2,0x1, 0xc7,0xff,0x5, 0x30,0xe2,0x1, 0xc7,0x7f,0xf0,0x40, +0x38,0xef,0x3e,0x6e,0xf2,0x1, 0xc0,0xff,0xe2,0x1, 0xc6,0x7f,0xf0,0x40,0x38,0xfc, +0x3, 0x82,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x3f,0xf9,0x4, 0x8d,0xc5,0x1, 0xe2,0x1, +0xc5,0x7f,0xf0,0x0, 0x99,0x3d,0xe0,0xf, 0x35,0x22,0x3f,0x98,0xb5,0x8f,0x38,0xeb, +0xf0,0x0, 0xb1,0x1f,0xc6,0x84,0xe8,0x40,0x3e,0xf0,0x1, 0x12,0x9d,0xad,0x9f,0x3d, +0xe0,0xf, 0x3d,0xa1,0xe3,0xff,0xc7,0xff,0xe0,0x43,0x3e,0x1f,0xe2,0x0, 0xce,0x0, +0x2, 0x4a,0xe0,0x41,0x3f,0xcf,0x0, 0xc7,0xe0,0x41,0x3f,0x4e,0x0, 0xcf,0xe2,0x0, +0xcc,0x9f,0xc5,0x1, 0xe2,0x1, 0xc5,0x7f,0x2, 0x85,0xe2,0x1, 0xcd,0x6b,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0x2a,0xb4,0xe8,0x0, 0xad,0x6, 0x8, 0xe1,0xe0,0x1, 0x9f,0x3f, +0x3f,0x79,0xe7,0xfe,0x3, 0xfe,0xe2,0x0, 0xcd,0xa, 0xe0,0x1, 0xb4,0xbf,0xe0,0x1, +0xb4,0x2f,0xe7,0xfe,0x1, 0xfa,0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f, +0x96,0x7f,0x3e,0xab,0x3f,0x2c,0xe0,0x2, 0xb6,0x8f,0xe0,0x2, 0xb7,0x1f,0x38,0x82, +0x9f,0x4f,0x3f,0x78,0xe7,0xfe,0x3, 0xdf,0xb4,0x4f,0xb4,0xdf,0xe7,0xfe,0x0, 0xdb, +0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f,0x96,0x7f,0x3e,0xab,0x3f,0x2c, +0xe0,0x2, 0xb6,0xaf,0xe0,0x2, 0xb7,0x3f,0x38,0x82,0xe8,0x0, 0xac,0x83,0x0, 0xcc, +0x38,0x82,0xe0,0x1, 0x1c,0x5b,0xe0,0x6e,0x0, 0xe5,0x0, 0x0, 0x17,0xe0,0x3f,0x98, +0xe2,0x0, 0xcf,0x83,0x5, 0x96,0x24,0x14,0xe0,0x2, 0x1e,0xb6,0x16,0x6, 0xe0,0x3, +0x1f,0x88,0xe0,0x2, 0x1f,0x2e,0xe0,0x3, 0x1d,0x87,0xae,0xd, 0xc7,0x84,0x96,0xf, +0x96,0x9f,0xb6,0xe, 0x3f,0xfb,0xc7,0x4, 0xe0,0x40,0xb6,0x9e,0x1, 0xf8,0x38,0x82, +0xe0,0x3, 0x1f,0x8, 0xe0,0x2, 0x1f,0xae,0x95,0xae,0x96,0x3e,0xe0,0x1, 0x96,0xce, +0xe0,0x2, 0x1d,0x36,0xe0,0x1, 0x97,0x5e,0x14,0x82,0xac,0x8a,0xb5,0x8f,0xb6,0x1f, +0xb6,0xaf,0xb7,0x3f,0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x2, +0x1f,0xdf,0xe0,0x2, 0x1f,0x5d,0x8f,0x8f,0x8e,0xe, 0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xfa,0xe0,0x1, 0x1f,0x5b,0x9e,0x8e,0xe0,0x0, 0x26,0xe6,0xe0,0x3, 0x19,0x8, +0x8d,0x82,0x2f,0x95,0x16,0x81,0xe0,0x2d,0x3e,0xd, 0x26,0x91,0x9f,0x8e,0xe2,0x0, +0xcd,0x83,0xb7,0x92,0xe0,0x1, 0x1, 0x61,0xe0,0x2, 0x1f,0xc0,0x17,0x7e,0xe0,0xa, +0xaf,0x3f,0x17,0x80,0xaf,0x82,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x2, 0x1f,0x5e, +0xe0,0xd, 0x8e,0x8e,0xe2,0x0, 0xce,0x81,0x1, 0x70,0xe0,0x6, 0x9a,0xae,0xe0,0x6, +0x9a,0x3e,0xe0,0x0, 0x25,0xfb,0xe2,0x0, 0xcd,0x81,0xe0,0x1, 0x1, 0x55,0xea,0x11, +0x7b,0x50,0xea,0x11,0x7b,0xce,0x97,0x86,0x94,0x87,0xe2,0x0, 0xcd,0x83,0xe0,0xf, +0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff,0xe0,0x2, +0x1, 0x14,0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe2,0x1, 0xc7,0xff,0xe2,0x1, +0xc4,0xff,0xe2,0x0, 0xce,0x80,0xf0,0x0, 0x1c,0xf, 0xe0,0x1, 0x5, 0x20,0xe2,0x0, +0xcf,0x0, 0xe0,0x1, 0x5, 0x2b,0x3e,0xef,0x3f,0x69,0xe2,0x1, 0xc6,0xff,0xe2,0x1, +0xc7,0x7f,0x3e,0xfe,0x3, 0x82,0x3f,0xe9,0xe8,0x0, 0x8f,0x8, 0xe2,0x1, 0xc7,0xff, +0x3f,0x7f,0xe7,0xff,0x3, 0xba,0x3c,0xe4,0x3c,0x65,0xde,0x83,0xb2,0x86,0xb2,0x7, +0xe7,0xff,0x0, 0xb3,0xe0,0x2, 0x1f,0x87,0x17,0x1, 0xaf,0xf, 0x17,0x7e,0xe0,0x2, +0x1f,0xc0,0xe0,0xa, 0xaf,0x3f,0xe0,0x3, 0x1f,0x88,0xae,0x8f,0xf8,0x0, 0xc, 0xa8, +0xb, 0xe1,0xe0,0x0, 0x1f,0xd, 0xe0,0x1a,0x9f,0x5e,0xe2,0x0, 0xcf,0x1e,0xe7,0xff, +0x2, 0x82,0xe0,0x3, 0x19,0x8, 0x8d,0x82,0xe0,0x1, 0x25,0xdd,0xe0,0x1, 0x1f,0x5b, +0x9e,0x8e,0xe7,0xff,0x2e,0x80,0xe0,0x2, 0x1f,0x87,0x17,0x1, 0xaf,0xf, 0x17,0x7e, +0xe0,0x2, 0x1f,0xc0,0xae,0x82,0xe0,0xa, 0xaf,0x3f,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1, +0xe0,0x2, 0x1f,0x5e,0xe0,0xd, 0x8e,0x8e,0xe2,0x0, 0xce,0x81,0xe7,0xfe,0x1, 0x76, +0xe0,0x6, 0x9a,0xae,0xe0,0x6, 0x9a,0x3e,0x11,0x80,0xe7,0xfe,0x2e,0x76,0xf0,0x0, +0x14,0x81,0xe8,0x2f,0x3f,0x89,0xe7,0xfe,0x27,0xf0,0xe0,0x3, 0x1c,0x8, 0x15,0x28, +0x3c,0xe3,0xe0,0x8, 0xdc,0xe1,0xe0,0x2, 0x1c,0x2e,0xe0,0x7, 0x15,0x40,0x3c,0xe3, +0xe0,0x8, 0xdc,0xda,0xe0,0x1, 0x1f,0xad,0xea,0x11,0x7b,0x50,0x8f,0xf, 0xe0,0x1, +0x1f,0xac,0x37,0x28,0x8f,0x8f,0xea,0x11,0x7b,0xce,0x3f,0xce,0xe0,0x2, 0x1f,0x40, +0xf0,0x0, 0x1c,0xf, 0xe0,0xa, 0xa9,0xbe,0x3c,0xe4,0xe0,0x1, 0x1f,0x5b,0xb7,0x8e, +0xe0,0x2, 0x1f,0xb6,0x3c,0x65,0xa9,0x8f,0x17,0x82,0xe8,0x0, 0xaf,0x88,0xb2,0xa2, +0xb2,0x32,0xb2,0xc2,0xb2,0xe2,0xe0,0x1, 0xb2,0x82,0xe0,0x1, 0xb2,0xa2,0xb2,0x52, +0xb2,0x72,0xe0,0x1, 0xb2,0x12,0xe0,0x1, 0xb2,0x32,0xb2,0x86,0xb2,0x7, 0xde,0x1, +0x3c,0xe3,0xf0,0x0, 0xac,0x82,0x3f,0x63,0x3f,0xe3,0xe0,0x41,0x3f,0xcf,0xe2,0x1, +0xc7,0xff,0xe7,0xfe,0x0, 0xde,0x2f,0xbb,0xaf,0x82,0x17,0x7e,0xe0,0x2, 0x1f,0xc0, +0xe0,0xa, 0xaf,0x3f,0xe7,0xfe,0x0, 0xa1,0xe0,0x41,0x3c,0xc9,0xe2,0x1, 0xc4,0xff, +0xe7,0xfe,0x0, 0xd3,0xe0,0x1, 0x1f,0xab,0x9f,0x42,0x8e,0x8f,0xe0,0x1, 0x1f,0xaa, +0xe0,0x1, 0x9e,0x2, 0x8f,0x8f,0x36,0xa8,0x3f,0x2c,0x3f,0xcd,0x3f,0x7f,0xea,0x11, +0x7b,0x50,0xea,0x11,0x7b,0xce,0x2, 0x26,0xe0,0x1, 0x1f,0xa9,0xe0,0x1, 0x9f,0x32, +0x8e,0x8f,0xe0,0x1, 0x1f,0xa8,0x9e,0x72,0x8f,0x8f,0x36,0xa8,0x3f,0x2c,0x3f,0xcd, +0x3f,0x7f,0x2, 0x18,0x97,0x86,0x94,0x87,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29, +0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff,0xe7,0xfe,0x0, 0x95,0xe0,0x1, 0x9c,0xd2, +0xe0,0x1, 0x9c,0x42,0x17,0x84,0xaf,0x82,0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xfb, +0x0, 0xb1,0x97,0x86,0x94,0x87,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff, +0xc7,0xff,0xe3,0xff,0xc4,0xff,0x17,0x3, 0xaf,0x2, 0xe0,0x43,0x3e,0x9f,0xe0,0x43, +0x3f,0x19,0xe0,0x1, 0xb2,0xc2,0xe2,0x1, 0xc7,0xff,0xe0,0x1, 0xb2,0x52,0xe2,0x1, +0xc4,0xff,0xe7,0xfd,0x0, 0xf8,0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe0,0x1, +0xb2,0xc2,0xe2,0x1, 0xc7,0xff,0xe0,0x1, 0xb2,0x52,0xe2,0x1, 0xc4,0xff,0xe7,0xfd, +0x0, 0xea,0x17,0x1, 0xe0,0x2e,0x3e,0xe, 0xe7,0xfe,0x27,0x34,0x3f,0x6f,0xe4,0x0, +0xcf,0x1, 0xe2,0x0, 0xc7,0x1, 0xe7,0xfe,0x27,0x2d,0xe0,0x1, 0x1f,0xdb,0x97,0x8f, +0xb7,0x92,0xe7,0xfd,0x0, 0xa3,0x8, 0xb4,0xe0,0x2, 0x19,0xc0,0xe0,0xa, 0x8f,0x83, +0x27,0x93,0xe0,0x3, 0x19,0x8, 0xde,0x79,0x8f,0x82,0xe2,0x0, 0xcf,0x84,0x1, 0x12, +0xef,0xff,0xd6,0xd0,0x3a,0x68,0x22,0x7, 0xe0,0x2, 0x1f,0xdc,0x17,0x1, 0xe0,0xa, +0xaa,0x33,0xaf,0xf, 0xa, 0x61,0xe0,0x3, 0x1f,0x8, 0xaf,0x8e,0xa, 0x21,0xe7,0xed, +0x0, 0xb7,0x97,0x42,0xe0,0x1, 0x96,0x2, 0xe0,0x1, 0x97,0xb2,0x96,0xf2,0x3f,0x2c, +0x3f,0xad,0xe0,0x1, 0xb7,0x62,0xe0,0x1, 0xb7,0xf2,0xd2,0x7d,0x3a,0x68,0x24,0xc, +0xe2,0x1, 0xca,0x7f,0x17,0x80,0xe0,0x6f,0x39,0xa4,0x3a,0x6f,0x3c,0x64,0xde,0x1f, +0x17,0x80,0xaf,0x82,0x0, 0xd9,0xe0,0x2, 0x1f,0xb6,0xe0,0x2, 0x1c,0x2e,0x8d,0xf, +0x3c,0xe2,0xdb,0x31,0x3a,0x68,0x0, 0xf3,0x8, 0xb4,0xe2,0x0, 0xcc,0x1, 0x39,0xe8, +0x39,0x68,0x17,0x80,0x5, 0x89,0x31,0x41,0xe2,0x0, 0xc9,0x1, 0xc7,0x81,0xe2,0x1, +0xc7,0xff,0x1, 0xfa,0x37,0xc1,0x31,0x3f,0xe4,0x0, 0xc1,0x3, 0x12,0x1, 0x31,0x54, +0x3c,0xe2,0x3c,0x63,0xe0,0x8, 0xdb,0x6f,0x3c,0x12,0x34,0x41,0xe0,0x2, 0x3c,0x22, +0xe0,0x43,0x3f,0x92,0xe0,0x41,0x3f,0x4f,0xe2,0x0, 0xcf,0x80,0xe1,0x2e,0x3f,0x14, +0xe1,0x2f,0x39,0x14,0xe0,0x6f,0x3d,0x2e,0x39,0x68,0x2f,0xeb,0xa, 0x61,0xe0,0x2, +0x1f,0xae,0x34,0x22,0x34,0xa2,0x3c,0x9f,0x3c,0x1f,0x9f,0x88,0x9f,0x9, 0x9c,0x18, +0x3f,0xae,0x9f,0x19,0xe0,0x43,0x3e,0x9f,0xe2,0x0, 0xce,0x80,0x3c,0x2e,0xe0,0x43, +0x3f,0x18,0xe0,0x41,0x3e,0xcd,0xe0,0x6f,0x3d,0x2d,0xe2,0x0, 0xcf,0x0, 0xe0,0x41, +0x3f,0x4e,0xe0,0x68,0x3d,0x2e,0x3f,0xbf,0x3c,0x38,0x3c,0x1f,0xe2,0x0, 0xcc,0x5, +0x2, 0x88,0xe2,0x0, 0xcc,0x2, 0xe0,0xf, 0x34,0x41,0xe0,0x68,0x3b,0xaf,0x38,0x82, +0xe7,0xff,0x0, 0xac,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x1, 0x1f,0xa7, +0x13,0x0, 0xf0,0x0, 0x8e,0xf, 0xe0,0x1, 0x1f,0xa6,0x3a,0x68,0x8f,0x8f,0xf0,0x0, +0x14,0x81,0x7f,0x81,0xf0,0x40,0x3d,0x66,0xf0,0x40,0x3d,0xe6,0xe0,0x0, 0x11,0xa8, +0xe2,0x0, 0xca,0x1, 0xf0,0x0, 0x14,0x0, 0x5, 0xba,0x11,0x1, 0xf8,0x40,0x3e,0xe8, +0xe8,0x40,0x3a,0xe8,0x0, 0x8b,0xe8,0x40,0x3a,0xed,0x3b,0xe8,0xf0,0x40,0x3e,0xe2, +0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x3a,0x72,0x1, 0x2a,0xe8,0x40,0x3c,0xed,0x3c,0x62, +0xdf,0xa7,0x3c,0x73,0xf0,0x40,0x3f,0x68,0x4, 0xf4,0xf7,0xff,0x26,0xee,0x3c,0xe2, +0x3c,0x65,0xdf,0x9e,0xe8,0x8, 0x3c,0x1c,0xe8,0xe, 0x3b,0x9e,0x3f,0x78,0x4, 0xbe, +0xe2,0x0, 0xcb,0x5, 0x17,0x1, 0xe8,0xe, 0x3f,0x18,0xe0,0x0, 0x2, 0xe8,0xe8,0x40, +0x3a,0xed,0xf0,0x40,0x3e,0xe2,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x3a,0x72,0xf0,0x40, +0x3c,0x6e,0xf2,0x1, 0xc4,0x7f,0xe8,0x40,0x3b,0xee,0x1, 0xd8,0xe2,0x0, 0xcb,0x5, +0x3f,0x66,0xe2,0x1, 0xc7,0x7f,0xc1,0x8a,0x2, 0xb3,0xe8,0x40,0x3e,0xe8,0xe8,0x40, +0x3f,0xeb,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe2,0x1, 0xc1,0xff, +0x3, 0x83,0xf8,0x40,0x3c,0x6b,0xe2,0x0, 0xcf,0x5, 0xf8,0x40,0x3d,0xe8,0xf2,0x1, +0xc5,0xff,0xe0,0x0, 0x1, 0x59,0xf2,0x0, 0xcc,0x8c,0x1, 0x27,0xf0,0x0, 0xc4,0x81, +0xc3,0x1, 0xf2,0x1, 0xc4,0xff,0xe7,0xff,0x0, 0x9d,0xe2,0x0, 0xcb,0x5, 0xe8,0x40, +0x3f,0xed,0xe0,0x6f,0x3a,0xa5,0x3a,0xef,0x3f,0xe2,0xe0,0x7e,0x3a,0xa7,0xe8,0x6f, +0x3a,0xad,0xe8,0x40,0x3b,0xee,0xf0,0x40,0x3e,0xef,0xe7,0xff,0x0, 0x9b,0xe2,0x1, +0xc1,0xff,0xf0,0x0, 0x2d,0xaa,0xf0,0x0, 0x2d,0x10,0xf2,0x0, 0xcc,0x8c,0xf8,0x40, +0x3d,0xea,0xf0,0x0, 0x66,0x1, 0x1, 0xdb,0xf2,0x0, 0xcd,0x8a,0x2, 0x95,0xf0,0x0, +0x2d,0xa8,0xf0,0x0, 0x25,0x6, 0xf0,0x0, 0xc5,0x10,0xf2,0x1, 0xc5,0x7f,0xe8,0x40, +0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x0, 0xc5,0x1, 0xf2,0x1, +0xc5,0x7f,0xe7,0xfe,0x0, 0xf7,0xf0,0x0, 0x15,0xf, 0xe8,0x40,0x3c,0x6a,0xc0,0x4, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf2,0x0, 0xcd,0x8b,0xf0,0x0, 0x15,0xf, 0xe8,0x7a, +0x3c,0xab,0xe8,0x40,0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf8,0x40, +0x3d,0x6b,0x0, 0xde,0x11,0xb2,0xe7,0xff,0x0, 0xab,0xf0,0x3, 0x1a,0x8, 0xf8,0x0, +0x9b,0xb4,0xe8,0x1, 0x9c,0xd4,0xe8,0x0, 0x9e,0x44,0xf0,0xa, 0x3b,0xa9,0xf0,0x40, +0x39,0x6a,0xe8,0x1, 0x9f,0x4, 0xf3,0xff,0xc1,0x7f,0xe8,0x43,0x3e,0x92,0xe0,0xf, +0x3e,0x2e,0xe2,0x0, 0xce,0x80,0xe8,0xd, 0x3c,0xa7,0xf8,0x1, 0x9b,0x34,0xf8,0x0, +0x9a,0xf4,0xf0,0x40,0x39,0xef,0xe3,0xff,0xc6,0xff,0xf3,0xff,0xc1,0xff,0xe0,0x72, +0x3d,0x2d,0xe0,0x1, 0x1e,0xa5,0xe8,0x43,0x3d,0x93,0xf8,0x8, 0x3b,0x25,0xe2,0x0, +0xcd,0x80,0x3f,0xe8,0x8d,0x8d,0xe0,0x1, 0x1e,0xa4,0xe3,0xff,0xc7,0xff,0x3f,0x2c, +0xe0,0x43,0x3d,0x1f,0xe3,0xff,0xc7,0x7f,0x8e,0x8d,0xe0,0x73,0x3d,0x2e,0xf8,0xc, +0x3a,0xa6,0xe2,0x0, 0xcd,0x0, 0xe0,0xe, 0x35,0xa8,0xe3,0xff,0xc6,0x7f,0x3f,0x4d, +0xe0,0x6f,0x3d,0x2c,0xf0,0x40,0x39,0xfe,0x14,0x0, 0xe0,0x0, 0x3, 0xd2,0xe0,0x1, +0x1f,0x23,0xe0,0x1, 0x1e,0xa2,0x8f,0xe, 0x8e,0x8d,0x37,0x28,0x3f,0x4d,0xe1,0x2d, +0x3f,0x9e,0xe0,0x0, 0x26,0xc5,0xe9,0x2f,0x3f,0x93,0xe0,0x0, 0x27,0xc1,0xe8,0x0, +0x8c,0x14,0x2c,0x3d,0xe0,0x1, 0x1f,0xad,0xe0,0x1, 0x1e,0xa1,0x8d,0x8f,0xe0,0x1, +0x1f,0xa0,0x8e,0x8d,0x8e,0xf, 0xe0,0x1, 0x1f,0xac,0x36,0x28,0x8f,0x8f,0x35,0xa8, +0x3e,0xcc,0x3f,0xcb,0xe8,0x0, 0x9e,0x14,0xe0,0xd, 0x3f,0xad,0x3e,0x7d,0x5, 0x28, +0xe0,0x1, 0x1e,0x9f,0x8d,0x8d,0xe0,0x1, 0x1e,0x9e,0x35,0xa8,0x8e,0x8d,0x3e,0xcb, +0x3f,0xad,0xe0,0x2f,0x3f,0x9c,0x27,0x9c,0xf1,0x2f,0x39,0x1e,0x27,0x99,0xe0,0x1, +0x1f,0x9d,0xe0,0x1, 0x1f,0x1c,0x8f,0x8f,0x8f,0xe, 0xf0,0x40,0x3b,0xf9,0x37,0xa8, +0x3f,0x4f,0x3, 0x8f,0xf8,0xf, 0x3b,0xa5,0x3f,0xfe,0x3, 0xa, 0xf0,0xf, 0x3b,0x29, +0x3f,0x7f,0x17,0xa3,0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe8,0xf, 0x3c,0xa5,0x3f,0xfe,0x3, 0x7c,0xf8,0xf, 0x3b,0x27,0x3f,0x7f,0x17,0xa2, +0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0xe0,0x3, 0x1e,0x8, 0xf0,0x0, 0x9b,0xac, +0xf0,0x1, 0x9a,0xcc,0xf0,0x0, 0x9a,0x4c,0xf0,0x1, 0x9b,0xc, 0xf8,0xd, 0x3b,0xa5, +0xe3,0xff,0xc6,0xff,0xe0,0x43,0x3f,0x1d,0xf8,0xf, 0x3a,0x26,0xe2,0x0, 0xcf,0x0, +0xe3,0xff,0xc7,0xff,0xf8,0xa, 0x3a,0xa7,0xe0,0x43,0x3c,0x9f,0xe0,0x1, 0x9c,0x3c, +0x9d,0xfc,0xe3,0xff,0xc5,0x7f,0xe0,0x6d,0x3d,0x2a,0xe2,0x0, 0xcc,0x80,0xf8,0xa, +0x3b,0x24,0xe0,0xe, 0x3c,0x2b,0xe3,0xff,0xc5,0x7f,0xe0,0x1, 0x1c,0x9b,0xe3,0xff, +0xc7,0x7f,0xe0,0x6f,0x3d,0x2a,0xe0,0x1, 0x1d,0x1a,0xf0,0x43,0x39,0x9e,0x8c,0x89, +0x3d,0xa8,0xf2,0x0, 0xc9,0x80,0x8d,0xa, 0xe3,0xff,0xc5,0xff,0x34,0xa8,0xe0,0x6e, +0x3d,0x2b,0xe0,0xb, 0x3d,0x49,0xe1,0x2b,0x3d,0x9e,0xe0,0x0, 0x25,0xcd,0xe1,0x2f, +0x3f,0x9e,0xe0,0x0, 0x27,0xc9,0x8c,0x1c,0xe0,0x0, 0x2c,0x46,0xe0,0x1, 0x1f,0xad, +0x9e,0x1c,0x8d,0xf, 0xe0,0x1, 0x1f,0x99,0x35,0x28,0x8d,0x8f,0xe0,0x1, 0x1f,0xac, +0x35,0xa8,0x8f,0xf, 0xe0,0x1, 0x1f,0x98,0x3f,0x4a,0x8f,0x8f,0x3f,0xcb,0xe0,0xf, +0x3f,0x2f,0x3e,0x7f,0x5, 0x31,0xe0,0x1, 0x1f,0x97,0x8d,0x8f,0xe0,0x1, 0x1f,0x96, +0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3f,0x2f,0x3e,0x7e,0x3, 0x26,0xe0,0x1, 0x1f,0x95, +0x8f,0xf, 0xe0,0x1, 0x1f,0x94,0x37,0x28,0x8f,0x8f,0x3f,0xce,0x3e,0xff,0x5, 0x9c, +0xe0,0x1, 0x1f,0x9d,0xf8,0x40,0x3b,0xf5,0x8f,0xf, 0xe0,0x1, 0x1f,0x9c,0x37,0x28, +0x8f,0x8f,0x3f,0xce,0x37,0xc1,0x5, 0x91,0xf8,0x16,0x3a,0xa6,0xf0,0x40,0x3b,0x7f, +0x3, 0xb, 0xf8,0x17,0x3a,0x27,0xe8,0x40,0x3f,0xf7,0x17,0xa0,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82,0xf8,0x17,0x3b,0xa6,0xf0,0x40,0x3b,0xff, +0x3, 0x7b,0xf8,0x15,0x3a,0x25,0xe8,0x40,0x3f,0xf5,0x17,0xa1,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0x8, 0xb1,0xe0,0x2, 0x1f,0xb6,0x84,0xf, 0xc4,0x7f,0xe2,0x1, +0xc4,0x7f,0xdd,0xe9,0x17,0x80,0x2c,0xc, 0xde,0xb1,0x3f,0xe8,0x2c,0x9, 0xdf,0x55, +0xe2,0x0, 0xcc,0x0, 0xe0,0x1, 0x17,0x7f,0xe0,0x6e,0x39,0xa8,0x3f,0xee,0x3c,0x6f, +0x8, 0xe1,0xe0,0x2, 0x1f,0x91,0xe6,0x1, 0x16,0xff,0xa7,0x8f,0x34,0x28,0xa7,0x5f, +0x3f,0x5d,0xbf,0x5f,0xa7,0x5f,0x3c,0x4e,0xbc,0x5f,0x38,0x82,0xe0,0x2, 0x1e,0xfd, +0xe0,0x3, 0x1f,0x13,0x8f,0xdd,0x8e,0x4d,0xe0,0x2, 0x1e,0x93,0x3f,0xbc,0x37,0xa1, +0xb7,0x8e,0x9f,0x8e,0x37,0xc9,0xe0,0x3, 0xaf,0xcd,0x9f,0x8e,0x37,0xc1,0xe0,0x3, +0xaf,0xdd,0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x19,0x13,0xe0,0x6, 0x8c,0x12,0xe0,0x6, +0x8c,0xa2,0xe0,0x2, 0xd7,0x4f,0xe4,0x8, 0x34,0x21,0xe0,0x3, 0x9f,0xc2,0xe4,0x8, +0x34,0x40,0x3c,0x7f,0x3, 0x88,0xe0,0x1, 0x1f,0x4f,0xe0,0x3, 0xb4,0x42,0x9f,0x8e, +0xcf,0xa0,0xb7,0x8e,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x20, +0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0x37,0x28,0xe0,0x2, 0x19,0x13, +0x3c,0x4e,0x17,0x81,0xaf,0xc2,0xe0,0x7, 0xd3,0x42,0x14,0x1, 0xe0,0x4, 0xd0,0xa2, +0xe0,0x2, 0x1f,0xfd,0xe0,0x19,0x16,0x9d,0x17,0x7, 0x3e,0x9f,0xaf,0xd, 0xe0,0x19, +0xc7,0x9e,0xaf,0xf, 0xe0,0x1, 0xd8,0x2b,0x17,0x82,0xaf,0xc2,0x9, 0x61,0xe0,0x3, +0x1f,0x38,0xe0,0x3, 0x1f,0x9d,0xa6,0xe, 0x15,0xfe,0xa6,0xcc,0x97,0xf, 0xe2,0x0, +0xc6,0x81,0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0xfd,0xa6,0xcc,0x97,0xf, 0x36,0xc9, +0xe2,0x0, 0xc6,0x82,0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0x77,0x97,0xf, 0x3d,0xe8, +0xe3,0xff,0xc7,0x7b,0xb7,0xf, 0xe7,0xff,0x17,0x10,0xa6,0x4c,0x96,0x8f,0x3f,0x18, +0x36,0x4c,0xe2,0x0, 0xc6,0x8, 0x3e,0xda,0xe2,0x1, 0xc7,0x7f,0x3e,0xcc,0xe2,0x0, +0xcf,0xd, 0xb6,0x8f,0x9e,0x8f,0x2, 0x89,0xea,0x49,0x7f,0xd8,0xe9,0xff,0xc7,0xff, +0x37,0x22,0x3f,0x1f,0xa7,0x8e,0x3f,0x82,0xe0,0x1, 0x14,0x7f,0x38,0x82,0x3c,0x6d, +0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x8, 0x36,0xc8,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0xa7,0x8f,0xe0,0x1, 0xa4,0x7f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x2, 0x1f,0x91, +0xa7,0x8f,0xa4,0x5f,0x34,0x48,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x2, 0x1e,0x9a, +0x16,0x1, 0x8f,0xd, 0xe0,0x2, 0x1f,0x93,0x3e,0x1e,0xae,0xd, 0xe0,0x1, 0x1e,0xd6, +0x3e,0x9e,0xe0,0x4, 0x8f,0x4f,0x8c,0xd, 0xc7,0x1, 0xe0,0x4, 0xaf,0x4f,0xe0,0x4, +0x8f,0x4f,0x2f,0x6, 0xe0,0x4, 0x8f,0x3f,0xc7,0x1, 0xe0,0x4, 0xaf,0x3f,0xe2,0x0, +0xcd,0xfd,0x1, 0xcd,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x7c,0xaf,0xf, 0x38,0x82, +0x8, 0xb1,0x2c,0x17,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x1, 0x48,0x3c,0x69,0xe0,0x4, 0xd9,0x33,0xe0,0x1, 0x1f,0xcf,0x9f,0x8f,0x27,0x88, +0xe0,0x2, 0x1f,0x13,0xe0,0x1, 0x8f,0xee,0xcf,0x82,0xe0,0x1, 0xaf,0xee,0x8, 0xe1, +0xe2,0x0, 0xcc,0xf, 0x1, 0x3b,0xe2,0x0, 0xcc,0x12,0xe0,0x0, 0x1, 0x52,0xe2,0x0, +0xcc,0x13,0xe0,0x0, 0x1, 0x53,0xe2,0x0, 0xcc,0x11,0x1, 0x3e,0xe2,0x0, 0xcc,0x1, +0xe0,0x2, 0x1, 0x1b,0xe2,0x0, 0xcc,0x9, 0xe0,0x2, 0x1, 0x35,0xe2,0x0, 0xcc,0x5b, +0xe0,0x0, 0x5, 0xce,0xe7,0xff,0x17,0x94,0x3f,0x98,0xe2,0x0, 0xcf,0x81,0xe0,0x2, +0x5, 0xdb,0xe7,0xff,0x17,0x92,0x3f,0x98,0xe2,0x0, 0xcf,0x81,0xe0,0x3, 0x5, 0xb9, +0xe7,0xff,0x17,0x90,0xe0,0xf, 0x3f,0x98,0xe2,0x0, 0xcf,0x8f,0xe0,0x2, 0x2, 0xe8, +0xe2,0x0, 0xcc,0x7b,0xe0,0x3, 0x1, 0x5e,0xe0,0x1, 0x1f,0xcf,0x0, 0xc0,0xe0,0x2, +0x1f,0xe6,0x8f,0x8f,0xe7,0xff,0x2f,0xb7,0x8, 0xe1,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0x93,0x17,0x1, 0xe0,0x1, 0xaf,0x7f, +0xe0,0x2, 0xaf,0xf, 0x8, 0xe1,0xe2,0x0, 0xcc,0x81,0x1, 0x29,0xe7,0xff,0x2c,0xb1, +0xe0,0x1, 0x1f,0xf2,0xa7,0xf, 0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x8, 0xe1,0xe0,0x2, +0x1f,0x93,0xe0,0x2, 0xac,0xaf,0x8, 0xe1,0xe0,0x2, 0x1f,0x93,0xe0,0x2, 0xac,0xbf, +0x8, 0xe1,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x2f,0xdf,0x8, 0xe1,0xe2,0x0, 0xcc,0x30, +0xe0,0x1, 0x1, 0x6f,0xe2,0x0, 0xcc,0x53,0x2, 0x98,0xea,0x4a,0x7f,0x90,0xe9,0xff, +0xc7,0xff,0xe0,0xe, 0x34,0x22,0x3f,0x9e,0xa7,0x8f,0x3f,0x82,0xe0,0x2, 0x1f,0x93, +0xe0,0x2, 0x8f,0x1f,0xe7,0xff,0x2f,0x5, 0xe0,0x2, 0xac,0x9f,0xe7,0xff,0x16,0x80, +0x87,0xf, 0x3f,0x4d,0xaf,0xf, 0x8, 0xe1,0xe0,0x0, 0x1f,0xb0,0x3e,0xe8,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x62,0x17,0xf8,0xe0,0x2, 0x1f,0x13,0x3f,0x98, +0xe2,0x1, 0xc7,0xff,0x3e,0x9e,0xe2,0x0, 0xcf,0xaf,0xac,0x8d,0x2, 0x89,0xea,0x4c, +0x7e,0xe0,0xe9,0xff,0xc6,0xff,0x37,0xa2,0x3f,0x9d,0xa7,0x8f,0x3f,0x82,0xe0,0x1, +0x1f,0xcf,0x17,0x48,0x3f,0x18,0xe2,0x0, 0xcf,0x1e,0xe0,0x2, 0x5, 0x99,0xe2,0x0, +0xcc,0x57,0xe0,0x2, 0x5, 0x99,0x9f,0xf, 0xe0,0x4, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfe, +0x0, 0xc7,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x8, 0xb7,0xf, 0xe7,0xfe,0x0, 0xc0, +0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x4, 0xb7,0xf, 0xe7,0xfe,0x0, 0xb9,0xe0,0x4, +0x87,0xbe,0xe0,0x2, 0x1f,0x1a,0xe0,0x1, 0x1f,0xcf,0xac,0x8e,0xe7,0xfe,0x0, 0xb0, +0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xe0,0x40,0xcf,0x0, 0xb7,0xf, 0x0, 0xd3,0xe0,0x1, +0x1f,0xcf,0x9f,0xf, 0xe0,0x80,0xcf,0x0, 0xb7,0xf, 0x0, 0xcc,0xe0,0x3, 0x8f,0xce, +0xe0,0x3, 0x1f,0x13,0x37,0xa8,0x3f,0x99,0x37,0xa1,0xb7,0x8e,0xe0,0x1, 0x1f,0xcf, +0xe7,0xfe,0x0, 0x96,0xe0,0x3, 0x8f,0xae,0xe0,0x2, 0x1f,0x72,0x37,0xa8,0x3f,0x99, +0x37,0xa1,0xb7,0x8e,0x97,0xe, 0xe0,0x0, 0x1f,0xc8,0xb7,0xf, 0xe7,0xfe,0x0, 0xc6, +0xe0,0x3, 0x8f,0x8e,0x37,0xa8,0x3c,0x9f,0xe0,0x3, 0x1f,0x89,0xb4,0x8f,0xe0,0x1, +0x1f,0xcf,0xe7,0xfd,0x0, 0xfd,0xe0,0x1, 0x1f,0xdc,0x15,0xfb,0xa6,0xf, 0xe0,0x1, +0x1f,0xcf,0xa7,0x4c,0xa6,0xcc,0x37,0x42,0xe2,0x0, 0xc7,0x1, 0xe4,0x0, 0xcf,0x1, +0x37,0x22,0x3e,0xdb,0x3f,0x4d,0xbf,0x4c,0xe7,0xfd,0x0, 0xea,0xe0,0x1, 0x1f,0xcf, +0x9f,0xf, 0xcf,0x2, 0xb7,0xf, 0xe7,0xfd,0x0, 0xe3,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, +0xcf,0x1, 0xb7,0xf, 0xe7,0xfd,0x0, 0xdc,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xe0,0x2, +0xcf,0x0, 0xb7,0xf, 0xe7,0xfe,0x0, 0xff,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x10, +0xb7,0xf, 0xe7,0xfd,0x0, 0xcd,0xe0,0x2, 0x1f,0x8d,0x8f,0x8f,0x2f,0x87,0xe0,0x1, +0x1f,0xf2,0xa7,0xf, 0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x17,0x0, 0xe0,0x3, 0x1f,0x93, +0xe0,0x2, 0x1e,0x93,0xb7,0xf, 0xe2,0x1, 0xcc,0xad,0xac,0x9d,0xe7,0xff,0x1, 0x2f, +0xe2,0x1, 0xcc,0xae,0xe7,0xfd,0x1, 0xf2,0xdd,0xe2,0xe0,0x1, 0x1f,0xcf,0xe7,0xfd, +0x0, 0xaf,0xe2,0x0, 0xcc,0x85,0xe7,0xfd,0x2, 0xb4,0xe0,0x2, 0x1f,0x13,0xe0,0x1, +0xac,0x9e,0xe0,0x0, 0x2c,0xfb,0xe0,0x2, 0xac,0xde,0xe7,0xfd,0x0, 0xdf,0xe0,0x2, +0x1f,0x13,0xe0,0x6, 0x8f,0x8e,0xe0,0x2f,0x3c,0x8f,0xe7,0xfd,0x2f,0xa2,0x17,0x82, +0xe1,0x2f,0x3c,0x9f,0xe7,0xfd,0x2f,0x9d,0xe0,0x0, 0x1f,0xb0,0x16,0xb0,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0xd3,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0xe7,0xfe, +0x2f,0x9d,0xe2,0x0, 0xcc,0x4, 0xe7,0xfd,0x1, 0xc, 0xe2,0x0, 0xcc,0x30,0xe7,0xfe, +0x1, 0x95,0x8, 0xe1,0xe0,0x1, 0x1f,0xcf,0xe0,0x0, 0x1e,0x48,0x9f,0xf, 0x15,0x81, +0xe0,0x1, 0xcf,0x0, 0xb7,0xf, 0xe2,0x0, 0xcc,0x6d,0xe0,0x3, 0x1f,0x15,0x9e,0x8c, +0xa7,0xe, 0x3d,0x9d,0xb5,0x8c,0x3f,0x1d,0xac,0x8e,0xe7,0xfc,0x1, 0xe9,0xe0,0x1, +0x1f,0x58,0xe0,0x0, 0x16,0xec,0xae,0x8e,0xe7,0xfc,0x0, 0xe2,0xe2,0x1, 0xcc,0x6, +0xe0,0x0, 0x1, 0x7e,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x11,0xe2,0x1, 0xcc,0x8, +0xe7,0xfd,0x1, 0x14,0xe2,0x1, 0xcc,0xb, 0xe0,0x1, 0x1, 0x23,0xe2,0x1, 0xcc,0xc, +0xe0,0x1, 0x1, 0x33,0xe2,0x1, 0xcc,0xd, 0xe0,0x1, 0x1f,0xcf,0xe7,0xfc,0x1, 0xc8, +0xe0,0x3, 0x1f,0x38,0x16,0x60,0xa6,0x8e,0xe2,0x0, 0xc4,0x9f,0xe0,0x1, 0xa7,0x5d, +0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x5d,0xe7,0xfc,0x0, 0xba,0x17,0x1, 0x3f,0x58, +0xe0,0x0, 0x2f,0x4b,0xe2,0x0, 0xcc,0xa, 0xe7,0xfc,0x1, 0xb2,0x9f,0xf, 0xe0,0x8, +0xcf,0x0, 0xb7,0xf, 0xe7,0xfc,0x0, 0xac,0xe2,0x0, 0xcc,0x82,0xe0,0x0, 0x1, 0x58, +0xe0,0x1, 0x17,0xfd,0x3f,0xd9,0xe2,0x0, 0xcf,0x81,0x1, 0x6, 0xe2,0x0, 0xcc,0x84, +0xe7,0xfc,0x1, 0xdc,0x17,0x82,0xe0,0x2, 0xaf,0xde,0xe7,0xfc,0x0, 0xd7,0xe0,0x1, +0x1f,0xcf,0xe0,0x2, 0x1e,0x93,0x9f,0xf, 0xcf,0x40,0xb7,0xf, 0xe0,0x3, 0x8f,0xd, +0xe0,0x3, 0x8d,0x9d,0xe0,0x3, 0x8e,0x1d,0x37,0x28,0xc6,0x1, 0xe0,0x3, 0xae,0x1d, +0x3f,0x1b,0xe0,0x3, 0x8e,0x1d,0xe3,0xff,0xc7,0x7f,0x2e,0x6, 0xe0,0x3, 0x8e,0xd, +0xc6,0x1, 0xe0,0x3, 0xae,0xd, 0xe2,0x0, 0xcc,0x6f,0xe0,0x3, 0x1e,0x9b,0xa6,0x8d, +0x3f,0x1d,0xac,0x8e,0xe7,0xfb,0x1, 0xf4,0xe0,0x1, 0x1f,0x58,0xe0,0x0, 0x16,0xee, +0xae,0x8e,0xe7,0xfb,0x0, 0xed,0x9f,0xf, 0xcf,0x20,0xb7,0xf, 0xe7,0xfb,0x0, 0xe8, +0x3c,0x69,0xdd,0x8, 0xe0,0x1, 0x1f,0xcf,0xe7,0xfb,0x0, 0xe2,0xe0,0x1, 0x1f,0xdc, +0x16,0x78,0xa6,0x8f,0xe2,0x0, 0xc4,0x87,0xe0,0x1, 0xa7,0x2d,0xe0,0x1, 0x1f,0xcf, +0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x2d,0xe7,0xfb,0x0, 0xd2,0x16,0x83,0xe0,0x2, +0xae,0xde,0xe0,0x1, 0x1f,0xcf,0xe7,0xfb,0x0, 0xcb,0xe0,0x1, 0x1f,0xdc,0x17,0x3, +0xa6,0x8f,0x3f,0x59,0xe0,0x1, 0xa7,0xad,0xe7,0x9f,0x16,0x7f,0x37,0x2c,0x3f,0xdc, +0x3f,0xce,0xe0,0x1, 0xbf,0xad,0xe7,0xfb,0x0, 0xf9,0xe0,0x6, 0xac,0x8e,0xe0,0x1, +0x1f,0xcf,0x9f,0xf, 0xe1,0x0, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfb,0x0, 0xb1,0xe0,0x1, +0x1f,0xdc,0x15,0xe0,0xa7,0xf, 0x16,0x9f,0xe0,0x1, 0xa6,0x3e,0x3e,0xd9,0x3e,0x5b, +0xe0,0x1, 0xbe,0x3e,0xe0,0x1, 0xa6,0x3e,0xe0,0x1, 0x1f,0xcf,0x3e,0xcc,0xe0,0x1, +0xbe,0xbe,0xe7,0xfb,0x0, 0x9d,0xe0,0x3, 0x1f,0x8d,0x3c,0x69,0xac,0x8f,0xe0,0x2, +0xd1,0x75,0xe7,0xfb,0x0, 0xd3,0xe2,0x0, 0xcc,0x5b,0x3f,0xe8,0xe0,0x0, 0x5, 0xf4, +0xe7,0xff,0x17,0x16,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xf2,0xe0,0x0, +0x17,0x64,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x8c, +0xe7,0xff,0x17,0x12,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x99,0xe7,0xff, +0x17,0x14,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xea,0xe7,0xff,0x17,0x18, +0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xc3,0xe0,0x0, 0x17,0x77,0x3f,0x18, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xe0,0xe7,0xff,0x17,0x10, +0x3f,0x18,0xe2,0x0, 0xcf,0xf, 0xe0,0x1, 0x5, 0xee,0xe0,0x0, 0x17,0x7f,0x3f,0x18, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x8c,0xe2,0x1, 0xcc,0x6, +0xe0,0x1, 0x1, 0x63,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x6f,0xe2,0x1, 0xcc,0x8, +0xe0,0x2, 0x1, 0x3, 0xe2,0x1, 0xcc,0xb, 0xe0,0x2, 0x1, 0x1, 0xe2,0x1, 0xcc,0xc, +0xe0,0x2, 0x1, 0x5, 0xe2,0x1, 0xcc,0xd, 0xe0,0x2, 0x1, 0x5, 0xe0,0x0, 0x17,0x70, +0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x4, 0xe0,0x1, 0x2, 0xdf,0xe2,0x1, +0xcc,0x12,0xe0,0x2, 0x1, 0x12,0xe0,0x1, 0x5, 0xfe,0xe2,0x1, 0xcc,0x13,0xe0,0x2, +0x1, 0x2, 0xe2,0x1, 0xcc,0x14,0xe0,0x2, 0x1, 0x83,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, +0x8c,0x7f,0x38,0x82,0xe0,0x2, 0x1f,0x13,0x3f,0x9e,0x8c,0xf, 0x38,0x82,0xe0,0x3, +0x1e,0x13,0xe0,0x2, 0x1f,0x63,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, +0xcf,0xeb,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0x3e,0x38,0x82,0xe0,0x2, 0x1e,0x72, +0xe0,0x3, 0x1f,0x15,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, 0xcf,0xed, +0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xf2,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6c, +0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x17,0xe0,0x0, 0x1f,0x4a,0x9e,0x8c,0xa7,0xe, +0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x9d,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xde, +0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x1c,0xaf,0xf, 0x38,0x82,0xe0,0x3, 0x1e,0x9, +0xe0,0x3, 0x1f,0x1b,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, 0xcf,0xef, +0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xca,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6e, +0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6a,0xaf,0xf, 0x38,0x82, +0xe0,0x2, 0x1f,0x13,0x16,0x60,0xe0,0x2, 0x8e,0xfe,0x3e,0x1d,0xe2,0x0, 0xce,0x1f, +0xe0,0x0, 0x2, 0xdb,0xe0,0x1, 0x1e,0x53,0x3e,0x9c,0xe0,0x44,0x8c,0xd, 0xe0,0x2, +0x8e,0xfe,0xe2,0x1, 0xcf,0x82,0xc6,0x81,0xe0,0x2, 0xae,0xfe,0xe7,0xff,0x1, 0xa7, +0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x1, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x72, +0xe0,0x3, 0x1f,0x15,0x9e,0x8c,0xa7,0xe, 0xe1,0xff,0x15,0xfe,0x3d,0xdd,0x3f,0x1b, +0x97,0xe, 0xe2,0x0, 0xc6,0x81,0xc7,0x1, 0xe3,0xff,0xc7,0x7f,0xe2,0x0, 0xce,0x80, +0x9d,0x8c,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0x37,0x48,0x16,0x81,0x3e,0x9b,0xe0,0x68, +0x39,0x2e,0xe2,0x0, 0xcf,0xe9,0xb6,0x8c,0xe7,0xff,0x1, 0x81,0xe0,0x1, 0x1f,0xd8, +0xe0,0x0, 0x17,0x68,0xaf,0xf, 0x38,0x82,0xe0,0x0, 0x1e,0x43,0xe0,0x2, 0x1f,0x25, +0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x8a,0xb5,0x8c,0x3f,0x1d, +0x8c,0xe, 0xe7,0xfe,0x1, 0xec,0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x9, 0xaf,0xf, +0x38,0x82,0xe7,0xf7,0x0, 0xee,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f,0xe0,0x1, 0xa4,0x2f, +0xe2,0x0, 0xc4,0x7, 0x38,0x82,0xe0,0x2, 0x8e,0x7e,0xe0,0x1, 0x1e,0xc2,0x3e,0x9c, +0x8c,0xd, 0xe7,0xff,0x0, 0xa6,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f,0xe0,0x1, 0xa4,0x2f, +0x34,0x4c,0xe2,0x0, 0xc4,0x3, 0x38,0x82,0xe2,0x1, 0xcf,0xfe,0x14,0x0, 0xe7,0xfe, +0x1, 0xc6,0xe0,0x2, 0x1f,0xc8,0x17,0x5, 0x8f,0x8f,0x3f,0x3f,0xe0,0x3, 0x1f,0xb0, +0x3f,0x9e,0x8c,0xf, 0x38,0x82,0x14,0x0, 0x38,0x82,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f, +0xe0,0x1, 0xa4,0x3f,0xe2,0x0, 0xc4,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0x8d,0x8c,0xf, +0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x1, 0xa4,0x5f,0xe2,0x0, 0xc4,0x1f, +0x38,0x82,0xe2,0x1, 0xcc,0x11,0x1, 0x8b,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x4f, +0x38,0x82,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x6f,0x38,0x82,0xe0,0x1, 0x1f,0xd6, +0xe0,0x2, 0x8c,0x3f,0x38,0x82,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x5f,0x38,0x82, +0x8, 0xb3,0xe0,0x2, 0x19,0x13,0xe0,0x2, 0x19,0xfd,0xe0,0x3, 0x8f,0xe2,0xe0,0x1, +0x8f,0x3, 0x3f,0x7f,0x1, 0x16,0xe0,0x3, 0x8f,0xe2,0xe0,0x1, 0x8c,0x93,0xe2,0x0, +0xc7,0xbf,0xe0,0x3, 0xaf,0xe2,0xe0,0x3, 0x8f,0xe2,0x3c,0x6f,0xe0,0x1, 0xaf,0x83, +0xe0,0x3, 0xd1,0x2e,0xe0,0x2, 0x1f,0xe6,0x87,0x8f,0xe2,0x0, 0xc7,0x81,0x2f,0xa2, +0xe0,0x3, 0x8f,0xf2,0xe0,0x1, 0x8f,0x13,0x3f,0x7f,0x1, 0x16,0xe0,0x3, 0x8f,0xf2, +0xe0,0x1, 0x8c,0x3, 0xe2,0x0, 0xc7,0xbf,0xe0,0x3, 0xaf,0xf2,0xe0,0x3, 0x8f,0xf2, +0x3c,0xef,0xe0,0x1, 0xaf,0x93,0xe0,0x3, 0xd1,0x13,0xe0,0x2, 0x1f,0xe6,0x87,0x8f, +0xe2,0x0, 0xc7,0x81,0x27,0x82,0x9, 0xe1,0xe0,0x1, 0x8c,0x13,0x9, 0xa1,0xe0,0xe, +0x0, 0x9f,0xe0,0x1, 0x8c,0x3, 0xd7,0x1b,0x0, 0xdc,0x8, 0xb2,0xe0,0x2, 0x1f,0x93, +0x16,0x85,0xe0,0x5, 0x8f,0x1f,0x3e,0xb8,0xe0,0x3, 0x1f,0xb0,0x39,0x68,0x3f,0x9d, +0x8c,0x3f,0xe0,0x3, 0x1f,0x8e,0x3c,0xee,0x3f,0x92,0xaf,0xf, 0xe0,0x7, 0xd9,0x75, +0xe2,0x0, 0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0x14,0x80,0x14,0x3, 0xe0,0x7, 0xd9,0x6d, +0x14,0x80,0x14,0x4, 0xe0,0x7, 0xd9,0x69,0x14,0x80,0x14,0x0, 0xe0,0x7, 0xd9,0x65, +0x9, 0x61,0x8, 0xb5,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0xaf,0x3a,0x68,0xe0,0x3, +0x34,0x23,0x8c,0x32,0xaa,0x2, 0x3c,0xe3,0xe0,0x7, 0xd9,0xd1,0xc1,0x5, 0x39,0x75, +0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xca,0x3c,0xe3,0x14,0x4, 0xa, 0xa1, +0xe0,0xf3,0x0, 0xc5,0x8, 0xb5,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0xaf,0x3a,0x68, +0xe0,0x3, 0x34,0x23,0x8c,0x32,0xaa,0x12,0x3c,0xe3,0xe0,0x7, 0xd9,0xdb,0xc1,0x5, +0x39,0x75,0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xd4,0x3c,0xe3,0x14,0x4, +0xa, 0xa1,0xe0,0xf3,0x0, 0xcf,0x8, 0xb4,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0x2f, +0x39,0xe8,0x8c,0x32,0xa9,0xa2,0x3d,0x63,0x3c,0xe3,0xe0,0x7, 0xd9,0xe8,0xc1,0x5, +0x39,0x74,0x1, 0xf8,0x3d,0x63,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xe0,0x3d,0x63, +0x3c,0xe3,0x14,0x4, 0xa, 0x21,0xe0,0xf3,0x0, 0xda,0x8, 0xb2,0xe0,0x0, 0x1f,0xcd, +0x39,0x68,0x8f,0x8f,0x2f,0xa2,0xe0,0x2, 0x1f,0x93,0x16,0x85,0xe0,0x3, 0x9f,0x4f, +0x3e,0xb2,0xe0,0x3, 0x1f,0xb0,0xe2,0x1, 0xc7,0x7f,0x3f,0x9d,0x8c,0x3f,0x3c,0xee, +0xaf,0x4f,0xe0,0x7, 0xd8,0xd7,0xe2,0x0, 0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0x14,0x8a, +0x14,0x3, 0xe0,0x7, 0xd8,0xcf,0x14,0x8a,0x14,0x4, 0xe0,0x7, 0xd8,0xcb,0x14,0x85, +0x14,0x0, 0x9, 0x21,0xe0,0xf1,0x0, 0xc6,0xda,0x7e,0x0, 0xde,0x16,0x83,0xe0,0x2, +0x1f,0xc4,0x3e,0xb8,0xe0,0x2, 0x1f,0x13,0xe0,0xc, 0x3f,0x9d,0xe0,0x4, 0x8d,0x8e, +0x8d,0xc, 0x3d,0x7b,0x1, 0x4, 0xe0,0x4, 0x8d,0x8e,0xad,0x8c,0xe0,0xc, 0x3f,0x9d, +0xe0,0x4, 0x8d,0x9e,0x8d,0x1c,0x3d,0x7b,0x1, 0x4, 0xe0,0x4, 0x8d,0x9e,0xad,0x9c, +0x3f,0x9d,0x8e,0x2f,0xe0,0x4, 0x8e,0xae,0x3e,0x7d,0x1, 0x4, 0xe0,0x4, 0x8f,0x2e, +0xaf,0x2f,0xe0,0x10,0x0, 0x8b,0x8, 0xb3,0xe0,0x3, 0x1f,0x38,0xe0,0x2, 0x19,0x48, +0xa7,0x8e,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x86,0x8f,0x82,0xe2,0x0, 0xcf,0x82, +0x1, 0x2, 0x17,0x81,0xe0,0x0, 0x19,0xcd,0xaf,0x82,0xaf,0x83,0x8c,0x82,0x24,0x94, +0xe2,0x0, 0xcc,0x82,0x1, 0x89,0xa7,0x8e,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x83, +0xac,0x82,0xac,0x83,0x9, 0xe1,0x14,0x81,0x14,0x0, 0xe0,0x0, 0xd8,0x1c,0x17,0x81, +0xaf,0x82,0xaf,0x83,0x9, 0xe1,0x3c,0x69,0x9, 0xa1,0xe0,0x10,0x0, 0x94,0x0, 0x0, +0x8, 0xb3,0xe0,0x1, 0x1f,0xf2,0xe0,0x2, 0x19,0x13,0xa6,0x8f,0xe0,0x2, 0x1f,0x63, +0xe0,0x2, 0x8f,0xd2,0xbe,0x8e,0xe0,0x0, 0x27,0xfd,0xe0,0x2, 0x8f,0xd2,0xe2,0x0, +0xcf,0x81,0xe0,0x0, 0x1, 0x77,0xe0,0x2, 0x8f,0xd2,0xe0,0x2, 0x19,0xc8,0xe2,0x0, +0xcf,0x83,0x1, 0x86,0xe0,0x3, 0x1f,0x33,0xe0,0x3, 0x1f,0x9b,0xbf,0xf, 0x16,0x0, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8f,0x2e,0xe2,0x0, +0xc7,0x81,0xe0,0x3, 0x1e,0x89,0x3f,0x7f,0xb6,0xd, 0xe0,0x0, 0x1, 0x69,0xe0,0x2, +0x1f,0x79,0xe0,0x3, 0x1f,0x95,0xbf,0xf, 0x16,0x0, 0x8f,0x3, 0xe0,0x3, 0x1f,0xb0, +0xe4,0x0, 0xc7,0x5, 0x3f,0x1f,0x87,0xe, 0xe0,0x6, 0xaf,0x12,0x8f,0x3, 0xe4,0x0, +0xc7,0x5, 0x3f,0x1f,0x87,0x1e,0xe0,0x6, 0xaf,0x22,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, +0x3f,0x1f,0x87,0x2e,0xe0,0x6, 0xaf,0x42,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, 0x3f,0x1f, +0x87,0x3e,0xe0,0x6, 0xaf,0x52,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, 0x3f,0x9e,0x8f,0xcf, +0xe0,0x3, 0xb7,0xc2,0x17,0x80,0xe0,0x6, 0xaf,0xb2,0xe0,0x3, 0xb6,0x32,0x8f,0x3, +0xe0,0x3, 0x1f,0x8e,0x8c,0x3, 0x3f,0x9e,0x87,0x8f,0xe0,0x5, 0xaf,0x92,0xd7,0x75, +0x8f,0x3, 0xe0,0x2, 0x1f,0xc4,0xe4,0x0, 0xc7,0x3, 0x3f,0x1f,0x87,0xe, 0xe0,0x4, +0xaf,0x2, 0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x1f,0x87,0x1e,0xe0,0x4, 0xaf,0x12, +0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x9e,0x87,0xaf,0xe0,0x4, 0xaf,0xa2,0x81,0x83, +0xe0,0x0, 0x1f,0xcd,0xe0,0x6, 0xa9,0x82,0x87,0x8f,0xe0,0x1, 0xaf,0xc2,0x9, 0xe1, +0xe0,0x2, 0x19,0xc8,0x8f,0x83,0xe2,0x0, 0xcf,0x82,0xe7,0xff,0x1, 0x8d,0xe0,0x3, +0x1f,0x32,0xe0,0x3, 0x1f,0x9b,0xbf,0xf, 0xe7,0xff,0x0, 0x8b,0xe0,0x2, 0x1f,0x78, +0xe0,0x3, 0x1f,0x95,0xbf,0xf, 0xe7,0xff,0x0, 0x99,0x8, 0xb1,0xe0,0x3, 0x1f,0x93, +0x17,0x0, 0x14,0x1, 0xb7,0xf, 0xe0,0x0, 0xde,0xd7,0xdf,0x2e,0xe0,0x0, 0x1f,0xcd, +0x8c,0xf, 0xe0,0x0, 0xdd,0x3d,0x8, 0xa1,0xe7,0xfe,0x0, 0xd4,0x8, 0xb7,0xf8,0x0, +0xc, 0x38,0xe0,0x2, 0x1f,0xc8,0xe0,0x2, 0x19,0x93,0x8a,0xf, 0xe0,0x1, 0x19,0x4f, +0x13,0x5, 0xe0,0x3, 0x1a,0xb0,0x3b,0x34,0xe0,0x6, 0x8d,0x13,0xe0,0x6, 0x8d,0xa3, +0xe0,0x6, 0x8e,0x43,0xe0,0x3, 0x9e,0xc3,0x9f,0x2, 0xe0,0xf, 0x3a,0x96,0x8b,0x8f, +0xf0,0x0, 0x8c,0x1f,0xad,0xf, 0xe2,0x2, 0xc7,0x0, 0xad,0x9f,0xae,0x2f,0xae,0xcf, +0xe0,0x1, 0x2f,0x72,0x9f,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x91,0x9f,0x82,0xe3,0xff, +0xc7,0xfe,0xb7,0x82,0xe0,0x6, 0x8f,0x93,0x37,0xa3,0xe2,0x0, 0xcf,0x86,0xe0,0x0, +0x2, 0x76,0xe0,0xf, 0x3a,0x96,0xab,0x8f,0xe0,0x6, 0xab,0x93,0x9f,0x82,0xe2,0x0, +0xc7,0x82,0x27,0x91,0x9f,0x82,0xe3,0xff,0xc7,0xfd,0xb7,0x82,0xe0,0x6, 0x8f,0xa3, +0x37,0xa3,0xe2,0x0, 0xcf,0x8b,0xe0,0x0, 0x2, 0x73,0x3a,0x96,0xf0,0x0, 0xac,0x15, +0xf0,0x6, 0xac,0x23,0x9f,0x82,0xe2,0x0, 0xc7,0x84,0xe0,0x0, 0x2f,0xfe,0x9f,0x82, +0xe2,0x0, 0xc7,0x88,0xe0,0x1, 0x2f,0x88,0x9f,0x82,0xe2,0x0, 0xc7,0xa0,0xe0,0x1, +0x2f,0x8f,0x9f,0x82,0xe2,0x0, 0xc7,0xc0,0xe0,0x1, 0x2f,0x9d,0x9f,0x82,0xe2,0x1, +0xc7,0x80,0xe0,0x1, 0x2f,0xaa,0x9f,0x82,0xe2,0x4, 0xc7,0x80,0x27,0xa6,0x9f,0x82, +0xe0,0x3, 0x1f,0x38,0xe3,0xfb,0xc7,0xff,0xa6,0x8e,0xb7,0x82,0xe7,0xbf,0x17,0x7f, +0xe0,0x1, 0xa7,0xed,0xe7,0xc0,0x15,0x80,0x3f,0xde,0xe0,0x1, 0xbf,0xed,0xe0,0x0, +0x1f,0xc4,0xe0,0xb, 0x8f,0x23,0xa6,0xf, 0xe4,0x0, 0xc7,0x32,0xe0,0x1d,0xc6,0x40, +0xa7,0xfc,0xe2,0x3f,0xc7,0x7e,0x3f,0xdb,0x3f,0xce,0xbf,0xfc,0xe0,0x1, 0xa7,0xed, +0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x9f,0x82,0xe2,0x8, 0xc7,0x80,0xe0,0x1, +0x2f,0x93,0x9f,0x82,0xe2,0x20,0xc7,0x80,0x27,0x85,0x9f,0x82,0xe3,0xdf,0xc7,0xff, +0xb7,0x82,0x9f,0x82,0xe2,0x40,0xc7,0x80,0xe0,0x0, 0x2f,0xfe,0x9f,0x82,0xe2,0x80, +0xc7,0x80,0x2f,0xa0,0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe0,0x6, 0x8c,0x13,0xe0,0x3, +0xdd,0x6d,0xe7,0xff,0x24,0x8, 0xe0,0x6, 0x8c,0x13,0xdd,0xdc,0xe0,0x0, 0x1f,0xcd, +0x8f,0x8f,0xe7,0xff,0x27,0x85,0xd8,0xc7,0xe7,0xff,0x0, 0x82,0xe0,0x6, 0x8c,0x23, +0xdd,0xea,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0xe7,0xff,0x27,0x8e,0xd8,0xbc,0xe7,0xff, +0x0, 0x8b,0x9f,0x82,0x3c,0x64,0xe3,0x7f,0xc7,0xff,0xb7,0x82,0xf8,0x0, 0xc, 0x28, +0xb, 0xa1,0xe7,0xfa,0x0, 0xd7,0x9f,0x82,0x3c,0x64,0xe3,0xff,0xc7,0xfb,0xb7,0x82, +0x9f,0x82,0xe0,0x20,0xcf,0x80,0xb7,0x82,0xde,0x1, 0x9f,0x82,0xe2,0x0, 0xc7,0x88, +0xe7,0xfe,0x27,0xfc,0x9f,0x82,0xe3,0xff,0xc7,0xf7,0xb7,0x82,0xe0,0x6, 0x8c,0x43, +0xdd,0xdb,0x9f,0x82,0xe2,0x0, 0xc7,0xa0,0xe7,0xfe,0x27,0xf5,0x9f,0x82,0x3c,0x64, +0xe3,0xff,0xc7,0xdf,0xb7,0x82,0x9f,0x82,0xe0,0x4, 0xcf,0x80,0xb7,0x82,0x9f,0x82, +0xe0,0x20,0xcf,0x80,0xb7,0x82,0xdd,0xe2,0x9f,0x82,0xe2,0x0, 0xc7,0xc0,0xe7,0xfe, +0x27,0xe7,0xe0,0x2, 0x1f,0xac,0x9f,0x2, 0x8e,0x8f,0xe3,0xff,0xc7,0x3f,0xe4,0x0, +0xc6,0x9c,0x3c,0xe4,0x3f,0x9d,0xa4,0x4f,0xb7,0x2, 0xd4,0xc7,0x9f,0x82,0xe2,0x1, +0xc7,0x80,0xe7,0xfe,0x27,0xda,0x9f,0x82,0xe3,0xfe,0xc7,0xff,0xb7,0x82,0xd5,0xc4, +0xe7,0xfe,0x0, 0xd3,0x9f,0x82,0x3c,0x64,0xe3,0xfd,0xc7,0xff,0xb7,0x82,0xdd,0x4e, +0xe7,0xfe,0x0, 0x8a,0x9f,0x82,0x3c,0x64,0xe3,0xbf,0xc7,0xff,0xb7,0x82,0xdd,0xdf, +0xe7,0xfe,0x0, 0xfe,0x9f,0x82,0x3c,0x64,0xe3,0xf7,0xc7,0xff,0xb7,0x82,0xe0,0x1, +0x8c,0xa3,0xe0,0x3, 0xdc,0xff,0xe7,0xfe,0x0, 0xe6,0x8, 0xb4,0xe0,0x2, 0x19,0x13, +0x8f,0xc2,0xe2,0x0, 0xcf,0x85,0x1, 0x21,0xe2,0x0, 0xcf,0x84,0x1, 0x36,0xe0,0x1, +0x8f,0xf2,0x2f,0x98,0xe0,0x1, 0x1a,0x4f,0x99,0x84,0x29,0x82,0xa, 0x61,0x14,0x1, +0xe0,0x0, 0xdd,0x8a,0xe0,0x43,0x39,0x93,0xe2,0x0, 0xc9,0x80,0x4, 0x13,0xde,0xb7, +0xe0,0x1, 0x8f,0xe2,0xe2,0x1, 0xc7,0xfd,0xe0,0x1, 0xaf,0xe2,0xa, 0x21,0xe0,0x1a, +0x0, 0xaa,0xe0,0x7, 0xd3,0x9f,0x0, 0xe7,0x17,0x81,0xaf,0xc2,0x17,0x82,0xaf,0xc2, +0x0, 0xdf,0x9f,0x84,0xe0,0x2, 0x1f,0x48,0xe2,0xff,0xc7,0xff,0xb7,0x84,0xe0,0x6, +0x8e,0x82,0x8f,0x8e,0x3e,0xff,0x1, 0x64,0xe0,0x6, 0x87,0x82,0xaf,0x8e,0xde,0x86, +0x14,0x1, 0xe0,0x3, 0xd8,0xdf,0x0, 0xdc,0xd8,0x27,0x0, 0xca,0xe0,0x2, 0x1f,0x93, +0xe0,0x2, 0x8f,0x5f,0x27,0x12,0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0xd, +0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x3, 0x1, 0x1d,0xe0,0x0, 0x1f,0x33,0x8e,0x8e, +0xe2,0x0, 0xce,0x81,0x1, 0x27,0x38,0x82,0xe0,0x2, 0x1f,0x48,0x8f,0xe, 0xe2,0x0, +0xcf,0x2, 0xe0,0x2, 0x1f,0x2c,0x8e,0x8e,0xe4,0x0, 0xc6,0x9c,0x3f,0x1d,0x1, 0x2f, +0xa6,0xce,0xe0,0x3, 0x1f,0x1b,0xbe,0x8e,0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x3, +0x1, 0xe5,0xe0,0x2, 0x1f,0x2c,0x8e,0x8e,0xe4,0x0, 0xc6,0x9c,0x3f,0x1d,0xa6,0xce, +0xe0,0x3, 0x1f,0x1b,0xbe,0x8e,0xe0,0x0, 0x1f,0x33,0x8e,0x8e,0xe2,0x0, 0xce,0x81, +0x1, 0xdb,0xe0,0x2, 0x1d,0xc8,0xe0,0x3, 0x1e,0x30,0x8e,0x8b,0xe4,0x0, 0xc6,0x85, +0x3e,0x9c,0x86,0x8d,0xe0,0x6, 0xae,0x9f,0x8e,0x8b,0xe4,0x0, 0xc6,0x85,0x3e,0x1d, +0x86,0x1c,0xe0,0x6, 0xae,0x2f,0x17,0x80,0xaf,0x8e,0x38,0x82,0xa7,0x4e,0xe0,0x3, +0x1e,0x9b,0xe0,0x6, 0xc7,0x26,0xbf,0xd, 0xe7,0xff,0x0, 0xb4,0x8, 0xb1,0xe0,0x2, +0x1e,0xc0,0xe0,0x2, 0x1e,0x12,0x17,0x80,0xe0,0x4, 0xaf,0xdd,0x17,0x80,0x97,0xc, +0xe3,0xfe,0xc7,0x7f,0xb7,0xc, 0xe0,0x3, 0x1f,0x13,0xe0,0x4, 0x8e,0xdd,0xb7,0x8e, +0xe0,0x2, 0x1f,0x72,0xb7,0x8e,0xe0,0x0, 0x1f,0x48,0xb7,0x8e,0xe0,0x2, 0x1f,0x93, +0x8f,0x6f,0xe0,0x0, 0x1f,0xae,0xae,0x8f,0xe0,0x2, 0x1f,0xfa,0xaf,0xf, 0xe0,0x1, +0xdf,0x41,0xdd,0x67,0x14,0x0, 0xe0,0x3, 0xd8,0x5d,0xe0,0x1, 0x1f,0xf2,0xe0,0xc, +0x15,0x52,0xa4,0xf, 0xe0,0x2, 0x1f,0x81,0xa4,0x8f,0xe0,0x8, 0xd0,0x8b,0xe0,0x3, +0xd6,0x1e,0xe0,0x2, 0x1f,0xf7,0xe0,0x2, 0x1f,0x48,0x8f,0x8f,0x8f,0xe, 0x37,0xde, +0xe2,0x0, 0xc7,0x81,0x27,0x82,0x8, 0xe1,0x8, 0xa1,0xe0,0x18,0x0, 0xf4,0xe0,0x0, +0x1f,0xcd,0xe0,0x2, 0x1f,0x13,0x87,0x8f,0xe0,0x1, 0x1e,0xcc,0xe0,0x1, 0xaf,0xce, +0x14,0x3, 0x86,0x8d,0xe0,0x2, 0x1f,0xde,0xae,0xfe,0xe0,0x3, 0x16,0x91,0x8d,0xee, +0xe0,0x2, 0x1e,0x7a,0x17,0x0, 0x3e,0x9f,0xe0,0x3, 0xc7,0x90,0xad,0x8c,0xaf,0xd, +0xaf,0xf, 0xe0,0x3, 0x0, 0xa8,0x0, 0x0, 0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, +0x1c,0x1f,0xa4,0x8f,0xe0,0xc, 0x15,0x52,0xe0,0x8, 0xd0,0x54,0xe0,0x0, 0x1e,0x1e, +0xe0,0x0, 0x1f,0x1d,0xe0,0x0, 0x1d,0x1c,0x9f,0x9e,0xe0,0x43,0x3d,0x9f,0xe2,0x0, +0xcd,0x80,0xe0,0x41,0x3e,0xcf,0xe3,0xff,0xc6,0xff,0xe0,0x6f,0x3d,0x2d,0xe0,0x80, +0xb7,0x9e,0x9e,0x8c,0x3e,0xff,0x3, 0x82,0xb7,0x8c,0x3f,0x7a,0xc6,0x2, 0x1, 0xed, +0x8, 0xe1,0x0, 0x0, 0x8, 0xb6,0xea,0x11,0x7b,0x52,0xe0,0x2, 0x1a,0x13,0x99,0x6, +0xe0,0x2, 0xa9,0x44,0xe0,0x2, 0x8f,0x94,0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0x21,0x8, +0xe0,0x2, 0x1f,0x12,0x16,0x80,0x97,0x8e,0xb6,0x86,0xcf,0x84,0xb7,0x8e,0xb, 0x61, +0x87,0x84,0xe7,0xff,0x17,0x0, 0x3f,0xce,0xe2,0x0, 0xc9,0x5, 0xaf,0x84,0x2, 0x9d, +0xe0,0x0, 0x1c,0x1e,0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x4d,0xe0,0x2, +0x1c,0xa, 0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x46,0xe0,0x0, 0x1c,0x1f, +0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x3f,0xe0,0x2, 0x1c,0x9, 0xe0,0xc, +0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x38,0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x0, +0xc9,0x5, 0xb1,0x6, 0x2, 0xb8,0xe0,0x2, 0x8f,0xb4,0xe0,0x2, 0x8f,0x24,0x37,0xa8, +0x3f,0x9e,0xc7,0x85,0x39,0x7f,0x1, 0xcc,0xe0,0x3, 0x1f,0x13,0x17,0x80,0xe0,0x2, +0x1e,0x97,0xb7,0x8e,0x11,0x0, 0xb7,0x8d,0x12,0x8a,0xe0,0x0, 0x1f,0x1e,0xe0,0x2, +0xaf,0x94,0x39,0xee,0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x9a,0x3, 0xe2,0x0, 0xca,0x46, +0x5, 0x8c,0x21,0x1b,0xe0,0x40,0x9f,0x93,0x9c,0x13,0x3c,0xe5,0x3c,0x1f,0xe0,0x7, +0xdf,0x9e,0xe0,0x8, 0x3a,0x28,0xb4,0x3, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x6, +0xc9,0x29,0xc1,0x82,0x1, 0xeb,0x17,0x80,0xb7,0x86,0x17,0x1, 0xe0,0x2, 0x1f,0x8d, +0xaf,0xf, 0xb, 0x61,0xdf,0x62,0x0, 0xc8,0x3f,0xe2,0x0, 0xe7,0x8, 0xb7,0xf8,0x0, +0xc, 0x3b,0xe0,0x3, 0x19,0xc7,0xde,0xfb,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0xe0,0x0, +0x1, 0xc0,0xe0,0x2, 0x19,0x13,0xe0,0x2, 0x1b,0xfa,0xe0,0x2, 0x1a,0xe6,0xf0,0x1, +0x1d,0xf2,0xf0,0x2, 0x1d,0x9, 0xe0,0x13,0x12,0x44,0x13,0x1, 0xf0,0x0, 0x14,0x0, +0xf0,0xc, 0x14,0xd2,0x0, 0x86,0xdf,0x24,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0x1, 0xa8, +0xde,0x45,0xe0,0x0, 0xde,0xf4,0xde,0x83,0x3c,0x64,0xe0,0x6, 0xd9,0xf8,0x8f,0x82, +0x37,0xc7,0x27,0xf2,0x3c,0x66,0xe0,0x0, 0xdb,0xd7,0xe0,0x1, 0xde,0x77,0xe0,0x2, +0xdb,0x9f,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0x1, 0x1d,0xe0,0x2, 0x8f,0x92,0x2f,0x9a, +0x8f,0x85,0x27,0x82,0xdf,0x48,0xe0,0x2, 0x8f,0x92,0x2f,0xde,0x87,0x82,0xe2,0x0, +0xc7,0xff,0xaf,0x82,0xde,0xfd,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0x1, 0x5a,0xe0,0x1, +0x1f,0xc5,0x17,0x1, 0x14,0x1, 0xaf,0xf, 0xf8,0x0, 0xd, 0xa8,0xb, 0xa1,0xe0,0x17, +0x0, 0xb3,0x8f,0x85,0x27,0xe9,0xe0,0x3, 0xdf,0xee,0xe0,0x2, 0x8f,0x92,0xe2,0x0, +0xcf,0x81,0x1, 0xc, 0xe0,0x3, 0xde,0x4b,0xef,0xfe,0xd9,0xbd,0xe0,0x1, 0xdf,0xcc, +0xe8,0x40,0x3c,0x68,0xe0,0x4, 0xdf,0xe4,0x0, 0xd4,0xe8,0x0, 0xa4,0x8b,0xe8,0x40, +0x3d,0x69,0xe8,0x40,0x3c,0x6a,0xe0,0x7, 0xdf,0x4d,0x0, 0xed,0x8, 0xb1,0xe2,0x0, +0xcc,0x66,0x1, 0x2f,0x5, 0x98,0xe2,0x1, 0xcc,0x8, 0x1, 0x9, 0xe2,0x1, 0xcc,0x2a, +0x1, 0xa3,0xe0,0x3, 0x1f,0x9a,0x17,0x5, 0xaf,0xf, 0x8, 0xe1,0xe0,0x3, 0x1f,0x9a, +0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xfa,0x14,0x1, 0xe0,0x1, 0xd9,0x9f,0x8, 0xa1, +0xe0,0x32,0x0, 0xf6,0xe2,0x0, 0xcc,0x55,0x1, 0x8f,0xe0,0x3, 0x1f,0x9a,0x8f,0x8f, +0xe2,0x0, 0xcf,0x85,0x1, 0xeb,0x14,0x1, 0xe0,0x1, 0xd9,0x90,0xe0,0x1, 0xd9,0x42, +0x8, 0xa1,0xe0,0x32,0x0, 0xd4,0xe0,0x3, 0x1f,0x9a,0x17,0x1, 0xaf,0xf, 0x8, 0xe1, +0xe0,0x3, 0x1f,0x9a,0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xd8,0x14,0x1, 0xe0,0x1, +0xd9,0x7d,0xe0,0x1, 0x1f,0xdc,0x17,0x7f,0xa7,0x8f,0xe0,0x7, 0xaf,0x3f,0x8, 0xe1, +0x8, 0xb4,0xe0,0x1, 0x1a,0x72,0xe0,0xc, 0x11,0xd2,0xa4,0x84,0xe0,0x3, 0x1c,0x10, +0x3d,0x63,0xe0,0x7, 0xde,0xff,0xe0,0x4, 0xdc,0x37,0xe0,0x0, 0x1c,0x8d,0xe0,0x0, +0x1c,0x12,0xe0,0x3, 0x19,0x3e,0xe0,0x3, 0x15,0x40,0xe0,0x7, 0xde,0xf3,0x3d,0x63, +0x14,0x80,0x3c,0x62,0xe0,0x7, 0xdf,0x28,0xa4,0x84,0x3d,0x63,0x3c,0x62,0xe0,0x7, +0xde,0xe9,0x17,0xac,0xb7,0x82,0xa, 0x61,0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x3, +0x1c,0x10,0xa4,0x8f,0xe0,0xc, 0x15,0x52,0xe0,0x7, 0xde,0xdc,0xe0,0x0, 0x1c,0x8d, +0xe0,0x0, 0x1c,0x12,0xe0,0x3, 0x15,0x40,0xe0,0x7, 0xde,0xd4,0x8, 0xe1,0x8, 0xb1, +0xe0,0x1, 0x1f,0xf2,0xe0,0x3, 0x1c,0x90,0xa4,0xf, 0xe0,0xc, 0x15,0x52,0xe0,0x7, +0xde,0xc9,0xe0,0x1, 0x1f,0xd7,0xe0,0x3, 0x8f,0xbf,0x2f,0x85,0xe0,0x3, 0xd3,0x7f, +0xef,0xfe,0xd9,0x21,0x14,0x1, 0xe0,0x6, 0xd6,0xe, 0x14,0x1, 0x8, 0xa1,0xe0,0x9e, +0x0, 0xc7,0xe0,0x2, 0x1f,0x40,0xe0,0x3, 0x1f,0xc7,0xe0,0x4, 0x87,0x7e,0xaf,0xf, +0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x1f,0xc0,0x17,0x0, 0xe0,0x4, 0xaf,0x5f,0x17,0x0, +0xe0,0x4, 0x8e,0x5f,0xe0,0x0, 0x1e,0xae,0xe0,0x2, 0x1f,0xec,0xe0,0x2, 0x19,0x7d, +0xae,0xd, 0xb7,0xf, 0xe0,0x19,0x17,0x1c,0xe0,0x2, 0x1e,0xc8,0x3f,0x12,0x17,0x81, +0xaf,0x8d,0xaf,0x8e,0xe0,0x1, 0xdd,0x3e,0xdb,0x64,0xe0,0x1b,0x14,0x2c,0xe0,0x6, +0xd8,0xf6,0xe0,0x6, 0xd2,0x9b,0xe0,0x3, 0xd4,0x22,0x14,0x1, 0xe0,0x3, 0xd6,0x52, +0xe0,0x5, 0xd7,0x9a,0xe0,0x19,0x17,0x1d,0x17,0x87,0x3f,0x12,0xaf,0x8e,0xe0,0x19, +0xc1,0x1e,0xaf,0x82,0x9, 0x61,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe0,0x1, +0x1f,0xc5,0xe0,0x2, 0x19,0x40,0x8f,0x8f,0x27,0x87,0xe0,0xd, 0x8f,0xe2,0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x1, 0x19,0xdf,0xbe,0xe0,0x3, 0x19,0xc7,0xe0,0x0, 0x1b,0xb8, +0xf0,0x0, 0x1d,0x9a,0xe0,0x0, 0x1a,0x39,0xe0,0x0, 0x1a,0xbc,0xf0,0x1, 0x1d,0x13, +0xf0,0x1, 0x1c,0x92,0xf0,0x2, 0x1c,0x66,0xe0,0x1, 0x1b,0x69,0xf0,0x1, 0x1e,0x68, +0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x96,0x87,0x84,0x17,0x0, 0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0xe0,0x2, 0xaf,0x92,0xe0,0xa, 0x8e,0x82,0xaf,0x7, 0xe8,0x0, +0xaf,0xb, 0xaf,0x84,0xe0,0x1, 0x2e,0x98,0x9f,0x85,0xe2,0x0, 0xcf,0xe3,0xe0,0x1, +0x2, 0x93,0x9f,0x85,0xc7,0x81,0xb7,0x85,0xe0,0x1, 0xd3,0x77,0xe0,0x4, 0xd7,0xbe, +0xe0,0x0, 0xdd,0x95,0xe8,0x0, 0x8f,0x8a,0xe8,0x0, 0x8c,0x9, 0x37,0xa8,0x3c,0x4f, +0xe0,0x6, 0xd8,0x95,0xe0,0x2, 0xd9,0x94,0xe0,0x4, 0xde,0x97,0xe8,0x0, 0x8f,0x88, +0xe0,0x0, 0x27,0xfe,0x8f,0x86,0xe0,0x0, 0x27,0xdb,0xe0,0x3, 0xde,0xac,0xe8,0x0, +0x8f,0x8c,0xe2,0x0, 0xcf,0x84,0xe0,0x1, 0x1, 0x15,0xf0,0x1, 0x1f,0x57,0xe8,0x3, +0x8f,0xbe,0xe0,0x0, 0x27,0xf7,0xf0,0x2, 0x1e,0xc8,0xe0,0x1, 0xde,0x85,0xe8,0x0, +0x8c,0x8d,0xe8,0x0, 0x8c,0xc, 0xe0,0x2, 0xd9,0x56,0xe8,0x0, 0x8f,0xd, 0xe8,0x0, +0x8f,0x8d,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x6b,0xe0,0x0, 0x1f,0x93,0x17,0x0, +0xaf,0xf, 0x8f,0x86,0x27,0xb4,0x14,0x1, 0xe0,0x6, 0xd5,0x4d,0x14,0x0, 0xe0,0x4, +0xde,0x87,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x23,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x1, 0x18,0xe8,0x0, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x1d, +0xe0,0x4, 0x8f,0xc2,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x6, 0xe0,0x2, 0xd6,0xb2, +0xe0,0x2, 0xde,0x2f,0x14,0x2, 0xe0,0x6, 0xd5,0x2e,0xe0,0x6, 0xd5,0xd3,0x14,0x3, +0xe0,0x6, 0xd5,0x29,0xe0,0x4, 0xd4,0xd0,0x14,0x4, 0xe0,0x6, 0xd5,0x24,0xe0,0x6, +0xd8,0x4d,0xef,0xff,0xd1,0xea,0x8f,0x86,0xe0,0x0, 0x2f,0xca,0x87,0x83,0xe0,0x5, +0xd6,0xd2,0xe0,0x4, 0x87,0xf2,0xaf,0x83,0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe7,0xfe, +0x1, 0x6e,0x14,0x1, 0xe0,0x0, 0xda,0x8, 0xe0,0x4, 0x8f,0xc2,0xe2,0x0, 0xcf,0x81, +0x1, 0x87,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xa7,0xce,0xcf,0x84,0xbf,0xce,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0x17,0x80,0xb7,0x85,0xe7,0xfe,0x0, 0xf0,0x8f,0x86,0xe7,0xfe, +0x27,0xd1,0xe0,0x1, 0xd6,0x4a,0xe0,0x4, 0x87,0xf2,0xaf,0x83,0xe7,0xfe,0x0, 0xca, +0xe0,0x3, 0xd2,0x5d,0xef,0xfe,0xd7,0xff,0xe7,0xff,0x0, 0x87,0xe8,0x0, 0x8f,0x8c, +0x16,0x84,0xe0,0x2f,0x3f,0x8d,0xe7,0xff,0x27,0x96,0xe0,0x3, 0x1f,0xac,0xe4,0x0, +0xc7,0xe, 0x3f,0x1f,0x8f,0xbe,0xe7,0xff,0x27,0x8e,0xde,0x83,0xe7,0xff,0x0, 0x8b, +0xe0,0x3, 0x1f,0xc0,0x17,0x1, 0xaf,0xf, 0xe7,0xfe,0x0, 0xe9,0xe0,0x6, 0xdf,0xa5, +0xe0,0x0, 0x1f,0x87,0xe8,0x3, 0x87,0x3e,0x86,0xf, 0xe0,0x2, 0x1f,0xdf,0x86,0x8f, +0xe0,0x0, 0x1f,0x85,0xae,0xf, 0xe0,0x2, 0x1f,0xdd,0xae,0x8f,0x16,0x80,0xe0,0x2, +0x1f,0xdb,0xae,0x8f,0xe0,0x1, 0x1f,0xcc,0x87,0x8f,0xe0,0x5, 0xaf,0xb2,0xe0,0x2, +0x1f,0xa8,0xaf,0xf, 0xe0,0x1, 0xd6,0x9, 0xef,0xfe,0xdf,0xcd,0xef,0xfe,0xd8,0x55, +0xe7,0xff,0x0, 0xbb,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xa7,0xce,0xcf,0x84,0xbf,0xce, +0xe7,0xfe,0x0, 0xf6,0xe0,0x2, 0x1f,0x7a,0xaf,0x8e,0xe7,0xfd,0x0, 0xe7,0xde,0x80, +0x8f,0x87,0xe7,0xfe,0x0, 0xdd,0xde,0x69,0xe7,0xfe,0x0, 0xe4,0x8, 0xb2,0xe0,0x2, +0x1f,0x40,0x16,0x81,0xe0,0x4, 0xae,0xfe,0x14,0x2, 0xe0,0x4, 0x87,0x7e,0xe0,0x3, +0x1e,0xc7,0xe0,0x2, 0x1f,0xfd,0xaf,0xd, 0x16,0x80,0xe0,0x2, 0x1f,0x13,0xe0,0x1, +0x1e,0x5c,0xae,0x8e,0xe0,0x19,0x16,0x9d,0x3e,0x9f,0x17,0x7, 0xa1,0xc, 0xaf,0xd, +0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0x17,0x7b,0xa7,0xc2,0x3f,0xde,0xbf,0xc2,0xe0,0x1, +0xd7,0x95,0xa7,0xc2,0xcf,0x84,0xbf,0xc2,0x9, 0x61,0x0, 0x0, 0x8, 0xb2,0xe0,0x2, +0x19,0x40,0xe0,0x6, 0xd7,0x22,0xe0,0x2, 0xda,0xa7,0xe0,0x2, 0xdb,0xf8,0xe0,0x1, +0xdb,0xbb,0xe0,0x4, 0xd0,0x21,0xe0,0x4, 0xd1,0x49,0xdf,0xc9,0xe0,0x4, 0x8f,0xf2, +0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0xe2,0x0, 0xcf,0x83,0x1, 0xf9,0xdd,0x50,0xe0,0x4, +0x8f,0xf2,0xe2,0x0, 0xcf,0x81,0x1, 0xf8,0xde,0x88,0x0, 0xf1,0xe0,0xe, 0x34,0x22, +0xe0,0xf, 0x34,0x42,0xe0,0x43,0x3f,0xe, 0xe0,0x3, 0x1d,0xb8,0x16,0x4, 0x16,0x81, +0x3e,0xdf,0x3e,0x5e,0xf0,0x0, 0xa3,0x8b,0x3e,0x4d,0xe2,0x0, 0xc4,0x12,0x16,0x88, +0xe2,0x0, 0xc7,0x20,0x3e,0xdf,0x3e,0x48,0xe0,0x0, 0x1f,0xc4,0xe8,0x1, 0xa5,0xe7, +0x3e,0x4e,0x3e,0xcc,0xa7,0x8f,0xe7,0xbf,0x17,0x7f,0x3f,0x5b,0xe4,0xd, 0x36,0xa5, +0xe0,0x24,0x15,0xf0,0xe0,0x3, 0x1c,0xc8,0xe0,0x3, 0x1d,0x49,0xe8,0x1, 0xbf,0x67, +0xe4,0xc, 0x36,0x2c,0xea,0xe, 0xc6,0x80,0x3d,0x9f,0xe0,0x1a,0xa7,0x2f,0xe0,0x7, +0xc7,0xb0,0x3f,0x59,0xe0,0x43,0xbf,0x2f,0x3f,0xfb,0xe0,0x43,0xa7,0x2f,0x3f,0x4c, +0xe0,0x43,0xbf,0x2f,0xe0,0x40,0xa7,0x1f,0x3f,0x5a,0xe0,0x40,0xbf,0x1f,0xe0,0x40, +0xa7,0x1f,0x3f,0x4d,0xe0,0x40,0xbf,0x1f,0x1, 0xe9,0xe8,0x1, 0xa7,0xe7,0xe0,0x40, +0xcf,0x80,0xe8,0x1, 0xbf,0xe7,0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3b,0xe0,0x2, +0x1f,0x66,0xe0,0x2, 0x1f,0xfd,0x87,0xe, 0x15,0x85,0xe0,0x3, 0x8e,0x2f,0x3d,0xb9, +0xe0,0x3, 0x1e,0xb0,0xe2,0x0, 0xc7,0x1, 0x3e,0x7e,0x3e,0x9b,0xf0,0x40,0x3d,0x69, +0xf0,0x40,0x3c,0xe8,0x8a,0xbd,0xe0,0x1, 0x1, 0x69,0x9b,0x5f,0xe0,0x1, 0x8a,0xf, +0xf0,0x2, 0x1d,0xf9,0xe0,0x3, 0x1f,0xb8,0xe4,0x7, 0xc2,0xb0,0xa1,0x8f,0xe0,0x0, +0x1f,0xc4,0xe7,0xbf,0x17,0x7f,0xa1,0xf, 0xe0,0x1, 0xa7,0xe3,0x3a,0x92,0x13,0xa0, +0x3f,0xde,0xf2,0x0, 0xcd,0x2, 0x3b,0x95,0xe0,0x6, 0x17,0x26,0xe8,0xe, 0x3f,0x19, +0xe0,0x6, 0x15,0x28,0x14,0x80,0xe0,0x1, 0xbf,0xe3,0x3c,0x67,0xf0,0x6, 0x14,0x48, +0xe0,0x79,0x39,0x2e,0xf0,0x18,0x3c,0x15,0xe0,0x7, 0xdc,0xae,0xe0,0x0, 0x15,0x68, +0x14,0x80,0xe8,0x40,0x3c,0x68,0xe0,0x7, 0xdc,0xa7,0x23,0x2e,0x14,0x7f,0x3c,0x16, +0xe3,0xff,0xc4,0x7f,0x14,0xfe,0x15,0x7f,0xe8,0x9, 0x3c,0x9b,0xe8,0xa, 0x3d,0x19, +0xe8,0x8, 0x3c,0x19,0xf0,0x0, 0x13,0x81,0xe0,0x80,0x9f,0x19,0x17,0x84,0x3f,0x9e, +0xe0,0xd, 0x37,0x82,0x36,0xa2,0xe0,0x80,0x8d,0x9a,0x3e,0x97,0xe0,0x41,0x3f,0xe, +0xa6,0xd, 0x37,0x23,0x35,0xbe,0xe0,0xe, 0x37,0x85,0x3e,0x4b,0x37,0x22,0xbe,0xd, +0xe8,0xe, 0x3f,0x18,0xa6,0x8e,0xe0,0x41,0x3f,0x8f,0xf0,0xf, 0x33,0xbf,0x3f,0xcd, +0x3c,0x7a,0xbf,0x8e,0x1, 0xe2,0xe0,0x1, 0xa6,0x5, 0xe0,0x1a,0xa6,0x95,0xe8,0x6, +0x3b,0x19,0x17,0x90,0xe1,0x80,0x8f,0x16,0x37,0x3f,0x3e,0x4e,0xe0,0x1, 0xbe,0x5, +0x8f,0x26,0x37,0x3f,0xc7,0xf8,0x3e,0xce,0xe3,0xff,0xcf,0xf8,0xe0,0x1a,0xbe,0x95, +0x1, 0xf2,0xf2,0x0, 0xcd,0x1, 0x1, 0xe, 0xe0,0x1, 0xa7,0xe3,0x3c,0x64,0xe0,0x40, +0xcf,0x80,0xe0,0x1, 0xbf,0xe3,0xf8,0x0, 0xd, 0xa8,0xb, 0xa1,0xe7,0xfe,0x0, 0x98, +0x3d,0x2, 0x16,0x9c,0x3e,0x95,0xe0,0x16,0x15,0x90,0x3e,0x6d,0x17,0x0, 0x3d,0x92, +0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x1, +0xcf,0x4a,0xbd,0xf, 0x1, 0xf6,0xe0,0x6, 0xc2,0xc4,0xe0,0x16,0x15,0x90,0x3e,0x65, +0x17,0x0, 0x3d,0x92,0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80, +0xa5,0x1c,0x3f,0x9b,0xe2,0x0, 0xcf,0x1a,0xbd,0xf, 0x1, 0xf5,0xe0,0x1d,0x15,0xc0, +0x3e,0x6d,0x17,0x0, 0x3d,0x92,0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80, +0xa5,0x1c,0x3f,0x9b,0xe2,0x1, 0xcf,0x4a,0xbd,0xf, 0x1, 0xf6,0xe0,0x1d,0x15,0xc0, +0x3e,0x65,0x17,0x0, 0xe0,0xb, 0x3d,0x92,0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2, +0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x0, 0xcf,0x1a,0xbd,0xf, 0x1, 0xf5, +0x17,0x0, 0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa6,0x1d,0x3f,0x92, +0xe2,0x1, 0xcf,0x4a,0xbe,0xf, 0x1, 0xf6,0xe0,0x0, 0x17,0x0, 0xe0,0x1, 0x17,0xd2, +0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa6,0x95,0x3f,0x92,0xe2,0x0, 0xcf,0x1a, +0xbe,0x8f,0x1, 0xf5,0xe7,0xff,0x0, 0x92,0x9b,0x6f,0xe0,0x1, 0x8a,0x1f,0xf0,0x2, +0x1d,0xf8,0xe7,0xfe,0x0, 0x99,0x8, 0xb5,0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d, +0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, 0xc7,0x81,0x3e,0xff,0xe0,0x0, 0x1, 0x49, +0x9a,0x5e,0xe0,0x2, 0x19,0x79,0xe0,0x3, 0x1f,0xb8,0xe7,0xbf,0x17,0x7f,0xa2,0x8f, +0xe0,0xc, 0x15,0x40,0xe0,0x1, 0xa7,0xe5,0x14,0x80,0x3f,0xde,0xe0,0x3, 0x1f,0x3f, +0xe0,0x1, 0xbf,0xe5,0xa1,0x8e,0xe0,0xc, 0xc1,0xd0,0x3c,0x63,0xe0,0x7, 0xdb,0xc4, +0x3e,0x62,0x16,0x80,0x2a,0xe, 0x0, 0xa5,0x9d,0x8c,0xa7,0xf, 0xc6,0x81,0xe4,0xb, +0x35,0xa0,0xe3,0xff,0xc6,0xff,0x3f,0x4b,0x3a,0x7d,0xbf,0xf, 0xc6,0x2, 0x1, 0x19, +0xe0,0xf, 0x36,0xc1,0x3f,0x6f,0x15,0x81,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc7,0x7f, +0x37,0xa2,0x3d,0xdd,0x37,0x22,0x3f,0x93,0x25,0xe8,0x3f,0x13,0x9d,0x8c,0xa7,0x8e, +0xc6,0x81,0xe3,0xff,0xc6,0xff,0x3f,0xcb,0x3a,0x7d,0xbf,0x8e,0xc6,0x2, 0x1, 0xe9, +0xe0,0x1, 0xa7,0xe5,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xe5,0xa, 0xe1,0x9a,0x6e, +0xe0,0x2, 0x19,0x78,0xe7,0xff,0x0, 0xb9,0x8, 0xb5,0x11,0x3, 0x39,0x38,0xe0,0x2, +0x1a,0x44,0x17,0x5, 0x3f,0x38,0x39,0x14,0xe0,0x3, 0x1f,0xb0,0x39,0xe8,0x8c,0x2, +0x3f,0x9e,0x8a,0xbf,0xe0,0x7, 0xd2,0x2c,0x8c,0x92,0x3c,0x65,0xe0,0x7, 0xd2,0x5e, +0x8c,0xa2,0x3c,0x65,0xe0,0x7, 0xd2,0x97,0xe2,0x0, 0xc9,0x81,0x1, 0x2, 0xa, 0xe1, +0x8c,0xc4,0x14,0x3, 0xe0,0x7, 0xd2,0x52,0x8c,0xd4,0x14,0x3, 0xe0,0x7, 0xd2,0x8b, +0x8c,0xc4,0x14,0x4, 0xe0,0x7, 0xd2,0x4a,0x8c,0xd4,0x14,0x4, 0xe0,0x7, 0xd2,0x83, +0x8c,0xc4,0x14,0x0, 0xe0,0x7, 0xd2,0x42,0x8c,0xd4,0x14,0x0, 0xa, 0xa1,0xe0,0xe4, +0x0, 0xfa,0xe2,0x0, 0xcc,0x82,0xe0,0x0, 0x2, 0xe1,0x8, 0xb5,0x17,0xfd,0x3f,0x98, +0xe2,0x0, 0xcf,0x81,0x39,0x68,0x3a,0x69,0xe0,0x1, 0x5, 0x88,0xe0,0x0, 0x2c,0x57, +0xe0,0x3, 0x1f,0xb8,0xe7,0xbf,0x16,0x7f,0xa6,0x8f,0xe0,0x0, 0x1f,0xc4,0xe0,0x1, +0xa7,0x6d,0xa7,0x8f,0x3f,0x5c,0xe0,0x1, 0xbf,0x6d,0xe2,0x0, 0xcc,0x81,0xa7,0x4f, +0xe6,0x7, 0x16,0x7f,0x3f,0x5c,0xe0,0x0, 0x1, 0x4a,0xe0,0x28,0xcf,0x0, 0xbf,0x4f, +0x16,0x40,0xa7,0x4f,0xe7,0xf8,0x15,0x80,0x3f,0x5c,0xcf,0x5, 0xbf,0x4f,0x12,0x85, +0xa7,0x5f,0xe0,0x3, 0x1e,0x4a,0x3a,0xb9,0x3f,0x5c,0xe8,0x0, 0xcf,0x5, 0xbf,0x5f, +0xa7,0x5f,0xe0,0x3, 0x19,0xb0,0x3f,0x5b,0xcf,0x5, 0xbf,0x5f,0xe0,0xc, 0x39,0x95, +0xe0,0x1, 0xa7,0xed,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x8c,0xcc,0xe0,0x7, +0xd0,0x19,0xe0,0x3, 0x1f,0x8e,0x3c,0x62,0x3f,0x94,0x84,0x8f,0xe0,0x7, 0xd0,0x3d, +0x39,0x95,0x8d,0x23,0x3c,0x62,0x3c,0xea,0xe0,0x7, 0xd0,0xf9,0x8c,0x83,0x3c,0x62, +0x34,0xa3,0xe0,0x7, 0xd0,0xac,0x8c,0x93,0x3c,0x62,0x34,0xa3,0xe0,0x7, 0xd0,0xca, +0x3c,0x64,0xa, 0xa1,0xe7,0xfe,0x0, 0xea,0x38,0x82,0x12,0x85,0x3a,0xb9,0xe0,0x3, +0x19,0xb0,0xe0,0xf, 0x39,0x95,0x8c,0xcf,0x0, 0xdb,0xe0,0x50,0xcf,0x0, 0xbf,0x4f, +0x16,0x40,0xa7,0x4f,0x14,0x85,0x3f,0x5c,0xcf,0xa, 0xbf,0x4f,0x3a,0xe9,0xa7,0x5f, +0xe0,0x3, 0x1e,0x4a,0xe0,0x3, 0x19,0xb0,0x3f,0x5c,0xe8,0x0, 0xcf,0xa, 0xbf,0x5f, +0xe7,0xf8,0x16,0x0, 0xa7,0x5f,0x3f,0x5c,0xcf,0xa, 0xbf,0x5f,0xe0,0x1, 0xa7,0xed, +0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0xe0,0x6, 0xdf,0xd4,0x3c,0xe2,0x3c,0x62, +0xe0,0x6, 0xdf,0xfb,0xe7,0xff,0x0, 0xbe,0x14,0x8a,0xe0,0x6, 0xdf,0xcb,0x14,0x80, +0x3c,0x62,0x12,0x85,0xe0,0x6, 0xdf,0xf1,0xe0,0x3, 0x19,0xb0,0x3a,0xb4,0xe7,0xff, +0x0, 0xb1,0x0, 0x0, 0xe0,0x2, 0x1f,0x66,0xe0,0x0, 0x1d,0x3b,0xe0,0x2, 0x1f,0xfd, +0x87,0xe, 0xf0,0x1, 0x8b,0xfa,0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, 0xe8,0xc, +0x3d,0x17,0x3e,0xfe,0xf0,0x6, 0x89,0xc, 0xe0,0x1, 0x1, 0x35,0xf0,0x0, 0x9a,0x5f, +0xf0,0x1, 0x89,0x8f,0xe0,0x1, 0x24,0x25,0xe0,0x0, 0x1f,0xba,0xf0,0x3, 0x1b,0x41, +0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe0,0x1, 0x27,0xa5,0x8, 0xb2,0xe0,0x1, 0x1f,0xdc, +0xe7,0x7f,0x16,0xff,0xa4,0xf, 0xa7,0x88,0xa7,0x8, 0x37,0xce,0xe2,0x0, 0xc7,0x81, +0xe4,0x0, 0xcf,0x81,0x3f,0x5d,0x37,0xae,0x3f,0xce,0xbf,0x88,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe0,0x1, 0x1f,0xcd,0xf0,0xe, 0x33,0xa2,0x96,0xfb,0x3f,0x9e,0xb6,0x8f, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0,0x1, 0x97,0xb, 0xf0,0x0, 0x12,0x82,0xb7,0x1f, +0xf0,0x15,0x3a,0x9b,0xf0,0x2, 0x18,0xc8,0xf0,0x1, 0x18,0x7f,0xe8,0x40,0x3f,0x64, +0x16,0x0, 0x0, 0x96,0xe8,0x0, 0x8e,0x81,0xe0,0xf, 0x37,0x21,0xe2,0x0, 0xce,0x81, +0x3f,0x99,0xe0,0x0, 0x1, 0x49,0xe8,0x0, 0x96,0x85,0xb6,0x8f,0xc6,0x1, 0xe2,0x0, +0xce,0x6, 0xc7,0x1, 0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82,0x1, 0x13,0xf0,0xf, +0x31,0xdc,0xe0,0xd, 0x37,0x21,0xe2,0x0, 0xc7,0x81,0x3e,0x99,0x2f,0xe4,0xc6,0x1, +0xe2,0x0, 0xce,0x6, 0xc7,0x1, 0xb7,0x8d,0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82, +0x1, 0xef,0xe8,0x0, 0x8f,0x81,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x52,0xf0,0x0, +0x22,0x14,0x16,0x89,0xe8,0xd, 0x3e,0x94,0xe3,0xff,0xc6,0xff,0xe0,0x0, 0x17,0x89, +0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff,0x97,0xe, 0x3f,0xfd, +0xe1,0x80,0xb7,0x19,0x1, 0xf6,0xe0,0x6, 0x8f,0xda,0xc7,0xff,0xf0,0x40,0x3b,0xff, +0x4, 0x6, 0xa7,0x88,0xe7,0x7f,0x17,0x7f,0x3f,0xde,0xbf,0x88,0x17,0x0, 0xe8,0x0, +0xaf,0x6, 0x9, 0x61,0xf2,0x0, 0xc9,0x4, 0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe7,0xff, +0x1, 0xb4,0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe0,0x45,0x16,0xc2,0xe8,0x0, 0x98,0x85, +0x3e,0x9e,0x99,0xf, 0x36,0xa1,0x38,0xa2,0xe8,0xd, 0x3e,0x90,0xb0,0x8d,0x9e,0x8f, +0xe8,0x0, 0x98,0x85,0x3e,0x91,0x36,0xc1,0xb6,0x8f,0xe7,0xff,0x0, 0xa1,0xe0,0x3, +0x1f,0x8a,0xf0,0x3, 0x1b,0x41,0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe7,0xfe,0x2f,0xdf, +0x38,0x82,0xf0,0x0, 0x9a,0x6f,0xf0,0x1, 0x89,0x9f,0xe7,0xfe,0x0, 0xcd,0xf2,0x0, +0xc9,0x4, 0x1, 0x17,0xf7,0xff,0x22,0x41,0xf0,0x0, 0xc2,0x9, 0xf3,0xff,0xc2,0x7f, +0xe0,0x0, 0x17,0x89,0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x97,0xe, 0xe8,0x40,0x3f,0xf4,0xe1,0x80,0xb7,0x19,0x1, 0xf5,0xe7,0xff,0x0, 0xad, +0xf0,0x0, 0x22,0x27,0xf7,0xff,0x11,0xff,0xf8,0x13,0x39,0x94,0xf3,0xff,0xc1,0xff, +0xf0,0x1, 0x19,0x7f,0xc5,0x92,0x3e,0xe9,0xf0,0x0, 0xc1,0x81,0xe0,0x0, 0x17,0x0, +0xe0,0x45,0x17,0xc2,0x9e,0xb, 0x3f,0x9e,0xf0,0x0, 0x9a,0x8d,0x37,0xa1,0xe8,0xc, +0x3e,0x25,0xe8,0xf, 0x3f,0x92,0xb6,0xf, 0xc7,0x1, 0x9f,0x8d,0xe1,0x80,0x9e,0x1b, +0xf0,0x40,0x39,0xfe,0x3f,0x9c,0x37,0xc1,0xe1,0x80,0xb7,0x9d,0x1, 0xea,0x17,0x86, +0xe0,0x3, 0x1f,0x44,0xf0,0xc, 0x33,0xa1,0xe8,0xf, 0x3f,0x94,0x16,0x80,0x3f,0x1c, +0x37,0xa1,0xb6,0x8e,0x3c,0x9f,0xb6,0x89,0xe7,0xfe,0x0, 0xf7,0xe0,0x2, 0x1f,0xba, +0x86,0xc8,0x8f,0x8f,0x87,0x68,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1f,0xcc,0x8f,0x8f, +0x1, 0x22,0x37,0xc1,0x16,0x60,0xc7,0x81,0x3e,0xdc,0xe2,0x0, 0xc7,0x9f,0x3f,0x5c, +0xce,0x81,0x3f,0xce,0xae,0xc8,0xaf,0xe8,0x15,0x80,0x87,0x48,0x87,0xe8,0x86,0x58, +0x86,0xf8,0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xc7,0x9f,0xcf,0x20,0xce,0x40,0xcf,0xa0, +0xce,0xc0,0x15,0x1, 0xad,0x8, 0xad,0x98,0xad,0xb8,0xaf,0x48,0xae,0x58,0xaf,0xe8, +0xae,0xf8,0x38,0x82,0xc7,0x81,0x37,0x81,0x16,0x60,0xc7,0x81,0x3e,0xdc,0xe2,0x0, +0xc7,0x9f,0x3f,0x5c,0xce,0x82,0x3f,0xce,0xae,0xc8,0xaf,0xe8,0x0, 0xde,0xe0,0x2, +0x1f,0xba,0xf0,0x0, 0x11,0x81,0x8d,0x8f,0xe2,0x0, 0xcd,0x82,0x1, 0x4, 0xf0,0x0, +0x11,0x80,0x15,0x81,0xc4,0x82,0xe2,0x1, 0xc4,0xff,0x17,0x81,0xf0,0x1, 0x1a,0x4c, +0xac,0x88,0x17,0x0, 0xaf,0xb8,0x15,0x47,0xf7,0xff,0x13,0xe0,0xf7,0xff,0x12,0x80, +0xf7,0xff,0x13,0x3f,0x0, 0x92,0x87,0xc8,0x86,0xd8,0xe2,0x0, 0xc7,0x9f,0xcf,0xe0, +0xe8,0xf, 0x3f,0xd7,0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xd8,0xaf,0xc8,0xc7,0x1, +0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0x4, 0xac,0x17,0x82,0x3f,0x9e,0x37,0xa1,0x3f,0x98, +0x86,0x9f,0x3e,0xda,0xae,0x9f,0x27,0x68,0xe2,0x0, 0xcf,0x1, 0xf0,0x0, 0x11,0x1f, +0xf0,0x0, 0x10,0x81,0xf0,0x12,0x39,0x5b,0xce,0xc0,0xf0,0x11,0x38,0x9b,0x1, 0x19, +0x86,0xf, 0xe2,0x0, 0xcf,0x2, 0xe8,0xc, 0x3e,0x57,0xe8,0xc, 0x3e,0x42,0xe8,0x40, +0x3d,0xe1,0xae,0xf, 0xe2,0x0, 0xc6,0x1f,0xe2,0x1, 0xc5,0xff,0xce,0x20,0x1, 0x17, +0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0xae,0xf, 0xae,0x9f,0x3, 0xd6,0x38,0x82, +0x87,0xe8,0x86,0xf8,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0xc5,0xe8,0xf, 0x3f,0xd7, +0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xf8,0xaf,0xe8,0x0, 0xc2,0xe0,0x1, 0x86,0x98, +0xe0,0x1, 0x87,0x88,0xce,0xc0,0xe0,0x1, 0xae,0x98,0xe2,0x0, 0xc7,0x9f,0xe8,0x0, +0x8d,0x84,0xcf,0xa0,0xe8,0xb, 0x3d,0x93,0x35,0x81,0xc5,0x81,0xe0,0x1, 0xaf,0x88, +0xe2,0x1, 0xc5,0xff,0xe7,0xff,0x0, 0xad,0x17,0x0, 0x3f,0xe8,0xe1,0x80,0xaf,0x1f, +0xc7,0x81,0xaf,0x18,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xaf,0xf, 0xe7,0xfe,0x0, 0xe6,0xe0,0x2, 0x1f,0xba,0x16,0x82,0x8f,0x8f,0x87,0x58, +0xe0,0x2f,0x3f,0x8d,0xc7,0x81,0x16,0x80,0xcf,0x40,0xcf,0xa0,0xae,0x88,0xae,0x98, +0xae,0xb8,0xaf,0x58,0xaf,0xc8,0x38,0x82,0x8, 0xb2,0xe0,0x3, 0x19,0x2c,0x15,0x2a, +0x14,0x80,0x3c,0x62,0xe0,0x7, 0xd8,0xb0,0xe0,0x2, 0x1f,0xba,0x17,0x1, 0xaf,0x42, +0xe0,0x0, 0x17,0x41,0x8f,0x8f,0xe0,0x4, 0xaf,0x2, 0x2f,0x8c,0xe0,0x2, 0x87,0xa2, +0x17,0x60,0xe2,0x0, 0xc7,0x9f,0xcf,0xa0,0x3f,0xde,0xcf,0x81,0xe0,0x2, 0xaf,0xa2, +0x9, 0x61,0xe0,0x3, 0x1e,0xab,0x17,0x0, 0xe0,0x3, 0x1f,0xaa,0xaf,0xd, 0x3c,0x6d, +0xaf,0x1d,0xaf,0xf, 0xe0,0x3, 0x1f,0xa9,0xe0,0x3, 0x1e,0xc3,0xaf,0xf, 0xe0,0x3, +0x1f,0xa8,0x8c,0x8d,0xaf,0xf, 0xe0,0x3, 0x1f,0xa7,0xaf,0xf, 0xe0,0x3, 0x1f,0xa6, +0xaf,0xf, 0xe0,0x3, 0x1f,0xa5,0xaf,0xf, 0xe0,0x3, 0x1f,0xa4,0xaf,0xf, 0xe0,0x3, +0x1f,0xa3,0xaf,0xf, 0xe0,0x3, 0x1f,0xa2,0xaf,0xf, 0xe0,0x3, 0x1f,0xa1,0xaf,0xf, +0xe0,0x3, 0x1f,0xa0,0xaf,0xf, 0xe0,0x3, 0x1f,0x9f,0xaf,0xf, 0x9, 0x21,0xe7,0xfe, +0x0, 0x88,0xe0,0x0, 0x1f,0xbb,0x17,0x0, 0xaf,0xf, 0x16,0xff,0xaf,0x1f,0xae,0xaf, +0xaf,0x3f,0xaf,0x4f,0xaf,0x5f,0xaf,0x6f,0xaf,0x7f,0xe0,0x1, 0xaf,0xf, 0xe0,0x1, +0xaf,0x6f,0xe0,0x1, 0xae,0xff,0xe0,0x2, 0xaf,0xf, 0xe0,0x2, 0xaf,0x1f,0x38,0x82, +0xe0,0x0, 0x1f,0x3b,0x8e,0x8e,0xe0,0x0, 0x2e,0xdc,0x8f,0x8e,0x85,0x89,0x37,0xa5, +0x3f,0x9e,0xbc,0x6f,0xc5,0x81,0x8f,0x8e,0xe2,0x1, 0xc5,0xff,0x37,0xa5,0x3f,0x9e, +0x8c,0x39,0xe0,0x6, 0xad,0xdf,0x15,0x7f,0x3e,0x6d,0x8f,0x8e,0x37,0xa5,0x3f,0x9e, +0x3f,0x9d,0xe0,0x6, 0xad,0xf, 0x8f,0x8e,0x37,0xa3,0x3f,0x9d,0xc7,0x87,0x37,0xa2, +0xc6,0x81,0x3f,0x9e,0xe2,0x0, 0xce,0x85,0xbe,0xf, 0x1, 0xf0,0xe0,0x2, 0xae,0x2e, +0xe0,0x2, 0xae,0x3e,0xe0,0x2, 0xae,0x4e,0xe0,0x2, 0xae,0x5e,0xe0,0x2, 0xae,0x6e, +0xe0,0x2, 0x1f,0xc8,0xe0,0x2, 0xae,0x7e,0x8d,0xf, 0xe2,0x0, 0xcd,0x1, 0x1, 0x2a, +0x8f,0x8e,0x8e,0x99,0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0xf, 0x3d,0xad,0xe0,0x2, +0xae,0x2e,0xe2,0x0, 0xcd,0x81,0x8f,0x8e,0xe0,0x1, 0x1e,0xfe,0x37,0xa5,0x3f,0x9e, +0xbe,0xff,0x5, 0x11,0x8f,0x8e,0x16,0x82,0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0x9f, +0x17,0x81,0xe0,0x2, 0xaf,0xce,0x8f,0x8e,0xe0,0x1, 0x1e,0xfd,0xc7,0x81,0x37,0xa5, +0x3f,0x9e,0xbe,0x8f,0x14,0x0, 0x8f,0x8e,0xc7,0x81,0xaf,0x8e,0x38,0x82,0x14,0x1, +0x38,0x82,0xe0,0x0, 0x24,0x50,0x8f,0x8e,0xf0,0x1, 0x1b,0x7c,0x37,0xa5,0x3f,0x9e, +0xe0,0x6, 0xae,0x8f,0x16,0x84,0xe0,0x2, 0xae,0x7e,0x14,0x82,0x8f,0x8e,0x16,0x3, +0x37,0xa5,0x3f,0x9e,0xf0,0x0, 0xbb,0x7f,0xf0,0x40,0x3b,0xe9,0x8f,0x8e,0x37,0xa5, +0x3f,0x9e,0xe0,0x6, 0xae,0x9f,0xe0,0x2, 0xad,0x6e,0x8e,0x8e,0xc6,0x81,0x36,0xa5, +0x3e,0x9e,0xf0,0x0, 0xbb,0xd, 0x17,0x80,0x8e,0x8e,0x34,0x21,0x36,0xa5,0x3e,0x9e, +0x3e,0x99,0xe0,0x6, 0xaf,0x8d,0x3d,0xa8,0xf0,0x2, 0xab,0xae,0xe2,0x0, 0xcd,0x81, +0x8f,0x8e,0xe0,0x1, 0x1e,0xfe,0x37,0xa3,0x3f,0x99,0xc7,0x87,0x37,0xa2,0x3f,0x9e, +0xbe,0x8f,0x5, 0x41,0x8e,0x8e,0x17,0x82,0x36,0xa5,0x3e,0x9e,0x3e,0x9c,0xe0,0x6, +0xaf,0x8d,0x14,0x0, 0xe0,0x2, 0xae,0x4e,0x8f,0x8e,0xe0,0x1, 0x1e,0xfd,0x37,0xa3, +0x3f,0x9c,0xc7,0x87,0x37,0xa2,0x3f,0x9e,0xbe,0x8f,0x8f,0x8e,0xc7,0x81,0xaf,0x8e, +0x38,0x82,0xf0,0x40,0x3b,0xe8,0x3e,0x6a,0x3c,0xe8,0x0, 0xce,0xe2,0x0, 0xcc,0x4, +0x1, 0x20,0x5, 0x92,0xe2,0x0, 0xcc,0x6, 0x2, 0x9f,0x17,0x80,0x8f,0x39,0xaf,0x89, +0xaf,0x99,0x27,0x7, 0x87,0xd9,0xe2,0x1, 0xc7,0xbf,0xaf,0xd9,0x17,0xa1,0xaf,0xc9, +0x17,0x80,0xaf,0xb9,0x38,0x82,0xe2,0x0, 0xcc,0x3, 0x1, 0x8f,0x87,0xd9,0x17,0x47, +0x3f,0xde,0xcf,0x90,0x17,0x0, 0xaf,0x9, 0xaf,0x19,0xaf,0x39,0xaf,0xd9,0x38,0x82, +0x3c,0x69,0xe7,0xfb,0x0, 0xdd,0x38,0x82,0x38,0x82,0x0, 0x0, 0x8, 0xb4,0xc0,0x60, +0xe0,0x0, 0x19,0x3b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0x11,0x94,0xaf,0x22, +0x39,0x90,0xaf,0xb2,0x3c,0x63,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, +0xaf,0x82,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0x17,0xe, 0xe0,0x2, 0xaf,0x82, +0xe0,0x2, 0x1a,0x48,0xe0,0x2, 0xaf,0x92,0x8f,0x84,0x3f,0x3f,0xe0,0x3, 0x1f,0xac, +0x3f,0x9e,0xf0,0x0, 0x80,0x8f,0xf0,0x0, 0x81,0x1f,0xf0,0x0, 0x81,0xaf,0xf0,0x0, +0x82,0x3f,0xf0,0x0, 0x68,0x94,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, +0x83,0xff,0xe0,0x1, 0x84,0x8f,0xe0,0x1, 0x85,0x1f,0xe0,0x1, 0x85,0xaf,0xe0,0x1, +0x86,0x3f,0xe0,0x1, 0x86,0xcf,0xe0,0x1, 0x87,0x5f,0x87,0xcf,0xf0,0x0, 0xa9,0x13, +0xf0,0x0, 0xa9,0xa3,0xf0,0x0, 0xaa,0x33,0xaf,0xc3,0xf0,0x0, 0xaa,0xd3,0xf0,0x0, +0xab,0x63,0xf0,0x0, 0xab,0xf3,0xe0,0x1, 0xac,0x83,0xe0,0x1, 0xad,0x13,0xe0,0x1, +0xad,0xa3,0xe0,0x1, 0xae,0x33,0xe0,0x1, 0xae,0xc3,0xe0,0x1, 0xaf,0x53,0xdd,0x7f, +0xf8,0x3, 0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x4, 0x77,0x88,0xde,0xbe,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x84,0xc7,0x81, +0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, 0xaf,0x92, +0x17,0x80,0xe0,0x0, 0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0xa, 0x61,0x8, 0xb3,0xc0,0x60, +0xe0,0x0, 0x19,0x3b,0x17,0x0, 0xaf,0x2, 0x17,0xff,0xaf,0x12,0x16,0x8e,0xaf,0xa2, +0xaf,0x32,0xaf,0x42,0xaf,0x52,0xaf,0x62,0xaf,0x72,0xe0,0x1, 0xaf,0x2, 0xe0,0x1, +0xaf,0x62,0xe0,0x1, 0xaf,0xf2,0xe0,0x2, 0xaf,0x2, 0xe0,0x2, 0x19,0xc8,0xe0,0x2, +0xaf,0x12,0x8f,0x83,0x3e,0xbf,0xe0,0x3, 0x1f,0xac,0x3f,0x9d,0xf0,0x0, 0x81,0x2f, +0xf0,0x0, 0x81,0xcf,0xf0,0x0, 0x82,0x5f,0xf0,0x0, 0x82,0xef,0xf0,0x0, 0x83,0x7f, +0xf0,0x1, 0x83,0x8f,0x86,0xbf,0xe0,0x1, 0x84,0xaf,0xe0,0x1, 0x85,0x3f,0xe0,0x1, +0x85,0xcf,0xe0,0x1, 0x86,0x5f,0xe0,0x1, 0x84,0x1f,0xf0,0x0, 0x69,0x16,0x3f,0xed, +0xf0,0x0, 0x69,0x98,0xe2,0x1, 0xc7,0xff,0xf0,0x0, 0x6a,0x19,0xf0,0x0, 0x6a,0x9a, +0xf0,0x0, 0x6b,0x1b,0xf0,0x0, 0x6b,0x9c,0x6c,0x1d,0x6c,0x9e,0x6d,0x1f,0x6d,0xa0, +0x6e,0x21,0x6f,0x14,0x6f,0x15,0x27,0x87,0x57,0x8c,0xe2,0x1, 0xc7,0xbf,0xe0,0x42, +0xcf,0x80,0x77,0x8c,0x17,0x80,0xf0,0x0, 0x11,0x14,0x6f,0x97,0xf0,0x12,0x39,0x10, +0xf8,0x12,0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x6, 0x77,0x88,0xef,0xff,0xde,0x36,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x83, +0xc7,0x81,0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, +0xaf,0x92,0x17,0x80,0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0x9, 0xe1,0x8, 0xb1,0xc0,0x70, +0xe0,0x3, 0x1f,0xac,0xe2,0x0, 0x7c,0x84,0xf0,0x0, 0x80,0xf, 0xf0,0x0, 0x80,0x9f, +0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf, +0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f, +0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf, +0x14,0x0, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, +0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, +0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdd,0xd9, +0xe0,0x0, 0x1f,0xbb,0x17,0x0, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, +0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x8, 0xb1, +0xc0,0x70,0xe0,0x3, 0x1f,0x2c,0x17,0x8e,0x3f,0x9e,0xf0,0x1, 0x80,0x6e,0xf0,0x0, +0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, +0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, +0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, +0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x1, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, +0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, +0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d, +0x6e,0xe, 0x6e,0x8f,0xdd,0x8e,0xe0,0x0, 0x1f,0xbb,0x17,0x1, 0xe0,0x1, 0xaf,0x1f, +0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f, +0xc0,0x10,0x8, 0xe1,0x8, 0xb1,0xc0,0x70,0xe0,0x3, 0x1f,0x2c,0x17,0x9c,0x3f,0x9e, +0xf0,0x3, 0x80,0x4e,0xf0,0x0, 0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf, +0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff, +0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf, +0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x2, 0x6f,0x10, +0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, +0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, +0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdd,0x43,0xe0,0x0, 0x1f,0xbb, +0x17,0x2, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, +0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x0, 0x0, 0x8, 0xb2,0xe0,0x0, +0x19,0x3b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0xe2,0x0, 0xcc,0x1, 0xaf,0x22, +0xaf,0xb2,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, 0xaf,0x82,0xe0,0x1, +0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82,0xe0,0x2, 0xaf,0x92,0x1, 0x20, +0x4, 0x9d,0xe2,0x0, 0xcc,0x2, 0x1, 0x18,0x17,0x80,0xe0,0x2, 0xaf,0x92,0x17,0x80, +0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, 0x8f,0x5e,0xe0,0x2, +0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, 0xc7,0xff,0x8f,0x2, +0x3f,0xfe,0x4, 0xf1,0x9, 0x61,0xdf,0x7f,0x0, 0xe8,0xde,0xe9,0x0, 0xe6,0xdf,0x30, +0x0, 0xe4,0x8, 0xb2,0xe0,0x0, 0x1f,0xbb,0xe0,0x2, 0x8f,0xcf,0x27,0x96,0xe0,0x2, +0x1f,0x3a,0x8f,0xe, 0xe2,0x0, 0xcf,0x2, 0x1, 0x27,0xe0,0x1, 0x1f,0x4c,0xc7,0x82, +0x8f,0xe, 0x37,0xa1,0x3f,0x98,0x86,0x8f,0x37,0x41,0xc7,0x1, 0x16,0x60,0xe2,0x0, +0xc7,0x1f,0x3e,0xdc,0x3f,0x4d,0xaf,0xf, 0xe0,0x2, 0x1f,0xc8,0x89,0xf, 0xe2,0x0, +0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xcd,0xe2,0x0, +0xc7,0x81,0x2f,0x9b,0x14,0x8a,0x14,0x3, 0xe0,0x6, 0xda,0x24,0x14,0x8a,0x14,0x4, +0x9, 0x21,0xe0,0xd4,0x0, 0x9f,0x3f,0x1f,0xe0,0x1, 0x1f,0xcc,0x37,0x21,0x8f,0x8f, +0x3c,0x1e,0xc7,0x81,0x87,0x8, 0x37,0x81,0xc7,0x81,0x16,0xe0,0xe2,0x0, 0xc7,0x9f, +0x3f,0x5d,0x3f,0xce,0xaf,0x88,0x0, 0xd9,0x97,0x8e,0xe7,0x0, 0x16,0x80,0xe3,0xbf, +0xc7,0xff,0xb7,0x8e,0x3c,0xe2,0x97,0x8e,0x14,0x3, 0x3f,0xcd,0xb7,0x8e,0xe0,0x6, +0xda,0x1, 0x3c,0xe2,0x14,0x4, 0x9, 0x21,0xe0,0xd3,0x0, 0xfc,0x8, 0xb1,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x27,0x99,0xe0,0x2, 0x1f,0xba,0x8f,0x8f,0x27,0xaf,0xe0,0x2, +0x1f,0x48,0x16,0x82,0x8f,0x8e,0xe0,0x2f,0x3f,0x8d,0x2f,0xa8,0x17,0x83,0xe0,0x2f, +0x3c,0xf, 0x2f,0xa4,0x8f,0x8e,0x17,0x1, 0xe0,0x2f,0x3f,0x8e,0x2f,0x9f,0x17,0x86, +0xe0,0x28,0x3c,0xf, 0x2c,0x1b,0xe0,0x7, 0xd4,0x33,0xe0,0x0, 0xdd,0x61,0xe0,0x3, +0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0xe7,0xfb,0x16,0x7f,0xa7,0x4f,0x97,0x8d, +0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0x17,0x1, 0xe0,0x0, +0x1f,0xbb,0xaf,0x3f,0x8, 0xa1,0xe0,0xda,0x0, 0xb3,0xe0,0x7, 0xd4,0x19,0xe0,0x0, +0xdd,0x47,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0xe7,0xfb,0x16,0x7f, +0xa7,0x4f,0x97,0x8d,0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d, +0x17,0x1, 0xe0,0x0, 0x1f,0xbb,0xaf,0x3f,0x8, 0xa1,0xe0,0xda,0x0, 0xab,0x8, 0xb3, +0xc0,0x70,0xe2,0x0, 0xcc,0x2, 0x39,0x68,0xe0,0x0, 0x5, 0xce,0xe2,0x0, 0xc9,0x6, +0x14,0x0, 0x5, 0x83,0xc0,0x10,0x9, 0xe1,0xe0,0x2, 0x1f,0xc8,0x17,0xe, 0x8f,0x8f, +0xe2,0x0, 0x7c,0x4, 0x3f,0x3f,0xe0,0x3, 0x1f,0xac,0x3f,0x9e,0xf0,0x0, 0x81,0xf, +0xf0,0x0, 0x81,0x9f,0xf0,0x0, 0x82,0x2f,0xf0,0x0, 0x82,0xbf,0xf0,0x0, 0x83,0x4f, +0xf0,0x0, 0x83,0xdf,0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f,0xe0,0x1, 0x86,0x2f, +0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0x81,0xef,0x84,0xff,0xe0,0x1, 0x87,0xdf, +0xf0,0x0, 0x69,0x4, 0xf0,0x0, 0x69,0x85,0xf0,0x0, 0x6a,0x6, 0xf0,0x0, 0x6a,0x87, +0xf0,0x0, 0x6b,0x8, 0xf0,0x0, 0x6b,0x89,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f, +0x6f,0x10,0x6f,0x91,0x6c,0x8b,0x69,0x8a,0xdf,0x15,0xe2,0x0, 0x7c,0x84,0x3c,0x62, +0xdc,0xbe,0xe2,0x0, 0x7c,0x4, 0xe0,0x6, 0xdc,0x44,0x3c,0x62,0xdf,0x60,0x14,0x1, +0xc0,0x10,0x9, 0xe1,0x11,0x8e,0xe0,0x3, 0x1f,0xac,0x39,0xb8,0x39,0x9f,0x3c,0x63, +0xdf,0x1, 0x3c,0x63,0xe0,0x6, 0xdc,0x35,0x3c,0x62,0xdf,0x51,0x14,0x1, 0xc0,0x10, +0x9, 0xe1,0x8, 0xb2,0xe0,0x3, 0x1f,0x47,0xe0,0x2, 0x1f,0x94,0x8e,0x8e,0x87,0x6f, +0xe2,0x0, 0xc6,0x87,0x36,0xa5,0xe2,0x0, 0xc7,0x1f,0x3f,0x4d,0xaf,0x6f,0x16,0x60, +0x9f,0x3f,0x86,0xef,0x37,0x48,0xc7,0x1, 0xe2,0x0, 0xc7,0x1f,0x3e,0xdc,0x3f,0x4d, +0xaf,0x6f,0x9f,0x3f,0x37,0x48,0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xcf,0x1f,0x1, 0x85, +0x87,0x6f,0x3f,0x5c,0xcf,0x4, 0xaf,0x6f,0x17,0x80,0xe0,0x0, 0x19,0x3b,0x17,0x7f, +0xaf,0xb2,0x14,0x0, 0xaf,0x92,0xaf,0x22,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2, +0xe0,0x1, 0xaf,0x82,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82, +0xe0,0x1, 0xd0,0xb2,0x8f,0x12,0x8f,0x82,0x3f,0x7f,0x4, 0x87,0x17,0x83,0x14,0x1, +0xaf,0xb2,0x9, 0x21,0xe0,0x21,0x0, 0xa8,0x8f,0x92,0x37,0xa5,0x3f,0x92,0xa4,0x6f, +0xe2,0x1, 0xc4,0x7f,0xdf,0x55,0xe2,0x0, 0xcc,0x1, 0x1, 0xf1,0x14,0x1, 0x9, 0x21, +0xe0,0x21,0x0, 0x9a,0x8, 0xb5,0xe0,0x0, 0x19,0x3b,0x3a,0xe8,0x8f,0xb2,0xe2,0x0, +0xcf,0x81,0x1, 0x97,0xe0,0x2, 0x19,0x92,0xe0,0x3, 0x1a,0x38,0x97,0x83,0xe2,0x0, +0xc7,0x81,0x2f,0x87,0xa7,0x84,0xe0,0x4, 0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x27,0x83, +0xe0,0x1, 0xd0,0x48,0xe0,0x3, 0xd9,0x37,0x8f,0xb2,0xe2,0x0, 0xcf,0x81,0x1, 0x6f, +0x2a,0x82,0xa, 0xe1,0xa, 0xa1,0xe0,0xd6,0x0, 0xfb,0x8, 0xb1,0xe0,0x2, 0x1f,0x92, +0x97,0x8f,0xe2,0x0, 0xc7,0x81,0x2f,0xa0,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x4, +0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x2f,0x98,0xe0,0x3, 0xd9,0x1d,0xe0,0x0, 0x1f,0x3b, +0xe0,0x2, 0x8c,0x1e,0x24,0x10,0x8f,0xce,0x27,0x84,0x0, 0x91,0x8e,0xcc,0x2e,0x8f, +0xe0,0x2, 0x8e,0x9e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe0,0xc, 0x3f,0x1f, +0x2, 0xf6,0x14,0x0, 0x8, 0xe1,0xe0,0x1, 0xd0,0x15,0x0, 0xe7,0x14,0x1, 0x8, 0xe1, +0xe2,0x0, 0xcc,0x5, 0x2, 0x87,0xe0,0x0, 0x1f,0xbb,0x3c,0x1f,0xe0,0x2, 0x8c,0x28, +0x38,0x82,0x14,0x0, 0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x1f,0x92,0x39,0x68,0x97,0x8f, +0xe2,0x0, 0xc7,0x81,0x2f,0x9f,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x4, 0xa7,0xff, +0xe2,0x0, 0xc7,0x81,0x2f,0x97,0xe0,0x3, 0xd8,0xe6,0xe2,0x0, 0xc9,0x5, 0xe0,0x0, +0x1f,0xbb,0x17,0x0, 0x2, 0x84,0x39,0x1f,0xe0,0x2, 0x8f,0x22,0xe0,0x2, 0x8e,0x9f, +0x14,0x1, 0x3e,0xfe,0x5, 0x86,0x3f,0x9e,0x8c,0x4f,0x17,0x80,0xe1,0x28,0x3c,0xf, +0x9, 0x61,0xe0,0x0, 0xdf,0xdf,0x0, 0xe8,0x8, 0xb1,0xe0,0x6, 0xdb,0x19,0xe0,0x0, +0x1f,0xbb,0x16,0x83,0xae,0xbf,0x17,0x2, 0xaf,0x4f,0x16,0x80,0xaf,0x5f,0xaf,0x6f, +0xaf,0x7f,0xe0,0x2, 0x1e,0x12,0xe0,0x1, 0xaf,0xf, 0x97,0x8c,0xe0,0x3, 0x1f,0x1d, +0xe3,0xff,0xc7,0xef,0xb7,0x8c,0x97,0x8e,0xe3,0xff,0xc7,0xdf,0xb7,0x8e,0xe0,0x2, +0x1f,0xb3,0xae,0x8f,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xe0,0x0, 0x1f,0x90,0xae,0x8f, +0xe7,0x7f,0x16,0xff,0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0x8, 0xe1,0xe0,0x0, 0x1f,0xbb, +0x8f,0x3f,0xe2,0x0, 0xcf,0x1, 0x1, 0x2, 0x38,0x82,0x87,0x1f,0xaf,0x2f,0xe0,0x1, +0x8f,0x7f,0xc7,0x1, 0xe0,0x1, 0xaf,0x7f,0xe0,0x1, 0x8f,0x6f,0xc7,0x1, 0xe0,0x1, +0xaf,0x6f,0xe0,0x1, 0x8e,0xef,0x8f,0x1f,0x37,0x25,0x3f,0x1f,0xe0,0x6, 0x8f,0x5e, +0x3e,0xfe,0x4, 0xeb,0x17,0x0, 0xe0,0x1, 0xaf,0x6f,0x8f,0x1f,0xc7,0x1, 0xaf,0x1f, +0x8e,0x9f,0x8f,0xf, 0x3e,0xfe,0x3, 0xe1,0x17,0x3, 0xaf,0x3f,0x38,0x82,0x0, 0x0, +0x8, 0xb4,0xc0,0x7c,0xe0,0x0, 0x19,0x3b,0xe0,0x1, 0x89,0xf2,0x8f,0xa2,0x8f,0x32, +0xe2,0x0, 0xcf,0x1, 0x1, 0x3, 0xc0,0x4, 0xa, 0x61,0x8e,0x22,0x8e,0x82,0x3e,0x7d, +0xe0,0x0, 0x3, 0xc7,0x37,0xa3,0x8e,0xa2,0x3f,0x93,0xc7,0x87,0x36,0xa5,0x37,0xa2, +0x3e,0x92,0x3f,0x92,0xe0,0xb, 0x39,0x13,0xa6,0x6d,0xa4,0x8f,0xe0,0x1, 0x8f,0x9b, +0xe0,0x3, 0x1e,0xac,0xe4,0x0, 0xc7,0x87,0x3f,0x93,0xc7,0x82,0x37,0xa1,0x3f,0x9d, +0x8c,0x1f,0xe0,0x4, 0x34,0x47,0x24,0xac,0xe0,0x1, 0x17,0xff,0x3f,0xdc,0xe0,0x3, +0x1e,0xc1,0xe2,0x0, 0xcf,0x86,0xaf,0xd, 0x2, 0xa3,0x37,0x3f,0xe2,0x0, 0xc7,0x57, +0x27,0x1f,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8a, +0xe0,0x2, 0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0x5, 0x9f,0x3c,0x64,0xd8,0x18,0xe0,0x2, 0x1f,0x92,0x39,0x92,0x9f,0x8f,0x37,0xc4, +0xe2,0x0, 0xc7,0x81,0x27,0x92,0x17,0x2, 0xaf,0x43,0xe0,0x6, 0xda,0x71,0x8f,0x12, +0x8f,0x82,0x3f,0x7f,0xe7,0xff,0x4, 0xb1,0x17,0x2, 0xe0,0x0, 0x1f,0x99,0xaf,0x32, +0x17,0x0, 0xaf,0xf, 0xc0,0x4, 0xa, 0x61,0x17,0x81,0xaf,0xc3,0x0, 0xef,0xe0,0x2, +0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xdd,0x7c,0x81,0xe0,0x3, 0xd5,0xc3, +0xe0,0x1, 0x1f,0xd7,0x64,0x81,0xe0,0x1, 0xb4,0x2f,0x0, 0xd4,0x8, 0xb1,0xc0,0x68, +0xe0,0x2, 0x1f,0xfd,0xe9,0xff,0xc4,0x7e,0x87,0x5f,0x86,0xcf,0xe0,0xf, 0x34,0x41, +0x6f,0x5, 0x14,0x85,0x17,0x0, 0x7f,0x83,0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0x80, +0x6e,0x84,0x6f,0x6, 0x77,0x84,0xe0,0x6, 0xdc,0xbd,0xc0,0x18,0x8, 0xe1,0x0, 0x0, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0x1, 0x2e,0x9f,0xde,0xe0,0x3, 0x1e,0xb3,0xe2,0x0, 0xcc,0x2, +0xe0,0x3, 0x1f,0x32,0x3d,0xed,0xe0,0x6b,0x39,0x2e,0xe2,0x0, 0xcc,0x85,0x16,0x1, +0x36,0x39,0x2, 0x12,0x27,0x91,0x15,0x7f,0x3d,0x1f,0xe3,0xff,0xc5,0x7f,0x17,0x7f, +0xe2,0x1, 0xc6,0x7f,0x3f,0x1b,0x3d,0x1b,0x86,0x9e,0x3e,0xcc,0xe0,0x80,0xae,0x9e, +0x3f,0x7a,0x1, 0xfb,0x0, 0x83,0xe2,0x1, 0xc6,0x7f,0x16,0x86,0x3e,0x9f,0x3e,0x9b, +0x3f,0x9b,0x87,0xf, 0x3f,0x4c,0xe1,0x80,0xaf,0x1f,0x3e,0xff,0x1, 0xfb,0x38,0x82, +0x9f,0xee,0x0, 0xd3,0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, +0x8e,0xae,0xe2,0x0, 0xc7,0x81,0x3e,0xff,0x1, 0x3c,0x9f,0xde,0xe0,0x3, 0x1f,0x33, +0xe2,0x0, 0xcc,0x2, 0xe0,0x3, 0x1e,0xb2,0x3e,0x6e,0xe0,0x6c,0x39,0x2d,0xe2,0x0, +0xcc,0x85,0x14,0x1, 0x34,0x39,0x2, 0x18,0x27,0x97,0x14,0xff,0x3c,0x9f,0xe3,0xff, +0xc4,0xff,0xc4,0x81,0x3e,0xea,0x3f,0x6c,0x3c,0x9c,0xf0,0x41,0x3b,0x88,0x9d,0x8d, +0xc6,0x82,0xe2,0x9, 0xcd,0xaf,0x2, 0x85,0x85,0x8e,0xe8,0xb, 0x3d,0xd7,0xad,0x8e, +0xc7,0x1, 0x3f,0x79,0x1, 0xf5,0x17,0x6, 0xe0,0xd, 0x37,0xa1,0x3f,0x1f,0x3f,0x1c, +0x3f,0x9c,0x3d,0x1d,0xe0,0x41,0x3e,0x8, 0x9e,0x8a,0xc5,0x2, 0xe2,0x9, 0xce,0xaf, +0x2, 0x84,0x86,0x8f,0x3e,0xdc,0xae,0x8f,0xc7,0x81,0x3f,0x7f,0x1, 0xf6,0x38,0x82, +0x9f,0xee,0x0, 0xc5,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0x39,0x68,0xe0,0x1, 0xd0,0x3d, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0x3b,0x68,0xe0,0x0, 0x1, 0x77,0x95,0x5e,0xc5,0x6, 0xe3,0xff, +0xc5,0x7f,0xe2,0x0, 0xc9,0x2, 0xe0,0x3, 0x1c,0x32,0xe0,0x3, 0x1f,0xb3,0x14,0x80, +0xe0,0x68,0x39,0xaf,0xe0,0x7, 0xd1,0xe8,0xe0,0x0, 0x2b,0x62,0xe0,0x3, 0x1f,0xb8, +0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0x16,0x5f,0xa7,0x4f,0x97,0x8d,0x37,0x45,0xe2,0x0, +0xc7,0x20,0x3f,0xdc,0x3f,0xce,0xe0,0x3, 0x1a,0xb3,0xf0,0x1, 0x1c,0x7e,0xf0,0x1, +0x1c,0xfd,0xb7,0x8d,0x11,0x85,0xe0,0x13,0x13,0xc4,0x12,0x1, 0x3c,0x67,0xe0,0x5, +0xdb,0xf6,0x3c,0xe3,0x3c,0x62,0xdf,0x3d,0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd4,0xd6, +0xdd,0x81,0x23,0x2d,0x3c,0xe2,0x3c,0x64,0xde,0x27,0x24,0x7d,0xe8,0x40,0x3d,0x68, +0x3c,0xe3,0x3c,0x62,0xc1,0xff,0xdf,0x67,0xe0,0x43,0x39,0x83,0x3c,0xe3,0x3c,0x62, +0xdf,0x28,0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd4,0xc1,0x3c,0x64,0xdd,0xbc,0xe8,0x40, +0x3d,0x69,0x3c,0xe3,0x3c,0x62,0xdf,0x57,0xe0,0x1, 0xd0,0x49,0x2c,0xd, 0xc1,0xff, +0xe0,0x43,0x39,0x83,0xe2,0x0, 0xc9,0x80,0x3, 0x52,0xe0,0x3, 0x1c,0x33,0x3c,0xe2, +0xef,0xff,0xd4,0xac,0x2b,0xc, 0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x3c,0x64,0xdd,0xa3, +0xe8,0x40,0x3d,0x68,0x3c,0xe3,0x3c,0x62,0xdf,0x3e,0x0, 0xe7,0xe0,0x0, 0x1f,0xcd, +0x8c,0xf, 0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xf8,0x0, 0x82,0xda,0x10,0x13,0x1, +0xe7,0xff,0x0, 0x9e,0x95,0x6e,0xc5,0x6, 0xe3,0xff,0xc5,0x7f,0xe7,0xff,0x0, 0x8b, +0x8, 0xb3,0xe0,0x2, 0x1f,0xc2,0x17,0x0, 0x39,0xe8,0xb7,0xf, 0xe0,0x2, 0xd9,0xf3, +0xe2,0x0, 0xcc,0x1, 0x39,0x68,0x1, 0x3, 0x3c,0x62,0x9, 0xe1,0x3c,0x63,0xdf,0x63, +0x3c,0x62,0x9, 0xe1,0x8, 0xb4,0xe0,0x2, 0x1f,0xc8,0x89,0xf, 0xe0,0x1, 0xd0,0x7, +0x2c,0x19,0xe0,0x2, 0x19,0xfb,0x14,0x1, 0x8f,0x83,0x37,0xd2,0x3f,0xd8,0x2f,0x82, +0xa, 0x61,0xe0,0x2, 0x1f,0x77,0xe0,0x4, 0x34,0x32,0x8f,0x8e,0xe2,0x1, 0xc2,0x7f, +0x3f,0xc4,0xaf,0x8e,0xdd,0x60,0xe2,0x0, 0xc9,0x1, 0x1, 0x12,0x3c,0x62,0xdf,0xd1, +0x2c,0x3, 0x14,0x0, 0xa, 0x61,0xe0,0x0, 0xdf,0xea,0x2c,0x7c,0x8f,0x83,0xe3,0x4, +0x3f,0xd4,0xaa,0x3, 0xd6,0x41,0xe0,0x0, 0xdf,0x33,0x14,0x1, 0xa, 0x61,0x3c,0x62, +0xe0,0x3, 0xd4,0xe2,0xe0,0x2, 0x1f,0xe7,0xa9,0xf, 0x0, 0xe9,0x8, 0xb5,0xe0,0x2, +0x1f,0xc8,0x3a,0xe8,0x89,0xf, 0xe0,0x0, 0xdf,0xd2,0x2c,0x17,0xe0,0x2, 0x1a,0x77, +0x39,0xe8,0x8f,0x84,0x14,0x1, 0x37,0xd2,0x3f,0xd8,0x2f,0x82,0xa, 0xe1,0xdd,0x33, +0xe2,0x0, 0xc9,0x1, 0x1, 0x86,0xe0,0x2, 0x1f,0xe7,0x8f,0xf, 0x27,0x39,0xa9,0x8f, +0x3c,0x62,0xe0,0x2, 0xd9,0xc5,0x2c,0x3, 0x14,0x0, 0xa, 0xe1,0xe0,0x2, 0x1f,0xea, +0x3c,0x62,0x8c,0x8f,0xe0,0x2, 0xda,0xb4,0x3c,0xe2,0x14,0x0, 0xef,0xfd,0xd8,0x20, +0xe0,0x2, 0x1f,0x81,0xe0,0x1, 0x1d,0x6f,0xe0,0x1, 0x1c,0xf0,0xa4,0xf, 0x3d,0xe2, +0xef,0xfd,0xd2,0xac,0x24,0x6a,0xe0,0x2, 0x1f,0xac,0x3c,0x62,0x8c,0x8f,0xe0,0x2, +0xda,0x9f,0xe0,0x0, 0xdf,0x9c,0x2c,0x61,0x2a,0x97,0x3c,0x62,0xe0,0x2, 0xd9,0xf3, +0x14,0x0, 0xe0,0x2, 0xd8,0x7f,0x8f,0x84,0x11,0x81,0xe0,0x2, 0x31,0xb2,0xe3,0x2, +0x3f,0xd2,0xa9,0x4, 0xe0,0x0, 0xde,0xdc,0xd5,0xe7,0x3c,0x63,0xa, 0xe1,0x3c,0x62, +0xe0,0x3, 0xd4,0x8a,0x0, 0xc6,0xdc,0x9e,0x0, 0xe9,0x8, 0xb3,0xe0,0x3, 0xd4,0xd6, +0xe0,0x0, 0xdf,0x8c,0xe0,0x2, 0x1f,0xfb,0x8f,0x8f,0x27,0x8b,0xe0,0x13,0x11,0x44, +0x0, 0x86,0x3c,0x62,0xe0,0x5, 0xda,0xfb,0xe0,0x0, 0xdf,0x80,0xdf,0x64,0x24,0x7a, +0xe0,0x2, 0x1f,0xf7,0x11,0x1, 0x8f,0x8f,0xe0,0x13,0x11,0xc4,0x2f,0x87,0x0, 0x89, +0x3c,0x63,0xe0,0x5, 0xda,0xec,0xe0,0x0, 0xdf,0x71,0x3c,0x62,0xdf,0x88,0x24,0x79, +0x9, 0xe1,0xe0,0x2, 0x1f,0x91,0x16,0x7e,0xa6,0x8f,0xe0,0x0, 0x1f,0xbd,0xa7,0x1d, +0xa7,0x8f,0xcf,0x40,0xbf,0x1d,0x17,0x0, 0xaf,0x7f,0x15,0xfd,0xa7,0xf, 0xe0,0x1, +0x1e,0xdc,0x3f,0x5c,0xbf,0xf, 0xa7,0xf, 0xa6,0x8d,0x3f,0x5b,0xbf,0xf, 0xe0,0x1, +0xa7,0xd, 0x37,0x48,0xe2,0x0, 0xc7,0x1, 0x2f,0x1c,0xe0,0x1, 0x1f,0x42,0x87,0xe, +0xe2,0x1, 0xc7,0x7e,0xe0,0x1, 0xaf,0x3f,0x17,0x8, 0xe0,0x61,0x3f,0x11,0x17,0x10, +0xe0,0x61,0x3f,0x11,0xa7,0x4f,0xcf,0x10,0xbf,0x4f,0xe0,0x61,0x3f,0x82,0xcf,0x88, +0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82,0xcf,0x90,0xe0,0x61,0x3f,0x92,0x38,0x82, +0xe0,0x1, 0xa7,0xd, 0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x2f,0x60,0xe0,0x1, 0x1f,0x42, +0xe0,0x1, 0x87,0x4e,0x3e,0x5e,0xe0,0x1, 0xae,0x3f,0x0, 0xdf,0xd, 0xbf,0xe0,0x2, +0x1f,0x91,0xa7,0x8f,0xa7,0x6f,0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x5c,0xa6,0x8e,0xe0,0x2, 0xa7,0xd, 0x37,0x49,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, +0x2f,0x57,0xa7,0x6f,0x37,0x41,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x41,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x32, +0xa7,0x6f,0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x16,0xa7,0x6f, +0xe2,0x0, 0xc7,0x1, 0x27,0xa, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x7e,0xa7,0x6f,0x37,0x48,0xe2,0x0, 0xc7,0x1, +0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x48,0xe2,0x0, +0xc7,0x1, 0xe0,0x2, 0x2f,0x62,0xa7,0x6f,0x37,0x43,0xe2,0x0, 0xc7,0x1, 0x27,0xb, +0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, +0xe0,0x2, 0x2f,0x48,0xa7,0x6f,0x37,0x42,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x42,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, +0x2f,0x25,0xa7,0x6f,0x37,0x47,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x9, +0xa7,0x6f,0x37,0x4b,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x4b,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x60,0xa7,0x6f, +0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, +0xa7,0xe, 0x37,0x4d,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x44,0xa7,0x6f,0x37,0x4d, +0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x28,0xa7,0x6f,0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4e, +0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0xc, 0xa7,0x6f,0x37,0x4f,0xe2,0x0, 0xc7,0x1, +0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4f,0xe2,0x0, +0xc7,0x1, 0xe0,0x0, 0x2f,0x69,0xa7,0x6f,0x37,0x44,0xe2,0x0, 0xc7,0x1, 0x27,0xb, +0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x44,0xe2,0x0, 0xc7,0x1, +0xe0,0x0, 0x2f,0x4f,0xa7,0x6f,0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x27,0xa, 0xe0,0x1, +0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x2f,0x29, +0xa7,0x6f,0x37,0x46,0xe2,0x0, 0xc7,0x1, 0x27,0x1f,0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x46,0xe2,0x0, 0xc7,0x1, 0x27,0x16,0xa7,0x5f,0xa6,0xdf, +0x37,0x46,0xe2,0x0, 0xc7,0x1, 0xe7,0xff,0x16,0x3f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc, +0x37,0x26,0x3f,0x4d,0xbf,0x5f,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f, +0x9f,0x8d,0xcf,0xc0,0xb7,0x8d,0x17,0x81,0xe0,0x61,0x3f,0x91,0xf, 0xab,0x38,0x0, +0xa7,0x5f,0xa6,0xdf,0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe7,0xfe,0x16,0x7f,0xe4,0x0, +0xcf,0x1, 0x3e,0xdc,0x37,0x27,0x3f,0x4d,0xbf,0x5f,0x16,0x5f,0xa7,0x6f,0xe0,0x2, +0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x20,0xb7,0xd, 0x0, 0xc2,0xa7,0x6f, +0x16,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x10,0xb7,0xd, +0xe7,0xff,0x0, 0xaa,0xa7,0x6f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xe0,0x2, 0x1e,0xbd, +0xbf,0x6f,0x17,0x1, 0xe0,0x0, 0x1e,0x21,0xaf,0xd, 0xe0,0x2, 0x1e,0xe9,0xaf,0xc, +0x9f,0xd, 0xe1,0x0, 0xcf,0x0, 0xb7,0xd, 0xe7,0xff,0x0, 0x87,0xa7,0x6f,0xe7,0x7f, +0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x80,0xcf,0x0, +0xb7,0xd, 0xe7,0xfe,0x0, 0xeb,0xa7,0x6f,0xe7,0xbf,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x40,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0xcf, +0xa7,0x6f,0xe7,0xdf,0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, +0xe0,0x20,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0xb3,0xa7,0x5f,0xa6,0xdf,0x37,0x4f, +0xe2,0x0, 0xc7,0x1, 0xe6,0xff,0x16,0x7f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc,0x37,0x2f, +0x3f,0x4d,0xbf,0x5f,0xe7,0xef,0x16,0x7f,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c, +0xbf,0x6f,0x9f,0xd, 0xe0,0x10,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0x8a,0xa7,0x6f, +0xe7,0xfe,0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x1, +0xcf,0x0, 0xb7,0xd, 0xe7,0xfd,0x0, 0xee,0xa6,0xef,0xe0,0x0, 0x1f,0x2f,0x16,0x7b, +0xa7,0xe, 0x3e,0xdc,0xbe,0xef,0xa6,0x9e,0xe0,0x2, 0x1e,0x69,0xce,0x81,0xbe,0x9e, +0xa6,0x9e,0xce,0x90,0xbe,0x9e,0x9f,0xc, 0xcf,0x4, 0xb7,0xc, 0xe7,0xfd,0x0, 0xcb, +0xa7,0x6f,0x16,0x77,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x8, +0xb7,0xd, 0xe7,0xfd,0x0, 0xb1,0xa7,0x6f,0xe7,0xfd,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x2, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfd,0x0, 0x95, +0xa7,0x6f,0x16,0x7e,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x1, +0xb7,0xd, 0xe7,0xfc,0x0, 0xfb,0xa7,0x6f,0xe7,0xf7,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x8, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfc,0x0, 0xe1, +0xe0,0x2, 0x1f,0xc, 0x16,0x81,0xae,0x8e,0x16,0x5f,0xe0,0x0, 0x1f,0x3d,0xa6,0x8e, +0xa7,0xd, 0x3f,0x5c,0xbf,0xd, 0x16,0x7d,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c, +0xbf,0x6f,0x9f,0xd, 0xcf,0x2, 0xb7,0xd, 0xe7,0xfc,0x0, 0xbc,0xe0,0x1, 0xa7,0x6d, +0xe7,0xef,0x15,0xff,0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6d,0xe0,0x1, 0xa7,0x6d, +0xe0,0x2, 0x1e,0x69,0x3f,0x5b,0xe0,0x1, 0xbf,0x6d,0xe7,0xfb,0x16,0xff,0xa7,0x6f, +0x3f,0x5d,0xbf,0x6f,0x9f,0xc, 0xe0,0x4, 0xcf,0x0, 0xb7,0xc, 0xe7,0xfc,0x0, 0x93, +0xf, 0x3f,0xe0,0x2, 0x1f,0x14,0x97,0xde,0xe0,0x40,0xcf,0x80,0xb7,0xde,0x17,0x82, +0xe0,0x61,0x3f,0x91,0xf, 0xae,0x38,0x0, 0xf, 0xbf,0x17,0x84,0xe0,0x61,0x3f,0x91, +0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0x17,0xa0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0xf, 0xbf,0xe0,0x0, 0x17,0xc0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xe, 0x3f, +0xe0,0x2, 0x1f,0x42,0xe0,0x0, 0x1e,0xaa,0x9f,0x8e,0xe0,0x2, 0x1e,0x47,0xc7,0x81, +0xb7,0x8e,0x9f,0x8d,0x9f,0xc, 0xc7,0x81,0xb7,0x8d,0x27,0x3, 0xc7,0x7f,0xb7,0xc, +0xe0,0x3, 0x1f,0x96,0x8f,0xf, 0x27,0x4, 0x8f,0xf, 0xc7,0x7f,0xaf,0xf, 0x8f,0x8f, +0x2f,0x86,0xe0,0x2, 0x1f,0x12,0x97,0x8e,0xcf,0x88,0xb7,0x8e,0xe0,0x2, 0x1e,0xec, +0xe0,0x2, 0x1f,0x39,0x9f,0x8d,0xc7,0x81,0xb7,0x8d,0x9f,0x8e,0x27,0x84,0x9f,0x8e, +0xc7,0xff,0xb7,0x8e,0xe0,0x3, 0x1f,0xad,0x9f,0xf, 0x27,0x4, 0x9f,0xf, 0xc7,0x7f, +0xb7,0xf, 0xe0,0x3, 0x1f,0x81,0xe0,0x0, 0x1f,0x40,0xa7,0x8f,0x97,0xe, 0xb7,0x3f, +0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe0,0x2, +0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xac,0x38,0x0, 0xf, 0xbf,0xe0,0x4, 0x17,0x80, +0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x8, 0x17,0x80,0xe0,0x61, +0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x10,0x17,0x80,0xe0,0x61,0x3f,0x91, +0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x80,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf, +0x38,0x0, 0xf, 0xbf,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x2, 0xdf,0xf9,0x17,0x88,0xe0,0x61,0x3f,0x91, +0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x3, +0xd0,0x28,0x17,0x90,0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, +0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x2, 0x1f,0xe4,0xe7,0xfe,0x16,0xff,0xa7,0xf, +0xa7,0xbe,0x3f,0xdd,0xbf,0xbe,0xe0,0x5, 0xd7,0xfa,0xe0,0x40,0x17,0x80,0xe0,0x61, +0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x3f,0x83,0xe0,0x1, 0x1f,0xd4, +0xe0,0x6, 0x8f,0xf, 0xc7,0x7f,0xe0,0x6, 0xaf,0xf, 0xe0,0x6, 0x8f,0xf, 0x37,0x24, +0x3f,0x1f,0xa7,0xe, 0xe0,0x60,0x3f,0x19,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f, +0xa7,0x1e,0xe0,0x60,0x3f,0x1a,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f,0xa7,0x2e, +0xe0,0x60,0x3f,0x18,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x9e,0xa7,0xbf,0xe0,0x61, +0x3f,0x92,0x3b,0x0, 0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1d,0x5, 0x16,0x84,0xae,0x8a, +0x17,0x81,0xaf,0x9a,0x17,0x2, 0xaf,0xaa,0xf0,0x0, 0x13,0x80,0xae,0xba,0xf8,0x40, +0x3a,0xe7,0xae,0xca,0x14,0x1, 0xaf,0x5a,0xaf,0x6a,0xaf,0x7a,0xe0,0x1, 0xaf,0xa, +0x17,0x3, 0xe0,0x1, 0xaf,0x9a,0xe0,0x1, 0xaf,0xaa,0xe0,0x1, 0xaf,0xba,0xe0,0x1, +0xaf,0xca,0xe0,0x1, 0xaf,0xda,0x17,0x80,0xe0,0x1, 0xaf,0x6a,0xf0,0x2, 0x1b,0x71, +0xe0,0x1, 0xaf,0xfa,0xf0,0xb, 0x33,0xa2,0xe8,0xb, 0x3d,0x96,0xf0,0x0, 0xba,0x8b, +0xe0,0x0, 0x17,0x80,0xe8,0x9, 0x3d,0x17,0xe0,0xe, 0x3d,0x1f,0x8e,0xe, 0x8e,0x89, +0xe0,0xe, 0x34,0x3f,0x3e,0x7d,0xc7,0x81,0x5, 0x84,0xa6,0x8b,0x3f,0x4d,0xbf,0xb, +0xe2,0x0, 0xcf,0x90,0x1, 0xf2,0xf0,0x0, 0xc3,0x81,0xf2,0x0, 0xcb,0x90,0x1, 0xe3, +0xe0,0x1, 0x1f,0xd4,0x17,0x0, 0xe0,0x6, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x71, +0xe0,0xf, 0x34,0x22,0x3f,0x1f,0xa7,0x8e,0x27,0xb3,0x3f,0x83,0xe0,0x1, 0x1f,0xd4, +0xe0,0x6, 0x8e,0x8f,0xe0,0x60,0x3e,0x9, 0x36,0xa4,0x3e,0x9f,0xbe,0xd, 0xe0,0x6, +0x8e,0x8f,0xe0,0x60,0x3e,0xa, 0x36,0xa4,0x3e,0x9f,0xbe,0x1d,0xe0,0x6, 0x8e,0x8f, +0xe0,0x60,0x3e,0x8, 0x36,0xa4,0x3e,0x9f,0xbe,0x2d,0xe0,0x6, 0x8e,0x8f,0xe0,0x61, +0x3e,0x2, 0x36,0xa4,0x3e,0x9f,0xbe,0x3d,0xe0,0x6, 0x8e,0x8f,0xc6,0x81,0xe0,0x6, +0xae,0x8f,0xa7,0x8e,0xe0,0x61,0x3f,0x92,0x17,0x81,0xe0,0x8, 0x37,0xb8,0xe0,0x61, +0x3c,0x11,0xe0,0x60,0x3f,0x80,0xcf,0x82,0xe0,0x60,0x3f,0x90,0x3b,0x0, 0x38,0x82, +0x8, 0xb4,0xe8,0x0, 0xc, 0x37,0xe0,0x3, 0x1f,0xb8,0xa1,0xf, 0xa7,0xb2,0x37,0xcf, +0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0xe0,0x0, +0x2f,0xf2,0xa7,0xb2,0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0xe2,0x0, 0xc7,0x81, +0xe0,0x0, 0x2f,0xf1,0xa7,0xb2,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82, +0x37,0xc1,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xed,0xa7,0xb2,0x37,0xca,0xe2,0x0, +0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xca,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xe9, +0xa7,0xb2,0x37,0xcb,0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0x37,0xcb,0xe2,0x0, +0xc7,0x81,0x2f,0xbd,0xa7,0xb2,0x37,0xcc,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82, +0x37,0xcc,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xe6,0xa7,0xb2,0x37,0xc7,0xe2,0x0, +0xc7,0x81,0x27,0xa5,0xa7,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0xa0,0xa7,0x92, +0xe0,0x0, 0x1a,0x10,0xe0,0x1, 0xcf,0x80,0xbf,0x92,0x8f,0x84,0xe0,0x2, 0x19,0x92, +0x27,0x89,0x99,0x3, 0x31,0x4c,0xe2,0x0, 0xc1,0x1, 0x29,0x4, 0xe0,0x6, 0xd5,0x28, +0xa9,0x4, 0x97,0x83,0xe0,0x3, 0x1f,0x37,0xe3,0xdf,0xc7,0xff,0xb7,0x83,0x97,0x83, +0xe3,0xbf,0xc7,0xff,0xb7,0x83,0x9f,0x8e,0xc7,0x81,0xb7,0x8e,0xe0,0x1, 0x17,0x80, +0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0xa, 0x21,0x38,0x0, 0xa7,0x92,0xe0,0x3, +0x1f,0x1d,0xe0,0x10,0xcf,0x80,0xbf,0x92,0x97,0x8e,0xcf,0xa0,0xb7,0x8e,0xe7,0xff, +0x0, 0xbb,0xa7,0x92,0xe1,0x0, 0xcf,0x80,0xbf,0x92,0xe0,0x0, 0xd9,0x1f,0xe7,0xff, +0x0, 0x8a,0xa7,0x92,0xcf,0x81,0xbf,0x92,0xe0,0x0, 0xd9,0x5, 0xe7,0xff,0x0, 0x8c, +0xa7,0x92,0xcf,0x82,0xbf,0x92,0xe0,0x0, 0xd9,0x11,0xe7,0xff,0x0, 0x90,0xa7,0x92, +0xe0,0x2, 0x19,0x92,0xe0,0x8, 0xcf,0x80,0xbf,0x92,0x97,0x83,0xe0,0x2, 0x1f,0x14, +0xcf,0x82,0xb7,0x83,0x97,0xce,0xcf,0x88,0xb7,0xce,0xe0,0x0, 0xd8,0xdb,0xe7,0xff, +0x0, 0x89,0xa7,0x92,0x14,0x7, 0xe0,0x20,0xcf,0x80,0xbf,0x92,0xdf,0x18,0xe0,0x3, +0x1e,0x9d,0xe0,0x2, 0x19,0x92,0x9f,0xd, 0x97,0x83,0x16,0x6f,0x37,0x41,0xe2,0x0, +0xc7,0x10,0x3f,0xdc,0x3f,0xce,0xb7,0x83,0x97,0x8d,0xe3,0xff,0xc7,0xdf,0xb7,0x8d, +0xd9,0xe, 0xd9,0x37,0xa7,0x92,0xe0,0x2, 0x1f,0x14,0xe0,0x20,0xcf,0x80,0xbf,0x92, +0xe7,0x0, 0x16,0x80,0x97,0xde,0x3f,0xcd,0xb7,0xde,0xe0,0x2, 0x1f,0xf1,0xa7,0xff, +0x2f,0x87,0xe0,0x1, 0x17,0x80,0xe0,0x61,0x3f,0x91,0xe7,0xfe,0x0, 0xf0,0xde,0x7e, +0xe7,0xfe,0x0, 0xed,0x8, 0xb1,0xe0,0x6, 0xdc,0x84,0xe0,0x60,0x3f,0x87,0xe0,0x1, +0x1f,0x50,0xe0,0x1, 0xbf,0xf, 0xe0,0x2, 0x1f,0x65,0xe0,0x1, 0xbf,0x1f,0xe0,0x3, +0x1f,0x11,0xe0,0x1, 0xbf,0x2f,0xe0,0x1, 0x1f,0x4b,0xe0,0x1, 0xbf,0x3f,0xe0,0x3, +0x1f,0x14,0xe0,0x1, 0xbf,0x4f,0xe0,0x0, 0x1f,0x49,0xe0,0x1, 0xbf,0x5f,0xe0,0x0, +0x1f,0x14,0xe0,0x1, 0xbf,0x6f,0xe0,0x2, 0x1f,0x2a,0xe0,0x1, 0xbf,0x7f,0xe0,0x2, +0x1f,0x1d,0xe0,0x2, 0xbf,0xf, 0xe0,0x2, 0x1f,0x61,0xe0,0x2, 0xbf,0x1f,0xe0,0x2, +0x1f,0x2, 0xe0,0x2, 0xbf,0x2f,0xe0,0x3, 0x1f,0x42,0xe0,0x2, 0xbf,0x3f,0xe0,0x0, +0x1f,0x35,0xe0,0x2, 0xbf,0x4f,0xe0,0x2, 0x1f,0x6e,0xe0,0x2, 0xbf,0x5f,0xe0,0x0, +0x1f,0x36,0xe0,0x2, 0xbf,0x6f,0x8, 0xe1,0xe0,0x2, 0x1f,0x91,0xe7,0x7f,0x16,0x7f, +0xa7,0xf, 0xe0,0x1, 0x1f,0xdc,0xa6,0xae,0xa7,0x8f,0x3e,0xdc,0xbe,0xae,0xe0,0xa0, +0x17,0x0, 0x9e,0xbf,0xe0,0x1e,0xce,0x80,0xb6,0xbf,0xb7,0x7f,0xa7,0x4f,0x3f,0x5c, +0xbf,0x4f,0xa7,0x4f,0xe0,0x20,0xcf,0x0, 0xbf,0x4f,0x38,0x82,0xe0,0x2, 0x1f,0x91, +0xe7,0x7f,0x16,0x7f,0xa6,0x8f,0xe0,0x2, 0x1f,0xa4,0xa7,0x1d,0xa7,0x8f,0xcf,0x1, +0xbf,0x1d,0xe6,0xff,0x16,0xff,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0xa6,0x8f,0xe0,0x1, +0x1f,0x5c,0x3e,0xdc,0xa7,0xe, 0xbe,0x8f,0x9e,0xbe,0xe0,0x1e,0xce,0x80,0xb6,0xbe, +0xe0,0x61,0x3e,0x82,0xe7,0xef,0x15,0xff,0x3e,0xdb,0xe0,0x61,0x3e,0x92,0xe0,0x46, +0x16,0x80,0xbe,0x8f,0x15,0xfe,0xa6,0x8f,0xce,0x84,0xbe,0x8f,0xa6,0x8f,0xce,0x82, +0xbe,0x8f,0xa6,0x8f,0x3e,0xdb,0xbe,0x8f,0xa7,0xce,0x3f,0xdc,0xbf,0xce,0x17,0x0, +0xe0,0x0, 0x1f,0xab,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xa4,0x16,0xfb,0xa7,0x8f, +0xe4,0xc, 0x34,0x40,0xa7,0xf, 0xe2,0x1, 0xc6,0x7f,0x3f,0x5d,0xbf,0xf, 0xe0,0xd, +0x34,0x48,0x17,0xb, 0xaf,0x7f,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc4,0x7f,0xa7,0xf, +0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x15,0xff,0x3f,0x5b, +0xbf,0xf, 0xae,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, +0xe7,0x7f,0x16,0x7f,0x3f,0x5c,0xbf,0xf, 0xae,0xff,0xa7,0xf, 0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, 0xac,0x7f, +0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff, +0x3f,0x5d,0xbf,0xf, 0x17,0x0, 0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, +0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0x0, 0x0, +0x8, 0xb3,0x39,0xea,0x39,0x69,0xdf,0xb1,0x21,0xa1,0xe0,0x2, 0x1f,0xa4,0xc1,0xff, +0xe3,0xff,0xc1,0xff,0x16,0xff,0xa7,0xf, 0x3e,0x92,0xe0,0xc, 0x39,0x13,0x15,0x0, +0xe7,0x7f,0x15,0xff,0xad,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa7,0x8e,0x3f,0xdb,0xbf,0x8e,0x8f,0xfe,0xe0,0x80,0xaf,0x9d,0x3e,0xfc,0x1, 0xf3, +0xa7,0x8e,0x14,0x1, 0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0xe0,0x2, 0x1f,0xa4,0x14,0x1, +0xa7,0xf, 0xa7,0x8e,0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0x8, 0xb2,0x14,0x1, 0xef,0xff, +0xd7,0x3b,0xe0,0x1, 0x14,0xc8,0x14,0x0, 0xe0,0x6, 0xd3,0xcf,0x24,0x14,0xe0,0x2, +0x1f,0x48,0x17,0x82,0xe0,0x0, 0x19,0x4d,0xaf,0x8e,0xe0,0x2, 0x1f,0x12,0xaf,0x82, +0x97,0x8e,0xe0,0x20,0xcf,0x80,0xb7,0x8e,0x8c,0x2, 0xef,0xff,0xd5,0x91,0x9, 0x21, +0xe7,0xed,0x0, 0xd1,0xe0,0x2, 0x1f,0xc8,0x17,0x1, 0xe0,0x0, 0x19,0x4d,0xaf,0xf, +0x3c,0xe8,0xaf,0x2, 0x8f,0x8f,0xe0,0x3, 0x1c,0x2c,0xe4,0x0, 0xc7,0x8e,0x3c,0x1f, +0xef,0xff,0xd2,0x3b,0x0, 0xea,0x8, 0xb2,0xe0,0x2, 0x19,0x40,0xe0,0x1, 0x8c,0xa2, +0xe0,0x4, 0x8f,0xd2,0x2f,0x95,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0xe0,0x0, 0x2f,0xcb, +0xe0,0x1, 0x8c,0x82,0x14,0x5, 0xe2,0x0, 0xcc,0x94,0x2, 0x98,0xe0,0x0, 0x14,0x64, +0x24,0x95,0xe0,0x0, 0x14,0x63,0x3c,0x19,0xe0,0x6, 0xda,0x4a,0x0, 0x8f,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x2f,0xa3,0xe0,0x1, 0x8f,0x92,0xe0,0x0, 0x14,0x7f,0xe0,0x43, +0x3f,0xf, 0xe2,0x0, 0xcf,0x0, 0xe0,0x68,0x3b,0x2f,0xe0,0x5, 0x8f,0xc2,0x14,0x98, +0x3c,0x3f,0xe0,0x6, 0xda,0x35,0xe0,0x0, 0x1f,0xb2,0xe0,0x3, 0x1f,0x16,0xac,0xf, +0x87,0x8f,0xaf,0x8e,0xe0,0x2, 0x1f,0x12,0x97,0x8e,0xe3,0xff,0xc7,0xf7,0xb7,0x8e, +0x17,0x0, 0xe0,0x2, 0x1f,0xc2,0xb7,0xf, 0x9, 0x61,0xe0,0x3, 0x1f,0xc6,0x8f,0x8f, +0xe2,0x0, 0xcf,0xb8,0x5, 0x87,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x17,0xe0,0x7, 0x14,0x68,0xe0,0x6, 0xda,0x13,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f, +0x0, 0xd5,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xf3,0xe0,0x3, +0x14,0x74,0xe0,0x6, 0xda,0x5, 0xc4,0x7e,0xe2,0x1, 0xc4,0x7f,0x0, 0xc7,0xe0,0x3, +0x14,0x74,0xe0,0x6, 0xd9,0xfd,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0xe7,0xff,0x0, 0xbf, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0xa0,0x8, 0xb4, +0xe0,0x2, 0x19,0x12,0x9f,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0x96,0xe0,0x3, +0x1f,0x43,0x97,0x82,0x89,0x8e,0xe3,0xfe,0xc7,0xff,0xe2,0x0, 0xc9,0x81,0xb7,0x82, +0x1, 0x10,0x9f,0x82,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0x87,0x97,0x82,0x14,0x0, +0xe3,0x7f,0xc7,0xff,0xb7,0x82,0xa, 0x61,0x14,0x1, 0xa, 0x61,0x14,0x1, 0x38,0x82, +0x3c,0x63,0xef,0xff,0xd6,0x79,0xe0,0x1, 0x14,0xc8,0x3c,0x63,0xe0,0x6, 0xd3,0xd, +0xe0,0x0, 0x1a,0x4d,0x2c,0x5, 0x8c,0x4, 0xef,0xff,0xd4,0xda,0x0, 0xe3,0x97,0x82, +0xe0,0x2, 0x1f,0x48,0xe3,0xdf,0xc7,0xff,0xb7,0x82,0x3c,0xe3,0x97,0x82,0xe0,0x3, +0x1c,0x2c,0xe0,0x40,0xcf,0x80,0xb7,0x82,0xa9,0x8e,0xa9,0x84,0x8f,0x8e,0xe4,0x0, +0xc7,0x8e,0x3c,0x1f,0xef,0xff,0xd1,0x62,0x0, 0xe7,0x8, 0xb6,0xe0,0x0, 0x1f,0xbd, +0xe0,0x3, 0x19,0x36,0xa1,0x8f,0xa7,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0x99, +0xe0,0x2, 0x1b,0x12,0xe7,0xff,0x12,0x81,0xe0,0x1, 0x12,0x7f,0x0, 0x8c,0x9f,0x86, +0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xd4,0xbe,0xa7,0x83,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x27,0x87,0xaa,0x82,0xef,0xff,0xd6,0x5a,0x3c,0xe4,0x24,0x71,0xb, 0x61, +0xe0,0x1, 0x1f,0xdc,0xe7,0xef,0x16,0xff,0xa7,0x8f,0xe0,0x4, 0x14,0x89,0xe0,0x1, +0xa7,0x6f,0x14,0x2, 0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6f,0xe0,0x1, 0xa7,0x6f, +0x3f,0x5d,0xe0,0x1, 0xbf,0x6f,0xe7,0xff,0x17,0x81,0xaf,0x82,0xb, 0x21,0xe0,0x9, +0x0, 0x9b,0x0, 0x0, 0x8, 0xb2,0xe0,0x2, 0x19,0x12,0x9f,0x82,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x2f,0x8d,0x9f,0x82,0xe0,0xf, 0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x87, +0xdf,0xb5,0x9f,0x82,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0xfb,0xef,0xff,0xd6,0x27, +0x24,0x3, 0x0, 0x85,0xdf,0xab,0xef,0xff,0xd6,0x22,0x24,0x7d,0x9, 0x61,0xe0,0x0, +0x1f,0xbd,0xa7,0x8f,0xa7,0x8f,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x94,0xe0,0x3, +0x1e,0xb6,0xe0,0x2, 0x1f,0xc, 0xe7,0xff,0x16,0x1, 0xae,0xd, 0x8e,0x8e,0xe2,0x0, +0xce,0x81,0x1, 0xa, 0xe0,0x2, 0x1f,0xc7,0x9f,0x8f,0x2f,0x8c,0x14,0x83,0x14,0x1, +0xe0,0x8, 0x0, 0xe2,0x38,0x82,0xe0,0x2, 0x1e,0xc7,0xe0,0x1f,0x16,0x20,0xb6,0xd, +0xaf,0x8e,0xe0,0x4, 0x14,0x81,0x14,0x2, 0xe0,0x8, 0x0, 0xd6,0x8, 0xb5,0xef,0xff, +0xd5,0xf6,0xe0,0x0, 0x24,0x4b,0x14,0x0, 0xd6,0xa, 0xe0,0x2, 0x1f,0x91,0xe7,0xdf, +0x17,0x7f,0xa1,0xf, 0xe0,0x2, 0x1a,0x96,0xa7,0x92,0xe0,0x2, 0x19,0x92,0x3f,0xde, +0xbf,0x92,0xe7,0xfb,0x17,0x7f,0xa7,0x92,0xe0,0x2, 0x1a,0x40,0x3f,0xde,0xbf,0x92, +0xe7,0xfd,0x17,0x7f,0xa7,0x92,0x3f,0xde,0xbf,0x92,0xe7,0xfe,0x17,0x7f,0xa7,0xa2, +0x3f,0xde,0xbf,0xa2,0x9f,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xe0,0xa, +0x8f,0x84,0x27,0xa8,0x8f,0x85,0x2f,0xa6,0xdf,0xab,0x9f,0x83,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x27,0xf6,0x8f,0x85,0x27,0x84,0x8f,0x85,0xc7,0xff,0xaf,0x85,0x14,0x1, +0xa7,0x92,0xe0,0x20,0xcf,0x80,0xbf,0x92,0xa7,0x92,0xe0,0x4, 0xcf,0x80,0xbf,0x92, +0xa7,0x92,0xe0,0x2, 0xcf,0x80,0xbf,0x92,0xa7,0xa2,0xe0,0x1, 0xcf,0x80,0xbf,0xa2, +0xa, 0xa1,0xe0,0xb, 0x0, 0xc5,0xdf,0x32,0xef,0xff,0xd5,0xa9,0x24,0x7d,0xe7,0xff, +0x0, 0xb4,0xdf,0x2c,0x0, 0xd0,0x0, 0x0, 0x8, 0xb3,0x14,0x1, 0xef,0xff,0xd5,0x7c, +0xe0,0x0, 0x1f,0xbd,0xa7,0x8f,0xa1,0xf, 0x31,0x43,0xe2,0x0, 0xc1,0x1, 0x29,0x7c, +0x3c,0x62,0xd5,0xad,0xe0,0x2, 0x1f,0x91,0xe7,0xdf,0x17,0x7f,0xa1,0x8f,0x14,0x1, +0xa7,0x93,0x3c,0xe2,0x3f,0xde,0xbf,0x93,0xe7,0xfb,0x17,0x7f,0xa7,0x93,0x3f,0xde, +0xbf,0x93,0xe7,0xfd,0x17,0x7f,0xa7,0x93,0x3f,0xde,0xbf,0x93,0xe7,0xfe,0x17,0x7f, +0xa7,0xa3,0x3f,0xde,0xbf,0xa3,0xe7,0xff,0x17,0x1, 0xe0,0x3, 0x1f,0xb6,0xaf,0xf, +0xd3,0xd2,0xa7,0x93,0x14,0x1, 0xe0,0x20,0xcf,0x80,0xbf,0x93,0xa7,0x93,0xe0,0x4, +0xcf,0x80,0xbf,0x93,0xa7,0x93,0xe0,0x2, 0xcf,0x80,0xbf,0x93,0xa7,0xa3,0xe0,0x1, +0xcf,0x80,0xbf,0xa3,0x9, 0xa1,0xe0,0xa, 0x0, 0xfb,0x8, 0xb1,0xe0,0x1, 0x1f,0xc2, +0xe0,0x1a,0x17,0x20,0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0x37,0x28, +0x3c,0x4e,0xe0,0x5, 0xd3,0x4c,0xe0,0x5, 0xd2,0xe8,0xe0,0x1, 0xd7,0xc0,0xe0,0x2, +0x1f,0x40,0x17,0x81,0xe0,0x4, 0xaf,0xfe,0xe0,0x1b,0x14,0x2c,0xe0,0x3, 0x1f,0x47, +0xaf,0x8e,0xe0,0x5, 0xd3,0x3c,0xe0,0x2, 0x1f,0xfd,0xe0,0x19,0x16,0x9d,0x17,0x7, +0x3e,0x9f,0xaf,0xd, 0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0x8, 0xe1,0x8, 0xb2,0xe0,0x2, +0x1f,0xc0,0x17,0x0, 0xe0,0x0, 0x1e,0xb2,0xe0,0x4, 0xaf,0x5f,0xe0,0x3, 0x1f,0x16, +0x8f,0x8d,0x8e,0xe, 0x37,0xc1,0x3f,0xfc,0x3, 0x9d,0x8e,0x8d,0x8f,0x8e,0x36,0xc1, +0x3f,0xad,0xe0,0x2, 0x19,0x12,0xaf,0x8e,0x17,0x0, 0xe0,0x2, 0x1f,0xec,0xb7,0xf, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x85,0x97,0x82, +0xe0,0x1, 0xcf,0x80,0xb7,0x82,0x9f,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x2f,0x88, +0x9, 0x61,0xe0,0x2, 0x19,0x12,0x97,0x82,0xcf,0x88,0xb7,0x82,0x0, 0xe6,0xd5,0x41, +0x97,0x82,0xcf,0x88,0xb7,0x82,0x97,0x82,0xe0,0x80,0xcf,0x80,0xb7,0x82,0x9, 0x61, +0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f,0x27,0x86,0xe0,0x2, 0x1f,0x87,0x8f,0x8f, +0x27,0x89,0x38,0x82,0x8, 0xb1,0xdf,0xbb,0xe0,0x2, 0x1f,0xeb,0x17,0x2, 0xaf,0xf, +0x8, 0xe1,0xe7,0xff,0x0, 0xb5,0x8, 0xb1,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x22, +0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa3,0x8c,0xf, 0x37,0x28,0x3c,0x4e,0xe0,0x5, +0xd2,0xd6,0xdf,0x3b,0xdf,0x7b,0xdf,0xa3,0xde,0x14,0x8, 0xa1,0xe7,0xe8,0x0, 0xe3, +0x8, 0xb4,0xe0,0x2, 0x1f,0xba,0x12,0x3c,0x8f,0x8f,0x27,0x8a,0xe0,0x3, 0x1f,0xc3, +0x8f,0x8f,0xe2,0x0, 0xcf,0x80,0x17,0xb9,0xe0,0x6f,0x39,0x24,0x3a,0x6f,0xe0,0x2, +0x19,0x40,0xe0,0x3, 0x19,0x82,0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0x1, 0x1b, +0x8f,0x3, 0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0x1, 0x2, 0xa, 0x61,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x27,0xfc,0x3a,0x7e,0x1, 0x23,0x17,0x81,0x3f,0x9e,0xe2,0x1, +0xc7,0xff,0xe0,0x3, 0x1e,0xc6,0xe2,0x0, 0xcf,0xbc,0xaf,0xd, 0x5, 0x82,0x17,0x80, +0xaf,0x83,0xa, 0x61,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0x27,0xe3,0x8f,0x3, 0x2f,0x62, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0xdb,0xe0,0x3, +0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xd5,0xdd,0x30,0x0, 0xd2,0xe0,0x3, +0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x2, 0x1f,0x12, +0x97,0x8e,0xe0,0x1, 0xcf,0x80,0xb7,0x8e,0xdd,0xbc,0xef,0xff,0xd4,0xc, 0x8f,0x3, +0x0, 0xcd,0x8, 0xb4,0xe0,0x2, 0x1f,0xe0,0xe0,0x2, 0x19,0x40,0x8f,0xf, 0x27,0xd, +0x17,0x0, 0xe0,0x4, 0x8e,0xd2,0xaf,0xf, 0xe0,0x0, 0x26,0xce,0xe0,0x4, 0x8f,0xd2, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x3, 0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81, +0x1, 0x3b,0x4, 0x8b,0xe2,0x0, 0xcf,0x83,0x1, 0x84,0xa, 0x21,0xe7,0xfe,0x0, 0xf5, +0x17,0x81,0xe0,0x4, 0xaf,0xd2,0xa, 0x61,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x27,0xb6, +0xe0,0x2, 0x1e,0xec,0x17,0x0, 0xb7,0xd, 0x8f,0xe2,0xe2,0x0, 0xc7,0x81,0x27,0xf4, +0xe0,0xa, 0x8f,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0xef,0xe0,0x2, 0x1f,0x87,0x8e,0xf, +0xe2,0x0, 0xce,0x1, 0x1, 0xe9,0xe0,0x4, 0xae,0x52,0xe0,0x3, 0x1d,0x16,0xe0,0x0, +0x1e,0x32,0xe0,0x2, 0x1d,0xf7,0x8e,0xc, 0x8c,0x8a,0xaf,0xf, 0x3e,0x19,0xae,0xa, +0xb7,0xd, 0xe0,0x3, 0x1f,0x82,0x8e,0x8b,0xaf,0xf, 0xce,0x84,0xe0,0x3, 0x1f,0xc6, +0xae,0x8b,0xaf,0xf, 0xa, 0x61,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x27,0xcd,0xa, 0x21, +0xe7,0xfe,0x0, 0xa8,0xde,0xec,0xe7,0xff,0x0, 0xb9,0x8f,0xe2,0xe2,0x0, 0xc7,0x81, +0x27,0xc3,0xe0,0x2, 0x19,0xec,0xe0,0x7, 0x14,0xe8,0x9c,0x3, 0x8a,0x72,0xe0,0x6, +0xd7,0x8a,0xe3,0xff,0xc4,0x7f,0x3c,0x74,0x3, 0x8c,0xe0,0xa, 0x8f,0x82,0xe2,0x0, +0xcf,0x81,0xe7,0xff,0x1, 0xb2,0x9f,0x83,0xe2,0x7, 0xcf,0xe7,0xe7,0xff,0x5, 0xad, +0x17,0x81,0xe0,0x4, 0xaf,0xd2,0x16,0x0, 0xe0,0x3, 0x1e,0x96,0xe0,0x0, 0x1f,0xb2, +0xe0,0x2, 0x1f,0x77,0x8f,0x8f,0x8d,0x8d,0x3f,0x9b,0xe0,0x2, 0x1d,0x87,0xaf,0x8d, +0x16,0x80,0xb6,0x3, 0xae,0x8b,0xe0,0x3, 0x1d,0x82,0x8f,0x8e,0xae,0xb, 0xcf,0x84, +0xe0,0x3, 0x1e,0x46,0xaf,0x8e,0xae,0x8c,0xa, 0x61,0xe0,0x4, 0xaf,0xd2,0x16,0x0, +0xe0,0x3, 0x1e,0x96,0xe0,0x0, 0x1f,0xb2,0x8f,0x8f,0x8d,0x8d,0x3f,0x9b,0xaf,0x8d, +0xe0,0x2, 0x1d,0x87,0xe0,0x2, 0x1f,0xec,0xe0,0x2, 0x1e,0xf7,0xb6,0xf, 0xaf,0xb, +0xe0,0x3, 0x1d,0x82,0x8f,0x8d,0xae,0xb, 0xcf,0x84,0xe0,0x3, 0x1e,0x46,0xaf,0x8d, +0xaf,0xc, 0xe7,0xfe,0x0, 0xe3,0x8, 0xb1,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x2f,0x8d, +0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0x27,0x85,0xdd,0x86,0x8, 0xa1,0xe7,0xfd,0x0, 0xea, +0xdd,0xc6,0x8, 0xa1,0xe7,0xfd,0x0, 0xe6,0xdf,0x3d,0x0, 0xf3,0xe0,0x3, 0x1f,0x2d, +0xe0,0x2, 0x1e,0x92,0x0, 0x86,0x9f,0x8d,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x83, +0x9f,0x8e,0x2f,0xfa,0x17,0x87,0xb7,0x8e,0x38,0x82,0x0, 0x0, 0xe0,0x0, 0x1f,0xcd, +0x8f,0x8f,0x2f,0x9f,0x8, 0xb2,0xe0,0x2, 0x19,0x39,0x9f,0x82,0x2f,0xff,0xdc,0x6c, +0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0x13,0xe0,0x1, +0x8c,0x8f,0xe0,0x0, 0x14,0x64,0xe0,0x6, 0xd6,0xc3,0xc4,0x7f,0xb4,0x2, 0xe0,0x2, +0x1f,0xb2,0x9e,0x82,0x9f,0xf, 0x3e,0xfe,0x5, 0x83,0x97,0x8f,0xb7,0x82,0x9, 0x61, +0x38,0x82,0xe0,0x1, 0x8f,0x9f,0xc7,0xff,0xb7,0x82,0x0, 0xf2,0xe0,0x2, 0x1f,0x91, +0xe7,0x7f,0x16,0xff,0xa7,0x8f,0xe2,0x0, 0xcc,0x7, 0xa7,0x1f,0xe1,0x0, 0xcf,0x0, +0xbf,0x1f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0xe7,0xdf,0x16,0xff,0xa7,0x2f,0x3f,0x5d, +0xbf,0x2f,0xe7,0xbf,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x2, 0x88,0xa7,0x2f, +0x16,0xf8,0xe2,0x0, 0xc4,0x7, 0x3f,0x5d,0x3c,0x4e,0xbc,0x2f,0x38,0x82,0xe0,0x2, +0x1f,0xe4,0x16,0xdf,0xa7,0xf, 0x15,0xfe,0xa7,0xbe,0x3f,0xdd,0xbf,0xbe,0xe7,0xfe, +0x16,0xff,0xa6,0x3e,0xe0,0x0, 0x1f,0xbd,0x3e,0x5d,0xa7,0x8f,0xbe,0x3e,0x17,0x0, +0xaf,0x7f,0x16,0xfd,0xa6,0xf, 0xe0,0x1, 0x1f,0x5c,0x3e,0x5b,0xbe,0xf, 0xa6,0xf, +0xa7,0xe, 0x3e,0x5d,0xbe,0xf, 0xa6,0xbf,0x3e,0xdb,0xbe,0xbf,0x16,0xfc,0xa7,0x8e, +0x3f,0xdd,0xbf,0x8e,0x17,0x80,0xe0,0x3, 0xb7,0x9e,0x17,0x80,0xe0,0x61,0x3f,0x92, +0xe1,0xff,0x17,0xff,0xe0,0x61,0x3f,0x91,0x38,0x82,0xe0,0x2, 0x1f,0xe4,0xe0,0x0, +0x1f,0x3d,0xa6,0x8f,0x16,0x7e,0xa7,0xbd,0xa7,0xe, 0x3f,0xdc,0xbf,0xbd,0xe7,0xff, +0x16,0xbf,0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0xe0,0x61,0x3f,0x82,0xcf,0x81,0xe0,0x61, +0x3f,0x92,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xe0,0x1, 0x1f,0x5c,0xa6,0x8f,0x16,0x6f, +0xa7,0x9d,0xa7,0xe, 0x3f,0xdc,0xbf,0x9d,0xe0,0x1, 0xa7,0xee,0xe0,0x20,0xcf,0x80, +0xe0,0x1, 0xbf,0xee,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xe0,0x2, 0x1f,0xe4, +0xa7,0x1d,0xa7,0x8f,0xcf,0x8, 0xbf,0x1d,0xe7,0xff,0x16,0xbf,0xa7,0x3f,0x3f,0x5d, +0xbf,0x3f,0xa7,0x2f,0xe2,0x1, 0xc7,0x4f,0xcf,0x20,0xbf,0x2f,0xe0,0x2, 0x17,0x0, +0xb7,0x3f,0xa7,0x3f,0xcf,0x40,0xbf,0x3f,0xe0,0x61,0x3f,0x82,0xe0,0x40,0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0x8, 0xb2,0xe0,0x1, 0x1f,0x5c,0x17,0xff,0xa1,0xe, +0xb7,0xd2,0xe0,0x1, 0xb7,0xd2,0xe0,0x6, 0xd5,0x11,0xe0,0x2, 0x1f,0xe6,0xe0,0x41, +0x3f,0x8, 0xac,0xf, 0xe7,0xfb,0x16,0xff,0xa7,0x82,0xe2,0x0, 0xc7,0x1, 0x37,0x29, +0x3f,0xdd,0x3f,0xce,0xbf,0x82,0xe0,0x1, 0x17,0xc3,0xb7,0xb2,0xda,0xa6,0xa7,0xb2, +0x16,0xef,0xcf,0x84,0xbf,0xb2,0x17,0xfb,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0x17,0xf7, +0xa7,0x32,0xcf,0x8, 0xbf,0x32,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0xa7,0x32,0xcf,0x10, +0xbf,0x32,0xa7,0x12,0x3f,0x5d,0xbf,0x12,0xa7,0xc2,0x3f,0xdd,0xbf,0xc2,0x9, 0x61, +0xe0,0x2, 0x1f,0x90,0xe7,0xff,0x16,0xbf,0xa7,0x8f,0xa7,0x1f,0xcf,0x1, 0xbf,0x1f, +0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0xe7,0xfe,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0x17,0x2f,0xbf,0x2f,0xa7,0x1f,0xcf,0x2, 0xbf,0x1f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f, +0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0xe0,0x61,0x3f,0x82,0xe7,0xf7,0x17,0x7f,0x3f,0xde, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x2, 0x1f,0x90,0xa7,0x8f,0xa7,0x2f,0x27,0x7, +0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x38,0x82,0xe0,0x2, +0x1f,0x91,0xe0,0x0, 0x1e,0x40,0xa7,0xf, 0xe7,0xfe,0x15,0x7f,0xa7,0xbe,0xe0,0x0, +0x1d,0xc2,0xcf,0x81,0xbf,0xbe,0xa6,0x8e,0xe0,0x3, 0x1f,0x81,0xce,0x82,0xbe,0x8e, +0x16,0xa0,0xb6,0x8c,0xa6,0x9e,0xa7,0x8f,0x3e,0xda,0xbe,0x9e,0xa6,0x9e,0xa5,0x8b, +0xe0,0x8, 0xce,0x80,0xbe,0x9e,0x16,0xf7,0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, +0xcf,0x8, 0xbf,0xf, 0xa7,0xb, 0x3f,0x5d,0xbf,0xb, 0x17,0x0, 0xe0,0x1, 0xaf,0x3f, +0x96,0xc, 0xb6,0x3f,0xe0,0x61,0x3f,0x2, 0xe0,0x2, 0xcf,0x0, 0xe0,0x61,0x3f,0x12, +0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0x38,0x82, +0xe0,0x3, 0x1f,0x4b,0xe2,0xff,0x17,0xf0,0xbf,0xf, 0xe2,0xff,0x17,0xf4,0xe0,0x3, +0x1f,0x4c,0xbf,0xf, 0xe2,0xff,0x17,0xf8,0xe0,0x3, 0x1f,0x4d,0xbf,0xf, 0xe2,0xff, +0x17,0xfc,0xe0,0x3, 0x1f,0x4e,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xdc,0x16,0x80, +0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf,0xe0,0x2, 0x16,0x84,0xbf,0xd, 0xe0,0x2, +0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0xe0,0x0, 0x16,0xeb,0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf,0xe0,0x2, 0x16,0x84, +0xbf,0xd, 0xe0,0x2, 0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x38,0x82, +0xc4,0x7f,0xe1,0xff,0x17,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7e,0x1, 0xc, 0x17,0x88, +0x0, 0x0, 0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc4,0x7f,0xe3,0xff,0xc4,0x7f, +0x3c,0x7e,0x1, 0xf6,0x38,0x82,0x0, 0x0, 0xc4,0x7f,0xe1,0xff,0x16,0x7f,0xe3,0xff, +0xc4,0x7f,0x3c,0x7c,0x1, 0x17,0x16,0x84,0xe0,0x1, 0x17,0x7a,0x17,0x88,0x0, 0x0, +0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0x2f,0x77, +0xc6,0xff,0xe2,0x1, 0xc6,0xff,0x2e,0xf1,0xc4,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7c, +0x1, 0xeb,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0xf, 0xa7,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0x98,0xe0,0x2, 0x1f,0x91,0xe7,0xff,0x16,0x3f,0xa7,0x8f,0xa6,0xdf,0xe0,0x1, +0xce,0x80,0xbe,0xdf,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a,0xe2,0x0, +0xc7,0x1, 0x2f,0x1e,0xa7,0x5f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xbf,0x5f,0x38,0x82, +0xa7,0xce,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0x98,0xe0,0x2, 0x1f,0x91,0xe7,0xff, +0x16,0x3f,0xa7,0x8f,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xe7,0xfe,0x16,0x7f,0xa6,0xdf, +0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0x27,0x64,0xa7,0x5f, +0xe1,0x0, 0xcf,0x0, 0xbf,0x5f,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xa7,0x8f,0xa6,0xdf, +0xce,0xc0,0x0, 0xeb,0x8, 0xb4,0xe0,0x3, 0x19,0x36,0x8f,0x82,0xe2,0x1, 0xcf,0x81, +0x1, 0x4, 0x17,0x80,0xaf,0x82,0xa, 0x61,0x24,0x2b,0xe2,0x0, 0xcc,0x1, 0x39,0xe9, +0x1, 0x30,0xe2,0x0, 0xcc,0x2, 0x1, 0xf6,0x3f,0x83,0xdf,0xad,0xe0,0x2, 0x1f,0x91, +0xe0,0x3, 0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0x21,0x84,0xa4,0xef,0x3c,0xc3, +0xbc,0xef,0xe0,0x0, 0x1f,0x3d,0xa7,0xe, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, +0x2f,0xe, 0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,0x80,0xaf,0x82,0xa, 0x61, +0x3f,0x83,0x17,0x82,0x3f,0xd9,0x2f,0xae,0xdf,0x7e,0xe0,0x2, 0x1f,0x91,0xe0,0x3, +0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xe0,0x0, 0x1f,0x3d,0xa2,0xe, 0x29,0xb0, +0xa7,0x3f,0xe7,0xfe,0x16,0xff,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7,0x84,0x37,0xc5,0xe2,0x0, +0xc7,0x81,0xe7,0xff,0x27,0xa0,0xa7,0x84,0x17,0x5f,0x3f,0xde,0xbf,0x84,0xe7,0xff, +0x0, 0x9a,0xe0,0x0, 0x1f,0xbd,0xa2,0xf, 0xa7,0x84,0xcf,0xa0,0xbf,0x84,0xdf,0x4b, +0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xa4,0xef, +0x3c,0xc3,0xbc,0xef,0x0, 0xce,0x8, 0xb1,0xe0,0x1, 0x1f,0xdc,0x17,0x0, 0xa6,0x8f, +0xe0,0x2, 0x1f,0x91,0xe0,0x2, 0xbf,0xd, 0x16,0x6f,0xa7,0x8f,0xbf,0x6f,0xa6,0xdf, +0xe0,0x80,0xce,0x80,0xbe,0xdf,0xa6,0xdf,0xe0,0x40,0xce,0x80,0xbe,0xdf,0xa6,0xdf, +0xe0,0x20,0xce,0x80,0xbe,0xdf,0xa6,0xef,0xce,0xc0,0xbe,0xef,0xa6,0xef,0xce,0xa0, +0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0x7f,0x16,0x7f,0xa6,0xef,0xe1,0x0, +0xce,0x80,0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0xbf,0x16,0x7f,0xa6,0xef, +0x3e,0xdc,0xbe,0xef,0xe7,0xdf,0x16,0x7f,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xa6,0xef, +0xe0,0x10,0xce,0x80,0xbe,0xef,0xe0,0x3, 0x1f,0x98,0xb7,0xf, 0xdf,0x4, 0xe0,0x61, +0x3f,0x82,0x17,0x7d,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82,0x17,0x7b, +0x3f,0xde,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0xe0,0x1, 0x1f,0xdc,0xe2,0x0, 0xcc,0x2, +0xa7,0x8f,0xe0,0x0, 0x1, 0x57,0xe2,0x0, 0xcc,0x3, 0x1, 0x36,0xe2,0x0, 0xcc,0x1, +0x1, 0x19,0xa6,0x8f,0xe0,0x2, 0x1f,0x11,0x16,0x7b,0xa7,0xe, 0x3e,0xdc,0xbe,0x8f, +0xe6,0xff,0x16,0x7f,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0x16,0x78,0xa6,0xce,0x3e,0xdc, +0xbe,0xce,0x16,0xf7,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0x16,0x80,0xe0,0x1, 0xbe,0xbf, +0x38,0x82,0xa7,0xf, 0x16,0x77,0x3f,0x5c,0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f, +0x16,0x78,0xa7,0xf, 0xe0,0x2, 0x1e,0x91,0xcf,0x4, 0xa6,0x8d,0xbf,0xf, 0xa7,0x4d, +0xe1,0x0, 0xcf,0x0, 0xbf,0x4d,0xa7,0x4d,0x3f,0x5c,0xcf,0x1, 0xbf,0x4d,0xa7,0x1f, +0xcf,0x8, 0xbf,0x1f,0x38,0x82,0xa7,0xf, 0xe0,0x2, 0x1e,0x91,0x16,0x7b,0x3f,0x5c, +0xa6,0x8d,0xbf,0xf, 0xe6,0xff,0x16,0x7f,0xa7,0x4d,0x3f,0x5c,0xbf,0x4d,0xa7,0xf, +0xcf,0x8, 0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, +0xbf,0x1f,0xa7,0x1f,0xcf,0x10,0xbf,0x1f,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f,0x38,0x82, +0xa6,0x8f,0x16,0x77,0x3e,0xdc,0xbe,0x8f,0x16,0x80,0xe0,0x1, 0xbe,0xbf,0x16,0x78, +0xa6,0x8f,0xe0,0x2, 0x1f,0x11,0xce,0x84,0xa7,0xe, 0xbe,0x8f,0xa6,0xce,0xe1,0x0, +0xce,0x80,0xbe,0xce,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f, +0x38,0x82,0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0xa1,0x8f,0xe0,0x1, 0x1f,0xdc,0xa1,0xf, +0xa7,0xb3,0xcf,0x81,0xbf,0xb3,0xa7,0x83,0xcf,0x88,0xbf,0x83,0xe0,0x1, 0xa7,0x92, +0xcf,0x82,0xe0,0x1, 0xbf,0x92,0xe0,0x1, 0xa7,0x92,0xcf,0x81,0xe0,0x1, 0xbf,0x92, +0xe0,0x3, 0x1f,0x8d,0x8c,0xf, 0xdf,0x71,0xa7,0xd3,0x17,0x7d,0xcf,0x81,0xbf,0xd3, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x7b,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x77, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x6f,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0xe6,0xff, +0x17,0x7f,0xa7,0xd3,0xcf,0xa0,0xbf,0xd3,0xe0,0x1, 0xa7,0xa2,0x3f,0xde,0xe0,0x1, +0xbf,0xa2,0x17,0x78,0xe0,0x1, 0xa7,0xa2,0xe0,0x60,0xcf,0x80,0xe0,0x1, 0xbf,0xa2, +0xe0,0x1, 0xa7,0xa2,0xcf,0x88,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0x3f,0xde, +0xcf,0x85,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x2, 0xcf,0x80,0xe0,0x1, +0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x4, 0xcf,0x80,0xe0,0x1, 0xbf,0xa2,0x9, 0xe1, +0xe0,0x2, 0x1f,0x91,0xe7,0xfd,0x16,0xff,0xa7,0x8f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, +0xbf,0x1f,0xa7,0x1f,0xe0,0x2, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0xe7,0xff,0x16,0xbf,0xa7,0x1f,0xe0,0x4, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0xe0,0x1, +0xcf,0x0, 0xbf,0x2f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x16,0xef,0xa7,0x2f,0x3f,0x5d, +0xbf,0x2f,0x16,0xf7,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0x17,0x1, 0xa7,0x8f,0x3f,0x58,0xe0,0x1, 0xa6,0xaf,0x15,0xf7,0xe0,0xc, 0x37,0x23, +0x3e,0xdb,0x3e,0xcc,0xe0,0x1, 0xbe,0xaf,0xe7,0xfd,0x15,0xff,0xe0,0x1, 0xa6,0xaf, +0xe0,0xc, 0x37,0x28,0x3e,0xdb,0x3e,0xcc,0xe0,0x1, 0xbe,0xaf,0xe7,0xfb,0x16,0xff, +0xe0,0x1, 0xa4,0x2f,0x37,0x29,0x3c,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x2f,0x38,0x82, +0x8, 0xb1,0xe0,0x5, 0xdc,0x73,0x24,0x6, 0xe0,0x2, 0x1f,0x14,0x97,0xce,0xcf,0x82, +0xb7,0xce,0xe0,0x2, 0x1f,0xb3,0x8f,0x8f,0x27,0x82,0x8, 0xe1,0x8, 0xa1,0xe7,0xe0, +0x0, 0x95,0xe0,0x2, 0x1e,0x92,0xe0,0x2, 0x1f,0x14,0x97,0x8d,0xcf,0x81,0xb7,0x8d, +0x97,0xce,0xcf,0x84,0xb7,0xce,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, +0xc7,0x81,0x2f,0x82,0x38,0x82,0x0, 0xdd,0xe0,0x2, 0x1f,0x12,0xe0,0x2, 0x1e,0x94, +0x97,0x8e,0xcf,0x81,0xb7,0x8e,0x97,0x4d,0xe0,0x3, 0x1f,0xb8,0xcf,0x4, 0xa7,0x8f, +0xb7,0x4d,0xa7,0x5f,0xcf,0x8, 0xbf,0x5f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x82, +0x38,0x82,0x0, 0xc7,0xe0,0x61,0x3f,0x82,0xe0,0x61,0x3f,0x2, 0xe7,0xfe,0x16,0xff, +0x3f,0x5d,0xe0,0x61,0x3f,0x12,0xe0,0x3, 0x1f,0x38,0x16,0x7e,0xa7,0xe, 0xe2,0x0, +0xc4,0x1, 0xa6,0xbe,0x15,0xfd,0x3e,0xdc,0x3e,0xc8,0xbe,0xbe,0xe0,0xc, 0x34,0x21, +0xa6,0xbe,0x34,0x2a,0x3e,0xdb,0x3e,0xcc,0xbe,0xbe,0xe7,0xf7,0x16,0x7f,0xa6,0xbe, +0x37,0xc7,0x3e,0xdc,0x3c,0x4d,0xbc,0x3e,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x61, +0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0x8, 0xb1,0xe0,0x1, +0x1f,0xdc,0xe7,0x7f,0x16,0xff,0xa7,0xf, 0xe7,0xfb,0x16,0x7f,0xa7,0x8e,0xe7,0xe0, +0x14,0x80,0x3f,0xdd,0xbf,0x8e,0xf0,0x1a,0x13,0x98,0xe0,0x1, 0xa6,0xee,0xe0,0x3, +0x1f,0xb8,0xe0,0x4, 0xce,0x80,0xe0,0x1, 0xbe,0xee,0xe0,0x1a,0x15,0x19,0xe0,0x1, +0xa6,0xee,0xa7,0x8f,0x3e,0xdc,0xe0,0x1, 0xbe,0xee,0x16,0x81,0xbe,0xdf,0xe7,0xf8, +0x16,0x0, 0xa6,0xef,0x17,0x0, 0xe3,0xfe,0xc6,0x9f,0xbe,0xef,0xe7,0x80,0x14,0x0, +0xa6,0xef,0xe0,0x1, 0x1d,0xc2,0xbe,0xef,0xf0,0x17,0x3b,0x9b,0xe0,0x1, 0xa6,0xdf, +0x3d,0x1b,0xe3,0xff,0xc6,0x80,0xe0,0x1, 0xbe,0xdf,0xe0,0x1, 0xa6,0xdf,0xe0,0x1, +0xbe,0xdf,0xe0,0x3, 0x16,0xe0,0xe0,0x1, 0xbe,0xef,0xe0,0x1, 0xa6,0xff,0x3e,0xdc, +0xe0,0x1, 0xbe,0xff,0xe7,0xf0,0x16,0x0, 0xe0,0x2, 0xa6,0x8f,0x3e,0xd9,0xe0,0x2, +0xbe,0x8f,0xe0,0x2, 0xa6,0x9f,0x3e,0xd9,0xe0,0x2, 0xbe,0x9f,0xe0,0x17,0x16,0xb8, +0xe0,0x4, 0xb6,0xdf,0xe0,0x2, 0xa6,0xcf,0x3e,0xdc,0xe0,0x2, 0xbe,0xcf,0xe0,0x9, +0x16,0x88,0xe0,0x2, 0xbe,0xbf,0xe0,0x12,0x16,0xdc,0xe0,0x2, 0xbe,0xdf,0xe1,0x20, +0x16,0x80,0xe0,0x2, 0xbf,0x6f,0xe0,0x2, 0xbe,0xff,0xe0,0x3, 0xa5,0xef,0x3d,0xd8, +0xcd,0xe4,0xe0,0x3, 0xbd,0xef,0xe0,0x3, 0xa6,0x7f,0x3e,0x58,0xce,0x64,0xe0,0x3, +0xbe,0x7f,0xe0,0x4, 0xa6,0x8f,0x3e,0xd9,0xe0,0x7, 0xce,0xe8,0xe0,0x4, 0xbe,0x8f, +0xe1,0xff,0x16,0xff,0xe0,0x4, 0xbf,0x1f,0xbe,0x9f,0xe1,0x39,0x16,0x83,0xbf,0x3f, +0xbe,0xbf,0xe0,0x2, 0x1e,0x92,0xb7,0xd, 0xa6,0xbf,0xbe,0xaf,0xe0,0x3, 0x1f,0x9d, +0xe8,0x0, 0x86,0x87,0xb7,0xf, 0xe0,0x2, 0x1f,0xba,0x87,0xa, 0xae,0x8f,0xe0,0x3, +0x1f,0xc3,0xaf,0xf, 0xef,0xfe,0xda,0x2f,0xe0,0x5, 0xda,0x42,0xe0,0x61,0x3f,0x82, +0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0x8, 0xb1,0xf0,0x3, 0x18,0xb8, +0xe7,0xbf,0x16,0x7f,0xe8,0x0, 0xa7,0x1, 0xe0,0x2, 0x1e,0xfd,0xe0,0x1, 0xa7,0xee, +0xf0,0x3, 0x19,0xcf,0x3f,0xdc,0xe0,0x1, 0xbf,0xee,0xfa,0xd7,0xca,0xa8,0xe0,0x2, +0x1f,0xe6,0xe0,0x1, 0x9d,0x2d,0x85,0x8f,0xe0,0x1, 0x1f,0xc2,0xe0,0x1, 0x9e,0x1d, +0xf0,0x10,0x89,0x7f,0xe0,0x0, 0x1f,0xc4,0xe0,0x3, 0x1e,0xd0,0xe4,0xa, 0x35,0x20, +0xe4,0xc, 0x36,0x20,0xa7,0x8f,0xf0,0x3, 0x1b,0xd1,0xe0,0x3, 0x1c,0x52,0xe0,0x3, +0x1c,0xd3,0xe0,0x3, 0x18,0xd4,0xf0,0x3, 0x18,0x55,0xf0,0x3, 0x1a,0x56,0x17,0x0, +0xe2,0x0, 0xc5,0x81,0x3d,0x4d,0x3e,0x4d,0xf0,0xa9,0x13,0x15,0xe8,0x40,0x3d,0xf2, +0xf0,0x0, 0xb9,0x8f,0x1, 0x24,0xbe,0x1f,0x16,0xfd,0x3e,0x9e,0xe2,0x1, 0xc6,0xff, +0xf0,0x0, 0xba,0xaf,0xe2,0x0, 0xce,0x81,0xf0,0x0, 0xbb,0x3f,0x5, 0x9a,0xbc,0x4f, +0xbc,0xdf,0xf0,0x0, 0xbb,0xef,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x5, +0xf0,0x0, 0xba,0x7f,0xe0,0x7, 0xc7,0xb0,0x1, 0xe2,0xe8,0x0, 0xa7,0x1, 0xe0,0x1, +0xa7,0xee,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xee,0x8, 0xe1,0xbd,0x1f,0x0, 0xdd, +0xb8,0xcf,0xe2,0x0, 0xcf,0x4, 0xf0,0x0, 0xb8,0x5f,0xf0,0x0, 0xbb,0xef,0x1, 0xe4, +0xe0,0x3, 0x1f,0x57,0xbf,0x7f,0x0, 0xea,0x8, 0xb2,0xe0,0x2, 0x19,0x3d,0x8f,0x82, +0x27,0x8d,0xe0,0x0, 0x14,0xda,0x14,0x11,0xe0,0x5, 0xdb,0x3a,0xe0,0x0, 0x14,0xda, +0x14,0x29,0xe0,0x5, 0xdb,0x35,0x17,0x80,0xaf,0x82,0x9, 0x61,0xe0,0x2, 0x1f,0xec, +0x17,0x0, 0xb7,0xf, 0xe0,0x2, 0x1f,0x99,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x19, +0x87,0x8e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xcf,0xc8,0x5, 0x82,0x17,0xc8, +0xaf,0x8e,0x38,0x82,0xe0,0x0, 0x1f,0xcd,0x14,0x1, 0x8f,0x8f,0x2f,0x89,0xe0,0x2, +0x1f,0x99,0x8c,0xf, 0xe0,0x3, 0x1f,0x92,0x8f,0x8f,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0x8, 0xb1,0x3c,0x98,0x34,0xa4,0xe1,0x77,0x14,0x0, 0xe0,0x6, 0xd1,0x49,0xe3,0xff, +0xc4,0x7f,0x8, 0xe1,0xea,0x0, 0xcc,0x2, 0xe0,0x48,0xcc,0x0, 0x14,0x80,0xea,0x0, +0xcd,0x3, 0xe0,0x22,0xcd,0x7c,0x3d,0x28,0xe0,0x6, 0xd1,0xd6,0xea,0x0, 0xcc,0x0, +0xe0,0x0, 0xcc,0x0, 0x24,0x2, 0x3c,0x1, 0x14,0x0, 0x14,0x80,0xef,0xfe,0xd4,0x70, +0x3a,0x80,0x0, 0x0, 0x3a,0x80,0xe0,0x3, 0x1f,0xc3,0xe0,0x1, 0x17,0x7d,0x8f,0x8f, +0x3f,0x58,0xe2,0x0, 0xcf,0x80,0x3c,0x6f,0x17,0x80,0xe1,0x2f,0x3f,0xf, 0xe0,0x68, +0x39,0xaf,0x38,0x82,0x8, 0xb3,0xe0,0x3, 0x19,0xb0,0x11,0x0, 0x8c,0x33,0x3c,0xe2, +0xc1,0x1, 0xef,0xfe,0xd6,0x58,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, 0xc9,0x3, 0xc1,0x85, +0x1, 0xf6,0x14,0x81,0x3c,0x62,0xef,0xfe,0xd6,0x4e,0x14,0x81,0x14,0x4, 0xef,0xfe, +0xd6,0x4a,0xe0,0x2, 0x1f,0xc8,0x8c,0x8f,0x24,0x82,0x14,0x81,0x14,0x0, 0x9, 0xa1, +0xe7,0xcc,0x0, 0xc1,0x8, 0xb1,0xdf,0xa, 0xef,0xfe,0xd5,0xaf,0x8, 0xa1,0x0, 0xdb, +0x8, 0xb2,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x19,0x4d,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, +0xc7,0x81,0x2f,0x95,0xe0,0x2, 0x1f,0x48,0xaf,0x82,0x3c,0xef,0xaf,0x8e,0x3c,0x6f, +0xe0,0x1, 0x1f,0x4c,0xaf,0x8e,0xe0,0x3, 0x1f,0x2, 0xaf,0x8e,0xef,0xfe,0xd6,0x23, +0xef,0xfe,0xd8,0xc4,0x8c,0x2, 0x9, 0x21,0xe7,0xd7,0x0, 0xf2,0x17,0x81,0xe0,0x2, +0x1f,0x48,0xe0,0x2, 0x1c,0x68,0xaf,0x82,0xaf,0x8e,0xe0,0x2, 0xd6,0x8f,0xe0,0x1, +0x1f,0xcc,0xe0,0x3, 0x1f,0x1e,0xac,0xf, 0x87,0x8f,0xaf,0x8e,0xe0,0x2, 0xd5,0x3b, +0x14,0x81,0x14,0x0, 0xef,0xfe,0xd6,0x7, 0x0, 0xe4,0x8, 0xb3,0x14,0x0, 0xde,0x3, +0xe0,0x2, 0x1f,0x92,0x14,0x1, 0x91,0x8f,0x99,0xf, 0x39,0xd8,0x31,0x58,0x39,0x58, +0xdd,0xfa,0xe0,0x8, 0x39,0xc2,0x9, 0xe1,0x8, 0xb2,0xe0,0x2, 0xd6,0xac,0xdf,0x2d, +0x14,0x0, 0xdd,0xf1,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0x8b,0x97,0x8e,0xe0,0x2, 0x1e,0x94,0xe3,0xff,0xc7,0xfd,0xb7,0x8e,0x97,0xcd, +0xe3,0xff,0xc7,0xf7,0xb7,0xcd,0x97,0x8e,0xe0,0x2, 0x19,0x77,0xe2,0x0, 0xc7,0x81, +0x2f,0x97,0x14,0x1, 0xdd,0xd8,0xe0,0x2, 0x1f,0x48,0x8f,0x82,0x8e,0x8e,0x37,0xdd, +0xe2,0x0, 0xc7,0x81,0x2f,0x89,0xe0,0x2, 0x1f,0xfb,0x8f,0x8f,0x8f,0xe, 0x37,0xde, +0xe2,0x0, 0xc7,0x81,0x27,0x84,0x9, 0x21,0xe7,0xed,0x0, 0x8c,0x9, 0x61,0x97,0x8e, +0xe0,0x2, 0x1e,0x94,0xe3,0xff,0xc7,0xfe,0xb7,0x8e,0x97,0xcd,0xe3,0xff,0xc7,0xfb, +0xb7,0xcd,0xdf,0x7f,0xef,0xfd,0xdd,0xa6,0x14,0x1, 0xe0,0x1, 0xd8,0x9b,0xe0,0x2, +0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xaf,0x82,0x0, 0xd5,0xe0,0x1, 0x1f,0xe8,0xe0,0x3, +0x1f,0x4, 0x8f,0x8f,0xe0,0x1, 0x8e,0xce,0xe2,0x0, 0xcf,0x85,0x2, 0x8c,0x26,0x9c, +0xe0,0x2, 0x1e,0x21,0xe0,0x1, 0x8d,0x9e,0x3f,0x9c,0x8e,0xf, 0x3d,0xfc,0x5, 0xb6, +0xc6,0x1, 0xae,0xf, 0xe2,0x0, 0xce,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0xb4,0x16,0x80, +0xae,0x8f,0xe0,0x1, 0x8f,0xee,0xe2,0x0, 0xcf,0x81,0xeb,0xe5,0x7f,0xeb,0x1, 0x9, +0x17,0x1, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x21,0x3f,0x9c,0xae,0x8f,0x0, 0xee, +0x8e,0x8f,0xe0,0x1, 0x8e,0xe, 0x3e,0x7d,0x5, 0xf4,0xc6,0x81,0x16,0x0, 0xe0,0x1, +0xae,0x6e,0xae,0x8f,0x38,0x82,0xe0,0x2, 0x1e,0x34,0xe0,0x1, 0x8e,0x9e,0x8f,0x8c, +0x15,0x80,0x3e,0xff,0xe0,0x1, 0xad,0xee,0x5, 0x8c,0x16,0x81,0x3e,0x9f,0xeb,0xe5, +0x7f,0xeb,0xe0,0x1, 0xad,0xce,0xae,0x8c,0x0, 0xdc,0x16,0x80,0xae,0x8f,0x0, 0xd2, +0xeb,0xe5,0x7f,0xeb,0xad,0x8c,0x0, 0xd5,0x8, 0xb5,0xe0,0x3, 0x19,0x4, 0x17,0x1, +0x9f,0xd2,0xe0,0x1, 0xaf,0x62,0xe0,0x43,0x3f,0x1f,0xe2,0x0, 0xcf,0x0, 0xe0,0x1, +0x4, 0x4a,0xe0,0x2, 0x1f,0x5d,0x8f,0xe, 0x27,0x4, 0x17,0x0, 0xe0,0x1, 0xaf,0x62, +0xe2,0x0, 0xc7,0xa0,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0x19,0xe9, +0x8f,0x83,0x2f,0x83,0xe0,0x1, 0xaf,0xe2,0xe0,0x2, 0x1a,0x48,0xe0,0x2, 0x1a,0xc0, +0x8c,0x4, 0xde,0xca,0x24,0x7, 0xe0,0x4, 0x8f,0xd5,0xe2,0x0, 0xcf,0x81,0xe0,0x1, +0x1, 0x1e,0x9f,0x52,0x17,0x80,0xe0,0x80,0x16,0x80,0xe0,0x1, 0xaf,0xc2,0x3e,0xde, +0xe0,0x1, 0xaf,0xd2,0x26,0x84,0x17,0x81,0xe0,0x1, 0xaf,0xc2,0xe0,0x4, 0x17,0x80, +0x3f,0xde,0x2f,0x83,0xe0,0x1, 0xaf,0xc2,0xe0,0x1, 0x1f,0xc7,0x9f,0x8f,0xe2,0x4, +0xcf,0xd8,0xe0,0x2, 0x1f,0xfe,0xe0,0x0, 0x5, 0xe5,0x16,0x8f,0xae,0x8f,0x8e,0x84, +0xe2,0x0, 0xce,0x81,0xe0,0x0, 0x1, 0x68,0x16,0x80,0xae,0x8f,0x17,0xa0,0x3f,0xde, +0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xc2,0x8f,0x83,0x2f,0x83,0xe0,0x1, 0xaf,0xc2, +0xe0,0x1, 0x17,0x80,0x3f,0xde,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xc2,0x11,0x84, +0xe0,0x1, 0x1f,0xd7,0x96,0xbf,0xe0,0x0, 0x1f,0x8d,0xe0,0x1b,0x96,0x1f,0xe0,0xf, +0x36,0xa1,0x3e,0x7f,0x4, 0x5, 0x3e,0x7d,0x11,0x83,0xe0,0x0, 0x3, 0x4e,0xe2,0x2, +0xc7,0x0, 0xe2,0x0, 0xcf,0x0, 0x17,0x84,0xe0,0x6f,0x39,0x23,0x39,0xef,0xe0,0x1, +0xda,0x3d,0xe0,0x1, 0x1f,0x91,0xe2,0x0, 0xcc,0x0, 0x8f,0xf, 0xe0,0x1, 0x1f,0x90, +0x37,0x28,0x8f,0x8f,0x16,0x81,0xe0,0x6d,0x39,0x23,0x3f,0xce,0xe0,0x1, 0x1f,0xf, +0x3f,0xbd,0xe0,0x0, 0x1e,0x8e,0x8f,0xe, 0xe0,0x43,0x3f,0x9f,0x8e,0x8d,0xb7,0xb2, +0xe0,0x1, 0xaf,0x2, 0x26,0x8a,0x96,0xd2,0xe2,0x0, 0xce,0x80,0x4, 0x6, 0xe2,0x0, +0xcf,0x81,0x5, 0x3d,0x37,0x81,0xb7,0xb2,0xe0,0x4, 0x8f,0xd5,0xe2,0x0, 0xcf,0x81, +0x1, 0x85,0x97,0xb2,0xe4,0x0, 0xc7,0x85,0xb7,0xb2,0xa, 0xa1,0xe7,0xfe,0x0, 0x87, +0x8e,0x8f,0xe7,0xff,0x26,0x9e,0xc6,0xff,0xae,0x8f,0x8e,0x84,0xe2,0x0, 0xce,0x81, +0xe7,0xff,0x1, 0x9c,0x16,0xa0,0x3e,0xde,0xe7,0xff,0x2e,0x9d,0x8f,0x8f,0xe7,0xff, +0x2f,0x9a,0xe7,0xff,0x0, 0x9b,0xe4,0xf, 0x36,0xcf,0x3f,0x9d,0x37,0x81,0xe0,0x2f, +0x3f,0x9c,0x11,0x81,0x39,0x9f,0xe7,0xff,0x0, 0xac,0xe0,0x3, 0x1f,0xc6,0x8f,0x8f, +0xe2,0x0, 0xcf,0xb8,0xe7,0xfe,0x2, 0xdf,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe7,0xfe, +0x0, 0xda,0x17,0x0, 0xe0,0x1, 0xaf,0x62,0xe7,0xfe,0x0, 0xb5,0x37,0x21,0xe0,0x1, +0xaf,0x2, 0x0, 0xc3,0xe0,0x2, 0x1e,0xa1,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xaf,0x1f, +0xc7,0x81,0xaf,0x1d,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xaf,0xf, 0x38,0x82,0x8, 0xb2,0xc0,0x7c,0xe0,0x1, 0xd1,0x1a,0xdf,0xe, 0xdd,0xcb, +0xe0,0x2, 0x1f,0x8f,0x2c,0x10,0x8f,0xf, 0xe0,0x3, 0x19,0x4, 0xe2,0x0, 0xcf,0x1, +0xe0,0x1, 0xac,0x42,0x1, 0x25,0xdd,0xbf,0x24,0x11,0xe0,0x1, 0x8f,0xe2,0x2f,0x9b, +0xc0,0x4, 0x9, 0x61,0x8f,0xf, 0xe0,0x3, 0x19,0x4, 0xe2,0x0, 0xcf,0x1, 0x1, 0x18, +0xe0,0x1, 0x8f,0xc2,0x2f,0x9a,0xdd,0xaf,0x2c,0x71,0x7c,0x1, 0xef,0xfc,0xd2,0x25, +0xe0,0x0, 0x1f,0x8e,0x64,0x1, 0xac,0xf, 0xe0,0x0, 0x1f,0x8c,0xac,0xf, 0xe0,0x1, +0x8f,0xe2,0x27,0xe7,0x14,0x0, 0xc0,0x4, 0x9, 0x21,0xe7,0x81,0x0, 0xa3,0x17,0x1, +0x16,0x0, 0xe0,0x1, 0xaf,0x42,0xae,0xf, 0x17,0x80,0xe0,0x2, 0x1e,0xa1,0xe0,0x2, +0x1f,0x20,0xaf,0x8d,0x16,0x7, 0xaf,0x9d,0xe0,0x2, 0x1e,0xf7,0xaf,0x8e,0xae,0xd, +0xe0,0x2, 0x1f,0x1f,0xe0,0x2, 0x1e,0xb4,0xaf,0x8e,0xaf,0x8d,0x0, 0xc5,0x0, 0x0, +0xe0,0x0, 0x1f,0x85,0x8f,0xf, 0xe0,0x0, 0x1f,0x8d,0xe0,0x0, 0x27,0x60,0xe0,0x0, +0x1f,0xe, 0x8e,0xe, 0xe2,0x0, 0xce,0x2, 0x1, 0x8, 0x17,0xa, 0x3f,0x38,0x3f,0x9e, +0xf0,0x10,0x8b,0xaf,0x5, 0xb4,0x38,0x82,0x8e,0xbf,0xf0,0x0, 0x8b,0x9f,0xf0,0x0, +0x8b,0xf, 0xf0,0xe, 0x3b,0xad,0x8d,0xaf,0xe2,0x0, 0xcf,0x0, 0xe8,0x17,0x3e,0xa7, +0xf2,0x1, 0xc3,0xff,0xf0,0xd, 0x3b,0x2b,0xe2,0x1, 0xc7,0x7f,0xe8,0x6e,0x3d,0x27, +0xe8,0xb, 0x3d,0xa6,0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc5,0xff,0xe2,0x1, 0xc6,0xff, +0xe0,0x6d,0x3d,0x2b,0xf0,0x40,0x3b,0xee,0x3d,0xed,0xf2,0x1, 0xc3,0xff,0xe2,0x1, +0xc5,0xff,0xf0,0x40,0x3b,0xfb,0x3, 0x82,0x3f,0x6d,0x15,0x8a,0x3d,0xb8,0x3e,0xee, +0xe0,0xf, 0x3f,0x9b,0xf0,0x10,0x8b,0xaf,0xe2,0x1, 0xc6,0xff,0xf2,0x0, 0xcb,0x94, +0x2, 0x99,0xf2,0x0, 0xcb,0x8a,0x2, 0xad,0xea,0x12,0x7f,0x4, 0xe0,0xf, 0x3f,0x18, +0x8d,0x89,0xf0,0x0, 0x8b,0xf, 0xe8,0x40,0x3d,0xf6,0x3, 0x86,0xf0,0x0, 0xab,0x9, +0x8f,0x8f,0xaf,0x8a,0x8d,0x89,0xe2,0x0, 0xce,0x2, 0x1, 0x1f,0x3f,0x18,0xad,0x8e, +0x38,0x82,0x17,0x85,0xaf,0x89,0xaf,0x8a,0x0, 0xe8,0xea,0x12,0x7e,0x84,0x3f,0xed, +0xe1,0x80,0xbf,0x1f,0xc7,0x84,0xbf,0x1d,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f, +0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xb7,0xf, 0x38,0x82, +0x17,0x84,0xaf,0x89,0xaf,0x8a,0x0, 0xd1,0xe0,0xf, 0x36,0xc1,0xe2,0x1, 0xc7,0xff, +0x3f,0xfb,0x3, 0x8d,0xf2,0x0, 0xcb,0x95,0x16,0x83,0xe0,0x6d,0x3c,0xac,0x3e,0xff, +0xe0,0x6f,0x3b,0xad,0x3d,0xef,0xe2,0x1, 0xc5,0xff,0xad,0x89,0xad,0x8a,0x8d,0x89, +0x0, 0xce,0x0, 0x0, 0x8, 0xb3,0x39,0x68,0xe0,0x1, 0x1c,0x67,0x39,0xe9,0xe0,0xc, +0x15,0x52,0x14,0x80,0xe0,0x5, 0xde,0xe0,0xe0,0x2, 0x1f,0xfd,0x16,0x7a,0x8c,0x5f, +0x3e,0x12,0xf0,0x2c,0x13,0x99,0xe0,0xe, 0x3e,0x38,0xf0,0x17,0x3b,0x93,0xf0,0x17, +0x3b,0x9e,0x8c,0xcf,0xe0,0x1, 0x1f,0xff,0xf0,0x17,0x33,0xa1,0xf0,0x0, 0x12,0x87, +0x15,0xd, 0xf0,0x1, 0x1b,0x4a,0xe0,0x14,0x34,0x21,0xf0,0x17,0x3b,0x9f,0xf0,0x15, +0x3a,0x92,0xe0,0xa, 0x3d,0x13,0x3f,0xe3,0xe8,0x40,0x3e,0xe7,0xe8,0x40,0x3f,0x66, +0xe2,0x0, 0xce,0x0, 0x4, 0xc, 0x3c,0xfc,0x15,0xfa,0x3d,0x9f,0x5, 0x8, 0xe2,0x0, +0xcd,0x80,0x4, 0x5, 0x3c,0x7b,0x5, 0x3, 0x95,0x8e,0xb5,0x8d,0xc7,0x81,0x3f,0xfa, +0xc7,0x2, 0xc6,0x82,0x1, 0xee,0xc6,0x1, 0xe8,0x40,0x3e,0x75,0xf0,0x0, 0xc3,0x1a, +0xf8,0x17,0x3b,0x94,0x1, 0xe1,0x9, 0xe1,0xe0,0x0, 0x1f,0xe, 0xf0,0x2, 0x1a,0x1c, +0x17,0x80,0xf0,0x0, 0x89,0x8e,0xe8,0x7, 0xaf,0xc4,0xe8,0xf, 0xaf,0x94,0xe8,0x16, +0xaf,0xe4,0xe8,0x1e,0xaf,0xb4,0xf0,0x1, 0x21,0xb9,0x8, 0xb7,0x11,0x0, 0xe4,0x8, +0x34,0x29,0xe4,0x9, 0x34,0xa9,0xf0,0x0, 0x1b,0xd, 0xe4,0x8, 0x34,0x48,0xe4,0x9, +0x34,0xc8,0xf0,0x40,0x39,0x62,0x3a,0x62,0xf0,0x40,0x38,0xe2,0x3a,0xe2,0xf0,0x40, +0x38,0x62,0x39,0xe2,0x38,0xe2,0x3e,0xe2,0x3d,0x7d,0xe0,0x1, 0x1, 0xd, 0xe8,0x0, +0x8f,0x6, 0xe8,0x0, 0x8f,0x96,0xe4,0xe, 0x37,0x29,0xe4,0xf, 0x37,0xa9,0xe4,0xe, +0x37,0x48,0xe4,0xf, 0x37,0xc8,0xe0,0xb, 0x3f,0x18,0xe0,0xc, 0x3f,0x99,0xe4,0xb, +0x35,0xa7,0xe4,0xc, 0x36,0x27,0xe1,0x37,0x3c,0x2e,0xe4,0xb, 0x35,0xc8,0xe4,0xc, +0x36,0x48,0xe1,0x35,0x3c,0xaf,0xf0,0x0, 0x23,0x94,0xf0,0x0, 0x22,0x92,0xe1,0x26, +0x3c,0x2b,0xe1,0x27,0x3c,0xac,0x3b,0x57,0x23,0xb, 0xe0,0x3, 0x30,0xa1,0xe8,0x3, +0x39,0x94,0xc0,0x81,0xad,0x83,0xe2,0x1, 0xc0,0xff,0xae,0x13,0x39,0xe6,0xe1,0x2e, +0x3f,0x28,0xf0,0x0, 0x22,0x9e,0x27,0x1c,0xe1,0x35,0x3d,0xa8,0xe1,0x26,0x3c,0xac, +0xf0,0x15,0x3a,0xd6,0xf0,0x0, 0x22,0x95,0x12,0xbc,0xe8,0x5, 0x3a,0x90,0x32,0xa1, +0xf0,0x6, 0x30,0x21,0xe8,0x5, 0x3a,0x94,0xad,0xa5,0xf0,0x0, 0xc0,0x1, 0xf0,0x5, +0x3a,0x16,0xe0,0xf, 0xae,0x35,0xf2,0x1, 0xc0,0x7f,0xe8,0x40,0x3a,0xe5,0xe1,0x2f, +0x3f,0xa9,0xf0,0x0, 0x23,0x9e,0x27,0x9c,0xe1,0x37,0x3c,0x2b,0xe1,0x26,0x3e,0x29, +0xf0,0x17,0x3b,0xd6,0xf0,0x0, 0x23,0x95,0x12,0x1e,0xe8,0x4, 0x3a,0x11,0x32,0x21, +0xf0,0x6, 0x30,0xa1,0xe8,0x4, 0x3a,0x14,0xad,0x94,0xf0,0x0, 0xc0,0x81,0xf0,0x4, +0x3a,0x16,0xe0,0x7, 0xae,0x64,0xf2,0x1, 0xc0,0xff,0xe8,0x40,0x3a,0x67,0x27,0x1b, +0x27,0x9a,0xe1,0x2f,0x3d,0xa8,0xe1,0x2e,0x3e,0x29,0x3f,0xde,0x27,0x94,0xe0,0x0, +0x17,0x5a,0xe8,0xe, 0x3f,0x12,0x37,0x21,0xf0,0x2, 0x31,0x21,0xe8,0xe, 0x3f,0x14, +0xad,0xbe,0xf0,0x0, 0xc1,0x1, 0xf0,0xe, 0x3a,0x12,0xe0,0x17,0xae,0xe, 0xf2,0x1, +0xc1,0x7f,0x39,0x6f,0xc6,0x81,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf3,0xf0,0x0, +0xc3,0x2, 0xe7,0xfe,0x1, 0xeb,0x29,0x8a,0x22,0x83,0xf8,0x16,0xa8,0x64,0x22,0x3, +0xf8,0xf, 0xa8,0x94,0x29,0x6, 0xb, 0xe1,0x38,0x82,0xe8,0x7, 0xa8,0xc4,0x0, 0xf5, +0xf8,0x1e,0xa9,0x34,0xb, 0xe1,0x2c,0x2a,0x3f,0xe9,0x24,0x95,0x3f,0xe8,0x17,0xd, +0x3f,0x38,0x3f,0x19,0xe0,0xd, 0x37,0x21,0x3e,0x9b,0xe0,0x40,0x96,0x9d,0x3f,0x1a, +0xe2,0x0, 0xce,0x80,0xe0,0x0, 0x5, 0x47,0x16,0x81,0xe0,0x40,0xae,0x9e,0xe2,0x0, +0xcc,0xb, 0x2, 0x90,0x17,0x1, 0x3f,0x1f,0xe4,0x0, 0xc7,0xd, 0x3f,0x19,0xe0,0xd, +0x37,0x21,0x3e,0x9b,0x96,0x8d,0x3f,0x1a,0xe2,0x0, 0xce,0x80,0x5, 0x2d,0x16,0x81, +0xae,0x8e,0xe2,0x0, 0xcc,0x8b,0x5, 0x96,0x38,0x82,0x17,0x7f,0x3f,0x18,0xe4,0x0, +0xc7,0xd, 0x3f,0xe8,0x3f,0x19,0xe0,0xd, 0x37,0x21,0x3e,0x9b,0x96,0x8d,0x3f,0x1a, +0xe2,0x0, 0xce,0x80,0x5, 0x1c,0x16,0x81,0xae,0x8e,0x2c,0xca,0xe2,0x0, 0xcc,0xb, +0x5, 0xda,0xe4,0x0, 0xc7,0x8d,0x3f,0x99,0xc7,0x81,0xe0,0xe, 0x37,0xa1,0x3d,0x9e, +0x97,0xb, 0x3f,0x9a,0xe2,0x0, 0xcf,0x0, 0x5, 0x4, 0x17,0x1, 0xaf,0xf, 0x38,0x82, +0x17,0x2, 0xaf,0xf, 0x38,0x82,0x16,0x82,0xae,0x8e,0x0, 0xd4,0x16,0x82,0xae,0x8e, +0x0, 0xe5,0x16,0x82,0xe0,0x40,0xae,0x9e,0xe7,0xff,0x0, 0xbb,0x8, 0xb7,0xe1,0xfc, +0xc0,0x0, 0xe0,0x2, 0x1f,0xdd,0x17,0x1, 0x8f,0x8f,0xe0,0x2f,0x3f,0x8e,0xe0,0x1, +0x27,0x83,0x17,0x94,0xe1,0x28,0x3c,0x1f,0xe0,0x0, 0x24,0x7e,0xe0,0x1, 0x1f,0xca, +0x16,0x0, 0xe0,0xa, 0x97,0xcf,0xe2,0x7, 0xcf,0xe8,0xe0,0x0, 0x5, 0x79,0xe0,0x1, +0x1a,0x49,0x11,0x0, 0xe0,0x1, 0x1d,0xc8,0x39,0xe4,0x3c,0xe2,0x17,0xe6,0x3f,0x93, +0xe0,0x80,0x97,0x1f,0x16,0x81,0x3e,0x7e,0x3e,0x99,0x3, 0x5, 0x3c,0xed,0x39,0x1e, +0xe3,0xff,0xc4,0xff,0x3f,0xf3,0x1, 0xf5,0xc1,0x9a,0x39,0xfb,0x1, 0xf0,0x24,0x85, +0x3c,0x62,0xe0,0x5, 0xdc,0xe8,0x39,0x68,0xe0,0x2, 0x15,0x52,0x14,0x80,0xe2,0x1, +0x7c,0x30,0xe0,0x5, 0xdd,0x39,0xe2,0x1, 0x7d,0xb0,0x15,0x0, 0x17,0x66,0x3f,0x14, +0x3e,0x6b,0x0, 0x85,0xb7,0x8c,0x3f,0x74,0xc6,0x2, 0x1, 0x11,0xe0,0x80,0x96,0x9e, +0xe2,0x0, 0xce,0x80,0xe0,0xf, 0x3e,0xa2,0xe0,0x43,0x3f,0x9f,0x5, 0x75,0xe2,0x0, +0xcf,0x80,0x3, 0x71,0x3f,0x74,0xb5,0xc, 0xc6,0x2, 0x1, 0xf1,0x12,0x1a,0x3a,0x1e, +0x3a,0x73,0xc5,0x9a,0x1, 0xe4,0x13,0x4, 0x3b,0x10,0x14,0x80,0xe0,0x1, 0x15,0x29, +0x3c,0x66,0xe0,0x5, 0xdd,0x11,0x17,0x81,0x14,0x86,0xe0,0x0, 0x12,0xd7,0xe0,0xa, +0xaf,0xc6,0x3a,0x90,0x17,0x81,0x3b,0xe9,0x3a,0x69,0xe7,0xff,0x11,0xb3,0xe2,0x1, +0xc2,0x7f,0x39,0x95,0x39,0x67,0x0, 0x83,0xe0,0x9, 0x8f,0xe3,0xe2,0x0, 0xcf,0x81, +0xc1,0xf3,0x1, 0x19,0xc1,0x7f,0xe0,0x43,0x39,0x2, 0xe3,0xff,0xc9,0x7f,0x1, 0xf5, +0x14,0xff,0x3c,0x94,0xe0,0x43,0x3c,0x89,0xe3,0xff,0xcc,0xff,0x1, 0x15,0xe1,0xc0, +0x8f,0x95,0x0, 0xe3,0xe0,0x1, 0x1f,0xca,0xe0,0xa, 0x97,0xcf,0xe0,0xc, 0x37,0x82, +0xe7,0xff,0x0, 0x87,0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0x3d,0x66, +0x3c,0xe4,0xdf,0xa, 0x0, 0xe0,0x12,0x8a,0x3a,0x90,0x14,0x86,0x13,0x7, 0x3a,0x69, +0xe2,0x1, 0xc2,0x7f,0x39,0x65,0x39,0xe6,0xe0,0xb, 0x8f,0xb2,0xc1,0xd, 0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x1, 0xa, 0x17,0x81,0x3f,0x93,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xe0,0x43,0x39,0x8f,0x1, 0xf1,0x14,0xff,0x3c,0x94,0xe0,0x43,0x3c,0x89, +0xe3,0xff,0xcc,0xff,0xc2,0xff,0x1, 0xe4,0x12,0x8b,0x3a,0x90,0x3b,0x65,0x12,0x7, +0xe0,0x0, 0x13,0x86,0xe2,0x1, 0xc2,0x7f,0x39,0xe6,0x39,0x67,0xe0,0x9, 0x8f,0xe3, +0xc1,0xf3,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x5d,0xc1,0x7f,0xe0,0x43,0x39,0x2, +0xe3,0xff,0xc9,0x7f,0x1, 0xf4,0x17,0x81,0x3f,0x94,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xc3,0x1, 0xe0,0x43,0x3a,0xf, 0x1, 0xe6,0x12,0x7, 0xe0,0x40,0x3b,0x64, +0xe2,0x1, 0xc2,0x7f,0x39,0x65,0x39,0xe6,0xe0,0xb, 0x8f,0xb2,0xc1,0xd, 0xe2,0x0, +0xcf,0x81,0xe0,0x1, 0x1, 0x55,0x17,0x81,0x3f,0x93,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xe0,0x43,0x39,0x8f,0x1, 0xf1,0x17,0x81,0x3f,0x94,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x8d,0xc2,0x81,0xe0,0x43,0x3a,0xf, 0x1, 0xe3,0x15,0x0, 0x14,0x11, +0x3c,0x10,0x39,0x6a,0x14,0x82,0x12,0x82,0x12,0x1, 0x39,0xea,0x17,0x72,0x3f,0x18, +0x3e,0xe8,0x3d,0xe2,0x8e,0x1e,0xe0,0x0, 0x2e,0x56,0xe0,0x1, 0x25,0x47,0xe0,0x43, +0x8f,0xad,0xe2,0x0, 0xcf,0x82,0xe0,0x0, 0x1, 0x6a,0xe0,0x0, 0x25,0xda,0x8f,0x8e, +0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x0, 0xe2,0x0, 0xcd,0xc, 0xe0,0x1, 0x1, 0x5d, +0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x46,0xe2,0x0, 0xcd,0x8c,0xe0,0x1, +0x1, 0xd8,0x17,0x81,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8d,0xc4,0xd, +0xe0,0x43,0x3d,0xf, 0x1, 0xd4,0x16,0x10,0xe0,0x1, 0x15,0x39,0xe0,0x1, 0x1d,0xca, +0x3e,0x10,0x3d,0x10,0x17,0xf3,0x3f,0x9c,0xe0,0x40,0x3f,0x6b,0xe0,0x80,0x8e,0x9f, +0x2e,0x82,0xb6,0x8e,0x3f,0xfc,0xc7,0x2, 0x1, 0xfa,0x16,0xd, 0x3e,0x1f,0x3d,0x7c, +0xc5,0x9a,0x1, 0xf1,0xe0,0x4, 0xc0,0x0, 0xb, 0xe1,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, +0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x0, 0x1, 0x41,0x8f,0xae,0xe2,0x0, 0xcf,0x82, +0x1, 0x89,0x16,0x1, 0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0xe2,0x0, 0xce,0x1, 0x5, 0x82, +0xac,0x9e,0x17,0x81,0x3f,0x9b,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8d,0xc6,0x81, +0xc7,0x1, 0xe0,0x43,0x3d,0x8f,0xe7,0xff,0x1, 0x9f,0xe7,0xff,0x0, 0xbc,0xe2,0x0, +0xcd,0xc, 0xe0,0x0, 0x1, 0x5c,0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0x8f,0xae,0x1, 0x5f, +0xe2,0x0, 0xcf,0x82,0x1, 0xe7,0x3e,0x6b,0x0, 0xde,0x25,0xd0,0x8f,0x8e,0xe2,0x0, +0xcf,0x82,0x1, 0x8, 0xe2,0x0, 0xcd,0xc, 0x1, 0x99,0xe2,0x0, 0xcd,0x8c,0x1, 0xce, +0x0, 0xd9,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x0, +0x1, 0x6a,0xe2,0x0, 0xcd,0x8c,0x1, 0x4d,0x8e,0x2e,0xe2,0x0, 0xce,0x2, 0x1, 0x43, +0xac,0x9e,0x0, 0xc8,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82, +0xe0,0x0, 0x1, 0x57,0xe2,0x0, 0xcd,0x8c,0xe7,0xff,0x1, 0xb1,0xe7,0xff,0x0, 0x83, +0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0xe2,0x0, 0x7d,0x4, 0x3c,0xe4, +0xdd,0xf3,0xe7,0xfe,0x0, 0x9c,0x3c,0x63,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0, +0xe2,0x0, 0x7d,0x4, 0x3c,0xe4,0xdd,0xe8,0xe7,0xfd,0x0, 0xef,0x3c,0x63,0xe2,0x1, +0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0xe2,0x0, 0x7d,0x4, 0x3c,0xe4,0xdd,0xdd,0xe7,0xfe, +0x0, 0xa4,0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0x1, 0x1d,0x8f,0xae,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x1, 0x91,0xe7,0xff,0x0, 0xa9,0x25,0xf5,0x8f,0x8e,0xe2,0x0, 0xcf,0x82, +0x8f,0x8d,0x1, 0x45,0xe2,0x0, 0xcf,0x82,0x1, 0xd, 0xe2,0x0, 0xcd,0x8c,0xe7,0xfe, +0x1, 0x4a,0x8f,0xae,0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xfd,0x3e,0x6a,0xe7,0xfe, +0x0, 0xf3,0x3e,0x63,0xe2,0x0, 0xcd,0x8c,0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0x1, 0x17, +0x8f,0xae,0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xea,0xe7,0xfe,0x0, 0xe5,0x3e,0x64, +0x0, 0xf2,0x3e,0x65,0x0, 0xf0,0xe2,0x0, 0xcd,0x8c,0xe7,0xfe,0x1, 0x64,0x8f,0xae, +0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xdf,0xe7,0xfe,0x0, 0xd6,0xe2,0x0, 0xce,0x1, +0xe7,0xfe,0x2, 0xd8,0xe7,0xfe,0x0, 0x9f,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x64, +0xe0,0x2, 0x1e,0xfd,0x39,0x68,0x8e,0xdd,0xf0,0x40,0x3d,0x69,0x3f,0xed,0x7e,0x86, +0x3f,0xb8,0xe0,0x1, 0x1e,0xf2,0x3f,0x99,0xa7,0xd, 0x37,0xa1,0x3f,0x9e,0x94,0xf, +0x14,0x8a,0x7d,0x1, 0xe0,0x5, 0xda,0xb4,0xe0,0x2, 0x1f,0x7d,0x65,0x1, 0x8f,0x4e, +0xe0,0x43,0x39,0x98,0xe8,0x40,0x3c,0xea,0x3c,0x62,0x7f,0x3, 0xdc,0xa6,0xe8,0x43, +0x3f,0x8a,0xe2,0x0, 0xcf,0x80,0x7f,0x85,0xe0,0x5, 0x4, 0x7b,0xe0,0x2, 0x1e,0xdd, +0x17,0x0, 0x7e,0x84,0xf7,0xff,0x14,0x7a,0x7f,0x2, 0xf0,0x0, 0x16,0x86,0xe0,0x1, +0x1f,0xf2,0xe0,0x2, 0x1d,0x9c,0xe0,0x2, 0x1e,0xfd,0x67,0x4, 0x63,0x82,0xa2,0x8f, +0x8a,0x5d,0xe0,0x43,0x3f,0x82,0xe0,0x7, 0x8c,0xcb,0xf0,0x0, 0x8d,0x8e,0x60,0x85, +0x7f,0x87,0x3b,0x67,0x66,0x87,0xe2,0x0, 0xce,0x80,0xe0,0x1, 0x4, 0xc, 0x67,0x2, +0xf0,0x0, 0x11,0x80,0xf0,0x43,0x3c,0x8e,0xe8,0x14,0x38,0xaa,0xf8,0x3c,0x3c,0x19, +0xf8,0x3e,0x3c,0x9d,0xe0,0x8, 0x30,0xa1,0xf0,0x40,0x39,0x62,0xf8,0x40,0x38,0x63, +0xf8,0x43,0x3b,0x14,0xf0,0x0, 0xc4,0x86,0xe8,0x43,0x3d,0x2, 0xe0,0xf, 0x3d,0x34, +0x3f,0x91,0x37,0xa1,0x3f,0x95,0xf0,0x0, 0x90,0x8f,0x24,0xaa,0xe0,0x15,0x3d,0x22, +0x3e,0xe7,0x35,0x21,0x3f,0xe6,0xf8,0x43,0x3b,0x95,0x0, 0x8e,0xf2,0x0, 0xca,0x1, +0x2, 0x1d,0xf2,0x0, 0xcb,0x80,0xe0,0x0, 0x5, 0x4a,0xf2,0x0, 0xca,0x81,0x2, 0x16, +0x3c,0xff,0x3e,0xef,0x5, 0x15,0xe0,0xe, 0x36,0xa1,0x3f,0x1b,0x8e,0xe, 0xc7,0x81, +0x3e,0x7a,0xe0,0x43,0x3f,0x8f,0x4, 0x75,0x8f,0x1e,0x3c,0x7e,0x2, 0x72,0xf2,0x0, +0xcb,0x0, 0x2, 0x65,0xf3,0xff,0xcb,0x7f,0x3, 0x65,0x3c,0xfd,0x2, 0x35,0xe8,0x40, +0x39,0xf1,0xe0,0x0, 0x2, 0x51,0xe8,0x43,0x3f,0x83,0xf0,0x2e,0x3c,0x1f,0x2f,0x13, +0xf0,0x0, 0x2e,0x12,0xe8,0x2e,0x3f,0x9d,0x2f,0xe, 0xf0,0x0, 0x2f,0xd, 0xc7,0x86, +0xe4,0x0, 0xc7,0x8d,0xe0,0x1, 0x1e,0xca,0xe8,0xf, 0x3f,0x99,0x37,0xa1,0x3f,0x9d, +0xf0,0x0, 0xb0,0x8f,0xf0,0x0, 0xc0,0x1, 0xf3,0xff,0xc0,0x7f,0x17,0xff,0xe8,0xf, +0x3f,0x92,0xf1,0xff,0xc1,0xff,0xe2,0x1, 0xc7,0xff,0xf2,0x1, 0xc1,0xff,0xf0,0x0, +0x21,0xc, 0xf0,0x40,0x39,0x6f,0xe7,0xff,0x0, 0xa1,0xf3,0xff,0xcb,0xff,0xe7,0xff, +0x3, 0x39,0x3c,0xfd,0x5, 0x4d,0xf0,0x0, 0x20,0xe, 0x67,0x82,0xc0,0xff,0xc7,0xff, +0xe0,0x43,0x38,0x81,0xe2,0x1, 0xc7,0xff,0xe3,0xff,0xc8,0xff,0x7f,0x82,0xe7,0xfe, +0x1, 0xf3,0xf0,0x0, 0x61,0x83,0xf1,0xff,0xc1,0xff,0xe8,0x40,0x39,0x73,0x4, 0xf, +0x67,0x86,0xc7,0xff,0xe8,0x40,0x3f,0xfa,0xe0,0x1, 0x2, 0x3b,0xc0,0x1c,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xf2,0x0, 0xcd,0x81,0x5, 0xca,0x0, 0xde,0x66,0x84,0xe0,0x1, +0x1f,0x72,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, 0x15,0x81,0x8e,0x8d,0xf0,0x0, 0x13,0x0, +0xf0,0x1b,0x3d,0x92,0xf0,0x0, 0xa0,0x8e,0xf0,0x0, 0x8c,0xdf,0xe0,0x16,0x8d,0x6b, +0xf0,0x0, 0x62,0x85,0x7e,0x82,0xf2,0x1, 0xc5,0xff,0xf8,0x40,0x3e,0x66,0xf7,0xff, +0x16,0xfa,0xf0,0x0, 0x17,0x6, 0xf8,0x40,0x38,0x66,0x67,0x3, 0xe8,0x40,0x3f,0x7b, +0x5, 0xd0,0xe8,0x43,0x3f,0x86,0xe8,0x2d,0x3f,0x9e,0xf8,0x6, 0x3a,0xaa,0xf0,0x38, +0x3e,0x9f,0xc7,0x86,0xf0,0x8, 0x32,0xa1,0xe8,0x40,0x3b,0xeb,0xf0,0x0, 0x13,0x81, +0xf0,0x0, 0x12,0x0, 0xe0,0x43,0x38,0x96,0x7e,0x84,0x7f,0x85,0xe8,0xf, 0x3b,0xb9, +0xe8,0xf, 0x3f,0x95,0x37,0xa1,0xe8,0xf, 0x3f,0x91,0xf0,0x0, 0x91,0xf, 0x25,0x32, +0xe0,0x5, 0x3b,0xa2,0xe0,0x9, 0x33,0xa1,0xe8,0x40,0x3e,0x6c,0xe8,0x40,0x3f,0xe0, +0xe0,0x43,0x3a,0x15,0x0, 0x8e,0xe2,0x0, 0xcb,0x1, 0x2, 0x22,0xe2,0x0, 0xca,0x0, +0xe0,0x2, 0x5, 0xa, 0xe2,0x0, 0xca,0x81,0x2, 0x1b,0x3f,0xfa,0x3e,0x6f,0x3, 0x1a, +0x17,0x3c,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x2e,0xe0,0xd, 0x36,0x21,0x3f,0x79, +0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x2, 0x71,0xe0,0xf, 0x8f,0x3d,0x3c,0x7e, +0x2, 0x6d,0xe2,0x0, 0xc8,0x80,0x2, 0x60,0xe3,0xff,0xc8,0xff,0x3, 0x60,0x3e,0x7a, +0x4, 0x2b,0xe8,0x40,0x39,0xf2,0xe0,0x1, 0x2, 0x6d,0xe8,0x43,0x3f,0x87,0xf0,0x2e, +0x3e,0x9f,0x2f,0x13,0xf0,0x0, 0x2c,0x12,0xe8,0x2e,0x3f,0x9e,0x2f,0xe, 0x67,0x4, +0x2f,0xc, 0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0x66,0x85,0xe0,0x1, 0x1f,0x4a,0x3f,0x9d, +0x37,0xa1,0x3f,0x9e,0xf0,0x0, 0xb1,0xf, 0xf0,0x0, 0xc2,0x1, 0xf3,0xff,0xc2,0x7f, +0xc3,0x81,0x66,0x83,0xe2,0x1, 0xc3,0xff,0x3e,0xf7,0xf0,0x0, 0xc3,0x81,0xf2,0x1, +0xc3,0xff,0xe7,0xff,0x2, 0x9d,0xf7,0xfe,0x22,0x55,0xf1,0xff,0xc2,0xff,0xf8,0x43, +0x3a,0x85,0xf3,0xff,0xca,0xff,0xf1,0xff,0xc3,0x7f,0xf2,0x1, 0xc3,0x7f,0xe7,0xfe, +0x1, 0xf6,0x67,0x86,0xc7,0xff,0xe8,0x40,0x3f,0xfa,0xe7,0xfe,0x5, 0x49,0x13,0x81, +0xe8,0x7, 0x3b,0x9a,0x67,0x6, 0xe2,0x1, 0xc3,0xff,0x3f,0x77,0xe7,0xfe,0x5, 0xc0, +0xe0,0x2, 0x1f,0xdd,0xe0,0x1, 0x1e,0xf2,0xe0,0x2, 0x1d,0x9c,0xe0,0x2, 0x1f,0x7d, +0x7f,0x84,0xf0,0x40,0x3b,0x67,0x8f,0x8f,0xf0,0x0, 0xa6,0xd, 0xf0,0x0, 0x8e,0xde, +0xe0,0x43,0x3e,0x82,0xe0,0xf, 0x8c,0x9b,0x7f,0x82,0xf0,0x0, 0x15,0x81,0x7e,0x85, +0xf0,0x0, 0x14,0x80,0xf7,0xff,0x17,0x7a,0xf0,0x0, 0x10,0x6, 0x67,0x5, 0xe2,0x0, +0xcf,0x0, 0xe0,0x1, 0x4, 0x23,0xe8,0x43,0x3f,0x8b,0xf0,0x0, 0x13,0x80,0xf8,0x6, +0x3b,0x2a,0xf0,0x38,0x3f,0x1f,0xe8,0x31,0x3f,0x90,0xc7,0x86,0xf0,0x8, 0x33,0x21, +0xf0,0x40,0x3a,0xe2,0xf8,0x40,0x3a,0x67,0xe0,0x43,0x38,0x96,0x7f,0x87,0xe8,0x43, +0x3d,0x5, 0xe8,0xf, 0x3d,0x3d,0xe8,0xf, 0x3f,0x96,0x37,0xa1,0xe8,0xf, 0x3f,0x9c, +0xf0,0x0, 0x91,0xf, 0x24,0xb2,0xe0,0x5, 0x3d,0x22,0xe8,0x40,0x3e,0x69,0x35,0x21, +0xe8,0x40,0x3f,0xe9,0xe0,0x43,0x3a,0x15,0x0, 0x8e,0xe2,0x0, 0xcb,0x1, 0x2, 0x22, +0xe2,0x0, 0xca,0x0, 0xe0,0x0, 0x5, 0x5d,0xe2,0x0, 0xca,0x81,0x2, 0x1b,0x3f,0xf9, +0x3e,0x6f,0x3, 0x1b,0x17,0x1e,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x1e,0xe0,0xd, +0x36,0x21,0x3f,0x7a,0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x4, 0x71,0xe0,0x7, +0x8f,0x6d,0x3c,0x7e,0x4, 0x6d,0xe2,0x0, 0xc8,0x80,0x2, 0x60,0xe3,0xff,0xc8,0xff, +0x3, 0x60,0x3e,0x79,0xe0,0x0, 0x4, 0x43,0xe8,0x40,0x39,0xf2,0xe0,0x1, 0x2, 0x4e, +0xe8,0x43,0x3f,0x87,0xf0,0x2e,0x3f,0x1f,0x2f,0x13,0xf0,0x0, 0x2c,0x12,0xe8,0x2e, +0x3f,0x90,0x2f,0xe, 0xf0,0x0, 0x28,0x8d,0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0x66,0x87, +0xe0,0x1, 0x1f,0x4a,0x3f,0x9d,0x37,0xa1,0x3f,0x9e,0xf0,0x0, 0xb1,0xf, 0xf0,0x0, +0xc2,0x1, 0xf3,0xff,0xc2,0x7f,0x17,0xff,0xe8,0xf, 0x3f,0x95,0xf1,0xff,0xc3,0xff, +0xe2,0x1, 0xc7,0xff,0xf2,0x1, 0xc3,0xff,0xf0,0x0, 0x22,0x99,0xf0,0x40,0x3a,0xef, +0xe7,0xff,0x0, 0x97,0xe3,0xff,0xca,0x7f,0xe7,0xfd,0x3, 0x79,0xe7,0xfe,0x0, 0x91, +0x67,0x82,0xe2,0x0, 0xcf,0x81,0xe7,0xfe,0x5, 0xad,0xe7,0xfe,0x0, 0xb6,0xe3,0xff, +0xca,0x7f,0xe7,0xff,0x3, 0x26,0x3e,0x79,0x3, 0x40,0xf0,0x0, 0x22,0xf, 0xf0,0x0, +0xc3,0x1, 0x66,0x86,0xf2,0x1, 0xc3,0x7f,0xe8,0x40,0x3e,0xf6,0xf0,0x0, 0xc5,0x81, +0xf2,0x1, 0xc5,0xff,0xe7,0xfe,0x2, 0xdc,0xe8,0x40,0x39,0x73,0xe7,0xfc,0x3, 0x78, +0x66,0x84,0xe0,0x1, 0x1f,0x72,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, 0x13,0x1, 0x8e,0x8d, +0xf0,0x16,0x3b,0x12,0xf0,0x0, 0xa6,0x8e,0xf0,0x0, 0x8f,0x5f,0xe0,0x1e,0x8d,0x3b, +0x7e,0x82,0xf2,0x1, 0xc3,0x7f,0x12,0x1, 0xf0,0x0, 0x10,0x80,0xf7,0xff,0x11,0x7a, +0xf0,0x0, 0x11,0x86,0x67,0x3, 0xe8,0x40,0x3f,0x76,0xe7,0xfc,0x5, 0xd9,0xe0,0x43, +0x38,0x84,0xe8,0x10,0x3b,0xaa,0xf0,0x3c,0x39,0x11,0xe8,0x3b,0x38,0x93,0xe0,0x17, +0x33,0xa1,0xe8,0x40,0x3c,0x66,0x13,0x1, 0x12,0x80,0xf8,0x43,0x3a,0x90,0xc0,0x86, +0xe8,0xf, 0x3c,0x3e,0x3f,0x97,0x37,0xa1,0xe8,0xf, 0x3f,0x9d,0xf0,0x0, 0x94,0xf, +0xe0,0x0, 0x25,0x51,0xe0,0x19,0x3c,0x22,0xe0,0x9, 0x34,0x21,0xe8,0x40,0x3e,0x61, +0xe8,0x40,0x3f,0xe1,0xf8,0x43,0x3a,0x19,0x0, 0x8d,0xf2,0x0, 0xc8,0x1, 0x2, 0x23, +0xf2,0x0, 0xca,0x0, 0x5, 0x39,0xf2,0x0, 0xcc,0x81,0x2, 0x1d,0x3f,0xfa,0x3e,0x6f, +0x3, 0x39,0xe0,0x0, 0x17,0x5a,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x3e,0xe0,0xd, +0x36,0x21,0x3f,0x79,0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x2, 0x70,0xe0,0x17, +0x8f,0xd, 0xf0,0x40,0x3b,0xfe,0x4, 0x6b,0xf2,0x0, 0xca,0x80,0x2, 0x5f,0xf3,0xff, +0xca,0xff,0x3, 0x5f,0x3e,0x7a,0x3, 0x1e,0xe7,0xfc,0x22,0x8a,0xc3,0x81,0x66,0x86, +0xe2,0x1, 0xc3,0xff,0x3e,0xf7,0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0xe7,0xff,0x2, 0xa4, +0xc0,0x1c,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x67,0x82,0xe2,0x0, 0xcf,0x81,0xe7,0xfe, +0x5, 0xcc,0xe7,0xfe,0x0, 0xec,0xf3,0xff,0xca,0x7f,0x4, 0x65,0x3f,0xfa,0x3e,0x6f, +0x4, 0x49,0xe8,0x40,0x39,0xf8,0x2, 0x26,0xe0,0x43,0x3f,0x86,0xf0,0x2e,0x39,0x1f, +0x2f,0x12,0xf0,0x0, 0x2e,0x11,0xe8,0x2e,0x3f,0x93,0x2f,0xd, 0xf0,0x0, 0x2d,0x8c, +0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0xe0,0x1, 0x1e,0xca,0x3f,0x91,0x37,0xa1,0x3f,0x9d, +0xf0,0x0, 0xb4,0xf, 0xc2,0x81,0xe3,0xff,0xc2,0xff,0xc4,0x1, 0x67,0x83,0xe2,0x1, +0xc4,0x7f,0x3f,0xf8,0xc3,0x1, 0xe2,0x1, 0xc3,0x7f,0xe7,0xff,0x2, 0x83,0xe7,0xff, +0x0, 0xbd,0x67,0x2, 0xe2,0x0, 0xcf,0x1, 0x5, 0xf1,0xe7,0xff,0x0, 0xb7,0xf0,0x0, +0x61,0x83,0xf1,0xff,0xc1,0xff,0xe7,0xfb,0x0, 0xb5,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xc0,0x70,0x3b,0xe8,0xe0,0x1, 0x1c,0x4a,0xe0,0x0, 0x4a,0xcf,0x39,0x6a,0xf0,0x40, +0x3c,0x69,0xe0,0x2, 0x15,0x52,0x14,0x80,0x39,0xec,0x3a,0x6d,0x3b,0x6b,0xe0,0x5, +0xd8,0x2b,0x3d,0xe5,0x3d,0x62,0x3c,0xe4,0x3c,0x63,0xdc,0xbf,0xe0,0x2, 0x1f,0xda, +0x8f,0x8f,0x27,0x87,0xe0,0x2, 0x1f,0xdd,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x11, +0x3c,0x65,0xda,0xa5,0x3c,0xe4,0x3c,0x63,0xd9,0x2e,0x3d,0xe6,0x3d,0x62,0xe8,0x40, +0x3c,0xe8,0x3c,0x67,0xc0,0x10,0xf8,0x0, 0xf, 0x28,0xb, 0xa1,0xe7,0x76,0x0, 0x84, +0xe0,0x0, 0x1f,0x8e,0xf0,0x2, 0x1f,0x5e,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x5, +0xe0,0x3, 0x1f,0x9c,0x8f,0x8f,0x27,0xe5,0xf0,0x0, 0x15,0x8a,0xf0,0x1b,0x3d,0xb6, +0x3c,0xe4,0x3c,0x63,0xd9,0x10,0xf0,0x0, 0x1e,0xd, 0xf0,0x0, 0x14,0xfc,0x3d,0x62, +0x3d,0xe6,0xe8,0x40,0x3c,0xe8,0x3c,0x67,0xf8,0x19,0x3c,0x9b,0xef,0xfb,0xda,0xe4, +0xf8,0x19,0x3c,0x9c,0xe8,0x0, 0x8f,0xd9,0x3c,0x65,0x7f,0x81,0xe8,0x0, 0x8f,0xe9, +0xf8,0x0, 0x9d,0x9, 0x7f,0x82,0xe8,0x0, 0x8f,0xf9,0xe8,0x0, 0x9a,0x99,0x7f,0x83, +0xe8,0x1, 0x8f,0x89,0xf8,0x0, 0x8e,0xc9,0x7f,0x84,0xda,0x61,0x3c,0xe4,0x3c,0x63, +0xd8,0xea,0x3d,0x62,0x3d,0xe6,0xe8,0x40,0x3c,0xe8,0x3c,0x67,0xef,0xfb,0xda,0xc4, +0xe8,0x0, 0x9c,0x8e,0xe8,0x0, 0x9d,0x1e,0xf0,0xe, 0x3d,0x29,0xe3,0xff,0xc7,0x7f, +0xf8,0xb, 0x3e,0x1b,0xe0,0x43,0x3e,0x9e,0xe0,0x7, 0x99,0xeb,0xe0,0xb, 0x3a,0xaa, +0xe2,0x0, 0xce,0x80,0xe3,0xff,0xc5,0xff,0xe8,0xd, 0x3c,0xaa,0xf8,0xf, 0x3e,0x1b, +0xe0,0x43,0x3a,0x1b,0xe0,0x7, 0x99,0x7f,0xe3,0xff,0xc6,0xff,0xe0,0xf, 0x39,0xa9, +0xe0,0x6e,0x3d,0x2d,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xca,0x0, 0xe0,0x8, 0x3d,0x25, +0xe0,0x43,0x3a,0x1f,0xe3,0xff,0xc4,0x7f,0xe0,0xd, 0x39,0x2a,0xe0,0x6b,0x3d,0x28, +0xe3,0xff,0xc6,0xff,0xe2,0x0, 0xca,0x0, 0x3c,0xa3,0xe0,0x43,0x3c,0x1d,0xe3,0xff, +0xc4,0xff,0xe0,0x6f,0x3d,0x29,0x3d,0x22,0xe2,0x0, 0xcc,0x0, 0xe3,0xff,0xc5,0x7f, +0xe0,0x6d,0x3d,0x2a,0x3f,0x1b,0x3f,0x9d,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc7,0xff, +0x3f,0x7f,0x3, 0x93,0x67,0x81,0xf8,0x0, 0xb5,0x9, 0xe8,0x0, 0xaf,0xd9,0x67,0x82, +0xe8,0x0, 0xb2,0x99,0xe8,0x0, 0xaf,0xe9,0x67,0x83,0xf8,0x0, 0xae,0xc9,0xe8,0x0, +0xaf,0xf9,0x67,0x84,0xe8,0x1, 0xaf,0x89,0xc0,0x10,0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x6c,0xe0,0x2, 0x1f,0xdd,0xf0,0x0, 0x1e,0xe, +0x8f,0x8f,0x2f,0x9f,0xea,0x12,0x7a,0x3, 0xf8,0x0, 0x8d,0x8c,0xaf,0x84,0xf0,0x0, +0x25,0xa1,0x17,0x1, 0xaf,0x4, 0x17,0x4, 0xe1,0x2f,0x3f,0x2f,0x2f,0x9a,0x17,0x82, +0xe9,0x2f,0x3f,0xab,0x2f,0x96,0xe0,0x1, 0x1f,0x69,0xea,0x12,0x79,0x82,0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0xaf,0x83,0x1, 0x19,0xc0,0x14,0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0xf8,0x0, 0x8d,0x8c,0xf0,0x0, 0x2d,0xed,0xea,0x12,0x7a,0x3, 0xf0,0x0, 0xad,0x84, +0xea,0x12,0x79,0x82,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0x17,0x1, 0xe2,0x0, 0xcf,0x81, +0xaf,0x3, 0x1, 0xeb,0xf0,0x0, 0x25,0xea,0xf0,0x0, 0x15,0x80,0xf0,0x3, 0x1e,0x9c, +0xe0,0x0, 0x1b,0xd, 0xe0,0x2, 0x1a,0xfd,0xf0,0x1, 0x1c,0x72,0xf0,0x1, 0x1c,0xd7, +0xf0,0x1, 0x1d,0x44,0xe0,0x2, 0x1b,0xff,0xe8,0x40,0x39,0x6b,0x0, 0x90,0x8f,0x87, +0x3f,0xf2,0x1, 0x10,0xf0,0x0, 0xc5,0x81,0xf2,0x1, 0xc5,0xff,0xc1,0x1, 0xe8,0x0, +0x8f,0x8c,0xe2,0x1, 0xc1,0x7f,0x3f,0xf2,0xe0,0x0, 0x5, 0xc8,0xe8,0x0, 0x8f,0x8d, +0x2f,0xef,0xe0,0xe, 0x31,0x21,0x3f,0x16,0x8e,0xe, 0x8f,0xd5,0x8e,0x9e,0x3f,0xbc, +0xe8,0x0, 0xa7,0x8, 0x3f,0x9d,0x37,0xa1,0x3f,0x9e,0x97,0xf, 0xe8,0x0, 0x97,0xa9, +0x3f,0x7f,0x4, 0x65,0x8f,0x83,0x2f,0xb7,0x17,0x83,0xe8,0x3, 0x8d,0xb9,0x6f,0x96, +0x6f,0x97,0x25,0xbd,0x17,0x84,0x14,0x84,0x6f,0x96,0x3c,0x69,0x6f,0x97,0xe8,0x40, +0x3d,0xeb,0x3d,0x62,0xef,0xfb,0xdb,0xf2,0xe8,0x0, 0x8f,0x8a,0xe2,0x0, 0xcf,0x81, +0x1, 0xca,0x17,0x8a,0xe8,0xf, 0x3f,0xbb,0x3f,0x96,0xe0,0x7, 0x9e,0xef,0xe0,0x7, +0x97,0x7f,0xe0,0x7, 0xb6,0xff,0xe0,0x7, 0xb7,0x6f,0xe7,0xff,0x0, 0xbd,0xea,0x12, +0x7a,0x3, 0x87,0x4, 0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x32,0xe7,0xfe, +0x5, 0xf3,0x17,0x32,0xe7,0xfe,0x0, 0xf0,0xf8,0x0, 0xad,0x8c,0xc0,0x14,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0x8f,0x4, 0x14,0x86,0x17,0x86,0x7f,0x1, 0xe8,0x40,0x3d,0xeb, +0x3d,0x62,0x3c,0x69,0x6f,0x96,0x6f,0x97,0xde,0x79,0x0, 0xcf,0x8f,0xf5,0x3c,0xed, +0x3c,0x6c,0x3d,0x62,0x7f,0x84,0x7e,0x3, 0x7e,0x82,0xf0,0x0, 0x8f,0x65,0xef,0xfb, +0xd9,0x34,0xe8,0x0, 0x8f,0x8c,0x66,0x3, 0xe2,0x0, 0xcf,0x83,0x66,0x82,0x5, 0x84, +0x17,0x82,0x6f,0x96,0x6f,0x97,0xe2,0x1, 0xcc,0x7f,0x1, 0x4, 0x17,0x82,0x6f,0x96, +0x6f,0x97,0xe2,0x0, 0xce,0x1, 0x5, 0x86,0xf1,0xff,0xc7,0x7e,0xe8,0x40,0x3e,0x7e, +0x4, 0x3, 0x17,0x82,0x6f,0x96,0xe2,0x0, 0xce,0x81,0x5, 0x85,0x67,0x84,0xc7,0xfe, +0x3e,0xff,0x4, 0x3, 0x17,0x82,0x6f,0x97,0x14,0x96,0x3c,0x90,0x3c,0x62,0xe2,0x0, +0x7d,0x17,0xef,0xff,0xd7,0x7, 0x4c,0x16,0x4c,0x97,0xe7,0xff,0x0, 0x92,0x8f,0x8, +0x3f,0xe8,0x3f,0x79,0x2, 0x8c,0x8f,0x28,0x14,0x0, 0x3f,0x79,0x5, 0x89,0x8f,0x1f, +0x3f,0x7a,0x2, 0x86,0x8c,0x3f,0xe1,0x28,0x3c,0x1a,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe0,0x2, 0x1f,0x42,0x9f,0x88,0x9e,0x8e,0x3f,0xfd,0x2, 0x84,0x17,0x80,0xb7,0x88, +0x38,0x82,0x9f,0xe, 0x3f,0xae,0xb7,0x88,0x38,0x82,0x8, 0xb1,0xc0,0x68,0xe4,0x0, +0x17,0x80,0xe0,0x2, 0x1e,0xfd,0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd, +0x3d,0x1f,0xe0,0xf, 0x34,0x41,0x7f,0x1, 0x34,0xc1,0x7f,0x6, 0x35,0x41,0x7f,0x85, +0xe2,0x0, 0x7c,0x4, 0x17,0x90,0x7f,0x2, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, +0x77,0x8c,0xe0,0x5, 0xd0,0x3a,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, +0x1e,0xfd,0xe4,0x0, 0x17,0x80,0x17,0x0, 0x86,0x5d,0x3c,0x1f,0x86,0xcd,0x3c,0x9f, +0x3d,0x1f,0x7f,0x1, 0xe0,0xf, 0x34,0x41,0x34,0xc1,0x35,0x41,0xe2,0x0, 0x7c,0x4, +0x7f,0x2, 0x7f,0x6, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, 0x7f,0x85,0x6d,0x87, +0xe0,0x5, 0xd0,0x1b,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe4,0x0, 0x17,0x80, +0xe0,0x2, 0x1e,0xfd,0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd,0xe0,0xf, +0x34,0x41,0x7f,0x1, 0x34,0xc1,0x7f,0x6, 0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0xa0, +0x7f,0x2, 0x7f,0x4, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x77,0x8c,0xe0,0x4, 0xdf,0xfd, +0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0x57,0xe0,0x2, +0x1e,0xfd,0xe4,0x0, 0x17,0x80,0xe2,0x0, 0x7d,0xae,0x3c,0x1f,0xf0,0x0, 0x93,0x2e, +0xf0,0x0, 0x93,0xbe,0x95,0x7e,0x3f,0x9b,0xe0,0x1, 0x95,0x8e,0xe0,0x1, 0x1f,0x79, +0xf0,0x0, 0x82,0x4d,0xf0,0x0, 0x82,0xdd,0x16,0x1, 0xe0,0xd, 0x34,0x41,0x37,0xc1, +0x37,0x41,0xe2,0x0, 0x7c,0x14,0xe2,0x0, 0x7c,0x84,0x7e,0x86,0x7f,0x88,0x7f,0x7, +0x75,0x95,0x6e,0x16,0x6e,0x17,0xf0,0x0, 0x6a,0x15,0xf0,0x0, 0x6a,0x94,0xf0,0x0, +0x73,0x12,0xf0,0x0, 0x73,0x93,0x75,0x14,0xe0,0x5, 0xd0,0x27,0x5c,0x7, 0x5f,0x5, +0xe0,0x43,0x3f,0x98,0xe2,0x0, 0xcf,0x80,0xe0,0x41,0x3e,0x4f,0xe0,0x43,0x3e,0x9e, +0x3d,0xe8,0xe0,0x6b,0x3d,0x2c,0xe2,0x0, 0xce,0x80,0x5, 0x13,0x3d,0xfe,0x5, 0xd, +0xe0,0x41,0x3f,0x48,0xe2,0x0, 0xcf,0x80,0x3f,0xee,0xe3,0xff,0xc7,0xff,0xe0,0x68, +0x3d,0x2f,0xe0,0x0, 0xc0,0x68,0x8, 0xe1,0x3c,0x6e,0xe0,0x0, 0xc0,0x68,0x8, 0xe1, +0xe0,0x41,0x3e,0xcd,0x3d,0xfd,0x2, 0x6d,0xe0,0x41,0x3c,0x4e,0xe3,0xff,0xc4,0x7f, +0xe0,0x0, 0xc0,0x68,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, 0x1f,0x7d,0xe4,0x0, +0x17,0x80,0x16,0x80,0x3c,0x9f,0xf0,0x0, 0x81,0xde,0xf0,0x0, 0x82,0x4e,0x3f,0x98, +0xe0,0x16,0x35,0x41,0xe0,0x17,0x35,0x42,0x17,0x1, 0x7e,0x81,0xe0,0x15,0x34,0xc1, +0x7e,0x86,0x3f,0x5a,0x37,0xc1,0xf2,0x0, 0xc3,0x1, 0xf2,0x0, 0xc3,0x81,0x3d,0x6c, +0x3c,0xeb,0xe2,0x0, 0x7c,0x4, 0x7e,0x82,0x7e,0x84,0xf0,0x0, 0x69,0x85,0xf0,0x0, +0x6a,0x4, 0xf0,0x0, 0x7a,0x83,0x7f,0x85,0x6f,0x7, 0xf0,0x0, 0x6b,0x1a,0xf0,0x0, +0x6b,0x9b,0xe0,0x5, 0xd2,0x16,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, +0x1f,0x7d,0x17,0x80,0x86,0x5e,0x86,0xce,0xe9,0xff,0xc4,0x7e,0x7f,0x81,0xe0,0xe, +0x34,0x41,0xe2,0x0, 0x7c,0x4, 0x7f,0x82,0x7f,0x84,0x7f,0x85,0x7f,0x86,0x6e,0x5, +0x6e,0x84,0x7f,0x3, 0xe0,0x5, 0xd2,0x9a,0xc0,0x18,0x8, 0xe1,0x8, 0xb2,0xc0,0x70, +0xf0,0x1, 0x1b,0xe6,0xf0,0x1, 0x1a,0xe5,0xe0,0x1, 0x19,0x78,0xe4,0x0, 0x17,0x80, +0xe0,0x1, 0x1f,0x7f,0xf0,0xc, 0x3a,0x9f,0xf0,0xd, 0x3b,0x9f,0xe8,0x0, 0xb4,0x5, +0x3f,0x92,0xf0,0x99,0x12,0xd6,0xf0,0x0, 0x13,0x1, 0xf0,0x15,0x3a,0x9e,0x36,0x41, +0x36,0xc1,0x37,0xc1,0xe0,0x99,0xc7,0x7e,0xe2,0x0, 0x7c,0x4, 0x7e,0x2, 0x7e,0x83, +0x7f,0x84,0xf0,0x0, 0x6b,0x4, 0xf0,0x0, 0x6b,0x5, 0xe8,0x0, 0xb4,0x85,0xe8,0x0, +0xb5,0x7, 0xb5,0x8e,0xe0,0x5, 0xd0,0xa, 0x9c,0x2, 0xc0,0x10,0x9, 0x61,0xe0,0x3, +0x1f,0xc7,0x8f,0x8f,0xe2,0x0, 0xcf,0x83,0x1, 0x3, 0x14,0x1, 0x38,0x82,0x8, 0xb2, +0x39,0x68,0x3c,0x69,0xef,0xff,0xd3,0x51,0xe0,0x2, 0x1f,0x93,0xe0,0x1, 0x8f,0x1f, +0xe2,0x0, 0xcf,0x5, 0x24,0x7, 0x1, 0x8, 0xe0,0x1, 0x8c,0x1f,0xe0,0x28,0x39,0x8, +0x9, 0x61,0x1, 0xfb,0x0, 0xfc,0xe2,0x1, 0xc1,0x7d,0x14,0x0, 0x29,0x7a,0xea,0x12, +0x7f,0xa2,0x8e,0xf, 0x17,0x1, 0x3f,0x1c,0xe0,0x1, 0x1e,0xc6,0xe2,0x1, 0xc7,0x7f, +0xe2,0x0, 0xcf,0x3, 0x3e,0x9c,0x8c,0xd, 0x2, 0x83,0xaf,0xf, 0x9, 0x61,0xa9,0xf, +0x9, 0x61,0xe0,0x3, 0x1f,0xac,0xe4,0x0, 0xc4,0x8e,0xe0,0xe, 0x3f,0x99,0x8f,0x1e, +0x27,0x5, 0x17,0x1, 0xe0,0x2e,0x3c,0xe, 0x2f,0xd, 0x3f,0x99,0x8f,0xbf,0x27,0x89, +0x17,0x84,0xe0,0x28,0x3c,0xf, 0x24,0x5, 0xe0,0x1, 0x1f,0xe9,0x17,0x0, 0xaf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0x69,0x16,0x80,0xae,0x8e,0x0, 0xf0,0x8, 0xb7,0xe0,0x2, +0x1b,0xc8,0x89,0x87,0xef,0xfe,0xd1,0x3, 0x24,0x7e,0xe0,0x0, 0x19,0x3b,0xe0,0x2, +0x8a,0x2, 0xe0,0xf, 0x39,0x14,0xe0,0x6, 0x8b,0xf, 0x8f,0x4f,0x2f,0x1f,0xe0,0x1, +0x1a,0xe9,0x8f,0x85,0xe2,0x0, 0xcf,0x81,0x1, 0x3f,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f, +0xe2,0x0, 0xcf,0x83,0x1, 0x39,0xe0,0x2, 0x8f,0x2, 0xe0,0x2, 0x8f,0x92,0x3f,0x7f, +0xe0,0x0, 0x3, 0xe6,0xef,0xff,0xd2,0xac,0xef,0xff,0xd2,0xb6,0x24,0x6, 0xe0,0x2, +0x1f,0xe6,0x8f,0x8f,0xe0,0x0, 0x2f,0xd7,0xb, 0xe1,0x8f,0x4f,0xe0,0x2, 0x1e,0x93, +0xc7,0x7f,0xe0,0x5, 0xaf,0x3d,0x8f,0xcf,0xe0,0x1, 0x1a,0xe9,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x1, 0x5e,0x17,0x0, 0xaf,0x5, 0xe0,0xf, 0x39,0x14,0x17,0x0, 0xaf,0x4f, +0x3c,0x66,0xe0,0x1, 0x89,0x9f,0x3c,0xe3,0xef,0xfb,0xdb,0xa2,0x3c,0xe3,0x3c,0x64, +0xe0,0x0, 0xdb,0xf3,0xe0,0x2, 0x8f,0x82,0xc7,0x81,0xe0,0x2, 0xaf,0x82,0x8f,0x85, +0xe2,0x0, 0xcf,0x81,0x1, 0xc3,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x27,0xc5,0xe2,0x0, +0xcb,0x5, 0xe0,0x0, 0x1, 0x40,0x17,0x5, 0x3f,0x33,0xe0,0x3, 0x1f,0xb0,0x3f,0x9e, +0x8c,0xcf,0xe0,0x1, 0x1f,0xf1,0xa4,0xf, 0xef,0xfe,0xd1,0xca,0x3c,0xe3,0x3c,0x66, +0xdf,0x47,0x3a,0x68,0x3c,0xe3,0x3c,0x66,0xe0,0x0, 0xda,0x4c,0x2a,0x2f,0xe2,0x0, +0xcb,0x4, 0xe7,0xff,0x1, 0xaa,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xcf,0xe7,0xff, +0x27,0xa4,0x97,0x8e,0xe2,0xff,0xc7,0xff,0xb7,0x8e,0x17,0x80,0xaf,0x85,0xe7,0xff, +0x0, 0x9c,0x3c,0xe6,0x3c,0x63,0xb, 0xa1,0xe0,0x1c,0x0, 0xd4,0xef,0xfe,0xd9,0xba, +0xac,0x5, 0xe0,0x1, 0xd8,0x43,0xe0,0x1, 0xd7,0x8d,0xef,0xff,0xd2,0xf7,0x8c,0x7, +0xe0,0x0, 0xdd,0xf3,0xef,0xfd,0xdf,0xff,0xe7,0xff,0x0, 0x8e,0xaf,0x85,0xe7,0xff, +0x0, 0xa5,0x17,0x0, 0xaf,0x5, 0xe7,0xff,0x0, 0x80,0xef,0xfb,0xdb,0x7b,0x3c,0xe3, +0x3c,0x66,0xe0,0x0, 0xdd,0x7f,0xe0,0x1, 0x1f,0xe8,0xab,0xf, 0xe0,0x2, 0x1f,0x93, +0xe0,0x5, 0xab,0x4f,0xe0,0x3, 0x1f,0x8f,0xa9,0x8f,0x0, 0xc2,0x8, 0xb3,0xe0,0x0, +0x19,0xbb,0x11,0x0, 0xdf,0x4c,0xc1,0x1, 0xe0,0x2, 0x8f,0x93,0xe2,0x1, 0xc1,0x7f, +0x39,0x7f,0x4, 0xf9,0xe0,0x2, 0x1f,0x93,0xe0,0x5, 0x8c,0x4f,0xe0,0x3, 0x1f,0x8f, +0x8c,0x8f,0x9, 0xa1,0xe7,0x76,0x0, 0xa4,0xe0,0x1, 0x1f,0x42,0xe0,0x2, 0x1f,0x93, +0xe0,0xe, 0x85,0x9e,0x16,0x0, 0xae,0xf, 0x15,0x2, 0xad,0xaf,0xe0,0x2, 0x1e,0xe6, +0xe0,0xe, 0x85,0xae,0x8e,0x8d,0xad,0xbf,0x3d,0x5d,0xe0,0xe, 0x85,0xde,0xe0,0x3, +0xad,0xef,0x2d,0x2d,0xe0,0x10,0x86,0x5e,0xe0,0x10,0x85,0xee,0x3e,0x1b,0xe0,0x2, +0xae,0x6f,0xe0,0xe, 0x86,0x6e,0xe0,0x3, 0xae,0x7f,0x16,0x3f,0x3e,0x5d,0xe0,0x11, +0x8e,0x8e,0xe0,0x10,0x8d,0xfe,0x36,0xa6,0x3e,0xcc,0xe0,0xc, 0x35,0xa7,0x3e,0xcc, +0xe0,0x4, 0xae,0xef,0x2d,0x9b,0xe0,0xd, 0x86,0x5e,0xe0,0xd, 0x86,0xfe,0xe0,0xa, +0xae,0xf, 0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x2d,0x72,0xe0,0xd, 0x85,0xee,0xe0,0xe, +0x87,0xe, 0xe0,0xa, 0xad,0xaf,0xe0,0xa, 0xaf,0x3f,0x0, 0x97,0xe0,0x10,0x85,0xde, +0xe0,0x2, 0xad,0xef,0xe0,0x3, 0xae,0x7f,0x0, 0xd9,0xe0,0xd, 0x86,0x6e,0xe0,0xe, +0x86,0x8e,0xe0,0xa, 0xae,0xf, 0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x25,0x4e,0x17,0x0, +0xe0,0xa, 0xaf,0x2f,0xe0,0xa, 0xaf,0x3f,0x17,0x0, 0xe0,0x1, 0x1e,0x8e,0xe0,0x2, +0x1e,0x44,0x86,0x8d,0x15,0x81,0xae,0xdf,0xaf,0x6f,0xe0,0x1, 0xaf,0x3f,0xe0,0x2, +0xaf,0xf, 0xe0,0x0, 0x1e,0xcd,0xe0,0x1, 0xaf,0x7f,0x86,0x8d,0xe0,0x1, 0xae,0xcf, +0xe0,0x1, 0xaf,0x5f,0x86,0xbc,0xe0,0x1, 0xaf,0x6f,0x87,0x4c,0xe0,0x4, 0xae,0x8f, +0xe0,0x4, 0xaf,0x1f,0xe0,0x1, 0x1f,0xd, 0x86,0x5c,0x8e,0x8e,0xe0,0x1, 0x1f,0xc, +0xe0,0x4, 0xae,0x2f,0x36,0xa8,0xe0,0x3, 0x1e,0xe, 0x8f,0xe, 0x86,0x1c,0x3f,0x4d, +0xe0,0x3, 0x1e,0xc3,0xe0,0x5, 0xae,0x1f,0xe0,0x6, 0xad,0x8f,0x8e,0x8d,0xe0,0x5, +0xb7,0x5f,0x26,0xa2,0xe0,0x3, 0x1f,0x38,0xa7,0xe, 0xa7,0x4e,0xe2,0x0, 0xc7,0x1, +0x27,0x1b,0x16,0x85,0xe0,0x1, 0xae,0x9f,0x17,0x0, 0xe0,0x2, 0xaf,0x5f,0xe0,0x2, +0xaf,0x1f,0xaf,0x4f,0x38,0x82,0xe0,0xd, 0x85,0xde,0xe0,0xd, 0x87,0x7e,0xe0,0xa, +0xad,0xaf,0xe0,0xa, 0xaf,0x3f,0xe7,0xff,0x0, 0xb1,0xe0,0xa, 0xad,0xaf,0xe0,0xa, +0xad,0xbf,0xe7,0xff,0x0, 0xab,0x16,0x0, 0xe0,0x1, 0xae,0x1f,0x17,0x0, 0xe0,0x2, +0xaf,0x5f,0xe0,0x2, 0xaf,0x1f,0xaf,0x4f,0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1f,0x76, +0x34,0xa6,0xf0,0x2, 0x1b,0xf5,0x3c,0x19,0x17,0x80,0xb4,0xe, 0x17,0x0, 0x3d,0xef, +0xe8,0x0, 0xaf,0x7, 0x3e,0xef,0x15,0x1, 0xe0,0xe, 0x34,0x1f,0x16,0x1, 0xe2,0x0, +0xc7,0x1, 0xc7,0x81,0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0xea, +0xe2,0x0, 0xcf,0x8c,0x1, 0xf2,0x2d,0x82,0x38,0x82,0xe8,0x0, 0xae,0x87,0x38,0x82, +0x8, 0xb1,0xf0,0x2, 0x1b,0xfd,0xe0,0x1, 0x1c,0x8b,0xe8,0x40,0x3c,0x67,0xe0,0x19, +0x15,0x1c,0xe0,0x5, 0xd2,0xef,0xe0,0x2, 0x1f,0xe6,0xf0,0x40,0x3b,0xe8,0x87,0x8f, +0xe2,0x0, 0xc7,0x82,0x2f,0xbe,0xe0,0x3, 0x8e,0x98,0xe0,0x3, 0x8f,0x88,0x97,0x58, +0x96,0x68,0x3f,0x9d,0xe0,0x2, 0x1e,0xfc,0x3f,0x1c,0xb7,0xd, 0xe0,0x2, 0x1f,0x74, +0xb7,0x8e,0x17,0x80,0xe0,0x1, 0x1e,0xc2,0xe0,0x2, 0x1c,0x75,0xe0,0xe, 0x8f,0x6d, +0xe0,0xe, 0x8d,0xdd,0x37,0x26,0x3d,0x9e,0xe0,0x2, 0x1f,0x76,0x3d,0x6f,0xb5,0x8e, +0x17,0x0, 0xaf,0x8, 0x3e,0xef,0x14,0x81,0xe0,0xe, 0x35,0x9f,0x16,0x1, 0xe2,0x0, +0xc7,0x1, 0xc7,0x81,0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0x69, +0xe2,0x0, 0xcf,0x8c,0x1, 0xf2,0x2d,0x1f,0xe0,0x1, 0x1f,0xc4,0x8f,0x8f,0x27,0x93, +0xe8,0x0, 0x8f,0xc7,0xe0,0x2, 0x1f,0x73,0x37,0xa6,0xc7,0xff,0xb7,0x8e,0x8, 0xe1, +0xe0,0x2, 0x1f,0xfc,0x96,0xd8,0xe0,0x3, 0x8f,0x8, 0xb6,0x8f,0xe0,0x2, 0x1f,0xf4, +0xb7,0xf, 0x0, 0xc8,0xe8,0x0, 0x8f,0xd7,0xe0,0x2, 0x1f,0x73,0x37,0xa6,0xc7,0xff, +0xb7,0x8e,0x8, 0xe1,0xae,0x88,0x0, 0xe1,0x8, 0xb3,0xe0,0x1, 0x19,0x7f,0xe0,0x1, +0x1f,0xee,0xe0,0xc, 0x11,0xd2,0xe0,0x99,0x16,0xcc,0xe0,0x99,0x17,0x50,0x3e,0x92, +0x3f,0x12,0x3d,0x63,0x3c,0x6f,0x14,0x80,0xbf,0x8d,0xb9,0xe, 0xe0,0x5, 0xd2,0xbc, +0x3d,0x63,0x14,0x80,0x3c,0x62,0xe0,0x5, 0xd2,0xb7,0xe0,0x9c,0xc1,0x16,0x17,0x80, +0xaf,0x82,0x9, 0xe1,0x8, 0xb2,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x24,0x3f,0x1f, +0xe0,0x1a,0x16,0x25,0xe0,0x1a,0x15,0x2a,0x8e,0x8e,0x3e,0x1f,0x3d,0x1f,0xe0,0x1a, +0x17,0x26,0x8d,0x8c,0x8c,0xa, 0x3f,0x1f,0xe0,0x1a,0x16,0x27,0xe0,0x1a,0x14,0xab, +0xe0,0x1a,0x15,0x2c,0x8f,0xe, 0x3c,0x9f,0x3d,0x1f,0x3e,0x1f,0x36,0xa8,0xe0,0x2, +0x19,0x40,0x8e,0xc, 0x3d,0xcd,0xf0,0x1a,0x13,0xad,0x8e,0x89,0x8c,0x8a,0xe0,0x1a, +0x15,0x34,0xf0,0x17,0x3b,0x9f,0x3d,0x1f,0x37,0x28,0x35,0xc5,0x8d,0xa, 0x3e,0x4e, +0x34,0x28,0xe8,0x0, 0x8f,0x7, 0xe0,0x1a,0xc7,0xb5,0xad,0x82,0x36,0x45,0x8f,0x8f, +0xe0,0xb, 0x34,0xa8,0x3e,0xc8,0xae,0x12,0x36,0xc5,0xe0,0xc, 0x35,0x28,0x3f,0x4b, +0xae,0xa2,0x37,0x45,0x3f,0xcc,0xe0,0x1, 0x1c,0x8a,0xe0,0x2, 0x1c,0x3f,0xaf,0x32, +0x37,0xc5,0xe0,0x0, 0x15,0x6a,0xaf,0xd2,0xe0,0x5, 0xd2,0x2c,0xe0,0x4, 0x8f,0xe2, +0xe0,0x1, 0x1c,0xd3,0xe0,0x41,0x3f,0x8f,0x15,0x20,0xe0,0x22,0x14,0x40,0xe0,0x6, +0xaf,0xc2,0xef,0xfe,0xd6,0xff,0x9, 0x21,0xe0,0x2f,0x0, 0x93,0x8, 0xb6,0xe0,0x1, +0x1f,0xc2,0xe0,0x1a,0x15,0xa8,0xe0,0x1a,0x16,0x2e,0xe0,0x1a,0x16,0xb2,0x3d,0x9f, +0x3e,0x1f,0x3e,0x9f,0xe0,0x1a,0x14,0x2a,0xe0,0x1a,0x14,0xac,0xe0,0x1a,0x15,0x30, +0x8a,0x8b,0x8a,0xc, 0x89,0x8d,0x3c,0x1f,0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x11,0x24, +0xe0,0x1a,0x10,0xa6,0xe0,0x1a,0x15,0xa9,0xe0,0x1a,0x16,0x2f,0xe0,0x1a,0x16,0xb3, +0xf0,0x1a,0x13,0xa5,0xe0,0x1a,0x13,0x27,0xf0,0x0, 0x89,0x88,0xf0,0x0, 0x8a,0x9, +0xf0,0x0, 0x8a,0x8a,0xf0,0x17,0x3b,0x9f,0x3b,0x1f,0x39,0x1f,0x38,0x9f,0x3d,0x9f, +0x3e,0x1f,0x3e,0x9f,0xe0,0x1a,0x14,0x2b,0xe0,0x1a,0x14,0xad,0xe0,0x1a,0x15,0x31, +0xf8,0x0, 0x8b,0x7, 0x89,0x2, 0xf0,0x0, 0x8b,0x86,0x88,0x81,0x8d,0x8b,0x8e,0xc, +0x8e,0x8d,0x3c,0x1f,0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x13,0x1a,0xf0,0x1a,0x10,0x1c, +0xf0,0x1a,0x10,0xe4,0xf0,0x1a,0x11,0x1d,0x8c,0x8, 0x8c,0x89,0x8d,0xa, 0x3b,0x1f, +0xf0,0x10,0x38,0x1f,0xf0,0x11,0x38,0x9f,0xf0,0x12,0x39,0x1f,0x32,0xa8,0x32,0x28, +0x31,0xa8,0xe0,0x1, 0x1f,0x57,0x83,0x6, 0xf8,0x0, 0x80,0x0, 0xf8,0x0, 0x88,0x81, +0xf8,0x0, 0x81,0x2, 0x31,0x28,0x30,0xa8,0x3d,0xc5,0xf0,0x13,0x31,0xa8,0xf0,0x14, +0x32,0x28,0x3e,0x44,0xf0,0x15,0x32,0xa8,0x3e,0xc3,0xf0,0x16,0x3b,0x42,0xf0,0x17, +0x3b,0xc1,0xe0,0x41,0x3d,0xcb,0xe0,0x41,0x3e,0x4c,0xe0,0x41,0x3e,0xcd,0xe8,0x8, +0x3c,0x43,0xe8,0x9, 0x3c,0xc4,0xe8,0xa, 0x3d,0x45,0xe0,0x1a,0x12,0x1e,0xe0,0x1a, +0x11,0xb4,0x3a,0x1f,0x39,0x9f,0xb6,0x6e,0xe0,0x1a,0x11,0x1f,0xe0,0x1, 0xb6,0x8e, +0x39,0x1f,0xab,0xe, 0xe0,0x1a,0xc7,0xb5,0xf0,0x0, 0xa8,0x1e,0x10,0x80,0xf0,0x0, +0xb3,0x1e,0xf0,0x0, 0xb3,0xae,0xb5,0xbe,0xb4,0x4e,0xb4,0xde,0xb5,0x7e,0xf0,0x2, +0xa8,0xee,0xf0,0x2, 0xa9,0x7e,0x8d,0x84,0x8e,0x3, 0x8e,0x82,0x8f,0x8f,0x35,0xa8, +0x36,0x28,0x3e,0xcb,0x3f,0xcc,0xe0,0x1, 0xb6,0xce,0xe0,0x1, 0xb7,0x9e,0xe0,0x3, +0xa8,0xae,0xe0,0x3, 0xa8,0xbe,0xb, 0x61,0x8, 0xb1,0xe0,0x0, 0x1c,0xd, 0xe0,0x3, +0x15,0x40,0x14,0x80,0xe0,0x5, 0xd1,0xa0,0xe0,0x1, 0x1f,0xc3,0xe0,0x0, 0x1c,0x4, +0x8d,0xf, 0xe0,0x1, 0x14,0xff,0xe4,0x0, 0xc5,0xa, 0x8, 0xa1,0xe0,0xa3,0x0, 0x94, +0x8, 0xb2,0xe0,0x1, 0x1f,0x8e,0xe0,0x2, 0x1c,0x5e,0x89,0xf, 0xe0,0x1, 0x14,0xff, +0xe4,0x0, 0xc1,0xa, 0x3d,0x62,0xe0,0x5, 0xd1,0x87,0xe0,0x2, 0x1c,0x59,0x3d,0x62, +0xe0,0x1, 0x14,0xff,0xe0,0x5, 0xd1,0x80,0xe0,0x2, 0x1c,0x58,0x3d,0x62,0xe0,0x1, +0x14,0xff,0xe0,0x5, 0xd1,0x79,0xe0,0x2, 0x1c,0x57,0xe0,0x3, 0xd8,0xc3,0xe0,0x2, +0x1e,0xdf,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xb7,0x1f,0xc7,0x82,0xb7,0x1d,0xe1,0x80, +0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80, +0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xb7,0xf, 0x9, 0x61,0x8, 0xb4,0xdd,0x4e,0xde,0x29, +0xde,0x8c,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x15,0x89,0x3d,0x9f,0xe0,0x3, 0x1f,0x30, +0x82,0xb, 0xe0,0x1b,0x15,0x5e,0x3d,0x1f,0xe0,0x1a,0x16,0xe, 0x8c,0x8a,0x3e,0x1f, +0x84,0x1b,0xaa,0xe, 0xe0,0x1a,0x16,0x93,0x82,0x3b,0xf0,0x0, 0x82,0xab,0xf0,0x0, +0x83,0x4b,0xf0,0x0, 0x83,0x8c,0xe0,0x1b,0x15,0x5f,0x80,0xcc,0x3e,0x9f,0xaa,0x3e, +0x3d,0x1f,0x81,0x9c,0x81,0x3c,0xac,0x1e,0x15,0x85,0x84,0x2c,0x8d,0xa, 0xf0,0x0, +0x80,0xd, 0x3d,0x9e,0xf0,0x0, 0xab,0xde,0x16,0xa, 0xf0,0x0, 0xab,0x4e,0x3e,0x1e, +0xf0,0x0, 0xaa,0xae,0x34,0xa8,0xa8,0xcb,0x3d,0x49,0xf0,0x0, 0x80,0x9d,0xf0,0x0, +0x81,0x2d,0xf0,0x0, 0x81,0xbd,0xf0,0x0, 0x82,0x4d,0xa9,0x3b,0xf0,0x1b,0x12,0xe2, +0xac,0x2b,0xf0,0x15,0x3a,0x9f,0xa9,0x9b,0xf0,0x1b,0x13,0xe3,0xe0,0x3, 0x1e,0x84, +0xf0,0x1, 0xa8,0x2e,0xf0,0x17,0x3b,0x9f,0xf0,0x0, 0xa8,0x9c,0xe0,0x1b,0x14,0xe0, +0xf0,0x0, 0xa9,0x2c,0xf0,0x1b,0x13,0x61,0xf0,0x0, 0xa9,0xbc,0xe0,0x1b,0x14,0x64, +0xf0,0x0, 0xaa,0x4c,0xe7,0xef,0x16,0x7f,0xb5,0x1d,0xf0,0x16,0x3b,0x1f,0x97,0x5d, +0xe8,0x0, 0x8d,0x5, 0x3c,0x1f,0x3c,0x9f,0x3f,0x5c,0xe0,0x1b,0xc7,0xe5,0xe8,0x0, +0x8e,0x7, 0xf7,0xf7,0x13,0xff,0x35,0x28,0x8c,0x89,0xe8,0xe, 0x3f,0x57,0xf0,0x0, +0x83,0x88,0x84,0xf, 0xe7,0xfe,0x17,0xff,0xe8,0x0, 0x8d,0x86,0x3f,0xde,0xe0,0xe, +0x3e,0x4a,0xe7,0xff,0x16,0x3f,0x34,0xa8,0x3f,0xdc,0x3d,0xc9,0xb7,0xdd,0xb5,0xad, +0xb7,0x3d,0xf0,0x1, 0xab,0x8d,0xe0,0x1, 0xac,0x1d,0xef,0xff,0xd0,0xfd,0xde,0x7f, +0xdf,0x2c,0xdf,0x3f,0xe0,0x1, 0xd8,0x2a,0xef,0xfe,0xdf,0x3c,0xa, 0x21,0xe0,0x11, +0x0, 0x99,0xe0,0x1, 0x1f,0x89,0x8f,0xf, 0xe0,0x1, 0x1f,0x88,0x37,0x28,0x8f,0x8f, +0x3f,0xce,0xe2,0x1, 0xcf,0xdf,0x3c,0x6f,0x2, 0x83,0xe0,0x1, 0x14,0x60,0x34,0x45, +0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x0, 0x0, 0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0xe0,0x0, +0x24,0x4e,0xe0,0x1, 0x1f,0xc2,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0x16,0x1, 0xe0,0xe, +0x8c,0x9f,0xf0,0xe, 0x8a,0x2f,0x3e,0x18,0xe0,0x0, 0x1f,0x8d,0x14,0x0, 0x36,0x21, +0xf7,0xff,0x12,0xfd,0xf7,0xff,0x11,0xfd,0xf0,0x15,0x3a,0x99,0xf8,0x13,0x39,0x94, +0xc4,0xff,0xf1,0xff,0xc2,0x7f,0x3e,0x1f,0x3d,0xe8,0xf0,0x40,0x3b,0x68,0xf0,0x0, +0x13,0x81,0x0, 0x95,0xe8,0x40,0x3f,0x75,0x3, 0x17,0x15,0x81,0xe8,0x2a,0x3e,0x86, +0x2d,0x1e,0xe0,0x2e,0x3f,0x9, 0x2f,0x1b,0xe8,0x40,0x3e,0xf4,0xe8,0x40,0x3f,0x67, +0xc7,0x82,0xe0,0x6e,0x39,0xa8,0x3e,0x7f,0x3c,0x6e,0x1, 0x15,0x8f,0xf, 0x8e,0x9f, +0xe2,0x0, 0xcf,0x2, 0x2, 0xe8,0xe2,0x0, 0xce,0x82,0x5, 0x88,0xe8,0x40,0x3e,0xf3, +0xe8,0x40,0x3d,0x67,0xe0,0x6a,0x3b,0x2b,0x3d,0xea,0x2f,0x61,0xc7,0x82,0x3e,0x7f, +0x14,0x1, 0x1, 0xed,0x3c,0x5b,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3c,0xe0,0x3, 0x1a,0x99,0xdf,0xa9,0xe0,0x0, 0x19,0x8e,0xac,0x5, 0xf0,0x0, +0x8d,0x83,0x24,0x3, 0xf0,0x0, 0x2d,0xe6,0xe0,0x2, 0x1b,0xbc,0x17,0x80,0xaf,0x87, +0xaf,0x85,0xf0,0x0, 0x25,0xe3,0xf0,0x0, 0x15,0x80,0xe0,0x3, 0x1a,0x1c,0xf0,0x0, +0x1c,0x9a,0xe0,0x0, 0x1b,0xd, 0xf0,0x2, 0x1c,0x5e,0xf0,0x2, 0x1d,0x7f,0xe8,0x40, +0x39,0x6b,0x0, 0x8b,0xe8,0x0, 0x8f,0x8a,0x3f,0xf2,0x1, 0x9, 0xc1,0x1, 0x8f,0x83, +0xe2,0x1, 0xc1,0x7f,0x3f,0xf2,0x5, 0xb9,0x8f,0x84,0x2f,0xf5,0xe8,0x0, 0x8f,0x89, +0x2f,0xf6,0x3c,0x62,0xe0,0x1, 0xda,0x10,0xe0,0xf, 0x31,0x21,0x3f,0x96,0xf0,0x40, +0x3e,0x68,0x8c,0x9f,0x8c,0xf, 0xe0,0x1, 0xda,0x19,0xe0,0x43,0x3c,0x18,0xf0,0x40, +0x3e,0x78,0x4, 0x65,0x3c,0x62,0xe0,0x1, 0xd9,0xd8,0x24,0x61,0x17,0x8a,0x3f,0xb2, +0x17,0xa, 0xe0,0x0, 0xc7,0xfc,0x3f,0x96,0xe8,0xe, 0x3f,0x3b,0x94,0x8f,0x95,0x1f, +0x95,0xaf,0x96,0x3f,0x96,0xcf,0xe8,0xf, 0x3f,0x18,0xb4,0x8f,0xc1,0x1, 0xb5,0x1f, +0xe2,0x1, 0xc1,0x7f,0xb5,0xaf,0xf0,0x0, 0xc5,0x81,0xb6,0x3f,0xf2,0x1, 0xc5,0xff, +0xb6,0xcf,0x8f,0x83,0x3f,0xf2,0x2, 0xc9,0x87,0x5, 0xaf,0x7, 0xe0,0x0, 0x1f,0x7, +0xaf,0x8e,0xe0,0x2, 0x1f,0xdf,0xf0,0x0, 0xad,0x8f,0xf8,0x0, 0xe, 0x28,0xb, 0xe1, +0xe0,0x2, 0x1b,0xbc,0xe7,0xff,0x0, 0xa1,0xe8,0x40,0x3f,0xeb,0x0, 0xee,0xe7,0xff, +0x0, 0x87,0x0, 0x0, 0xe0,0x0, 0x1f,0x97,0xe0,0x0, 0x1d,0x96,0x16,0x7f,0x17,0x0, +0x16,0x83,0xae,0xf, 0xc7,0x84,0x3f,0xfb,0xe0,0x40,0xaf,0x3f,0xe0,0x40,0xae,0xaf, +0xe0,0x40,0xaf,0x1f,0x1, 0xf7,0x38,0x82,0xe0,0x0, 0x1f,0x8e,0x8f,0x8f,0x2f,0x86, +0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x2f,0x82,0x0, 0xe6,0x38,0x82,0xe0,0x3, 0x1f,0x4, +0x3f,0xe8,0x94,0x5e,0xe2,0x10,0xc4,0x0, 0x24,0xc, 0xe0,0x0, 0x1f,0x8e,0x14,0x0, +0x8f,0x8f,0x2f,0x86,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0xe0,0x1, 0x27,0x87,0x38,0x82, +0xe2,0x0, 0xcd,0xa, 0x2, 0xfd,0xf0,0x0, 0x1b,0x97,0x35,0x22,0xf0,0xe, 0x3b,0x9a, +0xe0,0x43,0x3c,0xf, 0x17,0x83,0xaf,0xae,0x3f,0x68,0xf0,0x2, 0x1b,0x7d,0xe0,0x1, +0x1f,0xf2,0xe8,0x0, 0x8d,0xd6,0xa6,0xf, 0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4, +0x5, 0x10,0x3e,0xee,0xe2,0x1, 0xc6,0xff,0x17,0x7f,0x3f,0x1d,0xe0,0x43,0x3f,0xe, +0xe0,0xf, 0x3f,0x3b,0xe2,0x0, 0xcf,0x0, 0x3f,0x99,0x37,0xa1,0x3f,0x9c,0x3, 0x6e, +0xf8,0x0, 0x8a,0xe6,0xf8,0x43,0x3b,0x5, 0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4, +0x5, 0x10,0x3f,0x68,0xe2,0x1, 0xc7,0x7f,0x14,0x1, 0x3c,0x1e,0xe0,0x43,0x3c,0x8, +0xe0,0xf, 0x3c,0x3b,0xf0,0x40,0x3b,0x78,0x3f,0x99,0x37,0xa1,0x3f,0x9c,0x2, 0x6e, +0xf1,0xff,0xc2,0xff,0xf0,0x40,0x3a,0xfe,0xe0,0x0, 0x1, 0x47,0x2e,0xb8,0xe0,0x43, +0x3c,0x89,0x3e,0xbb,0x3f,0xe9,0x0, 0x85,0x97,0xe, 0xe2,0x3, 0xcf,0x74,0x5, 0xf, +0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0x17,0xff,0x3f,0x98,0xe0,0x43,0x3f,0x8f,0xe0,0xe, +0x3f,0x9d,0xe2,0x0, 0xcf,0x80,0x37,0x21,0x3f,0x1c,0x3, 0x6f,0xe0,0x43,0x3d,0x8b, +0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4,0x5, 0xe, 0x3f,0x69,0xe2,0x1, 0xc7,0x7f, +0x14,0x81,0x3c,0x9e,0xe0,0x43,0x3c,0x89,0xe0,0xf, 0x3c,0x9d,0x3d,0xf9,0x37,0xa1, +0x3f,0x9c,0x2, 0x70,0x3f,0x28,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x3, 0x5, 0x97, +0xe8,0xa, 0x3d,0x17,0x17,0x81,0xaf,0x9a,0x14,0x1, 0x38,0x82,0xe8,0xa, 0x3d,0x17, +0x17,0x80,0xaf,0x9a,0x14,0x0, 0x38,0x82,0x8, 0xb1,0xc0,0x7c,0x7c,0x1, 0xdf,0x4b, +0x64,0x1, 0xc0,0x4, 0x8, 0xe1,0x3e,0xee,0xe7,0xff,0x0, 0xbb,0xf0,0xf, 0x3b,0x9a, +0x8f,0x1f,0x27,0x6d,0x17,0x1, 0xaf,0x1f,0x14,0x1, 0x38,0x82,0xe0,0x0, 0x1f,0x8e, +0x14,0x0, 0xf0,0x0, 0x8b,0x8f,0xf2,0x0, 0xcb,0x84,0xe0,0x0, 0x2, 0xee,0xe0,0x1, +0x1f,0x89,0xe0,0x0, 0x1f,0xd, 0x8e,0x8f,0xe0,0x1, 0x1f,0x88,0x36,0xa8,0x8f,0x8f, +0xe0,0x1a,0x96,0x7e,0x3f,0xcd,0x3e,0x7f,0xe0,0x0, 0x5, 0x5f,0xf0,0x0, 0x23,0xde, +0x8, 0xb1,0xf0,0x0, 0x13,0x7f,0x3d,0x68,0x3c,0xe8,0xf8,0x40,0x3a,0xe6,0x8f,0x8e, +0xe8,0x40,0x3e,0x65,0x8e,0x9e,0xe2,0x1, 0xc6,0x7f,0x3f,0xfc,0xc4,0x1, 0x38,0xe9, +0xf8,0x40,0x38,0x66,0xf0,0x40,0x38,0xea,0xe4,0xb, 0x37,0xa8,0xe4,0xc, 0x36,0xa8, +0xe2,0x1, 0xc0,0xff,0xf2,0x1, 0xc0,0x7f,0xf2,0x1, 0xc0,0xff,0xe2,0x1, 0xc4,0x7f, +0xf0,0x40,0x39,0x6f,0xe4,0xb, 0x35,0xc8,0xf0,0x40,0x39,0xed,0xf0,0x40,0x3a,0x6d, +0xe4,0xc, 0x36,0x48,0xc7,0x2, 0x5, 0x83,0xf8,0x40,0x39,0x65,0x3d,0xf1,0xf8,0x40, +0x3a,0xe2,0xf2,0x1, 0xc2,0xff,0x3, 0x82,0x3f,0xe9,0xe8,0x40,0x3e,0xf0,0x3c,0xef, +0xe2,0x1, 0xc4,0xff,0x5, 0x83,0xf8,0x40,0x39,0xe6,0xe8,0x40,0x3e,0x71,0xf8,0x40, +0x3b,0x63,0xf2,0x1, 0xc3,0x7f,0x3, 0x83,0xf0,0x40,0x3a,0x6a,0xf0,0x40,0x3b,0xf8, +0xe8,0x40,0x3d,0x64,0xe2,0x1, 0xc5,0x7f,0xe7,0xff,0x1, 0xbb,0xe8,0x9, 0x3c,0xa5, +0xe8,0xa, 0x3d,0x26,0xe2,0x0, 0xcc,0x84,0x17,0x84,0xe0,0x2a,0x3f,0xaa,0x14,0x0, +0xe0,0x68,0x3d,0x2a,0x8, 0xe1,0x38,0x82,0x14,0x1, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3a,0xc0,0x7c,0xe0,0x3, 0x19,0x84,0xe0,0x2, 0x1a,0xfd,0x97,0xd3,0xe0,0x0, +0x1b,0xe, 0x86,0x45,0x8e,0xd5,0x17,0x0, 0xe2,0xff,0xc7,0xff,0x8d,0x86,0x6f,0x4, +0xb7,0xd3,0x6f,0x5, 0x6e,0x6, 0x6e,0x87,0xe0,0x1, 0x25,0xfb,0xe0,0x1, 0x1f,0xd7, +0xe0,0x0, 0x19,0xd, 0xf0,0x0, 0x94,0x2f,0x93,0xdf,0xf0,0x1, 0x1d,0x72,0x12,0x0, +0x0, 0x89,0xf8,0x40,0x3c,0x79,0x4, 0x1e,0x8d,0x86,0x8e,0xd5,0x3a,0x7b,0xe0,0x1, +0x3, 0xed,0xe0,0xf, 0x32,0x21,0x3f,0x92,0x8c,0x8f,0x8d,0x1f,0x3e,0xb9,0xe8,0x0, +0xa7,0x8a,0x3e,0x9a,0x36,0xa1,0x3e,0x9f,0xe2,0x0, 0x7c,0x4, 0xf0,0x0, 0x94,0x8d, +0xc2,0x1, 0xef,0xff,0xd7,0xf6,0xe2,0x1, 0xc2,0x7f,0x2c,0x64,0xe8,0x40,0x3b,0xf9, +0x3, 0x64,0x8d,0x86,0x8e,0xd5,0x16,0x1, 0xe0,0x1a,0x9a,0x52,0xe0,0x1a,0x9f,0xe2, +0x97,0x53,0x9d,0x23,0x3f,0x94,0x36,0x2f,0xe2,0xf7,0xc7,0x7f,0xe0,0x2f,0x3f,0x9a, +0x37,0xaa,0x3f,0x4c,0xe0,0x3, 0x1a,0x8c,0x3f,0x4f,0xe0,0x4, 0xcf,0x0, 0x8f,0x85, +0xb7,0x53,0x27,0xbb,0xe0,0x2, 0x1e,0x27,0xe0,0x1, 0x1c,0xf2,0x8f,0xc, 0x8d,0x1c, +0x3f,0x3d,0xa4,0x9, 0x3f,0x1a,0x37,0x21,0xe0,0x2, 0x1d,0x30,0x3f,0x18,0x94,0x8a, +0x97,0xe, 0x9b,0x93,0x3f,0x29,0xe0,0x43,0x3f,0x1e,0xe4,0x9, 0x37,0xf, 0xe2,0xe, +0x3c,0xce,0x3f,0x29,0x3f,0x77,0xe0,0x0, 0x2, 0x78,0x13,0x7f,0x3b,0x1f,0xe2,0x1, +0xc3,0x7f,0x33,0x21,0x3b,0x1c,0x0, 0x95,0x8f,0x2f,0x8f,0xbf,0x3f,0x3d,0xe0,0x80, +0x94,0x9a,0x3f,0x1f,0x37,0x21,0x3f,0x18,0x97,0x8e,0x3f,0xa9,0xe0,0x43,0x3f,0x9f, +0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x3f,0xae,0x3f,0xf7,0xe0,0x0, 0x2, 0x5d, +0x3b,0x7c,0x3f,0xec,0xc6,0x2, 0x1, 0xe9,0x17,0x81,0x2d,0x82,0xad,0x85,0xe7,0xfb, +0x17,0x7f,0x92,0xd3,0x37,0xa9,0x3a,0xde,0x3a,0xcf,0xe7,0x7f,0x17,0xff,0x3a,0xdf, +0xe0,0x0, 0x1f,0x8c,0x8f,0x8f,0xb2,0xd3,0x27,0xa9,0xe0,0x1b,0x97,0x92,0xe0,0x17, +0xc7,0xb7,0xe3,0xff,0xc7,0xff,0xe2,0x14,0xcf,0xd8,0x2, 0x8c,0xe0,0x2, 0x1f,0xc0, +0xe0,0xa, 0x8f,0x8f,0xe0,0x0, 0x2f,0xe5,0xde,0xd2,0x2c,0x4, 0xe0,0x80,0xca,0x80, +0xb2,0xd3,0x16,0x83,0xe0,0x1, 0x1f,0xd7,0xe0,0x1b,0x97,0x42,0x97,0xef,0xe4,0x0, +0xc7,0x8a,0xe2,0x0, 0xcf,0x80,0x3e,0x9f,0xe0,0x6f,0x3c,0x2d,0x37,0x82,0x3f,0x7f, +0x3, 0x5, 0x97,0xd3,0xe0,0x40,0xcf,0x80,0xb7,0xd3,0x97,0xd3,0xe3,0xdf,0xc7,0xff, +0xb7,0xd3,0xe7,0xef,0x16,0xff,0xe0,0x2, 0x1f,0x7c,0x97,0xd3,0x9f,0xe, 0x3f,0xdd, +0x37,0x42,0xe7,0xfd,0x16,0xff,0x3f,0xdd,0x3f,0x74,0xb7,0xd3,0x4, 0x85,0xe0,0x1a, +0x9f,0xe2,0x3f,0xfe,0x5, 0x85,0x97,0xd3,0xe0,0x2, 0xcf,0x80,0xb7,0xd3,0xc0,0x4, +0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0x25,0xa0,0x13,0xff,0x3b,0x9b,0xe2,0x1, 0xc3,0xff, +0xc3,0x81,0x33,0xa1,0xe0,0x0, 0x1f,0xd, 0xe0,0x2, 0x1b,0x2f,0xe0,0x2, 0x1e,0x27, +0x3b,0x92,0x8c,0x8e,0x8d,0x1e,0xe0,0xf, 0x3c,0xbd,0xc7,0x2, 0x3f,0x9a,0x37,0xa1, +0x3f,0x98,0x97,0x8f,0xc6,0x2, 0x3f,0x77,0xe0,0x40,0xac,0xac,0xe0,0x40,0xad,0x1c, +0xe0,0x80,0xb7,0x96,0x1, 0xef,0xad,0x85,0x17,0x80,0xe7,0xff,0x0, 0x88,0xe0,0x0, +0x19,0xd, 0x3e,0x6b,0xe7,0xfe,0x0, 0xb2,0x16,0x0, 0xe7,0xfe,0x0, 0xaf,0xe0,0x2, +0x1f,0xf7,0x17,0x7, 0xaf,0xf, 0x17,0x0, 0xe0,0x1, 0x1f,0xe9,0xaf,0xf, 0xe7,0xff, +0x0, 0xb2,0x0, 0x0, 0x8, 0xb7,0xc0,0x70,0xea,0x4e,0x7f,0xe4,0xe9,0xff,0xc7,0xff, +0xf0,0x0, 0x83,0xf, 0xf0,0x0, 0x83,0x9f,0x83,0xaf,0x83,0x3f,0x82,0xcf,0x82,0x5f, +0x81,0xef,0x81,0x7f,0xe0,0x1, 0x84,0xf, 0xe0,0x1, 0x84,0x9f,0xe0,0x1, 0x85,0x2f, +0xe0,0x1, 0x85,0xbf,0xe0,0x1, 0x86,0x4f,0xe0,0x1, 0x86,0xdf,0xe0,0x1, 0x87,0x6f, +0xe0,0x1, 0x87,0xff,0xf0,0x0, 0x6b,0x4, 0x6f,0x93,0xe0,0x0, 0x1f,0x8e,0xf0,0x0, +0x6b,0x85,0x6b,0x86,0x6b,0x7, 0x6a,0x88,0x6a,0x9, 0x69,0x8a,0x69,0xb, 0x6c,0xc, +0x6c,0x8d,0x6d,0xe, 0x6d,0x8f,0x6e,0x10,0x6e,0x91,0x6f,0x12,0x8f,0x8f,0xe0,0x1, +0x27,0x9c,0xe0,0x2, 0x1f,0xdd,0x89,0x8f,0xe0,0x1, 0x29,0x97,0xe0,0x0, 0x1b,0xd, +0xf0,0x2, 0x1a,0xfd,0xe0,0x1, 0x1f,0xf2,0x89,0x16,0x8b,0x86,0xe8,0x0, 0x8a,0xd5, +0xf7,0xff,0x13,0xff,0xf7,0xff,0x13,0x7f,0x14,0x81,0xa2,0xf, 0xe0,0x43,0x3e,0x97, +0x3d,0x63,0xf0,0x17,0x3b,0x92,0xf0,0x16,0x3b,0x15,0x3c,0x92,0xe0,0xb, 0x3e,0xb5, +0xe8,0x40,0x3f,0x67,0xe0,0xc, 0x3d,0x92,0x36,0x21,0x3e,0x14,0x96,0xc, 0x3f,0xe9, +0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0x3f,0x1b,0x3f,0x9b,0xe2,0x1, 0xce,0x20, +0x37,0x21,0x37,0xa1,0xc6,0xff,0x16,0x1, 0x3f,0x14,0x3f,0x94,0xe0,0x43,0x3e,0x9d, +0x3e,0x13,0x5, 0x18,0x21,0x8, 0x94,0xe, 0x39,0xec,0x3d,0x18,0xe2,0x1, 0xc1,0xff, +0xe0,0x43,0x3d,0x1a,0xe8,0x40,0x39,0x76,0x17,0x1, 0x3f,0x13,0x3, 0x8, 0x94,0xf, +0x39,0xee,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0xe3,0xff,0xce,0xff, +0x1, 0xce,0xf8,0x0, 0x8b,0x45,0x16,0x1, 0xf7,0xff,0x13,0xff,0xf7,0xff,0x12,0xff, +0x14,0x81,0x3e,0x17,0xf0,0x17,0x3b,0x92,0xf0,0x15,0x3a,0x95,0x3c,0x92,0x3f,0xec, +0xe2,0x1, 0xc7,0xff,0xe0,0xd, 0x3f,0xb5,0xe8,0x40,0x3f,0x67,0x3f,0xe9,0xe2,0x1, +0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0xe0,0xb, 0x3e,0x92,0x3f,0x1d,0x3f,0x9d,0xe0,0x43, +0x3e,0x9c,0xe8,0x40,0x3e,0xf6,0x35,0xa1,0x37,0x21,0x37,0xa1,0xf0,0x0, 0x12,0x1, +0x3d,0x94,0x3f,0x14,0x3f,0x94,0xc6,0x1, 0xf0,0x14,0x3a,0x13,0x3, 0x24,0x96,0x8b, +0xe3,0xff,0xc6,0x7f,0xe2,0x1, 0xce,0xa0,0x5, 0x1e,0x21,0x9, 0x94,0xe, 0xe8,0x40, +0x39,0xe4,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0xe8,0x40,0x39,0x75, +0x17,0x1, 0x3f,0x13,0x3, 0x4d,0x94,0xf, 0x39,0xee,0x3d,0x18,0xe2,0x1, 0xc1,0xff, +0xe0,0x43,0x3d,0x1a,0x0, 0xc5,0xea,0x12,0x7f,0xa7,0x17,0x0, 0xaf,0xf, 0x14,0x0, +0xc0,0x10,0xb, 0xe1,0xe4,0x8, 0x35,0xf, 0xe2,0xa, 0x3c,0x4a,0x3c,0xe3,0xe0,0x8, +0x3d,0x28,0xe0,0x4, 0xdc,0xd, 0xe2,0x0, 0xcc,0x64,0x2, 0x6e,0x29,0xe, 0xe0,0x0, +0x1f,0xc, 0xea,0x12,0x7f,0xa7,0x16,0x81,0x8f,0xe, 0xae,0x8f,0x14,0x1, 0x27,0x69, +0x17,0x3, 0xaf,0xf, 0x14,0x3, 0x0, 0xe5,0x16,0xff,0x3e,0x95,0x39,0x7d,0x1, 0x70, +0x17,0xff,0x3a,0xb7,0x3f,0x92,0xe2,0x0, 0xc9,0x8f,0xe2,0x1, 0xc7,0xff,0x16,0x3, +0x3f,0x95,0x17,0x0, 0xe0,0x6e,0x3a,0xac,0x37,0xa1,0x39,0x7d,0x3f,0x94,0x96,0xf, +0xe0,0x0, 0x4, 0x4d,0x17,0x84,0x15,0xf4,0x36,0x1, 0x3f,0x90,0xe0,0xb, 0x3d,0x90, +0xe0,0x1, 0x86,0xef,0x3e,0xfc,0x5, 0x6, 0xe0,0x1, 0x86,0xff,0x3f,0x1d,0xe3,0xff, +0xc7,0x7f,0xc7,0xfe,0x3d,0xff,0x1, 0xf5,0x39,0x15,0x31,0x21,0x3a,0x12,0x97,0x84, +0x16,0xa8,0xe4,0xc, 0x37,0x8f,0xe2,0xf, 0x3e,0x4f,0x3e,0x9e,0x3f,0xac,0xe2,0xb, +0xcf,0xdd,0x3f,0xed,0xe3,0xff,0xc7,0xff,0xe0,0x1a,0x96,0x76,0xe0,0x0, 0x1e,0xa1, +0xe0,0x6e,0x3b,0x2f,0x17,0xa8,0xe2,0xb, 0xce,0x5d,0x3f,0x9e,0x8e,0xd, 0xe3,0xff, +0xc7,0xff,0xe0,0x6e,0x3b,0x2f,0xe2,0x0, 0xce,0x1, 0x1, 0x25,0x3f,0xee,0xe3,0xff, +0xc7,0xff,0xe2,0x1, 0xcf,0xfa,0x2, 0x8f,0xea,0x12,0x7f,0xa7,0x8c,0xf, 0xe3,0xff, +0xc7,0x7f,0x3f,0x78,0xe7,0xff,0x5, 0x8e,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0xac,0xf, +0xe7,0xff,0x0, 0x88,0xe0,0x1, 0x17,0x7a,0x0, 0xf0,0x17,0x81,0x3f,0x92,0xe2,0x1, +0xc7,0xff,0x3f,0x95,0x37,0xa1,0x3f,0x94,0x97,0x8f,0x3e,0x1f,0xe0,0x43,0x3e,0x1c, +0xe7,0xff,0x0, 0xaa,0xc7,0x28,0x17,0x80,0xaf,0x8d,0xe3,0xff,0xc7,0x7f,0x0, 0xd7, +0x8, 0xb6,0xe0,0x2, 0x19,0xc0,0xe0,0x3, 0x1a,0x2e,0xe0,0xa, 0x8f,0x83,0x17,0x1, +0xe2,0x0, 0xcf,0x81,0xaf,0x4, 0xe0,0x0, 0x1, 0x62,0xe0,0x1, 0x1b,0x7, 0xe0,0x1, +0x19,0x57,0x8f,0x86,0xe0,0x0, 0x12,0xee,0x37,0xc1,0xaf,0x92,0xb2,0x92,0xb2,0xa2, +0xef,0xfb,0xd3,0xd8,0xe0,0x0, 0x1f,0x8e,0xe0,0x0, 0x1f,0xd, 0x8f,0x8f,0x2f,0xaf, +0x17,0x80,0xaf,0x84,0xe0,0x1, 0x1f,0x89,0x8d,0xf, 0xe0,0x1, 0x1f,0x86,0x35,0x28, +0x8d,0x8f,0xe0,0x1, 0x1f,0x85,0x35,0xa8,0x8e,0xf, 0xe0,0x1, 0x1f,0x88,0x36,0x28, +0x8e,0x8f,0xe0,0x1, 0x1f,0x84,0x3e,0xca,0x8f,0xf, 0xe0,0x1, 0x1f,0x83,0x3f,0x4b, +0x8f,0x8f,0xe0,0x43,0x3f,0x1e,0x3f,0xcc,0xe0,0x43,0x3f,0x9f,0xe0,0xc, 0x36,0xc5, +0x85,0x6, 0xae,0x3, 0xe0,0x41,0x3d,0xcf,0xe0,0xc, 0x37,0x5, 0xad,0x12,0xb6,0x92, +0xb7,0x22,0xb7,0xf2,0xe0,0x1, 0xb5,0x82,0xae,0x13,0xb, 0x61,0xe2,0x0, 0xcf,0x88, +0x5, 0xa0,0xe0,0x1a,0x97,0xfe,0xe2,0x2, 0xcf,0xab,0x2, 0x32,0x8f,0x86,0x17,0x3, +0x37,0xc1,0xaf,0x92,0xe0,0x1, 0x17,0x96,0xaf,0x3, 0xb7,0xf2,0xe7,0xfe,0x17,0xea, +0xb2,0x92,0xb2,0xa2,0xe0,0x1, 0xb7,0x82,0xaf,0x13,0x8f,0x84,0xe7,0xff,0x27,0xbc, +0xe0,0x0, 0x1f,0xce,0x17,0x1, 0xaf,0xf, 0xb, 0x61,0x17,0x80,0xaf,0x84,0xb, 0x61, +0xe2,0x0, 0xcf,0x86,0x2, 0x93,0xe2,0x0, 0xcf,0x84,0x2, 0xa6,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x5, 0xa8,0xe0,0x1a,0x97,0xfe,0xe2,0x5, 0xcf,0xbb,0xe7,0xff,0x2, 0x22, +0x17,0x84,0x86,0x86,0xe0,0x1, 0x17,0x1b,0x0, 0x8a,0xe0,0x1a,0x97,0xfe,0xe2,0x3, +0xcf,0x8f,0x2, 0x14,0x86,0x86,0x17,0x83,0xe0,0x0, 0x17,0x78,0xaf,0x83,0xb7,0x12, +0xb7,0x22,0xe0,0x1, 0x17,0x20,0xb7,0x72,0xe7,0xfe,0x17,0x60,0xae,0x92,0xe0,0x1, +0xb7,0x2, 0xaf,0x93,0x0, 0xcb,0xe0,0x1a,0x97,0xfe,0xe2,0x3, 0xcf,0xf3,0x2, 0x5d, +0x17,0x84,0x86,0x86,0xe0,0x1, 0x17,0x7, 0x0, 0xea,0x8, 0xb4,0xe0,0x2, 0x19,0xc0, +0xe0,0xa, 0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x0, 0xe0,0x1, 0x19,0x57, +0xe0,0x3, 0x8f,0xe2,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x4f,0xe0,0x3, 0x1a,0x2e, +0x17,0xff,0xaf,0x84,0xdf,0x46,0x8f,0x84,0xe0,0x1, 0x27,0x99,0xe0,0x1, 0x8f,0xb3, +0x27,0xa1,0x9f,0x12,0x97,0xa2,0x96,0xf2,0xe4,0x0, 0xc7,0xa, 0xe4,0x0, 0xc7,0x8a, +0x37,0x3, 0xe4,0x0, 0xc6,0x8a,0xe3,0xff,0xc7,0x7f,0x37,0x83,0xe0,0x43,0x3e,0x1f, +0x36,0x83,0xe0,0xb, 0x37,0x45,0xad,0x83,0xe0,0x41,0x3f,0xcf,0xe0,0x41,0x3d,0x4d, +0xe0,0xb, 0x36,0x5, 0xb7,0x12,0xb6,0x22,0xb7,0xb2,0xb6,0xf2,0xe0,0x1, 0xb5,0x2, +0xad,0x93,0x8f,0xc3,0xe2,0x1, 0xcf,0xaa,0x1, 0x13,0xe0,0x1, 0x1f,0x82,0x8e,0xf, +0xe0,0x1, 0x1f,0x81,0x36,0x28,0x8e,0x8f,0xe0,0x1, 0x1f,0x80,0x36,0xa8,0x8f,0xf, +0xe0,0x0, 0x1f,0xff,0x3f,0x4c,0x8f,0x8f,0xb7,0x42,0x3f,0xcd,0xb7,0xd2,0xe0,0x0, +0x1f,0xfe,0x8f,0xf, 0xe0,0x0, 0x1f,0xfd,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xe0,0x41, +0x3f,0xcf,0xb7,0xb2,0xa, 0x61,0xe0,0x0, 0x1f,0xfc,0xe0,0x1, 0x1f,0x3, 0x8e,0xf, +0xe0,0x1, 0x1f,0x85,0x8f,0xe, 0x8e,0x8f,0xe0,0x0, 0x1f,0xfb,0x36,0xa8,0x8f,0x8f, +0x3f,0x4d,0x16,0x84,0x36,0x28,0xae,0x83,0xe0,0x1, 0x16,0x96,0xe0,0x1, 0x1d,0x87, +0x3f,0xcc,0xb6,0x92,0xe0,0x0, 0x16,0xf8,0xe0,0x41,0x3f,0xcf,0x85,0x8b,0xb6,0xa2, +0x16,0x0, 0xe0,0x3, 0x1e,0xae,0xe0,0x1, 0xb7,0x82,0x17,0x83,0xad,0x92,0xae,0xd, +0xb7,0x72,0xaf,0x93,0xe7,0xff,0x0, 0x94,0xe0,0x0, 0x1f,0xfc,0xe0,0x1, 0x1f,0x3, +0x8e,0xf, 0xe0,0x1, 0x1f,0x85,0x8f,0xe, 0x8e,0x8f,0xe0,0x0, 0x1f,0xfb,0x36,0xa8, +0x8f,0x8f,0xe0,0x1, 0x19,0x57,0x3f,0x4d,0x16,0x89,0x36,0x28,0xae,0x83,0xe0,0x2, +0x16,0xac,0xe0,0x1, 0x1d,0x87,0x3f,0xcc,0xb6,0x92,0xe0,0x2, 0x16,0x8e,0xe0,0x41, +0x3f,0xcf,0x85,0x8b,0xb6,0xa2,0x16,0x0, 0xe0,0x3, 0x1e,0xae,0xe0,0x1, 0xb7,0x82, +0x17,0x88,0xad,0x92,0xae,0xd, 0xb7,0x72,0xaf,0x93,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f, +0xe7,0xfe,0x2f,0xe6,0xe0,0x3, 0x8f,0xe2,0xe7,0xfe,0x2f,0xe2,0xe0,0x0, 0x1f,0xfa, +0x8f,0xf, 0xe0,0x0, 0x1f,0xf9,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xb7,0x92,0xe7,0xfe, +0x0, 0xd7,0x8, 0xb4,0x17,0x9c,0xe0,0x2, 0x19,0xac,0x3f,0xb8,0x3a,0x68,0x3f,0x93, +0xe0,0x1, 0x8c,0xf, 0xe0,0x2, 0x1f,0x9e,0x11,0x1, 0xa9,0xf, 0xef,0xfc,0xd6,0x7b, +0xe0,0x0, 0x1f,0xb3,0xaa,0x3, 0xa9,0xf, 0xa, 0x61,0xe0,0x1, 0x1e,0xc7,0x17,0x0, +0x3f,0xed,0xe1,0x80,0xb7,0x1f,0xc7,0x82,0xb7,0x1d,0xe1,0x80,0xb7,0x1f,0xb7,0xf, +0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xe1,0xff,0xc0,0x8, 0xe0,0x2, +0x1f,0x66,0xe0,0x2, 0x1f,0xfd,0x87,0xe, 0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, +0x3e,0xfe,0x3a,0x68,0xe0,0x0, 0x1, 0x68,0x8b,0xf, 0xf0,0x0, 0x8e,0x2f,0x3c,0x64, +0xe0,0x0, 0xd6,0x38,0xf0,0x0, 0x26,0x52,0x13,0xff,0xe8,0x7, 0x3b,0x9c,0x11,0xff, +0xe2,0x1, 0xc3,0xff,0x39,0x96,0xe0,0x4c,0xc3,0xa7,0xe2,0x1, 0xc1,0xff,0xf0,0x0, +0x14,0x4, 0xe0,0x1, 0x1f,0xff,0xf0,0x18,0x3c,0x10,0x33,0xa1,0x31,0xa1,0xe0,0x1, +0x1a,0xe4,0x3b,0x9f,0xf0,0x1c,0x36,0x21,0xe8,0x3, 0x39,0x98,0xf0,0x0, 0x15,0x3, +0xf0,0x0, 0x14,0xda,0xf0,0x0, 0x15,0x80,0xe0,0x80,0x97,0x95,0xe8,0x40,0x3c,0xea, +0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f,0xe0,0x8, 0x3f,0xa8,0xe0,0x4, 0xd9,0xb8, +0xe2,0x0, 0xcc,0x5a,0xe8,0x40,0x3d,0x69,0xe0,0x6a,0x3b,0x28,0xe3,0xff,0xc5,0x7f, +0x23,0x21,0x11,0x2, 0x39,0x10,0x3f,0x62,0x3f,0xe4,0x96,0x8f,0xe8,0xf, 0x3f,0x9c, +0xe0,0x80,0xb6,0x9e,0x3f,0x73,0x1, 0xfa,0x3c,0xe6,0xe8,0x40,0x3c,0x68,0xe0,0x0, +0xd6,0x2f,0x3f,0xe4,0xe0,0x80,0x97,0x12,0x39,0x73,0xb7,0xf, 0xe8,0xf, 0x3f,0x9c, +0x1, 0xfa,0x3a,0xf7,0xc2,0x2, 0x1, 0xd1,0xe0,0x0, 0xc0,0x78,0xf8,0x0, 0xe, 0x28, +0xb, 0xe1,0xe8,0x40,0x3c,0xeb,0xe8,0x40,0x3c,0x68,0xd6,0x19,0x3a,0xf7,0xc2,0x2, +0x1, 0xc4,0x0, 0xf3,0x8b,0x1f,0xf0,0x0, 0x8e,0x3f,0xe7,0xff,0x0, 0x9a,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe1,0xe6,0xc0,0x58,0x3b,0xe8,0x3c,0x69,0x3b,0x69, +0xef,0xfe,0xd8,0x4b,0xe2,0x0, 0xcb,0x1, 0xe0,0x1, 0x1, 0x4d,0xe0,0x3, 0x19,0x4, +0xe0,0x1, 0x19,0xc7,0x97,0xd2,0x17,0x0, 0xe3,0xff,0xc7,0xdf,0xb7,0x3, 0x3a,0xe8, +0xb7,0xd2,0x3c,0x66,0xef,0xfe,0xd8,0x39,0xe2,0x0, 0xcc,0x0, 0x12,0x2, 0x3f,0xe4, +0xe0,0x6f,0x39,0x28,0x3b,0xff,0x1, 0x6, 0xe0,0x19,0xc0,0x28,0xf8,0x0, 0xc, 0xa8, +0xb, 0xe1,0xe0,0x0, 0x1f,0xbf,0xe0,0x0, 0x1f,0x78,0x8f,0x8f,0x8f,0xe, 0x3f,0x7f, +0xe0,0x2, 0x1, 0x42,0xe0,0x0, 0x1f,0x77,0x8f,0xe, 0x3f,0x7f,0xe0,0x2, 0x1, 0x46, +0xe0,0x0, 0x1f,0x76,0x8f,0xe, 0x3f,0x7f,0xe0,0x2, 0x1, 0x44,0x17,0x80,0x3a,0x6f, +0xe2,0x0, 0xcb,0x2, 0xe0,0x1, 0x1, 0x63,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, 0x1f,0x2c, +0xe0,0x1, 0x1b,0x6e,0x3f,0x9e,0xf0,0x0, 0xa4,0x5f,0xa3,0xef,0xfb,0xe5,0x7c,0xf0, +0xe8,0x0, 0x8f,0x89,0x27,0x8c,0xe0,0x1, 0x22,0xcb,0xe0,0x1, 0x1c,0xf0,0xe0,0x1, +0x1c,0x7d,0xef,0xff,0xd3,0xa3,0x17,0x80,0xe8,0x0, 0xaf,0x89,0x15,0x81,0xe0,0x1, +0x1d,0x7e,0xe0,0x1, 0x1c,0xfd,0xe2,0x0, 0x7c,0x6, 0xef,0xff,0xd3,0x78,0xe0,0x2, +0x1f,0xfc,0x15,0x8c,0x9f,0x8f,0xe0,0x1, 0x1c,0xfd,0x3d,0x9f,0xe0,0x1, 0x1d,0x7e, +0xe3,0xff,0xc5,0xff,0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3c,0x9e,0xe0,0xc, 0x3d,0x1e, +0x96,0x8d,0x96,0xc, 0xc7,0x81,0xe2,0x0, 0x7c,0x6, 0xe3,0xff,0xc7,0xff,0x3f,0x18, +0x3e,0xac,0x3f,0xfb,0xb6,0x8e,0x1, 0xef,0x22,0xad,0xe0,0x2, 0x1f,0xea,0x8f,0x8f, +0x3f,0xf4,0xe0,0x1, 0x1, 0x53,0x3c,0xe6,0xe2,0xc, 0x7c,0x5a,0xe8,0x40,0x3d,0x68, +0xef,0xff,0xd3,0x2d,0xe0,0x1, 0x1c,0xf0,0x3d,0x67,0xe2,0x0, 0x7c,0x6, 0xef,0xff, +0xd3,0x26,0xe2,0xc, 0x7c,0xda,0x3c,0x69,0xe2,0x0, 0x7d,0x6, 0x15,0x81,0xef,0xff, +0xd3,0x3e,0xe0,0x1, 0x1d,0x7e,0xe0,0x1, 0x1c,0xfd,0xe2,0x0, 0x7c,0x6, 0x15,0x81, +0xef,0xff,0xd3,0x35,0xe2,0x0, 0x7d,0x6, 0xe2,0xc, 0x7c,0xda,0x3c,0x6a,0xef,0xff, +0xd3,0xe, 0xe2,0x0, 0x7c,0x6, 0xef,0xff,0xd3,0x67,0xe0,0x43,0x3f,0x98,0xe2,0x0, +0xcf,0x80,0xe0,0xff,0x17,0xff,0xe0,0x6f,0x3b,0x28,0x3c,0x6f,0xe0,0x0, 0x1f,0xf5, +0x8f,0x8f,0xb4,0x3, 0xe0,0xe, 0x37,0xa8,0xe0,0x0, 0x1f,0xf4,0x9e,0x83,0x8f,0x8f, +0x3f,0xce,0x3e,0xff,0x97,0xd2,0xe0,0x0, 0x5, 0xce,0xcf,0xa0,0xb7,0xd2,0xe7,0xfe, +0x2a,0xd5,0xe0,0x1, 0x1c,0xfe,0xe0,0x1, 0x1c,0x7d,0xef,0xff,0xd3,0x27,0xe7,0xfe, +0x0, 0xcd,0xe2,0x0, 0xcb,0x84,0xe7,0xfe,0x1, 0xc9,0xe0,0x1, 0x1c,0x63,0xde,0xa3, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0xe0,0x1, 0x1, 0xc, 0x97,0xde,0xc7,0x86,0xe3,0xff,0xc7,0xff, +0xe0,0x0, 0x27,0xd7,0xc7,0xff,0xe3,0xff,0xc7,0xff,0x17,0x0, 0x15,0x1, 0xe0,0x1, +0x1d,0xff,0x3d,0x1f,0x3e,0x6e,0x0, 0x91,0x9e,0x8f,0xe0,0x45,0x17,0xc2,0x3f,0x9e, +0x3e,0xfc,0x37,0xa1,0x3f,0x9b,0x5, 0x6, 0x96,0x8f,0x9e,0xf, 0xe2,0x0, 0xce,0x80, +0x5, 0x2e,0xc7,0x1, 0x3f,0x7a,0x1, 0x30,0xe0,0x45,0x17,0xc2,0x3f,0x9e,0x37,0xa1, +0x3f,0x9b,0x96,0x8f,0xe2,0x0, 0xce,0x80,0x2, 0x68,0x96,0x8f,0xe0,0x41,0x3e,0xcd, +0x0, 0xe5,0xe3,0xff,0xc7,0xdf,0xb7,0xd2,0xe7,0xff,0x0, 0xb3,0xe0,0x1, 0x1c,0x7d, +0x3c,0xe6,0xef,0xff,0xd2,0xdb,0xe7,0xfe,0x0, 0xb8,0x17,0x1, 0x3f,0x1f,0xe0,0x2, +0x1e,0xac,0xe4,0x0, 0xc7,0x1c,0xe4,0x0, 0xc7,0x9c,0x3f,0x1d,0x3f,0x9d,0xf0,0x0, +0xa4,0xe, 0xa3,0xef,0xe0,0x1, 0x1b,0x6d,0xe7,0xfe,0x0, 0x9a,0xe0,0x41,0x3e,0x4c, +0xe3,0xff,0xc6,0x7f,0x0, 0xcf,0xe0,0x43,0x3f,0x9c,0xe4,0x0, 0xc6,0x5, 0xe2,0x0, +0xcf,0x80,0xe3,0xff,0xc6,0x7f,0xe0,0xff,0x17,0xfb,0xe0,0x6f,0x3b,0x2c,0xe0,0x1, +0x1e,0xc7,0xe0,0x0, 0x1f,0x75,0x8f,0xe, 0xb7,0x8d,0x37,0x28,0xe0,0x0, 0x1f,0xf4, +0x9e,0x8d,0x8f,0x8f,0x3f,0xce,0x3e,0xff,0xe0,0x3, 0x1f,0x4, 0x97,0xde,0x5, 0x96, +0xcf,0xa0,0xb7,0xde,0xe7,0xfd,0x0, 0xca,0xe0,0x1, 0x1d,0x70,0x3c,0xe6,0xe2,0xc, +0x7c,0x5a,0x15,0x81,0xef,0xff,0xd2,0x7b,0xe2,0x0, 0x7c,0x86,0xe2,0xc, 0x7d,0x5a, +0x3c,0x69,0xef,0xff,0xd2,0x54,0xe7,0xfe,0x0, 0xc6,0xe3,0xff,0xc7,0xdf,0xb7,0xde, +0xe7,0xfd,0x0, 0xb4,0x12,0x0, 0x3f,0xe4,0xe7,0xfd,0x0, 0xcc,0x97,0xee,0xc7,0x86, +0xe3,0xff,0xc7,0xff,0xe7,0xfe,0x0, 0xf6,0x12,0x1, 0x3f,0xe4,0xe7,0xfd,0x0, 0xc2, +0x3f,0xe4,0xe7,0xfd,0x0, 0xbf,0xe0,0x1, 0x1f,0x4d,0xe0,0x1, 0x1f,0xc7,0x34,0x22, +0x3c,0x1e,0x9e,0x88,0x97,0x2f,0x16,0x7d,0xe2,0x0, 0xc6,0x82,0x3f,0x5c,0x3f,0x4d, +0xb7,0x2f,0x16,0x7e,0x96,0x88,0x97,0x2f,0xe2,0x0, 0xc6,0x81,0x3f,0x5c,0x3f,0x4d, +0xb7,0x2f,0xe4,0x0, 0xc4,0x85,0x9f,0x18,0xe0,0x3, 0x1e,0xb0,0xe4,0x0, 0xc7,0x5, +0x3c,0x9d,0x86,0x89,0xb7,0x1f,0xe0,0x0, 0x1f,0xbf,0xae,0x8f,0x38,0x82,0x0, 0x0, +0x8, 0xb3,0xe0,0x2, 0x19,0x2c,0x39,0xe8,0x8f,0xb2,0x2f,0xab,0xe0,0x0, 0x1f,0xa4, +0xe0,0x0, 0x1e,0xa3,0xe0,0x0, 0x17,0x0, 0xe0,0x80,0xaf,0x1f,0x3e,0xff,0x1, 0xfd, +0x17,0x80,0x16,0xff,0xaf,0x12,0xaf,0x22,0xaf,0x42,0xaf,0x32,0xae,0xd2,0xb7,0xd2, +0xb7,0xe2,0xe0,0x1, 0xaf,0x12,0xe0,0x2, 0xb7,0xb2,0xe0,0x2, 0xb7,0xc2,0xe0,0x4, +0xaf,0x52,0xe0,0x4, 0xb7,0x92,0xe0,0x4, 0xb7,0xa2,0xe0,0x8, 0xaf,0x12,0x21,0x88, +0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0x9, 0xe1, +0x8f,0x82,0x17,0x1, 0xe4,0x0, 0xc7,0x9c,0x3f,0x92,0xe0,0x1, 0x8c,0xf, 0xe0,0x2, +0x1f,0xc8,0x87,0x8f,0xe0,0x2, 0x1f,0x9e,0xaf,0xf, 0xef,0xfc,0xd4,0x4, 0x0, 0xc7, +0x8, 0xb1,0x14,0x1, 0xdf,0xbe,0xe0,0x2, 0x1f,0xac,0x15,0x0, 0x8c,0x8f,0xe0,0x0, +0x1c,0x78,0xf0,0x2, 0x19,0xc8,0xf0,0x3, 0x1a,0x30,0x3f,0x6f,0xf0,0x40,0x3a,0xef, +0x3d,0xef,0x3e,0xea,0xf0,0x0, 0x13,0x1, 0xe8,0x0, 0x8f,0x83,0xe1,0x80,0x8e,0x18, +0xe4,0x0, 0xc7,0x85,0xf0,0x0, 0x13,0x81,0xe8,0xf, 0x3f,0x94,0x8f,0x8f,0xf0,0x17, +0x3b,0x9d,0x3f,0xfc,0xe0,0x1, 0xae,0xb, 0xe0,0x6d,0x39,0xa9,0x3c,0xed,0x3f,0xfc, +0xe8,0x40,0x3e,0xe7,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3f,0xe6,0xe0,0x6f,0x39,0xaa, +0xe2,0x0, 0xce,0x83,0xc5,0x9c,0x3d,0x6f,0x1, 0xe0,0xe0,0x0, 0x2f,0xd1,0xf8,0x0, +0x8b,0x85,0xf2,0x0, 0xcb,0x82,0x5, 0x86,0x17,0x80,0xe8,0x0, 0xaf,0x85,0xf0,0x0, +0x13,0x80,0xe0,0x0, 0x1f,0xc6,0xf0,0xb, 0x33,0xa2,0xf0,0x3, 0x1b,0x33,0xe0,0x0, +0x1e,0x4b,0xf0,0x1, 0x18,0xee,0xf0,0x1, 0x19,0x70,0xf0,0x1, 0x19,0xef,0xf0,0x1, +0x1a,0x6d,0x3d,0x9f,0x16,0x80,0xf0,0x40,0x3b,0xfd,0x1, 0x26,0x8f,0x8b,0xe0,0xc, +0x14,0x52,0xe4,0x32,0xc7,0xc8,0xe0,0x25,0x14,0xf6,0xe0,0x19,0x15,0x24,0x3c,0x1f, +0x3c,0x9f,0x3d,0x1f,0x3c,0x1c,0x3f,0x9c,0x3c,0x9c,0x3d,0x1c,0xf0,0x0, 0xbb,0x4e, +0xbf,0xde,0xbc,0x6e,0xe0,0x1, 0xbc,0x8e,0xbd,0x7e,0xc6,0x81,0xe2,0x1, 0xc6,0xff, +0xe2,0x0, 0xce,0x83,0xc7,0x1c,0xc5,0x81,0x1, 0xdf,0xe8,0x0, 0x87,0x5, 0xe0,0x2, +0x1f,0xea,0xaf,0xf, 0x8, 0xe1,0xf0,0x0, 0xbb,0x4e,0xf0,0x0, 0xb8,0xde,0xf0,0x0, +0xb9,0x6e,0xf0,0x1, 0xb9,0x8e,0xf0,0x0, 0xba,0x7e,0x0, 0xe8,0xe8,0x0, 0xac,0x85, +0xe7,0xff,0x0, 0xaf,0xe0,0x2, 0x1f,0x6a,0x16,0x81,0x17,0x80,0x8d,0x8e,0xe0,0x2, +0x1c,0xfb,0xe0,0x2, 0x1f,0x2c,0xe0,0x2, 0x1d,0x77,0xe0,0x8, 0x36,0xb8,0x3e,0x6d, +0xf0,0x40,0x3b,0xef,0x3d,0xff,0x1, 0x13,0x8e,0x89,0x3e,0xd8,0x26,0x83,0xe0,0x1, +0xae,0x7e,0x8e,0x8a,0x3e,0xd8,0x26,0x83,0xe0,0x1, 0xae,0x7e,0xc7,0x81,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xee,0x38,0x82,0xf0,0x1, 0xab,0xfe, +0x0, 0xf6,0xe0,0x2, 0x1f,0x6a,0xe0,0x2, 0x1d,0xac,0x16,0x81,0x17,0x80,0xe0,0x2, +0x1c,0xfb,0x8d,0xe, 0xe0,0x8, 0x36,0xb8,0x3f,0x6b,0x3e,0x6d,0xf0,0x40,0x3b,0xef, +0x3d,0x7f,0x1, 0x18,0x8e,0x89,0x3e,0xd8,0x26,0x85,0xe0,0x1, 0xae,0x6e,0xe0,0x1, +0xae,0x7e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xf1, +0x17,0x80,0xe0,0x1, 0xaf,0xeb,0x14,0x1, 0xe0,0x5, 0xaf,0xab,0xe0,0x8, 0xaf,0xeb, +0x38,0x82,0xf0,0x1, 0xab,0xee,0xf0,0x1, 0xab,0xfe,0x0, 0xec,0x8, 0xb7,0xf8,0x0, +0xc, 0x39,0xe0,0x2, 0x1a,0xac,0x11,0x81,0xe0,0x2, 0x1a,0x2b,0xf0,0x2, 0x1c,0x9e, +0x3b,0xe8,0x39,0x65,0xdf,0xa0,0x13,0x0, 0xf0,0x40,0x3c,0x63,0xe0,0x1, 0x8f,0xf2, +0x2f,0x98,0xc1,0x1c,0xef,0xfe,0xd5,0xe3,0x2c,0x2c,0x39,0x74,0x1, 0xf8,0x11,0x1, +0x23,0xc, 0x8f,0x85,0xe0,0x2, 0x1f,0x1e,0xe4,0x0, 0xc7,0x9c,0xa9,0xe, 0x3a,0x9f, +0xe0,0x1, 0x8c,0x5, 0xef,0xfc,0xd2,0xff,0x3c,0x62,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1, +0x3c,0x63,0xef,0xfd,0xd3,0x39,0xe0,0x1, 0x8c,0x2, 0xf8,0x0, 0xac,0x9, 0xef,0xfc, +0xd2,0xf2,0xe2,0x0, 0xcb,0x82,0x1, 0x1c,0xa4,0x52,0xe0,0x1, 0xa5,0x2, 0xa4,0xe2, +0x3d,0xe7,0xef,0xfa,0xd8,0xc3,0x3b,0x63,0xc1,0x1c,0xef,0xfe,0xd5,0xb8,0x24,0x56, +0x11,0x0, 0x23,0x63,0x8f,0x85,0x17,0x1, 0xe4,0x0, 0xc7,0x9c,0x3a,0x9f,0xe0,0x1, +0x8c,0x5, 0xe0,0x2, 0x1f,0x9e,0xaf,0xf, 0xef,0xfc,0xd2,0xd5,0x0, 0xd6,0xa4,0x72, +0x0, 0xe5,0x8, 0xb7,0xf8,0x0, 0xc, 0x3b,0x17,0xe, 0x3f,0x38,0xe0,0x3, 0x1f,0xac, +0x3a,0xe8,0x3f,0x9e,0xf0,0x0, 0x8c,0x3f,0x89,0x9f,0xef,0xfe,0xd5,0x2e,0xe2,0x0, +0xca,0x82,0xe0,0x1, 0x1a,0x6e,0xe0,0x1, 0x1f,0xed,0xe0,0x2, 0x19,0x2c,0xe0,0x2, +0x1b,0x2b,0xf0,0x1, 0x1d,0xef,0xf0,0x1, 0x1d,0x70,0xe8,0x3, 0x39,0xc8,0xf0,0x40, +0x3c,0xe8,0xe0,0x64,0x39,0x2f,0x13,0x81,0xf0,0x0, 0x14,0x0, 0xe0,0x1, 0x8f,0xf2, +0x27,0x8f,0xe2,0x0, 0xca,0x82,0x1, 0x23,0xa4,0xd2,0x3d,0xe7,0x3d,0x64,0x3c,0x69, +0xef,0xff,0xd0,0x95,0xf0,0x0, 0x2c,0x8b,0x29,0x91,0xf0,0x1, 0xac,0x72,0xc1,0x1c, +0x39,0x76,0x1, 0xed,0xf8,0x0, 0xd, 0xa8,0xb, 0xe1,0xa4,0xe2,0x3d,0xe7,0xe8,0x40, +0x3d,0x6a,0x3c,0x69,0xef,0xff,0xd0,0x83,0x21,0xf1,0xe0,0x1, 0xa4,0x82,0x3d,0xe7, +0xe8,0x40,0x3d,0x6b,0x3c,0x69,0xef,0xff,0xd0,0x7a,0x0, 0xe8,0xa4,0xf2,0x0, 0xde, +0xe0,0x2, 0x1f,0xfa,0x8f,0x8f,0x27,0xac,0xe0,0x0, 0x1f,0xbf,0x8f,0xf, 0xe0,0x0, +0x1f,0xf8,0x8f,0x8f,0x3f,0xfe,0xe0,0x0, 0x1, 0x47,0xe0,0x0, 0x1f,0xf7,0x8f,0x8f, +0x3f,0xfe,0xe0,0x0, 0x1, 0x43,0xe0,0x0, 0x1f,0xf6,0x8f,0x8f,0xe0,0x2f,0x3f,0x8e, +0x37,0xa1,0xe0,0x2, 0x1f,0x6a,0x8f,0xe, 0x3f,0x7f,0x1, 0x12,0x2c,0x12,0x17,0x1c, +0xe0,0x2, 0x1e,0xac,0x3f,0x3f,0xe2,0x0, 0xcc,0x82,0x3f,0x1d,0xa5,0x5e,0x1, 0x1e, +0xe0,0x1, 0x1f,0xf2,0x15,0x80,0xa4,0x8f,0x3c,0x69,0xe7,0xe0,0x0, 0xc8,0x38,0x82, +0x17,0x7e,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0x5, 0x97,0x15,0x1, 0xe0,0x2a,0x3c,0xa, +0x2d,0x5, 0x17,0x4, 0xe0,0x28,0x3c,0xe, 0x24,0x6c,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, +0x1f,0x2c,0x3f,0x9e,0xe0,0x1, 0xa5,0xf, 0x0, 0xe4,0xc7,0x81,0xe4,0x0, 0xc7,0x9c, +0x3f,0x9d,0xa5,0xf, 0x0, 0xde,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, 0x1f,0x2c,0x3f,0x9e, +0xa5,0x6f,0x0, 0xd7,0x17,0x80,0x0, 0xc6,0x17,0x81,0x0, 0xc4,0xe0,0x2, 0x1f,0xac, +0xe4,0x0, 0xc4,0x9c,0x17,0x1, 0x3c,0x9f,0xe0,0x1, 0x8c,0x9, 0xe0,0x2, 0x1f,0x9e, +0xaf,0xf, 0xe7,0x84,0x0, 0xa0,0x8, 0xb3,0xe0,0x2, 0x1f,0x66,0xe0,0x2, 0x19,0x9e, +0x17,0x80,0x8f,0xe, 0xaf,0x83,0x27,0xa, 0xe0,0x2, 0x19,0x2c,0x8f,0x32,0xe2,0x0, +0xcf,0x2, 0x1, 0x19,0xe2,0x0, 0xcf,0x3, 0x1, 0x2, 0x9, 0xe1,0x8c,0x52,0x8f,0x82, +0xe2,0x1, 0xcc,0x7f,0x1, 0x30,0x17,0x2, 0xe1,0x2f,0x3f,0x9e,0x2f,0x85,0xe1,0x2e, +0x3c,0x1e,0x2f,0x2, 0xdb,0x77,0x17,0x80,0xaf,0xc2,0x17,0xff,0xaf,0xd2,0x17,0x80, +0xaf,0xb2,0x9, 0xe1,0xe0,0x1, 0x1e,0x51,0x16,0x9c,0x8f,0xc, 0x3e,0xbe,0x3e,0x92, +0xe0,0x1, 0x8d,0x9d,0x25,0xe3,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x2, +0xe0,0x1, 0xaf,0x9d,0x2, 0x8d,0xaf,0xc, 0xe4,0x0, 0xc7,0x1c,0x17,0x81,0x3f,0x12, +0xe0,0x1, 0x8c,0xe, 0xaf,0x83,0xef,0xfc,0xd1,0xde,0x8f,0x32,0x0, 0xcc,0xaf,0x8c, +0x17,0x0, 0x0, 0xf3,0xe4,0x0, 0xc7,0x9c,0x17,0x1, 0x3f,0x92,0xe0,0x1, 0x8c,0xf, +0xaf,0x3, 0xef,0xfc,0xd1,0xd0,0x0, 0xd4,0xe0,0x2, 0x1f,0xac,0x8c,0x4f,0x38,0x82, +0xe0,0x2, 0x1f,0xfa,0x8f,0x8f,0xe0,0x0, 0x27,0xdf,0xe0,0x2, 0x1f,0xc0,0xe0,0x4, +0x8f,0xdf,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x57,0x8, 0xb5,0xe2,0x0, 0xcc,0x1, +0x39,0x68,0x39,0xe9,0x17,0x84,0x1, 0x9, 0xef,0xfe,0xd4,0x1f,0xe2,0x0, 0xcc,0x0, +0x17,0x2, 0xe0,0x6e,0x39,0x28,0x3f,0xee,0x39,0xff,0xe0,0x2, 0x1a,0x2c,0xe0,0x1, +0x1, 0x54,0x8f,0xb4,0x2f,0xa0,0xe0,0x0, 0x1e,0xa4,0xe0,0x0, 0x1d,0xa3,0x17,0x80, +0xe0,0x80,0x8e,0x1d,0x17,0x1, 0x3f,0x1f,0xe2,0x0, 0xce,0x1, 0xe2,0x1, 0xc7,0x7f, +0xe0,0x6f,0x39,0x2e,0x3d,0xfd,0x1, 0xf5,0xe2,0x0, 0xcf,0x87,0xea,0x12,0x7f,0xa8, +0xe0,0x1, 0x2, 0xe0,0x8f,0xf, 0xe2,0x0, 0xcf,0x1f,0x5, 0x85,0x17,0x20,0xaf,0xf, +0x17,0x80,0xaf,0xc4,0x3c,0xe2,0x3c,0x63,0xef,0xfd,0xd2,0x14,0x8a,0xb4,0xe2,0x0, +0xca,0x81,0xe0,0x1, 0x1, 0x5, 0xe2,0x0, 0xca,0x82,0x1, 0x94,0xe2,0x0, 0xc9,0x1, +0xe0,0x1, 0x1, 0x44,0x3c,0x62,0xef,0xfe,0xd3,0xe0,0xe2,0x0, 0xcc,0x0, 0x17,0x80, +0xe0,0x65,0x39,0x28,0x3c,0x65,0xe1,0x2f,0x39,0x8f,0x27,0x86,0xe1,0x29,0x39,0x88, +0x24,0x83,0xa, 0xe1,0x38,0x82,0x8f,0x94,0x16,0x9c,0x3e,0xbf,0xe0,0xc, 0x3a,0x1d, +0xe0,0x1, 0x87,0x1c,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, +0xaf,0x1c,0x5, 0xf0,0xe0,0x1, 0x1d,0xc7,0x9d,0x5c,0x9f,0xb, 0x3f,0x1a,0xe2,0xff, +0xcf,0x7e,0xe0,0x1, 0x5, 0x34,0xe0,0xff,0x17,0x7f,0xb7,0x5c,0x3e,0x94,0x9f,0xb, +0x9e,0x6d,0x3e,0x7e,0x3, 0x83,0x9f,0xb, 0xb7,0x6d,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x2, 0xac,0xaf,0x94,0x8d,0x84,0x3f,0xfb,0xe0,0x1, +0x1, 0x2c,0x8f,0xa4,0xe0,0x0, 0x1f,0x73,0x8f,0xe, 0x3f,0x7f,0x2, 0xcb,0x14,0x0, +0xe0,0x2, 0x1f,0x2c,0x3c,0xe8,0xe1,0xff,0x16,0x7f,0x3f,0xe8,0x9e,0xde,0x15,0x1, +0x3e,0xfc,0x3d,0x1f,0x3, 0x84,0x9c,0x6e,0x3c,0xef,0x3e,0x6d,0x3f,0xea,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xf2,0x3d,0xf9,0x1, 0x1a,0xe4,0x0, +0xc5,0x9c,0xe0,0xf, 0x3a,0x1b,0x9f,0xdf,0xe0,0xe, 0x37,0xc2,0xe4,0x0, 0xc7,0x3, +0x3f,0x7c,0x5, 0x8b,0xe0,0x0, 0x1f,0x75,0x8e,0x8e,0xe0,0x0, 0x1f,0x74,0x36,0xa8, +0x8f,0xe, 0x3f,0x4d,0x3f,0x78,0x2, 0x87,0x37,0xc1,0x3f,0xfc,0xe0,0x0, 0x2, 0xfc, +0xe0,0x1, 0x14,0xff,0x17,0x83,0xac,0xd4,0xaf,0xb4,0xa, 0xe1,0xe0,0x0, 0x1f,0xbb, +0xe0,0x6, 0x8f,0xdf,0xc7,0xff,0x3c,0x7f,0xe7,0xff,0x1, 0x8d,0x17,0x80,0x8e,0x84, +0xb7,0xd4,0x17,0x0, 0xb7,0xe4,0x16,0x7f,0xe0,0x1, 0xaf,0x94,0xe0,0x2, 0xb7,0xb4, +0xe0,0x2, 0xb7,0xc4,0xe0,0x4, 0xb7,0x94,0xe0,0x4, 0xb7,0xa4,0xe0,0x1, 0x1f,0xd1, +0xae,0x94,0xae,0x8f,0x17,0x82,0xaf,0x24,0xae,0x54,0xe0,0x4, 0xaf,0x54,0xe0,0x8, +0xaf,0x14,0xaf,0xb4,0xa, 0xe1,0x8f,0x34,0xe7,0xfe,0x2f,0x4e,0xea,0x12,0x7e,0xa9, +0x87,0x8d,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x93,0x2, 0xac,0xaf,0x8d, +0xe0,0x0, 0x1f,0x75,0xe0,0x1, 0x1e,0x47,0x8e,0x8e,0xe0,0x0, 0x1f,0x74,0x9e,0xc, +0x8f,0xe, 0x36,0xa8,0x3f,0x4d,0x3e,0x7e,0xe0,0x0, 0x1f,0x22,0x3f,0x9e,0x5, 0xa3, +0x17,0x1, 0xaf,0xf, 0xe7,0xfe,0x0, 0x91,0x17,0x85,0x14,0x4, 0xe7,0xfe,0x0, 0xc5, +0xe0,0x0, 0x1c,0x22,0x17,0x1, 0x16,0x80,0x15,0x14,0x14,0x80,0xae,0x8f,0xaf,0x44, +0xaf,0x34,0xe0,0x4, 0xd4,0xd9,0xe0,0x0, 0x1f,0x91,0xe0,0x2, 0x17,0x68,0xb7,0xf, +0xe7,0xfe,0x0, 0x9a,0xaf,0xd, 0x3f,0xee,0x0, 0xd4,0x9f,0xb, 0x3d,0x1e,0xb5,0x5c, +0xe7,0xfe,0x0, 0xce,0x17,0x0, 0xaf,0xf, 0xe7,0xfd,0x0, 0xef,0x17,0x80,0xaf,0x94, +0x17,0x80,0xe7,0xfe,0x0, 0xd4,0x87,0xa4,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xaf,0xa4, +0xe7,0xfe,0x0, 0xd2,0xe0,0x0, 0x1f,0xf5,0x3d,0x94,0x8f,0xf, 0xe0,0x0, 0x1f,0xf4, +0x37,0x28,0x8f,0x8f,0x9e,0xeb,0x3f,0xce,0x3e,0xff,0xe0,0x1, 0x17,0xff,0xe0,0x6f, +0x3a,0xa9,0x3c,0xef,0xe7,0xfe,0x0, 0xf8,0xe0,0x2, 0x1f,0xac,0xe0,0x1, 0x8f,0xf, +0x3f,0x78,0x1, 0xd, 0xe0,0x4, 0x8f,0x4f,0x3f,0x78,0x1, 0x9, 0xe0,0x8, 0x8f,0xf, +0x3f,0x78,0x1, 0x5, 0xe0,0x1, 0xac,0xf, 0x14,0x1, 0x38,0x82,0x14,0x0, 0x38,0x82, +0xe2,0x1, 0xcc,0x80,0xe0,0x2, 0x1f,0xac,0x1, 0x1f,0xe2,0x1, 0xcc,0x81,0x1, 0x2b, +0xe2,0x0, 0xcc,0x82,0x5, 0x82,0x14,0x80,0x8f,0x8f,0x3c,0xff,0x1, 0x4, 0xe2,0x0, +0xcf,0x82,0x5, 0x86,0xe0,0x2, 0x1f,0x93,0xe0,0x1, 0xac,0xaf,0x38,0x82,0x8, 0xb1, +0xc0,0x7c,0x3c,0x69,0x7c,0x81,0xd9,0xbe,0x64,0x81,0xe0,0x2, 0x1f,0x93,0xe0,0x1, +0xac,0xaf,0xc0,0x4, 0x8, 0xe1,0xe0,0x1, 0x8f,0xf, 0xe0,0x4, 0x8e,0xcf,0x14,0x80, +0x3f,0x7d,0x3, 0x9b,0xe0,0x8, 0x8e,0x8f,0x3e,0xfe,0x17,0x2, 0xe0,0x6e,0x3a,0xa9, +0x3c,0xee,0x0, 0xdb,0xe0,0x1, 0x8f,0xf, 0xe0,0x4, 0x8e,0xcf,0x14,0x80,0x3f,0x7d, +0x5, 0x89,0xe0,0x8, 0x8e,0x8f,0x3e,0xfe,0x17,0x2, 0xe0,0x6e,0x3c,0xa9,0x3c,0xee, +0x0, 0xcc,0x3f,0x6d,0x14,0x81,0x0, 0xf6,0x3f,0x6d,0x14,0x81,0x0, 0xe4,0x0, 0x0, +0x8, 0xb7,0xe0,0x2, 0x1f,0x7d,0x8f,0xfe,0x89,0x6e,0x8a,0x5e,0x27,0xad,0x12,0xff, +0x3a,0x9f,0xe2,0x1, 0xc2,0xff,0xe0,0x4c,0xc2,0xa7,0xe0,0x1, 0x1f,0xff,0x32,0xa1, +0xe0,0x1, 0x1b,0x64,0x39,0xe8,0x3a,0x9f,0xe0,0x0, 0x13,0x80,0x21,0x1e,0x14,0x0, +0x3f,0x67,0x3e,0x64,0xe3,0xff,0xc7,0x7f,0xe0,0x40,0x3f,0xe8,0xe0,0xd, 0x37,0x21, +0xc7,0x81,0x3e,0x93,0xe2,0x1, 0xc7,0xff,0x96,0x8d,0x39,0x7f,0x3f,0x1c,0x3c,0x1d, +0xe3,0xff,0xc7,0x7f,0x1, 0xf4,0x3c,0xe2,0xe0,0x4, 0xd3,0x82,0xe0,0x80,0xb4,0x16, +0x3a,0xf6,0xc3,0x81,0x1, 0xe4,0xb, 0xe1,0x3c,0x62,0x3c,0xe2,0xe0,0x4, 0xd3,0x78, +0xe0,0x80,0xb4,0x16,0x3a,0xf6,0xc3,0x81,0x1, 0xda,0x0, 0xf6,0xe0,0x0, 0x24,0xd3, +0x8, 0xb3,0x16,0x7f,0x3e,0x19,0xe2,0x1, 0xc6,0x7f,0x11,0x7e,0x39,0x18,0x36,0x21, +0x3e,0x18,0x39,0xe2,0xe0,0x0, 0x14,0x0, 0xe0,0x43,0x3d,0x9a,0xe0,0x80,0x97,0x13, +0xe4,0xd, 0x37,0xf, 0xe2,0xf, 0x3e,0xce,0x3f,0xad,0xe0,0x43,0x3f,0x9f,0x3f,0xfa, +0xe0,0x6f,0x3a,0x2b,0x3e,0x73,0x3c,0x1f,0x1, 0xf2,0xe0,0x4, 0xd3,0x51,0xe2,0x0, +0xcc,0x8, 0x15,0x88,0xe0,0x6b,0x3b,0x28,0xe7,0xfe,0x16,0x2f,0xe0,0x0, 0x15,0x6d, +0x0, 0x91,0xe0,0xe, 0x3f,0xab,0xe0,0x2d,0x3f,0xac,0xe0,0x43,0x3f,0x1e,0x26,0x99, +0xe0,0x2d,0x3e,0x1e,0x26,0x96,0xe0,0xf, 0x37,0x2, 0xe0,0x80,0xb7,0x92,0x39,0xf2, +0x1, 0x18,0xe0,0x0, 0x97,0x92,0xe2,0x0, 0xcf,0x87,0x2, 0x6c,0xe3,0xff,0xcf,0xf9, +0x3, 0x75,0xe0,0xe, 0x3d,0x9f,0xe0,0x2d,0x3f,0xac,0xe0,0x43,0x3f,0x1e,0x2e,0xe9, +0xe0,0x2f,0x3d,0x2f,0x27,0x84,0xe0,0x2f,0x3f,0x1a,0x2f,0xe6,0x3f,0xee,0x0, 0xe6, +0x9, 0xe1,0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x2, 0x1f,0xfd,0xe0,0x1, +0x1b,0x72,0x8a,0x6f,0xa4,0x86,0xe0,0x1, 0x1c,0x62,0xe7,0x0, 0x16,0x0, 0xe0,0xff, +0x15,0xff,0x15,0x0, 0x8a,0xff,0xef,0xfe,0xde,0x8, 0x22,0x2f,0xc2,0x7f,0xe2,0x1, +0xc2,0x7f,0xe0,0x4b,0xc2,0x6b,0xe0,0x1, 0x1f,0xff,0x32,0x21,0xe0,0x1, 0x19,0xe1, +0xe0,0x19,0x32,0xa1,0x3a,0x1f,0x11,0x0, 0xf0,0x0, 0x14,0x3, 0xe0,0x0, 0x13,0xda, +0xe0,0x80,0x97,0x93,0xe8,0x40,0x3c,0xe8,0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f, +0xe0,0x8, 0x3f,0xa8,0xe0,0x4, 0xd2,0xec,0xe2,0x0, 0xcc,0x5a,0xa7,0x86,0x3d,0x67, +0xe0,0x6a,0x3b,0x28,0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x3f,0x92,0x3c,0xe5,0xdf,0x6f, +0x3a,0x73,0xe8,0x2, 0x39,0x19,0x1, 0xe5,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xe1,0xff,0xc0,0x8, 0xe0,0x2, 0x1f,0xfd,0xf0,0x1, +0x1e,0x7f,0x8a,0x7f,0xe8,0x40,0x3c,0x6c,0x8b,0x6f,0xef,0xff,0xdf,0x1b,0xe0,0x0, +0x22,0x4f,0x13,0xff,0x3b,0x94,0x11,0xff,0xe2,0x1, 0xc3,0xff,0x39,0x96,0xe0,0x4c, +0xc3,0xa7,0xe2,0x1, 0xc1,0xff,0xf0,0x0, 0x14,0x4, 0xf0,0x18,0x3c,0x10,0x33,0xa1, +0x31,0xa1,0xe0,0x1, 0x1a,0xe4,0xe8,0x7, 0x3b,0x9c,0x32,0x21,0xe8,0x3, 0x39,0x98, +0xf0,0x0, 0x15,0x3, 0xf0,0x0, 0x14,0xda,0xf0,0x0, 0x15,0x80,0xe0,0x80,0x97,0x95, +0xe8,0x40,0x3c,0xea,0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f,0xe0,0x8, 0x3f,0xa8, +0xe0,0x4, 0xd2,0x9e,0xe2,0x0, 0xcc,0x5a,0xe8,0x40,0x3d,0x69,0xe0,0x6a,0x3b,0x28, +0xe3,0xff,0xc5,0x7f,0x23,0x21,0x11,0x2, 0x39,0x10,0x3f,0x62,0xe8,0x40,0x3f,0xec, +0x96,0x8f,0x3f,0x94,0xe0,0x80,0xb6,0x9e,0x3f,0x73,0x1, 0xfb,0x3c,0xe6,0xe8,0x40, +0x3c,0x68,0xdf,0x15,0xe8,0x40,0x3f,0xec,0xe0,0x80,0x97,0x12,0x39,0x73,0xb7,0xf, +0x3f,0x94,0x1, 0xfb,0x3a,0xf7,0xf0,0x0, 0xc6,0x2, 0x1, 0xd1,0xe0,0x0, 0xc0,0x78, +0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe8,0x40,0x3c,0xeb,0xe8,0x40,0x3c,0x68,0xde,0xff, +0x3a,0xf7,0xf0,0x0, 0xc6,0x2, 0x1, 0xc3,0x0, 0xf2,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x68,0xe0,0x3, 0x1f,0xc7,0xf0,0x2, 0x1e,0x7d,0x8f,0xf, 0xe8,0x0, +0x8e,0x4c,0xe8,0x0, 0x8e,0xdc,0xe2,0x0, 0xcf,0x1, 0x7e,0x4, 0x3a,0x68,0x7e,0x85, +0x39,0xe9,0xe0,0x2, 0x1, 0x77,0x8f,0x8f,0xe0,0x1, 0x1f,0x8, 0xe2,0x0, 0xcf,0x83, +0xe0,0x1, 0x1f,0x89,0x8f,0x8f,0xe0,0x2, 0x1, 0x73,0xf0,0x0, 0x8d,0xe, 0x37,0xa8, +0xf0,0x1a,0x3d,0x4f,0xf0,0x0, 0x7d,0x1, 0xe0,0x2, 0x22,0x1f,0x67,0x4, 0x12,0x80, +0x3f,0xee,0xc7,0xff,0x7f,0x86,0xf0,0x40,0x3f,0x65,0xf0,0x0, 0x1e,0x8d,0xf0,0x2, +0x1c,0xbc,0xe0,0x1, 0x1b,0xff,0x13,0x3, 0xe0,0x1, 0x29,0x8e,0xe8,0x0, 0x8f,0x8d, +0xf8,0x0, 0x8d,0x9d,0x3f,0xfe,0xe0,0x0, 0x1, 0x76,0xe8,0x0, 0x8f,0x9, 0xe2,0x0, +0xcf,0x1, 0xe0,0x1, 0x1, 0x7, 0xe8,0x0, 0x89,0x5c,0x66,0x1, 0x39,0x3f,0xe8,0x2, +0x39,0x1b,0xf0,0x40,0x3d,0xe2,0xf3,0xff,0xc5,0xff,0xf0,0xe, 0x35,0xa1,0x3f,0x17, +0x96,0x8e,0xe4,0x9, 0x36,0x8f,0xe2,0xe, 0x3c,0xcd,0x3f,0x29,0x3f,0x7c,0xe0,0x0, +0x2, 0x5a,0xe0,0x1, 0x2f,0x96,0x67,0x84,0x39,0x65,0xe2,0x0, 0xcf,0x81,0xe0,0x2, +0x2, 0x47,0xe2,0x0, 0xce,0x80,0xe0,0x1, 0x4, 0x26,0x3f,0xe5,0xe3,0xff,0xc7,0xff, +0x37,0xcf,0xe0,0x1, 0x27,0xad,0x3f,0xe2,0xe3,0xff,0xc7,0xff,0x37,0xcf,0xe0,0x1, +0x27,0xa7,0x17,0x8e,0xe8,0xf, 0x3f,0x9b,0x37,0xa1,0xe8,0xf, 0x3f,0x9c,0x9c,0xf, +0x3c,0xe6,0xe0,0x4, 0xd2,0x30,0x11,0x7c,0xe8,0x2, 0x39,0x1b,0xf0,0x40,0x3c,0x68, +0xf3,0xff,0xc4,0x7f,0xe3,0xff,0xc1,0x7f,0x17,0x7f,0xe8,0xe, 0x3f,0x1b,0xf0,0x40, +0x3d,0x6e,0xf3,0xff,0xc5,0x7f,0x17,0x8e,0xe8,0xf, 0x3f,0x9a,0x37,0xa1,0x3c,0xe6, +0xe8,0xf, 0x3f,0x9c,0xf0,0x2, 0x25,0x8e,0xf0,0x40,0x3d,0x72,0xe0,0x1, 0x1, 0x31, +0x9c,0xf, 0xe0,0x4, 0xd2,0x10,0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0x78,0xe0,0x1, +0x1, 0xfb,0xf8,0x40,0x3d,0xea,0x0, 0xe1,0x17,0xff,0x3f,0x92,0x39,0x6f,0xe2,0x1, +0xc1,0x7f,0xe0,0x1, 0x29,0x49,0x29,0x86,0x14,0x80,0xe8,0x40,0x3c,0x6e,0xe0,0x0, +0xdc,0x1d,0x16,0x1, 0xe8,0xc, 0x3e,0x1e,0xf0,0x40,0x3f,0x6c,0xf2,0x1, 0xc7,0x7f, +0xe8,0x40,0x3a,0x7e,0xf0,0x0, 0xc6,0x82,0xe0,0x1, 0x1, 0x7, 0xe8,0x0, 0x8f,0x4c, +0xe7,0xfe,0x21,0xf6,0xe8,0x7, 0x8f,0xcd,0xf8,0x7, 0x8d,0xdd,0xe7,0xfe,0x0, 0xf4, +0x27,0xe9,0xe0,0x1, 0x1e,0x42,0xe0,0xe, 0x8f,0x1c,0xc7,0x7f,0xe0,0x2e,0x3f,0xf, +0x2f,0x61,0xf0,0x2e,0x3d,0x8e,0x2f,0x5e,0xe0,0xe, 0x8f,0x2c,0xc7,0x7f,0xf0,0x40, +0x3d,0xfe,0x1, 0x58,0xe8,0x0, 0x89,0x5c,0x66,0x1, 0x39,0x3f,0xe8,0x2, 0x39,0x1b, +0xf0,0x40,0x3d,0xe2,0xf3,0xff,0xc5,0xff,0xf0,0xe, 0x35,0xa1,0x3f,0x17,0x96,0x8e, +0xe4,0x9, 0x36,0x8f,0xe2,0xe, 0x3c,0xcd,0x3f,0x29,0x3f,0x7c,0x2, 0x43,0x66,0x5, +0xf0,0x9, 0x3d,0xac,0x66,0x6, 0x34,0xa1,0x3e,0x7f,0x3c,0x97,0x91,0x9, 0xe0,0x1, +0x5, 0x38,0x64,0x85,0xe2,0x0, 0xcf,0x80,0xe8,0x9, 0x3c,0x9b,0x34,0xa1,0x3c,0x97, +0x92,0x89,0x3f,0xe5,0xe0,0x6f,0x39,0xa2,0xe2,0x0, 0xce,0x80,0x39,0x6f,0xe7,0xfe, +0x3, 0x5e,0xe0,0x41,0x3f,0x82,0xe3,0xff,0xc7,0xff,0x37,0xcf,0x27,0x88,0xe0,0x41, +0x3f,0x85,0xe3,0xff,0xc7,0xff,0x37,0xcf,0xe7,0xfe,0x2f,0xdd,0xe4,0x0, 0xc7,0xa, +0xe1,0xff,0x14,0x7e,0x3c,0x5e,0x14,0x9e,0xe0,0x4, 0xd1,0x8d,0xe4,0xe, 0x31,0xf, +0xe2,0xf, 0x3f,0x42,0x3f,0xae,0xe3,0xff,0xc4,0x7f,0xe3,0xff,0xc7,0xff,0xe1,0x2f, +0x3c,0x1f,0xe7,0xff,0x27,0x88,0xe4,0xe, 0x32,0x8f,0xe2,0xf, 0x3f,0x45,0x3f,0xae, +0xe3,0xff,0xc7,0xff,0xe1,0x2f,0x3c,0x1f,0xe7,0xfe,0x2f,0xbd,0x16,0x1, 0xe8,0xc, +0x3e,0x1e,0xf0,0x40,0x3f,0x6c,0xf2,0x1, 0xc7,0x7f,0xe8,0x40,0x3a,0x7e,0xf0,0x0, +0xc6,0x82,0xe7,0xfe,0x1, 0xfd,0xc0,0x18,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x79,0x3, +0xf0,0xd, 0x35,0x21,0xe8,0x0, 0x9f,0x5c,0xc6,0x9a,0x7f,0x2, 0xf0,0x1b,0x3e,0x1d, +0x11,0x1, 0xe8,0x80,0x9c,0x1b,0x3c,0xe6,0xe0,0x4, 0xd1,0x55,0xe3,0xff,0xc4,0x7f, +0xf0,0x40,0x3c,0x78,0xf0,0x0, 0x13,0x81,0x14,0x81,0xf0,0x17,0x3b,0x92,0xe8,0x9, +0x3c,0x9a,0xe7,0xfe,0x1, 0xc3,0x67,0x82,0xe8,0x40,0x3f,0xfa,0xf0,0x40,0x3d,0x69, +0xf3,0xff,0xc5,0x7f,0x5, 0x88,0xe8,0x40,0x39,0x67,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, +0xc9,0x5, 0x1, 0xe0,0x16,0xff,0x3e,0x92,0x67,0x83,0x66,0x3, 0xe2,0x1, 0xc6,0xff, +0x37,0xa1,0x3e,0x9c,0xc7,0xfe,0x36,0xa1,0x3f,0x97,0x3e,0x97,0x97,0x1f,0x37,0x2, +0xe0,0x80,0xb7,0x1f,0x3f,0xfd,0x1, 0xfb,0xe7,0xfe,0x29,0xad,0xe7,0xfe,0x0, 0xa6, +0xe0,0x1, 0x1f,0xd7,0x9f,0xaf,0x7f,0x81,0xe7,0xfd,0x0, 0x98,0x8c,0xe, 0x37,0xa8, +0x3c,0x4f,0x14,0x8a,0x34,0x23,0xe0,0x4, 0xd0,0xd3,0xe3,0xff,0xc4,0x7f,0x7c,0x1, +0xe7,0xfd,0x0, 0x8c,0xf0,0x0, 0x7d,0x83,0xf8,0x40,0x3d,0x6b,0xe7,0xff,0x0, 0xaa, +0xf8,0x40,0x3d,0x6b,0xf0,0x0, 0x7d,0x83,0xe7,0xff,0x0, 0xa4,0x67,0x85,0xe8,0xf, +0x3f,0x9b,0x37,0xa1,0x3f,0x97,0x92,0x8f,0x39,0x65,0xe7,0xfd,0x0, 0xb4,0x3e,0x62, +0xe0,0x6c,0x39,0xa5,0x3a,0xec,0xe7,0xfd,0x0, 0xae,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f, +0xe2,0x0, 0xcf,0x83,0x1, 0x2, 0x38,0x82,0x8, 0xb1,0xe0,0x1, 0x1f,0x7, 0xe0,0x1, +0x1f,0xd7,0x86,0x8e,0xe0,0x0, 0x17,0x5a,0xb7,0x1f,0xb7,0x2f,0xe7,0xff,0x17,0x26, +0xae,0x9f,0xb7,0x3f,0xef,0xfa,0xd9,0x6, 0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0x2c,0xa, +0xe0,0x0, 0x1f,0x8c,0x8c,0xf, 0x2c,0x2, 0x8, 0xe1,0x14,0x81,0x8, 0xa1,0xe7,0xfc, +0x0, 0xa7,0x14,0x80,0xde,0x24,0x0, 0xf5,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0x2, 0x38,0x82,0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0x24,0x7c,0x14,0x80, +0xe7,0xfc,0x0, 0x96,0x8, 0xb7,0xe1,0xff,0xc0,0x30,0x12,0x8c,0x3a,0x90,0xe0,0x0, +0x15,0x48,0x14,0x80,0x3c,0x65,0xe0,0x4, 0xd1,0xf, 0xef,0xfa,0xd8,0xdb,0xe0,0x2, +0x1f,0xe6,0xe0,0x2, 0x1a,0x7d,0x87,0x8f,0xe0,0x3, 0x8f,0x24,0xe2,0x0, 0xc7,0x81, +0x3f,0x7f,0xe0,0x2, 0x1, 0x45,0x87,0xa4,0x89,0x4, 0xe4,0xf, 0x37,0xa8,0xe4,0xe, +0x37,0xc8,0xe2,0x0, 0xcf,0x21,0xea,0x40,0xcf,0x0, 0xe0,0x6f,0x3b,0xae,0xe4,0xf, +0x37,0xc8,0x39,0xef,0xe0,0x2, 0x27,0xba,0xf7,0xff,0x12,0x7f,0xf0,0x14,0x3a,0x1f, +0xfa,0x4e,0x7b,0xf4,0xe0,0x1, 0x1f,0xf2,0x8d,0x54,0xf9,0xff,0xc3,0xff,0xf3,0xff, +0xc2,0x7f,0xf0,0x0, 0xa3,0xf, 0x3d,0xe2,0xf8,0x14,0x3a,0x17,0x35,0x21,0x17,0x80, +0xf0,0x40,0x3a,0xe5,0x25,0x9a,0x14,0x98,0x3c,0xbf,0xe8,0x40,0x3f,0x66,0xf0,0xf, +0x3a,0x99,0xe0,0x1, 0x9c,0x1f,0xa6,0x8f,0x17,0x80,0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x96,0xe, 0x3f,0xfb,0x3e,0x9c,0x3f,0x1a,0x1, 0xf9,0xf0,0xf, 0x3a,0x99,0xe0,0xe, +0x3d,0x98,0xbe,0x8f,0xe0,0x1, 0xb7,0x1f,0xf8,0x40,0x3a,0x77,0xf0,0x0, 0xc3,0x2, +0x1, 0x4, 0xe8,0x80,0x8f,0x97,0x0, 0xdf,0x64,0x3, 0x5c,0x8f,0x12,0x8c,0x3a,0x90, +0xe0,0x4, 0xd0,0x16,0xb4,0x65,0xe0,0x2, 0x9c,0xd5,0xa4,0x65,0xe0,0x4, 0xd0,0x10, +0xe0,0x2, 0xb4,0x25,0xe0,0x4, 0x9c,0x95,0xe0,0x1, 0xa4,0x45,0xe0,0x4, 0xd0,0x8, +0xe0,0x3, 0xb4,0x65,0xe0,0x0, 0x21,0xd9,0xf7,0xff,0x10,0xff,0xe0,0x1, 0x1f,0xf2, +0xfa,0x4e,0x79,0xf4,0xf0,0x11,0x38,0x93,0xf0,0x0, 0x8a,0x54,0xf9,0xff,0xc1,0xff, +0xf3,0xff,0xc0,0xff,0x3c,0xe2,0xf0,0x0, 0xa1,0xf, 0xe2,0x1, 0xc4,0xff,0xf8,0x11, +0x38,0x93,0xf0,0x14,0x32,0x21,0x15,0x0, 0x24,0xb7,0xe4,0x0, 0xc5,0x18,0xf0,0x0, +0x13,0x8, 0x3d,0x15,0xf0,0x0, 0x13,0x96,0x14,0x4, 0xf0,0x0, 0x92,0xea,0xf0,0x16, +0x3b,0x1a,0xf0,0x17,0x3b,0x9a,0x3c,0x1a,0xe8,0x40,0x3f,0x62,0x17,0x80,0xc5,0x14, +0x0, 0x8e,0xa5,0x88,0x96,0xa, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3e,0x9b,0xc6,0x1, +0x3f,0xf9,0xbe,0x88,0xe8,0xe, 0x3f,0x14,0xb6,0xa, 0x1, 0x16,0x96,0x8e,0xe8,0x40, +0x3e,0xf5,0x5, 0x70,0xe8,0x0, 0xa5,0x86,0xe8,0x0, 0x96,0x7, 0xc7,0x81,0xe3,0xff, +0xc7,0xff,0x3e,0x9b,0xc6,0x1, 0x3f,0xf9,0xe8,0x0, 0xbe,0x86,0xe8,0xe, 0x3f,0x14, +0xe8,0x0, 0xb6,0x7, 0x1, 0xec,0xf8,0x40,0x39,0xf1,0xf0,0x0, 0xc1,0x2, 0x1, 0x4, +0xe8,0x80,0x8d,0x13,0x0, 0xc2,0x13,0xc, 0x3b,0x10,0xe0,0x0, 0x13,0xd4,0x3b,0x90, +0x3a,0xe6,0xe0,0x1, 0x9f,0xa5,0x3c,0xef,0xe0,0x0, 0x27,0xfc,0xa4,0x15,0xe0,0x3, +0xdf,0x9f,0xb4,0x75,0xe0,0x1, 0x9f,0xb5,0x3c,0xef,0xe0,0x0, 0x27,0xef,0xa4,0x25, +0xe0,0x3, 0xdf,0x96,0xe0,0x1, 0xb4,0x5, 0xc2,0x98,0x3b,0xf5,0x1, 0xeb,0xe0,0x0, +0x1f,0x8d,0x17,0x4, 0x3f,0x10,0xe0,0x1b,0x95,0x1f,0x3d,0xee,0x17,0x80,0xe0,0x1, +0x14,0x16,0xe7,0xfe,0x14,0xea,0xe3,0xfe,0xcd,0x38,0xe0,0x0, 0x3, 0x45,0xe0,0x1, +0x9e,0xb6,0xe2,0x0, 0xce,0xe3,0x5, 0xbf,0xe0,0x1, 0x96,0x86,0xe0,0xc, 0x37,0xa1, +0xe3,0xfe,0xce,0xea,0xb6,0x8e,0x3e,0x1b,0x3, 0x3e,0xb4,0x8c,0xc7,0x81,0xe2,0x0, +0xcf,0x83,0xc3,0x18,0xc7,0x2, 0x1, 0xe8,0xe0,0x0, 0x21,0xc7,0xe0,0x1, 0x1f,0xf2, +0xea,0x4e,0x7a,0xf4,0xc1,0xff,0xe9,0xff,0xc2,0xff,0xe3,0xff,0xc1,0xff,0xa4,0x8f, +0xe2,0x1, 0xc1,0x7f,0x39,0x95,0x3c,0x65,0xe0,0x0, 0x17,0x80,0xe0,0xb, 0x3c,0x25, +0x21,0x15,0xe2,0x0, 0x7f,0x4, 0x37,0xa1,0x3f,0x9e,0x9d,0xf, 0x17,0x0, 0x8f,0xd4, +0x3f,0xbe,0xc7,0x1, 0x3f,0x9b,0x37,0xa1,0x3f,0x99,0x96,0x8f,0x3e,0x6e,0xe3,0xff, +0xc6,0x7f,0x3e,0xaa,0x3e,0x72,0xb6,0x8f,0x4, 0xf3,0x3c,0x73,0x1, 0x1d,0xe0,0x80, +0x8f,0x98,0x0, 0xe5,0x96,0xf6,0xe0,0xc, 0x37,0xa1,0xe3,0xfe,0xce,0xea,0xb6,0x8e, +0x3e,0x1b,0x4, 0x44,0xe2,0x1, 0xce,0x96,0xe0,0xd, 0x37,0xa1,0x3e,0x9b,0xe7,0xff, +0x5, 0x3f,0xb4,0xd, 0xe7,0xff,0x0, 0xbc,0xe0,0x1, 0xb7,0x85,0xe7,0xff,0x0, 0x96, +0xb7,0xf5,0xe7,0xff,0x0, 0x89,0xe0,0x0, 0xc0,0x50,0xb, 0xe1,0x14,0x80,0x3c,0x69, +0x39,0x69,0x39,0xe9,0xe7,0xfe,0x0, 0x84,0x3c,0xef,0x3c,0x6f,0x39,0xef,0xe7,0xfd, +0x0, 0xff,0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x1, 0x1c,0x7b,0xa4,0x8f,0xef,0xfe, +0xd9,0x8d,0xde,0x91,0xdb,0xf0,0xdc,0x35,0xe0,0x1, 0xd5,0x7d,0x2c,0x5, 0xe0,0x3, +0x1f,0xc0,0xac,0xf, 0x8, 0xe1,0xe0,0x3, 0x1f,0xc0,0x17,0x1, 0xaf,0xf, 0x8, 0xe1, +0xea,0x12,0x7f,0xb4,0xe0,0x1, 0x17,0x2a,0xe0,0x2e,0x3c,0xe, 0xa6,0x8f,0x27,0x2, +0x26,0x89,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1f,0x58,0x1, 0xe, 0x17,0xea,0xaf,0x8e, +0x38,0x82,0xe0,0x1, 0x1f,0x58,0x8e,0x8e,0xc6,0xff,0xae,0x8e,0x16,0x80,0xbe,0x8f, +0x17,0xea,0xaf,0x8e,0x38,0x82,0xe2,0x0, 0xcc,0x9, 0x1, 0xf9,0x16,0x82,0xbe,0x8f, +0x0, 0xee,0xe0,0x2, 0x1f,0xb6,0xea,0x12,0x7f,0x32,0x8c,0xf, 0xe0,0xd, 0x34,0x22, +0x9f,0x8e,0xc6,0x81,0x3f,0xfd,0x5, 0x4, 0xe0,0x1, 0x14,0x7f,0x38,0x82,0xc7,0x81, +0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xb7,0x8e,0x1, 0xb, 0xe2,0x0, 0xcf,0x82, +0x1, 0x76,0xe0,0x3, 0x1f,0x39,0xa7,0xe, 0x3f,0x9e,0xe0,0x40,0x8c,0x3f,0x38,0x82, +0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8c,0x3f,0x38,0x82,0xe0,0x2, 0x1e,0x93,0x17,0x6, +0xac,0xd, 0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f,0xe2,0x0, 0xc7,0x5, +0x27,0xc, 0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xc0,0x17,0x1, 0xe0,0x4, 0xaf,0x7f, +0x5, 0x8a,0x17,0x80,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1f,0xc0,0x17,0x3, 0xe0,0x4, +0xaf,0x7f,0x38,0x82,0x38,0x82,0x8, 0xb3,0x39,0xe9,0x2c,0x1d,0xe0,0x0, 0x1f,0x30, +0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0x3a,0xe0,0x2, 0x1e,0x93,0x17,0x6, 0xa9,0x8d, +0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f,0xe2,0x0, 0xc7,0x5, 0x2f,0x23, +0xe0,0x2, 0x1f,0xc0,0x17,0x3, 0xe0,0x4, 0xaf,0x7f,0x17,0x1, 0xe0,0x3, 0x1f,0x9a, +0xaf,0xf, 0x9, 0xe1,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0x39,0x68,0x5, 0xa1,0xe4,0x1, 0xcc,0x0, 0xe2,0x0, 0xcc,0x6f,0x5, 0xa3,0xe2,0x1, +0xc9,0x7c,0x1, 0x23,0xe2,0x1, 0xc9,0x7d,0x1, 0x19,0xe0,0x3, 0x1f,0x9a,0x17,0x1, +0xaf,0xf, 0x9, 0xe1,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xc0,0x17,0x1, 0xe0,0x4, +0xaf,0x7f,0x5, 0xf4,0x17,0x80,0xaf,0x8d,0x0, 0xf1,0xe0,0x2, 0x1f,0x66,0x8f,0xe, +0x2f,0x44,0x9, 0xe1,0x3c,0x69,0xdf,0x55,0x0, 0xe6,0xe0,0x0, 0x1f,0xad,0xa9,0x8f, +0x9, 0xe1,0xe0,0x0, 0xd8,0x73,0x0, 0xdc,0x3c,0x63,0x9, 0xa1,0xe7,0x7e,0x0, 0xe0, +0xe0,0x0, 0x24,0x52,0xe2,0x0, 0xcc,0x3, 0x2, 0x91,0xe0,0x0, 0x1f,0x9b,0x8f,0x8f, +0xe0,0x0, 0x2f,0xcf,0xe0,0x0, 0x1f,0x18,0xe0,0x2, 0x1e,0xb1,0x3f,0xee,0xbf,0xd, +0x3c,0x1f,0xe0,0x40,0x8f,0x98,0x3c,0x6f,0x38,0x82,0xe2,0x0, 0xcc,0x5f,0xe0,0x0, +0x5, 0xc8,0x17,0xad,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xc5,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xd5,0xe0,0x0, 0x17,0xe7,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x5, 0xe6,0xe7,0xff,0x17,0x80,0x3f,0x98,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f, +0xe2,0x0, 0xcf,0x6f,0x5, 0xb4,0xe2,0x1, 0xcc,0x7c,0xe0,0x1, 0x1, 0xb, 0xe2,0x1, +0xcc,0x7d,0xe0,0x1, 0x1, 0xd, 0xe2,0x1, 0xcc,0x7e,0xe0,0x1, 0x17,0xff,0x1, 0x8e, +0xe0,0x2, 0x1f,0xc8,0x17,0x5, 0x8f,0x8f,0x3f,0x3f,0xe0,0x3, 0x1f,0xb0,0x3f,0x9e, +0x8f,0x8f,0x0, 0x84,0xe0,0x2, 0x1f,0x93,0x8f,0x8f,0x3c,0x6f,0x38,0x82,0xe0,0x1, +0x1f,0x5a,0xe0,0x2, 0x1e,0xb1,0x3f,0xee,0xbf,0xd, 0xe7,0xff,0x0, 0xb3,0xe0,0x2, +0x1f,0xb1,0xa7,0x8f,0xe7,0xff,0x0, 0xae,0xe2,0x1, 0xcc,0x53,0x1, 0x11,0xe0,0x1, +0x1f,0x58,0x8f,0x8e,0xc7,0xff,0xaf,0x8e,0xe7,0xfd,0x0, 0xfd,0xe2,0x1, 0xcc,0x0, +0xe0,0x0, 0x1, 0x63,0xe0,0x2, 0x1f,0x40,0x3f,0x9e,0x8f,0x8f,0x0, 0xdf,0xea,0x12, +0x7f,0xb2,0x17,0x0, 0xb7,0xf, 0x0, 0xf1,0xe2,0x1, 0xcc,0x6b,0xe0,0x0, 0x1, 0x44, +0xea,0x12,0x7f,0x30,0x8e,0xe, 0x16,0x81,0x3e,0x9c,0xea,0x4f,0x7f,0x94,0xe2,0x1, +0xc6,0xff,0xe9,0xff,0xc7,0xff,0xe2,0x0, 0xce,0x83,0x3f,0x9c,0x8f,0x8f,0x1, 0x25, +0xae,0x8e,0x16,0xeb,0xe0,0x1, 0x1f,0x58,0xae,0x8e,0x0, 0xc0,0xe0,0x2, 0x1f,0x40, +0x16,0xe0,0xe0,0x2, 0x8f,0x8e,0x3e,0x9f,0xe2,0x0, 0xce,0x9f,0x2, 0x9d,0xe0,0x1, +0x1e,0xd3,0x3f,0x9d,0xe0,0x44,0x8f,0x8f,0xe0,0x2, 0x8e,0x8e,0xe2,0x1, 0xcc,0x1a, +0xc6,0x81,0xe0,0x2, 0xae,0x8e,0xe7,0xff,0x1, 0xaa,0xe0,0x1, 0x1f,0x58,0xe7,0xff, +0x16,0x99,0xae,0x8e,0xe7,0xff,0x0, 0xa3,0xea,0x12,0x7e,0xb4,0x16,0x0, 0xae,0xe, +0x17,0x0, 0xbf,0xd, 0x0, 0xd7,0xe0,0x2, 0x8e,0x8e,0xe0,0x1, 0x1f,0xc2,0x3f,0x9d, +0x8f,0x8f,0x0, 0xe3,0xea,0x12,0x7f,0xb0,0x17,0x1, 0xaf,0xf, 0x3f,0xe8,0x0, 0xca, +0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0xff,0xe7,0xff,0x0, 0x89,0xe0,0x0, 0x1f,0xad, +0x8f,0x8f,0xe7,0xff,0x0, 0x84,0xe7,0xda,0x0, 0xc6,0xe0,0x2, 0x1f,0x93,0x9f,0x8f, +0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x86,0xe2,0x0, 0xcf,0x84,0x1, 0x5, 0x14,0x0, +0x38,0x82,0xe7,0xfe,0x0, 0x9f,0xe7,0x6f,0x0, 0xe8,0xe0,0x2, 0x1f,0x93,0x9f,0x8f, +0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x85,0xe2,0x0, 0xcf,0x84,0x1, 0x4, 0x38,0x82, +0xe7,0xfd,0x0, 0xbb,0xe7,0x6a,0x0, 0xde,0x8, 0xb4,0xe0,0x0, 0x1f,0xbd,0xa1,0xf, +0xa7,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x97,0xa7,0x2, 0x17,0xfe,0x3f,0x5f,0xea,0x12, +0x7f,0xba,0xbf,0x2, 0x8f,0xf, 0x27,0x22,0xe0,0x0, 0x1a,0x30,0xe0,0x1, 0x19,0xd8, +0x17,0x81,0x8c,0xf2,0xaf,0x84,0x8c,0x3, 0xdf,0xd9,0x17,0x0, 0xaf,0x4, 0x8f,0x83, +0xc7,0x81,0xaf,0x83,0xa7,0x82,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x2f,0x82,0xa, 0x61, +0xa7,0x2, 0x16,0xfd,0xe0,0x1, 0x1f,0xd8,0x3f,0x5d,0xbf,0x2, 0x8f,0xf, 0xc7,0x1, +0xaf,0xf, 0x8c,0xf, 0xdf,0xb3,0xac,0x72,0xa, 0x61,0x17,0x1, 0xaf,0xf, 0x87,0x72, +0xe0,0x1, 0x1f,0xd8,0xaf,0xf, 0x8c,0xf, 0xdf,0xa9,0xac,0x72,0xa, 0x61,0xe0,0x0, +0x1f,0xbd,0x16,0x7e,0xa6,0x8f,0xea,0x12,0x7f,0xba,0xa7,0x3d,0x3f,0x5c,0xbf,0x3d, +0x17,0x0, 0xaf,0xf, 0x38,0x82,0x8, 0xb4,0xe0,0x1, 0x1a,0x5a,0xe0,0x2, 0x19,0x93, +0x11,0x0, 0x15,0x3e,0xe0,0x1, 0x14,0xff,0x3c,0x64,0xa9,0x3, 0xe0,0x3, 0xdd,0x9c, +0xe0,0x0, 0x1c,0x18,0x15,0x3e,0xe0,0x1, 0x14,0xff,0xe0,0x3, 0xdd,0x95,0xe0,0x2, +0x1f,0xb1,0xba,0xf, 0xef,0xfc,0xdc,0xd7,0xea,0x12,0x7f,0xba,0xe0,0x1, 0x1f,0x58, +0xa9,0xf, 0xe0,0x0, 0x1f,0xbd,0xa9,0xe, 0xa7,0x8f,0x81,0x83,0xa9,0xff,0xa, 0x61, +0x8, 0xb2,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x85,0xe0,0x0, 0x14,0xda,0x39,0x68, +0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x9c,0xe1,0xd, 0x14,0x6, 0xe0,0x3, 0xd6,0x7a, +0xe0,0x0, 0x14,0xff,0x3c,0xd8,0xe0,0x1, 0xcc,0x80,0xe1,0xd, 0x14,0x6, 0xe0,0x3, +0xd6,0x8f,0xe2,0x0, 0xc9,0x5a,0x1, 0x6, 0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x3, +0xd6,0x87,0xe0,0x0, 0x14,0xda,0x14,0x4, 0xe0,0x3, 0xd6,0x82,0xe0,0x0, 0x14,0xda, +0x14,0x5, 0x9, 0x21,0xe0,0x6c,0x0, 0xfc,0x8, 0xb4,0xe0,0x2, 0x19,0xb8,0x15,0x4, +0x3c,0xe3,0x14,0x0, 0xef,0xfd,0xd1,0xf6,0x9d,0x13,0x17,0xf8,0x3f,0x9a,0xe2,0x1e, +0xcf,0xf7,0x12,0x0, 0x2, 0x96,0x11,0x7e,0x39,0x1a,0xe3,0xff,0xc1,0x7f,0x3c,0xe3, +0x3d,0x62,0x14,0x2, 0x99,0x83,0xef,0xfd,0xd1,0xe5,0xe0,0x2, 0x1c,0x37,0x3d,0xe4, +0x3d,0x64,0xe0,0x9, 0x31,0x41,0x34,0x41,0xe0,0x3, 0xda,0xda,0xe0,0x24,0x39,0x88, +0x3c,0x64,0xa, 0x61,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x27,0x8f,0x8, 0xb2,0xe0,0x0, +0x19,0x37,0xdf,0xd3,0xac,0x2, 0x8f,0x82,0x2f,0x87,0xdf,0xcf,0xac,0x2, 0x8f,0x82, +0x2f,0x83,0xdf,0xcb,0xac,0x2, 0x9, 0x61,0x38,0x82,0x8, 0xb4,0xe0,0x2, 0x1f,0x91, +0x39,0xe8,0xa1,0xf, 0xe0,0x0, 0x14,0x50,0xa7,0x92,0xcf,0x90,0xbf,0x92,0xe0,0x3, +0xd6,0x19,0x3a,0x68,0xe0,0x0, 0x14,0xda,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x30, +0x3c,0xe3,0xe2,0x1, 0xc4,0xff,0xe1,0x20,0x14,0x0, 0xe0,0x3, 0xd6,0x29,0xe0,0x9, +0x31,0xc8,0xe2,0x0, 0xc4,0x83,0xe1,0x20,0x14,0x1, 0xe0,0x3, 0xd6,0x21,0x14,0x8a, +0xe1,0x23,0x14,0x4, 0xe0,0x3, 0xd6,0x1c,0xe2,0x0, 0xca,0x5a,0x1, 0x6, 0x14,0x80, +0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x14,0xa7,0x92,0x17,0x6f,0x3f,0xde,0xbf,0x92, +0xa, 0x61,0x8, 0xb4,0xe0,0x2, 0x1f,0x91,0xe0,0x0, 0x14,0x50,0xa1,0x8f,0xa7,0x93, +0xcf,0x90,0xbf,0x93,0xe0,0x3, 0xd5,0xe6,0xe0,0x0, 0x14,0xda,0x3a,0x68,0xe0,0x0, +0x14,0x50,0xe0,0x3, 0xd5,0xfd,0xe1,0x20,0x14,0x1, 0xe0,0x3, 0xd5,0xdb,0x39,0x68, +0xe1,0x20,0x14,0x0, 0xe0,0x3, 0xd5,0xd6,0x31,0x28,0xe2,0x6, 0xc1,0x0, 0xe2,0x0, +0xca,0x5a,0x39,0x48,0xe3,0xff,0xc1,0x7f,0x1, 0x6, 0x14,0x80,0xe0,0x0, 0x14,0x50, +0xe0,0x3, 0xd5,0xe6,0xa7,0x93,0x17,0x6f,0x3f,0xde,0x3c,0x62,0xbf,0x93,0xa, 0x61, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8a,0xe0,0x2, +0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0x5, 0x82, +0x38,0x82,0xe0,0x2, 0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xfa,0x8, 0xb2, +0xe0,0x3, 0x19,0x37,0x9f,0x82,0xe2,0x0, 0xcf,0x82,0x2, 0x82,0x9, 0x61,0xe0,0x0, +0x1f,0xaa,0x9c,0xf, 0xe0,0x3, 0xdc,0xd3,0xe0,0x3, 0xdc,0xd5,0xe0,0x0, 0x14,0xd3, +0xe0,0x3, 0xdc,0x25,0xeb,0xe6,0x7f,0x4, 0xe3,0xff,0xc4,0x7f,0xe0,0x1, 0x17,0xbc, +0x3f,0x98,0x9e,0x8e,0xe3,0xff,0xc7,0xff,0xea,0x12,0x7e,0x3c,0x3f,0xfd,0xb7,0x8c, +0x3, 0x98,0xc6,0xf9,0x3f,0xfd,0x4, 0xf, 0xe0,0x1, 0x17,0xb4,0x3f,0x98,0xe3,0xff, +0xc7,0xff,0xe2,0x1, 0xcf,0xbb,0x2, 0x86,0xe0,0x2, 0x17,0x87,0x3f,0x98,0xe3,0xff, +0xc7,0xff,0xb7,0x8c,0x3c,0x6f,0xb7,0x8e,0xdf,0x51,0x17,0x80,0xb7,0x82,0x9, 0x61, +0xc6,0x87,0x3f,0xfd,0x2, 0x78,0xe0,0x1, 0x17,0xc4,0x3f,0x98,0xe3,0xff,0xc7,0xff, +0xe2,0x2, 0xcf,0x8e,0x5, 0xef,0xe0,0x0, 0x17,0xf1,0x3f,0x98,0xe3,0xff,0xc7,0xff, +0xb7,0x8c,0x0, 0xe9,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81, +0x27,0x8a,0xe0,0x2, 0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x81,0x5, 0x82,0x38,0x82,0xe0,0x2, 0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0xfa,0x8, 0xb5,0x39,0x68,0xe0,0x1, 0x14,0x4e,0xdf,0x20,0xe0,0x3, 0x1a,0x37, +0x17,0x80,0xb7,0x84,0x11,0x83,0x12,0x90,0x21,0xc, 0x9f,0x84,0x3c,0x65,0xe2,0x0, +0xcf,0x82,0x2, 0x87,0xc1,0xff,0xe2,0x1, 0xc1,0xff,0xef,0xfd,0xd6,0x5f,0x29,0xf6, +0xa, 0xe1,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8b, +0xe0,0x2, 0x1f,0xba,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x1, 0x6, 0x27,0x8c,0xe2,0x0, +0xcf,0x81,0x1, 0xe, 0x38,0x82,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x7, 0x2f,0xf9,0xe0,0x1, 0x14,0xc8,0x14,0x0, 0xe0,0x69,0x0, 0xb6,0xe0,0x1, +0x14,0xc8,0x14,0x1, 0xe0,0x69,0x0, 0xb1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe0,0x1, +0x1f,0xdc,0xe0,0x2, 0x1f,0x23,0x16,0x0, 0xa7,0x8f,0xae,0xe, 0xe0,0x1, 0xa7,0xff, +0x37,0xc2,0xe2,0x0, 0xc7,0x81,0x27,0x95,0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1e,0xb1, +0xa7,0x8f,0xa6,0xd, 0xa6,0x9f,0xce,0x90,0xbe,0x9f,0xe0,0x0, 0x16,0xd4,0xb6,0xdc, +0x8e,0xfc,0x16,0x6f,0xe2,0x0, 0xc6,0x83,0xae,0x8e,0xa6,0x9f,0x3e,0xdc,0xbe,0x9f, +0xe0,0x2, 0x1b,0xe6,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x5d,0x8f,0xe, +0xe0,0x1, 0x27,0x1b,0xe0,0x0, 0x1f,0x37,0x8a,0xe, 0xe0,0x0, 0x22,0x72,0xe0,0x2, +0x1f,0x91,0x12,0x3, 0xa2,0x8f,0xe0,0x3, 0x1f,0xb1,0xe0,0x2, 0x19,0xb8,0xa1,0xf, +0xf0,0x0, 0x17,0x54,0xf0,0x40,0x3e,0xe4,0xf0,0x0, 0x14,0x50,0xf0,0x0, 0x16,0x5a, +0x13,0x5, 0xf7,0x24,0x15,0x82,0xf7,0x24,0x15,0x3, 0xf7,0x24,0x14,0x84,0xa7,0x95, +0xcf,0x90,0xbf,0x95,0x17,0xf8,0x9c,0x3, 0x3f,0x98,0xe2,0x1e,0xcf,0xf8,0xe0,0x1, +0x2, 0x96,0xf0,0x0, 0xb7,0x52,0xc4,0x7e,0xf0,0x0, 0xae,0xb2,0xe3,0xff,0xc4,0x7f, +0xf0,0x0, 0xb4,0x52,0xe2,0x0, 0xcc,0x8, 0xf0,0x0, 0xae,0x32,0xe0,0x0, 0x5, 0xeb, +0x16,0x80,0xf7,0xff,0x13,0xfd,0x3f,0x6d,0x17,0x88,0x3e,0x6d,0xf0,0x17,0x3b,0x98, +0x26,0x21,0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0xf0,0x40,0x3b,0x6c,0xe0,0xb, 0x39,0x9f, +0x8c,0x8b,0x15,0x83,0x15,0x1, 0x3d,0x9d,0xb7,0x52,0x3d,0x1e,0xe8,0x40,0x3d,0xf6, +0xc7,0x81,0x3f,0x6a,0xac,0xb2,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc7,0xff,0xe0,0x0, +0x3, 0x47,0xf0,0x2e,0x3b,0x9f,0xe0,0x0, 0x27,0x46,0xe1,0x2e,0x3c,0x1f,0xe0,0x0, +0x27,0x42,0xe0,0xc, 0x39,0x9f,0x8d,0xc, 0x8d,0xac,0x8f,0x1c,0x8e,0xbc,0x35,0x28, +0xe0,0xc, 0x35,0xa8,0x3e,0x9c,0x3f,0x1a,0xc7,0x84,0xe3,0xff,0xc7,0x7f,0xe3,0xff, +0xc6,0xff,0xe3,0xff,0xc7,0xff,0xf0,0x40,0x3b,0x66,0x16,0x5, 0x0, 0xd0,0xe0,0x2, +0x1f,0x11,0xa2,0x8e,0xe0,0x3, 0x1f,0x31,0xa1,0xe, 0xe0,0x0, 0x2f,0xcc,0xa7,0x15, +0xe0,0x0, 0x16,0xd0,0xcf,0x10,0xbf,0x15,0xe0,0x0, 0x16,0x5a,0xb6,0xd2,0xe7,0x24, +0x17,0x10,0xae,0x32,0xb7,0x52,0xaf,0xb2,0xb6,0xd2,0x17,0x6f,0xaf,0xb2,0xa7,0x95, +0x3f,0xde,0xbf,0x95,0x22,0x9, 0xdf,0x1e,0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e, +0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x3c,0x7f,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0xb5,0xd2,0xe7,0x24,0x16,0x5, 0x8f,0xf2,0xf0,0x0, 0xb5,0x52, +0xe4,0xd, 0x37,0xa8,0x8f,0xf2,0xf0,0x0, 0xb4,0xd2,0xe4,0xf, 0x37,0xa0,0x8f,0x72, +0xb6,0x52,0x3f,0x9d,0x8e,0xf2,0x37,0x28,0x3f,0x9d,0xa6,0x93,0x3f,0x9e,0xf0,0x0, +0xb4,0x52,0x17,0x0, 0x3f,0xfd,0xaf,0x32,0x1, 0x22,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xc2,0x7f,0xbf,0x95,0xe2,0x1, 0xc2,0x7f,0xe7,0xfe,0x2a,0x5b,0x8f,0x87,0xe7,0xff, +0x27,0xb8,0xa7,0x95,0xe0,0x0, 0x17,0x50,0xcf,0x90,0xbf,0x95,0xe0,0x0, 0x16,0x5a, +0xb7,0x52,0xe7,0x24,0x16,0x90,0xae,0x32,0x17,0x80,0xb6,0xd2,0xaf,0xb2,0xb7,0x52, +0xe7,0xff,0x0, 0xb5,0x86,0xe, 0xae,0xe, 0xe7,0xfe,0x0, 0xa3,0xe0,0x0, 0x17,0xf0, +0xb7,0xd2,0x16,0x2a,0xae,0x32,0x3c,0x66,0xef,0xfd,0xd5,0x28,0xe0,0x0, 0x16,0xf6, +0xb6,0xd2,0xe0,0x0, 0x17,0x75,0x8f,0xf2,0xb7,0x52,0x37,0xa8,0x8e,0xf2,0x9f,0x13, +0x3f,0x9d,0xe3,0xff,0xc7,0xff,0x3f,0x7f,0x1, 0xc9,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xbf,0x95,0x12,0x1, 0x8f,0x87,0x0, 0xcc,0x8, 0xb3,0x39,0x68,0xe0,0x0, 0x14,0x50, +0xe0,0x3, 0xd3,0xe0,0x39,0xe8,0xe0,0x0, 0x14,0xda,0xe0,0x0, 0x14,0x50,0xe0,0x3, +0xd3,0xf7,0x3c,0x62,0xe0,0x3, 0xd3,0x61,0xe2,0x0, 0xc9,0xda,0x39,0x68,0x1, 0x6, +0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd3,0xeb,0x3c,0x62,0x9, 0xe1,0x8, 0xb1, +0xc0,0x7c,0x15,0x2, 0x14,0x86,0x3c,0x90,0x3c,0x6a,0xef,0xfc,0xdf,0x63,0x5c,0x3, +0x15,0x2, 0xe2,0x0, 0x7c,0x84,0xef,0xfc,0xdf,0x5d,0x4f,0x4, 0x4f,0x85,0xe0,0xd, +0x3f,0x1f,0xe2,0x1, 0xce,0xff,0x1, 0x8, 0xe0,0x2, 0x1f,0xc0,0x17,0x7f,0xe0,0xc, +0xaf,0x4f,0xc0,0x4, 0x8, 0xe1,0xe0,0x2, 0x1f,0xc0,0xe0,0xc, 0xaf,0x4f,0xc0,0x4, +0x8, 0xe1,0xe0,0x0, 0x1f,0xad,0x8f,0x8f,0xe2,0x0, 0xcf,0xda,0x1, 0x2, 0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0xf8, +0xe7,0xfa,0x0, 0x90,0xe0,0x1, 0x1f,0xc2,0xe0,0xa, 0x8f,0xdf,0x27,0xb1,0xe0,0x1, +0x1f,0xc4,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, 0x1, 0x6b, +0x8f,0xef,0x37,0xa6,0xc7,0xff,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcc,0x3f,0x2, 0xa1, +0xe0,0x0, 0x1f,0xf2,0xe0,0x0, 0x1f,0x71,0x8f,0x8f,0x8f,0xe, 0xe0,0xd, 0x37,0xa8, +0x17,0xbf,0xe0,0x8, 0x3f,0xa8,0xe0,0xf, 0x3f,0x4d,0x3c,0x3f,0xe0,0x0, 0x1f,0xf0, +0x34,0x48,0x8f,0x8f,0x3c,0x7f,0x3f,0x6f,0xe0,0x6e,0x3d,0xa8,0x3f,0xae,0xe2,0x5, +0xcf,0xcf,0xe0,0x5, 0x14,0x4f,0xe0,0x68,0x3d,0xaf,0xe3,0xff,0xc4,0x7f,0x38,0x82, +0xe0,0x1, 0x1f,0x31,0xe0,0x1, 0x1e,0xb0,0x8f,0xe, 0xc7,0xc1,0x8e,0x8d,0x3c,0x7f, +0x37,0x28,0xe0,0xc, 0x3e,0xce,0x3, 0x3d,0xe0,0x0, 0x1f,0xef,0x8d,0x8f,0xe0,0x0, +0x1f,0xee,0x35,0xa8,0x8f,0xf, 0xe0,0x0, 0x1f,0xed,0x37,0x28,0x8e,0x8f,0xe0,0x0, +0x1f,0xec,0x3e,0xcb,0x8f,0x8f,0x3c,0x7d,0x3f,0xce,0xe0,0x0, 0x3, 0x45,0xe0,0x0, +0x1f,0x6b,0xc6,0xff,0x8d,0x8e,0xe0,0x0, 0x1f,0x6a,0x35,0xa8,0x8f,0xe, 0xe0,0x8, +0x3e,0xa8,0xe0,0xd, 0x3f,0x4b,0x3c,0x3d,0xc7,0xff,0x34,0x48,0x3f,0xa8,0xe0,0x0, +0x1f,0x70,0x8c,0xe, 0x3f,0xf8,0x4, 0xca,0xe0,0x0, 0x1f,0x69,0x8f,0xe, 0xe0,0xe, +0x3e,0x2e,0x3e,0xee,0xe3,0xff,0xc6,0xff,0x3f,0xfd,0xe0,0x6f,0x3a,0xae,0xe7,0xff, +0x0, 0xb8,0x8f,0xff,0x37,0xa6,0xc7,0xff,0xe3,0xff,0xc7,0xff,0xe7,0xff,0x0, 0x97, +0xe0,0x0, 0x1f,0x68,0xe0,0xf, 0x3c,0x2f,0x8e,0x8e,0xe0,0x0, 0x1f,0x67,0x36,0xa8, +0x8f,0xe, 0xe0,0x8, 0x3f,0x4d,0xe0,0x0, 0x1f,0x69,0x3f,0xb8,0x8f,0xe, 0x37,0xc8, +0x3f,0xfe,0x16,0xff,0x3e,0x9e,0xe0,0x6f,0x3b,0xad,0xe0,0xe, 0x3e,0x2e,0x3f,0x9e, +0xe7,0xff,0x0, 0x97,0xe0,0x0, 0x1f,0x66,0x3c,0x2d,0x8d,0x8e,0xe0,0x0, 0x1f,0x65, +0x35,0xa8,0x8f,0xe, 0xe0,0xd, 0x3f,0x4b,0x3c,0x3d,0xe0,0xd, 0x34,0x48,0x3f,0x9d, +0xe7,0xff,0x0, 0xbf,0xe0,0x1, 0x1f,0xc2,0x3e,0xe8,0xe0,0xa, 0x8f,0xdf,0x27,0xaa, +0xe0,0x1, 0x1f,0xc4,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, +0x1, 0x58,0x8f,0x7f,0x37,0x26,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe2,0x0, 0xce,0xbf, +0x2, 0x9a,0xe0,0x0, 0x1f,0xe4,0xe0,0x0, 0x1f,0x63,0x8f,0x8f,0x8c,0xe, 0x37,0xa8, +0x17,0x3f,0x3f,0x2d,0xe0,0xd, 0x3c,0x4f,0xe0,0x0, 0x1f,0xe2,0x3f,0x3d,0x8c,0xf, +0x37,0x8, 0x3f,0x78,0x3f,0xe8,0xe0,0x6f,0x3d,0x2e,0x3c,0x2f,0xe3,0xff,0xc4,0x7f, +0x38,0x82,0x38,0x82,0xe0,0x1, 0x1e,0x2e,0xe0,0x1, 0x1f,0xaf,0x8c,0xc, 0x16,0x41, +0x8f,0x8f,0x3e,0x1e,0x3e,0xfc,0x37,0xa8,0xe0,0xb, 0x3c,0x4f,0x3, 0x30,0xe0,0x0, +0x1f,0xe1,0x8e,0xf, 0xe0,0x0, 0x1f,0xe0,0x36,0x28,0x8c,0xf, 0xe0,0x0, 0x1f,0xdf, +0x34,0x28,0x8f,0xf, 0xe0,0x0, 0x1f,0xde,0x3f,0x4c,0x8f,0x8f,0x3e,0xfe,0x3f,0xc8, +0xe0,0x0, 0x3, 0x4a,0xe0,0x0, 0x1e,0x5d,0xe0,0x0, 0x1d,0x5c,0x8e,0xc, 0x8c,0xa, +0x36,0x28,0x3c,0x4c,0x3f,0x2d,0x3f,0x38,0x14,0x7f,0x3c,0x1f,0x37,0x8, 0x3c,0x2e, +0xe0,0x0, 0x1f,0xe2,0x8f,0x8f,0x3c,0x7f,0x3, 0x2b,0x3c,0x6f,0x38,0x82,0x8f,0x6f, +0x37,0x26,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe7,0xff,0x0, 0xaa,0x17,0xe2,0x3f,0x9e, +0x3e,0xff,0x14,0x0, 0xe7,0xff,0x3, 0x3f,0xe0,0x0, 0x1f,0xdb,0xe0,0x0, 0x1e,0x5a, +0x8f,0x8f,0x8c,0xc, 0xc7,0x40,0x37,0xa8,0xe0,0xe, 0x3e,0xae,0x3c,0x4f,0xe0,0x0, +0x1f,0xd9,0x3f,0x38,0x8f,0x8f,0x37,0x8, 0x3f,0x7f,0x16,0xff,0x3e,0x9f,0xe0,0x6e, +0x3b,0x2d,0xe0,0x8, 0x3d,0xaf,0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x38,0x82,0xe0,0x0, +0x1f,0xd9,0x8f,0x8f,0xe0,0xf, 0x3d,0xaf,0x3f,0xf8,0xe0,0x68,0x3d,0x2f,0xe3,0xff, +0xc4,0x7f,0x38,0x82,0xe0,0x0, 0x1e,0x58,0xe0,0x0, 0x1d,0x57,0x8e,0xc, 0x8c,0xa, +0x36,0x28,0x3c,0x4c,0xe0,0xe, 0x3e,0xae,0x3f,0x38,0xe0,0x8, 0x37,0x8, 0x3c,0x1f, +0xe7,0xff,0x0, 0xb8,0x8, 0xb5,0xe0,0x2, 0x1a,0xdf,0xe0,0x2, 0x1a,0x5e,0x8f,0x85, +0xe0,0x0, 0x2f,0xc5,0xe0,0x2, 0x1f,0x5d,0xe0,0x2, 0x1e,0xd5,0x8f,0xe, 0xaf,0x8d, +0xe0,0x0, 0x2f,0x4b,0xe0,0x1, 0x1f,0x8e,0x15,0xa, 0x89,0x8f,0xe0,0x2, 0x1c,0xde, +0x3d,0x33,0xe0,0x2, 0x1c,0x58,0xe0,0x3, 0xd8,0xed,0xe0,0x1, 0x1f,0xc2,0xe0,0xa, +0x8f,0xdf,0x27,0xab,0x21,0x96,0xc1,0xff,0xe2,0x1, 0xc1,0xff,0xc1,0x81,0xe4,0x0, +0xc1,0x8a,0xe0,0x2, 0x19,0x5e,0x39,0x94,0x9c,0x2, 0xc1,0xa, 0xde,0x84,0xe0,0x5, +0xb4,0x52,0xe0,0x40,0x9c,0x42,0xdf,0x27,0x39,0xf2,0xe0,0x5, 0xb4,0x62,0x1, 0xf5, +0xe0,0x19,0x9f,0x84,0xe2,0x2, 0xcf,0x81,0x1, 0x28,0xe2,0x2, 0xcf,0x80,0xe0,0x0, +0x1, 0x4c,0x8f,0x85,0x2f,0x8a,0xe0,0x0, 0x1f,0x34,0xb7,0x8e,0xe0,0x2, 0x1f,0x1b, +0xb7,0x8e,0xe0,0x1, 0x1f,0x59,0xaf,0x8e,0xa, 0xe1,0xe0,0x2, 0x1f,0x5d,0xe0,0x2, +0x1e,0xd5,0x17,0x81,0x8f,0xe, 0xaf,0x8d,0xe7,0xff,0x2f,0x3e,0xe0,0x2, 0x1f,0x5b, +0xaf,0x8e,0xe7,0xff,0x0, 0xb9,0xe0,0x2, 0x1f,0x54,0x16,0x81,0xae,0x8e,0xe0,0x2, +0x1f,0x53,0xaf,0x8e,0xe7,0xff,0x0, 0xb0,0xe0,0x0, 0x1f,0xb4,0xe0,0x2, 0x1f,0x1b, +0xe0,0x6, 0x9e,0x24,0x9f,0xe, 0xe0,0x6, 0x9e,0xb4,0x9f,0x8f,0xe0,0xe, 0x3e,0xae, +0xe0,0xf, 0x3e,0x2f,0xe4,0xa, 0x37,0x8f,0xe4,0xb, 0x37,0xf, 0xe2,0xf, 0x3d,0x4f, +0xe2,0xe, 0x3d,0xce,0x3f,0x2b,0x3f,0xaa,0x3f,0x9e,0xe0,0x0, 0x1f,0x26,0xe2,0x1, +0xcf,0x96,0xb6,0xe, 0xe0,0x0, 0x1f,0x20,0xb6,0x8e,0x5, 0x47,0xe0,0x1, 0x1f,0xd9, +0x17,0x1, 0xaf,0xf, 0xa, 0xe1,0xe0,0x6, 0x9f,0x24,0xe0,0x0, 0x1e,0xa6,0xe0,0x6, +0x9f,0xb4,0xb7,0xd, 0xe0,0x0, 0x1e,0xa0,0xb7,0x8d,0xe0,0x0, 0x1e,0xb4,0xb7,0xd, +0xe0,0x2, 0x1f,0x1b,0xb7,0x8e,0xa, 0xe1,0xe0,0x3, 0x1f,0x80,0x17,0x0, 0xb7,0x1f, +0xaf,0xf, 0xaf,0x1f,0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f, +0xe0,0x3, 0x2f,0xba,0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xf0,0x3, 0x18,0x0, 0xe8,0x0, +0x9f,0x90,0x2f,0x93,0xea,0x12,0x7f,0x47,0xe0,0x0, 0x19,0xe, 0xaf,0x8e,0x8f,0x82, +0xe0,0x0, 0x19,0x8d,0x2f,0x93,0xea,0x12,0x7f,0xc6,0x8f,0xf, 0x27,0x3, 0xc7,0x7f, +0xaf,0xf, 0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe0,0x0, 0x19,0xe, 0xc7,0xff,0xe8,0x0, +0xb7,0x90,0x8f,0x82,0xe0,0x0, 0x19,0x8d,0x27,0xef,0xe0,0x0, 0x1f,0x56,0xe0,0x0, +0x1e,0xd5,0x8f,0xe, 0xf0,0x0, 0x88,0x8d,0x37,0x28,0xf0,0x11,0x38,0xce,0xe0,0x1a, +0x97,0x73,0xf8,0x43,0x38,0x91,0xe0,0x2, 0x1e,0xfd,0xf0,0x40,0x38,0xfe,0x8c,0x4d, +0x8e,0x5d,0x5, 0xa, 0xe0,0x1, 0x1e,0xd7,0x37,0x1, 0xe0,0x3, 0x8e,0xbd,0xe2,0x0, +0xce,0x82,0xe0,0x71,0x39,0xae,0xf7,0xff,0x11,0x7f,0xf0,0x12,0x39,0x1f,0xe0,0x1, +0x1f,0xf2,0xf2,0x1, 0xc1,0x7f,0xa4,0x8f,0xe0,0x0, 0x1f,0xd4,0xf0,0x0, 0xc1,0x1, +0xf0,0x12,0x31,0x21,0x10,0xff,0x12,0x7f,0x8a,0x8f,0xf0,0x0, 0x1b,0xd, 0xf0,0x12, +0x39,0x13,0x38,0x98,0xe0,0x4, 0x3a,0x1c,0xf8,0x0, 0x8a,0x6, 0xf8,0x0, 0x89,0x96, +0xf0,0xf, 0x3a,0x3c,0xe8,0xf, 0x3f,0x93,0x37,0xa1,0x3f,0x99,0x95,0x8f,0xe8,0x40, +0x3d,0xf1,0xe0,0x2, 0x4, 0x1a,0xf1,0x2f,0x3a,0x28,0xe0,0x2, 0x2f,0x96,0xf1,0x2d, +0x39,0xac,0xe0,0x2, 0x2e,0x92,0xe8,0x43,0x3b,0x3, 0xf0,0x0, 0x12,0x81,0xe2,0x0, +0xcb,0x0, 0xe0,0xa, 0x35,0x82,0xe0,0xf, 0x35,0x81,0xf8,0x15,0x3a,0x94,0xf8,0x43, +0x3b,0x84,0x3d,0x1f,0xf2,0x1, 0xc2,0xff,0xf0,0x40,0x3c,0xe6,0xf8,0x40,0x3d,0x67, +0xe0,0x0, 0x4, 0x75,0xf2,0x0, 0xcb,0x80,0x4, 0x37,0xe8,0x40,0x3f,0x67,0x13,0x80, +0x0, 0x92,0x27,0xa7,0xe8,0x40,0x3e,0xe8,0xe8,0x40,0x3b,0xec,0xe3,0xff,0xc6,0xff, +0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3d,0x6e,0xc7,0x7f,0xe0,0x43,0x3f,0xe, 0xe3,0xff, +0xcf,0x7f,0x1, 0x1a,0xe0,0xf, 0x3f,0x3c,0xf0,0x0, 0x14,0x1, 0xe8,0xf, 0x3f,0x99, +0x37,0xa1,0x3f,0x99,0xe0,0x0, 0x97,0x8f,0xf0,0x0, 0x16,0x1, 0xe0,0x3b,0x3f,0xaa, +0xf0,0x18,0x3c,0x1d,0xf0,0x1c,0x3e,0x17,0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2d,0xdb, +0xe8,0x40,0x3f,0x7a,0x2, 0x62,0x23,0x88,0xf1,0xff,0xc4,0xff,0xf8,0x43,0x3c,0x89, +0xf3,0xff,0xcc,0xff,0x1, 0xc8,0xf0,0x40,0x3a,0x71,0x3, 0x38,0xf8,0x40,0x3c,0xe5, +0xe8,0x40,0x3c,0x75,0x5, 0xb3,0xe8,0x40,0x3f,0x65,0x13,0x80,0x0, 0x91,0x27,0xa4, +0xe8,0x40,0x3e,0xe8,0xe8,0x40,0x3b,0xeb,0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff, +0xf0,0x40,0x3c,0xee,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0x7e,0x5, 0x98,0xe0,0xf, +0x3f,0x3c,0xf0,0x0, 0x14,0x1, 0x3f,0x96,0x37,0xa1,0x3f,0x99,0x97,0x8f,0xf0,0x0, +0x15,0x81,0xe0,0x3a,0x3f,0xaa,0xf0,0x18,0x3c,0x1d,0xf0,0x1b,0x3d,0x97,0xe0,0x2f, +0x3d,0xaf,0xf7,0xff,0x2d,0x5e,0xe8,0x40,0x3f,0x79,0x4, 0xe5,0x23,0x87,0xc3,0x7f, +0xe0,0x43,0x3b,0x6, 0xe3,0xff,0xcb,0x7f,0x1, 0xcc,0xf0,0x40,0x39,0xf4,0xe0,0x1, +0x3, 0x1, 0x13,0x1, 0xe8,0x6, 0x3b,0x13,0xe2,0x1, 0xc3,0x7f,0xe0,0x40,0x3e,0x76, +0xf0,0x40,0x3c,0xe6,0xf8,0x40,0x3d,0x67,0xe0,0x0, 0x5, 0xf4,0xf2,0x0, 0xcb,0x80, +0x4, 0x37,0xe8,0x40,0x3f,0x67,0x13,0x80,0x0, 0x92,0x27,0xa7,0xe8,0x40,0x3e,0xe8, +0xe8,0x40,0x3b,0xec,0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3d,0x6e, +0xc7,0x7f,0xe0,0x43,0x3f,0xe, 0xe3,0xff,0xcf,0x7f,0x1, 0x1a,0xe0,0xf, 0x3f,0x3c, +0xf0,0x0, 0x14,0x1, 0xe8,0xf, 0x3f,0x99,0x37,0xa1,0x3f,0x99,0xe0,0x0, 0x97,0x8f, +0xf0,0x0, 0x16,0x1, 0xe0,0x3b,0x3f,0xaa,0xf0,0x18,0x3c,0x1d,0xf0,0x1c,0x3e,0x17, +0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2d,0xdb,0xe8,0x40,0x3f,0x7a,0x2, 0x62,0x23,0x88, +0xf0,0x0, 0xc4,0x81,0xf2,0x1, 0xc4,0xff,0xe8,0x40,0x3e,0x79,0x2, 0xc8,0xf0,0x40, +0x3a,0x71,0x3, 0x37,0xf8,0x40,0x3c,0x65,0xe8,0x40,0x3c,0x75,0x5, 0xb2,0xe8,0x40, +0x3f,0x65,0x13,0x80,0x0, 0x91,0x27,0xa4,0xe8,0x40,0x3e,0xe7,0xe8,0x40,0x3b,0xea, +0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3c,0x6e,0xc7,0x1, 0xe2,0x1, +0xc7,0x7f,0x3c,0x7e,0x5, 0x98,0xe0,0xf, 0x3f,0x3c,0xf0,0x0, 0x13,0x81,0x3f,0x96, +0x37,0xa1,0x3f,0x99,0x97,0x8f,0xf0,0x0, 0x15,0x1, 0xe0,0x39,0x3f,0xaa,0xf0,0x17, +0x3b,0x9d,0xf0,0x1a,0x3d,0x17,0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2c,0xde,0xe8,0x40, +0x3f,0x78,0x4, 0xe5,0x23,0x86,0xc3,0x1, 0xe2,0x1, 0xc3,0x7f,0x3e,0x76,0x2, 0xcd, +0x3a,0xfd,0xe0,0x0, 0x5, 0xd3,0xf0,0x0, 0xc3,0x2, 0xf8,0x40,0x39,0x76,0xe7,0xfd, +0x1, 0xd5,0xe8,0x0, 0x9f,0x90,0x27,0x88,0xc7,0xff,0xe8,0x0, 0xb7,0x90,0xea,0x12, +0x7f,0xc7,0x17,0x1, 0xaf,0xf, 0xe0,0xf, 0x3e,0x38,0xe0,0x1a,0x9f,0x53,0xe0,0x1a, +0x9e,0xe3,0xe0,0xc, 0x37,0x81,0xe0,0xb, 0x3f,0x1d,0x3d,0xfc,0x2, 0x1d,0x37,0x82, +0xe0,0x2d,0x3e,0x9f,0x2e,0x99,0xe0,0x2f,0x3f,0x1f,0x2f,0x96,0xea,0x12,0x7f,0xc7, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x10,0xea,0x12,0x7e,0xc5,0x8f,0x8d,0xe2,0x0, +0xcf,0x81,0xe7,0xfc,0x1, 0xe8,0xea,0x12,0x7f,0xc6,0x8f,0xf, 0x2f,0xc, 0xaf,0xd, +0xe7,0xfc,0x0, 0xe1,0x38,0x82,0xea,0x12,0x7f,0x45,0xea,0x12,0x7f,0xc6,0x16,0x81, +0xae,0x8e,0x17,0x14,0xc7,0x7f,0x8e,0x82,0xaf,0xf, 0xe7,0xfc,0x26,0xd4,0x11,0x80, +0x3a,0x63,0x3c,0x63,0x3c,0xe4,0xd0,0x99,0xc1,0x81,0x8f,0x82,0xe2,0x1, 0xc1,0xff, +0x3f,0xf3,0x2, 0xf8,0xe7,0xfc,0x0, 0xc7,0xe0,0x0, 0x1f,0xd3,0x8f,0xf, 0xe0,0x0, +0x1f,0xd2,0x37,0x28,0x8f,0x8f,0xf8,0x0, 0xaa,0x0, 0x3f,0xce,0xf8,0x0, 0xa9,0x90, +0xe8,0x0, 0xb7,0x90,0xe7,0xff,0x0, 0xad,0xe0,0x0, 0x1e,0x4e,0x8f,0x8c,0x2f,0x97, +0xea,0x12,0x7f,0xc8,0x9e,0x8f,0xe0,0x1, 0x1f,0x57,0x2e,0x8a,0xe0,0x1, 0x1e,0x89, +0x8e,0xd, 0xe0,0x1, 0x1e,0x88,0x36,0x28,0x8e,0x8d,0x3e,0xcc,0xb6,0x8f,0xe0,0x2, +0x1e,0xdf,0x8e,0x8d,0x26,0xa0,0x97,0x8f,0xb7,0x9e,0x38,0x82,0xe0,0x2, 0x1f,0xc0, +0xe0,0x1, 0x1f,0x57,0x8e,0x8f,0x8c,0x1f,0x8c,0xaf,0x8d,0x3f,0x8d,0xdf,0xea,0x12, +0x7f,0xc8,0x36,0xa5,0x34,0x25,0x34,0xa5,0x35,0x25,0x35,0xa5,0xf0,0x0, 0x13,0x80, +0xf0,0x0, 0xab,0x8c,0xb6,0x9e,0xb4,0x2e,0xb4,0xce,0xb5,0x5e,0xe0,0x1, 0xb5,0x9e, +0xb6,0x8f,0x0, 0xd4,0xe0,0x0, 0x1f,0xfa,0x8e,0x8f,0xe0,0x0, 0x1f,0xf9,0x36,0xa8, +0x8f,0x8f,0x3f,0xcd,0xb7,0x9e,0x38,0x82,0x17,0xdd,0x3f,0x98,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x8c,0x2, 0x9b,0x17,0x1, 0xe0,0xf, 0x37,0x3f,0xe2,0x30,0xc7,0xa9, +0x2f,0x9d,0xe2,0x0, 0xcc,0x25,0x1, 0x92,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f,0x3f,0xfe, +0x1, 0x16,0xe0,0x2, 0x1f,0x40,0x17,0x81,0xe0,0x4, 0xac,0xde,0xe0,0x0, 0x1f,0x4e, +0xaf,0x8e,0xe0,0x2, 0x1f,0x60,0xaf,0x8e,0x38,0x82,0xe0,0x2, 0x1f,0xc0,0x17,0x1, +0x3c,0x1f,0xe0,0x0, 0x1f,0xce,0xac,0x88,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xe6, +0x8f,0x8f,0x2f,0xe8,0x0, 0xfb,0xe0,0x0, 0x1f,0xd, 0xe0,0xf, 0x34,0x43,0x3f,0x1f, +0xe0,0x0, 0x1f,0xc7,0xe2,0x0, 0xc4,0x7, 0x3f,0x98,0x87,0x8f,0xe0,0xf, 0x84,0xe, +0x3c,0x5f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x17,0x7, 0xe0,0x0, 0x1f,0xc7,0x3f,0x58, +0x3f,0x9e,0xe0,0x0, 0x1f,0xd, 0x34,0x43,0x3c,0x1e,0x8f,0x8f,0xe0,0xf, 0x87,0x8, +0x2c,0x86,0xe3,0xf, 0x3f,0x5f,0xe0,0xf, 0xaf,0x88,0x38,0x82,0x3f,0xce,0xe0,0xf, +0xaf,0x88,0x38,0x82,0xe0,0x0, 0x1f,0x8d,0xe0,0x2, 0x1f,0x7d,0x34,0x21,0x3c,0x1f, +0x8f,0x88,0x8e,0xde,0x8f,0x18,0x3f,0xbd,0x3f,0x9e,0xe0,0x1, 0x1f,0x72,0x37,0xa1, +0xa7,0xe, 0x3f,0x9e,0x94,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xfd,0xe0,0x1, 0x1f,0x57, +0x8e,0xef,0x9f,0x9e,0x3e,0xf8,0x2, 0x82,0x9f,0xce,0xe0,0x2, 0x1f,0x3c,0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0x1, 0x3, 0x3c,0x6f,0x38,0x82,0x2c,0x5, 0xe0,0x1, 0x17,0x87, +0x3c,0x6f,0x38,0x82,0xe0,0x1, 0x1e,0xc2,0xe0,0xe, 0x8f,0x1d,0xc7,0x7f,0xe0,0x28, +0x3f,0x8, 0x2c,0x75,0xe0,0x28,0x3c,0x88,0x2c,0x72,0xe0,0xe, 0x8f,0x2d,0xc7,0x7f, +0x3c,0xfe,0xe0,0x1, 0x17,0x7, 0xe0,0x6e,0x39,0xaf,0x3f,0xee,0x0, 0xe5,0x0, 0x0, +0xf0,0x0, 0x1a,0x8e,0xe8,0x0, 0x8e,0x5, 0x26,0x3d,0x16,0x0, 0xe0,0x0, 0x1d,0x8d, +0xf0,0x0, 0x1b,0x47,0xe0,0x40,0x3f,0xec,0xe0,0xd, 0x37,0xc3,0x15,0x7, 0x3d,0x5f, +0xe2,0x0, 0xc6,0x9f,0x3e,0x9b,0xe8,0xa, 0x3d,0x16,0x85,0xa, 0xe0,0xf, 0x86,0x8d, +0xe0,0xe, 0x37,0xa1,0x3e,0xda,0xe0,0x17,0x3d,0x9e,0x14,0x7, 0xe0,0xe, 0x36,0x43, +0xe0,0x9, 0x36,0x21,0x3c,0x5c,0xe2,0x0, 0xc7,0x1f,0xc7,0x81,0x15,0x1, 0xe2,0x1, +0xc6,0xff,0x3c,0x9b,0x3f,0x1b,0xe8,0x8, 0x3c,0x16,0xe2,0x1, 0xc7,0xff,0x3d,0x1c, +0x26,0x8d,0xe8,0x0, 0x9e,0x7, 0x86,0x88,0xb6,0x9, 0x3e,0x6a,0xe0,0xf, 0x85,0xe, +0xe2,0x1, 0xc6,0x7f,0x3e,0xca,0xe0,0xf, 0xae,0x8e,0xe8,0x0, 0x8f,0x5, 0x3f,0x7f, +0x2, 0xcc,0xe8,0x0, 0xae,0x5, 0x38,0x82,0x8, 0xb5,0xe0,0x0, 0x19,0x41,0xe0,0x3, +0x1a,0x45,0x17,0x81,0xe0,0x1, 0x19,0xd2,0xaf,0x82,0xaf,0x84,0x17,0x80,0xaf,0x83, +0xef,0xff,0xdf,0xb0,0xe0,0x0, 0x1f,0x8e,0xe0,0x0, 0x1c,0x8d,0x8d,0xf, 0xe0,0x1, +0x25,0x46,0xf7,0xff,0x13,0xff,0xe0,0x2, 0x1f,0xfd,0xf0,0x17,0x3b,0x9a,0xf2,0x1, +0xc3,0xff,0xf0,0x0, 0x89,0x4f,0xe0,0x1, 0x1f,0x72,0xf0,0x0, 0xc3,0x81,0xf0,0x0, +0x11,0x80,0xf0,0x17,0x33,0xa1,0x12,0xfe,0xa0,0x8e,0xe8,0x5, 0x3a,0x92,0xf0,0x0, +0x88,0x5f,0xf0,0x0, 0x88,0x82,0x8d,0x84,0x3f,0x69,0xf0,0x17,0x3b,0x99,0xe8,0x40, +0x3e,0xe3,0xe8,0x40,0x3e,0x63,0xf8,0x40,0x3b,0x63,0xf1,0xff,0xc1,0x7f,0xf0,0x0, +0x12,0x1, 0xf8,0x40,0x3a,0xe3,0x0, 0xb1,0x3f,0xf5,0x14,0x1, 0xe8,0x8, 0x3c,0x16, +0x3, 0x38,0xf0,0x40,0x3b,0x68,0xf2,0x1, 0xc3,0x7f,0xf0,0x40,0x39,0x7f,0xe8,0x40, +0x3c,0x64,0xe8,0x68,0x3d,0x23,0xf0,0x40,0x39,0x7f,0xf0,0x40,0x39,0xe8,0xe8,0x40, +0x3c,0x65,0xe8,0x68,0x3d,0x21,0xf0,0x40,0x38,0xe8,0x8c,0x1e,0xe8,0xf, 0x3f,0xb0, +0xc7,0x2, 0x3f,0x98,0x37,0xa1,0x3f,0x91,0x97,0x8f,0xe8,0x40,0x3c,0x64,0xe2,0x3, +0xcf,0xf3,0xe8,0x40,0x3f,0xe5,0xe0,0x68,0x3a,0x2d,0xe0,0x6f,0x3a,0x2b,0xf0,0x40, +0x3b,0xfe,0x3e,0xe8,0x3d,0xef,0x1, 0x15,0x8f,0x8e,0xe2,0x0, 0xcf,0x82,0x2, 0xcd, +0x14,0x1, 0x3c,0x1c,0x1, 0xa, 0x3e,0x68,0xe2,0x1, 0xc6,0x7f,0x27,0xdf,0x0, 0xce, +0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0x0, 0xca,0xe2,0x0, 0xca,0x82,0x5, 0x75,0x0, 0xc6, +0xe0,0x0, 0x2c,0x7d,0xf0,0x0, 0x29,0xf7,0x8f,0x4, 0xf1,0xff,0xc3,0x7f,0xe2,0x0, +0xcf,0x1, 0xe0,0x0, 0x1, 0x63,0x17,0x1, 0xf2,0x1, 0xc3,0x7f,0xe9,0x2f,0x3f,0x26, +0xe1,0x2c,0x3e,0x1e,0x3e,0x5f,0xe0,0x0, 0x26,0x46,0xe0,0x3, 0x1f,0x86,0x16,0x80, +0x87,0xf, 0xae,0x82,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xaf,0xf, 0xe0,0x0, 0x27,0x43, +0x17,0x0, 0xaf,0xf, 0x17,0x81,0xaf,0x83,0xe0,0x3, 0x17,0x74,0xe0,0x3, 0x1f,0xb5, +0x10,0x81,0xb7,0xf, 0x25,0x2a,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, 0x1e,0xd, 0x89,0x4f, +0xe0,0x0, 0x1c,0x47,0xc1,0x7f,0x17,0x80,0xe0,0xe, 0x37,0xc3,0x16,0x87,0x8d,0x8c, +0x3e,0xdf,0xe2,0x0, 0xc7,0x1f,0xc7,0x81,0x3f,0x19,0x3e,0x98,0xe2,0x1, 0xc7,0xff, +0xc6,0x2, 0x25,0x83,0x3d,0xf2,0x4, 0x8, 0xe0,0xf, 0x85,0x8e,0x86,0x8d,0xe3,0xd, +0x3d,0xdd,0xe0,0xf, 0xae,0x8e,0x3f,0xfa,0x4, 0xe8,0x28,0x87,0xe0,0x3, 0x1f,0x35, +0x9f,0x8e,0x27,0x83,0xc7,0xff,0xb7,0x8e,0xa, 0xe1,0x8f,0x84,0xe2,0x0, 0xcf,0x81, +0x1, 0x1f,0xe0,0x3, 0x1f,0x86,0x8f,0xf, 0x2f,0x44,0x8f,0x2, 0xe2,0x0, 0xcf,0x1, +0x1, 0x40,0x88,0x83,0xe2,0x0, 0xc8,0x81,0x1, 0x1c,0xe0,0x3, 0x1f,0xb5,0x9f,0x8f, +0x27,0xec,0x2d,0x42,0x20,0xe4,0x0, 0xe9,0xf2,0x1, 0xc3,0x7f,0xe9,0x2f,0x3f,0x26, +0xe1,0x2c,0x3e,0x1e,0x3e,0x5f,0x17,0x80,0xaf,0x82,0xe7,0xff,0x0, 0x9e,0x3e,0x6a, +0x0, 0xfb,0xf0,0x0, 0xa8,0x82,0xe7,0xff,0x0, 0x89,0xaf,0x84,0xe7,0xff,0x0, 0x84, +0xe7,0xff,0x2d,0x2b,0xa, 0xe1,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfe, +0xc0,0x7c,0xe0,0x0, 0x1f,0xe, 0x11,0x90,0xf0,0x0, 0x8e,0xe, 0x39,0x90,0xe0,0x0, +0x1c,0x8d,0xf0,0xa, 0x36,0x21,0x3c,0x63,0xe0,0x3, 0xd4,0x4c,0xea,0x12,0x7f,0xce, +0x89,0xf, 0xea,0x12,0x7a,0xd0,0xe0,0x2, 0x21,0x7a,0xe0,0x1, 0x1f,0xf2,0xa7,0x8f, +0x7a,0x83,0xf0,0x0, 0x16,0x80,0x7f,0x81,0xe8,0x40,0x3b,0xed,0xe0,0x2, 0x1f,0xfd, +0xf0,0x0, 0x1c,0x8d,0x8f,0xdf,0xe0,0x0, 0x1a,0xc7,0x63,0x3, 0xe0,0x0, 0x7f,0x82, +0xf0,0x7, 0x14,0x7f,0xf0,0x1, 0x26,0xb, 0x14,0x90,0x3c,0x90,0xe8,0x40,0x3c,0x68, +0xf0,0x1, 0x13,0x7f,0xe0,0x0, 0x16,0x80,0xe0,0xf, 0x36,0xc3,0xf0,0x0, 0x12,0x87, +0xf0,0x15,0x3a,0xdd,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0x99,0xf0,0x15,0x3a,0x95, +0xe0,0xf, 0x87,0x8f,0xf8,0x0, 0x82,0x85,0xf0,0x0, 0x12,0x1, 0xe8,0xf, 0x3f,0xd5, +0xe2,0x1, 0xc7,0xff,0xf0,0x14,0x3a,0x1d,0x27,0xb7,0x8f,0x89,0xe2,0x1, 0xcf,0xff, +0xf0,0x40,0x39,0xef,0x1, 0x31,0xf0,0x0, 0x88,0x6, 0xf0,0x0, 0x89,0x19,0xf0,0x0, +0x88,0x96,0xf0,0xf, 0x38,0x2f,0xe3,0xff,0xc7,0xff,0xe0,0x43,0x38,0x9f,0xf8,0x15, +0x38,0xa2,0xf3,0xff,0xc2,0xff,0xe2,0x0, 0xc8,0x80,0xf8,0x13,0x39,0xa0,0xf3,0xff, +0xc1,0xff,0xf8,0x43,0x38,0x15,0xe8,0x6f,0x3d,0x23,0xf8,0x12,0x39,0x21,0xf2,0x0, +0xc8,0x0, 0xf3,0xff,0xc1,0x7f,0xe8,0x75,0x3d,0x22,0xe8,0xf, 0x3f,0x95,0xe3,0xff, +0xc7,0xff,0x3f,0xf8,0xf0,0x40,0x3a,0xe8,0xe0,0x75,0x3c,0xaf,0x3f,0xf8,0xe8,0x40, +0x3c,0x65,0xe0,0x76,0x3c,0xad,0xe8,0x40,0x3e,0xe4,0xe2,0x1, 0xc6,0xff,0xf0,0x40, +0x3e,0x7d,0xc4,0x82,0xe7,0xff,0x1, 0xaa,0xf2,0x1, 0xcb,0x7f,0x1, 0x27,0xf0,0x16, +0x33,0x21,0xf2,0x0, 0x7d,0x10,0xf8,0x1a,0x3d,0x16,0xe8,0x0, 0x8a,0xa, 0xe8,0x0, +0x89,0x9a,0x3c,0x64,0x3c,0xe3,0xdd,0xe9,0x67,0x82,0x67,0x1, 0x3f,0xb4,0xe0,0x43, +0x3c,0x18,0x3f,0x93,0x37,0xa1,0x3f,0x9e,0x97,0x8f,0x3f,0xf8,0x4, 0xf, 0xf0,0xf, +0x36,0xa1,0xe2,0x0, 0x7f,0x4c,0x3f,0x9e,0xf0,0x0, 0xc6,0x81,0xaa,0xf, 0xf2,0x1, +0xc6,0xff,0xa9,0x9f,0x17,0xff,0xe8,0x0, 0xaf,0x8a,0xf0,0x0, 0x13,0x81,0xf0,0x17, +0x3b,0x97,0xe8,0x40,0x3b,0xe7,0xe2,0x1, 0xc3,0xff,0x3b,0xf2,0xc3,0x2, 0xe7,0xfe, +0x1, 0xeb,0xe0,0x1, 0x1f,0x8e,0xf0,0x0, 0x8c,0xf, 0xf8,0x40,0x3c,0x7d,0xe0,0x0, +0x5, 0xed,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, 0x1c,0x8d,0xf0,0x0, 0xa3,0x8f,0xe0,0x2, +0x1f,0xfd,0xe0,0x0, 0x1d,0x47,0x89,0xdf,0xe8,0x40,0x3a,0x6d,0xf0,0x1, 0x12,0xff, +0xf0,0x0, 0x13,0x0, 0xf7,0xff,0x12,0x7f,0xf0,0x0, 0x26,0x51,0x15,0x90,0x3d,0x90, +0xe8,0x40,0x3c,0x65,0xe8,0x40,0x39,0x66,0xe0,0x0, 0x16,0x0, 0xe0,0xf, 0x36,0x43, +0x16,0x87,0x3e,0xdc,0xe2,0x0, 0xc7,0x9f,0x3e,0x9a,0x3f,0x99,0xf0,0x0, 0x81,0x8d, +0xe0,0xf, 0x87,0x8f,0x16,0x81,0xe8,0xf, 0x3f,0xd3,0xe2,0x1, 0xc7,0xff,0x3e,0x9c, +0x27,0x98,0xf0,0x0, 0x89,0x8b,0xf2,0x1, 0xc9,0xff,0xf0,0xf, 0x39,0xb3,0x1, 0x11, +0xf0,0x0, 0x89,0x1b,0xe8,0xf, 0x3f,0x92,0x37,0xa1,0xe8,0xf, 0x3f,0x97,0x97,0x8f, +0x3f,0xf2,0x5, 0x7, 0x3c,0x6c,0xf8,0x40,0x3d,0xe2,0xf8,0x40,0x3f,0x63,0x39,0x6f, +0x3e,0x6d,0xe2,0x1, 0xc6,0x7f,0xf0,0x40,0x3e,0x7c,0xc5,0x82,0x1, 0xd0,0xe2,0x1, +0xcc,0x7f,0x1, 0x14,0xf0,0xf, 0x36,0xa1,0xe2,0x0, 0x7f,0x4c,0x3f,0x9e,0x34,0x21, +0xe2,0x0, 0x7f,0x10,0x3c,0x1e,0xf0,0x0, 0xc6,0x81,0xf0,0x0, 0xaf,0xf, 0xf2,0x1, +0xc6,0xff,0xf0,0x0, 0xad,0x9f,0xf0,0x0, 0xaa,0x8, 0xc2,0x1, 0xe2,0x1, 0xc2,0x7f, +0xf0,0x40,0x3c,0x74,0xe7,0xff,0x1, 0xaa,0xe0,0x1, 0x1f,0xc3,0xe0,0x0, 0x14,0xcc, +0x8d,0xf, 0x3c,0x90,0x35,0x21,0xe2,0x0, 0x7c,0x10,0xe0,0x3, 0xd3,0x1b,0x64,0x3, +0xf0,0xa, 0x34,0x21,0xe0,0x1, 0x14,0xff,0xe0,0x3, 0xd3,0x4e,0xf0,0x0, 0x2e,0x8f, +0xe0,0x0, 0x1f,0xe, 0xea,0x12,0x7f,0xce,0xf0,0x0, 0xae,0x8f,0xf0,0x0, 0xae,0x8e, +0xe0,0x1, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x2, 0x36,0xa1,0xe0,0x0, +0x1c,0xd, 0x3d,0x62,0xe2,0x0, 0x7c,0x90,0xe0,0x3, 0xd2,0xfc,0x64,0x3, 0x3d,0x62, +0xe2,0x0, 0x7c,0x90,0xe0,0x3, 0xd2,0xf6,0xe0,0x0, 0x1c,0x8d,0xe0,0x0, 0x1d,0x47, +0xe0,0x0, 0x17,0x80,0xe0,0xe, 0x37,0xc3,0x16,0x7, 0x3e,0x5f,0xe2,0x0, 0xc7,0x1f, +0x3f,0x19,0x3e,0x1a,0xe0,0xf, 0x85,0x8e,0x86,0x8c,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0x3e,0xcb,0xe8,0x40,0x3f,0xfd,0xe0,0xf, 0xae,0x8e,0x1, 0xed,0xea,0x12,0x7f,0x4e, +0xf0,0x40,0x3c,0x7f,0xaf,0x8e,0xe8,0x6f,0x3c,0xa8,0xe0,0x0, 0x1f,0xe, 0xaf,0x8e, +0xe0,0x1, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x40,0x3e,0xe2,0x7a,0x83, +0xe7,0xfe,0x0, 0xb1,0x8, 0xb1,0xe0,0x0, 0xd8,0xdd,0x8, 0xa1,0xe7,0xfa,0x0, 0x9a, +0xe0,0x2, 0x1f,0xc8,0x17,0x1, 0x8f,0x8f,0xe0,0x2f,0x3f,0x8e,0xe0,0x1, 0x27,0x87, +0xe0,0x1, 0x2c,0x5, 0xe0,0x0, 0x1f,0x93,0xf0,0x0, 0x88,0x8f,0xf0,0x1, 0x28,0x81, +0xe0,0x0, 0x1f,0x8e,0xf0,0x0, 0x8a,0x8f,0xf0,0x40,0x3a,0xfe,0xe0,0x0, 0x5, 0xf9, +0xe0,0x0, 0x8, 0xb1,0xf7,0xff,0x10,0x7f,0xf0,0x0, 0x1a,0xd, 0xf8,0x10,0x38,0x15, +0xe8,0x40,0x3d,0x61,0xe8,0x40,0x3d,0xe1,0xf8,0x40,0x38,0xf0,0xe0,0x0, 0x3, 0x5e, +0xf0,0xf, 0x30,0xa1,0xf0,0x0, 0xc0,0x81,0xf2,0x1, 0xc0,0xff,0xf8,0x40,0x3a,0xf1, +0xe8,0xf, 0x3f,0x94,0x8c,0xf, 0xe0,0x0, 0x8c,0x9f,0x5, 0xef,0xf0,0x40,0x39,0x68, +0xf0,0x40,0x39,0xe9,0xe8,0x40,0x3e,0x61,0xe0,0xe, 0x36,0x21,0xe8,0xe, 0x3f,0x14, +0x8f,0x8e,0x8e,0x9e,0xe8,0xe, 0x3f,0xa2,0xe2,0x0, 0xcf,0x0, 0xe0,0xe, 0x3f,0xa8, +0xe0,0xf, 0x3c,0x2f,0xe8,0x1, 0x3e,0xa3,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xc7,0x7f, +0xe0,0x6e,0x3d,0x2f,0xe2,0x0, 0xc8,0x80,0xe0,0xf, 0x3e,0xa9,0xe0,0xd, 0x3c,0xad, +0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0xe0,0x6f,0x3d,0x2d,0x38,0xee,0x3e,0xeb, +0xe2,0x1, 0xc0,0xff,0xe2,0x1, 0xc6,0xff,0x38,0xfd,0xc6,0x1, 0xf0,0x40,0x3b,0xea, +0xf0,0x40,0x3b,0x6f,0xf2,0x1, 0xc3,0xff,0xe2,0x1, 0xc6,0x7f,0xf2,0x1, 0xc3,0x7f, +0x3, 0x82,0x3f,0x6b,0xf8,0x40,0x3b,0x77,0x3d,0xee,0xe2,0x1, 0xc5,0xff,0x3, 0x82, +0x3f,0xea,0xf0,0x40,0x3a,0xfc,0x3d,0x6f,0xe2,0x1, 0xc5,0x7f,0xe7,0xff,0x1, 0xbe, +0xf8,0x40,0x38,0xf0,0xe7,0xff,0x4, 0x26,0x14,0x4, 0xe1,0x2a,0x3c,0x2a,0x14,0x3, +0xe1,0x2b,0x3c,0x2b,0xe0,0x8, 0x3d,0x5b,0x8, 0xe1,0x14,0x0, 0x38,0x82,0x38,0x82, +0xe0,0x0, 0x1f,0x8e,0x8e,0x8f,0xe0,0x1, 0x26,0xcf,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xc0,0x70,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, 0x1a,0xd, 0xf0,0x0, 0xa4,0xf, 0xe0,0x2, +0x1f,0xfd,0xe0,0x1, 0x12,0xff,0x8b,0xdf,0xf0,0x40,0x3e,0xe9,0xf0,0x40,0x3f,0x68, +0x3d,0xe8,0x3e,0x69,0xf0,0x40,0x3e,0x64,0x3b,0x65,0xf0,0x40,0x3c,0xe5,0x3f,0x65, +0xe0,0x0, 0x11,0x80,0xf8,0x0, 0x8d,0xc, 0xf8,0x0, 0x8d,0x9c,0xf0,0xf, 0x3d,0x2b, +0xe2,0x0, 0xcf,0x80,0xf8,0x2, 0x3d,0x2e,0xf8,0xf, 0x3f,0x2a,0xe2,0x1, 0xc7,0xff, +0xe2,0x1, 0xc1,0x7f,0xe0,0x62,0x3d,0x2f,0xf0,0xa, 0x3d,0xac,0xe2,0x0, 0xcd,0x0, +0x3f,0xe2,0xf8,0xa, 0x3e,0xab,0xf8,0x2, 0x3d,0xad,0xe2,0x1, 0xc1,0x7f,0xe2,0x1, +0xc5,0x7f,0xe0,0x62,0x3d,0x2a,0x39,0x1f,0x39,0x7e,0xe8,0x40,0x3c,0x6a,0xe8,0x40, +0x3c,0xeb,0xf0,0x0, 0xc6,0x2, 0x3, 0x1f,0x7d,0x82,0x7e,0x1, 0x7e,0x83,0x7f,0x4, +0xdc,0xc, 0xf0,0xf, 0x3d,0x37,0xe0,0x43,0x3c,0x18,0xe8,0xf, 0x3f,0x9b,0x37,0xa1, +0xe8,0xf, 0x3f,0x98,0x97,0x8f,0x65,0x82,0x3f,0xf8,0x66,0x1, 0x66,0x83,0x67,0x4, +0x5, 0xa, 0x3f,0x62,0xf0,0x40,0x3c,0xe3,0xe2,0x1, 0xc7,0x7f,0xe8,0x40,0x3a,0xeb, +0xe8,0x40,0x3b,0x6a,0xc1,0x81,0xe2,0x1, 0xc1,0xff,0x39,0xfd,0xe7,0xff,0x1, 0xb4, +0xe0,0xa, 0x3b,0x37,0xf0,0x2, 0x1b,0xff,0x3d,0x15,0x35,0x21,0xf8,0x0, 0xac,0x87, +0xe8,0xa, 0x3d,0x18,0x16,0x80,0x11,0x1, 0x14,0x2, 0x14,0x84,0x0, 0x8e,0x27,0x3e, +0x97,0xc, 0x97,0x8a,0x3f,0x7f,0xe0,0x0, 0x2, 0x49,0xc6,0x81,0xe2,0x1, 0xc6,0xff, +0x39,0xfd,0xc2,0x2, 0xe0,0x0, 0x1, 0x44,0xf0,0x40,0x3c,0xfd,0x1, 0x77,0x8d,0x84, +0xf0,0x0, 0x8b,0x14,0xe0,0xe, 0x3d,0xa6,0xf0,0x43,0x3a,0x1e,0xf2,0x0, 0xca,0x0, +0xf0,0xf, 0x3b,0x25,0xe0,0x15,0x3b,0x2b,0xf2,0x1, 0xc2,0xff,0xf0,0x43,0x3a,0x1f, +0xe2,0x1, 0xc7,0x7f,0xe8,0x6e,0x3d,0x25,0xe0,0xc, 0x3d,0xb7,0xe8,0x15,0x3a,0xa6, +0xf2,0x0, 0xca,0x0, 0xf2,0x1, 0xc2,0xff,0xe2,0x1, 0xc7,0xff,0xe8,0x6f,0x3d,0x25, +0xe8,0xc, 0x3e,0x16,0x36,0x21,0xe1,0x35,0x3c,0x2f,0xe8,0xc, 0x3e,0x18,0xe1,0x2f, +0x3c,0xaf,0xe1,0x2e,0x39,0x2e,0xf7,0xff,0x2a,0xc4,0x3d,0xb7,0x27,0xc7,0xe8,0xb, +0x3d,0x96,0x35,0xa1,0xe8,0xb, 0x3d,0x98,0x27,0x41,0x97,0x8a,0x97,0xb, 0xe0,0x1, +0xc7,0xc8,0x3f,0x7f,0xe7,0xff,0x5, 0x3b,0xe8,0x0, 0xae,0x87,0xc0,0x10,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1f,0xff,0x17,0x7f,0xaf,0xf, 0x38,0x82,0x0, 0x0, +0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1e,0xde,0x8f,0xf, 0xe0,0x0, 0x2f,0x56,0xe0,0x0, +0x1f,0x8e,0xf0,0x0, 0x1a,0x8d,0xf0,0x0, 0x8b,0xf, 0xf0,0x0, 0x23,0x4d,0xe0,0x1, +0x1f,0xf2,0xf0,0x0, 0x18,0x8b,0xf0,0x0, 0xa1,0x8f,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, +0x19,0xa, 0xf0,0x0, 0x8a,0x5f,0xe8,0x40,0x3e,0x65,0x3e,0xee,0xe0,0x1, 0x14,0x7f, +0xf0,0x40,0x3b,0xee,0x8d,0xc, 0x8d,0x9c,0xe8,0xf, 0x3d,0x34,0x14,0x81,0x3f,0x9b, +0x37,0xa1,0xe8,0xf, 0x3f,0x93,0x97,0x8f,0x3c,0x9d,0xe8,0x40,0x3f,0xf7,0xc6,0x2, +0x5, 0x8, 0xe8,0x0, 0xad,0x1, 0x3c,0x6d,0xe8,0x0, 0xad,0x82,0xf0,0x40,0x3b,0xef, +0x3e,0xe9,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf6,0x1, 0xe5,0xe0,0x0, 0x1d,0x47, +0x15,0x81,0xe0,0xf, 0x37,0x43,0x16,0x7, 0x3d,0x9e,0x3c,0x7e,0x3e,0x5e,0xe2,0x0, +0xc7,0x9f,0x3f,0x6b,0xe8,0xf, 0x3f,0x95,0x3e,0x1a,0xe2,0x1, 0xc7,0x7f,0x1, 0x8, +0xe0,0xf, 0x85,0x8f,0x86,0xc, 0xe3,0xc, 0x3d,0xdc,0xe0,0xf, 0xae,0xf, 0x3e,0xfe, +0x1, 0xe8,0x38,0x82,0x38,0x82,0xe0,0x1, 0x8c,0x8d,0x8c,0x7d,0xe7,0xfd,0x0, 0xca, +0xe0,0x0, 0x1f,0x8e,0xe0,0x1, 0x1c,0xce,0x8d,0xf, 0x17,0x80,0xaf,0x89,0xea,0x12, +0x7f,0xcd,0x2d,0xd, 0xe0,0x2, 0x1f,0x48,0xad,0xf, 0x8f,0xe, 0xe2,0x0, 0xcf,0x1, +0x1, 0x15,0xea,0x12,0x7f,0xcc,0x17,0x0, 0xaf,0xf, 0x38,0x82,0x87,0xf, 0xc7,0x1, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x6, 0x5, 0x82,0x17,0x6, 0xaf,0xf, 0xe0,0x2, +0x1f,0x48,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0xed,0x8, 0xb3,0xe0,0x2, 0x1e,0xeb, +0xe0,0x3, 0x19,0x1c,0x16,0x0, 0x8f,0xd, 0xae,0x2, 0xe0,0x0, 0x2f,0x5a,0xe2,0x0, +0xcd,0xf, 0xe0,0x0, 0x2, 0xd1,0xe2,0x0, 0xcd,0x1, 0xe0,0x0, 0x5, 0xd6,0x8f,0x8f, +0xe2,0x0, 0xcf,0x85,0xe0,0x0, 0x2, 0xd1,0xfa,0x12,0x78,0xcc,0xf8,0x0, 0x89,0x81, +0xf0,0x1, 0x29,0xd9,0xf7,0xff,0x11,0x7f,0xf0,0x0, 0x1a,0x8d,0xf0,0x12,0x39,0x1a, +0xe8,0x40,0x3e,0xe3,0xf8,0x40,0x39,0xf2,0xe0,0x1, 0x3, 0x2e,0xf0,0xf, 0x31,0xa1, +0xf0,0x0, 0xc1,0x81,0xf2,0x1, 0xc1,0xff,0xe8,0x40,0x3d,0x73,0xe8,0xf, 0x3f,0x95, +0xf0,0x0, 0x8b,0x1f,0x5, 0xf0,0xf8,0x40,0x3a,0x66,0xe8,0x40,0x3f,0xe3,0x0, 0x89, +0x3d,0xfd,0xe8,0x6d,0x3a,0x27,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3d,0x7f,0x1, 0x63, +0xe0,0xe, 0x37,0xa1,0xe8,0xe, 0x3f,0x15,0x8f,0x1e,0xe8,0xc, 0x3f,0x24,0xe8,0xb, +0x3f,0x26,0xe2,0x0, 0xce,0x0, 0xf0,0x40,0x3b,0xeb,0xf2,0x1, 0xc3,0xff,0x2, 0x69, +0xe0,0x41,0x3e,0x4c,0x3e,0x7d,0xf0,0xe, 0x3b,0x2e,0xe2,0x1, 0xc7,0x7f,0xe0,0x6d, +0x3a,0x2e,0x0, 0xe2,0xea,0x12,0x7f,0xcc,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xc7,0x7f, +0xaf,0xd, 0xe7,0xff,0x0, 0xa6,0xea,0x12,0x7f,0xcc,0x8f,0xf, 0x27,0x3, 0xc7,0x7f, +0xaf,0xf, 0xe0,0x0, 0x1f,0x93,0xe0,0x0, 0x1f,0x12,0x89,0x8f,0x3d,0x73,0x5, 0x96, +0xe0,0x0, 0x21,0xfd,0xe2,0x0, 0xc9,0x81,0xe0,0x1, 0x1, 0x7, 0xe0,0x1, 0x1f,0xe8, +0x17,0x3, 0x8f,0x8f,0xaf,0x9, 0xe0,0x0, 0x27,0xfb,0xe2,0x0, 0xcf,0x82,0x1, 0xdf, +0xe0,0x0, 0x1f,0x38,0xaf,0x8e,0xe0,0x0, 0x9, 0xe1,0xe0,0x0, 0x4, 0xd5,0xe2,0x0, +0xcd,0x1, 0x5, 0xd5,0xf0,0x0, 0x1b,0x8d,0xf0,0x0, 0x11,0x1, 0xf8,0x40,0x38,0xe7, +0xf0,0x0, 0x13,0x2, 0xe8,0x0, 0x8c,0x1, 0xe8,0x0, 0x8d,0x91,0xf0,0x40,0x39,0xe8, +0xf0,0x40,0x3a,0x6b,0xe8,0x40,0x3e,0x62,0xe0,0xf, 0x36,0x21,0xf0,0xe, 0x3b,0x9f, +0x8e,0x8e,0x8f,0x1e,0xf0,0xf, 0x39,0xad,0xe2,0x0, 0xcf,0x80,0xe0,0xf, 0x3c,0x2d, +0x3e,0xa8,0xe2,0x1, 0xc6,0xff,0xf0,0x15,0x3a,0x2e,0xe2,0x1, 0xc7,0xff,0xe0,0x6f, +0x3d,0x2d,0xe0,0xd, 0x3d,0xae,0xf2,0x0, 0xca,0x80,0x3f,0x2b,0xe2,0x1, 0xc7,0x7f, +0xe2,0x1, 0xc6,0xff,0xc6,0x1, 0xe0,0x6d,0x3d,0x2e,0xf1,0x2f,0x3b,0x2f,0xe2,0x1, +0xc6,0x7f,0xf1,0x2e,0x3b,0x2d,0x27,0x83,0xe7,0xff,0x2f,0x32,0x3d,0x7c,0x2, 0xd5, +0xf0,0x0, 0xc1,0x1, 0xf2,0x1, 0xc1,0x7f,0xe8,0x40,0x3d,0x72,0xf0,0x0, 0xc0,0x82, +0x1, 0xc2,0x9, 0xe1,0xe2,0x0, 0xce,0x85,0xe7,0xff,0x5, 0x95,0x17,0x81,0xe8,0x0, +0xaf,0x81,0x9, 0xe1,0xe2,0x0, 0xcd,0x1, 0xe7,0xff,0x1, 0x9a,0xe0,0x2, 0x1f,0xdd, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe7,0xff,0x1, 0x93,0xe0,0x1, 0x1f,0xc7,0x9f,0x8f, +0xe2,0x1, 0xcf,0xc8,0xe7,0xff,0x5, 0x8c,0x9, 0xe1,0xde,0x8b,0x17,0x81,0xaf,0x82, +0x9, 0xe1,0xf1,0xff,0xc1,0xff,0xf8,0x0, 0xa9,0x81,0x9, 0xe1,0xe0,0x0, 0x1f,0xb8, +0x17,0x1, 0xaf,0xf, 0x9, 0xe1,0x8c,0x9e,0x8c,0xe, 0xdd,0xa3,0xa9,0x82,0x9, 0xe1, +0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x1, 0x15,0x48,0xa4,0xf, 0x14,0xa8,0xef,0xfd, +0xda,0x96,0xe0,0x0, 0x1d,0x8d,0xe0,0x1a,0x97,0xfb,0xe2,0x1b,0xcf,0xac,0xe0,0x0, +0x1f,0x8e,0x8d,0xf, 0x2, 0x6, 0xe0,0x1b,0x97,0x9b,0xe3,0xe4,0xcf,0xd4,0x3, 0x19, +0x25,0x17,0xe0,0x0, 0x1c,0xc7,0x16,0x80,0x3f,0xed,0xe2,0x1, 0xc7,0xff,0xe0,0xe, +0x37,0xc3,0xe2,0x0, 0xc7,0x87,0x3f,0x1b,0x3f,0x99,0xe0,0xf, 0x86,0xe, 0x87,0x8f, +0xc6,0x81,0xe3,0xf, 0x3e,0x5f,0x3e,0xfa,0xe0,0xf, 0xaf,0x8e,0x1, 0xee,0x8, 0xe1, +0xe0,0xf, 0x35,0x24,0x3c,0x7f,0x5, 0x7c,0xe0,0x3, 0x1f,0xae,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0x5f,0x8, 0xe1,0xe0,0x0, 0x1f,0xbb,0xe0,0x2, 0x8f,0xf, 0x3f,0x9e, +0xe0,0x6, 0x8c,0x8f,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x2, +0x38,0x82,0xe2,0x1, 0xc4,0xfd,0x2c,0xfd,0x8, 0xb1,0xe0,0x1, 0x1f,0xf1,0xe0,0x13, +0x15,0x44,0xa4,0xf, 0xef,0xfd,0xda,0x4b,0xe2,0x0, 0xcc,0x64,0x5, 0x87,0xe0,0x1, +0x1f,0xdc,0x17,0x7f,0xa7,0x8f,0xe0,0x7, 0xaf,0x3f,0x8, 0xe1,0x8, 0xb2,0xe0,0x1, +0x1f,0xd7,0xe0,0x3, 0x8f,0xaf,0x27,0xb1,0xe0,0x0, 0x19,0xe, 0xdf,0x9a,0xd9,0xc1, +0xd9,0xc0,0xef,0xff,0xd7,0x3, 0xd9,0xbd,0xe0,0x0, 0x1f,0xa7,0x87,0x2, 0xaf,0xf, +0xd5,0x78,0xd9,0xb7,0xd9,0xb6,0x8f,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0x9, 0xd9,0xf5, +0xd9,0xb0,0xda,0xfb,0xe0,0x0, 0x1f,0xb8,0x8f,0x8f,0x27,0x93,0x9, 0x61,0xe0,0x3, +0x1f,0x6, 0x16,0x80,0xae,0x8e,0x17,0x80,0xe0,0x3, 0x1f,0x35,0xb7,0x8e,0xe0,0x0, +0x1f,0x41,0xaf,0x8e,0xd9,0x9e,0xda,0xe9,0xe0,0x0, 0x1f,0xb8,0x8f,0x8f,0x2f,0xef, +0xde,0x48,0x9, 0x21,0xe7,0xf3,0x0, 0x96,0xef,0xfe,0xde,0x50,0xd9,0x92,0x0, 0xcd, +0x8, 0xb6,0xc0,0x74,0x3c,0x7a,0xe4,0xf, 0x35,0x28,0xe4,0xe, 0x34,0x28,0x39,0x68, +0x4, 0x82,0x39,0x6a,0x3f,0x7f,0x3f,0xe8,0xe0,0x6f,0x3d,0xaa,0x3c,0xfb,0x38,0xef, +0xe2,0x1, 0xc1,0x7f,0xe2,0x1, 0xc0,0xff,0x39,0xeb,0xe4,0xf, 0x35,0xa8,0xe4,0xe, +0x34,0xa8,0x3, 0x82,0x39,0xe9,0x3f,0x7f,0xe2,0x1, 0xc1,0xff,0x3f,0xe9,0xe0,0x6f, +0x3d,0xab,0x3c,0xf3,0xf0,0x40,0x3b,0x6f,0xf2,0x1, 0xc3,0x7f,0xe0,0x1, 0x1, 0x1e, +0x3d,0x72,0xe0,0x1, 0x2, 0x9e,0xf0,0x40,0x3a,0xe2,0xf0,0x0, 0x11,0x81,0xe0,0x1, +0x1f,0xf2,0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0xa2,0xf, 0xe0,0x2, 0x1f,0xfd,0xe0,0x0, +0x1a,0x29,0xf0,0x0, 0x8b,0xdf,0xf8,0x12,0x39,0x16,0x3c,0xe3,0x15,0x0, 0xf0,0x1, +0x10,0x7f,0xf7,0x0, 0x10,0x81,0x14,0x7f,0xf0,0x40,0x39,0x79,0xe0,0x0, 0x1, 0x62, +0xe8,0x40,0x3c,0xf6,0xf0,0x1, 0x21,0x83,0xe0,0x1, 0x3, 0x65,0x17,0x1, 0x3f,0x19, +0xf0,0x40,0x3a,0xf1,0xf0,0x0, 0x6a,0x84,0x6f,0x5, 0xe0,0x1, 0x3, 0x61,0x17,0x81, +0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88,0x6c,0x89,0x6f,0x8c,0x6f,0xd, +0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0x60,0xe8,0x40,0x3b,0x61,0x16,0x80,0x8d,0x8e, +0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d,0xe8,0xf, 0x3d,0xb7,0x1, 0x10,0x8d,0x9e, +0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1,0xe8,0xf, 0x3f,0x94,0x1, 0x8, 0x97,0x8f, +0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6,0xe0,0x66,0x3a,0x2f,0x3e,0xe5,0xe2,0x1, +0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, 0x1, 0xe3,0xe0,0xf, 0x36,0x22,0xe2,0x0, +0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40,0x3b,0x7d,0xe0,0x1, 0x1, 0x34,0xe8,0x40, +0x39,0xf6,0xe0,0x1, 0x1, 0x30,0xe2,0x1, 0xce,0x7f,0xe7,0xff,0x1, 0x2f,0xe0,0xe, +0x35,0x21,0x3c,0xed,0x3f,0x14,0xe2,0x0, 0x7e,0x4, 0xf0,0x40,0x39,0x79,0x3f,0x9c, +0xc5,0x1, 0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0xf0,0x0, 0x8a,0x8f,0xe7,0xff,0x1, 0xa2, +0xe0,0xff,0x14,0x7f,0x25,0x18,0x17,0xff,0x3f,0x9a,0x3d,0x6f,0xe2,0x1, 0xc5,0x7f, +0xe0,0x0, 0x1e,0xa9,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1f,0x28,0xe0,0xf, 0x3f,0x9d, +0xe0,0xff,0x14,0x7f,0xe0,0x80,0x96,0x9e,0x3e,0xf8,0xe0,0x6d,0x3a,0x28,0x3f,0x7f, +0x3c,0x6d,0x1, 0xf9,0xc0,0xc, 0xb, 0x61,0x3c,0x72,0xe7,0xfe,0x5, 0xe6,0xf0,0x40, +0x3a,0xe1,0xf0,0x0, 0x11,0x80,0xe7,0xfe,0x0, 0xe4,0xe0,0x0, 0x3, 0x59,0x17,0x1, +0x3f,0x19,0xe8,0x40,0x39,0x75,0xf0,0x0, 0x6a,0x84,0x6f,0x5, 0xe0,0x0, 0x3, 0x55, +0x17,0xff,0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88,0x6c,0x89,0x6f,0x8c, +0x6f,0xd, 0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0xe3,0xe8,0x40,0x3e,0x60,0xe8,0x40, +0x3b,0x61,0x8d,0x8e,0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d,0xe8,0xf, 0x3d,0xb7, +0x1, 0x10,0x8d,0x9e,0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1,0xe8,0xf, 0x3f,0x94, +0x1, 0x8, 0x97,0x8f,0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6,0xe0,0x66,0x3a,0x2f, +0x3e,0xe5,0xe2,0x1, 0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, 0x1, 0xe3,0xe0,0xf, +0x36,0x22,0xe2,0x0, 0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40,0x3b,0x7d,0x1, 0x2d, +0xe8,0x40,0x39,0xf6,0x1, 0x2a,0xe2,0x1, 0xce,0x7f,0xe7,0xfe,0x1, 0x2f,0xe0,0xe, +0x35,0x21,0xe2,0x0, 0x7e,0x4, 0x3f,0x9c,0x3f,0x14,0xc5,0x1, 0xf0,0x0, 0x8a,0x8f, +0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0x3c,0xed,0xe7,0xfe,0x0, 0xa0,0xf0,0x40,0x3a,0xf2, +0x6c,0x4, 0x6c,0x5, 0x2, 0x23,0x6c,0x8, 0x6c,0x9, 0x6c,0xc, 0x6c,0xd, 0xe7,0xff, +0x0, 0xb2,0xe8,0x40,0x38,0xf5,0x6c,0x4, 0x6c,0x5, 0x2, 0x12,0x6c,0x8, 0x6c,0x9, +0x6c,0xc, 0x6c,0xd, 0xe7,0xfe,0x0, 0xa6,0x8f,0xe, 0x3f,0x72,0x1, 0xd5,0xe7,0xfe, +0x0, 0xe9,0x8f,0xe, 0x3f,0x71,0xe7,0xfe,0x1, 0xd0,0xe7,0xfe,0x0, 0xe3,0x17,0x81, +0xe8,0xf, 0x3f,0x95,0x6f,0x88,0x6c,0x89,0x0, 0xec,0x17,0xff,0xe8,0xf, 0x3f,0x95, +0x6f,0x88,0x6c,0x89,0x0, 0xdb,0x0, 0x0, 0x8, 0xb3,0xf7,0xff,0x12,0x7f,0xf0,0x43, +0x38,0x8, 0xf0,0x14,0x3a,0x18,0xf0,0x0, 0x10,0x81,0xf8,0x43,0x3a,0x4, 0xf8,0x11, +0x38,0x90,0xe0,0x2, 0x1f,0xfd,0xf8,0x40,0x3a,0x71,0x80,0xef,0xf0,0x0, 0x82,0xff, +0xe0,0x0, 0x2, 0x65,0xe0,0x1, 0x1f,0x72,0xf7,0xff,0x11,0x7f,0xf0,0x0, 0x11,0x81, +0xf0,0x13,0x39,0x98,0xf0,0x43,0x3b,0x89,0xf0,0x12,0x39,0x19,0x15,0x1, 0x11,0x81, +0xf0,0x0, 0xa3,0xe, 0x89,0x5f,0xf8,0x43,0x39,0x2, 0xe8,0xa, 0x3d,0x17,0xf2,0x1, +0xc1,0xff,0xe7,0x0, 0x14,0x1, 0x39,0x99,0xf2,0x0, 0xca,0x0, 0xe8,0x43,0x3f,0x83, +0xe8,0x40,0x3d,0xe4,0xe0,0x6b,0x3c,0x2f,0xe8,0x40,0x38,0xf4,0xe0,0x6b,0x3d,0x2f, +0xe8,0x40,0x3d,0x72,0x4, 0x2e,0x3e,0x63,0xe0,0x9, 0x39,0x3b,0xe2,0x1, 0xc6,0x7f, +0xe8,0x2b,0x3d,0x80,0xe8,0x40,0x3f,0xe2,0x0, 0x84,0x25,0x9c,0x3f,0xfa,0x2, 0x21, +0xe2,0x0, 0xcf,0x80,0xe0,0x43,0x3e,0x8c,0x3f,0x6f,0xe0,0x6e,0x3c,0x2d,0xf0,0x40, +0x3a,0xff,0xc6,0x7f,0xe0,0x6e,0x3d,0x2d,0xe0,0xd, 0x3f,0x19,0xc7,0x81,0x36,0xa1, +0xe8,0x2e,0x3f,0x7, 0xe0,0x43,0x3f,0x8f,0xe8,0xd, 0x3e,0x96,0xe2,0x1, 0xc6,0x7f, +0x2f,0x65,0x97,0xd, 0x3f,0x78,0xe0,0x6e,0x3c,0x28,0x3f,0xfa,0x3c,0x6e,0x5, 0x61, +0xf0,0x0, 0xc2,0x1, 0xf8,0x43,0x3a,0x4, 0xf8,0x40,0x3a,0x71,0xf1,0xff,0xc1,0xff, +0xf2,0x1, 0xc1,0xff,0xe7,0xff,0x5, 0x3a,0x9, 0xe1,0xe7,0x0, 0x14,0x1, 0x9, 0xe1, +0x8, 0xb4,0xc0,0x78,0x39,0xea,0x3a,0x6b,0x7e,0x2, 0x7e,0x81,0xdf,0x7e,0x39,0x68, +0x3c,0xe4,0x3c,0x63,0xdf,0x7a,0x39,0x18,0xe4,0x8, 0x31,0x4f,0x3c,0x12,0x34,0x1, +0x66,0x81,0x3f,0xe8,0xe3,0xff,0xc6,0xff,0xe3,0xff,0xc7,0xff,0xe0,0xe, 0x3e,0xaf, +0xe0,0x43,0x3f,0x1e,0x66,0x2, 0xe2,0x0, 0xcf,0x0, 0xe0,0x8, 0x3e,0xa8,0xe0,0xe, +0x3f,0xad,0xe3,0xff,0xc6,0x7f,0xe0,0x43,0x3f,0x1e,0xe0,0x43,0x3c,0x18,0xe0,0xf, +0x3e,0xac,0xe0,0x68,0x3d,0x2e,0xe0,0x2, 0x1f,0x41,0xe0,0x43,0x3f,0x9f,0x3e,0x2d, +0xe2,0x0, 0xcf,0x80,0x9f,0xe, 0xe0,0x43,0x3e,0x1c,0xe0,0x6f,0x3d,0x2c,0xe2,0x0, +0xcf,0xb, 0x16,0x86,0x17,0x3, 0xe0,0x6e,0x3c,0xad,0x3f,0x38,0x3f,0xfe,0x5, 0xa, +0xe0,0x0, 0x17,0x64,0xe0,0x2f,0x3f,0x9e,0xe0,0x28,0x3c,0x1e,0x3c,0x5f,0xc0,0x8, +0xa, 0x61,0x14,0x0, 0xc0,0x8, 0xa, 0x61,0x8, 0xb1,0xc0,0x44,0x15,0x3c,0x14,0x80, +0xe2,0x0, 0x7c,0x4, 0xe0,0x2, 0xdd,0x50,0xe0,0x0, 0x1f,0x8e,0x14,0x0, 0x8d,0x8f, +0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5, 0xc8,0x15,0x7f,0x3d,0x1b,0xe2,0x1, 0xc5,0x7f, +0xc5,0x1, 0xe0,0x0, 0x1f,0x8d,0xf2,0x0, 0x7b,0x4, 0x35,0x21,0x3d,0x1f,0xe8,0x40, +0x3f,0x66,0x86,0xf, 0x86,0x9f,0xc7,0x82,0xae,0xe, 0x3f,0xfa,0xc7,0x2, 0xe0,0x40, +0xae,0x9e,0x1, 0xf8,0xf0,0x0, 0x13,0x80,0xe8,0x40,0x3e,0xe7,0xf0,0x0, 0xc3,0x81, +0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3d,0xf7,0x14,0x1, 0x1, 0x25,0xe8,0x0, 0x8c,0x86, +0xe8,0x0, 0x8d,0x16,0xe8,0x40,0x3f,0xe7,0xe0,0xe, 0x37,0xa1,0xe2,0x0, 0x7e,0x4, +0x3f,0x1c,0x8e,0xe, 0x8f,0x1e,0x3e,0x79,0x3e,0x6d,0xe0,0x6c,0x39,0xa8,0xc7,0x81, +0x3f,0x7a,0xe2,0x1, 0xc7,0xff,0x3f,0x6d,0xe0,0x6e,0x39,0xac,0x3d,0xff,0x3c,0x6e, +0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3d,0xf7,0xf0,0x0, +0xc3,0x2, 0x1, 0xdd,0xc0,0x3c,0x8, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x40, +0xe0,0x0, 0x1f,0xe, 0xe0,0x1, 0x1f,0xc3,0x8f,0xe, 0xea,0x4f,0x7d,0x98,0x89,0xf, +0xe9,0xff,0xc5,0xff,0xe0,0x2, 0x1e,0x3b,0x7f,0xa, 0x17,0x80,0xe0,0x2, 0x1f,0x22, +0xf0,0x40,0x38,0xe8,0xf0,0x2, 0x1c,0xc3,0xa4,0xb, 0xaf,0x8e,0x3d,0x62,0xaf,0x8c, +0x14,0x80,0xf0,0x0, 0x78,0x81,0xe8,0x7, 0xaf,0xd9,0xe8,0x7, 0xaf,0xe9,0xe0,0x2, +0xdc,0xdb,0xe0,0xa, 0x31,0x21,0x14,0x80,0xe8,0x40,0x3c,0x69,0xe0,0x2, 0xdc,0xd4, +0x67,0xa, 0xf0,0x0, 0x60,0x81,0xe2,0x0, 0xcf,0x1, 0xe0,0x2, 0x5, 0xe1,0xea,0x4f, +0x7f,0x98,0xe9,0xff,0xc7,0xff,0xf0,0x0, 0xa6,0x8f,0xf0,0x0, 0x15,0x81,0xf8,0xe, +0x3d,0xad,0xf0,0x0, 0x18,0x3, 0xf8,0x40,0x3e,0x6b,0x7f,0xe, 0xf2,0x0, 0xcd,0x81, +0xf8,0x40,0x8c,0x30,0xe8,0x40,0x8b,0xa0,0xe0,0x2, 0x1, 0x43,0xe8,0x0, 0x8f,0xd, +0xe0,0x2, 0x27,0x3f,0x67,0x8a,0xf0,0x40,0x3d,0xff,0xe0,0x2, 0x3, 0xc1,0x3b,0x6f, +0xc3,0x7f,0xe2,0x1, 0xc3,0x7f,0x67,0xe, 0xe8,0x17,0x3b,0x2b,0xe8,0xe, 0x3f,0x1d, +0xf2,0x1, 0xc3,0xff,0xf0,0x17,0x3b,0x9e,0xf0,0x17,0x33,0xa1,0xe0,0x0, 0x1f,0x8d, +0x17,0x1, 0xf0,0x0, 0xc3,0x83,0xe0,0x3, 0x1d,0x85,0xe8,0xe, 0x3f,0x1d,0xc3,0x1, +0xf0,0x17,0x3b,0x9f,0x7f,0x9, 0x3a,0x6e,0xf0,0x0, 0x7d,0x8b,0xf8,0x40,0x3a,0xe8, +0xe8,0x40,0x3a,0xe0,0x17,0x5, 0x3b,0x1b,0xf8,0x40,0x3d,0xe7,0xf0,0x0, 0x78,0xc, +0xf0,0x40,0x3f,0x67,0x0, 0x9e,0xe0,0x0, 0x27,0xc9,0x16,0x81,0xe8,0xd, 0x3e,0xd1, +0xe0,0x0, 0x26,0xc4,0xe0,0x2, 0x1e,0x3b,0xe8,0x7, 0x87,0xd9,0x86,0x8c,0xc7,0x81, +0xc6,0x81,0xae,0x8c,0xe8,0x7, 0xaf,0xd9,0x8e,0x4, 0xe0,0x2, 0x2e,0x6, 0xe8,0x0, +0x8f,0x8d,0xaf,0x84,0xc2,0x82,0xf0,0x40,0x3d,0xf5,0xc2,0x1, 0xe0,0x1, 0x1, 0x60, +0xf0,0x40,0x8d,0x15,0xf0,0x0, 0x88,0x5, 0xf8,0xf, 0x3a,0xaa,0xe2,0x0, 0xcf,0x80, +0xf8,0x2, 0x3c,0x2a,0xf8,0xf, 0x3d,0x28,0xe2,0x1, 0xc7,0xff,0xf8,0xd, 0x3f,0x20, +0xe2,0x1, 0xc1,0x7f,0xe0,0x62,0x3d,0x2f,0xe8,0x3, 0x3b,0xa0,0xe2,0x0, 0xce,0x80, +0xf0,0xf, 0x38,0x27,0xe2,0x1, 0xc1,0xff,0xe2,0x1, 0xc7,0xff,0xe1,0x2d,0x39,0x1e, +0xe0,0x63,0x3d,0x2f,0x2e,0xd8,0xe1,0x2f,0x39,0x9e,0x2f,0xd5,0xf1,0x2d,0x3e,0x23, +0xf1,0x2f,0x3e,0x22,0xe7,0xff,0x2e,0xb9,0xe9,0x2d,0x39,0x1c,0x2e,0x84,0xe9,0x2d, +0x39,0x9c,0x26,0xc9,0x16,0x82,0xe8,0xd, 0x3e,0xd1,0x26,0xc5,0xe0,0x2, 0x1d,0xfd, +0xe0,0x1, 0x1e,0x72,0x8e,0xdb,0xa5,0x8c,0xf0,0xc, 0x3c,0x3d,0xe8,0xd, 0x3e,0xba, +0x3e,0x17,0xe8,0xd, 0x3e,0x90,0x36,0x21,0x36,0xa1,0x3e,0x1b,0x3e,0x9b,0xf0,0x0, +0x91,0xc, 0xf0,0x0, 0x92,0xd, 0x16,0x82,0xe1,0x2c,0x3e,0xa2,0xe8,0x40,0x3d,0xe0, +0xe8,0x40,0x3d,0x6a,0xe1,0x2d,0x3e,0xa3,0x3c,0xe7,0xe8,0x40,0x3c,0x68,0x7f,0x3, +0x7f,0x84,0xf0,0x0, 0x78,0x81,0xf0,0x0, 0x7a,0x82,0x7e,0x8, 0x7e,0x8d,0xf0,0x0, +0x78,0x7, 0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x7a,0x5, 0xdc,0x8b,0xf0,0x0, 0x61,0x6, +0xf0,0x0, 0x62,0x5, 0xe2,0xff,0xcc,0x7f,0xf8,0xc, 0x39,0x14,0xe4,0xd, 0x36,0x4f, +0xf0,0x0, 0x60,0x7, 0x3e,0x9c,0x16,0x0, 0xe0,0x6c,0x39,0xa8,0x36,0x81,0xf8,0x40, +0x39,0x74,0xe8,0x40,0x3d,0xe0,0xe8,0x40,0x3d,0x6a,0xe0,0x43,0x3e,0x9d,0xf8,0x40, +0x3d,0x64,0x3c,0xe7,0xe8,0x40,0x3c,0x68,0xe8,0x7a,0x3b,0x22,0x7e,0x7, 0xde,0x39, +0x65,0x8d,0x66,0x88,0x7c,0x10,0x3e,0xdb,0x7e,0x8f,0xde,0x7f,0x67,0x3, 0x67,0x84, +0xf0,0x0, 0x60,0x81,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x61,0x87,0xf0,0x0, 0x62,0x5, +0xf0,0x0, 0x62,0x82,0xe0,0x1, 0x24,0x1d,0xf8,0x40,0x3a,0x6a,0xe0,0x2, 0x1e,0xc1, +0xe0,0x0, 0x1d,0xb1,0x9e,0xd, 0x9e,0x8b,0xe2,0x0, 0xce,0xb, 0xe8,0x7a,0x3c,0xa4, +0xe2,0x0, 0xce,0x8a,0xf8,0x40,0x3a,0x6a,0xe0,0x0, 0x2, 0xee,0xe0,0x2, 0x1e,0x5d, +0xe0,0x0, 0x14,0x51,0x8e,0x8c,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1, 0xa, 0xe8,0x8, +0x3c,0x34,0xe0,0x0, 0x14,0xe4,0x7f,0x3, 0xf0,0x0, 0x78,0x81,0xf0,0x0, 0x79,0x87, +0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xdb,0x4, 0xf0,0x0, 0x61,0x87,0x67,0x3, 0xf0,0x40, +0x39,0xf8,0xf0,0x0, 0x60,0x81,0xf0,0x0, 0x62,0x82,0xe7,0xfe,0x5, 0x2d,0x65,0x90, +0x17,0x80,0x66,0xf, 0xe1,0x3a,0x3d,0x8f,0xf0,0x40,0x3d,0x7c,0xe7,0xfe,0x5, 0x9e, +0xc2,0x82,0xf0,0x40,0x3d,0xf5,0xc2,0x1, 0xe7,0xfe,0x1, 0xa4,0xf0,0x0, 0x65,0x8b, +0x17,0x81,0xf0,0x0, 0x60,0xc, 0xe8,0xf, 0x3f,0x9b,0xf0,0x40,0x3d,0xef,0xf0,0x0, +0xc0,0x2, 0xf2,0x1, 0xc5,0xff,0xf0,0x0, 0x66,0x89,0xe7,0xfd,0x0, 0xb9,0x67,0x8a, +0xf8,0x0, 0xad,0x8d,0xf0,0x40,0x3d,0xff,0xe7,0xfd,0x4, 0xc3,0xe0,0x0, 0xc0,0x40, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe8,0x0, 0x8e,0x8d,0x3f,0xec,0xe2,0x1, 0xc7,0xff, +0x3f,0xfd,0x3d,0xec,0x5, 0x82,0x3d,0xed,0xea,0x4f,0x7e,0x98,0xe9,0xff,0xc6,0xff, +0xe2,0x1, 0xc5,0xff,0xa7,0x8d,0x0, 0x8a,0xe8,0x0, 0x8e,0xd, 0x3e,0x7d,0x1, 0x9, +0xc7,0x81,0x3b,0x7f,0xe7,0xfd,0x1, 0x68,0x8e,0x4, 0x8e,0x8f,0x3e,0xfc,0x1, 0xf5, +0xad,0x8f,0x0, 0xf7,0xe0,0x2, 0x1d,0xdd,0xe0,0x0, 0x14,0x51,0x8e,0x8b,0xe2,0x0, +0xce,0x81,0xe7,0xff,0x1, 0x96,0x15,0x80,0x16,0xbc,0x7d,0x90,0x66,0xf, 0x2e,0x16, +0x16,0x3, 0xe1,0x2c,0x3e,0x23,0x26,0x16,0x65,0x88,0x25,0x94,0x16,0xb4,0x27,0x85, +0x67,0x8d,0x14,0x1e,0xe7,0xff,0x2f,0x85,0x3c,0x6d,0xe7,0xff,0x0, 0x82,0xf8,0x40, +0x39,0x74,0xe8,0x74,0x3d,0x22,0xe7,0xfe,0x0, 0xe3,0x16,0xb2,0x0, 0xf1,0x3e,0xe8, +0x0, 0xe6,0x16,0x4, 0xe1,0x23,0x3e,0x23,0x21,0x85,0x66,0x8, 0x26,0x3, 0x16,0xba, +0x0, 0xe7,0xe2,0x0, 0xc9,0x2, 0x14,0x3c,0xe7,0xfe,0x5, 0xeb,0x0, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x38,0xe0,0x0, 0x1f,0x8e,0xf0,0x0, 0x8c,0xf, 0xf0,0x1, +0x24,0x5c,0xe0,0x0, 0x1e,0xd, 0xe0,0x2, 0x1f,0xfd,0x8b,0xc, 0x8a,0xdf,0x89,0x1c, +0xe0,0xf, 0x3b,0x35,0xe0,0x1, 0x1f,0x72,0x14,0xff,0xa2,0xe, 0x3f,0x92,0xe8,0x9, +0x3c,0x98,0x37,0xa1,0xe2,0x1, 0xc4,0xff,0x3f,0x94,0x34,0xa1,0x94,0xf, 0x39,0xe6, +0x3b,0xe2,0x3c,0x9c,0xe0,0x0, 0x0, 0xc5,0x3e,0x79,0xe0,0x0, 0x1, 0x50,0x8f,0x2c, +0x8f,0xbc,0xe0,0xd, 0x3f,0x35,0x3d,0x6e,0x3e,0x9f,0x36,0xa1,0x3e,0x94,0x96,0x8d, +0xe4,0xb, 0x37,0x28,0x3e,0xf8,0xe0,0x6d,0x3a,0x28,0x3c,0x6d,0x3e,0xe6,0xe2,0x1, +0xc6,0xff,0x3f,0x7d,0x5, 0x82,0x3d,0x66,0x3e,0xe3,0xe4,0xb, 0x35,0xc8,0xe2,0x1, +0xc6,0xff,0x3d,0xfd,0x3b,0x6a,0xe2,0x1, 0xc3,0x7f,0x3, 0x82,0x3f,0x63,0x39,0xee, +0x3f,0x62,0xe2,0x1, 0xc7,0x7f,0x3f,0xfe,0xe2,0x1, 0xc1,0xff,0x3d,0xef,0xe4,0xd, +0x37,0xa8,0x5, 0x82,0x3d,0xe2,0x3f,0x67,0xe4,0xd, 0x36,0xc8,0xe2,0x1, 0xc7,0x7f, +0x3e,0xfe,0x39,0x6b,0xe2,0x1, 0xc1,0x7f,0x3, 0x82,0x3f,0xe7,0xe0,0xe, 0x39,0xa6, +0xe2,0x0, 0xcf,0x7, 0x3b,0xef,0xe2,0x1, 0xc3,0xff,0xc6,0x2, 0x2, 0x7, 0xe0,0xf, +0x3b,0xa2,0xe2,0x0, 0xcf,0x87,0xe7,0xff,0x5, 0x39,0xe0,0x2, 0x1f,0xc1,0xe0,0x3, +0x17,0x74,0xb7,0xf, 0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0x14,0x83,0x34,0x21,0xe0,0x2, +0xd9,0xff,0x3b,0xf2,0x15,0x80,0xe0,0x43,0x3c,0x18,0x3e,0xeb,0x4, 0xa1,0x39,0xf6, +0x4, 0x9a,0x3f,0x66,0xe0,0xf, 0x3f,0x35,0x16,0x1, 0x3f,0x92,0x37,0xa1,0x3f,0x94, +0x97,0x8f,0x3e,0x1d,0x3f,0xf8,0xc7,0x1, 0x3f,0xec,0xe2,0x1, 0xc7,0xff,0x16,0x1, +0xe2,0x1, 0xc7,0x7f,0x3e,0x1b,0xe0,0x6d,0x3a,0x2f,0x3f,0x73,0x3d,0xec,0xe2,0x1, +0xc5,0xff,0x5, 0xe9,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x39,0x77,0x5, 0xe1,0xe0,0x2, +0x1f,0xdd,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x5, 0xa0,0xe0,0x2, 0x1f,0x41,0x9f,0x8e, +0xe2,0x7, 0xcf,0xe7,0x2, 0x83,0xc7,0x81,0xb7,0x8e,0xf7,0xff,0x24,0x45,0xe4,0x0, +0xc6,0x83,0xe0,0xf, 0x35,0xa1,0x3e,0xff,0x5, 0x20,0xe0,0x0, 0x1f,0x31,0xe0,0x2, +0x1e,0xc1,0x9f,0x8e,0x16,0x0, 0xe2,0x3, 0xcf,0xf3,0xb6,0xd, 0xe7,0xff,0x2, 0xb4, +0xc7,0x81,0xb7,0x8e,0xe7,0xff,0x0, 0xb0,0x1, 0x69,0xe0,0x2, 0x1f,0x41,0x9f,0x8e, +0xe2,0x0, 0xcf,0x82,0x5, 0x83,0xc7,0xfe,0xb7,0x8e,0xe0,0x0, 0x1f,0x31,0x9f,0x8e, +0xe2,0x3, 0xcf,0xf3,0x2, 0xdb,0x0, 0xd8,0xe0,0x2, 0x1f,0x41,0x9f,0x8e,0xe2,0x7, +0xcf,0xe7,0x2, 0x83,0xc7,0x82,0xb7,0x8e,0x17,0x0, 0xe0,0x0, 0x1f,0xb1,0xb7,0xf, +0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe8,0x40,0x3d,0xe8,0xe8,0x40,0x3e,0xe8,0xe7,0xff, +0x0, 0xb8,0xe0,0x2, 0x1f,0xc1,0x9c,0xf, 0x17,0x8a,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x2, 0x1b,0xc3,0x17,0x80,0xe0,0x7, +0xaf,0xc7,0xe0,0x2, 0x1f,0xdd,0xe0,0x0, 0x1a,0xe, 0x8b,0xf, 0xdf,0x2, 0x8f,0x84, +0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x5, 0xf4,0x14,0x3, 0xdd,0xf, 0xeb,0xe6,0x7f,0x90, +0x7f,0x81,0xe0,0x2, 0x23,0x2b,0xe2,0x0, 0xcb,0x1, 0x5, 0x86,0x8f,0x8f,0xe2,0x0, +0xcf,0x86,0xe0,0x2, 0x2, 0xa3,0xf0,0x0, 0x88,0x84,0xe0,0x0, 0x1a,0x8d,0xe8,0x40, +0x3b,0x71,0xe0,0x2, 0x1, 0x70,0xe0,0x7, 0x8f,0xd7,0xfa,0x13,0x7c,0x11,0xf0,0xf, +0x38,0xaf,0xc7,0x81,0x3b,0x7f,0xe0,0x3, 0x1, 0x1a,0xe0,0x2, 0x1f,0xbb,0x8f,0x8f, +0xe8,0x0, 0x8f,0x8, 0xf0,0xf, 0x38,0xaf,0xc7,0x81,0x3f,0x7f,0x14,0x3, 0xe0,0x2, +0x1, 0x76,0xf0,0x3, 0x20,0x84,0x16,0x7f,0xe8,0xc, 0x3e,0x11,0xf0,0x3, 0x1c,0x85, +0xe2,0x1, 0xc6,0x7f,0xe0,0x0, 0xc6,0x1, 0xe8,0xc, 0x3e,0x19,0xf8,0x40,0x3b,0xe9, +0xf0,0x0, 0x13,0x0, 0xe9,0x80,0x8f,0x17,0xe8,0x40,0x3f,0xe6,0xe2,0x1, 0xc7,0xff, +0x3f,0x7f,0x3e,0xee,0x3, 0x83,0xe8,0x40,0x3e,0xe6,0xe8,0x40,0x3e,0x77,0xf0,0x40, +0x3b,0x6d,0xf2,0x1, 0xc3,0x7f,0x1, 0xef,0xf8,0x40,0x38,0xe6,0xf0,0x2, 0x23,0x5f, +0xe0,0x1, 0x1f,0xf2,0xfb,0xe6,0x7e,0x12,0xfb,0xe6,0x7d,0x91,0xf0,0x0, 0xa2,0xf, +0xe0,0x2, 0x1f,0xfd,0xf8,0x0, 0x89,0xc, 0xf8,0x0, 0x88,0xb, 0xf0,0x0, 0x10,0x80, +0xf0,0x0, 0x8a,0xdf,0xe8,0x40,0x3b,0x62,0xe8,0x40,0x38,0xe0,0x16,0x1, 0xf0,0x1, +0x11,0xff,0xf8,0x40,0x3d,0x61,0x3d,0x62,0xe0,0x0, 0x1f,0xd, 0xe8,0x40,0x3f,0xe9, +0xf8,0x40,0x3e,0xea,0x15,0x80,0x0, 0x85,0xf0,0x40,0x3b,0xff,0xc7,0x2, 0x1, 0x2b, +0xe1,0x80,0x8e,0x9f,0x3e,0xfc,0x1, 0xf9,0x8c,0x8e,0xc5,0x81,0xe2,0x1, 0xc5,0xff, +0xe2,0x0, 0xcd,0x81,0x8c,0x1e,0xe8,0xd, 0x3c,0xb5,0xe0,0x6a,0x39,0x28,0x3e,0x98, +0xe0,0x63,0x39,0x29,0xf2,0x0, 0xcb,0x1, 0x36,0xa1,0xe8,0xd, 0x3e,0x94,0xe0,0x1, +0x1, 0x25,0x96,0x8d,0xc7,0x2, 0xe8,0x40,0x3e,0xfd,0xe0,0x6a,0x3a,0x28,0xe8,0x40, +0x3e,0xfd,0xe0,0x63,0x3a,0x29,0xe8,0x40,0x3e,0xfd,0xe0,0x7d,0x3a,0x2d,0xf0,0x40, +0x3b,0xff,0x1, 0xd7,0x25,0x8a,0xf0,0xf, 0x30,0xa1,0x3f,0x97,0xf0,0x0, 0xc0,0x81, +0xa9,0x8f,0xf2,0x1, 0xc0,0xff,0xad,0x1f,0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0xe8,0x40, +0x3e,0x76,0xe7,0xff,0x5, 0xbb,0xf2,0x0, 0xc8,0x81,0xf0,0xa, 0x30,0xa1,0xe0,0x1, +0x1, 0x6b,0x17,0xff,0xe8,0x0, 0xaf,0x8c,0xe8,0x0, 0xaf,0x8b,0xe0,0x2, 0x1c,0xc3, +0xe0,0x0, 0x1c,0xd, 0xf0,0x7, 0xa8,0xc7,0xf0,0x0, 0xa8,0x84,0xe0,0x2, 0xd9,0xa, +0x88,0x84,0xe8,0x0, 0xa8,0x88,0xe0,0x1, 0x20,0xdf,0x12,0x0, 0xc2,0x1, 0xe2,0x1, +0xc2,0x7f,0x38,0xf4,0xe0,0x0, 0x1b,0xd, 0xe0,0x0, 0x15,0xe4,0xe0,0x0, 0x1, 0x4a, +0x8c,0x86,0x8d,0x16,0x3b,0xe9,0x39,0xea,0xe0,0x40,0x3e,0x64,0xe0,0xf, 0x36,0x21, +0xe0,0xe, 0x3a,0x9f,0x8e,0x8e,0x8f,0x1e,0xe0,0x8, 0x3b,0xad,0xe2,0x0, 0xcc,0x0, +0xe0,0xf, 0x3c,0xad,0x3e,0xa9,0xe0,0x8, 0x39,0xae,0xe2,0x1, 0xc6,0xff,0xe2,0x1, +0xc7,0xff,0xe0,0x6f,0x3d,0x2d,0xe2,0x0, 0xcc,0x0, 0xe0,0xd, 0x3d,0x2e,0x3f,0x2a, +0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc6,0xff,0xe0,0x6d,0x3d,0x2e,0x3c,0x6d,0x39,0x6f, +0xe2,0x1, 0xc1,0x7f,0xe2,0x1, 0xc4,0x7f,0x39,0x78,0x3f,0x6d,0xc6,0x1, 0x3e,0xeb, +0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc6,0x7f,0x3, 0x82,0x3f,0xee,0x3f,0x6f,0xe2,0x1, +0xc7,0x7f,0x3f,0x7d,0x5, 0x82,0x3f,0xeb,0x38,0xfc,0x3d,0xef,0xe2,0x1, 0xc5,0xff, +0x1, 0xc6,0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0x38,0xf4,0xc3,0x2, 0xe7,0xff,0x1, 0xba, +0xe2,0x0, 0xcd,0xe4,0x17,0x80,0xe0,0x6f,0x39,0xab,0x3d,0xef,0x67,0x1, 0xad,0x8e, +0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xfa,0x13,0x7c,0x11,0xf0,0x0, 0x88,0x84, +0xe0,0x0, 0x1a,0x8d,0xe7,0xfd,0x0, 0xf7,0xf2,0x1, 0xc9,0x7f,0xe7,0xfe,0x1, 0x5b, +0xe0,0xd, 0x3c,0xa6,0xe0,0x43,0x3e,0x9d,0xe2,0x0, 0xce,0x80,0xf0,0x2, 0x39,0x29, +0xe8,0xd, 0x3c,0xa2,0xe2,0x1, 0xc1,0x7f,0xe0,0x1e,0x3c,0x21,0xe2,0x1, 0xc6,0xff, +0xe0,0x6d,0x3d,0x22,0xf8,0x43,0x3f,0x1e,0x39,0x6d,0xf2,0x0, 0xcf,0x0, 0xe8,0xd, +0x3c,0x20,0xf0,0x1e,0x38,0x28,0xe2,0x1, 0xc6,0xff,0xf2,0x1, 0xc7,0x7f,0xe8,0x6d, +0x3d,0x2e,0x3e,0x92,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf3,0xe8,0x40,0x39,0x63, +0xe0,0x62,0x3c,0xad,0xe8,0x40,0x3e,0xf3,0xe0,0x6a,0x3c,0xa8,0xe8,0x40,0x3e,0xf3, +0xf0,0x40,0x39,0xe2,0xe0,0x63,0x3c,0xa9,0xe7,0xfe,0x0, 0x88,0xeb,0xe6,0x7d,0x90, +0xea,0x13,0x7e,0x11,0xeb,0xe6,0x7e,0x92,0xeb,0xe6,0x7f,0x11,0x15,0x7f,0xe0,0x0, +0x14,0xe4,0xac,0x8b,0xaf,0x8c,0xad,0xd, 0xad,0xe, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe0,0x0, 0x1f,0x85,0x8f,0x8f,0x27,0x96,0xe0,0x10,0x8f,0x25,0xe2,0x0, +0xcf,0x10,0x2, 0xae,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe4,0x0, 0xc7,0x8a,0x3f,0x65, +0x3f,0x95,0x0, 0x86,0xe0,0x10,0x8e,0xae,0xe2,0x0, 0xce,0x90,0x2, 0xa1,0x3f,0x7f, +0xc7,0xa, 0x1, 0xf9,0xfa,0x13,0x7c,0x11,0x14,0x1, 0xdb,0x6f,0xf0,0x0, 0x88,0x84, +0xe7,0xfd,0x0, 0x89,0x87,0x7, 0x87,0x97,0xe8,0x0, 0xaf,0xc, 0xe8,0x0, 0xaf,0x8b, +0xe7,0xfe,0x0, 0x96,0x3d,0xe1,0xe7,0xfe,0x0, 0xfb,0xfb,0xe6,0x7e,0x12,0xfb,0xe6, +0x7d,0x91,0xe8,0x40,0x3d,0x61,0xe7,0xfe,0x0, 0x86,0x14,0x1, 0x0, 0xe7,0xfa,0x13, +0x7c,0x11,0x14,0x3, 0x0, 0xe3,0x0, 0x0, 0xe0,0x1, 0x1f,0x8e,0x8f,0x8f,0xe0,0x1, +0x27,0x82,0x8, 0xb4,0xf7,0xff,0x11,0x7f,0xf0,0x12,0x39,0x1f,0xf0,0x0, 0x12,0x1, +0xf2,0x1, 0xc1,0x7f,0xf0,0x14,0x3a,0x19,0xf0,0x0, 0x10,0xa, 0xe0,0x2, 0x1a,0x5e, +0xf4,0x0, 0xc1,0xa, 0xf2,0x1, 0xc2,0x7f,0x11,0xa, 0xf0,0x10,0x38,0x39,0xe8,0x2, +0x39,0x34,0x10,0xff,0xf0,0x1, 0xc1,0x52,0xf0,0x10,0x38,0x14,0x38,0x9a,0xf0,0x2, +0x19,0xd9,0xf0,0x12,0x39,0x14,0x39,0x14,0xe0,0x1, 0x11,0xff,0xf0,0x0, 0xc0,0x4, +0x38,0xa9,0x3c,0xfa,0x3, 0xa4,0xe8,0x0, 0x8e,0x43,0xe8,0x0, 0x8f,0x80,0xf8,0x40, +0x38,0xe3,0xe0,0x2f,0x3f,0x8c,0xf0,0x40,0x3b,0xe9,0xe1,0x35,0x3e,0x3, 0x27,0x83, +0xf0,0x0, 0x2a,0x9c,0xf0,0x40,0x3b,0x61,0xf2,0x1, 0xc3,0x7f,0x3e,0xe2,0x17,0x0, +0x0, 0x89,0x8f,0xcd,0xc7,0x1, 0xe0,0x2f,0x3f,0x8c,0xe8,0xf, 0x3f,0xd5,0xc6,0x8a, +0x2f,0x8c,0xe8,0x40,0x3f,0x76,0xe8,0x17,0x3f,0x14,0x1, 0xf4,0xf0,0x0, 0xc1,0x8a, +0xf8,0x40,0x39,0xf2,0x1, 0xd7,0xa, 0x61,0x17,0x8a,0x3f,0xbc,0xf4,0x0, 0xc3,0x8a, +0x3f,0x94,0xe0,0x2, 0xc7,0xac,0x8f,0x8f,0x2f,0x83,0xe8,0x11,0x3a,0x17,0x17,0xa, +0x3f,0x38,0xe8,0x0, 0x8f,0xc1,0x3f,0x1b,0xaf,0xce,0xe8,0xf, 0x3a,0x17,0xe8,0x0, +0x9e,0x91,0xe8,0x0, 0x9e,0x1, 0xb6,0x9e,0xf0,0x0, 0xc1,0x8a,0xb6,0xe, 0xf8,0x40, +0x39,0xf2,0x8e,0xdf,0xc4,0x1, 0xae,0xde,0xe2,0x1, 0xc4,0x7f,0x8e,0xef,0xae,0xee, +0x8e,0xff,0xae,0xfe,0xe0,0x1, 0x8f,0x8f,0xe0,0x1, 0xaf,0x8e,0xe7,0xff,0x1, 0xab, +0x0, 0xd3,0x38,0x82,0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1f,0x52,0x8f,0x8f,0x8f,0xe, +0x2f,0x9a,0x2f,0x19,0xe0,0x0, 0x1f,0xe, 0x8e,0x8e,0xe0,0x0, 0x1f,0x13,0x8f,0xe, +0x3e,0xfe,0x5, 0x90,0xe0,0x2, 0x1f,0x51,0xe0,0x2, 0x1e,0xd0,0x8e,0xe, 0xe0,0x2, +0x1f,0x5f,0xae,0xd, 0x8e,0xe, 0x3e,0x7f,0x2, 0xa2,0xea,0x22,0x7f,0xba,0x17,0x0, +0xaf,0xf, 0x38,0x82,0xe0,0x0, 0x1e,0x8e,0xe0,0x0, 0x1d,0x8d,0x8e,0xd, 0xe0,0x0, +0x1e,0x93,0x8e,0x8d,0x3e,0xfc,0xe0,0x2, 0x1e,0xd0,0x3, 0x86,0x15,0x1, 0xe2,0x0, +0xce,0x1, 0xad,0xd, 0x1, 0x1a,0xe0,0x2, 0x1e,0x51,0x8e,0xc, 0x3e,0x7e,0x3, 0xe0, +0xaf,0xd, 0xe0,0x2, 0x1f,0x5f,0x8e,0xe, 0x3e,0x7f,0x5, 0xe0,0xea,0x22,0x7e,0x3a, +0x8d,0x8c,0x8e,0x8d,0x3e,0xfb,0x5, 0xde,0xaf,0x8e,0xc5,0x81,0xe0,0x0, 0x1f,0xbe, +0xad,0x8c,0x17,0x1, 0xaf,0xf, 0x38,0x82,0x8d,0xb, 0xe2,0x0, 0xcd,0x1, 0x5, 0x87, +0xe0,0x2, 0x1e,0x7d,0x8e,0x4c,0xc6,0x7e,0x3e,0x7a,0x2, 0x5e,0x8d,0x9b,0xe2,0x0, +0xcd,0x81,0x5, 0x87,0xe0,0x2, 0x1e,0x7d,0x8e,0x5c,0xc6,0x7e,0x3e,0x7b,0x2, 0x54, +0x16,0x0, 0xae,0xd, 0x0, 0xd1,0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1e,0x5f,0x8d,0x8f, +0x8f,0xc, 0xe0,0x0, 0x1e,0xbe,0x17,0x80,0x3f,0x7b,0xaf,0x8d,0x3, 0x9e,0xe0,0x2, +0x1f,0xd2,0xe0,0x2, 0x1f,0x51,0x8f,0x8f,0x8f,0xe, 0xe0,0x2, 0x1d,0x50,0x3f,0xfe, +0x5, 0x9b,0xaf,0x8a,0x2f,0x84,0x17,0x81,0xaf,0x8a,0x17,0x81,0xea,0x22,0x7f,0x3b, +0x8d,0xe, 0x3d,0x7f,0x3, 0x94,0xad,0x8c,0x17,0x81,0xe0,0x2, 0x1e,0x4f,0xc5,0x1, +0xaf,0x8c,0xad,0xe, 0xaf,0x8d,0x38,0x82,0xea,0x22,0x7f,0x3b,0xaf,0x8e,0xe0,0x2, +0x1f,0x4f,0xaf,0x8e,0x38,0x82,0x3f,0xee,0xaf,0xa, 0x0, 0xe5,0x17,0x80,0xaf,0x8e, +0x38,0x82,0xe0,0x3, 0x1f,0x17,0x8f,0x8e,0xe2,0x1, 0xcf,0xf9,0x2, 0x83,0xc7,0x81, +0xaf,0x8e,0x38,0x82,0xe0,0x3, 0x1c,0x3d,0xe0,0x4, 0x15,0x6a,0x14,0x80,0xe0,0x4e, +0x0, 0xa3,0x0, 0x0, 0xe0,0x3, 0x1c,0xbd,0xe0,0x2, 0x1f,0x5f,0x8d,0x9, 0x8c,0xe, +0xe0,0xf, 0x3c,0x9a,0x17,0x0, 0xaf,0x2f,0x24,0x1b,0x15,0xff,0x3d,0x98,0xe2,0x1, +0xc5,0xff,0xc5,0x81,0x17,0x28,0x3f,0x3a,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1f,0xde, +0x3f,0x19,0x3d,0x9f,0x96,0xf, 0x96,0x9f,0xc7,0x8a,0xe0,0x1, 0xb6,0x1e,0x3f,0xfb, +0xc7,0x4, 0xe0,0x1, 0xb6,0x8e,0x1, 0xf7,0xe0,0xf, 0x3c,0x9a,0xac,0x2f,0xc5,0x1, +0xe2,0x1, 0xc5,0x7f,0xe2,0x0, 0xcd,0xf, 0x1, 0x18,0xad,0x9, 0xe0,0x0, 0x16,0x0, +0xe0,0x3, 0x1f,0x3c,0xe0,0x3, 0x1d,0x3b,0xe1,0x80,0x8e,0x9e,0x3f,0xec,0xe2,0x1, +0xc7,0xff,0x3e,0xff,0x3d,0xed,0x3, 0x82,0x3d,0xec,0x3f,0x7a,0x3e,0x6b,0xe2,0x1, +0xc6,0x7f,0x1, 0xf3,0xae,0x19,0x38,0x82,0x17,0x80,0xaf,0x89,0x0, 0xe8,0xf0,0x3, +0x1b,0x3c,0xf0,0x3, 0x1a,0x3a,0xf0,0x3, 0x19,0x3b,0xf0,0x3, 0x19,0xbd,0xf0,0x0, +0x12,0x80,0xf0,0x0, 0x13,0xcf,0xe9,0x80,0x8f,0x96,0x27,0xb5,0x15,0x7f,0x3d,0x1f, +0xe2,0x1, 0xc5,0x7f,0xe8,0xa, 0x3d,0x15,0x35,0x22,0xc5,0x16,0xe8,0xa, 0x3d,0x13, +0xe8,0x40,0x3d,0xe4,0x0, 0x83,0x3d,0x7b,0x1, 0x26,0x9e,0xb, 0x9e,0x9b,0xe0,0xf, +0x3c,0x2c,0xe3,0xff,0xc7,0xff,0xf0,0x43,0x38,0x9f,0xe0,0xe, 0x3c,0xad,0xf2,0x0, +0xc8,0x80,0xe3,0xff,0xc7,0x7f,0x3e,0x28,0xf0,0x43,0x38,0x9e,0xe3,0xff,0xc6,0x7f, +0xe0,0x6f,0x3d,0x2c,0x3e,0xa9,0xf2,0x0, 0xc8,0x80,0xe3,0xff,0xc6,0xff,0xe0,0x6e, +0x3d,0x2d,0xf1,0x2f,0x3b,0xaf,0xc5,0x84,0xf1,0x2e,0x3b,0xae,0x27,0xdd,0x27,0x5c, +0x14,0x1, 0x38,0x82,0xf8,0x40,0x3b,0x72,0xf0,0x0, 0xc2,0x28,0xf0,0x0, 0xc2,0x8a, +0x1, 0xc3,0x14,0x0, 0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfd, +0xc0,0x60,0xe0,0x2, 0x1e,0xdf,0xea,0x22,0x7f,0xb8,0xf0,0x0, 0x8d,0xd, 0x7f,0x8b, +0xf0,0x0, 0x25,0xf, 0x97,0x8f,0xc7,0x81,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0xe4, +0xe0,0x3, 0x5, 0xc1,0x66,0x8b,0xe0,0x0, 0x17,0xe4,0xb7,0x8d,0x0, 0x83,0xf0,0x0, +0xb5,0xf, 0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0xdf,0xe2,0x0, 0xcf,0x81,0xea,0x22, +0x7f,0xb6,0x7f,0x8a,0xe0,0x8, 0x1, 0xc, 0x8f,0x8f,0xe0,0x3, 0x2f,0xa7,0xe0,0x2, +0x1f,0xcf,0x8f,0x8f,0x7f,0x87,0xe0,0x3, 0x2f,0x9c,0xe0,0x0, 0x1f,0xaa,0xe0,0x2, +0x1e,0xe2,0x9e,0xf, 0x9f,0xd, 0x9e,0xf, 0x9d,0x8f,0xe0,0xe, 0x3e,0x2e,0xe2,0x1, +0xc7,0x7f,0xe0,0x1, 0x1f,0xe8,0x7f,0x5, 0x8e,0xf, 0x67,0x5, 0xe2,0x0, 0xce,0x2, +0xc7,0x2, 0x66,0x5, 0xe2,0x1, 0xc7,0x7f,0xb5,0x8d,0x17,0x80,0xe0,0x2, 0x1e,0xc9, +0xe0,0x6c,0x39,0x2e,0x17,0x0, 0x7e,0x5, 0xaf,0xd, 0x7f,0xa6,0x7f,0xa7,0x7f,0xa8, +0x7f,0xa9,0x7f,0xaa,0x7f,0xab,0x7f,0xac,0x7f,0xad,0x7f,0xae,0x7f,0xaf,0xf0,0x2, +0x2d,0x7e,0xe0,0x1, 0x1f,0x8e,0x89,0xf, 0x7f,0x91,0xe0,0xb, 0x21,0x66,0x11,0xff, +0xea,0x21,0x7f,0x14,0x39,0x92,0xf0,0x40,0x3c,0xee,0xea,0x22,0x7f,0xac,0xe2,0x1, +0xc1,0xff,0xea,0x22,0x7e,0xa0,0xea,0x22,0x7d,0xc, 0xea,0x21,0x7d,0xf8,0xea,0x21, +0x7e,0x8, 0xc1,0x81,0xe8,0x40,0x3f,0x69,0x39,0x9f,0x14,0x80,0x14,0x0, 0x12,0xff, +0xe0,0x0, 0x12,0x1, 0xe1,0x80,0xac,0x9f,0xc7,0xa, 0x3f,0xf3,0xe0,0x40,0xaa,0xee, +0xe1,0x80,0xac,0x9d,0xe1,0x80,0xb4,0x1a,0xe1,0x80,0xb4,0x1b,0xe1,0x80,0xaa,0x1c, +0x1, 0xf2,0xe0,0x0, 0x1f,0x51,0x7f,0x17,0xac,0x8e,0xf0,0xb, 0x25,0x3c,0x67,0x85, +0x66,0x85,0x37,0xa3,0xc7,0x94,0x7f,0x98,0xea,0x22,0x7f,0xa0,0x3b,0x6f,0xea,0x22, +0x7f,0x8c,0x7f,0x89,0xea,0x22,0x7f,0xac,0xe4,0x0, 0xc6,0x9e,0xf0,0x0, 0x63,0x7, +0x7f,0x8d,0xea,0x21,0x7f,0x88,0xf0,0x2, 0x1c,0x5e,0x7e,0x99,0x7f,0x93,0xe8,0x40, +0x3a,0x66,0xf8,0x40,0x3f,0x69,0x17,0x8a,0x3f,0xb4,0xf0,0xe, 0x3c,0x1f,0x81,0xce, +0xe2,0x0, 0xc1,0x8f,0x39,0xf2,0x3, 0xbd,0xf0,0x0, 0x14,0x8a,0xf0,0x19,0x3c,0xb3, +0xf8,0xb, 0x3c,0x19,0xe0,0x2, 0xc5,0xac,0x8c,0xb, 0xe2,0x0, 0xcc,0x1, 0xe0,0x4, +0x1, 0x28,0x64,0x89,0xe0,0x5, 0x31,0xa1,0x3c,0x95,0x95,0x89,0xc5,0x81,0xb5,0x89, +0x2c,0x10,0xea,0x20,0x7d,0xe0,0xea,0x21,0x7d,0x78,0xe0,0x9, 0x31,0xa2,0xf0,0x0, +0x93,0xe, 0x93,0x9e,0x3d,0x99,0x3d,0x15,0xf0,0x0, 0xb3,0xb, 0xb3,0x9b,0xb4,0xa, +0x21,0x18,0xe8,0x0, 0x8a,0xce,0xe8,0x40,0x3d,0xee,0x39,0xf5,0x17,0x1, 0x1, 0x89, +0xe0,0xa, 0x0, 0xda,0xe0,0x1, 0x8e,0xeb,0xc5,0x8a,0x39,0xfd,0xe0,0x2, 0x1, 0x31, +0x3e,0xee,0xe2,0x1, 0xc6,0xff,0x3e,0xf2,0x3d,0x6e,0x17,0x1, 0x3f,0x1a,0x4, 0xf3, +0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0xf0,0x40,0x3d,0x74,0xe7,0xff,0x2, 0xb6,0x12,0x8a, +0x3a,0xb2,0xe0,0x1, 0x14,0x40,0xe0,0x2, 0x1c,0xde,0x3d,0x65,0x3c,0x10,0xf8,0x40, +0x3c,0xee,0xe0,0x2, 0xd5,0x4f,0xf0,0xb, 0x25,0x77,0xe0,0x2, 0x1f,0xfd,0x12,0x7f, +0xe8,0x4, 0x3a,0x1a,0x8b,0xcf,0x8b,0x5f,0xe2,0x1, 0xc2,0x7f,0xc2,0x1, 0x33,0xa6, +0x33,0x26,0xe4,0x0, 0xc2,0xa, 0xea,0x22,0x7e,0xa0,0xc3,0xe0,0xc3,0x60,0x39,0xed, +0xea,0x16,0x7c,0x4c,0xe0,0x2, 0x1c,0xde,0xe0,0x43,0x3b,0x97,0xe0,0x43,0x3b,0x16, +0xe8,0x4, 0x3a,0x18,0xf0,0x0, 0x13,0xa0,0x8d,0x49,0xe0,0xf, 0x39,0x9a,0x8d,0x8f, +0xe0,0x0, 0x25,0xc6,0xe0,0x0, 0x21,0x44,0xe8,0x40,0x3f,0x69,0x3e,0xe8,0x17,0x80, +0x0, 0x8d,0xe2,0x0, 0xcd,0x82,0xe0,0x1, 0x1, 0x37,0xc7,0x81,0x3e,0x6f,0xe2,0x1, +0xc6,0x7f,0x3e,0x72,0xc7,0xa, 0xc6,0x8a,0x3, 0xb2,0xe2,0x0, 0xcd,0x81,0x1, 0xf2, +0x8e,0x4e,0x3e,0x7a,0x1, 0xf3,0xe4,0x0, 0xc7,0x8a,0x35,0x22,0xe2,0x1, 0x7e,0x98, +0x3e,0x9a,0xf0,0xe, 0x3c,0x9f,0x96,0xd, 0x97,0xe, 0xe8,0x40,0x3e,0xe7,0x3f,0x1c, +0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x1f,0x5, 0x5, 0x3b,0xfe,0x3e,0xee,0xe0,0x6d, +0x3d,0x27,0xe2,0x1, 0x7f,0x18,0xe8,0xf, 0x3f,0x99,0x3d,0x1e,0x97,0x1a,0x97,0x9f, +0xb6,0x89,0x3f,0x9e,0xe0,0x43,0x3f,0x9f,0xe2,0x0, 0xcf,0x9f,0xe8,0x40,0x3f,0x67, +0x5, 0x5, 0x3b,0x7f,0x3f,0x6f,0xe0,0x6e,0x3d,0x26,0xb7,0x19,0xc4,0x8a,0x3a,0x79, +0xe7,0xff,0x1, 0xb4,0xe8,0x40,0x3c,0xe9,0x3d,0x65,0xe0,0x2, 0xd4,0xdb,0xe0,0x1, +0x14,0xc0,0x3d,0x65,0x3c,0x90,0xe8,0x40,0x3c,0x69,0xe0,0x2, 0xd4,0xd3,0xe0,0x0, +0x21,0x40,0x12,0x7f,0x3a,0x12,0xe2,0x1, 0xc2,0x7f,0xc2,0x1, 0xe4,0x0, 0xc2,0xa, +0xe0,0x2, 0x1a,0xde,0xe8,0x40,0x3e,0xe9,0xe8,0x4, 0x3a,0x19,0xf7,0xff,0x13,0xfd, +0x13,0x80,0x13,0x0, 0xf7,0xff,0x13,0x7f,0x8f,0x4d,0x17,0x8a,0x3f,0xbe,0x3f,0x72, +0x3f,0x95,0xe0,0x2, 0xc7,0xac,0x3, 0xa1,0x87,0x8f,0xea,0x22,0x7c,0x2c,0xe8,0xf, +0x3f,0xd7,0xe2,0x1, 0xc7,0xfd,0xea,0x22,0x7c,0xa0,0xea,0x22,0x7d,0xc, 0xea,0x21, +0x7d,0xf8,0xea,0x21,0x7e,0x8, 0xe2,0x0, 0xcf,0x81,0xe0,0x3, 0x37,0x21,0x3c,0x1e, +0x3c,0x9e,0x3d,0x13,0x3d,0x93,0x3f,0x1c,0x1, 0x88,0xf0,0x0, 0xab,0x4d,0xab,0x88, +0xab,0x89,0xb3,0xa, 0xb3,0xb, 0xaf,0x8e,0xc6,0x8a,0x3e,0xf4,0x1, 0xd6,0xe0,0x2, +0x1f,0xdf,0x17,0x0, 0xf0,0x0, 0xad,0xf, 0xe0,0x3, 0x1f,0x97,0xaf,0xf, 0xe0,0x2, +0xc0,0x20,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x66,0x8a,0xc7,0xff,0xaf,0x8d,0xe7,0xfc, +0x0, 0xd8,0x67,0xb, 0xb7,0x8e,0xe7,0xfc,0x0, 0xc6,0xe0,0x2, 0x1f,0x5d,0x8f,0xe, +0xe0,0x6, 0x2f,0x44,0xe0,0x1, 0x1f,0xe, 0x89,0xe, 0x7f,0x11,0xe7,0xfd,0x29,0x1, +0xe0,0x0, 0x1e,0xd1,0xea,0x21,0x7f,0x14,0xf0,0x40,0x3c,0xee,0x7e,0x97,0xa9,0xd, +0xe7,0xfd,0x0, 0xa7,0x8e,0x4d,0x3e,0x7a,0xe7,0xfe,0x1, 0xc9,0xe4,0x0, 0xc7,0x8a, +0x35,0x22,0xe2,0x1, 0x7e,0x98,0x3e,0x9a,0xe0,0xe, 0x3c,0x1f,0x96,0xd, 0x97,0xe, +0xe8,0x40,0x3e,0xe7,0x3f,0x1c,0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x1f,0xe0,0x5, +0x2, 0x46,0xe2,0x1, 0x7f,0x18,0x3f,0x98,0x3d,0x1e,0x97,0x1a,0x97,0x9f,0xb6,0x89, +0x3f,0x9e,0xe0,0x43,0x3f,0x9f,0xe2,0x0, 0xcf,0x9f,0xe8,0x40,0x3f,0x67,0xe7,0xfe, +0x5, 0x5e,0x3f,0xf6,0x3f,0x66,0xe0,0x6e,0x3d,0x2f,0xe7,0xfe,0x0, 0xd8,0x3a,0xe3, +0xf0,0x0, 0x15,0x8a,0xf0,0x1b,0x3d,0xba,0xe8,0x1d,0x3f,0x98,0xf8,0xe, 0x3f,0x1b, +0xe0,0x0, 0x11,0x78,0x9d,0x9e,0x9d,0xe, 0xe8,0x0, 0x9c,0x9d,0xe8,0x0, 0x9c,0xd, +0x39,0x35,0xea,0x17,0x7f,0x30,0xe0,0x1c,0x39,0x1e,0x7f,0x81,0xef,0xfc,0xdf,0x8, +0xe0,0xe, 0x32,0xa2,0xea,0x20,0x7d,0xe0,0x3d,0x6e,0x3d,0x1b,0x9d,0x9a,0x3b,0xe8, +0x9d,0xa, 0xe8,0x0, 0x9c,0x9d,0xe8,0x0, 0x9c,0xd, 0x7f,0x10,0xef,0xfc,0xde,0xf8, +0xea,0x21,0x7d,0xf8,0xe0,0x16,0x32,0xa1,0xe8,0xb, 0x3d,0x96,0x91,0xb, 0x7c,0x14, +0x39,0x17,0xe3,0xff,0xc1,0x7f,0xe2,0x1f,0xc9,0x20,0x67,0x81,0xe0,0x3, 0x2, 0xd9, +0xb1,0xb, 0xf8,0xa, 0x3f,0x1b,0x65,0x8d,0xe8,0x0, 0x9e,0x9d,0xf8,0x0, 0x9d,0x8d, +0x94,0xa, 0x95,0x1a,0x3d,0x95,0xf8,0x0, 0x8e,0xed,0x8c,0x8b,0xf0,0x8, 0x3d,0xa8, +0x65,0x89,0xe0,0xa, 0x3e,0xaa,0xe0,0x43,0x3c,0x18,0xe0,0x43,0x3d,0x1a,0xe8,0xb, +0x3d,0x96,0xf0,0x0, 0x7e,0x8e,0x7e,0x86,0x7c,0x15,0x7d,0x16,0xf0,0x0, 0x9e,0x8b, +0xe0,0x1, 0x24,0x9d,0x15,0x98,0x3d,0xb9,0xf7,0xff,0x12,0xe8,0xe8,0xb, 0x3d,0x9c, +0xf0,0x15,0x3a,0x9b,0xe0,0x0, 0x15,0x68,0xf8,0x15,0x8, 0x5, 0x3d,0x10,0xe2,0x0, +0xcc,0x81,0xf8,0xa, 0x8, 0x15,0xf0,0x0, 0x9b,0x5a,0xe0,0x8, 0x5, 0xf9,0xf7,0xff, +0x12,0xd0,0xf0,0x15,0x3a,0x9b,0xf8,0x15,0x8, 0x5, 0xe0,0x1, 0x15,0x80,0x3d,0x90, +0xf8,0xb, 0x8, 0x15,0xf8,0x40,0x3a,0xec,0x65,0x7, 0x14,0x0, 0xc5,0x1, 0xe8,0x0, +0x97,0x55,0xe2,0x1, 0xc5,0x7f,0x3c,0xfa,0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0xf0,0x0, +0xc2,0x98,0x2, 0xf5,0x7f,0x81,0xf0,0x0, 0x7b,0x4, 0xe0,0x2, 0xd3,0x49,0x65,0x93, +0xe3,0xff,0xc4,0x7f,0x3d,0x95,0x8d,0x8b,0x7c,0xf, 0x67,0x81,0xf0,0x0, 0x63,0x4, +0xe0,0x0, 0x2d,0xf1,0x67,0x18,0xe8,0x40,0x3d,0xe6,0xf0,0x40,0x3b,0x7e,0x5, 0x5, +0x66,0x98,0x3e,0xf7,0xe0,0x4, 0x4, 0x79,0xe0,0x0, 0x4d,0x68,0x5c,0xb9,0xe4,0x0, +0xc5,0x5, 0x16,0x80,0x3c,0xfa,0x7e,0x92,0x5, 0xa, 0xe0,0x1, 0x4d,0x0, 0xe0,0x0, +0x5c,0xc5,0xe4,0x0, 0xc5,0x5, 0x3c,0xfa,0xe0,0x4, 0x2, 0x60,0x65,0x19,0x3d,0x1b, +0x3d,0x77,0xe0,0x3, 0x4, 0x38,0xe4,0x0, 0xc5,0x83,0xe0,0x2b,0x3b,0x9b,0xe0,0x4, +0x25,0xe2,0xe0,0x0, 0x15,0xe4,0xe1,0x2b,0x3b,0x9b,0xe0,0x4, 0x25,0xdc,0x66,0x92, +0xe0,0x6, 0x2e,0xdd,0xe0,0x1, 0x17,0x48,0x7f,0xc, 0xe0,0x3, 0x0, 0xa7,0xea,0x21, +0x7f,0x78,0xe0,0x7, 0x31,0xa1,0xea,0x22,0x7d,0x2c,0xea,0x22,0x7d,0x8c,0xea,0x21, +0x7f,0x88,0xc2,0x1, 0x14,0x80,0x3f,0x17,0xe2,0x1, 0xc2,0x7f,0x12,0x80,0x3d,0x13, +0xe0,0x16,0x3b,0x13,0x3d,0x97,0xf8,0x17,0x3f,0x19,0x3f,0x93,0xb4,0x8e,0xf0,0x40, +0x3d,0x74,0x17,0x7f,0xaa,0x8a,0xe8,0x0, 0xaa,0x86,0xb4,0x8b,0xe8,0x0, 0xaf,0x47, +0xac,0xf, 0xe7,0xfb,0x2, 0xa2,0xe7,0xfb,0x0, 0xec,0x65,0x93,0x7c,0x9a,0x3d,0x95, +0x8d,0x8b,0x7c,0x9b,0x7c,0x9c,0x7c,0x9d,0x7c,0x9e,0x7c,0x9f,0x7c,0xa0,0x7c,0xa1, +0x7c,0xa2,0x7c,0xa3,0x7c,0xa4,0x7c,0xa5,0xe0,0x3, 0x25,0xfb,0xf0,0x40,0x3b,0x69, +0x7c,0x8f,0xe0,0xa, 0x3b,0x15,0x67,0x7, 0x64,0x93,0xc5,0xff,0x3c,0x95,0x7f,0x12, +0xe0,0x0, 0x16,0xf8,0x17,0x1, 0x8d,0xa, 0xad,0x89,0xe0,0x1, 0x15,0xb4,0x7e,0x8c, +0x7f,0x8, 0xe0,0x1, 0x2d,0x51,0xe1,0x2b,0x3b,0x9b,0xe0,0x1, 0x25,0xc5,0x66,0x88, +0xe0,0x1, 0x26,0xc2,0xf0,0x0, 0x62,0x85,0xe0,0xb, 0x3b,0x15,0x14,0x81,0xac,0x8b, +0xf2,0x1, 0xc2,0xff,0xf0,0x40,0x3b,0x6a,0xe0,0x0, 0x15,0xe4,0xe8,0xb, 0x3d,0xb5, +0xe3,0xff,0xc5,0xfc,0xe2,0x5, 0xcd,0x80,0x5, 0x8a,0x66,0x8a,0x8d,0xd, 0xe2,0x0, +0xcd,0x0, 0xe0,0x5, 0x15,0x0, 0xe0,0x6a,0x39,0xab,0x3d,0xea,0x3d,0xf7,0xe0,0x1, +0x3, 0x98,0xf2,0x0, 0xce,0x82,0xe0,0x1, 0x5, 0x94,0xf8,0xb, 0x3c,0x19,0xe0,0x2, +0xc5,0xac,0xe0,0x9, 0x3b,0x15,0x14,0x0, 0x8d,0xb, 0xac,0x9, 0xe0,0x2, 0x2d,0x39, +0x15,0x3, 0xad,0xb, 0x15,0x8a,0x3d,0xb5,0x15,0x3, 0xe8,0xb, 0x3d,0x98,0xe0,0x2, +0xc5,0xad,0xad,0xb, 0xf0,0x0, 0x25,0x3d,0x16,0xff,0xe8,0xd, 0x3e,0x9a,0xf0,0x40, +0x3d,0x6d,0xf2,0x1, 0xc5,0x7f,0x15,0x8a,0xe8,0xb, 0x3d,0xba,0xe8,0xf, 0x3f,0x98, +0xe8,0xb, 0x3d,0x98,0xf0,0x0, 0x91,0xab,0xf0,0x0, 0x92,0x3b,0xf0,0x0, 0x90,0xb, +0xf0,0x0, 0x91,0x1b,0xf0,0x0, 0x90,0xcb,0xf0,0x0, 0x9a,0x8f,0xf0,0x0, 0x9b,0x1f, +0xf0,0x0, 0x8b,0xcf,0x89,0xdf,0x8c,0x6f,0x8c,0xff,0xe0,0x1, 0x8d,0xf, 0xf0,0x0, +0xb0,0xf, 0xc2,0x7f,0xf0,0x0, 0xb1,0x1f,0xe2,0x1, 0xc2,0x7f,0xf0,0x0, 0xb1,0xaf, +0xf0,0x0, 0xb2,0x3f,0xf0,0x0, 0xb0,0xcf,0xf0,0x0, 0xb2,0x8b,0xf0,0x0, 0xb3,0x1b, +0xf0,0x0, 0xab,0xcb,0xa9,0xdb,0xac,0x6b,0xac,0xfb,0xe0,0x1, 0xad,0xb, 0xe0,0xf, +0x3b,0x15,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x43,0xe2,0x0, 0xcf,0x82, +0xe0,0x3, 0x1, 0x7, 0x67,0x8d,0x3a,0x9f,0x8d,0x85,0xe2,0x0, 0xcd,0x85,0xe0,0x0, +0x1, 0x74,0x17,0x98,0x3f,0xbb,0x66,0x8c,0xf0,0xe, 0x3e,0x1f,0x67,0x85,0xae,0x9e, +0xc2,0x1, 0xaf,0x8e,0xe2,0x1, 0xc2,0x7f,0x67,0x8e,0x66,0x92,0xaf,0xae,0xc5,0x81, +0xae,0xbe,0xf0,0x40,0x3d,0x74,0x67,0x88,0x66,0x95,0xaf,0xce,0xb6,0xbe,0x67,0x96, +0x66,0x94,0xb7,0xce,0xb6,0xee,0x67,0x86,0x66,0x8f,0xe0,0x1, 0xb1,0x3e,0xb3,0xde, +0xf0,0x0, 0xb5,0xfe,0xe0,0x1, 0xb7,0x8e,0xf0,0x1, 0xb6,0x9e,0xe0,0x1, 0xb6,0xae, +0x67,0x11,0xad,0x85,0x89,0xe, 0xe7,0xf9,0x2, 0xc0,0xe7,0xfa,0x0, 0x8a,0xf7,0xff, +0x23,0x40,0xe7,0xfe,0x0, 0xec,0x15,0x0, 0xe0,0x0, 0x17,0x6e,0x16,0x80,0xad,0xb, +0x7f,0xc, 0x7e,0x88,0xf0,0x0, 0x13,0x0, 0xf0,0x0, 0x62,0x85,0xf2,0x1, 0xc2,0xff, +0xe7,0xfe,0x0, 0xc4,0xe2,0x0, 0xcd,0x1, 0xe0,0x2, 0x1, 0x52,0xe2,0x0, 0xcd,0x2, +0x1, 0xf2,0xf0,0x0, 0x62,0x85,0xe0,0x1, 0x4c,0x80,0xe0,0x0, 0x5c,0x45,0xf2,0x1, +0xc2,0xff,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xd1,0xda,0xf0,0x0, 0x62,0x82, +0xe0,0xa, 0x34,0x1, 0xe8,0xa, 0x3d,0x35,0xe0,0xb, 0x3b,0x15,0xe3,0xff,0xc5,0x7f, +0xe1,0x36,0x3d,0x17,0x15,0x0, 0xad,0xb, 0x67,0x81,0xe7,0xfe,0x0, 0x9f,0xe0,0x1f, +0x15,0x20,0xb5,0xb, 0xe0,0x1f,0x11,0x20,0xe7,0xfc,0x0, 0xa5,0x67,0xa, 0x17,0x83, +0xaf,0x8e,0xe7,0xf7,0x0, 0xf6,0xe0,0x0, 0x12,0xe0,0xf8,0x40,0x3c,0xec,0xe8,0x5, +0x3a,0x9c,0x11,0x98,0xe8,0x40,0x3c,0x69,0xf0,0x0, 0xc4,0x98,0x3d,0x63,0xe8,0x40, +0x3c,0xe9,0xe0,0x2, 0xd2,0xf, 0xe8,0x40,0x3a,0xf9,0x1, 0xf5,0x66,0x85,0x67,0xc, +0x67,0x8e,0xe8,0xc, 0xae,0x8c,0xc2,0x1, 0x66,0x92,0xe8,0xc, 0xaf,0x1c,0xe2,0x1, +0xc2,0x7f,0x67,0x8, 0xe8,0xc, 0xaf,0xac,0xf0,0x40,0x3d,0x74,0x67,0x95,0xe8,0xc, +0xae,0xbc,0x66,0x96,0xe8,0xc, 0xaf,0x4c,0x67,0x14,0xe8,0x6, 0xb7,0xbc,0xe8,0x6, +0xb6,0xcc,0x67,0x86,0x66,0x8f,0xe8,0x6, 0xb7,0x6c,0x67,0x11,0xe8,0x7, 0xb1,0x3c, +0xe8,0x6, 0xb3,0xdc,0xf8,0x6, 0xb5,0xfc,0xe8,0x7, 0xb7,0x8c,0xf8,0x7, 0xb6,0x9c, +0xe8,0x7, 0xb6,0xac,0x89,0xe, 0xe7,0xf8,0x2, 0xb8,0xe7,0xf9,0x0, 0x82,0x67,0x8c, +0xe2,0x0, 0xcf,0xf8,0xe7,0xfe,0x1, 0x40,0x66,0x90,0x55,0xb7,0x57,0xb8,0xf2,0x1, +0x7c,0x98,0xf0,0x19,0x3c,0x9d,0xe8,0x0, 0xb5,0x89,0xe8,0x0, 0xb7,0x99,0xe7,0xfe, +0x0, 0xb3,0xe0,0x0, 0x16,0xe4,0x7e,0x8c,0x67,0xf, 0xe2,0x0, 0xcf,0xa, 0x2, 0xbc, +0x16,0x81,0x7e,0x88,0x66,0x97,0x8d,0x8d,0xe2,0x0, 0xcd,0x81,0xe0,0xb, 0x3b,0x15, +0xe7,0xfe,0x1, 0x5b,0x8d,0xb, 0xe0,0x0, 0x15,0xe4,0xe7,0xfd,0x0, 0x94,0x67,0x11, +0x15,0x1, 0x8c,0xe, 0xad,0xb, 0xe7,0xfd,0x24,0x47,0xe8,0x19,0x8d,0xc8,0x3d,0xf3, +0xe0,0x4, 0x1, 0x26,0xe0,0x2, 0x1d,0x5e,0x15,0x81,0x3f,0x6b,0xe2,0x1, 0xc7,0x7f, +0x3c,0x7e,0xf0,0x40,0x3b,0xeb,0xc5,0x81,0xe7,0xfd,0x5, 0xb6,0xe0,0x1a,0x8f,0x6a, +0xc5,0xa, 0x39,0xfe,0x1, 0xf3,0x15,0x8a,0xe8,0xb, 0x3d,0xb7,0x15,0x7f,0xe8,0xb, +0x3d,0x98,0xe0,0x19,0xad,0x4b,0xe7,0xfd,0x0, 0xa7,0x3f,0x77,0x3e,0xe7,0xe0,0x6d, +0x3d,0x2e,0xe7,0xfa,0x0, 0xb8,0xf0,0x0, 0x5a,0xbe,0x17,0x1, 0xf2,0x0, 0xca,0x8a, +0x7f,0x8, 0x5, 0xc1,0xe0,0x0, 0x5d,0xca,0xe2,0x0, 0xcd,0x8a,0xe7,0xff,0x5, 0xbc, +0x55,0xbc,0x54,0x38,0x55,0x37,0x3d,0x98,0xe0,0x43,0x3d,0x9b,0x54,0xbb,0xe2,0x0, +0xcd,0x80,0x3c,0x9a,0xe0,0x43,0x3c,0x99,0x3d,0x6b,0xe0,0x4, 0x4, 0x2, 0xe2,0x0, +0xcc,0x80,0x3d,0xea,0xe3,0xff,0xc5,0xff,0x3d,0x69,0xe0,0x3, 0x4, 0x77,0x64,0x86, +0xe3,0xff,0xc5,0x7f,0xe8,0x40,0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xf0,0x0, +0x7b,0x4, 0xef,0xfc,0xdc,0x3d,0x5d,0xbf,0xe0,0x43,0x3c,0x18,0xe2,0x1f,0xcd,0x9f, +0x67,0x81,0xf0,0x0, 0x62,0x82,0xf0,0x0, 0x63,0x4, 0xe0,0x3, 0x5, 0xcd,0x15,0x8f, +0xe8,0xb, 0x3d,0xb5,0xe3,0xff,0xc5,0xff,0x3c,0x7b,0x67,0xc, 0xe0,0x28,0x3c,0x2b, +0x15,0xa8,0xe0,0x6b,0x3b,0x2e,0x7c,0x8, 0x7d,0x8c,0xe7,0xfe,0x0, 0xfd,0xf0,0x40, +0x3b,0x6b,0x7d,0x8f,0xe7,0xfb,0x0, 0xa2,0xe0,0x0, 0x1f,0x51,0xe0,0x1, 0x1e,0x8e, +0x7f,0x17,0xea,0x21,0x7f,0x14,0x7e,0x91,0xf0,0x40,0x3c,0xee,0x66,0x97,0x67,0x11, +0xaf,0x8d,0x89,0xe, 0xe7,0xf6,0x0, 0xe5,0x5c,0xbe,0x15,0x14,0xe1,0x2a,0x3c,0x9a, +0x7d,0x12,0xe7,0xfb,0x0, 0x9d,0xe0,0x2, 0x1f,0x49,0x15,0x1, 0xad,0xe, 0xe7,0xfb, +0x0, 0x85,0x17,0x14,0x16,0x80,0x7f,0xc, 0x7e,0x88,0xe7,0xfe,0x0, 0xd5,0xe0,0x0, +0x4f,0xe9,0xe2,0x0, 0xcf,0xf8,0xe7,0xfc,0x1, 0x77,0xe0,0x0, 0x55,0xc3,0xe0,0x0, +0x57,0xc4,0x67,0x10,0xf2,0x1, 0x7c,0x98,0xf0,0x19,0x3c,0x9e,0x35,0xa1,0x37,0xa1, +0xe8,0x0, 0xb5,0x89,0xe8,0x0, 0xb7,0x99,0xe7,0xfc,0x0, 0xe6,0xe0,0x0, 0x5d,0x4a, +0xe2,0x0, 0xcd,0x2, 0x2, 0x98,0x5c,0xb9,0xe2,0x0, 0xcc,0xcf,0x2, 0x94,0xf2,0x0, +0xce,0x93,0xe0,0x0, 0x2, 0xc9,0xe0,0x0, 0x5c,0xc6,0xe2,0x0, 0xcc,0x9d,0x2, 0x8b, +0x5c,0xba,0xe2,0x0, 0xcc,0xcf,0x2, 0x87,0xf0,0x0, 0x62,0x85,0xf2,0x1, 0xc2,0xff, +0xe0,0x1, 0x0, 0xb7,0xf2,0x0, 0xce,0x89,0x2, 0xb6,0xf0,0x0, 0x5a,0x3e,0xf2,0x0, +0xca,0x8, 0x5, 0xbe,0x67,0xe, 0xe2,0x0, 0xcf,0xe, 0x2, 0xaf,0xe0,0x0, 0x4d,0x68, +0xe8,0x40,0x3c,0x66,0x3c,0xea,0x7d,0x4, 0x7d,0x83,0x7f,0x81,0xe0,0x2, 0xd0,0x68, +0xf0,0x0, 0x62,0x85,0xe0,0x16,0x34,0x2, 0xf2,0x1, 0xc2,0xff,0xf8,0x16,0x3b,0x35, +0x65,0x4, 0xf3,0xff,0xc3,0x7f,0xf2,0x0, 0xcb,0x78,0x65,0x83,0x67,0x81,0xe0,0x2, +0x2, 0xb3,0xe2,0x0, 0xcd,0xa, 0xe0,0x1, 0x5, 0x8c,0xf2,0x0, 0xcb,0x4f,0xe8,0x40, +0x3d,0x66,0x2, 0x83,0xe0,0x0, 0x15,0x50,0xf0,0x40,0x3b,0x6a,0xf3,0xff,0xc3,0x7f, +0xe0,0x0, 0x0, 0xff,0xf0,0x0, 0x5a,0x3e,0x14,0x8f,0xf1,0x28,0x3a,0x19,0x24,0x8, +0xe1,0x2a,0x3d,0x19,0x25,0x5, 0x66,0x8e,0xe2,0x0, 0xce,0x89,0x5, 0xc8,0xe0,0x1, +0x4d,0x3, 0x25,0x20,0xe0,0x1, 0x1d,0x4e,0x8d,0xa, 0x25,0x1c,0xf0,0x0, 0x62,0x85, +0xf2,0x1, 0xc2,0xff,0xe1,0x2b,0x3b,0x9b,0xe0,0x1, 0x25,0xd0,0x66,0x88,0xe0,0x1, +0x26,0xcd,0xe0,0xb, 0x3b,0x15,0x15,0x3, 0xf2,0x0, 0xce,0x9d,0xad,0xb, 0xf0,0x0, +0x13,0x0, 0xe0,0x1, 0x5, 0xc8,0xe0,0xb, 0x3b,0x15,0x15,0x1, 0xad,0xb, 0xe7,0xfa, +0x0, 0xed,0xf0,0x0, 0x62,0x85,0xe0,0x0, 0x4c,0xe8,0x5c,0x39,0xf2,0x1, 0xc2,0xff, +0x7d,0x83,0x7f,0x81,0xf0,0x0, 0x7a,0x4, 0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xd0,0x8, +0xe0,0x0, 0x4c,0xea,0xf0,0x0, 0x62,0x82,0xe0,0xa, 0x34,0x1, 0x67,0xe, 0xe8,0xa, +0x3d,0x35,0x34,0xa1,0xe0,0x29,0x3f,0x19,0xe3,0xff,0xc5,0x7f,0x65,0x83,0x67,0x81, +0xf0,0x0, 0x62,0x4, 0x24,0xa0,0x14,0x9d,0xe9,0x34,0x3c,0xa4,0xf0,0x0, 0x22,0x1c, +0xe0,0x2, 0x1c,0xce,0x8c,0x89,0x2c,0x97,0xe0,0x1, 0x4c,0x82,0xe0,0x9, 0x3f,0x29, +0xe0,0x43,0x3c,0x19,0xe2,0x0, 0xcc,0x0, 0x5, 0xb, 0xe2,0x0, 0xcc,0x85,0x5, 0xb, +0xe2,0x1, 0xcd,0x47,0xf0,0x40,0x3b,0x6a,0x2, 0x91,0xe0,0x0, 0x0, 0xc7,0xe3,0xff, +0xcc,0x7b,0x4, 0x77,0x66,0x8e,0xf0,0x40,0x3b,0x6a,0xe2,0x0, 0xce,0x8f,0x2, 0xba, +0xe2,0x0, 0xcd,0x78,0x5, 0x83,0xf0,0x0, 0x13,0x78,0xf3,0xff,0xc3,0x7f,0xf0,0x40, +0x3b,0x77,0xe7,0xff,0x5, 0x99,0xf2,0x0, 0xce,0x87,0x2, 0xb2,0xe2,0x0, 0xcb,0x94, +0xe0,0x0, 0x5, 0xc0,0xe0,0xb, 0x3b,0x15,0x15,0x2, 0xad,0xb, 0xf0,0x0, 0x13,0x0, +0xe7,0xfa,0x0, 0x8c,0x15,0x0, 0xe7,0xf7,0x0, 0xdd,0x16,0x8a,0x17,0x0, 0x7e,0x8c, +0x7f,0x8, 0xe7,0xfc,0x0, 0xd1,0xe0,0x0, 0x1f,0xd1,0xfa,0x21,0x7c,0x94,0xf0,0x0, +0xad,0xf, 0x12,0x8a,0x3a,0xb2,0xe0,0x2, 0x1c,0xde,0xe0,0x1, 0x14,0x40,0x3d,0x65, +0x3c,0x10,0xe0,0x1, 0xdf,0xff,0xea,0x16,0x7c,0x4c,0xf0,0x0, 0x65,0x7, 0xe7,0xf6, +0x0, 0x9b,0xe2,0x1, 0xcd,0x48,0x5, 0xca,0xf0,0x1, 0x13,0x48,0x0, 0xc7,0xe0,0x0, +0x5d,0xc6,0xe2,0x0, 0xcd,0xe4,0x5, 0x8d,0x15,0x94,0xe1,0x2b,0x3b,0x9b,0x25,0x89, +0x15,0x93,0xe9,0x2b,0x3d,0xad,0x25,0x85,0x67,0xe, 0xe2,0x0, 0xcf,0x13,0x5, 0xc3, +0xf0,0x0, 0x13,0x1, 0xe0,0x0, 0x5d,0xc8,0xe0,0x0, 0x5d,0x47,0x64,0x86,0xe8,0x40, +0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xf0,0x0, 0x7b,0x4, 0xef,0xfc,0xda,0xb8, +0xe2,0x0, 0xcc,0x3b,0x67,0x81,0xf0,0x0, 0x62,0x82,0xf0,0x0, 0x63,0x4, 0x2, 0x87, +0x65,0x8d,0x15,0x0, 0x3d,0x95,0xad,0xb, 0xf0,0x0, 0x13,0x0, 0xe0,0xb, 0x3b,0x15, +0x15,0x0, 0xad,0xb, 0xe7,0xf9,0x0, 0xb2,0xf2,0x0, 0xce,0x9d,0xf0,0x0, 0x13,0x0, +0x2, 0xda,0xe0,0x3, 0x1f,0x3d,0x8d,0x9e,0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5d,0xc6, +0x5, 0x96,0xe0,0x0, 0x4d,0x6b,0x2d,0x13,0xe2,0x0, 0xcd,0x9d,0xf0,0x40,0x3b,0x6a, +0xe0,0x0, 0x5, 0xc2,0xe0,0xb, 0x3b,0x15,0x8d,0x8b,0xe2,0x0, 0xcd,0x81,0x1, 0x43, +0xe2,0x0, 0xcd,0x83,0xe7,0xf9,0x1, 0x92,0xe7,0xfe,0x0, 0x9f,0xe2,0x0, 0xcd,0x9d, +0xf0,0x0, 0x13,0x0, 0x2, 0xf0,0x66,0x94,0xe2,0x0, 0xce,0x9d,0x2, 0xec,0x67,0xb, +0x9d,0x8e,0xe2,0x0, 0xcd,0xf7,0x2, 0xe7,0xe0,0x2, 0x1d,0xce,0x8d,0x8b,0xe8,0x36, +0x3d,0x86,0x0, 0xe1,0xf0,0x0, 0x13,0x78,0xe7,0xfe,0x0, 0xdb,0xf0,0x0, 0x13,0x80, +0xe7,0xfb,0x0, 0xeb,0x15,0x9, 0x15,0x86,0x66,0x8e,0xe8,0xa, 0x3d,0x35,0xe8,0xb, +0x3d,0xb5,0xe2,0x0, 0xce,0x8b,0xe3,0xff,0xc5,0xfe,0xe3,0xff,0xc5,0x7f,0xe0,0x6a, +0x3c,0xab,0x3d,0xea,0xe7,0xfc,0x0, 0xaa,0x15,0x0, 0xe7,0xfc,0x0, 0x8a,0x15,0x0, +0xe7,0xfb,0x0, 0xff,0x64,0x86,0xe8,0x40,0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82, +0xd8,0xbf,0xf0,0x40,0x3b,0x68,0x67,0x81,0xf0,0x0, 0x62,0x82,0xe7,0xff,0x24,0x34, +0xe7,0xfe,0x0, 0xba,0xea,0x16,0x7c,0x4c,0xe7,0xf4,0x0, 0xf6,0x15,0x80,0x7d,0xa0, +0x7d,0xa1,0x7d,0xa2,0x7d,0xa3,0x7d,0xa4,0x7d,0xa5,0xe7,0xf7,0x0, 0x8d,0x8, 0xb2, +0xe0,0x1, 0x1f,0x8e,0xea,0x22,0x7c,0x40,0x89,0xf, 0x14,0x80,0x31,0x21,0x3d,0x62, +0xe0,0x1, 0xdf,0x7a,0xea,0x22,0x7c,0x54,0x3d,0x62,0x14,0x80,0x9, 0x21,0xe0,0x3e, +0x0, 0xf3,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfe,0xc0,0x64,0xe0,0x2, +0x19,0x5f,0xea,0x16,0x7d,0xca,0xf0,0x0, 0x8e,0x82,0xf0,0x2, 0x1d,0x5e,0x8f,0x8b, +0xf0,0x0, 0x2e,0x90,0xe0,0x3, 0x27,0xa4,0xe0,0x2, 0x1f,0x4f,0x7f,0xa, 0xf0,0x0, +0xae,0x8e,0xef,0xff,0xdf,0xd6,0xf0,0x1, 0x1e,0xe, 0xe8,0x0, 0x89,0x8c,0x0, 0xb1, +0xf0,0x1, 0x1e,0xe, 0xe8,0x0, 0x89,0x8c,0x2f,0x93,0x21,0x92,0x17,0x7f,0x3f,0x13, +0xe2,0x1, 0xc7,0x7f,0xc7,0x1, 0xe4,0x0, 0xc7,0xa, 0xe8,0x40,0x3f,0xea,0xe8,0xe, +0x3f,0x1a,0x16,0xff,0xe0,0x19,0xae,0xcf,0xc7,0x8a,0x3f,0x7f,0x1, 0xfc,0x15,0xff, +0xe8,0xb, 0x3d,0x9d,0xe2,0x1, 0xc5,0xff,0xc5,0x81,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, +0x1f,0xde,0xe8,0xb, 0x3d,0x9a,0x96,0x8f,0x97,0x1f,0x36,0xa4,0xb6,0x8f,0xc7,0x8a, +0x37,0x24,0x3d,0xff,0xe0,0x40,0xb7,0x4f,0x1, 0xf7,0xe0,0x2, 0x1f,0xcf,0x7f,0x8a, +0x12,0xa, 0x3a,0x33,0xe0,0x1, 0x14,0xff,0x3d,0x64,0xe2,0x0, 0x7c,0x3c,0xe0,0x1, +0xdf,0x1b,0x14,0x80,0xe2,0x0, 0x7d,0xbc,0xe8,0x40,0x3d,0x6d,0x3c,0x69,0xef,0xff, +0xd6,0xc5,0x3d,0x63,0xe8,0x40,0x3c,0xed,0xe2,0x0, 0x7d,0xbc,0xef,0xff,0xd6,0xbe, +0xe0,0x2, 0x1c,0xde,0x15,0x0, 0xe2,0x0, 0x78,0xbc,0x21,0xad,0x24,0x11,0x8e,0x49, +0x8f,0xc1,0x3f,0xfc,0x1, 0x21,0x3f,0x61,0x17,0x80,0x0, 0x84,0x8e,0xce,0x3e,0xfc, +0x1, 0x1b,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0xf8,0xc7,0xa, 0x1, 0xf8,0x17,0xa, +0x3f,0x3a,0x17,0x8a,0xe8,0xe, 0x3f,0x1a,0x3f,0xb8,0x92,0x8e,0x95,0x9e,0x96,0x2e, +0x96,0xbe,0x97,0x4e,0x3f,0x91,0xc4,0x1, 0xb2,0x8f,0xe2,0x1, 0xc4,0x7f,0xb5,0x9f, +0xb6,0x2f,0xb6,0xbf,0xb7,0x4f,0xc5,0x1, 0x3f,0xea,0xe2,0x1, 0xc7,0xff,0x3f,0xf3, +0xc4,0x8a,0x4, 0xd5,0xe0,0x2, 0x1c,0x59,0x14,0xbc,0x3d,0x64,0x3c,0x90,0xe0,0x1, +0xde,0x99,0x66,0x8a,0xf0,0x2, 0x19,0x5e,0x8f,0x8d,0xe0,0x5, 0x2f,0x89,0xea,0x16, +0x7d,0xca,0x8f,0xb, 0xe0,0x5, 0x27,0xa, 0xf0,0x5, 0x26,0x94,0xf7,0xff,0x12,0x7f, +0xe0,0x1, 0x1f,0xd7,0xf8,0x14,0x3a,0x1d,0xf2,0x1, 0xc2,0x7f,0xf0,0x1, 0x99,0x9f, +0xf0,0x0, 0xc2,0x1, 0xe0,0x2, 0x1f,0xcd,0xf4,0x0, 0xc2,0xa, 0xf8,0x19,0x88,0xca, +0xf0,0x0, 0x88,0xf, 0x89,0x2, 0xfa,0x22,0x7b,0x40,0xf8,0x14,0x3a,0x1a,0xea,0x22, +0x7d,0xd4,0xf8,0x40,0x3f,0x66,0xf8,0x0, 0x8c,0xc, 0xf8,0x40,0x3d,0x62,0x79,0xe, +0xf8,0x40,0x3d,0xe2,0xe0,0x0, 0x7d,0x8b,0xf7,0xff,0x12,0xfc,0xf0,0x0, 0x7e,0x8c, +0xe8,0x40,0x3a,0x63,0xe8,0x40,0x3b,0xe0,0xe8,0x40,0x3a,0xe1,0xe8,0x40,0x3b,0x64, +0xf0,0x0, 0x7e,0xd, 0xf0,0x0, 0x24,0x19,0xe8,0x0, 0x8e,0x4b,0x3e,0x75,0xe0,0x1, +0x1, 0x54,0xe8,0x40,0x3f,0x62,0x17,0x81,0x0, 0x87,0xe0,0x1a,0x8e,0xee,0xc7,0xa, +0x3e,0x7d,0xe0,0x1, 0x1, 0x4d,0x3e,0xef,0xe2,0x1, 0xc6,0xff,0xf0,0x40,0x3c,0x7d, +0x3d,0xef,0xc7,0x81,0x2, 0xf3,0xf0,0x0, 0x66,0x8c,0xf0,0x0, 0x66,0xd, 0xe0,0x2, +0x1f,0xdd,0x8f,0x8f,0x2f,0x89,0xea,0x16,0x7c,0x40,0xe8,0x40,0x3d,0x68,0xe0,0x1, +0x14,0xff,0xe0,0x1, 0xde,0x69,0xf0,0x0, 0x14,0x80,0xf0,0x1, 0x24,0x20,0xfa,0x16, +0x7d,0xc0,0x11,0x3, 0xe8,0x40,0x3a,0x69,0xe0,0x0, 0x0, 0xd3,0xf0,0xc, 0x3d,0x93, +0x8f,0xc, 0x34,0x44,0xe2,0x1, 0xcf,0x7f,0x34,0xc4,0xe0,0x3, 0x1, 0x69,0xe2,0x0, +0xcf,0x2, 0xe0,0x3, 0x2, 0xdf,0x13,0x81,0x3b,0x9e,0xe2,0x1, 0xc3,0xff,0x13,0x1e, +0xe4,0x0, 0xc7,0xa, 0x3b,0x33,0xea,0x14,0x7e,0x14,0x65,0x8a,0xe0,0xf, 0x3f,0x16, +0x3f,0x9c,0x8f,0xb, 0xb4,0xf, 0xb4,0x9f,0xe0,0x3, 0x2f,0x46,0x3b,0x1c,0x97,0x56, +0x94,0x6, 0xe0,0x1, 0x97,0xa6,0x3c,0x1e,0x3c,0x1f,0x3c,0xe2,0x12,0x8a,0xe3,0xff, +0xc4,0x7f,0xf0,0x18,0x3d,0x1d,0x3a,0x96,0xe0,0x1, 0xdd,0xd5,0xf0,0x0, 0x17,0x14, +0x96,0x95,0xf0,0x1e,0x3f,0x16,0x97,0x96,0xe8,0x0, 0x97,0x1e,0x3f,0x9d,0x3f,0x9e, +0xe8,0x0, 0xb4,0x8, 0x3c,0x6f,0x3c,0xe2,0xe3,0xff,0xc4,0x7f,0xe0,0x1, 0xdd,0xc3, +0xe8,0x0, 0xb4,0x18,0xe8,0x3, 0x39,0x9b,0xab,0x83,0xf0,0x0, 0xc4,0x81,0xf8,0x0, +0x8c,0xc, 0xf2,0x1, 0xc4,0xff,0xf8,0x40,0x3c,0x79,0xe0,0x0, 0x5, 0xc8,0x16,0x8a, +0xe8,0xd, 0x3e,0xb9,0xf8,0x40,0x3e,0xf9,0xf0,0xf, 0x3d,0x1d,0xe0,0x19,0x89,0xcf, +0xe0,0xc, 0x9c,0x4f,0xa9,0xcf,0xe0,0xc, 0x9c,0xdf,0x5, 0x87,0x9e,0xf, 0x9f,0x1f, +0x36,0x44,0x37,0x44,0xb6,0xf, 0xb7,0x1f,0xf0,0xf, 0x3d,0x1d,0xe0,0x19,0x85,0x5f, +0xe0,0x19,0x85,0xef,0xe0,0x19,0x86,0x7f,0xe0,0x1a,0x87,0xf, 0xe2,0x0, 0xc1,0x8f, +0xe8,0x40,0x39,0xf8,0xad,0x5f,0xad,0xef,0xae,0x7f,0xe0,0x1, 0xaf,0xf, 0x3, 0x4e, +0x17,0xa, 0x3f,0x33,0xe8,0xe, 0x3f,0x1a,0xe0,0x2, 0xc7,0x2c,0x8f,0xe, 0xe2,0x0, +0xcf,0x3, 0x1, 0x44,0xe2,0x0, 0xcf,0x1, 0xe7,0xfe,0x1, 0xfa,0xea,0x16,0x7f,0xc0, +0xf0,0x0, 0xc4,0x81,0xf8,0x0, 0x8c,0xc, 0xf2,0x1, 0xc4,0xff,0x3f,0x93,0x17,0x7f, +0xf8,0x40,0x3c,0x79,0xaf,0xf, 0xe7,0xff,0x2, 0xbc,0xea,0x16,0x7e,0xca,0xf0,0x0, +0xae,0x8d,0xe0,0x1, 0xc0,0x1c,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1e,0xcf, +0x7e,0x8a,0xe7,0xfc,0x0, 0xe0,0x3e,0x65,0xe0,0x0, 0x15,0x80,0xf0,0x0, 0x14,0x8a, +0xf0,0x19,0x3c,0xbb,0xf8,0x0, 0x9e,0x9b,0xf8,0xf, 0x3d,0x19,0xe0,0xc, 0x9e,0xdf, +0xe0,0xc, 0x99,0x4f,0xe8,0x0, 0x99,0x8b,0xf0,0xf, 0x3e,0xad,0x3d,0x6f,0xe0,0xe, +0x39,0xa2,0x17,0x8a,0xe3,0xff,0xc7,0x7f,0x3f,0xbc,0xf0,0x43,0x3e,0x1e,0xf2,0x0, +0xce,0x0, 0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x39,0x23,0xe8,0xf, 0x3f,0x9a,0xe3,0xff, +0xc4,0x7f,0xf0,0x43,0x3b,0x9a,0x3c,0xee,0xe0,0x2, 0xc7,0xac,0xe0,0x69,0x3d,0x28, +0x8f,0x8f,0xf2,0x0, 0xcb,0x80,0xe8,0x8, 0x3e,0xad,0xf0,0x40,0x39,0xea,0xe3,0xff, +0xc4,0x7f,0xe0,0x73,0x3d,0x28,0xe2,0x0, 0xcf,0x81,0xf0,0x13,0x39,0x99,0xf3,0xff, +0xc1,0xff,0x36,0x21,0xe0,0x1, 0x1, 0x37,0xf0,0x40,0x39,0xf4,0xf0,0xf, 0x3f,0x1c, +0xe0,0x0, 0x3, 0xff,0x9f,0x8f,0xf0,0x8, 0x31,0xa8,0x3c,0xe4,0x7d,0x6, 0x7e,0x2, +0x7e,0x87,0x7f,0x8, 0x7f,0x89,0xf0,0x0, 0x79,0x3, 0xf0,0x0, 0x79,0x84,0xf0,0x0, +0x7a,0x81,0xf0,0x0, 0x7b,0x85,0xe0,0x1, 0xdd,0x6, 0xe3,0xff,0xc4,0x7f,0xe2,0x0, +0xcc,0xf, 0x65,0x6, 0x66,0x2, 0x66,0x87,0x67,0x8, 0x67,0x89,0xf0,0x0, 0x61,0x3, +0xf0,0x0, 0x61,0x84,0xf0,0x0, 0x62,0x81,0xf0,0x0, 0x63,0x85,0xe0,0x2, 0x2, 0x80, +0xf0,0x40,0x39,0xff,0xe0,0x1, 0x3, 0xbf,0xf0,0x0, 0x60,0xb, 0xf0,0x10,0x38,0x1c, +0xe8,0x0, 0x9c,0x0, 0xe8,0xc, 0x3e,0x1e,0xf0,0x0, 0xb1,0x8c,0xe0,0x0, 0x2b,0xe0, +0x3e,0x68,0xe3,0xff,0xc6,0x7f,0xe2,0x2, 0xce,0x0, 0x3f,0xe8,0x5, 0x83,0xe0,0x2, +0x17,0x80,0xe3,0xff,0xc7,0xff,0xf2,0x0, 0xce,0x0, 0xe0,0xc, 0x39,0x23,0xe3,0xff, +0xc6,0x7f,0xe0,0x6e,0x3d,0x2c,0x3f,0x3f,0x39,0xf2,0x37,0x48,0xe8,0xe, 0x3f,0x55, +0xe3,0xff,0xc7,0x7c,0xf8,0xc, 0x3d,0x19,0xe0,0x0, 0x5, 0xd3,0x3f,0x12,0xe0,0xc, +0xb7,0x4c,0xf2,0x0, 0xcb,0x80,0xe8,0xe, 0x3e,0xad,0xe3,0xff,0xc7,0x7f,0xe0,0x6a, +0x3d,0x2e,0x3f,0xba,0xf0,0x40,0x3e,0xfd,0x37,0xc8,0xe8,0xf, 0x3f,0xd5,0xe3,0xff, +0xc7,0xfc,0xf8,0xb, 0x3d,0x19,0xe0,0x0, 0x2, 0xc2,0xe0,0xf, 0x3e,0xaf,0xe0,0xc, +0xb7,0xdb,0xf0,0x0, 0xc5,0x8a,0xf0,0x40,0x3d,0xf6,0xe7,0xfc,0x1, 0xed,0xf0,0x0, +0x66,0xd, 0xf0,0x0, 0x66,0x8c,0xf8,0x0, 0x8c,0xc, 0xe7,0xfd,0x0, 0x82,0x9f,0x8f, +0xe8,0x40,0x3f,0xf3,0xe7,0xff,0x2, 0xaa,0xfa,0x22,0x78,0x54,0xf0,0x10,0x38,0x1c, +0xe0,0x2, 0x17,0x80,0xe8,0xc, 0x3e,0x1e,0xe8,0x0, 0xb7,0x80,0xe0,0x2, 0x17,0x80, +0xf0,0x0, 0xb1,0x8c,0xe7,0xff,0x23,0xb1,0xe0,0x2, 0x14,0x0, 0x67,0x8e,0xe2,0x0, +0xcf,0x81,0xe7,0xff,0x1, 0x9f,0xe8,0x0, 0x8f,0xeb,0xe0,0xc, 0x34,0x41,0xe2,0x0, +0xcf,0x8f,0xe3,0xff,0xc6,0x7f,0xe0,0x68,0x3b,0xac,0xe7,0xff,0x0, 0x93,0xe0,0xe, +0x39,0x2e,0xe0,0xc, 0xb7,0x4c,0xe7,0xff,0x0, 0xae,0x3f,0x9d,0xe0,0xc, 0xb7,0xdb, +0x0, 0xc1,0xf0,0x0, 0x60,0xb, 0x15,0x80,0xf0,0x9, 0x38,0x1c,0xf0,0xf, 0x3f,0x1c, +0xf0,0x40,0x39,0xf4,0xb5,0x89,0xb5,0x8f,0x3, 0xca,0xf0,0x8, 0x31,0xa8,0x3c,0xe4, +0x7d,0x6, 0x7e,0x2, 0x7e,0x87,0x7f,0x8, 0xf0,0x0, 0x78,0x9, 0xf0,0x0, 0x79,0x3, +0xf0,0x0, 0x79,0x84,0xf0,0x0, 0x7a,0x81,0xf0,0x0, 0x7b,0x85,0xe0,0x1, 0xdc,0x4b, +0xe3,0xff,0xc4,0x7f,0xe2,0x0, 0xcc,0xf, 0x65,0x6, 0x66,0x2, 0x66,0x87,0x67,0x8, +0xf0,0x0, 0x60,0x9, 0xf0,0x0, 0x61,0x3, 0xf0,0x0, 0x61,0x84,0xf0,0x0, 0x62,0x81, +0xf0,0x0, 0x63,0x85,0x5, 0x89,0xf0,0x10,0x38,0x1c,0xe8,0x0, 0xb4,0x0, 0xe7,0xfe, +0x0, 0xcb,0xfa,0x22,0x78,0x54,0xf0,0x10,0x38,0x1c,0x15,0x90,0xe8,0xc, 0x3e,0x1e, +0xe8,0x0, 0xb5,0x80,0x17,0x90,0xf0,0x0, 0xb1,0x8c,0xe7,0xfe,0x23,0xce,0x14,0x10, +0xe7,0xff,0x0, 0x9e,0xf0,0xf, 0x3d,0x1d,0xb4,0xf, 0xb4,0x9f,0xe7,0xfc,0x0, 0xdc, +0x17,0x0, 0xaf,0xc, 0x13,0x81,0x3f,0x64,0xe7,0xfc,0x0, 0xa3,0x17,0x1e,0x3f,0x33, +0xea,0x14,0x7e,0x94,0x15,0x81,0x3f,0x1d,0xad,0x8c,0x16,0x83,0xb4,0xf, 0xb4,0x9f, +0xc7,0xa, 0x94,0xf, 0x94,0x9f,0x95,0x2f,0x95,0xbf,0x96,0x4f,0xe0,0x40,0xb4,0x5e, +0xc6,0xff,0xe0,0x40,0xb4,0xce,0xe2,0x1, 0xc6,0xff,0xe0,0x40,0xb5,0x3e,0xe0,0x40, +0xb5,0xae,0xe0,0x40,0xb6,0x1e,0x2e,0xed,0xe7,0xfc,0x0, 0xb9,0xf0,0x40,0x39,0xff, +0xe7,0xfe,0x4, 0x84,0xfa,0x22,0x78,0x54,0xe7,0xff,0x0, 0xb7,0xf8,0x0, 0x8c,0xc, +0xf7,0xfb,0x26,0xd3,0xe7,0xfb,0x0, 0xcd,0xf8,0x0, 0x8c,0xc, 0x15,0xa, 0xe8,0xa, +0x3d,0x38,0xe0,0x2, 0x1c,0x59,0xe8,0x40,0x3c,0xe2,0xe0,0x1, 0xdb,0xfb,0x0, 0xf1, +0xf8,0x0, 0x8c,0xc, 0xe7,0xfb,0x0, 0xc1,0x8, 0xb1,0xe0,0x2, 0x1c,0x6d,0x15,0xa, +0x14,0x99,0xe0,0x1, 0xdc,0x29,0xe0,0x2, 0x1e,0x8e,0x17,0x0, 0x3f,0xed,0xe1,0x80, +0xaf,0x1f,0xc7,0x81,0xaf,0x1d,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xaf,0xf, 0x8, 0xe1,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x58, +0xf0,0x2, 0x19,0xdf,0xe8,0x0, 0x89,0x3, 0xe0,0x3, 0x21,0x69,0xe0,0x1, 0x1f,0x8e, +0xe0,0x1, 0x1f,0x42,0x8f,0x8f,0xe0,0x0, 0x27,0xf3,0x13,0xff,0x3b,0x9f,0xe2,0x1, +0xc3,0xff,0xf0,0xe, 0x8c,0x9e,0xf0,0xe, 0x8c,0x2e,0xc3,0x81,0xe4,0x0, 0xc3,0x8a, +0xe0,0x2, 0x19,0xde,0xea,0x13,0x7c,0xba,0xfa,0x13,0x7f,0x3c,0xf0,0x19,0x34,0xa6, +0xf0,0x18,0x34,0x26,0xf0,0x0, 0x10,0x80,0xea,0x13,0x7d,0xf0,0xfa,0x13,0x7a,0xe4, +0xfa,0x13,0x7b,0x7c,0xfa,0x14,0x7b,0x88,0xf0,0x0, 0x8e,0x89,0xf0,0x2, 0x1e,0x57, +0xf0,0x2, 0x19,0x6d,0xf1,0xff,0xc4,0xe0,0xf1,0xff,0xc4,0x60,0x3b,0x93,0xf8,0x40, +0x38,0x61,0x7d,0x8a,0xf8,0x40,0x3a,0x6e,0x0, 0x8a,0xea,0x13,0x7f,0x3c,0x31,0x22, +0x3f,0x12,0xb2,0xe, 0xb7,0x9e,0xc1,0x8a,0x3b,0xf3,0x1, 0x37,0x89,0x43,0xe2,0x1, +0xc9,0x7f,0x1, 0x7a,0x9a,0x3, 0x17,0xa, 0x3f,0x32,0xe2,0x0, 0xca,0x21,0x9f,0x93, +0xe8,0x2d,0x3a,0x29,0xe8,0xe, 0x3f,0x1c,0x15,0x81,0xe0,0x6b,0x3b,0xad,0x8f,0xe, +0xe2,0x0, 0xcf,0xa1,0xe8,0x2d,0x3f,0xa8,0x16,0x1, 0xe0,0x6c,0x3b,0xad,0xe2,0x0, +0xcf,0x2, 0x1, 0x21,0x27,0x5b,0xe2,0x0, 0xcf,0x1, 0x1, 0xde,0x66,0x8a,0xea,0x14, +0x7d,0x88,0xea,0x13,0x7e,0x7c,0xea,0x13,0x7f,0xe4,0x3d,0x92,0x3e,0x12,0x3e,0x92, +0xc1,0x8a,0x39,0x1f,0xf0,0x0, 0xa8,0xb, 0x3b,0xf3,0xf0,0x0, 0xa8,0xc, 0xe0,0x0, +0xaf,0xd, 0xf0,0x0, 0xa8,0x2, 0x1, 0xcb,0xf0,0x3, 0x28,0xd0,0xc0,0x28,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe0,0x6, 0x31,0x22,0xf0,0xe, 0x3a,0x16,0xf0,0x0, 0x9d,0xe, +0xf0,0x0, 0x9d,0x9e,0xe8,0xe, 0x3a,0x2a,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x3c,0x1e, +0xe8,0xd, 0x3f,0xab,0xe3,0xff,0xc6,0xff,0xe0,0x41,0x3c,0xce,0xe2,0x0, 0xcc,0x0, +0xf0,0x43,0x3f,0x1d,0xe3,0xff,0xc4,0xff,0xf0,0x1, 0x3a,0x92,0xe0,0x41,0x3d,0x4d, +0xe0,0x6e,0x3d,0x29,0xf2,0x0, 0xcf,0x0, 0x8c,0x81,0xe3,0xff,0xc5,0x7f,0xe0,0x6d, +0x3d,0x2a,0xe2,0x0, 0xcc,0xe3,0x2, 0x83,0xc4,0x81,0xac,0x81,0xe8,0x0, 0x8d,0x3, +0xe2,0x0, 0xcd,0x7, 0xe0,0x2, 0x5, 0x8a,0xf0,0xa, 0x3b,0x92,0x88,0x8a,0x15,0xa, +0xf0,0x0, 0x26,0x89,0xf1,0xff,0xc6,0xff,0xf2,0x1, 0xc6,0xff,0xf0,0x0, 0x10,0x81, +0x15,0xa, 0xf0,0x9, 0x39,0x12,0x8a,0x89,0x3d,0x75,0x5, 0x83,0xad,0x9, 0x3a,0xea, +0x28,0x99,0xf0,0xa, 0x3a,0x92,0x8d,0xa, 0xe2,0x0, 0xcd,0x11,0x2, 0x8d,0x8d,0x53, +0x14,0xa2,0xe1,0x2a,0x3c,0xaa,0xe0,0x2, 0x2d,0x3, 0x8c,0xe3,0x15,0x7, 0xe1,0x2a, +0x3d,0x29,0xe0,0x1, 0x2d,0x7d,0xe0,0xa, 0x3f,0x1d,0xe2,0x0, 0xcd,0x3, 0xe0,0x2, +0x5, 0x0, 0x3d,0x65,0xe3,0xff,0xc5,0x7f,0xe1,0x29,0x3d,0x1e,0xe0,0x0, 0x24,0xdb, +0xe1,0x2a,0x3d,0x1d,0xe0,0x0, 0x25,0x57,0x2d,0x83,0xf0,0x0, 0xb5,0x3, 0x2e,0x3, +0xf0,0x0, 0xb5,0x93,0xe0,0x2, 0x1f,0xe, 0x3f,0x12,0x87,0x8e,0xc7,0x81,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x9d,0xaf,0x8e,0xe7,0xfe,0x5, 0xc7,0x8c,0x53,0x14,0x83, +0xf0,0x0, 0x78,0x7, 0xf0,0x0, 0x78,0x85,0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x79,0x88, +0xf0,0x0, 0x7a,0x4, 0xf0,0x0, 0x7a,0x83,0xf0,0x0, 0x7b,0x2, 0xf0,0x0, 0x7b,0x81, +0xe0,0x1, 0xda,0xa1,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x9e,0xf0,0x0, +0x60,0x7, 0xf0,0x0, 0x60,0x85,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x61,0x88,0xf0,0x0, +0x62,0x4, 0xf0,0x0, 0x62,0x83,0xf0,0x0, 0x63,0x2, 0xf0,0x0, 0x63,0x81,0xe0,0x2, +0x2, 0x84,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8e,0x3f,0x6f,0xe0,0x2, +0x5, 0x85,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x3f,0xf5,0x5, 0x85,0xf0,0xf, 0x39,0x12, +0xc2,0x81,0xaa,0x8f,0xea,0x13,0x7f,0xfc,0x39,0x1f,0x15,0x81,0xad,0x82,0xe7,0xfe, +0x0, 0x84,0xf0,0xc, 0x3b,0x12,0x8e,0xc, 0x26,0x1c,0x14,0x94,0xe1,0x2c,0x3f,0x19, +0xe0,0x1, 0x2e,0x1b,0xe1,0x2c,0x3e,0x99,0xe0,0x1, 0x2e,0x17,0x14,0x89,0xe1,0x2c, +0x3f,0x19,0xe0,0x1, 0x2e,0x6c,0xe1,0x2c,0x3e,0x99,0xe0,0x1, 0x2e,0x68,0x15,0x84, +0xe1,0x2e,0x3f,0x1b,0xe0,0x1, 0x2f,0x69,0xe1,0x2d,0x3e,0x9b,0xe0,0x1, 0x2e,0xe5, +0x66,0x8a,0xe0,0xe, 0x3e,0x92,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x5, 0xbc,0x17,0xff, +0x3f,0x9e,0xe2,0x1, 0xc7,0xff,0x3f,0x6f,0x3e,0x92,0xaf,0x8d,0x3c,0xee,0xf0,0x0, +0x78,0x7, 0xf0,0x0, 0x78,0x85,0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x79,0x88,0xf0,0x0, +0x7a,0x4, 0xf0,0x0, 0x7a,0x83,0xf0,0x0, 0x7b,0x2, 0xf0,0x0, 0x7b,0x81,0x7f,0x9, +0xe0,0x1, 0xd9,0xee,0xf0,0x4, 0x3d,0x18,0x67,0x9, 0xe3,0xff,0xc2,0x7f,0xb2,0x3, +0x3c,0xee,0xe8,0x40,0x3c,0x6e,0xe0,0x1, 0xd9,0xe3,0xf0,0xf, 0x3d,0x98,0xe3,0xff, +0xc7,0xff,0xf0,0x0, 0x63,0x81,0xf0,0x0, 0x63,0x2, 0xf0,0x0, 0x62,0x83,0xf0,0x0, +0x62,0x4, 0xf0,0x0, 0x61,0x88,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x60,0x85,0xf0,0x0, +0x60,0x7, 0xb7,0x93,0xe8,0x6, 0x3b,0x14,0xf0,0xd, 0x3b,0x92,0xf0,0xe, 0x3b,0x12, +0x16,0x1, 0xe2,0x0, 0xca,0x8e,0xae,0xd, 0xf0,0x0, 0xa8,0xe, 0xb2,0x6, 0xb7,0x96, +0x5, 0x95,0xf0,0xf, 0x39,0x12,0x17,0x5, 0xaf,0xf, 0xe0,0x2, 0x1f,0x8e,0x39,0x1f, +0xf0,0x0, 0xa8,0x2, 0xe7,0xfd,0x0, 0x89,0xe2,0x0, 0xcd,0x2, 0x5, 0x8f,0xf0,0xa, +0x3b,0x92,0x88,0x8a,0x15,0x9, 0xe7,0xfd,0x0, 0xf5,0xe2,0x0, 0xca,0x81,0x5, 0xee, +0xf0,0xf, 0x39,0x12,0xc2,0xff,0xaa,0x8f,0x0, 0xe9,0xe0,0x0, 0x1, 0x4e,0xf0,0x0, +0x26,0xbe,0xf0,0xa, 0x3b,0x92,0x88,0x8a,0xe7,0xfd,0x0, 0xe6,0x14,0x9f,0xe1,0x2a, +0x3c,0xae,0xe7,0xfe,0x25,0x2, 0xe1,0x2a,0x3c,0xad,0xe7,0xfd,0x25,0x7e,0x16,0x80, +0x3f,0x6d,0xe7,0xfe,0x0, 0x80,0x8f,0x53,0xe2,0x0, 0xcf,0x3c,0x5, 0xaf,0xea,0x13, +0x7e,0xf0,0x17,0xb, 0x3f,0xee,0xe7,0xff,0x0, 0x81,0xdd,0xef,0xea,0x14,0x7f,0x8, +0xea,0x13,0x7f,0xfc,0x3e,0x6e,0x3e,0xef,0xe1,0x80,0xb9,0x1c,0xea,0x13,0x7c,0x70, +0xe1,0x80,0xb9,0x1d,0x15,0xa, 0xb9,0x1e,0x14,0x81,0xb9,0x1f,0xb1,0x2c,0xb1,0x2d, +0xe0,0x1, 0xda,0xa, 0xea,0x13,0x7f,0xe4,0x3f,0x6f,0xe1,0x80,0xb9,0x1e,0xb9,0x1f, +0xb1,0x2e,0xc0,0x28,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x9, 0x39,0x12,0xf0,0xa, +0x3b,0x92,0x8a,0x89,0x88,0x8a,0xe7,0xfd,0x0, 0xb5,0x66,0x8a,0x15,0x81,0x3e,0x92, +0xad,0x8d,0xe7,0xff,0x0, 0x89,0x8d,0x53,0xe2,0x0, 0xcd,0x3c,0xe7,0xff,0x5, 0xb1, +0xf0,0xa, 0x3b,0x92,0x88,0x8a,0x20,0xa6,0xf7,0xfd,0x2e,0x96,0xf0,0xa, 0x39,0x12, +0x8a,0x8a,0xe7,0xfd,0x0, 0xb8,0x14,0x1e,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8e,0x3f,0x6f,0xe7,0xfd,0x2, 0xff,0x17,0xf, 0x3f,0xee,0xe2,0x1, 0xc7,0xff, +0x3f,0xf5,0xe7,0xfe,0x5, 0x81,0xe7,0xfd,0x0, 0xfb,0xea,0x13,0x7e,0xf0,0x17,0x5, +0x3f,0xee,0xe7,0xfe,0x0, 0xab,0xea,0x13,0x7e,0xf0,0x17,0x2, 0x3f,0xee,0xe7,0xfe, +0x0, 0xa5,0x15,0x12,0xe7,0xfc,0x0, 0xee,0xea,0x13,0x7c,0xba,0xf0,0x0, 0xae,0x89, +0xe7,0xfc,0x0, 0xae,0xe0,0x2, 0x1f,0x40,0xe0,0x2, 0x1f,0xc8,0xe0,0xa, 0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x1, 0x77,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0xe0,0x0, +0x1, 0x75,0xea,0x13,0x7f,0xb8,0x8f,0xf, 0x27,0x37,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, +0x1e,0xc7,0xe0,0x1, 0x1, 0xb, 0xe0,0x2, 0x1f,0xd1,0x17,0x0, 0xaf,0xf, 0x9f,0x8d, +0xe2,0x1, 0xcf,0x96,0xe0,0x0, 0x5, 0xce,0xea,0x13,0x7f,0x36,0x87,0x8e,0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xaf,0x8e,0xe0,0x1, 0x5, 0x97,0xe0,0x2, +0x1e,0xda,0x16,0x28,0xe2,0x0, 0xcf,0x83,0xae,0xd, 0xe0,0x0, 0x5, 0xed,0x17,0x80, +0xe0,0x2, 0x1e,0x4e,0xe0,0x2, 0x1d,0x4d,0xaf,0x8e,0xe0,0x0, 0x15,0xf7,0x17,0x1e, +0xaf,0xc, 0x17,0xa8,0x17,0x1e,0xad,0x8a,0x27,0x3, 0xc7,0x7f,0xaf,0xc, 0x27,0xb9, +0xc7,0xff,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1e,0xdd,0x8e,0x8d,0xe0,0x0, 0x26,0xd0, +0xe0,0x1, 0x1e,0xc7,0x9e,0xd, 0xe2,0x3, 0xce,0x10,0xe0,0x0, 0x5, 0xe1,0xea,0x13, +0x7d,0xb7,0x86,0xb, 0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0xe2,0x0, 0xce,0x1, 0xae,0xb, +0xe7,0xff,0x5, 0xbb,0xea,0x13,0x7e,0x39,0xaf,0xc, 0x17,0x1, 0xaf,0xf, 0x17,0x4, +0xe0,0x2, 0x1f,0xd1,0xaf,0xf, 0x9f,0x8d,0xe2,0x1, 0xcf,0x96,0xe7,0xff,0x2, 0xb6, +0xea,0x13,0x7f,0xb6,0xe0,0x2, 0x1e,0xda,0x17,0x0, 0xaf,0xf, 0x8f,0x8d,0xe0,0x2, +0x1d,0x4d,0xe0,0x2, 0x1e,0x4e,0x8f,0xa, 0xe0,0x0, 0x2f,0x4d,0x8f,0xc, 0x0, 0xc5, +0x38,0x82,0x8f,0xf, 0xe7,0xff,0x2f,0xa, 0xea,0x13,0x7f,0x36,0x17,0x80,0xaf,0x8e, +0xea,0x13,0x7d,0xb9,0xe0,0x2, 0x1f,0x51,0xea,0x13,0x7e,0x38,0xaf,0x8e,0xea,0x13, +0x7e,0xb7,0xe0,0x2, 0x1f,0x4d,0xaf,0x8e,0xe0,0x2, 0x1f,0x4e,0xaf,0x8e,0xe0,0x2, +0x1f,0x5a,0xaf,0x8b,0xaf,0x8c,0xaf,0x8d,0xaf,0x8e,0x38,0x82,0xe0,0x1, 0x1e,0xc7, +0xe7,0xfe,0x0, 0xfb,0x17,0xa8,0x0, 0xd4,0x9f,0xd, 0xe2,0x2, 0xcf,0x2b,0x2, 0x94, +0xea,0x13,0x7e,0x39,0x87,0xc, 0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x32, +0x5, 0x91,0x17,0x0, 0xaf,0xc, 0xaf,0xf, 0xe7,0xfe,0x0, 0xe7,0xea,0x13,0x7f,0xb7, +0xaf,0xf, 0xe7,0xfe,0x0, 0xe2,0xea,0x13,0x7f,0xb9,0x17,0x0, 0xaf,0xf, 0xe7,0xff, +0x0, 0xa8,0xaf,0xc, 0xe7,0xff,0x0, 0xa5,0xe0,0x2, 0x1e,0xda,0x8f,0x8d,0xe7,0xff, +0x0, 0xb0,0x15,0xff,0x3d,0x9e,0xe2,0x1, 0xc5,0xff,0x8f,0xc, 0xad,0x8a,0xe7,0xfe, +0x0, 0xf5,0x8, 0xb1,0xe2,0x0, 0xcc,0x2, 0x1, 0x21,0xe2,0x0, 0xcc,0x3, 0x1, 0x16, +0xe2,0x0, 0xcc,0x1, 0x1, 0x2, 0x8, 0xe1,0xef,0xfc,0xdb,0x56,0xe0,0x2, 0x1f,0xd2, +0xac,0xf, 0xe0,0x2, 0x1f,0x84,0x24,0x20,0x17,0x0, 0xaf,0xf, 0x17,0xa, 0xe0,0x2, +0x1f,0x88,0xb7,0xf, 0x8, 0xa1,0xe7,0xfe,0x0, 0x97,0xef,0xff,0xd2,0x3f,0xef,0xff, +0xd1,0xab,0xdc,0xbb,0x8, 0xa1,0xe7,0xf2,0x0, 0xd7,0xe0,0x2, 0x1f,0xd0,0x17,0x0, +0xaf,0xf, 0xef,0xff,0xd1,0x5a,0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f,0x2f,0xdc, +0x8, 0xa1,0xe7,0xe1,0x0, 0xf1,0x8f,0xf, 0xe2,0x0, 0xcf,0x1, 0x1, 0xe4,0x0, 0xdd, +0xe0,0x1, 0x1f,0x8e,0x8f,0x8f,0x27,0x9b,0x16,0x7f,0x3e,0x1f,0xe2,0x1, 0xc6,0x7f, +0xc6,0x1, 0xe4,0x0, 0xc6,0xa, 0x16,0x83,0x3e,0x18,0xe0,0xff,0x17,0x7f,0x17,0x80, +0xae,0x88,0xc4,0xa, 0x3c,0x7c,0xe0,0x41,0xae,0x98,0xe0,0x40,0xb7,0x48,0xe0,0x40, +0xb7,0x38,0xe0,0x40,0xaf,0xc8,0xe0,0x40,0xaf,0xa8,0x1, 0xf3,0x38,0x82,0x0, 0x0, +0xe0,0x1, 0x1f,0x8e,0xc4,0xff,0x8e,0xf, 0xe0,0x2, 0x1f,0xdf,0x8e,0x8f,0x17,0x80, +0xe0,0x0, 0x26,0x41,0xf0,0x2, 0x1b,0xde,0xf0,0x40,0x3a,0x6f,0xf0,0x0, 0x12,0x82, +0xf0,0x0, 0x13,0x3, 0x15,0xfd,0x15,0x1, 0x0, 0x8f,0x8f,0x78,0x27,0x17,0xf0,0x0, +0xab,0x8, 0x17,0x3, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xaf,0x18,0x3f,0xfc,0xc4,0xa, +0xe0,0x40,0xaf,0x38,0x1, 0x27,0xe0,0x80,0x8f,0x19,0xe2,0x0, 0xcf,0x1, 0x1, 0x11, +0x87,0x18,0x3f,0x5b,0xe2,0x1, 0xc7,0x7d,0x2f,0x69,0x17,0xa, 0x3f,0x3d,0xad,0x8, +0xe8,0xe, 0x3f,0x17,0xc6,0x81,0xaf,0xce,0xe2,0x1, 0xc6,0xff,0x8f,0x8, 0x0, 0xe3, +0x8f,0x18,0xe2,0x0, 0xcf,0x1, 0x1, 0xf, 0xe2,0x0, 0xcf,0x3, 0x1, 0xe, 0x2f,0x5, +0xf0,0x0, 0xaa,0x88,0x17,0x2, 0x0, 0xd7,0xe2,0x0, 0xcf,0x2, 0x1, 0xf0,0xaf,0x8, +0x0, 0xd2,0x38,0x82,0xf0,0x0, 0xab,0x18,0x17,0x0, 0xf0,0x0, 0xaa,0x8, 0x0, 0xcb, +0x8, 0xb6,0xc0,0x4c,0xe0,0x1, 0x1a,0x8e,0xe0,0x2, 0x1f,0xfd,0x8d,0x5, 0xf0,0x0, +0x8a,0x6f,0xf0,0x0, 0x89,0x7f,0xe0,0x3, 0x25,0x6b,0x14,0x7f,0x3c,0x1a,0xe2,0x1, +0xc4,0x7f,0xc4,0x1, 0xe0,0x2, 0x19,0x5e,0xe4,0x0, 0xc4,0xa, 0x14,0x9c,0x15,0x84, +0x16,0x10,0x3f,0xe2,0x3c,0x90,0x3d,0x90,0x3e,0x10,0x3c,0x12,0x16,0xff,0x17,0x0, +0xae,0xcf,0xc7,0x8a,0x3f,0xf8,0xe1,0x80,0xae,0x99,0xe1,0x80,0xaf,0x1b,0xe1,0x80, +0xaf,0x1c,0x1, 0xf7,0xe0,0x2, 0x1a,0x5f,0xea,0x23,0x79,0x94,0xf0,0x0, 0x8b,0x4, +0xf0,0x0, 0x2b,0x22,0x8f,0x83,0x27,0x97,0xe0,0x3, 0x25,0x50,0x17,0x7f,0x3f,0x1a, +0xe2,0x1, 0xc7,0x7f,0xc7,0x1, 0xe4,0x0, 0xc7,0xa, 0xe0,0x2, 0x1f,0xde,0x39,0x1e, +0xe0,0xff,0x17,0x7f,0xe0,0x12,0xb7,0x7f,0xc7,0x8a,0x39,0x7f,0xe0,0x12,0xb7,0x3f, +0x1, 0xfa,0x8f,0x84,0xe0,0x2, 0x1c,0x57,0x14,0x84,0x3c,0x90,0xaf,0x83,0xdf,0x61, +0xc0,0x34,0xb, 0x61,0xf0,0x0, 0x8b,0x83,0xf0,0x2, 0x23,0x8f,0xe0,0x3, 0x25,0x31, +0x16,0xff,0x3e,0x9a,0xe2,0x1, 0xc6,0xff,0xe0,0x1, 0x1f,0x7f,0xf0,0x1, 0x1a,0xe5, +0xe0,0x26,0xc6,0xb6,0x36,0xa2,0x3e,0x9e,0xe8,0x40,0x3f,0xe5,0xe0,0xff,0x17,0x7f, +0xb7,0xf, 0xc7,0x84,0x3f,0xfd,0xe0,0x40,0xb7,0x1f,0xe0,0x2, 0xb7,0x2f,0xe0,0x2, +0xb7,0x3f,0x1, 0xf7,0x17,0x81,0xf0,0x13,0x32,0x26,0xf0,0x14,0x31,0x26,0xf9,0x31, +0x3b,0x96,0xf1,0x2e,0x3b,0x9f,0xf1,0xff,0xc1,0xdf,0xf1,0xff,0xc2,0x5f,0x14,0x0, +0xf0,0x11,0x38,0xde,0xf8,0x43,0x39,0x93,0xf8,0x43,0x3a,0x14,0xf0,0x40,0x39,0x6f, +0xf0,0x40,0x38,0x68,0x25,0x19,0x17,0x80,0x16,0x10,0xe0,0x2, 0x1f,0x57,0x3e,0x10, +0x3e,0xef,0x9d,0x9e,0xe4,0xd, 0x36,0xc8,0xe2,0xff,0xcd,0xff,0x1, 0x4, 0x8c,0x8c, +0xe0,0x1, 0x24,0xec,0xc7,0x81,0xe4,0xd, 0x37,0xa8,0xe4,0xb, 0x36,0xc8,0x3d,0x7b, +0xc7,0xa, 0xc6,0x1, 0x2, 0xef,0xc4,0x1, 0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40, +0x3b,0xff,0xf0,0x0, 0xc2,0x84,0x2, 0xdf,0xe0,0x0, 0x25,0x40,0x14,0x7f,0x3c,0x1a, +0xe2,0x1, 0xc4,0x7f,0xc4,0x1, 0x14,0x8a,0x3c,0xb8,0xea,0x23,0x7e,0x80,0xea,0x22, +0x7f,0x6c,0xe0,0x2, 0x1f,0xde,0x3c,0x92,0xe0,0x12,0x95,0xff,0xe0,0x13,0x96,0xf, +0xc7,0x8a,0x3f,0xf9,0xe1,0x80,0xb5,0x9d,0xe1,0x80,0xb6,0x1e,0x1, 0xf6,0x15,0x9c, +0x3d,0x90,0x3c,0x1b,0x10,0x81,0x13,0x0, 0x0, 0x84,0xc5,0x81,0x3d,0xf8,0x1, 0x1d, +0x8f,0x8b,0xe2,0x1, 0xcf,0xff,0x1, 0xfa,0x4f,0x10,0x16,0x91,0x3e,0x90,0x17,0x81, +0xe0,0x2, 0x27,0x29,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3f,0x7a,0x3c,0xef,0x3, 0xee, +0xe1,0x80,0x8e,0x1d,0xc7,0x81,0x2e,0x77,0xaf,0xb, 0xe2,0x0, 0x7e,0x90,0xc5,0x81, +0x3c,0x9d,0x3d,0xf8,0xa8,0x89,0x1, 0xe5,0x15,0xff,0xe8,0xb, 0x3d,0x96,0xe2,0x1, +0xc5,0xff,0xc5,0x81,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1f,0xde,0xe0,0x1, 0x1f,0x66, +0x3d,0x92,0x96,0xf, 0x96,0x9f,0xc7,0x8a,0xb6,0xe, 0x3f,0xfb,0xc7,0x4, 0xe0,0x40, +0xb6,0x9e,0x1, 0xf8,0xe0,0x1, 0x1e,0xe0,0xe0,0x1, 0x1f,0x5f,0xe0,0x1, 0x1f,0xf9, +0x36,0xc1,0x37,0xc1,0x37,0x41,0xe2,0x0, 0x7c,0x28,0x7f,0x8d,0x7e,0x8b,0x7f,0xc, +0xf0,0x0, 0x6b,0xa8,0xf0,0x0, 0x6b,0x29,0xe0,0x1, 0xd2,0x36,0x8f,0x84,0x8c,0x5, +0x27,0xae,0x15,0x7f,0xe0,0x1, 0x1f,0xf8,0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0x4d, +0xc5,0x12,0x9a,0x8f,0xe0,0x1, 0x1f,0xff,0x35,0x21,0x14,0x80,0xf0,0x2, 0x1b,0xd7, +0x3d,0x1f,0xf0,0x0, 0x13,0x1, 0x38,0xe9,0x24,0x14,0x3d,0xe9,0xe2,0x1, 0xc5,0xff, +0x3a,0xfb,0xe0,0x1, 0x1f,0x78,0x17,0x81,0x1, 0x88,0xe0,0x1, 0x0, 0x9d,0xe0,0x80, +0x9e,0x9e,0x3e,0xfb,0xe0,0x1, 0x1, 0x1a,0x3d,0x7e,0x3e,0x6f,0xc7,0x81,0x1, 0xf8, +0xc4,0x81,0x8f,0x84,0xe2,0x1, 0xc4,0xff,0x3f,0xf9,0x2, 0xe7,0xe7,0xfe,0x24,0x3, +0x16,0xff,0x3e,0x98,0xe2,0x1, 0xc6,0xff,0x17,0x4, 0x3f,0x10,0xc6,0x81,0xe0,0x2, +0x1f,0xde,0x3e,0x9e,0xe0,0xff,0x15,0xff,0xe1,0x80,0x8e,0x1e,0xe2,0x0, 0xce,0x1, +0x1, 0x5, 0xe0,0x12,0xb5,0xff,0xe0,0x13,0xb5,0x8f,0x3e,0xfe,0xc7,0x8a,0x1, 0xf5, +0x8f,0x84,0xe7,0xfd,0x0, 0xe9,0xe0,0x2, 0x1c,0xd7,0x15,0x1, 0x17,0x8a,0xe8,0xf, +0x3f,0xb7,0x16,0x1, 0xe0,0xe, 0x39,0x1f,0x96,0x8e,0x95,0x9e,0x3f,0x99,0xb6,0x9f, +0xe8,0xc, 0x3e,0x17,0xb5,0xaf,0xe2,0x0, 0x7e,0x84,0xe8,0xd, 0x3e,0x97,0x8f,0x84, +0xf0,0x0, 0xab,0xce,0xf0,0x40,0x3b,0xec,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3f,0xf7, +0xad,0xd, 0x2, 0xe5,0xe7,0xfd,0x0, 0xc8,0xf0,0x0, 0x28,0x9c,0x97,0x2e,0xe8,0x0, +0xb5,0x85,0xe8,0x0, 0xb7,0x15,0xe2,0x0, 0x7f,0x1c,0xe2,0x0, 0x7e,0x10,0x3f,0x18, +0x3f,0x9c,0xc4,0x1, 0xf0,0x0, 0xa9,0xf, 0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40, +0x3b,0xff,0xae,0x8e,0xf0,0x0, 0xc2,0x84,0xe7,0xfd,0x2, 0xee,0xe7,0xfe,0x0, 0x8e, +0xea,0x23,0x7e,0x0, 0xe0,0x6, 0x37,0xa1,0x3e,0x16,0x98,0x8c,0xe2,0xff,0xc8,0xff, +0x1, 0x5e,0xea,0x22,0x7c,0xec,0x9e,0x2e,0xe0,0xe, 0x35,0xa1,0x3c,0x96,0x3f,0x21, +0x95,0x89,0xe0,0x43,0x3f,0x1e,0x36,0x21,0xe2,0x0, 0xcf,0x0, 0x3e,0x2b,0xe0,0x43, +0x3e,0x1c,0x3d,0xee,0xe0,0x0, 0x4, 0x43,0xe2,0x0, 0xce,0x0, 0xe0,0x43,0x3d,0x9b, +0x3f,0x6c,0x4, 0x39,0xf0,0x40,0x39,0xfb,0xe0,0x43,0x3f,0x1e,0xe8,0x6b,0x3d,0x23, +0xf0,0x40,0x3a,0x7e,0xe8,0x0, 0xb5,0x85,0xe8,0x6e,0x3d,0x24,0xe8,0x0, 0xb7,0x15, +0xe7,0xff,0x0, 0xbb,0xe0,0x40,0x3e,0x61,0xe2,0x0, 0x7f,0x9c,0x3e,0x1f,0x8f,0x8c, +0xe2,0x1, 0xcf,0xff,0xe7,0xfe,0x1, 0x66,0x17,0xa, 0x3f,0x39,0x16,0x8a,0x3f,0x12, +0x3e,0xbf,0x96,0x1e,0x95,0x8e,0xaf,0xce,0xe8,0xe, 0x3e,0x97,0xe2,0x0, 0x7e,0x84, +0x3f,0x9d,0xb5,0x9e,0xc4,0x81,0xb6,0x2e,0xe2,0x1, 0xc4,0xff,0xf0,0x0, 0xab,0xf, +0x8f,0x84,0x3f,0xf9,0xe7,0xfe,0x2, 0xba,0xe7,0xfe,0x0, 0xd2,0xe0,0x2, 0x19,0x5e, +0xe7,0xfc,0x0, 0xb2,0xe8,0x40,0x3f,0x60,0x0, 0xc6,0xe8,0x40,0x3d,0xe0,0xe7,0xff, +0x0, 0xbd,0x3c,0xe6,0xe7,0xfd,0x0, 0xe2,0x3f,0xea,0xe7,0xfc,0x0, 0xc5,0xf0,0x1, +0x1a,0xe5,0xe7,0xfc,0x0, 0xe9,0x8, 0xb3,0x3f,0x83,0xef,0xfa,0xdf,0xa, 0x14,0x0, +0xef,0xfa,0xde,0xe6,0xef,0xfb,0xd2,0x56,0xef,0xfa,0xdf,0x46,0xef,0xfa,0xd8,0x96, +0xef,0xfa,0xd9,0xf2,0xef,0xfa,0xdf,0x71,0xea,0x23,0x7f,0x18,0x16,0x80,0xea,0x23, +0x7f,0x96,0xb6,0x8e,0xe0,0x13,0x17,0x44,0xb7,0xf, 0xef,0xfa,0xdf,0x20,0xe0,0x2, +0x19,0xe6,0xef,0xfb,0xd1,0x2a,0xef,0xfa,0xdf,0x40,0xef,0xfa,0xdf,0x93,0x17,0x83, +0xaf,0x83,0xef,0xfd,0xd8,0x6a,0xef,0xfa,0xdf,0xbc,0xef,0xfb,0xd2,0xe1,0xef,0xfb, +0xd1,0xda,0x3b,0x0, 0xe0,0x1, 0x19,0x42,0xef,0xfa,0xda,0x2a,0xe0,0xe, 0x8c,0xa2, +0xe0,0xe, 0x8c,0x12,0xe0,0x1, 0x15,0x78,0xe0,0x0, 0xdf,0xa0,0x87,0x83,0xe0,0x10, +0x8f,0x72,0xe2,0x0, 0xc7,0x81,0x3f,0x7f,0x1, 0x11,0xe0,0xe, 0x8d,0x82,0xe0,0xd, +0x8d,0x62,0xe0,0xd, 0x8c,0xf2,0xe0,0xd, 0x8c,0x52,0x16,0x18,0xe0,0x0, 0xdf,0xa6, +0xe0,0x3, 0x1f,0xb4,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xe0,0xd, 0x8d,0xf2,0xe0,0xd, +0x8d,0x52,0xe0,0xe, 0x8c,0x82,0xe0,0xd, 0x8c,0x62,0x16,0x18,0xe0,0x0, 0xdf,0x96, +0xe0,0x3, 0x1f,0xb4,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xea,0x23,0x7f,0x18,0xea,0x23, +0x7f,0x96,0x16,0x80,0xb6,0x8e,0xb4,0xf, 0x38,0x82,0xea,0x23,0x7f,0x18,0x97,0x8e, +0xea,0x23,0x7e,0x96,0xc7,0x81,0x9e,0x8d,0xe3,0xff,0xc7,0xff,0x3e,0xff,0xb7,0x8e, +0x2, 0x82,0x38,0x82,0xe7,0x5e,0x0, 0xe1,0xe0,0x2, 0x1f,0xdf,0xe0,0x2, 0x1e,0xde, +0x8f,0xf, 0xe2,0x0, 0xcf,0x1, 0x1, 0xd, 0xea,0x23,0x7f,0x32,0x16,0x0, 0xea,0x23, +0x7e,0xb3,0xeb,0xff,0x7f,0xd8,0xae,0xe, 0x17,0x1e,0xae,0xd, 0xaf,0xf, 0x38,0x82, +0xfa,0x23,0x7b,0x33,0xe8,0x0, 0x8f,0x86,0x2f,0x96,0xe0,0x19,0x9f,0x8d,0xe2,0x2, +0xcf,0x80,0xe0,0x6, 0x9f,0xbd,0xe0,0x1, 0x1, 0x17,0xe0,0x6, 0x9e,0x2d,0xea,0x23, +0x7d,0xb2,0x8f,0xb, 0xe2,0x0, 0xcf,0x1, 0x1, 0x36,0xea,0x23,0x7f,0x1c,0xb6,0xe, +0xb7,0x9e,0x38,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0xf, 0xea,0x23,0x7d,0xb2,0x8f,0x8b, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x69,0xea,0x23,0x7f,0x1c,0xe0,0x6, 0x9f,0xbd, +0xe0,0x6, 0x9e,0x2d,0x0, 0xed,0xe0,0x19,0x9f,0x8d,0xf0,0x6, 0x9a,0x3d,0xe2,0x2, +0xcf,0x81,0xf0,0x6, 0x99,0xad,0xe0,0x1, 0x1, 0x16,0xea,0x23,0x7d,0xb2,0x8f,0x8b, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x6d,0xf2,0xa, 0xca,0x50,0xe0,0x1, 0x2, 0xd9, +0xeb,0xff,0x7c,0x58,0x17,0x81,0xaf,0x8b,0x17,0x1d,0x17,0x9d,0xaf,0x88,0xf0,0x40, +0x3b,0xee,0x0, 0x8b,0xeb,0xff,0x7c,0x58,0xf0,0x0, 0x8b,0x88,0xf0,0x40,0x3a,0x6f, +0xe8,0x40,0x3f,0x67,0xf0,0x40,0x39,0xec,0xe0,0x1, 0x1f,0xd5,0xe0,0x0, 0x14,0xc0, +0x3f,0x9e,0xea,0x23,0x7f,0x1c,0x8f,0x8f,0x9d,0xe, 0xf0,0x0, 0x9a,0x9e,0x3c,0xaf, +0xe0,0xc, 0x3d,0x3f,0xf0,0x12,0x39,0xb9,0xe8,0xf, 0x3f,0xb5,0xe8,0x9, 0x3c,0xb4, +0xe8,0xc, 0x3e,0x12,0x3f,0x99,0x36,0x46,0x37,0xc6,0xe3,0xff,0xc6,0x7f,0xe3,0xff, +0xc7,0xff,0x14,0x80,0xe8,0x0, 0xac,0x86,0xe0,0x6, 0xb6,0x2d,0xe0,0x6, 0xb7,0xbd, +0xf0,0x0, 0x2b,0x86,0xf0,0x0, 0xab,0x8b,0xe7,0xff,0x0, 0x9b,0xf0,0xa, 0x39,0xaa, +0xe0,0x43,0x3d,0x1a,0xe4,0xb, 0x35,0xf, 0xe2,0xd, 0x3d,0xca,0x3e,0xab,0xe0,0x43, +0x3e,0x9d,0x15,0x82,0xe0,0x2d,0x3e,0x9b,0x2e,0x90,0xf8,0xd, 0x3a,0x25,0xe0,0x43, +0x3e,0x9d,0xe4,0xa, 0x36,0x8f,0xe2,0xd, 0x3d,0x4d,0x3e,0xaa,0xe0,0x43,0x3e,0x9d, +0xe0,0x2d,0x3e,0x9b,0xe7,0xfe,0x26,0xfd,0xf1,0xff,0xc3,0xff,0xf0,0x0, 0xab,0x88, +0xe7,0xfe,0x0, 0xf7,0xe7,0xf5,0x16,0x2f,0x3e,0x1f,0xe2,0x0, 0xce,0x4e,0xe0,0x6, +0x9e,0x2d,0xe7,0xfe,0x2, 0xe6,0xe7,0xff,0x15,0xaf,0x3d,0x9c,0xe2,0x4, 0xcd,0xa4, +0xe7,0xfe,0x2, 0xdf,0xea,0x23,0x7d,0xb2,0x8c,0x8b,0xea,0x23,0x7d,0x28,0xeb,0xff, +0x7c,0x58,0xe8,0x0, 0xaf,0x6, 0xe2,0x0, 0xcc,0x81,0x17,0x1e,0xb6,0xa, 0xb7,0x9a, +0xaf,0x8, 0xe7,0xfe,0x1, 0xd4,0xf0,0x40,0x39,0xec,0xf0,0x40,0x3a,0x6f,0xe7,0xfe, +0x0, 0xfd,0xe7,0xf5,0x17,0xaf,0xe8,0xf, 0x3f,0x94,0xe2,0x0, 0xcf,0xce,0xe7,0xfe, +0x2, 0xe6,0xea,0x23,0x7f,0xa8,0xf0,0x0, 0x9b,0x8f,0x9c,0x1f,0xf8,0xb, 0x39,0xa7, +0xe0,0x43,0x3d,0x9b,0xe4,0xe, 0x35,0x8f,0xf0,0xc, 0x3a,0x28,0xe0,0x43,0x3e,0x1c, +0xe2,0xf, 0x3f,0x4b,0xe4,0x9, 0x36,0xf, 0x3f,0xae,0xe0,0x43,0x3f,0x9f,0xe2,0xe, +0x3c,0xcc,0xe0,0x0, 0x15,0x63,0x3f,0x29,0xe0,0x29,0x3d,0x2f,0xe0,0x43,0x3f,0x1e, +0x24,0xaf,0xe0,0x2a,0x3d,0x2e,0x25,0x2c,0x3f,0x9e,0xe2,0x1, 0xcf,0x95,0x2, 0x28, +0x35,0x82,0x36,0x2, 0xe8,0xb, 0x3d,0x97,0x3e,0x18,0xf0,0x40,0x39,0xeb,0xf0,0x40, +0x3a,0x6c,0xf3,0xff,0xc1,0xff,0xf3,0xff,0xc2,0x7f,0xf0,0x6, 0xb1,0xad,0xf0,0x6, +0xb2,0x3d,0xe7,0xfe,0x0, 0xac,0xeb,0xff,0x7c,0x58,0xf0,0x0, 0x8b,0x88,0xf0,0x6, +0x99,0xad,0xe8,0x40,0x3f,0x67,0xf0,0x6, 0x9a,0x3d,0xe7,0xfe,0x0, 0xbf,0xea,0x23, +0x7f,0x1c,0xe8,0x40,0x3f,0xe4,0xe8,0x40,0x3e,0x63,0xe7,0xfd,0x0, 0xfa,0xea,0x23, +0x7d,0xb2,0xeb,0xff,0x7c,0x58,0x17,0x81,0xaf,0x8b,0xe7,0xfe,0x0, 0x9f,0xeb,0xff, +0x7c,0x58,0xe7,0xfe,0x0, 0x9b,0xf0,0x2, 0x1b,0x5e,0xe4,0x0, 0xc5,0xa, 0xf0,0x1, +0x1a,0xd7,0xf0,0xe, 0x3b,0x1a,0xf0,0xd, 0x8b,0x8e,0xe8,0x0, 0x8e,0x85,0xe0,0xd, +0x87,0xae,0xe8,0x40,0x3e,0xf7,0xe4,0xf, 0x37,0xac,0xe0,0xd, 0x8f,0x1e,0xe4,0xf, +0x37,0xc8,0x5, 0x9a,0xe0,0x2, 0x1e,0xcf,0xe0,0x2, 0x1d,0xa6,0x8e,0x8d,0x26,0xa2, +0xe0,0x0, 0x1e,0x4f,0xe8,0xe, 0x3d,0x97,0xe8,0xf, 0x3e,0x17,0x8f,0xe, 0x8f,0x8f, +0x16,0x8a,0xe8,0xd, 0x3e,0xb7,0xe8,0xd, 0x3e,0x96,0xe0,0x2, 0xc6,0xac,0x8e,0x8d, +0xe2,0x0, 0xce,0x81,0x1, 0x31,0xe8,0x2, 0x8e,0xe5,0xe2,0x1, 0xce,0xff,0x1, 0x87, +0xe8,0xa, 0x3d,0x16,0xe0,0xd, 0x8f,0xa, 0xe1,0x2e,0x3f,0xd, 0xaf,0x8, 0xaf,0x89, +0x38,0x82,0xe8,0xc, 0x3d,0x97,0x8e,0x8c,0x2e,0xa9,0xaf,0xc, 0xe0,0x0, 0x1e,0x4f, +0xe8,0x14,0x3e,0x17,0xe8,0x0, 0x8e,0x84,0x26,0xb9,0xe0,0x13,0x3f,0xad,0xf8,0x43, +0x39,0x13,0xf2,0x0, 0xc9,0x0, 0xf8,0x41,0x39,0x42,0xe8,0x73,0x3d,0x22,0xf2,0x0, +0xc9,0xa0,0x5, 0x30,0x3f,0xfd,0x5, 0xa6,0x17,0x90,0x3f,0x9d,0xe2,0x1, 0xc7,0xff, +0xe8,0x0, 0xaf,0x84,0x0, 0xc6,0x16,0x80,0xe8,0xb, 0x3d,0x97,0xe8,0xc, 0x3e,0x17, +0x17,0x80,0xae,0x8b,0x3f,0x6f,0xae,0x8c,0x0, 0xc7,0xe0,0x14,0x3f,0x2d,0xf8,0x43, +0x39,0x94,0xf2,0x0, 0xc9,0x80,0xf8,0x41,0x39,0xc3,0xe8,0x74,0x3d,0x23,0xf2,0x0, +0xca,0xf, 0x5, 0x13,0x3f,0x7d,0x5, 0x94,0x17,0x1, 0x3f,0x1d,0xe2,0x1, 0xc7,0x7f, +0x0, 0xc5,0x17,0xf0,0x3f,0x9d,0xe2,0x1, 0xc7,0xff,0xe8,0x0, 0xaf,0x84,0xe7,0xff, +0x0, 0xa1,0x3f,0xed,0xe7,0xff,0x0, 0x9e,0x3f,0x6d,0xe7,0xff,0x0, 0xb9,0x17,0x7f, +0x3f,0x1d,0xe2,0x1, 0xc7,0x7f,0xaf,0xc, 0xe7,0xff,0x0, 0xb2,0xe0,0x2, 0x1e,0xde, +0xe0,0x19,0x9f,0x8d,0xe2,0x0, 0xcf,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0xcc,0x8f,0xf, +0x27,0x1a,0xe0,0x0, 0x1f,0xc5,0xe0,0x2, 0x1e,0x58,0x94,0xf, 0x94,0x9f,0x95,0x2f, +0x95,0xbf,0x97,0xcf,0xe0,0x6, 0xb4,0x2d,0xe2,0x0, 0xcf,0x3, 0xb4,0x9c,0xb5,0x2c, +0xb5,0xbc,0xb7,0xcc,0x1, 0x27,0xe2,0x0, 0xcf,0x1, 0x1, 0x2, 0x17,0x2, 0xe0,0x2, +0x1f,0xd7,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xcb,0x87,0x8f,0xc7,0xff,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0xba,0x2, 0xda,0xe0,0x0, 0x1f,0xc5,0xe0,0x2, 0x1f,0x58, +0x94,0x8f,0x95,0x1f,0x95,0xaf,0x96,0x3f,0xe0,0x2, 0x1c,0x4c,0x97,0xcf,0xe0,0x6, +0xb4,0xad,0xf0,0x0, 0x13,0x83,0xf0,0x0, 0xab,0x88,0xb5,0x1e,0xb5,0xae,0xb6,0x3e, +0xb7,0xce,0x17,0x0, 0xe0,0x2, 0x1f,0xd7,0xaf,0xf, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x5c,0xe0,0x2, 0x18,0xc0,0xe0,0x1, 0x1e,0xda,0x17,0x80,0xe0,0xa, +0x8f,0x1, 0x6f,0xa6,0x7c,0x8, 0x6f,0xa7,0xaf,0x9d,0xe0,0x4, 0x27,0x5a,0xe0,0x2, +0x1a,0xdc,0xf0,0x2, 0x1f,0x5e,0x7a,0x86,0xef,0xfc,0xd3,0xb8,0xe0,0x1, 0x1b,0xd7, +0xdf,0x9e,0x8a,0x7, 0xe0,0x0, 0x22,0x4a,0xf0,0x1, 0x1e,0x8e,0xfa,0x23,0x7c,0x38, +0xe8,0x0, 0x8c,0x8d,0xe0,0x2, 0x1e,0x5e,0xe0,0x2, 0x18,0xd7,0x16,0x80,0x0, 0x87, +0xc6,0x81,0x3f,0xed,0xe2,0x1, 0xc7,0xff,0x3f,0xf4,0x3, 0xbb,0xe0,0xd, 0x8f,0x8c, +0x15,0x8a,0x3f,0xf9,0xc6,0xa, 0x3d,0xbf,0x3, 0xf4,0xe0,0xa, 0x3d,0x91,0x8f,0xa, +0xe2,0x0, 0xcf,0x1, 0x1, 0xee,0xf0,0x2, 0x3c,0x1f,0x8f,0x2, 0x2f,0x6a,0xe0,0x1, +0x87,0xa, 0xc7,0x7f,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x3a,0x2, 0xe2,0xea,0x23, +0x7e,0x34,0xe4,0x0, 0xc6,0x8a,0x14,0x83,0xac,0x82,0xe0,0x0, 0xc6,0xe4,0xaf,0x8c, +0xe8,0xd, 0x3e,0x9e,0xe0,0x0, 0x1e,0x45,0x3d,0x9c,0x94,0x9b,0x91,0xb, 0x90,0xab, +0x94,0x3b,0x96,0x4b,0xb4,0x9d,0x14,0x83,0xb1,0xd, 0xb0,0xad,0xb4,0x3d,0xb6,0x4d, +0x16,0x80,0xae,0x8a,0xe0,0x6, 0x0, 0xcd,0xfa,0x23,0x7c,0x38,0xf0,0x1, 0x1e,0x8e, +0xea,0x23,0x7f,0xb4,0x8f,0x8f,0xf0,0xd, 0x3c,0x1f,0x8c,0x8d,0xe0,0x6, 0x2c,0x98, +0xe0,0x2, 0x1e,0xd5,0xe0,0x2, 0x1f,0x54,0x8f,0x8d,0x7e,0x87,0x7f,0x5, 0xe0,0x4, +0x27,0x86,0xe0,0x2, 0x1e,0x4c,0x89,0xc, 0x7e,0x3, 0xe0,0x4, 0x29,0xe, 0xe0,0x0, +0x1f,0x1b,0xf0,0x0, 0x1c,0x98,0x8f,0x8e,0x15,0x3e,0xe2,0x0, 0xcf,0x80,0xe0,0x1, +0x1f,0xda,0xe0,0x1, 0x14,0xff,0xe0,0x79,0x39,0x2f,0xe8,0x40,0x3c,0x69,0xf0,0x0, +0x7c,0x82,0xe0,0x1, 0xd3,0x11,0xe0,0x4, 0x22,0x65,0x12,0x0, 0xf0,0x2, 0x1c,0xd7, +0xf0,0x0, 0x1d,0x17,0xf0,0x0, 0x7c,0x4, 0xf0,0x40,0x3e,0x64,0xf8,0x40,0x3c,0x6d, +0x39,0xe4,0x39,0x64,0xf8,0x40,0x3e,0xee,0xf0,0x0, 0x17,0xa, 0xf0,0x1e,0x3f,0x33, +0xe8,0x0, 0x8e,0x8, 0xf8,0xe, 0x3e,0x9e,0xe0,0xd, 0x8d,0xe, 0x3d,0x7c,0xe0,0x1, +0x3, 0x90,0x17,0x8f,0xe0,0x6, 0x35,0x22,0x3f,0xda,0xe4,0x0, 0xc7,0x8a,0xf0,0xd, +0x3d,0x16,0x8c,0xbd,0xe8,0xf, 0x3f,0x99,0x8a,0x8f,0x24,0xb8,0xe0,0x6, 0x9c,0x2e, +0x2c,0x4, 0xe0,0x6, 0x9f,0xbe,0x27,0xb2,0xe2,0x0, 0xcc,0x84,0x10,0xb8,0x2, 0x8d, +0x10,0xb0,0x1, 0xb, 0xe2,0x0, 0xcc,0x83,0x10,0xa0,0x1, 0x7, 0xe2,0x0, 0xcc,0x82, +0x10,0x98,0x17,0x90,0xe0,0x61,0x39,0xaf,0x26,0x1d,0xf0,0x2, 0x1b,0x98,0xe8,0x0, +0x87,0xc7,0xe2,0x0, 0xc7,0x8f,0x3f,0xfa,0xe0,0x2, 0x1, 0x6d,0xe0,0x2, 0x1e,0x98, +0x17,0x81,0x0, 0x89,0xe0,0x1, 0x87,0x6d,0xc6,0x8a,0xe2,0x0, 0xc7,0xf, 0x3f,0x7a, +0xe0,0x2, 0x1, 0x62,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0x3d,0xef,0xc7,0x81, +0x2, 0xf2,0xf0,0xf, 0x3d,0x16,0xc4,0xff,0xac,0xbf,0x17,0xa, 0x3f,0x3a,0xf0,0xf, +0x3c,0x9e,0x8e,0x8f,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1, 0x2, 0xe0,0x1, 0x2a,0x8c, +0x66,0x84,0x3e,0x9a,0x8e,0x8d,0xe0,0x1, 0x2e,0xdf,0x62,0x83,0x8e,0x85,0xe0,0x1, +0x2e,0xdb,0xf8,0xd, 0x3e,0x9e,0xe0,0x6, 0x9e,0xad,0xe2,0x0, 0xce,0x9e,0xe0,0x3, +0x2, 0x96,0xf8,0x9, 0x3e,0x9e,0xe0,0x6, 0x9e,0x39,0xe2,0x0, 0xce,0x13,0xe0,0x3, +0x5, 0x9b,0xe0,0x1, 0x18,0xaf,0xe0,0x1, 0x1a,0xae,0x8c,0x1, 0x8d,0x85,0x34,0x28, +0x3d,0xc8,0xc5,0xed,0x3d,0xfc,0xe0,0x3, 0x5, 0xf, 0xe0,0x2, 0x1d,0xfd,0xe0,0xd, +0x8c,0x39,0x8d,0xdb,0xe0,0xd, 0x8c,0xc9,0x3d,0xb8,0xe0,0x1, 0x18,0xf2,0x3d,0x99, +0xa0,0x81,0x35,0xa1,0x3d,0x91,0x95,0x8b,0xe2,0x1, 0xcd,0xc7,0xe0,0x6, 0x2, 0x4f, +0xe2,0x0, 0xce,0x9e,0xe0,0x6, 0x2, 0xbe,0x17,0x3, 0xaf,0xf, 0xaf,0x1f,0xc1,0x81, +0x8f,0x87,0xe2,0x1, 0xc1,0xff,0x3f,0xf3,0xe7,0xfe,0x2, 0xe0,0xe0,0x2, 0x1f,0x40, +0xe0,0x2, 0x1e,0x4a,0xe0,0xa, 0x8f,0x8e,0xf0,0x0, 0x63,0x82,0x86,0xc, 0xe2,0x0, +0xcf,0x81,0xe8,0x0, 0xa9,0x17,0xf8,0x40,0x3e,0xe8,0xe8,0x0, 0xae,0x7, 0xe0,0x4, +0x1, 0x71,0xe0,0x3, 0x22,0x2d,0x62,0x88,0x11,0x1, 0xe0,0x5, 0x2a,0xaa,0x66,0x5, +0x8f,0x8c,0xe0,0x2, 0x2f,0xaf,0xe8,0x0, 0x89,0x8d,0x67,0x7, 0xe4,0x0, 0xc1,0x8a, +0xf0,0x0, 0x63,0x85,0x62,0x86,0xe0,0x2, 0x1c,0xd8,0xe0,0x2, 0x1c,0x18,0x17,0x80, +0x3d,0x63,0xaf,0x8e,0xe8,0x0, 0xaf,0x87,0xaf,0x85,0xe0,0x1, 0xd1,0xf3,0xe0,0x3, +0x22,0x33,0x3c,0x62,0xc0,0x24,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x66,0x84,0x3e,0x9a, +0x8e,0x8d,0x2e,0x87,0xf0,0x0, 0x63,0x83,0xe8,0x0, 0x8e,0x87,0xe0,0x2, 0x26,0x93, +0xe0,0x0, 0x22,0xda,0xe2,0x0, 0xca,0x83,0xe7,0xff,0x1, 0x33,0xe2,0x0, 0xca,0x81, +0xf8,0xf, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2f,0xf0,0x6, 0x9d,0xbf,0xe0,0x1, 0x1, 0x18, +0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63,0x3c,0x90,0x3c,0x10,0x7f,0x81,0xdd,0x84, +0x67,0x81,0xf2,0x1f,0xc5,0xff,0xe0,0xd, 0x8f,0x8f,0xe2,0x1f,0xc3,0x7f,0xe0,0xe, +0x37,0xac,0xe2,0x1, 0xcf,0xff,0xf0,0x1b,0x3d,0x9e,0xf3,0xff,0xc5,0xff,0xe0,0x0, +0x1, 0x79,0xe4,0x5, 0x32,0xae,0xe4,0x5, 0x32,0xc0,0xf0,0x0, 0x13,0x81,0xf0,0x17, +0x3b,0x92,0xe8,0x40,0x39,0x67,0xe2,0x1, 0xc1,0x7f,0xc2,0x1, 0x3b,0x15,0xe2,0x1, +0xc2,0x7f,0xe3,0xff,0xc3,0x7f,0x17,0x86,0xe8,0xf, 0x3f,0xbc,0x66,0x82,0xf0,0xe, +0x35,0xc8,0x3f,0x9d,0xaf,0x4f,0xe0,0xd, 0x33,0x48,0x47,0x26,0xae,0xaf,0xc1,0x81, +0xaf,0x6f,0xe2,0x1, 0xc1,0xff,0x47,0x27,0xab,0x3f,0xf0,0x0, 0xc6,0x1, 0xf0,0x0, +0xad,0xdf,0xf2,0x1, 0xc6,0x7f,0xaf,0x7f,0x8f,0x87,0x3f,0xf3,0xe7,0xfd,0x2, 0xc6, +0xe7,0xfe,0x0, 0xe6,0xf8,0xf, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2f,0xf0,0x6, 0x9d,0xbf, +0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63,0x3c,0x90,0x3c,0x10,0xdd,0x35,0xf8,0x1e, +0x3f,0x1d,0xe8,0xd, 0x8f,0x8e,0xf2,0x1f,0xc5,0xff,0xe0,0xe, 0x37,0xac,0xe2,0x1, +0xcf,0xff,0xf0,0x1b,0x3d,0x9e,0xe2,0x1f,0xc3,0x7f,0xf3,0xff,0xc5,0xff,0x1, 0x29, +0x12,0x80,0xe7,0xff,0x0, 0xb4,0x15,0x80,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1e,0x18, +0x3d,0x9c,0x9b,0xb, 0xf0,0x0, 0x9d,0x9b,0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63, +0x3c,0x90,0x3c,0x10,0xef,0xff,0xdd,0x11,0xf8,0x1e,0x3f,0x1d,0xe8,0xd, 0x8f,0x8e, +0xf2,0x1f,0xc5,0xff,0xe0,0xe, 0x37,0xac,0xe2,0x1, 0xcf,0xff,0xf0,0x1b,0x3d,0x9e, +0xe2,0x1f,0xc3,0x7f,0xf3,0xff,0xc5,0xff,0xe0,0x80,0x12,0x80,0xe7,0xff,0x1, 0x97, +0xe1,0x80,0xc3,0x0, 0xe3,0xff,0xc3,0x7f,0xe7,0xff,0x0, 0x97,0x26,0x5e,0xe0,0x2, +0x1c,0x98,0x87,0xc9,0xe2,0x0, 0xc7,0x8f,0x3d,0x7f,0x1, 0x4e,0xe0,0x2, 0x1e,0x98, +0x3f,0xe5,0x0, 0x88,0xe0,0x1, 0x87,0x6d,0xc6,0x8a,0xe2,0x0, 0xc7,0xf, 0x3f,0x7a, +0x1, 0x44,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0x3d,0xef,0xc7,0x81,0x2, 0xf3, +0x0, 0xc4,0x15,0x80,0xe0,0x2, 0x1f,0x18,0xe4,0x0, 0xc5,0x8a,0xf8,0xd, 0x3e,0x9e, +0x3d,0x9e,0xf0,0x6, 0x9a,0xbd,0x9f,0xb, 0x9f,0x9b,0xe0,0x0, 0x15,0xc0,0x3d,0xa1, +0x3c,0x3b,0x3f,0x31,0x3f,0xb1,0xe8,0xb, 0x3d,0xb5,0x3f,0x18,0x3f,0x9b,0x37,0x46, +0x37,0xc6,0xe0,0x6, 0xb7,0x2d,0xe0,0x6, 0xb7,0xbd,0xe7,0xfd,0x0, 0x8c,0xe0,0x2, +0x1f,0x4a,0xf0,0x2, 0x1f,0x5e,0x8f,0x8e,0xe0,0x1, 0x27,0xca,0xe0,0x2, 0x1e,0xdc, +0x17,0x81,0x7e,0x86,0xaf,0x8d,0x16,0xb7,0xe0,0x0, 0x1f,0x8d,0xe0,0x1a,0x9f,0xdf, +0xe1,0x2f,0x3f,0x9d,0xaf,0x8e,0xe7,0xfb,0x0, 0x99,0x62,0x85,0x8f,0x85,0xe7,0xfb, +0x2f,0xfa,0x66,0x6, 0x8c,0x8c,0xe7,0xfb,0x2c,0xf6,0xe0,0x2, 0x1a,0xcc,0x89,0x5, +0x7a,0x83,0xe0,0x4, 0x21,0x7e,0x66,0x83,0xc1,0x7f,0xa9,0xd, 0xe7,0xfb,0x0, 0xf1, +0x66,0x83,0x8f,0x8d,0xe7,0xfd,0x2f,0xd1,0xe0,0x2, 0x1c,0x57,0xd8,0x5a,0xe7,0xfd, +0x0, 0xcc,0xf0,0xb, 0x3d,0x16,0xae,0xbb,0xe0,0x2, 0x1d,0xef,0xe0,0x1, 0xae,0x8f, +0xae,0x8b,0xe7,0xfd,0x2a,0xe9,0xe7,0xfc,0x0, 0xe2,0xe0,0x1, 0x1c,0xb1,0xf0,0x1, +0x1b,0xb0,0x8d,0x89,0xe8,0x0, 0x8e,0x7, 0x35,0xa8,0x3e,0x4b,0xc6,0x62,0x3e,0xfc, +0xe7,0xfc,0x3, 0x61,0xe0,0x1, 0x8d,0x8f,0xe0,0x1, 0x25,0x87,0xe0,0x2, 0x1e,0x6f, +0x8e,0xc, 0xe0,0x1, 0x2e,0x2, 0xe0,0x0, 0x1c,0xc5,0xe0,0xc, 0x3c,0x9e,0x9d,0x8c, +0x9c,0x1c,0x2d,0x82,0x24,0x2b,0xf8,0x1, 0x3e,0x9e,0xe0,0x6, 0x9e,0x31,0xe0,0xb, +0x3e,0xab,0xe0,0xd, 0x3e,0x28,0xe4,0x8, 0x36,0x8f,0xe4,0xc, 0x35,0x8f,0xe2,0xd, +0x3c,0x4d,0xe2,0xb, 0x3e,0x4b,0x3e,0xa8,0xe0,0xc, 0x3d,0xac,0x3e,0x9c,0xe2,0x2, +0xce,0xac,0x2, 0x14,0x3f,0x19,0x94,0xe, 0x94,0x9e,0x95,0xae,0x96,0x3e,0x96,0xce, +0xe0,0x0, 0x17,0x64,0xe0,0x6, 0xb4,0x21,0x3f,0x11,0xf0,0x8, 0x3d,0x16,0x10,0x85, +0xa8,0xb8,0xb4,0x9e,0xb5,0xae,0xb6,0x3e,0xb6,0xce,0x17,0x3c,0xe0,0x1, 0xaf,0xf, +0xf8,0xe, 0x3e,0x9e,0xe0,0xd, 0x8c,0x3e,0xe0,0xd, 0x8c,0xce,0xe0,0x0, 0x0, 0xd1, +0xf0,0x2, 0x1b,0xc0,0xe0,0x2, 0x1e,0xca,0xe8,0xa, 0x8f,0x87,0x62,0x82,0x86,0x8d, +0xe2,0x0, 0xcf,0x81,0xaa,0x15,0xae,0x85,0xe0,0x1, 0x1, 0x44,0xf0,0x0, 0x63,0x86, +0xe8,0x0, 0x8f,0x87,0xe0,0x1, 0x2f,0xf8,0xf0,0x0, 0x63,0x85,0xe8,0x0, 0x89,0x7, +0xe0,0x2, 0x21,0x3a,0x62,0x83,0x89,0x5, 0xe0,0x4, 0x21,0x15,0xe8,0x0, 0x89,0x8d, +0x66,0x87,0xe4,0x0, 0xc1,0x8a,0x67,0x5, 0xf0,0x0, 0x63,0x86,0xe0,0x2, 0x1c,0xd8, +0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xaf,0x8d,0x39,0x6f,0xaf,0x8e,0xe8,0x0, 0xaf,0x87, +0xe0,0x1, 0xd0,0x40,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xe0,0x1, 0x14,0xff,0xe0,0x1, +0xd0,0x73,0x3c,0x62,0xc0,0x24,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1e,0x5c, +0x7e,0x6, 0xe7,0xfe,0x0, 0xba,0xf8,0xc, 0x3e,0x9e,0xe0,0x6, 0x9c,0xbc,0xe2,0x0, +0xcc,0xbc,0xe0,0x1, 0x5, 0x9c,0xe0,0xd, 0x8c,0x3c,0xe0,0xd, 0x8c,0xcc,0x7f,0x81, +0xef,0xfc,0xd0,0x8e,0xe0,0x2, 0x1e,0x8b,0xe2,0x0, 0xcc,0x1, 0xac,0xd, 0x67,0x81, +0xe0,0x3, 0x1, 0x0, 0xf8,0xd, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2d,0xe2,0x0, 0xcb,0x1e, +0xe0,0x1, 0x5, 0xc5,0xe0,0x1, 0x1d,0xb1,0xf0,0x1, 0x1b,0xb0,0x8e,0xb, 0xe8,0x0, +0x8f,0x7, 0x36,0x28,0x3f,0x4c,0xc7,0x62,0x3b,0x7e,0xf0,0x6, 0x9d,0xbd,0xe0,0x2, +0x4, 0x7f,0xf2,0x0, 0xcd,0x94,0x5, 0x94,0xe0,0x1, 0x1f,0x2f,0xf0,0x1, 0x1b,0xae, +0x8e,0x8e,0xe8,0x0, 0x8f,0x7, 0x36,0xa8,0x3f,0x4d,0x16,0xec,0x3e,0x9e,0xf0,0x2d, +0x3d,0xad,0xe7,0xfc,0x26,0xef,0xe9,0x2e,0x3f,0x2b,0xe7,0xfc,0x27,0x6b,0x8f,0x6f, +0xe7,0xfc,0x2f,0x68,0x17,0x2, 0xaf,0x6f,0xe7,0xfc,0x0, 0xe4,0xe2,0x0, 0xcc,0x83, +0xe0,0x3, 0x1, 0x6b,0x22,0x1a,0xe8,0xd, 0x8e,0x8e,0xe2,0x1, 0xce,0xff,0xe0,0x3, +0x1, 0x3e,0xe0,0x2, 0x1e,0x5e,0x16,0x81,0x0, 0x89,0xe0,0xe, 0x8d,0xac,0xc6,0xa, +0xe2,0x1, 0xcd,0xff,0xe0,0x1, 0x1, 0x11,0x3e,0xee,0x3f,0x6d,0xe2,0x1, 0xc7,0x7f, +0x3f,0x74,0x17,0x1, 0x3f,0x1d,0x4, 0xf2,0xe2,0x0, 0xcc,0x81,0x15,0x8a,0x3d,0xbf, +0xe0,0x1, 0x1, 0x1c,0xe0,0x2, 0x1e,0xd7,0x3d,0x9d,0x16,0x82,0xae,0x8b,0xe0,0x2, +0x1a,0xd5,0x8e,0x85,0x7a,0x87,0xe0,0x2, 0x2e,0x98,0xe0,0x2, 0x1f,0x54,0x8e,0x8e, +0x7f,0x5, 0x26,0x9c,0xe7,0xf9,0x24,0xbf,0xe0,0x2, 0x1e,0x4c,0xe8,0xf, 0x3f,0x98, +0xc4,0xff,0x89,0xc, 0xac,0x8f,0x7e,0x3, 0xe7,0xf9,0x21,0x3b,0xe7,0xfd,0x0, 0xc5, +0x62,0x86,0x89,0x5, 0xe2,0x0, 0xc9,0x1, 0xe0,0x1, 0x1, 0x11,0x66,0x5, 0x11,0x0, +0x8f,0x8c,0xe7,0xfb,0x27,0x92,0xe7,0xfd,0x0, 0xbd,0xf0,0x0, 0x63,0x86,0xe8,0x0, +0x8e,0x87,0x2e,0xe1,0x2c,0xe2,0xe7,0xfd,0x0, 0xaa,0xe0,0x1, 0x18,0xb1,0xe0,0x1, +0x1a,0xb0,0x8c,0x1, 0x8c,0x85,0x34,0x28,0x3c,0xc8,0x3e,0xf9,0xe7,0xfe,0x2, 0x5d, +0xe0,0x0, 0x1c,0xac,0x8e,0x89,0xe2,0x0, 0xce,0x81,0xe7,0xfe,0x1, 0xd6,0xe0,0x2, +0x25,0xe2,0xe2,0x0, 0xcd,0xbb,0x2, 0x84,0xc5,0x81,0xe0,0x1, 0xad,0x8f,0x17,0x3, +0xaf,0xf, 0xaf,0x1f,0x17,0x80,0xaf,0x89,0x17,0x1, 0xe0,0x2, 0x1f,0xef,0xaf,0xf, +0xe7,0xfa,0x0, 0xbf,0x62,0x88,0x12,0x0, 0x11,0x1, 0xe7,0xfa,0x22,0xda,0xe0,0x0, +0x1c,0x9b,0x16,0x80,0x8f,0x89,0xe0,0x2f,0x3f,0x8d,0xaf,0x89,0xef,0xfa,0xd8,0x10, +0xe0,0x1, 0x1f,0xdc,0x16,0x7b,0xa6,0x8f,0xa7,0xcd,0x3f,0xdc,0xbf,0xcd,0x66,0x5, +0x8f,0x8c,0xe7,0xfa,0x27,0xca,0xe7,0xfc,0x0, 0xf5,0xf0,0x6, 0x9d,0xbd,0xf2,0x0, +0xcd,0x94,0xe7,0xfe,0x5, 0xde,0xe0,0x1, 0x18,0xaf,0xe0,0x1, 0x1a,0xae,0x8e,0x81, +0x8f,0x5, 0xe7,0xfe,0x0, 0xca,0xe4,0x0, 0xc6,0x8a,0xe0,0x0, 0xc6,0xe4,0x15,0x8a, +0x3d,0xbf,0xe0,0x0, 0x1e,0x45,0xe8,0xd, 0x3e,0x9e,0x3e,0x1b,0x91,0xc, 0x90,0x9c, +0x94,0x2c,0x95,0x3c,0x96,0x4c,0xe2,0x0, 0xcc,0x81,0xb1,0xd, 0xb0,0x9d,0xb4,0x2d, +0xb5,0x3d,0xb6,0x4d,0xe7,0xfe,0x1, 0xe8,0xe0,0x2, 0x1e,0xd7,0x3d,0x9d,0xac,0x8b, +0xe7,0xfe,0x0, 0xe7,0xe8,0x0, 0x89,0x8d,0x66,0x7, 0xe4,0x0, 0xc1,0x8a,0x66,0x85, +0x67,0x6, 0xe0,0x2, 0x1c,0xd8,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xa9,0xc, 0xa9,0xd, +0xa9,0xe, 0xe0,0x0, 0xdf,0xf, 0xe7,0xfd,0x0, 0xcf,0xe0,0x2, 0x1f,0x96,0x14,0x85, +0x66,0x8, 0xac,0x8f,0xe7,0xf9,0x26,0x7d,0xef,0xfa,0xd7,0xba,0xe0,0x0, 0x1e,0x9b, +0x16,0x0, 0x8f,0x8d,0xe0,0x1, 0x1e,0xdc,0xe0,0x0, 0x1f,0x1b,0xe0,0x2f,0x3f,0x8c, +0xa6,0x8d,0xaf,0x8e,0x16,0x7b,0xa7,0xcd,0x3f,0xdc,0xbf,0xcd,0xe7,0xf9,0x0, 0xe9, +0xe0,0x1, 0x1d,0xb1,0xf0,0x1, 0x1b,0xb0,0x88,0x8b,0xe8,0x0, 0x8d,0x87,0x30,0xa8, +0x3d,0xc1,0xc5,0xe2,0x3e,0xfb,0xe7,0xf9,0x3, 0x39,0xe0,0x1, 0x8d,0x8f,0xe0,0x0, +0x25,0xe5,0xe0,0x0, 0x18,0xc5,0x38,0x9e,0xf0,0x0, 0x92,0x81,0xf0,0x0, 0x9a,0x11, +0xe8,0x40,0x3a,0xe5,0xe3,0xff,0xc2,0xff,0xe0,0xe, 0x3e,0xa5,0xe8,0xc, 0x3e,0x24, +0xe4,0xb, 0x37,0xf, 0xe4,0x13,0x36,0xf, 0xe2,0xe, 0x3d,0xce,0xf2,0xc, 0x39,0xcc, +0xe0,0xb, 0x3f,0x2b,0xe8,0xe, 0x3e,0x23,0x3f,0x1b,0xe2,0x0, 0xcf,0x31,0xe0,0x1, +0x2, 0x5, 0xe2,0x0, 0xce,0x9e,0x5, 0x8d,0xe0,0x1, 0x18,0xb1,0xe0,0x1, 0x1a,0xb0, +0x8e,0x1, 0x8f,0x5, 0x36,0x28,0x3f,0x4c,0xc7,0x62,0x3e,0xfe,0xe7,0xfd,0x4, 0x11, +0x7f,0x81,0xef,0xfb,0xdf,0x1d,0xe2,0x0, 0xcc,0x1, 0x67,0x81,0xe0,0x1, 0x1, 0x30, +0xe0,0x1, 0x8f,0xf, 0xe2,0x0, 0xcf,0x3b,0xe7,0xf8,0x2, 0xf8,0xc7,0x1, 0xe0,0x1, +0xaf,0xf, 0xe7,0xf8,0x0, 0xf3,0xe0,0x2, 0x1e,0x54,0x7e,0x5, 0xe7,0xfd,0x0, 0xee, +0xe8,0x6, 0x3b,0x1a,0x16,0x80,0x8f,0x6f,0xae,0xb6,0x27,0x15,0xe2,0x0, 0xcf,0x1, +0xe7,0xfa,0x2, 0x8a,0x16,0xbc,0xe0,0x2, 0x1c,0xbe,0x17,0x3, 0xe0,0x1, 0xae,0x8f, +0x16,0x81,0xae,0x89,0xaf,0xf, 0xaf,0x1f,0xe7,0xf8,0x0, 0xdb,0xf7,0xfd,0x2d,0x99, +0xe7,0xfa,0x0, 0x80,0xac,0x6f,0x0, 0xef,0xe0,0x0, 0x16,0xe4,0xe8,0xd, 0x3e,0x9e, +0xe8,0xd, 0x3e,0x9d,0x94,0xd, 0x94,0x9d,0x95,0x2d,0x95,0xbd,0x96,0x4d,0xe0,0x0, +0x1e,0xc5,0x3f,0x1d,0xb4,0xe, 0x16,0x83,0xb4,0x9e,0xb5,0x2e,0xb5,0xbe,0xb6,0x4e, +0x17,0x1, 0xe0,0x1, 0xaf,0xf, 0xae,0x8f,0xae,0x9f,0xe7,0xf8,0x0, 0xba,0xe0,0x2, +0x1c,0x57,0xef,0xff,0xd5,0xe7,0x16,0x8a,0xe8,0xd, 0x3e,0x98,0x3f,0xe2,0xe9,0x80, +0xaf,0x98,0xe8,0x40,0x3e,0xf8,0x1, 0xfc,0x66,0x8, 0x26,0x7, 0xe0,0x1, 0x1f,0xdc, +0xa6,0x8f,0xa7,0xcd,0xcf,0x84,0xbf,0xcd,0xe8,0x0, 0x89,0x8d,0xe0,0x2, 0x1c,0xd8, +0xe4,0x0, 0xc1,0x8a,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xe0,0x0, 0xde,0x43,0xe7,0xfc, +0x0, 0x83,0x3a,0x62,0xe7,0xfa,0x0, 0xea,0xe2,0x0, 0xce,0x9e,0xe0,0x0, 0x2, 0xce, +0xe8,0x5, 0x3a,0xc4,0xe7,0xfb,0x22,0xbb,0xe2,0x2, 0xcf,0x2c,0xe7,0xfb,0x2, 0x37, +0xf8,0xd, 0x3e,0x9e,0x94,0x11,0x94,0xa1,0x95,0xb1,0x96,0x41,0xe0,0x0, 0x17,0x64, +0x3f,0x1d,0xf0,0x6, 0xb2,0xad,0x10,0x85,0xf0,0xd, 0x3d,0x16,0xa8,0xbd,0xb4,0x1e, +0xb4,0xae,0xb5,0xbe,0xb6,0x4e,0xe7,0xfb,0x0, 0xa2,0xe0,0x0, 0x16,0xe4,0xe7,0xfd, +0x0, 0xe0,0xe0,0x0, 0x16,0x64,0xe8,0xc, 0x3e,0x1e,0xe8,0xc, 0x3e,0x1d,0x90,0x8c, +0x94,0x1c,0x94,0xac,0x95,0x3c,0x95,0xcc,0xe0,0x0, 0x1e,0x45,0xe0,0x1, 0xae,0x8f, +0x3f,0x1c,0xb0,0x8e,0x16,0x3, 0xb4,0x1e,0xb4,0xae,0xb5,0x3e,0xb5,0xce,0xe0,0x2, +0x1f,0x6f,0xae,0xf, 0xae,0x8e,0xae,0x1f,0xe7,0xf7,0x0, 0xd3,0x17,0x3c,0xe0,0x1, +0xaf,0xf, 0xe7,0xf7,0x0, 0xcb,0x15,0x8a,0x3d,0xbf,0xe0,0x2, 0x1d,0x57,0xe0,0x0, +0x16,0xe4,0x3d,0x1b,0xe7,0xf5,0x0, 0xd6,0xe0,0x1, 0x1e,0x31,0xf0,0x1, 0x1b,0xb0, +0x8d,0x8c,0xe8,0x0, 0x8e,0x7, 0x35,0xa8,0x3e,0x4b,0xc6,0x62,0x3e,0xfc,0xe7,0xff, +0x3, 0x29,0xe7,0xfb,0x0, 0xbe,0x14,0x1, 0xe7,0xf4,0x0, 0xf2,0x8, 0xb3,0xe0,0x3, +0x1f,0xb8,0x17,0x1, 0xa1,0xf, 0x16,0xfe,0xe0,0x1, 0xa7,0xe2,0x3f,0x58,0x3f,0xdd, +0x3f,0xce,0xe0,0x1, 0xbf,0xe2,0x2c,0x21,0xe0,0x2, 0x19,0xc8,0x17,0x3, 0x8f,0x83, +0x3f,0x3f,0xe0,0x2, 0x1f,0xc4,0x3f,0x9e,0x8c,0xf, 0xd4,0xa9,0xe0,0x2, 0xa7,0xd2, +0x17,0x43,0x3f,0xde,0xcf,0x9c,0xe0,0x2, 0xbf,0xd2,0x8e,0x83,0x8f,0x83,0xe0,0x3, +0x1f,0x30,0xe4,0x0, 0xc6,0x85,0xe4,0x0, 0xc7,0x85,0x3f,0x9e,0x3f,0x1d,0x8c,0xcf, +0x8c,0x3e,0x9, 0xa1,0xe0,0x5, 0x0, 0xee,0x14,0x28,0xd4,0x91,0xe0,0x2, 0xa7,0xd2, +0xe0,0x2, 0x1f,0x48,0xcf,0xbc,0xe0,0x2, 0xbf,0xd2,0x8e,0x8e,0x8f,0x8e,0xe0,0x3, +0x1f,0x30,0xe4,0x0, 0xc7,0x85,0xe4,0x0, 0xc6,0x85,0x3f,0x9e,0x84,0xcf,0x3f,0x1d, +0xc4,0xfc,0x8c,0x3e,0xe2,0x1, 0xc4,0xff,0x9, 0xa1,0xe0,0x5, 0x0, 0xd3,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x64,0xe0,0x2, 0x1f,0x66,0xe0,0x2, 0x1f,0xfd, +0x87,0xe, 0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, 0x3e,0xfe,0xe0,0x4, 0x1, 0x7f, +0x8d,0x8f,0x89,0xaf,0x7d,0x85,0x3e,0x6b,0xe0,0x2, 0x1d,0xf9,0x99,0x5f,0x8f,0x1f, +0x8f,0xbf,0x3e,0xe3,0x7d,0x83,0x3d,0x6e,0x3d,0xec,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, +0xc5,0xff,0x3d,0x7b,0x3, 0x82,0x3f,0x6c,0xf0,0x40,0x3d,0xee,0x3e,0x6f,0x3f,0x6d, +0xe2,0x1, 0xc6,0x7f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0xf2,0x1, 0xc5,0xff,0x3, 0x82, +0x3f,0xed,0xe0,0x0, 0x1f,0x43,0x15,0x80,0xf0,0x1, 0x1f,0x5e,0xb5,0x8e,0xe2,0x1, +0xc7,0xff,0xe0,0x2, 0x1f,0x46,0xe0,0x1, 0x1d,0xdd,0x7f,0x82,0xf8,0x40,0x3e,0x6e, +0xe0,0x1f,0x17,0xff,0xe8,0x80,0xb7,0x9c,0xf0,0x40,0x3e,0x7b,0xe0,0x80,0xb7,0x9e, +0x1, 0xfa,0x14,0x1, 0xef,0xf9,0xd9,0x90,0xef,0xfa,0xdc,0x30,0xef,0xf9,0xd6,0x90, +0xe0,0x2, 0x1e,0xc8,0x17,0x5, 0x8f,0x8d,0xf8,0x40,0x3c,0xeb,0x3f,0x3f,0xe0,0x3, +0x1f,0xb0,0x3f,0x9e,0x8f,0xbf,0xe0,0x0, 0x1f,0x44,0xe4,0x7, 0xc7,0xb0,0xf0,0x0, +0xa4,0xe, 0xf0,0x18,0x3c,0x1f,0xe8,0x40,0x3f,0x68,0xe0,0x6, 0xc7,0x48,0xf0,0x0, +0x7c,0x1, 0x7f,0x4, 0xf0,0x1, 0x25,0xe0,0xf0,0x40,0x3d,0xe3,0x62,0x5, 0xf2,0x1, +0xc5,0xff,0xf0,0x0, 0x7f,0x6, 0x13,0x81,0xe2,0x1, 0xc2,0x7f,0xe8,0x40,0x3b,0x6b, +0x12,0x80,0xf0,0x1, 0x1e,0xff,0xf8,0x40,0x3f,0x6b,0xf0,0x0, 0x7e,0x7, 0x0, 0x96, +0x14,0x1, 0xdf,0x35,0xef,0xf9,0xd9,0x7, 0x14,0x1, 0xef,0xf9,0xd9,0x55,0x17,0x81, +0xe8,0x40,0x3b,0xf9,0x3f,0x97,0xe8,0x6, 0x3b,0x1e,0xc2,0x81,0xe3,0xff,0xc7,0xff, +0xe3,0xff,0xc3,0x7f,0xe0,0x1, 0x3, 0xb4,0x3b,0xef,0xf0,0x40,0x3d,0xe5,0xf3,0xff, +0xc5,0xff,0xf0,0x40,0x3d,0xf4,0x3, 0xe5,0xe0,0x3, 0x1d,0xb8,0xe7,0xbf,0x16,0xff, +0xf0,0x0, 0xa4,0xb, 0xe0,0x0, 0x15,0x68,0xe8,0x1, 0xa7,0xe8,0xe0,0x1, 0x14,0xff, +0x3f,0xdd,0xe8,0x1, 0xbf,0xe8,0xf0,0x0, 0x16,0x0, 0x64,0x4, 0xe0,0x0, 0xdd,0x1c, +0xf0,0x0, 0x65,0x3, 0x29,0x6, 0x0, 0xa9,0x39,0x7d,0xf0,0x0, 0xc5,0x2, 0x5, 0xa5, +0xe8,0x40,0x3c,0x6c,0x3c,0xe3,0xe0,0x0, 0xdc,0x73,0xf0,0x0, 0xc6,0x1, 0x3c,0x75, +0xe8,0x40,0x3e,0xec,0xe3,0xff,0xc6,0xff,0x1, 0xf0,0xe8,0x0, 0x9f,0x8a,0x67,0x1, +0xc7,0x84,0xe0,0xc, 0x37,0x85,0x36,0x22,0x3e,0x1e,0xe0,0x1a,0xa5,0xac,0xe0,0x41, +0x3f,0x8f,0x17,0x1, 0xe0,0xf, 0x37,0x3f,0xe3,0xf, 0x3d,0xdf,0x39,0x7d,0xe0,0x1a, +0xbf,0xac,0xf0,0x0, 0xc5,0x2, 0x2, 0xdd,0xe8,0x1, 0xa7,0xe8,0x14,0x1, 0xe0,0x40, +0xcf,0x80,0xe8,0x1, 0xbf,0xe8,0xde,0xd3,0xef,0xf9,0xd8,0xa5,0x14,0x1, 0xef,0xf9, +0xd8,0xf3,0x14,0x0, 0xf0,0x40,0x3b,0x68,0xf0,0x0, 0x25,0xaa,0xf0,0xa, 0x3f,0x18, +0xe3,0xff,0xc5,0x7f,0xe0,0x40,0x3f,0xe8,0xf0,0x0, 0x27,0x17,0xe0,0xc, 0x17,0x52, +0x3f,0x1f,0xe0,0xd, 0x37,0xa1,0x37,0x21,0xe8,0xe, 0x3f,0x1d,0xe8,0xd, 0x3e,0x9d, +0x9d,0x8e,0x96,0xd, 0xc7,0x81,0x3d,0xfc,0xe3,0xff,0xc7,0xff,0x3, 0x3, 0x9f,0xe, +0xb7,0xd, 0x3f,0xfa,0x1, 0xec,0xf0,0x0, 0xc3,0x1, 0xf3,0xff,0xc3,0x7f,0xf8,0x40, +0x3b,0x7b,0xe8,0x8, 0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x1, 0xd9,0x3b,0xf4,0x3c,0x66, +0xf0,0x40,0x3b,0xe7,0xe7,0xfe,0x3, 0xed,0xf0,0xa, 0x3f,0x18,0xe3,0xff,0xc5,0x7f, +0xe0,0x40,0x3f,0xe8,0xf0,0x0, 0x27,0x17,0xe0,0xc, 0x17,0x52,0x3f,0x1f,0xe0,0xd, +0x37,0xa1,0x37,0x21,0xe8,0xe, 0x3f,0x1d,0xe8,0xd, 0x3e,0x9d,0x9d,0x8e,0x96,0xd, +0xc7,0x81,0x3d,0xfc,0xe3,0xff,0xc7,0xff,0x3, 0x3, 0x9f,0xe, 0xb7,0xd, 0x3f,0xfa, +0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf3,0xff,0xc3,0xff,0xf0,0x40,0x3b,0xf4,0xe8,0x8, +0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x1, 0xd9,0xe7,0xfe,0x0, 0xc3,0xf0,0x0, 0x67,0x6, +0xf0,0x0, 0x66,0x7, 0x67,0x82,0xf0,0x2, 0x1e,0xc5,0xe0,0x2, 0x27,0x95,0xf0,0x0, +0x65,0x5, 0xf0,0x40,0x3c,0xe3,0xf2,0x1, 0xc4,0xff,0xf2,0x1, 0xc5,0x7f,0xf8,0x7, +0x3c,0xba,0xf0,0x2, 0x1e,0xc5,0x3f,0xe7,0xe3,0xff,0xc7,0xff,0xf0,0x0, 0x7f,0x6, +0x12,0x81,0xf0,0x0, 0x7e,0x7, 0x3b,0x6f,0xf8,0x40,0x3e,0x69,0x7f,0x85,0x12,0x0, +0xf0,0x1, 0x1d,0xff,0xf8,0x40,0x3f,0x6a,0xf8,0x40,0x3c,0xed,0x0, 0x92,0x14,0x1, +0xde,0x46,0xef,0xf9,0xd8,0x18,0x14,0x1, 0xef,0xf9,0xd8,0x66,0x66,0x82,0x17,0x81, +0x3e,0xf5,0x3f,0x95,0xc2,0x1, 0xe3,0xff,0xc7,0xff,0xe0,0x1, 0x5, 0xdf,0x3a,0xef, +0xf0,0x40,0x3d,0x64,0xf3,0xff,0xc5,0x7f,0xf8,0x40,0x3d,0x7c,0x3, 0xe9,0xe0,0x3, +0x1d,0xb8,0xe7,0xbf,0x16,0xff,0xf0,0x0, 0xa6,0x8b,0xe0,0x0, 0x15,0x68,0xe8,0x1, +0xa7,0xed,0xe0,0x1, 0x14,0xff,0x3f,0xdd,0xe8,0x1, 0xbf,0xed,0xf0,0x0, 0x14,0x0, +0x64,0x4, 0xe0,0x0, 0xdc,0x31,0x63,0x83,0x29,0x5, 0x0, 0xa6,0x39,0x79,0xc3,0x82, +0x5, 0xa3,0xe8,0x40,0x3c,0x68,0x3c,0xe3,0xe0,0x0, 0xdb,0xb9,0xf0,0x0, 0xc4,0x1, +0x3c,0x74,0xe8,0x40,0x3c,0xe8,0xe3,0xff,0xc4,0xff,0x1, 0xf1,0x9f,0x7, 0x67,0x81, +0xc7,0x4, 0xe0,0x8, 0x37,0x5, 0x34,0x22,0x3c,0x1f,0xf0,0x1a,0xa3,0x28,0xe0,0x41, +0x3f,0xe, 0x15,0x81,0xe0,0xe, 0x35,0xbe,0xf3,0xe, 0x3b,0x5e,0x39,0x79,0xe0,0x1a, +0xbf,0x28,0xc3,0x82,0x2, 0xdf,0x17,0x80,0x3f,0x6f,0xe3,0xff,0xc7,0x7f,0xe8,0x40, +0x3f,0x7a,0xe0,0x1, 0x1, 0x68,0xc7,0x81,0xe2,0x0, 0xcf,0x86,0x1, 0xf6,0xe8,0x1, +0xa7,0xed,0x14,0x1, 0xe0,0x40,0xcf,0x80,0xe8,0x1, 0xbf,0xed,0xdd,0xe0,0xef,0xf9, +0xd7,0xb2,0x14,0x1, 0xef,0xf9,0xd8,0x0, 0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x25,0x30, +0xe8,0x40,0x3f,0x65,0xe0,0x0, 0x15,0x0, 0xf0,0x0, 0x27,0x1f,0xe0,0xc, 0x17,0xd2, +0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1,0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99, +0x9c,0xf, 0xf0,0x0, 0x9b,0x9, 0xc5,0x1, 0xf0,0x40,0x3b,0x78,0xe8,0xe, 0x3f,0x1c, +0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f,0x5, 0x84,0x9f,0x8f,0xe0,0x0, 0xb7,0x89, +0xe8,0x40,0x3d,0x7e,0x1, 0xe4,0xf2,0x0, 0xca,0x85,0xe0,0x1, 0x5, 0x95,0xf0,0x0, +0xc2,0x81,0xf3,0xff,0xc2,0xff,0xf8,0x40,0x3a,0xfa,0x1, 0xd3,0xf0,0x40,0x3e,0x75, +0xf0,0x40,0x3b,0x65,0xe7,0xfe,0x5, 0xe4,0xe8,0x40,0x3f,0x66,0xe0,0x0, 0x15,0x0, +0xf0,0x0, 0x27,0x1e,0xe0,0xc, 0x17,0xd2,0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1, +0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99,0x9c,0xf, 0xf0,0x0, 0x9b,0x89,0xc5,0x1, +0xf0,0x40,0x3b,0xf8,0xe8,0xe, 0x3f,0x1c,0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f, +0x5, 0x83,0x9f,0x8f,0xb7,0x89,0xe8,0x40,0x3d,0x7e,0x1, 0xe5,0xf2,0x0, 0xcb,0x5, +0x2, 0x94,0xe8,0xf, 0x3b,0x16,0xe3,0xff,0xc7,0xff,0xe0,0xc, 0x17,0x52,0x3f,0x1f, +0x37,0x21,0x37,0xa1,0xe8,0xe, 0x3f,0x1b,0xe8,0xf, 0x3f,0x99,0x9d,0xe, 0x9c,0x8f, +0x3c,0xfa,0x5, 0x83,0x9f,0xe, 0xb7,0xf, 0xf0,0x0, 0xc3,0x1, 0xf3,0xff,0xc3,0x7f, +0xf8,0x40,0x3b,0x7c,0x1, 0xc2,0x66,0x82,0x17,0x81,0x3e,0xf5,0x3f,0x95,0xc2,0x1, +0xe3,0xff,0xc7,0xff,0xe7,0xfe,0x2, 0xa5,0xf0,0x0, 0x67,0x6, 0xf0,0x0, 0x66,0x7, +0xf8,0x40,0x3e,0xe9,0xe0,0x2, 0x1f,0xc5,0xe8,0x80,0x97,0x1e,0x9e,0x8f,0x3f,0x7d, +0x3, 0x2, 0xb7,0xf, 0xf8,0x40,0x3f,0x7c,0xc7,0x82,0x1, 0xf7,0xe0,0x2, 0x1f,0x93, +0x17,0x0, 0xe0,0x2, 0x1e,0xa5,0xe0,0x2, 0xaf,0xf, 0x14,0x0, 0xe0,0x1, 0xaf,0x7f, +0xf0,0x0, 0xbe,0x8d,0xdd,0x3c,0xe0,0x2, 0x1f,0x48,0x8c,0xe, 0xef,0xf9,0xd5,0xc8, +0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0xc0,0x1c, +0xf8,0x0, 0xf, 0x28,0xb, 0xa1,0xe7,0x34,0x0, 0xe2,0x8e,0x9f,0xe0,0x2, 0x1f,0x78, +0x89,0xbf,0x7e,0x85,0x99,0x6f,0x8e,0xf, 0x8e,0xaf,0x7f,0x3, 0x3f,0xe3,0x67,0x5, +0xe7,0xfb,0x0, 0x83,0x67,0x85,0xe0,0xc, 0x17,0x52,0xe8,0xf, 0x3f,0x95,0xe3,0xff, +0xc7,0xff,0x3f,0x1f,0x37,0x21,0x37,0xa1,0xe8,0xe, 0x3f,0x1b,0xe8,0xf, 0x3f,0x99, +0x9d,0xe, 0x9c,0x8f,0x3c,0xfa,0xe7,0xfe,0x5, 0xdc,0x9f,0xe, 0xb7,0xf, 0xe7,0xfe, +0x0, 0xd8,0x17,0x1e,0xf2,0x0, 0xcd,0x2, 0x3f,0x2f,0x16,0x81,0xe0,0xe, 0x36,0xbe, +0x2, 0x8a,0x65,0x81,0xe0,0x1a,0xa5,0x2b,0xe3,0xe, 0x3d,0x5e,0xe0,0x1a,0xbf,0x2b, +0xe7,0xfe,0x0, 0x8b,0x66,0x81,0x17,0x1d,0xe0,0x1d,0xa5,0x3d,0x3f,0x2f,0x15,0x81, +0xe0,0xe, 0x35,0xbe,0xe3,0xe, 0x3d,0x5e,0xe0,0x1d,0xbf,0x3d,0xe7,0xfd,0x0, 0xfd, +0xe0,0x3, 0x1f,0xb8,0x16,0x80,0xa6,0xf, 0xe0,0x1, 0xa7,0x6c,0x37,0x4d,0xe2,0x0, +0xc7,0x1, 0x24,0x85,0xc4,0xff,0xe0,0x7, 0x16,0xff,0x3e,0xd9,0xe0,0x1, 0xa5,0xec, +0xe7,0xbf,0x17,0xff,0x3d,0xdf,0xe0,0x1, 0xbd,0xec,0xe4,0x7, 0xc4,0x30,0xe0,0x0, +0x1d,0xc4,0xe4,0xd, 0x36,0xa0,0xa5,0x8b,0x37,0x2d,0x3c,0x1b,0xa5,0x8, 0xe0,0x3, +0x1d,0xd8,0x3d,0xda,0x3e,0xcb,0xbe,0x88,0xe0,0x1, 0xa6,0xec,0x3f,0xdd,0x3f,0xce, +0xe0,0x1, 0xbf,0xec,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f, +0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, +0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0x88,0xe2,0x0, 0xc4,0x8f, +0xe0,0xd, 0x34,0xab,0xe7,0xf, 0x14,0xff,0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe2,0x40, +0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, +0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, +0xbe,0xef,0x3c,0x1b,0xa5,0x88,0xe2,0x0, 0xc4,0x81,0xe0,0xd, 0x34,0xaa,0xe7,0xf7, +0x14,0xff,0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xe2,0x0, +0xc4,0x81,0xa5,0x88,0xe4,0xd, 0x34,0xac,0xe0,0x3, 0x1c,0xd9,0xe2,0x0, 0xc5,0x3, +0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe4,0xd, 0x35,0x2a,0xa4,0x88,0xe0,0x3, 0x1d,0xda, +0xe2,0x40,0xc7,0x0, 0xe0,0xa, 0x3c,0xdb,0x3d,0x4d,0xbd,0x8, 0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0xff,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0x6f, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0x5d,0xe0,0x1, 0xbe,0x6f,0x3c,0x1b,0xa5,0xa8, +0xe7,0xf0,0x16,0x0, 0x3e,0x5b,0xe2,0xf, 0xc4,0xff,0x3c,0xcc,0xbc,0xa8,0xe2,0x40, +0xc7,0x0, 0xe0,0x1, 0xa6,0x6f,0x3e,0xdc,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, +0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, +0xbe,0xef,0x3c,0x1b,0xe2,0xf, 0xc4,0xff,0xa5,0xb8,0xe4,0xd, 0x34,0xa0,0xe0,0x3, +0x1c,0xdb,0xe2,0x40,0xc7,0x0, 0x3c,0xdb,0x3c,0xcd,0xbc,0xb8,0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0xe8, +0xe2,0x0, 0xc4,0x87,0xe0,0xd, 0x34,0xa6,0xe7,0xfc,0x14,0xbf,0x3c,0xdb,0x3c,0xcd, +0xbc,0xe8,0xe2,0x0, 0xc5,0xf, 0xa4,0xe8,0x15,0xc3,0xe0,0xd, 0x35,0x22,0xe0,0xa, +0x3c,0xdb,0x3d,0x4d,0xbd,0x68,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d, +0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x1f,0xc4,0x7f, +0xa7,0xf, 0xe7,0xe0,0x17,0x80,0xe0,0x4, 0xa6,0x8e,0x3f,0xdd,0x3c,0x4f,0xe0,0x4, +0xbc,0xe, 0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa7,0x8f,0x17,0x7b, +0xe0,0x1, 0xa6,0x6f,0xe0,0xd, 0x34,0x22,0x3f,0x5c,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f, +0x17,0x7d,0xe0,0x1, 0xa6,0xef,0x34,0x21,0x3f,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x6f, +0xe2,0x0, 0xc4,0x8f,0xe0,0x2, 0xa6,0x3f,0xe7,0xfe,0x17,0xf, 0xe0,0xd, 0x34,0xa4, +0x3f,0x5c,0x3f,0x4d,0xe0,0x2, 0xbf,0x3f,0x17,0x70,0xe0,0x2, 0xa6,0xbf,0x3f,0x5d, +0x3c,0xce,0xe0,0x2, 0xbc,0xbf,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, +0xa7,0xf, 0xe7,0xdf,0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, 0x34,0x2c,0xe0,0x8, +0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe7,0xf0,0x17,0x80,0xe0,0x2, 0xa6,0xce, +0xe2,0xf, 0xc4,0xff,0x3f,0xdd,0x3c,0xcf,0xe0,0x2, 0xbc,0xce,0x38,0x82,0xe0,0x3, +0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xef,0x16,0xff,0xe0,0x1, 0xa6,0x6e, +0xe0,0xf, 0x34,0x2b,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe0,0x4, +0xb4,0xde,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f, +0xc4,0x7f,0xe0,0x3, 0xa6,0x8f,0x3f,0x5d,0x3c,0x4e,0xe0,0x3, 0xbc,0xf, 0xe0,0x6, +0xb4,0xbf,0xe0,0x6, 0xb5,0x5f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, +0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x3, 0xa6,0xbf,0x3f,0x5d,0x3c,0x4e,0xe0,0x3, +0xbc,0x3f,0xe0,0x7, 0xb4,0x9f,0xe0,0x7, 0xb5,0x3f,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe7,0xbf,0x15,0x7f,0xa7,0x8f,0xe0,0xb, 0x34,0x46,0xe0,0x1, 0xa6,0xef,0xe0,0x1, +0xa7,0x6f,0x35,0xa2,0x3f,0x5a,0xe0,0x1, 0xbf,0x6f,0x17,0x73,0xe0,0x2, 0xa6,0x6f, +0xe2,0x40,0xc6,0x80,0x3e,0x5e,0x3e,0x4b,0xe0,0x2, 0xbe,0x6f,0xe0,0xb, 0x34,0x26, +0xe0,0x2, 0xa6,0x6f,0xe7,0xe7,0x17,0x7f,0xe2,0x18,0xc5,0x80,0x3e,0x5e,0x3e,0x4b, +0xe0,0x2, 0xbe,0x6f,0x34,0x42,0xe0,0x2, 0xa5,0xef,0x17,0x3, 0x16,0x7c,0x3f,0x58, +0xe0,0x8, 0x3d,0xdc,0x3c,0x4e,0xe0,0x2, 0xbc,0x6f,0xe0,0x1, 0xa7,0x6f,0x3f,0x5a, +0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1f,0x44, +0xa6,0x8f,0xe7,0xbf,0x15,0xff,0xe0,0x1, 0xa6,0x6d,0xe0,0x1, 0xa7,0xed,0xa7,0xe, +0xe4,0x7, 0xc4,0x30,0x3f,0xdb,0xe0,0x1, 0xbf,0xed,0x3c,0x1e,0xa5,0x28,0xe0,0xe, +0x34,0xc2,0xe0,0x3, 0x1f,0xdc,0xe2,0x0, 0xc7,0x3, 0xe4,0xe, 0x37,0x2d,0x3f,0xda, +0x3f,0xce,0xbf,0xa8,0xe0,0xe, 0x34,0xc6,0xa5,0x28,0xe0,0x3, 0x1f,0xdd,0xe4,0xe, +0x37,0x2b,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0x34,0xc4,0xa5,0x28,0xe0,0x3, 0x1f,0x5e, +0xe2,0x0, 0xc4,0x83,0xe4,0xf, 0x34,0xa9,0xe0,0x9, 0x3d,0x5e,0x3c,0xcf,0xbc,0xa8, +0xe2,0x40,0xc6,0x0, 0xe0,0x1, 0xa7,0xed,0x3d,0xdf,0x3e,0x4b,0xe0,0x1, 0xbe,0x6d, +0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1f,0x44,0xa6,0x8f,0xe7,0xbf,0x15,0xff, +0xe0,0x1, 0xa6,0x6d,0xe0,0x1, 0xa7,0xed,0xa7,0xe, 0xe4,0x7, 0xc4,0x30,0x3f,0xdb, +0xe0,0x1, 0xbf,0xed,0x3c,0x1e,0xa5,0x28,0xe0,0xe, 0x34,0xc2,0xe0,0x3, 0x1f,0xdf, +0xe2,0x0, 0xc7,0x3, 0xe4,0xe, 0x37,0x27,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0xe0,0xe, +0x34,0xc6,0xa5,0x28,0xe0,0x3, 0x1f,0xe0,0xe4,0xe, 0x37,0x25,0x3f,0xda,0x3f,0xce, +0xbf,0xa8,0x34,0xc4,0xa5,0x28,0xe0,0x3, 0x1f,0x61,0xe2,0x0, 0xc4,0x83,0xe4,0xf, +0x34,0xa3,0xe0,0x9, 0x3d,0x5e,0x3c,0xcf,0xbc,0xa8,0xe2,0x40,0xc6,0x0, 0xe0,0x1, +0xa7,0xed,0x3d,0xdf,0x3e,0x4b,0xe0,0x1, 0xbe,0x6d,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0x17,0x77,0xe0,0x1, 0xa6,0x6d,0xe0,0xf, 0x34,0x23, +0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xe0,0x1, 0xbc,0x6d,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xfb,0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, +0x34,0x29,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe2,0x0, 0xc4,0x81, +0xe0,0x1, 0xa6,0x6e,0xe7,0xf7,0x16,0xff,0xe0,0xf, 0x34,0xaa,0xe0,0x9, 0x3e,0x5d, +0x3c,0xcf,0xe0,0x1, 0xbc,0xee,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0xf, 0xe7,0xf8, +0x17,0x80,0xe0,0x1, 0xa6,0xfe,0x3f,0xdd,0x3c,0x4f,0xe0,0x1, 0xbc,0x7e,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x2, +0xa6,0x8f,0xe2,0x1f,0xc4,0xff,0x3e,0xde,0x3c,0x4d,0xe0,0x2, 0xbc,0xf, 0xe0,0x2, +0xa6,0x9f,0x3f,0x5d,0x3f,0x49,0xe0,0x2, 0xbf,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xa6,0x8f,0xa7,0x3d,0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0xe0,0x61,0x3e,0x2, 0xe7,0xfe, +0x17,0xff,0x3f,0xdc,0xe0,0x61,0x3f,0x92,0xa7,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x81, +0x27,0x85,0xa7,0x9d,0xe0,0x20,0xcf,0x80,0xbf,0x9d,0xe7,0xdf,0x17,0xff,0xa6,0x3d, +0x37,0x2c,0x3f,0xdc,0x3f,0xce,0xbf,0xbd,0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x61,0x3f,0x2, 0xe7,0xfe,0x17,0xff,0x3f,0xde, +0xe0,0x61,0x3f,0x92,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0xe7,0xdf, +0x17,0x7f,0xa6,0x3d,0xe0,0xf, 0x34,0x2c,0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xbc,0x3d, +0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x3, +0x1f,0xb8,0xf0,0x3, 0x1b,0x62,0xf0,0x0, 0xa2,0xf, 0xe7,0xbf,0x17,0xff,0xf8,0x1, +0xa1,0xe4,0xe8,0x1, 0xa7,0x64,0xf0,0x13,0x31,0xcd,0x3f,0xde,0xe8,0x1, 0xbf,0xe4, +0xf2,0x0, 0xc1,0x81,0x87,0x88,0xe8,0x1, 0xa6,0xd4,0xe2,0x0, 0xc7,0x87,0xe0,0xe, +0x37,0xac,0xe7,0x1f,0x17,0xff,0x3f,0xdd,0x3f,0xce,0xe0,0x0, 0x1f,0x44,0xf0,0x3, +0x1b,0xe3,0xf0,0x0, 0xa2,0x8e,0xe0,0x3, 0x1c,0xe4,0xe8,0x1, 0xbf,0xd4,0xf0,0x0, +0x10,0x80,0x15,0x78,0xe7,0xfe,0x15,0x87,0xe7,0xf7,0x16,0x7f,0xf0,0x0, 0x11,0x2, +0xf8,0x12,0x39,0x11,0xf0,0x10,0x30,0xa2,0xf0,0x12,0x31,0x21,0xf0,0x12,0x39,0x18, +0xf8,0x10,0x38,0x16,0xe8,0x0, 0xa7,0x0, 0xe8,0x0, 0x8f,0x82,0x3f,0x5a,0x37,0xc5, +0x3f,0x4f,0xe8,0x0, 0xbf,0x0, 0xe4,0x7, 0xc7,0xb0,0xe8,0x0, 0x86,0x82,0xe8,0x0, +0xa7,0x0, 0xe2,0x0, 0xc6,0x9f,0x36,0xa3,0x3f,0x5b,0x3f,0x4d,0xe8,0x0, 0xbf,0x0, +0xe8,0xf, 0x3f,0x95,0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc6,0xe2,0x0, 0xc6,0x81, +0xe4,0xd, 0x36,0xac,0xe8,0xe, 0x3f,0x57,0x3f,0x4d,0xbf,0xf, 0xf0,0x0, 0xc0,0x81, +0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc3,0xe2,0x0, 0xc6,0x83,0xe4,0xd, 0x36,0xaa, +0x3f,0x59,0x3f,0x4d,0xbf,0xf, 0xf2,0x1, 0xc0,0xff,0xe8,0x0, 0x8e,0x92,0xa7,0xf, +0x36,0xc7,0x36,0xaa,0x3f,0x5c,0x3f,0x4d,0xbf,0xf, 0x8f,0x88,0xe8,0x40,0x3f,0xf1, +0xe7,0xff,0x3, 0xb6,0xe8,0x1, 0xa7,0x64,0xe7,0xbf,0x17,0xff,0xf0,0x13,0x31,0xad, +0x3f,0xde,0xf0,0x13,0x39,0xcf,0xf8,0x1, 0xb9,0xe4,0x38,0x82,0xe0,0x0, 0x1f,0x99, +0x17,0x1, 0xaf,0xf, 0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0xb3,0xa7,0x8f,0xaf,0xd, +0x17,0x7d,0xa6,0xdf,0x3f,0x5d,0xbf,0x5f,0xa7,0x5f,0xcf,0x4, 0xbf,0x5f,0x38,0x82, +0xe0,0x0, 0x1f,0x19,0x17,0x81,0xaf,0x8e,0xe0,0x2, 0x1f,0x33,0xaf,0x8e,0xe0,0x0, +0x1f,0x10,0xaf,0x8e,0x38,0x82,0x8, 0xb2,0x39,0x68,0x15,0x4, 0xe1,0xf, 0x14,0x0, +0x3c,0xe2,0xd0,0xac,0xa7,0x82,0xa7,0x2, 0xa4,0x2, 0x37,0xc5,0xe4,0xe, 0x37,0x45, +0xe2,0x0, 0xc7,0x7, 0xea,0x2, 0xc4,0x0, 0xe2,0x0, 0xc7,0x88,0x3f,0xce,0xe4,0x8, +0x34,0x48,0x3c,0x1f,0x9, 0x61,0xe0,0x3, 0x1e,0xb8,0xe0,0x2, 0x1e,0x68,0xa6,0x8d, +0xa7,0xc, 0xa7,0x8c,0xa6,0xcd,0xe2,0x0, 0xc6,0x81,0x26,0xab,0x37,0x48,0xe4,0xf, +0x37,0xc5,0xe2,0x0, 0xc7,0x1, 0xa6,0x8c,0x37,0x23,0xe2,0x0, 0xc7,0x87,0x3f,0xce, +0xea,0x2, 0xcf,0x0, 0x3f,0x5d,0x16,0x85,0xe0,0x2f,0x3f,0x9d,0xe4,0xe, 0x37,0x48, +0x27,0x98,0x27,0x17,0x8, 0xb4,0x11,0x0, 0xe0,0x23,0x3c,0x2, 0x3a,0x69,0x14,0x9, +0x3c,0xe3,0xd0,0x55,0x14,0x9, 0xd0,0x35,0x39,0xf8,0x14,0x5, 0x1, 0xc, 0xc1,0x1, +0xef,0xfa,0xd1,0x48,0xe3,0xff,0xc1,0x7f,0x3a,0x72,0x3, 0xf5,0x14,0x0, 0xa, 0x61, +0x14,0x0, 0x38,0x82,0x14,0x1, 0xa, 0x61,0xe0,0x0, 0x1f,0x99,0x8c,0xf, 0x8f,0xf, +0x27,0x1f,0xe0,0x3, 0x1f,0x38,0x16,0x80,0xa5,0x8e,0xe0,0x0, 0x1f,0x10,0xae,0x8e, +0xa6,0x5b,0xe0,0x1, 0x1f,0x5c,0xce,0x1, 0xa7,0xe, 0xbe,0x5b,0xe0,0x1, 0xa6,0x6e, +0xe0,0x4, 0xce,0x0, 0xe0,0x1, 0xbe,0x6e,0xe7,0xfb,0x16,0x7f,0xe0,0x1, 0xa5,0xee, +0x3e,0x5b,0xe0,0x1, 0xbe,0x6e,0xae,0x8f,0xe0,0x2, 0x1f,0xb3,0xae,0x8f,0x38,0x82, +0x8, 0xb3,0xe0,0x3, 0x1f,0xb8,0x39,0xe8,0xa7,0x8f,0x14,0x0, 0xa1,0x3f,0xde,0xc4, +0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x31,0xa7,0x8f,0xa6,0x8e,0xa7,0x1f,0x31,0x4c, +0xcf,0x10,0xbf,0x1f,0xe2,0x0, 0xc1,0x1, 0xb1,0xdd,0x3c,0x62,0x89,0x7d,0xa6,0x9f, +0x17,0x6f,0x3f,0x5d,0xbf,0x1f,0xde,0xb0,0x3c,0x62,0x9, 0xe1,0x8, 0xb4,0xe0,0x3, +0x1f,0xb8,0x3a,0x68,0xa7,0x8f,0x14,0x0, 0xa1,0x3f,0x39,0xe9,0xde,0xa5,0xe0,0x2, +0x1f,0x91,0xe0,0x3, 0x1f,0x31,0xa7,0x8f,0xa6,0x8e,0xa7,0x1f,0x31,0x4c,0xcf,0x10, +0xbf,0x1f,0xe2,0x0, 0xc1,0x1, 0xb2,0x5d,0x17,0x6f,0xa9,0xbd,0x3c,0x62,0xa6,0x9f, +0x3f,0x5d,0xbf,0x1f,0xa, 0x21,0xe7,0xfd,0x0, 0x90,0x8, 0xb5,0xe0,0x3, 0x1f,0xb8, +0x39,0x68,0xa7,0x8f,0x14,0x0, 0xa7,0xbf,0x12,0x81,0x37,0xcc,0x3a,0xdf,0x39,0xe9, +0x3a,0x6a,0xde,0x82,0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xa7,0x9d,0xcf,0x90,0xbf,0x9d, +0x22,0x13,0xe0,0x3, 0x1f,0xb1,0xe0,0xa, 0x39,0x14,0x14,0xff,0xa7,0x8f,0x3c,0x93, +0xe3,0xff,0xc5,0x7f,0xb1,0x5f,0xc1,0x1, 0x8f,0x7f,0xe3,0xff,0xc1,0x7f,0x39,0x7a, +0xe0,0x80,0xaf,0x19,0x1, 0xf8,0xa7,0x1d,0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d, +0xa, 0xa1,0xe7,0xfc,0x0, 0xe2,0x8, 0xb5,0xe0,0x3, 0x1f,0xb8,0x39,0x68,0xa7,0x8f, +0x14,0x0, 0xa7,0xbf,0x12,0x81,0x37,0xcc,0x3a,0xdf,0x39,0xe9,0x3a,0x6a,0xde,0x54, +0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xa7,0x9d,0xcf,0x90,0xbf,0x9d,0x22,0x15,0xe0,0x3, +0x1f,0xb1,0xe0,0xa, 0x39,0x14,0x14,0xff,0xa7,0x8f,0x3c,0x93,0xe3,0xff,0xc5,0x7f, +0x17,0x1, 0x3f,0x12,0xb1,0x5f,0x39,0x6e,0xe3,0xff,0xc1,0x7f,0xe0,0x80,0x87,0x19, +0x39,0x7a,0xaf,0x3f,0x1, 0xf6,0xa7,0x1d,0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d, +0xa, 0xa1,0xe7,0xfc,0x0, 0xb2,0x0, 0x0, 0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x3, +0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28,0xe0,0x40,0xce,0x80,0xbe,0x9f,0x16,0xa1, +0xb6,0xbe,0x3c,0x98,0xe0,0x6, 0xb4,0xbe,0xe0,0x2, 0xb5,0x5e,0xe7,0xbf,0x17,0x7f, +0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x3, +0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28,0xe0,0x40,0xce,0x80,0xbe,0x9f,0x3c,0x98, +0x35,0x28,0xe0,0x7, 0xb4,0xfe,0x3d,0x9a,0xe0,0x8, 0xb5,0x9e,0xe0,0x7, 0xb6,0x5e, +0xe7,0xbf,0x17,0x7f,0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0x83, +0xe0,0x0, 0x1d,0x95,0xa7,0xf, 0x8e,0xb, 0x9f,0x9e,0x16,0x80,0xcf,0x81,0x3c,0x4f, +0xb4,0x1e,0x0, 0x85,0x9f,0x9e,0xe2,0x0, 0xc7,0x88,0x2f,0x8e,0xe0,0x7, 0x97,0x9e, +0xe2,0x0, 0xcf,0x80,0x3, 0x78,0x2e,0x8e,0x9f,0x9e,0xe0,0x80,0xcf,0x80,0xb7,0x9e, +0x17,0x80,0xb7,0x9e,0x38,0x82,0x9f,0x9e,0x16,0x1, 0xcf,0x84,0xb7,0x9e,0x3e,0xec, +0x0, 0xee,0xae,0xb, 0x0, 0xf2,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x16,0x0, 0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8, +0x96,0xd8,0xb6,0xde,0x96,0xf8,0xb6,0xfe,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9e, +0xe0,0x0, 0x1e,0x95,0xae,0xd, 0x8e,0x88,0x8e,0x18,0x36,0xa8,0x3e,0x9c,0xe0,0x1, +0xb6,0xde,0x96,0xa8,0xe0,0x1, 0x9c,0x28,0xe0,0x9, 0xb6,0xde,0x8e,0xaf,0xe0,0x1, +0xb6,0xfe,0x87,0xbf,0xe2,0x0, 0xc7,0x81,0xe4,0xf, 0x37,0xa8,0xe4,0xf, 0x37,0xc0, +0xb7,0x9e,0xdf,0xad,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92, +0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe0,0x0, 0x14,0x40,0x96,0xde,0xb6,0xdf, +0xe0,0x1, 0x96,0x9e,0xe0,0x1, 0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c, +0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, 0xb6,0xdf,0x8f,0x2e,0xe0,0x1, 0xb7,0x7f, +0x17,0x0, 0xe0,0x1, 0xb4,0xbf,0xb7,0x1f,0xdf,0x82,0xa7,0x12,0xe7,0xbf,0x17,0xff, +0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb4,0xe0,0x2, 0x1f,0x91,0x39,0xe9,0xa2,0xf, +0xe0,0x3, 0x1f,0x83,0xa7,0x14,0xa1,0xf, 0xe0,0x40,0xcf,0x0, 0xbf,0x14,0x3f,0xe8, +0xa7,0x14,0xe0,0x1, 0x14,0x20,0xe0,0x40,0xcf,0x0, 0xbf,0x14,0x97,0x3f,0xb7,0x52, +0x97,0x7f,0xb7,0x72,0x97,0x5f,0xe0,0x1, 0xb7,0x12,0x8f,0x1f,0x8e,0x8f,0x37,0x28, +0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f,0xe0,0x1, 0xb7,0x32,0x17,0x0, 0xe0,0x9, +0xb7,0x52,0xe0,0x1, 0x97,0xf, 0xe0,0x1, 0xb7,0x72,0xe0,0x1, 0x97,0x1f,0xe0,0x2, +0xb7,0x12,0xe0,0x1, 0x97,0x2f,0xe0,0x2, 0xb7,0x32,0xe0,0x1, 0x97,0x3f,0xe0,0x6, +0xb7,0x12,0x8f,0xbf,0x37,0xa8,0xb7,0x92,0xdf,0x42,0xe0,0x3, 0x9f,0xb2,0xaf,0x83, +0xe0,0x3, 0x9f,0xd2,0xaf,0x93,0xe0,0x2, 0x9d,0x72,0xe0,0x3, 0x9d,0x92,0xe0,0x4, +0x9e,0x32,0xe0,0x4, 0x9e,0xd2,0xe0,0x3, 0x9f,0x72,0xe0,0x4, 0x9f,0x92,0xb5,0x13, +0xb7,0xe3,0xe7,0xbf,0x17,0xff,0xb5,0xa3,0xb6,0x33,0xb6,0xc3,0xb7,0x53,0xa7,0x14, +0x3f,0xde,0xbf,0x94,0xa, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, 0xe0,0x3, +0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xdf, +0xe0,0x1, 0x14,0x40,0xb6,0xde,0x96,0xff,0xe0,0x1, 0xb6,0x9e,0x8e,0xbf,0x8e,0x2f, +0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x8e,0x9f,0x8e,0xf, 0x36,0xa8,0x3e,0x9c, +0xe0,0x1, 0xb6,0xbe,0x8e,0xcf,0xe0,0x1, 0xb6,0xfe,0x16,0x80,0xe0,0x9, 0xb6,0xde, +0x87,0xdf,0xe2,0x0, 0xc7,0x83,0x37,0xa8,0xb7,0x9e,0xde,0xf9,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3e,0xe8, +0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa7,0x12,0xa7,0x8f,0xe0,0x40,0xcf,0x0, 0xbf,0x12, +0x16,0x0, 0x97,0x38,0xb7,0x5f,0x97,0x58,0xb7,0x7f,0x97,0x78,0xe0,0x0, 0x14,0x60, +0xe0,0x1, 0xb7,0x1f,0x8f,0xd, 0x8e,0x9d,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x5f, +0xe0,0x9, 0xb6,0x5f,0xb6,0x1f,0xde,0xd3,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0x8, 0xb5,0x8f,0x8, 0x8f,0x98,0x39,0x68,0xa4,0x38,0x3f,0x7f, +0x34,0x21,0xe0,0x6f,0x3b,0xae,0xe0,0x1, 0x14,0xff,0xe0,0x1, 0x15,0x72,0xe8,0x0, +0xc4,0x2, 0x3a,0xef,0xd4,0xe8,0xe0,0x2, 0x1f,0x91,0x17,0x0, 0xa1,0x8f,0xe0,0x3, +0x1f,0x83,0xe0,0x0, 0x14,0x60,0xa2,0xf, 0xa7,0x93,0xe2,0x1, 0xc2,0xff,0xe0,0x40, +0xcf,0x80,0xbf,0x93,0x97,0xb2,0xb7,0xd4,0x97,0xd2,0xb7,0xf4,0x97,0xf2,0xe0,0x1, +0xb7,0x94,0x8f,0x82,0x8e,0x92,0x37,0xa8,0x3f,0x9d,0xe0,0x1, 0xb7,0xd4,0xe0,0x9, +0xb7,0x54,0xb7,0x14,0xde,0x9c,0x87,0x2, 0xa4,0xb2,0x3f,0xee,0xe2,0x1, 0xc7,0xff, +0x27,0xa8,0xe0,0xb, 0x34,0xa1,0x87,0x92,0x15,0x0, 0xe8,0x0, 0xc5,0x82,0x3e,0xef, +0xe2,0x1, 0xc6,0xff,0x26,0x96,0x16,0xb, 0x3e,0x3a,0x17,0x0, 0xe0,0xf, 0x3f,0x1c, +0x37,0xa1,0x3f,0x9b,0x96,0x8f,0xc7,0x1, 0xe0,0x41,0x3e,0x8d,0xb6,0x8f,0xe2,0x1, +0xc7,0x7f,0x87,0x92,0x3e,0xef,0xe2,0x1, 0xc6,0xff,0x3e,0xfe,0x2, 0xf0,0x87,0x2, +0xc5,0x1, 0x3e,0xee,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc6,0xff,0x3e,0xfa,0x2, 0xe0, +0xe4,0x2, 0xc2,0x81,0xb4,0xd4,0x17,0x80,0xe0,0x1, 0xb2,0xd4,0xe0,0x1, 0x14,0x50, +0xb7,0x94,0xde,0x65,0xa5,0x32,0x17,0x0, 0x15,0xf0,0x3f,0xee,0x35,0x21,0x0, 0x92, +0xe2,0x0, 0xcf,0x87,0x2, 0xb2,0xe0,0x5, 0x9e,0x14,0x36,0x1b,0xe2,0x0, 0xc6,0xf, +0xb6,0xd, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8b,0xc7,0x2, 0xc5,0x84, +0x1, 0x1e,0xe2,0x0, 0xcf,0x83,0xe0,0xd, 0x3f,0x1a,0xe8,0x0, 0xc6,0x82,0x2, 0xe9, +0xe0,0x4, 0x9e,0x74,0xe0,0xd, 0x37,0x21,0xc7,0x81,0xe0,0x9, 0x3f,0x1a,0xe0,0xd, +0x36,0x1d,0xe2,0x1, 0xc7,0xff,0xea,0x0, 0xce,0x2, 0x3e,0x19,0xe2,0x0, 0xc6,0x8f, +0xe2,0x0, 0xcf,0x8b,0xb6,0x8c,0xc7,0x2, 0xc5,0x84,0x1, 0xe4,0xa7,0x13,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x93,0xa, 0xe1,0xe0,0x5, 0x9e,0xb4,0x14,0xf0,0x3c,0x9b, +0xe0,0xc, 0x3f,0x1a,0x36,0x99,0xe8,0x0, 0xc6,0x2, 0xe2,0x0, 0xc6,0x8f,0xb6,0x8c, +0x0, 0xc9,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83, +0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe7,0xbf,0x16,0x7f,0x96,0xd8, +0xb6,0xdf,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x14,0x60,0xe0,0x1, +0xb6,0x9f,0x8e,0x8e,0x8d,0x9e,0x36,0xa8,0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xae, +0xe0,0x9, 0xb6,0xdf,0x8e,0xae,0xe0,0x1, 0xb6,0xff,0xe0,0x7, 0x9e,0x9f,0x3e,0xdc, +0xe0,0x7, 0xb6,0x9f,0x8f,0x3e,0xe0,0x7, 0x9e,0x9f,0x37,0x2d,0x3f,0x4d,0xe0,0x7, +0xb7,0x1f,0x9f,0x1f,0x3e,0x5e,0xb6,0x1f,0xdd,0xea,0xa7,0x12,0xe7,0xbf,0x17,0xff, +0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe0,0x1, +0x14,0x60,0x96,0xde,0xb6,0xdf,0x96,0xfe,0xb6,0xff,0xe0,0x1, 0x96,0x9e,0xe0,0x1, +0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae, +0xe0,0x9, 0xb6,0xdf,0x8f,0x2e,0xe0,0x1, 0xb7,0x7f,0x9f,0x1f,0xe0,0x40,0xcf,0x0, +0xb7,0x1f,0xdd,0xbd,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92, +0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0x16,0x0, 0x96,0xd8,0x34,0xa8,0xb6,0xdf, +0x3d,0x49,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9f,0x8e,0x88, +0x8d,0x98,0x36,0xa8,0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xa8,0x14,0x30,0xe0,0x9, +0xb6,0xdf,0xe0,0x7, 0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8f,0x3e, +0xe0,0x7, 0x9e,0x9f,0x37,0x2e,0x3f,0x4d,0xe0,0x7, 0xb7,0x1f,0xe0,0x1, 0xb6,0x7f, +0xe0,0x2, 0xb5,0x1f,0xe0,0x1, 0x9f,0x7f,0xe0,0x1, 0xcf,0x3, 0xe0,0x1, 0xb7,0x7f, +0xe0,0x1, 0xb6,0x3f,0xb6,0x1f,0xdd,0x7b,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, +0x1f,0x83,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0x15,0x80,0x96,0xd8, +0xb6,0xdf,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0x14,0x30,0xe0,0x1, 0xb6,0x9f, +0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, +0xb6,0xdf,0xe0,0x7, 0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8e,0xbe, +0xe0,0x7, 0x9e,0x1f,0x36,0xae,0x3e,0xcc,0xe0,0x7, 0xb6,0x9f,0xe0,0x1, 0xb5,0xff, +0xe0,0x2, 0xb4,0x9f,0xe0,0x1, 0x9e,0xff,0xe0,0x1, 0xce,0x83,0xe0,0x1, 0xb6,0xff, +0xe0,0x1, 0xb5,0xbf,0xe0,0x2, 0x8f,0x7e,0x9e,0x9f,0x37,0x2a,0x3f,0x4d,0xb7,0x1f, +0xdd,0x36,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2, +0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0x8f, +0xe0,0x40,0xce,0x80,0xbe,0x92,0x14,0x0, 0x96,0xde,0xb6,0xdf,0xe0,0x1, 0x96,0x9e, +0xe0,0x1, 0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf, +0x96,0xae,0xe0,0x9, 0xb6,0xdf,0xe0,0x1, 0xb4,0xff,0xe0,0x2, 0xb5,0x1f,0xe0,0x2, +0x8e,0x7e,0xe0,0x2, 0x8e,0xee,0x8f,0x3e,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0x28, +0x3f,0x4d,0xb7,0x1f,0x9f,0x1f,0xe1,0x0, 0xcf,0x0, 0xb7,0x1f,0xdd,0x0, 0xa7,0x12, +0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91, +0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92, +0x3f,0xe8,0x96,0xd8,0xb6,0xde,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28,0xe0,0x1, +0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xaf, +0xe0,0x9, 0xb6,0xde,0xe0,0x2, 0x8e,0x7f,0xe0,0x2, 0x8e,0xef,0x8f,0xbf,0x36,0x2a, +0x36,0xa9,0x3e,0xcc,0x37,0xa8,0x3f,0xcd,0xb7,0x9e,0x9f,0x9e,0xe1,0x0, 0xcf,0x80, +0xb7,0x9e,0xdc,0xcd,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, +0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xdf,0x14,0x30,0xb6,0xde,0x96,0xff, +0xb6,0xfe,0xe0,0x1, 0x96,0x9f,0xe0,0x1, 0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8, +0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xaf,0xe0,0x9, 0xb6,0xde,0xe0,0x2, 0x8e,0x7f, +0xe0,0x2, 0x8e,0xef,0x8f,0xbf,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0xa8,0x3f,0xcd, +0xb7,0x9e,0x9f,0x9e,0xe1,0x0, 0xcf,0x80,0xb7,0x9e,0xdc,0x99,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0x3f,0x68, +0xa1,0x8f,0xe0,0x3, 0x1f,0x83,0xe0,0x0, 0x14,0x40,0xa1,0xf, 0xa7,0x93,0xe0,0x40, +0xcf,0x80,0xbf,0x93,0x97,0xde,0xb7,0xd2,0x8f,0x8e,0x8e,0x9e,0x37,0xa8,0x97,0x2e, +0x3f,0x9d,0xe0,0x1, 0xb7,0xd2,0x17,0x80,0xe0,0x9, 0xb7,0x52,0xe0,0x1, 0xb5,0x72, +0xe0,0x2, 0xb4,0x92,0xb7,0x92,0x9f,0x92,0xe1,0x0, 0xcf,0x80,0xb7,0x92,0xdc,0x6f, +0xe0,0x7, 0x9c,0x32,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1, +0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0x16,0x80,0xa1,0x8f,0xe0,0x3, 0x1f,0x83,0xa7,0x13, +0xa1,0xf, 0xe0,0x40,0xcf,0x0, 0xbf,0x13,0x3f,0xe8,0x97,0x58,0xb7,0x52,0x97,0x78, +0xb7,0x72,0xe0,0x1, 0x97,0x18,0x14,0x0, 0xe0,0x1, 0xb7,0x12,0xe0,0x0, 0x1f,0x15, +0xae,0x8e,0x8f,0xf, 0x8e,0x9f,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f, +0xe0,0x1, 0xb7,0x72,0x97,0x2f,0xe0,0x9, 0xb7,0x52,0x87,0xbf,0xe2,0x0, 0xc7,0x81, +0xe4,0xf, 0x37,0xa8,0xe4,0xf, 0x37,0xc0,0xb7,0x92,0xdc,0x39,0xe0,0x6, 0x9c,0x72, +0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1,0x8, 0xb3,0xe0,0x2, +0x1f,0x91,0xe2,0x0, 0xc5,0x3, 0xa1,0x8f,0xa7,0x93,0xe0,0x40,0xcf,0x80,0xbf,0x93, +0xe0,0x3, 0x1f,0x83,0xa1,0xf, 0x2d,0x17,0xe0,0x9, 0xb5,0x52,0x35,0xaa,0xb4,0x52, +0x35,0x28,0xe0,0x1, 0xb4,0xd2,0xe0,0x1, 0x14,0x10,0xb5,0x92,0x9f,0x92,0x3d,0x4f, +0xb5,0x12,0xdc,0x15,0xe0,0x5, 0x9c,0x52,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x93,0x9, 0xe1,0x17,0x82,0xe0,0x9, 0xb7,0xd2,0x0, 0xe9,0xe0,0x2, 0x1f,0x91, +0x34,0xa3,0xa6,0xf, 0xe0,0x3, 0x1f,0x83,0xf0,0x0, 0x1b,0x95,0xa7,0xf, 0xa7,0x9c, +0xa6,0x9c,0xe0,0x40,0xce,0x80,0xbe,0x9c,0x96,0xd8,0xe8,0x0, 0x8d,0x7, 0xe0,0x8, +0xb6,0xfe,0x96,0xf8,0xe0,0x9, 0xb6,0x9e,0xe0,0x1, 0x96,0x98,0xe0,0x9, 0xb6,0xbe, +0x8e,0xc8,0x8d,0xd8,0x36,0xa8,0x3e,0x9b,0xe0,0x8, 0xb6,0xbe,0xe0,0xd, 0x37,0xcd, +0x8f,0xe8,0x8d,0xf8,0x37,0xa8,0xe0,0x1, 0x94,0x28,0x3f,0x9b,0xe0,0x8, 0xb7,0xde, +0xe2,0x0, 0xc6,0x81,0xe0,0x9, 0xb4,0x5e,0x15,0x80,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe, +0xc7,0x80,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0x3c,0xcf,0xe0,0x7, 0xb4,0x9e, +0xe0,0x7, 0x9f,0x9e,0xcf,0x90,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xcf,0x81, +0xe0,0x7, 0xb7,0x9e,0x0, 0x86,0xe0,0x7, 0x9f,0x9e,0xe2,0x0, 0xc7,0xa0,0x2f,0x9a, +0xe0,0x7, 0x9f,0x9e,0xe2,0x1, 0xc7,0x80,0x27,0xf7,0x2d,0x9c,0xe0,0x7, 0x9f,0x9e, +0x36,0xad,0xcf,0x84,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe,0xc7,0x80, +0xe0,0x7, 0xb7,0x9e,0xe7,0xbf,0x17,0xff,0xa7,0x1c,0x3f,0xde,0x3f,0xcd,0xbf,0x9c, +0x38,0x82,0xe0,0x7, 0x9f,0x9e,0x15,0x1, 0xcf,0x82,0xe0,0x7, 0xb7,0x9e,0x3d,0xea, +0x0, 0xe0,0xe8,0x0, 0xad,0x7, 0x0, 0xe3,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8, +0x96,0xd8,0xb6,0xde,0x96,0xf8,0xb6,0xfe,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28, +0xe0,0x1, 0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x97,0xaf,0x3e,0x9c,0xe0,0x1, +0xb6,0xde,0xe0,0x9, 0xb7,0xde,0x17,0x80,0xb7,0x9e,0xdb,0x79,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0xe0,0x1, 0x1f,0xdc,0x14,0x3, 0xa7,0xf, +0xe0,0x1, 0xa7,0x8e,0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x2f,0x82,0x38,0x82,0xe0,0x1, +0xa4,0xe, 0x34,0x49,0xe2,0x0, 0xc4,0x1, 0x38,0x82,0xe0,0x2, 0x1f,0xf0,0xa7,0xf, +0xe0,0x1, 0x1f,0xdc,0xa6,0x8f,0x17,0x80,0xe0,0x1, 0xaf,0xbe,0xa7,0x9e,0xe2,0x0, +0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0xf7, +0xa6,0x9e,0x17,0xfe,0x3f,0xdd,0xbf,0x9e,0xe0,0x1, 0x8c,0x3e,0x38,0x82,0xe0,0x2, +0x1f,0xf0,0xa7,0xf, 0xe0,0x1, 0x1f,0xdc,0xe0,0x1, 0xac,0x3e,0xa6,0x8f,0xa7,0x9e, +0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0xf7,0xa6,0x9e,0x17,0xfe,0x3f,0xdd,0xbf,0x9e,0x38,0x82,0x24,0xa6,0x17,0xff, +0xe0,0x2, 0x1f,0x70,0xe0,0x1, 0x1e,0xdc,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f, +0xa7,0xe, 0xa6,0x8d,0x3e,0x18,0xe0,0xb, 0x3c,0x1f,0x14,0x80,0x15,0x7e,0xe0,0x1, +0xac,0xbe,0xa7,0x9e,0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1, +0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa7,0x9e,0x3f,0xda,0xbf,0x9e,0xe0,0x1, 0x8f,0xbe, +0xe0,0x80,0xaf,0x9c,0x3e,0x7b,0x1, 0xec,0x38,0x82,0x24,0xa3,0x17,0xff,0xe0,0x2, +0x1f,0x70,0xe0,0x1, 0x1e,0xdc,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f,0xa7,0xe, +0xa6,0x8d,0x3e,0x18,0xe0,0xb, 0x3c,0x1f,0x15,0x7e,0xe0,0x80,0x87,0x9c,0xe0,0x1, +0xaf,0xbe,0xa7,0x9e,0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1, +0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa7,0x9e,0x3e,0x7b,0x3f,0xda,0xbf,0x9e,0x1, 0xee, +0x38,0x82,0xe0,0x2, 0x1f,0xf0,0x17,0x1, 0xa7,0x8f,0x3f,0x58,0xa5,0xbf,0x16,0xfb, +0xe0,0xc, 0x37,0x22,0x3e,0xdb,0x3e,0xcc,0xbe,0xbf,0x15,0xef,0xa6,0xbf,0xe0,0xc, +0x37,0x24,0x3e,0xdb,0x3e,0xcc,0xbe,0xbf,0x16,0xf7,0xa5,0xf, 0xe0,0xc, 0x37,0x23, +0x3e,0xda,0x3e,0xcc,0xbe,0x8f,0x16,0xfe,0xa6,0x3f,0x3e,0xdc,0x3f,0x4d,0xbf,0x3f, +0xe0,0x2, 0x1f,0x66,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0xc, 0x2f,0xa, 0xa6,0x8f, +0xe0,0x2e,0x3c,0xe, 0xe0,0x8, 0x37,0x24,0xe0,0xe, 0x3e,0xdb,0x3f,0x48,0xbf,0xf, +0x38,0x82,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x24,0x7, 0xa6,0x8f,0xe7,0xfe,0x17,0x7f, +0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe7,0xff, +0x17,0x3f,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x70,0x97,0x88, +0xa6,0x8e,0xe2,0xff,0xc7,0xff,0xe0,0x1, 0xb7,0x9d,0x97,0x98,0xe2,0x7f,0xc7,0xff, +0xe0,0x1, 0xb7,0xbd,0x17,0xf7,0x9f,0x8, 0xa6,0x3d,0x37,0x4f,0x37,0x23,0x3f,0xdc, +0x3f,0xce,0xbf,0xbd,0x17,0xfc,0x9f,0x18,0xa6,0x6d,0x37,0x4e,0x3f,0xdc,0x3f,0xce, +0xbf,0xed,0x38,0x82,0xe0,0x2, 0x1e,0x94,0xe0,0x2, 0x1f,0x70,0x87,0xcd,0xa7,0xe, +0xcf,0x82,0xaf,0xcd,0xa7,0xbe,0xcf,0x82,0xbf,0xbe,0x38,0x82,0xe0,0x2, 0x1f,0x14, +0x9f,0xae,0x37,0xc9,0xe2,0x0, 0xc7,0x81,0x2f,0xfc,0x38,0x82,0xe0,0xd, 0x3c,0x49, +0xe2,0x0, 0xce,0x8f,0x3f,0xe8,0x3f,0x69,0x2, 0x8a,0xea,0x4f,0x7c,0x9c,0xe9,0xff, +0xc4,0xff,0x3c,0x9e,0x37,0xa4,0x3f,0x99,0x8c,0xf, 0x38,0x82,0x8, 0xb2,0xe2,0x0, +0xcc,0x0, 0x3, 0x17,0xe2,0x0, 0xcc,0x80,0xe0,0x41,0x3f,0xc8,0x3, 0xb, 0x11,0x1, +0x15,0x0, 0xe0,0x41,0x3c,0xce,0x3c,0x6f,0xd0,0x27,0x29,0x3, 0xe0,0x41,0x3c,0x48, +0x9, 0x61,0x15,0x0, 0x3c,0x6f,0xd0,0x20,0x0, 0xfa,0x15,0x0, 0x9, 0x21,0x0, 0x9c, +0xe2,0x0, 0xcc,0x80,0x3, 0x7b,0x11,0x0, 0x0, 0xec,0x8, 0xb2,0xe2,0x0, 0xcc,0x0, +0x3, 0xf, 0xe0,0x41,0x3c,0x48,0x11,0x1, 0xe2,0x0, 0xcc,0x80,0x3, 0x3, 0xe0,0x41, +0x3c,0xc9,0x15,0x1, 0xd0,0x9, 0x21,0x3, 0xe0,0x41,0x3c,0x48,0x9, 0x61,0x11,0x0, +0x0, 0xf4,0x15,0x0, 0x0, 0x81,0x17,0x81,0x17,0x0, 0xe1,0x2d,0x3c,0x19,0x26,0x84, +0xe1,0x2d,0x3f,0x8e,0x2e,0x88,0x17,0x0, 0x2f,0x8c,0xe2,0x0, 0xcd,0x0, 0xe0,0x68, +0x39,0x2e,0x38,0x82,0xe2,0x0, 0xcc,0x80,0x4, 0x77,0x34,0xa1,0x37,0xa1,0x0, 0xee, +0x3c,0x79,0x4, 0x83,0x3c,0x29,0x3f,0x4f,0x37,0xc1,0x34,0xc1,0x0, 0xee,0x0, 0x0, +0x3d,0xe8,0xe2,0x0, 0xcd,0x3, 0x5, 0xad,0xe0,0xc, 0x3c,0x49,0xe2,0x0, 0xc6,0x3, +0x2e,0x28,0xc5,0x7c,0xe0,0xc, 0x35,0x21,0xe2,0x0, 0xc6,0x18,0xe1,0x80,0xa7,0x99, +0x26,0x8, 0xea,0x0, 0xce,0x81,0xe0,0x7e,0xce,0xe4,0x3e,0xac,0x3f,0x6f,0x3e,0x82, +0xc5,0x70,0x6, 0x93,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99, +0xe1,0x80,0xbf,0x1b,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99, +0xc5,0x70,0xe1,0x80,0xbf,0x1b,0x6, 0x6f,0xe1,0x80,0xbf,0x9b,0xe2,0x0, 0xc5,0x3, +0xc5,0x7f,0x6, 0x87,0xe1,0x80,0x86,0x19,0xc5,0x7f,0xe1,0x80,0xae,0x1b,0x6, 0x7b, +0x38,0x82,0x0, 0x0, 0xe2,0x0, 0xcd,0x3, 0x5, 0xb1,0xe2,0x1, 0xc4,0xff,0xe0,0xc, +0x34,0xa8,0x3c,0xcc,0xe4,0xc, 0x34,0xa0,0x3c,0xcc,0xe0,0x41,0x3e,0x48,0xe2,0x0, +0xc6,0x3, 0xe0,0xb, 0x3e,0x18,0xe0,0xd, 0x3d,0x2c,0x3e,0x6d,0xe2,0x0, 0xc6,0xc, +0x26,0x7, 0xea,0x0, 0xcf,0x81,0xe0,0x7f,0xcf,0xd4,0x3f,0xac,0x3f,0x82,0xe1,0xff, +0xc6,0xf0,0x6, 0x8b,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b, +0xc6,0xf0,0xe1,0x80,0xbc,0x9b,0x6, 0x77,0x3d,0x18,0xe0,0xc0,0xac,0xba,0xac,0x9a, +0xac,0xaa,0xac,0x88,0xac,0x98,0xac,0xa8,0x38,0x82,0x3d,0xe8,0xc5,0x7f,0x6, 0x85, +0xe1,0x80,0xac,0x9b,0xc5,0x7f,0x6, 0x7d,0x38,0x82,0xe0,0x3, 0x1f,0x8b,0xbc,0xf, +0x38,0x82,0xe0,0x3, 0x1f,0xb, 0xe0,0x3, 0x1c,0x65,0xa7,0x8e,0x3f,0xb8,0xe0,0x3, +0x1c,0x66,0x3f,0x98,0xe0,0x3, 0x1c,0x67,0xbf,0x8e,0x3c,0x5f,0x38,0x82,0x8, 0xb1, +0xe0,0x60,0x3c,0x87,0xea,0x24,0x7f,0xf8,0xe0,0x0, 0x15,0x60,0x3c,0x6f,0xdf,0x71, +0xe0,0x60,0x3c,0x17,0x8, 0xe1,0x0, 0x0, 0x0, 0x0, 0x16,0x98,0x0, 0x0, 0x16,0x56, +0x0, 0x0, 0x15,0xdc,0x0, 0x0, 0x16,0x56,0x0, 0x0, 0x16,0x4c,0x0, 0x0, 0x16,0xba, +0x0, 0x0, 0x16,0xb0,0x0, 0x0, 0x15,0xe0,0x0, 0x0, 0x16,0xb0,0x0, 0x0, 0x16,0x4c, +0x0, 0x0, 0x2d,0xee,0x0, 0x0, 0x2d,0xf6,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8, +0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8, +0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xfc,0x0, 0x0, 0x2e,0xc, +0x0, 0x0, 0x2e,0x1c,0x0, 0x0, 0x2e,0x1c,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x30,0x86,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x70, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x54,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x3c, +0x0, 0x0, 0x30,0x2e,0x0, 0x0, 0x30,0x2e,0x0, 0x0, 0x30,0x20,0x0, 0x0, 0x30,0x20, +0x0, 0x0, 0x30,0x20,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xe, 0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xc8,0x0, 0x0, 0x30,0xc8, +0x0, 0x0, 0x30,0xc8,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x33,0xe, 0x0, 0x0, 0x30,0xba, +0x0, 0x0, 0x30,0xac,0x0, 0x0, 0x30,0x0, 0x0, 0x0, 0x2f,0xf2,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xd8,0x80,0x0, 0xd, 0x0, 0x80,0x0, 0xb, 0x0, +0x80,0x0, 0xa, 0x0, 0x80,0x0, 0x7, 0x0, 0x80,0x0, 0x5, 0x0, 0x80,0x0, 0x4, 0x0, +0x80,0x0, 0x3, 0x0, 0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x1, 0x0, 0x80,0x0, 0x0, 0x0, +0x80,0x1, 0x20,0x0, 0x0, 0x3, 0x86,0x60,0x0, 0x3, 0x80,0x0, 0x80,0x1, 0x40,0x0, +0x80,0x1, 0x10,0x0, 0x80,0x0, 0x6, 0x0, 0x80,0x0, 0x8, 0x0, 0x50,0x1, 0x32,0x2, +0x0, 0x3, 0xf0,0x4, 0xce,0x5, 0x9c,0x6, 0x84,0x7, 0x81,0x8, 0x0, 0x2, 0x1, 0x0, +0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, +0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0xeb,0xaa,0x8, 0x0, +0x0, 0x3, 0x6, 0xa8,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x3, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x4, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x0, 0x0, 0x0, 0x0, 0xd, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x0, 0x0, 0x0, 0xe, 0x7, 0x4, 0x3, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x0, 0x0, 0xf, 0x7, 0x5, 0x3, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0xff,0x40,0x0, 0x0, 0x0, 0x2, 0x2e,0x70,0x2, 0x0, 0x0, 0x0, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x34,0x33,0x35,0x33,0x31,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x12,0x0, 0x20, +0x0, 0x12,0x20,0x12,0x20,0x0, 0x0, 0x2, 0x40,0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, +0x1b,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, +0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, 0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, +0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, 0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, +0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, 0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, +0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, 0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, +0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, 0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, +0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, 0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, +0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, 0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, +0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, 0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, +0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, 0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, +0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, 0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, +0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, 0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, +0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, 0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, +0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, 0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, +0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, 0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, +0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, 0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, +0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, 0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, +0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, 0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, +0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, 0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, +0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, 0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, +0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, 0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, +0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, 0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, +0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, 0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, +0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, 0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, +0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, 0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, +0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, 0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, +0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, 0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, +0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, 0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, +0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, 0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, +0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, 0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, +0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, 0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, +0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, 0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, +0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, 0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, +0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, 0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, +0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, 0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, +0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, 0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, +0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, 0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, +0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, 0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, +0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, 0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, +0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, 0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, +0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, 0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, +0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, 0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, +0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, 0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, +0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, 0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, +0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, 0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, +0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, 0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, +0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, 0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, +0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, +0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, 0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, +0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, +0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, +0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, +0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, +0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, +0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, +0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, +0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, +0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, +0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, +0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, +0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, 0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, +0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, +0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, +0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, +0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, +0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, +0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, +0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, +0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, +0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, +0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, +0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, +0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, +0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, 0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, +0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, 0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, +0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, 0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, +0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, 0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, +0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, 0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, +0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, 0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, +0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, 0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, +0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, 0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, +0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, 0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, +0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, 0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, +0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, 0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, +0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, 0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, +0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, 0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, +0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, 0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, +0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, 0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, +0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, 0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, +0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, 0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, +0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, 0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, +0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, 0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, +0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, 0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, +0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, 0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, +0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, 0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, +0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, 0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, +0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, 0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, +0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, 0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, +0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, 0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, +0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, 0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, +0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, 0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, +0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, 0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, +0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, 0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, +0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, 0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, +0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, 0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, +0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, 0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, +0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, 0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, +0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, 0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, +0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, 0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, +0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, 0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, +0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, 0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, +0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, 0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, +0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, 0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, +0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, 0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, +0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, 0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, +0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, 0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, +0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, 0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, +0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, 0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, +0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, 0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, +0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, +0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, 0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, +0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, +0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, +0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, +0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, +0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, +0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, +0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, +0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, +0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, +0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, +0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, +0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, 0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, +0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, +0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, +0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, +0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, +0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, +0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, +0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, +0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, +0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, +0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, +0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, +0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,0x3, 0x5, 0x0, 0xd, 0x17,0x3, +0x5, 0x1, 0xe, 0x17,0x3, 0x5, 0x2, 0x10,0x2, 0x1, 0xa, 0x1e,0x24,0x14,0x0, 0x64, +0xd, 0xac,0x0, 0xc8,0x1, 0x4, 0x0, 0x87,0x0, 0xd2,0x1, 0xf4,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x2c,0xa, 0x0, 0x2, 0x56,0x1, 0x5, 0xc, 0x1e,0x3c,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x6, 0x1, 0x0, 0x1, 0x80,0x1, 0x0, 0x14,0x1, 0xda,0x0, 0x1, 0x0, 0x16,0x1, +0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0xeb,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1d,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x3, 0x3, 0x0, 0xff,0xff,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1, 0xc8,0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x2, 0x40,0x4, 0x0, 0x2, 0xd5,0x1, 0x68,0x28,0x28,0x1, 0x9a,0x1, +0xb8,0x0, 0xa0,0x0, 0xa2,0x5, 0xa0,0x2, 0xd0,0x2e,0x2e,0x1, 0x98,0x1, 0x7a,0x0, +0xb4,0x0, 0xb4,0x12,0x0, 0xb4,0x1, 0x68,0x2, 0x1c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa8,0x1, 0x2c, +0x0, 0x48,0x0, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2, 0x4, 0x4, 0x6, 0x80,0x0, 0x64,0x7, +0xd0,0x8, 0x5, 0x6, 0x1, 0x2c,0x2, 0x58,0x1, 0x90,0x1f,0x40,0x23,0x1, 0x86,0x1, +0x86,0x0, 0xc, 0x17,0x11,0x12,0x1, 0x2c,0x1, 0x4, 0x4, 0x10,0x2, 0x8, 0x3, 0xa, +0xa, 0x0, 0x50,0x2, 0x85,0x0, 0x50,0x5, 0x50,0x0, 0x32,0x1, 0x5e,0x1, 0x5e,0x3, +0x20,0x0, 0xc8,0x0, 0x28,0x0, 0x1e,0x0, 0x80,0x0, 0xb5,0x2, 0xd0,0x0, 0x3c,0x3, +0xe8,0x1, 0x68,0x1, 0x6a,0x0, 0x3c,0x3, 0xe8,0x0, 0x20,0x2, 0xb5,0x0, 0x0, 0x5, +0xa0,0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88,0x1, 0x2c,0x0, 0x0, 0x2, 0x3f,0x0, +0x1, 0x4, 0x0, 0x5, 0x0, 0x20,0x1, 0x0, 0x0, 0x5c,0x5c,0x0, 0x5c,0x5c,0x0, 0x5c, +0x5c,0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7f,0xff,0x1, 0x1, 0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x64,0xff,0xff,0xff, +0x30,0x0, 0x0, 0x0, 0x40,0x33,0x2d,0x24,0x1e,0x18,0x10,0xa, 0xa, 0xe, 0x15,0x1e, +0x24,0x2b,0x32,0x35,0x2f,0x28,0x22,0x1a,0x13,0xa, 0x3, 0x0, 0x1, 0x4, 0xa, 0x12, +0x1b,0x25,0x2c,0x31,0x9, 0x0, 0x0, 0x2, 0x4, 0x8, 0xf, 0x19,0x20,0x27,0x2b,0x2d, +0x2e,0x2e,0x2e,0x2c,0x2c,0x2d,0x2e,0x32,0x35,0x3b,0x43,0x4d,0x56,0x5d,0x62,0x67, +0x6a,0x6d,0x6e,0x70,0xda,0xe1,0xff,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10, +0xc, 0x8, 0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d, +0x22,0x26,0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10, +0x16,0x1b,0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b, +0x4a,0x48,0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x40,0x39,0x34,0x2f, +0x2a,0x24,0x20,0x1b,0x15,0x10,0xb, 0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3, +0x4, 0x7, 0xa, 0xc, 0x10,0x15,0x19,0x1d,0x22,0x28,0x2d,0x31,0x4, 0x0, 0x0, 0x0, +0x1, 0x4, 0x6, 0x9, 0xd, 0x11,0x16,0x1b,0x21,0x27,0x2c,0x30,0x35,0x3c,0x42,0x46, +0x4a,0x51,0x57,0x5b,0x60,0x63,0x65,0x64,0x61,0x5d,0x59,0x56,0x89,0x65,0x34,0x55, +0x0, 0x3, 0x4, 0x6, 0x7, 0x9, 0x9, 0xb, 0xd, 0xf, 0x13,0x16,0x19,0x1d,0x20,0x22, +0x26,0x29,0x2b,0x2b,0x2d,0x2e,0x30,0x31,0x33,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f, +0x13,0x19,0x1e,0x22,0x26,0x29,0x2c,0x31,0x35,0x39,0x3c,0x3e,0x3f,0x3e,0x3b,0x38, +0x35,0x32,0x2f,0x2c,0x28,0x24,0x20,0x1c,0x19,0x16,0x12,0xe, 0xa, 0x6, 0x3, 0x1, +0x97,0xae,0xff,0x55,0x14,0x1a,0x1f,0x25,0x2a,0x2d,0x2d,0x28,0x24,0x1f,0x1b,0x17, +0x12,0xe, 0xc, 0xa, 0x8, 0x8, 0x8, 0x8, 0xa, 0xe, 0x13,0x17,0x1b,0x20,0x26,0x2c, +0x32,0x36,0x3c,0x3d,0x2c,0x2b,0x2a,0x27,0x24,0x21,0x1c,0x1a,0x1a,0x1c,0x1e,0x20, +0x25,0x2a,0x2e,0x32,0x37,0x3b,0x3f,0x43,0x47,0x4c,0x50,0x51,0x53,0x54,0x55,0x56, +0x57,0x57,0x57,0x57,0xdd,0x4, 0x33,0x55,0xe, 0x15,0x1b,0x21,0x26,0x2a,0x30,0x36, +0x3a,0x3d,0x3e,0x3d,0x3a,0x36,0x32,0x2d,0x28,0x1c,0x16,0x10,0xa, 0x6, 0x3, 0x1, +0x0, 0x0, 0x3, 0xa, 0x15,0x29,0x39,0x39,0x37,0x35,0x32,0x2f,0x2c,0x29,0x24,0x1e, +0x18,0x12,0xd, 0x9, 0x5, 0x1, 0x0, 0x0, 0x0, 0x5, 0x9, 0xe, 0x14,0x1c,0x24,0x2c, +0x35,0x3e,0x45,0x4a,0x4b,0x45,0x3f,0x3f,0xf3,0x41,0x33,0x55,0xa, 0x12,0x1a,0x1e, +0x23,0x26,0x25,0x1f,0x1b,0x12,0xa, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, 0x2, 0x6, 0x11, +0x19,0x1d,0x26,0x31,0x36,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x33,0x2c,0x23,0x1e, +0x16,0xe, 0x9, 0x1, 0x1, 0x6, 0x11,0x16,0x1f,0x25,0x2e,0x39,0x3e,0x46,0x49,0x48, +0x43,0x3f,0x35,0x2a,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa2,0x28,0x33,0x55, +0x3, 0xb, 0x10,0x15,0x1a,0x1e,0x21,0x27,0x29,0x28,0x25,0x20,0x1b,0xe, 0x9, 0x7, +0x5, 0x3, 0x1, 0x0, 0x0, 0x1, 0x3, 0x5, 0x9, 0x16,0x1f,0x29,0x33,0x36,0x36,0x36, +0x22,0x20,0x1f,0x1e,0x1b,0x18,0x15,0xc, 0x7, 0x2, 0x0, 0x0, 0x2, 0xb, 0x10,0x14, +0x18,0x1c,0x21,0x2b,0x2f,0x33,0x37,0x3b,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3b,0x3b, +0x6, 0x43,0x33,0x55,0x4, 0xc, 0x13,0x1a,0x20,0x26,0x2c,0x32,0x34,0x31,0x2b,0x24, +0x1b,0x14,0xd, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, 0x2, 0x7, 0xe, 0x16,0x1d,0x23,0x29, +0x30,0x36,0x3d,0x3e,0x1b,0x1c,0x1d,0x1d,0x1d,0x1c,0x1a,0x16,0x10,0x9, 0x3, 0x0, +0x0, 0x3, 0xa, 0x12,0x19,0x1f,0x25,0x2c,0x32,0x39,0x3f,0x44,0x47,0x48,0x47,0x46, +0x43,0x3f,0x3b,0x3a,0x7c,0x49,0x33,0x55,0xb, 0x14,0x1b,0x23,0x2e,0x34,0x38,0x39, +0x36,0x32,0x2b,0x24,0x18,0x12,0xd, 0x9, 0x4, 0x2, 0x0, 0x0, 0x2, 0x6, 0xd, 0x13, +0x1f,0x25,0x2c,0x33,0x3e,0x3f,0x3f,0x3f,0x24,0x26,0x26,0x26,0x25,0x22,0x1d,0x16, +0xb, 0x5, 0x2, 0x0, 0x2, 0x6, 0xc, 0x13,0x1d,0x23,0x29,0x2f,0x3a,0x40,0x45,0x47, +0x49,0x49,0x48,0x46,0x42,0x41,0x41,0x41,0xd3,0x80,0x33,0x55,0x0, 0x8, 0x10,0x16, +0x1d,0x23,0x2b,0x30,0x32,0x32,0x30,0x2c,0x26,0x1e,0x18,0x11,0xb, 0x9, 0x6, 0x5, +0x4, 0x4, 0x6, 0xa, 0x11,0x19,0x21,0x28,0x2f,0x36,0x3c,0x3f,0x1f,0x21,0x22,0x22, +0x21,0x20,0x1d,0x18,0x12,0xc, 0x6, 0x2, 0x0, 0x0, 0x3, 0x9, 0x12,0x19,0x20,0x26, +0x2c,0x34,0x3b,0x41,0x45,0x48,0x49,0x48,0x46,0x42,0x3e,0x3c,0xdb,0x35,0x33,0x55, +0x4, 0xb, 0x13,0x1b,0x23,0x2a,0x29,0x1f,0x16,0xe, 0x6, 0x2, 0x0, 0x0, 0x3, 0x7, +0x10,0x19,0x22,0x2b,0x33,0x38,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x2c,0x27,0x21,0x1b,0x15,0xd, 0x4, 0x0, 0x1, 0x5, 0xc, 0x14,0x1d,0x28,0x32,0x36, +0x3d,0x3f,0x3e,0x3c,0x36,0x2e,0x26,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0xb5,0x6c,0x33,0x55,0x17,0x1c,0x20,0x27,0x2b,0x30,0x39,0x3d,0x3f,0x3d,0x3a,0x35, +0x2b,0x25,0x20,0x17,0x13,0xe, 0x6, 0x3, 0x0, 0x0, 0x2, 0x9, 0xd, 0x11,0x19,0x1a, +0x1a,0x1a,0x1a,0x1a,0xa, 0x11,0x16,0x1d,0x20,0x23,0x23,0x1f,0x1a,0x10,0xb, 0x7, +0x1, 0x0, 0x0, 0x2, 0x4, 0x7, 0x10,0x16,0x21,0x26,0x2b,0x35,0x39,0x3c,0x3f,0x40, +0x40,0x40,0x40,0x40,0x68,0xc0,0x33,0x55,0xa, 0x10,0x1a,0x1e,0x26,0x2c,0x2d,0x2c, +0x29,0x20,0x15,0xf, 0x6, 0x3, 0x0, 0x0, 0x0, 0x3, 0x7, 0x10,0x1c,0x22,0x2d,0x37, +0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x2b,0x29,0x24,0x21,0x1a,0x12,0xe, 0x5, +0x2, 0x0, 0x1, 0x3, 0xb, 0x10,0x1a,0x25,0x29,0x32,0x36,0x3d,0x3f,0x3e,0x3a,0x33, +0x2e,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x1e,0x4d,0x33,0x55,0x0, 0x1, 0x3, 0x5, +0x6, 0x8, 0xb, 0xd, 0x11,0x13,0x16,0x16,0x1a,0x1f,0x21,0x24,0x26,0x28,0x2a,0x2f, +0x35,0x36,0x38,0x39,0x3a,0x3c,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x42,0x37,0x2d,0x23, +0x1d,0x12,0x7, 0x1, 0x9, 0x13,0x1f,0x25,0x31,0x3b,0x36,0x2c,0x20,0x1a,0xf, 0x2, +0x9, 0x11,0x20,0x2d,0x35,0x40,0x47,0x47,0x47,0x47,0x47,0x47,0xff,0x1f,0x32,0x55, +0x0, 0x0, 0x2, 0x3, 0x6, 0x9, 0xc, 0xf, 0x13,0x18,0x1c,0x1d,0x1e,0x1e,0x1e,0x1d, +0x1d,0x23,0x26,0x2a,0x2d,0x32,0x38,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3a,0x3a,0x3a, +0x40,0x35,0x2f,0x28,0x21,0x1a,0x13,0xd, 0x7, 0x1, 0x4, 0xb, 0x11,0x17,0x1d,0x24, +0x2b,0x2a,0x22,0x1c,0x15,0xf, 0x8, 0x3, 0x8, 0xf, 0x16,0x1d,0x23,0x29,0x31,0x32, +0xa5,0xf2,0x32,0x55,0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6, 0xe, 0x13,0x16,0x18, +0x1b,0x1e,0x1e,0x1e,0x1f,0x1f,0x21,0x24,0x2c,0x30,0x35,0x3a,0x3c,0x3f,0x3f,0x3f, +0x3f,0x3f,0x3f,0x3f,0x40,0x39,0x30,0x27,0x22,0x19,0x10,0xd, 0x13,0x1c,0x25,0x2a, +0x33,0x32,0x2d,0x23,0x18,0x12,0x9, 0x1, 0x3, 0x9, 0x13,0x1e,0x23,0x26,0x26,0x26, +0x26,0x26,0x26,0x26,0x7b,0x12,0x32,0x55,0x19,0x14,0x11,0xc, 0x9, 0x5, 0x2, 0x0, +0x4, 0x9, 0xd, 0x11,0x1b,0x20,0x22,0x23,0x23,0x23,0x26,0x27,0x2a,0x2d,0x30,0x37, +0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x10,0x1d,0x23,0x2e,0x36,0x3d, +0x35,0x27,0x1e,0x16,0xe, 0x14,0x21,0x28,0x34,0x39,0x30,0x29,0x1d,0x16,0x10,0x16, +0x1d,0x2c,0x34,0x3f,0x3f,0x3f,0x3f,0x3f,0xe1,0xb1,0x32,0x55,0xb, 0x6, 0x4, 0x2, +0x0, 0x0, 0x0, 0x1, 0x5, 0xf, 0x13,0x17,0x1b,0x1e,0x21,0x20,0x1d,0x19,0x17,0x16, +0x16,0x19,0x1e,0x23,0x28,0x31,0x35,0x39,0x3c,0x3f,0x3f,0x3f,0x40,0x3a,0x35,0x30, +0x2b,0x25,0x20,0x1b,0x17,0x16,0x1a,0x1e,0x23,0x27,0x2a,0x27,0x22,0x17,0x12,0xd, +0x8, 0x4, 0x1, 0x0, 0x0, 0x7, 0xb, 0xf, 0x13,0x15,0x15,0x15,0x4b,0xbb,0x32,0x55, +0x0, 0x3, 0x8, 0xa, 0x11,0x14,0x1c,0x20,0x24,0x25,0x25,0x24,0x23,0x25,0x27,0x2d, +0x30,0x36,0x3b,0x3f,0x3f,0x3f,0x3f,0x3e,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d, +0x29,0x22,0x18,0x12,0x8, 0x4, 0x0, 0x1, 0xc, 0x12,0x1c,0x22,0x2b,0x2a,0x24,0x18, +0x12,0xa, 0x8, 0xf, 0x14,0x1e,0x23,0x2e,0x34,0x3d,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e, +0xc6,0x28,0x32,0x55,0x1f,0x1b,0x17,0x14,0x13,0x12,0x11,0x11,0x12,0x14,0x1a,0x1d, +0x21,0x23,0x24,0x24,0x25,0x24,0x24,0x23,0x21,0x21,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1a,0x1d,0x23,0x29,0x2c,0x34,0x3b,0x3e,0x47,0x4e,0x53,0x51, +0x4b,0x44,0x42,0x3c,0x35,0x32,0x2c,0x25,0x1e,0x1c,0x19,0x19,0x19,0x19,0x19,0x19, +0x19,0x19,0x19,0x19,0xfa,0xf6,0x30,0x55,0x23,0x1e,0x1c,0x1a,0x18,0x17,0x16,0x15, +0x15,0x14,0x14,0x14,0x14,0x16,0x19,0x1d,0x21,0x25,0x28,0x2a,0x2b,0x2c,0x2d,0x2d, +0x2c,0x2b,0x2a,0x29,0x28,0x27,0x27,0x27,0x2f,0x36,0x3a,0x3e,0x43,0x48,0x4d,0x52, +0x56,0x5b,0x60,0x65,0x6a,0x6e,0x71,0x72,0x72,0x70,0x6c,0x67,0x62,0x5d,0x57,0x51, +0x4c,0x47,0x43,0x3e,0x38,0x34,0x31,0x31,0xe4,0xae,0x30,0x55,0x7, 0x5, 0x4, 0x4, +0x5, 0x6, 0xd, 0x14,0x1c,0x22,0x28,0x2f,0x34,0x37,0x39,0x3a,0x39,0x38,0x36,0x32, +0x2c,0x26,0x1a,0x14,0xe, 0xb, 0x8, 0x6, 0x6, 0x5, 0x5, 0x5, 0x33,0x3d,0x43,0x4b, +0x51,0x58,0x64,0x69,0x68,0x65,0x61,0x55,0x4d,0x43,0x3b,0x32,0x22,0x1a,0x13,0xb, +0x7, 0x5, 0x8, 0xf, 0x16,0x1e,0x24,0x30,0x37,0x3c,0x3c,0x3c,0x71,0x75,0x30,0x55, +0x3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7, 0xe, 0x1b,0x22,0x2d,0x32,0x37,0x3a,0x3c,0x3d, +0x3c,0x3a,0x38,0x34,0x29,0x21,0x15,0xc, 0x7, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x2a,0x34,0x3c,0x47,0x4d,0x59,0x60,0x66,0x67,0x66,0x5e,0x58,0x51,0x45,0x3e,0x30, +0x29,0x22,0x17,0xf, 0x5, 0x3, 0x6, 0xb, 0x11,0x1b,0x21,0x2d,0x2e,0x2e,0x2e,0x2e, +0x6a,0x73,0x30,0x55,0xc, 0x5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5, 0xc, 0x13,0x1e, +0x25,0x30,0x35,0x3b,0x3d,0x3f,0x3f,0x3d,0x3c,0x38,0x33,0x28,0x22,0x18,0x12,0xe, +0xd, 0xd, 0xd, 0xd, 0x11,0x19,0x1f,0x2a,0x30,0x3c,0x42,0x4f,0x55,0x5f,0x63,0x64, +0x61,0x59,0x51,0x44,0x3d,0x2e,0x26,0x1c,0x16,0xa, 0x3, 0x0, 0x0, 0x4, 0x8, 0xe, +0xf, 0xf, 0xf, 0xf, 0x7d,0xd0,0x30,0x55,0x15,0xd, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, +0x0, 0x1, 0x8, 0xf, 0x17,0x1f,0x2d,0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3e,0x3a,0x32, +0x2c,0x26,0x20,0x19,0xf, 0xc, 0xc, 0xc, 0x3, 0x9, 0xf, 0x17,0x1e,0x28,0x2e,0x35, +0x3b,0x42,0x50,0x56,0x57,0x56,0x50,0x49,0x41,0x39,0x31,0x25,0x1e,0x17,0xf, 0x5, +0x1, 0x0, 0x0, 0x1, 0x7, 0x9, 0x9, 0x9, 0xca,0xac,0x30,0x55,0x2c,0x23,0x1f,0x19, +0x13,0xc, 0x7, 0x3, 0x0, 0x0, 0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30, +0x36,0x3b,0x3e,0x40,0x3f,0x3e,0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, +0x3, 0x9, 0xe, 0x14,0x1b,0x21,0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a, +0x36,0x2f,0x2b,0x26,0x20,0x1c,0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55, +0x21,0x13,0xc, 0x8, 0x5, 0x2, 0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24, +0x2b,0x32,0x39,0x3d,0x3e,0x3f,0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13, +0x5, 0x9, 0xe, 0x14,0x1a,0x22,0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d, +0x49,0x42,0x39,0x31,0x2b,0x25,0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, +0xaf,0x13,0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, +0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b, +0x3c,0x3e,0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18, +0x1e,0x25,0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33, +0x2c,0x25,0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e,0x3f,0x3f, +0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x1, +0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29,0x22,0x1b, +0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c,0x24,0x2a, +0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, 0x4, 0x7, +0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b,0x38,0x31, +0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35,0x3d,0x45, +0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17,0x11,0x9, +0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6,0x30,0x55, +0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28,0x30,0x36,0x3b,0x3d,0x3f,0x3f, +0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, 0x0, 0x0, 0x1, 0x2, 0x3, 0x5, +0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d,0x52,0x4a,0x3e,0x35,0x2b,0x20, +0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19,0x22,0x2b,0x31,0x3a,0x42,0x47, +0xef,0xc9,0x30,0x55,0x37,0x38,0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, +0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3e,0x30,0x40,0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41, +0x39,0x33,0x2a,0x20,0x1a,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f, +0x25,0x2f,0x38,0x3c,0x37,0xc3,0x57,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c, +0x13,0xe, 0x8, 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31, +0x39,0x3d,0x3f,0x40,0x3f,0x3f,0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a, +0x66,0x63,0x5c,0x53,0x4a,0x40,0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, +0x9, 0x10,0x19,0x21,0x2a,0x32,0x39,0x3e,0x7, 0x90,0x57,0x55,0x18,0x2c,0x34,0x39, +0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, 0x6, 0x1, +0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, 0x8, 0xe, +0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58,0x51,0x48, +0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf,0x57,0x55, +0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28,0x30,0x38, +0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16,0xf, 0xc, +0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, +0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a,0x58,0x57, +0xc6,0x55,0x57,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38,0x3c,0x3e, +0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, 0x1, 0x0, +0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17, +0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57,0x4f,0x47, +0x40,0x38,0x32,0x2f,0x1a,0xb5,0x57,0x55,0x0, 0xb, 0x14,0x1b,0x21,0x28,0x2f,0x37, +0x3d,0x3f,0x3e,0x3c,0x39,0x33,0x2b,0x23,0x1c,0x15,0xc, 0x5, 0x3, 0x3, 0x6, 0x9, +0xd, 0x12,0x18,0x1e,0x24,0x2c,0x33,0x36,0x19,0x13,0x10,0x10,0xf, 0xf, 0x11,0x16, +0x1c,0x25,0x2d,0x33,0x39,0x40,0x47,0x4a,0x4c,0x4c,0x49,0x43,0x3b,0x33,0x2d,0x26, +0x20,0x1a,0x14,0xe, 0xa, 0x5, 0x1, 0x0, 0xb0,0xb5,0x57,0x55,0x2, 0x9, 0xf, 0x1a, +0x1f,0x29,0x2f,0x38,0x3b,0x3e,0x3f,0x3f,0x3b,0x37,0x2e,0x29,0x1e,0x18,0xe, 0xa, +0x3, 0x1, 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x3, +0x5, 0x9, 0xd, 0x18,0x1e,0x27,0x2d,0x32,0x3c,0x3f,0x45,0x46,0x45,0x44,0x3e,0x39, +0x2f,0x2a,0x25,0x1a,0x14,0xc, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x2b,0x77,0x57,0x55, +0x0, 0x1, 0x2, 0x4, 0x5, 0x8, 0xa, 0xf, 0x12,0x15,0x18,0x1a,0x1f,0x22,0x24,0x25, +0x26,0x26,0x28,0x2a,0x2c,0x2f,0x33,0x36,0x37,0x39,0x3a,0x3c,0x3e,0x3f,0x3f,0x3f, +0x1, 0xf, 0x1b,0x2d,0x3d,0x52,0x5f,0x6a,0x60,0x4a,0x39,0x2a,0x17,0xb, 0x4, 0xe, +0x1e,0x2e,0x42,0x50,0x62,0x6b,0x65,0x53,0x43,0x31,0x23,0x13,0x7, 0x2, 0x2, 0x2, +0xa2,0x22,0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x6, 0xa, 0xe, +0x12,0x15,0x18,0x1a,0x1e,0x21,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x29,0x2f,0x34, +0x3a,0x3e,0x3e,0x3e,0x1, 0xa, 0x11,0x17,0x1e,0x24,0x29,0x2e,0x34,0x34,0x2d,0x24, +0x1c,0x14,0xe, 0x8, 0x3, 0x9, 0x10,0x19,0x22,0x2a,0x31,0x36,0x3b,0x38,0x2f,0x24, +0x19,0x11,0x11,0x11,0x4c,0x9f,0x31,0x55,0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0xa, +0xc, 0x10,0x15,0x19,0x1b,0x1f,0x1e,0x1e,0x1d,0x1c,0x1c,0x1e,0x21,0x29,0x31,0x3a, +0x3e,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x14,0x1d,0x23,0x2d,0x34,0x2d, +0x29,0x1e,0x13,0xb, 0x6, 0x6, 0x10,0x19,0x1e,0x29,0x32,0x3c,0x3e,0x34,0x28,0x1b, +0x14,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xef,0x5, 0x31,0x55,0x0, 0x2, 0x4, 0x5, +0x6, 0x7, 0x9, 0xa, 0xd, 0xf, 0x11,0x12,0x14,0x16,0x19,0x1c,0x1f,0x22,0x24,0x24, +0x26,0x29,0x2f,0x31,0x33,0x35,0x37,0x39,0x3a,0x3c,0x3e,0x3e,0x6, 0x10,0x17,0x1d, +0x23,0x2a,0x31,0x39,0x3c,0x36,0x2f,0x28,0x21,0x1a,0x13,0x10,0x16,0x22,0x29,0x2f, +0x36,0x3d,0x3b,0x34,0x2e,0x27,0x21,0x1a,0x13,0xc, 0x4, 0x2, 0x56,0x3f,0x31,0x55, +0x0, 0x2, 0x5, 0x7, 0xa, 0xc, 0xe, 0x14,0x17,0x1b,0x1f,0x25,0x27,0x28,0x28,0x29, +0x29,0x2d,0x30,0x33,0x36,0x39,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x8, 0xf, 0x18,0x23,0x2d,0x37,0x40,0x41,0x3d,0x34,0x2b,0x24,0x2d,0x35,0x3e,0x47, +0x4a,0x42,0x38,0x2c,0x20,0x15,0xb, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0xf6,0x5, 0x31,0x55,0x0, 0x1, 0x3, 0x5, 0x6, 0x7, 0x9, 0xa, 0xc, 0xd, 0xf, 0x13, +0x14,0x15,0x18,0x1a,0x21,0x25,0x26,0x27,0x27,0x27,0x2c,0x2f,0x36,0x3a,0x3d,0x3f, +0x3f,0x3f,0x3f,0x3f,0x0, 0x6, 0xb, 0x14,0x1a,0x1f,0x29,0x2e,0x37,0x3b,0x3e,0x37, +0x32,0x2e,0x25,0x20,0x18,0x1c,0x21,0x29,0x2d,0x31,0x33,0x2d,0x21,0x1b,0x15,0x10, +0x10,0x10,0x10,0x10,0x22,0x55,0x31,0x55,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x7, +0xc, 0x10,0x13,0x16,0x19,0x1b,0x1f,0x22,0x22,0x23,0x23,0x23,0x23,0x26,0x2c,0x31, +0x34,0x36,0x38,0x3a,0x3b,0x3d,0x3f,0x3f,0xa, 0x12,0x1b,0x24,0x2d,0x34,0x3c,0x43, +0x42,0x3b,0x33,0x2b,0x22,0x1c,0x15,0x15,0x1b,0x26,0x2d,0x34,0x3a,0x41,0x41,0x3b, +0x33,0x2b,0x22,0x1a,0x11,0xa, 0x2, 0x1, 0xfa,0x31,0x31,0x55,0x2, 0x2, 0x1, 0x1, +0x0, 0x0, 0x0, 0x6, 0xa, 0x12,0x15,0x1b,0x1d,0x1f,0x1e,0x1e,0x1d,0x1d,0x1d,0x1f, +0x23,0x2a,0x2f,0x36,0x39,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x0, 0x8, 0xe, 0x19, +0x1e,0x29,0x2e,0x30,0x2d,0x23,0x1d,0x13,0xe, 0x13,0x17,0x21,0x25,0x30,0x35,0x3e, +0x3f,0x3a,0x35,0x2b,0x27,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xc8,0x46,0x31,0x55, +0x0, 0x3, 0x5, 0xc, 0x11,0x18,0x1c,0x1f,0x1f,0x1e,0x1e,0x1d,0x1d,0x23,0x26,0x2e, +0x32,0x3b,0x3d,0x3f,0x3f,0x3f,0x40,0x40,0x3f,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d, +0x1e,0x25,0x29,0x31,0x36,0x3d,0x3f,0x39,0x35,0x2c,0x27,0x1c,0x17,0x1b,0x1f,0x2a, +0x2f,0x37,0x34,0x2b,0x27,0x1f,0x1b,0x11,0xc, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x5, 0xb3,0x31,0x55,0x1e,0x0, 0x0, 0x0, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, +0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30, +0x32,0x34,0x36,0x38,0x3a,0x3c,0x1, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x62,0x33,0x0, 0x2, 0x62,0xac, +0x0, 0x2, 0x63,0xee,0x0, 0x2, 0x63,0xec,0x0, 0x2, 0x63,0xed,0x0, 0x2, 0x63,0xe5, +0x0, 0x2, 0x63,0xe4,0x0, 0x2, 0x63,0xe1,0x0, 0x2, 0x63,0xe0,0x0, 0x2, 0x63,0xd9, +0x0, 0x2, 0x62,0x30,0x0, 0x2, 0x63,0xd8,0x0, 0x2, 0x0, 0x8, 0x0, 0x2, 0x2d,0x4d, +0x0, 0x2, 0x24,0xb2,0x0, 0x2, 0x63,0xf0,0x0, 0x2, 0x65,0x98,0x0, 0x0, 0x62,0xd0, +0x0, 0x3, 0x11,0x64,0x0, 0x3, 0x9, 0x88,0x0, 0x3, 0x9, 0x60,0x0, 0x3, 0x9, 0x88, +0x0, 0x2, 0x2d,0x4e,0x0, 0x3, 0x6, 0x5c,0x0, 0x2, 0x2d,0x4c,0x0, 0x2, 0x3e,0xfa, +0x0, 0x2, 0x38,0xa8,0x0, 0x2, 0x32,0x58,0x0, 0x2, 0x38,0xaa,0x0, 0x3, 0x5, 0xe0, +0x0, 0x2, 0x24,0x6f,0x0, 0x2, 0x74,0xcc,0x0, 0x2, 0x74,0xdf,0x0, 0x2, 0x74,0xcb, +0x0, 0x2, 0x2e,0x60,0x0, 0x3, 0x5, 0xe2,0x0, 0x3, 0x6, 0x5d,0x0, 0x2, 0x25,0x1e, +0x0, 0x2, 0x25,0x20,0x0, 0x2, 0x24,0x7e,0x0, 0x2, 0x24,0x62,0x0, 0x3, 0x6, 0xc8, +0x0, 0x2, 0x24,0xc0,0x0, 0x2, 0x24,0x67,0x0, 0x1, 0x42,0xac,0x0, 0x2, 0x24,0xc1, +0x0, 0x2, 0x25,0x1a,0x0, 0x2, 0x5f,0xa0,0x0, 0x2, 0x24,0xb4,0x0, 0x3, 0x5, 0xe4, +0x0, 0x0, 0x63,0xa2,0x0, 0x0, 0x63,0x94,0x0, 0x2, 0x24,0xc7,0x0, 0x2, 0x4b,0xbc, +0x0, 0x2, 0x4b,0xbd,0x0, 0x1, 0x42,0xd4,0x0, 0x2, 0x5e,0xb4,0x0, 0x2, 0x24,0x6a, +0x0, 0x1, 0x42,0xbc,0x0, 0x2, 0x2c,0xc6,0x0, 0x2, 0x74,0xe0,0x0, 0x2, 0xe, 0x60, +0x0, 0x2, 0xe, 0x8f,0x0, 0x1, 0x42,0xb0,0x0, 0x3, 0xa, 0xf0,0x0, 0x1, 0x42,0xdc, +0x0, 0x3, 0x9, 0xc8,0x0, 0x2, 0xe, 0x7c,0x0, 0x2, 0xe, 0x90,0x0, 0x2, 0x3e,0xfc, +0x0, 0x0, 0x62,0xc4,0x0, 0x2, 0xe, 0x58,0x0, 0x2, 0x75,0x54,0x0, 0x2, 0x2e,0x62, +0x0, 0x2, 0x24,0x83,0x0, 0x2, 0x24,0xd3,0x0, 0x3, 0xa, 0x2c,0x0, 0x2, 0x2e,0x64, +0x0, 0x2, 0x2c,0xc4,0x0, 0x2, 0xe, 0xe, 0x0, 0x2, 0xe, 0xd, 0x0, 0x2, 0xe, 0x8, +0x0, 0x2, 0xe, 0xa, 0x0, 0x2, 0xe, 0x9, 0x0, 0x2, 0xd, 0xce,0x0, 0x2, 0xd, 0xcd, +0x0, 0x2, 0xd, 0xc6,0x0, 0x2, 0xd, 0xca,0x0, 0x2, 0xd, 0xc9,0x0, 0x2, 0xd, 0xcc, +0x0, 0x2, 0xd, 0xcb,0x0, 0x2, 0xd, 0xc4,0x0, 0x2, 0xd, 0xb2,0x0, 0x2, 0xd, 0xc3, +0x0, 0x2, 0xd, 0xb1,0x0, 0x2, 0xd, 0xc5,0x0, 0x2, 0xd, 0xc8,0x0, 0x2, 0xd, 0xc7, +0x0, 0x2, 0xd, 0xc0,0x0, 0x2, 0xd, 0xbf,0x0, 0x2, 0xd, 0xbc,0x0, 0x2, 0xd, 0xbb, +0x0, 0x2, 0xd, 0xb8,0x0, 0x2, 0xd, 0xbe,0x0, 0x2, 0xd, 0xbd,0x0, 0x2, 0xd, 0xb6, +0x0, 0x2, 0xd, 0xb0,0x0, 0x2, 0xd, 0xb5,0x0, 0x2, 0xd, 0xaf,0x0, 0x2, 0xd, 0xb7, +0x0, 0x2, 0xd, 0xba,0x0, 0x2, 0xd, 0xb9,0x0, 0x2, 0xe, 0x1a,0x0, 0x2, 0xe, 0x13, +0x0, 0x2, 0xe, 0x12,0x0, 0x2, 0xe, 0x11,0x0, 0x2, 0xe, 0x10,0x0, 0x2, 0xe, 0xf, +0x0, 0x2, 0xd, 0x43,0x0, 0x2, 0xd, 0x42,0x0, 0x2, 0xd, 0x3f,0x0, 0x2, 0xd, 0x3e, +0x0, 0x2, 0xd, 0x35,0x0, 0x2, 0xd, 0x34,0x0, 0x2, 0xd, 0x39,0x0, 0x2, 0xd, 0x37, +0x0, 0x2, 0xd, 0x38,0x0, 0x2, 0xd, 0x36,0x0, 0x2, 0xd, 0x3d,0x0, 0x2, 0xd, 0x33, +0x0, 0x2, 0xd, 0x3c,0x0, 0x2, 0xd, 0x32,0x0, 0x2, 0xd, 0x28,0x0, 0x2, 0xd, 0x31, +0x0, 0x2, 0xd, 0x30,0x0, 0x2, 0xd, 0x44,0x0, 0x2, 0x0, 0x79,0x0, 0x2, 0xe, 0x19, +0x0, 0x2, 0xe, 0x18,0x0, 0x2, 0xd, 0x26,0x0, 0x2, 0xd, 0xf0,0x0, 0x2, 0xd, 0xef, +0x0, 0x2, 0xd, 0xee,0x0, 0x2, 0xd, 0x2f,0x0, 0x2, 0xd, 0x2e,0x0, 0x2, 0xe, 0x36, +0x0, 0x2, 0xe, 0x35,0x0, 0x2, 0xe, 0x3a,0x0, 0x2, 0xe, 0x39,0x0, 0x2, 0xe, 0x3c, +0x0, 0x2, 0xe, 0x3b,0x0, 0x2, 0xe, 0x38,0x0, 0x2, 0xe, 0x37,0x0, 0x2, 0xe, 0x4e, +0x0, 0x2, 0xe, 0x4d,0x0, 0x2, 0xe, 0x42,0x0, 0x2, 0xe, 0x41,0x0, 0x2, 0xe, 0x43, +0x0, 0x2, 0xe, 0x44,0x0, 0x2, 0xe, 0x3e,0x0, 0x2, 0xe, 0x3d,0x0, 0x2, 0xe, 0x40, +0x0, 0x2, 0xe, 0x3f,0x0, 0x2, 0xe, 0x34,0x0, 0x2, 0xe, 0x32,0x0, 0x2, 0xe, 0x52, +0x0, 0x2, 0xe, 0x51,0x0, 0x2, 0xe, 0x50,0x0, 0x2, 0xe, 0x4f,0x0, 0x2, 0xe, 0x54, +0x0, 0x2, 0xe, 0x53,0x0, 0x2, 0xd, 0xc2,0x0, 0x2, 0xd, 0xc1,0x0, 0x2, 0xd, 0xb4, +0x0, 0x2, 0xd, 0xb3,0x0, 0x2, 0xe, 0x1c,0x0, 0x2, 0xe, 0x2e,0x0, 0x2, 0xe, 0x2d, +0x0, 0x2, 0xe, 0x1b,0x0, 0x2, 0xe, 0x26,0x0, 0x2, 0xe, 0x2a,0x0, 0x2, 0xe, 0x25, +0x0, 0x2, 0xe, 0x29,0x0, 0x2, 0xe, 0x24,0x0, 0x2, 0xe, 0x23,0x0, 0x2, 0xe, 0x22, +0x0, 0x2, 0xe, 0x21,0x0, 0x2, 0xe, 0x20,0x0, 0x2, 0xe, 0x1f,0x0, 0x2, 0xe, 0x1e, +0x0, 0x2, 0xe, 0x1d,0x0, 0x2, 0x0, 0xc, 0x0, 0x2, 0xd, 0x27,0x0, 0x2, 0xd, 0xae, +0x0, 0x2, 0x24,0xab,0x0, 0x2, 0xe, 0x74,0x0, 0x2, 0x74,0xe4,0x0, 0x2, 0x61,0x52, +0x0, 0x2, 0x60,0x0, 0x0, 0x2, 0x5f,0xe8,0x0, 0x0, 0x63,0xb0,0x0, 0x2, 0x24,0x7d, +0x0, 0x3, 0x11,0x4c,0x0, 0x3, 0x6, 0x5e,0x0, 0x2, 0x24,0x5e,0x0, 0x0, 0x5e,0x9c, +0x0, 0x2, 0x24,0xb5,0x0, 0x2, 0x25,0x18,0x0, 0x2, 0x65,0xb0,0x0, 0x2, 0x5f,0x18, +0x0, 0x2, 0x1b,0x64,0x0, 0x2, 0x5f,0xa4,0x0, 0x2, 0x65,0xd0,0x0, 0x2, 0xf6,0x0, +0x0, 0x2, 0x24,0xcc,0x0, 0x3, 0xa, 0x38,0x0, 0x2, 0x2e,0x6c,0x0, 0x1, 0x42,0xc8, +0x0, 0x2, 0xae,0x34,0x0, 0x2, 0xa7,0xe2,0x0, 0x0, 0xf4,0xe0,0x0, 0x0, 0xf4,0xb8, +0x0, 0x2, 0xf3,0xb8,0x0, 0x2, 0xf3,0xba,0x0, 0x2, 0xed,0x68,0x0, 0x2, 0xf4,0x30, +0x0, 0x2, 0xf4,0xb8,0x0, 0x2, 0xf4,0xe0,0x0, 0x2, 0xd4,0x22,0x0, 0x2, 0xf5,0xfb, +0x0, 0x2, 0xf5,0xfa,0x0, 0x0, 0xda,0x74,0x0, 0x0, 0xdd,0x9c,0x0, 0x2, 0xf5,0x6, +0x0, 0x2, 0xcd,0xd0,0x0, 0x2, 0xc1,0x2c,0x0, 0x2, 0xe7,0x16,0x0, 0x2, 0xc7,0x7e, +0x0, 0x2, 0xf4,0xac,0x0, 0x2, 0xf4,0xb4,0x0, 0x2, 0xf5,0x12,0x0, 0x2, 0xf5,0xe, +0x0, 0x2, 0xf5,0xa, 0x0, 0x2, 0xf5,0x10,0x0, 0x2, 0xf5,0xc, 0x0, 0x2, 0xf5,0x8, +0x0, 0x0, 0xf5,0x8, 0x0, 0x0, 0xd4,0x22,0x0, 0x2, 0xae,0x36,0x0, 0x2, 0xe0,0xc4, +0x0, 0x2, 0xba,0xda,0x0, 0x2, 0xb4,0x88,0x0, 0x2, 0xa7,0xe4,0x0, 0x0, 0xae,0x36, +0x0, 0x2, 0xf4,0xb0,0x0, 0x0, 0x63,0x78,0x0, 0x2, 0x2e,0x66,0x0, 0x2, 0x24,0x6e, +0x0, 0x2, 0x5f,0x4c,0x0, 0x2, 0xe, 0x9c,0x0, 0x2, 0x24,0x86,0x0, 0x2, 0x24,0x6c, +0x0, 0x2, 0x45,0x52,0x0, 0x2, 0x3f,0x0, 0x0, 0x2, 0x2d,0x4b,0x0, 0x2, 0x24,0x61, +0x0, 0x2, 0x24,0x5d,0x0, 0x3, 0x6, 0xcc,0x0, 0x2, 0x24,0xc9,0x0, 0x1, 0x42,0xc0, +0x0, 0x1, 0x42,0xcc,0x0, 0x2, 0x5f,0xc4,0x0, 0x2, 0xf6,0x4, 0x0, 0x3, 0x11,0x68, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x24,0x85,0x0, 0x2, 0x4b,0xa4,0x0, 0x3, 0xa, 0x78, +0x0, 0x2, 0x24,0x76,0x0, 0x2, 0x24,0x71,0x0, 0x3, 0x5, 0xe6,0x0, 0x2, 0x61,0x3c, +0x0, 0x0, 0x62,0xde,0x0, 0x2, 0x24,0xb6,0x0, 0x2, 0x5f,0xe3,0x0, 0x2, 0x5f,0xe2, +0x0, 0x2, 0x5f,0xe0,0x0, 0x3, 0x6, 0x64,0x0, 0x2, 0x24,0xc6,0x0, 0x1, 0x42,0xb4, +0x0, 0x3, 0xa, 0xf4,0x0, 0x3, 0xa, 0xdc,0x0, 0x2, 0x74,0x50,0x0, 0x2, 0xe, 0x9b, +0x0, 0x2, 0xe, 0xa0,0x0, 0x0, 0x65,0x60,0x0, 0x2, 0x75,0x40,0x0, 0x2, 0x74,0xec, +0x0, 0x2, 0x2e,0x68,0x0, 0x2, 0x2e,0x70,0x0, 0x2, 0x74,0x8a,0x0, 0x2, 0x74,0x8c, +0x0, 0x3, 0xa, 0xe8,0x0, 0x2, 0xe, 0x5e,0x0, 0x2, 0x1b,0x82,0x0, 0x2, 0x24,0x89, +0x0, 0x2, 0x2e,0x6a,0x0, 0x2, 0x24,0x54,0x0, 0x0, 0xf6,0x60,0x0, 0x2, 0xf6,0x60, +0x0, 0x2, 0x24,0x7a,0x0, 0x2, 0x5f,0xc6,0x0, 0x3, 0x6, 0x65,0x0, 0x2, 0x24,0xad, +0x0, 0x2, 0x24,0x70,0x0, 0x2, 0x2d,0x4a,0x0, 0x3, 0x5, 0xf2,0x0, 0x3, 0x5, 0xec, +0x0, 0x2, 0x25,0x1c,0x0, 0x2, 0x24,0x80,0x0, 0x3, 0x6, 0x68,0x0, 0x2, 0xe, 0x64, +0x0, 0x3, 0xa, 0xf8,0x0, 0x3, 0xa, 0xf6,0x0, 0x2, 0x24,0x64,0x0, 0x2, 0xe, 0x62, +0x0, 0x2, 0x2c,0xc5,0x0, 0x2, 0x67,0x82,0x0, 0x2, 0x67,0x24,0x0, 0x2, 0x67,0x91, +0x0, 0x2, 0x67,0x8d,0x0, 0x2, 0x67,0x8e,0x0, 0x2, 0x67,0x87,0x0, 0x2, 0x67,0x8a, +0x0, 0x2, 0x67,0x8c,0x0, 0x2, 0x67,0x8b,0x0, 0x2, 0x67,0x88,0x0, 0x2, 0x67,0x85, +0x0, 0x2, 0x67,0x89,0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67,0x1c,0x0, 0x2, 0x66,0x54, +0x0, 0x2, 0x66,0xb8,0x0, 0x2, 0x67,0x8f,0x0, 0x2, 0x67,0x84,0x0, 0x2, 0x67,0x86, +0x0, 0x2, 0x67,0x81,0x0, 0x2, 0x65,0xf0,0x0, 0x2, 0x67,0x80,0x0, 0x2, 0x24,0xd2, +0x0, 0x0, 0x63,0x6a,0x0, 0x3, 0x6, 0xd6,0x0, 0x2, 0x4b,0xa8,0x0, 0x1, 0x42,0xc4, +0x0, 0x0, 0x62,0xa0,0x0, 0x2, 0x1b,0x83,0x0, 0x2, 0x24,0xc8,0x0, 0x3, 0x11,0x60, +0x0, 0x2, 0x24,0x72,0x0, 0x2, 0x24,0xb7,0x0, 0x2, 0x24,0x66,0x0, 0x2, 0x5f,0xc8, +0x0, 0x3, 0x6, 0xd8,0x0, 0x0, 0x63,0xe0,0x0, 0x3, 0xa, 0xec,0x0, 0x1, 0x42,0xa8, +0x0, 0x2, 0x5f,0x5c,0x0, 0x2, 0x4b,0xac,0x0, 0x2, 0x74,0x36,0x0, 0x2, 0x74,0x3c, +0x0, 0x2, 0x74,0x3a,0x0, 0x2, 0x74,0x38,0x0, 0x2, 0x74,0x32,0x0, 0x2, 0x6d,0xf0, +0x0, 0x2, 0x67,0xb0,0x0, 0x2, 0x74,0x30,0x0, 0x2, 0x74,0x31,0x0, 0x2, 0x74,0x34, +0x0, 0x2, 0x67,0x94,0x0, 0x2, 0x24,0x88,0x0, 0x3, 0x6, 0x5f,0x0, 0x3, 0x5, 0xe8, +0x0, 0x1, 0x42,0xb8,0x0, 0x2, 0x5f,0x9c,0x0, 0x1, 0x42,0xe4,0x0, 0x2, 0x74,0x40, +0x0, 0x3, 0x6, 0xa8,0x0, 0x2, 0x25,0x14,0x0, 0x2, 0x32,0x48,0x0, 0x2, 0x32,0x30, +0x0, 0x2, 0x4b,0xae,0x0, 0x1, 0x42,0xd8,0x0, 0x2, 0x1b,0x84,0x0, 0x2, 0x24,0xae, +0x0, 0x2, 0x24,0x5c,0x0, 0x2, 0xe, 0x70,0x0, 0x2, 0x24,0x84,0x0, 0x2, 0x4b,0xc0, +0x0, 0x0, 0x62,0xb8,0x0, 0x2, 0xe, 0x5d,0x0, 0x2, 0x4b,0xb0,0x0, 0x0, 0x63,0xc8, +0x0, 0x2, 0x4b,0xb4,0x0, 0x2, 0x24,0x82,0x0, 0x2, 0x2c,0xf0,0x0, 0x2, 0x24,0x74, +0x0, 0x2, 0x24,0xac,0x0, 0x2, 0xe, 0x5c,0x0, 0x2, 0x4b,0xb8,0x0, 0x3, 0x6, 0x61, +0x0, 0x2, 0x5f,0xcc,0x0, 0x2, 0x24,0x7c,0x0, 0x2, 0x5f,0x7, 0x0, 0x2, 0x5f,0x6, +0x0, 0x2, 0x5f,0x5, 0x0, 0x2, 0x5f,0x4, 0x0, 0x2, 0x5f,0x3, 0x0, 0x2, 0x5f,0x2, +0x0, 0x2, 0x5f,0x1, 0x0, 0x2, 0x5f,0x0, 0x0, 0x2, 0x5e,0xff,0x0, 0x2, 0x5e,0xfe, +0x0, 0x2, 0x5e,0xfd,0x0, 0x2, 0x5e,0xfc,0x0, 0x2, 0x5e,0xfa,0x0, 0x2, 0x5e,0xec, +0x0, 0x2, 0x24,0x78,0x0, 0x2, 0x74,0xc8,0x0, 0x2, 0x5f,0xdf,0x0, 0x2, 0x5f,0xd0, +0x0, 0x1, 0x42,0xe8,0x0, 0x2, 0x5b,0x8e,0x0, 0x2, 0x58,0x68,0x0, 0x0, 0x1, 0x0, +0x0, 0x2, 0x25,0x16,0x0, 0x2, 0x24,0x87,0x0, 0x2, 0x24,0xca,0x0, 0x1, 0x42,0xe0, +0x0, 0x2, 0x0, 0x4, 0x0, 0x3, 0x6, 0xf6,0x0, 0x3, 0x6, 0xf5,0x0, 0x3, 0x6, 0xe6, +0x0, 0x3, 0x6, 0xe4,0x0, 0x2, 0x52,0x14,0x0, 0x1, 0x42,0xd0,0x0, 0x2, 0x24,0x1, +0x0, 0x2, 0x24,0x60,0x0, 0x0, 0x63,0x86,0x0, 0x2, 0x5f,0xce,0x0, 0x2, 0x75,0x48, +0x0, 0x2, 0xe, 0x8e,0x0, 0x2, 0x24,0x68,0x0, 0x3, 0x9, 0x5d,0xf, 0xff,0xff,0xff, +0xf0,0xff,0xff,0xff,0xff,0xc0,0xff,0xff,0x55,0x50,0x47,0x52,0x41,0x44,0x45,0x20, +0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0xa0,0x0, 0x3, 0xff,0x8, 0x0, 0x0, 0x8, +0x0, 0x82,0x52,0x1, 0x6, 0xc3,0x14,0x5, 0x8, 0x5, 0x8, 0x5, 0x6, 0xc3,0x18,0x6, +0x8, 0x6, 0x8, 0x6, 0x3, 0x28,0x0, 0xfa,0x3, 0x28,0x1, 0x2c,0xfc,0x0, 0xff,0xff, +0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0xf8,0x0, 0xff,0xff,0x9f,0xff,0xff,0xff, +0xe7,0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0xfe,0x7f,0xff,0xff,0xff,0x9f,0xff,0xff, +0xff,0xe7,0xff,0xff,0x80,0x1, 0x10,0x20,0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff, +0x0, 0x19,0x66,0xd, 0x3c,0x6e,0xf3,0x5f,0x7f,0xff,0xff,0xff, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT8006m/include/pramboot/FT8716_Pramboot_V0.5_20160723.i b/drivers/input/touchscreen/FT8006m/include/pramboot/FT8716_Pramboot_V0.5_20160723.i new file mode 100755 index 0000000000000..8c27370a9170b --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/include/pramboot/FT8716_Pramboot_V0.5_20160723.i @@ -0,0 +1,246 @@ +0x2, 0x3, 0x83,0xca,0x39,0x12,0xf, 0x3c,0xda,0x39,0x32,0x2, 0x0, 0x3, 0x6d,0x22, +0x80,0x13,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, +0xb0,0xb, 0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0xff,0x2, 0xd, 0xf, 0xe5,0x33, +0xb4,0xc, 0xf, 0xc2,0x86,0xc2,0x87,0x7e,0x34,0x0, 0x64,0x12,0xe, 0x86,0xd2,0x86, +0xd2,0x87,0x22,0x2, 0x0, 0xf9,0xca,0x3b,0x7a,0xd, 0x10,0x7f,0x31,0xe5,0x24,0xb4, +0x80,0x2, 0x80,0x3, 0x2, 0x0, 0xdc,0x7f,0x13,0x5e,0x34,0x0, 0x7f,0x7d,0x23,0x7e, +0x34,0x0, 0x80,0x9d,0x32,0x7a,0x35,0x16,0x7e,0x35,0x14,0xbe,0x35,0x16,0x38,0x2, +0x80,0x5d,0x7e,0x35,0x16,0x7a,0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6, +0x7e,0x35,0x14,0x9e,0x35,0x16,0x7a,0x35,0x14,0x7e,0x35,0x16,0x6d,0x22,0x2f,0x31, +0x7e,0x1d,0x10,0x2e,0x35,0x16,0x7a,0x1d,0x10,0x80,0x27,0x7e,0x34,0x0, 0x80,0x7a, +0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6,0x7e,0x35,0x14,0x9e,0x34,0x0, +0x80,0x7a,0x35,0x14,0x7e,0x1d,0x10,0x2e,0x34,0x0, 0x80,0x7a,0x1d,0x10,0x2e,0x38, +0x0, 0x80,0x7e,0x35,0x14,0xbe,0x34,0x0, 0x80,0x50,0xd0,0x4d,0x33,0x68,0x26,0x7a, +0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6,0x80,0x19,0x74,0x2, 0x12,0xa, +0x89,0x5e,0x70,0xf4,0x12,0xc, 0x86,0x7e,0x35,0x14,0x7a,0x35,0x18,0x7f,0x13,0x7e, +0xd, 0x10,0x12,0x8, 0xe, 0xd3,0xda,0x3b,0x22,0xa9,0xc0,0x93,0x75,0x39,0x0, 0x32, +0xf, 0x60,0xf0,0x9f,0x4c,0xf1,0xb3,0xe, 0xce,0xb9,0x31,0x46,0xff,0x0, 0xff,0x0, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x7c,0x6b,0xc2,0x2, 0xe5,0x22,0x14,0x78,0x3, 0x2, 0x2, 0xda,0x1b,0xb1,0x78,0x3, +0x2, 0x2, 0x3d,0x1b,0xb1,0x78,0x3, 0x2, 0x2, 0x89,0x1b,0xb1,0x78,0x3, 0x2, 0x2, +0x9a,0x1b,0xb1,0x78,0x3, 0x2, 0x2, 0xc1,0x24,0xf9,0x78,0x3, 0x2, 0x2, 0xd6,0x24, +0xaf,0x78,0x3, 0x2, 0x3, 0x3b,0x24,0xfd,0x68,0x3a,0x14,0x78,0x3, 0x2, 0x2, 0xdd, +0x14,0x78,0x3, 0x2, 0x2, 0xda,0x1b,0xb2,0x78,0x3, 0x2, 0x2, 0xda,0x24,0xda,0x68, +0x26,0x24,0xe6,0x68,0x1f,0x24,0xeb,0x68,0x3b,0x24,0xf3,0x78,0x3, 0x2, 0x2, 0xda, +0x24,0xe4,0x78,0x3, 0x2, 0x3, 0x46,0x14,0x78,0x3, 0x2, 0x2, 0xda,0x24,0x94,0x68, +0x3, 0x2, 0x3, 0x82,0x2, 0x3, 0x42,0xbe,0x60,0x4, 0x50,0xc, 0x75,0x3f,0x0, 0x7c, +0x16,0x2e,0x10,0x25,0x7c,0xb7,0xa5,0xf7,0xa5,0xbe,0x0, 0x2, 0x80,0x3, 0x2, 0x3, +0x82,0xd2,0x2, 0x22,0x7c,0xb6,0x24,0x0, 0x78,0x3, 0x2, 0x3, 0x82,0x1b,0xb1,0x68, +0x1e,0x14,0x68,0x1e,0x14,0x68,0x1e,0x14,0x68,0x1e,0xb, 0xb2,0x78,0x33,0x30,0x1, +0x7, 0x7e,0x8, 0x0, 0x44,0x2, 0x2, 0x5a,0x7e,0x8, 0x1, 0x50,0x2, 0x2, 0x5a,0x2, +0x2, 0xfb,0x2, 0x3, 0x2, 0x2, 0x3, 0x1a,0xa, 0x27,0x7e,0xd, 0x3a,0xb, 0x16,0xb, +0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x6d,0x33,0x7e,0xd, 0x3a,0x79,0x30,0x0, 0x6, +0x22,0x7c,0xb7,0x62,0x3f,0x7e,0x2d,0x3a,0x2e,0x54,0x0, 0x6, 0xb, 0x2a,0x20,0x7d, +0x12,0xb, 0x14,0x1b,0x2a,0x10,0x7e,0xd, 0x3a,0x2d,0x12,0x39,0x70,0x0, 0x8, 0x7e, +0xd, 0x3a,0x69,0x50,0x0, 0x4, 0x69,0x20,0x0, 0x6, 0xbd,0x25,0x50,0x3, 0x2, 0x3, +0x82,0xb2,0x1, 0x7a,0xd, 0x34,0x7e,0x34,0x0, 0x2, 0x2, 0x3, 0x7f,0x7c,0xb6,0x1b, +0xb1,0x68,0x1d,0x14,0x68,0x1d,0xb, 0xb1,0x68,0x3, 0x2, 0x3, 0x82,0x30,0x1, 0x6, +0x7e,0x8, 0x0, 0x44,0x80,0x4, 0x7e,0x8, 0x1, 0x50,0x7a,0xd, 0x3a,0x2, 0x2, 0xf3, +0x2, 0x2, 0xfb,0xa, 0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, +0x20,0x2f,0x12,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x1d,0x3a,0x7a,0x1d,0x34, +0xd2,0x2, 0x7e,0x34,0x0, 0x1, 0x2, 0x3, 0x7f,0xbe,0x60,0x1, 0x68,0x9, 0xa5,0xbe, +0x2, 0x5, 0x7a,0x71,0x3e,0xd2,0x3, 0xd2,0x2, 0x22,0x75,0xe6,0x0, 0xe4,0x7e,0x34, +0x1, 0x4, 0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x5, 0x7a,0x1b,0xb0, +0x7e,0x34,0x1, 0x8, 0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x9, 0x7a,0x1b,0xb0,0xd2,0x4, +0x22,0xa5,0xbe,0x1, 0x4, 0x7a,0x71,0x38,0x22,0xa5,0xbe,0x2, 0x2, 0x80,0x3, 0x2, +0x3, 0x82,0x7a,0x71,0x23,0x22,0x7a,0x71,0x33,0x22,0xd2,0x2, 0x22,0x7c,0xb6,0x1b, +0xb1,0x68,0x18,0x14,0x68,0x1c,0x14,0x68,0x31,0x14,0x68,0x3a,0xb, 0xb2,0x68,0x3, +0x2, 0x3, 0x82,0xa, 0x37,0x7d,0x3, 0x6d,0x11,0x80,0x59,0xa, 0x57,0x7c,0xab,0xe4, +0x80,0x2, 0xa, 0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x2f,0x12,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x22,0x7c,0x67,0x6c,0x77,0x7e,0xd, +0x3a,0x79,0x30,0x0, 0x4, 0x22,0xa, 0x27,0x7e,0xd, 0x3a,0xb, 0x16,0xb, 0xa, 0x30, +0x2d,0x32,0x1b,0xa, 0x30,0x7e,0x34,0x0, 0x3, 0x80,0x44,0x7e,0x34,0x0, 0x4, 0x7a, +0x35,0x2f,0x75,0x3f,0x0, 0x22,0x1b,0x61,0x68,0x15,0xb, 0x60,0x78,0x34,0x7c,0x27, +0x6c,0x33,0x6d,0x0, 0x7e,0x1d,0x3a,0x79,0x11,0x0, 0x2, 0x1b,0x1a,0x0, 0x22,0xa, +0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x2f,0x12,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0xe4,0x7a,0xb3,0x2, 0xe4,0x7e,0x34,0x0, 0x5, 0x7a, +0x35,0x2f,0x22,0x75,0x84,0x1, 0x7e,0x44,0x1f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44, +0x78,0xf9,0x7e,0xf8,0x2, 0xe8,0xd2,0x7, 0xc2,0x8, 0x75,0x3f,0x0, 0x75,0x40,0x87, +0x75,0x41,0xa6,0x75,0x42,0x0, 0x75,0x43,0x0, 0xd2,0x0, 0xc2,0x2, 0xc2,0x3, 0xc2, +0x4, 0x75,0x22,0x0, 0x75,0x23,0x0, 0x75,0x24,0x80,0x75,0x2f,0x0, 0x75,0x30,0x0, +0x75,0x31,0x0, 0x75,0x32,0x0, 0x75,0x33,0x0, 0x75,0x38,0xb, 0x75,0x39,0x0, 0x75, +0x3e,0x1, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0xf, 0x50,0xb, 0xa, 0x40,0x5d,0x44,0x68, +0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29, +0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x4, 0x20,0xff,0xff, +0x56,0x30,0x2e,0x35,0x4a,0x75,0x6c,0x20,0x32,0x33,0x20,0x32,0x30,0x31,0x36,0x0, +0x46,0x54,0x53,0x38,0x37,0x31,0x36,0x5f,0x70,0x72,0x61,0x6d,0x62,0x6f,0x6f,0x74, +0x12,0xe, 0x63,0x2, 0x5, 0xbc,0x7e,0x35,0x2f,0x1b,0x34,0x68,0x60,0x1b,0x35,0x78, +0x3, 0x2, 0x4, 0xbc,0x1b,0x34,0x78,0x3, 0x2, 0x4, 0xe6,0x1b,0x34,0x78,0x3, 0x2, +0x5, 0x96,0x2e,0x34,0x0, 0x3, 0x68,0x3, 0x2, 0x5, 0xa8,0x6d,0x33,0x7a,0x35,0x2f, +0x7a,0x35,0x31,0x30,0x7, 0x5, 0x12,0x0, 0x2e,0xc2,0x7, 0x7e,0xd, 0x34,0x69,0x30, +0x0, 0x4, 0x7a,0x35,0x14,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x2e,0x14,0x0, 0x8, +0x12,0x0, 0x46,0xd2,0x7, 0x7e,0x2d,0x34,0x69,0x12,0x0, 0x4, 0x69,0x32,0x0, 0x2, +0xb, 0x2a,0x20,0x12,0xb, 0xe2,0x2e,0x34,0x10,0x0, 0x2, 0x5, 0x91,0x6d,0x33,0x7a, +0x35,0x2f,0x7e,0x34,0x1, 0x0, 0x7a,0x35,0x15,0x7e,0xd, 0x34,0x69,0x30,0x0, 0x2, +0xb, 0xa, 0x20,0x2e,0x14,0x0, 0x8, 0x12,0xe, 0xf2,0x20,0x0, 0x3, 0x2, 0x5, 0xa8, +0x7e,0x1d,0x34,0x29,0xb1,0x0, 0x8, 0xf5,0x91,0x2, 0x5, 0xa8,0x6d,0x33,0x7a,0x35, +0x2f,0x7a,0x35,0x31,0x7e,0x18,0x0, 0x3f,0x7a,0x1d,0xe, 0x7e,0xd, 0x34,0x69,0x30, +0x0, 0x2, 0xb, 0xa, 0x20,0x69,0x10,0x0, 0x4, 0x12,0x7, 0x62,0x12,0x0, 0x2e,0x7e, +0x34,0xf0,0x55,0x2, 0x5, 0x91,0x7e,0x18,0x10,0x0, 0x7a,0x1d,0x8, 0xd2,0x5, 0x6d, +0x33,0x7a,0x35,0x2f,0x7a,0x35,0x31,0xe5,0x38,0xb4,0xa, 0x17,0xe5,0x24,0xb4,0x80, +0xc, 0xe4,0x12,0xc, 0xd1,0x74,0x1, 0x12,0xc, 0xd1,0x2, 0x5, 0x7f,0x12,0x8, 0xa4, +0x2, 0x5, 0x7f,0xe5,0x38,0xb4,0xb, 0x27,0xe5,0x24,0xb4,0x80,0x11,0x7e,0xf0,0x1, +0x7c,0xbf,0x12,0x5, 0xc3,0xb, 0xf0,0xbe,0xf0,0x11,0x78,0xf4,0x80,0x51,0x7e,0xf0, +0x4, 0x7c,0xbf,0x12,0x5, 0xc3,0xb, 0xf0,0xbe,0xf0,0x40,0x78,0xf4,0x80,0x40,0xe5, +0x38,0xa, 0x3b,0x9e,0x34,0x0, 0x80,0x7c,0xe7,0xe5,0x24,0xb4,0x80,0x10,0xa, 0x3e, +0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x8, 0x80,0xe, 0xa, 0x3e, +0x6d,0x22,0x74,0xa, 0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x8, 0x6c,0xdd,0x80,0x9, +0x7c,0xbe,0x12,0x5, 0xc3,0xb, 0xe0,0xb, 0xd0,0xe5,0x23,0xbc,0xbd,0x38,0xf1,0x7e, +0x1d,0x8, 0x12,0xe, 0xd, 0x92,0x5, 0x12,0x0, 0x2e,0x30,0x5, 0x1b,0x7e,0x34,0xf0, +0xaa,0x7a,0x35,0x31,0x80,0x12,0x6d,0x33,0x7a,0x35,0x2f,0x7a,0x35,0x31,0x7e,0xd, +0x34,0x69,0x30,0x0, 0x2, 0x12,0x6, 0x98,0x30,0x4, 0x11,0x7e,0x34,0x13,0x88,0x12, +0xe, 0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0x75,0xe9,0xff,0x30,0x8, 0x3, 0x2, +0x4, 0x26,0x22,0xca,0xf8,0x7c,0xfb,0xe5,0x24,0xb4,0x80,0x4a,0xd2,0x6, 0x12,0xe, +0xdf,0x74,0x20,0xca,0xb8,0xa, 0x3f,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb, +0xda,0xb8,0x12,0xd, 0xb3,0xa9,0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, +0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4, +0x38,0x6, 0x12,0xf, 0x4d,0x2, 0x6, 0x95,0xc2,0x86,0x7e,0x34,0x13,0x88,0x12,0xe, +0x86,0xd2,0x86,0x2, 0x6, 0x95,0x74,0x1, 0x12,0xa, 0x21,0x74,0x1, 0x6d,0x33,0x12, +0xc, 0x86,0xe4,0x12,0xa, 0x89,0x5e,0x34,0x80,0x0, 0x7c,0x4f,0x6c,0x55,0x3e,0x24, +0x4d,0x32,0x12,0xc, 0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, 0x86,0x7e,0x34,0x0, 0x50, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x51, +0x12,0xc, 0x86,0x7e,0x34,0xa2,0x1c,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x11, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x10, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, +0x86,0x7e,0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, 0x21,0x74,0x4, 0x7e,0x34, +0xff,0xf7,0x12,0xc, 0x86,0xda,0xf8,0x22,0xca,0xf8,0xe4,0x7a,0xb3,0x2, 0xe4,0xe5, +0x24,0xbe,0xb0,0x80,0x68,0x9, 0x74,0x1, 0x7a,0xb3,0x2, 0xe4,0x2, 0x7, 0x5f,0xbe, +0x34,0xff,0xff,0x68,0x6, 0xbe,0x34,0x0, 0x12,0x50,0x4, 0x7e,0x34,0x0, 0x12,0x7d, +0x13,0x6d,0x0, 0x74,0xc, 0x2f,0x0, 0x14,0x78,0xfb,0x7a,0xd, 0xc, 0x7c,0xb7,0x12, +0x5, 0xc3,0x7e,0x1d,0xc, 0x12,0xe, 0xd, 0xe4,0x33,0x7c,0xfb,0xbe,0xf0,0x1, 0x78, +0xa, 0x7e,0xb3,0x2, 0xe4,0x44,0x2, 0x7a,0xb3,0x2, 0xe4,0x6c,0xaa,0xa, 0x3a,0x19, +0xa3,0x2, 0xdc,0xb, 0xa0,0xbe,0xa0,0x8, 0x78,0xf3,0x7e,0x34,0x0, 0x8, 0x7a,0x35, +0x14,0x7e,0x1d,0xc, 0x7e,0x8, 0x2, 0xdc,0x12,0x0, 0x46,0x6c,0xaa,0xe4,0xa, 0x4a, +0x19,0xb4,0x2, 0xdc,0xb, 0xa0,0xbe,0xa0,0x8, 0x78,0xf3,0x7e,0x34,0x0, 0x8, 0x7a, +0x35,0x15,0x7e,0x1d,0xc, 0x7e,0x8, 0x2, 0xdc,0x12,0xe, 0xf2,0x7e,0xf0,0x1, 0x6c, +0xaa,0xa, 0x3a,0x9, 0xb3,0x2, 0xdc,0xbc,0xba,0x68,0x4, 0x6c,0xff,0x80,0x7, 0xb, +0xa0,0xbe,0xa0,0x8, 0x40,0xeb,0xbe,0xf0,0x1, 0x78,0xa, 0x7e,0xb3,0x2, 0xe4,0x44, +0x4, 0x7a,0xb3,0x2, 0xe4,0x7e,0xb3,0x2, 0xe4,0x44,0x1, 0x7a,0xb3,0x2, 0xe4,0xda, +0xf8,0x22,0xca,0x3b,0x7a,0x15,0xc, 0x7f,0x31,0x75,0x12,0x0, 0x7e,0x35,0xc, 0xbe, +0x34,0x0, 0x0, 0x38,0x4f,0x7e,0x34,0xff,0xff,0x7a,0x35,0xc, 0x75,0x12,0x1, 0x80, +0x43,0x7e,0x34,0x0, 0x80,0x7a,0x35,0x15,0x7f,0x13,0x7e,0x8, 0x2, 0x5c,0x12,0xe, +0xf2,0x7e,0x35,0xc, 0x9e,0x34,0x0, 0x80,0x7a,0x35,0xc, 0x2e,0x38,0x0, 0x80,0x6d, +0x33,0x7a,0x35,0x13,0x7e,0x35,0x13,0x9, 0x63,0x2, 0x5c,0x7e,0xd, 0xe, 0x7e,0xb, +0x70,0x6c,0x76,0x7a,0xb, 0x70,0x7e,0x35,0x13,0xb, 0x34,0x7a,0x35,0x13,0xbe,0x34, +0x0, 0x80,0x78,0xe0,0x7e,0x35,0xc, 0xbe,0x34,0x0, 0x80,0x38,0xb4,0xe5,0x12,0x60, +0x5, 0xb, 0x34,0x7a,0x35,0xc, 0x7e,0x35,0xc, 0x7a,0x35,0x15,0x7f,0x13,0x7e,0x8, +0x2, 0x5c,0x12,0xe, 0xf2,0x6d,0x33,0x80,0x17,0x7e,0x35,0x13,0x9, 0x63,0x2, 0x5c, +0x7e,0xd, 0xe, 0x7e,0xb, 0x70,0x6c,0x76,0x7a,0xb, 0x70,0x7e,0x35,0x13,0xb, 0x34, +0x7a,0x35,0x13,0x7e,0x35,0xc, 0xbe,0x35,0x13,0x38,0xde,0xda,0x3b,0x22,0xca,0x3b, +0x7f,0x30,0x7c,0xb6,0xf5,0x1a,0x7c,0xb7,0xf5,0x1b,0x74,0x1, 0x7e,0x35,0x18,0x1e, +0x34,0x1b,0x34,0x4e,0x60,0x80,0x12,0xc, 0x86,0x12,0xa, 0x21,0xa9,0xc2,0xb4,0xa9, +0xc6,0xb3,0x75,0xb5,0x2, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x85,0x1a,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x85,0x1b,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x6d,0x33,0x80,0x2a,0x7f,0x13, +0x2e,0x35,0x1c,0x7e,0x1b,0xb0,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e, +0x35,0x1c,0x5e,0x34,0x0, 0x1, 0xbe,0x34,0x0, 0x1, 0x78,0x7, 0x7e,0x34,0x0, 0x78, +0x12,0xe, 0x86,0x7e,0x35,0x1c,0xb, 0x34,0x7a,0x35,0x1c,0x7e,0x35,0x18,0xbe,0x35, +0x1c,0x38,0xcb,0xa9,0xd2,0xb4,0x7e,0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, +0x21,0xda,0x3b,0x22,0xe5,0x24,0xb4,0x80,0x16,0xd2,0x6, 0x12,0xe, 0xdf,0xa9,0xc2, +0xb4,0x74,0x60,0x12,0xf, 0x27,0xa9,0xd2,0xb4,0x12,0xe, 0xca,0x40,0xfb,0x22,0x74, +0x1, 0x12,0xa, 0x21,0xe4,0x6d,0x33,0x12,0xc, 0x86,0x74,0x1, 0x6d,0x33,0x12,0xc, +0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, 0x86,0x7e,0x34,0x0, 0x54,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x55,0x12,0xc, 0x86,0x7e, +0x34,0xa2,0x1c,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x15,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0xa0,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x14,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x4, 0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, 0x21,0x74,0x4, 0x7e,0x34,0xff,0xf7, +0x2, 0xc, 0x86,0x7c,0x7b,0x7e,0xa0,0xef,0xe5,0x22,0x24,0xfd,0x68,0x3c,0x1b,0xb1, +0x68,0x26,0x24,0x9f,0x68,0x41,0x1b,0xb2,0x68,0x42,0x24,0x9e,0x68,0x39,0x24,0xe3, +0x68,0x52,0x24,0x59,0x78,0x52,0xa5,0xbf,0x0, 0x5, 0x7e,0xa1,0x40,0x80,0x49,0xa5, +0xbf,0x1, 0x45,0x7e,0xa1,0x41,0x80,0x40,0xa5,0xbf,0x0, 0x5, 0x7e,0xa1,0x24,0x80, +0x37,0xa5,0xbf,0x1, 0x33,0x7e,0xa1,0x3e,0x80,0x2e,0xa, 0x17,0x7e,0x1d,0x3a,0x2d, +0x31,0x29,0xa1,0x0, 0x8, 0x80,0x21,0x7e,0xa1,0x3f,0x80,0x1c,0xa5,0xbf,0x0, 0x9, +0x7e,0x35,0x31,0xa, 0x56,0x7c,0xab,0x80,0xf, 0xa5,0xbf,0x1, 0xb, 0x7e,0x55,0x31, +0x7c,0xab,0x80,0x4, 0x7e,0xa3,0x2, 0xe4,0x7c,0xba,0x22,0xca,0x79,0x6c,0xee,0x7e, +0xf0,0x70,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x30,0x8, 0x31,0x7e,0x34,0x0, 0x2, +0x7a,0x35,0x15,0x9f,0x11,0x7e,0x8, 0x0, 0xc, 0x12,0xe, 0xf2,0xe5,0xc, 0xbe,0xb0, +0xff,0x68,0x1a,0xe5,0xc, 0x60,0x16,0xe5,0xd, 0xa, 0x2b,0xe5,0xc, 0xa, 0x3b,0x2d, +0x32,0xbe,0x34,0x0, 0xff,0x78,0x6, 0x7e,0xf1,0xc, 0x7e,0xe0,0x1, 0x4c,0xee,0x78, +0x1c,0xa9,0xd1,0xcb,0xd2,0xcc,0x12,0xc, 0x35,0x7c,0xfb,0xc2,0xcc,0xa9,0xc1,0xcb, +0xbe,0xf0,0x2, 0x40,0x5, 0xbe,0xf0,0xfd,0x28,0x3, 0x7e,0xf0,0x70,0x7c,0xbf,0x54, +0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xd2,0xad,0xda,0x79, +0x22,0xca,0x79,0xbe,0xb0,0x0, 0x28,0x2e,0x74,0x6, 0x12,0xa, 0x89,0x7d,0x73,0x6c, +0xff,0x7e,0xf0,0xa5,0x7d,0x37,0x12,0xc, 0x86,0x6c,0xff,0x7e,0xf0,0xf, 0x7d,0x37, +0x12,0xc, 0x86,0x6c,0xff,0x7e,0xf0,0x6a,0x7d,0x37,0x12,0xc, 0x86,0x7e,0x34,0x0, +0x5, 0x12,0xe, 0x86,0x80,0x30,0x74,0x1, 0x7e,0x34,0xdf,0xff,0x12,0xc, 0x86,0x74, +0x6, 0x12,0xa, 0x89,0x7d,0x73,0x6c,0xff,0x7d,0x37,0x12,0xc, 0x86,0x7d,0x37,0x12, +0xc, 0x86,0x7d,0x37,0x12,0xc, 0x86,0x74,0x2, 0x12,0xa, 0x89,0x7d,0x73,0x4e,0xf0, +0x1, 0x7d,0x37,0x12,0xc, 0x86,0xda,0x79,0x22,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x75, +0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c, +0x55,0xa, 0x3a,0x4d,0x32,0x22,0x7f,0x70,0xd2,0x6, 0x12,0xe, 0xdf,0x74,0x2, 0x12, +0xd, 0xb3,0x6d,0x33,0x80,0x12,0x7f,0x7, 0x2d,0x13,0x7e,0xb, 0xb0,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xb, 0x34,0x7e,0x25,0x18,0xbd,0x23,0x38,0xe7,0xa9, +0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, 0x7e,0x35,0x42,0xbe,0x34,0x1, +0xf4,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4,0x38,0x3, 0x2, 0xf, 0x4d,0xc2, +0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0xd2,0x86,0x22,0xa9,0xd1,0xcb,0xd2,0xcc, +0x7e,0x34,0x0, 0x4, 0x7e,0x8, 0x2, 0x5c,0x74,0xc, 0x12,0xb, 0x8f,0xa9,0xd1,0xcb, +0xc2,0xcc,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0x8, 0x2, 0x5c,0x2d,0x13,0xb, +0xa, 0x30,0x7d,0x23,0x7c,0x45,0x6c,0x55,0xa, 0x36,0x4d,0x32,0x1b,0xa, 0x30,0xb, +0xa0,0xbe,0xa0,0xc, 0x78,0xde,0x7e,0x37,0x2, 0x6c,0x7d,0x23,0xa, 0x54,0x7c,0xa7, +0xb4,0xe7,0xb, 0xbe,0xa0,0x16,0x78,0x6, 0x75,0x40,0xe7,0x75,0x41,0xa6,0x22,0x7e, +0x24,0x0, 0x1, 0x7e,0x7f,0x2, 0xe5,0x79,0x27,0x0, 0x6, 0x7e,0x7f,0x2, 0xe5,0x69, +0x27,0x0, 0x6, 0x4d,0x22,0x78,0xf4,0x5e,0x60,0x7f,0x1b,0x7a,0x30,0x7e,0x1f,0x2, +0xe5,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6c,0xaa,0x80,0x20,0x6d,0x44,0x7e, +0x1f,0x2, 0xe5,0x1b,0x1a,0x40,0x7e,0x1f,0x2, 0xe5,0x69,0x41,0x0, 0x8, 0x4d,0x44, +0x68,0xf4,0x69,0x41,0x0, 0x2, 0x1b,0xa, 0x40,0xb, 0x15,0xb, 0xa0,0xbc,0xba,0x38, +0xdc,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31, +0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50, +0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, +0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40, +0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31, +0x7d,0x10,0x6d,0x0, 0x22,0x7e,0x34,0x0, 0x2, 0x7e,0xf, 0x2, 0xe5,0x79,0x30,0x0, +0x4, 0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x2, 0xe5,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x2, +0xe5,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7e,0x34,0x0, 0x4, 0x1b,0xa, 0x30, +0x7e,0xf, 0x2, 0xe5,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, +0x30,0x7e,0x1f,0x2, 0xe5,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x51,0x0, +0x2, 0x5e,0x54,0x0, 0xfe,0x22,0x7d,0x23,0xa, 0x36,0x7c,0xa5,0xa9,0xc2,0xb4,0xa9, +0xc6,0xb3,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4, +0x22,0x7c,0xab,0xd2,0x6, 0x12,0xe, 0xdf,0x74,0xd8,0xa, 0x3a,0x7d,0x23,0x6d,0x33, +0x12,0xd, 0xb3,0xa9,0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, 0x7e,0x35, +0x42,0xbe,0x34,0x5, 0xdc,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x5, 0xdc,0x38,0x3, +0x2, 0xf, 0x4d,0xc2,0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0xd2,0x86,0x22,0xca, +0x2b,0xca,0x1b,0xca,0xb, 0xd2,0x0, 0x30,0x90,0x1c,0xc2,0x90,0x7e,0x71,0x91,0xe5, +0x39,0x70,0x3, 0x7a,0x71,0x22,0xe5,0x39,0x12,0x1, 0x20,0x5, 0x39,0x30,0x2, 0x6, +0xe4,0x12,0x9, 0x33,0xf5,0x91,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x39,0xe5,0x39,0x12, +0x9, 0x33,0xf5,0x91,0xda,0xb, 0xda,0x1b,0xda,0x2b,0x32,0xd2,0x6, 0x12,0xe, 0xdf, +0xa9,0xc2,0xb4,0x74,0x9f,0x12,0xf, 0x27,0x12,0xf, 0xe, 0xa9,0xd2,0xb4,0x60,0x3, +0xb4,0xff,0x1a,0x75,0x24,0x81,0xa9,0xd5,0xca,0xa9,0xd0,0xca,0x75,0xed,0x9f,0x75, +0xad,0x20,0xa9,0xd1,0xea,0xa9,0xc1,0xea,0x74,0x1, 0x2, 0xd, 0xe0,0x2, 0xd, 0x80, +0xd2,0x6, 0x12,0xe, 0xdf,0xa9,0xc2,0xb4,0x74,0x5, 0x12,0xf, 0x27,0x12,0xf, 0xe, +0x7c,0xab,0xa9,0xd2,0xb4,0xd2,0x6, 0x12,0xe, 0xdf,0x5e,0xa0,0xe3,0xa9,0xc2,0xb4, +0x74,0x1, 0x12,0xf, 0x27,0x7c,0xba,0x12,0xf, 0x27,0xa9,0xd2,0xb4,0x12,0xe, 0xca, +0x40,0xfb,0x22,0x7c,0xab,0x7d,0x12,0x7c,0xb3,0xf5,0x1c,0x7c,0x36,0x7c,0x25,0xa, +0x4, 0x7c,0xb3,0xf5,0x1b,0x7c,0xb7,0xf5,0x1a,0xa9,0xc2,0xb4,0x7c,0xba,0x12,0xf, +0x27,0xe5,0x1c,0x12,0xf, 0x27,0xe5,0x1b,0x12,0xf, 0x27,0xe5,0x1a,0x2, 0xf, 0x27, +0xca,0xf8,0x7c,0xfb,0xe5,0x24,0xb4,0x81,0x21,0x74,0x2, 0x12,0xa, 0x89,0x4c,0xff, +0x78,0x8, 0xa9,0xc0,0xca,0x5e,0x70,0xdf,0x80,0x6, 0xa9,0xd0,0xca,0x4e,0x70,0x20, +0x74,0x2, 0x12,0xc, 0x86,0x74,0x2, 0x12,0xa, 0x89,0xda,0xf8,0x22,0xd2,0x6, 0x7e, +0x14,0x0, 0x8, 0x7a,0x15,0x15,0x7e,0x8, 0x2, 0xdc,0x12,0xe, 0xf2,0x6c,0xaa,0xa, +0x3a,0x9, 0xb3,0x2, 0xdc,0xbe,0xb0,0xff,0x68,0x4, 0xc2,0x6, 0x80,0x7, 0xb, 0xa0, +0xbe,0xa0,0x8, 0x40,0xea,0xa2,0x6, 0x22,0x7d,0x52,0xf5,0x19,0x7c,0xb6,0x7c,0xa5, +0xa, 0x44,0xf5,0x18,0x7f,0x21,0xf5,0x17,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xf, 0x27, +0xe5,0x19,0x12,0xf, 0x27,0xe5,0x18,0x12,0xf, 0x27,0xe5,0x17,0x12,0xf, 0x27,0xe4, +0x2, 0xf, 0x27,0x12,0xe, 0xa9,0x12,0xb, 0x3b,0xa9,0xa6,0x94,0xb3,0x92,0x8, 0x30, +0x8, 0x6, 0x12,0xf, 0x1b,0x12,0xd, 0x4b,0x12,0x9, 0xab,0x12,0xf, 0x0, 0xd2,0xaf, +0x30,0x3, 0xfd,0x2, 0xf, 0x45,0x80,0x18,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe5,0x3e,0x70,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xe0,0x22,0xd2,0xcf,0x85,0x3e,0xcc,0x75,0xec, +0xff,0x75,0xee,0xff,0x75,0xeb,0x3, 0x75,0xac,0xc0,0xa9,0xc5,0xca,0x75,0xed,0xf, +0x75,0xad,0xb0,0xa9,0xd7,0x94,0xa9,0xd4,0x94,0x22,0xa9,0xc2,0xb4,0x74,0x5, 0x12, +0xf, 0x27,0x12,0xf, 0xe, 0xa9,0xd2,0xb4,0x30,0xe0,0x2, 0xd3,0x22,0xc3,0x22,0xa9, +0xc2,0xb4,0x30,0x6, 0x4, 0x74,0x6, 0x80,0x2, 0x74,0x4, 0x12,0xf, 0x27,0xa9,0xd2, +0xb4,0x22,0x12,0xe, 0x38,0x7e,0x35,0x15,0x12,0x0, 0xe, 0xa9,0xd2,0xb4,0xd3,0x22, +0xc2,0x8c,0x43,0x89,0x2, 0x75,0x8c,0x1, 0x75,0x8a,0x0, 0xd2,0xa9,0x22,0x75,0xb5, +0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x22,0xd2,0xc8,0x75,0xb3,0x13, +0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x22,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xd3,0x22,0xc2,0x8c,0x6d,0x33,0x7a,0x35,0x42,0xd2,0x8c,0x22,0x7e,0x35,0x42,0xb, +0x34,0x7a,0x35,0x42,0x22,0x85,0x3e,0xcc,0xe5,0x3e,0x2, 0xd, 0xe0,0x2, 0xf, 0x3c, +0x0, 0x1, 0x2, 0xe4,0x0, 0x0, 0x4, 0x2, 0xe5,0x0, 0x0, 0x9c,0x0, 0x0, 0x0, 0xff, diff --git a/drivers/input/touchscreen/FT8716/Kconfig b/drivers/input/touchscreen/FT8716/Kconfig new file mode 100755 index 0000000000000..15cf98981c357 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/Kconfig @@ -0,0 +1,16 @@ +# +# Focaltech Touchscreen driver configuration +# + +config TOUCHSCREEN_FTS + bool "Focaltech Touchscreen" + depends on I2C + default n + help + Say Y here if you have Focaltech touch panel. + If unsure, say N. + +config TOUCHSCREEN_FTS_DIRECTORY + string "Focaltech ts directory name" + default "focaltech_touch" + depends on TOUCHSCREEN_FTS diff --git a/drivers/input/touchscreen/FT8716/Makefile b/drivers/input/touchscreen/FT8716/Makefile new file mode 100755 index 0000000000000..eaab65495f13f --- /dev/null +++ b/drivers/input/touchscreen/FT8716/Makefile @@ -0,0 +1,18 @@ +# +# Makefile for the focaltech touchscreen drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_core.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_ex_fun.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_ex_mode.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_flash.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_gesture.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_esdcheck.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_i2c.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_sensor.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_point_report_check.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_flash/ +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test/ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_common.h b/drivers/input/touchscreen/FT8716/focaltech_common.h new file mode 100755 index 0000000000000..3f9abc44ba1d3 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_common.h @@ -0,0 +1,221 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/***************************************************************************** +* +* File Name: focaltech_common.h +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-16 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +#ifndef __LINUX_FOCALTECH_COMMON_H__ +#define __LINUX_FOCALTECH_COMMON_H__ + +#include "focaltech_config.h" + +/***************************************************************************** +* Macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_VERSION "Focaltech V1.3 20170306" + +#define FLAGBIT(x) (0x00000001 << (x)) +#define FLAGBITS(x, y) ((0xFFFFFFFF >> (32 - (y) - 1)) << (x)) + +#define FLAG_ICSERIALS_LEN 5 +#define FLAG_IDC_BIT 11 + +#define IC_SERIALS (FTS_CHIP_TYPE & FLAGBITS(0, FLAG_ICSERIALS_LEN-1)) +#define FTS_CHIP_IDC ((FTS_CHIP_TYPE & FLAGBIT(FLAG_IDC_BIT)) == FLAGBIT(FLAG_IDC_BIT)) + +#define FTS_CHIP_TYPE_MAPPING {{0x05, 0x86, 0x13, 0x87, 0x16, 0x87, 0xA6, 0x00, 0x00} } + +#define I2C_BUFFER_LENGTH_MAXINUM 256 +#define FILE_NAME_LENGTH 128 +#define ENABLE 1 +#define DISABLE 0 +/*register address*/ +#define FTS_REG_INT_CNT 0x8F +#define FTS_REG_FLOW_WORK_CNT 0x91 +#define FTS_REG_WORKMODE 0x00 +#define FTS_REG_WORKMODE_FACTORY_VALUE 0x40 +#define FTS_REG_WORKMODE_WORK_VALUE 0x00 +#define FTS_REG_CHIP_ID 0xA3 +#define FTS_REG_CHIP_ID2 0x9F +#define FTS_REG_POWER_MODE 0xA5 +#define FTS_REG_POWER_MODE_SLEEP_VALUE 0x03 +#define FTS_REG_FW_VER 0xA6 +#define FTS_REG_VENDOR_ID 0xA8 +#define FTS_REG_LCD_BUSY_NUM 0xAB +#define FTS_REG_FACE_DEC_MODE_EN 0xB0 +#define FTS_REG_GLOVE_MODE_EN 0xC0 +#define FTS_REG_COVER_MODE_EN 0xC1 +#define FTS_REG_CHARGER_MODE_EN 0x8B +#define FTS_REG_GESTURE_EN 0xD0 +#define FTS_REG_GESTURE_OUTPUT_ADDRESS 0xD3 +#define FTS_REG_ESD_SATURATE 0xED + + + +/***************************************************************************** +* Alternative mode (When something goes wrong, the modules may be able to solve the problem.) +*****************************************************************************/ +/* + * point report check + * default: disable + */ +#define FTS_POINT_REPORT_CHECK_EN 0 + + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct ft_chip_t { + unsigned long type; + unsigned char chip_idh; + unsigned char chip_idl; + unsigned char rom_idh; + unsigned char rom_idl; + unsigned char pramboot_idh; + unsigned char pramboot_idl; + unsigned char bootloader_idh; + unsigned char bootloader_idl; +}; + +/* i2c communication*/ +int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue); +int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue); +int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen); +int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen); +int fts_i2c_init(void); +int fts_i2c_exit(void); + +/* Gesture functions */ +#if FTS_GESTURE_EN +int fts_gesture_init(struct input_dev *input_dev, struct i2c_client *client); +int fts_gesture_exit(struct i2c_client *client); +void fts_gesture_recovery(struct i2c_client *client); +int fts_gesture_readdata(struct i2c_client *client); +int fts_gesture_suspend(struct i2c_client *i2c_client); +int fts_gesture_resume(struct i2c_client *client); +#endif + +/* Apk and functions */ +#if FTS_APK_NODE_EN +int fts_create_apk_debug_channel(struct i2c_client *client); +void fts_release_apk_debug_channel(void); +#endif + +/* ADB functions */ +#if FTS_SYSFS_NODE_EN +int fts_create_sysfs(struct i2c_client *client); +int fts_remove_sysfs(struct i2c_client *client); +#endif + +/* ESD */ +#if FTS_ESDCHECK_EN +int fts_esdcheck_init(void); +int fts_esdcheck_exit(void); +int fts_esdcheck_switch(bool enable); +int fts_esdcheck_proc_busy(bool proc_debug); +int fts_esdcheck_set_intr(bool intr); +int fts_esdcheck_suspend(void); +int fts_esdcheck_resume(void); +int fts_esdcheck_get_status(void); +#endif + +/* Production test */ +#if FTS_TEST_EN +int fts_test_init(struct i2c_client *client); +int fts_test_exit(struct i2c_client *client); +#endif + +#if FTS_LOCK_DOWN_INFO +int fts_lockdown_init(struct i2c_client *client); +#endif + +#if FTS_CAT_RAWDATA +int fts_rawdata_init(struct i2c_client *client); +#endif +/* Point Report Check*/ +#if FTS_POINT_REPORT_CHECK_EN +int fts_point_report_check_init(void); +int fts_point_report_check_exit(void); +void fts_point_report_check_queue_work(void); +#endif + +/* Other */ +extern int g_show_log; +int fts_reset_proc(int hdelayms); +int fts_wait_tp_to_valid(struct i2c_client *client); +void fts_tp_state_recovery(struct i2c_client *client); +int fts_ex_mode_init(struct i2c_client *client); +int fts_ex_mode_exit(struct i2c_client *client); +int fts_ex_mode_recovery(struct i2c_client *client); + +void fts_irq_disable(void); +void fts_irq_enable(void); + +/***************************************************************************** +* DEBUG function define here +*****************************************************************************/ +#if FTS_DEBUG_EN +#define FTS_DEBUG_LEVEL 1 + +#if (FTS_DEBUG_LEVEL == 2) +#define FTS_DEBUG(fmt, args...) printk(KERN_ERR "[FTS][%s]"fmt"\n", __func__, ##args) +#define FTS_FUNC_ENTER() printk(KERN_ERR "[FTS]%s: Enter\n", __func__) +#define FTS_FUNC_EXIT() printk(KERN_ERR "[FTS]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_DEBUG(fmt, args...) printk(KERN_ERR "[FTS]"fmt"\n", ##args) +#define FTS_FUNC_ENTER() +#define FTS_FUNC_EXIT() +#endif + +#else +#define FTS_DEBUG(fmt, args...) +#define FTS_FUNC_ENTER() +#define FTS_FUNC_EXIT() +#endif + +#define FTS_INFO(fmt, args...) do { \ + if (g_show_log) {printk(KERN_ERR "[FTS][Info]"fmt"\n", ##args); } \ + } while (0) + +#define FTS_ERROR(fmt, args...) do { \ + if (g_show_log) {printk(KERN_ERR "[FTS][Error]"fmt"\n", ##args); } \ + } while (0) + + +#if FTS_GESTURE_EN +#define GESTURE_NODE "onoff" +#define GESTURE_DATA "data" +#define DOUBLE_CLICK 143 +struct gesture_struct { + int gesture_all_switch; + unsigned long gesture_mask; +}; +#endif + +#endif /* __LINUX_FOCALTECH_COMMON_H__ */ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_config.h b/drivers/input/touchscreen/FT8716/focaltech_config.h new file mode 100755 index 0000000000000..5892431914f81 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_config.h @@ -0,0 +1,261 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/************************************************************************ +* +* File Name: focaltech_config.h +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: global configurations +* +* Version: v1.0 +* +************************************************************************/ +#ifndef _LINUX_FOCLATECH_CONFIG_H_ +#define _LINUX_FOCLATECH_CONFIG_H_ + +/**************************************************/ +/****** G: A, I: B, S: C, U: D ******************/ +/****** chip type defines, do not modify *********/ +#define _FT8716 0x87160805 +#define _FT8736 0x87360806 +#define _FT8006 0x80060807 +#define _FT8606 0x86060808 +#define _FT8607 0x86070809 +#define _FTE716 0xE716080a + +#define _FT5416 0x54160002 +#define _FT5426 0x54260002 +#define _FT5435 0x54350002 +#define _FT5436 0x54360002 +#define _FT5526 0x55260002 +#define _FT5526I 0x5526B002 +#define _FT5446 0x54460002 +#define _FT5346 0x53460002 +#define _FT5446I 0x5446B002 +#define _FT5346I 0x5346B002 +#define _FT7661 0x76610002 +#define _FT7511 0x75110002 +#define _FT7421 0x74210002 +#define _FT7681 0x76810002 +#define _FT3C47U 0x3C47D002 +#define _FT3417 0x34170002 +#define _FT3517 0x35170002 +#define _FT3327 0x33270002 +#define _FT3427 0x34270002 + +#define _FT5626 0x56260001 +#define _FT5726 0x57260001 +#define _FT5826B 0x5826B001 +#define _FT5826S 0x5826C001 +#define _FT7811 0x78110001 +#define _FT3D47 0x3D470001 +#define _FT3617 0x36170001 +#define _FT3717 0x37170001 +#define _FT3817B 0x3817B001 + +#define _FT6236U 0x6236D003 +#define _FT6336G 0x6336A003 +#define _FT6336U 0x6336D003 +#define _FT6436U 0x6436D003 + +#define _FT3267 0x32670004 +#define _FT3367 0x33670004 + + + +/*************************************************/ + +/* + * choose your ic chip type of focaltech + */ +#define FTS_CHIP_TYPE _FT8716 + +/******************* Enables *********************/ +/*********** 1 to enable, 0 to disable ***********/ + +/* + * show debug log info + * enable it for debug, disable it for release + */ +#define FTS_DEBUG_EN 1 + +#define FTS_LOCK_DOWN_INFO 1 + +#define FTS_CAT_RAWDATA 1 + +/* + * Linux MultiTouch Protocol + * 1: Protocol B(default), 0: Protocol A + */ + +#define FTS_MT_PROTOCOL_B_EN 0 + + +/* + * Report Pressure in multitouch + * 1:enable(default),0:disable +*/ +#define FTS_REPORT_PRESSURE_EN 1 + +/* + * Force touch support + * different pressure for multitouch + * 1: true pressure for force touch + * 0: constant pressure(default) + */ +#define FTS_FORCE_TOUCH_EN 0 + +/* + * Gesture function enable + * default: disable + */ +#define FTS_GESTURE_EN 1 + +/* + * ESD check & protection + * default: disable + */ +#define FTS_ESDCHECK_EN 1 + +/* + * Production test enable + * 1: enable, 0:disable(default) + */ +#define FTS_TEST_EN 1 + +/* + * Glove mode enable + * 1: enable, 0:disable(default) + */ +#define FTS_GLOVE_EN 0 +/* + * cover enable + * 1: enable, 0:disable(default) + */ +#define FTS_COVER_EN 0 +/* + * Charger enable + * 1: enable, 0:disable(default) + */ +#define FTS_CHARGER_EN 0 + +/* + * Proximity sensor + * default: disable + */ +#define FTS_PSENSOR_EN 0 + +/* + * Nodes for tools, please keep enable + */ +#define FTS_SYSFS_NODE_EN 1 +#define FTS_APK_NODE_EN 1 + +/* + * Customer power enable + * enable it when customer need control TP power + * default: disable + */ +#define FTS_POWER_SOURCE_CUST_EN 1 + +/****************************************************/ + +/********************** Upgrade ****************************/ +/* + * auto upgrade, please keep enable + */ +#ifdef WT_COMPILE_FACTORY_VERSION + #define FTS_AUTO_UPGRADE_EN 0 +#else + #define FTS_AUTO_UPGRADE_EN 1 +#endif + +/* + * auto upgrade for lcd cfg + * default: 0 + */ +#define FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN 0 + +/* auto cb check + * default: disable + */ +#define FTS_AUTO_CLB_EN 0 + +/* + * Check vendor_id number + * 0:No check vendor_id (default) + * 1/2/3: Check vendor_id for vendor compatibility + */ +#define FTS_GET_VENDOR_ID_NUM 0 + +/* + * vendor_id(s) for vendor(s) to be compatible with. + * a confirmation of vendor_id(s) is recommended. + * FTS_GET_VENDOR_ID_NUM == 0, no check vendor id, you may ignore them + * FTS_GET_VENDOR_ID_NUM >= 1, compatible with FTS_VENDOR_1_ID + * FTS_GET_VENDOR_ID_NUM >= 2, compatible with FTS_VENDOR_2_ID + * FTS_GET_VENDOR_ID_NUM == 3, compatible with FTS_VENDOR_3_ID + */ +#define FTS_VENDOR_1_ID 0x00 +#define FTS_VENDOR_2_ID 0x00 +#define FTS_VENDOR_3_ID 0x00 + +/* + * FW_APP.i file for auto upgrade, you must replace it with your own + * define your own fw_app, the sample one to be replaced is invalid + * NOTE: if FTS_GET_VENDOR_ID_NUM >= 1, it's the fw corresponding with FTS_VENDOR_1_ID + */ +#define FTS_UPGRADE_FW_APP_EBBG "include/firmware/FT8716_app_ebbg_sample.i" +#define FTS_UPGRADE_FW_APP_CSOT "include/firmware/FT8716_app_csot_sample.i" + + +/* + * if FTS_GET_VENDOR_ID_NUM >= 2, fw corrsponding with FTS_VENDOR_2_ID + * define your own fw_app, the sample one is invalid + */ +#define FTS_UPGRADE_FW2_APP "include/firmware/FT8716_app_sample.i" + +/* + * if FTS_GET_VENDOR_ID_NUM == 3, fw corrsponding with FTS_VENDOR_3_ID + * define your own fw_app, the sample one is invalid + */ +#define FTS_UPGRADE_FW3_APP "include/firmware/FT8716_app_sample.i" + +/* + * lcd_cfg.i file for lcd cfg upgrade + * define your own lcd_cfg.i, the sample one is invalid + */ + + + +/* + * upgrade stress test for debug + * enable it for upgrade debug if needed + * default: disable + */ +#define FTS_UPGRADE_STRESS_TEST 0 +/* stress test times, default: 1000 */ +#define FTS_UPGRADE_TEST_NUMBER 1000 + +/*********************************************************/ + +#endif /* _LINUX_FOCLATECH_CONFIG_H_ */ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_core.c b/drivers/input/touchscreen/FT8716/focaltech_core.c new file mode 100755 index 0000000000000..23356e002722d --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_core.c @@ -0,0 +1,1723 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/***************************************************************************** +* +* File Name: focaltech_core.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#if FTS_GESTURE_EN +extern struct gesture_struct gesture_data; +#define MXT_INPUT_EVENT_START 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define MXT_INPUT_EVENT_STYLUS_MODE_OFF 2 +#define MXT_INPUT_EVENT_STYLUS_MODE_ON 3 +#define MXT_INPUT_EVENT_WAKUP_MODE_OFF 4 +#define MXT_INPUT_EVENT_WAKUP_MODE_ON 5 +#define MXT_INPUT_EVENT_EDGE_DISABLE 6 +#define MXT_INPUT_EVENT_EDGE_FINGER 7 +#define MXT_INPUT_EVENT_EDGE_HANDGRIP 8 +#define MXT_INPUT_EVENT_EDGE_FINGER_HANDGRIP 9 +#define MXT_INPUT_EVENT_END 9 +#endif +#if defined(CONFIG_FB) +#include +#include +#elif defined(CONFIG_HAS_EARLYSUSPEND) +#include +#define FTS_SUSPEND_LEVEL 1 /* Early-suspend level */ +#endif +#include +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_NAME "fts_ts" +#define INTERVAL_READ_REG 20 +#define TIMEOUT_READ_REG 300 +#if FTS_POWER_SOURCE_CUST_EN +#define FTS_VTG_MIN_UV 1600000 +#define FTS_VTG_MAX_UV 2000000 +#define FTS_I2C_VTG_MIN_UV 1800000 +#define FTS_I2C_VTG_MAX_UV 1800000 +#endif +#define FTS_READ_TOUCH_BUFFER_DIVIDED 0 +/***************************************************************************** +* Global variable or extern global variabls/functions +******************************************************************************/ +struct i2c_client *fts_i2c_client; +struct fts_ts_data *fts_wq_data; +struct input_dev *fts_input_dev; +extern char Lcm_name[HARDWARE_MAX_ITEM_LONGTH]; + +#if FTS_DEBUG_EN +int g_show_log = 1; +#else +int g_show_log = 0; +#endif + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) +char g_sz_debug[1024] = {0}; +#endif + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static void fts_release_all_finger(void); +int fts_ts_suspend(struct device *dev); +static int fts_ts_resume(struct device *dev); + +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" + + +extern int panel_dead2tp; + +/***************************************************************************** +* Name: fts_wait_tp_to_valid +* Brief: Read chip id until TP FW become valid, need call when reset/power on/resume... +* 1. Read Chip ID per INTERVAL_READ_REG(20ms) +* 2. Timeout: TIMEOUT_READ_REG(300ms) +* Input: +* Output: +* Return: 0 - Get correct Device ID +*****************************************************************************/ +int fts_wait_tp_to_valid(struct i2c_client *client) +{ + int ret = 0; + int cnt = 0; + u8 reg_value = 0; + + do { + ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID, ®_value); + if ((ret < 0) || (reg_value != chip_types.chip_idh)) { + FTS_INFO("TP Not Ready, ReadData = 0x%x", reg_value); + } else if (reg_value == chip_types.chip_idh) { + FTS_INFO("TP Ready, Device ID = 0x%x", reg_value); + return 0; + } + cnt++; + msleep(INTERVAL_READ_REG); + } while ((cnt * INTERVAL_READ_REG) < TIMEOUT_READ_REG); + + /* error: not get correct reg data */ + return -EPERM; +} + +/***************************************************************************** +* Name: fts_recover_state +* Brief: Need execute this function when reset +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_tp_state_recovery(struct i2c_client *client) +{ + /* wait tp stable */ + fts_wait_tp_to_valid(client); + /* recover TP charger state 0x8B */ + /* recover TP glove state 0xC0 */ + /* recover TP cover state 0xC1 */ + fts_ex_mode_recovery(client); + /* recover TP gesture state 0xD0 */ +#if FTS_GESTURE_EN + if (gesture_data.gesture_all_switch) + fts_gesture_recovery(client); +#endif +} + + +/***************************************************************************** +* Name: fts_reset_proc +* Brief: Execute reset operation +* Input: hdelayms - delay time unit:ms +* Output: +* Return: +*****************************************************************************/ +int fts_reset_proc(int hdelayms) +{ + gpio_direction_output(fts_wq_data->pdata->reset_gpio, 0); + msleep(20); + gpio_direction_output(fts_wq_data->pdata->reset_gpio, 1); + msleep(hdelayms); + + return 0; +} + +/***************************************************************************** +* Name: fts_irq_disable +* Brief: disable irq +* Input: +* sync: +* Output: +* Return: +*****************************************************************************/ +void fts_irq_disable(void) +{ + unsigned long irqflags; + spin_lock_irqsave(&fts_wq_data->irq_lock, irqflags); + + if (!fts_wq_data->irq_disable) { + disable_irq_nosync(fts_wq_data->client->irq); + fts_wq_data->irq_disable = 1; + } + + spin_unlock_irqrestore(&fts_wq_data->irq_lock, irqflags); +} + +/***************************************************************************** +* Name: fts_irq_enable +* Brief: enable irq +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_irq_enable(void) +{ + unsigned long irqflags = 0; + spin_lock_irqsave(&fts_wq_data->irq_lock, irqflags); + + if (fts_wq_data->irq_disable) { + enable_irq(fts_wq_data->client->irq); + fts_wq_data->irq_disable = 0; + } + + spin_unlock_irqrestore(&fts_wq_data->irq_lock, irqflags); +} + +#if FTS_GESTURE_EN +static int fts_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + char buffer[16]; + + if (type == EV_SYN && code == SYN_CONFIG) { + sprintf(buffer, "%d", value); + + FTS_INFO("FTS:Gesture on/off : %d", value); + if (value >= MXT_INPUT_EVENT_START && value <= MXT_INPUT_EVENT_END) { + if (value == MXT_INPUT_EVENT_WAKUP_MODE_ON) { + gesture_data.gesture_all_switch = 1; + } else if (value == MXT_INPUT_EVENT_WAKUP_MODE_OFF) { + gesture_data.gesture_all_switch = 0; + } else { + gesture_data.gesture_all_switch = 0; + FTS_ERROR("Failed Open/Close Gesture Function!\n"); + return -ENOMEM; + } + } + } + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_input_dev_init +* Brief: input dev init +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_input_dev_init(struct i2c_client *client, struct fts_ts_data *data, struct input_dev *input_dev, struct fts_ts_platform_data *pdata) +{ + int err, len; + + FTS_FUNC_ENTER(); + + /* Init and register Input device */ + input_dev->name = FTS_DRIVER_NAME; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; +#if FTS_GESTURE_EN + input_dev->event = fts_input_event; +#endif + + input_set_drvdata(input_dev, data); + i2c_set_clientdata(client, data); + + __set_bit(EV_KEY, input_dev->evbit); + if (data->pdata->have_key) { + FTS_DEBUG("set key capabilities"); + for (len = 0; len < data->pdata->key_number; len++) { + input_set_capability(input_dev, EV_KEY, data->pdata->keys[len]); + } + } + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + +#if FTS_MT_PROTOCOL_B_EN + input_mt_init_slots(input_dev, pdata->max_touch_number, INPUT_MT_DIRECT); +#else + input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 0x0f, 0, 0); +#endif + input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, pdata->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, pdata->y_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 0xFF, 0, 0); +#if FTS_REPORT_PRESSURE_EN + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 0xFF, 0, 0); +#endif + + err = input_register_device(input_dev); + if (err) { + FTS_ERROR("Input device registration failed"); + goto free_inputdev; + } + + FTS_FUNC_EXIT(); + + return 0; + +free_inputdev: + input_free_device(input_dev); + FTS_FUNC_EXIT(); + return err; + +} + +/***************************************************************************** +* Power Control +*****************************************************************************/ +#if FTS_POWER_SOURCE_CUST_EN +static int fts_power_source_init(struct fts_ts_data *data) +{ + int rc; + + FTS_FUNC_ENTER(); + + data->vcc_i2c = regulator_get(&data->client->dev, "vcc_i2c"); + if (IS_ERR(data->vcc_i2c)) { + rc = PTR_ERR(data->vcc_i2c); + FTS_ERROR("Regulator get failed vcc_i2c rc=%d", rc); + goto reg_vdd_set_vtg; + } + + data->lab = regulator_get(&data->client->dev, "lab"); + if (IS_ERR(data->lab)) { + rc = PTR_ERR(data->lab); + FTS_ERROR("Regulator get failed lab rc=%d", rc); + } + + data->ibb = regulator_get(&data->client->dev, "ibb"); + if (IS_ERR(data->ibb)) { + rc = PTR_ERR(data->ibb); + FTS_ERROR("Regulator get failed ibb rc=%d", rc); + } + data->panel_iovdd = regulator_get(&data->client->dev, "panel_iovdd"); + if (IS_ERR(data->panel_iovdd)) { + + FTS_ERROR("!!! panel_iovdd not present !!!"); + } + + FTS_FUNC_EXIT(); + return 0; + + + +reg_vdd_set_vtg: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FTS_VTG_MAX_UV); + + + FTS_FUNC_EXIT(); + return rc; +} + +static int fts_power_source_ctrl(struct fts_ts_data *data, int enable) +{ + int rc; + + FTS_FUNC_ENTER(); + if (enable) { + rc = regulator_enable(data->vcc_i2c); + if (rc) { + FTS_ERROR("Regulator vcc_i2c enable failed rc=%d", rc); + } + } else { + rc = regulator_disable(data->vcc_i2c); + if (rc) { + FTS_ERROR("Regulator vcc_i2c disable failed rc=%d", rc); + } + } + FTS_FUNC_EXIT(); + return 0; +} + +static int lcd_power_ctrl(struct fts_ts_data *data, int enable) +{ + int rc; + + FTS_FUNC_ENTER(); + if (enable) { + rc = regulator_enable(data->panel_iovdd); + if (rc) { + FTS_ERROR("Regulator panel_iovdd enable failed rc=%d\n", rc); + } + + rc = regulator_enable(data->lab); + if (rc) { + FTS_ERROR("Regulator labenable failed rc=%d\n", rc); + } + + rc = regulator_enable(data->ibb); + if (rc) { + FTS_ERROR("Regulator ibb enable failed rc=%d\n", rc); + } + } else { + rc = regulator_disable(data->lab); + if (rc) { + FTS_ERROR("Regulator lab disable failed rc=%d\n", rc); + } + + rc = regulator_disable(data->ibb); + if (rc) { + FTS_ERROR("Regulator ibb disable failed rc=%d\n", rc); + } + + mdelay(10); + rc = regulator_disable(data->panel_iovdd); + if (rc) { + FTS_ERROR("Regulator panel_iovdd disable failed rc=%d\n", rc); + } + + } + FTS_FUNC_EXIT(); + return 0; +} + + +#endif + + +/***************************************************************************** +* Reprot related +*****************************************************************************/ +/***************************************************************************** +* Name: fts_release_all_finger +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_release_all_finger(void) +{ +#if FTS_MT_PROTOCOL_B_EN + unsigned int finger_count = 0; +#endif + + mutex_lock(&fts_wq_data->report_mutex); +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < fts_wq_data->pdata->max_touch_number; finger_count++) { + input_mt_slot(fts_input_dev, finger_count); + input_mt_report_slot_state(fts_input_dev, MT_TOOL_FINGER, false); + } +#else + input_mt_sync(fts_input_dev); +#endif + input_report_key(fts_input_dev, BTN_TOUCH, 0); + input_sync(fts_input_dev); + mutex_unlock(&fts_wq_data->report_mutex); +} + + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) +static void fts_show_touch_buffer(u8 *buf, int point_num) +{ + int len = point_num * FTS_ONE_TCH_LEN; + int count = 0; + int i; + + memset(g_sz_debug, 0, 1024); + if (len > (POINT_READ_BUF-3)) { + len = POINT_READ_BUF-3; + } else if (len == 0) { + len += FTS_ONE_TCH_LEN; + } + count += sprintf(g_sz_debug, "%02X,%02X,%02X", buf[0], buf[1], buf[2]); + for (i = 0; i < len; i++) { + count += sprintf(g_sz_debug+count, ",%02X", buf[i+3]); + } + +} +#endif + +static int fts_input_dev_report_key_event(struct ts_event *event, struct fts_ts_data *data) +{ + int i; + + if (data->pdata->have_key) { + if ((1 == event->touch_point || 1 == event->point_num) && + (event->au16_y[0] == data->pdata->key_y_coord)) { + + if (event->point_num == 0) { + FTS_DEBUG("Keys All Up!"); + for (i = 0; i < data->pdata->key_number; i++) { + input_report_key(data->input_dev, data->pdata->keys[i], 0); + } + } else { + for (i = 0; i < data->pdata->key_number; i++) { + if (event->au16_x[0] > (data->pdata->key_x_coords[i] - FTS_KEY_WIDTH) && + event->au16_x[0] < (data->pdata->key_x_coords[i] + FTS_KEY_WIDTH)) { + + if (event->au8_touch_event[i] == 0 || + event->au8_touch_event[i] == 2) { + input_report_key(data->input_dev, data->pdata->keys[i], 1); + FTS_DEBUG("Key%d(%d, %d) DOWN!", i, event->au16_x[0], event->au16_y[0]); + } else { + input_report_key(data->input_dev, data->pdata->keys[i], 0); + FTS_DEBUG("Key%d(%d, %d) Up!", i, event->au16_x[0], event->au16_y[0]); + } + break; + } + } + } + input_sync(data->input_dev); + return 0; + } + } + + return -EPERM; +} + +#if FTS_MT_PROTOCOL_B_EN +static int fts_input_dev_report_b(struct ts_event *event, struct fts_ts_data *data) +{ + int i = 0; + int uppoint = 0; + int touchs = 0; + for (i = 0; i < event->touch_point; i++) { + if (event->au8_finger_id[i] >= data->pdata->max_touch_number) { + break; + } + input_mt_slot(data->input_dev, event->au8_finger_id[i]); + + if (event->au8_touch_event[i] == FTS_TOUCH_DOWN || event->au8_touch_event[i] == FTS_TOUCH_CONTACT) { + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, true); + +#if FTS_REPORT_PRESSURE_EN +#if FTS_FORCE_TOUCH_EN + if (event->pressure[i] <= 0) { + FTS_ERROR("[B]Illegal pressure: %d", event->pressure[i]); + event->pressure[i] = 1; + } +#else + event->pressure[i] = 0x3f; +#endif + input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]); +#endif + + if (event->area[i] <= 0) { + FTS_ERROR("[B]Illegal touch-major: %d", event->area[i]); + event->area[i] = 1; + } + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]); + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]); + touchs |= BIT(event->au8_finger_id[i]); + data->touchs |= BIT(event->au8_finger_id[i]); + +#if FTS_REPORT_PRESSURE_EN + + +#else + +#endif + } else { + uppoint++; + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); +#if FTS_REPORT_PRESSURE_EN + input_report_abs(data->input_dev, ABS_MT_PRESSURE, 0); +#endif + data->touchs &= ~BIT(event->au8_finger_id[i]); + + } + } + + if (unlikely(data->touchs ^ touchs)) { + for (i = 0; i < data->pdata->max_touch_number; i++) { + if (BIT(i) & (data->touchs ^ touchs)) { + + input_mt_slot(data->input_dev, i); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); +#if FTS_REPORT_PRESSURE_EN + input_report_abs(data->input_dev, ABS_MT_PRESSURE, 0); +#endif + } + } + } + + data->touchs = touchs; + if (event->touch_point == uppoint) { + + input_report_key(data->input_dev, BTN_TOUCH, 0); + } else { + input_report_key(data->input_dev, BTN_TOUCH, event->touch_point > 0); + } + + input_sync(data->input_dev); + + return 0; + +} + +#else +static int fts_input_dev_report_a(struct ts_event *event, struct fts_ts_data *data) +{ + int i = 0; + int uppoint = 0; + int touchs = 0; + for (i = 0; i < event->touch_point; i++) { + + if (event->au8_touch_event[i] == FTS_TOUCH_DOWN || event->au8_touch_event[i] == FTS_TOUCH_CONTACT) { + input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, event->au8_finger_id[i]); +#if FTS_REPORT_PRESSURE_EN +#if FTS_FORCE_TOUCH_EN + if (event->pressure[i] <= 0) { + FTS_ERROR("[B]Illegal pressure: %d", event->pressure[i]); + event->pressure[i] = 1; + } +#else + event->pressure[i] = 0x3f; +#endif + input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]); +#endif + + if (event->area[i] <= 0) { + FTS_ERROR("[B]Illegal touch-major: %d", event->area[i]); + event->area[i] = 1; + } + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]); + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]); + + input_mt_sync(data->input_dev); + +#if FTS_REPORT_PRESSURE_EN + + +#else + FTS_DEBUG("[B]P%d(%d, %d)[tm:%d] DOWN!", event->au8_finger_id[i], event->au16_x[i], event->au16_y[i], event->area[i]); +#endif + } else { + uppoint++; + } + } + + data->touchs = touchs; + if (event->touch_point == uppoint) { + + input_report_key(data->input_dev, BTN_TOUCH, 0); + input_mt_sync(data->input_dev); + } else { + input_report_key(data->input_dev, BTN_TOUCH, event->touch_point > 0); + } + + input_sync(data->input_dev); + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_read_touchdata +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_read_touchdata(struct fts_ts_data *data) +{ + u8 buf[POINT_READ_BUF] = { 0 }; + u8 pointid = FTS_MAX_ID; + int ret = -1; + int i; + struct ts_event *event = &(data->event); + +#if FTS_GESTURE_EN + if (gesture_data.gesture_all_switch) { + u8 state; + if (data->suspended) { + fts_i2c_read_reg(data->client, FTS_REG_GESTURE_EN, &state); + if (state == 1) { + fts_gesture_readdata(data->client); + return 1; + } + } + } +#endif + +#if FTS_PSENSOR_EN + if ((fts_sensor_read_data(data) != 0) && (data->suspended == 1)) { + return 1; + } +#endif + + +#if FTS_READ_TOUCH_BUFFER_DIVIDED + memset(buf, 0xFF, POINT_READ_BUF); + memset(event, 0, sizeof(struct ts_event)); + + buf[0] = 0x00; + ret = fts_i2c_read(data->client, buf, 1, buf, (3 + FTS_ONE_TCH_LEN)); + if (ret < 0) { + FTS_ERROR("%s read touchdata failed.", __func__); + return ret; + } + event->touch_point = 0; + event->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F; + if (event->point_num > data->pdata->max_touch_number) + event->point_num = data->pdata->max_touch_number; + + if (event->point_num > 1) { + buf[9] = 0x09; + fts_i2c_read(data->client, buf+9, 1, buf+9, (event->point_num - 1) * FTS_ONE_TCH_LEN); + } +#else + ret = fts_i2c_read(data->client, buf, 1, buf, POINT_READ_BUF); + if (ret < 0) { + FTS_ERROR("[B]Read touchdata failed, ret: %d", ret); + return ret; + } + +#if FTS_POINT_REPORT_CHECK_EN + fts_point_report_check_queue_work(); +#endif + + memset(event, 0, sizeof(struct ts_event)); + event->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F; + if (event->point_num > data->pdata->max_touch_number) + event->point_num = data->pdata->max_touch_number; + event->touch_point = 0; +#endif + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) + fts_show_touch_buffer(buf, event->point_num); +#endif + + for (i = 0; i < data->pdata->max_touch_number; i++) { + pointid = (buf[FTS_TOUCH_ID_POS + FTS_ONE_TCH_LEN * i]) >> 4; + if (pointid >= FTS_MAX_ID) + break; + else + event->touch_point++; + + event->au16_x[i] = + (s16) (buf[FTS_TOUCH_X_H_POS + FTS_ONE_TCH_LEN * i] & 0x0F) << + 8 | (s16) buf[FTS_TOUCH_X_L_POS + FTS_ONE_TCH_LEN * i]; + event->au16_y[i] = + (s16) (buf[FTS_TOUCH_Y_H_POS + FTS_ONE_TCH_LEN * i] & 0x0F) << + 8 | (s16) buf[FTS_TOUCH_Y_L_POS + FTS_ONE_TCH_LEN * i]; + event->au8_touch_event[i] = + buf[FTS_TOUCH_EVENT_POS + FTS_ONE_TCH_LEN * i] >> 6; + event->au8_finger_id[i] = + (buf[FTS_TOUCH_ID_POS + FTS_ONE_TCH_LEN * i]) >> 4; + event->area[i] = + (buf[FTS_TOUCH_AREA_POS + FTS_ONE_TCH_LEN * i]) >> 4; + event->pressure[i] = + (s16) buf[FTS_TOUCH_PRE_POS + FTS_ONE_TCH_LEN * i]; + + if (0 == event->area[i]) + event->area[i] = 0x09; + + if (0 == event->pressure[i]) + event->pressure[i] = 0x3f; + + if ((event->au8_touch_event[i] == 0 || event->au8_touch_event[i] == 2) && (event->point_num == 0)) { + FTS_DEBUG("abnormal touch data from fw"); + return -EPERM; + } + } + if (event->touch_point == 0) { + return -EPERM; + } + return 0; +} + +/***************************************************************************** +* Name: fts_report_value +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_report_value(struct fts_ts_data *data) +{ + struct ts_event *event = &data->event; + + + + + + if (0 == fts_input_dev_report_key_event(event, data)) { + return; + } + +#if FTS_MT_PROTOCOL_B_EN + fts_input_dev_report_b(event, data); +#else + fts_input_dev_report_a(event, data); +#endif + + + return; + +} + +/***************************************************************************** +* Name: fts_ts_interrupt +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static irqreturn_t fts_ts_interrupt(int irq, void *dev_id) +{ + struct fts_ts_data *fts_ts = dev_id; + int ret = -1; + + if (!fts_ts) { + FTS_ERROR("[INTR]: Invalid fts_ts"); + return IRQ_HANDLED; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_set_intr(1); +#endif + + ret = fts_read_touchdata(fts_wq_data); + + if (ret == 0) { + mutex_lock(&fts_wq_data->report_mutex); + fts_report_value(fts_wq_data); + mutex_unlock(&fts_wq_data->report_mutex); + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_set_intr(0); +#endif + + return IRQ_HANDLED; +} + +/***************************************************************************** +* Name: fts_gpio_configure +* Brief: Configure IRQ&RESET GPIO +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_gpio_configure(struct fts_ts_data *data) +{ + int err = 0; + + FTS_FUNC_ENTER(); + /* request irq gpio */ + if (gpio_is_valid(data->pdata->irq_gpio)) { + err = gpio_request(data->pdata->irq_gpio, "fts_irq_gpio"); + if (err) { + FTS_ERROR("[GPIO]irq gpio request failed"); + goto err_irq_gpio_req; + } + + err = gpio_direction_input(data->pdata->irq_gpio); + if (err) { + FTS_ERROR("[GPIO]set_direction for irq gpio failed"); + goto err_irq_gpio_dir; + } + } + /* request reset gpio */ + if (gpio_is_valid(data->pdata->reset_gpio)) { + err = gpio_request(data->pdata->reset_gpio, "fts_reset_gpio"); + if (err) { + FTS_ERROR("[GPIO]reset gpio request failed"); + goto err_irq_gpio_dir; + } + + err = gpio_direction_output(data->pdata->reset_gpio, 1); + if (err) { + FTS_ERROR("[GPIO]set_direction for reset gpio failed"); + goto err_reset_gpio_dir; + } + } + + FTS_FUNC_EXIT(); + return 0; + +err_reset_gpio_dir: + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); +err_irq_gpio_dir: + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); +err_irq_gpio_req: + FTS_FUNC_EXIT(); + return err; +} + + +/***************************************************************************** +* Name: fts_get_dt_coords +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_get_dt_coords(struct device *dev, char *name, + struct fts_ts_platform_data *pdata) { + u32 coords[FTS_COORDS_ARR_SIZE]; + struct property *prop; + struct device_node *np = dev->of_node; + int coords_size, rc; + + prop = of_find_property(np, name, NULL); + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + + coords_size = prop->length / sizeof(u32); + if (coords_size != FTS_COORDS_ARR_SIZE) { + FTS_ERROR("invalid %s", name); + return -EINVAL; + } + + rc = of_property_read_u32_array(np, name, coords, coords_size); + if (rc && (rc != -EINVAL)) { + FTS_ERROR("Unable to read %s", name); + return rc; + } + + if (!strcmp(name, "focaltech,display-coords")) { + if (!strcmp(Lcm_name, "ft8613_ebbg_5p5_1080p_video")) { + pdata->x_min = 0; + pdata->y_min = 0; + pdata->x_max = 1080; + pdata->y_max = 1920; + } else { + pdata->x_min = coords[0]; + pdata->y_min = coords[1]; + pdata->x_max = coords[2]; + pdata->y_max = coords[3]; + } + FTS_INFO("Lcdname:%s \n", Lcm_name); + FTS_INFO("x_min:%d y_min:%d x_max:%d y_max:%d", pdata->x_min, pdata->y_min, pdata->x_max, pdata->y_max); + + } else { + FTS_ERROR("unsupported property %s", name); + return -EINVAL; + } + + return 0; +} + +/***************************************************************************** +* Name: fts_parse_dt +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_parse_dt(struct device *dev, struct fts_ts_platform_data *pdata) +{ + int rc; + struct device_node *np = dev->of_node; + u32 temp_val; + + FTS_FUNC_ENTER(); + + rc = fts_get_dt_coords(dev, "focaltech,display-coords", pdata); + if (rc) + FTS_ERROR("Unable to get display-coords"); + + /* key */ + pdata->have_key = of_property_read_bool(np, "focaltech,have-key"); + if (pdata->have_key) { + rc = of_property_read_u32(np, "focaltech,key-number", &pdata->key_number); + if (rc) { + FTS_ERROR("Key number undefined!"); + } + rc = of_property_read_u32_array(np, "focaltech,keys", + pdata->keys, pdata->key_number); + if (rc) { + FTS_ERROR("Keys undefined!"); + } + rc = of_property_read_u32(np, "focaltech,key-y-coord", &pdata->key_y_coord); + if (rc) { + FTS_ERROR("Key Y Coord undefined!"); + } + rc = of_property_read_u32_array(np, "focaltech,key-x-coords", + pdata->key_x_coords, pdata->key_number); + if (rc) { + FTS_ERROR("Key X Coords undefined!"); + } + FTS_DEBUG("%d: (%d, %d, %d), [%d, %d, %d][%d]", + pdata->key_number, pdata->keys[0], pdata->keys[1], pdata->keys[2], + pdata->key_x_coords[0], pdata->key_x_coords[1], pdata->key_x_coords[2], + pdata->key_y_coord); + } + + /* reset, irq gpio info */ + pdata->reset_gpio = of_get_named_gpio_flags(np, "focaltech,reset-gpio", 0, &pdata->reset_gpio_flags); + if (pdata->reset_gpio < 0) { + FTS_ERROR("Unable to get reset_gpio"); + } + + pdata->irq_gpio = of_get_named_gpio_flags(np, "focaltech,irq-gpio", 0, &pdata->irq_gpio_flags); + if (pdata->irq_gpio < 0) { + FTS_ERROR("Unable to get irq_gpio"); + } + + rc = of_property_read_u32(np, "focaltech,max-touch-number", &temp_val); + if (!rc) { + pdata->max_touch_number = temp_val; + FTS_DEBUG("max_touch_number=%d", pdata->max_touch_number); + } else { + FTS_ERROR("Unable to get max-touch-number"); + pdata->max_touch_number = FTS_MAX_POINTS; + } + + + + FTS_FUNC_EXIT(); + return 0; +} + +#if defined(CONFIG_FB) +/***************************************************************************** +* Name: fb_notifier_callback +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fb_notifier_callback(struct notifier_block *self, + unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct fts_ts_data *fts_data = + container_of(self, struct fts_ts_data, fb_notif); + + if (evdata && evdata->data && event == FB_EVENT_BLANK && + fts_data && fts_data->client) { + blank = evdata->data; + if (*blank == FB_BLANK_UNBLANK) + fts_ts_resume(&fts_data->client->dev); + else if (*blank == FB_BLANK_POWERDOWN) + fts_ts_suspend(&fts_data->client->dev); + } + + return 0; +} +#elif defined(CONFIG_HAS_EARLYSUSPEND) +/***************************************************************************** +* Name: fts_ts_early_suspend +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_early_suspend(struct early_suspend *handler) +{ + struct fts_ts_data *data = container_of(handler, + struct fts_ts_data, + early_suspend); + + fts_ts_suspend(&data->client->dev); +} + +/***************************************************************************** +* Name: fts_ts_late_resume +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_late_resume(struct early_suspend *handler) +{ + struct fts_ts_data *data = container_of(handler, + struct fts_ts_data, + early_suspend); + + fts_ts_resume(&data->client->dev); +} +#endif +#if 1 +static int fts_ts_pinctrl_init(struct fts_ts_data *data) +{ + int retval; + + /* Get pinctrl if target uses pinctrl */ + data->ts_pinctrl = devm_pinctrl_get(&(data->client->dev)); + if (IS_ERR_OR_NULL(data->ts_pinctrl)) { + retval = PTR_ERR(data->ts_pinctrl); + dev_dbg(&data->client->dev, + "Target does not use pinctrl %d\n", retval); + goto err_pinctrl_get; + } + + data->pinctrl_state_active + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_ACTIVE); + if (IS_ERR_OR_NULL(data->pinctrl_state_active)) { + retval = PTR_ERR(data->pinctrl_state_active); + dev_err(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_lookup; + } + + data->pinctrl_state_suspend + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_SUSPEND); + if (IS_ERR_OR_NULL(data->pinctrl_state_suspend)) { + retval = PTR_ERR(data->pinctrl_state_suspend); + dev_err(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_SUSPEND, retval); + goto err_pinctrl_lookup; + } + + data->pinctrl_state_release + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_RELEASE); + if (IS_ERR_OR_NULL(data->pinctrl_state_release)) { + retval = PTR_ERR(data->pinctrl_state_release); + dev_dbg(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_RELEASE, retval); + } + + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(data->ts_pinctrl); +err_pinctrl_get: + data->ts_pinctrl = NULL; + return retval; +} +#endif + +static void hardwareinfo_set(void *drv_data) +{ + char firmware_ver[HARDWARE_MAX_ITEM_LONGTH]; + char vendor_for_id[HARDWARE_MAX_ITEM_LONGTH]; + char ic_name[HARDWARE_MAX_ITEM_LONGTH]; + int err; + + u8 vendor_id; + u8 ic_type; + u8 fw_ver; + + fts_i2c_read_reg(fts_i2c_client, FTS_REG_VENDOR_ID, &vendor_id); + fts_i2c_read_reg(fts_i2c_client, FTS_REG_FW_VER, &fw_ver); + fts_i2c_read_reg(fts_i2c_client, FTS_REG_CHIP_ID, &ic_type); + + if (vendor_id == EBBG_VENDOR) { + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "EBBG"); + } else if (vendor_id == CSOT_VENDOR) { + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "CSOT"); + } else{ + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "Other vendor"); + } + + if (ic_type == TP_IC_FT8613) { + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT8613"); + } else{ + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "Other IC"); + } + + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x", vendor_for_id, ic_name, fw_ver); + FTS_INFO("firmware_ver=%s\n", firmware_ver); + + err = hardwareinfo_set_prop(HARDWARE_TP, firmware_ver); + if (err < 0) + return ; + + return ; + +} + + +#ifndef WT_COMPILE_FACTORY_VERSION +static int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, strlen("ffbm")); + FTS_INFO("cmd_line =%s \n", cmd_line); + if (ret == 0) { + FTS_INFO("mode: ffbm\n"); + return 1;/* factory mode*/ + } else { + FTS_INFO("mode: no ffbm\n"); + return 2;/* not factory mode*/ + } + } + FTS_INFO("Normal mode \n"); + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_ts_probe +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_shutdown(struct i2c_client *client) +{ + lcd_power_ctrl(fts_wq_data, 0); +} + +static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct fts_ts_platform_data *pdata; + struct fts_ts_data *data; + struct input_dev *input_dev; + int err; + int i; + u8 reg_addr, reg_value; + + FTS_FUNC_ENTER(); + /* 1. Get Platform data */ + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, + sizeof(struct fts_ts_platform_data), + GFP_KERNEL); + if (!pdata) { + FTS_ERROR("[MEMORY]Failed to allocate memory"); + FTS_FUNC_EXIT(); + return -ENOMEM; + } + err = fts_parse_dt(&client->dev, pdata); + if (err) { + FTS_ERROR("[DTS]DT parsing failed"); + } + } else { + pdata = client->dev.platform_data; + } + + if (!pdata) { + FTS_ERROR("Invalid pdata"); + FTS_FUNC_EXIT(); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + FTS_ERROR("I2C not supported"); + FTS_FUNC_EXIT(); + goto free_platform_data; + } + + data = devm_kzalloc(&client->dev, sizeof(struct fts_ts_data), GFP_KERNEL); + if (!data) { + FTS_ERROR("[MEMORY]Failed to allocate memory"); + FTS_FUNC_EXIT(); + return -ENOMEM; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + FTS_ERROR("[INPUT]Failed to allocate input device"); + FTS_FUNC_EXIT(); + goto free_ts_data; + } + + + + data->input_dev = input_dev; + data->client = client; + data->pdata = pdata; + + fts_wq_data = data; + fts_i2c_client = client; + fts_input_dev = input_dev; + + spin_lock_init(&fts_wq_data->irq_lock); + mutex_init(&fts_wq_data->report_mutex); + + fts_input_dev_init(client, data, input_dev, pdata); + + fts_ctpm_get_upgrade_array(); + + err = fts_gpio_configure(data); + if (err < 0) { + FTS_ERROR("[GPIO]Failed to configure the gpios"); + goto input_destroy; + } + + msleep(1); + + +#if 1 + err = fts_ts_pinctrl_init(data); + if (!err && data->ts_pinctrl) { + /* + * Pinctrl handle is optional. If pinctrl handle is found + * let pins to be configured in active state. If not + * found continue further without error. + */ + err = pinctrl_select_state(data->ts_pinctrl, + data->pinctrl_state_active); + if (err < 0) { + dev_err(&client->dev, + "failed to select pin to active state"); + } + } +#endif + + +#if FTS_POWER_SOURCE_CUST_EN + fts_power_source_init(data); + fts_power_source_ctrl(data, 1); + lcd_power_ctrl(data, 1); +#endif + fts_reset_proc(200); + + + /* check the controller id */ + reg_addr = 0xA3; + for (i = 0; i < 5; i++) { + err = fts_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + msleep(5); + else + break; + + } + if (i >= 5) { + dev_err(&client->dev, "version read failed"); + goto free_gpio; + } + + fts_wait_tp_to_valid(client); + + err = request_threaded_irq(client->irq, NULL, fts_ts_interrupt, + /*pdata->irq_gpio_flags | */IRQF_ONESHOT | IRQF_TRIGGER_FALLING, + client->dev.driver->name, data); + if (err) { + FTS_ERROR("Request irq failed!"); + goto free_gpio; + } + + fts_irq_disable(); + +#if FTS_PSENSOR_EN + if (fts_sensor_init(data) != 0) { + FTS_ERROR("fts_sensor_init failed!"); + FTS_FUNC_EXIT(); + goto irq_free; + } +#endif + +#if FTS_APK_NODE_EN + fts_create_apk_debug_channel(client); +#endif + +#if FTS_SYSFS_NODE_EN + fts_create_sysfs(client); +#endif + +#if FTS_POINT_REPORT_CHECK_EN + fts_point_report_check_init(); +#endif + + fts_ex_mode_init(client); + +#if FTS_GESTURE_EN + fts_gesture_init(input_dev, client); +#endif + +#if FTS_ESDCHECK_EN + fts_esdcheck_init(); +#endif + + fts_irq_enable(); + fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &data->fw_vendor_id); + fts_i2c_read_reg(client, FTS_REG_FW_VER, data->fw_ver); + FTS_INFO("vendor_id=0x%x\n", data->fw_vendor_id); + FTS_INFO("tp_fw=0x%x\n", data->fw_ver[0]); +#if FTS_TEST_EN + fts_test_init(client); +#endif + +#if FTS_LOCK_DOWN_INFO + fts_lockdown_init(client); +#endif + +#if FTS_CAT_RAWDATA + fts_rawdata_init(client); +#endif + + +#if FTS_AUTO_UPGRADE_EN + err = get_boot_mode(client); + if (err == 0) { + fts_ctpm_upgrade_init(); + } else { + FTS_INFO("Not in normal mode!\n"); + } + +#endif + + +#if defined(CONFIG_FB) + data->fb_notif.notifier_call = fb_notifier_callback; + err = fb_register_client(&data->fb_notif); + if (err) + FTS_ERROR("[FB]Unable to register fb_notifier: %d", err); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + FTS_SUSPEND_LEVEL; + data->early_suspend.suspend = fts_ts_early_suspend; + data->early_suspend.resume = fts_ts_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + hardwareinfo_tp_register(hardwareinfo_set, data); + + FTS_FUNC_EXIT(); + return 0; + +#if FTS_PSENSOR_EN +irq_free: + free_irq(client->irq, data); +#endif +free_gpio: + if (gpio_is_valid(pdata->reset_gpio)) + gpio_free(pdata->reset_gpio); + if (gpio_is_valid(pdata->irq_gpio)) + gpio_free(pdata->irq_gpio); + + lcd_power_ctrl(data, 0); +input_destroy: + input_unregister_device(input_dev); + input_dev = NULL; + input_free_device(input_dev); +free_ts_data: + devm_kfree(&client->dev, data); +free_platform_data: + devm_kfree(&client->dev, pdata); + + return err; + +} + +/***************************************************************************** +* Name: fts_ts_remove +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_ts_remove(struct i2c_client *client) +{ + struct fts_ts_data *data = i2c_get_clientdata(client); + + FTS_FUNC_ENTER(); + cancel_work_sync(&data->touch_event_work); + +#if FTS_PSENSOR_EN + fts_sensor_remove(data); +#endif + +#if FTS_POINT_REPORT_CHECK_EN + fts_point_report_check_exit(); +#endif + +#if FTS_APK_NODE_EN + fts_release_apk_debug_channel(); +#endif + +#if FTS_SYSFS_NODE_EN + fts_remove_sysfs(client); +#endif + + fts_ex_mode_exit(client); + +#if FTS_AUTO_UPGRADE_EN + cancel_work_sync(&fw_update_work); +#endif + +#if defined(CONFIG_FB) + if (fb_unregister_client(&data->fb_notif)) + FTS_ERROR("Error occurred while unregistering fb_notifier."); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&data->early_suspend); +#endif + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + input_unregister_device(data->input_dev); + +#if FTS_TEST_EN + fts_test_exit(client); +#endif + +#if FTS_ESDCHECK_EN + fts_esdcheck_exit(); +#endif + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_ts_suspend +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_ts_suspend(struct device *dev) +{ + struct fts_ts_data *data = fts_wq_data; + int retval = 0, i = 0; + + FTS_FUNC_ENTER(); + if (data->suspended) { + FTS_INFO("Already in suspend state"); + FTS_FUNC_EXIT(); + return -EPERM; + } +#if FTS_ESDCHECK_EN + fts_esdcheck_suspend(); +#endif + +#if FTS_GESTURE_EN + if (gesture_data.gesture_all_switch) { + + if (panel_dead2tp) { + FTS_ERROR("%s: panel_dead2tp=%d", __func__, panel_dead2tp); + lcd_power_ctrl(data, 0); + data->suspended = true; + return 0; + } + + retval = fts_gesture_suspend(data->client); + if (retval == 0) { + /* Enter into gesture mode(suspend) */ + retval = enable_irq_wake(fts_wq_data->client->irq); + if (retval) + FTS_ERROR("%s: set_irq_wake failed", __func__); + data->suspended = true; + FTS_FUNC_EXIT(); + return 0; + } + } + +#endif + +#if FTS_PSENSOR_EN + if (fts_sensor_suspend(data) != 0) { + enable_irq_wake(data->client->irq); + data->suspended = true; + return 0; + } +#endif + + fts_irq_disable(); + + for (; i < 5; i++) { + /* TP enter sleep mode */ + retval = fts_i2c_write_reg(data->client, FTS_REG_POWER_MODE, FTS_REG_POWER_MODE_SLEEP_VALUE); + if (retval < 0) { + FTS_ERROR("Set TP to sleep mode fail, ret=%d!", retval); + } else { + FTS_INFO("go into sleep mode successfully\n"); + break; + } + msleep(20); + } + + +if (!(gesture_data.gesture_all_switch)) { + lcd_power_ctrl(data, 0); + } + + data->suspended = true; + + FTS_FUNC_EXIT(); + + return 0; +} +EXPORT_SYMBOL(fts_ts_suspend); +/***************************************************************************** +* Name: fts_ts_resume +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_ts_resume(struct device *dev) +{ + struct fts_ts_data *data = dev_get_drvdata(dev); + + FTS_FUNC_ENTER(); + if (!data->suspended) { + FTS_DEBUG("Already in awake state"); + FTS_FUNC_EXIT(); + return -EPERM; + } + fts_release_all_finger(); + + + + if ((!(gesture_data.gesture_all_switch)) || panel_dead2tp) { + FTS_ERROR("%s:panel_dead2tp=%d", __func__, panel_dead2tp); + panel_dead2tp = 0; + lcd_power_ctrl(data, 1); + } + +#if (!FTS_CHIP_IDC) + fts_reset_proc(200); +#endif + + fts_tp_state_recovery(data->client); + +#if FTS_ESDCHECK_EN + fts_esdcheck_resume(); +#endif + +#if FTS_GESTURE_EN + if (gesture_data.gesture_all_switch) { + if (fts_gesture_resume(data->client) == 0) { + int err; + err = disable_irq_wake(data->client->irq); + if (err) + FTS_ERROR("%s: disable_irq_wake failed", __func__); + data->suspended = false; + FTS_FUNC_EXIT(); + return 0; + } + } + +#endif + +#if FTS_PSENSOR_EN + if (fts_sensor_resume(data) != 0) { + disable_irq_wake(data->client->irq); + data->suspended = false; + FTS_FUNC_EXIT(); + return 0; + } +#endif + + data->suspended = false; + + fts_irq_enable(); + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* I2C Driver +*****************************************************************************/ +static const struct i2c_device_id fts_ts_id[] = { + {FTS_DRIVER_NAME, 0}, + {}, +}; +MODULE_DEVICE_TABLE(i2c, fts_ts_id); + +static struct of_device_id fts_match_table[] = { + { .compatible = "focaltech,fts", }, + { }, +}; + +static struct i2c_driver fts_ts_driver = { + .probe = fts_ts_probe, + .remove = fts_ts_remove, + .shutdown = fts_ts_shutdown, + .driver = { + .name = FTS_DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = fts_match_table, + }, + .id_table = fts_ts_id, +}; + +/***************************************************************************** +* Name: fts_ts_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int __init fts_ts_init(void) +{ + int ret = 0; + + FTS_FUNC_ENTER(); + ret = i2c_add_driver(&fts_ts_driver); + if (ret != 0) { + FTS_ERROR("Focaltech touch screen driver init failed!"); + } + FTS_FUNC_EXIT(); + return ret; +} + +/***************************************************************************** +* Name: fts_ts_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void __exit fts_ts_exit(void) +{ + i2c_del_driver(&fts_ts_driver); +} + +module_init(fts_ts_init); +module_exit(fts_ts_exit); + +MODULE_AUTHOR("FocalTech Driver Team"); +MODULE_DESCRIPTION("FocalTech Touchscreen Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/FT8716/focaltech_core.h b/drivers/input/touchscreen/FT8716/focaltech_core.h new file mode 100755 index 0000000000000..b249d71fcfb1f --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_core.h @@ -0,0 +1,212 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/***************************************************************************** +* +* File Name: focaltech_core.h + +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +#ifndef __LINUX_FOCALTECH_CORE_H__ +#define __LINUX_FOCALTECH_CORE_H__ +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "focaltech_common.h" +#include "focaltech_flash.h" +#if FTS_PSENSOR_EN +#include +#endif +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define LEN_FLASH_ECC_MAX 0xFFFE + +#define FTS_WORKQUEUE_NAME "fts_wq" + +#define FTS_MAX_POINTS 10 +#define FTS_KEY_WIDTH 50 +#define FTS_ONE_TCH_LEN 6 +#define POINT_READ_BUF (3 + FTS_ONE_TCH_LEN * FTS_MAX_POINTS) + +#define FTS_MAX_ID 0x0F +#define FTS_TOUCH_X_H_POS 3 +#define FTS_TOUCH_X_L_POS 4 +#define FTS_TOUCH_Y_H_POS 5 +#define FTS_TOUCH_Y_L_POS 6 +#define FTS_TOUCH_PRE_POS 7 +#define FTS_TOUCH_AREA_POS 8 +#define FTS_TOUCH_POINT_NUM 2 +#define FTS_TOUCH_EVENT_POS 3 +#define FTS_TOUCH_ID_POS 5 +#define FTS_COORDS_ARR_SIZE 4 + +#define FTS_TOUCH_DOWN 0 +#define FTS_TOUCH_UP 1 +#define FTS_TOUCH_CONTACT 2 + +#define FTS_SYSFS_ECHO_ON(buf) ((strnicmp(buf, "1", 1) == 0) || \ + (strnicmp(buf, "on", 2) == 0)) +#define FTS_SYSFS_ECHO_OFF(buf) ((strnicmp(buf, "0", 1) == 0) || \ + (strnicmp(buf, "off", 3) == 0)) + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + + +struct fts_ts_platform_data { + u32 irq_gpio; + u32 irq_gpio_flags; + u32 reset_gpio; + u32 reset_gpio_flags; + bool have_key; + u32 key_number; + u32 keys[4]; + u32 key_y_coord; + u32 key_x_coords[4]; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; + u32 max_touch_number; +}; + +struct ts_event { + u16 au16_x[FTS_MAX_POINTS]; /*x coordinate */ + u16 au16_y[FTS_MAX_POINTS]; /*y coordinate */ + u16 pressure[FTS_MAX_POINTS]; + u8 au8_touch_event[FTS_MAX_POINTS]; /* touch event: 0 -- down; 1-- up; 2 -- contact */ + u8 au8_finger_id[FTS_MAX_POINTS]; /*touch ID */ + u8 area[FTS_MAX_POINTS]; + u8 touch_point; + u8 point_num; +}; + +struct fts_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct ts_event event; + const struct fts_ts_platform_data *pdata; +#if FTS_PSENSOR_EN + struct fts_psensor_platform_data *psensor_pdata; +#endif + struct work_struct touch_event_work; + struct workqueue_struct *ts_workqueue; + struct regulator *vdd; + struct regulator *vcc_i2c; + struct regulator *lab; + struct regulator *ibb; + struct regulator *panel_iovdd; + spinlock_t irq_lock; + struct mutex report_mutex; + u16 addr; + bool suspended; + u8 fw_ver[3]; + u8 fw_vendor_id; + int touchs; + int irq_disable; + +#if defined(CONFIG_FB) + struct notifier_block fb_notif; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + struct pinctrl_state *pinctrl_state_release; +}; + + +#if FTS_PSENSOR_EN +struct fts_psensor_platform_data { + struct input_dev *input_psensor_dev; + struct sensors_classdev ps_cdev; + int tp_psensor_opened; + char tp_psensor_data; /* 0 near, 1 far */ + struct fts_ts_data *data; +}; + +int fts_sensor_init(struct fts_ts_data *data); +int fts_sensor_read_data(struct fts_ts_data *data); +int fts_sensor_suspend(struct fts_ts_data *data); +int fts_sensor_resume(struct fts_ts_data *data); +int fts_sensor_remove(struct fts_ts_data *data); +#endif + +/***************************************************************************** +* Static variables +*****************************************************************************/ +extern struct i2c_client *fts_i2c_client; +extern struct fts_ts_data *fts_wq_data; +extern struct input_dev *fts_input_dev; + + +#define EACHOPTO_VENDOR 0x80 +#define OFILM_VENDOR 0x51 +#define JUNDA_VENDOR 0x85 +#define HOLITECH_VENDOR 0x82 +#define TXD_VENDOR 0xe9 +#define EBBG_VENDOR 0xd0 +#define CSOT_VENDOR 0x89 +#define FW_NO_UPGRADE 0 +#define FW_UPGRADING 1 +#define FW_UPGRADED 2 +#define TP_IC_FT8716 0x87 +#define TP_IC_FT8613 0x86 +extern u8 fw_upgrade_status; +#endif /* __LINUX_FOCALTECH_CORE_H__ */ diff --git a/drivers/input/touchscreen/FT8716/focaltech_esdcheck.c b/drivers/input/touchscreen/FT8716/focaltech_esdcheck.c new file mode 100755 index 0000000000000..92b05f0afcce9 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_esdcheck.c @@ -0,0 +1,466 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_esdcheck.c +* +* Author: luoguojin +* +* Created: 2016-08-03 +* +* Abstract: ESD check function +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By luougojin 2016-08-03 +* v1.1: By luougojin 2017-02-15 +* 1. Add LCD_ESD_PATCH to control idc_esdcheck_lcderror +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_ESDCHECK_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define ESDCHECK_WAIT_TIME 4000 +#define LCD_ESD_PATCH 0 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_esdcheck_st { + u8 active:1; /* 1- esd check active, need check esd 0- no esd check */ + u8 suspend:1; + u8 proc_debug:1; /* apk or adb is accessing I2C */ + u8 intr:1; /* 1- Interrupt trigger */ + u8 unused:4; + u8 flow_work_hold_cnt; /* Flow Work Cnt(reg0x91) keep a same value for x times. >=5 times is ESD, need reset */ + u8 flow_work_cnt_last; /* Save Flow Work Cnt(reg0x91) value */ + u32 hardware_reset_cnt; + u32 i2c_nack_cnt; + u32 i2c_dataerror_cnt; +}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct delayed_work fts_esdcheck_work; +static struct workqueue_struct *fts_esdcheck_workqueue; +static struct fts_esdcheck_st fts_esdcheck_data; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ +#if LCD_ESD_PATCH +/***************************************************************************** +* Name: lcd_esdcheck +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int lcd_need_reset; +static int tp_need_recovery; /* LCD reset cause Tp reset */ +int idc_esdcheck_lcderror(void) +{ + u8 val; + int ret; + + FTS_DEBUG("[ESD]Check LCD ESD"); + if ((tp_need_recovery == 1) && (lcd_need_reset == 0)) { + tp_need_recovery = 0; + /* LCD reset, need recover TP state */ + fts_tp_state_recovery(fts_i2c_client); + } + + ret = fts_i2c_read_reg(fts_i2c_client, FTS_REG_ESD_SATURATE, &val); + if (ret < 0) { + FTS_ERROR("[ESD]: Read ESD_SATURATE(0xED) failed ret=%d!", ret); + return -EIO; + } + + if (val == 0xAA) { + /* + * 1. Set flag lcd_need_reset = 1; + * 2. LCD driver need reset(recovery) LCD and set lcd_need_reset to 0 + * 3. recover TP state + */ + FTS_INFO("LCD ESD, Execute LCD reset!"); + lcd_need_reset = 1; + tp_need_recovery = 1; + } + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_esdcheck_tp_reset +* Brief: esd check algorithm +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_esdcheck_tp_reset(void) +{ + FTS_FUNC_ENTER(); + + fts_esdcheck_data.flow_work_hold_cnt = 0; + fts_esdcheck_data.hardware_reset_cnt++; + + fts_reset_proc(200); + fts_tp_state_recovery(fts_i2c_client); + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: get_chip_id +* Brief: Read Chip Id 3 times +* Input: +* Output: +* Return: 1 - Read Chip Id 3 times failed +* 0 - Read Chip Id pass +*****************************************************************************/ +static bool get_chip_id(void) +{ + int err = 0; + int i = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + + for (i = 0; i < 3; i++) { + reg_addr = FTS_REG_CHIP_ID; + err = fts_i2c_read(fts_i2c_client, ®_addr, 1, ®_value, 1); + + if (err < 0) { + FTS_ERROR("[ESD]: Read Reg 0xA3 failed ret = %d!!", err); + fts_esdcheck_data.i2c_nack_cnt++; + } else { + if ((reg_value == chip_types.chip_idh) || (reg_value == 0xEF)) {/* Upgrade sometimes can't detect */ + break; + } else { + fts_esdcheck_data.i2c_dataerror_cnt++; + } + } + } + + /* if can't get correct data in 3 times, then need hardware reset */ + if (i >= 3) { + FTS_ERROR("[ESD]: Read Chip id 3 times failed, need execute TP reset!!"); + return 1; + } + + return 0; +} + +/***************************************************************************** +* Name: get_flow_cnt +* Brief: Read flow cnt(0x91) +* Input: +* Output: +* Return: 1 - Reg 0x91(flow cnt) abnormal: hold a value for 5 times +* 0 - Reg 0x91(flow cnt) normal +*****************************************************************************/ +static bool get_flow_cnt(void) +{ + int err = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + + reg_addr = FTS_REG_FLOW_WORK_CNT; + err = fts_i2c_read(fts_i2c_client, ®_addr, 1, ®_value, 1); + if (err < 0) { + FTS_ERROR("[ESD]: Read Reg 0x91 failed ret = %d!!", err); + fts_esdcheck_data.i2c_nack_cnt++; + } else { + if (reg_value == fts_esdcheck_data.flow_work_cnt_last) { + fts_esdcheck_data.flow_work_hold_cnt++; + } else { + fts_esdcheck_data.flow_work_hold_cnt = 0; + } + + fts_esdcheck_data.flow_work_cnt_last = reg_value; + } + + /* if read flow work cnt 5 times and the value are all the same, then need hardware_reset */ + if (fts_esdcheck_data.flow_work_hold_cnt >= 5) { + FTS_DEBUG("[ESD]: Flow Work Cnt(reg0x91) keep a value for 5 times, need execute TP reset!!"); + return 1; + } + + return 0; +} + +extern int panel_dead2tp; +/***************************************************************************** +* Name: esdcheck_algorithm +* Brief: esd check algorithm +* Input: +* Output: +* Return: +*****************************************************************************/ +static int esdcheck_algorithm(void) +{ + int err = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + bool hardware_reset = 0; + + /* 1. esdcheck is interrupt, then return */ + if (fts_esdcheck_data.intr == 1) { + FTS_INFO("[ESD]: In interrupt state, not check esd, return immediately!!"); + return 0; + } + + /* 2. check power state, if suspend, no need check esd */ + if (fts_esdcheck_data.suspend == 1) { + FTS_INFO("[ESD]: In suspend, not check esd, return immediately!!"); + /* because in suspend state, adb can be used, when upgrade FW, will active ESD check(active = 1) + * But in suspend, then will don't queue_delayed_work, when resume, don't check ESD again + */ + fts_esdcheck_data.active = 0; + return 0; + } + + /* 3. check fts_esdcheck_data.proc_debug state, if 1-proc busy, no need check esd*/ + if (fts_esdcheck_data.proc_debug == 1) { + FTS_INFO("[ESD]: In apk or adb command mode, not check esd, return immediately!!"); + return 0; + } + + /* 4. In factory mode, can't check esd */ + reg_addr = FTS_REG_WORKMODE; + err = fts_i2c_read(fts_i2c_client, ®_addr, 1, ®_value, 1); + if (err < 0) { + fts_esdcheck_data.i2c_nack_cnt++; + } else if ((reg_value & 0x70) == FTS_REG_WORKMODE_FACTORY_VALUE) { + FTS_INFO("[ESD]: In factory mode, not check esd, return immediately!!"); + return 0; + } + + /* 5. IDC esd check lcd default:close */ +#if LCD_ESD_PATCH + idc_esdcheck_lcderror(); +#endif + + /* 6. Get Chip ID */ + hardware_reset = get_chip_id(); + + /* 7. get Flow work cnt: 0x91 If no change for 5 times, then ESD and reset */ + if (!hardware_reset) { + + hardware_reset = get_flow_cnt(); + } + +reg_addr = 0xED; +fts_i2c_read(fts_i2c_client, ®_addr, 1, ®_value, 1); +if (reg_value == 0xAA) { + panel_dead2tp = 1; + printk("FTS:change panel_dead2tp:%d\n", panel_dead2tp); +} + /* 8. If need hardware reset, then handle it here */ + if (hardware_reset == 1) { + fts_esdcheck_tp_reset(); + } + + + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_func +* Brief: fts_esdcheck_func +* Input: +* Output: +* Return: +*****************************************************************************/ +static void esdcheck_func(struct work_struct *work) +{ + FTS_FUNC_ENTER(); + + esdcheck_algorithm(); + + if (fts_esdcheck_data.suspend == 0) { + queue_delayed_work(fts_esdcheck_workqueue, &fts_esdcheck_work, msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } + + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: fts_esdcheck_set_intr +* Brief: interrupt flag (main used in interrupt tp report) +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_set_intr(bool intr) +{ + /* interrupt don't add debug message */ + fts_esdcheck_data.intr = intr; + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_get_status(void) +* Brief: get current status +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_get_status(void) +{ + /* interrupt don't add debug message */ + return fts_esdcheck_data.active; +} + +/***************************************************************************** +* Name: fts_esdcheck_proc_busy +* Brief: When APK or ADB command access TP via driver, then need set proc_debug, +* then will not check ESD. +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_proc_busy(bool proc_debug) +{ + fts_esdcheck_data.proc_debug = proc_debug; + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_switch +* Brief: FTS esd check function switch. +* Input: enable: 1 - Enable esd check +* 0 - Disable esd check +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_switch(bool enable) +{ + FTS_FUNC_ENTER(); + if (enable == 1) { + if (fts_esdcheck_data.active == 0) { + FTS_INFO("[ESD]: ESD check start!!"); + fts_esdcheck_data.active = 1; + queue_delayed_work(fts_esdcheck_workqueue, &fts_esdcheck_work, msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } + } else { + if (fts_esdcheck_data.active == 1) { + FTS_INFO("[ESD]: ESD check stop!!"); + fts_esdcheck_data.active = 0; + cancel_delayed_work_sync(&fts_esdcheck_work); + } + } + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_suspend +* Brief: Run when tp enter into suspend +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_suspend(void) +{ + FTS_FUNC_ENTER(); + fts_esdcheck_switch(DISABLE); + fts_esdcheck_data.suspend = 1; + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_resume +* Brief: Run when tp resume +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_resume(void) +{ + FTS_FUNC_ENTER(); + fts_esdcheck_switch(ENABLE); + fts_esdcheck_data.suspend = 0; + FTS_FUNC_EXIT(); + return 0; +} + + +/***************************************************************************** +* Name: fts_esdcheck_init +* Brief: Init and create a queue work to check esd +* Input: +* Output: +* Return: < 0: Fail to create esd check queue +*****************************************************************************/ +int fts_esdcheck_init(void) +{ + FTS_FUNC_ENTER(); + + INIT_DELAYED_WORK(&fts_esdcheck_work, esdcheck_func); + fts_esdcheck_workqueue = create_workqueue("fts_esdcheck_wq"); + if (fts_esdcheck_workqueue == NULL) { + FTS_INFO("[ESD]: Failed to create esd work queue!!"); + } + + memset((u8 *)&fts_esdcheck_data, 0, sizeof(struct fts_esdcheck_st)); + + fts_esdcheck_switch(ENABLE); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_exit +* Brief: When FTS TP driver is removed, then call this function to destory work queue +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_exit(void) +{ + FTS_FUNC_ENTER(); + + destroy_workqueue(fts_esdcheck_workqueue); + + FTS_FUNC_EXIT(); + return 0; +} +#endif /* FTS_ESDCHECK_EN */ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_ex_fun.c b/drivers/input/touchscreen/FT8716/focaltech_ex_fun.c new file mode 100755 index 0000000000000..007ff7314009e --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_ex_fun.c @@ -0,0 +1,1230 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: Focaltech_ex_fun.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +/*create apk debug channel*/ +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_AUTOCLB 4 +#define PROC_UPGRADE_INFO 5 +#define PROC_WRITE_DATA 6 +#define PROC_READ_DATA 7 +#define PROC_SET_TEST_FLAG 8 +#define PROC_SET_SLAVE_ADDR 10 +#define PROC_HW_RESET 11 +#define PROC_NAME "ftxxxx-debug" +#define WRITE_BUF_SIZE 512 +#define READ_BUF_SIZE 512 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static unsigned char proc_operate_mode = PROC_UPGRADE; +static struct proc_dir_entry *fts_proc_entry; +static struct +{ + int op; + int reg; + int value; + int result; +} g_rwreg_result; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if FTS_ESDCHECK_EN +static void esd_process(u8 *writebuf, int buflen, bool flag) +{ + if (flag) { + if ((writebuf[1] == 0xFC) && (writebuf[2] == 0x55) && (buflen == 0x03)) { + /* Upgrade command */ + FTS_DEBUG("[ESD]: Upgrade command(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + fts_esdcheck_switch(DISABLE); + } else if ((writebuf[1] == 0x00) && (writebuf[2] == 0x40) && (buflen == 0x03)) { + /* factory mode bit 4 5 6 */ + FTS_DEBUG("[ESD]: Entry factory mode(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + fts_esdcheck_switch(DISABLE); + } else if ((writebuf[1] == 0x00) && (writebuf[2] == 0x00) && (buflen == 0x03)) { + /* normal mode bit 4 5 6 */ + FTS_DEBUG("[ESD]: Exit factory mode(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + fts_esdcheck_switch(ENABLE); + } else { + fts_esdcheck_proc_busy(1); + } + } else { + if ((writebuf[1] == 0x07) && (buflen == 0x02)) { + FTS_DEBUG("[ESD]: Upgrade finish-trigger reset(07)(%x %x)!!", writebuf[0], writebuf[1]); + fts_esdcheck_switch(ENABLE); + } else { + fts_esdcheck_proc_busy(0); + } + } +} +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) +/*interface of write proc*/ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static ssize_t fts_debug_write(struct file *filp, const char __user *buff, size_t count, loff_t *ppos) +{ + unsigned char writebuf[WRITE_BUF_SIZE]; + int buflen = count; + int writelen = 0; + int ret = 0; + char tmp[25]; + + if (copy_from_user(&writebuf, buff, buflen)) { + FTS_DEBUG("[APK]: copy from user error!!"); + return -EFAULT; + } +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 1); +#endif + proc_operate_mode = writebuf[0]; + switch (proc_operate_mode) { + case PROC_UPGRADE: + { + char upgrade_file_path[FILE_NAME_LENGTH]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + FTS_DEBUG("%s\n", upgrade_file_path); + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + if (fts_updatefun_curr.upgrade_with_app_bin_file) + ret = fts_updatefun_curr.upgrade_with_app_bin_file(fts_i2c_client, upgrade_file_path); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + if (ret < 0) { + FTS_ERROR("[APK]: upgrade failed!!"); + } + } + break; + + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]); +#if FTS_ESDCHECK_EN + if (writebuf[1] == 0) { + fts_esdcheck_switch(DISABLE); + } else { + fts_esdcheck_switch(ENABLE); + } +#endif + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_SET_SLAVE_ADDR: + + ret = fts_i2c_client->addr; + FTS_DEBUG("Original i2c addr 0x%x ", ret<<1); + if (writebuf[1] != fts_i2c_client->addr) { + fts_i2c_client->addr = writebuf[1]; + FTS_DEBUG("Change i2c addr 0x%x to 0x%x", ret<<1, writebuf[1]<<1); + + } + break; + + case PROC_HW_RESET: + + sprintf(tmp, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_DEBUG("Begin HW Reset"); + fts_reset_proc(1); + } + + break; + + case PROC_AUTOCLB: + FTS_DEBUG("[APK]: autoclb!!"); + fts_ctpm_auto_clb(fts_i2c_client); + break; + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = count - 1; + if (writelen > 0) { + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + } + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 0); +#endif + + if (ret < 0) { + return ret; + } else { + return count; + } +} + +/* interface of read proc */ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static ssize_t fts_debug_read(struct file *filp, char __user *buff, size_t count, loff_t *ppos) +{ + int ret = 0; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + unsigned char buf[READ_BUF_SIZE]; + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + switch (proc_operate_mode) { + case PROC_UPGRADE: + + regaddr = FTS_REG_FW_VER; + ret = fts_i2c_read_reg(fts_i2c_client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + + if (copy_to_user(buff, buf, num_read_chars)) { + FTS_ERROR("[APK]: copy to user error!!"); + return -EFAULT; + } + + return num_read_chars; +} +static const struct file_operations fts_proc_fops = { + .owner = THIS_MODULE, + .read = fts_debug_read, + .write = fts_debug_write, +}; +#else +/* interface of write proc */ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static int fts_debug_write(struct file *filp, + const char __user *buff, unsigned long len, void *data) +{ + unsigned char writebuf[WRITE_BUF_SIZE]; + int buflen = len; + int writelen = 0; + int ret = 0; + char tmp[25]; + + if (copy_from_user(&writebuf, buff, buflen)) { + FTS_ERROR("[APK]: copy from user error!!"); + return -EFAULT; + } +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 1); +#endif + proc_operate_mode = writebuf[0]; + switch (proc_operate_mode) { + + case PROC_UPGRADE: + { + char upgrade_file_path[FILE_NAME_LENGTH]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + FTS_DEBUG("%s\n", upgrade_file_path); + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + if (fts_updatefun_curr.upgrade_with_app_bin_file) + ret = fts_updatefun_curr.upgrade_with_app_bin_file(fts_i2c_client, upgrade_file_path); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + if (ret < 0) { + FTS_ERROR("[APK]: upgrade failed!!"); + } + } + break; + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]); +#if FTS_ESDCHECK_EN + if (writebuf[1] == 0) { + fts_esdcheck_switch(DISABLE); + } else { + fts_esdcheck_switch(ENABLE); + } +#endif + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!n"); + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_SET_SLAVE_ADDR: + + ret = fts_i2c_client->addr; + FTS_DEBUG("Original i2c addr 0x%x ", ret<<1); + if (writebuf[1] != fts_i2c_client->addr) { + fts_i2c_client->addr = writebuf[1]; + FTS_DEBUG("Change i2c addr 0x%x to 0x%x", ret<<1, writebuf[1]<<1); + } + break; + + case PROC_HW_RESET: + + sprintf(tmp, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_DEBUG("Begin HW Reset"); + fts_reset_proc(1); + } + + break; + + case PROC_AUTOCLB: + FTS_DEBUG("[APK]: autoclb!!"); + fts_ctpm_auto_clb(fts_i2c_client); + break; + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = len - 1; + if (writelen > 0) { + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + } + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 0); +#endif + + if (ret < 0) { + return ret; + } else { + return len; + } +} + +/* interface of read proc */ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static int fts_debug_read(char *page, char **start, + off_t off, int count, int *eof, void *data) +{ + int ret = 0; + unsigned char buf[READ_BUF_SIZE]; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + switch (proc_operate_mode) { + case PROC_UPGRADE: + regaddr = FTS_REG_FW_VER; + ret = fts_i2c_read_reg(fts_i2c_client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + + memcpy(page, buf, num_read_chars); + return num_read_chars; +} +#endif +/************************************************************************ +* Name: fts_create_apk_debug_channel +* Brief: create apk debug channel +* Input: i2c info +* Output: no +* Return: success =0 +***********************************************************************/ +int fts_create_apk_debug_channel(struct i2c_client *client) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + fts_proc_entry = proc_create(PROC_NAME, 0777, NULL, &fts_proc_fops); +#else + fts_proc_entry = create_proc_entry(PROC_NAME, 0777, NULL); +#endif + if (NULL == fts_proc_entry) { + FTS_ERROR("Couldn't create proc entry!"); + return -ENOMEM; + } else { + FTS_INFO("Create proc entry success!"); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)) + fts_proc_entry->write_proc = fts_debug_write; + fts_proc_entry->read_proc = fts_debug_read; +#endif + } + return 0; +} +/************************************************************************ +* Name: fts_release_apk_debug_channel +* Brief: release apk debug channel +* Input: no +* Output: no +* Return: no +***********************************************************************/ +void fts_release_apk_debug_channel(void) +{ + + if (fts_proc_entry) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + proc_remove(fts_proc_entry); +#else + remove_proc_entry(PROC_NAME, NULL); +#endif +} + +/* + * fts_hw_reset interface + */ +static ssize_t fts_hw_reset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} +static ssize_t fts_hw_reset_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t count = 0; + + fts_reset_proc(200); + + count = snprintf(buf, PAGE_SIZE, "hw reset executed\n"); + + return count; +} + +/* + * fts_irq interface + */ +static ssize_t fts_irq_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[EX-FUN]enable irq"); + fts_irq_enable(); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[EX-FUN]disable irq"); + fts_irq_disable(); + } + return count; +} + +static ssize_t fts_irq_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return -EPERM; +} + +/************************************************************************ +* Name: fts_tpfwver_show +* Brief: show tp fw vwersion +* Input: device, device attribute, char buf +* Output: no +* Return: char number +***********************************************************************/ +static ssize_t fts_tpfwver_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t num_read_chars = 0; + u8 fwver = 0; + + mutex_lock(&fts_input_dev->mutex); + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + if (fts_i2c_read_reg(fts_i2c_client, FTS_REG_FW_VER, &fwver) < 0) { + num_read_chars = snprintf(buf, PAGE_SIZE, "I2c transfer error!\n"); + } +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + if (fwver == 255) + num_read_chars = snprintf(buf, PAGE_SIZE, "get tp fw version fail!\n"); + else { + num_read_chars = snprintf(buf, PAGE_SIZE, "%02X\n", fwver); + } + + mutex_unlock(&fts_input_dev->mutex); + + return num_read_chars; +} +/************************************************************************ +* Name: fts_tpfwver_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tpfwver_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +static int fts_is_hex_char(const char ch) +{ + int result = 0; + if (ch >= '0' && ch <= '9') { + result = 1; + } else if (ch >= 'a' && ch <= 'f') { + result = 1; + } else if (ch >= 'A' && ch <= 'F') { + result = 1; + } else { + result = 0; + } + + return result; +} + +static int fts_hex_char_to_int(const char ch) +{ + int result = 0; + if (ch >= '0' && ch <= '9') { + result = (int)(ch - '0'); + } else if (ch >= 'a' && ch <= 'f') { + result = (int)(ch - 'a') + 10; + } else if (ch >= 'A' && ch <= 'F') { + result = (int)(ch - 'A') + 10; + } else { + result = -1; + } + + return result; +} + +static int fts_hex_to_str(char *hex, int iHexLen, char *ch, int *iChLen) +{ + int high = 0; + int low = 0; + int tmp = 0; + int i = 0; + int iCharLen = 0; + if (hex == NULL || ch == NULL) { + return -EPERM; + } + + FTS_DEBUG("iHexLen: %d in function:%s!!\n\n", iHexLen, __func__); + + if (iHexLen % 2 == 1) { + return -ENOENT; + } + + for (i = 0; i < iHexLen; i += 2) { + high = fts_hex_char_to_int(hex[i]); + if (high < 0) { + ch[iCharLen] = '\0'; + return -ESRCH; + } + + low = fts_hex_char_to_int(hex[i+1]); + if (low < 0) { + ch[iCharLen] = '\0'; + return -ESRCH; + } + tmp = (high << 4) + low; + ch[iCharLen++] = (char)tmp; + } + ch[iCharLen] = '\0'; + *iChLen = iCharLen; + FTS_DEBUG("iCharLen: %d, iChLen: %d in function:%s!!\n\n", iCharLen, *iChLen, __func__); + return 0; +} + +static void fts_str_to_bytes(char *bufStr, int iLen, char *uBytes, int *iBytesLen) +{ + int i = 0; + int iNumChLen = 0; + + *iBytesLen = 0; + + for (i = 0; i < iLen; i++) { + if (fts_is_hex_char(bufStr[i])) { + bufStr[iNumChLen++] = bufStr[i]; + } + } + + bufStr[iNumChLen] = '\0'; + + fts_hex_to_str(bufStr, iNumChLen, uBytes, iBytesLen); +} +/************************************************************************ +* Name: fts_tprwreg_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tprwreg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&fts_input_dev->mutex); + + if (!g_rwreg_result.op) { + if (g_rwreg_result.result == 0) { + count = sprintf(buf, "Read %02X: %02X\n", g_rwreg_result.reg, g_rwreg_result.value); + } else { + count = sprintf(buf, "Read %02X failed, ret: %d\n", g_rwreg_result.reg, g_rwreg_result.result); + } + } else { + if (g_rwreg_result.result == 0) { + count = sprintf(buf, "Write %02X, %02X success\n", g_rwreg_result.reg, g_rwreg_result.value); + } else { + count = sprintf(buf, "Write %02X failed, ret: %d\n", g_rwreg_result.reg, g_rwreg_result.result); + } + } + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_tprwreg_store +* Brief: read/write register +* Input: device, device attribute, char buf, char count +* Output: print register value +* Return: char count +***********************************************************************/ +static ssize_t fts_tprwreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + ssize_t num_read_chars = 0; + int retval; + long unsigned int wmreg = 0; + u8 regaddr = 0xff, regvalue = 0xff; + u8 valbuf[5] = {0}; + + memset(valbuf, 0, sizeof(valbuf)); + mutex_lock(&fts_input_dev->mutex); + num_read_chars = count - 1; + if (num_read_chars != 2) { + if (num_read_chars != 4) { + FTS_ERROR("please input 2 or 4 character"); + goto error_return; + } + } + memcpy(valbuf, buf, num_read_chars); + retval = kstrtoul(valbuf, 16, &wmreg); + fts_str_to_bytes((char *)buf, num_read_chars, valbuf, &retval); + + if (1 == retval) { + regaddr = valbuf[0]; + retval = 0; + } else if (2 == retval) { + regaddr = valbuf[0]; + regvalue = valbuf[1]; + retval = 0; + } else + retval = -1; + + if (0 != retval) { + FTS_ERROR("%s() - ERROR: Could not convert the given input to a number. The given input was: \"%s\"", __FUNCTION__, buf); + goto error_return; + } +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + if (2 == num_read_chars) { + g_rwreg_result.op = 0; + g_rwreg_result.reg = regaddr; + /*read register*/ + regaddr = wmreg; + g_rwreg_result.result = fts_i2c_read_reg(client, regaddr, ®value); + if (g_rwreg_result.result < 0) { + FTS_ERROR("Could not read the register(0x%02x)", regaddr); + } else { + FTS_INFO("the register(0x%02x) is 0x%02x", regaddr, regvalue); + g_rwreg_result.value = regvalue; + g_rwreg_result.result = 0; + } + } else { + regaddr = wmreg>>8; + regvalue = wmreg; + + g_rwreg_result.op = 1; + g_rwreg_result.reg = regaddr; + g_rwreg_result.value = regvalue; + g_rwreg_result.result = fts_i2c_write_reg(client, regaddr, regvalue); + if (g_rwreg_result.result < 0) { + FTS_ERROR("Could not write the register(0x%02x)", regaddr); + + } else { + FTS_INFO("Write 0x%02x into register(0x%02x) successful", regvalue, regaddr); + g_rwreg_result.result = 0; + } + } +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif +error_return: + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_fwupdate_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_fwupdate_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_fwupdate_store +* Brief: upgrade from *.i +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_fwupdate_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&fts_input_dev->mutex); + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + if (fts_updatefun_curr.upgrade_with_app_i_file) + fts_updatefun_curr.upgrade_with_app_i_file(client); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_fwupgradeapp_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_fwupgradeapp_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_fwupgradeapp_store +* Brief: upgrade from app.bin +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_fwupgradeapp_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + char fwname[FILE_NAME_LENGTH]; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + + mutex_lock(&fts_input_dev->mutex); + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + if (fts_updatefun_curr.upgrade_with_app_bin_file) + fts_updatefun_curr.upgrade_with_app_bin_file(client, fwname); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_driverversion_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_driverversion_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&fts_input_dev->mutex); + + count = sprintf(buf, FTS_DRIVER_VERSION "\n"); + + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_driverversion_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_driverversion_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +#if FTS_ESDCHECK_EN +/************************************************************************ +* Name: fts_esdcheck_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_esdcheck_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + mutex_lock(&fts_input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_DEBUG("enable esdcheck"); + fts_esdcheck_switch(ENABLE); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_DEBUG("disable esdcheck"); + fts_esdcheck_switch(DISABLE); + } + mutex_unlock(&fts_input_dev->mutex); + + return -EPERM; +} + +/************************************************************************ +* Name: fts_esdcheck_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_esdcheck_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&fts_input_dev->mutex); + + count = sprintf(buf, "Esd check: %s\n", fts_esdcheck_get_status() ? "On" : "Off"); + + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +#endif +/************************************************************************ +* Name: fts_module_config_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_module_config_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + + mutex_lock(&fts_input_dev->mutex); + + count += sprintf(buf, "FTS_CHIP_TYPE: \t\t\t%04X\n", FTS_CHIP_TYPE); + count += sprintf(buf+count, "FTS_DEBUG_EN: \t\t\t%s\n", FTS_DEBUG_EN ? "ON" : "OFF"); +#if defined(FTS_MT_PROTOCOL_B_EN) + count += sprintf(buf+count, "TS_MT_PROTOCOL_B_EN: \t\t%s\n", FTS_MT_PROTOCOL_B_EN ? "ON" : "OFF"); +#endif + count += sprintf(buf+count, "FTS_GESTURE_EN: \t\t%s\n", FTS_GESTURE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_ESDCHECK_EN: \t\t%s\n", FTS_ESDCHECK_EN ? "ON" : "OFF"); +#if defined(FTS_PSENSOR_EN) + count += sprintf(buf+count, "FTS_PSENSOR_EN: \t\t%s\n", FTS_PSENSOR_EN ? "ON" : "OFF"); +#endif + count += sprintf(buf+count, "FTS_GLOVE_EN: \t\t\t%s\n", FTS_GLOVE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_COVER_EN: \t\t%s\n", FTS_COVER_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_CHARGER_EN: \t\t\t%s\n", FTS_CHARGER_EN ? "ON" : "OFF"); + + count += sprintf(buf+count, "FTS_REPORT_PRESSURE_EN: \t\t%s\n", FTS_REPORT_PRESSURE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_FORCE_TOUCH_EN: \t\t%s\n", FTS_FORCE_TOUCH_EN ? "ON" : "OFF"); + + count += sprintf(buf+count, "FTS_TEST_EN: \t\t\t%s\n", FTS_TEST_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_APK_NODE_EN: \t\t%s\n", FTS_APK_NODE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_POWER_SOURCE_CUST_EN: \t%s\n", FTS_POWER_SOURCE_CUST_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_AUTO_UPGRADE_EN: \t\t%s\n", FTS_AUTO_UPGRADE_EN ? "ON" : "OFF"); + + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_module_config_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_module_config_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_show_log_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_show_log_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&fts_input_dev->mutex); + + count = sprintf(buf, "Log: %s\n", g_show_log ? "On" : "Off"); + + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_show_log_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_show_log_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + + mutex_lock(&fts_input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_DEBUG("enable show log info/error"); + g_show_log = 1; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_DEBUG("disable show log info/error"); + g_show_log = 0; + } + mutex_unlock(&fts_input_dev->mutex); + return count; +} +/************************************************************************ +* Name: fts_dumpreg_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_dumpreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_dumpreg_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_dumpreg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + char tmp[256]; + int count = 0; + u8 regvalue = 0; + struct i2c_client *client; + + mutex_lock(&fts_input_dev->mutex); +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + client = container_of(dev, struct i2c_client, dev); + fts_i2c_read_reg(client, FTS_REG_POWER_MODE, ®value); + count += sprintf(tmp + count, "Power Mode:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_FW_VER, ®value); + count += sprintf(tmp + count, "FW Ver:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, ®value); + count += sprintf(tmp + count, "Vendor ID:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_LCD_BUSY_NUM, ®value); + count += sprintf(tmp + count, "LCD Busy Number:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, ®value); + count += sprintf(tmp + count, "Gesture Mode:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_CHARGER_MODE_EN, ®value); + count += sprintf(tmp + count, "charge stat:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_INT_CNT, ®value); + count += sprintf(tmp + count, "INT count:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_FLOW_WORK_CNT, ®value); + count += sprintf(tmp + count, "ESD count:0x%02x\n", regvalue); +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + memcpy(buf, tmp, count); + mutex_unlock(&fts_input_dev->mutex); + return count; +} + +/****************************************/ +/* sysfs */ +/* get the fw version +* example:cat fw_version +*/ +static DEVICE_ATTR(fts_fw_version, S_IRUGO|S_IWUSR, fts_tpfwver_show, fts_tpfwver_store); + +/* upgrade from *.i +* example: echo 1 > fw_update +*/ +static DEVICE_ATTR(fts_fw_update, S_IRUGO|S_IWUSR, fts_fwupdate_show, fts_fwupdate_store); +/* read and write register +* read example: echo 88 > rw_reg ---read register 0x88 +* write example:echo 8807 > rw_reg ---write 0x07 into register 0x88 +* +* note:the number of input must be 2 or 4.if it not enough,please fill in the 0. +*/ +static DEVICE_ATTR(fts_rw_reg, S_IRUGO|S_IWUSR, fts_tprwreg_show, fts_tprwreg_store); +/* upgrade from app.bin +* example:echo "*_app.bin" > upgrade_app +*/ +static DEVICE_ATTR(fts_upgrade_app, S_IRUGO|S_IWUSR, fts_fwupgradeapp_show, fts_fwupgradeapp_store); +static DEVICE_ATTR(fts_driver_version, S_IRUGO|S_IWUSR, fts_driverversion_show, fts_driverversion_store); +static DEVICE_ATTR(fts_dump_reg, S_IRUGO|S_IWUSR, fts_dumpreg_show, fts_dumpreg_store); +static DEVICE_ATTR(fts_show_log, S_IRUGO|S_IWUSR, fts_show_log_show, fts_show_log_store); +static DEVICE_ATTR(fts_module_config, S_IRUGO|S_IWUSR, fts_module_config_show, fts_module_config_store); +static DEVICE_ATTR(fts_hw_reset, S_IRUGO|S_IWUSR, fts_hw_reset_show, fts_hw_reset_store); +static DEVICE_ATTR(fts_irq, S_IRUGO|S_IWUSR, fts_irq_show, fts_irq_store); + +#if FTS_ESDCHECK_EN +static DEVICE_ATTR(fts_esd_check, S_IRUGO|S_IWUSR, fts_esdcheck_show, fts_esdcheck_store); +#endif + +/* add your attr in here*/ +static struct attribute *fts_attributes[] = { + &dev_attr_fts_fw_version.attr, + &dev_attr_fts_fw_update.attr, + &dev_attr_fts_rw_reg.attr, + &dev_attr_fts_dump_reg.attr, + &dev_attr_fts_upgrade_app.attr, + &dev_attr_fts_driver_version.attr, + &dev_attr_fts_show_log.attr, + &dev_attr_fts_module_config.attr, + &dev_attr_fts_hw_reset.attr, + &dev_attr_fts_irq.attr, +#if FTS_ESDCHECK_EN + &dev_attr_fts_esd_check.attr, +#endif + NULL +}; + +static struct attribute_group fts_attribute_group = { + .attrs = fts_attributes +}; + +/************************************************************************ +* Name: fts_create_sysfs +* Brief: create sysfs for debug +* Input: i2c info +* Output: no +* Return: success =0 +***********************************************************************/ +int fts_create_sysfs(struct i2c_client *client) +{ + int err; + err = sysfs_create_group(&client->dev.kobj, &fts_attribute_group); + if (0 != err) { + FTS_ERROR("[EX]: sysfs_create_group() failed!!"); + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return -EIO; + } else { + FTS_INFO("[EX]: sysfs_create_group() succeeded!!"); + } + return err; +} +/************************************************************************ +* Name: fts_remove_sysfs +* Brief: remove sys +* Input: i2c info +* Output: no +* Return: no +***********************************************************************/ +int fts_remove_sysfs(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return 0; +} diff --git a/drivers/input/touchscreen/FT8716/focaltech_ex_mode.c b/drivers/input/touchscreen/FT8716/focaltech_ex_mode.c new file mode 100755 index 0000000000000..9bd3e9a28290f --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_ex_mode.c @@ -0,0 +1,347 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_ex_mode.c +* +* Author: Liu WeiGuang +* +* Created: 2016-08-31 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* 2.Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* 3.Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_mode_flag { + int fts_glove_mode_flag; + int fts_cover_mode_flag; + int fts_charger_mode_flag; +}; + +struct fts_mode_flag g_fts_mode_flag; + +/***************************************************************************** +* 4.Static variables +*****************************************************************************/ + +/***************************************************************************** +* 5.Global variable or extern global variabls/functions +*****************************************************************************/ +int fts_enter_glove_mode(struct i2c_client *client, int mode); +int fts_glove_init(struct i2c_client *client); +int fts_glove_exit(struct i2c_client *client); + +int fts_enter_cover_mode(struct i2c_client *client, int mode); +int fts_cover_init(struct i2c_client *client); +int fts_cover_exit(struct i2c_client *client); + +int fts_enter_charger_mode(struct i2c_client *client, int mode); +int fts_charger_init(struct i2c_client *client); +int fts_charger_exit(struct i2c_client *client); + +/***************************************************************************** +* 6.Static function prototypes +*******************************************************************************/ + +#if FTS_GLOVE_EN +static ssize_t fts_touch_glove_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Glove: %s\n", g_fts_mode_flag.fts_glove_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_glove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_fts_mode_flag.fts_glove_mode_flag) { + FTS_INFO("[Mode]enter glove mode"); + ret = fts_enter_glove_mode(fts_i2c_client, true); + if (ret >= 0) { + g_fts_mode_flag.fts_glove_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_fts_mode_flag.fts_glove_mode_flag) { + FTS_INFO("[Mode]exit glove mode"); + ret = fts_enter_glove_mode(fts_i2c_client, false); + if (ret >= 0) { + g_fts_mode_flag.fts_glove_mode_flag = false; + } + } + } + FTS_INFO("[Mode]glove mode status: %d", g_fts_mode_flag.fts_glove_mode_flag); + return count; +} + +/************************************************************************ +* Name: fts_enter_glove_mode +* Brief: change glove mode +* Input: glove mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int fts_enter_glove_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_GLOVE_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_ERROR("[Mode]fts_enter_glove_mode write value fail"); + } + + return ret ; + +} + +/* read and write glove mode +* read example: cat fts_touch_glove_mode---read glove mode +* write example:echo 01 > fts_touch_glove_mode ---write glove mode to 01 +* +*/ +static DEVICE_ATTR (fts_glove_mode, S_IRUGO|S_IWUSR, fts_touch_glove_show, fts_touch_glove_store); + +#endif + +#if FTS_COVER_EN +static ssize_t fts_touch_cover_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Cover: %s\n", g_fts_mode_flag.fts_cover_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_cover_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_fts_mode_flag.fts_cover_mode_flag) { + FTS_INFO("[Mode]enter cover mode"); + ret = fts_enter_cover_mode(fts_i2c_client, true); + if (ret >= 0) { + g_fts_mode_flag.fts_cover_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_fts_mode_flag.fts_cover_mode_flag) { + FTS_INFO("[Mode]exit cover mode"); + ret = fts_enter_cover_mode(fts_i2c_client, false); + if (ret >= 0) { + g_fts_mode_flag.fts_cover_mode_flag = false; + } + } + } + FTS_INFO("[Mode]cover mode status: %d", g_fts_mode_flag.fts_cover_mode_flag); + return count; +} + +/************************************************************************ +* Name: fts_enter_cover_mode +* Brief: change cover mode +* Input: cover mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int fts_enter_cover_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_COVER_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_ERROR("[Mode] fts_enter_cover_mode write value fail \n"); + } + + return ret ; + +} + +/* read and write cover mode +* read example: cat fts_touch_cover_mode---read cover mode +* write example:echo 01 > fts_touch_cover_mode ---write cover mode to 01 +* +*/ +static DEVICE_ATTR (fts_cover_mode, S_IRUGO|S_IWUSR, fts_touch_cover_show, fts_touch_cover_store); + +#endif + +#if FTS_CHARGER_EN +static ssize_t fts_touch_charger_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Charger: %s\n", g_fts_mode_flag.fts_charger_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_charger_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_fts_mode_flag.fts_charger_mode_flag) { + FTS_INFO("[Mode]enter charger mode"); + ret = fts_enter_charger_mode(fts_i2c_client, true); + if (ret >= 0) { + g_fts_mode_flag.fts_charger_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_fts_mode_flag.fts_charger_mode_flag) { + FTS_INFO("[Mode]exit charger mode"); + ret = fts_enter_charger_mode(fts_i2c_client, false); + if (ret >= 0) { + g_fts_mode_flag.fts_charger_mode_flag = false; + } + } + } + FTS_INFO("[Mode]charger mode status: %d", g_fts_mode_flag.fts_charger_mode_flag); + return count; +} + +/************************************************************************ +* Name: fts_enter_charger_mode +* Brief: change charger mode +* Input: charger mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int fts_enter_charger_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_CHARGER_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_DEBUG("[Mode]fts_enter_charger_mode write value fail"); + } + + return ret ; + +} + +/* read and write charger mode +* read example: cat fts_touch_charger_mode---read charger mode +* write example:echo 01 > fts_touch_charger_mode ---write charger mode to 01 +* +*/ +static DEVICE_ATTR (fts_charger_mode, S_IRUGO|S_IWUSR, fts_touch_charger_show, fts_touch_charger_store); + +#endif + +static struct attribute *fts_touch_mode_attrs[] = { +#if FTS_GLOVE_EN + &dev_attr_fts_glove_mode.attr, +#endif + +#if FTS_COVER_EN + &dev_attr_fts_cover_mode.attr, +#endif + +#if FTS_CHARGER_EN + &dev_attr_fts_charger_mode.attr, +#endif + + NULL, +}; + +static struct attribute_group fts_touch_mode_group = { + .attrs = fts_touch_mode_attrs, +}; + +int fts_ex_mode_init(struct i2c_client *client) +{ + int err = 0; + + g_fts_mode_flag.fts_glove_mode_flag = false; + g_fts_mode_flag.fts_cover_mode_flag = false; + g_fts_mode_flag.fts_charger_mode_flag = false; + + err = sysfs_create_group(&client->dev.kobj, &fts_touch_mode_group); + if (0 != err) { + FTS_ERROR("[Mode]create sysfs failed."); + sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group); + return -EIO; + } else { + FTS_DEBUG("[Mode]create sysfs succeeded"); + } + + return err; + +} + +int fts_ex_mode_exit(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group); + return 0; +} + +int fts_ex_mode_recovery(struct i2c_client *client) +{ + int ret = 0; +#if FTS_GLOVE_EN + if (g_fts_mode_flag.fts_glove_mode_flag) + ret = fts_enter_glove_mode(client, true); +#endif + +#if FTS_COVER_EN + if (g_fts_mode_flag.fts_cover_mode_flag) + ret = fts_enter_cover_mode(client, true); +#endif + +#if FTS_CHARGER_EN + if (g_fts_mode_flag.fts_charger_mode_flag) + ret = fts_enter_charger_mode(client, true); +#endif + + return ret; +} + diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash.c b/drivers/input/touchscreen/FT8716/focaltech_flash.c new file mode 100755 index 0000000000000..f9055208b55f7 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash.c @@ -0,0 +1,723 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_flash.c +* +* Author: fupeipei +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#include "focaltech_flash.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ +struct ft_chip_t chip_types; +u8 fw_upgrade_status = FW_NO_UPGRADE; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +/* Upgrade FW/PRAMBOOT/LCD CFG */ +u8 CTPM_FW[] = { +#include FTS_UPGRADE_FW_APP_EBBG +}; + +u8 CTPM_FW1[] = { +#include FTS_UPGRADE_FW_APP_CSOT +}; + +#if (FTS_GET_VENDOR_ID_NUM >= 2) +u8 CTPM_FW2[] = { +#include FTS_UPGRADE_FW2_APP +}; +#endif + +#if (FTS_GET_VENDOR_ID_NUM >= 3) +u8 CTPM_FW3[] = { +#include FTS_UPGRADE_FW3_APP +}; +#endif + +u8 aucFW_PRAM_BOOT[] = { +#ifdef FTS_UPGRADE_PRAMBOOT +#include FTS_UPGRADE_PRAMBOOT +#endif +}; + +u8 CTPM_LCD_CFG[] = { +#ifdef FTS_UPGRADE_LCD_CFG +#include FTS_UPGRADE_LCD_CFG +#endif +}; + +struct fts_upgrade_fun fts_updatefun_curr; +struct workqueue_struct *touch_wq; +struct work_struct fw_update_work; +u8 *g_fw_file; +int g_fw_len; +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/************************************************************************ +* Name: fts_ctpm_upgrade_delay +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +void fts_ctpm_upgrade_delay(u32 i) +{ + do { + i--; + } while (i > 0); +} + +/************************************************************************ +* Name: fts_ctpm_i2c_hid2std +* Brief: HID to I2C +* Input: i2c info +* Output: no +* Return: fail =0 +***********************************************************************/ +int fts_ctpm_i2c_hid2std(struct i2c_client *client) +{ +#if (FTS_CHIP_IDC) + return 0; +#else + u8 buf[5] = {0}; + int bRet = 0; + + buf[0] = 0xeb; + buf[1] = 0xaa; + buf[2] = 0x09; + bRet = fts_i2c_write(client, buf, 3); + msleep(10); + buf[0] = buf[1] = buf[2] = 0; + fts_i2c_read(client, buf, 0, buf, 3); + + if ((0xeb == buf[0]) && (0xaa == buf[1]) && (0x08 == buf[2])) { + FTS_DEBUG("hidi2c change to stdi2c successful!!"); + bRet = 1; + } else { + FTS_ERROR("hidi2c change to stdi2c error!!"); + bRet = 0; + } + + return bRet; +#endif +} + +/************************************************************************ +* Name: fts_get_chip_types +* Brief: get correct chip information +* Input: +* Output: +* Return: +***********************************************************************/ +void fts_get_chip_types(void) +{ + struct ft_chip_t ctype[] = FTS_CHIP_TYPE_MAPPING; + int ic_type = 0; + + if (sizeof(ctype) != sizeof(struct ft_chip_t)) /* only one array */ + ic_type = IC_SERIALS - 1; + + chip_types = ctype[ic_type]; + + FTS_INFO("CHIP TYPE ID = 0x%02x%02x", chip_types.chip_idh, chip_types.chip_idl); +} + +/************************************************************************ +* Name: fts_ctpm_get_upgrade_array +* Brief: decide which ic +* Input: no +* Output: get ic info in fts_updateinfo_curr +* Return: no +***********************************************************************/ +void fts_ctpm_get_upgrade_array(void) +{ + + FTS_FUNC_ENTER(); + + fts_get_chip_types(); + + fts_ctpm_i2c_hid2std(fts_i2c_client); + + /* Get functin pointer */ + memcpy(&fts_updatefun_curr, &fts_updatefun, sizeof(struct fts_upgrade_fun)); + + FTS_FUNC_EXIT(); +} + +/************************************************************************ +* Name: fts_ctpm_rom_or_pram_reset +* Brief: RST CMD(07), reset to romboot(maybe->bootloader) +* Input: +* Output: +* Return: +***********************************************************************/ +void fts_ctpm_rom_or_pram_reset(struct i2c_client *client) +{ + u8 rst_cmd = FTS_REG_RESET_FW; + + FTS_INFO("[UPGRADE]******Reset to romboot/bootloader******"); + fts_i2c_write(client, &rst_cmd, 1); + /* The delay can't be changed */ + msleep(300); +} + +/************************************************************************ +* Name: fts_ctpm_auto_clb +* Brief: auto calibration +* Input: i2c info +* Output: no +* Return: 0 +***********************************************************************/ +int fts_ctpm_auto_clb(struct i2c_client *client) +{ +#if FTS_AUTO_CLB_EN + u8 uc_temp = 0x00; + u8 i = 0; + + /*start auto CLB */ + msleep(200); + + fts_i2c_write_reg(client, 0, FTS_REG_WORKMODE_FACTORY_VALUE); + /*make sure already enter factory mode */ + msleep(100); + /*write command to start calibration */ + fts_i2c_write_reg(client, 2, 0x4); + msleep(300); + if ((chip_types.chip_idh == 0x11) || (chip_types.chip_idh == 0x12) || (chip_types.chip_idh == 0x13) || (chip_types.chip_idh == 0x14)) { + for (i = 0; i < 100; i++) { + fts_i2c_read_reg(client, 0x02, &uc_temp); + if (0x02 == uc_temp || + 0xFF == uc_temp) { + break; + } + msleep(20); + } + } else { + for (i = 0; i < 100; i++) { + fts_i2c_read_reg(client, 0, &uc_temp); + if (0x0 == ((uc_temp&0x70)>>4)) { + break; + } + msleep(20); + } + } + fts_i2c_write_reg(client, 0, 0x40); + msleep(200); + fts_i2c_write_reg(client, 2, 0x5); + msleep(300); + fts_i2c_write_reg(client, 0, FTS_REG_WORKMODE_WORK_VALUE); + msleep(300); +#endif + + return 0; +} + +/************************************************************************ +* Name: fts_GetFirmwareSize +* Brief: get file size +* Input: file name +* Output: no +* Return: file size +***********************************************************************/ +int fts_GetFirmwareSize(char *firmware_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[FILE_NAME_LENGTH]; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTXXXX_INI_FILEPATH_CONFIG, firmware_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_ERROR("error occured while opening file %s", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +/************************************************************************ +* Name: fts_ReadFirmware +* Brief: read firmware buf for .bin file. +* Input: file name, data buf +* Output: data buf +* Return: 0 +***********************************************************************/ +int fts_ReadFirmware(char *firmware_name, u8 *firmware_buf) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[FILE_NAME_LENGTH]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTXXXX_INI_FILEPATH_CONFIG, firmware_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_ERROR("[UPGRADE] Error occured while opening file %s.\n", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, firmware_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +/************************************************************************ +* Name: fts_getsize +* Brief: Get different file's size +* Input: +* Output: +* Return: file's size +***********************************************************************/ +u32 fts_getsize(u8 fw_type) +{ + int fw_len = 0; + + if (fw_type == FW_SIZE) + fw_len = sizeof(CTPM_FW); + if (fw_type == FW1_SIZE) + fw_len = sizeof(CTPM_FW1); +#if (FTS_GET_VENDOR_ID_NUM >= 2) + else if (fw_type == FW2_SIZE) + fw_len = sizeof(CTPM_FW2); +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 3) + else if (fw_type == FW3_SIZE) + fw_len = sizeof(CTPM_FW3); +#endif +#if FTS_CHIP_IDC + else if (fw_type == PRAMBOOT_SIZE) + fw_len = sizeof(aucFW_PRAM_BOOT); +#endif +#if (FTS_CHIP_TYPE == _FT8006) + else if (fw_type == LCD_CFG_SIZE) + fw_len = sizeof(CTPM_LCD_CFG); +#endif + + return fw_len; +} + +/************************************************************************ +* Name: fts_ctpm_get_pram_or_rom_id +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +enum FW_STATUS fts_ctpm_get_pram_or_rom_id(struct i2c_client *client) +{ + u8 buf[4]; + u8 reg_val[2] = {0}; + enum FW_STATUS inRomBoot = FTS_RUN_IN_ERROR; + + fts_ctpm_i2c_hid2std(client); + + /*Enter upgrade mode*/ + /*send 0x55 in time windows*/ + buf[0] = FTS_UPGRADE_55; + buf[1] = FTS_UPGRADE_AA; + fts_i2c_write(client, buf, 2); + + msleep(20); + + buf[0] = 0x90; + buf[1] = buf[2] = buf[3] = 0x00; + fts_i2c_read(client, buf, 4, reg_val, 2); + + FTS_DEBUG("[UPGRADE] Read ROM/PRAM/Bootloader id:0x%02x%02x", reg_val[0], reg_val[1]); + if ((reg_val[0] == 0x00) || (reg_val[0] == 0xFF)) { + inRomBoot = FTS_RUN_IN_ERROR; + } else if (reg_val[0] == chip_types.pramboot_idh && reg_val[1] == chip_types.pramboot_idl) { + inRomBoot = FTS_RUN_IN_PRAM; + } else if (reg_val[0] == chip_types.rom_idh && reg_val[1] == chip_types.rom_idl) { + inRomBoot = FTS_RUN_IN_ROM; + } else if (reg_val[0] == chip_types.bootloader_idh && reg_val[1] == chip_types.bootloader_idl) { + inRomBoot = FTS_RUN_IN_BOOTLOADER; + } + + return inRomBoot; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_file +* Brief: get app file by Vendor ID +* Input: +* Output: +* Return: <0: vendor id not correct,not upgrade +***********************************************************************/ +int fts_ctpm_get_i_file(struct i2c_client *client, int fw_valid) +{ + int ret; + + if (fts_updatefun_curr.get_i_file) + ret = fts_updatefun_curr.get_i_file(client, fw_valid); + else + ret = -EIO; + + return ret; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_ver +* Brief: get app file version +* Input: +* Output: +* Return: fw version +***********************************************************************/ +int fts_ctpm_get_app_ver(void) +{ + int i_ret = 0; + + if (fts_updatefun_curr.get_app_i_file_ver) + i_ret = fts_updatefun_curr.get_app_i_file_ver(); + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade +* Brief: fw upgrade entry funciotn +* Input: +* Output: +* Return: 0 - upgrade successfully +* <0 - upgrade failed +***********************************************************************/ +int fts_ctpm_fw_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + if (fts_updatefun_curr.upgrade_with_app_i_file) + i_ret = fts_updatefun_curr.upgrade_with_app_i_file(client); + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade +* Brief: fw upgrade entry funciotn +* Input: +* Output: +* Return: 0 - upgrade successfully +* <0 - upgrade failed +***********************************************************************/ +int fts_ctpm_lcd_cfg_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + if (fts_updatefun_curr.upgrade_with_lcd_cfg_i_file) + i_ret = fts_updatefun_curr.upgrade_with_lcd_cfg_i_file(client); + + return i_ret; +} + +#if (!(FTS_UPGRADE_STRESS_TEST)) +/************************************************************************ +* Name: fts_ctpm_check_fw_status +* Brief: Check App is valid or not +* Input: +* Output: +* Return: -EIO - I2C communication error +* FTS_RUN_IN_APP - APP valid +* 0 - APP invalid +***********************************************************************/ +static int fts_ctpm_check_fw_status(struct i2c_client *client) +{ + u8 chip_id1 = 0; + u8 chip_id2 = 0; + int fw_status = FTS_RUN_IN_ERROR; + int i = 0; + int ret = 0; + int i2c_noack_retry = 0; + + for (i = 0; i < 5; i++) { + ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID, &chip_id1); + if (ret < 0) { + i2c_noack_retry++; + continue; + } + ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID2, &chip_id2); + if (ret < 0) { + i2c_noack_retry++; + continue; + } + + if (((chip_id1 == chip_types.chip_idh) || (chip_id1 == 87)) +#if FTS_CHIP_IDC + && ((chip_id2 == chip_types.chip_idl) || (chip_id2 == 16)) +#endif + ) { + fw_status = FTS_RUN_IN_APP; + break; + } + } + + FTS_DEBUG("[UPGRADE]: chip_id = %02x%02x, chip_types.chip_idh = %02x%02x", + chip_id1, chip_id2, chip_types.chip_idh, chip_types.chip_idl); + + /* I2C No ACK 5 times, then return -EIO */ + if (i2c_noack_retry >= 5) + return -EIO; + + /* I2C communication ok, but not get correct ID, need check pram/rom/bootloader */ + if (i >= 5) { + fw_status = fts_ctpm_get_pram_or_rom_id(client); + } + + return fw_status; +} + +/************************************************************************ +* Name: fts_ctpm_check_fw_ver +* Brief: Check vendor id is valid or not +* Input: +* Output: +* Return: 1 - vendor id valid +* 0 - vendor id invalid +***********************************************************************/ +static int fts_ctpm_check_fw_ver(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + u8 uc_host_fm_ver = 0; + + fts_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + uc_host_fm_ver = fts_ctpm_get_app_ver(); + + FTS_DEBUG("[UPGRADE]: uc_tp_fm_ver = 0x%x, uc_host_fm_ver = 0x%x!!", uc_tp_fm_ver, uc_host_fm_ver); + if (uc_tp_fm_ver < uc_host_fm_ver) { + return 1; + } else { + return 0; + } +} + +/************************************************************************ +* Name: fts_ctpm_check_need_upgrade +* Brief: +* Input: +* Output: +* Return: 1 - Need upgrade +* 0 - No upgrade +***********************************************************************/ +static int fts_ctpm_check_need_upgrade(struct i2c_client *client) +{ + int fw_status = 0; + int bUpgradeFlag = false; + + FTS_FUNC_ENTER(); + + /* 1. veriry FW APP is valid or not */ + fw_status = fts_ctpm_check_fw_status(client); + FTS_DEBUG("[UPGRADE]: fw_status = %d!!", fw_status); + if (fw_status < 0) { + /* I2C no ACK, return immediately */ + FTS_ERROR("[UPGRADE]******I2C NO ACK,exit upgrade******"); + return -EIO; + } else if (fw_status == FTS_RUN_IN_ERROR) { + FTS_ERROR("[UPGRADE]******IC Type Fail******"); + } else if (fw_status == FTS_RUN_IN_APP) { + FTS_INFO("[UPGRADE]**********FW APP valid**********"); + + if (fts_ctpm_get_i_file(client, 1) != 0) { + FTS_DEBUG("[UPGRADE]******Get upgrade file(fw) fail******"); + return -EIO; + } + + if (fts_ctpm_check_fw_ver(client) == 1) { + FTS_DEBUG("[UPGRADE]**********need upgrade fw**********"); + bUpgradeFlag = true; + } else { + FTS_DEBUG("[UPGRADE]**********Don't need upgrade fw**********"); + bUpgradeFlag = false; + } + } else { + /* if app is invalid, reset to run ROM */ + FTS_INFO("[UPGRADE]**********FW APP invalid**********"); + fts_ctpm_rom_or_pram_reset(client); + if (fts_ctpm_get_i_file(client, 0) != 0) { + FTS_DEBUG("[UPGRADE]******Get upgrade file(flash) fail******"); + fts_ctpm_rom_or_pram_reset(client); + return -EIO; + } + fts_ctpm_rom_or_pram_reset(client); + bUpgradeFlag = true; + } + + FTS_FUNC_EXIT(); + + return bUpgradeFlag; +} + +/************************************************************************ +* Name: fts_ctpm_auto_upgrade +* Brief: auto upgrade +* Input: +* Output: +* Return: 0 - no upgrade +***********************************************************************/ +int fts_ctpm_auto_upgrade(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + int i_ret = 0; + int bUpgradeFlag = false; + u8 uc_upgrade_times = 0; + + FTS_DEBUG("[UPGRADE]********************check upgrade need or not********************"); + bUpgradeFlag = fts_ctpm_check_need_upgrade(client); + FTS_DEBUG("[UPGRADE]**********bUpgradeFlag = 0x%x**********", bUpgradeFlag); + if (bUpgradeFlag <= 0) { + FTS_DEBUG("[UPGRADE]**********No Upgrade, exit**********"); + return 0; + } else { + /* FW Upgrade */ + fw_upgrade_status = FW_UPGRADING; + do { + uc_upgrade_times++; + FTS_DEBUG("[UPGRADE]********************star upgrade(%d)********************", uc_upgrade_times); + + i_ret = fts_ctpm_fw_upgrade(client); + if (i_ret == 0) { + /* upgrade success */ + fts_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + FTS_DEBUG("[UPGRADE]********************Success upgrade to new fw version 0x%x********************", uc_tp_fm_ver); + + fts_ctpm_auto_clb(client); + break; + } else { + /* upgrade fail, reset to run ROM BOOT.. + * if app in flash is ok, TP will work success + */ + FTS_ERROR("[UPGRADE]********************upgrade fail, reset now********************"); + fts_ctpm_rom_or_pram_reset(client); + } + } while (uc_upgrade_times < 2); /* if upgrade fail, upgrade again. then return */ + fw_upgrade_status = FW_UPGRADED; + } + + return i_ret; +} +#endif + +#if FTS_AUTO_UPGRADE_EN +static void fts_ctpm_update_work_func(struct work_struct *work) +{ + int i_ret = 0; + + FTS_DEBUG("[UPGRADE]******************************FTS enter upgrade******************************"); + fts_irq_disable(); + + /* esd check */ +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + + i_ret = fts_ctpm_auto_upgrade(fts_i2c_client); + if (i_ret < 0) + FTS_ERROR("[UPGRADE]**********TP FW upgrade failed**********"); + +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN + msleep(2000); + + /* lcd_cfg upgrade */ + i_ret = fts_ctpm_lcd_cfg_upgrade(fts_i2c_client); + if (i_ret < 0) + FTS_ERROR("[UPGRADE]**********LCD cfg upgrade failed*********"); +#endif + +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + + FTS_DEBUG("[UPGRADE]******************************FTS exit upgrade******************************"); +} + +/***************************************************************************** +* Name: fts_ctpm_upgrade_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_ctpm_upgrade_init(void) +{ + FTS_FUNC_ENTER(); + + touch_wq = create_singlethread_workqueue("touch_wq"); + if (touch_wq) { + INIT_WORK(&fw_update_work, fts_ctpm_update_work_func); + queue_work(touch_wq, &fw_update_work); + } else { + FTS_ERROR("[UPGRADE]create_singlethread_workqueue failed\n"); + } + + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: fts_ctpm_upgrade_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_ctpm_upgrade_exit(void) +{ + FTS_FUNC_ENTER(); + destroy_workqueue(touch_wq); + FTS_FUNC_EXIT(); +} + +#endif /* #if FTS_AUTO_UPGRADE_EN */ diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash.h b/drivers/input/touchscreen/FT8716/focaltech_flash.h new file mode 100755 index 0000000000000..fe65ce4b7663e --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash.h @@ -0,0 +1,131 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_flash.h +* +* Author: fupeipei +* +* Created: 2016-08-07 +* +* Abstract: +* +************************************************************************/ +#ifndef __LINUX_FOCALTECH_FLASH_H__ +#define __LINUX_FOCALTECH_FLASH_H__ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_flash/focaltech_upgrade_common.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_REG_ECC 0xCC +#define FTS_RST_CMD_REG2 0xBC +#define FTS_READ_ID_REG 0x90 +#define FTS_ERASE_APP_REG 0x61 +#define FTS_ERASE_PARAMS_CMD 0x63 +#define FTS_FW_WRITE_CMD 0xBF +#define FTS_REG_RESET_FW 0x07 +#define FTS_RST_CMD_REG1 0xFC +#define LEN_FLASH_ECC_MAX 0xFFFE + +#define FTS_PACKET_LENGTH 128 +#define FTS_SETTING_BUF_LEN 128 + +#define FTS_UPGRADE_LOOP 30 +#define AUTO_CLB_NEED 1 +#define AUTO_CLB_NONEED 0 +#define FTS_UPGRADE_AA 0xAA +#define FTS_UPGRADE_55 0x55 +#define FTXXXX_INI_FILEPATH_CONFIG "/sdcard/" + +enum FW_STATUS { + FTS_RUN_IN_ERROR, + FTS_RUN_IN_APP, + FTS_RUN_IN_ROM, + FTS_RUN_IN_PRAM, + FTS_RUN_IN_BOOTLOADER +}; + +enum FILE_SIZE_TYPE { + FW_SIZE, + FW1_SIZE, + FW2_SIZE, + FW3_SIZE, + PRAMBOOT_SIZE, + LCD_CFG_SIZE +}; + +/* pramboot for 8716 */ +#define FTS_PRAMBOOT_8716 "include/pramboot/FT8716_Pramboot_V0.5_20160723.i" +#define FTS_UPGRADE_PRAMBOOT FTS_PRAMBOOT_8716 + + +#define FTS_PRAMBOOT_E716 "include/pramboot/FT8716_Pramboot_V0.5_20160723.i" +#define FTS_UPGRADE_PRAMBOOT FTS_PRAMBOOT_8716 + + + + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* IC info */ + +struct fts_upgrade_fun { + int (*get_i_file)(struct i2c_client *, int); + int (*get_app_bin_file_ver)(char *); + int (*get_app_i_file_ver)(void); + int (*upgrade_with_app_i_file)(struct i2c_client *); + int (*upgrade_with_app_bin_file)(struct i2c_client *, char *); + int (*upgrade_with_lcd_cfg_i_file)(struct i2c_client *); + int (*upgrade_with_lcd_cfg_bin_file)(struct i2c_client *, char *); +}; +extern struct fts_upgrade_fun fts_updatefun; + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern u8 CTPM_FW[]; +extern u8 CTPM_FW1[]; +extern u8 CTPM_FW2[]; +extern u8 CTPM_FW3[]; +extern u8 aucFW_PRAM_BOOT[]; +extern u8 CTPM_LCD_CFG[]; +extern u8 *g_fw_file; +extern int g_fw_len; +extern struct fts_upgrade_fun fts_updatefun_curr; +extern struct ft_chip_t chip_types; + +#if FTS_AUTO_UPGRADE_EN +extern struct workqueue_struct *touch_wq; +extern struct work_struct fw_update_work; +#endif + +void fts_ctpm_upgrade_init(void); +void fts_ctpm_upgrade_exit(void); +void fts_ctpm_upgrade_delay(u32 i); +void fts_ctpm_get_upgrade_array(void); +int fts_ctpm_auto_upgrade(struct i2c_client *client); +int fts_fw_upgrade(struct device *dev, bool force); +int fts_ctpm_auto_clb(struct i2c_client *client); + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +u32 fts_getsize(u8 fw_type); +int fts_GetFirmwareSize(char *firmware_name); +int fts_ctpm_i2c_hid2std(struct i2c_client *client); +int fts_ReadFirmware(char *firmware_name, u8 *firmware_buf); +void fts_ctpm_rom_or_pram_reset(struct i2c_client *client); +enum FW_STATUS fts_ctpm_get_pram_or_rom_id(struct i2c_client *client); +#endif + + diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash/Makefile b/drivers/input/touchscreen/FT8716/focaltech_flash/Makefile new file mode 100755 index 0000000000000..af1e9ce00953f --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for the focaltech touchscreen drivers. +# + +# Each configuration option enables a list of files. + + +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_upgrade_idc.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_upgrade_ft8716.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_upgrade_test.o diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_common.h b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_common.h new file mode 100755 index 0000000000000..9d433fb072af4 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_common.h @@ -0,0 +1,57 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_upgrade_common.h +* +* Author: fupeipei +* +* Created: 2016-08-16 +* +* Abstract: +* +************************************************************************/ +#ifndef __LINUX_FOCALTECH_UPGRADE_COMMON_H__ +#define __LINUX_FOCALTECH_UPGRADE_COMMON_H__ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_flash.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +int fts_ctpm_erase_flash(struct i2c_client *client); +int fts_ctpm_pramboot_ecc(struct i2c_client *client); +bool fts_ctpm_check_run_state(struct i2c_client *client, int state); +void fts_ctpm_start_pramboot(struct i2c_client *client); +int fts_ctpm_start_fw_upgrade(struct i2c_client *client); +bool fts_ctpm_check_in_pramboot(struct i2c_client *client); +int fts_ctpm_upgrade_idc_init(struct i2c_client *client); +int fts_ctpm_write_app_for_idc(struct i2c_client *client, u32 length, u8 *readbuf); +int fts_ctpm_upgrade_ecc(struct i2c_client *client, u32 startaddr, u32 length); +int fts_ctpm_write_pramboot_for_idc(struct i2c_client *client, u32 length, u8 *readbuf); +int fts_writeflash(struct i2c_client *client, u32 writeaddr, u32 length, u8 *readbuf, u32 cnt); +bool fts_check_app_bin_valid_idc(u8 *pbt_buf); + +int fts_ctpm_get_app_ver(void); +int fts_ctpm_fw_upgrade(struct i2c_client *client); +int fts_ctpm_lcd_cfg_upgrade(struct i2c_client *client); + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_ft8716.c b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_ft8716.c new file mode 100755 index 0000000000000..629a1398a24d7 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_ft8716.c @@ -0,0 +1,497 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_ft8716.c +* +* Author: fupeipei +* +* Created: 2016-08-15 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" + +#if ((FTS_CHIP_TYPE == _FT8716) || (FTS_CHIP_TYPE == _FTE716)) +#include "../focaltech_flash.h" +#include "focaltech_upgrade_common.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ +#define APP_FILE_MAX_SIZE (64 * 1024) +#define APP_FILE_MIN_SIZE (8) +#define APP_FILE_VER_MAPPING (0x10E) +#define APP_FILE_VENDORID_MAPPING (0x10C) +#define APP_FILE_CHIPID_MAPPING (0x11E) +#define CONFIG_START_ADDR (0x0000) +#define CONFIG_VENDOR_ID_OFFSET (0x04) +#define CONFIG_PROJECT_ID_OFFSET (0x20) +#define CONFIG_VENDOR_ID_ADDR (CONFIG_START_ADDR+CONFIG_VENDOR_ID_OFFSET) +#define CONFIG_PROJECT_ID_ADDR (CONFIG_START_ADDR+CONFIG_PROJECT_ID_OFFSET) +extern char Lcm_name[64]; + + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +static int fts_ctpm_get_i_file(struct i2c_client *client, int fw_valid); +static int fts_ctpm_get_app_i_file_ver(void); +static int fts_ctpm_get_app_bin_file_ver(char *firmware_name); +static int fts_ctpm_write_pram(struct i2c_client *client, u8 *pbt_buf, u32 dw_lenth); +static int fts_ctpm_fw_upgrade_with_app_i_file(struct i2c_client *client); +static int fts_ctpm_fw_upgrade_with_app_bin_file(struct i2c_client *client, char *firmware_name); + +struct fts_upgrade_fun fts_updatefun = { + .get_i_file = fts_ctpm_get_i_file, + .get_app_bin_file_ver = fts_ctpm_get_app_bin_file_ver, + .get_app_i_file_ver = fts_ctpm_get_app_i_file_ver, + .upgrade_with_app_i_file = fts_ctpm_fw_upgrade_with_app_i_file, + .upgrade_with_app_bin_file = fts_ctpm_fw_upgrade_with_app_bin_file, + .upgrade_with_lcd_cfg_i_file = NULL, + .upgrade_with_lcd_cfg_bin_file = NULL, +}; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if (FTS_GET_VENDOR_ID_NUM != 0) +/************************************************************************ +* Name: fts_ctpm_get_vendor_id_flash +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +static int fts_ctpm_get_vendor_id_flash(struct i2c_client *client, u8 *vendor_id) +{ + u8 rw_buf[10]; + int i_ret; + int fw_len; + bool inpram = false; + + FTS_FUNC_ENTER(); + + /*write pramboot*/ + fw_len = fts_getsize(PRAMBOOT_SIZE); + FTS_DEBUG("[UPGRADE]: pramboot size : %d!!", fw_len); + i_ret = fts_ctpm_write_pram(client, aucFW_PRAM_BOOT, fw_len); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE]: write pram failed!!"); + return -EIO; + } + + /*check run in pramboot or not! if not rum in pramboot, can not upgrade*/ + inpram = fts_ctpm_check_run_state(client, FTS_RUN_IN_PRAM); + if (!inpram) { + FTS_ERROR("[UPGRADE]: not run in pram, upgrade fail!!"); + return -EIO; + } + + /*read vendor id*/ + rw_buf[0] = 0x03; + rw_buf[1] = 0x00; + rw_buf[2] = (u8)(CONFIG_VENDOR_ID_ADDR >> 8); + rw_buf[3] = (u8)(CONFIG_VENDOR_ID_ADDR); + i_ret = fts_i2c_write(client, rw_buf, 4); + msleep(10); /* must wait, otherwise read vendor id wrong */ + i_ret = fts_i2c_read(client, NULL, 0, vendor_id, 1); + if (i_ret < 0) { + return -EIO; + } + FTS_DEBUG("Vendor ID from Flash:%x", *vendor_id); + return 0; +} +#endif + +/************************************************************************ +* Name: fts_ctpm_get_i_file +* Brief: get .i file +* Input: +* Output: +* Return: 0 - ok +* <0 - fail +***********************************************************************/ +static int fts_ctpm_get_i_file(struct i2c_client *client, int fw_valid) +{ + int ret = 0; + +#if (FTS_GET_VENDOR_ID_NUM != 0) + u8 vendor_id = 0; + + if (fw_valid) { + ret = fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &vendor_id); + } else { + ret = fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &vendor_id); + if ((ret < 0) || (vendor_id == 0xEF) || (vendor_id == 0xED)) { + /* 8736 can't read vendor id from A8 command */ + ret = fts_ctpm_get_vendor_id_flash(client, &vendor_id); + } + } + if (ret < 0) { + FTS_ERROR("Get upgrade file fail because of Vendor ID wrong"); + return ret; + } + FTS_INFO("[UPGRADE] vendor id in tp=%x", vendor_id); + FTS_INFO("[UPGRADE] vendor id in driver:%x, FTS_VENDOR_ID:%02x %02x %02x", + vendor_id, FTS_VENDOR_1_ID, FTS_VENDOR_2_ID, FTS_VENDOR_3_ID); + + ret = 0; + switch (vendor_id) { +#if (FTS_GET_VENDOR_ID_NUM >= 1) + case FTS_VENDOR_1_ID: + g_fw_file = CTPM_FW; + g_fw_len = fts_getsize(FW_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:CTPM_FW, SIZE:%x", g_fw_len); + break; +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 2) + case FTS_VENDOR_2_ID: + g_fw_file = CTPM_FW2; + g_fw_len = fts_getsize(FW2_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:CTPM_FW2, SIZE:%x", g_fw_len); + break; +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 3) + case FTS_VENDOR_3_ID: + g_fw_file = CTPM_FW3; + g_fw_len = fts_getsize(FW3_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:CTPM_FW3, SIZE:%x", g_fw_len); + break; +#endif + default: + FTS_ERROR("[UPGRADE]Vendor ID check fail, get fw file fail"); + ret = -EIO; + break; + } +#else + /* (FTS_GET_VENDOR_ID_NUM == 0) */ + if (strstr(Lcm_name, "ebbg")) { + g_fw_file = CTPM_FW; + g_fw_len = fts_getsize(FW_SIZE); + } else if (strstr(Lcm_name, "csot")) { + g_fw_file = CTPM_FW1; + g_fw_len = fts_getsize(FW1_SIZE); + } + FTS_DEBUG("[UPGRADE]FW FILE:CTPM_FW, SIZE:%x", g_fw_len); +#endif + if (!g_fw_len) + return -EIO; + + return ret; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_bin_file_ver +* Brief: get .i file version +* Input: no +* Output: no +* Return: fw version +***********************************************************************/ +static int fts_ctpm_get_app_bin_file_ver(char *firmware_name) +{ + u8 *pbt_buf = NULL; + int fwsize = 0; + int fw_ver = 0; + + FTS_FUNC_ENTER(); + + fwsize = fts_GetFirmwareSize(firmware_name); + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fwsize); + return -EIO; + } + + pbt_buf = (unsigned char *)kmalloc(fwsize + 1, GFP_KERNEL); + if (fts_ReadFirmware(firmware_name, pbt_buf)) { + FTS_ERROR("[UPGRADE]: request_firmware failed!!"); + kfree(pbt_buf); + return -EIO; + } + + fw_ver = pbt_buf[APP_FILE_VER_MAPPING]; + + kfree(pbt_buf); + FTS_FUNC_EXIT(); + + return fw_ver; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_i_file_ver +* Brief: get .i file version +* Input: no +* Output: no +* Return: fw version +***********************************************************************/ +static int fts_ctpm_get_app_i_file_ver(void) +{ + int fwsize = g_fw_len; + + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fwsize); + return 0; + } + + return g_fw_file[APP_FILE_VER_MAPPING]; +} + +/************************************************************************ +* Name: fts_ctpm_write_pram +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +static int fts_ctpm_write_pram(struct i2c_client *client, u8 *pbt_buf, u32 dw_lenth) +{ + int i_ret; + bool inrom = false; + + FTS_FUNC_ENTER(); + + /*check the length of the pramboot*/ + if (dw_lenth > APP_FILE_MAX_SIZE || dw_lenth < APP_FILE_MIN_SIZE) { + FTS_ERROR("[UPGRADE] pramboot length(%d) fail", dw_lenth); + return -EIO; + } + + /*send comond to FW, reset and start write pramboot*/ + i_ret = fts_ctpm_start_fw_upgrade(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: send upgrade cmd to FW error!!"); + return i_ret; + } + + /*check run in rom or not! if run in rom, will write pramboot*/ + inrom = fts_ctpm_check_run_state(client, FTS_RUN_IN_ROM); + if (!inrom) { + FTS_ERROR("[UPGRADE]: not run in rom, write pramboot fail!!"); + return -EIO; + } + + /*write pramboot to pram*/ + i_ret = fts_ctpm_write_pramboot_for_idc(client, dw_lenth, aucFW_PRAM_BOOT); + if (i_ret < 0) { + return i_ret; + FTS_ERROR("[UPGRADE]: write pramboot fail!!"); + } + + /*read out checksum*/ + i_ret = fts_ctpm_pramboot_ecc(client); + if (i_ret < 0) { + return i_ret; + FTS_ERROR("[UPGRADE]: write pramboot ecc error!!"); + } + + /*start pram*/ + fts_ctpm_start_pramboot(client); + + FTS_FUNC_EXIT(); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_write_app +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +static int fts_ctpm_write_app(struct i2c_client *client, u8 *pbt_buf, u32 dw_lenth) +{ + u32 temp; + int i_ret; + bool inpram = false; + + FTS_FUNC_ENTER(); + + /*check run in pramboot or not! if not rum in pramboot, can not upgrade*/ + inpram = fts_ctpm_check_run_state(client, FTS_RUN_IN_PRAM); + if (!inpram) { + FTS_ERROR("[UPGRADE]: not run in pram, upgrade fail!!"); + return -EIO; + } + + /*upgrade init*/ + i_ret = fts_ctpm_upgrade_idc_init(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: upgrade init error, upgrade fail!!"); + return i_ret; + } + + /*erase the app erea in flash*/ + i_ret = fts_ctpm_erase_flash(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: erase flash error!!"); + return i_ret; + } + + /*start to write app*/ + i_ret = fts_ctpm_write_app_for_idc(client, dw_lenth, pbt_buf); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: write app error!!"); + return i_ret; + } + + /*read check sum*/ + temp = 0x1000; + i_ret = fts_ctpm_upgrade_ecc(client, temp, dw_lenth); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: ecc error!!"); + return i_ret; + } + + /*upgrade success, reset the FW*/ + fts_ctpm_rom_or_pram_reset(client); + + FTS_FUNC_EXIT(); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_use_buf +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +* success =0 +***********************************************************************/ +static int fts_ctpm_fw_upgrade_use_buf(struct i2c_client *client, u8 *pbt_buf, u32 fwsize) +{ + int i_ret = 0; + int fw_len; + + FTS_FUNC_ENTER(); + + /*write pramboot*/ + fw_len = fts_getsize(PRAMBOOT_SIZE); + FTS_DEBUG("[UPGRADE]: pramboot size : %d!!", fw_len); + i_ret = fts_ctpm_write_pram(client, aucFW_PRAM_BOOT, fw_len); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE]: write pram failed!!"); + return -EIO; + } + + /*write app*/ + i_ret = fts_ctpm_write_app(client, pbt_buf, fwsize); + + FTS_FUNC_EXIT(); + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_with_app_i_file +* Brief: upgrade with *.i file +* Input: i2c info +* Output: +* Return: fail < 0 +***********************************************************************/ +static int fts_ctpm_fw_upgrade_with_app_i_file(struct i2c_client *client) +{ + int i_ret = 0; + u32 fw_len; + u8 *fw_buf; + + FTS_INFO("[UPGRADE]**********start upgrade with app.i**********"); + + fw_len = g_fw_len; + fw_buf = g_fw_file; + if (fw_len < APP_FILE_MIN_SIZE || fw_len > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fw_len); + return -EIO; + } + + i_ret = fts_ctpm_fw_upgrade_use_buf(client, fw_buf, fw_len); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE] upgrade app.i failed"); + } else { + FTS_INFO("[UPGRADE]: upgrade app.i succeed"); + } + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_with_app_bin_file +* Brief: upgrade with *.bin file +* Input: i2c info, file name +* Output: no +* Return: success =0 +***********************************************************************/ +static int fts_ctpm_fw_upgrade_with_app_bin_file(struct i2c_client *client, char *firmware_name) +{ + u8 *pbt_buf = NULL; + int i_ret = 0; + bool ecc_ok = false; + int fwsize = 0; + + FTS_INFO("[UPGRADE]**********start upgrade with app.bin**********"); + + fwsize = fts_GetFirmwareSize(firmware_name); + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: app.bin length(%x) error, upgrade fail", fwsize); + return -EIO; + } + + pbt_buf = (unsigned char *)kmalloc(fwsize + 1, GFP_KERNEL); + if (NULL == pbt_buf) { + FTS_ERROR(" malloc pbt_buf failed "); + goto ERROR_BIN; + } + + if (fts_ReadFirmware(firmware_name, pbt_buf)) { + FTS_ERROR("[UPGRADE]: request_firmware failed!!"); + goto ERROR_BIN; + } + + /*check the app.bin invalid or not*/ + ecc_ok = fts_check_app_bin_valid_idc(pbt_buf); + + if (ecc_ok) { + FTS_INFO("[UPGRADE] app.bin ecc ok"); + i_ret = fts_ctpm_fw_upgrade_use_buf(client, pbt_buf, fwsize); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE]: upgrade app.bin failed"); + goto ERROR_BIN; + } else { + FTS_INFO("[UPGRADE]: upgrade app.bin succeed"); + } + } else { + FTS_ERROR("[UPGRADE] app.bin ecc failed"); + goto ERROR_BIN; + } + + kfree(pbt_buf); + return i_ret; +ERROR_BIN: + kfree(pbt_buf); + return -EIO; +} +#endif /* #if (FTS_CHIP_TYPE == _FT8716) */ diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_idc.c b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_idc.c new file mode 100755 index 0000000000000..606abe2c9b0f8 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_idc.c @@ -0,0 +1,575 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_idc.c +* +* Author: fupeipei +* +* Created: 2016-08-22 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" + +#if (FTS_CHIP_IDC == 1) +#include "../focaltech_flash.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +u8 upgrade_ecc; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/************************************************************************ +* Name: fts_ctpm_upgrade_idc_init +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_upgrade_idc_init(struct i2c_client *client) +{ + int i_ret = 0; + u8 reg_val_id[4] = {0}; + u8 auc_i2c_write_buf[10]; + + FTS_INFO("[UPGRADE]**********Upgrade setting Init**********"); + + /*read flash ID*/ + auc_i2c_write_buf[0] = 0x05; + reg_val_id[0] = 0x00; + i_ret = fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val_id, 1); + if (i_ret < 0) { + return -EIO; + } + + /*set flash clk*/ + auc_i2c_write_buf[0] = 0x05; + auc_i2c_write_buf[1] = reg_val_id[0]; + auc_i2c_write_buf[2] = 0x00; + fts_i2c_write(client, auc_i2c_write_buf, 3); + + /*send upgrade type to reg 0x09: 0x0B: upgrade; 0x0A: download*/ + auc_i2c_write_buf[0] = 0x09; + auc_i2c_write_buf[1] = 0x0B; + fts_i2c_write(client, auc_i2c_write_buf, 2); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_start_pramboot +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +void fts_ctpm_start_pramboot(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[10]; + + FTS_INFO("[UPGRADE]**********start pramboot**********"); + auc_i2c_write_buf[0] = 0x08; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(20); +} + +/************************************************************************ +* Name: fts_ctpm_start_fw_upgrade +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_start_fw_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + /*send the soft upgrade commond to FW, and start upgrade*/ + FTS_INFO("[UPGRADE]**********send 0xAA and 0x55 to FW, start upgrade**********"); + + i_ret = fts_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_AA); + msleep(10); + i_ret = fts_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_55); + msleep(200); + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_check_run_state +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +bool fts_ctpm_check_run_state(struct i2c_client *client, int rstate) +{ + int i = 0; + enum FW_STATUS cstate = FTS_RUN_IN_ERROR; + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + cstate = fts_ctpm_get_pram_or_rom_id(client); + FTS_DEBUG("[UPGRADE]: run state = %d", cstate); + + if (cstate == rstate) + return true; + msleep(20); + } + + return false; +} + +/************************************************************************ +* Name: fts_ctpm_pramboot_ecc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_pramboot_ecc(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_FUNC_ENTER(); + + /*read out checksum, if pramboot checksum != host checksum, upgrade fail*/ + FTS_INFO("[UPGRADE]******read out pramboot checksum******"); + auc_i2c_write_buf[0] = 0xcc; + msleep(2); + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != upgrade_ecc) { /*pramboot checksum != host checksum, upgrade fail*/ + FTS_ERROR("[UPGRADE]: checksum fail : pramboot_ecc = %X, host_ecc = %X!!", reg_val[0], upgrade_ecc); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: checksum success : pramboot_ecc = %X, host_ecc = %X!!", reg_val[0], upgrade_ecc); + msleep(100); + + FTS_FUNC_EXIT(); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_upgrade_ecc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_upgrade_ecc(struct i2c_client *client, u32 startaddr, u32 length) +{ + u32 i = 0; + u8 auc_i2c_write_buf[10]; + u32 temp; + u8 reg_val[4] = {0}; + int i_ret = 0; + + FTS_INFO("[UPGRADE]**********read out checksum**********"); + + /*check sum init*/ + auc_i2c_write_buf[0] = 0x64; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); + + /*send commond to pramboot to start checksum*/ + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(startaddr >> 16); + auc_i2c_write_buf[2] = (u8)(startaddr >> 8); + auc_i2c_write_buf[3] = (u8)(startaddr); + + if (length > LEN_FLASH_ECC_MAX) { + temp = LEN_FLASH_ECC_MAX; + } else { + temp = length; + } + + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 6); + msleep(length/256); + + /*read status : if check sum is finished?*/ + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + break; + } + msleep(1); + + } + + if (length > LEN_FLASH_ECC_MAX) { + temp = LEN_FLASH_ECC_MAX; + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(temp >> 16); + auc_i2c_write_buf[2] = (u8)(temp >> 8); + auc_i2c_write_buf[3] = (u8)(temp); + temp = length-LEN_FLASH_ECC_MAX; + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 6); + + msleep(length/256); + + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + break; + } + msleep(1); + } + } + + /*read out check sum*/ + auc_i2c_write_buf[0] = 0x66; + i_ret = fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != upgrade_ecc) /*if check sum fail, upgrade fail*/ { + FTS_ERROR("[UPGRADE]: ecc error! FW=%02x upgrade_ecc=%02x!!", reg_val[0], upgrade_ecc); + return -EIO; + } + + FTS_DEBUG("[UPGRADE]: ecc success : FW=%02x upgrade_ecc=%02x!!", reg_val[0], upgrade_ecc); + + upgrade_ecc = 0; + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_erase_flash +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_erase_flash(struct i2c_client *client) +{ + u32 i = 0; + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_INFO("[UPGRADE]**********erase app now**********"); + + /*send to erase flash*/ + auc_i2c_write_buf[0] = 0x61; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1350); + + for (i = 0; i < 15; i++) { + /*get the erase app status, if get 0xF0AA£¬erase flash success*/ + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0xAA == reg_val[1]) /*erase flash success*/ { + break; + } + msleep(50); + } + + if ((0xF0 != reg_val[0] || 0xAA != reg_val[1]) && (i >= 15)) /*erase flash fail*/ { + FTS_ERROR("[UPGRADE]: erase app error.reset tp and reload FW!!"); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: erase app ok!!"); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_write_pramboot_for_idc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_write_pramboot_for_idc(struct i2c_client *client, u32 length, u8 *readbuf) +{ + u32 i = 0; + u32 j; + u32 temp; + u32 packet_number; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + + upgrade_ecc = 0; + FTS_INFO("[UPGRADE]**********write pramboot to pram**********"); + + temp = 0; + packet_number = (length) / FTS_PACKET_LENGTH; + if ((length) % FTS_PACKET_LENGTH > 0) { + packet_number++; + } + packet_buf[0] = 0xae; + packet_buf[1] = 0x00; + + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + if (j < (packet_number-1)) { + temp = FTS_PACKET_LENGTH; + } else { + temp = (length) % FTS_PACKET_LENGTH; + } + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = readbuf[j * FTS_PACKET_LENGTH + i]; + upgrade_ecc ^= packet_buf[6 + i]; + } + fts_i2c_write(client, packet_buf, temp + 6); + } + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_write_app_for_idc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_write_app_for_idc(struct i2c_client *client, u32 length, u8 *readbuf) +{ + u32 j; + u32 i = 0; + u32 packet_number; + u32 temp; + u32 writelenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_INFO("[UPGRADE]**********write app to flash**********"); + + upgrade_ecc = 0; + + packet_number = (length) / FTS_PACKET_LENGTH; + if (((length) % FTS_PACKET_LENGTH) > 0) { + packet_number++; + } + + packet_buf[0] = 0xbf; + + for (j = 0; j < packet_number; j++) { + temp = 0x1000+j * FTS_PACKET_LENGTH; + + if (j < (packet_number-1)) { + writelenght = FTS_PACKET_LENGTH; + } else { + writelenght = ((length) % FTS_PACKET_LENGTH); + } + packet_buf[1] = (u8) (temp >> 16); + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + packet_buf[4] = (u8) (writelenght >> 8); + packet_buf[5] = (u8) writelenght; + + for (i = 0; i < writelenght; i++) { + packet_buf[6 + i] = readbuf[(temp - 0x1000+i)]; + upgrade_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_write(client, packet_buf, (writelenght + 6)); + + for (i = 0; i < 30; i++) { + /*read status and check if the app writting is finished*/ + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((j + 0x20+0x1000) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + fts_ctpm_upgrade_delay(1000); + } + } + msleep(50); + + return 0; +} + + +typedef enum { + APP_LEN = 0x00, + APP_LEN_NE = 0x02, + APP_P1_ECC = 0x04, + APP_P1_ECC_NE = 0x06, + APP_P2_ECC = 0x08, + APP_P2_ECC_NE = 0x0A, + APP_LEN_H = 0x12, + APP_LEN_H_NE = 0x14, + APP_BLR_ID = 0x1C, + APP_BLR_ID_NE = 0x1D, + PBOOT_ID_H = 0x1E, + PBOOT_ID_L = 0x1F +} ENUM_APP_INFO; + +#define AL2_FCS_COEF ((1 << 15) + (1 << 10) + (1 << 3)) + +#if ((FTS_CHIP_TYPE == _FT8006) || (FTS_CHIP_TYPE == _FT8736)) +#define FW_CFG_TOTAL_SIZE 0x80 +#else +#define FW_CFG_TOTAL_SIZE 0x00 +#endif +#define APP1_START 0x00 +#define APP1_LEN 0x100 +#define APP_VERIF_ADDR (APP1_START + APP1_LEN) +#define APP_VERIF_LEN 0x20 +#define APP1_ECC_ADDR (APP_VERIF_ADDR + APP_P1_ECC) +#define APP2_START (APP_VERIF_ADDR + APP_VERIF_LEN + FW_CFG_TOTAL_SIZE) +#define APP2_ECC_ADDR (APP_VERIF_ADDR + APP_P2_ECC) +/***************************************************************************** +* Name: DrvReadPram16 +* Brief: Get Word +* Input: +* Output: +* Return: +*****************************************************************************/ +static u16 data_word(u8 *pbt_buf, u32 addr) +{ + return (((u16)pbt_buf[addr]<<8) + pbt_buf[addr+1]); +} + +/****************************************************************************** +* Name: GetCrc16 +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +u16 crc_calc(u8 *pbt_buf, u32 addr, u16 length) +{ + u16 cFcs = 0; + u16 i, j; + + FTS_DEBUG("[UPGRADE][ECC] : %04x data:%04x, len:%04x!!", (addr), data_word(pbt_buf, (addr)), length); + for (i = 0; i < length; i++) { + cFcs ^= data_word(pbt_buf, (addr+i*2)); + for (j = 0; j < 16; j++) { + if (cFcs & 1) { + cFcs = (u16)((cFcs >> 1) ^ AL2_FCS_COEF); + } else { + cFcs >>= 1; + } + } + } + return cFcs; +} + +/***************************************************************************** +* Name: task_check_mem +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +bool ecc_check(u8 *pbt_buf, u32 star_addr, u32 len, u16 ecc_addr) +{ + u16 ecc1; + u16 ecc2; + u16 cal_ecc; + + ecc1 = data_word(pbt_buf, ecc_addr); + ecc2 = data_word(pbt_buf, ecc_addr+2); + + if ((ecc1 + ecc2) != 0xFFFF) { + return false; + } + + cal_ecc = crc_calc(pbt_buf, star_addr, (len/2)); + + FTS_DEBUG("[UPGRADE][ECC] : ecc1 = %x, cal_ecc = %x", ecc1, cal_ecc); + if (ecc1 != cal_ecc) { + FTS_DEBUG("[UPGRADE][ECC] : ecc error!!"); + return false; + } + return true; +} + +/***************************************************************************** +* Name: fts_check_app_bin_valid_idc +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +bool fts_check_app_bin_valid_idc(u8 *pbt_buf) +{ + u32 len; +#if (FTS_CHIP_TYPE != _FT8006) + /* 1. First Byte */ + if (pbt_buf[0] != 0x02) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- the first byte(%x) error", pbt_buf[0]); + return false; + } +#endif + /* 2 PART1 ECC */ + if (!ecc_check(pbt_buf, APP1_START, APP1_LEN, APP1_ECC_ADDR)) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- ecc1 error"); + return false; + } + + /* 3. PART2 ECC */ + if ((data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN) + data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_NE)) != 0xFFFF) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- Length XOR error"); + return false; + } + len = data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN); +#if (FTS_CHIP_TYPE == _FT8006) + if ((data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) + data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H_NE)) != 0xFFFF) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- Length2 XOR error"); + return false; + } + len += ((u32)data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) << 16); +#endif + FTS_DEBUG("%x %x %x %x", APP2_START, len, ((u32)data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) << 16), data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN)); + len -= APP2_START; + + return ecc_check(pbt_buf, APP2_START, len, APP2_ECC_ADDR); +} + + +#endif /* IDC */ diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_test.c b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_test.c new file mode 100755 index 0000000000000..2535d02aa16f7 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_test.c @@ -0,0 +1,167 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_test.c +* +* Author: fupeipei +* +* Created: 2016-08-22 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" +#include "../focaltech_flash.h" +#include +#include + +/***************************************************************************** +* Static variables +*****************************************************************************/ +#define FTS_GET_UPGRADE_TIME 0 + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct wake_lock ps_lock; + +#define FTS_DEBUG_UPGRADE(fmt, args...) do {\ + printk(KERN_ERR "[FTS][UPGRADE]:##############################################################################\n");\ + printk(KERN_ERR "[FTS][UPGRADE]: "fmt"\n", ##args);\ + printk(KERN_ERR "[FTS][UPGRADE]:##############################################################################\n");\ + } while (0)\ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if (FTS_UPGRADE_STRESS_TEST) +/************************************************************************ +* Name: fts_ctpm_auto_upgrade_pingpong +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +static int fts_ctpm_auto_upgrade_pingpong(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + int i_ret = 0; + u8 uc_upgrade_times = 0; + + FTS_FUNC_ENTER(); + + /* pingpong test mode, need upgrade */ + FTS_INFO("[UPGRADE]: pingpong test mode, need upgrade!!"); + do { + uc_upgrade_times++; + + /* fw upgrade */ + i_ret = fts_ctpm_fw_upgrade(client); + + if (i_ret == 0) /* upgrade success */ { + fts_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + FTS_DEBUG("[UPGRADE]: upgrade to new version 0x%x", uc_tp_fm_ver); + } else /* upgrade fail */ { + /* if upgrade fail, reset to run ROM. if app in flash is ok. TP will work success */ + FTS_INFO("[UPGRADE]: upgrade fail, reset now!!"); + fts_ctpm_rom_or_pram_reset(client); + } + } while ((i_ret != 0) && (uc_upgrade_times < 2)); /* if upgrade fail, upgrade again. then return */ + + FTS_FUNC_EXIT(); + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_auto_upgrade +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +void fts_ctpm_display_upgrade_time(bool start_time) +{ +#if FTS_GET_UPGRADE_TIME + static struct timeval tpend; + static struct timeval tpstart; + static int timeuse; + + if (start_time) { + do_gettimeofday(&tpstart); + } else { + do_gettimeofday(&tpend); + timeuse = 1000000 * (tpend.tv_sec-tpstart.tv_sec) + tpend.tv_usec-tpstart.tv_usec; + timeuse /= 1000000; + FTS_DEBUG("[UPGRADE]: upgrade success : Use time: %d Seconds!!", timeuse); + } +#endif +} + +/************************************************************************ +* Name: fts_ctpm_auto_upgrade +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +int fts_ctpm_auto_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + static int uc_ErrorTimes + static int uc_UpgradeTimes + + wake_lock_init(&ps_lock, WAKE_LOCK_SUSPEND, "tp_wakelock"); + + wake_lock(&ps_lock); + + /* (FTS_GET_VENDOR_ID_NUM == 0) */ + g_fw_file = CTPM_FW; + g_fw_len = fts_getsize(FW_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:CTPM_FW, SIZE:%x", g_fw_len); + + do { + uc_UpgradeTimes++; + + FTS_DEBUG_UPGRADE("start to upgrade %d times !!", uc_UpgradeTimes); + + fts_ctpm_display_upgrade_time(true); + + i_ret = fts_ctpm_auto_upgrade_pingpong(client); + if (i_ret == 0) { + fts_ctpm_display_upgrade_time(false); + } else { + uc_ErrorTimes++; + } + + FTS_DEBUG_UPGRADE("upgrade %d times, error %d times!!", uc_UpgradeTimes, uc_ErrorTimes); + } while (uc_UpgradeTimes < (FTS_UPGRADE_TEST_NUMBER)); + + wake_unlock(&ps_lock); + + return 0; +} +#endif + diff --git a/drivers/input/touchscreen/FT8716/focaltech_gesture.c b/drivers/input/touchscreen/FT8716/focaltech_gesture.c new file mode 100755 index 0000000000000..b0a6df7e68cdd --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_gesture.c @@ -0,0 +1,683 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_gestrue.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#if FTS_GESTURE_EN +/****************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define KEY_GESTURE_U KEY_U +#define KEY_GESTURE_UP KEY_UP +#define KEY_GESTURE_DOWN KEY_DOWN +#define KEY_GESTURE_LEFT KEY_LEFT +#define KEY_GESTURE_RIGHT KEY_RIGHT +#define KEY_GESTURE_O KEY_O +#define KEY_GESTURE_E KEY_E +#define KEY_GESTURE_M KEY_M +#define KEY_GESTURE_L KEY_L +#define KEY_GESTURE_W KEY_W +#define KEY_GESTURE_S KEY_S +#define KEY_GESTURE_V KEY_V +#define KEY_GESTURE_C KEY_C +#define KEY_GESTURE_Z KEY_Z + +#define GESTURE_LEFT 0x20 +#define GESTURE_RIGHT 0x21 +#define GESTURE_UP 0x22 +#define GESTURE_DOWN 0x23 +#define GESTURE_DOUBLECLICK 0x24 +#define GESTURE_O 0x30 +#define GESTURE_W 0x31 +#define GESTURE_M 0x32 +#define GESTURE_E 0x33 +#define GESTURE_L 0x44 +#define GESTURE_S 0x46 +#define GESTURE_V 0x54 +#define GESTURE_Z 0x41 +#define GESTURE_C 0x34 +#define FTS_GESTRUE_POINTS 255 +#define FTS_GESTRUE_POINTS_HEADER 8 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* +* header - byte0:gesture id +* byte1:pointnum +* byte2~7:reserved +* coordinate_x - All gesture point x coordinate +* coordinate_y - All gesture point y coordinate +* mode - 1:enable gesture function(default) +* - 0:disable +* active - 1:enter into gesture(suspend) +* 0:gesture disable or resume +*/ +struct fts_gesture_st { + u8 header[FTS_GESTRUE_POINTS_HEADER]; + u16 coordinate_x[FTS_GESTRUE_POINTS]; + u16 coordinate_y[FTS_GESTRUE_POINTS]; + u8 mode; + u8 active; +}; + + + +struct gesture_struct gesture_data = {0, 0}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct fts_gesture_st fts_gesture_data; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); + +/* sysfs gesture node + * read example: cat fts_gesture_mode ---read gesture mode + * write example:echo 01 > fts_gesture_mode ---write gesture mode to 01 + * + */ +static DEVICE_ATTR (fts_gesture_mode, S_IRUGO|S_IWUSR, fts_gesture_show, fts_gesture_store); +/* + * read example: cat fts_gesture_buf ---read gesture buf + */ +static DEVICE_ATTR (fts_gesture_buf, S_IRUGO|S_IWUSR, fts_gesture_buf_show, fts_gesture_buf_store); +static struct attribute *fts_gesture_mode_attrs[] = { + + &dev_attr_fts_gesture_mode.attr, + &dev_attr_fts_gesture_buf.attr, + NULL, +}; + +static struct attribute_group fts_gesture_group = { + .attrs = fts_gesture_mode_attrs, +}; + +/************************************************************************ +* Name: fts_gesture_show +* Brief: +* Input: device, device attribute, char buf +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + u8 val; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&fts_input_dev->mutex); + fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &val); + count = sprintf(buf, "Gesture Mode: %s\n", fts_gesture_data.mode ? "On" : "Off"); + count += sprintf(buf + count, "Reg(0xD0) = %d\n", val); + mutex_unlock(&fts_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_store +* Brief: +* Input: device, device attribute, char buf, char count +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + mutex_lock(&fts_input_dev->mutex); + + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[GESTURE]enable gesture"); + fts_gesture_data.mode = ENABLE; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[GESTURE]disable gesture"); + fts_gesture_data.mode = DISABLE; + } + + mutex_unlock(&fts_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_buf_show +* Brief: +* Input: device, device attribute, char buf +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + int i = 0; + + mutex_lock(&fts_input_dev->mutex); + count = snprintf(buf, PAGE_SIZE, "Gesture ID: 0x%x\n", fts_gesture_data.header[0]); + count += snprintf(buf + count, PAGE_SIZE, "Gesture PointNum: %d\n", fts_gesture_data.header[1]); + count += snprintf(buf + count, PAGE_SIZE, "Gesture Point Buf:\n"); + for (i = 0; i < fts_gesture_data.header[1]; i++) { + count += snprintf(buf + count, PAGE_SIZE, "%3d(%4d,%4d) ", i, fts_gesture_data.coordinate_x[i], fts_gesture_data.coordinate_y[i]); + if ((i + 1)%4 == 0) + count += snprintf(buf + count, PAGE_SIZE, "\n"); + } + count += snprintf(buf + count, PAGE_SIZE, "\n"); + mutex_unlock(&fts_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_buf_store +* Brief: +* Input: device, device attribute, char buf, char count +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/***************************************************************************** +* Name: fts_create_gesture_sysfs +* Brief: +* Input: +* Output: +* Return: 0-success or others-error +*****************************************************************************/ +int fts_create_gesture_sysfs(struct i2c_client *client) +{ + int ret = 0; + + ret = sysfs_create_group(&client->dev.kobj, &fts_gesture_group); + if (ret != 0) { + FTS_ERROR("[GESTURE]fts_gesture_mode_group(sysfs) create failed!"); + sysfs_remove_group(&client->dev.kobj, &fts_gesture_group); + return ret; + } + return 0; +} + +/***************************************************************************** +* Name: fts_gesture_report +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_gesture_report(struct input_dev *input_dev, int gesture_id) +{ + int gesture; + + FTS_FUNC_ENTER(); + FTS_DEBUG("fts gesture_id==0x%x ", gesture_id); + switch (gesture_id) { + case GESTURE_LEFT: + gesture = KEY_GESTURE_LEFT; + break; + case GESTURE_RIGHT: + gesture = KEY_GESTURE_RIGHT; + break; + case GESTURE_UP: + gesture = KEY_GESTURE_UP; + break; + case GESTURE_DOWN: + gesture = KEY_GESTURE_DOWN; + break; + case GESTURE_DOUBLECLICK: + gesture = KEY_GESTURE_U; + break; + case GESTURE_O: + gesture = KEY_GESTURE_O; + break; + case GESTURE_W: + gesture = KEY_GESTURE_W; + break; + case GESTURE_M: + gesture = KEY_GESTURE_M; + break; + case GESTURE_E: + gesture = KEY_GESTURE_E; + break; + case GESTURE_L: + gesture = KEY_GESTURE_L; + break; + case GESTURE_S: + gesture = KEY_GESTURE_S; + break; + case GESTURE_V: + gesture = KEY_GESTURE_V; + break; + case GESTURE_Z: + gesture = KEY_GESTURE_Z; + break; + case GESTURE_C: + gesture = KEY_GESTURE_C; + break; + default: + gesture = -1; + break; + } + /* report event key */ + if (gesture != -1) { + if (gesture_id == GESTURE_DOUBLECLICK) { + FTS_DEBUG("Gesture Code=%d", gesture); + input_report_key(input_dev, DOUBLE_CLICK, 1); + input_sync(input_dev); + input_report_key(input_dev, DOUBLE_CLICK, 0); + input_sync(input_dev); + } + } + + FTS_FUNC_EXIT(); +} + +/************************************************************************ +* Name: fts_gesture_readdata +* Brief: read data from TP register +* Input: +* Output: +* Return: fail <0 +***********************************************************************/ +static int fts_gesture_read_buffer(struct i2c_client *client, u8 *buf, int read_bytes) +{ + int remain_bytes; + int ret; + int i; + if (read_bytes <= I2C_BUFFER_LENGTH_MAXINUM) { + ret = fts_i2c_read(client, buf, 1, buf, read_bytes); + } else { + ret = fts_i2c_read(client, buf, 1, buf, I2C_BUFFER_LENGTH_MAXINUM); + remain_bytes = read_bytes - I2C_BUFFER_LENGTH_MAXINUM; + for (i = 1; remain_bytes > 0; i++) { + if (remain_bytes <= I2C_BUFFER_LENGTH_MAXINUM) + ret = fts_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, remain_bytes); + else + ret = fts_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, I2C_BUFFER_LENGTH_MAXINUM); + remain_bytes -= I2C_BUFFER_LENGTH_MAXINUM; + } + } + + return ret; +} + +/************************************************************************ +* Name: fts_gesture_fw +* Brief: Check IC's gesture recognise by FW or not +* Input: +* Output: +* Return: 1- FW 0- Driver +***********************************************************************/ +static int fts_gesture_fw(void) +{ + int ret = 0; + + switch (chip_types.chip_idh) { + case 0x54: + case 0x58: + case 0x64: + case 0x87: + case 0x86: + case 0x80: + case 0xE7: + ret = 1; + break; + default: + ret = 0; + break; + } + return ret; +} + +/************************************************************************ +* Name: fts_gesture_readdata +* Brief: read data from TP register +* Input: +* Output: +* Return: fail <0 +***********************************************************************/ +int fts_gesture_readdata(struct i2c_client *client) +{ + u8 buf[FTS_GESTRUE_POINTS * 4] = { 0 }; + int ret = -1; + int i = 0; + int gestrue_id = 0; + int read_bytes = 0; + u8 pointnum; + + FTS_FUNC_ENTER(); + /* init variable before read gesture point */ + memset(fts_gesture_data.header, 0, FTS_GESTRUE_POINTS_HEADER); + memset(fts_gesture_data.coordinate_x, 0, FTS_GESTRUE_POINTS * sizeof(u16)); + memset(fts_gesture_data.coordinate_y, 0, FTS_GESTRUE_POINTS * sizeof(u16)); + + buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + ret = fts_i2c_read(client, buf, 1, buf, FTS_GESTRUE_POINTS_HEADER); + if (ret < 0) { + FTS_ERROR("[GESTURE]Read gesture header data failed!!"); + FTS_FUNC_EXIT(); + return ret; + } + + /* FW recognize gesture */ + if (fts_gesture_fw()) { + memcpy(fts_gesture_data.header, buf, FTS_GESTRUE_POINTS_HEADER); + gestrue_id = buf[0]; + pointnum = buf[1]; + read_bytes = ((int)pointnum) * 4 + 2; + buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + FTS_DEBUG("[GESTURE]PointNum=%d", pointnum); + ret = fts_gesture_read_buffer(client, buf, read_bytes); + if (ret < 0) { + FTS_ERROR("[GESTURE]Read gesture touch data failed!!"); + FTS_FUNC_EXIT(); + return ret; + } + + fts_gesture_report(fts_input_dev, gestrue_id); + for (i = 0; i < pointnum; i++) { + fts_gesture_data.coordinate_x[i] = (((s16) buf[0 + (4 * i + 2)]) & 0x0F) << 8 + | (((s16) buf[1 + (4 * i + 2)]) & 0xFF); + fts_gesture_data.coordinate_y[i] = (((s16) buf[2 + (4 * i + 2)]) & 0x0F) << 8 + | (((s16) buf[3 + (4 * i + 2)]) & 0xFF); + } + FTS_FUNC_EXIT(); + return 0; + } else { + FTS_ERROR("[GESTURE]IC 0x%x need gesture lib to support gestures.", chip_types.chip_idh); + return 0; + } +} + +/***************************************************************************** +* Name: fts_gesture_recovery +* Brief: recovery gesture state when reset or power on +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_gesture_recovery(struct i2c_client *client) +{ + if (fts_gesture_data.mode && fts_gesture_data.active) { + fts_i2c_write_reg(client, 0xD1, 0xff); + fts_i2c_write_reg(client, 0xD2, 0xff); + fts_i2c_write_reg(client, 0xD5, 0xff); + fts_i2c_write_reg(client, 0xD6, 0xff); + fts_i2c_write_reg(client, 0xD7, 0xff); + fts_i2c_write_reg(client, 0xD8, 0xff); + fts_i2c_write_reg(client, FTS_REG_GESTURE_EN, ENABLE); + } +} + +/***************************************************************************** +* Name: fts_gesture_suspend +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int fts_gesture_suspend(struct i2c_client *i2c_client) +{ + int i; + u8 state; + + FTS_FUNC_ENTER(); + + /* gesture not enable, return immediately */ + if (fts_gesture_data.mode == 0) { + FTS_DEBUG("gesture is disabled"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + for (i = 0; i < 5; i++) { + fts_i2c_write_reg(i2c_client, 0xd1, 0xff); + fts_i2c_write_reg(i2c_client, 0xd2, 0xff); + fts_i2c_write_reg(i2c_client, 0xd5, 0xff); + fts_i2c_write_reg(i2c_client, 0xd6, 0xff); + fts_i2c_write_reg(i2c_client, 0xd7, 0xff); + fts_i2c_write_reg(i2c_client, 0xd8, 0xff); + fts_i2c_write_reg(i2c_client, FTS_REG_GESTURE_EN, 0x01); + msleep(1); + fts_i2c_read_reg(i2c_client, FTS_REG_GESTURE_EN, &state); + if (state == 1) + break; + } + + if (i >= 5) { + FTS_ERROR("[GESTURE]Enter into gesture(suspend) failed!\n"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + fts_gesture_data.active = 1; + FTS_DEBUG("[GESTURE]Enter into gesture(suspend) successfully!"); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_gesture_resume +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int fts_gesture_resume(struct i2c_client *client) +{ + int i; + u8 state; + FTS_FUNC_ENTER(); + + /* gesture not enable, return immediately */ + if (fts_gesture_data.mode == 0) { + FTS_DEBUG("gesture is disabled"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + if (fts_gesture_data.active == 0) { + FTS_DEBUG("gesture is unactive"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + fts_gesture_data.active = 0; + for (i = 0; i < 5; i++) { + fts_i2c_write_reg(client, FTS_REG_GESTURE_EN, 0x00); + msleep(1); + fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &state); + if (state == 0) + break; + } + + if (i >= 5) { + FTS_ERROR("[GESTURE]Clear gesture(resume) failed!\n"); + } + + FTS_FUNC_EXIT(); + return 0; +} +extern int tp_gesture_onoff; + + +static ssize_t gesture_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + int num; + + if (*ppos) + return 0; + + num = sprintf(page, "%d\n", gesture_data.gesture_all_switch); + *ppos += num; + + return num; +} + +static ssize_t gesture_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + int ret; + char temp[20] = ""; + + ret = copy_from_user(temp, buff, len); + if (ret) { + FTS_ERROR("<%s> copy_from_user failed.\n", __func__); + return -EPERM; + } + + FTS_DEBUG("%s copy_from_user :%s\n", __func__, temp); +#if 0 + if (strnstr(temp, "on", strlen(temp))) + gesture_data.gesture_all_switch = 1; + else + gesture_data.gesture_all_switch = 0; +#else + ret = kstrtouint(temp, 0, &gesture_data.gesture_all_switch); + if (ret) { + FTS_ERROR("kstrtouint failed.\n"); + return -EFAULT; + } +#endif + + FTS_DEBUG("%s gesture_data.gesture_all_switch :%d\n", __func__, gesture_data.gesture_all_switch); + tp_gesture_onoff = gesture_data.gesture_all_switch; + + return len; +} +static const struct file_operations gesture_fops = { + .owner = THIS_MODULE, + .read = gesture_read, + .write = gesture_write, +}; + +static ssize_t gesture_data_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + int num; + + if (*ppos) + return 0; + + num = sprintf(page, "K\n"); + *ppos += num; + + return num; +} + +static ssize_t gesture_data_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + return len; +} + +static const struct file_operations gesture_data_fops = { + .owner = THIS_MODULE, + .read = gesture_data_read, + .write = gesture_data_write, +}; + +int gesture_init(struct input_dev *input_dev) +{ + struct proc_dir_entry *proc_entry = NULL; + struct proc_dir_entry *proc_data = NULL; + struct proc_dir_entry *parent; + + parent = proc_mkdir("gesture", NULL); + if (!parent) { + pr_err("%s: failed to create proc entry\n", __func__); + return -ENOMEM; + } + + proc_entry = proc_create(GESTURE_NODE, 0666, parent, &gesture_fops); + if (proc_entry == NULL) { + FTS_ERROR("CAN't create proc entry /proc/%s !", GESTURE_NODE); + return -EPERM; + } else { + FTS_DEBUG("Created proc entry /proc/%s !", GESTURE_NODE); + } + + proc_data = proc_create(GESTURE_DATA, 0666, parent, &gesture_data_fops); + if (proc_data == NULL) { + FTS_ERROR("CAN't create proc entry /proc/%s !", GESTURE_DATA); + return -EPERM; + } else { + FTS_DEBUG("Created proc entry /proc/%s !", GESTURE_DATA); + } + input_set_capability(input_dev, EV_KEY, DOUBLE_CLICK); + __set_bit(DOUBLE_CLICK, input_dev->keybit); + + return 0; +} +/***************************************************************************** +* Name: fts_gesture_init +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int fts_gesture_init(struct input_dev *input_dev, struct i2c_client *client) +{ + FTS_FUNC_ENTER(); + gesture_init(input_dev); + fts_gesture_data.mode = 1; + fts_gesture_data.active = 0; + FTS_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: fts_gesture_exit +* Brief: call when driver removed +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_gesture_exit(struct i2c_client *client) +{ + FTS_FUNC_ENTER(); + sysfs_remove_group(&client->dev.kobj, &fts_gesture_group); + FTS_FUNC_EXIT(); + return 0; +} + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_i2c.c b/drivers/input/touchscreen/FT8716/focaltech_i2c.c new file mode 100755 index 0000000000000..a68549d08471a --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_i2c.c @@ -0,0 +1,206 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/************************************************************************ +* +* File Name: focaltech_i2c.c +* +* Author: fupeipei +* +* Created: 2016-08-04 +* +* Abstract: i2c communication with TP +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By fupeipei 2016-08-04 +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static DEFINE_MUTEX(i2c_rw_access); + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ + +/************************************************************************ +* Name: fts_i2c_read +* Brief: i2c read +* Input: i2c info, write buf, write len, read buf, read len +* Output: get data in the 3rd buf +* Return: fail <0 +***********************************************************************/ +int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen) +{ + int ret; + + mutex_lock(&i2c_rw_access); + + if (readlen > 0) { + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) { + FTS_ERROR("[IIC]: i2c_transfer(write) error, ret=%d!!", ret); + } + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + FTS_ERROR("[IIC]: i2c_transfer(read) error, ret=%d!!", ret); + } + } + } + + mutex_unlock(&i2c_rw_access); + return ret; +} + +/************************************************************************ +* Name: fts_i2c_write +* Brief: i2c write +* Input: i2c info, write buf, write len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret = 0; + + mutex_lock(&i2c_rw_access); + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + FTS_ERROR("%s: i2c_transfer(write) error, ret=%d", __func__, ret); + } + } + mutex_unlock(&i2c_rw_access); + + return ret; +} + +/************************************************************************ +* Name: fts_i2c_write_reg +* Brief: write register +* Input: i2c info, reg address, reg value +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue) +{ + u8 buf[2] = {0}; + + buf[0] = regaddr; + buf[1] = regvalue; + return fts_i2c_write(client, buf, sizeof(buf)); +} + +/************************************************************************ +* Name: fts_i2c_read_reg +* Brief: read register +* Input: i2c info, reg address, reg value +* Output: get reg value +* Return: fail <0 +***********************************************************************/ +int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue) +{ + return fts_i2c_read(client, ®addr, 1, regvalue, 1); +} + +/************************************************************************ +* Name: fts_i2c_init +* Brief: fts i2c init +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_i2c_init(void) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} +/************************************************************************ +* Name: fts_i2c_exit +* Brief: fts i2c exit +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_i2c_exit(void) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} + diff --git a/drivers/input/touchscreen/FT8716/focaltech_point_report_check.c b/drivers/input/touchscreen/FT8716/focaltech_point_report_check.c new file mode 100755 index 0000000000000..6801b882dd242 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_point_report_check.c @@ -0,0 +1,150 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_point_report_check.c +* +* Author: WangTao +* +* Created: 2016-11-16 +* +* Abstract: point report check function +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By WangTao 2016-11-16 +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_POINT_REPORT_CHECK_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define POINT_REPORT_CHECK_WAIT_TIME 200 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct delayed_work fts_point_report_check_work; +static struct workqueue_struct *fts_point_report_check_workqueue + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ + + +/***************************************************************************** +* Name: fts_point_report_check_func +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_point_report_check_func(struct work_struct *work) +{ + +#if FTS_MT_PROTOCOL_B_EN + unsigned int finger_count = 0; +#endif + + FTS_FUNC_ENTER(); + mutex_lock(&fts_wq_data->report_mutex); + +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < fts_wq_data->pdata->max_touch_number; finger_count++) { + input_mt_slot(fts_input_dev, finger_count); + input_mt_report_slot_state(fts_input_dev, MT_TOOL_FINGER, false); + } +#else + input_mt_sync(fts_input_dev); +#endif + input_report_key(fts_input_dev, BTN_TOUCH, 0); + input_sync(fts_input_dev); + + mutex_unlock(&fts_wq_data->report_mutex); + + FTS_FUNC_EXIT(); +} + +void fts_point_report_check_queue_work(void) +{ + cancel_delayed_work(&fts_point_report_check_work); + queue_delayed_work(fts_point_report_check_workqueue, &fts_point_report_check_work, msecs_to_jiffies(POINT_REPORT_CHECK_WAIT_TIME)); +} + +/***************************************************************************** +* Name: fts_point_report_check_init +* Brief: +* Input: +* Output: +* Return: < 0: Fail to create esd check queue +*****************************************************************************/ +int fts_point_report_check_init(void) +{ + FTS_FUNC_ENTER(); + + INIT_DELAYED_WORK(&fts_point_report_check_work, fts_point_report_check_func); + fts_point_report_check_workqueue = create_workqueue("fts_point_report_check_func_wq"); + if (fts_point_report_check_workqueue == NULL) { + FTS_ERROR("[POINT_REPORT]: Failed to create fts_point_report_check_workqueue!!"); + } else { + FTS_DEBUG("[POINT_REPORT]: Success to create fts_point_report_check_workqueue!!"); + } + + FTS_FUNC_EXIT(); + + return 0; +} + +/***************************************************************************** +* Name: fts_point_report_check_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_point_report_check_exit(void) +{ + FTS_FUNC_ENTER(); + + destroy_workqueue(fts_point_report_check_workqueue); + + FTS_FUNC_EXIT(); + return 0; +} +#endif /* FTS_POINT_REPORT_CHECK_EN */ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_sensor.c b/drivers/input/touchscreen/FT8716/focaltech_sensor.c new file mode 100755 index 0000000000000..30a130b1a7be6 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_sensor.c @@ -0,0 +1,314 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_esdcheck.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-03 +* +* Abstract: Sensor +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By luougojin 2016-08-03 +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_PSENSOR_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +/* psensor register address*/ +#define FTS_REG_PSENSOR_ENABLE 0xB0 +#define FTS_REG_PSENSOR_STATUS 0x01 + +/* psensor register bits*/ +#define FTS_PSENSOR_ENABLE_MASK 0x01 +#define FTS_PSENSOR_STATUS_NEAR 0xC0 +#define FTS_PSENSOR_STATUS_FAR 0xE0 +#define FTS_PSENSOR_FAR_TO_NEAR 0 +#define FTS_PSENSOR_NEAR_TO_FAR 1 +#define FTS_PSENSOR_ORIGINAL_STATE_FAR 1 +#define FTS_PSENSOR_WAKEUP_TIMEOUT 500 + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct sensors_classdev __maybe_unused sensors_proximity_cdev = { + .name = "fts-proximity", + .vendor = "FocalTech", + .version = 1, + .handle = SENSORS_PROXIMITY_HANDLE, + .type = SENSOR_TYPE_PROXIMITY, + .max_range = "5.0", + .resolution = "5.0", + .sensor_power = "0.1", + .min_delay = 0, + .fifo_reserved_event_count = 0, + .fifo_max_event_count = 0, + .enabled = 0, + .delay_msec = 200, + .sensors_enable = NULL, + .sensors_poll_delay = NULL, +}; + +/***************************************************************************** +* functions body +*****************************************************************************/ +/***************************************************************************** +* Name: fts_psensor_support_enabled +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static inline bool fts_psensor_support_enabled(void) +{ + /*return config_enabled(CONFIG_TOUCHSCREEN_FTS_PSENSOR);*/ + return FTS_PSENSOR_EN; +} + +/***************************************************************************** +* Name: fts_psensor_enable +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_psensor_enable(struct fts_ts_data *data, int enable) +{ + u8 state; + int ret = -1; + + if (data->client == NULL) + return; + + fts_i2c_read_reg(data->client, FTS_REG_PSENSOR_ENABLE, &state); + if (enable) + state |= FTS_PSENSOR_ENABLE_MASK; + else + state &= ~FTS_PSENSOR_ENABLE_MASK; + + ret = fts_i2c_write_reg(data->client, FTS_REG_PSENSOR_ENABLE, state); + if (ret < 0) + FTS_ERROR("write psensor switch command failed"); + return; +} + +/***************************************************************************** +* Name: fts_psensor_enable_set +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_psensor_enable_set(struct sensors_classdev *sensors_cdev, + unsigned int enable) +{ + struct fts_psensor_platform_data *psensor_pdata = + container_of(sensors_cdev, + struct fts_psensor_platform_data, ps_cdev); + struct fts_ts_data *data = psensor_pdata->data; + struct input_dev *input_dev = data->psensor_pdata->input_psensor_dev; + + mutex_lock(&input_dev->mutex); + fts_psensor_enable(data, enable); + psensor_pdata->tp_psensor_data = FTS_PSENSOR_ORIGINAL_STATE_FAR; + if (enable) + psensor_pdata->tp_psensor_opened = 1; + else + psensor_pdata->tp_psensor_opened = 0; + mutex_unlock(&input_dev->mutex); + return enable; +} + +/***************************************************************************** +* Name: fts_read_tp_psensor_data +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_read_tp_psensor_data(struct fts_ts_data *data) +{ + u8 psensor_status; + char tmp; + int ret = 1; + + fts_i2c_read_reg(data->client, + FTS_REG_PSENSOR_STATUS, &psensor_status); + + tmp = data->psensor_pdata->tp_psensor_data; + if (psensor_status == FTS_PSENSOR_STATUS_NEAR) + data->psensor_pdata->tp_psensor_data = + FTS_PSENSOR_FAR_TO_NEAR; + else if (psensor_status == FTS_PSENSOR_STATUS_FAR) + data->psensor_pdata->tp_psensor_data = + FTS_PSENSOR_NEAR_TO_FAR; + + if (tmp != data->psensor_pdata->tp_psensor_data) { + FTS_ERROR("%s sensor data changed", __func__); + ret = 0; + } + return ret; +} + + +int fts_sensor_read_data(struct fts_ts_data *data) +{ + int ret = 0; + if (fts_psensor_support_enabled() && data->psensor_pdata->tp_psensor_opened) { + ret = fts_read_tp_psensor_data(data); + if (!ret) { + if (data->suspended) { + pm_wakeup_event(&data->client->dev, FTS_PSENSOR_WAKEUP_TIMEOUT); + } + input_report_abs(data->psensor_pdata->input_psensor_dev, + ABS_DISTANCE, + data->psensor_pdata->tp_psensor_data); + input_sync(data->psensor_pdata->input_psensor_dev); + } + return 1; + } + return 0; +} + +int fts_sensor_suspend(struct fts_ts_data *data) +{ + int ret = 0; + + if (fts_psensor_support_enabled() && + device_may_wakeup(&data->client->dev) && + data->psensor_pdata->tp_psensor_opened) { + ret = enable_irq_wake(data->client->irq); + if (ret != 0) { + FTS_ERROR("%s: set_irq_wake failed", __func__); + } + data->suspended = true; + return 1; + } + + return 0; +} + + +int fts_sensor_resume(struct fts_ts_data *data) +{ + int ret = 0; + + if (fts_psensor_support_enabled() && + device_may_wakeup(&data->client->dev) && data->psensor_pdata->tp_psensor_opened) { + ret = disable_irq_wake(data->client->irq); + if (ret) { + FTS_ERROR("%s: disable_irq_wake failed", __func__); + } + data->suspended = false; + return 1; + } + + return 0; +} + + +int fts_sensor_init(struct fts_ts_data *data) +{ + struct fts_psensor_platform_data *psensor_pdata; + struct input_dev *psensor_input_dev; + int err; + + if (fts_psensor_support_enabled()) { + device_init_wakeup(&data->client->dev, 1); + psensor_pdata = devm_kzalloc(&data->client->dev, + sizeof(struct fts_psensor_platform_data), + GFP_KERNEL); + if (!psensor_pdata) { + FTS_ERROR("Failed to allocate memory"); + goto irq_free; + } + data->psensor_pdata = psensor_pdata; + + psensor_input_dev = input_allocate_device(); + if (!psensor_input_dev) { + FTS_ERROR("Failed to allocate device"); + goto free_psensor_pdata; + } + + __set_bit(EV_ABS, psensor_input_dev->evbit); + input_set_abs_params(psensor_input_dev, ABS_DISTANCE, 0, 1, 0, 0); + psensor_input_dev->name = "proximity"; + psensor_input_dev->id.bustype = BUS_I2C; + psensor_input_dev->dev.parent = &data->client->dev; + data->psensor_pdata->input_psensor_dev = psensor_input_dev; + + err = input_register_device(psensor_input_dev); + if (err) { + FTS_ERROR("Unable to register device, err=%d", err); + goto free_psensor_input_dev; + } + + psensor_pdata->ps_cdev = sensors_proximity_cdev; + psensor_pdata->ps_cdev.sensors_enable = fts_psensor_enable_set; + psensor_pdata->data = data; + + err = sensors_classdev_register(&data->client->dev, &psensor_pdata->ps_cdev); + if (err) { + goto unregister_psensor_input_device; + } + } + + return 0; +unregister_psensor_input_device: + if (fts_psensor_support_enabled()) + input_unregister_device(data->psensor_pdata->input_psensor_dev); +free_psensor_input_dev: + if (fts_psensor_support_enabled()) + input_free_device(data->psensor_pdata->input_psensor_dev); +free_psensor_pdata: + if (fts_psensor_support_enabled()) { + devm_kfree(&data->client->dev, psensor_pdata); + data->psensor_pdata = NULL; + } +irq_free: + if (fts_psensor_support_enabled()) + device_init_wakeup(&data->client->dev, 0); + free_irq(data->client->irq, data); + + return 1; +} + +int fts_sensor_remove(struct fts_ts_data *data) +{ + if (fts_psensor_support_enabled()) { + device_init_wakeup(&data->client->dev, 0); + sensors_classdev_unregister(&data->psensor_pdata->ps_cdev); + input_unregister_device(data->psensor_pdata->input_psensor_dev); + devm_kfree(&data->client->dev, data->psensor_pdata); + data->psensor_pdata = NULL; + } + return 0; +} +#endif /* FTS_PSENSOR_EN */ diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/Makefile b/drivers/input/touchscreen/FT8716/focaltech_test/Makefile new file mode 100755 index 0000000000000..410b854ae591e --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/Makefile @@ -0,0 +1,10 @@ +#drivers/input/touchscreen/focaltech_touch/focaltech_test +# +#Makefile for test module +# + + + +obj-$(CONFIG_TOUCHSCREEN_FTS) += src/ +obj-$(CONFIG_TOUCHSCREEN_FTS) += supported_ic/ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/focaltech_test_config.h b/drivers/input/touchscreen/FT8716/focaltech_test/focaltech_test_config.h new file mode 100755 index 0000000000000..394e5eaa86485 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/focaltech_test_config.h @@ -0,0 +1,63 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_config.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +************************************************************************/ +#include "../focaltech_core.h" + + +/*----------------------------------------------------------- +IC Type Test +-----------------------------------------------------------*/ +#define FT5X46_TEST 0x20 +#define FT6X36_TEST 0x40 +#define FT5822_TEST 0x70 +#define FT8606_TEST 0x90 +#define FT8716_TEST 0xA0 +#define FT3C47_TEST 0xB0 +#define FT8607_TEST 0xC0 +#define FT8736_TEST 0xE0 +#define FT3D47_TEST 0xF0 +#define FTE716_TEST 0x100 +#define FTE736_TEST 0x140 +#define FT8006_TEST 0x130 + + +#ifdef FTS_CHIP_TYPE + +#if (FTS_CHIP_TYPE == _FT8716) +#define FTS_CHIP_TEST_TYPE FT8716_TEST +#elif(FTS_CHIP_TYPE == _FT8736) +#define FTS_CHIP_TEST_TYPE FT8736_TEST +#elif(FTS_CHIP_TYPE == _FT8006) +#define FTS_CHIP_TEST_TYPE FT8006_TEST +#elif(FTS_CHIP_TYPE == _FT8606) +#define FTS_CHIP_TEST_TYPE FT8606_TEST +#elif(FTS_CHIP_TYPE == _FT8607) +#define FTS_CHIP_TEST_TYPE FT8607_TEST +#elif(FTS_CHIP_TYPE == _FTE716) +#define FTS_CHIP_TEST_TYPE FTE716_TEST +#elif(FTS_CHIP_TYPE == _FT3D47) +#define FTS_CHIP_TEST_TYPE FT3D47_TEST +#elif(IC_SERIALS == 0x01) +#define FTS_CHIP_TEST_TYPE FT5822_TEST +#elif(FTS_CHIP_TYPE == _FT3C47U) +#define FTS_CHIP_TEST_TYPE FT3C47_TEST +#elif(IC_SERIALS == 0x02) +#define FTS_CHIP_TEST_TYPE FT5X46_TEST +#elif((IC_SERIALS == 0x03) || (IC_SERIALS == 0x04)) +#define FTS_CHIP_TEST_TYPE FT6X36_TEST +#endif + +#else +#define FTS_CHIP_TEST_TYPE FT8716_TEST + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_ic_table.h b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_ic_table.h new file mode 100755 index 0000000000000..bfb5ab7510479 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_ic_table.h @@ -0,0 +1,115 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __FOCALTECH_IC_TABLE_H__ +#define __FOCALTECH_IC_TABLE_H__ +/***************************************************************************** +* +* File Name: focaltech_ic_table.h +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ + +/*----------------------------------------------------------- +IC corresponding code, each of the IC code is 8 bit, high 4 bit on behalf of the same series, low 4 bit on behalf of the specific IC +-----------------------------------------------------------*/ +enum IC_Type { + IC_FT5X36 = 0x10, + IC_FT5X36i = 0x11, + IC_FT3X16 = 0x12, + IC_FT3X26 = 0x13, + + IC_FT5X46 = 0x21, + IC_FT5X46i = 0x22, + IC_FT5526 = 0x23, + IC_FT3X17 = 0x24, + IC_FT5436 = 0x25, + IC_FT3X27 = 0x26, + IC_FT5526I = 0x27, + IC_FT5416 = 0x28, + IC_FT5426 = 0x29, + IC_FT5435 = 0x2A, + IC_FT7681 = 0x2B, + IC_FT7661 = 0x2C, + IC_FT7511 = 0x2D, + IC_FT7421 = 0x2E, + IC_FT6X06 = 0x30, + IC_FT3X06 = 0x31, + IC_FT6X36 = 0x40, + IC_FT3X07 = 0x41, + IC_FT6416 = 0x42, + IC_FT6426 = 0x43, + IC_FT7401 = 0x44, + IC_FT3407U = 0x45, + IC_FT6236U = 0x46, + IC_FT6436U = 0x47, + IC_FT3267 = 0x48, + IC_FT3367 = 0x49, + IC_FT5X16 = 0x50, + IC_FT5X12 = 0x51, + IC_FT5506 = 0x60, + IC_FT5606 = 0x61, + IC_FT5816 = 0x62, + IC_FT5822 = 0x70, + IC_FT5626 = 0x71, + IC_FT5726 = 0x72, + IC_FT5826B = 0x73, + IC_FT3617 = 0x74, + IC_FT3717 = 0x75, + IC_FT7811 = 0x76, + IC_FT5826S = 0x77, + IC_FT5306 = 0x80, + IC_FT5406 = 0x81, + IC_FT8606 = 0x90, + IC_FT8716 = 0xA0, + IC_FT3C47U = 0xB0, + IC_FT8607 = 0xC0, + IC_FT8707 = 0xD0, + IC_FT8736 = 0xE0, + IC_FT3D47 = 0xF0, + IC_FTE716 = 0x100, + IC_FT5442 = 0x110, + IC_FT3428U = 0x120, + IC_FT8201 = 0x130, + IC_FT8006M = 0x131, + IC_FTE736 = 0x140 +}; + + + +extern unsigned int fts_ic_table_get_ic_code_from_ic_name(char *strIcName); +extern void fts_ic_table_get_ic_name_from_ic_code(unsigned int ic_code, char *strIcName); + +extern unsigned int fts_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2); +extern unsigned int fts_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2); +extern int fts_ic_table_need_chip_id2(unsigned int chip_id); + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_detail_threshold.h b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_detail_threshold.h new file mode 100755 index 0000000000000..c93ca27592419 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_detail_threshold.h @@ -0,0 +1,131 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ + +#ifndef _DETAIL_THRESHOLD_H +#define _DETAIL_THRESHOLD_H + +#define TX_NUM_MAX 60 +#define RX_NUM_MAX 60 +#define NUM_MAX (TX_NUM_MAX)*(RX_NUM_MAX) +#define MAX_PATH 256 + +#define BUFFER_LENGTH 512 +#define MAX_TEST_ITEM 20 +#define MAX_GRAPH_ITEM 20 +#define MAX_CHANNEL_NUM 144 + +#define FORCETOUCH_ROW 1 + +struct stCfg_Incell_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + + int (*CBTest_Min)[RX_NUM_MAX]; + int (*CBTest_Max)[RX_NUM_MAX]; + + int (*CBUniformityTest_CHX_Linearity)[RX_NUM_MAX]; + int (*CBUniformityTest_CHY_Linearity)[RX_NUM_MAX]; + +}; + +struct stCfg_MCap_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + unsigned char (*InvalidNode_SC)[RX_NUM_MAX]; + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + int (*RawDataTest_Low_Min)[RX_NUM_MAX]; + int (*RawDataTest_Low_Max)[RX_NUM_MAX]; + int (*RawDataTest_High_Min)[RX_NUM_MAX]; + int (*RawDataTest_High_Max)[RX_NUM_MAX]; + int (*RxLinearityTest_Max)[RX_NUM_MAX]; + int (*TxLinearityTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Min)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Max)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Min)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Max)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Min)[RX_NUM_MAX]; + int (*NoistTest_Coefficient)[RX_NUM_MAX]; + int (*LCDNoistTest_Coefficient)[RX_NUM_MAX]; + + int ForceTouch_SCapRawDataTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; +}; + +struct stCfg_SCap_DetailThreshold { + int TempData[MAX_CHANNEL_NUM]; + int RawDataTest_Max[MAX_CHANNEL_NUM]; + int RawDataTest_Min[MAX_CHANNEL_NUM]; + int CiTest_Max[MAX_CHANNEL_NUM]; + int CiTest_Min[MAX_CHANNEL_NUM]; + int DeltaCiTest_Base[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase1[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase2[MAX_CHANNEL_NUM]; + int CiDeviationTest_Base[MAX_CHANNEL_NUM]; + + int NoiseTest_Max[MAX_CHANNEL_NUM]; + int DeltaCxTest_Sort[MAX_CHANNEL_NUM]; + int DeltaCxTest_Area[MAX_CHANNEL_NUM]; + + int CbTest_Max[MAX_CHANNEL_NUM]; + int CbTest_Min[MAX_CHANNEL_NUM]; + int DeltaCbTest_Base[MAX_CHANNEL_NUM]; + int DifferTest_Base[MAX_CHANNEL_NUM]; + int CBDeviationTest_Base[MAX_CHANNEL_NUM]; + int K1DifferTest_Base[MAX_CHANNEL_NUM]; +}; + +void OnInit_MCap_DetailThreshold(char *strIniFile); +void OnInit_SCap_DetailThreshold(char *strIniFile); +void OnInit_Incell_DetailThreshold(char *strIniFile); + +void set_max_channel_num(void); + +void OnInit_InvalidNode(char *strIniFile); +void OnInit_DThreshold_RawDataTest(char *strIniFile); +void OnInit_DThreshold_SCapRawDataTest(char *strIniFile); +void OnInit_DThreshold_SCapCbTest(char *strIniFile); + +void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile); +void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile); + + +void OnInit_DThreshold_RxLinearityTest(char *strIniFile); +void OnInit_DThreshold_TxLinearityTest(char *strIniFile); + +void OnInit_DThreshold_PanelDifferTest(char *strIniFile); + +void OnInit_DThreshold_CBTest(char *strIniFile); +void OnInit_DThreshold_AllButtonCBTest(char *strIniFile); +void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile); + +void OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue); + +int malloc_struct_DetailThreshold(void); +void free_struct_DetailThreshold(void); +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_ini.h b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_ini.h new file mode 100755 index 0000000000000..2385d63f72272 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_ini.h @@ -0,0 +1,66 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#ifndef INI_H +#define INI_H + +#define MAX_KEY_NUM 300 +#define MAX_KEY_NAME_LEN 50 +#define MAX_KEY_VALUE_LEN 360 + +#define MAX_CFG_BUF 480 +#define SUCCESS 0 +/* return value */ +#define CFG_OK SUCCESS +#define CFG_SECTION_NOT_FOUND -1 +#define CFG_KEY_NOT_FOUND -2 +#define CFG_ERR -10 + +#define CFG_ERR_OPEN_FILE -10 +#define CFG_ERR_CREATE_FILE -11 +#define CFG_ERR_READ_FILE -12 +#define CFG_ERR_WRITE_FILE -13 +#define CFG_ERR_FILE_FORMAT -14 +#define CFG_ERR_TOO_MANY_KEY_NUM -15 +#define CFG_ERR_OUT_OF_LEN -16 + +#define CFG_ERR_EXCEED_BUF_SIZE -22 + +#define COPYF_OK SUCCESS +#define COPYF_ERR_OPEN_FILE -10 +#define COPYF_ERR_CREATE_FILE -11 +#define COPYF_ERR_READ_FILE -12 +#define COPYF_ERR_WRITE_FILE -13 + +typedef struct _ST_INI_FILE_DATA { + char pSectionName[MAX_KEY_NAME_LEN]; + char pKeyName[MAX_KEY_NAME_LEN]; + char pKeyValue[MAX_KEY_VALUE_LEN]; + int iSectionNameLen; + int iKeyNameLen; + int iKeyValueLen; +} ST_INI_FILE_DATA; + + + +int ini_get_key(char *filedata, char *section, char *key, char *value); + + +int fts_atoi(char *nptr); +char *ini_str_trim_r(char *buf); +char *ini_str_trim_l(char *buf); + +int init_key_data(void); +int ini_get_key_data(char *filedata); +int release_key_data(void); +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_main.h b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_main.h new file mode 100755 index 0000000000000..5b22edfd3d87f --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_main.h @@ -0,0 +1,240 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#ifndef _TEST_LIB_H +#define _TEST_LIB_H + +#include "focaltech_test_detail_threshold.h" +#include "../focaltech_test_config.h" + +#define boolean unsigned char +#define bool unsigned char +#define BYTE unsigned char +#define false 0 +#define true 1 + +enum NodeType { + NODE_INVALID_TYPE = 0, + NODE_VALID_TYPE = 1, + NODE_KEY_TYPE = 2, + NODE_AST_TYPE = 3, +}; + + +typedef int (*FTS_I2C_READ_FUNCTION)(unsigned char *, int , unsigned char *, int); +typedef int (*FTS_I2C_WRITE_FUNCTION)(unsigned char *, int); + +extern FTS_I2C_READ_FUNCTION fts_i2c_read_test; +extern FTS_I2C_WRITE_FUNCTION fts_i2c_write_test; + +extern int init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read); +extern int init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write); + + + + + + +int set_param_data(char *TestParamData); +boolean start_test_tp(void); +int get_test_data(char *pTestData); + + +int focaltech_test_main_init(void); +int focaltech_test_main_exit(void); + + +#define MIN_HOLE_LEVEL (-1) +#define MAX_HOLE_LEVEL 0x7F +/*----------------------------------------------------------- +Error Code for Comm +-----------------------------------------------------------*/ +#define ERROR_CODE_OK 0x00 +#define ERROR_CODE_CHECKSUM_ERROR 0x01 +#define ERROR_CODE_INVALID_COMMAND 0x02 +#define ERROR_CODE_INVALID_PARAM 0x03 +#define ERROR_CODE_IIC_WRITE_ERROR 0x04 +#define ERROR_CODE_IIC_READ_ERROR 0x05 +#define ERROR_CODE_WRITE_USB_ERROR 0x06 +#define ERROR_CODE_WAIT_RESPONSE_TIMEOUT 0x07 +#define ERROR_CODE_PACKET_RE_ERROR 0x08 +#define ERROR_CODE_NO_DEVICE 0x09 +#define ERROR_CODE_WAIT_WRITE_TIMEOUT 0x0a +#define ERROR_CODE_READ_USB_ERROR 0x0b +#define ERROR_CODE_COMM_ERROR 0x0c +#define ERROR_CODE_ALLOCATE_BUFFER_ERROR 0x0d +#define ERROR_CODE_DEVICE_OPENED 0x0e +#define ERROR_CODE_DEVICE_CLOSED 0x0f + +/*----------------------------------------------------------- +Test Status +-----------------------------------------------------------*/ +#define RESULT_NULL 0 +#define RESULT_PASS 1 +#define RESULT_NG 2 +#define RESULT_TESTING 3 +#define RESULT_TBD 4 +#define RESULT_REPLACE 5 +#define RESULT_CONNECTING 6 + +/*----------------------------------------------------------- + +read write max bytes per time +-----------------------------------------------------------*/ + +#define BYTES_PER_TIME 128 + +extern void fts_test_funcs(void); +struct StTestFuncs { + void (*OnInit_TestItem)(char *); + void (*OnInit_BasicThreshold)(char *) ; + void (*SetTestItem)(void) ; + boolean (*Start_Test)(void); + int (*Get_test_data)(char *); +}; +extern struct StTestFuncs g_stTestFuncs; + +struct StruScreenSeting { + int iSelectedIC; + int iTxNum; + int iRxNum; + int isNormalize; + int iUsedMaxTxNum; + int iUsedMaxRxNum; + + unsigned char iChannelsNum; + unsigned char iKeyNum; +}; +extern struct StruScreenSeting g_ScreenSetParam; +struct stTestItem { + unsigned char ItemType; + unsigned char TestNum; + unsigned char TestResult; + unsigned char ItemCode; + + +}; +extern struct stTestItem g_stTestItem[1][MAX_TEST_ITEM]; + +struct structSCapConfEx { + unsigned char ChannelXNum; + unsigned char ChannelYNum; + unsigned char KeyNum; + unsigned char KeyNumTotal; + bool bLeftKey1; + bool bLeftKey2; + bool bLeftKey3; + bool bRightKey1; + bool bRightKey2; + bool bRightKey3; +}; +extern struct structSCapConfEx g_stSCapConfEx; + +enum NORMALIZE_Type { + Overall_Normalize = 0, + Auto_Normalize = 1, +}; + +enum PROOF_TYPE { + Proof_Normal, + Proof_Level0, + Proof_NoWaterProof, +}; + +/*----------------------------------------------------------- +IC Capacitance Type 0:Self Capacitance, 1:Mutual Capacitance, 2:IDC +-----------------------------------------------------------*/ +enum enum_Report_Protocol_Type { + Self_Capacitance = 0, + Mutual_Capacitance = 1, + IDC_Capacitance = 2, +}; + +#if (FTS_CHIP_TEST_TYPE == FT6X36_TEST) +#define IC_Capacitance_Type 0 +#elif ((FTS_CHIP_TEST_TYPE == FT3C47_TEST) || (FTS_CHIP_TEST_TYPE == FT5822_TEST) || (FTS_CHIP_TEST_TYPE == FT5X46_TEST) || (FTS_CHIP_TEST_TYPE == FT3D47_TEST)) +#define IC_Capacitance_Type 1 +#elif ((FTS_CHIP_TEST_TYPE == FT8606_TEST) || (FTS_CHIP_TEST_TYPE == FT8607_TEST) || (FTS_CHIP_TEST_TYPE == FT8716_TEST) || (FTS_CHIP_TEST_TYPE == FT8736_TEST) || (FTS_CHIP_TEST_TYPE == FTE716_TEST) || (FTS_CHIP_TEST_TYPE == FTE736_TEST) || (FTS_CHIP_TEST_TYPE == FT8006_TEST)) +#define IC_Capacitance_Type 2 +#endif + + + + +extern struct stCfg_MCap_DetailThreshold g_stCfg_MCap_DetailThreshold; +extern struct stCfg_SCap_DetailThreshold g_stCfg_SCap_DetailThreshold; +extern struct stCfg_Incell_DetailThreshold g_stCfg_Incell_DetailThreshold; + + +extern int g_TestItemNum;/*test item num*/ +extern char g_strIcName[20];/*IC Name*/ +extern char *g_pStoreAllData; + +int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile); +void focal_msleep(int ms); +void SysDelay(int ms); +int focal_abs(int value); + + +void OnInit_InterfaceCfg(char *strIniFile); + +int ReadReg(unsigned char RegAddr, unsigned char *RegData); +int WriteReg(unsigned char RegAddr, unsigned char RegData); +unsigned char Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead); + +unsigned char EnterWork(void); +unsigned char EnterFactory(void); + +void fts_SetTestItemCodeName(unsigned char ucitemcode); + +extern void *fts_malloc(size_t size); +extern void fts_free(void *p); + +extern int InitTest(void); +extern void FinishTest(void); +extern void InitStoreParamOfTestData(void); +extern void MergeAllTestData(void); +extern int AllocateMemory(void); +extern void FreeMemory(void); + +extern char *g_pTmpBuff; +extern char *g_pStoreMsgArea; +extern int g_lenStoreMsgArea; +extern char *g_pMsgAreaLine2; +extern int g_lenMsgAreaLine2; +extern char *g_pStoreDataArea; +extern int g_lenStoreDataArea; +extern unsigned char m_ucTestItemCode; +extern int m_iStartLine; +extern int m_iTestDataCount; + +extern char *TestResult ; +extern int TestResultLen; + +#define FOCAL_TEST_DEBUG_EN 0 +#if (FOCAL_TEST_DEBUG_EN) +#define FTS_TEST_DBG(fmt, args...) do {printk(KERN_ERR "[FTS] [TEST]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_FUNC_ENTER() printk(KERN_ERR "[FTS][TEST]%s: Enter(%d)\n", __func__, __LINE__) +#define FTS_TEST_FUNC_EXIT() printk(KERN_ERR "[FTS][TEST]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_TEST_DBG(fmt, args...) do {} while (0) +#define FTS_TEST_FUNC_ENTER() +#define FTS_TEST_FUNC_EXIT() +#endif + +#define FTS_TEST_INFO(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Info]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_ERROR(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Error]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) + + + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_supported_ic.h b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_supported_ic.h new file mode 100755 index 0000000000000..7bd7ff7eb5c35 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_supported_ic.h @@ -0,0 +1,1589 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R) All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ + +#include +#include + +#include "../focaltech_test_config.h" +#include "focaltech_test_main.h" + +#if (FTS_CHIP_TEST_TYPE == FT8716_TEST) + +struct stCfg_FT8716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + +}; +struct stCfg_FT8716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + bool bCBTest_VKey_DCheck_Check; + int CbTest_Min_DCheck_Vkey; + int CbTest_Max_DCheck_Vkey; + + bool bLcdBusyAdjust; + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + int LCDNoiseTest_SequenceFrame; + int LCDNoiseTest_MaxFrame; + +}; +enum enumTestItem_FT8716 { + Code_FT8716_ENTER_FACTORY_MODE, + Code_FT8716_DOWNLOAD, + Code_FT8716_UPGRADE, + Code_FT8716_FACTORY_ID_TEST, + Code_FT8716_PROJECT_CODE_TEST, + Code_FT8716_FW_VERSION_TEST, + Code_FT8716_IC_VERSION_TEST, + Code_FT8716_RAWDATA_TEST, + Code_FT8716_CHANNEL_NUM_TEST, + + Code_FT8716_INT_PIN_TEST, + Code_FT8716_RESET_PIN_TEST, + Code_FT8716_NOISE_TEST, + Code_FT8716_CB_TEST, + + + Code_FT8716_WRITE_CONFIG, + + Code_FT8716_SHORT_CIRCUIT_TEST, + Code_FT8716_OPEN_TEST, + Code_FT8716_CB_UNIFORMITY_TEST, + Code_FT8716_DIFFER_UNIFORMITY_TEST, + Code_FT8716_DIFFER2_UNIFORMITY_TEST, + Code_FT8716_LCD_NOISE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT3D47_TEST) + +struct stCfg_FT3D47_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + + bool FORCETOUCH_CHANNEL_NUM_TEST; + bool FORCETOUCH_RAWDATA_TEST; + bool FORCETOUCH_CB_TEST; + bool FORCETOUCH_WEAK_SHORT_CIRCUIT_TEST; + bool FORCETOUCH_FLATNESS_TEST; +}; + +struct stCfg_FT3D47_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int ForceTouch_ChannelNumTest_ChannelNum; + + int ForceTouch_SCapRawDataTest_OFF_Min; + int ForceTouch_SCapRawDataTest_OFF_Max; + int ForceTouch_SCapRawDataTest_ON_Min; + int ForceTouch_SCapRawDataTest_ON_Max; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_ON; + + int ForceTouch_SCapCbTest_OFF_Min; + int ForceTouch_SCapCbTest_OFF_Max; + int ForceTouch_SCapCbTest_ON_Min; + int ForceTouch_SCapCbTest_ON_Max; + BYTE ForceTouch_SCapCBTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapCBTest_SetWaterproof_ON; + + int ForceTouch_WeakShortTest_CG; + int ForceTouch_WeakShortTest_CC; + bool bForceTouch_WeakShortTest_CapShortTest; + + int ForceTouch_FlatnessTest_Differ_Threshold; + int ForceTouch_FlatnessTest_Differ_Coefficient; + bool ForceTouch_FlatnessTest_Differ_Threshold_Check; + bool ForceTouch_FlatnessTest_Differ_Coefficient_Check; + +}; +enum enumTestItem_FT3D47 { + Code_FT3D47_ENTER_FACTORY_MODE, + Code_FT3D47_DOWNLOAD, + Code_FT3D47_UPGRADE, + Code_FT3D47_FACTORY_ID_TEST, + Code_FT3D47_PROJECT_CODE_TEST, + Code_FT3D47_FW_VERSION_TEST, + Code_FT3D47_IC_VERSION_TEST, + Code_FT3D47_RAWDATA_TEST, + Code_FT3D47_ADCDETECT_TEST, + Code_FT3D47_SCAP_CB_TEST, + Code_FT3D47_SCAP_RAWDATA_TEST, + Code_FT3D47_CHANNEL_NUM_TEST, + Code_FT3D47_INT_PIN_TEST, + Code_FT3D47_RESET_PIN_TEST, + Code_FT3D47_NOISE_TEST, + Code_FT3D47_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3D47_UNIFORMITY_TEST, + Code_FT3D47_CM_TEST, + Code_FT3D47_RAWDATA_MARGIN_TEST, + Code_FT3D47_WRITE_CONFIG, + Code_FT3D47_PANELDIFFER_TEST, + Code_FT3D47_PANELDIFFER_UNIFORMITY_TEST, + Code_FT3D47_LCM_ID_TEST, + Code_FT3D47_JUDEG_NORMALIZE_TYPE, + Code_FT3D47_TE_TEST, + Code_FT3D47_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT3D47_PATTERN_TEST, + + Code_FT3D47_GPIO_TEST, + Code_FT3D47_LCD_NOISE_TEST, + Code_FT3D47_FORCE_TOUCH_CHANNEL_NUM_TEST, + Code_FT3D47_FORCE_TOUCH_SCAP_RAWDATA_TEST, + Code_FT3D47_FORCE_TOUCH_SCAP_CB_TEST, + Code_FT3D47_FORCE_TOUCH_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3D47_FORCE_TOUCH_FLATNESS_TEST, +}; + + +#elif (FTS_CHIP_TEST_TYPE == FT8607_TEST) + +struct stCfg_FT8607_TESTItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool OPEN_TEST; +}; + +struct stCfg_FT8607_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMax; + + int iLCDNoiseCoefficient; + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Open_Test_CBMin; +}; + + +enum enumTestItem_FT8607 { + Code_FT8607_ENTER_FACTORY_MODE, + Code_FT8607_DOWNLOAD, + Code_FT8607_UPGRADE, + Code_FT8607_FACTORY_ID_TEST, + Code_FT8607_PROJECT_CODE_TEST, + Code_FT8607_FW_VERSION_TEST, + Code_FT8607_IC_VERSION_TEST, + Code_FT8607_RAWDATA_TEST, + Code_FT8607_CHANNEL_NUM_TEST, + + Code_FT8607_INT_PIN_TEST, + Code_FT8607_RESET_PIN_TEST, + Code_FT8607_NOISE_TEST, + Code_FT8607_CB_TEST, + + + Code_FT8607_WRITE_CONFIG, + + Code_FT8607_SHORT_CIRCUIT_TEST, + Code_FT8607_LCD_NOISE_TEST, + + Code_FT8607_OSC60MHZ_TEST, + Code_FT8607_OSCTRM_TEST, + Code_FT8607_SNR_TEST, + Code_FT8607_DIFFER_TEST, + Code_FT8607_DIFFER_UNIFORMITY_TEST, + + Code_FT8607_LPWG_RAWDATA_TEST, + Code_FT8607_LPWG_CB_TEST, + Code_FT8607_LPWG_NOISE_TEST, + + Code_FT8607_OPEN_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT5X46_TEST) +/*----------------------------------------------- +FT5X46 and FT5X22 is the same series of chips +FT5422\FT5X22 is the chip code for internally develope +FT5X46 is the chip code for market +------------------------------------------------*/ +struct stCfg_FT5X46_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + bool PANEL_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + bool GPIO_TEST; + bool LCD_NOISE_TEST; +}; +struct stCfg_FT5X46_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int Lcd_Noise_MaxFrame; + int Lcd_Noise_Conficient; + int Lcd_Noise_Noise_Mode; + int Lcd_Noise_MaxNgPoint; + int Lcd_Noise_FrameNum; + + bool Lcd_Noise_NoiseThresholdMode; + int Lcd_Noise_NoiseCoefficient; + int Lcd_Noise_NoiseMax; + int Lcd_Noise_SetFrequency; +}; +enum enumTestItem_FT5X46 { + Code_FT5X46_ENTER_FACTORY_MODE, + Code_FT5X46_DOWNLOAD, + Code_FT5X46_UPGRADE, + Code_FT5X46_FACTORY_ID_TEST, + Code_FT5X46_PROJECT_CODE_TEST, + Code_FT5X46_FW_VERSION_TEST, + Code_FT5X46_IC_VERSION_TEST, + Code_FT5X46_RAWDATA_TEST, + Code_FT5X46_ADCDETECT_TEST, + Code_FT5X46_SCAP_CB_TEST, + Code_FT5X46_SCAP_RAWDATA_TEST, + Code_FT5X46_CHANNEL_NUM_TEST, + Code_FT5X46_INT_PIN_TEST, + Code_FT5X46_RESET_PIN_TEST, + Code_FT5X46_NOISE_TEST, + Code_FT5X46_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5X46_UNIFORMITY_TEST, + Code_FT5X46_CM_TEST, + Code_FT5X46_RAWDATA_MARGIN_TEST, + Code_FT5X46_WRITE_CONFIG, + Code_FT5X46_PANELDIFFER_TEST, + Code_FT5X46_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5X46_LCM_ID_TEST, + Code_FT5X46_JUDEG_NORMALIZE_TYPE, + Code_FT5X46_TE_TEST, + Code_FT5X46_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5X46_PATTERN_TEST, + Code_FT5X46_GPIO_TEST, + Code_FT5X46_LCD_NOISE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT6X36_TEST) + +struct stCfg_FT6X36_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool CHANNEL_SHORT_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool DELTA_CB_TEST; + bool CHANNELS_DEVIATION_TEST; + bool TWO_SIDES_DEVIATION_TEST; + bool FPC_SHORT_TEST; + bool FPC_OPEN_TEST; + bool SREF_OPEN_TEST; + bool TE_TEST; + bool CB_DEVIATION_TEST; + bool DIFFER_TEST; + bool WEAK_SHORT_TEST; + bool DIFFER_TEST2; + bool K1_DIFFER_TEST; +}; + +struct stCfg_FT6X36_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelNum; + BYTE ChannelNumTest_KeyNum; + int ChannelShortTest_K1; + int ChannelShortTest_K2; + int ChannelShortTest_CB; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int WeakShortThreshold; + int NoiseTest_Max; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int FPCShort_CB_Min; + int FPCShort_CB_Max; + int FPCShort_RawData_Min; + int FPCShort_RawData_Max; + int FPCOpen_CB_Min; + int FPCOpen_CB_Max; + int FPCOpen_RawData_Min; + int FPCOpen_RawData_Max; + int SREFOpen_Hole_Base1; + int SREFOpen_Hole_Base2; + int SREFOpen_Hole; + int CBDeviationTest_Hole; + int Differ_Ave_Hole; + int Differ_Max_Hole; + int CbTest_Min; + int CbTest_Max; + int DeltaCbTest_Base; + int DeltaCbTest_Differ_Max; + bool DeltaCbTest_Include_Key_Test; + int DeltaCbTest_Key_Differ_Max; + int DeltaCbTest_Deviation_S1; + int DeltaCbTest_Deviation_S2; + int DeltaCbTest_Deviation_S3; + int DeltaCbTest_Deviation_S4; + int DeltaCbTest_Deviation_S5; + int DeltaCbTest_Deviation_S6; + bool DeltaCbTest_Set_Critical; + int DeltaCbTest_Critical_S1; + int DeltaCbTest_Critical_S2; + int DeltaCbTest_Critical_S3; + int DeltaCbTest_Critical_S4; + int DeltaCbTest_Critical_S5; + int DeltaCbTest_Critical_S6; + + int ChannelsDeviationTest_Deviation_S1; + int ChannelsDeviationTest_Deviation_S2; + int ChannelsDeviationTest_Deviation_S3; + int ChannelsDeviationTest_Deviation_S4; + int ChannelsDeviationTest_Deviation_S5; + int ChannelsDeviationTest_Deviation_S6; + bool ChannelsDeviationTest_Set_Critical; + int ChannelsDeviationTest_Critical_S1; + int ChannelsDeviationTest_Critical_S2; + int ChannelsDeviationTest_Critical_S3; + int ChannelsDeviationTest_Critical_S4; + int ChannelsDeviationTest_Critical_S5; + int ChannelsDeviationTest_Critical_S6; + + int TwoSidesDeviationTest_Deviation_S1; + int TwoSidesDeviationTest_Deviation_S2; + int TwoSidesDeviationTest_Deviation_S3; + int TwoSidesDeviationTest_Deviation_S4; + int TwoSidesDeviationTest_Deviation_S5; + int TwoSidesDeviationTest_Deviation_S6; + bool TwoSidesDeviationTest_Set_Critical; + int TwoSidesDeviationTest_Critical_S1; + int TwoSidesDeviationTest_Critical_S2; + int TwoSidesDeviationTest_Critical_S3; + int TwoSidesDeviationTest_Critical_S4; + int TwoSidesDeviationTest_Critical_S5; + int TwoSidesDeviationTest_Critical_S6; + + int DifferTest2_Data_H_Min; + int DifferTest2_Data_H_Max; + int DifferTest2_Data_M_Min; + int DifferTest2_Data_M_Max; + int DifferTest2_Data_L_Min; + int DifferTest2_Data_L_Max; + bool bDifferTest2_Data_H; + bool bDifferTest2_Data_M; + bool bDifferTest2_Data_L; + int K1DifferTest_StartK1; + int K1DifferTest_EndK1; + int K1DifferTest_MinHold2; + int K1DifferTest_MaxHold2; + int K1DifferTest_MinHold4; + int K1DifferTest_MaxHold4; + int K1DifferTest_Deviation2; + int K1DifferTest_Deviation4; +}; + +enum enumTestItem_FT6X36 { + Code_FT6X36_ENTER_FACTORY_MODE, + Code_FT6X36_DOWNLOAD, + Code_FT6X36_UPGRADE, + Code_FT6X36_FACTORY_ID_TEST, + Code_FT6X36_PROJECT_CODE_TEST, + Code_FT6X36_FW_VERSION_TEST, + Code_FT6X36_IC_VERSION_TEST, + Code_FT6X36_RAWDATA_TEST, + Code_FT6X36_CHANNEL_NUM_TEST, + Code_FT6X36_CHANNEL_SHORT_TEST, + Code_FT6X36_INT_PIN_TEST, + Code_FT6X36_RESET_PIN_TEST, + Code_FT6X36_NOISE_TEST, + Code_FT6X36_CB_TEST, + Code_FT6X36_DELTA_CB_TEST, + Code_FT6X36_CHANNELS_DEVIATION_TEST, + Code_FT6X36_TWO_SIDES_DEVIATION_TEST, + Code_FT6X36_FPC_SHORT_TEST, + Code_FT6X36_FPC_OPEN_TEST, + Code_FT6X36_SREF_OPEN_TEST, + Code_FT6X36_TE_TEST, + Code_FT6X36_CB_DEVIATION_TEST, + Code_FT6X36_WRITE_CONFIG, + Code_FT6X36_DIFFER_TEST, + Code_FT6X36_WEAK_SHORT_TEST, + Code_FT6X36_DIFFER_TEST2, + Code_FT6X36_K1_DIFFER_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT5822_TEST) + +struct stCfg_FT5822_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; +}; +struct stCfg_FT5822_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; +}; +enum enumTestItem_FT5822 { + Code_FT5822_ENTER_FACTORY_MODE, + Code_FT5822_DOWNLOAD, + Code_FT5822_UPGRADE, + Code_FT5822_FACTORY_ID_TEST, + Code_FT5822_PROJECT_CODE_TEST, + Code_FT5822_FW_VERSION_TEST, + Code_FT5822_IC_VERSION_TEST, + Code_FT5822_RAWDATA_TEST, + Code_FT5822_ADCDETECT_TEST, + Code_FT5822_SCAP_CB_TEST, + Code_FT5822_SCAP_RAWDATA_TEST, + Code_FT5822_CHANNEL_NUM_TEST, + Code_FT5822_INT_PIN_TEST, + Code_FT5822_RESET_PIN_TEST, + Code_FT5822_NOISE_TEST, + Code_FT5822_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5822_UNIFORMITY_TEST, + Code_FT5822_CM_TEST, + Code_FT5822_RAWDATA_MARGIN_TEST, + Code_FT5822_WRITE_CONFIG, + Code_FT5822_PANELDIFFER_TEST, + Code_FT5822_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5822_LCM_ID_TEST, + Code_FT5822_JUDEG_NORMALIZE_TYPE, + Code_FT5822_TE_TEST, + Code_FT5822_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5822_PATTERN_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT8006_TEST) + +struct stCfg_FT8006_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_TEST; + +}; +struct stCfg_FT8006_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Differ2Test_Min; + int Differ2Test_Max; + +}; +enum enumTestItem_FT8006 { + Code_FT8006_ENTER_FACTORY_MODE, + Code_FT8006_DOWNLOAD, + Code_FT8006_UPGRADE, + Code_FT8006_FACTORY_ID_TEST, + Code_FT8006_PROJECT_CODE_TEST, + Code_FT8006_FW_VERSION_TEST, + Code_FT8006_IC_VERSION_TEST, + Code_FT8006_RAWDATA_TEST, + Code_FT8006_CHANNEL_NUM_TEST, + Code_FT8006_INT_PIN_TEST, + Code_FT8006_RESET_PIN_TEST, + Code_FT8006_NOISE_TEST, + Code_FT8006_CB_TEST, + Code_FT8006_WRITE_CONFIG, + Code_FT8006_SHORT_CIRCUIT_TEST, + Code_FT8006_LCD_NOISE_TEST, + + Code_FT8006_OSC60MHZ_TEST, + Code_FT8006_OSCTRM_TEST, + Code_FT8006_SNR_TEST, + Code_FT8006_DIFFER_TEST, + Code_FT8006_DIFFER_UNIFORMITY_TEST, + + Code_FT8006_LPWG_RAWDATA_TEST, + Code_FT8006_LPWG_CB_TEST, + Code_FT8006_LPWG_NOISE_TEST, + Code_FT8006_DIFFER2_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT8736_TEST) + +struct stCfg_FT8736_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool CB_DECREASE_TEST; + bool VREF_DECREASE_TEST; +}; +struct stCfg_FT8736_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + + int CBDecrease_Step; + int CBDecrease_OrgMin; + int CBDecrease_OrgMax; + int CBDecrease_CalcMin; + int CBDecrease_CalcMax; + + int VRefDecrease_StepBegin; + int VRefDecrease_StepEnd; + int VRefDecrease_OrgMin; + int VRefDecrease_OrgMax; + int VRefDecrease_CalcMin; + int VRefDecrease_CalcMax; +}; + +enum enumTestItem_FT8736 { + Code_FT8736_ENTER_FACTORY_MODE, + Code_FT8736_DOWNLOAD, + Code_FT8736_UPGRADE, + Code_FT8736_FACTORY_ID_TEST, + Code_FT8736_PROJECT_CODE_TEST, + Code_FT8736_FW_VERSION_TEST, + Code_FT8736_IC_VERSION_TEST, + Code_FT8736_RAWDATA_TEST, + Code_FT8736_CHANNEL_NUM_TEST, + + Code_FT8736_INT_PIN_TEST, + Code_FT8736_RESET_PIN_TEST, + Code_FT8736_NOISE_TEST, + Code_FT8736_CB_TEST, + + + Code_FT8736_WRITE_CONFIG, + + Code_FT8736_SHORT_CIRCUIT_TEST, + Code_FT8736_OPEN_TEST, + Code_FT8736_CB_UNIFORMITY_TEST, + Code_FT8736_DIFFER_UNIFORMITY_TEST, + Code_FT8736_DIFFER2_UNIFORMITY_TEST, + Code_FT8736_LCD_NOISE_TEST, + Code_FT8736_CB_DECREASE_TEST, + Code_FT8736_VREF_DECREASE_TEST, + Code_FT8736_IC_TYPE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FTE716_TEST) +struct stCfg_FTE716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool GPIO_TEST; +}; +struct stCfg_FTE716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + bool bOri_ProjectCode; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + BYTE LCDNoiseTest_NoiseMode; +}; + +enum enumTestItem_FTE716 { + Code_FTE716_ENTER_FACTORY_MODE, + Code_FTE716_DOWNLOAD, + Code_FTE716_UPGRADE, + Code_FTE716_FACTORY_ID_TEST, + Code_FTE716_PROJECT_CODE_TEST, + Code_FTE716_FW_VERSION_TEST, + Code_FTE716_IC_VERSION_TEST, + Code_FTE716_RAWDATA_TEST, + Code_FTE716_CHANNEL_NUM_TEST, + + Code_FTE716_INT_PIN_TEST, + Code_FTE716_RESET_PIN_TEST, + Code_FTE716_NOISE_TEST, + Code_FTE716_CB_TEST, + + + Code_FTE716_WRITE_CONFIG, + + Code_FTE716_SHORT_CIRCUIT_TEST, + Code_FTE716_OPEN_TEST, + Code_FTE716_CB_UNIFORMITY_TEST, + Code_FTE716_DIFFER_UNIFORMITY_TEST, + Code_FTE716_DIFFER2_UNIFORMITY_TEST, + Code_FTE716_LCD_NOISE_TEST, + Code_FTE716_GPIO_TEST, + Code_FTE716_IC_TYPE_TEST, +}; +#elif(FTS_CHIP_TEST_TYPE == FT8606_TEST) + +struct stCfg_FT8606_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool IVSN_TEST; +}; +struct stCfg_FT8606_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int CbTest_Min; + int CbTest_Max; + int ShortTest_Max; + int ShortTest_K2Value; + bool ShortTest_Tip; + bool IsDifferMode; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; +}; + + +enum enumTestItem_FT8606 { + Code_FT8606_ENTER_FACTORY_MODE, + Code_FT8606_DOWNLOAD, + Code_FT8606_UPGRADE, + Code_FT8606_FACTORY_ID_TEST, + Code_FT8606_PROJECT_CODE_TEST, + Code_FT8606_FW_VERSION_TEST, + Code_FT8606_IC_VERSION_TEST, + Code_FT8606_RAWDATA_TEST, + Code_FT8606_CHANNEL_NUM_TEST, + + Code_FT8606_INT_PIN_TEST, + Code_FT8606_RESET_PIN_TEST, + Code_FT8606_NOISE_TEST, + Code_FT8606_CB_TEST, + + + Code_FT8606_WRITE_CONFIG, + + Code_FT8606_SHORT_CIRCUIT_TEST, + Code_FT8606_LCD_NOISE_TEST, + Code_FT8606_OSC60MHZ_TEST, + Code_FT8606_OSCTRM_TEST, + Code_FT8606_IVSN_TEST, +}; +#elif(FTS_CHIP_TEST_TYPE == FT3C47_TEST) + +struct stCfg_FT3C47_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + + bool FORCETOUCH_CHANNEL_NUM_TEST; + bool FORCETOUCH_RAWDATA_TEST; + bool FORCETOUCH_CB_TEST; + bool FORCETOUCH_WEAK_SHORT_CIRCUIT_TEST; + bool FORCETOUCH_FLATNESS_TEST; +}; + +struct stCfg_FT3C47_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int ForceTouch_ChannelNumTest_ChannelNum; + + int ForceTouch_SCapRawDataTest_OFF_Min; + int ForceTouch_SCapRawDataTest_OFF_Max; + int ForceTouch_SCapRawDataTest_ON_Min; + int ForceTouch_SCapRawDataTest_ON_Max; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_ON; + + int ForceTouch_SCapCbTest_OFF_Min; + int ForceTouch_SCapCbTest_OFF_Max; + int ForceTouch_SCapCbTest_ON_Min; + int ForceTouch_SCapCbTest_ON_Max; + BYTE ForceTouch_SCapCBTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapCBTest_SetWaterproof_ON; + + int ForceTouch_WeakShortTest_CG; + int ForceTouch_WeakShortTest_CC; + bool bForceTouch_WeakShortTest_CapShortTest; + + int ForceTouch_FlatnessTest_Differ_Threshold; + int ForceTouch_FlatnessTest_Differ_Coefficient; + bool ForceTouch_FlatnessTest_Differ_Threshold_Check; + bool ForceTouch_FlatnessTest_Differ_Coefficient_Check; + +}; +enum enumTestItem_FT3C47 { + Code_FT3C47_ENTER_FACTORY_MODE, + Code_FT3C47_DOWNLOAD, + Code_FT3C47_UPGRADE, + Code_FT3C47_FACTORY_ID_TEST, + Code_FT3C47_PROJECT_CODE_TEST, + Code_FT3C47_FW_VERSION_TEST, + Code_FT3C47_IC_VERSION_TEST, + Code_FT3C47_RAWDATA_TEST, + Code_FT3C47_ADCDETECT_TEST, + Code_FT3C47_SCAP_CB_TEST, + Code_FT3C47_SCAP_RAWDATA_TEST, + Code_FT3C47_CHANNEL_NUM_TEST, + Code_FT3C47_INT_PIN_TEST, + Code_FT3C47_RESET_PIN_TEST, + Code_FT3C47_NOISE_TEST, + Code_FT3C47_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_UNIFORMITY_TEST, + Code_FT3C47_CM_TEST, + Code_FT3C47_RAWDATA_MARGIN_TEST, + Code_FT3C47_WRITE_CONFIG, + Code_FT3C47_PANELDIFFER_TEST, + Code_FT3C47_PANELDIFFER_UNIFORMITY_TEST, + Code_FT3C47_LCM_ID_TEST, + Code_FT3C47_JUDEG_NORMALIZE_TYPE, + Code_FT3C47_TE_TEST, + Code_FT3C47_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT3C47_PATTERN_TEST, + + Code_FT3C47_GPIO_TEST, + Code_FT3C47_LCD_NOISE_TEST, + Code_FT3C47_FORCE_TOUCH_CHANNEL_NUM_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_RAWDATA_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_CB_TEST, + Code_FT3C47_FORCE_TOUCH_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_FORCE_TOUCH_FLATNESS_TEST, +}; +#endif + + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/Makefile b/drivers/input/touchscreen/FT8716/focaltech_test/src/Makefile new file mode 100755 index 0000000000000..cb7b431f884c6 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/Makefile @@ -0,0 +1,12 @@ +#drivers/input/touchscreen/focaltech_touch/focaltech_test/src +# +# Makefile for test module +# +# Linux driver folder + +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_main.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_ini.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_global.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_detail_threshold.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_ic_table.o diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_ic_table.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_ic_table.c new file mode 100755 index 0000000000000..9c6db37efbfd1 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_ic_table.c @@ -0,0 +1,534 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/***************************************************************************** +* +* File Name: Focaltech_ic_table.c +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ + +#include +#include +#include "../include/focaltech_ic_table.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FOCALTECH_IC_TABLE_INFO "File Version of focaltech_ic_table.c: V1.0.0 2016-03-22" + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + + +/***************************************************************************** +* functions body +*****************************************************************************/ + + +unsigned int fts_ic_table_get_ic_code_from_ic_name(char *strIcName) +{ + + if (strncmp(strIcName, "FT5X36", 6) == 0) + return IC_FT5X36; + if (strncmp(strIcName, "FT5X36i", 7) == 0) + return IC_FT5X36i; + if (strncmp(strIcName, "FT3X16", 6) == 0) + return IC_FT3X16; + if (strncmp(strIcName, "FT3X26", 6) == 0) + return IC_FT3X26; + + if (strncmp(strIcName, "FT5X22", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46i", 7) == 0) + return IC_FT5X46i; + if (strncmp(strIcName, "FT5526", 6) == 0) + return IC_FT5526; + if (strncmp(strIcName, "FT3X17", 6) == 0) + return IC_FT3X17; + if (strncmp(strIcName, "FT5436", 6) == 0) + return IC_FT5436; + if (strncmp(strIcName, "FT3X27", 6) == 0) + return IC_FT3X27; + if (strncmp(strIcName, "FT5526i", 7) == 0) + return IC_FT5526I; + if (strncmp(strIcName, "FT5416", 6) == 0) + return IC_FT5416; + if (strncmp(strIcName, "FT5426", 6) == 0) + return IC_FT5426; + if (strncmp(strIcName, "FT5435", 6) == 0) + return IC_FT5435; + if (strncmp(strIcName, "FT7681", 6) == 0) + return IC_FT7681; + if (strncmp(strIcName, "FT7661", 6) == 0) + return IC_FT7661; + if (strncmp(strIcName, "FT7511", 6) == 0) + return IC_FT7511; + if (strncmp(strIcName, "FT7421", 6) == 0) + return IC_FT7421; + + + if (strncmp(strIcName, "FT6X06", 6) == 0) + return IC_FT6X06; + if (strncmp(strIcName, "FT3X06", 6) == 0) + return IC_FT3X06; + + if (strncmp(strIcName, "FT6X36", 6) == 0) + return IC_FT6X36; + if (strncmp(strIcName, "FT3X07", 6) == 0) + return IC_FT3X07; + if (strncmp(strIcName, "FT6416", 6) == 0) + return IC_FT6416; + if (strncmp(strIcName, "FT6336G/U", 9) == 0) + return IC_FT6426; + if (strncmp(strIcName, "FT6236U", 7) == 0) + return IC_FT6236U; + if (strncmp(strIcName, "FT6436U", 7) == 0) + return IC_FT6436U; + if (strncmp(strIcName, "FT3267", 6) == 0) + return IC_FT3267; + if (strncmp(strIcName, "FT3367", 6) == 0) + return IC_FT3367; + if (strncmp(strIcName, "FT7401", 6) == 0) + return IC_FT7401; + if (strncmp(strIcName, "FT3407U", 7) == 0) + return IC_FT3407U; + + + + if (strncmp(strIcName, "FT5X16", 6) == 0) + return IC_FT5X16; + if (strncmp(strIcName, "FT5X12", 6) == 0) + return IC_FT5X12; + + if (strncmp(strIcName, "FT5506", 6) == 0) + return IC_FT5506; + if (strncmp(strIcName, "FT5606", 6) == 0) + return IC_FT5606; + if (strncmp(strIcName, "FT5816", 6) == 0) + return IC_FT5816; + + if (strncmp(strIcName, "FT5822", 6) == 0) + return IC_FT5822; + if (strncmp(strIcName, "FT5626", 6) == 0) + return IC_FT5626; + if (strncmp(strIcName, "FT5726", 6) == 0) + return IC_FT5726; + if (strncmp(strIcName, "FT5826B", 7) == 0) + return IC_FT5826B; + if (strncmp(strIcName, "FT3617", 6) == 0) + return IC_FT3617; + if (strncmp(strIcName, "FT3717", 6) == 0) + return IC_FT3717; + if (strncmp(strIcName, "FT7811", 6) == 0) + return IC_FT7811; + if (strncmp(strIcName, "FT5826S", 7) == 0) + return IC_FT5826S; + + if (strncmp(strIcName, "FT5306", 6) == 0) + return IC_FT5306; + if (strncmp(strIcName, "FT5406", 6) == 0) + return IC_FT5406; + + if (strncmp(strIcName, "FT8606", 6) == 0) + return IC_FT8606; + if (strncmp(strIcName, "FT8716", 6) == 0) + return IC_FT8716; + + if (strncmp(strIcName, "FT3C47U", 7) == 0) + return IC_FT3C47U; + + if (strncmp(strIcName, "FT8607", 6) == 0) + return IC_FT8607; + if (strncmp(strIcName, "FT8707", 6) == 0) + return IC_FT8707; + + + if (strncmp(strIcName, "FT8736", 6) == 0) + return IC_FT8736; + + if (strncmp(strIcName, "FT3D47", 6) == 0) + return IC_FT3D47; + + if (strncmp(strIcName, "FTE716", 6) == 0) + return IC_FTE716; + + if (strncmp(strIcName, "FT5442", 6) == 0) + return IC_FT5442; + + if (strncmp(strIcName, "FT3428U", 7) == 0) + return IC_FT3428U; + + if (strncmp(strIcName, "FT8006M", 7) == 0) + return IC_FT8006M; + + if (strncmp(strIcName, "FT8201", 6) == 0) + return IC_FT8201; + + if (strncmp(strIcName, "FTE736", 6) == 0) + return IC_FTE736; + + printk("%s. can NOT get ic code. ERROR !!! \n", __func__); + + return 0xff; +} + + +void fts_ic_table_get_ic_name_from_ic_code(unsigned int ucIcCode, char *strIcName) +{ + if (NULL == strIcName)return; + + sprintf(strIcName, "%s", "NA");/*if can't find IC , set 'NA'*/ + + if (ucIcCode == IC_FT5X36) + sprintf(strIcName, "%s", "FT5X36"); + if (ucIcCode == IC_FT5X36i) + sprintf(strIcName, "%s", "FT5X36i"); + if (ucIcCode == IC_FT3X16) + sprintf(strIcName, "%s", "FT3X16"); + if (ucIcCode == IC_FT3X26) + sprintf(strIcName, "%s", "FT3X26"); + + + if (ucIcCode == IC_FT5X46) + sprintf(strIcName, "%s", "FT5X46"); + if (ucIcCode == IC_FT5X46i) + sprintf(strIcName, "%s", "FT5X46i"); + if (ucIcCode == IC_FT5526) + sprintf(strIcName, "%s", "FT5526"); + if (ucIcCode == IC_FT3X17) + sprintf(strIcName, "%s", "FT3X17"); + if (ucIcCode == IC_FT5436) + sprintf(strIcName, "%s", "FT5436"); + if (ucIcCode == IC_FT3X27) + sprintf(strIcName, "%s", "FT3X27"); + if (ucIcCode == IC_FT5526I) + sprintf(strIcName, "%s", "FT5526i"); + if (ucIcCode == IC_FT5416) + sprintf(strIcName, "%s", "FT5416"); + if (ucIcCode == IC_FT5426) + sprintf(strIcName, "%s", "FT5426"); + if (ucIcCode == IC_FT5435) + sprintf(strIcName, "%s", "FT5435"); + if (ucIcCode == IC_FT7681) + sprintf(strIcName, "%s", "FT7681"); + if (ucIcCode == IC_FT7661) + sprintf(strIcName, "%s", "FT7661"); + if (ucIcCode == IC_FT7511) + sprintf(strIcName, "%s", "FT7511"); + if (ucIcCode == IC_FT7421) + sprintf(strIcName, "%s", "FT7421"); + + if (ucIcCode == IC_FT6X06) + sprintf(strIcName, "%s", "FT6X06"); + if (ucIcCode == IC_FT3X06) + sprintf(strIcName, "%s", "FT3X06"); + + if (ucIcCode == IC_FT6X36) + sprintf(strIcName, "%s", "FT6X36"); + if (ucIcCode == IC_FT3X07) + sprintf(strIcName, "%s", "FT3X07"); + if (ucIcCode == IC_FT6416) + sprintf(strIcName, "%s", "FT6416"); + if (ucIcCode == IC_FT6426) + sprintf(strIcName, "%s", "FT6336G/U"); + if (ucIcCode == IC_FT6236U) + sprintf(strIcName, "%s", "FT6236U"); + if (ucIcCode == IC_FT6436U) + sprintf(strIcName, "%s", "FT6436U"); + if (ucIcCode == IC_FT3267) + sprintf(strIcName, "%s", "FT3267"); + if (ucIcCode == IC_FT3367) + sprintf(strIcName, "%s", "FT3367"); + if (ucIcCode == IC_FT7401) + sprintf(strIcName, "%s", "FT7401"); + if (ucIcCode == IC_FT3407U) + sprintf(strIcName, "%s", "FT3407U"); + + if (ucIcCode == IC_FT5X16) + sprintf(strIcName, "%s", "FT5X16"); + if (ucIcCode == IC_FT5X12) + sprintf(strIcName, "%s", "FT5X12"); + + if (ucIcCode == IC_FT5506) + sprintf(strIcName, "%s", "FT5506"); + if (ucIcCode == IC_FT5606) + sprintf(strIcName, "%s", "FT5606"); + if (ucIcCode == IC_FT5816) + sprintf(strIcName, "%s", "FT5816"); + + if (ucIcCode == IC_FT5822) + sprintf(strIcName, "%s", "FT5822"); + if (ucIcCode == IC_FT5626) + sprintf(strIcName, "%s", "FT5626"); + if (ucIcCode == IC_FT5726) + sprintf(strIcName, "%s", "FT5726"); + if (ucIcCode == IC_FT5826B) + sprintf(strIcName, "%s", "FT5826B"); + if (ucIcCode == IC_FT3617) + sprintf(strIcName, "%s", "FT3617"); + if (ucIcCode == IC_FT3717) + sprintf(strIcName, "%s", "FT3717"); + if (ucIcCode == IC_FT7811) + sprintf(strIcName, "%s", "FT7811"); + if (ucIcCode == IC_FT5826S) + sprintf(strIcName, "%s", "FT5826S"); + + if (ucIcCode == IC_FT5306) + sprintf(strIcName, "%s", "FT5306"); + if (ucIcCode == IC_FT5406) + sprintf(strIcName, "%s", "FT5406"); + + if (ucIcCode == IC_FT8606) + sprintf(strIcName, "%s", "FT8606"); + if (ucIcCode == IC_FT8716) + sprintf(strIcName, "%s", "FT8716"); + + if (ucIcCode == IC_FT3C47U) + sprintf(strIcName, "%s", "FT3C47U"); + + if (ucIcCode == IC_FT8607) + sprintf(strIcName, "%s", "FT8607"); + if (ucIcCode == IC_FT8707) + sprintf(strIcName, "%s", "FT8707"); + if (ucIcCode == IC_FT8736) + sprintf(strIcName, "%s", "FT8736"); + + if (ucIcCode == IC_FT3D47) + sprintf(strIcName, "%s", "FT3D47"); + + if (ucIcCode == IC_FTE716) + sprintf(strIcName, "%s", "FTE716"); + + if (ucIcCode == IC_FT5442) + sprintf(strIcName, "%s", "FT5442"); + + if (ucIcCode == IC_FT3428U) + sprintf(strIcName, "%s", "FT3428U"); + + if (ucIcCode == IC_FT8006M) + sprintf(strIcName, "%s", "FT8006M"); + + if (ucIcCode == IC_FT8201) + sprintf(strIcName, "%s", "FT8201"); + + if (ucIcCode == IC_FTE736) + sprintf(strIcName, "%s", "FTE736"); + + + + return ; +} + + +unsigned int fts_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2) +{ + unsigned int ic_code = 0; + switch (chip_id) { + case 0x55: + ic_code = IC_FT5306; + break; + case 0x08: + ic_code = IC_FT5606; + break; + case 0x0a: + ic_code = IC_FT5X16; + break; + case 0x06: + ic_code = IC_FT6X06; + break; + case 0x36: + ic_code = IC_FT6X36; + break; + case 0x14: + ic_code = IC_FT5X36; + break; + case 0x13: + ic_code = IC_FT3X16; + break; + case 0x12: + ic_code = IC_FT5X36i; + break; + case 0x11: + ic_code = IC_FT5X36i; + break; + case 0x54: + ic_code = IC_FT5X46; + break; + case 0x58: + ic_code = IC_FT5822; + break; + + + case 0x86: + if (0x06 == chip_id2) + ic_code = IC_FT8606; + else if (0x07 == chip_id2) + ic_code = IC_FT8607; + break; + case 0x87: + if (0x07 == chip_id2) + ic_code = IC_FT8707; + else if (0x16 == chip_id2) + ic_code = IC_FT8716; + else if (0x36 == chip_id2) + ic_code = IC_FT8736; + break; + case 0xE7: + if (0x16 == chip_id2) + ic_code = IC_FTE716; + else if (0x36 == chip_id2) + ic_code = IC_FTE736; + break; + default: + ic_code = 0; + break; + } + return ic_code; +} + +unsigned int fts_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2) +{ + unsigned char uc_chip_id = 0; + unsigned char uc_chip_id2 = 0; + switch (ic_code>>4) { + case (IC_FT5306>>4): + uc_chip_id = 0x55; + break; + case (IC_FT5606>>4): + uc_chip_id = 0x08; + break; + case (IC_FT5X16>>4): + uc_chip_id = 0x0a; + break; + case (IC_FT6X06>>4): + uc_chip_id = 0x06; + break; + case (IC_FT6X36>>4): + uc_chip_id = 0x36; + break; + case (IC_FT5X36>>4): + switch (ic_code) { + case (IC_FT5X36): + uc_chip_id = 0x14; + break; + case (IC_FT3X26): + uc_chip_id = 0x13; + break; + case (IC_FT3X16): + uc_chip_id = 0x12; + break; + case (IC_FT5X36i): + uc_chip_id = 0x11; + break; + } + break; + case (IC_FT5X46>>4): + uc_chip_id = 0x54; + break; + case (IC_FT5822>>4): + uc_chip_id = 0x58; + break; + + + case (IC_FT8606>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x06; + break; + case (IC_FT8607>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x07; + break; + case (IC_FT8707>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x07; + break; + case (IC_FT8716>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x16; + break; + case (IC_FT8736>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x36; + break; + case (IC_FTE716>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x16; + break; + case (IC_FTE736>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x36; + break; + + default: + uc_chip_id = 0; + break; + + } + + *chip_id = uc_chip_id; + *chip_id2 = uc_chip_id2; + + return 0; +} +int fts_ic_table_need_chip_id2(unsigned int chip_id) +{ + int b_need_id2 = -1; + switch (chip_id) { + case 0x86: + case 0x87: + case 0xE7: + b_need_id2 = 0; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + default: + b_need_id2 = -1; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + + } + return b_need_id2; +} diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test.c new file mode 100755 index 0000000000000..3b3210f0b4118 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test.c @@ -0,0 +1,902 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/************************************************************************ +* +* File Name: focaltech_test.c +* +* Author: Software Department, FocalTech +* +* Created: 2016-08-01 +* +* Modify: +* +* Abstract: create char device and proc node for the comm between APK and TP +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include +#include +#include +#include +#include + +#include +#include + +#include "../../focaltech_core.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_test_ini.h" + +#include +#include +#define CTP_PARENT_PROC_NAME "touchscreen" +#define CTP_OPEN_PROC_NAME "ctp_openshort_test" + +#if FTS_LOCK_DOWN_INFO +static char tp_lockdown_info[128]; +#define FTS_PROC_LOCKDOWN_FILE "lockdown_info" +static int fts_lockdown_proc_show(struct seq_file *file, void *data) +{ + char temp[40] = {0}; + + sprintf(temp, "%s\n", tp_lockdown_info); + seq_printf(file, "%s\n", temp); + + return 0; +} + +static int fts_lockdown_proc_open (struct inode *inode, struct file *file) +{ + return single_open(file, fts_lockdown_proc_show, inode->i_private); +} + +static const struct file_operations fts_lockdown_proc_fops = { + .open = fts_lockdown_proc_open, + .read = seq_read, +}; + +#endif + +#if FTS_CAT_RAWDATA +#define FTS_PROC_RAWDATA "rawdata" +static u8 g_isdiff = 1; +/************************************************************************ +* Name: StartScan(Same function name as FT_MultipleTest) +* Brief: Scan TP, do it before read Raw Data +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static int StartScan(struct i2c_client *client) +{ + u8 RegVal = 0x00; + u8 times = 0; + const u8 MaxTimes = 20; + u8 ReCode = -1; + + ReCode = fts_i2c_write_reg(client, 0x00, 0xC0); + if (ReCode >= 0) { + while (times++ < MaxTimes) { + msleep(8); + ReCode = fts_i2c_read_reg(client, 0x00, &RegVal); + if (RegVal == 0x40) + break; + } + + if (times > MaxTimes) + return -EPERM; + } + return ReCode; +} + +int read_rawdata(struct i2c_client *client, int is_diff, s16 *data, int len) +{ + u8 reg = 0x6A; + u8 regdata[1280] = { 0 }; + int remain_bytes; + int pos = 0; + int i = 0; + + FTS_DEBUG("len=%d, is_diff=%d", len, is_diff); + fts_i2c_write_reg(client, 0x06, is_diff); + + if (StartScan(client) < 0) + return -EPERM; + + fts_i2c_write_reg(client, 0x01, 0xAD); + + if (len <= 256) + fts_i2c_read(client, ®, 1, regdata, len); + else { + fts_i2c_read(client, ®, 1, regdata, 256); + remain_bytes = len - 256; + for (i = 1; remain_bytes > 0; i++) { + if (remain_bytes > 256) + fts_i2c_read(client, ®, 0, regdata + i * 256, 256); + else + fts_i2c_read(client, ®, 0, regdata + i * 256, remain_bytes); + remain_bytes -= 256; + } + } + + for (i = 0; i < len;) { + data[pos++] = ((s16)(regdata[i]) << 8) + regdata[i+1]; + i += 2; + } + return 0; +} + +int get_rawdata(struct i2c_client *client, s16 *data, u8 *txlen, u8 *rxlen) +{ + u8 val; + int i; + + /* 0xEE = 1, not clb */ + fts_i2c_write_reg(client, 0xEE, 1); + + /* Enter Factory Mode */ + fts_i2c_write_reg(client, 0x00, 0x40); + do { + fts_i2c_read_reg(client, 0x00, &val); + if (val == 0x40) + break; + msleep(1); + } while (i < 10); + + /* Get Tx/Rx Num */ + fts_i2c_read_reg(client, 0x02, txlen); + fts_i2c_read_reg(client, 0x03, rxlen); + + /* read_rawdata */ + read_rawdata(client, g_isdiff, data, (*txlen) * (*rxlen) * 2); + + /* Enter in work mode */ + fts_i2c_write_reg(client, 0x00, 0x00); + do { + fts_i2c_read_reg(client, 0x00, &val); + if (val == 0x00) + break; + msleep(1); + } while (i < 10); + + return 0; +} + +static char temp[PAGE_SIZE] = {0}; + +static int fts_rawdata_proc_show(struct seq_file *file, void *buf) +{ + int count; + int i = 0, j = 0; + u8 val; + s16 data[600] = { 0 }; + u8 txlen = 0; + u8 rxlen = 0; + struct i2c_client *client = fts_i2c_client; + + if (fts_wq_data->suspended) { + FTS_INFO("Already in suspend state"); + return -EPERM; + } + mutex_lock(&fts_input_dev->mutex); + + get_rawdata(client, data, &txlen, &rxlen); + + fts_i2c_read_reg(client, 0xEE, &val); + count = snprintf(temp, PAGE_SIZE, "0xEE = %d\n", val); + count += snprintf(temp + count, PAGE_SIZE-count, "%s :\n", g_isdiff ? "DIFF DATA" : "RAWDATA"); + for (i = 0; i < txlen; i++) { + for (j = 0; j < rxlen; j++) { + count += snprintf(temp + count, PAGE_SIZE-count, "%5d ", data[i*rxlen + j]); + } + count += snprintf(temp + count, PAGE_SIZE-count, "\n"); + } + count += snprintf(temp + count, PAGE_SIZE-count, "\n\n"); + seq_printf(file, "%s\n", temp); + memset(temp, 0, PAGE_SIZE); + mutex_unlock(&fts_input_dev->mutex); + + return 0; +} + +static int fts_rawdata_proc_open (struct inode *inode, struct file *file) +{ + return single_open(file, fts_rawdata_proc_show, inode->i_private); +} + +static ssize_t fts_rawdata_proc_store(struct file *file, const char __user *buf, size_t count, loff_t *len) +{ + unsigned long val; + int ret; + char *buff[5] = {0}; + if (fts_wq_data->suspended) { + FTS_INFO("Already in suspend state"); + return -EPERM; + } + ret = copy_from_user(buff, buf, 5); + mutex_lock(&fts_input_dev->mutex); + val = simple_strtoul((char *)buff, NULL, 10); + if (val) + g_isdiff = 1; + else + g_isdiff = 0; + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +static const struct file_operations fts_rawdata_proc_fops = { + .open = fts_rawdata_proc_open, + .read = seq_read, + .write = fts_rawdata_proc_store, +}; +#endif + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); +static const struct file_operations ctp_open_procs_fops = { + .write = ctp_open_proc_write, + .read = ctp_open_proc_read, + .owner = THIS_MODULE, +}; +static struct proc_dir_entry *ctp_device_proc; +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define IC_TEST_VERSION "Test version: V1.0.0--2016-12-28, (sync version of FT_MultipleTest: V4.0.0.0 ------ 2016-07-18)" + + +#define FTS_INI_FILE_PATH "/etc/" + +#define FTS_SAVE_DATA_FILE_PATH "/mnt/sdcard/" + + +#define FTS_TEST_BUFFER_SIZE 80*1024 +#define FTS_TEST_PRINT_SIZE 128 +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static int fts_test_get_ini_size(char *config_name); +static int fts_test_read_ini_data(char *config_name, char *config_buf); +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen); +static int fts_test_get_testparam_from_ini(char *config_name); +static int fts_test_entry(char *ini_file_name); + +static int fts_test_i2c_read(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen); +static int fts_test_i2c_write(unsigned char *writebuf, int writelen); + + +/***************************************************************************** +* functions body +*****************************************************************************/ +#if 0 + +extern struct i2c_client *fts_i2c_client; +extern int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen); +extern int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen); +#endif +static int fts_test_i2c_read(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen) +{ + int iret = -1; +#if 1 + + + iret = fts_i2c_read(fts_i2c_client, writebuf, writelen, readbuf, readlen); +#else + iret = fts_i2c_read(writebuf, writelen, readbuf, readlen); +#endif + + return iret; + +} + +static int fts_test_i2c_write(unsigned char *writebuf, int writelen) +{ + int iret = -1; +#if 1 + + + iret = fts_i2c_write(fts_i2c_client, writebuf, writelen); +#else + iret = fts_i2c_write(writebuf, writelen); +#endif + + return iret; +} + + +static int fts_test_get_ini_size(char *config_name) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + filp_close(pfile, NULL); + + FTS_TEST_FUNC_ENTER(); + + return fsize; +} + + +static int fts_test_read_ini_data(char *config_name, char *config_buf) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + loff_t pos = 0; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, config_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen) +{ + struct file *pfile = NULL; + + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_SAVE_DATA_FILE_PATH, file_name); + if (NULL == pfile) { + + pfile = filp_open(filepath, O_TRUNC|O_CREAT|O_RDWR, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_write(pfile, data_buf, iLen, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_get_testparam_from_ini(char *config_name) +{ + char *pcfiledata = NULL; + int ret = 0; + int inisize = 0; + + FTS_TEST_FUNC_ENTER(); + + inisize = fts_test_get_ini_size(config_name); + FTS_TEST_DBG("ini_size = %d ", inisize); + if (inisize <= 0) { + FTS_TEST_ERROR("%s ERROR:Get firmware size failed", __func__); + return -EIO; + } + + pcfiledata = fts_malloc(inisize + 1); + if (NULL == pcfiledata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + + memset(pcfiledata, 0, inisize + 1); + + if (fts_test_read_ini_data(config_name, pcfiledata)) { + FTS_TEST_ERROR(" - ERROR: fts_test_read_ini_data failed"); + fts_free(pcfiledata); + pcfiledata = NULL; + + return -EIO; + } else { + FTS_TEST_DBG("fts_test_read_ini_data successful"); + } + + ret = set_param_data(pcfiledata); + + fts_free(pcfiledata); + pcfiledata = NULL; + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} + + + + +static int fts_test_entry(char *ini_file_name) +{ + /* place holder for future use */ + char cfgname[128]; + char *testdata = NULL; + char *printdata = NULL; + int iTestDataLen = 0; + int ret = 0; + int icycle = 0, i = 0; + int print_index = 0; + + + FTS_TEST_FUNC_ENTER(); + FTS_TEST_DBG("ini_file_name:%s.", ini_file_name); + /*Used to obtain the test data stored in the library, pay attention to the size of the distribution space.*/ + FTS_TEST_DBG("Allocate memory, size: %d", FTS_TEST_BUFFER_SIZE); + testdata = fts_malloc(FTS_TEST_BUFFER_SIZE); + if (NULL == testdata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + printdata = fts_malloc(FTS_TEST_PRINT_SIZE); + if (NULL == printdata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + /*Initialize the platform related I2C read and write functions*/ + +#if 0 + init_i2c_write_func(fts_i2c_write); + init_i2c_read_func(fts_i2c_read); +#else + init_i2c_write_func(fts_test_i2c_write); + init_i2c_read_func(fts_test_i2c_read); +#endif + + /*Initialize pointer memory*/ + ret = focaltech_test_main_init(); + if (ret < 0) { + FTS_TEST_ERROR("focaltech_test_main_init() error."); + goto TEST_ERR; + } + + /*Read parse configuration file*/ + memset(cfgname, 0, sizeof(cfgname)); + sprintf(cfgname, "%s", ini_file_name); + FTS_TEST_DBG("ini_file_name = %s", cfgname); + + fts_test_funcs(); + + if (fts_test_get_testparam_from_ini(cfgname) < 0) { + FTS_TEST_ERROR("get testparam from ini failure"); + goto TEST_ERR; + } + + + if ((g_ScreenSetParam.iSelectedIC >> 4 != FTS_CHIP_TEST_TYPE >> 4)) { + FTS_TEST_ERROR("Select IC and Read IC from INI does not match "); + + } + + + /*Start testing according to the test configuration*/ + if (true == start_test_tp()) { + TestResultLen += sprintf(TestResult+TestResultLen, "Tp test pass. \n\n"); + FTS_TEST_INFO("tp test pass"); + ret = 0; + } + + else { + TestResultLen += sprintf(TestResult+TestResultLen, "Tp test failure. \n\n"); + FTS_TEST_INFO("tp test failure"); + ret = 1; + } + + + /*Gets the number of tests in the test library and saves it*/ + iTestDataLen = get_test_data(testdata); + + + icycle = 0; + /*Print test data packets */ + FTS_TEST_DBG("print test data: \n"); + for (i = 0; i < iTestDataLen; i++) { + if (('\0' == testdata[i]) + || (icycle == FTS_TEST_PRINT_SIZE - 2) + || (i == iTestDataLen-1) + ) { + if (icycle == 0) { + print_index++; + } else { + memcpy(printdata, testdata + print_index, icycle); + printdata[FTS_TEST_PRINT_SIZE-1] = '\0'; + FTS_TEST_DBG("%s", printdata); + print_index += icycle; + icycle = 0; + } + } else { + icycle++; + } + } + FTS_TEST_DBG("\n"); + + + + fts_test_save_test_data("testdata.csv", testdata, iTestDataLen); + fts_test_save_test_data("testresult.txt", TestResult, TestResultLen); + + + /*Release memory */ + focaltech_test_main_exit(); + + + + if (NULL != testdata) + fts_free(testdata); + if (NULL != printdata) + fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return ret; + +TEST_ERR: + if (NULL != testdata) + fts_free(testdata); + if (NULL != printdata) + fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return -EPERM; +} + +static int fts_set_ini_name(char *cfgname) +{ + int ret; + u8 vid; + + ret = fts_i2c_read_reg(fts_i2c_client, FTS_REG_VENDOR_ID, &vid); + FTS_TEST_DBG("vendor id:0x%x\n", vid); + if (vid == OFILM_VENDOR) { + sprintf(cfgname, "%s", "fts_ofilm.ini"); + } else if (vid == EACHOPTO_VENDOR) { + sprintf(cfgname, "%s", "fts_eachopto.ini"); + } else if (vid == TXD_VENDOR) { + + sprintf(cfgname, "%s", "fts_holitech.ini"); + } else if (vid == EBBG_VENDOR) { + sprintf(cfgname, "%s", "fts_ebbg.ini"); + } else if (vid == CSOT_VENDOR) { + sprintf(cfgname, "%s", "fts_csot.ini"); + } else{ + pr_err("ctp test not found test config \n"); + } + + return ret; +} + +#if FTS_AUTO_UPGRADE_EN +void waite_for_fw_upgrading(void) +{ + int vid = 0; + if (fw_upgrade_status == FW_UPGRADING) { + for (; fw_upgrade_status == FW_UPGRADING; ) { + + if ((vid%4) == 0) + FTS_TEST_DBG("tp firmware upgrading status:%d\n", fw_upgrade_status); + msleep(200); + vid++; + if (vid > 30) { + FTS_TEST_DBG("takes 6s tp still upgrading status:%d\n", fw_upgrade_status); + break; + } + } + } + return; +} +#endif + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + char fwname[128] = {0}; + int ret; + u8 result = 0; + struct i2c_client *client = fts_i2c_client; + + FTS_TEST_FUNC_ENTER(); +#if FTS_AUTO_UPGRADE_EN + waite_for_fw_upgrading(); +#endif + + if (*ppos) { + FTS_TEST_ERROR("tp test again return\n"); + return 0; + } + *ppos += count; + + memset(fwname, 0, sizeof(fwname)); + fts_set_ini_name(fwname); + fwname[strlen(fwname)] = '\0'; + FTS_TEST_DBG("fwname:%s.", fwname); + + mutex_lock(&fts_input_dev->mutex); + + disable_irq(client->irq); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(DISABLE); +#endif + ret = fts_test_entry(fwname); + if (0 != ret) { + result = 0; + FTS_TEST_ERROR("fts open short test fail \n"); + } else { + result = 1; + FTS_TEST_ERROR("fts open short test success \n"); + } +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(ENABLE); +#endif + enable_irq(client->irq); + + mutex_unlock(&fts_input_dev->mutex); + + FTS_TEST_FUNC_EXIT(); + + return sprintf(ptr, "result=%d\n", result); +} + + +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + void create_ctp_proc(void) +{ + + + + + + struct proc_dir_entry *ctp_open_proc = NULL; + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return; + } + } + ctp_open_proc = proc_create(CTP_OPEN_PROC_NAME, 0777, ctp_device_proc, &ctp_open_procs_fops); + if (ctp_open_proc == NULL) { + FTS_TEST_ERROR("create open_proc fail\n"); + } +} +#if 0 +/************************************************************************ +* Name: fts_test_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_test_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + char fwname[128] = {0}; + int ret; + struct i2c_client *client = fts_i2c_client; + + FTS_TEST_FUNC_ENTER(); + +#if FTS_AUTO_UPGRADE_EN + waite_for_fw_upgrading(); +#endif + memset(fwname, 0, sizeof(fwname)); + fts_set_ini_name(fwname); + fwname[strlen(fwname)] = '\0'; + FTS_TEST_DBG("fwname:%s.", fwname); + + mutex_lock(&fts_input_dev->mutex); + + disable_irq(client->irq); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(DISABLE); +#endif + ret = fts_test_entry(fwname); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(ENABLE); +#endif + enable_irq(client->irq); + + mutex_unlock(&fts_input_dev->mutex); + + FTS_TEST_FUNC_EXIT(); + + return sprintf(buf, "result=%d\n", ret); +} + +/************************************************************************ +* Name: fts_test_store +* Brief: upgrade from app.bin +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_test_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + + return count; +} +/* upgrade from app.bin +* example:echo "***.ini" > fts_test +*/ +static DEVICE_ATTR(fts_test, S_IRUGO|S_IWUSR, fts_test_show, fts_test_store); + +/* add your attr in here*/ +static struct attribute *fts_test_attributes[] = { + &dev_attr_fts_test.attr, + NULL +}; + +static struct attribute_group fts_test_attribute_group = { + .attrs = fts_test_attributes +}; +#endif + +int fts_test_init(struct i2c_client *client) +{ + int err = 0; + + FTS_TEST_FUNC_ENTER(); + + FTS_TEST_INFO("%s\n", IC_TEST_VERSION); + + create_ctp_proc(); + + FTS_TEST_FUNC_EXIT(); + + return err; +} +int fts_test_exit(struct i2c_client *client) +{ + FTS_TEST_FUNC_ENTER(); + + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +#if FTS_LOCK_DOWN_INFO +int fts_lockdown_init(struct i2c_client *client) +{ + int err = 0; + unsigned char auc_i2c_write_buf[10]; + u8 r_buf[10] = {0}; + struct proc_dir_entry *fts_lockdown_status_proc = NULL; + err = fts_i2c_write_reg(client, 0x90, 0x20); + if (err < 0) + FTS_ERROR("[FTS] i2c write 0x90 err\n"); + + msleep(5); + auc_i2c_write_buf[0] = 0x99; + err = fts_i2c_read(client, auc_i2c_write_buf, 1, r_buf, 8); + if (err < 0) + FTS_ERROR("[FTS] i2c read 0x99 err\n"); + + sprintf(tp_lockdown_info, "%02x%02x%02x%02x%02x%02x%02x%02x", \ + r_buf[0], r_buf[1], r_buf[2], r_buf[3], r_buf[4], r_buf[5], r_buf[6], r_buf[7]); + FTS_INFO("tpd_probe, ft8716_ctpm_LockDownInfo_get_from_boot, tp_lockdown_info=%s\n", tp_lockdown_info); + + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return 1; + } + } + fts_lockdown_status_proc = proc_create(FTS_PROC_LOCKDOWN_FILE, 0644, ctp_device_proc, &fts_lockdown_proc_fops); + if (fts_lockdown_status_proc == NULL) { + FTS_ERROR("fts, create_proc_entry ctp_lockdown_status_proc failed\n"); + return 1; + } + return 0 ; +} +#endif + +#if FTS_CAT_RAWDATA +int fts_rawdata_init(struct i2c_client *client) +{ + + struct proc_dir_entry *fts_rawdata_status_proc = NULL; + + + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return 1; + } + } + fts_rawdata_status_proc = proc_create(FTS_PROC_RAWDATA, 0777, ctp_device_proc, &fts_rawdata_proc_fops); + if (fts_rawdata_status_proc == NULL) { + FTS_ERROR("fts, create_proc_entry ctp_lockdown_status_proc failed\n"); + return 1; + } + return 0 ; +} +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_detail_threshold.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_detail_threshold.c new file mode 100755 index 0000000000000..cb06aedc132a1 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_detail_threshold.c @@ -0,0 +1,1812 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_ic_table.h" + + +struct stCfg_MCap_DetailThreshold g_stCfg_MCap_DetailThreshold; +struct stCfg_SCap_DetailThreshold g_stCfg_SCap_DetailThreshold; +struct stCfg_Incell_DetailThreshold g_stCfg_Incell_DetailThreshold; + +void set_max_channel_num(void) +{ + + FTS_TEST_FUNC_ENTER(); + switch (g_ScreenSetParam.iSelectedIC>>4) { + case IC_FT5822>>4: + case IC_FT8006M>>4: + case IC_FTE716>>4: + case IC_FT3D47>>4: + g_ScreenSetParam.iUsedMaxTxNum = TX_NUM_MAX; + g_ScreenSetParam.iUsedMaxRxNum = RX_NUM_MAX; + break; + default: + g_ScreenSetParam.iUsedMaxTxNum = 30; + g_ScreenSetParam.iUsedMaxRxNum = 32; + break; + } + + FTS_TEST_DBG("MaxTxNum = %d, MaxRxNum = %d. ", g_ScreenSetParam.iUsedMaxTxNum, g_ScreenSetParam.iUsedMaxRxNum); + + FTS_TEST_FUNC_EXIT(); + +} + +int malloc_struct_DetailThreshold(void) +{ + FTS_TEST_FUNC_ENTER(); + + + g_stCfg_MCap_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_MCap_DetailThreshold.InvalidNode) + goto ERR; + + g_stCfg_MCap_DetailThreshold.InvalidNode_SC = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_MCap_DetailThreshold.InvalidNode_SC) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) + goto ERR; + + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) + goto ERR; + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) + goto ERR; + + + + g_stCfg_Incell_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_Incell_DetailThreshold.InvalidNode) { + FTS_TEST_DBG("InvalidNode. \n"); + goto ERR; + } + + + g_stCfg_Incell_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + FTS_TEST_DBG("RawDataTest_Min. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + FTS_TEST_DBG("RawDataTest_Max. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBTest_Min) { + FTS_TEST_DBG("CBTest_Min. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBTest_Max) { + FTS_TEST_DBG("CBTest_Max. \n"); + goto ERR; + } + + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHY_Linearity. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHX_Linearity. \n"); + goto ERR; + } + + FTS_TEST_FUNC_EXIT(); + + return 0; + +ERR: + FTS_TEST_ERROR("fts_malloc memory failed in function."); + return -EPERM; +} + +void free_struct_DetailThreshold(void) +{ + if (NULL != g_stCfg_MCap_DetailThreshold.InvalidNode) { + fts_free(g_stCfg_MCap_DetailThreshold.InvalidNode); + g_stCfg_MCap_DetailThreshold.InvalidNode = NULL; + } + if (NULL != g_stCfg_MCap_DetailThreshold.InvalidNode_SC) { + fts_free(g_stCfg_MCap_DetailThreshold.InvalidNode_SC); + g_stCfg_MCap_DetailThreshold.InvalidNode_SC = NULL; + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) { + fts_free(g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient); + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = NULL; + } + + if (NULL != g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max); + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = NULL; + } + + if (NULL != g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min); + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.InvalidNode) { + fts_free(g_stCfg_Incell_DetailThreshold.InvalidNode); + g_stCfg_Incell_DetailThreshold.InvalidNode = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Min); + g_stCfg_Incell_DetailThreshold.RawDataTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBTest_Min) { + fts_free(g_stCfg_Incell_DetailThreshold.CBTest_Min); + g_stCfg_Incell_DetailThreshold.CBTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.CBTest_Max); + g_stCfg_Incell_DetailThreshold.CBTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity); + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity); + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = NULL; + } + + + +} + +void OnInit_SCap_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + OnGetTestItemParam("RawDataTest_Max", strIniFile, 12500); + memcpy(g_stCfg_SCap_DetailThreshold.RawDataTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("RawDataTest_Min", strIniFile, 16500); + memcpy(g_stCfg_SCap_DetailThreshold.RawDataTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiTest_Max", strIniFile, 5); + memcpy(g_stCfg_SCap_DetailThreshold.CiTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiTest_Min", strIniFile, 250); + memcpy(g_stCfg_SCap_DetailThreshold.CiTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_AnotherBase1", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase1, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_AnotherBase2", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase2, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("NoiseTest_Max", strIniFile, 20); + memcpy(g_stCfg_SCap_DetailThreshold.NoiseTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiDeviation_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CiDeviationTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCxTest_Sort", strIniFile, 1); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCxTest_Sort, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCxTest_Area", strIniFile, 1); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCxTest_Area, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + + OnGetTestItemParam("CbTest_Max", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CbTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("CbTest_Min", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CbTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("DeltaCbTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCbTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("DifferTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DifferTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("CBDeviation_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CBDeviationTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("K1DifferTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.K1DifferTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + FTS_TEST_FUNC_EXIT(); +} + +void OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue) +{ + + char strValue[800]; + char str_tmp[128]; + int iValue = 0; + int dividerPos = 0; + int index = 0; + int i = 0, j = 0, k = 0; + memset(g_stCfg_SCap_DetailThreshold.TempData, 0, sizeof(g_stCfg_SCap_DetailThreshold.TempData)); + sprintf(str_tmp, "%d", iDefautValue); + GetPrivateProfileString("Basic_Threshold", strItemName, str_tmp, strValue, strIniFile); + iValue = fts_atoi(strValue); + for (i = 0; i < MAX_CHANNEL_NUM; i++) { + g_stCfg_SCap_DetailThreshold.TempData[i] = iValue; + } + + dividerPos = GetPrivateProfileString("SpecialSet", strItemName, "", strValue, strIniFile); + if (dividerPos > 0) { + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_SCap_DetailThreshold.TempData[k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } +} + +void OnInit_MCap_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + set_max_channel_num(); + + OnInit_InvalidNode(strIniFile); + OnInit_DThreshold_RawDataTest(strIniFile); + OnInit_DThreshold_SCapRawDataTest(strIniFile); + OnInit_DThreshold_SCapCbTest(strIniFile); + + OnInit_DThreshold_ForceTouch_SCapRawDataTest(strIniFile); + OnInit_DThreshold_ForceTouch_SCapCbTest(strIniFile); + + OnInit_DThreshold_RxLinearityTest(strIniFile); + OnInit_DThreshold_TxLinearityTest(strIniFile); + + OnInit_DThreshold_PanelDifferTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} +void OnInit_InvalidNode(char *strIniFile) +{ + + char str[MAX_PATH] = {0}, strTemp[MAX_PATH] = {0}; + int i = 0, j = 0; + + + + FTS_TEST_FUNC_ENTER(); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + sprintf(strTemp, "InvalidNode[%d][%d]", (i+1), (j+1)); + + GetPrivateProfileString("INVALID_NODE", strTemp, "1", str, strIniFile); + if (fts_atoi(str) == 0) { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 0; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 0; + FTS_TEST_DBG("node (%d, %d) \n", (i+1), (j+1)); + + } else if (fts_atoi(str) == 2) { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 2; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 2; + } else { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 1; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 1; + } + + + + + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + sprintf(strTemp, "InvalidNodeS[%d][%d]", (i+1), (j+1)); + GetPrivateProfileString("INVALID_NODES", strTemp, "1", str, strIniFile); + if (fts_atoi(str) == 0) { + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 0; + } else if (fts_atoi(str) == 2) { + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 2; + } else + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 1; + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_RawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if ((g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8716 >> 4) || (g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8736 >> 4) || (g_ScreenSetParam.iSelectedIC >> 4 == IC_FTE716 >> 4)) { + return; + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "10000", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "7000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Max", "15000", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][j] = MaxValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Low_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Min", "3000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Low_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Max", "15000", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][j] = MaxValue; + } + } + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Min", "3000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_High_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_High_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_PanelDifferTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + int index = 0; + int k = 0, i = 0, j = 0; + char str_tmp[128]; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Max_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); + +} + + + +void OnInit_DThreshold_RxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "RxLinearityTest_Max", "50", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Rx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_TxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "TxLinearityTest_Max", "50", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Tx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + FTS_TEST_DBG("%s\r", strTemp); + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_Incell_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + set_max_channel_num(); + + OnInit_InvalidNode(strIniFile); + + OnInit_DThreshold_RawDataTest(strIniFile); + OnInit_DThreshold_CBTest(strIniFile); + OnInit_DThreshold_AllButtonCBTest(strIniFile); + OnThreshold_VkAndVaRawDataSeparateTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_CBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + if (g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8606 >> 4) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, strIniFile); + MaxValue_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, strIniFile); + MinValue_Vkey = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + + +void OnInit_DThreshold_AllButtonCBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if (g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8606 >> 4) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + + +void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + + FTS_TEST_FUNC_ENTER(); + + if ((g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8716 >> 4) && (g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8736 >> 4) && (g_ScreenSetParam.iSelectedIC >> 4 != IC_FTE716 >> 4)) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", str, strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max_VKey", "11000", str, strIniFile); + MaxValue_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min_VKey", "5000", str, strIniFile); + MinValue_Vkey = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + FTS_TEST_FUNC_EXIT(); +} + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_global.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_global.c new file mode 100755 index 0000000000000..1ffd1a743b1af --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_global.c @@ -0,0 +1,499 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_global.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_ic_table.h" + +#define DEVIDE_MODE_ADDR 0x00 + +/*buff length*/ +#define BUFF_LEN_STORE_MSG_AREA 1024*10 +#define BUFF_LEN_MSG_AREA_LINE2 1024*4 +#define BUFF_LEN_STORE_DATA_AREA 1024*80 +#define BUFF_LEN_TMP_BUFFER 1024*16 + + +char *g_pTmpBuff = NULL; +char *g_pStoreMsgArea = NULL; +int g_lenStoreMsgArea = 0; +char *g_pMsgAreaLine2 = NULL; +int g_lenMsgAreaLine2 = 0; +char *g_pStoreDataArea = NULL; +int g_lenStoreDataArea = 0; +unsigned char m_ucTestItemCode = 0; +int m_iStartLine = 0; +int m_iTestDataCount = 0; + +char *TestResult = NULL; +int TestResultLen = 0; + +/*ÄÚ´æÉêÇ뷽ʽ*/ +#define FTS_MALLOC_TYPE 1 +enum enum_malloc_mode { + kmalloc_mode = 0, + vmalloc_mode = 1, +}; + +struct StruScreenSeting g_ScreenSetParam; +struct stTestItem g_stTestItem[1][MAX_TEST_ITEM]; +struct structSCapConfEx g_stSCapConfEx; + +int g_TestItemNum = 0; +char g_strIcName[20] = {0}; +char *g_pStoreAllData = NULL; + +int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile) +{ + char value[512] = {0}; + int len = 0; + + if (NULL == returnValue) { + FTS_TEST_DBG("[FTS] returnValue==NULL in function %s.", __func__); + return 0; + } + + if (ini_get_key(IniFile, section, ItemName, value) < 0) { + if (NULL != defaultvalue) + memcpy(value, defaultvalue, strlen(defaultvalue)); + sprintf(returnValue, "%s", value); + return 0; + } else { + len = sprintf(returnValue, "%s", value); + } + + return len; +} + +void focal_msleep(int ms) +{ + msleep(ms); +} + +void SysDelay(int ms) +{ + msleep(ms); +} + +int focal_abs(int value) +{ + if (value < 0) + value = 0 - value; + + return value; +} + +void *fts_malloc(size_t size) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kmalloc(size, GFP_ATOMIC); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vmalloc(size); + } else { + FTS_TEST_DBG("invalid malloc. \n"); + return NULL; + } + + return NULL; +} + +void fts_free(void *p) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kfree(p); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vfree(p); + } else { + FTS_TEST_DBG("invalid free. \n"); + return ; + } + + return ; +} + +void OnInit_InterfaceCfg(char *strIniFile) +{ + char str[128] = {0}; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Interface", "IC_Type", "FT5X36", str, strIniFile); + g_ScreenSetParam.iSelectedIC = fts_ic_table_get_ic_code_from_ic_name(str); + FTS_TEST_INFO(" IC code :0x%02x. ", g_ScreenSetParam.iSelectedIC); + + + GetPrivateProfileString("Interface", "Normalize_Type", 0, str, strIniFile); + g_ScreenSetParam.isNormalize = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); + +} +/************************************************************************ +* Name: ReadReg(Same function name as FT_MultipleTest) +* Brief: Read Register +* Input: RegAddr +* Output: RegData +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int ReadReg(unsigned char RegAddr, unsigned char *RegData) +{ + int iRet; + + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + iRet = fts_i2c_read_test(&RegAddr, 1, RegData, 1); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} + +/************************************************************************ +* Name: WriteReg(Same function name as FT_MultipleTest) +* Brief: Write Register +* Input: RegAddr, RegData +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int WriteReg(unsigned char RegAddr, unsigned char RegData) +{ + int iRet; + unsigned char cmd[2] = {0}; + + if (NULL == fts_i2c_write_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_write_test == NULL !!!", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + cmd[0] = RegAddr; + cmd[1] = RegData; + iRet = fts_i2c_write_test(cmd, 2); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: Comm_Base_IIC_IO(Same function name as FT_MultipleTest) +* Brief: Write/Read Data by IIC +* Input: pWriteBuffer, iBytesToWrite, iBytesToRead +* Output: pReadBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead) +{ + int iRet; + + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + if (iBytesToRead > 0) { + iRet = fts_i2c_read_test(pWriteBuffer, iBytesToWrite, pReadBuffer, iBytesToRead); + } else { + iRet = fts_i2c_write_test(pWriteBuffer, iBytesToWrite); + } + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: EnterWork(Same function name as FT_MultipleTest) +* Brief: Enter Work Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char EnterWork(void) +{ + unsigned char RunState = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = WriteReg(DEVIDE_MODE_ADDR, 0); + if (ReCode == ERROR_CODE_OK) { + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } else + FTS_TEST_ERROR("EnterWork read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("EnterWork write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("EnterWork read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} +/************************************************************************ +* Name: EnterFactory +* Brief: enter Fcatory Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0 is OK, else fail. +***********************************************************************/ +unsigned char EnterFactory(void) +{ + unsigned char RunState = 0; + int index = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = WriteReg(DEVIDE_MODE_ADDR, 0x40); + if (ReCode == ERROR_CODE_OK) { + for (index = 0; index < 20; ++index) { + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + break; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } + SysDelay(50); + } + if (ReCode != ERROR_CODE_OK) + FTS_TEST_ERROR("EnterFactory read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("EnterFactory write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("EnterFactory read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + return ReCode; +} + +/************************************************************************ +* Name: fts_SetTestItemCodeName +* Brief: set test item code and name +* Input: null +* Output: null +* Return: +**********************************************************************/ + +void fts_SetTestItemCodeName(unsigned char ucitemcode) +{ + g_stTestItem[0][g_TestItemNum].ItemCode = ucitemcode; + + g_stTestItem[0][g_TestItemNum].TestNum = g_TestItemNum; + g_stTestItem[0][g_TestItemNum].TestResult = RESULT_NULL; + g_TestItemNum++; +} + +/************************************************************************ +* Name: InitTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int InitTest(void) +{ + int ret = 0; + ret = AllocateMemory(); + if (ret < 0) + return -EPERM; + + InitStoreParamOfTestData(); + + g_stSCapConfEx.ChannelXNum = 0; + g_stSCapConfEx.ChannelYNum = 0; + g_stSCapConfEx.KeyNum = 0; + g_stSCapConfEx.KeyNumTotal = 6; + + return 0; + +} + +/************************************************************************ +* Name: FinishTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void FinishTest(void) +{ + MergeAllTestData(); + FreeMemory(); +} + + +/************************************************************************ +* Name: InitStoreParamOfTestData +* Brief: Init store param of test data +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void InitStoreParamOfTestData(void) +{ + g_lenStoreMsgArea = 0; + + g_lenStoreMsgArea += sprintf(g_pStoreMsgArea, "ECC, 85, 170, IC Name, %s, IC Code, %x\n", g_strIcName, g_ScreenSetParam.iSelectedIC); + + + + g_lenMsgAreaLine2 = 0; + + + + g_lenStoreDataArea = 0; + m_iStartLine = 11; + + m_iTestDataCount = 0; +} +/************************************************************************ +* Name: MergeAllTestData +* Brief: Merge All Data of test result +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void MergeAllTestData(void) +{ + int iLen = 0; + + + iLen = sprintf(g_pTmpBuff, "TestItem, %d, ", m_iTestDataCount); + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pTmpBuff, iLen); + g_lenStoreMsgArea += iLen; + + + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pMsgAreaLine2, g_lenMsgAreaLine2); + g_lenStoreMsgArea += g_lenMsgAreaLine2; + + + iLen = sprintf(g_pTmpBuff, "\n\n\n\n\n\n\n\n\n"); + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pTmpBuff, iLen); + g_lenStoreMsgArea += iLen; + + + memcpy(g_pStoreAllData, g_pStoreMsgArea, g_lenStoreMsgArea); + + + if (0 != g_lenStoreDataArea) { + memcpy(g_pStoreAllData+g_lenStoreMsgArea, g_pStoreDataArea, g_lenStoreDataArea); + } + + FTS_TEST_DBG("lenStoreMsgArea=%d, lenStoreDataArea = %d", g_lenStoreMsgArea, g_lenStoreDataArea); +} + + + +/************************************************************************ +* Name: AllocateMemory +* Brief: Allocate pointer Memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int AllocateMemory(void) +{ + + g_pStoreMsgArea = NULL; + if (NULL == g_pStoreMsgArea) + g_pStoreMsgArea = fts_malloc(BUFF_LEN_STORE_MSG_AREA); + if (NULL == g_pStoreMsgArea) + goto ERR; + + g_pMsgAreaLine2 = NULL; + if (NULL == g_pMsgAreaLine2) + g_pMsgAreaLine2 = fts_malloc(BUFF_LEN_MSG_AREA_LINE2); + if (NULL == g_pMsgAreaLine2) + goto ERR; + + g_pStoreDataArea = NULL; + if (NULL == g_pStoreDataArea) + g_pStoreDataArea = fts_malloc(BUFF_LEN_STORE_DATA_AREA); + if (NULL == g_pStoreDataArea) + goto ERR; + + g_pTmpBuff = NULL; + if (NULL == g_pTmpBuff) + g_pTmpBuff = fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == g_pTmpBuff) + goto ERR; + + TestResult = NULL; + if (NULL == TestResult) + TestResult = fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == TestResult) + goto ERR; + + return 0; + +ERR: + FTS_TEST_ERROR("fts_malloc memory failed in function."); + return -EPERM; + +} + +/************************************************************************ +* Name: FreeMemory +* Brief: Release pointer memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void FreeMemory(void) +{ + + if (NULL != g_pStoreMsgArea) + fts_free(g_pStoreMsgArea); + + if (NULL != g_pMsgAreaLine2) + fts_free(g_pMsgAreaLine2); + + if (NULL != g_pStoreDataArea) + fts_free(g_pStoreDataArea); + + if (NULL != g_pTmpBuff) + fts_free(g_pTmpBuff); +} diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_ini.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_ini.c new file mode 100755 index 0000000000000..9641490fc8e90 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_ini.c @@ -0,0 +1,433 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_main.h" + + +char CFG_SSL = '['; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char CFG_SSR = ']'; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char CFG_NIS = ':'; /* Separator between name and index */ +char CFG_NTS = '#'; /* annotator */ +char CFG_EQS = '='; /* The equal sign */ + + +ST_INI_FILE_DATA *g_st_ini_file_data = NULL; +int g_used_key_num = 0; + + +static int ini_file_get_line(char *filedata, char *buffer, int maxlen); +static long fts_atol(char *nptr); + + +/* Works only for digits and letters, but small and fast */ +#define TOLOWER(x) ((x) | 0x20) + +int fts_strncmp(const char *cs, const char *ct, size_t count) +{ + unsigned char c1 = 0, c2 = 0; + + while (count) { + c1 = TOLOWER(*cs++); + c2 = TOLOWER(*ct++); + if (c1 != c2) + return c1 < c2 ? -1 : 1; + if (!c1) + break; + count--; + } + return 0; +} + +/************************************************************* +Function: Get the value of key +Input: char * filedata; char * section; char * key +Output: char * value¡¡key +Return: 0 SUCCESS + -1 can not find section + -2 can not find key + -10 File open failed + -12 File read failed + -14 File format error + -22 Out of buffer size +Note: +*************************************************************/ +int ini_get_key(char *filedata, char *section, char *key, char *value) +{ + int i = 0; + int ret = -2; + for (i = 0; i < g_used_key_num; i++) { + if (fts_strncmp(section, g_st_ini_file_data[i].pSectionName, + g_st_ini_file_data[i].iSectionNameLen) != 0) + continue; + + if (strlen(key) == g_st_ini_file_data[i].iKeyNameLen) { + if (fts_strncmp(key, g_st_ini_file_data[i].pKeyName, g_st_ini_file_data[i].iKeyNameLen) == 0) + + { + memcpy(value, g_st_ini_file_data[i].pKeyValue, g_st_ini_file_data[i].iKeyValueLen); + ret = 0; + break; + } + } + } + + return ret; +} + +/************************************************************* +Function: Remove empty character on the right side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ini_str_trim_r(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + for (i = 0; i < len; i++) { + if (buf[i] != ' ') + break; + } + if (i < len) { + strncpy(tmp, (buf+i), (len-i)); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Remove empty character on the left side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ini_str_trim_l(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + + for (i = 0; i < len; i++) { + if (buf[len-i-1] != ' ') + break; + } + if (i < len) { + strncpy(tmp, buf, len-i); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Read a line from file +Input: FILE *fp; int maxlen-- Maximum length of buffer +Output: char *buffer -- A string +Return: >0 Actual read length + -1 End of file + -2 Error reading file +Note: +*************************************************************/ +static int ini_file_get_line(char *filedata, char *buffer, int maxlen) +{ + int i = 0; + int j = 0; + int iRetNum = -1; + char ch1 = '\0'; + + for (i = 0, j = 0; i < maxlen; j++) { + ch1 = filedata[j]; + iRetNum = j+1; + if (ch1 == '\n' || ch1 == '\r') { + ch1 = filedata[j+1]; + if (ch1 == '\n' || ch1 == '\r') { + iRetNum++; + } + + break; + } else if (ch1 == 0x00) { + iRetNum = -1; + break; + } else { + buffer[i++] = ch1; /* ignore carriage return */ + } + } + buffer[i] = '\0'; + + return iRetNum; +} + +int my_fts_atoi(const char *str) +{ + int result = 0; + int signal = 1; /* The default is positive number*/ + if ((*str >= '0' && *str <= '9') || *str == '-' || *str == '+') { + if (*str == '-' || *str == '+') { + if (*str == '-') + signal = -1; /*enter negative number*/ + str++; + } + } else + return 0; + /*start transform*/ + while (*str >= '0' && *str <= '9') + result = result*10 + (*str++ - '0'); + + return signal*result; +} + +int isspace(int x) +{ + if (x == ' ' || x == '\t' || x == '\n' || x == '\f' || x == '\b' || x == '\r') + return 1; + else + return 0; +} + +int isdigit(int x) +{ + if (x <= '9' && x >= '0') + return 1; + else + return 0; + +} + +static long fts_atol(char *nptr) +{ + int c; /* current char */ + long total; /* current total */ + int sign; /* if ''-'', then negative, otherwise positive */ + /* skip whitespace */ + while (isspace((int)(unsigned char)*nptr)) + ++nptr; + c = (int)(unsigned char)*nptr++; + sign = c; /* save sign indication */ + if (c == '-' || c == '+') + c = (int)(unsigned char)*nptr++; /* skip sign */ + total = 0; + while (isdigit(c)) { + total = 10 * total + (c - '0'); /* accumulate digit */ + c = (int)(unsigned char)*nptr++; /* get next char */ + } + if (sign == '-') + return -total; + else + return total; /* return result, negated if necessary */ +} + +int fts_atoi(char *nptr) +{ + return (int)fts_atol(nptr); +} + +int init_key_data(void) +{ + int i = 0; + + FTS_TEST_FUNC_ENTER(); + + g_used_key_num = 0; + + g_st_ini_file_data = NULL; + if (NULL == g_st_ini_file_data) + g_st_ini_file_data = fts_malloc(sizeof(ST_INI_FILE_DATA)*MAX_KEY_NUM); + if (NULL == g_st_ini_file_data) { + FTS_TEST_ERROR("fts_malloc failed in function."); + return -EPERM; + } + for (i = 0; i < MAX_KEY_NUM; i++) { + memset(g_st_ini_file_data[i].pSectionName, 0, MAX_KEY_NAME_LEN); + memset(g_st_ini_file_data[i].pKeyName, 0, MAX_KEY_NAME_LEN); + memset(g_st_ini_file_data[i].pKeyValue, 0, MAX_KEY_VALUE_LEN); + g_st_ini_file_data[i].iSectionNameLen = 0; + g_st_ini_file_data[i].iKeyNameLen = 0; + g_st_ini_file_data[i].iKeyValueLen = 0; + } + + FTS_TEST_FUNC_EXIT(); + return 1; +} + +int release_key_data(void) +{ + if (NULL != g_st_ini_file_data) + fts_free(g_st_ini_file_data); + + return 0; +} +int print_key_data(void) +{ + int i = 0; + + + + FTS_TEST_DBG("g_used_key_num = %d", g_used_key_num); + for (i = 0; i < MAX_KEY_NUM; i++) { + + FTS_TEST_DBG("pSectionName_%d:%s, pKeyName_%d:%s\n,pKeyValue_%d:%s", + i, g_st_ini_file_data[i].pSectionName, + i, g_st_ini_file_data[i].pKeyName, + i, g_st_ini_file_data[i].pKeyValue + ); + + } + + return 1; +} +/************************************************************* +Function: Read all the parameters and values to the structure. +Return: Returns the number of key. If you go wrong, return a negative number. + -10 File open failed + -12 File read failed + -14 File format error +Note: +*************************************************************/ +int ini_get_key_data(char *filedata) +{ + + char buf1[MAX_CFG_BUF + 1] = {0}; + int n = 0; + int ret = 0; + int dataoff = 0; + int iEqualSign = 0; + int i = 0; + char tmpSectionName[MAX_CFG_BUF + 1] = {0}; + + + + FTS_TEST_FUNC_ENTER(); + + ret = init_key_data();/*init*/ + if (ret < 0) { + return -EPERM; + } + + g_used_key_num = 0; + while (1) { /*find section */ + ret = CFG_ERR_READ_FILE; + n = ini_file_get_line(filedata+dataoff, buf1, MAX_CFG_BUF); + + if (n < -1) + goto cfg_scts_end; + if (n < 0) + break;/* file end */ + if (n >= MAX_CFG_BUF) { + FTS_TEST_ERROR("Error Length:%d\n", n); + goto cfg_scts_end; + } + + dataoff += n; + + n = strlen(ini_str_trim_l(ini_str_trim_r(buf1))); + if (n == 0 || buf1[0] == CFG_NTS) + continue; /* A blank line or a comment line */ + ret = CFG_ERR_FILE_FORMAT; + + if (n > 2 && ((buf1[0] == CFG_SSL && buf1[n-1] != CFG_SSR))) { + FTS_TEST_ERROR("Bad Section:%s\n", buf1); + goto cfg_scts_end; + } + + + if (buf1[0] == CFG_SSL) { + g_st_ini_file_data[g_used_key_num].iSectionNameLen = n-2; + if (MAX_KEY_NAME_LEN < g_st_ini_file_data[g_used_key_num].iSectionNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + + buf1[n-1] = 0x00; + strcpy((char *)tmpSectionName, buf1+1); + + + continue; + } + + + strcpy(g_st_ini_file_data[g_used_key_num].pSectionName, tmpSectionName); + g_st_ini_file_data[g_used_key_num].iSectionNameLen = strlen(tmpSectionName); + + iEqualSign = 0; + for (i = 0; i < n; i++) { + if (buf1[i] == CFG_EQS) { + iEqualSign = i; + break; + } + } + if (0 == iEqualSign) + continue; + /* before equal sign is assigned to the key name*/ + g_st_ini_file_data[g_used_key_num].iKeyNameLen = iEqualSign; + if (MAX_KEY_NAME_LEN < g_st_ini_file_data[g_used_key_num].iKeyNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(g_st_ini_file_data[g_used_key_num].pKeyName, + buf1, g_st_ini_file_data[g_used_key_num].iKeyNameLen); + + /* After equal sign is assigned to the key value*/ + g_st_ini_file_data[g_used_key_num].iKeyValueLen = n-iEqualSign-1; + if (MAX_KEY_VALUE_LEN < g_st_ini_file_data[g_used_key_num].iKeyValueLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_VALUE_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(g_st_ini_file_data[g_used_key_num].pKeyValue, + buf1 + iEqualSign + 1, g_st_ini_file_data[g_used_key_num].iKeyValueLen); + + + ret = g_used_key_num; + + g_used_key_num++; /*Parameter number accumulation*/ + if (MAX_KEY_NUM < g_used_key_num) { + ret = CFG_ERR_TOO_MANY_KEY_NUM; + FTS_TEST_ERROR("MAX_KEY_NUM: CFG_ERR_TOO_MANY_KEY_NUM\n"); + goto cfg_scts_end; + } + } + + + + FTS_TEST_FUNC_EXIT(); + + return 0; + +cfg_scts_end: + + FTS_TEST_FUNC_EXIT(); + return ret; +} + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_main.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_main.c new file mode 100755 index 0000000000000..0342249e508ae --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_main.c @@ -0,0 +1,252 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#include +#include +#include +#include + +#include "../../focaltech_core.h" +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_ic_table.h" + + +#define FTS_TEST_STORE_DATA_SIZE 80*1024 + + + +FTS_I2C_READ_FUNCTION fts_i2c_read_test; +FTS_I2C_WRITE_FUNCTION fts_i2c_write_test; + +char *g_testparamstring = NULL; + +struct StTestFuncs g_stTestFuncs; + + +int init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read) +{ + unsigned char value = 0; + unsigned char recode = 0; + + FTS_TEST_FUNC_ENTER(); + + fts_i2c_read_test = fpI2C_Read; + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL ", __func__); + } + + + recode = ReadReg(0xa6, &value); + if (recode != ERROR_CODE_OK) { + FTS_TEST_ERROR("[focal] ReadReg Error, code: %d ", recode); + } else { + FTS_TEST_DBG("[focal] ReadReg successed, Addr: 0xa6, value: 0x%02x ", value); + } + + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +int init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write) +{ + FTS_TEST_FUNC_ENTER(); + + fts_i2c_write_test = fpI2C_Write; + if (NULL == fts_i2c_write_test) { + FTS_TEST_ERROR("[focal] fts_i2c_read_test == NULL "); + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + + +/************************************************************************ +* Name: set_param_data +* Brief: load Config. Set IC series, init test items, init basic threshold, int detailThreshold, and set order of test items +* Input: TestParamData, from ini file. +* Output: none +* Return: 0. No sense, just according to the old format. +***********************************************************************/ +int set_param_data(char *TestParamData) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + g_testparamstring = TestParamData; + ret = ini_get_key_data(g_testparamstring); + if (ret < 0) { + FTS_TEST_ERROR("ini_get_key_data error."); + return ret; + } + + + + OnInit_InterfaceCfg(g_testparamstring); + + /*Get IC Name*/ + fts_ic_table_get_ic_name_from_ic_code(g_ScreenSetParam.iSelectedIC, g_strIcName); + + + + if (g_stTestFuncs.OnInit_TestItem) { + g_stTestFuncs.OnInit_TestItem(g_testparamstring); + + } + + if (g_stTestFuncs.OnInit_BasicThreshold) { + g_stTestFuncs.OnInit_BasicThreshold(g_testparamstring); + + + } + + if (IC_Capacitance_Type == Self_Capacitance) { + OnInit_SCap_DetailThreshold(g_testparamstring); + } else if (IC_Capacitance_Type == Mutual_Capacitance) { + OnInit_MCap_DetailThreshold(g_testparamstring); + } else if (IC_Capacitance_Type == IDC_Capacitance) { + OnInit_Incell_DetailThreshold(g_testparamstring); + } + + if (g_stTestFuncs.SetTestItem) { + + g_stTestFuncs.SetTestItem(); + + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: start_test_tp +* Brief: Test entry. Select test items based on IC series +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ + +boolean start_test_tp(void) +{ + boolean bTestResult = false; + + FTS_TEST_FUNC_ENTER(); + FTS_TEST_DBG("IC_%s Test", g_strIcName); + + if (g_stTestFuncs.Start_Test) { + + bTestResult = g_stTestFuncs.Start_Test(); + + } else { + FTS_TEST_DBG("[Focal]Start_Test func null!\n"); + bTestResult = false; + } + + EnterWork(); + + FTS_TEST_FUNC_EXIT(); + + return bTestResult; +} +/************************************************************************ +* Name: get_test_data +* Brief: Get test data based on IC series +* Input: none +* Output: pTestData, External application for memory, buff size >= 1024*8 +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int get_test_data(char *pTestData) +{ + int iLen = 0; + FTS_TEST_DBG("[focal] %s start ", __func__); + + + if (g_stTestFuncs.Get_test_data) { + + iLen = g_stTestFuncs.Get_test_data(pTestData); + + } else { + FTS_TEST_DBG("[Focal]Get_test_data func null!\n"); + } + + FTS_TEST_FUNC_EXIT(); + return iLen; +} + +int focaltech_test_main_init(void) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + + /*Allocate memory, storage test results*/ + g_pStoreAllData = NULL; + if (NULL == g_pStoreAllData) + g_pStoreAllData = fts_malloc(FTS_TEST_STORE_DATA_SIZE); + if (NULL == g_pStoreAllData) + return -EPERM; + + /* Allocate memory, assigned to detail threshold structure*/ + ret = malloc_struct_DetailThreshold(); + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} +/************************************************************************ +* Name: free_test_param_data +* Brief: release printer memory +* Input: none +* Output: none +* Return: none. +***********************************************************************/ +int focaltech_test_main_exit(void) +{ + + FTS_TEST_DBG("[focal] release memory -start."); + + TestResultLen = 0; + + /* Release memory test results */ + if (NULL != g_pStoreAllData) { + FTS_TEST_DBG("[FTS] release memory g_pStoreAllData."); + fts_free(g_pStoreAllData); + g_pStoreAllData = NULL; + } + + + if (NULL != TestResult) { + FTS_TEST_DBG(" release memory TestResult."); + fts_free(TestResult); + TestResult = NULL; + } + + + /* Releasing the memory of the detailed threshold structure */ + FTS_TEST_DBG("[FTS] release memory free_struct_DetailThreshold."); + free_struct_DetailThreshold(); + + /* release memory of key data for ini file */ + release_key_data(); + FTS_TEST_DBG("[focal] release memory -end."); + return 0; +} + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/Makefile b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/Makefile new file mode 100755 index 0000000000000..424ad8511446a --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/Makefile @@ -0,0 +1,9 @@ +#drivers/input/touchscreen/focaltech_ts/focaltech_test +# +# Makefile for test module +# +# Linux driver folder +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_ft8716.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_config_ft8716.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_supported_ic.o + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_config_ft8716.c b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_config_ft8716.c new file mode 100755 index 0000000000000..7af2ebcc095ee --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_config_ft8716.c @@ -0,0 +1,360 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: Focaltech_test_config_ft8716.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Config for FT8716 +* +************************************************************************/ +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + +#if (FTS_CHIP_TEST_TYPE == FT8716_TEST) + + +struct stCfg_FT8716_TestItem g_stCfg_FT8716_TestItem; +struct stCfg_FT8716_BasicThreshold g_stCfg_FT8716_BasicThreshold; + +void OnInit_FT8716_TestItem(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + + GetPrivateProfileString("TestItem", "FW_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.FW_VERSION_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "FACTORY_ID_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.FACTORY_ID_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "PROJECT_CODE_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.PROJECT_CODE_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "IC_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.IC_VERSION_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "RAWDATA_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.RAWDATA_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "CHANNEL_NUM_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.CHANNEL_NUM_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "INT_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.INT_PIN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "RESET_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.RESET_PIN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.NOISE_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "CB_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.CB_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "SHORT_CIRCUIT_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.SHORT_CIRCUIT_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "OPEN_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.OPEN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "CB_UNIFORMITY_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.CB_UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "DIFFER_UNIFORMITY_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.DIFFER_UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "DIFFER2_UNIFORMITY_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.DIFFER2_UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "LCD_NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.LCD_NOISE_TEST = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_FT8716_BasicThreshold(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + + GetPrivateProfileString("Basic_Threshold", "FW_VER_VALUE", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.FW_VER_VALUE = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Factory_ID_Number", "255", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Factory_ID_Number = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Project_Code", " ", str, strIniFile); + + sprintf(g_stCfg_FT8716_BasicThreshold.Project_Code, "%s", str); + + + GetPrivateProfileString("Basic_Threshold", "IC_Version", "3", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.IC_Version = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_VA_Check", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.bRawDataTest_VA_Check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.RawDataTest_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.RawDataTest_Max = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_VKey_Check", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.bRawDataTest_VKey_Check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min_VKey", "5000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.RawDataTest_Min_VKey = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max_VKey", "11000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.RawDataTest_Max_VKey = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelXNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelYNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_KeyNum", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.ChannelNumTest_KeyNum = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "ResetPinTest_RegAddr", "136", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.ResetPinTest_RegAddr = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "IntPinTest_RegAddr", "175", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.IntPinTest_RegAddr = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Coefficient", "50", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_Coefficient = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Frames", "32", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_Frames = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Time", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_Time = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_SampeMode", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_SampeMode = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_NoiseMode", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_NoiseMode = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_NoiseMode", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_NoiseMode = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_ShowTip", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_ShowTip = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "CBTest_VA_Check", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.bCBTest_VA_Check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Max = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_VKey_Check", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.bCBTest_VKey_Check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Min_Vkey = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Max_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_VKey_Double_Check", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.bCBTest_VKey_DCheck_Check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Min_DCheck_Vkey", "140", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Min_DCheck_Vkey = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Max_DCheck_Vkey", "180", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Max_DCheck_Vkey = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "ShortCircuit_ResMin", "1200", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.ShortCircuit_ResMin = fts_atoi(str); + /*GetPrivateProfileString("Basic_Threshold","ShortCircuit_K2Value","150",str,strIniFile); + g_stCfg_FT8716_BasicThreshold.ShortTest_K2Value = fts_atoi(str);*/ + + + GetPrivateProfileString("Basic_Threshold", "OpenTest_CBMin", "100", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.OpenTest_CBMin = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_Check_K1", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.OpenTest_Check_K1 = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_K1Threshold", "30", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.OpenTest_K1Threshold = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_Check_K2", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.OpenTest_Check_K2 = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_K2Threshold", "5", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.OpenTest_K2Threshold = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_Check_CHX", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_Check_CHX = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_Check_CHY", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_Check_CHY = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_Check_MinMax", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_Check_MinMax = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_CHX_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_CHX_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_CHY_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_CHY_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_MinMax_Hole", "70", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_MinMax_Hole = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Delta_Vol", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DeltaVol = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_CHX", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_Check_CHX = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_CHY", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_Check_CHY = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_MinMax", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_Check_MinMax = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_CHX_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_CHX_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_CHY_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_CHY_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_MinMax_Hole", "70", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_MinMax_Hole = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_Check_CHX", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_Check_CHX = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_Check_CHY", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_Check_CHY = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_CHX_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_CHX_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_CHY_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_CHY_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_Differ_Min", "1000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_Differ_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_Differ_Max", "8000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_Differ_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_FrameNum", "200", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_FrameNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_Coefficient", "60", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_Coefficient = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_Coefficient_Key", "60", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_Coefficient_Key = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_NoiseMode", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_NoiseMode = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_SequenceFrame", "5", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_SequenceFrame = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_MaxFrame", "6", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_MaxFrame = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); + +} +void SetTestItem_FT8716(void) +{ + g_TestItemNum = 0; + + FTS_TEST_FUNC_ENTER(); + + + if (g_stCfg_FT8716_TestItem.FACTORY_ID_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_FACTORY_ID_TEST); + } + + + if (g_stCfg_FT8716_TestItem.PROJECT_CODE_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_PROJECT_CODE_TEST); + } + + + if (g_stCfg_FT8716_TestItem.FW_VERSION_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_FW_VERSION_TEST); + } + + + if (g_stCfg_FT8716_TestItem.IC_VERSION_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_IC_VERSION_TEST); + } + + + fts_SetTestItemCodeName(Code_FT8716_ENTER_FACTORY_MODE); + + + if (g_stCfg_FT8716_TestItem.CHANNEL_NUM_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_CHANNEL_NUM_TEST); + } + + + if (g_stCfg_FT8716_TestItem.CB_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_CB_TEST); + } + + + if (g_stCfg_FT8716_TestItem.CB_UNIFORMITY_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_CB_UNIFORMITY_TEST); + } + + + if (g_stCfg_FT8716_TestItem.RAWDATA_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_RAWDATA_TEST); + } + + + if (g_stCfg_FT8716_TestItem.NOISE_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_NOISE_TEST); + } + + + if (g_stCfg_FT8716_TestItem.LCD_NOISE_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_LCD_NOISE_TEST); + } + + + + if (g_stCfg_FT8716_TestItem.DIFFER_UNIFORMITY_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_DIFFER_UNIFORMITY_TEST); + } + + + + if (g_stCfg_FT8716_TestItem.OPEN_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_OPEN_TEST); + } + + + if (g_stCfg_FT8716_TestItem.SHORT_CIRCUIT_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_SHORT_CIRCUIT_TEST) ; + } + + + if (g_stCfg_FT8716_TestItem.DIFFER2_UNIFORMITY_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_DIFFER2_UNIFORMITY_TEST); + } + + FTS_TEST_FUNC_EXIT(); + +} + +#endif + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_ft8716.c b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_ft8716.c new file mode 100755 index 0000000000000..862e1892617ff --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_ft8716.c @@ -0,0 +1,1450 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ft8716.c +* +* Author: Software Development +* +* Created: 2016-08-01 +* +* Abstract: test item for FT8716 +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#if (FTS_CHIP_TEST_TYPE == FT8716_TEST) + + + + + +#define DEVIDE_MODE_ADDR 0x00 +#define REG_LINE_NUM 0x01 +#define REG_TX_NUM 0x02 +#define REG_RX_NUM 0x03 +#define FT8716_LEFT_KEY_REG 0X1E +#define FT8716_RIGHT_KEY_REG 0X1F + +#define REG_CbAddrH 0x18 +#define REG_CbAddrL 0x19 +#define REG_OrderAddrH 0x1A +#define REG_OrderAddrL 0x1B + +#define REG_RawBuf0 0x6A +#define REG_RawBuf1 0x6B +#define REG_OrderBuf0 0x6C +#define REG_CbBuf0 0x6E + +#define REG_K1Delay 0x31 +#define REG_K2Delay 0x32 +#define REG_SCChannelCf 0x34 +#define REG_LCD_NOISE_FRAME 0X12 +#define REG_LCD_NOISE_START 0X11 +#define REG_LCD_NOISE_NUMBER 0X13 +#define REG_LCD_NOISE_DATA_READY 0X00 +#define REG_FWVERSION 0xA6 +#define REG_FACTORYID 0xA8 +#define REG_FWCNT 0x17 +#define pre 1 +#define REG_CLB 0x04 + + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +enum NOISE_TYPE { + NT_AvgData = 0, + NT_MaxData = 1, + NT_MaxDevication = 2, + NT_DifferData = 3, +}; + +unsigned char localbitWise; +void SetKeyBitVal(unsigned char val) +{ + + localbitWise = val; + +} + +bool IsKeyAutoFit(void) +{ + return ((localbitWise & 0x0f) == 1); +} + + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +static int m_RawData[TX_NUM_MAX][RX_NUM_MAX] = {{0, 0} } ; +static int m_CBData[TX_NUM_MAX][RX_NUM_MAX] = {{0, 0} } ; +static BYTE m_ucTempData[TX_NUM_MAX * RX_NUM_MAX*2] = {0}; +static int m_iTempRawData[TX_NUM_MAX * RX_NUM_MAX] = {0}; + + + +static int LCD_Noise[TX_NUM_MAX][RX_NUM_MAX] = {{0} } ; + + + + + + + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern struct stCfg_FT8716_BasicThreshold g_stCfg_FT8716_BasicThreshold; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + + +static int StartScan(void); +static unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer); +static unsigned char GetPanelRows(unsigned char *pPanelRows); +static unsigned char GetPanelCols(unsigned char *pPanelCols); +static unsigned char GetTxRxCB(unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer); +static unsigned char GetRawData(void); +static unsigned char GetChannelNum(void); +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount); +static unsigned char ChipClb(unsigned char *pClbResult); + + + + + +boolean FT8716_StartTest(void); +int FT8716_get_test_data(char *pTestData); + +unsigned char FT8716_TestItem_EnterFactoryMode(void); +unsigned char FT8716_TestItem_RawDataTest(bool *bTestResult); +unsigned char FT8716_TestItem_CbTest(bool *bTestResult); +unsigned char FT8716_TestItem_ChannelsTest(bool *bTestResult); +unsigned char FT8716_TestItem_LCDNoiseTest(bool *bTestResult); +unsigned char FT8716_CheckItem_FactoryIdTest(bool *bTestResult); + +/************************************************************************ +* Name: FT8716_StartTest +* Brief: Test entry. Determine which test item to test +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ + +boolean FT8716_StartTest() +{ + bool bTestResult = true, bTempResult = 1; + unsigned char ReCode; + unsigned char ucDevice = 0; + int iItemCount = 0; + + + + if (InitTest() < 0) { + FTS_TEST_ERROR("[focal] Failed to init test."); + return false; + } + + + if (0 == g_TestItemNum) + bTestResult = false; + + + for (iItemCount = 0; iItemCount < g_TestItemNum; iItemCount++) { + m_ucTestItemCode = g_stTestItem[ucDevice][iItemCount].ItemCode; + + + if (Code_FT8716_ENTER_FACTORY_MODE == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8716_TestItem_EnterFactoryMode(); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + break; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8716_RAWDATA_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8716_TestItem_RawDataTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8716_CB_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8716_TestItem_CbTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8716_CHANNEL_NUM_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode) { + ReCode = FT8716_TestItem_ChannelsTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + break; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + + } + + + if (Code_FT8716_LCD_NOISE_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode) { + ReCode = FT8716_TestItem_LCDNoiseTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8716_FACTORY_ID_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode) { + ReCode = FT8716_CheckItem_FactoryIdTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + } + + + FinishTest(); + + + return bTestResult; + +} + +/************************************************************************ +* Name: FT8716_TestItem_EnterFactoryMode +* Brief: Check whether TP can enter Factory Mode, and do some thing +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_TestItem_EnterFactoryMode(void) +{ + + unsigned char ReCode = ERROR_CODE_INVALID_PARAM; + int iRedo = 5; + int i ; + unsigned char keyFit = 0; + SysDelay(150); + FTS_TEST_DBG("Enter factory mode..."); + for (i = 1; i <= iRedo; i++) { + ReCode = EnterFactory(); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Enter factory mode..."); + if (i < iRedo) { + SysDelay(50); + continue; + } + } else { + FTS_TEST_DBG(" success to Enter factory mode..."); + break; + } + + } + SysDelay(300); + + if (ReCode == ERROR_CODE_OK) { + ReCode = GetChannelNum(); + + ReCode = ReadReg(0xFC, &keyFit); + SetKeyBitVal(keyFit); + } + return ReCode; +} + +/************************************************************************ +* Name: FT8716_TestItem_RawDataTest +* Brief: TestItem: RawDataTest. Check if MCAP RawData is within the range. +* Input: bTestResult +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_TestItem_RawDataTest(bool *bTestResult) +{ + unsigned char ReCode; + bool btmpresult = true; + int RawDataMin; + int RawDataMax; + int iValue = 0; + int i = 0; + int iRow, iCol; + bool bIncludeKey = false; + + + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Raw Data Test\n"); + + bIncludeKey = g_stCfg_FT8716_BasicThreshold.bRawDataTest_VKey_Check; + + + for (i = 0 ; i < 3; i++) { + ReCode = WriteReg(0x06, 0x00); + SysDelay(10); + ReCode = GetRawData(); + } + + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to get Raw Data!! Error Code: %d", ReCode); + return ReCode; + } + + + + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; iRow++) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; iCol++) { + FTS_TEST_DBG("%5d, ", m_RawData[iRow][iCol]); + } + } + + FTS_TEST_DBG("\nKeys: "); + if (IsKeyAutoFit()) { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNum; iCol++) + FTS_TEST_DBG("%5d, ", m_RawData[g_stSCapConfEx.ChannelXNum][iCol]); + } else { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; iCol++) { + FTS_TEST_DBG("%5d, ", m_RawData[g_stSCapConfEx.ChannelXNum][iCol]); + } + } + + + + + + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; iRow++) { + + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_Incell_DetailThreshold.RawDataTest_Min[iRow][iCol]; + RawDataMax = g_stCfg_Incell_DetailThreshold.RawDataTest_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + + + if (bIncludeKey) { + + iRow = g_stSCapConfEx.ChannelXNum; + if (IsKeyAutoFit()) { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNum; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_Incell_DetailThreshold.RawDataTest_Min[iRow][iCol]; + RawDataMax = g_stCfg_Incell_DetailThreshold.RawDataTest_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } else { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_Incell_DetailThreshold.RawDataTest_Min[iRow][iCol]; + RawDataMax = g_stCfg_Incell_DetailThreshold.RawDataTest_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + } + + + Save_Test_Data(m_RawData, 0, g_stSCapConfEx.ChannelXNum+1, g_stSCapConfEx.ChannelYNum, 1); + + + TestResultLen += sprintf(TestResult+TestResultLen, "RawData Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//RawData Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//RawData Test is NG!"); + } + return ReCode; +} + + +/************************************************************************ +* Name: FT8716_TestItem_CbTest +* Brief: TestItem: Cb Test. Check if Cb is within the range. +* Input: none +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_TestItem_CbTest(bool *bTestResult) +{ + bool btmpresult = true; + unsigned char ReCode = ERROR_CODE_OK; + int iRow = 0; + int iCol = 0; + int iMaxValue = 0; + int iMinValue = 0; + int iValue = 0; + bool bIncludeKey = false; + + unsigned char bClbResult = 0; + unsigned char ucBits = 0; + int ReadKeyLen = g_stSCapConfEx.KeyNumTotal; + + bIncludeKey = g_stCfg_FT8716_BasicThreshold.bCBTest_VKey_Check; + + FTS_TEST_INFO("\n\n==============================Test Item: -------- CB Test\n"); + + + ReCode = ChipClb(&bClbResult); + if (ERROR_CODE_OK != ReCode) { + btmpresult = false; + FTS_TEST_ERROR("\r\n//========= auto clb Failed!"); + } + + ReCode = ReadReg(0x0B, &ucBits); + if (ERROR_CODE_OK != ReCode) { + btmpresult = false; + FTS_TEST_ERROR("\r\n//========= Read Reg Failed!"); + } + + ReadKeyLen = g_stSCapConfEx.KeyNumTotal; + if (ucBits != 0) { + ReadKeyLen = g_stSCapConfEx.KeyNumTotal * 2; + } + + + + ReCode = GetTxRxCB(0, (short)(g_stSCapConfEx.ChannelXNum * g_stSCapConfEx.ChannelYNum + ReadKeyLen), m_ucTempData); + if (ERROR_CODE_OK != ReCode) { + btmpresult = false; + FTS_TEST_ERROR("Failed to get CB value..."); + goto TEST_ERR; + } + + memset(m_CBData, 0, sizeof(m_CBData)); + + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + m_CBData[iRow][iCol] = m_ucTempData[iRow * g_stSCapConfEx.ChannelYNum + iCol]; + } + } + + + for (iCol = 0; iCol < ReadKeyLen/*g_stSCapConfEx.KeyNumTotal*/; ++iCol) { + if (ucBits != 0) { + m_CBData[g_stSCapConfEx.ChannelXNum][iCol/2] = (short)((m_ucTempData[g_stSCapConfEx.ChannelXNum*g_stSCapConfEx.ChannelYNum + iCol] & 0x01)<<8) + m_ucTempData[g_stSCapConfEx.ChannelXNum*g_stSCapConfEx.ChannelYNum + iCol + 1]; + iCol++; + } else { + m_CBData[g_stSCapConfEx.ChannelXNum][iCol] = m_ucTempData[g_stSCapConfEx.ChannelXNum*g_stSCapConfEx.ChannelYNum + iCol]; + } + + } + + + + + + + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; iRow++) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; iCol++) { + FTS_TEST_DBG("%3d, ", m_CBData[iRow][iCol]); + } + } + FTS_TEST_DBG("\nKeys: "); + if (IsKeyAutoFit()) { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNum; iCol++) { + FTS_TEST_DBG("%3d, ", m_CBData[g_stSCapConfEx.ChannelXNum][iCol]); + + } + + } else { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; iCol++) { + FTS_TEST_DBG("%3d, ", m_CBData[g_stSCapConfEx.ChannelXNum][iCol]); + } + } + + + + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; iRow++) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; iCol++) { + if ((0 == g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol])) { + continue; + } + iMinValue = g_stCfg_Incell_DetailThreshold.CBTest_Min[iRow][iCol]; + iMaxValue = g_stCfg_Incell_DetailThreshold.CBTest_Max[iRow][iCol]; + iValue = focal_abs(m_CBData[iRow][iCol]); + + if (iValue < iMinValue || iValue > iMaxValue) { + btmpresult = false; + FTS_TEST_ERROR("CB test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, iMinValue, iMaxValue); + } + } + } + + + if (bIncludeKey) { + + iRow = g_stSCapConfEx.ChannelXNum; + if (IsKeyAutoFit()) { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNum; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) { + continue; + } + iMinValue = g_stCfg_Incell_DetailThreshold.CBTest_Min[iRow][iCol]; + iMaxValue = g_stCfg_Incell_DetailThreshold.CBTest_Max[iRow][iCol]; + iValue = focal_abs(m_CBData[iRow][iCol]); + + if (iValue < iMinValue || iValue > iMaxValue) { + btmpresult = false; + FTS_TEST_ERROR("CB test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, iMinValue, iMaxValue); + } + } + } else { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + iMinValue = g_stCfg_Incell_DetailThreshold.CBTest_Min[iRow][iCol]; + iMaxValue = g_stCfg_Incell_DetailThreshold.CBTest_Max[iRow][iCol]; + iValue = focal_abs(m_CBData[iRow][iCol]); + + if (iValue < iMinValue || iValue > iMaxValue) { + btmpresult = false; + FTS_TEST_ERROR("CB test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, iMinValue, iMaxValue); + } + } + } + } + + + Save_Test_Data(m_CBData, 0, g_stSCapConfEx.ChannelXNum+1, g_stSCapConfEx.ChannelYNum, 1); + + TestResultLen += sprintf(TestResult+TestResultLen, "CB Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//CB Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//CB Test is NG!"); + } + + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO("\n\n//CB Test is NG!"); + + TestResultLen += sprintf(TestResult+TestResultLen, "CB Test is NG. \n\n"); + + return ReCode; +} + + +/************************************************************************ +* Name: FT8716_TestItem_ChannelsTest +* Brief: Check whether TP can enter Factory Mode, and do some thing +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_TestItem_ChannelsTest(bool *bTestResult) +{ + unsigned char ReCode; + + FTS_TEST_DBG("\n\n==============================Test Item: -------- Channel Test "); + + ReCode = GetChannelNum(); + if (ReCode == ERROR_CODE_OK) { + if ((g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelXNum == g_stSCapConfEx.ChannelXNum) + && (g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelYNum == g_stSCapConfEx.ChannelYNum) + && (g_stCfg_FT8716_BasicThreshold.ChannelNumTest_KeyNum == g_stSCapConfEx.KeyNum)) { + *bTestResult = true; + FTS_TEST_DBG("\n\nGet channels: (CHx: %d, CHy: %d, Key: %d), Set channels: (CHx: %d, CHy: %d, Key: %d)", + g_stSCapConfEx.ChannelXNum, g_stSCapConfEx.ChannelYNum, g_stSCapConfEx.KeyNum, + g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelXNum, g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelYNum, g_stCfg_FT8716_BasicThreshold.ChannelNumTest_KeyNum); + + FTS_TEST_INFO("\n//Channel Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_ERROR("\n\nGet channels: (CHx: %d, CHy: %d, Key: %d), Set channels: (CHx: %d, CHy: %d, Key: %d)", + g_stSCapConfEx.ChannelXNum, g_stSCapConfEx.ChannelYNum, g_stSCapConfEx.KeyNum, + g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelXNum, g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelYNum, g_stCfg_FT8716_BasicThreshold.ChannelNumTest_KeyNum); + + FTS_TEST_INFO("\n//Channel Test is NG!"); + } + } + + + TestResultLen += sprintf(TestResult+TestResultLen, "Channel Test is %s. \n\n", (*bTestResult ? "OK" : "NG")); + + return ReCode; +} + +/************************************************************************ +* Name: SqrtNew +* Brief: calculate sqrt of input. +* Input: unsigned int n +* Output: none +* Return: sqrt of n. +***********************************************************************/ +unsigned int SqrtNew(unsigned int n) +{ + unsigned int val = 0, last = 0; + unsigned char i = 0;; + + if (n < 6) { + if (n < 2) { + return n; + } + return n/2; + } + val = n; + i = 0; + while (val > 1) { + val >>= 1; + i++; + } + val <<= (i >> 1); + val = (val + val + val) >> 1; + do { + last = val; + val = ((val + n/val) >> 1); + } while (focal_abs(val-last) > pre); + return val; +} + +/************************************************************************ +* Name: FT8716_TestItem_LCDNoiseTest +* Brief: obtain is differ mode the data and calculate the corresponding type of noise value. +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_TestItem_LCDNoiseTest(bool *bTestResult) +{ + + unsigned char ReCode = ERROR_CODE_OK; + bool bResultFlag = true; + int FrameNum = 0; + int i = 0; + int iRow = 0; + int iCol = 0; + int iValueMin = 0; + int iValueMax = 0; + int iValue = 0; + int ikey = 0; + unsigned char regData = 0, oldMode = 0, chNewMod = 0, DataReady = 0; + unsigned char chNoiseValueVa = 0xff, chNoiseValueKey = 0xff; + + FTS_TEST_INFO("\r\n\r\n==============================Test Item: -------- LCD Noise Test \r\n"); + + ReCode = ReadReg(0x06, &oldMode); + ReCode = WriteReg(0x06, 0x01); + + + SysDelay(50); + ReCode = ReadReg(0x06, &chNewMod); + if (ReCode != ERROR_CODE_OK || chNewMod != 1) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nSwitch Mode Failed!\r\n"); + goto TEST_ERR; + } + + FrameNum = g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_FrameNum/4; + ReCode = WriteReg(REG_LCD_NOISE_FRAME, FrameNum); + + + SysDelay(50); + if (ReCode != ERROR_CODE_OK) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nWrite Reg Failed!\r\n"); + goto TEST_ERR; + } + + ReCode = WriteReg(REG_LCD_NOISE_START, 0x01); + for (i = 0; i < 100; i++) { + SysDelay(50); + + ReCode = ReadReg(REG_LCD_NOISE_DATA_READY, &DataReady); + if (0x00 == (DataReady>>7)) { + SysDelay(5); + ReCode = ReadReg(REG_LCD_NOISE_START, &DataReady); + if (DataReady == 0x00) { + break; + } else { + continue; + } + } else { + continue; + } + + + if (99 == i) { + ReCode = WriteReg(REG_LCD_NOISE_START, 0x00); + if (ReCode != ERROR_CODE_OK) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nRestore Failed!\r\n"); + goto TEST_ERR; + } + + bResultFlag = false; + FTS_TEST_ERROR("\r\nTime Over!\r\n"); + goto TEST_ERR; + } + } + + memset(m_RawData, 0, sizeof(m_RawData)); + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + + + ReCode = ReadRawData(0, 0xAD, g_stSCapConfEx.ChannelXNum * g_stSCapConfEx.ChannelYNum * 2, m_iTempRawData); + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + m_RawData[iRow][iCol] = m_iTempRawData[iRow * g_stSCapConfEx.ChannelYNum + iCol]; + } + } + + + ReCode = ReadRawData(0, 0xAE, g_stSCapConfEx.KeyNumTotal * 2, m_iTempRawData); + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; ++iCol) { + m_RawData[g_stSCapConfEx.ChannelXNum][iCol] = m_iTempRawData[iCol]; + } + + ReCode = WriteReg(REG_LCD_NOISE_START, 0x00); + if (ReCode != ERROR_CODE_OK) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nRestore Failed!\r\n"); + goto TEST_ERR; + } + ReCode = ReadReg(REG_LCD_NOISE_NUMBER, ®Data); + if (regData <= 0) { + regData = 1; + } + + ReCode = WriteReg(0x06, oldMode); + if (ReCode != ERROR_CODE_OK) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nWrite Reg Failed!\r\n"); + goto TEST_ERR; + } + + if (0 == g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_NoiseMode) { + for (iRow = 0; iRow <= g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + LCD_Noise[iRow][iCol] = m_RawData[iRow][iCol]; + } + } + } + + if (1 == g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_NoiseMode) { + for (iRow = 0; iRow <= g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + LCD_Noise[iRow][iCol] = SqrtNew(m_RawData[iRow][iCol] / regData); + } + } + } + + ReCode = EnterWork(); + SysDelay(100); + ReCode = ReadReg(0x80, &chNoiseValueVa); + ReCode = ReadReg(0x82, &chNoiseValueKey); + ReCode = EnterFactory(); + SysDelay(200); + if (ReCode != ERROR_CODE_OK) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nEnter factory mode failed.\r\n"); + } + +#if 1 + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum+1; ++iRow) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + + FTS_TEST_DBG("%4d, ", LCD_Noise[iRow][iCol]); + } + } + FTS_TEST_DBG("\n"); +#endif + + + iValueMin = 0; + iValueMax = g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_Coefficient * chNoiseValueVa * 32 / 100; + + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; iRow++) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + + iValue = LCD_Noise[iRow][iCol]; + if (iValue < iValueMin || iValue > iValueMax) { + bResultFlag = false; + FTS_TEST_ERROR(" LCD Noise test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d). \n", + iRow+1, iCol+1, iValue, iValueMin, iValueMax); + } + } + } + + FTS_TEST_DBG(" Va_Set_Range=(%d, %d). ", iValueMin, iValueMax); + + + iValueMin = 0; + iValueMax = g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_Coefficient_Key * chNoiseValueKey * 32 / 100; + for (ikey = 0; ikey < g_stSCapConfEx.KeyNumTotal; ikey++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[g_stSCapConfEx.ChannelXNum][ikey] == 0) + continue; + iValue = LCD_Noise[g_stSCapConfEx.ChannelXNum][ikey]; + if (iValue < iValueMin || iValue > iValueMax) { + bResultFlag = false; + FTS_TEST_ERROR(" LCD Noise test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d). \n", + g_stSCapConfEx.ChannelXNum+1, ikey+1, iValue, iValueMin, iValueMax); + } + } + + FTS_TEST_DBG("Key_Set_Range=(%d, %d). ", iValueMin, iValueMax); + + Save_Test_Data(LCD_Noise, 0, g_stSCapConfEx.ChannelXNum + 1, g_stSCapConfEx.ChannelYNum, 1); + + TestResultLen += sprintf(TestResult+TestResultLen, " LCD Noise Test is %s. \n\n", (bResultFlag ? "OK" : "NG")); + + if (bResultFlag) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//LCD Noise Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//LCD Noise Test is NG!"); + } + + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO("\n\n//LCD Noise Test is NG!"); + + TestResultLen += sprintf(TestResult+TestResultLen, " LCD Noise Test is NG. \n\n"); + + return ReCode; + +} + + + +/************************************************************************ +* Name: FT8716_CheckItem_FactoryIdTest +* Brief: Factory Id Testt. +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_CheckItem_FactoryIdTest(bool *bTestResult) +{ + unsigned char ReCode = ERROR_CODE_OK; + bool btmpresult = true; + unsigned char regData = 0; + unsigned char FactoryId = 0; + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Factory Id Test\n"); + + ReCode = EnterWork(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR(" EnterWork failed.. Error Code: %d \n", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + + SysDelay(60); + ReCode = ReadReg(REG_FACTORYID, ®Data); + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR(" Failed to Read Register: %x. Error Code: %d \n", REG_FACTORYID, ReCode); + goto TEST_ERR; + } + + FactoryId = g_stCfg_FT8716_BasicThreshold.Factory_ID_Number; + + FTS_TEST_DBG("\r\nGet FactoryId:0x%02x, Set FactoryId: 0x%02x \n", regData, FactoryId); + + if (FactoryId == regData) { + btmpresult = true; + + } else { + btmpresult = false; + } + + TestResultLen += sprintf(TestResult+TestResultLen, " FactoryId Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//FactoryId Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//FactoryId Test is NG!"); + } + return ReCode; + +TEST_ERR: + *bTestResult = false; + FTS_TEST_INFO("\n\n//FactoryId Test is NG!"); + + TestResultLen += sprintf(TestResult+TestResultLen, " FactoryId Test is NG. \n\n"); + + return ReCode; +} + + +static unsigned char ChipClb(unsigned char *pClbResult) +{ + unsigned char RegData = 0; + unsigned char TimeOutTimes = 50; + unsigned char ReCode = ERROR_CODE_OK; + + ReCode = WriteReg(REG_CLB, 4); + + if (ReCode == ERROR_CODE_OK) { + while (TimeOutTimes--) { + SysDelay(100); + ReCode = WriteReg(DEVIDE_MODE_ADDR, 0x04<<4); + ReCode = ReadReg(0x04, &RegData); + if (ReCode == ERROR_CODE_OK) { + if (RegData == 0x02) { + *pClbResult = 1; + break; + } + } else { + break; + } + } + + if (TimeOutTimes == 0) { + *pClbResult = 0; + } + } + return ReCode; +} +/************************************************************************ +* Name: FT8716_get_test_data +* Brief: get data of test result +* Input: none +* Output: pTestData, the returned buff +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int FT8716_get_test_data(char *pTestData) +{ + if (NULL == pTestData) { + FTS_TEST_ERROR(" pTestData == NULL "); + return -EPERM; + } + memcpy(pTestData, g_pStoreAllData, (g_lenStoreMsgArea+g_lenStoreDataArea)); + return (g_lenStoreMsgArea+g_lenStoreDataArea); +} + + +/************************************************************************ +* Name: Save_Test_Data +* Brief: Storage format of test data +* Input: int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount +* Output: none +* Return: none +***********************************************************************/ +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount) +{ + int iLen = 0; + int i = 0, j = 0; + + + iLen = sprintf(g_pTmpBuff, "NA, %d, %d, %d, %d, %d, ", \ + m_ucTestItemCode, Row, Col, m_iStartLine, ItemCount); + memcpy(g_pMsgAreaLine2+g_lenMsgAreaLine2, g_pTmpBuff, iLen); + g_lenMsgAreaLine2 += iLen; + + m_iStartLine += Row; + m_iTestDataCount++; + + + for (i = 0+iArrayIndex; (i < Row+iArrayIndex) && (i < TX_NUM_MAX); i++) { + for (j = 0; (j < Col) && (j < RX_NUM_MAX); j++) { + if (j == (Col - 1)) + iLen = sprintf(g_pTmpBuff, "%d, \n", iData[i][j]); + else + iLen = sprintf(g_pTmpBuff, "%d, ", iData[i][j]); + + memcpy(g_pStoreDataArea+g_lenStoreDataArea, g_pTmpBuff, iLen); + g_lenStoreDataArea += iLen; + } + } + +} + + +/************************************************************************ +* Name: StartScan(Same function name as FT_MultipleTest) +* Brief: Scan TP, do it before read Raw Data +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static int StartScan(void) +{ + unsigned char RegVal = 0x00; + unsigned char times = 0; + const unsigned char MaxTimes = 20; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + + + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RegVal); + printk("hb1 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + if (ReCode == ERROR_CODE_OK) { + RegVal |= 0x80; + ReCode = WriteReg(DEVIDE_MODE_ADDR, RegVal); + printk("hb2 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + if (ReCode == ERROR_CODE_OK) { + while (times++ < MaxTimes) { + SysDelay(8); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RegVal); + printk("hb3 :RegVal:0x%x, ReCode:0x%x, times:0x%x\n", RegVal, ReCode, times); + if (ReCode == ERROR_CODE_OK) { + if ((RegVal>>7) == 0) { + printk("hb4 :RegVal>>7:0x%x, ReCode:0x%x\n", RegVal>>7, ReCode); + break; + } + } else { + printk("hb5 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + break; + } + } + if (times < MaxTimes) { + printk("hb6 :times:0x%x, MaxTimes:0x%x ------OK\n", times, MaxTimes); + ReCode = ERROR_CODE_OK; + } + else{ + printk("hb6 :times:0x%x, MaxTimes:0x%x ------FAIL\n", times, MaxTimes); + ReCode = ERROR_CODE_COMM_ERROR; + } + } + } + return ReCode; + +} +/************************************************************************ +* Name: ReadRawData(Same function name as FT_MultipleTest) +* Brief: read Raw Data +* Input: Freq(No longer used, reserved), LineNum, ByteNum +* Output: pRevBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + unsigned char I2C_wBuffer[3] = {0}; + unsigned char pReadData[ByteNum]; + + int i, iReadNum; + unsigned short BytesNumInTestMode1 = 0; + + iReadNum = ByteNum/BYTES_PER_TIME; + + if (0 != (ByteNum%BYTES_PER_TIME)) + iReadNum++; + + if (ByteNum <= BYTES_PER_TIME) { + BytesNumInTestMode1 = ByteNum; + } else { + BytesNumInTestMode1 = BYTES_PER_TIME; + } + + ReCode = WriteReg(REG_LINE_NUM, LineNum); + + + + I2C_wBuffer[0] = REG_RawBuf0; + if (ReCode == ERROR_CODE_OK) { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(I2C_wBuffer, 1, pReadData, BytesNumInTestMode1); + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) + break; + + if (i == iReadNum-1) { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(NULL, 0, pReadData+BYTES_PER_TIME*i, ByteNum-BYTES_PER_TIME*i); + } else { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(NULL, 0, pReadData+BYTES_PER_TIME*i, BYTES_PER_TIME); + } + + } + + if (ReCode == ERROR_CODE_OK) { + for (i = 0; i < (ByteNum>>1); i++) { + pRevBuffer[i] = (pReadData[i<<1]<<8)+pReadData[(i<<1)+1]; + + + + + } + } + + + return ReCode; + +} +/************************************************************************ +* Name: GetTxRxCB(Same function name as FT_MultipleTest) +* Brief: get CB of Tx/Rx +* Input: StartNodeNo, ReadNum +* Output: pReadBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetTxRxCB(unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + unsigned short usReturnNum = 0; + unsigned short usTotalReturnNum = 0; + unsigned char wBuffer[4]; + int i, iReadNum; + + iReadNum = ReadNum/BYTES_PER_TIME; + + if (0 != (ReadNum%BYTES_PER_TIME)) + iReadNum++; + + wBuffer[0] = REG_CbBuf0; + + usTotalReturnNum = 0; + + for (i = 1; i <= iReadNum; i++) { + if (i*BYTES_PER_TIME > ReadNum) + usReturnNum = ReadNum - (i-1)*BYTES_PER_TIME; + else + usReturnNum = BYTES_PER_TIME; + + wBuffer[1] = (StartNodeNo+usTotalReturnNum) >> 8; + wBuffer[2] = (StartNodeNo+usTotalReturnNum)&0xff; + + ReCode = WriteReg(REG_CbAddrH, wBuffer[1]); + ReCode = WriteReg(REG_CbAddrL, wBuffer[2]); + + ReCode = Comm_Base_IIC_IO(wBuffer, 1, pReadBuffer+usTotalReturnNum, usReturnNum); + + usTotalReturnNum += usReturnNum; + + if (ReCode != ERROR_CODE_OK) + return ReCode; + + + } + + return ReCode; +} + + + + +static unsigned char GetPanelRows(unsigned char *pPanelRows) +{ + return ReadReg(REG_TX_NUM, pPanelRows); +} + + + + +static unsigned char GetPanelCols(unsigned char *pPanelCols) +{ + return ReadReg(REG_RX_NUM, pPanelCols); +} + + +/************************************************************************ +* Name: GetChannelNum +* Brief: Get Num of Ch_X, Ch_Y and key +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetChannelNum(void) +{ + unsigned char ReCode; + + int i ; + unsigned char rBuffer[1]; + + + + for (i = 0; i < 3; i++) { + ReCode = GetPanelRows(rBuffer); + if (ReCode == ERROR_CODE_OK) { + if (0 < rBuffer[0] && rBuffer[0] < 80) { + g_stSCapConfEx.ChannelXNum = rBuffer[0]; + if (g_stSCapConfEx.ChannelXNum > g_ScreenSetParam.iUsedMaxTxNum) { + FTS_TEST_ERROR("Failed to get Channel X number, Get num = %d, UsedMaxNum = %d", + g_stSCapConfEx.ChannelXNum, g_ScreenSetParam.iUsedMaxTxNum); + g_stSCapConfEx.ChannelXNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + + break; + } else { + SysDelay(150); + continue; + } + } else { + FTS_TEST_ERROR("Failed to get Channel X number"); + SysDelay(150); + } + } + + + for (i = 0; i < 3; i++) { + ReCode = GetPanelCols(rBuffer); + if (ReCode == ERROR_CODE_OK) { + if (0 < rBuffer[0] && rBuffer[0] < 80) { + g_stSCapConfEx.ChannelYNum = rBuffer[0]; + if (g_stSCapConfEx.ChannelYNum > g_ScreenSetParam.iUsedMaxRxNum) { + + FTS_TEST_ERROR("Failed to get Channel Y number, Get num = %d, UsedMaxNum = %d", + g_stSCapConfEx.ChannelYNum, g_ScreenSetParam.iUsedMaxRxNum); + g_stSCapConfEx.ChannelYNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + break; + } else { + SysDelay(150); + continue; + } + } else { + FTS_TEST_ERROR("Failed to get Channel Y number"); + SysDelay(150); + } + } + + + for (i = 0; i < 3; i++) { + unsigned char regData = 0; + g_stSCapConfEx.KeyNum = 0; + ReCode = ReadReg(FT8716_LEFT_KEY_REG, ®Data); + if (ReCode == ERROR_CODE_OK) { + if (((regData >> 0) & 0x01)) { + g_stSCapConfEx.bLeftKey1 = true; + ++g_stSCapConfEx.KeyNum; + } + if (((regData >> 1) & 0x01)) { + g_stSCapConfEx.bLeftKey2 = true; + ++g_stSCapConfEx.KeyNum; + } + if (((regData >> 2) & 0x01)) { + g_stSCapConfEx.bLeftKey3 = true; + ++g_stSCapConfEx.KeyNum; + } + } else { + FTS_TEST_ERROR("Failed to get Key number"); + SysDelay(150); + continue; + } + ReCode = ReadReg(FT8716_RIGHT_KEY_REG, ®Data); + if (ReCode == ERROR_CODE_OK) { + if (((regData >> 0) & 0x01)) { + g_stSCapConfEx.bRightKey1 = true; + ++g_stSCapConfEx.KeyNum; + } + if (((regData >> 1) & 0x01)) { + g_stSCapConfEx.bRightKey2 = true; + ++g_stSCapConfEx.KeyNum; + } + if (((regData >> 2) & 0x01)) { + g_stSCapConfEx.bRightKey3 = true; + ++g_stSCapConfEx.KeyNum; + } + break; + } else { + FTS_TEST_ERROR("Failed to get Key number"); + SysDelay(150); + continue; + } + } + + + + FTS_TEST_DBG("CH_X = %d, CH_Y = %d, Key = %d", g_stSCapConfEx.ChannelXNum , g_stSCapConfEx.ChannelYNum, g_stSCapConfEx.KeyNum); + return ReCode; +} + +/************************************************************************ +* Name: GetRawData +* Brief: Get Raw Data of VA area and Key area +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetRawData(void) +{ + int ReCode = ERROR_CODE_OK; + int iRow, iCol; + int i = 0; + + for (i = 0; i < 3; i++) { + + ReCode = EnterFactory(); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Enter Factory Mode..."); + return ReCode; + } + + + + if (0 == (g_stSCapConfEx.ChannelXNum + g_stSCapConfEx.ChannelYNum)) { + ReCode = GetChannelNum(); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Error Channel Num..."); + return ERROR_CODE_INVALID_PARAM; + } + } + + + + ReCode = StartScan(); + if (ERROR_CODE_OK == ReCode) { + FTS_TEST_INFO("scan pass..."); + break; + } + } + if (i >= 3) { + FTS_TEST_ERROR("scan fail..."); + return ReCode; + } + + + + + memset(m_RawData, 0, sizeof(m_RawData)); + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + ReCode = ReadRawData(0, 0xAD, g_stSCapConfEx.ChannelXNum * g_stSCapConfEx.ChannelYNum * 2, m_iTempRawData); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Get RawData"); + return ReCode; + } + + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + m_RawData[iRow][iCol] = m_iTempRawData[iRow * g_stSCapConfEx.ChannelYNum + iCol]; + } + } + + + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + ReCode = ReadRawData(0, 0xAE, g_stSCapConfEx.KeyNumTotal * 2, m_iTempRawData); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Get RawData"); + return ReCode; + } + + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; ++iCol) { + m_RawData[g_stSCapConfEx.ChannelXNum][iCol] = m_iTempRawData[iCol]; + } + + return ReCode; + +} +unsigned char FT8716_GetTestResult(void) +{ + + unsigned char ucDevice = 0; + int iItemCount = 0; + unsigned char ucResultData = 0; + + + for (iItemCount = 0; iItemCount < g_TestItemNum; iItemCount++) { + + if (Code_FT8716_RAWDATA_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + if (RESULT_PASS == g_stTestItem[ucDevice][iItemCount].TestResult) + ucResultData |= 0x01<<2; + } + + + if (Code_FT8716_CB_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode) { + if (RESULT_PASS == g_stTestItem[ucDevice][iItemCount].TestResult) + ucResultData |= 0x01<<1; + } + + + if (Code_FT8716_SHORT_CIRCUIT_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + if (RESULT_PASS == g_stTestItem[ucDevice][iItemCount].TestResult) + ucResultData |= 0x01; + } + } + + FTS_TEST_DBG("Test_result: 0x%02x", ucResultData); + + + + + + return ucResultData; +} + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_supported_ic.c b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_supported_ic.c new file mode 100755 index 0000000000000..3ad6871654280 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_supported_ic.c @@ -0,0 +1,268 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.c +* +* Author: Software Development +* +* Created: 2016-08-01 +* +* Abstract: test item for FT8716 +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ + + +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + + + +#if (FTS_CHIP_TEST_TYPE == FT8607_TEST) +void OnInit_FT8607_TestItem(char *strIniFile); +void OnInit_FT8607_BasicThreshold(char *strIniFile); +void SetTestItem_FT8607(void); +boolean FT8607_StartTest(void); +int FT8607_get_test_data(char *pTestData); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8607_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8607_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8607; + g_stTestFuncs.Start_Test = FT8607_StartTest; + g_stTestFuncs.Get_test_data = FT8607_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FTS_CHIP_TEST_TYPE == FT8716_TEST) + +boolean FT8716_StartTest(void); +int FT8716_get_test_data(char *pTestData); + +void OnInit_FT8716_TestItem(char *strIniFile); +void OnInit_FT8716_BasicThreshold(char *strIniFile); +void SetTestItem_FT8716(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8716_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8716_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8716; + g_stTestFuncs.Start_Test = FT8716_StartTest; + g_stTestFuncs.Get_test_data = FT8716_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT3D47_TEST) +boolean FT3D47_StartTest(void); + +int FT3D47_get_test_data(char *pTestData); + +void OnInit_FT3D47_TestItem(char *strIniFile); +void OnInit_FT3D47_BasicThreshold(char *strIniFile); +void SetTestItem_FT3D47(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT3D47_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT3D47_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT3D47; + g_stTestFuncs.Start_Test = FT3D47_StartTest; + g_stTestFuncs.Get_test_data = FT3D47_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT5X46_TEST) + +boolean FT5X46_StartTest(void); +int FT5X46_get_test_data(char *pTestData); + +void OnInit_FT5X46_TestItem(char *strIniFile); +void OnInit_FT5X46_BasicThreshold(char *strIniFile); +void SetTestItem_FT5X46(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT5X46_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5X46_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT5X46; + g_stTestFuncs.Start_Test = FT5X46_StartTest; + g_stTestFuncs.Get_test_data = FT5X46_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT6X36_TEST) + +boolean FT6X36_StartTest(void); +int FT6X36_get_test_data(char *pTestData); + +void OnInit_FT6X36_TestItem(char *strIniFile); +void OnInit_FT6X36_BasicThreshold(char *strIniFile); +void SetTestItem_FT6X36(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT6X36_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT6X36_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT6X36; + g_stTestFuncs.Start_Test = FT6X36_StartTest; + g_stTestFuncs.Get_test_data = FT6X36_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT5822_TEST) + +boolean FT5822_StartTest(void); +int FT5822_get_test_data(char *pTestData); + +void OnInit_FT5822_TestItem(char *strIniFile); +void OnInit_FT5822_BasicThreshold(char *strIniFile); +void SetTestItem_FT5822(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT5822_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5822_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT5822; + g_stTestFuncs.Start_Test = FT5822_StartTest; + g_stTestFuncs.Get_test_data = FT5822_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT8006_TEST) + +boolean FT8006_StartTest(void); +int FT8006_get_test_data(char *pTestData); + +void OnInit_FT8006_TestItem(char *strIniFile); +void OnInit_FT8006_BasicThreshold(char *strIniFile); +void SetTestItem_FT8006(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8006_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8006_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8006; + g_stTestFuncs.Start_Test = FT8006_StartTest; + g_stTestFuncs.Get_test_data = FT8006_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FTS_CHIP_TEST_TYPE == FT8736_TEST) + +boolean FT8736_StartTest(void); +int FT8736_get_test_data(char *pTestData); + +void OnInit_FT8736_TestItem(char *strIniFile); +void OnInit_FT8736_BasicThreshold(char *strIniFile); +void SetTestItem_FT8736(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8736_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8736_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8736; + g_stTestFuncs.Start_Test = FT8736_StartTest; + g_stTestFuncs.Get_test_data = FT8736_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FTE716_TEST) + +boolean FTE716_StartTest(void); +int FTE716_get_test_data(char *pTestData); + +void OnInit_FTE716_TestItem(char *strIniFile); +void OnInit_FTE716_BasicThreshold(char *strIniFile); +void SetTestItem_FTE716(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FTE716_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FTE716_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FTE716; + g_stTestFuncs.Start_Test = FTE716_StartTest; + g_stTestFuncs.Get_test_data = FTE716_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT8606_TEST) + +boolean FT8606_StartTest(void); +int FT8606_get_test_data(char *pTestData); + +void OnInit_FT8606_TestItem(char *strIniFile); +void OnInit_FT8606_BasicThreshold(char *strIniFile); +void SetTestItem_FT8606(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8606_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8606_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8606; + g_stTestFuncs.Start_Test = FT8606_StartTest; + g_stTestFuncs.Get_test_data = FT8606_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT3C47_TEST) + +boolean FT3C47_StartTest(void); +int FT3C47_get_test_data(char *pTestData); + +void OnInit_FT3C47_TestItem(char *strIniFile); +void OnInit_FT3C47_BasicThreshold(char *strIniFile); +void SetTestItem_FT3C47(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT3C47_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT3C47_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT3C47; + g_stTestFuncs.Start_Test = FT3C47_StartTest; + g_stTestFuncs.Get_test_data = FT3C47_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} +#endif + + diff --git a/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_csot_sample.i b/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_csot_sample.i new file mode 100644 index 0000000000000..3887a224434b1 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_csot_sample.i @@ -0,0 +1,3694 @@ +0x2, 0x23,0x8a,0x2, 0xd2,0x5f,0x1b,0xa, 0x30,0x22,0x22,0x2, 0x0, 0x1a,0x0, 0x1, +0x1, 0x0, 0x22,0x2, 0x6b,0xd6,0xeb,0xaa,0x8, 0x22,0x32,0x2, 0x69,0x11,0x0, 0x0, +0x0, 0xff,0xff,0x2, 0x3c,0xff,0xc2,0x1c,0x22,0xff,0xff,0x2, 0x6f,0xf8,0xca,0x3b, +0x7d,0x72,0x7d,0x63,0x7d,0x27,0x12,0x6, 0x48,0x7d,0x36,0x7d,0x27,0x12,0x6, 0xc5, +0xda,0x3b,0x22,0x2, 0x70,0x10,0x7f,0x71,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e, +0x6f,0x78,0x35,0x79,0x36,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x6f,0x78,0x35,0x79, +0x36,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x6f,0x78,0x35,0x79,0x36,0x0, 0x8, 0x7e, +0x7b,0xa0,0x7c,0x6a,0x6c,0x77,0x7e,0x6f,0x78,0x35,0x79,0x36,0x0, 0xe, 0x7c,0x4b, +0x6c,0x55,0xe5,0x26,0xa, 0x3b,0x4d,0x32,0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0x10, +0x29,0x77,0x0, 0x2, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x29,0x57, +0x0, 0x4, 0x7c,0x46,0x4c,0x57,0x7e,0x2f,0x78,0x35,0x2e,0x54,0x0, 0xe, 0xb, 0x2a, +0x30,0x4d,0x32,0x1b,0x2a,0x30,0x29,0x77,0x0, 0x1, 0x7c,0x47,0x6c,0x55,0x29,0x77, +0x0, 0x3, 0x7c,0x64,0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0xa, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x78,0x35,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x30,0x12,0xa, +0x5e,0xa9,0xc6,0xcb,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0xb2,0x86,0x22, +0xe6,0xd6,0x19,0x29,0xce,0x79,0x31,0x86,0xdd,0xee,0x22,0x11,0x89,0x76,0xb, 0xf4, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x89,0x76,0xff,0xff,0x87,0xa6, +0xca,0x3b,0x7f,0x30,0x7e,0x3b,0xb0,0xf5,0x29,0x29,0xb3,0x0, 0x1, 0xbe,0xb1,0x29, +0x28,0x2, 0xf5,0x29,0x69,0x13,0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff, +0x12,0x24,0x34,0x7f,0x3, 0x12,0xa, 0x6, 0xa9,0xd6,0xcb,0x75,0x27,0x0, 0x80,0x33, +0x75,0x28,0x0, 0x80,0x23,0x7e,0x11,0x27,0x74,0xb, 0xac,0x1b,0xe5,0x28,0xa, 0x1b, +0x2d,0x1, 0x3e,0x4, 0x69,0x13,0x0, 0x6, 0x2d,0x10,0x6d,0x0, 0xb, 0xa, 0x30,0x6e, +0x34,0xff,0xff,0x1b,0xa, 0x30,0x5, 0x28,0x29,0x73,0x0, 0x1, 0xbe,0x71,0x28,0x38, +0xd4,0x5, 0x27,0x7e,0x3b,0x70,0xbe,0x71,0x27,0x38,0xc5,0x69,0x33,0x0, 0x6, 0x7e, +0xf, 0x78,0x35,0x79,0x30,0x0, 0x4, 0xe5,0x29,0xa, 0x2b,0x7d,0x32,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x78, +0x35,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xa, 0x5e,0x75,0x27,0x0, 0xe5,0x27, +0xbe,0xb0,0x4, 0x50,0x17,0x7e,0xa1,0x27,0x74,0x4, 0xa4,0x7e,0x1f,0x78,0x35,0x69, +0x11,0x0, 0x26,0x60,0x44,0x1e,0x14,0x14,0x78,0xfb,0x80,0x3d,0xe5,0x27,0xbe,0xb0, +0x8, 0x50,0x1b,0xe5,0x27,0xa, 0x5b,0x1b,0x56,0x3e,0x54,0x3e,0x54,0x7e,0x1f,0x78, +0x35,0x69,0x11,0x0, 0x28,0x60,0x22,0x1e,0x14,0x14,0x78,0xfb,0x80,0x1b,0xe5,0x27, +0xa, 0x5b,0x9e,0x54,0x0, 0x8, 0x3e,0x54,0x3e,0x54,0x7e,0x1f,0x78,0x35,0x69,0x11, +0x0, 0x2a,0x60,0x5, 0x1e,0x14,0x14,0x78,0xfb,0x5e,0x14,0x0, 0xf, 0x7e,0xa1,0x27, +0x74,0x2, 0xa4,0x69,0x33,0x0, 0x6, 0x2d,0x35,0x6d,0x22,0x1b,0x1a,0x10,0x5, 0x27, +0xe5,0x27,0xbe,0xb0,0xb, 0x40,0x87,0xa9,0xc6,0xcb,0xda,0x3b,0x22,0x6d,0x33,0x7e, +0xf, 0x78,0x39,0x79,0x30,0x0, 0x12,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x14,0xb, +0xa, 0x30,0x5e,0x60,0x7f,0x1b,0xa, 0x30,0xe5,0x37,0x54,0x1f,0xa, 0x2b,0x7e,0xf, +0x78,0x39,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0xe5,0x38, +0x54,0x1, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7e,0xf, +0x78,0x39,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0xe5,0x39, +0x54,0x3, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30, +0x7e,0x35,0x35,0xbe,0x34,0x0, 0x2, 0x78,0x63,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, +0x14,0xb, 0xa, 0x30,0x4e,0x60,0x80,0x1b,0xa, 0x30,0xe5,0x3a,0x54,0x1f,0x7c,0x4b, +0x6c,0x55,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0xe5,0x3b,0x54,0x1, 0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x7e, +0xf, 0x78,0x39,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0xe5, +0x3c,0x54,0x3, 0xa, 0x5b,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4,0x7e,0xf, 0x78,0x39, +0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0x7f,0x21,0xa9, +0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0x4, 0x69,0x30, +0x0, 0x8, 0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, 0x6, 0x7e,0x7f, +0x78,0x35,0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c,0x55,0x7e,0xb, +0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0xc, 0x29,0x70,0x0, +0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0xa, 0x69,0x30,0x0, +0xa, 0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, 0x7e,0x7f,0x78, +0x35,0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, +0x12,0x69,0x30,0x0, 0x10,0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0x30,0x29,0x70,0x0, +0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x78,0x35,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0, +0x12,0xa, 0x5e,0x7e,0x1f,0x78,0x35,0x69,0x11,0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11, +0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, 0x16,0x79,0x12,0x0, 0x2, 0x69,0x11, +0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, 0x22,0x79,0x12,0x0, 0x6, 0x69,0x11, +0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, 0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31, +0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x7a,0x25,0x4b,0x7f, +0x30,0x7a,0x35,0x49,0xa2,0xac,0x92,0x8, 0xc2,0xac,0x7e,0x1f,0x78,0x39,0x69,0x31, +0x0, 0x4, 0x5e,0x34,0x10,0x0, 0x7a,0x37,0x6b,0x32,0xc2,0x9, 0x12,0xc, 0x17,0xa2, +0x8, 0x92,0xac,0xa9,0xd3,0xcb,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, +0xf1,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x3, 0xf1,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78, +0xf4,0x7e,0x35,0x49,0x2e,0x34,0x80,0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf1,0x69, +0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x80,0x20,0x7d,0x23,0x3e,0x24,0x7f, +0x3, 0x2d,0x12,0xb, 0xa, 0x20,0x7e,0xf, 0x3, 0xf1,0x1b,0xa, 0x20,0x7e,0xf, 0x3, +0xf1,0x69,0x20,0x0, 0x8, 0x4d,0x22,0x68,0xf4,0xb, 0x34,0xbe,0x35,0x4b,0x40,0xdb, +0xa9,0xc5,0xcb,0xa9,0xc3,0xcb,0x7e,0x37,0x6b,0x32,0x2e,0x34,0xff,0xff,0x92,0x9, +0x12,0xc, 0x17,0xda,0x3b,0x22,0xca,0x3b,0x7a,0x25,0x4b,0x7f,0x30,0x7a,0x35,0x49, +0xa2,0xac,0x92,0x8, 0xc2,0xac,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x4, 0x5e,0x34, +0x10,0x0, 0x7a,0x37,0x6b,0x32,0xc2,0x9, 0x12,0xc, 0x17,0xa2,0x8, 0x92,0xac,0xd2, +0xcd,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf5,0x79,0x30,0x0, 0x6, +0x7e,0xf, 0x3, 0xf5,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7e,0x35,0x49,0x2e, +0x34,0x80,0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf5,0x69,0x31,0x0, 0x8, 0x4d,0x33, +0x68,0xf4,0x6d,0x33,0x80,0x20,0x7d,0x23,0x3e,0x24,0x7f,0x3, 0x2d,0x12,0xb, 0xa, +0x20,0x7e,0xf, 0x3, 0xf5,0x1b,0xa, 0x20,0x7e,0xf, 0x3, 0xf5,0x69,0x20,0x0, 0x8, +0x4d,0x22,0x68,0xf4,0xb, 0x34,0xbe,0x35,0x4b,0x40,0xdb,0xa9,0xc5,0xcb,0xc2,0xcd, +0x7e,0x37,0x6b,0x32,0x2e,0x34,0xff,0xff,0x92,0x9, 0x12,0xc, 0x17,0xda,0x3b,0x22, +0xca,0x79,0x7c,0xab,0x6d,0x77,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x6, 0x5e,0x34, +0x0, 0x2, 0x68,0x18,0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b,0xa, +0x30,0x74,0x3, 0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x3, 0x80,0x3, 0xe4,0x80,0x5a,0x4c, +0xaa,0x68,0x54,0x80,0x44,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x6, 0x5e,0x34,0x0, +0x1, 0x78,0xa, 0xe4,0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x0, 0x80,0x3c,0x7e,0x34,0x0, +0x1, 0x12,0x67,0x25,0xb, 0x74,0xbe,0x74,0x3, 0xe8,0x28,0x1d,0x7e,0xf, 0x78,0x39, +0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x74,0x2, 0x7a, +0xb3,0x77,0xe1,0x75,0x1e,0x2, 0xe4,0x80,0x10,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, +0xe, 0x5e,0x34,0x0, 0x3, 0x78,0xae,0x74,0x1, 0xda,0x79,0x22,0xca,0x79,0x7c,0xab, +0x6d,0x77,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x6, 0x5e,0x34,0x0, 0x2, 0x68,0x18, +0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x74,0x2, 0x7a, +0xb3,0x77,0xe1,0x75,0x1e,0x2, 0x80,0x3, 0xe4,0x80,0x5a,0x4c,0xaa,0x68,0x54,0x80, +0x44,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x6, 0x5e,0x34,0x0, 0x1, 0x78,0xa, 0xe4, +0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x0, 0x80,0x3c,0x7e,0x34,0x0, 0x1, 0x12,0x67,0x25, +0xb, 0x74,0xbe,0x74,0x3, 0xe8,0x28,0x1d,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0xe, +0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b,0xa, 0x30,0x74,0x3, 0x7a,0xb3,0x77,0xe1,0x75, +0x1e,0x3, 0xe4,0x80,0x10,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0xe, 0x5e,0x34,0x0, +0x8, 0x68,0xae,0x74,0x1, 0xda,0x79,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xa2,0xac, +0x92,0x3, 0xc2,0xac,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x4, 0x5e,0x34,0x10,0x0, +0x7a,0x37,0x67,0x1e,0xc2,0x9, 0x12,0xc, 0x17,0xa2,0x3, 0x92,0xac,0xa9,0xd3,0xcb, +0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf1,0x79,0x30,0x0, 0x6, 0x7e, +0xf, 0x3, 0xf1,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7d,0x36,0x2e,0x34,0x80, +0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf1,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4, +0x1b,0x1a,0x70,0x7e,0x1f,0x3, 0xf1,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0xa9, +0xc5,0xcb,0xa9,0xc3,0xcb,0x7e,0x37,0x67,0x1e,0x2e,0x34,0xff,0xff,0x92,0x9, 0x12, +0xc, 0x17,0xda,0x3b,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xa2,0xac,0x92,0x3, 0xc2, +0xac,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x4, 0x5e,0x34,0x10,0x0, 0x7a,0x37,0x67, +0x1e,0xc2,0x9, 0x12,0xc, 0x17,0xa2,0x3, 0x92,0xac,0xd2,0xcd,0xa9,0xd5,0xcb,0x7e, +0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf5,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x3, 0xf5,0x69, +0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7d,0x36,0x2e,0x34,0x80,0x0, 0x1b,0xa, 0x30, +0x7e,0x1f,0x3, 0xf5,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x1b,0x1a,0x70,0x7e, +0x1f,0x3, 0xf5,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0xa9,0xc5,0xcb,0xc2,0xcd, +0x7e,0x37,0x67,0x1e,0x2e,0x34,0xff,0xff,0x92,0x9, 0x12,0xc, 0x17,0xda,0x3b,0x22, +0xca,0x3b,0x7d,0x73,0xa2,0xac,0x92,0x0, 0xc2,0xac,0x7e,0x1f,0x78,0x39,0x69,0x61, +0x0, 0x4, 0x5e,0x64,0x10,0x0, 0xc2,0x9, 0x12,0xc, 0x17,0xa2,0x0, 0x92,0xac,0xa9, +0xd3,0xcb,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf1,0x79,0x30,0x0, +0x6, 0x7e,0x1f,0x3, 0xf1,0x69,0x11,0x0, 0x6, 0x4d,0x11,0x78,0xf4,0x1b,0x1a,0x70, +0x7e,0xf, 0x3, 0xf1,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, +0x30,0x7e,0x1f,0x3, 0xf1,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x71,0x0, +0x2, 0xa9,0xc5,0xcb,0xa9,0xc3,0xcb,0x2e,0x64,0xff,0xff,0x92,0x9, 0x12,0xc, 0x17, +0x7d,0x37,0xda,0x3b,0x22,0x7e,0x8, 0x1, 0x7c,0x7e,0x34,0x0, 0x18,0xe4,0x12,0x24, +0x34,0xa9,0xd1,0xcb,0xd2,0xcc,0x7e,0x34,0x0, 0x4, 0x7e,0x8, 0x1, 0x7c,0x74,0xc, +0x12,0xa, 0xb5,0xa9,0xd1,0xcb,0xc2,0xcc,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x7e, +0x8, 0x1, 0x7c,0x2d,0x13,0xb, 0xa, 0x20,0x7c,0x45,0x6c,0x55,0xb, 0xa, 0x30,0xa, +0x36,0x4d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0x22,0xff,0xff, +0xca,0x3b,0x7d,0x73,0xa2,0xac,0x92,0x0, 0xc2,0xac,0x7e,0x1f,0x78,0x39,0x69,0x61, +0x0, 0x4, 0x5e,0x64,0x10,0x0, 0xc2,0x9, 0x12,0xc, 0x17,0xa2,0x0, 0x92,0xac,0xd2, +0xcd,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf5,0x79,0x30,0x0, 0x6, +0x7e,0x1f,0x3, 0xf5,0x69,0x11,0x0, 0x6, 0x4d,0x11,0x78,0xf4,0x1b,0x1a,0x70,0x7e, +0xf, 0x3, 0xf5,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, 0x30, +0x7e,0x1f,0x3, 0xf5,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x71,0x0, 0x2, +0xa9,0xc5,0xcb,0xc2,0xcd,0x2e,0x64,0xff,0xff,0x92,0x9, 0x12,0xc, 0x17,0x7d,0x37, +0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x78,0x35,0x79,0x32, +0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0x8, 0x29,0x70, +0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, 0xa, 0x37,0x2d,0x32,0x7e,0x2f, +0x78,0x35,0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c,0x47,0x29,0x70,0x0, 0x1, 0xa, +0x37,0x2d,0x32,0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0xa, 0x29,0x70,0x0, 0x4, 0xa, +0x37,0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x5, 0x54,0x1, 0x7c, +0x2b,0x6c,0x33,0x7e,0x1f,0x78,0x35,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xc0,0x12,0xa, +0x5e,0xa9,0xc6,0xcb,0x22,0xa9,0xd6,0xcb,0xc2,0x2f,0x69,0x30,0x0, 0x4, 0x7e,0x2f, +0x78,0x35,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x78,0x35,0x79,0x32, +0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0x8, 0x7e,0xb, +0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x78, +0x35,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x78,0x35,0x79, +0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4,0x7e,0x1f, +0x78,0x35,0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22, +0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f,0x78,0x35,0x79,0x22,0x0, 0x4, 0x69, +0x20,0x0, 0x8, 0x7e,0x2f,0x78,0x35,0x79,0x22,0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55, +0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25,0x2d,0x25,0x7e,0x2f,0x78,0x35,0x79, +0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25,0x7e,0xf, 0x78,0x35,0x79,0x20,0x0, +0xe, 0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, 0xa, 0x6d,0x11,0x7e,0x1f,0x78,0x35,0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c, +0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0xb, 0x7a,0x40,0x5e,0x80,0x3, +0x1b,0x7a,0x40,0x7e,0x90,0x6, 0xac,0x9a,0x7c,0xb9,0x7f,0x71,0x60,0xd, 0x1e,0xf4, +0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7d,0x4f,0x5e,0x44,0x0, +0x3f,0x7d,0x74,0x7c,0xef,0x6c,0xff,0x3e,0x74,0x3e,0x74,0x7e,0xd0,0x2, 0xac,0xda, +0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xf0,0x4d,0xf7,0x1b,0x6a,0xf0,0xb, 0xa0,0xbe,0xa0, +0x4, 0x40,0xae,0xda,0x3b,0x22,0x7f,0x10,0xa9,0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e, +0x2f,0x78,0x35,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, 0x4, 0x7e,0x2f,0x78,0x35,0x79, +0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f,0x78,0x35,0x79,0x12,0x0, 0x8, 0x7e, +0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad,0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37, +0x2d,0x31,0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x78,0x35, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22,0xa9,0xd7, +0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x78,0x35,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x78,0x35,0xb, 0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, +0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7,0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30, +0xd2,0x2f,0x7e,0xf, 0x78,0x35,0xb, 0xa, 0x30,0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe, +0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b,0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x78, +0x35,0x1b,0x1a,0x10,0x22,0x7e,0x24,0x0, 0x1, 0x7e,0x7f,0x3, 0xf9,0x79,0x27,0x0, +0x6, 0x7e,0x7f,0x3, 0xf9,0x69,0x27,0x0, 0x6, 0x4d,0x22,0x78,0xf4,0x5e,0x60,0x7f, +0x1b,0x7a,0x30,0x7e,0x1f,0x3, 0xf9,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6c, +0xaa,0x80,0x20,0x6d,0x44,0x7e,0x1f,0x3, 0xf9,0x1b,0x1a,0x40,0x7e,0x1f,0x3, 0xf9, +0x69,0x41,0x0, 0x8, 0x4d,0x44,0x68,0xf4,0x69,0x41,0x0, 0x2, 0x1b,0xa, 0x40,0xb, +0x15,0xb, 0xa0,0xbc,0xba,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x6c,0x99,0x80,0x2d, +0x7e,0xf0,0x2, 0xac,0xf9,0x7f,0x60,0x2d,0xd7,0xb, 0x6a,0xf0,0x5e,0xf4,0xfc,0x0, +0x1b,0x6a,0xf0,0x7f,0x71,0x2d,0xf7,0xb, 0x7a,0xe0,0x7e,0xf0,0x2, 0xac,0xf9,0x7f, +0x60,0x2d,0xd7,0xb, 0x6a,0xf0,0x4d,0xfe,0x1b,0x6a,0xf0,0xb, 0x90,0xbc,0xa9,0x38, +0xcf,0xda,0x79,0x22,0xb, 0x38,0x20,0x5e,0x50,0xc0,0x1b,0x38,0x20,0xb, 0xa, 0x20, +0x5e,0x40,0x7, 0x1b,0xa, 0x20,0xe5,0x29,0xa, 0x5b,0xb, 0x38,0x20,0x4d,0x25,0x1b, +0x38,0x20,0xe5,0x28,0xa, 0x3b,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xa9,0xd6,0xcb,0x54,0x3f, +0x5e,0x70,0x1f,0x7e,0x14,0x0, 0x1, 0x7e,0x7f,0x78,0x35,0x79,0x17,0x0, 0x2, 0x7c, +0x2b,0x6c,0x33,0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, 0x32,0x7e, +0xf, 0x78,0x35,0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x12,0x7, 0xb5,0x2, 0xd, 0x59, +0x30,0x28,0x31,0xa9,0xd2,0xea,0xa9,0xc2,0xea,0x6d,0x33,0x7e,0xf, 0x78,0x39,0x79, +0x30,0x0, 0x16,0x7e,0x34,0x1, 0x2c,0x7e,0xf, 0x78,0x39,0x79,0x30,0x0, 0x18,0xc2, +0x28,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b, +0xa, 0x30,0xc2,0x27,0x22,0xa2,0xac,0x92,0x8, 0x7e,0xf, 0x78,0x39,0xb, 0xa, 0x30, +0x5e,0x34,0x10,0x0, 0x68,0xb, 0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x1b,0xa, +0x30,0xc2,0xac,0x7e,0xf, 0x78,0x39,0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x1b, +0xa, 0x30,0xa2,0x8, 0x92,0xac,0x22,0xa2,0xac,0x92,0xa, 0xc2,0xac,0x7e,0xf, 0x78, +0x39,0x30,0x9, 0xa, 0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x80,0x8, 0xb, 0x16, +0xb, 0xa, 0x30,0x5e,0x60,0xef,0x1b,0xa, 0x30,0xa2,0xa, 0x92,0xac,0x22,0xb, 0xa, +0x30,0x5e,0x34,0xfc,0x7f,0x1b,0xa, 0x30,0xa, 0x2b,0x5e,0x24,0x0, 0x7, 0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0xa9,0xd7,0xca,0x7e,0x24,0x0, 0x1, 0x7e,0xf, 0x78,0x3d, +0x1b,0xa, 0x20,0x7e,0x24,0x9, 0x60,0x7e,0xf, 0x78,0x3d,0x79,0x20,0x0, 0x2, 0x7e, +0xf, 0x78,0x3d,0x79,0x30,0x0, 0x4, 0x22,0xb, 0xa, 0x20,0x5e,0x24,0x80,0x1f,0x1b, +0xa, 0x20,0x7d,0x23,0x5e,0x40,0x3, 0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x60,0xc7, +0x1b,0xa, 0x30,0x54,0x7, 0xa, 0x3b,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xca,0x3b,0x7d,0x72, +0x7a,0xd, 0x28,0x7d,0x63,0x7e,0xd, 0x28,0x7d,0x27,0x12,0x3, 0xfa,0x7d,0x36,0x7e, +0xd, 0x28,0x7d,0x27,0x12,0x4, 0x96,0xda,0x3b,0x22,0xb, 0xa, 0x30,0x5e,0x60,0x9f, +0x1b,0xa, 0x30,0x54,0x3, 0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0xb, 0xa, +0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x70,0xe7,0x1b,0xa, 0x30, +0x54,0x3, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0x22,0x7c,0xa7,0xb, 0xa, 0x30,0x5e,0x60,0x40,0x60,0x3, 0x4e,0x60,0x80, +0x7c,0xba,0x54,0x3f,0x7c,0x4b,0x6c,0x55,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, +0x50,0x54,0xe0,0x1b,0xa, 0x50,0x7d,0x52,0x5e,0x54,0x0, 0x1f,0xb, 0xa, 0x20,0x4d, +0x25,0x1b,0xa, 0x20,0x79,0x30,0x0, 0x2, 0x22,0x7e,0xb3,0x1, 0x8c,0xb4,0xe7,0x12, +0x7e,0xb3,0x1, 0x8d,0xb4,0x16,0xb, 0x7e,0xb3,0x1, 0x89,0x54,0x1, 0xb4,0x1, 0x2, +0x80,0xfe,0x22,0xb, 0xa, 0x30,0x5e,0x60,0xf, 0x1b,0xa, 0x30,0xa, 0x5b,0xc4,0x54, +0xf0,0x7c,0xab,0xe4,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30, +0x5e,0x60,0xfc,0x1b,0xa, 0x30,0x54,0x3, 0x7c,0x4b,0x6c,0x55,0xb, 0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x20,0x5e,0x50,0xfc,0x1b,0xa, 0x20,0x7d,0x23, +0x5e,0x24,0x0, 0x3, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xd2,0x28,0xd2, +0x27,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x4e,0x70,0x2, 0x1b, +0xa, 0x30,0x22,0x7d,0x23,0xb, 0xa, 0x30,0x5e,0x34,0xf8,0x0, 0x1b,0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0x7d,0x23,0xb, 0xa, 0x30,0x5e,0x34,0xf8,0x0, 0x1b,0xa, +0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x70,0x3, 0x70,0x3, 0x4e, +0x70,0xc, 0x1b,0xa, 0x30,0x22,0x2, 0xd, 0x14,0x1b,0x21,0x25,0x2b,0x31,0x37,0x36, +0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, 0x10,0x18,0x1e,0x23, +0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, +0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40,0x3f,0x3e,0x3d,0x3d, +0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29,0x27,0x1e,0x14,0x11, +0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, 0x5, 0x1, 0x0, 0x0, +0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21,0x2b,0x32,0x30,0x2a, +0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, 0x10,0x19,0x23,0x2d, +0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71,0x50,0x55,0x28,0x12, +0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39,0x31,0x28,0x1e,0x15, +0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32,0x37,0x39,0x20,0x29, +0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, 0x1, 0x0, 0x1, 0x5, +0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c,0x34,0x31,0x26,0xcb, +0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31,0x2e,0x2d,0x35,0x3d, +0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, 0x10,0x1b,0x24,0x2f, +0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d,0x28,0x31,0x34,0x2a, +0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40,0x47,0x47,0x44,0x3c, +0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b,0x22,0x2d,0x30,0x2e, +0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, 0x0, 0x0, 0x3, 0xb, +0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26,0x1b,0x14,0x1c,0x25, +0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c,0x25,0x30,0x38,0x40, +0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c,0x29,0x1e,0x14,0x13, +0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39,0x30,0x25,0x1b,0x10, +0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a,0x23,0x2f,0x33,0x29, +0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, 0x2, 0x0, 0x1, 0x8, +0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e,0x50,0x55,0x16,0x2b, +0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36,0x3b,0x3d,0x3b,0x37, +0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33,0x3d,0x3f,0x13,0x21, +0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37,0x2d,0x22,0x18,0xc, +0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38,0x2e,0x2a,0x31,0x62, +0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, 0x6, 0x4, 0x2, 0x0, +0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26,0x2a,0x30,0x35,0x39, +0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b,0x1f,0x23,0x28,0x2d, +0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48,0x46,0x43,0x40,0x3e, +0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x2d,0x28,0x24,0x22,0x1f,0x1c,0x19,0x16,0x13,0x10, +0xc, 0x8, 0x5, 0x2, 0x0, 0x3, 0x7, 0xa, 0xe, 0x11,0x16,0x19,0x1e,0x22,0x27,0x2c, +0x30,0x33,0x36,0x39,0x3d,0x40,0x0, 0x2, 0x6, 0x9, 0xb, 0xe, 0x11,0x14,0x16,0x18, +0x1b,0x1f,0x22,0x25,0x28,0x29,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x32,0x33,0x35,0x36, +0x38,0x39,0x3b,0x3c,0x3e,0x40,0xac,0x6a,0x34,0x55,0x25,0x1e,0x1a,0x17,0x15,0x11, +0xe, 0xb, 0x9, 0x7, 0x4, 0x2, 0x1, 0x2, 0x5, 0x9, 0xd, 0x10,0x13,0x17,0x1b,0x1e, +0x21,0x25,0x29,0x2d,0x30,0x33,0x37,0x3b,0x3e,0x40,0x0, 0x6, 0xc, 0x10,0x13,0x19, +0x1f,0x23,0x27,0x2b,0x2f,0x33,0x36,0x38,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3f,0x40,0xca,0xd8,0x34,0x55,0x9, 0x17, +0x1d,0x26,0x2e,0x37,0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, +0x1, 0x0, 0x0, 0x0, 0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30, +0x2f,0x2c,0x26,0x1e,0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c, +0x32,0x3a,0x41,0x48,0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c, +0x33,0x55,0x6, 0x11,0x18,0x1e,0x22,0x27,0x2a,0x2c,0x29,0x25,0x1f,0x18,0x11,0xb, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, 0xa, 0x11,0x18,0x20,0x26,0x2c,0x32,0x36,0x3b, +0x3d,0x3f,0x48,0x37,0x2e,0x24,0x1a,0x11,0xa, 0x4, 0x0, 0x0, 0x1, 0x5, 0xb, 0x12, +0x1b,0x21,0x28,0x30,0x37,0x41,0x47,0x4e,0x54,0x53,0x4e,0x48,0x41,0x3b,0x33,0x2c, +0x28,0x25,0xb, 0x67,0x33,0x55,0x6, 0xc, 0x15,0x19,0x22,0x2b,0x2f,0x36,0x3c,0x3e, +0x3f,0x39,0x34,0x29,0x25,0x1d,0x14,0xf, 0x7, 0x2, 0x0, 0x0, 0x0, 0x2, 0xc, 0x10, +0x10,0x10,0x10,0x10,0x10,0x10,0x36,0x35,0x32,0x31,0x2d,0x28,0x25,0x1f,0x18,0x13, +0xa, 0x2, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x17,0x21,0x26,0x31,0x3b,0x3f,0x45,0x46, +0x46,0x46,0x46,0x46,0x46,0x46,0xf0,0x59,0x33,0x55,0x0, 0x6, 0xf, 0x19,0x21,0x2a, +0x2e,0x32,0x2a,0x21,0x18,0x14,0xc, 0x6, 0x2, 0x0, 0x1, 0xb, 0x13,0x1d,0x25,0x2a, +0x32,0x3a,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x23,0x1f,0x1b,0x17,0x13,0xc, +0x9, 0x1, 0x1, 0x6, 0xe, 0x12,0x1b,0x24,0x2d,0x37,0x3b,0x3f,0x3f,0x3d,0x39,0x36, +0x2e,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xf4,0x7b,0x33,0x55,0x5, 0xd, +0x19,0x23,0x2d,0x31,0x34,0x2c,0x22,0x1e,0x15,0xd, 0x8, 0x4, 0x2, 0x0, 0x2, 0xc, +0x10,0x19,0x21,0x2a,0x2e,0x37,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x1c,0x1b, +0x18,0x16,0x10,0xd, 0x4, 0x0, 0x3, 0x5, 0xc, 0x16,0x1e,0x26,0x2a,0x35,0x3d,0x3f, +0x3e,0x3c,0x3b,0x3a,0x39,0x38,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x8d,0x3a, +0x33,0x55,0x5, 0xd, 0x13,0x19,0x20,0x26,0x2e,0x35,0x3c,0x3d,0x37,0x2f,0x20,0x19, +0x11,0xb, 0x5, 0x2, 0x0, 0x0, 0x1, 0x6, 0xc, 0x17,0x1d,0x23,0x29,0x30,0x36,0x3b, +0x3e,0x3e,0x28,0x25,0x22,0x20,0x1d,0x18,0x14,0xf, 0x8, 0x2, 0x0, 0x0, 0x4, 0x7, +0xc, 0x11,0x18,0x1e,0x24,0x2c,0x33,0x3a,0x3e,0x3f,0x3e,0x3c,0x38,0x31,0x2a,0x21, +0x1a,0x1a,0x6, 0x33,0x33,0x55,0x26,0x1c,0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18, +0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, 0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44, +0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49,0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f, +0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54,0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d, +0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, +0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c,0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22, +0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c,0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a, +0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32,0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, +0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, 0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22,0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, +0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39,0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68, +0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70,0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80, +0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10,0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, +0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39, +0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24,0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50, +0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff,0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a, +0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, 0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18, +0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22,0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33, +0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29,0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d, +0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26,0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10, +0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b,0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, +0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19,0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22, +0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39,0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34, +0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, 0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18, +0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37,0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x0, 0x0, +0x1, 0x3, 0x8, 0xb, 0x12,0x18,0x1b,0x20,0x22,0x22,0x23,0x24,0x26,0x27,0x29,0x2b, +0x30,0x31,0x31,0x32,0x32,0x34,0x35,0x37,0x3b,0x3e,0x3f,0x3f,0x3f,0x3f,0x7b,0x6d, +0x5f,0x53,0x40,0x36,0x23,0x14,0xb, 0x3, 0xe, 0x1e,0x29,0x35,0x29,0x20,0x11,0x7, +0x6, 0x16,0x1f,0x2d,0x35,0x43,0x4c,0x59,0x68,0x72,0x74,0x74,0x74,0x74,0x90,0x27, +0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, 0x0, 0x1, 0x5, 0xa, +0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e,0x3b,0x38,0x33,0x2f, +0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21,0x27,0x2e,0x36,0x3b, +0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c,0x16,0x10,0xc, 0xa, +0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, 0x0, 0x2, 0x5, 0x9, +0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f,0x3d,0x38,0x30,0x27, +0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36,0x3f,0x49,0x53,0x5c, +0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b,0x15,0xb, 0x4, 0x0, +0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c,0x34,0x39,0x3c,0x3d, +0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, 0x6, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, 0x8, 0xe, 0x14,0x1a, +0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58,0x51,0x48,0x3f,0x38, +0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf,0x30,0x55,0x16,0x7, +0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28,0x30,0x38,0x3c,0x3e, +0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16,0xf, 0xc, 0x53,0x46, +0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, 0x13,0x1a, +0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a,0x58,0x57,0xc6,0x55, +0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38,0x3c,0x3e,0x3f,0x3e, +0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17,0x20,0x2a, +0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57,0x4f,0x47,0x40,0x38, +0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, 0x1, 0x0, 0x0, 0x1, +0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f,0x3f,0x3d,0x3a,0x36, +0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22,0x29,0x30,0x38,0x3f, +0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25,0x1e,0x17,0x10,0x8, +0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f,0x3d,0x3a,0x36,0x2e, +0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0x9, 0xe, 0x14,0x1c, +0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a,0x10,0x9, 0x4, 0x0, +0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47,0x4f,0x56,0x5a,0x5b, +0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9,0x30,0x55,0x3e,0x3b, +0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, +0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e,0x3f,0x3f,0x1f,0x10, +0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25,0x2c,0x35,0x3c,0x42, +0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25,0x1f,0x1c,0xf9,0xa2, +0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d,0x3a,0x34,0x2d,0x27, +0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, 0xa, 0xf, 0x15,0x1b, +0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11,0xb, 0x6, 0x2, 0x0, +0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36,0x3c,0x42,0x47,0x48, +0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x3e,0x3d, +0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x1, 0x4, +0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29,0x22,0x1b,0x15,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c,0x24,0x2a,0x30,0x35, +0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, 0x4, 0x7, 0xa, 0x10, +0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b,0x38,0x31,0x29,0x21, +0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35,0x3d,0x45,0x4b,0x51, +0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17,0x11,0x9, 0x3, 0x0, +0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6,0x30,0x55,0xa, 0x5, +0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3c, +0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, 0x1, 0x2, 0x35,0x46, +0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37,0x2e,0x25,0x1e,0x16, +0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39,0x41,0x45,0xf0,0xbc, +0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28,0x30,0x36,0x3b,0x3d, +0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, 0x0, 0x0, 0x1, 0x2, +0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d,0x52,0x4a,0x3e,0x35, +0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19,0x22,0x2b,0x31,0x3a, +0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36,0x2f,0x27,0x21,0x19, +0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10,0x16,0x1f,0x26,0x2d, +0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d,0x56,0x59,0x5a,0x58, +0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, 0x0, 0x0, 0x1, 0x3, +0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38,0x37,0x34,0x2d,0x26, +0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x10,0x17,0x20, +0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40,0x49,0x50,0x59,0x5e, +0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10,0xa, 0x5, 0x1, 0x0, +0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3,0x30,0x55,0x3b,0x3d, +0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, +0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f,0x3e,0x3e,0x33,0x45, +0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40,0x38,0x2e,0x25,0x1a, +0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32,0x39,0x3e,0x7, 0x90, +0x30,0x55,0x8, 0x2, 0x0, 0x0, 0x0, 0x2, 0x5, 0x7, 0xc, 0x12,0x19,0x1f,0x2b,0x32, +0x37,0x3b,0x3d,0x3f,0x3f,0x3e,0x3d,0x3a,0x37,0x2f,0x29,0x23,0x1d,0x16,0xf, 0x9, +0x6, 0x6, 0x47,0x3d,0x36,0x2f,0x27,0x1e,0x16,0x10,0x9, 0x3, 0x0, 0x0, 0x1, 0x4, +0x7, 0xd, 0x14,0x1d,0x26,0x2d,0x33,0x3a,0x42,0x4e,0x53,0x55,0x56,0x54,0x4f,0x48, +0x42,0x42,0x43,0x9e,0x30,0x55,0x2, 0x0, 0x0, 0x1, 0x3, 0x7, 0xc, 0x13,0x1c,0x24, +0x2d,0x37,0x3f,0x3d,0x3b,0x39,0x36,0x34,0x31,0x2e,0x2b,0x27,0x20,0x16,0xe, 0x8, +0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x5d,0x50,0x46,0x3e,0x36,0x2c,0x20,0x16,0xd, 0x6, +0x2, 0x0, 0xb, 0x16,0x22,0x2a,0x33,0x3c,0x44,0x4c,0x55,0x5d,0x69,0x79,0x7d,0x76, +0x6d,0x63,0x59,0x50,0x48,0x47,0x12,0x3e,0x30,0x55,0x3, 0x1, 0x2, 0x6, 0xa, 0x16, +0x20,0x25,0x30,0x39,0x3e,0x3f,0x3f,0x3c,0x3a,0x32,0x28,0x22,0x19,0xe, 0x5, 0x2, +0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x29,0x23,0x18,0xf, 0xb, 0x3, +0x0, 0x0, 0x1, 0x8, 0x11,0x17,0x21,0x2a,0x2f,0x3a,0x42,0x43,0x42,0x3e,0x38,0x34, +0x2c,0x24,0x1f,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x7f,0xd2,0x30,0x55,0x39,0x2b, +0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, 0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b, +0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f,0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, +0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24,0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b, +0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65,0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a, +0x46,0x55,0x3c,0x37,0x33,0x2f,0x25,0x20,0x1b,0x10,0xc, 0x8, 0x2, 0x0, 0x0, 0x3, +0x7, 0xc, 0x16,0x1b,0x1f,0x2a,0x2f,0x33,0x3d,0x3d,0x39,0x2f,0x2b,0x28,0x28,0x28, +0x28,0x28,0x2, 0x0, 0x0, 0x0, 0x2, 0x4, 0x7, 0xc, 0xf, 0x13,0x1c,0x20,0x24,0x2d, +0x30,0x32,0x35,0x36,0x36,0x36,0x36,0x36,0x39,0x3d,0x42,0x48,0x4a,0x4b,0x4b,0x4b, +0x4b,0x4b,0x10,0xa2,0x46,0x55,0x32,0x2c,0x27,0x1c,0x16,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x2, 0x4, 0xd, 0x11,0x1a,0x1f,0x25,0x2f,0x33,0x3c,0x3d,0x34,0x2f,0x2a,0x21, +0x1d,0x1c,0x1c,0x1c,0x1c,0x1c,0x1, 0x0, 0x0, 0x0, 0x2, 0x6, 0xa, 0xe, 0x16,0x1a, +0x22,0x26,0x2b,0x31,0x32,0x35,0x36,0x38,0x3a,0x3b,0x3e,0x41,0x4a,0x4c,0x4d,0x4e, +0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x43,0x33,0x46,0x55,0x1a,0x13,0x10,0xd, 0xb, 0xa, +0xc, 0x11,0x16,0x20,0x25,0x29,0x2e,0x32,0x37,0x3c,0x3f,0x3c,0x38,0x33,0x2e,0x29, +0x24,0x1e,0x19,0xf, 0xb, 0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xb, 0x10,0x15,0x19, +0x1d,0x1e,0x1f,0x1e,0x1f,0x1f,0x20,0x21,0x24,0x29,0x2f,0x39,0x3e,0x41,0x44,0x47, +0x49,0x4b,0x4c,0x4e,0x4e,0x4f,0x4e,0x4d,0x4d,0x4d,0xa, 0x24,0x46,0x55,0x0, 0x1, +0x3, 0x5, 0x7, 0x8, 0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22, +0x24,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, +0x14,0x1b,0x23,0x28,0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53, +0x4e,0x47,0x40,0x3b,0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d, +0x54,0x55,0x40,0x39,0x38,0x36,0x35,0x33,0x31,0x2e,0x2c,0x2b,0x29,0x27,0x25,0x24, +0x22,0x1f,0x1d,0x1a,0x18,0x15,0x14,0x12,0xf, 0xc, 0x9, 0x7, 0x4, 0x2, 0x1, 0x0, +0x0, 0x0, 0x0, 0xd, 0x15,0x1d,0x23,0x2a,0x32,0x3b,0x43,0x48,0x50,0x57,0x5d,0x63, +0x68,0x65,0x5e,0x58,0x51,0x4a,0x45,0x3f,0x38,0x32,0x2b,0x26,0x1f,0x16,0x10,0x8, +0x4, 0x1, 0x6a,0xec,0x54,0x55,0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1, 0x2, 0x4, 0x5, 0x7, 0x9, 0xd, 0x10,0x13,0x18,0x1f,0x24,0x27,0x2b,0x2e,0x31, +0x34,0x36,0x39,0x3c,0x3e,0x40,0x0, 0x7, 0xf, 0x13,0x16,0x1a,0x1e,0x22,0x25,0x28, +0x2f,0x36,0x3b,0x3f,0x43,0x47,0x4b,0x4c,0x4c,0x4c,0x49,0x46,0x43,0x3f,0x3a,0x35, +0x32,0x2d,0x27,0x21,0x1d,0x1a,0xb5,0xd0,0x54,0x55,0x0, 0x1, 0x1, 0x1, 0x2, 0x3, +0x3, 0x4, 0x5, 0x9, 0xf, 0x16,0x1d,0x22,0x28,0x2d,0x30,0x32,0x34,0x37,0x39,0x3a, +0x3c,0x3d,0x3e,0x3e,0x3f,0x3f,0x3e,0x3e,0x3c,0x3a,0x22,0x2e,0x36,0x3f,0x46,0x4c, +0x51,0x56,0x5b,0x5e,0x60,0x5e,0x5c,0x58,0x53,0x4d,0x49,0x45,0x41,0x3a,0x35,0x31, +0x2d,0x27,0x23,0x1f,0x19,0x11,0xd, 0x8, 0x3, 0x0, 0x3b,0x38,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0xd, 0xd0,0x70,0x8f,0x0, 0xff,0x89,0x76,0x4, 0xa7, +0x24,0x87,0x2, 0xa9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53,0x42,0x32,0x1, 0xd1,0x0, 0x34,0x0, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8, 0x43,0x53,0x4f,0x54,0x5f,0x35,0x50,0x37, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x0, 0x1, 0x8, 0x8, 0x10,0x20,0x10,0x20,0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, +0x3, 0x0, 0x3, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, +0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, +0x0, 0xf, 0x0, 0x10,0x0, 0x11,0x0, 0x12,0x0, 0x13,0x0, 0x14,0x0, 0x15,0x0, 0x16, +0x0, 0x17,0x0, 0x18,0x0, 0x19,0x0, 0x1a,0x0, 0x1b,0x0, 0x1c,0x0, 0x1d,0x0, 0x1e, +0x0, 0x1f,0x0, 0x20,0x0, 0x21,0x0, 0x22,0x0, 0x23,0x0, 0x24,0x0, 0x25,0x0, 0x26, +0x0, 0x27,0x0, 0x28,0x0, 0x29,0x0, 0x2a,0x0, 0x2b,0x0, 0x2c,0x0, 0x2d,0x0, 0x2e, +0x0, 0x2f,0x0, 0x30,0x0, 0x31,0x0, 0x32,0x0, 0x33,0x0, 0x34,0x0, 0x35,0x0, 0x36, +0x0, 0x37,0x0, 0x38,0x0, 0x39,0x0, 0x3a,0x0, 0x3b,0x0, 0x3c,0x0, 0x3d,0x0, 0x3e, +0x0, 0x3f,0x0, 0x40,0x0, 0x41,0x0, 0x42,0x0, 0x43,0x0, 0x44,0x0, 0x45,0x0, 0x46, +0x0, 0x47,0x0, 0x48,0x0, 0x49,0x0, 0x4a,0x0, 0x4b,0x0, 0x4c,0x0, 0x4d,0x0, 0x4e, +0x0, 0x4f,0x0, 0x50,0x0, 0x51,0x0, 0x52,0x0, 0x53,0x0, 0x54,0x0, 0x55,0x0, 0x56, +0x0, 0x57,0x0, 0x58,0x0, 0x59,0x0, 0x5a,0x0, 0x5b,0x0, 0x5c,0x0, 0x5d,0x0, 0x5e, +0x0, 0x5f,0x0, 0x60,0x0, 0x61,0x0, 0x62,0x0, 0x63,0x0, 0x64,0x0, 0x65,0x0, 0x66, +0x0, 0x67,0x0, 0x68,0x0, 0x69,0x0, 0x6a,0x0, 0x6b,0x0, 0x6c,0x0, 0x6d,0x0, 0x6e, +0x0, 0x6f,0x0, 0x70,0x0, 0x71,0x0, 0x72,0x0, 0x73,0x0, 0x74,0x0, 0x75,0x0, 0x76, +0x0, 0x77,0x0, 0x78,0x0, 0x79,0x0, 0x7a,0x0, 0x7b,0x0, 0x7c,0x0, 0x7d,0x0, 0x7e, +0x0, 0x7f,0x0, 0x80,0x0, 0x81,0x0, 0x82,0x0, 0x83,0x0, 0x84,0x0, 0x85,0x0, 0x86, +0x0, 0x87,0x0, 0x88,0x0, 0x89,0x0, 0x8a,0x0, 0x8b,0x0, 0x8c,0x0, 0x8d,0x0, 0x8e, +0x0, 0x8f,0x0, 0x90,0x0, 0x91,0x0, 0x92,0x0, 0x93,0x0, 0x94,0x0, 0x95,0x0, 0x96, +0x0, 0x97,0x0, 0x98,0x0, 0x99,0x0, 0x9a,0x0, 0x9b,0x0, 0x9c,0x0, 0x9d,0x0, 0x9e, +0x0, 0x9f,0x0, 0xa0,0x0, 0xa1,0x0, 0xa2,0x0, 0xa3,0x0, 0xa4,0x0, 0xa5,0x0, 0xa6, +0x0, 0xa7,0x0, 0xa8,0x0, 0xa9,0x0, 0xaa,0x0, 0xab,0x0, 0xac,0x0, 0xad,0x0, 0xae, +0x0, 0xaf,0x0, 0xb0,0x0, 0xb1,0x0, 0xb2,0x0, 0xb3,0x0, 0xb4,0x0, 0xb5,0x0, 0xb6, +0x0, 0xb7,0x0, 0xb8,0x0, 0xb9,0x0, 0xba,0x0, 0xbb,0x0, 0xbc,0x0, 0xbd,0x0, 0xbe, +0x0, 0xbf,0x0, 0xc0,0x0, 0xc1,0x0, 0xc2,0x0, 0xc3,0x0, 0xc4,0x0, 0xc5,0x0, 0xc6, +0x0, 0xc7,0x0, 0xc8,0x0, 0xc9,0x0, 0xca,0x0, 0xcb,0x0, 0xcc,0x0, 0xcd,0x0, 0xce, +0x0, 0xcf,0x0, 0xd0,0x0, 0xd1,0x0, 0xd2,0x0, 0xd3,0x0, 0xd4,0x0, 0xd5,0x0, 0xd6, +0x0, 0xd7,0x0, 0xd8,0x0, 0xd9,0x0, 0xda,0x0, 0xdb,0x0, 0xdc,0x0, 0xdd,0x0, 0xde, +0x0, 0xdf,0x0, 0xe0,0x0, 0xe1,0x0, 0xe2,0x0, 0xe3,0x0, 0xe4,0x0, 0xe5,0x0, 0xe6, +0x0, 0xe7,0x0, 0xe8,0x0, 0xe9,0x0, 0xea,0x0, 0xeb,0x0, 0xec,0x0, 0xed,0x0, 0xee, +0x0, 0xef,0x0, 0xf0,0x0, 0xf1,0x0, 0xf2,0x0, 0xf3,0x0, 0xf4,0x0, 0xf5,0x0, 0xf6, +0x0, 0xf7,0x0, 0xf8,0x0, 0xf9,0x0, 0xfa,0x0, 0xfb,0x0, 0xfc,0x0, 0xfd,0x0, 0xfe, +0x0, 0xff,0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0xff, +0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, 0xf9,0x0, 0xf8,0x0, 0xf7, +0x0, 0xf6,0x0, 0xf5,0x0, 0xf4,0x0, 0xf3,0x0, 0xf2,0x0, 0xf1,0x0, 0xf0,0x0, 0xef, +0x0, 0xee,0x0, 0xed,0x0, 0xec,0x0, 0xeb,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, 0xe7, +0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, 0xdf, +0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, 0xd7, +0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, 0xcf, +0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xca,0x0, 0xc9,0x0, 0xc8,0x0, 0xc7, +0x0, 0xc6,0x0, 0xc5,0x0, 0xc4,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, 0xc0,0x0, 0xbf, +0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, 0xb8,0x0, 0xb7, +0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, 0xb0,0x0, 0xaf, +0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, 0xa8,0x0, 0xa7, +0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0xa3,0x0, 0xa2,0x0, 0xa1,0x0, 0xa0,0x0, 0x9f, +0x0, 0x9e,0x0, 0x9d,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, 0x99,0x0, 0x98,0x0, 0x97, +0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, 0x91,0x0, 0x90,0x0, 0x8f, +0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, 0x89,0x0, 0x88,0x0, 0x87, +0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, 0x81,0x0, 0x80,0x0, 0x7f, +0x0, 0x7e,0x0, 0x7d,0x0, 0x7c,0x0, 0x7b,0x0, 0x7a,0x0, 0x79,0x0, 0x78,0x0, 0x77, +0x0, 0x76,0x0, 0x75,0x0, 0x74,0x0, 0x73,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, 0x6f, +0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, 0x67, +0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, 0x5f, +0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, 0x57, +0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x52,0x0, 0x51,0x0, 0x50,0x0, 0x4f, +0x0, 0x4e,0x0, 0x4d,0x0, 0x4c,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, 0x48,0x0, 0x47, +0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, 0x40,0x0, 0x3f, +0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, 0x38,0x0, 0x37, +0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, 0x30,0x0, 0x2f, +0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x2b,0x0, 0x2a,0x0, 0x29,0x0, 0x28,0x0, 0x27, +0x0, 0x26,0x0, 0x25,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, 0x21,0x0, 0x20,0x0, 0x1f, +0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, 0x19,0x0, 0x18,0x0, 0x17, +0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, 0x11,0x0, 0x10,0x0, 0xf, +0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, 0x9, 0x0, 0x8, 0x0, 0x7, +0x0, 0x6, 0x0, 0x5, 0x0, 0x4, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x18,0x19,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0xb, 0x0, +0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, +0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x18,0x19,0x2, 0x5, 0x0, +0x0, 0x0, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x18,0x19,0x2, 0x5, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, +0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, +0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x18,0x19,0x2, 0x5, 0x2, 0x0, 0x0, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x1, 0xa, 0x1e,0x50,0x14,0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x1, 0x68,0x1, 0x18,0x1, +0x18,0x5, 0xdc,0x5, 0xdc,0x5, 0xdc,0x1, 0x90,0x1, 0x90,0xa, 0x0, 0x1, 0xc2,0x1, +0xa, 0x6, 0x21,0x3c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16,0x1, 0x0, 0x1, 0x87,0x1, 0x0, 0xb, +0x1, 0x89,0x0, 0x1, 0x0, 0x15,0x1, 0x1, 0x5, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d,0x0, 0x0, 0x0, 0x0, 0x0, 0xff,0x0, +0x64,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x89,0x1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x4, 0x0, 0x2, 0xda, +0x1, 0x68,0x2e,0x2d,0x1, 0x68,0x1, 0x18,0x0, 0xb3,0x0, 0xbb,0x5, 0xa0,0x2, 0xd0, +0x2d,0x2d,0x1, 0x36,0x1, 0x4a,0x0, 0xb4,0x0, 0xb4,0x10,0x0, 0xc8,0x2, 0x58,0x3, +0x20,0x2, 0xd0,0x7, 0xd0,0x1, 0x2c,0x0, 0x40,0x0, 0x4, 0x1, 0x5, 0x2, 0x2, 0x4, +0x4, 0x6, 0x80,0x0, 0xc8,0x13,0x88,0x10,0x3, 0x6, 0x1, 0x2c,0x2, 0x58,0x3, 0x20, +0x1f,0x40,0x28,0x1, 0x5e,0x2, 0xbc,0x0, 0x14,0x19,0x5, 0xf, 0x2, 0xd0,0x1, 0x68, +0x5, 0xa0,0x0, 0x64,0x4, 0xa, 0x5, 0x0, 0x64,0x2, 0x76,0x0, 0x64,0x5, 0x3c,0x0, +0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0xc8,0x0, 0x49,0x0, 0x1e,0x0, 0x80,0x1, +0x6d,0x1, 0x68,0x0, 0x64,0x7, 0xd0,0x1, 0x68,0x1, 0x6d,0x0, 0x64,0x7, 0xd0,0x0, +0x0, 0x2, 0xda,0x0, 0x0, 0x5, 0xa0,0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x9, 0xc4,0x1, +0x2c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24, +0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e, +0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff, +0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad, +0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74, +0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22, +0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10, +0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22, +0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, +0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22, +0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c, +0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x22,0xbf,0x9f, +0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x22,0xbf,0x30,0xd5,0x6, 0x9f,0x22,0x9f, +0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38, +0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39, +0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e, +0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, 0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18, +0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x7f, +0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8,0x78,0x44,0xc2,0x22,0xc2, +0x23,0xc2,0x24,0xc2,0x1e,0xc2,0x1f,0x75,0x12,0x0, 0xc2,0x29,0xc2,0x2a,0xc2,0x25, +0xc2,0x26,0x75,0x6b,0x0, 0xc2,0x2b,0xc2,0x15,0xc2,0x16,0xc2,0x17,0xd2,0x18,0xd2, +0x19,0xc2,0xb, 0xc2,0xc, 0xc2,0xd, 0xc2,0xe, 0xc2,0xf, 0xc2,0x10,0xc2,0x11,0xc2, +0x12,0xc2,0x13,0xc2,0x14,0xc2,0x2c,0xc2,0x2d,0xd2,0x27,0xc2,0x28,0x75,0x1e,0x0, +0x75,0x1f,0x1, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x26,0xa2,0xb, 0xa, 0x40,0x5d,0x44, +0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a, +0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x2f,0xb9,0xca, +0xf8,0x7f,0x20,0x80,0xa, 0x7e,0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69, +0xff,0xff,0xfc,0x7d,0xef,0x1b,0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f, +0x10,0xda,0xf8,0x22,0x7d,0x43,0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, +0x14,0x4d,0x44,0x78,0xf5,0x22,0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, +0xff,0x2, 0x0, 0x1, 0x2, 0xff,0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32, +0x22,0x6d,0x33,0x9d,0x32,0x22,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4a,0x60,0x1, 0x0, 0x1, 0x4a,0x66,0x1, 0x0, 0x1, 0x4a,0x68, +0x5, 0x0, 0x3, 0x4e,0x97,0x0, 0x0, 0x0, 0x0, 0x6, 0x4e,0x9a,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x6, 0x4e,0xa0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0xff, +0x1, 0x0, 0x1, 0x78,0x8, 0x0, 0x0, 0x1, 0x78,0x9, 0x0, 0x0, 0x2, 0x76,0xda,0x0, +0x0, 0x0, 0x1, 0x76,0x7, 0xff,0x0, 0xa, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x29,0x82,0x5, 0x0, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, +0x0, 0xc, 0x29,0xb2,0x3, 0x3, 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, +0x0, 0x1, 0x78,0x41,0x0, 0x0, 0x1, 0x77,0x70,0x0, 0x0, 0x1, 0x77,0x72,0x0, 0x0, +0x2, 0x3, 0xfd,0x0, 0x0, 0x0, 0x1, 0x3, 0xc8,0x0, 0x0, 0x1, 0x78,0x13,0x0, 0x0, +0x1, 0x5c,0xc3,0xff,0x0, 0x1, 0x5c,0xdc,0x0, 0x0, 0x2, 0x5c,0xdd,0x0, 0x0, 0x0, +0x4, 0x5c,0xdf,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x62,0x29,0x0, 0x0, 0x2, 0x62,0x7a, +0x0, 0x0, 0x0, 0x1, 0x78,0x1e,0x1, 0x0, 0x1, 0x78,0x1f,0x0, 0x0, 0x1e,0x0, 0x4d, +0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,0x20, +0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x0, 0x1, +0x77,0xb3,0x0, 0x0, 0x1, 0x77,0xcf,0x1e,0x0, 0x1, 0x78,0x27,0x0, 0x0, 0x2, 0x76, +0x5, 0x0, 0x0, 0x0, 0x6, 0x78,0x28,0x30,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x78, +0x2e,0x34,0x0, 0x1, 0x75,0x8a,0x64,0x0, 0x1, 0x78,0x43,0x0, 0x0, 0x1, 0x77,0xd7, +0x0, 0x0, 0x1, 0x77,0xdc,0x5, 0x0, 0x1, 0x77,0xe0,0x4, 0x0, 0x1, 0x77,0xe1,0x1, +0x0, 0x1, 0x77,0xe5,0x0, 0x0, 0x1, 0x78,0x30,0x0, 0x0, 0x1, 0x78,0x34,0x1, 0x0, +0x1, 0x78,0x44,0x1, 0x0, 0x1, 0x77,0xfb,0x0, 0x0, 0x2, 0x25,0xb3,0x25,0xb9,0x0, +0x1, 0x27,0x49,0x2, 0x0, 0x1, 0x27,0x72,0x0, 0x0, 0x1, 0x77,0x2b,0xff,0x0, 0x1, +0x77,0x2c,0x0, 0x0, 0x1, 0x77,0x2d,0x0, 0x0, 0x1, 0x77,0x2e,0x40,0x0, 0x1, 0x77, +0x2f,0x40,0x0, 0x4, 0x78,0x35,0x0, 0x0, 0x90,0x0, 0x0, 0x4, 0x3, 0xf1,0x0, 0x0, +0x94,0x0, 0x0, 0x4, 0x3, 0xf5,0x0, 0x0, 0x98,0x0, 0x0, 0x4, 0x3, 0xf9,0x0, 0x0, +0x9c,0x0, 0x0, 0x4, 0x1, 0x78,0x0, 0x0, 0x80,0x0, 0x0, 0x4, 0x78,0x39,0x0, 0x0, +0x91,0x0, 0x0, 0x4, 0x78,0x3d,0x0, 0x0, 0x92,0x0, 0x0, 0x0, 0x3, 0xe8,0x0, 0x51, +0x0, 0x3, 0x3, 0x20,0x0, 0x50,0x0, 0x3, 0x2, 0x58,0x0, 0x4e,0x0, 0x4, 0x1, 0xc2, +0x0, 0x4b,0x0, 0x4, 0x1, 0x40,0x0, 0x47,0x0, 0x4, 0x0, 0xc8,0x0, 0x44,0x0, 0x4, +0x0, 0x78,0x0, 0x3e,0x0, 0x5, 0x0, 0x64,0x0, 0x3c,0x0, 0x5, 0x12,0xe5,0xf2,0xe4, +0x7a,0xb3,0x76,0x7c,0x2, 0x28,0x7c,0xd2,0x1, 0x12,0x28,0x8c,0x74,0x1f,0x7a,0xb3, +0x73,0x1f,0x7a,0xb3,0x73,0x20,0x22,0x12,0x66,0xc5,0xd2,0x1, 0xe4,0x7a,0xb3,0x74, +0x7f,0x7a,0xb3,0x74,0x80,0x6c,0xaa,0x12,0xc1,0xc0,0xbe,0xa0,0x3, 0x78,0xf8,0xe4, +0x7a,0xb3,0x74,0xf4,0x7a,0xb3,0x74,0x81,0x30,0x1, 0x3, 0x12,0x28,0x7c,0x22,0xca, +0x3b,0xc2,0x4, 0x12,0x37,0xba,0xc2,0xc, 0x30,0xb, 0x18,0xc2,0xb, 0x30,0xd, 0x4, +0xc2,0xd, 0x80,0x3, 0x12,0x59,0x3e,0x12,0x3c,0x27,0x12,0x47,0x1c,0x12,0x47,0xde, +0x12,0x28,0x77,0xd2,0x4, 0x12,0x37,0xba,0xc2,0x1, 0x12,0xd3,0x1d,0x30,0xe, 0x3c, +0xc2,0xe, 0x12,0xe6,0x81,0x7d,0x23,0x5e,0x24,0x0, 0x1, 0x68,0x2f,0x5e,0x34,0x0, +0x2, 0x68,0x5, 0x12,0xe4,0x93,0x80,0x11,0x75,0x1e,0x1, 0x74,0x1, 0x7a,0xb3,0x77, +0xe1,0x7f,0x3, 0x12,0x3f,0x7c,0x12,0x37,0xe1,0x12,0x47,0x1c,0xc2,0x1, 0x12,0x28, +0x8c,0xe5,0x1e,0x12,0x3b,0xdd,0x74,0x1f,0x7a,0xb3,0x73,0x20,0xd2,0x1, 0x12,0xd3, +0x1d,0xda,0x3b,0x22,0x74,0x5, 0x7a,0xb3,0x78,0x33,0x12,0x28,0xaf,0x7e,0xb3,0x73, +0x1f,0x60,0xd, 0x80,0x6, 0x12,0x2c,0x6f,0x12,0x28,0xaf,0x12,0x8b,0x5f,0x50,0xf5, +0x7e,0xb3,0x73,0x20,0x60,0xd, 0x80,0x6, 0x12,0x2c,0x6f,0x12,0x28,0xaf,0x12,0x35, +0xf7,0x50,0xf5,0x2, 0x29,0x56,0x7e,0x63,0x77,0xe1,0x7e,0x73,0x74,0x7e,0x74,0x26, +0xa5,0xbe,0x3, 0x8, 0xac,0xb7,0x49,0x15,0x74,0x96,0x80,0x6, 0xac,0xb7,0x49,0x15, +0x74,0x92,0x7d,0x21,0x7a,0x27,0x4a,0x6f,0x30,0x15,0x10,0x7e,0x24,0x0, 0x27,0xca, +0x29,0x12,0xe5,0x39,0x12,0x24,0xf, 0x1b,0xfd,0xc2,0x15,0x22,0x7e,0xa3,0x76,0x80, +0xbe,0xa0,0x5, 0x78,0x8, 0x74,0x1, 0x7a,0xb3,0x76,0x80,0x80,0x1b,0xbe,0xa0,0x4, +0x78,0x1c,0x74,0x1, 0x7a,0xb3,0x76,0x80,0x7e,0x34,0x21,0x57,0x12,0x29,0xdb,0x12, +0x2c,0x73,0x12,0x28,0x77,0x12,0x29,0x24,0x74,0x2, 0x7a,0xb3,0x76,0x80,0x22,0x7a, +0x37,0x6e,0x8d,0xe4,0x7a,0xb3,0x78,0x42,0x7e,0x34,0x21,0x67,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x30,0x7a,0x37,0x6e,0x97,0x7e,0x34,0x21,0x69,0x7e,0x24,0x0, 0xff,0xb, +0x1a,0x30,0x22,0x90,0x21,0x51,0xe4,0x93,0x7a,0xb3,0x6e,0x89,0x12,0x2f,0x7d,0x7e, +0x34,0x21,0x5b,0x12,0x29,0xdb,0x7a,0x37,0x6e,0x8b,0x7e,0x34,0x21,0x5d,0x12,0x29, +0xdb,0x7a,0x37,0x6e,0x8d,0x7e,0x34,0x21,0x5f,0x12,0x29,0xdb,0x12,0x2b,0x49,0x7a, +0x37,0x6e,0x8f,0x7e,0x34,0x21,0x61,0x12,0x29,0xdb,0x12,0xe6,0x31,0x12,0x29,0xdb, +0x7a,0x37,0x6e,0x93,0x7e,0x34,0x21,0x65,0x12,0x29,0xdb,0x12,0x2b,0x49,0x7a,0x37, +0x6e,0x95,0x12,0x29,0xc8,0x12,0x2b,0x49,0x7a,0x37,0x6e,0x99,0x90,0x21,0x9b,0xe4, +0x93,0x7a,0xb3,0x6e,0x9d,0x90,0x21,0x54,0xe4,0x93,0x7a,0xb3,0x6e,0x9e,0x7e,0x34, +0x21,0x55,0x12,0x29,0xdb,0x7a,0x37,0x6e,0x9f,0x7e,0x34,0x21,0x6b,0x12,0x29,0xdb, +0x7a,0x37,0x6e,0x9b,0xe4,0x7a,0xb3,0x6e,0xa1,0x7a,0xb3,0x6e,0xa2,0x7a,0xb3,0x6e, +0xa3,0x7a,0xb3,0x6e,0xa4,0x7a,0xb3,0x6e,0xa5,0x7a,0xb3,0x6e,0xa6,0x7a,0xb3,0x6e, +0xa7,0x7a,0xb3,0x6e,0xa8,0x7a,0xb3,0x6e,0xa9,0x7a,0xb3,0x6e,0xaa,0x22,0x7e,0x34, +0x21,0x5b,0x12,0x29,0xdb,0x12,0x2f,0xae,0x7a,0x73,0x76,0xa, 0x7e,0x34,0x21,0x5d, +0x12,0x29,0xdb,0x12,0x2b,0x77,0x7a,0x73,0x76,0xb, 0x7e,0x34,0x21,0x63,0x12,0x29, +0xdb,0x12,0x2b,0x77,0x7a,0x73,0x76,0xc, 0x7e,0x34,0x21,0x63,0x12,0x29,0xdb,0x12, +0x2b,0x77,0x7a,0x73,0x76,0xd, 0x7e,0x34,0x21,0x6b,0x12,0x29,0xdb,0x12,0x2f,0xae, +0x7a,0x73,0x76,0xf, 0x7e,0x34,0x0, 0x6a,0xca,0x39,0x7e,0x34,0x21,0x6f,0x7e,0x24, +0x0, 0xff,0x7e,0x8, 0x76,0x10,0x12,0x24,0xf, 0x1b,0xfd,0x22,0x7e,0xb3,0x76,0x5a, +0xb4,0x1, 0x5, 0x12,0x2b,0x50,0x80,0xf, 0x7e,0xb3,0x6e,0xa3,0xb4,0x1, 0x5, 0x12, +0x2f,0x60,0x80,0x3, 0x12,0x6f,0x76,0x7e,0xb3,0x78,0x42,0x70,0x17,0x7e,0xb3,0x6e, +0x7c,0x70,0x11,0x7e,0xb3,0x6e,0xa3,0x70,0xb, 0x7e,0x34,0x21,0x6d,0x12,0x29,0xdb, +0x7a,0x37,0x6e,0x8b,0x12,0xca,0x84,0x68,0x11,0x7e,0x34,0x21,0x61,0x12,0x29,0xdb, +0x12,0xe6,0x31,0x12,0x29,0xdb,0x7a,0x37,0x6e,0x93,0x7e,0x34,0x21,0x5f,0x12,0x29, +0xdb,0x12,0x2b,0x49,0x7a,0x37,0x6e,0x8f,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x22, +0x7e,0x34,0x21,0x5b,0x12,0x29,0xdb,0x12,0x2f,0x79,0x7e,0x34,0x21,0x5d,0x12,0x29, +0xdb,0x12,0x29,0xbf,0x12,0x2f,0xa0,0x12,0x2b,0x6f,0x7a,0x73,0x76,0xb, 0x22,0x7a, +0x73,0x76,0xa, 0x7e,0x37,0x6e,0x8d,0xe, 0x34,0xe, 0x34,0xe, 0x34,0xe, 0x34,0xe, +0x34,0x22,0x30,0x29,0xf, 0x7e,0xb3,0x76,0x78,0xb4,0x1, 0x8, 0x74,0x1, 0x7a,0xb3, +0x73,0x1e,0x80,0x3, 0x12,0x52,0xda,0xc2,0x29,0x7e,0xb3,0x77,0xfa,0xb4,0x1, 0x2, +0x80,0x2, 0x81,0x36,0x12,0x68,0xda,0x12,0x8b,0xd2,0x12,0x4c,0x1f,0x12,0x29,0x24, +0x7e,0x34,0x21,0x59,0x12,0x29,0xdb,0x12,0x2c,0x73,0x12,0x8d,0x40,0x7e,0xb3,0x25, +0xae,0x70,0x2, 0x80,0x58,0x12,0xba,0x35,0x7e,0xb3,0x76,0x2e,0xb4,0x1, 0x2, 0xd2, +0x86,0x7e,0xb3,0x6e,0xa2,0x70,0x6, 0x12,0x2a,0xec,0x12,0xda,0xc3,0x12,0x74,0xa8, +0x7e,0xb3,0x25,0xae,0x70,0x2, 0x80,0x35,0x74,0x1, 0x12,0x2c,0x4b,0x12,0x2d,0xe, +0x12,0x99,0x25,0x12,0x9b,0x5b,0x74,0x2, 0x12,0x2c,0x4b,0x12,0x81,0xca,0x74,0x3, +0x12,0x2c,0x4b,0x12,0x9d,0x11,0x74,0x4, 0x12,0x2c,0x4b,0x12,0x67,0xf0,0x12,0xbb, +0xcf,0x12,0xa7,0x4e,0x12,0x70,0xd2,0x7e,0xb3,0x25,0xae,0x70,0xb, 0x12,0xb9,0xb9, +0x12,0x66,0x5a,0x12,0xd8,0x3a,0x61,0x99,0x12,0x79,0x53,0x12,0x68,0xb4,0x12,0x4f, +0x5a,0x12,0x66,0x63,0x61,0x99,0xd2,0x4, 0x12,0x36,0xe7,0x2, 0x2c,0x3e,0x12,0x0, +0x26,0x7e,0xb3,0x76,0x2e,0xb4,0x1, 0x2, 0xd2,0x86,0x22,0x1b,0xb1,0x68,0x10,0x14, +0x68,0x13,0x14,0x68,0x16,0x24,0x3, 0x78,0x15,0xe4,0x7a,0xb3,0x6e,0x86,0x22,0x12, +0x0, 0xa, 0x2, 0xb7,0xae,0x12,0xa7,0xed,0x2, 0x87,0x7, 0x2, 0xb4,0xeb,0x22,0x7e, +0x34,0x9, 0xc4,0x6d,0x22,0x7a,0x27,0x77,0xe9,0x7a,0x37,0x77,0xeb,0x22,0x12,0x52, +0x9c,0x7e,0xb3,0x77,0xfa,0xb4,0x3, 0x70,0x12,0x4e,0xc3,0x12,0x29,0x24,0x12,0x2c, +0x6f,0x7e,0xb3,0x76,0x7c,0x30,0xe7,0x5b,0x7e,0xb3,0x76,0x8d,0x70,0x5, 0xc2,0x4, +0x12,0x36,0xe7,0x12,0x28,0xaf,0x30,0x10,0x8, 0xc2,0x10,0x12,0x28,0x87,0x12,0x37, +0x94,0x7e,0xb3,0x76,0x8d,0x70,0x5, 0x12,0x8e,0x28,0x80,0x6, 0x12,0x8d,0x40,0x12, +0x8e,0x3f,0x7e,0xb3,0x73,0x1e,0xb4,0x1, 0x17,0x12,0xba,0x35,0x74,0x2, 0x12,0xca, +0x6, 0x12,0xda,0xc3,0x12,0x4f,0xf8,0x12,0xc9,0xfb,0x12,0x74,0xa8,0x12,0x2d,0xe, +0x12,0x51,0xa3,0x7e,0xb3,0x76,0x8d,0x70,0xa, 0x7e,0xb3,0x76,0x7c,0x54,0x7f,0x7a, +0xb3,0x76,0x7c,0x12,0x66,0x40,0x80,0x89,0xd2,0x29,0xd2,0x4, 0x12,0x36,0xe7,0x2, +0x2d,0x2, 0xe4,0x7a,0xb3,0x78,0x2f,0x6d,0x33,0x7a,0x37,0x78,0x31,0x22,0xc2,0x2a, +0x7e,0xb3,0x6e,0xa1,0x70,0x3, 0x12,0xc8,0x20,0x12,0x2f,0x20,0x12,0xbd,0xf2,0x12, +0x2f,0x20,0x12,0x55,0x9, 0x12,0x2f,0x20,0x12,0x5e,0xa3,0x12,0x2f,0x20,0x12,0x8f, +0xff,0x12,0x2f,0x20,0x2, 0x2d,0x37,0xca,0x3b,0xc2,0x0, 0x7e,0xd3,0x6c,0xde,0xa, +0x3d,0x3e,0x34,0xca,0x39,0x7e,0x18,0x6b,0x54,0x7e,0x8, 0x62,0xb8,0x12,0x24,0xf, +0x1b,0xfd,0x6c,0x11,0x75,0x26,0x0, 0x6c,0xcc,0xc1,0x11,0x7e,0x44,0x3, 0xff,0x7e, +0xe0,0xff,0x6c,0xff,0x80,0x5a,0x7c,0xbf,0x12,0x2f,0xde,0x60,0x51,0x12,0xe6,0x78, +0xbe,0x0, 0xff,0x68,0x49,0x9, 0x5, 0x62,0xb9,0xa, 0x10,0x7e,0x70,0x2, 0xac,0x7c, +0x9, 0x3, 0x77,0x77,0xa, 0x30,0x12,0x95,0x6b,0x8, 0x4, 0x9d,0x31,0x80,0x4, 0x6d, +0x33,0x9d,0x32,0x12,0xe6,0x78,0xa, 0xf0,0x74,0x2, 0xac,0xbc,0x9, 0x5, 0x77,0x76, +0xa, 0x10,0x7d,0x21,0x9d,0x2f,0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x9d,0x1f,0x80,0x4, +0x6d,0x11,0x9d,0x12,0x2d,0x13,0xbd,0x41,0x28,0x4, 0x7d,0x41,0x7c,0xef,0xb, 0xf0, +0xbc,0xdf,0x38,0xa2,0xbe,0xe0,0xff,0x68,0x46,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3, +0x62,0xb8,0x9, 0x73,0x62,0xb9,0x12,0x57,0x9, 0x7d,0x13,0x74,0x2, 0xac,0xbe,0x9, +0xb5,0x62,0xb8,0x12,0x97,0xf8,0xbd,0x13,0x48,0x25,0x7e,0x70,0x2, 0xac,0x7e,0x9, +0x3, 0x62,0xb8,0x7e,0xa1,0x26,0x74,0x2, 0xa4,0x19,0x5, 0x62,0xf4,0x9, 0x3, 0x62, +0xb9,0x19,0x5, 0x62,0xf5,0x74,0xff,0x19,0xb3,0x62,0xb8,0xb, 0x10,0x5, 0x26,0xb, +0xc0,0x7e,0x3, 0x77,0xb2,0xbc,0xc, 0x28,0x2, 0xa1,0x5b,0x7c,0xc1,0x80,0x76,0x6d, +0x0, 0x7e,0xe0,0xff,0x6c,0xff,0x80,0x40,0x7c,0xbf,0x12,0x2f,0xde,0x60,0x37,0x7e, +0x30,0x2, 0xac,0x3f,0x9, 0xb1,0x62,0xb8,0xbe,0xb0,0xff,0x68,0x29,0x9, 0x71,0x62, +0xb9,0x12,0x57,0x9, 0x7d,0x43,0xc2,0x0, 0xbd,0x4, 0x58,0x2, 0xd2,0x0, 0x30,0x0, +0x15,0x7e,0x70,0x2, 0xac,0x7f,0x9, 0xb3,0x62,0xb8,0xf5,0x27,0x9, 0xb3,0x62,0xb9, +0xf5,0x28,0x7d,0x4, 0x7c,0xef,0xb, 0xf0,0xbc,0xdf,0x38,0xbc,0xbe,0xe0,0xff,0x68, +0x22,0x7e,0xa1,0x27,0x7e,0x31,0x26,0x74,0x2, 0xac,0x3b,0x19,0xa1,0x62,0xf4,0xe5, +0x28,0x19,0xb1,0x62,0xf5,0x7e,0xa0,0xff,0x7e,0x30,0x2, 0xac,0x3e,0x19,0xa1,0x62, +0xb8,0x5, 0x26,0xb, 0xc0,0x90,0x21,0x51,0xe4,0x93,0xbc,0xbc,0x38,0x81,0x90,0x21, +0x52,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x62,0xf4,0x7e,0x8, +0x62,0xb8,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0xd1,0x26,0x12,0x54,0xc8,0x74,0x2, 0xac, +0x7b,0x7e,0x8, 0x77,0x76,0x74,0xff,0x12,0x24,0x34,0xbe,0xd0,0x0, 0x28,0x37,0xa, +0x3d,0x3e,0x34,0xca,0x39,0x7e,0x18,0x62,0xb8,0x7e,0x8, 0x6b,0x54,0x12,0x24,0xf, +0x1b,0xfd,0xa, 0x3d,0x3e,0x34,0xca,0x39,0x7e,0x18,0x62,0xb8,0x7e,0x8, 0x77,0x76, +0x12,0x24,0xf, 0x1b,0xfd,0x6c,0xcc,0x80,0x9, 0xd2,0x2, 0x7c,0xbc,0x12,0x57,0x49, +0xb, 0xc0,0xbc,0xdc,0x38,0xf3,0x7a,0xd3,0x77,0xb2,0x7a,0xd3,0x6c,0xde,0x90,0x21, +0x51,0xe4,0x93,0xbe,0xb3,0x6c,0xde,0x50,0x4, 0x7a,0xb3,0x6c,0xde,0xda,0x3b,0x22, +0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x2c,0x7c,0xbe,0x12,0x2f,0xde,0x60,0x23,0x7e, +0x34,0x0, 0x2, 0xca,0x39,0xac,0x7e,0x2e,0x34,0x6b,0x54,0x6d,0x22,0x7e,0x30,0x2, +0xac,0x3f,0x2e,0x14,0x6b,0x54,0x6d,0x0, 0x12,0x24,0xf, 0x1b,0xfd,0xd2,0x2, 0x12, +0x57,0x3d,0xb, 0xe0,0x12,0x9d,0x0, 0x38,0xcf,0x7a,0xf3,0x6c,0xde,0xda,0x79,0x22, +0x7e,0x34,0x0, 0xaa,0x12,0x2f,0x79,0x7e,0x34,0x0, 0x64,0x12,0x29,0xbf,0x12,0x2f, +0xa0,0x12,0x2b,0x6f,0x7a,0x73,0x76,0xb, 0x22,0x7a,0x37,0x6e,0x8b,0x90,0x21,0x53, +0xe4,0x93,0x7a,0xb3,0x6e,0x8a,0x22,0x7e,0x34,0x21,0x57,0x12,0x29,0xdb,0x12,0x2c, +0x73,0x12,0x69,0x3f,0x12,0x54,0x1c,0x12,0xe5,0xf2,0x12,0x2f,0xf0,0x2, 0x28,0x7c, +0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x6e,0x99,0x7e,0x37,0x6e,0x8b,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x22,0x12,0x69,0x3f,0x12,0x2a,0x8e,0x12, +0x54,0x1c,0x12,0x59,0x32,0x12,0x28,0x6c,0x7e,0xb3,0x76,0x31,0x24,0xfd,0x68,0x9, +0xb, 0xb1,0x78,0xf4,0x12,0x2b,0x82,0x80,0xef,0x12,0x2c,0x7e,0x80,0xea,0x7c,0x7b, +0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x9, 0xa2,0x6b,0xcc,0x12,0x6e,0x60,0x5c,0xba,0x22, +0x7e,0x34,0xd, 0xac,0x2, 0x2c,0x73,0x7e,0xb3,0x76,0xae,0x12,0x34,0xac,0x7e,0x37, +0x4a,0x6d,0x4e,0x60,0x1, 0x7a,0x37,0x4a,0x6d,0x4e,0x70,0x20,0x7a,0x37,0x4a,0x6d, +0xca,0x3b,0x7e,0xf3,0x77,0xe1,0x7e,0x30,0x27,0xac,0x3f,0x9, 0xb1,0x28,0xe6,0xf5, +0x26,0x9, 0xb1,0x28,0xe7,0xf5,0x27,0x7e,0x4, 0x0, 0x27,0xca,0x9, 0x2e,0x14,0x28, +0xe6,0x6d,0x0, 0x7e,0x18,0x76,0xad,0x12,0x24,0xf, 0x1b,0xfd,0x74,0x27,0xac,0xbf, +0x9, 0xe5,0x28,0xea,0x7e,0xd0,0xb5,0xac,0xde,0x2e,0x64,0x1, 0x0, 0xe4,0x12,0x35, +0x28,0x12,0x32,0x3e,0x5e,0x24,0x1, 0x0, 0x68,0xc, 0x5e,0x60,0xfe,0x7a,0x37,0x4a, +0x6d,0x7c,0xbf,0x12,0x38,0x20,0x12,0x32,0x3e,0x5e,0x24,0x0, 0x1, 0x68,0x2e,0x5e, +0x70,0xfe,0x7a,0x37,0x4a,0x6d,0x7e,0xb3,0x76,0xad,0x12,0x38,0x8, 0x50,0xc, 0x7e, +0xb3,0x76,0xad,0x12,0x38,0x81,0x12,0x32,0xb7,0x80,0x12,0x7e,0xa1,0x26,0x7e,0x70, +0x27,0xac,0x7f,0x19,0xa3,0x28,0xe6,0xe5,0x26,0x7a,0xb3,0x76,0xad,0x12,0x32,0x3e, +0x5e,0x24,0x0, 0x2, 0x68,0x37,0x5e,0x70,0xfd,0x7a,0x37,0x4a,0x6d,0x7e,0xb3,0x76, +0xae,0x12,0xc6,0x48,0x50,0x15,0x7e,0xb3,0x76,0xae,0x12,0x39,0x17,0x50,0xc, 0x7e, +0xb3,0x76,0xae,0x12,0x34,0xac,0x12,0x32,0xb7,0x80,0x12,0x7e,0xa1,0x27,0x7e,0x70, +0x27,0xac,0x7f,0x19,0xa3,0x28,0xe7,0xe5,0x27,0x7a,0xb3,0x76,0xae,0x12,0x32,0x3e, +0x5e,0x24,0x0, 0x4, 0x68,0x2d,0x5e,0x70,0xfb,0x12,0x32,0x71,0x7e,0x30,0x2c,0xac, +0x3e,0x12,0x33,0xde,0x74,0x1, 0x7e,0x70,0x27,0xac,0x7f,0x12,0x37,0xe8,0x12,0x33, +0xe5,0x12,0x32,0x45,0x12,0x34,0xf1,0x12,0x34,0xe2,0x7d,0x36,0x74,0x2c,0xac,0xbe, +0x12,0x8a,0xed,0x12,0x32,0x3e,0x5e,0x24,0x0, 0x8, 0x68,0xe, 0x5e,0x70,0xf7,0x7a, +0x37,0x4a,0x6d,0x7e,0xb3,0x76,0xb0,0x12,0x38,0xcd,0x12,0x32,0x3e,0x5e,0x24,0x0, +0x10,0x68,0xc, 0x5e,0x70,0xef,0x12,0x32,0x78,0x12,0x32,0x45,0x12,0x34,0xf1,0x12, +0x32,0x3e,0x5e,0x24,0x0, 0x20,0x68,0x37,0x5e,0x70,0xdf,0x7a,0x37,0x4a,0x6d,0x4e, +0x60,0x2, 0x12,0x32,0x71,0x12,0x33,0xe5,0x12,0x32,0x65,0x74,0xa, 0xac,0xbf,0x12, +0xe5,0xb0,0x12,0x32,0x65,0x7e,0x70,0x27,0xac,0x7f,0x12,0xe5,0xc7,0x7c,0xbf,0x12, +0xd8,0x46,0x12,0x34,0xe2,0x12,0x32,0x5f,0x7e,0x24,0x0, 0x10,0x12,0xc, 0xcc,0x12, +0x32,0x3e,0x5e,0x24,0x0, 0x40,0x68,0x20,0x5e,0x70,0xbf,0x7a,0x37,0x4a,0x6d,0xbe, +0xf0,0x3, 0x7c,0xbf,0x12,0x8f,0x6f,0x78,0x7, 0xac,0x67,0x12,0xe6,0x4c,0x80,0x5, +0xac,0x67,0x12,0x37,0xff,0x12,0x44,0x0, 0x12,0x32,0x3e,0x5e,0x24,0x0, 0x80,0x68, +0xa, 0x5e,0x70,0x7f,0x7a,0x37,0x4a,0x6d,0x12,0x5a,0x65,0x12,0x32,0x3e,0x5e,0x24, +0x2, 0x0, 0x68,0x3b,0x5e,0x60,0xfd,0x7a,0x37,0x4a,0x6d,0x74,0x27,0xac,0xbf,0x49, +0xe5,0x28,0xed,0xb, 0xe4,0x7e,0xf7,0x76,0xd6,0xad,0xef,0xbe,0x78,0x7f,0xff,0x28, +0x4, 0x7e,0x78,0x7f,0xff,0x7e,0x8, 0x0, 0x82,0x12,0x34,0xf8,0x7e,0x8, 0x0, 0xbe, +0x12,0x34,0xf8,0x7e,0x8, 0x0, 0x82,0x7d,0x3f,0x12,0xd8,0x90,0x12,0xc, 0xcc,0x12, +0x32,0x3e,0x5e,0x24,0x4, 0x0, 0x68,0xe, 0x5e,0x60,0xfb,0x7a,0x37,0x4a,0x6d,0x7e, +0xb3,0x76,0x86,0x12,0xc2,0x16,0x12,0x32,0x3e,0x5e,0x24,0x10,0x0, 0x68,0x7, 0x5e, +0x60,0xef,0x7a,0x37,0x4a,0x6d,0x12,0x32,0x3e,0x5e,0x24,0x20,0x0, 0x68,0xc, 0x5e, +0x60,0xdf,0x7a,0x37,0x4a,0x6d,0x7c,0xbf,0x12,0x57,0xfb,0xda,0x3b,0x22,0x7e,0x37, +0x4a,0x6d,0x7d,0x23,0x22,0x7e,0x30,0x2c,0xac,0x3e,0x2e,0x14,0x1, 0x0, 0x6d,0x0, +0x74,0xa, 0xac,0xbf,0x49,0x35,0x29,0x92,0x49,0x25,0x29,0x90,0x12,0x9, 0xad,0x7d, +0x36,0x2e,0x34,0x0, 0x6, 0x7e,0x30,0x2c,0xac,0x3e,0x2e,0x14,0x1, 0x0, 0x6d,0x0, +0x22,0x7a,0x37,0x4a,0x6d,0x4e,0x60,0x10,0x7a,0x37,0x4a,0x6d,0x7c,0xbf,0xca,0xf8, +0x7c,0xfb,0x12,0x32,0xb7,0x7e,0xa3,0x76,0xaf,0x7e,0x70,0x27,0xac,0x7f,0x19,0xa3, +0x28,0xe8,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x42,0x76,0xb4,0x7e,0x70,0x27, +0xac,0x7f,0x2d,0x32,0x59,0x43,0x28,0xed,0xb, 0xa0,0xbe,0xa0,0x10,0x40,0xe5,0x7c, +0xbf,0x12,0x89,0x3a,0xda,0xf8,0x22,0x12,0x47,0xed,0x68,0x3a,0xe5,0x1e,0x60,0x36, +0x7e,0xb3,0x76,0xad,0x7e,0x73,0x76,0xae,0x12,0xd3,0x44,0x7d,0x23,0x7e,0x34,0x0, +0x3, 0xad,0x32,0x7e,0x24,0x0, 0xa, 0x8d,0x32,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x12,0x76,0xb4,0xbd,0x13,0x28,0x7, 0x59,0x32,0x76,0xb4,0x12,0xe5,0xe6,0xb, +0xa0,0xbe,0xa0,0x10,0x78,0xe5,0x22,0xca,0x79,0x7c,0xeb,0xbe,0xe0,0x4, 0x40,0x2, +0x61,0xcd,0x12,0xe6,0x43,0xbe,0xf0,0x3, 0x40,0x2, 0x61,0xcd,0x74,0x2, 0xac,0xbe, +0x9, 0xb5,0x29,0x83,0x54,0x3f,0xa, 0x3b,0x74,0x2c,0xac,0xbf,0x59,0x35,0x0, 0xf4, +0x74,0x2, 0xac,0xbe,0x9, 0xb5,0x29,0x82,0x54,0x1f,0x7c,0x6b,0x6c,0x77,0x12,0x33, +0xd2,0x74,0x2c,0xac,0xbf,0x59,0x35,0x0, 0xf6,0x12,0x33,0xd9,0x74,0x1, 0x7e,0x70, +0x27,0xac,0x7e,0x12,0x37,0xe8,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x32,0x6a,0x7e,0x70, +0x27,0xac,0x7e,0x12,0xe5,0xc7,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x38,0x7a,0x74,0x27, +0xac,0xbe,0x9, 0x75,0x28,0xe6,0x12,0x33,0xd0,0x12,0xd, 0xd3,0x7e,0x30,0x2c,0xac, +0x3f,0x12,0x34,0x9d,0x74,0x27,0xac,0xbe,0x9, 0x75,0x28,0xe7,0x12,0x33,0xd0,0x12, +0xd, 0xe5,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x34,0x9d,0x74,0xa, 0xac,0xbe,0x12,0x33, +0xf4,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x32,0x6a,0x74,0xa, 0xac,0xbe,0x12,0xe5,0xb0, +0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14,0x1, 0x8, 0x6d,0x0, 0x74,0x27,0xac,0xbe,0x9, +0xb5,0x28,0xe9,0x12,0xc, 0xaa,0xe4,0x12,0x35,0x28,0x7e,0x70,0xb5,0xac,0x7f,0x2e, +0x34,0x1, 0x0, 0x12,0x33,0xd9,0x7e,0x24,0x0, 0x16,0x12,0xc, 0xcc,0xda,0x79,0x22, +0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x22,0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14, +0x0, 0xf4,0x6d,0x0, 0x22,0x7e,0x30,0x2c,0xac,0x3e,0x2e,0x14,0x0, 0xf8,0x6d,0x0, +0x74,0xa, 0xac,0xbf,0x9, 0xb5,0x29,0x8a,0x2, 0xd, 0x73,0x12,0x34,0x94,0x7d,0x1, +0x5e,0x4, 0x0, 0x1, 0x78,0xa, 0xe4,0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x0, 0x80,0x2f, +0x5e,0x14,0x0, 0x2, 0x78,0x5, 0x12,0x34,0xff,0x80,0x24,0x7e,0xb3,0x77,0xe1,0xbe, +0xb0,0x1, 0x68,0x2, 0x70,0x19,0x12,0x34,0x8b,0x68,0xb, 0x74,0x2, 0x7a,0xb3,0x77, +0xe1,0x75,0x1e,0x2, 0x80,0x9, 0x74,0x3, 0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x3, 0x74, +0x1, 0x12,0x32,0xf7,0x7e,0xb3,0x77,0xe1,0x24,0x0, 0x68,0x2d,0x24,0xfd,0x68,0x16, +0x4, 0x78,0x2a,0x12,0x34,0x94,0x5e,0x14,0x0, 0x2, 0x68,0x2e,0x12,0x34,0x8b,0x78, +0x29,0x74,0x1, 0x2, 0x5, 0xbc,0x12,0x34,0x94,0x5e,0x14,0x0, 0x2, 0x68,0x1b,0x12, +0x34,0x8b,0x68,0x16,0x74,0x1, 0x2, 0x5, 0x30,0xe4,0x2, 0x32,0xf7,0x7e,0xf, 0x78, +0x39,0x12,0x3f,0x7c,0x12,0x37,0xe1,0x12,0x34,0xff,0x22,0x69,0x31,0x0, 0xe, 0x5e, +0x34,0x0, 0x8, 0x22,0x7e,0x1f,0x78,0x39,0x69,0x11,0x0, 0x6, 0x22,0x2e,0x14,0x0, +0xf8,0x6d,0x0, 0x22,0x74,0x26,0xac,0xbf,0x9, 0xb5,0x74,0x82,0xca,0x3b,0x7c,0xfb, +0x6c,0xee,0x74,0x27,0xac,0xbe,0x19,0xf5,0x28,0xe7,0xb, 0xe0,0xbe,0xe0,0x4, 0x78, +0xf1,0x7e,0x64,0x1, 0x0, 0x6c,0xee,0x7e,0x30,0x2c,0xac,0x3e,0x12,0x34,0x9d,0xa, +0x3f,0x12,0x33,0xd2,0x12,0xd, 0xe5,0x12,0x34,0xe2,0x12,0x38,0xc3,0x40,0xe8,0xda, +0x3b,0x22,0x7d,0x36,0xb, 0x35,0x74,0x2c,0xac,0xbe,0x49,0x25,0x0, 0xf8,0x2, 0x0, +0x2e,0x7e,0x24,0x0, 0x4, 0x2, 0xc, 0xcc,0x7e,0x37,0x76,0xd4,0x2, 0xc, 0x88,0x74, +0x1, 0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x1, 0x22,0xca,0xf8,0x12,0xd3,0x56,0x7e,0xf0, +0x1, 0x7c,0xbf,0x12,0x32,0xf7,0xb, 0xf0,0xbe,0xf0,0x4, 0x78,0xf4,0xe5,0x1e,0x70, +0x4, 0xe4,0x12,0x32,0xf7,0xda,0xf8,0x22,0x7c,0xab,0x7e,0x8, 0x0, 0x7c,0x7c,0xba, +0x12,0xd, 0xf7,0x7e,0x8, 0x0, 0xb8,0x12,0xd, 0xf7,0x7e,0x34,0x0, 0x8, 0x7e,0x8, +0x0, 0x7c,0x12,0x5b,0x4d,0x7e,0x34,0x0, 0x8, 0x7e,0x8, 0x0, 0xb8,0x7e,0x24,0x0, +0x1, 0x2, 0x4, 0x96,0x7c,0xbf,0x7e,0x73,0x74,0x7e,0xca,0x79,0x7c,0xf7,0x7c,0xeb, +0xd2,0x17,0x12,0x34,0xa4,0xbe,0xe0,0x3, 0x7c,0xbe,0x7e,0x70,0x26,0x78,0x7, 0xac, +0x7f,0x12,0xe6,0x4c,0x80,0x5, 0xac,0x7f,0x12,0x37,0xff,0x12,0x44,0x0, 0xda,0x79, +0x22,0xca,0x79,0x7c,0xfb,0xc2,0x2, 0x7c,0xbf,0x12,0xc7,0x64,0xe5,0x1e,0x60,0x5d, +0x6c,0xee,0x74,0x26,0xac,0xbe,0x9, 0xb5,0x74,0x8f,0x60,0x38,0x12,0x8f,0x67,0x7c, +0x7e,0x12,0x35,0x5a,0xd2,0x2, 0xbe,0xf0,0x3, 0xa2,0x1, 0x92,0x3, 0x74,0x26,0x78, +0xc, 0xac,0xbe,0x49,0x15,0x74,0xa6,0x49,0x5, 0x74,0xa4,0x80,0xa, 0xac,0xbe,0x49, +0x15,0x74,0x9e,0x49,0x5, 0x74,0x9c,0x49,0x35,0x74,0xa2,0x49,0x25,0x74,0xa0,0x7c, +0xbf,0x12,0x36,0xff,0x20,0xb, 0x6, 0x20,0xc, 0x3, 0x30,0xe, 0x9, 0x30,0x2, 0x3, +0x12,0x35,0x54,0xc3,0x80,0xe, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xa5,0x30,0x2, 0x3, +0x12,0x35,0x54,0xd3,0xda,0x79,0x22,0xca,0xf8,0xc2,0x0, 0x7e,0xf3,0x77,0xe1,0x20, +0xb, 0x6, 0x20,0xc, 0x3, 0x30,0xe, 0x3, 0xc3,0xc1,0x99,0x7e,0x24,0x0, 0x1, 0x7c, +0xbf,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x73,0x20,0x6c,0x66,0x5c,0x75, +0x4d,0x33,0x68,0x74,0x7c,0xbf,0x12,0x8f,0x4b,0x50,0x2, 0xd2,0x0, 0xd2,0x4, 0x12, +0x36,0xe7,0xa2,0x0, 0x92,0x1, 0x7c,0xbf,0x12,0x35,0x81,0x40,0x3, 0xc3,0x80,0x59, +0x7c,0xbf,0x7e,0x73,0x75,0x6, 0x12,0x35,0x5a,0xe4,0x7c,0x7f,0x12,0x8e,0x47,0xa2, +0x0, 0x92,0x3, 0x7e,0xf, 0x24,0x64,0x7e,0x18,0x18,0x3c,0x7c,0xbf,0x12,0x36,0xff, +0x12,0x35,0x54,0x20,0xb, 0x6, 0x20,0xc, 0x3, 0x30,0xe, 0x3, 0xc3,0x80,0x2a,0x12, +0x37,0x94,0x12,0xc6,0x6c,0xc2,0x1, 0x12,0x28,0x8c,0x12,0x8b,0xcb,0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x6e,0x70,0xff,0x5e,0x73,0x73,0x20,0x7a,0x73,0x73,0x20,0x12, +0x47,0xde,0x12,0x8b,0xd2,0xd3,0x80,0x1, 0xd3,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xfb, +0xbe,0xf0,0x3, 0x50,0x1c,0xbe,0x70,0x3, 0x50,0x17,0xd2,0x4, 0x12,0x36,0xe7,0x12, +0x34,0xa4,0x7e,0xb3,0x77,0xe1,0x7c,0x7f,0x12,0x35,0x5a,0x7a,0xf3,0x74,0x7e,0xd2, +0x15,0xda,0xf8,0x22,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x62,0xb8,0x7e,0x24,0x0, 0x12, +0x12,0x3, 0xfa,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x62,0xdc,0x7e,0x24,0x0, 0x12,0x12, +0x4, 0x96,0x12,0x37,0x94,0xd2,0x4, 0x80,0x6, 0x30,0xb, 0x3, 0x12,0x3e,0xe7,0x7e, +0xb3,0x76,0xff,0xbe,0xb0,0x1, 0x68,0xf1,0x30,0x4, 0x3, 0x2, 0xb, 0xe5,0x22,0xca, +0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0x7e,0x18,0xc, 0x18,0x7a,0x1d,0x2d,0x12, +0x37,0x94,0x7e,0xd, 0x26,0x12,0x37,0xef,0x30,0x3, 0xc, 0x7e,0x18,0x10,0x24,0x7a, +0x1d,0x31,0x7f,0x3, 0x12,0x37,0xef,0xe4,0x68,0x3, 0x12,0x37,0x94,0xd2,0x4, 0x12, +0x36,0xe7,0x30,0x3, 0x23,0x6d,0x33,0x80,0x17,0x12,0x37,0xf7,0x7e,0xd, 0x31,0x2d, +0x12,0xb, 0xa, 0x50,0x7d,0x23,0x3e,0x24,0x12,0xc5,0x5, 0x1b,0xa, 0x20,0xb, 0x34, +0x7a,0x35,0x2b,0x12,0xe6,0xf, 0x38,0xe1,0x6d,0x33,0x80,0x1f,0x12,0x37,0xf7,0x7e, +0xd, 0x2d,0x2d,0x12,0xb, 0xa, 0x20,0x3e,0x34,0x7e,0xd, 0x26,0x2d,0x13,0xb, 0xa, +0x30,0x2d,0x32,0x1b,0xa, 0x30,0x7e,0x35,0x2b,0xb, 0x34,0x7a,0x35,0x2b,0x12,0xe6, +0xf, 0x38,0xd9,0x7e,0xd, 0x26,0x12,0x8c,0x97,0x30,0x3, 0x5, 0x7f,0x3, 0x12,0x8c, +0x97,0xda,0x3b,0x22,0xe4,0x7a,0xb3,0x76,0xff,0x12,0xe5,0xd2,0x12,0xe4,0xbb,0x12, +0x3c,0xf3,0x12,0x37,0xe1,0xc2,0x4, 0x12,0x37,0xba,0x12,0xd3,0xbf,0xbe,0xb0,0x1, +0x68,0x3, 0x12,0xd3,0xaf,0xd2,0x4, 0x2, 0x37,0xba,0xa2,0xac,0x92,0x5, 0xc2,0xac, +0x7e,0xf, 0x78,0x39,0x30,0x4, 0xa, 0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x70,0x3, 0x80, +0x8, 0xb, 0x16,0xb, 0xa, 0x30,0x5e,0x70,0xfc,0x1b,0xa, 0x30,0xa2,0x5, 0x92,0xac, +0x22,0x5e,0x70,0xfb,0x1b,0xa, 0x30,0x22,0x9, 0x73,0x28,0xe8,0x2, 0xd, 0x23,0x7e, +0x34,0x4, 0xc, 0xe4,0x2, 0x24,0x34,0x7e,0x35,0x2b,0x7d,0x23,0x3e,0x24,0x22,0x49, +0x13,0x74,0x92,0x49,0x3, 0x74,0x90,0x22,0x7c,0x7b,0x74,0x8, 0xac,0x7b,0xbe,0x34, +0x0, 0x5a,0x38,0x2, 0xc3,0x22,0xbe,0x34,0x0, 0x1e,0x50,0x2, 0xc3,0x22,0xd3,0x22, +0x7c,0x7b,0x74,0x27,0xac,0xb7,0x9, 0x95,0x28,0xea,0x7e,0x63,0x76,0xa5,0x74,0x2, +0xac,0xb7,0x19,0x65,0x29,0x82,0x7e,0x63,0x76,0xa6,0x74,0x2, 0xac,0xb7,0x19,0x65, +0x29,0x83,0x74,0x2, 0xac,0x7b,0x2e,0x34,0x29,0x82,0x7e,0x14,0x0, 0x28,0x12,0x23, +0x44,0x7e,0x30,0x2c,0xac,0x39,0x7d,0x31,0x2e,0x34,0x0, 0xf4,0x12,0x38,0x7a,0x12, +0xb, 0x44,0x7e,0x70,0xb5,0xac,0x79,0x2e,0x34,0x1, 0x0, 0x7e,0x30,0x2c,0xac,0x39, +0x12,0x33,0xde,0x7e,0x24,0x0, 0x2, 0x2, 0xc, 0xcc,0x2e,0x14,0x0, 0xf6,0x6d,0x0, +0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x74,0x27,0xac,0xbe,0x19,0xf5,0x28,0xe6,0xb, +0xe0,0xbe,0xe0,0x4, 0x78,0xf1,0x7e,0x64,0x1, 0x0, 0x6c,0xee,0x7e,0x30,0x2c,0xac, +0x3e,0x12,0x38,0x7a,0xa, 0x3f,0x12,0x33,0xd2,0x12,0xd, 0xd3,0x7d,0x36,0xb, 0x34, +0x74,0x2c,0xac,0xbe,0x49,0x25,0x0, 0xf6,0x12,0x0, 0x2e,0x12,0x38,0xc3,0x40,0xdc, +0xda,0x3b,0x22,0x2e,0x64,0x0, 0xb5,0xb, 0xe0,0xbe,0xe0,0x3, 0x22,0xca,0x3b,0x7c, +0xfb,0x6c,0xee,0x74,0x27,0xac,0xbe,0x19,0xf5,0x28,0xe9,0xb, 0xe0,0xbe,0xe0,0x4, +0x78,0xf1,0x7e,0x64,0x1, 0xa, 0x6c,0xee,0x7e,0x30,0x2c,0xac,0x3e,0x2e,0x14,0x1, +0x8, 0x6d,0x0, 0x7c,0xbf,0x12,0xc, 0xaa,0x12,0x39,0xc, 0x12,0x6, 0x48,0x12,0x39, +0xc, 0x12,0x6, 0xc5,0x12,0x38,0xc3,0x40,0xdf,0xda,0x3b,0x22,0x7d,0x36,0x74,0x2c, +0xac,0xbe,0x49,0x25,0x1, 0x8, 0x22,0x7c,0x7b,0x74,0x8, 0xac,0x7b,0xbe,0x34,0x0, +0x12,0x50,0x2, 0xc3,0x22,0xd3,0x22,0x7c,0x2b,0xa5,0xba,0xfa,0x5, 0x7e,0xb3,0x4a, +0x66,0x22,0xa5,0xba,0xfc,0x3, 0x74,0x1, 0x22,0xbe,0x20,0x5b,0x38,0x7, 0xa, 0x32, +0x9, 0xb3,0x76,0x7c,0x22,0xbe,0x20,0x6a,0x68,0x4, 0xa5,0xba,0x6b,0x1d,0x7e,0x37, +0x4a,0x63,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x4a,0x63,0x2e,0x37,0x4e,0x7f,0x7e,0x39, +0x30,0xa5,0xba,0x6b,0x3, 0x75,0x1a,0x6a,0x7c,0xb3,0x22,0xbe,0x20,0x6e,0x68,0x4, +0xa5,0xba,0x6f,0x1d,0x7e,0x37,0x4a,0x61,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x4a,0x61, +0x2e,0x37,0x4a,0x6f,0x7e,0x39,0x30,0xa5,0xba,0x6f,0x3, 0x75,0x1a,0x6e,0x7c,0xb3, +0x22,0xbe,0x20,0x6c,0x68,0x4, 0xa5,0xba,0x6d,0x1d,0x7e,0x37,0x4e,0x7d,0x7d,0x23, +0xb, 0x24,0x7a,0x27,0x4e,0x7d,0x2e,0x37,0x4a,0x6b,0x7e,0x39,0x30,0xa5,0xba,0x6d, +0x3, 0x75,0x1a,0x6c,0x7c,0xb3,0x22,0xbe,0x20,0x89,0x68,0x4, 0xa5,0xba,0x8a,0x1d, +0x7e,0x37,0x4e,0x83,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x4e,0x83,0x2e,0x37,0x4e,0x81, +0x7e,0x39,0x30,0xa5,0xba,0x8a,0x3, 0x75,0x1a,0x89,0x7c,0xb3,0x22,0xbe,0x20,0x70, +0x40,0xa, 0xbe,0x20,0x7f,0x38,0x5, 0x7c,0xb2,0x2, 0x3a,0xa4,0xbe,0x20,0x81,0x68, +0x4, 0xa5,0xba,0x82,0x2a,0x7e,0xb3,0x76,0x93,0x7c,0xab,0xbe,0xa0,0x20,0x40,0xd, +0xbe,0xa0,0x40,0x50,0x8, 0xa, 0x3a,0x9, 0x33,0x6b,0x14,0x80,0x3, 0x12,0x6f,0xe6, +0x4, 0x7a,0xb3,0x76,0x93,0xa5,0xba,0x82,0x3, 0x75,0x1a,0x81,0x7c,0xb3,0x22,0xa5, +0xba,0x86,0x5, 0x7e,0xb3,0x4a,0x68,0x22,0xa5,0xba,0x87,0x5, 0x7e,0xb3,0x4a,0x60, +0x22,0xa5,0xba,0x88,0x19,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x10,0x5e,0x34,0x38, +0x0, 0xa, 0x56,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x7, 0x22,0xbe,0x20, +0x90,0x40,0xa, 0xbe,0x20,0x94,0x38,0x5, 0x7c,0xb2,0x2, 0x66,0x98,0xbe,0x20,0x99, +0x68,0x4, 0xa5,0xba,0x9a,0x1b,0x7e,0x33,0x4a,0x65,0x7c,0xb3,0x4, 0x7a,0xb3,0x4a, +0x65,0xa, 0x33,0x9, 0x33,0x4e,0x85,0xa5,0xba,0x9a,0x3, 0x75,0x1a,0x99,0x7c,0xb3, +0x22,0xa5,0xba,0x9b,0x5, 0x7e,0xb3,0x4a,0x67,0x22,0xa5,0xba,0xf6,0x5, 0x7e,0xb3, +0x78,0x2f,0x22,0xa5,0xba,0xf7,0xb, 0x7e,0x57,0x78,0x31,0x7e,0x44,0x0, 0x64,0x8d, +0x54,0x22,0xe4,0x22,0x7c,0x6b,0x7e,0x70,0xff,0x7c,0xb6,0x24,0x8c,0xbe,0xb0,0xa, +0x40,0x2, 0x61,0x50,0x7e,0xa0,0x3, 0xa4,0x90,0x3a,0xbc,0x73,0x2, 0x3a,0xfa,0x2, +0x3b,0x50,0x2, 0x3a,0xda,0x2, 0x3a,0xe8,0x2, 0x3a,0xf1,0x2, 0x3b,0x3, 0x2, 0x3b, +0x1f,0x2, 0x3b,0xe, 0x2, 0x3b,0x24,0x2, 0x3b,0x24,0x7e,0x1f,0x78,0x39,0x69,0x31, +0x0, 0xe, 0x5e,0x34,0x0, 0x4, 0x80,0x68,0x7e,0x1f,0x78,0x39,0x12,0x34,0x8b,0x80, +0x5f,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x2, 0x80,0x56,0x12,0x3b,0x69,0x5e,0x34,0x0, +0x1, 0x80,0x4d,0x12,0x3b,0x69,0x5e,0x34,0x4, 0x0, 0xa, 0x36,0x80,0xb, 0x12,0x3b, +0x69,0x5e,0x34,0x8, 0x0, 0xa, 0x36,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x80,0x31,0x7e, +0x71,0xef,0x80,0x2c,0x7e,0x73,0x77,0xd6,0x7c,0xb7,0x4, 0x7a,0xb3,0x77,0xd6,0xa, +0x27,0x9, 0x72,0x1, 0x7c,0x7e,0xb3,0x76,0xa0,0x4, 0x7a,0xb3,0x76,0xa0,0x70,0x9, +0x7e,0xb3,0x76,0x9f,0x4, 0x7a,0xb3,0x76,0x9f,0xa5,0xbe,0x7d,0x3, 0x75,0x1a,0x7c, +0x7c,0xb7,0x22,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30, +0x75,0x1e,0x1, 0x74,0x1, 0x7a,0xb3,0x77,0xe1,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, +0x6, 0x22,0x30,0x1a,0x23,0xc2,0x1a,0xd2,0x1c,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x2, +0x74,0x1, 0x68,0x5, 0x12,0x5, 0x30,0x80,0x3, 0x12,0x35,0x1, 0x7e,0x34,0x0, 0x1, +0x12,0x3b,0xd2,0xe5,0x1e,0x2, 0x3b,0xdd,0x30,0x1d,0x2c,0xc2,0x1d,0xc2,0x1c,0x12, +0x3b,0x69,0x5e,0x34,0x0, 0x2, 0x74,0x1, 0x68,0x5, 0x12,0x5, 0xbc,0x80,0x3, 0x12, +0x35,0x1, 0x7e,0xb3,0x77,0xd9,0xb4,0x1, 0x7, 0x7e,0x34,0x0, 0x2, 0x12,0x3b,0xd2, +0xe5,0x1e,0x12,0x3b,0xdd,0x80,0x7, 0x30,0x1c,0x4, 0xe5,0x1e,0x70,0x3, 0x2, 0x37, +0x94,0x22,0x7e,0xa1,0x1e,0x74,0x8, 0xa4,0x59,0x35,0x76,0xdc,0x22,0x7c,0xab,0x12, +0x8a,0x26,0x1b,0xa0,0x68,0x12,0x1b,0xa0,0x68,0x13,0x1b,0xa0,0x68,0x14,0x2e,0xa0, +0x3, 0x78,0x12,0x12,0x8f,0x80,0x80,0xd, 0x12,0x8f,0xac,0x80,0x8, 0x12,0x8f,0x99, +0x80,0x3, 0x12,0x8f,0xec,0x2, 0x3c,0x8, 0xe4,0x7a,0xb3,0x77,0x7, 0x6c,0xaa,0x80, +0xd, 0x12,0xd6,0xc9,0x2e,0xb3,0x77,0x7, 0x7a,0xb3,0x77,0x7, 0xb, 0xa0,0x7e,0xb3, +0x76,0xfc,0xbc,0xba,0x38,0xeb,0x22,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x6, 0x5e, +0x34,0x0, 0x1, 0x68,0x18,0x12,0x3b,0x53,0x5e,0x34,0x0, 0x2, 0x68,0x3, 0x12,0xe4, +0x93,0x74,0x3, 0x12,0x3c,0x85,0x74,0x1, 0x12,0x32,0xf7,0x80,0x33,0x12,0x0, 0x26, +0x12,0xe6,0x8a,0x74,0x1, 0x12,0x3c,0x85,0xe4,0x12,0x32,0xf7,0x7e,0xf, 0x78,0x39, +0x2e,0x14,0x0, 0xa, 0xb, 0xa, 0x30,0x4e,0x60,0x10,0x1b,0xa, 0x30,0xe4,0x7a,0xb3, +0x77,0xd8,0x12,0x3c,0xf3,0x12,0x3c,0xbe,0x12,0x3f,0x52,0xe4,0x7a,0xb3,0x29,0xff, +0xe5,0x1e,0x2, 0x3b,0xdd,0xbe,0xb0,0x4, 0x50,0x33,0x7e,0x37,0x0, 0x9e,0x5e,0x70, +0xf0,0x7a,0x37,0x0, 0x9e,0xa, 0x3b,0x4e,0x37,0x0, 0x9e,0x7a,0x37,0x0, 0x9e,0x7a, +0x37,0x0, 0xda,0x7e,0x34,0x0, 0x19,0x7e,0x8, 0x0, 0x9e,0x12,0x5b,0x4d,0x7e,0x34, +0x0, 0x19,0x7e,0x8, 0x0, 0xda,0x7e,0x24,0x0, 0x1, 0x2, 0x4, 0x96,0x22,0x5e,0x70, +0xfe,0x1b,0xa, 0x30,0x22,0xca,0x3b,0x12,0xe6,0x81,0x5e,0x34,0x0, 0x1, 0x68,0x10, +0x7f,0x3, 0x12,0x3b,0x53,0x5e,0x34,0x0, 0x2, 0x68,0x13,0x12,0xe4,0x93,0x80,0xe, +0x12,0xe6,0x8a,0x7f,0x3, 0x12,0x3c,0xf7,0x12,0x3c,0xbe,0x12,0x3f,0x52,0xda,0x3b, +0x22,0xc2,0x28,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x22,0xca, +0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0, +0x83,0xc0,0x82,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x80,0x0, 0x68, +0x2c,0xb, 0xa, 0x30,0x5e,0x34,0x80,0x0, 0x68,0x23,0x12,0x3f,0x7c,0x6e,0x70,0x40, +0x1b,0xa, 0x30,0x7e,0xf, 0x78,0x39,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x80,0x1b, +0xa, 0x30,0x12,0x3e,0xd6,0xd2,0xd, 0x12,0x3c,0xf3,0x12,0x3c,0xbe,0x7e,0xf, 0x78, +0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x0, 0x2, 0x68,0x1d,0xb, 0xa, 0x30,0x5e,0x34, +0x0, 0x2, 0x68,0x14,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x2, 0x1b,0xa, 0x30,0x12, +0x3e,0xd6,0x12,0x3c,0xf3,0x12,0x3c,0xbe,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, +0x5e,0x34,0x0, 0x1, 0x68,0x20,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x1, 0x68,0x17,0xb, +0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x12,0x3f,0x3c,0x12,0x3c,0xf3, +0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34, +0x0, 0x8, 0x68,0x17,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x8, 0x68,0xe, 0xb, 0x15,0xb, +0xa, 0x30,0x4e,0x70,0x8, 0x1b,0xa, 0x30,0x12,0x3f,0x1a,0x7e,0xf, 0x78,0x39,0x69, +0x30,0x0, 0x4, 0x5e,0x34,0x0, 0x4, 0x68,0x17,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x4, +0x68,0xe, 0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x12,0x3e,0xff, +0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x40,0x0, 0x68,0x31,0xb, 0xa, +0x30,0x5e,0x34,0x40,0x0, 0x68,0x28,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0xd2,0xc, 0x7e,0xb3,0x77,0xd5,0xbe,0xb0,0xc8,0x50,0x5, 0x4, 0x7a,0xb3, +0x77,0xd5,0x7e,0xb3,0x77,0xd5,0xb4,0x1, 0x6, 0x12,0x28,0x7c,0x12,0x3e,0xe7,0x7e, +0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x20,0x0, 0x68,0x19,0xb, 0xa, 0x30, +0x5e,0x34,0x20,0x0, 0x68,0x10,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x20,0x1b,0xa, +0x30,0xd2,0xc, 0x12,0x3e,0xe7,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34, +0x10,0x0, 0x68,0x26,0xb, 0xa, 0x30,0x7d,0x23,0x5e,0x24,0x10,0x0, 0x68,0x1b,0x5e, +0x34,0x8, 0x0, 0x2e,0x34,0xff,0xff,0x92,0x12,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60, +0x8, 0x1b,0xa, 0x30,0x12,0xd3,0x70,0x12,0xd4,0x6d,0x7e,0xf, 0x78,0x39,0x69,0x30, +0x0, 0x4, 0x5e,0x34,0x0, 0x40,0x68,0x29,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x40,0x68, +0x20,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x40,0x1b,0xa, 0x30,0x7e,0x1f,0x78,0x39, +0x69,0x31,0x0, 0xa, 0x5e,0x34,0xf, 0xc0,0x12,0x2f,0xae,0x1e,0x34,0x7a,0x73,0x77, +0xd8,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda, +0x5b,0xda,0x6b,0xda,0x7b,0x32,0xd2,0xb, 0xd2,0x10,0x12,0x3b,0x69,0x5e,0x34,0x0, +0x1, 0x78,0x3, 0x2, 0x3f,0x10,0x22,0x30,0x28,0x14,0xa9,0xd2,0xea,0xa9,0xc2,0xea, +0x12,0x6c,0x9b,0x12,0x3c,0xf1,0x12,0x37,0xe1,0xc2,0x27,0x2, 0x3f,0x2b,0x22,0xd2, +0xe, 0xd2,0x10,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x2, 0x68,0x3, 0x2, 0x3f,0x10,0x22, +0x12,0xb, 0xb0,0x20,0x27,0x3, 0x2, 0x3f,0x2b,0x22,0xd2,0xe, 0xd2,0x10,0x12,0x3b, +0x69,0x5e,0x34,0x0, 0x2, 0x78,0x3, 0x2, 0x3f,0x10,0x22,0x12,0xb, 0xe5,0x12,0xd3, +0xaf,0x74,0x2, 0x7a,0xb3,0x77,0x0, 0x7a,0xb3,0x77,0x1, 0x22,0xd2,0xb, 0xd2,0x10, +0x12,0x3b,0x69,0x5e,0x34,0x0, 0x1, 0x68,0x8, 0xe4,0x7a,0xb3,0x77,0xd5,0x2, 0x3f, +0x10,0x22,0x7e,0xf, 0x78,0x39,0x12,0x3f,0x7c,0x12,0x3f,0xde,0x7e,0x70,0x1, 0x12, +0x3f,0x84,0x7e,0x70,0x1, 0x12,0x3f,0xd2,0x7e,0xb3,0x77,0xe1,0x7e,0x70,0x2, 0x12, +0x3f,0xe9,0x12,0x4c,0xff,0x5e,0x70,0xef,0x1b,0xa, 0x30,0x22,0x2e,0x14,0x0, 0xe, +0xb, 0xa, 0x30,0x22,0x12,0x3f,0x8c,0x7e,0xb3,0x77,0xe1,0x22,0x70,0xc, 0x12,0xe5, +0x2f,0x12,0xd, 0x8d,0x12,0x58,0x88,0x2, 0x4, 0x96,0x22,0x12,0x4c,0xff,0x12,0x3f, +0xde,0x7e,0x70,0x2, 0x12,0x3f,0xe9,0x74,0x14,0x12,0xd3,0x1, 0x7e,0xf, 0x78,0x39, +0x12,0x3f,0x7c,0x5e,0x70,0xef,0x12,0x3f,0xe1,0x7e,0x73,0x29,0xb2,0x12,0x3f,0xe9, +0x7e,0xb3,0x77,0xe1,0x7e,0x73,0x29,0xb3,0x12,0x3f,0x84,0x7e,0x73,0x29,0xb4,0x2, +0x3f,0xd2,0x70,0x9, 0x12,0xe5,0x2f,0x12,0x58,0x85,0x2, 0x4, 0x96,0x22,0x4e,0x70, +0x10,0x1b,0xa, 0x30,0x7e,0xb3,0x77,0xe1,0x22,0x70,0xc, 0x12,0xe5,0x2f,0x12,0xc, +0xea,0x12,0x58,0x88,0x2, 0x4, 0x96,0x22,0xca,0x3b,0x7e,0x73,0x6e,0xb3,0x7a,0x73, +0x62,0xb8,0x7e,0x73,0x6e,0xb4,0x7a,0x73,0x62,0xb9,0x7e,0xd3,0x76,0xae,0x7e,0xe3, +0x76,0xa5,0x7e,0xf3,0x76,0xa6,0x7e,0x8, 0x62,0xba,0x7e,0x34,0x0, 0x8, 0xe4,0x12, +0x24,0x34,0x7e,0x34,0x0, 0x20,0xca,0x39,0x7e,0x18,0x76,0xb4,0x7e,0x8, 0x62,0xc2, +0x12,0x24,0xf, 0x1b,0xfd,0x74,0x5, 0x7a,0xb3,0x76,0xae,0xe4,0x7a,0xb3,0x76,0xa5, +0x74,0x2, 0x7a,0xb3,0x76,0xa6,0x6c,0xcc,0x7e,0x34,0x0, 0x2, 0x74,0x2, 0xac,0xbc, +0x59,0x35,0x76,0xb4,0xb, 0xc0,0xbe,0xc0,0x10,0x78,0xf1,0x12,0x2f,0xf7,0x6c,0xcc, +0x4c,0xcc,0x78,0xd, 0x7e,0xb3,0x73,0x25,0x54,0x1, 0xb4,0x1, 0x4, 0x74,0x1, 0x80, +0x12,0xbe,0xc0,0x1, 0x78,0x14,0x7e,0xb3,0x73,0x25,0x54,0x2, 0x1e,0xb0,0xb4,0x1, +0x9, 0x74,0x4, 0x7a,0xb3,0x6e,0xb3,0xe4,0x80,0x34,0xbe,0xc0,0x2, 0x78,0x16,0x7e, +0xb3,0x73,0x25,0x54,0x4, 0x1e,0xb0,0x1e,0xb0,0xb4,0x1, 0x9, 0xe4,0x7a,0xb3,0x6e, +0xb3,0x74,0x1, 0x80,0x19,0xbe,0xc0,0x3, 0x78,0x46,0x7e,0xb3,0x73,0x25,0x54,0x8, +0xc4,0x23,0x54,0x1f,0xb4,0x1, 0x39,0xe4,0x7a,0xb3,0x6e,0xb3,0x74,0x4, 0x7a,0xb3, +0x6e,0xb4,0x7e,0x34,0x21,0x57,0x12,0x29,0xdb,0x12,0x2c,0x73,0x74,0x1f,0x7a,0xb3, +0x73,0x1f,0x12,0x29,0x24,0x7e,0x73,0x77,0xe1,0xa, 0x7, 0x12,0x41,0x5f,0xa, 0x3c, +0x2e,0x37,0x73,0x21,0x2d,0x31,0x9, 0x73,0x4e,0xa8,0xa, 0x2c,0x19,0x72,0x62,0xba, +0xb, 0xc0,0xbe,0xc0,0x4, 0x68,0x2, 0x1, 0x60,0x6c,0xcc,0xa, 0x3c,0x9, 0x73,0x62, +0xba,0x12,0x47,0xbd,0x12,0x41,0x5f,0xa, 0x2c,0x2e,0x27,0x73,0x21,0x2d,0x21,0x19, +0x72,0x4e,0xa8,0xb, 0xc0,0xbe,0xc0,0x4, 0x40,0xe1,0x7e,0x73,0x62,0xb8,0x7a,0x73, +0x6e,0xb3,0x7e,0x73,0x62,0xb9,0x7a,0x73,0x6e,0xb4,0x7a,0xd3,0x76,0xae,0x7a,0xe3, +0x76,0xa5,0x7a,0xf3,0x76,0xa6,0x7e,0x34,0x0, 0x20,0xca,0x39,0x7e,0x18,0x62,0xc2, +0x7e,0x8, 0x76,0xb4,0x12,0x24,0xf, 0x1b,0xfd,0x12,0x2f,0xf7,0xe4,0x7a,0xb3,0x76, +0xab,0x7a,0xb3,0x76,0xaa,0xda,0x3b,0x22,0x7e,0x35,0x28,0x7c,0x67,0xa, 0xf, 0x7e, +0x14,0x2, 0x3c,0xad,0x10,0x22,0xca,0x3b,0x7c,0xf7,0x7c,0xeb,0x75,0x27,0x7, 0x7e, +0x34,0x2, 0x0, 0x7a,0x35,0x2a,0x75,0x2c,0x0, 0x7e,0x34,0x24,0x66,0x7e,0x24,0x0, +0xff,0x7e,0x14,0x62,0xe2,0x7e,0x54,0x2, 0x3c,0x12,0x23,0x67,0x6d,0x66,0x80,0xe, +0x7e,0x34,0x7f,0xff,0x7d,0x26,0x3e,0x24,0x59,0x32,0x10,0x24,0xb, 0x64,0x7e,0x37, +0x73,0x21,0x7d,0x23,0xb, 0x26,0xbd,0x26,0x38,0xe6,0x2e,0x34,0x0, 0x8, 0x12,0x41, +0x5d,0x12,0x43,0xe4,0xe4,0x12,0x24,0x34,0x7e,0xb3,0x78,0x2f,0xb4,0x1, 0xa, 0x7e, +0x37,0x78,0x31,0x12,0x2f,0xb0,0x7a,0x35,0x2a,0x74,0xa, 0xac,0xbe,0x49,0x25,0x29, +0x8c,0x7e,0x35,0x2a,0xad,0x32,0x9, 0xb5,0x29,0x8a,0x60,0xc, 0x1e,0x34,0x1e,0x24, +0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7a,0x35,0x2a,0xe5,0x27,0xa, 0x5b,0x1b, +0x54,0xf5,0x26,0x61,0x4c,0xe5,0x26,0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0x7a,0x35,0x28,0x12,0x2c,0x6f,0xe5,0x26,0xbe,0xb0,0x7, 0x58,0x13,0x6d, +0x66,0x80,0xa, 0x12,0x41,0x58,0x7d,0x21,0x2d,0x26,0x12,0x46,0x26,0x12,0x43,0xeb, +0x38,0xf1,0x6d,0x66,0x12,0x41,0x58,0x7e,0x27,0x73,0x21,0x2d,0x26,0x2d,0x21,0x12, +0x46,0x26,0xbe,0x64,0x0, 0x4, 0x78,0xec,0x7c,0xbe,0x12,0x41,0x5d,0x12,0x43,0xe4, +0x12,0x44,0x0, 0x5, 0x2c,0xe5,0x2c,0x54,0x1, 0xb4,0x1, 0x8, 0x74,0x1, 0x7a,0xb3, +0x78,0x34,0x80,0xe, 0x7e,0x73,0x77,0xd8,0xa, 0x37,0x1e,0x34,0xb, 0x34,0x7a,0x73, +0x78,0x34,0x12,0x36,0xe2,0xe5,0x26,0xbe,0xb0,0x7, 0x58,0x66,0x6d,0x66,0x80,0x5d, +0x7d,0x56,0x3e,0x54,0x49,0x35,0xc, 0x18,0x7d,0x43,0x12,0x45,0xe6,0x8, 0x7, 0x7d, +0x23,0x9e,0x25,0x2a,0x80,0x4, 0x6d,0x22,0x9d,0x24,0x7a,0x25,0x2d,0x49,0x25,0x10, +0x24,0x7d,0x42,0x12,0x45,0xe6,0x8, 0x5, 0x9e,0x25,0x2a,0x80,0x4, 0x6d,0x22,0x9d, +0x24,0x7a,0x25,0x2f,0xbe,0x25,0x2d,0x40,0x13,0x59,0x35,0x10,0x24,0x12,0x41,0x5d, +0x7d,0x21,0x2d,0x26,0x9, 0x52,0x4e,0xa8,0x19,0x56,0x62,0xe2,0xbe,0x35,0x2a,0x50, +0xa, 0x12,0x43,0xf2,0x7d,0x23,0x2d,0x26,0x12,0x46,0x19,0xb, 0x64,0x12,0x43,0xeb, +0x38,0x9e,0x6d,0x66,0x7e,0x17,0x73,0x21,0x2d,0x16,0x7d,0x51,0x3e,0x54,0x49,0x5, +0xc, 0x18,0x7d,0x30,0x12,0x45,0xde,0x8, 0x7, 0x7d,0x40,0x9e,0x45,0x2a,0x80,0x4, +0x6d,0x44,0x9d,0x43,0x7a,0x45,0x2d,0x49,0x45,0x10,0x24,0x7d,0x34,0x12,0x45,0xde, +0x8, 0x5, 0x9e,0x45,0x2a,0x80,0x4, 0x6d,0x44,0x9d,0x43,0x7a,0x45,0x2f,0xbe,0x45, +0x2d,0x40,0x11,0x59,0x5, 0x10,0x24,0x12,0x43,0xf7,0x2d,0x31,0x9, 0x73,0x4e,0xa8, +0x19,0x71,0x62,0xe2,0xbe,0x5, 0x2a,0x50,0xa, 0x12,0x43,0xf2,0x7d,0x23,0x2d,0x21, +0x12,0x46,0x19,0xb, 0x64,0xbe,0x64,0x0, 0x4, 0x78,0x99,0x30,0xb, 0x2, 0x61,0xe1, +0x30,0xc, 0x2, 0x61,0xe1,0x30,0xe, 0x2, 0x61,0xe1,0x15,0x26,0xe5,0x26,0xbe,0xb0, +0x1, 0x48,0x2, 0x21,0xf5,0x7e,0xb3,0x76,0x9c,0xbe,0xb0,0x2, 0x68,0x6f,0x12,0x47, +0xed,0x68,0x6a,0x7e,0x8, 0x10,0x24,0x74,0xa, 0xac,0xbe,0x12,0x8c,0x9d,0x6d,0x66, +0x80,0x25,0x7d,0x26,0x3e,0x24,0x49,0x32,0x10,0x24,0xbe,0x34,0x3, 0xe8,0x28,0x15, +0xbe,0x34,0x3e,0x80,0x50,0xf, 0x9, 0x76,0x62,0xe2,0x12,0x41,0x5d,0x7d,0x21,0x2d, +0x26,0x19,0x72,0x4e,0xa8,0xb, 0x64,0x12,0x43,0xeb,0x38,0xd6,0x6d,0x66,0x7e,0x27, +0x73,0x21,0x2d,0x26,0x7d,0x12,0x3e,0x14,0x49,0x31,0x10,0x24,0xbe,0x34,0x3, 0xe8, +0x28,0x13,0xbe,0x34,0x3e,0x80,0x50,0xd, 0x9, 0x72,0x62,0xe2,0x12,0x41,0x5d,0x2d, +0x21,0x19,0x72,0x4e,0xa8,0xb, 0x64,0xbe,0x64,0x0, 0x4, 0x78,0xd1,0x74,0x1, 0x7a, +0xb3,0x78,0x34,0x7c,0xbe,0x12,0x41,0x5d,0x12,0x43,0xe4,0x12,0x44,0x0, 0x12,0x47, +0xde,0xda,0x3b,0x22,0x2e,0x14,0x4e,0xa8,0x6d,0x0, 0x22,0x7e,0x37,0x73,0x21,0xbd, +0x36,0x22,0x7e,0x55,0x28,0x64,0xff,0xa, 0x2f,0x7e,0x34,0x2, 0x3c,0xad,0x32,0x22, +0xca,0x3b,0x7f,0x30,0x7c,0xab,0xbe,0xa0,0x4, 0x40,0x2, 0xa1,0xaa,0x74,0x27,0xa4, +0x9, 0xb5,0x28,0xea,0xf5,0x37,0xe4,0x12,0x35,0x28,0x7e,0xf7,0x6e,0xb5,0x7e,0xe7, +0x6e,0xb7,0x2d,0xef,0x7a,0xe5,0x35,0x7e,0x8, 0x65,0x1e,0x12,0x64,0xb8,0x7e,0xb3, +0x6e,0xc1,0x60,0x62,0x6d,0xee,0x80,0x2e,0x7e,0xe5,0x31,0x3e,0xe4,0x49,0x3e,0x6e, +0xc2,0x7a,0x35,0x33,0x7f,0x3, 0x2e,0x15,0x31,0x7e,0xb, 0x50,0x19,0x53,0x2, 0xae, +0x12,0x45,0xd3,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x2f,0xb0,0x3e,0x34,0x2e, +0x34,0x65,0x42,0x12,0x45,0xad,0x7a,0xe5,0x31,0xbe,0xf5,0x31,0x38,0xca,0x7a,0xf5, +0x31,0x80,0x19,0x12,0x45,0xbb,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x2f,0xb0, +0x3e,0x34,0x2e,0x34,0x65,0x1e,0x12,0x45,0xad,0x7a,0xe5,0x31,0x7e,0xe5,0x35,0xbe, +0xe5,0x31,0x38,0xdf,0x80,0x67,0x6d,0xee,0x80,0x16,0x12,0x45,0xbb,0x60,0x5, 0x3e, +0x24,0x14,0x78,0xfb,0x12,0x2f,0xb0,0x3e,0x34,0x2e,0x34,0x65,0x1e,0x12,0x45,0xad, +0x7a,0xe5,0x31,0xbe,0xf5,0x31,0x38,0xe2,0x7a,0xf5,0x31,0x80,0x38,0x7e,0x35,0x31, +0x3e,0x34,0x49,0x23,0x6e,0xc2,0x7a,0x25,0x33,0x7f,0x3, 0x2e,0x15,0x31,0x7e,0xb, +0x70,0x19,0x72,0x2, 0xae,0x7d,0x52,0x12,0x64,0x78,0x60,0x5, 0x3e,0x14,0x14,0x78, +0xfb,0x12,0x64,0x83,0x3e,0x24,0x2e,0x24,0x65,0x42,0x12,0x47,0xf5,0x7e,0x35,0x31, +0xb, 0x34,0x7a,0x35,0x31,0x7e,0x35,0x35,0xbe,0x35,0x31,0x38,0xc0,0x7e,0x45,0x35, +0x12,0x46,0xd, 0x7a,0x73,0x1, 0x94,0x12,0x46,0x35,0x7a,0xb3,0x1, 0x95,0x12,0x45, +0xee,0x7a,0xb3,0x1, 0x96,0xb, 0x44,0x12,0x46,0xd, 0x7a,0x73,0x2, 0xae,0x12,0x46, +0x35,0x7a,0xb3,0x2, 0xaf,0x12,0x45,0xee,0x7a,0xb3,0x2, 0xb0,0x7e,0xb3,0x6e,0xb3, +0x54,0x5, 0xa, 0x3b,0x4e,0x37,0x65,0x1e,0x7a,0x37,0x65,0x1e,0x7e,0xb3,0x6e,0xb4, +0x54,0x5, 0xa, 0x3b,0x4e,0x37,0x65,0x42,0x7a,0x37,0x65,0x42,0x12,0x46,0x1, 0x2e, +0x74,0x0, 0x16,0x7d,0x37,0x7e,0x8, 0x65,0x1e,0x12,0x47,0xd0,0x7d,0x37,0x7e,0x8, +0x65,0x42,0x12,0x47,0xd7,0x12,0x46,0x1, 0x2e,0x74,0x0, 0x28,0x6d,0x33,0x7a,0x35, +0x31,0x7e,0x35,0x31,0x9, 0x53,0x1, 0x95,0x7c,0x25,0x6c,0x33,0x9, 0x53,0x1, 0x94, +0x12,0x46,0x45,0x40,0xec,0x12,0x45,0xf6,0x12,0x3, 0xfa,0x6d,0x33,0x7a,0x35,0x31, +0x7e,0x35,0x31,0x9, 0x53,0x2, 0xaf,0x7c,0x25,0x6c,0x33,0x9, 0x53,0x2, 0xae,0x12, +0x46,0x45,0x40,0xec,0x12,0x45,0xf6,0x12,0x4, 0x96,0xda,0x3b,0x22,0xb, 0x38,0xe0, +0x4d,0xe2,0x1b,0x38,0xe0,0x7e,0xe5,0x31,0xb, 0xe4,0x22,0x7e,0xe5,0x31,0x3e,0xe4, +0x49,0x3e,0x6e,0xc2,0x7a,0x35,0x33,0x7f,0x3, 0x2e,0x15,0x31,0x7e,0xb, 0x50,0x19, +0x53,0x1, 0x94,0x7d,0x53,0x5e,0x54,0x0, 0xf, 0x7e,0x24,0x0, 0x1, 0x22,0x9e,0x35, +0x2a,0xbe,0x34,0x0, 0x0, 0x22,0x9e,0x45,0x2a,0xbe,0x44,0x0, 0x0, 0x22,0x7c,0xba, +0x54,0xf0,0xc4,0x54,0xf, 0x22,0x7d,0x37,0x7e,0x8, 0x65,0x66,0x7e,0x24,0x0, 0x8d, +0x22,0x7e,0xf1,0x37,0x74,0xb5,0xac,0xfb,0x2e,0x74,0x1, 0x0, 0x22,0x7d,0x54,0xb, +0x44,0x7f,0x13,0x2d,0x35,0x7e,0x1b,0x70,0x22,0x2e,0x24,0x4e,0xa8,0x7e,0x29,0x70, +0x5c,0x7b,0x7a,0x29,0x70,0x22,0x2e,0x24,0x4e,0xa8,0x7e,0x29,0x70,0x4c,0x76,0x7a, +0x29,0x70,0xb, 0x64,0x22,0x7f,0x13,0x2d,0x34,0x7e,0x1b,0xa0,0x7c,0xba,0x54,0xf, +0x3e,0xb0,0x3e,0xb0,0x22,0xa, 0x25,0x2d,0x21,0x7d,0x13,0x1e,0x14,0x3e,0x14,0x59, +0x21,0x65,0x66,0xb, 0x35,0x7a,0x35,0x31,0xbe,0x34,0x1, 0x1a,0x22,0x7e,0xb3,0x74, +0x7e,0x7c,0xab,0x6c,0x77,0xbc,0xa7,0x78,0x2b,0x12,0x47,0xbd,0x12,0x41,0x5f,0x12, +0x46,0xf4,0x59,0x2, 0x74,0x94,0x7e,0x8, 0x14,0x30,0x59,0x12,0x74,0x9e,0x59,0x2, +0x74,0x9c,0x7e,0x8, 0x18,0x3c,0x59,0x12,0x74,0xa2,0x59,0x2, 0x74,0xa0,0x7e,0x8, +0x1c,0x48,0x80,0x4e,0x7e,0x50,0x4, 0xac,0x5a,0xa, 0x17,0x2d,0x21,0x2e,0x24,0x24, +0x46,0x12,0xc5,0x13,0x7c,0x6b,0x7e,0xb3,0x77,0xe1,0xa, 0xb, 0x12,0x41,0x5f,0x12, +0x46,0xf4,0x59,0x2, 0x74,0x94,0xa, 0x6, 0x7e,0x14,0xc, 0x24,0xad,0x10,0x7d,0xf1, +0x2e,0xf4,0x2a,0x0, 0x6d,0xee,0x59,0xf2,0x74,0x9e,0x59,0xe2,0x74,0x9c,0x7d,0xf1, +0x2e,0xf4,0x2e,0xc, 0x59,0xf2,0x74,0xa2,0x59,0xe2,0x74,0xa0,0x2e,0x14,0x32,0x18, +0x6d,0x0, 0x59,0x12,0x74,0xa6,0x59,0x2, 0x74,0xa4,0xb, 0x70,0xbe,0x70,0x3, 0x50, +0x2, 0xc1,0x65,0x22,0x2e,0x14,0x4e,0xa8,0x6d,0x0, 0x7e,0x50,0x26,0xac,0x57,0x59, +0x12,0x74,0x92,0x59,0x2, 0x74,0x90,0x7e,0x8, 0x57,0x98,0x59,0x12,0x74,0x9a,0x59, +0x2, 0x74,0x98,0x7e,0x8, 0x55,0x5c,0x59,0x12,0x74,0x96,0x22,0x12,0xe6,0xa5,0x12, +0x47,0xbd,0x12,0x41,0x5f,0x7d,0x21,0x2e,0x24,0x4e,0xa8,0x7a,0x27,0x4a,0x6f,0x6d, +0x22,0x7a,0x27,0x4a,0x61,0x7e,0x24,0x6e,0xc2,0x7a,0x27,0x4a,0x6b,0x7e,0x24,0x0, +0x27,0xca,0x29,0x12,0xe5,0x39,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, 0x2, 0xca, +0x39,0x7e,0x63,0x77,0xe1,0xac,0x67,0x2e,0x34,0x29,0x82,0x6d,0x22,0x7e,0x8, 0x76, +0xa5,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0xa3,0x77,0xe1,0x74,0xa, 0xa4,0x49,0x35,0x29, +0x8e,0x7a,0x37,0x76,0xb2,0x7e,0xb3,0x77,0xe1,0x12,0xd8,0x75,0x7e,0xb3,0x77,0xe1, +0x12,0xd8,0x46,0x7e,0xb3,0x77,0xe1,0x12,0x58,0x67,0x12,0x47,0xc8,0x9, 0x75,0x29, +0xb2,0x7a,0x73,0x76,0x9c,0x12,0x47,0xc8,0x9, 0x75,0x29,0xb3,0x7a,0x73,0x76,0x9d, +0x12,0x47,0xc8,0x9, 0x75,0x29,0xb4,0x7a,0x73,0x76,0x9e,0x7e,0x73,0x77,0xe1,0x7a, +0x73,0x76,0xac,0x2, 0x47,0xb6,0xe5,0x1e,0x7a,0xb3,0x76,0x88,0x22,0x7e,0x63,0x77, +0xe1,0xa, 0x6, 0x22,0x7e,0x8, 0x0, 0x70,0x7e,0xa3,0x77,0xe1,0x74,0x3, 0xa4,0x22, +0x7e,0x24,0x0, 0x12,0x2, 0x3, 0xfa,0x7e,0x24,0x0, 0x12,0x2, 0x4, 0x96,0xe4,0x7a, +0xb3,0x77,0xe6,0x2, 0x47,0xe6,0x6d,0x33,0x7a,0x37,0x29,0xfd,0x22,0x7e,0xb3,0x76, +0xaa,0xbe,0xb0,0x1, 0x22,0xb, 0x28,0x30,0x4d,0x31,0x1b,0x28,0x30,0x22,0x7c,0x6b, +0xa5,0xbe,0xfa,0x4, 0x7a,0x73,0x4a,0x66,0xa5,0xbe,0x0, 0x7, 0x7c,0xb7,0x12,0x70, +0x1b,0x61,0xea,0xa5,0xbe,0xf, 0xd, 0x74,0x1, 0x7a,0xb3,0x76,0x8b,0x7a,0xb3,0x76, +0x8c,0xd2,0x22,0x22,0xa5,0xbe,0x2e,0xd, 0x74,0x1, 0x7a,0xb3,0x76,0xaa,0x7a,0xb3, +0x76,0xab,0xd2,0x22,0x22,0xa5,0xbe,0x12,0x5, 0x7a,0x73,0x76,0x8e,0x22,0xa5,0xbe, +0x11,0x25,0xa5,0xbf,0x1, 0x16,0x7e,0xb3,0x76,0x8d,0x60,0x2, 0x81,0x9, 0x74,0x1, +0x7a,0xb3,0x76,0x8d,0xe4,0x7a,0xb3,0x76,0x8f,0x2, 0x52,0x91,0xa5,0xbf,0x0, 0x2, +0x80,0x2, 0x81,0x9, 0x2, 0xe6,0xa5,0xbe,0x60,0x99,0x68,0x4, 0xa5,0xbe,0x9a,0x1d, +0x7e,0xa3,0x4a,0x67,0x7c,0xba,0x4, 0x7a,0xb3,0x4a,0x67,0xa, 0x2a,0x19,0x72,0x4e, +0x85,0xa5,0xbe,0x9a,0x2, 0x80,0x2, 0x81,0x9, 0x75,0x1a,0x99,0x22,0xa5,0xbe,0x9b, +0x9, 0x7a,0x73,0x4a,0x67,0x7a,0x73,0x4a,0x65,0x22,0xa5,0xbe,0x1, 0x11,0x6d,0x22, +0x7a,0x27,0x4a,0x63,0x7a,0x73,0x76,0x7d,0x7c,0xb7,0x12,0x66,0xf, 0x61,0xea,0xbe, +0x60,0x5b,0x28,0x2, 0x41,0xe3,0xa5,0xbe,0x30,0x11,0x7e,0x53,0x76,0xac,0xbc,0x57, +0x78,0x2, 0x81,0x9, 0xbe,0x70,0x4, 0x40,0x2, 0x81,0x9, 0xbe,0x60,0x20,0x40,0xc, +0xbe,0x60,0x22,0x38,0x7, 0xbe,0x70,0x3, 0x28,0x2, 0x81,0x9, 0x7c,0xb6,0x24,0xf9, +0xbe,0xb0,0x29,0x40,0x2, 0x21,0x6a,0x7e,0xa0,0x3, 0xa4,0x90,0x48,0xef,0x73,0x2, +0x4c,0x9, 0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x4c,0x9, 0x2, 0x4c, +0x9, 0x2, 0x4c,0x9, 0x2, 0x4c,0x9, 0x2, 0x49,0x6a,0x2, 0x4c,0x9, 0x2, 0x49,0x6a, +0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, +0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49, +0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a, +0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, +0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x4c,0x9, 0x2, 0x4c, +0x9, 0x2, 0x4c,0x9, 0x2, 0x49,0x6a,0x2, 0x4c,0x9, 0xa, 0x26,0x19,0x72,0x76,0x7c, +0x7c,0xb6,0x1b,0xb2,0xbe,0xb0,0x34,0x40,0x2, 0x41,0xa5,0x7e,0xa0,0x3, 0xa4,0x90, +0x49,0x83,0x73,0x2, 0x4a,0x1f,0x2, 0x4a,0xa5,0x2, 0x4a,0x1f,0x2, 0x4a,0xa5,0x2, +0x4a,0x23,0x2, 0x4a,0x1f,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a, +0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5, +0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, +0x4a,0xa5,0x2, 0x4a,0x6b,0x2, 0x4a,0xa5,0x2, 0x4a,0x78,0x2, 0x4a,0xa5,0x2, 0x4a, +0x8b,0x2, 0x4a,0x1f,0x2, 0x4a,0x1f,0x2, 0x4a,0x28,0x2, 0x4a,0x28,0x2, 0x4a,0x28, +0x2, 0x4a,0xa5,0x2, 0x4a,0x9a,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, +0x4a,0x31,0x2, 0x4a,0x31,0x2, 0x4a,0x31,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a, +0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0x1f,0x2, 0x4a,0x3a,0x2, 0x4a,0x43, +0x2, 0x4a,0x4c,0x2, 0x4a,0x55,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0x5e,0xd2, +0x22,0x41,0xa5,0x12,0x0, 0xfd,0x80,0x7d,0x7e,0x27,0x4a,0x6d,0x4e,0x40,0x20,0x80, +0x34,0x7e,0x27,0x4a,0x6d,0x4e,0x40,0x1, 0x80,0x2b,0x7e,0x27,0x4a,0x6d,0x4e,0x50, +0x1, 0x80,0x22,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x2, 0x80,0x19,0x7e,0x27,0x4a,0x6d, +0x4e,0x50,0x4, 0x80,0x10,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x8, 0x80,0x7, 0x7e,0x27, +0x4a,0x6d,0x4e,0x50,0x10,0x7a,0x27,0x4a,0x6d,0x80,0x3a,0x7e,0x53,0x76,0x94,0x12, +0x4c,0xa, 0x7a,0x27,0x4a,0x61,0x80,0x2d,0x7e,0x53,0x76,0x96,0x12,0x4c,0xa, 0x3e, +0x24,0x7a,0x27,0x4e,0x7d,0x7a,0x27,0x4a,0x69,0x80,0x1a,0x7e,0x53,0x76,0x98,0x12, +0x4c,0xa, 0x3e,0x24,0x7a,0x27,0x4a,0x63,0x80,0xb, 0x7e,0x53,0x76,0x9f,0x12,0x4c, +0xa, 0x7a,0x53,0x77,0xd6,0xbe,0x60,0x38,0x40,0x14,0xbe,0x60,0x56,0x38,0xf, 0xa, +0x26,0x5e,0x24,0x0, 0x1, 0xbe,0x24,0x0, 0x1, 0x78,0x3, 0x12,0xe5,0xe6,0xbe,0x60, +0x58,0x40,0xb, 0x7e,0x27,0x4a,0x6d,0x4e,0x40,0x2, 0x7a,0x27,0x4a,0x6d,0xa5,0xbe, +0xa, 0x2, 0x80,0x2, 0x61,0xea,0x7e,0x37,0x4a,0x6d,0x4e,0x60,0x4, 0x7a,0x37,0x4a, +0x6d,0x61,0xea,0xbe,0x60,0x6c,0x68,0x4, 0xa5,0xbe,0x6d,0x2b,0x7e,0x27,0x4a,0x6d, +0x4e,0x50,0x80,0x7a,0x27,0x4a,0x6d,0x7e,0x27,0x4a,0x69,0x7d,0x12,0xb, 0x14,0x7a, +0x17,0x4a,0x69,0x2e,0x27,0x4a,0x6b,0x7a,0x29,0x70,0xa5,0xbe,0x6d,0x2, 0x80,0x2, +0x61,0xea,0x75,0x1a,0x6c,0x61,0xea,0xbe,0x60,0x6e,0x68,0x4, 0xa5,0xbe,0x6f,0x43, +0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x40,0x7a,0x27,0x4a,0x6d,0x7e,0x43,0x76,0x94,0x6c, +0x55,0x7e,0xb3,0x76,0x95,0xa, 0x1b,0x2d,0x12,0x4, 0x7a,0xb3,0x76,0x95,0x70,0x9, +0x7e,0xb3,0x76,0x94,0x4, 0x7a,0xb3,0x76,0x94,0x7a,0x17,0x4a,0x61,0x7e,0x27,0x4a, +0x6f,0x2d,0x21,0x7a,0x29,0x70,0xa5,0xbe,0x6f,0x2, 0x80,0x2, 0x61,0xea,0x75,0x1a, +0x6e,0x61,0xea,0xbe,0x60,0x70,0x40,0xc, 0xbe,0x60,0x7f,0x38,0x7, 0x7c,0xb6,0x12, +0x60,0x17,0x80,0x76,0xa5,0xbe,0x86,0xf, 0x7c,0xb7,0x54,0x7, 0x7a,0xb3,0x4a,0x68, +0x53,0xc3,0xf8,0x42,0xc3,0x80,0x63,0xa5,0xbe,0x87,0xf, 0x7c,0xb7,0x54,0x3, 0x7a, +0xb3,0x4a,0x60,0x53,0xc2,0xfc,0x42,0xc2,0x80,0x50,0xa5,0xbe,0x88,0x29,0x5e,0x70, +0x7, 0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x10,0xb, 0xa, 0x20,0x5e,0x40,0xc7,0x1b, +0xa, 0x20,0xa, 0x37,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x12,0x4c,0x18,0x12,0x4c,0xff, +0x4d,0x32,0x1b,0xa, 0x30,0x80,0x23,0xa5,0xbe,0xf6,0x13,0x7a,0x73,0x78,0x2f,0xa5, +0xbf,0x0, 0x3, 0xe4,0x80,0x2, 0x74,0x1, 0x7a,0xb3,0x78,0x30,0x80,0xc, 0xa5,0xbe, +0xf7,0x8, 0x74,0x64,0xac,0xb7,0x7a,0x57,0x78,0x31,0x30,0x22,0xa, 0x7e,0xb3,0x76, +0x8a,0x44,0x1, 0x7a,0xb3,0x76,0x8a,0x7e,0x37,0x4a,0x6d,0x4d,0x33,0x68,0xa, 0x7e, +0xb3,0x76,0x8a,0x44,0x2, 0x7a,0xb3,0x76,0x8a,0x22,0x7c,0x25,0x6c,0x33,0xa, 0x27, +0x2d,0x21,0x22,0xb, 0x18,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0x7e, +0x34,0x76,0xa, 0x30,0x23,0x60,0xc2,0x23,0x7e,0x39,0x50,0xa, 0x25,0x12,0x4c,0x16, +0x3e,0x24,0x7a,0x27,0x6e,0x8b,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x12,0x4c,0x16,0x3e, +0x24,0x7a,0x27,0x6e,0x8d,0x7e,0xb3,0x76,0x8, 0xb4,0x3, 0x15,0x9, 0xa3,0x0, 0x3, +0xa, 0x2a,0x12,0x4c,0x16,0x3e,0x24,0x7a,0x27,0x6e,0x93,0x19,0xa3,0x0, 0x2, 0x80, +0x16,0xb4,0x2, 0x13,0x9, 0x53,0x0, 0x2, 0xa, 0x15,0x12,0x4f,0xef,0x3e,0x14,0x7a, +0x17,0x6e,0x93,0x19,0x53,0x0, 0x3, 0x9, 0x73,0x0, 0x5, 0x12,0x33,0xd0,0x3e,0x34, +0x3e,0x34,0x7a,0x37,0x6e,0x9b,0x7e,0x37,0x6e,0x8b,0x7a,0x37,0x76,0x7a,0x4d,0x33, +0x78,0xb, 0x7e,0x34,0x21,0x5b,0x12,0x29,0xdb,0x7a,0x37,0x76,0x7a,0x22,0x7c,0x67, +0x7c,0x7b,0xa5,0xbf,0x0, 0xd, 0xbe,0x60,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0x6e,0x83, +0x2, 0xb9,0x98,0xa5,0xbe,0x0, 0x17,0x6c,0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50, +0x9, 0xac,0x5a,0x19,0x62,0x6d,0xcc,0xb, 0xa0,0x12,0x4c,0xf7,0x38,0xed,0x6c,0xaa, +0x80,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x6d,0x14,0x12,0x4c,0x13,0x1b,0x18, +0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x6d,0x16,0x12,0x4c,0x13,0x1b,0x18,0x20, +0xb, 0xa0,0xbc,0x7a,0x38,0xdc,0x22,0x90,0x21,0x51,0xe4,0x93,0xbc,0xba,0x22,0x7e, +0xf, 0x78,0x39,0x2e,0x14,0x0, 0x10,0xb, 0xa, 0x30,0x22,0x30,0x0, 0x5, 0x43,0xc3, +0x80,0x80,0x3, 0x53,0xc3,0x7f,0x30,0x0, 0x5, 0x43,0xc2,0x80,0x80,0x3, 0x53,0xc2, +0x7f,0x7e,0xf, 0x78,0x39,0x30,0x0, 0x8, 0x12,0x4d,0x3, 0x4e,0x60,0xc4,0x80,0x6, +0x12,0x4d,0x3, 0x5e,0x60,0x3b,0x1b,0xa, 0x30,0x22,0x12,0x4e,0x57,0x12,0x4f,0xc4, +0x12,0x4d,0xa5,0x12,0x4d,0x5e,0xa9,0xd6,0xeb,0x74,0x1, 0x7e,0x70,0x82,0x12,0x4d, +0xc1,0xa9,0xc6,0xeb,0xd2,0x0, 0x12,0x4d,0x5e,0xd2,0x0, 0x2, 0x4d,0xb, 0xa9,0xd0, +0xce,0x30,0x0, 0x4, 0xa9,0xd5,0xc9,0x22,0xa9,0xc5,0xc9,0x22,0x12,0x4e,0x92,0x40, +0x6, 0x12,0x4e,0x87,0x12,0x0, 0x12,0x12,0x4d,0xa5,0x12,0x4d,0xad,0x80,0xb, 0x7e, +0xb3,0x76,0x5a,0x60,0x2, 0x80,0x0, 0x12,0x4e,0x38,0x30,0x14,0xf2,0x7e,0xb3,0x77, +0xdd,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a,0xb3,0x77,0xdd,0xd2,0x0, 0x12,0x4d,0xad, +0xd2,0x0, 0x2, 0x4d,0xb, 0xc2,0x0, 0x12,0x4d,0xb, 0xc2,0x0, 0x22,0xa2,0x0, 0xa9, +0x92,0xcb,0xa2,0x0, 0xa9,0x92,0xca,0xa2,0x0, 0xa9,0x91,0xcb,0x22,0xe4,0x7e,0x70, +0xff,0x7c,0x6b,0x7e,0xb3,0x77,0xd7,0xb4,0x81,0x68,0xa5,0xbe,0x0, 0x2, 0x80,0x5c, +0xa5,0xbe,0x1, 0x22,0xc2,0xaf,0xa, 0x27,0x5e,0x24,0x0, 0x2, 0x68,0x2, 0xd2,0x95, +0x7a,0x71,0xcd,0xa9,0xd0,0xce,0xa9,0xc6,0xc9,0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9, +0xd1,0x87,0xd2,0xaf,0x80,0x36,0xa5,0xbe,0x2, 0x18,0x12,0x4e,0x7d,0x70,0xf, 0xa9, +0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd0,0xce,0xa9,0xd6,0xc9,0xa9,0xd1,0x87,0xd2,0xaf, +0x80,0x1a,0xa5,0xbe,0x3, 0x1c,0x12,0x4e,0x7d,0x70,0xf, 0xa9,0xd0,0xce,0xa9,0xd7, +0xc9,0xa9,0xd0,0xce,0xa9,0xc6,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe4,0x7a,0xb3,0x77,0xd7,0x22,0x80,0xe, 0x12,0x4e,0x57,0x12,0x4e,0x92, +0x40,0x14,0x20,0x14,0x11,0x12,0x4d,0xbd,0x12,0x4e,0x82,0x70,0xed,0x12,0x4e,0x57, +0x12,0x4f,0xcf,0x2, 0x4d,0xc1,0x22,0x74,0x81,0x7a,0xb3,0x77,0xd7,0x22,0x80,0xe, +0x12,0x4e,0x57,0x12,0x4e,0x92,0x40,0x14,0x20,0x14,0x11,0x12,0x4d,0xbd,0x12,0x4e, +0x82,0x70,0xed,0x12,0x4e,0x57,0x12,0x4f,0xcf,0x2, 0x4d,0xc1,0x22,0xc2,0xaf,0x7a, +0x71,0xcd,0xa2,0x93,0xe4,0x33,0x22,0x80,0x3, 0x12,0x4e,0x5e,0x12,0x4e,0x92,0x50, +0xf8,0x22,0x30,0xb, 0x3, 0x12,0x3e,0xe7,0x7e,0xb3,0x77,0x0, 0x70,0x6, 0x7e,0xb3, +0x77,0x1, 0x60,0x2, 0xd3,0x22,0xc3,0x22,0x20,0x14,0x6, 0x12,0x4f,0xbb,0x12,0x0, +0x12,0x30,0x1c,0x3, 0x12,0x37,0x94,0x12,0x4e,0x92,0x40,0x6, 0x12,0x4e,0x87,0x2, +0x0, 0x12,0x22,0x30,0x22,0x76,0xc2,0x22,0x12,0x29,0x8c,0xd2,0x4, 0x12,0x36,0xe7, +0x7e,0x73,0x76,0xac,0xbe,0x73,0x77,0xe1,0x68,0x7, 0x7a,0x73,0x77,0xe1,0x12,0x28, +0x87,0x7e,0xb3,0x76,0x9a,0xbe,0xb3,0x6e,0xb3,0x68,0x14,0x54,0x5, 0x7a,0xb3,0x76, +0x9a,0x7e,0x73,0x76,0x9a,0x7a,0x73,0x6e,0xb3,0x12,0x4f,0xdb,0x12,0x65,0x51,0x7e, +0xb3,0x76,0x9b,0xbe,0xb3,0x6e,0xb4,0x68,0x14,0x54,0x5, 0x7a,0xb3,0x76,0x9b,0x7e, +0x73,0x76,0x9b,0x7a,0x73,0x6e,0xb4,0x12,0x4f,0xdb,0x12,0x65,0x51,0x7e,0xb3,0x76, +0x8a,0x54,0xfe,0x7a,0xb3,0x76,0x8a,0x7e,0xb3,0x76,0x8b,0x60,0x3, 0x12,0x60,0x35, +0x7e,0xb3,0x76,0xaa,0x60,0x3, 0x12,0x3f,0xf8,0x12,0x37,0x94,0x7e,0x37,0x4a,0x6d, +0x4d,0x33,0x68,0x15,0xd2,0x4, 0x12,0x36,0xe7,0x12,0x30,0x10,0x7e,0xb3,0x76,0x8a, +0x54,0xfd,0x7a,0xb3,0x76,0x8a,0x2, 0x37,0x94,0x22,0x12,0xd7,0x16,0xe5,0x1e,0x70, +0x5, 0x12,0x4d,0x6c,0x80,0x3, 0x12,0x4e,0xa8,0x2, 0x4f,0x6c,0x6c,0x77,0x7e,0x30, +0x3b,0x7e,0xa0,0x3c,0x7e,0xb3,0x76,0x2f,0xb4,0x1, 0xf, 0xe5,0x1e,0x60,0xb, 0x7e, +0x23,0x29,0xff,0xbc,0x27,0x78,0x3, 0x12,0xd7,0xf6,0x7e,0xb3,0x76,0x2f,0xb4,0x1, +0x29,0xe5,0x1e,0x60,0x25,0x7e,0xb3,0x29,0xff,0xbc,0xb3,0x78,0x3, 0x12,0xd7,0xd9, +0x7e,0xb3,0x29,0xff,0x7a,0xb3,0x29,0xfc,0x4, 0x7a,0xb3,0x29,0xff,0x7e,0x73,0x29, +0xff,0xbc,0x7a,0x28,0x5, 0xe4,0x7a,0xb3,0x29,0xff,0x22,0x80,0x3, 0x12,0x4e,0x5e, +0x30,0x14,0xfa,0x22,0xd2,0x4, 0x12,0x36,0xe7,0x12,0x4e,0x82,0x70,0xfb,0x22,0xa9, +0xd5,0xea,0xa9,0xc5,0xea,0x74,0x2, 0x7e,0x70,0x7, 0x22,0x7e,0xb3,0x6e,0xb3,0x7e, +0x73,0x6e,0xb4,0x12,0x88,0xe5,0x7e,0xb3,0x6e,0xb3,0x7e,0x73,0x6e,0xb4,0x22,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x22,0xca,0xf8,0x7e,0x14,0x0, 0x1e,0x7e,0x4, +0x0, 0xff,0x69,0x30,0x0, 0x1, 0x7e,0xb, 0x50,0x7a,0x37,0x62,0xb9,0x7a,0x53,0x62, +0xb8,0xc2,0x0, 0x6d,0xcc,0x7e,0xb4,0xff,0xff,0x20,0x21,0x2, 0x21,0x35,0x7e,0xd4, +0x4, 0xc, 0xca,0xd9,0x12,0x51,0x59,0x12,0x24,0xf, 0x1b,0xfd,0x6d,0xaa,0x7d,0xda, +0x80,0x26,0x7d,0x2d,0x3e,0x24,0x49,0x12,0x46,0x54,0xbe,0x14,0x0, 0x0, 0x8, 0x6, +0x49,0x32,0x46,0x54,0x80,0x4, 0x6d,0x33,0x9d,0x31,0x59,0x32,0x46,0x54,0xbd,0x3c, +0x28,0x4, 0x7d,0xc3,0x7d,0xbd,0xb, 0xd4,0x7e,0x37,0x73,0x21,0xbd,0x3d,0x38,0xd2, +0x7e,0x37,0x4e,0x95,0xbd,0x3c,0x50,0x4, 0x7a,0xc7,0x4e,0x95,0x7e,0x37,0x4e,0x8b, +0xbd,0x3c,0x50,0x10,0xbe,0xb4,0xff,0xff,0x68,0xa, 0x7e,0x37,0x4e,0x93,0xb, 0x34, +0x7a,0x37,0x4e,0x93,0x7e,0x73,0x6e,0xb0,0xa, 0x27,0x7d,0x3b,0x8d,0x32,0x7c,0xf5, +0xbe,0xf0,0x0, 0x40,0x7, 0xbe,0xf0,0x1d,0x38,0x2, 0xd2,0x0, 0x7d,0xda,0x7d,0x3d, +0x3e,0x34,0x49,0x23,0x4e,0x85,0xbd,0x2c,0x50,0x51,0xbe,0xb4,0xff,0xff,0x68,0x4b, +0x9, 0xbd,0x4e,0x97,0xb4,0x1, 0x25,0x49,0x23,0x4e,0xa0,0xbd,0x2b,0x78,0x10,0x7d, +0xa3,0x2e,0xa4,0x4e,0x9a,0xb, 0xa8,0x20,0xb, 0x24,0x1b,0xa8,0x20,0x80,0x32,0x4d, +0xdd,0x78,0x14,0x30,0x0, 0x25,0x80,0xf, 0x80,0x21,0x80,0xb, 0x4d,0xdd,0x78,0x7, +0x30,0x0, 0x18,0x80,0x2, 0x80,0x14,0x59,0xb3,0x4e,0xa0,0x7e,0x24,0x0, 0x1, 0x59, +0x23,0x4e,0x9a,0x74,0x1, 0x19,0xbd,0x4e,0x97,0x80,0x6, 0x74,0x1, 0x19,0xbd,0x62, +0xb8,0x49,0xa3,0x4e,0x8d,0x49,0x23,0x4e,0x9a,0xbd,0x2a,0x28,0x4, 0x59,0x23,0x4e, +0x8d,0x9, 0xbd,0x62,0xb8,0xb4,0x1, 0x11,0x6d,0x22,0x59,0x23,0x4e,0xa0,0x6d,0xaa, +0x59,0xa3,0x4e,0x9a,0xe4,0x19,0xbd,0x4e,0x97,0xb, 0xd4,0xbe,0xd4,0x0, 0x3, 0x68, +0x2, 0x1, 0x9e,0x80,0x1a,0x7e,0x8, 0x4e,0x97,0x7e,0x34,0x0, 0x3, 0xe4,0x12,0x24, +0x34,0x7e,0x8, 0x4e,0x9a,0x12,0x51,0x52,0x7e,0x8, 0x4e,0xa0,0x12,0x51,0x52,0xda, +0xf8,0x22,0x7e,0x34,0x0, 0x6, 0x2, 0x24,0x34,0x7e,0x1f,0x24,0x68,0x7e,0x8, 0x46, +0x54,0x22,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x51,0x59,0x12,0x24,0xf, 0x1b,0xfd, +0x6d,0x33,0x7d,0x13,0x3e,0x14,0x49,0x1, 0x46,0x54,0xbe,0x4, 0x0, 0x0, 0x8, 0x6, +0x49,0x21,0x46,0x54,0x80,0x4, 0x6d,0x22,0x9d,0x20,0x59,0x21,0x46,0x54,0x49,0x1, +0x42,0x48,0xbd,0x20,0x28,0x4, 0x59,0x21,0x42,0x48,0xb, 0x34,0xbe,0x34,0x2, 0x6, +0x40,0xd0,0x22,0x7e,0x37,0x4e,0xa6,0x7a,0x73,0x76,0x90,0x7e,0xb3,0x76,0x8d,0xb4, +0x1, 0x2, 0x80,0x2, 0x41,0x7e,0x12,0x52,0x91,0x7e,0xa7,0x4e,0xa6,0xbe,0xa4,0x0, +0x5, 0x38,0x30,0x6d,0xdd,0x7a,0xd7,0x4e,0x95,0x7a,0xd7,0x4e,0x93,0x7e,0x8, 0x4e, +0x8d,0x7e,0x34,0x0, 0x6, 0xe4,0x12,0x24,0x34,0x7e,0x34,0x4, 0xc, 0x7d,0x1d,0xad, +0x13,0x2e,0x14,0x42,0x48,0x6d,0x0, 0xe4,0x12,0x24,0x34,0xb, 0xd4,0xbe,0xd4,0x0, +0x2, 0x78,0xe6,0x7e,0xa7,0x4e,0xa6,0xb, 0xa4,0x7a,0xa7,0x4e,0xa6,0xbe,0xa4,0x0, +0x5, 0x28,0x5, 0xd2,0x21,0x12,0x51,0x62,0x7e,0x73,0x76,0x8e,0xa, 0xa7,0x3e,0xa4, +0x3e,0xa4,0x2e,0xa4,0x0, 0x5, 0xbe,0xa7,0x4e,0xa6,0x78,0x74,0x6d,0xdd,0x4d,0xdd, +0x78,0x4, 0x6d,0xbb,0x80,0xa, 0x7d,0x3d,0x1b,0x34,0x3e,0x34,0x49,0xb3,0x42,0x48, +0xbe,0xd4,0x2, 0x6, 0x78,0x4, 0x6d,0xcc,0x80,0x8, 0x7d,0xcd,0x3e,0xc4,0x49,0xcc, +0x42,0x4a,0x7d,0x3b,0x2d,0x3c,0x7e,0x24,0x0, 0xa, 0x8d,0x32,0x7d,0x3d,0x3e,0x34, +0x2e,0x34,0x42,0x48,0xb, 0x38,0xa0,0x2d,0xa2,0x1b,0x38,0xa0,0xb, 0xd4,0xbe,0xd4, +0x2, 0x6, 0x78,0xba,0xc2,0x21,0xe4,0x7a,0xb3,0x76,0x8d,0x6d,0xaa,0x7a,0xa7,0x4a, +0x63,0x7e,0x34,0x42,0x48,0x7a,0x37,0x4e,0x7f,0x7a,0xa7,0x4e,0xa6,0x22,0xc2,0x21, +0x7e,0xa7,0x4e,0xa6,0x4d,0xaa,0x68,0x8, 0x6d,0xaa,0x7a,0xa7,0x4e,0xa6,0xd2,0x10, +0x22,0x7e,0xb3,0x76,0x7c,0x44,0x80,0x7a,0xb3,0x76,0x7c,0x22,0xe4,0x7a,0xb3,0x76, +0x2f,0x6d,0x33,0x7a,0x37,0x4e,0x7d,0x12,0x66,0x8f,0x12,0x53,0x1, 0x12,0x66,0xc5, +0xc2,0x1, 0x12,0x28,0x8c,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x7e,0x1f,0x24,0x64,0x7e, +0xf, 0x24,0x68,0x12,0x24,0xf, 0x1b,0xfd,0x12,0x37,0x94,0x2, 0x52,0xce,0x7e,0x8, +0x74,0xfc,0x7e,0x34,0x0, 0xa, 0xe4,0x2, 0x24,0x34,0xe4,0x7a,0xb3,0x76,0x2f,0x74, +0x1, 0x7a,0xb3,0x77,0xe1,0x7a,0xb3,0x73,0x1e,0x12,0x6b,0x71,0x12,0x53,0x1, 0x12, +0x3c,0x27,0x12,0x47,0x1c,0x12,0x2f,0xf0,0x12,0xb4,0xd2,0x12,0x52,0xce,0x2, 0x28, +0x77,0x7e,0x8, 0x76,0xdc,0x7e,0x34,0x0, 0x20,0xe4,0x12,0x24,0x34,0x7e,0x34,0x0, +0x1, 0x7a,0x37,0x76,0xdc,0x7a,0xb3,0x76,0xde,0x74,0x1, 0x7a,0xb3,0x76,0xdf,0xe4, +0x7a,0xb3,0x76,0xe0,0x7e,0xb3,0x77,0xd9,0xb4,0x1, 0x31,0x7e,0x34,0x0, 0x2, 0x12, +0x53,0x9b,0x12,0x53,0x7f,0x7a,0x73,0x76,0xe9,0x74,0x1, 0x7a,0xb3,0x76,0xea,0xe4, +0x7a,0xb3,0x76,0xeb,0x7e,0x34,0x0, 0x2, 0x12,0x53,0x88,0x12,0x53,0x7f,0x7a,0x73, +0x76,0xf1,0x7a,0xb3,0x76,0xf2,0x7a,0xb3,0x76,0xf3,0x80,0xa, 0x7e,0x34,0x0, 0x1, +0x12,0x53,0x9b,0x12,0x53,0x88,0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x76,0xf4,0x74,0x1, +0x7a,0xb3,0x76,0xf6,0x7a,0xb3,0x76,0xf7,0x74,0x2, 0x7a,0xb3,0x76,0xf8,0x22,0x7e, +0x73,0x77,0xd8,0x1e,0x34,0xb, 0x34,0x22,0x7a,0x37,0x76,0xec,0x74,0x1, 0x7a,0xb3, +0x76,0xee,0x7a,0xb3,0x76,0xef,0x7a,0xb3,0x76,0xf0,0x22,0x7a,0x37,0x76,0xe4,0x74, +0x1, 0x7a,0xb3,0x76,0xe6,0x7a,0xb3,0x76,0xe7,0xe4,0x7a,0xb3,0x76,0xe8,0x22,0x7e, +0x34,0x0, 0x27,0xca,0x39,0x7e,0x34,0x20,0xb4,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x28, +0xe6,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, 0x27,0xca,0x39,0x7e,0x34,0x20,0xdb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x29,0xd, 0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, +0x27,0xca,0x39,0x7e,0x34,0x21,0x2, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x29,0x34,0x12, +0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, 0x27,0xca,0x39,0x7e,0x34,0x21,0x29,0x7e,0x24, +0x0, 0xff,0x7e,0x8, 0x29,0x5b,0x12,0x24,0xf, 0x1b,0xfd,0x6c,0x88,0x7c,0xb8,0x12, +0x89,0x3a,0xb, 0x80,0xbe,0x80,0x4, 0x40,0xf4,0x2, 0x53,0x1, 0x12,0x87,0xd7,0x12, +0x65,0xcc,0x12,0x88,0x5e,0x12,0x53,0xaf,0x12,0x88,0xa4,0x12,0x29,0xe3,0x12,0x88, +0x85,0x12,0x54,0x8a,0x12,0x54,0xd0,0x12,0x3c,0xc5,0x2, 0x54,0x3d,0xd2,0x1, 0x12, +0x28,0x8c,0x6c,0xaa,0x7e,0x63,0x77,0xe1,0x7e,0x70,0x27,0xac,0x67,0x9, 0x63,0x28, +0xe7,0xa, 0x2a,0x12,0xc5,0xf, 0x7c,0x7b,0xbc,0x67,0x78,0x4, 0x7a,0xa3,0x74,0x7e, +0x7e,0x50,0x26,0xac,0x5a,0x19,0x72,0x74,0x82,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xd4, +0x7e,0x73,0x74,0x7e,0xbe,0x70,0x3, 0x40,0x5, 0xe4,0x7a,0xb3,0x74,0x7e,0x12,0x46, +0x5d,0x7e,0x73,0x74,0x7e,0x7a,0x73,0x75,0x6, 0x22,0x12,0x54,0xc8,0x74,0x9, 0xac, +0x7b,0x7e,0x8, 0x6d,0x14,0x12,0x54,0xc3,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x6d,0xc8, +0x12,0x54,0xc3,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x6d,0x6e,0x74,0xff,0x12,0x24,0x34, +0x7e,0x8, 0x6e,0x22,0x12,0x81,0x73,0x7e,0x8, 0x6e,0x7c,0x7e,0x34,0x0, 0xd, 0xe4, +0x2, 0x24,0x34,0x74,0xff,0x12,0x24,0x34,0x90,0x21,0x51,0xe4,0x93,0x7c,0x7b,0x22, +0x6d,0x33,0x7a,0x37,0x78,0x25,0xe4,0x7a,0xb3,0x78,0x23,0x7a,0xb3,0x78,0x24,0x7a, +0xb3,0x78,0x20,0x2, 0x54,0xe6,0x7a,0xb3,0x78,0x21,0x7a,0xb3,0x78,0x22,0x22,0x7e, +0x37,0x78,0x25,0xbe,0x34,0x0, 0x0, 0x28,0x7, 0x1b,0x34,0x7a,0x37,0x78,0x25,0x22, +0xe4,0x12,0x54,0xe6,0x7a,0xb3,0x78,0x20,0x22,0xca,0xf8,0xc2,0x0, 0xc2,0x1, 0x12, +0x92,0x25,0x68,0x76,0x7e,0xb3,0x76,0x5a,0x70,0x70,0x7e,0xb3,0x6c,0xde,0x70,0x5, +0x12,0x54,0xef,0x80,0x65,0x12,0x55,0x8d,0x92,0x1, 0x12,0xbe,0x41,0x92,0x0, 0x30, +0x0, 0x13,0x7e,0x34,0x22,0x27,0x12,0x29,0xdb,0x7a,0x37,0x78,0x25,0x74,0x1, 0x7a, +0xb3,0x78,0x21,0x80,0x14,0x30,0x1, 0x19,0x7e,0x34,0x22,0x27,0x12,0x29,0xdb,0x7a, +0x37,0x78,0x25,0x74,0x1, 0x7a,0xb3,0x78,0x22,0x74,0x1, 0x7a,0xb3,0x78,0x20,0x80, +0x3, 0x12,0x54,0xef,0x7e,0xb3,0x78,0x21,0x60,0xe, 0x6c,0xff,0x80,0x3, 0x12,0x57, +0x3b,0x12,0x57,0x1b,0x38,0xf8,0x80,0x12,0x7e,0xb3,0x78,0x22,0x60,0xc, 0x6c,0xff, +0x80,0x3, 0x12,0x57,0x3b,0x12,0x57,0x1b,0x38,0xf8,0xda,0xf8,0x22,0xca,0x3b,0x12, +0xda,0x48,0xc2,0x2, 0x7e,0x34,0x22,0x23,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xd0,0x7e, +0x17,0x6c,0xe4,0xbd,0x1d,0x58,0x4, 0x7d,0xd1,0xe, 0xd4,0x6c,0xcc,0xc1,0xf5,0x7e, +0x30,0x2, 0xac,0x3c,0x9, 0xb1,0x6b,0x54,0xf5,0x26,0x9, 0x71,0x6b,0x55,0x7a,0x71, +0x27,0x12,0x57,0x9, 0x7d,0xc3,0xbd,0xdc,0x8, 0x2, 0xc1,0xf3,0xbe,0xe1,0x26,0x38, +0x2, 0xc1,0xf3,0xbe,0xd1,0x27,0x38,0x2, 0xc1,0xf3,0x7d,0x1c,0xe, 0x14,0x7d,0xec, +0xe, 0xe4,0xe, 0xe4,0x2d,0xe1,0x6d,0xff,0x12,0x57,0xcd,0x85,0x27,0x2b,0x80,0x2d, +0x6c,0x99,0x7e,0xf1,0x26,0x80,0x1b,0x7c,0xbf,0x7e,0x71,0x2b,0x12,0x57,0x13,0x18, +0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x57,0x2a,0x80,0x6, 0xe5,0x2a,0xbc,0xbf,0x58,0x7, +0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe0,0x4c,0x99,0x68,0x9, 0x15,0x2b,0xe5,0x2b,0xbe, +0xb0,0x0, 0x58,0xcc,0x12,0x57,0xc2,0x58,0x36,0x85,0x27,0x2b,0x80,0x2a,0x12,0x57, +0xb7,0x80,0x1b,0x7c,0xb8,0x7e,0x71,0x2b,0x12,0x57,0x13,0x18,0x9, 0xbd,0xc0,0x48, +0x5, 0x12,0x57,0x22,0x80,0x6, 0xe5,0x29,0xbc,0xb8,0x28,0x6, 0xb, 0x80,0xbc,0xe8, +0x38,0xe1,0x4c,0x99,0x68,0x9, 0x15,0x2b,0xe5,0x2b,0xbe,0xb0,0x0, 0x58,0xcf,0x12, +0x57,0xcd,0xa, 0x3d,0x1b,0x34,0xe5,0x27,0xa, 0x1b,0xbd,0x13,0x58,0x6a,0x12,0x57, +0x32,0x80,0x2a,0x6c,0x99,0x7e,0xf1,0x26,0x80,0x18,0x7c,0xbf,0x12,0x57,0x10,0x18, +0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x57,0x2a,0x80,0x6, 0xe5,0x2a,0xbc,0xbf,0x58,0x7, +0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe3,0x4c,0x99,0x68,0x7, 0x5, 0x28,0xbe,0xd1,0x28, +0x38,0xd1,0x12,0x57,0xc2,0x58,0x31,0x12,0x57,0x32,0x80,0x27,0x12,0x57,0xb7,0x80, +0x18,0x7c,0xb8,0x12,0x57,0x10,0x18,0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x57,0x22,0x80, +0x6, 0xe5,0x29,0xbc,0xb8,0x28,0x6, 0xb, 0x80,0xbc,0xe8,0x38,0xe4,0x4c,0x99,0x68, +0x7, 0x5, 0x28,0xbe,0xd1,0x28,0x38,0xd4,0x90,0x22,0x22,0xe4,0x93,0xa, 0x1b,0xbd, +0x1f,0x38,0x10,0xd2,0x2, 0xe5,0x26,0x7a,0xb3,0x78,0x23,0xe5,0x27,0x7a,0xb3,0x78, +0x24,0x80,0xc, 0xb, 0xc0,0x7e,0x73,0x6c,0xde,0xbc,0x7c,0x28,0x2, 0xa1,0xaf,0xa2, +0x2, 0xda,0x3b,0x22,0xe5,0x2a,0x7e,0x71,0x2b,0x12,0x57,0xd9,0xb, 0x1a,0x30,0x22, +0x7e,0x71,0x28,0x12,0x57,0x9, 0x7d,0x3, 0xbd,0xe0,0x22,0x7e,0x73,0x6c,0xde,0xbc, +0x7f,0x22,0xb, 0xf4,0xb, 0x90,0x7a,0x81,0x29,0x22,0xb, 0xf4,0xb, 0x90,0x7a,0xf1, +0x2a,0x22,0xe5,0x27,0xa, 0x5b,0xb, 0x54,0xf5,0x28,0x22,0xc2,0x2, 0x7c,0xbf,0x12, +0x57,0x49,0xb, 0xf0,0x22,0xc2,0x2, 0x7c,0xb1,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c, +0xab,0x12,0x6e,0x60,0x30,0x2, 0xf, 0xa, 0x3a,0x2e,0x34,0x6b,0xcc,0x7e,0x39,0xa0, +0x4c,0xba,0x7a,0x39,0xb0,0x22,0x64,0xff,0xa, 0x2a,0x2e,0x24,0x6b,0xcc,0x2, 0x46, +0x1d,0xca,0xd8,0xca,0x79,0x7d,0x43,0x7f,0x70,0x12,0xbe,0x39,0x28,0x33,0x6c,0xff, +0x80,0x2a,0x74,0x2, 0xac,0xbf,0x9, 0xe5,0x6b,0x54,0x9, 0xd5,0x6b,0x55,0x7c,0xbe, +0x7c,0x7d,0x12,0x57,0x9, 0x7d,0xd3,0x7f,0x7, 0x7c,0x7d,0x12,0xbf,0x5f,0x50,0x7, +0xbd,0x4d,0x58,0x6, 0xd3,0x80,0xb, 0xd3,0x80,0x8, 0xb, 0xf0,0x12,0x57,0x1b,0x38, +0xd1,0xc3,0xda,0x79,0xda,0xd8,0x22,0x6c,0x99,0xe5,0x26,0xa, 0x1b,0xb, 0x14,0x7c, +0x83,0x22,0xa, 0x3e,0x1b,0x34,0xe5,0x26,0xa, 0x1b,0xbd,0x13,0x22,0xe5,0x26,0xa, +0x5b,0xb, 0x54,0xf5,0x29,0x85,0x26,0x2a,0x22,0x12,0x57,0xe7,0x7d,0x13,0x3e,0x14, +0x7e,0x1f,0x24,0x68,0x2d,0x31,0x22,0x7c,0xa7,0x7e,0x73,0x6e,0xb0,0xac,0x7b,0xa, +0x2a,0x2d,0x32,0x22,0x7c,0xb9,0x7c,0x70,0x2, 0x57,0x9, 0x7c,0x9b,0x74,0x3, 0xac, +0xb9,0x9, 0x85,0x29,0xb2,0xbe,0x83,0x76,0x9c,0x68,0x8, 0x7e,0x83,0x76,0x9c,0x19, +0x85,0x29,0xb2,0x9, 0x85,0x29,0xb3,0xbe,0x83,0x76,0x9d,0x68,0x8, 0x7e,0x83,0x76, +0x9d,0x19,0x85,0x29,0xb3,0x9, 0x85,0x29,0xb4,0xbe,0x83,0x76,0x9e,0x68,0x8, 0x7e, +0x83,0x76,0x9e,0x19,0x85,0x29,0xb4,0x7e,0x8, 0x0, 0x70,0x12,0x58,0x48,0x9, 0xb5, +0x29,0xb4,0x12,0x58,0x85,0x2, 0x4, 0x96,0x9, 0xb5,0x29,0xb2,0x12,0xc, 0xea,0x7e, +0x8, 0x0, 0x70,0x74,0x3, 0xac,0xb9,0x9, 0xb5,0x29,0xb3,0x12,0xd, 0x8d,0x7e,0x8, +0x0, 0x70,0x74,0x3, 0xac,0xb9,0x22,0x7c,0x9b,0x12,0x58,0x5e,0x12,0x58,0x48,0x12, +0x58,0xac,0x4c,0x99,0x78,0x9, 0x7e,0x8, 0x0, 0x70,0x74,0x1, 0x12,0xc, 0xea,0x12, +0x58,0x88,0x2, 0x4, 0x96,0x12,0xd, 0x7, 0x7e,0x37,0x0, 0x70,0x7a,0x37,0x0, 0xac, +0x7e,0x34,0x0, 0x2, 0x7e,0x8, 0x0, 0x70,0x7e,0x24,0x0, 0x1, 0x12,0x3, 0xfa,0x7e, +0x34,0x0, 0x2, 0x7e,0x8, 0x0, 0xac,0x7e,0x24,0x0, 0x1, 0x22,0x9, 0xb5,0x29,0xb4, +0x2, 0xd, 0x7, 0x12,0x3c,0xf3,0x12,0x37,0xe1,0x12,0x5a,0xac,0x7e,0xb3,0x6e,0xc1, +0x7e,0x37,0x6e,0xbd,0x60,0xe, 0x7a,0x37,0x0, 0xba,0x7e,0x37,0x6e,0xbf,0x7a,0x37, +0x0, 0x7e,0x80,0xc, 0x7a,0x37,0x0, 0x7e,0x7e,0x37,0x6e,0xbf,0x7a,0x37,0x0, 0xba, +0x7e,0x37,0x0, 0x7c,0x4e,0x70,0x2, 0x7a,0x37,0x0, 0x7c,0x7e,0x37,0x0, 0xb8,0x4e, +0x70,0x2, 0x7a,0x37,0x0, 0xb8,0x12,0x47,0xc4,0x9, 0xb5,0x29,0xb2,0x12,0xc, 0xea, +0x12,0x47,0xc4,0x9, 0xb5,0x29,0xb3,0x12,0xd, 0x8d,0x12,0x47,0xc4,0x12,0x58,0xac, +0x7e,0x37,0x0, 0x70,0x7a,0x37,0x0, 0xac,0x6d,0x33,0x7e,0x8, 0x0, 0x6c,0x7e,0x24, +0x0, 0x1e,0x12,0x3, 0xfa,0x6d,0x33,0x7e,0x8, 0x0, 0xa8,0x7e,0x24,0x0, 0x1e,0x2, +0x4, 0x96,0x12,0x58,0xb3,0x12,0x59,0x3e,0x12,0x5a,0x62,0x2, 0x35,0x9, 0xca,0x3b, +0x7e,0x38,0x1, 0x7c,0x12,0x7, 0xb5,0x7e,0x63,0x1, 0x8c,0xbe,0x60,0xff,0x68,0x2a, +0x7e,0x73,0x1, 0x8d,0xbe,0x70,0xff,0x68,0x21,0x7e,0xa3,0x1, 0x8e,0xbe,0xa0,0xff, +0x68,0x18,0x4c,0x66,0x68,0x14,0x4c,0x77,0x68,0x10,0x4c,0xaa,0x68,0xc, 0x7a,0x63, +0x76,0x2d,0x7a,0x73,0x76,0x29,0x7a,0xa3,0x76,0x2a,0xc2,0xf, 0x7e,0x73,0x1, 0x8e, +0xbe,0x70,0x3, 0x28,0x35,0x74,0x4, 0x7a,0xb3,0x77,0xdc,0x7a,0xb3,0x4a,0x68,0x75, +0xc3,0x84,0x7e,0x34,0x1, 0x90,0x7a,0x37,0x0, 0x72,0x7a,0x37,0x0, 0xae,0x7e,0x34, +0x0, 0x3, 0x7e,0x8, 0x0, 0x72,0x12,0x5b,0x4d,0x7e,0x34,0x0, 0x3, 0x7e,0x8, 0x0, +0xae,0x7e,0x24,0x0, 0x1, 0x12,0x4, 0x96,0xd2,0xf, 0xc2,0x11,0x7e,0xb3,0x1, 0x8c, +0x54,0xf0,0xb4,0xe0,0x2, 0xd2,0x11,0x7e,0x8, 0x0, 0xa0,0x69,0x33,0x0, 0x4, 0x12, +0x5a,0x57,0x12,0x0, 0x6, 0x7e,0x8, 0x0, 0xa2,0x29,0xb3,0x0, 0x6, 0x12,0x5a,0x4c, +0x7e,0x8, 0x0, 0xdc,0x69,0x33,0x0, 0x1, 0x12,0x5a,0x57,0x12,0x0, 0x6, 0x7e,0x8, +0x0, 0xde,0x29,0xb3,0x0, 0x3, 0x12,0x5a,0x4c,0x7e,0x8, 0x0, 0xa4,0x69,0x33,0x0, +0xa, 0x12,0x5a,0x57,0x12,0x0, 0x6, 0x7e,0x8, 0x0, 0xa6,0x29,0xb3,0x0, 0xc, 0x12, +0x5a,0x4c,0x7e,0x8, 0x0, 0xe0,0x69,0x33,0x0, 0x7, 0x12,0x5a,0x57,0x12,0x0, 0x6, +0x7e,0x8, 0x0, 0xe2,0x29,0xb3,0x0, 0x9, 0x12,0x5a,0x4c,0x7e,0x34,0x0, 0x1a,0x7e, +0x8, 0x0, 0xa0,0x7e,0x24,0x0, 0x4, 0x12,0x3, 0xfa,0x7e,0x34,0x0, 0x1a,0x7e,0x8, +0x0, 0xdc,0x7e,0x24,0x0, 0x4, 0x12,0x4, 0x96,0xda,0x3b,0x22,0x54,0xc0,0x23,0x23, +0x54,0x3, 0xa, 0x3b,0x2, 0xd, 0xa5,0x7d,0x23,0x7c,0x45,0x6c,0x55,0xa, 0x36,0x4d, +0x32,0x22,0x2, 0x5a,0x65,0xca,0x3b,0x7e,0x67,0x6e,0xb5,0x7e,0x77,0x6e,0xb7,0x74, +0x1, 0x12,0x35,0x28,0x7e,0xb3,0x6e,0xc1,0x7e,0x34,0x1, 0x0, 0x7e,0x8, 0x6e,0xc2, +0x7d,0x26,0x60,0xb, 0x12,0x4, 0x96,0x12,0x5a,0x9b,0x12,0x3, 0xfa,0x80,0x9, 0x12, +0x3, 0xfa,0x12,0x5a,0x9b,0x12,0x4, 0x96,0xda,0x3b,0x22,0x7e,0x34,0x1, 0x0, 0x7d, +0x16,0x3e,0x14,0x2e,0x14,0x6e,0xc2,0x6d,0x0, 0x7d,0x27,0x22,0x7e,0x8, 0x0, 0x6c, +0x12,0x5b,0x54,0x7e,0x34,0x1, 0x5, 0x7a,0x37,0x0, 0x6c,0x7e,0x34,0x20,0x0, 0x7a, +0x37,0x0, 0x6e,0x6d,0x33,0x7a,0x37,0x0, 0x70,0x7e,0x34,0x1, 0xe0,0x7a,0x37,0x0, +0x72,0x7e,0x34,0x28,0x30,0x7a,0x37,0x0, 0x74,0x7e,0x34,0x18,0x1e,0x7a,0x37,0x0, +0x76,0x7e,0x34,0x66,0x6, 0x7a,0x37,0x0, 0x78,0x7e,0x34,0x73,0x0, 0x7a,0x37,0x0, +0x7a,0x7e,0x34,0x14,0x2, 0x7a,0x37,0x0, 0x7c,0x6d,0x33,0x7a,0x37,0x0, 0x80,0x7a, +0x37,0x0, 0x82,0x7a,0x37,0x0, 0x84,0x7a,0x37,0x0, 0x86,0x7a,0x37,0x0, 0x98,0x7e, +0x34,0x38,0x1, 0x7a,0x37,0x0, 0x9a,0x7e,0x34,0x4, 0x1, 0x7a,0x37,0x0, 0x9c,0x7e, +0x34,0x6, 0x3, 0x7a,0x37,0x0, 0x9e,0x6d,0x33,0x7a,0x37,0x0, 0xa0,0x7a,0x37,0x0, +0xa2,0x7a,0x37,0x0, 0xa4,0x7a,0x37,0x0, 0xa6,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e, +0x18,0x0, 0x6c,0x7e,0x8, 0x0, 0xa8,0x12,0x24,0xf, 0x1b,0xfd,0x22,0x7e,0x24,0x0, +0x1, 0x2, 0x3, 0xfa,0x7e,0x34,0x0, 0x3c,0xe4,0x2, 0x24,0x34,0xd2,0x5, 0x7e,0x73, +0x6c,0xde,0xbe,0x70,0x3, 0x50,0x2, 0xc3,0x22,0x7e,0x8, 0x62,0xb8,0x12,0x5b,0x54, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x9, 0xb4,0x6b,0x54,0x19,0xb4,0x62, +0xb8,0x9, 0xb4,0x6b,0x55,0x19,0xb4,0x62,0xb9,0xb, 0xa0,0x7e,0x73,0x6c,0xde,0xbc, +0x7a,0x38,0xe1,0x6c,0xaa,0x80,0x36,0xa, 0x2a,0xb, 0x24,0x7c,0x65,0x80,0x28,0x7e, +0x50,0x2, 0xac,0x56,0x9, 0x12,0x62,0xb8,0x7e,0x30,0x2, 0xac,0x3a,0x9, 0xb1,0x62, +0xb8,0xbc,0xb1,0x78,0x2, 0xc2,0x5, 0x9, 0x52,0x62,0xb9,0x9, 0xb1,0x62,0xb9,0xbc, +0xb5,0x78,0x2, 0xc2,0x5, 0xb, 0x60,0xbc,0x76,0x38,0xd4,0xb, 0xa0,0xbc,0x7a,0x38, +0xc6,0xa2,0x5, 0x22,0xca,0x3b,0x7c,0xfb,0x12,0x5f,0xa8,0x7e,0x94,0x0, 0x51,0x7e, +0xe3,0x6c,0xde,0xe4,0x7a,0xb3,0x75,0x4a,0x7a,0xb3,0x75,0x4b,0x7a,0xb3,0x75,0xc, +0x7e,0x8, 0x75,0x4c,0x12,0x5f,0x7c,0xe4,0x12,0x24,0x34,0x12,0x5f,0x7c,0x3e,0x34, +0x7e,0x8, 0x75,0xd, 0xe4,0x12,0x24,0x34,0xbe,0xe0,0x2, 0x50,0x2, 0xc1,0x8a,0x6c, +0xdd,0xc1,0x84,0x74,0x2, 0x7c,0x7d,0xac,0x7b,0x12,0x5f,0xb7,0x4c,0xdd,0x68,0x8, +0xa, 0x8d,0x9, 0xb8,0x75,0x4c,0x70,0xa, 0xa, 0x3d,0xb, 0x34,0xa, 0x8d,0x19,0x78, +0x75,0x4c,0xa, 0x5d,0xb, 0x54,0xf5,0x26,0xc1,0x7b,0x7e,0xa1,0x26,0x74,0x2, 0x7c, +0x7a,0xac,0x7b,0x9, 0xa3,0x6b,0x54,0x7a,0xa1,0x2a,0x9, 0xb3,0x6b,0x55,0xf5,0x2b, +0xa, 0x2a,0xe5,0x28,0x12,0x5f,0x83,0x8, 0x6, 0x7d,0x50,0x9d,0x52,0x80,0x4, 0x6d, +0x55,0x9d,0x53,0xf5,0x2c,0xe5,0x2b,0xa, 0x2b,0xe5,0x29,0x12,0x5f,0x83,0x8, 0x6, +0x7d,0x80,0x9d,0x82,0x80,0x4, 0x6d,0x88,0x9d,0x83,0x7d,0x38,0x7c,0xc7,0xe5,0x2c, +0xbe,0xb0,0x6, 0x40,0x2, 0xc1,0x79,0xbe,0xc0,0x6, 0x40,0x2, 0xc1,0x79,0x12,0x5f, +0xaf,0x7a,0x35,0x2e,0x12,0x57,0x4, 0x7d,0x83,0x7e,0x25,0x2e,0xbd,0x28,0x8, 0x4, +0x7d,0x38,0x80,0x3, 0x7e,0x35,0x2e,0x7a,0x35,0x30,0xbd,0x28,0x58,0x4, 0x7d,0x38, +0x80,0x3, 0x7e,0x35,0x2e,0x7a,0x35,0x32,0x75,0x2d,0x0, 0xe5,0x2c,0xbe,0xb0,0x1, +0x38,0x21,0xbe,0xc0,0x1, 0x38,0x1c,0x7c,0xbf,0x30,0xe0,0x17,0x7e,0xb3,0x75,0xc, +0x4, 0x7a,0xb3,0x75,0xc, 0x75,0x2d,0x1, 0x7e,0xb3,0x75,0x4a,0x4, 0x7a,0xb3,0x75, +0x4a,0xc1,0x1d,0xe5,0x2c,0xbe,0xb0,0x1, 0x38,0x7, 0xbe,0xc0,0x1, 0x38,0x2, 0xc1, +0x1d,0xe5,0x2c,0xbe,0xb0,0x6, 0x40,0x2, 0xc1,0x1d,0xbe,0xc0,0x6, 0x40,0x2, 0xc1, +0x1d,0x7c,0xbf,0x20,0xe1,0x2, 0xc1,0x1d,0xc2,0x3, 0xe5,0x2c,0xbe,0xb0,0x2, 0x28, +0x5, 0xbe,0xc0,0x2, 0x38,0x2, 0xd2,0x3, 0x12,0x5f,0x8e,0x12,0xcf,0x28,0x12,0x5f, +0xa1,0x7a,0xd, 0x3a,0x7d,0x38,0x2e,0x35,0x2e,0x12,0x5f,0x9a,0x7a,0x35,0x34,0xc2, +0x2, 0xbe,0x8, 0x7f,0xff,0x78,0x5, 0x9f,0x11,0x7a,0x1d,0x3a,0x7e,0x35,0x34,0x7a, +0x35,0x43,0x12,0x5f,0x8e,0x7e,0xd, 0x3a,0x12,0xcd,0x84,0x92,0x4, 0x12,0x5b,0x5c, +0x92,0x1, 0x7e,0x35,0x32,0x12,0x5e,0x90,0x20,0x1, 0x1a,0xe5,0x2c,0xbe,0xb0,0x4, +0x38,0x13,0xbe,0xc0,0x4, 0x38,0xe, 0xa, 0x2c,0xe5,0x2c,0xa, 0x3b,0x12,0x5e,0x9c, +0x18,0x3, 0x12,0x5e,0x8d,0x85,0x29,0x43,0x85,0x2a,0x44,0x85,0x2b,0x45,0x7e,0x8, +0x0, 0x3e,0x7e,0x18,0x0, 0x40,0xe5,0x28,0x12,0xcd,0x2f,0xe5,0x2c,0xa, 0x4b,0xbe, +0x45,0x40,0x8, 0x7, 0xa, 0x3c,0xbe,0x35,0x40,0x18,0x8, 0x12,0x5e,0x98,0x18,0x3, +0x7e,0x95,0x3e,0x7e,0x5, 0x40,0xbe,0x4, 0x0, 0x3, 0x78,0x5, 0x7e,0x35,0x32,0x80, +0x14,0xbe,0x4, 0x0, 0x4, 0x78,0x5, 0x7e,0x35,0x34,0x80,0x9, 0xbe,0x4, 0x0, 0x5, +0x78,0x6, 0x7e,0x35,0x30,0x12,0x5e,0x90,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x4, 0x7e, +0x94,0x0, 0x3c,0x7e,0xb3,0x6e,0xa2,0x60,0x18,0x12,0x5e,0x8d,0xe5,0x2c,0xbe,0xb0, +0x2, 0x38,0xe, 0xbe,0xc0,0x2, 0x38,0x9, 0x12,0x5e,0x98,0x18,0x4, 0x7e,0x94,0x0, +0x32,0x7d,0x19,0x1a,0x2, 0x1a,0x0, 0x7e,0x1d,0x36,0x12,0x22,0xa3,0x7e,0x8, 0x0, +0x64,0x12,0x23,0x10,0x7f,0x1, 0x7e,0x1d,0x3a,0xbf,0x10,0x8, 0x2, 0xd2,0x2, 0x30, +0x4, 0x5, 0x20,0x3, 0x2, 0xc2,0x2, 0x30,0x2, 0x3, 0x75,0x2d,0x2, 0xe5,0x2d,0xbe, +0xb0,0x0, 0x28,0x55,0xe5,0x26,0xa, 0x4b,0x9, 0x14,0x75,0x4c,0xa5,0xb9,0x0, 0xc, +0xa, 0x3d,0x9, 0xa3,0x75,0x4c,0x19,0xa4,0x75,0x4c,0x80,0x3d,0xa, 0x3d,0x9, 0x53, +0x75,0x4c,0x7a,0x51,0x42,0xbc,0x51,0x28,0x3, 0x7a,0x11,0x42,0x75,0x27,0x0, 0x80, +0x23,0x9, 0x64,0x75,0x4c,0xe5,0x27,0xa, 0xb, 0x9, 0x30,0x75,0x4c,0xbc,0x36,0x68, +0xa, 0xa, 0x3d,0x9, 0x63,0x75,0x4c,0xbc,0x36,0x78,0x7, 0x7e,0xa1,0x42,0x19,0xa0, +0x75,0x4c,0x5, 0x27,0xbe,0xe1,0x27,0x38,0xd8,0x5, 0x26,0xbe,0xe1,0x26,0x28,0x2, +0x81,0x3a,0xb, 0xd0,0xbc,0xed,0x28,0x2, 0x81,0x13,0xda,0x3b,0x22,0x7e,0x35,0x30, +0x1a,0x26,0x1a,0x24,0x7a,0x1d,0x36,0x22,0xa, 0x2c,0x7d,0x34,0x2d,0x32,0xbe,0x34, +0x0, 0x6, 0x22,0xca,0xd8,0xca,0x79,0xc2,0x0, 0x7e,0xe0,0x3, 0xe4,0x7a,0xb3,0x75, +0x49,0x7e,0xd3,0x6e,0x7d,0x12,0xd1,0x29,0x7e,0xf3,0x6c,0xde,0xbe,0xf0,0x1, 0x38, +0x2, 0xe1,0x6d,0x7c,0xbe,0x12,0x5b,0xd4,0x4c,0xdd,0x78,0x4, 0xc2,0x0, 0x80,0x5f, +0xbe,0xd0,0x1, 0x28,0xd, 0x7e,0x73,0x75,0x8a,0xbe,0x70,0x6, 0x28,0x4, 0xc2,0x0, +0x80,0x4d,0xc2,0x0, 0x7e,0x53,0x6c,0xde,0xbc,0x5d,0x78,0x11,0x12,0x5f,0xc4,0x50, +0x5, 0x7e,0xe0,0x3, 0x80,0x3, 0x7e,0xe0,0x1, 0xd2,0x0, 0x80,0x32,0x7e,0x43,0x75, +0x4a,0xa, 0x34,0xa, 0x25,0x7d,0x12,0x9d,0x13,0xb, 0x14,0xa, 0x3d,0xbd,0x31,0x78, +0x7, 0x7e,0xe0,0x1, 0xd2,0x0, 0x80,0x17,0x7e,0x73,0x75,0xc, 0xa, 0x37,0x9d,0x23, +0xb, 0x24,0x7e,0x73,0x75,0x8b,0xbd,0x32,0x78,0x5, 0x7e,0xe0,0x41,0xd2,0x0, 0x30, +0x0, 0x5, 0x7c,0xbe,0x12,0x5b,0xd4,0x7e,0x8, 0x75,0x4c,0x12,0xcc,0x63,0x7a,0xb3, +0x75,0x49,0x7e,0xa3,0x75,0x49,0x7a,0xa3,0x6c,0xde,0x74,0x2, 0xa4,0xca,0x59,0x7e, +0x18,0x75,0xd, 0x7e,0x8, 0x6b,0x54,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x73,0x6c,0xde, +0x7a,0x73,0x75,0x8b,0x12,0xce,0x9b,0x7a,0xb3,0x75,0x8a,0x80,0xa, 0x74,0x64,0x7a, +0xb3,0x75,0x8a,0x7a,0xf3,0x75,0x8b,0xda,0x79,0xda,0xd8,0x22,0x90,0x21,0x52,0x93, +0xa, 0x3b,0x22,0xa, 0xb, 0x7d,0x30,0x9d,0x32,0xbe,0x34,0x0, 0x0, 0x22,0xe5,0x28, +0x7e,0x71,0x29,0x7e,0x61,0x2a,0x7e,0x51,0x2b,0x22,0x7e,0x24,0x0, 0x2, 0x2, 0x22, +0x71,0x7d,0x13,0x1a,0x2, 0x1a,0x0, 0x22,0xc2,0x2, 0xc2,0x3, 0xc2,0x4, 0x22,0xe5, +0x28,0x7e,0x71,0x29,0x2, 0x57,0x9, 0x9, 0xb3,0x6b,0x54,0xf5,0x28,0x9, 0xb3,0x6b, +0x55,0xf5,0x29,0x22,0x6c,0xaa,0x80,0x12,0x7e,0x70,0x9, 0xac,0x7a,0x9, 0xb3,0x6b, +0xd6,0xbe,0xb0,0x10,0x28,0x2, 0xd3,0x22,0xb, 0xa0,0x7e,0xb3,0x6c,0xf4,0xbc,0xba, +0x38,0xe6,0xc3,0x22,0x6d,0x55,0x80,0x29,0x7d,0xf5,0x3e,0xf4,0x7f,0x61,0x2d,0xdf, +0xb, 0x6a,0x40,0xbe,0x44,0x0, 0x64,0x28,0x16,0x2d,0xf1,0x7d,0xe0,0xb, 0x7a,0xd0, +0xbe,0xd4,0x0, 0x64,0x50,0x2, 0x80,0x4, 0xbd,0xd4,0x28,0x3, 0x1b,0x7a,0x40,0xb, +0x54,0xbe,0x55,0x28,0x40,0xd2,0x22,0x24,0x8a,0x78,0x19,0x7e,0xf, 0x78,0x39,0xa5, +0xbf,0x0, 0x8, 0x12,0x3f,0x7c,0x5e,0x70,0xfb,0x80,0x6, 0x12,0x3f,0x7c,0x4e,0x70, +0x4, 0x1b,0xa, 0x30,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x37,0x4e,0x83,0x7e,0x8, 0x4a, +0x71,0x12,0x37,0xef,0x12,0x35,0x28,0x7e,0x34,0x1, 0x0, 0x12,0x7, 0x40,0x7a,0x37, +0x63,0xa, 0x7e,0x34,0x1, 0x1, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xe, 0x7e,0x34,0x1, +0x2, 0x12,0x7, 0x40,0x7a,0x37,0x63,0x10,0x7e,0x34,0x1, 0x6, 0x12,0x7, 0x40,0x7a, +0x37,0x63,0xc, 0x7e,0x34,0x1, 0x0, 0x6d,0x22,0x12,0x6, 0x48,0x7e,0x34,0x1, 0x0, +0x6d,0x22,0x12,0x6, 0xc5,0x12,0x65,0x6, 0x12,0x6, 0x48,0x12,0x65,0x6, 0x12,0x6, +0xc5,0x12,0x64,0xfd,0x12,0x6, 0x48,0x12,0x64,0xfd,0x12,0x6, 0xc5,0x12,0x65,0x35, +0x12,0x6, 0x48,0x12,0x65,0x35,0x12,0x6, 0xc5,0x6d,0x33,0x12,0x7, 0x40,0x7a,0x37, +0x63,0x0, 0x7e,0x34,0x0, 0x1, 0x12,0x7, 0x40,0x7a,0x37,0x63,0x2, 0x7e,0x34,0x0, +0x2, 0x12,0x7, 0x40,0x7a,0x37,0x63,0x4, 0x7e,0x34,0x0, 0x8, 0x12,0x7, 0x40,0x7a, +0x37,0x63,0x6, 0x7e,0x34,0x0, 0x17,0x12,0x7, 0x40,0x7a,0x37,0x63,0x8, 0x12,0x64, +0xad,0x5e,0x50,0xe0,0x4e,0x50,0xa, 0x12,0x64,0xaa,0x5e,0x50,0xe0,0x4e,0x50,0xa, +0x12,0x6, 0xc5,0x12,0x65,0x28,0x12,0x6, 0x48,0x12,0x65,0x28,0x12,0x6, 0xc5,0x12, +0x65,0x42,0x12,0x6, 0x48,0x12,0x65,0x42,0x12,0x6, 0xc5,0x12,0x65,0xf, 0x12,0x6, +0x48,0x12,0x65,0xf, 0x12,0x6, 0xc5,0x12,0x65,0x1b,0x12,0x6, 0x48,0x12,0x65,0x1b, +0x12,0x6, 0xc5,0x12,0x64,0xb4,0x6d,0x66,0x80,0x30,0x12,0x64,0xa1,0x7e,0xb3,0x6e, +0xc1,0x70,0x12,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0x81, +0x12,0x64,0x8c,0x80,0x10,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12, +0x64,0x81,0x12,0x64,0x93,0x12,0x47,0xf5,0xb, 0x64,0x12,0x64,0x9a,0xbd,0x36,0x38, +0xc9,0x7e,0xb3,0x6e,0xb3,0x54,0x1, 0xb4,0x1, 0xb, 0x7e,0x37,0x62,0xb8,0x4e,0x70, +0x1, 0x7a,0x37,0x62,0xb8,0x12,0x36,0xc4,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x7e,0x18, +0xc, 0x18,0x7e,0x8, 0x4a,0x71,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, 0x1, 0x41, +0x35,0x12,0x64,0xb4,0x7e,0x73,0x6e,0xb0,0xa, 0x27,0x7e,0x35,0x26,0xad,0x32,0x7d, +0x63,0x80,0x59,0x12,0x64,0xa1,0x7e,0x73,0x6e,0xad,0xa, 0x37,0xbe,0x35,0x26,0x28, +0x1e,0x7e,0xb3,0x6e,0xc1,0x70,0xc, 0x12,0x64,0x76,0x60,0x35,0x3e,0x14,0x14,0x78, +0xfb,0x80,0x2e,0x12,0x64,0x76,0x60,0x17,0x3e,0x14,0x14,0x78,0xfb,0x80,0x10,0x7e, +0xb3,0x6e,0xc1,0x70,0x12,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12, +0x64,0x81,0x12,0x64,0x93,0x80,0x10,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78, +0xfb,0x12,0x64,0x81,0x12,0x64,0x8c,0x12,0x47,0xf5,0xb, 0x64,0x7e,0x25,0x26,0xb, +0x24,0x12,0x64,0x9a,0xad,0x32,0xbd,0x36,0x38,0x99,0x7e,0xb3,0x6e,0xb3,0x54,0x4, +0xb4,0x4, 0xb, 0x7e,0x37,0x62,0xb8,0x4e,0x70,0x4, 0x7a,0x37,0x62,0xb8,0x12,0x36, +0xc4,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x64,0xc0,0x12,0x24,0xf, 0x1b,0xfd,0x12, +0x64,0xc9,0x12,0x64,0xd9,0x7a,0x35,0x26,0x7e,0x73,0x6e,0xaf,0xa, 0x37,0xbe,0x35, +0x26,0x28,0x2, 0x21,0x91,0x6d,0x33,0x41,0xe2,0x12,0x64,0xb4,0x7e,0x65,0x26,0x80, +0x59,0x12,0x64,0xa1,0x7e,0x37,0x6e,0xb5,0xbd,0x36,0x28,0x1e,0x7e,0xb3,0x6e,0xc1, +0x70,0xc, 0x12,0x64,0x76,0x60,0x35,0x3e,0x14,0x14,0x78,0xfb,0x80,0x2e,0x12,0x64, +0x76,0x60,0x17,0x3e,0x14,0x14,0x78,0xfb,0x80,0x10,0x7e,0xb3,0x6e,0xc1,0x70,0x12, +0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0x81,0x12,0x64,0x93, +0x80,0x10,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0x81,0x12, +0x64,0x8c,0x12,0x47,0xf5,0x12,0x64,0x9a,0x2d,0x63,0x7e,0xa3,0x6e,0xb0,0x7e,0xb3, +0x6e,0xaf,0xa4,0xbd,0x56,0x38,0x9a,0x7e,0xb3,0x6e,0xb4,0x54,0x1, 0xb4,0x1, 0xb, +0x7e,0x37,0x62,0xdc,0x4e,0x70,0x1, 0x7a,0x37,0x62,0xdc,0x12,0x36,0xc4,0x7e,0x34, +0x4, 0xc, 0xca,0x39,0x12,0x64,0xc0,0x12,0x24,0xf, 0x1b,0xfd,0x12,0x64,0xc9,0x12, +0x64,0xd9,0x7a,0x35,0x26,0x12,0x64,0x9a,0xbe,0x35,0x26,0x28,0x2, 0x41,0x49,0x12, +0x64,0xb4,0x7e,0xb3,0x6e,0xb4,0x54,0x4, 0xb4,0x4, 0xb, 0x7e,0x37,0x62,0xdc,0x4e, +0x70,0x4, 0x7a,0x37,0x62,0xdc,0x12,0x36,0xc4,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12, +0x64,0xc0,0x12,0x24,0xf, 0x1b,0xfd,0x12,0x64,0xc9,0x12,0x5f,0xe4,0x6d,0x66,0x7d, +0x26,0x3e,0x24,0x49,0x32,0x4a,0x71,0xbe,0x34,0x2, 0x0, 0x28,0xf, 0x7d,0x12,0x2e, +0x14,0x4a,0x71,0x9e,0x34,0x2, 0x0, 0x1b,0x18,0x30,0x80,0x6, 0x6d,0x33,0x59,0x32, +0x4a,0x71,0xb, 0x64,0xbe,0x64,0x2, 0x6, 0x78,0xd5,0x7e,0x34,0x4a,0x71,0x7a,0x37, +0x4e,0x81,0xe4,0x7a,0xb3,0x76,0x8c,0x7a,0xb3,0x76,0x8b,0x12,0x64,0xad,0x12,0x64, +0xaa,0x12,0x6, 0xc5,0x7e,0x34,0x0, 0x1, 0x7e,0x27,0x63,0x2, 0x12,0x6, 0x48,0x7e, +0x34,0x0, 0x1, 0x7e,0x27,0x63,0x2, 0x12,0x6, 0xc5,0x7e,0x34,0x0, 0x2, 0x7e,0x27, +0x63,0x4, 0x12,0x6, 0x48,0x7e,0x34,0x0, 0x2, 0x7e,0x27,0x63,0x4, 0x12,0x6, 0xc5, +0x7e,0x34,0x0, 0x8, 0x7e,0x27,0x63,0x6, 0x12,0x6, 0x48,0x7e,0x34,0x0, 0x8, 0x7e, +0x27,0x63,0x6, 0x12,0x6, 0xc5,0x7e,0x34,0x0, 0x17,0x7e,0x27,0x63,0x8, 0x12,0x6, +0x48,0x7e,0x34,0x0, 0x17,0x7e,0x27,0x63,0x8, 0x12,0x6, 0xc5,0x12,0x64,0xf4,0x12, +0x6, 0x48,0x12,0x64,0xf4,0x12,0x6, 0xc5,0x12,0x64,0xeb,0x12,0x6, 0x48,0x12,0x64, +0xeb,0x12,0x6, 0xc5,0x12,0x64,0xe2,0x12,0x6, 0x48,0x12,0x64,0xe2,0x12,0x6, 0xc5, +0x7e,0x34,0x1, 0x6, 0x7e,0x27,0x63,0xc, 0x12,0x6, 0x48,0x7e,0x34,0x1, 0x6, 0x7e, +0x27,0x63,0xc, 0x12,0x6, 0xc5,0x6d,0x66,0x80,0x56,0x12,0x64,0xa1,0x7e,0x37,0x6e, +0xb5,0xbd,0x36,0x28,0x1e,0x7e,0xb3,0x6e,0xc1,0x70,0xc, 0x12,0x64,0x76,0x60,0x35, +0x3e,0x14,0x14,0x78,0xfb,0x80,0x2e,0x12,0x64,0x76,0x60,0x17,0x3e,0x14,0x14,0x78, +0xfb,0x80,0x10,0x7e,0xb3,0x6e,0xc1,0x70,0x12,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14, +0x14,0x78,0xfb,0x12,0x64,0x81,0x12,0x64,0x93,0x80,0x10,0x12,0x64,0x76,0x60,0x5, +0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0x81,0x12,0x64,0x8c,0x12,0x47,0xf5,0xb, 0x64, +0x12,0x65,0xc3,0xbd,0x36,0x38,0xa3,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x62,0xb8,0x12, +0x47,0xd0,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x62,0xdc,0x12,0x47,0xd7,0x12,0x4f,0xe6, +0x12,0x65,0x51,0xda,0x3b,0x22,0x7d,0x57,0x5e,0x54,0x0, 0xf, 0x7e,0x14,0x0, 0x1, +0x22,0x7d,0x27,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x22,0x3e,0x24,0x2e,0x24, +0x62,0xb8,0x22,0x3e,0x24,0x2e,0x24,0x62,0xdc,0x22,0x7e,0x73,0x6e,0xb0,0xa, 0x37, +0x22,0x7d,0x36,0x3e,0x34,0x49,0x73,0x6e,0xc2,0x22,0x12,0x6, 0x48,0x6d,0x33,0x7e, +0x27,0x63,0x0, 0x22,0x7e,0x8, 0x62,0xb8,0x7e,0x34,0x0, 0x48,0xe4,0x2, 0x24,0x34, +0x7e,0x18,0xc, 0x18,0x7e,0x8, 0x63,0x12,0x22,0x7e,0x34,0x2, 0x6, 0x7a,0x35,0x28, +0x7e,0x8, 0x4a,0x71,0x7e,0x18,0x63,0x12,0x22,0x12,0x5f,0xe4,0x7e,0x35,0x26,0xb, +0x34,0x22,0x7e,0x34,0x1, 0x2, 0x7e,0x27,0x63,0x10,0x22,0x7e,0x34,0x1, 0x1, 0x7e, +0x27,0x63,0xe, 0x22,0x7e,0x34,0x1, 0x0, 0x7e,0x27,0x63,0xa, 0x22,0x7e,0x34,0x1, +0x2, 0x7e,0x24,0x3, 0x3c,0x22,0x7e,0x34,0x1, 0x1, 0x7e,0x24,0x7, 0x8, 0x22,0x7e, +0x34,0x0, 0x8, 0x7e,0x27,0x63,0x6, 0x4e,0x40,0x40,0x22,0x7e,0x34,0x0, 0x17,0x7e, +0x27,0x63,0x8, 0x5e,0x24,0xe0,0x3f,0x22,0x7e,0x34,0x0, 0x1, 0x7e,0x27,0x63,0x2, +0x5e,0x24,0x80,0x0, 0x22,0x7e,0x34,0x1, 0x6, 0x7e,0x27,0x63,0xc, 0x5e,0x24,0xfc, +0x0, 0x22,0x7e,0x34,0x0, 0x2, 0x7e,0x27,0x63,0x4, 0x5e,0x40,0x9c,0x4e,0x40,0x21, +0x22,0xca,0xd8,0xca,0x79,0x7c,0xf7,0x7c,0xeb,0xe4,0x12,0x35,0x28,0x6c,0xdd,0x7e, +0x70,0xb5,0xac,0x7d,0x2e,0x34,0x1, 0x0, 0x2e,0x34,0x0, 0x16,0x7a,0x35,0x28,0x12, +0x7, 0x40,0x7a,0x35,0x2a,0x7e,0x35,0x28,0x12,0x8, 0x0, 0x7a,0x35,0x2c,0x7e,0x25, +0x2a,0x5e,0x50,0xf8,0x7a,0x25,0x2a,0x5e,0x70,0xf8,0x7a,0x35,0x2c,0x7c,0xbe,0x54, +0x5, 0xa, 0x3b,0x4e,0x35,0x2a,0x7a,0x35,0x2a,0x7c,0xbf,0x54,0x5, 0xa, 0x3b,0x4e, +0x35,0x2c,0x7a,0x35,0x2c,0x7e,0x35,0x28,0x7e,0x25,0x2a,0x12,0x6, 0x48,0x7e,0x35, +0x28,0x7e,0x25,0x2c,0x12,0x6, 0xc5,0xb, 0xd0,0xbe,0xd0,0x3, 0x40,0xa1,0xda,0x79, +0xda,0xd8,0x22,0x7e,0x37,0x6e,0xb7,0x2e,0x37,0x6e,0xb5,0x22,0x7e,0x34,0x4, 0x71, +0xca,0x39,0x7e,0x34,0x1c,0x43,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x6e,0xad,0x12,0x24, +0xf, 0x1b,0xfd,0x12,0x65,0xc3,0x7a,0x37,0x73,0x21,0xe4,0x7a,0xb3,0x6e,0xb3,0x7a, +0xb3,0x6e,0xb4,0x90,0x21,0xd9,0x93,0x70,0x6, 0x7e,0x63,0x6e,0xb0,0x80,0x4, 0x7e, +0x63,0x6e,0xaf,0x7e,0x70,0x40,0xac,0x67,0x1b,0x34,0x7a,0x37,0x73,0x23,0x22,0x24, +0x52,0x68,0xa, 0x4, 0x78,0x29,0x6d,0x33,0x7a,0x37,0x4a,0x63,0x22,0x7e,0x63,0x6e, +0xaf,0x7e,0x73,0x6e,0xb0,0xac,0x76,0x3e,0x34,0x7a,0x37,0x4a,0x63,0x1e,0x34,0xa, +0x36,0x7a,0x73,0x76,0x98,0x7e,0x37,0x4a,0x63,0x1e,0x34,0x7a,0x73,0x76,0x99,0x22, +0x12,0x47,0xb6,0x7e,0x73,0x77,0xd8,0x7a,0x73,0x76,0x83,0x12,0x66,0x8f,0xe4,0x7a, +0xb3,0x6e,0x7d,0x7a,0xb3,0x6e,0x7c,0x2, 0x66,0x5a,0x7e,0x73,0x76,0x31,0x7a,0x73, +0x77,0xfa,0x22,0x12,0x66,0x88,0x12,0x66,0x6c,0x2, 0x66,0x5a,0x7e,0x8, 0x78,0x4, +0x2, 0x66,0x73,0xb, 0xa, 0x30,0xbe,0x37,0x77,0xd0,0x28,0x6, 0x9e,0x37,0x77,0xd0, +0x80,0x2, 0x6d,0x33,0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x25,0xb1,0x2, 0x66,0x73,0x7e, +0x73,0x76,0x82,0x7a,0x73,0x73,0x1e,0x22,0x24,0x6f,0x68,0x12,0x14,0x68,0x14,0x14, +0x68,0x16,0x14,0x68,0x18,0xb, 0xb2,0x78,0x19,0x7e,0xb3,0x1, 0x8f,0x22,0x7e,0xb3, +0x1, 0x90,0x22,0x7e,0xb3,0x1, 0x91,0x22,0x7e,0xb3,0x1, 0x92,0x22,0x7e,0xb3,0x1, +0x93,0x22,0x74,0xfe,0x22,0x6d,0x33,0x7a,0x37,0x4a,0x63,0xd2,0x4, 0x12,0x36,0xe7, +0x12,0x33,0xfb,0xe5,0x1e,0x12,0x3b,0xdd,0x2, 0x47,0x1c,0x24,0xab,0x68,0x10,0x24, +0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f,0x74,0x5, 0x80,0x2d,0x7e, +0xb3,0x3, 0xff,0xb4,0x5, 0x2a,0x12,0x67,0x21,0x12,0xd2,0xaa,0x2, 0x67,0x61,0x7e, +0xb3,0x3, 0xff,0xb4,0x5, 0x1a,0x12,0x67,0x21,0x75,0xe9,0xff,0x22,0x7e,0xb3,0x3, +0xff,0xb4,0x5, 0xc, 0x12,0x67,0x21,0x2, 0x67,0x44,0x74,0x1, 0x7a,0xb3,0x3, 0xff, +0x22,0x7e,0x34,0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa, +0x12,0xd3,0x1, 0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d, +0x33,0x78,0xe6,0x22,0x2, 0x67,0x47,0x75,0xe7,0x6b,0xe4,0x7e,0x34,0x1, 0x4, 0x7e, +0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x5, 0x7a,0x1b,0xb0,0x75,0xe9,0xff, +0x22,0x2, 0x67,0x47,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba,0x12,0x70, +0x1b,0x80,0x25,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3,0x7c,0x7a, +0x12,0x70,0x46,0x80,0x13,0xbe,0x30,0x80,0x40,0xe, 0xbe,0x30,0xef,0x38,0x9, 0x7c, +0xb3,0x24,0x80,0x7c,0x7a,0x12,0x70,0xa1,0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x66, +0xdb,0x74,0x1, 0x7a,0xb3,0x3, 0xff,0x22,0x7c,0x6b,0x12,0x67,0xe8,0x78,0x5, 0x7c, +0xb6,0x2, 0x67,0x64,0xb4,0x4, 0x5, 0x7c,0xb6,0x2, 0x47,0xfe,0x22,0x30,0x90,0x19, +0xc2,0x90,0xe5,0x13,0x70,0x9, 0x75,0x13,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e, +0x71,0x91,0xe5,0x1a,0x12,0x67,0xa8,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a, +0xe5,0x1a,0x12,0x70,0x82,0xf5,0x91,0x22,0x7e,0xb3,0x76,0x7c,0xc4,0x54,0x7, 0x22, +0x7e,0xa3,0x6e,0x7c,0xbe,0xa0,0x0, 0x38,0x3, 0x2, 0x68,0xa6,0x7e,0xb3,0x78,0x9, +0xbe,0xb0,0x32,0x40,0x2, 0x1, 0x88,0x4, 0x7a,0xb3,0x78,0x9, 0xbe,0xa0,0x2, 0x28, +0xe, 0x7e,0xb3,0x78,0x9, 0x4, 0x7a,0xb3,0x78,0x9, 0x4, 0x7a,0xb3,0x78,0x9, 0x7e, +0xb3,0x78,0x8, 0x70,0x25,0x7e,0x37,0x6d,0x6e,0x7a,0x37,0x78,0xa, 0x7e,0x37,0x6d, +0x70,0x7a,0x37,0x78,0xc, 0x74,0x1, 0x7a,0xb3,0x78,0x8, 0xe4,0x7a,0xb3,0x78,0x7, +0x7e,0xb3,0x6d,0x72,0x7a,0xb3,0x78,0xe, 0x80,0x44,0x7e,0x27,0x6d,0x70,0x7d,0x32, +0x9e,0x37,0x78,0xc, 0xbe,0x34,0x0, 0x0, 0x8, 0x6, 0x9e,0x27,0x78,0xc, 0x80,0x4, +0x6d,0x22,0x9d,0x23,0x7e,0x37,0x6d,0x6e,0x7d,0x13,0x9e,0x17,0x78,0xa, 0xbe,0x14, +0x0, 0x0, 0x8, 0x6, 0x9e,0x37,0x78,0xa, 0x80,0x4, 0x6d,0x33,0x9d,0x31,0x2d,0x32, +0xbe,0x34,0x0, 0x32,0x28,0x8, 0x80,0x0, 0x74,0x1, 0x7a,0xb3,0x78,0x7, 0x7e,0xb3, +0x78,0x7, 0xb4,0x1, 0x1e,0xbe,0xa0,0x1, 0x78,0x19,0x7e,0x73,0x6d,0x72,0xbe,0x73, +0x78,0xe, 0x68,0xf, 0x80,0x0, 0xe4,0x7a,0xb3,0x78,0x8, 0x7a,0xb3,0x78,0x7, 0x7a, +0xb3,0x78,0x9, 0x22,0x7e,0x73,0x6c,0xf3,0x7a,0x73,0x6c,0xf4,0x7e,0x73,0x6e,0x7c, +0x7a,0x73,0x6e,0x7d,0xe4,0x7a,0xb3,0x6e,0x80,0x7e,0x73,0x77,0xd8,0x7a,0x73,0x76, +0x35,0x7e,0x73,0x6e,0xa2,0x7a,0x73,0x5c,0xc3,0x22,0x7e,0xb3,0x78,0x6, 0x4, 0x7a, +0xb3,0x78,0x6, 0x7e,0x73,0x78,0x6, 0x7a,0x73,0x76,0x1b,0x22,0x7e,0x37,0x77,0xe9, +0xb, 0x34,0x7a,0x37,0x77,0xe9,0x7e,0x37,0x77,0xeb,0xbe,0x37,0x77,0xe9,0x28,0x3, +0x2, 0x69,0x7, 0x22,0x2, 0x68,0xec,0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf, +0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0, +0xd0,0xc0,0x83,0xc0,0x82,0xc2,0x8f,0x12,0x69,0x4, 0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xe4, +0x12,0x6c,0x6d,0x12,0x6b,0xbc,0x12,0x69,0xf0,0x12,0x69,0xe5,0x12,0x6b,0xa5,0x7e, +0x34,0x0, 0x1c,0x12,0xc, 0x65,0x12,0x2c,0x6f,0x12,0x6b,0x95,0x12,0x6b,0x84,0x12, +0x6b,0x8f,0x12,0x6b,0x89,0x12,0x6b,0xb0,0x12,0x6c,0x8b,0x12,0x6a,0xad,0x12,0x6c, +0xce,0x12,0x69,0xc0,0x12,0x6b,0x2, 0xd2,0xaf,0x12,0x6a,0x2a,0x12,0x6a,0x6, 0x90, +0x1c,0x45,0xe4,0x93,0xca,0xb8,0x90,0x1c,0x46,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0x1, +0x33,0xda,0xb8,0x2, 0x69,0x96,0xca,0x79,0x7c,0xf7,0x7c,0xeb,0x7c,0x7f,0x12,0xb, +0x7b,0xa9,0xd6,0xcb,0x5e,0xe0,0x3f,0x5e,0xf0,0x3f,0x7c,0x4e,0x6c,0x55,0xa, 0x3f, +0x2d,0x32,0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, 0x32,0xa9,0xc6,0xcb,0xda,0x79,0x22, +0x2, 0x69,0xc3,0xd2,0x0, 0x12,0x4d,0x5e,0xa9,0xd0,0xcb,0xa9,0xc6,0xca,0x12,0x6b, +0xc9,0xa9,0xd3,0x9e,0xa9,0xc3,0xb9,0xc2,0x8a,0xd2,0xaa,0x2, 0x69,0xde,0xa9,0xd0, +0x9e,0xa9,0xd7,0x9e,0x22,0xc2,0x8d,0xc2,0x8f,0x12,0x6a,0xfa,0xa9,0xc0,0x93,0x22, +0x75,0xec,0xff,0x75,0xee,0xff,0x75,0xeb,0x23,0x75,0xac,0xc0,0x12,0x6c,0x7b,0xa9, +0xd5,0xad,0xa9,0xc5,0xed,0x22,0x7e,0x8, 0x6b,0x34,0x12,0x6a,0x5f,0x7e,0x34,0x0, +0x20,0x7a,0x35,0x26,0x7e,0x18,0x0, 0x20,0x12,0x6a,0x69,0x2, 0x6a,0x1e,0xa9,0xc5, +0xca,0xa9,0xc7,0x94,0xe4,0x7a,0xb3,0x78,0x43,0x22,0x6c,0x77,0xa9,0xc7,0xb3,0xa9, +0xc6,0xb3,0xd2,0xc8,0x43,0xed,0xf, 0xc2,0xea,0xb, 0x70,0xbe,0x70,0x3, 0x28,0x3, +0x7e,0x70,0x3, 0xa, 0x57,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2e,0x54,0x0, +0x3, 0xf5,0xb3,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0x6a,0x5f,0x2, 0x6a,0x1e,0xa9, +0xd7,0x94,0x74,0xa5,0x7a,0xb3,0x78,0x43,0x22,0x12,0x6a,0x77,0x7e,0x35,0x26,0x12, +0x6c,0xb2,0xa9,0xd2,0xb4,0xd3,0x22,0x7d,0x52,0xf5,0x2a,0x7c,0xb6,0x7c,0xa5,0xa, +0x44,0xf5,0x29,0x7f,0x21,0xf5,0x28,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0x6a,0xa2,0xe5, +0x2a,0x12,0x6a,0xa2,0xe5,0x29,0x12,0x6a,0xa2,0xe5,0x28,0x12,0x6a,0xa2,0xe4,0x2, +0x6a,0xa2,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0xe4,0x7a,0xb3, +0x76,0x7c,0x7e,0x8, 0x28,0x3b,0x12,0x6b,0x9c,0x7e,0x8, 0x28,0x79,0x7e,0x34,0x0, +0x3e,0x12,0x24,0x34,0x7e,0x18,0x28,0x3b,0x7a,0x1f,0x28,0xe0,0x12,0x6a,0xdf,0x2, +0x6a,0xd2,0x75,0x13,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x76,0x7c,0xf5,0x91,0x22,0x2, +0x6a,0xe2,0xc2,0x92,0x12,0x6a,0xfa,0x90,0x1b,0xd8,0xe4,0x93,0x54,0xfe,0xf5,0x92, +0xd2,0xe8,0xc2,0xc0,0xa9,0xd4,0x95,0xd2,0xad,0x22,0x75,0x91,0x0, 0xc2,0x90,0xc2, +0x91,0x22,0xa9,0xd2,0xea,0xa9,0xc2,0xea,0x6d,0x33,0x7e,0xf, 0x78,0x39,0x79,0x30, +0x0, 0x10,0x12,0x4c,0xff,0x4e,0x34,0xdc,0xe, 0x1b,0xa, 0x30,0x7e,0x34,0x1, 0xc2, +0x7e,0xf, 0x78,0x39,0x79,0x30,0x0, 0x1e,0x7e,0xf, 0x78,0x39,0x12,0x3f,0x7c,0x4e, +0x70,0x10,0x1b,0xa, 0x30,0x12,0x6c,0x9b,0x12,0xb, 0xe5,0x7e,0x34,0xff,0xff,0x7e, +0xf, 0x78,0x39,0x79,0x30,0x0, 0x2, 0x6d,0x33,0x7e,0xf, 0x78,0x39,0x79,0x30,0x0, +0x14,0x12,0x6b,0x7b,0x7e,0x34,0xf0,0x4f,0x12,0x6b,0x7b,0xd2,0x4, 0x12,0x37,0xba, +0x53,0xc3,0xf8,0x75,0xc3,0x85,0x53,0xc2,0xfc,0x43,0xc2,0x81,0xd2,0xac,0x2, 0x6b, +0x71,0x90,0x21,0x50,0xe4,0x93,0x7a,0xb3,0x77,0xd9,0x22,0x7e,0xf, 0x78,0x39,0x79, +0x30,0x0, 0x4, 0x22,0xc2,0x88,0xd2,0xa8,0x22,0xa9,0xd5,0xcd,0xd2,0x99,0x22,0xa9, +0xd6,0xcd,0xd2,0x98,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e,0x34,0x0, 0x3e, +0x74,0xff,0x2, 0x24,0x34,0xa9,0xc3,0xcb,0xc2,0xcd,0xc2,0xcc,0xa9,0xd6,0xea,0x22, +0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xa9,0xc5,0xcb,0xa9, +0xd1,0xcb,0xa9,0xd2,0xca,0xa9,0xd2,0xcb,0x22,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x75, +0x9d,0x0, 0x75,0x9c,0x20,0x22,0xca,0xb8,0xca,0x39,0x12,0x6b,0xc9,0x12,0x69,0xde, +0x7e,0x37,0x77,0xd0,0xb, 0x34,0x7a,0x37,0x77,0xd0,0x7e,0x37,0x77,0xe2,0xb, 0x34, +0x7a,0x37,0x77,0xe2,0x7e,0xb3,0x76,0x31,0xb4,0x1, 0x40,0x7e,0xb3,0x77,0xe4,0x4, +0x7a,0xb3,0x77,0xe4,0x7e,0x73,0x77,0xe4,0xbe,0x70,0xa, 0x28,0x2e,0xe4,0x7a,0xb3, +0x77,0xe4,0x7e,0x73,0x77,0xdb,0xbe,0x73,0x78,0x6, 0x78,0x8, 0x7e,0x37,0x77,0xd2, +0xb, 0x34,0x80,0xa, 0x7e,0x73,0x78,0x6, 0x7a,0x73,0x77,0xdb,0x6d,0x33,0x7a,0x37, +0x77,0xd2,0xbe,0x34,0x0, 0xfa,0x28,0x3, 0x75,0xe9,0xff,0x7e,0xb3,0x77,0xd4,0x60, +0x5, 0x14,0x7a,0xb3,0x77,0xd4,0x7e,0xb3,0x77,0xd4,0x70,0x2, 0xd2,0x14,0x7e,0x37, +0x29,0xfd,0xb, 0x34,0x7a,0x37,0x29,0xfd,0x7e,0x37,0x77,0xde,0xbe,0x34,0x0, 0x0, +0x28,0x6, 0x1b,0x34,0x7a,0x37,0x77,0xde,0xda,0x39,0xda,0xb8,0x32,0xa9,0xc5,0xca, +0xbe,0xb0,0x8, 0x50,0x2, 0xf5,0xcc,0x75,0xe6,0x0, 0x22,0xa9,0xc5,0xca,0x75,0xed, +0x8f,0x75,0xad,0xb0,0xa9,0xc7,0x94,0xa9,0xd4,0x94,0x22,0xc2,0x8e,0x43,0x89,0x20, +0x75,0x8d,0x1, 0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x6d,0x33,0x7e,0xf, 0x78, +0x39,0x79,0x30,0x0, 0x16,0x7e,0x34,0x1, 0x2c,0x7e,0xf, 0x78,0x39,0x79,0x30,0x0, +0x18,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0x75,0xb7, +0x0, 0x75,0xb8,0x0, 0x75,0xf7,0x0, 0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9, +0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xd4,0xb7,0xc2,0xbc,0xa9,0xc2, +0xb7,0xc2,0xba,0xa9,0xc1,0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0x22,0x7e,0xa3, +0x27,0x72,0x7e,0x70,0x4, 0xac,0x7a,0xb, 0x34,0xbe,0x37,0x76,0xd8,0x40,0x39,0x7e, +0x37,0x76,0xd8,0xb, 0x34,0x7a,0x37,0x76,0xd8,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e, +0xb3,0x76,0x5d,0x22,0xbe,0x34,0x0, 0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, +0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25,0x9, 0xb2,0x78,0x28,0x22,0x9e,0x34,0x0, 0x3, +0x2e,0x37,0x25,0xb3,0x7e,0x39,0xb0,0x22,0x74,0xff,0x22,0x7c,0x2b,0xa5,0xba,0xfa, +0x5, 0x7e,0xb3,0x4a,0x66,0x22,0xa5,0xba,0x0, 0x5, 0x7e,0xb3,0x76,0x7c,0x22,0xbe, +0x20,0x3, 0x38,0x13,0x30,0x20,0x6, 0x7e,0x18,0x28,0x3b,0x80,0x4, 0x7e,0x18,0x28, +0x79,0x7a,0x1f,0x28,0xe0,0x80,0x5, 0xbe,0x20,0x6e,0x38,0xe, 0xa, 0x2, 0x7e,0x1f, +0x28,0xe0,0x2d,0x30,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0x20,0xd3,0x68,0x4, 0xa5, +0xba,0xd4,0x11,0xa5,0xba,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x76,0xd8,0x80,0x2, 0x15, +0x1a,0x2, 0x6c,0xfe,0xa5,0xba,0xf6,0xc, 0x7e,0x34,0x1b,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x50,0x22,0xa5,0xba,0xf7,0xa, 0x7e,0x34,0x1b,0xd6,0x12,0x29,0xdb,0xa, +0x56,0x22,0xbe,0x20,0xf8,0x68,0x4, 0xa5,0xba,0xf9,0x1d,0xa5,0xba,0xf8,0x8, 0x6d, +0x33,0x7a,0x37,0x76,0xd8,0x80,0x2, 0x15,0x1a,0x7e,0x37,0x76,0xd8,0x7d,0x23,0xb, +0x24,0x7a,0x27,0x76,0xd8,0x2, 0x6e,0x57,0xbe,0x20,0xeb,0x68,0x4, 0xa5,0xba,0xec, +0x5, 0x7c,0xb2,0x2, 0x6f,0x9b,0xbe,0x20,0x99,0x68,0x4, 0xa5,0xba,0x9a,0x2a,0x7e, +0xb3,0x76,0x1a,0x7c,0xab,0xbe,0xa0,0x20,0x40,0xd, 0xbe,0xa0,0x40,0x50,0x8, 0xa, +0x3a,0x9, 0x33,0x6b,0x14,0x80,0x3, 0x12,0x6f,0xe6,0x4, 0x7a,0xb3,0x76,0x1a,0xa5, +0xba,0x9a,0x3, 0x75,0x1a,0x99,0x7c,0xb3,0x22,0xbe,0x20,0x80,0x40,0xc, 0xbe,0x20, +0xef,0x38,0x7, 0xa, 0x32,0x9, 0xb3,0x75,0x8a,0x22,0xa5,0xba,0xfc,0x5, 0x7e,0xb3, +0x76,0x31,0x22,0xa5,0xba,0xfe,0xd, 0x7e,0x23,0x77,0xe1,0x74,0x27,0xac,0xb2,0x9, +0xb5,0x28,0xe7,0x22,0x74,0xff,0x22,0x7e,0x24,0xe, 0x6, 0x2d,0x32,0x2, 0x6e,0x6a, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0xf5,0x7a,0x71,0x82,0x7a,0x61,0x83, +0xe4,0x93,0x22,0x74,0x1, 0x7a,0xb3,0x78,0x42,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x6, +0xe4,0x7a,0xb3,0x78,0x42,0x22,0x7e,0xb4,0x21,0x53,0x7d,0x3b,0x12,0x6e,0x6a,0x7c, +0x7b,0x1e,0x70,0x7a,0x73,0x6e,0x8a,0x7e,0xa4,0x0, 0x96,0x7a,0xa7,0x6e,0x8b,0x12, +0x6f,0xc4,0x12,0xda,0xdf,0x7e,0xa3,0x6c,0xde,0xbe,0xa0,0x0, 0x38,0x2, 0xe1,0x41, +0xbe,0xa0,0x8, 0x28,0x1f,0x7e,0x37,0x6c,0xe4,0xbe,0x34,0x1, 0x90,0x58,0x15,0x7d, +0x3b,0x12,0x6e,0x6a,0x1e,0xb0,0xa, 0x3b,0x7d,0x2a,0x7e,0x14,0x0, 0x8c,0x7e,0x4, +0x0, 0x82,0x80,0x66,0xbe,0xa0,0x6, 0x28,0x1b,0x7e,0x37,0x6c,0xe4,0xbe,0x34,0x1, +0xf4,0x58,0x11,0x7d,0x3b,0x12,0x6e,0x6a,0xa, 0x3b,0x7e,0x24,0x0, 0xa0,0x7d,0x1a, +0x7d,0xa, 0x80,0x46,0xbe,0xa0,0x4, 0x28,0x1f,0x7e,0xa7,0x6c,0xe4,0xbe,0xa4,0x2, +0x58,0x58,0x15,0x7d,0x3b,0x12,0x6e,0x6a,0xa, 0x3b,0x7e,0x24,0x0, 0xb4,0x7e,0x14, +0x0, 0xaa,0x7e,0x4, 0x0, 0xc8,0x80,0x22,0xbe,0xa0,0x2, 0x28,0x24,0x7e,0xa7,0x6c, +0xe4,0xbe,0xa4,0x3, 0x20,0x58,0x1a,0x7d,0x3b,0x12,0x6e,0x6a,0xa, 0x3b,0x7e,0x24, +0x0, 0xdc,0x7e,0x14,0x0, 0xd2,0x7e,0x4, 0x0, 0xe6,0x12,0x6f,0x7c,0x80,0x7, 0x80, +0x0, 0xe4,0x7a,0xb3,0x78,0x42,0x7e,0xb3,0x78,0x42,0x70,0x27,0x90,0x21,0x53,0xe4, +0x93,0xa, 0x3b,0x7e,0x14,0x21,0x5b,0x12,0x6f,0xd1,0x7e,0x14,0x21,0x5d,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x10,0x7e,0x54,0x21,0x67,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x0, +0x2, 0x6f,0x7c,0xd2,0x23,0x22,0x12,0x6f,0xd9,0x2, 0x6e,0x73,0x7a,0x73,0x6e,0x8a, +0x7a,0x27,0x6e,0x8b,0x7a,0x17,0x6e,0x8d,0x7a,0x7, 0x6e,0x97,0x6d,0x33,0x9d,0x30, +0x12,0x2f,0xa6,0x12,0x2b,0x6f,0x7a,0x73,0x76,0xb, 0x22,0xb4,0xeb,0x3, 0x75,0x1b, +0x0, 0xe5,0x1b,0xa, 0x3b,0x2e,0x34,0x0, 0x16,0x12,0x6e,0x6a,0x7c,0xab,0x5, 0x1b, +0xe5,0x1b,0xb4,0x3, 0x9, 0x75,0x1b,0x0, 0x6d,0x33,0x7a,0x37,0x76,0xda,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0x34,0x0, 0x8c,0x7a,0x37,0x6e,0x8d,0x22,0x7e,0x14,0x21, +0xec,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0x22,0x7e,0x8, 0x78,0x42,0x7e,0x34,0x0, +0x1, 0x74,0xff,0x2, 0x24,0x34,0x7e,0x24,0x1b,0xd8,0xa, 0x3b,0x2d,0x32,0x6d,0x22, +0x2e,0x24,0x0, 0xff,0x7e,0x1b,0x30,0x22,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83, +0xc0,0x82,0x12,0x67,0xbd,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0x32, +0x12,0x70,0x17,0x75,0x13,0x0, 0x32,0xa9,0xc0,0x93,0x22,0x7a,0xb3,0x76,0x7c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x76,0x31,0x22,0x74,0x1, 0x7a,0xb3,0x76,0x31, +0xe4,0x7a,0xb3,0x76,0x7c,0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27, +0x76,0xda,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27, +0x76,0xda,0x15,0x1a,0x7e,0x27,0x76,0xda,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf, +0x9, 0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x76,0xda,0x75,0x1a, +0xea,0x22,0x7c,0x7b,0x6c,0xaa,0x12,0x67,0xe8,0x78,0x9, 0x7c,0xb7,0x12,0x6d,0x4b, +0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, 0x7c,0xb7,0x12,0x39,0x27,0x7c,0xab,0x7c,0xba, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x29,0x2e,0x60,0xfd,0x68,0x24,0x1b,0x61,0x68, +0x20,0x2e,0x60,0xfa,0x68,0x1b,0x1b,0x60,0x68,0x17,0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x76,0xa, 0xd2,0x23,0x7a,0xb3,0x76,0x8, 0xb4,0x25,0x6, 0xd2,0x24,0x7a,0x73,0x76, +0x7, 0x22,0x7e,0x18,0x6e,0x22,0x6c,0x33,0x80,0x7e,0x7e,0x10,0x9, 0xac,0x13,0x9, +0x20,0x6d,0x72,0x90,0x21,0x51,0xe4,0x93,0xbc,0xb2,0x28,0x6a,0x7c,0xa2,0x5e,0xa0, +0xf, 0x74,0x9, 0xa4,0x2d,0x53,0x7d,0x42,0x7e,0x2b,0xa0,0x49,0x40,0x6d,0x70,0xbe, +0x44,0x0, 0x40,0x38,0x4c,0x49,0x40,0x6d,0x6e,0xbe,0x44,0x0, 0x0, 0x40,0x42,0x7e, +0xf4,0x21,0xde,0x12,0x9f,0x81,0xbd,0x40,0x38,0x37,0x4c,0xaa,0x78,0x38,0x7e,0xb3, +0x28,0xdf,0x70,0x32,0x7e,0xb3,0x6e,0x7c,0xb4,0x1, 0x2b,0x74,0x1, 0x7a,0xb3,0x28, +0xdf,0x7e,0x90,0x3, 0x7e,0x10,0x9, 0xac,0x12,0x7f,0x71,0x2d,0xf0,0x7a,0x7b,0x90, +0x74,0x3, 0x7f,0x71,0x2d,0xf0,0x39,0xb7,0x0, 0x1, 0xe4,0x7a,0xb3,0x25,0xae,0x80, +0x5, 0xe4,0x7a,0xb3,0x28,0xdf,0xb, 0x30,0x7e,0xb3,0x6e,0x89,0xbc,0xb3,0x28,0x2, +0x1, 0xda,0x7e,0xb3,0x6e,0x7c,0x70,0xa, 0x12,0x71,0x73,0x28,0x5, 0xe4,0x7a,0xb3, +0x28,0xdf,0x22,0x7e,0x73,0x6e,0x7d,0xbe,0x70,0x0, 0x22,0x74,0x1, 0x7a,0xb3,0x6d, +0x13,0x7e,0xb3,0x6c,0xff,0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x6d,0x13,0x12,0x71,0x73, +0x28,0x5, 0xe4,0x7a,0xb3,0x6d,0x13,0x7e,0xb3,0x25,0xae,0x70,0x5, 0xe4,0x7a,0xb3, +0x6d,0x13,0x7e,0xb3,0x78,0x20,0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x6d,0x13,0x7e,0x34, +0x22,0x32,0x12,0x29,0xdb,0xbe,0x37,0x75,0x2, 0x50,0x5, 0xe4,0x7a,0xb3,0x6d,0x13, +0x7e,0xb3,0x76,0x5a,0x70,0xa, 0x12,0xbe,0x39,0x28,0x5, 0xe4,0x7a,0xb3,0x6d,0x13, +0x7e,0xb3,0x76,0x2f,0xb4,0x1, 0x17,0x7e,0x73,0x29,0xfc,0xbe,0x70,0x3c,0x50,0xe, +0xbe,0x70,0x0, 0x28,0x9, 0xe5,0x1e,0x60,0x5, 0xe4,0x7a,0xb3,0x6d,0x13,0x22,0x12, +0x71,0x7b,0x12,0x73,0x24,0x12,0x73,0xff,0x2, 0x71,0xfb,0x7e,0xb3,0x6d,0xd, 0xb4, +0x1, 0x18,0x12,0x73,0xf5,0xbe,0x73,0x78,0x18,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0xd, +0x7e,0xb3,0x78,0x18,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x18,0x7e, +0xb3,0x6d,0xd, 0x70,0x53,0x12,0x73,0x1d,0x78,0x15,0x7e,0xb3,0x6d,0xe, 0xb4,0x1, +0x7, 0x7e,0xb3,0x78,0x1a,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x1a,0x80,0x18,0xbe, +0xa0,0x1, 0x78,0x13,0x7e,0xb3,0x6d,0xf, 0xb4,0x1, 0x7, 0x7e,0xb3,0x78,0x1b,0x4, +0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x1b,0x7e,0x73,0x78,0x1a,0xbe,0x70,0x3, 0x50,0x9, +0x7e,0x73,0x78,0x1b,0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x6d,0xd, 0xe4, +0x7a,0xb3,0x78,0x1a,0x7a,0xb3,0x78,0x1b,0x7e,0xb3,0x6d,0x10,0xb4,0x1, 0x18,0x12, +0x73,0xf5,0xbe,0x73,0x78,0x19,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0x10,0x7e,0xb3,0x78, +0x19,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x19,0x7e,0xb3,0x6d,0x10, +0x70,0x53,0x12,0x73,0x1d,0x78,0x15,0x7e,0xb3,0x6d,0x11,0xb4,0x1, 0x7, 0x7e,0xb3, +0x78,0x1c,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x1c,0x80,0x18,0xbe,0xa0,0x1, 0x78, +0x13,0x7e,0xb3,0x6d,0x12,0xb4,0x1, 0x7, 0x7e,0xb3,0x78,0x1d,0x4, 0x80,0x1, 0xe4, +0x7a,0xb3,0x78,0x1d,0x7e,0x73,0x78,0x1c,0xbe,0x70,0x3, 0x50,0x9, 0x7e,0x73,0x78, +0x1d,0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x6d,0x10,0xe4,0x7a,0xb3,0x78, +0x1c,0x7a,0xb3,0x78,0x1d,0x7e,0xb3,0x6d,0x13,0xb4,0x1, 0x1a,0x7e,0x73,0x6c,0xfd, +0xbe,0x73,0x78,0x1e,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0x13,0x7e,0xb3,0x78,0x1e,0x4, +0x80,0x6, 0x74,0x1, 0x80,0x2, 0x74,0x1, 0x7a,0xb3,0x78,0x1e,0x22,0x7e,0xa3,0x25, +0xaf,0x4c,0xaa,0x22,0xd2,0x0, 0xe4,0x7a,0xb3,0x6d,0xd, 0x7a,0xb3,0x6d,0x10,0x7e, +0xb3,0x6d,0x0, 0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xd, 0x12,0x73,0x1d,0x78, +0x14,0xe4,0x7a,0xb3,0x6d,0xe, 0x7e,0xb3,0x6d,0x1, 0xb4,0x1, 0x1f,0x74,0x1, 0x7a, +0xb3,0x6d,0xe, 0x80,0x17,0xbe,0xa0,0x1, 0x78,0x12,0xe4,0x7a,0xb3,0x6d,0xf, 0x7e, +0xb3,0x6d,0x2, 0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xf, 0x7e,0xb3,0x6d,0x3, +0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0x10,0x4c,0xaa,0x78,0x14,0xe4,0x7a,0xb3, +0x6d,0x11,0x7e,0xb3,0x6d,0x4, 0xb4,0x1, 0x1f,0x74,0x1, 0x7a,0xb3,0x6d,0x11,0x80, +0x17,0xbe,0xa0,0x1, 0x78,0x12,0xe4,0x7a,0xb3,0x6d,0x12,0x7e,0xb3,0x6d,0x5, 0xb4, +0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0x12,0x7e,0xb3,0x6d,0x9, 0x70,0x3, 0x12,0x73, +0xe9,0x7e,0xb3,0x25,0xae,0x70,0x3, 0x12,0x73,0xe9,0x7e,0xb3,0x6d,0xb, 0xb4,0x1, +0x3, 0x12,0x73,0xe9,0x7e,0x34,0x22,0x32,0x12,0x29,0xdb,0xbe,0x37,0x75,0x2, 0x50, +0x3, 0x12,0x73,0xe9,0x20,0x0, 0x11,0xe4,0x7a,0xb3,0x6d,0xe, 0x7a,0xb3,0x6d,0xf, +0x7a,0xb3,0x6d,0x11,0x7a,0xb3,0x6d,0x12,0x22,0xe4,0x7a,0xb3,0x6d,0xd, 0x7a,0xb3, +0x6d,0x10,0xc2,0x0, 0x22,0xe4,0x7a,0xb3,0x6d,0x13,0x7e,0x73,0x6c,0xfe,0x22,0x7e, +0x47,0x6c,0xe8,0x7e,0x7, 0x6e,0x8f,0x7e,0x34,0x0, 0x6, 0xad,0x30,0x7e,0x14,0x0, +0x4, 0x12,0x74,0xa0,0x8, 0x5, 0x7e,0xa0,0x4, 0x80,0x1d,0x7d,0x30,0x3e,0x34,0x12, +0x74,0x9e,0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0xf, 0x7d,0x30,0x12,0x74,0x9e,0x8, 0x5, +0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0,0x1, 0x7e,0xb3,0x6d,0xa, 0x60,0x3, 0x7e,0xa0, +0x4, 0x12,0xc6,0x43,0x60,0x3, 0x7e,0xa0,0x1, 0xa, 0x2a,0x7e,0x14,0x22,0x9, 0x12, +0x9f,0x30,0xad,0x32,0x12,0x88,0xd7,0x7e,0xb3,0x6c,0xde,0xbe,0xb0,0x0, 0x28,0x28, +0x7e,0xb3,0x6c,0xff,0x70,0x22,0x7e,0x37,0x6c,0xfb,0xbe,0x34,0x0, 0x2, 0x48,0x9, +0x12,0x5f,0x9a,0x7a,0x37,0x6c,0xfb,0x80,0xf, 0x7e,0x63,0x6c,0xfd,0x7e,0x70,0x2, +0xac,0x67,0x7c,0xb7,0x7a,0xb3,0x6c,0xfd,0x7e,0xb3,0x76,0x2f,0xb4,0x1, 0xe, 0x7e, +0x27,0x6c,0xfb,0x7e,0x34,0x0, 0x5, 0xad,0x32,0x7a,0x37,0x6c,0xfb,0x22,0x3e,0x34, +0x7d,0x21,0x12,0x22,0x71,0xbd,0x34,0x22,0xca,0xf8,0x12,0x75,0x2d,0x12,0x71,0xef, +0x12,0x75,0x1b,0x40,0x5, 0xe4,0x7a,0xb3,0x6d,0xd, 0x7e,0xb3,0x6d,0xd, 0x60,0xb, +0xe4,0x7a,0xb3,0x78,0x18,0x74,0x1f,0x7a,0xb3,0x73,0x20,0x12,0x75,0x1b,0x40,0x6, +0x12,0x76,0xa1,0x12,0xdc,0x23,0x7e,0xb3,0x6d,0x10,0x60,0x6, 0x74,0x2, 0x7a,0xb3, +0x78,0x1f,0x7e,0xf3,0x78,0x1f,0xbe,0xf0,0x0, 0x28,0x23,0xe5,0x1e,0xb4,0x1, 0x14, +0x7e,0xb3,0x76,0x2f,0xb4,0x1, 0xd, 0x7e,0xb3,0x29,0xfc,0xbe,0xb0,0x3c,0x68,0x4, +0x70,0xc, 0x80,0x0, 0x7c,0xbf,0x14,0x7a,0xb3,0x78,0x1f,0x12,0xda,0x51,0x7e,0xb3, +0x6d,0x13,0x60,0x4, 0xe4,0x12,0xd9,0x50,0xda,0xf8,0x22,0xe5,0x1e,0x70,0xc, 0x7e, +0x73,0x77,0xe0,0xbe,0x73,0x77,0xe6,0x40,0x2, 0xc3,0x22,0xd3,0x22,0x12,0xbe,0x87, +0x12,0x75,0x5d,0x12,0xbf,0x55,0x2, 0x75,0x39,0x7e,0x27,0x73,0x21,0x1e,0x24,0x1e, +0x24,0xe4,0x7a,0xb3,0x6d,0xa, 0x7e,0x37,0x6c,0xe0,0xbd,0x32,0x38,0x8, 0x7e,0x37, +0x6c,0xe2,0xbd,0x32,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xa, 0x22,0xe4,0x7a,0xb3, +0x6d,0x0, 0x7a,0xb3,0x6d,0x3, 0x12,0x76,0x80,0x7a,0xb3,0x6d,0x4, 0x7a,0xb3,0x6d, +0x5, 0x7e,0x73,0x6c,0xdf,0xbe,0x70,0x0, 0x28,0x2e,0x12,0x76,0x89,0x8, 0x6, 0x74, +0x1, 0x7a,0xb3,0x6d,0x0, 0x7e,0x7, 0x6e,0x95,0x7d,0x30,0x12,0x76,0x74,0x8, 0x3, +0x12,0x76,0x6d,0x7d,0x30,0x3e,0x34,0x3e,0x34,0x7d,0x21,0x12,0x76,0x78,0x8, 0x8, +0xd2,0x2b,0x6d,0x33,0x7a,0x37,0x76,0x5, 0x7e,0x37,0x6c,0xee,0xbe,0x34,0x1, 0xf4, +0x8, 0x2d,0x30,0x2a,0x2a,0x30,0x2b,0x1b,0x12,0x76,0x6d,0x7e,0x37,0x76,0x5, 0xb, +0x34,0x7a,0x37,0x76,0x5, 0xbe,0x34,0x0, 0x5, 0x28,0x8, 0xc2,0x2b,0x6d,0x33,0x7a, +0x37,0x76,0x5, 0x12,0x76,0xc1,0xbe,0x34,0x0, 0x64,0x28,0x3, 0x12,0x76,0x6d,0x7e, +0xa3,0x6c,0xdf,0xbe,0xa0,0x0, 0x28,0x42,0x12,0x76,0x89,0x8, 0x1a,0x7e,0x73,0x25, +0xaf,0xa5,0xbf,0x0, 0x8, 0x74,0x1, 0x7a,0xb3,0x6d,0x1, 0x80,0xa, 0xa5,0xbf,0x1, +0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0x2, 0x7e,0x37,0x6e,0x95,0x12,0x76,0x74,0x8, 0x1a, +0x7e,0x73,0x25,0xaf,0xa5,0xbf,0x0, 0x8, 0x74,0x1, 0x7a,0xb3,0x6d,0x4, 0x80,0xa, +0xa5,0xbf,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0x5, 0x7e,0xb3,0x6d,0x0, 0xbe,0xb0, +0x1, 0x68,0x10,0x7e,0xb3,0x6d,0x1, 0xbe,0xb0,0x1, 0x68,0x7, 0x7e,0xb3,0x6d,0x2, +0xb4,0x1, 0x24,0xbe,0xa0,0x0, 0x28,0x1f,0xbe,0xa0,0x3, 0x50,0x1a,0x7e,0xb3,0x6c, +0xde,0xb4,0x1, 0x13,0x90,0x21,0xfa,0xe4,0x93,0xbe,0xb3,0x6b,0x54,0x68,0x8, 0xe4, +0x7a,0xb3,0x6d,0x0, 0x12,0x76,0x80,0xe4,0x7a,0xb3,0x6d,0x6, 0x22,0x74,0x1, 0x7a, +0xb3,0x6d,0x3, 0x22,0xad,0x31,0x7d,0x24,0x12,0x22,0x71,0xbe,0x37,0x6c,0xee,0x22, +0x7a,0xb3,0x6d,0x1, 0x7a,0xb3,0x6d,0x2, 0x22,0x7e,0x37,0x6e,0x8f,0x7e,0x14,0x0, +0x6, 0xad,0x31,0x7e,0x44,0x0, 0x4, 0x7d,0x24,0x12,0x22,0x71,0xbe,0x37,0x6c,0xe8, +0x22,0x7e,0x18,0x8, 0xc, 0x7a,0x1d,0x33,0x7e,0x1f,0x24,0x64,0x7f,0x1, 0x2, 0x76, +0xb1,0x12,0x77,0xd4,0x12,0x77,0x92,0x7e,0x34,0x0, 0x10,0x12,0x77,0x89,0x2, 0x8, +0xe5,0x6d,0x22,0x7d,0x32,0x80,0x12,0x7d,0x52,0x12,0x76,0xe2,0xb, 0xa, 0x10,0xbe, +0x14,0xff,0xb0,0x58,0x2, 0xb, 0x34,0xb, 0x24,0x7e,0x17,0x73,0x21,0xbd,0x12,0x38, +0xe6,0x22,0x3e,0x54,0x7e,0xf, 0x24,0x68,0x2d,0x15,0x22,0xca,0xf8,0x7e,0xb3,0x73, +0x1e,0x70,0x8, 0x12,0x77,0x62,0x12,0x77,0x75,0x80,0xf, 0x7e,0x1f,0x24,0x64,0x7a, +0x1d,0x33,0x12,0x77,0x62,0x74,0x1, 0x12,0x77,0xa4,0x7e,0x37,0x73,0x21,0x90,0x1c, +0x2b,0xe4,0x93,0x70,0x13,0x6c,0xff,0x6d,0x22,0x7d,0x53,0x12,0x76,0xe2,0x1b,0xa, +0x20,0x12,0x77,0x5a,0x78,0xf1,0x80,0x2f,0x6c,0xff,0x7e,0xb3,0x73,0x1e,0xb4,0x1, +0x14,0x7d,0x53,0x3e,0x54,0x7e,0xf, 0x24,0x64,0x2d,0x15,0xb, 0xa, 0x40,0x12,0x77, +0x6b,0x9d,0x24,0x80,0x7, 0x7d,0x53,0x3e,0x54,0x12,0x77,0x6b,0x12,0x76,0xe4,0x1b, +0xa, 0x20,0x12,0x77,0x5a,0x78,0xd3,0xda,0xf8,0x22,0xb, 0x34,0xb, 0xf0,0xbe,0xf0, +0x4, 0x22,0x7e,0xf, 0x24,0x68,0x7e,0x1f,0x24,0x60,0x22,0x7e,0xf, 0x24,0x60,0x2d, +0x15,0xb, 0xa, 0x20,0x22,0x12,0x77,0xd4,0x7a,0x37,0x6a,0xd8,0x12,0x77,0x9d,0x7e, +0x34,0x0, 0x20,0x12,0x77,0x89,0x2, 0x8, 0xe5,0x7a,0x37,0x6a,0xde,0x7e,0x8, 0x6a, +0xd4,0x22,0x7a,0x37,0x6a,0xd8,0x7e,0x1d,0x33,0x7a,0x37,0x6a,0xda,0x7d,0x3f,0x7a, +0x37,0x6a,0xdc,0x22,0x7c,0xab,0x7f,0x61,0x7f,0x70,0x7e,0x8, 0x6a,0xd4,0x12,0xda, +0x40,0x7e,0xb3,0x6e,0xb0,0x7a,0xb3,0x6a,0xd5,0x7e,0xb3,0x6e,0xaf,0x7a,0xb3,0x6a, +0xd4,0xe4,0x12,0x77,0xf4,0x12,0x77,0x92,0x7a,0xa3,0x6a,0xd7,0x6d,0x33,0x12,0x77, +0x89,0x2, 0x8, 0xe5,0x7f,0x61,0x7f,0x70,0x7e,0x8, 0x6a,0xd4,0x7e,0x34,0x0, 0xc, +0xe4,0x12,0x24,0x34,0x7e,0x73,0x6e,0xb0,0x7a,0x73,0x6a,0xd5,0x7e,0x73,0x6e,0xaf, +0x7a,0x73,0x6a,0xd4,0x7a,0xb3,0x6a,0xd6,0x7d,0x3d,0x22,0xca,0x79,0x7c,0xfb,0x7f, +0x51,0x7f,0x40,0x74,0x9, 0xac,0xbf,0x9, 0xb5,0x6d,0x73,0xf5,0x3a,0x74,0x9, 0xac, +0xbf,0x9, 0xb5,0x6d,0x74,0xc4,0x54,0xf0,0xf5,0x3b,0x74,0x9, 0xac,0xbf,0x9, 0xe5, +0x6d,0x72,0x12,0x78,0xf0,0x28,0x58,0x7e,0xb3,0x6e,0x83,0x70,0x28,0x75,0x3c,0xf, +0x7e,0x8, 0x0, 0x3a,0xa, 0x3e,0x2e,0x34,0x28,0x27,0x6d,0x22,0x74,0x1, 0x12,0x78, +0xa9,0x75,0x3c,0x20,0x7e,0x8, 0x0, 0x3b,0xa, 0x3e,0x2e,0x34,0x28,0x31,0x74,0x10, +0x12,0x78,0xa9,0x80,0xe, 0xa, 0x3e,0x9, 0xb3,0x28,0x27,0xf5,0x3a,0x9, 0xb3,0x28, +0x31,0xf5,0x3b,0x74,0x9, 0xac,0xbe,0x9, 0xb5,0x6e,0x22,0xb4,0x1, 0x11,0xe4,0xa, +0x3e,0x19,0xb3,0x28,0x27,0x19,0xb3,0x28,0x31,0x75,0x3a,0x0, 0x75,0x3b,0x0, 0x7e, +0xb3,0x6e,0x9d,0xb4,0xff,0x16,0x85,0x39,0x3a,0x75,0x3a,0x0, 0x74,0x9, 0xac,0xbf, +0x9, 0xb5,0x6d,0x72,0xbe,0xb0,0xff,0x68,0x3, 0x75,0x3a,0x1, 0xe5,0x3a,0x7a,0x4b, +0xb0,0xe5,0x3b,0x7a,0x5b,0xb0,0xda,0x79,0x22,0x7c,0x9b,0x7e,0x1b,0xa0,0x4c,0xaa, +0x78,0x7, 0x7e,0xb, 0xb0,0x7a,0x1b,0xb0,0x22,0xa, 0xda,0x7e,0xb, 0x80,0xa, 0xe8, +0x7d,0xfe,0x9d,0xfd,0xbe,0xf4,0x0, 0x0, 0x8, 0x4, 0x9d,0xed,0x80,0x4, 0x6d,0xee, +0x9d,0xef,0xe5,0x3c,0xa, 0xfb,0xbd,0xef,0x8, 0xf, 0xbc,0x8a,0x7c,0xba,0x28,0x4, +0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x1b,0xb0,0x7e,0x1b,0x70,0x7a,0xb, 0x70,0x22, +0x7e,0x73,0x6e,0x89,0xbc,0x7e,0x22,0x7e,0x68,0x6e,0x22,0x7e,0xb3,0x6e,0x7d,0xb4, +0x1, 0x1a,0x7e,0xb3,0x6e,0x7c,0x70,0x14,0x29,0x76,0x0, 0x8, 0xbe,0x70,0x2d,0x50, +0xb, 0xbe,0x70,0x0, 0x28,0x6, 0x74,0x3, 0x7a,0xb3,0x6e,0x88,0x7e,0x73,0x6e,0x88, +0xbe,0x70,0x0, 0x28,0x2d,0x7e,0x34,0x0, 0x9, 0xca,0x39,0x7e,0x18,0x27,0x73,0x7e, +0x8, 0x6d,0x6e,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0xa3,0x6e,0x88,0xbe,0xa0,0x3, 0x78, +0x3, 0xe4,0x80,0xb, 0xbe,0xa0,0x1, 0x78,0x4, 0x74,0x1, 0x80,0x2, 0x74,0x2, 0x7a, +0x6b,0xb0,0x22,0xca,0x3b,0x75,0x27,0x0, 0x75,0x28,0x0, 0x75,0x29,0x0, 0x75,0x2a, +0x0, 0x75,0x2c,0x0, 0xc2,0x0, 0xc2,0x1, 0x7e,0x18,0x28,0x3b,0x7a,0x1d,0x31,0x7e, +0x18,0x6e,0x22,0x7a,0x1d,0x35,0xe4,0x7e,0x34,0x28,0x3c,0x7e,0x24,0x0, 0x0, 0x7a, +0x1b,0xb0,0x12,0xcc,0x31,0x12,0x78,0xf7,0x6c,0xee,0x80,0x39,0x74,0x9, 0xac,0xbe, +0x9, 0xf5,0x6d,0x72,0x12,0x9f,0x71,0x28,0x2a,0x12,0xe4,0x8b,0x2d,0x35,0x7e,0x1b, +0xb0,0xb4,0x1, 0x1f,0x12,0xe5,0xde,0x70,0x1a,0x29,0x1, 0x0, 0x8, 0xbe,0x0, 0x2d, +0x50,0x11,0xbe,0x0, 0x0, 0x28,0xc, 0x7a,0xe1,0x2b,0x74,0x3, 0xa5,0xf7,0x7a,0xf1, +0x12,0x80,0x7, 0xb, 0xe0,0x12,0x78,0xf0,0x38,0xc2,0x12,0xe5,0x10,0x38,0x2, 0x41, +0x4f,0xb4,0x3, 0x10,0x7e,0x34,0x0, 0x9, 0xca,0x39,0x12,0xe5,0xa2,0x7e,0x31,0x2b, +0xac,0x3b,0x80,0x19,0x6c,0xee,0x80,0x24,0x7e,0x30,0x9, 0xac,0x3e,0x9, 0xb1,0x6d, +0x72,0xb4,0xff,0x16,0x7e,0x4, 0x0, 0x9, 0xca,0x9, 0x12,0xe5,0xa2,0x2e,0x14,0x6d, +0x6e,0x6d,0x0, 0x12,0x24,0xf, 0x1b,0xfd,0x80,0x7, 0xb, 0xe0,0x12,0x78,0xf0,0x38, +0xd7,0x7e,0x11,0x12,0x2e,0x10,0x8, 0xa5,0xe7,0x7c,0xab,0xbe,0xa0,0x3, 0x78,0x13, +0x6c,0x33,0x7e,0x11,0x12,0x74,0x9, 0xac,0x1b,0x7e,0x1d,0x35,0x2d,0x30,0x7a,0x1b, +0x30,0x80,0x1c,0xbe,0xa0,0x1, 0x78,0x5, 0x7e,0xa0,0x1, 0x80,0x3, 0x7e,0xa0,0x2, +0x7e,0x31,0x12,0x74,0x9, 0xac,0x3b,0x7e,0x1d,0x35,0x2d,0x31,0x7a,0x1b,0xa0,0x7e, +0xb3,0x6e,0x85,0x70,0x1a,0x7e,0xb3,0x6e,0x81,0x70,0x14,0x7e,0xb3,0x6e,0x82,0x70, +0xe, 0x12,0xe5,0x10,0x38,0x9, 0x7e,0xb3,0x6e,0x88,0x70,0x3, 0x2, 0x81,0x15,0x12, +0xe5,0x10,0x28,0x3, 0x14,0xa5,0xf7,0x7e,0xb3,0x6e,0x88,0x60,0x5, 0x14,0x7a,0xb3, +0x6e,0x88,0x30,0x20,0x6, 0x7e,0x18,0x28,0x79,0x80,0x4, 0x7e,0x18,0x28,0x3b,0x7a, +0x1d,0x31,0x7e,0xd, 0x31,0x12,0x6b,0x9c,0x6c,0xee,0x2, 0x80,0xaf,0x7e,0x70,0x9, +0xac,0x7e,0x9, 0xf3,0x6d,0x72,0x12,0x9f,0x71,0x38,0x3, 0x2, 0x80,0xad,0x7c,0xaf, +0x5e,0xa0,0xf, 0x74,0x9, 0xa4,0x7e,0xd, 0x35,0x2d,0x15,0x7e,0xb, 0xc0,0x7e,0x90, +0x4, 0xac,0x9f,0x9, 0xa4,0x28,0xba,0x4c,0xaa,0x78,0x2, 0x61,0x84,0x49,0x23,0x6d, +0x6e,0x4d,0x22,0x78,0xa, 0x49,0x33,0x6d,0x70,0x4d,0x33,0x78,0x2, 0x61,0x84,0xbe, +0xa0,0x4, 0x28,0x5, 0x7e,0xd0,0x38,0x80,0x21,0xbe,0xa0,0x4, 0x78,0x5, 0x7e,0xd0, +0x30,0x80,0x17,0xbe,0xa0,0x3, 0x78,0x5, 0x7e,0xd0,0x20,0x80,0xd, 0xbe,0xa0,0x2, +0x78,0x5, 0x7e,0xd0,0x18,0x80,0x3, 0x7e,0xd0,0x10,0x75,0x26,0x0, 0x80,0x64,0x7e, +0x91,0x26,0x74,0x9, 0xac,0x9b,0x9, 0xb4,0x27,0xd1,0x54,0xf, 0xbc,0xbf,0x78,0x51, +0x74,0x9, 0xac,0xbe,0x49,0x35,0x6d,0x6e,0x12,0xe4,0xfc,0x49,0x34,0x27,0xcd,0x12, +0xe5,0x94,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x74,0x9, +0xac,0xbe,0x59,0x35,0x6d,0x6e,0x7e,0x90,0x9, 0xac,0x9e,0x49,0x34,0x6d,0x70,0x12, +0xe4,0xfc,0x7e,0xa1,0x26,0x74,0x9, 0xa4,0x49,0x35,0x27,0xcf,0x12,0xe5,0x94,0x1e, +0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x59,0x34,0x6d,0x70,0x80, +0x7, 0x5, 0x26,0x12,0x81,0xc1,0x38,0x97,0x7e,0x70,0x4, 0xac,0x7f,0x2e,0x34,0x28, +0xba,0x12,0xe6,0xc6,0x12,0xe4,0x8b,0x2d,0x35,0x7e,0x1b,0xb0,0xb4,0x1, 0x17,0x12, +0xe5,0xde,0x70,0x12,0x7e,0xb3,0x6e,0x88,0x70,0xc, 0xe4,0x39,0xb1,0x0, 0x8, 0x12, +0xe5,0xbb,0x7a,0xb3,0x28,0xe5,0x4c,0xcc,0x68,0x2, 0xe1,0xc6,0x12,0xe5,0xde,0x60, +0x2, 0xe1,0xc6,0x7e,0xb3,0x6e,0x88,0x60,0x2, 0xe1,0xc6,0x74,0x9, 0xac,0xbe,0x49, +0x35,0x6d,0x6e,0xbe,0x34,0x0, 0x14,0x38,0x10,0x12,0xe6,0x9c,0x40,0xb, 0x12,0x6f, +0xcd,0x9e,0x24,0x0, 0x14,0xbd,0x42,0x28,0x3b,0x7e,0x14,0x21,0xde,0x12,0xdd,0x9b, +0x7d,0x2c,0x9e,0x24,0x0, 0x14,0xbd,0x32,0x40,0x10,0x12,0xe6,0x9c,0x40,0xb, 0x12, +0x6f,0xcd,0x9e,0x24,0x0, 0x14,0xbd,0x42,0x28,0x1a,0x49,0xd5,0x6d,0x70,0xbe,0xd4, +0x0, 0x0, 0x28,0x2, 0xc1,0x7e,0xbe,0x34,0x0, 0x0, 0x50,0x2, 0xc1,0x7e,0xbd,0x3c, +0x28,0x2, 0xc1,0x7e,0x12,0xe5,0x86,0x12,0xe4,0xf5,0xbe,0x34,0x0, 0xc8,0x58,0x18, +0x12,0xe6,0x93,0xbe,0x44,0x0, 0x14,0x38,0xf, 0x12,0xe5,0x1c,0x40,0xa, 0x12,0xdd, +0x97,0x12,0xe6,0x8, 0x38,0x2, 0xa1,0x8c,0x12,0xe4,0xec,0xbe,0x34,0x0, 0xc8,0x58, +0x14,0x12,0xe4,0xa1,0x40,0xf, 0x12,0xe5,0x1c,0x40,0xa, 0x12,0xdd,0x97,0x12,0xe6, +0x8, 0x38,0x2, 0xa1,0x8c,0x12,0xe4,0xec,0xbe,0x34,0x0, 0x0, 0x58,0x25,0x74,0x9, +0xac,0xbe,0x49,0x45,0x6d,0x70,0xbe,0x44,0x0, 0x0, 0x38,0x17,0x49,0x35,0x6d,0x6e, +0xbe,0x34,0x0, 0x0, 0x40,0xd, 0x7e,0x14,0x21,0xde,0x12,0xdd,0x9b,0xbd,0x3c,0x38, +0x2, 0xa1,0x8c,0x12,0xe4,0x80,0x29,0xb1,0x0, 0x8, 0x70,0x2e,0x7e,0x4, 0x0, 0x9, +0xca,0x9, 0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x6d,0x6e,0x6d,0x22,0x2e,0x14,0x27, +0x73,0x6d,0x0, 0x12,0x24,0xf, 0x1b,0xfd,0x12,0xe4,0x8b,0x2d,0x35,0x2e,0x34,0x0, +0x8, 0x7e,0x1b,0xb0,0x4, 0x7a,0x1b,0xb0,0xa1,0x8c,0x12,0xe4,0x21,0x2d,0xc3,0xbe, +0xc4,0x0, 0x32,0x58,0x42,0x7e,0x70,0x9, 0xac,0x7e,0x49,0x23,0x6d,0x6e,0xbe,0x24, +0x0, 0x14,0x38,0x33,0x49,0xc3,0x6d,0x70,0xbe,0xc4,0x0, 0x14,0x40,0x29,0x12,0x6f, +0xcd,0x9e,0x24,0x0, 0x14,0xbd,0xc2,0x38,0x1e,0x12,0xca,0x8c,0x50,0xa, 0x7e,0xa0, +0x2d,0x12,0xe4,0x80,0x39,0xa1,0x0, 0x8, 0x12,0xe4,0x8b,0x12,0xe5,0x25,0x40,0x2, +0xa1,0x8c,0x12,0xe5,0x7d,0xa1,0x8c,0x12,0xe4,0x21,0x2d,0xc3,0xbe,0xc4,0x0, 0x32, +0x58,0x31,0x12,0xe4,0xa1,0x40,0x2c,0x12,0xe5,0x1c,0x40,0x27,0x12,0xdd,0x97,0x12, +0xe6,0x8, 0x38,0x1f,0x12,0xe5,0x86,0x12,0xca,0x90,0x50,0xa, 0x7e,0xa0,0x2d,0x12, +0xe4,0x80,0x39,0xa1,0x0, 0x8, 0x12,0xe4,0x8b,0x12,0xe5,0x25,0x50,0x4e,0x12,0xe5, +0x7d,0x80,0x49,0x12,0xe4,0x21,0x2d,0xc3,0xbe,0xc4,0x0, 0x0, 0x58,0x4a,0x7e,0x70, +0x9, 0xac,0x7e,0x49,0x23,0x6d,0x70,0xbe,0x24,0x0, 0x0, 0x38,0x3b,0x49,0xc3,0x6d, +0x6e,0xbe,0xc4,0x0, 0x0, 0x40,0x31,0x7e,0x14,0x21,0xde,0x12,0x6f,0xd1,0xbd,0xc2, +0x38,0x26,0x12,0xca,0x8c,0x50,0xa, 0x7e,0xa0,0x2d,0x12,0xe4,0x80,0x39,0xa1,0x0, +0x8, 0x12,0xe4,0x8b,0x12,0xe5,0x25,0x50,0x3, 0x12,0xe5,0x7d,0x7e,0xc0,0x3, 0x12, +0xe4,0x70,0x39,0xa1,0x0, 0x1, 0xc1,0xc8,0x7e,0x50,0x9, 0xac,0x5e,0x49,0x42,0x6d, +0x6e,0xbe,0x44,0x0, 0x14,0x38,0x47,0x49,0x32,0x6d,0x70,0xbe,0x34,0x0, 0x14,0x40, +0x3d,0x7e,0x14,0x21,0xec,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x50,0x9e,0x54,0x0, 0x14, +0xbd,0x35,0x38,0x2a,0x74,0x9, 0xac,0xbf,0x49,0xc5,0x27,0x73,0x4d,0xcc,0x78,0xa, +0x49,0xc5,0x27,0x75,0x4d,0xcc,0x78,0x2, 0xc1,0xbe,0x12,0xe4,0x2d,0x7d,0x53,0x2d, +0x5c,0xbe,0x54,0x1, 0x2c,0x8, 0x2, 0xc1,0xbe,0x12,0xe4,0x4d,0xc1,0xbe,0x7e,0x34, +0x21,0xde,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x0, 0x7d,0x10,0x9e,0x14,0x0, 0x14,0xbd, +0x41,0x40,0x4b,0x74,0x9, 0xac,0xbe,0x12,0xe5,0x1c,0x40,0x42,0x12,0x9f,0x89,0xb, +0x7a,0x20,0x9e,0x24,0x0, 0x14,0xbd,0x32,0x38,0x34,0x12,0xe5,0xfd,0x78,0xa, 0x49, +0x25,0x27,0x75,0x4d,0x22,0x78,0x2, 0xc1,0xbe,0x49,0x25,0x27,0x75,0x12,0xe6,0xce, +0x12,0xe4,0x38,0x2d,0x13,0xbe,0x14,0x1, 0x2c,0x8, 0x2, 0xc1,0xbe,0x7e,0xa0,0x5, +0x7e,0x30,0x4, 0xac,0x3f,0x19,0xa1,0x28,0xba,0x12,0xe4,0x59,0x80,0x70,0x74,0x9, +0xac,0xbe,0x12,0xe5,0x74,0x38,0x71,0xbe,0x44,0x0, 0x0, 0x40,0x6b,0xbd,0x40,0x38, +0x67,0x12,0xe5,0xfd,0x78,0x8, 0x49,0x25,0x27,0x75,0x4d,0x22,0x68,0x50,0x12,0xe4, +0x2d,0x2d,0xc3,0xbe,0xc4,0x1, 0x2c,0x18,0x45,0x12,0xe4,0x4d,0x80,0x40,0x7e,0x70, +0x9, 0xac,0x7f,0x7e,0xd, 0x35,0x2d,0x13,0x29,0x50,0x0, 0x8, 0xbe,0x50,0x0, 0x28, +0x37,0x7e,0xb3,0x28,0xe5,0x70,0x31,0x49,0x23,0x27,0x73,0x4d,0x22,0x78,0x8, 0x49, +0x23,0x27,0x75,0x4d,0x22,0x68,0x17,0x49,0x23,0x27,0x75,0x7d,0x3d,0x12,0xe6,0xce, +0x12,0xe4,0x38,0x2d,0x31,0xbe,0x34,0x1, 0x2c,0x18,0x3, 0x12,0xe4,0x4d,0x7e,0xa0, +0x2d,0x12,0xe4,0x80,0x39,0xa1,0x0, 0x8, 0x4c,0xcc,0x68,0x2, 0xe1,0xc6,0x7e,0x70, +0x9, 0xac,0x7e,0x12,0xca,0x8c,0x92,0x1e,0x30,0x1e,0x3c,0x12,0xe5,0xbb,0x12,0xe4, +0x8b,0x2d,0x35,0x29,0xb1,0x0, 0x6, 0x70,0x6, 0x74,0x1, 0x39,0xb1,0x0, 0x6, 0x12, +0xe4,0x8b,0x2d,0x35,0x29,0x31,0x0, 0x6, 0xbe,0x30,0x1, 0x28,0x2, 0xe1,0xc6,0x4c, +0xcc,0x78,0x3, 0x7e,0xc0,0x3, 0x74,0x2d,0x39,0xb1,0x0, 0x8, 0xd2,0x1f,0x12,0xe4, +0x70,0x39,0xa1,0x0, 0x1, 0xe1,0xc6,0x74,0x9, 0xac,0xbe,0x49,0x25,0x6d,0x6e,0xbe, +0x24,0x0, 0x14,0x28,0x14,0x7e,0x14,0x21,0xde,0x12,0x9f,0x30,0x9e,0x34,0x0, 0x14, +0xbd,0x23,0x50,0x5, 0x12,0xe5,0x74,0x38,0x7c,0xbe,0x24,0x0, 0x14,0x38,0xb, 0x12, +0xe5,0x74,0x40,0x6, 0xbe,0x34,0x0, 0x14,0x28,0x6b,0x7e,0x14,0x21,0xde,0x12,0x9f, +0x30,0x9e,0x34,0x0, 0x14,0xbd,0x23,0x40,0x14,0x74,0x9, 0xac,0xbe,0x49,0x15,0x6d, +0x70,0xbe,0x14,0x0, 0x0, 0x40,0x6, 0xbe,0x14,0x0, 0x14,0x28,0x48,0xbe,0x24,0x0, +0x14,0x38,0x21,0x74,0x9, 0xac,0xbe,0x49,0x5, 0x6d,0x70,0x7e,0x54,0x21,0xec,0x7e, +0x44,0x0, 0xff,0xb, 0x2a,0x10,0x7d,0x51,0x9e,0x54,0x0, 0x14,0xbd,0x5, 0x40,0x4, +0xbd,0x1, 0x28,0x21,0xbd,0x23,0x40,0x2e,0x74,0x9, 0xac,0xbe,0x49,0x25,0x6d,0x70, +0x7e,0x14,0x21,0xec,0x12,0x9f,0x30,0x7d,0x13,0x9e,0x14,0x0, 0x14,0xbd,0x21,0x40, +0x15,0xbd,0x23,0x38,0x11,0x12,0xe4,0x8b,0x2d,0x35,0x29,0xb1,0x0, 0x6, 0x70,0x6, +0x74,0x2, 0x39,0xb1,0x0, 0x6, 0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x80,0xad,0x12,0xe6, +0x93,0x7a,0x45,0x2d,0x49,0x35,0x6d,0x70,0x7a,0x35,0x2f,0xbe,0xc0,0x1, 0x78,0x3b, +0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7f,0x19,0xa3,0x28,0xb8,0x12,0xe4,0x80,0x39,0xa1, +0x0, 0x6, 0x75,0x26,0x0, 0x80,0x1f,0x12,0x85,0x95,0x9, 0xb3,0x27,0xd1,0x54,0xf, +0xbc,0xbf,0x78,0x10,0x49,0x23,0x27,0xcd,0x7a,0x25,0x2d,0x49,0x33,0x27,0xcf,0x7a, +0x35,0x2f,0x80,0x7, 0x5, 0x26,0x12,0x81,0xc1,0x38,0xdc,0x85,0x27,0x39,0x7e,0x8, +0x0, 0x29,0x7e,0x18,0x0, 0x2a,0x7c,0xbe,0x12,0x77,0xfb,0x7e,0x35,0x2d,0x5e,0x60, +0xf, 0x7a,0x35,0x2d,0x7e,0x35,0x2f,0x5e,0x60,0xf, 0x7a,0x35,0x2f,0x7e,0x90,0x9, +0xac,0x9e,0x9, 0x74,0x6d,0x72,0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x7d,0x25, +0x2e,0x25,0x2f,0x7a,0x25,0x2f,0xbe,0x70,0xff,0x68,0x19,0xbe,0xc0,0x1, 0x68,0x2, +0x5, 0x27,0x5, 0x2c,0xa, 0x5c,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4,0x7d,0x35,0x2e, +0x35,0x2d,0x80,0x7, 0x7e,0x35,0x2d,0x2e,0x34,0xc0,0x0, 0x7a,0x35,0x2d,0x12,0x81, +0x67,0x79,0x30,0x0, 0x2, 0x7e,0x35,0x2f,0x12,0x81,0x67,0x79,0x30,0x0, 0x4, 0x7e, +0xa1,0x29,0x7e,0x31,0x28,0x74,0x6, 0x12,0x81,0x5f,0x39,0xa1,0x0, 0x6, 0x7e,0xa1, +0x2a,0x7e,0x31,0x28,0x12,0x81,0x5f,0x39,0xa1,0x0, 0x7, 0x5, 0x28,0xb, 0xe0,0x12, +0x78,0xf0,0x28,0x3, 0x2, 0x7a,0x9d,0xe5,0x27,0x7e,0x1d,0x31,0x39,0xb1,0x0, 0x1, +0x7e,0x33,0x6e,0x7e,0x7e,0x1d,0x31,0x7a,0x1b,0x30,0x7e,0xb3,0x76,0x5a,0xb4,0x1, +0xf, 0x7e,0xb3,0x6e,0x82,0xb4,0x1, 0x1c,0x74,0x5, 0x7a,0xb3,0x77,0xdd,0x80,0xf, +0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x6, 0x7e,0xb3,0x6e,0x82,0x60,0x7, 0xb2,0x20,0xc2, +0x86,0x12,0x87,0xa3,0x7e,0xb3,0x6e,0x81,0x60,0xc, 0x7e,0xb3,0x6e,0x88,0x70,0x6, +0x7e,0xd, 0x35,0x12,0x81,0x73,0xe4,0x7a,0xb3,0x6e,0x85,0x7a,0xb3,0x6e,0x81,0x7a, +0xb3,0x6e,0x82,0x80,0x1e,0x7e,0xd, 0x35,0x12,0x81,0x73,0x6c,0xee,0x6c,0xaa,0x80, +0xb, 0x7c,0x1e,0x2e,0x10,0x8, 0x7c,0xba,0xa5,0xf7,0xb, 0xe0,0xbe,0xe0,0xa, 0x40, +0xf0,0xd2,0x86,0x12,0x87,0x98,0xca,0x59,0x7e,0x18,0x6d,0x6e,0x7e,0x8, 0x27,0xcd, +0x12,0x24,0xf, 0x1b,0xfd,0xe5,0x2c,0x70,0x10,0x12,0x54,0xc8,0x74,0x9, 0xac,0x7b, +0x7e,0x8, 0x27,0xcd,0x74,0xff,0x12,0x24,0x34,0x12,0x87,0xb5,0xda,0x3b,0x22,0xac, +0x3b,0x7e,0x1d,0x31,0x2d,0x31,0x22,0x7e,0xa1,0x28,0x74,0x6, 0xa4,0x7e,0xd, 0x31, +0x2d,0x15,0x22,0xca,0xf8,0x6c,0xaa,0x80,0x40,0x7e,0xf0,0x3, 0x7e,0x90,0x9, 0xac, +0x9a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xf0,0x74,0x3, 0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0x1, 0x7e,0x34,0x7f,0xff,0x7f,0x70,0x2d,0xf4,0x79,0x37,0x0, 0x2, 0x7f,0x70, +0x2d,0xf4,0x79,0x37,0x0, 0x4, 0xe4,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0x6, 0x7f, +0x10,0x2d,0x34,0x39,0xb1,0x0, 0x8, 0xb, 0xa0,0x12,0x4c,0xf7,0x38,0xbb,0xda,0xf8, +0x22,0x90,0x21,0x51,0xe4,0x93,0xbe,0xb1,0x26,0x22,0xca,0x3b,0xc2,0x0, 0x7e,0x38, +0x6e,0x22,0x6c,0xaa,0x80,0x19,0x7e,0x70,0xff,0x12,0x85,0x7f,0x74,0xff,0xa, 0x4a, +0x19,0xb4,0x62,0xcc,0xe4,0x19,0xb4,0x62,0xb8,0x19,0xb4,0x62,0xc2,0xb, 0xa0,0x12, +0x4c,0xf7,0x38,0xe2,0x7e,0x73,0x6e,0x7c,0xa5,0xbf,0x0, 0x2e,0x7e,0xb3,0x3, 0xc8, +0x70,0x2, 0x81,0xbc,0x6c,0xaa,0x80,0x1b,0x7e,0x44,0x7f,0xff,0x7e,0x50,0x9, 0xac, +0x5a,0x7f,0x3, 0x2d,0x12,0x79,0x40,0x0, 0x2, 0x7f,0x3, 0x2d,0x12,0x79,0x40,0x0, +0x4, 0xb, 0xa0,0x12,0x4c,0xf7,0x38,0xe0,0x81,0xbc,0x7e,0xb3,0x3, 0xc8,0x70,0x3e, +0xbe,0x70,0x0, 0x28,0x39,0x6c,0xaa,0x80,0x2b,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34, +0x6d,0x14,0x7f,0x3, 0x2d,0x14,0x79,0x30,0x0, 0x2, 0x49,0x34,0x6d,0x16,0x7f,0x3, +0x2d,0x14,0x79,0x30,0x0, 0x4, 0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x62,0xb8,0x19,0xa4, +0x6d,0x18,0xb, 0xa0,0x7e,0xb3,0x6e,0x7c,0xbc,0xba,0x38,0xcd,0x81,0xbc,0x6c,0xaa, +0x80,0x1d,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a,0x3e,0x34,0x59,0x43,0x24, +0x6c,0x59,0x43,0x24,0x6e,0x59,0x43,0x24,0x94,0x59,0x43,0x24,0x96,0xb, 0xa0,0x12, +0x4c,0xf7,0x38,0xde,0x7e,0xb3,0x3, 0xc8,0xbe,0xb3,0x6e,0x7c,0x28,0x9, 0xbe,0xb0, +0x2, 0x40,0x4, 0xd2,0x0, 0x80,0x2, 0xc2,0x0, 0x6c,0xaa,0x61,0x6a,0x75,0x26,0x0, +0x61,0x61,0x12,0x85,0x95,0x7f,0x73,0x2d,0xf3,0x69,0x17,0x0, 0x2, 0xbe,0x14,0x7f, +0xff,0x78,0x2, 0x61,0x5f,0xe5,0x26,0xa, 0x2b,0x9, 0xb2,0x62,0xc2,0x60,0x2, 0x61, +0x5f,0x30,0x0, 0x6c,0x7e,0x71,0x26,0x74,0x2, 0xac,0x7b,0x49,0x3, 0x3, 0xdd,0xbe, +0x4, 0x7f,0xff,0x68,0x5b,0x49,0xd3,0x3, 0xdd,0x69,0x7, 0x0, 0x2, 0x7d,0x40,0x9d, +0x4d,0x2d,0x40,0x49,0xd3,0x3, 0xc9,0x69,0x7, 0x0, 0x4, 0x7d,0x30,0x9d,0x3d,0x2d, +0x30,0xbe,0x44,0x0, 0x0, 0x58,0x2, 0x6d,0x44,0xbe,0x34,0x0, 0x0, 0x58,0x2, 0x6d, +0x33,0x7e,0x3, 0x6e,0xb1,0x12,0x85,0x89,0xbd,0xd4,0x18,0x6, 0x7d,0x40,0x9e,0x44, +0x0, 0x21,0x7e,0x3, 0x6e,0xb2,0x12,0x85,0x89,0xbd,0xd3,0x18,0x6, 0x7d,0x30,0x9e, +0x34,0x0, 0x21,0x12,0x85,0x63,0x59,0x40,0x24,0x6c,0x59,0x30,0x24,0x6e,0x80,0xf, +0x12,0x85,0x63,0x59,0x10,0x24,0x6c,0x69,0x17,0x0, 0x4, 0x59,0x10,0x24,0x6e,0xe5, +0x26,0xa, 0x1a,0x19,0xb1,0x62,0xcc,0x74,0x1, 0x19,0xb2,0x62,0xc2,0x80,0x9, 0x5, +0x26,0x12,0x81,0xc1,0x28,0x2, 0x41,0xb2,0xb, 0xa0,0x7e,0xb3,0x3, 0xc8,0xbc,0xba, +0x28,0x2, 0x41,0xad,0x6c,0xaa,0x80,0x1a,0x12,0x85,0x6b,0x69,0x30,0x0, 0x2, 0x7e, +0x50,0x2, 0xac,0x5a,0x59,0x32,0x3, 0xdd,0x69,0x30,0x0, 0x4, 0x59,0x32,0x3, 0xc9, +0xb, 0xa0,0x12,0x54,0xc8,0xbc,0x7a,0x38,0xdf,0x6c,0xaa,0x80,0x31,0xa, 0x2a,0x9, +0xb2,0x62,0xcc,0xb4,0xff,0x26,0x75,0x26,0x0, 0x80,0x1c,0xe5,0x26,0xa, 0x4b,0x9, +0xb4,0x62,0xc2,0x70,0x10,0xe5,0x26,0xa, 0x2a,0x19,0xb2,0x62,0xcc,0x74,0x1, 0x19, +0xb4,0x62,0xc2,0x80,0x7, 0x5, 0x26,0xbe,0x71,0x26,0x38,0xdf,0xb, 0xa0,0xbc,0x7a, +0x38,0xcb,0x6c,0xaa,0x80,0x1e,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x43,0x6d,0x14,0x7e, +0x50,0x2, 0xac,0x5a,0x3e,0x24,0x59,0x42,0x24,0x94,0x49,0x33,0x6d,0x16,0x59,0x32, +0x24,0x96,0xb, 0xa0,0x7e,0xb3,0x6e,0x7c,0xbc,0xba,0x38,0xda,0x7e,0x34,0x24,0x6c, +0x7a,0x37,0x62,0xd8,0x7e,0x34,0x24,0x94,0x7a,0x37,0x62,0xda,0x7e,0x34,0x24,0xbc, +0x7a,0x37,0x62,0xdc,0x7e,0x73,0x3, 0xc8,0x7a,0x73,0x62,0xd6,0x7e,0x73,0x6e,0x7c, +0x7a,0x73,0x62,0xd7,0x7e,0x8, 0x62,0xd6,0x12,0x1, 0x20,0x6c,0xaa,0x80,0x5c,0x7e, +0x70,0xff,0x75,0x26,0x0, 0x80,0x1d,0x7e,0x51,0x26,0x74,0x2, 0xac,0x5b,0x49,0x12, +0x24,0xbc,0xa, 0x2a,0xbd,0x21,0x78,0xa, 0xe5,0x26,0xa, 0x3b,0x9, 0x73,0x62,0xcc, +0x80,0x7, 0x5, 0x26,0x12,0x81,0xc1,0x38,0xde,0xbe,0x70,0xff,0x68,0x2b,0x12,0x85, +0x7f,0x74,0x1, 0xa, 0x47,0x19,0xb4,0x62,0xb8,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x42, +0x6d,0x14,0x12,0x85,0x75,0x79,0x40,0x0, 0x2, 0x7e,0x50,0x9, 0xac,0x5a,0x49,0x42, +0x6d,0x16,0x12,0x85,0x75,0x79,0x40,0x0, 0x4, 0xb, 0xa0,0x7e,0x63,0x6e,0x7c,0xbc, +0x6a,0x38,0x9c,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x62,0xb8,0xbe,0xb0,0x1, +0x68,0x13,0x7e,0x44,0x7f,0xff,0x12,0x85,0x6b,0x79,0x40,0x0, 0x2, 0x2d,0x37,0x7d, +0x26,0x79,0x41,0x0, 0x4, 0xb, 0xa0,0x12,0x4c,0xf7,0x38,0xdb,0x7e,0x73,0x6e,0x7c, +0x7a,0x73,0x3, 0xc8,0x7f,0x3, 0x7e,0x18,0x62,0xb8,0x12,0x84,0xd0,0xda,0x3b,0x22, +0xca,0x79,0x7e,0xa3,0x6e,0x7c,0x6c,0x99,0x80,0x77,0xa, 0xf9,0x2d,0xf3,0x7d,0xe2, +0x7e,0x7b,0xb0,0xb4,0x1, 0x27,0x12,0x85,0x59,0x29,0xb7,0x0, 0x1, 0xb4,0x1, 0x6, +0x74,0x3, 0x39,0xb7,0x0, 0x1, 0x12,0x85,0x59,0x29,0x87,0x0, 0x1, 0xbe,0x80,0x3, +0x78,0x3, 0xe4,0x80,0x32,0x4c,0x88,0x78,0x31,0x74,0x2, 0x80,0x2a,0x12,0x85,0x59, +0x29,0xb7,0x0, 0x1, 0xbe,0xb0,0x2, 0x68,0x8, 0x60,0x6, 0x29,0xb7,0x0, 0x7, 0x70, +0x14,0x74,0x1, 0x7a,0x7b,0xb0,0x7c,0x8a,0xb, 0xa0,0x7e,0xf0,0x9, 0xac,0xf8,0x19, +0x97,0x6d,0x18,0x80,0x5, 0x74,0x3, 0x7a,0x7b,0xb0,0x12,0x85,0x59,0x7e,0x7b,0xb0, +0x39,0xb7,0x0, 0x1, 0x12,0x85,0x59,0x29,0xb7,0x0, 0x1, 0x39,0xb7,0x0, 0x7, 0xb, +0x90,0x12,0x85,0x9d,0x38,0x84,0xda,0x79,0x22,0x7e,0xf0,0x9, 0xac,0xf9,0x7f,0x70, +0x2d,0xf7,0x22,0x7e,0x10,0x2, 0xac,0x1a,0x3e,0x4, 0x22,0x7e,0x70,0x9, 0xac,0x7a, +0x7f,0x3, 0x2d,0x13,0x22,0x7e,0x50,0x9, 0xac,0x57,0x7f,0x3, 0x2d,0x12,0x22,0x7e, +0x50,0x9, 0xac,0x5a,0x19,0x72,0x6d,0x18,0x22,0x7e,0x10,0x40,0xac,0x1, 0x7d,0xd0, +0x9e,0xd4,0x0, 0x20,0x22,0x7e,0x71,0x26,0x74,0x9, 0xac,0x7b,0x22,0x90,0x21,0x51, +0xe4,0x93,0xbc,0xb9,0x22,0x7e,0x8, 0x62,0xb8,0xca,0x69,0xca,0xf8,0x7f,0x70,0x7c, +0x86,0x7c,0xf7,0x7c,0xab,0x6c,0x99,0xc1,0x69,0x7c,0x3f,0xc1,0x61,0x7e,0x10,0x9, +0xac,0x19,0x9, 0x20,0x6d,0xcc,0x7e,0x10,0x9, 0xac,0x13,0x9, 0xb0,0x6d,0x18,0xbc, +0xb2,0x68,0x2, 0xc1,0x5f,0xbe,0x20,0xff,0x78,0x2, 0xc1,0x5f,0x7e,0xd0,0x9, 0xac, +0xd2,0x9, 0xb6,0x6e,0x22,0x70,0xa, 0x7d,0x30,0x2e,0x34,0x6d,0x14,0x6d,0x22,0x80, +0xb, 0x7e,0x70,0x9, 0xac,0x79,0x2e,0x34,0x6d,0xc8,0x6d,0x22,0x29,0x11,0x0, 0x4, +0x12,0x86,0x77,0x39,0x16,0x0, 0x4, 0xb, 0x1a,0x0, 0x12,0x86,0x77,0x1b,0x6a,0x0, +0x69,0x1, 0x0, 0x2, 0x12,0x86,0x77,0x79,0x6, 0x0, 0x2, 0x7e,0x10,0x9, 0xac,0x13, +0x9, 0x10,0x6d,0x19,0x12,0x86,0x77,0x39,0x16,0x0, 0x5, 0x7e,0x10,0x9, 0xac,0x13, +0x9, 0x10,0x6d,0x1a,0x12,0x86,0x77,0x39,0x16,0x0, 0x6, 0x7e,0x10,0x9, 0xac,0x13, +0x9, 0x10,0x6d,0x1b,0x12,0x86,0x77,0x39,0x16,0x0, 0x7, 0x7e,0x10,0x9, 0xac,0x13, +0x9, 0x10,0x6d,0x1c,0x12,0x86,0x77,0x39,0x16,0x0, 0x8, 0xb, 0xa0,0x80,0x8, 0xb, +0x30,0xbc,0x83,0x28,0x2, 0xa1,0xbd,0xb, 0x90,0x12,0x85,0x9d,0x28,0x2, 0xa1,0xb9, +0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7e,0xd0,0x9, 0xac,0xda,0x7f,0x67,0x2d,0xd6, +0x22,0xca,0x79,0x7c,0xeb,0x90,0x21,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x70,0x9, 0xac, +0x7f,0x7e,0x8, 0x62,0xb8,0x74,0xff,0x12,0x24,0x34,0xe4,0x6c,0x77,0x7c,0x6e,0x12, +0x85,0xa5,0x7c,0x7e,0x7c,0x6f,0x12,0x85,0xa5,0x7c,0x1b,0x6c,0x0, 0x80,0x3e,0x6c, +0x99,0x80,0x17,0x74,0x9, 0xac,0xb9,0x9, 0xa5,0x62,0xbc,0x7e,0x30,0x9, 0xac,0x30, +0x9, 0x81,0x6d,0x18,0xbc,0x8a,0x68,0x6, 0xb, 0x90,0xbc,0x19,0x38,0xe5,0xbc,0x19, +0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x2e,0x34,0x6d,0x14,0x7e,0x30,0x9, 0xac,0x31, +0x2e,0x14,0x62,0xb8,0x74,0x9, 0x12,0x23,0x44,0xb, 0x10,0xb, 0x0, 0xbc,0xf0,0x38, +0xbe,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x62,0xb8,0x7e,0x8, 0x6d,0xc8,0x12, +0x24,0xf, 0x1b,0xfd,0xda,0x79,0x22,0xca,0x79,0x7e,0xf3,0x6e,0x7c,0x7e,0xe3,0x6e, +0x7d,0x7c,0xbf,0x7c,0x7e,0x12,0x4c,0x9e,0x7c,0xbf,0x12,0x86,0x81,0x4c,0xee,0x78, +0x17,0x12,0x87,0x98,0xca,0x59,0x7e,0x18,0x6d,0x14,0x7e,0x8, 0x6d,0xc8,0x12,0x24, +0xf, 0x1b,0xfd,0x12,0x87,0x4e,0x80,0xe, 0x7e,0xb3,0x6e,0x83,0x70,0x8, 0x12,0x87, +0x4e,0x7c,0xbf,0x12,0xb0,0xa7,0x7c,0xbf,0x12,0xb9,0xc8,0xda,0x79,0x22,0x7e,0xa3, +0x6e,0x7c,0x6c,0x77,0x80,0x3d,0x7e,0x90,0x9, 0xac,0x97,0x9, 0x64,0x6d,0xcc,0x7e, +0x50,0x9, 0xac,0x56,0x9, 0xb2,0x6e,0x22,0x70,0x27,0x74,0x1, 0x19,0xb2,0x59,0xe1, +0x49,0x14,0x6d,0x14,0x59,0x12,0x59,0xe2,0x49,0x14,0x6d,0x16,0x59,0x12,0x59,0xe4, +0xe4,0x19,0xb2,0x59,0xe6,0x19,0xb2,0x59,0xde,0x19,0xb2,0x59,0xdf,0x19,0xb2,0x59, +0xe0,0xb, 0x70,0xbc,0xa7,0x38,0xbf,0x22,0x90,0x21,0x51,0xe4,0x93,0x7c,0xab,0x74, +0x9, 0xa4,0x22,0x7e,0xb3,0x28,0xe4,0x4, 0x7a,0xb3,0x28,0xe4,0x7e,0x73,0x28,0xe4, +0x7a,0x73,0x76,0x19,0x22,0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7a,0x9, 0xb3,0x28,0xb8, +0x60,0x8, 0x74,0x1, 0x7a,0xb3,0x6e,0x87,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0xa, 0x40, +0xe6,0xe4,0x7a,0xb3,0x6e,0x87,0x22,0xe4,0x7a,0xb3,0x76,0x7c,0x90,0x1c,0x45,0x93, +0x7a,0xb3,0x76,0x7e,0x90,0x1c,0x46,0xe4,0x93,0x7a,0xb3,0x76,0x7f,0x90,0x21,0x51, +0xe4,0x93,0x7a,0xb3,0x76,0x81,0xe4,0x7a,0xb3,0x76,0x82,0x7a,0xb3,0x76,0x87,0x12, +0x47,0xb6,0xe4,0x7a,0xb3,0x76,0x8a,0x7e,0x73,0x29,0xb5,0x7a,0x73,0x76,0x9c,0x7e, +0x73,0x29,0xb6,0x7a,0x73,0x76,0x9d,0x7e,0x73,0x29,0xb7,0x7a,0x73,0x76,0x9e,0x7e, +0x73,0x29,0x84,0x7a,0x73,0x76,0xa5,0x7e,0x73,0x29,0x85,0x7a,0x73,0x76,0xa6,0x90, +0x1c,0x49,0x93,0x7a,0xb3,0x76,0x9a,0x90,0x1c,0x4a,0xe4,0x93,0x7a,0xb3,0x76,0x9b, +0x74,0x1, 0x7a,0xb3,0x76,0xac,0x7e,0x34,0x22,0x32,0x12,0x29,0xdb,0x7a,0x37,0x76, +0xd6,0x74,0x2, 0x7a,0xb3,0x76,0x85,0x74,0x17,0x7a,0xb3,0x76,0xa9,0x22,0x7e,0x18, +0x14,0x30,0x7a,0x1f,0x24,0x64,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x24,0x68,0x7e,0xf, +0x24,0x64,0x12,0x37,0xef,0x7e,0xf, 0x24,0x68,0x7e,0x34,0x4, 0xc, 0x12,0x24,0x34, +0x7a,0xb3,0x25,0xae,0x22,0x7e,0x8, 0x6b,0x54,0x7e,0x34,0x1, 0xa1,0xe4,0x12,0x24, +0x34,0x90,0x21,0x52,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x6b,0xd0,0x74, +0xff,0x2, 0x24,0x34,0x7e,0x34,0x22,0x5, 0x12,0x29,0xdb,0x7a,0x37,0x6c,0xf7,0x7e, +0x34,0x22,0x7, 0x12,0x29,0xdb,0x7a,0x37,0x6c,0xf9,0x7e,0x34,0x22,0x9, 0x12,0x29, +0xdb,0x12,0x88,0xd7,0x90,0x22,0xc, 0xe4,0x93,0x7a,0xb3,0x6c,0xfe,0xe4,0x7a,0xb3, +0x6d,0x7, 0x7a,0xb3,0x6d,0x8, 0x22,0x7a,0x37,0x6c,0xfb,0x90,0x22,0xb, 0xe4,0x93, +0x7a,0xb3,0x6c,0xfd,0x22,0x7c,0x6b,0x7c,0x56,0x5e,0x50,0x4, 0x1e,0x50,0xa, 0x45, +0x7c,0xb6,0x54,0x1, 0xa, 0x5b,0x2d,0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0x4, 0x1e, +0x60,0xa, 0x26,0x7c,0xb7,0x54,0x1, 0xa, 0x3b,0x2d,0x32,0x7c,0xb7,0xa, 0x4b,0x3e, +0x44,0x3e,0x44,0xa, 0x5a,0x2d,0x54,0x7c,0xab,0x7a,0xa3,0x73,0x25,0xe4,0x7a,0xb3, +0x73,0x26,0x7e,0x70,0x4, 0x7c,0xba,0x30,0xe0,0x9, 0x7e,0xb3,0x73,0x26,0x4, 0x7a, +0xb3,0x73,0x26,0x1e,0xa0,0x1b,0x70,0x78,0xec,0x22,0x7c,0x9b,0x12,0xd8,0xab,0x7e, +0x50,0xa, 0xac,0x59,0x59,0x32,0x29,0x8c,0x74,0x27,0xac,0xb9,0x49,0x5, 0x28,0xeb, +0x59,0x2, 0x29,0x8e,0x49,0x15,0x28,0xed,0xb, 0x14,0xad,0x10,0x6d,0x0, 0x59,0x12, +0x29,0x92,0x59,0x2, 0x29,0x90,0x12,0x89,0x7f,0x19,0xa3,0x29,0x8a,0x74,0x27,0xac, +0xb9,0x49,0x35,0x28,0xed,0xb, 0x34,0x12,0x89,0x7f,0x19,0xa3,0x29,0x8b,0x22,0x12, +0x89,0x8a,0x7c,0xab,0x7e,0x70,0xa, 0xac,0x79,0x22,0xe4,0x80,0x5, 0xb, 0x34,0x1e, +0x34,0x4, 0xbe,0x34,0x0, 0x10,0x38,0xf5,0x22,0xca,0x3b,0x7c,0xeb,0xc2,0x2, 0x7e, +0x70,0x27,0xac,0x7e,0x9, 0xf3,0x28,0xea,0x12,0x8a,0x4f,0x4c,0xee,0x68,0x18,0xd2, +0x2, 0xe4,0x19,0xb3,0x28,0xe8,0x7c,0xbe,0x12,0x89,0x3a,0x12,0x8a,0x26,0x12,0x8a, +0x59,0x12,0x3c,0x8, 0x12,0x8a,0xa5,0xa2,0x2, 0xda,0x3b,0x22,0xca,0x79,0x7c,0xfb, +0xd2,0x0, 0xc2,0x1, 0x6d,0x33,0x7a,0x37,0x77,0xd0,0x74,0x27,0xac,0xbf,0x9, 0xe5, +0x28,0xe8,0x7c,0xbf,0x12,0x89,0x99,0x92,0x1, 0x7c,0xbf,0x12,0x8a,0x72,0x92,0x0, +0x30,0x0, 0x7, 0x7c,0xbf,0x7c,0x7f,0x12,0x41,0x66,0x7e,0xb3,0x76,0xaa,0x70,0xc, +0x7c,0xbf,0x12,0xd8,0xe2,0x92,0x2e,0x20,0x2e,0x2, 0xc2,0x0, 0x30,0x1, 0x12,0x74, +0x27,0xac,0xbf,0x19,0xe5,0x28,0xe8,0x7c,0xbf,0x12,0x89,0x3a,0x7c,0xbf,0x12,0x8a, +0x3a,0xa2,0x0, 0xda,0x79,0x22,0xe4,0x7a,0xb3,0x76,0xfc,0x12,0xe5,0xd2,0x7a,0xb3, +0x76,0xff,0x12,0xe4,0xbb,0x7a,0xb3,0x77,0x7, 0x22,0xca,0x3b,0x7c,0xeb,0x12,0xe6, +0x43,0x12,0x8a,0x4f,0xe5,0x1e,0x12,0x3b,0xdd,0x12,0x8a,0xa5,0xda,0x3b,0x22,0x7e, +0xd0,0xb5,0xac,0xdf,0x2e,0x64,0x1, 0x0, 0x22,0x7e,0x34,0x0, 0x4, 0x12,0x8f,0x77, +0x74,0x1, 0x12,0x8f,0xbf,0x7e,0x73,0x77,0xe1,0x7a,0x73,0x77,0x2, 0x7a,0x73,0x77, +0x3, 0x22,0xca,0xf8,0x7c,0xab,0xc2,0x2, 0x12,0x8f,0x6f,0xac,0x67,0x9, 0xf3,0x74, +0x82,0x7c,0xba,0x12,0x8a,0xf4,0x6c,0xaa,0x6c,0x77,0x7e,0x50,0x26,0xac,0x57,0x19, +0xa2,0x74,0x8e,0xb, 0x70,0xa5,0xbf,0x3, 0xf1,0x30,0x2, 0x5, 0x7c,0xbf,0x12,0x34, +0xac,0xd3,0xda,0xf8,0x22,0xe4,0x12,0x35,0x28,0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14, +0x0, 0xf4,0x6d,0x0, 0x74,0x1, 0x7e,0x70,0x27,0xac,0x7e,0x9, 0x73,0x28,0xe8,0x12, +0xd, 0x23,0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14,0x0, 0xf8,0x6d,0x0, 0x74,0xa, 0xac, +0xbe,0x9, 0xb5,0x29,0x8a,0x12,0xd, 0x73,0x7d,0x36,0xb, 0x35,0x74,0x2c,0xac,0xbf, +0x49,0x25,0x0, 0xf8,0x12,0x0, 0x2e,0x7d,0x36,0x74,0x2c,0xac,0xbf,0x49,0x25,0x0, +0xf4,0x2, 0x0, 0x2e,0x7c,0x9b,0x7e,0x24,0x0, 0x1, 0x7c,0xb9,0x60,0x5, 0x3e,0x24, +0x14,0x78,0xfb,0x7e,0x83,0x73,0x1f,0xa, 0x38,0x5d,0x32,0x68,0xb, 0x12,0x46,0x5d, +0x7e,0x83,0x74,0x7e,0x7a,0x83,0x75,0x6, 0x6c,0xaa,0x7e,0xb3,0x75,0x6, 0xbc,0xba, +0x78,0x8, 0x6c,0x88,0x12,0x8b,0x55,0xe4,0x80,0x1f,0x7e,0x24,0x0, 0x1, 0x7c,0xb9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0xb3,0x73,0x1f,0xa, 0x3b,0x5d,0x32,0x68, +0xc, 0x7e,0x80,0x1, 0x12,0x8b,0x55,0x74,0x1, 0x19,0xb3,0x74,0x8f,0xb, 0xa0,0xbe, +0xa0,0x3, 0x40,0xc6,0x22,0x7e,0x70,0x26,0xac,0x7a,0x19,0x83,0x74,0x8e,0x22,0xca, +0xf8,0x7e,0xf3,0x77,0xe1,0x20,0xb, 0x6, 0x20,0xc, 0x3, 0x30,0xe, 0x3, 0xc3,0x80, +0x57,0x12,0x8b,0xcb,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x73,0x1f,0x6c, +0x44,0x5c,0x57,0x4d,0x22,0x68,0x40,0x7e,0xb3,0x76,0xaa,0x70,0x8, 0x4e,0x73,0x73, +0x20,0x7a,0x73,0x73,0x20,0x12,0x8f,0x67,0x12,0x89,0xcc,0x40,0x3, 0xc3,0x80,0x28, +0x20,0xb, 0x6, 0x20,0xc, 0x3, 0x30,0xe, 0x3, 0xc3,0x80,0x1c,0x12,0x8b,0xcb,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x6e,0x70,0xff,0x5e,0x73,0x73,0x1f,0x7a,0x73,0x73, +0x1f,0x12,0x8b,0xd2,0xd3,0x80,0x1, 0xd3,0xda,0xf8,0x22,0x7e,0x34,0x0, 0x1, 0x7c, +0xbf,0x22,0x7e,0x73,0x76,0x14,0x7e,0xb3,0x76,0x2f,0x70,0x3a,0xe5,0x1e,0x70,0x1d, +0x7e,0x63,0x76,0x12,0xbe,0x60,0x14,0x28,0x5, 0x7e,0x60,0x14,0x80,0x7, 0xa5,0xbe, +0x0, 0x3, 0x7e,0x60,0x1, 0xa, 0x26,0x7e,0x34,0x0, 0x64,0x80,0x74,0xe5,0x1e,0xb4, +0x3, 0x2, 0x80,0x44,0x12,0x8c,0x90,0xb4,0x1, 0x6, 0x7e,0x34,0x1, 0xf4,0x80,0x61, +0x7e,0x34,0x3, 0xe8,0x80,0x5b,0xe5,0x1e,0x70,0xe, 0x7e,0x63,0x76,0x13,0xbe,0x60, +0x7f,0x28,0x53,0x7e,0x60,0x7f,0x80,0x4e,0x7e,0x63,0x29,0xfc,0xbe,0x60,0x3b,0x40, +0x12,0x12,0x8c,0x90,0xb4,0x1, 0x6, 0x7e,0x34,0x1, 0xf4,0x80,0x26,0x7e,0x34,0x3, +0xe8,0x80,0x20,0xe5,0x1e,0xb4,0x3, 0x8, 0x7e,0x73,0x76,0x49,0xa, 0x37,0x80,0x15, +0x30,0x1a,0x18,0x12,0x8c,0x90,0xb4,0x1, 0x6, 0x7e,0x34,0x1, 0xf4,0x80,0x4, 0x7e, +0x34,0x3, 0xe8,0x8d,0x32,0x1b,0x34,0x7c,0x67,0x80,0xb, 0xa, 0x27,0x7e,0x34,0x3, +0xe8,0x12,0x22,0x71,0x7c,0x67,0x7e,0x73,0x76,0x36,0xac,0x67,0x7e,0x24,0x0, 0x18, +0x12,0x22,0x71,0x7a,0x73,0x77,0xd4,0xc2,0x14,0x6d,0x33,0x7a,0x37,0x77,0xd0,0x22, +0x7e,0xb3,0x77,0xd9,0xa, 0x27,0x22,0x7e,0xa1,0x2a,0x74,0xa, 0xa4,0x49,0x35,0x29, +0x8c,0x7d,0xb3,0x7f,0x70,0x7d,0x3b,0x12,0x89,0x8a,0x7c,0x7b,0xa, 0x57,0x2e,0x54, +0x0, 0xb, 0x7e,0x18,0x0, 0x1, 0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x74,0x4, 0x2f, +0x11,0x14,0x78,0xfb,0x7d,0x1b,0x12,0x22,0xbd,0x7f,0x61,0xbe,0xb4,0x0, 0x10,0x68, +0x6e,0x7e,0x73,0x6e,0xaf,0x7a,0x73,0x65,0x1e,0x7e,0x73,0x6e,0xb0,0x7a,0x73,0x65, +0x1f,0x74,0xb, 0x7a,0xb3,0x65,0x20,0x7d,0xaf,0x7a,0xa7,0x65,0x22,0x7a,0xa7,0x65, +0x26,0xbe,0xb4,0x0, 0x2, 0x38,0xd, 0xe4,0x7a,0xb3,0x65,0x20,0x7e,0xd4,0x0, 0x10, +0x8d,0xdb,0x6d,0xcc,0x7e,0x8, 0x65,0x1e,0x7d,0x3d,0x12,0x9, 0x50,0x7e,0x47,0x73, +0x21,0x7e,0xa0,0x4, 0x7d,0x34,0x3e,0x34,0x7f,0x57,0x2d,0xb3,0xb, 0x5a,0x10,0x7f, +0x16,0x12,0x22,0xb4,0x7e,0xb3,0x65,0x20,0x60,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3, +0x4e,0x60,0x80,0x14,0x78,0xf4,0x1b,0x5a,0x30,0xb, 0x44,0x1b,0xa0,0x78,0xd5,0x22, +0xca,0xd8,0xca,0x79,0xd2,0x0, 0x12,0x4e,0x92,0x50,0xfb,0x7e,0xe3,0x77,0x6, 0x7a, +0xe3,0x25,0xaf,0x7e,0xd3,0x77,0x7, 0xa, 0x3e,0x9, 0xb3,0x77,0x0, 0x60,0x38,0xa, +0x3b,0x1b,0x34,0x7c,0xa7,0x7a,0xa3,0x76,0xa7,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x25,0xae,0xe4,0xa, 0x3e,0x19,0xb3,0x77,0x0, 0x9, 0xf3,0x77,0x2, +0x7c,0xbe,0x7c,0x7f,0x12,0x8e,0x47,0x7c,0xbe,0x7c,0x7f,0x12,0xc5,0xd6,0x7e,0xb3, +0x77,0x6, 0x4, 0x7a,0xb3,0x77,0x6, 0x7e,0x73,0x77,0x7, 0xbe,0x73,0x77,0x6, 0x38, +0x9, 0x12,0x28,0xaf,0x12,0x8e,0xd4,0x12,0x3b,0x72,0x7e,0xb3,0x25,0xae,0xbe,0xb0, +0x1, 0x68,0x7, 0x7e,0xb3,0x77,0xfa,0xb4,0x3, 0x46,0x74,0xa, 0xac,0xbf,0x49,0x35, +0x29,0x8c,0x7e,0xf, 0x24,0x60,0x12,0x8c,0xa1,0x7c,0xbe,0x7c,0x7f,0x12,0x8e,0x78, +0x92,0x0, 0x7e,0xb3,0x77,0xd9,0x70,0xc, 0xbe,0xe0,0x1, 0x40,0x7, 0xe4,0x7a,0xb3, +0x25,0xae,0xc2,0x0, 0x7c,0xbe,0x7c,0x7f,0x12,0xc3,0x47,0x30,0x0, 0x12,0x12,0x76, +0xeb,0x7c,0xbe,0x7c,0x7f,0x12,0xc2,0x79,0x7a,0xe3,0x76,0xa8,0x7a,0xf3,0x77,0xe5, +0x7e,0xb3,0x77,0xfa,0xb4,0x1, 0x3, 0x12,0x92,0x2d,0x7c,0xbd,0x14,0xbc,0xbe,0x78, +0x3, 0x12,0xb, 0xe5,0x12,0xd2,0xf2,0x12,0x75,0x1b,0x50,0x7, 0x7c,0xbf,0x7c,0x7e, +0x12,0xc0,0xa1,0xda,0x79,0xda,0xd8,0x22,0xca,0xf8,0x6c,0xff,0x12,0x8d,0x40,0xb, +0xf0,0x7e,0x73,0x77,0x7, 0xbc,0x7f,0x38,0xf3,0x12,0x8e,0x3f,0xda,0xf8,0x22,0x7e, +0xb3,0x76,0xa8,0x7e,0x73,0x77,0xe5,0x14,0x68,0x1d,0x4, 0x78,0x1a,0x7e,0x8, 0xc, +0x18,0x7a,0xf, 0x24,0x60,0x7e,0x8, 0x14,0x30,0x7a,0xf, 0x24,0x64,0xa5,0xbf,0x3, +0x16,0x7e,0x18,0x1c,0x48,0x80,0xc, 0x7e,0x18,0x10,0x24,0x7a,0x1f,0x24,0x60,0x7e, +0x18,0x18,0x3c,0x7a,0x1f,0x24,0x64,0x22,0x7c,0x67,0x7c,0x7b,0xd2,0x1, 0x7e,0xb3, +0x77,0xfa,0xb4,0x3, 0x4c,0x7c,0xb6,0x12,0x8f,0x4b,0x50,0x45,0x7e,0xa3,0x76,0x85, +0xbe,0xa0,0x2, 0x40,0x32,0x7e,0xb3,0x76,0x8d,0x70,0x28,0x7e,0x63,0x78,0x41,0xa, +0x26,0x2e,0x24,0x0, 0xe, 0x12,0xc5,0x13,0x24,0xff,0x92,0x1, 0x7c,0xb6,0x4, 0x7a, +0xb3,0x78,0x41,0x7e,0x63,0x78,0x41,0xbe,0x60,0x4, 0x40,0x15,0xe4,0x7a,0xb3,0x78, +0x41,0x80,0xe, 0xd2,0x1, 0x80,0xa, 0xbc,0xa7,0x78,0x4, 0xd2,0x1, 0x80,0x2, 0xc2, +0x1, 0xa2,0x1, 0x22,0x12,0xc7,0xb7,0xc2,0x17,0x7e,0xb3,0x74,0x81,0x60,0x67,0x12, +0x8f,0x47,0x40,0x10,0x7e,0xa3,0x74,0x7f,0x74,0x26,0xa4,0x9, 0x75,0x74,0x83,0xbe, +0x70,0x1, 0x40,0x52,0x7e,0x73,0x74,0x7f,0xb, 0x70,0xbe,0x70,0x3, 0x40,0x2, 0x6c, +0x77,0x7e,0x14,0x0, 0x1, 0x7c,0xb7,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x7e,0x63, +0x74,0x7b,0xa, 0x26,0x5d,0x21,0xbe,0x24,0x0, 0x0, 0x8, 0x9, 0xb, 0x70,0xbe,0x70, +0x3, 0x40,0x2, 0x6c,0x77,0x7e,0x63,0x74,0x7e,0xbc,0x67,0x78,0x9, 0x7e,0xb3,0x74, +0x80,0x4, 0x7a,0xb3,0x74,0x80,0x12,0xc1,0xa2,0x7e,0xb3,0x77,0xe1,0x38,0x4, 0x7c, +0x76,0x80,0x0, 0x2, 0x35,0x5a,0x22,0x7e,0xb3,0x77,0xe1,0x7c,0xab,0xd2,0x2, 0x7e, +0xb3,0x77,0xd9,0x70,0x4, 0xc2,0x2, 0x80,0xb, 0x4c,0xaa,0x68,0x5, 0xbe,0xa0,0x3, +0x78,0x2, 0xc2,0x2, 0xa2,0x2, 0x22,0xd2,0x4, 0x12,0x36,0xe7,0x7c,0xbf,0x22,0x7e, +0x63,0x74,0x7e,0x7e,0x70,0x26,0x22,0x7e,0x24,0xc, 0x18,0x7e,0x14,0x10,0x24,0x22, +0x6d,0x33,0x12,0x8f,0x77,0x7e,0x57,0x76,0xdc,0x12,0x8f,0xbf,0xe4,0x2, 0x8f,0x90, +0x7a,0xb3,0x77,0x2, 0x7a,0xb3,0x77,0x3, 0x22,0x7e,0x34,0x0, 0x2, 0x12,0x8f,0x77, +0x7e,0x57,0x76,0xec,0x12,0x8f,0xbf,0x74,0x2, 0x2, 0x8f,0x90,0x7e,0x34,0x0, 0x1, +0x12,0x8f,0x77,0x7e,0x57,0x76,0xe4,0x12,0x8f,0xbf,0x74,0x1, 0x2, 0x8f,0x90,0x7c, +0x1b,0x7d,0x43,0x7e,0xa3,0x76,0xfc,0xbe,0xa0,0x5, 0x50,0x1e,0x7e,0x70,0x7, 0xac, +0x7a,0x59,0x43,0x77,0x8, 0x59,0x23,0x77,0xa, 0x59,0x13,0x77,0xc, 0x19,0x13,0x77, +0xe, 0x7c,0xba,0x4, 0x7a,0xb3,0x76,0xfc,0xc3,0x22,0xd3,0x22,0x7e,0x34,0x0, 0x3, +0x12,0x8f,0x77,0x7e,0x57,0x76,0xf4,0x12,0x8f,0xbf,0x74,0x3, 0x2, 0x8f,0x90,0x7e, +0xb3,0x6e,0xa2,0x60,0x2, 0x41,0x6, 0x12,0x92,0x25,0x78,0x2, 0x41,0x6, 0x7e,0xa3, +0x6c,0xde,0xbe,0xa0,0x1, 0x78,0x1b,0x7e,0xb3,0x6c,0xf4,0x70,0x15,0x7e,0xb3,0x6b, +0x54,0x7a,0xb3,0x77,0x73,0x7e,0xb3,0x6b,0x55,0x7a,0xb3,0x77,0x74,0xe4,0x7a,0xb3, +0x77,0x75,0xbe,0xa0,0x0, 0x28,0x3e,0xc2,0x0, 0x6c,0x11,0x80,0x21,0x12,0x92,0x18, +0x7e,0x73,0x77,0x73,0xa, 0x27,0x1a,0x39,0x12,0x92,0xe, 0x58,0xf, 0x7e,0x73,0x77, +0x74,0xa, 0x27,0x1a,0x30,0x12,0x92,0xe, 0x58,0x2, 0xd2,0x0, 0xb, 0x10,0x12,0x92, +0x7, 0x38,0xda,0x30,0x0, 0xc, 0x7e,0xb3,0x77,0x75,0xbe,0xb0,0xc8,0x50,0xb, 0x4, +0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x77,0x75,0x7e,0x73,0x6c,0xde,0xbe,0x70, +0x2, 0x50,0x2, 0x41,0x6, 0x7e,0xb3,0x6e,0x7d,0xb4,0x1, 0x2, 0x80,0x2, 0x41,0x6, +0x6d,0xee,0x6c,0x11,0x80,0x1a,0x12,0x92,0x18,0x12,0x57,0xf4,0x7d,0xd3,0xbd,0xde, +0x8, 0xc, 0x7d,0xed,0x7a,0x93,0x6c,0xe6,0x7a,0x3, 0x6c,0xe7,0x7c,0x81,0xb, 0x10, +0x12,0x92,0x7, 0x38,0xe1,0x6c,0x11,0x21,0xff,0xbc,0x81,0x78,0x2, 0x21,0xfd,0x7e, +0x30,0x2, 0xac,0x31,0x9, 0xb1,0x6b,0x54,0xf5,0x2a,0x9, 0xb1,0x6b,0x55,0xf5,0x2b, +0x7e,0xa3,0x6c,0xe6,0x7a,0xa1,0x2c,0x7e,0xb3,0x6c,0xe7,0xf5,0x2d,0xbe,0xa1,0x2a, +0x28,0x4, 0xe5,0x2a,0x80,0x2, 0xe5,0x2c,0xf5,0x26,0xe5,0x2c,0xbe,0xb1,0x2a,0x50, +0x4, 0xe5,0x2a,0x80,0x2, 0xe5,0x2c,0xf5,0x28,0xe5,0x2d,0xbe,0xb1,0x2b,0x28,0x4, +0xe5,0x2b,0x80,0x2, 0xe5,0x2d,0xf5,0x27,0xe5,0x2d,0xbe,0xb1,0x2b,0x50,0x5, 0x7e, +0xa1,0x2b,0x80,0x3, 0x7e,0xa1,0x2d,0x7a,0xa1,0x29,0xe5,0x26,0x1a,0xfb,0xe5,0x28, +0x1a,0x1b,0x9d,0x1f,0xb, 0x14,0x7c,0xb3,0xf5,0x2e,0xe5,0x27,0x1a,0x1b,0x1a,0x5a, +0x9d,0x51,0xb, 0x54,0xf5,0x2f,0x12,0x57,0x4, 0x7d,0xf3,0xe5,0x2f,0xbe,0xb1,0x2e, +0x50,0x50,0xe5,0x27,0xbe,0xb0,0x0, 0x8, 0x2, 0x15,0x27,0x7e,0x73,0x6e,0xb2,0xa, +0xc7,0x1b,0xc4,0xe5,0x29,0x1a,0x1b,0xbd,0x1c,0x58,0x2, 0x5, 0x29,0x7e,0x91,0x28, +0x12,0x57,0x4, 0x7d,0xe3,0x80,0x23,0x1b,0x90,0x6d,0xdd,0x7e,0x1, 0x29,0x80,0xe, +0x12,0x57,0xf4,0xbd,0x3d,0x8, 0x5, 0x12,0x57,0xf4,0x7d,0xd3,0x1b,0x0, 0xe5,0x27, +0xbc,0xb0,0x8, 0xec,0xbd,0xde,0x58,0x2, 0x7d,0xed,0xe5,0x26,0xbc,0xb9,0x48,0xd7, +0x80,0x4e,0xe5,0x26,0xbe,0xb0,0x0, 0x8, 0x2, 0x15,0x26,0x7e,0x73,0x6e,0xb1,0xa, +0xc7,0x1b,0xc4,0xe5,0x28,0x1a,0x1b,0xbd,0x1c,0x58,0x2, 0x5, 0x28,0x7e,0x1, 0x29, +0x12,0x57,0x4, 0x7d,0xe3,0x80,0x23,0x1b,0x0, 0x6d,0xdd,0x7e,0x91,0x28,0x80,0xe, +0x12,0x57,0xf4,0xbd,0x3d,0x8, 0x5, 0x12,0x57,0xf4,0x7d,0xd3,0x1b,0x90,0xe5,0x26, +0xbc,0xb9,0x8, 0xec,0xbd,0xde,0x58,0x2, 0x7d,0xed,0xe5,0x27,0xbc,0xb0,0x48,0xd7, +0x7d,0x3f,0x3e,0x34,0x3e,0x34,0x7e,0x24,0x0, 0xa, 0x12,0x22,0x71,0xbd,0x3e,0x58, +0xc, 0x7e,0x73,0x77,0x75,0xbe,0x70,0x28,0x50,0x3, 0x12,0x57,0x45,0xb, 0x10,0x12, +0x92,0x7, 0x28,0x2, 0x1, 0xb9,0x22,0x7e,0x73,0x6c,0xde,0xbc,0x71,0x22,0x9d,0x32, +0x12,0x24,0x56,0xbe,0x34,0x0, 0x2, 0x22,0x74,0x2, 0xac,0xb1,0x9, 0x95,0x6b,0x54, +0x9, 0x5, 0x6b,0x55,0x22,0x7e,0xb3,0x6e,0xa3,0xbe,0xb0,0x1, 0x22,0x6d,0x11,0x7d, +0x21,0x7d,0x31,0x80,0x1f,0x7d,0x1, 0x3e,0x4, 0x7e,0x2f,0x24,0x60,0x2d,0x50,0xb, +0x2a,0x0, 0xbe,0x4, 0x3a,0x98,0x28,0x2, 0xb, 0x24,0xbe,0x4, 0xb, 0xb8,0x50,0x2, +0xb, 0x34,0xb, 0x14,0x7e,0x7, 0x73,0x21,0xbd,0x1, 0x38,0xd9,0xbe,0x24,0x0, 0xb4, +0x28,0x7, 0x7e,0xb3,0x77,0x70,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x77,0x70,0xbe,0x34, +0x0, 0x32,0x28,0x7, 0x7e,0xb3,0x77,0x72,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x77,0x72, +0x7e,0xa3,0x77,0x70,0xbe,0xa0,0x2, 0x40,0x6, 0x74,0xaa,0x7a,0xb3,0x76,0x77,0xbe, +0xa0,0x4, 0x50,0x9, 0x7e,0x73,0x77,0x72,0xbe,0x70,0x4, 0x40,0x3, 0x75,0xe9,0xff, +0x22,0x7c,0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x6b,0x54,0x9, 0x73,0x6b,0x55, +0x2, 0x57,0x9, 0xca,0x3b,0x7c,0xf4,0x7a,0x51,0x2b,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb, +0x75,0x35,0x0, 0x75,0x36,0x0, 0x75,0x37,0x0, 0x75,0x38,0x0, 0x75,0x39,0x0, 0x75, +0x3a,0x0, 0x75,0x3f,0x0, 0x7e,0x37,0x6e,0x9f,0x7a,0x35,0x40,0x6c,0xaa,0x7e,0x71, +0x2b,0x74,0x9, 0xac,0x7b,0x19,0xa3,0x6b,0xd5,0xe4,0x19,0xb3,0x6b,0xd6,0x7e,0x13, +0x6e,0xaf,0x7e,0xb3,0x6e,0xb0,0xf5,0x34,0x12,0xe6,0x19,0xf5,0x32,0x9, 0xb3,0x6b, +0x55,0xf5,0x33,0x7c,0xbe,0x12,0x92,0xa1,0x12,0x97,0x87,0x7a,0x35,0x40,0x7e,0x37, +0x6e,0x9f,0xbe,0x35,0x40,0x8, 0x3, 0x7a,0x35,0x40,0xe5,0x32,0x7c,0x71,0x7c,0x6c, +0x7e,0x8, 0x0, 0x37,0x12,0x95,0x74,0xf5,0x35,0xe5,0x33,0x7e,0x71,0x34,0x7c,0x6d, +0x7e,0x8, 0x0, 0x38,0x12,0x95,0x74,0xf5,0x36,0xbe,0xf0,0x1, 0xe5,0x37,0x7e,0x71, +0x38,0x78,0xb, 0x12,0x57,0xe7,0x3e,0x34,0x2e,0x34,0x20,0x54,0x80,0x3, 0x12,0x57, +0xd9,0x7a,0x35,0x3d,0x7a,0x37,0x62,0xbe,0x7e,0x34,0x24,0xbc,0x7a,0x37,0x62,0xc0, +0xe5,0x37,0x7a,0xb3,0x62,0xb8,0xe5,0x38,0x7a,0xb3,0x62,0xb9,0xe5,0x35,0x7a,0xb3, +0x62,0xba,0xe5,0x36,0x7a,0xb3,0x62,0xbb,0x7e,0x73,0x6e,0x8a,0x7a,0x73,0x62,0xbc, +0xe4,0x7a,0xb3,0x62,0xbd,0x7e,0x8, 0x62,0xb8,0x12,0x8, 0x73,0x7e,0x37,0x24,0xbc, +0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x24,0xbe,0x6d,0xaa,0x2f,0x51,0x7e,0x37,0x24,0xc0, +0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x24,0xc2,0x2f,0x10,0x7a,0x1d,0x2c,0x7e, +0x37,0x24,0xc4,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x24,0xc6,0x6d,0x88,0x2f,0x41,0x7f, +0x65,0xe5,0x35,0xa, 0x4b,0xe5,0x37,0xa, 0x5b,0x2d,0x54,0xf5,0x39,0xe5,0x36,0xa, +0x4b,0xe5,0x38,0xa, 0x5b,0x2d,0x54,0xf5,0x3a,0x85,0x37,0x30,0x81,0xc4,0x85,0x38, +0x31,0x81,0xb9,0xbe,0xf0,0x1, 0x78,0x15,0xe5,0x34,0x7e,0x71,0x30,0xac,0x7b,0xe5, +0x31,0xa, 0x2b,0x2d,0x32,0x3e,0x34,0x49,0x33,0x20,0x54,0x80,0x8, 0xe5,0x30,0x7e, +0x71,0x31,0x12,0x57,0x9, 0x7e,0x53,0x6e,0x8a,0xa, 0x25,0x9d,0x32,0x12,0xe6,0xae, +0x18,0x2, 0x81,0xb7,0x7e,0x35,0x40,0xbe,0x35,0x3b,0x18,0x2, 0x5, 0x3f,0xe5,0x32, +0xa, 0x1b,0xe5,0x30,0x12,0x95,0x69,0x8, 0x4, 0x9d,0x31,0x80,0x4, 0x6d,0x33,0x9d, +0x32,0xbe,0x34,0x0, 0x1, 0x18,0x19,0xe5,0x33,0xa, 0x1b,0xe5,0x31,0x12,0x95,0x69, +0x8, 0x4, 0x9d,0x31,0x80,0x4, 0x6d,0x33,0x9d,0x32,0xbe,0x34,0x0, 0x1, 0x8, 0x67, +0xbe,0xc0,0x3, 0x40,0x9, 0xbe,0xd0,0x3, 0x40,0x4, 0xd2,0x0, 0x80,0x2, 0xc2,0x0, +0xe5,0x30,0x7e,0x71,0x31,0x7c,0x6e,0x12,0x99,0x7f,0x7c,0x9b,0xbe,0x90,0x2, 0x68, +0x5, 0xbe,0x90,0x3, 0x78,0x8, 0x7e,0x35,0x3b,0xe, 0x34,0x7a,0x35,0x3b,0xbe,0x90, +0x2, 0x68,0xa, 0xbe,0x90,0x1, 0x68,0x5, 0xbe,0x90,0x3, 0x78,0x2a,0x7e,0xf5,0x3b, +0x12,0x95,0x53,0xe5,0x30,0x12,0x95,0x5a,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a, +0x1d,0x2c,0x12,0x95,0x53,0xe5,0x31,0x12,0x95,0x5a,0x9f,0x41,0x12,0x95,0x53,0x9f, +0x51,0x1a,0x26,0x1a,0x24,0x9f,0x61,0x5, 0x31,0xe5,0x3a,0xbe,0xb1,0x31,0x28,0x2, +0x61,0xe3,0x5, 0x30,0xe5,0x39,0xbe,0xb1,0x30,0x28,0x2, 0x61,0xde,0xbe,0x58,0x0, +0x0, 0x78,0x2, 0xb, 0x5c,0xbe,0x68,0x0, 0x0, 0x78,0x2, 0xb, 0x6c,0x74,0x6, 0x7e, +0x1d,0x2c,0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x2c,0x7f,0x5, 0x12,0x95,0x61,0x7e, +0xf1,0x2b,0x74,0x9, 0xac,0xfb,0x59,0x37,0x6b,0xd0,0x74,0x6, 0x2f,0x44,0x14,0x78, +0xfb,0x7f,0x14,0x7f,0x6, 0x12,0x95,0x61,0x59,0x37,0x6b,0xd2,0x7e,0xb3,0x6e,0x9e, +0x60,0xd, 0x1e,0xd4,0x1e,0xc4,0x50,0x4, 0x4e,0xd4,0x80,0x0, 0x14,0x78,0xf3,0xbe, +0x68,0x0, 0x7f,0x28,0x4, 0x7e,0x68,0x0, 0x7f,0x7d,0x3d,0x19,0x77,0x6b,0xd5,0xe5, +0x3f,0x19,0xb7,0x6b,0xd6,0x9, 0x77,0x6b,0xd6,0xbe,0x70,0x2d,0x28,0x6, 0x74,0x2d, +0x19,0xb7,0x6b,0xd6,0xe5,0x32,0x19,0xb7,0x6b,0xd7,0xe5,0x33,0x19,0xb7,0x6b,0xd8, +0xda,0x3b,0x22,0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x22,0xa, 0x1b,0x6d,0x0, 0x2, 0x22, +0xa3,0x12,0x22,0xbf,0x2e,0x18,0x0, 0x20,0x22,0xa, 0x3b,0x7d,0x23,0x9d,0x21,0xbe, +0x24,0x0, 0x0, 0x22,0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32, +0x3e,0x34,0xb, 0x34,0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f, +0x9d,0xf3,0xa, 0x39,0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9, +0x28,0xd, 0xa, 0x39,0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, +0x3f,0xa, 0x58,0x2d,0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a, +0xb, 0xb0,0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0x6b,0x74, +0x2, 0xac,0xbe,0x9, 0xc5,0x6b,0x54,0x9, 0xd5,0x6b,0x55,0x7e,0x53,0x6c,0xde,0xbe, +0x50,0x2, 0x28,0x17,0x74,0x9, 0xac,0xbe,0x9, 0x55,0x6b,0xd6,0xbe,0x50,0xf, 0x50, +0xa, 0x7c,0xb6,0x7c,0x6e,0x7c,0x5f,0x6c,0x44,0x80,0x1d,0x7c,0xbc,0x7c,0x7d,0x12, +0x97,0x96,0x12,0x96,0x1e,0x7c,0xbc,0x7c,0x7d,0x12,0x9a,0x22,0x74,0x6, 0x7e,0x70, +0x6, 0x7c,0x6e,0x7c,0x5f,0x7e,0x40,0x1, 0x12,0x92,0xb3,0xda,0x3b,0x22,0xca,0x79, +0xc2,0x0, 0x7e,0x7, 0x73,0xcf,0xb, 0x4, 0x7d,0x40,0xe, 0x44,0xe, 0x44,0xe, 0x44, +0x9f,0x11,0x6d,0xff,0x6d,0x11,0x6c,0xee,0x6c,0xff,0x1a,0x5f,0x3e,0x54,0x1a,0xce, +0x7e,0xd4,0x0, 0x1a,0xad,0xdc,0x2d,0x5d,0x49,0xe5,0x73,0x27,0xbd,0x4e,0x58,0x10, +0xbd,0xe, 0x8, 0xc, 0x7d,0x5e,0x7d,0xde,0x1a,0x5a,0x1a,0xca,0x2f,0x16,0xb, 0x14, +0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xd3,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xca,0xbe,0x14, +0x0, 0x0, 0x28,0x5, 0x12,0x22,0xbd,0x7d,0xf3,0x7e,0x8, 0x62,0xb8,0x12,0x97,0x8e, +0x6c,0xee,0x6c,0xff,0x1a,0xef,0x3e,0xe4,0x1a,0x2e,0x7e,0x34,0x0, 0x1a,0xad,0x32, +0x7d,0x23,0x2d,0x2e,0x49,0xe2,0x73,0x27,0xbe,0xe4,0x0, 0x0, 0x8, 0x10,0x7d,0x3e, +0x9d,0x3f,0xbe,0x34,0x0, 0x0, 0x58,0x2, 0x6d,0x33,0x59,0x32,0x62,0xb8,0xb, 0xf0, +0xbe,0xf0,0xd, 0x78,0xcf,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xc6,0x7e,0x8, 0x64,0xa, +0x7e,0x34,0x0, 0xa9,0xe4,0x12,0x24,0x34,0x74,0x1, 0x7a,0xb3,0x64,0x5e,0x7e,0xf0, +0x6, 0x7e,0xe0,0x6, 0x12,0x97,0x76,0xb4,0x1, 0x3, 0x12,0x9a,0x94,0x1b,0xe0,0xbe, +0xe0,0x0, 0x58,0xf0,0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe6,0x7e,0xf0,0x6, 0x7e,0xe0, +0x7, 0x12,0x97,0x76,0xb4,0x1, 0x3, 0x12,0x9a,0x94,0xb, 0xe0,0xbe,0xe0,0xd, 0x78, +0xf0,0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe6,0x7e,0xf0,0x7, 0x7e,0xe0,0x6, 0x12,0x97, +0x76,0xb4,0x1, 0x3, 0x12,0x9a,0x94,0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xf0,0xb, 0xf0, +0xbe,0xf0,0xd, 0x78,0xe6,0x7e,0xf0,0x7, 0x7e,0xe0,0x7, 0x12,0x97,0x76,0xb4,0x1, +0x3, 0x12,0x9a,0x94,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xf0,0xb, 0xf0,0xbe,0xf0,0xd, +0x78,0xe6,0x6c,0xee,0x6c,0xff,0x1a,0x2e,0x7e,0x34,0x0, 0xd, 0xad,0x32,0x1a,0x2f, +0x2d,0x32,0x9, 0xb3,0x64,0xa, 0x70,0xd, 0x6d,0x33,0x3e,0x24,0x1a,0xe, 0x12,0x97, +0xef,0x59,0x32,0x73,0x27,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xda,0xb, 0xe0,0xbe,0xe0, +0xd, 0x48,0xd1,0xda,0x79,0x22,0x1a,0xe, 0x7e,0x14,0x0, 0xd, 0xad,0x10,0x1a,0x3f, +0x2d,0x31,0x9, 0xb3,0x64,0xa, 0x22,0x7e,0x24,0x0, 0x3, 0x2, 0x22,0x71,0x7e,0x34, +0x1, 0x52,0xe4,0x2, 0x24,0x34,0xca,0xf8,0x7c,0xa7,0x7c,0xfb,0x7e,0x8, 0x73,0x27, +0x12,0x97,0x8e,0x74,0xfa,0x7e,0x70,0xfa,0x12,0x9a,0x89,0x48,0x32,0x12,0x9a,0x80, +0x58,0x2d,0x1a,0x17,0xa, 0x4a,0x2d,0x41,0xbe,0x44,0x0, 0x0, 0x48,0x21,0x7e,0x63, +0x6e,0xb0,0xa, 0x16,0xbd,0x41,0x58,0x17,0xad,0x10,0x2d,0x41,0x3e,0x44,0x49,0x44, +0x4, 0x0, 0x1a,0x27,0x3e,0x24,0x1a,0xb, 0x12,0x97,0xef,0x59,0x42,0x73,0xcf,0xb, +0x70,0xbe,0x70,0x6, 0x8, 0xc2,0x4, 0xbe,0xb0,0x6, 0x8, 0xb9,0xda,0xf8,0x22,0x7e, +0x14,0x0, 0x1a,0xad,0x10,0x2d,0x21,0x22,0x7e,0x37,0x6e,0x8b,0x7e,0x53,0x6e,0xb1, +0xbc,0x5b,0x38,0x4, 0x7e,0x37,0x6e,0x91,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a, +0x0, 0x1b,0x2a,0x0, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0x6c,0xff,0x6c,0xee,0x7e,0xb3, +0x6e,0xb1,0xf5,0x2a,0x7e,0xd3,0x6e,0xb2,0xe4,0x7a,0xb3,0x74,0x7a,0x7e,0xb3,0x25, +0xae,0xb4,0x1, 0x2, 0x80,0x2, 0x21,0x22,0x6c,0xcc,0x21,0x10,0x7e,0x70,0x2, 0xac, +0x7c,0x12,0x5f,0xb7,0x75,0x26,0x3, 0x75,0x27,0x3, 0x12,0x5f,0xaf,0xbe,0x37,0x6e, +0x8d,0x58,0x2, 0x21,0xe, 0x7e,0x73,0x6c,0xde,0xbe,0x70,0x5, 0x28,0x6, 0x75,0x26, +0x2, 0x75,0x27,0x2, 0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x9, 0xe5,0x2a,0x24,0xfe,0xbe, +0xb1,0x28,0x78,0x3, 0x75,0x26,0x2, 0xe5,0x29,0xbe,0xb0,0x1, 0x68,0x9, 0x7c,0xbd, +0x24,0xfe,0xbe,0xb1,0x29,0x78,0x3, 0x75,0x27,0x2, 0xe5,0x28,0x60,0x8, 0xe5,0x2a, +0x14,0xbe,0xb1,0x28,0x78,0x3, 0x75,0x26,0x2, 0xe5,0x29,0x60,0x8, 0x7c,0xbd,0x14, +0xbe,0xb1,0x29,0x78,0x3, 0x75,0x27,0x2, 0xc2,0x0, 0xe5,0x28,0x7e,0x71,0x29,0x7c, +0x6c,0x12,0x99,0x7f,0xbe,0xb0,0xff,0x68,0x6, 0x75,0x26,0x2, 0x75,0x27,0x2, 0x7c, +0xbc,0x7e,0x8, 0x0, 0x26,0x7e,0x18,0x0, 0x27,0x12,0x99,0x28,0x7e,0xb3,0x6e,0xa2, +0x60,0x6, 0x75,0x26,0x4, 0x75,0x27,0x4, 0xe5,0x26,0x7e,0x71,0x27,0x7c,0x6c,0x7c, +0x5e,0x12,0x95,0xc7,0x7e,0x70,0x9, 0xac,0x7e,0x9, 0x53,0x6b,0xd6,0xbc,0x5f,0x28, +0x2, 0x7c,0xf5,0x90,0x21,0xd9,0xe4,0x93,0xb4,0x1, 0x11,0x7d,0x13,0x2e,0x14,0x6b, +0xd0,0x6d,0x0, 0x2e,0x34,0x6b,0xd2,0x6d,0x22,0x12,0x98,0x9, 0xb, 0xe0,0xb, 0xc0, +0x7e,0x73,0x6c,0xde,0xbc,0x7c,0x28,0x2, 0x1, 0x3c,0x7a,0xe3,0x6c,0xde,0x7a,0xf3, +0x74,0x7a,0xda,0x3b,0x22,0x2, 0x98,0x18,0x7c,0xab,0x7e,0xb3,0x6c,0xf4,0x7e,0x93, +0x6c,0xde,0x60,0x4a,0xb4,0x1, 0x5, 0xbe,0x90,0x2, 0x68,0x42,0x74,0x9, 0xa4,0x9, +0xa5,0x6b,0xd6,0xbe,0x90,0x1, 0x78,0x24,0xbe,0xa0,0x19,0x28,0x7, 0x74,0x6, 0x7a, +0xb, 0xb0,0x80,0x27,0xbe,0xa0,0x14,0x28,0x7, 0x74,0x5, 0x7a,0xb, 0xb0,0x80,0x1b, +0xbe,0xa0,0xa, 0x28,0x19,0x74,0x4, 0x7a,0xb, 0xb0,0x80,0xf, 0xbe,0x90,0x2, 0x78, +0xd, 0xbe,0xa0,0x14,0x28,0x8, 0x74,0x4, 0x7a,0xb, 0xb0,0x7a,0x1b,0xb0,0x22,0xca, +0x79,0x7c,0x5b,0x7e,0x40,0xff,0x7e,0xa0,0xff,0x6c,0x33,0x41,0x13,0xbc,0x63,0x78, +0x2, 0x41,0x11,0x7e,0x90,0x2, 0xac,0x93,0x9, 0x24,0x6b,0x54,0xa, 0xf2,0xa, 0x5, +0x9d,0xf, 0xbe,0x4, 0x0, 0x0, 0x8, 0xc, 0xa, 0xe2,0xa, 0xf5,0x9d,0xfe,0x7d,0x7f, +0x7c,0x2f,0x80,0x8, 0x6e,0x4, 0xff,0xff,0xb, 0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac, +0x13,0x9, 0xb0,0x6b,0x55,0xa, 0xb, 0xa, 0x47,0x9d,0x40,0xbe,0x44,0x0, 0x0, 0x8, +0x8, 0xa, 0xfb,0xa, 0x7, 0x9d,0xf, 0x80,0x4, 0x6d,0x0, 0x9d,0x4, 0xbe,0x20,0x1, +0x38,0xa, 0xbe,0x10,0x1, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x31,0xbe,0x20,0x2, 0x38, +0xa, 0xbe,0x10,0x2, 0x38,0x5, 0x7e,0x40,0x2, 0x80,0x10,0x30,0x0, 0xd, 0xbe,0x20, +0x3, 0x38,0x8, 0xbe,0x10,0x3, 0x38,0x3, 0x7e,0x40,0x3, 0xbc,0x4a,0x50,0x2, 0x7c, +0xa4,0xb, 0x30,0x7e,0x3, 0x6c,0xde,0xbc,0x3, 0x28,0x2, 0x21,0x8d,0x7c,0xba,0xda, +0x79,0x22,0xca,0xf8,0x7c,0xa7,0x7c,0xfb,0x7e,0x8, 0x20,0x54,0x12,0x37,0xef,0x74, +0xfa,0x7e,0x70,0xfa,0x12,0x9a,0x89,0x48,0x37,0x12,0x9a,0x80,0x58,0x32,0x1a,0x17, +0xa, 0x2a,0x2d,0x21,0xbe,0x24,0x0, 0x0, 0x48,0x26,0x7e,0x63,0x6e,0xb0,0xa, 0x16, +0xbd,0x21,0x58,0x1c,0x1a,0x47,0x3e,0x44,0x1a,0xeb,0x7e,0xf4,0x0, 0x1a,0xad,0xfe, +0x2d,0x4f,0x49,0x44,0x73,0xcf,0xad,0x10,0x2d,0x21,0x3e,0x24,0x59,0x42,0x20,0x54, +0xb, 0x70,0xbe,0x70,0x6, 0x8, 0xbd,0x4, 0xbe,0xb0,0x6, 0x8, 0xb4,0xda,0xf8,0x22, +0x7e,0x63,0x6e,0xaf,0xa, 0x16,0xbd,0x1, 0x22,0x1a,0x1b,0xa, 0xf, 0x2d,0x1, 0xbe, +0x4, 0x0, 0x0, 0x22,0x7e,0x18,0x62,0xb8,0x7a,0x1d,0x2b,0x7c,0xbe,0x7c,0x7f,0x7e, +0x8, 0x64,0xa, 0x7c,0xa7,0x7c,0x5b,0xbe,0x50,0x0, 0x28,0x1f,0x12,0x9b,0x42,0x2d, +0xf3,0x2e,0xf4,0xff,0xe6,0x12,0x9b,0x53,0x8, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x2, +0x7f,0x70,0x2d,0xf4,0x2e,0xf4,0xff,0xf3,0x7a,0x7b,0xb0,0xbe,0xa0,0x0, 0x28,0x1b, +0x12,0x9b,0x42,0x2d,0xf3,0x1b,0xf5,0x12,0x9b,0x53,0x8, 0x4, 0x74,0x1, 0x80,0x2, +0x74,0x2, 0x7f,0x70,0x2d,0xf4,0x1b,0xf4,0x7a,0x7b,0xb0,0xbe,0x50,0xc, 0x50,0x1d, +0x12,0x9b,0x42,0x2d,0xf3,0x69,0x37,0x0, 0x1a,0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0x74, +0x1, 0x80,0x2, 0x74,0x2, 0x7f,0x70,0x2d,0xf4,0x39,0xb7,0x0, 0xd, 0xbe,0xa0,0xc, +0x50,0x2f,0x7e,0x70,0xd, 0xac,0x75,0xa, 0x4a,0x2d,0x34,0x7d,0x43,0x3e,0x44,0x7e, +0x7d,0x2b,0x2d,0xf4,0x69,0x47,0x0, 0x2, 0xbe,0x44,0x0, 0x0, 0x8, 0x9, 0x74,0x1, +0x2d,0x13,0x39,0xb0,0x0, 0x1, 0x22,0x74,0x2, 0x2d,0x31,0x7d,0x20,0x39,0xb1,0x0, +0x1, 0x22,0x7e,0x90,0xd, 0xac,0x95,0xa, 0x3a,0x2d,0x43,0x7d,0x34,0x3e,0x34,0x7e, +0x7d,0x2b,0x22,0xb, 0x7a,0x30,0xbe,0x34,0x0, 0x0, 0x22,0x2, 0x9b,0x5e,0xca,0x3b, +0x6c,0xff,0xc2,0x0, 0x7e,0xb3,0x6e,0xa2,0x60,0x6, 0x7e,0xd4,0x1, 0xc2,0x80,0x4, +0x7e,0xd4,0x3, 0xe8,0x7e,0xb3,0x6e,0xa3,0xb4,0x1, 0x4, 0x7e,0xd4,0x0, 0xf0,0x7e, +0xc7,0x6c,0xe4,0x6c,0xee,0x81,0x1c,0xc2,0x0, 0x7c,0xbe,0x12,0x92,0xa1,0x7d,0xb3, +0x7e,0x90,0x2, 0xac,0x9e,0x9, 0xa4,0x6b,0x54,0x7c,0xda,0x9, 0xc4,0x6b,0x55,0x7d, +0xad,0x4c,0xdd,0x68,0x16,0x7e,0xb3,0x6e,0xb1,0x14,0xbc,0xbd,0x68,0xd, 0x4c,0xcc, +0x68,0x9, 0x7e,0xb3,0x6e,0xb2,0x14,0xbc,0xbc,0x78,0x8, 0x7d,0xad,0x1e,0xa4,0x2e, +0xa4,0x0, 0x64,0x7c,0xba,0x12,0x97,0xf8,0xbd,0x3b,0x58,0x4, 0xd2,0x0, 0x80,0x26, +0x7e,0x73,0x6e,0x7d,0xbe,0x73,0x6c,0xde,0x78,0x1c,0x7e,0x37,0x3, 0xfd,0xe, 0x34, +0xbd,0x3c,0x58,0x12,0x7c,0xbe,0x7e,0x70,0x1, 0x12,0x9c,0x32,0x7d,0x1a,0x6d,0x0, +0xbf,0x10,0x8, 0x2, 0xd2,0x0, 0x30,0x0, 0x21,0x7c,0xbe,0x12,0x2f,0xde,0x60,0x1a, +0x7e,0x34,0x0, 0x9, 0xca,0x39,0xac,0x7e,0x2e,0x34,0x6b,0xd0,0x6d,0x22,0x12,0x9d, +0x7, 0x6d,0x0, 0x12,0x24,0xf, 0x1b,0xfd,0xb, 0xf0,0xb, 0xe0,0x12,0x9d,0x0, 0x28, +0x2, 0x61,0x87,0x7a,0x73,0x6c,0xf3,0x7a,0xf3,0x6e,0x7c,0x7a,0xc7,0x3, 0xfd,0xda, +0x3b,0x22,0x7c,0x67,0x7c,0x7b,0x7e,0x50,0x2, 0xac,0x57,0x9, 0xa2,0x6b,0x54,0x9, +0x72,0x6b,0x55,0x90,0x21,0xfa,0xe4,0x93,0xbc,0xba,0x78,0x3, 0x9f,0x11,0x22,0x7c, +0xba,0x2, 0x9c,0x54,0x7c,0x16,0x7c,0x7, 0x7c,0x9b,0x7e,0xb3,0x6e,0xb1,0xf5,0x29, +0x7e,0xb3,0x6e,0xb2,0xf5,0x2a,0x9f,0x77,0xa, 0x31,0xa, 0x19,0x9d,0x13,0x7c,0x83, +0x80,0x7d,0x7a,0x81,0x27,0xbe,0x80,0x0, 0x58,0xc, 0x1a,0x58,0x1a,0x19,0x9d,0x15, +0xa, 0x59,0x2d,0x51,0xf5,0x27,0xe5,0x29,0xbc,0xb8,0x18,0xc, 0x1a,0x59,0x1a,0x18, +0x9d,0x15,0xa, 0x59,0x9d,0x51,0xf5,0x27,0xa, 0x11,0xa, 0x50,0x9d,0x51,0xf5,0x26, +0x80,0x3d,0x85,0x26,0x28,0xe5,0x26,0xbe,0xb0,0x0, 0x58,0xe, 0xe5,0x26,0x1a,0x5b, +0x1a,0x10,0x9d,0x15,0xa, 0x50,0x2d,0x51,0xf5,0x28,0xe5,0x2a,0xbe,0xb1,0x26,0x18, +0xe, 0x1a,0x30,0xe5,0x26,0x1a,0x1b,0x9d,0x13,0xa, 0x50,0x9d,0x51,0xf5,0x28,0xe5, +0x27,0x7e,0x71,0x28,0x12,0x57,0x9, 0x1a,0x26,0x1a,0x24,0x2f,0x71,0x5, 0x26,0xa, +0x21,0xa, 0x30,0x2d,0x32,0xe5,0x26,0x1a,0x1b,0xbd,0x13,0x8, 0xb5,0xb, 0x80,0xa, +0x11,0xa, 0x59,0x2d,0x51,0x1a,0x18,0xbd,0x15,0x18,0x2, 0x81,0x72,0x7f,0x17,0x22, +0x7e,0x73,0x6c,0xde,0xbc,0x7e,0x22,0x7e,0x30,0x9, 0xac,0x3f,0x2e,0x14,0x6d,0x14, +0x22,0xca,0xf8,0x7e,0xb3,0x6e,0x7c,0x70,0x17,0xe4,0x7a,0xb3,0x6e,0x85,0x12,0x71, +0x73,0x28,0x1f,0x74,0x1, 0x7a,0xb3,0x6e,0x81,0xe4,0x7a,0xb3,0x6e,0x84,0x80,0x12, +0x74,0x1, 0x7a,0xb3,0x6e,0x85,0x7e,0xb3,0x6e,0x7d,0x70,0x6, 0x74,0x1, 0x7a,0xb3, +0x6e,0x80,0x12,0x87,0x98,0xca,0x59,0x7e,0x18,0x6d,0x14,0x7e,0x8, 0x6d,0x6e,0x12, +0x24,0xf, 0x1b,0xfd,0x90,0x1c,0x2c,0xe4,0x93,0xbe,0xb0,0x0, 0x38,0x2, 0xc1,0x1a, +0x6c,0xff,0x80,0x24,0x74,0x9, 0xac,0xbf,0x49,0x35,0x6d,0x14,0x12,0x9f,0x92,0x74, +0x9, 0xac,0xbf,0x59,0x35,0x6d,0x6e,0x49,0x35,0x6d,0x16,0x12,0x9e,0x1d,0x74,0x9, +0xac,0xbf,0x59,0x35,0x6d,0x70,0xb, 0xf0,0x12,0x9f,0x71,0x38,0xd7,0x7e,0xa3,0x6e, +0x7c,0xbe,0xa0,0x1, 0x78,0x9, 0x7e,0xb3,0x6e,0x7d,0xb4,0x1, 0x2, 0x80,0xb, 0xbe, +0xa0,0x1, 0x78,0x16,0x7e,0xb3,0x6e,0x7d,0x70,0x10,0x7e,0x37,0x6d,0x6e,0x7a,0x37, +0x78,0x14,0x7e,0x37,0x6d,0x70,0x7a,0x37,0x78,0x16,0xbe,0xa0,0x1, 0x78,0x18,0x7e, +0xb3,0x6e,0x7d,0x70,0x12,0x7e,0x37,0x6d,0x6e,0x7a,0x37,0x78,0xf, 0x7e,0x37,0x6d, +0x70,0x7a,0x37,0x78,0x11,0x80,0x43,0xbe,0xa0,0x1, 0x78,0x2b,0x7e,0xb3,0x6e,0x7d, +0xb4,0x1, 0x24,0x7e,0x37,0x6d,0x70,0x9e,0x37,0x78,0x11,0x12,0x24,0x56,0x7d,0x13, +0x7e,0x37,0x6d,0x6e,0x9e,0x37,0x78,0xf, 0x12,0x24,0x56,0x2d,0x31,0xbe,0x34,0x0, +0x96,0x8, 0x17,0x74,0x1, 0x80,0xf, 0x4c,0xaa,0x78,0xf, 0x6d,0x33,0x7a,0x37,0x78, +0xf, 0x7a,0x37,0x78,0x11,0xe4,0x7a,0xb3,0x78,0x13,0xda,0xf8,0x22,0x7d,0x13,0x9f, +0x11,0x7e,0xf4,0x21,0xdc,0x12,0x9f,0x81,0x12,0x9f,0x89,0xb, 0x7a,0xf0,0x7e,0xd4, +0x21,0xee,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0xe0,0x90,0x1c,0x2c,0xe4,0x93,0x70,0x3, +0x7d,0x31,0x22,0x90,0x21,0xd9,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x6e,0xb1,0x80, +0x4, 0x7e,0x83,0x6e,0xb2,0x12,0x9f,0x79,0xbe,0x14,0x0, 0x3f,0x38,0x21,0x7e,0x24, +0x0, 0x3f,0x9d,0x21,0x7e,0x14,0x21,0xf2,0x12,0x9f,0x30,0xad,0x32,0x6d,0x22,0x12, +0x9f,0x14,0x12,0x9f,0x1b,0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0xe1,0x9, 0x7d, +0x54,0x9e,0x54,0x0, 0x3f,0xbd,0x51,0x38,0x35,0x7d,0x54,0x9e,0x54,0x0, 0x1f,0xbd, +0x51,0x40,0x76,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x21,0x9d,0x23,0x7e,0x14,0x21, +0xf4,0x12,0x9f,0x30,0xad,0x32,0x6d,0x22,0x12,0x9f,0x14,0x90,0x21,0xf1,0x12,0x9f, +0x1e,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0x12,0x9f,0x27,0x2f,0x10,0x80,0x4b,0x7d,0x50, +0x1b,0x54,0xbd,0x51,0x40,0x19,0x7d,0x30,0x9d,0x31,0x6d,0x22,0x7e,0x14,0x21,0xf6, +0x12,0x9f,0xa, 0x7d,0x1e,0x1b,0x14,0x6d,0x0, 0x9f,0x1, 0x7f,0x10,0x80,0x13,0x7d, +0x31,0x9d,0x30,0x6d,0x22,0x7e,0x14,0x21,0xf8,0x12,0x9f,0xa, 0x7d,0x1e,0x6d,0x0, +0x2f,0x10,0x12,0x9f,0x1b,0x58,0x4, 0x7f,0x10,0x80,0xe, 0x90,0x21,0xf1,0xe4,0x93, +0x12,0x9f,0x27,0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0x7e,0x4, 0x0, 0xff,0xb, 0xa, +0x10,0x12,0x22,0xb4,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x90,0x21,0xf0,0xe4,0x93, +0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22,0xa, 0xb, 0x7d,0x1f,0x9d,0x10,0x6d,0x0, 0x22, +0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0x13,0x7e,0x54,0x22,0x37,0x12,0x9f, +0x67,0x50,0x21,0x7e,0x54,0x22,0x39,0x12,0x9f,0x67,0x28,0x18,0x7e,0x14,0x22,0x3b, +0x12,0x9f,0x30,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x22,0x3d,0x12,0x9f,0x30,0xbd,0x32, +0x28,0x2, 0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31, +0x22,0x90,0x21,0x51,0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44, +0x22,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x22,0x7e,0xf4,0x21,0xec,0x7e,0xe4,0x0, +0xff,0x22,0x7e,0x14,0x21,0xda,0x12,0x6f,0xd1,0x7e,0x14,0x21,0xde,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0xd0,0x7e,0x14,0x21,0xe0,0x12,0xdd,0x9b,0x90,0x1c,0x2c,0xe4,0x93, +0x70,0x1, 0x22,0x90,0x21,0xd9,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x6e,0xb2,0x80, +0x4, 0x7e,0x83,0x6e,0xb1,0x12,0x9f,0x79,0xbe,0x34,0x0, 0x3f,0x38,0x21,0x7e,0xe4, +0x0, 0x3f,0x9d,0xe3,0x7e,0x34,0x21,0xe4,0x12,0xa0,0x77,0x12,0xa2,0x81,0x7f,0x71, +0x12,0xa2,0x79,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x80,0x7b,0x7d, +0x54,0x9e,0x54,0x0, 0x3f,0xbd,0x53,0x38,0x26,0x7d,0xe3,0x9d,0xe5,0x7e,0x34,0x21, +0xe6,0x12,0xa0,0x77,0x12,0xa2,0x81,0x7f,0x71,0x90,0x21,0xe3,0xe4,0x93,0xa, 0x3b, +0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b,0x7c,0x12,0xa2,0x4b,0x2f,0x71,0x80,0x4b,0x7d, +0x52,0x1b,0x54,0xbd,0x53,0x40,0x17,0x7d,0xf5,0x9d,0xf3,0x6d,0xee,0x7e,0x34,0x21, +0xe8,0x12,0xa2,0x60,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x11,0x7d,0xf3, +0x9d,0xf2,0x6d,0xee,0x7e,0x34,0x21,0xea,0x12,0xa2,0x60,0x6d,0x22,0x2f,0x71,0x12, +0xa2,0x79,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, 0x90,0x21,0xe3,0xe4, +0x93,0x12,0xa2,0x4b,0xbf,0x71,0x28,0x2, 0x7f,0x71,0xbe,0x78,0x2, 0xce,0x28,0x4, +0x7e,0x78,0x2, 0xce,0x7d,0x3f,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0x22,0xca, +0xf8,0x6c,0xff,0x7e,0xb7,0x27,0x66,0x7e,0xc7,0x27,0x68,0x7e,0x97,0x27,0x4e,0x7e, +0xd7,0x27,0x50,0x7e,0xa7,0x27,0x62,0x7e,0xe7,0x27,0x64,0xe4,0x7e,0x73,0x27,0x72, +0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0xa1,0xd2,0x40,0x2, 0x21,0xcd,0x7e,0x73,0x27, +0x72,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70,0x9, 0x7e,0x27,0x27,0x6a,0x7e,0x17, +0x27,0x6c,0x12,0xa1,0xd2,0x40,0x2, 0x21,0xcd,0x7e,0x73,0x27,0x72,0xbe,0x70,0xf, +0x28,0x13,0xe4,0x7e,0x70,0xe, 0x7e,0x27,0x27,0x6e,0x7e,0x17,0x27,0x70,0x12,0xa1, +0xd2,0x40,0x2, 0x21,0xcd,0x7e,0x34,0x22,0x51,0x12,0xa0,0x77,0xbd,0xfc,0x28,0x50, +0x7e,0x34,0x22,0x4f,0x12,0xa0,0x77,0xbd,0xfb,0x50,0x45,0x7e,0x34,0x22,0x55,0x12, +0x29,0xdb,0x12,0xa2,0x54,0x7d,0x8f,0x9d,0x83,0xbe,0x87,0x27,0x4c,0x50,0x31,0x7e, +0x34,0x22,0x53,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x9d,0xf8,0xbe,0xf7,0x27,0x4c, +0x28,0x1e,0x7e,0x34,0x0, 0x3, 0xad,0x3c,0x7d,0xfb,0x3e,0xf4,0xbd,0xf3,0x38,0x2, +0x21,0xcd,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x21,0xcd,0x7e,0xf0,0x21,0x21,0xcd, +0x7e,0x34,0x22,0x59,0x12,0xa0,0x77,0xbd,0xfb,0x38,0x2, 0x21,0xcd,0x7e,0x34,0x22, +0x57,0x12,0xa0,0x77,0xbd,0xfc,0x50,0x75,0x7e,0xb3,0x27,0x4b,0x70,0x6f,0x7e,0x34, +0x22,0x5d,0x12,0x29,0xdb,0x12,0xa2,0x54,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x27,0x4c, +0x50,0x5b,0x7e,0x34,0x22,0x5b,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe, +0xf7,0x27,0x4c,0x28,0x48,0x7d,0xfb,0x3e,0xf4,0x7e,0x34,0x0, 0x3, 0xad,0x3c,0xbd, +0x3f,0x28,0x3a,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x31,0x7e,0xa3,0x27,0x72, +0x7e,0x10,0x4, 0xac,0x1a,0x49,0x30,0x25,0xb5,0x49,0x10,0x25,0xb7,0x49,0x20,0x25, +0xa5,0x49,0x0, 0x25,0xa7,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0xd, 0x9d,0x32,0xbe, +0x34,0x0, 0x10,0x48,0x5, 0xbe,0xa0,0x6, 0x50,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda, +0xf8,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x6b,0x74,0x4, 0xac,0xb6,0x49,0x15,0x25,0xb9, +0x49,0x25,0x25,0xbb,0x74,0x4, 0xac,0xb7,0x49,0xf5,0x25,0xb9,0x49,0x55,0x25,0xbb, +0x7d,0x31,0x9d,0x3f,0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0x9d,0x1f,0x80,0x4, 0x6d,0x11, +0x9d,0x13,0x7d,0x32,0x9d,0x35,0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0x9d,0x25,0x80,0x4, +0x6d,0x22,0x9d,0x23,0x9d,0x24,0x9d,0x10,0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x7d,0x32, +0x80,0x4, 0x6d,0x33,0x9d,0x32,0x7e,0x54,0x22,0x49,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0x14,0xbe,0x14,0x0, 0x0, 0x8, 0x4, 0x7d,0x31,0x80,0x4, 0x6d, +0x33,0x9d,0x31,0xbd,0x32,0x50,0x2, 0xd3,0x22,0xc3,0x22,0xa, 0x2b,0x7d,0x3d,0x9d, +0x32,0x6d,0x22,0x22,0x7e,0x14,0x22,0x6d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x10,0x7f,0x17,0x12,0x22,0xb4,0x7f,0x71,0x7c,0x76, +0x7c,0x65,0xa, 0x24,0x7f,0x71,0x7d,0x3c,0x22,0x90,0x21,0xe2,0xe4,0x93,0xa, 0x3b, +0x22,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d,0x2e,0x7c,0x76,0x7c,0x65,0x22,0x12,0xa5, +0x93,0x7a,0x37,0x27,0x66,0x12,0xa5,0x1e,0x7a,0x37,0x27,0x68,0x12,0xa0,0x7f,0x60, +0x1, 0x22,0x7e,0x73,0x27,0x72,0xa, 0x37,0x7a,0x35,0x26,0x7e,0x8, 0x25,0xb9,0x7e, +0x18,0x27,0x4a,0x2, 0xa2,0xb6,0xca,0xf8,0x7e,0x45,0x26,0x7c,0xb9,0x7a,0xb3,0x77, +0x2c,0x74,0xff,0x7a,0xb3,0x77,0x2b,0x6d,0x55,0x80,0x1f,0x7d,0xf5,0x3e,0xf4,0x3e, +0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x7d,0xe5,0x3e,0xe4,0x59,0xfe,0x62,0xb8, +0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x63,0x80,0xb, 0x54,0xbd,0x45,0x38,0xdd,0x7e,0x33, +0x77,0x2c,0xbe,0x30,0x4, 0x38,0x2, 0x61,0x7e,0x69,0xf1,0x0, 0x1c,0x69,0x11,0x0, +0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e,0x14,0x0, 0x1, 0x7d,0x3f,0x7d, +0x21,0x12,0x22,0x71,0x7c,0xf7,0x74,0x40,0x7a,0xb3,0x77,0x2f,0x80,0x43,0x4d,0xff, +0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f,0x12,0x22,0x71,0x7c,0xf7,0x74, +0x80,0x7a,0xb3,0x77,0x2f,0x7d,0xf, 0x2d,0xf, 0xbd,0x1, 0x8, 0x24,0x1a,0x2, 0x1a, +0x0, 0x7e,0x73,0x77,0x2f,0xa, 0x37,0x6d,0x22,0x12,0x22,0xa3,0x7d,0x5f,0x1a,0x4a, +0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x12,0x22,0xbf,0x7a,0x73,0x77, +0x2f,0xbe,0xf0,0x5, 0x58,0x14,0x12,0xa3,0x9d,0x12,0xe2,0x76,0x12,0xa3,0x9d,0x12, +0xa3,0xa6,0x12,0xa3,0x9d,0x12,0xe3,0x65,0x80,0xa, 0x74,0x7d,0x80,0x2, 0x74,0x7f, +0x7a,0xb3,0x77,0x2b,0xe4,0x7a,0xb3,0x77,0x2c,0x7e,0x73,0x78,0x2e,0xbe,0x73,0x77, +0x2b,0x48,0x6, 0x7e,0xb3,0x77,0x2d,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7e,0x8, 0x62, +0xb8,0x7e,0x18,0x63,0x80,0x22,0xca,0x3b,0x7f,0x71,0x7e,0x60,0x1, 0xb, 0xa, 0x20, +0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x64,0x48,0x7a,0x43,0x64,0xac,0x7e,0x70,0x1, +0x7e,0xa0,0x1, 0x81,0xc7,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x60,0x2d,0xd4,0xb, 0x6a, +0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x28,0x7f,0x67,0x2d,0xd4,0xb, 0x6a,0x40,0xa, 0xd5, +0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f,0xbe,0x80,0x0, 0x58,0x5, 0x6e, +0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a,0xbe,0xf0,0x0, 0x58,0x5, 0x6e, +0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe,0xf0,0x2, 0x58,0x2, 0x81,0xc5, +0xbe,0x60,0x0, 0x18,0x2, 0x81,0xad,0xbe,0x70,0xec,0x28,0x2, 0x81,0xd1,0xbe,0x80, +0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7,0xb, 0xa4,0x7d,0x6a,0x7c,0x7d, +0xa, 0xa5,0x2d,0xab,0x12,0xa5,0x15,0x19,0xba,0x64,0x48,0xa, 0xd9,0xa, 0xa4,0x2d, +0xad,0x12,0xa5,0x15,0x19,0xba,0x64,0xac,0x9, 0xba,0x64,0x48,0xa, 0xdb,0xa, 0xc5, +0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7,0x19,0xbc,0x64,0x47,0x9, 0xbc, +0x64,0xac,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0xa5,0x15,0x19,0xba,0x64,0xab,0x2d, +0xdb,0x12,0xa5,0xc, 0x19,0xbd,0x64,0x49,0xa, 0xd9,0x12,0xa5,0xa, 0x19,0xbd,0x64, +0xad,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe,0x80,0x4, 0x58,0x5, 0xbe,0xf0, +0x4, 0x48,0x1a,0xe5,0x28,0xa, 0xcb,0xa, 0xd5,0x12,0xa5,0xa, 0x19,0xbd,0x64,0x48, +0xa, 0xc9,0xa, 0xd4,0x12,0xa5,0xa, 0x19,0xbd,0x64,0xac,0xb, 0x70,0xbe,0x70,0x64, +0x50,0x1f,0x7e,0x51,0x28,0x7c,0x49,0xe5,0x28,0xa, 0xd7,0x19,0xbd,0x64,0x48,0x19, +0x9d,0x64,0xac,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x77,0x2c,0xbc,0xba,0x28,0x2, 0x61, +0xc5,0x7a,0x73,0x77,0x2c,0x7e,0xa0,0x1, 0x80,0x25,0xa, 0x3a,0x9, 0xb3,0x64,0x48, +0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d,0xd3,0x1b,0x6a,0x20,0xa, 0x2a, +0x9, 0xb2,0x64,0xac,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e,0x1b,0x1a,0x40,0xb, 0xa0,0x7e, +0xb3,0x77,0x2c,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22,0x2d,0xdc,0xe, 0xd4,0x7d,0x6d, +0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c,0xbd,0xa, 0xa7,0x22,0x7e,0x37, +0x27,0x60,0x9e,0x37,0x27,0x58,0x22,0x7e,0x17,0x27,0x5a,0xbd,0x13,0x28,0xa, 0x7a, +0x37,0x27,0x5a,0x7a,0x27,0x27,0x5c,0x80,0x10,0x7e,0x17,0x27,0x52,0xbd,0x13,0x50, +0x8, 0x7a,0x37,0x27,0x52,0x7a,0x27,0x27,0x54,0x7e,0x17,0x27,0x58,0xbd,0x12,0x28, +0xa, 0x7a,0x27,0x27,0x58,0x7a,0x37,0x27,0x56,0x80,0x10,0x7e,0x17,0x27,0x60,0xbd, +0x12,0x50,0x8, 0x7a,0x27,0x27,0x60,0x7a,0x37,0x27,0x5e,0x7e,0xb3,0x27,0x72,0xb4, +0xa, 0xf, 0x12,0xa5,0x93,0x7a,0x37,0x27,0x6a,0x12,0xa5,0x1e,0x7a,0x37,0x27,0x6c, +0x22,0xb4,0xf, 0xe, 0x12,0xa5,0x93,0x7a,0x37,0x27,0x6e,0x12,0xa5,0x1e,0x7a,0x37, +0x27,0x70,0x22,0x7e,0x37,0x27,0x52,0x9e,0x37,0x27,0x5a,0x22,0x7d,0x3c,0x7d,0x2d, +0x7d,0x42,0x7d,0x13,0x7d,0x24,0x12,0xde,0x1f,0x7d,0x31,0x12,0xa5,0x27,0x2, 0xa5, +0xb1,0x7e,0x3, 0x27,0x72,0xbe,0x0, 0x64,0x50,0x2, 0xc1,0x46,0x80,0x7d,0x6c,0x99, +0x7e,0xb3,0x27,0x49,0xbe,0xb0,0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x27,0x49,0x7e,0x1f, +0x25,0xb9,0x7a,0x1f,0x62,0xb8,0x7e,0x80,0x1, 0x80,0x45,0x74,0x4, 0xac,0xb8,0x49, +0x35,0x25,0xb9,0x49,0x25,0x25,0xbb,0x7e,0x17,0x62,0xb8,0x7e,0x7, 0x62,0xba,0x12, +0xa7,0x8d,0x7c,0x1b,0x7e,0x3, 0x27,0x49,0xbc,0x1, 0x38,0x22,0xb, 0x90,0x7e,0x70, +0x4, 0xac,0x78,0x2e,0x34,0x25,0xb9,0x7e,0x14,0x62,0xb8,0x74,0x4, 0x12,0xa7,0xce, +0x7e,0x30,0x4, 0xac,0x39,0x2e,0x14,0x25,0xb9,0x74,0x4, 0x12,0x23,0x44,0xb, 0x80, +0x7e,0x3, 0x27,0x72,0xbc,0x8, 0x38,0xb3,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, +0x27,0x72,0x7e,0x3, 0x27,0x49,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x27,0x72,0xbe, +0x0, 0xec,0x40,0x2, 0xa1,0xbe,0x22,0xca,0xf8,0x7e,0xa3,0x6e,0x7c,0x7e,0xb3,0x6e, +0x7d,0xc2,0x13,0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x6c, +0xe0,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x27,0x4a,0x4c,0xff,0x68, +0xf, 0x7e,0x47,0x25,0xb1,0x4d,0x44,0x78,0x7, 0xd2,0x13,0x12,0xa7,0xc7,0x80,0x35, +0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e,0x37,0x25,0xb1,0x7a,0x37,0x27,0x4c,0x7e, +0xb3,0x27,0x4a,0xb4,0x3, 0x1f,0x7e,0x37,0x25,0xb1,0xbe,0x34,0x0, 0x0, 0x28,0x15, +0x74,0x4, 0x7a,0xb3,0x27,0x4a,0x7e,0x37,0x27,0x62,0x7e,0x27,0x27,0x64,0x12,0xa5, +0xa0,0xe1,0x4b,0x80,0x0, 0x12,0xa7,0xe1,0xe1,0x4b,0x7e,0xc7,0x6d,0x6e,0x7e,0xd7, +0x6d,0x70,0x4c,0xff,0x78,0x19,0x70,0x57,0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d, +0x2d,0x12,0xde,0x44,0x12,0xa5,0x9c,0x74,0x1, 0x7a,0xb3,0x27,0x4a,0x80,0x40,0xbe, +0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x27,0x52,0x9e,0x27,0x27,0x5a,0x7e,0x14,0x22,0x69, +0x12,0x9f,0x30,0xbd,0x23,0x38,0x13,0x7e,0x27,0x27,0x60,0x9e,0x27,0x27,0x58,0x7e, +0x14,0x22,0x6b,0x12,0x9f,0x30,0xbd,0x23,0x28,0x15,0x74,0x3, 0x7a,0xb3,0x27,0x4a, +0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a,0xc7,0x27,0x62,0x7a,0xd7,0x27,0x64,0x7e, +0xb3,0x27,0x4a,0x60,0x26,0x7d,0x3c,0x7d,0x2d,0x7e,0x17,0x25,0xb5,0x7e,0x7, 0x25, +0xb7,0x12,0xa7,0x8d,0xa, 0x2b,0x7e,0x73,0x27,0x49,0xa, 0x37,0xbd,0x32,0x58,0xb, +0x12,0xa5,0x9c,0x7a,0xc7,0x25,0xb5,0x7a,0xd7,0x25,0xb7,0xda,0xf8,0x22,0x7e,0xb3, +0x76,0x5a,0x70,0x6, 0x12,0xa7,0x87,0x2, 0xa7,0xc1,0x12,0xa6,0x47,0x12,0xa7,0xd6, +0x50,0xa, 0x12,0xa2,0x8e,0x7c,0x3b,0x12,0xa7,0x87,0x80,0x5, 0x12,0xdc,0x73,0x7c, +0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xdd,0xa3,0x60,0xa, 0x7a,0x33,0x76,0x5d, +0x74,0x1, 0x7a,0xb3,0x6e,0x82,0x22,0xe4,0x7a,0xb3,0x27,0x4a,0x22,0x7d,0x51,0x7d, +0x12,0x7d,0x23,0x9d,0x25,0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x7d,0x52,0x80,0x4, 0x6d, +0x55,0x9d,0x52,0x7c,0xab,0x7d,0x21,0x9d,0x20,0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x7d, +0x32,0x80,0x4, 0x6d,0x33,0x9d,0x32,0x7c,0xb7,0xbc,0xba,0x50,0x3, 0x7c,0xba,0x22, +0x22,0xe4,0x7a,0xb3,0x77,0xfb,0x22,0x74,0x1, 0x7a,0xb3,0x76,0x2f,0x22,0x12,0x23, +0x44,0x7e,0x34,0x62,0xb8,0x22,0x7e,0xb3,0x27,0x4a,0xb4,0x4, 0x2, 0xd3,0x22,0xc3, +0x22,0x74,0xfe,0x7a,0xb3,0x76,0x5d,0xe4,0x7a,0xb3,0x27,0x4a,0x22,0xca,0x3b,0x6d, +0x33,0x7a,0x35,0x27,0x7a,0x35,0x29,0x7e,0x53,0x6e,0x7c,0x7a,0x51,0x40,0xbe,0x50, +0x0, 0x28,0x1a,0x7e,0x27,0x62,0x7a,0xb, 0x24,0x7a,0x27,0x62,0x7a,0xbe,0x24,0x0, +0x64,0x28,0xe, 0x7e,0x24,0x0, 0x64,0x7a,0x27,0x62,0x7a,0x80,0x4, 0x7a,0x37,0x62, +0x7a,0x7e,0xb3,0x76,0x2f,0xb4,0x1, 0x4, 0x74,0x3, 0x80,0x7, 0x7e,0xb3,0x62,0x29, +0x60,0x5, 0x14,0x7a,0xb3,0x62,0x29,0x7e,0xb3,0x6e,0x83,0x60,0x3, 0x2, 0xb0,0x9c, +0x7e,0x37,0x5a,0x42,0xbe,0x37,0x77,0xe2,0x28,0x12,0x7e,0x54,0xff,0xff,0x9e,0x57, +0x5a,0x42,0x2e,0x57,0x77,0xe2,0xb, 0x54,0xf5,0x3f,0x80,0xa, 0x7e,0x57,0x77,0xe2, +0x9e,0x57,0x5a,0x42,0xf5,0x3f,0x7e,0x37,0x77,0xe2,0x7a,0x37,0x5a,0x42,0xc2,0x26, +0x7e,0x34,0x6d,0x14,0x7a,0x35,0x2b,0xe5,0x40,0x60,0x6, 0x7e,0xb3,0x6e,0x7d,0x70, +0x39,0x6c,0xff,0x6c,0xaa,0x80,0x2e,0xa, 0x4f,0x19,0xa4,0x62,0x15,0xe4,0x19,0xb4, +0x62,0x1f,0x6d,0x33,0x7e,0x50,0x2, 0xac,0x5f,0x59,0x32,0x62,0x52,0x59,0x32,0x62, +0x66,0x7e,0x70,0xff,0x7e,0x50,0x9, 0xac,0x5f,0x19,0x72,0x5c,0xe7,0x74,0x1, 0x19, +0xb4,0x62,0x7c,0xb, 0xf0,0x12,0x9f,0x71,0x38,0xcd,0xc2,0x25,0x7e,0xb3,0x5c,0xc3, +0x60,0x6, 0x7e,0xb3,0x6e,0xa2,0x60,0x7, 0x12,0xb7,0xdb,0x50,0x2, 0xd2,0x25,0x6c, +0xff,0xe1,0x7c,0x7e,0x70,0x9, 0xac,0x7f,0x9, 0xe3,0x6d,0x18,0x5e,0xe0,0xf, 0x12, +0xb2,0x9d,0x38,0x2, 0xe1,0x7a,0x7e,0x90,0x9, 0xac,0x9e,0x9, 0xa4,0x6e,0x22,0xbe, +0xa0,0x1, 0x78,0x2, 0xe1,0x57,0x7e,0x50,0x2, 0xac,0x5e,0x7d,0x2, 0x2e,0x4, 0x62, +0x52,0xb, 0x8, 0x10,0xb, 0x14,0x1b,0x8, 0x10,0x4c,0xaa,0x78,0x1a,0x49,0x43,0x6d, +0x14,0x74,0x4, 0xac,0xbe,0x59,0x45,0x62,0x2a,0x49,0x33,0x6d,0x16,0x59,0x35,0x62, +0x2c,0x6d,0x33,0x59,0x32,0x62,0x66,0x6c,0xdd,0xe1,0x4e,0x7e,0x10,0x9, 0xac,0x1d, +0x9, 0xc0,0x5c,0xe7,0xbc,0xce,0x68,0x2, 0xe1,0x4c,0x7e,0x70,0x73,0xac,0x7c,0x2e, +0x34,0x5d,0x97,0x6d,0x22,0x7a,0x1d,0x33,0x12,0xe5,0x49,0x49,0x10,0x5c,0xe3,0x49, +0x0, 0x5c,0xe5,0x12,0xb8,0x77,0x7a,0x35,0x27,0x12,0xe5,0x49,0x74,0x4, 0xac,0xbc, +0x49,0x15,0x62,0x2a,0x49,0x5, 0x62,0x2c,0x12,0xb8,0x77,0x7a,0x35,0x31,0x74,0x2, +0xac,0xbc,0x7d,0x35,0x2e,0x34,0x62,0x66,0xb, 0x38,0x40,0x2e,0x45,0x27,0x1b,0x38, +0x40,0x49,0x45,0x62,0x66,0xbe,0x44,0xf, 0xa0,0x28,0x8, 0x7e,0x34,0xf, 0xa0,0x59, +0x35,0x62,0x66,0xe5,0x3f,0x7a,0xb3,0x63,0x1b,0x12,0xe5,0x6b,0x9, 0x73,0x0, 0x6, +0x7a,0x73,0x63,0x1d,0x7e,0x35,0x27,0x7a,0x37,0x63,0x24,0x7e,0x35,0x31,0x7a,0x37, +0x63,0x26,0x12,0xe5,0x6b,0xb, 0x38,0x30,0x7a,0x37,0x63,0x28,0x12,0xe5,0x6b,0x49, +0x33,0x0, 0x2, 0x7a,0x37,0x63,0x2a,0x74,0x2, 0xac,0xbc,0x49,0x35,0x62,0x52,0x7a, +0x37,0x63,0x2c,0x74,0x2, 0xac,0xbc,0x49,0x35,0x62,0x66,0x7a,0x37,0x63,0x30,0x74, +0x9, 0xac,0xbd,0x49,0x25,0x5c,0xe3,0x7e,0x37,0x63,0x28,0x9d,0x32,0x7a,0x37,0x63, +0x20,0x74,0x9, 0xac,0xbd,0x49,0x25,0x5c,0xe5,0x7e,0x37,0x63,0x2a,0x9d,0x32,0x7a, +0x37,0x63,0x22,0x12,0xe6,0x23,0xbe,0xa0,0x0, 0x28,0x1c,0x7e,0x34,0x0, 0x17,0xca, +0x39,0x12,0xe5,0x62,0x2e,0x34,0xff,0xe9,0x7e,0x8, 0x63,0x32,0x12,0x24,0xf, 0x1b, +0xfd,0x7e,0x37,0x63,0x3b,0x80,0x9, 0x7e,0x8, 0x63,0x32,0x12,0xe6,0x70,0x6d,0x33, +0x7a,0x35,0x29,0x12,0xe6,0x23,0xbe,0xa0,0x2, 0x40,0x18,0x7e,0x34,0x0, 0x17,0xca, +0x39,0x12,0xe5,0x62,0x2e,0x34,0xff,0xd2,0x7e,0x8, 0x63,0x49,0x12,0x24,0xf, 0x1b, +0xfd,0x80,0x7, 0x7e,0x8, 0x63,0x49,0x12,0xe6,0x70,0x6d,0x33,0x7a,0x35,0x2d,0x75, +0x26,0x0, 0x80,0x12,0x7e,0xa1,0x26,0x12,0xe5,0x62,0x69,0x31,0x0, 0x9, 0x2e,0x35, +0x2d,0x7a,0x35,0x2d,0x5, 0x26,0xa, 0x3c,0x9, 0x73,0x62,0x15,0xbe,0x71,0x26,0x38, +0xe3,0xbe,0x70,0x0, 0x28,0xa, 0xa, 0x27,0x7e,0x35,0x2d,0x8d,0x32,0x7a,0x35,0x2d, +0x7e,0x35,0x2d,0x7a,0x37,0x63,0x2e,0xc2,0x0, 0xc2,0x1, 0x12,0x5f,0xa8,0xa, 0x3c, +0x9, 0xb3,0x62,0x7c,0x60,0x2, 0x61,0xd8,0x7e,0x71,0x3f,0x74,0x8, 0xac,0x7b,0x2e, +0x34,0x0, 0x14,0xbe,0x35,0x29,0x50,0x7, 0xbe,0x35,0x27,0x50,0x2, 0xd2,0x26,0x7e, +0xa3,0x63,0x32,0x74,0x5, 0xa4,0xbe,0x57,0x63,0x3b,0x50,0x19,0x7e,0xa3,0x63,0x49, +0x74,0x5, 0xa4,0xbe,0x57,0x63,0x52,0x50,0xc, 0x7e,0x37,0x63,0x45,0xbe,0x34,0x0, +0x14,0x28,0x2, 0xd2,0x1, 0xa2,0x1, 0xe4,0x33,0x7a,0xb3,0x63,0x1e,0x7e,0x71,0x3f, +0x74,0x1e,0xac,0x7b,0x2e,0x35,0x29,0xbe,0x35,0x27,0x50,0x4, 0xd2,0x3, 0x80,0xe, +0x7e,0x35,0x29,0x2e,0x34,0x0, 0x40,0xbe,0x35,0x27,0x50,0x2, 0xd2,0x4, 0x30,0x3, +0x6, 0xd2,0x2, 0x74,0x64,0x80,0x14,0x30,0x4, 0xf, 0x30,0x1, 0x6, 0xc2,0x2, 0x74, +0xa, 0x80,0x8, 0xd2,0x2, 0x74,0xc8,0x80,0x2, 0x74,0x14,0x7a,0xb3,0x63,0x1c,0x20, +0x2, 0x2, 0x61,0xc4,0x7e,0x37,0x63,0x2e,0xbe,0x34,0x0, 0xa, 0x38,0x2, 0x61,0xc4, +0x7e,0x37,0x63,0x45,0xbe,0x34,0x0, 0xa, 0x28,0x7a,0x7e,0x37,0x63,0x5c,0xbe,0x34, +0x0, 0xa, 0x28,0x70,0x7e,0x37,0x63,0x37,0x2e,0x37,0x63,0x3f,0x7a,0x35,0x39,0xbe, +0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x7a,0x35,0x39,0x7e,0x37,0x63,0x39,0x2e,0x37, +0x63,0x41,0x12,0xe6,0xae,0x58,0x5, 0x6d,0x33,0x7a,0x35,0x3b,0x12,0xe5,0x59,0x7e, +0x15,0x39,0x7e,0x5, 0x3b,0x12,0xb8,0x77,0x7a,0x35,0x39,0x7e,0x37,0x63,0x47,0xbe, +0x34,0xf, 0xa0,0x40,0xa, 0x7e,0x27,0x63,0x45,0x7e,0x34,0x0, 0xf, 0x80,0x13,0x12, +0xe6,0xb6,0x7e,0x27,0x63,0x45,0x28,0x6, 0x7e,0x34,0x0, 0x9, 0x80,0x4, 0x7e,0x34, +0x0, 0x6, 0xad,0x32,0x7a,0x35,0x2f,0xbe,0x35,0x39,0x28,0x8, 0xc2,0x2, 0x74,0x28, +0x7a,0xb3,0x63,0x1c,0x30,0x25,0xc, 0xc2,0x2, 0xe4,0x12,0xe4,0xe5,0x74,0x6e,0x7a, +0xb3,0x63,0x1c,0x12,0xe6,0xbe,0x80,0x19,0xa, 0x3c,0x2e,0x34,0x62,0x7c,0x12,0xe6, +0xc6,0x12,0xe6,0xbe,0x74,0x78,0x7a,0xb3,0x63,0x1c,0xd2,0x2, 0xe4,0x7a,0xb3,0x63, +0x1e,0xa2,0x2, 0xe4,0x33,0x7a,0xb3,0x63,0x1f,0xa, 0x3c,0x9, 0xa3,0x62,0x1f,0x4c, +0xaa,0x78,0x19,0x7e,0x35,0x3d,0xbe,0x35,0x27,0x40,0x2, 0xc1,0x33,0x20,0x2, 0x2, +0xc1,0x33,0x74,0x1, 0xa, 0x4c,0x19,0xb4,0x62,0x1f,0xc1,0x33,0xbe,0xa0,0x1, 0x68, +0x2, 0xc1,0x15,0x7e,0x7, 0x63,0x5c,0xbe,0x4, 0x0, 0x3, 0x50,0x30,0x7e,0x17,0x63, +0x3b,0xbe,0x14,0x0, 0x50,0x50,0x26,0x7e,0x17,0x63,0x2c,0xbe,0x14,0x0, 0x14,0x50, +0x1c,0x7e,0x17,0x63,0x54,0xbe,0x14,0x0, 0x1e,0x50,0x12,0x7e,0x17,0x63,0x3d,0xbe, +0x14,0x0, 0x50,0x50,0x8, 0x7e,0x15,0x29,0x7a,0x15,0x2f,0xa1,0x46,0x7e,0x17,0x63, +0x2c,0xbe,0x14,0x0, 0xa, 0x50,0x13,0x7e,0x17,0x63,0x45,0xbe,0x14,0x0, 0x8, 0x28, +0x9, 0x7e,0x73,0x63,0x1d,0xbe,0x70,0xf, 0x40,0x15,0x7e,0x17,0x63,0x45,0xbe,0x14, +0x0, 0xf, 0x28,0x42,0xbe,0x4, 0x0, 0xf, 0x28,0x3c,0x12,0xe6,0xb6,0x50,0x37,0x7e, +0xa3,0x63,0x32,0xa, 0x2a,0x7e,0x35,0x29,0x8d,0x32,0x7d,0x23,0x1e,0x24,0x12,0xe4, +0xd7,0xbe,0x34,0x0, 0x78,0x28,0x7, 0x7e,0x4, 0x0, 0x78,0x7a,0x5, 0x2f,0xbe,0xa0, +0xa, 0x38,0x2, 0xa1,0x46,0x7e,0x5, 0x2f,0xbe,0x4, 0x0, 0x50,0x40,0x2, 0xa1,0x46, +0x7e,0x4, 0x0, 0x50,0x80,0x8, 0x7e,0xb3,0x63,0x4c,0x60,0x7, 0x6d,0x0, 0x7a,0x5, +0x2f,0x80,0x73,0x7e,0x73,0x63,0x32,0xa, 0x27,0x7e,0x37,0x63,0x3b,0x12,0xe4,0xd3, +0x7e,0xa3,0x63,0x34,0x74,0x2, 0xa4,0x7e,0x73,0x63,0x1d,0xa, 0x27,0xbd,0x25,0x8, +0x31,0xbe,0x14,0x0, 0x1e,0x50,0x2b,0x7e,0x63,0x63,0x4b,0xa, 0x6, 0x12,0xcf,0x1f, +0x8, 0x4, 0x9d,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0xbe,0x24,0x0, 0x5, 0x8, 0x12, +0x7e,0x25,0x2f,0xbe,0x24,0x0, 0xc8,0x50,0x2d,0x7e,0x24,0x0, 0xc8,0x7a,0x25,0x2f, +0x80,0x24,0xbe,0x70,0xf, 0x28,0xf, 0x7e,0x35,0x2f,0xbe,0x34,0x0, 0xc8,0x28,0x16, +0x7e,0x34,0x0, 0xc8,0x80,0xd, 0x7e,0x35,0x2f,0xbe,0x34,0x0, 0x78,0x28,0x7, 0x7e, +0x34,0x0, 0x78,0x7a,0x35,0x2f,0x7e,0x35,0x2f,0xbe,0x35,0x27,0x28,0x42,0xd2,0x0, +0x7e,0x37,0x63,0x2c,0xbe,0x34,0x0, 0x8, 0x50,0x11,0x12,0xe6,0x67,0x28,0xc, 0x74, +0x2, 0xa, 0x2c,0x19,0xb2,0x62,0x1f,0xc2,0x0, 0x80,0x7b,0x7e,0x27,0x63,0x54,0xbe, +0x24,0x0, 0x64,0x28,0x71,0x12,0xe6,0x67,0x28,0x6c,0xbe,0x34,0x0, 0x14,0x50,0x66, +0x7e,0x73,0x63,0x1d,0xbe,0x70,0x14,0x50,0x5d,0x12,0xe4,0xe3,0xc2,0x0, 0x80,0x56, +0x7e,0x35,0x3d,0xbe,0x35,0x27,0x50,0x8, 0x30,0x2, 0x5, 0x74,0x3, 0x12,0xe4,0xe5, +0x7e,0x37,0x63,0x2c,0xbe,0x34,0x0, 0x1e,0x50,0x3c,0x7e,0x73,0x5a,0x5b,0xbe,0x70, +0x2, 0x28,0x18,0x7e,0xb3,0x63,0x35,0x70,0x12,0x12,0xe6,0x5e,0x50,0xd, 0x12,0xe5, +0x59,0x12,0xb9,0x31,0x50,0x20,0x12,0xe4,0xe3,0x80,0x1b,0x12,0xe6,0x5e,0x50,0x16, +0x7e,0x37,0x63,0x26,0xbe,0x34,0x0, 0x1e,0x50,0xc, 0x7e,0x37,0x62,0x7a,0xbe,0x34, +0x0, 0x78,0x50,0x2, 0xd2,0x0, 0x12,0xe6,0x2a,0xb4,0x1, 0x1f,0x12,0xe5,0x59,0x7e, +0x17,0x63,0x56,0x7e,0x7, 0x63,0x58,0x12,0xb8,0x77,0xbe,0x34,0x0, 0x3c,0x50,0x2f, +0xc2,0x0, 0xe4,0xa, 0x3c,0x19,0xb3,0x62,0x15,0x80,0x24,0x12,0xe6,0x2a,0xb4,0x3, +0x22,0x74,0x1, 0x80,0x1b,0x12,0xe6,0x2a,0xb4,0x2, 0x18,0x7e,0x73,0x63,0x49,0xa, +0x27,0x7e,0x37,0x63,0x52,0x12,0xe4,0xd3,0xbe,0x35,0x27,0x28,0x2, 0xd2,0x0, 0xe4, +0x12,0xe4,0xe5,0x7e,0xa1,0x3f,0x74,0x64,0xa4,0x7a,0x55,0x37,0xbe,0x54,0x2, 0x80, +0x28,0xd, 0x7e,0xb3,0x62,0x29,0x70,0x7, 0x7e,0x34,0x2, 0x80,0x7a,0x35,0x37,0x7e, +0x35,0x37,0xbe,0x35,0x27,0x50,0xc, 0x7e,0x37,0x63,0x2c,0xbe,0x34,0x0, 0x2, 0x28, +0x2, 0xd2,0x0, 0x20,0x0, 0x2, 0xc1,0xe6,0xe4,0x12,0xe4,0xe5,0x12,0xb2,0xa5,0x70, +0x8, 0x74,0x3, 0x19,0xb3,0x6e,0x22,0x80,0x25,0x74,0x1, 0x19,0xb3,0x6e,0x22,0x75, +0x26,0x0, 0x80,0x15,0x12,0x85,0x95,0x9, 0x53,0x6d,0xcc,0xbc,0x5e,0x78,0x8, 0x74, +0xff,0x19,0xb3,0x6d,0xcc,0x80,0x7, 0x5, 0x26,0x12,0x81,0xc1,0x38,0xe6,0x7e,0xa0, +0x3, 0x7e,0x70,0x9, 0xac,0x7c,0x19,0xa3,0x6e,0x23,0xe5,0x40,0xbe,0xb0,0x0, 0x28, +0x35,0x15,0x40,0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x6d,0x14,0x7e,0x14,0x62,0xb8, +0x74,0x9, 0x12,0x23,0x44,0x7e,0x71,0x40,0x74,0x9, 0xac,0x7b,0x2e,0x34,0x6d,0x14, +0x12,0x9d,0x7, 0x12,0xa7,0xce,0x7e,0x31,0x40,0x74,0x9, 0xac,0x3b,0x2e,0x14,0x6d, +0x14,0x12,0x23,0x44,0x1b,0xf0,0xa, 0x3c,0x9, 0xb3,0x62,0x15,0xb4,0x5, 0x3d,0x75, +0x26,0x0, 0x80,0x19,0x7e,0x34,0x0, 0x17,0xca,0x39,0x7e,0xa1,0x26,0x12,0xe6,0x55, +0x7f,0x10,0x2e,0x34,0x0, 0x17,0x12,0x24,0xf, 0x1b,0xfd,0x5, 0x26,0xe5,0x26,0xbe, +0xb0,0x4, 0x40,0xe0,0x7e,0x34,0x0, 0x17,0xca,0x39,0x7e,0x18,0x63,0x1b,0x7e,0xd, +0x33,0x2e,0x14,0x0, 0x5c,0x12,0x24,0xf, 0x1b,0xfd,0x80,0x4e,0x7e,0x34,0x0, 0x17, +0xca,0x39,0x12,0xe6,0x23,0x12,0xe6,0x55,0x7e,0x18,0x63,0x1b,0x12,0x24,0xf, 0x1b, +0xfd,0xa, 0x3c,0x2e,0x34,0x62,0x15,0x12,0xc1,0x9a,0x80,0x2e,0xb, 0xd0,0x12,0xb0, +0x9f,0x28,0x2, 0x21,0x2b,0x80,0x23,0x12,0xb2,0xaf,0x6d,0x22,0x74,0x2, 0xac,0xbe, +0x59,0x25,0x62,0x52,0x59,0x25,0x62,0x66,0x7e,0xa0,0xff,0x7e,0x50,0x9, 0xac,0x5e, +0x19,0xa2,0x5c,0xe7,0x74,0x1, 0x19,0xb3,0x62,0x7c,0xb, 0xf0,0xe5,0x40,0xbc,0xbf, +0x28,0x2, 0x1, 0xd3,0x12,0x87,0x98,0xca,0x59,0x7e,0x18,0x6d,0x14,0x7e,0x8, 0x62, +0xc1,0x12,0x24,0xf, 0x1b,0xfd,0x6c,0xff,0x2, 0xb0,0x23,0x74,0x9, 0xac,0xbf,0x9, +0xe5,0x6d,0x18,0xa, 0x3e,0x9, 0x73,0x62,0x1f,0xbe,0x70,0x0, 0x28,0x73,0x6c,0xdd, +0x80,0x6a,0xa, 0x4e,0x9, 0xa4,0x62,0x1f,0xbe,0xa0,0x1, 0x78,0x2e,0x7e,0x70,0x9, +0xac,0x7d,0x9, 0xb3,0x5c,0xe7,0xbc,0xbe,0x78,0x50,0x49,0x33,0x5c,0xe3,0x7e,0x50, +0x9, 0xac,0x5f,0x59,0x32,0x6d,0x14,0x7e,0x70,0x9, 0xac,0x7d,0x49,0x33,0x5c,0xe5, +0x7e,0x50,0x9, 0xac,0x5f,0x59,0x32,0x6d,0x16,0x80,0x36,0xbe,0xa0,0x2, 0x78,0x2a, +0x74,0x9, 0xac,0xbd,0x9, 0x75,0x5d,0x41,0xbc,0x7e,0x78,0x1e,0x49,0x35,0x5d,0x3d, +0x74,0x9, 0xac,0xbf,0x59,0x35,0x6d,0x14,0x74,0x9, 0xac,0xbd,0x49,0x35,0x5d,0x3f, +0x74,0x9, 0xac,0xbf,0x59,0x35,0x6d,0x16,0x80,0x7, 0xb, 0xd0,0x12,0xb0,0x9f,0x38, +0x91,0xb, 0xf0,0xe5,0x40,0xbc,0xbf,0x28,0x3, 0x2, 0xaf,0x9b,0x12,0x87,0x98,0xca, +0x59,0x7e,0x18,0x5c,0xe3,0x7e,0x8, 0x5d,0x3d,0x12,0x24,0xf, 0x1b,0xfd,0x12,0x87, +0x98,0xca,0x59,0x7e,0x18,0x62,0xc1,0x7e,0x8, 0x5c,0xe3,0x12,0x24,0xf, 0x1b,0xfd, +0x6c,0xff,0x80,0x38,0x7e,0x50,0x9, 0xac,0x5f,0x9, 0xe2,0x5c,0xe7,0x12,0xb2,0x9d, +0x28,0x28,0x12,0xb2,0xa5,0xbe,0xb0,0x1, 0x68,0x3, 0xb4,0x3, 0x1d,0x12,0xb2,0xaf, +0x6d,0x11,0x74,0x2, 0xac,0xbe,0x59,0x15,0x62,0x52,0x59,0x15,0x62,0x66,0x74,0xff, +0x19,0xb2,0x5c,0xe7,0x74,0x1, 0x19,0xb3,0x62,0x7c,0xb, 0xf0,0x12,0x9f,0x71,0x38, +0xc3,0xe5,0x40,0x7a,0xb3,0x6e,0x7c,0xe4,0x7a,0xb3,0x5c,0xc4,0xda,0x3b,0x22,0x90, +0x21,0x51,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x21,0x41,0x6c, +0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x6d,0xcc,0x74,0x9, 0xac,0xbe,0x9, +0x75,0x6d,0x18,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0xb0,0x9f,0x38,0xe5,0x12,0xb0, +0x9f,0x28,0x74,0x7e,0x50,0x9, 0xac,0x5d,0x9, 0xc2,0x6d,0xcc,0x49,0x42,0x6d,0xca, +0x74,0x9, 0xac,0xbe,0x49,0xa5,0x6d,0x16,0x7d,0x3a,0x9d,0x34,0xbe,0x34,0x0, 0x0, +0x8, 0x4, 0x9d,0xa4,0x80,0x4, 0x6d,0xaa,0x9d,0xa3,0x49,0x42,0x6d,0xc8,0x49,0xb5, +0x6d,0x14,0x7d,0x3b,0x9d,0x34,0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0x9d,0xb4,0x80,0x4, +0x6d,0xbb,0x9d,0xb3,0x2d,0xba,0x74,0x9, 0xac,0xbc,0x9, 0xb5,0x6e,0x22,0xb4,0x1, +0xe, 0x6d,0xaa,0x74,0x2, 0xac,0xbc,0x59,0xa5,0x5a,0x44,0x59,0xa5,0x5c,0xc5,0x7d, +0x3b,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12,0xb3,0xbc,0x7c,0xbd,0x12,0xb1,0x4a,0xb, +0xe0,0xbc,0xfe,0x28,0x2, 0x1, 0xaf,0xda,0x3b,0x22,0x2, 0xb1,0x4d,0xca,0x3b,0x7c, +0xd4,0x7c,0xe5,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x6e,0x9b,0xbd,0x13,0x38,0x6, 0x7e, +0xd4,0x1, 0x0, 0x80,0x17,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x22,0xbd, +0x7d,0xd3,0xbe,0xd4,0x0, 0x10,0x50,0x4, 0x7e,0xd4,0x0, 0x10,0x74,0x2, 0xac,0xbd, +0x49,0x45,0x5c,0xc5,0xbd,0x4f,0x28,0x6, 0x49,0xd5,0x5a,0x44,0x80,0x4, 0x59,0xd5, +0x5a,0x44,0x59,0xf5,0x5c,0xc5,0xbe,0xd4,0x1, 0x0, 0x28,0x4, 0x7e,0xd4,0x1, 0x0, +0x7e,0xb3,0x6e,0xa2,0x60,0xb, 0x7e,0x73,0x6e,0x7c,0xbe,0x70,0x2, 0x40,0x2, 0x1e, +0xd4,0x7e,0x73,0x6e,0x7c,0xbe,0x70,0x5, 0x28,0x2, 0x1e,0xd4,0xbe,0xd4,0x0, 0x20, +0x50,0x11,0x7e,0x70,0x9, 0xac,0x7d,0x9, 0xb3,0x59,0xe6,0xb4,0x1, 0x5, 0xe4,0x19, +0xb3,0x59,0xe6,0xbe,0xd4,0x0, 0x40,0x28,0xc, 0x7e,0xa0,0x1, 0x7e,0x70,0x9, 0xac, +0x7d,0x19,0xa3,0x59,0xe6,0x7c,0xbe,0x7c,0x7d,0x12,0xb2,0xbb,0x7d,0x13,0x7e,0xb3, +0x6e,0xa2,0x60,0x2, 0x1e,0xd4,0x7e,0x70,0x9, 0xac,0x7f,0x49,0x3, 0x6d,0xc8,0x7e, +0xd0,0x9, 0xac,0xde,0x49,0x26,0x6d,0x14,0x7d,0xe2,0x9d,0xe0,0xbe,0xe4,0x0, 0x0, +0x8, 0x6, 0x7d,0xf2,0x9d,0xf0,0x80,0x4, 0x6d,0xff,0x9d,0xfe,0x12,0xb2,0x8e,0xbd, +0x20,0x28,0xf, 0x7d,0xe3,0x2e,0xe4,0x6d,0xc8,0x7d,0xc0,0x2d,0xcf,0x1b,0xe8,0xc0, +0x80,0xf, 0x74,0x9, 0xac,0xbf,0x7d,0xe5,0x2e,0xe4,0x6d,0xc8,0x9d,0xf, 0x1b,0xe8, +0x0, 0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x6d,0xca,0x7e,0xd0,0x9, 0xac,0xde,0x49, +0xe6,0x6d,0x16,0x7d,0xe, 0x9d,0x3, 0xbe,0x4, 0x0, 0x0, 0x8, 0x6, 0x7d,0xfe,0x9d, +0xf3,0x80,0x4, 0x6d,0xff,0x9d,0xf0,0x12,0xb2,0x8e,0xbd,0xe3,0x28,0xf, 0x7d,0xe2, +0x2e,0xe4,0x6d,0xca,0x7d,0x23,0x2d,0x2f,0x1b,0xe8,0x20,0x80,0xe, 0x7e,0x50,0x9, +0xac,0x5f,0x2e,0x24,0x6d,0xca,0x9d,0x3f,0x1b,0x28,0x30,0xda,0x3b,0x22,0x7d,0x5d, +0xad,0x5f,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0x7d,0xf5,0x5d,0xf1,0x22,0x90,0x21,0x51, +0xe4,0x93,0xbc,0xbe,0x22,0x7e,0x70,0x9, 0xac,0x7e,0x9, 0xb3,0x6e,0x22,0x22,0xe4, +0xa, 0x3e,0x19,0xb3,0x62,0x15,0x19,0xb3,0x62,0x1f,0x22,0x7c,0x17,0x7c,0xab,0x7e, +0x14,0xff,0xfc,0x7e,0x3, 0x6e,0x7c,0x7e,0x90,0x9, 0xac,0x91,0x9, 0xb4,0x59,0xe1, +0xb4,0x1, 0x49,0xa5,0xb8,0x1, 0xc, 0xbe,0x14,0xff,0x0, 0x28,0x10,0x7e,0x14,0xff, +0x0, 0x80,0xa, 0xbe,0x14,0xff,0xe0,0x28,0x4, 0x7e,0x14,0xff,0xe0,0x49,0x34,0x59, +0xe2,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x22,0x6d,0x14,0x12,0xb3,0xa6,0x8, 0x3, 0x12, +0xb3,0xb0,0x7e,0x70,0x9, 0xac,0x71,0x49,0x33,0x59,0xe4,0x7e,0x50,0x9, 0xac,0x5a, +0x49,0x22,0x6d,0x16,0x12,0xb3,0xa6,0x8, 0x3, 0x12,0xb3,0xb0,0x7e,0x70,0x9, 0xac, +0x71,0x49,0x23,0x59,0xe2,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x33,0x6d,0x14,0x12,0xb3, +0x9c,0x18,0x16,0x74,0x9, 0xac,0x1b,0x49,0x20,0x59,0xe4,0x7e,0x70,0x9, 0xac,0x7a, +0x49,0x33,0x6d,0x16,0x12,0xb3,0x9c,0x8, 0x4, 0x7e,0x14,0xff,0xfc,0x7e,0x50,0x9, +0xac,0x5a,0x49,0x2, 0x6d,0x14,0xbe,0x4, 0x6, 0x50,0x40,0x39,0x7e,0x63,0x6e,0xb1, +0x7e,0x70,0x40,0xac,0x67,0x9e,0x34,0x0, 0x65,0x12,0x33,0xd2,0x3e,0x34,0xbd,0x3, +0x38,0x23,0x49,0x32,0x6d,0x16,0xbe,0x34,0x6, 0x50,0x40,0x19,0x7e,0x3, 0x6e,0xb2, +0x7e,0x10,0x40,0xac,0x1, 0x9e,0x4, 0x0, 0x65,0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0xbd,0x30,0x28,0x4, 0x7e,0x14,0xff,0xff,0x7d,0x31,0x22,0x9d,0x32,0x12,0x24, +0x56,0xbe,0x34,0x4, 0x0, 0x22,0x9d,0x32,0x12,0x24,0x56,0xbe,0x34,0x1, 0x0, 0x22, +0x6c,0x0, 0x7e,0x70,0x9, 0xac,0x71,0x19,0x3, 0x59,0xe1,0x22,0xca,0x3b,0x7c,0xab, +0x7d,0x3, 0x7e,0x20,0x10,0x7d,0x30,0x7e,0x90,0x9, 0xac,0x95,0x9, 0x34,0x6d,0x1a, +0xbe,0x30,0x10,0x28,0x2, 0x7c,0x23,0xbe,0x20,0x20,0x28,0x3, 0x7e,0x20,0x20,0x49, +0xe4,0x6d,0x14,0xbe,0xe4,0x6, 0x50,0x40,0x20,0x7e,0x33,0x6e,0xb1,0x12,0xb4,0xbe, +0xbd,0xef,0x38,0x15,0x49,0xe4,0x6d,0x16,0xbe,0xe4,0x6, 0x50,0x40,0xb, 0x7e,0x33, +0x6e,0xb2,0x12,0xb4,0xbe,0xbd,0xef,0x28,0x3, 0x7e,0x20,0x8, 0x7e,0xf0,0x10,0xac, +0xf2,0xbd,0x70,0x40,0x63,0x7e,0xf0,0x9, 0xac,0xf4,0x9, 0xb7,0x59,0xe6,0x70,0x58, +0x7e,0xd0,0x8, 0xac,0xd2,0xbd,0x60,0x50,0x3c,0x9, 0xb7,0x59,0xdf,0x70,0x1f,0x9, +0xb7,0x59,0xe0,0xbe,0xb0,0x0, 0x28,0xc, 0x7d,0x37,0x2e,0x34,0x59,0xe0,0x14,0x7a, +0x39,0xb0,0x80,0x6, 0x74,0x1, 0x19,0xb7,0x59,0xdf,0x6d,0x33,0x80,0x3a,0x9, 0xb7, +0x59,0xe0,0xbe,0xb0,0x14,0x50,0x31,0x7d,0x37,0x2e,0x34,0x59,0xe0,0x4, 0x7a,0x39, +0xb0,0x6d,0x33,0x80,0x23,0xe4,0x19,0xb7,0x59,0xe0,0x19,0xb7,0x59,0xdf,0x6d,0x33, +0x74,0x1, 0x7a,0xb3,0x5c,0xd9,0x80,0x10,0x6c,0x33,0x7e,0xf0,0x9, 0xac,0xf4,0x19, +0x37,0x59,0xe0,0xe4,0x19,0xb7,0x59,0xdf,0x7e,0x30,0x8, 0xac,0x23,0xbd,0x10,0x40, +0x2a,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x33,0x6d,0xc8,0x59,0x34,0x6d,0x14,0x74,0x9, +0xa4,0x49,0x35,0x6d,0xca,0x74,0x9, 0xac,0xb5,0x59,0x35,0x6d,0x16,0x7e,0xa0,0x1, +0x7e,0x70,0x9, 0xac,0x74,0x19,0xa3,0x59,0xde,0x6d,0x33,0xda,0x3b,0x22,0x7e,0xf0, +0x40,0xac,0xf3,0x7d,0xf7,0x9e,0xf4,0x0, 0x65,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e, +0xf4,0x22,0x7e,0x8, 0x59,0xd4,0x7e,0x34,0x0, 0xa, 0x74,0x3, 0x12,0x24,0x34,0x7e, +0x8, 0x5a,0x38,0x7e,0x34,0x0, 0xa, 0xe4,0x2, 0x24,0x34,0xca,0x79,0x7e,0xb3,0x6e, +0x7c,0x7e,0x18,0x6e,0x22,0x70,0x11,0x12,0xb4,0xd2,0x7e,0x8, 0x62,0xae,0x7e,0x34, +0x0, 0xa, 0xe4,0x12,0x24,0x34,0xc1,0xec,0x6c,0xaa,0xc1,0xe5,0x7e,0xf0,0x9, 0xac, +0xfa,0x9, 0x37,0x6d,0x72,0xc2,0x0, 0xc2,0x1, 0x49,0xe7,0x6d,0x6e,0x4d,0xee,0x68, +0x11,0x7e,0xd4,0x21,0xde,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0xf0,0x1b,0xf4,0xbd,0xef, +0x78,0x2, 0xd2,0x0, 0x49,0xf7,0x6d,0x70,0x4d,0xff,0x68,0xd, 0x7e,0xd4,0x21,0xec, +0x12,0xb7,0x3, 0x1b,0x4, 0xbd,0xf0,0x78,0x2, 0xd2,0x1, 0xbe,0x30,0xff,0x78,0x2, +0xc1,0xe3,0x7e,0x10,0x9, 0xac,0x13,0x7f,0x61,0x2d,0xd0,0x7e,0x6b,0xb0,0xb4,0x2, +0x2, 0x80,0x2, 0xc1,0xb6,0x7e,0x10,0x4, 0xac,0x13,0x49,0xd0,0x62,0x86,0x7d,0xce, +0x9d,0xcd,0xbe,0xc4,0x0, 0x0, 0x8, 0x6, 0x7d,0x4e,0x9d,0x4d,0x80,0x4, 0x6d,0x44, +0x9d,0x4c,0x49,0xb0,0x62,0x88,0x7d,0xcf,0x9d,0xcb,0xbe,0xc4,0x0, 0x0, 0x8, 0x6, +0x7d,0xf, 0x9d,0xb, 0x80,0x4, 0x6d,0x0, 0x9d,0xc, 0x7e,0x23,0x6e,0x7c,0xbe,0x20, +0x8, 0x40,0x8, 0x74,0xf, 0xa, 0xca,0x19,0xbc,0x59,0xd4,0xa, 0xca,0x9, 0xbc,0x62, +0xae,0x70,0xe, 0x7d,0xc0,0x2d,0xc4,0xbe,0xc4,0x0, 0x4, 0x50,0x4, 0x6d,0x0, 0x7d, +0x40,0xa, 0xca,0x9, 0x2c,0x59,0xd4,0xa, 0xc2,0xbd,0xc4,0x28,0x52,0xbd,0xc0,0x28, +0x4e,0x20,0x0, 0x3, 0x12,0xb6,0xf9,0x20,0x1, 0x12,0x7e,0xf0,0x4, 0xac,0xf3,0x49, +0xb7,0x62,0x88,0x7e,0xf0,0x9, 0xac,0xfa,0x59,0xb7,0x6d,0x70,0xa, 0xba,0x2e,0xb4, +0x5a,0x38,0x7e,0xb9,0xb0,0x4, 0x7a,0xb9,0xb0,0xa, 0xba,0x9, 0xbb,0x5a,0x38,0xbe, +0xb0,0x32,0x50,0x2, 0xc1,0xe3,0xa, 0xba,0x9, 0xbb,0x59,0xd4,0xbe,0xb0,0x8, 0x40, +0x2, 0xc1,0xe3,0xa, 0xba,0x2e,0xb4,0x59,0xd4,0x4, 0x7a,0xb9,0xb0,0xc1,0xe3,0xbd, +0xc4,0x28,0x56,0xbd,0xc0,0x28,0x52,0x20,0x0, 0x4f,0x20,0x1, 0x4c,0x7e,0xb3,0x78, +0x13,0x70,0x46,0x12,0xb6,0xf9,0x7e,0xf0,0x4, 0xac,0xf3,0x49,0xd7,0x62,0x88,0x7e, +0xf0,0x9, 0xac,0xfa,0x59,0xd7,0x6d,0x70,0xa, 0xda,0x2e,0xd4,0x5a,0x38,0x7e,0xd9, +0xb0,0x4, 0x7a,0xd9,0xb0,0xa, 0xda,0x9, 0xbd,0x5a,0x38,0xbe,0xb0,0x32,0x50,0x2, +0xc1,0xe3,0xa, 0xda,0x9, 0xbd,0x59,0xd4,0xbe,0xb0,0x8, 0x50,0x76,0xa, 0xda,0x2e, +0xd4,0x59,0xd4,0x4, 0x7a,0xd9,0xb0,0x80,0x6a,0x74,0x1, 0xa, 0xda,0x19,0xbd,0x62, +0xae,0x12,0xb6,0xef,0x7e,0xf0,0x4, 0xac,0xf3,0x59,0xf7,0x62,0x88,0xbe,0x20,0x8, +0x40,0xa, 0x74,0x1, 0xa, 0xda,0x19,0xbd,0x59,0xd4,0x80,0x11,0xbe,0x20,0x1, 0x28, +0xc, 0xa, 0xda,0x2e,0xd4,0x59,0xd4,0x7c,0xb2,0x14,0x7a,0xd9,0xb0,0xe4,0xa, 0xda, +0x19,0xbd,0x5a,0x38,0x80,0x2d,0x7e,0xf0,0x9, 0xac,0xf3,0x7f,0x61,0x2d,0xd7,0x7e, +0x6b,0xb0,0x70,0x9, 0x12,0xb6,0xef,0x59,0xf7,0x62,0x88,0x80,0x16,0x7e,0xf0,0x9, +0xac,0xf3,0x7f,0x71,0x2d,0xf7,0x7e,0x7b,0xb0,0xb4,0x1, 0x7, 0xe4,0xa, 0xfa,0x19, +0xbf,0x62,0xae,0xb, 0xa0,0x12,0x4c,0xf7,0x28,0x2, 0xa1,0xc, 0xda,0x79,0x22,0x7e, +0xf0,0x4, 0xac,0xf3,0x59,0xe7,0x62,0x86,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x59,0xd7, +0x6d,0x6e,0x22,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x0, 0x22,0x6c,0x77,0x7e,0xa0,0xff, +0x7e,0x78,0xff,0xff,0x6d,0x44,0x6c,0x66,0x7e,0x14,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0x14,0x14,0x78,0xfb,0x7e,0xb3,0x74,0x7b,0xa, 0x2b,0x5d,0x21,0xbe,0x24,0x0, +0x0, 0x8, 0xd, 0x7e,0x24,0xff,0xff,0x7e,0x30,0x26,0xac,0x36,0x59,0x21,0x74,0x84, +0x12,0xb7,0xa4,0x6d,0x0, 0xbf,0x7, 0x50,0x8, 0x7f,0x70,0x49,0x42,0x74,0x86,0x7c, +0x76,0xb, 0x60,0xa5,0xbe,0x3, 0xc1,0x7e,0x63,0x74,0x7e,0xbc,0x67,0x68,0x42,0x12, +0xb7,0xa4,0x7d,0xc1,0x1e,0xc4,0x1e,0xc4,0x7e,0xd4,0x0, 0x3, 0xad,0xdc,0x6d,0xcc, +0xbf,0x76,0x50,0xb, 0x7e,0xd4,0x22,0x2c,0x12,0xb7,0x3, 0xbd,0x4, 0x38,0x20,0x1e, +0x14,0x6d,0x0, 0xbf,0x70,0x50,0x1a,0x7e,0x50,0x26,0xac,0x56,0x49,0x12,0x74,0x86, +0x7e,0xf4,0x22,0x2c,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x12,0x28,0x2, 0x7c, +0xa7,0x7c,0xba,0x22,0x7e,0x50,0x26,0xac,0x56,0x49,0x12,0x74,0x84,0x22,0x7e,0xa3, +0x6e,0x7d,0xbe,0xa0,0x0, 0x38,0x23,0xbe,0xa3,0x6e,0x7c,0x50,0x18,0x7e,0xb3,0x6e, +0x86,0xbe,0xb3,0x5c,0xdb,0x28,0x13,0x7e,0xb3,0x5c,0xdb,0x4, 0x7a,0xb3,0x5c,0xdb, +0x7a,0xa3,0x6e,0x7c,0x22,0xe4,0x7a,0xb3,0x5c,0xdb,0x22,0x7e,0x73,0x6e,0x7d,0xbe, +0x73,0x6e,0x7c,0x78,0x7d,0x7e,0xb3,0x6e,0x7c,0xb4,0x1, 0x76,0x7e,0xb3,0x5c,0xdc, +0xbe,0xb0,0x2, 0x38,0x13,0x4, 0x7a,0xb3,0x5c,0xdc,0x7e,0x37,0x6d,0x14,0x7a,0x37, +0x5c,0xdf,0x7e,0x37,0x6d,0x16,0x80,0x69,0x7e,0x37,0x5c,0xdd,0xbe,0x34,0x6, 0xa4, +0x50,0x4e,0x7e,0x27,0x6d,0x14,0x7d,0x12,0x9e,0x17,0x5c,0xdf,0xbe,0x14,0x0, 0x0, +0x8, 0x8, 0x7d,0x32,0x9e,0x37,0x5c,0xdf,0x80,0x4, 0x6d,0x33,0x9d,0x31,0x2e,0x37, +0x5c,0xdd,0x7a,0x37,0x5c,0xdd,0x7e,0x37,0x6d,0x16,0x7d,0x3, 0x9e,0x7, 0x5c,0xe1, +0xbe,0x4, 0x0, 0x0, 0x8, 0x8, 0x7d,0x13,0x9e,0x17,0x5c,0xe1,0x80,0x4, 0x6d,0x11, +0x9d,0x10,0x2e,0x17,0x5c,0xdd,0x7a,0x17,0x5c,0xdd,0x7a,0x27,0x5c,0xdf,0x80,0x11, +0xd3,0x22,0xe4,0x7a,0xb3,0x5c,0xdc,0x6d,0x33,0x7a,0x37,0x5c,0xdd,0x7a,0x37,0x5c, +0xdf,0x7a,0x37,0x5c,0xe1,0xc3,0x22,0xca,0x3b,0xbd,0x13,0x50,0x8, 0x7d,0x73,0x9d, +0x71,0x6d,0x66,0x80,0x6, 0x7d,0x71,0x9d,0x73,0x6d,0x66,0xbd,0x2, 0x50,0x8, 0x7d, +0x92,0x9d,0x90,0x6d,0x88,0x80,0x6, 0x7d,0x90,0x9d,0x92,0x6d,0x88,0x7f,0x13,0x7f, +0x3, 0x12,0x22,0xa3,0x7f,0x31,0x7f,0x14,0x7f,0x4, 0x12,0x22,0xa3,0x7f,0x41,0x7f, +0x13,0x2f,0x14,0x12,0xb8,0xb9,0xda,0x3b,0x22,0x7f,0x61,0xbe,0x68,0x0, 0x6, 0x50, +0x15,0xbe,0x68,0x0, 0x2, 0x50,0x3, 0x7f,0x16,0x22,0x7f,0x16,0x1e,0x34,0x1e,0x24, +0x50,0x3, 0x4e,0x60,0x80,0x22,0x7f,0x76,0xe4,0x80,0xe, 0x7f,0x17,0x1e,0x34,0xe, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x4, 0xbe,0x78,0x0, 0x1, 0x18,0xec,0x1e, +0xb0,0x60,0x5, 0x2f,0x77,0x14,0x78,0xfb,0x7f,0x17,0x2f,0x17,0x2f,0x17,0x1e,0x34, +0xe, 0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x7f,0x57,0x7f,0x16,0x7f,0x7, 0x12, +0x22,0xbf,0x2f,0x17,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x7d, +0x2b,0x7d,0x3f,0x9d,0x32,0x12,0x24,0x56,0xbe,0x34,0x0, 0x1, 0x18,0xdb,0x7f,0x17, +0x22,0x6c,0xaa,0x6c,0x33,0x80,0x4e,0x7e,0x90,0x4, 0xac,0x93,0x7e,0x10,0x28,0xac, +0x1a,0x7d,0xe0,0x2d,0xe4,0x49,0xe, 0x5a,0x6b,0x7d,0xf3,0x9d,0xf0,0xbe,0xf4,0x0, +0x0, 0x8, 0x6, 0x7d,0x43,0x9d,0x40,0x80,0x4, 0x6d,0x44,0x9d,0x4f,0x49,0xde,0x5a, +0x6d,0x7d,0xf2,0x9d,0xfd,0xbe,0xf4,0x0, 0x0, 0x8, 0x6, 0x7d,0x2, 0x9d,0xd, 0x80, +0x4, 0x6d,0x0, 0x9d,0xf, 0xbe,0x44,0x0, 0x50,0x50,0x8, 0xbe,0x4, 0x0, 0x50,0x50, +0x2, 0xd3,0x22,0xb, 0x30,0xa, 0xfa,0x9, 0x2f,0x5a,0x5c,0xbc,0x23,0x38,0xa8,0xb, +0xa0,0xbe,0xa0,0xf, 0x40,0x9d,0xc3,0x22,0x12,0x54,0xc8,0x74,0x2, 0xac,0x7b,0x7e, +0x8, 0x5c,0xc5,0xe4,0x12,0x24,0x34,0x90,0x21,0x51,0x93,0x7c,0x7b,0x74,0x2, 0xac, +0x7b,0x7e,0x8, 0x5a,0x44,0xe4,0x2, 0x24,0x34,0x7e,0xb3,0x5c,0xc4,0xbe,0xb0,0xfa, +0x50,0x5, 0x4, 0x7a,0xb3,0x5c,0xc4,0x22,0x6c,0xaa,0x80,0x63,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x6d,0xc8,0x12,0x2f,0xb0,0x59,0x32,0x6d,0x14,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x6d,0xca,0x12,0x2f,0xb0,0x59,0x32,0x6d,0x16,0x7e,0x90,0x9, 0xac, +0x9a,0x9, 0xb4,0x6d,0xcc,0x19,0xb4,0x6d,0x18,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4, +0x6d,0xcd,0x19,0xb4,0x6d,0x19,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6d,0xce,0x19, +0xb4,0x6d,0x1a,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6d,0xcf,0x19,0xb4,0x6d,0x1b, +0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6d,0xd0,0x19,0xb4,0x6d,0x1c,0xb, 0xa0,0x12, +0x4c,0xf7,0x38,0x98,0x22,0x12,0xbb,0x9b,0x12,0xbb,0xa5,0x12,0xba,0x48,0x2, 0xba, +0x41,0x74,0x1, 0x7a,0xb3,0x78,0x44,0x22,0xca,0x3b,0x7e,0xf3,0x6e,0xb0,0x7e,0xe3, +0x6e,0xb1,0x7e,0xd3,0x6e,0xb2,0x6d,0x88,0x6c,0xcc,0x80,0x15,0x7d,0x18,0x3e,0x14, +0x2e,0x14,0x4, 0x0, 0x6d,0x0, 0x7c,0xbd,0x12,0xba,0x78,0xa, 0x9f,0x2d,0x89,0xb, +0xc0,0xbc,0xec,0x38,0xe7,0xda,0x3b,0x22,0xca,0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x0, +0x75,0x26,0x0, 0x9f,0x55,0x6d,0x11,0x7d,0xd1,0x7d,0xc1,0x7d,0x91,0x7e,0x4, 0x7f, +0xff,0x6c,0xee,0x80,0x26,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30, +0x12,0x24,0x56,0x7d,0xc3,0xbd,0xdc,0x58,0x2, 0x7d,0xdc,0xbd,0xc, 0x8, 0x2, 0x7d, +0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x2f,0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xd6,0xbe, +0xd4,0x0, 0x1e,0x58,0xa, 0x7e,0xb3,0x6c,0xf4,0x70,0x4, 0x6d,0x33,0x61,0x8e,0xbe, +0xd4,0x4, 0xb0,0x8, 0x2, 0xd2,0x0, 0xbe,0xd4,0x4, 0xb0,0x8, 0x11,0x7e,0xd4,0x0, +0xa0,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x38,0x7e,0xd4,0x2, 0x58,0x80,0x32,0xbe,0xd4, +0x3, 0x20,0x8, 0x11,0x7e,0xd4,0x0, 0x96,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x21,0x7e, +0xd4,0x2, 0x26,0x80,0x1b,0xbe,0xd4,0x0, 0x0, 0x8, 0x11,0x7e,0xd4,0x0, 0x8c,0x7e, +0xb3,0x76,0x5a,0xb4,0x1, 0xa, 0x7e,0xd4,0x1, 0xc2,0x80,0x4, 0x6d,0x33,0x80,0x6e, +0xbd,0xd, 0x8, 0x5, 0x30,0x0, 0x2, 0x7d,0xd0,0xa, 0x1f,0x12,0xbb,0x91,0x9f,0x55, +0x7f,0x27,0x6c,0xee,0x80,0x1c,0xb, 0x2a,0x90,0xb, 0x55,0x7d,0x39,0x12,0x24,0x56, +0x7d,0xc3,0xbd,0x1c,0x8, 0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51,0x5, 0x26, +0xb, 0xe0,0xbc,0xfe,0x38,0xe0,0x6d,0x11,0xe5,0x26,0xbe,0xb0,0x0, 0x28,0x7, 0xe5, +0x26,0xa, 0x1b,0x12,0xbb,0x91,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, +0x9d,0xd, 0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0xc, 0xb, 0x7a,0x0, 0x9d, +0x1, 0x1b,0x7a,0x0, 0xb, 0xf5,0xb, 0xe0,0xbc,0xfe,0x38,0xf0,0x7d,0x31,0xda,0x79, +0x22,0x6d,0x0, 0x7f,0x15,0x12,0x23,0x10,0x7d,0x13,0x22,0xe4,0x7a,0xb3,0x6d,0xb, +0x7a,0xb3,0x6d,0xc, 0x22,0x7e,0x8, 0x8, 0xc, 0x7e,0x1f,0x24,0x68,0x12,0x77,0x75, +0x7e,0x37,0x73,0x21,0x7e,0x50,0x4, 0x7d,0x3, 0x3e,0x4, 0x7e,0x2f,0x24,0x68,0x2d, +0x50,0xb, 0x2a,0x10,0x59,0x10,0x8, 0xc, 0xb, 0x34,0x1b,0x50,0x78,0xe9,0x22,0xca, +0x79,0x7e,0x73,0x6e,0x7c,0x4c,0x77,0x68,0x5, 0xbe,0x70,0x1, 0x28,0xb, 0x12,0xbd, +0xe0,0x74,0x1e,0x7a,0xb3,0x77,0xcf,0xa1,0xd5,0x7e,0xb3,0x77,0xb3,0x70,0x4a,0x7e, +0xb3,0x6e,0x7d,0x70,0x44,0xa5,0xbf,0x1, 0x40,0x7e,0x57,0x6d,0x70,0xbe,0x54,0x5, +0x50,0x28,0x36,0xbe,0x54,0x5, 0xa0,0x50,0x30,0x7e,0xc7,0x6d,0x6e,0xbe,0xc4,0x0, +0x50,0x28,0x26,0xbe,0xc4,0x2, 0x76,0x50,0x20,0x7a,0xc7,0x77,0xc6,0x7a,0x57,0x77, +0xc8,0x7e,0xc7,0x77,0xc6,0x7a,0xc7,0x77,0xb4,0x7a,0x57,0x77,0xb6,0x74,0x1, 0x7a, +0xb3,0x77,0xb3,0x74,0x1e,0x7a,0xb3,0x77,0xcf,0x7e,0xa3,0x77,0xb3,0xbe,0xa0,0x1, +0x68,0x2, 0x81,0xd3,0x7e,0xb3,0x6e,0x7d,0xb4,0x1, 0x2, 0x80,0x2, 0x81,0xd3,0xa5, +0xbf,0x1, 0x2, 0x80,0x2, 0x81,0xd3,0x12,0xbd,0xe9,0x28,0x77,0xbe,0xc4,0x5, 0xa0, +0x50,0x71,0x7e,0xf7,0x6d,0x6e,0x7a,0xf7,0x77,0xc6,0x7a,0xc7,0x77,0xc8,0x7e,0xf7, +0x77,0xc6,0x9e,0xf7,0x77,0xb4,0x7d,0x4c,0x9e,0x47,0x77,0xb6,0xbe,0xf4,0x0, 0x0, +0x8, 0x6, 0x7d,0xcf,0x7d,0xdc,0x80,0x4, 0x6d,0xdd,0x9d,0xdf,0xbe,0x44,0x0, 0x0, +0x8, 0x6, 0x7d,0xc4,0x7d,0xec,0x80,0x4, 0x6d,0xee,0x9d,0xe4,0xbe,0xd4,0x0, 0x64, +0x58,0x2e,0xbe,0xe4,0x0, 0x64,0x58,0x28,0x7d,0xce,0x2d,0xcd,0xbe,0xc4,0x0, 0x96, +0x58,0x1e,0x7d,0xcf,0xe, 0xc4,0xe, 0xc4,0x2e,0xc7,0x77,0xb4,0x7a,0xc7,0x6d,0x6e, +0x7d,0xc4,0xe, 0xc4,0xe, 0xc4,0x2e,0xc7,0x77,0xb6,0x7a,0xc7,0x6d,0x70,0x80,0x3, +0x75,0x6b,0x1, 0xe5,0x6b,0xbe,0xb0,0x1, 0x68,0xe, 0x12,0xbd,0xe9,0x28,0x2, 0xa1, +0xc5,0xbe,0xa0,0x1, 0x68,0x2, 0xa1,0xc5,0x75,0x6b,0x1, 0xbe,0xa0,0x1, 0x78,0x6, +0x74,0x1d,0x7a,0xb3,0x77,0xcf,0xe4,0x7a,0xb3,0x77,0xb3,0x7e,0x37,0x6d,0x6e,0x7d, +0xf3,0x9e,0xf7,0x77,0xbd,0x7e,0x47,0x6d,0x70,0x9e,0x47,0x77,0xbf,0xbe,0xf4,0x0, +0x0, 0x8, 0x6, 0x7d,0x2f,0x7d,0xd2,0x80,0x4, 0x6d,0xdd,0x9d,0xdf,0xbe,0x44,0x0, +0x0, 0x8, 0x6, 0x7d,0x24,0x7d,0xe2,0x80,0x4, 0x6d,0xee,0x9d,0xe4,0x7e,0xf3,0x77, +0xcf,0x7c,0x1f,0x2e,0x10,0x4d,0xa5,0xe7,0x7c,0xeb,0xa, 0x9e,0x6d,0x88,0x7e,0x8, +0x0, 0x40,0x9f,0x4, 0x6d,0x22,0x12,0x22,0xa3,0x7f,0x51,0x7e,0x37,0x77,0xbd,0x6d, +0x22,0x7f,0x4, 0x12,0xbd,0xd8,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14, +0x78,0xf4,0x7d,0x53,0x7a,0x57,0x6d,0x6e,0xa, 0x3e,0x6d,0x22,0x7e,0x8, 0x0, 0x40, +0x9f,0x1, 0x7e,0x37,0x6d,0x70,0x12,0x22,0xa3,0x7f,0x51,0xa, 0x1e,0x6d,0x0, 0x7e, +0x37,0x77,0xbf,0x6d,0x22,0x12,0xbd,0xd8,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60, +0x80,0x14,0x78,0xf4,0x7d,0x53,0x7a,0x57,0x6d,0x70,0xbe,0xf0,0x0, 0x28,0x1f,0xbe, +0xd4,0x0, 0x2, 0x18,0x10,0xbe,0xe4,0x0, 0x2, 0x18,0xa, 0x7d,0x5e,0x2d,0x5d,0xbe, +0x54,0x0, 0x4, 0x8, 0x9, 0x7c,0xbf,0x14,0x7a,0xb3,0x77,0xcf,0x80,0x7, 0x4c,0xff, +0x78,0x3, 0x12,0xbd,0xe0,0x7e,0x57,0x6d,0x6e,0x7a,0x57,0x77,0xbd,0x7e,0x57,0x6d, +0x70,0x7a,0x57,0x77,0xbf,0xda,0x79,0x22,0x12,0x22,0xa3,0x2f,0x15,0x74,0x6, 0x22, +0xe4,0x7a,0xb3,0x77,0xb3,0x75,0x6b,0x0, 0x22,0x7e,0xc7,0x6d,0x70,0xbe,0xc4,0x5, +0x50,0x22,0x12,0xbe,0x39,0x28,0x3a,0x7e,0xb3,0x6e,0x7d,0x70,0x34,0x7e,0x37,0x6c, +0xe0,0xbe,0x34,0x0, 0x26,0x28,0x2f,0x7e,0xb3,0x78,0x27,0xbe,0xb0,0x2, 0x50,0x26, +0x4, 0x7a,0xb3,0x78,0x27,0x6c,0x33,0x80,0x9, 0xc2,0x2, 0x7c,0xb3,0x12,0x57,0x49, +0xb, 0x30,0x7e,0x23,0x6c,0xde,0xbc,0x23,0x38,0xef,0xe4,0x7a,0xb3,0x6c,0xde,0x80, +0x5, 0xe4,0x7a,0xb3,0x78,0x27,0x2, 0x2f,0x20,0x7e,0x73,0x6c,0xde,0xbe,0x70,0x0, +0x22,0x7e,0x63,0x6e,0xb0,0x7e,0x73,0x6e,0xaf,0xac,0x76,0x7d,0x13,0x1e,0x14,0x7e, +0x27,0x6c,0xe2,0x2e,0x27,0x6c,0xe0,0xbd,0x21,0x38,0x16,0x1e,0x34,0x1e,0x34,0x7d, +0x23,0x2e,0x24,0x0, 0x14,0xbe,0x27,0x6c,0xe0,0x40,0x6, 0xbe,0x37,0x6c,0xe2,0x50, +0x2, 0xd3,0x22,0xc3,0x22,0x7e,0x37,0x6c,0xe2,0x2e,0x37,0x6c,0xe0,0xbe,0x37,0x6c, +0xf9,0x28,0x2, 0xd3,0x22,0xc3,0x22,0xe4,0x7a,0xb3,0x6c,0xff,0x75,0x26,0x0, 0x75, +0x27,0x0, 0x7e,0xb3,0x6e,0xaf,0xf5,0x28,0x7e,0xb3,0x6e,0xb0,0xf5,0x29,0x7e,0x8, +0x0, 0x26,0x7e,0x37,0x6e,0x8d,0x12,0x57,0x71,0xe4,0x33,0x7a,0xb3,0x6c,0xff,0xe4, +0x7a,0xb3,0x6d,0x8, 0x12,0xbe,0x75,0x33,0x7a,0xb3,0x6d,0x8, 0x74,0x1, 0x7a,0xb3, +0x6d,0x9, 0x12,0xbe,0xcc,0xe4,0x33,0x7a,0xb3,0x6d,0x9, 0x22,0xd2,0x0, 0x6c,0x99, +0x80,0x31,0x74,0x2, 0xac,0xb9,0x9, 0x5, 0x75,0xc9,0x9, 0x15,0x75,0xca,0x12,0xbf, +0x49,0x49,0x25,0x75,0x8c,0x7d,0xf3,0x9d,0xf2,0xbe,0xf4,0x0, 0x0, 0x8, 0x4, 0x7d, +0x1f,0x80,0x4, 0x6d,0x11,0x9d,0x1f,0xbe,0x17,0x6c,0xf7,0x28,0x4, 0xc2,0x0, 0x80, +0xa, 0xb, 0x90,0x7e,0x83,0x75,0xc8,0xbc,0x89,0x38,0xc7,0x20,0x0, 0x2d,0x6c,0x99, +0x80,0x1d,0x74,0x2, 0xac,0xb9,0x9, 0x5, 0x6b,0x54,0x9, 0x15,0x6b,0x55,0x12,0xbf, +0x49,0x59,0x35,0x75,0x8c,0x19,0x5, 0x75,0xc9,0x19,0x15,0x75,0xca,0xb, 0x90,0x7e, +0x73,0x6c,0xde,0xbc,0x79,0x38,0xdb,0x7a,0x73,0x75,0xc8,0x7e,0xb3,0x6c,0xde,0x70, +0x5, 0xe4,0x7a,0xb3,0x75,0xc8,0xa2,0x0, 0x22,0x7c,0xb0,0x7c,0x71,0x12,0x57,0x9, +0x74,0x2, 0xac,0xb9,0x22,0xe4,0x7a,0xb3,0x6d,0x7, 0x7a,0xb3,0x6d,0x7, 0x22,0x7c, +0x67,0x7e,0xb, 0x70,0xbc,0x7b,0x38,0x1a,0x29,0x70,0x0, 0x2, 0xbc,0x7b,0x28,0x12, +0x29,0x70,0x0, 0x1, 0xbc,0x76,0x38,0xa, 0x29,0x70,0x0, 0x3, 0xbc,0x76,0x28,0x2, +0xd3,0x22,0xc3,0x22,0x6c,0x44,0xc2,0x1, 0x7e,0x47,0x75,0x0, 0x7e,0x7, 0x75,0x2, +0x12,0x8f,0x4b,0x40,0x4, 0xd2,0x1, 0x80,0x6, 0xa5,0xbf,0x1, 0x2, 0xd2,0x1, 0x7e, +0xb3,0x74,0x81,0x60,0x3, 0x2, 0xc0,0x34,0x7e,0xb3,0x75,0x9, 0x4, 0x7a,0xb3,0x75, +0x9, 0x7d,0x34,0x12,0xc0,0x80,0xbe,0xb0,0x1, 0x40,0x8, 0x4e,0x40,0x4, 0xe4,0x7a, +0xb3,0x75,0x9, 0xbe,0x44,0x0, 0x0, 0x28,0x10,0x7e,0x17,0x74,0x7c,0xbd,0x10,0x50, +0x8, 0x4e,0x40,0x2, 0xe4,0x7a,0xb3,0x75,0x9, 0x7e,0x17,0x74,0x7c,0xbd,0x10,0x50, +0x17,0x7e,0xb3,0x75,0x8, 0x4, 0x7a,0xb3,0x75,0x8, 0xbe,0x4, 0xb, 0xb8,0x28,0x16, +0x7e,0xb3,0x75,0x8, 0xb, 0xb2,0x80,0xa, 0x7e,0xb3,0x75,0x8, 0xbe,0xb0,0x0, 0x28, +0x5, 0x14,0x7a,0xb3,0x75,0x8, 0x7e,0x53,0x75,0x8, 0xbe,0x50,0xa, 0x40,0x11,0xe4, +0x7a,0xb3,0x75,0x8, 0x7a,0x43,0x74,0xf4,0x74,0x1, 0x7a,0xb3,0x74,0x81,0x80,0x14, +0x7e,0x73,0x75,0x9, 0xbe,0x70,0x20,0x40,0xb, 0x74,0x20,0x7a,0xb3,0x75,0x9, 0xe4, +0x7a,0xb3,0x74,0xf4,0x7d,0x34,0x7d,0x20,0x2, 0xc0,0x3b,0x7d,0x2, 0x12,0xc0,0x80, +0x7c,0x7b,0xbe,0x70,0x1, 0x40,0x1d,0x7e,0x34,0x22,0x32,0x7e,0x24,0x0, 0xff,0xb, +0x1a,0x20,0x7e,0x34,0x0, 0xa, 0xad,0x32,0x1e,0x34,0xbd,0x30,0x38,0x6, 0x74,0x1, +0x7a,0xb3,0x75,0x7, 0x7e,0xb3,0x75,0x7, 0xbe,0xb0,0x0, 0x28,0xa, 0x14,0x7a,0xb3, +0x75,0x7, 0xe4,0x7a,0xb3,0x25,0xae,0x30,0x17,0x3, 0xd2,0x19,0x22,0xc2,0x19,0x22, +0x6c,0xaa,0x6c,0x55,0x7e,0x14,0x0, 0x1, 0x7c,0xb5,0x60,0x5, 0x3e,0x14,0x14,0x78, +0xfb,0x5d,0x13,0x68,0x2, 0xb, 0xa0,0xb, 0x50,0xbe,0x50,0x10,0x40,0xe6,0x7c,0xba, +0x22,0x7c,0xa7,0x7c,0x3b,0x7e,0xb3,0x76,0x5a,0xbe,0xb0,0x1, 0x78,0x2, 0x21,0x99, +0xe5,0x1e,0x70,0x2, 0x21,0x99,0x7e,0xb3,0x73,0x1e,0x70,0x2, 0x21,0x99,0x12,0xc1, +0xac,0x7c,0xb3,0x7c,0x7a,0x12,0xbf,0x84,0x12,0xc1,0xe3,0x7e,0xb3,0x74,0x81,0x1b, +0xb1,0x68,0x20,0x4, 0x68,0x2, 0x21,0x99,0x7e,0x73,0x74,0x7e,0x7a,0x73,0x74,0x7f, +0xe4,0x7a,0xb3,0x74,0x80,0x6c,0xaa,0x12,0xc1,0xc0,0xbe,0xa0,0x3, 0x78,0xf8,0x74, +0x2, 0x21,0x95,0x7e,0x43,0x74,0x7f,0x7e,0x50,0x26,0xac,0x45,0x7d,0x32,0x2e,0x34, +0x74,0x83,0x12,0xc1,0x9a,0x9, 0x72,0x74,0x83,0xbe,0x70,0x2, 0x50,0x2, 0x21,0x99, +0xe4,0x19,0xb2,0x74,0x83,0x49,0x12,0x74,0x84,0x2e,0x17,0x74,0xfc,0xbe,0x14,0x7f, +0xff,0x50,0xb, 0x7d,0x32,0x2e,0x34,0x74,0x84,0x1b,0x38,0x10,0x80,0x8, 0x7e,0x34, +0x7f,0xff,0x59,0x32,0x74,0x84,0x49,0x32,0x74,0x86,0xbe,0x37,0x74,0xfc,0x50,0x8, +0x7e,0x37,0x74,0xfc,0x59,0x32,0x74,0x86,0x7e,0x37,0x75,0x0, 0x12,0xc0,0x80,0xa, +0x4b,0x7e,0xa3,0x74,0x7f,0x7e,0x50,0x26,0xac,0x5a,0x2e,0x24,0x74,0x88,0xb, 0x28, +0x30,0x2d,0x34,0x1b,0x28,0x30,0xbe,0xa0,0x2, 0x50,0x5, 0x7c,0xba,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x74,0x7f,0x12,0xc1,0xa2,0x38,0x1f,0x12,0xb7,0xb, 0xbe,0xb0,0xff, +0x68,0x12,0x30,0x18,0xf, 0x7e,0x73,0x74,0x7e,0x12,0x36,0x9c,0x12,0x37,0x94,0xe4, +0x7a,0xb3,0x74,0xf4,0xe4,0x7a,0xb3,0x74,0x81,0x22,0x7e,0x39,0xb0,0x4, 0x7a,0x39, +0xb0,0x22,0x90,0x22,0x34,0xe4,0x93,0xbe,0xb3,0x74,0x80,0x22,0x7e,0x34,0x22,0x32, +0x12,0x29,0xdb,0x7a,0x37,0x74,0x7c,0x7e,0x34,0x5, 0xdc,0x7a,0x37,0x74,0xf8,0x22, +0x6d,0x33,0x7e,0x90,0x26,0xac,0x9a,0x59,0x34,0x74,0x84,0x59,0x34,0x74,0x86,0x59, +0x34,0x74,0x88,0x59,0x34,0x74,0x8a,0x59,0x34,0x74,0x8c,0xe4,0x19,0xb4,0x74,0x83, +0xb, 0xa0,0x22,0xc2,0x16,0xd2,0x18,0x7e,0x37,0x74,0xf8,0xbe,0x37,0x75,0x2, 0x50, +0x2, 0xd2,0x16,0x30,0x26,0x4, 0x74,0x64,0x80,0x7, 0x7e,0xb3,0x74,0xfa,0x60,0x5, +0x14,0x7a,0xb3,0x74,0xfa,0x30,0x16,0x5, 0xe4,0x7a,0xb3,0x74,0xfa,0x7e,0xb3,0x74, +0xfa,0x60,0x2, 0xc2,0x18,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x80,0x78, +0x17,0x7e,0xe0,0xff,0x6c,0xff,0x12,0xc2,0x6e,0x38,0x4, 0x7c,0xe7,0x7c,0xdf,0xb, +0xf0,0xbe,0xf0,0x3, 0x78,0xf0,0x80,0x19,0xbe,0xd0,0x81,0x78,0x14,0x6c,0xee,0x6c, +0xff,0x12,0xc2,0x6e,0x40,0x4, 0x7c,0xe7,0x7c,0xdf,0xb, 0xf0,0xbe,0xf0,0x3, 0x78, +0xf0,0xbe,0xd0,0x3, 0x40,0x2, 0x6c,0xdd,0x7e,0x73,0x74,0x7e,0xbc,0x7d,0x68,0x5, +0x7c,0xbd,0x12,0x36,0x9c,0x7a,0xd3,0x76,0x86,0xda,0x79,0xda,0xd8,0x22,0x74,0x26, +0xac,0xbf,0x9, 0x75,0x74,0x82,0xbc,0x7e,0x22,0x7c,0x37,0x7c,0x2b,0x7e,0xb3,0x73, +0x1e,0x70,0x2, 0x61,0x1f,0x12,0xc3,0x20,0x7e,0xb3,0x75,0x6, 0xbc,0xba,0x78,0x2, +0x61,0x1f,0xa5,0xba,0x0, 0x1b,0x7e,0x90,0x26,0xac,0x9a,0x49,0xf4,0x74,0x9e,0x49, +0xe4,0x74,0x9c,0xa5,0xbb,0x3, 0x15,0x49,0xf4,0x74,0xa6,0x49,0xe4,0x74,0xa4,0x80, +0xb, 0x74,0x26,0xa4,0x49,0xf5,0x74,0xa2,0x49,0xe5,0x74,0xa0,0x7e,0x73,0x6e,0xb0, +0x7a,0x73,0x62,0xb9,0x7e,0x73,0x6e,0xaf,0x7a,0x73,0x62,0xb8,0xe4,0x7a,0xb3,0x62, +0xba,0x7a,0xb3,0x62,0xbb,0x6d,0x33,0x7a,0x37,0x62,0xc2,0x7e,0x1f,0x24,0x68,0x7a, +0x37,0x62,0xbc,0x7d,0x3f,0x7a,0x37,0x62,0xbe,0x7e,0x1f,0x24,0x68,0x7a,0x37,0x62, +0xc0,0x7e,0x8, 0x62,0xb8,0x12,0x8, 0xe5,0x7e,0x37,0x73,0x21,0x6c,0x55,0xa, 0x15, +0x2d,0x13,0x3e,0x14,0x7f,0x27,0x2d,0x51,0xb, 0x2a,0x0, 0x7e,0x2f,0x24,0x68,0x2d, +0x51,0xb, 0x2a,0x10,0x9d,0x10,0x1b,0x2a,0x10,0xb, 0x50,0xa5,0xbd,0x4, 0xdf,0x22, +0x7e,0xb3,0x74,0xfb,0x12,0xc3,0x2a,0x7c,0xab,0x22,0x7c,0x7b,0x6c,0xaa,0x6c,0x66, +0xa, 0x26,0x12,0xc5,0xf, 0xbc,0xb7,0x78,0x4, 0x7c,0xa6,0x80,0x7, 0xb, 0x60,0xbe, +0x60,0x3, 0x40,0xec,0x7c,0xba,0x22,0xca,0x3b,0x7c,0x67,0x7c,0x7b,0x6d,0x22,0x7a, +0x25,0x28,0x7e,0x27,0x73,0x21,0xb, 0x26,0x7a,0x25,0x2a,0x7c,0xb6,0x12,0x8f,0x4b, +0x92,0x1, 0x30,0x1, 0x6, 0x4c,0x77,0x78,0x2, 0x81,0xdb,0x12,0xc3,0x20,0x7a,0xa1, +0x32,0x74,0x26,0xa4,0x49,0xb5,0x74,0x9e,0x49,0xa5,0x74,0x9c,0x49,0x95,0x74,0xa2, +0x49,0x85,0x74,0xa0,0x7e,0x34,0x62,0xba,0x1e,0x34,0x3e,0x34,0x7d,0x73,0x6d,0x66, +0x7e,0x34,0x66,0xc8,0x1e,0x34,0x3e,0x34,0x6d,0x22,0x7a,0x1d,0x2c,0x7e,0x18,0xc, +0x18,0x7a,0x1d,0x33,0x7f,0x3, 0x7e,0x18,0x10,0x24,0x74,0x1, 0x12,0x77,0xa4,0x12, +0xc4,0xde,0x6d,0x33,0x7a,0x35,0x26,0x7e,0x35,0x30,0x7d,0x13,0x3e,0x14,0x49,0x1, +0xc, 0x18,0x49,0x21,0x10,0x24,0x9d,0x20,0x2d,0x17,0x7d,0x6, 0x12,0xc4,0xe6,0x78, +0xe6,0x20,0x1, 0x2, 0x81,0x54,0x7e,0x73,0x75,0x6, 0xbe,0x71,0x32,0x68,0x3a,0x6d, +0x33,0x80,0x29,0x7e,0x35,0x26,0x7d,0x23,0x3e,0x24,0x7f,0x4, 0x2d,0x12,0xb, 0xa, +0x50,0x49,0x42,0x18,0x3c,0x2d,0x45,0x7f,0x5, 0x2d,0x12,0xb, 0xa, 0x10,0x49,0x52, +0x14,0x30,0x2d,0x51,0x12,0xc5,0x3, 0x1b,0xa, 0x20,0xb, 0x34,0x7a,0x35,0x26,0x7e, +0x35,0x2a,0xbe,0x35,0x26,0x38,0xcc,0x80,0x3b,0x7e,0x18,0x18,0x3c,0x7a,0x1d,0x33, +0x7e,0xd, 0x2c,0x7e,0x18,0x14,0x30,0x74,0x1, 0x12,0x77,0xa4,0x7e,0x1d,0x2c,0x7a, +0x1d,0x33,0x7f,0x3, 0x7f,0x13,0x12,0x76,0xb1,0x12,0xc4,0xde,0x6d,0x33,0x7a,0x35, +0x26,0x12,0xc4,0xfb,0x49,0x42,0x18,0x3c,0x49,0x52,0x14,0x30,0x12,0xc5,0x3, 0x12, +0xc4,0xe6,0x78,0xed,0x7f,0x3, 0x12,0xc5,0x1c,0x7a,0x35,0x28,0x12,0xc4,0xde,0x6d, +0x33,0x7a,0x35,0x26,0x12,0xc4,0xfb,0x7f,0x23,0x2d,0x52,0xb, 0x2a,0x10,0xbe,0x14, +0x0, 0x0, 0x8, 0x5, 0xb, 0x2a,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0xbe,0x25,0x28, +0x28,0x12,0xbe,0x14,0x0, 0x0, 0x8, 0x5, 0xb, 0x2a,0x20,0x80,0x4, 0x6d,0x22,0x9d, +0x21,0x7a,0x25,0x28,0x12,0xc4,0xe9,0x78,0xcb,0x7e,0x35,0x28,0xbe,0x34,0x7f,0xff, +0x28,0x7, 0x7e,0x34,0x7f,0xff,0x7a,0x35,0x28,0x7e,0x35,0x28,0x7a,0x37,0x74,0xfc, +0x20,0x1, 0x28,0x7e,0x8, 0x10,0x24,0x7e,0x18,0xc, 0x18,0x12,0x77,0x75,0x12,0xc4, +0xde,0x6d,0x33,0x7a,0x35,0x26,0x7e,0x25,0x30,0x3e,0x24,0x49,0x32,0xc, 0x18,0x59, +0x32,0x10,0x24,0x7e,0x35,0x30,0x12,0xc4,0xe9,0x78,0xeb,0xda,0x3b,0x22,0x7e,0x37, +0x73,0x21,0x7a,0x35,0x30,0x22,0x1b,0xa, 0x20,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35, +0x26,0xb, 0x34,0x7a,0x35,0x26,0xbe,0x34,0x0, 0x4, 0x22,0x7e,0x35,0x30,0x7d,0x23, +0x3e,0x24,0x22,0x9d,0x54,0x7f,0x3, 0x2d,0x12,0xb, 0xa, 0x20,0x2d,0x25,0x22,0x2e, +0x24,0x22,0x29,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0x7e,0x34,0x6a,0xd6, +0x1e,0x34,0x3e,0x34,0x7a,0x17,0x6b,0x16,0x7a,0x37,0x6b,0x1a,0x7e,0x34,0x24,0xbc, +0x7a,0x37,0x6b,0x18,0x7e,0x73,0x6e,0xaf,0x7a,0x73,0x6b,0x13,0x7e,0x73,0x6e,0xb0, +0x7a,0x73,0x6b,0x12,0x7e,0x37,0x6e,0x8d,0x7a,0x37,0x6b,0x1c,0x7e,0x37,0x6e,0x8f, +0x7a,0x37,0x6b,0x1e,0x7e,0x37,0x6e,0x97,0x7a,0x37,0x6b,0x20,0x7e,0x37,0x6e,0x99, +0x7a,0x37,0x6b,0x22,0x74,0x1, 0x7a,0xb3,0x6b,0x14,0x7a,0xb3,0x6b,0x15,0x7e,0x8, +0x6b,0x12,0x7e,0x18,0x6b,0x24,0x12,0x3, 0x1d,0x7e,0x37,0x6b,0x30,0x7a,0x37,0x6e, +0xab,0x7e,0x27,0x6b,0x2a,0xbe,0x24,0x0, 0x0, 0x8, 0x6, 0x7e,0x7, 0x6b,0x2a,0x80, +0x6, 0x6d,0x0, 0x9e,0x7, 0x6b,0x2a,0x7e,0x37,0x6b,0x2e,0xbe,0x34,0x0, 0x0, 0x8, +0x6, 0x7e,0x17,0x6b,0x2e,0x80,0x6, 0x6d,0x11,0x9e,0x17,0x6b,0x2e,0xbd,0x10,0x8, +0x12,0xbe,0x34,0x0, 0x0, 0x8, 0x5, 0x7e,0x37,0x6b,0x2e,0x22,0x6d,0x33,0x9e,0x37, +0x6b,0x2e,0x22,0xbe,0x24,0x0, 0x0, 0x8, 0x6, 0x7e,0x37,0x6b,0x2a,0x80,0x6, 0x6d, +0x33,0x9e,0x37,0x6b,0x2a,0x22,0x7c,0xab,0x7e,0x50,0xa, 0xac,0x57,0x9, 0x62,0x29, +0x8b,0x7e,0x50,0x27,0xac,0x57,0x49,0x2, 0x28,0xed,0xb, 0x4, 0x7e,0x50,0x8, 0xac, +0x5a,0x49,0x22,0x0, 0xe6,0x7a,0x27,0x75,0x0, 0x7e,0x50,0x8, 0xac,0x5a,0x49,0x22, +0x0, 0xe4,0x7a,0x27,0x74,0xfe,0x7e,0x50,0x8, 0xac,0x5a,0x9, 0xb2,0x0, 0xea,0x7a, +0xb3,0x75,0x4, 0x7e,0x50,0x8, 0xac,0x5a,0x9, 0xb2,0x0, 0xeb,0x7a,0xb3,0x75,0x5, +0x74,0x8, 0xa4,0x49,0x15,0x0, 0xe8,0x7c,0xb6,0x60,0x5, 0x1e,0x4, 0x14,0x78,0xfb, +0x8d,0x10,0x7a,0x17,0x75,0x2, 0x74,0x27,0xac,0xb7,0x9, 0x75,0x28,0xe7,0x7a,0x73, +0x74,0xfb,0x22,0x7e,0xb3,0x74,0xf4,0x22,0x7c,0xab,0x6c,0x77,0x7e,0x50,0x26,0xac, +0x57,0x9, 0x62,0x74,0x82,0xbc,0x6a,0x68,0x7, 0xb, 0x70,0xbe,0x70,0x3, 0x40,0xec, +0xa5,0xbf,0x3, 0x6, 0x7a,0xa3,0x74,0x82,0xd3,0x22,0xc3,0x22,0xca,0x79,0x7e,0x68, +0x14,0x30,0x7e,0xb3,0x77,0xe1,0xb4,0x3, 0x4, 0x7e,0x68,0x1c,0x48,0x7e,0x73,0x6e, +0xb0,0x7a,0x73,0x62,0xe3,0x7e,0x73,0x6e,0xaf,0x7a,0x73,0x62,0xe2,0xe4,0x7a,0xb3, +0x62,0xe4,0x7a,0xb3,0x62,0xe5,0x6d,0x33,0x7a,0x37,0x62,0xec,0x6c,0xff,0x7e,0x70, +0x26,0xac,0x7f,0x9, 0xb3,0x74,0x8f,0x70,0x2, 0xe1,0x38,0x7e,0xb3,0x77,0xe1,0xb4, +0x3, 0xa, 0x49,0xf3,0x74,0xa6,0x49,0xe3,0x74,0xa4,0x80,0x8, 0x49,0xf3,0x74,0x9e, +0x49,0xe3,0x74,0x9c,0x7d,0x3f,0x7a,0x37,0x62,0xe6,0x7d,0x3d,0x7a,0x37,0x62,0xe8, +0x7d,0x3f,0x7a,0x37,0x62,0xea,0x12,0xc7,0x4d,0x7e,0xb7,0x73,0x21,0x6c,0xee,0xa, +0xe, 0x2d,0xb, 0x3e,0x4, 0x7f,0x16,0x2d,0x30,0xb, 0x1a,0x10,0x7f,0x17,0x12,0xc7, +0x54,0x78,0xec,0x12,0x8f,0x47,0x50,0x35,0x12,0xc7,0x44,0x7d,0xa3,0x7a,0xa7,0x62, +0xe6,0x7e,0xa4,0x18,0x3c,0x7a,0xa7,0x62,0xe8,0x12,0xc7,0x44,0x7d,0xa3,0x7a,0xa7, +0x62,0xea,0x12,0xc7,0x4d,0x6c,0xee,0xa, 0xe, 0x2d,0xb, 0x3e,0x4, 0x49,0x10,0x18, +0x3c,0x12,0xc7,0x44,0x49,0x25,0x74,0xa0,0x12,0xc7,0x54,0x78,0xea,0x6c,0xaa,0x7e, +0x70,0x26,0xac,0x7f,0x19,0xa3,0x74,0x8f,0xb, 0xf0,0xbe,0xf0,0x3, 0x50,0x2, 0xc1, +0x9e,0xda,0x79,0x22,0x74,0x26,0xac,0xbf,0x49,0x35,0x74,0xa2,0x22,0x7e,0x8, 0x62, +0xe2,0x2, 0x8, 0xe5,0x2d,0x30,0xb, 0x1a,0xa0,0x9d,0xa1,0x1b,0x1a,0xa0,0xb, 0xe0, +0xbe,0xe0,0x4, 0x22,0x7c,0xab,0x6c,0x77,0x7e,0x63,0x75,0x6, 0xbc,0x67,0x78,0x4, +0x6c,0x66,0x80,0x27,0x12,0xc7,0xb0,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x63, +0x73,0x1f,0xa, 0x26,0x5d,0x24,0x68,0x6, 0x7e,0x60,0x1, 0x12,0xc7,0xa6,0x7e,0x63, +0x73,0x20,0xa, 0x26,0x5d,0x24,0x68,0x6, 0x7e,0x60,0x1, 0x12,0xc7,0xa6,0xb, 0x70, +0xbe,0x70,0x3, 0x40,0xc3,0x22,0x7e,0x50,0x26,0xac,0x57,0x19,0x62,0x74,0x8f,0x22, +0x7e,0x44,0x0, 0x1, 0x7c,0xba,0x22,0x7e,0x27,0x75,0x2, 0x7e,0x37,0x74,0x7c,0xbd, +0x32,0x50,0x20,0x7e,0xa3,0x74,0x7f,0x12,0xc7,0xb0,0x60,0x5, 0x3e,0x44,0x14,0x78, +0xfb,0x7c,0xb9,0x4e,0xb3,0x74,0x7b,0x7a,0xb3,0x74,0x7b,0x74,0x5, 0xa, 0x3a,0x19, +0xb3,0x74,0xf5,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x74,0xf5,0xbe,0xb0,0x0, 0x28,0xa, +0xa, 0x4a,0x2e,0x44,0x74,0xf5,0x14,0x7a,0x49,0xb0,0xa, 0x3a,0x9, 0xb3,0x74,0xf5, +0x70,0x16,0x12,0xc7,0xb0,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xb9,0x64,0xff, +0x5e,0xb3,0x74,0x7b,0x7a,0xb3,0x74,0x7b,0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xc6,0x22, +0x7e,0xb3,0x77,0xfa,0xb4,0x1, 0x3, 0x2, 0xc8,0x2b,0x22,0xca,0x3b,0x7e,0xb3,0x6c, +0xde,0xf5,0x26,0x6c,0xcc,0x1, 0xeb,0x74,0x2, 0xac,0xbc,0x9, 0xf5,0x6b,0x54,0x9, +0xe5,0x6b,0x55,0x7e,0x73,0x6e,0xaf,0xbc,0x7f,0x78,0x2, 0x1, 0xe9,0x12,0xc9,0xab, +0x7d,0xd3,0x12,0xc9,0xcb,0x78,0x2, 0x6d,0xee,0x12,0xc9,0x95,0x78,0x2, 0x6d,0xff, +0x4c,0xee,0x78,0x2, 0x6d,0x0, 0x12,0xc9,0x8d,0x78,0x2, 0x6d,0x11,0xbe,0xe4,0x0, +0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0xf4,0x0, 0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0x4, 0x0, +0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0x14,0x0, 0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0xd0,0x2, +0x40,0x4, 0xd2,0x0, 0x80,0x2e,0x4c,0xff,0x68,0x16,0x7e,0xb3,0x6e,0xb1,0x14,0xbc, +0xbf,0x68,0xd, 0x4c,0xee,0x68,0x9, 0x7e,0xb3,0x6e,0xb2,0x14,0xbc,0xbe,0x78,0x14, +0xbe,0xd4,0x1, 0x2c,0x8, 0xe, 0xbe,0xd0,0x0, 0x28,0x9, 0x7e,0xb3,0x77,0xfa,0xb4, +0x1, 0x2, 0xd2,0x0, 0x20,0x0, 0x22,0x7d,0xc3,0x7e,0xb3,0x77,0xfa,0xb4,0x3, 0x4, +0x7d,0x5c,0x80,0xb, 0x7e,0xb3,0x77,0xfa,0xb4,0x1, 0xb, 0x7d,0x5c,0xe, 0x54,0xe, +0x54,0xe, 0x54,0x12,0xc9,0x9d,0x12,0xc9,0x86,0xb, 0xc0,0xe5,0x26,0xbc,0xbc,0x28, +0x2, 0x1, 0x37,0x7e,0xb3,0x77,0xfa,0xb4,0x3, 0x2, 0x80,0x2, 0x21,0x83,0x7e,0xb3, +0x6c,0xdf,0xf5,0x26,0x6c,0xcc,0x80,0x75,0x74,0x2, 0xac,0xbc,0x9, 0xf5,0x6b,0x90, +0x9, 0xe5,0x6b,0x91,0x7e,0x73,0x6e,0xaf,0xbc,0x7f,0x68,0x5f,0x12,0xc9,0xab,0x12, +0xc9,0xcb,0x78,0x2, 0x6d,0xee,0x12,0xc9,0x95,0x78,0x2, 0x6d,0xff,0x4c,0xee,0x78, +0x2, 0x6d,0x0, 0x12,0xc9,0x8d,0x78,0x2, 0x6d,0x11,0xbe,0xe4,0xff,0xba,0x58,0x2, +0xb, 0xd0,0xbe,0xf4,0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe,0x4, 0xff,0xba,0x58,0x2, +0xb, 0xd0,0xbe,0x14,0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe,0xd0,0x2, 0x40,0x2, 0xd2, +0x0, 0x20,0x0, 0x17,0x12,0x24,0x56,0x7d,0xc3,0x7d,0x5c,0xe, 0x54,0xe, 0x54,0x6e, +0x54,0xff,0xff,0xb, 0x54,0x12,0xc9,0x9d,0x12,0xc9,0x86,0xb, 0xc0,0xe5,0x26,0xbc, +0xbc,0x38,0x85,0xda,0x3b,0x22,0xc2,0x2, 0x7c,0xbc,0x2, 0x57,0x49,0x7e,0xb3,0x6e, +0xb0,0x14,0xbc,0xbe,0x22,0x7e,0xb3,0x6e,0xaf,0x14,0xbc,0xbf,0x22,0x7d,0xb4,0x3e, +0xb4,0x7e,0x1f,0x24,0x68,0x2d,0x3b,0x1b,0x1a,0x50,0x22,0x6c,0xdd,0xc2,0x0, 0x7e, +0x33,0x6e,0xb0,0x7c,0x9f,0xac,0x93,0xa, 0x5e,0x2d,0x45,0x7d,0x24,0x3e,0x24,0x7e, +0x5f,0x24,0x68,0x7f,0x75,0x2d,0xf2,0xb, 0x7a,0x30,0x22,0xa, 0x53,0x7d,0x14,0x9d, +0x15,0x3e,0x14,0x2d,0x1b,0x7d,0xa, 0xb, 0xa, 0xe0,0x2d,0x54,0x3e,0x54,0x7f,0x5, +0x2d,0x15,0xb, 0xa, 0xf0,0x7d,0x54,0x1b,0x54,0x3e,0x54,0x7f,0x5, 0x2d,0x15,0xb, +0xa, 0x0, 0x2d,0xb2,0x69,0x15,0x0, 0x2, 0x4c,0xff,0x22,0x7e,0xb3,0x77,0xfa,0xb4, +0x3, 0x3, 0x2, 0xc8,0x2b,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x78,0x3c,0x12,0x2f,0x7d, +0x7e,0x34,0x0, 0x96,0x7a,0x37,0x6e,0x8b,0x12,0x6f,0xc4,0x7e,0x34,0xff,0x38,0x7a, +0x37,0x6e,0x8f,0x7e,0x34,0x1, 0x2c,0x7a,0x37,0x6e,0x97,0x7e,0x34,0xfe,0xd4,0x7a, +0x37,0x6e,0x99,0x12,0xca,0x84,0x68,0x42,0x7e,0x34,0x2, 0x58,0x7a,0x37,0x6e,0x91, +0x7e,0x34,0x2, 0x26,0x7a,0x37,0x6e,0x93,0x22,0xbe,0xa0,0x2, 0x78,0x2c,0x7e,0xb3, +0x77,0xfa,0xb4,0x3, 0x13,0x74,0x5c,0x7a,0xb3,0x6e,0x8a,0x7e,0x34,0x0, 0x5c,0x12, +0xca,0x7b,0x7e,0x34,0xff,0xa4,0x80,0xe, 0x12,0x2f,0x7d,0x7e,0x34,0x1, 0x2c,0x12, +0xca,0x7b,0x7e,0x34,0xfe,0xd4,0x7a,0x37,0x6e,0x8f,0x22,0x7a,0x37,0x6e,0x8b,0x7a, +0x37,0x6e,0x8d,0x22,0x7e,0xb3,0x76,0xe, 0xbe,0xb0,0xaa,0x22,0x9, 0xb3,0x6d,0x75, +0x9, 0x73,0x6d,0x76,0x7c,0x6f,0xca,0x3b,0x7c,0x96,0x7c,0x6b,0x7e,0xd0,0xff,0x75, +0x3d,0xff,0x12,0x5f,0xa8,0xc2,0x5, 0x7e,0x24,0x1, 0xf4,0x7e,0xb3,0x6d,0x7, 0xb4, +0x1, 0x6, 0x12,0xcc,0x31,0xc3,0x61,0xed,0xbe,0x90,0xa, 0x28,0x3, 0xc3,0x61,0xed, +0x7e,0x10,0x3, 0x74,0x4, 0xac,0xb9,0x19,0x15,0x28,0xb9,0x7d,0xf2,0x7c,0xf6,0x7c, +0xe7,0xc2,0x3, 0xc2,0x4, 0x7c,0x1f,0x7a,0xf1,0x39,0x80,0x8, 0x12,0xcc,0xc, 0x8, +0x8, 0x7a,0x11,0x39,0x12,0xcb,0xfa,0x58,0xf3,0x7c,0x1f,0x7a,0xf1,0x3a,0x80,0x8, +0x12,0xcc,0xc, 0x8, 0x8, 0x7a,0x11,0x3a,0x12,0xcc,0x21,0x48,0xf3,0x75,0x3c,0x0, +0x7e,0xa3,0x6e,0xb1,0x7c,0xba,0x14,0xbe,0xb1,0x3a,0x78,0x8, 0xd2,0x4, 0xa, 0x6a, +0x1b,0x64,0x80,0x8, 0xe5,0x39,0x70,0x4, 0xd2,0x3, 0x6c,0xdd,0x7c,0xe, 0x7a,0xe1, +0x3b,0x20,0x4, 0xd, 0x30,0x3, 0x37,0x80,0x8, 0x12,0xcb,0xf0,0x8, 0x8, 0x7a,0x1, +0x3b,0x12,0xcc,0x3, 0x58,0xf3,0x7c,0xe, 0x7c,0x8e,0x80,0x7, 0x12,0xcb,0xf0,0x8, +0x13,0x7c,0x80,0x7c,0xb0,0x4, 0x7c,0xb, 0x1a,0x5b,0x7e,0x73,0x6e,0xb0,0x1a,0x17, +0xbd,0x51,0x48,0xe8,0xe5,0x3b,0xa, 0xeb,0xa, 0x58,0x9d,0x5e,0xf5,0x3c,0xc2,0x2, +0x7c,0xe, 0x7a,0xe1,0x3b,0x80,0xa, 0x7c,0xbf,0x12,0xcb,0xf2,0x8, 0x8, 0x7a,0x1, +0x3b,0x12,0xcc,0x3, 0x58,0xf1,0x75,0x3e,0x0, 0xe5,0x3b,0x70,0x4, 0xd2,0x2, 0xf5, +0x3d,0x7c,0x1f,0x7a,0xf1,0x39,0x30,0x2, 0x2f,0x80,0x8, 0x12,0xcc,0x16,0x8, 0x8, +0x7a,0x11,0x39,0x12,0xcb,0xfa,0x58,0xf3,0x7c,0x1f,0x7a,0xf1,0x3a,0x80,0x8, 0x12, +0xcc,0x16,0x8, 0x8, 0x7a,0x11,0x3a,0x12,0xcc,0x21,0x48,0xf3,0xe5,0x39,0xa, 0x1b, +0xe5,0x3a,0xa, 0x5b,0x9d,0x51,0xf5,0x3e,0x7e,0x30,0x4, 0xac,0x39,0x9, 0x81,0x28, +0xb9,0xbe,0x81,0x3c,0x40,0x16,0xbe,0x81,0x3e,0x50,0x2, 0x80,0xf, 0x9, 0xb1,0x28, +0xb8,0x60,0x13,0x20,0x4, 0x6, 0x20,0x3, 0x3, 0x30,0x2, 0xa, 0x74,0x1, 0x19,0xb1, +0x28,0xb8,0xd2,0x5, 0x80,0x5, 0xe4,0x19,0xb1,0x28,0xb8,0xa2,0x5, 0xda,0x3b,0x22, +0x7c,0xbd,0x7c,0x70,0x12,0x57,0x9, 0xbd,0x3f,0x22,0x7c,0xb1,0x14,0x7c,0x1b,0xbe, +0xb0,0x0, 0x22,0x7c,0xb0,0x14,0x7c,0xb, 0xbe,0xb0,0x0, 0x22,0x7c,0xb1,0x7c,0x7e, +0x12,0x57,0x9, 0xbd,0x3f,0x22,0x7c,0xb1,0x7e,0x71,0x3d,0x12,0x57,0x9, 0xbd,0x3f, +0x22,0x7c,0xb1,0x4, 0x7c,0x1b,0x1a,0xeb,0x7e,0x83,0x6e,0xb1,0x1a,0x18,0xbd,0xe1, +0x22,0x7e,0xb3,0x6c,0xde,0x70,0x2b,0x7e,0xb3,0x6e,0x7c,0x70,0x25,0x6c,0xaa,0x7e, +0x70,0xff,0x7e,0x90,0x4, 0xac,0x9a,0x19,0x74,0x28,0xb7,0xe4,0x19,0xb4,0x28,0xb8, +0x74,0x3, 0x19,0xb4,0x28,0xb9,0xe4,0x19,0xb4,0x28,0xba,0xb, 0xa0,0xbe,0xa0,0xa, +0x78,0xdd,0x22,0xca,0x79,0x7f,0x70,0x7e,0x3, 0x6e,0xb0,0x7e,0x93,0x6c,0xde,0x7e, +0x6f,0x24,0x68,0x6c,0x11,0x6c,0x88,0x6c,0xff,0x80,0xd, 0xa, 0x1f,0x12,0xcd,0x27, +0xbc,0x78,0x40,0x2, 0x7c,0x87,0xb, 0xf0,0xbc,0x9f,0x38,0xef,0x7e,0xf0,0x1, 0xa1, +0x14,0x75,0x28,0x0, 0x6d,0xbb,0x6d,0x99,0x7d,0xa9,0x6c,0xee,0x80,0x3a,0x7e,0x30, +0x2, 0xac,0x3e,0x9, 0xb1,0x6b,0x54,0xf5,0x26,0x9, 0xb1,0x6b,0x55,0xf5,0x27,0xa, +0x1e,0x12,0xcd,0x27,0xbc,0x7f,0x78,0x1e,0x5, 0x28,0xe5,0x26,0xa, 0x1b,0x2d,0xa1, +0xe5,0x27,0xa, 0x1b,0x2d,0x91,0xe5,0x26,0x7e,0x71,0x27,0x12,0x57,0x9, 0x7d,0x83, +0xbd,0xb8,0x58,0x2, 0x7d,0xb8,0xb, 0xe0,0xbc,0x9e,0x38,0xc2,0xe5,0x28,0xbe,0xb0, +0x0, 0x28,0x2f,0xe5,0x28,0xa, 0x8b,0x7d,0x3a,0x8d,0x38,0x7d,0xa3,0x8d,0x98,0x12, +0xcd,0x1f,0x19,0xa1,0x75,0xd, 0x7d,0x39,0x12,0xcd,0x1f,0x19,0xa1,0x75,0xe, 0xa, +0x30,0xad,0x3a,0x7d,0x13,0x2d,0x19,0x3e,0x14,0x7f,0x16,0x2d,0x31,0x1b,0x1a,0xb0, +0xb, 0x10,0xb, 0xf0,0xbc,0x8f,0x40,0x2, 0x81,0x91,0x7c,0xb1,0xda,0x79,0x22,0x7c, +0xa7,0x7e,0x30,0x2, 0xac,0x31,0x22,0x7f,0x17,0x2d,0x31,0x7e,0x1b,0x70,0x22,0x7c, +0x9b,0x7f,0x71,0x7f,0x60,0x7e,0x34,0x28,0x3c,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x62, +0xb8,0x74,0x30,0x12,0x23,0x65,0x7e,0x58,0x62,0xb8,0x7c,0xb9,0x7e,0x71,0x43,0x12, +0x57,0x9, 0x7d,0x3, 0xe5,0x44,0x7e,0x71,0x45,0x12,0x57,0x9, 0x2d,0x30,0xe, 0x34, +0x7f,0x5, 0x7e,0x50,0x8, 0xb, 0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, +0x1b,0x6a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b, +0x50,0x78,0xe2,0x22,0xca,0x79,0x7f,0x60,0x7c,0xf5,0x7c,0xe6,0x12,0xcd,0xeb,0x7d, +0xb3,0x7c,0xbe,0x7c,0x7f,0x12,0xcd,0xeb,0x2d,0x3b,0x12,0x5f,0x9a,0x7d,0xa3,0x7e, +0x25,0x43,0x7d,0x12,0x9d,0x1a,0xbe,0x14,0x0, 0x0, 0x8, 0x6, 0x7d,0x32,0x9d,0x3a, +0x80,0x4, 0x6d,0x33,0x9d,0x31,0x7d,0x12,0x1a,0x2, 0x1a,0x0, 0x9f,0x6, 0xbe,0x14, +0x0, 0x0, 0x8, 0x6, 0x7d,0xd, 0x9d,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0x7e,0x14, +0x0, 0x3, 0xad,0x13,0xbd,0x12,0x58,0xf, 0xbe,0x24,0x0, 0x64,0x8, 0x9, 0xbe,0x34, +0x0, 0x46,0x8, 0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x79,0x22,0xca,0x79,0x7c,0x8b,0x7e, +0xb3,0x6e,0xb1,0xf5,0x48,0x7e,0x93,0x6e,0xb2,0x7e,0x4, 0x80,0x1, 0x7c,0xf7,0x1a, +0x18,0x1b,0x14,0x7c,0xe3,0xc1,0x8a,0x7a,0xe1,0x46,0xbe,0xe0,0x0, 0x58,0xc, 0x1a, +0x5e,0x1a,0x18,0x9d,0x15,0x1a,0x58,0x2d,0x51,0xf5,0x46,0xe5,0x48,0xbc,0xbe,0x18, +0xc, 0x1a,0x58,0x1a,0x1e,0x9d,0x15,0x1a,0x58,0x9d,0x51,0xf5,0x46,0x1a,0x5f,0x1b, +0x54,0xf5,0x45,0x80,0x47,0x85,0x45,0x47,0xe5,0x45,0xbe,0xb0,0x0, 0x58,0xe, 0xe5, +0x45,0x1a,0x5b,0x1a,0x1f,0x9d,0x15,0x1a,0x5f,0x2d,0x51,0xf5,0x47,0xbe,0x91,0x45, +0x18,0xe, 0x1a,0x3f,0xe5,0x45,0x1a,0x1b,0x9d,0x13,0x1a,0x5f,0x9d,0x51,0xf5,0x47, +0xbe,0x81,0x46,0x78,0x5, 0xbe,0xf1,0x47,0x68,0x10,0xe5,0x46,0x7e,0x71,0x47,0x12, +0x57,0x9, 0x7d,0xf3,0xbd,0xf0,0x8, 0x2, 0x7d,0xf, 0x5, 0x45,0x1a,0xef,0xb, 0xe4, +0xe5,0x45,0x1a,0x1b,0xbd,0x1e,0x8, 0xad,0xb, 0xe0,0x1a,0x58,0xb, 0x54,0x1a,0x1e, +0xbd,0x15,0x18,0x2, 0xc1,0x7, 0x7d,0x30,0xda,0x79,0x22,0xca,0x3b,0x7e,0xa0,0x64, +0x6c,0x77,0x80,0x67,0xa, 0x27,0xb, 0x24,0x7c,0x65,0x80,0x55,0x7e,0xf0,0x2, 0xac, +0xf6,0x9, 0xb7,0x6b,0x54,0xa, 0xb, 0x7e,0xd0,0x2, 0xac,0xd7,0x9, 0xb6,0x6b,0x54, +0xa, 0x2b,0x12,0xcf,0x1f,0x8, 0x4, 0x9d,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0x9, +0x47,0x6b,0x55,0xa, 0x44,0x9, 0x46,0x6b,0x55,0xa, 0x14,0x7d,0x1, 0x9d,0x4, 0xbe, +0x4, 0x0, 0x0, 0x8, 0x4, 0x9d,0x14,0x80,0x4, 0x6d,0x11,0x9d,0x10,0x7c,0x43,0xbc, +0x45,0x50,0x4, 0x7c,0x35,0x80,0x2, 0x7c,0x34,0xbc,0xa3,0x28,0x2, 0x7c,0xa3,0xb, +0x60,0x7e,0x23,0x6c,0xde,0xbc,0x26,0x38,0xa3,0xb, 0x70,0x7e,0xb3,0x6c,0xde,0xbc, +0xb7,0x38,0x91,0xbe,0xa0,0x64,0x78,0x2, 0x6c,0xaa,0x7c,0xba,0xda,0x3b,0x22,0x7d, +0x12,0x9d,0x10,0xbe,0x14,0x0, 0x0, 0x22,0xca,0x3b,0x7c,0x45,0x7c,0x57,0x7c,0x7b, +0x75,0x43,0x0, 0x7e,0xe0,0xff,0xc2,0x5, 0x7e,0xf4,0x7f,0xff,0xbc,0x67,0x28,0x4, +0x7c,0xd7,0x80,0x2, 0x7c,0xd6,0xbc,0x67,0x50,0x4, 0x7c,0xa7,0x80,0x2, 0x7c,0xa6, +0xbc,0x45,0x28,0x4, 0x7c,0xc5,0x80,0x2, 0x7c,0xc4,0xbc,0x45,0x50,0x4, 0x7c,0xb5, +0x80,0x2, 0x7c,0xb4,0xf5,0x44,0x7a,0xd1,0x45,0x7a,0xc1,0x46,0x7a,0xa1,0x47,0x85, +0x44,0x48,0xd2,0x5, 0xbe,0x51,0x46,0x78,0xa, 0xe5,0x45,0xbc,0xb7,0x50,0xc, 0xc2, +0x5, 0x80,0x8, 0xe5,0x45,0xbc,0xb6,0x50,0x2, 0xc2,0x5, 0x30,0x5, 0x3, 0x2, 0xd0, +0x8d,0x7c,0xda,0x2, 0xd0,0x8d,0x7e,0x8, 0x62,0xb8,0x7e,0x34,0x0, 0xc, 0x74,0xff, +0x12,0x24,0x34,0x30,0x5, 0x6c,0x12,0xd0,0xdc,0x18,0x3, 0x12,0xd1,0xe, 0xa, 0xd, +0xb, 0x4, 0xe5,0x47,0xa, 0x1b,0xbd,0x1, 0x18,0x7, 0xa, 0x5d,0xb, 0x54,0x12,0xd0, +0xd3,0xbd,0x1, 0x18,0xb, 0xbd,0x23,0x18,0x7, 0xa, 0x3d,0xb, 0x34,0x12,0xd1,0x1, +0x7e,0xe4,0x80,0x1, 0x6c,0xff,0x12,0xd0,0xf4,0x68,0xe, 0x12,0xd0,0xc3,0x68,0x9, +0x12,0xd1,0x1b,0x8, 0x4, 0x7d,0xe3,0x7c,0xef,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xe6, +0x12,0xd0,0xe7,0x78,0x8, 0x12,0xd0,0xcb,0x78,0x3, 0x2, 0xd0,0x9c,0xe5,0x48,0xbe, +0xb1,0x46,0x78,0x7, 0x12,0xd0,0xcb,0x78,0x2, 0x1, 0x9c,0xbe,0xe0,0xff,0x68,0x7d, +0x80,0x65,0x12,0xd0,0xdc,0x18,0x3, 0x12,0xd1,0xe, 0xa, 0xd, 0x1b,0x4, 0xe5,0x45, +0xa, 0x1b,0xbd,0x1, 0x48,0x7, 0xa, 0x5d,0x1b,0x54,0x12,0xd0,0xd3,0xbd,0x1, 0x48, +0xb, 0xbd,0x23,0x18,0x7, 0xa, 0x3d,0x1b,0x34,0x12,0xd1,0x1, 0x7e,0xe4,0x80,0x1, +0x6c,0xff,0x12,0xd0,0xf4,0x68,0xe, 0x12,0xd0,0xc3,0x68,0x9, 0x12,0xd1,0x1b,0x8, +0x4, 0x7d,0xe3,0x7c,0xef,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xe6,0x12,0xd0,0xe7,0x78, +0x5, 0x12,0xd0,0xbb,0x68,0x36,0xe5,0x48,0xbe,0xb1,0x46,0x78,0x5, 0x12,0xd0,0xbb, +0x68,0x2a,0xbe,0xe0,0xff,0x68,0x16,0x7e,0x71,0x43,0x74,0x2, 0xac,0x7b,0x59,0xe3, +0x75,0x6a,0x9, 0xd4,0x62,0xb8,0x7c,0xca,0x5, 0x43,0x7e,0xe0,0xff,0xe5,0x44,0xa, +0x2b,0xb, 0x24,0xa, 0x3c,0xbd,0x32,0x68,0x3, 0x2, 0xcf,0x96,0x6c,0xff,0x80,0x10, +0x74,0x2, 0xac,0xbf,0x49,0xe5,0x75,0x6a,0xbd,0xef,0x58,0x2, 0x7d,0xfe,0xb, 0xf0, +0xe5,0x43,0xbc,0xbf,0x38,0xea,0x7d,0x3f,0xda,0x3b,0x22,0x9, 0xb4,0x62,0xb8,0xbe, +0xb1,0x45,0x22,0x9, 0x72,0x62,0xb9,0xbe,0x70,0xff,0x22,0x9, 0xb4,0x62,0xb8,0xbe, +0xb1,0x47,0x22,0x7a,0xb3,0x62,0xbc,0x7a,0xc3,0x62,0xbd,0x22,0xa, 0x2c,0xb, 0x24, +0xe5,0x48,0xa, 0x3b,0xbd,0x23,0x22,0x7e,0x90,0x4, 0xac,0x9e,0x9, 0xa4,0x62,0xb9, +0xbe,0xa1,0x48,0x22,0x7e,0x50,0x4, 0xac,0x5f,0x9, 0xb2,0x62,0xb8,0xbe,0xb0,0xff, +0x22,0x7a,0x73,0x62,0xc0,0xa, 0x3c,0xb, 0x34,0x7a,0x73,0x62,0xc1,0x22,0x7a,0xd3, +0x62,0xb8,0xa, 0x1c,0xb, 0x14,0x7a,0x33,0x62,0xb9,0x22,0x12,0x57,0x9, 0x74,0x4, +0xac,0xbf,0x59,0x35,0x62,0xba,0xbd,0x3e,0x22,0xca,0x3b,0x75,0x28,0xff,0x6c,0xff, +0x7e,0xc0,0xff,0x6c,0xee,0x6c,0x99,0x6c,0x88,0x7e,0xf4,0x7f,0xff,0x6c,0xdd,0x80, +0x68,0x7e,0x70,0x2, 0xac,0x7d,0x9, 0xb3,0x6b,0x54,0xf5,0x26,0x9, 0x73,0x6b,0x55, +0x7a,0x71,0x27,0x12,0x57,0x9, 0x7d,0x3, 0xbd,0xf, 0x58,0x2, 0x7d,0xf0,0xe5,0x26, +0xbe,0xb1,0x28,0x50,0x3, 0x85,0x26,0x28,0xe5,0x26,0xbc,0xbf,0x28,0x3, 0x7e,0xf1, +0x26,0xe5,0x27,0xbc,0xbc,0x50,0x3, 0x7e,0xc1,0x27,0xe5,0x27,0xbc,0xbe,0x28,0x3, +0x7e,0xe1,0x27,0xe5,0x28,0xa, 0x5b,0xa, 0x1f,0x9d,0x15,0xbe,0x14,0x0, 0x7, 0x18, +0xc, 0xa, 0x5c,0xa, 0x1e,0x9d,0x15,0xbe,0x14,0x0, 0x7, 0x8, 0xa, 0x7e,0x14,0x1, +0xf4,0x7a,0x17,0x75,0x88,0x41,0x4a,0xb, 0xd0,0x7e,0x73,0x6c,0xde,0xbc,0x7d,0x38, +0x90,0x7d,0x3f,0x3e,0x34,0x12,0x97,0x87,0x7d,0x3, 0x7c,0xdc,0x80,0x1c,0x7e,0xc1, +0x28,0x80,0x11,0x7c,0xbc,0x7c,0x7d,0x12,0x57,0x9, 0xbd,0x30,0x8, 0x2, 0xb, 0x90, +0xb, 0x80,0xb, 0xc0,0xbc,0xfc,0x50,0xeb,0xb, 0xd0,0xbc,0xed,0x50,0xe0,0x7e,0x73, +0x6e,0x7d,0xbe,0x70,0x3, 0x40,0xd, 0x12,0xd2,0x4d,0x50,0x28,0xb, 0x14,0x7a,0x17, +0x75,0x88,0x80,0x20,0xbe,0x70,0x1, 0x38,0x1b,0x7e,0x17,0x75,0x88,0xbe,0x14,0x0, +0x2, 0x28,0x6, 0x1b,0x15,0x7a,0x17,0x75,0x88,0x12,0xd2,0x56,0x50,0x6, 0xb, 0x14, +0x7a,0x17,0x75,0xa, 0x7e,0x73,0x6c,0xde,0xbe,0x70,0x1, 0x40,0x2d,0x7e,0x30,0x2, +0xac,0x38,0x74,0x3, 0xac,0xb9,0xbd,0x51,0x8, 0xf, 0x6d,0x11,0x7a,0x17,0x75,0x88, +0x12,0xd2,0x56,0x50,0x15,0xb, 0x14,0x80,0xd, 0x12,0xd2,0x4d,0x50,0x6, 0xb, 0x15, +0x7a,0x17,0x75,0x88,0x6d,0x11,0x7a,0x17,0x75,0xa, 0xda,0x3b,0x22,0x7e,0x17,0x75, +0x88,0xbe,0x14,0x3, 0xe8,0x22,0x7e,0x17,0x75,0xa, 0xbe,0x14,0x1, 0xf4,0x22,0xa9, +0x31,0xcd,0xf, 0xa9,0x31,0xe5,0xb, 0xa9,0xd5,0xea,0xa9,0xc5,0xea,0xc2,0x95,0xa9, +0xc1,0xcd,0xa9,0x30,0xcd,0x7, 0xa9,0x30,0xe5,0x3, 0xa9,0xc0,0xcd,0xa9,0x32,0xcd, +0x7, 0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x35,0xcd,0x7, 0xa9,0x35,0xe5,0x3, +0xa9,0xc5,0xcd,0xa9,0x36,0xcd,0x7, 0xa9,0x36,0xe5,0x3, 0xa9,0xc6,0xcd,0xa9,0x37, +0xcd,0x7, 0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0x32,0x7e,0x14,0xf7,0xf0,0x7e,0x4, +0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50,0x79,0x30,0x0, 0x2, 0x1b,0xa, +0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79,0x30,0x0, 0x6, 0x79,0x20,0x0, +0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79,0x30,0x0, 0xa, 0x79,0x20,0x0, +0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79,0x30,0x0, 0xe, 0x79,0x20,0x0, +0xc, 0x22,0x7e,0xb3,0x77,0xe6,0xbe,0xb0,0xc8,0x50,0x5, 0x4, 0x7a,0xb3,0x77,0xe6, +0x22,0x7c,0xab,0x80,0xf, 0x7e,0x70,0x2, 0x80,0x1, 0x0, 0x7c,0x67,0x1b,0x70,0xa5, +0xbe,0x0, 0xf7,0x0, 0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xe9,0x22,0xa2,0xac,0x92, +0x2, 0xc2,0xac,0x7e,0xf, 0x78,0x39,0x30,0x1, 0xa, 0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0xc, 0x80,0x8, 0xb, 0x16,0xb, 0xa, 0x30,0x5e,0x70,0xf3,0x1b,0xa, 0x30,0xa2, +0x2, 0x92,0xac,0x22,0xa, 0x7, 0xa, 0x1b,0x2d,0x10,0x12,0x4f,0xef,0x6d,0x0, 0x7e, +0x18,0xbb,0x80,0x2, 0x23,0x10,0x6c,0xaa,0x7e,0x30,0x2c,0xac,0x3a,0x12,0x33,0xde, +0x7e,0x34,0x0, 0x2c,0xe4,0x12,0x24,0x34,0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe9,0x22, +0x7e,0xb3,0x76,0xff,0xb4,0x1, 0x37,0x7e,0xa3,0x76,0xfd,0x7a,0xa3,0x76,0xfe,0x7e, +0xb3,0x77,0x5, 0x4, 0x7a,0xb3,0x77,0x5, 0x7e,0xb3,0x77,0x4, 0x4, 0x7a,0xb3,0x77, +0x4, 0x12,0xd6,0xc9,0xbe,0xb3,0x77,0x4, 0x38,0x14,0xe4,0x7a,0xb3,0x77,0x4, 0x7c, +0xba,0x4, 0x7a,0xb3,0x76,0xfd,0x12,0xd3,0xb6,0x28,0x3, 0x12,0xd3,0xaf,0x22,0x74, +0x3, 0x7a,0xb3,0x76,0xff,0x22,0x7e,0x73,0x76,0xfc,0xbe,0x73,0x76,0xfd,0x22,0x12, +0xd3,0xb6,0x38,0x2, 0xe4,0x22,0x7e,0xa3,0x76,0xfd,0x74,0x7, 0xa4,0x49,0x55,0x77, +0x8, 0x12,0xd3,0xd7,0xe4,0x33,0x22,0x7c,0x3b,0xd2,0x4, 0x12,0xd6,0xf0,0x12,0xd6, +0xd3,0x1b,0x30,0x68,0x1d,0x1b,0x30,0x68,0x23,0x1b,0x30,0x68,0x29,0x1b,0x30,0x68, +0x2f,0xb, 0x32,0x78,0x73,0x12,0x3f,0x9b,0x7e,0x1f,0x76,0xe0,0x7e,0xf, 0x76,0xdc, +0x80,0x52,0x7e,0x1f,0x76,0xe8,0x7e,0xf, 0x76,0xe4,0x80,0x48,0x7e,0x1f,0x76,0xf0, +0x7e,0xf, 0x76,0xec,0x80,0x3e,0x7e,0x1f,0x76,0xf8,0x7e,0xf, 0x76,0xf4,0x80,0x34, +0x7e,0x34,0x0, 0x8, 0xca,0x39,0x7e,0x71,0x1e,0x74,0x8, 0xac,0x7b,0x2e,0x34,0x76, +0xdc,0x6d,0x22,0x7e,0x8, 0x67,0x1e,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, 0x1, +0x7a,0x37,0x67,0x1e,0x7e,0x73,0x78,0x34,0x7a,0x73,0x67,0x20,0x7e,0x1f,0x67,0x22, +0x7e,0xf, 0x67,0x1e,0x7a,0x1d,0x39,0x7a,0xd, 0x35,0x12,0x2, 0x3d,0x74,0x1, 0x7a, +0xb3,0x76,0xff,0x12,0xd, 0xbd,0x80,0x2, 0xc2,0x4, 0xa2,0x4, 0x22,0x7e,0xb3,0x76, +0xff,0xb4,0x1, 0x2, 0x80,0x2, 0xa1,0xe, 0x7e,0x73,0x76,0xfc,0xbe,0x73,0x76,0xfe, +0x28,0x74,0x7e,0x63,0x76,0xfe,0x7e,0x70,0x7, 0xac,0x67,0x49,0x53,0x77,0x8, 0x7c, +0xab,0x7e,0x43,0x77,0x5, 0x7e,0x50,0x2, 0xac,0x45,0x2d,0x32,0x49,0x33,0x77,0xa, +0x7a,0x35,0x1c,0x4d,0x33,0x68,0x4f,0xd2,0x2d,0x1b,0xa0,0x68,0x10,0x1b,0xa0,0x68, +0xc, 0x1b,0xa0,0x68,0x8, 0x1b,0xa0,0x68,0x4, 0xb, 0xa2,0x78,0x39,0x12,0xd5,0xf, +0x30,0x12,0x4, 0x74,0x2, 0x80,0x2, 0x74,0x1, 0x7e,0xa3,0x77,0x5, 0xa, 0x3a,0x19, +0xb3,0x77,0x0, 0x7e,0xb3,0x77,0x5, 0x70,0xe, 0x7e,0x73,0x77,0x7, 0xbe,0x70,0x1, +0x28,0x5, 0x12,0xb, 0xe5,0x80,0xf, 0x7e,0xf, 0x78,0x39,0xb, 0x16,0xb, 0xa, 0x30, +0x5e,0x60,0xef,0x1b,0xa, 0x30,0x12,0xd3,0xb6,0x38,0x13,0x74,0x2, 0x7a,0xb3,0x76, +0xff,0x12,0x3c,0xf1,0x12,0x37,0xe1,0xe5,0x1e,0x70,0x3, 0x2, 0x3f,0x52,0x22,0xca, +0x3b,0x7e,0x95,0x1c,0x6d,0x88,0x7e,0xb3,0x77,0x5, 0xf5,0x4b,0x7e,0xb3,0x6e,0xc1, +0x60,0xa, 0x7e,0xc7,0x6e,0xb5,0x7e,0xd7,0x6e,0xb7,0x80,0x8, 0x7e,0xd7,0x6e,0xb5, +0x7e,0xc7,0x6e,0xb7,0x20,0x2d,0x2, 0xc1,0x80,0x7e,0xe7,0x73,0x21,0x7e,0xf4,0x0, +0xa, 0xa9,0xd7,0xea,0x7e,0x5f,0x1, 0x78,0x69,0x55,0x2, 0x64,0x69,0x75,0x0, 0xc, +0x4d,0x75,0x12,0xd6,0xa0,0x59,0x75,0x0, 0xe4,0x69,0x55,0x2, 0x5c,0x7e,0x5f,0x1, +0x78,0x69,0xb5,0x0, 0x4, 0x4d,0xb5,0x12,0xd6,0xa0,0x59,0xb5,0x0, 0xe6,0x7e,0x5f, +0x1, 0x78,0x69,0xb5,0x2, 0x5a,0x7e,0x3f,0x1, 0x78,0x69,0x53,0x0, 0x2, 0xbd,0x5b, +0x28,0xc, 0x7e,0x5f,0x1, 0x78,0x69,0x55,0x0, 0x2, 0x7d,0x45,0x80,0x8, 0x7e,0x2f, +0x1, 0x78,0x69,0x42,0x2, 0x5a,0x12,0xd6,0xa0,0x59,0x45,0x0, 0xe8,0x7e,0x2f,0x1, +0x78,0xb, 0x2a,0x50,0x12,0xd6,0xa7,0x19,0xa4,0x0, 0xea,0x7e,0x2f,0x1, 0x78,0x69, +0x52,0x2, 0x58,0x12,0xd6,0xa7,0x19,0xa4,0x0, 0xeb,0x6d,0xbb,0x7d,0x4b,0xbe,0x44, +0x0, 0x1, 0x78,0x4, 0xb, 0xf4,0x80,0x23,0x7c,0xb9,0x7e,0xa4,0x0, 0x1, 0x60,0x5, +0x3e,0xa4,0x14,0x78,0xfb,0x7e,0xb3,0x6e,0xb3,0xa, 0x5b,0x5d,0x5a,0x68,0x5, 0x12, +0xd6,0x83,0x80,0x7, 0x6d,0x55,0x12,0xd6,0x92,0xb, 0xf4,0xb, 0x44,0xbe,0x44,0x0, +0x3, 0x78,0xcb,0x7e,0xb3,0x6e,0xc1,0x60,0x5, 0x7a,0xc5,0x49,0x80,0x3, 0x7a,0xb5, +0x49,0x12,0xd6,0xb5,0x7d,0x4b,0x80,0xc, 0xb, 0xa, 0x50,0x1b,0x1a,0x50,0xb, 0x15, +0xb, 0x35,0xb, 0x44,0xbd,0xd4,0x38,0xf0,0x7d,0xfd,0x2e,0xf5,0x49,0x7a,0xf5,0x49, +0x7e,0xf4,0x1, 0x36,0x7d,0x4b,0xbe,0x44,0x0, 0x1, 0x78,0x4, 0xb, 0xf4,0x80,0x23, +0x7c,0xb9,0x7e,0xa4,0x0, 0x1, 0x60,0x5, 0x3e,0xa4,0x14,0x78,0xfb,0x7e,0xb3,0x6e, +0xb4,0xa, 0x5b,0x5d,0x5a,0x68,0x5, 0x12,0xd6,0x83,0x80,0x7, 0x6d,0x55,0x12,0xd6, +0x92,0xb, 0xf4,0xb, 0x44,0xbe,0x44,0x0, 0x3, 0x78,0xcb,0x7e,0xb3,0x6e,0xc1,0x60, +0x3, 0x7a,0xb5,0x49,0x12,0xd6,0xb5,0x7d,0x4b,0x80,0xc, 0xb, 0xa, 0x50,0x1b,0x1a, +0x50,0xb, 0x35,0xb, 0x15,0xb, 0x44,0xbd,0xc4,0x38,0xf0,0xa9,0xc7,0xea,0xc2,0x2d, +0xda,0x3b,0x22,0x7d,0x5f,0xb, 0xf4,0x3e,0x54,0x7e,0x3f,0x1, 0x78,0x2d,0x75,0xb, +0x3a,0x50,0x7d,0xae,0xb, 0xe4,0x3e,0xa4,0x7f,0x34,0x2d,0x7a,0x1b,0x3a,0x50,0x22, +0x7e,0xa1,0x4b,0x74,0x8, 0xa4,0x22,0x5e,0x54,0x0, 0x7f,0x7c,0xab,0x7e,0x91,0x4b, +0x74,0x8, 0xac,0x9b,0x22,0x7d,0xaf,0x3e,0xa4,0x7e,0xf, 0x1, 0x78,0x2d,0x1a,0x7e, +0xa5,0x49,0x3e,0xa4,0x7f,0x14,0x2d,0x3a,0x22,0x7e,0x70,0x7, 0xac,0x7a,0x9, 0xb3, +0x77,0xe, 0x22,0x6c,0xaa,0x7e,0xb3,0x77,0xd8,0xa, 0x3b,0x1e,0x34,0xb, 0x34,0x7e, +0x50,0x8, 0xac,0x5a,0x19,0x72,0x76,0xe1,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xe6,0x22, +0xe5,0x1e,0x70,0x21,0x7e,0x37,0x77,0xde,0x4d,0x33,0x78,0xf8,0x12,0x8b,0xd2,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x77,0xde,0xbe,0x34,0x0, 0x21,0x28,0x8, 0x7e,0x34,0x0, +0x21,0x7a,0x37,0x77,0xde,0x22,0x30,0x24,0x24,0xc2,0x24,0x7e,0x73,0x76,0x7, 0x7a, +0x73,0x76,0x2f,0x74,0xff,0x7a,0xb3,0x76,0x7, 0x7e,0xa3,0x76,0x2f,0x4c,0xaa,0x78, +0x5, 0x12,0xd7,0xcc,0x80,0x7, 0xbe,0xa0,0x1, 0x78,0x2, 0xd2,0x1b,0x30,0x1b,0x3, +0x12,0xd8,0x4, 0x7e,0xb3,0x76,0x2f,0x14,0x68,0x5b,0x1b,0xb1,0x68,0x5f,0x24,0x3, +0x78,0x6e,0x12,0xd7,0xc4,0x38,0x7, 0x7e,0xb3,0x78,0x20,0xb4,0x1, 0x16,0x12,0x47, +0xe6,0x7e,0xb3,0x76,0x10,0x30,0xe0,0x5b,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x54,0x30, +0x13,0x51,0x80,0x2e,0x7e,0xb3,0x76,0x10,0x30,0xe0,0x48,0x7e,0x37,0x29,0xfd,0x7e, +0x44,0x3, 0xe8,0x7d,0x53,0x8d,0x54,0x7e,0x53,0x76,0x11,0xa, 0x15,0xbd,0x51,0x50, +0x11,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x2b,0x7e,0x24,0x0, 0xc8,0x8d,0x32,0xbd,0x31, +0x40,0x21,0x2, 0xd8,0x4, 0x12,0xd7,0xc4,0x28,0x19,0x2, 0xd7,0xe7,0x7e,0x34,0x21, +0x59,0x12,0x29,0xdb,0x12,0x2c,0x73,0x12,0x4d,0x3a,0x12,0x2f,0x87,0x2, 0xd7,0xcc, +0x12,0xa7,0xc7,0x22,0x7e,0x73,0x6e,0x7c,0xbe,0x70,0x0, 0x22,0xe4,0x7a,0xb3,0x76, +0x2f,0xd2,0x14,0x12,0x47,0xe6,0x2, 0xd7,0xd9,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x1, +0x68,0x4, 0xd2,0x1d,0xc2,0x1a,0x22,0x7e,0xb3,0x76,0x5a,0x60,0x5, 0x20,0x13,0x5, +0x80,0x0, 0x2, 0xd7,0xcc,0x22,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x1, 0x68,0x4, 0xd2, +0x1a,0xc2,0x1d,0x22,0xe5,0x1e,0xb4,0x1, 0xc, 0x7e,0xb3,0x25,0xaf,0x60,0x6, 0xe4, +0x7a,0xb3,0x76,0x2f,0x22,0xc2,0x1b,0x12,0xa7,0xc7,0x12,0x47,0xe6,0xe4,0x7a,0xb3, +0x29,0xff,0x7a,0xb3,0x29,0xfc,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x2, 0x68,0xa, 0x7e, +0xb3,0x73,0x20,0x44,0x8, 0x7a,0xb3,0x73,0x20,0x22,0x30,0x1c,0x8, 0xe5,0x1e,0xb4, +0x1, 0x3, 0x2, 0x37,0x94,0x22,0x7c,0xab,0x7e,0x8, 0x0, 0x86,0x7e,0x70,0xa, 0xac, +0x7a,0x9, 0xb3,0x29,0x8b,0x12,0xc, 0x3e,0x7e,0x8, 0x0, 0xc2,0x74,0xa, 0xa4,0x9, +0xb5,0x29,0x8b,0x12,0xc, 0x3e,0x7e,0x34,0x0, 0xd, 0x7e,0x8, 0x0, 0x86,0x7e,0x24, +0x0, 0x1, 0x2, 0xc, 0xcc,0x7c,0xab,0x74,0x27,0xa4,0x49,0x25,0x28,0xed,0xb, 0x24, +0x7e,0x37,0x76,0xd6,0xad,0x32,0x7e,0x8, 0x0, 0x82,0x12,0xd8,0x90,0x2, 0xc, 0xcc, +0x6d,0x22,0x12,0xd, 0x3e,0x7e,0x8, 0x0, 0xbe,0x6d,0x22,0x12,0xd, 0x3e,0x7e,0x34, +0x0, 0xb, 0x7e,0x8, 0x0, 0x82,0x7e,0x24,0x0, 0x2, 0x22,0x7c,0xab,0x6d,0x33,0xbe, +0xa0,0x4, 0x50,0x27,0x6c,0x55,0x80,0x16,0x7e,0x10,0x2, 0xac,0x15,0x7e,0x30,0x27, +0xac,0x3a,0x2d,0x10,0x49,0x11,0x28,0xed,0xb, 0x14,0x2d,0x31,0xb, 0x50,0x7e,0x30, +0x27,0xac,0x3a,0x9, 0x41,0x28,0xe8,0xbc,0x45,0x50,0xdd,0x4d,0x33,0x78,0x2, 0xb, +0x34,0x22,0x7c,0xab,0x7e,0x73,0x73,0x25,0xc2,0x2, 0x6d,0x22,0x7d,0x42,0x80,0x13, +0xa, 0xa, 0x12,0x41,0x5f,0x2d,0x14,0x9, 0xb1,0x4e,0xa8,0x70,0x4, 0xd2,0x2, 0x80, +0xa, 0xb, 0x44,0x7e,0x17,0x73,0x21,0xbd,0x14,0x38,0xe5,0x7d,0x42,0x7c,0xb7,0x54, +0x1, 0xb4,0x1, 0x17,0xa, 0xa, 0x12,0x41,0x5f,0x7e,0x27,0x73,0x21,0x2d,0x24,0x2d, +0x21,0x9, 0xb2,0x4e,0xa8,0x70,0x4, 0xd2,0x2, 0x80,0xa, 0x1e,0x70,0xb, 0x44,0xbe, +0x44,0x0, 0x4, 0x40,0xd8,0x30,0x2, 0x10,0x7e,0xb3,0x78,0x33,0xbe,0xb0,0x0, 0x28, +0xd, 0x14,0x7a,0xb3,0x78,0x33,0xc3,0x22,0x74,0x5, 0x7a,0xb3,0x78,0x33,0xd3,0x22, +0xca,0x3b,0x7c,0xcb,0x7e,0x8, 0x62,0xb8,0x12,0xda,0x40,0x7e,0x8, 0x62,0xc4,0x7e, +0x34,0x0, 0x5, 0x12,0x24,0x34,0x12,0xda,0x48,0x7e,0xb7,0x73,0x21,0x7e,0x97,0x6c, +0xfb,0x7d,0xa9,0x3e,0xa4,0x3e,0xa4,0x4c,0xcc,0x78,0x6c,0x7a,0xd3,0x62,0xb9,0x7a, +0xe3,0x62,0xb8,0x7e,0x84,0x8, 0xc, 0x7a,0x87,0x62,0xbc,0x7e,0x1f,0x24,0x64,0x7d, +0x83,0x7a,0x87,0x62,0xbe,0x7e,0x1f,0x24,0x64,0x7d,0x83,0x7a,0x87,0x62,0xc0,0x7d, +0x39,0x7c,0xb7,0xf5,0x26,0x7e,0x8, 0x62,0xb8,0x7e,0x18,0x62,0xc4,0x7d,0x59,0x12, +0x0, 0x46,0x6c,0xff,0x7d,0x3b,0x3e,0x34,0x49,0x83,0x8, 0xc, 0xbd,0xa8,0x58,0x10, +0x7e,0xf, 0x24,0x64,0x2d,0x13,0xb, 0xa, 0x20,0x2d,0x2a,0x1b,0xa, 0x20,0x80,0x10, +0x6d,0x22,0x9d,0x2a,0xbd,0x28,0x8, 0x8, 0x12,0xda,0x36,0x9d,0x3a,0x1b,0xa, 0x30, +0x12,0xda,0x2e,0x78,0xcf,0x80,0x44,0xbe,0xc0,0x1, 0x78,0x3f,0x6c,0xff,0x80,0x24, +0x6c,0x77,0x80,0x1a,0x7c,0xbf,0xac,0xbd,0xa, 0x87,0x2d,0x85,0x3e,0x84,0x7e,0xf, +0x24,0x64,0x2d,0x18,0xb, 0xa, 0x80,0x2d,0x89,0x1b,0xa, 0x80,0xb, 0x70,0xbc,0xd7, +0x38,0xe2,0xb, 0xf0,0xbc,0xef,0x38,0xd8,0x6c,0xff,0x7d,0x3b,0x3e,0x34,0x12,0xda, +0x36,0x2d,0x3a,0x1b,0xa, 0x30,0x12,0xda,0x2e,0x78,0xef,0xda,0x3b,0x22,0xb, 0xb4, +0xb, 0xf0,0xbe,0xf0,0x4, 0x22,0x7e,0xf, 0x24,0x64,0x2d,0x13,0xb, 0xa, 0x30,0x22, +0x7e,0x34,0x0, 0xc, 0xe4,0x2, 0x24,0x34,0x7e,0xe3,0x6e,0xaf,0x7e,0xd3,0x6e,0xb0, +0x22,0x7e,0x37,0x73,0x21,0x6c,0xaa,0x90,0x1c,0x49,0xe4,0x93,0x20,0xe0,0x4, 0x4c, +0xaa,0x68,0x25,0x1e,0xb0,0x1e,0xb0,0x20,0xe0,0x5, 0xbe,0xa0,0x1, 0x68,0x19,0x90, +0x1c,0x4a,0xe4,0x93,0x20,0xe0,0x5, 0xbe,0xa0,0x2, 0x68,0xc, 0x1e,0xb0,0x1e,0xb0, +0x20,0xe0,0x9, 0xbe,0xa0,0x3, 0x78,0x4, 0xb, 0x34,0x80,0x25,0x7d,0x23,0x3e,0x24, +0x49,0x42,0x8, 0xc, 0x12,0xda,0xb9,0x2d,0x24,0x1b,0xa, 0x20,0x7d,0x23,0x3e,0x24, +0x12,0xda,0xb9,0xbe,0x24,0xf, 0xa0,0x50,0x6, 0x74,0x1f,0x7a,0xb3,0x73,0x1f,0xb, +0x34,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0x9f,0x22,0x7e,0xf, 0x24,0x64,0x2d,0x12,0xb, +0xa, 0x20,0x22,0xe4,0x7a,0xb3,0x6c,0xf3,0x12,0xda,0xdf,0xe4,0x12,0x0, 0x19,0x7e, +0xb3,0x25,0xae,0xb4,0x1, 0x8, 0x7e,0x73,0x6c,0xde,0x7a,0x73,0x6c,0xf2,0x22,0x6c, +0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x6b,0xcc,0xb, 0x30,0x90,0x21,0x52,0xe4, +0x93,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0xb, 0x24,0xa, 0x33,0xbd,0x32,0x48,0xe4,0x12, +0xdc,0x23,0x6d,0x33,0x7a,0x37,0x6c,0xe0,0x7a,0x37,0x6c,0xe2,0x7a,0x37,0x6c,0xe4, +0x7a,0x37,0x6c,0xe8,0x7e,0xd4,0x62,0xba,0x1e,0xd4,0x3e,0xd4,0x6d,0xcc,0x7e,0x1f, +0x24,0x68,0x7a,0x37,0x62,0xfa,0x7d,0x3d,0x7a,0x37,0x62,0xfe,0x7e,0x34,0x24,0xbc, +0x7a,0x37,0x62,0xfc,0x7e,0x73,0x6e,0xaf,0x7a,0x73,0x62,0xf7,0x7e,0x73,0x6e,0xb0, +0x7a,0x73,0x62,0xf6,0x7e,0x37,0x6e,0x8d,0x7a,0x37,0x63,0x0, 0x7e,0x37,0x6e,0x8f, +0x7a,0x37,0x63,0x2, 0x7e,0x37,0x6e,0x97,0x7a,0x37,0x63,0x4, 0x7e,0x37,0x6e,0x99, +0x7a,0x37,0x63,0x6, 0x12,0x5f,0x7c,0x1b,0x34,0x7a,0x73,0x62,0xf8,0x7e,0x73,0x78, +0x44,0x7a,0x73,0x62,0xf9,0x7e,0x8, 0x62,0xf6,0x7e,0x18,0x63,0x8, 0x12,0x3, 0x1d, +0x7e,0x73,0x63,0x8, 0x7a,0x73,0x6c,0xde,0x7e,0x73,0x63,0x9, 0x7a,0x73,0x6c,0xdf, +0x7e,0x37,0x63,0xa, 0x7a,0x37,0x6c,0xe0,0x7e,0x37,0x63,0xc, 0x7a,0x37,0x6c,0xe2, +0x7e,0x37,0x63,0x12,0x7a,0x37,0x6c,0xe4,0x7e,0x37,0x63,0x14,0x7d,0x23,0x7a,0x53, +0x6c,0xe6,0xa, 0x36,0x7a,0x73,0x6c,0xe7,0x7e,0x37,0x63,0xe, 0x7a,0x37,0x6c,0xe8, +0x7e,0x37,0x63,0x10,0x7d,0x23,0x7a,0x53,0x6c,0xea,0xa, 0x36,0x7a,0x73,0x6c,0xeb, +0x6c,0x33,0x80,0x1f,0xd2,0x2, 0x7c,0xb3,0x12,0x57,0x49,0x74,0x2, 0xac,0xb3,0x49, +0x45,0x24,0xbc,0xa, 0x38,0x7c,0x27,0x19,0x25,0x6b,0x54,0x7c,0x29,0x19,0x25,0x6b, +0x55,0xb, 0x30,0x7e,0x23,0x6c,0xde,0xbc,0x23,0x38,0xd9,0x6c,0x33,0x80,0x1b,0x74, +0x2, 0xac,0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25, +0x6b,0x90,0x7c,0x29,0x19,0x25,0x6b,0x91,0xb, 0x30,0x7e,0x23,0x6c,0xdf,0xbc,0x23, +0x38,0xdd,0x22,0xe4,0x7a,0xb3,0x6c,0xde,0x7a,0xb3,0x6c,0xdf,0x22,0x7d,0x23,0x12, +0x4c,0x18,0x7e,0x37,0x78,0x0, 0x7d,0x13,0x9e,0x17,0x77,0xfc,0xbe,0x14,0x0, 0x0, +0x8, 0x6, 0x9e,0x37,0x77,0xfc,0x80,0x4, 0x6d,0x33,0x9d,0x31,0xbd,0x32,0x38,0x21, +0x7e,0x37,0x78,0x2, 0x7d,0x13,0x9e,0x17,0x77,0xfe,0xbe,0x14,0x0, 0x0, 0x8, 0x6, +0x9e,0x37,0x77,0xfe,0x80,0x4, 0x6d,0x33,0x9d,0x31,0xbd,0x32,0x38,0x3, 0x74,0x1, +0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd,0x7e, +0xd3,0x6e,0x7c,0x7e,0xe3,0x6e,0x7d,0x7e,0xb3,0x77,0xfb,0x60,0x11,0x7e,0xc7,0x78, +0x4, 0x4d,0xcc,0x78,0x2, 0xa1,0x63,0xbe,0xd0,0x1, 0x28,0x2, 0xa1,0x63,0xbe,0xd0, +0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xa1,0x63,0x7e,0xe7,0x6d,0x6e,0x7e,0xf7, +0x6d,0x70,0x7d,0x3e,0x7d,0x2f,0x12,0x9f,0x38,0xbe,0xb0,0x1, 0x78,0x2, 0xa1,0x63, +0x7e,0xa3,0x77,0xfb,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23,0x14, +0x78,0x2, 0xa1,0x60,0xb, 0xb2,0x68,0x2, 0xa1,0x63,0xbe,0xd0,0x1, 0x68,0x2, 0xa1, +0x72,0x4c,0xee,0x68,0x2, 0xa1,0x72,0x74,0x1, 0x7a,0xb3,0x77,0xfb,0x12,0xdd,0x85, +0x80,0x61,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3,0x77, +0xfb,0x7e,0x34,0x22,0x43,0x80,0x50,0x74,0x4, 0x7a,0xb3,0x77,0xfb,0x7e,0x34,0x22, +0x47,0x80,0x44,0x12,0xdd,0x8e,0x90,0x22,0x36,0x12,0xdd,0x79,0x68,0x45,0x80,0x52, +0xbe,0xd0,0x1, 0x78,0x4d,0x4c,0xee,0x78,0x49,0x12,0xdd,0x8e,0x7e,0x34,0x22,0x3f, +0x12,0x29,0xdb,0x7e,0x14,0x22,0x43,0x12,0xdd,0x9b,0x9d,0xc3,0xbe,0xc7,0x78,0x4, +0x40,0x21,0x90,0x22,0x35,0x12,0xdd,0x79,0x68,0x19,0x12,0xdd,0x85,0x74,0x3, 0x7a, +0xb3,0x77,0xfb,0x7e,0x34,0x22,0x43,0x12,0x29,0xdb,0x7a,0x37,0x78,0x4, 0x80,0x12, +0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x77,0xfb,0x6d,0x33,0x7a,0x37,0x78,0x4, 0x7c,0xbf, +0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93,0xa, 0x3b,0x12,0xdc,0x2d, +0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x77,0xfc,0x7a,0xf7,0x77,0xfe,0x22,0x7a,0xe7, +0x78,0x0, 0x7a,0xf7,0x78,0x2, 0x22,0x7e,0x14,0x21,0xec,0x7e,0x4, 0x0, 0xff,0xb, +0xa, 0xc0,0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7, +0x54,0xf, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x78, +0x28,0xa, 0x47,0x5d,0x42,0x7e,0x73,0x76,0x5b,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12, +0xde,0x16,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x78,0x29,0xa, 0x45,0x5d, +0x43,0x7e,0x73,0x76,0x5c,0x80,0x1a,0x12,0xde,0x16,0x60,0x5, 0x3e,0x34,0x14,0x78, +0xfb,0xa, 0x2a,0x9, 0xb2,0x78,0x28,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x76, +0x5d,0xa, 0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e, +0xa3,0x27,0x72,0xbe,0xa0,0x64,0x50,0x1b,0x74,0x4, 0xa4,0x59,0x35,0x25,0xb9,0x7e, +0xa3,0x27,0x72,0x74,0x4, 0xa4,0x59,0x25,0x25,0xbb,0x7e,0xb3,0x27,0x72,0x4, 0x7a, +0xb3,0x27,0x72,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x27,0x4a,0x7e,0x34,0x0, 0x28, +0xe4,0x12,0x24,0x34,0x7e,0x8, 0x25,0xb9,0x7e,0x34,0x1, 0x90,0x12,0x24,0x34,0x7a, +0xb3,0x76,0x5d,0x7e,0x34,0x22,0x6d,0x12,0x29,0xdb,0x7a,0x37,0x25,0xb1,0x7a,0xe7, +0x27,0x4e,0x7a,0xf7,0x27,0x50,0x7a,0xe7,0x27,0x52,0x7a,0xe7,0x27,0x56,0x7a,0xe7, +0x27,0x5a,0x7a,0xe7,0x27,0x5e,0x7a,0xf7,0x27,0x54,0x7a,0xf7,0x27,0x58,0x7a,0xf7, +0x27,0x5c,0x7a,0xf7,0x27,0x60,0x7a,0xe7,0x25,0xb5,0x7a,0xf7,0x25,0xb7,0x7a,0xb3, +0x27,0x72,0x74,0x2, 0x7a,0xb3,0x27,0x49,0x22,0xca,0x3b,0xf5,0x2c,0x7f,0x31,0x7a, +0xd, 0x28,0x75,0x34,0x0, 0x75,0x35,0x0, 0x75,0x36,0x0, 0x7e,0x34,0x3, 0xe8,0x7a, +0x35,0x3f,0x75,0x32,0x3c,0x75,0x33,0x46,0x75,0x2d,0x0, 0x2, 0xe0,0xcb,0x12,0xe2, +0x6e,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2d,0x74,0x44,0xac,0x7b, +0x2e,0x34,0xe, 0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x64,0x52,0x12,0x24,0xf, 0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x64,0x48,0x7a,0x37,0x64,0x4a,0x7a,0x37,0x64,0x4c,0x7a, +0x37,0x64,0x4e,0x7a,0x37,0x64,0x50,0x7e,0x18,0x64,0x52,0x7a,0x1d,0x37,0x7e,0x18, +0x64,0x72,0x7a,0x1d,0x3b,0x75,0x2e,0x0, 0xe1,0xae,0xe5,0x2e,0xa, 0x5b,0x7e,0x1d, +0x28,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x26,0x7e,0xd, 0x37,0x2d,0x15,0x7e,0xb, 0x70, +0xa, 0xd7,0x7d,0xcd,0x9d,0xc2,0xbe,0xc4,0x0, 0x0, 0x8, 0x4, 0x9d,0xd2,0x80,0xa, +0xa, 0x26,0xa, 0x37,0x9d,0x32,0x6d,0xdd,0x9d,0xd3,0x7e,0xc7,0x64,0x4c,0xbd,0xcd, +0x58,0x4, 0x7a,0xd7,0x64,0x4c,0xe5,0x2e,0xa, 0xcb,0x7f,0x13,0x2d,0x3c,0x7e,0x1b, +0x70,0xa, 0x27,0xe5,0x2e,0xa, 0x3b,0x7e,0xd, 0x3b,0x2d,0x13,0x7e,0xb, 0x70,0xa, +0xc7,0x12,0x5f,0x87,0x8, 0x4, 0x9d,0xc2,0x80,0x4, 0x6d,0xcc,0x9d,0xc3,0x7e,0x37, +0x64,0x4e,0xbd,0x3c,0x58,0x4, 0x7a,0xc7,0x64,0x4e,0x7e,0x37,0x64,0x48,0x2d,0x3d, +0x7a,0x37,0x64,0x48,0x7e,0x37,0x64,0x4a,0x2d,0x3c,0x7a,0x37,0x64,0x4a,0x2d,0xcd, +0x7e,0x37,0x64,0x50,0xbd,0x3c,0x58,0x4, 0x7a,0xc7,0x64,0x50,0x5, 0x2e,0xe5,0x2c, +0xbe,0xb1,0x2e,0x28,0x2, 0xe1,0x1a,0xe5,0x2c,0xb4,0xa, 0x2f,0x7e,0x37,0x64,0x4c, +0xbe,0x34,0x0, 0x40,0x48,0xd, 0x7e,0x27,0x64,0x4e,0xbe,0x24,0x0, 0x40,0x48,0x3, +0x2, 0xe0,0xc9,0xbe,0x34,0x0, 0x60,0x8, 0x3, 0x2, 0xe0,0xc9,0x7e,0x37,0x64,0x4e, +0xbe,0x34,0x0, 0x60,0x8, 0x3, 0x2, 0xe0,0xc9,0x80,0x2a,0x7e,0x37,0x64,0x4c,0xbe, +0x34,0x0, 0x20,0x8, 0xc, 0x7e,0x27,0x64,0x4e,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x1, +0xc9,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x1, 0xc9,0x7e,0x37,0x64,0x4e,0xbe,0x34,0x0, +0x30,0x8, 0x2, 0x1, 0xc9,0x7e,0xa3,0x77,0x2e,0x74,0xc, 0xa4,0xbe,0x57,0x64,0x48, +0x58,0x2, 0x1, 0xc9,0x7e,0xa3,0x77,0x2f,0x74,0xc, 0xa4,0xbe,0x57,0x64,0x4a,0x58, +0x2, 0x1, 0xc9,0x7e,0xd, 0x37,0x7e,0x1d,0x28,0xe5,0x2c,0x12,0xe1,0x5, 0xf5,0x2f, +0x7e,0xd, 0x3b,0x7f,0x13,0xe5,0x2c,0x12,0xe1,0x5, 0xf5,0x30,0xe5,0x32,0xbe,0xb1, +0x2f,0x38,0x76,0xe5,0x32,0xbe,0xb1,0x30,0x38,0x6f,0xe5,0x30,0x7e,0x31,0x30,0xac, +0x3b,0x1a,0x2, 0x1a,0x0, 0xe5,0x2f,0x7e,0x71,0x2f,0xac,0x7b,0x1a,0x26,0x1a,0x24, +0x2f,0x10,0xe5,0x30,0xa, 0xfb,0x6d,0xee,0xe5,0x2f,0xa, 0x1b,0x6d,0x0, 0x2f,0x7, +0x12,0x22,0xbf,0x7c,0xb7,0xf5,0x31,0xe5,0x33,0xbe,0xb1,0x31,0x38,0x3b,0x7e,0x37, +0x64,0x4e,0x2e,0x37,0x64,0x4c,0x2e,0x37,0x64,0x50,0x7a,0x35,0x41,0xe5,0x31,0xa, +0x2b,0x7e,0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x41,0x7a,0x35,0x41,0x7e, +0x35,0x3f,0xbe,0x35,0x41,0x8, 0x12,0x7e,0x35,0x41,0x7a,0x35,0x3f,0x85,0x31,0x35, +0x7e,0xb3,0x64,0x94,0xf5,0x36,0x85,0x2d,0x34,0x5, 0x2d,0x12,0xe2,0x6e,0x28,0x3, +0x2, 0xde,0xce,0xe5,0x33,0xbe,0xb1,0x35,0x38,0x20,0xe5,0x36,0xbe,0xb0,0x0, 0x28, +0x19,0xe5,0x36,0xbe,0xb0,0xff,0x50,0x12,0xe5,0x34,0xa, 0x3b,0xb, 0x34,0x7a,0x73, +0x77,0x2b,0xe5,0x36,0x7a,0xb3,0x77,0x2d,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x77,0x2b, +0xe5,0x35,0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f, +0x51,0x7f,0x71,0x7a,0x1f,0x64,0x96,0x7a,0x1f,0x64,0x9a,0x7a,0x1f,0x64,0x9e,0xbe, +0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, 0x7e,0x54,0x2, 0x35,0x7a,0x55, +0x47,0x6c,0xee,0x80,0x66,0xa, 0x5e,0x7f,0x14,0x12,0xe2,0x66,0x7a,0x55,0x45,0xa, +0x5e,0x7f,0x16,0x12,0xe2,0x66,0x7a,0x55,0x43,0x7e,0x35,0x43,0x12,0x5f,0xa1,0x2f, +0x50,0x7e,0x65,0x45,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x2f,0x70,0x12,0x5f,0xa1,0x12, +0xe2,0x5c,0x7e,0x1f,0x64,0x96,0x2f,0x10,0x7a,0x1f,0x64,0x96,0x7d,0x16,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x45,0x12,0xe2,0x5c,0x7e,0x1f,0x64,0x9a,0x2f,0x10,0x7a,0x1f, +0x64,0x9a,0x7e,0x15,0x45,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x43,0x12,0xe2,0x5c,0x7e, +0x1f,0x64,0x9e,0x2f,0x10,0x7a,0x1f,0x64,0x9e,0xb, 0xe0,0xbc,0xfe,0x38,0x96,0xa, +0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x23,0x10,0x7f,0x51,0x7f,0x17,0x7f,0x6, +0x12,0x23,0x10,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1f,0x64,0x96,0x7d,0x19,0x12, +0x22,0xb4,0x7e,0x85,0x47,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, 0x12, +0x23,0x10,0x7a,0x1f,0x64,0x96,0x7e,0x1f,0x64,0x9a,0x7d,0x19,0x12,0x22,0xb4,0x7f, +0x6, 0x12,0x23,0x10,0x7a,0x1f,0x64,0x9a,0x7e,0x1f,0x64,0x9e,0x7d,0x19,0x12,0x22, +0xb4,0x7d,0x18,0x1a,0x2, 0x1a,0x0, 0x12,0x23,0x10,0x7a,0x1f,0x64,0x9e,0x7f,0x15, +0x7f,0x7, 0x12,0x22,0xa3,0x7e,0x6f,0x64,0x9e,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12, +0x22,0xa3,0x7e,0x5f,0x64,0x96,0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x22,0xa3,0x7e, +0x7f,0x64,0x9a,0x9f,0x71,0xbe,0x58,0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78, +0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18,0x7f,0x16,0x7d,0x19,0x12,0x22,0xb4,0x7f,0x5, +0x12,0x23,0x10,0x7f,0x6, 0x12,0x22,0xa3,0x7f,0x7, 0x12,0x23,0x10,0x7d,0x43,0xbe, +0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44,0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24, +0x12,0x22,0xa3,0x7f,0x1, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x78,0x2e,0xbe,0x71,0x2d,0x22,0xca,0xf8,0x7f,0x51,0x7f,0x40,0x7e,0x37,0x27,0x5a, +0x7a,0x37,0x64,0x4c,0x7e,0x37,0x27,0x58,0x7a,0x37,0x64,0x4e,0x7e,0x37,0x27,0x66, +0x7a,0x37,0x64,0x48,0x7e,0x37,0x27,0x68,0x7a,0x37,0x64,0x4a,0x6c,0xff,0x80,0x1e, +0x7e,0x34,0x64,0x48,0x7e,0x14,0x0, 0x28,0x74,0x9, 0x12,0x23,0x44,0x74,0x2, 0xac, +0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xe2,0xc9,0xb, 0xf0,0x7e,0x73, +0x77,0x2c,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e,0x35,0x28, +0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x28,0x7e,0x35,0x2a, +0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2a,0xb, 0x6a,0x30, +0x9e,0x35,0x2c,0x6d,0x22,0x7e,0x33,0x77,0x2e,0x12,0xe3,0x1e,0x7e,0x15,0x28,0x12, +0x22,0xbd,0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x2e,0x6d,0x22,0x7e,0x33,0x77, +0x2f,0x12,0xe3,0x1e,0x7e,0x15,0x2a,0x12,0x22,0xbd,0x1b,0x7a,0x30,0x22,0xa, 0x13, +0x6d,0x0, 0x2, 0x22,0xa3,0xca,0x79,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70, +0x2d,0xf4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf,0x77,0x30,0x7f, +0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x77,0x50,0xb, 0xa0, +0xbe,0xa0,0x20,0x40,0xd4,0x7e,0x8, 0x77,0x30,0x7e,0x18,0x77,0x50,0x74,0x20,0x12, +0xde,0xa9,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x77,0x2c,0xbe, +0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22,0x74,0x5, 0x2f, +0x11,0x14,0x78,0xfb,0x7e,0x33,0x77,0x2c,0xa, 0x13,0x6d,0x0, 0x12,0x22,0xbf,0x7c, +0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64,0xa, 0x3e,0x1b, +0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xe3,0xcf,0x7f,0x6, 0x7c,0xbd,0x7c,0x7c, +0x12,0xe3,0xcf,0xb, 0xf0,0x7e,0x73,0x77,0x2c,0xbc,0x7f,0x50,0xbc,0x7f,0x5, 0x7f, +0x16,0x12,0xe3,0x25,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x77,0x2b,0xda,0x3b,0x22,0x7c, +0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d,0x2, 0xb, 0xa, +0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, 0x7c,0x21,0xa5, +0xba,0x0, 0x14,0xa, 0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d,0x44,0x74,0x2, +0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0xa, 0x2, 0xa, 0x13,0x2d, +0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x10, +0x22,0x74,0x9, 0xac,0xbe,0x49,0x35,0x6d,0x70,0x74,0x9, 0xac,0xbf,0x49,0x25,0x27, +0x75,0x9d,0x32,0x12,0x24,0x56,0x7d,0xc3,0x74,0x9, 0xac,0xbe,0x49,0x35,0x6d,0x6e, +0x74,0x9, 0xac,0xbf,0x49,0x25,0x27,0x73,0x9d,0x32,0x2, 0x24,0x56,0x7e,0xa0,0x5, +0x7e,0x70,0x4, 0xac,0x7f,0x19,0xa3,0x28,0xba,0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34, +0x27,0x73,0x7e,0x30,0x9, 0xac,0x3e,0x2e,0x14,0x6d,0x6e,0x74,0x9, 0x2, 0x23,0x44, +0x7e,0xa0,0x3, 0x7e,0x30,0x9, 0xac,0x3f,0x7e,0x1d,0x35,0x2d,0x31,0x7a,0x1b,0xa0, +0x7e,0x30,0x9, 0xac,0x3f,0x7e,0x1d,0x35,0x2d,0x31,0x22,0x74,0x9, 0xac,0xbf,0x7e, +0x1d,0x35,0x22,0x75,0x1e,0x2, 0x74,0x2, 0x7a,0xb3,0x77,0xe1,0x74,0x1, 0x2, 0x5, +0xbc,0x74,0x9, 0xac,0xbe,0x49,0xc5,0x6d,0x6e,0x7e,0x34,0x21,0xde,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0x40,0x9e,0x44,0x0, 0x14,0xbd,0xc4,0x22,0x7a,0xb3,0x77,0x0, 0x7a, +0xb3,0x77,0x1, 0x7a,0xb3,0x77,0x4, 0x74,0xff,0x7a,0xb3,0x77,0x5, 0xe4,0x7a,0xb3, +0x77,0x6, 0x22,0x8d,0x32,0x7d,0x23,0x1e,0x24,0xe5,0x3f,0xa, 0x3b,0xad,0x32,0x7a, +0x35,0x2f,0x22,0x74,0x2, 0xa, 0x3c,0x19,0xb3,0x62,0x1f,0x22,0x7e,0x70,0x9, 0xac, +0x7e,0x9, 0xb3,0x6d,0x75,0x9, 0x73,0x6d,0x76,0x2, 0x57,0x9, 0x6d,0x22,0xa, 0xd, +0x7e,0x14,0x0, 0x40,0x9d,0x10,0x1a,0x2, 0x1a,0x0, 0x12,0x22,0xa3,0x7f,0x71,0x22, +0x7e,0x11,0x12,0x2e,0x10,0x8, 0xa5,0xe7,0xbe,0xb0,0x0, 0x22,0x49,0x35,0x6d,0x70, +0xbe,0x34,0x0, 0x14,0x22,0x2d,0x35,0x29,0xb1,0x0, 0x8, 0xbe,0xb0,0x2d,0x22,0x5e, +0x70,0x3, 0x7e,0x8, 0x0, 0x70,0x7c,0xb7,0x22,0x7e,0x70,0x27,0xac,0x67,0x2e,0x34, +0x28,0xe6,0x6d,0x22,0x7e,0x8, 0x76,0xad,0x22,0x7e,0x50,0x9, 0xac,0x5f,0x2e,0x25, +0x2b,0xb, 0x28,0x30,0x49,0x22,0x0, 0x2, 0x22,0x7e,0x37,0x63,0x28,0x7e,0x27,0x63, +0x2a,0x22,0x74,0x17,0xa4,0x7e,0x1d,0x33,0x2d,0x35,0x22,0x7e,0x70,0x9, 0xac,0x7f, +0x2e,0x35,0x2b,0x22,0x49,0x35,0x6d,0x70,0xbe,0x34,0x0, 0x0, 0x22,0x2e,0x34,0x0, +0x8, 0x4, 0x7a,0x1b,0xb0,0x22,0x74,0x9, 0xac,0xbe,0x9, 0xb5,0x6d,0x75,0x7e,0x70, +0x9, 0xac,0x7e,0x22,0x6d,0x22,0xa, 0x1d,0x6d,0x0, 0x12,0x22,0xa3,0x2f,0x17,0x74, +0x6, 0x22,0x7e,0x71,0x12,0x74,0x9, 0xac,0x7b,0x2e,0x34,0x27,0x73,0x6d,0x22,0x22, +0x49,0x35,0x29,0x92,0x49,0x25,0x29,0x90,0x2, 0x9, 0xad,0x6c,0xaa,0x7e,0x70,0x4, +0xac,0x7f,0x19,0xa3,0x28,0xba,0x22,0x2e,0x34,0x28,0xed,0x6d,0x22,0x74,0x10,0x2, +0xb, 0x8, 0x7a,0xb3,0x76,0xfd,0x74,0xff,0x7a,0xb3,0x76,0xfe,0xe4,0x22,0x7c,0x1f, +0x2e,0x10,0x8, 0xa5,0xe7,0x22,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x20,0x7a,0x27,0x4a, +0x6d,0x22,0x74,0x1, 0x7a,0xb3,0x76,0x31,0x7a,0xb3,0x77,0xfa,0x22,0x74,0x9, 0xac, +0xbf,0x49,0x25,0x27,0x73,0x4d,0x22,0x22,0x9e,0xc4,0x0, 0x14,0xbd,0x3c,0x22,0x7e, +0x37,0x73,0x21,0xb, 0x36,0xbe,0x35,0x2b,0x22,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3, +0x6b,0x54,0x22,0xa, 0x3c,0x9, 0xa3,0x62,0x15,0x22,0xa, 0x3c,0x9, 0xb3,0x62,0x1f, +0x22,0x7a,0x37,0x6e,0x91,0x7e,0x34,0x21,0x63,0x22,0xb, 0xf5,0xb, 0x55,0xb, 0x15, +0x1b,0x34,0x22,0x74,0x27,0xac,0xbe,0x9, 0xf5,0x28,0xea,0x22,0x49,0x13,0x74,0x96, +0x49,0x3, 0x74,0x94,0x22,0x74,0x17,0xa4,0x7e,0xd, 0x33,0x2d,0x15,0x22,0x7e,0x37, +0x63,0x54,0xbe,0x34,0x0, 0x1e,0x22,0x7e,0x27,0x63,0x24,0xbe,0x24,0x0, 0x14,0x22, +0x7e,0x34,0x0, 0x17,0xe4,0x2, 0x24,0x34,0x74,0x2, 0xac,0xbf,0x9, 0x5, 0x62,0xb8, +0x22,0x7e,0x3f,0x78,0x39,0x69,0x33,0x0, 0x6, 0x22,0x75,0x1e,0x0, 0xe4,0x7a,0xb3, +0x77,0xe1,0x22,0x74,0x9, 0xac,0xbe,0x49,0x45,0x6d,0x6e,0x22,0x49,0x45,0x6d,0x70, +0xbe,0x44,0x0, 0x14,0x22,0x7e,0x1f,0x24,0x68,0x7a,0x37,0x4e,0x7f,0x22,0x7a,0x35, +0x3b,0xbe,0x34,0x0, 0x0, 0x22,0x7e,0x73,0x63,0x1d,0xbe,0x70,0xa, 0x22,0x7e,0x34, +0x0, 0x64,0x7a,0x35,0x3d,0x22,0x7e,0x39,0xb0,0x14,0x7a,0x39,0xb0,0x22,0x9d,0x32, +0x12,0x24,0x56,0x7d,0x13,0x22, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_ebbg_sample.i b/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_ebbg_sample.i new file mode 100644 index 0000000000000..f66153565f32d --- /dev/null +++ b/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_ebbg_sample.i @@ -0,0 +1,3700 @@ +0x2, 0x23,0x8a,0x2, 0xd7,0xf5,0x1b,0xa, 0x30,0x22,0x22,0x2, 0x0, 0x1a,0x0, 0x1, +0x1, 0x0, 0x22,0x2, 0x77,0xf8,0xeb,0xaa,0x8, 0x22,0x32,0x2, 0x71,0x13,0x0, 0x0, +0x0, 0xff,0xff,0x2, 0x49,0xfa,0x2, 0x37,0x9e,0xff,0xff,0x2, 0x78,0xdc,0xca,0x3b, +0x7d,0x72,0x7d,0x63,0x7d,0x27,0x12,0x6, 0x48,0x7d,0x36,0x7d,0x27,0x12,0x6, 0xc5, +0xda,0x3b,0x22,0x2, 0x78,0xf4,0x7f,0x71,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e, +0x6f,0x78,0xee,0x79,0x36,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x6f,0x78,0xee,0x79, +0x36,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x6f,0x78,0xee,0x79,0x36,0x0, 0x8, 0x7e, +0x7b,0xa0,0x7c,0x6a,0x6c,0x77,0x7e,0x6f,0x78,0xee,0x79,0x36,0x0, 0xe, 0x7c,0x4b, +0x6c,0x55,0xe5,0x27,0xa, 0x3b,0x4d,0x32,0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0x10, +0x29,0x77,0x0, 0x2, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x29,0x57, +0x0, 0x4, 0x7c,0x46,0x4c,0x57,0x7e,0x2f,0x78,0xee,0x2e,0x54,0x0, 0xe, 0xb, 0x2a, +0x30,0x4d,0x32,0x1b,0x2a,0x30,0x29,0x77,0x0, 0x1, 0x7c,0x47,0x6c,0x55,0x29,0x77, +0x0, 0x3, 0x7c,0x64,0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0xa, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x78,0xee,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x30,0x12,0xa, +0x5e,0xa9,0xc6,0xcb,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0xb2,0x86,0x22, +0xe7,0x40,0x18,0xbf,0x4a,0xda,0xb5,0x25,0x7f,0x1d,0x80,0xe2,0xd0,0x2f,0x9, 0xf6, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x87,0xa6, +0xca,0x3b,0x7f,0x30,0x7e,0x3b,0xb0,0xf5,0x2a,0x29,0xb3,0x0, 0x1, 0xbe,0xb1,0x2a, +0x28,0x2, 0xf5,0x2a,0x69,0x13,0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff, +0x12,0x24,0x38,0x7f,0x3, 0x12,0xa, 0x6, 0xa9,0xd6,0xcb,0x75,0x28,0x0, 0x80,0x33, +0x75,0x29,0x0, 0x80,0x23,0x7e,0x11,0x28,0x74,0xb, 0xac,0x1b,0xe5,0x29,0xa, 0x1b, +0x2d,0x1, 0x3e,0x4, 0x69,0x13,0x0, 0x6, 0x2d,0x10,0x6d,0x0, 0xb, 0xa, 0x30,0x6e, +0x34,0xff,0xff,0x1b,0xa, 0x30,0x5, 0x29,0x29,0x73,0x0, 0x1, 0xbe,0x71,0x29,0x38, +0xd4,0x5, 0x28,0x7e,0x3b,0x70,0xbe,0x71,0x28,0x38,0xc5,0x69,0x33,0x0, 0x6, 0x7e, +0xf, 0x78,0xee,0x79,0x30,0x0, 0x4, 0xe5,0x2a,0xa, 0x2b,0x7d,0x32,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x78, +0xee,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xa, 0x5e,0x75,0x28,0x0, 0xe5,0x28, +0xbe,0xb0,0x4, 0x50,0x17,0x7e,0xa1,0x28,0x74,0x4, 0xa4,0x7e,0x1f,0x78,0xee,0x69, +0x11,0x0, 0x26,0x60,0x44,0x1e,0x14,0x14,0x78,0xfb,0x80,0x3d,0xe5,0x28,0xbe,0xb0, +0x8, 0x50,0x1b,0xe5,0x28,0xa, 0x5b,0x1b,0x56,0x3e,0x54,0x3e,0x54,0x7e,0x1f,0x78, +0xee,0x69,0x11,0x0, 0x28,0x60,0x22,0x1e,0x14,0x14,0x78,0xfb,0x80,0x1b,0xe5,0x28, +0xa, 0x5b,0x9e,0x54,0x0, 0x8, 0x3e,0x54,0x3e,0x54,0x7e,0x1f,0x78,0xee,0x69,0x11, +0x0, 0x2a,0x60,0x5, 0x1e,0x14,0x14,0x78,0xfb,0x5e,0x14,0x0, 0xf, 0x7e,0xa1,0x28, +0x74,0x2, 0xa4,0x69,0x33,0x0, 0x6, 0x2d,0x35,0x6d,0x22,0x1b,0x1a,0x10,0x5, 0x28, +0xe5,0x28,0xbe,0xb0,0xb, 0x40,0x87,0xa9,0xc6,0xcb,0xda,0x3b,0x22,0x6d,0x33,0x7e, +0xf, 0x78,0xf2,0x79,0x30,0x0, 0x12,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x14,0xb, +0xa, 0x30,0x5e,0x60,0x7f,0x1b,0xa, 0x30,0xe5,0x38,0x54,0x1f,0xa, 0x2b,0x7e,0xf, +0x78,0xf2,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0xe5,0x39, +0x54,0x1, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7e,0xf, +0x78,0xf2,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0xe5,0x3a, +0x54,0x3, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30, +0x7e,0x35,0x36,0xbe,0x34,0x0, 0x2, 0x78,0x63,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, +0x14,0xb, 0xa, 0x30,0x4e,0x60,0x80,0x1b,0xa, 0x30,0xe5,0x3b,0x54,0x1f,0x7c,0x4b, +0x6c,0x55,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0xe5,0x3c,0x54,0x1, 0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x7e, +0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0xe5, +0x3d,0x54,0x3, 0xa, 0x5b,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4,0x7e,0xf, 0x78,0xf2, +0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0x7f,0x21,0xa9, +0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0x4, 0x69,0x30, +0x0, 0x8, 0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, 0x6, 0x7e,0x7f, +0x78,0xee,0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c,0x55,0x7e,0xb, +0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0xc, 0x29,0x70,0x0, +0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0xa, 0x69,0x30,0x0, +0xa, 0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, 0x7e,0x7f,0x78, +0xee,0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, +0x12,0x69,0x30,0x0, 0x10,0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0x30,0x29,0x70,0x0, +0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x78,0xee,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0, +0x12,0xa, 0x5e,0x7e,0x1f,0x78,0xee,0x69,0x11,0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11, +0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, 0x16,0x79,0x12,0x0, 0x2, 0x69,0x11, +0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, 0x22,0x79,0x12,0x0, 0x6, 0x69,0x11, +0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, 0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31, +0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x7a,0x25,0x4c,0x7f, +0x30,0x7a,0x35,0x4a,0xa2,0xac,0x92,0x9, 0xc2,0xac,0x7e,0x1f,0x78,0xf2,0x69,0x31, +0x0, 0x4, 0x5e,0x34,0x10,0x0, 0x7a,0x37,0x6b,0xe7,0xc2,0xa, 0x12,0xc, 0x17,0xa2, +0x9, 0x92,0xac,0xa9,0xd3,0xcb,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, +0xf2,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x3, 0xf2,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78, +0xf4,0x7e,0x35,0x4a,0x2e,0x34,0x80,0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf2,0x69, +0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x80,0x20,0x7d,0x23,0x3e,0x24,0x7f, +0x3, 0x2d,0x12,0xb, 0xa, 0x20,0x7e,0xf, 0x3, 0xf2,0x1b,0xa, 0x20,0x7e,0xf, 0x3, +0xf2,0x69,0x20,0x0, 0x8, 0x4d,0x22,0x68,0xf4,0xb, 0x34,0xbe,0x35,0x4c,0x40,0xdb, +0xa9,0xc5,0xcb,0xa9,0xc3,0xcb,0x7e,0x37,0x6b,0xe7,0x2e,0x34,0xff,0xff,0x92,0xa, +0x12,0xc, 0x17,0xda,0x3b,0x22,0xca,0x3b,0x7a,0x25,0x4c,0x7f,0x30,0x7a,0x35,0x4a, +0xa2,0xac,0x92,0x9, 0xc2,0xac,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x4, 0x5e,0x34, +0x10,0x0, 0x7a,0x37,0x6b,0xe7,0xc2,0xa, 0x12,0xc, 0x17,0xa2,0x9, 0x92,0xac,0xd2, +0xcd,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf6,0x79,0x30,0x0, 0x6, +0x7e,0xf, 0x3, 0xf6,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7e,0x35,0x4a,0x2e, +0x34,0x80,0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf6,0x69,0x31,0x0, 0x8, 0x4d,0x33, +0x68,0xf4,0x6d,0x33,0x80,0x20,0x7d,0x23,0x3e,0x24,0x7f,0x3, 0x2d,0x12,0xb, 0xa, +0x20,0x7e,0xf, 0x3, 0xf6,0x1b,0xa, 0x20,0x7e,0xf, 0x3, 0xf6,0x69,0x20,0x0, 0x8, +0x4d,0x22,0x68,0xf4,0xb, 0x34,0xbe,0x35,0x4c,0x40,0xdb,0xa9,0xc5,0xcb,0xc2,0xcd, +0x7e,0x37,0x6b,0xe7,0x2e,0x34,0xff,0xff,0x92,0xa, 0x12,0xc, 0x17,0xda,0x3b,0x22, +0xca,0x79,0x7c,0xab,0x6d,0x77,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x6, 0x5e,0x34, +0x0, 0x2, 0x68,0x18,0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b,0xa, +0x30,0x74,0x3, 0x7a,0xb3,0x78,0x97,0x75,0x1e,0x3, 0x80,0x3, 0xe4,0x80,0x5a,0x4c, +0xaa,0x68,0x54,0x80,0x44,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x6, 0x5e,0x34,0x0, +0x1, 0x78,0xa, 0xe4,0x7a,0xb3,0x78,0x97,0x75,0x1e,0x0, 0x80,0x3c,0x7e,0x34,0x0, +0x1, 0x12,0x6a,0xa6,0xb, 0x74,0xbe,0x74,0x3, 0xe8,0x28,0x1d,0x7e,0xf, 0x78,0xf2, +0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x74,0x2, 0x7a, +0xb3,0x78,0x97,0x75,0x1e,0x2, 0xe4,0x80,0x10,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, +0xe, 0x5e,0x34,0x0, 0x3, 0x78,0xae,0x74,0x1, 0xda,0x79,0x22,0xca,0x79,0x7c,0xab, +0x6d,0x77,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x6, 0x5e,0x34,0x0, 0x2, 0x68,0x18, +0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x74,0x2, 0x7a, +0xb3,0x78,0x97,0x75,0x1e,0x2, 0x80,0x3, 0xe4,0x80,0x5a,0x4c,0xaa,0x68,0x54,0x80, +0x44,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x6, 0x5e,0x34,0x0, 0x1, 0x78,0xa, 0xe4, +0x7a,0xb3,0x78,0x97,0x75,0x1e,0x0, 0x80,0x3c,0x7e,0x34,0x0, 0x1, 0x12,0x6a,0xa6, +0xb, 0x74,0xbe,0x74,0x3, 0xe8,0x28,0x1d,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0xe, +0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b,0xa, 0x30,0x74,0x3, 0x7a,0xb3,0x78,0x97,0x75, +0x1e,0x3, 0xe4,0x80,0x10,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0xe, 0x5e,0x34,0x0, +0x8, 0x68,0xae,0x74,0x1, 0xda,0x79,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xa2,0xac, +0x92,0x3, 0xc2,0xac,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x4, 0x5e,0x34,0x10,0x0, +0x7a,0x37,0x67,0xd3,0xc2,0xa, 0x12,0xc, 0x17,0xa2,0x3, 0x92,0xac,0xa9,0xd3,0xcb, +0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf2,0x79,0x30,0x0, 0x6, 0x7e, +0xf, 0x3, 0xf2,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7d,0x36,0x2e,0x34,0x80, +0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf2,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4, +0x1b,0x1a,0x70,0x7e,0x1f,0x3, 0xf2,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0xa9, +0xc5,0xcb,0xa9,0xc3,0xcb,0x7e,0x37,0x67,0xd3,0x2e,0x34,0xff,0xff,0x92,0xa, 0x12, +0xc, 0x17,0xda,0x3b,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xa2,0xac,0x92,0x3, 0xc2, +0xac,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x4, 0x5e,0x34,0x10,0x0, 0x7a,0x37,0x67, +0xd3,0xc2,0xa, 0x12,0xc, 0x17,0xa2,0x3, 0x92,0xac,0xd2,0xcd,0xa9,0xd5,0xcb,0x7e, +0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf6,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x3, 0xf6,0x69, +0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7d,0x36,0x2e,0x34,0x80,0x0, 0x1b,0xa, 0x30, +0x7e,0x1f,0x3, 0xf6,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x1b,0x1a,0x70,0x7e, +0x1f,0x3, 0xf6,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0xa9,0xc5,0xcb,0xc2,0xcd, +0x7e,0x37,0x67,0xd3,0x2e,0x34,0xff,0xff,0x92,0xa, 0x12,0xc, 0x17,0xda,0x3b,0x22, +0xca,0x3b,0x7d,0x73,0xa2,0xac,0x92,0x0, 0xc2,0xac,0x7e,0x1f,0x78,0xf2,0x69,0x61, +0x0, 0x4, 0x5e,0x64,0x10,0x0, 0xc2,0xa, 0x12,0xc, 0x17,0xa2,0x0, 0x92,0xac,0xa9, +0xd3,0xcb,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf2,0x79,0x30,0x0, +0x6, 0x7e,0x1f,0x3, 0xf2,0x69,0x11,0x0, 0x6, 0x4d,0x11,0x78,0xf4,0x1b,0x1a,0x70, +0x7e,0xf, 0x3, 0xf2,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, +0x30,0x7e,0x1f,0x3, 0xf2,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x71,0x0, +0x2, 0xa9,0xc5,0xcb,0xa9,0xc3,0xcb,0x2e,0x64,0xff,0xff,0x92,0xa, 0x12,0xc, 0x17, +0x7d,0x37,0xda,0x3b,0x22,0x7e,0x8, 0x1, 0x7d,0x7e,0x34,0x0, 0x18,0xe4,0x12,0x24, +0x38,0xa9,0xd1,0xcb,0xd2,0xcc,0x7e,0x34,0x0, 0x4, 0x7e,0x8, 0x1, 0x7d,0x74,0xc, +0x12,0xa, 0xb5,0xa9,0xd1,0xcb,0xc2,0xcc,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x7e, +0x8, 0x1, 0x7d,0x2d,0x13,0xb, 0xa, 0x20,0x7c,0x45,0x6c,0x55,0xb, 0xa, 0x30,0xa, +0x36,0x4d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0x22,0xff,0xff, +0xca,0x3b,0x7d,0x73,0xa2,0xac,0x92,0x0, 0xc2,0xac,0x7e,0x1f,0x78,0xf2,0x69,0x61, +0x0, 0x4, 0x5e,0x64,0x10,0x0, 0xc2,0xa, 0x12,0xc, 0x17,0xa2,0x0, 0x92,0xac,0xd2, +0xcd,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf6,0x79,0x30,0x0, 0x6, +0x7e,0x1f,0x3, 0xf6,0x69,0x11,0x0, 0x6, 0x4d,0x11,0x78,0xf4,0x1b,0x1a,0x70,0x7e, +0xf, 0x3, 0xf6,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, 0x30, +0x7e,0x1f,0x3, 0xf6,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x71,0x0, 0x2, +0xa9,0xc5,0xcb,0xc2,0xcd,0x2e,0x64,0xff,0xff,0x92,0xa, 0x12,0xc, 0x17,0x7d,0x37, +0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x78,0xee,0x79,0x32, +0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0x8, 0x29,0x70, +0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, 0xa, 0x37,0x2d,0x32,0x7e,0x2f, +0x78,0xee,0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c,0x47,0x29,0x70,0x0, 0x1, 0xa, +0x37,0x2d,0x32,0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0xa, 0x29,0x70,0x0, 0x4, 0xa, +0x37,0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x5, 0x54,0x1, 0x7c, +0x2b,0x6c,0x33,0x7e,0x1f,0x78,0xee,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xc0,0x12,0xa, +0x5e,0xa9,0xc6,0xcb,0x22,0xa9,0xd6,0xcb,0xc2,0x32,0x69,0x30,0x0, 0x4, 0x7e,0x2f, +0x78,0xee,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x78,0xee,0x79,0x32, +0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0x8, 0x7e,0xb, +0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x78, +0xee,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x78,0xee,0x79, +0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4,0x7e,0x1f, +0x78,0xee,0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22, +0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f,0x78,0xee,0x79,0x22,0x0, 0x4, 0x69, +0x20,0x0, 0x8, 0x7e,0x2f,0x78,0xee,0x79,0x22,0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55, +0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25,0x2d,0x25,0x7e,0x2f,0x78,0xee,0x79, +0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25,0x7e,0xf, 0x78,0xee,0x79,0x20,0x0, +0xe, 0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, 0xa, 0x6d,0x11,0x7e,0x1f,0x78,0xee,0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c, +0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0xb, 0x7a,0x40,0x5e,0x80,0x3, +0x1b,0x7a,0x40,0x7e,0x90,0x6, 0xac,0x9a,0x7c,0xb9,0x7f,0x71,0x60,0xd, 0x1e,0xf4, +0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7d,0x4f,0x5e,0x44,0x0, +0x3f,0x7d,0x74,0x7c,0xef,0x6c,0xff,0x3e,0x74,0x3e,0x74,0x7e,0xd0,0x2, 0xac,0xda, +0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xf0,0x4d,0xf7,0x1b,0x6a,0xf0,0xb, 0xa0,0xbe,0xa0, +0x4, 0x40,0xae,0xda,0x3b,0x22,0x7f,0x10,0xa9,0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e, +0x2f,0x78,0xee,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, 0x4, 0x7e,0x2f,0x78,0xee,0x79, +0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f,0x78,0xee,0x79,0x12,0x0, 0x8, 0x7e, +0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad,0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37, +0x2d,0x31,0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x78,0xee, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22,0xa9,0xd7, +0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x78,0xee,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x78,0xee,0xb, 0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, +0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7,0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30, +0xd2,0x32,0x7e,0xf, 0x78,0xee,0xb, 0xa, 0x30,0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe, +0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b,0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x78, +0xee,0x1b,0x1a,0x10,0x22,0x7e,0x24,0x0, 0x1, 0x7e,0x7f,0x3, 0xfa,0x79,0x27,0x0, +0x6, 0x7e,0x7f,0x3, 0xfa,0x69,0x27,0x0, 0x6, 0x4d,0x22,0x78,0xf4,0x5e,0x60,0x7f, +0x1b,0x7a,0x30,0x7e,0x1f,0x3, 0xfa,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6c, +0xaa,0x80,0x20,0x6d,0x44,0x7e,0x1f,0x3, 0xfa,0x1b,0x1a,0x40,0x7e,0x1f,0x3, 0xfa, +0x69,0x41,0x0, 0x8, 0x4d,0x44,0x68,0xf4,0x69,0x41,0x0, 0x2, 0x1b,0xa, 0x40,0xb, +0x15,0xb, 0xa0,0xbc,0xba,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x6c,0x99,0x80,0x2d, +0x7e,0xf0,0x2, 0xac,0xf9,0x7f,0x60,0x2d,0xd7,0xb, 0x6a,0xf0,0x5e,0xf4,0xfc,0x0, +0x1b,0x6a,0xf0,0x7f,0x71,0x2d,0xf7,0xb, 0x7a,0xe0,0x7e,0xf0,0x2, 0xac,0xf9,0x7f, +0x60,0x2d,0xd7,0xb, 0x6a,0xf0,0x4d,0xfe,0x1b,0x6a,0xf0,0xb, 0x90,0xbc,0xa9,0x38, +0xcf,0xda,0x79,0x22,0xb, 0x38,0x20,0x5e,0x50,0xc0,0x1b,0x38,0x20,0xb, 0xa, 0x20, +0x5e,0x40,0x7, 0x1b,0xa, 0x20,0xe5,0x2a,0xa, 0x5b,0xb, 0x38,0x20,0x4d,0x25,0x1b, +0x38,0x20,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xa9,0xd6,0xcb,0x54,0x3f, +0x5e,0x70,0x1f,0x7e,0x14,0x0, 0x1, 0x7e,0x7f,0x78,0xee,0x79,0x17,0x0, 0x2, 0x7c, +0x2b,0x6c,0x33,0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, 0x32,0x7e, +0xf, 0x78,0xee,0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x12,0x7, 0xb5,0x2, 0xd, 0x59, +0x30,0x2a,0x31,0xa9,0xd2,0xea,0xa9,0xc2,0xea,0x6d,0x33,0x7e,0xf, 0x78,0xf2,0x79, +0x30,0x0, 0x16,0x7e,0x34,0x1, 0x2c,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x18,0xc2, +0x2a,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b, +0xa, 0x30,0xc2,0x29,0x22,0xa2,0xac,0x92,0x9, 0x7e,0xf, 0x78,0xf2,0xb, 0xa, 0x30, +0x5e,0x34,0x10,0x0, 0x68,0xb, 0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x1b,0xa, +0x30,0xc2,0xac,0x7e,0xf, 0x78,0xf2,0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x1b, +0xa, 0x30,0xa2,0x9, 0x92,0xac,0x22,0xa2,0xac,0x92,0xb, 0xc2,0xac,0x7e,0xf, 0x78, +0xf2,0x30,0xa, 0xa, 0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x80,0x8, 0xb, 0x16, +0xb, 0xa, 0x30,0x5e,0x60,0xef,0x1b,0xa, 0x30,0xa2,0xb, 0x92,0xac,0x22,0xb, 0xa, +0x30,0x5e,0x34,0xfc,0x7f,0x1b,0xa, 0x30,0xa, 0x2b,0x5e,0x24,0x0, 0x7, 0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0xa9,0xd7,0xca,0x7e,0x24,0x0, 0x1, 0x7e,0xf, 0x78,0xf6, +0x1b,0xa, 0x20,0x7e,0x24,0x9, 0x60,0x7e,0xf, 0x78,0xf6,0x79,0x20,0x0, 0x2, 0x7e, +0xf, 0x78,0xf6,0x79,0x30,0x0, 0x4, 0x22,0xb, 0xa, 0x20,0x5e,0x24,0x80,0x1f,0x1b, +0xa, 0x20,0x7d,0x23,0x5e,0x40,0x3, 0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x60,0xc7, +0x1b,0xa, 0x30,0x54,0x7, 0xa, 0x3b,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xca,0x3b,0x7d,0x72, +0x7a,0xd, 0x29,0x7d,0x63,0x7e,0xd, 0x29,0x7d,0x27,0x12,0x3, 0xfa,0x7d,0x36,0x7e, +0xd, 0x29,0x7d,0x27,0x12,0x4, 0x96,0xda,0x3b,0x22,0xb, 0xa, 0x30,0x5e,0x60,0x9f, +0x1b,0xa, 0x30,0x54,0x3, 0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0xb, 0xa, +0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x70,0xe7,0x1b,0xa, 0x30, +0x54,0x3, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0x22,0x7c,0xa7,0xb, 0xa, 0x30,0x5e,0x60,0x40,0x60,0x3, 0x4e,0x60,0x80, +0x7c,0xba,0x54,0x3f,0x7c,0x4b,0x6c,0x55,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, +0x50,0x54,0xe0,0x1b,0xa, 0x50,0x7d,0x52,0x5e,0x54,0x0, 0x1f,0xb, 0xa, 0x20,0x4d, +0x25,0x1b,0xa, 0x20,0x79,0x30,0x0, 0x2, 0x22,0x7e,0xb3,0x1, 0x8d,0xb4,0xe7,0x12, +0x7e,0xb3,0x1, 0x8e,0xb4,0x16,0xb, 0x7e,0xb3,0x1, 0x8a,0x54,0x1, 0xb4,0x1, 0x2, +0x80,0xfe,0x22,0xb, 0xa, 0x30,0x5e,0x60,0xf, 0x1b,0xa, 0x30,0xa, 0x5b,0xc4,0x54, +0xf0,0x7c,0xab,0xe4,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30, +0x5e,0x60,0xfc,0x1b,0xa, 0x30,0x54,0x3, 0x7c,0x4b,0x6c,0x55,0xb, 0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x20,0x5e,0x50,0xfc,0x1b,0xa, 0x20,0x7d,0x23, +0x5e,0x24,0x0, 0x3, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xd2,0x2a,0xd2, +0x29,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x4e,0x70,0x2, 0x1b, +0xa, 0x30,0x22,0x7d,0x23,0xb, 0xa, 0x30,0x5e,0x34,0xf8,0x0, 0x1b,0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0x7d,0x23,0xb, 0xa, 0x30,0x5e,0x34,0xf8,0x0, 0x1b,0xa, +0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x70,0x3, 0x70,0x3, 0x4e, +0x70,0xc, 0x1b,0xa, 0x30,0x22,0x2, 0xd, 0x14,0x1b,0x21,0x25,0x2b,0x31,0x37,0x36, +0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, 0x10,0x18,0x1e,0x23, +0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, +0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40,0x3f,0x3e,0x3d,0x3d, +0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29,0x27,0x1e,0x14,0x11, +0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, 0x5, 0x1, 0x0, 0x0, +0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21,0x2b,0x32,0x30,0x2a, +0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, 0x10,0x19,0x23,0x2d, +0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71,0x50,0x55,0x28,0x12, +0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39,0x31,0x28,0x1e,0x15, +0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32,0x37,0x39,0x20,0x29, +0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, 0x1, 0x0, 0x1, 0x5, +0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c,0x34,0x31,0x26,0xcb, +0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31,0x2e,0x2d,0x35,0x3d, +0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, 0x10,0x1b,0x24,0x2f, +0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d,0x28,0x31,0x34,0x2a, +0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40,0x47,0x47,0x44,0x3c, +0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b,0x22,0x2d,0x30,0x2e, +0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, 0x0, 0x0, 0x3, 0xb, +0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26,0x1b,0x14,0x1c,0x25, +0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c,0x25,0x30,0x38,0x40, +0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c,0x29,0x1e,0x14,0x13, +0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39,0x30,0x25,0x1b,0x10, +0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a,0x23,0x2f,0x33,0x29, +0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, 0x2, 0x0, 0x1, 0x8, +0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e,0x50,0x55,0x16,0x2b, +0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36,0x3b,0x3d,0x3b,0x37, +0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33,0x3d,0x3f,0x13,0x21, +0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37,0x2d,0x22,0x18,0xc, +0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38,0x2e,0x2a,0x31,0x62, +0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, 0x6, 0x4, 0x2, 0x0, +0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26,0x2a,0x30,0x35,0x39, +0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b,0x1f,0x23,0x28,0x2d, +0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48,0x46,0x43,0x40,0x3e, +0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x2d,0x28,0x24,0x22,0x1f,0x1c,0x19,0x16,0x13,0x10, +0xc, 0x8, 0x5, 0x2, 0x0, 0x3, 0x7, 0xa, 0xe, 0x11,0x16,0x19,0x1e,0x22,0x27,0x2c, +0x30,0x33,0x36,0x39,0x3d,0x40,0x0, 0x2, 0x6, 0x9, 0xb, 0xe, 0x11,0x14,0x16,0x18, +0x1b,0x1f,0x22,0x25,0x28,0x29,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x32,0x33,0x35,0x36, +0x38,0x39,0x3b,0x3c,0x3e,0x40,0xac,0x6a,0x34,0x55,0x25,0x1e,0x1a,0x17,0x15,0x11, +0xe, 0xb, 0x9, 0x7, 0x4, 0x2, 0x1, 0x2, 0x5, 0x9, 0xd, 0x10,0x13,0x17,0x1b,0x1e, +0x21,0x25,0x29,0x2d,0x30,0x33,0x37,0x3b,0x3e,0x40,0x0, 0x6, 0xc, 0x10,0x13,0x19, +0x1f,0x23,0x27,0x2b,0x2f,0x33,0x36,0x38,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3f,0x40,0xca,0xd8,0x34,0x55,0x9, 0x17, +0x1d,0x26,0x2e,0x37,0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, +0x1, 0x0, 0x0, 0x0, 0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30, +0x2f,0x2c,0x26,0x1e,0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c, +0x32,0x3a,0x41,0x48,0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c, +0x33,0x55,0x6, 0x11,0x18,0x1e,0x22,0x27,0x2a,0x2c,0x29,0x25,0x1f,0x18,0x11,0xb, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, 0xa, 0x11,0x18,0x20,0x26,0x2c,0x32,0x36,0x3b, +0x3d,0x3f,0x48,0x37,0x2e,0x24,0x1a,0x11,0xa, 0x4, 0x0, 0x0, 0x1, 0x5, 0xb, 0x12, +0x1b,0x21,0x28,0x30,0x37,0x41,0x47,0x4e,0x54,0x53,0x4e,0x48,0x41,0x3b,0x33,0x2c, +0x28,0x25,0xb, 0x67,0x33,0x55,0x6, 0xc, 0x15,0x19,0x22,0x2b,0x2f,0x36,0x3c,0x3e, +0x3f,0x39,0x34,0x29,0x25,0x1d,0x14,0xf, 0x7, 0x2, 0x0, 0x0, 0x0, 0x2, 0xc, 0x10, +0x10,0x10,0x10,0x10,0x10,0x10,0x36,0x35,0x32,0x31,0x2d,0x28,0x25,0x1f,0x18,0x13, +0xa, 0x2, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x17,0x21,0x26,0x31,0x3b,0x3f,0x45,0x46, +0x46,0x46,0x46,0x46,0x46,0x46,0xf0,0x59,0x33,0x55,0x0, 0x6, 0xf, 0x19,0x21,0x2a, +0x2e,0x32,0x2a,0x21,0x18,0x14,0xc, 0x6, 0x2, 0x0, 0x1, 0xb, 0x13,0x1d,0x25,0x2a, +0x32,0x3a,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x23,0x1f,0x1b,0x17,0x13,0xc, +0x9, 0x1, 0x1, 0x6, 0xe, 0x12,0x1b,0x24,0x2d,0x37,0x3b,0x3f,0x3f,0x3d,0x39,0x36, +0x2e,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xf4,0x7b,0x33,0x55,0x5, 0xd, +0x19,0x23,0x2d,0x31,0x34,0x2c,0x22,0x1e,0x15,0xd, 0x8, 0x4, 0x2, 0x0, 0x2, 0xc, +0x10,0x19,0x21,0x2a,0x2e,0x37,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x1c,0x1b, +0x18,0x16,0x10,0xd, 0x4, 0x0, 0x3, 0x5, 0xc, 0x16,0x1e,0x26,0x2a,0x35,0x3d,0x3f, +0x3e,0x3c,0x3b,0x3a,0x39,0x38,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x8d,0x3a, +0x33,0x55,0x5, 0xd, 0x13,0x19,0x20,0x26,0x2e,0x35,0x3c,0x3d,0x37,0x2f,0x20,0x19, +0x11,0xb, 0x5, 0x2, 0x0, 0x0, 0x1, 0x6, 0xc, 0x17,0x1d,0x23,0x29,0x30,0x36,0x3b, +0x3e,0x3e,0x28,0x25,0x22,0x20,0x1d,0x18,0x14,0xf, 0x8, 0x2, 0x0, 0x0, 0x4, 0x7, +0xc, 0x11,0x18,0x1e,0x24,0x2c,0x33,0x3a,0x3e,0x3f,0x3e,0x3c,0x38,0x31,0x2a,0x21, +0x1a,0x1a,0x6, 0x33,0x33,0x55,0x26,0x1c,0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18, +0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, 0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44, +0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49,0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f, +0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54,0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d, +0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, +0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c,0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22, +0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c,0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a, +0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32,0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, +0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, 0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22,0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, +0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39,0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68, +0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70,0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80, +0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10,0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, +0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39, +0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24,0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50, +0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff,0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a, +0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, 0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18, +0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22,0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33, +0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29,0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d, +0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26,0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10, +0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b,0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, +0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19,0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22, +0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39,0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34, +0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, 0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18, +0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37,0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x0, 0x0, +0x1, 0x3, 0x8, 0xb, 0x12,0x18,0x1b,0x20,0x22,0x22,0x23,0x24,0x26,0x27,0x29,0x2b, +0x30,0x31,0x31,0x32,0x32,0x34,0x35,0x37,0x3b,0x3e,0x3f,0x3f,0x3f,0x3f,0x7b,0x6d, +0x5f,0x53,0x40,0x36,0x23,0x14,0xb, 0x3, 0xe, 0x1e,0x29,0x35,0x29,0x20,0x11,0x7, +0x6, 0x16,0x1f,0x2d,0x35,0x43,0x4c,0x59,0x68,0x72,0x74,0x74,0x74,0x74,0x90,0x27, +0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, 0x0, 0x1, 0x5, 0xa, +0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e,0x3b,0x38,0x33,0x2f, +0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21,0x27,0x2e,0x36,0x3b, +0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c,0x16,0x10,0xc, 0xa, +0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, 0x0, 0x2, 0x5, 0x9, +0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f,0x3d,0x38,0x30,0x27, +0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36,0x3f,0x49,0x53,0x5c, +0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b,0x15,0xb, 0x4, 0x0, +0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c,0x34,0x39,0x3c,0x3d, +0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, 0x6, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, 0x8, 0xe, 0x14,0x1a, +0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58,0x51,0x48,0x3f,0x38, +0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf,0x30,0x55,0x16,0x7, +0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28,0x30,0x38,0x3c,0x3e, +0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16,0xf, 0xc, 0x53,0x46, +0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, 0x13,0x1a, +0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a,0x58,0x57,0xc6,0x55, +0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38,0x3c,0x3e,0x3f,0x3e, +0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17,0x20,0x2a, +0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57,0x4f,0x47,0x40,0x38, +0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, 0x1, 0x0, 0x0, 0x1, +0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f,0x3f,0x3d,0x3a,0x36, +0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22,0x29,0x30,0x38,0x3f, +0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25,0x1e,0x17,0x10,0x8, +0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f,0x3d,0x3a,0x36,0x2e, +0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0x9, 0xe, 0x14,0x1c, +0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a,0x10,0x9, 0x4, 0x0, +0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47,0x4f,0x56,0x5a,0x5b, +0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9,0x30,0x55,0x3e,0x3b, +0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, +0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e,0x3f,0x3f,0x1f,0x10, +0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25,0x2c,0x35,0x3c,0x42, +0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25,0x1f,0x1c,0xf9,0xa2, +0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d,0x3a,0x34,0x2d,0x27, +0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, 0xa, 0xf, 0x15,0x1b, +0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11,0xb, 0x6, 0x2, 0x0, +0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36,0x3c,0x42,0x47,0x48, +0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x3e,0x3d, +0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x1, 0x4, +0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29,0x22,0x1b,0x15,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c,0x24,0x2a,0x30,0x35, +0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, 0x4, 0x7, 0xa, 0x10, +0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b,0x38,0x31,0x29,0x21, +0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35,0x3d,0x45,0x4b,0x51, +0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17,0x11,0x9, 0x3, 0x0, +0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6,0x30,0x55,0xa, 0x5, +0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3c, +0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, 0x1, 0x2, 0x35,0x46, +0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37,0x2e,0x25,0x1e,0x16, +0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39,0x41,0x45,0xf0,0xbc, +0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28,0x30,0x36,0x3b,0x3d, +0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, 0x0, 0x0, 0x1, 0x2, +0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d,0x52,0x4a,0x3e,0x35, +0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19,0x22,0x2b,0x31,0x3a, +0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36,0x2f,0x27,0x21,0x19, +0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10,0x16,0x1f,0x26,0x2d, +0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d,0x56,0x59,0x5a,0x58, +0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, 0x0, 0x0, 0x1, 0x3, +0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38,0x37,0x34,0x2d,0x26, +0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x10,0x17,0x20, +0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40,0x49,0x50,0x59,0x5e, +0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10,0xa, 0x5, 0x1, 0x0, +0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3,0x30,0x55,0x3b,0x3d, +0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, +0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f,0x3e,0x3e,0x33,0x45, +0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40,0x38,0x2e,0x25,0x1a, +0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32,0x39,0x3e,0x7, 0x90, +0x30,0x55,0x8, 0x2, 0x0, 0x0, 0x0, 0x2, 0x5, 0x7, 0xc, 0x12,0x19,0x1f,0x2b,0x32, +0x37,0x3b,0x3d,0x3f,0x3f,0x3e,0x3d,0x3a,0x37,0x2f,0x29,0x23,0x1d,0x16,0xf, 0x9, +0x6, 0x6, 0x47,0x3d,0x36,0x2f,0x27,0x1e,0x16,0x10,0x9, 0x3, 0x0, 0x0, 0x1, 0x4, +0x7, 0xd, 0x14,0x1d,0x26,0x2d,0x33,0x3a,0x42,0x4e,0x53,0x55,0x56,0x54,0x4f,0x48, +0x42,0x42,0x43,0x9e,0x30,0x55,0x2, 0x0, 0x0, 0x1, 0x3, 0x7, 0xc, 0x13,0x1c,0x24, +0x2d,0x37,0x3f,0x3d,0x3b,0x39,0x36,0x34,0x31,0x2e,0x2b,0x27,0x20,0x16,0xe, 0x8, +0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x5d,0x50,0x46,0x3e,0x36,0x2c,0x20,0x16,0xd, 0x6, +0x2, 0x0, 0xb, 0x16,0x22,0x2a,0x33,0x3c,0x44,0x4c,0x55,0x5d,0x69,0x79,0x7d,0x76, +0x6d,0x63,0x59,0x50,0x48,0x47,0x12,0x3e,0x30,0x55,0x3, 0x1, 0x2, 0x6, 0xa, 0x16, +0x20,0x25,0x30,0x39,0x3e,0x3f,0x3f,0x3c,0x3a,0x32,0x28,0x22,0x19,0xe, 0x5, 0x2, +0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x29,0x23,0x18,0xf, 0xb, 0x3, +0x0, 0x0, 0x1, 0x8, 0x11,0x17,0x21,0x2a,0x2f,0x3a,0x42,0x43,0x42,0x3e,0x38,0x34, +0x2c,0x24,0x1f,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x7f,0xd2,0x30,0x55,0x39,0x2b, +0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, 0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b, +0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f,0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, +0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24,0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b, +0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65,0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a, +0x46,0x55,0x3c,0x37,0x33,0x2f,0x25,0x20,0x1b,0x10,0xc, 0x8, 0x2, 0x0, 0x0, 0x3, +0x7, 0xc, 0x16,0x1b,0x1f,0x2a,0x2f,0x33,0x3d,0x3d,0x39,0x2f,0x2b,0x28,0x28,0x28, +0x28,0x28,0x2, 0x0, 0x0, 0x0, 0x2, 0x4, 0x7, 0xc, 0xf, 0x13,0x1c,0x20,0x24,0x2d, +0x30,0x32,0x35,0x36,0x36,0x36,0x36,0x36,0x39,0x3d,0x42,0x48,0x4a,0x4b,0x4b,0x4b, +0x4b,0x4b,0x10,0xa2,0x46,0x55,0x32,0x2c,0x27,0x1c,0x16,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x2, 0x4, 0xd, 0x11,0x1a,0x1f,0x25,0x2f,0x33,0x3c,0x3d,0x34,0x2f,0x2a,0x21, +0x1d,0x1c,0x1c,0x1c,0x1c,0x1c,0x1, 0x0, 0x0, 0x0, 0x2, 0x6, 0xa, 0xe, 0x16,0x1a, +0x22,0x26,0x2b,0x31,0x32,0x35,0x36,0x38,0x3a,0x3b,0x3e,0x41,0x4a,0x4c,0x4d,0x4e, +0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x43,0x33,0x46,0x55,0x1a,0x13,0x10,0xd, 0xb, 0xa, +0xc, 0x11,0x16,0x20,0x25,0x29,0x2e,0x32,0x37,0x3c,0x3f,0x3c,0x38,0x33,0x2e,0x29, +0x24,0x1e,0x19,0xf, 0xb, 0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xb, 0x10,0x15,0x19, +0x1d,0x1e,0x1f,0x1e,0x1f,0x1f,0x20,0x21,0x24,0x29,0x2f,0x39,0x3e,0x41,0x44,0x47, +0x49,0x4b,0x4c,0x4e,0x4e,0x4f,0x4e,0x4d,0x4d,0x4d,0xa, 0x24,0x46,0x55,0x0, 0x1, +0x3, 0x5, 0x7, 0x8, 0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22, +0x24,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, +0x14,0x1b,0x23,0x28,0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53, +0x4e,0x47,0x40,0x3b,0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d, +0x54,0x55,0x40,0x39,0x38,0x36,0x35,0x33,0x31,0x2e,0x2c,0x2b,0x29,0x27,0x25,0x24, +0x22,0x1f,0x1d,0x1a,0x18,0x15,0x14,0x12,0xf, 0xc, 0x9, 0x7, 0x4, 0x2, 0x1, 0x0, +0x0, 0x0, 0x0, 0xd, 0x15,0x1d,0x23,0x2a,0x32,0x3b,0x43,0x48,0x50,0x57,0x5d,0x63, +0x68,0x65,0x5e,0x58,0x51,0x4a,0x45,0x3f,0x38,0x32,0x2b,0x26,0x1f,0x16,0x10,0x8, +0x4, 0x1, 0x6a,0xec,0x54,0x55,0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1, 0x2, 0x4, 0x5, 0x7, 0x9, 0xd, 0x10,0x13,0x18,0x1f,0x24,0x27,0x2b,0x2e,0x31, +0x34,0x36,0x39,0x3c,0x3e,0x40,0x0, 0x7, 0xf, 0x13,0x16,0x1a,0x1e,0x22,0x25,0x28, +0x2f,0x36,0x3b,0x3f,0x43,0x47,0x4b,0x4c,0x4c,0x4c,0x49,0x46,0x43,0x3f,0x3a,0x35, +0x32,0x2d,0x27,0x21,0x1d,0x1a,0xb5,0xd0,0x54,0x55,0x0, 0x1, 0x1, 0x1, 0x2, 0x3, +0x3, 0x4, 0x5, 0x9, 0xf, 0x16,0x1d,0x22,0x28,0x2d,0x30,0x32,0x34,0x37,0x39,0x3a, +0x3c,0x3d,0x3e,0x3e,0x3f,0x3f,0x3e,0x3e,0x3c,0x3a,0x22,0x2e,0x36,0x3f,0x46,0x4c, +0x51,0x56,0x5b,0x5e,0x60,0x5e,0x5c,0x58,0x53,0x4d,0x49,0x45,0x41,0x3a,0x35,0x31, +0x2d,0x27,0x23,0x1f,0x19,0x11,0xd, 0x8, 0x3, 0x0, 0x3b,0x38,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0xd, 0xd0,0x70,0x8f,0x0, 0xff,0xd0,0x2f,0x4, 0xa7, +0x24,0x87,0x2, 0xa9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x41,0x37,0x31,0x1, 0xd1,0x0, 0x32,0x0, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8, 0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x0, 0x1, 0x8, 0x8, 0x10,0x20,0x10,0x20,0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, +0x3, 0x0, 0x3, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, +0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, +0x0, 0xf, 0x0, 0x10,0x0, 0x11,0x0, 0x12,0x0, 0x13,0x0, 0x14,0x0, 0x15,0x0, 0x16, +0x0, 0x17,0x0, 0x18,0x0, 0x19,0x0, 0x1a,0x0, 0x1b,0x0, 0x1c,0x0, 0x1d,0x0, 0x1e, +0x0, 0x1f,0x0, 0x20,0x0, 0x21,0x0, 0x22,0x0, 0x23,0x0, 0x24,0x0, 0x25,0x0, 0x26, +0x0, 0x27,0x0, 0x28,0x0, 0x29,0x0, 0x2a,0x0, 0x2b,0x0, 0x2c,0x0, 0x2d,0x0, 0x2e, +0x0, 0x2f,0x0, 0x30,0x0, 0x31,0x0, 0x32,0x0, 0x33,0x0, 0x34,0x0, 0x35,0x0, 0x36, +0x0, 0x37,0x0, 0x38,0x0, 0x39,0x0, 0x3a,0x0, 0x3b,0x0, 0x3c,0x0, 0x3d,0x0, 0x3e, +0x0, 0x3f,0x0, 0x40,0x0, 0x41,0x0, 0x42,0x0, 0x43,0x0, 0x44,0x0, 0x45,0x0, 0x46, +0x0, 0x47,0x0, 0x48,0x0, 0x49,0x0, 0x4a,0x0, 0x4b,0x0, 0x4c,0x0, 0x4d,0x0, 0x4e, +0x0, 0x4f,0x0, 0x50,0x0, 0x51,0x0, 0x52,0x0, 0x53,0x0, 0x54,0x0, 0x55,0x0, 0x56, +0x0, 0x57,0x0, 0x58,0x0, 0x59,0x0, 0x5a,0x0, 0x5b,0x0, 0x5c,0x0, 0x5d,0x0, 0x5e, +0x0, 0x5f,0x0, 0x60,0x0, 0x61,0x0, 0x62,0x0, 0x63,0x0, 0x64,0x0, 0x65,0x0, 0x66, +0x0, 0x67,0x0, 0x68,0x0, 0x69,0x0, 0x6a,0x0, 0x6b,0x0, 0x6c,0x0, 0x6d,0x0, 0x6e, +0x0, 0x6f,0x0, 0x70,0x0, 0x71,0x0, 0x72,0x0, 0x73,0x0, 0x74,0x0, 0x75,0x0, 0x76, +0x0, 0x77,0x0, 0x78,0x0, 0x79,0x0, 0x7a,0x0, 0x7b,0x0, 0x7c,0x0, 0x7d,0x0, 0x7e, +0x0, 0x7f,0x0, 0x80,0x0, 0x81,0x0, 0x82,0x0, 0x83,0x0, 0x84,0x0, 0x85,0x0, 0x86, +0x0, 0x87,0x0, 0x88,0x0, 0x89,0x0, 0x8a,0x0, 0x8b,0x0, 0x8c,0x0, 0x8d,0x0, 0x8e, +0x0, 0x8f,0x0, 0x90,0x0, 0x91,0x0, 0x92,0x0, 0x93,0x0, 0x94,0x0, 0x95,0x0, 0x96, +0x0, 0x97,0x0, 0x98,0x0, 0x99,0x0, 0x9a,0x0, 0x9b,0x0, 0x9c,0x0, 0x9d,0x0, 0x9e, +0x0, 0x9f,0x0, 0xa0,0x0, 0xa1,0x0, 0xa2,0x0, 0xa3,0x0, 0xa4,0x0, 0xa5,0x0, 0xa6, +0x0, 0xa7,0x0, 0xa8,0x0, 0xa9,0x0, 0xaa,0x0, 0xab,0x0, 0xac,0x0, 0xad,0x0, 0xae, +0x0, 0xaf,0x0, 0xb0,0x0, 0xb1,0x0, 0xb2,0x0, 0xb3,0x0, 0xb4,0x0, 0xb5,0x0, 0xb6, +0x0, 0xb7,0x0, 0xb8,0x0, 0xb9,0x0, 0xba,0x0, 0xbb,0x0, 0xbc,0x0, 0xbd,0x0, 0xbe, +0x0, 0xbf,0x0, 0xc0,0x0, 0xc1,0x0, 0xc2,0x0, 0xc3,0x0, 0xc4,0x0, 0xc5,0x0, 0xc6, +0x0, 0xc7,0x0, 0xc8,0x0, 0xc9,0x0, 0xca,0x0, 0xcb,0x0, 0xcc,0x0, 0xcd,0x0, 0xce, +0x0, 0xcf,0x0, 0xd0,0x0, 0xd1,0x0, 0xd2,0x0, 0xd3,0x0, 0xd4,0x0, 0xd5,0x0, 0xd6, +0x0, 0xd7,0x0, 0xd8,0x0, 0xd9,0x0, 0xda,0x0, 0xdb,0x0, 0xdc,0x0, 0xdd,0x0, 0xde, +0x0, 0xdf,0x0, 0xe0,0x0, 0xe1,0x0, 0xe2,0x0, 0xe3,0x0, 0xe4,0x0, 0xe5,0x0, 0xe6, +0x0, 0xe7,0x0, 0xe8,0x0, 0xe9,0x0, 0xea,0x0, 0xeb,0x0, 0xec,0x0, 0xed,0x0, 0xee, +0x0, 0xef,0x0, 0xf0,0x0, 0xf1,0x0, 0xf2,0x0, 0xf3,0x0, 0xf4,0x0, 0xf5,0x0, 0xf6, +0x0, 0xf7,0x0, 0xf8,0x0, 0xf9,0x0, 0xfa,0x0, 0xfb,0x0, 0xfc,0x0, 0xfd,0x0, 0xfe, +0x0, 0xff,0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0xff, +0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, 0xf9,0x0, 0xf8,0x0, 0xf7, +0x0, 0xf6,0x0, 0xf5,0x0, 0xf4,0x0, 0xf3,0x0, 0xf2,0x0, 0xf1,0x0, 0xf0,0x0, 0xef, +0x0, 0xee,0x0, 0xed,0x0, 0xec,0x0, 0xeb,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, 0xe7, +0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, 0xdf, +0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, 0xd7, +0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, 0xcf, +0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xca,0x0, 0xc9,0x0, 0xc8,0x0, 0xc7, +0x0, 0xc6,0x0, 0xc5,0x0, 0xc4,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, 0xc0,0x0, 0xbf, +0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, 0xb8,0x0, 0xb7, +0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, 0xb0,0x0, 0xaf, +0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, 0xa8,0x0, 0xa7, +0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0xa3,0x0, 0xa2,0x0, 0xa1,0x0, 0xa0,0x0, 0x9f, +0x0, 0x9e,0x0, 0x9d,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, 0x99,0x0, 0x98,0x0, 0x97, +0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, 0x91,0x0, 0x90,0x0, 0x8f, +0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, 0x89,0x0, 0x88,0x0, 0x87, +0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, 0x81,0x0, 0x80,0x0, 0x7f, +0x0, 0x7e,0x0, 0x7d,0x0, 0x7c,0x0, 0x7b,0x0, 0x7a,0x0, 0x79,0x0, 0x78,0x0, 0x77, +0x0, 0x76,0x0, 0x75,0x0, 0x74,0x0, 0x73,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, 0x6f, +0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, 0x67, +0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, 0x5f, +0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, 0x57, +0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x52,0x0, 0x51,0x0, 0x50,0x0, 0x4f, +0x0, 0x4e,0x0, 0x4d,0x0, 0x4c,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, 0x48,0x0, 0x47, +0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, 0x40,0x0, 0x3f, +0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, 0x38,0x0, 0x37, +0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, 0x30,0x0, 0x2f, +0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x2b,0x0, 0x2a,0x0, 0x29,0x0, 0x28,0x0, 0x27, +0x0, 0x26,0x0, 0x25,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, 0x21,0x0, 0x20,0x0, 0x1f, +0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, 0x19,0x0, 0x18,0x0, 0x17, +0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, 0x11,0x0, 0x10,0x0, 0xf, +0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, 0x9, 0x0, 0x8, 0x0, 0x7, +0x0, 0x6, 0x0, 0x5, 0x0, 0x4, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x18,0x12,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6, 0x0, +0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, +0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x18,0x12,0x2, 0x5, 0x0, +0x0, 0x0, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x18,0x12,0x2, 0x5, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, +0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, +0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x18,0x12,0x2, 0x5, 0x2, 0x0, 0x0, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x1, 0xa, 0x1e,0x40,0x8, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x1, 0x9a,0x1, 0x36,0x1, +0x36,0x5, 0xdc,0x5, 0xdc,0x5, 0xdc,0x1, 0x90,0x1, 0x90,0xa, 0x0, 0x2, 0x0, 0x1, +0xa, 0x6, 0x21,0x3c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16,0x1, 0x0, 0x1, 0x87,0x1, 0x0, 0x9, +0x1, 0xd0,0x0, 0x1, 0x0, 0x15,0x1, 0x1, 0x4, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d,0x0, 0x0, 0x0, 0x0, 0x0, 0xff,0x0, +0x64,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0,0x1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x4, 0x0, 0x2, 0xd6, +0x1, 0x68,0x2d,0x2d,0x1, 0x68,0x1, 0x90,0x0, 0xb4,0x0, 0xb7,0x5, 0xa0,0x2, 0xd0, +0x2d,0x2d,0x1, 0x68,0x1, 0x68,0x0, 0xb4,0x0, 0xb4,0x10,0x0, 0xc8,0x2, 0x58,0x3, +0x20,0x2, 0xd0,0x7, 0xd0,0x1, 0x2c,0x0, 0x40,0x0, 0x4, 0x1, 0x5, 0x2, 0x2, 0x4, +0x4, 0x6, 0x80,0x0, 0xc8,0x13,0x88,0x10,0x3, 0x6, 0x1, 0x2c,0x2, 0x58,0x3, 0x20, +0x1f,0x40,0x28,0x1, 0x5e,0x2, 0xbc,0x0, 0x14,0x12,0x5, 0xf, 0x3, 0x34,0x1, 0x9a, +0x6, 0x68,0x0, 0x64,0x4, 0xa, 0x5, 0x0, 0x64,0x2, 0x72,0x0, 0x64,0x5, 0x3c,0x0, +0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0xc8,0x0, 0x48,0x0, 0x1e,0x0, 0x80,0x1, +0x6b,0x1, 0x68,0x0, 0x64,0x7, 0xd0,0x1, 0x68,0x1, 0x6b,0x0, 0x64,0x7, 0xd0,0x0, +0x0, 0x2, 0xd6,0x0, 0x0, 0x5, 0xa0,0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x9, 0xc4,0x1, +0x2c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24, +0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e, +0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff, +0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad, +0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74, +0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22, +0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10, +0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22, +0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, +0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22, +0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c, +0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x22,0xbf,0x9f, +0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x22,0xbf,0x30,0xd5,0x6, 0x9f,0x22,0x9f, +0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38, +0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39, +0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e, +0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, 0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18, +0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x7f, +0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8,0x78,0xfc,0xc2,0x26,0xc2, +0x27,0xc2,0x28,0xc2,0x1f,0xc2,0x20,0x75,0x12,0x0, 0xc2,0x2b,0xc2,0x2c,0xc2,0x2d, +0xc2,0x22,0xc2,0x23,0xc2,0x24,0x75,0x6c,0x0, 0xc2,0x2e,0xc2,0x16,0xc2,0x17,0xc2, +0x18,0xd2,0x19,0xd2,0x1a,0xc2,0xc, 0xc2,0xd, 0xc2,0xe, 0xc2,0xf, 0xc2,0x10,0xc2, +0x11,0xc2,0x12,0xc2,0x13,0xc2,0x14,0xc2,0x15,0xc2,0x2f,0xc2,0x30,0xd2,0x29,0xc2, +0x2a,0x75,0x1e,0x0, 0x75,0x1f,0x1, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x24,0x6a,0xb, +0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, +0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf, +0x2, 0x2f,0xf9,0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e,0x1b,0xf0,0x7a,0x2b,0xf0,0xb, +0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b,0xe4,0x79,0xef,0xff,0xfc,0x4d, +0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43,0x7f,0x10,0x80,0x7, 0x1b,0x44, +0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22,0xff,0x0, 0x1, 0x2, 0x0, 0xff, +0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff,0x7d,0x23,0xbe,0x24,0x0, 0x0, +0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22,0x0, 0x1, 0x4a,0x60,0x1, 0x0, +0x1, 0x4a,0x66,0x1, 0x0, 0x1, 0x4a,0x68,0x5, 0x0, 0x3, 0x4e,0x97,0x0, 0x0, 0x0, +0x0, 0x6, 0x4e,0x9a,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x4e,0xa0,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x29,0xfe,0x1, 0x0, 0x1, 0x78,0xbe,0x0, 0x0, 0x1, +0x78,0xbf,0x0, 0x0, 0x2, 0x77,0x8f,0x0, 0x0, 0x0, 0x1, 0x76,0xbc,0xff,0x0, 0xa, +0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x28,0xe6, +0x0, 0x0, 0x8, 0x29,0x83,0x5, 0x0, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0xc, 0x29, +0xb3,0x1, 0x3, 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x29, +0xff,0x0, 0x0, 0x1, 0x78,0x25,0x0, 0x0, 0x1, 0x78,0x26,0x0, 0x0, 0x1, 0x78,0x28, +0x0, 0x0, 0x2, 0x3, 0xfe,0x0, 0x0, 0x0, 0x1, 0x3, 0xc9,0x0, 0x0, 0x1, 0x78,0xc9, +0x0, 0x0, 0x1, 0x5c,0xc3,0xff,0x0, 0x1, 0x5c,0xdc,0x0, 0x0, 0x3c,0x5c,0xdd,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78,0x5d,0x19,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5d,0x91,0x0, 0x0, 0x2, 0x5d,0x92, +0x0, 0x0, 0x0, 0x4, 0x5d,0x94,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x62,0xde,0x0, 0x0, +0x2, 0x63,0x2f,0x0, 0x0, 0x0, 0x1, 0x78,0xd4,0x1, 0x0, 0x1, 0x78,0xd5,0x0, 0x0, +0x1e,0x0, 0x4e,0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10,0x12,0x14,0x16,0x18,0x1a, +0x1c,0x1e,0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30,0x32,0x34,0x36,0x38,0x3a, +0x3c,0x0, 0x1, 0x78,0x69,0x0, 0x0, 0x1, 0x78,0x85,0x1e,0x0, 0x1, 0x78,0xdd,0x0, +0x0, 0x2, 0x76,0xba,0x0, 0x0, 0x0, 0x6, 0x78,0xde,0x30,0x1f,0x50,0x11,0x20,0x10, +0x0, 0x1, 0x78,0xe4,0x34,0x0, 0x1, 0x76,0x3f,0x64,0x0, 0x1, 0x78,0xfb,0x0, 0x0, +0x1, 0x78,0x8d,0x0, 0x0, 0x1, 0x78,0x92,0x5, 0x0, 0x1, 0x78,0x96,0x4, 0x0, 0x1, +0x78,0x97,0x1, 0x0, 0x1, 0x78,0x9b,0x0, 0x0, 0x1, 0x78,0xe9,0x1, 0x0, 0x1, 0x78, +0xfc,0x1, 0x0, 0x1, 0x78,0xb1,0x0, 0x0, 0x2, 0x25,0xb3,0x25,0xb9,0x0, 0x1, 0x27, +0x49,0x2, 0x0, 0x1, 0x27,0x72,0x0, 0x0, 0x1, 0x77,0xe0,0xff,0x0, 0x1, 0x77,0xe1, +0x0, 0x0, 0x1, 0x77,0xe2,0x0, 0x0, 0x1, 0x77,0xe3,0x40,0x0, 0x1, 0x77,0xe4,0x40, +0x0, 0x4, 0x78,0xee,0x0, 0x0, 0x90,0x0, 0x0, 0x4, 0x3, 0xf2,0x0, 0x0, 0x94,0x0, +0x0, 0x4, 0x3, 0xf6,0x0, 0x0, 0x98,0x0, 0x0, 0x4, 0x3, 0xfa,0x0, 0x0, 0x9c,0x0, +0x0, 0x4, 0x1, 0x79,0x0, 0x0, 0x80,0x0, 0x0, 0x4, 0x78,0xf2,0x0, 0x0, 0x91,0x0, +0x0, 0x4, 0x78,0xf6,0x0, 0x0, 0x92,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe8,0x0, 0x51,0x0, 0x3, 0x3, 0x20,0x0, 0x50, +0x0, 0x3, 0x2, 0x58,0x0, 0x4e,0x0, 0x4, 0x1, 0xc2,0x0, 0x4b,0x0, 0x4, 0x1, 0x40, +0x0, 0x47,0x0, 0x4, 0x0, 0xc8,0x0, 0x44,0x0, 0x4, 0x0, 0x78,0x0, 0x3e,0x0, 0x5, +0x0, 0x64,0x0, 0x3c,0x0, 0x5, 0x12,0x6f,0xa2,0x7a,0xb3,0x78,0xb0,0xe4,0x7a,0xb3, +0x77,0x31,0x2, 0x29,0x4a,0xd2,0x1, 0x12,0x29,0x5a,0x74,0x1f,0x7a,0xb3,0x73,0xd4, +0x7a,0xb3,0x73,0xd5,0x22,0x12,0x3d,0xdb,0xd2,0x1, 0xe4,0x7a,0xb3,0x75,0x34,0x7a, +0xb3,0x75,0x35,0x6c,0xaa,0x12,0xc7,0x3, 0xbe,0xa0,0x3, 0x78,0xf8,0xe4,0x7a,0xb3, +0x75,0xa9,0x7a,0xb3,0x75,0x36,0x30,0x1, 0x3, 0x12,0x29,0x4a,0x22,0xca,0x3b,0xc2, +0x4, 0x12,0x3c,0x2, 0xc2,0xd, 0x30,0xc, 0x18,0xc2,0xc, 0x30,0xe, 0x4, 0xc2,0xe, +0x80,0x3, 0x12,0xd9,0xba,0x12,0x49,0x61,0x12,0x3d,0xf1,0x12,0x54,0x92,0x12,0x29, +0x45,0xd2,0x4, 0x12,0x3c,0x2, 0xc2,0x1, 0x12,0xd8,0xd7,0x30,0xf, 0x3c,0xc2,0xf, +0x12,0xe6,0xe5,0x7d,0x23,0x5e,0x24,0x0, 0x1, 0x68,0x2f,0x5e,0x34,0x0, 0x2, 0x68, +0x5, 0x12,0x4f,0xe2,0x80,0x11,0x75,0x1e,0x1, 0x74,0x1, 0x7a,0xb3,0x78,0x97,0x7f, +0x3, 0x12,0x37,0xe2,0x12,0x37,0xf5,0x12,0x3d,0xf1,0xc2,0x1, 0x12,0x29,0x5a,0xe5, +0x1e,0x12,0x3c,0x29,0x74,0x1f,0x7a,0xb3,0x73,0xd5,0xd2,0x1, 0x12,0xd8,0xd7,0xda, +0x3b,0x22,0x74,0x5, 0x7a,0xb3,0x78,0xe8,0x12,0x29,0x7d,0x7e,0xb3,0x73,0xd4,0x60, +0xd, 0x80,0x6, 0x12,0x2d,0x3d,0x12,0x29,0x7d,0x12,0x52,0x8c,0x50,0xf5,0x7e,0xb3, +0x73,0xd5,0x60,0xd, 0x80,0x6, 0x12,0x2d,0x3d,0x12,0x29,0x7d,0x12,0x52,0xf5,0x50, +0xf5,0x2, 0x2a,0x24,0x7e,0x63,0x78,0x97,0x7e,0x73,0x75,0x33,0x74,0x26,0xa5,0xbe, +0x3, 0x8, 0xac,0xb7,0x49,0x15,0x75,0x4b,0x80,0x6, 0xac,0xb7,0x49,0x15,0x75,0x47, +0x7d,0x21,0x7a,0x27,0x4a,0x6f,0x30,0x16,0x10,0x7e,0x24,0x0, 0x27,0xca,0x29,0x12, +0xe6,0x5, 0x12,0x24,0x13,0x1b,0xfd,0xc2,0x16,0x22,0x7e,0xa3,0x77,0x35,0xbe,0xa0, +0x5, 0x78,0x8, 0x74,0x1, 0x7a,0xb3,0x77,0x35,0x80,0x1b,0xbe,0xa0,0x4, 0x78,0x1c, +0x74,0x1, 0x7a,0xb3,0x77,0x35,0x7e,0x34,0x21,0x57,0x12,0x2a,0xa9,0x12,0x2d,0x41, +0x12,0x29,0x45,0x12,0x29,0xf2,0x74,0x2, 0x7a,0xb3,0x77,0x35,0x22,0x7a,0x37,0x6f, +0x42,0xe4,0x7a,0xb3,0x78,0xfa,0x7e,0x34,0x21,0x67,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x30,0x7a,0x37,0x6f,0x4c,0x7e,0x34,0x21,0x69,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30, +0x22,0x90,0x21,0x51,0xe4,0x93,0x7a,0xb3,0x6f,0x3e,0x12,0x4e,0xb7,0x7e,0x34,0x21, +0x5b,0x12,0x2a,0xa9,0x7a,0x37,0x6f,0x40,0x7e,0x34,0x21,0x5d,0x12,0x2a,0xa9,0x7a, +0x37,0x6f,0x42,0x7e,0x34,0x21,0x5f,0x12,0x2a,0xa9,0x12,0x2c,0x17,0x7a,0x37,0x6f, +0x44,0x7e,0x34,0x21,0x61,0x12,0x2a,0xa9,0x12,0xe6,0xc1,0x12,0x2a,0xa9,0x7a,0x37, +0x6f,0x48,0x7e,0x34,0x21,0x65,0x12,0x2a,0xa9,0x12,0x2c,0x17,0x7a,0x37,0x6f,0x4a, +0x12,0x2a,0x96,0x12,0x2c,0x17,0x7a,0x37,0x6f,0x4e,0x90,0x21,0x9b,0xe4,0x93,0x7a, +0xb3,0x6f,0x52,0x90,0x21,0x54,0xe4,0x93,0x7a,0xb3,0x6f,0x53,0x7e,0x34,0x21,0x55, +0x12,0x2a,0xa9,0x7a,0x37,0x6f,0x54,0x7e,0x34,0x21,0x6b,0x12,0x2a,0xa9,0x7a,0x37, +0x6f,0x50,0xe4,0x7a,0xb3,0x6f,0x56,0x7a,0xb3,0x6f,0x57,0x7a,0xb3,0x6f,0x58,0x7a, +0xb3,0x6f,0x59,0x7a,0xb3,0x6f,0x5a,0x7a,0xb3,0x6f,0x5b,0x7a,0xb3,0x6f,0x5c,0x7a, +0xb3,0x6f,0x5d,0x7a,0xb3,0x6f,0x5e,0x7a,0xb3,0x6f,0x5f,0x22,0x7e,0x34,0x21,0x5b, +0x12,0x2a,0xa9,0x12,0x4c,0x5b,0x7a,0x73,0x76,0xbf,0x7e,0x34,0x21,0x5d,0x12,0x2a, +0xa9,0x12,0x2c,0x45,0x7a,0x73,0x76,0xc0,0x7e,0x34,0x21,0x63,0x12,0x2a,0xa9,0x12, +0x2c,0x45,0x7a,0x73,0x76,0xc1,0x7e,0x34,0x21,0x63,0x12,0x2a,0xa9,0x12,0x2c,0x45, +0x7a,0x73,0x76,0xc2,0x7e,0x34,0x21,0x6b,0x12,0x2a,0xa9,0x12,0x4c,0x5b,0x7a,0x73, +0x76,0xc4,0x7e,0x34,0x0, 0x6a,0xca,0x39,0x7e,0x34,0x21,0x6f,0x7e,0x24,0x0, 0xff, +0x7e,0x8, 0x76,0xc5,0x12,0x24,0x13,0x1b,0xfd,0x22,0x7e,0xb3,0x77,0xf, 0xb4,0x1, +0x5, 0x12,0x2c,0x1e,0x80,0xf, 0x7e,0xb3,0x6f,0x58,0xb4,0x1, 0x5, 0x12,0x4e,0x9a, +0x80,0x3, 0x12,0x6d,0xff,0x7e,0xb3,0x78,0xfa,0x70,0x17,0x7e,0xb3,0x6f,0x31,0x70, +0x11,0x7e,0xb3,0x6f,0x58,0x70,0xb, 0x7e,0x34,0x21,0x6d,0x12,0x2a,0xa9,0x7a,0x37, +0x6f,0x40,0x12,0xe7,0x20,0x68,0x11,0x7e,0x34,0x21,0x61,0x12,0x2a,0xa9,0x12,0xe6, +0xc1,0x12,0x2a,0xa9,0x7a,0x37,0x6f,0x48,0x7e,0x34,0x21,0x5f,0x12,0x2a,0xa9,0x12, +0x2c,0x17,0x7a,0x37,0x6f,0x44,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7e,0x34, +0x21,0x5b,0x12,0x2a,0xa9,0x12,0x4e,0xb3,0x7e,0x34,0x21,0x5d,0x12,0x2a,0xa9,0x12, +0x2a,0x8d,0x12,0x4c,0x4d,0x12,0x2c,0x3d,0x7a,0x73,0x76,0xc0,0x22,0x7a,0x73,0x76, +0xbf,0x7e,0x37,0x6f,0x42,0xe, 0x34,0xe, 0x34,0xe, 0x34,0xe, 0x34,0xe, 0x34,0x22, +0x30,0x2b,0xf, 0x7e,0xb3,0x77,0x2d,0xb4,0x1, 0x8, 0x74,0x1, 0x7a,0xb3,0x73,0xd3, +0x80,0x3, 0x12,0x48,0x8c,0xc2,0x2b,0x7e,0xb3,0x78,0xb0,0xb4,0x1, 0x2, 0x80,0x2, +0xa1,0x4, 0x12,0x70,0xdc,0x12,0x51,0xc7,0x12,0x44,0x47,0x12,0x29,0xf2,0x7e,0x34, +0x21,0x59,0x12,0x2a,0xa9,0x12,0x2d,0x41,0x12,0x5b,0x38,0x7e,0xb3,0x25,0xae,0x70, +0x2, 0x80,0x58,0x12,0xc8,0xdc,0x7e,0xb3,0x76,0xe3,0xb4,0x1, 0x2, 0xd2,0x86,0x7e, +0xb3,0x6f,0x57,0x70,0x6, 0x12,0x2b,0xba,0x12,0xe1,0xd9,0x12,0x5d,0x5c,0x7e,0xb3, +0x25,0xae,0x70,0x2, 0x80,0x35,0x74,0x1, 0x12,0x2d,0x19,0x12,0x2d,0xe7,0x12,0xa9, +0x6d,0x12,0xa7,0xc3,0x74,0x2, 0x12,0x2d,0x19,0x12,0xaf,0xd8,0x74,0x3, 0x12,0x2d, +0x19,0x12,0x7a,0x15,0x74,0x4, 0x12,0x2d,0x19,0x12,0x6f,0xf2,0x12,0xca,0x76,0x12, +0x7f,0xc, 0x12,0x79,0x6c,0x7e,0xb3,0x25,0xae,0x70,0xb, 0x12,0xc8,0x59,0x12,0x68, +0xb2,0x12,0xdd,0xf1,0x81,0x67,0x12,0x88,0x65,0x12,0x70,0xb6,0x12,0x77,0x18,0x12, +0x68,0xbb,0x81,0x67,0xd2,0x4, 0x12,0x3c,0x96,0x2, 0x2d,0xc, 0x12,0x4f,0xf0,0x7e, +0xb3,0x76,0xe3,0xb4,0x1, 0x2, 0xd2,0x86,0x22,0x1b,0xb1,0x68,0x10,0x14,0x68,0x13, +0x14,0x68,0x16,0x24,0x3, 0x78,0x15,0xe4,0x7a,0xb3,0x6f,0x3b,0x22,0x12,0x0, 0xa, +0x2, 0xc0,0x15,0x12,0xb6,0x58,0x2, 0x90,0xd4,0x2, 0xc0,0xde,0x22,0x7e,0x34,0x9, +0xc4,0x6d,0x22,0x7a,0x27,0x78,0x9f,0x7a,0x37,0x78,0xa1,0x22,0x12,0x48,0x4e,0x7e, +0xb3,0x78,0xb0,0xb4,0x3, 0x7b,0x12,0x3d,0x44,0x12,0x29,0xf2,0x12,0x2d,0x3d,0x7e, +0xb3,0x77,0x31,0x30,0xe7,0x66,0x7e,0xb3,0x77,0x42,0x70,0x5, 0xc2,0x4, 0x12,0x3c, +0x96,0x12,0x29,0x7d,0x30,0x11,0x8, 0xc2,0x11,0x12,0x29,0x55,0x12,0x3b,0xdc,0x7e, +0xb3,0x77,0x42,0x70,0x5, 0x12,0x99,0x6, 0x80,0x6, 0x12,0x5b,0x38,0x12,0x99,0x1d, +0x7e,0xb3,0x25,0xae,0x70,0x5, 0x12,0x68,0xb2,0x80,0xb4,0x7e,0xb3,0x73,0xd3,0xb4, +0x1, 0x17,0x12,0xc8,0xdc,0x74,0x2, 0x12,0x4e,0xc1,0x12,0xe1,0xd9,0x12,0x46,0xeb, +0x12,0xd3,0x89,0x12,0x5d,0x5c,0x12,0x2d,0xe7,0x12,0x69,0x3a,0x7e,0xb3,0x77,0x42, +0x70,0xa, 0x7e,0xb3,0x77,0x31,0x54,0x7f,0x7a,0xb3,0x77,0x31,0x12,0x68,0x98,0xa1, +0x4f,0xd2,0x2b,0xd2,0x4, 0x12,0x3c,0x96,0x2, 0x2d,0xdb,0xe4,0x7a,0xb3,0x78,0xe5, +0x6d,0x33,0x7a,0x37,0x78,0xe6,0x22,0xc2,0x2d,0x7e,0xb3,0x6f,0x56,0x70,0x3, 0x12, +0xd1,0xb5,0x12,0x6e,0x17,0x12,0x6f,0x32,0x12,0x6e,0x17,0x12,0x6e,0x8d,0x12,0x6e, +0x17,0x12,0xac,0x5f,0x12,0x6e,0x17,0x12,0x99,0x56,0x12,0x6e,0x17,0x2, 0x2e,0x10, +0xca,0x3b,0xc2,0x0, 0x7e,0xd3,0x6d,0x93,0xa, 0x3d,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6c,0x9, 0x7e,0x8, 0x63,0x6d,0x12,0x24,0x13,0x1b,0xfd,0x6c,0x11,0x75,0x27,0x0, +0x6c,0xcc,0xc1,0xea,0x7e,0x44,0x3, 0xff,0x7e,0xe0,0xff,0x6c,0xff,0x80,0x5a,0x7c, +0xbf,0x12,0x6e,0x5, 0x60,0x51,0x12,0xe6,0xdc,0xbe,0x0, 0xff,0x68,0x49,0x9, 0x5, +0x63,0x6e,0xa, 0x10,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x3, 0x78,0x2d,0xa, 0x30,0x12, +0xa3,0x30,0x8, 0x4, 0x9d,0x31,0x80,0x4, 0x6d,0x33,0x9d,0x32,0x12,0xe6,0xdc,0xa, +0xf0,0x74,0x2, 0xac,0xbc,0x9, 0x5, 0x78,0x2c,0xa, 0x10,0x7d,0x21,0x9d,0x2f,0xbe, +0x24,0x0, 0x0, 0x8, 0x4, 0x9d,0x1f,0x80,0x4, 0x6d,0x11,0x9d,0x12,0x2d,0x13,0xbd, +0x41,0x28,0x4, 0x7d,0x41,0x7c,0xef,0xb, 0xf0,0xbc,0xdf,0x38,0xa2,0xbe,0xe0,0xff, +0x68,0x46,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x63,0x6d,0x9, 0x73,0x63,0x6e,0x12, +0x9b,0x6a,0x7d,0x13,0x74,0x2, 0xac,0xbe,0x9, 0xb5,0x63,0x6d,0x12,0xa7,0xe9,0xbd, +0x13,0x48,0x25,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0x3, 0x63,0x6d,0x7e,0xa1,0x27,0x74, +0x2, 0xa4,0x19,0x5, 0x63,0xa9,0x9, 0x3, 0x63,0x6e,0x19,0x5, 0x63,0xaa,0x74,0xff, +0x19,0xb3,0x63,0x6d,0xb, 0x10,0x5, 0x27,0xb, 0xc0,0x7e,0x3, 0x78,0x68,0xbc,0xc, +0x28,0x2, 0xc1,0x34,0x7c,0xc1,0x80,0x76,0x6d,0x0, 0x7e,0xe0,0xff,0x6c,0xff,0x80, +0x40,0x7c,0xbf,0x12,0x6e,0x5, 0x60,0x37,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xb1,0x63, +0x6d,0xbe,0xb0,0xff,0x68,0x29,0x9, 0x71,0x63,0x6e,0x12,0x9b,0x6a,0x7d,0x43,0xc2, +0x0, 0xbd,0x4, 0x58,0x2, 0xd2,0x0, 0x30,0x0, 0x15,0x7e,0x70,0x2, 0xac,0x7f,0x9, +0xb3,0x63,0x6d,0xf5,0x28,0x9, 0xb3,0x63,0x6e,0xf5,0x29,0x7d,0x4, 0x7c,0xef,0xb, +0xf0,0xbc,0xdf,0x38,0xbc,0xbe,0xe0,0xff,0x68,0x22,0x7e,0xa1,0x28,0x7e,0x31,0x27, +0x74,0x2, 0xac,0x3b,0x19,0xa1,0x63,0xa9,0xe5,0x29,0x19,0xb1,0x63,0xaa,0x7e,0xa0, +0xff,0x7e,0x30,0x2, 0xac,0x3e,0x19,0xa1,0x63,0x6d,0x5, 0x27,0xb, 0xc0,0x90,0x21, +0x51,0xe4,0x93,0xbc,0xbc,0x38,0x81,0x90,0x21,0x52,0xe4,0x93,0x7c,0xab,0x74,0x2, +0xa4,0xca,0x59,0x7e,0x18,0x63,0xa9,0x7e,0x8, 0x63,0x6d,0x12,0x24,0x13,0x1b,0xfd, +0x7e,0xd1,0x27,0x12,0x73,0x78,0x74,0x2, 0xac,0x7b,0x7e,0x8, 0x78,0x2c,0x74,0xff, +0x12,0x24,0x38,0xbe,0xd0,0x0, 0x28,0x37,0xa, 0x3d,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x63,0x6d,0x7e,0x8, 0x6c,0x9, 0x12,0x24,0x13,0x1b,0xfd,0xa, 0x3d,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x63,0x6d,0x7e,0x8, 0x78,0x2c,0x12,0x24,0x13,0x1b,0xfd,0x6c,0xcc, +0x80,0x9, 0xd2,0x2, 0x7c,0xbc,0x12,0x6e,0x5b,0xb, 0xc0,0xbc,0xdc,0x38,0xf3,0x7a, +0xd3,0x78,0x68,0x7a,0xd3,0x6d,0x93,0x90,0x21,0x51,0xe4,0x93,0xbe,0xb3,0x6d,0x93, +0x50,0x4, 0x7a,0xb3,0x6d,0x93,0xda,0x3b,0x22,0x12,0x71,0x41,0x12,0x2b,0x5c,0x12, +0x72,0xcc,0x12,0x30,0x1e,0x12,0x29,0x36,0x7e,0xb3,0x76,0xe6,0x24,0xfd,0x68,0x9, +0xb, 0xb1,0x78,0xf4,0x12,0x2c,0x50,0x80,0xef,0x12,0x2d,0x4c,0x80,0xea,0x12,0x3e, +0xc0,0x12,0xd9,0xba,0x12,0x0, 0x26,0x2, 0x30,0x2a,0xca,0xf8,0x12,0xda,0xb6,0x7e, +0xf0,0x1, 0x7c,0xbf,0x12,0x30,0x49,0xb, 0xf0,0xbe,0xf0,0x4, 0x78,0xf4,0xe5,0x1e, +0x70,0x4, 0xe4,0x12,0x30,0x49,0xda,0xf8,0x22,0xca,0x79,0x7c,0xeb,0xbe,0xe0,0x4, +0x40,0x2, 0x21,0x1f,0x12,0x67,0xf1,0xbe,0xf0,0x3, 0x40,0x2, 0x21,0x1f,0x74,0x2, +0xac,0xbe,0x9, 0xb5,0x29,0x84,0x54,0x3f,0xa, 0x3b,0x74,0x2c,0xac,0xbf,0x59,0x35, +0x0, 0xf5,0x74,0x2, 0xac,0xbe,0x9, 0xb5,0x29,0x83,0x54,0x1f,0x7c,0x6b,0x6c,0x77, +0x12,0x31,0x24,0x74,0x2c,0xac,0xbf,0x59,0x35,0x0, 0xf7,0x12,0x33,0xdf,0x74,0x1, +0x7e,0x70,0x27,0xac,0x7e,0x12,0x37,0xdb,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x31,0x50, +0x7e,0x70,0x27,0xac,0x7e,0x12,0x37,0xfc,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x38,0x79, +0x74,0x27,0xac,0xbe,0x9, 0x75,0x28,0xe7,0x12,0x31,0x22,0x12,0xd, 0xd3,0x7e,0x30, +0x2c,0xac,0x3f,0x12,0x35,0xad,0x74,0x27,0xac,0xbe,0x9, 0x75,0x28,0xe8,0x12,0x31, +0x22,0x12,0xd, 0xe5,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x35,0xad,0x74,0xa, 0xac,0xbe, +0x12,0x33,0xfa,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x31,0x50,0x74,0xa, 0xac,0xbe,0x12, +0x37,0xea,0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14,0x1, 0x9, 0x6d,0x0, 0x74,0x27,0xac, +0xbe,0x9, 0xb5,0x28,0xea,0x12,0xc, 0xaa,0xe4,0x12,0x67,0x91,0x7e,0x70,0xb5,0xac, +0x7f,0x2e,0x34,0x1, 0x0, 0x12,0x33,0xdf,0x7e,0x24,0x0, 0x16,0x12,0xc, 0xcc,0xda, +0x79,0x22,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x22,0x7e,0x30,0x2c,0xac,0x3e, +0x2e,0x14,0x1, 0x1, 0x6d,0x0, 0x74,0xa, 0xac,0xbf,0x49,0x35,0x29,0x93,0x49,0x25, +0x29,0x91,0x12,0x9, 0xad,0x7d,0x36,0x2e,0x34,0x0, 0x6, 0x7e,0x30,0x2c,0xac,0x3e, +0x2e,0x14,0x1, 0x1, 0x6d,0x0, 0x22,0x7e,0xb3,0x77,0x63,0x12,0x34,0x9, 0x7e,0x37, +0x4a,0x6d,0x4e,0x60,0x1, 0x7a,0x37,0x4a,0x6d,0x4e,0x70,0x20,0x7a,0x37,0x4a,0x6d, +0xca,0x3b,0x7e,0xf3,0x78,0x97,0x7e,0x30,0x27,0xac,0x3f,0x9, 0xb1,0x28,0xe7,0xf5, +0x27,0x9, 0xb1,0x28,0xe8,0xf5,0x28,0x7e,0x4, 0x0, 0x27,0xca,0x9, 0x2e,0x14,0x28, +0xe7,0x6d,0x0, 0x7e,0x18,0x77,0x62,0x12,0x24,0x13,0x1b,0xfd,0x74,0x27,0xac,0xbf, +0x9, 0xe5,0x28,0xeb,0x7e,0xd0,0xb5,0xac,0xde,0x2e,0x64,0x1, 0x0, 0xe4,0x12,0x67, +0x91,0x12,0x33,0x92,0x5e,0x24,0x1, 0x0, 0x68,0xc, 0x5e,0x60,0xfe,0x7a,0x37,0x4a, +0x6d,0x7c,0xbf,0x12,0x38,0x1f,0x12,0x33,0x92,0x5e,0x24,0x0, 0x1, 0x68,0x2e,0x5e, +0x70,0xfe,0x7a,0x37,0x4a,0x6d,0x7e,0xb3,0x77,0x62,0x12,0x38,0x7, 0x50,0xc, 0x7e, +0xb3,0x77,0x62,0x12,0x38,0x80,0x12,0x35,0xc3,0x80,0x12,0x7e,0xa1,0x27,0x7e,0x70, +0x27,0xac,0x7f,0x19,0xa3,0x28,0xe7,0xe5,0x27,0x7a,0xb3,0x77,0x62,0x12,0x33,0x92, +0x5e,0x24,0x0, 0x2, 0x68,0x37,0x5e,0x70,0xfd,0x7a,0x37,0x4a,0x6d,0x7e,0xb3,0x77, +0x63,0x12,0xcf,0xd6,0x50,0x15,0x7e,0xb3,0x77,0x63,0x12,0x39,0x13,0x50,0xc, 0x7e, +0xb3,0x77,0x63,0x12,0x34,0x9, 0x12,0x35,0xc3,0x80,0x12,0x7e,0xa1,0x28,0x7e,0x70, +0x27,0xac,0x7f,0x19,0xa3,0x28,0xe8,0xe5,0x28,0x7a,0xb3,0x77,0x63,0x12,0x33,0x92, +0x5e,0x24,0x0, 0x4, 0x68,0x2a,0x5e,0x70,0xfb,0x12,0x33,0x99,0x7e,0x30,0x2c,0xac, +0x3e,0x12,0x33,0xe4,0x74,0x1, 0x7e,0x70,0x27,0xac,0x7f,0x12,0x37,0xdb,0x12,0x33, +0xeb,0x12,0x31,0x2b,0x12,0x36,0xa5,0x12,0x35,0xb4,0x12,0x37,0xd4,0x12,0x68,0x42, +0x12,0x33,0x92,0x5e,0x24,0x0, 0x8, 0x68,0xe, 0x5e,0x70,0xf7,0x7a,0x37,0x4a,0x6d, +0x7e,0xb3,0x77,0x65,0x12,0x38,0xcc,0x12,0x33,0x92,0x5e,0x24,0x0, 0x10,0x68,0xc, +0x5e,0x70,0xef,0x12,0x33,0xa0,0x12,0x31,0x2b,0x12,0x36,0xa5,0x12,0x33,0x92,0x5e, +0x24,0x0, 0x20,0x68,0x37,0x5e,0x70,0xdf,0x7a,0x37,0x4a,0x6d,0x4e,0x60,0x2, 0x12, +0x33,0x99,0x12,0x33,0xeb,0x12,0x31,0x4b,0x74,0xa, 0xac,0xbf,0x12,0x37,0xea,0x12, +0x31,0x4b,0x7e,0x70,0x27,0xac,0x7f,0x12,0x37,0xfc,0x7c,0xbf,0x12,0xdd,0xfd,0x12, +0x35,0xb4,0x12,0x31,0x45,0x7e,0x24,0x0, 0x10,0x12,0xc, 0xcc,0x12,0x33,0x92,0x5e, +0x24,0x0, 0x40,0x68,0x17,0x5e,0x70,0xbf,0x7a,0x37,0x4a,0x6d,0x12,0x3e,0xb3,0x78, +0x5, 0x12,0x37,0x6b,0x80,0x3, 0x12,0x37,0x60,0x12,0x4c,0x66,0x12,0x33,0x92,0x5e, +0x24,0x0, 0x80,0x68,0xa, 0x5e,0x70,0x7f,0x7a,0x37,0x4a,0x6d,0x12,0x37,0x9e,0x12, +0x33,0x92,0x5e,0x24,0x2, 0x0, 0x68,0x3b,0x5e,0x60,0xfd,0x7a,0x37,0x4a,0x6d,0x74, +0x27,0xac,0xbf,0x49,0xe5,0x28,0xee,0xb, 0xe4,0x7e,0xf7,0x77,0x8b,0xad,0xef,0xbe, +0x78,0x7f,0xff,0x28,0x4, 0x7e,0x78,0x7f,0xff,0x7e,0x8, 0x0, 0x83,0x12,0x36,0xac, +0x7e,0x8, 0x0, 0xbf,0x12,0x36,0xac,0x7e,0x8, 0x0, 0x83,0x7d,0x3f,0x12,0xde,0xb9, +0x12,0xc, 0xcc,0x12,0x33,0x92,0x5e,0x24,0x4, 0x0, 0x68,0xe, 0x5e,0x60,0xfb,0x7a, +0x37,0x4a,0x6d,0x7e,0xb3,0x77,0x3b,0x12,0xce,0xff,0x12,0x33,0x92,0x5e,0x24,0x10, +0x0, 0x68,0x7, 0x5e,0x60,0xef,0x7a,0x37,0x4a,0x6d,0x12,0x33,0x92,0x5e,0x24,0x20, +0x0, 0x68,0xc, 0x5e,0x60,0xdf,0x7a,0x37,0x4a,0x6d,0x7c,0xbf,0x12,0x4f,0xfa,0xda, +0x3b,0x22,0x7e,0x37,0x4a,0x6d,0x7d,0x23,0x22,0x7a,0x37,0x4a,0x6d,0x4e,0x60,0x10, +0x7a,0x37,0x4a,0x6d,0x7c,0xbf,0xca,0xf8,0x7c,0xfb,0x12,0x35,0xc3,0x7e,0xa3,0x77, +0x64,0x7e,0x70,0x27,0xac,0x7f,0x19,0xa3,0x28,0xe9,0x6c,0xaa,0x7e,0x50,0x2, 0xac, +0x5a,0x49,0x42,0x77,0x69,0x7e,0x70,0x27,0xac,0x7f,0x2d,0x32,0x59,0x43,0x28,0xee, +0xb, 0xa0,0xbe,0xa0,0x10,0x40,0xe5,0x7c,0xbf,0x12,0x66,0xf8,0xda,0xf8,0x22,0x7e, +0x30,0x2c,0xac,0x3f,0x2e,0x14,0x0, 0xf5,0x6d,0x0, 0x22,0x7e,0x30,0x2c,0xac,0x3e, +0x2e,0x14,0x0, 0xf9,0x6d,0x0, 0x74,0xa, 0xac,0xbf,0x9, 0xb5,0x29,0x8b,0x2, 0xd, +0x73,0x74,0x26,0xac,0xbf,0x9, 0xb5,0x75,0x37,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x74, +0x27,0xac,0xbe,0x19,0xf5,0x28,0xe8,0xb, 0xe0,0xbe,0xe0,0x4, 0x78,0xf1,0x7e,0x64, +0x1, 0x0, 0x6c,0xee,0x7e,0x30,0x2c,0xac,0x3e,0x12,0x35,0xad,0xa, 0x3f,0x12,0x31, +0x24,0x12,0xd, 0xe5,0x12,0x35,0xb4,0x12,0x38,0xc2,0x40,0xe8,0xda,0x3b,0x22,0xca, +0x3b,0x7e,0x73,0x6f,0x68,0x7a,0x73,0x63,0x6d,0x7e,0x73,0x6f,0x69,0x7a,0x73,0x63, +0x6e,0x7e,0xd3,0x77,0x63,0x7e,0xe3,0x77,0x5a,0x7e,0xf3,0x77,0x5b,0x7e,0x8, 0x63, +0x6f,0x7e,0x34,0x0, 0x8, 0xe4,0x12,0x24,0x38,0x7e,0x34,0x0, 0x20,0xca,0x39,0x7e, +0x18,0x77,0x69,0x7e,0x8, 0x63,0x77,0x12,0x24,0x13,0x1b,0xfd,0x74,0x5, 0x7a,0xb3, +0x77,0x63,0xe4,0x7a,0xb3,0x77,0x5a,0x74,0x2, 0x7a,0xb3,0x77,0x5b,0x6c,0xcc,0x7e, +0x34,0x0, 0x2, 0x74,0x2, 0xac,0xbc,0x59,0x35,0x77,0x69,0xb, 0xc0,0xbe,0xc0,0x10, +0x78,0xf1,0x12,0x31,0x57,0x6c,0xcc,0x4c,0xcc,0x78,0xd, 0x7e,0xb3,0x73,0xda,0x54, +0x1, 0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x12,0xbe,0xc0,0x1, 0x78,0x14,0x7e,0xb3,0x73, +0xda,0x54,0x2, 0x1e,0xb0,0xb4,0x1, 0x9, 0x74,0x4, 0x7a,0xb3,0x6f,0x68,0xe4,0x80, +0x34,0xbe,0xc0,0x2, 0x78,0x16,0x7e,0xb3,0x73,0xda,0x54,0x4, 0x1e,0xb0,0x1e,0xb0, +0xb4,0x1, 0x9, 0xe4,0x7a,0xb3,0x6f,0x68,0x74,0x1, 0x80,0x19,0xbe,0xc0,0x3, 0x78, +0x46,0x7e,0xb3,0x73,0xda,0x54,0x8, 0xc4,0x23,0x54,0x1f,0xb4,0x1, 0x39,0xe4,0x7a, +0xb3,0x6f,0x68,0x74,0x4, 0x7a,0xb3,0x6f,0x69,0x7e,0x34,0x21,0x57,0x12,0x2a,0xa9, +0x12,0x2d,0x41,0x74,0x1f,0x7a,0xb3,0x73,0xd4,0x12,0x29,0xf2,0x7e,0x73,0x78,0x97, +0xa, 0x7, 0x12,0x35,0xa6,0xa, 0x3c,0x2e,0x37,0x73,0xd6,0x2d,0x31,0x9, 0x73,0x4e, +0xa8,0xa, 0x2c,0x19,0x72,0x63,0x6f,0xb, 0xc0,0xbe,0xc0,0x4, 0x68,0x2, 0x81,0xa7, +0x6c,0xcc,0xa, 0x3c,0x9, 0x73,0x63,0x6f,0x12,0x77,0x99,0x12,0x35,0xa6,0xa, 0x2c, +0x2e,0x27,0x73,0xd6,0x2d,0x21,0x19,0x72,0x4e,0xa8,0xb, 0xc0,0xbe,0xc0,0x4, 0x40, +0xe1,0x7e,0x73,0x63,0x6d,0x7a,0x73,0x6f,0x68,0x7e,0x73,0x63,0x6e,0x7a,0x73,0x6f, +0x69,0x7a,0xd3,0x77,0x63,0x7a,0xe3,0x77,0x5a,0x7a,0xf3,0x77,0x5b,0x7e,0x34,0x0, +0x20,0xca,0x39,0x7e,0x18,0x63,0x77,0x7e,0x8, 0x77,0x69,0x12,0x24,0x13,0x1b,0xfd, +0x12,0x31,0x57,0xe4,0x7a,0xb3,0x77,0x60,0x7a,0xb3,0x77,0x5f,0xda,0x3b,0x22,0x7e, +0x35,0x29,0x7c,0x67,0xa, 0xf, 0x7e,0x14,0x2, 0x3c,0xad,0x10,0x22,0x2e,0x14,0x0, +0xf9,0x6d,0x0, 0x22,0x7d,0x36,0xb, 0x35,0x74,0x2c,0xac,0xbe,0x49,0x25,0x0, 0xf9, +0x2, 0x0, 0x2e,0x12,0xe7,0x18,0x68,0x3a,0xe5,0x1e,0x60,0x36,0x7e,0xb3,0x77,0x62, +0x7e,0x73,0x77,0x63,0x12,0xd8,0xfe,0x7d,0x23,0x7e,0x34,0x0, 0x3, 0xad,0x32,0x7e, +0x24,0x0, 0xa, 0x8d,0x32,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x77,0x69, +0xbd,0x13,0x28,0x7, 0x59,0x32,0x77,0x69,0x12,0xe6,0xae,0xb, 0xa0,0xbe,0xa0,0x10, +0x78,0xe5,0x22,0x12,0x36,0x9c,0x7d,0x1, 0x5e,0x4, 0x0, 0x1, 0x78,0xa, 0xe4,0x7a, +0xb3,0x78,0x97,0x75,0x1e,0x0, 0x80,0x2f,0x5e,0x14,0x0, 0x2, 0x78,0x5, 0x12,0x36, +0xb3,0x80,0x24,0x7e,0xb3,0x78,0x97,0xbe,0xb0,0x1, 0x68,0x2, 0x70,0x19,0x12,0x36, +0x93,0x68,0xb, 0x74,0x2, 0x7a,0xb3,0x78,0x97,0x75,0x1e,0x2, 0x80,0x9, 0x74,0x3, +0x7a,0xb3,0x78,0x97,0x75,0x1e,0x3, 0x74,0x1, 0x12,0x30,0x49,0x7e,0xb3,0x78,0x97, +0x24,0x0, 0x68,0x2d,0x24,0xfd,0x68,0x16,0x4, 0x78,0x2a,0x12,0x36,0x9c,0x5e,0x14, +0x0, 0x2, 0x68,0x2e,0x12,0x36,0x93,0x78,0x29,0x74,0x1, 0x2, 0x5, 0xbc,0x12,0x36, +0x9c,0x5e,0x14,0x0, 0x2, 0x68,0x1b,0x12,0x36,0x93,0x68,0x16,0x74,0x1, 0x2, 0x5, +0x30,0xe4,0x2, 0x30,0x49,0x7e,0xf, 0x78,0xf2,0x12,0x37,0xe2,0x12,0x37,0xf5,0x12, +0x36,0xb3,0x22,0x69,0x31,0x0, 0xe, 0x5e,0x34,0x0, 0x8, 0x22,0x7e,0x1f,0x78,0xf2, +0x69,0x11,0x0, 0x6, 0x22,0x7e,0x24,0x0, 0x4, 0x2, 0xc, 0xcc,0x7e,0x37,0x77,0x89, +0x2, 0xc, 0x88,0x74,0x1, 0x7a,0xb3,0x78,0x97,0x75,0x1e,0x1, 0x22,0x7c,0xbf,0x7e, +0x73,0x75,0x33,0xca,0x79,0x7c,0xf7,0x7c,0xeb,0xd2,0x18,0x12,0x34,0x1, 0xbe,0xe0, +0x3, 0x7c,0xbe,0x7e,0x70,0x26,0x78,0x7, 0xac,0x7f,0x12,0x37,0x6d,0x80,0x5, 0xac, +0x7f,0x12,0x37,0x62,0x12,0x4c,0x66,0xda,0x79,0x22,0xca,0x79,0x7c,0xfb,0xc2,0x2, +0x7c,0xbf,0x12,0xc6,0xa3,0xe5,0x1e,0x60,0x5d,0x6c,0xee,0x74,0x26,0xac,0xbe,0x9, +0xb5,0x75,0x44,0x60,0x38,0x12,0xe7,0x10,0x7c,0x7e,0x12,0x36,0xc3,0xd2,0x2, 0xbe, +0xf0,0x3, 0xa2,0x1, 0x92,0x3, 0x74,0x26,0x78,0xc, 0xac,0xbe,0x49,0x15,0x75,0x5b, +0x49,0x5, 0x75,0x59,0x80,0xa, 0xac,0xbe,0x49,0x15,0x75,0x53,0x49,0x5, 0x75,0x51, +0x49,0x35,0x75,0x57,0x49,0x25,0x75,0x55,0x7c,0xbf,0x12,0x65,0x99,0x20,0xc, 0x6, +0x20,0xd, 0x3, 0x30,0xf, 0x9, 0x30,0x2, 0x3, 0x12,0x36,0xbd,0xc3,0x80,0xe, 0xb, +0xe0,0xbe,0xe0,0x3, 0x40,0xa5,0x30,0x2, 0x3, 0x12,0x36,0xbd,0xd3,0xda,0x79,0x22, +0xac,0x67,0x49,0x13,0x75,0x47,0x49,0x3, 0x75,0x45,0x22,0xac,0x67,0x49,0x13,0x75, +0x4b,0x49,0x3, 0x75,0x49,0x22,0xca,0xf8,0x7c,0xfb,0xbe,0xf0,0x3, 0x50,0x1c,0xbe, +0x70,0x3, 0x50,0x17,0xd2,0x4, 0x12,0x3c,0x96,0x12,0x34,0x1, 0x7e,0xb3,0x78,0x97, +0x7c,0x7f,0x12,0x36,0xc3,0x7a,0xf3,0x75,0x33,0xd2,0x16,0xda,0xf8,0x22,0xca,0x3b, +0x7e,0x67,0x6f,0x6a,0x7e,0x77,0x6f,0x6c,0x74,0x1, 0x12,0x67,0x91,0x7e,0xb3,0x6f, +0x76,0x7e,0x34,0x1, 0x0, 0x7e,0x8, 0x6f,0x77,0x7d,0x26,0x60,0xb, 0x12,0x4, 0x96, +0x12,0xe5,0xea,0x12,0x3, 0xfa,0x80,0x9, 0x12,0x3, 0xfa,0x12,0xe5,0xea,0x12,0x4, +0x96,0xda,0x3b,0x22,0x7d,0x36,0x74,0x2c,0xac,0xbe,0x22,0x9, 0x73,0x28,0xe9,0x2, +0xd, 0x23,0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x22,0x49,0x35,0x29,0x93,0x49,0x25, +0x29,0x91,0x2, 0x9, 0xad,0x5e,0x70,0xfb,0x1b,0xa, 0x30,0x22,0x2e,0x34,0x28,0xee, +0x6d,0x22,0x74,0x10,0x2, 0xb, 0x8, 0x7c,0x7b,0x74,0x8, 0xac,0x7b,0xbe,0x34,0x0, +0x4e,0x38,0x2, 0xc3,0x22,0xbe,0x34,0x0, 0x1e,0x50,0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0x7b,0x74,0x27,0xac,0xb7,0x9, 0x95,0x28,0xeb,0x7e,0x63,0x77,0x5a,0x74,0x2, 0xac, +0xb7,0x19,0x65,0x29,0x83,0x7e,0x63,0x77,0x5b,0x74,0x2, 0xac,0xb7,0x19,0x65,0x29, +0x84,0x74,0x2, 0xac,0x7b,0x2e,0x34,0x29,0x83,0x7e,0x14,0x0, 0x29,0x12,0x23,0x44, +0x7e,0x30,0x2c,0xac,0x39,0x7d,0x31,0x2e,0x34,0x0, 0xf5,0x12,0x38,0x79,0x12,0xb, +0x44,0x7e,0x70,0xb5,0xac,0x79,0x2e,0x34,0x1, 0x0, 0x7e,0x30,0x2c,0xac,0x39,0x12, +0x33,0xe4,0x7e,0x24,0x0, 0x2, 0x2, 0xc, 0xcc,0x2e,0x14,0x0, 0xf7,0x6d,0x0, 0x22, +0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x74,0x27,0xac,0xbe,0x19,0xf5,0x28,0xe7,0xb, 0xe0, +0xbe,0xe0,0x4, 0x78,0xf1,0x7e,0x64,0x1, 0x0, 0x6c,0xee,0x7e,0x30,0x2c,0xac,0x3e, +0x12,0x38,0x79,0xa, 0x3f,0x12,0x31,0x24,0x12,0xd, 0xd3,0x7d,0x36,0xb, 0x34,0x74, +0x2c,0xac,0xbe,0x49,0x25,0x0, 0xf7,0x12,0x0, 0x2e,0x12,0x38,0xc2,0x40,0xdc,0xda, +0x3b,0x22,0x2e,0x64,0x0, 0xb5,0xb, 0xe0,0xbe,0xe0,0x3, 0x22,0xca,0x3b,0x7c,0xfb, +0x6c,0xee,0x74,0x27,0xac,0xbe,0x19,0xf5,0x28,0xea,0xb, 0xe0,0xbe,0xe0,0x4, 0x78, +0xf1,0x7e,0x64,0x1, 0xa, 0x6c,0xee,0x7e,0x30,0x2c,0xac,0x3e,0x2e,0x14,0x1, 0x9, +0x6d,0x0, 0x7c,0xbf,0x12,0xc, 0xaa,0x12,0x37,0xd4,0x49,0x25,0x1, 0x9, 0x12,0x6, +0x48,0x12,0x37,0xd4,0x49,0x25,0x1, 0x9, 0x12,0x6, 0xc5,0x12,0x38,0xc2,0x40,0xd7, +0xda,0x3b,0x22,0x7c,0x7b,0x74,0x8, 0xac,0x7b,0xbe,0x34,0x0, 0x12,0x50,0x2, 0xc3, +0x22,0xd3,0x22,0x7c,0x2b,0xa5,0xba,0xfa,0x5, 0x7e,0xb3,0x4a,0x66,0x22,0xa5,0xba, +0xfc,0x3, 0x74,0x1, 0x22,0xbe,0x20,0x5b,0x38,0x7, 0xa, 0x32,0x9, 0xb3,0x77,0x31, +0x22,0xbe,0x20,0x6a,0x68,0x4, 0xa5,0xba,0x6b,0x1d,0x7e,0x37,0x4a,0x63,0x7d,0x23, +0xb, 0x24,0x7a,0x27,0x4a,0x63,0x2e,0x37,0x4e,0x7f,0x7e,0x39,0x30,0xa5,0xba,0x6b, +0x3, 0x75,0x1a,0x6a,0x7c,0xb3,0x22,0xbe,0x20,0x6e,0x68,0x4, 0xa5,0xba,0x6f,0x1d, +0x7e,0x37,0x4a,0x61,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x4a,0x61,0x2e,0x37,0x4a,0x6f, +0x7e,0x39,0x30,0xa5,0xba,0x6f,0x3, 0x75,0x1a,0x6e,0x7c,0xb3,0x22,0xbe,0x20,0x6c, +0x68,0x4, 0xa5,0xba,0x6d,0x1d,0x7e,0x37,0x4e,0x7d,0x7d,0x23,0xb, 0x24,0x7a,0x27, +0x4e,0x7d,0x2e,0x37,0x4a,0x6b,0x7e,0x39,0x30,0xa5,0xba,0x6d,0x3, 0x75,0x1a,0x6c, +0x7c,0xb3,0x22,0xbe,0x20,0x89,0x68,0x4, 0xa5,0xba,0x8a,0x1d,0x7e,0x37,0x4e,0x83, +0x7d,0x23,0xb, 0x24,0x7a,0x27,0x4e,0x83,0x2e,0x37,0x4e,0x81,0x7e,0x39,0x30,0xa5, +0xba,0x8a,0x3, 0x75,0x1a,0x89,0x7c,0xb3,0x22,0xbe,0x20,0x70,0x40,0xa, 0xbe,0x20, +0x7f,0x38,0x5, 0x7c,0xb2,0x2, 0x3a,0xa0,0xbe,0x20,0x81,0x68,0x4, 0xa5,0xba,0x82, +0x2a,0x7e,0xb3,0x77,0x48,0x7c,0xab,0xbe,0xa0,0x20,0x40,0xd, 0xbe,0xa0,0x40,0x50, +0x8, 0xa, 0x3a,0x9, 0x33,0x6b,0xc9,0x80,0x3, 0x12,0xe5,0xd8,0x4, 0x7a,0xb3,0x77, +0x48,0xa5,0xba,0x82,0x3, 0x75,0x1a,0x81,0x7c,0xb3,0x22,0xa5,0xba,0x86,0x5, 0x7e, +0xb3,0x4a,0x68,0x22,0xa5,0xba,0x87,0x5, 0x7e,0xb3,0x4a,0x60,0x22,0xa5,0xba,0x88, +0x19,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x10,0x5e,0x34,0x38,0x0, 0xa, 0x56,0x1e, +0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x7, 0x22,0xbe,0x20,0x90,0x40,0xa, 0xbe, +0x20,0x94,0x38,0x5, 0x7c,0xb2,0x2, 0x6a,0x2f,0xbe,0x20,0x99,0x68,0x4, 0xa5,0xba, +0x9a,0x1b,0x7e,0x33,0x4a,0x65,0x7c,0xb3,0x4, 0x7a,0xb3,0x4a,0x65,0xa, 0x33,0x9, +0x33,0x4e,0x85,0xa5,0xba,0x9a,0x3, 0x75,0x1a,0x99,0x7c,0xb3,0x22,0xa5,0xba,0x9b, +0x5, 0x7e,0xb3,0x4a,0x67,0x22,0xa5,0xba,0xf6,0x5, 0x7e,0xb3,0x78,0xe5,0x22,0xa5, +0xba,0xf7,0xb, 0x7e,0x57,0x78,0xe6,0x7e,0x44,0x0, 0x64,0x8d,0x54,0x22,0xe4,0x22, +0x7c,0x6b,0x7e,0x70,0xff,0x7c,0xb6,0x24,0x8c,0xbe,0xb0,0xa, 0x40,0x2, 0x61,0x4c, +0x7e,0xa0,0x3, 0xa4,0x90,0x3a,0xb8,0x73,0x2, 0x3a,0xf6,0x2, 0x3b,0x4c,0x2, 0x3a, +0xd6,0x2, 0x3a,0xe4,0x2, 0x3a,0xed,0x2, 0x3a,0xff,0x2, 0x3b,0x1b,0x2, 0x3b,0xa, +0x2, 0x3b,0x20,0x2, 0x3b,0x20,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0xe, 0x5e,0x34, +0x0, 0x4, 0x80,0x68,0x7e,0x1f,0x78,0xf2,0x12,0x36,0x93,0x80,0x5f,0x12,0x3b,0x65, +0x5e,0x34,0x0, 0x2, 0x80,0x56,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x1, 0x80,0x4d,0x12, +0x3b,0x65,0x5e,0x34,0x4, 0x0, 0xa, 0x36,0x80,0xb, 0x12,0x3b,0x65,0x5e,0x34,0x8, +0x0, 0xa, 0x36,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x80,0x31,0x7e,0x71,0xef,0x80,0x2c, +0x7e,0x73,0x78,0x8c,0x7c,0xb7,0x4, 0x7a,0xb3,0x78,0x8c,0xa, 0x27,0x9, 0x72,0x1, +0x7d,0x7e,0xb3,0x77,0x55,0x4, 0x7a,0xb3,0x77,0x55,0x70,0x9, 0x7e,0xb3,0x77,0x54, +0x4, 0x7a,0xb3,0x77,0x54,0xa5,0xbe,0x7d,0x3, 0x75,0x1a,0x7c,0x7c,0xb7,0x22,0x2e, +0x14,0x0, 0x14,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x75,0x1e,0x1, 0x74, +0x1, 0x7a,0xb3,0x78,0x97,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x6, 0x22,0x30,0x1b, +0x2a,0xc2,0x1b,0xd2,0x1d,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x2, 0x74,0x1, 0x68,0x5, +0x12,0x5, 0x30,0x80,0x3, 0x12,0x36,0xb5,0x7e,0x34,0x0, 0x1, 0x7e,0xa1,0x1e,0x74, +0x8, 0xa4,0x59,0x35,0x77,0x91,0xe5,0x1e,0x2, 0x3c,0x29,0x30,0x1e,0x33,0xc2,0x1e, +0xc2,0x1d,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x2, 0x74,0x1, 0x68,0x5, 0x12,0x5, 0xbc, +0x80,0x3, 0x12,0x36,0xb5,0x7e,0xb3,0x78,0x8f,0xb4,0x1, 0xe, 0x7e,0x34,0x0, 0x2, +0x7e,0xa1,0x1e,0x74,0x8, 0xa4,0x59,0x35,0x77,0x91,0xe5,0x1e,0x12,0x3c,0x29,0x80, +0x7, 0x30,0x1d,0x4, 0xe5,0x1e,0x70,0x3, 0x2, 0x3b,0xdc,0x22,0xe4,0x7a,0xb3,0x77, +0xb4,0x12,0xe6,0x8e,0x12,0xe5,0x70,0x12,0x3f,0xbd,0x12,0x37,0xf5,0xc2,0x4, 0x12, +0x3c,0x2, 0x12,0x51,0x89,0xbe,0xb0,0x1, 0x68,0x3, 0x12,0x4f,0xf3,0xd2,0x4, 0x2, +0x3c,0x2, 0xa2,0xac,0x92,0x5, 0xc2,0xac,0x7e,0xf, 0x78,0xf2,0x30,0x4, 0xa, 0xb, +0x16,0xb, 0xa, 0x30,0x4e,0x70,0x3, 0x80,0x8, 0xb, 0x16,0xb, 0xa, 0x30,0x5e,0x70, +0xfc,0x1b,0xa, 0x30,0xa2,0x5, 0x92,0xac,0x22,0x7c,0xab,0x12,0x67,0x7d,0x1b,0xa0, +0x68,0x12,0x1b,0xa0,0x68,0x13,0x1b,0xa0,0x68,0x14,0x2e,0xa0,0x3, 0x78,0x12,0x12, +0x3f,0xc9,0x80,0xd, 0x12,0xdd,0xb4,0x80,0x8, 0x12,0x3f,0xe2,0x80,0x3, 0x12,0xdd, +0xc7,0x2, 0x3c,0x54,0xe4,0x7a,0xb3,0x77,0xbc,0x6c,0xaa,0x80,0xd, 0x12,0xdd,0x8d, +0x2e,0xb3,0x77,0xbc,0x7a,0xb3,0x77,0xbc,0xb, 0xa0,0x7e,0xb3,0x77,0xb1,0xbc,0xba, +0x38,0xeb,0x22,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x63,0x6d,0x7e,0x24,0x0, 0x12,0x12, +0x3, 0xfa,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x63,0x91,0x7e,0x24,0x0, 0x12,0x12,0x4, +0x96,0x12,0x3b,0xdc,0xd2,0x4, 0x80,0x6, 0x30,0xc, 0x3, 0x12,0x4b,0xe2,0x7e,0xb3, +0x77,0xb4,0xbe,0xb0,0x1, 0x68,0xf1,0x30,0x4, 0x3, 0x12,0xb, 0xe5,0xc2,0x5, 0x2, +0x3c,0xb2,0xca,0xf8,0x7e,0x70,0x78,0x7e,0xb3,0x78,0x97,0x60,0x5b,0x30,0x5, 0x58, +0x7e,0xa3,0x78,0xb0,0xbe,0xa0,0x3, 0x68,0x4f,0x7e,0xb3,0x75,0x36,0x70,0x49,0x7e, +0xb3,0x28,0xe6,0x4, 0x7a,0xb3,0x28,0xe6,0xbc,0xb7,0x50,0x3, 0x30,0x2c,0x27,0xbe, +0xa0,0x1, 0x78,0x22,0x20,0x23,0x1f,0xc2,0x2c,0xd2,0x2f,0xe4,0x7a,0xb3,0x28,0xe6, +0x6c,0x77,0x12,0x3f,0xa8,0x7e,0x8, 0x57,0x98,0x12,0x4c,0x66,0x7e,0x73,0x78,0x97, +0x7a,0x73,0x29,0xbf,0x80,0x2c,0x30,0x2f,0x29,0x12,0x3e,0x9e,0x78,0x5, 0x12,0x37, +0x6b,0x80,0x1a,0x12,0x37,0x60,0x80,0x15,0xe4,0x7a,0xb3,0x28,0xe6,0x30,0x2f,0x12, +0x12,0x3e,0x9e,0x78,0x5, 0x12,0x37,0x6b,0x80,0x3, 0x12,0x37,0x60,0x12,0x4c,0x66, +0xc2,0x2f,0xda,0xf8,0x22,0x70,0xc, 0x12,0x50,0xe9,0x12,0xc, 0xea,0x12,0x50,0x87, +0x2, 0x4, 0x96,0x22,0x30,0x26,0x76,0xc2,0x26,0x12,0x2a,0x5a,0xd2,0x4, 0x12,0x3c, +0x96,0x7e,0x73,0x77,0x61,0xbe,0x73,0x78,0x97,0x68,0x7, 0x7a,0x73,0x78,0x97,0x12, +0x29,0x55,0x7e,0xb3,0x77,0x4f,0xbe,0xb3,0x6f,0x68,0x68,0x14,0x54,0x5, 0x7a,0xb3, +0x77,0x4f,0x7e,0x73,0x77,0x4f,0x7a,0x73,0x6f,0x68,0x12,0x3f,0x3f,0x12,0xde,0x2c, +0x7e,0xb3,0x77,0x50,0xbe,0xb3,0x6f,0x69,0x68,0x14,0x54,0x5, 0x7a,0xb3,0x77,0x50, +0x7e,0x73,0x77,0x50,0x7a,0x73,0x6f,0x69,0x12,0x3f,0x3f,0x12,0xde,0x2c,0x7e,0xb3, +0x77,0x3f,0x54,0xfe,0x7a,0xb3,0x77,0x3f,0x7e,0xb3,0x77,0x40,0x60,0x3, 0x12,0x60, +0x6c,0x7e,0xb3,0x77,0x5f,0x60,0x3, 0x12,0x34,0x3f,0x12,0x3b,0xdc,0x7e,0x37,0x4a, +0x6d,0x4d,0x33,0x68,0x15,0xd2,0x4, 0x12,0x3c,0x96,0x12,0x31,0x70,0x7e,0xb3,0x77, +0x3f,0x54,0xfd,0x7a,0xb3,0x77,0x3f,0x2, 0x3b,0xdc,0x22,0x6d,0x33,0x7a,0x37,0x4a, +0x63,0xd2,0x4, 0x12,0x3c,0x96,0x12,0x36,0x3, 0xe5,0x1e,0x12,0x3c,0x29,0x2, 0x3d, +0xf1,0x12,0xe7,0x0, 0x12,0x77,0x99,0x12,0x35,0xa6,0x7d,0x21,0x2e,0x24,0x4e,0xa8, +0x7a,0x27,0x4a,0x6f,0x6d,0x22,0x7a,0x27,0x4a,0x61,0x7e,0x24,0x6f,0x77,0x7a,0x27, +0x4a,0x6b,0x7e,0x24,0x0, 0x27,0xca,0x29,0x12,0xe6,0x5, 0x12,0x24,0x13,0x1b,0xfd, +0x7e,0x34,0x0, 0x2, 0xca,0x39,0x7e,0x63,0x78,0x97,0xac,0x67,0x2e,0x34,0x29,0x83, +0x6d,0x22,0x7e,0x8, 0x77,0x5a,0x12,0x24,0x13,0x1b,0xfd,0x7e,0xa3,0x78,0x97,0x74, +0xa, 0xa4,0x49,0x35,0x29,0x8f,0x7a,0x37,0x77,0x67,0x7e,0xb3,0x78,0x97,0x12,0xde, +0x9e,0x7e,0xb3,0x78,0x97,0x12,0xdd,0xfd,0x7e,0xb3,0x78,0x97,0x12,0x50,0x66,0x12, +0x3e,0x96,0x9, 0x75,0x29,0xb3,0x7a,0x73,0x77,0x51,0x12,0x3e,0x96,0x9, 0x75,0x29, +0xb4,0x7a,0x73,0x77,0x52,0x12,0x3e,0x96,0x9, 0x75,0x29,0xb5,0x7a,0x73,0x77,0x53, +0x7e,0x73,0x78,0x97,0x7a,0x73,0x77,0x61,0x2, 0x3e,0x8b,0xe5,0x1e,0x7a,0xb3,0x77, +0x3d,0x22,0x7e,0x8, 0x0, 0x71,0x7e,0xa3,0x78,0x97,0x74,0x3, 0xa4,0x22,0xe4,0x7e, +0x63,0x29,0xbf,0x7e,0x70,0x3, 0xac,0x67,0x9, 0x73,0x29,0xb3,0x12,0x3d,0x35,0x7e, +0xf3,0x29,0xbf,0xbe,0xf0,0x3, 0x7c,0xbf,0x7e,0x63,0x75,0x33,0x7e,0x70,0x26,0x22, +0x12,0x3f,0xbd,0x12,0x37,0xf5,0x12,0xd9,0x19,0x7e,0xb3,0x6f,0x76,0x7e,0x37,0x6f, +0x72,0x60,0xe, 0x7a,0x37,0x0, 0xbb,0x7e,0x37,0x6f,0x74,0x7a,0x37,0x0, 0x7f,0x80, +0xc, 0x7a,0x37,0x0, 0x7f,0x7e,0x37,0x6f,0x74,0x7a,0x37,0x0, 0xbb,0x7e,0x37,0x0, +0x7d,0x4e,0x70,0x2, 0x7a,0x37,0x0, 0x7d,0x7e,0x37,0x0, 0xb9,0x4e,0x70,0x2, 0x7a, +0x37,0x0, 0xb9,0x12,0x3e,0x92,0x9, 0xb5,0x29,0xb3,0x12,0xc, 0xea,0x12,0x3e,0x92, +0x9, 0xb5,0x29,0xb4,0x12,0xd, 0x8d,0x12,0x3e,0x92,0x12,0xe7,0x9, 0x7e,0x37,0x0, +0x71,0x7a,0x37,0x0, 0xad,0x6d,0x33,0x7e,0x8, 0x0, 0x6d,0x7e,0x24,0x0, 0x1e,0x12, +0x3, 0xfa,0x6d,0x33,0x7e,0x8, 0x0, 0xa9,0x7e,0x24,0x0, 0x1e,0x2, 0x4, 0x96,0x7e, +0xb3,0x6f,0x68,0x7e,0x73,0x6f,0x69,0x12,0x3f,0x53,0x7e,0xb3,0x6f,0x68,0x7e,0x73, +0x6f,0x69,0x22,0x7c,0x6b,0x7c,0x56,0x5e,0x50,0x4, 0x1e,0x50,0xa, 0x45,0x7c,0xb6, +0x54,0x1, 0xa, 0x5b,0x2d,0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0x4, 0x1e,0x60,0xa, +0x26,0x7c,0xb7,0x54,0x1, 0xa, 0x3b,0x2d,0x32,0x7c,0xb7,0xa, 0x4b,0x3e,0x44,0x3e, +0x44,0xa, 0x5a,0x2d,0x54,0x7c,0xab,0x7a,0xa3,0x73,0xda,0xe4,0x7a,0xb3,0x73,0xdb, +0x7e,0x70,0x4, 0x7c,0xba,0x30,0xe0,0x9, 0x7e,0xb3,0x73,0xdb,0x4, 0x7a,0xb3,0x73, +0xdb,0x1e,0xa0,0x1b,0x70,0x78,0xec,0x22,0x12,0x3d,0x35,0x7e,0xb3,0x78,0x97,0x22, +0xd2,0x4, 0x12,0x3c,0x96,0x12,0x46,0xaa,0x70,0xfb,0x22,0xc2,0x2a,0x7e,0xf, 0x78, +0xf2,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x22,0x6d,0x33,0x12,0x3f,0xf5,0x7e,0x57, +0x77,0x91,0x12,0x3f,0xfe,0xe4,0x2, 0x3f,0xd9,0x7a,0xb3,0x77,0xb7,0x7a,0xb3,0x77, +0xb8,0x22,0x7e,0x34,0x0, 0x2, 0x12,0x3f,0xf5,0x7e,0x57,0x77,0xa1,0x12,0x3f,0xfe, +0x74,0x2, 0x2, 0x3f,0xd9,0x7e,0x24,0xc, 0x18,0x7e,0x14,0x10,0x24,0x22,0x7c,0x1b, +0x7d,0x43,0x7e,0xa3,0x77,0xb1,0xbe,0xa0,0x5, 0x50,0x1e,0x7e,0x70,0x7, 0xac,0x7a, +0x59,0x43,0x77,0xbd,0x59,0x23,0x77,0xbf,0x59,0x13,0x77,0xc1,0x19,0x13,0x77,0xc3, +0x7c,0xba,0x4, 0x7a,0xb3,0x77,0xb1,0xc3,0x22,0xd3,0x22,0x7c,0x6b,0xa5,0xbe,0xfa, +0x4, 0x7a,0x73,0x4a,0x66,0xa5,0xbe,0x0, 0x7, 0x7c,0xb7,0x12,0x6b,0x5a,0x81,0x12, +0xa5,0xbe,0xf, 0xd, 0x74,0x1, 0x7a,0xb3,0x77,0x40,0x7a,0xb3,0x77,0x41,0xd2,0x26, +0x22,0xa5,0xbe,0x2e,0xd, 0x74,0x1, 0x7a,0xb3,0x77,0x5f,0x7a,0xb3,0x77,0x60,0xd2, +0x26,0x22,0xa5,0xbe,0x12,0x5, 0x7a,0x73,0x77,0x43,0x22,0xa5,0xbe,0x11,0x2d,0xa5, +0xbf,0x1, 0x1e,0x7e,0xb3,0x77,0x42,0x60,0x2, 0x81,0x31,0x74,0x1, 0x7a,0xb3,0x77, +0x42,0xe4,0x7a,0xb3,0x77,0x44,0x7e,0xb3,0x77,0x31,0x44,0x80,0x7a,0xb3,0x77,0x31, +0x22,0xa5,0xbf,0x0, 0x2, 0x80,0x2, 0x81,0x31,0x2, 0xe7,0x0, 0xbe,0x60,0x99,0x68, +0x4, 0xa5,0xbe,0x9a,0x1d,0x7e,0xa3,0x4a,0x67,0x7c,0xba,0x4, 0x7a,0xb3,0x4a,0x67, +0xa, 0x2a,0x19,0x72,0x4e,0x85,0xa5,0xbe,0x9a,0x2, 0x80,0x2, 0x81,0x31,0x75,0x1a, +0x99,0x22,0xa5,0xbe,0x9b,0x9, 0x7a,0x73,0x4a,0x67,0x7a,0x73,0x4a,0x65,0x22,0xa5, +0xbe,0x1, 0x11,0x6d,0x22,0x7a,0x27,0x4a,0x63,0x7a,0x73,0x77,0x32,0x7c,0xb7,0x12, +0x68,0x67,0x81,0x12,0xbe,0x60,0x5b,0x28,0x2, 0x61,0x18,0xa5,0xbe,0x30,0x11,0x7e, +0x53,0x77,0x61,0xbc,0x57,0x78,0x2, 0x81,0x31,0xbe,0x70,0x4, 0x40,0x2, 0x81,0x31, +0xbe,0x60,0x20,0x40,0xc, 0xbe,0x60,0x22,0x38,0x7, 0xbe,0x70,0x3, 0x28,0x2, 0x81, +0x31,0x7c,0xb6,0x24,0xf9,0xbe,0xb0,0x29,0x40,0x2, 0x21,0x9f,0x7e,0xa0,0x3, 0xa4, +0x90,0x41,0x24,0x73,0x2, 0x44,0x31,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f, +0x2, 0x44,0x31,0x2, 0x44,0x31,0x2, 0x44,0x31,0x2, 0x44,0x31,0x2, 0x41,0x9f,0x2, +0x44,0x31,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41, +0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f, +0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, +0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41, +0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f, +0x2, 0x44,0x31,0x2, 0x44,0x31,0x2, 0x44,0x31,0x2, 0x41,0x9f,0x2, 0x44,0x31,0xa, +0x26,0x19,0x72,0x77,0x31,0x7c,0xb6,0x1b,0xb2,0xbe,0xb0,0x34,0x40,0x2, 0x41,0xda, +0x7e,0xa0,0x3, 0xa4,0x90,0x41,0xb8,0x73,0x2, 0x42,0x54,0x2, 0x42,0xda,0x2, 0x42, +0x54,0x2, 0x42,0xda,0x2, 0x42,0x58,0x2, 0x42,0x54,0x2, 0x42,0xda,0x2, 0x42,0xda, +0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, +0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42, +0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xa0,0x2, 0x42,0xda,0x2, 0x42,0xad, +0x2, 0x42,0xda,0x2, 0x42,0xc0,0x2, 0x42,0x54,0x2, 0x42,0x54,0x2, 0x42,0x5d,0x2, +0x42,0x5d,0x2, 0x42,0x5d,0x2, 0x42,0xda,0x2, 0x42,0xcf,0x2, 0x42,0xda,0x2, 0x42, +0xda,0x2, 0x42,0xda,0x2, 0x42,0x66,0x2, 0x42,0x66,0x2, 0x42,0x66,0x2, 0x42,0xda, +0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0x54,0x2, +0x42,0x6f,0x2, 0x42,0x78,0x2, 0x42,0x81,0x2, 0x42,0x8a,0x2, 0x42,0xda,0x2, 0x42, +0xda,0x2, 0x42,0x93,0xd2,0x26,0x41,0xda,0x12,0x0, 0xfd,0x80,0x7d,0x7e,0x27,0x4a, +0x6d,0x4e,0x40,0x20,0x80,0x34,0x7e,0x27,0x4a,0x6d,0x4e,0x40,0x1, 0x80,0x2b,0x7e, +0x27,0x4a,0x6d,0x4e,0x50,0x1, 0x80,0x22,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x2, 0x80, +0x19,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x4, 0x80,0x10,0x7e,0x27,0x4a,0x6d,0x4e,0x50, +0x8, 0x80,0x7, 0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x10,0x7a,0x27,0x4a,0x6d,0x80,0x3a, +0x7e,0x53,0x77,0x49,0x12,0x44,0x32,0x7a,0x27,0x4a,0x61,0x80,0x2d,0x7e,0x53,0x77, +0x4b,0x12,0x44,0x32,0x3e,0x24,0x7a,0x27,0x4e,0x7d,0x7a,0x27,0x4a,0x69,0x80,0x1a, +0x7e,0x53,0x77,0x4d,0x12,0x44,0x32,0x3e,0x24,0x7a,0x27,0x4a,0x63,0x80,0xb, 0x7e, +0x53,0x77,0x54,0x12,0x44,0x32,0x7a,0x53,0x78,0x8c,0xbe,0x60,0x38,0x40,0x14,0xbe, +0x60,0x56,0x38,0xf, 0xa, 0x26,0x5e,0x24,0x0, 0x1, 0xbe,0x24,0x0, 0x1, 0x78,0x3, +0x12,0xe6,0xae,0xbe,0x60,0x58,0x40,0xb, 0x7e,0x27,0x4a,0x6d,0x4e,0x40,0x2, 0x7a, +0x27,0x4a,0x6d,0xa5,0xbe,0xa, 0x2, 0x80,0x2, 0x81,0x12,0x7e,0x37,0x4a,0x6d,0x4e, +0x60,0x4, 0x7a,0x37,0x4a,0x6d,0x81,0x12,0xbe,0x60,0x6c,0x68,0x4, 0xa5,0xbe,0x6d, +0x2b,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x80,0x7a,0x27,0x4a,0x6d,0x7e,0x27,0x4a,0x69, +0x7d,0x12,0xb, 0x14,0x7a,0x17,0x4a,0x69,0x2e,0x27,0x4a,0x6b,0x7a,0x29,0x70,0xa5, +0xbe,0x6d,0x2, 0x80,0x2, 0x81,0x12,0x75,0x1a,0x6c,0x81,0x12,0xbe,0x60,0x6e,0x68, +0x4, 0xa5,0xbe,0x6f,0x43,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x40,0x7a,0x27,0x4a,0x6d, +0x7e,0x43,0x77,0x49,0x6c,0x55,0x7e,0xb3,0x77,0x4a,0xa, 0x1b,0x2d,0x12,0x4, 0x7a, +0xb3,0x77,0x4a,0x70,0x9, 0x7e,0xb3,0x77,0x49,0x4, 0x7a,0xb3,0x77,0x49,0x7a,0x17, +0x4a,0x61,0x7e,0x27,0x4a,0x6f,0x2d,0x21,0x7a,0x29,0x70,0xa5,0xbe,0x6f,0x2, 0x80, +0x2, 0x81,0x12,0x75,0x1a,0x6e,0x80,0x7a,0xbe,0x60,0x70,0x40,0xc, 0xbe,0x60,0x7f, +0x38,0x7, 0x7c,0xb6,0x12,0x68,0x49,0x80,0x69,0xa5,0xbe,0x86,0xf, 0x7c,0xb7,0x54, +0x7, 0x7a,0xb3,0x4a,0x68,0x53,0xc3,0xf8,0x42,0xc3,0x80,0x56,0xa5,0xbe,0x87,0xf, +0x7c,0xb7,0x54,0x3, 0x7a,0xb3,0x4a,0x60,0x53,0xc2,0xfc,0x42,0xc2,0x80,0x43,0xa5, +0xbe,0x88,0x29,0x5e,0x70,0x7, 0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x10,0xb, 0xa, +0x20,0x5e,0x40,0xc7,0x1b,0xa, 0x20,0xa, 0x37,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x12, +0x44,0x40,0x12,0x45,0x27,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x16,0xa5,0xbe,0xf6,0x6, +0x7a,0x73,0x78,0xe5,0x80,0xc, 0xa5,0xbe,0xf7,0x8, 0x74,0x64,0xac,0xb7,0x7a,0x57, +0x78,0xe6,0x30,0x26,0xa, 0x7e,0xb3,0x77,0x3f,0x44,0x1, 0x7a,0xb3,0x77,0x3f,0x7e, +0x37,0x4a,0x6d,0x4d,0x33,0x68,0xa, 0x7e,0xb3,0x77,0x3f,0x44,0x2, 0x7a,0xb3,0x77, +0x3f,0x22,0x7c,0x25,0x6c,0x33,0xa, 0x27,0x2d,0x21,0x22,0xb, 0x18,0x20,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0x7e,0x34,0x76,0xbf,0x30,0x27,0x60,0xc2,0x27, +0x7e,0x39,0x50,0xa, 0x25,0x12,0x44,0x3e,0x3e,0x24,0x7a,0x27,0x6f,0x40,0x9, 0x53, +0x0, 0x1, 0xa, 0x25,0x12,0x44,0x3e,0x3e,0x24,0x7a,0x27,0x6f,0x42,0x7e,0xb3,0x76, +0xbd,0xb4,0x3, 0x15,0x9, 0xa3,0x0, 0x3, 0xa, 0x2a,0x12,0x44,0x3e,0x3e,0x24,0x7a, +0x27,0x6f,0x48,0x19,0xa3,0x0, 0x2, 0x80,0x16,0xb4,0x2, 0x13,0x9, 0x53,0x0, 0x2, +0xa, 0x15,0x12,0xd9,0x10,0x3e,0x14,0x7a,0x17,0x6f,0x48,0x19,0x53,0x0, 0x3, 0x9, +0x73,0x0, 0x5, 0x12,0x31,0x22,0x3e,0x34,0x3e,0x34,0x7a,0x37,0x6f,0x50,0x7e,0x37, +0x6f,0x40,0x7a,0x37,0x77,0x2f,0x4d,0x33,0x78,0xb, 0x7e,0x34,0x21,0x5b,0x12,0x2a, +0xa9,0x7a,0x37,0x77,0x2f,0x22,0x7c,0x67,0x7c,0x7b,0xa5,0xbf,0x0, 0xd, 0xbe,0x60, +0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0x6f,0x38,0x2, 0xc8,0x38,0xa5,0xbe,0x0, 0x17,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x6e,0x81,0xb, +0xa0,0x12,0x45,0x1f,0x38,0xed,0x6c,0xaa,0x80,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e, +0x14,0x6d,0xc9,0x12,0x44,0x3b,0x1b,0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14, +0x6d,0xcb,0x12,0x44,0x3b,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xdc,0x22,0x90, +0x21,0x51,0xe4,0x93,0xbc,0xba,0x22,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x10,0xb, +0xa, 0x30,0x22,0x30,0x0, 0x5, 0x43,0xc3,0x80,0x80,0x3, 0x53,0xc3,0x7f,0x30,0x0, +0x5, 0x43,0xc2,0x80,0x80,0x3, 0x53,0xc2,0x7f,0x7e,0xf, 0x78,0xf2,0x30,0x0, 0x8, +0x12,0x45,0x2b,0x4e,0x60,0xc4,0x80,0x6, 0x12,0x45,0x2b,0x5e,0x60,0x3b,0x1b,0xa, +0x30,0x22,0x12,0x46,0x7f,0x12,0x3f,0xb0,0x12,0x45,0xcd,0x12,0x45,0x86,0xa9,0xd6, +0xeb,0x74,0x1, 0x7e,0x70,0x82,0x12,0x45,0xe9,0xa9,0xc6,0xeb,0xd2,0x0, 0x12,0x45, +0x86,0xd2,0x0, 0x2, 0x45,0x33,0xa9,0xd0,0xce,0x30,0x0, 0x4, 0xa9,0xd5,0xc9,0x22, +0xa9,0xc5,0xc9,0x22,0x12,0x46,0xaf,0x40,0x6, 0x12,0x46,0xc5,0x12,0x0, 0x12,0x12, +0x45,0xcd,0x12,0x45,0xd5,0x80,0xb, 0x7e,0xb3,0x77,0xf, 0x60,0x2, 0x80,0x0, 0x12, +0x46,0x60,0x30,0x15,0xf2,0x7e,0xb3,0x78,0x93,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a, +0xb3,0x78,0x93,0xd2,0x0, 0x12,0x45,0xd5,0xd2,0x0, 0x2, 0x45,0x33,0xc2,0x0, 0x12, +0x45,0x33,0xc2,0x0, 0x22,0xa2,0x0, 0xa9,0x92,0xcb,0xa2,0x0, 0xa9,0x92,0xca,0xa2, +0x0, 0xa9,0x91,0xcb,0x22,0xe4,0x7e,0x70,0xff,0x7c,0x6b,0x7e,0xb3,0x78,0x8d,0xb4, +0x81,0x68,0xa5,0xbe,0x0, 0x2, 0x80,0x5c,0xa5,0xbe,0x1, 0x22,0xc2,0xaf,0xa, 0x27, +0x5e,0x24,0x0, 0x2, 0x68,0x2, 0xd2,0x95,0x7a,0x71,0xcd,0xa9,0xd0,0xce,0xa9,0xc6, +0xc9,0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x36,0xa5,0xbe, +0x2, 0x18,0x12,0x46,0xa5,0x70,0xf, 0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd0,0xce, +0xa9,0xd6,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x1a,0xa5,0xbe,0x3, 0x1c,0x12,0x46, +0xa5,0x70,0xf, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd0,0xce,0xa9,0xc6,0xc9,0xa9, +0xd1,0x87,0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x78,0x8d,0x22, +0x80,0xe, 0x12,0x46,0x7f,0x12,0x46,0xaf,0x40,0x14,0x20,0x15,0x11,0x12,0x45,0xe5, +0x12,0x46,0xaa,0x70,0xed,0x12,0x46,0x7f,0x12,0xe6,0x76,0x2, 0x45,0xe9,0x22,0x74, +0x81,0x7a,0xb3,0x78,0x8d,0x22,0x80,0xe, 0x12,0x46,0x7f,0x12,0x46,0xaf,0x40,0x14, +0x20,0x15,0x11,0x12,0x45,0xe5,0x12,0x46,0xaa,0x70,0xed,0x12,0x46,0x7f,0x12,0xe6, +0x76,0x2, 0x45,0xe9,0x22,0xc2,0xaf,0x7a,0x71,0xcd,0xa2,0x93,0xe4,0x33,0x22,0x30, +0xc, 0x3, 0x12,0x4b,0xe2,0x7e,0xb3,0x77,0xb5,0x70,0x6, 0x7e,0xb3,0x77,0xb6,0x60, +0x2, 0xd3,0x22,0xc3,0x22,0x80,0x3, 0x12,0x46,0x86,0x12,0x46,0xaf,0x50,0xf8,0x22, +0x20,0x15,0x6, 0x12,0xdd,0xda,0x12,0x0, 0x12,0x30,0x1d,0x3, 0x12,0x3b,0xdc,0x12, +0x46,0xaf,0x40,0x6, 0x12,0x46,0xc5,0x2, 0x0, 0x12,0x22,0xca,0xf8,0x7e,0x14,0x0, +0x1e,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x1, 0x7e,0xb, 0x50,0x7a,0x37,0x63,0x6e, +0x7a,0x53,0x63,0x6d,0xc2,0x0, 0x6d,0xcc,0x7e,0xb4,0xff,0xff,0x20,0x25,0x3, 0x2, +0x48,0x2a,0x7e,0xd4,0x4, 0xc, 0xca,0xd9,0x12,0x69,0x31,0x12,0x24,0x13,0x1b,0xfd, +0x6d,0xaa,0x7d,0xda,0x80,0x26,0x7d,0x2d,0x3e,0x24,0x49,0x12,0x46,0x54,0xbe,0x14, +0x0, 0x0, 0x8, 0x6, 0x49,0x32,0x46,0x54,0x80,0x4, 0x6d,0x33,0x9d,0x31,0x59,0x32, +0x46,0x54,0xbd,0x3c,0x28,0x4, 0x7d,0xc3,0x7d,0xbd,0xb, 0xd4,0x7e,0x37,0x73,0xd6, +0xbd,0x3d,0x38,0xd2,0x7e,0x37,0x4e,0x95,0xbd,0x3c,0x50,0x4, 0x7a,0xc7,0x4e,0x95, +0x7e,0x37,0x4e,0x8b,0xbd,0x3c,0x50,0x10,0xbe,0xb4,0xff,0xff,0x68,0xa, 0x7e,0x37, +0x4e,0x93,0xb, 0x34,0x7a,0x37,0x4e,0x93,0x7e,0x73,0x6f,0x65,0xa, 0x27,0x7d,0x3b, +0x8d,0x32,0x7c,0xf5,0xbe,0xf0,0x0, 0x40,0x7, 0xbe,0xf0,0x1d,0x38,0x2, 0xd2,0x0, +0x7d,0xda,0x7d,0x3d,0x3e,0x34,0x49,0x23,0x4e,0x85,0xbd,0x2c,0x50,0x51,0xbe,0xb4, +0xff,0xff,0x68,0x4b,0x9, 0xbd,0x4e,0x97,0xb4,0x1, 0x25,0x49,0x23,0x4e,0xa0,0xbd, +0x2b,0x78,0x10,0x7d,0xa3,0x2e,0xa4,0x4e,0x9a,0xb, 0xa8,0x20,0xb, 0x24,0x1b,0xa8, +0x20,0x80,0x32,0x4d,0xdd,0x78,0x14,0x30,0x0, 0x25,0x80,0xf, 0x80,0x21,0x80,0xb, +0x4d,0xdd,0x78,0x7, 0x30,0x0, 0x18,0x80,0x2, 0x80,0x14,0x59,0xb3,0x4e,0xa0,0x7e, +0x24,0x0, 0x1, 0x59,0x23,0x4e,0x9a,0x74,0x1, 0x19,0xbd,0x4e,0x97,0x80,0x6, 0x74, +0x1, 0x19,0xbd,0x63,0x6d,0x49,0xa3,0x4e,0x8d,0x49,0x23,0x4e,0x9a,0xbd,0x2a,0x28, +0x4, 0x59,0x23,0x4e,0x8d,0x9, 0xbd,0x63,0x6d,0xb4,0x1, 0x11,0x6d,0x22,0x59,0x23, +0x4e,0xa0,0x6d,0xaa,0x59,0xa3,0x4e,0x9a,0xe4,0x19,0xbd,0x4e,0x97,0xb, 0xd4,0xbe, +0xd4,0x0, 0x3, 0x68,0x3, 0x2, 0x47,0x92,0x80,0x1a,0x7e,0x8, 0x4e,0x97,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x24,0x38,0x7e,0x8, 0x4e,0x9a,0x12,0x48,0x47,0x7e,0x8, 0x4e, +0xa0,0x12,0x48,0x47,0xda,0xf8,0x22,0x7e,0x34,0x0, 0x6, 0x2, 0x24,0x38,0xe4,0x7a, +0xb3,0x76,0xe4,0x6d,0x33,0x7a,0x37,0x4e,0x7d,0x12,0x68,0xe7,0x12,0x48,0xb3,0x12, +0x3d,0xdb,0xc2,0x1, 0x12,0x29,0x5a,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x7e,0x1f,0x24, +0x64,0x7e,0xf, 0x24,0x68,0x12,0x24,0x13,0x1b,0xfd,0x12,0x3b,0xdc,0x2, 0x48,0x80, +0x7e,0x8, 0x75,0xb1,0x7e,0x34,0x0, 0xa, 0xe4,0x2, 0x24,0x38,0xe4,0x7a,0xb3,0x76, +0xe4,0x74,0x1, 0x7a,0xb3,0x78,0x97,0x7a,0xb3,0x73,0xd3,0x12,0x74,0xba,0x12,0x48, +0xb3,0x12,0x49,0x61,0x12,0x3d,0xf1,0x12,0x77,0xa0,0x12,0xbf,0xfc,0x12,0x48,0x80, +0x2, 0x29,0x45,0x7e,0x8, 0x77,0x91,0x7e,0x34,0x0, 0x20,0xe4,0x12,0x24,0x38,0x7e, +0x34,0x0, 0x1, 0x7a,0x37,0x77,0x91,0x7a,0xb3,0x77,0x93,0x74,0x1, 0x7a,0xb3,0x77, +0x94,0xe4,0x7a,0xb3,0x77,0x95,0x7e,0xb3,0x78,0x8f,0xb4,0x1, 0x31,0x7e,0x34,0x0, +0x2, 0x12,0x49,0x4d,0x12,0x49,0x31,0x7a,0x73,0x77,0x9e,0x74,0x1, 0x7a,0xb3,0x77, +0x9f,0xe4,0x7a,0xb3,0x77,0xa0,0x7e,0x34,0x0, 0x2, 0x12,0x49,0x3a,0x12,0x49,0x31, +0x7a,0x73,0x77,0xa6,0x7a,0xb3,0x77,0xa7,0x7a,0xb3,0x77,0xa8,0x80,0xa, 0x7e,0x34, +0x0, 0x1, 0x12,0x49,0x4d,0x12,0x49,0x3a,0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x77,0xa9, +0x74,0x1, 0x7a,0xb3,0x77,0xab,0x7a,0xb3,0x77,0xac,0x74,0x2, 0x7a,0xb3,0x77,0xad, +0x22,0x7e,0x73,0x78,0x8e,0x1e,0x34,0xb, 0x34,0x22,0x7a,0x37,0x77,0xa1,0x74,0x1, +0x7a,0xb3,0x77,0xa3,0x7a,0xb3,0x77,0xa4,0x7a,0xb3,0x77,0xa5,0x22,0x7a,0x37,0x77, +0x99,0x74,0x1, 0x7a,0xb3,0x77,0x9b,0x7a,0xb3,0x77,0x9c,0xe4,0x7a,0xb3,0x77,0x9d, +0x22,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x6, 0x5e,0x34,0x0, 0x1, 0x68,0x18,0x12, +0x3b,0x4f,0x5e,0x34,0x0, 0x2, 0x68,0x3, 0x12,0x4f,0xe2,0x74,0x3, 0x12,0x49,0xba, +0x74,0x1, 0x12,0x30,0x49,0x80,0x2e,0x12,0x4f,0xf0,0x12,0x4f,0xd9,0x74,0x1, 0x12, +0x49,0xba,0xe4,0x12,0x30,0x49,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0xa, 0xb, 0xa, +0x30,0x4e,0x60,0x10,0x1b,0xa, 0x30,0xe4,0x7a,0xb3,0x78,0x8e,0x12,0x3f,0xbd,0x12, +0x49,0xf3,0x12,0x4f,0x8a,0xe5,0x1e,0x2, 0x3c,0x29,0xbe,0xb0,0x4, 0x50,0x33,0x7e, +0x37,0x0, 0x9f,0x5e,0x70,0xf0,0x7a,0x37,0x0, 0x9f,0xa, 0x3b,0x4e,0x37,0x0, 0x9f, +0x7a,0x37,0x0, 0x9f,0x7a,0x37,0x0, 0xdb,0x7e,0x34,0x0, 0x19,0x7e,0x8, 0x0, 0x9f, +0x12,0x67,0xea,0x7e,0x34,0x0, 0x19,0x7e,0x8, 0x0, 0xdb,0x7e,0x24,0x0, 0x1, 0x2, +0x4, 0x96,0x22,0x5e,0x70,0xfe,0x1b,0xa, 0x30,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b, +0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x7e,0xf, +0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x80,0x0, 0x68,0x2c,0xb, 0xa, 0x30,0x5e, +0x34,0x80,0x0, 0x68,0x23,0x12,0x37,0xe2,0x6e,0x70,0x40,0x1b,0xa, 0x30,0x7e,0xf, +0x78,0xf2,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x80,0x1b,0xa, 0x30,0x12,0x4b,0xd1, +0xd2,0xe, 0x12,0x3f,0xbd,0x12,0x49,0xf3,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, +0x5e,0x34,0x0, 0x2, 0x68,0x1d,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x2, 0x68,0x14,0xb, +0x15,0xb, 0xa, 0x30,0x4e,0x70,0x2, 0x1b,0xa, 0x30,0x12,0x4b,0xd1,0x12,0x3f,0xbd, +0x12,0x49,0xf3,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x0, 0x1, 0x68, +0x20,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x1, 0x68,0x17,0xb, 0x15,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x12,0x4c,0x37,0x12,0x3f,0xbd,0x4e,0x70,0x1, 0x1b,0xa, +0x30,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x0, 0x8, 0x68,0x17,0xb, +0xa, 0x30,0x5e,0x34,0x0, 0x8, 0x68,0xe, 0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x8, +0x1b,0xa, 0x30,0x12,0x4c,0x26,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34, +0x0, 0x4, 0x68,0x17,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x4, 0x68,0xe, 0xb, 0x15,0xb, +0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x12,0x4c,0x15,0x7e,0xf, 0x78,0xf2,0x69, +0x30,0x0, 0x4, 0x5e,0x34,0x40,0x0, 0x68,0x31,0xb, 0xa, 0x30,0x5e,0x34,0x40,0x0, +0x68,0x28,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x40,0x1b,0xa, 0x30,0xd2,0xd, 0x7e, +0xb3,0x78,0x8b,0xbe,0xb0,0xc8,0x50,0x5, 0x4, 0x7a,0xb3,0x78,0x8b,0x7e,0xb3,0x78, +0x8b,0xb4,0x1, 0x6, 0x12,0x29,0x4a,0x12,0x4b,0xe2,0x7e,0xf, 0x78,0xf2,0x69,0x30, +0x0, 0x4, 0x5e,0x34,0x20,0x0, 0x68,0x19,0xb, 0xa, 0x30,0x5e,0x34,0x20,0x0, 0x68, +0x10,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x20,0x1b,0xa, 0x30,0xd2,0xd, 0x12,0x4b, +0xe2,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x10,0x0, 0x68,0x26,0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x10,0x0, 0x68,0x1b,0x5e,0x34,0x8, 0x0, 0x2e,0x34, +0xff,0xff,0x92,0x13,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x8, 0x1b,0xa, 0x30,0x12, +0xda,0xe9,0x12,0xdb,0x31,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x0, +0x40,0x68,0x29,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x40,0x68,0x20,0xb, 0x15,0xb, 0xa, +0x30,0x4e,0x70,0x40,0x1b,0xa, 0x30,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0xa, 0x5e, +0x34,0xf, 0xc0,0x12,0x4c,0x5b,0x1e,0x34,0x7a,0x73,0x78,0x8e,0xd0,0x82,0xd0,0x83, +0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b, +0x32,0xd2,0xc, 0xd2,0x11,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x1, 0x78,0x3, 0x2, 0x4b, +0xfa,0x22,0x30,0x2a,0x14,0xa9,0xd2,0xea,0xa9,0xc2,0xea,0x12,0xe5,0x88,0x12,0x3f, +0xbb,0x12,0x37,0xf5,0xc2,0x29,0x2, 0x4c,0x4, 0x22,0x12,0xb, 0xb0,0x20,0x29,0x3, +0x2, 0x4c,0x4, 0x22,0x12,0xb, 0xe5,0x12,0x4f,0xf3,0x74,0x2, 0x7a,0xb3,0x77,0xb5, +0x7a,0xb3,0x77,0xb6,0x22,0xd2,0xf, 0xd2,0x11,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x2, +0x68,0x3, 0x2, 0x4b,0xfa,0x22,0xd2,0xf, 0xd2,0x11,0x12,0x3b,0x65,0x5e,0x34,0x0, +0x2, 0x78,0x3, 0x2, 0x4b,0xfa,0x22,0xd2,0xc, 0xd2,0x11,0x12,0x3b,0x65,0x5e,0x34, +0x0, 0x1, 0x68,0x8, 0xe4,0x7a,0xb3,0x78,0x8b,0x2, 0x4b,0xfa,0x22,0x6e,0x34,0xff, +0xff,0xb, 0x34,0x7a,0x37,0x6f,0x4e,0x7e,0x37,0x6f,0x40,0x1e,0x34,0x1e,0x34,0x1e, +0x34,0x1e,0x34,0x1e,0x34,0x22,0xca,0x3b,0x7f,0x30,0x7c,0xab,0xbe,0xa0,0x4, 0x40, +0x2, 0xc1,0x1e,0x74,0x27,0xa4,0x9, 0xb5,0x28,0xeb,0xf5,0x3c,0xe4,0x12,0x67,0x91, +0x7e,0xf7,0x6f,0x6a,0x7e,0xe7,0x6f,0x6c,0x2d,0xef,0x7a,0xe5,0x3a,0x7e,0x8, 0x67, +0xd3,0x12,0x64,0xf8,0x7e,0xb3,0x6f,0x76,0x60,0x62,0x6d,0xee,0x80,0x2e,0x7e,0xe5, +0x36,0x3e,0xe4,0x49,0x3e,0x6f,0x77,0x7a,0x35,0x38,0x7f,0x3, 0x2e,0x15,0x36,0x7e, +0xb, 0x50,0x19,0x53,0x2, 0xaf,0x12,0x4e,0x47,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb, +0x12,0x4c,0x5d,0x3e,0x34,0x2e,0x34,0x67,0xf7,0x12,0x4e,0x21,0x7a,0xe5,0x36,0xbe, +0xf5,0x36,0x38,0xca,0x7a,0xf5,0x36,0x80,0x19,0x12,0x4e,0x2f,0x60,0x5, 0x3e,0x24, +0x14,0x78,0xfb,0x12,0x4c,0x5d,0x3e,0x34,0x2e,0x34,0x67,0xd3,0x12,0x4e,0x21,0x7a, +0xe5,0x36,0x7e,0xe5,0x3a,0xbe,0xe5,0x36,0x38,0xdf,0x80,0x67,0x6d,0xee,0x80,0x16, +0x12,0x4e,0x2f,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x4c,0x5d,0x3e,0x34,0x2e, +0x34,0x67,0xd3,0x12,0x4e,0x21,0x7a,0xe5,0x36,0xbe,0xf5,0x36,0x38,0xe2,0x7a,0xf5, +0x36,0x80,0x38,0x7e,0x35,0x36,0x3e,0x34,0x49,0x23,0x6f,0x77,0x7a,0x25,0x38,0x7f, +0x3, 0x2e,0x15,0x36,0x7e,0xb, 0x70,0x19,0x72,0x2, 0xaf,0x7d,0x52,0x12,0x64,0xaf, +0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xba,0x3e,0x24,0x2e,0x24,0x67,0xf7, +0x12,0x64,0xd8,0x7e,0x35,0x36,0xb, 0x34,0x7a,0x35,0x36,0x7e,0x35,0x3a,0xbe,0x35, +0x36,0x38,0xc0,0x7e,0x45,0x3a,0x12,0x4e,0x66,0x7a,0x73,0x1, 0x95,0x12,0x4e,0x72, +0x7a,0xb3,0x1, 0x96,0x12,0x4e,0x52,0x7a,0xb3,0x1, 0x97,0xb, 0x44,0x12,0x4e,0x66, +0x7a,0x73,0x2, 0xaf,0x12,0x4e,0x72,0x7a,0xb3,0x2, 0xb0,0x12,0x4e,0x52,0x7a,0xb3, +0x2, 0xb1,0x7e,0xb3,0x6f,0x68,0x54,0x5, 0xa, 0x3b,0x4e,0x37,0x67,0xd3,0x7a,0x37, +0x67,0xd3,0x7e,0xb3,0x6f,0x69,0x54,0x5, 0xa, 0x3b,0x4e,0x37,0x67,0xf7,0x7a,0x37, +0x67,0xf7,0x12,0x4e,0x5a,0x2e,0x74,0x0, 0x16,0x7d,0x37,0x7e,0x8, 0x67,0xd3,0x12, +0x67,0xdc,0x7d,0x37,0x7e,0x8, 0x67,0xf7,0x12,0x67,0xe3,0x12,0x4e,0x5a,0x2e,0x74, +0x0, 0x28,0x6d,0x33,0x7a,0x35,0x36,0x7e,0x35,0x36,0x9, 0x53,0x1, 0x96,0x7c,0x25, +0x6c,0x33,0x9, 0x53,0x1, 0x95,0x12,0x4e,0x82,0x40,0xec,0x7d,0x37,0x7e,0x8, 0x68, +0x1b,0x7e,0x24,0x0, 0x8d,0x12,0x3, 0xfa,0x6d,0x33,0x7a,0x35,0x36,0x7e,0x35,0x36, +0x9, 0x53,0x2, 0xb0,0x7c,0x25,0x6c,0x33,0x9, 0x53,0x2, 0xaf,0x12,0x4e,0x82,0x40, +0xec,0x7d,0x37,0x7e,0x8, 0x68,0x1b,0x7e,0x24,0x0, 0x8d,0x12,0x4, 0x96,0xda,0x3b, +0x22,0xb, 0x38,0xe0,0x4d,0xe2,0x1b,0x38,0xe0,0x7e,0xe5,0x36,0xb, 0xe4,0x22,0x7e, +0xe5,0x36,0x3e,0xe4,0x49,0x3e,0x6f,0x77,0x7a,0x35,0x38,0x7f,0x3, 0x2e,0x15,0x36, +0x7e,0xb, 0x50,0x19,0x53,0x1, 0x95,0x7d,0x53,0x5e,0x54,0x0, 0xf, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xba,0x54,0xf0,0xc4,0x54,0xf, 0x22,0x7e,0xf1,0x3c,0x74,0xb5,0xac, +0xfb,0x2e,0x74,0x1, 0x0, 0x22,0x7d,0x54,0xb, 0x44,0x7f,0x13,0x2d,0x35,0x7e,0x1b, +0x70,0x22,0x7f,0x13,0x2d,0x34,0x7e,0x1b,0xa0,0x7c,0xba,0x54,0xf, 0x3e,0xb0,0x3e, +0xb0,0x22,0xa, 0x25,0x2d,0x21,0x7d,0x13,0x1e,0x14,0x3e,0x14,0x59,0x21,0x68,0x1b, +0xb, 0x35,0x7a,0x35,0x36,0xbe,0x34,0x1, 0x1a,0x22,0x7e,0x34,0x0, 0xaa,0x12,0x4e, +0xb3,0x7e,0x34,0x0, 0x64,0x12,0x2a,0x8d,0x12,0x4c,0x4d,0x12,0x2c,0x3d,0x7a,0x73, +0x76,0xc0,0x22,0x7a,0x37,0x6f,0x40,0x90,0x21,0x53,0xe4,0x93,0x7a,0xb3,0x6f,0x3f, +0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x78,0x3c,0x12,0x4e,0xb7,0x7e,0x34,0x0, 0x96,0x7a, +0x37,0x6f,0x40,0x12,0x6f,0xc7,0x7e,0x34,0xff,0x38,0x7a,0x37,0x6f,0x44,0x7e,0x34, +0x1, 0x2c,0x7a,0x37,0x6f,0x4c,0x7e,0x34,0xfe,0xd4,0x7a,0x37,0x6f,0x4e,0x12,0xe7, +0x20,0x68,0x42,0x7e,0x34,0x2, 0x58,0x7a,0x37,0x6f,0x46,0x7e,0x34,0x2, 0x26,0x7a, +0x37,0x6f,0x48,0x22,0xbe,0xa0,0x2, 0x78,0x2c,0x7e,0xb3,0x78,0xb0,0xb4,0x3, 0x13, +0x74,0x5c,0x7a,0xb3,0x6f,0x3f,0x7e,0x34,0x0, 0x5c,0x12,0x4f,0x36,0x7e,0x34,0xff, +0xa4,0x80,0xe, 0x12,0x4e,0xb7,0x7e,0x34,0x1, 0x2c,0x12,0x4f,0x36,0x7e,0x34,0xfe, +0xd4,0x7a,0x37,0x6f,0x44,0x22,0x7a,0x37,0x6f,0x40,0x7a,0x37,0x6f,0x42,0x22,0x7a, +0x73,0x6f,0x3f,0x7a,0x27,0x6f,0x40,0x7a,0x17,0x6f,0x42,0x7a,0x7, 0x6f,0x4c,0x6d, +0x33,0x9d,0x30,0x12,0x4c,0x53,0x12,0x2c,0x3d,0x7a,0x73,0x76,0xc0,0x22,0xca,0x3b, +0x12,0xe6,0xe5,0x5e,0x34,0x0, 0x1, 0x68,0x10,0x7f,0x3, 0x12,0x3b,0x4f,0x5e,0x34, +0x0, 0x2, 0x68,0x13,0x12,0x4f,0xe2,0x80,0xe, 0x12,0x4f,0xd9,0x7f,0x3, 0x12,0x3f, +0xc1,0x12,0x49,0xf3,0x12,0x4f,0x8a,0xda,0x3b,0x22,0x7e,0xf, 0x78,0xf2,0x12,0x37, +0xe2,0x12,0x4f,0xce,0x7e,0x70,0x1, 0x12,0x50,0xe1,0x7e,0x70,0x1, 0x12,0x50,0xab, +0x7e,0xb3,0x78,0x97,0x7e,0x70,0x2, 0x12,0x3d,0x35,0x74,0x8c,0x12,0x6a,0xe5,0x7e, +0xf, 0x78,0xf2,0x12,0x37,0xe2,0x5e,0x70,0xef,0x1b,0xa, 0x30,0x12,0x6a,0xe5,0x12, +0x45,0x27,0x5e,0x70,0xef,0x12,0x4f,0xd1,0x7e,0x70,0x1, 0x2, 0x3d,0x35,0x4e,0x70, +0x10,0x1b,0xa, 0x30,0x7e,0xb3,0x78,0x97,0x22,0x75,0x1e,0x0, 0xe4,0x7a,0xb3,0x78, +0x97,0x22,0x75,0x1e,0x2, 0x74,0x2, 0x7a,0xb3,0x78,0x97,0x74,0x1, 0x2, 0x5, 0xbc, +0xc2,0x1d,0x22,0x74,0x3, 0x7a,0xb3,0x77,0xb4,0x22,0x7c,0x9b,0x74,0x3, 0xac,0xb9, +0x9, 0x85,0x29,0xb3,0xbe,0x83,0x77,0x51,0x68,0x8, 0x7e,0x83,0x77,0x51,0x19,0x85, +0x29,0xb3,0x9, 0x85,0x29,0xb4,0xbe,0x83,0x77,0x52,0x68,0x8, 0x7e,0x83,0x77,0x52, +0x19,0x85,0x29,0xb4,0x9, 0x85,0x29,0xb5,0xbe,0x83,0x77,0x53,0x68,0x8, 0x7e,0x83, +0x77,0x53,0x19,0x85,0x29,0xb5,0x7e,0x8, 0x0, 0x71,0x12,0x50,0x47,0x9, 0xb5,0x29, +0xb5,0x12,0x50,0x84,0x2, 0x4, 0x96,0x9, 0xb5,0x29,0xb3,0x12,0xc, 0xea,0x7e,0x8, +0x0, 0x71,0x74,0x3, 0xac,0xb9,0x9, 0xb5,0x29,0xb4,0x12,0xd, 0x8d,0x7e,0x8, 0x0, +0x71,0x74,0x3, 0xac,0xb9,0x22,0x7c,0x9b,0x12,0x50,0x5d,0x12,0x50,0x47,0x12,0xe7, +0x9, 0x4c,0x99,0x78,0x9, 0x7e,0x8, 0x0, 0x71,0x74,0x1, 0x12,0xc, 0xea,0x12,0x50, +0x87,0x2, 0x4, 0x96,0x12,0xd, 0x7, 0x7e,0x37,0x0, 0x71,0x7a,0x37,0x0, 0xad,0x7e, +0x34,0x0, 0x2, 0x7e,0x8, 0x0, 0x71,0x7e,0x24,0x0, 0x1, 0x12,0x3, 0xfa,0x7e,0x34, +0x0, 0x2, 0x7e,0x8, 0x0, 0xad,0x7e,0x24,0x0, 0x1, 0x22,0x70,0x9, 0x12,0x50,0xe9, +0x12,0x50,0x84,0x2, 0x4, 0x96,0x22,0x70,0xc, 0x12,0x50,0xe9,0x12,0xd, 0x8d,0x12, +0x50,0x87,0x2, 0x4, 0x96,0x22,0x12,0x45,0x27,0x12,0x4f,0xce,0x7e,0x73,0x29,0xb3, +0x12,0x3f,0xa8,0x7e,0x73,0x29,0xb4,0x12,0x50,0xe1,0x7e,0x73,0x29,0xb5,0x2, 0x50, +0xab,0x12,0x50,0xb7,0x7e,0xb3,0x78,0x97,0x22,0x5e,0x70,0x3, 0x7e,0x8, 0x0, 0x71, +0x7c,0xb7,0x22,0x7c,0x3b,0xd2,0x4, 0x12,0x51,0xa1,0x12,0xdd,0x97,0x1b,0x30,0x68, +0x1d,0x1b,0x30,0x68,0x23,0x1b,0x30,0x68,0x29,0x1b,0x30,0x68,0x2f,0xb, 0x32,0x78, +0x73,0x12,0x50,0xc6,0x7e,0x1f,0x77,0x95,0x7e,0xf, 0x77,0x91,0x80,0x52,0x7e,0x1f, +0x77,0x9d,0x7e,0xf, 0x77,0x99,0x80,0x48,0x7e,0x1f,0x77,0xa5,0x7e,0xf, 0x77,0xa1, +0x80,0x3e,0x7e,0x1f,0x77,0xad,0x7e,0xf, 0x77,0xa9,0x80,0x34,0x7e,0x34,0x0, 0x8, +0xca,0x39,0x7e,0x71,0x1e,0x74,0x8, 0xac,0x7b,0x2e,0x34,0x77,0x91,0x6d,0x22,0x7e, +0x8, 0x67,0xd3,0x12,0x24,0x13,0x1b,0xfd,0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x67,0xd3, +0x7e,0x73,0x78,0xe9,0x7a,0x73,0x67,0xd5,0x7e,0x1f,0x67,0xd7,0x7e,0xf, 0x67,0xd3, +0x7a,0x1d,0x3a,0x7a,0xd, 0x36,0x12,0x2, 0x3d,0x74,0x1, 0x7a,0xb3,0x77,0xb4,0x12, +0xd, 0xbd,0x80,0x2, 0xc2,0x4, 0xa2,0x4, 0x22,0x12,0xdb,0x28,0x38,0x2, 0xe4,0x22, +0x7e,0xa3,0x77,0xb2,0x74,0x7, 0xa4,0x49,0x55,0x77,0xbd,0x12,0x50,0xf3,0xe4,0x33, +0x22,0xe5,0x1e,0x70,0x21,0x7e,0x37,0x78,0x94,0x4d,0x33,0x78,0xf8,0x12,0x51,0xc7, +0x7e,0x34,0x0, 0x5, 0x7a,0x37,0x78,0x94,0xbe,0x34,0x0, 0x21,0x28,0x8, 0x7e,0x34, +0x0, 0x21,0x7a,0x37,0x78,0x94,0x22,0x7e,0x73,0x76,0xc9,0x7e,0xb3,0x76,0xe4,0x70, +0x3a,0xe5,0x1e,0x70,0x1d,0x7e,0x63,0x76,0xc7,0xbe,0x60,0x14,0x28,0x5, 0x7e,0x60, +0x14,0x80,0x7, 0xa5,0xbe,0x0, 0x3, 0x7e,0x60,0x1, 0xa, 0x26,0x7e,0x34,0x0, 0x64, +0x80,0x74,0xe5,0x1e,0xb4,0x3, 0x2, 0x80,0x44,0x12,0x52,0x85,0xb4,0x1, 0x6, 0x7e, +0x34,0x1, 0xf4,0x80,0x61,0x7e,0x34,0x3, 0xe8,0x80,0x5b,0xe5,0x1e,0x70,0xe, 0x7e, +0x63,0x76,0xc8,0xbe,0x60,0x7f,0x28,0x53,0x7e,0x60,0x7f,0x80,0x4e,0x7e,0x63,0x78, +0xea,0xbe,0x60,0x3b,0x40,0x12,0x12,0x52,0x85,0xb4,0x1, 0x6, 0x7e,0x34,0x1, 0xf4, +0x80,0x26,0x7e,0x34,0x3, 0xe8,0x80,0x20,0xe5,0x1e,0xb4,0x3, 0x8, 0x7e,0x73,0x76, +0xfe,0xa, 0x37,0x80,0x15,0x30,0x1b,0x18,0x12,0x52,0x85,0xb4,0x1, 0x6, 0x7e,0x34, +0x1, 0xf4,0x80,0x4, 0x7e,0x34,0x3, 0xe8,0x8d,0x32,0x1b,0x34,0x7c,0x67,0x80,0xb, +0xa, 0x27,0x7e,0x34,0x3, 0xe8,0x12,0x22,0x71,0x7c,0x67,0x7e,0x73,0x76,0xeb,0xac, +0x67,0x7e,0x24,0x0, 0x18,0x12,0x22,0x71,0x7a,0x73,0x78,0x8a,0xc2,0x15,0x6d,0x33, +0x7a,0x37,0x78,0x86,0x22,0x7e,0xb3,0x78,0x8f,0xa, 0x27,0x22,0xca,0xf8,0x7e,0xf3, +0x78,0x97,0x20,0xc, 0x6, 0x20,0xd, 0x3, 0x30,0xf, 0x3, 0xc3,0x80,0x4d,0x12,0x52, +0xee,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x12,0x57,0xd8,0x4d,0x22,0x68,0x3b,0x7e, +0xb3,0x77,0x5f,0x70,0x3, 0x12,0x57,0xcf,0x12,0xe7,0x10,0x12,0xdf,0xb, 0x40,0x3, +0xc3,0x80,0x28,0x20,0xc, 0x6, 0x20,0xd, 0x3, 0x30,0xf, 0x3, 0xc3,0x80,0x1c,0x12, +0x52,0xee,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x6e,0x70,0xff,0x5e,0x73,0x73,0xd4, +0x7a,0x73,0x73,0xd4,0x12,0x51,0xc7,0xd3,0x80,0x1, 0xd3,0xda,0xf8,0x22,0x7e,0x34, +0x0, 0x1, 0x7c,0xbf,0x22,0xca,0xf8,0xc2,0x0, 0x7e,0xf3,0x78,0x97,0x20,0xc, 0x6, +0x20,0xd, 0x3, 0x30,0xf, 0x3, 0xc3,0x61,0x97,0x7e,0x24,0x0, 0x1, 0x7c,0xbf,0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x73,0xd5,0x6c,0x66,0x5c,0x75,0x4d,0x33, +0x68,0x74,0x7c,0xbf,0x12,0x58,0x1, 0x50,0x2, 0xd2,0x0, 0xd2,0x4, 0x12,0x3c,0x96, +0xa2,0x0, 0x92,0x1, 0x7c,0xbf,0x12,0x36,0xea,0x40,0x3, 0xc3,0x80,0x59,0x7c,0xbf, +0x7e,0x73,0x75,0xbb,0x12,0x36,0xc3,0xe4,0x7c,0x7f,0x12,0x99,0x25,0xa2,0x0, 0x92, +0x3, 0x7e,0xf, 0x24,0x64,0x7e,0x18,0x18,0x3c,0x7c,0xbf,0x12,0x65,0x99,0x12,0x36, +0xbd,0x20,0xc, 0x6, 0x20,0xd, 0x3, 0x30,0xf, 0x3, 0xc3,0x80,0x2a,0x12,0x3b,0xdc, +0x12,0x53,0x9a,0xc2,0x1, 0x12,0x29,0x5a,0x12,0x52,0xee,0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0x6e,0x70,0xff,0x5e,0x73,0x73,0xd5,0x7a,0x73,0x73,0xd5,0x12,0x54,0x92, +0x12,0x51,0xc7,0xd3,0x80,0x1, 0xd3,0xda,0xf8,0x22,0xca,0x79,0x7e,0x68,0x14,0x30, +0x7e,0xb3,0x78,0x97,0xb4,0x3, 0x4, 0x7e,0x68,0x1c,0x48,0x7e,0x73,0x6f,0x65,0x7a, +0x73,0x63,0x98,0x7e,0x73,0x6f,0x64,0x7a,0x73,0x63,0x97,0xe4,0x7a,0xb3,0x63,0x99, +0x7a,0xb3,0x63,0x9a,0x6d,0x33,0x7a,0x37,0x63,0xa1,0x6c,0xff,0x7e,0x70,0x26,0xac, +0x7f,0x9, 0xb3,0x75,0x44,0x70,0x2, 0x81,0x66,0x7e,0xb3,0x78,0x97,0xb4,0x3, 0xa, +0x49,0xf3,0x75,0x5b,0x49,0xe3,0x75,0x59,0x80,0x8, 0x49,0xf3,0x75,0x53,0x49,0xe3, +0x75,0x51,0x7d,0x3f,0x7a,0x37,0x63,0x9b,0x7d,0x3d,0x7a,0x37,0x63,0x9d,0x7d,0x3f, +0x7a,0x37,0x63,0x9f,0x12,0x54,0x7b,0x7e,0xb7,0x73,0xd6,0x6c,0xee,0xa, 0xe, 0x2d, +0xb, 0x3e,0x4, 0x7f,0x16,0x2d,0x30,0xb, 0x1a,0x10,0x7f,0x17,0x12,0x54,0x82,0x78, +0xec,0x12,0x57,0xfd,0x50,0x35,0x12,0x54,0x72,0x7d,0xa3,0x7a,0xa7,0x63,0x9b,0x7e, +0xa4,0x18,0x3c,0x7a,0xa7,0x63,0x9d,0x12,0x54,0x72,0x7d,0xa3,0x7a,0xa7,0x63,0x9f, +0x12,0x54,0x7b,0x6c,0xee,0xa, 0xe, 0x2d,0xb, 0x3e,0x4, 0x49,0x10,0x18,0x3c,0x12, +0x54,0x72,0x49,0x25,0x75,0x55,0x12,0x54,0x82,0x78,0xea,0x6c,0xaa,0x7e,0x70,0x26, +0xac,0x7f,0x19,0xa3,0x75,0x44,0xb, 0xf0,0xbe,0xf0,0x3, 0x50,0x2, 0x61,0xcc,0xda, +0x79,0x22,0x74,0x26,0xac,0xbf,0x49,0x35,0x75,0x57,0x22,0x7e,0x8, 0x63,0x97,0x2, +0x8, 0xe5,0x2d,0x30,0xb, 0x1a,0xa0,0x9d,0xa1,0x1b,0x1a,0xa0,0xb, 0xe0,0xbe,0xe0, +0x4, 0x22,0xe4,0x7a,0xb3,0x78,0x9c,0x2, 0x54,0x9a,0x6d,0x33,0x7a,0x37,0x78,0xeb, +0x22,0xca,0x3b,0x7c,0xf7,0x7c,0xeb,0x75,0x28,0x7, 0x7e,0x34,0x1, 0x77,0x7a,0x35, +0x2b,0x75,0x2d,0x0, 0x7e,0x34,0x26,0xca,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x63,0x97, +0x7e,0x54,0x2, 0x3c,0x12,0x23,0x67,0x6d,0x66,0x80,0xe, 0x7e,0x34,0x7f,0xff,0x7d, +0x26,0x3e,0x24,0x59,0x32,0x10,0x24,0xb, 0x64,0x7e,0x37,0x73,0xd6,0x7d,0x23,0xb, +0x26,0xbd,0x26,0x38,0xe6,0x2e,0x34,0x0, 0x8, 0x12,0x35,0xa4,0x12,0x57,0x1f,0xe4, +0x12,0x24,0x38,0x7e,0xb3,0x78,0xe5,0xb4,0x1, 0xa, 0x7e,0x37,0x78,0xe6,0x12,0x4c, +0x5d,0x7a,0x35,0x2b,0x74,0xa, 0xac,0xbe,0x49,0x25,0x29,0x8d,0x7e,0x35,0x2b,0xad, +0x32,0x9, 0xb5,0x29,0x8b,0x60,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7a,0x35,0x2b,0xe5,0x28,0xa, 0x5b,0x1b,0x54,0xf5,0x27,0xc1,0x87, +0xe5,0x27,0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7a,0x35,0x29, +0x12,0x2d,0x3d,0xe5,0x27,0xbe,0xb0,0x7, 0x58,0x13,0x6d,0x66,0x80,0xa, 0x12,0x35, +0x9f,0x7d,0x21,0x2d,0x26,0x12,0x57,0xee,0x12,0x57,0x26,0x38,0xf1,0x6d,0x66,0x12, +0x35,0x9f,0x7e,0x27,0x73,0xd6,0x2d,0x26,0x2d,0x21,0x12,0x57,0xee,0xbe,0x64,0x0, +0x4, 0x78,0xec,0x7c,0xbe,0x12,0x35,0xa4,0x12,0x57,0x1f,0x12,0x4c,0x66,0x5, 0x2d, +0xe5,0x2d,0x54,0x1, 0xb4,0x1, 0x8, 0x74,0x1, 0x7a,0xb3,0x78,0xe9,0x80,0xe, 0x7e, +0x73,0x78,0x8e,0xa, 0x37,0x1e,0x34,0xb, 0x34,0x7a,0x73,0x78,0xe9,0x12,0x3c,0x91, +0xe5,0x27,0xbe,0xb0,0x7, 0x58,0x66,0x6d,0x66,0x80,0x5d,0x7d,0x56,0x3e,0x54,0x49, +0x35,0xc, 0x18,0x7d,0x43,0x12,0x57,0xc7,0x8, 0x7, 0x7d,0x23,0x9e,0x25,0x2b,0x80, +0x4, 0x6d,0x22,0x9d,0x24,0x7a,0x25,0x2e,0x49,0x25,0x10,0x24,0x7d,0x42,0x12,0x57, +0xc7,0x8, 0x5, 0x9e,0x25,0x2b,0x80,0x4, 0x6d,0x22,0x9d,0x24,0x7a,0x25,0x30,0xbe, +0x25,0x2e,0x40,0x13,0x59,0x35,0x10,0x24,0x12,0x35,0xa4,0x7d,0x21,0x2d,0x26,0x9, +0x52,0x4e,0xa8,0x19,0x56,0x63,0x97,0xbe,0x35,0x2b,0x50,0xa, 0x12,0x57,0x2d,0x7d, +0x23,0x2d,0x26,0x12,0x57,0xe1,0xb, 0x64,0x12,0x57,0x26,0x38,0x9e,0x6d,0x66,0x7e, +0x17,0x73,0xd6,0x2d,0x16,0x7d,0x51,0x3e,0x54,0x49,0x5, 0xc, 0x18,0x7d,0x30,0x12, +0x57,0xbf,0x8, 0x7, 0x7d,0x40,0x9e,0x45,0x2b,0x80,0x4, 0x6d,0x44,0x9d,0x43,0x7a, +0x45,0x2e,0x49,0x45,0x10,0x24,0x7d,0x34,0x12,0x57,0xbf,0x8, 0x5, 0x9e,0x45,0x2b, +0x80,0x4, 0x6d,0x44,0x9d,0x43,0x7a,0x45,0x30,0xbe,0x45,0x2e,0x40,0x11,0x59,0x5, +0x10,0x24,0x12,0x57,0x32,0x2d,0x31,0x9, 0x73,0x4e,0xa8,0x19,0x71,0x63,0x97,0xbe, +0x5, 0x2b,0x50,0xa, 0x12,0x57,0x2d,0x7d,0x23,0x2d,0x21,0x12,0x57,0xe1,0xb, 0x64, +0xbe,0x64,0x0, 0x4, 0x78,0x99,0x30,0xc, 0x2, 0xe1,0x1c,0x30,0xd, 0x2, 0xe1,0x1c, +0x30,0xf, 0x2, 0xe1,0x1c,0x15,0x27,0xe5,0x27,0xbe,0xb0,0x1, 0x48,0x2, 0xa1,0x30, +0x7e,0xb3,0x77,0x51,0xbe,0xb0,0x2, 0x68,0x6f,0x12,0xe7,0x18,0x68,0x6a,0x7e,0x8, +0x10,0x24,0x74,0xa, 0xac,0xbe,0x12,0x66,0x46,0x6d,0x66,0x80,0x25,0x7d,0x26,0x3e, +0x24,0x49,0x32,0x10,0x24,0xbe,0x34,0x3, 0xe8,0x28,0x15,0xbe,0x34,0x3e,0x80,0x50, +0xf, 0x9, 0x76,0x63,0x97,0x12,0x35,0xa4,0x7d,0x21,0x2d,0x26,0x19,0x72,0x4e,0xa8, +0xb, 0x64,0x12,0x57,0x26,0x38,0xd6,0x6d,0x66,0x7e,0x27,0x73,0xd6,0x2d,0x26,0x7d, +0x12,0x3e,0x14,0x49,0x31,0x10,0x24,0xbe,0x34,0x3, 0xe8,0x28,0x13,0xbe,0x34,0x3e, +0x80,0x50,0xd, 0x9, 0x72,0x63,0x97,0x12,0x35,0xa4,0x2d,0x21,0x19,0x72,0x4e,0xa8, +0xb, 0x64,0xbe,0x64,0x0, 0x4, 0x78,0xd1,0x74,0x1, 0x7a,0xb3,0x78,0xe9,0x7c,0xbe, +0x12,0x35,0xa4,0x12,0x57,0x1f,0x12,0x4c,0x66,0x12,0x54,0x92,0xda,0x3b,0x22,0x2e, +0x14,0x4e,0xa8,0x6d,0x0, 0x22,0x7e,0x37,0x73,0xd6,0xbd,0x36,0x22,0x7e,0x55,0x29, +0x64,0xff,0xa, 0x2f,0x7e,0x34,0x2, 0x3c,0xad,0x32,0x22,0xca,0x3b,0x7c,0xeb,0x7e, +0xd0,0x4, 0x7e,0xb3,0x76,0xe6,0xb4,0x1, 0x5, 0x7e,0xf0,0x2, 0x80,0x3, 0x7e,0xf0, +0x1, 0x4c,0xee,0x68,0x5f,0x6c,0xcc,0x80,0x4b,0x4c,0xcc,0x78,0xc, 0x7e,0xb3,0x76, +0xe6,0xb4,0x1, 0x5, 0xe4,0x6c,0x77,0x80,0xc, 0x7c,0xde,0xe4,0x7e,0x70,0x3, 0xac, +0x7e,0x9, 0x73,0x29,0xb3,0x12,0x3d,0x35,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, +0x3e,0x34,0x14,0x78,0xfb,0x12,0x57,0xd8,0x4d,0x22,0x68,0xa, 0x12,0x57,0xcf,0x7c, +0xbe,0x7c,0x7d,0x12,0x54,0xa1,0x20,0xc, 0x6, 0x20,0xd, 0x3, 0x30,0xf, 0x3, 0xc3, +0x80,0x1a,0xb, 0xc0,0xbc,0xfc,0x38,0xb1,0x7e,0xb3,0x73,0xd4,0x54,0xef,0x7a,0xb3, +0x73,0xd4,0x80,0x7, 0x7c,0xbe,0x7c,0x7e,0x12,0x54,0xa1,0xd3,0xda,0x3b,0x22,0x9e, +0x35,0x2b,0xbe,0x34,0x0, 0x0, 0x22,0x9e,0x45,0x2b,0xbe,0x44,0x0, 0x0, 0x22,0x4e, +0x73,0x73,0xd5,0x7a,0x73,0x73,0xd5,0x22,0x7e,0x53,0x73,0xd4,0x6c,0x44,0x5c,0x57, +0x22,0x2e,0x24,0x4e,0xa8,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0x2e,0x24, +0x4e,0xa8,0x7e,0x29,0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0x64,0x22,0x7e,0xb3,0x78, +0x97,0x7c,0xab,0xd2,0x2, 0x7e,0xb3,0x78,0x8f,0x70,0x4, 0xc2,0x2, 0x80,0xb, 0x4c, +0xaa,0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x2, 0xc2,0x2, 0xa2,0x2, 0x22,0xca,0x3b,0x7c, +0x67,0x7c,0x7b,0x6d,0x22,0x7a,0x25,0x29,0x7e,0x27,0x73,0xd6,0xb, 0x26,0x7a,0x25, +0x2b,0x7c,0xb6,0x12,0x58,0x1, 0x92,0x1, 0x30,0x1, 0x6, 0x4c,0x77,0x78,0x2, 0x21, +0xb1,0x12,0x5a,0x15,0x7a,0xa1,0x33,0x74,0x26,0xa4,0x49,0xb5,0x75,0x53,0x49,0xa5, +0x75,0x51,0x49,0x95,0x75,0x57,0x49,0x85,0x75,0x55,0x7e,0x34,0x63,0x6f,0x1e,0x34, +0x3e,0x34,0x7d,0x73,0x6d,0x66,0x7e,0x34,0x67,0x7d,0x1e,0x34,0x3e,0x34,0x6d,0x22, +0x7a,0x1d,0x2d,0x7e,0x18,0xc, 0x18,0x7a,0x1d,0x34,0x7f,0x3, 0x7e,0x18,0x10,0x24, +0x74,0x1, 0x12,0x59,0xe5,0x12,0x59,0xb4,0x6d,0x33,0x7a,0x35,0x27,0x7e,0x35,0x31, +0x7d,0x13,0x3e,0x14,0x49,0x1, 0xc, 0x18,0x49,0x21,0x10,0x24,0x9d,0x20,0x2d,0x17, +0x7d,0x6, 0x12,0x59,0xbc,0x78,0xe6,0x20,0x1, 0x2, 0x21,0x2a,0x7e,0x73,0x75,0xbb, +0xbe,0x71,0x33,0x68,0x3a,0x6d,0x33,0x80,0x29,0x7e,0x35,0x27,0x7d,0x23,0x3e,0x24, +0x7f,0x4, 0x2d,0x12,0xb, 0xa, 0x50,0x49,0x42,0x18,0x3c,0x2d,0x45,0x7f,0x5, 0x2d, +0x12,0xb, 0xa, 0x10,0x49,0x52,0x14,0x30,0x2d,0x51,0x12,0x59,0xd9,0x1b,0xa, 0x20, +0xb, 0x34,0x7a,0x35,0x27,0x7e,0x35,0x2b,0xbe,0x35,0x27,0x38,0xcc,0x80,0x3b,0x7e, +0x18,0x18,0x3c,0x7a,0x1d,0x34,0x7e,0xd, 0x2d,0x7e,0x18,0x14,0x30,0x74,0x1, 0x12, +0x59,0xe5,0x7e,0x1d,0x2d,0x7a,0x1d,0x34,0x7f,0x3, 0x7f,0x13,0x12,0x5a,0x3c,0x12, +0x59,0xb4,0x6d,0x33,0x7a,0x35,0x27,0x12,0x59,0xd1,0x49,0x42,0x18,0x3c,0x49,0x52, +0x14,0x30,0x12,0x59,0xd9,0x12,0x59,0xbc,0x78,0xed,0x7f,0x3, 0x12,0xd0,0x2d,0x7a, +0x35,0x29,0x12,0x59,0xb4,0x6d,0x33,0x7a,0x35,0x27,0x12,0x59,0xd1,0x7f,0x23,0x2d, +0x52,0xb, 0x2a,0x10,0xbe,0x14,0x0, 0x0, 0x8, 0x5, 0xb, 0x2a,0x20,0x80,0x4, 0x6d, +0x22,0x9d,0x21,0xbe,0x25,0x29,0x28,0x12,0xbe,0x14,0x0, 0x0, 0x8, 0x5, 0xb, 0x2a, +0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0x7a,0x25,0x29,0x12,0x59,0xbf,0x78,0xcb,0x7e, +0x35,0x29,0xbe,0x34,0x7f,0xff,0x28,0x7, 0x7e,0x34,0x7f,0xff,0x7a,0x35,0x29,0x7e, +0x35,0x29,0x7a,0x37,0x75,0xb1,0x20,0x1, 0x28,0x7e,0x8, 0x10,0x24,0x7e,0x18,0xc, +0x18,0x12,0x5a,0x55,0x12,0x59,0xb4,0x6d,0x33,0x7a,0x35,0x27,0x7e,0x25,0x31,0x3e, +0x24,0x49,0x32,0xc, 0x18,0x59,0x32,0x10,0x24,0x7e,0x35,0x31,0x12,0x59,0xbf,0x78, +0xeb,0xda,0x3b,0x22,0x7e,0x37,0x73,0xd6,0x7a,0x35,0x31,0x22,0x1b,0xa, 0x20,0xb, +0x34,0x7a,0x35,0x31,0x7e,0x35,0x27,0xb, 0x34,0x7a,0x35,0x27,0xbe,0x34,0x0, 0x4, +0x22,0x7e,0x35,0x31,0x7d,0x23,0x3e,0x24,0x22,0x9d,0x54,0x7f,0x3, 0x2d,0x12,0xb, +0xa, 0x20,0x2d,0x25,0x22,0x7c,0xab,0x7f,0x61,0x7f,0x70,0x7e,0x8, 0x6b,0x89,0x12, +0x5f,0xef,0x7e,0xb3,0x6f,0x65,0x7a,0xb3,0x6b,0x8a,0x7e,0xb3,0x6f,0x64,0x7a,0xb3, +0x6b,0x89,0xe4,0x12,0x5a,0x9b,0x12,0x5a,0x69,0x7a,0xa3,0x6b,0x8c,0x6d,0x33,0x12, +0x5a,0x4c,0x2, 0x8, 0xe5,0x7e,0xb3,0x75,0xb0,0x12,0x5a,0x1f,0x7c,0xab,0x22,0x7c, +0x7b,0x6c,0xaa,0x6c,0x66,0xa, 0x26,0x12,0x5d,0x3d,0xbc,0xb7,0x78,0x4, 0x7c,0xa6, +0x80,0x7, 0xb, 0x60,0xbe,0x60,0x3, 0x40,0xec,0x7c,0xba,0x22,0x12,0x5a,0x7b,0x12, +0x5a,0x69,0x7e,0x34,0x0, 0x10,0x12,0x5a,0x4c,0x2, 0x8, 0xe5,0x7a,0x37,0x6b,0x93, +0x7e,0x8, 0x6b,0x89,0x22,0x12,0x5a,0x7b,0x7a,0x37,0x6b,0x8d,0x12,0x5a,0x74,0x7e, +0x34,0x0, 0x20,0x12,0x5a,0x4c,0x2, 0x8, 0xe5,0x7a,0x37,0x6b,0x8d,0x7e,0x1d,0x34, +0x7a,0x37,0x6b,0x8f,0x7d,0x3f,0x7a,0x37,0x6b,0x91,0x22,0x7f,0x61,0x7f,0x70,0x7e, +0x8, 0x6b,0x89,0x7e,0x34,0x0, 0xc, 0xe4,0x12,0x24,0x38,0x7e,0x73,0x6f,0x65,0x7a, +0x73,0x6b,0x8a,0x7e,0x73,0x6f,0x64,0x7a,0x73,0x6b,0x89,0x7a,0xb3,0x6b,0x8b,0x7d, +0x3d,0x22,0xca,0xf8,0x7e,0xb3,0x73,0xd3,0x70,0x8, 0x12,0x5b,0x2f,0x12,0x5a,0x55, +0x80,0xf, 0x7e,0x1f,0x24,0x64,0x7a,0x1d,0x34,0x12,0x5b,0x2f,0x74,0x1, 0x12,0x59, +0xe5,0x7e,0x37,0x73,0xd6,0x90,0x1c,0x2b,0xe4,0x93,0x70,0x13,0x6c,0xff,0x6d,0x22, +0x7d,0x53,0x12,0x5b,0x26,0x1b,0xa, 0x20,0x12,0x5b,0x15,0x78,0xf1,0x80,0x33,0x6c, +0xff,0x7e,0xb3,0x73,0xd3,0xb4,0x1, 0x17,0x7d,0x53,0x3e,0x54,0x7e,0xf, 0x24,0x64, +0x2d,0x15,0xb, 0xa, 0x40,0x12,0x5b,0x1f,0xb, 0xa, 0x20,0x9d,0x24,0x80,0x8, 0x7d, +0x53,0x12,0x5b,0x1d,0xb, 0xa, 0x20,0x12,0x5b,0x28,0x1b,0xa, 0x20,0x12,0x5b,0x15, +0x78,0xcf,0xda,0xf8,0x22,0xb, 0x34,0xb, 0xf0,0xbe,0xf0,0x4, 0x22,0x3e,0x54,0x7e, +0xf, 0x24,0x60,0x2d,0x15,0x22,0x3e,0x54,0x7e,0xf, 0x24,0x68,0x2d,0x15,0x22,0x7e, +0xf, 0x24,0x68,0x7e,0x1f,0x24,0x60,0x22,0xca,0x3b,0xd2,0x0, 0x12,0x46,0xaf,0x50, +0xfb,0xa2,0x2f,0xe4,0x33,0x7c,0xcb,0x7e,0xe3,0x77,0xbb,0x7a,0xe3,0x25,0xaf,0x7e, +0xd3,0x77,0xbc,0xa, 0x3e,0x9, 0xb3,0x77,0xb5,0x60,0x38,0xa, 0x3b,0x1b,0x34,0x7c, +0xa7,0x7a,0xa3,0x77,0x5c,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x7a,0xb3,0x25, +0xae,0xe4,0xa, 0x3e,0x19,0xb3,0x77,0xb5,0x9, 0xf3,0x77,0xb7,0x7c,0xbe,0x7c,0x7f, +0x12,0x99,0x25,0x7c,0xbe,0x7c,0x7f,0x12,0xcf,0x64,0x7e,0xb3,0x77,0xbb,0x4, 0x7a, +0xb3,0x77,0xbb,0x7e,0x73,0x77,0xbc,0xbe,0x73,0x77,0xbb,0x38,0x15,0x12,0x29,0x7d, +0x12,0xc5,0xc0,0x7e,0x73,0x77,0x2e,0x2e,0x70,0xff,0x92,0x5, 0x12,0x3c,0xb2,0x12, +0x3b,0x6e,0x7e,0xb3,0x25,0xae,0xbe,0xb0,0x1, 0x68,0x7, 0x7e,0xb3,0x78,0xb0,0xb4, +0x3, 0x46,0x74,0xa, 0xac,0xbf,0x49,0x35,0x29,0x8d,0x7e,0xf, 0x24,0x60,0x12,0x66, +0x4a,0x7c,0xbe,0x7c,0x7f,0x12,0x5c,0x3a,0x92,0x0, 0x7e,0xb3,0x78,0x8f,0x70,0xc, +0xbe,0xe0,0x1, 0x40,0x7, 0xe4,0x7a,0xb3,0x25,0xae,0xc2,0x0, 0x7c,0xbe,0x7c,0x7f, +0x12,0x58,0x1d,0x30,0x0, 0x12,0x12,0x5a,0xa2,0x7c,0xbe,0x7c,0x7f,0x12,0x5c,0x96, +0x7a,0xe3,0x77,0x5d,0x7a,0xf3,0x78,0x9b,0x7e,0xb3,0x78,0xb0,0xb4,0x1, 0x3, 0x12, +0x9f,0xf7,0x4c,0xcc,0x68,0x8, 0x12,0x5f,0xf7,0xe4,0x7a,0xb3,0x25,0xae,0x7c,0xbd, +0x14,0xbc,0xbe,0x78,0x3, 0x12,0xb, 0xe5,0x12,0xd8,0x88,0x12,0x5d,0x4a,0x50,0x7, +0x7c,0xbf,0x7c,0x7e,0x12,0xc3,0xa1,0xda,0x3b,0x22,0x7c,0x67,0x7c,0x7b,0xd2,0x1, +0x7e,0xb3,0x78,0xb0,0xb4,0x3, 0x4c,0x7c,0xb6,0x12,0x58,0x1, 0x50,0x45,0x7e,0xa3, +0x77,0x3a,0xbe,0xa0,0x2, 0x40,0x32,0x7e,0xb3,0x77,0x42,0x70,0x28,0x7e,0x63,0x29, +0xff,0xa, 0x26,0x2e,0x24,0x0, 0xe, 0x12,0x5d,0x41,0x24,0xff,0x92,0x1, 0x7c,0xb6, +0x4, 0x7a,0xb3,0x29,0xff,0x7e,0x63,0x29,0xff,0xbe,0x60,0x4, 0x40,0x15,0xe4,0x7a, +0xb3,0x29,0xff,0x80,0xe, 0xd2,0x1, 0x80,0xa, 0xbc,0xa7,0x78,0x4, 0xd2,0x1, 0x80, +0x2, 0xc2,0x1, 0xa2,0x1, 0x22,0x7c,0x37,0x7c,0x2b,0x7e,0xb3,0x73,0xd3,0x70,0x2, +0xa1,0x3c,0x12,0x5a,0x15,0x7e,0xb3,0x75,0xbb,0xbc,0xba,0x78,0x2, 0xa1,0x3c,0xa5, +0xba,0x0, 0x1b,0x7e,0x90,0x26,0xac,0x9a,0x49,0xf4,0x75,0x53,0x49,0xe4,0x75,0x51, +0xa5,0xbb,0x3, 0x15,0x49,0xf4,0x75,0x5b,0x49,0xe4,0x75,0x59,0x80,0xb, 0x74,0x26, +0xa4,0x49,0xf5,0x75,0x57,0x49,0xe5,0x75,0x55,0x7e,0x73,0x6f,0x65,0x7a,0x73,0x63, +0x6e,0x7e,0x73,0x6f,0x64,0x7a,0x73,0x63,0x6d,0xe4,0x7a,0xb3,0x63,0x6f,0x7a,0xb3, +0x63,0x70,0x6d,0x33,0x7a,0x37,0x63,0x77,0x7e,0x1f,0x24,0x68,0x7a,0x37,0x63,0x71, +0x7d,0x3f,0x7a,0x37,0x63,0x73,0x7e,0x1f,0x24,0x68,0x7a,0x37,0x63,0x75,0x7e,0x8, +0x63,0x6d,0x12,0x8, 0xe5,0x7e,0x37,0x73,0xd6,0x6c,0x55,0xa, 0x15,0x2d,0x13,0x3e, +0x14,0x7f,0x27,0x2d,0x51,0xb, 0x2a,0x0, 0x7e,0x2f,0x24,0x68,0x2d,0x51,0xb, 0x2a, +0x10,0x9d,0x10,0x1b,0x2a,0x10,0xb, 0x50,0xa5,0xbd,0x4, 0xdf,0x22,0x2e,0x24,0x22, +0x29,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0xe5,0x1e,0x70,0xc, 0x7e,0x73, +0x78,0x96,0xbe,0x73,0x78,0x9c,0x40,0x2, 0xc3,0x22,0xd3,0x22,0xca,0xf8,0x12,0xce, +0x27,0x12,0x5d,0xcf,0x12,0x5d,0x4a,0x40,0x5, 0xe4,0x7a,0xb3,0x6d,0xc2,0x7e,0xb3, +0x6d,0xc2,0x60,0xb, 0xe4,0x7a,0xb3,0x78,0xce,0x74,0x1f,0x7a,0xb3,0x73,0xd5,0x12, +0x5d,0x4a,0x40,0x6, 0x12,0x5f,0xdf,0x12,0xe3,0x39,0x7e,0xb3,0x6d,0xc5,0x60,0x6, +0x74,0x2, 0x7a,0xb3,0x78,0xd5,0x7e,0xf3,0x78,0xd5,0xbe,0xf0,0x0, 0x28,0x23,0xe5, +0x1e,0xb4,0x1, 0x14,0x7e,0xb3,0x76,0xe4,0xb4,0x1, 0xd, 0x7e,0xb3,0x78,0xea,0xbe, +0xb0,0x3c,0x68,0x4, 0x70,0xc, 0x80,0x0, 0x7c,0xbf,0x14,0x7a,0xb3,0x78,0xd5,0x12, +0xe1,0x67,0x7e,0xb3,0x6d,0xc8,0x60,0x4, 0xe4,0x12,0xe0,0x77,0xda,0xf8,0x22,0x12, +0xc8,0x68,0x12,0x5f,0x4, 0x12,0x7e,0x27,0x2, 0x5d,0xdb,0x7e,0xb3,0x6d,0xc2,0xb4, +0x1, 0x18,0x12,0x5f,0xd5,0xbe,0x73,0x78,0xce,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0xc2, +0x7e,0xb3,0x78,0xce,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x78,0xce,0x7e, +0xb3,0x6d,0xc2,0x70,0x53,0x12,0x5e,0xfd,0x78,0x15,0x7e,0xb3,0x6d,0xc3,0xb4,0x1, +0x7, 0x7e,0xb3,0x78,0xd0,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x78,0xd0,0x80,0x18,0xbe, +0xa0,0x1, 0x78,0x13,0x7e,0xb3,0x6d,0xc4,0xb4,0x1, 0x7, 0x7e,0xb3,0x78,0xd1,0x4, +0x80,0x1, 0xe4,0x7a,0xb3,0x78,0xd1,0x7e,0x73,0x78,0xd0,0xbe,0x70,0x3, 0x50,0x9, +0x7e,0x73,0x78,0xd1,0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x6d,0xc2,0xe4, +0x7a,0xb3,0x78,0xd0,0x7a,0xb3,0x78,0xd1,0x7e,0xb3,0x6d,0xc5,0xb4,0x1, 0x18,0x12, +0x5f,0xd5,0xbe,0x73,0x78,0xcf,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0xc5,0x7e,0xb3,0x78, +0xcf,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x78,0xcf,0x7e,0xb3,0x6d,0xc5, +0x70,0x53,0x12,0x5e,0xfd,0x78,0x15,0x7e,0xb3,0x6d,0xc6,0xb4,0x1, 0x7, 0x7e,0xb3, +0x78,0xd2,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x78,0xd2,0x80,0x18,0xbe,0xa0,0x1, 0x78, +0x13,0x7e,0xb3,0x6d,0xc7,0xb4,0x1, 0x7, 0x7e,0xb3,0x78,0xd3,0x4, 0x80,0x1, 0xe4, +0x7a,0xb3,0x78,0xd3,0x7e,0x73,0x78,0xd2,0xbe,0x70,0x3, 0x50,0x9, 0x7e,0x73,0x78, +0xd3,0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x6d,0xc5,0xe4,0x7a,0xb3,0x78, +0xd2,0x7a,0xb3,0x78,0xd3,0x7e,0xb3,0x6d,0xc8,0xb4,0x1, 0x1a,0x7e,0x73,0x6d,0xb2, +0xbe,0x73,0x78,0xd4,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0xc8,0x7e,0xb3,0x78,0xd4,0x4, +0x80,0x6, 0x74,0x1, 0x80,0x2, 0x74,0x1, 0x7a,0xb3,0x78,0xd4,0x22,0x7e,0xa3,0x25, +0xaf,0x4c,0xaa,0x22,0xd2,0x0, 0xe4,0x7a,0xb3,0x6d,0xc2,0x7a,0xb3,0x6d,0xc5,0x7e, +0xb3,0x6d,0xb5,0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xc2,0x12,0x5e,0xfd,0x78, +0x14,0xe4,0x7a,0xb3,0x6d,0xc3,0x7e,0xb3,0x6d,0xb6,0xb4,0x1, 0x1f,0x74,0x1, 0x7a, +0xb3,0x6d,0xc3,0x80,0x17,0xbe,0xa0,0x1, 0x78,0x12,0xe4,0x7a,0xb3,0x6d,0xc4,0x7e, +0xb3,0x6d,0xb7,0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xc4,0x7e,0xb3,0x6d,0xb8, +0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xc5,0x4c,0xaa,0x78,0x14,0xe4,0x7a,0xb3, +0x6d,0xc6,0x7e,0xb3,0x6d,0xb9,0xb4,0x1, 0x1f,0x74,0x1, 0x7a,0xb3,0x6d,0xc6,0x80, +0x17,0xbe,0xa0,0x1, 0x78,0x12,0xe4,0x7a,0xb3,0x6d,0xc7,0x7e,0xb3,0x6d,0xba,0xb4, +0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xc7,0x7e,0xb3,0x6d,0xbe,0x70,0x3, 0x12,0x5f, +0xc9,0x7e,0xb3,0x25,0xae,0x70,0x3, 0x12,0x5f,0xc9,0x7e,0xb3,0x6d,0xc0,0xb4,0x1, +0x3, 0x12,0x5f,0xc9,0x7e,0x34,0x22,0x32,0x12,0x2a,0xa9,0xbe,0x37,0x75,0xb7,0x50, +0x3, 0x12,0x5f,0xc9,0x20,0x0, 0x11,0xe4,0x7a,0xb3,0x6d,0xc3,0x7a,0xb3,0x6d,0xc4, +0x7a,0xb3,0x6d,0xc6,0x7a,0xb3,0x6d,0xc7,0x22,0xe4,0x7a,0xb3,0x6d,0xc2,0x7a,0xb3, +0x6d,0xc5,0xc2,0x0, 0x22,0xe4,0x7a,0xb3,0x6d,0xc8,0x7e,0x73,0x6d,0xb3,0x22,0x7e, +0x18,0x8, 0xc, 0x7a,0x1d,0x34,0x7e,0x1f,0x24,0x64,0x7f,0x1, 0x2, 0x5a,0x3c,0x7e, +0x34,0x0, 0xc, 0xe4,0x2, 0x24,0x38,0x6d,0x22,0x7d,0x32,0x80,0x12,0x7d,0x52,0x12, +0x5b,0x1d,0xb, 0xa, 0x10,0xbe,0x14,0x27,0x10,0x40,0x2, 0xb, 0x34,0xb, 0x24,0x7e, +0x17,0x73,0xd6,0xbd,0x12,0x38,0xe6,0xbe,0x34,0x0, 0x6c,0x28,0x7, 0x7e,0xb3,0x78, +0x26,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x26,0x7e,0x73,0x78,0x26,0xbe,0x70,0x2, +0x40,0x6, 0x74,0xaa,0x7a,0xb3,0x77,0x2c,0x22,0x6d,0x55,0x80,0x29,0x7d,0xf5,0x3e, +0xf4,0x7f,0x61,0x2d,0xdf,0xb, 0x6a,0x40,0xbe,0x44,0x0, 0x64,0x28,0x16,0x2d,0xf1, +0x7d,0xe0,0xb, 0x7a,0xd0,0xbe,0xd4,0x0, 0x64,0x50,0x2, 0x80,0x4, 0xbd,0xd4,0x28, +0x3, 0x1b,0x7a,0x40,0xb, 0x54,0xbe,0x55,0x29,0x40,0xd2,0x22,0xca,0x3b,0x6d,0x33, +0x7a,0x37,0x4e,0x83,0x7e,0x8, 0x4a,0x71,0x12,0x65,0x91,0x12,0x67,0x91,0x7e,0x34, +0x1, 0x0, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xbf,0x7e,0x34,0x1, 0x1, 0x12,0x7, 0x40, +0x7a,0x37,0x63,0xc3,0x7e,0x34,0x1, 0x2, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xc5,0x7e, +0x34,0x1, 0x6, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xc1,0x7e,0x34,0x1, 0x0, 0x6d,0x22, +0x12,0x6, 0x48,0x7e,0x34,0x1, 0x0, 0x6d,0x22,0x12,0x6, 0xc5,0x12,0x65,0x46,0x12, +0x6, 0x48,0x12,0x65,0x46,0x12,0x6, 0xc5,0x12,0x65,0x3d,0x12,0x6, 0x48,0x12,0x65, +0x3d,0x12,0x6, 0xc5,0x12,0x65,0x75,0x12,0x6, 0x48,0x12,0x65,0x75,0x12,0x6, 0xc5, +0x6d,0x33,0x12,0x7, 0x40,0x7a,0x37,0x63,0xb5,0x7e,0x34,0x0, 0x1, 0x12,0x7, 0x40, +0x7a,0x37,0x63,0xb7,0x7e,0x34,0x0, 0x2, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xb9,0x7e, +0x34,0x0, 0x8, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xbb,0x7e,0x34,0x0, 0x17,0x12,0x7, +0x40,0x7a,0x37,0x63,0xbd,0x12,0x64,0xed,0x5e,0x50,0xe0,0x4e,0x50,0xa, 0x12,0x64, +0xea,0x5e,0x50,0xe0,0x4e,0x50,0xa, 0x12,0x6, 0xc5,0x12,0x65,0x68,0x12,0x6, 0x48, +0x12,0x65,0x68,0x12,0x6, 0xc5,0x12,0x65,0x82,0x12,0x6, 0x48,0x12,0x65,0x82,0x12, +0x6, 0xc5,0x12,0x65,0x4f,0x12,0x6, 0x48,0x12,0x65,0x4f,0x12,0x6, 0xc5,0x12,0x65, +0x5b,0x12,0x6, 0x48,0x12,0x65,0x5b,0x12,0x6, 0xc5,0x12,0x64,0xf4,0x6d,0x66,0x80, +0x30,0x12,0x64,0xe1,0x7e,0xb3,0x6f,0x76,0x70,0x12,0x12,0x64,0xad,0x60,0x5, 0x3e, +0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xc3,0x80,0x10,0x12,0x64,0xad,0x60, +0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xca,0x12,0x64,0xd8,0xb, +0x64,0x12,0x64,0xd1,0xbd,0x36,0x38,0xc9,0x7e,0xb3,0x6f,0x68,0x54,0x1, 0xb4,0x1, +0xb, 0x7e,0x37,0x63,0x6d,0x4e,0x70,0x1, 0x7a,0x37,0x63,0x6d,0x12,0x3c,0x73,0x7e, +0x34,0x4, 0xc, 0xca,0x39,0x7e,0x18,0xc, 0x18,0x7e,0x8, 0x4a,0x71,0x12,0x24,0x13, +0x1b,0xfd,0x7e,0x34,0x0, 0x1, 0x41,0x6c,0x12,0x64,0xf4,0x7e,0x73,0x6f,0x65,0xa, +0x27,0x7e,0x35,0x27,0xad,0x32,0x7d,0x63,0x80,0x59,0x12,0x64,0xe1,0x7e,0x73,0x6f, +0x62,0xa, 0x37,0xbe,0x35,0x27,0x28,0x1e,0x7e,0xb3,0x6f,0x76,0x70,0xc, 0x12,0x64, +0xad,0x60,0x35,0x3e,0x14,0x14,0x78,0xfb,0x80,0x2e,0x12,0x64,0xad,0x60,0x17,0x3e, +0x14,0x14,0x78,0xfb,0x80,0x10,0x7e,0xb3,0x6f,0x76,0x70,0x12,0x12,0x64,0xad,0x60, +0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xca,0x80,0x10,0x12,0x64, +0xad,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xc3,0x12,0x64, +0xd8,0xb, 0x64,0x7e,0x25,0x27,0xb, 0x24,0x12,0x64,0xd1,0xad,0x32,0xbd,0x36,0x38, +0x99,0x7e,0xb3,0x6f,0x68,0x54,0x4, 0xb4,0x4, 0xb, 0x7e,0x37,0x63,0x6d,0x4e,0x70, +0x4, 0x7a,0x37,0x63,0x6d,0x12,0x3c,0x73,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x65, +0x0, 0x12,0x24,0x13,0x1b,0xfd,0x12,0x65,0x12,0x12,0x65,0x9, 0x7a,0x35,0x27,0x7e, +0x73,0x6f,0x64,0xa, 0x37,0xbe,0x35,0x27,0x28,0x2, 0x21,0xc8,0x6d,0x33,0x61,0x19, +0x12,0x64,0xf4,0x7e,0x65,0x27,0x80,0x59,0x12,0x64,0xe1,0x7e,0x37,0x6f,0x6a,0xbd, +0x36,0x28,0x1e,0x7e,0xb3,0x6f,0x76,0x70,0xc, 0x12,0x64,0xad,0x60,0x35,0x3e,0x14, +0x14,0x78,0xfb,0x80,0x2e,0x12,0x64,0xad,0x60,0x17,0x3e,0x14,0x14,0x78,0xfb,0x80, +0x10,0x7e,0xb3,0x6f,0x76,0x70,0x12,0x12,0x64,0xad,0x60,0x5, 0x3e,0x14,0x14,0x78, +0xfb,0x12,0x64,0xb8,0x12,0x64,0xca,0x80,0x10,0x12,0x64,0xad,0x60,0x5, 0x3e,0x14, +0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xc3,0x12,0x64,0xd8,0x12,0x64,0xd1,0x2d, +0x63,0x7e,0xa3,0x6f,0x65,0x7e,0xb3,0x6f,0x64,0xa4,0xbd,0x56,0x38,0x9a,0x7e,0xb3, +0x6f,0x69,0x54,0x1, 0xb4,0x1, 0xb, 0x7e,0x37,0x63,0x91,0x4e,0x70,0x1, 0x7a,0x37, +0x63,0x91,0x12,0x3c,0x73,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x65,0x0, 0x12,0x24, +0x13,0x1b,0xfd,0x12,0x65,0x12,0x12,0x65,0x9, 0x7a,0x35,0x27,0x12,0x64,0xd1,0xbe, +0x35,0x27,0x28,0x2, 0x41,0x80,0x12,0x64,0xf4,0x7e,0xb3,0x6f,0x69,0x54,0x4, 0xb4, +0x4, 0xb, 0x7e,0x37,0x63,0x91,0x4e,0x70,0x4, 0x7a,0x37,0x63,0x91,0x12,0x3c,0x73, +0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x65,0x0, 0x12,0x24,0x13,0x1b,0xfd,0x12,0x65, +0x12,0x12,0x60,0x39,0x6d,0x66,0x7d,0x26,0x3e,0x24,0x49,0x32,0x4a,0x71,0xbe,0x34, +0x2, 0x0, 0x28,0xf, 0x7d,0x12,0x2e,0x14,0x4a,0x71,0x9e,0x34,0x2, 0x0, 0x1b,0x18, +0x30,0x80,0x6, 0x6d,0x33,0x59,0x32,0x4a,0x71,0xb, 0x64,0xbe,0x64,0x2, 0x6, 0x78, +0xd5,0x7e,0x34,0x4a,0x71,0x7a,0x37,0x4e,0x81,0xe4,0x7a,0xb3,0x77,0x41,0x7a,0xb3, +0x77,0x40,0x12,0x64,0xed,0x12,0x64,0xea,0x12,0x6, 0xc5,0x7e,0x34,0x0, 0x1, 0x7e, +0x27,0x63,0xb7,0x12,0x6, 0x48,0x7e,0x34,0x0, 0x1, 0x7e,0x27,0x63,0xb7,0x12,0x6, +0xc5,0x7e,0x34,0x0, 0x2, 0x7e,0x27,0x63,0xb9,0x12,0x6, 0x48,0x7e,0x34,0x0, 0x2, +0x7e,0x27,0x63,0xb9,0x12,0x6, 0xc5,0x7e,0x34,0x0, 0x8, 0x7e,0x27,0x63,0xbb,0x12, +0x6, 0x48,0x7e,0x34,0x0, 0x8, 0x7e,0x27,0x63,0xbb,0x12,0x6, 0xc5,0x7e,0x34,0x0, +0x17,0x7e,0x27,0x63,0xbd,0x12,0x6, 0x48,0x7e,0x34,0x0, 0x17,0x7e,0x27,0x63,0xbd, +0x12,0x6, 0xc5,0x12,0x65,0x34,0x12,0x6, 0x48,0x12,0x65,0x34,0x12,0x6, 0xc5,0x12, +0x65,0x2b,0x12,0x6, 0x48,0x12,0x65,0x2b,0x12,0x6, 0xc5,0x12,0x65,0x22,0x12,0x6, +0x48,0x12,0x65,0x22,0x12,0x6, 0xc5,0x7e,0x34,0x1, 0x6, 0x7e,0x27,0x63,0xc1,0x12, +0x6, 0x48,0x7e,0x34,0x1, 0x6, 0x7e,0x27,0x63,0xc1,0x12,0x6, 0xc5,0x6d,0x66,0x80, +0x56,0x12,0x64,0xe1,0x7e,0x37,0x6f,0x6a,0xbd,0x36,0x28,0x1e,0x7e,0xb3,0x6f,0x76, +0x70,0xc, 0x12,0x64,0xad,0x60,0x35,0x3e,0x14,0x14,0x78,0xfb,0x80,0x2e,0x12,0x64, +0xad,0x60,0x17,0x3e,0x14,0x14,0x78,0xfb,0x80,0x10,0x7e,0xb3,0x6f,0x76,0x70,0x12, +0x12,0x64,0xad,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xca, +0x80,0x10,0x12,0x64,0xad,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12, +0x64,0xc3,0x12,0x64,0xd8,0xb, 0x64,0x12,0x77,0xb0,0xbd,0x36,0x38,0xa3,0x7e,0x34, +0x1, 0x16,0x7e,0x8, 0x63,0x6d,0x12,0x67,0xdc,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x63, +0x91,0x12,0x67,0xe3,0x12,0x3f,0x4a,0x12,0xde,0x2c,0xda,0x3b,0x22,0x7d,0x57,0x5e, +0x54,0x0, 0xf, 0x7e,0x14,0x0, 0x1, 0x22,0x7d,0x27,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x1e,0x24,0x22,0x3e,0x24,0x2e,0x24,0x63,0x6d,0x22,0x3e,0x24,0x2e,0x24,0x63,0x91, +0x22,0x7e,0x73,0x6f,0x65,0xa, 0x37,0x22,0xb, 0x28,0x30,0x4d,0x31,0x1b,0x28,0x30, +0x22,0x7d,0x36,0x3e,0x34,0x49,0x73,0x6f,0x77,0x22,0x12,0x6, 0x48,0x6d,0x33,0x7e, +0x27,0x63,0xb5,0x22,0x7e,0x8, 0x63,0x6d,0x7e,0x34,0x0, 0x48,0xe4,0x2, 0x24,0x38, +0x7e,0x18,0xc, 0x18,0x7e,0x8, 0x63,0xc7,0x22,0x12,0x60,0x39,0x7e,0x35,0x27,0xb, +0x34,0x22,0x7e,0x34,0x2, 0x6, 0x7a,0x35,0x29,0x7e,0x8, 0x4a,0x71,0x7e,0x18,0x63, +0xc7,0x22,0x7e,0x34,0x1, 0x2, 0x7e,0x27,0x63,0xc5,0x22,0x7e,0x34,0x1, 0x1, 0x7e, +0x27,0x63,0xc3,0x22,0x7e,0x34,0x1, 0x0, 0x7e,0x27,0x63,0xbf,0x22,0x7e,0x34,0x1, +0x2, 0x7e,0x24,0x6, 0xe9,0x22,0x7e,0x34,0x1, 0x1, 0x7e,0x24,0x7, 0x8, 0x22,0x7e, +0x34,0x0, 0x8, 0x7e,0x27,0x63,0xbb,0x4e,0x40,0x40,0x22,0x7e,0x34,0x0, 0x17,0x7e, +0x27,0x63,0xbd,0x5e,0x24,0xe0,0x3f,0x22,0x7e,0x34,0x0, 0x1, 0x7e,0x27,0x63,0xb7, +0x5e,0x24,0x80,0x0, 0x22,0x7e,0x34,0x1, 0x6, 0x7e,0x27,0x63,0xc1,0x5e,0x24,0xfc, +0x0, 0x22,0x7e,0x34,0x0, 0x2, 0x7e,0x27,0x63,0xb9,0x5e,0x40,0x9c,0x4e,0x40,0x21, +0x22,0x7e,0x34,0x4, 0xc, 0xe4,0x2, 0x24,0x38,0xca,0x3b,0xf5,0x2b,0x7f,0x31,0x7a, +0xd, 0x27,0x7e,0x18,0xc, 0x18,0x7a,0x1d,0x2e,0x12,0x3b,0xdc,0x7e,0xd, 0x27,0x12, +0x65,0x91,0x30,0x3, 0xc, 0x7e,0x18,0x10,0x24,0x7a,0x1d,0x32,0x7f,0x3, 0x12,0x65, +0x91,0xe4,0x68,0x3, 0x12,0x3b,0xdc,0xd2,0x4, 0x12,0x3c,0x96,0x30,0x3, 0x23,0x6d, +0x33,0x80,0x17,0x12,0x66,0x2e,0x7e,0xd, 0x32,0x2d,0x12,0xb, 0xa, 0x50,0x7d,0x23, +0x3e,0x24,0x12,0x59,0xdb,0x1b,0xa, 0x20,0xb, 0x34,0x7a,0x35,0x2c,0x12,0x66,0x36, +0x38,0xe1,0x6d,0x33,0x80,0x1f,0x12,0x66,0x2e,0x7e,0xd, 0x2e,0x2d,0x12,0xb, 0xa, +0x20,0x3e,0x34,0x7e,0xd, 0x27,0x2d,0x13,0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30, +0x7e,0x35,0x2c,0xb, 0x34,0x7a,0x35,0x2c,0x12,0x66,0x36,0x38,0xd9,0x7e,0xd, 0x27, +0x12,0x66,0x40,0x30,0x3, 0x5, 0x7f,0x3, 0x12,0x66,0x40,0xda,0x3b,0x22,0x7e,0x35, +0x2c,0x7d,0x23,0x3e,0x24,0x22,0x7e,0x37,0x73,0xd6,0xb, 0x36,0xbe,0x35,0x2c,0x22, +0x7e,0xa1,0x2b,0x74,0xa, 0xa4,0x49,0x35,0x29,0x8d,0x7d,0xb3,0x7f,0x70,0x7d,0x3b, +0x12,0x66,0xe9,0x7c,0x7b,0xa, 0x57,0x2e,0x54,0x0, 0xb, 0x7e,0x18,0x0, 0x1, 0x60, +0x5, 0x2f,0x11,0x14,0x78,0xfb,0x74,0x4, 0x2f,0x11,0x14,0x78,0xfb,0x7d,0x1b,0x12, +0x22,0xbd,0x7f,0x61,0xbe,0xb4,0x0, 0x10,0x68,0x6e,0x7e,0x73,0x6f,0x64,0x7a,0x73, +0x65,0xd3,0x7e,0x73,0x6f,0x65,0x7a,0x73,0x65,0xd4,0x74,0xb, 0x7a,0xb3,0x65,0xd5, +0x7d,0xaf,0x7a,0xa7,0x65,0xd7,0x7a,0xa7,0x65,0xdb,0xbe,0xb4,0x0, 0x2, 0x38,0xd, +0xe4,0x7a,0xb3,0x65,0xd5,0x7e,0xd4,0x0, 0x10,0x8d,0xdb,0x6d,0xcc,0x7e,0x8, 0x65, +0xd3,0x7d,0x3d,0x12,0x9, 0x50,0x7e,0x47,0x73,0xd6,0x7e,0xa0,0x4, 0x7d,0x34,0x3e, +0x34,0x7f,0x57,0x2d,0xb3,0xb, 0x5a,0x10,0x7f,0x16,0x12,0x22,0xb4,0x7e,0xb3,0x65, +0xd5,0x60,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x1b, +0x5a,0x30,0xb, 0x44,0x1b,0xa0,0x78,0xd5,0x22,0xe4,0x80,0x5, 0xb, 0x34,0x1e,0x34, +0x4, 0xbe,0x34,0x0, 0x10,0x38,0xf5,0x22,0x7c,0x9b,0x12,0xde,0xd4,0x7e,0x50,0xa, +0xac,0x59,0x59,0x32,0x29,0x8d,0x74,0x27,0xac,0xb9,0x49,0x5, 0x28,0xec,0x59,0x2, +0x29,0x8f,0x49,0x15,0x28,0xee,0xb, 0x14,0xad,0x10,0x6d,0x0, 0x59,0x12,0x29,0x93, +0x59,0x2, 0x29,0x91,0x12,0x67,0x41,0xac,0x79,0x19,0xa3,0x29,0x8b,0x74,0x27,0xac, +0xb9,0x49,0x35,0x28,0xee,0xb, 0x34,0x12,0x67,0x41,0xac,0x79,0x19,0xa3,0x29,0x8c, +0x22,0x12,0x66,0xe9,0x7c,0xab,0x7e,0x70,0xa, 0x22,0xca,0x3b,0x7c,0xeb,0xc2,0x2, +0x7e,0x70,0x27,0xac,0x7e,0x9, 0xf3,0x28,0xeb,0x12,0x67,0xd2,0x4c,0xee,0x68,0x18, +0xd2,0x2, 0xe4,0x19,0xb3,0x28,0xe9,0x7c,0xbe,0x12,0x66,0xf8,0x12,0x67,0x7d,0x12, +0xda,0xd0,0x12,0x3c,0x54,0x12,0x67,0xfa,0xa2,0x2, 0xda,0x3b,0x22,0xe4,0x7a,0xb3, +0x77,0xb1,0x12,0xe6,0x8e,0x7a,0xb3,0x77,0xb4,0x12,0xe5,0x70,0x7a,0xb3,0x77,0xbc, +0x22,0x7c,0xab,0x7e,0x8, 0x0, 0x7d,0x7c,0xba,0x12,0xd, 0xf7,0x7e,0x8, 0x0, 0xb9, +0x12,0xd, 0xf7,0x7e,0x34,0x0, 0x8, 0x7e,0x8, 0x0, 0x7d,0x12,0x67,0xea,0x7e,0x34, +0x0, 0x8, 0x7e,0x8, 0x0, 0xb9,0x7e,0x24,0x0, 0x1, 0x2, 0x4, 0x96,0xca,0x3b,0x7c, +0xeb,0x12,0x67,0xf1,0x12,0x67,0xd2,0xe5,0x1e,0x12,0x3c,0x29,0x12,0x67,0xfa,0xda, +0x3b,0x22,0x7e,0xd0,0xb5,0xac,0xdf,0x2e,0x64,0x1, 0x0, 0x22,0x7e,0x24,0x0, 0x12, +0x2, 0x3, 0xfa,0x7e,0x24,0x0, 0x12,0x2, 0x4, 0x96,0x7e,0x24,0x0, 0x1, 0x2, 0x3, +0xfa,0x74,0x27,0xac,0xbe,0x9, 0xf5,0x28,0xeb,0x22,0xe4,0x12,0x67,0x91,0x7e,0x30, +0x2c,0xac,0x3f,0x2e,0x14,0x0, 0xf5,0x6d,0x0, 0x74,0x1, 0x7e,0x70,0x27,0xac,0x7e, +0x9, 0x73,0x28,0xe9,0x12,0xd, 0x23,0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14,0x0, 0xf9, +0x6d,0x0, 0x74,0xa, 0xac,0xbe,0x9, 0xb5,0x29,0x8b,0x12,0xd, 0x73,0x7d,0x36,0xb, +0x35,0x74,0x2c,0xac,0xbf,0x49,0x25,0x0, 0xf9,0x12,0x0, 0x2e,0x7d,0x36,0x74,0x2c, +0xac,0xbf,0x49,0x25,0x0, 0xf5,0x2, 0x0, 0x2e,0x24,0x8a,0x78,0x19,0x7e,0xf, 0x78, +0xf2,0xa5,0xbf,0x0, 0x8, 0x12,0x37,0xe2,0x5e,0x70,0xfb,0x80,0x6, 0x12,0x37,0xe2, +0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x22,0x24,0x52,0x68,0xa, 0x4, 0x78,0x29,0x6d,0x33, +0x7a,0x37,0x4a,0x63,0x22,0x7e,0x63,0x6f,0x64,0x7e,0x73,0x6f,0x65,0xac,0x76,0x3e, +0x34,0x7a,0x37,0x4a,0x63,0x1e,0x34,0xa, 0x36,0x7a,0x73,0x77,0x4d,0x7e,0x37,0x4a, +0x63,0x1e,0x34,0x7a,0x73,0x77,0x4e,0x22,0x12,0x3e,0x8b,0x7e,0x73,0x78,0x8e,0x7a, +0x73,0x77,0x38,0x12,0x68,0xe7,0xe4,0x7a,0xb3,0x6f,0x32,0x7a,0xb3,0x6f,0x31,0x2, +0x68,0xb2,0x7e,0x73,0x76,0xe6,0x7a,0x73,0x78,0xb0,0x22,0x12,0x68,0xe0,0x12,0x68, +0xc4,0x2, 0x68,0xb2,0x7e,0x8, 0x78,0xba,0x2, 0x68,0xcb,0xb, 0xa, 0x30,0xbe,0x37, +0x78,0x86,0x28,0x6, 0x9e,0x37,0x78,0x86,0x80,0x2, 0x6d,0x33,0x1b,0xa, 0x30,0x22, +0x7e,0x8, 0x25,0xb1,0x2, 0x68,0xcb,0x7e,0x73,0x77,0x37,0x7a,0x73,0x73,0xd3,0x22, +0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x69,0x31,0x12,0x24,0x13,0x1b,0xfd,0x6d,0x33, +0x7d,0x13,0x3e,0x14,0x49,0x1, 0x46,0x54,0xbe,0x4, 0x0, 0x0, 0x8, 0x6, 0x49,0x21, +0x46,0x54,0x80,0x4, 0x6d,0x22,0x9d,0x20,0x59,0x21,0x46,0x54,0x49,0x1, 0x42,0x48, +0xbd,0x20,0x28,0x4, 0x59,0x21,0x42,0x48,0xb, 0x34,0xbe,0x34,0x2, 0x6, 0x40,0xd0, +0x22,0x7e,0x1f,0x24,0x68,0x7e,0x8, 0x46,0x54,0x22,0x7e,0x37,0x4e,0xa6,0x7a,0x73, +0x77,0x45,0x7e,0xb3,0x77,0x42,0xb4,0x1, 0x2, 0x80,0x2, 0x41,0x1c,0x7e,0xb3,0x77, +0x31,0x44,0x80,0x7a,0xb3,0x77,0x31,0x7e,0xa7,0x4e,0xa6,0xbe,0xa4,0x0, 0x5, 0x38, +0x30,0x6d,0xdd,0x7a,0xd7,0x4e,0x95,0x7a,0xd7,0x4e,0x93,0x7e,0x8, 0x4e,0x8d,0x7e, +0x34,0x0, 0x6, 0xe4,0x12,0x24,0x38,0x7e,0x34,0x4, 0xc, 0x7d,0x1d,0xad,0x13,0x2e, +0x14,0x42,0x48,0x6d,0x0, 0xe4,0x12,0x24,0x38,0xb, 0xd4,0xbe,0xd4,0x0, 0x2, 0x78, +0xe6,0x7e,0xa7,0x4e,0xa6,0xb, 0xa4,0x7a,0xa7,0x4e,0xa6,0xbe,0xa4,0x0, 0x5, 0x28, +0x5, 0xd2,0x25,0x12,0x68,0xf0,0x7e,0x73,0x77,0x43,0xa, 0xa7,0x3e,0xa4,0x3e,0xa4, +0x2e,0xa4,0x0, 0x5, 0xbe,0xa7,0x4e,0xa6,0x78,0x74,0x6d,0xdd,0x4d,0xdd,0x78,0x4, +0x6d,0xbb,0x80,0xa, 0x7d,0x3d,0x1b,0x34,0x3e,0x34,0x49,0xb3,0x42,0x48,0xbe,0xd4, +0x2, 0x6, 0x78,0x4, 0x6d,0xcc,0x80,0x8, 0x7d,0xcd,0x3e,0xc4,0x49,0xcc,0x42,0x4a, +0x7d,0x3b,0x2d,0x3c,0x7e,0x24,0x0, 0xa, 0x8d,0x32,0x7d,0x3d,0x3e,0x34,0x2e,0x34, +0x42,0x48,0xb, 0x38,0xa0,0x2d,0xa2,0x1b,0x38,0xa0,0xb, 0xd4,0xbe,0xd4,0x2, 0x6, +0x78,0xba,0xc2,0x25,0xe4,0x7a,0xb3,0x77,0x42,0x6d,0xaa,0x7a,0xa7,0x4a,0x63,0x7e, +0x34,0x42,0x48,0x7a,0x37,0x4e,0x7f,0x7a,0xa7,0x4e,0xa6,0x22,0xc2,0x25,0x7e,0xa7, +0x4e,0xa6,0x4d,0xaa,0x68,0x8, 0x6d,0xaa,0x7a,0xa7,0x4e,0xa6,0xd2,0x11,0x22,0x24, +0x6f,0x68,0x12,0x14,0x68,0x14,0x14,0x68,0x16,0x14,0x68,0x18,0xb, 0xb2,0x78,0x19, +0x7e,0xb3,0x1, 0x90,0x22,0x7e,0xb3,0x1, 0x91,0x22,0x7e,0xb3,0x1, 0x92,0x22,0x7e, +0xb3,0x1, 0x93,0x22,0x7e,0xb3,0x1, 0x94,0x22,0x74,0xfe,0x22,0x24,0xab,0x68,0x10, +0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f,0x74,0x5, 0x80,0x2d, +0x7e,0xb3,0x29,0xfe,0xb4,0x5, 0x2a,0x12,0x6a,0xa2,0x12,0xd8,0x40,0x2, 0x6a,0xe2, +0x7e,0xb3,0x29,0xfe,0xb4,0x5, 0x1a,0x12,0x6a,0xa2,0x75,0xe9,0xff,0x22,0x7e,0xb3, +0x29,0xfe,0xb4,0x5, 0xc, 0x12,0x6a,0xa2,0x2, 0x6a,0xc5,0x74,0x1, 0x7a,0xb3,0x29, +0xfe,0x22,0x7e,0x34,0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74, +0xfa,0x12,0x6a,0xe5,0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24, +0x4d,0x33,0x78,0xe6,0x22,0x2, 0x6a,0xc8,0x75,0xe7,0x6b,0xe4,0x7e,0x34,0x1, 0x4, +0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x5, 0x7a,0x1b,0xb0,0x75,0xe9, +0xff,0x22,0x2, 0x6a,0xc8,0x7c,0xab,0x80,0xf, 0x7e,0x70,0x2, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x0, 0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xe9, +0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba,0x12,0x6b,0x5a,0x80,0x25, +0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3,0x7c,0x7a,0x12,0x78,0xff, +0x80,0x13,0xbe,0x30,0x80,0x40,0xe, 0xbe,0x30,0xef,0x38,0x9, 0x7c,0xb3,0x24,0x80, +0x7c,0x7a,0x12,0x79,0x3b,0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x6a,0x5c,0x74,0x1, +0x7a,0xb3,0x29,0xfe,0x22,0x7c,0x6b,0x12,0x6b,0xcc,0x78,0x5, 0x7c,0xb6,0x2, 0x6b, +0x1, 0xb4,0x4, 0x5, 0x7c,0xb6,0x2, 0x40,0x2b,0x22,0x7a,0xb3,0x77,0x31,0xc4,0x54, +0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, 0xb4, +0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x76,0xe6,0x22,0x12,0x6f,0xa2,0xe4,0x7a,0xb3,0x77, +0x31,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5,0x13,0x70,0x9, 0x75,0x13,0x1, 0xe5,0x91, +0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5,0x1a,0x12,0x6b,0x45,0x5, 0x1a,0x30,0x91, +0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12,0x6b,0xad,0xf5,0x91,0x22,0x7c,0x7b,0x6c, +0xaa,0x12,0x6b,0xcc,0x78,0x9, 0x7c,0xb7,0x12,0x6b,0xd4,0x7c,0xab,0x80,0xa, 0xb4, +0x4, 0x7, 0x7c,0xb7,0x12,0x39,0x23,0x7c,0xab,0x7c,0xba,0x22,0x7e,0xb3,0x77,0x31, +0xc4,0x54,0x7, 0x22,0x7c,0x2b,0xa5,0xba,0xfa,0x5, 0x7e,0xb3,0x4a,0x66,0x22,0xa5, +0xba,0x0, 0x5, 0x7e,0xb3,0x77,0x31,0x22,0xbe,0x20,0x3, 0x38,0x13,0x30,0x21,0x6, +0x7e,0x18,0x28,0x3b,0x80,0x4, 0x7e,0x18,0x28,0x79,0x7a,0x1f,0x28,0xe0,0x80,0x5, +0xbe,0x20,0x6e,0x38,0xe, 0xa, 0x2, 0x7e,0x1f,0x28,0xe0,0x2d,0x30,0x1b,0x34,0x7e, +0x1b,0xb0,0x22,0xbe,0x20,0xd3,0x68,0x4, 0xa5,0xba,0xd4,0x11,0xa5,0xba,0xd3,0x8, +0x6d,0x33,0x7a,0x37,0x77,0x8d,0x80,0x2, 0x15,0x1a,0x2, 0x78,0x8f,0xa5,0xba,0xf6, +0xc, 0x7e,0x34,0x1b,0xd6,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x50,0x22,0xa5,0xba,0xf7, +0xa, 0x7e,0x34,0x1b,0xd6,0x12,0x2a,0xa9,0xa, 0x56,0x22,0xbe,0x20,0xf8,0x68,0x4, +0xa5,0xba,0xf9,0x1d,0xa5,0xba,0xf8,0x8, 0x6d,0x33,0x7a,0x37,0x77,0x8d,0x80,0x2, +0x15,0x1a,0x7e,0x37,0x77,0x8d,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x77,0x8d,0x2, 0x6c, +0xe0,0xbe,0x20,0xeb,0x68,0x4, 0xa5,0xba,0xec,0x5, 0x7c,0xb2,0x2, 0x6f,0x79,0xbe, +0x20,0x99,0x68,0x4, 0xa5,0xba,0x9a,0x2a,0x7e,0xb3,0x76,0xcf,0x7c,0xab,0xbe,0xa0, +0x20,0x40,0xd, 0xbe,0xa0,0x40,0x50,0x8, 0xa, 0x3a,0x9, 0x33,0x6b,0xc9,0x80,0x3, +0x12,0xe5,0xd8,0x4, 0x7a,0xb3,0x76,0xcf,0xa5,0xba,0x9a,0x3, 0x75,0x1a,0x99,0x7c, +0xb3,0x22,0xbe,0x20,0x80,0x40,0xc, 0xbe,0x20,0xef,0x38,0x7, 0xa, 0x32,0x9, 0xb3, +0x76,0x3f,0x22,0xa5,0xba,0xfc,0x5, 0x7e,0xb3,0x76,0xe6,0x22,0xa5,0xba,0xfe,0xd, +0x7e,0x23,0x78,0x97,0x74,0x27,0xac,0xb2,0x9, 0xb5,0x28,0xe8,0x22,0x74,0xff,0x22, +0x7e,0x24,0xe, 0x6, 0x2d,0x32,0x2, 0x6c,0xf3,0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e, +0x34,0x0, 0xf5,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x74,0x1, 0x7a,0xb3, +0x78,0xfa,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0x6, 0xe4,0x7a,0xb3,0x78,0xfa,0x22,0x7e, +0xb4,0x21,0x53,0x7d,0x3b,0x12,0x6c,0xf3,0x7c,0x7b,0x1e,0x70,0x7a,0x73,0x6f,0x3f, +0x7e,0xa4,0x0, 0x96,0x7a,0xa7,0x6f,0x40,0x12,0x6f,0xc7,0x12,0xe1,0xf5,0x7e,0xa3, +0x6d,0x93,0xbe,0xa0,0x0, 0x38,0x2, 0xa1,0xca,0xbe,0xa0,0x8, 0x28,0x1f,0x7e,0x37, +0x6d,0x99,0xbe,0x34,0x1, 0x90,0x58,0x15,0x7d,0x3b,0x12,0x6c,0xf3,0x1e,0xb0,0xa, +0x3b,0x7d,0x2a,0x7e,0x14,0x0, 0x8c,0x7e,0x4, 0x0, 0x82,0x80,0x66,0xbe,0xa0,0x6, +0x28,0x1b,0x7e,0x37,0x6d,0x99,0xbe,0x34,0x1, 0xf4,0x58,0x11,0x7d,0x3b,0x12,0x6c, +0xf3,0xa, 0x3b,0x7e,0x24,0x0, 0xa0,0x7d,0x1a,0x7d,0xa, 0x80,0x46,0xbe,0xa0,0x4, +0x28,0x1f,0x7e,0xa7,0x6d,0x99,0xbe,0xa4,0x2, 0x58,0x58,0x15,0x7d,0x3b,0x12,0x6c, +0xf3,0xa, 0x3b,0x7e,0x24,0x0, 0xb4,0x7e,0x14,0x0, 0xaa,0x7e,0x4, 0x0, 0xc8,0x80, +0x22,0xbe,0xa0,0x2, 0x28,0x24,0x7e,0xa7,0x6d,0x99,0xbe,0xa4,0x3, 0x20,0x58,0x1a, +0x7d,0x3b,0x12,0x6c,0xf3,0xa, 0x3b,0x7e,0x24,0x0, 0xdc,0x7e,0x14,0x0, 0xd2,0x7e, +0x4, 0x0, 0xe6,0x12,0x4f,0x3f,0x80,0x7, 0x80,0x0, 0xe4,0x7a,0xb3,0x78,0xfa,0x7e, +0xb3,0x78,0xfa,0x70,0x27,0x90,0x21,0x53,0xe4,0x93,0xa, 0x3b,0x7e,0x14,0x21,0x5b, +0x12,0x6f,0xdd,0x7e,0x14,0x21,0x5d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x7e,0x54, +0x21,0x67,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x0, 0x2, 0x4f,0x3f,0xd2,0x27,0x22,0x12, +0x6f,0xe5,0x2, 0x6c,0xfc,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x9, 0xa2,0x6c, +0x81,0x12,0x6c,0xe9,0x5c,0xba,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x2c,0x7c, +0xbe,0x12,0x6e,0x5, 0x60,0x23,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac,0x7e,0x2e,0x34, +0x6c,0x9, 0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x6c,0x9, 0x6d,0x0, 0x12, +0x24,0x13,0x1b,0xfd,0xd2,0x2, 0x12,0x6e,0x85,0xb, 0xe0,0x12,0x6f,0xa9,0x38,0xcf, +0x7a,0xf3,0x6d,0x93,0xda,0x79,0x22,0xc2,0x2, 0x7c,0xb1,0x7c,0x7b,0xc4,0x23,0x54, +0x1f,0x7c,0xab,0x12,0x6c,0xe9,0x30,0x2, 0xf, 0xa, 0x3a,0x2e,0x34,0x6c,0x81,0x7e, +0x39,0xa0,0x4c,0xba,0x7a,0x39,0xb0,0x22,0x64,0xff,0xa, 0x2a,0x2e,0x24,0x6c,0x81, +0x2, 0x57,0xe5,0xc2,0x2, 0x7c,0xbf,0x12,0x6e,0x5b,0xb, 0xf0,0x22,0xca,0xf8,0xc2, +0x0, 0xc2,0x1, 0x12,0x6f,0xbf,0x68,0x76,0x7e,0xb3,0x77,0xf, 0x70,0x70,0x7e,0xb3, +0x6d,0x93,0x70,0x5, 0x12,0x6f,0x18,0x80,0x65,0x12,0x9b,0x71,0x92,0x1, 0x12,0xcc, +0xaf,0x92,0x0, 0x30,0x0, 0x13,0x7e,0x34,0x22,0x27,0x12,0x2a,0xa9,0x7a,0x37,0x78, +0xdb,0x74,0x1, 0x7a,0xb3,0x78,0xd7,0x80,0x14,0x30,0x1, 0x19,0x7e,0x34,0x22,0x27, +0x12,0x2a,0xa9,0x7a,0x37,0x78,0xdb,0x74,0x1, 0x7a,0xb3,0x78,0xd8,0x74,0x1, 0x7a, +0xb3,0x78,0xd6,0x80,0x3, 0x12,0x6f,0x18,0x7e,0xb3,0x78,0xd7,0x60,0xe, 0x6c,0xff, +0x80,0x3, 0x12,0x6e,0x83,0x12,0x6f,0x11,0x38,0xf8,0x80,0x12,0x7e,0xb3,0x78,0xd8, +0x60,0xc, 0x6c,0xff,0x80,0x3, 0x12,0x6e,0x83,0x12,0x6f,0x11,0x38,0xf8,0xda,0xf8, +0x22,0x7e,0x73,0x6d,0x93,0xbc,0x7f,0x22,0x7e,0x37,0x78,0xdb,0xbe,0x34,0x0, 0x0, +0x28,0x7, 0x1b,0x34,0x7a,0x37,0x78,0xdb,0x22,0xe4,0x12,0x6f,0xd0,0x7a,0xb3,0x78, +0xd6,0x22,0x12,0x6f,0xb7,0x28,0x3a,0x7e,0xb3,0x6f,0x32,0x70,0x34,0x7e,0x37,0x6d, +0x95,0xbe,0x34,0x0, 0x26,0x28,0x2f,0x7e,0xb3,0x78,0xdd,0xbe,0xb0,0x2, 0x50,0x26, +0x4, 0x7a,0xb3,0x78,0xdd,0x6c,0x33,0x80,0x9, 0xc2,0x2, 0x7c,0xb3,0x12,0x6e,0x5b, +0xb, 0x30,0x7e,0x23,0x6d,0x93,0xbc,0x23,0x38,0xef,0xe4,0x7a,0xb3,0x6d,0x93,0x80, +0x5, 0xe4,0x7a,0xb3,0x78,0xdd,0x2, 0x6e,0x17,0xb4,0xeb,0x3, 0x75,0x1b,0x0, 0xe5, +0x1b,0xa, 0x3b,0x2e,0x34,0x0, 0x16,0x12,0x6c,0xf3,0x7c,0xab,0x5, 0x1b,0xe5,0x1b, +0xb4,0x3, 0x9, 0x75,0x1b,0x0, 0x6d,0x33,0x7a,0x37,0x77,0x8f,0x75,0x1a,0xeb,0x7c, +0xba,0x22,0x74,0x1, 0x7a,0xb3,0x76,0xe6,0x22,0x7e,0x73,0x6d,0x93,0xbc,0x7e,0x22, +0xc2,0x2, 0x7c,0xbc,0x2, 0x6e,0x5b,0x7e,0x73,0x6d,0x93,0xbe,0x70,0x0, 0x22,0x7e, +0xb3,0x6f,0x58,0xbe,0xb0,0x1, 0x22,0x7e,0x34,0x0, 0x8c,0x7a,0x37,0x6f,0x42,0x22, +0x7a,0xb3,0x78,0xd7,0x7a,0xb3,0x78,0xd8,0x22,0x7e,0x14,0x21,0xec,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0x20,0x22,0x7e,0x8, 0x78,0xfa,0x7e,0x34,0x0, 0x1, 0x74,0xff,0x2, +0x24,0x38,0x7e,0xa3,0x6f,0x31,0xbe,0xa0,0x0, 0x38,0x3, 0x2, 0x70,0xa8,0x7e,0xb3, +0x78,0xbf,0xbe,0xb0,0x32,0x40,0x2, 0x1, 0x8a,0x4, 0x7a,0xb3,0x78,0xbf,0xbe,0xa0, +0x2, 0x28,0xe, 0x7e,0xb3,0x78,0xbf,0x4, 0x7a,0xb3,0x78,0xbf,0x4, 0x7a,0xb3,0x78, +0xbf,0x7e,0xb3,0x78,0xbe,0x70,0x25,0x7e,0x37,0x6e,0x23,0x7a,0x37,0x78,0xc0,0x7e, +0x37,0x6e,0x25,0x7a,0x37,0x78,0xc2,0x74,0x1, 0x7a,0xb3,0x78,0xbe,0xe4,0x7a,0xb3, +0x78,0xbd,0x7e,0xb3,0x6e,0x27,0x7a,0xb3,0x78,0xc4,0x80,0x44,0x7e,0x27,0x6e,0x25, +0x7d,0x32,0x9e,0x37,0x78,0xc2,0xbe,0x34,0x0, 0x0, 0x8, 0x6, 0x9e,0x27,0x78,0xc2, +0x80,0x4, 0x6d,0x22,0x9d,0x23,0x7e,0x37,0x6e,0x23,0x7d,0x13,0x9e,0x17,0x78,0xc0, +0xbe,0x14,0x0, 0x0, 0x8, 0x6, 0x9e,0x37,0x78,0xc0,0x80,0x4, 0x6d,0x33,0x9d,0x31, +0x2d,0x32,0xbe,0x34,0x0, 0x32,0x28,0x8, 0x80,0x0, 0x74,0x1, 0x7a,0xb3,0x78,0xbd, +0x7e,0xb3,0x78,0xbd,0xb4,0x1, 0x1e,0xbe,0xa0,0x1, 0x78,0x19,0x7e,0x73,0x6e,0x27, +0xbe,0x73,0x78,0xc4,0x68,0xf, 0x80,0x0, 0xe4,0x7a,0xb3,0x78,0xbe,0x7a,0xb3,0x78, +0xbd,0x7a,0xb3,0x78,0xbf,0x22,0x7e,0x73,0x6d,0xa8,0x7a,0x73,0x6d,0xa9,0x7e,0x73, +0x6f,0x31,0x7a,0x73,0x6f,0x32,0xe4,0x7a,0xb3,0x6f,0x35,0x7e,0x73,0x78,0x8e,0x7a, +0x73,0x76,0xea,0x7e,0x73,0x6f,0x57,0x7a,0x73,0x5c,0xc3,0x22,0x7e,0xb3,0x78,0xbc, +0x4, 0x7a,0xb3,0x78,0xbc,0x7e,0x73,0x78,0xbc,0x7a,0x73,0x76,0xd0,0x22,0x7e,0x37, +0x78,0x9f,0xb, 0x34,0x7a,0x37,0x78,0x9f,0x7e,0x37,0x78,0xa1,0xbe,0x37,0x78,0x9f, +0x28,0x3, 0x2, 0x71,0x9, 0x22,0x2, 0x70,0xee,0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9, +0xd6,0xdf,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xc2,0x8f,0x12,0x71,0x6, 0xd0,0x82,0xd0,0x83, +0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b, +0x32,0xe4,0x12,0x77,0xea,0x12,0x77,0xd0,0x12,0x71,0xf2,0x12,0x71,0xe7,0x12,0x77, +0xb9,0x7e,0x34,0x0, 0x1c,0x12,0xc, 0x65,0x12,0x2d,0x3d,0x12,0x77,0x92,0x12,0x77, +0x81,0x12,0x77,0x8c,0x12,0x77,0x86,0x12,0x77,0xc4,0x12,0xd8,0x97,0x12,0x73,0x80, +0x12,0xd8,0xa7,0x12,0x71,0xc2,0x12,0x74,0x4b,0xd2,0xaf,0x12,0x72,0x2c,0x12,0x72, +0x8, 0x90,0x1c,0x45,0xe4,0x93,0xca,0xb8,0x90,0x1c,0x46,0xe4,0x93,0x7c,0x7b,0x7e, +0x24,0x1, 0x33,0xda,0xb8,0x2, 0x71,0x98,0xca,0x79,0x7c,0xf7,0x7c,0xeb,0x7c,0x7f, +0x12,0xb, 0x7b,0xa9,0xd6,0xcb,0x5e,0xe0,0x3f,0x5e,0xf0,0x3f,0x7c,0x4e,0x6c,0x55, +0xa, 0x3f,0x2d,0x32,0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, 0x32,0xa9,0xc6,0xcb,0xda, +0x79,0x22,0x2, 0x71,0xc5,0xd2,0x0, 0x12,0x45,0x86,0xa9,0xd0,0xcb,0xa9,0xc6,0xca, +0x12,0x77,0xdd,0xa9,0xd3,0x9e,0xa9,0xc3,0xb9,0xc2,0x8a,0xd2,0xaa,0x2, 0x71,0xe0, +0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x22,0xc2,0x8d,0xc2,0x8f,0x12,0x73,0xcd,0xa9,0xc0, +0x93,0x22,0x75,0xec,0xff,0x75,0xee,0xff,0x75,0xeb,0x23,0x75,0xac,0xc0,0x12,0xd7, +0xe5,0xa9,0xd5,0xad,0xa9,0xc5,0xed,0x22,0x7e,0x8, 0x6b,0xe9,0x12,0x72,0x61,0x7e, +0x34,0x0, 0x20,0x7a,0x35,0x27,0x7e,0x18,0x0, 0x20,0x12,0x72,0x6b,0x2, 0x72,0x20, +0xa9,0xc5,0xca,0xa9,0xc7,0x94,0xe4,0x7a,0xb3,0x78,0xfb,0x22,0x6c,0x77,0xa9,0xc7, +0xb3,0xa9,0xc6,0xb3,0xd2,0xc8,0x43,0xed,0xf, 0xc2,0xea,0xb, 0x70,0xbe,0x70,0x3, +0x28,0x3, 0x7e,0x70,0x3, 0xa, 0x57,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2e, +0x54,0x0, 0x3, 0xf5,0xb3,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0x72,0x61,0x2, 0x72, +0x20,0xa9,0xd7,0x94,0x74,0xa5,0x7a,0xb3,0x78,0xfb,0x22,0x12,0x72,0x79,0x7e,0x35, +0x27,0x12,0xd7,0xc9,0xa9,0xd2,0xb4,0xd3,0x22,0x7d,0x52,0xf5,0x2b,0x7c,0xb6,0x7c, +0xa5,0xa, 0x44,0xf5,0x2a,0x7f,0x21,0xf5,0x29,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0x72, +0xa4,0xe5,0x2b,0x12,0x72,0xa4,0xe5,0x2a,0x12,0x72,0xa4,0xe5,0x29,0x12,0x72,0xa4, +0xe4,0x2, 0x72,0xa4,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0x7e, +0x34,0x21,0x57,0x12,0x2a,0xa9,0x12,0x2d,0x41,0x12,0x71,0x41,0x12,0x72,0xcc,0x12, +0x6f,0xa2,0x7a,0xb3,0x78,0xb0,0x12,0x77,0xa0,0x2, 0x29,0x4a,0x12,0x97,0xcc,0x12, +0x74,0x8, 0x12,0x98,0x53,0x12,0x98,0x99,0x12,0x73,0xd5,0x12,0x2a,0xb1,0x12,0x98, +0x7a,0x12,0x73,0x3a,0x12,0xcc,0x99,0x12,0x4f,0x5e,0x2, 0x72,0xed,0xd2,0x1, 0x12, +0x29,0x5a,0x6c,0xaa,0x7e,0x63,0x78,0x97,0x7e,0x70,0x27,0xac,0x67,0x9, 0x63,0x28, +0xe8,0xa, 0x2a,0x12,0x5d,0x3d,0x7c,0x7b,0xbc,0x67,0x78,0x4, 0x7a,0xa3,0x75,0x33, +0x7e,0x50,0x26,0xac,0x5a,0x19,0x72,0x75,0x37,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xd4, +0x7e,0x73,0x75,0x33,0xbe,0x70,0x3, 0x40,0x5, 0xe4,0x7a,0xb3,0x75,0x33,0x12,0x74, +0xcd,0x7e,0x73,0x75,0x33,0x7a,0x73,0x75,0xbb,0x22,0x12,0x73,0x78,0x74,0x9, 0xac, +0x7b,0x7e,0x8, 0x6d,0xc9,0x12,0x73,0x73,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x6e,0x7d, +0x12,0x73,0x73,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x6e,0x23,0x74,0xff,0x12,0x24,0x38, +0x7e,0x8, 0x6e,0xd7,0x12,0x90,0x7b,0x7e,0x8, 0x6f,0x31,0x7e,0x34,0x0, 0xd, 0xe4, +0x2, 0x24,0x38,0x74,0xff,0x12,0x24,0x38,0x90,0x21,0x51,0xe4,0x93,0x7c,0x7b,0x22, +0xe4,0x7a,0xb3,0x77,0x31,0x7e,0x8, 0x28,0x3b,0x12,0x77,0xa7,0x7e,0x8, 0x28,0x79, +0x7e,0x34,0x0, 0x3e,0x12,0x24,0x38,0x7e,0x18,0x28,0x3b,0x7a,0x1f,0x28,0xe0,0x12, +0x73,0xb2,0x2, 0x73,0xa5,0x75,0x13,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x77,0x31,0xf5, +0x91,0x22,0x2, 0x73,0xb5,0xc2,0x92,0x12,0x73,0xcd,0x90,0x1b,0xd8,0xe4,0x93,0x54, +0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xa9,0xd4,0x95,0xd2,0xad,0x22,0x75,0x91,0x0, +0xc2,0x90,0xc2,0x91,0x22,0x7e,0x34,0x22,0x5, 0x12,0x2a,0xa9,0x7a,0x37,0x6d,0xac, +0x7e,0x34,0x22,0x7, 0x12,0x2a,0xa9,0x7a,0x37,0x6d,0xae,0x7e,0x34,0x22,0x9, 0x12, +0x2a,0xa9,0x12,0xe6,0x25,0x90,0x22,0xc, 0xe4,0x93,0x7a,0xb3,0x6d,0xb3,0xe4,0x7a, +0xb3,0x6d,0xbc,0x7a,0xb3,0x6d,0xbd,0x22,0x7e,0x34,0x4, 0x71,0xca,0x39,0x7e,0x34, +0x1c,0x43,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x6f,0x62,0x12,0x24,0x13,0x1b,0xfd,0x12, +0x77,0xb0,0x7a,0x37,0x73,0xd6,0xe4,0x7a,0xb3,0x6f,0x68,0x7a,0xb3,0x6f,0x69,0x90, +0x21,0xd9,0x93,0x70,0x6, 0x7e,0x63,0x6f,0x65,0x80,0x4, 0x7e,0x63,0x6f,0x64,0x7e, +0x70,0x40,0xac,0x67,0x1b,0x34,0x7a,0x37,0x73,0xd8,0x22,0xa9,0xd2,0xea,0xa9,0xc2, +0xea,0x6d,0x33,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x10,0x12,0x45,0x27,0x4e,0x34, +0xdc,0xe, 0x1b,0xa, 0x30,0x7e,0x34,0x1, 0xc2,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, +0x1e,0x7e,0xf, 0x78,0xf2,0x12,0x37,0xe2,0x4e,0x70,0x10,0x1b,0xa, 0x30,0x12,0xe5, +0x88,0x12,0xb, 0xe5,0x7e,0x34,0xff,0xff,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x2, +0x6d,0x33,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x14,0x12,0x74,0xc4,0x7e,0x34,0xf0, +0x4f,0x12,0x74,0xc4,0xd2,0x4, 0x12,0x3c,0x2, 0x53,0xc3,0xf8,0x75,0xc3,0x85,0x53, +0xc2,0xfc,0x43,0xc2,0x81,0xd2,0xac,0x2, 0x74,0xba,0x90,0x21,0x50,0xe4,0x93,0x7a, +0xb3,0x78,0x8f,0x22,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x4, 0x22,0x7e,0xb3,0x75, +0x33,0x7c,0xab,0x6c,0x77,0xbc,0xa7,0x78,0x2b,0x12,0x77,0x99,0x12,0x35,0xa6,0x12, +0x75,0x64,0x59,0x2, 0x75,0x49,0x7e,0x8, 0x14,0x30,0x59,0x12,0x75,0x53,0x59,0x2, +0x75,0x51,0x7e,0x8, 0x18,0x3c,0x59,0x12,0x75,0x57,0x59,0x2, 0x75,0x55,0x7e,0x8, +0x1c,0x48,0x80,0x4e,0x7e,0x50,0x4, 0xac,0x5a,0xa, 0x17,0x2d,0x21,0x2e,0x24,0x24, +0x4a,0x12,0x5d,0x41,0x7c,0x6b,0x7e,0xb3,0x78,0x97,0xa, 0xb, 0x12,0x35,0xa6,0x12, +0x75,0x64,0x59,0x2, 0x75,0x49,0xa, 0x6, 0x7e,0x14,0xc, 0x24,0xad,0x10,0x7d,0xf1, +0x2e,0xf4,0x2a,0x0, 0x6d,0xee,0x59,0xf2,0x75,0x53,0x59,0xe2,0x75,0x51,0x7d,0xf1, +0x2e,0xf4,0x2e,0xc, 0x59,0xf2,0x75,0x57,0x59,0xe2,0x75,0x55,0x2e,0x14,0x32,0x18, +0x6d,0x0, 0x59,0x12,0x75,0x5b,0x59,0x2, 0x75,0x59,0xb, 0x70,0xbe,0x70,0x3, 0x50, +0x2, 0x81,0xd5,0x22,0x2e,0x14,0x4e,0xa8,0x6d,0x0, 0x7e,0x50,0x26,0xac,0x57,0x59, +0x12,0x75,0x47,0x59,0x2, 0x75,0x45,0x7e,0x8, 0x57,0x98,0x59,0x12,0x75,0x4f,0x59, +0x2, 0x75,0x4d,0x7e,0x8, 0x55,0x5c,0x59,0x12,0x75,0x4b,0x22,0x7c,0x9b,0x7e,0x24, +0x0, 0x1, 0x7c,0xb9,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x83,0x73,0xd4,0xa, +0x38,0x5d,0x32,0x68,0xb, 0x12,0x74,0xcd,0x7e,0x83,0x75,0x33,0x7a,0x83,0x75,0xbb, +0x6c,0xaa,0x7e,0xb3,0x75,0xbb,0xbc,0xba,0x78,0x8, 0x6c,0x88,0x12,0x75,0xed,0xe4, +0x80,0x1f,0x7e,0x24,0x0, 0x1, 0x7c,0xb9,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e, +0xb3,0x73,0xd4,0xa, 0x3b,0x5d,0x32,0x68,0xc, 0x7e,0x80,0x1, 0x12,0x75,0xed,0x74, +0x1, 0x19,0xb3,0x75,0x44,0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xc6,0x22,0x7e,0x70,0x26, +0xac,0x7a,0x19,0x83,0x75,0x43,0x22,0x30,0x28,0x24,0xc2,0x28,0x7e,0x73,0x76,0xbc, +0x7a,0x73,0x76,0xe4,0x74,0xff,0x7a,0xb3,0x76,0xbc,0x7e,0xa3,0x76,0xe4,0x4c,0xaa, +0x78,0x5, 0x12,0x76,0xad,0x80,0x7, 0xbe,0xa0,0x1, 0x78,0x2, 0xd2,0x1c,0x30,0x1c, +0x3, 0x12,0x76,0xc8,0x7e,0xb3,0x76,0xe4,0x14,0x68,0x5b,0x1b,0xb1,0x68,0x5f,0x24, +0x3, 0x78,0x6e,0x12,0x76,0xa5,0x38,0x7, 0x7e,0xb3,0x78,0xd6,0xb4,0x1, 0x16,0x12, +0x54,0x9a,0x7e,0xb3,0x76,0xc5,0x30,0xe0,0x5b,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0x54, +0x30,0x14,0x51,0x80,0x2e,0x7e,0xb3,0x76,0xc5,0x30,0xe0,0x48,0x7e,0x37,0x78,0xeb, +0x7e,0x44,0x3, 0xe8,0x7d,0x53,0x8d,0x54,0x7e,0x53,0x76,0xc6,0xa, 0x15,0xbd,0x51, +0x50,0x11,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0x2b,0x7e,0x24,0x0, 0xc8,0x8d,0x32,0xbd, +0x31,0x40,0x21,0x2, 0x76,0xc8,0x12,0x76,0xa5,0x28,0x19,0x2, 0x77,0x9, 0x7e,0x34, +0x21,0x59,0x12,0x2a,0xa9,0x12,0x2d,0x41,0x12,0x45,0x62,0x12,0x72,0xaf,0x2, 0x76, +0xad,0x12,0x77,0x2, 0x22,0x7e,0x73,0x6f,0x31,0xbe,0x70,0x0, 0x22,0xe4,0x7a,0xb3, +0x76,0xe4,0xd2,0x15,0x12,0x54,0x9a,0x2, 0x76,0xba,0x12,0x3b,0x65,0x5e,0x34,0x0, +0x1, 0x68,0x4, 0xd2,0x1e,0xc2,0x1b,0x22,0xe5,0x1e,0xb4,0x1, 0xc, 0x7e,0xb3,0x25, +0xaf,0x60,0x6, 0xe4,0x7a,0xb3,0x76,0xe4,0x22,0xc2,0x1c,0x12,0x77,0x2, 0xe4,0x7a, +0xb3,0x28,0xe6,0x12,0x54,0x9a,0x7a,0xb3,0x78,0xed,0x7a,0xb3,0x78,0xea,0x12,0x3b, +0x65,0x5e,0x34,0x0, 0x2, 0x68,0xa, 0x7e,0xb3,0x73,0xd5,0x44,0x8, 0x7a,0xb3,0x73, +0xd5,0x22,0x74,0x1, 0x7a,0xb3,0x76,0xe4,0x22,0x7e,0xb3,0x77,0xf, 0x60,0x5, 0x20, +0x14,0x5, 0x80,0x0, 0x2, 0x76,0xad,0x22,0x12,0x75,0xf7,0xe5,0x1e,0x70,0x5, 0x12, +0x45,0x94,0x80,0x3, 0x12,0x46,0xd0,0x2, 0x77,0x2a,0x6c,0x77,0x7e,0x30,0x3b,0x7e, +0xa0,0x3c,0x7e,0xb3,0x76,0xe4,0xb4,0x1, 0xf, 0xe5,0x1e,0x60,0xb, 0x7e,0x23,0x78, +0xed,0xbc,0x27,0x78,0x3, 0x12,0xdd,0xe3,0x7e,0xb3,0x76,0xe4,0xb4,0x1, 0x31,0xe5, +0x1e,0x60,0x2d,0x7e,0xb3,0x78,0xed,0xbc,0xb3,0x78,0xb, 0x7e,0xb3,0x77,0x2e,0x60, +0x2, 0xd2,0x2c,0x12,0x76,0xba,0x7e,0xb3,0x78,0xed,0x7a,0xb3,0x78,0xea,0x4, 0x7a, +0xb3,0x78,0xed,0x7e,0x73,0x78,0xed,0xbc,0x7a,0x28,0x5, 0xe4,0x7a,0xb3,0x78,0xed, +0x22,0xc2,0x88,0xd2,0xa8,0x22,0xa9,0xd5,0xcd,0xd2,0x99,0x22,0xa9,0xd6,0xcd,0xd2, +0x98,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e,0x63,0x78,0x97,0xa, 0x6, 0x22, +0x7e,0x34,0xd, 0xac,0x2, 0x2d,0x41,0x7e,0x34,0x0, 0x3e,0x74,0xff,0x2, 0x24,0x38, +0x7e,0x37,0x6f,0x6c,0x2e,0x37,0x6f,0x6a,0x22,0xa9,0xc3,0xcb,0xc2,0xcd,0xc2,0xcc, +0xa9,0xd6,0xea,0x22,0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22, +0xa9,0xc5,0xcb,0xa9,0xd1,0xcb,0xa9,0xd2,0xca,0xa9,0xd2,0xcb,0x22,0xa9,0xd0,0x9e, +0xa9,0xd4,0x9e,0x75,0x9d,0x0, 0x75,0x9c,0x20,0x22,0xa9,0xc5,0xca,0xbe,0xb0,0x8, +0x50,0x2, 0xf5,0xcc,0x75,0xe6,0x0, 0x22,0xca,0xb8,0xca,0x39,0x12,0x77,0xdd,0x12, +0x71,0xe0,0x7e,0x37,0x78,0x86,0xb, 0x34,0x7a,0x37,0x78,0x86,0x7e,0x37,0x78,0x98, +0xb, 0x34,0x7a,0x37,0x78,0x98,0x7e,0xb3,0x76,0xe6,0xb4,0x1, 0x40,0x7e,0xb3,0x78, +0x9a,0x4, 0x7a,0xb3,0x78,0x9a,0x7e,0x73,0x78,0x9a,0xbe,0x70,0xa, 0x28,0x2e,0xe4, +0x7a,0xb3,0x78,0x9a,0x7e,0x73,0x78,0x91,0xbe,0x73,0x78,0xbc,0x78,0x8, 0x7e,0x37, +0x78,0x88,0xb, 0x34,0x80,0xa, 0x7e,0x73,0x78,0xbc,0x7a,0x73,0x78,0x91,0x6d,0x33, +0x7a,0x37,0x78,0x88,0xbe,0x34,0x0, 0xfa,0x28,0x3, 0x75,0xe9,0xff,0x7e,0xb3,0x78, +0x8a,0x60,0x5, 0x14,0x7a,0xb3,0x78,0x8a,0x7e,0xb3,0x78,0x8a,0x70,0x2, 0xd2,0x15, +0x7e,0x37,0x78,0xeb,0xb, 0x34,0x7a,0x37,0x78,0xeb,0x7e,0x37,0x78,0x94,0xbe,0x34, +0x0, 0x0, 0x28,0x6, 0x1b,0x34,0x7a,0x37,0x78,0x94,0xda,0x39,0xda,0xb8,0x32,0x7e, +0xa3,0x27,0x72,0x7e,0x70,0x4, 0xac,0x7a,0xb, 0x34,0xbe,0x37,0x77,0x8d,0x40,0x39, +0x7e,0x37,0x77,0x8d,0xb, 0x34,0x7a,0x37,0x77,0x8d,0xbe,0x34,0x0, 0x1, 0x78,0x5, +0x7e,0xb3,0x77,0x12,0x22,0xbe,0x34,0x0, 0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34, +0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25,0x9, 0xb2,0x78,0xde,0x22,0x9e,0x34,0x0, +0x3, 0x2e,0x37,0x25,0xb3,0x7e,0x39,0xb0,0x22,0x74,0xff,0x22,0xca,0x2b,0xca,0x1b, +0xca,0xb, 0xc0,0x83,0xc0,0x82,0x12,0x6b,0x82,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda, +0x1b,0xda,0x2b,0x32,0x12,0x78,0xfb,0x75,0x13,0x0, 0x32,0xa9,0xc0,0x93,0x22,0xbe, +0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x77,0x8f,0x4d,0x22,0x78,0xe, 0xa5, +0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x77,0x8f,0x15,0x1a,0x7e,0x27,0x77, +0x8f,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, 0x6, 0x7e,0x34,0x0, 0x2, 0x80, +0x2, 0x6d,0x33,0x7a,0x37,0x77,0x8f,0x75,0x1a,0xea,0x22,0x7c,0x6b,0x2e,0x60,0xdd, +0x68,0x29,0x2e,0x60,0xfd,0x68,0x24,0x1b,0x61,0x68,0x20,0x2e,0x60,0xfa,0x68,0x1b, +0x1b,0x60,0x68,0x17,0x80,0x0, 0xa, 0x2b,0x19,0x72,0x76,0xbf,0xd2,0x27,0x7a,0xb3, +0x76,0xbd,0xb4,0x25,0x6, 0xd2,0x28,0x7a,0x73,0x76,0xbc,0x22,0x7e,0x18,0x6e,0xd7, +0x6c,0x33,0x80,0x7e,0x7e,0x10,0x9, 0xac,0x13,0x9, 0x20,0x6e,0x27,0x90,0x21,0x51, +0xe4,0x93,0xbc,0xb2,0x28,0x6a,0x7c,0xa2,0x5e,0xa0,0xf, 0x74,0x9, 0xa4,0x2d,0x53, +0x7d,0x42,0x7e,0x2b,0xa0,0x49,0x40,0x6e,0x25,0xbe,0x44,0x0, 0x40,0x38,0x4c,0x49, +0x40,0x6e,0x23,0xbe,0x44,0x0, 0x0, 0x40,0x42,0x7e,0xf4,0x21,0xde,0x12,0x7e,0xd0, +0xbd,0x40,0x38,0x37,0x4c,0xaa,0x78,0x38,0x7e,0xb3,0x28,0xdf,0x70,0x32,0x7e,0xb3, +0x6f,0x31,0xb4,0x1, 0x2b,0x74,0x1, 0x7a,0xb3,0x28,0xdf,0x7e,0x90,0x3, 0x7e,0x10, +0x9, 0xac,0x12,0x7f,0x71,0x2d,0xf0,0x7a,0x7b,0x90,0x74,0x3, 0x7f,0x71,0x2d,0xf0, +0x39,0xb7,0x0, 0x1, 0xe4,0x7a,0xb3,0x25,0xae,0x80,0x5, 0xe4,0x7a,0xb3,0x28,0xdf, +0xb, 0x30,0x7e,0xb3,0x6f,0x3e,0xbc,0xb3,0x28,0x2, 0x21,0x74,0x7e,0xb3,0x6f,0x31, +0x70,0xa, 0x12,0x7a,0xd, 0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xdf,0x22,0x7e,0x73,0x6f, +0x32,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xb3,0x6f,0x31,0x70,0x17,0xe4,0x7a,0xb3, +0x6f,0x3a,0x12,0x7a,0xd, 0x28,0x1f,0x74,0x1, 0x7a,0xb3,0x6f,0x36,0xe4,0x7a,0xb3, +0x6f,0x39,0x80,0x12,0x74,0x1, 0x7a,0xb3,0x6f,0x3a,0x7e,0xb3,0x6f,0x32,0x70,0x6, +0x74,0x1, 0x7a,0xb3,0x6f,0x35,0x12,0x90,0xc9,0xca,0x59,0x7e,0x18,0x6d,0xc9,0x7e, +0x8, 0x6e,0x23,0x12,0x24,0x13,0x1b,0xfd,0x90,0x1c,0x2c,0xe4,0x93,0xbe,0xb0,0x0, +0x38,0x2, 0x61,0x1e,0x6c,0xff,0x80,0x24,0x74,0x9, 0xac,0xbf,0x49,0x35,0x6d,0xc9, +0x12,0xb3,0xbd,0x74,0x9, 0xac,0xbf,0x59,0x35,0x6e,0x23,0x49,0x35,0x6d,0xcb,0x12, +0x7b,0x21,0x74,0x9, 0xac,0xbf,0x59,0x35,0x6e,0x25,0xb, 0xf0,0x12,0xbf,0xdc,0x38, +0xd7,0x7e,0xa3,0x6f,0x31,0xbe,0xa0,0x1, 0x78,0x9, 0x7e,0xb3,0x6f,0x32,0xb4,0x1, +0x2, 0x80,0xb, 0xbe,0xa0,0x1, 0x78,0x16,0x7e,0xb3,0x6f,0x32,0x70,0x10,0x7e,0x37, +0x6e,0x23,0x7a,0x37,0x78,0xca,0x7e,0x37,0x6e,0x25,0x7a,0x37,0x78,0xcc,0xbe,0xa0, +0x1, 0x78,0x18,0x7e,0xb3,0x6f,0x32,0x70,0x12,0x7e,0x37,0x6e,0x23,0x7a,0x37,0x78, +0xc5,0x7e,0x37,0x6e,0x25,0x7a,0x37,0x78,0xc7,0x80,0x43,0xbe,0xa0,0x1, 0x78,0x2b, +0x7e,0xb3,0x6f,0x32,0xb4,0x1, 0x24,0x7e,0x37,0x6e,0x25,0x9e,0x37,0x78,0xc7,0x12, +0x24,0x5a,0x7d,0x13,0x7e,0x37,0x6e,0x23,0x9e,0x37,0x78,0xc5,0x12,0x24,0x5a,0x2d, +0x31,0xbe,0x34,0x0, 0x96,0x8, 0x17,0x74,0x1, 0x80,0xf, 0x4c,0xaa,0x78,0xf, 0x6d, +0x33,0x7a,0x37,0x78,0xc5,0x7a,0x37,0x78,0xc7,0xe4,0x7a,0xb3,0x78,0xc9,0xda,0xf8, +0x22,0x7d,0x13,0x9f,0x11,0x7e,0xf4,0x21,0xdc,0x12,0x7e,0xd0,0x12,0xe6,0xd3,0xb, +0x7a,0xf0,0x7e,0xd4,0x21,0xee,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0xe0,0x90,0x1c,0x2c, +0xe4,0x93,0x70,0x3, 0x7d,0x31,0x22,0x90,0x21,0xd9,0xe4,0x93,0xb4,0x1, 0x6, 0x7e, +0x83,0x6f,0x66,0x80,0x4, 0x7e,0x83,0x6f,0x67,0x12,0xb4,0xda,0xbe,0x14,0x0, 0x3f, +0x38,0x21,0x7e,0x24,0x0, 0x3f,0x9d,0x21,0x7e,0x14,0x21,0xf2,0x12,0x7c,0x34,0xad, +0x32,0x6d,0x22,0x12,0x7c,0x18,0x12,0x7c,0x1f,0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f, +0x10,0x81,0xd, 0x7d,0x54,0x9e,0x54,0x0, 0x3f,0xbd,0x51,0x38,0x35,0x7d,0x54,0x9e, +0x54,0x0, 0x1f,0xbd,0x51,0x40,0x76,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x21,0x9d, +0x23,0x7e,0x14,0x21,0xf4,0x12,0x7c,0x34,0xad,0x32,0x6d,0x22,0x12,0x7c,0x18,0x90, +0x21,0xf1,0x12,0x7c,0x22,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0x12,0x7c,0x2b,0x2f,0x10, +0x80,0x4b,0x7d,0x50,0x1b,0x54,0xbd,0x51,0x40,0x19,0x7d,0x30,0x9d,0x31,0x6d,0x22, +0x7e,0x14,0x21,0xf6,0x12,0x7c,0xe, 0x7d,0x1e,0x1b,0x14,0x6d,0x0, 0x9f,0x1, 0x7f, +0x10,0x80,0x13,0x7d,0x31,0x9d,0x30,0x6d,0x22,0x7e,0x14,0x21,0xf8,0x12,0x7c,0xe, +0x7d,0x1e,0x6d,0x0, 0x2f,0x10,0x12,0x7c,0x1f,0x58,0x4, 0x7f,0x10,0x80,0xe, 0x90, +0x21,0xf1,0xe4,0x93,0x12,0x7c,0x2b,0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x10,0x12,0x22,0xb4,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x90, +0x21,0xf0,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0x22,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0xca,0xf8,0x7e,0xa3, +0x6f,0x31,0x7e,0xb3,0x6f,0x32,0xc2,0x14,0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, +0x38,0x1c,0x7e,0x47,0x6d,0x95,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3, +0x27,0x4a,0x4c,0xff,0x68,0xf, 0x7e,0x47,0x25,0xb1,0x4d,0x44,0x78,0x7, 0xd2,0x14, +0x12,0x77,0x2, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e,0x37,0x25,0xb1, +0x7a,0x37,0x27,0x4c,0x7e,0xb3,0x27,0x4a,0xb4,0x3, 0x1f,0x7e,0x37,0x25,0xb1,0xbe, +0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x27,0x4a,0x7e,0x37,0x27,0x62,0x7e, +0x27,0x27,0x64,0x12,0x7d,0x47,0xa1,0x40,0x80,0x0, 0x12,0xe4,0xd8,0xa1,0x40,0x7e, +0xc7,0x6e,0x23,0x7e,0xd7,0x6e,0x25,0x4c,0xff,0x78,0x19,0x70,0x57,0xbe,0xa0,0x1, +0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xe4,0x73,0x12,0x7d,0x43,0x74,0x1, 0x7a,0xb3, +0x27,0x4a,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x27,0x52,0x9e,0x27,0x27, +0x5a,0x7e,0x14,0x22,0x69,0x12,0x7c,0x34,0xbd,0x23,0x38,0x13,0x7e,0x27,0x27,0x60, +0x9e,0x27,0x27,0x58,0x7e,0x14,0x22,0x6b,0x12,0x7c,0x34,0xbd,0x23,0x28,0x15,0x74, +0x3, 0x7a,0xb3,0x27,0x4a,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a,0xc7,0x27,0x62, +0x7a,0xd7,0x27,0x64,0x7e,0xb3,0x27,0x4a,0x60,0x26,0x7d,0x3c,0x7d,0x2d,0x7e,0x17, +0x25,0xb5,0x7e,0x7, 0x25,0xb7,0x12,0x7e,0xd8,0xa, 0x2b,0x7e,0x73,0x27,0x49,0xa, +0x37,0xbd,0x32,0x58,0xb, 0x12,0x7d,0x43,0x7a,0xc7,0x25,0xb5,0x7a,0xd7,0x25,0xb7, +0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24,0x12,0xe4,0x4e, +0x7d,0x31,0x12,0xe3,0xc5,0x2, 0x7d,0x58,0x7e,0x3, 0x27,0x72,0xbe,0x0, 0x64,0x50, +0x2, 0xa1,0xed,0x80,0x7d,0x6c,0x99,0x7e,0xb3,0x27,0x49,0xbe,0xb0,0x20,0x50,0x5, +0x4, 0x7a,0xb3,0x27,0x49,0x7e,0x1f,0x25,0xb9,0x7a,0x1f,0x63,0x6d,0x7e,0x80,0x1, +0x80,0x45,0x74,0x4, 0xac,0xb8,0x49,0x35,0x25,0xb9,0x49,0x25,0x25,0xbb,0x7e,0x17, +0x63,0x6d,0x7e,0x7, 0x63,0x6f,0x12,0x7e,0xd8,0x7c,0x1b,0x7e,0x3, 0x27,0x49,0xbc, +0x1, 0x38,0x22,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x25,0xb9,0x7e,0x14, +0x63,0x6d,0x74,0x4, 0x12,0xbf,0xe4,0x7e,0x30,0x4, 0xac,0x39,0x2e,0x14,0x25,0xb9, +0x74,0x4, 0x12,0x23,0x44,0xb, 0x80,0x7e,0x3, 0x27,0x72,0xbc,0x8, 0x38,0xb3,0xa, +0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x27,0x72,0x7e,0x3, 0x27,0x49,0xbe,0x0, 0x20, +0x50,0xb, 0x7e,0x3, 0x27,0x72,0xbe,0x0, 0xec,0x40,0x2, 0xa1,0x65,0x22,0x7d,0x13, +0x7e,0x54,0x22,0x37,0x12,0x7e,0x1d,0x50,0x21,0x7e,0x54,0x22,0x39,0x12,0x7e,0x1d, +0x28,0x18,0x7e,0x14,0x22,0x3b,0x12,0x7c,0x34,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x22, +0x3d,0x12,0x7c,0x34,0xbd,0x32,0x28,0x2, 0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, +0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x7e,0x47,0x6d,0x9d,0x7e,0x7, 0x6f,0x44,0x7e, +0x34,0x0, 0x6, 0xad,0x30,0x7e,0x14,0x0, 0x4, 0x12,0x7e,0xc8,0x8, 0x5, 0x7e,0xa0, +0x4, 0x80,0x1d,0x7d,0x30,0x3e,0x34,0x12,0x7e,0xc6,0x8, 0x5, 0x7e,0xa0,0x3, 0x80, +0xf, 0x7d,0x30,0x12,0x7e,0xc6,0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0,0x1, +0x7e,0xb3,0x6d,0xbf,0x60,0x3, 0x7e,0xa0,0x4, 0x12,0xcf,0xd1,0x60,0x3, 0x7e,0xa0, +0x1, 0xa, 0x2a,0x7e,0x14,0x22,0x9, 0x12,0x7c,0x34,0xad,0x32,0x12,0xe6,0x25,0x7e, +0xb3,0x6d,0x93,0xbe,0xb0,0x0, 0x28,0x28,0x7e,0xb3,0x6d,0xb4,0x70,0x22,0x7e,0x37, +0x6d,0xb0,0xbe,0x34,0x0, 0x2, 0x48,0x9, 0x12,0xae,0x4f,0x7a,0x37,0x6d,0xb0,0x80, +0xf, 0x7e,0x63,0x6d,0xb2,0x7e,0x70,0x2, 0xac,0x67,0x7c,0xb7,0x7a,0xb3,0x6d,0xb2, +0x7e,0xb3,0x76,0xe4,0xb4,0x1, 0xe, 0x7e,0x27,0x6d,0xb0,0x7e,0x34,0x0, 0x5, 0xad, +0x32,0x7a,0x37,0x6d,0xb0,0x22,0x3e,0x34,0x7d,0x21,0x12,0x22,0x71,0xbd,0x34,0x22, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x22,0x7d,0x51,0x7d,0x12,0x7d,0x23,0x9d,0x25, +0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x7d,0x52,0x80,0x4, 0x6d,0x55,0x9d,0x52,0x7c,0xab, +0x7d,0x21,0x9d,0x20,0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x7d,0x32,0x80,0x4, 0x6d,0x33, +0x9d,0x32,0x7c,0xb7,0xbc,0xba,0x50,0x3, 0x7c,0xba,0x22,0x22,0x7e,0xb3,0x77,0xf, +0x70,0x6, 0x12,0x7f,0x45,0x2, 0xe3,0x43,0x12,0x7c,0x3c,0x12,0xe4,0x43,0x50,0xa, +0x12,0x7f,0x4b,0x7c,0x3b,0x12,0x7f,0x45,0x80,0x5, 0x12,0xb4,0xee,0x7c,0x3b,0x4c, +0x33,0x68,0x11,0x7c,0xb3,0x12,0xe3,0x49,0x60,0xa, 0x7a,0x33,0x77,0x12,0x74,0x1, +0x7a,0xb3,0x6f,0x37,0x22,0xe4,0x7a,0xb3,0x27,0x4a,0x22,0x12,0xe4,0x3a,0x7a,0x37, +0x27,0x66,0x12,0xe4,0x31,0x7a,0x37,0x27,0x68,0x7e,0x73,0x27,0x72,0xa, 0x37,0x7a, +0x35,0x27,0x7e,0x8, 0x25,0xb9,0x7e,0x18,0x27,0x4a,0x2, 0x7f,0x6d,0xca,0xf8,0x7e, +0x45,0x27,0x7c,0xb9,0x7a,0xb3,0x77,0xe1,0x74,0xff,0x7a,0xb3,0x77,0xe0,0x6d,0x55, +0x80,0x1f,0x7d,0xf5,0x3e,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x7d, +0xe5,0x3e,0xe4,0x59,0xfe,0x63,0x6d,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x64,0x35,0xb, +0x54,0xbd,0x45,0x38,0xdd,0x7e,0x33,0x77,0xe1,0xbe,0x30,0x4, 0x38,0x3, 0x2, 0x80, +0x36,0x69,0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78, +0x4, 0x7e,0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x22,0x71,0x7c,0xf7,0x74,0x40, +0x7a,0xb3,0x77,0xe4,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31, +0x7d,0x2f,0x12,0x22,0x71,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x77,0xe4,0x7d,0xf, 0x2d, +0xf, 0xbd,0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x77,0xe4,0xa, 0x37,0x6d, +0x22,0x12,0x22,0xa3,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, +0x2f,0x2, 0x12,0x22,0xbf,0x7a,0x73,0x77,0xe4,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x80, +0x55,0x12,0x81,0xd6,0x12,0x80,0x55,0x12,0x80,0x5e,0x12,0x80,0x55,0x12,0x82,0x85, +0x80,0xa, 0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x77,0xe0,0xe4,0x7a,0xb3,0x77, +0xe1,0x7e,0x73,0x78,0xe4,0xbe,0x73,0x77,0xe0,0x48,0x6, 0x7e,0xb3,0x77,0xe2,0x80, +0x1, 0xe4,0xda,0xf8,0x22,0x7e,0x8, 0x63,0x6d,0x7e,0x18,0x64,0x35,0x22,0xca,0x3b, +0x7f,0x71,0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x64, +0xfd,0x7a,0x43,0x65,0x61,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0x21,0x7f,0x7e,0x90,0x2, +0xac,0x9a,0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x29,0x7f, +0x67,0x2d,0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a, +0x7c,0x8f,0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79, +0x9d,0x7a,0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58, +0x7, 0xbe,0xf0,0x2, 0x58,0x2, 0x21,0x7d,0xbe,0x60,0x0, 0x18,0x2, 0x21,0x65,0xbe, +0x70,0xec,0x28,0x2, 0x21,0x89,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61, +0xa, 0xa7,0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x81,0xcd,0x19, +0xba,0x64,0xfd,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x81,0xcd,0x19,0xba,0x65,0x61, +0x9, 0xba,0x64,0xfd,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd, +0xa, 0xc7,0x19,0xbc,0x64,0xfc,0x9, 0xbc,0x65,0x61,0xa, 0xcb,0xa, 0xa4,0x2d,0xac, +0x12,0x81,0xcd,0x19,0xba,0x65,0x60,0x2d,0xdb,0x12,0x81,0xc4,0x19,0xbd,0x64,0xfe, +0xa, 0xd9,0x12,0x81,0xc2,0x19,0xbd,0x65,0x62,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80, +0x24,0xbe,0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x29,0xa, 0xcb,0xa, +0xd5,0x12,0x81,0xc2,0x19,0xbd,0x64,0xfd,0xa, 0xc9,0xa, 0xd4,0x12,0x81,0xc2,0x19, +0xbd,0x65,0x61,0xb, 0x70,0xbe,0x70,0x64,0x50,0x1f,0x7e,0x51,0x29,0x7c,0x49,0xe5, +0x29,0xa, 0xd7,0x19,0xbd,0x64,0xfd,0x19,0x9d,0x65,0x61,0xb, 0x70,0xb, 0xa0,0x7e, +0xb3,0x77,0xe1,0xbc,0xba,0x28,0x2, 0x1, 0x7d,0x7a,0x73,0x77,0xe1,0x7e,0xa0,0x1, +0x80,0x25,0xa, 0x3a,0x9, 0xb3,0x64,0xfd,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f, +0x60,0x2d,0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x65,0x61,0xa, 0x4b,0x2d,0x3f, +0x7d,0x2e,0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x77,0xe1,0xbc,0xba,0x38,0xd3,0xda, +0x3b,0x22,0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d, +0x6a,0x7c,0xbd,0xa, 0xa7,0x22,0xca,0xf8,0x7f,0x51,0x7f,0x40,0x7e,0x37,0x27,0x5a, +0x7a,0x37,0x65,0x1, 0x7e,0x37,0x27,0x58,0x7a,0x37,0x65,0x3, 0x7e,0x37,0x27,0x66, +0x7a,0x37,0x64,0xfd,0x7e,0x37,0x27,0x68,0x7a,0x37,0x64,0xff,0x6c,0xff,0x80,0x1e, +0x7e,0x34,0x64,0xfd,0x7e,0x14,0x0, 0x29,0x74,0x9, 0x12,0x23,0x44,0x74,0x2, 0xac, +0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0x82,0x29,0xb, 0xf0,0x7e,0x73, +0x77,0xe1,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e,0x35,0x29, +0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x29,0x7e,0x35,0x2b, +0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2b,0xb, 0x6a,0x30, +0x9e,0x35,0x2d,0x6d,0x22,0x7e,0x33,0x77,0xe3,0x12,0x82,0x7e,0x7e,0x15,0x29,0x12, +0x22,0xbd,0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x2f,0x6d,0x22,0x7e,0x33,0x77, +0xe4,0x12,0x82,0x7e,0x7e,0x15,0x2b,0x12,0x22,0xbd,0x1b,0x7a,0x30,0x22,0xa, 0x13, +0x6d,0x0, 0x2, 0x22,0xa3,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x77,0xe1,0xbe, +0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22,0x74,0x5, 0x2f, +0x11,0x14,0x78,0xfb,0x7e,0x33,0x77,0xe1,0xa, 0x13,0x6d,0x0, 0x12,0x22,0xbf,0x7c, +0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64,0xa, 0x3e,0x1b, +0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0x82,0xef,0x7f,0x6, 0x7c,0xbd,0x7c,0x7c, +0x12,0x82,0xef,0xb, 0xf0,0x7e,0x73,0x77,0xe1,0xbc,0x7f,0x50,0xbc,0x7f,0x5, 0x7f, +0x16,0x12,0x83,0x41,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x77,0xe0,0xda,0x3b,0x22,0x7c, +0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d,0x2, 0xb, 0xa, +0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, 0x7c,0x21,0xa5, +0xba,0x0, 0x14,0xa, 0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d,0x44,0x74,0x2, +0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0xa, 0x2, 0xa, 0x13,0x2d, +0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x10, +0x22,0xca,0x79,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0xb, 0x7a, +0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf,0x77,0xe5,0x7f,0x71,0x2d,0xf4,0xb, +0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x78,0x5, 0xb, 0xa0,0xbe,0xa0,0x20,0x40, +0xd4,0x7e,0x8, 0x77,0xe5,0x7e,0x18,0x78,0x5, 0x74,0x20,0x12,0x83,0x81,0xda,0x79, +0x22,0xca,0x3b,0xf5,0x2d,0x7f,0x31,0x7a,0xd, 0x29,0x75,0x35,0x0, 0x75,0x36,0x0, +0x75,0x37,0x0, 0x7e,0x34,0x3, 0xe8,0x7a,0x35,0x40,0x75,0x33,0x3c,0x75,0x34,0x46, +0x75,0x2e,0x0, 0xa1,0x9f,0x12,0x85,0xd8,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39, +0x7e,0x71,0x2e,0x74,0x44,0xac,0x7b,0x2e,0x34,0xe, 0x6, 0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x65,0x7, 0x12,0x24,0x13,0x1b,0xfd,0x6d,0x33,0x7a,0x37,0x64,0xfd,0x7a,0x37, +0x64,0xff,0x7a,0x37,0x65,0x1, 0x7a,0x37,0x65,0x3, 0x7a,0x37,0x65,0x5, 0x7e,0x18, +0x65,0x7, 0x7a,0x1d,0x38,0x7e,0x18,0x65,0x27,0x7a,0x1d,0x3c,0x75,0x2f,0x0, 0x81, +0x85,0xe5,0x2f,0xa, 0x5b,0x7e,0x1d,0x29,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x26,0x7e, +0xd, 0x38,0x2d,0x15,0x7e,0xb, 0x70,0xa, 0xd7,0x7d,0xcd,0x9d,0xc2,0xbe,0xc4,0x0, +0x0, 0x8, 0x4, 0x9d,0xd2,0x80,0xa, 0xa, 0x26,0xa, 0x37,0x9d,0x32,0x6d,0xdd,0x9d, +0xd3,0x7e,0xc7,0x65,0x1, 0xbd,0xcd,0x58,0x4, 0x7a,0xd7,0x65,0x1, 0xe5,0x2f,0xa, +0xcb,0x7f,0x13,0x2d,0x3c,0x7e,0x1b,0x70,0xa, 0x27,0xe5,0x2f,0xa, 0x3b,0x7e,0xd, +0x3c,0x2d,0x13,0x7e,0xb, 0x70,0xa, 0xc7,0x12,0x85,0xe4,0x8, 0x4, 0x9d,0xc2,0x80, +0x4, 0x6d,0xcc,0x9d,0xc3,0x7e,0x37,0x65,0x3, 0xbd,0x3c,0x58,0x4, 0x7a,0xc7,0x65, +0x3, 0x7e,0x37,0x64,0xfd,0x2d,0x3d,0x7a,0x37,0x64,0xfd,0x7e,0x37,0x64,0xff,0x2d, +0x3c,0x7a,0x37,0x64,0xff,0x2d,0xcd,0x7e,0x37,0x65,0x5, 0xbd,0x3c,0x58,0x4, 0x7a, +0xc7,0x65,0x5, 0x5, 0x2f,0xe5,0x2d,0xbe,0xb1,0x2f,0x28,0x2, 0x61,0xf1,0xe5,0x2d, +0xb4,0xa, 0x2c,0x7e,0x37,0x65,0x1, 0xbe,0x34,0x0, 0x40,0x48,0xc, 0x7e,0x27,0x65, +0x3, 0xbe,0x24,0x0, 0x40,0x48,0x2, 0xa1,0x9d,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0xa1, +0x9d,0x7e,0x37,0x65,0x3, 0xbe,0x34,0x0, 0x60,0x8, 0x2, 0xa1,0x9d,0x80,0x2a,0x7e, +0x37,0x65,0x1, 0xbe,0x34,0x0, 0x20,0x8, 0xc, 0x7e,0x27,0x65,0x3, 0xbe,0x24,0x0, +0x20,0x8, 0x2, 0xa1,0x9d,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0xa1,0x9d,0x7e,0x37,0x65, +0x3, 0xbe,0x34,0x0, 0x30,0x8, 0x2, 0xa1,0x9d,0x7e,0xa3,0x77,0xe3,0x74,0xc, 0xa4, +0xbe,0x57,0x64,0xfd,0x58,0x2, 0xa1,0x9d,0x7e,0xa3,0x77,0xe4,0x74,0xc, 0xa4,0xbe, +0x57,0x64,0xff,0x58,0x2, 0xa1,0x9d,0x7e,0xd, 0x38,0x7e,0x1d,0x29,0xe5,0x2d,0x12, +0x85,0xeb,0xf5,0x30,0x7e,0xd, 0x3c,0x7f,0x13,0xe5,0x2d,0x12,0x85,0xeb,0xf5,0x31, +0xe5,0x33,0xbe,0xb1,0x30,0x38,0x76,0xe5,0x33,0xbe,0xb1,0x31,0x38,0x6f,0xe5,0x31, +0x7e,0x31,0x31,0xac,0x3b,0x1a,0x2, 0x1a,0x0, 0xe5,0x30,0x7e,0x71,0x30,0xac,0x7b, +0x1a,0x26,0x1a,0x24,0x2f,0x10,0xe5,0x31,0xa, 0xfb,0x6d,0xee,0xe5,0x30,0xa, 0x1b, +0x6d,0x0, 0x2f,0x7, 0x12,0x22,0xbf,0x7c,0xb7,0xf5,0x32,0xe5,0x34,0xbe,0xb1,0x32, +0x38,0x3b,0x7e,0x37,0x65,0x3, 0x2e,0x37,0x65,0x1, 0x2e,0x37,0x65,0x5, 0x7a,0x35, +0x42,0xe5,0x32,0xa, 0x2b,0x7e,0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x42, +0x7a,0x35,0x42,0x7e,0x35,0x40,0xbe,0x35,0x42,0x8, 0x12,0x7e,0x35,0x42,0x7a,0x35, +0x40,0x85,0x32,0x36,0x7e,0xb3,0x65,0x49,0xf5,0x37,0x85,0x2e,0x35,0x5, 0x2e,0x12, +0x85,0xd8,0x28,0x2, 0x61,0xa5,0xe5,0x34,0xbe,0xb1,0x36,0x38,0x20,0xe5,0x37,0xbe, +0xb0,0x0, 0x28,0x19,0xe5,0x37,0xbe,0xb0,0xff,0x50,0x12,0xe5,0x35,0xa, 0x3b,0xb, +0x34,0x7a,0x73,0x77,0xe0,0xe5,0x37,0x7a,0xb3,0x77,0xe2,0x80,0x6, 0x74,0x7c,0x7a, +0xb3,0x77,0xe0,0xe5,0x36,0xda,0x3b,0x22,0x7e,0x73,0x78,0xe4,0xbe,0x71,0x2e,0x22, +0xa, 0xb, 0x7d,0x30,0x9d,0x32,0xbe,0x34,0x0, 0x0, 0x22,0xca,0x3b,0x7c,0xfb,0x7f, +0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1f,0x65,0x4b,0x7a,0x1f,0x65, +0x4f,0x7a,0x1f,0x65,0x53,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x55,0x48,0x6c,0xee,0x80,0x66,0xa, 0x5e,0x7f,0x14,0x12, +0x87,0x53,0x7a,0x55,0x46,0xa, 0x5e,0x7f,0x16,0x12,0x87,0x53,0x7a,0x55,0x44,0x7e, +0x35,0x44,0x12,0x87,0x4c,0x2f,0x50,0x7e,0x65,0x46,0x7d,0x16,0x1a,0x2, 0x1a,0x0, +0x2f,0x70,0x12,0x87,0x4c,0x12,0x87,0x42,0x7e,0x1f,0x65,0x4b,0x2f,0x10,0x7a,0x1f, +0x65,0x4b,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x46,0x12,0x87,0x42,0x7e,0x1f, +0x65,0x4f,0x2f,0x10,0x7a,0x1f,0x65,0x4f,0x7e,0x15,0x46,0x1a,0x2, 0x1a,0x0, 0x7e, +0x35,0x44,0x12,0x87,0x42,0x7e,0x1f,0x65,0x53,0x2f,0x10,0x7a,0x1f,0x65,0x53,0xb, +0xe0,0xbc,0xfe,0x38,0x96,0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x23,0x10, +0x7f,0x51,0x7f,0x17,0x7f,0x6, 0x12,0x23,0x10,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e, +0x1f,0x65,0x4b,0x7d,0x19,0x12,0x22,0xb4,0x7e,0x85,0x48,0x7d,0x18,0x7d,0xd8,0x1a, +0x12,0x1a,0xc2,0x7f,0x6, 0x12,0x23,0x10,0x7a,0x1f,0x65,0x4b,0x7e,0x1f,0x65,0x4f, +0x7d,0x19,0x12,0x22,0xb4,0x7f,0x6, 0x12,0x23,0x10,0x7a,0x1f,0x65,0x4f,0x7e,0x1f, +0x65,0x53,0x7d,0x19,0x12,0x22,0xb4,0x7d,0x18,0x1a,0x2, 0x1a,0x0, 0x12,0x23,0x10, +0x7a,0x1f,0x65,0x53,0x7f,0x15,0x7f,0x7, 0x12,0x22,0xa3,0x7e,0x6f,0x65,0x53,0x9f, +0x61,0x7f,0x15,0x7f,0x5, 0x12,0x22,0xa3,0x7e,0x5f,0x65,0x4b,0x9f,0x51,0x7f,0x17, +0x7f,0x7, 0x12,0x22,0xa3,0x7e,0x7f,0x65,0x4f,0x9f,0x71,0xbe,0x58,0x0, 0x0, 0x68, +0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18,0x7f,0x16,0x7d, +0x19,0x12,0x22,0xb4,0x7f,0x5, 0x12,0x23,0x10,0x7f,0x6, 0x12,0x22,0xa3,0x7f,0x7, +0x12,0x23,0x10,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44,0x7c,0xb9,0xda, +0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x22,0xa3,0x7f,0x1, 0x22,0x7d,0x13,0x1a,0x2, +0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0xca,0x79,0x7c,0xfb,0x7f, +0x51,0x7f,0x40,0x74,0x9, 0xac,0xbf,0x9, 0xb5,0x6e,0x28,0xf5,0x3b,0x74,0x9, 0xac, +0xbf,0x9, 0xb5,0x6e,0x29,0xc4,0x54,0xf0,0xf5,0x3c,0x74,0x9, 0xac,0xbf,0x9, 0xe5, +0x6e,0x27,0x12,0xe6,0x6f,0x28,0x58,0x7e,0xb3,0x6f,0x38,0x70,0x28,0x75,0x3d,0xf, +0x7e,0x8, 0x0, 0x3b,0xa, 0x3e,0x2e,0x34,0x28,0x27,0x6d,0x22,0x74,0x1, 0x12,0x97, +0x85,0x75,0x3d,0x20,0x7e,0x8, 0x0, 0x3c,0xa, 0x3e,0x2e,0x34,0x28,0x31,0x74,0x10, +0x12,0x97,0x85,0x80,0xe, 0xa, 0x3e,0x9, 0xb3,0x28,0x27,0xf5,0x3b,0x9, 0xb3,0x28, +0x31,0xf5,0x3c,0x74,0x9, 0xac,0xbe,0x9, 0xb5,0x6e,0xd7,0xb4,0x1, 0x11,0xe4,0xa, +0x3e,0x19,0xb3,0x28,0x27,0x19,0xb3,0x28,0x31,0x75,0x3b,0x0, 0x75,0x3c,0x0, 0x7e, +0xb3,0x6f,0x52,0xb4,0xff,0x16,0x85,0x3a,0x3b,0x75,0x3b,0x0, 0x74,0x9, 0xac,0xbf, +0x9, 0xb5,0x6e,0x27,0xbe,0xb0,0xff,0x68,0x3, 0x75,0x3b,0x1, 0xe5,0x3b,0x7a,0x4b, +0xb0,0xe5,0x3c,0x7a,0x5b,0xb0,0xda,0x79,0x22,0x7e,0x68,0x6e,0xd7,0x7e,0xb3,0x6f, +0x32,0xb4,0x1, 0x1a,0x7e,0xb3,0x6f,0x31,0x70,0x14,0x29,0x76,0x0, 0x8, 0xbe,0x70, +0x2d,0x50,0xb, 0xbe,0x70,0x0, 0x28,0x6, 0x74,0x3, 0x7a,0xb3,0x6f,0x3d,0x7e,0x73, +0x6f,0x3d,0xbe,0x70,0x0, 0x28,0x2d,0x7e,0x34,0x0, 0x9, 0xca,0x39,0x7e,0x18,0x27, +0x73,0x7e,0x8, 0x6e,0x23,0x12,0x24,0x13,0x1b,0xfd,0x7e,0xa3,0x6f,0x3d,0xbe,0xa0, +0x3, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xa0,0x1, 0x78,0x4, 0x74,0x1, 0x80,0x2, 0x74, +0x2, 0x7a,0x6b,0xb0,0x22,0xca,0x3b,0x75,0x28,0x0, 0x75,0x29,0x0, 0x75,0x2a,0x0, +0x75,0x2b,0x0, 0x75,0x2d,0x0, 0xc2,0x0, 0xc2,0x1, 0x7e,0x18,0x28,0x3b,0x7a,0x1d, +0x32,0x7e,0x18,0x6e,0xd7,0x7a,0x1d,0x36,0xe4,0x7e,0x34,0x28,0x3c,0x7e,0x24,0x0, +0x0, 0x7a,0x1b,0xb0,0x12,0xd3,0x94,0x12,0x88,0x9, 0x6c,0xee,0x80,0x39,0x74,0x9, +0xac,0xbe,0x9, 0xf5,0x6e,0x27,0x12,0xbf,0xdc,0x28,0x2a,0x12,0xe5,0x4e,0x2d,0x35, +0x7e,0x1b,0xb0,0xb4,0x1, 0x1f,0x12,0xe6,0xa6,0x70,0x1a,0x29,0x1, 0x0, 0x8, 0xbe, +0x0, 0x2d,0x50,0x11,0xbe,0x0, 0x0, 0x28,0xc, 0x7a,0xe1,0x2c,0x74,0x3, 0xa5,0xf7, +0x7a,0xf1,0x12,0x80,0x7, 0xb, 0xe0,0x12,0xe6,0x6f,0x38,0xc2,0x12,0xe5,0xc3,0x38, +0x2, 0x21,0x61,0xb4,0x3, 0x10,0x7e,0x34,0x0, 0x9, 0xca,0x39,0x12,0xe6,0x61,0x7e, +0x31,0x2c,0xac,0x3b,0x80,0x19,0x6c,0xee,0x80,0x24,0x7e,0x30,0x9, 0xac,0x3e,0x9, +0xb1,0x6e,0x27,0xb4,0xff,0x16,0x7e,0x4, 0x0, 0x9, 0xca,0x9, 0x12,0xe6,0x61,0x2e, +0x14,0x6e,0x23,0x6d,0x0, 0x12,0x24,0x13,0x1b,0xfd,0x80,0x7, 0xb, 0xe0,0x12,0xe6, +0x6f,0x38,0xd7,0x7e,0x11,0x12,0x2e,0x10,0x8, 0xa5,0xe7,0x7c,0xab,0xbe,0xa0,0x3, +0x78,0x13,0x6c,0x33,0x7e,0x11,0x12,0x74,0x9, 0xac,0x1b,0x7e,0x1d,0x36,0x2d,0x30, +0x7a,0x1b,0x30,0x80,0x1c,0xbe,0xa0,0x1, 0x78,0x5, 0x7e,0xa0,0x1, 0x80,0x3, 0x7e, +0xa0,0x2, 0x7e,0x31,0x12,0x74,0x9, 0xac,0x3b,0x7e,0x1d,0x36,0x2d,0x31,0x7a,0x1b, +0xa0,0x7e,0xb3,0x6f,0x3a,0x70,0x1a,0x7e,0xb3,0x6f,0x36,0x70,0x14,0x7e,0xb3,0x6f, +0x37,0x70,0xe, 0x12,0xe5,0xc3,0x38,0x9, 0x7e,0xb3,0x6f,0x3d,0x70,0x3, 0x2, 0x90, +0x31,0x12,0xe5,0xc3,0x28,0x3, 0x14,0xa5,0xf7,0x7e,0xb3,0x6f,0x3d,0x60,0x5, 0x14, +0x7a,0xb3,0x6f,0x3d,0x30,0x21,0x6, 0x7e,0x18,0x28,0x79,0x80,0x4, 0x7e,0x18,0x28, +0x3b,0x7a,0x1d,0x32,0x7e,0xd, 0x32,0x12,0x77,0xa7,0x6c,0xee,0xe1,0xcc,0x7e,0x70, +0x9, 0xac,0x7e,0x9, 0xf3,0x6e,0x27,0x12,0xbf,0xdc,0x38,0x2, 0xe1,0xca,0x7c,0xaf, +0x5e,0xa0,0xf, 0x74,0x9, 0xa4,0x7e,0xd, 0x36,0x2d,0x15,0x7e,0xb, 0xc0,0x7e,0x90, +0x4, 0xac,0x9f,0x9, 0xa4,0x28,0xba,0x4c,0xaa,0x78,0x2, 0x41,0x94,0x49,0x23,0x6e, +0x23,0x4d,0x22,0x78,0xa, 0x49,0x33,0x6e,0x25,0x4d,0x33,0x78,0x2, 0x41,0x94,0xbe, +0xa0,0x4, 0x28,0x5, 0x7e,0xd0,0x38,0x80,0x21,0xbe,0xa0,0x4, 0x78,0x5, 0x7e,0xd0, +0x30,0x80,0x17,0xbe,0xa0,0x3, 0x78,0x5, 0x7e,0xd0,0x20,0x80,0xd, 0xbe,0xa0,0x2, +0x78,0x5, 0x7e,0xd0,0x18,0x80,0x3, 0x7e,0xd0,0x10,0x75,0x27,0x0, 0x80,0x64,0x7e, +0x91,0x27,0x74,0x9, 0xac,0x9b,0x9, 0xb4,0x27,0xd1,0x54,0xf, 0xbc,0xbf,0x78,0x51, +0x74,0x9, 0xac,0xbe,0x49,0x35,0x6e,0x23,0x12,0xe5,0xaf,0x49,0x34,0x27,0xcd,0x12, +0xe6,0x53,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x74,0x9, +0xac,0xbe,0x59,0x35,0x6e,0x23,0x7e,0x90,0x9, 0xac,0x9e,0x49,0x34,0x6e,0x25,0x12, +0xe5,0xaf,0x7e,0xa1,0x27,0x74,0x9, 0xa4,0x49,0x35,0x27,0xcf,0x12,0xe6,0x53,0x1e, +0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x59,0x34,0x6e,0x25,0x80, +0x7, 0x5, 0x27,0x12,0xb3,0x6e,0x38,0x97,0x7e,0x70,0x4, 0xac,0x7f,0x2e,0x34,0x28, +0xba,0x12,0xe7,0x28,0x12,0xe5,0x4e,0x2d,0x35,0x7e,0x1b,0xb0,0xb4,0x1, 0x17,0x12, +0xe6,0xa6,0x70,0x12,0x7e,0xb3,0x6f,0x3d,0x70,0xc, 0xe4,0x39,0xb1,0x0, 0x8, 0x12, +0xe6,0x82,0x7a,0xb3,0x28,0xe5,0x4c,0xcc,0x68,0x2, 0xc1,0xe4,0x12,0xe6,0xa6,0x60, +0x2, 0xc1,0xe4,0x7e,0xb3,0x6f,0x3d,0x60,0x2, 0xc1,0xe4,0x74,0x9, 0xac,0xbe,0x49, +0x35,0x6e,0x23,0xbe,0x34,0x0, 0x14,0x38,0x10,0x12,0xe6,0xf7,0x40,0xb, 0x12,0x6f, +0xd9,0x9e,0x24,0x0, 0x14,0xbd,0x42,0x28,0x3b,0x7e,0x14,0x21,0xde,0x12,0xb4,0xe6, +0x7d,0x2c,0x9e,0x24,0x0, 0x14,0xbd,0x32,0x40,0x10,0x12,0xe6,0xf7,0x40,0xb, 0x12, +0x6f,0xd9,0x9e,0x24,0x0, 0x14,0xbd,0x42,0x28,0x1a,0x49,0xd5,0x6e,0x25,0xbe,0xd4, +0x0, 0x0, 0x28,0x2, 0xa1,0x9c,0xbe,0x34,0x0, 0x0, 0x50,0x2, 0xa1,0x9c,0xbd,0x3c, +0x28,0x2, 0xa1,0x9c,0x12,0xe6,0x45,0x12,0xe5,0xa8,0xbe,0x34,0x0, 0xc8,0x58,0x18, +0x12,0xe6,0xee,0xbe,0x44,0x0, 0x14,0x38,0xf, 0x12,0xe5,0xcf,0x40,0xa, 0x12,0xb4, +0xe2,0x12,0xe6,0xba,0x38,0x2, 0x81,0x9c,0x12,0xe5,0x9f,0xbe,0x34,0x0, 0xc8,0x58, +0x14,0x12,0xe5,0x56,0x40,0xf, 0x12,0xe5,0xcf,0x40,0xa, 0x12,0xb4,0xe2,0x12,0xe6, +0xba,0x38,0x2, 0x81,0x9c,0x12,0xe5,0x9f,0xbe,0x34,0x0, 0x0, 0x58,0x25,0x74,0x9, +0xac,0xbe,0x49,0x45,0x6e,0x25,0xbe,0x44,0x0, 0x0, 0x38,0x17,0x49,0x35,0x6e,0x23, +0xbe,0x34,0x0, 0x0, 0x40,0xd, 0x7e,0x14,0x21,0xde,0x12,0xb4,0xe6,0xbd,0x3c,0x38, +0x2, 0x81,0x9c,0x12,0xe5,0x43,0x29,0xb1,0x0, 0x8, 0x70,0x2e,0x7e,0x4, 0x0, 0x9, +0xca,0x9, 0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x6e,0x23,0x6d,0x22,0x2e,0x14,0x27, +0x73,0x6d,0x0, 0x12,0x24,0x13,0x1b,0xfd,0x12,0xe5,0x4e,0x2d,0x35,0x2e,0x34,0x0, +0x8, 0x7e,0x1b,0xb0,0x4, 0x7a,0x1b,0xb0,0x81,0x9c,0x12,0xe4,0xe4,0x2d,0xc3,0xbe, +0xc4,0x0, 0x32,0x58,0x42,0x7e,0x70,0x9, 0xac,0x7e,0x49,0x23,0x6e,0x23,0xbe,0x24, +0x0, 0x14,0x38,0x33,0x49,0xc3,0x6e,0x25,0xbe,0xc4,0x0, 0x14,0x40,0x29,0x12,0x6f, +0xd9,0x9e,0x24,0x0, 0x14,0xbd,0xc2,0x38,0x1e,0x12,0x9c,0xfb,0x50,0xa, 0x7e,0xa0, +0x2d,0x12,0xe5,0x43,0x39,0xa1,0x0, 0x8, 0x12,0xe5,0x4e,0x12,0xe5,0xfb,0x40,0x2, +0x81,0x9c,0x12,0xe6,0x3c,0x81,0x9c,0x12,0xe4,0xe4,0x2d,0xc3,0xbe,0xc4,0x0, 0x32, +0x58,0x31,0x12,0xe5,0x56,0x40,0x2c,0x12,0xe5,0xcf,0x40,0x27,0x12,0xb4,0xe2,0x12, +0xe6,0xba,0x38,0x1f,0x12,0xe6,0x45,0x12,0x9c,0xff,0x50,0xa, 0x7e,0xa0,0x2d,0x12, +0xe5,0x43,0x39,0xa1,0x0, 0x8, 0x12,0xe5,0x4e,0x12,0xe5,0xfb,0x50,0x4e,0x12,0xe6, +0x3c,0x80,0x49,0x12,0xe4,0xe4,0x2d,0xc3,0xbe,0xc4,0x0, 0x0, 0x58,0x4a,0x7e,0x70, +0x9, 0xac,0x7e,0x49,0x23,0x6e,0x25,0xbe,0x24,0x0, 0x0, 0x38,0x3b,0x49,0xc3,0x6e, +0x23,0xbe,0xc4,0x0, 0x0, 0x40,0x31,0x7e,0x14,0x21,0xde,0x12,0x6f,0xdd,0xbd,0xc2, +0x38,0x26,0x12,0x9c,0xfb,0x50,0xa, 0x7e,0xa0,0x2d,0x12,0xe5,0x43,0x39,0xa1,0x0, +0x8, 0x12,0xe5,0x4e,0x12,0xe5,0xfb,0x50,0x3, 0x12,0xe6,0x3c,0x7e,0xc0,0x3, 0x12, +0xe5,0x33,0x39,0xa1,0x0, 0x1, 0xa1,0xe6,0x7e,0x50,0x9, 0xac,0x5e,0x49,0x42,0x6e, +0x23,0xbe,0x44,0x0, 0x14,0x38,0x47,0x49,0x32,0x6e,0x25,0xbe,0x34,0x0, 0x14,0x40, +0x3d,0x7e,0x14,0x21,0xec,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x50,0x9e,0x54,0x0, 0x14, +0xbd,0x35,0x38,0x2a,0x74,0x9, 0xac,0xbf,0x49,0xc5,0x27,0x73,0x4d,0xcc,0x78,0xa, +0x49,0xc5,0x27,0x75,0x4d,0xcc,0x78,0x2, 0xa1,0xdc,0x12,0xe4,0xf0,0x7d,0x53,0x2d, +0x5c,0xbe,0x54,0x1, 0x2c,0x8, 0x2, 0xa1,0xdc,0x12,0xe5,0x10,0xa1,0xdc,0x7e,0x34, +0x21,0xde,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x0, 0x7d,0x10,0x9e,0x14,0x0, 0x14,0xbd, +0x41,0x40,0x52,0x74,0x9, 0xac,0xbe,0x12,0xe5,0xcf,0x40,0x49,0x12,0xe6,0xd3,0xb, +0x7a,0x20,0x9e,0x24,0x0, 0x14,0xbd,0x32,0x38,0x3b,0x74,0x9, 0xac,0xbf,0x49,0x25, +0x27,0x73,0x4d,0x22,0x78,0xa, 0x49,0x25,0x27,0x75,0x4d,0x22,0x78,0x2, 0xa1,0xdc, +0x49,0x25,0x27,0x75,0x12,0xe7,0x38,0x12,0xe4,0xfb,0x2d,0x13,0xbe,0x14,0x1, 0x2c, +0x8, 0x2, 0xa1,0xdc,0x7e,0xa0,0x5, 0x7e,0x30,0x4, 0xac,0x3f,0x19,0xa1,0x28,0xba, +0x12,0xe5,0x1c,0x80,0x77,0x74,0x9, 0xac,0xbe,0x12,0xe6,0x33,0x38,0x78,0xbe,0x44, +0x0, 0x0, 0x40,0x72,0xbd,0x40,0x38,0x6e,0x74,0x9, 0xac,0xbf,0x49,0x25,0x27,0x73, +0x4d,0x22,0x78,0x8, 0x49,0x25,0x27,0x75,0x4d,0x22,0x68,0x50,0x12,0xe4,0xf0,0x2d, +0xc3,0xbe,0xc4,0x1, 0x2c,0x18,0x45,0x12,0xe5,0x10,0x80,0x40,0x7e,0x70,0x9, 0xac, +0x7f,0x7e,0xd, 0x36,0x2d,0x13,0x29,0x50,0x0, 0x8, 0xbe,0x50,0x0, 0x28,0x37,0x7e, +0xb3,0x28,0xe5,0x70,0x31,0x49,0x23,0x27,0x73,0x4d,0x22,0x78,0x8, 0x49,0x23,0x27, +0x75,0x4d,0x22,0x68,0x17,0x49,0x23,0x27,0x75,0x7d,0x3d,0x12,0xe7,0x38,0x12,0xe4, +0xfb,0x2d,0x31,0xbe,0x34,0x1, 0x2c,0x18,0x3, 0x12,0xe5,0x10,0x7e,0xa0,0x2d,0x12, +0xe5,0x43,0x39,0xa1,0x0, 0x8, 0x4c,0xcc,0x68,0x2, 0xc1,0xe4,0x7e,0x70,0x9, 0xac, +0x7e,0x12,0x9c,0xfb,0x92,0x1f,0x30,0x1f,0x3c,0x12,0xe6,0x82,0x12,0xe5,0x4e,0x2d, +0x35,0x29,0xb1,0x0, 0x6, 0x70,0x6, 0x74,0x1, 0x39,0xb1,0x0, 0x6, 0x12,0xe5,0x4e, +0x2d,0x35,0x29,0x31,0x0, 0x6, 0xbe,0x30,0x1, 0x28,0x2, 0xc1,0xe4,0x4c,0xcc,0x78, +0x3, 0x7e,0xc0,0x3, 0x74,0x2d,0x39,0xb1,0x0, 0x8, 0xd2,0x20,0x12,0xe5,0x33,0x39, +0xa1,0x0, 0x1, 0xc1,0xe4,0x74,0x9, 0xac,0xbe,0x49,0x25,0x6e,0x23,0xbe,0x24,0x0, +0x14,0x28,0x14,0x7e,0x14,0x21,0xde,0x12,0x7c,0x34,0x9e,0x34,0x0, 0x14,0xbd,0x23, +0x50,0x5, 0x12,0xe6,0x33,0x38,0x7c,0xbe,0x24,0x0, 0x14,0x38,0xb, 0x12,0xe6,0x33, +0x40,0x6, 0xbe,0x34,0x0, 0x14,0x28,0x6b,0x7e,0x14,0x21,0xde,0x12,0x7c,0x34,0x9e, +0x34,0x0, 0x14,0xbd,0x23,0x40,0x14,0x74,0x9, 0xac,0xbe,0x49,0x15,0x6e,0x25,0xbe, +0x14,0x0, 0x0, 0x40,0x6, 0xbe,0x14,0x0, 0x14,0x28,0x48,0xbe,0x24,0x0, 0x14,0x38, +0x21,0x74,0x9, 0xac,0xbe,0x49,0x5, 0x6e,0x25,0x7e,0x54,0x21,0xec,0x7e,0x44,0x0, +0xff,0xb, 0x2a,0x10,0x7d,0x51,0x9e,0x54,0x0, 0x14,0xbd,0x5, 0x40,0x4, 0xbd,0x1, +0x28,0x21,0xbd,0x23,0x40,0x2e,0x74,0x9, 0xac,0xbe,0x49,0x25,0x6e,0x25,0x7e,0x14, +0x21,0xec,0x12,0x7c,0x34,0x7d,0x13,0x9e,0x14,0x0, 0x14,0xbd,0x21,0x40,0x15,0xbd, +0x23,0x38,0x11,0x12,0xe5,0x4e,0x2d,0x35,0x29,0xb1,0x0, 0x6, 0x70,0x6, 0x74,0x2, +0x39,0xb1,0x0, 0x6, 0xbe,0xc0,0x3, 0x78,0x2, 0xe1,0xca,0x12,0xe6,0xee,0x7a,0x45, +0x2e,0x49,0x35,0x6e,0x25,0x7a,0x35,0x30,0xbe,0xc0,0x1, 0x78,0x3b,0x6c,0xaa,0x7e, +0x70,0x4, 0xac,0x7f,0x19,0xa3,0x28,0xb8,0x12,0xe5,0x43,0x39,0xa1,0x0, 0x6, 0x75, +0x27,0x0, 0x80,0x1f,0x12,0xb3,0xa1,0x9, 0xb3,0x27,0xd1,0x54,0xf, 0xbc,0xbf,0x78, +0x10,0x49,0x23,0x27,0xcd,0x7a,0x25,0x2e,0x49,0x33,0x27,0xcf,0x7a,0x35,0x30,0x80, +0x7, 0x5, 0x27,0x12,0xb3,0x6e,0x38,0xdc,0x85,0x28,0x3a,0x7e,0x8, 0x0, 0x2a,0x7e, +0x18,0x0, 0x2b,0x7c,0xbe,0x12,0x87,0x5b,0x7e,0x35,0x2e,0x5e,0x60,0xf, 0x7a,0x35, +0x2e,0x7e,0x35,0x30,0x5e,0x60,0xf, 0x7a,0x35,0x30,0x7e,0x90,0x9, 0xac,0x9e,0x9, +0x74,0x6e,0x27,0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x7d,0x25,0x2e,0x25,0x30, +0x7a,0x25,0x30,0xbe,0x70,0xff,0x68,0x19,0xbe,0xc0,0x1, 0x68,0x2, 0x5, 0x28,0x5, +0x2d,0xa, 0x5c,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4,0x7d,0x35,0x2e,0x35,0x2e,0x80, +0x7, 0x7e,0x35,0x2e,0x2e,0x34,0xc0,0x0, 0x7a,0x35,0x2e,0x12,0xe6,0x9a,0x79,0x30, +0x0, 0x2, 0x7e,0x35,0x30,0x12,0xe6,0x9a,0x79,0x30,0x0, 0x4, 0x7e,0xa1,0x2a,0x7e, +0x31,0x29,0x74,0x6, 0x12,0xe7,0x30,0x39,0xa1,0x0, 0x6, 0x7e,0xa1,0x2b,0x7e,0x31, +0x29,0x12,0xe7,0x30,0x39,0xa1,0x0, 0x7, 0x5, 0x29,0xb, 0xe0,0x12,0xe6,0x6f,0x28, +0x2, 0x21,0xae,0xe5,0x28,0x7e,0x1d,0x32,0x39,0xb1,0x0, 0x1, 0x7e,0x33,0x6f,0x33, +0x7e,0x1d,0x32,0x7a,0x1b,0x30,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0xf, 0x7e,0xb3,0x6f, +0x37,0xb4,0x1, 0x1c,0x74,0x5, 0x7a,0xb3,0x78,0x93,0x80,0xf, 0xe5,0x2d,0xbe,0xb0, +0x0, 0x38,0x6, 0x7e,0xb3,0x6f,0x37,0x60,0x7, 0xb2,0x21,0xc2,0x86,0x12,0x96,0xe4, +0x7e,0xb3,0x6f,0x36,0x60,0xc, 0x7e,0xb3,0x6f,0x3d,0x70,0x6, 0x7e,0xd, 0x36,0x12, +0x90,0x7b,0xe4,0x7a,0xb3,0x6f,0x3a,0x7a,0xb3,0x6f,0x36,0x7a,0xb3,0x6f,0x37,0x80, +0x1e,0x7e,0xd, 0x36,0x12,0x90,0x7b,0x6c,0xee,0x6c,0xaa,0x80,0xb, 0x7c,0x1e,0x2e, +0x10,0x8, 0x7c,0xba,0xa5,0xf7,0xb, 0xe0,0xbe,0xe0,0xa, 0x40,0xf0,0xd2,0x86,0x12, +0x90,0xc9,0xca,0x59,0x7e,0x18,0x6e,0x23,0x7e,0x8, 0x27,0xcd,0x12,0x24,0x13,0x1b, +0xfd,0xe5,0x2d,0x70,0x10,0x12,0x73,0x78,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x27,0xcd, +0x74,0xff,0x12,0x24,0x38,0x12,0x96,0xf6,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xaa,0x80, +0x40,0x7e,0xf0,0x3, 0x7e,0x90,0x9, 0xac,0x9a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xf0, +0x74,0x3, 0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0x1, 0x7e,0x34,0x7f,0xff,0x7f,0x70, +0x2d,0xf4,0x79,0x37,0x0, 0x2, 0x7f,0x70,0x2d,0xf4,0x79,0x37,0x0, 0x4, 0xe4,0x7f, +0x10,0x2d,0x34,0x39,0xb1,0x0, 0x6, 0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0x8, 0xb, +0xa0,0x12,0x45,0x1f,0x38,0xbb,0xda,0xf8,0x22,0x90,0x21,0x51,0xe4,0x93,0x7c,0xab, +0x74,0x9, 0xa4,0x22,0xca,0x79,0x7e,0xf3,0x6f,0x31,0x7e,0xe3,0x6f,0x32,0x7c,0xbf, +0x7c,0x7e,0x12,0x44,0xc6,0x7c,0xbf,0x12,0x91,0x65,0x4c,0xee,0x78,0x17,0x12,0x90, +0xc9,0xca,0x59,0x7e,0x18,0x6d,0xc9,0x7e,0x8, 0x6e,0x7d,0x12,0x24,0x13,0x1b,0xfd, +0x12,0x91,0x1b,0x80,0xe, 0x7e,0xb3,0x6f,0x38,0x70,0x8, 0x12,0x91,0x1b,0x7c,0xbf, +0x12,0x92,0xc7,0x7c,0xbf,0x12,0x97,0x18,0xda,0x79,0x22,0x7e,0xa3,0x6f,0x31,0x6c, +0x77,0x80,0x3d,0x7e,0x90,0x9, 0xac,0x97,0x9, 0x64,0x6e,0x81,0x7e,0x50,0x9, 0xac, +0x56,0x9, 0xb2,0x6e,0xd7,0x70,0x27,0x74,0x1, 0x19,0xb2,0x59,0xe1,0x49,0x14,0x6d, +0xc9,0x59,0x12,0x59,0xe2,0x49,0x14,0x6d,0xcb,0x59,0x12,0x59,0xe4,0xe4,0x19,0xb2, +0x59,0xe6,0x19,0xb2,0x59,0xde,0x19,0xb2,0x59,0xdf,0x19,0xb2,0x59,0xe0,0xb, 0x70, +0xbc,0xa7,0x38,0xbf,0x22,0xca,0x79,0x7c,0xeb,0x90,0x21,0x51,0xe4,0x93,0x7c,0xfb, +0x7e,0x70,0x9, 0xac,0x7f,0x7e,0x8, 0x63,0x6d,0x74,0xff,0x12,0x24,0x38,0xe4,0x6c, +0x77,0x7c,0x6e,0x12,0x91,0xeb,0x7c,0x7e,0x7c,0x6f,0x12,0x91,0xeb,0x7c,0x1b,0x6c, +0x0, 0x80,0x3e,0x6c,0x99,0x80,0x17,0x74,0x9, 0xac,0xb9,0x9, 0xa5,0x63,0x71,0x7e, +0x30,0x9, 0xac,0x30,0x9, 0x81,0x6d,0xcd,0xbc,0x8a,0x68,0x6, 0xb, 0x90,0xbc,0x19, +0x38,0xe5,0xbc,0x19,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x2e,0x34,0x6d,0xc9,0x7e, +0x30,0x9, 0xac,0x31,0x2e,0x14,0x63,0x6d,0x74,0x9, 0x12,0x23,0x44,0xb, 0x10,0xb, +0x0, 0xbc,0xf0,0x38,0xbe,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x63,0x6d,0x7e, +0x8, 0x6e,0x7d,0x12,0x24,0x13,0x1b,0xfd,0xda,0x79,0x22,0x7e,0x8, 0x63,0x6d,0xca, +0x69,0xca,0xf8,0x7f,0x70,0x7c,0x86,0x7c,0xf7,0x7c,0xab,0x6c,0x99,0x41,0xaf,0x7c, +0x3f,0x41,0xa7,0x7e,0x10,0x9, 0xac,0x19,0x9, 0x20,0x6e,0x81,0x7e,0x10,0x9, 0xac, +0x13,0x9, 0xb0,0x6d,0xcd,0xbc,0xb2,0x68,0x2, 0x41,0xa5,0xbe,0x20,0xff,0x78,0x2, +0x41,0xa5,0x7e,0xd0,0x9, 0xac,0xd2,0x9, 0xb6,0x6e,0xd7,0x70,0xa, 0x7d,0x30,0x2e, +0x34,0x6d,0xc9,0x6d,0x22,0x80,0xb, 0x7e,0x70,0x9, 0xac,0x79,0x2e,0x34,0x6e,0x7d, +0x6d,0x22,0x29,0x11,0x0, 0x4, 0x12,0x92,0xbd,0x39,0x16,0x0, 0x4, 0xb, 0x1a,0x0, +0x12,0x92,0xbd,0x1b,0x6a,0x0, 0x69,0x1, 0x0, 0x2, 0x12,0x92,0xbd,0x79,0x6, 0x0, +0x2, 0x7e,0x10,0x9, 0xac,0x13,0x9, 0x10,0x6d,0xce,0x12,0x92,0xbd,0x39,0x16,0x0, +0x5, 0x7e,0x10,0x9, 0xac,0x13,0x9, 0x10,0x6d,0xcf,0x12,0x92,0xbd,0x39,0x16,0x0, +0x6, 0x7e,0x10,0x9, 0xac,0x13,0x9, 0x10,0x6d,0xd0,0x12,0x92,0xbd,0x39,0x16,0x0, +0x7, 0x7e,0x10,0x9, 0xac,0x13,0x9, 0x10,0x6d,0xd1,0x12,0x92,0xbd,0x39,0x16,0x0, +0x8, 0xb, 0xa0,0x80,0x8, 0xb, 0x30,0xbc,0x83,0x28,0x2, 0x41,0x3, 0xb, 0x90,0x12, +0x96,0xdc,0x28,0x2, 0x21,0xff,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7e,0xd0,0x9, +0xac,0xda,0x7f,0x67,0x2d,0xd6,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x61,0x61,0x6c, +0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x6e,0x81,0x74,0x9, 0xac,0xbe,0x9, +0x75,0x6d,0xcd,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x94,0xbd,0x38,0xe5,0x12,0x94, +0xbd,0x28,0x74,0x7e,0x50,0x9, 0xac,0x5d,0x9, 0xc2,0x6e,0x81,0x49,0x42,0x6e,0x7f, +0x74,0x9, 0xac,0xbe,0x49,0xa5,0x6d,0xcb,0x7d,0x3a,0x9d,0x34,0xbe,0x34,0x0, 0x0, +0x8, 0x4, 0x9d,0xa4,0x80,0x4, 0x6d,0xaa,0x9d,0xa3,0x49,0x42,0x6e,0x7d,0x49,0xb5, +0x6d,0xc9,0x7d,0x3b,0x9d,0x34,0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0x9d,0xb4,0x80,0x4, +0x6d,0xbb,0x9d,0xb3,0x2d,0xba,0x74,0x9, 0xac,0xbc,0x9, 0xb5,0x6e,0xd7,0xb4,0x1, +0xe, 0x6d,0xaa,0x74,0x2, 0xac,0xbc,0x59,0xa5,0x5a,0x44,0x59,0xa5,0x5c,0xc5,0x7d, +0x3b,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12,0x95,0xc6,0x7c,0xbd,0x12,0x93,0x6a,0xb, +0xe0,0xbc,0xfe,0x28,0x2, 0x41,0xcf,0xda,0x3b,0x22,0x2, 0x93,0x6d,0xca,0x3b,0x7c, +0xd4,0x7c,0xe5,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x6f,0x50,0xbd,0x13,0x38,0x6, 0x7e, +0xd4,0x1, 0x0, 0x80,0x17,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x22,0xbd, +0x7d,0xd3,0xbe,0xd4,0x0, 0x10,0x50,0x4, 0x7e,0xd4,0x0, 0x10,0x74,0x2, 0xac,0xbd, +0x49,0x45,0x5c,0xc5,0xbd,0x4f,0x28,0x6, 0x49,0xd5,0x5a,0x44,0x80,0x4, 0x59,0xd5, +0x5a,0x44,0x59,0xf5,0x5c,0xc5,0xbe,0xd4,0x1, 0x0, 0x28,0x4, 0x7e,0xd4,0x1, 0x0, +0x7e,0xb3,0x6f,0x57,0x60,0xb, 0x7e,0x73,0x6f,0x31,0xbe,0x70,0x2, 0x40,0x2, 0x1e, +0xd4,0x7e,0x73,0x6f,0x31,0xbe,0x70,0x5, 0x28,0x2, 0x1e,0xd4,0xbe,0xd4,0x0, 0x20, +0x50,0x11,0x7e,0x70,0x9, 0xac,0x7d,0x9, 0xb3,0x59,0xe6,0xb4,0x1, 0x5, 0xe4,0x19, +0xb3,0x59,0xe6,0xbe,0xd4,0x0, 0x40,0x28,0xc, 0x7e,0xa0,0x1, 0x7e,0x70,0x9, 0xac, +0x7d,0x19,0xa3,0x59,0xe6,0x7c,0xbe,0x7c,0x7d,0x12,0x94,0xc5,0x7d,0x13,0x7e,0xb3, +0x6f,0x57,0x60,0x2, 0x1e,0xd4,0x7e,0x70,0x9, 0xac,0x7f,0x49,0x3, 0x6e,0x7d,0x7e, +0xd0,0x9, 0xac,0xde,0x49,0x26,0x6d,0xc9,0x7d,0xe2,0x9d,0xe0,0xbe,0xe4,0x0, 0x0, +0x8, 0x6, 0x7d,0xf2,0x9d,0xf0,0x80,0x4, 0x6d,0xff,0x9d,0xfe,0x12,0x94,0xae,0xbd, +0x20,0x28,0xf, 0x7d,0xe3,0x2e,0xe4,0x6e,0x7d,0x7d,0xc0,0x2d,0xcf,0x1b,0xe8,0xc0, +0x80,0xf, 0x74,0x9, 0xac,0xbf,0x7d,0xe5,0x2e,0xe4,0x6e,0x7d,0x9d,0xf, 0x1b,0xe8, +0x0, 0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x6e,0x7f,0x7e,0xd0,0x9, 0xac,0xde,0x49, +0xe6,0x6d,0xcb,0x7d,0xe, 0x9d,0x3, 0xbe,0x4, 0x0, 0x0, 0x8, 0x6, 0x7d,0xfe,0x9d, +0xf3,0x80,0x4, 0x6d,0xff,0x9d,0xf0,0x12,0x94,0xae,0xbd,0xe3,0x28,0xf, 0x7d,0xe2, +0x2e,0xe4,0x6e,0x7f,0x7d,0x23,0x2d,0x2f,0x1b,0xe8,0x20,0x80,0xe, 0x7e,0x50,0x9, +0xac,0x5f,0x2e,0x24,0x6e,0x7f,0x9d,0x3f,0x1b,0x28,0x30,0xda,0x3b,0x22,0x7d,0x5d, +0xad,0x5f,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0x7d,0xf5,0x5d,0xf1,0x22,0x90,0x21,0x51, +0xe4,0x93,0xbc,0xbd,0x22,0x7c,0x17,0x7c,0xab,0x7e,0x14,0xff,0xfc,0x7e,0x3, 0x6f, +0x31,0x7e,0x90,0x9, 0xac,0x91,0x9, 0xb4,0x59,0xe1,0xb4,0x1, 0x49,0xa5,0xb8,0x1, +0xc, 0xbe,0x14,0xff,0x0, 0x28,0x10,0x7e,0x14,0xff,0x0, 0x80,0xa, 0xbe,0x14,0xff, +0xe0,0x28,0x4, 0x7e,0x14,0xff,0xe0,0x49,0x34,0x59,0xe2,0x7e,0x50,0x9, 0xac,0x5a, +0x49,0x22,0x6d,0xc9,0x12,0x95,0xb0,0x8, 0x3, 0x12,0x95,0xba,0x7e,0x70,0x9, 0xac, +0x71,0x49,0x33,0x59,0xe4,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x22,0x6d,0xcb,0x12,0x95, +0xb0,0x8, 0x3, 0x12,0x95,0xba,0x7e,0x70,0x9, 0xac,0x71,0x49,0x23,0x59,0xe2,0x7e, +0x70,0x9, 0xac,0x7a,0x49,0x33,0x6d,0xc9,0x12,0x95,0xa6,0x18,0x16,0x74,0x9, 0xac, +0x1b,0x49,0x20,0x59,0xe4,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x33,0x6d,0xcb,0x12,0x95, +0xa6,0x8, 0x4, 0x7e,0x14,0xff,0xfc,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x2, 0x6d,0xc9, +0xbe,0x4, 0x6, 0x50,0x40,0x39,0x7e,0x63,0x6f,0x66,0x7e,0x70,0x40,0xac,0x67,0x9e, +0x34,0x0, 0x65,0x12,0x31,0x24,0x3e,0x34,0xbd,0x3, 0x38,0x23,0x49,0x32,0x6d,0xcb, +0xbe,0x34,0x6, 0x50,0x40,0x19,0x7e,0x3, 0x6f,0x67,0x7e,0x10,0x40,0xac,0x1, 0x9e, +0x4, 0x0, 0x65,0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0xbd,0x30,0x28,0x4, 0x7e, +0x14,0xff,0xff,0x7d,0x31,0x22,0x9d,0x32,0x12,0x24,0x5a,0xbe,0x34,0x4, 0x0, 0x22, +0x9d,0x32,0x12,0x24,0x5a,0xbe,0x34,0x1, 0x0, 0x22,0x6c,0x0, 0x7e,0x70,0x9, 0xac, +0x71,0x19,0x3, 0x59,0xe1,0x22,0xca,0x3b,0x7c,0xab,0x7d,0x3, 0x7e,0x20,0x10,0x7d, +0x30,0x7e,0x90,0x9, 0xac,0x95,0x9, 0x34,0x6d,0xcf,0xbe,0x30,0x10,0x28,0x2, 0x7c, +0x23,0xbe,0x20,0x20,0x28,0x3, 0x7e,0x20,0x20,0x49,0xe4,0x6d,0xc9,0xbe,0xe4,0x6, +0x50,0x40,0x20,0x7e,0x33,0x6f,0x66,0x12,0x96,0xc8,0xbd,0xef,0x38,0x15,0x49,0xe4, +0x6d,0xcb,0xbe,0xe4,0x6, 0x50,0x40,0xb, 0x7e,0x33,0x6f,0x67,0x12,0x96,0xc8,0xbd, +0xef,0x28,0x3, 0x7e,0x20,0x8, 0x7e,0xf0,0x10,0xac,0xf2,0xbd,0x70,0x40,0x63,0x7e, +0xf0,0x9, 0xac,0xf4,0x9, 0xb7,0x59,0xe6,0x70,0x58,0x7e,0xd0,0x8, 0xac,0xd2,0xbd, +0x60,0x50,0x3c,0x9, 0xb7,0x59,0xdf,0x70,0x1f,0x9, 0xb7,0x59,0xe0,0xbe,0xb0,0x0, +0x28,0xc, 0x7d,0x37,0x2e,0x34,0x59,0xe0,0x14,0x7a,0x39,0xb0,0x80,0x6, 0x74,0x1, +0x19,0xb7,0x59,0xdf,0x6d,0x33,0x80,0x3a,0x9, 0xb7,0x59,0xe0,0xbe,0xb0,0x14,0x50, +0x31,0x7d,0x37,0x2e,0x34,0x59,0xe0,0x4, 0x7a,0x39,0xb0,0x6d,0x33,0x80,0x23,0xe4, +0x19,0xb7,0x59,0xe0,0x19,0xb7,0x59,0xdf,0x6d,0x33,0x74,0x1, 0x7a,0xb3,0x5c,0xd9, +0x80,0x10,0x6c,0x33,0x7e,0xf0,0x9, 0xac,0xf4,0x19,0x37,0x59,0xe0,0xe4,0x19,0xb7, +0x59,0xdf,0x7e,0x30,0x8, 0xac,0x23,0xbd,0x10,0x40,0x2a,0x7e,0x70,0x9, 0xac,0x7a, +0x49,0x33,0x6e,0x7d,0x59,0x34,0x6d,0xc9,0x74,0x9, 0xa4,0x49,0x35,0x6e,0x7f,0x74, +0x9, 0xac,0xb5,0x59,0x35,0x6d,0xcb,0x7e,0xa0,0x1, 0x7e,0x70,0x9, 0xac,0x74,0x19, +0xa3,0x59,0xde,0x6d,0x33,0xda,0x3b,0x22,0x7e,0xf0,0x40,0xac,0xf3,0x7d,0xf7,0x9e, +0xf4,0x0, 0x65,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x22,0x90,0x21,0x51,0xe4, +0x93,0xbc,0xb9,0x22,0x7e,0xb3,0x28,0xe4,0x4, 0x7a,0xb3,0x28,0xe4,0x7e,0x73,0x28, +0xe4,0x7a,0x73,0x76,0xce,0x22,0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7a,0x9, 0xb3,0x28, +0xb8,0x60,0x8, 0x74,0x1, 0x7a,0xb3,0x6f,0x3c,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0xa, +0x40,0xe6,0xe4,0x7a,0xb3,0x6f,0x3c,0x22,0x6c,0xaa,0x80,0x63,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x6e,0x7d,0x12,0x4c,0x5d,0x59,0x32,0x6d,0xc9,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x6e,0x7f,0x12,0x4c,0x5d,0x59,0x32,0x6d,0xcb,0x7e,0x90,0x9, 0xac, +0x9a,0x9, 0xb4,0x6e,0x81,0x19,0xb4,0x6d,0xcd,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4, +0x6e,0x82,0x19,0xb4,0x6d,0xce,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6e,0x83,0x19, +0xb4,0x6d,0xcf,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6e,0x84,0x19,0xb4,0x6d,0xd0, +0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6e,0x85,0x19,0xb4,0x6d,0xd1,0xb, 0xa0,0x12, +0x45,0x1f,0x38,0x98,0x22,0x7c,0x9b,0x7e,0x1b,0xa0,0x4c,0xaa,0x78,0x7, 0x7e,0xb, +0xb0,0x7a,0x1b,0xb0,0x22,0xa, 0xda,0x7e,0xb, 0x80,0xa, 0xe8,0x7d,0xfe,0x9d,0xfd, +0xbe,0xf4,0x0, 0x0, 0x8, 0x4, 0x9d,0xed,0x80,0x4, 0x6d,0xee,0x9d,0xef,0xe5,0x3d, +0xa, 0xfb,0xbd,0xef,0x8, 0xf, 0xbc,0x8a,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, +0x9c,0xb9,0x7a,0x1b,0xb0,0x7e,0x1b,0x70,0x7a,0xb, 0x70,0x22,0xe4,0x7a,0xb3,0x77, +0x31,0x90,0x1c,0x45,0x93,0x7a,0xb3,0x77,0x33,0x90,0x1c,0x46,0xe4,0x93,0x7a,0xb3, +0x77,0x34,0x90,0x21,0x51,0xe4,0x93,0x7a,0xb3,0x77,0x36,0xe4,0x7a,0xb3,0x77,0x37, +0x7a,0xb3,0x77,0x3c,0x12,0x3e,0x8b,0xe4,0x7a,0xb3,0x77,0x3f,0x7e,0x73,0x29,0xb6, +0x7a,0x73,0x77,0x51,0x7e,0x73,0x29,0xb7,0x7a,0x73,0x77,0x52,0x7e,0x73,0x29,0xb8, +0x7a,0x73,0x77,0x53,0x7e,0x73,0x29,0x85,0x7a,0x73,0x77,0x5a,0x7e,0x73,0x29,0x86, +0x7a,0x73,0x77,0x5b,0x90,0x1c,0x49,0x93,0x7a,0xb3,0x77,0x4f,0x90,0x1c,0x4a,0xe4, +0x93,0x7a,0xb3,0x77,0x50,0x74,0x1, 0x7a,0xb3,0x77,0x61,0x7e,0x34,0x22,0x32,0x12, +0x2a,0xa9,0x7a,0x37,0x77,0x8b,0x74,0x2, 0x7a,0xb3,0x77,0x3a,0x74,0x17,0x7a,0xb3, +0x77,0x5e,0x22,0x7e,0x18,0x14,0x30,0x7a,0x1f,0x24,0x64,0x7e,0x18,0x4, 0x0, 0x7a, +0x1f,0x24,0x68,0x7e,0xf, 0x24,0x64,0x12,0x65,0x91,0x7e,0xf, 0x24,0x68,0x7e,0x34, +0x4, 0xc, 0x12,0x24,0x38,0x7a,0xb3,0x25,0xae,0x22,0x7e,0x8, 0x6c,0x9, 0x7e,0x34, +0x1, 0xa1,0xe4,0x12,0x24,0x38,0x90,0x21,0x52,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x7e,0x8, 0x6c,0x85,0x74,0xff,0x2, 0x24,0x38,0x7e,0x34,0x0, 0x27,0xca,0x39,0x7e, +0x34,0x20,0xb4,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x28,0xe7,0x12,0x24,0x13,0x1b,0xfd, +0x7e,0x34,0x0, 0x27,0xca,0x39,0x7e,0x34,0x20,0xdb,0x7e,0x24,0x0, 0xff,0x7e,0x8, +0x29,0xe, 0x12,0x24,0x13,0x1b,0xfd,0x7e,0x34,0x0, 0x27,0xca,0x39,0x7e,0x34,0x21, +0x2, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x29,0x35,0x12,0x24,0x13,0x1b,0xfd,0x7e,0x34, +0x0, 0x27,0xca,0x39,0x7e,0x34,0x21,0x29,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x29,0x5c, +0x12,0x24,0x13,0x1b,0xfd,0x6c,0x88,0x7c,0xb8,0x12,0x66,0xf8,0xb, 0x80,0xbe,0x80, +0x4, 0x40,0xf4,0x2, 0x48,0xb3,0xca,0xf8,0x6c,0xff,0x12,0x5b,0x38,0xb, 0xf0,0x7e, +0x73,0x77,0xbc,0xbc,0x7f,0x38,0xf3,0x12,0x99,0x1d,0xda,0xf8,0x22,0x7e,0xb3,0x77, +0x5d,0x7e,0x73,0x78,0x9b,0x14,0x68,0x1d,0x4, 0x78,0x1a,0x7e,0x8, 0xc, 0x18,0x7a, +0xf, 0x24,0x60,0x7e,0x8, 0x14,0x30,0x7a,0xf, 0x24,0x64,0xa5,0xbf,0x3, 0x16,0x7e, +0x18,0x1c,0x48,0x80,0xc, 0x7e,0x18,0x10,0x24,0x7a,0x1f,0x24,0x60,0x7e,0x18,0x18, +0x3c,0x7a,0x1f,0x24,0x64,0x22,0x7e,0xb3,0x6f,0x57,0x60,0x2, 0x61,0x5d,0x12,0x6f, +0xbf,0x78,0x2, 0x61,0x5d,0x7e,0xa3,0x6d,0x93,0xbe,0xa0,0x1, 0x78,0x1b,0x7e,0xb3, +0x6d,0xa9,0x70,0x15,0x7e,0xb3,0x6c,0x9, 0x7a,0xb3,0x78,0x29,0x7e,0xb3,0x6c,0xa, +0x7a,0xb3,0x78,0x2a,0xe4,0x7a,0xb3,0x78,0x2b,0xbe,0xa0,0x0, 0x28,0x3e,0xc2,0x0, +0x6c,0x11,0x80,0x21,0x12,0x9e,0xd9,0x7e,0x73,0x78,0x29,0xa, 0x27,0x1a,0x39,0x12, +0x9e,0xc3,0x58,0xf, 0x7e,0x73,0x78,0x2a,0xa, 0x27,0x1a,0x30,0x12,0x9e,0xc3,0x58, +0x2, 0xd2,0x0, 0xb, 0x10,0x12,0x9e,0x6d,0x38,0xda,0x30,0x0, 0xc, 0x7e,0xb3,0x78, +0x2b,0xbe,0xb0,0xc8,0x50,0xb, 0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x78, +0x2b,0x7e,0x73,0x6d,0x93,0xbe,0x70,0x2, 0x50,0x2, 0x61,0x5d,0x7e,0xb3,0x6f,0x32, +0xb4,0x1, 0x2, 0x80,0x2, 0x61,0x5d,0x6d,0xee,0x6c,0x11,0x80,0x1a,0x12,0x9e,0xd9, +0x12,0x9b,0x5e,0x7d,0xd3,0xbd,0xde,0x8, 0xc, 0x7d,0xed,0x7a,0x93,0x6d,0x9b,0x7a, +0x3, 0x6d,0x9c,0x7c,0x81,0xb, 0x10,0x12,0x9e,0x6d,0x38,0xe1,0x6c,0x11,0x61,0x56, +0xbc,0x81,0x78,0x2, 0x61,0x54,0x7e,0x30,0x2, 0xac,0x31,0x9, 0xb1,0x6c,0x9, 0xf5, +0x2b,0x9, 0xb1,0x6c,0xa, 0xf5,0x2c,0x7e,0xa3,0x6d,0x9b,0x7a,0xa1,0x2d,0x7e,0xb3, +0x6d,0x9c,0xf5,0x2e,0xbe,0xa1,0x2b,0x28,0x4, 0xe5,0x2b,0x80,0x2, 0xe5,0x2d,0xf5, +0x27,0xe5,0x2d,0xbe,0xb1,0x2b,0x50,0x4, 0xe5,0x2b,0x80,0x2, 0xe5,0x2d,0xf5,0x29, +0xe5,0x2e,0xbe,0xb1,0x2c,0x28,0x4, 0xe5,0x2c,0x80,0x2, 0xe5,0x2e,0xf5,0x28,0xe5, +0x2e,0xbe,0xb1,0x2c,0x50,0x5, 0x7e,0xa1,0x2c,0x80,0x3, 0x7e,0xa1,0x2e,0x7a,0xa1, +0x2a,0xe5,0x27,0x1a,0xfb,0xe5,0x29,0x1a,0x1b,0x9d,0x1f,0xb, 0x14,0x7c,0xb3,0xf5, +0x2f,0xe5,0x28,0x1a,0x1b,0x1a,0x5a,0x9d,0x51,0xb, 0x54,0xf5,0x30,0x12,0x9b,0x65, +0x7d,0xf3,0xe5,0x30,0xbe,0xb1,0x2f,0x50,0x50,0xe5,0x28,0xbe,0xb0,0x0, 0x8, 0x2, +0x15,0x28,0x7e,0x73,0x6f,0x67,0xa, 0xc7,0x1b,0xc4,0xe5,0x2a,0x1a,0x1b,0xbd,0x1c, +0x58,0x2, 0x5, 0x2a,0x7e,0x91,0x29,0x12,0x9b,0x65,0x7d,0xe3,0x80,0x23,0x1b,0x90, +0x6d,0xdd,0x7e,0x1, 0x2a,0x80,0xe, 0x12,0x9b,0x5e,0xbd,0x3d,0x8, 0x5, 0x12,0x9b, +0x5e,0x7d,0xd3,0x1b,0x0, 0xe5,0x28,0xbc,0xb0,0x8, 0xec,0xbd,0xde,0x58,0x2, 0x7d, +0xed,0xe5,0x27,0xbc,0xb9,0x48,0xd7,0x80,0x4e,0xe5,0x27,0xbe,0xb0,0x0, 0x8, 0x2, +0x15,0x27,0x7e,0x73,0x6f,0x66,0xa, 0xc7,0x1b,0xc4,0xe5,0x29,0x1a,0x1b,0xbd,0x1c, +0x58,0x2, 0x5, 0x29,0x7e,0x1, 0x2a,0x12,0x9b,0x65,0x7d,0xe3,0x80,0x23,0x1b,0x0, +0x6d,0xdd,0x7e,0x91,0x29,0x80,0xe, 0x12,0x9b,0x5e,0xbd,0x3d,0x8, 0x5, 0x12,0x9b, +0x5e,0x7d,0xd3,0x1b,0x90,0xe5,0x27,0xbc,0xb9,0x8, 0xec,0xbd,0xde,0x58,0x2, 0x7d, +0xed,0xe5,0x28,0xbc,0xb0,0x48,0xd7,0x7d,0x3f,0x3e,0x34,0x3e,0x34,0x7e,0x24,0x0, +0xa, 0x12,0x22,0x71,0xbd,0x3e,0x58,0xc, 0x7e,0x73,0x78,0x2b,0xbe,0x70,0x28,0x50, +0x3, 0x12,0x6e,0x57,0xb, 0x10,0x12,0x9e,0x6d,0x28,0x2, 0x41,0x10,0x22,0x7c,0xb9, +0x7c,0x70,0x2, 0x9b,0x6a,0xe5,0x2b,0x7e,0x71,0x2c,0x12,0x9f,0x7f,0xb, 0x1a,0x30, +0x22,0xca,0x3b,0x12,0x9f,0xee,0xc2,0x2, 0x7e,0x34,0x22,0x23,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x7e,0x17,0x6d,0x99,0xbd,0x1d,0x58,0x4, 0x7d,0xd1,0xe, 0xd4,0x6c, +0xcc,0x81,0xe1,0x7e,0x30,0x2, 0xac,0x3c,0x9, 0xb1,0x6c,0x9, 0xf5,0x27,0x9, 0x71, +0x6c,0xa, 0x7a,0x71,0x28,0x12,0x9b,0x6a,0x7d,0xc3,0xbd,0xdc,0x8, 0x2, 0x81,0xdf, +0xbe,0xe1,0x27,0x38,0x2, 0x81,0xdf,0xbe,0xd1,0x28,0x38,0x2, 0x81,0xdf,0x7d,0x1c, +0xe, 0x14,0x7d,0xec,0xe, 0xe4,0xe, 0xe4,0x2d,0xe1,0x6d,0xff,0x12,0x9e,0xcd,0x85, +0x28,0x2c,0x80,0x2d,0x6c,0x99,0x7e,0xf1,0x27,0x80,0x1b,0x7c,0xbf,0x7e,0x71,0x2c, +0x12,0x9c,0xf3,0x18,0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x9e,0x8e,0x80,0x6, 0xe5,0x2b, +0xbc,0xbf,0x58,0x7, 0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe0,0x4c,0x99,0x68,0x9, 0x15, +0x2c,0xe5,0x2c,0xbe,0xb0,0x0, 0x58,0xcc,0x12,0x9e,0xba,0xbd,0x13,0x58,0x38,0x85, +0x28,0x2c,0x80,0x2c,0x12,0x9e,0xa8,0x7c,0x83,0x80,0x1b,0x7c,0xb8,0x7e,0x71,0x2c, +0x12,0x9c,0xf3,0x18,0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x9e,0x86,0x80,0x6, 0xe5,0x2a, +0xbc,0xb8,0x28,0x6, 0xb, 0x80,0xbc,0xe8,0x38,0xe1,0x4c,0x99,0x68,0x9, 0x15,0x2c, +0xe5,0x2c,0xbe,0xb0,0x0, 0x58,0xcd,0x12,0x9e,0xcd,0xa, 0x3d,0x1b,0x34,0xe5,0x28, +0xa, 0x1b,0xbd,0x13,0x58,0x6e,0x12,0x9e,0xb1,0x80,0x2a,0x6c,0x99,0x7e,0xf1,0x27, +0x80,0x18,0x7c,0xbf,0x12,0x9c,0xf0,0x18,0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x9e,0x8e, +0x80,0x6, 0xe5,0x2b,0xbc,0xbf,0x58,0x7, 0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe3,0x4c, +0x99,0x68,0x7, 0x5, 0x29,0xbe,0xd1,0x29,0x38,0xd1,0x12,0x9e,0xba,0xbd,0x13,0x58, +0x33,0x12,0x9e,0xb1,0x80,0x29,0x12,0x9e,0xa8,0x7c,0x83,0x80,0x18,0x7c,0xb8,0x12, +0x9c,0xf0,0x18,0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x9e,0x86,0x80,0x6, 0xe5,0x2a,0xbc, +0xb8,0x28,0x6, 0xb, 0x80,0xbc,0xe8,0x38,0xe4,0x4c,0x99,0x68,0x7, 0x5, 0x29,0xbe, +0xd1,0x29,0x38,0xd2,0x90,0x22,0x22,0xe4,0x93,0xa, 0x1b,0xbd,0x1f,0x38,0x10,0xd2, +0x2, 0xe5,0x27,0x7a,0xb3,0x78,0xd9,0xe5,0x28,0x7a,0xb3,0x78,0xda,0x80,0xc, 0xb, +0xc0,0x7e,0x73,0x6d,0x93,0xbc,0x7c,0x28,0x2, 0x61,0x93,0xa2,0x2, 0xda,0x3b,0x22, +0x7e,0x71,0x29,0x12,0x9b,0x6a,0x7d,0x3, 0xbd,0xe0,0x22,0x9, 0xb3,0x6e,0x2a,0x9, +0x73,0x6e,0x2b,0x7c,0x6f,0xca,0x3b,0x7c,0x96,0x7c,0x6b,0x7e,0xd0,0xff,0x75,0x3e, +0xff,0x12,0x9f,0xdf,0xc2,0x5, 0x7e,0x24,0x1, 0xf4,0x7e,0xb3,0x6d,0xbc,0xb4,0x1, +0x6, 0x12,0xd3,0x94,0xc3,0xc1,0x60,0xbe,0x90,0xa, 0x28,0x3, 0xc3,0xc1,0x60,0x7e, +0x10,0x3, 0x74,0x4, 0xac,0xb9,0x19,0x15,0x28,0xb9,0x7d,0xf2,0x7c,0xf6,0x7c,0xe7, +0xc2,0x3, 0xc2,0x4, 0x7c,0x1f,0x7a,0xf1,0x3a,0x80,0x8, 0x12,0x9e,0x7c,0x8, 0x8, +0x7a,0x11,0x3a,0x12,0x9e,0x96,0x58,0xf3,0x7c,0x1f,0x7a,0xf1,0x3b,0x80,0x8, 0x12, +0x9e,0x7c,0x8, 0x8, 0x7a,0x11,0x3b,0x12,0x9e,0xe6,0x48,0xf3,0x75,0x3d,0x0, 0x7e, +0xa3,0x6f,0x66,0x7c,0xba,0x14,0xbe,0xb1,0x3b,0x78,0x8, 0xd2,0x4, 0xa, 0x6a,0x1b, +0x64,0x80,0x8, 0xe5,0x3a,0x70,0x4, 0xd2,0x3, 0x6c,0xdd,0x7c,0xe, 0x7a,0xe1,0x3c, +0x20,0x4, 0xd, 0x30,0x3, 0x37,0x80,0x8, 0x12,0x9e,0x63,0x8, 0x8, 0x7a,0x1, 0x3c, +0x12,0x9e,0x9f,0x58,0xf3,0x7c,0xe, 0x7c,0x8e,0x80,0x7, 0x12,0x9e,0x63,0x8, 0x13, +0x7c,0x80,0x7c,0xb0,0x4, 0x7c,0xb, 0x1a,0x5b,0x7e,0x73,0x6f,0x65,0x1a,0x17,0xbd, +0x51,0x48,0xe8,0xe5,0x3c,0xa, 0xeb,0xa, 0x58,0x9d,0x5e,0xf5,0x3d,0xc2,0x2, 0x7c, +0xe, 0x7a,0xe1,0x3c,0x80,0xa, 0x7c,0xbf,0x12,0x9e,0x65,0x8, 0x8, 0x7a,0x1, 0x3c, +0x12,0x9e,0x9f,0x58,0xf1,0x75,0x3f,0x0, 0xe5,0x3c,0x70,0x4, 0xd2,0x2, 0xf5,0x3e, +0x7c,0x1f,0x7a,0xf1,0x3a,0x30,0x2, 0x33,0x80,0xa, 0x12,0x9e,0x74,0xbd,0x3f,0x8, +0x8, 0x7a,0x11,0x3a,0x12,0x9e,0x96,0x58,0xf1,0x7c,0x1f,0x7a,0xf1,0x3b,0x80,0xa, +0x12,0x9e,0x74,0xbd,0x3f,0x8, 0x8, 0x7a,0x11,0x3b,0x12,0x9e,0xe6,0x48,0xf1,0xe5, +0x3a,0xa, 0x1b,0xe5,0x3b,0xa, 0x5b,0x9d,0x51,0xf5,0x3f,0x7e,0x30,0x4, 0xac,0x39, +0x9, 0x81,0x28,0xb9,0xbe,0x81,0x3d,0x40,0x16,0xbe,0x81,0x3f,0x50,0x2, 0x80,0xf, +0x9, 0xb1,0x28,0xb8,0x60,0x13,0x20,0x4, 0x6, 0x20,0x3, 0x3, 0x30,0x2, 0xa, 0x74, +0x1, 0x19,0xb1,0x28,0xb8,0xd2,0x5, 0x80,0x5, 0xe4,0x19,0xb1,0x28,0xb8,0xa2,0x5, +0xda,0x3b,0x22,0x7c,0xbd,0x7c,0x70,0x12,0x9b,0x6a,0xbd,0x3f,0x22,0x7e,0x73,0x6d, +0x93,0xbc,0x71,0x22,0x7c,0xb1,0x7e,0x71,0x3e,0x2, 0x9b,0x6a,0x7c,0xb1,0x7c,0x7e, +0x12,0x9b,0x6a,0xbd,0x3f,0x22,0xb, 0xf4,0xb, 0x90,0x7a,0x81,0x2a,0x22,0xb, 0xf4, +0xb, 0x90,0x7a,0xf1,0x2b,0x22,0x7c,0xb1,0x14,0x7c,0x1b,0xbe,0xb0,0x0, 0x22,0x7c, +0xb0,0x14,0x7c,0xb, 0xbe,0xb0,0x0, 0x22,0x6c,0x99,0xe5,0x27,0xa, 0x1b,0xb, 0x14, +0x22,0xe5,0x28,0xa, 0x5b,0xb, 0x54,0xf5,0x29,0x22,0xa, 0x3e,0x1b,0x34,0xe5,0x27, +0xa, 0x1b,0x22,0x9d,0x32,0x12,0x24,0x5a,0xbe,0x34,0x0, 0x2, 0x22,0xe5,0x27,0xa, +0x5b,0xb, 0x54,0xf5,0x2a,0x85,0x27,0x2b,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x95,0x6c, +0x9, 0x9, 0x5, 0x6c,0xa, 0x22,0x7c,0xb1,0x4, 0x7c,0x1b,0x1a,0xeb,0x7e,0x83,0x6f, +0x66,0x1a,0x18,0xbd,0xe1,0x22,0xd2,0x0, 0x6c,0x99,0x80,0x31,0x74,0x2, 0xac,0xb9, +0x9, 0x5, 0x76,0x7e,0x9, 0x15,0x76,0x7f,0x12,0x9f,0x73,0x49,0x25,0x76,0x41,0x7d, +0xf3,0x9d,0xf2,0xbe,0xf4,0x0, 0x0, 0x8, 0x4, 0x7d,0x1f,0x80,0x4, 0x6d,0x11,0x9d, +0x1f,0xbe,0x17,0x6d,0xac,0x28,0x4, 0xc2,0x0, 0x80,0xa, 0xb, 0x90,0x7e,0x83,0x76, +0x7d,0xbc,0x89,0x38,0xc7,0x20,0x0, 0x2d,0x6c,0x99,0x80,0x1d,0x74,0x2, 0xac,0xb9, +0x9, 0x5, 0x6c,0x9, 0x9, 0x15,0x6c,0xa, 0x12,0x9f,0x73,0x59,0x35,0x76,0x41,0x19, +0x5, 0x76,0x7e,0x19,0x15,0x76,0x7f,0xb, 0x90,0x7e,0x73,0x6d,0x93,0xbc,0x79,0x38, +0xdb,0x7a,0x73,0x76,0x7d,0x7e,0xb3,0x6d,0x93,0x70,0x5, 0xe4,0x7a,0xb3,0x76,0x7d, +0xa2,0x0, 0x22,0x7c,0xb0,0x7c,0x71,0x12,0x9b,0x6a,0x74,0x2, 0xac,0xb9,0x22,0x12, +0x9f,0x8d,0x7d,0x13,0x3e,0x14,0x7e,0x1f,0x24,0x68,0x2d,0x31,0x22,0x7c,0xa7,0x7e, +0x73,0x6f,0x65,0xac,0x7b,0xa, 0x2a,0x2d,0x32,0x22,0xe4,0x7a,0xb3,0x6d,0xb4,0x75, +0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0x6f,0x64,0xf5,0x29,0x7e,0xb3,0x6f,0x65,0xf5, +0x2a,0x7e,0x8, 0x0, 0x27,0x7e,0x37,0x6f,0x42,0x12,0xce,0x94,0xe4,0x33,0x7a,0xb3, +0x6d,0xb4,0xe4,0x7a,0xb3,0x6d,0xbd,0x12,0xce,0x82,0x33,0x7a,0xb3,0x6d,0xbd,0x74, +0x1, 0x7a,0xb3,0x6d,0xbe,0x12,0x9e,0xf6,0xe4,0x33,0x7a,0xb3,0x6d,0xbe,0x22,0xc2, +0x2, 0xc2,0x3, 0xc2,0x4, 0x22,0xe5,0x29,0x7e,0x71,0x2a,0x2, 0x9b,0x6a,0x7e,0xe3, +0x6f,0x64,0x7e,0xd3,0x6f,0x65,0x22,0x6d,0x11,0x7d,0x21,0x7d,0x31,0x80,0x1f,0x7d, +0x1, 0x3e,0x4, 0x7e,0x2f,0x24,0x60,0x2d,0x50,0xb, 0x2a,0x0, 0xbe,0x4, 0x27,0x10, +0x28,0x2, 0xb, 0x24,0xbe,0x4, 0xb, 0xb8,0x50,0x2, 0xb, 0x34,0xb, 0x14,0x7e,0x7, +0x73,0xd6,0xbd,0x1, 0x38,0xd9,0xbe,0x24,0x0, 0xb4,0x28,0x7, 0x7e,0xb3,0x78,0x25, +0x4, 0x80,0x12,0xbe,0x34,0x0, 0x32,0x28,0xb, 0x7e,0xb3,0x78,0x28,0x4, 0x7a,0xb3, +0x78,0x28,0x80,0x5, 0xe4,0x7a,0xb3,0x78,0x25,0x7e,0x73,0x78,0x25,0xbe,0x70,0x2, +0x40,0x7, 0x74,0xaa,0x7a,0xb3,0x77,0x2c,0x22,0x7e,0x73,0x78,0x28,0xbe,0x70,0x4, +0x40,0x3, 0x75,0xe9,0xff,0x22,0x7c,0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x6c, +0x9, 0x9, 0x73,0x6c,0xa, 0x2, 0x9b,0x6a,0xca,0x3b,0x7c,0xf4,0x7a,0x51,0x2c,0x7c, +0xe6,0x7c,0xd7,0x7c,0xcb,0x75,0x36,0x0, 0x75,0x37,0x0, 0x75,0x38,0x0, 0x75,0x39, +0x0, 0x75,0x3a,0x0, 0x75,0x3b,0x0, 0x75,0x40,0x0, 0x7e,0x37,0x6f,0x54,0x7a,0x35, +0x41,0x6c,0xaa,0x7e,0x71,0x2c,0x74,0x9, 0xac,0x7b,0x19,0xa3,0x6c,0x8a,0xe4,0x19, +0xb3,0x6c,0x8b,0x7e,0x13,0x6f,0x64,0x7e,0xb3,0x6f,0x65,0xf5,0x35,0x12,0xa7,0xd5, +0xf5,0x33,0x9, 0xb3,0x6c,0xa, 0xf5,0x34,0x7c,0xbe,0x12,0xa0,0x66,0x12,0xa7,0xc6, +0x7a,0x35,0x41,0x7e,0x37,0x6f,0x54,0xbe,0x35,0x41,0x8, 0x3, 0x7a,0x35,0x41,0xe5, +0x33,0x7c,0x71,0x7c,0x6c,0x7e,0x8, 0x0, 0x38,0x12,0xa3,0x39,0xf5,0x36,0xe5,0x34, +0x7e,0x71,0x35,0x7c,0x6d,0x7e,0x8, 0x0, 0x39,0x12,0xa3,0x39,0xf5,0x37,0xbe,0xf0, +0x1, 0xe5,0x38,0x7e,0x71,0x39,0x78,0xb, 0x12,0x9f,0x8d,0x3e,0x34,0x2e,0x34,0x20, +0x54,0x80,0x3, 0x12,0x9f,0x7f,0x7a,0x35,0x3e,0x7a,0x37,0x63,0x73,0x7e,0x34,0x24, +0xbc,0x7a,0x37,0x63,0x75,0xe5,0x38,0x7a,0xb3,0x63,0x6d,0xe5,0x39,0x7a,0xb3,0x63, +0x6e,0xe5,0x36,0x7a,0xb3,0x63,0x6f,0xe5,0x37,0x7a,0xb3,0x63,0x70,0x7e,0x73,0x6f, +0x3f,0x7a,0x73,0x63,0x71,0xe4,0x7a,0xb3,0x63,0x72,0x7e,0x8, 0x63,0x6d,0x12,0x8, +0x73,0x7e,0x37,0x24,0xbc,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x24,0xbe,0x6d,0xaa,0x2f, +0x51,0x7e,0x37,0x24,0xc0,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x24,0xc2,0x2f, +0x10,0x7a,0x1d,0x2d,0x7e,0x37,0x24,0xc4,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x24,0xc6, +0x6d,0x88,0x2f,0x41,0x7f,0x65,0xe5,0x36,0xa, 0x4b,0xe5,0x38,0xa, 0x5b,0x2d,0x54, +0xf5,0x3a,0xe5,0x37,0xa, 0x4b,0xe5,0x39,0xa, 0x5b,0x2d,0x54,0xf5,0x3b,0x85,0x38, +0x31,0x41,0x89,0x85,0x39,0x32,0x41,0x7e,0xbe,0xf0,0x1, 0x78,0x15,0xe5,0x35,0x7e, +0x71,0x31,0xac,0x7b,0xe5,0x32,0xa, 0x2b,0x2d,0x32,0x3e,0x34,0x49,0x33,0x20,0x54, +0x80,0x8, 0xe5,0x31,0x7e,0x71,0x32,0x12,0x9b,0x6a,0x7e,0x53,0x6f,0x3f,0xa, 0x25, +0x9d,0x32,0x12,0xa7,0xcd,0x18,0x2, 0x41,0x7c,0x7e,0x35,0x41,0xbe,0x35,0x3c,0x18, +0x2, 0x5, 0x40,0xe5,0x33,0xa, 0x1b,0xe5,0x31,0x12,0xa3,0x2e,0x8, 0x4, 0x9d,0x31, +0x80,0x4, 0x6d,0x33,0x9d,0x32,0xbe,0x34,0x0, 0x1, 0x18,0x19,0xe5,0x34,0xa, 0x1b, +0xe5,0x32,0x12,0xa3,0x2e,0x8, 0x4, 0x9d,0x31,0x80,0x4, 0x6d,0x33,0x9d,0x32,0xbe, +0x34,0x0, 0x1, 0x8, 0x67,0xbe,0xc0,0x3, 0x40,0x9, 0xbe,0xd0,0x3, 0x40,0x4, 0xd2, +0x0, 0x80,0x2, 0xc2,0x0, 0xe5,0x31,0x7e,0x71,0x32,0x7c,0x6e,0x12,0xdf,0xd1,0x7c, +0x9b,0xbe,0x90,0x2, 0x68,0x5, 0xbe,0x90,0x3, 0x78,0x8, 0x7e,0x35,0x3c,0xe, 0x34, +0x7a,0x35,0x3c,0xbe,0x90,0x2, 0x68,0xa, 0xbe,0x90,0x1, 0x68,0x5, 0xbe,0x90,0x3, +0x78,0x2a,0x7e,0xf5,0x3c,0x12,0xa3,0x18,0xe5,0x31,0x12,0xa3,0x1f,0x7f,0x1, 0x7e, +0x1d,0x2d,0x9f,0x10,0x7a,0x1d,0x2d,0x12,0xa3,0x18,0xe5,0x32,0x12,0xa3,0x1f,0x9f, +0x41,0x12,0xa3,0x18,0x9f,0x51,0x1a,0x26,0x1a,0x24,0x9f,0x61,0x5, 0x32,0xe5,0x3b, +0xbe,0xb1,0x32,0x28,0x2, 0x21,0xa8,0x5, 0x31,0xe5,0x3a,0xbe,0xb1,0x31,0x28,0x2, +0x21,0xa3,0xbe,0x58,0x0, 0x0, 0x78,0x2, 0xb, 0x5c,0xbe,0x68,0x0, 0x0, 0x78,0x2, +0xb, 0x6c,0x74,0x6, 0x7e,0x1d,0x2d,0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x2d,0x7f, +0x5, 0x12,0xa3,0x26,0x7e,0xf1,0x2c,0x74,0x9, 0xac,0xfb,0x59,0x37,0x6c,0x85,0x74, +0x6, 0x2f,0x44,0x14,0x78,0xfb,0x7f,0x14,0x7f,0x6, 0x12,0xa3,0x26,0x59,0x37,0x6c, +0x87,0x7e,0xb3,0x6f,0x53,0x60,0xd, 0x1e,0xd4,0x1e,0xc4,0x50,0x4, 0x4e,0xd4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x68,0x0, 0x7f,0x28,0x4, 0x7e,0x68,0x0, 0x7f,0x7d,0x3d, +0x19,0x77,0x6c,0x8a,0xe5,0x40,0x19,0xb7,0x6c,0x8b,0x9, 0x77,0x6c,0x8b,0xbe,0x70, +0x2d,0x28,0x6, 0x74,0x2d,0x19,0xb7,0x6c,0x8b,0xe5,0x33,0x19,0xb7,0x6c,0x8c,0xe5, +0x34,0x19,0xb7,0x6c,0x8d,0xda,0x3b,0x22,0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x22,0xa, +0x1b,0x6d,0x0, 0x2, 0x22,0xa3,0x12,0x22,0xbf,0x2e,0x18,0x0, 0x20,0x22,0xa, 0x3b, +0x7d,0x23,0x9d,0x21,0xbe,0x24,0x0, 0x0, 0x22,0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c, +0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34,0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, +0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39,0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, +0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39,0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c, +0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d,0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab, +0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x7c,0xf5, +0x7c,0xe6,0x7c,0x6b,0x74,0x2, 0xac,0xbe,0x9, 0xc5,0x6c,0x9, 0x9, 0xd5,0x6c,0xa, +0x7e,0xb3,0x78,0xbd,0xb4,0x1, 0x18,0x7e,0x53,0x6d,0x93,0xbe,0x50,0x1, 0x68,0x5, +0xbe,0x50,0x2, 0x28,0xa, 0x7c,0xb6,0x7c,0x6e,0x7c,0x5f,0x6c,0x44,0x80,0x1d,0x7c, +0xbc,0x7c,0x7d,0x12,0xa6,0x10,0x12,0xa3,0xe2,0x7c,0xbc,0x7c,0x7d,0x12,0xa6,0x81, +0x74,0x6, 0x7e,0x70,0x6, 0x7c,0x6e,0x7c,0x5f,0x7e,0x40,0x1, 0x12,0xa0,0x78,0xda, +0x3b,0x22,0xca,0x79,0xc2,0x0, 0x7e,0x7, 0x74,0x84,0xb, 0x4, 0x7d,0x40,0xe, 0x44, +0xe, 0x44,0x9f,0x11,0x6d,0xff,0x6d,0x11,0x6c,0xee,0x6c,0xff,0x1a,0x5f,0x3e,0x54, +0x1a,0xce,0x7e,0xd4,0x0, 0x1a,0xad,0xdc,0x2d,0x5d,0x49,0xe5,0x73,0xdc,0xbd,0x4e, +0x58,0x10,0xbd,0xe, 0x8, 0xc, 0x7d,0x5e,0x7d,0xde,0x1a,0x5a,0x1a,0xca,0x2f,0x16, +0xb, 0x14,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xd3,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xca, +0xbe,0x14,0x0, 0x0, 0x28,0x5, 0x12,0x22,0xbd,0x7d,0xf3,0x7e,0x8, 0x63,0x6d,0x12, +0xa6,0x70,0x6c,0xee,0x6c,0xff,0x1a,0xef,0x3e,0xe4,0x1a,0x2e,0x7e,0x34,0x0, 0x1a, +0xad,0x32,0x7d,0x23,0x2d,0x2e,0x49,0xe2,0x73,0xdc,0xbe,0xe4,0x0, 0x0, 0x8, 0x10, +0x7d,0x3e,0x9d,0x3f,0xbe,0x34,0x0, 0x0, 0x58,0x2, 0x6d,0x33,0x59,0x32,0x63,0x6d, +0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xcf,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xc6,0x7e,0x8, +0x64,0xbf,0x7e,0x34,0x0, 0xa9,0xe4,0x12,0x24,0x38,0x74,0x1, 0x7a,0xb3,0x65,0x13, +0x7e,0xf0,0x6, 0x7e,0xe0,0x6, 0x12,0xa5,0xe6,0xb4,0x1, 0x3, 0x12,0xa5,0x38,0x1b, +0xe0,0xbe,0xe0,0x0, 0x58,0xf0,0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe6,0x7e,0xf0,0x6, +0x7e,0xe0,0x7, 0x12,0xa5,0xe6,0xb4,0x1, 0x3, 0x12,0xa5,0x38,0xb, 0xe0,0xbe,0xe0, +0xd, 0x78,0xf0,0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe6,0x7e,0xf0,0x7, 0x7e,0xe0,0x6, +0x12,0xa5,0xe6,0xb4,0x1, 0x3, 0x12,0xa5,0x38,0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xf0, +0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xe6,0x7e,0xf0,0x7, 0x7e,0xe0,0x7, 0x12,0xa5,0xe6, +0xb4,0x1, 0x3, 0x12,0xa5,0x38,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xf0,0xb, 0xf0,0xbe, +0xf0,0xd, 0x78,0xe6,0x6c,0xee,0x6c,0xff,0x1a,0x2e,0x7e,0x34,0x0, 0xd, 0xad,0x32, +0x1a,0x2f,0x2d,0x32,0x9, 0xb3,0x64,0xbf,0x70,0xd, 0x6d,0x33,0x3e,0x24,0x1a,0xe, +0x12,0xa6,0x78,0x59,0x32,0x73,0xdc,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xda,0xb, 0xe0, +0xbe,0xe0,0xd, 0x48,0xd1,0xda,0x79,0x22,0x7e,0x18,0x63,0x6d,0x7a,0x1d,0x2c,0x7c, +0xbe,0x7c,0x7f,0x7e,0x8, 0x64,0xbf,0x7c,0xa7,0x7c,0x5b,0xbe,0x50,0x0, 0x28,0x1f, +0x12,0xa5,0xf7,0x2d,0xf3,0x2e,0xf4,0xff,0xe6,0x12,0xa6,0x8, 0x8, 0x4, 0x74,0x1, +0x80,0x2, 0x74,0x2, 0x7f,0x70,0x2d,0xf4,0x2e,0xf4,0xff,0xf3,0x7a,0x7b,0xb0,0xbe, +0xa0,0x0, 0x28,0x1b,0x12,0xa5,0xf7,0x2d,0xf3,0x1b,0xf5,0x12,0xa6,0x8, 0x8, 0x4, +0x74,0x1, 0x80,0x2, 0x74,0x2, 0x7f,0x70,0x2d,0xf4,0x1b,0xf4,0x7a,0x7b,0xb0,0xbe, +0x50,0xc, 0x50,0x1d,0x12,0xa5,0xf7,0x2d,0xf3,0x69,0x37,0x0, 0x1a,0xbe,0x34,0x0, +0x0, 0x8, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x2, 0x7f,0x70,0x2d,0xf4,0x39,0xb7,0x0, +0xd, 0xbe,0xa0,0xc, 0x50,0x2f,0x7e,0x70,0xd, 0xac,0x75,0xa, 0x4a,0x2d,0x34,0x7d, +0x43,0x3e,0x44,0x7e,0x7d,0x2c,0x2d,0xf4,0x69,0x47,0x0, 0x2, 0xbe,0x44,0x0, 0x0, +0x8, 0x9, 0x74,0x1, 0x2d,0x13,0x39,0xb0,0x0, 0x1, 0x22,0x74,0x2, 0x2d,0x31,0x7d, +0x20,0x39,0xb1,0x0, 0x1, 0x22,0x1a,0xe, 0x7e,0x14,0x0, 0xd, 0xad,0x10,0x1a,0x3f, +0x2d,0x31,0x9, 0xb3,0x64,0xbf,0x22,0x7e,0x90,0xd, 0xac,0x95,0xa, 0x3a,0x2d,0x43, +0x7d,0x34,0x3e,0x34,0x7e,0x7d,0x2c,0x22,0xb, 0x7a,0x30,0xbe,0x34,0x0, 0x0, 0x22, +0xca,0xf8,0x7c,0xa7,0x7c,0xfb,0x7e,0x8, 0x73,0xdc,0x12,0xa6,0x70,0x74,0xfa,0x7e, +0x70,0xfa,0x1a,0x1b,0xa, 0xf, 0x2d,0x1, 0xbe,0x4, 0x0, 0x0, 0x48,0x32,0x12,0xa6, +0xe6,0x58,0x2d,0x1a,0x17,0xa, 0x4a,0x2d,0x41,0xbe,0x44,0x0, 0x0, 0x48,0x21,0x7e, +0x63,0x6f,0x65,0xa, 0x16,0xbd,0x41,0x58,0x17,0xad,0x10,0x2d,0x41,0x3e,0x44,0x49, +0x44,0x4, 0x0, 0x1a,0x27,0x3e,0x24,0x1a,0xb, 0x12,0xa6,0x78,0x59,0x42,0x74,0x84, +0xb, 0x70,0xbe,0x70,0x6, 0x8, 0xbb,0x4, 0xbe,0xb0,0x6, 0x8, 0xb2,0xda,0xf8,0x22, +0x7e,0x34,0x1, 0x52,0xe4,0x2, 0x24,0x38,0x7e,0x14,0x0, 0x1a,0xad,0x10,0x2d,0x21, +0x22,0xca,0xf8,0x7c,0xa7,0x7c,0xfb,0x7e,0x8, 0x20,0x54,0x12,0x65,0x91,0x74,0xfa, +0x7e,0x70,0xfa,0x1a,0x1b,0xa, 0xf, 0x2d,0x1, 0xbe,0x4, 0x0, 0x0, 0x48,0x37,0x12, +0xa6,0xe6,0x58,0x32,0x1a,0x17,0xa, 0x2a,0x2d,0x21,0xbe,0x24,0x0, 0x0, 0x48,0x26, +0x7e,0x63,0x6f,0x65,0xa, 0x16,0xbd,0x21,0x58,0x1c,0x1a,0x47,0x3e,0x44,0x1a,0xeb, +0x7e,0xf4,0x0, 0x1a,0xad,0xfe,0x2d,0x4f,0x49,0x44,0x74,0x84,0xad,0x10,0x2d,0x21, +0x3e,0x24,0x59,0x42,0x20,0x54,0xb, 0x70,0xbe,0x70,0x6, 0x8, 0xb6,0x4, 0xbe,0xb0, +0x6, 0x8, 0xad,0xda,0xf8,0x22,0x7e,0x63,0x6f,0x64,0xa, 0x16,0xbd,0x1, 0x22,0xca, +0x3b,0x6c,0xff,0xc2,0x0, 0x7e,0xb3,0x6f,0x57,0x60,0x6, 0x7e,0xd4,0x1, 0xc2,0x80, +0x4, 0x7e,0xd4,0x3, 0xe8,0x7e,0xb3,0x6f,0x58,0xb4,0x1, 0x4, 0x7e,0xd4,0x0, 0xf0, +0x7e,0xc7,0x6d,0x99,0x6c,0xee,0xe1,0xad,0xc2,0x0, 0x7c,0xbe,0x12,0xa0,0x66,0x7d, +0xb3,0x7e,0x90,0x2, 0xac,0x9e,0x9, 0xa4,0x6c,0x9, 0x7c,0xda,0x9, 0xc4,0x6c,0xa, +0x7d,0xad,0x4c,0xdd,0x68,0x16,0x7e,0xb3,0x6f,0x66,0x14,0xbc,0xbd,0x68,0xd, 0x4c, +0xcc,0x68,0x9, 0x7e,0xb3,0x6f,0x67,0x14,0xbc,0xbc,0x78,0x8, 0x7d,0xad,0x1e,0xa4, +0x2e,0xa4,0x0, 0x64,0x7c,0xba,0x12,0xa7,0xe9,0xbd,0x3b,0x58,0x4, 0xd2,0x0, 0x80, +0x26,0x7e,0x73,0x6f,0x32,0xbe,0x73,0x6d,0x93,0x78,0x1c,0x7e,0x37,0x3, 0xfe,0xe, +0x34,0xbd,0x3c,0x58,0x12,0x7c,0xbe,0x7e,0x70,0x1, 0x12,0xd1,0x93,0x7d,0x1a,0x6d, +0x0, 0xbf,0x10,0x8, 0x2, 0xd2,0x0, 0x30,0x0, 0x21,0x7c,0xbe,0x12,0x6e,0x5, 0x60, +0x1a,0x7e,0x34,0x0, 0x9, 0xca,0x39,0xac,0x7e,0x2e,0x34,0x6c,0x85,0x6d,0x22,0x12, +0xa7,0xdf,0x6d,0x0, 0x12,0x24,0x13,0x1b,0xfd,0xb, 0xf0,0xb, 0xe0,0x12,0x6f,0xa9, +0x28,0x2, 0xe1,0x18,0x7a,0x73,0x6d,0xa8,0x7a,0xf3,0x6f,0x31,0x7a,0xc7,0x3, 0xfe, +0xda,0x3b,0x22,0x2, 0xa6,0xef,0x7e,0x24,0x0, 0x3, 0x2, 0x22,0x71,0x7a,0x35,0x3c, +0xbe,0x34,0x0, 0x0, 0x22,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x6c,0x9, 0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x6d,0xc9,0x22,0x7e,0x37,0x6f,0x40,0x7e,0x53,0x6f, +0x66,0xbc,0x5b,0x38,0x4, 0x7e,0x37,0x6f,0x46,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, +0x1a,0x0, 0x1b,0x2a,0x0, 0x1b,0x1a,0x10,0x22,0x7c,0xab,0x7e,0xb3,0x6d,0xa9,0x7e, +0x93,0x6d,0x93,0x60,0x4a,0xb4,0x1, 0x5, 0xbe,0x90,0x2, 0x68,0x42,0x74,0x9, 0xa4, +0x9, 0xa5,0x6c,0x8b,0xbe,0x90,0x1, 0x78,0x24,0xbe,0xa0,0x19,0x28,0x7, 0x74,0x6, +0x7a,0xb, 0xb0,0x80,0x27,0xbe,0xa0,0x14,0x28,0x7, 0x74,0x5, 0x7a,0xb, 0xb0,0x80, +0x1b,0xbe,0xa0,0xa, 0x28,0x19,0x74,0x4, 0x7a,0xb, 0xb0,0x80,0xf, 0xbe,0x90,0x2, +0x78,0xd, 0xbe,0xa0,0x14,0x28,0x8, 0x74,0x4, 0x7a,0xb, 0xb0,0x7a,0x1b,0xb0,0x22, +0xca,0x3b,0x6c,0xff,0x6c,0xee,0x7e,0xb3,0x6f,0x66,0xf5,0x2b,0x7e,0xd3,0x6f,0x67, +0xe4,0x7a,0xb3,0x75,0x2f,0x7e,0xb3,0x25,0xae,0xb4,0x1, 0x2, 0x80,0x2, 0x21,0x6a, +0x6c,0xcc,0x21,0x58,0x7e,0x70,0x2, 0xac,0x7c,0x12,0xa9,0x70,0x75,0x27,0x3, 0x75, +0x28,0x3, 0x12,0x9f,0xe6,0xbe,0x37,0x6f,0x42,0x58,0x2, 0x21,0x56,0x7e,0x73,0x6d, +0x93,0xbe,0x70,0x5, 0x28,0x6, 0x75,0x27,0x2, 0x75,0x28,0x2, 0xe5,0x29,0xbe,0xb0, +0x1, 0x68,0x9, 0xe5,0x2b,0x24,0xfe,0xbe,0xb1,0x29,0x78,0x3, 0x75,0x27,0x2, 0xe5, +0x2a,0xbe,0xb0,0x1, 0x68,0x9, 0x7c,0xbd,0x24,0xfe,0xbe,0xb1,0x2a,0x78,0x3, 0x75, +0x28,0x2, 0xe5,0x29,0x60,0x8, 0xe5,0x2b,0x14,0xbe,0xb1,0x29,0x78,0x3, 0x75,0x27, +0x2, 0xe5,0x2a,0x60,0x8, 0x7c,0xbd,0x14,0xbe,0xb1,0x2a,0x78,0x3, 0x75,0x28,0x2, +0xc2,0x0, 0xe5,0x29,0x7e,0x71,0x2a,0x7c,0x6c,0x12,0xdf,0xd1,0xbe,0xb0,0xff,0x68, +0x6, 0x75,0x27,0x2, 0x75,0x28,0x2, 0x7c,0xbc,0x7e,0x8, 0x0, 0x27,0x7e,0x18,0x0, +0x28,0x12,0xa8,0x9, 0x7e,0xb3,0x6f,0x57,0x60,0x6, 0x75,0x27,0x4, 0x75,0x28,0x4, +0xe5,0x27,0x7e,0x71,0x28,0x7c,0x6c,0x7c,0x5e,0x12,0xa3,0x8c,0x7e,0x70,0x9, 0xac, +0x7e,0x9, 0x53,0x6c,0x8b,0xbc,0x5f,0x28,0x2, 0x7c,0xf5,0x90,0x21,0xd9,0xe4,0x93, +0xb4,0x1, 0x11,0x7d,0x13,0x2e,0x14,0x6c,0x85,0x6d,0x0, 0x2e,0x34,0x6c,0x87,0x6d, +0x22,0x12,0xa7,0xfa,0xb, 0xe0,0xb, 0xc0,0x7e,0x73,0x6d,0x93,0xbc,0x7c,0x28,0x2, +0x1, 0x84,0x7a,0xe3,0x6d,0x93,0x7a,0xf3,0x75,0x2f,0xda,0x3b,0x22,0x2, 0xa8,0x60, +0x9, 0xb3,0x6c,0x9, 0xf5,0x29,0x9, 0xb3,0x6c,0xa, 0xf5,0x2a,0x22,0xca,0x3b,0x7c, +0xfb,0x12,0x9f,0xdf,0x7e,0x94,0x0, 0x51,0x7e,0xe3,0x6d,0x93,0xe4,0x7a,0xb3,0x75, +0xff,0x7a,0xb3,0x76,0x0, 0x7a,0xb3,0x75,0xc1,0x7e,0x8, 0x76,0x1, 0x12,0xac,0x4c, +0xe4,0x12,0x24,0x38,0x12,0xac,0x4c,0x3e,0x34,0x7e,0x8, 0x75,0xc2,0xe4,0x12,0x24, +0x38,0xbe,0xe0,0x2, 0x50,0x2, 0x81,0x33,0x6c,0xdd,0x81,0x2d,0x74,0x2, 0x7c,0x7d, +0xac,0x7b,0x12,0xa9,0x70,0x4c,0xdd,0x68,0x8, 0xa, 0x8d,0x9, 0xb8,0x76,0x1, 0x70, +0xa, 0xa, 0x3d,0xb, 0x34,0xa, 0x8d,0x19,0x78,0x76,0x1, 0xa, 0x5d,0xb, 0x54,0xf5, +0x27,0x81,0x24,0x7e,0xa1,0x27,0x74,0x2, 0x7c,0x7a,0xac,0x7b,0x9, 0xa3,0x6c,0x9, +0x7a,0xa1,0x2b,0x9, 0xb3,0x6c,0xa, 0xf5,0x2c,0xa, 0x2a,0xe5,0x29,0x12,0x85,0xe0, +0x8, 0x6, 0x7d,0x50,0x9d,0x52,0x80,0x4, 0x6d,0x55,0x9d,0x53,0xf5,0x2d,0xe5,0x2c, +0xa, 0x2b,0xe5,0x2a,0x12,0x85,0xe0,0x8, 0x6, 0x7d,0x80,0x9d,0x82,0x80,0x4, 0x6d, +0x88,0x9d,0x83,0x7d,0x38,0x7c,0xc7,0xe5,0x2d,0xbe,0xb0,0x6, 0x40,0x2, 0x81,0x22, +0xbe,0xc0,0x6, 0x40,0x2, 0x81,0x22,0x12,0x9f,0xe6,0x7a,0x35,0x2f,0x12,0x9b,0x65, +0x7d,0x83,0x7e,0x25,0x2f,0xbd,0x28,0x8, 0x4, 0x7d,0x38,0x80,0x3, 0x7e,0x35,0x2f, +0x7a,0x35,0x31,0xbd,0x28,0x58,0x4, 0x7d,0x38,0x80,0x3, 0x7e,0x35,0x2f,0x7a,0x35, +0x33,0x75,0x2e,0x0, 0xe5,0x2d,0xbe,0xb0,0x1, 0x38,0x21,0xbe,0xc0,0x1, 0x38,0x1c, +0x7c,0xbf,0x30,0xe0,0x17,0x7e,0xb3,0x75,0xc1,0x4, 0x7a,0xb3,0x75,0xc1,0x75,0x2e, +0x1, 0x7e,0xb3,0x75,0xff,0x4, 0x7a,0xb3,0x75,0xff,0x61,0xc6,0xe5,0x2d,0xbe,0xb0, +0x1, 0x38,0x7, 0xbe,0xc0,0x1, 0x38,0x2, 0x61,0xc6,0xe5,0x2d,0xbe,0xb0,0x6, 0x40, +0x2, 0x61,0xc6,0xbe,0xc0,0x6, 0x40,0x2, 0x61,0xc6,0x7c,0xbf,0x20,0xe1,0x2, 0x61, +0xc6,0xc2,0x3, 0xe5,0x2d,0xbe,0xb0,0x2, 0x28,0x5, 0xbe,0xc0,0x2, 0x38,0x2, 0xd2, +0x3, 0x12,0xac,0x53,0x12,0xd4,0x92,0x12,0x87,0x4c,0x7a,0xd, 0x3b,0x7d,0x38,0x2e, +0x35,0x2f,0x12,0xae,0x4f,0x7a,0x35,0x35,0xc2,0x2, 0xbe,0x8, 0x7f,0xff,0x78,0x5, +0x9f,0x11,0x7a,0x1d,0x3b,0x7e,0x35,0x35,0x7a,0x35,0x44,0x12,0xac,0x53,0x7e,0xd, +0x3b,0x12,0xad,0x38,0x92,0x4, 0x12,0xaf,0x58,0x92,0x1, 0x7e,0x35,0x33,0x12,0xac, +0x39,0x20,0x1, 0x1a,0xe5,0x2d,0xbe,0xb0,0x4, 0x38,0x13,0xbe,0xc0,0x4, 0x38,0xe, +0xa, 0x2c,0xe5,0x2d,0xa, 0x3b,0x12,0xac,0x45,0x18,0x3, 0x12,0xac,0x36,0x85,0x2a, +0x44,0x85,0x2b,0x45,0x85,0x2c,0x46,0x7e,0x8, 0x0, 0x3f,0x7e,0x18,0x0, 0x41,0xe5, +0x29,0x12,0xaf,0x3, 0xe5,0x2d,0xa, 0x4b,0xbe,0x45,0x41,0x8, 0x7, 0xa, 0x3c,0xbe, +0x35,0x41,0x18,0x8, 0x12,0xac,0x41,0x18,0x3, 0x7e,0x95,0x3f,0x7e,0x5, 0x41,0xbe, +0x4, 0x0, 0x3, 0x78,0x5, 0x7e,0x35,0x33,0x80,0x14,0xbe,0x4, 0x0, 0x4, 0x78,0x5, +0x7e,0x35,0x35,0x80,0x9, 0xbe,0x4, 0x0, 0x5, 0x78,0x6, 0x7e,0x35,0x31,0x12,0xac, +0x39,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0x4, 0x7e,0x94,0x0, 0x3c,0x7e,0xb3,0x6f,0x57, +0x60,0x18,0x12,0xac,0x36,0xe5,0x2d,0xbe,0xb0,0x2, 0x38,0xe, 0xbe,0xc0,0x2, 0x38, +0x9, 0x12,0xac,0x41,0x18,0x4, 0x7e,0x94,0x0, 0x32,0x7d,0x19,0x1a,0x2, 0x1a,0x0, +0x7e,0x1d,0x37,0x12,0x22,0xa3,0x7e,0x8, 0x0, 0x64,0x12,0x23,0x10,0x7f,0x1, 0x7e, +0x1d,0x3b,0xbf,0x10,0x8, 0x2, 0xd2,0x2, 0x30,0x4, 0x5, 0x20,0x3, 0x2, 0xc2,0x2, +0x30,0x2, 0x3, 0x75,0x2e,0x2, 0xe5,0x2e,0xbe,0xb0,0x0, 0x28,0x55,0xe5,0x27,0xa, +0x4b,0x9, 0x14,0x76,0x1, 0xa5,0xb9,0x0, 0xc, 0xa, 0x3d,0x9, 0xa3,0x76,0x1, 0x19, +0xa4,0x76,0x1, 0x80,0x3d,0xa, 0x3d,0x9, 0x53,0x76,0x1, 0x7a,0x51,0x43,0xbc,0x51, +0x28,0x3, 0x7a,0x11,0x43,0x75,0x28,0x0, 0x80,0x23,0x9, 0x64,0x76,0x1, 0xe5,0x28, +0xa, 0xb, 0x9, 0x30,0x76,0x1, 0xbc,0x36,0x68,0xa, 0xa, 0x3d,0x9, 0x63,0x76,0x1, +0xbc,0x36,0x78,0x7, 0x7e,0xa1,0x43,0x19,0xa0,0x76,0x1, 0x5, 0x28,0xbe,0xe1,0x28, +0x38,0xd8,0x5, 0x27,0xbe,0xe1,0x27,0x28,0x2, 0x21,0xe3,0xb, 0xd0,0xbc,0xed,0x28, +0x2, 0x21,0xbc,0xda,0x3b,0x22,0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x7a,0x1d,0x37, +0x22,0xa, 0x2c,0x7d,0x34,0x2d,0x32,0xbe,0x34,0x0, 0x6, 0x22,0x90,0x21,0x52,0x93, +0xa, 0x3b,0x22,0xe5,0x29,0x7e,0x71,0x2a,0x7e,0x61,0x2b,0x7e,0x51,0x2c,0x22,0xca, +0xd8,0xca,0x79,0xc2,0x0, 0x7e,0xe0,0x3, 0xe4,0x7a,0xb3,0x75,0xfe,0x7e,0xd3,0x6f, +0x32,0x12,0xd6,0x93,0x7e,0xf3,0x6d,0x93,0xbe,0xf0,0x1, 0x38,0x2, 0xa1,0x29,0x7c, +0xbe,0x12,0xa9,0x7d,0x4c,0xdd,0x78,0x4, 0xc2,0x0, 0x80,0x5f,0xbe,0xd0,0x1, 0x28, +0xd, 0x7e,0x73,0x76,0x3f,0xbe,0x70,0x6, 0x28,0x4, 0xc2,0x0, 0x80,0x4d,0xc2,0x0, +0x7e,0x53,0x6d,0x93,0xbc,0x5d,0x78,0x11,0x12,0xae,0xe3,0x50,0x5, 0x7e,0xe0,0x3, +0x80,0x3, 0x7e,0xe0,0x1, 0xd2,0x0, 0x80,0x32,0x7e,0x43,0x75,0xff,0xa, 0x34,0xa, +0x25,0x7d,0x12,0x9d,0x13,0xb, 0x14,0xa, 0x3d,0xbd,0x31,0x78,0x7, 0x7e,0xe0,0x1, +0xd2,0x0, 0x80,0x17,0x7e,0x73,0x75,0xc1,0xa, 0x37,0x9d,0x23,0xb, 0x24,0x7e,0x73, +0x76,0x40,0xbd,0x32,0x78,0x5, 0x7e,0xe0,0x41,0xd2,0x0, 0x30,0x0, 0x5, 0x7c,0xbe, +0x12,0xa9,0x7d,0x7e,0x8, 0x76,0x1, 0x12,0xd3,0xc6,0x7a,0xb3,0x75,0xfe,0x7e,0xa3, +0x75,0xfe,0x7a,0xa3,0x6d,0x93,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x75,0xc2,0x7e, +0x8, 0x6c,0x9, 0x12,0x24,0x13,0x1b,0xfd,0x7e,0x73,0x6d,0x93,0x7a,0x73,0x76,0x40, +0x12,0xae,0x56,0x7a,0xb3,0x76,0x3f,0x80,0xa, 0x74,0x64,0x7a,0xb3,0x76,0x3f,0x7a, +0xf3,0x76,0x40,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x60,0x7c,0xf5,0x7c,0xe6, +0x12,0xad,0x9f,0x7d,0xb3,0x7c,0xbe,0x7c,0x7f,0x12,0xad,0x9f,0x2d,0x3b,0x12,0xae, +0x4f,0x7d,0xa3,0x7e,0x25,0x44,0x7d,0x12,0x9d,0x1a,0xbe,0x14,0x0, 0x0, 0x8, 0x6, +0x7d,0x32,0x9d,0x3a,0x80,0x4, 0x6d,0x33,0x9d,0x31,0x7d,0x12,0x1a,0x2, 0x1a,0x0, +0x9f,0x6, 0xbe,0x14,0x0, 0x0, 0x8, 0x6, 0x7d,0xd, 0x9d,0x20,0x80,0x4, 0x6d,0x22, +0x9d,0x21,0x7e,0x14,0x0, 0x3, 0xad,0x13,0xbd,0x12,0x58,0xf, 0xbe,0x24,0x0, 0x64, +0x8, 0x9, 0xbe,0x34,0x0, 0x46,0x8, 0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x79,0x22,0xca, +0x79,0x7c,0x8b,0x7e,0xb3,0x6f,0x66,0xf5,0x49,0x7e,0x93,0x6f,0x67,0x7e,0x4, 0x80, +0x1, 0x7c,0xf7,0x1a,0x18,0x1b,0x14,0x7c,0xe3,0xc1,0x3e,0x7a,0xe1,0x47,0xbe,0xe0, +0x0, 0x58,0xc, 0x1a,0x5e,0x1a,0x18,0x9d,0x15,0x1a,0x58,0x2d,0x51,0xf5,0x47,0xe5, +0x49,0xbc,0xbe,0x18,0xc, 0x1a,0x58,0x1a,0x1e,0x9d,0x15,0x1a,0x58,0x9d,0x51,0xf5, +0x47,0x1a,0x5f,0x1b,0x54,0xf5,0x46,0x80,0x47,0x85,0x46,0x48,0xe5,0x46,0xbe,0xb0, +0x0, 0x58,0xe, 0xe5,0x46,0x1a,0x5b,0x1a,0x1f,0x9d,0x15,0x1a,0x5f,0x2d,0x51,0xf5, +0x48,0xbe,0x91,0x46,0x18,0xe, 0x1a,0x3f,0xe5,0x46,0x1a,0x1b,0x9d,0x13,0x1a,0x5f, +0x9d,0x51,0xf5,0x48,0xbe,0x81,0x47,0x78,0x5, 0xbe,0xf1,0x48,0x68,0x10,0xe5,0x47, +0x7e,0x71,0x48,0x12,0x9b,0x6a,0x7d,0xf3,0xbd,0xf0,0x8, 0x2, 0x7d,0xf, 0x5, 0x46, +0x1a,0xef,0xb, 0xe4,0xe5,0x46,0x1a,0x1b,0xbd,0x1e,0x8, 0xad,0xb, 0xe0,0x1a,0x58, +0xb, 0x54,0x1a,0x1e,0xbd,0x15,0x18,0x2, 0xa1,0xbb,0x7d,0x30,0xda,0x79,0x22,0x7e, +0x24,0x0, 0x2, 0x2, 0x22,0x71,0xca,0x3b,0x7e,0xa0,0x64,0x6c,0x77,0x80,0x67,0xa, +0x27,0xb, 0x24,0x7c,0x65,0x80,0x55,0x7e,0xf0,0x2, 0xac,0xf6,0x9, 0xb7,0x6c,0x9, +0xa, 0xb, 0x7e,0xd0,0x2, 0xac,0xd7,0x9, 0xb6,0x6c,0x9, 0xa, 0x2b,0x12,0xae,0xda, +0x8, 0x4, 0x9d,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0x9, 0x47,0x6c,0xa, 0xa, 0x44, +0x9, 0x46,0x6c,0xa, 0xa, 0x14,0x7d,0x1, 0x9d,0x4, 0xbe,0x4, 0x0, 0x0, 0x8, 0x4, +0x9d,0x14,0x80,0x4, 0x6d,0x11,0x9d,0x10,0x7c,0x43,0xbc,0x45,0x50,0x4, 0x7c,0x35, +0x80,0x2, 0x7c,0x34,0xbc,0xa3,0x28,0x2, 0x7c,0xa3,0xb, 0x60,0x7e,0x23,0x6d,0x93, +0xbc,0x26,0x38,0xa3,0xb, 0x70,0x7e,0xb3,0x6d,0x93,0xbc,0xb7,0x38,0x91,0xbe,0xa0, +0x64,0x78,0x2, 0x6c,0xaa,0x7c,0xba,0xda,0x3b,0x22,0x7d,0x12,0x9d,0x10,0xbe,0x14, +0x0, 0x0, 0x22,0x6c,0xaa,0x80,0x12,0x7e,0x70,0x9, 0xac,0x7a,0x9, 0xb3,0x6c,0x8b, +0xbe,0xb0,0x10,0x28,0x2, 0xd3,0x22,0xb, 0xa0,0x7e,0xb3,0x6d,0xa9,0xbc,0xba,0x38, +0xe6,0xc3,0x22,0x7c,0x9b,0x7f,0x71,0x7f,0x60,0x7e,0x34,0x29,0x6, 0x7e,0x24,0x0, +0xff,0x7e,0x14,0x63,0x6d,0x74,0x30,0x12,0x23,0x65,0x7e,0x58,0x63,0x6d,0x7c,0xb9, +0x7e,0x71,0x44,0x12,0x9b,0x6a,0x7d,0x3, 0xe5,0x45,0x7e,0x71,0x46,0x12,0x9b,0x6a, +0x2d,0x30,0xe, 0x34,0x7f,0x5, 0x7e,0x50,0x8, 0xb, 0xa, 0x50,0xbd,0x53,0x58,0xf, +0x69,0x30,0x0, 0x2, 0x1b,0x6a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x7a,0x30,0x22,0x2e, +0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe2,0x22,0xd2,0x5, 0x7e,0x73,0x6d,0x93,0xbe,0x70, +0x3, 0x50,0x2, 0xc3,0x22,0x7e,0x8, 0x63,0x6d,0x12,0xaf,0xd0,0x6c,0xaa,0x80,0x17, +0x7e,0x90,0x2, 0xac,0x9a,0x9, 0xb4,0x6c,0x9, 0x19,0xb4,0x63,0x6d,0x9, 0xb4,0x6c, +0xa, 0x19,0xb4,0x63,0x6e,0xb, 0xa0,0x7e,0x73,0x6d,0x93,0xbc,0x7a,0x38,0xe1,0x6c, +0xaa,0x80,0x36,0xa, 0x2a,0xb, 0x24,0x7c,0x65,0x80,0x28,0x7e,0x50,0x2, 0xac,0x56, +0x9, 0x12,0x63,0x6d,0x7e,0x30,0x2, 0xac,0x3a,0x9, 0xb1,0x63,0x6d,0xbc,0xb1,0x78, +0x2, 0xc2,0x5, 0x9, 0x52,0x63,0x6e,0x9, 0xb1,0x63,0x6e,0xbc,0xb5,0x78,0x2, 0xc2, +0x5, 0xb, 0x60,0xbc,0x76,0x38,0xd4,0xb, 0xa0,0xbc,0x7a,0x38,0xc6,0xa2,0x5, 0x22, +0x7e,0x34,0x0, 0x3c,0xe4,0x2, 0x24,0x38,0xca,0x3b,0xc2,0x0, 0x7e,0x38,0x6e,0xd7, +0x6c,0xaa,0x80,0x19,0x7e,0x70,0xff,0x12,0xb3,0x97,0x74,0xff,0xa, 0x4a,0x19,0xb4, +0x63,0x81,0xe4,0x19,0xb4,0x63,0x6d,0x19,0xb4,0x63,0x77,0xb, 0xa0,0x12,0x45,0x1f, +0x38,0xe2,0x7e,0x73,0x6f,0x31,0xa5,0xbf,0x0, 0x2e,0x7e,0xb3,0x3, 0xc9,0x70,0x2, +0x41,0xb8,0x6c,0xaa,0x80,0x1b,0x7e,0x44,0x7f,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x7f, +0x3, 0x2d,0x12,0x79,0x40,0x0, 0x2, 0x7f,0x3, 0x2d,0x12,0x79,0x40,0x0, 0x4, 0xb, +0xa0,0x12,0x45,0x1f,0x38,0xe0,0x41,0xb8,0x7e,0xb3,0x3, 0xc9,0x70,0x3b,0xbe,0x70, +0x0, 0x28,0x36,0x6c,0xaa,0x80,0x2b,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x6d,0xc9, +0x7f,0x3, 0x2d,0x14,0x79,0x30,0x0, 0x2, 0x49,0x34,0x6d,0xcb,0x7f,0x3, 0x2d,0x14, +0x79,0x30,0x0, 0x4, 0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x63,0x6d,0x19,0xa4,0x6d,0xcd, +0xb, 0xa0,0x12,0xb3,0x5f,0x38,0xd0,0x41,0xb8,0x6c,0xaa,0x80,0x1d,0x7e,0x44,0x7f, +0xff,0x7e,0x70,0x2, 0xac,0x7a,0x3e,0x34,0x59,0x43,0x24,0x6c,0x59,0x43,0x24,0x6e, +0x59,0x43,0x24,0x94,0x59,0x43,0x24,0x96,0xb, 0xa0,0x12,0x45,0x1f,0x38,0xde,0x7e, +0xb3,0x3, 0xc9,0xbe,0xb3,0x6f,0x31,0x28,0x9, 0xbe,0xb0,0x2, 0x40,0x4, 0xd2,0x0, +0x80,0x2, 0xc2,0x0, 0x6c,0xaa,0x21,0x75,0x75,0x27,0x0, 0x21,0x6c,0x12,0xb3,0xa1, +0x7f,0x73,0x2d,0xf3,0x69,0x17,0x0, 0x2, 0xbe,0x14,0x7f,0xff,0x78,0x2, 0x21,0x6a, +0xe5,0x27,0xa, 0x2b,0x9, 0xb2,0x63,0x77,0x60,0x2, 0x21,0x6a,0x30,0x0, 0x6c,0x7e, +0x71,0x27,0x74,0x2, 0xac,0x7b,0x49,0x3, 0x3, 0xde,0xbe,0x4, 0x7f,0xff,0x68,0x5b, +0x49,0xd3,0x3, 0xde,0x69,0x7, 0x0, 0x2, 0x7d,0x40,0x9d,0x4d,0x2d,0x40,0x49,0xd3, +0x3, 0xca,0x69,0x7, 0x0, 0x4, 0x7d,0x30,0x9d,0x3d,0x2d,0x30,0xbe,0x44,0x0, 0x0, +0x58,0x2, 0x6d,0x44,0xbe,0x34,0x0, 0x0, 0x58,0x2, 0x6d,0x33,0x7e,0x3, 0x6f,0x66, +0x12,0xb3,0x8b,0xbd,0xd4,0x18,0x6, 0x7d,0x40,0x9e,0x44,0x0, 0x21,0x7e,0x3, 0x6f, +0x67,0x12,0xb3,0x8b,0xbd,0xd3,0x18,0x6, 0x7d,0x30,0x9e,0x34,0x0, 0x21,0x12,0xb3, +0x66,0x59,0x40,0x24,0x6c,0x59,0x30,0x24,0x6e,0x80,0xf, 0x12,0xb3,0x66,0x59,0x10, +0x24,0x6c,0x69,0x17,0x0, 0x4, 0x59,0x10,0x24,0x6e,0xe5,0x27,0xa, 0x1a,0x19,0xb1, +0x63,0x81,0x74,0x1, 0x19,0xb2,0x63,0x77,0x80,0x9, 0x5, 0x27,0x12,0xb3,0x6e,0x28, +0x2, 0x1, 0xbd,0xb, 0xa0,0x7e,0xb3,0x3, 0xc9,0xbc,0xba,0x28,0x2, 0x1, 0xb8,0x6c, +0xaa,0x80,0x1a,0x12,0xb3,0x77,0x69,0x30,0x0, 0x2, 0x7e,0x50,0x2, 0xac,0x5a,0x59, +0x32,0x3, 0xde,0x69,0x30,0x0, 0x4, 0x59,0x32,0x3, 0xca,0xb, 0xa0,0x12,0x73,0x78, +0xbc,0x7a,0x38,0xdf,0x6c,0xaa,0x80,0x31,0xa, 0x2a,0x9, 0xb2,0x63,0x81,0xb4,0xff, +0x26,0x75,0x27,0x0, 0x80,0x1c,0xe5,0x27,0xa, 0x4b,0x9, 0xb4,0x63,0x77,0x70,0x10, +0xe5,0x27,0xa, 0x2a,0x19,0xb2,0x63,0x81,0x74,0x1, 0x19,0xb4,0x63,0x77,0x80,0x7, +0x5, 0x27,0xbe,0x71,0x27,0x38,0xdf,0xb, 0xa0,0xbc,0x7a,0x38,0xcb,0x6c,0xaa,0x80, +0x18,0x12,0xb3,0xb3,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x59,0x42,0x24,0x94,0x49, +0x33,0x6d,0xcb,0x59,0x32,0x24,0x96,0xb, 0xa0,0x12,0xb3,0x5f,0x38,0xe3,0x7e,0x34, +0x24,0x6c,0x7a,0x37,0x63,0x8d,0x7e,0x34,0x24,0x94,0x7a,0x37,0x63,0x8f,0x7e,0x34, +0x24,0xbc,0x7a,0x37,0x63,0x91,0x7e,0x73,0x3, 0xc9,0x7a,0x73,0x63,0x8b,0x7e,0x73, +0x6f,0x31,0x7a,0x73,0x63,0x8c,0x7e,0x8, 0x63,0x8b,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x56,0x7e,0x70,0xff,0x75,0x27,0x0, 0x80,0x1d,0x7e,0x51,0x27,0x74,0x2, 0xac,0x5b, +0x49,0x12,0x24,0xbc,0xa, 0x2a,0xbd,0x21,0x78,0xa, 0xe5,0x27,0xa, 0x3b,0x9, 0x73, +0x63,0x81,0x80,0x7, 0x5, 0x27,0x12,0xb3,0x6e,0x38,0xde,0xbe,0x70,0xff,0x68,0x25, +0x12,0xb3,0x97,0x74,0x1, 0xa, 0x47,0x19,0xb4,0x63,0x6d,0x7e,0x50,0x9, 0xac,0x5a, +0x49,0x42,0x6d,0xc9,0x12,0xb3,0x81,0x79,0x40,0x0, 0x2, 0x12,0xb3,0xa9,0x12,0xb3, +0x81,0x79,0x40,0x0, 0x4, 0xb, 0xa0,0x7e,0x63,0x6f,0x31,0xbc,0x6a,0x38,0xa2,0x6c, +0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x63,0x6d,0xbe,0xb0,0x1, 0x68,0x13,0x7e,0x44, +0x7f,0xff,0x12,0xb3,0x77,0x79,0x40,0x0, 0x2, 0x2d,0x37,0x7d,0x26,0x79,0x41,0x0, +0x4, 0xb, 0xa0,0x12,0x45,0x1f,0x38,0xdb,0x7e,0x73,0x6f,0x31,0x7a,0x73,0x3, 0xc9, +0x7f,0x3, 0x7e,0x18,0x63,0x6d,0x12,0xb2,0xcc,0xda,0x3b,0x22,0xca,0x79,0x7e,0xa3, +0x6f,0x31,0x6c,0x99,0x80,0x77,0xa, 0xf9,0x2d,0xf3,0x7d,0xe2,0x7e,0x7b,0xb0,0xb4, +0x1, 0x27,0x12,0xb3,0x55,0x29,0xb7,0x0, 0x1, 0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb7, +0x0, 0x1, 0x12,0xb3,0x55,0x29,0x87,0x0, 0x1, 0xbe,0x80,0x3, 0x78,0x3, 0xe4,0x80, +0x32,0x4c,0x88,0x78,0x31,0x74,0x2, 0x80,0x2a,0x12,0xb3,0x55,0x29,0xb7,0x0, 0x1, +0xbe,0xb0,0x2, 0x68,0x8, 0x60,0x6, 0x29,0xb7,0x0, 0x7, 0x70,0x14,0x74,0x1, 0x7a, +0x7b,0xb0,0x7c,0x8a,0xb, 0xa0,0x7e,0xf0,0x9, 0xac,0xf8,0x19,0x97,0x6d,0xcd,0x80, +0x5, 0x74,0x3, 0x7a,0x7b,0xb0,0x12,0xb3,0x55,0x7e,0x7b,0xb0,0x39,0xb7,0x0, 0x1, +0x12,0xb3,0x55,0x29,0xb7,0x0, 0x1, 0x39,0xb7,0x0, 0x7, 0xb, 0x90,0x12,0x96,0xdc, +0x38,0x84,0xda,0x79,0x22,0x7e,0xf0,0x9, 0xac,0xf9,0x7f,0x70,0x2d,0xf7,0x22,0x7e, +0xb3,0x6f,0x31,0xbc,0xba,0x22,0x7e,0x10,0x2, 0xac,0x1a,0x3e,0x4, 0x22,0x90,0x21, +0x51,0xe4,0x93,0xbe,0xb1,0x27,0x22,0x7e,0x70,0x9, 0xac,0x7a,0x7f,0x3, 0x2d,0x13, +0x22,0x7e,0x50,0x9, 0xac,0x57,0x7f,0x3, 0x2d,0x12,0x22,0x7e,0x10,0x40,0xac,0x1, +0x7d,0xd0,0x9e,0xd4,0x0, 0x20,0x22,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x72,0x6d,0xcd, +0x22,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x22,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x42, +0x6d,0xcb,0x22,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x43,0x6d,0xc9,0x22,0x7e,0x14,0x21, +0xda,0x12,0x6f,0xdd,0x7e,0x14,0x21,0xde,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xd0,0x7e, +0x14,0x21,0xe0,0x12,0xb4,0xe6,0x90,0x1c,0x2c,0xe4,0x93,0x70,0x1, 0x22,0x90,0x21, +0xd9,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x6f,0x67,0x80,0x4, 0x7e,0x83,0x6f,0x66, +0x12,0xb4,0xda,0xbe,0x34,0x0, 0x3f,0x38,0x1e,0x7e,0xe4,0x0, 0x3f,0x9d,0xe3,0x7e, +0x34,0x21,0xe4,0x12,0xb4,0xad,0x7f,0x71,0x12,0xb4,0x9c,0xbf,0x71,0x40,0x2, 0x7f, +0x71,0x9f,0x17,0x7f,0x71,0x80,0x78,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0xbd,0x53,0x38, +0x23,0x7d,0xe3,0x9d,0xe5,0x7e,0x34,0x21,0xe6,0x12,0xb4,0xad,0x7f,0x71,0x90,0x21, +0xe3,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b,0x7c,0x12,0xb4,0xa4, +0x2f,0x71,0x80,0x4b,0x7d,0x52,0x1b,0x54,0xbd,0x53,0x40,0x17,0x7d,0xf5,0x9d,0xf3, +0x6d,0xee,0x7e,0x34,0x21,0xe8,0x12,0xb4,0xc1,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f, +0x71,0x80,0x11,0x7d,0xf3,0x9d,0xf2,0x6d,0xee,0x7e,0x34,0x21,0xea,0x12,0xb4,0xc1, +0x6d,0x22,0x2f,0x71,0x12,0xb4,0x9c,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80, +0xe, 0x90,0x21,0xe3,0xe4,0x93,0x12,0xb4,0xa4,0xbf,0x71,0x28,0x2, 0x7f,0x71,0xbe, +0x78,0x2, 0xcf,0x28,0x4, 0x7e,0x78,0x2, 0xcf,0x7d,0x3f,0x22,0x90,0x21,0xe2,0xe4, +0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d,0x22,0x22,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d,0x2e,0x7c,0x76,0x7c,0x65, +0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x10,0x7f,0x17,0x12,0x22,0xb4,0x7f,0x71,0x7c, +0x76,0x7c,0x65,0xa, 0x24,0x7f,0x71,0x7d,0x3c,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b, +0x44,0x22,0x7e,0x14,0x21,0xec,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x22,0xca,0xd8, +0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd,0x7e,0xd3,0x6f,0x31,0x7e,0xe3, +0x6f,0x32,0x7e,0xb3,0x78,0xb1,0x60,0x11,0x7e,0xc7,0x78,0xba,0x4d,0xcc,0x78,0x2, +0xa1,0xde,0xbe,0xd0,0x1, 0x28,0x2, 0xa1,0xde,0xbe,0xd0,0x1, 0x78,0x1d,0xbe,0xb0, +0x4, 0x78,0x2, 0xa1,0xde,0x7e,0xe7,0x6e,0x23,0x7e,0xf7,0x6e,0x25,0x7d,0x3e,0x7d, +0x2f,0x12,0x7d,0xee,0xbe,0xb0,0x1, 0x78,0x2, 0xa1,0xde,0x7e,0xa3,0x78,0xb1,0x7c, +0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23,0x14,0x78,0x2, 0xa1,0xdb,0xb, +0xb2,0x68,0x2, 0xa1,0xde,0xbe,0xd0,0x1, 0x68,0x2, 0xa1,0xed,0x4c,0xee,0x68,0x2, +0xa1,0xed,0x74,0x1, 0x7a,0xb3,0x78,0xb1,0x12,0xb5,0xf4,0x80,0x61,0x4c,0xdd,0x78, +0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3,0x78,0xb1,0x7e,0x34,0x22,0x43, +0x80,0x50,0x74,0x4, 0x7a,0xb3,0x78,0xb1,0x7e,0x34,0x22,0x47,0x80,0x44,0x12,0xb5, +0xfd,0x90,0x22,0x36,0x12,0xb6,0x6, 0x68,0x45,0x80,0x52,0xbe,0xd0,0x1, 0x78,0x4d, +0x4c,0xee,0x78,0x49,0x12,0xb5,0xfd,0x7e,0x34,0x22,0x3f,0x12,0x2a,0xa9,0x7e,0x14, +0x22,0x43,0x12,0xb4,0xe6,0x9d,0xc3,0xbe,0xc7,0x78,0xba,0x40,0x21,0x90,0x22,0x35, +0x12,0xb6,0x6, 0x68,0x19,0x12,0xb5,0xf4,0x74,0x3, 0x7a,0xb3,0x78,0xb1,0x7e,0x34, +0x22,0x43,0x12,0x2a,0xa9,0x7a,0x37,0x78,0xba,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a, +0xb3,0x78,0xb1,0x6d,0x33,0x7a,0x37,0x78,0xba,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda, +0x79,0xda,0xd8,0x22,0x7a,0xe7,0x78,0xb2,0x7a,0xf7,0x78,0xb4,0x22,0x7a,0xe7,0x78, +0xb6,0x7a,0xf7,0x78,0xb8,0x22,0xe4,0x93,0xa, 0x3b,0x12,0xb6,0x12,0xa, 0xdb,0x4d, +0xdd,0x22,0x7d,0x23,0x12,0x44,0x40,0x7e,0x37,0x78,0xb6,0x7d,0x13,0x9e,0x17,0x78, +0xb2,0xbe,0x14,0x0, 0x0, 0x8, 0x6, 0x9e,0x37,0x78,0xb2,0x80,0x4, 0x6d,0x33,0x9d, +0x31,0xbd,0x32,0x38,0x21,0x7e,0x37,0x78,0xb8,0x7d,0x13,0x9e,0x17,0x78,0xb4,0xbe, +0x14,0x0, 0x0, 0x8, 0x6, 0x9e,0x37,0x78,0xb4,0x80,0x4, 0x6d,0x33,0x9d,0x31,0xbd, +0x32,0x38,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x28,0x7a, +0x35,0x2a,0x7e,0x53,0x6f,0x31,0x7a,0x51,0x41,0xbe,0x50,0x0, 0x28,0x1a,0x7e,0x27, +0x63,0x2f,0xb, 0x24,0x7a,0x27,0x63,0x2f,0xbe,0x24,0x0, 0x64,0x28,0xe, 0x7e,0x24, +0x0, 0x64,0x7a,0x27,0x63,0x2f,0x80,0x4, 0x7a,0x37,0x63,0x2f,0x7e,0xb3,0x76,0xe4, +0xb4,0x1, 0x4, 0x74,0x3, 0x80,0x7, 0x7e,0xb3,0x62,0xde,0x60,0x5, 0x14,0x7a,0xb3, +0x62,0xde,0x7e,0xb3,0x6f,0x38,0x60,0x3, 0x2, 0xbf,0xc, 0x7e,0x37,0x5a,0x42,0xbe, +0x37,0x78,0x98,0x28,0x12,0x7e,0x54,0xff,0xff,0x9e,0x57,0x5a,0x42,0x2e,0x57,0x78, +0x98,0xb, 0x54,0xf5,0x40,0x80,0xa, 0x7e,0x57,0x78,0x98,0x9e,0x57,0x5a,0x42,0xf5, +0x40,0x7e,0x37,0x78,0x98,0x7a,0x37,0x5a,0x42,0xc2,0x24,0x7e,0x34,0x6d,0xc9,0x7a, +0x35,0x2c,0xe5,0x41,0x60,0x6, 0x7e,0xb3,0x6f,0x32,0x70,0x39,0x6c,0xff,0x6c,0xaa, +0x80,0x2e,0xa, 0x4f,0x19,0xa4,0x62,0xca,0xe4,0x19,0xb4,0x62,0xd4,0x6d,0x33,0x7e, +0x50,0x2, 0xac,0x5f,0x59,0x32,0x63,0x7, 0x59,0x32,0x63,0x1b,0x7e,0x70,0xff,0x7e, +0x50,0x9, 0xac,0x5f,0x19,0x72,0x5d,0x9c,0x74,0x1, 0x19,0xb4,0x63,0x31,0xb, 0xf0, +0x12,0xbf,0xdc,0x38,0xcd,0xc2,0x22,0x7e,0xb3,0x5c,0xc3,0x60,0x6, 0x7e,0xb3,0x6f, +0x57,0x60,0x7, 0x12,0xc0,0x42,0x50,0x2, 0xd2,0x22,0x6c,0xff,0x2, 0xbd,0xed,0x7e, +0x70,0x9, 0xac,0x7f,0x9, 0xe3,0x6d,0xcd,0x5e,0xe0,0xf, 0x12,0xbf,0xf4,0x38,0x3, +0x2, 0xbd,0xeb,0x7e,0x90,0x9, 0xac,0x9e,0x9, 0xa4,0x6e,0xd7,0xbe,0xa0,0x1, 0x78, +0x3, 0x2, 0xbd,0xc8,0x7e,0x50,0x2, 0xac,0x5e,0x7d,0x2, 0x2e,0x4, 0x63,0x7, 0xb, +0x8, 0x10,0xb, 0x14,0x1b,0x8, 0x10,0x4c,0xaa,0x78,0x1a,0x49,0x43,0x6d,0xc9,0x74, +0x4, 0xac,0xbe,0x59,0x45,0x62,0xdf,0x49,0x33,0x6d,0xcb,0x59,0x35,0x62,0xe1,0x6d, +0x33,0x59,0x32,0x63,0x1b,0x6c,0xdd,0x2, 0xbd,0xbe,0x7e,0x10,0x9, 0xac,0x1d,0x9, +0xc0,0x5d,0x9c,0xbc,0xce,0x68,0x3, 0x2, 0xbd,0xbc,0x7e,0x70,0x73,0xac,0x7c,0x2e, +0x34,0x5e,0x4c,0x6d,0x22,0x7a,0x1d,0x34,0x12,0xe6,0x15,0x49,0x10,0x5d,0x98,0x49, +0x0, 0x5d,0x9a,0x12,0xbf,0x9a,0x7a,0x35,0x28,0x12,0xe6,0x15,0x74,0x4, 0xac,0xbc, +0x49,0x15,0x62,0xdf,0x49,0x5, 0x62,0xe1,0x12,0xbf,0x9a,0x7a,0x35,0x32,0x74,0x2, +0xac,0xbc,0x7d,0x35,0x2e,0x34,0x63,0x1b,0xb, 0x38,0x40,0x2e,0x45,0x28,0x1b,0x38, +0x40,0x49,0x45,0x63,0x1b,0xbe,0x44,0xf, 0xa0,0x28,0x8, 0x7e,0x34,0xf, 0xa0,0x59, +0x35,0x63,0x1b,0xe5,0x40,0x7a,0xb3,0x63,0xd0,0x12,0xbf,0x38,0x9, 0x73,0x0, 0x6, +0x7a,0x73,0x63,0xd2,0x7e,0x35,0x28,0x7a,0x37,0x63,0xd9,0x7e,0x35,0x32,0x7a,0x37, +0x63,0xdb,0x12,0xbf,0x38,0xb, 0x38,0x30,0x7a,0x37,0x63,0xdd,0x12,0xbf,0x38,0x49, +0x33,0x0, 0x2, 0x7a,0x37,0x63,0xdf,0x74,0x2, 0xac,0xbc,0x49,0x35,0x63,0x7, 0x7a, +0x37,0x63,0xe1,0x74,0x2, 0xac,0xbc,0x49,0x35,0x63,0x1b,0x7a,0x37,0x63,0xe5,0x74, +0x9, 0xac,0xbd,0x49,0x25,0x5d,0x98,0x7e,0x37,0x63,0xdd,0x9d,0x32,0x7a,0x37,0x63, +0xd5,0x74,0x9, 0xac,0xbd,0x49,0x25,0x5d,0x9a,0x7e,0x37,0x63,0xdf,0x9d,0x32,0x7a, +0x37,0x63,0xd7,0x12,0xbf,0x18,0xbe,0xa0,0x0, 0x28,0x1c,0x7e,0x34,0x0, 0x17,0xca, +0x39,0x12,0xbf,0x2f,0x2e,0x34,0xff,0xe9,0x7e,0x8, 0x63,0xe7,0x12,0x24,0x13,0x1b, +0xfd,0x7e,0x37,0x63,0xf0,0x80,0x9, 0x7e,0x8, 0x63,0xe7,0x12,0xbf,0x51,0x6d,0x33, +0x7a,0x35,0x2a,0x12,0xbf,0x18,0xbe,0xa0,0x2, 0x40,0x18,0x7e,0x34,0x0, 0x17,0xca, +0x39,0x12,0xbf,0x2f,0x2e,0x34,0xff,0xd2,0x7e,0x8, 0x63,0xfe,0x12,0x24,0x13,0x1b, +0xfd,0x80,0x7, 0x7e,0x8, 0x63,0xfe,0x12,0xbf,0x51,0x6d,0x33,0x7a,0x35,0x2e,0x75, +0x27,0x0, 0x80,0x12,0x7e,0xa1,0x27,0x12,0xbf,0x2f,0x69,0x31,0x0, 0x9, 0x2e,0x35, +0x2e,0x7a,0x35,0x2e,0x5, 0x27,0xa, 0x3c,0x9, 0x73,0x62,0xca,0xbe,0x71,0x27,0x38, +0xe3,0xbe,0x70,0x0, 0x28,0xa, 0xa, 0x27,0x7e,0x35,0x2e,0x8d,0x32,0x7a,0x35,0x2e, +0x7e,0x35,0x2e,0x7a,0x37,0x63,0xe3,0xc2,0x0, 0xc2,0x1, 0x12,0x9f,0xdf,0xa, 0x3c, +0x9, 0xb3,0x63,0x31,0x60,0x2, 0x41,0x48,0x7e,0x71,0x40,0x74,0x8, 0xac,0x7b,0x2e, +0x34,0x0, 0x14,0xbe,0x35,0x2a,0x50,0x7, 0xbe,0x35,0x28,0x50,0x2, 0xd2,0x24,0x7e, +0xa3,0x63,0xe7,0x74,0x5, 0xa4,0xbe,0x57,0x63,0xf0,0x50,0x19,0x7e,0xa3,0x63,0xfe, +0x74,0x5, 0xa4,0xbe,0x57,0x64,0x7, 0x50,0xc, 0x7e,0x37,0x63,0xfa,0xbe,0x34,0x0, +0x14,0x28,0x2, 0xd2,0x1, 0xa2,0x1, 0xe4,0x33,0x7a,0xb3,0x63,0xd3,0x7e,0x71,0x40, +0x74,0x1e,0xac,0x7b,0x2e,0x35,0x2a,0xbe,0x35,0x28,0x50,0x4, 0xd2,0x3, 0x80,0xe, +0x7e,0x35,0x2a,0x2e,0x34,0x0, 0x40,0xbe,0x35,0x28,0x50,0x2, 0xd2,0x4, 0x30,0x3, +0x6, 0xd2,0x2, 0x74,0x64,0x80,0x14,0x30,0x4, 0xf, 0x30,0x1, 0x6, 0xc2,0x2, 0x74, +0xa, 0x80,0x8, 0xd2,0x2, 0x74,0xc8,0x80,0x2, 0x74,0x14,0x7a,0xb3,0x63,0xd1,0x20, +0x2, 0x2, 0x41,0x34,0x7e,0x37,0x63,0xe3,0xbe,0x34,0x0, 0xa, 0x38,0x2, 0x41,0x34, +0x7e,0x37,0x63,0xfa,0xbe,0x34,0x0, 0xa, 0x28,0x7a,0x7e,0x37,0x64,0x11,0xbe,0x34, +0x0, 0xa, 0x28,0x70,0x7e,0x37,0x63,0xec,0x2e,0x37,0x63,0xf4,0x7a,0x35,0x3a,0xbe, +0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x7a,0x35,0x3a,0x7e,0x37,0x63,0xee,0x2e,0x37, +0x63,0xf6,0x12,0xa7,0xcd,0x58,0x5, 0x6d,0x33,0x7a,0x35,0x3c,0x12,0xbf,0x26,0x7e, +0x15,0x3a,0x7e,0x5, 0x3c,0x12,0xbf,0x9a,0x7a,0x35,0x3a,0x7e,0x37,0x63,0xfc,0xbe, +0x34,0xf, 0xa0,0x40,0xa, 0x7e,0x27,0x63,0xfa,0x7e,0x34,0x0, 0xf, 0x80,0x13,0x12, +0xbf,0x59,0x7e,0x27,0x63,0xfa,0x28,0x6, 0x7e,0x34,0x0, 0x9, 0x80,0x4, 0x7e,0x34, +0x0, 0x6, 0xad,0x32,0x7a,0x35,0x30,0xbe,0x35,0x3a,0x28,0x8, 0xc2,0x2, 0x74,0x28, +0x7a,0xb3,0x63,0xd1,0x30,0x22,0xc, 0xc2,0x2, 0xe4,0x12,0xbf,0x11,0x74,0x6e,0x7a, +0xb3,0x63,0xd1,0x12,0xbf,0x61,0x80,0x19,0xa, 0x3c,0x2e,0x34,0x63,0x31,0x12,0xe7, +0x28,0x12,0xbf,0x61,0x74,0x78,0x7a,0xb3,0x63,0xd1,0xd2,0x2, 0xe4,0x7a,0xb3,0x63, +0xd3,0xa2,0x2, 0xe4,0x33,0x7a,0xb3,0x63,0xd4,0xa, 0x3c,0x9, 0xa3,0x62,0xd4,0x4c, +0xaa,0x78,0x19,0x7e,0x35,0x3e,0xbe,0x35,0x28,0x40,0x2, 0x81,0xa3,0x20,0x2, 0x2, +0x81,0xa3,0x74,0x1, 0xa, 0x4c,0x19,0xb4,0x62,0xd4,0x81,0xa3,0xbe,0xa0,0x1, 0x68, +0x2, 0x81,0x85,0x7e,0x7, 0x64,0x11,0xbe,0x4, 0x0, 0x3, 0x50,0x30,0x7e,0x17,0x63, +0xf0,0xbe,0x14,0x0, 0x50,0x50,0x26,0x7e,0x17,0x63,0xe1,0xbe,0x14,0x0, 0x14,0x50, +0x1c,0x7e,0x17,0x64,0x9, 0xbe,0x14,0x0, 0x1e,0x50,0x12,0x7e,0x17,0x63,0xf2,0xbe, +0x14,0x0, 0x50,0x50,0x8, 0x7e,0x15,0x2a,0x7a,0x15,0x30,0x61,0xb6,0x7e,0x17,0x63, +0xe1,0xbe,0x14,0x0, 0xa, 0x50,0x13,0x7e,0x17,0x63,0xfa,0xbe,0x14,0x0, 0x8, 0x28, +0x9, 0x7e,0x73,0x63,0xd2,0xbe,0x70,0xf, 0x40,0x15,0x7e,0x17,0x63,0xfa,0xbe,0x14, +0x0, 0xf, 0x28,0x42,0xbe,0x4, 0x0, 0xf, 0x28,0x3c,0x12,0xbf,0x59,0x50,0x37,0x7e, +0xa3,0x63,0xe7,0xa, 0x2a,0x7e,0x35,0x2a,0x8d,0x32,0x7d,0x23,0x1e,0x24,0x12,0xbf, +0x45,0xbe,0x34,0x0, 0x78,0x28,0x7, 0x7e,0x4, 0x0, 0x78,0x7a,0x5, 0x30,0xbe,0xa0, +0xa, 0x38,0x2, 0x61,0xb6,0x7e,0x5, 0x30,0xbe,0x4, 0x0, 0x50,0x40,0x2, 0x61,0xb6, +0x7e,0x4, 0x0, 0x50,0x80,0x8, 0x7e,0xb3,0x64,0x1, 0x60,0x7, 0x6d,0x0, 0x7a,0x5, +0x30,0x80,0x73,0x7e,0x73,0x63,0xe7,0xa, 0x27,0x7e,0x37,0x63,0xf0,0x12,0xbf,0x41, +0x7e,0xa3,0x63,0xe9,0x74,0x2, 0xa4,0x7e,0x73,0x63,0xd2,0xa, 0x27,0xbd,0x25,0x8, +0x31,0xbe,0x14,0x0, 0x1e,0x50,0x2b,0x7e,0x63,0x64,0x0, 0xa, 0x6, 0x12,0xae,0xda, +0x8, 0x4, 0x9d,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0xbe,0x24,0x0, 0x5, 0x8, 0x12, +0x7e,0x25,0x30,0xbe,0x24,0x0, 0xc8,0x50,0x2d,0x7e,0x24,0x0, 0xc8,0x7a,0x25,0x30, +0x80,0x24,0xbe,0x70,0xf, 0x28,0xf, 0x7e,0x35,0x30,0xbe,0x34,0x0, 0xc8,0x28,0x16, +0x7e,0x34,0x0, 0xc8,0x80,0xd, 0x7e,0x35,0x30,0xbe,0x34,0x0, 0x78,0x28,0x7, 0x7e, +0x34,0x0, 0x78,0x7a,0x35,0x30,0x7e,0x35,0x30,0xbe,0x35,0x28,0x28,0x42,0xd2,0x0, +0x7e,0x37,0x63,0xe1,0xbe,0x34,0x0, 0x8, 0x50,0x11,0x12,0xbf,0x7b,0x28,0xc, 0x74, +0x2, 0xa, 0x2c,0x19,0xb2,0x62,0xd4,0xc2,0x0, 0x80,0x7b,0x7e,0x27,0x64,0x9, 0xbe, +0x24,0x0, 0x64,0x28,0x71,0x12,0xbf,0x7b,0x28,0x6c,0xbe,0x34,0x0, 0x14,0x50,0x66, +0x7e,0x73,0x63,0xd2,0xbe,0x70,0x14,0x50,0x5d,0x12,0xbf,0xf, 0xc2,0x0, 0x80,0x56, +0x7e,0x35,0x3e,0xbe,0x35,0x28,0x50,0x8, 0x30,0x2, 0x5, 0x74,0x3, 0x12,0xbf,0x11, +0x7e,0x37,0x63,0xe1,0xbe,0x34,0x0, 0x1e,0x50,0x3c,0x7e,0x73,0x5a,0x5b,0xbe,0x70, +0x2, 0x28,0x18,0x7e,0xb3,0x63,0xea,0x70,0x12,0x12,0xbf,0x72,0x50,0xd, 0x12,0xbf, +0x26,0x12,0xc7,0xd1,0x50,0x20,0x12,0xbf,0xf, 0x80,0x1b,0x12,0xbf,0x72,0x50,0x16, +0x7e,0x37,0x63,0xdb,0xbe,0x34,0x0, 0x1e,0x50,0xc, 0x7e,0x37,0x63,0x2f,0xbe,0x34, +0x0, 0x78,0x50,0x2, 0xd2,0x0, 0x12,0xbf,0x1f,0xb4,0x1, 0x1f,0x12,0xbf,0x26,0x7e, +0x17,0x64,0xb, 0x7e,0x7, 0x64,0xd, 0x12,0xbf,0x9a,0xbe,0x34,0x0, 0x3c,0x50,0x2f, +0xc2,0x0, 0xe4,0xa, 0x3c,0x19,0xb3,0x62,0xca,0x80,0x24,0x12,0xbf,0x1f,0xb4,0x3, +0x22,0x74,0x1, 0x80,0x1b,0x12,0xbf,0x1f,0xb4,0x2, 0x18,0x7e,0x73,0x63,0xfe,0xa, +0x27,0x7e,0x37,0x64,0x7, 0x12,0xbf,0x41,0xbe,0x35,0x28,0x28,0x2, 0xd2,0x0, 0xe4, +0x12,0xbf,0x11,0x7e,0xa1,0x40,0x74,0x64,0xa4,0x7a,0x55,0x38,0xbe,0x54,0x2, 0x80, +0x28,0xd, 0x7e,0xb3,0x62,0xde,0x70,0x7, 0x7e,0x34,0x2, 0x80,0x7a,0x35,0x38,0x7e, +0x35,0x38,0xbe,0x35,0x28,0x50,0xc, 0x7e,0x37,0x63,0xe1,0xbe,0x34,0x0, 0x2, 0x28, +0x2, 0xd2,0x0, 0x20,0x0, 0x2, 0xa1,0x56,0xe4,0x12,0xbf,0x11,0x12,0xbf,0x84,0x70, +0x8, 0x74,0x3, 0x19,0xb3,0x6e,0xd7,0x80,0x25,0x74,0x1, 0x19,0xb3,0x6e,0xd7,0x75, +0x27,0x0, 0x80,0x15,0x12,0xb3,0xa1,0x9, 0x53,0x6e,0x81,0xbc,0x5e,0x78,0x8, 0x74, +0xff,0x19,0xb3,0x6e,0x81,0x80,0x7, 0x5, 0x27,0x12,0xb3,0x6e,0x38,0xe6,0x7e,0xa0, +0x3, 0x7e,0x70,0x9, 0xac,0x7c,0x19,0xa3,0x6e,0xd8,0xe5,0x41,0xbe,0xb0,0x0, 0x28, +0x35,0x15,0x41,0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x6d,0xc9,0x7e,0x14,0x63,0x6d, +0x74,0x9, 0x12,0x23,0x44,0x7e,0x71,0x41,0x74,0x9, 0xac,0x7b,0x2e,0x34,0x6d,0xc9, +0x12,0xa7,0xdf,0x12,0xbf,0xe4,0x7e,0x31,0x41,0x74,0x9, 0xac,0x3b,0x2e,0x14,0x6d, +0xc9,0x12,0x23,0x44,0x1b,0xf0,0xa, 0x3c,0x9, 0xb3,0x62,0xca,0xb4,0x5, 0x3d,0x75, +0x27,0x0, 0x80,0x19,0x7e,0x34,0x0, 0x17,0xca,0x39,0x7e,0xa1,0x27,0x12,0xbf,0x69, +0x7f,0x10,0x2e,0x34,0x0, 0x17,0x12,0x24,0x13,0x1b,0xfd,0x5, 0x27,0xe5,0x27,0xbe, +0xb0,0x4, 0x40,0xe0,0x7e,0x34,0x0, 0x17,0xca,0x39,0x7e,0x18,0x63,0xd0,0x7e,0xd, +0x34,0x2e,0x14,0x0, 0x5c,0x12,0x24,0x13,0x1b,0xfd,0x80,0x4f,0x7e,0x34,0x0, 0x17, +0xca,0x39,0x12,0xbf,0x18,0x12,0xbf,0x69,0x7e,0x18,0x63,0xd0,0x12,0x24,0x13,0x1b, +0xfd,0xa, 0x3c,0x2e,0x34,0x62,0xca,0x12,0xbf,0xec,0x80,0x2f,0xb, 0xd0,0x12,0x94, +0xbd,0x28,0x3, 0x2, 0xb7,0x9a,0x80,0x23,0x12,0xbf,0x8e,0x6d,0x22,0x74,0x2, 0xac, +0xbe,0x59,0x25,0x63,0x7, 0x59,0x25,0x63,0x1b,0x7e,0xa0,0xff,0x7e,0x50,0x9, 0xac, +0x5e,0x19,0xa2,0x5d,0x9c,0x74,0x1, 0x19,0xb3,0x63,0x31,0xb, 0xf0,0xe5,0x41,0xbc, +0xbf,0x28,0x3, 0x2, 0xb7,0x3f,0x12,0x90,0xc9,0xca,0x59,0x7e,0x18,0x6d,0xc9,0x7e, +0x8, 0x63,0x76,0x12,0x24,0x13,0x1b,0xfd,0x6c,0xff,0xc1,0x94,0x74,0x9, 0xac,0xbf, +0x9, 0xe5,0x6d,0xcd,0xa, 0x3e,0x9, 0x73,0x62,0xd4,0xbe,0x70,0x0, 0x28,0x73,0x6c, +0xdd,0x80,0x6a,0xa, 0x4e,0x9, 0xa4,0x62,0xd4,0xbe,0xa0,0x1, 0x78,0x2e,0x7e,0x70, +0x9, 0xac,0x7d,0x9, 0xb3,0x5d,0x9c,0xbc,0xbe,0x78,0x50,0x49,0x33,0x5d,0x98,0x7e, +0x50,0x9, 0xac,0x5f,0x59,0x32,0x6d,0xc9,0x7e,0x70,0x9, 0xac,0x7d,0x49,0x33,0x5d, +0x9a,0x7e,0x50,0x9, 0xac,0x5f,0x59,0x32,0x6d,0xcb,0x80,0x36,0xbe,0xa0,0x2, 0x78, +0x2a,0x74,0x9, 0xac,0xbd,0x9, 0x75,0x5d,0xf6,0xbc,0x7e,0x78,0x1e,0x49,0x35,0x5d, +0xf2,0x74,0x9, 0xac,0xbf,0x59,0x35,0x6d,0xc9,0x74,0x9, 0xac,0xbd,0x49,0x35,0x5d, +0xf4,0x74,0x9, 0xac,0xbf,0x59,0x35,0x6d,0xcb,0x80,0x7, 0xb, 0xd0,0x12,0x94,0xbd, +0x38,0x91,0xb, 0xf0,0xe5,0x41,0xbc,0xbf,0x28,0x2, 0xc1,0xc, 0x12,0x90,0xc9,0xca, +0x59,0x7e,0x18,0x5d,0x98,0x7e,0x8, 0x5d,0xf2,0x12,0x24,0x13,0x1b,0xfd,0x12,0x90, +0xc9,0xca,0x59,0x7e,0x18,0x63,0x76,0x7e,0x8, 0x5d,0x98,0x12,0x24,0x13,0x1b,0xfd, +0x6c,0xff,0x80,0x38,0x7e,0x50,0x9, 0xac,0x5f,0x9, 0xe2,0x5d,0x9c,0x12,0xbf,0xf4, +0x28,0x28,0x12,0xbf,0x84,0xbe,0xb0,0x1, 0x68,0x3, 0xb4,0x3, 0x1d,0x12,0xbf,0x8e, +0x6d,0x11,0x74,0x2, 0xac,0xbe,0x59,0x15,0x63,0x7, 0x59,0x15,0x63,0x1b,0x74,0xff, +0x19,0xb2,0x5d,0x9c,0x74,0x1, 0x19,0xb3,0x63,0x31,0xb, 0xf0,0x12,0xbf,0xdc,0x38, +0xc3,0xe5,0x41,0x7a,0xb3,0x6f,0x31,0xe4,0x7a,0xb3,0x5c,0xc4,0xda,0x3b,0x22,0x74, +0x2, 0xa, 0x3c,0x19,0xb3,0x62,0xd4,0x22,0xa, 0x3c,0x9, 0xa3,0x62,0xca,0x22,0xa, +0x3c,0x9, 0xb3,0x62,0xd4,0x22,0x7e,0x37,0x63,0xdd,0x7e,0x27,0x63,0xdf,0x22,0x74, +0x17,0xa4,0x7e,0x1d,0x34,0x2d,0x35,0x22,0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x35,0x2c, +0x22,0x8d,0x32,0x7d,0x23,0x1e,0x24,0xe5,0x40,0xa, 0x3b,0xad,0x32,0x7a,0x35,0x30, +0x22,0x7e,0x34,0x0, 0x17,0xe4,0x2, 0x24,0x38,0x7e,0x73,0x63,0xd2,0xbe,0x70,0xa, +0x22,0x7e,0x34,0x0, 0x64,0x7a,0x35,0x3e,0x22,0x74,0x17,0xa4,0x7e,0xd, 0x34,0x2d, +0x15,0x22,0x7e,0x37,0x64,0x9, 0xbe,0x34,0x0, 0x1e,0x22,0x7e,0x27,0x63,0xd9,0xbe, +0x24,0x0, 0x14,0x22,0x7e,0x70,0x9, 0xac,0x7e,0x9, 0xb3,0x6e,0xd7,0x22,0xe4,0xa, +0x3e,0x19,0xb3,0x62,0xca,0x19,0xb3,0x62,0xd4,0x22,0xca,0x3b,0xbd,0x13,0x50,0x8, +0x7d,0x73,0x9d,0x71,0x6d,0x66,0x80,0x6, 0x7d,0x71,0x9d,0x73,0x6d,0x66,0xbd,0x2, +0x50,0x8, 0x7d,0x92,0x9d,0x90,0x6d,0x88,0x80,0x6, 0x7d,0x90,0x9d,0x92,0x6d,0x88, +0x7f,0x13,0x7f,0x3, 0x12,0x22,0xa3,0x7f,0x31,0x7f,0x14,0x7f,0x4, 0x12,0x22,0xa3, +0x7f,0x41,0x7f,0x13,0x2f,0x14,0x12,0xc7,0x59,0xda,0x3b,0x22,0x90,0x21,0x51,0xe4, +0x93,0xbc,0xbf,0x22,0x12,0x23,0x44,0x7e,0x34,0x63,0x6d,0x22,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0x22,0x90,0x21,0x51,0xe4,0x93,0xbc,0xbe,0x22,0x7e,0x8, 0x59,0xd4, +0x7e,0x34,0x0, 0xa, 0x74,0x3, 0x12,0x24,0x38,0x7e,0x8, 0x5a,0x38,0x7e,0x34,0x0, +0xa, 0xe4,0x2, 0x24,0x38,0x7e,0xa3,0x6f,0x32,0xbe,0xa0,0x0, 0x38,0x23,0xbe,0xa3, +0x6f,0x31,0x50,0x18,0x7e,0xb3,0x6f,0x3b,0xbe,0xb3,0x5c,0xdb,0x28,0x13,0x7e,0xb3, +0x5c,0xdb,0x4, 0x7a,0xb3,0x5c,0xdb,0x7a,0xa3,0x6f,0x31,0x22,0xe4,0x7a,0xb3,0x5c, +0xdb,0x22,0x7e,0x73,0x6f,0x32,0xbe,0x73,0x6f,0x31,0x78,0x7d,0x7e,0xb3,0x6f,0x31, +0xb4,0x1, 0x76,0x7e,0xb3,0x5d,0x91,0xbe,0xb0,0x2, 0x38,0x13,0x4, 0x7a,0xb3,0x5d, +0x91,0x7e,0x37,0x6d,0xc9,0x7a,0x37,0x5d,0x94,0x7e,0x37,0x6d,0xcb,0x80,0x69,0x7e, +0x37,0x5d,0x92,0xbe,0x34,0x6, 0xa4,0x50,0x4e,0x7e,0x27,0x6d,0xc9,0x7d,0x12,0x9e, +0x17,0x5d,0x94,0xbe,0x14,0x0, 0x0, 0x8, 0x8, 0x7d,0x32,0x9e,0x37,0x5d,0x94,0x80, +0x4, 0x6d,0x33,0x9d,0x31,0x2e,0x37,0x5d,0x92,0x7a,0x37,0x5d,0x92,0x7e,0x37,0x6d, +0xcb,0x7d,0x3, 0x9e,0x7, 0x5d,0x96,0xbe,0x4, 0x0, 0x0, 0x8, 0x8, 0x7d,0x13,0x9e, +0x17,0x5d,0x96,0x80,0x4, 0x6d,0x11,0x9d,0x10,0x2e,0x17,0x5d,0x92,0x7a,0x17,0x5d, +0x92,0x7a,0x27,0x5d,0x94,0x80,0x11,0xd3,0x22,0xe4,0x7a,0xb3,0x5d,0x91,0x6d,0x33, +0x7a,0x37,0x5d,0x92,0x7a,0x37,0x5d,0x94,0x7a,0x37,0x5d,0x96,0xc3,0x22,0xca,0x79, +0x7e,0xb3,0x6f,0x31,0x7e,0x18,0x6e,0xd7,0x70,0x11,0x12,0xbf,0xfc,0x7e,0x8, 0x63, +0x63,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x24,0x38,0x41,0xdf,0x6c,0xaa,0x41,0xd8,0x7e, +0xf0,0x9, 0xac,0xfa,0x9, 0x37,0x6e,0x27,0xc2,0x0, 0xc2,0x1, 0x49,0xe7,0x6e,0x23, +0x4d,0xee,0x68,0x11,0x7e,0xd4,0x21,0xde,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0xf0,0x1b, +0xf4,0xbd,0xef,0x78,0x2, 0xd2,0x0, 0x49,0xf7,0x6e,0x25,0x4d,0xff,0x68,0xd, 0x7e, +0xd4,0x21,0xec,0x12,0xc2,0xf6,0x1b,0x4, 0xbd,0xf0,0x78,0x2, 0xd2,0x1, 0xbe,0x30, +0xff,0x78,0x2, 0x41,0xd6,0x7e,0x10,0x9, 0xac,0x13,0x7f,0x61,0x2d,0xd0,0x7e,0x6b, +0xb0,0xb4,0x2, 0x2, 0x80,0x2, 0x41,0xa9,0x7e,0x10,0x4, 0xac,0x13,0x49,0xd0,0x63, +0x3b,0x7d,0xce,0x9d,0xcd,0xbe,0xc4,0x0, 0x0, 0x8, 0x6, 0x7d,0x4e,0x9d,0x4d,0x80, +0x4, 0x6d,0x44,0x9d,0x4c,0x49,0xb0,0x63,0x3d,0x7d,0xcf,0x9d,0xcb,0xbe,0xc4,0x0, +0x0, 0x8, 0x6, 0x7d,0xf, 0x9d,0xb, 0x80,0x4, 0x6d,0x0, 0x9d,0xc, 0x7e,0x23,0x6f, +0x31,0xbe,0x20,0x8, 0x40,0x8, 0x74,0xf, 0xa, 0xca,0x19,0xbc,0x59,0xd4,0xa, 0xca, +0x9, 0xbc,0x63,0x63,0x70,0xe, 0x7d,0xc0,0x2d,0xc4,0xbe,0xc4,0x0, 0x4, 0x50,0x4, +0x6d,0x0, 0x7d,0x40,0xa, 0xca,0x9, 0x2c,0x59,0xd4,0xa, 0xc2,0xbd,0xc4,0x28,0x52, +0xbd,0xc0,0x28,0x4e,0x20,0x0, 0x3, 0x12,0xc2,0xec,0x20,0x1, 0x12,0x7e,0xf0,0x4, +0xac,0xf3,0x49,0xb7,0x63,0x3d,0x7e,0xf0,0x9, 0xac,0xfa,0x59,0xb7,0x6e,0x25,0xa, +0xba,0x2e,0xb4,0x5a,0x38,0x7e,0xb9,0xb0,0x4, 0x7a,0xb9,0xb0,0xa, 0xba,0x9, 0xbb, +0x5a,0x38,0xbe,0xb0,0x32,0x50,0x2, 0x41,0xd6,0xa, 0xba,0x9, 0xbb,0x59,0xd4,0xbe, +0xb0,0x8, 0x40,0x2, 0x41,0xd6,0xa, 0xba,0x2e,0xb4,0x59,0xd4,0x4, 0x7a,0xb9,0xb0, +0x41,0xd6,0xbd,0xc4,0x28,0x56,0xbd,0xc0,0x28,0x52,0x20,0x0, 0x4f,0x20,0x1, 0x4c, +0x7e,0xb3,0x78,0xc9,0x70,0x46,0x12,0xc2,0xec,0x7e,0xf0,0x4, 0xac,0xf3,0x49,0xd7, +0x63,0x3d,0x7e,0xf0,0x9, 0xac,0xfa,0x59,0xd7,0x6e,0x25,0xa, 0xda,0x2e,0xd4,0x5a, +0x38,0x7e,0xd9,0xb0,0x4, 0x7a,0xd9,0xb0,0xa, 0xda,0x9, 0xbd,0x5a,0x38,0xbe,0xb0, +0x32,0x50,0x2, 0x41,0xd6,0xa, 0xda,0x9, 0xbd,0x59,0xd4,0xbe,0xb0,0x8, 0x50,0x76, +0xa, 0xda,0x2e,0xd4,0x59,0xd4,0x4, 0x7a,0xd9,0xb0,0x80,0x6a,0x74,0x1, 0xa, 0xda, +0x19,0xbd,0x63,0x63,0x12,0xc2,0xe2,0x7e,0xf0,0x4, 0xac,0xf3,0x59,0xf7,0x63,0x3d, +0xbe,0x20,0x8, 0x40,0xa, 0x74,0x1, 0xa, 0xda,0x19,0xbd,0x59,0xd4,0x80,0x11,0xbe, +0x20,0x1, 0x28,0xc, 0xa, 0xda,0x2e,0xd4,0x59,0xd4,0x7c,0xb2,0x14,0x7a,0xd9,0xb0, +0xe4,0xa, 0xda,0x19,0xbd,0x5a,0x38,0x80,0x2d,0x7e,0xf0,0x9, 0xac,0xf3,0x7f,0x61, +0x2d,0xd7,0x7e,0x6b,0xb0,0x70,0x9, 0x12,0xc2,0xe2,0x59,0xf7,0x63,0x3d,0x80,0x16, +0x7e,0xf0,0x9, 0xac,0xf3,0x7f,0x71,0x2d,0xf7,0x7e,0x7b,0xb0,0xb4,0x1, 0x7, 0xe4, +0xa, 0xfa,0x19,0xbf,0x63,0x63,0xb, 0xa0,0x12,0x45,0x1f,0x28,0x2, 0x1, 0xff,0xda, +0x79,0x22,0x7e,0xf0,0x4, 0xac,0xf3,0x59,0xe7,0x63,0x3b,0x22,0x7e,0xf0,0x9, 0xac, +0xfa,0x59,0xd7,0x6e,0x23,0x22,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x0, 0x22,0x6c,0x77, +0x7e,0xa0,0xff,0x7e,0x78,0xff,0xff,0x6d,0x44,0x6c,0x66,0x7e,0x14,0x0, 0x1, 0x7c, +0xb6,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x7e,0xb3,0x75,0x30,0xa, 0x2b,0x5d,0x21, +0xbe,0x24,0x0, 0x0, 0x8, 0xd, 0x7e,0x24,0xff,0xff,0x7e,0x30,0x26,0xac,0x36,0x59, +0x21,0x75,0x39,0x12,0xc3,0x97,0x6d,0x0, 0xbf,0x7, 0x50,0x8, 0x7f,0x70,0x49,0x42, +0x75,0x3b,0x7c,0x76,0xb, 0x60,0xa5,0xbe,0x3, 0xc1,0x7e,0x63,0x75,0x33,0xbc,0x67, +0x68,0x42,0x12,0xc3,0x97,0x7d,0xc1,0x1e,0xc4,0x1e,0xc4,0x7e,0xd4,0x0, 0x3, 0xad, +0xdc,0x6d,0xcc,0xbf,0x76,0x50,0xb, 0x7e,0xd4,0x22,0x2c,0x12,0xc2,0xf6,0xbd,0x4, +0x38,0x20,0x1e,0x14,0x6d,0x0, 0xbf,0x70,0x50,0x1a,0x7e,0x50,0x26,0xac,0x56,0x49, +0x12,0x75,0x3b,0x7e,0xf4,0x22,0x2c,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x12, +0x28,0x2, 0x7c,0xa7,0x7c,0xba,0x22,0x7e,0x50,0x26,0xac,0x56,0x49,0x12,0x75,0x39, +0x22,0x7c,0xa7,0x7c,0x3b,0x7e,0xb3,0x77,0xf, 0xbe,0xb0,0x1, 0x78,0x2, 0x81,0x99, +0xe5,0x1e,0x70,0x2, 0x81,0x99,0x7e,0xb3,0x73,0xd3,0x70,0x2, 0x81,0x99,0x12,0xc6, +0xef,0x7c,0xb3,0x7c,0x7a,0x12,0xc4,0x9a,0x12,0xc7,0x26,0x7e,0xb3,0x75,0x36,0x1b, +0xb1,0x68,0x20,0x4, 0x68,0x2, 0x81,0x99,0x7e,0x73,0x75,0x33,0x7a,0x73,0x75,0x34, +0xe4,0x7a,0xb3,0x75,0x35,0x6c,0xaa,0x12,0xc7,0x3, 0xbe,0xa0,0x3, 0x78,0xf8,0x74, +0x2, 0x81,0x95,0x7e,0x43,0x75,0x34,0x7e,0x50,0x26,0xac,0x45,0x7d,0x32,0x2e,0x34, +0x75,0x38,0x12,0xbf,0xec,0x9, 0x72,0x75,0x38,0xbe,0x70,0x2, 0x50,0x2, 0x81,0x99, +0xe4,0x19,0xb2,0x75,0x38,0x49,0x12,0x75,0x39,0x2e,0x17,0x75,0xb1,0xbe,0x14,0x7f, +0xff,0x50,0xb, 0x7d,0x32,0x2e,0x34,0x75,0x39,0x1b,0x38,0x10,0x80,0x8, 0x7e,0x34, +0x7f,0xff,0x59,0x32,0x75,0x39,0x49,0x32,0x75,0x3b,0xbe,0x37,0x75,0xb1,0x50,0x8, +0x7e,0x37,0x75,0xb1,0x59,0x32,0x75,0x3b,0x7e,0x37,0x75,0xb5,0x12,0xc5,0x95,0xa, +0x4b,0x7e,0xa3,0x75,0x34,0x7e,0x50,0x26,0xac,0x5a,0x2e,0x24,0x75,0x3d,0xb, 0x28, +0x30,0x2d,0x34,0x1b,0x28,0x30,0xbe,0xa0,0x2, 0x50,0x5, 0x7c,0xba,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x75,0x34,0x12,0xc5,0xb6,0x38,0x1f,0x12,0xc2,0xfe,0xbe,0xb0,0xff, +0x68,0x12,0x30,0x19,0xf, 0x7e,0x73,0x75,0x33,0x12,0x37,0x76,0x12,0x3b,0xdc,0xe4, +0x7a,0xb3,0x75,0xa9,0xe4,0x7a,0xb3,0x75,0x36,0x22,0x6c,0x44,0xc2,0x1, 0x7e,0x47, +0x75,0xb5,0x7e,0x7, 0x75,0xb7,0x12,0x58,0x1, 0x40,0x4, 0xd2,0x1, 0x80,0x6, 0xa5, +0xbf,0x1, 0x2, 0xd2,0x1, 0x7e,0xb3,0x75,0x36,0x60,0x2, 0xa1,0x49,0x7e,0xb3,0x75, +0xbe,0x4, 0x7a,0xb3,0x75,0xbe,0x7d,0x34,0x12,0xc5,0x95,0xbe,0xb0,0x1, 0x40,0x8, +0x4e,0x40,0x4, 0xe4,0x7a,0xb3,0x75,0xbe,0xbe,0x44,0x0, 0x0, 0x28,0x10,0x7e,0x17, +0x75,0x31,0xbd,0x10,0x50,0x8, 0x4e,0x40,0x2, 0xe4,0x7a,0xb3,0x75,0xbe,0x7e,0x17, +0x75,0x31,0xbd,0x10,0x50,0x17,0x7e,0xb3,0x75,0xbd,0x4, 0x7a,0xb3,0x75,0xbd,0xbe, +0x4, 0xb, 0xb8,0x28,0x16,0x7e,0xb3,0x75,0xbd,0xb, 0xb2,0x80,0xa, 0x7e,0xb3,0x75, +0xbd,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a,0xb3,0x75,0xbd,0x7e,0x53,0x75,0xbd,0xbe, +0x50,0xa, 0x40,0x11,0xe4,0x7a,0xb3,0x75,0xbd,0x7a,0x43,0x75,0xa9,0x74,0x1, 0x7a, +0xb3,0x75,0x36,0x80,0x14,0x7e,0x73,0x75,0xbe,0xbe,0x70,0x20,0x40,0xb, 0x74,0x20, +0x7a,0xb3,0x75,0xbe,0xe4,0x7a,0xb3,0x75,0xa9,0x7d,0x34,0x7d,0x20,0x2, 0xc5,0x50, +0x7d,0x2, 0x12,0xc5,0x95,0x7c,0x7b,0xbe,0x70,0x1, 0x40,0x1d,0x7e,0x34,0x22,0x32, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x0, 0xa, 0xad,0x32,0x1e,0x34,0xbd, +0x30,0x38,0x6, 0x74,0x1, 0x7a,0xb3,0x75,0xbc,0x7e,0xb3,0x75,0xbc,0xbe,0xb0,0x0, +0x28,0xa, 0x14,0x7a,0xb3,0x75,0xbc,0xe4,0x7a,0xb3,0x25,0xae,0x30,0x18,0x3, 0xd2, +0x1a,0x22,0xc2,0x1a,0x22,0x6c,0xaa,0x6c,0x55,0x7e,0x14,0x0, 0x1, 0x7c,0xb5,0x60, +0x5, 0x3e,0x14,0x14,0x78,0xfb,0x5d,0x13,0x68,0x2, 0xb, 0xa0,0xb, 0x50,0xbe,0x50, +0x10,0x40,0xe6,0x7c,0xba,0x22,0x90,0x22,0x34,0xe4,0x93,0xbe,0xb3,0x75,0x35,0x22, +0x12,0xc6,0x33,0xc2,0x18,0x7e,0xb3,0x75,0x36,0x60,0x67,0x12,0x57,0xfd,0x40,0x10, +0x7e,0xa3,0x75,0x34,0x74,0x26,0xa4,0x9, 0x75,0x75,0x38,0xbe,0x70,0x1, 0x40,0x52, +0x7e,0x73,0x75,0x34,0xb, 0x70,0xbe,0x70,0x3, 0x40,0x2, 0x6c,0x77,0x7e,0x14,0x0, +0x1, 0x7c,0xb7,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x7e,0x63,0x75,0x30,0xa, 0x26, +0x5d,0x21,0xbe,0x24,0x0, 0x0, 0x8, 0x9, 0xb, 0x70,0xbe,0x70,0x3, 0x40,0x2, 0x6c, +0x77,0x7e,0x63,0x75,0x33,0xbc,0x67,0x78,0x9, 0x7e,0xb3,0x75,0x35,0x4, 0x7a,0xb3, +0x75,0x35,0x12,0xc5,0xb6,0x7e,0xb3,0x78,0x97,0x38,0x4, 0x7c,0x76,0x80,0x0, 0x2, +0x36,0xc3,0x22,0x7e,0x27,0x75,0xb7,0x7e,0x37,0x75,0x31,0xbd,0x32,0x50,0x20,0x7e, +0xa3,0x75,0x34,0x12,0xc6,0x9c,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xb9,0x4e, +0xb3,0x75,0x30,0x7a,0xb3,0x75,0x30,0x74,0x5, 0xa, 0x3a,0x19,0xb3,0x75,0xaa,0x6c, +0xaa,0xa, 0x3a,0x9, 0xb3,0x75,0xaa,0xbe,0xb0,0x0, 0x28,0xa, 0xa, 0x4a,0x2e,0x44, +0x75,0xaa,0x14,0x7a,0x49,0xb0,0xa, 0x3a,0x9, 0xb3,0x75,0xaa,0x70,0x16,0x12,0xc6, +0x9c,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xb9,0x64,0xff,0x5e,0xb3,0x75,0x30, +0x7a,0xb3,0x75,0x30,0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xc6,0x22,0x7e,0x44,0x0, 0x1, +0x7c,0xba,0x22,0x7c,0xab,0x6c,0x77,0x7e,0x63,0x75,0xbb,0xbc,0x67,0x78,0x4, 0x6c, +0x66,0x80,0x27,0x12,0xc6,0x9c,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x63,0x73, +0xd4,0xa, 0x26,0x5d,0x24,0x68,0x6, 0x7e,0x60,0x1, 0x12,0xc6,0xe5,0x7e,0x63,0x73, +0xd5,0xa, 0x26,0x5d,0x24,0x68,0x6, 0x7e,0x60,0x1, 0x12,0xc6,0xe5,0xb, 0x70,0xbe, +0x70,0x3, 0x40,0xc3,0x22,0x7e,0x50,0x26,0xac,0x57,0x19,0x62,0x75,0x44,0x22,0x7e, +0x34,0x22,0x32,0x12,0x2a,0xa9,0x7a,0x37,0x75,0x31,0x7e,0x34,0x5, 0xdc,0x7a,0x37, +0x75,0xad,0x22,0x6d,0x33,0x7e,0x90,0x26,0xac,0x9a,0x59,0x34,0x75,0x39,0x59,0x34, +0x75,0x3b,0x59,0x34,0x75,0x3d,0x59,0x34,0x75,0x3f,0x59,0x34,0x75,0x41,0xe4,0x19, +0xb4,0x75,0x38,0xb, 0xa0,0x22,0xc2,0x17,0xd2,0x19,0x7e,0x37,0x75,0xad,0xbe,0x37, +0x75,0xb7,0x50,0x2, 0xd2,0x17,0x30,0x24,0x4, 0x74,0x64,0x80,0x7, 0x7e,0xb3,0x75, +0xaf,0x60,0x5, 0x14,0x7a,0xb3,0x75,0xaf,0x30,0x17,0x5, 0xe4,0x7a,0xb3,0x75,0xaf, +0x7e,0xb3,0x75,0xaf,0x60,0x2, 0xc2,0x19,0x22,0x7f,0x61,0xbe,0x68,0x0, 0x6, 0x50, +0x15,0xbe,0x68,0x0, 0x2, 0x50,0x3, 0x7f,0x16,0x22,0x7f,0x16,0x1e,0x34,0x1e,0x24, +0x50,0x3, 0x4e,0x60,0x80,0x22,0x7f,0x76,0xe4,0x80,0xe, 0x7f,0x17,0x1e,0x34,0xe, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x4, 0xbe,0x78,0x0, 0x1, 0x18,0xec,0x1e, +0xb0,0x60,0x5, 0x2f,0x77,0x14,0x78,0xfb,0x7f,0x17,0x2f,0x17,0x2f,0x17,0x1e,0x34, +0xe, 0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x7f,0x57,0x7f,0x16,0x7f,0x7, 0x12, +0x22,0xbf,0x2f,0x17,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x7d, +0x2b,0x7d,0x3f,0x9d,0x32,0x12,0x24,0x5a,0xbe,0x34,0x0, 0x1, 0x18,0xdb,0x7f,0x17, +0x22,0x6c,0xaa,0x6c,0x33,0x80,0x4e,0x7e,0x90,0x4, 0xac,0x93,0x7e,0x10,0x28,0xac, +0x1a,0x7d,0xe0,0x2d,0xe4,0x49,0xe, 0x5a,0x6b,0x7d,0xf3,0x9d,0xf0,0xbe,0xf4,0x0, +0x0, 0x8, 0x6, 0x7d,0x43,0x9d,0x40,0x80,0x4, 0x6d,0x44,0x9d,0x4f,0x49,0xde,0x5a, +0x6d,0x7d,0xf2,0x9d,0xfd,0xbe,0xf4,0x0, 0x0, 0x8, 0x6, 0x7d,0x2, 0x9d,0xd, 0x80, +0x4, 0x6d,0x0, 0x9d,0xf, 0xbe,0x44,0x0, 0x50,0x50,0x8, 0xbe,0x4, 0x0, 0x50,0x50, +0x2, 0xd3,0x22,0xb, 0x30,0xa, 0xfa,0x9, 0x2f,0x5a,0x5c,0xbc,0x23,0x38,0xa8,0xb, +0xa0,0xbe,0xa0,0xf, 0x40,0x9d,0xc3,0x22,0x12,0x73,0x78,0x74,0x2, 0xac,0x7b,0x7e, +0x8, 0x5c,0xc5,0xe4,0x12,0x24,0x38,0x90,0x21,0x51,0x93,0x7c,0x7b,0x74,0x2, 0xac, +0x7b,0x7e,0x8, 0x5a,0x44,0xe4,0x2, 0x24,0x38,0x7e,0xb3,0x5c,0xc4,0xbe,0xb0,0xfa, +0x50,0x5, 0x4, 0x7a,0xb3,0x5c,0xc4,0x22,0x74,0x1, 0x7a,0xb3,0x6d,0xc8,0x7e,0xb3, +0x6d,0xb4,0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x12,0x7a,0xd, 0x28,0x5, 0xe4, +0x7a,0xb3,0x6d,0xc8,0x7e,0xb3,0x25,0xae,0x70,0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x7e, +0xb3,0x78,0xd6,0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x7e,0x34,0x22,0x32,0x12, +0x2a,0xa9,0xbe,0x37,0x75,0xb7,0x50,0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x7e,0xb3,0x77, +0xf, 0x70,0xa, 0x12,0x6f,0xb7,0x28,0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x7e,0xb3,0x76, +0xe4,0xb4,0x1, 0x17,0x7e,0x73,0x78,0xea,0xbe,0x70,0x3c,0x50,0xe, 0xbe,0x70,0x0, +0x28,0x9, 0xe5,0x1e,0x60,0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x22,0x12,0xca,0x42,0x12, +0xca,0x4c,0x12,0xc8,0xef,0x2, 0xc8,0xe8,0x74,0x1, 0x7a,0xb3,0x78,0xfc,0x22,0xca, +0x3b,0x7e,0xf3,0x6f,0x65,0x7e,0xe3,0x6f,0x66,0x7e,0xd3,0x6f,0x67,0x6d,0x88,0x6c, +0xcc,0x80,0x15,0x7d,0x18,0x3e,0x14,0x2e,0x14,0x4, 0x0, 0x6d,0x0, 0x7c,0xbd,0x12, +0xc9,0x1f,0xa, 0x9f,0x2d,0x89,0xb, 0xc0,0xbc,0xec,0x38,0xe7,0xda,0x3b,0x22,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x0, 0x75,0x27,0x0, 0x9f,0x55,0x6d,0x11,0x7d,0xd1, +0x7d,0xc1,0x7d,0x91,0x7e,0x4, 0x7f,0xff,0x6c,0xee,0x80,0x26,0x74,0x2, 0xac,0xbe, +0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x12,0x24,0x5a,0x7d,0xc3,0xbd,0xdc,0x58,0x2, +0x7d,0xdc,0xbd,0xc, 0x8, 0x2, 0x7d,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xe0,0xbc,0xfe,0x38,0xd6,0xbe,0xd4,0x0, 0x1e,0x58,0xa, 0x7e,0xb3,0x6d,0xa9, +0x70,0x4, 0x6d,0x33,0x41,0x35,0xbe,0xd4,0x4, 0xb0,0x8, 0x2, 0xd2,0x0, 0xbe,0xd4, +0x4, 0xb0,0x8, 0x11,0x7e,0xd4,0x0, 0xa0,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0x38,0x7e, +0xd4,0x2, 0x58,0x80,0x32,0xbe,0xd4,0x3, 0x20,0x8, 0x11,0x7e,0xd4,0x0, 0x96,0x7e, +0xb3,0x77,0xf, 0xb4,0x1, 0x21,0x7e,0xd4,0x2, 0x26,0x80,0x1b,0xbe,0xd4,0x0, 0x0, +0x8, 0x11,0x7e,0xd4,0x0, 0x8c,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0xa, 0x7e,0xd4,0x1, +0xc2,0x80,0x4, 0x6d,0x33,0x80,0x6e,0xbd,0xd, 0x8, 0x5, 0x30,0x0, 0x2, 0x7d,0xd0, +0xa, 0x1f,0x12,0xca,0x38,0x9f,0x55,0x7f,0x27,0x6c,0xee,0x80,0x1c,0xb, 0x2a,0x90, +0xb, 0x55,0x7d,0x39,0x12,0x24,0x5a,0x7d,0xc3,0xbd,0x1c,0x8, 0xa, 0x7d,0x39,0x1a, +0x26,0x1a,0x24,0x2f,0x51,0x5, 0x27,0xb, 0xe0,0xbc,0xfe,0x38,0xe0,0x6d,0x11,0xe5, +0x27,0xbe,0xb0,0x0, 0x28,0x7, 0xe5,0x27,0xa, 0x1b,0x12,0xca,0x38,0xbd,0x1d,0x8, +0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, 0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c, +0xee,0x80,0xc, 0xb, 0x7a,0x0, 0x9d,0x1, 0x1b,0x7a,0x0, 0xb, 0xf5,0xb, 0xe0,0xbc, +0xfe,0x38,0xf0,0x7d,0x31,0xda,0x79,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x23,0x10,0x7d, +0x13,0x22,0xe4,0x7a,0xb3,0x6d,0xc0,0x7a,0xb3,0x6d,0xc1,0x22,0x7e,0x8, 0x8, 0xc, +0x7e,0x1f,0x24,0x68,0x12,0x5a,0x55,0x7e,0x37,0x73,0xd6,0x7e,0x50,0x4, 0x7d,0x3, +0x3e,0x4, 0x7e,0x2f,0x24,0x68,0x2d,0x50,0xb, 0x2a,0x10,0x59,0x10,0x8, 0xc, 0xb, +0x34,0x1b,0x50,0x78,0xe9,0x22,0xca,0x79,0x7e,0x73,0x6f,0x31,0x4c,0x77,0x68,0x5, +0xbe,0x70,0x1, 0x28,0xb, 0x12,0xcc,0x87,0x74,0x1e,0x7a,0xb3,0x78,0x85,0x81,0x7c, +0x7e,0xb3,0x78,0x69,0x70,0x4a,0x7e,0xb3,0x6f,0x32,0x70,0x44,0xa5,0xbf,0x1, 0x40, +0x7e,0x57,0x6e,0x25,0xbe,0x54,0x5, 0x50,0x28,0x36,0xbe,0x54,0x5, 0xa0,0x50,0x30, +0x7e,0xc7,0x6e,0x23,0xbe,0xc4,0x0, 0x50,0x28,0x26,0xbe,0xc4,0x2, 0x76,0x50,0x20, +0x7a,0xc7,0x78,0x7c,0x7a,0x57,0x78,0x7e,0x7e,0xc7,0x78,0x7c,0x7a,0xc7,0x78,0x6a, +0x7a,0x57,0x78,0x6c,0x74,0x1, 0x7a,0xb3,0x78,0x69,0x74,0x1e,0x7a,0xb3,0x78,0x85, +0x7e,0xa3,0x78,0x69,0xbe,0xa0,0x1, 0x68,0x2, 0x61,0x7a,0x7e,0xb3,0x6f,0x32,0xb4, +0x1, 0x2, 0x80,0x2, 0x61,0x7a,0xa5,0xbf,0x1, 0x2, 0x80,0x2, 0x61,0x7a,0x12,0xcc, +0x90,0x28,0x77,0xbe,0xc4,0x5, 0xa0,0x50,0x71,0x7e,0xf7,0x6e,0x23,0x7a,0xf7,0x78, +0x7c,0x7a,0xc7,0x78,0x7e,0x7e,0xf7,0x78,0x7c,0x9e,0xf7,0x78,0x6a,0x7d,0x4c,0x9e, +0x47,0x78,0x6c,0xbe,0xf4,0x0, 0x0, 0x8, 0x6, 0x7d,0xcf,0x7d,0xdc,0x80,0x4, 0x6d, +0xdd,0x9d,0xdf,0xbe,0x44,0x0, 0x0, 0x8, 0x6, 0x7d,0xc4,0x7d,0xec,0x80,0x4, 0x6d, +0xee,0x9d,0xe4,0xbe,0xd4,0x0, 0x64,0x58,0x2e,0xbe,0xe4,0x0, 0x64,0x58,0x28,0x7d, +0xce,0x2d,0xcd,0xbe,0xc4,0x0, 0x96,0x58,0x1e,0x7d,0xcf,0xe, 0xc4,0xe, 0xc4,0x2e, +0xc7,0x78,0x6a,0x7a,0xc7,0x6e,0x23,0x7d,0xc4,0xe, 0xc4,0xe, 0xc4,0x2e,0xc7,0x78, +0x6c,0x7a,0xc7,0x6e,0x25,0x80,0x3, 0x75,0x6c,0x1, 0xe5,0x6c,0xbe,0xb0,0x1, 0x68, +0xe, 0x12,0xcc,0x90,0x28,0x2, 0x81,0x6c,0xbe,0xa0,0x1, 0x68,0x2, 0x81,0x6c,0x75, +0x6c,0x1, 0xbe,0xa0,0x1, 0x78,0x6, 0x74,0x1d,0x7a,0xb3,0x78,0x85,0xe4,0x7a,0xb3, +0x78,0x69,0x7e,0x37,0x6e,0x23,0x7d,0xf3,0x9e,0xf7,0x78,0x73,0x7e,0x47,0x6e,0x25, +0x9e,0x47,0x78,0x75,0xbe,0xf4,0x0, 0x0, 0x8, 0x6, 0x7d,0x2f,0x7d,0xd2,0x80,0x4, +0x6d,0xdd,0x9d,0xdf,0xbe,0x44,0x0, 0x0, 0x8, 0x6, 0x7d,0x24,0x7d,0xe2,0x80,0x4, +0x6d,0xee,0x9d,0xe4,0x7e,0xf3,0x78,0x85,0x7c,0x1f,0x2e,0x10,0x4e,0xa5,0xe7,0x7c, +0xeb,0xa, 0x9e,0x6d,0x88,0x7e,0x8, 0x0, 0x40,0x9f,0x4, 0x6d,0x22,0x12,0x22,0xa3, +0x7f,0x51,0x7e,0x37,0x78,0x73,0x6d,0x22,0x7f,0x4, 0x12,0xcc,0x7f,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x53,0x7a,0x57,0x6e,0x23,0xa, +0x3e,0x6d,0x22,0x7e,0x8, 0x0, 0x40,0x9f,0x1, 0x7e,0x37,0x6e,0x25,0x12,0x22,0xa3, +0x7f,0x51,0xa, 0x1e,0x6d,0x0, 0x7e,0x37,0x78,0x75,0x6d,0x22,0x12,0xcc,0x7f,0x1e, +0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x53,0x7a,0x57,0x6e, +0x25,0xbe,0xf0,0x0, 0x28,0x1f,0xbe,0xd4,0x0, 0x2, 0x18,0x10,0xbe,0xe4,0x0, 0x2, +0x18,0xa, 0x7d,0x5e,0x2d,0x5d,0xbe,0x54,0x0, 0x4, 0x8, 0x9, 0x7c,0xbf,0x14,0x7a, +0xb3,0x78,0x85,0x80,0x7, 0x4c,0xff,0x78,0x3, 0x12,0xcc,0x87,0x7e,0x57,0x6e,0x23, +0x7a,0x57,0x78,0x73,0x7e,0x57,0x6e,0x25,0x7a,0x57,0x78,0x75,0xda,0x79,0x22,0x12, +0x22,0xa3,0x2f,0x15,0x74,0x6, 0x22,0xe4,0x7a,0xb3,0x78,0x69,0x75,0x6c,0x0, 0x22, +0x7e,0xc7,0x6e,0x25,0xbe,0xc4,0x5, 0x50,0x22,0x6d,0x33,0x7a,0x37,0x78,0xdb,0xe4, +0x7a,0xb3,0x78,0xd9,0x7a,0xb3,0x78,0xda,0x7a,0xb3,0x78,0xd6,0x2, 0x6f,0xd0,0x7e, +0x63,0x6f,0x65,0x7e,0x73,0x6f,0x64,0xac,0x76,0x7d,0x13,0x1e,0x14,0x7e,0x27,0x6d, +0x97,0x2e,0x27,0x6d,0x95,0xbd,0x21,0x38,0x16,0x1e,0x34,0x1e,0x34,0x7d,0x23,0x2e, +0x24,0x0, 0x14,0xbe,0x27,0x6d,0x95,0x40,0x6, 0xbe,0x37,0x6d,0x97,0x50,0x2, 0xd3, +0x22,0xc3,0x22,0xe4,0x7a,0xb3,0x6d,0xb5,0x7a,0xb3,0x6d,0xb8,0x12,0xce,0x6, 0x7a, +0xb3,0x6d,0xb9,0x7a,0xb3,0x6d,0xba,0x7e,0x73,0x6d,0x94,0xbe,0x70,0x0, 0x28,0x2e, +0x12,0xce,0xf, 0x8, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xb5,0x7e,0x7, 0x6f,0x4a,0x7d, +0x30,0x12,0xcd,0xfa,0x8, 0x3, 0x12,0xcd,0xf3,0x7d,0x30,0x3e,0x34,0x3e,0x34,0x7d, +0x21,0x12,0xcd,0xfe,0x8, 0x8, 0xd2,0x2e,0x6d,0x33,0x7a,0x37,0x76,0xba,0x7e,0x37, +0x6d,0xa3,0xbe,0x34,0x1, 0xf4,0x8, 0x2d,0x30,0x2d,0x2a,0x30,0x2e,0x1b,0x12,0xcd, +0xf3,0x7e,0x37,0x76,0xba,0xb, 0x34,0x7a,0x37,0x76,0xba,0xbe,0x34,0x0, 0x5, 0x28, +0x8, 0xc2,0x2e,0x6d,0x33,0x7a,0x37,0x76,0xba,0x12,0xce,0x61,0xbe,0x34,0x0, 0x64, +0x28,0x3, 0x12,0xcd,0xf3,0x7e,0xa3,0x6d,0x94,0xbe,0xa0,0x0, 0x28,0x42,0x12,0xce, +0xf, 0x8, 0x1a,0x7e,0x73,0x25,0xaf,0xa5,0xbf,0x0, 0x8, 0x74,0x1, 0x7a,0xb3,0x6d, +0xb6,0x80,0xa, 0xa5,0xbf,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xb7,0x7e,0x37,0x6f, +0x4a,0x12,0xcd,0xfa,0x8, 0x1a,0x7e,0x73,0x25,0xaf,0xa5,0xbf,0x0, 0x8, 0x74,0x1, +0x7a,0xb3,0x6d,0xb9,0x80,0xa, 0xa5,0xbf,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xba, +0x7e,0xb3,0x6d,0xb5,0xbe,0xb0,0x1, 0x68,0x10,0x7e,0xb3,0x6d,0xb6,0xbe,0xb0,0x1, +0x68,0x7, 0x7e,0xb3,0x6d,0xb7,0xb4,0x1, 0x24,0xbe,0xa0,0x0, 0x28,0x1f,0xbe,0xa0, +0x3, 0x50,0x1a,0x7e,0xb3,0x6d,0x93,0xb4,0x1, 0x13,0x90,0x21,0xfa,0xe4,0x93,0xbe, +0xb3,0x6c,0x9, 0x68,0x8, 0xe4,0x7a,0xb3,0x6d,0xb5,0x12,0xce,0x6, 0xe4,0x7a,0xb3, +0x6d,0xbb,0x22,0x74,0x1, 0x7a,0xb3,0x6d,0xb8,0x22,0xad,0x31,0x7d,0x24,0x12,0x22, +0x71,0xbe,0x37,0x6d,0xa3,0x22,0x7a,0xb3,0x6d,0xb6,0x7a,0xb3,0x6d,0xb7,0x22,0x7e, +0x37,0x6f,0x44,0x7e,0x14,0x0, 0x6, 0xad,0x31,0x7e,0x44,0x0, 0x4, 0x7d,0x24,0x12, +0x22,0x71,0xbe,0x37,0x6d,0x9d,0x22,0x12,0x9f,0x9a,0x12,0xcc,0xe3,0x12,0xce,0x57, +0x2, 0xce,0x33,0x7e,0x27,0x73,0xd6,0x1e,0x24,0x1e,0x24,0xe4,0x7a,0xb3,0x6d,0xbf, +0x7e,0x37,0x6d,0x95,0xbd,0x32,0x38,0x8, 0x7e,0x37,0x6d,0x97,0xbd,0x32,0x28,0x6, +0x74,0x1, 0x7a,0xb3,0x6d,0xbf,0x22,0xe4,0x7a,0xb3,0x6d,0xbc,0x7a,0xb3,0x6d,0xbc, +0x22,0x6d,0x22,0x7d,0x32,0x80,0x12,0x7d,0x52,0x12,0x5b,0x26,0xb, 0xa, 0x10,0xbe, +0x14,0xff,0xb0,0x58,0x2, 0xb, 0x34,0xb, 0x24,0x7e,0x17,0x73,0xd6,0xbd,0x12,0x38, +0xe6,0x22,0x7e,0x37,0x6d,0x97,0x2e,0x37,0x6d,0x95,0xbe,0x37,0x6d,0xae,0x28,0x2, +0xd3,0x22,0xc3,0x22,0xca,0xd8,0xca,0x79,0x7d,0x43,0x7f,0x70,0x12,0x6f,0xb7,0x28, +0x33,0x6c,0xff,0x80,0x2a,0x74,0x2, 0xac,0xbf,0x9, 0xe5,0x6c,0x9, 0x9, 0xd5,0x6c, +0xa, 0x7c,0xbe,0x7c,0x7d,0x12,0x9b,0x6a,0x7d,0xd3,0x7f,0x7, 0x7c,0x7d,0x12,0xce, +0xda,0x50,0x7, 0xbd,0x4d,0x58,0x6, 0xd3,0x80,0xb, 0xd3,0x80,0x8, 0xb, 0xf0,0x12, +0x6f,0x11,0x38,0xd1,0xc3,0xda,0x79,0xda,0xd8,0x22,0x7c,0x67,0x7e,0xb, 0x70,0xbc, +0x7b,0x38,0x1a,0x29,0x70,0x0, 0x2, 0xbc,0x7b,0x28,0x12,0x29,0x70,0x0, 0x1, 0xbc, +0x76,0x38,0xa, 0x29,0x70,0x0, 0x3, 0xbc,0x76,0x28,0x2, 0xd3,0x22,0xc3,0x22,0xca, +0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x80,0x78,0x19,0x7e,0xe0,0xff,0x6c,0xff,0x12, +0xcf,0x5b,0xbc,0x7e,0x38,0x4, 0x7c,0xe7,0x7c,0xdf,0xb, 0xf0,0xbe,0xf0,0x3, 0x78, +0xee,0x80,0x1b,0xbe,0xd0,0x81,0x78,0x16,0x6c,0xee,0x6c,0xff,0x12,0xcf,0x5b,0xbc, +0x7e,0x40,0x4, 0x7c,0xe7,0x7c,0xdf,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xee,0xbe,0xd0, +0x3, 0x40,0x2, 0x6c,0xdd,0x7e,0x73,0x75,0x33,0xbc,0x7d,0x68,0x5, 0x7c,0xbd,0x12, +0x37,0x76,0x7a,0xd3,0x77,0x3b,0xda,0x79,0xda,0xd8,0x22,0x74,0x26,0xac,0xbf,0x9, +0x75,0x75,0x37,0x22,0x7c,0xab,0x7e,0x50,0xa, 0xac,0x57,0x9, 0x62,0x29,0x8c,0x7e, +0x50,0x27,0xac,0x57,0x49,0x2, 0x28,0xee,0xb, 0x4, 0x7e,0x50,0x8, 0xac,0x5a,0x49, +0x22,0x0, 0xe7,0x7a,0x27,0x75,0xb5,0x7e,0x50,0x8, 0xac,0x5a,0x49,0x22,0x0, 0xe5, +0x7a,0x27,0x75,0xb3,0x7e,0x50,0x8, 0xac,0x5a,0x9, 0xb2,0x0, 0xeb,0x7a,0xb3,0x75, +0xb9,0x7e,0x50,0x8, 0xac,0x5a,0x9, 0xb2,0x0, 0xec,0x7a,0xb3,0x75,0xba,0x74,0x8, +0xa4,0x49,0x15,0x0, 0xe9,0x7c,0xb6,0x60,0x5, 0x1e,0x4, 0x14,0x78,0xfb,0x8d,0x10, +0x7a,0x17,0x75,0xb7,0x74,0x27,0xac,0xb7,0x9, 0x75,0x28,0xe8,0x7a,0x73,0x75,0xb0, +0x22,0x7e,0xb3,0x75,0xa9,0x22,0x7c,0xab,0x6c,0x77,0x7e,0x50,0x26,0xac,0x57,0x9, +0x62,0x75,0x37,0xbc,0x6a,0x68,0x7, 0xb, 0x70,0xbe,0x70,0x3, 0x40,0xec,0xa5,0xbf, +0x3, 0x6, 0x7a,0xa3,0x75,0x37,0xd3,0x22,0xc3,0x22,0xca,0xf8,0x7c,0xab,0xc2,0x2, +0x12,0x3e,0xb8,0xac,0x67,0x9, 0xf3,0x75,0x37,0x7c,0xba,0x12,0x75,0x8c,0x6c,0xaa, +0x6c,0x77,0x7e,0x50,0x26,0xac,0x57,0x19,0xa2,0x75,0x43,0xb, 0x70,0xa5,0xbf,0x3, +0xf1,0x30,0x2, 0x5, 0x7c,0xbf,0x12,0x34,0x9, 0xd3,0xda,0xf8,0x22,0x7e,0x34,0x6b, +0x8b,0x1e,0x34,0x3e,0x34,0x7a,0x17,0x6b,0xcb,0x7a,0x37,0x6b,0xcf,0x7e,0x34,0x24, +0xbc,0x7a,0x37,0x6b,0xcd,0x7e,0x73,0x6f,0x64,0x7a,0x73,0x6b,0xc8,0x7e,0x73,0x6f, +0x65,0x7a,0x73,0x6b,0xc7,0x7e,0x37,0x6f,0x42,0x7a,0x37,0x6b,0xd1,0x7e,0x37,0x6f, +0x44,0x7a,0x37,0x6b,0xd3,0x7e,0x37,0x6f,0x4c,0x7a,0x37,0x6b,0xd5,0x7e,0x37,0x6f, +0x4e,0x7a,0x37,0x6b,0xd7,0x74,0x1, 0x7a,0xb3,0x6b,0xc9,0x7a,0xb3,0x6b,0xca,0x7e, +0x8, 0x6b,0xc7,0x7e,0x18,0x6b,0xd9,0x12,0x3, 0x1d,0x7e,0x37,0x6b,0xe5,0x7a,0x37, +0x6f,0x60,0x7e,0x27,0x6b,0xdf,0xbe,0x24,0x0, 0x0, 0x8, 0x6, 0x7e,0x7, 0x6b,0xdf, +0x80,0x6, 0x6d,0x0, 0x9e,0x7, 0x6b,0xdf,0x7e,0x37,0x6b,0xe3,0xbe,0x34,0x0, 0x0, +0x8, 0x6, 0x7e,0x17,0x6b,0xe3,0x80,0x6, 0x6d,0x11,0x9e,0x17,0x6b,0xe3,0xbd,0x10, +0x8, 0x12,0xbe,0x34,0x0, 0x0, 0x8, 0x5, 0x7e,0x37,0x6b,0xe3,0x22,0x6d,0x33,0x9e, +0x37,0x6b,0xe3,0x22,0xbe,0x24,0x0, 0x0, 0x8, 0x6, 0x7e,0x37,0x6b,0xdf,0x80,0x6, +0x6d,0x33,0x9e,0x37,0x6b,0xdf,0x22,0x7c,0x16,0x7c,0x7, 0x7c,0x9b,0x7e,0xb3,0x6f, +0x66,0xf5,0x2a,0x7e,0xb3,0x6f,0x67,0xf5,0x2b,0x9f,0x77,0xa, 0x31,0xa, 0x19,0x9d, +0x13,0x7c,0x83,0x80,0x7d,0x7a,0x81,0x28,0xbe,0x80,0x0, 0x58,0xc, 0x1a,0x58,0x1a, +0x19,0x9d,0x15,0xa, 0x59,0x2d,0x51,0xf5,0x28,0xe5,0x2a,0xbc,0xb8,0x18,0xc, 0x1a, +0x59,0x1a,0x18,0x9d,0x15,0xa, 0x59,0x9d,0x51,0xf5,0x28,0xa, 0x11,0xa, 0x50,0x9d, +0x51,0xf5,0x27,0x80,0x3d,0x85,0x27,0x29,0xe5,0x27,0xbe,0xb0,0x0, 0x58,0xe, 0xe5, +0x27,0x1a,0x5b,0x1a,0x10,0x9d,0x15,0xa, 0x50,0x2d,0x51,0xf5,0x29,0xe5,0x2b,0xbe, +0xb1,0x27,0x18,0xe, 0x1a,0x30,0xe5,0x27,0x1a,0x1b,0x9d,0x13,0xa, 0x50,0x9d,0x51, +0xf5,0x29,0xe5,0x28,0x7e,0x71,0x29,0x12,0x9b,0x6a,0x1a,0x26,0x1a,0x24,0x2f,0x71, +0x5, 0x27,0xa, 0x21,0xa, 0x30,0x2d,0x32,0xe5,0x27,0x1a,0x1b,0xbd,0x13,0x8, 0xb5, +0xb, 0x80,0xa, 0x11,0xa, 0x59,0x2d,0x51,0x1a,0x18,0xbd,0x15,0x18,0x2, 0x21,0x5, +0x7f,0x17,0x22,0x7c,0x67,0x7c,0x7b,0x7e,0x50,0x2, 0xac,0x57,0x9, 0xa2,0x6c,0x9, +0x9, 0x72,0x6c,0xa, 0x90,0x21,0xfa,0xe4,0x93,0xbc,0xba,0x78,0x3, 0x9f,0x11,0x22, +0x7c,0xba,0x2, 0xd0,0xe7,0x7e,0xb3,0x78,0xb0,0xb4,0x1, 0x3, 0x2, 0xd1,0xc0,0x22, +0xca,0x3b,0x7e,0xb3,0x6d,0x93,0xf5,0x27,0x6c,0xcc,0x41,0x80,0x74,0x2, 0xac,0xbc, +0x9, 0xf5,0x6c,0x9, 0x9, 0xe5,0x6c,0xa, 0x7e,0x73,0x6f,0x64,0xbc,0x7f,0x78,0x2, +0x41,0x7e,0x12,0xd3,0x39,0x7d,0xd3,0x12,0xd3,0x59,0x78,0x2, 0x6d,0xee,0x12,0xd3, +0x23,0x78,0x2, 0x6d,0xff,0x4c,0xee,0x78,0x2, 0x6d,0x0, 0x12,0xd3,0x1b,0x78,0x2, +0x6d,0x11,0xbe,0xe4,0x0, 0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0xf4,0x0, 0x46,0x8, 0x2, +0xb, 0xd0,0xbe,0x4, 0x0, 0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0x14,0x0, 0x46,0x8, 0x2, +0xb, 0xd0,0xbe,0xd0,0x2, 0x40,0x4, 0xd2,0x0, 0x80,0x2e,0x4c,0xff,0x68,0x16,0x7e, +0xb3,0x6f,0x66,0x14,0xbc,0xbf,0x68,0xd, 0x4c,0xee,0x68,0x9, 0x7e,0xb3,0x6f,0x67, +0x14,0xbc,0xbe,0x78,0x14,0xbe,0xd4,0x1, 0x2c,0x8, 0xe, 0xbe,0xd0,0x0, 0x28,0x9, +0x7e,0xb3,0x78,0xb0,0xb4,0x1, 0x2, 0xd2,0x0, 0x20,0x0, 0x22,0x7d,0xc3,0x7e,0xb3, +0x78,0xb0,0xb4,0x3, 0x4, 0x7d,0x5c,0x80,0xb, 0x7e,0xb3,0x78,0xb0,0xb4,0x1, 0xb, +0x7d,0x5c,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x12,0xd3,0x2b,0x12,0x6f,0xb0,0xb, 0xc0, +0xe5,0x27,0xbc,0xbc,0x28,0x2, 0x21,0xcc,0x7e,0xb3,0x78,0xb0,0xb4,0x3, 0x2, 0x80, +0x2, 0x61,0x18,0x7e,0xb3,0x6d,0x94,0xf5,0x27,0x6c,0xcc,0x80,0x75,0x74,0x2, 0xac, +0xbc,0x9, 0xf5,0x6c,0x45,0x9, 0xe5,0x6c,0x46,0x7e,0x73,0x6f,0x64,0xbc,0x7f,0x68, +0x5f,0x12,0xd3,0x39,0x12,0xd3,0x59,0x78,0x2, 0x6d,0xee,0x12,0xd3,0x23,0x78,0x2, +0x6d,0xff,0x4c,0xee,0x78,0x2, 0x6d,0x0, 0x12,0xd3,0x1b,0x78,0x2, 0x6d,0x11,0xbe, +0xe4,0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe,0xf4,0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe, +0x4, 0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe,0x14,0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe, +0xd0,0x2, 0x40,0x2, 0xd2,0x0, 0x20,0x0, 0x17,0x12,0x24,0x5a,0x7d,0xc3,0x7d,0x5c, +0xe, 0x54,0xe, 0x54,0x6e,0x54,0xff,0xff,0xb, 0x54,0x12,0xd3,0x2b,0x12,0x6f,0xb0, +0xb, 0xc0,0xe5,0x27,0xbc,0xbc,0x38,0x85,0xda,0x3b,0x22,0x7e,0xb3,0x6f,0x65,0x14, +0xbc,0xbe,0x22,0x7e,0xb3,0x6f,0x64,0x14,0xbc,0xbf,0x22,0x7d,0xb4,0x3e,0xb4,0x7e, +0x1f,0x24,0x68,0x2d,0x3b,0x1b,0x1a,0x50,0x22,0x6c,0xdd,0xc2,0x0, 0x7e,0x33,0x6f, +0x65,0x7c,0x9f,0xac,0x93,0xa, 0x5e,0x2d,0x45,0x7d,0x24,0x3e,0x24,0x7e,0x5f,0x24, +0x68,0x7f,0x75,0x2d,0xf2,0xb, 0x7a,0x30,0x22,0xa, 0x53,0x7d,0x14,0x9d,0x15,0x3e, +0x14,0x2d,0x1b,0x7d,0xa, 0xb, 0xa, 0xe0,0x2d,0x54,0x3e,0x54,0x7f,0x5, 0x2d,0x15, +0xb, 0xa, 0xf0,0x7d,0x54,0x1b,0x54,0x3e,0x54,0x7f,0x5, 0x2d,0x15,0xb, 0xa, 0x0, +0x2d,0xb2,0x69,0x15,0x0, 0x2, 0x4c,0xff,0x22,0x7e,0xb3,0x78,0xb0,0xb4,0x3, 0x3, +0x2, 0xd1,0xc0,0x22,0x7e,0xb3,0x6d,0x93,0x70,0x2b,0x7e,0xb3,0x6f,0x31,0x70,0x25, +0x6c,0xaa,0x7e,0x70,0xff,0x7e,0x90,0x4, 0xac,0x9a,0x19,0x74,0x28,0xb7,0xe4,0x19, +0xb4,0x28,0xb8,0x74,0x3, 0x19,0xb4,0x28,0xb9,0xe4,0x19,0xb4,0x28,0xba,0xb, 0xa0, +0xbe,0xa0,0xa, 0x78,0xdd,0x22,0xca,0x79,0x7f,0x70,0x7e,0x3, 0x6f,0x65,0x7e,0x93, +0x6d,0x93,0x7e,0x6f,0x24,0x68,0x6c,0x11,0x6c,0x88,0x6c,0xff,0x80,0xd, 0xa, 0x1f, +0x12,0xd4,0x8a,0xbc,0x78,0x40,0x2, 0x7c,0x87,0xb, 0xf0,0xbc,0x9f,0x38,0xef,0x7e, +0xf0,0x1, 0x81,0x77,0x75,0x29,0x0, 0x6d,0xbb,0x6d,0x99,0x7d,0xa9,0x6c,0xee,0x80, +0x3a,0x7e,0x30,0x2, 0xac,0x3e,0x9, 0xb1,0x6c,0x9, 0xf5,0x27,0x9, 0xb1,0x6c,0xa, +0xf5,0x28,0xa, 0x1e,0x12,0xd4,0x8a,0xbc,0x7f,0x78,0x1e,0x5, 0x29,0xe5,0x27,0xa, +0x1b,0x2d,0xa1,0xe5,0x28,0xa, 0x1b,0x2d,0x91,0xe5,0x27,0x7e,0x71,0x28,0x12,0x9b, +0x6a,0x7d,0x83,0xbd,0xb8,0x58,0x2, 0x7d,0xb8,0xb, 0xe0,0xbc,0x9e,0x38,0xc2,0xe5, +0x29,0xbe,0xb0,0x0, 0x28,0x2f,0xe5,0x29,0xa, 0x8b,0x7d,0x3a,0x8d,0x38,0x7d,0xa3, +0x8d,0x98,0x12,0xd4,0x82,0x19,0xa1,0x75,0xc2,0x7d,0x39,0x12,0xd4,0x82,0x19,0xa1, +0x75,0xc3,0xa, 0x30,0xad,0x3a,0x7d,0x13,0x2d,0x19,0x3e,0x14,0x7f,0x16,0x2d,0x31, +0x1b,0x1a,0xb0,0xb, 0x10,0xb, 0xf0,0xbc,0x8f,0x40,0x2, 0x61,0xf4,0x7c,0xb1,0xda, +0x79,0x22,0x7c,0xa7,0x7e,0x30,0x2, 0xac,0x31,0x22,0x7f,0x17,0x2d,0x31,0x7e,0x1b, +0x70,0x22,0xca,0x3b,0x7c,0x45,0x7c,0x57,0x7c,0x7b,0x75,0x44,0x0, 0x7e,0xe0,0xff, +0xc2,0x5, 0x7e,0xf4,0x7f,0xff,0xbc,0x67,0x28,0x4, 0x7c,0xd7,0x80,0x2, 0x7c,0xd6, +0xbc,0x67,0x50,0x4, 0x7c,0xa7,0x80,0x2, 0x7c,0xa6,0xbc,0x45,0x28,0x4, 0x7c,0xc5, +0x80,0x2, 0x7c,0xc4,0xbc,0x45,0x50,0x4, 0x7c,0xb5,0x80,0x2, 0x7c,0xb4,0xf5,0x45, +0x7a,0xd1,0x46,0x7a,0xc1,0x47,0x7a,0xa1,0x48,0x85,0x45,0x49,0xd2,0x5, 0xbe,0x51, +0x47,0x78,0xa, 0xe5,0x46,0xbc,0xb7,0x50,0xc, 0xc2,0x5, 0x80,0x8, 0xe5,0x46,0xbc, +0xb6,0x50,0x2, 0xc2,0x5, 0x30,0x5, 0x2, 0xa1,0xfa,0x7c,0xda,0xa1,0xfa,0x7e,0x8, +0x63,0x6d,0x7e,0x34,0x0, 0xc, 0x74,0xff,0x12,0x24,0x38,0x30,0x5, 0x6f,0x12,0xd6, +0x48,0xbd,0x23,0x18,0x3, 0x12,0xd6,0x78,0xa, 0xd, 0xb, 0x4, 0xe5,0x48,0xa, 0x1b, +0xbd,0x1, 0x18,0x7, 0xa, 0x5d,0xb, 0x54,0x12,0xd6,0x3f,0xbd,0x1, 0x18,0xb, 0xbd, +0x23,0x18,0x7, 0xa, 0x3d,0xb, 0x34,0x12,0xd6,0x6b,0x7e,0xe4,0x80,0x1, 0x6c,0xff, +0x12,0xd6,0x5e,0x68,0xe, 0x12,0xd6,0x2f,0x68,0x9, 0x12,0xd6,0x85,0x8, 0x4, 0x7d, +0xe3,0x7c,0xef,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xe6,0x12,0xd6,0x51,0x78,0x7, 0x12, +0xd6,0x37,0x78,0x2, 0xc1,0x8, 0xe5,0x49,0xbe,0xb1,0x47,0x78,0x7, 0x12,0xd6,0x37, +0x78,0x2, 0xc1,0x8, 0xbe,0xe0,0xff,0x78,0x2, 0xa1,0xfa,0x80,0x67,0x12,0xd6,0x48, +0xbd,0x23,0x18,0x3, 0x12,0xd6,0x78,0xa, 0xd, 0x1b,0x4, 0xe5,0x46,0xa, 0x1b,0xbd, +0x1, 0x48,0x7, 0xa, 0x5d,0x1b,0x54,0x12,0xd6,0x3f,0xbd,0x1, 0x48,0xb, 0xbd,0x23, +0x18,0x7, 0xa, 0x3d,0x1b,0x34,0x12,0xd6,0x6b,0x7e,0xe4,0x80,0x1, 0x6c,0xff,0x12, +0xd6,0x5e,0x68,0xe, 0x12,0xd6,0x2f,0x68,0x9, 0x12,0xd6,0x85,0x8, 0x4, 0x7d,0xe3, +0x7c,0xef,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xe6,0x12,0xd6,0x51,0x78,0x5, 0x12,0xd6, +0x27,0x68,0x35,0xe5,0x49,0xbe,0xb1,0x47,0x78,0x5, 0x12,0xd6,0x27,0x68,0x29,0xbe, +0xe0,0xff,0x68,0x16,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x59,0xe3,0x76,0x1f,0x9, +0xd4,0x63,0x6d,0x7c,0xca,0x5, 0x44,0x7e,0xe0,0xff,0xe5,0x45,0xa, 0x2b,0xb, 0x24, +0xa, 0x3c,0xbd,0x32,0x68,0x2, 0x81,0xfe,0x6c,0xff,0x80,0x10,0x74,0x2, 0xac,0xbf, +0x49,0xe5,0x76,0x1f,0xbd,0xef,0x58,0x2, 0x7d,0xfe,0xb, 0xf0,0xe5,0x44,0xbc,0xbf, +0x38,0xea,0x7d,0x3f,0xda,0x3b,0x22,0x9, 0xb4,0x63,0x6d,0xbe,0xb1,0x46,0x22,0x9, +0x72,0x63,0x6e,0xbe,0x70,0xff,0x22,0x9, 0xb4,0x63,0x6d,0xbe,0xb1,0x48,0x22,0x7a, +0xb3,0x63,0x71,0x7a,0xc3,0x63,0x72,0x22,0xa, 0x2c,0xb, 0x24,0xe5,0x49,0xa, 0x3b, +0x22,0x7e,0x90,0x4, 0xac,0x9e,0x9, 0xa4,0x63,0x6e,0xbe,0xa1,0x49,0x22,0x7e,0x50, +0x4, 0xac,0x5f,0x9, 0xb2,0x63,0x6d,0xbe,0xb0,0xff,0x22,0x7a,0x73,0x63,0x75,0xa, +0x3c,0xb, 0x34,0x7a,0x73,0x63,0x76,0x22,0x7a,0xd3,0x63,0x6d,0xa, 0x1c,0xb, 0x14, +0x7a,0x33,0x63,0x6e,0x22,0x12,0x9b,0x6a,0x74,0x4, 0xac,0xbf,0x59,0x35,0x63,0x6f, +0xbd,0x3e,0x22,0xca,0x3b,0x75,0x29,0xff,0x6c,0xff,0x7e,0xc0,0xff,0x6c,0xee,0x6c, +0x99,0x6c,0x88,0x7e,0xf4,0x7f,0xff,0x6c,0xdd,0x80,0x68,0x7e,0x70,0x2, 0xac,0x7d, +0x9, 0xb3,0x6c,0x9, 0xf5,0x27,0x9, 0x73,0x6c,0xa, 0x7a,0x71,0x28,0x12,0x9b,0x6a, +0x7d,0x3, 0xbd,0xf, 0x58,0x2, 0x7d,0xf0,0xe5,0x27,0xbe,0xb1,0x29,0x50,0x3, 0x85, +0x27,0x29,0xe5,0x27,0xbc,0xbf,0x28,0x3, 0x7e,0xf1,0x27,0xe5,0x28,0xbc,0xbc,0x50, +0x3, 0x7e,0xc1,0x28,0xe5,0x28,0xbc,0xbe,0x28,0x3, 0x7e,0xe1,0x28,0xe5,0x29,0xa, +0x5b,0xa, 0x1f,0x9d,0x15,0xbe,0x14,0x0, 0x7, 0x18,0xc, 0xa, 0x5c,0xa, 0x1e,0x9d, +0x15,0xbe,0x14,0x0, 0x7, 0x8, 0xa, 0x7e,0x14,0x1, 0xf4,0x7a,0x17,0x76,0x3d,0xe1, +0xb4,0xb, 0xd0,0x7e,0x73,0x6d,0x93,0xbc,0x7d,0x38,0x90,0x7d,0x3f,0x3e,0x34,0x12, +0xa7,0xc6,0x7d,0x3, 0x7c,0xdc,0x80,0x1c,0x7e,0xc1,0x29,0x80,0x11,0x7c,0xbc,0x7c, +0x7d,0x12,0x9b,0x6a,0xbd,0x30,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0xb, 0xc0,0xbc,0xfc, +0x50,0xeb,0xb, 0xd0,0xbc,0xed,0x50,0xe0,0x7e,0x73,0x6f,0x32,0xbe,0x70,0x3, 0x40, +0xd, 0x12,0xd7,0xb7,0x50,0x28,0xb, 0x14,0x7a,0x17,0x76,0x3d,0x80,0x20,0xbe,0x70, +0x1, 0x38,0x1b,0x7e,0x17,0x76,0x3d,0xbe,0x14,0x0, 0x2, 0x28,0x6, 0x1b,0x15,0x7a, +0x17,0x76,0x3d,0x12,0xd7,0xc0,0x50,0x6, 0xb, 0x14,0x7a,0x17,0x75,0xbf,0x7e,0x73, +0x6d,0x93,0xbe,0x70,0x1, 0x40,0x2d,0x7e,0x30,0x2, 0xac,0x38,0x74,0x3, 0xac,0xb9, +0xbd,0x51,0x8, 0xf, 0x6d,0x11,0x7a,0x17,0x76,0x3d,0x12,0xd7,0xc0,0x50,0x15,0xb, +0x14,0x80,0xd, 0x12,0xd7,0xb7,0x50,0x6, 0xb, 0x15,0x7a,0x17,0x76,0x3d,0x6d,0x11, +0x7a,0x17,0x75,0xbf,0xda,0x3b,0x22,0x7e,0x17,0x76,0x3d,0xbe,0x14,0x3, 0xe8,0x22, +0x7e,0x17,0x75,0xbf,0xbe,0x14,0x1, 0xf4,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24, +0xbd,0x32,0x38,0xe9,0x22,0xa9,0xc5,0xca,0x75,0xed,0x8f,0x75,0xad,0xb0,0xa9,0xc7, +0x94,0xa9,0xd4,0x94,0x22,0xa9,0x31,0xcd,0xf, 0xa9,0x31,0xe5,0xb, 0xa9,0xd5,0xea, +0xa9,0xc5,0xea,0xc2,0x95,0xa9,0xc1,0xcd,0xa9,0x30,0xcd,0x7, 0xa9,0x30,0xe5,0x3, +0xa9,0xc0,0xcd,0xa9,0x32,0xcd,0x7, 0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x35, +0xcd,0x7, 0xa9,0x35,0xe5,0x3, 0xa9,0xc5,0xcd,0xa9,0x36,0xcd,0x7, 0xa9,0x36,0xe5, +0x3, 0xa9,0xc6,0xcd,0xa9,0x37,0xcd,0x7, 0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0x32, +0x7e,0x14,0xf7,0xf0,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50, +0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79, +0x30,0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79, +0x30,0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79, +0x30,0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0x7e,0xb3,0x78,0x9c,0xbe,0xb0,0xc8,0x50, +0x5, 0x4, 0x7a,0xb3,0x78,0x9c,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, 0x75, +0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7,0x0, +0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7, +0xd2,0xf8,0xa9,0xd4,0xb7,0xc2,0xbc,0xa9,0xc2,0xb7,0xc2,0xba,0xa9,0xc1,0xb7,0xc2, +0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0x22,0xa2,0xac,0x92,0x2, 0xc2,0xac,0x7e,0xf, 0x78, +0xf2,0x30,0x1, 0xa, 0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x80,0x8, 0xb, 0x16, +0xb, 0xa, 0x30,0x5e,0x70,0xf3,0x1b,0xa, 0x30,0xa2,0x2, 0x92,0xac,0x22,0xa, 0x7, +0xa, 0x1b,0x2d,0x10,0x12,0xd9,0x10,0x6d,0x0, 0x7e,0x18,0xbb,0x80,0x2, 0x23,0x10, +0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x22,0x7e,0x8, 0x0, 0x6d,0x12,0xaf,0xd0, +0x7e,0x34,0x1, 0x5, 0x7a,0x37,0x0, 0x6d,0x7e,0x34,0x20,0x0, 0x7a,0x37,0x0, 0x6f, +0x6d,0x33,0x7a,0x37,0x0, 0x71,0x7e,0x34,0x1, 0x80,0x7a,0x37,0x0, 0x73,0x7e,0x34, +0x28,0x30,0x7a,0x37,0x0, 0x75,0x7e,0x34,0x18,0x1e,0x7a,0x37,0x0, 0x77,0x7e,0x34, +0x66,0x6, 0x7a,0x37,0x0, 0x79,0x7e,0x34,0x73,0x0, 0x7a,0x37,0x0, 0x7b,0x7e,0x34, +0x14,0x2, 0x7a,0x37,0x0, 0x7d,0x6d,0x33,0x7a,0x37,0x0, 0x81,0x7a,0x37,0x0, 0x83, +0x7a,0x37,0x0, 0x85,0x7a,0x37,0x0, 0x87,0x7a,0x37,0x0, 0x99,0x7e,0x34,0x38,0x1, +0x7a,0x37,0x0, 0x9b,0x7e,0x34,0x4, 0x1, 0x7a,0x37,0x0, 0x9d,0x7e,0x34,0x6, 0x3, +0x7a,0x37,0x0, 0x9f,0x6d,0x33,0x7a,0x37,0x0, 0xa1,0x7a,0x37,0x0, 0xa3,0x7a,0x37, +0x0, 0xa5,0x7a,0x37,0x0, 0xa7,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x0, 0x6d, +0x7e,0x8, 0x0, 0xa9,0x12,0x24,0x13,0x1b,0xfd,0x22,0xca,0x3b,0x7e,0x38,0x1, 0x7d, +0x12,0x7, 0xb5,0x7e,0xa3,0x1, 0x8d,0xbe,0xa0,0xff,0x68,0x2a,0x7e,0x63,0x1, 0x8e, +0xbe,0x60,0xff,0x68,0x21,0x7e,0x73,0x1, 0x8f,0xbe,0x70,0xff,0x68,0x18,0x4c,0xaa, +0x68,0x14,0x4c,0x66,0x68,0x10,0x4c,0x77,0x68,0xc, 0x7a,0xa3,0x76,0xe2,0x7a,0x63, +0x76,0xde,0x7a,0x73,0x76,0xdf,0xc2,0x10,0x7e,0xb3,0x1, 0x8f,0xbe,0xb0,0x3, 0x28, +0xf, 0x74,0x4, 0x7a,0xb3,0x78,0x92,0x7a,0xb3,0x4a,0x68,0x75,0xc3,0x84,0xd2,0x10, +0xc2,0x12,0x7c,0xba,0x54,0xf0,0xb4,0xe0,0x2, 0xd2,0x12,0x7e,0x8, 0x0, 0xa1,0x69, +0x33,0x0, 0x4, 0x12,0xda,0xab,0x12,0x0, 0x6, 0x7e,0x8, 0x0, 0xa3,0x29,0xb3,0x0, +0x6, 0x12,0xda,0xa0,0x7e,0x8, 0x0, 0xdd,0x69,0x33,0x0, 0x1, 0x12,0xda,0xab,0x12, +0x0, 0x6, 0x7e,0x8, 0x0, 0xdf,0x29,0xb3,0x0, 0x3, 0x12,0xda,0xa0,0x7e,0x8, 0x0, +0xa5,0x69,0x33,0x0, 0xa, 0x12,0xda,0xab,0x12,0x0, 0x6, 0x7e,0x8, 0x0, 0xa7,0x29, +0xb3,0x0, 0xc, 0x12,0xda,0xa0,0x7e,0x8, 0x0, 0xe1,0x69,0x33,0x0, 0x7, 0x12,0xda, +0xab,0x12,0x0, 0x6, 0x7e,0x8, 0x0, 0xe3,0x29,0xb3,0x0, 0x9, 0x12,0xda,0xa0,0x7e, +0x34,0x0, 0x1a,0x7e,0x8, 0x0, 0xa1,0x7e,0x24,0x0, 0x4, 0x12,0x3, 0xfa,0x7e,0x34, +0x0, 0x1a,0x7e,0x8, 0x0, 0xdd,0x7e,0x24,0x0, 0x4, 0x12,0x4, 0x96,0xda,0x3b,0x22, +0x54,0xc0,0x23,0x23,0x54,0x3, 0xa, 0x3b,0x2, 0xd, 0xa5,0x7d,0x23,0x7c,0x45,0x6c, +0x55,0xa, 0x36,0x4d,0x32,0x22,0x6c,0xaa,0x7e,0x30,0x2c,0xac,0x3a,0x12,0x33,0xe4, +0x7e,0x34,0x0, 0x2c,0xe4,0x12,0x24,0x38,0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe9,0x22, +0x7e,0x34,0x0, 0x4, 0x12,0x3f,0xf5,0x74,0x1, 0x12,0x3f,0xfe,0x7e,0x73,0x78,0x97, +0x7a,0x73,0x77,0xb7,0x7a,0x73,0x77,0xb8,0x22,0x7e,0xb3,0x77,0xb4,0xb4,0x1, 0x37, +0x7e,0xa3,0x77,0xb2,0x7a,0xa3,0x77,0xb3,0x7e,0xb3,0x77,0xba,0x4, 0x7a,0xb3,0x77, +0xba,0x7e,0xb3,0x77,0xb9,0x4, 0x7a,0xb3,0x77,0xb9,0x12,0xdd,0x8d,0xbe,0xb3,0x77, +0xb9,0x38,0x14,0xe4,0x7a,0xb3,0x77,0xb9,0x7c,0xba,0x4, 0x7a,0xb3,0x77,0xb2,0x12, +0xdb,0x28,0x28,0x3, 0x12,0x4f,0xf3,0x22,0x7e,0x73,0x77,0xb1,0xbe,0x73,0x77,0xb2, +0x22,0x7e,0xb3,0x77,0xb4,0xb4,0x1, 0x2, 0x80,0x2, 0x61,0xd2,0x7e,0x73,0x77,0xb1, +0xbe,0x73,0x77,0xb3,0x28,0x74,0x7e,0x63,0x77,0xb3,0x7e,0x70,0x7, 0xac,0x67,0x49, +0x53,0x77,0xbd,0x7c,0xab,0x7e,0x43,0x77,0xba,0x7e,0x50,0x2, 0xac,0x45,0x2d,0x32, +0x49,0x33,0x77,0xbf,0x7a,0x35,0x1c,0x4d,0x33,0x68,0x4f,0xd2,0x30,0x1b,0xa0,0x68, +0x10,0x1b,0xa0,0x68,0xc, 0x1b,0xa0,0x68,0x8, 0x1b,0xa0,0x68,0x4, 0xb, 0xa2,0x78, +0x39,0x12,0xdb,0xd3,0x30,0x13,0x4, 0x74,0x2, 0x80,0x2, 0x74,0x1, 0x7e,0xa3,0x77, +0xba,0xa, 0x3a,0x19,0xb3,0x77,0xb5,0x7e,0xb3,0x77,0xba,0x70,0xe, 0x7e,0x73,0x77, +0xbc,0xbe,0x70,0x1, 0x28,0x5, 0x12,0xb, 0xe5,0x80,0xf, 0x7e,0xf, 0x78,0xf2,0xb, +0x16,0xb, 0xa, 0x30,0x5e,0x60,0xef,0x1b,0xa, 0x30,0x12,0xdb,0x28,0x38,0x13,0x74, +0x2, 0x7a,0xb3,0x77,0xb4,0x12,0x3f,0xbb,0x12,0x37,0xf5,0xe5,0x1e,0x70,0x3, 0x2, +0x4f,0x8a,0x22,0xca,0x3b,0x7e,0x95,0x1c,0x6d,0x88,0x7e,0xb3,0x77,0xba,0xf5,0x4c, +0x7e,0xb3,0x6f,0x76,0x60,0xa, 0x7e,0xc7,0x6f,0x6a,0x7e,0xd7,0x6f,0x6c,0x80,0x8, +0x7e,0xd7,0x6f,0x6a,0x7e,0xc7,0x6f,0x6c,0x20,0x30,0x2, 0xa1,0x44,0x7e,0xe7,0x73, +0xd6,0x7e,0xf4,0x0, 0xa, 0xa9,0xd7,0xea,0x7e,0x5f,0x1, 0x79,0x69,0x55,0x2, 0x64, +0x69,0x75,0x0, 0xc, 0x4d,0x75,0x12,0xdd,0x64,0x59,0x75,0x0, 0xe5,0x69,0x55,0x2, +0x5c,0x7e,0x5f,0x1, 0x79,0x69,0xb5,0x0, 0x4, 0x4d,0xb5,0x12,0xdd,0x64,0x59,0xb5, +0x0, 0xe7,0x7e,0x5f,0x1, 0x79,0x69,0xb5,0x2, 0x5a,0x7e,0x3f,0x1, 0x79,0x69,0x53, +0x0, 0x2, 0xbd,0x5b,0x28,0xc, 0x7e,0x5f,0x1, 0x79,0x69,0x55,0x0, 0x2, 0x7d,0x45, +0x80,0x8, 0x7e,0x2f,0x1, 0x79,0x69,0x42,0x2, 0x5a,0x12,0xdd,0x64,0x59,0x45,0x0, +0xe9,0x7e,0x2f,0x1, 0x79,0xb, 0x2a,0x50,0x12,0xdd,0x6b,0x19,0xa4,0x0, 0xeb,0x7e, +0x2f,0x1, 0x79,0x69,0x52,0x2, 0x58,0x12,0xdd,0x6b,0x19,0xa4,0x0, 0xec,0x6d,0xbb, +0x7d,0x4b,0xbe,0x44,0x0, 0x1, 0x78,0x4, 0xb, 0xf4,0x80,0x23,0x7c,0xb9,0x7e,0xa4, +0x0, 0x1, 0x60,0x5, 0x3e,0xa4,0x14,0x78,0xfb,0x7e,0xb3,0x6f,0x68,0xa, 0x5b,0x5d, +0x5a,0x68,0x5, 0x12,0xdd,0x47,0x80,0x7, 0x6d,0x55,0x12,0xdd,0x56,0xb, 0xf4,0xb, +0x44,0xbe,0x44,0x0, 0x3, 0x78,0xcb,0x7e,0xb3,0x6f,0x76,0x60,0x5, 0x7a,0xc5,0x4a, +0x80,0x3, 0x7a,0xb5,0x4a,0x12,0xdd,0x79,0x7d,0x4b,0x80,0xc, 0xb, 0xa, 0x50,0x1b, +0x1a,0x50,0xb, 0x15,0xb, 0x35,0xb, 0x44,0xbd,0xd4,0x38,0xf0,0x7d,0xfd,0x2e,0xf5, +0x4a,0x7a,0xf5,0x4a,0x7e,0xf4,0x1, 0x36,0x7d,0x4b,0xbe,0x44,0x0, 0x1, 0x78,0x4, +0xb, 0xf4,0x80,0x23,0x7c,0xb9,0x7e,0xa4,0x0, 0x1, 0x60,0x5, 0x3e,0xa4,0x14,0x78, +0xfb,0x7e,0xb3,0x6f,0x69,0xa, 0x5b,0x5d,0x5a,0x68,0x5, 0x12,0xdd,0x47,0x80,0x7, +0x6d,0x55,0x12,0xdd,0x56,0xb, 0xf4,0xb, 0x44,0xbe,0x44,0x0, 0x3, 0x78,0xcb,0x7e, +0xb3,0x6f,0x76,0x60,0x3, 0x7a,0xb5,0x4a,0x12,0xdd,0x79,0x7d,0x4b,0x80,0xc, 0xb, +0xa, 0x50,0x1b,0x1a,0x50,0xb, 0x35,0xb, 0x15,0xb, 0x44,0xbd,0xc4,0x38,0xf0,0xa9, +0xc7,0xea,0xc2,0x30,0xda,0x3b,0x22,0x7d,0x5f,0xb, 0xf4,0x3e,0x54,0x7e,0x3f,0x1, +0x79,0x2d,0x75,0xb, 0x3a,0x50,0x7d,0xae,0xb, 0xe4,0x3e,0xa4,0x7f,0x34,0x2d,0x7a, +0x1b,0x3a,0x50,0x22,0x7e,0xa1,0x4c,0x74,0x8, 0xa4,0x22,0x5e,0x54,0x0, 0x7f,0x7c, +0xab,0x7e,0x91,0x4c,0x74,0x8, 0xac,0x9b,0x22,0x7d,0xaf,0x3e,0xa4,0x7e,0xf, 0x1, +0x79,0x2d,0x1a,0x7e,0xa5,0x4a,0x3e,0xa4,0x7f,0x14,0x2d,0x3a,0x22,0x7e,0x70,0x7, +0xac,0x7a,0x9, 0xb3,0x77,0xc3,0x22,0x6c,0xaa,0x7e,0xb3,0x78,0x8e,0xa, 0x3b,0x1e, +0x34,0xb, 0x34,0x7e,0x50,0x8, 0xac,0x5a,0x19,0x72,0x77,0x96,0xb, 0xa0,0xbe,0xa0, +0x4, 0x40,0xe6,0x22,0x7e,0x34,0x0, 0x1, 0x12,0x3f,0xf5,0x7e,0x57,0x77,0x99,0x12, +0x3f,0xfe,0x74,0x1, 0x2, 0x3f,0xd9,0x7e,0x34,0x0, 0x3, 0x12,0x3f,0xf5,0x7e,0x57, +0x77,0xa9,0x12,0x3f,0xfe,0x74,0x3, 0x2, 0x3f,0xd9,0x80,0x3, 0x12,0x46,0x86,0x30, +0x15,0xfa,0x22,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x1, 0x68,0x4, 0xd2,0x1b,0xc2,0x1e, +0x22,0x30,0x1d,0x8, 0xe5,0x1e,0xb4,0x1, 0x3, 0x2, 0x3b,0xdc,0x22,0x7c,0xab,0x7e, +0x8, 0x0, 0x87,0x7e,0x70,0xa, 0xac,0x7a,0x9, 0xb3,0x29,0x8c,0x12,0xc, 0x3e,0x7e, +0x8, 0x0, 0xc3,0x74,0xa, 0xa4,0x9, 0xb5,0x29,0x8c,0x12,0xc, 0x3e,0x7e,0x34,0x0, +0xd, 0x7e,0x8, 0x0, 0x87,0x7e,0x24,0x0, 0x1, 0x2, 0xc, 0xcc,0xca,0xd8,0xca,0x79, +0x7c,0xf7,0x7c,0xeb,0xe4,0x12,0x67,0x91,0x6c,0xdd,0x7e,0x70,0xb5,0xac,0x7d,0x2e, +0x34,0x1, 0x0, 0x2e,0x34,0x0, 0x16,0x7a,0x35,0x29,0x12,0x7, 0x40,0x7a,0x35,0x2b, +0x7e,0x35,0x29,0x12,0x8, 0x0, 0x7a,0x35,0x2d,0x7e,0x25,0x2b,0x5e,0x50,0xf8,0x7a, +0x25,0x2b,0x5e,0x70,0xf8,0x7a,0x35,0x2d,0x7c,0xbe,0x54,0x5, 0xa, 0x3b,0x4e,0x35, +0x2b,0x7a,0x35,0x2b,0x7c,0xbf,0x54,0x5, 0xa, 0x3b,0x4e,0x35,0x2d,0x7a,0x35,0x2d, +0x7e,0x35,0x29,0x7e,0x25,0x2b,0x12,0x6, 0x48,0x7e,0x35,0x29,0x7e,0x25,0x2d,0x12, +0x6, 0xc5,0xb, 0xd0,0xbe,0xd0,0x3, 0x40,0xa1,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab, +0x74,0x27,0xa4,0x49,0x25,0x28,0xee,0xb, 0x24,0x7e,0x37,0x77,0x8b,0xad,0x32,0x7e, +0x8, 0x0, 0x83,0x12,0xde,0xb9,0x2, 0xc, 0xcc,0x6d,0x22,0x12,0xd, 0x3e,0x7e,0x8, +0x0, 0xbf,0x6d,0x22,0x12,0xd, 0x3e,0x7e,0x34,0x0, 0xb, 0x7e,0x8, 0x0, 0x83,0x7e, +0x24,0x0, 0x2, 0x22,0x7c,0xab,0x6d,0x33,0xbe,0xa0,0x4, 0x50,0x27,0x6c,0x55,0x80, +0x16,0x7e,0x10,0x2, 0xac,0x15,0x7e,0x30,0x27,0xac,0x3a,0x2d,0x10,0x49,0x11,0x28, +0xee,0xb, 0x14,0x2d,0x31,0xb, 0x50,0x7e,0x30,0x27,0xac,0x3a,0x9, 0x41,0x28,0xe9, +0xbc,0x45,0x50,0xdd,0x4d,0x33,0x78,0x2, 0xb, 0x34,0x22,0xca,0x79,0x7c,0xfb,0xd2, +0x0, 0xc2,0x1, 0x6d,0x33,0x7a,0x37,0x78,0x86,0x74,0x27,0xac,0xbf,0x9, 0xe5,0x28, +0xe9,0x7c,0xbf,0x12,0x67,0x4a,0x92,0x1, 0x7c,0xbf,0x12,0xcf,0xfa,0x92,0x0, 0x30, +0x0, 0x5, 0x7c,0xbf,0x12,0x57,0x3b,0x7e,0xb3,0x77,0x5f,0x70,0xc, 0x7c,0xbf,0x12, +0xdf,0x63,0x92,0x31,0x20,0x31,0x2, 0xc2,0x0, 0x30,0x1, 0x12,0x74,0x27,0xac,0xbf, +0x19,0xe5,0x28,0xe9,0x7c,0xbf,0x12,0x66,0xf8,0x7c,0xbf,0x12,0x67,0xbd,0xa2,0x0, +0xda,0x79,0x22,0x7c,0xab,0x7e,0x73,0x73,0xda,0xc2,0x2, 0x6d,0x22,0x7d,0x42,0x80, +0x13,0xa, 0xa, 0x12,0x35,0xa6,0x2d,0x14,0x9, 0xb1,0x4e,0xa8,0x70,0x4, 0xd2,0x2, +0x80,0xa, 0xb, 0x44,0x7e,0x17,0x73,0xd6,0xbd,0x14,0x38,0xe5,0x7d,0x42,0x7c,0xb7, +0x54,0x1, 0xb4,0x1, 0x17,0xa, 0xa, 0x12,0x35,0xa6,0x7e,0x27,0x73,0xd6,0x2d,0x24, +0x2d,0x21,0x9, 0xb2,0x4e,0xa8,0x70,0x4, 0xd2,0x2, 0x80,0xa, 0x1e,0x70,0xb, 0x44, +0xbe,0x44,0x0, 0x4, 0x40,0xd8,0x30,0x2, 0x10,0x7e,0xb3,0x78,0xe8,0xbe,0xb0,0x0, +0x28,0xd, 0x14,0x7a,0xb3,0x78,0xe8,0xc3,0x22,0x74,0x5, 0x7a,0xb3,0x78,0xe8,0xd3, +0x22,0xca,0x79,0x7c,0x5b,0x7e,0x40,0xff,0x7e,0xa0,0xff,0x6c,0x33,0x2, 0xe0,0x67, +0xbc,0x63,0x78,0x3, 0x2, 0xe0,0x65,0x7e,0x90,0x2, 0xac,0x93,0x9, 0x24,0x6c,0x9, +0xa, 0xf2,0xa, 0x5, 0x9d,0xf, 0xbe,0x4, 0x0, 0x0, 0x8, 0xc, 0xa, 0xe2,0xa, 0xf5, +0x9d,0xfe,0x7d,0x7f,0x7c,0x2f,0x80,0x8, 0x6e,0x4, 0xff,0xff,0xb, 0x4, 0x7c,0x21, +0x7e,0x10,0x2, 0xac,0x13,0x9, 0xb0,0x6c,0xa, 0xa, 0xb, 0xa, 0x47,0x9d,0x40,0xbe, +0x44,0x0, 0x0, 0x8, 0x8, 0xa, 0xfb,0xa, 0x7, 0x9d,0xf, 0x80,0x4, 0x6d,0x0, 0x9d, +0x4, 0xbe,0x20,0x1, 0x38,0xa, 0xbe,0x10,0x1, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x32, +0xbe,0x20,0x2, 0x38,0xa, 0xbe,0x10,0x2, 0x38,0x5, 0x7e,0x40,0x2, 0x80,0x10,0x30, +0x0, 0xd, 0xbe,0x20,0x3, 0x38,0x8, 0xbe,0x10,0x3, 0x38,0x3, 0x7e,0x40,0x3, 0xbc, +0x4a,0x50,0x2, 0x7c,0xa4,0xb, 0x30,0x7e,0x3, 0x6d,0x93,0xbc,0x3, 0x28,0x3, 0x2, +0xdf,0xe0,0x7c,0xba,0xda,0x79,0x22,0xca,0x3b,0x7c,0xcb,0x7e,0x8, 0x63,0x6d,0x12, +0x5f,0xef,0x7e,0x8, 0x63,0x79,0x7e,0x34,0x0, 0x5, 0x12,0x24,0x38,0x12,0x9f,0xee, +0x7e,0xb7,0x73,0xd6,0x7e,0x97,0x6d,0xb0,0x7d,0xa9,0x3e,0xa4,0x3e,0xa4,0x4c,0xcc, +0x78,0x6c,0x7a,0xd3,0x63,0x6e,0x7a,0xe3,0x63,0x6d,0x7e,0x84,0x8, 0xc, 0x7a,0x87, +0x63,0x71,0x7e,0x1f,0x24,0x64,0x7d,0x83,0x7a,0x87,0x63,0x73,0x7e,0x1f,0x24,0x64, +0x7d,0x83,0x7a,0x87,0x63,0x75,0x7d,0x39,0x7c,0xb7,0xf5,0x27,0x7e,0x8, 0x63,0x6d, +0x7e,0x18,0x63,0x79,0x7d,0x59,0x12,0x0, 0x46,0x6c,0xff,0x7d,0x3b,0x3e,0x34,0x49, +0x83,0x8, 0xc, 0xbd,0xa8,0x58,0x10,0x7e,0xf, 0x24,0x64,0x2d,0x13,0xb, 0xa, 0x20, +0x2d,0x2a,0x1b,0xa, 0x20,0x80,0x10,0x6d,0x22,0x9d,0x2a,0xbd,0x28,0x8, 0x8, 0x12, +0xe1,0x5d,0x9d,0x3a,0x1b,0xa, 0x30,0x12,0xe1,0x55,0x78,0xcf,0x80,0x44,0xbe,0xc0, +0x1, 0x78,0x3f,0x6c,0xff,0x80,0x24,0x6c,0x77,0x80,0x1a,0x7c,0xbf,0xac,0xbd,0xa, +0x87,0x2d,0x85,0x3e,0x84,0x7e,0xf, 0x24,0x64,0x2d,0x18,0xb, 0xa, 0x80,0x2d,0x89, +0x1b,0xa, 0x80,0xb, 0x70,0xbc,0xd7,0x38,0xe2,0xb, 0xf0,0xbc,0xef,0x38,0xd8,0x6c, +0xff,0x7d,0x3b,0x3e,0x34,0x12,0xe1,0x5d,0x2d,0x3a,0x1b,0xa, 0x30,0x12,0xe1,0x55, +0x78,0xef,0xda,0x3b,0x22,0xb, 0xb4,0xb, 0xf0,0xbe,0xf0,0x4, 0x22,0x7e,0xf, 0x24, +0x64,0x2d,0x13,0xb, 0xa, 0x30,0x22,0x7e,0x37,0x73,0xd6,0x6c,0xaa,0x90,0x1c,0x49, +0xe4,0x93,0x20,0xe0,0x4, 0x4c,0xaa,0x68,0x25,0x1e,0xb0,0x1e,0xb0,0x20,0xe0,0x5, +0xbe,0xa0,0x1, 0x68,0x19,0x90,0x1c,0x4a,0xe4,0x93,0x20,0xe0,0x5, 0xbe,0xa0,0x2, +0x68,0xc, 0x1e,0xb0,0x1e,0xb0,0x20,0xe0,0x9, 0xbe,0xa0,0x3, 0x78,0x4, 0xb, 0x34, +0x80,0x25,0x7d,0x23,0x3e,0x24,0x49,0x42,0x8, 0xc, 0x12,0xe1,0xcf,0x2d,0x24,0x1b, +0xa, 0x20,0x7d,0x23,0x3e,0x24,0x12,0xe1,0xcf,0xbe,0x24,0xf, 0xa0,0x50,0x6, 0x74, +0x1f,0x7a,0xb3,0x73,0xd4,0xb, 0x34,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0x9f,0x22,0x7e, +0xf, 0x24,0x64,0x2d,0x12,0xb, 0xa, 0x20,0x22,0xe4,0x7a,0xb3,0x6d,0xa8,0x12,0xe1, +0xf5,0xe4,0x12,0x0, 0x19,0x7e,0xb3,0x25,0xae,0xb4,0x1, 0x8, 0x7e,0x73,0x6d,0x93, +0x7a,0x73,0x6d,0xa7,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x6c,0x81, +0xb, 0x30,0x90,0x21,0x52,0xe4,0x93,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0xb, 0x24,0xa, +0x33,0xbd,0x32,0x48,0xe4,0x12,0xe3,0x39,0x6d,0x33,0x7a,0x37,0x6d,0x95,0x7a,0x37, +0x6d,0x97,0x7a,0x37,0x6d,0x99,0x7a,0x37,0x6d,0x9d,0x7e,0xd4,0x63,0x6f,0x1e,0xd4, +0x3e,0xd4,0x6d,0xcc,0x7e,0x1f,0x24,0x68,0x7a,0x37,0x63,0xaf,0x7d,0x3d,0x7a,0x37, +0x63,0xb3,0x7e,0x34,0x24,0xbc,0x7a,0x37,0x63,0xb1,0x7e,0x73,0x6f,0x64,0x7a,0x73, +0x63,0xac,0x7e,0x73,0x6f,0x65,0x7a,0x73,0x63,0xab,0x7e,0x37,0x6f,0x42,0x7a,0x37, +0x63,0xb5,0x7e,0x37,0x6f,0x44,0x7a,0x37,0x63,0xb7,0x7e,0x37,0x6f,0x4c,0x7a,0x37, +0x63,0xb9,0x7e,0x37,0x6f,0x4e,0x7a,0x37,0x63,0xbb,0x12,0xac,0x4c,0x1b,0x34,0x7a, +0x73,0x63,0xad,0x7e,0x73,0x78,0xfc,0x7a,0x73,0x63,0xae,0x7e,0x8, 0x63,0xab,0x7e, +0x18,0x63,0xbd,0x12,0x3, 0x1d,0x7e,0x73,0x63,0xbd,0x7a,0x73,0x6d,0x93,0x7e,0x73, +0x63,0xbe,0x7a,0x73,0x6d,0x94,0x7e,0x37,0x63,0xbf,0x7a,0x37,0x6d,0x95,0x7e,0x37, +0x63,0xc1,0x7a,0x37,0x6d,0x97,0x7e,0x37,0x63,0xc7,0x7a,0x37,0x6d,0x99,0x7e,0x37, +0x63,0xc9,0x7d,0x23,0x7a,0x53,0x6d,0x9b,0xa, 0x36,0x7a,0x73,0x6d,0x9c,0x7e,0x37, +0x63,0xc3,0x7a,0x37,0x6d,0x9d,0x7e,0x37,0x63,0xc5,0x7d,0x23,0x7a,0x53,0x6d,0x9f, +0xa, 0x36,0x7a,0x73,0x6d,0xa0,0x6c,0x33,0x80,0x1f,0xd2,0x2, 0x7c,0xb3,0x12,0x6e, +0x5b,0x74,0x2, 0xac,0xb3,0x49,0x45,0x24,0xbc,0xa, 0x38,0x7c,0x27,0x19,0x25,0x6c, +0x9, 0x7c,0x29,0x19,0x25,0x6c,0xa, 0xb, 0x30,0x7e,0x23,0x6d,0x93,0xbc,0x23,0x38, +0xd9,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac,0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40, +0xa, 0x38,0x7c,0x27,0x19,0x25,0x6c,0x45,0x7c,0x29,0x19,0x25,0x6c,0x46,0xb, 0x30, +0x7e,0x23,0x6d,0x94,0xbc,0x23,0x38,0xdd,0x22,0xe4,0x7a,0xb3,0x6d,0x93,0x7a,0xb3, +0x6d,0x94,0x22,0xe4,0x7a,0xb3,0x78,0xb1,0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, +0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0, +0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24, +0x14,0x78,0xfb,0x7e,0x73,0x78,0xde,0xa, 0x47,0x5d,0x42,0x7e,0x73,0x77,0x10,0x80, +0x36,0xa5,0xbe,0x30,0x18,0x12,0xe3,0xbc,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e, +0x53,0x78,0xdf,0xa, 0x45,0x5d,0x43,0x7e,0x73,0x77,0x11,0x80,0x1a,0x12,0xe3,0xbc, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x2a,0x9, 0xb2,0x78,0xde,0xa, 0x4b,0x5d, +0x43,0xa, 0x5a,0x9, 0x75,0x77,0x12,0xa, 0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, +0x7e,0x34,0x0, 0x1, 0x22,0x7e,0x17,0x27,0x5a,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x27, +0x5a,0x7a,0x27,0x27,0x5c,0x80,0x10,0x7e,0x17,0x27,0x52,0xbd,0x13,0x50,0x8, 0x7a, +0x37,0x27,0x52,0x7a,0x27,0x27,0x54,0x7e,0x17,0x27,0x58,0xbd,0x12,0x28,0xa, 0x7a, +0x27,0x27,0x58,0x7a,0x37,0x27,0x56,0x80,0x10,0x7e,0x17,0x27,0x60,0xbd,0x12,0x50, +0x8, 0x7a,0x27,0x27,0x60,0x7a,0x37,0x27,0x5e,0x7e,0xb3,0x27,0x72,0xb4,0xa, 0xf, +0x12,0xe4,0x3a,0x7a,0x37,0x27,0x6a,0x12,0xe4,0x31,0x7a,0x37,0x27,0x6c,0x22,0xb4, +0xf, 0xe, 0x12,0xe4,0x3a,0x7a,0x37,0x27,0x6e,0x12,0xe4,0x31,0x7a,0x37,0x27,0x70, +0x22,0x7e,0x37,0x27,0x60,0x9e,0x37,0x27,0x58,0x22,0x7e,0x37,0x27,0x52,0x9e,0x37, +0x27,0x5a,0x22,0x7e,0xb3,0x27,0x4a,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7e,0xa3, +0x27,0x72,0xbe,0xa0,0x64,0x50,0x1b,0x74,0x4, 0xa4,0x59,0x35,0x25,0xb9,0x7e,0xa3, +0x27,0x72,0x74,0x4, 0xa4,0x59,0x25,0x25,0xbb,0x7e,0xb3,0x27,0x72,0x4, 0x7a,0xb3, +0x27,0x72,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x27,0x4a,0x7e,0x34,0x0, 0x28,0xe4, +0x12,0x24,0x38,0x7e,0x8, 0x25,0xb9,0x7e,0x34,0x1, 0x90,0x12,0x24,0x38,0x7a,0xb3, +0x77,0x12,0x7e,0x34,0x22,0x6d,0x12,0x2a,0xa9,0x7a,0x37,0x25,0xb1,0x7a,0xe7,0x27, +0x4e,0x7a,0xf7,0x27,0x50,0x7a,0xe7,0x27,0x52,0x7a,0xe7,0x27,0x56,0x7a,0xe7,0x27, +0x5a,0x7a,0xe7,0x27,0x5e,0x7a,0xf7,0x27,0x54,0x7a,0xf7,0x27,0x58,0x7a,0xf7,0x27, +0x5c,0x7a,0xf7,0x27,0x60,0x7a,0xe7,0x25,0xb5,0x7a,0xf7,0x25,0xb7,0x7a,0xb3,0x27, +0x72,0x74,0x2, 0x7a,0xb3,0x27,0x49,0x22,0x74,0xfe,0x7a,0xb3,0x77,0x12,0xe4,0x7a, +0xb3,0x27,0x4a,0x22,0x74,0x9, 0xac,0xbe,0x49,0x35,0x6e,0x25,0x74,0x9, 0xac,0xbf, +0x49,0x25,0x27,0x75,0x9d,0x32,0x12,0x24,0x5a,0x7d,0xc3,0x74,0x9, 0xac,0xbe,0x49, +0x35,0x6e,0x23,0x74,0x9, 0xac,0xbf,0x49,0x25,0x27,0x73,0x9d,0x32,0x2, 0x24,0x5a, +0x7e,0xa0,0x5, 0x7e,0x70,0x4, 0xac,0x7f,0x19,0xa3,0x28,0xba,0x7e,0x70,0x9, 0xac, +0x7f,0x2e,0x34,0x27,0x73,0x7e,0x30,0x9, 0xac,0x3e,0x2e,0x14,0x6e,0x23,0x74,0x9, +0x2, 0x23,0x44,0x7e,0xa0,0x3, 0x7e,0x30,0x9, 0xac,0x3f,0x7e,0x1d,0x36,0x2d,0x31, +0x7a,0x1b,0xa0,0x7e,0x30,0x9, 0xac,0x3f,0x7e,0x1d,0x36,0x2d,0x31,0x22,0x74,0x9, +0xac,0xbf,0x7e,0x1d,0x36,0x22,0x74,0x9, 0xac,0xbe,0x49,0xc5,0x6e,0x23,0x7e,0x34, +0x21,0xde,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x40,0x9e,0x44,0x0, 0x14,0xbd,0xc4,0x22, +0x7a,0xb3,0x77,0xb5,0x7a,0xb3,0x77,0xb6,0x7a,0xb3,0x77,0xb9,0x74,0xff,0x7a,0xb3, +0x77,0xba,0xe4,0x7a,0xb3,0x77,0xbb,0x22,0x6d,0x33,0x7e,0xf, 0x78,0xf2,0x79,0x30, +0x0, 0x16,0x7e,0x34,0x1, 0x2c,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x18,0x22,0x7e, +0x70,0x9, 0xac,0x7e,0x9, 0xb3,0x6e,0x2a,0x9, 0x73,0x6e,0x2b,0x2, 0x9b,0x6a,0x6d, +0x22,0xa, 0xd, 0x7e,0x14,0x0, 0x40,0x9d,0x10,0x1a,0x2, 0x1a,0x0, 0x12,0x22,0xa3, +0x7f,0x71,0x22,0x7e,0x11,0x12,0x2e,0x10,0x8, 0xa5,0xe7,0xbe,0xb0,0x0, 0x22,0x49, +0x35,0x6e,0x25,0xbe,0x34,0x0, 0x14,0x22,0x7e,0x24,0x1b,0xd8,0xa, 0x3b,0x2d,0x32, +0x6d,0x22,0x2e,0x24,0x0, 0xff,0x7e,0x1b,0x30,0x22,0x7e,0x34,0x1, 0x0, 0x7d,0x16, +0x3e,0x14,0x2e,0x14,0x6f,0x77,0x6d,0x0, 0x7d,0x27,0x22,0x2d,0x35,0x29,0xb1,0x0, +0x8, 0xbe,0xb0,0x2d,0x22,0x7e,0x70,0x27,0xac,0x67,0x2e,0x34,0x28,0xe7,0x6d,0x22, +0x7e,0x8, 0x77,0x62,0x22,0x7e,0x50,0x9, 0xac,0x5f,0x2e,0x25,0x2c,0xb, 0x28,0x30, +0x49,0x22,0x0, 0x2, 0x22,0x7a,0x37,0x6d,0xb0,0x90,0x22,0xb, 0xe4,0x93,0x7a,0xb3, +0x6d,0xb2,0x22,0x49,0x35,0x6e,0x25,0xbe,0x34,0x0, 0x0, 0x22,0x2e,0x34,0x0, 0x8, +0x4, 0x7a,0x1b,0xb0,0x22,0x74,0x9, 0xac,0xbe,0x9, 0xb5,0x6e,0x2a,0x7e,0x70,0x9, +0xac,0x7e,0x22,0x6d,0x22,0xa, 0x1d,0x6d,0x0, 0x12,0x22,0xa3,0x2f,0x17,0x74,0x6, +0x22,0x7e,0x71,0x12,0x74,0x9, 0xac,0x7b,0x2e,0x34,0x27,0x73,0x6d,0x22,0x22,0x7e, +0x73,0x6f,0x3e,0xbc,0x7e,0x22,0xa9,0xd5,0xea,0xa9,0xc5,0xea,0x74,0x2, 0x7e,0x70, +0x7, 0x22,0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7f,0x19,0xa3,0x28,0xba,0x22,0x7a,0xb3, +0x77,0xb2,0x74,0xff,0x7a,0xb3,0x77,0xb3,0xe4,0x22,0x7e,0xa1,0x29,0x74,0x6, 0xa4, +0x7e,0xd, 0x32,0x2d,0x15,0x22,0x7c,0x1f,0x2e,0x10,0x8, 0xa5,0xe7,0x22,0x7e,0x27, +0x4a,0x6d,0x4e,0x50,0x20,0x7a,0x27,0x4a,0x6d,0x22,0x9e,0xc4,0x0, 0x14,0xbd,0x3c, +0x22,0x7a,0x37,0x6f,0x46,0x7e,0x34,0x21,0x63,0x22,0xb, 0xf5,0xb, 0x55,0xb, 0x15, +0x1b,0x34,0x22,0x7e,0xf4,0x21,0xec,0x7e,0xe4,0x0, 0xff,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0x5, 0x63,0x6d,0x22,0x7e,0x3f,0x78,0xf2,0x69,0x33,0x0, 0x6, 0x22,0x74,0x9, +0xac,0xbe,0x49,0x45,0x6e,0x23,0x22,0x49,0x45,0x6e,0x25,0xbe,0x44,0x0, 0x14,0x22, +0x7e,0x1f,0x24,0x68,0x7a,0x37,0x4e,0x7f,0x22,0x9, 0xb5,0x29,0xb5,0x2, 0xd, 0x7, +0xd2,0x4, 0x12,0x3c,0x96,0x7c,0xbf,0x22,0x7e,0xb3,0x77,0x5f,0xbe,0xb0,0x1, 0x22, +0x7e,0xb3,0x76,0xc3,0xbe,0xb0,0xaa,0x22,0x7e,0x39,0xb0,0x14,0x7a,0x39,0xb0,0x22, +0xac,0x3b,0x7e,0x1d,0x32,0x2d,0x31,0x22,0x9d,0x32,0x12,0x24,0x5a,0x7d,0x13,0x22, diff --git a/drivers/input/touchscreen/FT8716/include/pramboot/FT8716_Pramboot_V0.5_20160723.i b/drivers/input/touchscreen/FT8716/include/pramboot/FT8716_Pramboot_V0.5_20160723.i new file mode 100755 index 0000000000000..8c27370a9170b --- /dev/null +++ b/drivers/input/touchscreen/FT8716/include/pramboot/FT8716_Pramboot_V0.5_20160723.i @@ -0,0 +1,246 @@ +0x2, 0x3, 0x83,0xca,0x39,0x12,0xf, 0x3c,0xda,0x39,0x32,0x2, 0x0, 0x3, 0x6d,0x22, +0x80,0x13,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, +0xb0,0xb, 0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0xff,0x2, 0xd, 0xf, 0xe5,0x33, +0xb4,0xc, 0xf, 0xc2,0x86,0xc2,0x87,0x7e,0x34,0x0, 0x64,0x12,0xe, 0x86,0xd2,0x86, +0xd2,0x87,0x22,0x2, 0x0, 0xf9,0xca,0x3b,0x7a,0xd, 0x10,0x7f,0x31,0xe5,0x24,0xb4, +0x80,0x2, 0x80,0x3, 0x2, 0x0, 0xdc,0x7f,0x13,0x5e,0x34,0x0, 0x7f,0x7d,0x23,0x7e, +0x34,0x0, 0x80,0x9d,0x32,0x7a,0x35,0x16,0x7e,0x35,0x14,0xbe,0x35,0x16,0x38,0x2, +0x80,0x5d,0x7e,0x35,0x16,0x7a,0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6, +0x7e,0x35,0x14,0x9e,0x35,0x16,0x7a,0x35,0x14,0x7e,0x35,0x16,0x6d,0x22,0x2f,0x31, +0x7e,0x1d,0x10,0x2e,0x35,0x16,0x7a,0x1d,0x10,0x80,0x27,0x7e,0x34,0x0, 0x80,0x7a, +0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6,0x7e,0x35,0x14,0x9e,0x34,0x0, +0x80,0x7a,0x35,0x14,0x7e,0x1d,0x10,0x2e,0x34,0x0, 0x80,0x7a,0x1d,0x10,0x2e,0x38, +0x0, 0x80,0x7e,0x35,0x14,0xbe,0x34,0x0, 0x80,0x50,0xd0,0x4d,0x33,0x68,0x26,0x7a, +0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6,0x80,0x19,0x74,0x2, 0x12,0xa, +0x89,0x5e,0x70,0xf4,0x12,0xc, 0x86,0x7e,0x35,0x14,0x7a,0x35,0x18,0x7f,0x13,0x7e, +0xd, 0x10,0x12,0x8, 0xe, 0xd3,0xda,0x3b,0x22,0xa9,0xc0,0x93,0x75,0x39,0x0, 0x32, +0xf, 0x60,0xf0,0x9f,0x4c,0xf1,0xb3,0xe, 0xce,0xb9,0x31,0x46,0xff,0x0, 0xff,0x0, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x7c,0x6b,0xc2,0x2, 0xe5,0x22,0x14,0x78,0x3, 0x2, 0x2, 0xda,0x1b,0xb1,0x78,0x3, +0x2, 0x2, 0x3d,0x1b,0xb1,0x78,0x3, 0x2, 0x2, 0x89,0x1b,0xb1,0x78,0x3, 0x2, 0x2, +0x9a,0x1b,0xb1,0x78,0x3, 0x2, 0x2, 0xc1,0x24,0xf9,0x78,0x3, 0x2, 0x2, 0xd6,0x24, +0xaf,0x78,0x3, 0x2, 0x3, 0x3b,0x24,0xfd,0x68,0x3a,0x14,0x78,0x3, 0x2, 0x2, 0xdd, +0x14,0x78,0x3, 0x2, 0x2, 0xda,0x1b,0xb2,0x78,0x3, 0x2, 0x2, 0xda,0x24,0xda,0x68, +0x26,0x24,0xe6,0x68,0x1f,0x24,0xeb,0x68,0x3b,0x24,0xf3,0x78,0x3, 0x2, 0x2, 0xda, +0x24,0xe4,0x78,0x3, 0x2, 0x3, 0x46,0x14,0x78,0x3, 0x2, 0x2, 0xda,0x24,0x94,0x68, +0x3, 0x2, 0x3, 0x82,0x2, 0x3, 0x42,0xbe,0x60,0x4, 0x50,0xc, 0x75,0x3f,0x0, 0x7c, +0x16,0x2e,0x10,0x25,0x7c,0xb7,0xa5,0xf7,0xa5,0xbe,0x0, 0x2, 0x80,0x3, 0x2, 0x3, +0x82,0xd2,0x2, 0x22,0x7c,0xb6,0x24,0x0, 0x78,0x3, 0x2, 0x3, 0x82,0x1b,0xb1,0x68, +0x1e,0x14,0x68,0x1e,0x14,0x68,0x1e,0x14,0x68,0x1e,0xb, 0xb2,0x78,0x33,0x30,0x1, +0x7, 0x7e,0x8, 0x0, 0x44,0x2, 0x2, 0x5a,0x7e,0x8, 0x1, 0x50,0x2, 0x2, 0x5a,0x2, +0x2, 0xfb,0x2, 0x3, 0x2, 0x2, 0x3, 0x1a,0xa, 0x27,0x7e,0xd, 0x3a,0xb, 0x16,0xb, +0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x6d,0x33,0x7e,0xd, 0x3a,0x79,0x30,0x0, 0x6, +0x22,0x7c,0xb7,0x62,0x3f,0x7e,0x2d,0x3a,0x2e,0x54,0x0, 0x6, 0xb, 0x2a,0x20,0x7d, +0x12,0xb, 0x14,0x1b,0x2a,0x10,0x7e,0xd, 0x3a,0x2d,0x12,0x39,0x70,0x0, 0x8, 0x7e, +0xd, 0x3a,0x69,0x50,0x0, 0x4, 0x69,0x20,0x0, 0x6, 0xbd,0x25,0x50,0x3, 0x2, 0x3, +0x82,0xb2,0x1, 0x7a,0xd, 0x34,0x7e,0x34,0x0, 0x2, 0x2, 0x3, 0x7f,0x7c,0xb6,0x1b, +0xb1,0x68,0x1d,0x14,0x68,0x1d,0xb, 0xb1,0x68,0x3, 0x2, 0x3, 0x82,0x30,0x1, 0x6, +0x7e,0x8, 0x0, 0x44,0x80,0x4, 0x7e,0x8, 0x1, 0x50,0x7a,0xd, 0x3a,0x2, 0x2, 0xf3, +0x2, 0x2, 0xfb,0xa, 0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, +0x20,0x2f,0x12,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x1d,0x3a,0x7a,0x1d,0x34, +0xd2,0x2, 0x7e,0x34,0x0, 0x1, 0x2, 0x3, 0x7f,0xbe,0x60,0x1, 0x68,0x9, 0xa5,0xbe, +0x2, 0x5, 0x7a,0x71,0x3e,0xd2,0x3, 0xd2,0x2, 0x22,0x75,0xe6,0x0, 0xe4,0x7e,0x34, +0x1, 0x4, 0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x5, 0x7a,0x1b,0xb0, +0x7e,0x34,0x1, 0x8, 0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x9, 0x7a,0x1b,0xb0,0xd2,0x4, +0x22,0xa5,0xbe,0x1, 0x4, 0x7a,0x71,0x38,0x22,0xa5,0xbe,0x2, 0x2, 0x80,0x3, 0x2, +0x3, 0x82,0x7a,0x71,0x23,0x22,0x7a,0x71,0x33,0x22,0xd2,0x2, 0x22,0x7c,0xb6,0x1b, +0xb1,0x68,0x18,0x14,0x68,0x1c,0x14,0x68,0x31,0x14,0x68,0x3a,0xb, 0xb2,0x68,0x3, +0x2, 0x3, 0x82,0xa, 0x37,0x7d,0x3, 0x6d,0x11,0x80,0x59,0xa, 0x57,0x7c,0xab,0xe4, +0x80,0x2, 0xa, 0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x2f,0x12,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x22,0x7c,0x67,0x6c,0x77,0x7e,0xd, +0x3a,0x79,0x30,0x0, 0x4, 0x22,0xa, 0x27,0x7e,0xd, 0x3a,0xb, 0x16,0xb, 0xa, 0x30, +0x2d,0x32,0x1b,0xa, 0x30,0x7e,0x34,0x0, 0x3, 0x80,0x44,0x7e,0x34,0x0, 0x4, 0x7a, +0x35,0x2f,0x75,0x3f,0x0, 0x22,0x1b,0x61,0x68,0x15,0xb, 0x60,0x78,0x34,0x7c,0x27, +0x6c,0x33,0x6d,0x0, 0x7e,0x1d,0x3a,0x79,0x11,0x0, 0x2, 0x1b,0x1a,0x0, 0x22,0xa, +0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x2f,0x12,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0xe4,0x7a,0xb3,0x2, 0xe4,0x7e,0x34,0x0, 0x5, 0x7a, +0x35,0x2f,0x22,0x75,0x84,0x1, 0x7e,0x44,0x1f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44, +0x78,0xf9,0x7e,0xf8,0x2, 0xe8,0xd2,0x7, 0xc2,0x8, 0x75,0x3f,0x0, 0x75,0x40,0x87, +0x75,0x41,0xa6,0x75,0x42,0x0, 0x75,0x43,0x0, 0xd2,0x0, 0xc2,0x2, 0xc2,0x3, 0xc2, +0x4, 0x75,0x22,0x0, 0x75,0x23,0x0, 0x75,0x24,0x80,0x75,0x2f,0x0, 0x75,0x30,0x0, +0x75,0x31,0x0, 0x75,0x32,0x0, 0x75,0x33,0x0, 0x75,0x38,0xb, 0x75,0x39,0x0, 0x75, +0x3e,0x1, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0xf, 0x50,0xb, 0xa, 0x40,0x5d,0x44,0x68, +0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29, +0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x4, 0x20,0xff,0xff, +0x56,0x30,0x2e,0x35,0x4a,0x75,0x6c,0x20,0x32,0x33,0x20,0x32,0x30,0x31,0x36,0x0, +0x46,0x54,0x53,0x38,0x37,0x31,0x36,0x5f,0x70,0x72,0x61,0x6d,0x62,0x6f,0x6f,0x74, +0x12,0xe, 0x63,0x2, 0x5, 0xbc,0x7e,0x35,0x2f,0x1b,0x34,0x68,0x60,0x1b,0x35,0x78, +0x3, 0x2, 0x4, 0xbc,0x1b,0x34,0x78,0x3, 0x2, 0x4, 0xe6,0x1b,0x34,0x78,0x3, 0x2, +0x5, 0x96,0x2e,0x34,0x0, 0x3, 0x68,0x3, 0x2, 0x5, 0xa8,0x6d,0x33,0x7a,0x35,0x2f, +0x7a,0x35,0x31,0x30,0x7, 0x5, 0x12,0x0, 0x2e,0xc2,0x7, 0x7e,0xd, 0x34,0x69,0x30, +0x0, 0x4, 0x7a,0x35,0x14,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x2e,0x14,0x0, 0x8, +0x12,0x0, 0x46,0xd2,0x7, 0x7e,0x2d,0x34,0x69,0x12,0x0, 0x4, 0x69,0x32,0x0, 0x2, +0xb, 0x2a,0x20,0x12,0xb, 0xe2,0x2e,0x34,0x10,0x0, 0x2, 0x5, 0x91,0x6d,0x33,0x7a, +0x35,0x2f,0x7e,0x34,0x1, 0x0, 0x7a,0x35,0x15,0x7e,0xd, 0x34,0x69,0x30,0x0, 0x2, +0xb, 0xa, 0x20,0x2e,0x14,0x0, 0x8, 0x12,0xe, 0xf2,0x20,0x0, 0x3, 0x2, 0x5, 0xa8, +0x7e,0x1d,0x34,0x29,0xb1,0x0, 0x8, 0xf5,0x91,0x2, 0x5, 0xa8,0x6d,0x33,0x7a,0x35, +0x2f,0x7a,0x35,0x31,0x7e,0x18,0x0, 0x3f,0x7a,0x1d,0xe, 0x7e,0xd, 0x34,0x69,0x30, +0x0, 0x2, 0xb, 0xa, 0x20,0x69,0x10,0x0, 0x4, 0x12,0x7, 0x62,0x12,0x0, 0x2e,0x7e, +0x34,0xf0,0x55,0x2, 0x5, 0x91,0x7e,0x18,0x10,0x0, 0x7a,0x1d,0x8, 0xd2,0x5, 0x6d, +0x33,0x7a,0x35,0x2f,0x7a,0x35,0x31,0xe5,0x38,0xb4,0xa, 0x17,0xe5,0x24,0xb4,0x80, +0xc, 0xe4,0x12,0xc, 0xd1,0x74,0x1, 0x12,0xc, 0xd1,0x2, 0x5, 0x7f,0x12,0x8, 0xa4, +0x2, 0x5, 0x7f,0xe5,0x38,0xb4,0xb, 0x27,0xe5,0x24,0xb4,0x80,0x11,0x7e,0xf0,0x1, +0x7c,0xbf,0x12,0x5, 0xc3,0xb, 0xf0,0xbe,0xf0,0x11,0x78,0xf4,0x80,0x51,0x7e,0xf0, +0x4, 0x7c,0xbf,0x12,0x5, 0xc3,0xb, 0xf0,0xbe,0xf0,0x40,0x78,0xf4,0x80,0x40,0xe5, +0x38,0xa, 0x3b,0x9e,0x34,0x0, 0x80,0x7c,0xe7,0xe5,0x24,0xb4,0x80,0x10,0xa, 0x3e, +0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x8, 0x80,0xe, 0xa, 0x3e, +0x6d,0x22,0x74,0xa, 0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x8, 0x6c,0xdd,0x80,0x9, +0x7c,0xbe,0x12,0x5, 0xc3,0xb, 0xe0,0xb, 0xd0,0xe5,0x23,0xbc,0xbd,0x38,0xf1,0x7e, +0x1d,0x8, 0x12,0xe, 0xd, 0x92,0x5, 0x12,0x0, 0x2e,0x30,0x5, 0x1b,0x7e,0x34,0xf0, +0xaa,0x7a,0x35,0x31,0x80,0x12,0x6d,0x33,0x7a,0x35,0x2f,0x7a,0x35,0x31,0x7e,0xd, +0x34,0x69,0x30,0x0, 0x2, 0x12,0x6, 0x98,0x30,0x4, 0x11,0x7e,0x34,0x13,0x88,0x12, +0xe, 0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0x75,0xe9,0xff,0x30,0x8, 0x3, 0x2, +0x4, 0x26,0x22,0xca,0xf8,0x7c,0xfb,0xe5,0x24,0xb4,0x80,0x4a,0xd2,0x6, 0x12,0xe, +0xdf,0x74,0x20,0xca,0xb8,0xa, 0x3f,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb, +0xda,0xb8,0x12,0xd, 0xb3,0xa9,0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, +0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4, +0x38,0x6, 0x12,0xf, 0x4d,0x2, 0x6, 0x95,0xc2,0x86,0x7e,0x34,0x13,0x88,0x12,0xe, +0x86,0xd2,0x86,0x2, 0x6, 0x95,0x74,0x1, 0x12,0xa, 0x21,0x74,0x1, 0x6d,0x33,0x12, +0xc, 0x86,0xe4,0x12,0xa, 0x89,0x5e,0x34,0x80,0x0, 0x7c,0x4f,0x6c,0x55,0x3e,0x24, +0x4d,0x32,0x12,0xc, 0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, 0x86,0x7e,0x34,0x0, 0x50, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x51, +0x12,0xc, 0x86,0x7e,0x34,0xa2,0x1c,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x11, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x10, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, +0x86,0x7e,0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, 0x21,0x74,0x4, 0x7e,0x34, +0xff,0xf7,0x12,0xc, 0x86,0xda,0xf8,0x22,0xca,0xf8,0xe4,0x7a,0xb3,0x2, 0xe4,0xe5, +0x24,0xbe,0xb0,0x80,0x68,0x9, 0x74,0x1, 0x7a,0xb3,0x2, 0xe4,0x2, 0x7, 0x5f,0xbe, +0x34,0xff,0xff,0x68,0x6, 0xbe,0x34,0x0, 0x12,0x50,0x4, 0x7e,0x34,0x0, 0x12,0x7d, +0x13,0x6d,0x0, 0x74,0xc, 0x2f,0x0, 0x14,0x78,0xfb,0x7a,0xd, 0xc, 0x7c,0xb7,0x12, +0x5, 0xc3,0x7e,0x1d,0xc, 0x12,0xe, 0xd, 0xe4,0x33,0x7c,0xfb,0xbe,0xf0,0x1, 0x78, +0xa, 0x7e,0xb3,0x2, 0xe4,0x44,0x2, 0x7a,0xb3,0x2, 0xe4,0x6c,0xaa,0xa, 0x3a,0x19, +0xa3,0x2, 0xdc,0xb, 0xa0,0xbe,0xa0,0x8, 0x78,0xf3,0x7e,0x34,0x0, 0x8, 0x7a,0x35, +0x14,0x7e,0x1d,0xc, 0x7e,0x8, 0x2, 0xdc,0x12,0x0, 0x46,0x6c,0xaa,0xe4,0xa, 0x4a, +0x19,0xb4,0x2, 0xdc,0xb, 0xa0,0xbe,0xa0,0x8, 0x78,0xf3,0x7e,0x34,0x0, 0x8, 0x7a, +0x35,0x15,0x7e,0x1d,0xc, 0x7e,0x8, 0x2, 0xdc,0x12,0xe, 0xf2,0x7e,0xf0,0x1, 0x6c, +0xaa,0xa, 0x3a,0x9, 0xb3,0x2, 0xdc,0xbc,0xba,0x68,0x4, 0x6c,0xff,0x80,0x7, 0xb, +0xa0,0xbe,0xa0,0x8, 0x40,0xeb,0xbe,0xf0,0x1, 0x78,0xa, 0x7e,0xb3,0x2, 0xe4,0x44, +0x4, 0x7a,0xb3,0x2, 0xe4,0x7e,0xb3,0x2, 0xe4,0x44,0x1, 0x7a,0xb3,0x2, 0xe4,0xda, +0xf8,0x22,0xca,0x3b,0x7a,0x15,0xc, 0x7f,0x31,0x75,0x12,0x0, 0x7e,0x35,0xc, 0xbe, +0x34,0x0, 0x0, 0x38,0x4f,0x7e,0x34,0xff,0xff,0x7a,0x35,0xc, 0x75,0x12,0x1, 0x80, +0x43,0x7e,0x34,0x0, 0x80,0x7a,0x35,0x15,0x7f,0x13,0x7e,0x8, 0x2, 0x5c,0x12,0xe, +0xf2,0x7e,0x35,0xc, 0x9e,0x34,0x0, 0x80,0x7a,0x35,0xc, 0x2e,0x38,0x0, 0x80,0x6d, +0x33,0x7a,0x35,0x13,0x7e,0x35,0x13,0x9, 0x63,0x2, 0x5c,0x7e,0xd, 0xe, 0x7e,0xb, +0x70,0x6c,0x76,0x7a,0xb, 0x70,0x7e,0x35,0x13,0xb, 0x34,0x7a,0x35,0x13,0xbe,0x34, +0x0, 0x80,0x78,0xe0,0x7e,0x35,0xc, 0xbe,0x34,0x0, 0x80,0x38,0xb4,0xe5,0x12,0x60, +0x5, 0xb, 0x34,0x7a,0x35,0xc, 0x7e,0x35,0xc, 0x7a,0x35,0x15,0x7f,0x13,0x7e,0x8, +0x2, 0x5c,0x12,0xe, 0xf2,0x6d,0x33,0x80,0x17,0x7e,0x35,0x13,0x9, 0x63,0x2, 0x5c, +0x7e,0xd, 0xe, 0x7e,0xb, 0x70,0x6c,0x76,0x7a,0xb, 0x70,0x7e,0x35,0x13,0xb, 0x34, +0x7a,0x35,0x13,0x7e,0x35,0xc, 0xbe,0x35,0x13,0x38,0xde,0xda,0x3b,0x22,0xca,0x3b, +0x7f,0x30,0x7c,0xb6,0xf5,0x1a,0x7c,0xb7,0xf5,0x1b,0x74,0x1, 0x7e,0x35,0x18,0x1e, +0x34,0x1b,0x34,0x4e,0x60,0x80,0x12,0xc, 0x86,0x12,0xa, 0x21,0xa9,0xc2,0xb4,0xa9, +0xc6,0xb3,0x75,0xb5,0x2, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x85,0x1a,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x85,0x1b,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x6d,0x33,0x80,0x2a,0x7f,0x13, +0x2e,0x35,0x1c,0x7e,0x1b,0xb0,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e, +0x35,0x1c,0x5e,0x34,0x0, 0x1, 0xbe,0x34,0x0, 0x1, 0x78,0x7, 0x7e,0x34,0x0, 0x78, +0x12,0xe, 0x86,0x7e,0x35,0x1c,0xb, 0x34,0x7a,0x35,0x1c,0x7e,0x35,0x18,0xbe,0x35, +0x1c,0x38,0xcb,0xa9,0xd2,0xb4,0x7e,0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, +0x21,0xda,0x3b,0x22,0xe5,0x24,0xb4,0x80,0x16,0xd2,0x6, 0x12,0xe, 0xdf,0xa9,0xc2, +0xb4,0x74,0x60,0x12,0xf, 0x27,0xa9,0xd2,0xb4,0x12,0xe, 0xca,0x40,0xfb,0x22,0x74, +0x1, 0x12,0xa, 0x21,0xe4,0x6d,0x33,0x12,0xc, 0x86,0x74,0x1, 0x6d,0x33,0x12,0xc, +0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, 0x86,0x7e,0x34,0x0, 0x54,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x55,0x12,0xc, 0x86,0x7e, +0x34,0xa2,0x1c,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x15,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0xa0,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x14,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x4, 0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, 0x21,0x74,0x4, 0x7e,0x34,0xff,0xf7, +0x2, 0xc, 0x86,0x7c,0x7b,0x7e,0xa0,0xef,0xe5,0x22,0x24,0xfd,0x68,0x3c,0x1b,0xb1, +0x68,0x26,0x24,0x9f,0x68,0x41,0x1b,0xb2,0x68,0x42,0x24,0x9e,0x68,0x39,0x24,0xe3, +0x68,0x52,0x24,0x59,0x78,0x52,0xa5,0xbf,0x0, 0x5, 0x7e,0xa1,0x40,0x80,0x49,0xa5, +0xbf,0x1, 0x45,0x7e,0xa1,0x41,0x80,0x40,0xa5,0xbf,0x0, 0x5, 0x7e,0xa1,0x24,0x80, +0x37,0xa5,0xbf,0x1, 0x33,0x7e,0xa1,0x3e,0x80,0x2e,0xa, 0x17,0x7e,0x1d,0x3a,0x2d, +0x31,0x29,0xa1,0x0, 0x8, 0x80,0x21,0x7e,0xa1,0x3f,0x80,0x1c,0xa5,0xbf,0x0, 0x9, +0x7e,0x35,0x31,0xa, 0x56,0x7c,0xab,0x80,0xf, 0xa5,0xbf,0x1, 0xb, 0x7e,0x55,0x31, +0x7c,0xab,0x80,0x4, 0x7e,0xa3,0x2, 0xe4,0x7c,0xba,0x22,0xca,0x79,0x6c,0xee,0x7e, +0xf0,0x70,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x30,0x8, 0x31,0x7e,0x34,0x0, 0x2, +0x7a,0x35,0x15,0x9f,0x11,0x7e,0x8, 0x0, 0xc, 0x12,0xe, 0xf2,0xe5,0xc, 0xbe,0xb0, +0xff,0x68,0x1a,0xe5,0xc, 0x60,0x16,0xe5,0xd, 0xa, 0x2b,0xe5,0xc, 0xa, 0x3b,0x2d, +0x32,0xbe,0x34,0x0, 0xff,0x78,0x6, 0x7e,0xf1,0xc, 0x7e,0xe0,0x1, 0x4c,0xee,0x78, +0x1c,0xa9,0xd1,0xcb,0xd2,0xcc,0x12,0xc, 0x35,0x7c,0xfb,0xc2,0xcc,0xa9,0xc1,0xcb, +0xbe,0xf0,0x2, 0x40,0x5, 0xbe,0xf0,0xfd,0x28,0x3, 0x7e,0xf0,0x70,0x7c,0xbf,0x54, +0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xd2,0xad,0xda,0x79, +0x22,0xca,0x79,0xbe,0xb0,0x0, 0x28,0x2e,0x74,0x6, 0x12,0xa, 0x89,0x7d,0x73,0x6c, +0xff,0x7e,0xf0,0xa5,0x7d,0x37,0x12,0xc, 0x86,0x6c,0xff,0x7e,0xf0,0xf, 0x7d,0x37, +0x12,0xc, 0x86,0x6c,0xff,0x7e,0xf0,0x6a,0x7d,0x37,0x12,0xc, 0x86,0x7e,0x34,0x0, +0x5, 0x12,0xe, 0x86,0x80,0x30,0x74,0x1, 0x7e,0x34,0xdf,0xff,0x12,0xc, 0x86,0x74, +0x6, 0x12,0xa, 0x89,0x7d,0x73,0x6c,0xff,0x7d,0x37,0x12,0xc, 0x86,0x7d,0x37,0x12, +0xc, 0x86,0x7d,0x37,0x12,0xc, 0x86,0x74,0x2, 0x12,0xa, 0x89,0x7d,0x73,0x4e,0xf0, +0x1, 0x7d,0x37,0x12,0xc, 0x86,0xda,0x79,0x22,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x75, +0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c, +0x55,0xa, 0x3a,0x4d,0x32,0x22,0x7f,0x70,0xd2,0x6, 0x12,0xe, 0xdf,0x74,0x2, 0x12, +0xd, 0xb3,0x6d,0x33,0x80,0x12,0x7f,0x7, 0x2d,0x13,0x7e,0xb, 0xb0,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xb, 0x34,0x7e,0x25,0x18,0xbd,0x23,0x38,0xe7,0xa9, +0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, 0x7e,0x35,0x42,0xbe,0x34,0x1, +0xf4,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4,0x38,0x3, 0x2, 0xf, 0x4d,0xc2, +0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0xd2,0x86,0x22,0xa9,0xd1,0xcb,0xd2,0xcc, +0x7e,0x34,0x0, 0x4, 0x7e,0x8, 0x2, 0x5c,0x74,0xc, 0x12,0xb, 0x8f,0xa9,0xd1,0xcb, +0xc2,0xcc,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0x8, 0x2, 0x5c,0x2d,0x13,0xb, +0xa, 0x30,0x7d,0x23,0x7c,0x45,0x6c,0x55,0xa, 0x36,0x4d,0x32,0x1b,0xa, 0x30,0xb, +0xa0,0xbe,0xa0,0xc, 0x78,0xde,0x7e,0x37,0x2, 0x6c,0x7d,0x23,0xa, 0x54,0x7c,0xa7, +0xb4,0xe7,0xb, 0xbe,0xa0,0x16,0x78,0x6, 0x75,0x40,0xe7,0x75,0x41,0xa6,0x22,0x7e, +0x24,0x0, 0x1, 0x7e,0x7f,0x2, 0xe5,0x79,0x27,0x0, 0x6, 0x7e,0x7f,0x2, 0xe5,0x69, +0x27,0x0, 0x6, 0x4d,0x22,0x78,0xf4,0x5e,0x60,0x7f,0x1b,0x7a,0x30,0x7e,0x1f,0x2, +0xe5,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6c,0xaa,0x80,0x20,0x6d,0x44,0x7e, +0x1f,0x2, 0xe5,0x1b,0x1a,0x40,0x7e,0x1f,0x2, 0xe5,0x69,0x41,0x0, 0x8, 0x4d,0x44, +0x68,0xf4,0x69,0x41,0x0, 0x2, 0x1b,0xa, 0x40,0xb, 0x15,0xb, 0xa0,0xbc,0xba,0x38, +0xdc,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31, +0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50, +0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, +0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40, +0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31, +0x7d,0x10,0x6d,0x0, 0x22,0x7e,0x34,0x0, 0x2, 0x7e,0xf, 0x2, 0xe5,0x79,0x30,0x0, +0x4, 0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x2, 0xe5,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x2, +0xe5,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7e,0x34,0x0, 0x4, 0x1b,0xa, 0x30, +0x7e,0xf, 0x2, 0xe5,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, +0x30,0x7e,0x1f,0x2, 0xe5,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x51,0x0, +0x2, 0x5e,0x54,0x0, 0xfe,0x22,0x7d,0x23,0xa, 0x36,0x7c,0xa5,0xa9,0xc2,0xb4,0xa9, +0xc6,0xb3,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4, +0x22,0x7c,0xab,0xd2,0x6, 0x12,0xe, 0xdf,0x74,0xd8,0xa, 0x3a,0x7d,0x23,0x6d,0x33, +0x12,0xd, 0xb3,0xa9,0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, 0x7e,0x35, +0x42,0xbe,0x34,0x5, 0xdc,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x5, 0xdc,0x38,0x3, +0x2, 0xf, 0x4d,0xc2,0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0xd2,0x86,0x22,0xca, +0x2b,0xca,0x1b,0xca,0xb, 0xd2,0x0, 0x30,0x90,0x1c,0xc2,0x90,0x7e,0x71,0x91,0xe5, +0x39,0x70,0x3, 0x7a,0x71,0x22,0xe5,0x39,0x12,0x1, 0x20,0x5, 0x39,0x30,0x2, 0x6, +0xe4,0x12,0x9, 0x33,0xf5,0x91,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x39,0xe5,0x39,0x12, +0x9, 0x33,0xf5,0x91,0xda,0xb, 0xda,0x1b,0xda,0x2b,0x32,0xd2,0x6, 0x12,0xe, 0xdf, +0xa9,0xc2,0xb4,0x74,0x9f,0x12,0xf, 0x27,0x12,0xf, 0xe, 0xa9,0xd2,0xb4,0x60,0x3, +0xb4,0xff,0x1a,0x75,0x24,0x81,0xa9,0xd5,0xca,0xa9,0xd0,0xca,0x75,0xed,0x9f,0x75, +0xad,0x20,0xa9,0xd1,0xea,0xa9,0xc1,0xea,0x74,0x1, 0x2, 0xd, 0xe0,0x2, 0xd, 0x80, +0xd2,0x6, 0x12,0xe, 0xdf,0xa9,0xc2,0xb4,0x74,0x5, 0x12,0xf, 0x27,0x12,0xf, 0xe, +0x7c,0xab,0xa9,0xd2,0xb4,0xd2,0x6, 0x12,0xe, 0xdf,0x5e,0xa0,0xe3,0xa9,0xc2,0xb4, +0x74,0x1, 0x12,0xf, 0x27,0x7c,0xba,0x12,0xf, 0x27,0xa9,0xd2,0xb4,0x12,0xe, 0xca, +0x40,0xfb,0x22,0x7c,0xab,0x7d,0x12,0x7c,0xb3,0xf5,0x1c,0x7c,0x36,0x7c,0x25,0xa, +0x4, 0x7c,0xb3,0xf5,0x1b,0x7c,0xb7,0xf5,0x1a,0xa9,0xc2,0xb4,0x7c,0xba,0x12,0xf, +0x27,0xe5,0x1c,0x12,0xf, 0x27,0xe5,0x1b,0x12,0xf, 0x27,0xe5,0x1a,0x2, 0xf, 0x27, +0xca,0xf8,0x7c,0xfb,0xe5,0x24,0xb4,0x81,0x21,0x74,0x2, 0x12,0xa, 0x89,0x4c,0xff, +0x78,0x8, 0xa9,0xc0,0xca,0x5e,0x70,0xdf,0x80,0x6, 0xa9,0xd0,0xca,0x4e,0x70,0x20, +0x74,0x2, 0x12,0xc, 0x86,0x74,0x2, 0x12,0xa, 0x89,0xda,0xf8,0x22,0xd2,0x6, 0x7e, +0x14,0x0, 0x8, 0x7a,0x15,0x15,0x7e,0x8, 0x2, 0xdc,0x12,0xe, 0xf2,0x6c,0xaa,0xa, +0x3a,0x9, 0xb3,0x2, 0xdc,0xbe,0xb0,0xff,0x68,0x4, 0xc2,0x6, 0x80,0x7, 0xb, 0xa0, +0xbe,0xa0,0x8, 0x40,0xea,0xa2,0x6, 0x22,0x7d,0x52,0xf5,0x19,0x7c,0xb6,0x7c,0xa5, +0xa, 0x44,0xf5,0x18,0x7f,0x21,0xf5,0x17,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xf, 0x27, +0xe5,0x19,0x12,0xf, 0x27,0xe5,0x18,0x12,0xf, 0x27,0xe5,0x17,0x12,0xf, 0x27,0xe4, +0x2, 0xf, 0x27,0x12,0xe, 0xa9,0x12,0xb, 0x3b,0xa9,0xa6,0x94,0xb3,0x92,0x8, 0x30, +0x8, 0x6, 0x12,0xf, 0x1b,0x12,0xd, 0x4b,0x12,0x9, 0xab,0x12,0xf, 0x0, 0xd2,0xaf, +0x30,0x3, 0xfd,0x2, 0xf, 0x45,0x80,0x18,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe5,0x3e,0x70,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xe0,0x22,0xd2,0xcf,0x85,0x3e,0xcc,0x75,0xec, +0xff,0x75,0xee,0xff,0x75,0xeb,0x3, 0x75,0xac,0xc0,0xa9,0xc5,0xca,0x75,0xed,0xf, +0x75,0xad,0xb0,0xa9,0xd7,0x94,0xa9,0xd4,0x94,0x22,0xa9,0xc2,0xb4,0x74,0x5, 0x12, +0xf, 0x27,0x12,0xf, 0xe, 0xa9,0xd2,0xb4,0x30,0xe0,0x2, 0xd3,0x22,0xc3,0x22,0xa9, +0xc2,0xb4,0x30,0x6, 0x4, 0x74,0x6, 0x80,0x2, 0x74,0x4, 0x12,0xf, 0x27,0xa9,0xd2, +0xb4,0x22,0x12,0xe, 0x38,0x7e,0x35,0x15,0x12,0x0, 0xe, 0xa9,0xd2,0xb4,0xd3,0x22, +0xc2,0x8c,0x43,0x89,0x2, 0x75,0x8c,0x1, 0x75,0x8a,0x0, 0xd2,0xa9,0x22,0x75,0xb5, +0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x22,0xd2,0xc8,0x75,0xb3,0x13, +0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x22,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xd3,0x22,0xc2,0x8c,0x6d,0x33,0x7a,0x35,0x42,0xd2,0x8c,0x22,0x7e,0x35,0x42,0xb, +0x34,0x7a,0x35,0x42,0x22,0x85,0x3e,0xcc,0xe5,0x3e,0x2, 0xd, 0xe0,0x2, 0xf, 0x3c, +0x0, 0x1, 0x2, 0xe4,0x0, 0x0, 0x4, 0x2, 0xe5,0x0, 0x0, 0x9c,0x0, 0x0, 0x0, 0xff, diff --git a/drivers/input/touchscreen/GT915L/FW_BIEL.txt b/drivers/input/touchscreen/GT915L/FW_BIEL.txt new file mode 100644 index 0000000000000..17543129fde2c --- /dev/null +++ b/drivers/input/touchscreen/GT915L/FW_BIEL.txt @@ -0,0 +1,11265 @@ + 0x00,0x01,0x60,0x00,0x39,0x31,0x35,0x4C,0x00,0x00,0x00,0x00,0x80,0x02,0x80,0x00, + + 0x55,0x40,0xBD,0xDA,0xFD,0x24,0x34,0xDF,0x44,0x40,0xAF,0xF7,0x3A,0x7D,0xC8,0xB4, + + 0x25,0x41,0x8C,0x90,0x10,0xFB,0x22,0xB7,0xED,0x5E,0x08,0xB0,0x59,0x95,0x01,0x88, + + 0x86,0x02,0x72,0xFC,0x81,0xD9,0x39,0x25,0xC8,0xE2,0x39,0x87,0x57,0x45,0x09,0x05, + + 0x87,0x03,0xE9,0xD5,0x5F,0x2E,0x23,0xB6,0x6D,0x4B,0x36,0x4B,0x0C,0x9E,0x77,0xA2, + + 0x69,0x0B,0xB8,0x76,0xC3,0x50,0x10,0x13,0xC6,0x75,0xEA,0x3F,0xE5,0xE9,0x77,0xF5, + + 0xF8,0x0D,0xF5,0x4A,0xB0,0xA0,0x89,0x83,0xCF,0x48,0x48,0xDE,0x53,0x49,0x40,0x3E, + + 0xFE,0xF9,0xB9,0x77,0xE2,0xB9,0x2F,0x67,0x2B,0x22,0xFA,0x8E,0x62,0x22,0xCF,0xDB, + + 0x80,0xC7,0xDA,0xAF,0x07,0x28,0x27,0x93,0x6F,0x4A,0xAC,0x75,0xC8,0x30,0xC0,0xAC, + + 0x2C,0x48,0x98,0x22,0x39,0xB8,0x96,0xDE,0xC8,0x68,0x4D,0x24,0x76,0x2E,0x9A,0xBC, + + 0x2F,0x49,0xC2,0x8F,0xF8,0x26,0x3A,0x11,0xA8,0x2F,0xEA,0xE3,0xB6,0x28,0x4F,0x43, + + 0xC0,0xD3,0x43,0x5C,0x7B,0x2C,0xEB,0x21,0x17,0xC5,0x61,0xEB,0x7A,0x26,0xC8,0xD8, + + 0x2A,0x6E,0xEB,0xDD,0x5B,0x24,0xAF,0xD3,0x8A,0xAB,0x6E,0x3C,0x9D,0x5F,0x2C,0xAA, + + 0xAD,0x4D,0xFD,0x7E,0x6A,0xB3,0xC2,0xA8,0x52,0x71,0xD2,0x55,0xAB,0x18,0x24,0xBA, + + 0xBE,0x4C,0xE5,0x76,0xB8,0x59,0x22,0x70,0xAE,0x0C,0xF5,0x86,0xB2,0x62,0xEF,0xC3, + + 0x71,0xFE,0x7A,0x53,0x39,0xAB,0x45,0x6F,0x79,0x8A,0xAB,0x7F,0x07,0xB2,0xE3,0x8A, + + 0x7A,0x0C,0xB3,0x6F,0xE3,0xB3,0xAE,0x87,0xDF,0x72,0x76,0x96,0xE8,0x7D,0x04,0x80, + + 0x78,0xF8,0x25,0x21,0xAC,0xB3,0x74,0x61,0x40,0xDD,0x3F,0xBF,0xD3,0xF5,0xDE,0xB0, + + 0x26,0xE9,0xFA,0xD2,0x97,0x7D,0x6F,0x97,0x9E,0xDB,0x9C,0xB9,0x87,0x71,0x4F,0x28, + + 0x82,0x11,0x2E,0xFA,0x65,0x7C,0xCE,0xA0,0x6E,0x5B,0x06,0x5B,0xD4,0xE5,0x02,0x1D, + + 0x24,0xE6,0xF9,0x68,0x8F,0x71,0xCA,0x11,0x08,0x63,0x88,0xCA,0x29,0x7C,0x27,0x3A, + + 0xA2,0x74,0x97,0x3E,0x87,0xB1,0xF0,0x4C,0x89,0x30,0x95,0x9B,0x0E,0x8B,0x22,0xC5, + + 0xAE,0x98,0xB3,0xA6,0x41,0xAA,0xE8,0x12,0x47,0x5F,0x08,0x0F,0x82,0x16,0x85,0xC0, + + 0x6F,0x15,0xD2,0x9B,0xD8,0x39,0x6C,0x03,0x0B,0x59,0x6E,0x40,0x05,0xCB,0xAA,0x2E, + + 0x42,0xC1,0x5D,0x24,0x10,0x27,0x58,0x9A,0x8B,0x13,0xA6,0xBE,0xDD,0x4B,0xC6,0x58, + + 0xD1,0x03,0x82,0x87,0xC4,0x1B,0x5C,0x35,0x9F,0xD5,0xB4,0x53,0x80,0x77,0x71,0x1A, + + 0xA1,0x11,0x5E,0x18,0x31,0xCD,0x9D,0xE7,0x2A,0x55,0xC0,0x5E,0x69,0x84,0xF8,0xFB, + + 0x4F,0x04,0x47,0x8C,0x64,0xCF,0xF3,0x8E,0xC9,0x7A,0x07,0xDF,0x29,0x65,0xD0,0xDB, + + 0xDE,0xE3,0x50,0x95,0x3E,0x3C,0x09,0xDB,0xC8,0x4E,0x08,0x42,0x0C,0x18,0xBD,0xEC, + + 0xE3,0x13,0x98,0xCA,0x3A,0xC1,0x7F,0x1E,0x7A,0x99,0x96,0x3B,0x32,0x0A,0x36,0x8B, + + 0x88,0x02,0x35,0x87,0x15,0x81,0x5B,0x93,0x03,0x19,0xE5,0x73,0x88,0x40,0x3E,0xEE, + + 0x0B,0x0F,0x50,0x32,0x4F,0x5D,0x2F,0xCD,0x54,0x81,0xEA,0x63,0xFB,0x9E,0x71,0xDF, + + 0xE1,0x5B,0xE4,0x78,0x6A,0x93,0x76,0x1F,0x02,0x50,0x3E,0x16,0xA7,0x61,0xB0,0xA6, + + 0x04,0xC0,0x08,0x38,0x91,0x20,0x22,0x3A,0xD5,0xAC,0x10,0x28,0xD8,0xED,0x28,0x12, + + 0x05,0xC1,0x68,0xD2,0x91,0xA7,0x32,0x12,0xD4,0xA5,0x28,0x99,0xA2,0xA1,0x21,0x1F, + + 0x84,0x82,0x7E,0x77,0xE3,0xA2,0xE5,0x71,0x87,0x32,0x21,0xE7,0xD0,0x0F,0x29,0x9F, + + 0x85,0x83,0xA1,0xB8,0xF6,0x83,0x31,0x23,0x26,0x09,0x05,0x13,0x4D,0xA7,0xDE,0x4B, + + 0xA0,0x2A,0xB1,0x77,0xB5,0x1B,0x66,0x64,0xF5,0x89,0x4F,0x5B,0xA9,0x39,0x52,0xC8, + + 0xF4,0x58,0xFB,0x0D,0x7D,0xAA,0xE8,0x01,0xCB,0x94,0x87,0x0C,0x79,0x7A,0x5B,0x04, + + 0x5C,0x39,0xDC,0x58,0x35,0x23,0x0F,0x81,0xD6,0x8B,0x25,0x99,0x2F,0x85,0x39,0x24, + + 0xCD,0xC0,0x92,0x38,0x43,0xA8,0x07,0x74,0x7E,0xA1,0x44,0xD2,0x68,0xE5,0x22,0x0A, + + 0x0C,0xC8,0xDA,0xC8,0xA8,0xE6,0x12,0x2B,0x09,0x07,0x13,0x29,0xBD,0x8E,0x2A,0x1A, + + 0x0D,0xC9,0xA3,0x1A,0x60,0x19,0x3E,0x3E,0x0D,0xD9,0x88,0x14,0xFE,0x15,0x23,0x2A, + + 0x8C,0x8A,0x14,0xE7,0x54,0x61,0xDC,0x59,0x4C,0xBA,0x23,0x50,0x04,0xE5,0x24,0x0D, + + 0x8D,0x8B,0x88,0xBE,0x45,0xE8,0x7B,0x1B,0xCC,0xCF,0x98,0xDD,0x3D,0xFA,0x0C,0x38, + + 0x83,0x7A,0xD0,0xB0,0xA6,0xA3,0x0C,0x88,0xE2,0xF1,0x1C,0x6B,0xC4,0xE4,0xAA,0x5B, + + 0xC2,0xE1,0x45,0x0D,0xBC,0x7C,0x7E,0xFB,0xA6,0x89,0x7D,0xB4,0xB6,0x60,0x9C,0x39, + + 0x58,0x51,0x5E,0x50,0x3D,0x2B,0x97,0x4F,0x7D,0xB9,0xF1,0x00,0x44,0x91,0x51,0xC0, + + 0x74,0x02,0xC4,0xF6,0x68,0x22,0x6E,0x88,0x4B,0x62,0x86,0x91,0xFB,0xF4,0x1E,0x60, + + 0x88,0x6E,0x0C,0x24,0xEB,0xEF,0x3C,0x08,0x85,0xB6,0x4F,0xDC,0x5A,0x6F,0x2C,0x6F, + + 0x25,0x1C,0x0C,0x85,0x1B,0xD5,0x88,0x58,0x84,0xB7,0xB4,0xA7,0x86,0x2C,0x5E,0x5D, + + 0x13,0x89,0x0D,0x34,0x7C,0x31,0x81,0x4D,0x05,0xB4,0x0E,0x3C,0x05,0xE4,0xD5,0x9B, + + 0x7A,0x0C,0x76,0x95,0xCA,0x33,0x89,0xF9,0x2C,0x97,0xDA,0x49,0xA9,0x5D,0x3C,0xC6, + + 0x6C,0xF0,0x44,0x63,0xFF,0xF0,0x75,0x04,0x42,0x29,0xCC,0x94,0xEF,0xAB,0xD8,0x38, + + 0x86,0x39,0x89,0xA5,0xB3,0xA3,0x87,0x89,0x5D,0x6A,0xA2,0x14,0x75,0x08,0x5D,0x6B, + + 0x05,0xD7,0x00,0xBC,0x20,0x2B,0xE0,0x1C,0x13,0x85,0xCF,0xBD,0x49,0xB7,0x15,0xE2, + + 0x04,0x98,0xE5,0xCF,0x5C,0xF3,0x46,0x5B,0x14,0x96,0x6A,0x08,0x02,0x94,0x78,0xA8, + + 0xF9,0x33,0x4E,0x2C,0x98,0x3F,0x1F,0xE4,0xA5,0xBC,0xCE,0xC5,0x9D,0x24,0x1E,0x6B, + + 0x14,0x89,0x06,0x3C,0xE2,0x36,0x10,0xBC,0xFC,0x85,0xC0,0x5C,0x88,0x7D,0x26,0xD0, + + 0xC7,0xAA,0x73,0xA9,0x52,0xD9,0x9E,0x49,0x40,0xC6,0xC8,0x8B,0x05,0xE5,0x71,0x90, + + 0xAD,0x30,0x6F,0x9F,0xEB,0x65,0x11,0xBC,0x78,0x25,0xAF,0x79,0xAF,0x24,0x58,0xCC, + + 0x64,0xD8,0x5D,0x41,0xC9,0x01,0xDA,0x95,0xF0,0x23,0x0D,0x95,0x50,0x43,0x56,0x90, + + 0x1D,0x92,0x95,0xC3,0xF4,0xB2,0x1B,0x01,0x9E,0xCB,0x2A,0xB4,0x7D,0x13,0x3F,0xCF, + + 0xE4,0xFA,0x06,0x34,0x4F,0x88,0xCC,0x65,0x19,0x63,0xDC,0x4A,0x2F,0xE2,0x56,0xFF, + + 0x11,0xBF,0x05,0xAD,0x6A,0xC0,0x04,0xDF,0x5E,0x2B,0x79,0x70,0x0E,0xA9,0x39,0x8B, + + 0x01,0x50,0xAE,0x03,0xD9,0x2F,0x80,0x42,0xB3,0x25,0xE8,0x35,0xB0,0xE1,0xE9,0xEA, + + 0xB0,0x37,0x28,0x5E,0xB2,0x44,0xE3,0x17,0xE0,0xBE,0x20,0xCE,0xDE,0xD7,0x3E,0x8E, + + 0x7B,0x9F,0xAF,0x02,0x01,0x8E,0x29,0xDA,0x6C,0x4F,0x97,0xDE,0xE3,0x48,0x70,0x0C, + + 0x4A,0x0C,0xA7,0x12,0x58,0x2C,0x89,0x57,0x32,0x53,0x91,0x2D,0xE2,0x55,0x50,0xB4, + + 0x04,0xCF,0x7A,0x03,0x1C,0x9B,0x6C,0xE4,0x44,0xCC,0xD8,0x6D,0x54,0xEC,0x70,0xF0, + + 0xEE,0x45,0xE8,0xBE,0x66,0x33,0xBF,0x06,0x4D,0x27,0x08,0x76,0x3B,0x0B,0xAE,0xC3, + + 0x02,0xDF,0x6D,0x3A,0x48,0xAD,0xC8,0xA1,0xA1,0x5D,0x77,0x8D,0x4C,0xAD,0xE1,0x71, + + 0x6A,0x9D,0x81,0x45,0xA0,0x51,0x13,0xCC,0x3C,0xF8,0xE6,0xE6,0xE3,0xEC,0xEB,0x7A, + + 0xD1,0x77,0xAC,0x0B,0x89,0x84,0xAA,0xD3,0x58,0x05,0x28,0xEB,0x9A,0x48,0x23,0xF3, + + 0x2D,0xF4,0x2E,0xDE,0x9D,0xA4,0x8A,0x4A,0xC7,0xD6,0xBA,0xA8,0xA8,0xC2,0x39,0x53, + + 0x3F,0x87,0x23,0x47,0xBC,0x24,0xE8,0x21,0x6D,0xB5,0xDB,0x0C,0xBF,0x4A,0x86,0xE6, + + 0x7C,0x53,0x6F,0xFB,0x89,0xA0,0x41,0x38,0x47,0xF4,0xE3,0x2C,0x39,0xEA,0x1A,0x18, + + 0x39,0x67,0x18,0xE8,0x38,0x2D,0xBE,0x1B,0x55,0xFA,0xF2,0x86,0x2B,0x7A,0xB5,0x26, + + 0x29,0xE0,0xF6,0x3E,0x96,0x36,0xDF,0x3F,0xAA,0xBB,0x7C,0x7E,0x51,0x76,0xFB,0xB7, + + 0x9A,0x43,0xC5,0x6D,0xB6,0x6E,0x93,0x39,0xB7,0x44,0xDB,0x7C,0xDC,0xE6,0xCD,0x1E, + + 0x6A,0xF9,0x2E,0x2B,0x51,0xCE,0x9B,0x29,0xC6,0x47,0xE5,0xF9,0x9A,0x15,0x7A,0x62, + + 0x95,0xC6,0xBA,0xF0,0xBD,0x52,0x6D,0x84,0x91,0x9F,0xF5,0xD2,0x87,0x1E,0x84,0x72, + + 0x90,0x87,0x94,0x85,0x5A,0xD0,0xA7,0x46,0x71,0xAC,0x7B,0x42,0xF1,0xF1,0x8D,0x63, + + 0x19,0xA4,0xFB,0xAD,0x59,0x2B,0x14,0xDA,0x07,0x42,0x72,0xE5,0xB8,0xAF,0x03,0x73, + + 0x85,0x0E,0x89,0x68,0xB5,0x30,0xE7,0x95,0x10,0x5C,0xA7,0x5D,0x63,0xBC,0x54,0xD9, + + 0x24,0x4F,0x8C,0xCD,0x01,0x42,0xEF,0x7A,0x95,0xE1,0x4B,0x24,0x68,0x18,0x15,0xA7, + + 0x84,0x05,0xAA,0xE1,0xD4,0x2E,0xE3,0x6B,0x00,0x51,0xD6,0xB1,0x70,0x77,0x25,0x01, + + 0xB2,0x9B,0x7F,0xA5,0xF2,0x5A,0x44,0x19,0xE2,0x38,0xEF,0x76,0x97,0x34,0xB5,0xD3, + + 0x8F,0x0C,0x28,0xA3,0x90,0x77,0x24,0x8D,0x71,0x5F,0x84,0x6F,0x1A,0x96,0x1E,0x95, + + 0xD9,0x74,0x90,0x89,0x1A,0x79,0xA2,0xD3,0xCB,0x3D,0xCF,0x26,0x9D,0x16,0x71,0xE6, + + 0x27,0xC6,0x22,0x74,0xFF,0xF4,0x66,0x9C,0x98,0x16,0x76,0x89,0x98,0xB6,0xC3,0x73, + + 0x51,0x78,0x04,0xFE,0xD4,0x85,0xAC,0x4B,0x44,0xA7,0xF5,0xA1,0xF9,0xFA,0xB0,0x1C, + + 0x56,0x05,0xE8,0x6B,0xAB,0xF6,0x1E,0xC2,0x4E,0x4B,0xCF,0x88,0xEF,0x60,0xBE,0x38, + + 0x2E,0x53,0x2E,0xE5,0x18,0x0D,0xD7,0x00,0x8F,0x11,0x44,0x1A,0x9F,0x10,0xF0,0x3E, + + 0x3B,0x52,0xC6,0x34,0xE3,0xF0,0x0D,0xFA,0x29,0x31,0x80,0xE5,0x77,0x3C,0x67,0xED, + + 0x4B,0x05,0xDD,0xBE,0xE9,0x35,0x40,0x0F,0xF8,0x13,0xB5,0xFC,0xFB,0x6E,0x16,0x3F, + + 0x0E,0xBE,0x97,0x70,0xBD,0xB7,0x65,0x6A,0xDB,0x1D,0xE5,0x15,0x29,0xB0,0xDB,0x79, + + 0x1D,0x3F,0xA4,0x81,0xB3,0xB0,0x6A,0x26,0xCA,0x1F,0xB6,0xDD,0xA1,0x8E,0x95,0x8D, + + 0xEE,0x8E,0xA9,0xE6,0x19,0xC7,0xA8,0x50,0xF6,0xA4,0xDD,0x40,0x34,0xC1,0x1A,0x4B, + + 0x77,0xC3,0xFB,0x03,0x1A,0xED,0x6B,0x26,0x4A,0x3D,0xD6,0x67,0xC6,0xF9,0x90,0x8D, + + 0x80,0x8C,0x51,0xE7,0xD5,0xC8,0x01,0xD8,0x69,0xCE,0xA1,0x3E,0xB2,0xA3,0x9F,0x30, + + 0xD0,0x5B,0x1A,0x79,0x73,0x7F,0xF4,0x42,0x22,0x2E,0x5C,0x14,0x9C,0x2D,0x56,0x9E, + + 0x01,0x0D,0x0F,0xD2,0x56,0x5C,0x1E,0x47,0xA0,0xCE,0x7E,0xF2,0x16,0x01,0xCD,0x3C, + + 0x4C,0xFC,0xE1,0x80,0x7F,0xDC,0xDD,0x8B,0x58,0x0B,0x31,0x37,0xB1,0xEC,0xB6,0x93, + + 0xC7,0x52,0xA1,0xC7,0x1A,0x2A,0xF9,0xB5,0xFF,0xC4,0xA0,0xF8,0xB0,0xB7,0x1F,0x91, + + 0x09,0x87,0x90,0x3F,0x98,0x07,0xCB,0x0D,0xED,0xB7,0xF3,0x5D,0x30,0x29,0x30,0x18, + + 0x9F,0x21,0x0E,0xED,0x91,0xE8,0x82,0xD1,0x5D,0x84,0xE3,0xB5,0xBA,0xFB,0x18,0x7B, + + 0x0C,0x96,0x03,0x7C,0x3F,0x09,0xA3,0x4D,0x73,0xDA,0x49,0x2D,0xC6,0x67,0x53,0x3F, + + 0x30,0x7D,0x91,0xEC,0xF1,0x54,0xC2,0x33,0x68,0xB7,0x41,0x3D,0xD7,0xF0,0xAB,0x75, + + 0x11,0x97,0x84,0x3A,0xE5,0x21,0x67,0x0A,0x48,0x44,0xAB,0xE1,0xBB,0xE7,0x22,0xCB, + + 0xFA,0xC2,0xB3,0xAE,0xBA,0x1B,0x01,0x72,0xEA,0x72,0x6A,0x39,0xB6,0x97,0x5A,0xCF, + + 0xCF,0xD6,0x81,0x4F,0x6D,0xC2,0x3E,0x83,0x27,0x83,0xF1,0x9E,0x86,0xAE,0x6A,0x24, + + 0x28,0x8C,0xD0,0xDB,0xDE,0x77,0xD7,0x04,0x15,0x30,0x9D,0x0B,0xD9,0x67,0x58,0xA6, + + 0x95,0x99,0xC6,0x86,0xD3,0xAB,0x8F,0x44,0x74,0x2D,0xD5,0xD5,0x18,0x31,0xD3,0xEC, + + 0x0B,0x4E,0x12,0x8A,0x17,0x10,0x1A,0xB5,0xC6,0xDF,0x3C,0xC4,0x92,0xEA,0xA2,0xFC, + + 0x29,0xF1,0xC3,0xF1,0xA4,0xB1,0xCD,0x87,0x54,0x96,0x4F,0xD4,0xA7,0xFB,0x12,0x36, + + 0x5E,0x0E,0x2D,0x51,0xD5,0xFD,0x99,0x71,0x61,0x91,0xDC,0xC1,0x7A,0x75,0xF2,0x24, + + 0x83,0xFA,0x7D,0x86,0x32,0xB0,0x7E,0x16,0x65,0xD6,0x64,0x64,0xFE,0x2C,0x56,0x34, + + 0x05,0x94,0x97,0xDE,0x92,0x0A,0x1A,0xDA,0xC0,0xC7,0x3C,0x26,0x63,0xF3,0x07,0xC2, + + 0xA7,0x94,0x6B,0x2F,0x5F,0xFB,0xD9,0x0B,0x03,0x9B,0xCD,0xB7,0x76,0xF9,0xE8,0x57, + + 0x90,0x91,0x41,0xA4,0xA8,0x01,0xC5,0x61,0xE7,0x98,0xD9,0xAB,0x56,0xFE,0xF2,0x70, + + 0xBF,0xB7,0xB0,0x66,0xF6,0x73,0x34,0x51,0x6A,0x58,0xB7,0xEE,0x38,0x75,0x94,0x61, + + 0x3D,0x54,0xBE,0xAB,0x76,0xA2,0xFE,0xAA,0x96,0x54,0x2E,0x9E,0x51,0x39,0xB7,0xFD, + + 0x5F,0x8A,0xA3,0x87,0xDB,0x2B,0x48,0x2F,0xAC,0x65,0x4D,0x5E,0xA4,0xDA,0xD4,0x93, + + 0x48,0x64,0xA3,0xF9,0x4A,0x10,0xE3,0xC9,0x63,0xBE,0xAF,0x97,0xF1,0xFA,0x2E,0xDE, + + 0x45,0x2C,0x99,0xBD,0x29,0x2A,0x2F,0x65,0x09,0x8C,0xF5,0x9D,0x0B,0x92,0x7E,0xFA, + + 0x2B,0xB0,0x55,0xAE,0xBF,0xA2,0x3B,0x99,0x85,0x9F,0x3E,0x2F,0x75,0xF9,0x65,0x8D, + + 0xDE,0xDF,0x9C,0x08,0x47,0x48,0x2E,0x64,0x0B,0xD5,0x95,0x9F,0xFD,0x5E,0xAF,0x7B, + + 0x83,0xDF,0xD4,0xAF,0x3F,0xA9,0x75,0x32,0xDC,0x29,0x44,0xFB,0xF8,0x92,0x5E,0xA5, + + 0xBE,0xAB,0x40,0xC4,0x8C,0x5B,0xBD,0xA6,0xE1,0xE6,0x12,0x7A,0xF4,0x8D,0x9E,0x63, + + 0x6D,0x6D,0xF7,0xE9,0x40,0xFA,0x20,0xA3,0x3D,0x4B,0xE1,0xCB,0xDC,0xE7,0x53,0x81, + + 0x61,0xAD,0x09,0xE9,0x90,0xAF,0x41,0xA3,0x5D,0x64,0x55,0x7B,0xDE,0x7C,0x6F,0x75, + + 0x80,0x43,0x3C,0x91,0xC4,0x49,0x9F,0x42,0xBD,0x4C,0x91,0x75,0xD5,0x98,0x60,0x54, + + 0xCA,0xF5,0xC8,0x41,0x14,0x67,0xD0,0xA4,0xEF,0x06,0xC9,0xE0,0x7A,0x1A,0x16,0xE8, + + 0x03,0xA1,0x08,0x91,0x69,0x26,0x56,0x83,0x06,0x9E,0xFC,0x12,0x8D,0x77,0x15,0x52, + + 0xA0,0x45,0x54,0xC1,0xA1,0x26,0xC1,0xAA,0x0A,0x49,0x11,0x41,0xA0,0x7D,0xD5,0xE8, + + 0x7B,0x44,0xDE,0x50,0x95,0x24,0x7D,0x8C,0x42,0x1C,0x61,0xEB,0xD2,0xC7,0x0E,0x24, + + 0xE1,0x61,0xB8,0xFF,0x28,0x85,0xA6,0x5B,0x6A,0x47,0x45,0x5E,0xAF,0xC3,0x9F,0xE9, + + 0x48,0xB8,0xC2,0x00,0x1F,0x21,0x64,0x3E,0xA8,0xCA,0x98,0xCF,0x69,0xC4,0x7C,0xF1, + + 0x88,0x71,0x92,0x4A,0x52,0x43,0x49,0xAF,0xA0,0xAB,0x02,0xD2,0x84,0xD7,0xBC,0xA9, + + 0x7D,0x68,0xFE,0x2D,0xC0,0x69,0xAA,0xCA,0x45,0x46,0x8A,0xFA,0x07,0x61,0x71,0xE9, + + 0x0C,0x5C,0xC2,0xC8,0x15,0x33,0xA7,0x85,0x48,0xF7,0xE8,0xEE,0xC3,0xC6,0x32,0x5C, + + 0xEB,0xD8,0x7F,0x2D,0xAF,0xA4,0xD7,0xE9,0x34,0x6D,0x1A,0x35,0x05,0x2F,0x88,0x3A, + + 0xA7,0xA5,0x18,0xF2,0xE5,0xB1,0x32,0x91,0x56,0x0C,0xAB,0xE9,0xBD,0x69,0x33,0x68, + + 0xE9,0xA0,0xF1,0xA6,0x9D,0xF7,0x9B,0x41,0x2F,0xB4,0xC1,0xA1,0xFB,0x3D,0x22,0x21, + + 0x5C,0xB4,0x92,0x20,0xDB,0xA1,0x16,0x53,0x58,0x3C,0x05,0xB5,0x40,0x74,0x5C,0xE7, + + 0x3D,0x7D,0x19,0xD3,0xD8,0x72,0x42,0x99,0x21,0xDC,0xE2,0x10,0x9A,0x40,0xD5,0x21, + + 0x49,0xE3,0xBB,0x24,0xC6,0x9D,0x77,0xB1,0xE3,0x32,0x7F,0xD7,0x1B,0x51,0x37,0x02, + + 0x83,0xBC,0x6A,0x66,0xC5,0x9E,0x63,0x9D,0x29,0x62,0xE3,0x9D,0x18,0x62,0x7C,0xFD, + + 0xDD,0x12,0xE0,0x84,0x3E,0x35,0x51,0x92,0x99,0x16,0x57,0xE0,0xFA,0x41,0xE0,0x55, + + 0xD4,0xE8,0xBE,0xD0,0x7D,0x2E,0x7C,0xE9,0x1C,0x35,0x05,0x5B,0x4C,0x77,0xE8,0xDE, + + 0x03,0xC5,0xD2,0x5D,0x5B,0x2C,0xDE,0x24,0xA8,0xE6,0x8C,0xFF,0x16,0xCC,0x89,0x2E, + + 0x21,0x6B,0x17,0xB3,0xDB,0x2E,0x9D,0xC9,0x07,0x15,0x72,0x9A,0x2E,0xAB,0x56,0xFA, + + 0xE2,0xE9,0xD2,0x12,0xD3,0x89,0x07,0xDB,0x58,0x36,0x3A,0x3F,0x55,0x72,0xA3,0x1A, + + 0x88,0xBF,0xF0,0xA5,0xD2,0xE8,0x20,0x90,0x67,0xF6,0x61,0xFB,0xB3,0x28,0x79,0xB4, + + 0x25,0x1C,0xD7,0xFA,0xF0,0xB7,0x75,0xA9,0xE9,0x6A,0x50,0x29,0xF9,0x4D,0x5F,0x1B, + + 0x34,0xEF,0xB1,0xB0,0x9B,0xD6,0x0E,0xA8,0xDD,0x5F,0x97,0x39,0x10,0x2A,0x22,0xB6, + + 0x89,0x79,0x06,0xED,0xA5,0x7E,0x0C,0xC6,0x15,0x1C,0x6F,0xB2,0xF8,0x78,0xE3,0xC7, + + 0x88,0x78,0x76,0x43,0x29,0x70,0xDD,0xFD,0x6D,0x17,0xA1,0x04,0x7B,0xD9,0xF8,0x2B, + + 0x4B,0x18,0x57,0x75,0x89,0xF5,0x97,0xD1,0x0E,0x5D,0x1F,0x8F,0xB9,0x8E,0x37,0xFD, + + 0x17,0x9C,0x2C,0x9D,0xB7,0xB2,0xE3,0x7B,0x6B,0xC7,0xC5,0x45,0x33,0xD6,0xE0,0x5A, + + 0x4F,0x0D,0xA8,0xBD,0x54,0xAF,0x68,0x36,0xC6,0xBC,0xA2,0xD6,0x05,0xA2,0x56,0x3A, + + 0xEC,0x90,0x04,0x64,0xDF,0x70,0x66,0x8A,0x45,0x65,0x35,0xB2,0x54,0x96,0x5F,0xA2, + + 0x6F,0xC1,0xA7,0x2F,0x14,0xDF,0x92,0x41,0x84,0xCD,0xB9,0x88,0x2F,0x69,0x85,0x80, + + 0xA8,0x89,0xD7,0xB3,0x74,0x05,0xA5,0x8A,0x3D,0x12,0xAE,0xCC,0xB6,0x5B,0x32,0x3C, + + 0x6C,0xE7,0x2C,0xC2,0x61,0x40,0xF0,0xE6,0x36,0x01,0xF5,0xE4,0xCF,0x9F,0x6C,0x5B, + + 0x85,0xF9,0xF0,0x3B,0xFE,0x6C,0x27,0x71,0x65,0xE4,0x3E,0xAA,0xD5,0xE1,0x1F,0xE6, + + 0xCE,0x67,0x81,0x45,0xEB,0xAB,0xB1,0x9E,0x88,0x84,0xC9,0x07,0xDA,0xA4,0xCA,0x31, + + 0x08,0x01,0x14,0xBB,0x97,0xCB,0xE8,0xF7,0x8F,0x54,0x72,0x15,0x28,0x85,0xA3,0x8E, + + 0x0D,0x44,0xB5,0xFD,0x36,0x07,0x01,0x13,0x4A,0x98,0x72,0x6E,0xE2,0x59,0x3B,0x18, + + 0xF0,0x3C,0xCA,0x51,0x97,0xA4,0x61,0x3A,0x36,0xC1,0xB2,0x2B,0xA9,0xD8,0xE3,0x4B, + + 0x77,0x2A,0x34,0x1C,0xBA,0xA9,0xF8,0xAF,0xCD,0x27,0xCD,0x06,0x53,0x3C,0xB7,0x9F, + + 0x8C,0xB5,0x50,0x38,0x3C,0x54,0xFB,0x3F,0x9F,0x36,0x85,0x17,0x9F,0x44,0x4B,0x0A, + + 0x3A,0x01,0xDC,0x83,0x80,0x27,0x4C,0x73,0x6F,0xAD,0x36,0xEB,0x1D,0x1E,0x52,0xA4, + + 0xA3,0x80,0x8B,0x9E,0x73,0xEF,0x3E,0x86,0xF1,0x36,0xA2,0xE6,0x6C,0x25,0x1B,0xC9, + + 0x13,0xA8,0xC3,0xA5,0xF7,0xF4,0x9F,0xF9,0x82,0xC6,0xE3,0x0D,0xD4,0xAC,0x94,0xD9, + + 0x12,0x89,0x7B,0x51,0x99,0x8E,0x3B,0x96,0x5C,0x94,0x43,0x1F,0x97,0xEC,0x1C,0x11, + + 0x58,0x9A,0xA2,0xF4,0xDF,0xC1,0x4C,0x26,0x6D,0x30,0xA6,0xA2,0x83,0x0D,0x12,0xE6, + + 0xA8,0xF3,0x1F,0xAF,0x85,0xE0,0xFC,0xEF,0xD0,0x7C,0x7C,0xF6,0xB0,0xB3,0xB2,0x07, + + 0xA5,0x7F,0xDB,0xBF,0x5D,0x63,0x82,0x13,0x10,0xB1,0x59,0x39,0xF7,0xE2,0x52,0xD4, + + 0x58,0x25,0xAC,0x95,0xF1,0x6F,0xA1,0x5C,0xD2,0xD3,0xB5,0x4C,0xBD,0xC2,0xD5,0x67, + + 0xDA,0x17,0x9A,0x0E,0xBB,0x19,0x4C,0xC2,0x87,0xF5,0xA3,0x62,0x63,0x33,0x9E,0xF6, + + 0x07,0xF5,0xF8,0x55,0x34,0x84,0xD0,0x60,0x6B,0xDF,0x49,0x87,0xC3,0x7C,0xD6,0x66, + + 0xA0,0xCE,0x28,0x48,0x03,0xF4,0x15,0xA8,0x58,0xDB,0x2E,0x48,0x89,0xF4,0xE9,0x57, + + 0xB6,0x97,0x2D,0xF3,0x23,0xF5,0x3C,0x71,0x76,0x88,0xA2,0x77,0x84,0x80,0x7C,0x88, + + 0x9F,0x41,0x16,0xF9,0x32,0x64,0x01,0x86,0x13,0xDA,0xB0,0x86,0xFC,0xA6,0xB9,0x78, + + 0x81,0x34,0x90,0xA6,0xC9,0xC8,0xE6,0x3E,0x64,0x39,0xBE,0xFE,0x31,0x4C,0x46,0x4B, + + 0xF6,0x37,0x63,0x45,0x0F,0x05,0xEC,0x84,0xEA,0xA2,0x89,0x86,0x73,0x7C,0x7F,0x79, + + 0x20,0x9D,0x9E,0xB3,0xAD,0xBF,0xE0,0x3B,0x9A,0xAE,0xAA,0x3B,0xFC,0xC5,0xCE,0xCF, + + 0x28,0x84,0xF2,0xCD,0x3F,0xDC,0x4C,0x1B,0xCD,0xFC,0x36,0x2F,0x8E,0x71,0xB1,0xDF, + + 0x29,0x0C,0xA7,0x6C,0x37,0x8F,0xD2,0x89,0xCC,0x5B,0x6D,0x7A,0x19,0x5F,0x5A,0xEB, + + 0x86,0xEE,0xF7,0xF6,0xE8,0x13,0xB7,0xEF,0xDF,0x01,0x89,0x26,0xF8,0x0D,0xDD,0x5F, + + 0xCC,0xEB,0xB6,0xDC,0x1A,0x1E,0x80,0x85,0x2D,0xDF,0xAF,0x7E,0xBA,0xF9,0xAD,0x02, + + 0xA1,0xFF,0x9A,0x06,0xDA,0x2F,0x30,0xD9,0xE1,0xCA,0xC2,0x72,0xBB,0x04,0xB2,0xEE, + + 0x20,0x42,0x64,0x8F,0xE0,0xA8,0x07,0x14,0x47,0xDA,0xE0,0x20,0xB1,0xE0,0x19,0xA9, + + 0xB3,0x84,0x11,0xFB,0x3C,0x2F,0x96,0x41,0xCC,0x00,0x01,0x56,0xBC,0xC9,0x96,0x71, + + 0x9D,0x05,0xA9,0xFF,0x64,0xAA,0xF2,0xB5,0xC6,0xC0,0xB4,0xC6,0x55,0xEE,0x77,0x25, + + 0x71,0x04,0xE0,0xCE,0x11,0x64,0x28,0x47,0xBF,0x4B,0xEA,0x97,0x62,0xC9,0x59,0xB2, + + 0xAF,0xA8,0xDE,0x61,0xF8,0x61,0x49,0x92,0xEF,0xE8,0x90,0x1D,0x55,0x6D,0xC1,0x40, + + 0x68,0xAB,0xFD,0xA2,0xF1,0x60,0x6F,0x54,0xE6,0xEB,0xC0,0x22,0x18,0x0F,0x5C,0xB3, + + 0xA7,0x8C,0xF3,0xE5,0x27,0x88,0x4C,0x93,0xE7,0xEA,0x25,0x85,0x41,0x96,0xAF,0xF1, + + 0xA9,0x66,0xA2,0x86,0x3C,0x87,0x42,0xA0,0x10,0x53,0xC0,0x62,0x7C,0xC5,0x30,0xFA, + + 0x8B,0x75,0x58,0xDB,0xD3,0xD8,0xA2,0xD8,0x01,0x05,0xA8,0x0C,0x75,0xC6,0x61,0x19, + + 0x89,0x4A,0xD5,0x2A,0x39,0x85,0x4C,0x4F,0x8A,0x05,0x05,0xDC,0x7B,0xAA,0x2B,0x7B, + + 0xBA,0x8D,0xB5,0x21,0xF8,0x2F,0x5A,0xBD,0x88,0x6D,0x3B,0x4F,0xBB,0x17,0x96,0x79, + + 0x66,0xA3,0x66,0xBC,0x12,0x23,0xC3,0x8A,0xE6,0xE1,0xAC,0x6A,0x39,0xE8,0x34,0x5F, + + 0x2F,0xA9,0xAA,0x73,0x4F,0x6F,0xFA,0x0A,0x29,0x11,0xA1,0x5B,0xFA,0xD2,0xE3,0x3B, + + 0xE8,0xC2,0xFD,0x78,0xBB,0xFC,0xC6,0x8B,0xEE,0xE1,0x00,0x9E,0x56,0x63,0x1B,0x5F, + + 0x43,0xFE,0xC3,0x03,0x14,0xA9,0x25,0x7E,0xCF,0xCF,0x81,0x3F,0xA7,0xC0,0xBE,0x02, + + 0xBD,0x14,0x7F,0xC3,0xD9,0xA3,0x84,0xD3,0x0C,0x56,0x15,0x96,0x8F,0x1E,0xA4,0x0C, + + 0xC8,0x0B,0x59,0x0A,0xDA,0x42,0x9C,0xB4,0x29,0x52,0xE4,0xC4,0xF1,0x6E,0x7D,0x05, + + 0xA2,0x12,0x62,0x76,0xC2,0x9F,0x77,0x81,0x8B,0x5D,0xAB,0x68,0x2E,0xDF,0x55,0x80, + + 0x81,0xD1,0x1D,0xAA,0x9C,0xE8,0x23,0x84,0x63,0xD5,0xA3,0x79,0x90,0x77,0x56,0x38, + + 0xC9,0x50,0x9A,0x26,0x36,0x99,0xEF,0xC4,0x11,0x54,0x28,0x14,0x70,0x85,0xE8,0xF4, + + 0x40,0x8A,0x0C,0x94,0xB8,0x5B,0xCC,0x01,0xC0,0x15,0x0F,0x07,0xFF,0x79,0x7F,0x71, + + 0x3B,0xB9,0x53,0x47,0x0E,0x74,0x95,0xE0,0x2F,0xAB,0xAB,0xE3,0x91,0x01,0x5B,0xFC, + + 0x48,0x53,0xAF,0xDD,0x46,0xBE,0x63,0xC4,0xE5,0xF7,0x79,0xB7,0x77,0x1B,0x86,0x7B, + + 0x7B,0x03,0x86,0xF3,0x50,0xAB,0xC5,0x59,0xCB,0x18,0xF7,0x88,0x7E,0x38,0x16,0x91, + + 0x8C,0x98,0x5B,0x6F,0x07,0x78,0x1C,0xE6,0x9D,0x62,0x09,0x82,0x43,0x8C,0xDE,0xEF, + + 0xEB,0x15,0xF9,0x35,0x4D,0x99,0x97,0xB8,0xCA,0x18,0xD4,0xB3,0x8C,0x8E,0x77,0x7F, + + 0x0C,0x91,0xB1,0x25,0xD9,0xC4,0xA8,0x55,0x74,0xA6,0x4E,0x45,0xF9,0x3A,0x1C,0x77, + + 0x40,0x4D,0xE6,0x5E,0xBA,0x34,0x06,0x8A,0x4E,0x87,0x62,0x8E,0xA0,0x83,0xCE,0x26, + + 0xCA,0x66,0x58,0x2F,0xBF,0xB0,0xC6,0x17,0x5C,0x5D,0x5E,0x6D,0xF7,0xDF,0x39,0xCE, + + 0x8E,0x5C,0x44,0x3D,0x34,0x9F,0xE6,0x14,0x6C,0xF3,0xD1,0xEB,0x31,0x3A,0x0F,0x37, + + 0x10,0x00,0x9D,0xF3,0x50,0x5B,0x65,0x02,0xED,0x87,0x7F,0x9F,0x29,0x71,0xBA,0xE2, + + 0x40,0x86,0xD9,0x75,0x7E,0x29,0xF0,0xE2,0xD5,0xDB,0x20,0x55,0x38,0x41,0x50,0x90, + + 0x98,0x3A,0x3E,0xE7,0xB6,0xE1,0xC0,0x16,0xBA,0x5C,0x18,0x44,0x37,0xDD,0x8C,0xFA, + + 0xE7,0x02,0x81,0x8D,0xB0,0x0F,0x32,0x45,0x85,0xE2,0x89,0x17,0x9A,0x4D,0x11,0x54, + + 0x47,0x03,0xC9,0x85,0xA2,0xE3,0xEA,0xCD,0x38,0x62,0xC7,0x30,0xF1,0x4E,0xC4,0x66, + + 0x6D,0x8B,0xE1,0x38,0x77,0xA0,0xDB,0x92,0x57,0x35,0x50,0x96,0xDE,0x37,0x6E,0xF2, + + 0x34,0x21,0xB2,0xD5,0x7F,0x44,0xAB,0x81,0xCB,0x84,0x4C,0x14,0xDA,0x53,0xE1,0x30, + + 0xA8,0xC6,0x83,0x45,0x97,0x76,0x0F,0x65,0xA5,0xE0,0x8F,0x60,0x77,0x39,0xD1,0x63, + + 0x87,0x78,0x97,0x51,0x76,0x24,0xCA,0x9A,0x3B,0x9C,0x06,0x09,0x05,0x5B,0x6A,0x1E, + + 0xAD,0x08,0xA4,0xAE,0x7F,0x37,0x0A,0xD5,0xB9,0xAB,0x24,0x1F,0xFD,0x69,0x4A,0x55, + + 0x76,0x84,0xF0,0xA1,0x77,0xDA,0x44,0x3C,0x2E,0xBE,0xE8,0x75,0xB6,0x8D,0x5B,0x2B, + + 0xD8,0xA1,0xB5,0xB7,0x77,0xEE,0xC8,0xDB,0xCE,0x3B,0xE5,0xDC,0x58,0x67,0x29,0xF9, + + 0xBE,0x0D,0xD5,0x18,0xB9,0xC8,0xE8,0xC8,0x41,0xC6,0x2B,0x5D,0xB6,0xE4,0x23,0x2C, + + 0x2A,0x21,0x53,0xBD,0x92,0x27,0x48,0x90,0xB5,0xCA,0x4D,0x35,0xAD,0x82,0xBC,0x1D, + + 0xD1,0xCC,0xA8,0xA1,0xF6,0x4C,0xAF,0x45,0x3D,0x52,0xE0,0x7C,0x9D,0xE9,0xFF,0xDB, + + 0x71,0x23,0xE7,0xAD,0x77,0xE7,0x5A,0xDD,0xEA,0x1B,0xCC,0xFD,0xDE,0x73,0x55,0x82, + + 0xE7,0x82,0x47,0xC0,0x9C,0xCE,0x04,0xFF,0xCB,0x10,0xF3,0x56,0xD9,0xE7,0xA3,0x71, + + 0x49,0x3D,0xDA,0x3A,0xDD,0xC3,0x99,0xEC,0x91,0x8C,0xEE,0x63,0x1C,0x11,0xB2,0xF2, + + 0x39,0x3C,0x3C,0xE5,0x59,0x10,0x02,0x87,0x0E,0xDE,0x70,0x87,0x19,0xEE,0x6E,0x63, + + 0xE4,0x3F,0xF7,0x78,0x5F,0x01,0x0F,0x48,0x57,0x93,0xCC,0xD8,0x53,0x79,0x64,0x21, + + 0xA1,0x53,0x95,0xA7,0xA0,0x1C,0xBD,0x31,0x27,0x49,0x05,0x93,0x02,0xFE,0xE4,0xC7, + + 0xBE,0x39,0xBE,0xC7,0x95,0x3F,0xB8,0x90,0x8D,0x35,0x54,0x24,0xFA,0xFB,0x52,0x7F, + + 0x03,0x38,0x4C,0xA4,0x55,0xA9,0xE4,0xB2,0x63,0xF8,0xED,0xE7,0x43,0x58,0x36,0xF2, + + 0x07,0x69,0x9E,0xF6,0xDA,0x19,0x4B,0xD6,0x6B,0x70,0x41,0x98,0x55,0x56,0x3E,0xE3, + + 0xAF,0x38,0x93,0xD0,0x16,0x3E,0x83,0x02,0x44,0x97,0x6C,0x17,0xF3,0x57,0x1C,0x62, + + 0x47,0xD7,0x06,0xFC,0x5E,0x74,0xB6,0xBB,0x4E,0xC3,0xC9,0x56,0x7C,0xBA,0x35,0x1E, + + 0x10,0x2B,0x38,0xAF,0x9C,0x38,0x00,0x0B,0x0C,0xDD,0x1C,0xDC,0x86,0xB8,0x26,0x6D, + + 0xAA,0xA3,0xD9,0x88,0x98,0x17,0x93,0xCD,0x26,0x19,0xB3,0x1C,0x7E,0x36,0xEF,0xA7, + + 0xBE,0x9D,0xB6,0x6C,0x39,0x36,0x41,0x59,0xFF,0x96,0x08,0x5B,0x8A,0xFB,0xB5,0xB8, + + 0x0A,0xF9,0x62,0xAE,0x3A,0x91,0x48,0xDF,0xEC,0xA9,0xE3,0xEC,0xFC,0x5C,0x21,0x30, + + 0x4C,0x62,0x78,0x3C,0xDF,0x19,0x92,0x69,0x0A,0x56,0x56,0x5D,0x00,0x3D,0x1F,0x3B, + + 0x3E,0x3F,0x1B,0xBC,0x93,0x1A,0x37,0x6F,0xEF,0xF0,0x61,0xAC,0x1F,0xBF,0x97,0x9C, + + 0x8B,0x42,0x97,0xF6,0x54,0xEE,0x5F,0x11,0x1A,0x56,0x3F,0x3A,0x6B,0xBE,0x59,0x8B, + + 0xA5,0xAF,0xF9,0x66,0xD2,0x20,0x90,0x52,0xC2,0x5C,0xF0,0x6E,0xE6,0x6F,0x19,0x63, + + 0x12,0x88,0x08,0xFC,0x9F,0xEA,0x6A,0x34,0x51,0x03,0x99,0xB0,0x79,0x2A,0x97,0x09, + + 0x25,0xAD,0x89,0x0D,0xFB,0x38,0xE0,0xC3,0x29,0xA8,0xAF,0xF0,0x32,0x63,0x0D,0x71, + + 0xC1,0x8E,0x76,0x31,0x97,0x62,0x0D,0x3F,0xC0,0x23,0x91,0x30,0xBA,0x89,0x7A,0xA2, + + 0x26,0xA9,0xF8,0xBF,0x9F,0xD9,0x90,0x54,0xD2,0x90,0xD4,0x86,0xB3,0x7F,0xD6,0xB0, + + 0x4B,0xAA,0xC0,0xDC,0x20,0x71,0xC8,0xB6,0x60,0x05,0x57,0x96,0xD3,0xC5,0x0A,0xA1, + + 0x9A,0xAB,0xA6,0x3B,0x50,0x26,0x42,0x7E,0xBA,0x04,0x70,0x93,0x50,0x42,0x87,0xB9, + + 0xB4,0x48,0x13,0x54,0x95,0x66,0x45,0x55,0x8B,0x76,0xE3,0xF7,0x4A,0xCC,0x7C,0xDD, + + 0x2C,0x13,0xC5,0xCC,0x1C,0x00,0x4C,0xFD,0x44,0xE5,0xC2,0x5F,0x17,0xEF,0x68,0x19, + + 0x0A,0xD8,0x31,0xDB,0xC7,0x21,0xDA,0x19,0xDD,0x43,0x42,0xFC,0x49,0xC2,0x61,0x7F, + + 0x77,0x64,0x07,0x2A,0x39,0xD5,0xDD,0x9B,0xC4,0xFA,0xC3,0x34,0xDE,0x4B,0x52,0xD7, + + 0x2C,0x82,0x0B,0x5C,0x95,0x3B,0x1A,0xC8,0x86,0xCB,0x55,0x7D,0x38,0x6D,0x78,0xBB, + + 0x59,0xA3,0xC9,0x3F,0x2E,0x23,0x08,0x28,0x22,0x5D,0xAA,0x13,0x79,0x5E,0xC1,0x3A, + + 0x2A,0x4D,0x0A,0x78,0x0C,0x80,0xCC,0x9A,0xA2,0x57,0xC2,0xF9,0xF7,0x60,0xDD,0x6D, + + 0x08,0x2A,0x77,0x3E,0xA6,0x21,0x93,0x48,0x6E,0xE3,0xB3,0x26,0xB1,0x63,0x57,0x83, + + 0x6A,0x14,0xD8,0xBF,0x37,0x82,0x29,0x7D,0xD7,0xC4,0xD9,0x9F,0x7A,0x01,0x1C,0x84, + + 0x08,0x18,0xDD,0x68,0x95,0x3B,0x11,0x22,0xF1,0x07,0xBD,0x0A,0xD1,0x1E,0x14,0x94, + + 0x09,0x0D,0x42,0x44,0x6D,0x38,0x14,0xB4,0x49,0x4D,0x1C,0xED,0x39,0xDC,0x3B,0x54, + + 0xE3,0x1D,0x05,0xC4,0xBC,0x9F,0x2D,0x66,0x22,0xF2,0xF7,0xB4,0xF1,0x12,0x33,0x44, + + 0x82,0x63,0x0D,0xB4,0x20,0x9E,0x23,0x64,0x80,0x73,0x53,0xC5,0xF3,0x7A,0x64,0xD1, + + 0x11,0xC6,0x40,0x84,0x3E,0xB9,0x47,0x64,0x4A,0x02,0xD0,0x66,0xEB,0xB6,0x5D,0xCD, + + 0xC2,0xBA,0xC6,0xD6,0xD8,0xD4,0xB4,0x74,0x4B,0x03,0x5A,0x87,0x1E,0x7A,0x1F,0xC4, + + 0x05,0xBD,0xBB,0xEC,0x5B,0x07,0xEA,0x03,0xE4,0x17,0xED,0x94,0x9F,0x7F,0x58,0xA2, + + 0xB0,0x9E,0xF3,0xA0,0x92,0x57,0xE2,0x13,0xAB,0x46,0x84,0xFB,0x94,0x57,0xC6,0xA9, + + 0xBC,0x10,0x48,0x6C,0x24,0x7A,0x0E,0xBC,0x81,0xB2,0x90,0xDF,0x37,0xFF,0xCE,0xBC, + + 0x81,0x94,0xD0,0x49,0x3B,0x7B,0x47,0x3F,0x2D,0x5F,0x1C,0x38,0x5D,0xCB,0x85,0x78, + + 0xE7,0x3A,0x93,0x69,0xB9,0xFA,0x0D,0xAC,0xCB,0x99,0xC7,0xA8,0xCB,0x1C,0x56,0x9B, + + 0x0E,0x0B,0x1F,0xBE,0x58,0x20,0x3F,0x59,0x48,0xA4,0x97,0x8C,0x55,0x76,0x42,0x28, + + 0x2E,0x35,0x4A,0xF9,0x38,0x27,0x50,0xC0,0x6C,0x1D,0x8F,0xE2,0x9F,0xFB,0xCE,0xB9, + + 0x4F,0x90,0xCA,0xBC,0x6F,0x3B,0x66,0x03,0x97,0x2C,0x55,0x8F,0x17,0x72,0xD5,0xBA, + + 0xF9,0x15,0xE0,0xBB,0x45,0xB7,0x5C,0x8B,0x19,0x3B,0xD3,0xF9,0x78,0x5A,0x31,0xEC, + + 0x98,0x78,0xE2,0x2C,0x1A,0x36,0xEC,0xD5,0xED,0x55,0x8F,0xE1,0xE3,0x64,0x26,0x62, + + 0x68,0x2D,0x1A,0x66,0x10,0x88,0x0A,0xA0,0xD5,0x97,0x99,0x88,0xF7,0x4D,0x3C,0x61, + + 0x56,0x8A,0xA4,0x13,0x13,0xE0,0xBF,0xCD,0x24,0x81,0xA2,0x16,0x74,0x81,0x6A,0x91, + + 0x8C,0x88,0x25,0x27,0xC2,0xE2,0x49,0x50,0x8B,0x48,0x7F,0xF7,0x88,0x1D,0xAD,0x6C, + + 0xA4,0x23,0x9A,0xD7,0x91,0x8B,0x21,0x36,0x3B,0x43,0x4E,0x77,0x91,0xE5,0xC1,0xB4, + + 0xEF,0x1E,0xF7,0xA4,0x5E,0x45,0x78,0x53,0x76,0x86,0x92,0x77,0x57,0x34,0x30,0xDA, + + 0x34,0x31,0xEE,0x7E,0x74,0xAD,0x58,0x90,0x0F,0xD4,0x80,0x51,0xF4,0xE1,0x39,0xDB, + + 0x6F,0x6F,0xED,0x9B,0x6A,0xB7,0x65,0x45,0x67,0x4E,0xCB,0xE5,0x4F,0x4D,0xD3,0xB3, + + 0x89,0x9C,0x7E,0xD3,0xBF,0xE2,0xB9,0x52,0x59,0x6A,0xFF,0x05,0x55,0xDB,0x72,0x92, + + 0x08,0xA9,0x26,0xFF,0x0F,0xE8,0xB0,0xA8,0xDD,0x9F,0x9B,0x80,0xFD,0x68,0xAE,0xF2, + + 0x3A,0xC6,0x52,0xF6,0x93,0x62,0xF4,0x88,0x0D,0x69,0xB2,0x2F,0x5B,0xC8,0x0A,0x78, + + 0xE1,0x83,0xFA,0x6B,0xFF,0x0A,0x0B,0x3B,0x6F,0x67,0xCB,0x5C,0x93,0x6D,0x15,0xC3, + + 0xEC,0xAB,0x54,0x6D,0x3E,0xEA,0xFB,0x1A,0x59,0xC1,0x1A,0xFF,0xC5,0xED,0xA1,0x2C, + + 0x2D,0xEC,0xDC,0x3B,0xBD,0xAA,0xE7,0x88,0xA7,0x9D,0x28,0x8C,0xDC,0xF0,0xCB,0xAE, + + 0x07,0x96,0xD0,0x46,0x9D,0x91,0x02,0xFE,0x67,0xBB,0xE2,0x6B,0xB6,0x0C,0xE3,0x8F, + + 0xDB,0x95,0xC3,0x17,0x3F,0xAF,0xB3,0x4A,0x58,0x33,0x06,0x0D,0xB7,0x0F,0xA8,0x3D, + + 0xCD,0xC0,0x27,0x3D,0x12,0x29,0x45,0x42,0x6C,0x62,0x83,0x97,0x4B,0x24,0xDC,0x00, + + 0xA4,0x9B,0x84,0x60,0x24,0xFF,0x8E,0x65,0xBA,0xDA,0x4B,0xD8,0xFB,0x06,0xA9,0x10, + + 0xA5,0xFA,0x53,0x7E,0xBB,0x7C,0x35,0x11,0xE7,0xCD,0xE4,0x3F,0x46,0xAA,0xE5,0xA7, + + 0x84,0x9A,0xC5,0x85,0x9B,0xBF,0x20,0xD1,0x1B,0x90,0xFD,0x3E,0x1D,0x1B,0x15,0x6C, + + 0x50,0x65,0x01,0x08,0xB4,0xF3,0x44,0xCD,0x39,0xDC,0x05,0x48,0xD4,0x91,0xDC,0x3D, + + 0xCF,0x75,0x71,0xB5,0x6D,0xBF,0x4B,0x60,0xE6,0x3E,0x55,0x90,0x94,0xD4,0x70,0xE6, + + 0x21,0xD4,0x78,0x93,0x5B,0xBD,0x1B,0x8C,0xA5,0xD5,0x6C,0xB0,0x0B,0xB7,0xC9,0x5C, + + 0xA7,0xD6,0xE7,0xB4,0x8E,0xBF,0x4D,0x18,0x6B,0x2B,0x71,0x63,0xB5,0xA6,0x85,0x33, + + 0xA3,0xBE,0x8D,0xD5,0xE2,0xBA,0x35,0x6B,0xE1,0x96,0x74,0x81,0xC4,0x55,0x2E,0x8E, + + 0x25,0xF8,0xAA,0x8B,0xD5,0x52,0xF6,0xAE,0x6B,0xDE,0x76,0x8A,0x8C,0xF0,0x29,0x1E, + + 0x05,0xCD,0xBA,0x7A,0x3E,0xA9,0x92,0x38,0xFC,0xE6,0x01,0xEE,0x7E,0xB6,0x19,0x5E, + + 0x4E,0xBA,0xD5,0x0F,0xE4,0xF8,0x17,0x4A,0x4D,0x25,0x34,0x5E,0xEF,0xBA,0x67,0x93, + + 0xC6,0x71,0xF1,0x4A,0x9D,0x36,0x07,0x24,0x6F,0xC7,0xE6,0x38,0x9A,0x24,0xF6,0xB8, + + 0xD5,0x69,0x1D,0x9C,0x30,0xDE,0xBF,0x88,0x9D,0xB9,0x4E,0xD3,0xD9,0xEE,0xCD,0xF6, + + 0xF3,0xEC,0xAF,0x1B,0x53,0xB2,0xCD,0xC2,0x69,0xD7,0x69,0x7A,0x6A,0x30,0xF1,0x4F, + + 0xCA,0x8A,0xAD,0xCA,0x9C,0xB3,0x4F,0x10,0x12,0x6F,0x4F,0x53,0x59,0xB0,0x30,0xDA, + + 0x53,0x7E,0x8F,0x94,0xD4,0x34,0x40,0x79,0x6F,0xC5,0xA6,0x6A,0x5A,0x0E,0xF8,0x88, + + 0xA5,0xD3,0xAE,0xBF,0xF9,0x31,0xAB,0xD3,0x74,0x5B,0x2A,0xC4,0x56,0x22,0x30,0x00, + + 0xA2,0x07,0xAA,0xE7,0x7D,0x3A,0x0D,0x77,0x9F,0x4B,0xC1,0xCD,0xB4,0xC8,0xF9,0x83, + + 0x49,0xDD,0xF9,0xF4,0x33,0xD2,0xD1,0x47,0x3F,0xEF,0x1C,0xCA,0x0C,0x83,0x27,0xAB, + + 0x20,0x0A,0xA9,0x61,0xB0,0x41,0x99,0x2E,0xF9,0xEE,0x0F,0x55,0x95,0xA6,0xF8,0x04, + + 0x3A,0x00,0xBA,0xA4,0x55,0x89,0xDB,0x02,0x61,0xE7,0xEA,0x9F,0xA2,0x6D,0x72,0xAF, + + 0x83,0x67,0x93,0xA7,0x97,0xA8,0x48,0x60,0xE2,0xC7,0x90,0xC0,0xA2,0xC1,0x80,0xB0, + + 0xBA,0x26,0x57,0x74,0x33,0xA7,0x0B,0x5D,0xFA,0x04,0xEA,0xA2,0x18,0x4F,0x77,0x78, + + 0xC0,0x08,0x9B,0x1E,0x95,0x06,0x21,0x81,0xB7,0xE6,0x45,0x97,0x33,0xB2,0x50,0x8A, + + 0xC1,0xD7,0xBC,0x39,0x2B,0x93,0x83,0xAD,0x46,0xC2,0x04,0x5E,0x6B,0x08,0x53,0x88, + + 0xAC,0xD6,0xD1,0xE8,0x11,0x32,0x12,0x15,0xA0,0xF0,0x18,0xD4,0x55,0x24,0x3B,0xBB, + + 0xC8,0xBB,0x19,0x6D,0xC8,0x31,0xC4,0x6E,0x02,0x7B,0x6B,0x5E,0x8B,0x63,0x0A,0x7F, + + 0x76,0x49,0xD4,0x2B,0xF5,0xA6,0x7D,0x41,0x44,0x50,0x8D,0x55,0x7E,0x6D,0x5A,0x51, + + 0xEB,0xA3,0x5F,0x8B,0xD0,0x5D,0x43,0xEC,0x6A,0xCC,0xAA,0x80,0x5A,0xCD,0x5C,0x6D, + + 0x0D,0x0C,0xC2,0x2E,0xF0,0x3C,0xCC,0x47,0x7B,0x0F,0x09,0x8F,0x37,0x98,0x56,0xB6, + + 0xE9,0x19,0x78,0xDE,0xAE,0x26,0x6B,0x79,0x69,0xFB,0x18,0x9E,0xEA,0x33,0x83,0x2B, + + 0x28,0x84,0x0B,0x7D,0xCE,0x22,0x56,0x76,0xCD,0x4E,0x10,0x02,0x54,0xC9,0x5D,0x14, + + 0x87,0x00,0xDF,0x90,0xD5,0x5C,0x4D,0x2D,0xC7,0x54,0x95,0xC2,0x9B,0x01,0xCC,0x38, + + 0x96,0xBA,0xEC,0x96,0x4A,0x3C,0xE4,0x58,0x41,0x1C,0xED,0x85,0x1D,0x33,0xFD,0x03, + + 0x7D,0x9F,0xE7,0x95,0xB1,0x53,0x17,0xD3,0xD3,0x12,0xAF,0x56,0x9C,0xF9,0x18,0x6E, + + 0x92,0xA8,0xC7,0x35,0x4E,0xC4,0xE2,0x59,0xFF,0x1E,0x8D,0x71,0x50,0x7A,0x4C,0xC4, + + 0x8B,0xAE,0x7C,0x3B,0x01,0x4C,0xAB,0x93,0x52,0x38,0xB4,0xE6,0xA3,0x79,0x35,0xB6, + + 0x00,0x55,0x33,0x16,0x92,0x2A,0x11,0x83,0x5B,0xDF,0xD4,0xE4,0x40,0xC1,0x1F,0xCB, + + 0xCA,0xF7,0x7D,0x3B,0x4F,0xEE,0xB2,0x21,0xE6,0x7B,0x2A,0x9E,0x7D,0x80,0x71,0x18, + + 0xC0,0x6D,0x72,0x33,0x33,0x07,0xDA,0x91,0xEF,0x3D,0x07,0xF4,0x0A,0xD6,0xBC,0x77, + + 0x17,0x29,0xC6,0x95,0xD1,0xA2,0x14,0x4E,0xE7,0xAE,0x59,0x5C,0x0C,0xD9,0xB6,0x87, + + 0x19,0x02,0x96,0x8D,0x0A,0xA2,0x24,0x5E,0x6F,0x31,0xA6,0x5C,0x32,0xF2,0x58,0x08, + + 0xAE,0x4B,0xDF,0x9D,0x51,0xD3,0x5F,0xAD,0x40,0x61,0x01,0x29,0xD8,0xFA,0x2F,0xEF, + + 0x56,0x60,0x4D,0x9F,0xE9,0xB6,0x61,0xA6,0xD1,0x8F,0x07,0x8C,0x95,0x64,0x50,0xFD, + + 0x2C,0x1D,0xC0,0xE4,0xD3,0x2D,0x43,0x0A,0xB7,0x61,0x43,0x1F,0x46,0xF1,0x16,0xDC, + + 0xA2,0x02,0x62,0xCD,0x57,0x11,0x71,0x93,0xB2,0xA8,0xD8,0xD5,0xFB,0x7B,0x45,0xAB, + + 0x11,0x91,0x6B,0x5F,0xE6,0x36,0xF8,0x6D,0xE9,0xCE,0x81,0xC1,0x11,0x2F,0x15,0xBD, + + 0x93,0x00,0x1A,0xF9,0x52,0x85,0xC9,0x7D,0xEE,0x38,0xBF,0xFF,0x22,0x72,0xAA,0xBD, + + 0x37,0x42,0xF9,0x03,0xB3,0xBB,0x92,0xB4,0xAF,0x21,0x9E,0xC0,0xF5,0x1F,0xD7,0x96, + + 0x40,0x76,0x57,0x51,0xDF,0x90,0xAE,0xF2,0x13,0xDA,0x5F,0x76,0x1D,0x6C,0x99,0xFD, + + 0x94,0xCF,0x66,0x61,0xFC,0x93,0x0F,0x0B,0x49,0x64,0xE8,0x22,0x71,0x8E,0x70,0xEF, + + 0x60,0xEF,0xE1,0x13,0xEA,0x5C,0xB9,0x55,0x85,0x8C,0x41,0xB3,0xDA,0xCD,0xF8,0x73, + + 0x6A,0x9B,0xB8,0x7A,0x10,0xA5,0xA5,0x1D,0xE5,0x4F,0x3F,0xA6,0x40,0x6F,0x43,0x63, + + 0x6B,0xC7,0x7B,0x67,0x27,0xE7,0xB0,0x00,0xE4,0x65,0x58,0x86,0xA9,0x46,0x5F,0x6A, + + 0x21,0x0D,0x34,0x38,0x35,0x2D,0x00,0x4A,0xC0,0xC7,0x8A,0x56,0xE6,0x49,0x79,0xE4, + + 0x7A,0x88,0xF9,0x47,0xF4,0x87,0x32,0x83,0xD8,0x66,0x6F,0x84,0x5B,0xEA,0x44,0x73, + + 0x0D,0xC8,0x9C,0x22,0x93,0x5E,0x50,0x2B,0x4D,0x6A,0x22,0xDF,0x68,0xE8,0x04,0xE4, + + 0xAE,0x92,0x10,0xFE,0x5D,0x69,0xC5,0xBE,0x73,0x88,0xF3,0xDE,0x45,0xF2,0x91,0x73, + + 0x6D,0x8C,0xAB,0xBE,0xAF,0x31,0x0D,0x03,0xA4,0x53,0x95,0xFB,0xE0,0x47,0x69,0xFD, + + 0x9D,0xC4,0xF2,0x1A,0x3A,0xB0,0xFB,0xFE,0x46,0x46,0xB1,0x59,0x36,0xBA,0x64,0x7F, + + 0xE7,0x6D,0x9A,0x75,0x72,0x59,0xE4,0xEE,0x6E,0x4C,0xE5,0x95,0x16,0xFD,0x50,0xA9, + + 0x63,0x20,0xB0,0x3A,0x77,0xBC,0x78,0x6B,0x7F,0xC9,0xFC,0x4B,0x03,0xE9,0x79,0x56, + + 0xAD,0x7A,0xF2,0xCB,0x8B,0x6A,0x29,0x94,0x6D,0xCA,0xCD,0x47,0xFD,0xAE,0xFD,0x1C, + + 0x45,0xB5,0x92,0x35,0x1E,0xA2,0x8D,0x93,0x61,0x82,0xC3,0x67,0x5F,0x63,0x31,0xF0, + + 0xDF,0xD2,0xFD,0x7E,0xD3,0x1D,0x25,0xD0,0x9B,0xCB,0x0C,0x55,0x4C,0x7B,0x12,0xA7, + + 0xC6,0x98,0x6C,0x3B,0x11,0xB7,0x5C,0xE1,0x9F,0xDC,0xAC,0x01,0xD4,0x0E,0xB4,0xE5, + + 0x78,0x73,0xB4,0xB6,0xC5,0x4D,0x6E,0xD5,0xC5,0xC2,0x9E,0x96,0x98,0xB0,0xA9,0x80, + + 0xC9,0x82,0x83,0x38,0x14,0x4C,0x91,0x20,0xD5,0x2C,0x83,0x9E,0xD6,0x61,0xDC,0x31, + + 0x1E,0x8F,0xBA,0x24,0x32,0x31,0x2E,0xE8,0x0E,0x35,0x0B,0x21,0x9F,0x85,0xC0,0x4D, + + 0x26,0x2F,0x79,0xA4,0xDC,0x84,0x0D,0xDB,0x61,0xD4,0xFC,0xB6,0x37,0xEE,0x91,0xA5, + + 0x59,0xAB,0xC3,0x25,0x82,0x19,0x0C,0x85,0x19,0x5D,0x12,0x94,0xC2,0x70,0x53,0xFA, + + 0xE4,0x98,0xD3,0xFE,0x3A,0x11,0xB5,0x8C,0x44,0x5C,0xDA,0x03,0xFF,0xB6,0x7F,0x88, + + 0xC9,0x33,0x98,0xA7,0xB3,0x4E,0x89,0x6D,0xAE,0x98,0x5E,0x32,0x4F,0xEF,0x77,0x1F, + + 0x88,0x68,0x9E,0x76,0x39,0xF4,0xC5,0x7A,0x2D,0x54,0x06,0xDE,0x71,0x04,0x5F,0x96, + + 0x4C,0x65,0xAF,0x8A,0xBA,0x62,0x3F,0xA2,0x11,0x5C,0x0F,0x4F,0xF8,0xE8,0xD0,0x1F, + + 0xF4,0x9C,0xF7,0x0A,0x8E,0x20,0x66,0x43,0x0A,0xDD,0xA7,0xAA,0xCE,0x5C,0x3E,0x1F, + + 0xC5,0x8D,0xA9,0x0E,0x07,0x37,0xEE,0xC3,0xDD,0x71,0x96,0xAA,0x21,0x77,0x50,0xF2, + + 0xA2,0x6B,0x56,0xBE,0x64,0x48,0x24,0x37,0x07,0x3C,0xF2,0x7C,0x7A,0x99,0x3E,0x6C, + + 0x0B,0x61,0xC6,0xFE,0x86,0xA1,0x62,0x0D,0x47,0xE4,0x73,0x0D,0xF8,0x16,0x27,0x66, + + 0xA9,0x9E,0xFA,0x5B,0xFC,0x53,0xBF,0xDB,0xAF,0xD2,0xA5,0xEF,0x5C,0xBE,0xA7,0x2D, + + 0x87,0xF1,0x7F,0x7E,0x3E,0xFF,0x72,0x31,0x43,0xA0,0xE8,0x35,0x20,0x64,0xB0,0xC0, + + 0xA2,0x6F,0x6B,0x54,0x01,0x8C,0x1E,0x70,0x15,0x2F,0xD6,0xB9,0x32,0x41,0x5B,0x65, + + 0xFC,0x1D,0x6D,0x6A,0x4E,0x7F,0xD1,0x00,0xA0,0xC4,0xFD,0x1A,0xA4,0x20,0x6B,0x91, + + 0x80,0x43,0xD9,0x44,0xED,0x28,0x40,0x7D,0x64,0x35,0x42,0x35,0x61,0x12,0xC2,0xC4, + + 0x7C,0x0B,0x64,0xC0,0x52,0xF8,0x8A,0x7D,0x71,0xC0,0xEE,0xC0,0x98,0xB7,0x2E,0x28, + + 0x00,0x85,0xE8,0x12,0x5B,0x94,0xFF,0x92,0x83,0xEA,0xA1,0x07,0x79,0xEC,0x18,0xBC, + + 0x67,0x68,0xC7,0xE5,0xDA,0xF7,0xEB,0x9E,0x2B,0x2F,0xEF,0xDC,0xB3,0x62,0x77,0x29, + + 0xC3,0xC8,0xE9,0xDA,0x11,0xEB,0xCE,0x02,0xEE,0xB3,0xF9,0xFF,0xF7,0x3B,0x16,0x93, + + 0xF4,0x79,0x02,0x2D,0xC2,0x95,0x53,0x4E,0xDE,0x40,0x93,0x2E,0x10,0x04,0x0E,0xE4, + + 0x09,0x1C,0x0A,0x5B,0x37,0xF5,0x19,0xFF,0x7A,0x43,0xF3,0xD7,0x5F,0x68,0xC3,0x58, + + 0xE8,0x81,0x28,0x77,0x4D,0x31,0x53,0x6F,0xB4,0x4E,0x47,0x73,0xF6,0xB6,0x9E,0x11, + + 0x09,0xAB,0x5F,0x43,0x0A,0x14,0xA3,0xB6,0xDB,0x06,0xA3,0x19,0x38,0x70,0xEE,0x3B, + + 0x73,0x17,0x78,0x3F,0x6B,0x23,0x2A,0x7A,0xA3,0x43,0x69,0x22,0xC7,0x91,0xB1,0xB0, + + 0x74,0xC0,0x97,0x40,0xB6,0x48,0x64,0x1D,0x23,0xBC,0x81,0x7C,0xFA,0xB2,0xE1,0xDF, + + 0x75,0x8C,0x77,0x3E,0xE3,0x21,0x4B,0x6D,0x82,0xBF,0x7E,0x1E,0xB6,0xD1,0xE7,0xC7, + + 0x8A,0x8F,0xB3,0xB5,0xC7,0x62,0x19,0x6A,0xB7,0x40,0x6F,0x1F,0x24,0x2F,0x3A,0x21, + + 0x62,0xEF,0x13,0x76,0xC7,0x2B,0xEF,0xA9,0x8D,0x4B,0x2E,0x63,0xB2,0x20,0x04,0x94, + + 0x09,0x02,0x8D,0xF2,0x6E,0x7E,0xC8,0xEE,0xF2,0x6E,0xC5,0xB4,0x12,0x81,0x3B,0xB9, + + 0x2D,0xE4,0x73,0xE3,0xE7,0x7D,0x95,0xE6,0xCE,0x8E,0x9D,0xB0,0x97,0x22,0x33,0xA9, + + 0xE1,0xBC,0x1D,0x17,0x0D,0x31,0xE2,0x49,0xE1,0xE8,0x65,0x31,0xCB,0xB3,0xBE,0x28, + + 0xAA,0xD9,0x3F,0xBB,0x5A,0x39,0xAB,0x93,0x40,0x3A,0x42,0x66,0x82,0x36,0x15,0xD6, + + 0xC6,0x13,0x96,0x54,0x4F,0x9A,0x0C,0x82,0x88,0x84,0xDA,0x54,0xD2,0x34,0x25,0x61, + + 0xBA,0x19,0x3A,0xBB,0x9C,0xE9,0xB2,0xA1,0xE6,0xA2,0x8B,0x07,0xF6,0x34,0x1D,0xCC, + + 0x00,0x7B,0x6D,0x25,0x0D,0xE4,0x63,0xCD,0x6E,0xF1,0x87,0x4E,0x8F,0xD8,0x11,0xFB, + + 0x50,0x74,0xBE,0x7F,0x4C,0x93,0x92,0x2C,0x60,0xB4,0xF6,0x0C,0x60,0x75,0x1A,0x28, + + 0x4A,0x1B,0x22,0x0F,0x13,0x33,0xFD,0xF8,0x22,0xF4,0x1C,0xCE,0x4A,0xBD,0x61,0x28, + + 0xA9,0x5A,0x94,0x8C,0x51,0xAB,0xFB,0xC6,0x36,0x07,0xCE,0x50,0x1F,0x36,0x19,0xA1, + + 0xAF,0x1A,0x9E,0x6D,0xBB,0x9A,0x4F,0xE8,0x95,0x50,0x65,0x55,0xFD,0x34,0x1F,0x35, + + 0xCF,0xBA,0xB8,0xCB,0x1E,0x27,0xC1,0x28,0x04,0x1E,0x76,0x9E,0x18,0x40,0x6E,0x5C, + + 0x19,0xC1,0x03,0xAF,0x2C,0xB4,0x76,0xFE,0x6D,0xDD,0xA0,0x49,0xD7,0x70,0x5C,0x3A, + + 0xD2,0x05,0x37,0x0A,0x1F,0x98,0x06,0xDF,0x6B,0x3A,0xA9,0xEA,0xDE,0x73,0x16,0x5C, + + 0x42,0x10,0xEF,0x2E,0x18,0x2D,0x6A,0x93,0x6A,0x52,0xA1,0x55,0x74,0xD9,0x8C,0xA7, + + 0xD1,0xE3,0x5F,0xC1,0xA9,0x56,0xD1,0x62,0x40,0x8C,0x16,0xD0,0xD9,0x4D,0x71,0xA5, + + 0xA0,0x5B,0x96,0xDF,0x9A,0xBA,0xB8,0xD2,0x14,0x34,0xAF,0xDE,0xD9,0xA3,0x8A,0xC9, + + 0x3F,0x7D,0x18,0x99,0x95,0xB2,0xA6,0x50,0xEE,0x4B,0xAE,0xB4,0xA5,0x4D,0x57,0x2E, + + 0x95,0xCE,0xCB,0x81,0x96,0x1A,0xAA,0xB7,0xCE,0x48,0xE8,0x69,0x1D,0xEC,0xDF,0x72, + + 0xF1,0x4B,0x54,0xA4,0xBA,0x2F,0x52,0x8A,0x86,0x0B,0xF4,0x31,0xD4,0x71,0x31,0x51, + + 0xE0,0x78,0x8D,0x34,0xE8,0xBE,0x6F,0x01,0x3F,0xA9,0x38,0x67,0x75,0xE8,0x38,0xBE, + + 0x63,0x79,0xE5,0xA5,0x90,0xB5,0x4B,0x90,0xE4,0x69,0x72,0x96,0x75,0xA6,0x30,0x45, + + 0xE3,0xBC,0x2D,0x31,0x60,0x5A,0x20,0x61,0x01,0xCD,0x69,0x04,0xBB,0x46,0xED,0xF9, + + 0x2E,0x03,0xA4,0x37,0x14,0x82,0x8D,0x6D,0x8E,0x48,0x25,0xC6,0x5C,0x63,0x3A,0x0A, + + 0xAC,0x26,0xFA,0x23,0x1B,0x04,0x28,0xA8,0x0D,0xC1,0xA2,0x2E,0xFA,0xF2,0xB0,0x3A, + + 0xB0,0xC8,0xA5,0x37,0x94,0xA2,0x3B,0x13,0xCA,0xEB,0x34,0xC9,0x35,0x1B,0x7F,0x69, + + 0x66,0x1A,0xFB,0xED,0x62,0x06,0x2D,0xD2,0x11,0x26,0x1F,0x2B,0xEE,0x8F,0xC2,0xBD, + + 0x2C,0x4C,0x71,0xCC,0xDB,0xD1,0x3D,0xEE,0x7C,0x09,0xCA,0x5E,0x34,0x43,0x33,0x59, + + 0xE8,0x96,0xD4,0xEF,0x77,0x5C,0x7A,0x7A,0x4F,0xA1,0x84,0x79,0xFE,0x32,0x60,0xA3, + + 0x0A,0x43,0x9B,0x6B,0xE9,0xAE,0xB3,0x7B,0x2B,0xCE,0x53,0x1D,0xBC,0xD2,0xB4,0x2D, + + 0xBC,0xCB,0x14,0x21,0xF5,0x2C,0x45,0x1E,0x05,0x3E,0x4F,0x1D,0xFB,0x42,0x26,0xE0, + + 0xDB,0x1B,0xB7,0x02,0x14,0x30,0xBB,0x86,0x57,0x24,0xED,0x2B,0xD3,0xF3,0x3C,0x82, + + 0x84,0x2E,0x1B,0xAA,0x33,0x99,0xC3,0x75,0xD8,0x27,0x3B,0xD4,0xF8,0xEA,0x65,0xB2, + + 0xDC,0xD0,0x9D,0x74,0xCC,0x0D,0x8F,0x5D,0xF4,0x1F,0xB2,0x2A,0x76,0xF1,0xED,0x2E, + + 0x79,0xEF,0x33,0x67,0xAA,0x12,0x84,0x2D,0xE4,0xDB,0x62,0x21,0xCE,0x37,0x9C,0x46, + + 0x3B,0xEB,0x5C,0xB6,0xB6,0x12,0x49,0xA0,0xC7,0x59,0x24,0x95,0x5C,0x7D,0x56,0x3A, + + 0x3D,0xDA,0xB2,0x34,0x33,0xB3,0x07,0x02,0x4F,0x74,0xE6,0xF4,0xE5,0xB4,0x3C,0x3A, + + 0x5B,0x59,0x9D,0xE3,0x5F,0x57,0xAA,0xE2,0x11,0x69,0xD5,0x0D,0x1F,0x15,0x0D,0xD1, + + 0x23,0x9A,0xDE,0x57,0xB3,0x17,0x2D,0x19,0x42,0xE8,0xA4,0xAA,0x56,0x08,0x99,0xC5, + + 0xB9,0x45,0xB1,0x0A,0x1C,0x38,0x08,0x0A,0x25,0x29,0x48,0x46,0xB8,0x35,0x16,0xAB, + + 0x8C,0x36,0x3D,0xAF,0x01,0xFB,0x99,0xCC,0x9E,0xC9,0xC4,0xAE,0x9A,0xF4,0x8E,0xF8, + + 0x90,0x3B,0xFD,0x70,0x1F,0x31,0x6F,0x07,0xC8,0xC1,0x48,0x0F,0x11,0xCA,0xBC,0x1F, + + 0x85,0x8A,0xBF,0x8F,0x1C,0x39,0x85,0x40,0x85,0xD6,0xE6,0x42,0x1A,0xB5,0x3F,0xD8, + + 0xC9,0x51,0xB6,0xBD,0x0E,0x1D,0x0F,0x6E,0x2E,0x95,0x42,0x8C,0xA3,0xB3,0x37,0xC8, + + 0xCA,0xF3,0x4E,0xAC,0x5D,0x81,0x46,0x10,0x69,0x5D,0x12,0x8D,0x49,0x5B,0x3F,0xCF, + + 0xC9,0xBE,0xDF,0xFF,0xCD,0x11,0x1F,0x89,0x55,0xD0,0xF6,0x90,0x59,0xBF,0x0D,0xC6, + + 0xAE,0xDF,0x91,0xD8,0x9B,0xD1,0xBA,0x39,0x6B,0xD1,0xAC,0x8C,0xC1,0x76,0x20,0xEA, + + 0xE9,0x33,0xE6,0x29,0xE5,0x86,0x28,0xDF,0xEC,0x4D,0x6F,0x00,0x63,0xBC,0x1E,0x72, + + 0x61,0xA6,0x61,0x72,0x32,0x81,0x19,0x4F,0xA6,0x00,0xA2,0xCF,0x57,0x02,0x1B,0x03, + + 0x12,0x43,0x10,0xC5,0x84,0x39,0x48,0x3E,0x1D,0x8D,0x29,0xDA,0xEF,0x9D,0x77,0x17, + + 0x60,0x80,0x21,0x29,0xEE,0xDC,0x21,0xC2,0xB9,0x26,0xBA,0x2A,0xBD,0x78,0xF9,0x50, + + 0xB9,0xFB,0x71,0xA5,0xFB,0xDD,0xD0,0xA4,0x71,0xA0,0x0A,0x64,0x61,0xF6,0x7F,0x79, + + 0x05,0x25,0x91,0x44,0xB6,0xA4,0x3E,0x03,0x76,0xCC,0x5D,0xCC,0x60,0x81,0x9A,0x41, + + 0x72,0x17,0x99,0x41,0x26,0x2D,0xEB,0x01,0xC6,0x6B,0x69,0x75,0x75,0x65,0x3F,0x23, + + 0x70,0xB8,0x36,0xAA,0x72,0xA4,0x5D,0x11,0xC7,0x6A,0x03,0x74,0x56,0xE7,0xA8,0x2C, + + 0xF7,0x85,0x12,0x2C,0x24,0xF1,0x2A,0xDB,0x3C,0x09,0x39,0x4A,0xA7,0x13,0x9F,0x87, + + 0xFC,0x80,0x0D,0xE3,0x6E,0x29,0x0C,0x5A,0x21,0x44,0x4E,0x26,0xC4,0x94,0xD7,0xF7, + + 0x07,0xA7,0xDA,0x56,0x3D,0xA0,0x48,0x67,0xB3,0x21,0x97,0xD4,0x80,0x28,0x2B,0xF3, + + 0xEA,0x0F,0xD2,0xDF,0x3C,0xB4,0xE6,0x1D,0x20,0x08,0x36,0x7A,0x64,0xCD,0x7C,0x75, + + 0x76,0xA3,0x3D,0xB2,0xE2,0x55,0xDA,0x1B,0x37,0x47,0x12,0xA9,0x55,0x68,0x34,0x64, + + 0xF2,0xAE,0xBC,0x23,0x2F,0x92,0x10,0x67,0x78,0xED,0x83,0xF0,0xFE,0x92,0xD4,0x3A, + + 0xFE,0xDD,0x98,0x4D,0x9C,0x0E,0x11,0x56,0xE9,0x0C,0x87,0xE9,0xD5,0x04,0x5C,0xAA, + + 0xF3,0x92,0xF0,0xE1,0x68,0x52,0xE4,0x9F,0x37,0x64,0x82,0x6A,0x3E,0x03,0x3C,0x7B, + + 0xAD,0x51,0xE2,0xAC,0x33,0x00,0x54,0xA4,0x28,0x53,0x93,0xCA,0xFF,0x06,0x4D,0xF6, + + 0x43,0xAE,0x37,0x07,0x05,0x39,0x62,0xB6,0x80,0xD2,0x3B,0x30,0x03,0xE6,0xBD,0xB1, + + 0xA0,0x6D,0x29,0xFA,0x7A,0x43,0x03,0xC3,0x80,0xB0,0x9D,0xB9,0xF6,0xE1,0xF4,0x56, + + 0x58,0x65,0x09,0x68,0x46,0x72,0x30,0x95,0x63,0x2F,0x95,0xB0,0x8E,0xAC,0xE9,0xBF, + + 0xBF,0x48,0xE4,0xD8,0xDB,0x6D,0x6E,0x45,0x9D,0x4F,0x0F,0x92,0x8D,0x36,0x35,0xEF, + + 0x5F,0xC0,0x92,0x9D,0x3F,0x31,0x62,0x8D,0xA2,0x36,0xB4,0xF2,0xF0,0x11,0xFE,0x8F, + + 0x43,0x29,0xDB,0xA8,0x91,0x96,0xDE,0x87,0xBF,0xA9,0x5C,0xD4,0x71,0x78,0xDE,0x55, + + 0xAF,0x23,0x49,0x24,0xAA,0x17,0x89,0x21,0x62,0xAF,0xB5,0x17,0x70,0x7A,0x3D,0x06, + + 0x0C,0xB5,0xDF,0x4A,0x9D,0xE7,0xB2,0xCA,0x03,0x09,0x06,0x20,0xF8,0xC5,0x30,0x28, + + 0x07,0xC6,0xE8,0xB1,0xCC,0x9F,0x4D,0x4B,0xD6,0x05,0x0B,0x4F,0x05,0xD6,0x51,0xB8, + + 0x09,0xE5,0x86,0xEB,0x47,0x54,0x17,0x5A,0xD4,0x18,0xAD,0x5E,0xCC,0xD5,0xB0,0xA9, + + 0xAB,0x5A,0x1E,0x5D,0xA1,0xC6,0xA4,0xF7,0x00,0x41,0x0C,0x4E,0x81,0xD4,0xD6,0x8A, + + 0x8B,0x10,0xF8,0xA0,0x78,0xC3,0x5C,0x48,0xD5,0xE9,0x06,0x6E,0x58,0x8E,0xEE,0x9A, + + 0xA8,0xB6,0xC3,0x58,0x26,0xB5,0x14,0x13,0x58,0xFD,0xBE,0x5C,0x21,0xF6,0x3F,0x8B, + + 0x26,0x12,0x07,0x0C,0xC8,0x8B,0xCB,0xD6,0xD7,0x1C,0xEF,0xBD,0xFE,0x71,0x27,0x59, + + 0x89,0x0F,0x0F,0x1D,0x0F,0x92,0xE7,0x06,0xD8,0xBF,0xDB,0x1F,0x79,0x7C,0x41,0x26, + + 0x67,0x45,0xA1,0x60,0xEF,0xE2,0x26,0x40,0xBB,0x6D,0x26,0xE1,0x96,0x80,0x7A,0x44, + + 0xEE,0xE5,0xCE,0x74,0xEE,0x3E,0x58,0x65,0xE6,0x81,0x28,0x44,0xE2,0xBC,0x36,0xF0, + + 0x00,0x0F,0xA5,0xB4,0x61,0xC1,0x65,0x86,0x33,0x83,0xB9,0x22,0xAB,0x3D,0xB9,0x97, + + 0x81,0x8C,0xF0,0x07,0x93,0x23,0x3B,0x18,0x5C,0x7E,0x15,0xA4,0xB9,0xE9,0x36,0x7A, + + 0xED,0x15,0xF6,0x24,0xDE,0xDD,0xB0,0xB2,0x3E,0xDF,0x17,0xA6,0x4A,0xA6,0xFF,0x6C, + + 0x73,0x30,0xD7,0xC9,0xE8,0x38,0xB8,0x4D,0x6C,0x87,0xE0,0x9E,0x9B,0x25,0xE0,0x41, + + 0x74,0x73,0x99,0x75,0x69,0xCA,0xF7,0x1C,0x61,0xC2,0xBB,0xFC,0xD0,0x35,0x7E,0x69, + + 0xF7,0x9C,0x8F,0xB5,0x60,0x12,0x33,0x6C,0xF4,0x27,0xD9,0x7E,0xE4,0x03,0x18,0xE7, + + 0x7C,0xD3,0x2D,0x10,0x2C,0x5C,0x1F,0x64,0xB9,0x94,0x31,0xAA,0x2E,0x1C,0xAA,0x0A, + + 0x7B,0x26,0x51,0x16,0xB8,0x56,0x5A,0x6D,0xEE,0x89,0x3E,0xC3,0xAA,0xA8,0x27,0xE0, + + 0x3F,0xE4,0xB6,0xE7,0x5F,0xE7,0x9E,0x54,0x51,0x8B,0x73,0x97,0x2E,0xE2,0x8F,0x79, + + 0x7E,0xEE,0x47,0x8C,0xA5,0x76,0x39,0x38,0x4F,0xBE,0x3A,0x3D,0x2C,0xB0,0xE6,0xCE, + + 0x4E,0xC5,0x7E,0xB6,0x1E,0xEE,0xCD,0x8C,0xB2,0xC7,0x28,0x6E,0xD9,0x6C,0x4D,0x63, + + 0xDF,0x1C,0x51,0xB8,0x0F,0x50,0x7C,0x05,0xE8,0x8F,0x2C,0x42,0x6C,0x09,0xC4,0x76, + + 0x5A,0x5F,0xE7,0xFC,0xAD,0xFE,0xB3,0xBB,0xB6,0xD5,0x33,0x33,0x2F,0xAC,0xD8,0x77, + + 0x73,0xFE,0x13,0xAE,0x86,0xAF,0x76,0xC4,0x6B,0x8D,0x41,0x9F,0x93,0xF4,0x5A,0x84, + + 0xC5,0x13,0x41,0xF8,0xA2,0xB8,0x6C,0x22,0x57,0x48,0xA7,0x88,0x18,0xAD,0x76,0x98, + + 0x4D,0x70,0xF5,0xC9,0x90,0x31,0x84,0x41,0x59,0xCA,0x7C,0x0E,0xA9,0xAC,0x8F,0x70, + + 0x28,0xD3,0xE1,0x27,0xC0,0x62,0x8D,0x50,0xD0,0xC2,0x59,0x28,0xF7,0x01,0x53,0x95, + + 0x44,0x10,0xF3,0x75,0xA5,0x36,0xCC,0xD5,0x52,0xC3,0x7D,0xA6,0xD7,0xFE,0x24,0x04, + + 0x6E,0xD6,0x7D,0x01,0xFC,0xCD,0xCC,0x19,0x0D,0x0C,0x33,0x84,0x37,0xD4,0x56,0x2D, + + 0x21,0xED,0x2C,0x13,0xDE,0x1E,0x32,0xE3,0x54,0xAE,0xC6,0x14,0xF5,0xBD,0x29,0x7B, + + 0xDD,0x92,0xED,0xA7,0x57,0x49,0x75,0xCC,0xCB,0x94,0x8D,0x65,0xD4,0x24,0x67,0x15, + + 0xE7,0xBA,0x74,0xD7,0x30,0xB5,0xC7,0x1C,0x0E,0xAE,0x37,0x07,0xFB,0xF8,0x8C,0x79, + + 0xA0,0xD9,0xC6,0xC1,0xB4,0xB7,0x8E,0x45,0x5F,0xD6,0xC8,0x86,0xD0,0xF5,0xD1,0x5D, + + 0xE7,0xDA,0xF7,0xC0,0x98,0x39,0xC1,0xFD,0xF3,0x04,0xC0,0x93,0x94,0xE8,0x1F,0x75, + + 0x00,0x97,0x87,0x8B,0x39,0x6B,0x8F,0x55,0xFC,0x97,0xC9,0x86,0x94,0x8B,0x94,0x08, + + 0x87,0xDA,0xF1,0x7D,0xAD,0x3E,0xDE,0xFB,0xB5,0x26,0xE9,0x93,0x16,0xAA,0xCC,0x48, + + 0x0C,0xD8,0x0E,0xDE,0x0D,0xC7,0xD3,0x08,0x8E,0x78,0xCC,0x11,0x78,0x96,0x91,0x58, + + 0xE2,0x11,0x11,0x36,0x00,0x70,0x27,0xF2,0x86,0xD2,0xE1,0x13,0x3E,0x70,0x5F,0x35, + + 0x02,0x93,0x65,0x27,0xFE,0xF3,0xEB,0x09,0x0E,0x21,0xC9,0x13,0x37,0x05,0xD4,0xC4, + + 0x0C,0xDD,0x43,0x40,0xBE,0x77,0x87,0xF3,0x12,0x90,0x80,0xFB,0xBC,0xC8,0x5A,0x3C, + + 0x68,0xE1,0x40,0xC4,0xE9,0x4E,0x40,0x53,0x67,0xEB,0xB0,0xD7,0xF3,0x72,0xBD,0xE3, + + 0x8D,0x40,0xEA,0x15,0x35,0xAA,0xB5,0xC3,0xC5,0xCC,0xE0,0x10,0xDE,0xCC,0x7F,0x07, + + 0x61,0x81,0x3E,0x97,0x90,0xFF,0x69,0x35,0x20,0xC3,0x29,0x55,0x50,0xC4,0x77,0x16, + + 0x34,0x0C,0xFE,0x24,0xFD,0x3C,0x4B,0x7F,0xE5,0xEE,0x54,0xA6,0xE1,0xCE,0x1A,0x42, + + 0x90,0x45,0x75,0xC0,0x47,0xB5,0x2E,0x66,0xA3,0xC7,0xEE,0x4D,0x90,0x54,0xFC,0x77, + + 0xA2,0x9A,0x5E,0x13,0xD9,0x1F,0x5A,0x73,0x70,0xD9,0x74,0x0B,0x91,0x60,0xE4,0x47, + + 0x16,0x62,0xFB,0xB6,0xFE,0x8B,0xF8,0x92,0x4E,0x06,0xD9,0x61,0x52,0x7E,0xFD,0x33, + + 0xA7,0x5C,0xC1,0x51,0x1B,0xB5,0xE1,0x8E,0x4E,0x5C,0x62,0xE7,0xD3,0x6D,0xB6,0x67, + + 0xAB,0xB5,0x3A,0xF3,0x7B,0x42,0xCA,0xD9,0xEB,0x88,0x04,0x5C,0xD8,0x77,0xBF,0x8F, + + 0x0F,0xA9,0x72,0x38,0xB8,0x96,0xBA,0x4A,0x2B,0x35,0xFB,0x18,0xA6,0xBC,0x5D,0xEB, + + 0x8C,0x0C,0x95,0x38,0x2B,0xD7,0x21,0x19,0xA0,0xE5,0xAD,0xE1,0xB9,0x6E,0x5B,0x7B, + + 0xAD,0x97,0x4B,0xCD,0x25,0xD6,0x8B,0xC9,0x8E,0x3A,0x8A,0x2C,0xE9,0xE0,0xF7,0xA5, + + 0x08,0xA7,0x98,0x81,0x72,0xCD,0x3E,0x0E,0x94,0xC7,0xD1,0x1F,0x6E,0xEA,0x11,0x5A, + + 0x74,0x2D,0xB4,0x74,0xF8,0x26,0xC9,0x8B,0xCF,0xC0,0x5E,0x3C,0x5F,0x69,0x15,0x48, + + 0xF1,0x0E,0x03,0x6D,0xDA,0x23,0x73,0x4D,0xA9,0xCB,0xFB,0x1E,0xE2,0xE8,0xDB,0xDB, + + 0x0B,0x44,0x4B,0x5E,0x89,0xA4,0x09,0x33,0x20,0x2B,0x0F,0xBA,0x32,0x3E,0x8C,0x27, + + 0xDC,0x01,0xBC,0x7F,0xCD,0x71,0x82,0x51,0xC3,0x10,0x04,0xCB,0x8F,0xAB,0x2D,0xA1, + + 0x4D,0x0E,0xA1,0x67,0xBD,0x70,0x1A,0x10,0x02,0x3A,0x24,0x4F,0x77,0x51,0xC5,0x41, + + 0xF0,0x99,0xFB,0x83,0x51,0xB1,0x75,0x33,0x06,0x12,0x95,0xC3,0x03,0x62,0xB5,0x6E, + + 0xC2,0x04,0xF3,0x93,0x50,0xB0,0x8A,0x42,0x65,0xDE,0xEB,0xCB,0x0E,0x32,0xBB,0x3C, + + 0x22,0x8F,0x8C,0xC0,0x1B,0xF9,0x6C,0x13,0x44,0x31,0xEA,0xC9,0xFD,0xF2,0x48,0x63, + + 0xAC,0x54,0xB8,0x13,0xDA,0x64,0xF1,0x8F,0xFE,0x09,0x5A,0x87,0x4F,0x1B,0x45,0x38, + + 0xB6,0x54,0x72,0xED,0xB4,0x2E,0x6D,0x12,0xCC,0x17,0xC7,0xA5,0xAC,0x72,0x73,0xE4, + + 0xCB,0x1A,0xAF,0x37,0x5A,0x06,0xE6,0xBF,0x02,0x68,0xBF,0x77,0xF2,0xB5,0x10,0xA0, + + 0xC3,0x5C,0xAB,0x7F,0xB4,0x79,0x44,0xE6,0x83,0x3C,0xA8,0x85,0x18,0x58,0xAA,0xBC, + + 0xC0,0xF8,0xBC,0xA5,0xC6,0x94,0x60,0xBE,0x88,0xDA,0x0E,0xDA,0x05,0x36,0x3D,0x39, + + 0x3D,0xB5,0xB4,0x6F,0x53,0x35,0x87,0x59,0x2B,0x6B,0x68,0xDF,0xD6,0xA5,0x19,0xFB, + + 0xC9,0xB8,0xF7,0x25,0x4E,0x7A,0xB5,0x4A,0x65,0x1A,0xDE,0xDB,0x9B,0x7B,0x54,0x7C, + + 0xC1,0x58,0xA4,0xCC,0x39,0x2C,0x2F,0xCC,0x09,0x36,0x8C,0xD0,0x12,0x6D,0xEA,0xFC, + + 0xC2,0xFC,0xAC,0xDC,0x3A,0x7D,0xCE,0x10,0x79,0x10,0x9C,0x1E,0x18,0x07,0x7D,0x79, + + 0x3F,0xB1,0x78,0x5F,0x19,0xE3,0x41,0xDC,0x59,0x13,0x17,0xCD,0xBA,0x73,0x59,0xBB, + + 0xCB,0x95,0x27,0x54,0x02,0xB5,0xA0,0x8A,0xC6,0xAB,0xC9,0xC8,0xFD,0x7E,0x1F,0x58, + + 0x99,0x7D,0xDE,0xE4,0xF4,0xE1,0x4E,0x24,0xA5,0x43,0xB8,0x1A,0xBF,0xA4,0xA8,0x90, + + 0xB9,0xBA,0x57,0x92,0x1E,0x2A,0x62,0x43,0x79,0x6E,0x1C,0x12,0xA2,0x1C,0x8C,0x6C, + + 0xEF,0x8D,0x9F,0x3B,0xF4,0xE2,0x1C,0xD0,0x48,0x83,0x8B,0x97,0x5C,0x4D,0xE9,0x02, + + 0xA7,0x8E,0x16,0x50,0xB1,0x08,0x99,0x41,0xA7,0xFF,0xAF,0x55,0x2A,0x3E,0x58,0xBD, + + 0x35,0xE2,0x78,0x77,0x26,0xBB,0xE0,0x10,0x75,0xA2,0x17,0x15,0x6E,0x32,0xF8,0x30, + + 0x70,0x85,0x1C,0x34,0xFC,0x34,0x00,0x55,0xE4,0x84,0xD7,0x2C,0xA2,0x79,0xDB,0xBD, + + 0x0B,0x70,0x59,0xAC,0x90,0xA7,0x8B,0xE1,0x57,0xD9,0xF9,0x7F,0x0F,0x1B,0x40,0x28, + + 0x16,0x97,0xDE,0x7F,0x6B,0x46,0x19,0x38,0x8C,0xCA,0x4E,0x5B,0x23,0xD6,0xB2,0x75, + + 0x67,0x87,0xDA,0x0A,0xF5,0xB9,0x4C,0x2D,0x68,0x43,0x66,0xD0,0x3F,0xE4,0xAA,0x0B, + + 0x2F,0x3C,0xD2,0x39,0xE0,0xA6,0x9A,0x48,0x2F,0xF5,0x9E,0x82,0xB6,0x8D,0xA3,0x89, + + 0x30,0x39,0x63,0x1E,0xBE,0x77,0x18,0x1A,0xFC,0x65,0x24,0xDC,0x58,0x61,0x3A,0x24, + + 0xE1,0xC9,0x3B,0x7D,0x6E,0xCE,0x45,0x3C,0xE9,0x66,0x83,0xC1,0x71,0xE6,0xF2,0xB3, + + 0xB4,0x57,0x22,0x1B,0x1E,0x78,0x70,0x88,0xEF,0xA0,0xD2,0x7E,0xA6,0xBD,0xE5,0x0D, + + 0xF2,0xCC,0xD4,0x72,0xDD,0xA5,0x82,0x72,0xA6,0x04,0x9A,0x61,0x63,0x40,0x43,0xB6, + + 0xC3,0xCC,0xF6,0x50,0xAA,0xC2,0x11,0x6F,0xEA,0x43,0xC0,0x46,0xD8,0xC4,0x0B,0x59, + + 0xF2,0x82,0xD5,0x76,0x5D,0xAF,0x83,0x5F,0x24,0xAB,0xE8,0x5F,0x72,0xDF,0x5A,0x84, + + 0xC5,0x13,0x64,0x56,0x15,0xDE,0xCB,0x4A,0x8A,0x9D,0x4C,0x82,0xE8,0xFF,0x12,0xA7, + + 0x4D,0x9C,0xCE,0x92,0x11,0x1E,0xB3,0x54,0x41,0x93,0x2F,0x45,0x01,0x7C,0x08,0x70, + + 0x28,0xD3,0x1A,0x15,0xB4,0x6F,0xBE,0x45,0xF4,0x9F,0x87,0xD4,0x57,0x53,0x3F,0x06, + + 0x4E,0xD7,0x09,0xF5,0x42,0xD6,0xEA,0xAC,0xD6,0x27,0xEB,0x8E,0x1E,0x42,0x1A,0xC4, + + 0xC7,0x17,0x9C,0x3D,0x17,0x56,0x0C,0xD0,0x42,0xD7,0xF6,0x16,0x89,0xFB,0x93,0x2A, + + 0x27,0x2E,0xD4,0x2C,0xCE,0xD9,0xC4,0x35,0xA5,0xE5,0xEC,0x91,0x0F,0x78,0xCC,0x30, + + 0x2A,0xD7,0xBC,0x8A,0x13,0x37,0xB4,0x62,0xD5,0x2D,0xD5,0x43,0x1F,0x67,0xE9,0x57, + + 0xAF,0x30,0x8E,0x97,0xE7,0x4A,0x75,0xFA,0x65,0xD3,0x00,0xCC,0xC7,0x02,0x1C,0x3A, + + 0xB5,0x37,0x9E,0xAA,0x0F,0x0E,0x8C,0x50,0x7C,0x15,0x5A,0xDD,0x08,0x7E,0x70,0x78, + + 0x29,0x9F,0xF7,0x5D,0xC2,0xD7,0x85,0x20,0x49,0xD4,0xBE,0x9A,0xF2,0x0F,0x83,0xAF, + + 0x45,0x7B,0x1F,0x71,0xAC,0xF7,0x48,0xEC,0x11,0x6C,0x48,0xDC,0x84,0x7C,0x4D,0x11, + + 0xA9,0x3B,0x17,0x00,0x48,0x32,0x44,0x9C,0x4C,0x64,0x04,0xCF,0x7D,0xE4,0x39,0xDB, + + 0x2A,0xBC,0x84,0x56,0xCB,0x3A,0x7D,0x88,0x4E,0x11,0x60,0x6A,0x0C,0x1E,0xCA,0xB8, + + 0xD8,0xF8,0xEE,0x23,0x6D,0xD3,0xF9,0x03,0x1B,0x46,0xEF,0xC1,0x13,0xBF,0xC9,0xC4, + + 0x2A,0xCA,0xE7,0x0F,0xFE,0x65,0xF7,0xE8,0xBB,0xA5,0xFF,0xE3,0xE2,0x4B,0x57,0xFF, + + 0xCF,0xF4,0xD1,0xF3,0x7D,0xB6,0xCA,0x06,0x2E,0x04,0xAC,0x6A,0xFC,0x0F,0x3E,0x38, + + 0x20,0xED,0x88,0x15,0xE5,0x6F,0x4A,0x42,0xBB,0x46,0xE8,0x28,0xB0,0xE1,0x28,0x18, + + 0x0C,0x90,0x90,0xCD,0x7A,0x90,0xD8,0xB4,0x65,0x70,0xE0,0xCA,0xF4,0x0D,0x07,0x44, + + 0xF0,0x06,0x80,0x7A,0x37,0x5F,0x31,0x86,0x61,0x4B,0x10,0xDA,0x31,0xC1,0x08,0x13, + + 0x8D,0x69,0x89,0x06,0xF4,0xF2,0x39,0x20,0x4C,0x20,0x7E,0x4B,0xB0,0x67,0x20,0x0F, + + 0x86,0x09,0xBE,0xF4,0xFB,0x47,0x6D,0x00,0x46,0x0A,0xE8,0x1B,0xD3,0x69,0x00,0x49, + + 0x60,0x25,0x9E,0xF0,0xE4,0x49,0x73,0x0F,0x92,0xF8,0x18,0x50,0xC2,0x6B,0xBA,0x2E, + + 0x0D,0xD0,0xD3,0x0F,0x6D,0xAB,0xC2,0x27,0xF6,0x07,0x62,0xD5,0x2E,0xC5,0x60,0x2E, + + 0x12,0x17,0x76,0xC6,0xEF,0xFA,0x41,0x6D,0xF0,0x0F,0xE1,0x8A,0x50,0x6A,0x11,0xF5, + + 0x0E,0x09,0xBC,0x78,0x1E,0x09,0xB9,0x8D,0x9D,0x56,0xEB,0xDC,0xD8,0x7E,0x0C,0x2D, + + 0x20,0xE9,0x9D,0x1C,0x72,0xF8,0xA1,0xB1,0xE6,0x4F,0xF3,0xDA,0x49,0x26,0xF7,0x7A, + + 0xF8,0x05,0x3B,0x4D,0xDC,0x81,0x6E,0xC0,0x81,0x25,0x9B,0x21,0x39,0x71,0x31,0xEA, + + 0xE5,0x80,0x74,0x0E,0xED,0xE2,0x3B,0x9F,0x68,0x42,0x9A,0xDB,0x5C,0xFA,0x62,0x4C, + + 0x87,0x6F,0xA4,0x70,0x1B,0x6E,0xEA,0x9B,0x2C,0x5C,0x29,0xE8,0x56,0x58,0xF5,0x28, + + 0x4B,0x06,0x35,0x2E,0x71,0xAE,0x7A,0xB5,0xCB,0xDD,0xE4,0xD4,0x5D,0x6C,0x2A,0xB3, + + 0x31,0xFE,0xFD,0xFC,0xFA,0x32,0xEB,0x9A,0xA4,0x48,0x43,0x9C,0x79,0x2E,0x2A,0xDD, + + 0xF9,0x52,0x30,0x9A,0x72,0x4C,0x02,0xC4,0x6E,0xE0,0x8D,0x1F,0x68,0x0A,0x92,0x04, + + 0x00,0x0E,0xDD,0xD4,0x36,0x11,0x4D,0x2B,0x66,0x11,0x6F,0xC4,0x33,0x1C,0x9A,0xE3, + + 0x4D,0x96,0x98,0x5F,0x8C,0xCE,0x24,0xD0,0x67,0x13,0x70,0x2E,0x70,0x11,0x5F,0x80, + + 0x03,0xB2,0xA9,0x6D,0xF9,0x70,0xE3,0x23,0x60,0xF5,0xAE,0x3B,0x4F,0xAF,0x8A,0x52, + + 0x85,0x6F,0x56,0x95,0x82,0x05,0x8D,0x98,0x61,0xF3,0x26,0x2F,0x4E,0x75,0x7E,0x48, + + 0x85,0x58,0x3B,0x37,0x14,0x58,0x2A,0x41,0xE0,0x50,0x70,0x23,0xB0,0x78,0x4E,0x38, + + 0xB4,0xA8,0xF2,0x70,0xF9,0xE4,0x98,0x20,0x6B,0xEC,0x94,0x7C,0x10,0x0F,0xD4,0xE5, + + 0x5F,0x1D,0xFB,0x60,0x78,0xC7,0x5A,0x83,0xEC,0x34,0xEB,0xE2,0x30,0x76,0xB5,0x39, + + 0x34,0x5A,0x85,0xC1,0x7B,0xE6,0x45,0x70,0x12,0xF6,0xCB,0x5D,0xF5,0x76,0xB9,0xC7, + + 0xAA,0x1C,0x46,0xAD,0xF1,0x23,0xBA,0x0D,0xBD,0x3B,0x3B,0xAA,0xD9,0x27,0x6E,0x9A, + + 0x26,0x14,0x21,0xF3,0xE4,0xE2,0x7D,0x5F,0x9C,0x6B,0x5E,0x4C,0x71,0x65,0x4D,0xEB, + + 0x43,0xD3,0x66,0x09,0x90,0x04,0xBC,0x63,0x53,0x61,0x2A,0x6A,0x6E,0x70,0x71,0x4D, + + 0x2B,0x1F,0x8F,0x75,0x27,0x79,0xE3,0x3B,0x69,0xDC,0x20,0xF7,0xE9,0x7F,0x59,0xA8, + + 0x64,0x91,0x16,0xDF,0x46,0x5F,0x6E,0xD8,0x00,0xF3,0xD4,0x1C,0x85,0x73,0xB1,0x1F, + + 0xE9,0x1D,0x59,0x2F,0x15,0x90,0x9E,0xDC,0x9D,0x46,0x8F,0x78,0x5B,0xDE,0x06,0x2F, + + 0xBA,0x53,0x6B,0xBE,0x94,0x98,0xF7,0x9B,0x88,0x62,0x89,0x0F,0xFE,0xD3,0x47,0xCC, + + 0x56,0x99,0x1F,0x4E,0xCF,0x90,0xFD,0xFB,0xB7,0xC2,0x85,0x02,0x58,0x1A,0x0A,0x33, + + 0x68,0xC2,0xFE,0x3F,0x14,0x04,0xF0,0xA6,0x60,0xF1,0xC3,0xD9,0x18,0x6D,0xEB,0xE2, + + 0x71,0x20,0x68,0x37,0xB0,0xA9,0x93,0x97,0x90,0xDF,0x98,0xD3,0xA7,0x3E,0x31,0x13, + + 0x25,0x8B,0x6B,0x3B,0x7D,0x68,0x11,0x32,0x49,0xA1,0xCE,0xCF,0x47,0xAD,0xBF,0x97, + + 0xA5,0x03,0x2B,0xE6,0xED,0xA3,0x44,0xDA,0x63,0xAC,0xBB,0xCE,0x8D,0xE7,0x70,0x20, + + 0x02,0x09,0x07,0x35,0x30,0x72,0xA2,0x6A,0xE3,0x6B,0xC8,0x95,0xD2,0xF0,0x70,0x43, + + 0x88,0x03,0xFB,0xBC,0xF6,0xEA,0x40,0x99,0x86,0x4F,0xC6,0x71,0x95,0xE5,0x1C,0x28, + + 0xFE,0x39,0xE9,0x53,0xF5,0xCC,0xA7,0xE1,0x46,0x5C,0x55,0x20,0x14,0xE0,0x6A,0x13, + + 0x97,0x0A,0x45,0x24,0xB9,0x01,0xFE,0x82,0x64,0xC6,0xF1,0xC7,0x2E,0x61,0x1A,0xEA, + + 0x4E,0x03,0xFC,0x32,0xE3,0x0C,0x89,0xA3,0xE3,0xD3,0xA9,0xD7,0x08,0x65,0x92,0xCA, + + 0xAE,0x82,0x6A,0x3F,0x94,0xB2,0x82,0xD2,0xD3,0x35,0xC4,0x38,0xBC,0x6A,0xBB,0x3A, + + 0xE0,0x95,0x30,0xDB,0xAF,0x8D,0x47,0x4D,0x33,0xDA,0x4C,0xDF,0x4C,0x1B,0xAA,0xEB, + + 0x4E,0x2A,0x5B,0x9B,0xB5,0x95,0xC3,0x33,0x30,0x84,0x16,0xCC,0x51,0xE6,0x3B,0x81, + + 0xA9,0x9C,0xB4,0x3D,0x38,0x0A,0x40,0x79,0xED,0x1D,0x92,0x14,0x9C,0xEC,0x83,0x3C, + + 0xF0,0xE3,0xBC,0x6E,0xE0,0x02,0xFD,0x8B,0xEC,0xCC,0xAE,0x1C,0xEC,0x88,0x5C,0x49, + + 0x92,0x95,0xB1,0x0F,0xCE,0x03,0x0D,0x56,0x77,0x44,0xFB,0x57,0xD8,0xEF,0x09,0x43, + + 0x8E,0x4F,0x3F,0x2C,0xFD,0x2C,0x49,0x68,0x6C,0xCC,0xC3,0x8C,0x5B,0xFB,0x14,0xE0, + + 0x67,0x60,0xB0,0xD5,0x07,0x26,0x0C,0xC2,0x62,0x92,0x34,0xE1,0x5A,0xEE,0x14,0x55, + + 0xE7,0x51,0xF5,0x12,0x11,0x56,0x90,0x17,0xB0,0xB2,0x2F,0xB4,0x53,0xF0,0x45,0xC8, + + 0xC7,0x9D,0x65,0xA6,0x2F,0xA9,0xA5,0x8A,0x64,0x72,0xCE,0x5C,0xD6,0x83,0x25,0x96, + + 0xC6,0x53,0x3D,0xCD,0x48,0x2F,0x96,0x79,0x5E,0xE8,0x28,0x9E,0x77,0x8F,0x63,0x02, + + 0x22,0xDA,0x34,0x81,0xDF,0x17,0x62,0x80,0x06,0x36,0x8C,0xC2,0x15,0x8E,0x94,0xF6, + + 0x14,0xAB,0xD2,0x66,0xFD,0x64,0x51,0x76,0x43,0x02,0x41,0x14,0x17,0x24,0xF4,0x2B, + + 0x31,0x2B,0x83,0xFA,0x5D,0x15,0x0B,0xE5,0x07,0x55,0x62,0x63,0xD6,0x76,0xD5,0xF3, + + 0x4A,0xF7,0x93,0x67,0x43,0xF4,0x24,0xE1,0x42,0x78,0x3D,0xD7,0xB7,0x7C,0x5E,0x62, + + 0x86,0xDA,0x9C,0x65,0x0F,0xA6,0xD7,0x4D,0x99,0xEA,0x92,0xCC,0xCB,0x94,0x14,0x7C, + + 0x3D,0x34,0xCE,0x9C,0xF3,0xB4,0xC5,0xB2,0xC8,0xC2,0x5F,0xFE,0x35,0xF4,0xB7,0x3C, + + 0x9F,0x12,0x1F,0xBE,0x8D,0xF5,0xCB,0x43,0xAD,0x97,0x54,0x40,0x09,0x94,0xE5,0x7D, + + 0x2F,0xA7,0x85,0x4F,0xE1,0x10,0x5C,0x3F,0xC5,0x80,0x42,0xC1,0x63,0x84,0xDE,0xDA, + + 0x89,0x87,0x51,0x6B,0x38,0xFD,0x24,0xE2,0xCB,0x73,0xF2,0x0C,0x78,0xFD,0x0C,0xDE, + + 0x2E,0xED,0x38,0x24,0xC4,0xFF,0x18,0x5B,0x84,0x7E,0xC1,0x1C,0x5B,0xFD,0x0A,0xAD, + + 0x51,0xF0,0xCE,0xF1,0xD8,0x4B,0x21,0xAC,0x07,0x7D,0xA3,0x95,0x5D,0x9B,0xD0,0x8B, + + 0x2F,0xD0,0x6F,0x21,0x4A,0xB3,0x41,0x4B,0x25,0xDC,0xFF,0xFF,0xFF,0xFF,0x59,0x0A, + + 0xE5,0xAF,0xD0,0x76,0xFB,0x83,0x10,0xD8,0x61,0xBB,0x40,0x5E,0x26,0xCF,0x30,0xEF, + + 0x8E,0x87,0x10,0x54,0x15,0x00,0x38,0x54,0xC6,0x63,0xFE,0x40,0x32,0x65,0x10,0x83, + + 0x00,0x0A,0xBF,0xB4,0x1D,0x84,0x15,0xA5,0xE9,0x4C,0xC5,0xE2,0x39,0x21,0x8F,0x51, + + 0x9D,0x05,0xF1,0x66,0xBC,0x9C,0xF1,0x24,0x43,0x47,0x87,0x94,0x43,0x6B,0xD5,0x33, + + 0x2F,0xAF,0xC6,0xAC,0x12,0x69,0x56,0xF5,0x42,0x44,0x00,0x86,0xBB,0x95,0x37,0x23, + + 0xA0,0x56,0xD7,0xC7,0x62,0x49,0x4D,0x03,0x7B,0x29,0x8E,0xB4,0x5D,0x90,0x39,0x45, + + 0x62,0x77,0xBF,0xE5,0x1F,0x8B,0x51,0x61,0x23,0xE9,0xC9,0xED,0x5F,0xC0,0x32,0x22, + + 0xBF,0xA3,0x90,0x43,0x55,0xA5,0x3F,0x5D,0xC0,0x6D,0x4E,0xF1,0x8A,0x60,0x22,0x5C, + + 0xA9,0xD7,0xD9,0x0C,0x27,0x4B,0x81,0x4A,0x09,0x68,0x90,0xC4,0x53,0x6C,0x0E,0xE2, + + 0xE8,0x0F,0xD9,0x18,0xE5,0x2A,0x62,0x5A,0xAA,0x4F,0x00,0xC3,0xB8,0xEF,0xBC,0x75, + + 0xA9,0x4A,0xDD,0xA0,0xB2,0x81,0x6B,0x4B,0x89,0x0A,0x52,0x6A,0x39,0xCC,0x2B,0x4D, + + 0x2A,0xF6,0x38,0x20,0x9F,0xF8,0x3B,0x04,0x6A,0x4D,0x9B,0xC3,0x54,0xC6,0xDE,0xAA, + + 0xEA,0xA8,0xBC,0xFD,0x71,0xAF,0x0B,0x0B,0x4C,0xCC,0x69,0x9F,0x7C,0x00,0xE5,0x37, + + 0xD6,0xD1,0xF0,0xAF,0x6F,0x80,0x67,0x3A,0xEA,0x10,0xFC,0xD8,0x39,0xC9,0x3B,0x18, + + 0x61,0xC6,0x3C,0xBC,0xB0,0xD1,0x25,0x03,0x4B,0x43,0xB5,0xDD,0xD9,0xAE,0xF2,0x07, + + 0xB4,0x0D,0x58,0x1A,0x51,0x2C,0x73,0x1B,0x76,0x43,0x4C,0xDC,0x93,0xBE,0x2C,0x81, + + 0xFD,0x30,0x8C,0x90,0xF8,0x13,0xD4,0xFC,0x6C,0x56,0xF5,0xE4,0x34,0xD4,0x37,0xD6, + + 0x75,0x31,0x20,0xE7,0x53,0x97,0x64,0x32,0xE1,0x59,0x51,0x45,0xD2,0x31,0x6B,0x47, + + 0xF4,0x32,0x51,0x96,0x96,0xB1,0x35,0xF5,0x83,0xAD,0x41,0x69,0x38,0xF1,0x36,0x60, + + 0xF9,0xF3,0x47,0x65,0x31,0x2C,0x65,0xB3,0xBB,0x48,0xA3,0x04,0x73,0x06,0x3F,0x31, + + 0x6B,0x14,0x39,0xB6,0x04,0x6B,0xA9,0x22,0xC3,0x0B,0x2B,0xC0,0x96,0xF7,0x5B,0xFE, + + 0x53,0xE0,0x0C,0x89,0x4C,0xC1,0x64,0x1A,0x65,0x15,0x4B,0x87,0x06,0x7E,0x63,0xED, + + 0xE7,0x63,0x72,0x60,0xFA,0x55,0x3D,0x83,0x59,0x58,0x62,0x44,0xD6,0x3A,0xDA,0xEF, + + 0xD7,0x55,0x1D,0xA7,0x08,0x28,0xE1,0x19,0x4A,0x15,0x12,0x1D,0xF9,0x3A,0xAE,0xB0, + + 0x20,0x85,0x98,0x29,0xAA,0x32,0x37,0x5C,0xF8,0x5C,0xD6,0x28,0x30,0x7B,0xBC,0x1C, + + 0x02,0x58,0x71,0x63,0xD8,0xBA,0x3B,0xBA,0x63,0xA2,0xA0,0x0C,0xDA,0xD4,0xD8,0x8C, + + 0xAE,0x8B,0xC8,0xFE,0x95,0xBB,0xD1,0x41,0x78,0x91,0xA9,0x08,0x5B,0x1F,0xD0,0x9D, + + 0xAF,0x8A,0x70,0x63,0x44,0x9A,0x9B,0x3D,0x99,0x9E,0x03,0x4C,0x5A,0x3B,0xCB,0x59, + + 0xC3,0x4D,0xBD,0x37,0xCD,0x7E,0x54,0x26,0x83,0x2D,0xCE,0x3D,0x58,0x3C,0xFD,0x3A, + + 0x43,0xAC,0x0E,0xCC,0x66,0x61,0x64,0x49,0x49,0xF2,0x36,0xC1,0x7D,0x65,0x19,0x2B, + + 0xAE,0x9B,0x47,0x33,0x89,0xDE,0x41,0x48,0x01,0x7D,0x1F,0xCD,0x86,0x86,0x31,0xE0, + + 0x5E,0xBC,0x74,0x93,0x26,0xC2,0x0F,0xE8,0xD3,0x5B,0xDF,0x3B,0xF7,0x64,0x52,0x1A, + + 0x04,0x88,0x8B,0x75,0x3E,0xA3,0x10,0xCA,0xE5,0x3F,0x60,0xB9,0xA1,0x69,0x39,0x2B, + + 0x6D,0x8C,0xCE,0xB2,0xFE,0xE2,0x58,0x30,0x31,0xCC,0xA2,0x34,0xC7,0xEB,0xA1,0x02, + + 0x75,0x84,0x1F,0x23,0x19,0x2F,0x11,0xB2,0x41,0xE0,0x91,0xCD,0x3D,0xC1,0xF5,0x12, + + 0xCC,0xA3,0x93,0x84,0xBF,0x0C,0x73,0xCD,0x66,0xCE,0xBF,0xDF,0xDC,0xAE,0xB9,0x6D, + + 0x00,0xFC,0xE8,0x42,0x3F,0x21,0x48,0x11,0x6C,0x65,0xF6,0x5B,0x7F,0x96,0x36,0x6B, + + 0x05,0x2E,0x13,0x71,0xB6,0xDA,0xAC,0x8C,0xBA,0x44,0x07,0x05,0x35,0x8B,0x27,0xB2, + + 0xF6,0xF3,0x21,0xEF,0x0E,0xAB,0x49,0x9C,0x2F,0xC5,0x31,0xCF,0x30,0xEB,0xFA,0x7C, + + 0xEC,0x76,0x40,0x29,0x02,0xBC,0x39,0x8C,0x32,0x44,0x1E,0x37,0x93,0xA5,0x2F,0x0B, + + 0x15,0xA8,0xF6,0xC9,0xF5,0xEB,0x78,0xD1,0xEF,0xC5,0xB0,0xC8,0xD3,0x45,0xB6,0x1B, + + 0x99,0xA9,0xB0,0x1C,0xAE,0x04,0x42,0x48,0xB2,0x8B,0x73,0x4E,0xDD,0xF6,0x2C,0x0A, + + 0xCF,0xAA,0xC5,0xBF,0x75,0xC9,0x49,0xA9,0x4C,0x3B,0xE1,0xBC,0xC3,0x47,0x99,0x1A, + + 0x12,0xAB,0xFF,0x6F,0x1D,0xBD,0x29,0x66,0x4D,0x5A,0x85,0x9A,0xBC,0xEF,0x22,0x59, + + 0x32,0xBD,0xA5,0x28,0xE1,0x01,0xC7,0x94,0xA7,0xBD,0xA3,0xD8,0xB7,0x6F,0x54,0x67, + + 0x6F,0xCD,0x6F,0x7E,0x15,0xBD,0x43,0x82,0xAD,0x8F,0x05,0x0D,0x3D,0x83,0x5D,0x62, + + 0xAF,0x86,0x74,0x08,0x40,0xA6,0x8E,0x87,0xCE,0x75,0x8B,0x45,0xA6,0x23,0x14,0x29, + + 0xE5,0x5E,0xB2,0xC2,0x3A,0xDE,0xAA,0xE3,0x4C,0xC2,0x1C,0x3F,0xD3,0x14,0x96,0x83, + + 0xD5,0x96,0x9C,0x79,0xC1,0xD3,0xF4,0x53,0x31,0xD6,0x86,0x98,0xD7,0x51,0xAF,0xE1, + + 0x36,0x16,0xD2,0x90,0xDC,0x40,0x44,0x36,0x06,0xCC,0xEA,0x8B,0x9E,0x00,0x05,0xFE, + + 0x05,0x99,0x5E,0xF4,0x96,0x43,0x7D,0x34,0x87,0xC2,0xE5,0x54,0xD6,0x2F,0xAD,0x9A, + + 0x27,0x97,0x7E,0x64,0x39,0xBE,0x64,0xB9,0x00,0x2C,0xBB,0x06,0xDD,0x73,0x77,0x31, + + 0x56,0x39,0x49,0x42,0x04,0x80,0x45,0xC6,0xBA,0xA5,0xB5,0x80,0x89,0x59,0x5E,0xEC, + + 0x84,0x34,0x94,0x25,0x11,0x68,0x26,0x51,0x1B,0x97,0xDA,0x14,0x3E,0x5A,0xF9,0x32, + + 0x05,0xD6,0x5C,0x25,0x1A,0xCB,0x52,0xDB,0x7A,0x67,0x69,0xF8,0x55,0x73,0xFA,0x20, + + 0xDB,0x4A,0xF5,0xD2,0xDC,0xF4,0x2C,0x6D,0x46,0x78,0x77,0x0B,0x7F,0x0C,0x35,0x7A, + + 0xE0,0x97,0x5D,0xA9,0x9D,0x47,0x28,0x82,0x4D,0xC8,0x26,0xE1,0x81,0x84,0xA2,0x8A, + + 0xCC,0x66,0x39,0x99,0x9C,0x26,0x46,0x48,0xC1,0xD6,0x22,0x2E,0x96,0xA8,0x5D,0xAC, + + 0x0F,0xD8,0x81,0x2F,0x38,0x1E,0x57,0xA9,0x9C,0x27,0x1E,0xD1,0x69,0x57,0xEF,0xA3, + + 0x49,0x20,0x1B,0xFD,0xC1,0x14,0xAF,0xA5,0x91,0x2F,0x81,0xDB,0xBF,0x54,0x30,0xF6, + + 0xC5,0x4D,0x19,0x4A,0x0C,0xF0,0xA2,0xAD,0xA4,0x45,0xDE,0x02,0xC0,0x87,0x54,0x29, + + 0x0D,0x32,0x02,0x41,0x3E,0x7D,0xF9,0x12,0xE3,0x10,0x5B,0x7A,0x62,0x5F,0x21,0xE2, + + 0x2E,0x09,0xDF,0x30,0x57,0xFD,0x09,0xD6,0x85,0xDD,0xB7,0x16,0x6C,0x65,0x3B,0x33, + + 0x06,0xDD,0x2F,0x77,0x3A,0x12,0x3D,0x8A,0xD3,0xD4,0x24,0x50,0x80,0xFD,0xC0,0x28, + + 0xFB,0x42,0x3A,0xFF,0x6F,0x00,0x30,0xF1,0xE1,0xCA,0x00,0x3B,0x6C,0x22,0x58,0x29, + + 0x53,0x43,0xF6,0x39,0x93,0x29,0x2A,0xCF,0x72,0x61,0xD8,0x56,0xBA,0xF0,0x4B,0x62, + + 0x83,0x83,0x41,0x45,0xC7,0xAF,0x96,0xD0,0x63,0x12,0x9F,0x15,0x52,0x17,0x59,0x11, + + 0xB2,0x9F,0x80,0x67,0x32,0x61,0xA1,0xF6,0x1F,0xEE,0x2D,0x57,0x3A,0xD2,0x90,0xD2, + + 0x0A,0x0E,0x74,0x26,0xED,0x80,0x2E,0x66,0xA3,0xC7,0x6F,0xF7,0x66,0xEF,0x76,0x69, + + 0x05,0x04,0x6C,0xD0,0x3B,0xD4,0xCD,0x6F,0x33,0x43,0xD0,0x01,0xBA,0xBF,0x89,0xB0, + + 0x21,0x46,0xD2,0x43,0x5A,0x57,0xFC,0x5E,0x46,0xE9,0xF1,0x8F,0xA7,0x70,0x1F,0x33, + + 0x74,0x62,0xCF,0x7D,0x7A,0x36,0x79,0xB5,0x62,0xCB,0x19,0x54,0x54,0x09,0xBA,0xF7, + + 0x87,0x13,0x89,0x24,0x73,0x8B,0x6A,0x58,0xC8,0x57,0xC8,0xD3,0xB3,0x6B,0x2A,0xEB, + + 0xAA,0x1B,0xF5,0xE4,0xCB,0xD6,0x1C,0xC5,0x41,0x0B,0xE4,0x99,0xB8,0x56,0x6F,0x6F, + + 0x56,0x81,0x82,0xE2,0xAF,0x26,0x49,0x2B,0x5A,0x42,0xED,0x8C,0x33,0x29,0xB3,0x69, + + 0x09,0xAD,0x4B,0x1C,0xEB,0x90,0x96,0x67,0xE9,0x9B,0xC1,0x97,0xE1,0x29,0x7A,0x79, + + 0x20,0xF3,0xB0,0x49,0xD5,0x8C,0x18,0x75,0xA1,0x5D,0x6D,0xFF,0x6A,0xE7,0x14,0xBA, + + 0x0F,0xA0,0xA8,0x41,0x18,0x6D,0xCB,0x42,0x73,0x0F,0xD2,0x6D,0xB2,0x7C,0x7D,0xE9, + + 0xFC,0xD1,0x55,0x3E,0xF6,0x42,0x93,0x49,0xFB,0xFB,0xF3,0x87,0xAF,0x78,0x58,0xDD, + + 0xAB,0xAC,0xE7,0x90,0xBF,0x22,0xCC,0xE4,0xCD,0x4E,0x99,0x8E,0x8C,0x2D,0x1F,0x62, + + 0x13,0xD0,0xCC,0x16,0xD9,0x01,0x74,0xE1,0xEC,0x5D,0x2F,0x37,0x52,0x7A,0x72,0xEC, + + 0x84,0x7F,0xB6,0x76,0xB3,0x39,0x54,0x23,0xC0,0xFE,0xC8,0xBF,0x05,0xCD,0xBD,0xBC, + + 0x07,0x9F,0xFD,0x07,0xB1,0xD5,0x1F,0xA0,0x43,0x54,0x17,0xBB,0xD2,0x86,0x6F,0xE1, + + 0xA0,0xC3,0x78,0x77,0x33,0x3B,0x8C,0xC2,0xD9,0x3F,0xA0,0xEE,0x0D,0xC2,0x57,0x68, + + 0x9E,0xE5,0xD2,0xA6,0x5A,0x39,0x0C,0x21,0x64,0x55,0x45,0x74,0x99,0x7D,0xFB,0xE9, + + 0x25,0xF4,0x6B,0xF9,0xE7,0x64,0x64,0x0F,0x65,0x54,0x34,0xB3,0x9A,0x5C,0x72,0x64, + + 0x52,0x55,0x3A,0x41,0x96,0xED,0x4C,0x83,0x15,0x33,0xEB,0xC8,0xF4,0x57,0x2B,0x21, + + 0xD7,0xB6,0xEA,0xFC,0x63,0x26,0x87,0x75,0xC3,0x28,0x1D,0xD4,0x4C,0x7D,0xBE,0xB8, + + 0xFA,0x57,0x42,0xEE,0x7B,0xC6,0xD2,0xC8,0x66,0xF5,0x56,0x15,0x3C,0x14,0x0A,0xFE, + + 0x69,0x56,0xF6,0x1E,0x30,0x5D,0x1A,0x4B,0x55,0xF4,0xF8,0x18,0x7A,0xB9,0x59,0xE1, + + 0xA0,0x01,0xFF,0xEF,0xFB,0xCD,0x86,0xD8,0xD0,0xD0,0x28,0x3E,0xD6,0xA7,0x2F,0x9C, + + 0x48,0xB4,0xB7,0x4D,0x56,0x34,0x0A,0x69,0xE1,0xA4,0x3C,0x19,0x25,0x18,0xD3,0x4C, + + 0x0A,0x9C,0x06,0xED,0xB9,0x91,0x1E,0x68,0x6C,0x5D,0xD0,0x9F,0x46,0xFC,0x74,0x2B, + + 0x47,0x96,0xC6,0xD8,0x92,0x12,0x66,0x07,0x6D,0x5C,0x8E,0x8B,0x77,0xF0,0x1D,0xC8, + + 0x09,0x5F,0x0C,0x49,0x92,0x61,0x9E,0x8B,0x1D,0x3B,0xA9,0x8C,0x13,0xA4,0x83,0xE8, + + 0xC7,0x00,0xF1,0x00,0xBD,0x1E,0xA8,0x7D,0xCB,0x20,0xA1,0x21,0x12,0x76,0x58,0x42, + + 0x44,0xCE,0xA1,0xFE,0x14,0x5B,0x32,0x50,0x77,0xE0,0xA0,0xE2,0xF5,0xE9,0x62,0x8A, + + 0x85,0x37,0x20,0x0B,0xE8,0x79,0x58,0xF2,0x8B,0xCC,0x80,0xD6,0x3B,0x6A,0x62,0x01, + + 0xCC,0xC0,0xA1,0xFB,0x15,0xE0,0xC9,0x07,0x18,0xF3,0xE6,0xA3,0xF4,0x4C,0xF6,0x3B, + + 0xB6,0xA1,0xB1,0x96,0xDD,0xD2,0x4B,0x1D,0xD1,0xC5,0x2A,0x1E,0xD3,0xE2,0x58,0xB8, + + 0xAA,0x89,0x1B,0x61,0xB7,0x5B,0x69,0x1C,0xE5,0xA1,0xE4,0xA4,0xDB,0x49,0xB8,0xEA, + + 0xF4,0xEB,0xA1,0x72,0x8A,0x58,0xB1,0x49,0x37,0x50,0xB0,0x67,0xBE,0xD4,0x77,0xE6, + + 0x7D,0x2B,0x54,0x6F,0x90,0x5F,0xCE,0x81,0xC0,0xC7,0x3E,0xE3,0xFE,0x99,0x56,0xCC, + + 0x76,0x51,0x44,0x38,0x1A,0x01,0xEC,0xF7,0xBB,0x35,0xFB,0x84,0x88,0x4A,0x9A,0xEA, + + 0x44,0x8E,0x9C,0x23,0x91,0x2E,0x7A,0xB8,0xED,0x37,0xB0,0x4C,0x7F,0x39,0x14,0x66, + + 0xD1,0x86,0xA6,0x69,0x7E,0x36,0xB9,0xB8,0x44,0xAF,0xA9,0xBA,0x27,0x29,0x0D,0xF0, + + 0x2D,0x75,0x27,0x4F,0x13,0xAC,0x87,0x49,0xB1,0xC3,0x9C,0x44,0x05,0x1F,0x19,0xE4, + + 0x0F,0x27,0xD3,0x1D,0x6A,0xAD,0x03,0xEB,0x36,0xC4,0x17,0x40,0x17,0xC8,0x6A,0x53, + + 0xC6,0x3D,0xAD,0x0E,0x1A,0x81,0xB2,0x4A,0x59,0x11,0xEA,0xEA,0x76,0xA2,0x3E,0x60, + + 0x2D,0x78,0x93,0x38,0x3C,0xCD,0x20,0x1E,0x27,0x2C,0xA0,0x7C,0xEC,0x34,0x32,0x64, + + 0xFA,0x3B,0x99,0xBF,0x0E,0xDF,0x0B,0x4C,0x33,0xC1,0x1F,0x10,0x14,0xBF,0x78,0x59, + + 0x93,0x2B,0x6E,0x5D,0x6A,0xD2,0x02,0x1D,0xAE,0xEF,0x9A,0x3F,0x97,0x42,0x3D,0x06, + + 0x67,0xBD,0x9E,0x79,0x5F,0x54,0x0A,0x8E,0x27,0x0F,0x91,0x9B,0x6C,0xC7,0x68,0xE0, + + 0x16,0xB1,0xCE,0xF4,0xD7,0x4E,0x2A,0xD0,0x9A,0x78,0xC6,0x56,0x79,0x5C,0x6D,0x86, + + 0x86,0x00,0xA1,0x9A,0x36,0xB8,0x15,0xBE,0x0D,0xE3,0x32,0x11,0x1D,0xD1,0xD5,0x7B, + + 0x6D,0x5E,0xD3,0x13,0xFC,0x3C,0xAC,0x63,0xE1,0x7C,0xED,0x45,0xD4,0x1A,0xDC,0x22, + + 0x22,0xB9,0x0C,0x81,0xCB,0x12,0x7C,0x43,0x9A,0x35,0xA4,0x91,0x7A,0x79,0x14,0xC6, + + 0xC7,0x14,0x77,0x5C,0x34,0xF5,0x02,0xDA,0x61,0xD4,0x69,0x1C,0x96,0xBA,0xA1,0xB0, + + 0xCA,0x3D,0xF4,0x37,0x36,0xA9,0xB5,0xBE,0xEC,0x5B,0x8B,0x87,0x95,0xE2,0x40,0x20, + + 0x23,0x1A,0xD1,0x34,0x5E,0xC6,0xA7,0x91,0x10,0xB2,0x00,0xE6,0xEC,0xDA,0x59,0x77, + + 0x24,0xDA,0xC6,0x4E,0xF6,0x15,0xA3,0xD9,0x58,0x52,0x5A,0xDD,0x56,0x7E,0x0E,0xBB, + + 0x1E,0xBB,0xCC,0x7C,0xBF,0xB1,0x00,0x97,0x4E,0x99,0xBA,0x7E,0x2E,0x54,0x2F,0x57, + + 0x4D,0x65,0x36,0x6D,0x3E,0xB0,0x33,0xF6,0x07,0x8B,0xA7,0xDC,0xDE,0x7C,0x97,0x7B, + + 0xF3,0x9D,0xA6,0x6F,0xB5,0xB4,0x0B,0xB9,0xDE,0x7F,0x6B,0x2D,0xDD,0x56,0x34,0x84, + + 0xD2,0xD8,0x26,0xEF,0xB9,0x11,0x4E,0x15,0xA6,0x8D,0xE1,0xE3,0xD7,0x4D,0x50,0xEF, + + 0x44,0x92,0xA6,0x2B,0xD6,0x94,0xBE,0xDB,0x13,0x9F,0x04,0x16,0x7B,0xB2,0x19,0xE2, + + 0x72,0xCF,0xFF,0x4B,0x96,0xE1,0xD7,0xF8,0xD6,0xBA,0x67,0x9D,0xCD,0x65,0xED,0xE9, + + 0xCF,0xFE,0x2F,0xFE,0x38,0xD3,0x6F,0x44,0x4E,0x00,0xA6,0x72,0x58,0xBE,0x3A,0xF3, + + 0x38,0xAF,0x9E,0x77,0x20,0xAA,0x5A,0x3D,0x51,0xEF,0x52,0x84,0x18,0x02,0x1B,0xFF, + + 0xDC,0x7C,0x1E,0x90,0x58,0xA0,0x7E,0x1C,0xA8,0x70,0xEA,0x31,0x5D,0x0F,0x90,0xF2, + + 0xBC,0xAD,0xF9,0x65,0xC7,0xD7,0x00,0xE6,0x29,0x53,0xF1,0x7A,0x73,0x6F,0xA6,0x95, + + 0xC8,0x7A,0xA4,0x6A,0x08,0xA8,0x03,0x33,0x72,0xEE,0xB9,0x34,0x5C,0x6B,0x38,0xC2, + + 0x07,0x20,0xFB,0x0E,0x02,0x65,0xAF,0x13,0x72,0x06,0xA6,0x1B,0x61,0x24,0x28,0x14, + + 0x83,0x08,0x67,0xB6,0xBF,0xD8,0x41,0x2A,0xB6,0xD9,0x6C,0x0B,0xF0,0x24,0x79,0x11, + + 0x8A,0x09,0x79,0xBA,0x82,0x6B,0x45,0xC3,0xC4,0x07,0x41,0x9A,0x27,0x69,0x43,0x53, + + 0x20,0x1C,0xB1,0x71,0xF0,0xEB,0x76,0x0E,0x1A,0x9C,0xF4,0x0E,0x4A,0x1A,0xBD,0xCF, + + 0xCA,0x68,0x4F,0x25,0x1E,0x29,0x84,0x58,0xC8,0x5E,0x12,0x6D,0x6C,0x24,0x9C,0xEB, + + 0x39,0x29,0xD0,0xFE,0x71,0x38,0x0F,0x2B,0x79,0x18,0x3C,0x4A,0x78,0x29,0x0B,0x1C, + + 0x69,0xA5,0x81,0xFD,0x67,0x25,0x1B,0x3D,0x00,0xAB,0x92,0x6B,0x90,0x71,0x68,0x9D, + + 0xFB,0xFF,0xF5,0x35,0xDA,0x24,0xDB,0x81,0x15,0x36,0x97,0x11,0xFB,0x69,0x06,0x2E, + + 0xE8,0x2C,0xD4,0xED,0xF1,0x68,0x52,0x1B,0x72,0xED,0x06,0xEA,0x26,0xD0,0x8A,0x18, + + 0x5C,0x41,0x6E,0x3E,0xE4,0x6C,0x4B,0xFC,0x63,0x18,0x82,0x78,0xD3,0xCE,0xC1,0x3B, + + 0x71,0xF1,0xF9,0xFD,0x57,0x81,0xCF,0x96,0x3F,0xED,0x6C,0x36,0x23,0x57,0x8F,0x7D, + + 0x62,0x56,0x12,0x72,0xA4,0x2D,0xB7,0xE2,0x3E,0xD9,0x1B,0xC5,0x07,0xD2,0x3A,0xB5, + + 0x02,0xFD,0x94,0x07,0x36,0x11,0x15,0xD3,0x10,0x1F,0xEC,0x4C,0xF4,0xBD,0x72,0xB8, + + 0xAE,0xBC,0x4C,0xB4,0x62,0xEC,0x46,0xD4,0x09,0xB0,0x74,0xB0,0xF4,0xF1,0x03,0xF3, + + 0x4B,0xF3,0x18,0x7A,0x59,0xD3,0x85,0xD3,0x0B,0xB3,0xF5,0x05,0xAC,0x7D,0x1C,0x03, + + 0x5E,0xBE,0xF5,0xB2,0x4C,0x3C,0x64,0xD7,0x0A,0x42,0xFD,0xF1,0xB6,0xF8,0x56,0x3E, + + 0xDD,0x99,0xBA,0xC3,0x93,0x75,0x32,0xC9,0x83,0xF2,0xEA,0x44,0xB8,0x37,0xD0,0x28, + + 0x23,0x57,0xAC,0x95,0xB7,0x38,0xE1,0x63,0x5B,0xD8,0x6F,0x50,0x40,0x35,0x17,0x3E, + + 0x55,0xA3,0xA5,0x85,0x9C,0x39,0x44,0x21,0xFA,0x3A,0xAB,0x41,0x1B,0x15,0x49,0x62, + + 0x77,0x06,0x5D,0xAA,0xCB,0x98,0x3B,0xD9,0xE2,0x97,0x76,0xB2,0xFD,0xAB,0x90,0xF8, + + 0xA8,0x9E,0x46,0xAD,0x24,0xCD,0x5C,0xB5,0x49,0xE9,0x12,0x4E,0xFA,0x30,0x98,0x85, + + 0x42,0x08,0x88,0x44,0xB9,0x09,0x54,0xA5,0x48,0x7B,0x86,0x4C,0x06,0x76,0xA0,0xC9, + + 0xEC,0xB1,0x11,0x09,0xBB,0xA3,0x51,0x81,0x01,0x4B,0x5E,0x4F,0x7A,0x32,0xF0,0xB9, + + 0x95,0xBA,0xD5,0x50,0x81,0x79,0x4F,0x35,0xED,0x7A,0x2B,0x4D,0x06,0x74,0xE1,0xE1, + + 0xCB,0x43,0x66,0xBE,0x4C,0x93,0x36,0xA3,0x65,0x51,0x12,0x26,0xC1,0xD3,0x06,0x08, + + 0x9E,0xBC,0x5E,0x23,0xDA,0x72,0xAB,0x9A,0x2B,0x52,0x8D,0xB3,0x7D,0xEE,0xFE,0x8E, + + 0x60,0x77,0x63,0xBF,0x34,0xA1,0x55,0x0B,0x68,0x62,0x81,0xF3,0x98,0x3C,0xD3,0x26, + + 0x4A,0x7C,0xCE,0xA2,0x1C,0x7E,0xCF,0x1B,0x69,0x17,0xEE,0x0E,0xD9,0x1A,0x9D,0x86, + + 0x4C,0x83,0xF8,0x43,0xDC,0x41,0xF0,0x33,0x66,0x6D,0x37,0xA4,0x89,0xEF,0x10,0xE1, + + 0x35,0xED,0xE0,0xB2,0xFC,0x40,0x29,0xD0,0x59,0xBC,0x54,0x34,0x5D,0x8D,0x19,0xF0, + + 0xE8,0xE7,0x79,0x83,0xA2,0x87,0xA7,0xC1,0x68,0x6F,0x89,0x95,0xD8,0x82,0x4F,0x2B, + + 0x6C,0xF2,0x69,0x37,0x19,0xE1,0x23,0x2F,0xE4,0x83,0xF1,0xCF,0x50,0xE1,0x38,0x47, + + 0x00,0x66,0xBE,0xF7,0x12,0x1F,0x38,0x63,0x5A,0x64,0x30,0x77,0x74,0xE9,0xC0,0x42, + + 0x23,0x84,0x17,0x72,0xE3,0xE6,0xF8,0x63,0x77,0x95,0x86,0xD7,0xA3,0xE6,0x19,0xC7, + + 0x85,0xD3,0xE1,0xBF,0x37,0x2B,0x64,0x10,0xFE,0xCD,0x8F,0xC7,0x7A,0xEB,0x7D,0x57, + + 0x8E,0x19,0xEF,0xF3,0xF4,0x70,0x75,0xA3,0x2E,0xAE,0xA0,0x72,0x02,0x8B,0x38,0x08, + + 0xBF,0x25,0xB6,0x63,0xE3,0x05,0x36,0x26,0x7F,0xC6,0xEB,0xB6,0xF9,0xE1,0x62,0x0E, + + 0xC5,0x68,0x11,0xFC,0xB1,0x54,0x04,0x16,0xEA,0xD2,0x52,0x26,0x6E,0xCD,0xB5,0x7B, + + 0x0C,0x9C,0x35,0x8B,0xBC,0xF3,0x0D,0x02,0x6B,0xDA,0xAE,0x8F,0xC0,0xE8,0xBE,0x08, + + 0xBD,0x1A,0xD3,0x6C,0xF1,0xE9,0xDD,0x48,0xF1,0x84,0x01,0xBD,0xFF,0xDB,0x72,0x6A, + + 0x0A,0xA4,0x71,0xBD,0x9A,0x21,0x64,0x08,0x26,0xC1,0x36,0x30,0x50,0xF2,0x66,0x80, + + 0xEE,0x22,0x93,0x6F,0x2B,0x02,0x24,0x52,0x4F,0x62,0x2A,0x39,0xB6,0xCE,0x08,0xEB, + + 0xA2,0xCE,0xB1,0x1C,0xBA,0x25,0x2D,0x89,0x86,0x4A,0x8E,0x9C,0xF0,0x3A,0xFD,0xB4, + + 0x66,0xC6,0x4B,0x2D,0xFD,0x43,0x6E,0x3C,0x26,0x2E,0x9D,0xDA,0x34,0x8C,0x7E,0x90, + + 0x58,0x3F,0xB4,0x96,0xDD,0x51,0x2A,0x9D,0x08,0x92,0xD4,0xE2,0x7B,0xFD,0x52,0x95, + + 0x84,0x2E,0x3A,0x7C,0xDC,0xA0,0xB9,0xA3,0x36,0xF0,0xB0,0xB1,0xD4,0x79,0x85,0xF1, + + 0xC6,0xEE,0xDD,0x77,0x91,0x13,0xBA,0x22,0xE2,0xF3,0xBF,0xA6,0x57,0xF4,0x9E,0xA6, + + 0x59,0x82,0x55,0x86,0xD9,0x1E,0x23,0x43,0x57,0x72,0xFD,0x55,0x77,0xFB,0xA4,0xE3, + + 0x92,0xD6,0x9C,0x44,0x14,0xC1,0xB8,0x80,0x25,0x0B,0xCC,0x15,0x5C,0x98,0xEC,0xBC, + + 0xA5,0xB1,0xD4,0xF2,0xDC,0xF1,0x04,0xD6,0xC6,0x5F,0x9A,0x52,0x74,0x7D,0xF5,0xAB, + + 0xCD,0x99,0xDD,0x97,0xF6,0xB9,0x0D,0x81,0xA5,0x69,0x93,0x42,0x1F,0xF5,0x45,0x57, + + 0xEF,0x94,0xD7,0x67,0x03,0x18,0x02,0x11,0x46,0x5F,0xAD,0xCA,0xB3,0x4A,0x7D,0x8A, + + 0x2A,0xB8,0x30,0xC9,0xFE,0x48,0xA0,0x2E,0x4C,0x92,0x72,0xCC,0x3D,0xB8,0x64,0x78, + + 0xBC,0x80,0x3E,0xBE,0x7D,0xF9,0x28,0x8F,0x6B,0xD8,0xC6,0xDC,0x3C,0xF8,0x51,0xF5, + + 0x6D,0x85,0xEF,0x8B,0xB4,0xA6,0x0D,0x49,0x8F,0x46,0xCF,0xCD,0xBD,0x7A,0x51,0xAE, + + 0x50,0x17,0xA3,0xB3,0x9F,0xAB,0xC9,0xC9,0x4E,0xFA,0xC7,0xDD,0xBC,0xF3,0x5E,0x30, + + 0x82,0x91,0x42,0xB4,0x9D,0xFD,0x72,0x08,0x4A,0xD1,0x5A,0x7C,0x7A,0xF6,0x26,0xDE, + + 0x67,0x7C,0xC0,0x2D,0xB3,0xC0,0x74,0xFE,0xCC,0x9C,0xC1,0x39,0xBD,0x8D,0x8B,0x54, + + 0x5F,0x48,0x99,0xC9,0x5F,0x3D,0x3D,0x15,0x4D,0xD3,0xF2,0xCF,0x82,0x2F,0x51,0xF2, + + 0xC7,0x92,0x97,0xFB,0xB9,0x9F,0x47,0x07,0xEF,0xC3,0xB7,0xD7,0xF9,0x6C,0x7B,0x40, + + 0x26,0x42,0x90,0x07,0xE8,0x64,0xB7,0xB7,0x2B,0xE6,0x24,0x57,0x36,0x6F,0x76,0x16, + + 0x2F,0xA7,0xD1,0x02,0xB4,0x8E,0x22,0xC3,0xA5,0xEE,0x71,0x52,0x70,0x21,0x52,0x4E, + + 0x77,0x7F,0xFA,0xA5,0xEC,0xD2,0x91,0xD0,0x02,0x02,0x01,0x62,0xF4,0x79,0x31,0xE2, + + 0x0D,0xFE,0xDF,0x1D,0x34,0x8C,0xAF,0xC0,0x29,0x13,0xB5,0xA5,0x38,0xF9,0x3B,0x07, + + 0xFB,0xF2,0x55,0x34,0x92,0x8B,0x08,0x68,0x21,0xCA,0xEA,0xD4,0xEA,0x26,0x73,0x20, + + 0x83,0x13,0xE8,0xC7,0xB0,0x2D,0x62,0x92,0x1F,0xB2,0x01,0x27,0x68,0x91,0xFA,0x31, + + 0x02,0x19,0xB9,0xCD,0x37,0xAF,0xC6,0xE5,0xE2,0x58,0x07,0x5B,0xED,0x46,0x01,0x45, + + 0x62,0x1C,0x48,0x26,0xAF,0x68,0xDE,0x1E,0xC5,0xE5,0x19,0xDD,0x36,0x25,0x14,0x0E, + + 0xF7,0xD5,0x50,0x88,0x38,0xDC,0x6C,0x1A,0xCD,0x5E,0x8A,0x28,0xD1,0xEA,0x3B,0xE6, + + 0xA5,0x04,0xAA,0xDE,0xB8,0x82,0x44,0x37,0x5B,0x07,0x47,0xB8,0x2B,0xC6,0x55,0x0E, + + 0x8E,0x99,0xF8,0x36,0x1C,0x2C,0x30,0x33,0x10,0xFE,0xCA,0x36,0x3D,0x61,0xA7,0x8A, + + 0xA3,0xD6,0xF3,0x9D,0x79,0xD4,0x7A,0x1D,0x1D,0x8D,0x64,0xD5,0x4B,0x26,0xAF,0xAE, + + 0x1A,0x43,0xC3,0x3F,0x6A,0x63,0x26,0xEC,0x7D,0x1C,0x52,0x90,0xA1,0x02,0x2C,0x91, + + 0x89,0xC1,0x5C,0x5E,0x95,0x41,0xD5,0xCC,0xC9,0x81,0xA2,0x3C,0x43,0x2F,0xD3,0x0E, + + 0x63,0xB4,0xE5,0x78,0xAA,0x8E,0x93,0xC9,0x03,0x0C,0x6C,0xF6,0x2F,0xC8,0xA7,0xBB, + + 0x43,0xB5,0xF5,0x90,0x51,0xE6,0xB7,0x1B,0xF8,0xC9,0x8A,0x0B,0x2E,0x9B,0x7A,0x13, + + 0x4B,0x96,0xBA,0x25,0x51,0x34,0xB7,0x96,0xBC,0xB5,0xD7,0x63,0x43,0x5E,0xA8,0x8E, + + 0xF7,0xE5,0x2C,0x8E,0xBD,0xBC,0x2E,0xB1,0x45,0x85,0xCF,0x2F,0x72,0x53,0x85,0xBE, + + 0x24,0xC7,0xE4,0xC5,0xA4,0x86,0x4B,0x92,0xEC,0xF9,0x2D,0x3A,0x05,0x30,0xEA,0x60, + + 0x7B,0x53,0xF5,0xB2,0x12,0x5D,0xFF,0xAE,0x2F,0xF8,0xC4,0x22,0x54,0x2C,0x7E,0x33, + + 0x71,0x6F,0xFC,0xF4,0x12,0x9B,0x14,0x1F,0x97,0xD7,0x8D,0x09,0x97,0x70,0x97,0xFF, + + 0x25,0x9F,0x0C,0x7C,0xA4,0xB4,0x07,0xF0,0x5C,0x64,0x70,0x1C,0x4C,0xB3,0xC2,0x3A, + + 0xDD,0xC7,0x65,0xB7,0xD0,0x03,0xA0,0x1F,0x1A,0x3F,0xD4,0x0D,0xB2,0x3B,0x38,0xA2, + + 0xB8,0x1E,0xC5,0x26,0x37,0xBA,0x03,0xA1,0xDF,0x15,0x9F,0xE6,0xCE,0x78,0x58,0x12, + + 0x2C,0xCC,0x16,0xFF,0x1A,0xC9,0x70,0xAC,0x03,0xDE,0x97,0xCA,0xC7,0x89,0x38,0x9C, + + 0x42,0x9C,0x75,0x5B,0xC4,0x9F,0xFC,0x4B,0xA7,0xF2,0xBE,0x2E,0xF9,0x73,0xB5,0x96, + + 0x44,0xB1,0x78,0xFE,0xC4,0xE9,0x97,0x8D,0x09,0xF5,0x2E,0x11,0x75,0xF3,0x8F,0xDF, + + 0x3B,0x4F,0x5D,0xE3,0x73,0x98,0x79,0xB1,0x02,0xDD,0x18,0x55,0x2A,0x36,0xD4,0x25, + + 0x76,0x91,0x94,0xE7,0x3C,0xDF,0x5D,0x39,0x83,0x35,0xE4,0x16,0x8E,0x25,0xFB,0x5C, + + 0x68,0x2A,0x9F,0xC7,0x9A,0xA2,0x64,0x49,0x13,0xF2,0x4C,0x8F,0x2A,0xEC,0x38,0x34, + + 0x40,0xC5,0x74,0xBE,0xAF,0x7C,0x41,0xD5,0x01,0x8F,0xE2,0x80,0x43,0x77,0x8F,0xB1, + + 0xAB,0x5D,0x7B,0xBF,0x36,0xC9,0x48,0x3E,0x02,0x0E,0xA1,0xFB,0x1A,0xDC,0x46,0xA2, + + 0x07,0xA2,0x13,0xE4,0x41,0xAB,0x97,0xB5,0xA5,0x6F,0x27,0xAE,0xF1,0x33,0x53,0x52, + + 0x11,0xFC,0x04,0x65,0x37,0x57,0xA8,0xC1,0x97,0x1D,0x98,0xF6,0x09,0xFA,0x01,0x12, + + 0x82,0x11,0x25,0xFB,0x98,0x5D,0x57,0xD2,0x06,0x82,0x1D,0x57,0x54,0x64,0x3E,0xE8, + + 0x05,0x23,0x12,0x67,0x15,0xBC,0x80,0x6D,0x18,0xBE,0x54,0x51,0xBD,0xFA,0x2D,0xBE, + + 0xD3,0x7F,0xBA,0x44,0xA5,0x0D,0x8A,0x46,0xA7,0x6B,0x88,0xE2,0x52,0x23,0x17,0xD6, + + 0x44,0xB2,0xB1,0xF4,0xFE,0xB4,0xB1,0x70,0xAC,0xBF,0x54,0xE4,0x0B,0xED,0xAD,0xAE, + + 0xDA,0x0B,0x28,0xCD,0x95,0x06,0x66,0x90,0xB2,0x6D,0xF7,0x2B,0x3F,0xBE,0x57,0x9A, + + 0xA4,0x85,0x11,0x73,0x76,0x08,0x07,0x46,0x2E,0x26,0xDB,0x53,0x3C,0x83,0x9F,0x33, + + 0xF7,0xA1,0x9C,0x33,0x7D,0xAC,0x9D,0x34,0xA8,0x3C,0x4A,0x48,0xD3,0x6E,0xBA,0x09, + + 0x67,0x4F,0x7A,0x8D,0x7F,0x04,0x9D,0xA5,0xA6,0x7F,0xA9,0x1A,0x2E,0xE9,0xC1,0x54, + + 0x75,0x76,0xC2,0xCF,0x8A,0x07,0x85,0x0F,0x18,0x1C,0xB5,0x6F,0x87,0xA6,0x0D,0xAF, + + 0x43,0x06,0x7F,0x6F,0x1D,0xB4,0x65,0xA1,0xC9,0x8A,0xE4,0x2F,0xDB,0xAB,0x5C,0x92, + + 0x2D,0x1C,0x6B,0x5D,0x0B,0xD4,0xDE,0xF9,0x6B,0xC6,0xCA,0x94,0xF2,0xE1,0xEC,0xB2, + + 0xE1,0xC2,0xE2,0x6F,0x02,0x02,0x42,0x85,0xA6,0x7C,0x6A,0x60,0x42,0x19,0x3A,0xD9, + + 0x6B,0x85,0xB3,0x43,0xDA,0x25,0xE9,0x18,0xBA,0x6F,0x8C,0xEB,0xD3,0x44,0x6A,0xBD, + + 0x0A,0xFD,0x66,0x2C,0x82,0x0E,0xAF,0x85,0x32,0x4E,0xF0,0x5F,0xF5,0x4F,0x07,0x8D, + + 0xFC,0xD1,0xAC,0xA3,0xD5,0x16,0xA4,0xBC,0x18,0x24,0xA2,0xCE,0xD3,0xBD,0x16,0x61, + + 0xEF,0x3A,0x78,0x68,0xB8,0x1C,0xEC,0x30,0xE5,0xFF,0x29,0xF0,0x05,0xB0,0x86,0x15, + + 0x78,0x74,0xF7,0x78,0x55,0x14,0x65,0xB9,0xCE,0x66,0x59,0x35,0xA2,0xFA,0x4F,0x97, + + 0x4E,0x45,0x7D,0x08,0x40,0x3A,0x05,0x42,0x46,0xC3,0x7D,0x0F,0x1E,0x0C,0xB1,0x5C, + + 0x20,0x87,0xDF,0x58,0x35,0xE4,0x12,0x2F,0x8F,0x8E,0x79,0x15,0xFA,0xF9,0xAC,0xF6, + + 0x8A,0xD7,0xCB,0xA8,0x94,0xD0,0x69,0x82,0xE7,0xC3,0x53,0x99,0xAA,0x7E,0x65,0x47, + + 0xFF,0x95,0xDB,0x8B,0xB0,0xA5,0x6F,0xE1,0x55,0x7B,0x08,0x15,0xD7,0x14,0x25,0x8A, + + 0xA1,0x24,0x52,0x35,0x5E,0xCF,0x75,0xFE,0x2F,0xE6,0x02,0xCB,0x1C,0xB3,0x58,0x15, + + 0x47,0x2E,0x86,0x64,0xD5,0x9B,0x04,0x59,0x0E,0x7C,0xED,0xAE,0x07,0xB8,0x15,0xC4, + + 0xF0,0x24,0xAD,0x85,0xB9,0x2D,0x86,0x49,0x07,0xC9,0xE7,0x7D,0xD8,0x8F,0x26,0x78, + + 0x7E,0x46,0xBD,0x8D,0x2E,0xB0,0x4F,0x0E,0xDF,0x5E,0x77,0xAB,0xAE,0x96,0x80,0xBF, + + 0x79,0x5D,0x0B,0xEC,0xD7,0xB4,0x87,0x48,0x8B,0x99,0xC0,0x37,0x58,0xAD,0xDD,0xEA, + + 0x38,0xFC,0xF0,0xAC,0x5E,0xB5,0xBF,0xF9,0x5A,0xA6,0xCC,0x5E,0xB7,0x53,0x91,0x2A, + + 0x9D,0x6C,0xDB,0x5A,0x0D,0xE3,0x86,0x3D,0x5C,0x56,0xB4,0xA3,0x65,0x6D,0xA7,0x3A, + + 0xB0,0x13,0x99,0xC9,0x5F,0x3D,0x2E,0x49,0x07,0x3F,0x53,0x8D,0x05,0xBC,0xAF,0xFB, + + 0xA8,0x92,0xFD,0xDD,0x54,0xFB,0xC7,0x68,0x9F,0x72,0x7C,0xFD,0x30,0xBE,0x3A,0xF3, + + 0x6C,0x42,0x2F,0xE6,0xBC,0xDD,0x86,0x67,0x82,0xB0,0xED,0xA0,0x70,0x6D,0x6A,0x11, + + 0x00,0x2A,0x89,0xE4,0x19,0x2E,0x88,0x43,0x31,0xE0,0x58,0x14,0x11,0x6C,0x11,0x01, + + 0x21,0x6C,0xF9,0x21,0x12,0x21,0x59,0x25,0xC8,0x22,0xCB,0x19,0xB8,0x13,0xBE,0x24, + + 0x87,0xAB,0xE9,0xB5,0xC5,0x2C,0x8A,0x00,0x60,0xC2,0xDB,0xD7,0x99,0xB2,0x41,0x3B, + + 0xA5,0xF4,0x53,0x7A,0x6A,0x66,0xA7,0x93,0x74,0xE9,0x57,0xE6,0xCB,0x5B,0x2D,0xD4, + + 0x71,0x58,0x24,0x70,0xEF,0x74,0x0D,0x03,0x71,0xE6,0xDF,0x32,0x23,0x7E,0xFE,0x31, + + 0xD6,0x0D,0x93,0x26,0x91,0x66,0x04,0xD0,0x34,0xE9,0x8B,0x6C,0x71,0xC9,0x59,0x33, + + 0xD3,0x1C,0x7A,0x7C,0x95,0x06,0x2E,0x82,0xF1,0xEA,0x37,0x85,0x97,0x28,0x10,0x17, + + 0x38,0x4A,0x12,0x13,0x24,0x9C,0x0D,0xDB,0xCC,0xC5,0xB2,0x0F,0x10,0xD9,0x1F,0x3F, + + 0xA8,0xA6,0xB4,0xD5,0x5B,0xD6,0x8A,0xD0,0xC9,0x84,0xC3,0x62,0x5F,0xFA,0x13,0xA8, + + 0x29,0xA5,0x90,0x7F,0x73,0x9B,0x41,0x7A,0x23,0x2E,0x87,0xA5,0xFC,0xE7,0x9A,0x22, + + 0xB9,0xFE,0xB5,0x24,0x14,0xDD,0x09,0x9A,0x22,0x0F,0x75,0x35,0xDF,0xF8,0xAA,0x2E, + + 0xF5,0x1C,0xDA,0x8C,0x06,0xD0,0x84,0xD9,0xB8,0xE3,0x12,0x51,0xB1,0xB7,0x4B,0x27, + + 0xAC,0x4C,0x61,0xD8,0x33,0x24,0x0F,0x43,0x79,0xD2,0x42,0x0E,0xA0,0x2D,0xFB,0x41, + + 0x57,0x41,0x7E,0x12,0x4F,0x73,0x85,0x56,0xFC,0x9B,0xFA,0x90,0x29,0x1B,0xA7,0xD9, + + 0x77,0x2F,0xC3,0x59,0x14,0x6E,0x33,0xBB,0x4D,0xBA,0x91,0xD6,0xE4,0x9F,0x8D,0xE6, + + 0x48,0x41,0x86,0xE6,0x59,0x41,0xB0,0x84,0x03,0xCD,0x3F,0xC2,0x60,0x3F,0x19,0x7E, + + 0xAE,0xAC,0x3B,0xAD,0x37,0x30,0x26,0x00,0xA4,0xFE,0xA3,0x52,0x42,0xAD,0xF8,0x09, + + 0x05,0xB1,0xDD,0xCD,0x48,0xE3,0x03,0x9C,0x0B,0x16,0x94,0xDF,0x57,0x62,0xE8,0xEB, + + 0x37,0x1B,0x30,0x55,0xCF,0x86,0xB9,0x95,0x8A,0x5C,0x22,0x53,0x71,0x10,0x84,0x70, + + 0x18,0xBF,0xD7,0x2C,0xBA,0xF1,0x2F,0xC7,0xC3,0x38,0x45,0x17,0x42,0xF9,0x1C,0x4E, + + 0xD8,0x57,0xF2,0xF9,0x90,0x2E,0x67,0x63,0x5F,0xFA,0x1C,0xD4,0x74,0x78,0xE0,0x54, + + 0x25,0x00,0x50,0x47,0x90,0x06,0x33,0xD9,0x09,0x07,0xA8,0x15,0x40,0x47,0x1F,0x07, + + 0x5F,0x53,0x6D,0xE3,0xC3,0x31,0x48,0x00,0x40,0x17,0xC5,0x6C,0xF5,0x76,0x81,0x78, + + 0x37,0xE9,0x15,0xB3,0x40,0x7A,0x91,0xBA,0x8F,0xF5,0xCF,0x6A,0xDD,0x27,0xF1,0x7A, + + 0x2F,0x18,0x98,0xA0,0x3F,0x38,0x3C,0x9C,0x82,0x3D,0xF9,0xC6,0x18,0x7D,0xC7,0xA9, + + 0xE8,0x91,0x8B,0xF8,0xDB,0x40,0x00,0x58,0x4B,0xAA,0x96,0xCB,0x47,0x16,0x0F,0xFB, + + 0xEB,0x14,0x8D,0x6D,0x46,0x34,0x27,0x47,0x45,0x56,0xE6,0xD3,0x98,0x7F,0xF5,0xCF, + + 0x2C,0x9F,0x96,0xD1,0xD3,0xAD,0xE9,0x6C,0x4A,0xBE,0xB8,0x8E,0x59,0x9E,0xF8,0x2B, + + 0xC3,0x5F,0x35,0xD4,0x9E,0xC2,0x38,0xC4,0x94,0x80,0x48,0x78,0x01,0xBD,0xB5,0xD7, + + 0x4E,0xEA,0xBF,0x25,0xEE,0x73,0xAC,0xCE,0x4B,0x32,0xF8,0x86,0x23,0x8B,0x1D,0x15, + + 0xC0,0x6B,0x0F,0x1D,0xC3,0x7D,0x39,0xC0,0x76,0xA2,0x73,0x82,0x31,0x2E,0xB6,0x86, + + 0x3E,0xA2,0xE8,0xF6,0x77,0xDA,0x0A,0x92,0x8D,0x6F,0x5E,0xD9,0x52,0x73,0x4E,0xDB, + + 0x06,0x62,0xAA,0x74,0x7C,0xD0,0x2E,0x50,0x2D,0xCC,0xE8,0x54,0xA6,0x84,0x1B,0xFC, + + 0x79,0xEE,0xB7,0x3E,0x92,0xA3,0x95,0x07,0x2D,0x73,0x16,0x58,0xD2,0x42,0x73,0xDE, + + 0xF9,0xC1,0xF1,0x67,0x7C,0x12,0x2B,0x93,0x2E,0x87,0x81,0xCC,0xE6,0xCD,0xCC,0x00, + + 0x85,0x50,0x4C,0x62,0xCA,0xD5,0xE0,0xE6,0x66,0xE0,0xAF,0x99,0x29,0x9E,0xC8,0x48, + + 0x8B,0xC7,0xEF,0x29,0xB0,0x01,0xED,0x55,0xE6,0x6A,0x8D,0x04,0xBC,0x04,0x37,0x5C, + + 0xE0,0x32,0x21,0x1A,0xE9,0xBD,0x0F,0x64,0x67,0x69,0x2A,0x48,0xD0,0x6C,0x3B,0x85, + + 0x81,0x04,0x7C,0x6F,0xB5,0x17,0x6A,0xF7,0xE7,0x33,0xC7,0x42,0x5A,0x41,0x32,0x1A, + + 0xAD,0x21,0xA0,0xFD,0x68,0x05,0x08,0x9A,0x85,0x67,0x72,0x96,0xC6,0xE2,0x3A,0xBB, + + 0xAC,0x16,0xE2,0xD6,0x7E,0xD3,0x2C,0x17,0xA6,0x8D,0xE9,0xE1,0x6E,0xE7,0xB5,0xEB, + + 0xB4,0xC8,0x30,0x48,0x56,0x90,0x97,0x0F,0xAF,0xA5,0x76,0xC7,0x5B,0xA8,0x9F,0x79, + + 0x76,0x90,0xBD,0x23,0x9B,0xAA,0x01,0x8B,0x04,0x64,0x7B,0x87,0x02,0xF0,0x90,0x75, + + 0x8A,0x59,0xA2,0x3D,0x22,0xB7,0x0C,0x6D,0xEF,0x63,0xBF,0xAE,0x73,0x67,0x34,0x55, + + 0x05,0xC3,0xBA,0x4A,0x5B,0x58,0xE9,0x8B,0xEC,0x8D,0x42,0x1E,0x10,0x66,0xC7,0xCF, + + 0xEC,0xE4,0x41,0x7B,0x75,0x3F,0x64,0x4C,0x6F,0x61,0xD2,0x5E,0xB2,0xF1,0x0A,0xFB, + + 0x59,0x30,0x7E,0xAC,0xA3,0x5B,0xC4,0xFF,0xEF,0xFE,0x04,0x8C,0xE7,0x40,0xA3,0x80, + + 0xA9,0xD2,0x13,0xBF,0x32,0x1A,0xCB,0xD1,0x79,0x71,0xD5,0x66,0x36,0xEB,0x4E,0x93, + + 0x24,0x31,0xBF,0xF6,0x71,0x1C,0xBC,0xC1,0x70,0x54,0x01,0x50,0x46,0xBF,0x35,0x83, + + 0x05,0xFC,0x60,0xF4,0xCC,0x1B,0x0D,0x87,0x8F,0xDD,0xDF,0xC9,0x53,0xE2,0x9A,0xA6, + + 0xA3,0x81,0x3E,0xE6,0xC5,0xB8,0x43,0xB5,0x2D,0xDC,0x86,0x51,0xE5,0x4E,0xE0,0x04, + + 0xB4,0x97,0xA1,0x58,0xB4,0xB0,0xD9,0x0C,0xE4,0xD0,0x4F,0x75,0x4E,0xFE,0xBD,0xC1, + + 0xD1,0xA6,0x58,0xA5,0x0B,0xBA,0xD4,0xCF,0x9F,0x84,0x6D,0xFD,0x47,0xC5,0x86,0x38, + + 0x6E,0x61,0xB5,0x43,0x84,0xE9,0x19,0x81,0xC7,0x97,0x77,0xF9,0xCE,0x02,0x4B,0x68, + + 0x95,0x33,0x59,0xA4,0xC7,0xB8,0x4E,0xDA,0x1B,0x46,0x88,0xEA,0x30,0x5A,0x26,0x0E, + + 0x0C,0x98,0x62,0x7E,0x34,0x63,0x92,0x8E,0x87,0x9C,0x4E,0x46,0xA1,0x05,0x99,0xAF, + + 0x2B,0x28,0x8E,0x8F,0xB0,0xDA,0x9A,0x9E,0x5E,0x09,0xD0,0x3A,0x0F,0xCF,0x1F,0x39, + + 0xA8,0x3A,0xA7,0xA5,0x80,0xAA,0x0D,0x1B,0x7D,0x75,0x4F,0xAD,0xAC,0xE1,0x0B,0x8A, + + 0xC1,0x36,0x04,0x3A,0x68,0xA5,0x87,0x44,0xFD,0x96,0xF7,0xAE,0x0C,0xB4,0x15,0x7F, + + 0x28,0x1F,0x26,0x97,0x21,0xFE,0xC5,0xC7,0x68,0x5F,0xE7,0x1C,0x5F,0xBD,0x86,0x50, + + 0x0D,0x4B,0x46,0xEA,0xBD,0xB9,0xC3,0xA1,0xBE,0x80,0x3E,0xDE,0x3F,0x50,0x32,0x3A, + + 0x32,0x5C,0x2B,0x49,0xBD,0xFE,0x4B,0xAB,0xE4,0x62,0xAD,0x22,0x96,0x1F,0x10,0xA8, + + 0x99,0x3E,0xB0,0xBD,0x9F,0x12,0x54,0x3D,0x93,0x2A,0xEE,0x1D,0x9F,0x2E,0xC0,0x20, + + 0x40,0x0D,0xD6,0x77,0x32,0x86,0xEB,0x5A,0xCF,0x96,0xAF,0x6B,0xC5,0xFD,0xC8,0x30, + + 0x27,0xAC,0x25,0x5A,0xEC,0x7D,0xFF,0x70,0x45,0x2F,0x67,0xF3,0x9B,0xD0,0x03,0xE3, + + 0x69,0xE3,0xD3,0x21,0x0D,0x9F,0x19,0x34,0x75,0x2C,0x38,0xA1,0xF4,0xC9,0x1C,0xF3, + + 0x2D,0xAE,0x30,0x91,0xB1,0xE2,0x89,0x76,0xE5,0xE7,0x22,0xA6,0xA1,0x6B,0x1A,0x8D, + + 0x6A,0xE5,0xF2,0x02,0x80,0x48,0xD0,0x9D,0x4E,0xB4,0xCE,0x86,0xC0,0x6C,0x32,0xB0, + + 0x00,0xAA,0xB6,0x4F,0xFA,0x36,0xE7,0x92,0x70,0x77,0x4F,0x58,0x1B,0x84,0x81,0x61, + + 0xC2,0x0B,0xFF,0xEC,0x58,0xB5,0xD6,0xE3,0xE0,0x34,0xD7,0x5A,0xBE,0x24,0x58,0x22, + + 0xB3,0x6B,0xAB,0x55,0x78,0xB3,0xE1,0x61,0x64,0x5C,0xF9,0xC6,0xF7,0x25,0x93,0xEA, + + 0x40,0xE9,0x79,0x2B,0xB9,0x33,0x11,0x2E,0x80,0x38,0x17,0xA8,0x7C,0xE8,0x1D,0x77, + + 0x2A,0xC8,0x21,0x99,0x8A,0x16,0x8A,0x7F,0xEC,0xFF,0x21,0xA6,0x5A,0x8B,0x1F,0x33, + + 0xAC,0xFE,0x05,0x53,0x15,0x48,0xB7,0xD8,0x6B,0x0A,0xEC,0xEA,0x25,0xDC,0x55,0xFB, + + 0x8D,0xF6,0x74,0xED,0x4B,0x5A,0x20,0x49,0x49,0xE4,0x5B,0x19,0xB2,0x94,0x24,0x81, + + 0x09,0xE4,0x9C,0x43,0x16,0x62,0x12,0x0E,0xBD,0xC3,0xC2,0xF1,0xAD,0x09,0x52,0xE1, + + 0x68,0x19,0xE3,0x33,0x8A,0xE8,0xE0,0x83,0xA2,0x24,0x76,0xF9,0x8E,0x0F,0x7D,0x7C, + + 0xE3,0x1F,0xA2,0xED,0x4C,0x91,0x4B,0xE4,0xF9,0xCA,0xEB,0x85,0x96,0xB2,0x5D,0x71, + + 0x38,0x42,0xB9,0x55,0x7F,0x88,0x7C,0x9B,0x0B,0xB0,0xB2,0x96,0x6C,0xC4,0x24,0xB1, + + 0x4B,0x1F,0x40,0xDA,0x3E,0x2E,0x2C,0x5E,0xCC,0x5D,0xAA,0x9C,0x06,0x1C,0x1C,0x05, + + 0xD6,0x74,0x19,0x10,0x19,0xA9,0x7A,0x9C,0x45,0x2C,0x63,0xB6,0x6B,0x33,0x85,0xF2, + + 0xD8,0x50,0xF8,0x7A,0xD3,0x47,0xB9,0x32,0xDC,0x8F,0x51,0x5B,0x0D,0x10,0x35,0x79, + + 0xED,0xCF,0xB5,0x6D,0xB1,0xC2,0xE2,0x14,0x2B,0x5E,0x0D,0x44,0x99,0xC2,0x3E,0xA0, + + 0x60,0x9F,0xFE,0x37,0x5E,0x99,0x94,0xF0,0xEA,0x52,0x14,0xC4,0x3C,0xAB,0xF3,0x9A, + + 0x33,0x11,0x84,0x84,0x50,0x21,0xF7,0xF4,0x20,0x7E,0x77,0xB3,0x7D,0xA9,0x41,0x3D, + + 0xA2,0x0A,0x53,0x82,0x78,0x8C,0x85,0xB1,0xE4,0xD6,0x61,0x87,0xC1,0x96,0x4B,0x96, + + 0x8D,0xCB,0xDB,0xE0,0x00,0x7A,0xB1,0x71,0x1F,0x77,0x19,0x3F,0x48,0x08,0xAA,0x0D, + + 0xFD,0x7A,0x79,0xF6,0x4E,0xE7,0xED,0xD3,0x14,0xA7,0x69,0xDF,0x08,0xAB,0x10,0xA1, + + 0x2F,0x18,0xC6,0xEA,0xE0,0xC4,0x1F,0x5E,0x79,0x16,0x09,0x43,0x88,0xAA,0x6E,0x62, + + 0x13,0x91,0x47,0xAD,0x08,0x78,0x2D,0x15,0xCC,0x15,0x6C,0x29,0xDC,0xFA,0xBA,0xFB, + + 0x5A,0x90,0xA0,0xC7,0x4C,0xA7,0x1E,0x5F,0xCD,0x16,0x64,0x45,0xF9,0xC0,0x92,0x96, + + 0xB9,0x23,0xDE,0x64,0xC6,0xDD,0xFA,0xAA,0xE9,0x88,0x88,0x0E,0x7E,0xE1,0x5F,0xDA, + + 0x8D,0xBD,0xF0,0x01,0xF1,0xE7,0x0F,0xE3,0x51,0xF0,0x6A,0x9E,0x48,0x9D,0x87,0xE9, + + 0x0B,0xBE,0x07,0x1D,0x77,0x52,0x85,0xF6,0x84,0xCA,0x17,0xCD,0xB4,0xA1,0xD9,0xFA, + + 0x00,0x5E,0xCD,0x22,0x36,0x92,0x0C,0x08,0x48,0x1F,0x74,0xBA,0xF5,0xA3,0xE0,0x22, + + 0x3C,0x5F,0x60,0x27,0x55,0xAD,0x48,0xAA,0xE1,0x49,0x1C,0xB5,0x2C,0x3D,0x83,0x55, + + 0x0B,0x5D,0x93,0xAA,0xE2,0xE3,0xC3,0x4D,0x2D,0xCC,0x78,0x12,0x15,0x5E,0x95,0x61, + + 0xB7,0x62,0xFA,0x07,0xE8,0x5D,0x11,0xB0,0x67,0x83,0xD7,0x1F,0xD7,0x83,0xED,0xD9, + + 0x3E,0xBC,0xB9,0x8C,0x93,0xA9,0xC6,0x4D,0xEB,0x1C,0x15,0x48,0x0F,0x3E,0x78,0xF3, + + 0xFE,0x95,0xD1,0xEB,0xF2,0x31,0x4E,0x07,0x9E,0xCB,0x88,0x62,0xA7,0xA6,0xD5,0x92, + + 0x77,0x30,0xE8,0x94,0x94,0xE3,0x7C,0x6F,0xB2,0x31,0xC0,0x9E,0x1B,0x39,0xD6,0x76, + + 0x80,0x87,0xE0,0x71,0x6E,0x5D,0x53,0x10,0x65,0xCF,0xE1,0x4E,0x21,0x83,0xFF,0x6C, + + 0xB7,0xC5,0x5E,0x73,0xA4,0x30,0x01,0x61,0xF4,0xF5,0x55,0xF2,0x02,0x85,0x78,0xDE, + + 0x74,0xCA,0x18,0x10,0x7E,0x5C,0x0C,0x32,0x30,0x67,0xD1,0xEE,0x4E,0x9C,0x70,0x80, + + 0x75,0x26,0xE8,0xE0,0xB1,0xA4,0x44,0x3D,0xEC,0x88,0x0E,0x5C,0xAA,0x8C,0x33,0x29, + + 0x2D,0x15,0xF5,0x61,0x9A,0xAB,0x93,0x58,0xD0,0x19,0x13,0x21,0x50,0x8F,0x8B,0x69, + + 0xEF,0xB7,0xF2,0x0A,0x48,0xC7,0x82,0xBF,0x85,0xC8,0x83,0x0E,0xA5,0x14,0x6E,0x3F, + + 0xF2,0x9D,0x5A,0x2E,0x0E,0xE1,0x8A,0x82,0x8E,0x01,0x9B,0x85,0xA5,0x10,0xA7,0x6B, + + 0x3F,0xCF,0xB2,0x5F,0xB8,0xB6,0xDD,0x98,0x8F,0x60,0x4F,0x35,0xA2,0xD1,0xA3,0x9A, + + 0x90,0x05,0xA1,0xA9,0x77,0x14,0x8C,0x83,0xD4,0x83,0x4A,0x30,0xD8,0x64,0x7B,0x4B, + + 0x2E,0x70,0xCC,0x29,0xBE,0x77,0x03,0xFF,0xFD,0xDA,0xA5,0x9D,0xDB,0x92,0x91,0xBB, + + 0xCF,0xD4,0x64,0x87,0xDE,0xEC,0xC9,0xAA,0xC1,0xC0,0x30,0x22,0x7C,0x1C,0x88,0xF0, + + 0x92,0x0C,0x01,0xAC,0x57,0x04,0xC4,0x96,0xE7,0xD5,0x07,0x54,0xD9,0x0C,0x1F,0x33, + + 0x3D,0x3D,0x1E,0xC9,0x29,0x4F,0x98,0x45,0xF4,0xAF,0x10,0xA1,0x60,0x96,0x3F,0x96, + + 0x5A,0xAE,0xFB,0xA9,0xD7,0x46,0xB6,0xD1,0x24,0xB1,0xC5,0x93,0x14,0x5C,0xA4,0x6B, + + 0x62,0xD6,0xF8,0x55,0x17,0x34,0x46,0xD3,0x08,0x2B,0x30,0x2C,0xCD,0x4B,0x3C,0xDB, + + 0x84,0x8E,0xED,0x16,0x21,0x68,0x02,0x64,0x61,0x56,0xE8,0x6E,0x8C,0xC8,0x34,0x48, + + 0x07,0x90,0x1E,0xB8,0x3B,0x30,0x4B,0x01,0x8C,0x15,0x5A,0x88,0x2B,0xB4,0x32,0x57, + + 0x95,0xE1,0x41,0x45,0xA7,0xBD,0x4D,0xE0,0x81,0x01,0x3D,0xD6,0xB4,0xB6,0xCA,0x15, + + 0x2D,0xA8,0xF0,0x0A,0x34,0x1F,0xF2,0x2F,0x2F,0xF8,0x20,0xDD,0x10,0x94,0x15,0x5D, + + 0xFB,0x93,0x7F,0x60,0x19,0x6D,0xC5,0xB2,0xC8,0x98,0xE4,0xB4,0x15,0x18,0x9E,0xBB, + + 0xA0,0x45,0x18,0xA2,0x43,0x67,0xA7,0x43,0xD3,0x97,0xD1,0x66,0xFF,0x13,0xAC,0xF0, + + 0xCD,0xFB,0xBC,0x80,0xC5,0xC7,0xD3,0xC8,0xC7,0x7D,0xC6,0xD9,0xDC,0x81,0x5E,0x48, + + 0x0C,0x6C,0xA4,0xB1,0xEA,0xB3,0x50,0x5F,0xB0,0x73,0xCC,0x1D,0x4B,0xE7,0x56,0x0A, + + 0x73,0x62,0x56,0x25,0xB2,0x40,0x00,0xCC,0x84,0x38,0x0B,0x1C,0x3F,0xF2,0x1F,0x49, + + 0x2E,0x27,0xD5,0x30,0x8D,0x65,0x10,0x1A,0x3C,0x9E,0x2A,0x19,0x7C,0xF6,0x83,0x49, + + 0xA3,0x97,0x88,0x2F,0x3F,0xA0,0x21,0xC8,0xFF,0x70,0x17,0xD1,0xDB,0xFF,0xC0,0x7D, + + 0x61,0x8D,0x50,0x7A,0x7A,0x03,0x98,0xC5,0x23,0x60,0x2B,0xC2,0x33,0x74,0x68,0x5B, + + 0xBA,0x8A,0x14,0xFB,0x26,0x21,0x22,0xD2,0xC3,0x09,0x27,0x05,0xF0,0xC0,0x61,0x4A, + + 0xC3,0x0D,0xFF,0xA4,0xB4,0x8F,0x69,0xA3,0xC5,0xDB,0x86,0xCF,0x31,0x2D,0xF6,0xF3, + + 0x87,0x49,0xD6,0x95,0xE2,0x56,0x04,0xD3,0x6D,0x4C,0xA1,0xCA,0x28,0xC2,0x10,0xB9, + + 0x42,0x9B,0x64,0x40,0x52,0xF8,0x52,0x02,0xB5,0xFD,0x2B,0x61,0x39,0x1B,0xC3,0x30, + + 0x07,0x69,0x0C,0xBC,0x19,0x68,0xCB,0xF4,0x63,0xC5,0x86,0x9B,0x19,0xCE,0x81,0x85, + + 0xB3,0xFB,0xD1,0xC0,0xCB,0x68,0x49,0xE4,0xA1,0x3C,0xD3,0x94,0x6D,0x24,0xD9,0x96, + + 0xA7,0x69,0xBB,0x54,0x8B,0x3C,0x03,0x8E,0x60,0xCC,0x24,0x69,0xF1,0x78,0xBE,0x8C, + + 0x43,0x2A,0x12,0x47,0xE5,0x14,0x72,0x6C,0x47,0x45,0xAA,0x1D,0xF9,0xD7,0x1A,0x1C, + + 0x1D,0x4B,0x37,0xE3,0xE8,0xAA,0x50,0xC3,0xEA,0xB5,0x8D,0xB8,0x79,0xD5,0x39,0xE1, + + 0xD8,0x45,0xBE,0xF5,0x98,0xAB,0x59,0xD7,0x6B,0x47,0x48,0x3D,0xBB,0x01,0x41,0x81, + + 0x60,0xD2,0x21,0xE3,0x45,0x6F,0xA0,0x66,0xCF,0xE3,0xA3,0xC7,0xDF,0x6A,0x02,0x77, + + 0x02,0x60,0xE4,0x3A,0xE1,0xD7,0xC1,0x59,0x7A,0x0E,0xAD,0x9D,0xE5,0xFE,0xE7,0x2A, + + 0xE0,0xDB,0xAA,0x18,0x14,0x20,0x22,0x65,0xCB,0x73,0x27,0xDC,0x79,0x72,0x6B,0x8B, + + 0x8C,0x8D,0xC7,0xC9,0x9B,0xF4,0x43,0x79,0x6B,0xCC,0x8D,0x82,0xD6,0xC5,0x35,0xC6, + + 0xE0,0xB9,0x81,0xA3,0x38,0x29,0x01,0x1D,0xA3,0x5E,0xA4,0x43,0x2C,0x9A,0x8B,0x20, + + 0x70,0xB0,0xDE,0x98,0x08,0x72,0x46,0x8F,0x8B,0x34,0xC4,0xD7,0x24,0x76,0x0F,0x14, + + 0x35,0x48,0xB4,0x7B,0xC4,0x52,0xBC,0xA3,0x4F,0x35,0xFC,0xB6,0x57,0x7C,0xC5,0x04, + + 0x19,0x5E,0xD4,0x63,0x11,0x93,0x2D,0x85,0x28,0xD1,0xB5,0x00,0x51,0x8D,0xCD,0xBC, + + 0x6C,0x08,0x74,0xEE,0x64,0xAE,0x23,0x99,0x8A,0x5C,0x02,0x55,0xF5,0x1F,0xE1,0xC4, + + 0xA5,0x02,0xBC,0xA6,0x71,0xCA,0xAF,0xC7,0xC3,0x4F,0xEA,0x99,0x13,0x54,0x3A,0x81, + + 0xC1,0x1E,0xB4,0xB6,0x70,0x8A,0xF7,0x75,0xF0,0x6A,0x5C,0x41,0xC9,0xD8,0x15,0x5F, + + 0x59,0xBB,0xBD,0xA7,0xF1,0x49,0xD3,0xBF,0x6F,0x34,0xC7,0x1A,0x74,0x55,0xCF,0x21, + + 0x72,0x48,0xB5,0x57,0xBA,0x53,0xA2,0x75,0xC3,0xE1,0x44,0xB2,0x39,0x7C,0x05,0xEE, + + 0xCA,0x38,0x2D,0x64,0x3C,0xE4,0x96,0x2C,0x20,0x5B,0x06,0x2E,0xF8,0xFB,0x34,0x70, + + 0x79,0x56,0xE7,0x77,0x05,0x86,0x8E,0x86,0x43,0xAC,0x1E,0xFB,0x5D,0x82,0xAB,0x0D, + + 0xE3,0x38,0x2B,0x08,0x6D,0x58,0x2F,0x57,0x44,0x57,0xAF,0xDD,0x4C,0x73,0x2F,0x37, + + 0x7C,0xA6,0x34,0x31,0x98,0x5B,0xCF,0x41,0xE9,0x19,0x9E,0x20,0x9A,0x68,0xBB,0xCA, + + 0x6A,0x49,0xFE,0x1C,0xC7,0x33,0xE9,0x6C,0x4A,0x1E,0x9E,0xE5,0x0D,0xD0,0xF3,0x87, + + 0xFE,0x40,0xCA,0x9B,0xBA,0x33,0xD8,0xA6,0xE6,0x3F,0x14,0xFE,0x6B,0x7E,0xB4,0xE6, + + 0x54,0xE2,0x57,0x0A,0xB8,0xCB,0xAC,0xCE,0x4B,0x45,0x08,0x53,0xFC,0x26,0xE4,0x1B, + + 0x28,0x59,0x6C,0x23,0x67,0xC0,0xF4,0x7C,0x78,0x60,0xDE,0xEC,0x1A,0x80,0x8C,0x90, + + 0x10,0x88,0xDE,0x01,0xB5,0xCC,0x40,0xA0,0x45,0xA3,0x19,0x44,0xDB,0x76,0x48,0x10, + + 0x04,0x8C,0xBF,0xED,0xE4,0xC2,0x30,0x15,0xA4,0xCE,0x98,0x32,0x6A,0xE1,0xDD,0x87, + + 0xD5,0xDC,0x65,0xFC,0x38,0xAF,0x6B,0x22,0x67,0xC4,0xB9,0x37,0xEB,0xC2,0x5B,0x3D, + + 0x89,0x08,0xD2,0x08,0x11,0x77,0x59,0x73,0x68,0x48,0x02,0xE7,0xDD,0x9A,0x61,0xB1, + + 0xD4,0x2B,0x68,0x26,0xF7,0xAB,0x09,0x04,0x05,0xCB,0x0F,0xA4,0xD5,0xA2,0x5E,0x5E, + + 0xEC,0x00,0x21,0xB4,0x95,0xED,0x6A,0x90,0x3A,0xCE,0x68,0x56,0x47,0x17,0xD3,0xB0, + + 0x6A,0x2D,0x55,0xA5,0x14,0xEE,0x8E,0x8B,0xDB,0x8B,0x46,0x43,0xF4,0xA4,0xC1,0xD9, + + 0x7E,0x5B,0x23,0xB5,0x15,0xEF,0x7F,0x4C,0xF7,0x85,0x22,0x24,0xA8,0x30,0xDD,0xE8, + + 0x2E,0xAA,0x06,0x29,0xB0,0xA5,0xE7,0xC8,0xCE,0xC0,0xAA,0x3F,0x5A,0xE9,0x12,0xE5, + + 0x8D,0xC9,0xBD,0xE1,0xE8,0x3A,0xAA,0xCA,0x4F,0x68,0xBD,0xE0,0xC2,0xA8,0xA5,0x89, + + 0x0C,0x91,0x0F,0x8A,0xEB,0xAA,0x87,0xDB,0xC4,0xC5,0x1A,0x55,0x7F,0x1A,0x11,0xE4, + + 0x8B,0x0A,0x84,0x60,0x44,0x34,0x2A,0xC8,0x49,0x46,0xDB,0x3D,0xF0,0xE6,0x59,0x14, + + 0x3D,0x4C,0xC2,0x2C,0x5D,0x57,0xFB,0x7C,0x6A,0xB0,0xCC,0x13,0x3E,0x13,0xC1,0x90, + + 0xB4,0x22,0x11,0xBC,0x9D,0xA5,0x55,0x8B,0xEC,0x8D,0x8F,0xDE,0x07,0xFE,0xCF,0xEE, + + 0x5B,0xED,0x9B,0x68,0x3F,0x24,0x4C,0x24,0x17,0x33,0x13,0xCE,0xD8,0x0D,0x4C,0x45, + + 0x5F,0x24,0x2F,0x3D,0xDC,0x58,0x44,0xFF,0xEF,0xFE,0x20,0x2C,0xA0,0x61,0x8F,0xFD, + + 0x66,0x99,0x7B,0x79,0x10,0x4C,0xB4,0x3A,0xB0,0xF3,0x23,0x55,0xF0,0x7D,0x4C,0xD2, + + 0x0B,0x1C,0x06,0x51,0x94,0x33,0x02,0x8A,0xAF,0x00,0x84,0x48,0x16,0xF2,0xE1,0x93, + + 0x87,0x98,0x9A,0xD8,0x90,0xB4,0x92,0x07,0xC0,0xBE,0xE7,0xA5,0x1F,0x96,0x55,0x11, + + 0xA4,0xF6,0xD5,0x67,0x25,0x02,0xC2,0xC0,0xD9,0x75,0x2A,0x44,0x71,0x7E,0xD3,0xE6, + + 0xFA,0x85,0xBA,0x29,0x0C,0xB7,0x8B,0x66,0x46,0xC1,0x34,0x23,0x9F,0xF7,0x7C,0xC2, + + 0x86,0x3A,0xEE,0x27,0x88,0xF7,0x44,0xC3,0xC6,0x54,0x50,0x65,0x5C,0xFF,0x3F,0xFF, + + 0xDA,0xD4,0x1E,0xC2,0xDD,0xC9,0xCA,0x01,0x1F,0x77,0xF2,0xFB,0x1F,0xAF,0x78,0x57, + + 0xEE,0x16,0xB3,0x38,0xFD,0x1C,0xA1,0x77,0xC7,0x6B,0x7B,0x0B,0x3E,0x0C,0x5E,0x08, + + 0x2D,0xF5,0xDF,0xE8,0xCB,0x33,0x21,0x54,0x48,0x75,0xE4,0xAC,0x97,0x9C,0x4E,0xDE, + + 0x22,0x94,0x02,0x00,0x3E,0x79,0x00,0x93,0x43,0x06,0x12,0x9A,0x80,0xF2,0x7D,0x97, + + 0x2C,0xA9,0x86,0xB2,0x0F,0xF7,0xA6,0x9A,0x4D,0x25,0x8F,0xD3,0xDD,0xBA,0x65,0x44, + + 0x0E,0x9D,0xF5,0x95,0xC1,0xA4,0xAF,0x8A,0xCB,0x74,0x87,0x43,0x7D,0x00,0x49,0xB5, + + 0xF7,0x11,0x1B,0xD6,0x1C,0xA3,0xB6,0xFA,0xE6,0xA1,0x9C,0x6A,0x6B,0x36,0x7B,0x1A, + + 0x07,0x16,0xCD,0x20,0xE7,0x42,0x6C,0x14,0x84,0x99,0xA4,0x01,0x94,0x2C,0x98,0xB4, + + 0x23,0x38,0x98,0x3E,0x01,0xEC,0x61,0x89,0x86,0xD3,0x67,0x1E,0x86,0xDE,0x2F,0xE6, + + 0xA9,0x9E,0xB1,0x30,0x85,0xBC,0x45,0x4B,0x76,0x70,0x81,0xC2,0xCC,0x9B,0xBA,0xF1, + + 0xA3,0xF0,0x84,0x04,0xEF,0xDF,0x30,0xCA,0xB5,0xC9,0xCB,0x24,0xD0,0xE0,0xB0,0x2D, + + 0x61,0x0E,0x88,0xEB,0x11,0x21,0x26,0x43,0x56,0x0E,0xA3,0xB1,0x5F,0x03,0x33,0xFE, + + 0xB3,0x02,0x7E,0x05,0x6F,0xDD,0x31,0xAB,0xE4,0x59,0xAE,0x15,0x23,0xFD,0x77,0x29, + + 0xA3,0xB3,0x83,0x6E,0xD0,0x0C,0x18,0x42,0xDE,0x0C,0xD3,0xA8,0x2A,0x60,0x3F,0xB8, + + 0x82,0xFB,0x00,0x64,0x4C,0xFB,0xEB,0x2E,0xAB,0x2D,0xFC,0x7E,0x68,0xD0,0x58,0xA8, + + 0x03,0xFE,0x63,0x13,0x1D,0xF9,0x5C,0x27,0xBE,0x2B,0x71,0x0A,0xC6,0x63,0x81,0x40, + + 0xF0,0xBD,0x75,0x27,0xA1,0xC6,0x2E,0x99,0xC2,0x04,0x00,0x2A,0x2F,0x1A,0x49,0xAD, + + 0x02,0x45,0x0D,0x9F,0x28,0xD8,0x3F,0x10,0xC2,0xC7,0x70,0xC2,0x72,0x0B,0x80,0x4F, + + 0x3B,0xCC,0x88,0xE6,0x51,0x08,0x82,0xD1,0xFA,0x0A,0x07,0xA8,0x18,0xF7,0x9F,0x19, + + 0xE0,0x78,0x8A,0x1C,0x19,0xB8,0x7A,0x3A,0xB6,0x46,0x25,0x7B,0x83,0x61,0xE1,0xFA, + + 0xF8,0xA1,0x83,0x0D,0x98,0xCA,0x83,0x8C,0x2B,0xCA,0xAC,0x4D,0xD0,0xD8,0xA7,0x8A, + + 0xF9,0x01,0x8B,0x1D,0x91,0x32,0x7B,0x3B,0xBC,0x46,0x1E,0x42,0x56,0xFD,0xCA,0x55, + + 0xF7,0xD4,0x98,0x98,0x6A,0x6E,0xF5,0x09,0xCA,0x5C,0x16,0x97,0x2D,0x6C,0x74,0x60, + + 0x86,0x8B,0x0A,0x8C,0xA7,0x71,0x12,0x7C,0x97,0x44,0x8C,0xD5,0xAC,0x03,0x5B,0xC8, + + 0xC2,0x9F,0xD3,0x6F,0x3B,0x91,0xEC,0x2E,0x00,0x47,0xC5,0xC1,0x25,0xB3,0xCF,0x19, + + 0x18,0x09,0x74,0x13,0xF0,0x20,0x65,0x1C,0x30,0xD4,0x66,0xE2,0x6E,0xB9,0x3F,0x7E, + + 0x04,0xEF,0x10,0xAB,0x52,0x90,0x07,0x59,0x60,0xCB,0x20,0xC6,0x33,0x8C,0x55,0x60, + + 0xAC,0x5C,0x4C,0xB4,0x71,0xAC,0x50,0x78,0x12,0x24,0x67,0xDB,0x2C,0x8E,0x3F,0x13, + + 0xA0,0xCD,0xD7,0x75,0xB2,0x43,0x2D,0xD3,0x1F,0x10,0x68,0xCB,0xB9,0x7D,0xEA,0xEF, + + 0xC0,0x17,0xF5,0x11,0x91,0x70,0x42,0x31,0x8A,0xB0,0xFD,0xF1,0x71,0xAE,0x7E,0x87, + + 0xBC,0x6B,0x54,0x46,0xB2,0x8D,0xC1,0xFF,0x12,0x38,0x44,0xFB,0xF6,0xA0,0x29,0x3B, + + 0xC2,0x03,0x9C,0x59,0x90,0x2E,0x47,0x1F,0x03,0x85,0x18,0x71,0x30,0x15,0x7F,0x4F, + + 0x15,0x9B,0xFD,0x15,0xEE,0x30,0x0C,0x1D,0x07,0xF0,0x71,0x87,0x4D,0x14,0x34,0xAB, + + 0x81,0xFA,0x4E,0xB3,0x44,0x27,0x9D,0x59,0x44,0x5A,0xBD,0xB1,0xEC,0x78,0x78,0x6A, + + 0x3A,0x55,0xBE,0x62,0x94,0x35,0xE7,0x45,0x68,0x03,0xEE,0x8B,0x85,0x77,0x9E,0x70, + + 0x06,0x54,0x6D,0x5C,0x21,0xE5,0x13,0x5E,0x4D,0xB1,0x49,0x3E,0x7C,0x00,0x1D,0x8B, + + 0x62,0x15,0x7A,0xCA,0x66,0x67,0x2F,0xDB,0x17,0x18,0xA8,0x28,0xF6,0xF0,0xF4,0x91, + + 0x0C,0xE4,0x36,0xC3,0x64,0x46,0x90,0xE4,0xA8,0x63,0xE7,0x3F,0x79,0xDF,0x80,0x6E, + + 0xE1,0x5E,0x7E,0x33,0x3C,0x36,0xAF,0x6A,0xA3,0xCB,0x6B,0x3C,0x36,0x7A,0x6B,0xAA, + + 0xA6,0x6B,0x31,0x5E,0x19,0x0D,0x6C,0x03,0x9B,0x52,0x56,0x3D,0x18,0x1D,0xCD,0xB5, + + 0xAC,0x7E,0xD0,0x25,0x32,0xF3,0x6F,0x18,0x49,0xDE,0x87,0x75,0x59,0x78,0xB2,0xAB, + + 0x3D,0x40,0xB7,0x35,0x3F,0x3C,0x9F,0xF8,0x26,0x02,0xA7,0xE6,0x7F,0xEB,0x65,0x3D, + + 0x38,0xC2,0xA0,0x06,0x50,0x86,0x60,0x55,0x4E,0x7B,0xF8,0x32,0xD4,0xF0,0x4E,0x2F, + + 0xF0,0x27,0x57,0xE9,0xE2,0x14,0x31,0xCE,0xC5,0x83,0x3B,0x88,0x15,0xCD,0x2E,0xA1, + + 0x09,0x7F,0x8C,0x78,0x0D,0x29,0x7A,0xDB,0xC4,0x39,0x0E,0x5E,0xF5,0x62,0xBA,0xD3, + + 0xC9,0x57,0xE4,0x65,0x66,0x0C,0xF1,0x5B,0x47,0xE7,0x16,0x49,0x08,0xA2,0x6C,0x35, + + 0x65,0x1B,0x60,0x29,0x10,0xA5,0x70,0x3C,0xF3,0x18,0xF8,0x6A,0xAF,0x1B,0x22,0x29, + + 0x85,0xAD,0xB1,0x43,0xC2,0xC9,0x7C,0x25,0x9A,0x78,0x9A,0x76,0xA0,0xA4,0x19,0x41, + + 0x71,0xC4,0x27,0xB9,0x3A,0xAB,0xDE,0x0C,0x1B,0x84,0x4C,0xF8,0x29,0xBB,0xCD,0x31, + + 0xC4,0x68,0x2D,0x09,0x99,0xB9,0xD6,0x0C,0x48,0x61,0xC6,0x5A,0x28,0x6A,0xB1,0x15, + + 0x70,0x2C,0xF0,0x74,0x91,0x0E,0xB2,0x2E,0x0C,0x14,0x9D,0x51,0x85,0x55,0x0A,0x78, + + 0xE4,0x38,0x67,0x26,0x1B,0xA8,0x61,0x38,0x36,0x21,0xFA,0x0C,0xA2,0xEF,0xB6,0x32, + + 0xC4,0xFB,0xEE,0xCF,0xBE,0x21,0xE8,0x04,0xB3,0xC8,0xF9,0x2A,0xB7,0xE5,0x50,0x68, + + 0xF9,0x74,0xA9,0x7D,0xA4,0xA0,0xE6,0x90,0xCB,0x13,0x33,0x3D,0x7C,0xB4,0x1A,0xC8, + + 0x0D,0x6A,0x9F,0xB1,0x7D,0x05,0xBD,0x2A,0x42,0x38,0x23,0x90,0xD3,0x11,0xC2,0x89, + + 0xBE,0x8E,0x2A,0x7F,0x09,0x12,0x1C,0xA6,0x4C,0x8D,0xAF,0xBE,0x57,0xAC,0x39,0x65, + + 0x2D,0xCF,0xF0,0xCB,0xBE,0xDB,0xBC,0x4F,0x33,0xA2,0x95,0xC3,0x2B,0x48,0xD5,0x46, + + 0x29,0x21,0x52,0xDB,0xB7,0x25,0xDC,0xA7,0xEB,0x1B,0x48,0xD6,0x23,0xBC,0x88,0xF1, + + 0x3B,0x66,0x0B,0xDD,0xC5,0x0C,0x7D,0x7F,0x29,0x5A,0x8C,0x59,0xF9,0x76,0xD7,0xB6, + + 0xA8,0x3C,0x93,0xC9,0x11,0x3C,0x6D,0x12,0x47,0x92,0x50,0x24,0xC6,0xF9,0xDA,0xF0, + + 0xB3,0x44,0xA6,0x85,0x21,0x4E,0x60,0x03,0xC6,0x28,0xB0,0xE7,0xB0,0x0F,0xE0,0x00, + + 0xE2,0x18,0x56,0x67,0x25,0x62,0x3D,0xB2,0xED,0xF3,0x3F,0x35,0xF0,0x8A,0x5E,0x49, + + 0x9D,0x19,0xE3,0xDE,0xD3,0xB2,0xE3,0x1D,0x87,0x07,0x50,0x84,0x89,0x78,0xAC,0xD7, + + 0xBF,0x96,0xBC,0xCF,0xD6,0xBA,0xB8,0x0D,0x92,0xDC,0xF8,0x74,0x72,0x6F,0x04,0x29, + + 0x26,0xF6,0xB5,0xDA,0x15,0xB0,0xD9,0x66,0x11,0x2B,0x31,0x62,0xF8,0x7C,0x03,0xCA, + + 0x46,0xFB,0xCD,0xDF,0x4A,0x78,0x7F,0x1F,0x18,0xD3,0x85,0x88,0x36,0x95,0x06,0x60, + + 0x45,0xC2,0xD8,0x88,0xDD,0x3B,0xC9,0x55,0x93,0xD8,0x8E,0x93,0xDF,0xB9,0x4C,0x9A, + + 0xDE,0xF5,0xD1,0xFE,0x45,0xD5,0xC1,0x44,0x92,0xF9,0xB5,0x96,0x16,0x5A,0x46,0xAF, + + 0x57,0x17,0x0A,0x7C,0x30,0xB7,0x37,0x54,0xEC,0x25,0x8D,0x5C,0x8C,0xB8,0x90,0x00, + + 0x5C,0x12,0xCD,0x8F,0xBE,0x3B,0x3F,0x44,0x12,0xDB,0xAF,0x50,0xCA,0xF7,0x81,0x35, + + 0xCF,0x4A,0x86,0x6E,0x66,0x37,0xF2,0xA4,0x93,0x80,0xBC,0xEB,0xD2,0xF3,0x54,0x40, + + 0xDC,0xDC,0x31,0xB3,0x4C,0xB9,0x2F,0x1C,0xDA,0xD2,0xC6,0x2E,0x33,0xFB,0x9C,0xB9, + + 0x74,0x21,0xE3,0x2D,0xC9,0xBA,0x2D,0xF7,0xD2,0x9C,0xD0,0xE9,0x2E,0x9A,0xC2,0xA4, + + 0x32,0xC3,0xB0,0xA7,0xBB,0x57,0x26,0x07,0xAB,0x9E,0x77,0x9B,0x5C,0xBE,0x50,0x0D, + + 0x36,0x1B,0x37,0x02,0xE7,0x9D,0x0C,0xE0,0x38,0xDD,0xF1,0x84,0x86,0xDF,0x5A,0x94, + + 0x25,0x3F,0xDA,0x1B,0xE2,0x5A,0xC1,0x30,0x29,0x9B,0x78,0x0B,0x75,0xCA,0x06,0x67, + + 0x7B,0x0B,0x93,0x8F,0x6B,0xBF,0x37,0x44,0x63,0xC7,0x4E,0x25,0x53,0x6C,0x2F,0xF3, + + 0xED,0xAC,0xCA,0x91,0xC4,0xB2,0xE6,0x5F,0xAB,0x4C,0xE1,0x31,0x28,0x21,0x44,0x4B, + + 0xFE,0xA7,0x6D,0x5D,0x71,0x24,0xAF,0x99,0x46,0x04,0xF6,0x62,0x9C,0xD9,0x9A,0xD4, + + 0x0B,0xF1,0x9A,0x1E,0xF8,0x41,0xD8,0x0B,0x45,0x44,0x58,0x87,0x99,0xCE,0x81,0x40, + + 0x5E,0xF3,0x54,0xB6,0x16,0xAB,0x1B,0x3C,0xA9,0x49,0xFB,0xB5,0x71,0xEE,0x6F,0xE1, + + 0x07,0xA3,0xF1,0x68,0x6C,0xAA,0x4C,0x9F,0x6F,0x4A,0xBB,0x71,0xD5,0xE4,0x13,0xE4, + + 0xB4,0x73,0xDB,0xDB,0xBD,0xAF,0xE9,0x07,0x1F,0x35,0x82,0x05,0xEF,0x0D,0x74,0x25, + + 0x76,0x1F,0x1A,0xF4,0xD6,0x64,0x58,0xC8,0xBA,0xB8,0xA2,0x0C,0x17,0xC6,0x43,0x1A, + + 0xE4,0xDB,0x82,0x08,0x1F,0xBB,0xFF,0xBA,0x97,0x40,0xAB,0xC2,0x25,0xCB,0xD0,0x16, + + 0x8F,0x33,0x89,0xFB,0xBD,0x28,0x65,0x3F,0xAA,0xBC,0x3B,0x4F,0xBB,0x57,0x96,0x4F, + + 0xAB,0x69,0x11,0xB2,0x9A,0x81,0xAF,0x17,0x4C,0x4D,0x1E,0x9D,0xC6,0x7E,0x24,0xED, + + 0xE4,0x41,0xCE,0x1B,0x9A,0x23,0xA3,0x5F,0xEA,0x32,0xA5,0x81,0x5B,0x63,0xBC,0xCD, + + 0x82,0xFA,0x53,0x8A,0x98,0xDB,0xF7,0xED,0xEA,0xDE,0x3B,0xE7,0xF8,0xB8,0x3B,0x9F, + + 0x21,0x4D,0x0B,0xED,0x4D,0x6D,0xE4,0xFD,0xEB,0x69,0xB3,0xFB,0x27,0x2E,0x83,0x04, + + 0x28,0x83,0x3C,0x7B,0x50,0xCF,0x04,0x82,0xC1,0xEF,0x80,0xC2,0xFD,0x12,0x4C,0xAC, + + 0xCA,0x55,0x32,0x98,0x02,0x85,0xA3,0xEA,0x02,0x24,0x43,0xB5,0x8C,0x1D,0x3F,0x7E, + + 0x57,0x99,0x65,0x1D,0x4D,0x31,0xD5,0x71,0x5C,0xCE,0xF5,0x8B,0x93,0x7D,0x37,0x21, + + 0x1D,0xBC,0x37,0x75,0xF9,0x28,0x8E,0x35,0xC9,0xCB,0xFB,0xD0,0xF2,0x52,0xD8,0xFB, + + 0x1F,0xE1,0xAC,0x42,0xCE,0x75,0x77,0x7E,0xBA,0xA2,0x71,0x7C,0xF5,0x62,0x2C,0x70, + + 0x3B,0xB8,0xC8,0x36,0xB1,0xC9,0x0E,0xDB,0x88,0xF0,0xDC,0x36,0xF0,0x33,0xD8,0x45, + + 0xE9,0xB6,0xA5,0x9A,0x11,0xBD,0x0B,0x7A,0xF2,0x14,0x85,0x7B,0x09,0x8D,0xC4,0x33, + + 0xE3,0x11,0xB7,0x25,0x60,0x38,0x03,0xC3,0xE7,0x1B,0x6A,0xD1,0x2F,0x96,0xA2,0xEA, + + 0xD3,0x5A,0x6F,0xEA,0xD3,0xD1,0x2E,0x57,0x0B,0xF1,0xCC,0x8C,0x04,0x67,0xCE,0xBC, + + 0xEF,0x14,0x8A,0xDB,0xB8,0x37,0xDE,0x99,0x7F,0x26,0x09,0x56,0xDC,0x15,0x97,0x1F, + + 0x51,0x15,0x17,0x4A,0xBA,0xCF,0x84,0x2D,0xC8,0x2F,0x2F,0x53,0x9B,0x5B,0x98,0x66, + + 0xFD,0xCC,0x4F,0x2D,0x24,0xC7,0xAE,0x5B,0x18,0xF4,0x7C,0x43,0x5D,0x96,0x16,0xD5, + + 0x89,0x5C,0xA6,0x93,0xDD,0x91,0x37,0xFB,0x18,0xC8,0x8F,0x6D,0xDF,0xD5,0xE3,0x96, + + 0xDE,0x41,0x82,0x3E,0x86,0xB1,0xFB,0xFD,0xEC,0x4B,0x48,0x1C,0x23,0x7B,0x0F,0xE7, + + 0x37,0xE3,0x8F,0x2F,0x16,0x93,0x71,0x50,0x32,0xF5,0x41,0x8D,0xD6,0xD3,0x71,0xB5, + + 0x8A,0xDD,0x1B,0x78,0xF8,0x33,0x0F,0x67,0x10,0xA4,0xF1,0x06,0x5A,0xD4,0x6E,0xFE, + + 0xB8,0x7B,0xB7,0xA2,0x12,0x03,0xE3,0xD1,0xC8,0x7D,0x70,0x06,0x04,0xBF,0xBE,0xEB, + + 0x49,0xC3,0x92,0x94,0x88,0x85,0x38,0x33,0x11,0xC5,0x78,0x16,0x06,0xBC,0x61,0x2C, + + 0xB4,0xD7,0x07,0x83,0xAE,0x44,0x49,0x2E,0x98,0x35,0x05,0x45,0x6B,0x1F,0xA4,0x31, + + 0xF2,0xF6,0xD1,0x93,0xC7,0x7F,0x83,0x2B,0x45,0x7F,0xC1,0x10,0x68,0xEC,0xA8,0xCB, + + 0x02,0x2E,0xB2,0xB3,0x10,0x27,0x0E,0x65,0xF3,0xCB,0x1C,0xE6,0xAA,0xC4,0x69,0x14, + + 0x47,0x28,0x96,0x65,0x7C,0x20,0x0E,0x4B,0x41,0xC4,0xD2,0xA6,0xF4,0x6D,0x77,0x5C, + + 0x93,0xC8,0x13,0xC3,0xF4,0xD3,0xC5,0x0C,0x65,0x4D,0x5D,0x25,0x55,0x5B,0xF6,0x01, + + 0xA9,0xE4,0x69,0x11,0x05,0x03,0x7B,0x11,0x30,0x4C,0xF8,0x84,0x1D,0x4C,0xFD,0x8A, + + 0xB0,0x99,0x62,0x3F,0x65,0xAB,0xA2,0x74,0xB1,0x14,0xE8,0x9D,0x24,0xAA,0x71,0x15, + + 0x0B,0x11,0x10,0x7E,0x11,0x24,0x2E,0x6A,0xEC,0x36,0xE0,0xFB,0x21,0xF6,0x92,0x3E, + + 0xF7,0x9C,0x32,0x1E,0xAF,0x1E,0x69,0xB1,0xB8,0x88,0xA3,0x3F,0x7D,0x35,0x98,0x3F, + + 0x8B,0xCA,0xD5,0x6A,0xAE,0x95,0x61,0xEF,0xB9,0x89,0x00,0xD9,0xF9,0xF0,0x28,0x08, + + 0x4F,0x8B,0xEC,0x54,0xD6,0x64,0x05,0x57,0xFD,0x11,0x95,0x66,0x8A,0x29,0xF7,0xDE, + + 0x4C,0xB2,0x02,0xD4,0x3D,0x7B,0xCD,0x7B,0xC2,0xC1,0x5A,0x8F,0xBF,0x6D,0x9E,0x70, + + 0xA3,0x7B,0xC4,0xBE,0x02,0xCE,0x8B,0x4F,0x41,0xCC,0x54,0x58,0xB5,0x4B,0x51,0xA8, + + 0xDA,0xFA,0x94,0xA2,0x9F,0xA1,0x13,0xFF,0xAD,0x19,0x3B,0xCF,0x84,0x44,0xE4,0xF1, + + 0xA6,0x8C,0x9B,0xD9,0x5F,0x66,0x4C,0x90,0x58,0x2F,0x70,0x5D,0x17,0x7B,0xA8,0xED, + + 0x04,0xE1,0xCB,0x9B,0xD4,0xF3,0xAC,0x12,0x1D,0x92,0xEE,0x98,0x9E,0x95,0x57,0xE1, + + 0x46,0xC7,0xA5,0x98,0x6A,0x19,0x0B,0x41,0xD2,0x0D,0x22,0x54,0x70,0x7F,0xF6,0xD9, + + 0xDA,0x16,0xFF,0xBC,0xDE,0x16,0x2D,0x8B,0x99,0x7E,0x82,0x55,0xA9,0xF7,0x76,0x3D, + + 0xD9,0x19,0xEB,0x38,0xDF,0x0C,0x74,0x20,0xE5,0x92,0x8C,0x5B,0x96,0x0B,0xFB,0x21, + + 0xA3,0xC8,0x67,0x2D,0xFF,0x4D,0x87,0x09,0x45,0x24,0x23,0x3C,0x00,0xC5,0x37,0x3C, + + 0x51,0xEB,0xCF,0x62,0xF5,0xBB,0xC2,0xC7,0x07,0x29,0x46,0x05,0x76,0x76,0xBE,0x20, + + 0x2B,0x9A,0xA3,0xF8,0xE2,0xF7,0xFF,0x71,0x2E,0x40,0x3D,0x36,0x00,0xF1,0xFB,0x0E, + + 0x57,0x67,0x86,0x7F,0xDC,0x38,0x28,0x9B,0xCD,0x67,0xDB,0x8A,0xAC,0x9B,0x01,0xE5, + + 0xF4,0x0C,0x8D,0x8D,0x41,0x0D,0x64,0xF8,0x15,0x76,0x1B,0x0A,0x7B,0x93,0xE7,0x5B, + + 0x16,0xDB,0x0F,0x05,0x74,0x6B,0x09,0xDB,0xC2,0x45,0x90,0x1F,0x68,0x59,0x37,0xE1, + + 0x22,0x3D,0xF1,0x90,0xF9,0xF5,0x9F,0x4B,0x65,0x48,0xE0,0x42,0xF9,0xB9,0x99,0xB8, + + 0xD5,0xDE,0x6D,0x22,0xB1,0xBE,0x4E,0xD3,0x95,0xDA,0xFE,0x59,0x1D,0xDC,0xF7,0x29, + + 0xAB,0x10,0x86,0xC1,0xBB,0x69,0x05,0x81,0xE2,0x4B,0x68,0x18,0x5B,0x06,0x2D,0x96, + + 0x13,0x3F,0x50,0xCE,0x33,0xB2,0x59,0x51,0x4F,0x6F,0x8F,0x07,0xF4,0x53,0xBE,0x28, + + 0x23,0x92,0x4B,0xCC,0x33,0x79,0x37,0x6F,0x72,0x62,0x00,0x8D,0x08,0x40,0x59,0x07, + + 0xE5,0x9F,0x32,0x80,0x65,0xB4,0xA7,0x04,0xCF,0x42,0xC0,0xC9,0x40,0x20,0xCD,0xF8, + + 0x81,0xCC,0xE8,0x5E,0xA7,0x2E,0x70,0x3F,0xC5,0x15,0xB0,0xD6,0xD0,0x05,0x3E,0x46, + + 0x52,0x08,0x11,0x77,0x7B,0x38,0xA6,0x20,0x4D,0x4E,0x1A,0x1D,0x51,0x6F,0x16,0x71, + + 0x87,0x88,0xF7,0xCD,0x7A,0xCA,0xBD,0xB5,0xA3,0x98,0xB1,0x33,0x50,0x6D,0xC0,0x1C, + + 0x0D,0x46,0x90,0xDD,0xF3,0x2B,0xFF,0x8E,0xBB,0x4B,0xD4,0x94,0xEF,0xB5,0x01,0xA8, + + 0x92,0xBE,0x82,0x49,0x91,0x26,0x20,0xF2,0x9E,0x5A,0xF6,0x87,0xDF,0x68,0xD1,0xD5, + + 0x84,0x2C,0xA1,0x47,0xEB,0x2B,0x31,0x3E,0x79,0x3B,0xAF,0x63,0x33,0xE5,0x7B,0xA0, + + 0xED,0x45,0x0C,0xB7,0x97,0xAD,0x67,0xA0,0x60,0x41,0xA6,0x0A,0x5E,0xD1,0xFE,0x31, + + 0x0E,0x1B,0x59,0x52,0x67,0x42,0x42,0xB6,0xB3,0xE5,0xCC,0xEE,0x4A,0x2A,0xED,0xD8, + + 0x4D,0xF5,0xC0,0xB7,0x6E,0x75,0x6C,0xDA,0x81,0x4A,0xDE,0xBE,0x58,0x0E,0xF2,0x6B, + + 0x7B,0x66,0x5E,0x10,0x63,0x68,0x61,0xCB,0x64,0xE7,0x93,0x21,0xDE,0xC0,0x30,0x46, + + 0x5C,0xB6,0x54,0xB7,0xA6,0xDB,0xBB,0x2A,0xB5,0x2F,0xA1,0xDF,0x5B,0x43,0x9F,0x48, + + 0x3D,0x08,0x11,0xBD,0xB9,0x6C,0x5A,0x07,0x29,0x6C,0xDA,0x7C,0x0E,0xBB,0xB2,0xDC, + + 0x2F,0xFD,0x0A,0x7D,0x61,0x6F,0x3A,0x38,0xB4,0x40,0x49,0x8F,0xDF,0xE0,0x9C,0x48, + + 0x8C,0x36,0x7C,0xC9,0xBA,0x55,0x2B,0xC9,0x35,0xF1,0x51,0x02,0xB9,0x5F,0x8B,0x58, + + 0xF9,0xD4,0xDB,0x31,0x6A,0x20,0x4B,0x1B,0x70,0x0E,0x89,0x2B,0x30,0x0B,0x97,0xF2, + + 0x83,0x51,0xC1,0x74,0xA0,0x91,0x94,0x51,0xA2,0xD0,0xCD,0xB2,0x14,0x8F,0x46,0x95, + + 0xDE,0x50,0x8B,0xAB,0x5D,0x73,0xDC,0x00,0x6E,0xFA,0x23,0xEF,0x88,0xAE,0x65,0x83, + + 0xF9,0x1F,0x13,0x6F,0x15,0x3B,0x2F,0x25,0x82,0x8B,0x55,0xE4,0xFA,0xCE,0x53,0x73, + + 0xA5,0x15,0xC7,0xC2,0xB7,0x08,0xB8,0xB5,0x66,0x45,0xA3,0x00,0x4E,0x0E,0x3A,0xC7, + + 0x83,0xEB,0xD1,0x40,0x12,0xB4,0x2C,0xF9,0x98,0x92,0x68,0x9A,0xD1,0x11,0xEC,0xA2, + + 0x49,0xE6,0x4F,0x8B,0xC2,0xC9,0xB9,0x8A,0xF5,0x5D,0xE3,0xBF,0x92,0xCA,0x7B,0x81, + + 0x9E,0xB9,0xFD,0x3F,0x51,0x3F,0x3A,0xC5,0x6F,0xEB,0x6A,0x07,0xD6,0x4A,0x33,0xD6, + + 0x5E,0x18,0xE2,0xBE,0x6A,0x75,0x58,0x82,0xA2,0xA6,0xA6,0x7C,0x0E,0x46,0xF7,0xA0, + + 0x2C,0xB8,0xB8,0xB3,0x54,0x78,0x46,0x36,0x93,0xA3,0x69,0x6B,0xA2,0x70,0x0A,0xDF, + + 0xA8,0x17,0xAE,0xFE,0x1D,0x3F,0xA9,0x9C,0xEB,0x5D,0x61,0x98,0x85,0xE0,0x57,0x4E, + + 0xAA,0xEF,0x19,0xC2,0xF0,0xDB,0x17,0x6B,0x6B,0x1C,0x95,0xC2,0x0F,0xC7,0xCF,0x29, + + 0x7F,0xB4,0xAF,0x2D,0xDA,0x6E,0x17,0xDB,0x0A,0x52,0xA5,0x43,0x9A,0x5C,0x66,0xAE, + + 0x0E,0x72,0xCB,0xC3,0x3C,0x36,0xA9,0x9B,0x67,0x8F,0xA8,0xEA,0x9B,0xAF,0x66,0x1A, + + 0x40,0xDB,0xEE,0x02,0x1F,0x90,0x54,0x67,0x82,0x35,0xA1,0x8E,0x09,0xE2,0x07,0xF6, + + 0xA2,0x72,0xDC,0xDC,0xE9,0x0E,0xAC,0xCD,0x65,0xF3,0xA9,0xEA,0x5B,0xCF,0x4F,0xC2, + + 0x65,0xB4,0x52,0x32,0x42,0x4E,0xBC,0xB9,0xF3,0xF2,0xE2,0x1D,0x0E,0xC2,0x8B,0x1B, + + 0x84,0x1E,0x9A,0xFD,0x12,0x2A,0x0E,0x18,0xE7,0xA5,0x14,0x44,0x15,0xC0,0x48,0x53, + + 0x89,0x8C,0x30,0xFB,0x49,0x2C,0x38,0xF0,0xC6,0x87,0x18,0xF4,0xD9,0xEF,0x8E,0x7D, + + 0x59,0xC3,0xD4,0xFB,0x41,0x59,0x0F,0x18,0x67,0x39,0xC9,0xE5,0x57,0xEC,0x23,0x1B, + + 0x26,0x85,0xD6,0x13,0xD6,0x94,0x8E,0x17,0x4A,0xC1,0xC1,0xF5,0x74,0xA0,0x49,0xBF, + + 0xE6,0xFF,0x54,0x3D,0xB5,0x0F,0x4A,0x99,0x25,0x59,0xC8,0x99,0x72,0xA6,0xDD,0x56, + + 0x52,0x14,0xF8,0x04,0x11,0x84,0x40,0x83,0xE4,0x25,0x44,0x14,0xA4,0x80,0xA1,0xBA, + + 0x84,0x1D,0x99,0x43,0x6B,0xE4,0x66,0xE7,0xF4,0x0A,0x3D,0x0F,0x54,0x2A,0xCA,0xEE, + + 0x5B,0x8F,0xBE,0xD3,0xB7,0x3D,0x4B,0x4D,0x64,0xDC,0xC1,0x8C,0x5A,0x1A,0x2A,0x47, + + 0x6F,0xC8,0xC2,0x58,0x93,0xA5,0x85,0x2B,0xC1,0xC4,0x15,0x9A,0x5A,0xC0,0x68,0xF8, + + 0x8F,0xC1,0xD4,0x2B,0xF4,0x48,0x44,0xAD,0xAC,0x1A,0x65,0x3E,0xAA,0xEA,0x5B,0x89, + + 0x8D,0xD2,0xB9,0x0E,0xBF,0xEB,0x5B,0x54,0xAC,0x8A,0xF7,0x30,0xB2,0x17,0xBC,0xF9, + + 0x0F,0xC3,0x07,0x8C,0x86,0xA1,0x45,0xAD,0xA6,0x6D,0xBC,0xB2,0x34,0x28,0x41,0x0B, + + 0xD6,0xC4,0xD9,0xAC,0xB2,0x11,0xF6,0x34,0xC3,0xAE,0x95,0x95,0xAB,0x7A,0x54,0x1E, + + 0x33,0x22,0xD7,0x19,0xD5,0x97,0x85,0x8A,0xBE,0x7C,0x12,0x04,0x9D,0xED,0xDE,0x2B, + + 0x90,0xFC,0x9B,0x6B,0x7F,0x91,0xD8,0xEE,0x5D,0xF1,0x88,0x28,0x27,0x68,0xCB,0x29, + + 0xE5,0xA7,0xA3,0xC7,0xFC,0xD5,0xBB,0xD3,0x0A,0x32,0xF3,0x0C,0x5D,0x23,0x96,0x71, + + 0xC8,0x3B,0xDC,0x7A,0xB4,0x4B,0xB7,0x26,0x54,0xD0,0x27,0x22,0x46,0x26,0x4C,0x32, + + 0xF3,0x2E,0xAC,0x12,0x32,0xA8,0x26,0x9C,0x44,0xB1,0x2F,0x32,0x47,0xA6,0x13,0x8B, + + 0xA2,0x11,0xF5,0x7E,0xB8,0x29,0x55,0xA1,0xE5,0xDF,0x0A,0x45,0x97,0x9D,0x04,0xFC, + + 0x34,0x56,0x01,0xE5,0x6B,0x4C,0x67,0x4C,0x46,0xD5,0x87,0x55,0x96,0x03,0x02,0xCF, + + 0xC7,0x3B,0x19,0xB4,0x18,0xEB,0x7E,0x7D,0x99,0x79,0xFF,0x06,0x7A,0x0F,0xAC,0x62, + + 0x7C,0x3E,0xF6,0xD4,0x84,0x3E,0x46,0x0C,0x98,0x94,0x53,0xD2,0xF8,0xF7,0x07,0x47, + + 0xC4,0x9A,0x5A,0x80,0x28,0xEB,0xF9,0x7D,0x11,0x97,0x44,0xC3,0x2B,0x4B,0xC8,0x5B, + + 0x20,0x81,0xCD,0x5D,0xB6,0xD7,0x1D,0x53,0xB9,0xDA,0x4A,0xF6,0x7A,0xFB,0x54,0x82, + + 0xC8,0x3F,0x9C,0x10,0xBE,0xBC,0x12,0xAA,0xCD,0x5F,0x21,0x51,0x28,0x2F,0x2F,0xAC, + + 0xD5,0x62,0xD6,0x62,0xBD,0x42,0xFE,0x9E,0x47,0xD2,0x61,0xC4,0x42,0x3F,0x16,0xDB, + + 0x48,0x0F,0x75,0x6D,0x10,0x47,0x33,0xB7,0x0D,0xD5,0x36,0xC5,0x8B,0x36,0x2F,0x59, + + 0x2E,0xDD,0xFE,0x67,0x3D,0x00,0xB9,0x44,0xEB,0x4A,0x66,0xBF,0x1C,0x44,0x36,0x54, + + 0xD5,0x67,0x51,0xA3,0x1A,0x41,0x3C,0x14,0xCD,0xDA,0x9E,0x6A,0x1C,0x75,0xD9,0xFE, + + 0xAD,0x61,0x51,0x45,0xC0,0xFC,0x1E,0x5A,0x31,0xD0,0x80,0xCD,0x79,0x7E,0x67,0x09, + + 0x2D,0xD8,0x4B,0x54,0xBF,0x3E,0xFF,0x3F,0x0F,0xD1,0x54,0xD9,0x22,0x1B,0x92,0xA4, + + 0x0C,0x99,0x30,0xDF,0x9B,0x64,0x35,0x00,0x4C,0xD9,0x36,0x0E,0x63,0xBF,0xE8,0x8A, + + 0x22,0xD6,0x63,0xFA,0x34,0x5C,0x04,0x99,0x46,0x41,0xCA,0xCB,0x2C,0xCF,0x60,0x96, + + 0xFD,0x40,0x21,0xE5,0x29,0x05,0x27,0xD2,0x65,0x2F,0xE6,0x33,0xF0,0x0D,0x7E,0xFC, + + 0x80,0x0C,0x3E,0x4A,0x05,0xFF,0x3D,0x5B,0x63,0x27,0x31,0x57,0xB2,0x5E,0x53,0xC5, + + 0xFD,0x41,0xD7,0x39,0x10,0x98,0x59,0x0E,0xC9,0x2F,0x7A,0x25,0x2E,0x22,0xB6,0x32, + + 0xA1,0x02,0x99,0xA1,0x71,0xDF,0xE7,0x44,0xC0,0x4C,0x38,0xD7,0xD7,0x23,0xB3,0xB2, + + 0xA2,0x8F,0x30,0x26,0x20,0x0F,0x50,0xDE,0xE2,0xCF,0xAC,0x50,0x55,0x45,0x49,0xF7, + + 0x23,0x8C,0x39,0x4D,0xF1,0xD9,0xA4,0x13,0x61,0x40,0x11,0x78,0x61,0x2A,0xCE,0x01, + + 0x82,0x08,0x31,0xBD,0x9A,0x68,0xA2,0x93,0x62,0xCD,0x7E,0x33,0x71,0x29,0x12,0x2A, + + 0xA9,0xD7,0xC2,0xF4,0xA6,0x8C,0x3A,0xEA,0x4E,0xCB,0x2D,0x70,0x7B,0xC8,0x1E,0x48, + + 0xFC,0x06,0x00,0x23,0x2D,0xFC,0xDA,0x88,0x12,0xE2,0x19,0x47,0x08,0x62,0x59,0x93, + + 0xF4,0x48,0x99,0x5C,0x50,0x83,0x09,0xAD,0xAA,0x46,0x14,0x92,0xD8,0x4A,0x51,0x68, + + 0xF5,0x49,0x9E,0x19,0x84,0x89,0xBE,0x3D,0x4E,0x5D,0x9D,0x24,0x23,0x6B,0x22,0x08, + + 0xE8,0xD1,0x52,0xCE,0x38,0x3E,0xD5,0x8A,0xC8,0x44,0xA6,0x48,0x7A,0xCD,0xDA,0x1E, + + 0xA1,0xF6,0xFF,0xBE,0xB7,0xA6,0xE5,0x9A,0x6F,0xC0,0x60,0xEE,0x2B,0x7F,0x3B,0x6E, + + 0x77,0x01,0x93,0x41,0x8A,0xA5,0x22,0x17,0x69,0x2B,0x93,0xAA,0xE9,0xA8,0x4D,0xDD, + + 0x83,0xFB,0xFB,0xBF,0xBF,0xA4,0xA0,0x07,0xAB,0xDE,0x61,0x0D,0x5B,0xE9,0x04,0x04, + + 0x65,0x03,0x50,0x6B,0x5B,0x88,0xE4,0xAC,0x40,0x40,0xEB,0x59,0x70,0x7E,0x74,0xB7, + + 0xDC,0x1E,0xF2,0xC8,0x21,0x7C,0xDC,0x94,0x4B,0x58,0xB4,0xD6,0xF0,0x7E,0x65,0x21, + + 0xE6,0x9F,0x85,0x6D,0xA0,0x7F,0x95,0xB0,0xD5,0x13,0xFD,0x23,0x0C,0x33,0x9D,0xE3, + + 0x4A,0xF2,0xF3,0xC8,0x82,0x63,0x5F,0x59,0x5B,0x1E,0xB5,0xB2,0x70,0x37,0x1D,0xC0, + + 0x24,0xDF,0x1B,0x44,0x45,0x43,0x0E,0xFD,0xC1,0x52,0xB6,0x78,0x71,0xE4,0x5F,0xE6, + + 0x25,0xF5,0x4F,0x13,0x11,0x97,0xDC,0x12,0x47,0xD8,0x1C,0xAC,0x22,0xA8,0x4D,0x3C, + + 0xA6,0x54,0x05,0xED,0x49,0x74,0x59,0x9F,0x43,0xDE,0x8C,0x63,0x17,0xB6,0x71,0xF5, + + 0xA5,0x7D,0x49,0x51,0xA3,0x37,0x23,0xE8,0xD0,0x41,0xA5,0xD2,0x0E,0x78,0x5C,0xB4, + + 0x40,0xF9,0x3E,0x7F,0x3B,0x28,0x00,0xC0,0xCF,0x15,0xBE,0x6E,0x13,0x76,0xE2,0x0A, + + 0x21,0x11,0xAD,0x38,0xE1,0x5A,0x1D,0x3A,0x60,0x3D,0xF6,0x7E,0xFA,0x3D,0xC7,0xA9, + + 0xE8,0x17,0x3F,0x7E,0xB3,0x7B,0xFB,0x3B,0xAA,0x52,0xD7,0x29,0xD2,0x41,0x09,0xA6, + + 0xC5,0x59,0x4F,0x58,0xC2,0xC0,0x27,0xE9,0xE1,0x54,0xF7,0xBA,0x7A,0x74,0x5F,0x4A, + + 0xEF,0x71,0x46,0x78,0x9E,0x7E,0xAC,0xAE,0x06,0x4C,0x46,0x9E,0x85,0xF7,0x36,0x5C, + + 0x7A,0x95,0xF0,0xB0,0x18,0x4D,0x5F,0x1E,0x58,0xCB,0x2F,0x9E,0x8C,0x11,0xFC,0x2B, + + 0x06,0xE3,0x0B,0x4C,0x1C,0x6E,0xAD,0x01,0x03,0x11,0x2B,0xD0,0xFC,0x6D,0x57,0xDC, + + 0x55,0x7F,0x89,0xB1,0xBD,0xCD,0xA5,0xBF,0xD3,0x4D,0x1B,0x1F,0xA7,0x88,0x30,0x2D, + + 0xA5,0x5F,0x8C,0x0A,0x9D,0x90,0x60,0xBC,0xBF,0x3B,0xB4,0x3E,0x52,0xC0,0x3C,0x4A, + + 0xF0,0x8E,0xA8,0x55,0x07,0xE9,0x8F,0x16,0xAC,0x98,0x67,0xC9,0x71,0xA0,0x7B,0x2C, + + 0xF8,0xC0,0x8D,0x17,0x9C,0x16,0x31,0xE1,0x47,0x84,0x1F,0x59,0xF5,0x82,0xB9,0x61, + + 0x76,0x3C,0x04,0x94,0x95,0xA3,0x95,0xA0,0xF8,0xCB,0x55,0xB7,0x29,0xC3,0xBF,0x57, + + 0x81,0x83,0xD5,0xA4,0xBA,0x2F,0x0F,0x10,0x24,0x87,0xD4,0x26,0x52,0x8A,0x80,0xF0, + + 0xA3,0x02,0xE0,0x61,0xB6,0x7A,0x06,0x74,0x97,0xA1,0x83,0xEF,0xAA,0x54,0xC9,0xE1, + + 0x59,0xD9,0xF1,0xA5,0xB2,0xA0,0x0A,0x18,0xA7,0xA6,0x61,0x20,0xF2,0x6B,0x89,0x6E, + + 0x02,0x80,0x89,0x17,0x7B,0xAA,0xC6,0x91,0x93,0x10,0x87,0x71,0x36,0x34,0xFF,0x8A, + + 0x3B,0x69,0x2A,0x41,0xC0,0xA8,0xB6,0x8A,0x5C,0x18,0x1E,0x6C,0xDF,0xAA,0xD1,0xF7, + + 0x75,0xD2,0xAA,0x5D,0x3B,0xA9,0x70,0xA1,0x4B,0xA1,0x76,0xCF,0xC1,0xA9,0x5E,0xE1, + + 0x8A,0xCA,0xA3,0x4E,0x01,0x7E,0xF3,0xEE,0xC6,0x88,0xE1,0x5F,0xDA,0x69,0xDE,0xF2, + + 0x9D,0x90,0x1B,0x13,0x33,0x26,0x89,0xBF,0x8E,0xE0,0x53,0xB5,0xFF,0x3D,0x72,0x77, + + 0xEB,0xCD,0x4E,0xD0,0x93,0x5A,0x32,0x05,0x6A,0xCA,0x8C,0x69,0xFF,0x7D,0xE9,0xDF, + + 0x70,0xED,0xEE,0x19,0x1C,0xA2,0x81,0x98,0xE3,0xC0,0x55,0x04,0x82,0xAC,0xA3,0xCF, + + 0xC8,0x8F,0xEB,0x4A,0x11,0xAA,0x7F,0x10,0x6F,0x44,0x88,0x14,0xFD,0xC1,0xAB,0x63, + + 0x6B,0xCD,0x7B,0xDB,0x98,0xF0,0x31,0x85,0x6C,0xAA,0xA2,0xF9,0x3A,0x83,0xAC,0xE6, + + 0x6C,0x71,0xB4,0x02,0x3C,0x84,0xA4,0xD0,0x57,0xE7,0xDC,0xC4,0x52,0xF6,0xAB,0xD2, + + 0xCC,0xD0,0x0B,0xA9,0x1B,0xF3,0x04,0x49,0x84,0xB2,0xDC,0xF6,0xD3,0xFC,0x1B,0xB6, + + 0x29,0x14,0x12,0x23,0xB2,0x92,0xCD,0x87,0x45,0x73,0xBD,0x00,0x15,0xFD,0x92,0x17, + + 0x85,0xCA,0x61,0x99,0xB3,0xF9,0x46,0x74,0x18,0x65,0xB7,0xB6,0x56,0xFE,0xE0,0xC6, + + 0x21,0xF3,0x88,0x42,0x75,0x02,0xAE,0x46,0x42,0x96,0x75,0x05,0x72,0x2C,0x80,0x52, + + 0xDB,0xB5,0x00,0x56,0xCB,0x95,0x46,0x1A,0x58,0x1A,0xC6,0x0C,0xAA,0x68,0xA5,0x13, + + 0x26,0xD7,0x25,0x7B,0x97,0xF7,0xF9,0xF3,0x63,0x86,0xC5,0xB9,0x0B,0x2A,0xC1,0x91, + + 0x24,0xD5,0x41,0x55,0xB6,0x72,0xD5,0x73,0x62,0xC7,0x52,0xAC,0x02,0x4B,0xE6,0xAB, + + 0x56,0xDA,0xE3,0x8A,0x77,0x19,0x8D,0x30,0x6D,0x38,0xFC,0xB3,0x3D,0xFD,0x9A,0xE1, + + 0x8E,0x64,0x0E,0xEC,0x5F,0x85,0x5D,0x44,0x49,0xB5,0x05,0x5C,0xD1,0x04,0x37,0x63, + + 0x5D,0x95,0xFD,0x61,0xC0,0x15,0x88,0x30,0x13,0x07,0xCF,0x2D,0xFD,0xFD,0xEF,0xBB, + + 0xFE,0xD9,0xD1,0x98,0x1C,0x64,0x00,0x24,0x12,0x46,0xC7,0x9B,0x7F,0xF3,0x34,0x36, + + 0x0C,0x4A,0xDE,0x3D,0x4A,0x18,0x08,0x86,0x5D,0x4E,0x36,0x3E,0x23,0x6C,0x9D,0xE1, + + 0xD5,0x08,0x5D,0xE2,0xC3,0x4C,0x7C,0xDE,0x04,0x87,0x3E,0xA3,0xD3,0xBF,0x18,0xF4, + + 0x50,0x4B,0x08,0xF2,0x38,0x4B,0x8F,0xAD,0xEA,0x90,0x84,0xC2,0x51,0xBF,0x1C,0x19, + + 0x2C,0xD9,0x7F,0x81,0x42,0x63,0x5F,0x0A,0xF0,0xDF,0xF4,0xAF,0xDC,0x9F,0x80,0xC4, + + 0xAE,0xF7,0x5D,0x05,0x14,0xF8,0x70,0x61,0xB5,0x4D,0x90,0x24,0x50,0x60,0x28,0x34, + + 0x07,0xF9,0xD2,0x15,0xB2,0x85,0x14,0x4B,0xE0,0xC9,0x98,0x34,0x51,0x61,0x05,0x04, + + 0x86,0x88,0x58,0x87,0x4D,0xAD,0x5B,0xDA,0x63,0x44,0x91,0x25,0xD0,0x62,0xBD,0x95, + + 0xD0,0x8B,0x02,0xC4,0x95,0xFB,0x1D,0xD3,0xE5,0x58,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x1A,0x0D, + + 0xF6,0x68,0x5B,0x8E,0x19,0x4F,0xCF,0x5E,0xBF,0xE5,0x92,0x2C,0x58,0x68,0xCA,0xDC, + + 0xA7,0x48,0x35,0xFE,0x3D,0xDD,0x65,0xBC,0x14,0x33,0x9A,0x3C,0x59,0x69,0x87,0x0D, + + 0xCB,0x0E,0xBB,0xF2,0x79,0x25,0x8E,0x37,0x6B,0xCF,0x93,0x2D,0xD8,0x6A,0xE7,0x99, + + 0x75,0x2B,0x5B,0x99,0xDA,0xC7,0x8B,0xBB,0xCC,0x0F,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x5B,0x70, + + 0x24,0x1F,0x84,0x84,0x30,0x30,0xD1,0xDB,0xC3,0x35,0x94,0xA4,0x70,0x70,0x0E,0xE6, + + 0x6B,0xBB,0x8C,0x94,0x31,0x31,0x0A,0xD2,0x09,0x5C,0x9C,0xB4,0x71,0x71,0x65,0x25, + + 0xE1,0x50,0x85,0x85,0xB0,0x32,0x35,0x56,0xC4,0xAF,0x95,0xA5,0xF0,0x72,0x43,0x40, + + 0x85,0xEF,0x8D,0x95,0xB1,0x33,0xDD,0x95,0x96,0x48,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x1C,0x8D, + + 0xF5,0x95,0x86,0x8C,0x38,0x38,0xDD,0xAC,0x28,0x14,0x96,0xAC,0x78,0x78,0xDE,0x87, + + 0xAD,0xB6,0x8E,0x9C,0x39,0x39,0xDE,0xE0,0x38,0x54,0x9E,0xBC,0x79,0x79,0x90,0x76, + + 0x49,0x99,0x87,0x8D,0xB8,0x3A,0x4E,0x2F,0xAE,0x97,0x97,0xAD,0xF8,0x7A,0xAB,0xE2, + + 0x0A,0x5A,0x8F,0x9D,0xB9,0x3B,0xE4,0x9E,0x48,0xA4,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x8C,0x40, + + 0x87,0x80,0x17,0xA2,0x10,0x49,0x0A,0xC0,0xC6,0x83,0xB0,0x26,0x54,0xE0,0x40,0xD0, + + 0x83,0x74,0xAA,0x92,0x1A,0xF5,0xB8,0xE2,0x33,0x3C,0xB8,0x36,0x55,0xE1,0x7F,0x14, + + 0x8C,0x82,0x0C,0x41,0x3E,0x59,0xB9,0xC1,0x68,0xCD,0xB1,0x27,0xD4,0xE2,0xB9,0xFB, + + 0xC5,0xCE,0x39,0x17,0x95,0xA3,0xD5,0xA8,0xC4,0x43,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x8E,0xE2, + + 0x33,0x4E,0xA2,0x0E,0x1C,0xA8,0x8D,0xB1,0xB3,0x89,0xB2,0x2E,0x5C,0xE8,0x18,0xE1, + + 0x0B,0x71,0xAA,0x1E,0x1D,0xA9,0xAA,0x25,0xC9,0x1D,0xBA,0x3E,0x5D,0xE9,0x61,0x18, + + 0xB1,0x85,0xA3,0x0F,0x9C,0xAA,0x9F,0x50,0x12,0x35,0xB3,0x2F,0xDC,0xEA,0xE6,0x3F, + + 0x0F,0xC3,0xAB,0x1F,0x9D,0xAB,0x9F,0x54,0xEC,0x0B,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x88,0xFC, + + 0x45,0x94,0xA4,0x86,0x34,0xB0,0xA4,0x65,0x8D,0xAA,0xB4,0xA6,0x74,0xF0,0x80,0xE0, + + 0xFB,0x6E,0xAC,0x96,0x35,0xB1,0x45,0xC3,0x72,0xC7,0xBC,0xB6,0x75,0xF1,0x47,0x81, + + 0xA7,0x82,0xA5,0x87,0xB4,0xB2,0x53,0xD7,0x87,0xD6,0xB5,0xA7,0xF4,0xF2,0x17,0x0D, + + 0x52,0xD2,0xAD,0x97,0xB5,0xB3,0xAD,0x31,0xE4,0xAB,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0xB6,0x08, + + 0x0E,0xF8,0xA6,0x8E,0x3C,0xB8,0x6C,0xAF,0xCF,0xDE,0xB6,0xAE,0x7C,0xF8,0x51,0x18, + + 0x0F,0xF9,0xAE,0x9E,0x3D,0xB9,0xAE,0x38,0xB0,0x56,0xBE,0xBE,0x7D,0xF9,0x1D,0x69, + + 0x8E,0x65,0xA7,0x8F,0xBC,0xBA,0x3F,0xE7,0x0D,0xD5,0xB7,0xAF,0xFC,0xFA,0x75,0x9A, + + 0x0E,0xDA,0xAF,0x9F,0xBD,0xBB,0x05,0x59,0x71,0x71,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x83,0x1F,0xA8,0x21, + + 0x85,0xC1,0x2C,0xA1,0xC5,0x43,0x3B,0xC6,0xE5,0xFF,0xCB,0x24,0x6F,0x40,0x32,0xF8, + + 0xEC,0x4E,0x6B,0xF3,0xE4,0x13,0x55,0xB2,0xDC,0x25,0xCA,0x36,0xE6,0x23,0xA9,0x30, + + 0x05,0x83,0x2A,0xCF,0x2B,0x19,0x48,0x8F,0xC6,0x21,0x83,0xA2,0x6B,0xFF,0x08,0xF7, + + 0xB2,0xAC,0x75,0xFD,0xC0,0x6E,0x21,0xD9,0x90,0x01,0x9D,0xAF,0x22,0xE9,0x80,0xE4, + + 0xAB,0x02,0x3B,0xA6,0xBE,0x29,0x30,0x24,0x55,0x4B,0xD6,0xE0,0x74,0x0B,0x74,0xD2, + + 0x0A,0x41,0x82,0xAF,0xB0,0x23,0x87,0x92,0xEF,0xCE,0x08,0x93,0xD1,0x2D,0x4D,0xBA, + + 0x84,0x45,0x8B,0xAA,0x31,0x2B,0x31,0x25,0xE3,0xCD,0xB1,0x21,0xCA,0x24,0x71,0x01, + + 0x87,0x08,0x41,0x65,0x72,0x28,0xA6,0x93,0x41,0x44,0xDE,0xF1,0xF5,0x08,0xFA,0xE0, + + 0xC2,0xC3,0x79,0x04,0xBD,0xD7,0xC6,0xE1,0xCA,0x74,0x14,0x4C,0x1C,0xF5,0x53,0x8F, + + 0xEE,0x12,0x6D,0x62,0x78,0x2D,0x3A,0x1E,0xE8,0x40,0x0F,0xCC,0xC9,0x98,0x83,0x01, + + 0xEF,0x10,0x6F,0xE5,0x38,0x67,0x49,0x4B,0x3B,0x4C,0xE9,0x4D,0xDC,0x24,0xEC,0x2F, + + 0xEC,0xA6,0xF5,0xFF,0x8B,0x66,0xDB,0xBD,0xEF,0xD4,0xE5,0x3B,0x38,0xE8,0x78,0xCC, + + 0x24,0x84,0x76,0xAE,0x98,0x24,0xE7,0x0A,0x09,0xBB,0x0D,0x1C,0x5C,0x06,0xC2,0x34, + + 0x68,0x2D,0x42,0x30,0xFA,0x22,0x62,0x28,0x4F,0x42,0xE2,0x83,0x9A,0x0F,0x09,0xB2, + + 0x29,0x08,0x77,0x5D,0x39,0x28,0x2B,0xEB,0xCF,0x24,0x45,0xEF,0xDF,0x8C,0x33,0xDB, + + 0x8A,0x6D,0xAB,0x1C,0x1F,0x22,0x63,0x29,0xC3,0x40,0x1F,0xAD,0xD7,0x6C,0x05,0xFF, + + 0x87,0x51,0xDC,0x94,0xCD,0xB8,0x69,0x49,0xDE,0x3F,0xAC,0x5B,0x85,0x13,0xD1,0x8D, + + 0xC0,0xAE,0x34,0xC6,0x72,0xC1,0xED,0xD6,0x9E,0x41,0xE2,0xAC,0x84,0xF2,0xDE,0xDF, + + 0xDF,0xCE,0x9D,0x63,0x83,0x8E,0xAE,0x28,0x4F,0x49,0x6E,0xDA,0x90,0x70,0xCD,0x41, + + 0x1B,0x9E,0xD4,0x43,0x16,0x35,0xA5,0x59,0x3F,0xAF,0x68,0x46,0xED,0x32,0x4E,0xD0, + + 0x81,0x12,0x94,0x6D,0x91,0x32,0x2C,0x62,0x40,0x21,0xB4,0xA0,0x6A,0x36,0x34,0x52, + + 0x22,0x78,0x9C,0xD9,0x90,0x33,0x3C,0xB4,0x42,0xDE,0x18,0x54,0xD2,0xB5,0xCD,0xF1, + + 0xC1,0x36,0x95,0x5C,0x11,0x30,0x6D,0x31,0x1C,0x59,0x05,0x8B,0x0F,0x1A,0x35,0x53, + + 0xA2,0x72,0x9D,0xE0,0x10,0x31,0x55,0x13,0x4F,0xDC,0xBD,0xB1,0xAB,0x35,0x66,0xC3, + + 0x6E,0x17,0xA6,0x02,0x99,0xB4,0xEE,0xA0,0x95,0x17,0xF6,0xE8,0xB4,0xF5,0x6E,0xD7, + + 0xF9,0x16,0x23,0x8E,0x9A,0x3F,0x24,0x5E,0x79,0xA4,0xA6,0x6C,0x82,0x76,0xAF,0xB1, + + 0x2D,0x6B,0xCD,0x90,0xF8,0x3C,0x28,0x56,0xDB,0xEC,0xEF,0x2F,0xF1,0xA7,0x6F,0x9B, + + 0xF2,0x16,0xAF,0x13,0x18,0xB1,0xE7,0x3B,0x69,0xDE,0xFF,0xFC,0x5E,0x76,0x7C,0x2A, + + 0xA8,0x14,0xCA,0xA2,0x9B,0xB6,0xD2,0x0A,0xE8,0x14,0x06,0x82,0x5E,0xD1,0xBE,0xBA, + + 0x68,0xED,0xF3,0x58,0x1D,0x10,0xD6,0x2C,0xC8,0x5B,0x96,0xF9,0x9A,0x79,0xB3,0x2B, + + 0x28,0x16,0xB8,0x2F,0x38,0x16,0x9E,0x9B,0x49,0x58,0x4A,0xAA,0x38,0xDE,0x45,0xF9, + + 0x08,0x19,0xAF,0x99,0xBF,0x32,0xD7,0xFB,0x4A,0xD5,0x5D,0x8E,0xC6,0xFE,0xBA,0x45, + + 0xC6,0xC3,0xBA,0x04,0xDE,0xAF,0x10,0x33,0xC9,0xA3,0x1D,0xD5,0xD8,0x7D,0xE8,0xD6, + + 0x98,0x0C,0xA9,0x69,0xB2,0xA7,0x45,0xDB,0x1C,0xAE,0x52,0x16,0x69,0x41,0x69,0x07, + + 0xE3,0xC1,0xA9,0x16,0x61,0xED,0x9A,0x86,0x11,0xDC,0xC9,0x3A,0x2A,0x62,0x49,0x58, + + 0x77,0x8C,0x89,0x80,0x34,0x29,0x82,0xBA,0x6A,0xC5,0x83,0xB5,0x48,0xA7,0x58,0x12, + + 0x02,0x8B,0xEA,0x42,0xB5,0x2F,0x10,0x26,0x7F,0x4F,0xC8,0x72,0xD4,0xAC,0x08,0x12, + + 0x01,0x88,0xA2,0xAD,0x11,0xC6,0x63,0x90,0xC5,0x8D,0x47,0x24,0x59,0x87,0x59,0x13, + + 0xC6,0x89,0xE5,0xC3,0xB8,0x2E,0x75,0x81,0x44,0x8E,0xF5,0xE3,0xF0,0xBB,0x63,0x52, + + 0x24,0xE2,0xF1,0x07,0x96,0xA8,0xEC,0x91,0xE3,0xC1,0x3D,0xA7,0xDF,0xE4,0x1C,0x6F, + + 0x6C,0x57,0x25,0x8C,0x81,0xEC,0x12,0x09,0xED,0xC1,0xCA,0xBF,0x79,0x1D,0x52,0x28, + + 0xF2,0x92,0x92,0xF6,0xC4,0xE6,0x1A,0x2B,0xC0,0xAA,0x26,0xC6,0x5D,0xAB,0xDC,0x78, + + 0xA9,0x7E,0xDB,0x8D,0x1C,0x3C,0xF3,0xAF,0xEA,0x55,0x2B,0xD3,0xDC,0x5F,0xD7,0x68, + + 0x2E,0xC4,0x13,0xE0,0xDE,0xA4,0x90,0x9E,0x18,0xD5,0xBF,0x8C,0x20,0x4A,0x5A,0x1A, + + 0x2E,0x83,0xDA,0x9E,0xA1,0xA3,0xFA,0x12,0xAF,0xC3,0xCA,0x7A,0xDC,0xA4,0x0A,0x1A, + + 0x09,0x80,0xEE,0xBC,0x9D,0xAE,0xAA,0xA1,0xCD,0x85,0x9A,0x3A,0x19,0xE0,0x5B,0x1B, + + 0x8F,0x81,0x83,0x0B,0x52,0x25,0x13,0x2F,0xF7,0x8C,0xF5,0xEB,0xF8,0xB3,0x61,0x5F, + + 0x2C,0x82,0xED,0x2D,0x3C,0xA9,0x5F,0x19,0x8C,0x70,0x04,0xDF,0x7E,0x2F,0x0E,0x52, + + 0x78,0x96,0x23,0x96,0xB6,0xCC,0x0C,0xC2,0x62,0x92,0xFE,0x5D,0xD7,0xF6,0x0C,0xCE, + + 0x84,0xF3,0x49,0xF4,0xF4,0x3B,0x90,0x17,0xB0,0xB2,0xC3,0x54,0xF7,0xD9,0x88,0x98, + + 0x07,0x94,0x83,0x65,0x36,0xB6,0xE5,0x59,0x64,0x72,0xB9,0x51,0x55,0x78,0xCD,0xAA, + + 0x85,0x22,0x2A,0x87,0x37,0xCF,0x96,0x79,0x5E,0xE8,0x46,0xD5,0xB6,0x4C,0x6C,0x60, + + 0xD7,0x9B,0xAE,0x3D,0x95,0xB2,0xAB,0x00,0xCA,0xD9,0x09,0xA1,0x78,0x0B,0x64,0x47, + + 0xDA,0x9A,0x93,0x34,0xB5,0xFD,0x74,0x76,0xC6,0x5F,0x43,0xC7,0xD6,0x74,0xD1,0xB8, + + 0x05,0x90,0x6D,0xD3,0x17,0x3C,0x3F,0x1D,0x45,0xD0,0x65,0x63,0xDB,0x98,0x0D,0x97, + + 0x2F,0x9A,0x6C,0xB5,0xF4,0x08,0x80,0x11,0x46,0x5D,0xFE,0x04,0x73,0x7A,0xA6,0xAB, + + 0xF1,0x9E,0x04,0x6C,0xBE,0xBC,0x06,0x4D,0x99,0xEA,0xCE,0x2C,0x75,0x45,0x83,0x9D, + + 0x8E,0x9F,0xAC,0x1C,0xA0,0x5D,0x06,0xDA,0x6B,0x9B,0xB2,0x5D,0x7B,0xBA,0x07,0x01, + + 0x0D,0x9C,0x42,0xED,0xFF,0x4A,0xCB,0x29,0x6C,0xBF,0x77,0x0B,0x53,0xFC,0x0F,0x10, + + 0x0C,0x80,0xD7,0xED,0x42,0x46,0xEF,0x41,0x6D,0x7B,0x83,0x3D,0xF4,0x54,0x6C,0xCB, + + 0x8D,0x9A,0x9E,0x4C,0x3B,0x6C,0x09,0x08,0xC2,0xD1,0xA4,0xBF,0x95,0x98,0x4E,0x38, + + 0xAD,0xD5,0x8E,0x9A,0x37,0xFF,0x34,0x25,0xCC,0xDB,0xFA,0x79,0x80,0x70,0xEF,0xC9, + + 0x0F,0x16,0xDF,0x1F,0x45,0xB1,0x3D,0x54,0x4D,0xD3,0xCD,0x68,0x09,0x75,0xA5,0x2B, + + 0xA3,0x90,0x3F,0x38,0x3D,0xF7,0x77,0x7F,0x4E,0x55,0x80,0x84,0x72,0x59,0x9D,0xC0, + + 0x4E,0x42,0xE0,0xA4,0xA4,0x2D,0x83,0x3A,0x38,0xE0,0xE8,0xA6,0x55,0x9B,0x1F,0x94, + + 0x2F,0x58,0xF0,0x96,0x33,0x83,0x66,0x94,0xAA,0x22,0x43,0x24,0xF2,0x67,0xD5,0x58, + + 0xE3,0x03,0xCB,0xE7,0xD1,0xC2,0x45,0x23,0x51,0xCF,0xAB,0xC7,0x52,0x2A,0xC9,0xB4, + + 0xD8,0xAE,0xD3,0x14,0x32,0x25,0xC2,0x62,0xBE,0x94,0x11,0x37,0x70,0xE9,0x1A,0x2E, + + 0x7A,0xAB,0x56,0x48,0x14,0xCD,0x2F,0x9D,0x4A,0x06,0xC8,0x71,0xD0,0x4C,0x36,0x57, + + 0xA2,0x7A,0xCE,0x7C,0xEE,0xA9,0x99,0x12,0xA1,0x76,0xA0,0xCB,0xAC,0x05,0xE1,0x33, + + 0xE0,0xAA,0x25,0x65,0x33,0x66,0x59,0xBD,0x40,0x33,0xAE,0x07,0x93,0x26,0xE5,0x2B, + + 0x1D,0x98,0x0D,0x85,0xDF,0x26,0x19,0x56,0x62,0xC0,0x06,0x8A,0xF7,0xBA,0x9F,0x31, + + 0x68,0x09,0xD2,0x89,0x7B,0xC8,0xCF,0x10,0x33,0xB7,0x7D,0xCE,0xDA,0x8B,0x2A,0x7F, + + 0x2D,0x84,0xD0,0x19,0xBA,0x2F,0x1D,0x88,0xA8,0xE6,0xE2,0x5E,0x18,0x49,0xC3,0xAC, + + 0xBD,0xBA,0xFB,0x8F,0xBA,0xBA,0xD3,0xF9,0x72,0x49,0x47,0x4F,0x9B,0x15,0x75,0x64, + + 0xAB,0xBB,0x03,0xC0,0x38,0xA3,0x4F,0xD1,0xDB,0x06,0xE3,0x5F,0x98,0x2B,0x18,0x27, + + 0x72,0xA3,0xFA,0x48,0x52,0x1D,0x06,0x65,0xE6,0x41,0x45,0x93,0x7E,0x97,0x34,0x5F, + + 0xFA,0x02,0xC6,0xB7,0x1D,0x6E,0x62,0x08,0x1A,0x44,0xBA,0x38,0x15,0x60,0xE3,0x3B, + + 0xE8,0xA2,0xAD,0x78,0x27,0x28,0x21,0xD8,0x8E,0x2B,0xC9,0xE9,0xD5,0x8F,0x4C,0xA9, + + 0x87,0xFE,0x72,0xDF,0x92,0x90,0xDB,0x7B,0x3C,0x0E,0x24,0x2F,0x98,0x9F,0xA0,0x04, + + 0x60,0x26,0x44,0x20,0xEB,0x36,0x87,0x53,0xE4,0xDD,0xEC,0xD6,0x8F,0x32,0x2B,0xAC, + + 0xF1,0xA0,0xEC,0xD0,0x26,0x3E,0xA3,0x52,0x29,0x72,0x1C,0x70,0xEF,0xAA,0xA2,0x21, + + 0x74,0xE3,0x0D,0x51,0x51,0x3D,0x47,0xF2,0x0B,0x36,0x59,0xD6,0x11,0x8D,0x37,0x62, + + 0x8B,0xBE,0xED,0xD1,0xDE,0xB8,0x3D,0xEE,0x00,0xFC,0xBD,0x48,0x75,0x75,0x44,0x38, + + 0xA1,0x99,0x3F,0x26,0xB0,0x1C,0xB9,0x67,0x95,0xDF,0x6B,0x84,0x34,0x75,0x15,0xC3, + + 0x44,0x0D,0xB4,0x29,0xCC,0x98,0x66,0x40,0xE3,0xFA,0x98,0x87,0x1F,0x19,0xBA,0x45, + + 0xAA,0x85,0xBA,0xA7,0xF1,0xE9,0x55,0xDC,0x09,0x12,0xD0,0xC0,0xF4,0xDC,0x2D,0xFE, + + 0xA1,0x1A,0xDC,0x05,0x00,0x3E,0xF9,0x8F,0x40,0xAA,0xBF,0xF1,0xF0,0xF7,0x52,0xCF, + + 0xE2,0x61,0x13,0x6E,0xBA,0x31,0x42,0x40,0x7A,0x15,0x3C,0x85,0x1B,0x7C,0x44,0x99, + + 0xD6,0xE4,0x84,0x94,0x9A,0x34,0xF9,0x78,0x3D,0x1B,0xA0,0xC4,0xDA,0xC2,0x4F,0x28, + + 0x41,0x19,0x10,0xEF,0xFB,0xD6,0xE8,0xDA,0xC2,0x36,0xEF,0x2F,0x31,0x07,0x0D,0x76, + + 0xCA,0xE4,0xC5,0x77,0x1A,0x3D,0xCB,0xA5,0xEF,0x38,0x9B,0xC6,0x74,0xFD,0xB9,0xB8, + + 0x6F,0x17,0xC2,0xD1,0xD3,0x6D,0x0E,0x86,0x4E,0xD1,0xD0,0xD9,0xFA,0x02,0x76,0x26, + + 0xD6,0xC4,0x49,0xC1,0xD2,0x0C,0x20,0xD4,0x80,0x2C,0x67,0x00,0xFB,0x86,0xCE,0x4B, + + 0x16,0x5C,0x8D,0x27,0x9B,0x7E,0x29,0xC1,0x01,0x6F,0x17,0xB5,0x6D,0x7A,0xB0,0x5B, + + 0x17,0x9D,0x85,0x37,0x9A,0xAF,0x3F,0xBD,0xE6,0x52,0x51,0x05,0x47,0xC4,0x23,0x80, + + 0xC9,0x4C,0xA4,0xE4,0x96,0xA3,0xCF,0x51,0x6E,0xAC,0xC8,0xDB,0xE3,0xA2,0x20,0x17, + + 0x6E,0x78,0xD0,0x94,0x37,0x01,0xEC,0x2E,0xC8,0x47,0xAA,0x44,0xF6,0x84,0x19,0x44, + + 0x46,0x20,0x14,0x65,0xD5,0xAA,0xD6,0xE3,0xC1,0x80,0x7D,0x12,0x56,0x01,0x2D,0xB3, + + 0x83,0x69,0x91,0x47,0x85,0xAC,0x7F,0xF3,0x8D,0x81,0xE3,0xC8,0x76,0x86,0x9F,0x30, + + 0x70,0x5B,0x20,0xE2,0xA3,0x0F,0x10,0x61,0x47,0x4F,0x60,0x14,0xBD,0x05,0x14,0x21, + + 0x7E,0x8A,0x0C,0xF6,0xB6,0xE5,0x2C,0x90,0xEB,0x4E,0x07,0x94,0xB6,0xE3,0x41,0xF4, + + 0x04,0x2A,0x77,0x4B,0x90,0x4F,0x24,0x81,0x6A,0x4D,0x91,0x65,0xD7,0x6D,0x30,0xAE, + + 0x62,0x78,0xEF,0x7B,0x6A,0x2B,0x2F,0x91,0x6B,0x4C,0xD9,0x22,0x74,0xA5,0xE2,0x6F, + + 0x83,0x75,0x16,0xFE,0x40,0xA7,0xE6,0x06,0xCC,0x8A,0xE8,0x3B,0xFF,0x8D,0x38,0x8A, + + 0xE6,0xCD,0xE0,0xFC,0xBE,0xAF,0x72,0xBA,0xB9,0xAA,0xEA,0x1A,0xBC,0xE6,0x35,0x69, + + 0xE4,0x87,0xC3,0xAF,0x80,0xA7,0x8C,0x6C,0x0E,0xBB,0xE9,0xD0,0x7F,0xEC,0x11,0xAB, + + 0xC4,0x24,0xFB,0x9E,0xFE,0x19,0x3D,0x9E,0xAE,0x45,0xDB,0x7F,0xCC,0x6B,0xA2,0x17, + + 0x71,0x97,0x26,0x9E,0x52,0xAF,0x79,0x88,0xE2,0x47,0x26,0xF6,0x58,0xCC,0xB3,0x75, + + 0x30,0x8F,0x84,0x6B,0xA2,0xAB,0x5A,0x98,0x30,0x8F,0x4F,0x83,0x5D,0x56,0x64,0x34, + + 0x29,0xCF,0xDB,0x4B,0xD6,0xDF,0xF3,0x89,0x62,0x45,0xA0,0x29,0xC6,0x35,0x35,0xEA, + + 0x87,0x34,0xE7,0xB4,0x3E,0x25,0xBC,0x04,0x4D,0x47,0x8E,0xFB,0x82,0x03,0x32,0x23, + + 0x22,0xF3,0x72,0x23,0x95,0x3A,0xA5,0x51,0xE8,0x2D,0x32,0x66,0x79,0x04,0xB1,0xA2, + + 0xDA,0xD3,0xB4,0xE4,0x96,0xD4,0x05,0x96,0xE7,0xD9,0x84,0x4C,0x16,0xC0,0x7F,0xF0, + + 0x8E,0x33,0x4A,0x65,0x36,0xFA,0x4D,0xB2,0xCE,0xD6,0x15,0xB9,0x78,0x97,0xF9,0x63, + + 0x59,0x90,0xD5,0x15,0xB0,0x69,0xF9,0xD1,0xA6,0x6C,0xAA,0x44,0x71,0x7E,0x5C,0xBF, + + 0x05,0xE7,0xDE,0x38,0xDF,0xC5,0x3E,0x1C,0xC5,0xD2,0xB4,0x0B,0xCC,0xB6,0x93,0xA2, + + 0x2A,0x9E,0x37,0xD3,0xB7,0xD5,0x03,0x10,0xE5,0xFD,0xFC,0xD2,0x71,0x7C,0x05,0xEC, + + 0xAC,0x9B,0xAF,0x2D,0x97,0x56,0x79,0x0D,0x47,0x5C,0x7E,0xDF,0xF0,0xEF,0xBD,0x51, + + 0x1B,0xF5,0x32,0x28,0x93,0x4A,0x00,0x91,0xA6,0x97,0x44,0x0A,0x90,0x2C,0x95,0xB7, + + 0xD4,0x49,0xA4,0x6C,0x90,0xB5,0x4E,0xC8,0x2F,0xA7,0xE4,0xF8,0x97,0x9C,0xEE,0x8A, + + 0x70,0x6D,0x26,0x72,0x5E,0x99,0xC3,0x58,0xEF,0xDA,0x1D,0xB9,0xD1,0x9C,0x14,0xB2, + + 0x9F,0xBA,0xAD,0x8B,0x1F,0xBC,0xF7,0x0E,0xCD,0x50,0x8C,0x4D,0x20,0xBE,0x7F,0x85, + + 0xD1,0x2F,0xD7,0x1D,0xB8,0x80,0x7F,0x4B,0xB1,0xD4,0x87,0x8E,0x5C,0x64,0x5E,0x34, + + 0xD3,0x45,0xFC,0xCA,0x1F,0xDC,0x0E,0x68,0x67,0x03,0x76,0xEA,0x79,0xB8,0x56,0xA7, + + 0x0C,0xFC,0xE2,0x35,0x9E,0x35,0x1E,0xBB,0x94,0xD0,0xFE,0xFE,0x7F,0xFD,0x98,0x49, + + 0x12,0x3C,0x58,0x2F,0xF2,0xB8,0x4F,0x3B,0x15,0xD1,0xF7,0xEF,0xFE,0xFE,0x36,0xC8, + + 0x5A,0x50,0x6F,0x3D,0x4A,0x30,0x75,0xFF,0x4C,0x74,0xFF,0xFF,0xFF,0xFF,0xA8,0x3D, + + 0xE1,0x06,0x96,0x66,0x78,0x2D,0xF0,0xB9,0x37,0x1C,0x77,0x46,0x13,0x90,0x26,0x7E, + + 0xA2,0x07,0xE8,0x16,0x12,0x2C,0x47,0xCF,0x47,0xCB,0x1F,0xC5,0xF2,0x60,0x2C,0xAF, + + 0x23,0x04,0xE1,0x4B,0x7E,0x2D,0xCE,0xC4,0xFF,0xD1,0x89,0x39,0x71,0xE8,0x24,0xE0, + + 0x22,0xD8,0xC3,0x57,0x50,0x41,0x6C,0xCD,0x58,0xB8,0xAB,0xDC,0xD2,0x0C,0x20,0x42, + + 0xA2,0x09,0x35,0xA6,0x90,0x18,0x68,0xB0,0x1C,0xEB,0xA9,0x16,0x69,0x80,0x36,0x68, + + 0x63,0x85,0x31,0xB6,0xBF,0x2A,0x98,0x57,0xE2,0xCF,0x9D,0x93,0xD1,0x61,0xBE,0x13, + + 0xC1,0xF6,0x0D,0xA7,0x10,0x3A,0x09,0x03,0xEC,0x00,0x2D,0x0F,0xBA,0x6B,0xB4,0x23, + + 0xAD,0x58,0xA9,0x57,0xE6,0x2A,0x9E,0x82,0xE8,0x4A,0xD4,0x17,0x24,0x61,0xAB,0xF5, + + 0x91,0x73,0x46,0xDC,0x14,0x33,0xEB,0xC5,0x3A,0xF3,0xAC,0xCE,0x42,0x07,0x40,0xB3, + + 0xE8,0xA6,0x92,0x00,0x5B,0x20,0xC1,0x76,0x36,0x5E,0x9B,0xCC,0xD8,0x26,0xCA,0xF0, + + 0x77,0x48,0x71,0xEB,0x3D,0xA8,0xEC,0xAD,0x8B,0x7D,0xCA,0x64,0x39,0x25,0x95,0x5F, + + 0xDB,0x45,0x4B,0x2D,0x9D,0x20,0xC6,0x24,0x28,0xF4,0xFB,0x3F,0x07,0x66,0xED,0x27, + + 0xD7,0xD3,0xD2,0x3B,0x78,0x37,0xE2,0x1B,0xCC,0xFC,0xF2,0x24,0xFB,0xD3,0xE6,0xDD, + + 0xDE,0x6F,0xA8,0x44,0x18,0x5C,0x24,0x1D,0x78,0x95,0xE5,0x74,0xFC,0x6B,0x83,0xEC, + + 0xFD,0xD2,0x82,0x2B,0x65,0x40,0xE7,0x0B,0x89,0xBE,0x68,0x85,0xA4,0x21,0x22,0xB2, + + 0x09,0x53,0x74,0x1A,0x51,0x46,0x01,0x7B,0x6C,0xE2,0xFB,0x30,0x7A,0xB0,0x5D,0x1C, + + 0x43,0x70,0xBC,0x54,0x6C,0x36,0x76,0xB4,0x61,0x30,0xDC,0xAD,0x8D,0xF1,0x86,0x68, + + 0xA1,0xAA,0xD4,0x91,0x52,0xB1,0x0F,0xA0,0x9E,0xDD,0x4F,0x3C,0xD6,0x6A,0xFD,0x7D, + + 0x28,0xE9,0x28,0x79,0x13,0x3F,0x4B,0x99,0xA4,0xFF,0xD5,0xAD,0x57,0xFF,0x04,0x7C, + + 0xE1,0x51,0xF5,0x17,0x31,0x19,0x57,0x53,0xD2,0x2B,0x12,0xD3,0x06,0x63,0x62,0xB3, + + 0x52,0x95,0xDD,0x46,0xBA,0x74,0xD3,0xF3,0x49,0x2D,0xB4,0xB2,0x54,0x7B,0xB7,0x38, + + 0x3A,0x58,0xEC,0xA8,0x92,0x56,0x00,0xB0,0x3F,0xF1,0xBC,0xA2,0xB7,0x7A,0x47,0x3E, + + 0x43,0x75,0x05,0xD5,0x67,0x30,0x6B,0x01,0x6D,0xF0,0xB5,0xE7,0xDB,0x7B,0x36,0xD9, + + 0x06,0xA8,0x2D,0xD5,0x5A,0x7E,0x05,0x9C,0x63,0x07,0x75,0xCA,0x76,0x15,0x8D,0xB0, + + 0x5F,0x3C,0xBE,0x64,0x4F,0x77,0xEE,0x2A,0xE8,0xA0,0x2E,0x53,0xF5,0x63,0x34,0x63, + + 0x2F,0x93,0x01,0x74,0xE5,0xF2,0x1C,0x50,0x83,0x16,0x26,0x22,0x7A,0xD9,0xD8,0xD1, + + 0x97,0x91,0xBD,0x72,0xBE,0xBB,0x2F,0xFB,0xAB,0xAA,0x1E,0xCB,0x26,0x68,0x7A,0x1D, + + 0xCC,0x08,0x8F,0x95,0xDE,0x33,0xA7,0x47,0x88,0x7B,0x24,0x5B,0xE9,0x86,0x86,0x6D, + + 0x5D,0xC0,0xE0,0xA9,0x99,0xB9,0x68,0x85,0xE5,0xDA,0x16,0xA9,0x3A,0xF1,0x27,0x33, + + 0xD4,0x1B,0xD0,0x8D,0x5A,0x34,0xC3,0xF5,0x82,0x56,0x26,0x0F,0x4A,0x7B,0xEB,0x4C, + + 0x7F,0x7C,0xE1,0x2F,0xDB,0x91,0xD2,0xA9,0xE6,0xF5,0xA9,0x91,0xC9,0xBE,0x62,0x30, + + 0x5E,0x10,0x4A,0x1A,0x52,0x96,0xF3,0x6A,0xC0,0x57,0xFF,0x29,0x5A,0xF5,0xA3,0xC4, + + 0x1C,0x9B,0xE6,0xEE,0xF2,0x2B,0xF0,0xF2,0xFE,0x1B,0x9A,0xF6,0x08,0xE9,0xD0,0x1A, + + 0xA2,0x2E,0xF1,0xA0,0x76,0xFB,0xBF,0x40,0xBE,0x83,0xAE,0x54,0x6E,0xB9,0x54,0xE5, + + 0xB7,0x65,0x7A,0xE1,0x14,0x00,0x9A,0xDE,0xE1,0xB9,0xB2,0x45,0x97,0xED,0x64,0xFB, + + 0x47,0x4C,0x51,0x15,0xC1,0xB8,0x73,0x98,0x47,0xC7,0x45,0x45,0xFB,0xD1,0x94,0xC6, + + 0x28,0x20,0xA8,0x77,0xB7,0x2C,0x28,0x53,0x6D,0x6B,0x90,0x64,0x43,0xE9,0x69,0x34, + + 0xFC,0x79,0x37,0x03,0x6C,0xB2,0x68,0x6B,0x57,0x6A,0x00,0x0D,0x47,0xAA,0x38,0x1E, + + 0x23,0x19,0xC1,0xA5,0xE1,0xA2,0xE9,0x8B,0xD4,0x89,0x8E,0x19,0xE5,0xAE,0xD4,0x0C, + + 0x52,0xDA,0x29,0x0A,0x5A,0x5A,0x21,0x01,0x2C,0xEC,0x99,0x75,0x80,0xEA,0x5C,0xD2, + + 0x89,0x4A,0x50,0xFE,0x7A,0xE7,0xBD,0x48,0x0F,0x38,0x4E,0xC6,0x80,0x25,0x6E,0x5C, + + 0x41,0xC5,0x5C,0x7C,0x2E,0x6E,0x64,0x02,0x45,0xCD,0x56,0xD6,0x5E,0xA4,0x7A,0xB1, + + 0x2B,0xC6,0x83,0x1A,0x1E,0xF6,0x4D,0x13,0xEF,0x6A,0x48,0x27,0x39,0x15,0xAF,0xF3, + + 0x85,0xC4,0x53,0x9D,0x1D,0x11,0xBA,0x48,0xBD,0xA5,0x5C,0xB7,0x78,0x3D,0xC9,0xCE, + + 0x20,0x57,0x98,0x5E,0x9C,0xA8,0x2B,0x36,0xE9,0xCA,0x92,0x38,0x7C,0xE3,0xAE,0x90, + + 0xB4,0x8B,0xB1,0x5E,0x60,0xB5,0xBE,0xFF,0x0C,0x3F,0x9A,0x28,0x75,0xE2,0xC8,0x0C, + + 0x80,0x52,0x1C,0xAD,0xE5,0x34,0x53,0x17,0x6F,0x31,0x93,0x6D,0x81,0xE3,0x46,0xD5, + + 0x89,0xEC,0x30,0x5D,0x99,0xE5,0x05,0x16,0xEF,0x8D,0x9B,0x7D,0xFE,0xE2,0xE4,0x46, + + 0x71,0x96,0xC4,0x84,0xE2,0xBD,0x2C,0x32,0x8D,0x41,0x4C,0x4E,0xA8,0x3D,0xE8,0x42, + + 0x5B,0xF3,0x94,0x46,0x69,0x1A,0xE8,0x48,0x90,0xBF,0xDC,0xFD,0x1A,0x6C,0x05,0xDA, + + 0x05,0xF0,0xEF,0x9A,0x95,0x62,0x27,0xA2,0x1F,0x5F,0xCE,0xAF,0x11,0x4D,0xCD,0x02, + + 0x27,0x97,0xD5,0xB7,0x55,0x88,0x5A,0xC9,0x84,0xD7,0xC5,0x90,0x0C,0xFC,0xD0,0xBD, + + 0x85,0x4F,0x86,0xBC,0xDF,0x3D,0x72,0xF1,0x45,0x45,0x73,0xD6,0x3E,0xF2,0x4C,0x2B, + + 0xEC,0xEE,0x8C,0xD5,0x37,0xB8,0x6F,0x81,0x17,0x74,0x03,0x74,0xBE,0x6C,0xCB,0x3E, + + 0x63,0x0D,0x87,0xD7,0xB7,0xE6,0x55,0xE6,0x2E,0xFD,0xDB,0x1C,0x55,0xFB,0xFC,0x57, + + 0xF2,0x06,0xF5,0xD3,0xBF,0x1F,0xE0,0x63,0x0C,0x46,0x85,0x85,0xC4,0xD5,0x2D,0xE8, + + 0x6F,0x68,0xC6,0x79,0xD5,0xB7,0x4F,0x5A,0xEC,0xCE,0xEF,0xF3,0xFE,0xA4,0x0E,0xC6, + + 0x8C,0xFB,0x94,0x78,0x2D,0x32,0x81,0x5C,0xEF,0xDD,0xE7,0xF7,0xFF,0xA5,0x7E,0x2C, + + 0x0B,0x9C,0xE2,0x78,0x8F,0x42,0x3F,0xBB,0xDF,0x7D,0x19,0x2B,0xD2,0x7A,0xEB,0x4B, + + 0xD3,0xF9,0xF7,0x79,0x3F,0xBF,0x77,0xD9,0xAE,0x2B,0xC9,0x3B,0xD3,0x7B,0xBD,0x94, + + 0x51,0xBD,0xC6,0x38,0xD7,0xD5,0x50,0x87,0xCD,0x58,0x0E,0x91,0x15,0xF3,0xB3,0x46, + + 0x29,0x45,0x12,0xB4,0x57,0xB0,0x66,0xAA,0x69,0xD4,0x86,0x7A,0x74,0x22,0x3C,0xC9, + + 0xD5,0x79,0x9E,0xBD,0x85,0x1A,0x2E,0xFB,0x49,0x9C,0x20,0xDD,0x01,0x2B,0x7C,0x59, + + 0x2F,0xD6,0xAA,0x38,0x56,0xF6,0x7F,0x89,0x6D,0xE3,0x9F,0xBF,0x11,0x74,0x04,0xE2, + + 0x82,0x08,0xF8,0x86,0x90,0xFB,0xA4,0x42,0xAB,0x31,0xB3,0xD2,0x63,0x46,0xB9,0x92, + + 0x23,0x61,0x0F,0xFC,0x17,0x6E,0xC3,0x30,0x47,0x0B,0x59,0xB6,0xD1,0xAA,0xF4,0x73, + + 0x23,0x4E,0xB9,0xFA,0x51,0xA8,0xB9,0x3C,0xBF,0xCB,0x6B,0x63,0x9E,0x2E,0x71,0x93, + + 0x01,0xB8,0x31,0x52,0x53,0x83,0xB9,0xD9,0x95,0xEE,0xA1,0xDD,0x05,0xAC,0x48,0x50, + + 0xEB,0xBD,0x9F,0xB4,0x1E,0x6B,0xD1,0x47,0xE3,0x4D,0x00,0xE0,0x5D,0x85,0x66,0xAE, + + 0xA0,0x1E,0xB0,0xD0,0x22,0x25,0x02,0x71,0xE0,0x04,0x50,0xE1,0xF2,0x9A,0x03,0xB7, + + 0x63,0x00,0xFB,0xC7,0x12,0xF7,0xD3,0xE3,0x5B,0x3D,0x11,0xB4,0xD8,0x60,0x0B,0xB7, + + 0x93,0x48,0x59,0x27,0x11,0x03,0x39,0x73,0xB6,0x4A,0x75,0xF0,0xF3,0x6A,0x3A,0xAD, + + 0x8E,0x78,0xCA,0x09,0x7B,0x88,0x03,0xCE,0x58,0xE5,0x28,0x6B,0x9A,0x78,0x2A,0x25, + + 0xA8,0x86,0xB2,0xCC,0x45,0x88,0xA8,0x14,0x7A,0x0D,0xFA,0x3E,0x36,0x64,0x53,0x04, + + 0x9D,0x0C,0x7B,0x8F,0x18,0xF1,0x06,0xCF,0xFB,0x6E,0xDB,0x29,0xBF,0x6B,0xF4,0x9B, + + 0x09,0xDA,0xB3,0x2C,0x38,0x30,0xA9,0x14,0xCF,0xA3,0xFB,0x73,0xFE,0x64,0x1B,0xDC, + + 0xAD,0x1C,0xC2,0xAE,0x98,0x08,0x42,0x1F,0x15,0x0E,0xEA,0xEE,0x53,0xD1,0x32,0xA4, + + 0x9A,0xF6,0x0A,0x28,0xBB,0x6F,0x09,0x81,0xF1,0xB6,0x1A,0x08,0xD4,0x90,0xBB,0xCB, + + 0x43,0x99,0x4A,0xBD,0x65,0x21,0x87,0xF1,0xCC,0x6E,0xEB,0xBD,0x21,0x61,0xC8,0xB1, + + 0xD5,0x42,0x53,0x62,0x1E,0xDA,0x1B,0x85,0x77,0x0D,0xA1,0x1D,0x60,0x69,0x1F,0xA7, + + 0x81,0xBF,0x44,0x0D,0xE6,0x72,0x88,0x9F,0x5D,0x12,0x6E,0x4C,0xE0,0xBB,0x6A,0xE8, + + 0x20,0x73,0x21,0x16,0xF8,0x3E,0x1B,0xA5,0x8A,0x89,0xE2,0x61,0xF3,0x75,0x1A,0xF2, + + 0x94,0x7E,0x12,0x76,0xB6,0x9B,0x5F,0x4A,0x01,0x53,0xB0,0xD7,0x1B,0x68,0x33,0xBC, + + 0x6B,0x8A,0xB5,0xD2,0x7B,0xAA,0xA8,0xD4,0x1A,0x57,0x8E,0xD7,0x0E,0xFC,0xFC,0x87, + + 0x2C,0xBB,0xF5,0x46,0x33,0x7B,0x14,0xDD,0x89,0x10,0xD6,0x22,0x2E,0x70,0x44,0xC4, + + 0x40,0x2A,0x7F,0x12,0x8F,0x7B,0xF8,0x92,0x94,0xDE,0xDC,0x09,0x62,0xAE,0xD4,0x86, + + 0x60,0xF6,0x9F,0xC4,0x11,0x7A,0x6F,0x51,0x5E,0xF9,0xC3,0x1C,0xA1,0xED,0x5B,0xFD, + + 0x48,0x46,0xFE,0x57,0xBA,0xD7,0xD3,0xCC,0x08,0x13,0xFD,0x71,0xF4,0x6E,0x0E,0x91, + + 0xC1,0x49,0xDF,0x15,0x9F,0x3E,0x94,0x5B,0x3D,0x2D,0x6D,0x8B,0xD9,0xA1,0x8C,0xEB, + + 0x15,0xBF,0xF6,0xBB,0xD0,0x08,0x83,0x3C,0x22,0xF9,0xBF,0xBD,0x9E,0x7F,0xEB,0x1A, + + 0xD1,0x10,0xA7,0x2D,0x51,0x2B,0x8B,0x92,0xD5,0xAF,0xCF,0x3C,0x05,0xFD,0x10,0xD9, + + 0xAD,0x57,0xF7,0xBA,0x50,0x6A,0xDF,0x04,0x4A,0x58,0xBF,0x85,0x58,0xFC,0x86,0x6D, + + 0x44,0x9E,0x9C,0xD8,0x99,0x3A,0x6C,0x58,0xEA,0xF3,0xB6,0xEF,0x3E,0x3E,0x16,0xCC, + + 0xA9,0xB1,0xC2,0xCD,0x58,0xCD,0x5C,0xE5,0x95,0x4A,0x5E,0x78,0x3B,0x59,0x3F,0x4D, + + 0x84,0xFD,0xCB,0xD9,0x19,0x38,0xF3,0x8B,0x9F,0x55,0xD5,0xB3,0x78,0x5A,0x3C,0xBB, + + 0xEB,0x10,0xB7,0x5F,0xB2,0xBF,0xE7,0x46,0x59,0x2D,0xBF,0xFE,0xBF,0x3D,0x18,0x7F, + + 0x27,0x30,0x67,0xE0,0x96,0xA4,0x3C,0xA6,0x25,0xB2,0x88,0x61,0x96,0xB0,0x78,0x93, + + 0x41,0x8C,0x5D,0xF4,0xB4,0xCD,0xA4,0x41,0xE1,0x83,0xC0,0xCA,0xC4,0x1A,0x19,0x86, + + 0x02,0xA0,0x81,0x65,0x16,0x0E,0xF1,0x6A,0x3A,0x80,0xF9,0x22,0xB7,0x6B,0x85,0x96, + + 0x8B,0xC5,0xCB,0x1B,0x96,0xC3,0x03,0x96,0x3A,0xD8,0xC2,0x18,0xF0,0x6E,0x1F,0xAF, + + 0xC0,0xC6,0x80,0x07,0xBB,0xA9,0xFF,0x35,0xBB,0xCF,0xD4,0x2A,0xAB,0xEB,0xB7,0xB8, + + 0x38,0x95,0xA0,0x41,0x74,0x25,0x40,0x92,0x0F,0x4E,0xF4,0xCC,0xD1,0xC5,0x2B,0xE8, + + 0xF1,0x6A,0xEB,0x43,0x35,0xA0,0xBB,0xE1,0x46,0x2E,0x31,0x2F,0xA0,0xA4,0x36,0x57, + + 0x81,0x0D,0x91,0xD5,0x94,0x63,0x75,0x91,0x47,0x77,0x51,0x6A,0x55,0xE3,0xA4,0x88, + + 0x8C,0xCB,0xF8,0xF1,0xBF,0x05,0xB9,0x4C,0x11,0x37,0xCD,0xAA,0x1F,0xDF,0x12,0xE9, + + 0x31,0x8F,0xA2,0x1B,0x76,0x10,0xEE,0xEA,0xCC,0x31,0xE3,0x35,0xBA,0x24,0x1B,0xF8, + + 0xB8,0xEF,0xBC,0x48,0x5E,0x55,0x0D,0x56,0x0D,0xA9,0xD3,0x2D,0x1F,0xE7,0x0B,0xF7, + + 0x2C,0x24,0x50,0x9B,0xC4,0xF5,0x31,0x9B,0x72,0x7E,0xC9,0xC0,0xD9,0x66,0x17,0x38, + + 0xE5,0x1D,0x9A,0xCC,0x1B,0xFF,0x12,0x45,0x4C,0xC1,0x69,0x0C,0x7C,0x01,0xF6,0x9A, + + 0x37,0x06,0x92,0xDA,0x72,0xF0,0x42,0x3D,0x91,0xC5,0x74,0x87,0xE5,0xAF,0x5D,0x73, + + 0x03,0x28,0xD9,0xAD,0x32,0x2E,0x8C,0xE9,0x4E,0x26,0xF9,0x93,0x5E,0x15,0x7F,0x6A, + + 0xFF,0x90,0xB5,0xF5,0xCF,0xE1,0xEF,0x09,0x30,0x44,0x74,0x28,0x22,0xE6,0x20,0x00, + + 0xA4,0x89,0xDC,0xA1,0xDD,0xC1,0xB1,0x43,0xE6,0xD4,0x12,0xAF,0x1F,0xEA,0xB2,0xF0, + + 0xDE,0x4C,0x92,0xBA,0x96,0xF3,0xF8,0x62,0x69,0xCA,0xC6,0x91,0xD6,0xEA,0x1D,0x7D, + + 0x26,0x96,0xDD,0xA7,0xEC,0xD2,0x6E,0xC1,0x25,0xB0,0x35,0x57,0x6C,0xFD,0x53,0xBB, + + 0x5C,0x3C,0xA2,0x5A,0x54,0x4C,0xFC,0x55,0x44,0x59,0x99,0xC1,0xC6,0x28,0x62,0xFA, + + 0xA6,0x9A,0x9C,0xC2,0x37,0xB4,0xAF,0xE0,0x19,0x3C,0xF6,0xCD,0xFB,0xB6,0x6D,0xB4, + + 0xA5,0x69,0x2C,0x17,0x9A,0xB3,0x27,0xDD,0x61,0x0D,0x14,0xEB,0x55,0xD5,0x3C,0xDF, + + 0x03,0x69,0x3A,0xC7,0xC1,0x36,0xA8,0x48,0x9D,0xD4,0xF7,0x5B,0xD7,0xB6,0x57,0x8C, + + 0x04,0xF2,0xE5,0x70,0xD4,0x97,0x6E,0x53,0xE7,0x45,0xFE,0xD7,0xAB,0xC7,0x33,0x2A, + + 0x30,0x58,0x66,0x4B,0xD5,0x35,0xE1,0x42,0x4C,0x97,0x4C,0xE9,0xB6,0x61,0xA9,0x82, + + 0xAF,0x9D,0xF2,0x78,0x2D,0xF6,0x0C,0x4B,0xCE,0x79,0x9E,0xA6,0x4E,0x22,0x77,0x8A, + + 0xA0,0x99,0xFE,0x3D,0x1B,0xA1,0x8F,0x5A,0x4F,0xBA,0xFF,0xBF,0x18,0x63,0x31,0xF9, + + 0x46,0xCA,0xF6,0x90,0x5A,0xA0,0x1D,0x39,0x24,0x94,0x05,0xF8,0x37,0x42,0xD9,0x28, + + 0xAB,0x1C,0x9E,0x4C,0x37,0x61,0x56,0xE7,0xEC,0xD8,0x96,0xEC,0x7F,0x77,0x43,0x37, + + 0x8C,0x9B,0x8E,0x9F,0xC6,0xB0,0x24,0xBB,0xCC,0x93,0xFE,0x7A,0x12,0xD8,0x8F,0xF4, + + 0x4F,0x98,0xDF,0x1F,0x45,0xB1,0xF9,0x89,0xCD,0xBE,0x08,0x0D,0xFA,0xE7,0x4F,0x81, + + 0x0E,0x96,0xE5,0xDB,0x1C,0x44,0x3E,0xBD,0xE7,0xC4,0x6F,0xFF,0x80,0x80,0xAD,0x7F, + + 0x9D,0x1B,0x11,0x77,0x24,0x4E,0x72,0xDD,0x42,0x9B,0x50,0xA9,0x4F,0x6A,0xB5,0x21, + + 0xA0,0xA0,0xB6,0x28,0x79,0x2C,0xC3,0x7B,0x3E,0x3F,0x20,0xA7,0x77,0xCC,0xCA,0x85, + + 0xC0,0xA9,0xE7,0xD8,0x93,0xFA,0xA4,0xA5,0x95,0xD3,0xC5,0x62,0xE3,0x7A,0x31,0x21, + + 0xAE,0xAC,0x76,0x66,0xE9,0x61,0x42,0x7A,0xBA,0xD8,0xCD,0xB1,0xCF,0x19,0xD1,0x87, + + 0xC8,0xFE,0xB8,0x63,0xFB,0x27,0x44,0x9F,0x0A,0x75,0x84,0x86,0xFE,0xC9,0x5E,0x6C, + + 0xE8,0x41,0xF6,0x7D,0xB0,0x0C,0xD8,0x11,0x1B,0xC8,0x18,0x94,0x53,0xC5,0x09,0xB9, + + 0xE1,0x99,0xB9,0xC1,0xC0,0x3F,0x45,0xBE,0x3B,0x4D,0x01,0x87,0x2E,0xB6,0x13,0xEE, + + 0xE9,0xB6,0x6C,0x26,0xE5,0x86,0x27,0x49,0x99,0x05,0xC8,0x54,0x29,0x0B,0xA2,0x7A, + + 0x6A,0x54,0x47,0x58,0x1E,0x5A,0xD2,0xD9,0x4E,0xC5,0xDA,0x39,0xB1,0x4B,0xA1,0x09, + + 0x5D,0x48,0x5C,0xBD,0xD1,0x3A,0xA2,0xC7,0xA0,0x58,0x62,0x4F,0x29,0x07,0x7D,0x0E, + + 0x8E,0x8A,0x6D,0x4D,0xDC,0x8E,0x6D,0x01,0xFB,0xCD,0x6B,0x25,0x31,0x29,0x55,0xB4, + + 0x89,0xAF,0x5B,0xED,0xC8,0xDA,0xB7,0xA6,0xC8,0x0B,0xF9,0x34,0xD8,0xDB,0x3C,0x4F, + + 0xAB,0xA3,0xFA,0xB3,0xF3,0x9F,0x11,0x4C,0xEB,0xB3,0xEC,0xB5,0x90,0xBC,0x05,0x2B, + + 0x67,0x82,0x1A,0xC3,0xEE,0x6F,0x58,0x67,0x3B,0xF9,0x62,0x82,0x4B,0x20,0xD5,0x39, + + 0xD6,0x07,0x17,0xB3,0x15,0x83,0xBF,0xFA,0xBA,0x46,0xAD,0x40,0xE9,0x05,0x53,0xF5, + + 0x6A,0xA0,0x0E,0x4B,0x9A,0x8F,0xCD,0x02,0xE8,0x92,0x24,0x3A,0x3A,0x99,0xDD,0xAF, + + 0x5B,0x1B,0xD3,0x77,0x52,0x9D,0x02,0xC2,0x00,0xC7,0xF2,0x7D,0x71,0x30,0xD7,0x3F, + + 0x27,0x69,0x8A,0xAC,0x79,0x60,0x35,0x43,0xED,0x13,0x9E,0xC7,0x41,0x33,0x5E,0x96, + + 0xDF,0x10,0x51,0x3D,0x5B,0x51,0x6B,0xA7,0x01,0xD1,0x89,0xBA,0x9B,0x7D,0x4B,0x6D, + + 0x5F,0xE8,0x8B,0xA9,0x58,0xE2,0x1F,0xB2,0xD2,0x89,0xDE,0x0B,0xF7,0xF3,0x57,0xC2, + + 0xF5,0xB9,0xBF,0xE3,0x93,0x5A,0xAB,0xA7,0xA8,0x57,0x57,0xD4,0x7A,0x36,0x16,0x47, + + 0x5B,0x57,0x44,0xA6,0x00,0x41,0xDC,0x91,0xFF,0xF1,0x85,0xFF,0x96,0x7E,0x56,0xB8, + + 0x81,0x14,0x22,0xBF,0x64,0x3E,0xEE,0x72,0x9E,0x5E,0x96,0x61,0xF3,0xC4,0x0E,0xB1, + + 0x4A,0xF6,0x37,0x51,0xE1,0xE1,0xDE,0xD8,0x1E,0x8F,0x9C,0x77,0x6E,0x8C,0x7D,0xA7, + + 0x41,0x4D,0xDE,0xB3,0x70,0x89,0xD6,0xB8,0xED,0xF5,0xB2,0x44,0x2F,0x3A,0x85,0x5D, + + 0x16,0x2A,0x8A,0xEF,0x3F,0x4B,0x1B,0xCB,0x48,0xF0,0xCA,0x4F,0x5F,0xC6,0x1D,0x70, + + 0x57,0x58,0xA7,0xA2,0xF0,0x0B,0xDC,0xD8,0xB7,0x51,0x95,0xEB,0x19,0xD5,0x51,0xC9, + + 0x83,0xAE,0x50,0xDD,0xBE,0xB6,0x03,0x59,0xE5,0x19,0xB9,0xDD,0xC1,0xD6,0x3E,0x4C, + + 0x78,0x5D,0x6A,0xB3,0xF0,0x6F,0x4E,0xE0,0x6C,0xCE,0xEE,0xFC,0xD9,0x12,0x70,0xE4, + + 0x43,0x10,0xB7,0xA2,0x5A,0x39,0x18,0xE4,0x6D,0x2F,0x87,0x1D,0x18,0x0D,0x1D,0xC8, + + 0x09,0xAE,0xF9,0x64,0xDB,0x3A,0x4E,0x8B,0x01,0x6F,0xB5,0xE8,0xFB,0x3C,0xB0,0xAA, + + 0xD3,0x7C,0xAE,0x1D,0xE7,0x53,0x03,0x7D,0xB9,0xD4,0x27,0xF5,0x98,0x68,0xEA,0xBA, + + 0xED,0x9A,0xDE,0x00,0x77,0xD5,0x24,0x8C,0xA5,0x6F,0xE9,0x94,0xF1,0x66,0x90,0xE1, + + 0x3B,0x91,0xBE,0xBE,0xEA,0x0C,0xEA,0xC1,0x2F,0x6E,0x79,0x33,0x53,0xDA,0x79,0x0A, + + 0xB7,0x0A,0x72,0x83,0x8A,0xB5,0x65,0xD0,0xE2,0x6D,0x31,0xE7,0x90,0xE1,0x91,0xE0, + + 0xF7,0x98,0x7F,0xAB,0x62,0xC0,0x6B,0xC0,0xEB,0x6C,0x87,0x08,0xE5,0xE7,0x73,0x31, + + 0x76,0xE8,0xB9,0x4D,0xF3,0xAF,0x0E,0x5F,0x8E,0x55,0x0F,0x14,0x80,0x3B,0x8E,0x63, + + 0x77,0xC7,0xE0,0x47,0x24,0x91,0x70,0x66,0x8F,0xE6,0xC6,0xCF,0x36,0xE1,0x06,0x83, + + 0xD4,0x0D,0xF3,0xC3,0x88,0x5D,0x21,0xE7,0xD8,0x3D,0x1D,0x18,0x1C,0x35,0x2A,0x33, + + 0x26,0x2E,0x53,0x37,0x81,0xA6,0xEE,0x60,0xE1,0xC4,0x80,0x09,0xB6,0xE3,0x7B,0x6C, + + 0xE7,0x3B,0xC4,0x6C,0xE7,0x37,0x21,0x59,0x7C,0x8A,0x32,0xD3,0x00,0xAA,0x0C,0x6A, + + 0x44,0x2D,0x78,0x6D,0x77,0x7A,0x00,0xD8,0xE1,0xC6,0xBE,0xA8,0xBC,0x46,0x22,0x6D, + + 0x67,0x59,0x9D,0xBB,0xE0,0x05,0x70,0x23,0x27,0xAE,0xBA,0xC7,0x94,0xFB,0x35,0x4F, + + 0xB2,0x13,0xD5,0xAE,0x74,0x28,0x05,0x13,0xA5,0xC6,0xAA,0x4C,0xED,0x87,0xF4,0xAA, + + 0x5E,0x07,0x23,0x87,0xF7,0x3F,0x28,0xFD,0x26,0x2D,0x93,0x2E,0x78,0x41,0x29,0x6B, + + 0xAE,0x0D,0x3F,0xEF,0x65,0x72,0x04,0x4F,0x49,0x5F,0xF2,0x6F,0x6C,0xD9,0xD1,0x7A, + + 0xFE,0xCC,0xF5,0xF3,0x61,0x03,0xB3,0xF3,0xEF,0xC3,0x66,0xA8,0x14,0x3E,0x13,0x59, + + 0xCF,0x2F,0x2B,0xD2,0xB4,0xA2,0x7A,0xFF,0xD1,0xD8,0x41,0x9F,0x8B,0x42,0x3A,0xB8, + + 0x45,0x6B,0x5B,0x78,0xCF,0x2F,0x69,0xD1,0xAC,0xD9,0xA1,0x61,0xBE,0xD9,0x27,0x43, + + 0x23,0xE3,0x99,0x26,0x85,0xD2,0x5A,0xD3,0x66,0x08,0x82,0x9F,0xBD,0x98,0x2E,0x7F, + + 0x18,0xD0,0x10,0x33,0x00,0x11,0x20,0xD0,0xDC,0xBC,0xBD,0xA3,0xFD,0x36,0x54,0xD3, + + 0xE1,0x88,0x41,0x13,0xF5,0xA2,0x03,0x9A,0x2D,0xBA,0xC5,0x85,0x0A,0x26,0x9F,0x32, + + 0x77,0x65,0xDA,0x62,0xFC,0x27,0x7C,0xF2,0xB2,0xF7,0x0C,0x20,0x60,0xF0,0xBF,0x21, + + 0xAB,0xD7,0x4E,0x16,0x3B,0xB4,0xBC,0x7F,0x48,0x78,0x23,0x14,0x57,0xA7,0x1B,0xC5, + + 0xC5,0xE3,0xDB,0x6A,0xB0,0xC4,0xD2,0x47,0x0F,0xE7,0xF3,0x95,0x74,0x8A,0xA8,0x04, + + 0xA6,0x57,0x2C,0x4E,0xB1,0xC5,0x29,0x11,0x4B,0x7A,0x3C,0x0B,0x62,0x0C,0x85,0xFC, + + 0x1F,0xBE,0xAE,0x33,0x0F,0xF2,0x4E,0x98,0x98,0xD7,0xCE,0xDD,0x2B,0xA3,0x10,0x43, + + 0x0E,0xD9,0xED,0x00,0xB2,0xA2,0x40,0x86,0x9C,0x0A,0x07,0x02,0x96,0x48,0xDD,0xF9, + + 0x47,0x4A,0x1F,0xEF,0xE8,0xF8,0x6C,0xAB,0x84,0x00,0xB7,0x92,0x17,0x2B,0x33,0x84, + + 0xAB,0x09,0xA6,0xF9,0x63,0x66,0x41,0x82,0x25,0x01,0x99,0x63,0xC9,0x56,0x40,0x7F, + + 0x04,0x38,0xBA,0x4A,0x6C,0x37,0xA6,0x08,0x92,0xED,0x2A,0x03,0x0C,0x47,0x68,0xE6, + + 0xC6,0x4C,0x49,0x7A,0xD6,0x6D,0xE8,0x7E,0x3D,0xCD,0x75,0xC6,0x08,0xC1,0x36,0x6F, + + 0xE6,0xCF,0xEF,0xDF,0x6A,0x9D,0xB7,0x0B,0xEE,0x73,0xB7,0x17,0x42,0xBC,0x37,0xDF, + + 0xE7,0x2E,0x2F,0x52,0x90,0x12,0x01,0xFC,0x06,0x2E,0x20,0x07,0x8C,0xC3,0x5F,0xCF, + + 0x06,0xAB,0x7A,0xF5,0x48,0xC0,0x2E,0x3C,0x63,0xE0,0xCE,0xC6,0x5C,0xE4,0xC0,0x76, + + 0x20,0xA1,0x0A,0xFC,0x6E,0x6C,0x1A,0x42,0x72,0x35,0x90,0xA0,0x6A,0x41,0xC1,0x02, + + 0x36,0x19,0xA1,0x00,0xA3,0x04,0x48,0x2E,0x84,0x46,0x6E,0x5F,0x5D,0x94,0xB1,0x81, + + 0x26,0x07,0x91,0x10,0x34,0xA1,0xE3,0xB5,0xDF,0x5C,0xB9,0xB1,0x28,0x0F,0xC0,0x0A, + + 0xFF,0x18,0xB6,0xC0,0x16,0x49,0x77,0x82,0xA2,0xE5,0xD0,0x64,0x52,0x64,0x9C,0x0E, + + 0x2D,0xD9,0xCA,0x0A,0x91,0xC9,0x8C,0x8E,0xBE,0xC4,0xD8,0x74,0x53,0x65,0x40,0x43, + + 0xCA,0x6A,0xA1,0x12,0x71,0x66,0x69,0x9E,0x2B,0x49,0xD1,0x65,0xD2,0x66,0x20,0xBA, + + 0x68,0x56,0xB3,0xD1,0xD3,0x03,0x19,0x82,0xED,0x9A,0xD9,0x75,0xD3,0x67,0x80,0x7A, + + 0x3B,0xE0,0x7A,0x28,0xF1,0x92,0x1A,0xA8,0xA1,0x98,0xF0,0x29,0x5B,0xF8,0x2A,0x40, + + 0xA8,0x08,0x01,0x24,0x3D,0xA4,0xDA,0x78,0x05,0x07,0x65,0x46,0xD4,0x9F,0xFB,0x01, + + 0x2F,0x0C,0x95,0x6F,0x27,0x68,0x01,0x2D,0xCE,0xD8,0xAD,0x49,0x55,0x08,0xB5,0x11, + + 0x68,0x10,0xF5,0x28,0x70,0xCA,0xDD,0xD1,0xCE,0xC0,0x93,0x39,0xE2,0x4B,0xE1,0x61, + + 0x39,0xB2,0x9B,0x5C,0x1C,0xAC,0x00,0xC7,0xA1,0x0F,0xD2,0x6C,0x5A,0x6C,0x09,0x72, + + 0x86,0x4F,0x0A,0x4C,0xCE,0x2B,0xFA,0x88,0xC3,0x9E,0xDA,0x7C,0x5B,0x6D,0x83,0x59, + + 0x52,0x4C,0x4C,0xCF,0x57,0x21,0x09,0x2B,0xB6,0xE1,0xD3,0x6D,0xDA,0x6E,0x49,0xE5, + + 0x88,0x3E,0x65,0xAF,0x9D,0xAF,0xEC,0x7F,0x3C,0xE4,0xDB,0x7D,0xDB,0x6F,0x16,0x7F, + + 0x87,0x02,0xE2,0xE4,0x70,0xAF,0xAE,0x5F,0xED,0x4B,0x3B,0xDF,0xAD,0xAB,0x0D,0xF6, + + 0x02,0x51,0x94,0xF8,0xD0,0x0E,0xA3,0xF7,0xA3,0x41,0xC7,0xB4,0x77,0x51,0xBD,0x31, + + 0x5F,0x5D,0xE5,0x87,0x3F,0x3F,0xB6,0x37,0xE3,0x62,0x95,0xFE,0x01,0xCE,0x4C,0xF7, + + 0x82,0x10,0xB5,0x64,0x12,0x63,0x15,0x19,0xC3,0xB1,0xEB,0x5D,0x86,0x3E,0x46,0x7C, + + 0x23,0xB4,0x9A,0xBA,0x31,0x36,0xFD,0xB7,0x64,0x26,0xD4,0xE4,0x72,0x74,0xDC,0x54, + + 0x71,0x00,0x34,0xB2,0xF1,0x15,0x7C,0xED,0xE1,0x09,0xDC,0xF4,0x73,0x75,0x55,0x4D, + + 0xA6,0x78,0x9C,0x26,0x17,0xB6,0x6E,0x63,0x77,0xF1,0xD5,0xE5,0xF2,0x76,0x74,0x93, + + 0x02,0x0C,0xC5,0xD9,0xD8,0x87,0xA9,0x75,0xB1,0x53,0xDD,0xF5,0xF3,0x77,0x66,0x8A, + + 0x71,0x15,0xB4,0x73,0xB5,0x95,0x40,0x40,0x8A,0xF5,0xE9,0xEB,0x85,0xCE,0xCA,0x1E, + + 0x63,0x7C,0x94,0x9E,0x8A,0x94,0xC1,0x02,0x6F,0xCB,0xC7,0xA7,0x1E,0x59,0xC3,0x0C, + + 0xEB,0xE9,0x4A,0x12,0x51,0x35,0x94,0x4F,0x9F,0x46,0x2C,0x37,0xF9,0x58,0x37,0x1C, + + 0xA7,0x91,0x46,0xED,0x39,0x2D,0x7D,0x3D,0xBC,0xCA,0xC5,0x0E,0x91,0x9A,0xFB,0x4C, + + 0x6A,0xA8,0x44,0x8A,0x4A,0x7D,0x36,0xA3,0xFC,0x1E,0xD6,0xEC,0x7A,0x7C,0x0D,0xE1, + + 0x28,0xAD,0x5E,0xDC,0x3B,0x3D,0x03,0x10,0x72,0x1F,0xDE,0xFC,0x7B,0x7D,0x2F,0xAB, + + 0x19,0x5C,0xFD,0x25,0x11,0x71,0x92,0x93,0x68,0x62,0xD7,0xED,0xFA,0x7E,0x16,0xB6, + + 0xAD,0x9F,0xCF,0xDD,0xBB,0x3F,0x9A,0x87,0xCF,0xA4,0xDF,0xFD,0xFB,0x7F,0x07,0xF4, + + 0x86,0xBC,0x0C,0x95,0x0F,0xA8,0x72,0xC4,0x8C,0x10,0x8D,0x46,0x5E,0xE6,0xA3,0x70, + + 0xFA,0x0D,0x89,0x27,0x79,0xBE,0x20,0xB2,0x2C,0x7B,0xC0,0x54,0xD8,0x67,0x7F,0xE1, + + 0x06,0x86,0x21,0x24,0x6D,0x29,0x7E,0xCB,0x14,0x0F,0x9C,0x9D,0x75,0x62,0x63,0x0E, + + 0xA5,0x8E,0x11,0xF7,0x91,0x86,0x21,0x2B,0xF6,0x0B,0xFB,0x77,0x9D,0x48,0xA0,0xDA, + + 0xB6,0x99,0x5A,0x46,0x16,0xA4,0x7E,0x62,0x8E,0xAD,0xF0,0x66,0x56,0xE4,0xA8,0x42, + + 0xDF,0x8B,0x12,0xD2,0x45,0xB2,0x28,0x49,0x69,0x50,0xF8,0x76,0x57,0xE5,0x49,0x21, + + 0xB5,0x38,0xE1,0x35,0xA5,0xF0,0xFB,0x4C,0xEC,0x93,0xF1,0x67,0xD6,0xE6,0x51,0xB9, + + 0x81,0xC7,0xB0,0x38,0x91,0x27,0xA9,0x77,0xDA,0x65,0xF9,0x77,0xD7,0xE7,0xA2,0x4C, + + 0x46,0x75,0x9F,0x31,0x70,0xEA,0x8A,0x6D,0x8E,0xA8,0xB5,0x3B,0xBD,0xE7,0x3A,0x78, + + 0x09,0xC5,0x65,0x8D,0x4A,0x29,0xC2,0x1E,0xAC,0xD2,0xF2,0xA2,0xAC,0x85,0x09,0x8E, + + 0xCF,0x6A,0xE9,0x58,0x11,0x07,0x7B,0x3B,0x69,0x4A,0x8C,0x68,0x1E,0xFA,0x6C,0xF3, + + 0xAA,0xC6,0xD4,0x58,0x74,0x82,0xB1,0xDD,0xFE,0xED,0xD9,0x37,0xDE,0xF9,0x1A,0x00, + + 0xFF,0x90,0x94,0x89,0x18,0x2C,0x4C,0xA2,0x6D,0x0E,0xF2,0x6E,0x5E,0xEC,0x7F,0x65, + + 0x3B,0x00,0xA9,0xF4,0x2C,0xD0,0x3E,0xF8,0xD6,0x26,0xFA,0x7E,0x5F,0xED,0xA3,0xD3, + + 0x7A,0x5B,0x30,0x0F,0x8E,0xEC,0xB3,0xE6,0xC1,0xC4,0xF3,0x6F,0xDE,0xEE,0x10,0xA0, + + 0x00,0xCD,0x2B,0x4F,0x08,0xED,0xBB,0xE3,0x4F,0xC9,0xFB,0x7F,0xDF,0xEF,0xF3,0x07, + + 0xA2,0x22,0xAC,0x3A,0xDD,0x6A,0x81,0xD3,0xD0,0x59,0xCA,0xA0,0x95,0x73,0x12,0x8E, + + 0x06,0x13,0xBA,0xE5,0x18,0x33,0xE3,0x32,0x12,0xA6,0xC4,0xA7,0x19,0xD4,0x8D,0x0F, + + 0x21,0x70,0x49,0x15,0xB4,0xBA,0x6A,0x43,0x97,0x36,0x00,0x54,0x78,0x7F,0xC1,0xE0, + + 0xBA,0x35,0x52,0xE4,0xEA,0x45,0xFD,0xEE,0x50,0x5E,0x7E,0x93,0x9E,0xC2,0x12,0x46, + + 0x74,0x83,0xE4,0xC6,0x36,0xB4,0x34,0x1E,0xDA,0x96,0xF4,0xE6,0x76,0xF4,0xEB,0xA1, + + 0x74,0xFB,0xEC,0xD6,0x37,0xB5,0xA7,0xDD,0x61,0xE4,0xFC,0xF6,0x77,0xF5,0xA5,0x5B, + + 0xDE,0x9E,0xE5,0xC7,0xB6,0xB6,0x39,0xE6,0x99,0xD4,0xF5,0xE7,0xF6,0xF6,0x0F,0xD2, + + 0xA4,0x57,0xED,0xD7,0xB7,0xB7,0x01,0x1B,0x71,0x1A,0xFD,0xF7,0xF7,0xF7,0xF5,0xF9, + + 0x56,0x11,0xEE,0x16,0xC6,0x98,0x6F,0x29,0x8B,0xDE,0x36,0x5F,0x48,0xE2,0x34,0x98, + + 0xBF,0x91,0xAC,0x5E,0x61,0x0E,0x67,0xB5,0x88,0xB7,0xDE,0xF5,0x1E,0xF4,0x07,0x61, + + 0x45,0xC0,0x25,0xF5,0x31,0x3C,0x9E,0x4F,0x4D,0x25,0x89,0x67,0xDF,0xA8,0xAB,0x6A, + + 0xF5,0x7B,0x2F,0xBB,0x54,0xF2,0xD8,0xFB,0xF9,0x56,0x40,0x4F,0xEE,0x20,0x3F,0xD1, + + 0xCB,0x1B,0xE6,0xCE,0x3E,0xBC,0xDA,0x78,0x6C,0xD6,0xF6,0xEE,0x7E,0xFC,0xC2,0xFE, + + 0xFB,0x9E,0xEE,0xDE,0x3F,0xBD,0x04,0x7E,0x2F,0xF9,0xFE,0xFE,0x7F,0xFD,0x63,0xCF, + + 0x21,0xDF,0xE7,0xCF,0xBE,0xBE,0x31,0xFF,0x6C,0x32,0xF7,0xEF,0xFE,0xFE,0xC8,0x7A, + + 0x46,0xF6,0xEF,0xDF,0xBF,0xBF,0x26,0x98,0xE9,0x5F,0xFF,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x30,0xAF,0xBE,0x60,0x70,0xFF,0x86,0xC0,0x44,0xB4,0x03,0x5A,0x9A,0xD1,0x4F,0x14, + + 0x29,0x76,0xF3,0x90,0x15,0xB3,0x1E,0x05,0xC1,0x56,0x0F,0xCB,0xB8,0xD0,0x94,0xF2, + + 0xF0,0x03,0xFE,0x77,0xF2,0xDD,0x00,0x3C,0x40,0xAE,0xD9,0xA5,0x39,0xB3,0x33,0xE2, + + 0x96,0xAC,0xB3,0xE6,0xE9,0x8C,0x27,0xE5,0x7E,0x18,0x4A,0x72,0xDF,0x58,0xBF,0x33, + + 0x2B,0x68,0xEA,0xAA,0xBE,0x29,0x6E,0x82,0x20,0x4B,0x94,0x8C,0x89,0x26,0x54,0x74, + + 0xEA,0x1F,0xB6,0x6D,0xE6,0x73,0x06,0xC1,0x4B,0xC8,0x18,0x64,0xB9,0x0B,0xA6,0x81, + + 0x86,0xA6,0x3C,0x02,0x6F,0x50,0x7E,0x1E,0x1B,0xD9,0xD3,0x7E,0xE1,0x4B,0x11,0x8D, + + 0xA3,0xC5,0xB7,0x6D,0xB1,0xCA,0xA6,0x75,0xCB,0xD4,0x19,0x65,0xA5,0x6F,0xCF,0xF5, + + 0x0A,0xD3,0x11,0xFD,0x74,0x08,0x12,0x19,0x2D,0xE7,0x68,0xCB,0xA5,0x0A,0x34,0x7C, + + 0x61,0x04,0xB4,0x29,0x94,0x9F,0x0D,0x4B,0x52,0x42,0xE9,0x4F,0x35,0x60,0xF6,0x8D, + + 0xB8,0xB5,0xBD,0x69,0xDA,0x95,0x80,0x47,0xE6,0xE5,0x96,0xCA,0xDE,0x51,0xF6,0xE0, + + 0x8B,0x90,0xC3,0xD4,0x70,0xCA,0xDB,0x4A,0x9A,0x40,0x9E,0xAC,0xB5,0x9E,0x8F,0x3A, + + 0xF5,0xF1,0x47,0x0B,0xFB,0x8A,0xFA,0x55,0x79,0x4B,0xD6,0x48,0xD5,0x2D,0x86,0xA8, + + 0x9B,0xFC,0xAC,0x64,0xF0,0xBC,0xA5,0x9E,0xA2,0x7C,0xF5,0x0E,0xB0,0x2E,0xEF,0xDA, + + 0x91,0x04,0xD4,0xBE,0xE2,0xA3,0xEB,0x9A,0xF2,0xC5,0x7F,0x49,0x03,0x93,0x32,0x3F, + + 0xAA,0x37,0xF5,0x64,0xF3,0x5E,0xF7,0xEA,0xEE,0x47,0xA5,0xD8,0x22,0xCB,0xFC,0xF2, + + 0xCB,0xF1,0xFA,0xBC,0xC1,0x66,0xAF,0x0C,0x97,0xDD,0xAA,0xC1,0xCF,0x2B,0x94,0x50, + + 0x28,0xBC,0x1D,0x0B,0xD8,0x00,0xDC,0xA0,0xD9,0x3D,0x5C,0xB5,0x9B,0x8C,0x3B,0xB4, + + 0x2D,0xB4,0xFB,0xA8,0x3D,0x9F,0x6A,0x23,0x71,0x95,0x95,0x5E,0x83,0x72,0x9B,0x81, + + 0x5E,0xEE,0x6E,0x55,0xD1,0x5F,0xDD,0xA1,0x97,0x59,0x8B,0xD7,0x0E,0xAE,0xA5,0x80, + + 0x62,0x5A,0x3F,0xBF,0x3C,0xCB,0x2B,0x93,0x4F,0xD5,0x29,0x08,0x72,0xCF,0x36,0xB0, + + 0x75,0x9E,0xF2,0xF8,0xE5,0x3F,0xBB,0x30,0x42,0xE8,0x53,0x9A,0x92,0xDA,0x87,0xC3, + + 0x86,0xCB,0x69,0xB6,0x8E,0xC0,0xAE,0x1E,0x1B,0x3A,0x95,0x1D,0x06,0x34,0x3C,0xED, + + 0x48,0x53,0x4D,0x13,0xCF,0xBC,0x4F,0xF5,0x1C,0xDA,0x4A,0x86,0x8F,0x1B,0xAA,0x1B, + + 0x0D,0x12,0xB8,0xB4,0xE6,0x95,0x56,0x40,0xB0,0x95,0x42,0x52,0x85,0xF9,0xCE,0x00, + + 0xF9,0xE4,0x4E,0x11,0x5C,0x7B,0xEC,0x3C,0x29,0x94,0x6B,0x42,0x02,0x7B,0xD3,0x0D, + + 0xB6,0xD3,0x12,0x13,0xB9,0x48,0x4F,0xA4,0x6A,0x46,0xD7,0x52,0x0D,0xF9,0xCF,0x14, + + 0x98,0x59,0xCC,0x87,0x34,0x86,0x1F,0xB9,0xE9,0x5B,0xC4,0x86,0xFF,0x83,0x7C,0x78, + + 0xBF,0xB3,0xBD,0xFD,0x02,0x93,0x82,0x16,0x97,0xFD,0xB0,0x89,0x7B,0x3C,0x65,0xE4, + + 0xC0,0x59,0xB0,0xDB,0x9A,0xBA,0xA5,0x8B,0x17,0xAC,0x0C,0x9E,0x8C,0x18,0xE3,0xBB, + + 0x09,0x95,0x67,0xBF,0xD8,0x22,0x6F,0x16,0x1F,0x3D,0xF3,0x67,0xFC,0x0C,0x75,0x69, + + 0x32,0xB0,0x4B,0xD8,0x1F,0xCE,0x21,0xFF,0x02,0x8E,0xE7,0x02,0x0E,0x1C,0x95,0xFF, + + 0x06,0x5B,0x60,0x8B,0xB0,0x3F,0xB3,0xCA,0x86,0x0D,0x26,0xA2,0x6B,0x26,0x84,0x61, + + 0x1A,0x27,0x6D,0x62,0xB4,0xFE,0x82,0xD2,0x05,0x8D,0xCB,0x45,0x39,0x8D,0x12,0x87, + + 0xD1,0x13,0x15,0x65,0x6F,0xE0,0x69,0x2A,0xF7,0x76,0x91,0xC0,0xD2,0xD9,0xB3,0xE3, + + 0x05,0x9C,0x1D,0x75,0x2A,0xCF,0xE9,0x31,0xA9,0xC2,0xDF,0x53,0xD6,0xD3,0x3A,0x8F, + + 0x7A,0x2B,0x9E,0x6B,0xFF,0x35,0x74,0x46,0xA7,0x6B,0x6C,0x84,0xB6,0x40,0x16,0x55, + + 0xA6,0x5A,0xEF,0x54,0xD1,0x08,0xEB,0x48,0x2C,0x34,0xA6,0x94,0x53,0x58,0xC1,0x31, + + 0xE4,0xF3,0xB7,0x6B,0x7D,0xF7,0xE0,0x90,0xFA,0x6D,0x89,0xD7,0x3D,0x45,0xD6,0xD7, + + 0x99,0xEC,0xFC,0x66,0x36,0x26,0x39,0x8A,0xC5,0x5C,0x39,0xEF,0x21,0xEA,0x3C,0xC6, + + 0x9E,0x82,0xC5,0xFD,0x28,0xF5,0xE2,0x17,0xB8,0x79,0x05,0x1B,0x5A,0x93,0xEE,0xE5, + + 0x3E,0x46,0x6F,0xA1,0xEE,0xCC,0x65,0x2B,0x4B,0xE9,0xC2,0xF8,0x7B,0xA8,0x20,0x78, + + 0xE9,0xE6,0xC0,0xFC,0xA4,0xE8,0x84,0x17,0xBF,0xCA,0x51,0x3E,0xB0,0xEE,0x11,0xFD, + + 0x9D,0x76,0x93,0xE4,0x10,0xDD,0x4D,0x44,0xF1,0x34,0x0C,0x17,0xAA,0xEB,0x5A,0xB0, + + 0xA2,0x81,0x91,0xBD,0x9A,0x21,0xC7,0x55,0x76,0x8E,0x8C,0xCE,0xF2,0xE1,0x93,0x52, + + 0xAA,0xF2,0xD2,0xA4,0xB3,0xA0,0xCD,0x47,0xBB,0x1C,0x36,0x81,0xAA,0x6E,0x1C,0xA3, + + 0xCF,0xC3,0xB1,0x61,0x75,0xCA,0xAA,0x12,0x36,0xFF,0x8D,0xCE,0xD8,0x7C,0x87,0x20, + + 0x11,0x12,0x94,0x25,0x12,0xCD,0xBB,0x8F,0xF8,0x42,0x0E,0x81,0x36,0x86,0x67,0x3B, + + 0xEE,0x41,0xC2,0xF2,0x57,0xB4,0xA4,0x20,0xF5,0x17,0x0D,0xB5,0x44,0x11,0x6F,0x16, + + 0x3B,0x58,0xCD,0x56,0x65,0xF3,0x3C,0xB2,0x65,0x7C,0x3C,0x27,0x22,0x5C,0x1E,0x10, + + 0xDC,0x98,0xDC,0xFD,0xD5,0xB6,0xF5,0xB3,0x01,0xD2,0x25,0xD4,0xA3,0xFB,0x16,0x71, + + 0x09,0x2E,0x68,0x28,0xB3,0x21,0xA5,0x37,0xFB,0x96,0x21,0x27,0x0A,0x5E,0xC0,0xB0, + + 0x85,0x1F,0x74,0x81,0xCF,0x12,0xA7,0x66,0x78,0xC3,0x92,0x84,0x8D,0x6B,0x94,0xCF, + + 0xA7,0x70,0x8A,0xFA,0xDC,0x24,0x5A,0xCE,0xEB,0x68,0xBF,0xC8,0x44,0x3A,0xFD,0xFF, + + 0x15,0x1B,0x70,0x34,0xCE,0x2B,0x8A,0xF0,0x9A,0x92,0xCE,0xA5,0x57,0xB4,0xFD,0x9C, + + 0x5E,0xEB,0x01,0xA4,0xCF,0x11,0xBD,0x7E,0x0F,0x88,0x45,0x09,0xE7,0xBA,0x5E,0x7B, + + 0x8F,0xD8,0x81,0x8C,0x7C,0x18,0xCD,0x8D,0xCD,0x27,0x79,0xE9,0xA2,0xF2,0x10,0xA3, + + 0x8E,0xFC,0x54,0xF8,0xCA,0xA9,0x7D,0x03,0x90,0x6F,0xA6,0xDE,0x79,0x5B,0x98,0x0F, + + 0xB2,0xE3,0x31,0xAE,0xFE,0xA1,0x57,0x91,0xEE,0x98,0x37,0xBE,0xA3,0x57,0x11,0xA7, + + 0x0E,0x36,0x17,0x60,0x30,0x1D,0xC0,0xC5,0x3F,0x04,0xA7,0xCC,0xD8,0x79,0xCF,0xB0, + + 0xBB,0x31,0x7C,0x3E,0xBE,0xA3,0xC2,0x88,0xD1,0xB0,0x09,0x90,0x50,0x5A,0x56,0x24, + + 0xF3,0x92,0x6E,0x18,0x43,0xBE,0x9F,0x04,0x96,0xDB,0xC6,0x14,0x79,0xBD,0xFB,0xFB, + + 0x59,0x3F,0xF9,0xF7,0x2C,0xB6,0xC8,0x64,0x11,0x03,0xCF,0x14,0x0D,0xF0,0x5D,0xEB, + + 0xAF,0x60,0x78,0x4B,0x9F,0x7E,0xCA,0x7B,0xE9,0xAD,0x04,0x81,0x7E,0xF2,0xBF,0x42, + + 0xA1,0xD5,0xA0,0xF4,0x80,0xD1,0xDA,0xD0,0xC0,0x5F,0x00,0xA6,0xD0,0xDA,0xB7,0x5F, + + 0x94,0xDC,0x44,0x29,0xA2,0x6C,0x50,0x3C,0xBC,0xE0,0xD2,0x29,0xBA,0x70,0x51,0x3E, + + 0xAA,0x7E,0xF8,0x63,0x67,0xA9,0xAA,0x51,0x40,0x54,0xA9,0xF5,0x73,0xEE,0xA0,0x7F, + + 0xAF,0xA5,0x91,0x65,0xF2,0x06,0xCD,0xC2,0xEF,0x9E,0x89,0x0C,0xD5,0x4F,0xEB,0xC5, + + 0x91,0x3B,0x89,0x45,0x90,0x18,0x1A,0x4F,0xBF,0x28,0x77,0xA3,0xAF,0x12,0xDE,0xA3, + + 0x87,0x88,0x30,0x5C,0xB4,0x67,0x3B,0xF4,0x5D,0xEF,0xE6,0x5C,0xA8,0xFE,0xBE,0xB1, + + 0xC5,0xA7,0x8F,0xA7,0xA1,0x8D,0x33,0x65,0xE6,0x5D,0x6A,0xEB,0xD1,0x87,0x1B,0x1A, + + 0x85,0xDC,0x0C,0x90,0x92,0xE7,0x51,0xFD,0xF0,0xB1,0xD9,0xF7,0x46,0x92,0x3A,0xE3, + + 0xBB,0x06,0x15,0xE6,0xBD,0x97,0x44,0x8C,0xA3,0x0B,0x4B,0x5F,0x35,0x61,0xF1,0x9C, + + 0x4C,0x1A,0xB5,0x82,0x96,0x32,0xB6,0xD0,0xA6,0x04,0xD1,0xDC,0x45,0x72,0x3B,0xF6, + + 0x0B,0x07,0x6F,0x93,0x99,0x40,0x15,0x14,0xE1,0xF6,0x13,0x6E,0xEF,0xC7,0x24,0x66, + + 0x50,0x97,0xAE,0x8B,0x98,0x53,0x7D,0x98,0x20,0x48,0xBC,0x4B,0xFA,0xAB,0x9F,0x88, + + 0x14,0x4E,0xFC,0x94,0x39,0x6C,0xEA,0x96,0x5A,0x01,0x12,0xE1,0xCC,0x6A,0xE1,0x1F, + + 0x05,0xD1,0xEA,0x0F,0xBA,0xA1,0xBD,0x06,0x4D,0x3F,0x7D,0xBB,0xA6,0x1B,0x86,0x72, + + 0xB9,0xEE,0x6B,0xD9,0xBE,0x28,0xAC,0x81,0x41,0x03,0x7E,0xFE,0xDC,0x1C,0x8F,0x93, + + 0x30,0xF0,0x81,0x40,0x70,0xCE,0x96,0x39,0xC7,0x4E,0x60,0xF3,0xDA,0x8D,0xB0,0xE2, + + 0x9F,0xBB,0xBF,0x16,0x3C,0x38,0xB7,0x04,0xBC,0x33,0xAA,0x6C,0x11,0x50,0x6C,0xAB, + + 0x23,0x53,0xCF,0xC4,0x30,0xA1,0xA7,0x00,0xDF,0x0E,0x0A,0x5C,0xDF,0x3C,0x7D,0x85, + + 0x49,0xE3,0x03,0x6D,0x7C,0x70,0xD5,0x39,0xEF,0x2D,0x8D,0x40,0x11,0xDD,0x0B,0x31, + + 0x00,0xCC,0x4D,0x18,0x60,0x3E,0xB2,0xDE,0x3C,0x8C,0x62,0xC6,0x9D,0x1F,0x7C,0x87, + + 0xE8,0x05,0xDE,0x39,0xA0,0xEF,0xFB,0x06,0x72,0xA9,0xF9,0x34,0xD3,0x1A,0x55,0x32, + + 0xC2,0x0E,0xAC,0x9B,0xBD,0x38,0x17,0x10,0x62,0xA0,0xBC,0xAE,0x73,0x78,0x0D,0x49, + + 0x03,0xB7,0x60,0x41,0xE3,0x72,0xAD,0xE3,0xA3,0xFB,0xB7,0xE9,0xF3,0xC6,0x20,0x37, + + 0xB3,0x5A,0x36,0xF2,0x12,0x31,0xC7,0x19,0xD0,0x18,0xDF,0x17,0x71,0x5F,0xB2,0xEA, + + 0x50,0xE7,0x84,0x6E,0xBA,0x04,0x48,0x10,0x68,0xFC,0x71,0x6C,0x1D,0xF3,0x0E,0x61, + + 0x2D,0x5B,0x4E,0x11,0xE8,0x34,0x2D,0x1C,0x6F,0x01,0x26,0xDC,0x6E,0xD4,0xBC,0x31, + + 0x5F,0x81,0x76,0x7D,0xA8,0x35,0x8B,0x10,0x10,0x39,0x5B,0x9C,0x94,0x65,0x8F,0x01, + + 0x24,0x66,0x63,0x0F,0xFB,0x33,0xED,0x9D,0xDA,0x6F,0xD4,0xDD,0xBE,0x39,0x5E,0xD0, + + 0xC3,0x06,0x6F,0x6F,0x3C,0xC7,0x57,0x97,0xCD,0x47,0x72,0x8E,0x3B,0x5C,0x2E,0x97, + + 0xFB,0x96,0x75,0x3E,0x97,0xC0,0x5E,0x10,0x54,0xC0,0xA5,0xDB,0xDA,0xC2,0x5D,0xC8, + + 0x8B,0xDE,0x2D,0x4F,0x27,0x58,0x7C,0x8F,0x11,0xC5,0xAF,0xC9,0x05,0x73,0x4B,0x3B, + + 0x98,0x41,0xB7,0xFA,0x1A,0xE0,0xA7,0xF1,0x12,0x10,0x1F,0x3D,0x02,0x3E,0x9B,0x58, + + 0x89,0x9B,0x1F,0x82,0x46,0x2C,0xF0,0xAF,0x5B,0xC8,0xD0,0x69,0x84,0xED,0x16,0xB2, + + 0x03,0xF3,0xCA,0x13,0x14,0xA0,0xE1,0x32,0x3E,0xC3,0x52,0xD0,0x66,0x5D,0xDF,0x65, + + 0x4E,0xA1,0x61,0x9F,0xAA,0x3F,0x71,0x50,0xE9,0xBD,0xA9,0x37,0x35,0xF9,0xE4,0x53, + + 0x95,0xC1,0xF0,0x04,0x93,0x31,0x62,0x08,0xBA,0xC1,0x01,0x65,0x96,0x13,0x3A,0x33, + + 0x6E,0x65,0xD8,0x96,0x4A,0x0B,0x67,0x76,0x75,0xD0,0x1C,0xE4,0xC3,0xE3,0x45,0xD6, + + 0x70,0xFE,0xEA,0x25,0x27,0xAE,0x42,0x81,0x54,0xDE,0x51,0x49,0xF6,0x63,0x1F,0x45, + + 0x67,0x05,0xF0,0x34,0xFA,0xAF,0xCB,0xD1,0x56,0x34,0xC9,0xF5,0x47,0xE0,0x61,0x46, + + 0x66,0x81,0x6B,0xA6,0xFB,0x87,0x0D,0x15,0x38,0xD7,0xF9,0x37,0xC7,0xE1,0xE7,0xBE, + + 0xAD,0x17,0xA8,0xCE,0x06,0x55,0xE9,0x14,0x48,0x30,0x4D,0xC6,0x9B,0xA5,0xEF,0xAE, + + 0x8C,0xED,0xD4,0x18,0xFC,0x2A,0xEE,0x01,0x60,0x52,0x02,0x0F,0x6C,0xA6,0x97,0x69, + + 0x77,0xC8,0xB5,0x6D,0xFC,0x09,0x8A,0x15,0xEA,0x3F,0x1F,0xB0,0xDF,0xFA,0x03,0x1D, + + 0x2C,0xD4,0x86,0x9B,0xCF,0xD8,0x3B,0xBF,0xC9,0x59,0x81,0xD7,0x46,0xA4,0xCF,0x51, + + 0xAD,0x88,0xBC,0x66,0x5E,0xF7,0xCA,0x82,0x7D,0x30,0xDF,0xBE,0xFF,0x6C,0x47,0x29, + + 0x5C,0x86,0x7D,0x11,0x74,0xAE,0x23,0xD4,0xEA,0x32,0xD7,0xAE,0xFE,0xE4,0x61,0x5A, + + 0xE2,0xAB,0x4E,0xA2,0x10,0x05,0x8B,0x63,0x33,0x81,0x8B,0x6D,0xCE,0xE8,0x7F,0xD9, + + 0x12,0x3B,0x8D,0x64,0xF6,0x3A,0x7A,0x1D,0xFC,0xB4,0x7B,0xEF,0x7C,0xE9,0xC3,0x7D, + + 0x91,0x46,0xE7,0x02,0x2A,0x2C,0x8E,0x42,0x60,0xF5,0x71,0x9D,0x14,0xF0,0x54,0xB5, + + 0xD8,0x9E,0x2A,0x94,0x33,0x3A,0x04,0xA2,0xC6,0xDC,0x47,0x71,0x46,0x15,0x4D,0x85, + + 0x27,0xF6,0x9F,0x65,0xDF,0x02,0x15,0x21,0x7D,0x85,0x4A,0xD9,0x96,0x92,0xED,0x1E, + + 0xC3,0x9E,0x99,0xAA,0x06,0x6E,0xD1,0x21,0xF5,0xD9,0x05,0x28,0xE7,0xBE,0xDC,0x22, + + 0x68,0x92,0x50,0xA4,0xB4,0xE8,0xD8,0x91,0x79,0x22,0xF4,0xE6,0x76,0xF4,0x28,0xA0, + + 0x84,0x8E,0x8C,0x99,0xFD,0x68,0xB5,0x78,0x64,0x27,0xFC,0xF6,0x77,0xF5,0xC8,0xD9, + + 0x07,0x9F,0x52,0x43,0xC9,0x78,0x2F,0xE1,0x55,0x7F,0xF5,0xE7,0xF6,0xF6,0x42,0xB5, + + 0x66,0x1D,0x95,0xF0,0x4A,0xB8,0xD1,0x1B,0x6C,0x9A,0xFD,0xF7,0xF7,0xF7,0xDD,0xAD, + + 0x8D,0x67,0x86,0x9F,0x5F,0x9D,0xB6,0x89,0xEC,0x55,0x55,0x6E,0x79,0x55,0x34,0x98, + + 0xEF,0x9D,0x6E,0x13,0xEC,0x34,0x86,0x44,0x90,0xB5,0x7E,0x33,0xCF,0xE2,0xCB,0x19, + + 0xAC,0x47,0x30,0x65,0x5D,0xF5,0x4F,0x54,0xDF,0xBD,0x21,0x2B,0xAE,0x76,0x27,0x0F, + + 0x50,0x3D,0xD7,0x82,0x35,0x74,0xDC,0xFB,0xE9,0xFE,0x39,0xE1,0x70,0x99,0xE1,0x22, + + 0xE9,0xD3,0xD8,0xE6,0xC5,0x27,0x11,0x1A,0xEE,0x9E,0xF6,0xEE,0x7E,0xFC,0x7F,0x38, + + 0x0B,0x32,0x2E,0x53,0xA9,0xBB,0x6E,0xC3,0x6D,0x70,0xFE,0xFE,0x7F,0xFD,0x07,0x84, + + 0x76,0x33,0xE7,0x4D,0x2B,0x99,0xB2,0x32,0xEF,0xBE,0xF7,0xEF,0xFE,0xFE,0xCB,0xB9, + + 0x54,0xDD,0x42,0x58,0xB9,0xCD,0x36,0x1B,0xBF,0x74,0xFF,0xFF,0x32,0x61,0x80,0x19, + + 0x40,0x40,0x30,0x08,0xF1,0x43,0x16,0x7E,0xCD,0x22,0xA7,0x70,0x23,0x60,0xA7,0xE1, + + 0xED,0x0C,0x9A,0x10,0xF8,0xA0,0x0E,0x9D,0xAA,0x32,0x8E,0x56,0xAE,0xBC,0x00,0xDF, + + 0xEB,0xC7,0x83,0xF6,0xF4,0x89,0xBA,0xA4,0x53,0x7D,0x51,0x3D,0x83,0x9F,0x57,0x22, + + 0x01,0xA8,0x65,0x86,0xF9,0x29,0xA2,0x80,0xF7,0xEC,0x4D,0xCB,0x2C,0xE2,0x12,0x4F, + + 0xE9,0x95,0xB9,0x32,0xE1,0x34,0x46,0x48,0xA9,0x55,0x01,0x7B,0x6C,0x0A,0x5E,0x91, + + 0xFC,0x88,0x7B,0x69,0x15,0xF5,0xCE,0x0F,0x2B,0x34,0xE6,0xD8,0x91,0x65,0x61,0x61, + + 0x6B,0x47,0x7B,0xBE,0x6E,0x25,0xEA,0xD0,0xAE,0xE9,0xEF,0xC8,0x10,0x99,0x9D,0xAF, + + 0x7B,0xCF,0xD3,0x0F,0x66,0xBB,0x27,0x5C,0x36,0xE4,0xD1,0x61,0xB8,0x34,0x30,0x18, + + 0x8D,0x1E,0x06,0x08,0x58,0x9B,0xC3,0x7A,0xFB,0xC2,0xF3,0xDF,0x20,0xB5,0x2D,0x19, + + 0x62,0x7D,0xF4,0x20,0xF0,0xA8,0xCF,0x6A,0x0A,0xB9,0x2D,0x00,0xA4,0x0A,0x5D,0x13, + + 0x88,0xA1,0xBD,0xDD,0xDB,0x0A,0x6B,0x63,0xF9,0xE7,0xC1,0x22,0x33,0xFB,0x89,0xDF, + + 0x1B,0x08,0x91,0x19,0xB8,0x4B,0x12,0xCA,0xF3,0xE6,0xFD,0x5F,0x2E,0x96,0x19,0x48, + + 0x0C,0x9C,0xED,0x33,0xC3,0x22,0xC3,0x9B,0x7E,0x4D,0xD2,0x9D,0x64,0x93,0xB5,0x26, + + 0x25,0xD2,0x31,0x1B,0xE2,0xDB,0x76,0x0A,0xA0,0x2C,0xE9,0xC9,0x78,0x2D,0x08,0x36, + + 0xE2,0x03,0xFB,0xB2,0x19,0x23,0x54,0x6C,0xCE,0x2E,0xD5,0xC5,0x33,0x7D,0xF4,0x69, + + 0x19,0xA0,0xB5,0xED,0x6A,0xF9,0x65,0x5C,0x46,0xC9,0xDD,0xC8,0x99,0xC0,0x90,0x73, + + 0xA4,0x9D,0xA4,0x99,0x5B,0xD1,0x91,0xDD,0x89,0x31,0xAC,0x25,0x1B,0x91,0x36,0x72, + + 0x69,0x70,0xD2,0xBD,0x39,0x9A,0x65,0xE6,0x94,0x9D,0xC2,0x9D,0x79,0xDA,0x57,0xCB, + + 0x4B,0x76,0xB0,0x74,0x80,0x33,0x03,0xC3,0x80,0x28,0xA0,0x54,0xC0,0x7F,0x33,0xB4, + + 0x43,0xC3,0x1C,0xBE,0xDA,0x42,0x1C,0xE7,0x1C,0x9F,0x0C,0x9B,0x9A,0x02,0x8C,0xE6, + + 0x72,0x99,0xC8,0x2E,0xD7,0xAB,0x2A,0xE7,0xC3,0xFB,0xB7,0xF7,0x23,0x15,0x06,0xD1, + + 0x5E,0x1C,0x9C,0xEA,0x4F,0x77,0x0C,0xDF,0x5B,0x00,0xDC,0xB4,0x0A,0xD1,0x91,0x3E, + + 0x4B,0x9C,0xC4,0xB3,0x49,0xC3,0xC2,0xC6,0x43,0xF9,0xEB,0xC0,0x7D,0xF0,0x0F,0xA2, + + 0xFA,0x96,0x4E,0xA5,0x30,0x3A,0xCC,0xDA,0xDF,0x51,0xCC,0xF3,0x3B,0x96,0x39,0xFA, + + 0xC3,0x79,0x8E,0x2C,0x60,0x58,0xCD,0xA4,0x17,0xA1,0x96,0xAE,0x24,0xD3,0x8E,0xAA, + + 0x49,0x49,0x0B,0xB8,0xD0,0x78,0xDE,0xB5,0x14,0xF4,0x86,0x4D,0x41,0x59,0x39,0xAC, + + 0xC3,0x15,0x07,0x89,0xCE,0x39,0xA2,0x9D,0x10,0x69,0x01,0x86,0x93,0x6B,0xF0,0xEA, + + 0x0A,0x98,0x99,0x59,0x46,0xB6,0x8B,0x88,0x48,0xDA,0xC1,0x91,0x41,0xD0,0x1C,0x37, + + 0xCB,0x9F,0x51,0x3F,0x5C,0x32,0x56,0xF4,0x6C,0xCC,0x72,0x8E,0x8D,0x19,0x10,0x60, + + 0x23,0xB2,0xE8,0xF4,0xBF,0x99,0x26,0x59,0xE6,0xD6,0x6F,0xD0,0xC3,0x0C,0xF6,0x82, + + 0x57,0x22,0xFF,0x71,0x51,0x9D,0xE0,0x1A,0xCC,0xFA,0xEF,0x12,0x46,0x4F,0x18,0xD2, + + 0xDD,0x1B,0x59,0xDA,0x1A,0xE0,0xDF,0x6A,0x8B,0xF0,0x1F,0xE5,0x3B,0xC0,0xC3,0xF9, + + 0x20,0xC0,0x20,0x07,0xBA,0x0D,0xE5,0xF2,0x18,0x6F,0xA6,0x44,0xAB,0x3D,0x9F,0x13, + + 0x88,0x8D,0x2C,0x12,0x55,0xB2,0x5A,0x8F,0x44,0xB1,0xAF,0xC5,0x2D,0x3C,0xA6,0xAD, + + 0x0B,0x80,0x31,0x94,0x9F,0xAA,0xA3,0x50,0xFE,0xAC,0x65,0xD9,0x29,0x43,0x41,0x0C, + + 0xA1,0x82,0x97,0xD2,0xB7,0xAE,0x60,0x58,0xA6,0x3C,0xEF,0x0F,0x3E,0x72,0x77,0x3C, + + 0x64,0xF0,0x9E,0xE3,0xFF,0x97,0xF6,0x22,0x4A,0x84,0x50,0x7C,0xDA,0x49,0xD7,0xF7, + + 0xCD,0x88,0x91,0x20,0xE4,0xB5,0x6E,0x57,0xAC,0x81,0xA2,0x72,0x3F,0xF4,0x1F,0x7B, + + 0x7A,0x57,0xF7,0x25,0xF6,0xDC,0x73,0xCB,0xA5,0xD9,0x24,0x85,0x9E,0x87,0x92,0x2C, + + 0xEF,0x8A,0x53,0xAC,0x6B,0xE4,0x43,0xC3,0x0A,0x68,0x87,0x5F,0x36,0x44,0x25,0x0F, + + 0x08,0x88,0xE6,0xFF,0x70,0x9D,0xCA,0xC2,0xA9,0x87,0x32,0x2A,0x2A,0x45,0x74,0xB2, + + 0x0D,0x04,0xBF,0x1F,0x76,0xF8,0xBB,0xC7,0xB0,0xBC,0xB2,0x3B,0x59,0x69,0x5D,0xFA, + + 0xE2,0x96,0xFD,0x27,0x3C,0x01,0xB3,0x3B,0xB6,0x11,0x23,0x68,0x16,0xA0,0x55,0x3E, + + 0x6C,0x2A,0x9E,0xEE,0xA1,0xA7,0xA9,0x00,0xF7,0x89,0xEC,0x4C,0xD2,0xE8,0x9D,0x34, + + 0x20,0x53,0x51,0xEF,0x18,0x7C,0xD6,0x08,0x6F,0xAC,0x64,0x9D,0x32,0x67,0x7D,0x24, + + 0x65,0x1C,0x55,0x1C,0xBE,0x00,0x6B,0x4A,0x1B,0x62,0x6F,0x0C,0x35,0xBC,0xDC,0x7A, + + 0xF6,0x21,0xF9,0x31,0x1F,0xA3,0xF3,0x6E,0x2A,0x63,0x73,0x5E,0xE2,0x41,0x15,0x63, + + 0xAF,0x3F,0xBE,0x6E,0x3E,0x2E,0xDB,0x09,0xA5,0x2E,0x85,0x53,0xDB,0xAF,0x74,0x7C, + + 0xD9,0x19,0x70,0x78,0xCC,0x78,0x38,0x48,0xA1,0x0D,0x21,0xA4,0x54,0x40,0x88,0xF0, + + 0xDE,0x0A,0xE7,0xE9,0x5D,0xBC,0x96,0xA3,0x49,0x7C,0x0B,0x92,0x02,0xF1,0xA1,0x70, + + 0x20,0x46,0xFE,0x87,0xB2,0x22,0x9F,0xAB,0x21,0x2F,0xF8,0x07,0xE8,0x20,0x2D,0x7B, + + 0x44,0xDE,0x52,0xE9,0x9B,0x6C,0xA9,0xF4,0x27,0x93,0x8A,0xE3,0x86,0xF3,0x61,0x33, + + 0x54,0xB4,0x50,0xA4,0xBB,0x12,0x21,0xD3,0xC7,0x55,0xC7,0x04,0x70,0x24,0xBF,0x22, + + 0x9B,0x06,0x38,0x28,0x8B,0x84,0x7D,0x84,0x9C,0xAE,0xDA,0xCE,0xFB,0x28,0x3B,0x7A, + + 0x12,0x3D,0xB7,0x38,0x43,0x10,0x79,0x09,0x03,0x49,0x80,0xF4,0x8E,0xB2,0xDC,0x6A, + + 0x1F,0x44,0x5C,0xFB,0x0F,0xC6,0x7E,0xCC,0xC1,0x02,0x85,0xD0,0x0A,0xF8,0xDD,0x82, + + 0x89,0x67,0x19,0xBE,0xAE,0x17,0x7E,0xAF,0x68,0xD8,0x76,0xB6,0x2F,0x05,0x34,0x84, + + 0x1B,0x6D,0xD0,0xA6,0xBD,0x2B,0xE1,0xBB,0xED,0x99,0x6A,0x40,0x80,0x78,0xFA,0x87, + + 0xAA,0x4A,0xB0,0xF1,0xDE,0xCE,0x7D,0x8B,0xFC,0x5A,0xA1,0xCD,0x03,0x27,0xFA,0xE8, + + 0x93,0x80,0x18,0xBB,0xCA,0xBB,0xE0,0xBB,0x31,0x7A,0xDE,0x4C,0x85,0x26,0xA6,0xD2, + + 0x23,0x63,0x26,0xD6,0xFE,0xD0,0x22,0x6E,0x3A,0x55,0xAC,0xEF,0x16,0x2F,0xD1,0xEB, + + 0x8E,0x62,0x96,0x4D,0x55,0x22,0x56,0x98,0x86,0xEE,0xA9,0x0D,0x05,0x88,0xB3,0x58, + + 0x0F,0x41,0x81,0x7B,0x45,0x13,0xCC,0xA9,0x4F,0x23,0x89,0x53,0x1F,0x5D,0xD4,0x7E, + + 0x58,0x62,0x2F,0xC3,0x05,0x6B,0x69,0x99,0x8F,0xA5,0xAC,0x11,0x47,0x2C,0xC0,0x18, + + 0x0D,0xFF,0x05,0xB5,0xF9,0xCA,0x77,0x28,0x2B,0x85,0x35,0xD5,0x34,0x76,0xB7,0x21, + + 0xA0,0xFE,0x3F,0x40,0xE6,0x94,0x46,0x03,0xC1,0xEA,0xC0,0xAC,0xAD,0xA9,0xD5,0x92, + + 0x21,0xDD,0x8F,0xD1,0xB3,0xB0,0x77,0xD0,0x2C,0x49,0xAF,0xF0,0x99,0xA8,0xB2,0xB4, + + 0x76,0xFE,0x41,0xEF,0x97,0xB3,0x2B,0x21,0x44,0x55,0x62,0x0E,0xDA,0xFC,0x1E,0xD2, + + 0x06,0xD0,0xFE,0x3A,0xB1,0x41,0xC0,0x91,0xE1,0x04,0x46,0x95,0x62,0xC2,0x2F,0xA1, + + 0xD1,0x45,0x48,0x44,0xB6,0x2B,0x4A,0x83,0x23,0x98,0x16,0xCF,0x57,0x14,0xA2,0x5E, + + 0x5C,0xA9,0xFF,0x3A,0x31,0x54,0x63,0x5F,0x61,0xE7,0x8F,0x4C,0xB1,0x62,0x37,0x67, + + 0x68,0xE2,0xA1,0xD3,0x6F,0x66,0x0F,0x54,0x28,0x26,0xE7,0xB0,0xF1,0x6A,0x14,0x20, + + 0xE3,0x19,0xC9,0x73,0x70,0x25,0x31,0x32,0x90,0xFC,0x52,0x34,0x0B,0x95,0x9C,0x67, + + 0x61,0x78,0x35,0x2D,0x7D,0x86,0x7B,0x98,0x9F,0xF6,0x4E,0xC2,0xA4,0xC8,0xB8,0xB8, + + 0xE4,0xA5,0x7C,0x73,0xB6,0xF5,0x4D,0x26,0x9A,0x04,0x85,0x4F,0x27,0xB7,0x75,0x34, + + 0x7C,0xA8,0x19,0x63,0xF3,0x8A,0x45,0xAF,0x03,0xE0,0x09,0xCE,0xBD,0xB6,0x1C,0x7B, + + 0x1A,0xA3,0x2E,0xCC,0xE6,0x0C,0xEB,0x19,0x07,0x47,0x50,0x90,0xE2,0x97,0x69,0xA9, + + 0xD3,0x4D,0x5A,0x47,0x37,0xD0,0x64,0x2C,0x20,0x42,0xEF,0x81,0x7A,0xB9,0x71,0x0F, + + 0x18,0xA1,0x6F,0x0F,0x19,0xDA,0x40,0x7A,0x9B,0x7F,0xEB,0x6F,0x9A,0xB5,0x15,0x56, + + 0xCF,0x41,0xD9,0x7D,0x70,0x5E,0xDB,0x4B,0x3F,0x40,0x49,0x62,0xB7,0xC2,0xB3,0xA4, + + 0xAF,0x12,0x3B,0xB5,0x54,0x9F,0x33,0xBB,0x0B,0x24,0x40,0x5A,0x8D,0xD1,0x64,0x61, + + 0x0D,0x65,0xF2,0xA5,0xDA,0x50,0xFF,0x4B,0x43,0x41,0xCA,0x85,0x9A,0xD0,0xB2,0x80, + + 0x2D,0x1E,0x17,0xFB,0xDA,0x93,0x95,0x67,0x72,0x51,0x07,0x56,0x94,0xAF,0x53,0xA1, + + 0x33,0xB8,0xAB,0xA1,0xD1,0x73,0x1F,0x4C,0xE1,0x57,0xE3,0x90,0x39,0xB2,0x1A,0x2F, + + 0x2E,0xBF,0xBA,0xFD,0x49,0xB4,0xC0,0x26,0x3E,0x57,0xF4,0xF4,0x05,0x41,0x12,0xCA, + + 0x23,0xBE,0x84,0xD1,0x37,0x25,0x23,0xE3,0x9D,0xA8,0x7B,0xC1,0x9A,0xA4,0xB8,0x61, + + 0x27,0x00,0xFA,0x02,0x78,0xA7,0xB6,0x1A,0xC0,0x49,0x0A,0xE7,0x26,0xB7,0x6A,0xD5, + + 0xC8,0x63,0xA0,0x6E,0xF3,0x45,0x7B,0x4F,0x16,0xF3,0x6E,0xCC,0xC0,0x37,0x10,0x87, + + 0x43,0xD9,0x80,0x4B,0xC4,0x00,0x96,0x55,0x60,0xAC,0x84,0xEA,0x24,0xD5,0x03,0x64, + + 0x29,0xAC,0xD5,0x9C,0x3F,0xA9,0xC1,0xBC,0xE9,0x19,0x18,0xA9,0x85,0xE8,0x66,0xCF, + + 0xF4,0xEF,0x5C,0x8D,0x40,0xD2,0x82,0x09,0xFC,0xDA,0x06,0x4D,0xF4,0x3A,0x81,0x61, + + 0xA9,0x59,0xC4,0xE2,0x8A,0x7B,0xC0,0xB8,0x35,0x1A,0x20,0x18,0x33,0x76,0xC4,0x0E, + + 0xB8,0x1F,0xF8,0x09,0x18,0x31,0x21,0x93,0xA2,0xCB,0x7A,0x49,0xAF,0x1F,0xA2,0x4A, + + 0x2B,0x15,0xFE,0xDE,0x7B,0xE6,0x9F,0xFC,0x2F,0x0E,0x84,0x0F,0x43,0xA0,0xC0,0xA4, + + 0x43,0x2F,0x45,0x31,0x02,0xC5,0x6C,0x18,0x55,0x4C,0x7C,0x27,0x41,0xFF,0x9B,0x79, + + 0xF3,0x1D,0xFA,0x20,0x9B,0xEB,0x1A,0xFD,0xAF,0x1C,0x8D,0x6E,0x10,0x6E,0xB1,0xF1, + + 0x30,0x2D,0xDE,0x37,0x94,0xC2,0xD6,0xC6,0xA5,0x6F,0xE6,0x17,0xBF,0x41,0x1A,0x2C, + + 0xA6,0x20,0x57,0x65,0x52,0xC2,0x46,0xAC,0xAE,0x37,0xAE,0x54,0xAA,0x4C,0xB3,0xF2, + + 0x27,0xC2,0x9F,0xD2,0xFC,0xAF,0x57,0xD2,0x06,0x42,0x91,0xA2,0x3D,0x08,0x3E,0xE0, + + 0xFD,0x5E,0x52,0x68,0xFD,0x62,0x67,0xA8,0xD5,0x6C,0x73,0x92,0x22,0x1E,0x01,0xE2, + + 0xD0,0x3B,0xDA,0xF6,0xA2,0x0B,0x66,0x56,0xAD,0x05,0x63,0x58,0x2E,0xFF,0x9B,0xAC, + + 0xCF,0x32,0xB8,0x5E,0x1B,0x28,0x6E,0x4D,0x37,0x38,0x2C,0x28,0xC4,0xDA,0x47,0xFC, + + 0x79,0x22,0x70,0xB6,0xE6,0xE6,0xCA,0xD2,0xAE,0x69,0x71,0x20,0xF8,0x3A,0x16,0x40, + + 0x75,0x18,0x97,0x6F,0x6B,0x9F,0xAD,0xE0,0x66,0x18,0xEB,0x97,0x3C,0xD6,0x74,0x32, + + 0xE7,0x19,0xDC,0x3A,0xE9,0x0B,0x51,0xDB,0xA8,0x6E,0xA4,0x1A,0xB7,0x29,0x6C,0x2A, + + 0x09,0xA9,0xE7,0x2F,0xBC,0x56,0x0C,0xCB,0xAD,0x89,0xAC,0x4D,0x46,0x48,0x65,0x2E, + + 0x0C,0x1E,0xB5,0xFC,0xF4,0x07,0x6D,0x1C,0xEF,0x65,0x08,0x9E,0xB4,0x45,0xAA,0xD9, + + 0x0E,0xCD,0x95,0xD7,0xB3,0x74,0x93,0xB1,0x1D,0x5F,0x83,0xC0,0x34,0xF1,0x57,0x66, + + 0xB7,0x87,0x39,0x4E,0xE6,0x44,0xCD,0x5B,0xEF,0x33,0x49,0xDE,0x94,0x43,0xDB,0x0F, + + 0xBA,0x86,0xA1,0x21,0x77,0xA0,0x6C,0x4E,0xA4,0x4C,0x36,0xDE,0xFE,0x2D,0xE7,0x4F, + + 0xCA,0x83,0xB8,0x4F,0x98,0x3E,0xC8,0xCE,0x39,0x33,0xE2,0x6D,0xE6,0x43,0xEF,0x5F, + + 0xCB,0x11,0x95,0x63,0x6A,0xCC,0xC0,0xCA,0xA7,0x60,0x20,0x51,0xA0,0xEF,0x27,0x5A, + + 0xD9,0x31,0x08,0x23,0xE1,0xD3,0xE9,0xA6,0xD9,0xBE,0x4F,0xD9,0x1C,0xFD,0x03,0xED, + + 0xFC,0x0E,0xBD,0x65,0x05,0x6C,0xBC,0xA7,0x79,0x7C,0x03,0x87,0x15,0x5E,0x1D,0x7C, + + 0x51,0xF1,0x0E,0x4D,0x0F,0x13,0x53,0x8E,0xE7,0xB2,0x4A,0xD9,0xDA,0x2D,0x7D,0x9B, + + 0xE9,0x2E,0xFB,0xA2,0x5E,0x52,0x77,0x63,0xED,0x7C,0xAF,0xC9,0x9F,0x92,0x42,0xF2, + + 0xA2,0x30,0x76,0xD9,0x5A,0x1F,0x4A,0xCB,0xE9,0x52,0x44,0xFE,0x97,0x97,0x4A,0xAD, + + 0x84,0xD7,0xB4,0xD4,0x5C,0x02,0x7B,0x72,0xAF,0x54,0xF8,0x8B,0x56,0x77,0xF1,0xC4, + + 0x4F,0x4B,0xF4,0x54,0xDD,0x87,0x75,0xA3,0xC6,0xD5,0x0A,0x94,0xB5,0x7C,0x6E,0xAF, + + 0x27,0x27,0x69,0x5A,0x5E,0xDD,0xDD,0xE0,0xCB,0xB3,0xC3,0xAE,0x97,0x7C,0x30,0xE8, + + 0xD7,0x05,0x80,0x4A,0x08,0xBB,0x25,0xC5,0x0D,0x98,0xC8,0x8B,0xB4,0x60,0x04,0x4A, + + 0x8E,0x11,0x0B,0x6F,0x59,0xAF,0x58,0x4B,0x5D,0xD2,0xAF,0xA0,0xBB,0x0D,0xF3,0x71, + + 0x45,0x62,0x22,0x87,0xD7,0x1B,0x6F,0x73,0x87,0x3B,0xA2,0x91,0x90,0x0F,0x2E,0x68, + + 0x67,0x30,0x8F,0x32,0xD6,0x1A,0x19,0x7A,0xD9,0xD8,0x59,0xCD,0x16,0x5D,0x40,0xFA, + + 0xAA,0x38,0xB6,0xAC,0x7A,0x67,0x48,0x94,0xA6,0x21,0x09,0x9C,0x1C,0xA9,0x16,0xFD, + + 0xC6,0x60,0xEC,0x22,0x87,0x46,0x5E,0xE3,0xA7,0x5C,0x69,0xFF,0x94,0xFE,0xF3,0xCC, + + 0x47,0x43,0xD2,0x32,0x3F,0xBA,0x0F,0x6F,0xBE,0x07,0xDA,0x90,0x67,0x55,0x17,0x4A, + + 0x97,0x32,0xE7,0xC1,0xDB,0x4B,0xDF,0xE8,0xC3,0xBB,0xDA,0x5E,0x7F,0xCF,0x5E,0x3D, + + 0x08,0xAB,0x04,0x00,0x04,0x58,0xB8,0xAA,0x2B,0xD4,0x69,0x03,0xF1,0x1F,0x52,0x3F, + + 0x7D,0x54,0x08,0x1D,0xB8,0xA0,0x46,0x3F,0x0D,0x0F,0xC0,0x24,0xBA,0x19,0x51,0x2F, + + 0xEB,0x21,0x93,0x31,0xB3,0x42,0x11,0x32,0xD9,0xF6,0x3D,0xA1,0x80,0x8F,0x59,0x3A, + + 0xAB,0x41,0xE2,0x75,0x9D,0x63,0x78,0xC1,0xC9,0xE2,0xB9,0x6C,0xAE,0x43,0xF8,0xBF, + + 0x20,0xA9,0xB1,0x59,0xFA,0xD4,0x52,0x9A,0xA6,0xDB,0x74,0x95,0xF1,0x24,0xC8,0xAC, + + 0x03,0xD1,0x07,0x49,0x1E,0xD5,0xFB,0x9F,0x65,0x1A,0xE2,0xF3,0xA4,0xEE,0x43,0xBD, + + 0x8A,0x02,0xA1,0x58,0xA1,0xD6,0x58,0x8E,0x7F,0x39,0xEE,0xE1,0x82,0x79,0x03,0x2E, + + 0xC0,0xF5,0xDF,0x48,0xDB,0xF7,0xB7,0x9F,0xB0,0x18,0xDD,0xF2,0x2C,0x27,0x01,0x4D, + + 0xF7,0x6B,0x03,0xC1,0x2B,0x57,0x46,0xDB,0x62,0xC5,0x49,0x38,0x23,0x6E,0x1C,0x7A, + + 0xF6,0xD4,0x32,0xEF,0x54,0x3B,0xAF,0x05,0xFE,0x7C,0x8A,0x5E,0xEA,0x0C,0x65,0x6B, + + 0x7F,0xF7,0x3B,0xFE,0x8D,0x38,0x45,0x89,0x23,0x49,0xC8,0x2D,0x5A,0x22,0xDF,0xE7, + + 0x74,0xAA,0x33,0xEE,0xC4,0x39,0x4F,0xBD,0x99,0x23,0xA3,0xD6,0x75,0x66,0x3C,0x84, + + 0x39,0x33,0x7E,0x50,0xE4,0xFC,0xC6,0x83,0xDF,0x73,0xD1,0xD0,0x92,0x64,0xF2,0xAB, + + 0x10,0x16,0xC4,0x40,0x01,0x9D,0x70,0x92,0x36,0x52,0x84,0x9E,0x5F,0xD0,0xFB,0xBA, + + 0x99,0x1C,0xA2,0x51,0xB9,0xFE,0x0F,0x82,0xDC,0x51,0x73,0x7E,0xA4,0x0A,0xB1,0x3F, + + 0x60,0xC5,0x76,0x44,0x2D,0x9F,0x9E,0x8E,0x5A,0xA0,0x1B,0x65,0x68,0xE2,0x95,0x16, + + 0xE8,0x61,0x68,0x86,0x38,0x5C,0x05,0xB3,0x0C,0x14,0xAA,0x65,0x18,0x3A,0x52,0x02, + + 0x29,0xB5,0x4F,0xD3,0x3F,0x9E,0x62,0x80,0xCD,0x5C,0x8A,0xE8,0x9A,0xB9,0xE3,0x70, + + 0x6A,0x32,0x65,0x8C,0x4D,0xB8,0x33,0x95,0x6C,0x5F,0xEB,0xED,0x19,0xCA,0x1F,0x0F, + + 0x69,0xB2,0x83,0x17,0x05,0xB8,0x63,0x80,0xC3,0x85,0xA3,0x74,0x7E,0xD5,0xC0,0xD3, + + 0x29,0x1E,0x9A,0xCD,0x5E,0x24,0x15,0x06,0xC3,0x1B,0xB7,0x60,0x72,0xB4,0x4C,0xD2, + + 0x21,0x2E,0x9A,0xC1,0x96,0xD5,0x56,0x16,0x21,0x7A,0xE6,0x51,0x84,0x88,0x63,0x98, + + 0xF3,0x58,0xAC,0xCD,0x7E,0x26,0xE4,0x07,0x85,0x19,0xEA,0xD5,0xFA,0x89,0xB7,0xD8, + + 0x0E,0x9E,0x6E,0xC0,0x89,0xF7,0x63,0x12,0x59,0x78,0xCB,0x97,0x0C,0xAA,0xE1,0x79, + + 0xF2,0x08,0xBE,0x2C,0xD5,0xB8,0x69,0x30,0x6C,0x48,0x5E,0xEC,0x38,0x8D,0x1F,0xAE, + + 0xE1,0x28,0x26,0x84,0xBB,0x6C,0x14,0x7A,0xEA,0x1F,0x56,0xA3,0x60,0x62,0x3D,0x7A, + + 0x7A,0xBE,0x6F,0x95,0x38,0x7A,0xC5,0x30,0xEC,0xBA,0xDB,0xAF,0xFC,0x8F,0xB9,0x68, + + 0x41,0x1F,0xD5,0xFF,0x9B,0xF6,0xA8,0x9D,0x68,0x56,0xE7,0xCF,0x5E,0x7F,0xB3,0x28, + + 0x6A,0x2E,0x7A,0xD8,0xA6,0xFC,0xF1,0x0B,0x0F,0x73,0x02,0x12,0x93,0x74,0xCE,0x1E, + + 0x2F,0x1B,0xEE,0xCD,0x5F,0xBD,0xA7,0x1A,0xFC,0x52,0x09,0x40,0x90,0x19,0xFB,0xB9, + + 0x1E,0x15,0x13,0xDC,0x2D,0x9E,0x5F,0x0A,0xB8,0x51,0x40,0x1E,0x7E,0xD3,0x47,0xB7, + + 0xC8,0x3F,0x62,0xCD,0xC6,0xBF,0x2C,0x1B,0x4B,0x50,0xE5,0x7A,0x10,0xB9,0xB6,0xF1, + + 0x68,0x5D,0x18,0xF9,0x1A,0xE6,0xCF,0x87,0x8E,0xCD,0x49,0x01,0xF5,0x9F,0x0E,0x27, + + 0x81,0x2E,0x2C,0xD1,0x95,0x81,0xC7,0x4C,0x6B,0x1E,0xE0,0x97,0x3E,0x99,0x77,0x37, + + 0x6F,0x43,0x22,0x78,0xB6,0x4F,0xCA,0x5C,0xAC,0xCF,0x1D,0xA3,0x84,0x0F,0x8D,0x71, + + 0x6E,0x02,0x05,0x91,0x85,0x5E,0x86,0x02,0xA9,0x6C,0xBD,0x35,0xA5,0xF8,0x61,0x24, + + 0xED,0x6E,0xC1,0x5F,0x55,0x14,0xAA,0x95,0x2E,0x0B,0x14,0x95,0x90,0x6F,0x22,0xF2, + + 0xA6,0x95,0xDB,0x4E,0x34,0x35,0xAD,0x81,0xE4,0x6A,0xA6,0xE5,0x47,0x68,0x31,0x4B, + + 0x90,0x2B,0x22,0x5F,0x73,0x36,0x9B,0x95,0x56,0x09,0xF5,0xE0,0x3D,0x00,0x4F,0x97, + + 0x84,0x84,0x3D,0x5A,0x74,0xD7,0xCB,0x80,0x9C,0x68,0x87,0xE5,0x6A,0x18,0x96,0x68, + + 0xE7,0x29,0xF2,0x78,0x10,0xC6,0xA4,0x54,0x26,0x09,0x4F,0x48,0xB7,0xC2,0x48,0x1A, + + 0x0E,0xE9,0x2F,0xF6,0xAE,0xE4,0x2C,0x13,0xA6,0xF8,0xFB,0x58,0xB6,0x51,0x10,0x5E, + + 0x7D,0xE4,0x83,0x0E,0x11,0xEC,0x4D,0x1F,0xAF,0xDA,0xF2,0x49,0x37,0xA0,0xAB,0x13, + + 0x46,0x2F,0x54,0xBF,0x74,0xCB,0x01,0x8A,0xFD,0x64,0xFA,0x59,0x36,0x33,0x61,0x42, + + 0x8E,0x8E,0x16,0x43,0x35,0xDC,0xB0,0x98,0xC5,0x43,0x5E,0x9E,0x5C,0x1A,0x69,0x4B, + + 0xC7,0x55,0xDA,0x52,0x0C,0xFD,0xFB,0x9D,0xD2,0xA2,0xFA,0x8D,0x89,0x46,0x45,0x8A, + + 0x8D,0x8D,0xF4,0x43,0x73,0xFE,0x54,0x99,0xDB,0x41,0x8D,0xF0,0x3F,0x68,0x60,0x59, + + 0x9F,0x8B,0x68,0x56,0x1A,0x9F,0xD8,0x9C,0xC8,0xA0,0x9C,0x77,0x3E,0x40,0x1A,0xD7, + + 0x4F,0x9F,0xA6,0x40,0x20,0xB4,0x1C,0x40,0xE5,0xB4,0x6D,0x4E,0xCB,0xBD,0x12,0xB6, + + 0x06,0x13,0x1D,0x66,0x94,0x3B,0x62,0x70,0x75,0xD7,0x43,0x16,0x98,0x91,0x24,0xB1, + + 0x4F,0x17,0x25,0xC1,0xA0,0xB4,0x1D,0xA5,0x65,0xDC,0xCB,0x76,0xE6,0xBF,0x13,0xB6, + + 0x85,0x9E,0x7A,0x75,0xCA,0xB3,0x35,0x4C,0x44,0xD2,0x51,0xB5,0xFD,0x9F,0x1C,0x62, + + 0xD9,0x2B,0x24,0xC3,0xDC,0xD4,0xD2,0x00,0x1B,0xDB,0xAE,0xE7,0xF8,0x5B,0x04,0xD5, + + 0xA4,0x9A,0x0D,0xD2,0x09,0x95,0xAA,0x10,0x57,0xDA,0xC6,0x05,0xB5,0x09,0x0D,0x01, + + 0x25,0xD2,0x2B,0xC3,0x0D,0xF6,0xBC,0x01,0xAB,0xD9,0x13,0x16,0x3C,0xE6,0x05,0xB1, + + 0x81,0x97,0x86,0xD6,0xC4,0xD9,0x3E,0x11,0xE1,0xD5,0x40,0xA8,0x1C,0x21,0xA1,0xCC, + + 0xBE,0x33,0x7D,0x9A,0x47,0xBE,0x0E,0xAF,0x68,0x88,0x56,0xB7,0x81,0xFB,0x09,0x6B, + + 0xB1,0x59,0xBE,0xFC,0x8E,0xDC,0x7C,0x5A,0x61,0x99,0x9E,0xBA,0x02,0xF9,0x04,0x8B, + + 0x64,0xA2,0xFC,0x8F,0x3E,0xF2,0x2D,0x43,0x0F,0x97,0x0D,0xBF,0x83,0xDA,0xC7,0x11, + + 0x2D,0x2B,0x97,0x74,0x11,0xB6,0x3A,0x84,0xAF,0xD0,0x18,0x7A,0xCE,0xA4,0x66,0x35, + + 0x8E,0x63,0xA6,0xF1,0x36,0xD0,0x76,0xF7,0x91,0x2C,0x51,0x71,0x15,0x4A,0x4E,0x24, + + 0x07,0x22,0x49,0x9E,0x82,0xB6,0xC5,0xE7,0x8E,0x2D,0x4C,0xA1,0x14,0x18,0x6F,0x35, + + 0x0F,0x41,0xCF,0x0D,0x6A,0x4D,0x8A,0xF6,0x09,0x2E,0xF6,0x1C,0x2C,0x55,0x43,0x20, + + 0x8A,0x20,0xA9,0xC0,0x3B,0x6B,0x91,0xE6,0x76,0x2F,0xC7,0x0E,0x17,0xFB,0x5E,0x32, + + 0x40,0x4C,0x24,0xF7,0x9C,0x61,0x28,0x88,0xE3,0x01,0xB9,0x77,0xD4,0x7C,0x2F,0x11, + + 0x6A,0x75,0xB2,0xE2,0x82,0x9E,0xB8,0x3E,0xCD,0x4C,0xE0,0x13,0xC0,0xCD,0x60,0xF2, + + 0x50,0xA9,0x29,0x3A,0xA3,0xDD,0xE4,0x20,0xD4,0x76,0x38,0x76,0x5C,0x3E,0x8F,0xD7, + + 0x13,0x00,0xD7,0x37,0x4C,0x88,0x67,0xD3,0x6D,0x4E,0x39,0x7F,0x44,0xCF,0x48,0xF7, + + 0x61,0x24,0x48,0x41,0x71,0xD4,0xD2,0x0F,0x63,0x85,0xC0,0x84,0x1A,0x64,0x30,0x74, + + 0x8C,0x07,0xF0,0x04,0x17,0x2A,0x59,0x83,0x89,0xEE,0xB0,0xB6,0xD5,0x90,0x39,0xC3, + + 0x83,0x71,0xB9,0xC7,0x97,0x66,0x7B,0xB1,0x61,0xCE,0x8F,0x72,0xDA,0x66,0xFE,0x50, + + 0x0E,0x0B,0xF1,0x85,0x64,0x28,0x3E,0x79,0xA8,0x82,0x49,0xF1,0x8F,0x7C,0xE1,0xF3, + + 0x63,0xAE,0xA7,0x0C,0x73,0x0C,0x82,0xE8,0x0C,0xAC,0x36,0x62,0x87,0x55,0x54,0x2E, + + 0xD4,0xA2,0x0A,0x00,0xBA,0xA4,0x8A,0x97,0xBE,0xA9,0xC4,0x18,0x59,0xC2,0x0A,0xF8, + + 0x52,0x1A,0x7C,0x09,0xC0,0x40,0x6B,0x20,0x25,0x78,0x78,0x5A,0x58,0xBD,0xBD,0x7B, + + 0xE2,0xAE,0x6F,0x3A,0x2A,0xA6,0xA7,0xCA,0x6A,0x7B,0x0F,0x99,0x5C,0x2B,0x2A,0x56, + + 0xCC,0xF8,0xA2,0x08,0x56,0xA7,0xFD,0x99,0xA6,0x41,0x92,0x6C,0x5E,0x68,0x14,0xCA, + + 0x0F,0x80,0x48,0x3E,0x5A,0x6D,0x68,0x68,0xCE,0x5B,0x9A,0x78,0x5F,0x69,0xA5,0xB8, + + 0x40,0x4E,0x44,0xAF,0x18,0x66,0x0D,0x5A,0x4A,0xE5,0x57,0xE9,0x86,0xCF,0x35,0xC7, + + 0x60,0xF9,0xB3,0x3F,0xD8,0xF0,0x05,0x63,0xCB,0xE4,0xA3,0xF9,0x83,0x79,0xE4,0xBF, + + 0x04,0x67,0x86,0x76,0x77,0x34,0x2C,0x84,0x63,0x60,0x1D,0xB4,0xD3,0xCB,0xAD,0x97, + + 0x80,0x50,0xB6,0x96,0x2D,0x11,0xBE,0x52,0x71,0x9C,0x9C,0x48,0xF0,0x33,0x01,0x95, + + 0x38,0x56,0x81,0xD1,0x57,0xCC,0x28,0x90,0x64,0x4D,0xB5,0x5D,0xF0,0x89,0x45,0x95, + + 0x4C,0x52,0x0D,0x85,0xA1,0x31,0x8D,0x1E,0x16,0x03,0x1E,0xB9,0x0C,0xD2,0x67,0x31, + + 0xBE,0x54,0x04,0xD4,0x37,0x30,0x94,0xFD,0xC6,0xFF,0xD4,0xE4,0x72,0x74,0x33,0xA3, + + 0xC9,0xBD,0xCC,0xE0,0x00,0x3A,0x23,0x01,0xDC,0x07,0xDC,0xF4,0x73,0x75,0xAD,0x4B, + + 0x80,0xC0,0xC3,0xFA,0xF9,0x74,0xA8,0xF9,0xC0,0x49,0xD5,0xE5,0xF2,0x76,0x3F,0x31, + + 0xE7,0x9C,0x97,0xD0,0x14,0x76,0xF2,0x8A,0x3E,0x8B,0xDD,0xF5,0xF3,0x77,0xF3,0x76, + + 0x2C,0x75,0x96,0xCC,0xB8,0x3E,0x2B,0x99,0xEC,0x47,0x02,0x5F,0x54,0xA5,0xAA,0xEA, + + 0xA7,0x58,0x8A,0x1B,0x18,0xAE,0xA6,0x9C,0x80,0x3D,0xFE,0xFC,0x64,0xF2,0x97,0x82, + + 0x2C,0x4E,0x00,0x3B,0x59,0xE1,0xAF,0x5A,0x4B,0x4A,0xC1,0x89,0x13,0x3B,0xB0,0x82, + + 0x0A,0x9E,0x3B,0x62,0xFA,0xC8,0x8E,0x4A,0x65,0x66,0x1B,0x5F,0x7B,0x73,0x6D,0x26, + + 0x95,0x18,0xA6,0xAC,0x70,0x31,0x6D,0xB6,0x6C,0xAC,0xD6,0xEC,0x7A,0x7C,0xB9,0x87, + + 0x96,0xE1,0x30,0x5E,0xE6,0x82,0x0E,0x12,0x90,0xF6,0xDE,0xFC,0x7B,0x7D,0x45,0xE7, + + 0x5C,0x6B,0x6B,0x5F,0xBB,0x34,0xE7,0x18,0x55,0x8E,0xD7,0xED,0xFA,0x7E,0xE4,0xB7, + + 0x7E,0x11,0xF7,0x23,0xDB,0x33,0xA2,0x61,0x80,0x20,0xDF,0xFD,0xFB,0x7F,0x00,0xF3, + + 0xE4,0x00,0x44,0x21,0x15,0xC0,0x8C,0xAB,0x60,0xF4,0x8E,0x03,0x1E,0x81,0x28,0xE3, + + 0xDD,0xA1,0xA9,0xC9,0xF6,0xA5,0xDC,0xC1,0xE6,0x4A,0x86,0x13,0x1C,0xA0,0x89,0x89, + + 0xEF,0x16,0x5B,0x05,0x9C,0xED,0x91,0x2D,0x48,0x4F,0xE9,0x23,0x9E,0xA3,0x77,0x1C, + + 0xD7,0xCD,0xBC,0x65,0x1B,0xC6,0x3D,0xB4,0xE1,0xB4,0xE1,0xD1,0x57,0xEB,0x3E,0xD9, + + 0x16,0x2B,0x98,0xC2,0x4A,0x10,0x57,0x63,0x2D,0xB0,0xD0,0x09,0x82,0x3B,0xDE,0xA3, + + 0xEF,0xD5,0xB8,0x4A,0x01,0x10,0x9B,0x89,0xC5,0x39,0xAD,0xD6,0xA0,0x85,0x02,0xB0, + + 0x62,0x29,0x71,0xE7,0x8E,0xE7,0x32,0xA5,0x54,0xC5,0x56,0x98,0xBD,0x99,0x17,0x61, + + 0x02,0x91,0x20,0x68,0xDC,0xE5,0x41,0x54,0x6B,0xCA,0xA7,0x98,0x97,0x4C,0x43,0xAA, + + 0xDA,0x37,0xDB,0xDE,0x50,0x29,0x36,0xAA,0xA5,0x8C,0x76,0x4C,0x1D,0xF8,0x9E,0x78, + + 0xFA,0xEC,0x80,0xCE,0x41,0x21,0x9E,0x96,0xA6,0xAD,0xC2,0xBC,0x5C,0x91,0x43,0x54, + + 0x2D,0xEF,0xA0,0x45,0x11,0xC9,0x26,0xD8,0x48,0x67,0xCB,0x4D,0x9D,0xE8,0x13,0xE4, + + 0x0E,0x85,0xBB,0x55,0x11,0xA3,0x03,0xC8,0x6E,0xAE,0x81,0xDD,0x5F,0xE3,0x5D,0x14, + + 0xFF,0x50,0x64,0xCE,0xF7,0xF4,0x89,0x4D,0xEF,0x33,0x0F,0xEA,0x35,0x93,0xC1,0xFF, + + 0xDA,0x93,0xAE,0x2D,0x08,0xC1,0xEA,0xBD,0x4D,0x38,0xFA,0x7E,0x79,0xED,0x3A,0x5F, + + 0x03,0xED,0xA1,0x3E,0xD5,0xA5,0x1B,0xA9,0x48,0x3B,0xB5,0x4B,0xD6,0xEF,0x16,0xA8, + + 0x57,0x5B,0x89,0x5B,0x9E,0xFF,0x7F,0x3C,0x4E,0xC1,0xFB,0x7F,0xDF,0xEF,0x15,0x60, + + 0xF9,0x04,0xF4,0xF5,0x2C,0x3A,0xD0,0x51,0xC7,0xB5,0x3D,0xD4,0xD7,0x5D,0x0B,0x70, + + 0xC5,0x40,0x18,0xF6,0x3D,0x61,0xDB,0x41,0xC6,0x8C,0x87,0x56,0x35,0x7A,0x5D,0xB1, + + 0x94,0x4E,0x62,0x79,0x55,0xD4,0x08,0x24,0xC0,0xAF,0x21,0xF6,0xD0,0xE9,0xD6,0xB7, + + 0x6C,0x9C,0x02,0x47,0x34,0x12,0xDE,0xF7,0x46,0xEE,0x08,0xB5,0xF1,0x78,0x0C,0x44, + + 0xDA,0xD5,0x9A,0xC0,0xD7,0x37,0xF0,0x13,0xD9,0xD7,0xF4,0xE6,0x76,0xF4,0xC0,0x90, + + 0xA4,0x41,0x94,0xA8,0x77,0x3F,0x87,0xCD,0x98,0xDB,0xFC,0xF6,0x77,0xF5,0x89,0x43, + + 0x5A,0xB6,0xCA,0x34,0x3A,0x4B,0x25,0x09,0x1D,0x03,0xF5,0xE7,0xF6,0xF6,0x8F,0xCC, + + 0x69,0x3C,0x3A,0x55,0x6A,0x08,0x15,0x75,0x1B,0x96,0xFD,0xF7,0xF7,0xF7,0x5F,0xAD, + + 0x8D,0x89,0x9E,0xEE,0x8C,0xB0,0x51,0xEE,0xCF,0xC5,0x54,0x48,0x6C,0xB7,0x10,0x9C, + + 0x67,0xDD,0x57,0xEC,0xB3,0xDC,0x0C,0x8B,0xE9,0x76,0xF4,0x49,0xDE,0xF4,0x5F,0xD8, + + 0x0F,0x85,0xD6,0xFD,0x32,0xDF,0x54,0xFA,0x4F,0x9B,0xD7,0xEF,0xF2,0xF7,0x77,0x9F, + + 0xE7,0xFF,0xD6,0xED,0x33,0xDE,0x9F,0xC8,0x4E,0x78,0xF5,0xC0,0x5E,0xFD,0x00,0xC2, + + 0xCF,0x33,0x9E,0x4C,0x1F,0xCE,0xDE,0xD5,0x05,0xCB,0xF6,0xEE,0x7E,0xFC,0x89,0x2B, + + 0xF5,0x8D,0x02,0x5E,0xC3,0x9D,0x24,0xFB,0xCC,0x93,0xFE,0xFE,0x7F,0xFD,0x05,0xD1, + + 0x78,0x2A,0xBD,0xCE,0x1D,0xFF,0x73,0x69,0xEF,0xB1,0xF7,0xEF,0xFE,0xFE,0x11,0x41, + + 0xA9,0x9F,0x43,0x9D,0x3C,0x12,0x4E,0x3D,0x13,0xD9,0xFF,0xFF,0xAF,0xB9,0x80,0x00, + + 0x0C,0x4C,0x04,0x00,0x18,0x2E,0x6F,0xD8,0xC1,0xBF,0x43,0xCC,0x56,0xBD,0x51,0xEF, + + 0xE0,0xCE,0x90,0x11,0x15,0x01,0x47,0x32,0x32,0x41,0x45,0x36,0x2A,0x61,0xB6,0x85, + + 0xC0,0xB8,0x35,0x67,0xF1,0x38,0xEA,0xA5,0xC4,0x54,0x6B,0x2D,0x2D,0xAD,0x60,0xEA, + + 0xEA,0x06,0xE1,0x97,0x90,0x5B,0xC6,0x31,0xB6,0x4F,0xC2,0xB7,0xAE,0x63,0x38,0xC2, + + 0x01,0xE2,0x00,0x44,0x62,0xD1,0x22,0x80,0x06,0xCF,0xA8,0xE6,0x57,0x5D,0x31,0xB8, + + 0x09,0xCE,0xEE,0x59,0x97,0x81,0x5A,0x5E,0xB5,0x30,0x50,0xB1,0xF2,0xEF,0x79,0x31, + + 0x9A,0x0F,0xC4,0xC1,0x92,0xB7,0x7A,0x8F,0x7D,0x42,0xA9,0x42,0x71,0x60,0x4D,0xB9, + + 0x89,0xCA,0x48,0x52,0xEC,0x23,0xAE,0x2E,0x7E,0xBB,0x22,0x97,0x72,0xED,0xA9,0xE0, + + 0x08,0xF3,0xD8,0x09,0xBB,0x53,0xD2,0x2C,0x3E,0x53,0x49,0x6C,0x5E,0x28,0xE5,0xE2, + + 0x62,0x99,0xEA,0xE1,0x19,0xF2,0xA5,0xCE,0xCB,0x43,0x9A,0xC1,0x59,0xB2,0x03,0x7B, + + 0x2F,0x1A,0xC3,0xF4,0x98,0xB1,0xD3,0x57,0x2F,0x5A,0xF2,0xD4,0x58,0xF1,0x24,0xE8, + + 0xD1,0x0E,0xEA,0x99,0x9D,0x3D,0xFD,0xC9,0x8D,0x44,0xFB,0xB9,0xDD,0xB8,0x1A,0xA7, + + 0x0C,0x0C,0x19,0x44,0x9D,0x2B,0xF9,0x06,0x9F,0x42,0xAD,0x8E,0x87,0xB1,0x58,0xDC, + + 0x4B,0xA5,0xBA,0x82,0xF4,0x6F,0xF9,0x70,0x97,0x7D,0xBA,0x3C,0x75,0xE6,0x16,0x29, + + 0xEE,0x05,0x73,0xFF,0xB4,0x62,0x3B,0xEF,0x36,0x0F,0x7C,0xE9,0xD6,0x98,0x71,0xB6, + + 0x70,0x90,0xCB,0xE4,0x44,0x20,0x78,0x75,0x13,0x3F,0xDF,0x9F,0xFF,0xD3,0x04,0x80, + + 0x78,0xF8,0x84,0x7C,0xB2,0xCB,0xAB,0x94,0x87,0x42,0xEC,0x83,0x13,0x58,0xDE,0xB0, + + 0x26,0xE9,0x0C,0x1E,0x4A,0x38,0xA6,0x38,0x24,0x58,0xE4,0x93,0x12,0x69,0x4F,0x28, + + 0x82,0x11,0x85,0x79,0x10,0x70,0xAE,0x15,0x07,0x42,0xED,0x82,0x93,0x18,0x02,0x1D, + + 0xDA,0x02,0xD6,0x95,0xCE,0x33,0x1C,0x33,0xE8,0xBE,0xE5,0x92,0x10,0x7C,0xF3,0xC1, + + 0xAF,0x18,0xC4,0xFC,0xCE,0x64,0xBB,0x0E,0xE7,0xF3,0x60,0x9B,0xD1,0xC9,0xAA,0x21, + + 0xE9,0x55,0x49,0x50,0x33,0xA4,0xDD,0xF7,0x14,0x51,0xBC,0xB0,0x4E,0x7A,0x2D,0xDF, + + 0x64,0xE2,0x05,0xC5,0xC2,0xC3,0x73,0xEC,0x66,0xF2,0x11,0x60,0xB1,0x85,0x13,0x43, + + 0xA7,0x9A,0xEB,0xDC,0x37,0x93,0x82,0xE1,0x64,0x50,0x4D,0xEB,0xE3,0x83,0xD9,0x89, + + 0x2E,0x78,0x5D,0x0E,0x3E,0x78,0x4C,0x47,0xCB,0x5C,0xF6,0xE8,0x0C,0xF5,0x6E,0x58, + + 0xE7,0x92,0x74,0x94,0xC4,0xF6,0x26,0xC8,0x24,0x50,0xE6,0x3E,0x7A,0x9F,0x19,0xFB, + + 0x43,0x18,0x54,0x65,0xBE,0xE7,0xEC,0x2B,0x68,0x9B,0xEF,0x2F,0xF9,0x22,0x0D,0x7B, + + 0x2B,0x33,0x04,0xFD,0xA9,0x3D,0x9B,0xBD,0xE1,0x55,0xA7,0xCD,0xB5,0x72,0x38,0x56, + + 0xC1,0xEA,0xC7,0xCB,0x9B,0x59,0xE6,0x5A,0x44,0x19,0xD3,0x2A,0x90,0x30,0x2D,0x2B, + + 0xCF,0xB2,0x23,0x36,0xBE,0x3A,0xB1,0x0A,0x6D,0x5D,0x76,0x5F,0x04,0x7C,0x19,0x52, + + 0xBA,0xB1,0x38,0x49,0xBA,0xAF,0xA1,0x4C,0x6F,0x59,0x27,0x69,0xBA,0xD6,0xF9,0x28, + + 0x43,0x4F,0x27,0x7E,0xBD,0x5F,0x08,0x27,0x12,0x21,0x1F,0xFD,0x8B,0xF2,0x7E,0x1F, + + 0x54,0x2B,0xFF,0x86,0x67,0xA0,0x50,0x62,0x59,0x4B,0xE9,0xA3,0xA9,0x21,0xD7,0x16, + + 0x05,0x59,0x68,0x12,0x63,0xBA,0x67,0x32,0x36,0xCD,0x42,0x3E,0xB0,0xF3,0x04,0x03, + + 0xEF,0xA6,0x7E,0x07,0xE3,0xA4,0x35,0xC1,0xFB,0xC6,0x4B,0xAF,0x21,0x21,0x96,0xEE, + + 0x95,0xE0,0x69,0x69,0x72,0xB3,0xE6,0x33,0xB2,0xCB,0x33,0x57,0xC5,0xE5,0x9F,0xBC, + + 0x00,0xC4,0x0D,0x3C,0x93,0xA3,0x98,0xD1,0xC3,0x83,0x4F,0x3D,0xAF,0x6E,0x13,0xAD, + + 0xF0,0xC7,0xE9,0x49,0x0F,0x31,0xB8,0x72,0x37,0x30,0xCA,0x89,0xD5,0xAD,0xDB,0x31, + + 0x39,0x39,0x09,0xE4,0xB2,0x72,0xD9,0xC0,0xB9,0xB5,0x75,0x96,0x75,0xE4,0xED,0x66, + + 0x66,0x78,0x68,0x4C,0x8B,0xE9,0x39,0xF7,0xC7,0x56,0xD9,0x15,0x60,0x82,0xC2,0xBC, + + 0x8B,0x8F,0x1D,0xF8,0x49,0xA1,0xF2,0x2E,0xDE,0x73,0xBE,0x59,0x3F,0x97,0xBA,0x1E, + + 0x10,0x0B,0xF0,0xF1,0xBE,0xAD,0x3A,0xC6,0xCC,0x8B,0x9A,0x0A,0x3E,0x21,0x8B,0xA9, + + 0x53,0x65,0xA2,0x8D,0x95,0x47,0x13,0xD3,0xCC,0x31,0xCB,0x2D,0x2B,0xEC,0xBB,0xF9, + + 0x21,0xCA,0x50,0xF2,0xBC,0x10,0xBB,0x87,0xFE,0xA9,0xC3,0x18,0xBE,0x73,0x99,0xCE, + + 0x02,0x30,0x94,0x08,0xB8,0xEE,0xC5,0x62,0x48,0xCC,0xCA,0xBE,0x83,0x93,0x68,0x63, + + 0x09,0x8D,0x35,0x5A,0x19,0xAD,0x7A,0x42,0x30,0xDD,0x47,0x23,0xA0,0xEB,0xA3,0x5B, + + 0xCC,0xCC,0xE1,0x1E,0x1B,0x89,0x60,0x54,0xD6,0x8C,0x4A,0x3E,0x7D,0x31,0x3C,0x7F, + + 0x00,0x8D,0xF8,0x2D,0x60,0xED,0x93,0xD9,0x4A,0xC8,0x73,0x7D,0x2A,0xE0,0x80,0xE0, + + 0x65,0x10,0xA8,0xF1,0x57,0xCF,0x80,0xC0,0x05,0x28,0xCD,0x24,0x7D,0x96,0x76,0x93, + + 0x86,0x97,0xEC,0x97,0x0A,0xB5,0x54,0x95,0xC4,0x58,0xDC,0xF7,0xB9,0x7A,0x5D,0x01, + + 0xA1,0x63,0xDD,0x85,0x43,0x19,0x2D,0xA6,0xE0,0xF2,0x8D,0xF7,0xF0,0xFD,0xA5,0xAF, + + 0x06,0x95,0xF2,0x97,0xC6,0xB5,0xB2,0xD3,0xE9,0x93,0xB9,0x55,0x77,0xF9,0x1A,0xF0, + + 0xA3,0x82,0x99,0x42,0x76,0x9E,0x49,0xA4,0xC4,0x9A,0x0B,0x62,0x76,0x65,0x35,0xC6, + + 0xAA,0xF6,0x53,0x46,0x16,0x85,0xDB,0xFB,0xB7,0x85,0xEF,0xC9,0x6F,0xB7,0x5A,0x9D, + + 0x57,0x4A,0x75,0x99,0x4F,0x6A,0x01,0xC7,0x32,0xC6,0x42,0xEF,0xF0,0xF6,0xC6,0x76, + + 0x72,0x89,0xEF,0x37,0xCB,0xB1,0x5A,0xFE,0x60,0x70,0xFD,0xCF,0x72,0xF0,0x6E,0x1D, + + 0x4F,0x38,0x9C,0x71,0xCB,0xFA,0x32,0x68,0xC0,0xD5,0x50,0xCC,0x1D,0xE8,0x74,0x9B, + + 0x8E,0xFC,0xF5,0x9E,0x42,0xB9,0xBE,0xBB,0xEE,0xBC,0x1A,0xDC,0x3E,0x86,0x5F,0x09, + + 0xAD,0xC2,0x27,0x05,0xC7,0xBE,0x2D,0xFB,0xCD,0xBA,0xAF,0x45,0x7E,0xD2,0x15,0x79, + + 0x92,0x9F,0x74,0x1D,0xBB,0xFB,0x07,0xCB,0xF4,0xD2,0xC7,0xDD,0xBC,0xEB,0x1B,0x39, + + 0xF6,0x48,0xEE,0x6B,0xDF,0xB3,0xDE,0x4C,0xEB,0xFB,0x1E,0x4D,0x78,0x9C,0x86,0x50, + + 0x0D,0x4B,0xD6,0x0E,0xE0,0xB2,0x6D,0x88,0x90,0x9F,0x6E,0xB8,0xD5,0x06,0x44,0x3A, + + 0x32,0xDE,0x77,0x4D,0xBB,0xD4,0xA8,0xEE,0xE8,0xDE,0x8A,0x6B,0xBE,0xD4,0x10,0xA8, + + 0x45,0x37,0x8F,0x9B,0xCE,0x32,0x7F,0xC3,0x13,0xCF,0xF9,0x7B,0xFF,0x6E,0xDF,0x15, + + 0x87,0x07,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0xE0,0xB2, + + 0xA5,0x86,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0xA9,0xA3, + + 0x5F,0x5D,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0xE9,0x11, + + 0x04,0x04,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x12,0x08, + + 0xED,0x49,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0xCA,0x08, + + 0x40,0x45,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0xEB,0xBA, + + 0x0D,0x4D,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x7F,0xE4, + + 0xA8,0x49,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x74,0x46, + + 0x8A,0xEF,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x8E,0x14, + + 0x21,0x80,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x95,0xC7, + + 0x0A,0xE9,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0xA5,0x33, + + 0x26,0x34,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x96,0xCE, + + 0x82,0xE3,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0xA6,0x3A, + + 0xAE,0x3E,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x05,0x0D, + + 0xA8,0x8B,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x9F,0xBD, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x3A, + + 0x81,0x87,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x55,0x96, + + 0x45,0xAB,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0xC9,0xA0, + + 0x82,0xE2,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0xB9,0x55, + + 0x2F,0x78,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x24,0x8E, + + 0x0C,0x19,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x9A,0xA8, + + 0x23,0xC5,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0xFC,0x03, + + 0x0B,0x8D,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x5B,0xC4, + + 0x62,0xC7,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x8F,0x95,0x80,0x00, + + 0x0C,0x4C,0xF9,0xE6,0x92,0x08,0x0A,0x28,0x63,0x78,0x15,0xE2,0xBA,0x2C,0x51,0xEF, + + 0xE0,0xCE,0xF0,0x76,0x50,0x31,0x30,0xCF,0xB6,0x03,0x4D,0xB0,0x55,0x90,0xB6,0x85, + + 0x80,0xD1,0x25,0x67,0xD3,0x5D,0xCC,0x23,0x3B,0xD9,0x61,0x63,0x7A,0x99,0x60,0xEA, + + 0x03,0x27,0xF1,0x97,0x92,0xC5,0x1D,0xD8,0xBA,0x47,0x46,0x34,0xD7,0x23,0xD0,0x1B, + + 0xFF,0xB8,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x30,0xD0, + + 0xE3,0xFA,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x7E,0x91, + + 0x8E,0xAD,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x29,0x15, + + 0x03,0x0A,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x0A,0xF5, + + 0x89,0xD3,0xD8,0xE7,0xBB,0x33,0x49,0x28,0x37,0x48,0x05,0x13,0x48,0x2A,0xE5,0xE2, + + 0xDE,0x56,0xCA,0x6A,0x3A,0x56,0xDD,0xD0,0x43,0x94,0x5A,0x38,0x25,0x92,0x8C,0x7B, + + 0x2B,0x6F,0xC3,0xF9,0x90,0x31,0xC8,0x6B,0xCE,0x6A,0x13,0x10,0x24,0x5A,0x55,0x3B, + + 0x5C,0x10,0x0B,0x1D,0xAF,0x45,0xE1,0x31,0x34,0x84,0x9A,0xFB,0x7B,0x27,0xBB,0x6F, + + 0xAB,0x86,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x32,0xA6, + + 0xB6,0xF5,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0xEC,0xA6, + + 0x3F,0xA6,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0xB4,0xDB, + + 0x8E,0x0B,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0x05,0x77,0xD0,0x7C,0x3C,0x24,0x68,0xA2,0x79,0xCF,0xF5,0x77,0xDE,0xB0, + + 0x26,0xE9,0x27,0x7C,0x75,0x5D,0xE6,0x38,0x94,0x92,0xA3,0xEA,0x8C,0xF3,0x4F,0x28, + + 0x82,0x11,0xE4,0xFE,0x65,0xAF,0x4C,0x25,0x1D,0x93,0x7D,0x06,0xD4,0xAE,0x02,0x1D, + + 0xDA,0x02,0x59,0xCB,0x9F,0xEF,0xE7,0x59,0xE7,0x9E,0x85,0xBC,0xB1,0x78,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xD9,0x89, + + 0x2E,0x38,0xEF,0x67,0xD3,0x8C,0x57,0xFC,0x49,0x48,0x01,0x2E,0x79,0x1B,0x36,0x70, + + 0x27,0xD6,0x0E,0x5A,0xAB,0x3A,0xE3,0x5A,0xE9,0x86,0x16,0x79,0xD8,0xF3,0xA9,0x0B, + + 0xAB,0xFC,0x24,0x97,0xD3,0x4E,0x77,0xE8,0x05,0xD1,0xAD,0x4F,0xDC,0x7C,0x55,0x6B, + + 0x0A,0x1D,0x6C,0x66,0x50,0x9C,0x25,0x51,0xE7,0x94,0x70,0x5F,0x7B,0x33,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0xFF, + + 0x04,0x0D,0xE0,0x39,0x1C,0xCC,0x50,0xE2,0x8A,0x4B,0xC0,0xF9,0xE3,0xAC,0x76,0x0A, + + 0xDC,0x2A,0x0F,0x81,0x7E,0x07,0xB5,0xC2,0x4D,0xCE,0x9E,0x3A,0xD9,0x3A,0xD9,0x0B, + + 0x5B,0x1D,0x89,0xC5,0x40,0x64,0xCB,0xC1,0x46,0xCA,0xC7,0x34,0xC8,0xA6,0x2E,0x31, + + 0xEE,0x73,0x29,0xE6,0x57,0xE3,0xE4,0x31,0xBE,0xC3,0x99,0xCA,0x95,0xAD,0xDB,0xA0, + + 0xAA,0x79,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x22,0xEF, + + 0x85,0xCD,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x19,0x38, + + 0x88,0xE4,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0xF4,0xB1, + + 0xA3,0x7A,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x21,0xFB, + + 0x94,0x88,0x98,0xFD,0xCA,0x07,0x69,0x68,0x33,0xC8,0xC2,0x08,0xBE,0x8B,0x2A,0x46, + + 0x09,0xF1,0xD4,0x84,0xF6,0x6C,0x67,0xC3,0xCD,0x52,0xCA,0xE1,0xBE,0xAB,0x7D,0x08, + + 0x73,0xCA,0x44,0xFE,0x46,0xBA,0xE8,0x6B,0xCA,0xEA,0x03,0x98,0xF2,0xA6,0x69,0x3F, + + 0xA9,0x8B,0xD5,0x28,0xF6,0x0E,0x3B,0xC6,0xCD,0x10,0x3B,0x87,0x0A,0x56,0xBD,0x42, + + 0x20,0xCA,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x1A,0x85, + + 0xE0,0xCC,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x91,0x8D, + + 0x2C,0xC2,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x13,0x7C, + + 0xAB,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x28,0x85, + + 0x85,0x18,0xAA,0x34,0x17,0x70,0x54,0x62,0xAA,0x5B,0xAF,0xD4,0xD7,0xF6,0xBB,0x62, + + 0x2D,0x9E,0x8C,0x86,0x81,0x66,0xAF,0xC0,0xC6,0xD7,0xC4,0x34,0x70,0x9B,0x27,0x61, + + 0x26,0xDA,0xFF,0xDD,0x03,0xCD,0xCB,0x41,0x66,0x9A,0x3D,0xCE,0x57,0x97,0x4D,0xD7, + + 0xD1,0x9C,0x18,0x28,0x68,0xCE,0x35,0xFF,0x46,0xD5,0x85,0x67,0x02,0xFC,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x46,0x4A, + + 0xE2,0x13,0x09,0xD0,0x89,0x64,0x3A,0x2D,0xCD,0x50,0x8E,0x7E,0x87,0xF7,0xA7,0x6A, + + 0x25,0x96,0x3E,0x80,0x2D,0x4D,0x98,0x4A,0x65,0xD6,0x3E,0xBF,0xFF,0xF1,0x59,0x69, + + 0x2E,0x92,0xCF,0x4D,0x3A,0x4F,0xB7,0x49,0x6E,0xF2,0x18,0xD1,0x21,0xB8,0x9B,0xE9, + + 0x0E,0x56,0xAA,0x85,0xA9,0x0F,0x5F,0x7B,0x23,0x50,0x6B,0x4F,0xF5,0xF4,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x46,0x75,0x80,0x00, + + 0x0C,0x4C,0x04,0x44,0xCA,0x26,0x11,0xD4,0x40,0xBD,0xA2,0x62,0xC2,0xDD,0x51,0xEF, + + 0xE0,0xCE,0xE8,0x54,0x0C,0xAA,0x41,0xB1,0xA0,0x80,0x1A,0x73,0x7F,0xBD,0xB6,0x85, + + 0x8C,0x80,0x09,0x39,0x71,0x2D,0xBD,0xA4,0xE1,0xC0,0x3A,0x5F,0x05,0x79,0x60,0xEA, + + 0xEA,0x06,0x0D,0xF7,0x13,0x2B,0xE3,0xB9,0xA2,0x41,0x4D,0x6B,0x42,0x5C,0xE8,0xE2, + + 0x85,0x23,0x00,0x44,0x62,0x68,0x90,0x65,0x52,0x05,0xD0,0x64,0x52,0x64,0x4D,0x4A, + + 0x17,0xB1,0x60,0xF7,0x6C,0xA5,0xB0,0xC3,0xC6,0x02,0xD8,0x74,0x53,0x65,0xD1,0x5F, + + 0x92,0xF2,0xB1,0x83,0x38,0x67,0xF2,0x69,0x1E,0x76,0xD1,0x65,0xD2,0x66,0xCC,0x97, + + 0x69,0x4B,0x09,0x55,0xE3,0x6B,0x99,0x75,0x30,0x0B,0xD9,0x75,0xD3,0x67,0xA9,0xE0, + + 0x08,0xF3,0x0B,0x7E,0xBB,0x2E,0xC0,0xDE,0x7B,0x2A,0xEC,0x37,0x8C,0xFC,0xE5,0xE2, + + 0x62,0x99,0xF2,0x9E,0x18,0x4B,0x40,0xB8,0x2F,0x86,0xFB,0x9C,0x8F,0xD6,0x03,0x7B, + + 0x2F,0x1A,0xCB,0x9F,0xFB,0xD5,0x29,0x1D,0x2F,0x58,0xCD,0x22,0xDC,0x24,0x24,0xE8, + + 0xD1,0x0E,0xB3,0xCD,0x76,0x24,0x21,0xD1,0x8F,0x84,0xA5,0x8E,0x90,0xEC,0xB2,0x0E, + + 0xA0,0xF7,0xB2,0x8A,0xB0,0x6D,0x26,0x95,0x6A,0x0E,0xD2,0x6C,0x5A,0x6C,0x70,0xA7, + + 0x0D,0x0D,0xCA,0x5C,0x1B,0x2D,0x9A,0x78,0x3B,0xB8,0xDA,0x7C,0x5B,0x6D,0xC7,0xCD, + + 0x8A,0x9F,0x53,0x4D,0x9A,0x2E,0x53,0x51,0x2B,0xB1,0xD3,0x6D,0xDA,0x6E,0x58,0x66, + + 0x9B,0x4D,0xCB,0x5D,0x9B,0x2F,0x5A,0xFD,0xCB,0xDE,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0x44,0x80,0x78,0xBD,0xC9,0x80,0x66,0x70,0xE2,0xE2,0xD6,0x3C,0xDE,0xB0, + + 0x26,0xE9,0x77,0x10,0x35,0xF9,0x26,0x52,0x1A,0x55,0x9C,0x8C,0x90,0x8E,0x4F,0x28, + + 0x82,0x11,0x78,0x7E,0x43,0xCD,0xE3,0x23,0xE1,0x2A,0xE1,0x58,0xCE,0x30,0x02,0x1D, + + 0x92,0xD1,0xB7,0x6A,0x46,0x71,0x66,0x4E,0x96,0x5F,0x5D,0xB5,0x81,0x86,0x7F,0x86, + + 0x80,0x5A,0xC4,0xC4,0x32,0x34,0x24,0xC6,0x80,0x12,0xD4,0xE4,0x72,0x74,0xEB,0xD9, + + 0xF3,0x45,0xCC,0xD4,0x33,0x35,0x5C,0x86,0x47,0x1B,0xDC,0xF4,0x73,0x75,0x31,0xE5, + + 0x76,0x06,0xC5,0xC5,0xB2,0x36,0x55,0xA7,0x40,0x57,0xD5,0xE5,0xF2,0x76,0x6A,0xDC, + + 0x24,0xB0,0xCD,0xD5,0xB3,0x37,0x2B,0xB7,0x45,0x15,0xDD,0xF5,0xF3,0x77,0xDC,0x84, + + 0x1B,0xDA,0x06,0x9E,0x3E,0x78,0xD6,0xA9,0x33,0x43,0x97,0x28,0x78,0xE9,0x6E,0xD8, + + 0x27,0x14,0x4E,0x9C,0x43,0x3D,0xA1,0x4E,0xEB,0x51,0x8D,0x41,0x69,0x37,0xC5,0xFF, + + 0x8B,0x45,0x2A,0x09,0xBC,0xB7,0x55,0xD7,0x0F,0x4A,0x20,0xA4,0xFE,0x7A,0x05,0x91, + + 0x0A,0x16,0xE3,0x5A,0xBB,0xCE,0x92,0x49,0xE1,0x54,0xEF,0xFB,0x5B,0x85,0xEE,0x6E, + + 0x2C,0x5C,0xC6,0xCC,0x3A,0x3C,0xD6,0x12,0xEF,0x7B,0xD6,0xEC,0x7A,0x7C,0xCE,0x5C, + + 0x2B,0x8C,0xCE,0xDC,0x3B,0x3D,0x4D,0xBE,0xC9,0x13,0xDE,0xFC,0x7B,0x7D,0x3C,0x8F, + + 0x00,0xE5,0xC7,0xCD,0xBA,0x3E,0x88,0x89,0xEC,0x5E,0xD7,0xED,0xFA,0x7E,0x75,0x26, + + 0xAD,0x1F,0xCF,0xDD,0xBB,0x3F,0x2B,0x7D,0xEF,0x58,0xDF,0xFD,0xFB,0x7F,0x7E,0x1F, + + 0x54,0x2B,0x98,0xD6,0xE9,0xAF,0x50,0x66,0x38,0x4B,0xE8,0x32,0x37,0x7C,0xD7,0x16, + + 0x05,0x59,0xAC,0xF4,0x97,0xA9,0xAB,0xD0,0xC7,0xC9,0x09,0x88,0xE9,0x16,0x04,0x03, + + 0xEF,0xA6,0xC1,0x47,0x7A,0x29,0x35,0xC1,0x46,0x8A,0x48,0xC8,0x54,0x62,0x96,0xEE, + + 0x95,0xE0,0x5C,0xF5,0x95,0x08,0xB4,0xD1,0x47,0xCB,0x16,0x58,0x08,0x3F,0x60,0x7A, + + 0xFA,0xB4,0xE0,0x46,0x16,0xA4,0xC7,0x6B,0x40,0xC4,0xF0,0x66,0x56,0xE4,0xED,0x54, + + 0xCF,0xD5,0xE8,0x56,0x17,0xA5,0x0C,0xF6,0x43,0xC2,0xF8,0x76,0x57,0xE5,0xA1,0x43, + + 0xF6,0x22,0xE1,0x47,0x96,0xA6,0x62,0x25,0x64,0x88,0xF1,0x67,0xD6,0xE6,0xCD,0xAE, + + 0x07,0x5C,0xE9,0x57,0x97,0xA7,0xB9,0x76,0xD7,0x86,0xF9,0x77,0xD7,0xE7,0xC2,0xBC, + + 0x8B,0x8F,0x04,0x0F,0x1C,0xA1,0xBB,0xC8,0x7F,0x8A,0x0B,0x70,0xDF,0xE6,0xBA,0x1E, + + 0x10,0x0B,0x2A,0xE4,0xFC,0xD6,0xC5,0xD2,0x4F,0x04,0xBB,0x21,0x45,0x7D,0x8B,0xA9, + + 0x53,0x65,0xDE,0xEF,0x73,0xE8,0x89,0xD5,0xDC,0x07,0x53,0x10,0xF8,0x3E,0xBB,0xF9, + + 0x21,0xCA,0xD4,0xE5,0x62,0x74,0x40,0x33,0x28,0x74,0x3A,0x24,0xC1,0xA5,0x63,0x8C, + + 0xAC,0xC9,0xE2,0x4E,0x1E,0xAC,0xDA,0xC9,0x31,0x6C,0xF2,0x6E,0x5E,0xEC,0x81,0xAD, + + 0x09,0x8D,0xEA,0x5E,0x1F,0xAD,0xFC,0xBC,0xED,0x81,0xFA,0x7E,0x5F,0xED,0x11,0xEE, + + 0x0B,0x89,0xE3,0x4F,0x9E,0xAE,0xB3,0x6B,0xBE,0x35,0xF3,0x6F,0xDE,0xEE,0x3C,0x84, + + 0x2C,0xF1,0xEB,0x5F,0x9F,0xAF,0x0B,0xA4,0x78,0x81,0xFB,0x7F,0xDF,0xEF,0x2E,0x02, + + 0x87,0x96,0xA0,0xC1,0xB5,0xBE,0x6B,0xA0,0x17,0xD0,0x4D,0xE0,0x9E,0x54,0xEA,0x64, + + 0x16,0x93,0xF2,0x05,0x31,0x1A,0xFC,0xB3,0x3E,0xCA,0x18,0x4A,0xF5,0x0A,0x6D,0x11, + + 0x05,0x89,0x06,0x11,0x68,0x54,0xEA,0xA3,0x93,0xDE,0x30,0xA1,0x3C,0xA2,0xF7,0xF1, + + 0xB5,0x58,0xCF,0x93,0x54,0x1C,0x7B,0xCC,0x81,0x1C,0xBF,0x71,0x57,0xB6,0x77,0xFD, + + 0x32,0xD6,0xE4,0xC6,0x36,0xB4,0xB4,0xE7,0x76,0x95,0xF4,0xE6,0x76,0xF4,0xAC,0xD2, + + 0x57,0x31,0xEC,0xD6,0x37,0xB5,0xBC,0xF2,0x17,0x2E,0xFC,0xF6,0x77,0xF5,0x65,0xFB, + + 0x5A,0xE6,0xE5,0xC7,0xB6,0xB6,0xDD,0x40,0x99,0x76,0xF5,0xE7,0xF6,0xF6,0x68,0xD5, + + 0x6F,0x87,0xED,0xD7,0xB7,0xB7,0x7C,0x35,0x45,0x92,0xFD,0xF7,0xF7,0xF7,0x26,0x62, + + 0x62,0x55,0x45,0x7D,0xE2,0x13,0x77,0xD4,0x0A,0x17,0xC4,0x0B,0xD8,0x1F,0x16,0x8A, + + 0x4A,0x9C,0xD0,0xA8,0xD6,0x5C,0x26,0xB3,0x5E,0x1B,0xC4,0x3A,0x7D,0x4A,0xD8,0x63, + + 0xAA,0x99,0xC0,0x87,0x57,0x2C,0x36,0xDD,0xFE,0x12,0x63,0xE9,0x5E,0x04,0x0F,0x9F, + + 0xCA,0x92,0xF1,0xAC,0xA9,0x14,0x85,0xAF,0x60,0x5D,0x54,0xC4,0x62,0xC6,0xC2,0xA8, + + 0x82,0x63,0xE6,0xCE,0x3E,0xBC,0x04,0x4F,0xEB,0xDB,0xF6,0xEE,0x7E,0xFC,0x17,0x9C, + + 0x8D,0xD3,0xEE,0xDE,0x3F,0xBD,0x96,0x59,0x90,0x9C,0xFE,0xFE,0x7F,0xFD,0xA7,0xCB, + + 0xDE,0xE0,0xE7,0xCF,0xBE,0xBE,0x98,0x1C,0x6B,0xD9,0xF7,0xEF,0xFE,0xFE,0x1B,0x5F, + + 0xAB,0x98,0xEF,0xDF,0xBF,0xBF,0xD7,0x58,0x90,0x1F,0xFF,0xFF,0x57,0x3D,0x59,0x86, + + 0xE5,0x0B,0xC8,0x90,0xF9,0x49,0x40,0x06,0xAD,0x22,0xEE,0x18,0x56,0xD0,0x42,0xC2, + + 0xD5,0x72,0x5E,0x53,0xCF,0x29,0xDC,0xC3,0x6B,0xEC,0x5B,0x47,0x74,0xE3,0x81,0x60, + + 0xB4,0x40,0x93,0xFB,0x6F,0x8F,0x6F,0x81,0x29,0x61,0x9E,0x56,0xBE,0x6B,0xAE,0xA9, + + 0x87,0xD3,0x09,0x54,0xFD,0x61,0x8E,0x0F,0xB5,0x58,0xE6,0x46,0xE3,0x0F,0xBF,0xF1, + + 0x3C,0xAB,0x99,0xB1,0xB7,0xA4,0x68,0x10,0x4A,0x4F,0x53,0xF3,0xEE,0x6D,0xC8,0x31, + + 0x67,0xA8,0x08,0x31,0x2F,0xD0,0x8B,0x41,0xE2,0xBA,0x90,0xA1,0xE7,0xBF,0x94,0x32, + + 0xEC,0x0D,0x39,0xC1,0xCA,0x65,0xD1,0x00,0xA6,0xEB,0x6C,0xA2,0x18,0x4F,0x18,0xB1, + + 0x87,0x2E,0x9A,0x6B,0xAD,0x65,0x67,0xC8,0xC5,0xD7,0x60,0xB2,0x19,0x9D,0x9E,0x8C, + + 0x58,0x6F,0x01,0x61,0x72,0x5B,0x92,0x76,0xEC,0xA5,0xF5,0xEC,0x1A,0x2A,0x74,0xB4, + + 0xE0,0x60,0x8C,0xAC,0xF0,0x40,0x63,0xCB,0x67,0x9D,0xE4,0x85,0xD4,0xC4,0x7D,0xA0, + + 0x24,0x07,0xFD,0xB4,0x91,0xCB,0xD7,0x77,0xC6,0x54,0x10,0x40,0xB2,0x19,0xF6,0xF5, + + 0x89,0xDE,0x99,0x1C,0x66,0xA6,0xCB,0x4B,0x22,0xC8,0xC8,0xA2,0x32,0x63,0xD0,0xCC, + + 0x5E,0x75,0x0E,0xF6,0x9A,0x6E,0xA6,0x9B,0x3A,0x29,0x9A,0x34,0xE7,0x93,0x91,0x58, + + 0xE2,0x9E,0x1E,0x2F,0x3D,0x6F,0x52,0x49,0xEA,0xB2,0x4D,0xF8,0x0B,0x38,0x15,0xE4, + + 0x61,0xBD,0x2F,0x3E,0xFC,0x88,0x6B,0x9A,0xB2,0xE3,0x13,0x74,0x2D,0x33,0x5D,0x3C, + + 0x60,0x07,0xCC,0xC1,0x9A,0xEF,0x65,0xC4,0xCD,0xDF,0xA5,0x41,0x77,0x62,0x66,0x84, + + 0x23,0x32,0x96,0x7B,0xCF,0xBD,0x10,0x46,0x48,0x02,0x73,0x64,0x76,0x32,0x8E,0x14, + + 0x29,0xB6,0x8B,0x55,0xD8,0xD2,0x08,0x9B,0x49,0xBF,0xCF,0x27,0x5C,0xDE,0xC5,0x98, + + 0x3B,0xA9,0xD7,0x7A,0x47,0x70,0x01,0x1D,0xC8,0xC8,0x92,0x7D,0x7D,0xDF,0x52,0x99, + + 0xA7,0xA3,0x95,0x8D,0x3E,0xB5,0x09,0x5A,0xE7,0xE3,0x95,0xC6,0xCF,0xF5,0xC2,0xB3, + + 0x48,0x5B,0x94,0x48,0x36,0x10,0x4E,0xE2,0xF0,0x5C,0x43,0x1B,0x87,0xD2,0x50,0xD0, + + 0xAC,0xB8,0x96,0x7E,0x5B,0x36,0x98,0x0A,0x9E,0x37,0x5A,0xB3,0x92,0x83,0x44,0xB2, + + 0xC4,0x59,0xD0,0xB7,0x59,0x35,0x49,0x9F,0x46,0xBB,0x46,0x1B,0xD0,0x9B,0x9F,0x42, + + 0x8D,0xBA,0xB3,0xD3,0x52,0xB4,0x22,0x82,0x93,0x12,0x22,0x87,0x25,0xA8,0xEE,0x71, + + 0x24,0x1C,0x82,0x4C,0x3C,0x10,0x19,0xDB,0x4D,0xDA,0x96,0x5F,0x06,0x50,0x51,0x8D, + + 0x2F,0x39,0x82,0xA9,0x71,0xBA,0x79,0x78,0x23,0xF4,0x02,0x47,0x0A,0x79,0x84,0x0D, + + 0xF0,0x24,0x11,0x09,0xE0,0xA0,0x68,0xDA,0xDA,0x36,0xC8,0xBC,0x9A,0xD7,0x79,0x80, + + 0xAF,0xAB,0xB1,0xA1,0x1D,0xD6,0x87,0x89,0x1E,0xE4,0x89,0xDF,0x06,0xE6,0x96,0x4C, + + 0x72,0xCE,0x6F,0x3F,0xB6,0x31,0xE8,0x6D,0x9D,0xF1,0x7A,0x93,0xB0,0x5F,0x70,0x64, + + 0xC8,0x16,0xF4,0x2F,0x4B,0x92,0x8C,0x86,0x19,0xF2,0xBF,0x3C,0x76,0x2D,0x0F,0xCD, + + 0x83,0xDF,0x9F,0xC9,0x32,0xEC,0x40,0x6C,0x92,0xF1,0x8D,0xEF,0x49,0xA7,0xCB,0xAA, + + 0xD1,0x90,0xD8,0xAE,0x99,0x9E,0x09,0x3E,0x02,0x9C,0xFF,0xC3,0xE7,0x7B,0xF5,0x3D, + + 0x76,0x3F,0x60,0x1F,0x6A,0x0D,0x0E,0x92,0xC9,0x46,0x8E,0x8B,0x82,0x4F,0x6B,0x0D, + + 0x37,0x54,0xCA,0x17,0x16,0xE1,0x38,0xC2,0xBA,0x6E,0xEA,0xC6,0x51,0x40,0x7A,0x03, + + 0x82,0xC2,0xF0,0x67,0xDE,0xCC,0x30,0x63,0xC0,0xE2,0x66,0x66,0xAF,0x42,0xFC,0x2C, + + 0xF7,0x3F,0xA5,0x22,0x7C,0x30,0x6E,0xC0,0xB3,0x6E,0xEA,0xC4,0xA7,0x6E,0xDB,0xF3, + + 0x38,0x2B,0x20,0x5F,0x30,0xE6,0x84,0x9C,0xEA,0xC9,0x8E,0x5B,0xD9,0x42,0x6F,0xF6, + + 0xA6,0x0C,0xEC,0x74,0x33,0x2E,0x1E,0x4B,0xAE,0x54,0xD8,0x9C,0xBE,0x34,0xB6,0x02, + + 0xFD,0xC4,0x7D,0x6A,0xDE,0x25,0x8E,0xA4,0x2F,0x95,0xE6,0x14,0xA6,0x6F,0x6D,0xB3, + + 0x83,0xAE,0xED,0xB5,0x6B,0x34,0x63,0x71,0x74,0x6A,0xE3,0x75,0x45,0xEF,0x9F,0x51, + + 0x7F,0x88,0xC4,0x6B,0xF7,0x7B,0x60,0x98,0x5C,0xC8,0xE4,0x83,0xB7,0x9B,0xFC,0xBA, + + 0x43,0xBB,0xD4,0xA7,0x14,0x48,0x5A,0x5A,0xBB,0x68,0xF9,0x4D,0x78,0x6B,0xE3,0x0F, + + 0xDE,0x3E,0x9D,0xA2,0x5E,0xAA,0x3B,0x2F,0xC5,0x2B,0x73,0x33,0xF2,0xE0,0x72,0xA9, + + 0x28,0xE7,0xAD,0xAF,0x74,0xC2,0x03,0xDE,0xC5,0x17,0x44,0x4C,0xEF,0x87,0xF0,0xCE, + + 0x5A,0xE5,0x51,0xE3,0x18,0x64,0x27,0x1A,0xCE,0xDA,0x70,0x7D,0x2A,0x7D,0x6D,0xDF, + + 0x0E,0x5D,0x8D,0x3C,0xF4,0x8E,0xAB,0xE5,0xBA,0x44,0x79,0x5D,0xFE,0x32,0xA3,0x53, + + 0x20,0xCC,0xB8,0x6B,0x1C,0xAA,0x7B,0x8B,0x41,0x63,0xD5,0x52,0xA6,0xAC,0xAB,0x43, + + 0x20,0x85,0xB3,0x5B,0x17,0x15,0x5B,0x91,0x26,0xFC,0x4F,0x1D,0x52,0x49,0xCC,0x7B, + + 0x6C,0xD2,0x60,0x75,0x12,0x1D,0x0A,0x0A,0xE9,0x66,0x74,0xBF,0x0A,0x5D,0xEC,0x96, + + 0x77,0x45,0x92,0xAB,0xC1,0x60,0x02,0x0A,0x19,0x7E,0x3F,0x13,0x76,0x81,0x21,0x30, + + 0xDF,0x82,0x32,0x02,0x5F,0xD1,0x3D,0xA7,0xED,0x33,0xE4,0xC7,0xF6,0xB0,0x7D,0x8C, + + 0x8F,0x88,0xF4,0x92,0x60,0xF6,0xEE,0xCD,0x65,0x92,0x7D,0xAE,0xA6,0x5E,0x7C,0x4B, + + 0xCF,0x47,0xDC,0xF7,0x97,0x35,0x12,0x43,0x8F,0xD7,0x40,0xA1,0x45,0xB3,0x3B,0x56, + + 0x77,0xF2,0xBE,0x9D,0xDC,0xD1,0x2B,0x76,0x33,0xBC,0xEF,0x72,0x27,0xAA,0x73,0xA1, + + 0x59,0x3B,0x1C,0x34,0x32,0x3B,0xB5,0xFA,0xB0,0xDE,0x4D,0x74,0x8E,0x5B,0x96,0xF4, + + 0x06,0xFB,0x2D,0xC7,0x3F,0x43,0xBD,0xEB,0x49,0x95,0xB5,0x57,0x94,0xBE,0x55,0xEC, + + 0x0F,0xE8,0x18,0x0B,0xE9,0xDA,0x30,0x1A,0x85,0xB1,0xE5,0x97,0x97,0xF0,0x77,0x6F, + + 0x88,0xF7,0x90,0xA3,0xE3,0x16,0x6C,0x45,0x6B,0x69,0xEC,0x4E,0x8A,0x58,0x7E,0x77, + + 0x09,0x65,0xCE,0x65,0x43,0xD6,0x25,0x54,0x13,0x57,0x8C,0xAD,0xC8,0x5A,0xC8,0xDB, + + 0xFD,0x36,0x38,0xEC,0xC9,0x6D,0x37,0x3F,0xB9,0xB8,0xEC,0x4C,0x8F,0x70,0x00,0x7E, + + 0xC7,0x3F,0xFA,0xD0,0x1F,0x08,0x71,0x6F,0x6F,0xDD,0xE0,0x4E,0xCD,0xB1,0xEE,0xBB, + + 0x4B,0xB4,0xA1,0xEF,0x9E,0x1C,0xF8,0x89,0x05,0x92,0x21,0xFF,0x79,0xE5,0xA7,0xD2, + + 0xB2,0x96,0x28,0xD5,0xE9,0x13,0xB7,0xF3,0x41,0xD4,0xBD,0xF2,0xDD,0x3F,0x7F,0x5F, + + 0xF7,0xDC,0xD7,0xEF,0x90,0xFD,0x7E,0x88,0x89,0x90,0xA6,0x7B,0xAB,0x6C,0x3E,0x38, + + 0xA3,0xAD,0x1C,0xFB,0xE5,0x83,0x76,0xED,0xA9,0x1A,0x7C,0xB6,0x10,0x68,0x36,0x29, + + 0xC3,0xFE,0x48,0x0D,0x59,0x29,0x98,0x73,0x32,0xCC,0xA0,0xD4,0x55,0x4D,0x16,0x85, + + 0xD4,0x69,0x10,0x81,0xC0,0x97,0xD1,0x39,0x77,0x4A,0x00,0xA7,0x50,0x0C,0x37,0x29, + + 0xE0,0x07,0x09,0x56,0xE0,0x8E,0x67,0x04,0x28,0xA2,0x82,0x95,0xC7,0x23,0xBB,0x33, + + 0x5D,0xFD,0x82,0xBB,0xFB,0xDE,0x90,0x70,0xA7,0x44,0x14,0xB4,0x5A,0x67,0xC9,0xD4, + + 0x5B,0xB2,0xEE,0x89,0x3C,0x5E,0xF2,0x24,0x45,0xC5,0x7E,0x12,0x99,0x7E,0x19,0x40, + + 0x77,0x0D,0x6D,0xDA,0x91,0xB6,0x51,0x61,0xC2,0x40,0xE9,0x79,0x5F,0x7D,0x41,0x40, + + 0xE8,0xB7,0xCD,0x27,0x68,0xDC,0xE3,0x71,0xC3,0x47,0xA7,0x9D,0xC1,0x2A,0x60,0x0A, + + 0x0B,0x18,0x93,0x6C,0x52,0x85,0xBE,0xBB,0x6D,0x40,0xBE,0x54,0xB1,0xB2,0x73,0x6B, + + 0x71,0x46,0xB4,0x30,0x37,0xF6,0xFA,0x09,0x25,0xE6,0x1A,0x7F,0x28,0xC4,0x59,0x03, + + 0xE0,0xB0,0x16,0x3C,0x39,0xD5,0x93,0x6A,0xBB,0xC1,0x7F,0xBF,0xD8,0x60,0x0D,0xC0, + + 0xC1,0x08,0xD1,0x01,0x9F,0xBB,0xBB,0x4B,0xAB,0x1E,0x07,0xAD,0x26,0xC6,0xC4,0x4A, + + 0x11,0x17,0xC6,0xC8,0x2B,0x7D,0x52,0x1A,0xA1,0x77,0xB4,0x99,0xB1,0x87,0x39,0xA8, + + 0x49,0x42,0xAA,0x0A,0x1E,0x6F,0x82,0x0B,0x6C,0x23,0xD8,0x57,0xD6,0x2F,0x64,0xBD, + + 0x82,0x15,0xC5,0xA9,0x13,0x18,0x2D,0x85,0x02,0x47,0x13,0x71,0x2A,0x2C,0x12,0xA4, + + 0x2E,0xF0,0xC9,0x5E,0xA8,0x1F,0x3D,0x18,0xC8,0x54,0xD9,0xC1,0xD8,0xAF,0x5C,0x10, + + 0xD9,0xB1,0x44,0x98,0x25,0xBB,0x9D,0xC2,0x41,0x10,0x8F,0xE3,0x99,0x59,0x0F,0x37, + + 0x96,0x74,0x47,0x87,0x01,0xCB,0x0A,0xD2,0x9E,0xFC,0xFE,0xB4,0xAC,0xF0,0x3D,0x7E, + + 0x51,0x50,0x81,0x67,0x78,0x23,0x39,0xD9,0x09,0x23,0xF3,0xC5,0x0F,0xFF,0x35,0x7E, + + 0xA7,0xC3,0xAB,0xA0,0x90,0x97,0x8C,0x35,0xB1,0x34,0x99,0x4E,0x10,0x80,0x5E,0xC2, + + 0xE0,0x10,0xE0,0x2C,0x2A,0x76,0x6A,0x80,0x43,0x84,0xD6,0x15,0x11,0x8B,0xF4,0x2F, + + 0x40,0x01,0x46,0x50,0x63,0xDB,0x26,0xE0,0x9C,0xD8,0xDA,0x04,0x57,0x81,0x0D,0xCC, + + 0x91,0x72,0xC7,0xA1,0x30,0xFA,0x2B,0x05,0x0B,0x3F,0x45,0xF6,0xC5,0xFD,0x5B,0x08, + + 0x10,0xEA,0xAD,0x83,0xF6,0x75,0xA0,0x08,0x1C,0x15,0x09,0x71,0x96,0xCC,0x32,0xE6, + + 0x8B,0x7D,0x10,0xED,0x0B,0xD3,0x6D,0x8F,0xC9,0xE7,0xED,0xEB,0x91,0x82,0x0E,0x99, + + 0x79,0x1D,0x76,0x94,0xC0,0x76,0x79,0xC2,0x6F,0xC9,0xFC,0xBC,0xA4,0xF8,0xBA,0x6B, + + 0xF0,0xAD,0x7F,0x65,0x3C,0xA7,0xFB,0x41,0xD3,0x17,0xF1,0x71,0x07,0xF7,0xA0,0xBD, + + 0x48,0x00,0xB5,0x75,0x3F,0xF4,0xE6,0xF9,0xED,0x77,0x9B,0xE2,0x9B,0x7B,0xBE,0x20, + + 0x7D,0x5E,0xC4,0xCF,0x3C,0x5C,0x4F,0xC4,0x83,0x15,0xB6,0xC3,0x41,0x3E,0x58,0xF1, + + 0x2D,0xCD,0x97,0xA2,0x59,0x1D,0xF2,0x67,0x68,0xCD,0xA6,0xDB,0x92,0xB6,0x45,0x38, + + 0xC9,0x75,0xE2,0xBF,0xC6,0x91,0x15,0x16,0x03,0x77,0x54,0xC9,0x13,0xD5,0xA9,0x29, + + 0xEB,0xBE,0xB1,0x28,0xBD,0x26,0x79,0x98,0xCC,0xD2,0xA7,0x7F,0x47,0x99,0x1E,0xA2, + + 0x89,0x06,0x56,0x82,0x4C,0x00,0x4E,0x25,0xE5,0xCB,0x7F,0xB9,0x55,0xA0,0x21,0x60, + + 0xFE,0x1E,0x96,0x23,0x34,0x23,0xAE,0x21,0x68,0xCE,0xCF,0xF6,0x51,0xCD,0xA6,0xC3, + + 0x80,0xAB,0xA9,0x03,0x1D,0x3B,0xB1,0x60,0xF7,0x6F,0x9D,0x5F,0xD2,0x52,0x85,0x68, + + 0x4F,0x2A,0x05,0x64,0xA9,0x05,0x0B,0x20,0x66,0x92,0xA2,0x35,0x8A,0x8F,0x39,0xB7, + + 0xA3,0x5B,0x20,0x56,0x33,0xA2,0x56,0xBE,0x69,0x69,0x30,0x7A,0xA6,0xA6,0x31,0xAF, + + 0xF2,0xCA,0x06,0xD4,0xD2,0xED,0x30,0x23,0x41,0x75,0xD2,0x9C,0x14,0xEA,0x8D,0xDC, + + 0x87,0x06,0x4B,0x03,0x90,0x36,0xAD,0xA4,0x0C,0x3C,0xF3,0x39,0x3F,0xDD,0x30,0x55, + + 0x22,0x58,0x29,0x47,0x1F,0xE5,0x02,0x0C,0xAF,0xAC,0xD0,0x1F,0x3C,0xDC,0x19,0x99, + + 0x6D,0x82,0x3E,0xF1,0xF5,0xF9,0x4C,0x07,0xAD,0x67,0x8C,0xF3,0x96,0x32,0x54,0x1C, + + 0x6E,0x7E,0x9D,0x9A,0x45,0x09,0x5C,0x5F,0x4C,0x89,0xBB,0x4D,0x74,0x40,0x32,0xFB, + + 0x7F,0x3B,0xC1,0x0F,0x9A,0x3A,0x22,0x58,0xFC,0xA6,0x5F,0xBD,0x9C,0xE2,0x78,0xE8, + + 0x01,0x86,0xA3,0x1B,0x14,0x32,0x17,0xD3,0xCB,0x1B,0xA3,0xDF,0xD9,0xC7,0x63,0x2C, + + 0xF1,0xCE,0x66,0x45,0xFF,0x5D,0xB2,0x72,0xFA,0x13,0xCC,0x82,0x9F,0x66,0xD5,0xDE, + + 0x5B,0xE6,0xEE,0xAD,0x74,0xAB,0x63,0x30,0xA6,0x86,0x56,0xEC,0xA8,0x40,0xE0,0xF3, + + 0x7B,0x81,0x9D,0xBB,0x6B,0x2D,0xC7,0x09,0x31,0x8C,0x74,0x27,0x35,0xB5,0xD4,0xC9, + + 0x70,0x52,0x41,0x0B,0x99,0x2F,0x65,0x1A,0xEC,0xBE,0xA6,0xED,0xDF,0xE7,0x03,0x74, + + 0xCF,0x2A,0x13,0xAB,0xC0,0xE1,0x2F,0xD1,0x49,0x52,0x4F,0x22,0x7C,0x57,0x63,0xA3, + + 0x84,0x30,0xB4,0x96,0x06,0xD5,0x66,0x36,0x63,0x41,0x10,0xC9,0xAF,0x2C,0xE5,0xE6, + + 0xC2,0x3F,0x65,0x42,0x46,0xF0,0x2B,0x8B,0xC5,0x42,0xEC,0x5B,0x51,0x4D,0x15,0x60, + + 0x9D,0x3E,0x15,0x77,0xB1,0xA1,0xCB,0x37,0xBD,0x73,0xDF,0xB7,0xF4,0x62,0x71,0x31, + + 0x1E,0x34,0xC6,0x44,0xB6,0x0C,0x89,0x1B,0x6E,0x21,0x34,0xFA,0x52,0x59,0x0E,0xCF, + + 0x24,0x97,0x28,0x06,0x3B,0xB6,0x5A,0x93,0x40,0x75,0xA5,0x14,0x14,0x52,0x2A,0xB0, + + 0xFD,0xFA,0xDD,0x38,0x77,0xD4,0xE9,0x67,0xD7,0x87,0x2B,0x05,0x5A,0x5B,0x6B,0xFB, + + 0xEF,0xE6,0xD5,0xCB,0x3A,0xAC,0xA1,0xF1,0x05,0x7A,0xEB,0x52,0x1C,0xB3,0x69,0xCD, + + 0xEE,0x68,0x1E,0x6E,0x38,0x94,0x3E,0xAE,0xE5,0x41,0xD6,0xAC,0xF3,0xF5,0x10,0x52, + + 0x0E,0x69,0x65,0x7E,0x5F,0xD5,0xA8,0xDA,0x2F,0x02,0x7F,0xCD,0x2A,0x78,0x2F,0x8F, + + 0x25,0x01,0xBC,0xFC,0xE3,0x13,0x09,0xCF,0xAE,0x73,0xAF,0x36,0xDC,0xA8,0xC3,0x73, + + 0x0B,0xD6,0x91,0xFE,0x77,0xB2,0x3F,0xC8,0xD1,0x7A,0xBB,0x40,0x1C,0x98,0x58,0xE7, + + 0x0D,0xDC,0xC0,0xA8,0xF4,0x77,0xBD,0x8A,0x72,0x73,0xCC,0x5E,0xC2,0x53,0x68,0xEF, + + 0xA7,0x49,0x88,0x2F,0xD4,0x16,0x01,0x07,0x90,0x9F,0x6E,0xFE,0x7F,0xFD,0x61,0xE7, + + 0x26,0x39,0x99,0x3B,0xAC,0xF3,0xAB,0x06,0x11,0x53,0x53,0x9C,0x9D,0xF1,0xFF,0x59, + + 0x6A,0xD7,0x50,0x8D,0xB1,0xDD,0x66,0xD7,0x06,0xB6,0xFF,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x6C,0xAD,0xA8,0x66,0xAD,0x2C,0xCC,0x24,0x71,0x5C,0x37,0x09,0x33,0x0A,0x40,0x91, + + 0x62,0x15,0x5E,0x90,0x41,0xFF,0x32,0xE0,0x4D,0xC8,0xC0,0x11,0x89,0x25,0x97,0x46, + + 0x4A,0xB8,0xB9,0x3B,0xF6,0xD7,0x71,0x23,0x99,0x4F,0x87,0x10,0x63,0x2F,0x1F,0x24, + + 0x32,0x4E,0x3E,0xF0,0x62,0x9C,0x9D,0x51,0x83,0x45,0xBA,0x32,0x70,0xBC,0x1A,0xE5, + + 0x6A,0xE5,0x7B,0xE8,0xA5,0xBF,0x01,0x12,0xB5,0xBB,0x47,0xB4,0xA5,0x6D,0x30,0x23, + + 0x6F,0x47,0x62,0xF4,0xB2,0xDA,0x0E,0xE3,0x79,0xE8,0x8A,0x8A,0xA4,0x0B,0x81,0x5D, + + 0x8C,0x8B,0xC5,0xBC,0x92,0x20,0x71,0xC4,0x4D,0xEB,0xC1,0xE1,0x86,0x37,0x4E,0x3C, + + 0x85,0xD7,0x12,0x55,0x95,0x97,0x0B,0xE2,0xF1,0x4F,0xE7,0x49,0x0D,0xCA,0x1A,0x19, + + 0xF4,0xE9,0x79,0x88,0x1C,0xF7,0xB8,0x88,0x2B,0xAA,0x26,0x4E,0xBB,0x63,0x9C,0x1A, + + 0xB8,0x12,0xB2,0xF2,0x9A,0x24,0x62,0x1F,0x2A,0xDB,0x1A,0x7D,0x54,0xDD,0xC3,0xD8, + + 0x96,0xAA,0xEB,0x6F,0x27,0x24,0x6B,0x0E,0xAB,0x78,0x13,0x53,0x3B,0x61,0x4B,0xE9, + + 0x76,0x44,0xF6,0xDF,0x38,0x34,0x63,0xBB,0x0C,0x8F,0x3B,0x27,0x55,0xE0,0x9D,0xCC, + + 0x52,0x37,0x3E,0xC8,0x4E,0x60,0x43,0x1B,0x20,0xEA,0xC5,0xF2,0x59,0x4E,0xDC,0xDC, + + 0x5B,0x61,0x31,0x03,0xA6,0xD1,0x3C,0xD0,0xBC,0x0F,0xC9,0xCC,0xAC,0xB2,0x83,0x55, + + 0xC6,0xA3,0x56,0xA2,0x6F,0x7D,0x06,0x96,0x23,0xCD,0x8A,0x7A,0xDC,0xBE,0x8B,0x45, + + 0xF4,0x4D,0x5B,0x2E,0xC8,0x26,0xC2,0xD7,0x22,0x7C,0x37,0x0E,0xF9,0x99,0x3C,0x7F, + + 0xD1,0x52,0x87,0x5A,0xCC,0x7B,0xD4,0xCC,0x3D,0x84,0xAC,0x57,0x48,0xC4,0xC8,0x6E, + + 0x8D,0x1C,0x0C,0x6A,0xB2,0x3C,0xBF,0x04,0xBD,0xB2,0x65,0x93,0xD0,0xFE,0x06,0x26, + + 0x04,0xFF,0xFE,0x7E,0x47,0x70,0xCB,0xBE,0xD3,0x13,0x35,0xBF,0x7C,0x7F,0xC9,0x7E, + + 0x34,0xCE,0x70,0x57,0x10,0x6C,0xF1,0x59,0x33,0x1E,0xC5,0xB1,0x44,0xFC,0x84,0x79, + + 0x1D,0xB4,0x01,0x46,0xA7,0xD3,0x6E,0x0F,0xD5,0x3A,0xF4,0x81,0xD3,0x75,0x2E,0xCD, + + 0x20,0x55,0xCB,0xBD,0x92,0x9A,0x3E,0xF4,0x62,0x67,0xCA,0xDC,0x98,0x64,0xD3,0xB2, + + 0xCE,0x7A,0xFD,0x36,0x82,0x74,0x6A,0x73,0xE2,0xCB,0x6F,0xF1,0x91,0xEF,0x59,0xAC, + + 0x87,0xC3,0x9B,0xF2,0x12,0x98,0x67,0xC8,0x1C,0xCA,0xBD,0xBB,0x1D,0x7A,0xAF,0xB7, + + 0x4A,0xE5,0xEE,0xEE,0x83,0x36,0x70,0x65,0x81,0x02,0xCE,0xC9,0x43,0x18,0xB1,0xA1, + + 0xD2,0xC4,0x32,0x1E,0xFC,0xF1,0xDF,0x3A,0xF0,0xD2,0x3A,0xD7,0x7F,0xE9,0xD3,0x1A, + + 0x09,0xC5,0xBF,0x67,0xBE,0x7A,0xD7,0xB1,0x5F,0x50,0xD2,0xB6,0x7C,0xEE,0x5C,0x63, + + 0x50,0xBA,0x4F,0x8D,0x6C,0x96,0x27,0x46,0xC8,0x39,0x35,0xC3,0x5A,0x1E,0x14,0xD7, + + 0x40,0x88,0x14,0x48,0x62,0xD7,0x04,0x16,0xE8,0x90,0x29,0x9F,0x4A,0x10,0x58,0x6D, + + 0xC0,0x2E,0xF6,0x2F,0x09,0x7F,0x9E,0xF9,0xA6,0x20,0xCF,0xC2,0x03,0x88,0x95,0xD2, + + 0xC4,0x93,0xFF,0x3E,0xD4,0x5B,0x87,0x6D,0xB2,0x83,0x30,0x2D,0xFE,0x8A,0x71,0x6D, + + 0xC9,0x80,0xC8,0xCE,0x50,0x5B,0xC8,0x16,0x5E,0x8C,0x4C,0xC6,0x9D,0xEA,0x1E,0xDB, + + 0x25,0x20,0x60,0x02,0xB9,0xA6,0x6A,0xB2,0xE7,0xDB,0x4F,0xC4,0xF8,0xEF,0xD0,0x36, + + 0xD9,0x02,0x03,0x94,0xD0,0x69,0x80,0xC9,0xB9,0x0A,0xC1,0x44,0xF2,0xC9,0x1F,0xF2, + + 0x09,0xE0,0x0B,0x43,0x92,0x22,0x13,0x45,0x37,0xD2,0xEB,0x9C,0xBC,0x03,0x0E,0xA2, + + 0x1C,0xFE,0x69,0x07,0x2D,0xBE,0x8A,0xC2,0xC3,0x9A,0x35,0x44,0xB9,0xA1,0x63,0x1C, + + 0x00,0x54,0x67,0xC4,0xD3,0x40,0xE7,0x9D,0xAF,0xD7,0xCE,0x5B,0x80,0xEC,0x6B,0x3C, + + 0x01,0x55,0xA0,0x5B,0xB6,0x24,0x1E,0xC7,0xB2,0x63,0x86,0x5E,0xD7,0xB5,0xE7,0x30, + + 0xEA,0xC4,0xD9,0x80,0x54,0xBD,0xA2,0x9D,0x4B,0x3B,0x77,0x8F,0x30,0xAB,0xB6,0xD7, + + 0xDF,0xB6,0x68,0xB5,0x17,0x07,0xAB,0x33,0xD3,0x6A,0x99,0x75,0xA8,0xEA,0x0F,0x8E, + + 0x54,0x17,0x8A,0x6C,0xA5,0xA4,0xBD,0x34,0x27,0x3C,0xB5,0x09,0xFD,0x37,0x11,0xA6, + + 0xD4,0x74,0x17,0x5C,0xBC,0x7C,0x41,0x32,0xE8,0x76,0x2C,0xBA,0x05,0xCE,0x9C,0x3A, + + 0xA3,0x75,0x9B,0x61,0x1D,0xA7,0xE9,0xC3,0x08,0x87,0x07,0x4D,0x23,0x47,0x04,0xE1, + + 0x74,0x2A,0x79,0x20,0xF3,0xE9,0x8C,0xD3,0x39,0x20,0x83,0xCC,0xED,0x8E,0xA2,0x56, + + 0x42,0x88,0xD8,0xCC,0xDB,0x48,0xA4,0x5A,0xB1,0x33,0xA2,0x18,0x52,0x47,0x5D,0x77, + + 0xFF,0xDC,0xAC,0x6B,0x19,0x1D,0x81,0x5E,0x96,0x30,0x5C,0x1C,0xD2,0x6B,0xE0,0xCF, + + 0xF4,0xF5,0x9B,0xBE,0xF2,0x5E,0x4D,0xDF,0xAC,0x31,0xE2,0xDB,0x5C,0x22,0xDC,0x72, + + 0x7B,0x9E,0x55,0xBF,0x9B,0x8A,0x54,0x21,0x3A,0x53,0xA2,0xBF,0x87,0xE9,0x1C,0x7D, + + 0xD5,0xD2,0x72,0xB7,0x03,0x1F,0x0A,0x17,0xF5,0x2D,0x0B,0x44,0xBC,0x81,0x14,0x6D, + + 0xAA,0xE7,0xF1,0x65,0x0E,0xF0,0x97,0xF5,0x6B,0x0D,0x81,0x32,0x25,0xDF,0x26,0x24, + + 0x53,0xF7,0x7C,0xF4,0xD2,0x11,0x1C,0xAB,0x64,0x72,0x15,0xB4,0xC0,0x96,0x96,0x1D, + + 0xA4,0x53,0x97,0x64,0xD9,0x1E,0xF9,0x79,0x5E,0x7C,0x7D,0xAB,0xB9,0xCE,0x1A,0x6A, + + 0xAB,0x39,0xDC,0x35,0x4E,0xD1,0x8D,0x1A,0x62,0x6F,0xA2,0x62,0x75,0x49,0x2B,0x95, + + 0xC6,0x33,0xEB,0x51,0xDC,0xD1,0x7C,0x88,0xA5,0xF5,0x4F,0xCB,0x8B,0xF6,0x37,0x51, + + 0xE6,0x9C,0xDD,0x34,0xC2,0xF4,0x75,0x24,0x1F,0x50,0x56,0x46,0x2A,0xB5,0x3B,0x2C, + + 0xC4,0x17,0xD5,0x24,0xCB,0xD2,0x75,0x7A,0x06,0x66,0xCA,0x5F,0x07,0x14,0x8D,0xE4, + + 0xF9,0x64,0x30,0x0A,0x64,0x5C,0xE0,0xB4,0x0A,0xDE,0xEE,0xC8,0x1F,0x92,0x38,0x7E, + + 0xC6,0xD2,0x38,0x1A,0x65,0x1F,0x0B,0xD0,0xEC,0xD4,0xC1,0x4E,0x87,0x58,0x9A,0xD4, + + 0x45,0x39,0x90,0x89,0x4F,0x17,0x9D,0xEF,0xEA,0x5A,0xA1,0x9A,0x4F,0xB7,0x12,0xAA, + + 0x82,0x34,0x18,0x99,0x56,0xEA,0x02,0xF9,0x4C,0x86,0x29,0x55,0x04,0xB4,0x00,0x7A, + + 0xD9,0xDE,0xDE,0x3D,0x1C,0xFE,0x89,0x90,0x0C,0x23,0x36,0x2E,0x87,0x28,0x89,0x25, + + 0x4C,0x1D,0xF6,0xAD,0x47,0x37,0x79,0x84,0x69,0xFD,0xAA,0xC1,0x59,0x68,0xFE,0x65, + + 0x23,0x13,0x64,0xD2,0x1F,0xB5,0x17,0xBD,0xC4,0x9C,0x23,0xF0,0x9C,0x2B,0x8C,0x25, + + 0x8D,0x72,0x14,0xBF,0xDB,0x12,0xD1,0x84,0xD3,0xA0,0x2B,0xC4,0x9D,0xBD,0x8C,0xD1, + + 0x9D,0xFD,0xB8,0xFB,0x67,0x20,0x36,0x85,0x6A,0xE4,0x50,0x38,0x8C,0xD5,0xE4,0x7F, + + 0xCB,0x10,0xF1,0x72,0xEA,0xBA,0xF4,0x43,0x63,0xE7,0x8D,0x0A,0x61,0x23,0xAC,0x4F, + + 0x75,0x5E,0xDB,0xBE,0xF8,0xC3,0x43,0x85,0x40,0xF6,0x86,0x1F,0xA0,0x97,0xB0,0x83, + + 0x81,0x09,0x89,0x91,0xDC,0x07,0x48,0x42,0xBD,0xE5,0xD1,0x4E,0x05,0x20,0xEB,0x8A, + + 0xB9,0x6A,0x00,0x18,0xD7,0xF0,0x7F,0xE4,0x16,0x08,0xAE,0x62,0xB3,0xC7,0x1A,0x90, + + 0x55,0x69,0xEA,0x32,0xE4,0x35,0xE3,0xC1,0x21,0xEA,0xA3,0x53,0xF2,0x94,0x27,0xF0, + + 0x77,0xA0,0x50,0x5A,0xAE,0x3D,0x47,0xD0,0x29,0xE5,0x75,0x96,0x5E,0x6B,0x77,0xE0, + + 0x59,0xAA,0x71,0xAA,0x1C,0x81,0x0B,0x73,0x86,0x92,0x26,0x0F,0xA5,0xB8,0x82,0x0B, + + 0xEE,0x46,0x42,0x15,0xB9,0xD7,0xC4,0x68,0x1C,0xE5,0x35,0x89,0xA0,0x99,0x32,0xE7, + + 0x86,0xA4,0xF3,0x63,0xBE,0x84,0x09,0x4B,0x27,0xEA,0x29,0x10,0x5F,0x63,0x94,0x8B, + + 0x15,0xD1,0xD9,0xB6,0xF0,0xCB,0x42,0x18,0xEE,0xE5,0xA0,0x11,0x24,0x1B,0xDB,0x86, + + 0x60,0x28,0x1D,0x7D,0x9D,0x02,0x4F,0xCA,0xF5,0x4F,0xA4,0x23,0xBB,0x9F,0x10,0xD2, + + 0x09,0x1E,0xD7,0x32,0xD0,0x3D,0x82,0x57,0x64,0x0E,0x89,0x6C,0x21,0x0C,0x13,0x5C, + + 0x86,0x6E,0x35,0xAF,0x23,0xF0,0xAC,0x3A,0xEA,0xB0,0x0A,0x63,0x75,0xC0,0x7D,0xF8, + + 0x7E,0x8D,0x8B,0x41,0x67,0xAF,0x50,0xB7,0xCC,0x9E,0x13,0x6C,0x17,0xBA,0xE0,0xFC, + + 0x5E,0x11,0x99,0xA2,0x70,0x3E,0x73,0x1B,0x3F,0x4C,0x8B,0x4D,0x9B,0xC0,0xFF,0xBA, + + 0x0A,0xA5,0x97,0xA3,0x91,0x9F,0x45,0x98,0x66,0xE0,0x46,0x3A,0x87,0x76,0x23,0xFF, + + 0xF8,0x8D,0xB4,0x67,0x45,0x54,0x09,0x52,0xCD,0xFC,0xB1,0x4E,0xDD,0x7C,0xD5,0x05, + + 0xA8,0xB5,0x92,0x01,0xE0,0xAE,0x33,0x52,0x6C,0xFF,0xF7,0x13,0xF6,0xA2,0xB4,0xCB, + + 0xA7,0x33,0xB5,0x66,0xCD,0x71,0x8C,0x53,0xE7,0xE3,0xE2,0xF2,0x18,0x40,0x51,0x5F, + + 0xCB,0x05,0xC3,0xF1,0x34,0xE4,0x6C,0xDE,0x40,0xA1,0x80,0x1B,0x93,0xF2,0xEA,0x54, + + 0x77,0x84,0x0C,0xC8,0xFF,0x77,0x34,0x92,0x9C,0x5B,0x25,0x86,0xC8,0x6A,0xA6,0x01, + + 0xA8,0x0D,0x62,0x41,0xEA,0x13,0x01,0x65,0xB2,0x88,0xD5,0xAA,0x0F,0x0A,0x1F,0x2B, + + 0x54,0x79,0xCA,0xEA,0xB5,0xE7,0x65,0x0F,0xE5,0x37,0x6E,0xCC,0x0F,0xA6,0xA8,0x96, + + 0x02,0xEC,0x81,0xAF,0x99,0x97,0xF2,0x5B,0xE4,0xF5,0xF1,0x57,0x91,0x6B,0xA6,0xA5, + + 0xA6,0xB4,0x9B,0x18,0x61,0xCC,0x0D,0x5A,0x6F,0xE9,0xD0,0xA2,0x47,0x8D,0xD7,0x29, + + 0xD4,0x19,0x96,0xAA,0x19,0x95,0x82,0x4B,0x44,0xF7,0xF4,0x57,0xFE,0x12,0x9C,0x0A, + + 0xCF,0xB6,0xB7,0x6E,0x8D,0x5E,0x02,0xCA,0xD1,0x54,0xCC,0xCE,0xD3,0xF1,0x78,0xE5, + + 0xF4,0xB1,0x61,0xBF,0x56,0x35,0x73,0xF6,0x08,0xA8,0xAD,0x17,0x7C,0xAC,0x10,0x74, + + 0xD4,0x71,0x6D,0xE5,0xE7,0xEC,0x78,0x4D,0x2A,0x28,0x61,0xBE,0xDA,0xA8,0xD6,0x57, + + 0xAB,0x7E,0x47,0xEE,0xD2,0x7F,0x01,0xFA,0x8C,0x36,0x19,0x93,0x7B,0x73,0x71,0x61, + + 0x61,0x3C,0xEC,0xE0,0x63,0x3C,0x48,0xD7,0x9B,0xEA,0x0F,0xC2,0xD5,0x3D,0x42,0x02, + + 0x07,0x60,0xF1,0x22,0x7F,0x41,0x37,0x65,0xAD,0xD3,0xE6,0x18,0x72,0x15,0xF8,0x10, + + 0x31,0x2C,0x88,0xEF,0xB4,0x2B,0x06,0x87,0x8F,0xE2,0xEE,0xB2,0x58,0x4B,0x1B,0xF0, + + 0xAE,0x2D,0x26,0x96,0xF8,0xA4,0x57,0x87,0x2F,0x53,0x65,0x1D,0xB6,0x57,0xF9,0xC3, + + 0x05,0x2B,0x2E,0x27,0xDF,0x0C,0x47,0x1E,0xC3,0x13,0x1A,0x97,0x09,0xC0,0x1D,0x85, + + 0xCC,0xE7,0xB9,0x50,0xB3,0x7B,0xC7,0xC3,0x40,0x54,0x50,0x14,0x3C,0x15,0xEC,0xA3, + + 0x31,0x7A,0x8E,0x7B,0xE2,0x03,0x10,0x10,0xB0,0x87,0x4C,0x19,0xF4,0xA7,0xDA,0xD0, + + 0xA0,0x8E,0xE0,0x21,0x69,0xC8,0x9A,0xA1,0x67,0x39,0x8F,0x60,0x63,0xE9,0x57,0x7B, + + 0xC4,0x18,0x78,0x97,0x83,0x5A,0xFD,0x78,0x13,0x84,0x7A,0xFA,0x76,0x18,0x76,0xEA, + + 0x28,0xD5,0x73,0xFE,0x13,0x09,0xB5,0xDA,0x44,0xC7,0xD2,0xBC,0xCE,0xAA,0x86,0x75, + + 0xC7,0x98,0x2A,0x7D,0x16,0xEB,0x2F,0x29,0x2B,0x98,0x82,0xC1,0xD0,0x44,0x69,0xF5, + + 0xAF,0x38,0x35,0xE5,0x39,0xA1,0x13,0x33,0x04,0x69,0x30,0x64,0x2B,0x8F,0xD4,0x75, + + 0x4F,0x8B,0xA8,0x5C,0x3C,0x04,0x1D,0x8E,0xF1,0x6F,0x6D,0xA0,0x22,0x46,0x7A,0x7E, + + 0xE7,0xDD,0xF0,0xB1,0xF5,0xDD,0xD5,0xCF,0xBA,0x4F,0x46,0x0C,0x58,0x3C,0xAA,0x46, + + 0x3B,0x0E,0x7B,0xDA,0x4F,0xB0,0x91,0xFE,0x1B,0x2A,0x82,0x59,0xA2,0xE2,0x29,0xB1, + + 0xAF,0x8F,0x58,0xFF,0x61,0x01,0xC4,0xDA,0xC8,0x5E,0x36,0x48,0x72,0x12,0x10,0xA5, + + 0x00,0x22,0x2B,0x43,0x53,0xED,0x53,0x19,0x32,0xC3,0x57,0x8F,0xDD,0x49,0x33,0x11, + + 0x4E,0x98,0x9C,0x75,0x08,0xF2,0x80,0xD1,0x50,0xDF,0x94,0xF7,0x56,0xF9,0xFC,0x61, + + 0x11,0x3C,0x7E,0xB1,0x94,0x1E,0xA9,0x50,0xC9,0x7C,0x82,0x1A,0x8E,0x6A,0xA6,0xF0, + + 0xC2,0x33,0xA6,0xED,0x15,0x1D,0xF5,0xBA,0x8B,0x7F,0x31,0x56,0xC2,0x0D,0x7B,0x22, + + 0x8F,0x3C,0x7B,0x13,0xED,0x52,0x2E,0x51,0x86,0x64,0xBD,0xF0,0x1C,0x90,0x5A,0x6F, + + 0xEC,0x97,0x41,0x67,0x30,0x64,0x61,0xD8,0x56,0x21,0xF7,0x38,0x8A,0xD7,0x91,0xEC, + + 0x01,0x60,0x15,0xF1,0x96,0xCA,0xF7,0xA4,0xB3,0xC4,0x7F,0x23,0xF4,0xF8,0x6D,0xEA, + + 0x4F,0xC5,0x20,0xE0,0x1A,0xBB,0xA1,0xDD,0xC0,0x94,0x8E,0x1C,0x01,0xB4,0xB9,0x28, + + 0xA1,0x47,0x2D,0xCB,0xA9,0xBA,0xDA,0xDA,0x2F,0xC4,0x6A,0x08,0x74,0xFA,0x33,0x88, + + 0x74,0xF4,0x9E,0x7D,0x0E,0xDD,0x20,0x9F,0xDF,0x95,0xD1,0xDD,0x5A,0x6E,0x50,0xB6, + + 0xC4,0x3A,0xAD,0xDD,0x3B,0x69,0x39,0xCD,0xE0,0xBB,0x0D,0x1A,0x4E,0xB9,0x19,0x3F, + + 0x66,0xD9,0x9F,0x7C,0x86,0xF8,0x9B,0x2E,0x13,0x98,0xFF,0x3E,0x15,0x99,0x49,0x3A, + + 0x46,0xAA,0x09,0x1B,0xED,0x27,0xA8,0x44,0xEB,0x6B,0x13,0x1A,0x28,0x98,0xCE,0xFB, + + 0x00,0x33,0x1D,0xE9,0x9F,0xCD,0xFA,0xF9,0x54,0x54,0x25,0x6A,0x2A,0x8E,0x10,0x7E, + + 0xDB,0x1E,0xC9,0xD8,0xEF,0xD9,0x49,0xD7,0x9F,0x8C,0x4D,0x5A,0x83,0x9E,0xB3,0xB5, + + 0xC4,0xDD,0x18,0xB1,0x88,0x61,0xC2,0xD6,0x5A,0x0F,0x8F,0xC8,0x03,0xF1,0xD8,0x6A, + + 0x76,0xE2,0xD1,0xD9,0xDF,0x3F,0xC8,0x4A,0x1B,0x5C,0x6F,0xFF,0x89,0xCB,0x59,0xE7, + + 0xA5,0x5F,0x40,0x49,0x5A,0x8D,0x2F,0xC2,0xBD,0xC1,0xA8,0xA1,0xEF,0xDD,0x48,0xE8, + + 0xBD,0xFA,0x9E,0x28,0xFA,0xF0,0x66,0x1D,0x3A,0x41,0x58,0xDD,0x38,0x3C,0x00,0x67, + + 0x3F,0xB9,0xD1,0x81,0xAB,0x97,0x95,0x5F,0xA2,0x62,0x87,0x47,0x2F,0xFF,0x30,0xED, + + 0x63,0x43,0x32,0xA4,0xE9,0x8C,0x42,0xD3,0x20,0xBC,0x3C,0xD7,0xD7,0x23,0x3E,0x11, + + 0x12,0x49,0x3C,0x22,0xF9,0x15,0x43,0x12,0x28,0x35,0xF0,0xF6,0xD2,0x6E,0x91,0xE2, + + 0x78,0x07,0xDE,0x36,0xEC,0x88,0xE2,0x37,0x4D,0x29,0x86,0x5C,0x75,0x27,0x3F,0x15, + + 0xBD,0x1B,0xC0,0x23,0x79,0x77,0x2F,0x4C,0xF1,0xB0,0x53,0x94,0xBE,0x66,0x12,0x7E, + + 0xFC,0x1A,0xDC,0xF0,0x64,0xDA,0x99,0x98,0x42,0x4D,0x01,0x8A,0xD5,0x6C,0x8D,0x66, + + 0x3B,0x67,0x95,0x88,0x23,0x5D,0xD2,0xE9,0x5B,0xE3,0x5A,0x57,0x09,0x63,0xB2,0xEB, + + 0x23,0x67,0x31,0xAD,0x25,0x86,0x5A,0xC9,0x3D,0x46,0x20,0xAE,0x11,0x7B,0xBB,0xFA, + + 0xAA,0x1A,0x95,0x35,0x73,0xBB,0x00,0x06,0xA3,0xFB,0x3C,0x6A,0xEB,0xBC,0x52,0x87, + + 0x6C,0x8D,0x1E,0x0C,0xE5,0x2F,0x45,0x04,0xC9,0xE6,0x21,0xAF,0xD9,0x63,0x99,0xFA, + + 0x0C,0x74,0xD0,0x4B,0xE5,0xA1,0x04,0xEC,0x71,0xCB,0xFD,0xE8,0x71,0x71,0xB1,0xAB, + + 0x3F,0x80,0x4C,0x02,0x96,0x4F,0x4F,0x6B,0x66,0x42,0x5E,0xBC,0x0B,0x6E,0x05,0x3A, + + 0xA7,0x8F,0x10,0xB3,0x67,0x35,0x09,0x68,0x69,0xE3,0xED,0x74,0x57,0xE8,0x35,0x70, + + 0x62,0x3E,0x60,0xD8,0x08,0x10,0x69,0x6A,0x68,0x2C,0xC9,0x74,0xFB,0xAE,0x00,0x94, + + 0x13,0xA6,0x2C,0xB4,0xB2,0x34,0x6A,0x9D,0x03,0x70,0x72,0xD2,0xFD,0xF6,0x73,0xE3, + + 0x0B,0xB0,0x0C,0xB5,0xA2,0x2A,0x5A,0x9D,0xE1,0x3F,0xBC,0xB9,0x77,0x4A,0xBF,0x7B, + + 0xB0,0xDF,0x1E,0xE7,0x92,0xDF,0x43,0x9D,0x0B,0x83,0x11,0x65,0xFC,0xB2,0x35,0x6E, + + 0x48,0x10,0x6E,0xE3,0xA3,0xFB,0x8D,0x40,0xDD,0x77,0x78,0x31,0xCA,0xF6,0xB7,0x44, + + 0x14,0x86,0x3E,0xCC,0xCF,0xFB,0xA9,0x64,0x37,0xC5,0x42,0x94,0xF2,0x6B,0x5E,0x6A, + + 0xC8,0x51,0xB3,0xA6,0x59,0x04,0xE6,0x37,0x65,0x6E,0xD4,0xE1,0x51,0x74,0x7B,0xE8, + + 0xCA,0x1B,0xFB,0xE9,0xD2,0x76,0x75,0x61,0xD1,0xA0,0x6C,0x95,0x72,0x60,0x77,0x61, + + 0x17,0xB8,0xB6,0x28,0xB1,0xEC,0x75,0xB1,0xAF,0x15,0x9C,0x33,0xDF,0x73,0xC6,0x61, + + 0x41,0x85,0xDE,0x84,0x3E,0x33,0x48,0x90,0xE9,0xF3,0xDE,0xA9,0x7E,0x43,0x30,0x39, + + 0x49,0x39,0x9A,0x4F,0x0A,0x56,0x27,0xCB,0x44,0xD8,0x0E,0x44,0xF1,0xC2,0x7F,0xAE, + + 0x51,0x15,0xA8,0x09,0x9B,0x3A,0x00,0x1B,0x83,0x8B,0x3A,0x29,0xDB,0x38,0x70,0xEB, + + 0xC3,0x18,0x37,0x63,0xA9,0x76,0xE4,0x4A,0xCB,0xD6,0xB7,0x92,0x90,0x2E,0xE2,0xB6, + + 0x89,0x79,0x73,0x48,0x3D,0x25,0x0B,0x5A,0xCB,0xD4,0x94,0x68,0x41,0xD8,0x31,0x20, + + 0x2B,0x66,0x0E,0x35,0xDB,0x35,0x52,0x64,0x1C,0x08,0xC4,0xFE,0xC8,0x20,0xF8,0x2B, + + 0x43,0x4F,0x78,0x91,0x99,0x2E,0xD7,0x0B,0xA2,0x6F,0x3B,0x82,0x24,0xA3,0x58,0x28, + + 0xEA,0x7C,0x4A,0x1B,0x9B,0x7E,0x80,0x43,0x13,0x16,0xC5,0xFF,0x69,0x77,0x30,0x8A, + + 0xE1,0x06,0x8C,0x22,0x12,0x9B,0xA5,0x42,0x7C,0x4D,0xE2,0xCE,0x8A,0x2D,0x03,0x90, + + 0xCC,0xDC,0xF5,0x59,0x90,0xC0,0x89,0x0E,0xBD,0x70,0x00,0xAD,0x36,0xE5,0xAA,0x43, + + 0x80,0xA2,0x93,0xC7,0x98,0xE0,0x4F,0x96,0x78,0x33,0x4E,0xDC,0xE7,0xED,0x11,0xD4, + + 0x47,0x63,0x01,0x33,0x93,0x98,0x0A,0x0B,0x3A,0x81,0x79,0xDE,0xB3,0xE9,0xCC,0xD1, + + 0x23,0x8C,0x9E,0xF7,0x29,0xA6,0x0E,0xD2,0x2E,0xC9,0x72,0x46,0x1A,0x84,0x7B,0x63, + + 0xA6,0x7A,0xB3,0xB4,0xF6,0x5A,0x03,0x09,0x27,0xD3,0xA1,0xE8,0xB2,0x63,0xE1,0x02, + + 0x11,0x2B,0x38,0x68,0xED,0xA6,0x0E,0x10,0xE8,0xA5,0x31,0x86,0xE0,0x88,0x57,0x7E, + + 0xA9,0x58,0x29,0x56,0xE5,0x0A,0x86,0x09,0xA5,0x43,0xFD,0xFF,0x32,0x61,0x2A,0x0E, + + 0x04,0x14,0x47,0x8A,0x3F,0x14,0x3F,0xCC,0xAD,0x69,0xA0,0x51,0xD1,0x8A,0x28,0xF8, + + 0x3E,0x5F,0xF2,0x9A,0x76,0x98,0x3E,0x8B,0x3D,0x66,0x02,0xA1,0x5B,0xD2,0x43,0x58, + + 0x39,0x87,0x63,0xEF,0x9C,0xEA,0x24,0xD8,0xB4,0x41,0x4C,0x68,0xEF,0xB7,0xA9,0x6D, + + 0x9F,0x80,0xD9,0xEE,0xA9,0xB6,0x28,0x49,0xA5,0x3A,0xEA,0xFF,0x9B,0xF0,0xDD,0x7A, + + 0xBF,0x73,0x73,0x7F,0xBF,0x53,0x89,0x9A,0xCF,0x7D,0xF2,0xAE,0x5A,0xC8,0x54,0x76, + + 0xB0,0xD6,0xF4,0x3C,0xE0,0xC8,0x29,0x41,0xCB,0x52,0x03,0x76,0xFA,0x92,0xD8,0xFB, + + 0x6C,0x51,0xDD,0x66,0x98,0x95,0x0D,0x6D,0xAD,0xEA,0xFF,0x87,0x23,0xA3,0x6B,0xA2, + + 0x0E,0x14,0xD3,0xB7,0x45,0x53,0x45,0x1E,0xA7,0xA6,0x17,0xEC,0xEF,0x42,0x5F,0x7F, + + 0x26,0x4B,0xDB,0xDC,0xC1,0x2C,0x4A,0x9F,0x8D,0x21,0xAE,0x5B,0xE6,0x2B,0x80,0xE0, + + 0xFB,0x2E,0xEF,0xED,0x5D,0xBC,0x6D,0xC1,0x15,0x50,0x86,0x45,0x49,0x5E,0x90,0x07, + + 0xA3,0x8B,0x9A,0x1E,0x97,0x92,0x99,0x30,0xC1,0xD8,0x10,0xA3,0xA9,0xAF,0x17,0x0D, + + 0x56,0x3E,0x52,0xED,0x9B,0x6C,0x3F,0x4C,0x04,0x70,0xAE,0x5F,0x08,0xBC,0xBB,0x80, + + 0x51,0x43,0xDE,0x2E,0xEC,0x7B,0x2F,0xE2,0x60,0x9E,0x74,0x20,0x46,0xBA,0x35,0x30, + + 0x82,0x33,0x7C,0x90,0x17,0xF9,0x28,0xE9,0x45,0x41,0x05,0xFE,0x92,0x99,0xA5,0x9B, + + 0xED,0xFA,0xE4,0x31,0x33,0xB7,0x6C,0xFC,0xC0,0x02,0xE5,0x0F,0x2C,0x3B,0xFE,0xA0, + + 0xDF,0xD5,0x79,0x91,0x93,0xFB,0xEA,0x77,0xDC,0xF6,0x9F,0xE6,0x42,0x71,0x72,0xBB, + + 0x8D,0x67,0x98,0xA2,0x40,0x17,0xA3,0x54,0x07,0x70,0xB7,0x48,0x0B,0xAD,0x74,0x1E, + + 0x2B,0xA2,0xD0,0x99,0x9C,0xFC,0x8B,0x86,0xD9,0x68,0x47,0x45,0x7B,0x21,0x19,0x2B, + + 0x82,0x45,0x07,0xFC,0x84,0x69,0x37,0xB8,0xCE,0x12,0x68,0x15,0xC3,0x70,0x32,0xE1, + + 0x0E,0xFE,0x11,0x1A,0x0A,0xDE,0x08,0x83,0x1D,0xAA,0x73,0x57,0x52,0xB6,0x3B,0x7A, + + 0x2D,0x7C,0xF7,0x26,0x94,0xF1,0xC1,0x4E,0x9A,0xFF,0xF6,0xAE,0x6B,0xFD,0x50,0xE6, + + 0x88,0x30,0x90,0xF6,0xB2,0x3B,0x43,0x84,0xC8,0xCD,0x6A,0xC0,0x13,0x08,0x59,0xF2, + + 0x09,0x8E,0x99,0xFA,0xAE,0xF3,0xB7,0xEE,0x76,0xC5,0x65,0xA2,0xDC,0x5F,0xFE,0xEA, + + 0xDF,0x30,0x3F,0xAC,0xD3,0x36,0xC0,0x1D,0xCB,0xC4,0xEE,0x07,0xFF,0x44,0x84,0x84, + + 0x08,0xA7,0x00,0xE6,0x92,0x28,0x10,0x20,0x40,0xCD,0xB7,0x08,0x80,0x51,0xE4,0x94, + + 0x3A,0xF0,0x00,0x29,0xB2,0x27,0x64,0xD6,0x65,0x5A,0x29,0xD6,0xFD,0xEA,0x46,0x85, + + 0x84,0x90,0x08,0x95,0x33,0x24,0x48,0xAF,0x27,0x59,0xF1,0x27,0xF0,0xE9,0x01,0x15, + + 0x01,0xB2,0x01,0x29,0x70,0x2C,0x67,0x57,0x81,0x0C,0xD7,0xD7,0x7D,0xBE,0x38,0x42, + + 0x18,0x89,0x44,0x4F,0xC6,0x47,0x51,0xE4,0x02,0x0D,0xD0,0x64,0x52,0x64,0x5E,0x11, + + 0xE8,0xB6,0x79,0xF1,0x68,0x05,0x7F,0x58,0x93,0xA4,0xD8,0x74,0x53,0x65,0x3A,0xBA, + + 0x6B,0xB5,0x66,0xF5,0x2E,0xA5,0xF6,0x4D,0x16,0x77,0xD1,0x65,0xD2,0x66,0x77,0xE9, + + 0xE9,0x0F,0x7E,0xE1,0x95,0x8C,0xEA,0x5C,0x3F,0xD6,0xD9,0x75,0xD3,0x67,0x5B,0x9F, + + 0xED,0x64,0xDC,0xBD,0x08,0x57,0xD2,0xC9,0xD3,0x0A,0xEA,0x0B,0xA5,0x67,0xD0,0x1C, + + 0x89,0xA8,0xEB,0xE3,0x1F,0x09,0xBA,0xD0,0xA2,0x04,0x25,0xDE,0x22,0xA9,0x61,0x0D, + + 0x8B,0x3B,0x5A,0x4F,0x63,0xB1,0x4E,0xCD,0xCE,0xD2,0x27,0x53,0x7B,0x0F,0xCB,0xF0, + + 0x41,0x67,0xD8,0xE4,0x89,0xB0,0xF7,0xAB,0xD9,0x43,0x44,0x1D,0xAE,0x6F,0x3C,0xF0, + + 0xF3,0xAF,0x77,0x5D,0x7C,0x28,0x92,0x81,0x22,0xB9,0xD2,0x6C,0x5A,0x6C,0x1C,0xF4, + + 0xE0,0x5E,0x91,0x5C,0x1D,0x67,0xF9,0x41,0x97,0x9C,0xDA,0x7C,0x5B,0x6D,0x96,0xBA, + + 0xB4,0x93,0x77,0x69,0x42,0x7D,0x05,0xED,0xF1,0x48,0xD3,0x6D,0xDA,0x6E,0x75,0x3C, + + 0xE3,0xFC,0xD2,0x42,0xED,0xFB,0x65,0x41,0xA3,0x9E,0xDB,0x7D,0xDB,0x6F,0x00,0x04, + + 0x1B,0x95,0x6B,0x66,0xB2,0x18,0x66,0xA9,0x78,0xDB,0xAA,0xE0,0xFD,0xD6,0xB6,0xF0, + + 0x25,0x5F,0xF4,0xF6,0x70,0xB1,0xC4,0x34,0x30,0x15,0x4B,0x85,0xD0,0x8E,0x0D,0x90, + + 0x93,0xF4,0x21,0xE7,0xF3,0xDD,0xEA,0x43,0xE6,0x69,0x0D,0x65,0x91,0xDF,0x9D,0x6D, + + 0x1F,0xE8,0xF5,0xB1,0x50,0x9C,0xDD,0x54,0xD8,0x11,0xA3,0x09,0xF7,0x48,0x24,0xC2, + + 0xFF,0x19,0xC4,0xC4,0x32,0x34,0x50,0x0C,0x62,0xD9,0xD4,0xE4,0x72,0x74,0x70,0x41, + + 0xDB,0xBC,0xCC,0xD4,0x33,0x35,0x02,0xDF,0xB7,0xE4,0xDC,0xF4,0x73,0x75,0x3B,0x70, + + 0x81,0x56,0xC5,0xC5,0xB2,0x36,0x2A,0xDE,0x84,0x14,0xD5,0xE5,0xF2,0x76,0x7E,0xA1, + + 0xDC,0x01,0xCD,0xD5,0xB3,0x37,0xFA,0xCD,0x6E,0xFA,0xDD,0xF5,0xF3,0x77,0x46,0xFB, + + 0x41,0xB9,0x95,0x7F,0x04,0x97,0xDE,0xE7,0x4A,0x59,0x18,0xCE,0x93,0x70,0xDA,0x76, + + 0xC8,0xA6,0xAA,0x61,0xB8,0x8C,0x4E,0x34,0x25,0x42,0xA0,0x09,0x58,0x98,0x3F,0x66, + + 0x41,0x93,0x16,0x7E,0x80,0xE1,0x57,0x89,0xC4,0xEA,0x23,0xCF,0x13,0x52,0x8F,0xC5, + + 0xA6,0xC0,0x91,0xA7,0xD8,0x79,0x43,0xCB,0x4E,0x4B,0x2C,0xFD,0x05,0x53,0x9D,0xC7, + + 0x2C,0x56,0xC6,0xCC,0x3A,0x3C,0xC5,0x7B,0x4C,0xF1,0xD6,0xEC,0x7A,0x7C,0x5B,0xC3, + + 0x1B,0x89,0xCE,0xDC,0x3B,0x3D,0xDC,0xC6,0x41,0xA8,0xDE,0xFC,0x7B,0x7D,0x5E,0xD6, + + 0x9E,0xCA,0xC7,0xCD,0xBA,0x3E,0x40,0x7A,0xC0,0x54,0xD7,0xED,0xFA,0x7E,0xD9,0x5D, + + 0x90,0x3E,0xCF,0xDD,0xBB,0x3F,0x8F,0xFB,0xA1,0x31,0xDF,0xFD,0xFB,0x7F,0xE0,0xEB, + + 0x78,0x8A,0xA0,0xFB,0x14,0x7B,0x31,0xA6,0x6B,0xF9,0x70,0xE3,0xB8,0x1D,0x75,0x05, + + 0x88,0x9A,0x17,0x4A,0x34,0xB1,0x2C,0x16,0x43,0xEA,0x2A,0xD4,0x71,0x55,0x62,0xFA, + + 0xC4,0xC0,0x89,0x83,0x91,0x52,0xF1,0xD3,0x9B,0x8C,0xCB,0x37,0x56,0xE6,0x90,0x97, + + 0xBE,0xA0,0xC9,0x56,0x78,0x28,0x54,0xCF,0x4D,0x38,0x6F,0x39,0xE7,0x97,0x1E,0xFF, + + 0xE7,0x27,0xB7,0x5D,0x64,0x30,0x0E,0xC2,0xAF,0xB5,0xF0,0x66,0x56,0xE4,0xE0,0x71, + + 0x86,0x70,0x57,0x19,0xF6,0xFA,0xD4,0x01,0x37,0x63,0xF8,0x76,0x57,0xE5,0xB2,0xB0, + + 0xF0,0x26,0x34,0x78,0xA0,0xDA,0x27,0x5A,0x2D,0x37,0xF1,0x67,0xD6,0xE6,0xF1,0x1C, + + 0x7A,0xFB,0x94,0xBD,0x6B,0x74,0xEA,0x80,0xE1,0x6A,0xF9,0x77,0xD7,0xE7,0x6A,0x17, + + 0x81,0xD5,0xD9,0xEC,0x9C,0x77,0x1A,0xAE,0x74,0xE7,0xE7,0x5C,0xB7,0x5B,0xEA,0xF3, + + 0x93,0x8D,0xA2,0x9B,0xBC,0x23,0x55,0xBE,0x0D,0x97,0xC4,0x92,0xB6,0x3A,0x41,0x0A, + + 0x8D,0xBA,0x63,0xDF,0x65,0xAC,0xF3,0xC2,0x83,0xD1,0xCD,0x97,0x37,0x99,0x29,0xF3, + + 0x43,0x40,0x5C,0xFD,0x3C,0x21,0x5B,0x70,0x76,0xC6,0x1C,0x82,0x36,0xA3,0x58,0xA4, + + 0xB5,0x93,0x22,0x4B,0x86,0xED,0xE7,0xF9,0x36,0x63,0xF2,0x6E,0x5E,0xEC,0x5D,0xF7, + + 0xFF,0xDE,0xEA,0x5E,0x1F,0xAD,0x44,0xCE,0xC2,0x6B,0xFA,0x7E,0x5F,0xED,0xD4,0xF2, + + 0x7A,0x1D,0xE3,0x4F,0x9E,0xAE,0x27,0x19,0x25,0x0D,0xF3,0x6F,0xDE,0xEE,0xAB,0x5E, + + 0x17,0xCE,0xEB,0x5F,0x9F,0xAF,0xE7,0xBB,0x88,0xB4,0xFB,0x7F,0xDF,0xEF,0x00,0x7F, + + 0xA5,0xD2,0x6C,0xEE,0xE8,0x21,0x36,0x44,0xE1,0x22,0x74,0x4F,0x1C,0x25,0xE2,0x7A, + + 0x98,0xD3,0x8F,0xBF,0xC0,0xBD,0x94,0x8D,0x84,0x0E,0xC3,0x32,0x4E,0x97,0x30,0x60, + + 0xA2,0xA9,0x06,0xAA,0x6C,0xE3,0xA5,0x65,0xBA,0x93,0xE4,0x98,0xCE,0x6D,0x70,0x43, + + 0x96,0x2D,0x95,0xE8,0x34,0xBE,0x5D,0xF2,0x69,0xDE,0x92,0xC8,0x2C,0x6F,0xD3,0xEE, + + 0xD2,0xA5,0xE4,0xC6,0x36,0xB4,0x4A,0xDE,0xAC,0xD7,0xF4,0xE6,0x76,0xF4,0xF9,0xCD, + + 0x57,0xF9,0xEC,0xD6,0x37,0xB5,0x74,0xE6,0x93,0x24,0xFC,0xF6,0x77,0xF5,0xA5,0xC6, + + 0x3E,0x42,0xE5,0xC7,0xB6,0xB6,0x4B,0xDA,0x2C,0x27,0xF5,0xE7,0xF6,0xF6,0x53,0xEB, + + 0x65,0x91,0xED,0xD7,0xB7,0xB7,0xCA,0x53,0x67,0x57,0xFD,0xF7,0xF7,0xF7,0xE6,0x63, + + 0x6F,0x9E,0x66,0x67,0x14,0xB6,0x3C,0xA2,0xCF,0xDE,0x0D,0xF4,0x95,0x0B,0x85,0x18, + + 0xE0,0x16,0x55,0x1A,0x31,0x8D,0x5E,0xFA,0xC3,0xD6,0x6D,0x3A,0x46,0x11,0x89,0x69, + + 0xAA,0x1A,0x9F,0x70,0x3F,0xB7,0x3F,0xE3,0x0D,0xD5,0xA1,0xCD,0x03,0x57,0xEF,0x8B, + + 0x48,0x9B,0x08,0xA7,0x69,0xCA,0x5F,0xFB,0xF0,0x50,0x84,0x5D,0x51,0x46,0x58,0xE7, + + 0xEC,0xBC,0xE6,0xCE,0x3E,0xBC,0xC5,0xD3,0x92,0x0D,0xF6,0xEE,0x7E,0xFC,0xDD,0xF7, + + 0xD3,0x0C,0xEE,0xDE,0x3F,0xBD,0xEF,0xC4,0x57,0x68,0xFE,0xFE,0x7F,0xFD,0x2F,0xCF, + + 0x07,0x3C,0xE7,0xCF,0xBE,0xBE,0xB7,0x02,0x86,0x2B,0xF7,0xEF,0xFE,0xFE,0x55,0x21, + + 0x54,0x84,0xEF,0xDF,0xBF,0xBF,0x6E,0xC1,0x83,0x9D,0xFF,0xFF,0xFF,0xFF,0x60,0x02, + + 0xD5,0x0D,0x40,0xED,0xDB,0x7D,0xBC,0xB3,0x65,0x48,0xA7,0x55,0xA0,0xE9,0x1C,0x30, + + 0xF9,0xA8,0xF0,0x33,0xE8,0x2E,0x84,0x0F,0x2F,0x94,0x0E,0x0B,0x61,0xFA,0x7F,0xB0, + + 0xA3,0x42,0x41,0xEC,0xEE,0xBF,0x91,0x00,0xE0,0xF7,0x01,0xDC,0xD4,0xB7,0x3A,0x61, + + 0xFE,0x15,0x8F,0xBC,0x11,0xD4,0xCB,0xB5,0xAE,0x81,0x99,0x31,0xD5,0xF1,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xD9,0x07, + + 0x0E,0x42,0x42,0xE5,0xA4,0x89,0xB1,0x11,0x94,0x99,0xE9,0xD7,0xAF,0x2A,0x1F,0x03, + + 0x39,0x9D,0xDC,0xA8,0xF2,0xEA,0xCA,0x4B,0x31,0xEF,0x1A,0x2C,0x04,0x27,0x1A,0x16, + + 0xBC,0xDE,0x55,0xFE,0xF6,0xF7,0xBF,0x5A,0xBC,0xEC,0x13,0xD3,0xEB,0x7A,0x9D,0x9D, + + 0xB2,0x2A,0x8D,0xB5,0x91,0xF0,0x4F,0xF9,0x8D,0x9E,0x8B,0xFB,0xBD,0xE6,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x05,0x04, + + 0x60,0x59,0xFC,0x7A,0xCD,0x91,0x01,0x9B,0x50,0xC5,0x6B,0xD7,0x04,0x86,0x2B,0xB8, + + 0xF1,0xF0,0x77,0x64,0xA3,0xC0,0xBF,0x15,0xBD,0xD2,0x8B,0x3E,0x55,0x61,0xA2,0xAD, + + 0x74,0x23,0xBD,0x7A,0x45,0x51,0x83,0x25,0xEC,0x66,0xCF,0xA7,0x43,0xDB,0xBE,0xBC, + + 0x5D,0x82,0xF3,0x93,0xD2,0x47,0x27,0x42,0xDB,0xFE,0xA7,0x81,0x16,0x61,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xC6,0x61, + + 0x40,0xED,0x55,0x7F,0xB4,0x79,0x43,0xEF,0xA2,0x31,0xCC,0xAD,0x1E,0xB7,0xAD,0xA1, + + 0xF5,0xC8,0xB2,0xFA,0xCA,0x29,0xDE,0x51,0xA2,0xC4,0xCF,0x5E,0x99,0xD8,0x51,0x0D, + + 0x93,0x1C,0x47,0x9D,0x2F,0x21,0x5F,0x05,0x9B,0x5A,0x07,0xDE,0xD5,0xDE,0x31,0xA1, + + 0xC1,0xCA,0x37,0x66,0xA9,0x76,0xDF,0x50,0x97,0x56,0xCA,0x42,0xDD,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x97,0x2E, + + 0xF0,0xB1,0x30,0x38,0x75,0x55,0x64,0x1D,0x62,0xC4,0xE9,0xB1,0xB3,0xA1,0xBD,0x0D, + + 0x75,0xED,0x01,0x68,0x80,0x2C,0x5E,0x92,0xAC,0x70,0xDA,0x37,0x71,0x4C,0xE1,0x06, + + 0x1C,0x56,0xBF,0x48,0x69,0xDE,0x77,0xE4,0x2D,0x13,0x1D,0xCF,0x0E,0x2F,0x17,0x2B, + + 0x47,0x85,0xD4,0xFD,0xB1,0xB8,0x5F,0x0E,0xC4,0x03,0x25,0xC6,0x76,0xA3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x1C,0x27, + + 0xCE,0xA8,0xDA,0x68,0xC2,0x75,0x81,0x17,0xB0,0xCB,0x80,0x10,0xFF,0xA9,0x99,0x37, + + 0xF1,0x18,0xEB,0x78,0x7C,0xAD,0x8D,0x06,0x4B,0xF2,0xC4,0x38,0xBC,0x6A,0x6B,0x0F, + + 0xA4,0x8B,0xB9,0x0D,0x77,0xA5,0x13,0x3B,0x38,0x7B,0xE9,0xD5,0xB4,0xDB,0x11,0xE1, + + 0x76,0x90,0xCD,0xFD,0xB9,0x08,0x2D,0x04,0xF9,0x1E,0x92,0xCC,0x51,0xAA,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x5A,0x22, + + 0xCD,0xE1,0x5F,0x8E,0x91,0x4F,0xCF,0x85,0xC5,0xAF,0xB4,0xA6,0x74,0xF0,0x80,0xE1, + + 0x55,0x37,0xEC,0xAB,0xDE,0xF5,0xE8,0x8D,0x07,0x6E,0xBC,0xB6,0x75,0xF1,0x73,0xBA, + + 0x4F,0x63,0x35,0x22,0x43,0x39,0xF5,0x4A,0xD4,0x07,0xB5,0xA7,0xF4,0xF2,0xBE,0x60, + + 0x83,0x3E,0xF7,0xB8,0xC3,0x1C,0xFD,0xB7,0x12,0x5E,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0xB3,0x19, + + 0x54,0x37,0x02,0xAA,0x4B,0x9C,0xCB,0x46,0x64,0xE7,0xB6,0xAE,0x7C,0xF8,0x70,0x2F, + + 0xBF,0x14,0x73,0x3D,0x56,0x48,0x11,0xC5,0xB4,0x45,0xBE,0xBE,0x7D,0xF9,0x73,0x7A, + + 0xCA,0xEE,0x78,0xCD,0x8B,0xE6,0x4E,0x2F,0xE0,0xEE,0xB7,0xAF,0xFC,0xFA,0x51,0x33, + + 0x44,0x88,0x06,0x6E,0x9F,0x4E,0x84,0xE1,0xDA,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x31,0x2B,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0xFF,0x80,0x00, + + 0x55,0x40,0xF8,0x86,0x13,0xC6,0x69,0xF0,0x0C,0xC1,0xE1,0x3C,0xD7,0x75,0x88,0x99, + + 0x08,0x41,0xC0,0x96,0x18,0x45,0x32,0xE0,0x1D,0xC9,0x9C,0xD6,0xD4,0xB4,0x01,0x8D, + + 0x05,0x42,0xB9,0x75,0x24,0x2B,0x12,0x6B,0x4D,0x21,0xF1,0x65,0x77,0xE9,0x09,0x0D, + + 0x87,0x03,0xB1,0x45,0x81,0x2C,0x09,0x7B,0x4D,0x4B,0x71,0x1A,0x56,0xF6,0xAF,0xB7, + + 0x26,0x48,0xEA,0x94,0x4E,0xA4,0x70,0xF4,0xAB,0x5D,0x9A,0xF9,0xB9,0x0F,0x78,0xB2, + + 0x81,0xE9,0x37,0x24,0x1B,0x2C,0x07,0x16,0x02,0x67,0x6C,0x16,0x10,0x97,0x57,0x33, + + 0x00,0x1A,0x98,0xB8,0x35,0x6B,0x01,0x16,0x86,0x5D,0xE9,0xC0,0x54,0x44,0xF4,0xB3, + + 0x68,0xDD,0xCA,0x26,0xEF,0x65,0xA1,0x02,0xF2,0x44,0xA7,0x85,0x72,0x22,0x47,0xAC, + + 0x2C,0x48,0xE2,0x4C,0x05,0xA3,0x10,0xDA,0x0F,0x4C,0xF2,0x6D,0x14,0xE3,0x9A,0x3C, + + 0x2F,0x49,0x03,0x8C,0xBA,0x2F,0x20,0x3A,0x55,0x69,0x18,0xDE,0xDB,0x41,0x58,0x40, + + 0x2B,0x6F,0x03,0xEF,0x1A,0x22,0x17,0x7D,0x2F,0xB4,0x11,0xCF,0x5A,0x42,0xDF,0x23, + + 0xAF,0x48,0x03,0x20,0x3A,0x2D,0x9B,0x29,0xD9,0x49,0x9D,0xCD,0x85,0x64,0xEA,0x68, + + 0xE1,0x96,0x48,0x93,0x95,0xD1,0x6E,0x7C,0x79,0xF7,0xEC,0xEA,0x02,0x09,0x2A,0x12, + + 0xD5,0x02,0x48,0x2F,0x67,0xAD,0x64,0x01,0x2A,0x0D,0xC4,0x94,0x81,0xA6,0xEB,0xD5, + + 0x0F,0xFC,0x03,0x19,0x0F,0x26,0xEB,0x39,0xCC,0x01,0xEB,0xBD,0x86,0xC1,0x12,0x5B, + + 0x2C,0xA0,0x92,0xA0,0x3C,0x29,0x03,0x7D,0x43,0x73,0xFB,0x0E,0xF4,0xCE,0x04,0x80, + + 0x78,0xF8,0x3A,0x74,0xC3,0x3F,0x2C,0xC0,0xD0,0x58,0x23,0x00,0x76,0x50,0xDE,0xB0, + + 0x26,0xE9,0x8A,0x16,0x38,0x55,0xE5,0xC2,0xEF,0x34,0x98,0x42,0x0E,0x61,0x4F,0x28, + + 0x82,0x11,0xA5,0x7B,0xB6,0xC9,0x64,0xD3,0x6E,0x37,0x6F,0x9A,0xDE,0x30,0x02,0x1D, + + 0x24,0xE6,0xB5,0x45,0x5E,0x3C,0x64,0xC3,0x6F,0x36,0x75,0x17,0x74,0x74,0xFF,0x33, + + 0x13,0xA9,0x6F,0x41,0xA1,0x0B,0x8F,0xC6,0x15,0x48,0x8E,0x04,0x9B,0x1F,0x93,0xB2, + + 0x60,0x72,0xF6,0x32,0x23,0xBE,0x03,0x0F,0x65,0x8E,0x5B,0xE7,0x5C,0x7E,0x3B,0xA8, + + 0x20,0x12,0xBB,0xA9,0x81,0x6F,0x8A,0xEB,0xDD,0xD4,0x39,0x76,0x91,0x7E,0x14,0x89, + + 0x04,0xBA,0xC5,0x33,0x31,0x33,0xE4,0x0D,0x72,0xAC,0xFD,0xF9,0x1A,0x7C,0xC6,0x75, + + 0x60,0xB3,0xE6,0x4C,0xF6,0xB3,0x3F,0xFB,0xEC,0x44,0x79,0x42,0xFD,0xDF,0x21,0x69, + + 0x31,0x1C,0x91,0x18,0x38,0x39,0x66,0x9F,0xF8,0xF5,0xCC,0xBB,0x0E,0x7D,0x37,0xD7, + + 0xC3,0x0A,0x36,0x6F,0x59,0x95,0xBE,0xFA,0x64,0x06,0xB1,0x1C,0x7C,0xDE,0x51,0xE5, + + 0xB9,0xB0,0x27,0xA2,0xBF,0xC0,0xBF,0xF3,0x7C,0xF7,0x40,0xAD,0x7E,0x7C,0x5B,0x99, + + 0x1B,0x17,0x25,0xAE,0xFB,0xB6,0x62,0x05,0x22,0xD1,0x3A,0x7E,0x66,0x74,0x10,0xB0, + + 0x27,0xB6,0x0E,0x89,0x01,0x06,0x85,0xA6,0x14,0xD7,0xE0,0x19,0xF6,0xDB,0x42,0xAF, + + 0x89,0xDE,0x40,0xAD,0xA6,0x33,0x28,0x6D,0x9D,0x03,0x53,0x1C,0xD9,0x0E,0x52,0x26, + + 0x29,0x1B,0x52,0x3A,0x52,0x30,0x82,0xE8,0x0A,0xE0,0x85,0xBD,0xB3,0xDB,0x20,0x02, + + 0x04,0xC0,0x28,0x3A,0xF5,0xAF,0x20,0x62,0xC4,0xC6,0xD0,0x67,0x14,0xEF,0x28,0x12, + + 0x05,0xC1,0x80,0xE9,0x62,0xA5,0x3C,0xB5,0x64,0x56,0x1B,0x92,0x89,0x82,0xFA,0xD3, + + 0x84,0x82,0x7C,0x27,0x6F,0x39,0x6A,0x50,0x25,0x19,0x71,0xEA,0xB1,0xA3,0x29,0x8F, + + 0x85,0x83,0x69,0x16,0x25,0x18,0x8D,0xCC,0x86,0x30,0x9A,0x87,0x0D,0x40,0xA9,0xB1, + + 0x19,0x2B,0xC0,0x96,0xB7,0x0B,0xD8,0xE2,0xC3,0x64,0xAA,0x95,0x37,0xFF,0x08,0x50, + + 0x40,0x88,0xD0,0xBE,0xC5,0x6A,0x23,0x70,0x3C,0xDD,0xFD,0x65,0x36,0x8E,0xFC,0xB2, + + 0xF9,0x79,0x78,0xC5,0x16,0xCC,0xAA,0x60,0xB9,0x0E,0x54,0x91,0xF6,0x56,0x43,0x83, + + 0xDB,0x07,0x89,0x55,0x3D,0xAA,0xA4,0x63,0xC1,0x9C,0xC3,0x84,0xB4,0xFC,0x22,0x0A, + + 0x0C,0xC8,0xB2,0xF6,0x1C,0x53,0x62,0x59,0x54,0x42,0x5A,0x9D,0xD9,0xAF,0x2A,0x1A, + + 0x0D,0xC9,0xB5,0x92,0xE0,0x71,0x8E,0x5A,0x45,0x19,0x7A,0x3F,0xBA,0x64,0x23,0x96, + + 0x8C,0x8A,0xA3,0xF3,0x1D,0xE8,0xF4,0xD5,0x2D,0xAC,0x1B,0x8C,0xA3,0x99,0x76,0xAF, + + 0x8D,0x8B,0xB3,0x17,0x1F,0x83,0x94,0xEB,0x4C,0x6A,0x44,0xBB,0xD5,0x24,0x02,0x00, + + 0x61,0x83,0xFA,0xDE,0xBF,0x63,0x72,0x96,0xC6,0x37,0x95,0x98,0xDC,0xE8,0xD8,0x38, + + 0xF8,0x8B,0xD8,0x60,0xBC,0xB6,0x05,0xFE,0x38,0x90,0xB0,0xE3,0xB4,0xE6,0xCB,0x53, + + 0x0C,0x8A,0x59,0xBE,0x3D,0xCE,0x78,0x86,0xAD,0x43,0x68,0x0D,0xD0,0x8C,0x4B,0x68, + + 0x2E,0x30,0x6B,0x01,0x12,0xCD,0xBB,0x06,0xC2,0x8D,0xEB,0xFE,0x83,0x4B,0x01,0x82, + + 0x4F,0xB4,0xA2,0x04,0x31,0xD8,0x90,0xEC,0xBB,0xED,0x04,0x14,0x5A,0xB5,0xAC,0x92, + + 0x94,0x1C,0xCC,0xD7,0x98,0xBC,0x63,0xFA,0x1A,0xF1,0x53,0x44,0x73,0xF1,0xDA,0x87, + + 0xA4,0xF7,0x9D,0x57,0x43,0xBD,0xDE,0xD4,0x64,0x05,0x43,0x02,0x71,0xF5,0xC9,0xB4, + + 0x16,0x1E,0xA7,0x93,0x16,0xB5,0xFD,0xCF,0xB1,0xD5,0x7F,0x69,0x0C,0x8D,0xBB,0xA0, + + 0x04,0xF9,0xA1,0x21,0x41,0x78,0xB4,0x1E,0xD3,0xD2,0x28,0xDB,0xF6,0x94,0xD2,0xC7, + + 0x14,0x2E,0xB3,0x05,0x08,0xE4,0xFB,0x01,0x1B,0xDE,0x6B,0xC7,0x54,0x77,0x22,0xB0, + + 0x97,0x95,0x3A,0x74,0xC5,0xB2,0x55,0xBE,0x47,0x5C,0xD3,0x17,0x8A,0x5B,0x37,0xD2, + + 0x00,0x93,0x2D,0x3B,0xB7,0x6C,0x7B,0x02,0x9B,0xF7,0x83,0xCA,0x3F,0xFC,0xC2,0xAD, + + 0x2D,0xF8,0x2E,0x22,0xDD,0xB7,0x3A,0xD4,0xCD,0x52,0x8B,0xE8,0xDE,0xB6,0x2F,0x45, + + 0xCE,0x9D,0x71,0x23,0x42,0xCA,0xB9,0x58,0xEF,0xF1,0xBF,0x1B,0xFB,0x3E,0xDD,0x89, + + 0xA4,0xD5,0x13,0x9F,0x1F,0xF8,0xCC,0x49,0x40,0x51,0xC3,0x8B,0x01,0x01,0x3A,0xE9, + + 0x23,0xFE,0x6F,0xA2,0x0A,0x10,0x84,0xD9,0xAC,0x9B,0x57,0x1D,0x78,0xFC,0xF0,0xB9, + + 0x1F,0x87,0x4D,0x33,0x06,0x27,0x56,0xE6,0x87,0x2D,0x8E,0xFC,0x4D,0xD8,0x34,0xDE, + + 0x88,0x99,0x2D,0x5A,0x08,0xBD,0xFA,0x0B,0x13,0x1D,0xC6,0x2E,0x23,0xFB,0x38,0x6B, + + 0x07,0x3E,0xC7,0x36,0x50,0xC5,0x9B,0x79,0xAA,0xD6,0x0D,0x6D,0x7E,0xA4,0xAA,0x2B, + + 0xAD,0xD0,0x8F,0xDD,0x9A,0xB2,0x1F,0xF9,0xB2,0xD2,0x51,0xB0,0x5C,0xF2,0x5E,0xE2, + + 0x14,0x85,0x78,0x86,0x90,0x1B,0x0A,0x33,0x29,0x4F,0x68,0x42,0x63,0x20,0x30,0xEF, + + 0xC0,0x8B,0xC2,0x89,0x93,0xCD,0x66,0x45,0x72,0x35,0xAA,0xCB,0xA5,0x6E,0x79,0x83, + + 0x00,0x58,0xB9,0x80,0x9E,0x40,0x23,0x32,0x63,0x8B,0x69,0xD4,0x73,0x91,0x8E,0x93, + + 0x10,0x38,0xB1,0xF7,0x30,0x28,0xA3,0x22,0xA8,0x4C,0x59,0xCD,0xAE,0x21,0xC2,0xC2, + + 0x82,0xAD,0x78,0x03,0xD0,0x84,0x50,0xE4,0x49,0x43,0x80,0x6C,0x31,0x44,0x08,0xD6, + + 0x03,0x03,0x30,0xD6,0x93,0xFE,0x06,0x70,0xE7,0x67,0xA0,0x06,0x60,0xD1,0x79,0xB2, + + 0xF6,0x43,0x89,0x40,0xF1,0x86,0x91,0x95,0xC3,0x04,0xA9,0xE7,0xF0,0xB6,0x69,0x0D, + + 0x22,0x6B,0xF1,0x85,0xCF,0x86,0x63,0xD4,0xF0,0xF1,0x23,0x86,0xAE,0x2B,0x7A,0x8C, + + 0x05,0x62,0x06,0xFC,0x44,0x27,0x20,0xD7,0x7B,0x8C,0x1C,0xF0,0xDD,0x9D,0x40,0x05, + + 0x8B,0xE5,0xEA,0x56,0xFD,0x6B,0xA5,0xCE,0xA0,0xA0,0xE2,0x7A,0xED,0x6F,0x63,0x0B, + + 0x02,0x07,0xE3,0x0F,0xD3,0x27,0x2D,0xCB,0x2F,0x5A,0xF3,0x6D,0x66,0xE7,0xA2,0xFB, + + 0x0B,0x0F,0x01,0x6B,0x1B,0x2F,0x15,0x4D,0xE8,0x3B,0xCB,0x38,0x7A,0xC6,0x86,0x68, + + 0xAB,0x8C,0xFA,0x7D,0xBB,0x37,0xD8,0x97,0x79,0xB8,0x55,0xE8,0x2D,0x0A,0x95,0x28, + + 0x7C,0x0D,0xEA,0x3E,0x99,0x81,0x8E,0xA8,0xCA,0xB5,0xA4,0xC8,0xB0,0x8E,0xF3,0x45, + + 0x0C,0x0E,0x06,0xAB,0x18,0x2A,0xE9,0x97,0x0B,0x2D,0x3B,0x52,0xFE,0xE3,0x8B,0xA1, + + 0x25,0xA2,0x3E,0xBF,0x3A,0x43,0x51,0xD9,0x74,0xFA,0xA5,0xD5,0xB0,0xCC,0xFC,0x68, + + 0x7B,0x5D,0xA4,0x4D,0x91,0x3B,0x2E,0x49,0x47,0x3F,0xCC,0xBD,0xD1,0x12,0xF4,0x83, + + 0x48,0xE0,0x4C,0xC1,0x7E,0x37,0xE0,0x58,0x8D,0x1C,0x1E,0xD6,0xFC,0x13,0x5D,0x84, + + 0xC3,0x02,0x45,0x07,0x21,0xF7,0x2C,0x90,0x41,0x60,0x75,0x25,0xD2,0x70,0xCD,0xC4, + + 0xFB,0x99,0x23,0xC7,0xB7,0xDB,0xE2,0xE3,0xA2,0xA3,0x59,0x33,0xB9,0x70,0x1D,0xC6, + + 0xC5,0xA9,0xFC,0x3A,0x34,0xD6,0x50,0x02,0x64,0x8F,0x2A,0xD5,0x18,0x36,0xC6,0x30, + + 0x6B,0xDE,0xEC,0x39,0x35,0xFD,0xDC,0x10,0x67,0x78,0x3F,0xB4,0x33,0xD5,0x44,0x37, + + 0x47,0x04,0xB6,0xDA,0x99,0x30,0x7D,0x92,0x9B,0xDF,0x15,0xEB,0x09,0x18,0x89,0xD9, + + 0xC4,0x7C,0x53,0x51,0xF6,0xEA,0x82,0xD1,0xF7,0x17,0x0B,0xF7,0xBF,0xCA,0xC1,0x28, + + 0x89,0x78,0x48,0x0E,0xF5,0x24,0x4F,0x83,0xCF,0x5E,0x92,0x1D,0x58,0xA8,0x15,0x1C, + + 0x6C,0x7E,0xAE,0x82,0x98,0xB5,0x7E,0xBA,0x78,0x54,0xA6,0x4F,0x0D,0x1C,0x21,0xF9, + + 0xD4,0x01,0x47,0xD8,0xF7,0x3C,0x37,0xE0,0x49,0x85,0x47,0x2F,0x78,0x39,0x56,0xE1, + + 0x0E,0xBF,0xC5,0x80,0x3B,0x27,0x60,0xC7,0xDA,0xB3,0xA7,0x42,0x7B,0x7F,0x86,0x9C, + + 0x1F,0xE9,0xEE,0xAE,0xC7,0x30,0x6A,0x15,0x4A,0x5C,0x7A,0x72,0x79,0x3C,0x66,0xBA, + + 0xD6,0x11,0x33,0x58,0x7E,0x16,0x7E,0x00,0xCA,0xD1,0xBC,0xF9,0x7A,0x9D,0xD4,0x4D, + + 0xEF,0x11,0xFF,0x49,0xFF,0xB0,0xD7,0x8A,0x95,0x58,0xD1,0x45,0x07,0x10,0x77,0x5D, + + 0xEE,0x91,0xA7,0xBF,0x44,0x31,0x9B,0x7C,0xA8,0x3F,0x60,0x6F,0xA3,0x75,0x44,0x60, + + 0xC5,0x0A,0xED,0x64,0x96,0x4C,0xDC,0x51,0x29,0x46,0xAF,0x56,0x50,0xE9,0x50,0x90, + + 0x85,0xA5,0xC8,0x14,0x0E,0xAC,0x3A,0x72,0x01,0xC7,0x80,0x93,0xD3,0xB1,0xA6,0x81, + + 0x49,0x4E,0x8B,0x83,0xD1,0x6F,0x0A,0x50,0xA1,0x44,0x6D,0xA5,0x54,0x59,0x11,0x41, + + 0xC6,0x73,0xE3,0x0A,0x17,0x4F,0x1D,0x33,0x64,0xCA,0xD9,0x35,0xBC,0xEE,0x7F,0x32, + + 0x02,0x8D,0x82,0x4A,0x15,0xC4,0x6E,0x5D,0x65,0x86,0xF4,0x15,0x6D,0x65,0x50,0xAC, + + 0x85,0x81,0xC8,0xBA,0x11,0x6D,0x7F,0x67,0xAC,0xEF,0x54,0xE9,0x54,0xCF,0x2C,0xC1, + + 0x06,0x9F,0xBB,0xB8,0x35,0xA0,0xAE,0xE2,0x27,0xC7,0x8E,0x98,0x3F,0x45,0xF7,0x31, + + 0x7C,0x5A,0x77,0xD3,0xD2,0x7A,0xCC,0x02,0x3C,0xC3,0xA3,0x80,0xBF,0x44,0x7B,0x72, + + 0xAB,0x85,0x8B,0xEC,0xB0,0x25,0xCB,0x59,0x25,0xD7,0xCC,0x12,0x7E,0xB8,0xD2,0xF2, + + 0x7C,0xC4,0x92,0xFE,0x19,0xCC,0x03,0x0B,0xEC,0xFB,0x82,0xCC,0xA2,0xEF,0x69,0x16, + + 0xBF,0x30,0xDB,0x8D,0x0D,0x6F,0x09,0xC2,0xEF,0xA5,0x7B,0xAD,0x5C,0x1B,0x73,0x1E, + + 0xEE,0x2B,0x93,0xFF,0x8F,0xAD,0xC7,0x48,0xAC,0xD4,0x9B,0x03,0x7C,0x12,0x1C,0x72, + + 0xF7,0x23,0xCA,0x2C,0xE3,0xA0,0xF0,0x99,0x45,0xB9,0x32,0xEA,0xCA,0x13,0x52,0xA4, + + 0x8D,0x89,0x17,0xDA,0x5A,0x86,0x22,0xFE,0x30,0x7F,0x3A,0x82,0x8C,0xAF,0x74,0xC9, + + 0x0E,0xD7,0xDB,0xCB,0xDB,0x20,0x6D,0x50,0xED,0x3B,0x33,0xEA,0x66,0x51,0x76,0x39, + + 0x74,0x52,0x83,0x3D,0x60,0xA1,0x1B,0xDB,0xC3,0x44,0x3F,0x54,0x28,0x64,0x3E,0xBF, + + 0x22,0x78,0xC3,0x64,0x98,0x3D,0xCC,0xD9,0x74,0x9F,0x6D,0xC4,0x9F,0xDB,0x14,0x97, + + 0xED,0x38,0x94,0x76,0x31,0xD4,0xC7,0x30,0xE5,0x89,0x46,0xC5,0x01,0x9D,0x62,0x53, + + 0xFA,0x91,0xDD,0x05,0x25,0x04,0x55,0xA1,0xF9,0xDF,0x01,0xC5,0xC7,0x66,0xBA,0x7B, + + 0xFE,0xD1,0x95,0x77,0xAD,0xB5,0x05,0x48,0x10,0xC8,0xDB,0x56,0xF4,0xD1,0x99,0x46, + + 0x63,0xBF,0xDC,0x38,0x30,0x56,0x2D,0x67,0xC1,0xD9,0x74,0xF7,0x10,0x59,0x54,0x2C, + + 0x21,0x77,0x16,0x52,0x6B,0x5B,0x84,0x94,0x0C,0xDA,0xB4,0xEF,0x9E,0x16,0x0D,0xA1, + + 0x59,0x98,0x96,0x2F,0x66,0x4B,0x3F,0x5E,0xD5,0x44,0x27,0x20,0x34,0xF6,0x1E,0x3B, + + 0xA5,0x6A,0x2D,0xCB,0xD5,0xF5,0xF9,0xC1,0x8C,0xD8,0x9F,0xF3,0xF6,0xC7,0xAC,0x2D, + + 0x1F,0x22,0x8F,0x15,0x5F,0xD8,0xBF,0x4C,0x95,0xC8,0x09,0x3D,0x57,0xF0,0xD6,0x72, + + 0x63,0xD6,0xCE,0x9C,0x9F,0xB4,0x04,0x49,0x4A,0xC2,0x2D,0x79,0xAB,0xF3,0xDF,0xF9, + + 0x9F,0x9A,0xDF,0xA8,0x5D,0xB5,0xCF,0x2F,0xC3,0xEF,0xB4,0xD9,0x0B,0x57,0xEF,0xE6, + + 0x79,0x36,0xBD,0x8E,0x8E,0x79,0xBD,0x5D,0xDE,0x5E,0xBD,0xC0,0x2B,0xF3,0x9E,0x48, + + 0xAE,0x35,0x39,0x7E,0x38,0x36,0x70,0xF8,0xEC,0x70,0xC8,0x46,0xF1,0x7A,0xC2,0x44, + + 0x53,0x86,0xD6,0x99,0xF5,0x96,0xA5,0x98,0xAE,0x57,0x6E,0xEF,0x15,0xF9,0x5F,0x35, + + 0x02,0x93,0xA6,0x4D,0x77,0xB1,0x8F,0x09,0x6C,0xDA,0x77,0xAF,0xFA,0x90,0x2B,0x3D, + + 0xA9,0x86,0xB6,0x57,0x18,0xB9,0xF8,0x13,0xB3,0x90,0xCD,0xB8,0xDB,0xFF,0x3A,0xF3, + + 0x62,0xFD,0x80,0xC4,0x18,0x61,0x2A,0xD3,0x6E,0x46,0xF2,0x35,0xA5,0xE9,0xB7,0x60, + + 0x00,0x08,0x0F,0xFC,0x3D,0x6C,0x26,0x95,0xCC,0xB7,0x18,0xF3,0x75,0x23,0x1B,0x75, + + 0xA1,0x60,0xBF,0xE8,0x72,0x62,0xBB,0x95,0x61,0xBD,0xB1,0xB7,0x50,0x6A,0x8A,0xB1, + + 0xB9,0x63,0x49,0x95,0xC5,0x4F,0x11,0x35,0x48,0x52,0x1F,0xA2,0xD2,0x43,0x94,0xC4, + + 0x0C,0xC3,0x32,0x2A,0x14,0x26,0x1D,0xE4,0x40,0xA6,0x40,0x99,0x5A,0x26,0x00,0xC0, + + 0x05,0x07,0x64,0xCB,0xE2,0xF3,0x27,0xB7,0x9D,0xD8,0x18,0xF4,0x06,0x27,0xAD,0xC5, + + 0x80,0xFA,0x59,0xC1,0x90,0x25,0xAE,0xE5,0xC0,0x07,0xC8,0x10,0xD3,0xB6,0xF8,0xA2, + + 0x0F,0x62,0xC1,0x51,0x1A,0x36,0xBA,0x31,0xDF,0x29,0x99,0xD5,0x5C,0xE1,0xF5,0x75, + + 0x4C,0x09,0xE0,0x4C,0xED,0xAE,0x2C,0x8D,0x4E,0x4A,0x02,0xA8,0x67,0xB9,0x8A,0xDF, + + 0x2D,0xF4,0xB4,0xE0,0x78,0x69,0x22,0xC7,0x4F,0x4B,0x1A,0x7F,0x69,0x07,0x16,0x18, + + 0x76,0xF3,0x83,0xCD,0x90,0x6B,0xDF,0xDA,0x44,0x2F,0x2C,0x5D,0xD0,0x63,0xCB,0x90, + + 0x97,0x7B,0xD3,0xB5,0x1B,0xE7,0xAA,0xBD,0x9D,0x1A,0x0B,0x4E,0xE0,0x6A,0x7A,0xB7, + + 0xD3,0x71,0x52,0x3F,0x2B,0x2D,0x6D,0xFA,0x4B,0xD1,0xDA,0x16,0x98,0x6C,0xF5,0x1F, + + 0xC9,0x4E,0xF4,0xB0,0x94,0xAB,0xB6,0x5C,0xA2,0x96,0x1A,0xFC,0x25,0x2F,0x6C,0xCD, + + 0xFD,0x90,0x79,0x49,0x15,0x6F,0x31,0x69,0xCB,0x0E,0xDB,0x69,0x55,0x2F,0x03,0x5D, + + 0x04,0x4E,0x4B,0x9D,0xDF,0x82,0xF7,0xEB,0xC3,0x47,0x9B,0xDD,0x54,0x2D,0x81,0x01, + + 0x17,0x80,0xDD,0xB0,0x95,0x72,0x09,0x80,0xC5,0x10,0x2C,0x20,0x72,0xA0,0xAC,0x9D, + + 0x9B,0x75,0x38,0xF6,0xCA,0x73,0xF0,0x22,0x25,0x5B,0x5C,0x34,0x54,0x33,0x07,0x82, + + 0xBC,0x49,0xC5,0xE1,0x5B,0x56,0xF9,0x85,0x09,0x09,0x6A,0x4D,0xDC,0x3F,0x0E,0xDD, + + 0x61,0x13,0x56,0x4F,0x4C,0x5D,0x1A,0xC2,0x92,0xD5,0xDD,0x15,0x0A,0x31,0x54,0xB3, + + 0x26,0x7A,0x44,0x03,0x16,0x32,0x37,0x20,0x60,0x89,0x0B,0xE5,0x74,0x6D,0x2E,0xD5, + + 0x20,0xD5,0x82,0x2B,0xB1,0x29,0x1C,0x50,0xEC,0xD3,0x9C,0xA8,0x75,0x77,0xD5,0xB2, + + 0x95,0x78,0xEC,0xEE,0x13,0xB7,0x95,0x61,0xC7,0x14,0x4B,0xA5,0xA6,0x34,0x73,0x29, + + 0x61,0x97,0xFC,0xB7,0xD1,0x37,0x94,0x8B,0x21,0x57,0x8D,0xB2,0x31,0x7B,0x06,0x94, + + 0x18,0xB5,0xE4,0x71,0x39,0x78,0x94,0x68,0x24,0xF5,0x4B,0x03,0xF7,0x85,0xE2,0xBC, + + 0xC0,0x42,0x94,0x98,0x1A,0x79,0x56,0xBC,0xE6,0x18,0x9E,0xFC,0x7D,0x17,0x1A,0xA9, + + 0x01,0x5A,0x6B,0xA9,0x51,0xE1,0x4C,0xEE,0x2A,0x3A,0xF5,0x50,0x0D,0xFC,0x7D,0x9D, + + 0xFD,0xB6,0xA3,0xB5,0x36,0x7A,0x21,0x54,0xC8,0x8B,0x0F,0x55,0x9D,0x36,0x4E,0xCC, + + 0xA5,0x5D,0x3D,0x4E,0xFF,0x9F,0x1E,0xE9,0x4E,0xF1,0xED,0x7E,0x7A,0x76,0xA2,0x4A, + + 0x6B,0x17,0x0E,0x5C,0x19,0x51,0x07,0xCC,0x96,0x12,0x9E,0x41,0x7D,0x7F,0x27,0x9E, + + 0x45,0x13,0xFF,0x49,0xB8,0x54,0x8C,0x5B,0xE2,0xDE,0x57,0x2A,0xDE,0x3C,0xC9,0xFE, + + 0x0A,0x99,0x28,0xA7,0x6D,0x37,0x06,0x60,0x4E,0x20,0x8F,0xBA,0xFD,0x3D,0x55,0xBE, + + 0x5C,0x25,0x71,0x64,0xEB,0xBB,0x9C,0xB0,0x64,0xCA,0x8A,0x22,0xDB,0xA1,0x2B,0x90, + + 0x28,0x91,0xF0,0x0F,0x98,0xA7,0x78,0x56,0xAE,0xA5,0xE1,0x12,0xF0,0xA3,0x29,0x1B, + + 0x91,0x58,0x31,0x61,0x63,0x5B,0xF3,0x50,0xEA,0x80,0x8F,0xDB,0xF5,0x60,0xE5,0x62, + + 0xD5,0x2E,0x84,0x3C,0x34,0x25,0x8D,0x51,0x3A,0x81,0xF9,0x2B,0x5A,0x65,0x8C,0xC0, + + 0x9F,0xB1,0xBB,0xD4,0x56,0xAC,0xF2,0x11,0x79,0x42,0x30,0x08,0x57,0x04,0x2A,0xA3, + + 0x04,0x87,0x88,0x1D,0xAF,0xA8,0xE8,0x9A,0x63,0x88,0x78,0xB1,0x73,0xA7,0x59,0xD1, + + 0x17,0xC4,0x61,0x80,0xB2,0xC8,0x75,0xA3,0xC2,0xAA,0x31,0x07,0x52,0xEE,0xA9,0xD3, + + 0xF9,0xC5,0x8B,0x79,0x91,0x25,0xB9,0xF3,0xC0,0x85,0xB9,0xCA,0xD1,0xE5,0xB8,0x02, + + 0xF2,0x31,0x7D,0x8A,0x5E,0x03,0x72,0x97,0x4A,0x18,0x9B,0x50,0x9E,0xE8,0xF9,0xFF, + + 0x5D,0x09,0x6A,0x9E,0x38,0x06,0x72,0x3B,0x69,0x69,0xA0,0x3A,0x7C,0xA9,0x26,0x6B, + + 0xF1,0xDA,0xEB,0x0E,0xB8,0x77,0xA2,0x6C,0x0E,0xCB,0xFB,0x3B,0x35,0x91,0xF1,0x12, + + 0x57,0x60,0x0F,0x38,0x3C,0x54,0xEF,0x39,0x0C,0x66,0x57,0x1B,0xEE,0x59,0x22,0xDF, + + 0x81,0x0A,0xBC,0x8E,0x4A,0xEE,0x32,0xCA,0xB5,0xD7,0x34,0xEA,0x54,0xE4,0x22,0x5E, + + 0x86,0x9C,0x2C,0x19,0xDD,0x07,0x3A,0xBF,0x49,0x8F,0x6A,0x0D,0x6E,0xEC,0xBC,0x35, + + 0x4C,0x8E,0xA3,0xF2,0x98,0xAC,0x34,0x0D,0x39,0x8C,0xFB,0x6B,0x57,0xFF,0x87,0x7F, + + 0x66,0x96,0x50,0xCD,0x9F,0xA5,0x62,0x3C,0x15,0x92,0x47,0x7B,0x50,0xAE,0x7F,0x45, + + 0xE6,0xF0,0x9A,0xEF,0x14,0xDD,0xF4,0x22,0x1A,0x92,0xCA,0x03,0x72,0x72,0x80,0x00, + + 0x2D,0x9B,0x75,0x51,0xF7,0xD1,0x1C,0xCC,0xA7,0xD1,0xB4,0xBF,0x65,0xBC,0x6D,0x96, + + 0x4D,0x09,0x25,0x40,0x90,0x1F,0x75,0x36,0x69,0x54,0x33,0x59,0x7B,0x04,0xAD,0x54, + + 0x81,0xFD,0xE5,0x83,0x5C,0x28,0x75,0xB7,0x6A,0x92,0x42,0xC9,0x2B,0xF9,0x66,0x02, + + 0x2E,0xD5,0x22,0x44,0xF3,0x77,0x2D,0xD6,0xC3,0x8B,0x4D,0x26,0x3E,0xB6,0x80,0x50, + + 0xB6,0xE0,0x2C,0x56,0x79,0x34,0x50,0xDA,0x61,0xD7,0x3C,0x76,0x09,0xB7,0xA5,0x47, + + 0xFE,0x69,0xDD,0x43,0xB4,0xDC,0x99,0x6C,0xE5,0x96,0xED,0xE1,0xF5,0xA4,0x55,0x4C, + + 0x25,0x8B,0xA3,0x53,0xB5,0x65,0xC4,0x77,0xE9,0x30,0xBD,0x62,0x78,0xB5,0x46,0xC0, + + 0x94,0x95,0xC4,0x8B,0x3D,0xF8,0x08,0x47,0x8E,0xF8,0x36,0xB0,0x52,0x55,0x1F,0xF8, + + 0xEF,0x99,0xB8,0x66,0xC2,0x34,0xFE,0x3A,0x39,0xB5,0x7E,0x3A,0x4C,0x86,0x45,0xA9, + + 0x2E,0x86,0x4B,0xAB,0x55,0xE1,0xB0,0x43,0xB6,0x97,0x63,0x2B,0xFE,0x90,0x27,0x9F, + + 0x22,0xDA,0x7B,0x61,0x32,0x46,0x5D,0xFB,0x18,0x5D,0xA9,0xDD,0x02,0xA6,0xD7,0xA8, + + 0xF8,0x94,0x4A,0x51,0xCF,0x6A,0xCB,0x6E,0x6C,0x95,0xB2,0xAF,0x7D,0xBC,0xD5,0x48, + + 0x2F,0x97,0x02,0xFA,0xD6,0x84,0x81,0x80,0x19,0x9F,0xA8,0x9C,0x80,0xBF,0x62,0xB4, + + 0x6C,0x92,0xEF,0xCB,0x37,0xAF,0xB7,0x6B,0xCC,0x2F,0xDB,0xC7,0x7C,0x32,0x6B,0xFF, + + 0xA9,0xDD,0xFF,0xBD,0xBB,0xD1,0x3F,0xDD,0xE9,0xBD,0xE7,0xF9,0xFE,0xBF,0x2C,0x28, + + 0x8F,0x41,0x92,0x2C,0x16,0x22,0x3C,0x08,0xC2,0x8C,0x50,0xA5,0x54,0x22,0x88,0xD7, + + 0x25,0x8C,0x24,0x8B,0xE0,0xF7,0x00,0x36,0x42,0x01,0xC8,0xCF,0x57,0x1A,0x3F,0x69, + + 0xA0,0x4F,0x57,0x81,0x92,0x21,0xC0,0x43,0x3F,0x00,0xD1,0xE0,0xD6,0x60,0xF6,0x95, + + 0xB0,0xEA,0xC1,0x14,0xB5,0x25,0x35,0x19,0x4E,0x02,0x6C,0xCD,0xD1,0xD8,0xF8,0xB3, + + 0x2C,0x00,0xE0,0x42,0xB3,0x3F,0x0D,0xE9,0xED,0x5F,0xD4,0x9A,0xA9,0xFB,0xB2,0x61, + + 0x2D,0xAA,0x48,0xA0,0x1B,0x3E,0xE6,0x79,0xA0,0xC5,0xA1,0x12,0xE8,0x7A,0xC1,0x5F, + + 0xAC,0x8D,0xA1,0xB3,0x77,0x2D,0x14,0x07,0x3D,0x45,0x8B,0x4C,0xBA,0x05,0xE9,0x23, + + 0xE1,0xEB,0xA9,0x23,0x1C,0xA1,0xA1,0x13,0xF0,0x73,0x19,0xFD,0xF4,0x69,0x0A,0x14, + + 0x0E,0x0A,0xAB,0x22,0xB9,0xF7,0x2C,0x41,0x68,0x45,0x94,0xA8,0x12,0xB5,0xA6,0x8A, + + 0x88,0x94,0xCA,0x42,0x18,0x0B,0x1E,0xBC,0x78,0xA0,0xA2,0xC6,0xD6,0x94,0x4C,0x8D, + + 0x8A,0x09,0x37,0x6F,0x17,0x68,0x93,0xEE,0xEC,0xB1,0xFB,0x4F,0x23,0x64,0x69,0x19, + + 0x8A,0x4B,0x4B,0x99,0x82,0x69,0x53,0x38,0xED,0x4D,0xFC,0x43,0x0B,0x61,0x3C,0x4F, + + 0xAB,0x60,0x45,0x0C,0x1E,0xE7,0xA8,0xAE,0x0A,0x0E,0xEA,0x87,0xD9,0x61,0xDA,0xDC, + + 0x09,0x58,0x35,0x2F,0x72,0xD9,0xE0,0xBF,0x81,0x66,0x63,0x20,0xAC,0x50,0x21,0x41, + + 0x89,0x2E,0x44,0xA5,0x18,0xE3,0x88,0x2B,0xF9,0x7A,0xAA,0x02,0x87,0x91,0x8B,0xD9, + + 0xC5,0x63,0xB3,0x4F,0x70,0x6C,0x13,0x69,0x22,0x64,0xD4,0x86,0x6A,0xF7,0xFB,0x04, + + 0x01,0x54,0xDE,0x77,0x58,0x0B,0x3B,0x60,0x68,0x11,0x9C,0xA0,0xFF,0x31,0xE0,0xB4, + + 0xC8,0x08,0x22,0x67,0xBD,0x3C,0x19,0x34,0x23,0xB1,0x08,0xD2,0x8E,0xDC,0x0D,0x85, + + 0x29,0x03,0xFB,0x83,0x51,0xB1,0x2B,0x59,0x02,0x12,0xAF,0x56,0xDE,0x69,0x1D,0xE3, + + 0xA5,0x7D,0x72,0xD2,0x73,0xB3,0xF1,0x2E,0xE0,0x13,0x49,0xF2,0x2F,0x79,0x1D,0xDE, + + 0x24,0x5D,0xA4,0x52,0x31,0xED,0x0D,0x69,0xC7,0xA5,0x60,0x06,0x41,0x10,0x15,0xD2, + + 0x44,0xE5,0x8D,0x87,0x33,0x35,0x5E,0xFC,0xC6,0x4E,0x86,0xF5,0xD0,0x37,0xBE,0xD2, + + 0x01,0x55,0x05,0xA1,0x40,0x74,0x0C,0x60,0x45,0x55,0x6F,0xC2,0x51,0x13,0x73,0x75, + + 0x82,0x97,0xCD,0xD5,0x3E,0x9A,0x1D,0x17,0xD0,0x63,0x45,0xCA,0x52,0x6C,0x96,0xFA, + + 0xD7,0x5A,0x8E,0x84,0xC5,0x56,0xFA,0x8C,0xE5,0x1A,0x80,0xDF,0x56,0x3A,0xCE,0x18, + + 0x72,0x5B,0xA2,0xB4,0x3F,0x3B,0x32,0x90,0xB4,0x64,0x58,0x43,0x9A,0xA1,0x1E,0xFC, + + 0xA9,0xCA,0xE5,0x95,0xBB,0x7A,0xD7,0xC6,0xE9,0x1A,0xD7,0x68,0xFE,0x78,0x4F,0x39, + + 0x26,0x9D,0x58,0x19,0xBB,0xD9,0xB0,0x3D,0xC8,0x1F,0x87,0x39,0x04,0xA3,0xBC,0x20, + + 0xFE,0xDC,0xD8,0x5F,0x1C,0xC3,0xEC,0x00,0x60,0x13,0xF7,0xD8,0xF8,0xB0,0x2C,0xD4, + + 0x2A,0xDD,0xC6,0xD8,0xE7,0x5E,0x0E,0xF1,0xC8,0x46,0x82,0x8E,0x8C,0xF6,0x1E,0xD7, + + 0x4F,0x70,0xF9,0x68,0x35,0xC8,0x0E,0x69,0x4F,0x58,0x6A,0x0F,0xDE,0x8B,0x95,0xD5, + + 0x98,0x1B,0xF5,0x2E,0x91,0x92,0x1B,0x9F,0x69,0x5C,0xAB,0xC1,0xFD,0x36,0xCC,0x26, + + 0x02,0x82,0xE0,0x93,0xEB,0xE2,0x1D,0x09,0xE5,0x41,0x30,0x65,0x64,0x8E,0x20,0x03, + + 0x03,0x88,0x93,0x88,0x16,0x81,0xF8,0xB2,0x67,0x7E,0xA8,0x45,0x51,0x8F,0xB1,0x87, + + 0x8A,0x55,0xE1,0x23,0x19,0x54,0x39,0xA7,0xC6,0x21,0x21,0xCF,0x85,0xAF,0x89,0xD3, + + 0x9F,0xC1,0x39,0x93,0x8C,0x6C,0x95,0xAC,0x34,0x15,0x29,0x44,0xEA,0x6A,0x02,0x62, + + 0xF3,0x02,0xDE,0x37,0xCA,0xAB,0x72,0x94,0x75,0xF6,0x8B,0xA4,0xD2,0xEA,0xC4,0x76, + + 0xEC,0xE1,0x68,0x47,0x31,0x08,0x5B,0x04,0x99,0x3A,0xFE,0xD3,0x1F,0xC6,0x61,0x83, + + 0x8E,0xC7,0xC3,0x34,0x35,0xAF,0xC9,0x9C,0x4B,0xDD,0x55,0xE3,0xC4,0x53,0xDD,0x31, + + 0x7C,0xC5,0xF7,0x66,0xB1,0x25,0x3B,0x8D,0xF4,0xF3,0xD9,0xD4,0x9F,0xE4,0x62,0x24, + + 0x0A,0x8A,0x55,0x0F,0x18,0xC6,0x7A,0x2B,0x68,0xCE,0x36,0x4E,0x4C,0x45,0x22,0x1E, + + 0x84,0x98,0x55,0x9A,0x3C,0xED,0xFA,0xBA,0x42,0x8B,0x3A,0xF9,0x79,0x44,0xE5,0x8F, + + 0x8E,0x36,0x33,0x8B,0x96,0xCA,0x99,0x9A,0x6D,0xF5,0x6E,0x5F,0xD8,0xE3,0x4B,0x4D, + + 0xBB,0x86,0xE3,0x1B,0x14,0xBA,0x7B,0xAE,0xCB,0xC9,0x62,0xF8,0x1F,0x2B,0xB9,0x90, + + 0xF3,0xCD,0xC4,0xEA,0xBD,0x28,0xC8,0x2D,0x98,0xC4,0xCE,0xD6,0xDC,0x20,0xC6,0xB2, + + 0xDF,0x40,0x94,0xFB,0xF4,0xAE,0x80,0x92,0xD7,0x00,0xA3,0x64,0xBA,0x88,0x59,0xA3, + + 0x98,0xC1,0xBA,0xCD,0x79,0x23,0x71,0x14,0xAE,0x11,0x49,0x1C,0xF5,0xE1,0x0D,0xBA, + + 0x64,0x8C,0xD5,0xFF,0x12,0xB4,0x84,0x93,0xCD,0x80,0x83,0x96,0x5B,0x02,0x2C,0xF8, + + 0xE6,0x90,0x64,0x07,0x30,0xF2,0x3C,0xA6,0xED,0xC1,0xAC,0xBA,0x9D,0x93,0xEC,0x12, + + 0x01,0xD3,0xFC,0x6D,0x33,0xCA,0x2C,0xC0,0x61,0xBF,0xC6,0xEA,0x54,0x71,0x2D,0x87, + + 0x2B,0xD3,0xE5,0xE3,0xB2,0xB0,0xA5,0x4B,0xB5,0x9F,0x75,0x27,0xA0,0x0D,0xE9,0x2D, + + 0xA4,0x33,0x58,0x6F,0xB5,0x08,0xAD,0xC0,0xD2,0xBD,0x02,0xEB,0xD6,0xB3,0xBE,0xDF, + + 0xA4,0x97,0xB0,0x81,0xFC,0xF7,0xF3,0x00,0xEB,0xCF,0x86,0x99,0xD5,0x7F,0x96,0x94, + + 0x67,0x18,0x9F,0x94,0xBB,0xB9,0x02,0x52,0x54,0x81,0x94,0x84,0xD4,0x7E,0x60,0xA1, + + 0x95,0xA2,0xAD,0x8F,0xB0,0xFF,0x50,0x95,0x2C,0xFD,0x09,0xDB,0xF0,0xBF,0x34,0x5A, + + 0x00,0x8C,0x4D,0xB5,0x04,0xD2,0xBD,0x97,0x10,0xCC,0x7A,0xCA,0x08,0x27,0xE6,0xEA, + + 0xA8,0x90,0x22,0x0A,0x76,0x65,0x54,0xBB,0x6F,0x18,0x5A,0x8A,0x34,0x9B,0xEE,0x1A, + + 0x63,0xDB,0x86,0xFC,0x3B,0xBB,0x36,0xBE,0xE2,0x98,0x38,0x40,0xF0,0x0F,0x62,0x0F, + + 0xAE,0xCF,0x1C,0xCD,0x1D,0x47,0x09,0x53,0x2E,0x5A,0x97,0x6C,0xFA,0x78,0x6F,0xC0, + + 0xAC,0xDB,0x1E,0x1B,0xBF,0x59,0x5F,0xF0,0x55,0xD6,0xF7,0xAA,0xCE,0x3A,0x62,0x2C, + + 0x1D,0x3E,0xDE,0x25,0x92,0xB1,0x57,0x99,0xCD,0x13,0x05,0xE2,0xCF,0x27,0x0E,0x7A, + + 0x73,0x90,0xD7,0x9C,0x9E,0x80,0x58,0x85,0x88,0x50,0x1C,0x12,0x7F,0x70,0x9F,0x6B, + + 0xF6,0xEC,0x1E,0xE8,0x1F,0xC1,0xB7,0x03,0x96,0xC5,0x5D,0x12,0x0F,0x85,0xC3,0x33, + + 0x37,0x59,0xC7,0xBD,0x5E,0x44,0x26,0x7F,0x48,0xD9,0x80,0xFB,0x90,0xD9,0x7E,0x06, + + 0xE9,0x0F,0x35,0x20,0xEF,0xAB,0x3D,0x5B,0xD9,0x1C,0xA1,0x37,0x6B,0xA3,0xB3,0xF2, + + 0xAD,0xFC,0x28,0x66,0x73,0xED,0xB5,0x14,0x2A,0x4E,0xC5,0x1E,0x75,0x67,0x53,0x93, + + 0x6B,0x66,0xD3,0x34,0xA7,0x8D,0xAA,0x6F,0x5D,0xBF,0x4C,0x24,0xE7,0x7E,0x71,0x67, + + 0xE9,0x0E,0xF7,0x12,0x30,0x62,0x99,0x42,0xF3,0xC6,0x33,0x41,0x70,0xC2,0x7E,0x10, + + 0x7A,0xAB,0x3B,0x3F,0x28,0x9B,0xF0,0x13,0xE1,0xC7,0x2F,0x23,0x76,0xBF,0x36,0x57, + + 0xA2,0x44,0x58,0xAD,0x13,0x5E,0x4E,0xCC,0xA8,0x01,0xF5,0x8D,0xE3,0x24,0xE1,0x32, + + 0x8F,0x95,0xFA,0xED,0x61,0xFB,0x33,0x45,0xA1,0xA9,0xF8,0x98,0x62,0xFD,0x36,0xD3, + + 0x12,0x12,0x36,0xA9,0x93,0xDC,0x63,0xC1,0x0E,0xE8,0xA7,0x72,0x72,0x78,0x10,0x22, + + 0xE3,0x4C,0xD8,0x5C,0x70,0x2B,0x6C,0x2E,0x80,0x47,0xAA,0xD3,0xDA,0xA4,0xAE,0x7A, + + 0xFE,0x6C,0x20,0xEF,0x95,0x68,0x65,0x02,0xEA,0xE4,0x0A,0xA3,0xA6,0x64,0x39,0xB9, + + 0x11,0xA5,0xFD,0x0B,0x79,0xA9,0xB7,0xAD,0x8E,0xD6,0x8D,0x4F,0xF6,0xB5,0x33,0x3D, + + 0x76,0x86,0x1C,0xE2,0x68,0xF8,0x4A,0x09,0xC1,0xB4,0x78,0xC3,0x38,0xF4,0x7A,0xB6, + + 0xA6,0x01,0xC0,0x48,0x50,0x68,0xF6,0x0A,0x6E,0xB0,0x66,0x0E,0xA5,0xC1,0x72,0xA7, + + 0x86,0x86,0x8B,0x3A,0x79,0x92,0x3A,0x33,0xFB,0x40,0xE2,0x58,0xD4,0xC0,0xD3,0xCB, + + 0x47,0xC2,0x7B,0x7D,0x9A,0xD1,0x2B,0x4E,0x37,0x41,0x83,0x5C,0x7B,0xCF,0x0D,0xC6, + + 0x74,0x82,0x30,0x1A,0xA8,0x8E,0xA4,0x5E,0x6A,0x0E,0x8A,0x0D,0x5B,0xE9,0x59,0x71, + + 0x83,0x50,0x28,0x7B,0xB2,0x0C,0xB4,0xD3,0xC3,0xD3,0xC5,0x96,0x9B,0x34,0xAC,0xE3, + + 0x82,0x92,0xA1,0xBE,0x90,0xE7,0x64,0x97,0x9C,0x5E,0x5E,0xEE,0x8A,0xE4,0x37,0xB1, + + 0x44,0xBD,0xB0,0xE7,0x6E,0x34,0x77,0x52,0x6C,0x8F,0xB3,0x47,0x7C,0x30,0x20,0xB5, + + 0x23,0xDF,0x1D,0xDA,0x4C,0x4F,0x8D,0xF6,0x1E,0x55,0xE5,0x72,0x0C,0xC5,0x53,0x22, + + 0x8E,0xB9,0xD6,0xEA,0xD9,0x70,0xF8,0xE4,0x70,0x8C,0xB4,0xAE,0xCA,0x79,0xDB,0x32, + + 0x07,0xB1,0x33,0xB6,0xC0,0x50,0x62,0x12,0x01,0xA0,0xE4,0x6E,0x57,0xF4,0xD6,0x23, + + 0x0E,0xBB,0xFF,0x75,0x23,0x77,0x47,0xA3,0x09,0x12,0xB2,0x67,0x63,0x63,0x47,0xD7, + + 0x6B,0x7F,0xF5,0x2E,0x3C,0xC1,0xCD,0xC1,0x73,0xF8,0xA3,0x06,0x77,0xDA,0x50,0xEA, + + 0xD7,0xB9,0x2F,0xF2,0xAD,0xB5,0x3F,0x83,0xC9,0xAE,0x2D,0x36,0x5C,0xF3,0xAE,0xEA, + + 0x4B,0x05,0xDE,0x8D,0x1B,0xB2,0xFD,0x9C,0x02,0x56,0x3E,0xCE,0x1B,0xB5,0x3F,0xB9, + + 0x18,0xB5,0xFA,0x67,0x9C,0xCF,0x77,0xE3,0x58,0x57,0x09,0x9C,0xDA,0xD5,0x9F,0x1B, + + 0x6C,0x48,0x5E,0xA0,0x52,0x7F,0x9F,0xCA,0x92,0xDE,0xE1,0xBA,0xDD,0xD6,0xE2,0xBB, + + 0x54,0xB7,0xFD,0x52,0x1E,0x93,0xF6,0x9B,0xC9,0xDF,0x72,0x5C,0x24,0xD3,0xC9,0x29, + + 0x88,0x5D,0xF1,0x3E,0x1F,0x3B,0xDE,0x7C,0x2D,0xC1,0xE0,0x5C,0xF9,0x7C,0x3F,0xCD, + + 0xAE,0x2C,0x63,0xB7,0x19,0x5B,0x27,0xCD,0x68,0x5E,0x73,0x9F,0x74,0x3F,0x71,0x30, + + 0x4B,0x9E,0xE6,0xF7,0x1A,0xC0,0xA0,0xC7,0x48,0x1D,0xF4,0x7A,0xDF,0xE3,0xF3,0xFC, + + 0xED,0xBB,0x0C,0x83,0xE3,0x5D,0x0A,0x87,0xB3,0x3D,0xCF,0xCB,0x1C,0xBF,0x3A,0x24, + + 0xEE,0xC5,0xAA,0x65,0x3F,0x24,0xEC,0x16,0x2E,0xCE,0xEC,0xDB,0x15,0x6C,0x7F,0xE1, + + 0x80,0x07,0x65,0xF8,0xFF,0xAD,0x27,0x41,0x3B,0x1F,0xCC,0xCD,0xD2,0x00,0x17,0xF1, + + 0xE7,0x9F,0x39,0xE4,0x11,0x0E,0xB9,0x40,0xFE,0x46,0x40,0xDC,0x66,0xA3,0x02,0x42, + + 0xF1,0x09,0x58,0xD9,0x04,0xE9,0xC8,0x9D,0x56,0x89,0xD0,0x42,0xEA,0x87,0x3C,0x28, + + 0x23,0x88,0x5C,0x34,0xE8,0x0E,0x00,0x56,0xC5,0xE3,0x68,0x86,0xE4,0x44,0x1A,0xB8, + + 0x80,0x64,0x02,0x63,0x37,0x79,0xDE,0x81,0x6A,0x3B,0x40,0xD7,0x6E,0x45,0xC5,0xD6, + + 0x78,0xE9,0x91,0x53,0x7E,0x1C,0x70,0x11,0x30,0xA2,0xAF,0x84,0x53,0x6A,0x5C,0x0D, + + 0xAD,0x17,0xDA,0xBE,0xDE,0x07,0x20,0x1C,0xA7,0x8C,0x74,0x94,0x80,0xAC,0x4A,0x51, + + 0xBD,0x84,0xAB,0x7C,0xC0,0xE6,0xAA,0xCB,0xEE,0x49,0x91,0xC1,0xA9,0xE6,0x97,0x69, + + 0xA8,0x75,0x07,0x6D,0x63,0xCF,0x0D,0xC9,0xAE,0xD6,0xCD,0x28,0xDA,0x28,0x79,0x1B, + + 0x7A,0x26,0xAA,0x60,0x3A,0xEA,0x09,0x0B,0xE9,0x64,0xE5,0xDD,0xD9,0x46,0xDA,0xB1, + + 0xF3,0x3A,0xD0,0x6A,0xA7,0x0D,0x4A,0x95,0xEB,0x53,0xA0,0x39,0xB5,0x88,0x0A,0x0C, + + 0xF7,0x20,0x4A,0x2C,0x7D,0x91,0x42,0x84,0xE3,0xC0,0xFA,0x87,0x53,0xAD,0x59,0xD9, + + 0x8E,0xCF,0xDB,0x7F,0x2A,0x01,0x72,0x0D,0x35,0x8F,0xCB,0x4B,0x29,0x75,0x78,0xB9, + + 0x23,0x22,0x7B,0x34,0xF7,0xA2,0x84,0x09,0x3C,0x70,0x39,0x7F,0x24,0x81,0x1C,0x7D, + + 0x4C,0x9D,0x9E,0x36,0xF1,0x1F,0x26,0xF6,0x8F,0x94,0xBC,0x57,0xD7,0xB0,0x16,0x22, + + 0xBC,0xD0,0x2B,0xE5,0x13,0x34,0xAC,0x49,0xE7,0xED,0x1C,0xC5,0xD6,0x72,0x37,0xA9, + + 0x4F,0xD6,0x01,0xA3,0xDF,0xBD,0x0B,0x41,0x86,0xF4,0x87,0x97,0x54,0x5D,0x4D,0xC5, + + 0x0B,0x9E,0xBB,0x36,0x5E,0xF7,0x0C,0xD1,0x12,0xB6,0x8E,0x93,0x29,0x40,0x56,0x31, + + 0xA2,0x39,0x50,0xA4,0x12,0x40,0xB6,0xC1,0x9D,0xBA,0x4F,0xBC,0xAF,0x09,0x12,0xD5, + + 0x86,0xCA,0x2E,0x8C,0xDE,0x24,0x04,0xD6,0x9C,0xD3,0x9C,0xD6,0xA6,0x93,0x1D,0x73, + + 0x37,0xD7,0x45,0x34,0x3A,0xF6,0xCA,0x78,0x13,0x70,0xDA,0xC3,0x1F,0x0D,0xD9,0xB1, + + 0x83,0x68,0x15,0xDF,0x5E,0x06,0x50,0xD8,0x46,0x61,0x6D,0x84,0x99,0x7E,0xDD,0xAD, + + 0x8D,0x67,0x9C,0x3F,0x9F,0x17,0x0E,0x55,0x48,0x75,0x88,0x13,0x1C,0x07,0x53,0x70, + + 0x2B,0x7B,0xF0,0x3B,0x35,0x12,0x0C,0x8A,0x6F,0x76,0x45,0xC1,0x15,0xF4,0x1D,0x71, + + 0x57,0xC5,0x03,0xFC,0x38,0xFB,0xE4,0x5A,0x4F,0x9A,0x48,0xDD,0x9E,0x05,0x7B,0xD1, + + 0x5C,0x87,0xFD,0xD4,0xD6,0x18,0x9F,0xC8,0x4E,0x58,0xC0,0xC1,0xD3,0x64,0x06,0x81, + + 0x9E,0x91,0x1E,0xEA,0xD7,0x6D,0x16,0xA1,0xDE,0xD1,0xD6,0x7C,0xFE,0xBD,0xFE,0x2B, + + 0x8C,0xDD,0x16,0xFA,0x0C,0xBC,0x44,0x00,0x94,0xA0,0xC1,0xA1,0x5B,0x50,0x1C,0xEC, + + 0x0F,0x21,0x1F,0xC7,0x57,0x4F,0x14,0xCF,0xE0,0x21,0x5C,0x95,0x2B,0x02,0x5D,0xEB, + + 0x8F,0x30,0x57,0x21,0xAF,0xF2,0xE8,0x04,0x5A,0x0C,0xA9,0x04,0x72,0x72,0x67,0xFB, + + 0xE1,0x86,0xA0,0x5C,0x90,0x6E,0x68,0x24,0xA9,0x63,0xB0,0x7E,0xC0,0x6F,0x4F,0x76, + + 0xFE,0x1A,0xA8,0xC6,0x91,0x18,0xAC,0x52,0xFE,0xFC,0x13,0x54,0xDC,0x75,0x01,0xFB, + + 0xA4,0x19,0xA1,0xEB,0x10,0xEE,0x23,0x05,0x61,0x1D,0x2E,0x45,0xD8,0xB2,0x99,0x77, + + 0xA5,0x82,0xA9,0xF3,0x11,0x40,0xFC,0x4B,0x57,0x02,0xE1,0x4E,0xB1,0x23,0x33,0x40, + + 0x1E,0xD3,0x74,0x2F,0x9C,0x65,0x00,0xB3,0x0E,0x28,0x8E,0x86,0x42,0xCF,0x30,0x42, + + 0xFC,0xB0,0xF6,0x52,0x2B,0x8A,0xBB,0x8E,0x67,0xE9,0x27,0x0A,0x7D,0xBA,0x41,0x68, + + 0x7F,0xB2,0xB8,0xEA,0x9A,0x04,0x6B,0xFE,0x3D,0xCB,0x71,0x65,0x2F,0x97,0x31,0x75, + + 0x62,0x9B,0x69,0x26,0x1F,0x74,0x21,0x9B,0x6F,0x4A,0xF6,0xD0,0x0A,0xFB,0x8B,0xFB, + + 0x8C,0xA5,0xA2,0x8C,0x98,0xED,0x48,0x99,0x20,0x4B,0xE0,0x3C,0x58,0x62,0x74,0x1E, + + 0xE0,0x06,0xAA,0x36,0x99,0x77,0xA2,0x05,0xB6,0x5B,0x88,0x38,0xBB,0xE9,0x7B,0xB9, + + 0x0E,0x4B,0xA3,0x63,0x18,0x7C,0x6A,0x5F,0xEC,0xB5,0xE6,0xDE,0x5C,0x17,0x59,0xBA, + + 0x62,0x6F,0xAB,0x7B,0x19,0x77,0xA3,0x85,0x44,0x29,0x9B,0xFD,0x25,0x0A,0x3B,0xB9, + + 0xA9,0x1C,0xBC,0x4B,0xAB,0x23,0x43,0x8A,0x83,0x43,0x06,0x36,0x93,0x28,0x9E,0xA6, + + 0xFA,0x6E,0x5A,0x9C,0x03,0x10,0xFA,0x98,0x4F,0xEF,0xE5,0xF2,0xAA,0x5B,0xFC,0x74, + + 0x75,0xD3,0xFD,0xAF,0x36,0x21,0x2A,0x1A,0x4E,0xEC,0x07,0x3E,0x5E,0x18,0x30,0x27, + + 0x51,0x92,0xDD,0x5B,0x0A,0xE0,0xFF,0x1B,0xF9,0x40,0xE5,0x7B,0x49,0x67,0xDC,0x6C, + + 0x4B,0x1F,0x3A,0x86,0x68,0x04,0x34,0x1C,0xF0,0x14,0x04,0x0B,0x78,0xE0,0x9C,0xE3, + + 0x5B,0xB0,0x68,0xB3,0xD6,0x21,0x64,0x97,0xBE,0x0E,0x3C,0xC7,0xFD,0x22,0x85,0xF2, + + 0xDE,0x97,0x25,0x8B,0x3C,0xBF,0x36,0xA6,0x0D,0x62,0xAB,0xA3,0xC8,0xDD,0x35,0x6E, + + 0x48,0x80,0x62,0x7E,0x40,0x6C,0x3D,0x15,0x4C,0x63,0xE3,0xB2,0x50,0x32,0xBB,0xBB, + + 0x0C,0xAB,0xBF,0xCA,0x91,0x89,0x71,0xE6,0xF6,0x30,0xD4,0x2D,0xC4,0x74,0xCE,0x03, + + 0x80,0x5A,0x6F,0x36,0xD3,0x89,0x06,0xF1,0xED,0x14,0xFE,0xAB,0xA6,0xC9,0x4D,0xD4, + + 0x30,0x1C,0xF7,0xFD,0x41,0x6B,0x6F,0x66,0x09,0x59,0xC2,0x9F,0x6E,0x79,0xDD,0x96, + + 0x31,0xA8,0xFC,0x37,0x2F,0x38,0xA8,0xF0,0xE1,0xFA,0xA6,0x86,0x50,0x0B,0xD2,0x76, + + 0x0C,0xB7,0xB3,0x6E,0xC1,0x47,0xEC,0xA0,0xB7,0x07,0xDE,0xB8,0xC1,0xD9,0x36,0xBC, + + 0x95,0x1A,0x2A,0xE6,0x8E,0x34,0xE6,0xB0,0xB6,0x06,0x6B,0x42,0x3D,0x44,0xA3,0xEB, + + 0x57,0x7F,0x17,0x86,0x3C,0x6E,0x37,0x41,0x45,0x6A,0x37,0x47,0x1D,0x3B,0xBE,0x38, + + 0x11,0x58,0x3B,0xD7,0x70,0x7F,0x3F,0x59,0x79,0x1F,0x89,0xBB,0x4A,0x36,0xC1,0x1B, + + 0x89,0x41,0xF4,0xF5,0xEB,0x2F,0xF6,0xC1,0x81,0x18,0xAB,0x04,0x68,0x81,0x1E,0xAF, + + 0x33,0x5A,0x69,0x3E,0xDB,0xAC,0xFA,0x9A,0x80,0x52,0x25,0x87,0x55,0xC2,0xD7,0x8F, + + 0x61,0x83,0xD1,0x2F,0x41,0x03,0x69,0xEE,0xDC,0xF1,0x40,0x12,0x0F,0x1D,0x21,0xAB, + + 0x26,0xA9,0xE0,0x6C,0x18,0xA0,0xEB,0x9B,0xCF,0x55,0xE4,0x58,0x08,0x02,0x9F,0xE0, + + 0x20,0x8D,0x80,0xA3,0x8C,0xE4,0xA0,0x40,0xB3,0xA5,0x24,0x77,0xD0,0x81,0xC4,0x69, + + 0x9B,0x1C,0x92,0x91,0xB9,0xBD,0x80,0xCD,0x55,0x8C,0x4D,0x37,0x11,0xD5,0xD8,0x24, + + 0x25,0xFD,0x00,0x00,0x65,0xFD,0x09,0xDC,0x49,0x83,0xD1,0xB6,0xD0,0x89,0xC8,0x37, + + 0x20,0x75,0x87,0x11,0x04,0x3F,0x96,0xD1,0x69,0x3E,0x19,0x39,0x59,0xEE,0x01,0x02, + + 0x4E,0x1B,0xE1,0x70,0xB5,0xE5,0xE0,0xCD,0x4E,0x94,0xF3,0x95,0xD2,0x39,0x06,0xB0, + + 0xBE,0x08,0xFE,0x50,0x86,0xEA,0x40,0x81,0xE4,0xA0,0x87,0x0C,0xCD,0x7A,0xDA,0xD8, + + 0x71,0x76,0x14,0xB9,0x8E,0x9B,0x54,0x65,0x52,0xA2,0x14,0x99,0x2F,0xB0,0xC2,0xA8, + + 0xA3,0x3A,0xD7,0xB5,0x87,0xE8,0x41,0x57,0xC4,0x07,0x7E,0xA4,0x74,0x29,0xDD,0x82, + + 0xA9,0x5E,0x8C,0x09,0xCD,0xA7,0x4A,0x0E,0xA1,0xF8,0x22,0xEE,0x58,0x05,0xBA,0xE5, + + 0x8F,0xAE,0x83,0x44,0xD4,0xCD,0x1A,0x6E,0xA0,0xF9,0x06,0x1A,0xC5,0xAD,0x5B,0x2C, + + 0x71,0x85,0x17,0x45,0x55,0xEE,0xC9,0x23,0x13,0x95,0x23,0x80,0x2B,0xAA,0x63,0x79, + + 0x76,0xCB,0x80,0xC0,0x24,0x75,0xC3,0x33,0x12,0x94,0x1A,0x38,0x3C,0x8D,0x1B,0xB9, + + 0xAD,0x51,0x72,0x24,0xC2,0xA3,0xD4,0x88,0x56,0x21,0xC8,0x30,0xE1,0x61,0x91,0x61, + + 0xAC,0x26,0xD8,0x66,0xEC,0x90,0xFC,0x1D,0xA4,0xC2,0x87,0x54,0xDB,0xAC,0x41,0x6B, + + 0x09,0x1C,0xD1,0x15,0x02,0xA1,0x36,0x4F,0x70,0x11,0xDC,0x81,0x3F,0x72,0x13,0x53, + + 0x72,0x7E,0x48,0xBD,0x7F,0x3E,0x7E,0x1C,0xD5,0x8E,0x8A,0x7F,0x56,0xD8,0xB4,0x7A, + + 0x24,0x2B,0x8D,0xDC,0xFD,0xD4,0x17,0xA5,0xC9,0xE0,0x24,0xD5,0xF0,0xC1,0xC0,0xED, + + 0x01,0x97,0x82,0x90,0xA4,0x2D,0x1C,0xC2,0xFD,0x95,0x6D,0x45,0xF9,0x7C,0xA4,0x07, + + 0xEE,0x4F,0x8E,0x65,0x18,0xAE,0x4D,0x84,0x3B,0x8D,0xCB,0xA1,0x1D,0x96,0x83,0xDD, + + 0x04,0x12,0x83,0x90,0x64,0x4D,0x9C,0xB4,0x44,0xB6,0x59,0x93,0x08,0x47,0x1B,0xB0, + + 0xF4,0x0B,0x59,0xD8,0x95,0x31,0x71,0x89,0x0E,0x90,0x20,0x09,0x74,0x1A,0x9C,0x01, + + 0xC6,0xF9,0x4B,0x34,0xD7,0x49,0xC6,0xD6,0xD9,0x0A,0x41,0x7D,0xC8,0x05,0xDE,0x63, + + 0x4B,0x34,0x1E,0xEC,0x15,0xCB,0x0C,0xF5,0x45,0xC6,0x71,0x6C,0xF7,0x76,0x8A,0x2C, + + 0x46,0x41,0xC3,0x35,0xC3,0x0B,0xFC,0x98,0x8F,0x93,0x94,0x84,0x16,0xC8,0x24,0x75, + + 0xCD,0xFB,0x1F,0x50,0x8D,0xBC,0xCC,0xA2,0xB3,0x87,0xCE,0x9C,0xCC,0xF7,0x16,0x08, + + 0x2D,0xD8,0x0A,0xEC,0xB3,0xDC,0x9F,0xBD,0xCC,0xBC,0xAF,0xE0,0xA5,0xF6,0xB7,0x09, + + 0x35,0x8F,0x4A,0x84,0x38,0xEE,0x17,0x63,0x74,0x9E,0x18,0xB5,0x5F,0x7F,0x65,0x86, + + 0x52,0x30,0x57,0x97,0x62,0x84,0xC7,0xB3,0x32,0x84,0x8D,0x83,0x0A,0xBA,0x9D,0x4E, + + 0x68,0x9C,0xB3,0x30,0xDF,0x2F,0x0F,0x8C,0x85,0xD3,0x0F,0xCA,0x4D,0xEE,0x54,0x40, + + 0xDC,0x99,0x45,0x6F,0x9C,0x02,0xDA,0xD6,0x84,0xB9,0x2A,0x00,0x86,0x9E,0xCB,0xB9, + + 0x74,0x21,0x9C,0xA1,0x5E,0x0F,0x76,0x8D,0xCA,0x73,0x48,0xD2,0x01,0x23,0xEB,0x5F, + + 0xE9,0x9F,0xD5,0x67,0x4C,0xFE,0x42,0x7C,0x04,0xD0,0x80,0x85,0xD1,0x60,0x2D,0xA5, + + 0x99,0x02,0x64,0xE2,0x00,0xAB,0xC4,0xDA,0xD3,0x6F,0xC0,0xB4,0x14,0x22,0xE9,0x50, + + 0x4D,0x9C,0xD2,0x11,0x9F,0x6E,0xA2,0xCB,0x51,0x8C,0x8D,0xB0,0x26,0xEA,0xEF,0x10, + + 0x1E,0x3F,0x01,0x82,0x37,0x32,0x81,0x57,0x33,0x52,0x80,0x25,0xD6,0x29,0xEC,0xEB, + + 0x38,0x55,0xD3,0x05,0xBE,0xA6,0xE2,0x39,0x24,0xBC,0xC9,0x05,0xDD,0x21,0xC0,0xD1, + + 0x8E,0xA6,0xE9,0x56,0xB3,0xBB,0xD4,0x99,0x62,0x06,0x28,0x6C,0xB3,0x2B,0xE8,0x92, + + 0x8F,0x0A,0xDB,0x37,0x9B,0x71,0x78,0x0E,0xE0,0x20,0xFC,0x18,0xBA,0x1C,0xE1,0x23, + + 0x54,0x08,0x75,0x27,0x69,0x64,0x17,0x1F,0x40,0x5A,0xAF,0x08,0x57,0x67,0xFD,0x2E, + + 0x20,0xA7,0xF7,0x89,0x1C,0xA1,0xE6,0x93,0xF0,0x0C,0xC3,0x71,0xF2,0x27,0x7F,0x15, + + 0x9B,0x05,0x94,0x0A,0xF3,0x6C,0x82,0x5A,0xC6,0xD7,0x5B,0x7F,0x2F,0x9F,0x21,0xF7, + + 0x2D,0xA2,0xF4,0x1B,0x3D,0x27,0x40,0x3C,0xC7,0x96,0x2B,0x48,0xB8,0xD6,0x39,0x42, + + 0x3F,0x87,0xBD,0xEF,0xF2,0x4E,0x49,0x28,0x46,0xF5,0x4C,0xD7,0x64,0x83,0x73,0x99, + + 0x74,0xFA,0x2F,0xDF,0x1D,0x34,0x41,0x3C,0x47,0xB4,0x5B,0xC8,0x53,0x68,0xD4,0x3B, + + 0x66,0x07,0xC6,0x0C,0x42,0xA1,0xEA,0x58,0x4A,0x93,0xF6,0x00,0x69,0xD7,0xFE,0xDC, + + 0x61,0xDC,0xB4,0x31,0x99,0x31,0x3A,0x32,0x8B,0x42,0xFE,0x10,0x68,0x29,0xF5,0x58, + + 0xEE,0x0A,0xBD,0x91,0x71,0x95,0x12,0x0F,0xA8,0x0E,0x6B,0x4D,0x3B,0x2E,0x92,0xF6, + + 0xB4,0x0D,0x2C,0xBF,0x13,0xD4,0xEF,0x27,0x68,0x0D,0x81,0x27,0x7C,0x7F,0x83,0x53, + + 0x83,0x4E,0x6B,0x06,0xA1,0x6B,0xEC,0xA8,0x9D,0x1F,0x8E,0xD7,0x14,0xF6,0x27,0x7E, + + 0xC0,0x0D,0x22,0xF6,0x90,0xCE,0xB8,0x52,0xE2,0x35,0x82,0x48,0x71,0xE4,0x3F,0xDA, + + 0x1F,0x9F,0x45,0xD0,0xD8,0x34,0x85,0x8B,0x64,0xF6,0x95,0x65,0xF7,0x87,0x70,0xB5, + + 0x1C,0xE5,0xED,0xDF,0x86,0x3E,0x75,0xB7,0xE7,0x41,0x0F,0x8E,0x9D,0x31,0x1B,0x40, + + 0x51,0x63,0x44,0xA5,0x85,0x99,0x74,0xE5,0x6F,0x8E,0x6B,0x02,0x62,0xE9,0x32,0x1C, + + 0x25,0x3C,0x35,0x74,0x13,0xE6,0x5A,0x18,0xEB,0x18,0xE6,0xFC,0xD4,0x65,0x85,0x39, + + 0xDA,0x9B,0x0E,0xA5,0xB6,0x1F,0x54,0x92,0xFD,0x5D,0x2D,0xED,0x0B,0x39,0xA9,0x39, + + 0x2B,0x5A,0xF3,0xB8,0x51,0x17,0x45,0x4D,0xC1,0xE5,0x25,0xFD,0x54,0x67,0x78,0x6A, + + 0x9D,0xCE,0x6A,0x13,0x39,0x58,0x7D,0x2C,0x7A,0xC6,0xD0,0xD2,0x4B,0x63,0x86,0x7A, + + 0x98,0x8F,0x71,0x18,0x4C,0x0C,0x5F,0x62,0x88,0x32,0x61,0xC6,0x0F,0xA6,0x8F,0x6B, + + 0x11,0xAC,0xBD,0x7E,0x85,0xB7,0xD7,0x21,0x3B,0x18,0x2F,0x55,0xF8,0x8B,0x01,0x7B, + + 0x8D,0x06,0x9F,0x0D,0xB5,0x79,0x25,0x3E,0x45,0xF7,0x20,0x8C,0x58,0x84,0x1E,0xDC, + + 0xC3,0xE6,0x85,0x24,0x41,0x71,0xD2,0xAD,0x3D,0x58,0x2E,0x1F,0x21,0x7A,0x1E,0xF8, + + 0x69,0xB0,0xCA,0x59,0xD2,0xA7,0x26,0xDF,0xCA,0x56,0xC9,0xCC,0xF9,0x61,0x1F,0xCD, + + 0x2F,0xAC,0x8D,0xC8,0x45,0xC9,0x6D,0x6B,0x7B,0x05,0xFE,0x15,0xFC,0x96,0x80,0xB9, + + 0xA9,0x92,0xDD,0x9F,0x50,0xC4,0x5E,0x7B,0x7A,0x5A,0x27,0xF5,0x06,0x30,0xDF,0x7C, + + 0x2A,0x5F,0x9A,0x81,0x37,0xE2,0xA0,0x58,0xA3,0xD0,0x20,0xD3,0x67,0x45,0xFC,0x48, + + 0x94,0xE2,0xAF,0x31,0xB9,0xC7,0xC2,0x3A,0xB8,0x0E,0xE3,0x50,0x8B,0x6A,0x1E,0xA6, + + 0x7F,0x1E,0xFB,0x06,0x1A,0xA9,0x0E,0xD5,0xD4,0x1F,0x09,0xD8,0x59,0xF9,0x00,0x93, + + 0x4A,0x63,0xD0,0xE7,0x9D,0xC5,0xA9,0x49,0x66,0xA6,0x99,0xC4,0x76,0xF1,0xCF,0x2D, + + 0xDB,0x58,0xDE,0xAF,0x9B,0x22,0xED,0x82,0x40,0x2C,0xCA,0x80,0xD4,0xF8,0xA0,0x30, + + 0x44,0x75,0x37,0x25,0x2C,0xCB,0xF6,0x43,0xC5,0x29,0xC0,0x89,0x47,0x38,0xD8,0x1D, + + 0x04,0x82,0xE1,0x87,0x92,0x82,0x77,0xA3,0xCA,0x84,0xAA,0x05,0x21,0x83,0x16,0xAB, + + 0x87,0x23,0x8B,0x55,0x96,0xE7,0xD4,0x11,0x38,0xC1,0x01,0x7F,0x2A,0xA8,0xC7,0x70, + + 0x9A,0x95,0xDC,0x08,0x8C,0xCC,0x0D,0xC8,0xE0,0x15,0x0A,0x5E,0xDC,0x4E,0xCF,0xE1, + + 0xFC,0xDF,0x4E,0x76,0x3C,0x54,0xAA,0x40,0xEA,0xD9,0xC4,0x0A,0xB6,0x08,0x46,0x4B, + + 0x98,0x37,0x99,0xEA,0xFF,0xEA,0x4B,0x0C,0x31,0xC5,0xCB,0x6F,0xF9,0x67,0x50,0x71, + + 0x17,0x94,0x1F,0x38,0x31,0xAF,0x04,0xDD,0xDD,0x16,0x17,0x4C,0xB1,0x4D,0xF8,0xE2, + + 0xC6,0x65,0xC6,0xB3,0x3E,0xBD,0x5B,0x48,0xEF,0xA2,0x46,0x0C,0xAD,0x89,0xB1,0xF5, + + 0x70,0x8F,0xFB,0xDA,0x18,0x56,0x22,0x72,0xCD,0xD1,0x02,0x76,0xA6,0xA2,0x36,0xCF, + + 0xE1,0x0E,0x63,0x4C,0xE1,0xE2,0x94,0x2B,0xC2,0x33,0xCB,0x94,0xCE,0x73,0xDE,0x2E, + + 0x3B,0x46,0x54,0x2F,0x97,0xA6,0x4B,0xFF,0x82,0x6E,0xFA,0x01,0x78,0xFF,0x3C,0x9F, + + 0xD5,0xFC,0xFB,0xBE,0x32,0x1B,0x90,0xF1,0xC7,0x7C,0x0F,0x03,0x83,0x7B,0x53,0xEC, + + 0x2B,0x4E,0x84,0x7A,0x8B,0xCA,0x15,0x50,0xC9,0x7D,0xE6,0x19,0x03,0x5E,0xE1,0x79, + + 0x5D,0xF0,0x77,0x7B,0x3C,0x49,0x91,0xE9,0x2D,0x96,0xF5,0x9A,0x1F,0xB6,0x92,0x16, + + 0x5A,0x8D,0xED,0x7F,0x71,0x7E,0x99,0xE0,0x46,0x7F,0x19,0xF5,0x79,0xFF,0x3D,0xC1, + + 0x81,0xD8,0x9D,0xB4,0x0D,0xD0,0x0C,0x11,0x5D,0x98,0x40,0x62,0x3B,0x45,0x27,0x21, + + 0x1C,0x93,0xD6,0x25,0x0A,0xB1,0x1E,0xF3,0x66,0xA5,0xFD,0x89,0xD0,0x55,0x75,0x85, + + 0x96,0x39,0x19,0xAD,0xAC,0xD9,0x64,0x90,0xB1,0xB8,0xE7,0x61,0x67,0xB9,0x44,0x49, + + 0x04,0x3A,0xA8,0xA4,0x8A,0x30,0x47,0x00,0xDC,0x78,0xB2,0x84,0xAC,0x70,0x5A,0xAE, + + 0x9D,0x91,0xD8,0x36,0x2C,0x75,0x92,0xE0,0xA5,0x9C,0x16,0x46,0xAE,0x35,0xD1,0xE4, + + 0x03,0x46,0xF5,0x91,0x3B,0x52,0x56,0xBC,0x8C,0xBF,0x0A,0xDC,0xA3,0x06,0xA0,0xF4, + + 0x21,0xF9,0xD9,0x36,0xC7,0xAC,0x1E,0x8F,0x6F,0xBE,0x48,0x53,0xFC,0x96,0x10,0x3E, + + 0x56,0x06,0xFD,0x1B,0x82,0xB4,0xC7,0xB3,0x8E,0xFB,0xB9,0xB9,0x36,0xBF,0xA9,0x2A, + + 0x5E,0x87,0x66,0x5E,0x0D,0x07,0x29,0xAC,0x5E,0x73,0xF0,0x8D,0x15,0x07,0xFC,0x1C, + + 0x0F,0x32,0xE9,0x2F,0x40,0x21,0x57,0xF8,0xCE,0x02,0xDE,0x1E,0x96,0x27,0x43,0xAD, + + 0x51,0x97,0x5F,0x1F,0xB2,0xB7,0xEA,0xE8,0x7A,0xD8,0xDC,0x9D,0x15,0x87,0x24,0x27, + + 0xAF,0x04,0xB6,0xD9,0xDC,0x23,0xCB,0x99,0x10,0xD9,0xE5,0xFE,0xDC,0xDE,0x7E,0xDC, + + 0x06,0x48,0xC4,0xDB,0x16,0x22,0x6E,0xC9,0xC2,0x5C,0x07,0xDB,0xA5,0xF3,0x01,0xEE, + + 0xE8,0xFA,0xC8,0xE7,0x17,0x23,0x28,0xD2,0x63,0x43,0xA2,0xCB,0x57,0x4A,0x0D,0x41, + + 0x86,0x40,0xAF,0x76,0x91,0x60,0x72,0xC3,0x42,0x5E,0xB1,0xB1,0x28,0x91,0xF2,0xE9, + + 0x81,0x8E,0xA7,0x04,0x90,0x8E,0x9D,0x11,0xD5,0x2B,0x2D,0xB1,0x93,0x2B,0xC0,0x23, + + 0xD7,0x68,0xE6,0xF1,0x28,0x4A,0x56,0x20,0xAB,0x4C,0x0B,0x9B,0x2D,0x9B,0xB7,0x23, + + 0x75,0xA4,0xF6,0xF8,0xD9,0x36,0x18,0x97,0xA8,0x21,0xCE,0xCD,0xAC,0xC8,0x7F,0xFD, + + 0x48,0x4E,0xFF,0xE8,0x58,0x15,0x23,0x11,0x61,0x04,0xF1,0x69,0x3B,0x15,0xC1,0xA2, + + 0x8A,0xAA,0x81,0x51,0x3A,0xE0,0x61,0x8A,0x6F,0x4A,0x08,0xC4,0xA1,0xB8,0x14,0xFD, + + 0x3B,0x6C,0x8A,0xBE,0x79,0x65,0x2C,0xF4,0x6A,0xA5,0x80,0xB2,0x5E,0x4A,0xF2,0x6A, + + 0xE2,0xB2,0xEA,0x4B,0xF6,0x24,0xE5,0xBA,0x84,0x34,0x0D,0xC3,0xA8,0xBA,0xFB,0x73, + + 0xFE,0x18,0xBD,0xBC,0xBB,0xA8,0x10,0xC1,0x28,0x07,0x2D,0xA9,0xDA,0x69,0x2D,0xEC, + + 0xD2,0x0F,0x4B,0x8D,0xA3,0xD6,0x23,0x04,0x6A,0x4F,0x60,0x4E,0xA7,0x29,0xCA,0x78, + + 0x02,0xB3,0xFE,0xEE,0xE2,0xDF,0x32,0x52,0xEA,0xF0,0x71,0xC0,0x86,0x1F,0x99,0x1F, + + 0xD1,0x90,0x7E,0x42,0x69,0x6F,0x04,0x29,0xBB,0xE6,0x0C,0x0F,0x69,0xCB,0x79,0xEC, + + 0x79,0xA3,0x74,0xF1,0x9C,0x05,0x2B,0x4E,0x33,0x41,0x3F,0x1E,0xE0,0xC8,0x51,0x5B, + + 0x38,0x84,0x8F,0x23,0x70,0xEC,0xD1,0x5B,0xA0,0x27,0x09,0x3D,0x9F,0xCB,0x24,0x7D, + + 0x81,0x13,0x7B,0xA3,0x91,0x36,0x94,0x46,0x8B,0xE9,0xEC,0xA0,0x99,0xA3,0x76,0xF0, + + 0x2D,0xB5,0x38,0xEB,0x92,0x84,0x26,0x32,0xA8,0xC6,0xDC,0x5B,0x77,0x73,0xBD,0x89, + + 0x49,0xF9,0xB6,0xA7,0x6D,0x3D,0x75,0xF7,0x8C,0x5D,0xA7,0x95,0xA4,0x30,0xD3,0x48, + + 0x92,0x77,0xDF,0xAA,0x9F,0x71,0x65,0x4E,0x96,0x11,0xCD,0x88,0x0E,0xAE,0x7A,0x80, + + 0xC2,0x95,0x12,0xB7,0x77,0x85,0xE0,0x82,0xDD,0x16,0x85,0x06,0xDE,0xD9,0x34,0x60, + + 0xD7,0x57,0x9F,0x27,0xBF,0x38,0x22,0x45,0xD6,0x86,0xF0,0xC2,0x3B,0xA6,0x15,0x32, + + 0x26,0xBB,0xBB,0xC3,0x5B,0x9E,0x17,0xA8,0x5F,0xA7,0x80,0x07,0xBA,0x85,0x89,0x14, + + 0xEB,0x1F,0xB3,0x7D,0x1F,0x3A,0x23,0x45,0x0A,0x9F,0xE9,0x1B,0x1A,0xF4,0x3C,0x6E, + + 0x3A,0x55,0x5D,0x56,0xE4,0x70,0xD6,0xE5,0xF7,0x1A,0xC5,0xAE,0x62,0xF5,0x41,0x7E, + + 0xAB,0x05,0x06,0xDC,0x35,0x92,0x9A,0xCA,0x82,0xC3,0xC2,0x9B,0x12,0x76,0xFF,0x81, + + 0x0D,0xB2,0xDD,0x89,0x37,0x9C,0x48,0x27,0xC8,0x5B,0xE8,0x92,0x8E,0x38,0x52,0xFB, + + 0x56,0x1D,0x07,0x99,0xD2,0xC8,0x7F,0xF3,0xD6,0xF6,0x1F,0xCE,0x8F,0xFE,0x78,0x88, + + 0xC8,0x95,0xB8,0x65,0xD9,0x37,0x41,0x1B,0xEE,0xF1,0xA9,0x14,0x7A,0xFD,0x30,0xDF, + + 0x8A,0xA2,0x96,0xC8,0x4C,0xC2,0x98,0xC9,0x11,0xF2,0x21,0x78,0x79,0x38,0x79,0x4D, + + 0xA8,0x71,0x43,0xBE,0x88,0xB1,0x59,0x51,0xEC,0x5C,0x28,0x12,0x0B,0xFD,0xFB,0xBB, + + 0x29,0xCA,0x10,0x22,0x3B,0x6F,0x0A,0x8A,0x99,0x8C,0x24,0x8E,0xBE,0x8E,0x2D,0x86, + + 0x5F,0x9C,0xFE,0xE4,0x10,0x25,0x36,0x50,0xC6,0x2C,0xF4,0x45,0x52,0xE2,0xDE,0x60, + + 0xA6,0xC3,0x96,0xF4,0x95,0x31,0x28,0x55,0x15,0xC2,0xC9,0xC7,0x23,0xC1,0xC9,0x9F, + + 0x06,0x8A,0x5E,0x85,0x28,0xA0,0x8C,0xC1,0x2D,0x18,0x9F,0x36,0xAA,0xE6,0x78,0x13, + + 0x4D,0xB8,0x93,0xEC,0x6A,0xE1,0x87,0x02,0x47,0x2F,0x87,0x8B,0x58,0x45,0x40,0xC8, + + 0x05,0xC4,0x54,0x24,0xFD,0x47,0xC3,0x93,0x07,0xC7,0x22,0xCE,0x9E,0x07,0x84,0xC1, + + 0x65,0x8D,0x3A,0xA4,0x34,0x65,0x94,0xE1,0x4E,0xCD,0x9E,0xDF,0xBE,0xB6,0xBE,0x42, + + 0x6F,0xAE,0x9B,0xA7,0x9A,0x0B,0xD6,0xDE,0x2F,0x35,0xA4,0x20,0x3F,0x95,0x6F,0x20, + + 0xE5,0x05,0x32,0xA8,0xE8,0x58,0xF9,0x10,0x52,0x6A,0x9F,0xDF,0xD4,0x27,0x6D,0x8E, + + 0x41,0x52,0xFE,0x29,0x1A,0xAA,0x8F,0x48,0xC1,0x4E,0x3A,0xEE,0x1D,0x45,0x55,0xE5, + + 0x0B,0x50,0xD2,0x39,0xE0,0xA6,0x2B,0xFC,0x17,0x85,0x7A,0x28,0x5B,0x6B,0x73,0x96, + + 0xC8,0x07,0x17,0x8D,0x20,0xA8,0x35,0x6B,0x9E,0x86,0xE5,0xCF,0x8E,0xA8,0xA8,0x5D, + + 0xDB,0x8D,0xCB,0x30,0x9F,0xA6,0x3A,0xD3,0x95,0x40,0xEE,0xC3,0xDD,0x40,0x1C,0x0B, + + 0xE7,0x5F,0xC2,0x43,0x18,0x2E,0x24,0x8A,0x11,0x8E,0xD4,0xC2,0x6C,0x48,0x14,0x1A, + + 0x09,0xEF,0x15,0x2D,0x79,0x7E,0x61,0x8B,0x3D,0xCD,0x5A,0x6D,0x16,0x89,0x33,0x29, + + 0xF4,0x03,0xEE,0x3C,0xF0,0x5F,0xB3,0x7D,0xC8,0x85,0x26,0xC6,0x16,0x26,0x96,0xAA, + + 0x2C,0xCF,0x10,0x41,0xF9,0x5B,0xBB,0xFA,0x3A,0x90,0x3B,0xFB,0xD4,0x42,0x0D,0xA0, + + 0x85,0xFC,0xA0,0xF5,0x4A,0xDC,0xF9,0x40,0x57,0xF4,0xA6,0xBA,0x72,0xF2,0xF3,0x6D, + + 0x46,0x6E,0x92,0x27,0x16,0xE3,0x3E,0x50,0x61,0xEA,0x2B,0x49,0x84,0x22,0xC2,0x43, + + 0xA8,0x39,0xC3,0xC3,0xB7,0x9A,0x8D,0xC3,0xE8,0xDF,0x48,0x23,0xF6,0xF1,0x4D,0xC5, + + 0x5D,0x9C,0xCD,0xC0,0x5A,0xBE,0x9C,0xAC,0xCB,0x67,0x46,0x33,0xF7,0x9C,0x34,0x99, + + 0x85,0xF1,0xDA,0x6F,0x5E,0x07,0x0A,0x4A,0x60,0x96,0x8A,0xE0,0x9F,0x5C,0xDF,0x23, + + 0x62,0x96,0xBF,0x28,0xE3,0xA6,0x44,0xC3,0x1D,0x7A,0x03,0x85,0x59,0x44,0x5A,0x21, + + 0xCD,0x3E,0x1A,0xB4,0x84,0x15,0xF8,0x81,0x11,0xB3,0x26,0x63,0xF4,0x14,0x33,0x96, + + 0x57,0x3C,0x4A,0x7E,0xB1,0xF5,0xA8,0x80,0x95,0x04,0x82,0x85,0xD9,0x68,0x92,0x68, + + 0xAE,0x54,0x66,0x6A,0x4D,0x63,0x64,0xA5,0x06,0x55,0x76,0x2E,0xB5,0x58,0x10,0x43, + + 0x0E,0xF9,0xBC,0x00,0x3B,0x9B,0x58,0x0B,0x92,0x54,0x6D,0xBF,0x94,0x2A,0x90,0x69, + + 0x00,0x95,0xA7,0x0B,0xFE,0xF2,0x49,0xEB,0x61,0x57,0x64,0xAD,0x16,0x51,0x71,0x42, + + 0xA5,0x16,0x11,0x1B,0xBF,0xB8,0x5D,0xBB,0x1A,0x99,0x13,0x2C,0xD3,0xF3,0x6C,0xE8, + + 0xAE,0x9F,0x6B,0xAC,0xD5,0xEF,0x08,0x46,0xE3,0x71,0x36,0x7A,0x7E,0xBD,0xAA,0x35, + + 0x29,0xBF,0x94,0x3E,0x33,0x10,0x2F,0x69,0x09,0xD7,0x72,0x5A,0x7D,0x02,0x5D,0x38, + + 0xAF,0xDC,0x53,0xAD,0x55,0xCD,0x22,0x78,0x80,0x73,0xF7,0x65,0x99,0x57,0x80,0x5F, + + 0xA1,0xF5,0x3E,0x2D,0x9C,0x7F,0xFD,0xE8,0x89,0xCC,0x7C,0xFF,0x98,0x36,0x1E,0x50, + + 0x26,0xF0,0x30,0x7C,0x24,0xF0,0x10,0xF4,0x73,0x10,0x2F,0xDB,0xAF,0xDC,0x69,0x79, + + 0x85,0x43,0xFB,0x7F,0x11,0x71,0x18,0x04,0x2C,0xAA,0x5E,0x34,0x15,0x70,0xFA,0x7F, + + 0x80,0x14,0x81,0x08,0xA2,0x5B,0x92,0xD5,0xA1,0x42,0xE4,0xD5,0x87,0x53,0x99,0x35, + + 0x89,0x23,0xC8,0x21,0xCE,0x28,0x9F,0x25,0x3E,0xBC,0x17,0x2F,0x69,0x1D,0x4F,0xF9, + + 0x69,0x03,0x7E,0xC0,0x65,0x3B,0x50,0xD0,0x19,0xFF,0xCC,0xAE,0x7B,0xFB,0x4C,0xDC, + + 0x38,0xFB,0x08,0x88,0x50,0x8A,0xE3,0x2B,0xE5,0x63,0xFC,0xE7,0xDB,0x82,0xBE,0x86, + + 0x10,0x85,0x62,0xFD,0x4E,0x95,0xB6,0x26,0x67,0xB9,0xF5,0xE9,0x5A,0x8F,0x7D,0x1D, + + 0x99,0x3D,0x18,0x72,0x32,0x88,0xC6,0xB5,0xAD,0x47,0x19,0xA9,0x41,0xCA,0xFD,0xF6, + + 0x9F,0x1E,0xDF,0x0A,0x88,0x4E,0x6C,0x5C,0x0F,0xB8,0xEA,0xC3,0xE5,0xB6,0x0E,0x05, + + 0xF0,0x1E,0x75,0x11,0x15,0x09,0x65,0x12,0x0E,0xC3,0x84,0x70,0x6B,0x88,0xD9,0x78, + + 0xAA,0xFA,0x30,0xCE,0x7D,0x35,0xEC,0x34,0x37,0xB5,0xFB,0x83,0x70,0x1E,0xD1,0xC9, + + 0xAF,0xFB,0xCA,0xB8,0xB4,0xA0,0x15,0xD1,0xDD,0xB4,0xDE,0x24,0x91,0x6B,0xFA,0x8F, + + 0xD0,0x06,0x17,0x3F,0x73,0x53,0x29,0x9E,0xFB,0x32,0xC8,0xFC,0xA1,0xC1,0xA3,0x53, + + 0x6D,0x7F,0x7D,0xE5,0xE0,0xB6,0x42,0x34,0x21,0x1C,0x9C,0x0F,0x3A,0xEC,0x87,0x1D, + + 0xB5,0x62,0x1A,0x4D,0x6E,0xBD,0x24,0xF2,0x1E,0xF7,0x86,0x2A,0x00,0x64,0x03,0xDB, + + 0x18,0x28,0xCB,0xD9,0xDD,0x85,0x99,0x65,0xCB,0xA2,0x20,0x86,0x32,0x5C,0x6F,0x27, + + 0x06,0x8E,0x7B,0xE3,0xD6,0xC9,0xBF,0x5F,0x60,0xAF,0x85,0xB1,0x70,0x01,0xA1,0x32, + + 0x27,0x8F,0xB9,0xE6,0xD4,0x1D,0xBE,0xC1,0x47,0xA1,0xF6,0x3E,0x3E,0xE0,0x80,0x9C, + + 0xA6,0x33,0x09,0x85,0x8C,0x29,0x33,0x53,0x94,0x6E,0x5C,0x96,0x5B,0x8D,0x7E,0x9C, + + 0xAD,0x90,0x50,0xD8,0xBF,0x01,0x81,0xD4,0xCC,0xFA,0x9D,0xB5,0xB3,0x62,0x39,0xBE, + + 0x97,0xD9,0x0F,0x13,0x49,0x24,0xAA,0x3E,0x80,0xC0,0xEA,0x95,0x12,0xAB,0xEA,0x77, + + 0xBE,0x08,0x98,0xCB,0x15,0x98,0x96,0x58,0x75,0x75,0x3B,0xB4,0x77,0x51,0x7B,0x4C, + + 0xF0,0x4F,0x05,0x51,0xF9,0xE2,0x0B,0x67,0x40,0xDD,0x2A,0x96,0xC0,0x1A,0xB4,0xB2, + + 0x2E,0xF3,0x9D,0xEB,0xCF,0x2C,0x5D,0xE0,0xFF,0x55,0xE3,0x71,0xA4,0x8B,0x8B,0xD3, + + 0x4A,0x80,0x53,0x61,0x90,0x86,0x08,0xD9,0x07,0xB3,0x9E,0x71,0x5B,0x43,0x9E,0xA2, + + 0x7D,0x9A,0x1F,0x30,0x70,0x83,0x01,0xC1,0x10,0x32,0xF2,0xCA,0xCA,0x86,0xEF,0x2C, + + 0xA4,0x7A,0x78,0x94,0xEE,0xBB,0xC9,0x5C,0x91,0xE3,0x37,0x2B,0x1C,0x76,0x84,0xFB, + + 0x85,0x8B,0xEA,0xB2,0x5F,0x87,0xC3,0x55,0x8C,0x92,0x9F,0xB9,0xA1,0xBA,0xDC,0x9D, + + 0x34,0x1C,0x46,0x92,0x9E,0xD1,0x10,0x65,0x4A,0x9D,0x80,0x54,0x91,0xAF,0x5C,0x79, + + 0x32,0xF7,0xB7,0x2F,0x59,0xE9,0x53,0x39,0x7C,0xD4,0xE0,0x8D,0x1B,0x5D,0x47,0xDC, + + 0xF6,0x2C,0x03,0x93,0xB4,0x20,0x40,0x4C,0xDC,0x76,0xF3,0x9E,0xB2,0xDD,0x97,0xC7, + + 0x43,0xE8,0x1B,0xAF,0x50,0x9C,0x5F,0xF4,0xBB,0x8F,0x20,0x8F,0xFD,0xA5,0x62,0x03, + + 0xFB,0xDF,0xFE,0xEB,0xD4,0x96,0xCF,0xD9,0xF4,0x0A,0xF4,0x12,0x1F,0xAB,0x28,0x0F, + + 0x01,0xE2,0x28,0x0F,0x71,0xF9,0xC7,0xCD,0xF2,0xD4,0xC2,0xF0,0xB5,0x95,0x40,0xF7, + + 0x8B,0xA3,0x08,0xF5,0x6F,0x1D,0x7B,0x72,0xC9,0xA2,0xC1,0x45,0x21,0x1D,0xFD,0x49, + + 0x00,0xE0,0x31,0xF3,0xA2,0x47,0x73,0x63,0x8C,0x49,0xF7,0x8E,0x9F,0x1C,0x7A,0xCA, + + 0x18,0xBE,0x47,0xEF,0xE2,0x37,0xD8,0x49,0x25,0x2E,0x5C,0xFD,0x57,0xA4,0x68,0x4E, + + 0x6B,0x5D,0xC7,0xAE,0x17,0xE7,0x60,0x96,0xA7,0x89,0x6F,0x85,0x29,0x38,0x07,0x09, + + 0x79,0x06,0x56,0xFE,0x4F,0xDB,0x63,0xE7,0xC0,0x67,0xD5,0x14,0x3F,0x55,0x31,0xAE, + + 0x13,0xF1,0x2B,0x86,0x4F,0xB4,0x46,0x8C,0xC7,0x65,0xD9,0x53,0x9F,0x44,0x71,0x50, + + 0x5C,0x78,0x46,0xA1,0xB1,0x75,0xB0,0xD5,0xA0,0xE2,0xCE,0x49,0x91,0xBF,0xFE,0x26, + + 0xDE,0x19,0x9A,0xD7,0x37,0x5B,0xC5,0x3A,0xB2,0x94,0x70,0x66,0x7B,0xE8,0xF7,0xAF, + + 0x75,0x06,0xD9,0xE1,0x63,0xC4,0xA7,0x7F,0xFB,0x16,0x85,0xB5,0x10,0xB1,0xAB,0xCB, + + 0x80,0xA8,0x7C,0x76,0x67,0x76,0x65,0x6B,0xA4,0x90,0x3D,0x3F,0x57,0xD1,0x11,0x2C, + + 0xE5,0x73,0xBD,0x5B,0x18,0x76,0xA2,0x23,0x11,0xA5,0xCC,0x1F,0x3E,0x13,0x6B,0x5A, + + 0x37,0x15,0xA4,0x40,0x63,0x59,0x0E,0x21,0xA2,0xA2,0x3A,0xA2,0xC3,0xAF,0x9A,0xB9, + + 0xDC,0x7E,0x0D,0x56,0x98,0x6C,0xE9,0x06,0xBD,0x68,0x0C,0x1D,0xBC,0x11,0x49,0x61, + + 0x2E,0x70,0xBB,0xA6,0xD7,0xED,0x84,0xED,0x33,0x73,0x30,0x29,0xDC,0x2D,0xA0,0xA7, + + 0x56,0x0C,0x49,0xF0,0x8F,0x4F,0xAE,0xD6,0x01,0xD8,0xBD,0x7E,0xB8,0x97,0xA8,0x82, + + 0xD7,0x2D,0xDF,0xF4,0xC6,0x4E,0x18,0xB5,0xA5,0x28,0x44,0xD8,0xF6,0x28,0xE1,0x3B, + + 0x71,0xF1,0x61,0x3E,0xD1,0xD4,0xEF,0x1F,0xB3,0x96,0xDF,0xD5,0x4B,0x2D,0xE9,0x2B, + + 0x74,0x9E,0xD3,0xC8,0x4D,0xD7,0x17,0x89,0x86,0x9B,0x72,0x63,0x87,0x73,0x09,0xBD, + + 0xD9,0x08,0xDA,0x77,0xBB,0x32,0xF3,0x63,0x24,0x16,0x55,0x95,0x4C,0xFD,0xFC,0xD2, + + 0x4F,0x1D,0x13,0x25,0x41,0x1A,0xAB,0x2F,0x99,0x2A,0xB4,0xF2,0xFF,0x58,0x53,0xCD, + + 0xDF,0xBC,0xE4,0x07,0x38,0x3D,0xB4,0x7E,0x8E,0x27,0xB3,0x20,0x34,0xD6,0x77,0xD1, + + 0x79,0xBB,0x3A,0xA4,0xDD,0x30,0x7D,0xF3,0xE7,0xD7,0xC3,0x4E,0x3D,0x5E,0xB2,0x8F, + + 0x6C,0x04,0x29,0xAB,0x3C,0xE8,0x26,0x3E,0x60,0x58,0xB2,0x2F,0x0A,0x31,0xFA,0xBF, + + 0x7D,0x39,0x31,0x95,0xD9,0x1E,0xCD,0x68,0x92,0x51,0xC6,0x65,0x67,0x3F,0x0C,0x2E, + + 0xDE,0x06,0x60,0xA2,0x8A,0x02,0xF1,0x83,0xA3,0xCE,0x53,0xF1,0x17,0x05,0x89,0x6F, + + 0xA0,0x99,0x87,0xC5,0x7A,0x36,0xDD,0x6D,0x12,0xC7,0x90,0x48,0x68,0x6F,0x5E,0x35, + + 0xD1,0x83,0xE7,0xCE,0x3F,0xFC,0x89,0x15,0x91,0x23,0x88,0x53,0x97,0x6F,0x99,0x44, + + 0xBB,0x54,0xB5,0xEF,0x9E,0xD6,0x7E,0xFA,0x5C,0x0B,0xDA,0x8D,0x37,0x5E,0x9D,0xA0, + + 0x47,0xB0,0xC3,0xBC,0x3C,0xDF,0x88,0x14,0xEE,0xDE,0x95,0xEF,0x15,0x2D,0xA3,0xE3, + + 0xF1,0xAF,0xF3,0xC5,0x96,0xB8,0xC5,0x1B,0xEB,0xFA,0xC1,0x8E,0x9F,0x00,0xFF,0x72, + + 0x62,0xFF,0xBE,0xB1,0xB7,0x05,0xD0,0xA4,0x17,0xA5,0xB0,0xAE,0x51,0x9A,0x36,0xB8, + + 0x20,0x91,0xEE,0xA4,0xF8,0x42,0x06,0xC3,0x48,0xEC,0xE3,0x4B,0x5F,0xDE,0xFA,0x85, + + 0xD7,0x94,0xF2,0xC2,0x79,0xC1,0xBD,0x52,0xBA,0xE4,0x2A,0x03,0x3D,0x00,0xE5,0x83, + + 0x89,0x09,0x49,0xC9,0xF2,0x29,0x4A,0xA3,0xC1,0xEC,0xA7,0x0C,0x75,0x8E,0x20,0x0B, + + 0xB2,0x09,0x27,0x04,0x10,0xAF,0x57,0x7E,0x74,0xEB,0x10,0xE1,0x43,0x6C,0x9B,0xA3, + + 0x7D,0xD1,0x62,0x2A,0xD6,0xAE,0x0F,0x02,0xA8,0x56,0x18,0xE4,0x97,0x6D,0xBA,0x66, + + 0x23,0xD2,0x49,0x74,0xA8,0x39,0x84,0x7F,0xB0,0xE9,0xD0,0xE7,0x10,0xF7,0x41,0xA2, + + 0x8A,0x8C,0x41,0x64,0xA1,0x38,0x67,0xD9,0x4C,0xE1,0x91,0xF7,0x11,0xF6,0x82,0x0B, + + 0xE1,0x4A,0x02,0x2F,0xB5,0x85,0x1A,0x0B,0x3A,0xE8,0x56,0xD2,0xB1,0xB9,0x0C,0xA9, + + 0xE0,0xF8,0xB4,0xA0,0xFA,0x20,0x41,0x38,0x21,0x44,0x21,0x84,0xB2,0xAA,0xC8,0x3E, + + 0x00,0xA7,0x54,0xFF,0xBB,0x4A,0x45,0x5A,0xA1,0xF5,0x57,0x14,0x33,0x89,0xBB,0x6E, + + 0x87,0xA4,0xCC,0x6E,0xE7,0x8A,0xE4,0x43,0xCF,0x91,0x77,0x4E,0xB7,0xCD,0xBD,0xBB, + + 0x3C,0xA3,0x68,0x33,0xDF,0x8C,0x07,0xA8,0x41,0xE1,0x12,0xFC,0x76,0x64,0x34,0xF1, + + 0xE0,0x1E,0x9B,0x2F,0x29,0xAA,0x9A,0xF8,0x05,0xB2,0xE2,0x86,0xF7,0x60,0x96,0x3A, + + 0xB1,0x8C,0x96,0x4F,0x15,0x8E,0x02,0xED,0xC8,0x24,0xD0,0xEF,0x18,0x6D,0x75,0xB0, + + 0x06,0x6D,0xC9,0x16,0x9D,0x4D,0xF7,0xEA,0xF5,0x92,0x3C,0x07,0x0D,0x67,0xC4,0x5C, + + 0xB2,0xBD,0x9E,0x85,0x13,0x70,0x47,0x53,0x12,0xFD,0x96,0x46,0x76,0xAA,0x16,0x00, + + 0xDA,0xBC,0x9A,0xF6,0xCE,0x9C,0xA0,0xC3,0x5B,0x5A,0x2B,0x0D,0x85,0xE2,0x54,0xE1, + + 0xF6,0xBF,0xB1,0xE2,0x59,0xC1,0x44,0x41,0xE4,0x77,0xCA,0x21,0x98,0x6F,0x58,0xD6, + + 0x7B,0x19,0x5E,0x11,0xE6,0x49,0x9D,0x92,0x4C,0x11,0x5D,0x4C,0x0D,0x77,0xB1,0xBE, + + 0xA3,0x19,0xBC,0xD4,0xDB,0x27,0xAB,0xA7,0xA8,0xA7,0xB4,0x76,0x54,0x79,0x1D,0x54, + + 0x21,0xC5,0x8C,0xD4,0xCC,0x9E,0xDA,0xEE,0x15,0xA1,0xE7,0x6A,0x72,0x57,0xFA,0x83, + + 0x03,0xBB,0xF7,0xF5,0xD2,0x74,0xEE,0x72,0x94,0x5C,0xAE,0xC2,0x53,0x80,0x8D,0x55, + + 0xDE,0x55,0xB5,0xC5,0x5A,0x24,0x8A,0xE2,0xD1,0xDF,0x1D,0x70,0xEC,0x71,0x44,0x0C, + + 0x7F,0xE4,0xF8,0xB5,0x94,0x35,0xDD,0xF7,0x02,0xCB,0x56,0x6B,0x91,0x9B,0xA2,0xEB, + + 0x53,0xEF,0x98,0xFE,0xC6,0x94,0x20,0x01,0x01,0xF0,0x5E,0x60,0x1A,0x71,0x51,0x31, + + 0x43,0xC9,0xF9,0xB1,0x51,0x12,0x69,0x15,0x9F,0x5A,0xF1,0x1D,0x11,0x19,0x71,0xD8, + + 0x40,0x88,0x87,0x19,0xEE,0x41,0x61,0xF8,0x1C,0xF8,0x1D,0x39,0xAE,0xC0,0x9B,0x67, + + 0x2C,0x7E,0xF4,0xFC,0x5E,0x7E,0xBA,0x97,0xA0,0x74,0xB4,0x4C,0x7C,0x3E,0x26,0xBA, + + 0xDC,0x5F,0xF0,0x74,0xD9,0xBD,0xD8,0xE6,0x6A,0xA9,0x71,0x1E,0xD7,0x80,0xA8,0x0B, + + 0x0B,0xE1,0x87,0x72,0xF2,0x2D,0xEC,0x7A,0xEB,0x56,0x33,0x6F,0x38,0x3D,0x50,0xA0, + + 0x7F,0x8C,0xA1,0xAE,0xD5,0x34,0x53,0xEA,0xD9,0xF7,0xA7,0x79,0xF5,0x05,0xF4,0x71, + + 0x26,0xE2,0x98,0xF9,0xFD,0x73,0x91,0x51,0x7E,0xC9,0x60,0x55,0x7E,0xA2,0x9B,0x2F, + + 0x36,0xE1,0x1C,0x74,0x98,0x07,0x70,0x3F,0x43,0x1B,0x78,0xEA,0x16,0xA3,0x5F,0xB3, + + 0x6D,0x81,0x61,0xDB,0x8B,0x7D,0x71,0xA7,0x93,0x0E,0x7A,0xD7,0xD5,0x91,0x82,0x35, + + 0x68,0xE1,0x7F,0x64,0xF3,0x2A,0x8F,0x40,0xBF,0x72,0x72,0x5E,0xD4,0xC2,0x9F,0x31, + + 0x34,0xEA,0x2D,0xC4,0xD4,0xA5,0x16,0xCE,0x45,0x24,0xA3,0xE4,0x94,0xA5,0xBE,0x22, + + 0x0F,0x8E,0x8A,0x72,0xCA,0xAA,0x5E,0xDA,0x42,0xAB,0x98,0xE4,0x71,0xA7,0x86,0x03, + + 0xC9,0x2B,0x21,0xC3,0x18,0xA0,0xD2,0xCF,0x1A,0xB5,0xC9,0x99,0x7A,0xEB,0x25,0x20, + + 0xB5,0xC5,0x5D,0x28,0x34,0x2A,0xC6,0xE0,0xBD,0x1A,0x3D,0x3F,0xD6,0xF7,0x89,0x8F, + + 0x9F,0x97,0x82,0xE4,0xE9,0x21,0x4C,0x6B,0xBD,0xCC,0x72,0xF2,0xBE,0xE2,0xCD,0xE9, + + 0x2F,0x24,0x9E,0x79,0xB5,0x17,0xC1,0x0B,0x37,0x66,0xBB,0x4D,0x33,0xA6,0xDC,0x4C, + + 0x65,0x89,0x83,0x85,0x9D,0xEA,0xA2,0x3A,0xA6,0x41,0x35,0x5C,0xBA,0xA5,0xBC,0x85, + + 0x66,0x7A,0x6B,0xC3,0xE6,0xA6,0x6C,0xCB,0x32,0x68,0xDB,0x68,0x2C,0xE6,0x22,0x8F, + + 0x08,0x8E,0x9C,0xE6,0x7D,0xE4,0x14,0xD2,0x4F,0x2C,0x92,0xFC,0x2A,0xAE,0x5B,0x38, + + 0xFC,0xE8,0x2A,0xDE,0x10,0xEF,0x5C,0xD2,0x42,0x60,0x9A,0xEC,0x2B,0xAF,0xA5,0xB4, + + 0x0C,0x92,0xF5,0xE7,0x2D,0x63,0xD0,0xD3,0x12,0x7D,0xB1,0x79,0xDF,0x4F,0x53,0xA0, + + 0x89,0xF4,0xAB,0xCA,0x60,0x04,0x2A,0xFF,0xCD,0x1F,0xB9,0x5A,0xDE,0x7F,0xC7,0x71, + + 0x25,0xB5,0x5F,0xA1,0x95,0x4F,0x67,0x51,0x65,0xF5,0x74,0x97,0xC5,0x50,0xAC,0xA3, + + 0x5F,0x3E,0x3F,0xE5,0x4D,0x38,0x04,0xC2,0x6D,0xDA,0xE6,0xB7,0xD6,0x04,0x76,0x92, + + 0xCE,0x19,0x49,0xF4,0x8A,0x14,0x66,0x27,0xB3,0x69,0xE3,0xC6,0xD5,0xB3,0x7A,0xE1, + + 0xCF,0x00,0x8D,0x7D,0x5C,0xE0,0xBD,0x90,0x48,0x91,0xEA,0x89,0x87,0xB1,0xC3,0x7B, + + 0xA9,0x39,0xA2,0x42,0x34,0xE1,0x72,0x4A,0xE6,0xC1,0x94,0x74,0x14,0x08,0x3F,0x41, + + 0x11,0x9F,0x8E,0x66,0xEA,0xBA,0x2D,0x5B,0x8E,0xE6,0x9C,0xBD,0xC7,0xF8,0x32,0x50, + + 0x98,0x3B,0x25,0x57,0xB9,0xB0,0x4F,0x10,0xD4,0x72,0x8D,0xC0,0x0B,0xF9,0x6C,0xC0, + + 0xD5,0xC4,0x59,0xA8,0x14,0xF5,0xD1,0x61,0xA7,0xDD,0x02,0xD0,0x56,0xF1,0x58,0x32, + + 0x2A,0x42,0xBC,0x8C,0xAE,0xB0,0xFD,0x7A,0x6A,0x02,0xEA,0xD8,0x58,0x0C,0x34,0x0A, + + 0xD2,0x34,0x49,0xE0,0x5C,0xBD,0xF5,0x08,0x6E,0x39,0xBE,0x52,0x59,0xC2,0x8D,0x4B, + + 0xFE,0x37,0x3C,0x48,0x55,0xC9,0x2A,0xEB,0xB8,0x98,0x61,0x47,0xF9,0x61,0x7A,0xDC, + + 0x73,0x91,0xD6,0xEC,0x8B,0x32,0x01,0x0F,0x4A,0xCB,0x84,0x3B,0xF3,0xCB,0x40,0x73, + + 0x10,0x98,0xA6,0x73,0xD5,0xD8,0xE4,0x1A,0x6B,0x7D,0x94,0x5A,0xA3,0xF3,0x4E,0xCA, + + 0x65,0x8E,0xFE,0xBC,0xC8,0xD8,0x24,0xBE,0x07,0xCE,0x41,0xCE,0x33,0xE6,0x61,0xD8, + + 0x9C,0xAD,0xDB,0xA0,0x3C,0x38,0x22,0x01,0x0B,0x21,0x43,0x90,0x5D,0xBF,0x4F,0x45, + + 0xA9,0xDD,0xD7,0x5D,0x7D,0xBC,0x06,0x8D,0x18,0xB1,0x52,0x19,0xDB,0xFF,0x3A,0xF3, + + 0x30,0xFF,0x9A,0x06,0xA3,0xBD,0xAB,0xE7,0x9A,0x48,0xD5,0x5C,0xB9,0x90,0x76,0x39, + + 0x32,0x84,0x0A,0x4A,0xE0,0xFD,0x02,0x31,0x60,0x71,0x9E,0xB0,0x2D,0x5C,0x3F,0x6D, + + 0x0D,0x60,0x9B,0x07,0x02,0x2A,0x50,0xC9,0x02,0x8F,0x7D,0xB6,0xE0,0x6A,0xB1,0x71, + + 0xC9,0xA8,0x26,0x6E,0x4C,0x38,0xC3,0x35,0xD3,0xEE,0xB9,0x30,0x30,0xCC,0xC4,0xB1, + + 0x5E,0x47,0xC0,0x84,0x1E,0xDF,0xBC,0x1F,0x88,0x75,0xB2,0xF8,0x53,0xA4,0x8A,0x54, + + 0x0A,0xAA,0x64,0xC6,0x01,0x2F,0x39,0x30,0x1F,0x5E,0x44,0x7C,0x55,0x47,0x11,0xC4, + + 0xCA,0x07,0x7E,0x61,0x7B,0x25,0x0B,0x63,0x71,0x9F,0x11,0xE0,0x41,0xE1,0x77,0x4C, + + 0x0C,0xA1,0x42,0x27,0x78,0x04,0x92,0x17,0x3C,0x57,0x99,0x85,0xD0,0x68,0x13,0x09, + + 0x77,0x48,0x2A,0x88,0x6C,0xA5,0x03,0x1C,0xAF,0x4C,0x15,0x5F,0x04,0x63,0x78,0x19, + + 0x0B,0x84,0x8B,0x63,0xBE,0x2A,0xE0,0xB0,0xAE,0x4D,0xD9,0x50,0x5F,0x98,0x63,0x43, + + 0xBB,0x07,0xCB,0x89,0x6D,0x65,0x56,0x5B,0xFB,0xCC,0x13,0xEB,0x8A,0x69,0x52,0x9E, + + 0x6E,0xA0,0x4F,0x11,0x9F,0xF8,0x5F,0xD1,0x47,0x86,0xC6,0xD5,0x27,0x26,0x53,0x08, + + 0x42,0x4E,0xFC,0xEC,0xED,0x87,0xEA,0x80,0xB4,0xB0,0xF2,0xFC,0xB3,0x57,0x70,0xAB, + + 0x57,0x4F,0x57,0xD8,0x15,0x51,0x7A,0x4C,0x4D,0xBC,0x6B,0x1E,0x19,0xD2,0xD4,0x22, + + 0x0A,0x6E,0xBB,0x44,0x9C,0x0C,0xAB,0x61,0x37,0x01,0x91,0x92,0x58,0xA2,0xDC,0xEC, + + 0x04,0xA9,0xE1,0xD9,0xD9,0xB4,0x0B,0x3E,0x15,0xB0,0xE1,0x92,0xDD,0xFD,0x72,0xE6, + + 0x30,0x13,0x40,0x89,0x36,0xE3,0x05,0x94,0x87,0xFD,0xC7,0xA6,0x58,0x1C,0x8C,0x56, + + 0x6F,0x5F,0x21,0x64,0x71,0x7E,0xE6,0x58,0xEF,0x9C,0xA6,0x26,0x71,0xEE,0xBB,0x01, + + 0x82,0x00,0x60,0x45,0xF4,0x29,0xD8,0xC1,0xE4,0xDF,0xAF,0x36,0xC8,0xCD,0x4C,0x79, + + 0x4B,0x98,0x1D,0xB5,0xBF,0x73,0xF1,0x23,0xF1,0x5B,0x31,0xCA,0x2B,0xEE,0xAC,0x58, + + 0x02,0x86,0x9A,0x26,0x2A,0xB1,0x0A,0xFD,0x76,0xF9,0xB6,0x6C,0x71,0x34,0x81,0x30, + + 0x7A,0x0E,0xF6,0x64,0x6D,0x9A,0xF1,0x00,0x67,0x1A,0x30,0x66,0x25,0x7D,0xC5,0x80, + + 0x7B,0xBB,0xD7,0x3F,0x59,0x72,0xD2,0x01,0xA6,0x4D,0xF1,0xFA,0x1B,0x75,0x42,0xB7, + + 0x80,0x0F,0x69,0xA7,0x3D,0xBD,0xCD,0xB6,0xD0,0xAD,0x5D,0xF6,0x2F,0xDA,0x02,0x6E, + + 0x38,0x93,0x8A,0x9C,0x1A,0xFA,0x90,0xDA,0x8F,0x43,0x8C,0xAE,0xCB,0xA5,0x40,0x70, + + 0x30,0x54,0xED,0xEA,0x3F,0xC8,0x0E,0x2C,0x2D,0x58,0x19,0xFB,0x4A,0x75,0x14,0x6F, + + 0x88,0x48,0x07,0xCC,0xF8,0x21,0xBA,0xB9,0x4F,0x1B,0x8D,0xAF,0x6A,0x70,0xF4,0x68, + + 0x0A,0xBB,0x5D,0xDA,0x67,0x79,0xDA,0xBC,0xC9,0x39,0x27,0x2E,0xC1,0x34,0x1F,0x52, + + 0xCF,0xE3,0x41,0x4E,0x90,0xE6,0xEE,0x7B,0x5F,0xD7,0x86,0xAB,0xB8,0x6E,0x6E,0x32, + + 0x5A,0x0B,0x94,0x5C,0x98,0x3C,0x16,0x6D,0x6D,0x8C,0x80,0x1E,0x63,0xF8,0xEB,0xB2, + + 0x74,0x95,0xBF,0x4F,0x7F,0x6B,0x77,0x6D,0x9E,0x03,0xE9,0x4D,0xF9,0x1C,0x47,0xDD, + + 0x2B,0x16,0xDA,0xC4,0xBD,0x5D,0x32,0x39,0xED,0x44,0xCD,0x0F,0x10,0x3B,0xA7,0xA6, + + 0x37,0x46,0x45,0xC6,0x5C,0xE2,0xCB,0xE5,0x9A,0xC8,0xCB,0x2E,0xF1,0x5F,0xF7,0x84, + + 0xA6,0x82,0xF1,0x98,0x72,0xE1,0x18,0x22,0xA4,0xDA,0x03,0xAC,0xA2,0x54,0xDB,0xF2, + + 0xB4,0x44,0x36,0xCD,0x14,0x50,0x37,0x5D,0x1A,0x0D,0x1D,0x58,0x0E,0x1D,0x68,0x16, + + 0xA7,0x21,0x89,0x8A,0x93,0x52,0xDD,0xC5,0xF6,0xA5,0xAC,0xCF,0xD5,0x8D,0xF9,0xC6, + + 0x7A,0x13,0xF2,0x86,0x10,0x26,0x4B,0xFC,0xB1,0xA8,0xCF,0xE2,0x5C,0xE6,0x05,0x92, + + 0x0D,0x28,0x53,0xD2,0x1D,0xDC,0x42,0xE0,0x47,0x9A,0xB8,0x14,0xA8,0xE3,0x29,0x52, + + 0x80,0x57,0xA0,0xB6,0x35,0x96,0x4B,0xF0,0xF3,0xB9,0x4E,0x85,0xD0,0xC4,0xEE,0x33, + + 0xDF,0xE9,0x29,0xD2,0x0A,0xE5,0xD5,0x0C,0x59,0x9A,0x53,0x5C,0x76,0x38,0xA1,0x79, + + 0x3C,0x37,0xCB,0xE6,0x8A,0x05,0x88,0xED,0x8E,0x98,0x0D,0xB5,0x3F,0xEC,0x4D,0xFC, + + 0x1F,0xC4,0x46,0x8C,0x15,0xA1,0x00,0xCC,0x6F,0x9B,0x3B,0xD6,0xDC,0xA4,0x8F,0xE3, + + 0x6A,0xC7,0xB2,0x3B,0x7B,0x67,0x3B,0x3B,0x4B,0x98,0xCA,0x53,0x4E,0xE2,0x49,0x1B, + + 0x2A,0x90,0xEB,0x6D,0x7A,0xA8,0xFE,0xD3,0x43,0x66,0xAC,0xD9,0xCF,0xA6,0x04,0x62, + + 0x0F,0x2C,0xA0,0xB6,0x7E,0x86,0x68,0x68,0xFD,0x11,0x4D,0x29,0x88,0xE6,0xEE,0x28, + + 0xE4,0x7D,0xBE,0x2D,0x35,0x2A,0xFB,0x92,0xB1,0x50,0xAA,0xB9,0x9D,0xCF,0xA3,0x76, + + 0x37,0x8A,0x23,0xDF,0x8C,0x0E,0x69,0x69,0x5C,0xC4,0x73,0x6C,0x09,0x43,0x55,0x46, + + 0xAC,0xCF,0xEA,0x99,0x76,0xAC,0x83,0x73,0x36,0x80,0xF3,0xFE,0x36,0xEC,0x16,0xB2, + + 0x6C,0x2F,0x33,0x3C,0x35,0xF0,0x2F,0x26,0x05,0x66,0xF5,0xC0,0xB6,0xF0,0xC0,0x09, + + 0x24,0x01,0x16,0x13,0x3B,0x3B,0x65,0x7F,0xC0,0x0E,0x82,0xAB,0x56,0xE3,0x7C,0xDF, + + 0x01,0x0D,0xB1,0xF9,0x87,0x84,0x0B,0x6E,0xC7,0x1A,0x4D,0x56,0xA8,0xA2,0x74,0x01, + + 0x40,0xFD,0x7A,0x68,0x0A,0xDD,0x3C,0xD5,0x1A,0x0E,0xB1,0xE0,0xF3,0x02,0xA4,0xFF, + + 0x04,0xF8,0x8D,0x74,0x4B,0x54,0x96,0x91,0x56,0x15,0xCE,0x56,0x28,0x5B,0x97,0x15, + + 0xDA,0x33,0x94,0xD4,0x09,0xB6,0x7A,0xB2,0x73,0xCE,0x2C,0xF4,0x37,0x74,0x82,0x3C, + + 0x57,0x40,0x25,0x46,0xB4,0x3B,0x8F,0x95,0x6B,0x50,0x51,0x95,0x78,0x59,0xF4,0x23, + + 0x27,0x88,0xF8,0xDF,0xB1,0xD5,0xD0,0x03,0xEB,0x98,0x83,0x04,0xD1,0x7A,0x44,0x8B, + + 0x2F,0xB9,0x99,0x01,0x3A,0x49,0x66,0xDD,0x20,0xB4,0xEB,0x46,0xE6,0x35,0x15,0x6B, + + 0x8E,0x39,0x94,0x01,0x3B,0x68,0xDD,0x44,0x6B,0x28,0x01,0x25,0x1E,0xFD,0xFD,0x8A, + + 0x2C,0x58,0xD4,0x4F,0xA0,0xD6,0x0D,0x34,0x13,0x57,0x1B,0x2A,0x07,0x96,0x1D,0xAB, + + 0xE5,0x24,0xC0,0xDF,0xB1,0xBA,0xE9,0x7C,0x33,0x06,0xC6,0xC3,0x6F,0xF1,0xFD,0x40, + + 0x2F,0x0C,0x8F,0x7C,0x43,0xFC,0xE6,0x98,0x5D,0x1A,0x88,0x4F,0x78,0xDE,0x6F,0xA1, + + 0x88,0x36,0x42,0x4C,0x2D,0xB5,0xC1,0x78,0x4F,0x41,0x5E,0x8D,0xF3,0x7E,0x3E,0x74, + + 0x5F,0xD1,0xC7,0x5F,0x57,0xBD,0x8D,0xCF,0x32,0xDD,0x6D,0xDF,0x0F,0x51,0xE8,0x7F, + + 0x2F,0xF7,0x69,0xAC,0x9D,0xD1,0x9B,0x04,0xE9,0xCF,0xEF,0x0C,0x73,0x72,0xE4,0x84, + + 0x0A,0xA1,0x58,0xEC,0x7C,0x62,0xCD,0x21,0xBB,0xB5,0x81,0x3B,0x68,0x22,0xAC,0x62, + + 0xA2,0x64,0xD6,0xFD,0x19,0xFA,0xD8,0xB1,0xCE,0xBC,0xEB,0xB6,0xD1,0x2F,0xC1,0x85, + + 0x41,0xAD,0x45,0xE1,0x17,0x33,0x4C,0xA5,0x92,0xFF,0x51,0xC5,0xD6,0xB3,0xB6,0xF3, + + 0x87,0x21,0xA0,0xE8,0x25,0x58,0x61,0x33,0x89,0x01,0xA1,0xE5,0x8D,0xCC,0x48,0x09, + + 0x8D,0xA9,0xC1,0x22,0xA9,0x34,0x6E,0x4C,0x80,0x64,0x7C,0x8C,0x0D,0x29,0x18,0xC2, + + 0x03,0x0D,0x65,0xBE,0x37,0x88,0xF4,0xE2,0xC3,0x4D,0x3B,0x8A,0x77,0xB0,0x15,0xD3, + + 0x96,0xAB,0x79,0xAB,0x82,0x6B,0x59,0x49,0x2B,0x7D,0x36,0x9A,0xC0,0x2B,0xC2,0x96, + + 0x6A,0x64,0x5E,0x64,0x32,0xD8,0x5B,0x80,0xF8,0x03,0x43,0x4A,0xBE,0x1B,0x98,0x38, + + 0xDB,0xA7,0x79,0xF5,0xE7,0x6A,0x56,0xEF,0xA9,0x47,0xC0,0xCC,0x54,0xC3,0x1E,0xEB, + + 0x85,0x84,0x55,0x32,0x26,0xF6,0xE5,0x7F,0x8B,0xE3,0x43,0xD4,0x07,0x24,0xA3,0x7A, + + 0x04,0x89,0x58,0x63,0xEF,0x16,0xD3,0xA8,0xCA,0x47,0xC1,0x3D,0xDE,0x08,0xEF,0x9D, + + 0x83,0xAA,0xD4,0xE2,0x9F,0xF0,0x7B,0x6F,0x75,0x43,0x7C,0xCE,0xF3,0x79,0x20,0x44, + + 0xE3,0x4F,0xFC,0x70,0x34,0xF3,0xC2,0x1B,0x71,0x0E,0x6D,0x23,0xCF,0xB1,0x14,0xB0, + + 0x03,0xA0,0x6A,0xAC,0xA7,0xFE,0x64,0x40,0xE8,0x28,0x84,0x9E,0x5F,0xE8,0x21,0x49, + + 0x8B,0x66,0x99,0xCD,0xE6,0x81,0x13,0xAC,0x21,0x2A,0x7A,0x49,0x33,0xC7,0x16,0x69, + + 0x83,0xD0,0xB5,0x5A,0xBF,0x84,0x65,0x40,0x68,0xE2,0x68,0x9F,0xFF,0x69,0x40,0xB1, + + 0x26,0x52,0x3C,0x17,0x48,0x22,0x1C,0x25,0x89,0x53,0x54,0x31,0x5A,0x0B,0xCC,0x11, + + 0x73,0x90,0x08,0x10,0x3F,0x68,0x22,0x10,0xEE,0xD7,0x5C,0x34,0x0A,0xA4,0x2F,0x05, + + 0xA2,0x11,0x3D,0x16,0xC0,0x3A,0x77,0x29,0xE1,0xB2,0xD5,0x21,0xFA,0x07,0xA5,0x15, + + 0xA7,0xDF,0x21,0x7D,0xEF,0x7E,0xDE,0xF1,0xA5,0x11,0x8C,0x8A,0xC9,0x31,0x75,0x28, + + 0x4E,0x12,0x7D,0x61,0xF8,0x39,0x94,0x0D,0xDC,0x80,0xCE,0xE6,0xE0,0x35,0x7D,0xD2, + + 0x21,0xB8,0xAA,0xB6,0xC8,0xAA,0x9C,0x78,0xD9,0x4E,0xA2,0xF2,0x92,0xF6,0xEF,0x64, + + 0xA4,0x94,0xB8,0x2F,0x47,0x55,0xC4,0xFE,0xDE,0x17,0xC3,0x87,0x92,0xE1,0x14,0x63, + + 0xAF,0x67,0x0D,0x40,0x99,0xBA,0xA8,0x97,0x10,0x47,0x6C,0x06,0x7F,0x36,0xC6,0x08, + + 0xE1,0x5A,0xE0,0xB5,0x2A,0x75,0xD2,0x62,0x8A,0x31,0x56,0x17,0x79,0x93,0xCE,0x1C, + + 0xF4,0x5B,0x4E,0x19,0x0C,0x57,0x44,0xB9,0xCA,0xAC,0x5E,0x3D,0x20,0x8C,0x43,0xBD, + + 0xC8,0x8E,0xE1,0xB5,0xBB,0x5A,0x12,0x2B,0x2D,0xD3,0x24,0x09,0x04,0x19,0x4F,0x0C, + + 0xAF,0x39,0xD6,0xAC,0x1C,0x9D,0x4F,0x9D,0x96,0xA6,0xCD,0x47,0x02,0xA4,0x7C,0x3B, + + 0x19,0x1A,0x1B,0xCE,0x8D,0x03,0xEE,0x13,0x7A,0x11,0xEE,0x12,0xD6,0x71,0x14,0x27, + + 0x88,0x1B,0x2B,0x23,0xCE,0x6B,0xCE,0xBF,0x8A,0xFB,0xE4,0x14,0xF2,0x32,0xED,0xB8, + + 0x09,0x7B,0xBE,0xC9,0x91,0xC4,0xAC,0xE1,0x4F,0xA1,0x2A,0xA3,0x0F,0x3F,0xE5,0xE2, + + 0xAD,0xCE,0x12,0xE5,0x8C,0x1F,0xC6,0x06,0x0A,0xD9,0xDE,0x1B,0xDF,0x79,0xE0,0x86, + + 0xDD,0x2F,0x19,0xFA,0xD9,0x5B,0x36,0xD2,0x70,0xCF,0x08,0xB8,0xBF,0xE3,0x97,0xF0, + + 0x4D,0xA2,0x57,0x92,0x62,0xFC,0x40,0xB0,0x80,0xF4,0xE3,0xDE,0x65,0xAC,0x85,0x71, + + 0x27,0xE7,0x5F,0xEA,0x14,0x19,0x11,0x26,0xA7,0x03,0xE8,0x17,0xD2,0x80,0x17,0xB2, + + 0x67,0x73,0xC9,0x5D,0x25,0x0E,0x01,0xCD,0x38,0xAF,0x5E,0xC4,0xFB,0xF1,0x5A,0xE7, + + 0x84,0x48,0x98,0x42,0xFF,0xF5,0x2D,0xE6,0x44,0x8D,0x59,0x4C,0xF7,0xFB,0x10,0xBA, + + 0x27,0x83,0x48,0x25,0xB4,0x26,0xF4,0xF6,0x41,0xD6,0xC0,0x98,0xFB,0xE8,0x7F,0xA1, + + 0x2A,0x5A,0xD3,0x77,0x94,0x09,0x0F,0x64,0xC0,0x84,0x45,0x05,0x6D,0x83,0xC3,0x44, + + 0x81,0xC5,0x5C,0xA4,0x1B,0xE6,0x7F,0x9A,0xE3,0xCA,0x04,0x53,0xE4,0x5B,0x0E,0x78, + + 0xE7,0xAB,0xB1,0xEC,0xB0,0x05,0xD1,0x6A,0x70,0x8A,0x0A,0xB0,0xB7,0xAB,0x00,0x9E, + + 0x0B,0x45,0x9B,0x9A,0x1B,0xC1,0x5A,0x6C,0xF1,0xC4,0x7A,0xBF,0x04,0x1C,0xE3,0x8A, + + 0xE8,0x0B,0xB4,0xED,0x1E,0x96,0x77,0xEC,0x6D,0x35,0x00,0x8F,0x20,0xC9,0xEB,0x9B, + + 0xC3,0xC9,0x3B,0xD8,0xAE,0x8A,0xC0,0x44,0x42,0x1D,0xE9,0xC5,0x26,0x34,0x52,0xA2, + + 0x58,0x8A,0xBB,0xF1,0xBB,0x73,0x09,0x4D,0xEF,0x73,0x4A,0x9D,0x6C,0xFC,0x5A,0xB2, + + 0x6F,0x8B,0x21,0x38,0xEC,0xBD,0xBA,0x97,0xF1,0x8C,0xBA,0x92,0xE3,0xAC,0xC9,0x0F, + + 0x88,0xCC,0xE2,0x29,0x61,0xB5,0xC4,0x52,0x3A,0x5F,0x4B,0x9C,0xE4,0x95,0xC1,0xF8, + + 0x89,0x0D,0x53,0xA4,0xBB,0xF3,0xCC,0x46,0x3B,0x1E,0xA1,0x7D,0x6C,0x72,0x32,0x06, + + 0x22,0x2C,0x33,0x0E,0x91,0x16,0xA4,0xBC,0x14,0x24,0x74,0x33,0x5E,0x7D,0x68,0x0A, + + 0x45,0xC5,0x68,0x72,0xB8,0xAA,0xAB,0x36,0x48,0x90,0x8F,0x32,0x77,0x4A,0xE5,0x03, + + 0x86,0xD0,0x36,0xC7,0xB8,0xF0,0x22,0xB9,0x90,0x66,0x68,0x27,0xF2,0xD0,0xED,0x17, + + 0x78,0xD1,0xBC,0xF1,0x7F,0x42,0x2D,0x9B,0xB0,0x91,0x0E,0x9B,0x09,0x82,0xD3,0xDC, + + 0x16,0x60,0x1F,0xBD,0xAC,0x0B,0x74,0x1C,0x55,0x4E,0x5D,0xCC,0x70,0xE6,0x54,0x28, + + 0x8B,0x98,0x91,0x3C,0x13,0xB3,0x66,0xF0,0x8C,0xDA,0x6C,0x85,0x2B,0x53,0x70,0x41, + + 0x63,0x63,0xDE,0x4D,0x45,0x3B,0xD9,0x85,0x38,0x0B,0xC2,0x65,0x63,0xA1,0x12,0x57, + + 0xD3,0x00,0x44,0xFD,0x16,0x28,0x3C,0x95,0x86,0xD3,0xEC,0x04,0xAB,0xB6,0x66,0xD9, + + 0x64,0xBB,0xE7,0xE8,0xF6,0x69,0xF6,0x02,0x5F,0xD9,0x76,0x2A,0x86,0xF0,0x76,0x34, + + 0xAF,0x55,0x76,0x1C,0xAC,0xAC,0xFD,0x3E,0x63,0x80,0xBA,0xDE,0x7E,0x54,0x19,0x2A, + + 0xCD,0x4A,0xEF,0x8A,0xBA,0xD8,0xF7,0x2E,0xD9,0xC1,0x7D,0xDC,0xCF,0x73,0x9E,0x6B, + + 0xF7,0x94,0x6F,0xA3,0x41,0x6F,0x66,0x8B,0xEB,0xB9,0xE2,0x78,0x3F,0x9B,0xCA,0xB9, + + 0x16,0x1A,0x52,0xAC,0xC5,0xD9,0x10,0x08,0x4A,0xD1,0xC8,0x9F,0x1E,0x23,0x6A,0x1A, + + 0x33,0xF1,0x7E,0x36,0x20,0xF0,0xCA,0x98,0x98,0xB8,0x19,0xDA,0xFD,0xF5,0x1D,0xB8, + + 0x9E,0x18,0xDF,0x31,0x12,0xB3,0x0C,0xCC,0x4F,0x61,0x08,0x9C,0xCA,0x92,0x51,0xF6, + + 0x6D,0x10,0x14,0xD7,0x1A,0x40,0x47,0x04,0x4A,0xA0,0x43,0x80,0x5C,0xBE,0x59,0xA1, + + 0x73,0x00,0x51,0x35,0x32,0x62,0x2E,0xC9,0x02,0xFF,0x50,0xA4,0x72,0x0E,0xD1,0x34, + + 0x3A,0x0E,0xF2,0x74,0x51,0xD5,0xFF,0x70,0x55,0xEC,0x1C,0x27,0x73,0xC2,0x5E,0x01, + + 0xBF,0xFD,0xC5,0xD9,0x31,0xDD,0x6F,0x91,0x35,0x2C,0x76,0x5F,0x06,0x6A,0xD2,0x11, + + 0xFE,0xC3,0xDF,0x17,0xD9,0x8E,0x42,0x83,0xC9,0xE3,0x9F,0x95,0x51,0xBD,0x29,0xAB, + + 0xBD,0xBF,0x7F,0x1F,0xC3,0xF9,0x42,0x02,0xB5,0x21,0x9E,0x86,0xFE,0x6B,0x48,0xAC, + + 0xA0,0x47,0xF3,0xB6,0xBF,0x98,0xC8,0x12,0xB0,0x20,0x6C,0x07,0x71,0x6A,0x01,0xB9, + + 0x3E,0xFD,0xEA,0xC1,0xEE,0x56,0x69,0x9E,0x40,0x42,0x65,0x95,0x66,0x69,0x4D,0x7B, + + 0x85,0xF6,0xB1,0x44,0xEF,0x8A,0x61,0x0C,0xE0,0x07,0x6D,0x06,0xF9,0x68,0xC2,0x99, + + 0x8C,0xA3,0xDF,0x9C,0xF3,0x8B,0x72,0x7E,0x7E,0x4C,0xAC,0xC5,0x1A,0xC7,0x10,0x36, + + 0x28,0x2B,0xDE,0x9E,0xDC,0x7A,0x9A,0x2C,0xCB,0x85,0xBA,0x25,0x26,0x49,0xDD,0xF6, + + 0x61,0xF1,0xA3,0x99,0x79,0x85,0x12,0x5A,0xBB,0xCD,0x41,0xDC,0xB7,0xAA,0x35,0xE4, + + 0xE8,0x7C,0xB3,0xEE,0xBF,0x4E,0xCE,0x5B,0x22,0xC8,0xBB,0x39,0x38,0x94,0xC7,0x2A, + + 0xF5,0x69,0x55,0xAC,0x1E,0x8C,0x69,0x14,0x6B,0x0C,0x66,0x1F,0x78,0x63,0xB0,0x50, + + 0xF6,0xC2,0x5D,0x62,0x60,0x2D,0x85,0x58,0x3C,0x49,0x4A,0x0E,0xD9,0x31,0x7B,0xA1, + + 0x44,0xF2,0x50,0x4F,0x43,0x6C,0x4F,0xE2,0xB1,0xAE,0x67,0x1E,0xF0,0x61,0x75,0x64, + + 0xEB,0x4F,0x90,0x1F,0xE4,0x2D,0x9B,0x80,0x03,0xB2,0xE8,0x9F,0x77,0x60,0xC4,0x09, + + 0x3E,0x13,0x56,0xE6,0xCF,0x9D,0x53,0xC6,0x9F,0x56,0x6B,0x55,0xD3,0xF0,0x04,0x30, + + 0xD1,0xCB,0x49,0xE7,0x1F,0x73,0x83,0x50,0x2D,0x85,0x8C,0x30,0x73,0x71,0x37,0x3D, + + 0x8A,0xC4,0xD5,0xC2,0x6E,0x38,0xBF,0x0D,0x41,0x8D,0xAB,0x05,0x10,0xF3,0x5D,0xE0, + + 0x8C,0x30,0xCD,0x89,0x4E,0x9E,0x49,0x40,0xC3,0x73,0x62,0xC6,0xD3,0x31,0x73,0xB5, + + 0xD2,0xDD,0x7C,0x2B,0x49,0xD4,0x3C,0xAE,0x83,0x6B,0x1C,0xE4,0x19,0x1E,0x5B,0xCE, + + 0x53,0xA1,0x0C,0x21,0xCD,0x2E,0x34,0x92,0x94,0x17,0x82,0x25,0x73,0xF8,0x85,0x2D, + + 0x4B,0xE2,0x1A,0x4F,0xC5,0xB2,0x2C,0x23,0x43,0xA9,0xD5,0x14,0xB1,0x76,0xD8,0xCB, + + 0x97,0xCA,0xE2,0xB3,0x04,0x27,0x9B,0x4B,0x37,0x54,0x20,0x0E,0x0C,0x35,0x52,0xF9, + + 0x02,0xCE,0xD6,0x08,0x3A,0x71,0x36,0x25,0x5B,0x19,0xD6,0x07,0x30,0x7B,0x5A,0x16, + + 0x54,0x1A,0x69,0xE6,0xEF,0x33,0x20,0x44,0x8B,0x39,0x74,0x98,0x4A,0xC5,0x9D,0x29, + + 0x56,0xA3,0x47,0x0D,0x9A,0x56,0xAF,0xD5,0xCB,0x58,0xA9,0x0D,0x1A,0xBA,0x3C,0x6D, + + 0x83,0xD9,0x0B,0x8E,0x9B,0x58,0x9A,0x3B,0x2C,0x28,0x27,0x4E,0x8D,0x6B,0x6E,0xAA, + + 0xD7,0x10,0x7E,0x23,0x41,0x3E,0xF1,0x49,0xE5,0xF1,0x08,0x89,0xD2,0x1D,0x74,0x33, + + 0x98,0x13,0x15,0xCE,0x3D,0x26,0x0E,0x88,0xEB,0xDB,0x5E,0xFF,0x88,0xD0,0x7F,0x4D, + + 0xD6,0x6A,0x9C,0xE2,0xC5,0x28,0x03,0x7B,0x15,0xF3,0x8E,0x61,0x5F,0x77,0x77,0x26, + + 0x28,0x12,0xBD,0xAE,0x91,0xEA,0x7F,0xB9,0xD9,0xD2,0x40,0x8D,0xF3,0x76,0x38,0x0F, + + 0xED,0x7B,0x98,0xF5,0x3A,0xC5,0x17,0x93,0x6C,0x51,0x70,0x17,0xFB,0x4B,0x16,0xEF, + + 0xE7,0xD6,0xF5,0x86,0xFE,0x02,0x92,0x83,0xC5,0x01,0x66,0xC4,0x74,0x50,0x3B,0x2C, + + 0xA5,0x22,0x99,0xF4,0xF6,0x0F,0x0B,0xD0,0xEE,0xC4,0x6F,0x33,0xF0,0x4F,0x69,0x61, + + 0x6E,0xA0,0xF7,0xE2,0xDD,0x82,0x03,0xC0,0xEF,0xC5,0x83,0xC4,0xF7,0x68,0x1F,0x30, + + 0x6C,0x55,0x3B,0x69,0x10,0x4F,0x68,0x66,0x6F,0xF2,0x44,0x84,0xFA,0xEB,0xDD,0xD6, + + 0x30,0x28,0xC7,0x30,0xFC,0x46,0x07,0x88,0xFB,0x74,0x02,0x30,0x59,0xA4,0x1A,0xBE, + + 0x84,0x5D,0xE3,0x7C,0xBC,0xBD,0x4B,0x9E,0x46,0x19,0xA8,0xF0,0x31,0xF6,0xD6,0x0F, + + 0xA6,0xC7,0xE8,0x31,0x7C,0xB4,0xC8,0x4B,0x7F,0xB6,0xD1,0x15,0x56,0xE8,0x1C,0xE3, + + 0x4E,0x27,0x14,0x7C,0xF7,0x8B,0x98,0x86,0xED,0x67,0xE6,0x1F,0x7E,0xF7,0xEA,0xEE, + + 0x55,0xA8,0xD4,0xBA,0xF6,0xCA,0x44,0x9F,0x26,0x22,0xFF,0x41,0x5B,0xEB,0xF3,0xFA, + + 0xE3,0xCA,0xC3,0x59,0xF6,0xA7,0xE3,0x58,0xF7,0x48,0x09,0xD0,0x3F,0xE3,0x9D,0x9F, + + 0x83,0x46,0xD5,0xBF,0x1F,0x67,0xBF,0x1A,0x21,0xD0,0x77,0xBB,0xDF,0x09,0x7E,0xC1, + + 0x83,0x97,0x3F,0xC4,0x29,0x28,0x43,0x46,0x48,0x2E,0xDA,0x69,0xDF,0xA8,0x62,0x5E, + + 0x88,0xEF,0x2A,0xAF,0xBB,0xB6,0xC5,0x38,0xEE,0xCB,0xBA,0xDE,0x0F,0xFF,0x85,0x3D, + + 0x4C,0xAE,0x3C,0xCF,0xE9,0xDB,0x27,0x15,0x4F,0xC3,0xDB,0xAD,0xB5,0xE0,0xB0,0x58, + + 0xF0,0x83,0xC4,0x39,0x28,0xBF,0x5B,0x5F,0xC9,0x3E,0xA5,0xBE,0xDF,0x44,0xFA,0x82, + + 0x24,0xB3,0xA2,0x26,0xB4,0xEE,0x0C,0x51,0x4E,0x7B,0x0C,0x55,0x08,0x7D,0x52,0x36, + + 0xA7,0x5D,0xD2,0x26,0xDE,0x12,0x06,0x41,0x4F,0x7E,0x82,0x8B,0x1D,0xFC,0x93,0xF1, + + 0x4F,0xB1,0xC5,0xD1,0xD2,0xBF,0x65,0xA7,0x64,0x72,0xCB,0x07,0x1F,0xD1,0x7B,0xF1, + + 0x5A,0x95,0xD3,0x37,0x5C,0xB0,0x6D,0x37,0xEF,0x39,0x42,0xC4,0x81,0x90,0x9F,0x46, + + 0x68,0x03,0xB4,0x2E,0x7A,0xD8,0x0A,0xDE,0x8D,0x25,0x74,0xE5,0xB4,0xEF,0x4B,0xFF, + + 0xF7,0xC4,0x85,0x3D,0xCC,0x29,0x1A,0xCF,0x75,0x98,0x4B,0x13,0x71,0x0E,0xC2,0xFA, + + 0x72,0x07,0x31,0x99,0x98,0x6A,0x99,0x0B,0x33,0x9B,0x52,0x91,0xD5,0x74,0x0D,0xD1, + + 0x87,0x9A,0x56,0x8D,0xB1,0x46,0x1B,0xCF,0xE4,0x97,0xE8,0x1F,0xBF,0x0A,0x8C,0x26, + + 0x8D,0x47,0x0A,0x1D,0x07,0xB2,0x0E,0x59,0x4A,0x9A,0x4D,0xD1,0x1C,0x9C,0x10,0x62, + + 0x0C,0xD9,0xEE,0x82,0xC2,0x14,0xEA,0x3E,0x67,0x33,0x01,0x56,0x31,0x25,0x8B,0x14, + + 0xAF,0x5A,0x62,0xFC,0xD6,0xF8,0x73,0x7E,0x4D,0x75,0x48,0xDD,0x8A,0x25,0x8C,0x3F, + + 0x71,0xF8,0xFF,0x1B,0xBF,0xF2,0x07,0x48,0x8F,0x50,0x13,0x3A,0x28,0x99,0x9D,0xED, + + 0x8F,0x15,0x55,0x33,0x3C,0x67,0x6A,0x02,0x68,0x2D,0x0E,0xD1,0x1D,0xBE,0x74,0xF4, + + 0x0E,0xDD,0x8E,0x90,0xCF,0x36,0xCD,0x5A,0x93,0xFE,0x41,0x18,0xFF,0xBF,0x29,0x2B, + + 0xA2,0x43,0x52,0x4B,0xD1,0x3E,0xF2,0x6F,0x92,0xD0,0x2C,0xBF,0xCD,0x1E,0x73,0x50, + + 0x2D,0x9B,0x5E,0x3D,0x13,0x34,0xBF,0xC6,0x91,0x63,0x48,0x0F,0xF9,0x04,0x15,0xE8, + + 0x4C,0xFD,0x44,0x62,0xEF,0x3B,0xEB,0x1B,0x29,0xDB,0x09,0xD4,0xD0,0x7F,0xD3,0x40, + + 0x32,0xA1,0xC0,0x0D,0x17,0xFA,0x41,0x3C,0xB4,0x0E,0xD0,0x30,0xD8,0xB5,0xF9,0x3E, + + 0xAF,0x40,0x40,0x63,0x1D,0xD4,0x11,0xA5,0x8A,0x9F,0xAA,0x55,0x50,0x74,0xB6,0xF7, + + 0x87,0xC8,0x22,0x91,0xF4,0x63,0x18,0x4E,0x66,0xE8,0xA7,0x44,0x93,0xCA,0x38,0xA8, + + 0x7B,0x99,0xC4,0x04,0x58,0x89,0x52,0x51,0x76,0xEB,0x37,0x24,0x2E,0x7F,0x72,0xB8, + + 0xD5,0xCA,0x08,0x2C,0xDE,0x67,0x97,0x37,0x81,0xE5,0x5A,0x9C,0x5F,0x2A,0xB9,0x49, + + 0x7B,0x49,0x57,0x74,0xB9,0xD9,0xC0,0x70,0x9D,0xEB,0xF3,0x13,0xF1,0xE6,0xFE,0x69, + + 0x77,0x76,0x96,0x9E,0x72,0x3C,0x11,0xF5,0x8B,0x76,0x80,0x67,0x97,0xAA,0x0A,0x2E, + + 0x02,0x85,0xDB,0x80,0xBD,0xA8,0x1D,0x28,0xC8,0x98,0x87,0x4C,0x08,0xE3,0xF5,0xF0, + + 0xD5,0xC4,0x4B,0x6E,0xBE,0x67,0x42,0x29,0x22,0xF1,0x5A,0x59,0xB3,0x61,0xD7,0xE1, + + 0x52,0xC2,0x7B,0x0F,0x80,0x31,0x2D,0x54,0xA1,0x41,0x53,0xA9,0xF5,0x1F,0xF0,0x4B, + + 0xA7,0x68,0x0F,0x99,0xA2,0x15,0x9F,0x3B,0xC5,0xE0,0x1B,0x7E,0x0D,0xC6,0x82,0xB1, + + 0xF6,0x4E,0x84,0xAA,0x9A,0xAC,0x54,0x50,0xA3,0xDD,0x7E,0xFE,0x1A,0x64,0xF2,0xA6, + + 0x1B,0x40,0x93,0xC4,0xBE,0xD2,0x5C,0x55,0xE3,0xB7,0xE2,0xAC,0x79,0x92,0xD3,0xA7, + + 0xB9,0xB7,0xF9,0xA5,0x92,0x61,0x4B,0x6D,0x62,0xB4,0x94,0xEF,0x5A,0xD5,0xB4,0x05, + + 0xAA,0xD6,0x92,0xCC,0x3E,0xAF,0x5D,0x51,0x63,0x5C,0x2C,0xFD,0x97,0xC2,0x1F,0x62, + + 0xC0,0xB4,0xB4,0x74,0xB6,0x91,0x5A,0x9B,0x39,0x12,0x82,0xC6,0x8F,0xDD,0x55,0x98, + + 0xC8,0x1E,0xDE,0xBA,0xDA,0x55,0x90,0xC3,0x1C,0x3F,0x1F,0x30,0x5C,0x04,0x1B,0x63, + + 0x40,0xED,0x94,0x76,0x34,0xBF,0xCB,0xC4,0xE6,0xE9,0x00,0x00,0x07,0xF9,0xF5,0x99, + + 0x5C,0x5C,0xB5,0x75,0xB5,0x1F,0x7B,0x51,0xE0,0x39,0x5D,0xD0,0x1B,0x7B,0x1E,0x25, + + 0x4A,0xEE,0xA6,0xC0,0x33,0x04,0x2E,0x80,0x6E,0xF0,0x8D,0xE5,0xD7,0x7F,0xE0,0xAF, + + 0xE1,0xEA,0xCE,0xA6,0x00,0xB1,0xE6,0x01,0xC0,0xA5,0x84,0x70,0x75,0x6E,0x3C,0x31, + + 0x5D,0x59,0x7A,0x57,0x45,0x3C,0xC7,0xD4,0xD1,0x02,0x13,0x0D,0x32,0xBB,0xF6,0xA1, + + 0x23,0x91,0x37,0x3D,0xE7,0x9A,0x6F,0x19,0x73,0x96,0xCA,0xEA,0x97,0x6C,0xB3,0x78, + + 0x1B,0xEC,0xE5,0xFF,0x08,0x9C,0xD6,0x54,0xE6,0xF3,0x16,0xEF,0xAC,0xD5,0xD2,0x70, + + 0xA1,0xD4,0xF6,0xB1,0xD2,0xA8,0xF6,0xBD,0x21,0xC0,0xA0,0x84,0xB3,0xD0,0xBD,0x69, + + 0xAC,0x6F,0x99,0x6F,0x58,0x9E,0x88,0xA9,0x6F,0xAA,0x86,0xCD,0xBA,0x16,0x1D,0x66, + + 0x56,0x96,0xB5,0x6E,0x81,0x96,0x21,0xC1,0x64,0x40,0x60,0xCE,0xC5,0xFD,0x66,0x08, + + 0x36,0x07,0x50,0x2A,0x51,0x33,0xA9,0x6C,0x0D,0xD2,0xF0,0x9A,0x13,0xBD,0x92,0xE9, + + 0x74,0x02,0x97,0xD2,0x5E,0x34,0xD9,0x9E,0x94,0xF0,0xE4,0x14,0x77,0x32,0xDC,0xAF, + + 0x55,0x95,0x40,0xDF,0x51,0xFF,0xEC,0x1A,0xD2,0x45,0xCF,0xF9,0x1E,0xBF,0xF0,0x3F, + + 0x42,0xE5,0x0B,0xAE,0xDF,0x24,0x4E,0xBE,0x35,0x55,0xE1,0x30,0xDA,0x4F,0x6A,0x40, + + 0x59,0x08,0x60,0xDB,0x65,0xAE,0x3F,0x23,0xAD,0x39,0xAA,0xB6,0x3D,0xF1,0x9F,0xF2, + + 0x03,0x7A,0x0C,0xD4,0xB6,0xAF,0xCC,0x40,0x6B,0xBE,0x86,0x0E,0x3D,0x48,0x71,0xEC, + + 0x7C,0x2B,0xC9,0xC5,0x10,0xAC,0x73,0xDC,0x60,0x02,0xA9,0xB7,0xA3,0xE2,0x6D,0xFB, + + 0xCD,0xCE,0x91,0xB3,0x74,0x0C,0x67,0xF2,0xC5,0xD8,0x46,0x49,0xBF,0x92,0x5E,0x23, + + 0x6F,0x8D,0x18,0x81,0xC8,0xAE,0xE0,0x93,0x76,0x3B,0x3D,0x06,0x5A,0x26,0xF4,0xC1, + + 0x22,0xEB,0x10,0xD2,0x62,0x3F,0xA5,0x5A,0x3C,0xE7,0xDA,0x80,0xBE,0x04,0x39,0x4F, + + 0x0B,0x2B,0x61,0x24,0x17,0x2B,0x28,0x70,0x23,0x39,0xD1,0x7F,0x37,0xFD,0x0B,0x43, + + 0x84,0x5D,0x4E,0x7F,0x43,0x46,0xB9,0x2F,0x11,0x33,0xEF,0x96,0x28,0xA5,0xDD,0xE2, + + 0x40,0xC5,0x33,0xFD,0x43,0xB3,0x33,0x4C,0xA7,0x82,0x72,0x4B,0xF4,0xAA,0x9F,0x6B, + + 0x0B,0x72,0x94,0x36,0x90,0x0F,0x63,0x36,0xE8,0x66,0x96,0x20,0xB4,0xD8,0x5C,0xFA, + + 0x87,0x8A,0xAC,0xE9,0x77,0xBB,0x32,0x4D,0x27,0xA0,0x2F,0x9C,0xDD,0xAA,0x6C,0x68, + + 0xAE,0x2F,0xB1,0x5F,0x99,0x87,0x71,0x33,0x68,0x64,0xA3,0xAE,0x34,0x7A,0xCE,0x39, + + 0x27,0x2A,0xD8,0xB1,0x2D,0x28,0xE4,0x82,0xDA,0x01,0xE9,0x39,0xDC,0x40,0x62,0x4E, + + 0xE6,0xE4,0x69,0x38,0x92,0x0B,0x05,0xFE,0x1A,0x1B,0xEB,0xB9,0x81,0xE5,0x7B,0x8C, + + 0x4C,0x0E,0x59,0x2F,0xD2,0xB5,0x8C,0x86,0xFE,0x43,0x06,0x0D,0x21,0x43,0x75,0x3F, + + 0xAE,0x57,0x7D,0xA0,0x62,0xC1,0xDC,0x4F,0x26,0x0E,0x7F,0xFB,0xE8,0x64,0x76,0x7D, + + 0xD3,0x25,0xB1,0xC1,0xFE,0x19,0x10,0x34,0x65,0x23,0xB4,0x22,0x59,0xD5,0x6A,0xEC, + + 0xD8,0xE0,0x6C,0xE6,0x71,0xBC,0x1B,0xA6,0x47,0x81,0x3C,0xF5,0xA1,0xB3,0x7D,0x7B, + + 0xA4,0xD0,0xAD,0x83,0x3D,0x24,0x6B,0xDB,0xE4,0xC9,0x75,0xC2,0x1E,0xFA,0x52,0xE9, + + 0xD3,0x0C,0xB5,0x93,0x3C,0x67,0xEF,0x13,0xE5,0xB0,0xA7,0xA3,0x96,0xD3,0x72,0xA0, + + 0x46,0x9D,0xC2,0xB2,0x17,0x24,0xF4,0xFD,0x56,0x79,0xAD,0xD4,0xD3,0x0B,0x6D,0xA1, + + 0x57,0xDA,0xB5,0xC5,0xD3,0x74,0xAB,0xB5,0xAD,0xC4,0x04,0x74,0xBE,0xBA,0x1C,0xB0, + + 0x9A,0xD9,0xBC,0xD5,0xD1,0x96,0x60,0x66,0xE8,0x5C,0xAC,0xE2,0x53,0x07,0x34,0xB3, + + 0xA1,0x85,0xD7,0x3F,0xBB,0xF8,0x75,0xC7,0xE1,0x9E,0xC5,0x08,0xC4,0x97,0x18,0xF2, + + 0x44,0x95,0x98,0xB6,0x54,0xB5,0x6F,0x26,0x0F,0xF8,0xCE,0xBD,0x44,0xF1,0xD1,0xDD, + + 0xD4,0x6F,0x32,0xA9,0xCE,0xDC,0xE0,0xC1,0xED,0x38,0xAF,0xDA,0xB5,0xE8,0x01,0x6B, + + 0x0F,0x1F,0x58,0xFC,0x80,0xF8,0xCF,0xED,0xE0,0x98,0x91,0x86,0xD5,0x5E,0xD0,0xE1, + + 0x67,0x94,0x97,0x64,0x30,0x1D,0xFF,0x4E,0x14,0xC0,0x23,0x3D,0x30,0x66,0x40,0x3A, + + 0xBE,0x3D,0xBF,0x43,0x9B,0x1D,0x0E,0x19,0x0A,0x71,0x4E,0xA9,0xA0,0xF4,0x3C,0x90, + + 0xC4,0xF9,0xFF,0x1E,0x3B,0x46,0x36,0x66,0x5C,0xFD,0xA1,0x35,0x5B,0xFD,0xF6,0x38, + + 0x2A,0x13,0xF6,0x30,0x33,0x18,0xE1,0xAC,0x24,0x1F,0xF1,0x9D,0x59,0xBC,0xAF,0x53, + + 0x57,0x14,0x10,0xAC,0x87,0xD1,0xC7,0xEB,0x48,0x59,0xFF,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x3C,0xAF,0x2B,0xA1,0xC5,0x3E,0xEF,0xA2,0x85,0xC9,0xEE,0x95,0xB1,0xCF,0x36,0xF9, + + 0x8C,0x87,0xA3,0x24,0x31,0x8E,0x0D,0xC3,0x75,0xB4,0xFE,0x94,0x52,0xC9,0x16,0xF0, + + 0xFF,0xFD,0xFC,0xFE,0x41,0xFF,0x69,0xD2,0xFC,0xED,0xC5,0x56,0xFA,0x0E,0x8D,0xD1, + + 0x8D,0xF8,0x29,0xE5,0x53,0xB0,0x88,0xC1,0x59,0xB2,0xA7,0x94,0xD7,0x61,0xF7,0xE5, + + 0x71,0x04,0x6C,0xDB,0x13,0x64,0x36,0xC8,0xB5,0xC9,0x10,0xE4,0xCC,0x26,0x48,0x97, + + 0xEA,0xA6,0x01,0xD0,0x11,0x71,0x98,0xF0,0x2C,0xE8,0x28,0x34,0x13,0x9E,0x1E,0x55, + + 0x84,0xC4,0xE5,0x50,0x94,0xA4,0x2A,0x9A,0xFD,0xB9,0x15,0x43,0xD4,0x44,0xAE,0x22, + + 0xE1,0xD1,0x09,0xD0,0xBE,0xD8,0x0B,0x36,0xCD,0x98,0xDD,0x77,0xD7,0x9C,0x02,0x2C, + + 0x0E,0xB2,0x42,0x88,0x29,0x57,0x6C,0x2E,0xA9,0xCB,0x5E,0xA8,0x5A,0x8A,0x74,0x34, + + 0xF5,0x58,0x75,0x6F,0x21,0x4A,0x62,0xBC,0x7D,0x86,0x21,0xAF,0x3F,0x63,0x2A,0x7B, + + 0x63,0x3B,0xBD,0x21,0xF0,0x27,0xB9,0xDA,0x44,0xC7,0x6C,0x6A,0x12,0x89,0x51,0x49, + + 0xF5,0x49,0x70,0xED,0x29,0xDA,0xBC,0x11,0x4B,0x87,0x99,0x23,0xBF,0x9F,0x0A,0xC1, + + 0x87,0xA1,0x71,0xAE,0x1C,0x57,0x6C,0xD9,0x4C,0x0E,0xD2,0x73,0x64,0x2E,0x9A,0xCB, + + 0x69,0x07,0x9D,0xD8,0x15,0x68,0x72,0x1A,0xBF,0xCE,0x6A,0xF8,0x55,0x04,0x97,0xDA, + + 0xE0,0xA3,0x36,0x53,0xE8,0xDA,0xA9,0x2B,0x6B,0xB3,0x93,0xE2,0xDC,0x0C,0x4A,0x4A, + + 0xE9,0x4C,0x0B,0xDD,0x0F,0x6D,0xEC,0xC8,0xCD,0x6D,0xC4,0x9D,0xD7,0xC2,0x64,0xD6, + + 0x21,0x52,0x44,0x01,0x3F,0x90,0x07,0x24,0x6A,0xBE,0x78,0xDB,0xBA,0xD3,0xCC,0x15, + + 0x52,0x0A,0xBE,0x85,0x09,0x35,0x7B,0x70,0x65,0xA5,0x9E,0xAA,0x13,0x85,0x47,0xBD, + + 0x93,0x93,0x14,0xF6,0x84,0x39,0x2D,0x5A,0x15,0x3E,0x2E,0x36,0x92,0x7A,0x1C,0x13, + + 0x64,0x74,0xBD,0xE6,0x8D,0x5F,0x0E,0xC2,0xDD,0xD4,0xCB,0xA4,0xDB,0x77,0x22,0x75, + + 0xDD,0xC9,0x84,0x4B,0x34,0xB6,0x2A,0x0D,0x89,0x0F,0x0F,0x97,0x05,0xF3,0x37,0x2B, + + 0x1C,0xEA,0xD3,0x34,0x3F,0x98,0x9C,0x74,0xA4,0x5D,0xFC,0xD4,0x9A,0xAE,0x23,0x75, + + 0x55,0x9B,0x0C,0x41,0xBC,0x5F,0x2B,0x19,0x09,0x65,0xD1,0xF5,0xC1,0x37,0x8D,0x51, + + 0xCC,0xBA,0xB5,0xAD,0x90,0x57,0xD9,0x00,0xD9,0x77,0xAF,0xF1,0xA5,0x6C,0xC6,0x18, + + 0x5C,0x5A,0xE4,0x8D,0x39,0x08,0x12,0xAD,0xA0,0x09,0xE4,0xEB,0x91,0x1B,0x16,0x8C, + + 0x2F,0xA1,0x81,0x3B,0xC5,0x28,0x8F,0x58,0x6D,0xF9,0xA0,0x18,0xB3,0xBA,0x49,0xBA, + + 0x55,0x95,0xA1,0xB5,0xC7,0x78,0x04,0xB8,0xDC,0xF7,0xF1,0x18,0x13,0x19,0xFB,0x64, + + 0xA1,0x5A,0x1F,0x6C,0xDE,0xC4,0x0A,0xFE,0x2B,0x5A,0xE1,0x19,0x74,0xD6,0x96,0x8F, + + 0x24,0xC3,0xE0,0x65,0x04,0x91,0x6C,0x1B,0x5C,0x1E,0x44,0xEE,0x34,0xD1,0xB4,0x9A, + + 0x8A,0xE0,0x58,0xE2,0x49,0xC8,0xB4,0xB8,0x67,0xF6,0xD8,0x11,0x92,0x06,0x79,0x6C, + + 0xAC,0x5C,0x92,0xBC,0x84,0x37,0x93,0xCF,0xEC,0x1C,0x06,0x5F,0xF2,0xDC,0x67,0xBB, + + 0x5F,0x5C,0x98,0x59,0xF9,0x16,0x8E,0xF8,0x9C,0x93,0xAD,0xFC,0xBB,0x64,0x64,0x92, + + 0xE5,0x8F,0xDE,0x00,0x77,0xBC,0x2A,0x40,0x65,0xE3,0x66,0xE1,0xA9,0x46,0x6C,0xC5, + + 0x66,0x7E,0xD0,0x31,0xA8,0xAE,0x20,0x1F,0x0D,0xB0,0xB0,0x26,0x81,0xA2,0x7B,0x76, + + 0xF8,0xC0,0x72,0xF4,0x18,0xFF,0x0F,0x0B,0xA5,0x3F,0x65,0x59,0x1E,0xA1,0x51,0x02, + + 0xB1,0x2E,0xF3,0x33,0xED,0x0C,0x07,0x1E,0x4A,0x45,0x1E,0x92,0x3C,0xC0,0x46,0xF3, + + 0x28,0x80,0x24,0x23,0xE9,0x71,0x7F,0xA0,0xE7,0x3B,0x88,0x1E,0x75,0x84,0x4E,0xF7, + + 0x6D,0x08,0x4B,0xEA,0xCB,0x56,0xBE,0xC8,0xAE,0xE6,0x29,0x07,0x69,0xEC,0xE3,0x50, + + 0xA0,0x05,0x99,0xC3,0xA9,0xD1,0x19,0x01,0x31,0x84,0xD7,0xCB,0xE8,0x4B,0x17,0xF2, + + 0x6E,0xA4,0x29,0xD7,0x09,0xE5,0xB9,0xF3,0xE2,0x85,0x33,0x49,0xA1,0x12,0xB3,0xEA, + + 0x08,0x28,0x02,0xFE,0xDE,0x3B,0x36,0x6A,0x5A,0x3D,0x72,0xAE,0x08,0x17,0x3F,0xFA, + + 0xD2,0xCB,0xF0,0x34,0x61,0x06,0xFA,0xBB,0x82,0xC4,0xDC,0x96,0x5E,0x69,0x36,0x7B, + + 0xAC,0x22,0x63,0x8F,0xBE,0x15,0xA2,0xDB,0xA1,0x3B,0x1F,0xBC,0xE6,0x37,0xEF,0xF7, + + 0xBE,0x79,0x0B,0xEF,0x04,0x78,0xC0,0xCB,0xA0,0x6A,0x18,0x97,0x01,0xD8,0xCE,0xD9, + + 0x2C,0x84,0xA0,0x82,0x18,0x8E,0x32,0x39,0x06,0xEF,0x25,0xEA,0x1C,0xC5,0x3E,0xDE, + + 0x0D,0xE7,0xEE,0x5C,0x1B,0x56,0x2A,0x74,0x65,0xF9,0xA9,0x3E,0x4E,0x40,0xE3,0x0A, + + 0x68,0x23,0x13,0x0F,0xDE,0x55,0x7F,0x57,0xEA,0xBA,0x95,0xD6,0x2B,0x48,0xAB,0xDB, + + 0xC1,0xE3,0xEB,0x40,0xA1,0xED,0xAB,0x09,0x24,0x14,0x2A,0x9F,0x9D,0x4F,0xE4,0xEB, + + 0x58,0x9A,0xFA,0x7B,0xCB,0x4B,0x0A,0x8B,0xA6,0xD0,0xE2,0x35,0x4E,0x5F,0xEC,0x2B, + + 0x22,0x64,0x6C,0x12,0x6D,0x65,0x06,0x41,0x5D,0x7E,0xED,0x45,0x17,0x2E,0xA1,0x7E, + + 0x5B,0xD3,0x5A,0xA3,0x68,0xB1,0x3D,0x90,0x61,0xE3,0xE3,0xD4,0x96,0x54,0x70,0x17, + + 0x9F,0x5A,0x7D,0x64,0x9B,0x67,0xAC,0xF4,0x0C,0x82,0x0A,0x06,0x86,0xF3,0xD3,0x67, + + 0x20,0xB6,0x82,0x7B,0xC3,0x12,0xAB,0x4E,0x59,0x14,0xB3,0xE4,0x3A,0x59,0x04,0xB0, + + 0xD0,0xD7,0x39,0x7F,0xDE,0xEE,0xC5,0x0E,0xA2,0x2E,0xA5,0xD3,0x9E,0xE6,0x6A,0x01, + + 0x07,0x69,0x36,0x87,0xAC,0x12,0x2A,0x1C,0xE0,0x0D,0x28,0x55,0xF2,0x56,0xAB,0x69, + + 0x4E,0xB4,0x8F,0xC6,0xB4,0x67,0x2B,0x1E,0xAF,0x6C,0x05,0xE4,0xC9,0xA4,0xE6,0x0B, + + 0x1F,0xDA,0x74,0x7D,0x52,0xBE,0x50,0x43,0x85,0xE9,0xE9,0xBA,0x7A,0x3A,0x01,0xE8, + + 0xC6,0x48,0x1A,0xFC,0xE9,0xAA,0x00,0x96,0x99,0xE8,0x59,0xCD,0x5B,0x2F,0xF6,0x3C, + + 0xAA,0x83,0x8A,0xA5,0x1D,0x65,0x55,0xAB,0xEF,0x70,0xB7,0x68,0x15,0x99,0x51,0xA6, + + 0xC6,0x0A,0xD1,0x36,0x69,0x38,0x66,0xBF,0x60,0xB8,0xB7,0x2F,0x09,0xB8,0xA6,0x4A, + + 0x21,0xDE,0xBC,0x7F,0x56,0xE7,0x89,0x6E,0x19,0x81,0xF0,0x16,0x97,0x1F,0xAE,0x5A, + + 0x7B,0xF1,0x44,0x2D,0xB3,0x10,0x2F,0xFB,0x86,0x1E,0x7F,0xC1,0x11,0x5D,0x27,0x98, + + 0x47,0xBD,0x99,0xC9,0x5F,0x3D,0x4D,0x18,0x80,0x75,0x5B,0x7D,0xBA,0xF4,0x09,0x72, + + 0x50,0x42,0xBE,0x3D,0xF7,0xE4,0x3D,0x04,0x06,0xCC,0x29,0x7B,0xF5,0x85,0x3E,0xA8, + + 0xA3,0xA0,0x55,0x06,0x32,0x8D,0xD4,0xAE,0x41,0x10,0x65,0x5A,0xD1,0x6D,0xAB,0xB1, + + 0xDD,0x42,0x80,0x0C,0xF8,0xB2,0x1E,0x42,0xAA,0x12,0xD8,0x89,0x57,0x63,0x50,0x40, + + 0x37,0x43,0xD2,0xC2,0x52,0xA2,0xD1,0xA4,0x39,0x4A,0x2E,0x67,0x71,0x20,0x2A,0xB4, + + 0x59,0x80,0x65,0x87,0x85,0x29,0x39,0x0D,0x4C,0x01,0x5F,0xCA,0x24,0x6F,0xFF,0xDB, + + 0xF7,0x92,0x88,0xCD,0x14,0xD5,0x10,0xC0,0x44,0x46,0x43,0x97,0x26,0xC9,0x64,0x4A, + + 0x81,0xC9,0x7B,0x68,0xEF,0xD4,0x50,0x74,0xC6,0x74,0xCF,0x07,0x27,0xC6,0x49,0x51, + + 0x05,0x37,0x06,0xC1,0xEE,0x28,0x6C,0xE5,0xB4,0x40,0x46,0x54,0xAA,0xC9,0xEF,0xD5, + + 0xC1,0x22,0x09,0x68,0xED,0x65,0x07,0x99,0xCF,0x06,0xCA,0x86,0xA3,0xC7,0x38,0xFB, + + 0x32,0xA7,0x84,0xFD,0x26,0x08,0xD6,0xA7,0x49,0x38,0xAA,0x53,0xD9,0x65,0x32,0xE2, + + 0xA5,0x04,0x66,0x8E,0x0D,0x21,0x52,0x29,0x22,0x1A,0x28,0x01,0xB2,0x2D,0xD2,0x8B, + + 0x4D,0xBF,0xA3,0x94,0x71,0xB9,0xFF,0xAD,0xC6,0xF7,0x53,0xAC,0x44,0xE1,0x74,0x9D, + + 0xB6,0x7C,0x88,0x6E,0xEB,0x45,0x19,0x3B,0x93,0x27,0xC1,0x76,0xAF,0x29,0x22,0x1E, + + 0x07,0x01,0x55,0xD1,0xEF,0x23,0x92,0x85,0xF4,0x22,0x43,0x6E,0x98,0xC1,0x0E,0xD3, + + 0x0D,0x0F,0x5B,0x5E,0xBE,0x98,0x3C,0xD8,0x6F,0x01,0xE2,0x86,0xF7,0x60,0x23,0x1F, + + 0x8F,0x4C,0x77,0x32,0x39,0x8E,0xEC,0xFA,0xE0,0x93,0x46,0xE9,0xA6,0xE2,0x14,0xDB, + + 0x4E,0x07,0x5E,0x62,0xB1,0xFA,0x4D,0x91,0xBC,0x02,0xA4,0x07,0x56,0x0D,0xD4,0xFE, + + 0xEA,0x33,0x96,0x81,0xBD,0x96,0x4F,0xA0,0x1B,0xF0,0x31,0x54,0x94,0x81,0x08,0x92, + + 0x2B,0xEC,0x0E,0xE7,0x07,0x90,0xA1,0x2F,0xD4,0x87,0x4F,0x30,0x73,0x72,0x4D,0x90, + + 0xCB,0xF1,0x50,0x76,0x8A,0x36,0xD5,0x30,0x15,0x3E,0xEB,0xA3,0x93,0x6E,0x13,0x35, + + 0x82,0x73,0x58,0x66,0x8B,0xC6,0x55,0x85,0x34,0x0E,0x5D,0x31,0xA1,0x8C,0x7C,0x3F, + + 0xC3,0x8B,0xFA,0x64,0x44,0x9B,0x26,0xCE,0x38,0x52,0xF4,0x0E,0x1B,0xA5,0xC7,0x90, + + 0x27,0x5B,0xF4,0x2B,0xFB,0x16,0xE8,0x92,0x9C,0x53,0xCA,0x54,0x1B,0xD7,0x3A,0x06, + + 0xA4,0x04,0x61,0xA7,0x45,0x53,0xFC,0x47,0x43,0x89,0xB4,0xA5,0xF6,0x38,0x58,0x53, + + 0x66,0x70,0x6D,0xC6,0x91,0x53,0xF4,0x53,0x42,0xC8,0xCD,0x7C,0xF1,0x6C,0xBD,0xF9, + + 0x02,0x13,0xD3,0xA8,0xBD,0x09,0xBD,0xF7,0xD5,0xA4,0x56,0x41,0xC6,0xA5,0x8A,0x69, + + 0x47,0xE6,0x96,0x98,0xB0,0xAD,0xA5,0x3C,0x67,0xA7,0xA6,0x38,0x73,0x0D,0x05,0x7A, + + 0xC6,0x1E,0xB9,0x65,0xD9,0x1A,0x48,0xA5,0xEE,0xF8,0xBF,0xCF,0x05,0x76,0x6F,0xCF, + + 0x55,0x59,0x4F,0x1D,0x0D,0x79,0x21,0x08,0x64,0x39,0xC5,0x8B,0x85,0xD4,0x7E,0x36, + + 0x86,0x11,0x98,0x2E,0x3E,0x91,0xE2,0x8A,0x91,0xA5,0x20,0x68,0x0E,0xC0,0x1A,0x5A, + + 0xEE,0x15,0xF6,0x26,0x97,0x30,0x06,0xEC,0xBB,0x8C,0x32,0x78,0x69,0xA5,0xB8,0xD7, + + 0x88,0xB1,0x56,0x49,0xA0,0xCE,0x0F,0xED,0x1B,0x87,0xD6,0x69,0x8E,0xA1,0x8F,0x5C, + + 0xB2,0x17,0xB0,0x9A,0x46,0x89,0x78,0xC4,0x6B,0x9F,0xD7,0xFC,0xDF,0x11,0x83,0xB3, + + 0xD8,0x43,0xC2,0x8E,0x17,0x00,0xF0,0xA7,0xDA,0xCA,0xF0,0x86,0xAF,0xEE,0x53,0x35, + + 0xA4,0x3E,0x29,0x65,0x67,0xCF,0x70,0x23,0x2E,0x92,0x43,0xB2,0x6A,0x96,0x41,0x55, + + 0x78,0x8F,0xFF,0xAA,0x90,0xA6,0xB0,0xA7,0xCA,0x7F,0x89,0xD8,0x57,0xEF,0x9E,0xA3, + + 0x71,0xE0,0xCB,0x9F,0x94,0xC3,0x38,0x31,0x9D,0x81,0x79,0xB2,0x0A,0xED,0xA0,0xC6, + + 0xB4,0x8C,0xB0,0xC2,0x7D,0x3D,0x0E,0x4F,0x25,0x3B,0x0B,0x1D,0x58,0x1B,0x50,0xAC, + + 0xAB,0x88,0x7F,0xB4,0x14,0x4C,0x1E,0x02,0x46,0xE5,0xC6,0x4E,0x81,0xEF,0x70,0xC1, + + 0x43,0xA1,0xDB,0xB4,0xA2,0xE4,0x89,0x10,0xFA,0xAA,0x5D,0x14,0xAE,0x10,0x96,0xD1, + + 0x42,0x04,0xD7,0x7B,0xF7,0xE7,0xE9,0xF1,0x52,0x52,0x79,0xB1,0xBF,0x8B,0xE2,0xE7, + + 0xB2,0xF4,0xFC,0xA3,0x10,0x05,0xF6,0xA4,0x4F,0xD8,0x8A,0xD1,0xDF,0xE5,0x83,0x98, + + 0xC8,0x3C,0xAC,0x6D,0x2B,0x2E,0xBE,0xCB,0x7B,0x59,0x01,0x7C,0xFC,0x14,0x9C,0x44, + + 0x19,0x57,0x72,0x7F,0xDC,0xA3,0xF3,0xAE,0x35,0xC2,0x48,0xAB,0xA5,0x53,0xEB,0x8B, + + 0x25,0x2D,0xA8,0x12,0x74,0xF8,0x88,0x8A,0x31,0x08,0x93,0x5D,0xDB,0xC9,0x5A,0xC8, + + 0xCB,0xEF,0x1D,0x3C,0x30,0x73,0x4A,0xD8,0xFA,0x5D,0xCD,0xFD,0x26,0x43,0x2A,0xA3, + + 0x8D,0x41,0x51,0xFB,0xE8,0x00,0xEC,0x5D,0xEE,0x4A,0x84,0x42,0xD0,0x40,0xA3,0xCA, + + 0x14,0xCC,0x5C,0x7E,0x3F,0x51,0xC7,0x09,0x2C,0x64,0x64,0x15,0x14,0x7F,0x9F,0x39, + + 0x78,0xEA,0xBF,0x62,0x74,0xEB,0x35,0x5F,0x63,0xC2,0x6C,0xEC,0xEA,0x64,0x66,0xA1, + + 0xEE,0x13,0xE4,0x13,0xCB,0x6D,0xCF,0xD1,0x02,0xB2,0x14,0x56,0xED,0x23,0x2A,0x63, + + 0x17,0xB1,0x94,0x12,0x3F,0xC5,0xC7,0x88,0x0F,0x64,0xFC,0xDD,0x73,0x8A,0x9E,0x10, + + 0x8A,0x98,0x8D,0xE5,0x49,0xBE,0x22,0x5C,0x15,0x01,0x75,0x27,0xD6,0xB0,0x0D,0x12, + + 0x58,0x3A,0xF7,0xA1,0xC9,0x1C,0xEF,0x37,0xA3,0xD3,0x48,0x33,0xFB,0x0D,0x66,0xD8, + + 0x04,0x20,0x1B,0xB8,0xE4,0x6B,0xDC,0x67,0xE3,0xA6,0x64,0xA1,0x52,0x79,0xA8,0x21, + + 0x05,0x38,0x97,0xF1,0x96,0x0A,0x6F,0x01,0x1F,0x7E,0xEA,0xDE,0x71,0x7F,0x31,0xB0, + + 0x84,0xFA,0x25,0xFA,0xE8,0xBB,0xD9,0xC7,0x07,0x79,0x8B,0xCF,0x95,0xA4,0x39,0x56, + + 0x4C,0xB4,0x41,0xA8,0x6D,0x18,0x2D,0xC9,0x8C,0xF4,0x41,0x95,0x15,0xB7,0x74,0x6A, + + 0x20,0x45,0x06,0x7E,0xAD,0x6B,0x91,0x12,0xEC,0xB8,0xDE,0xCC,0x83,0xF6,0x50,0x32, + + 0xAD,0xF9,0xC6,0xFC,0xC2,0xB7,0x6D,0x7D,0xAF,0x59,0xA1,0x7C,0xDC,0x46,0x39,0x2E, + + 0x8F,0x1A,0x67,0x0F,0x9E,0x05,0x69,0x13,0xCA,0x77,0x8F,0x51,0xFA,0x43,0x71,0x33, + + 0x52,0xD9,0x97,0x61,0xBB,0xC0,0x77,0xAA,0x0C,0x74,0xD7,0xDD,0x0E,0x97,0xA6,0x4A, + + 0x0A,0xDE,0x71,0xB0,0xEC,0x13,0x36,0x13,0x6C,0x47,0xF0,0xD1,0x4E,0xBE,0xBD,0x58, + + 0x2C,0x4D,0x42,0xAC,0xF5,0x4C,0x21,0x87,0x8E,0x72,0xC0,0xD6,0xF2,0x7B,0xA7,0xD3, + + 0x51,0xDC,0x74,0x6F,0x53,0xCE,0xC2,0xD4,0xD2,0x9C,0xBE,0xEF,0xB6,0xEF,0xAF,0x5B, + + 0xD1,0xDD,0x91,0xE2,0x5E,0x19,0xEE,0x7F,0x93,0xD0,0x7F,0xBF,0x12,0xBE,0x60,0x44, + + 0x71,0x8D,0x44,0xD4,0x18,0x23,0x28,0x70,0x41,0x4F,0x0C,0x63,0x8E,0x6A,0xC8,0xF8, + + 0xA6,0x07,0x8E,0x90,0x22,0x1C,0x78,0x74,0x8D,0xCA,0xA2,0xDB,0x2A,0x41,0x79,0x83, + + 0x85,0x3B,0xB9,0x11,0x12,0x6A,0x29,0xF1,0x7F,0x4D,0x92,0x36,0xFD,0xD2,0x81,0x12, + + 0x20,0x89,0xE9,0x51,0xD7,0x2E,0x1D,0xD3,0x43,0x40,0x2E,0x44,0xD7,0xFA,0xB8,0xC2, + + 0x82,0xBC,0xF8,0x83,0xCC,0xB9,0x9B,0x20,0x44,0x06,0xE2,0x8C,0x10,0x2B,0x8C,0x80, + + 0x0F,0x06,0xC3,0x32,0x31,0x28,0x08,0xF4,0x41,0x78,0x27,0x14,0x0F,0x28,0x79,0xBE, + + 0x43,0x64,0x22,0x05,0x8E,0x3D,0x11,0xDC,0xC4,0x44,0xB1,0x32,0x4F,0x6B,0x71,0xC1, + + 0xB0,0x20,0xCF,0xA4,0xEC,0xFF,0x99,0x34,0xDA,0x2B,0xC1,0x65,0x5E,0x91,0x7D,0xEA, + + 0x8A,0x0B,0x7D,0xAC,0xB9,0xE8,0x14,0x5A,0xEB,0x4E,0x4E,0x3F,0x75,0xD8,0x72,0x9A, + + 0x0C,0x00,0xD3,0x77,0xE4,0x45,0x4A,0xA1,0xEA,0x4F,0xA4,0x5C,0x78,0x19,0xB6,0x6B, + + 0xCB,0xFD,0xE3,0x49,0x80,0x68,0x43,0x80,0x6B,0x4C,0x95,0x31,0x58,0x8D,0x51,0x59, + + 0x2A,0x6E,0x4F,0xBD,0x38,0xEB,0x4B,0x34,0x6A,0x4D,0xE5,0x21,0xE6,0x94,0xFA,0xB2, + + 0x1A,0x41,0xE2,0xFC,0x3A,0x8D,0x92,0xEC,0x68,0x46,0xDA,0x64,0xD8,0x80,0xF2,0xC3, + + 0x30,0x4A,0x0A,0xDC,0x55,0x6F,0x8E,0x79,0x20,0xCE,0x98,0x9A,0x68,0xEF,0x3C,0x0E, + + 0xB9,0x05,0x54,0xC9,0x98,0xDD,0xD3,0xAF,0xA2,0xE5,0x7E,0x0F,0x98,0x75,0xB7,0xD1, + + 0x2E,0x99,0x8F,0x1D,0x98,0xAE,0x3F,0x88,0xA1,0x57,0x63,0x9D,0xD7,0xE4,0x4E,0x7B, + + 0x83,0x75,0x30,0x66,0xF8,0x79,0x95,0xC2,0x23,0xEF,0x9A,0x26,0xE5,0x7C,0x34,0x40, + + 0xFE,0x1E,0xEA,0xF1,0x32,0x9A,0x24,0x60,0x9A,0x5E,0x99,0x30,0x63,0x3A,0x3D,0x51, + + 0x5E,0x1D,0x82,0xF6,0xE8,0x5C,0x6D,0x23,0xE5,0x82,0x55,0xC0,0x35,0x69,0x6D,0xD1, + + 0xA7,0x1E,0xAB,0xF5,0xE5,0x9E,0x7D,0xF5,0xE9,0x11,0xFD,0xFB,0x70,0x31,0xD4,0x86, + + 0x4A,0xBF,0x1B,0x8C,0xB2,0x74,0x94,0xB0,0x35,0x5C,0x16,0xE4,0x41,0xD1,0xE0,0x42, + + 0x27,0x1D,0x5C,0x50,0x0C,0x42,0x9C,0x70,0x41,0xEA,0x3A,0x96,0x30,0x85,0x9A,0x3E, + + 0x4B,0x2D,0x2D,0xF4,0x16,0x97,0x16,0x65,0xE0,0x08,0x6A,0x03,0x70,0x72,0x8C,0xA2, + + 0xD8,0x91,0x76,0x92,0xBD,0xC8,0x3D,0x72,0xF2,0x5A,0x84,0xC3,0x54,0x71,0x4C,0x76, + + 0x8B,0x7D,0x05,0x4B,0xF2,0x11,0x4F,0xCA,0xEA,0x10,0x0A,0x6A,0xD4,0x3A,0x36,0x48, + + 0xD2,0x16,0xB4,0x18,0x14,0x1C,0x7E,0xFC,0x71,0x1B,0xED,0xCE,0x05,0x62,0x3F,0x59, + + 0x17,0x15,0xCF,0xC9,0xBE,0x53,0x11,0x2D,0xDB,0x57,0x0B,0xFB,0xFE,0x98,0x6F,0xDD, + + 0xC9,0x96,0x74,0xBA,0x18,0xC4,0x46,0xDB,0x6B,0x13,0x6F,0x5B,0x0C,0xF8,0xC6,0x88, + + 0x68,0xB1,0x9F,0x15,0x1E,0xE7,0xAD,0xCF,0xCB,0xA3,0xF6,0x76,0xDB,0x6C,0x06,0xC1, + + 0xC2,0xA6,0xCF,0xAE,0xC0,0x7F,0x21,0xBF,0x96,0xEB,0xA6,0x1C,0x3B,0x80,0x1A,0x0E, + + 0x68,0x16,0x6C,0x30,0x0A,0x45,0x97,0xAC,0xF3,0x13,0x2F,0x8B,0x05,0xF4,0x2D,0x99, + + 0xA8,0xFF,0x14,0xB3,0x3E,0x5E,0x65,0x6B,0xEB,0x55,0xD5,0x9D,0x5C,0x79,0x7A,0x07, + + 0xA7,0x86,0xC0,0x42,0x4C,0xE2,0x60,0x17,0xE7,0xC6,0x8A,0xDD,0x2B,0x1F,0x48,0x56, + + 0x42,0x8E,0x01,0x54,0x13,0xB3,0x47,0xD0,0xC7,0xE9,0xA6,0xA6,0xAA,0x4C,0xA9,0xCF, + + 0x65,0x8D,0xF8,0x6C,0xB0,0xA4,0x3D,0x4D,0x65,0x48,0x71,0x5F,0xFB,0x4F,0x49,0x57, + + 0x05,0x8E,0x87,0x17,0x95,0xA3,0x04,0xB7,0xF6,0x0C,0xA5,0x70,0x0B,0xE9,0x25,0xA5, + + 0xFB,0x08,0x20,0xC3,0x2A,0x25,0x56,0x9B,0x20,0xBF,0x0F,0x80,0xD4,0xE0,0x6C,0xF2, + + 0xA6,0x07,0x28,0xD6,0x59,0x5A,0x73,0xF6,0x71,0x22,0x00,0xF4,0xD7,0xC2,0xA5,0xC6, + + 0x88,0x0C,0xEB,0xC3,0x94,0xEB,0x75,0x8F,0x40,0xFD,0x90,0x05,0xE5,0x43,0x30,0xF4, + + 0x22,0x58,0x89,0xD4,0x86,0xAA,0x47,0x8B,0x48,0x41,0xC1,0x17,0x99,0xAA,0x68,0xF7, + + 0xAF,0xED,0xA2,0x8C,0x89,0x24,0x52,0x6E,0x48,0xC5,0xB1,0x3D,0x75,0x38,0x4A,0x5A, + + 0x0B,0x84,0xAA,0x1E,0x1D,0x24,0xB2,0x2E,0xEC,0x43,0x65,0x3F,0x5B,0x70,0x1B,0xDB, + + 0x7B,0x85,0x63,0x87,0x55,0xAA,0x79,0xD0,0x6F,0xCC,0x6E,0x2E,0x3D,0x55,0x61,0xF4, + + 0x2E,0x86,0xCB,0x51,0x6B,0xA4,0x44,0xD9,0x4F,0x83,0x67,0x2E,0x85,0xCA,0x63,0x2C, + + 0xF1,0xE0,0x99,0x69,0xBF,0xC0,0x72,0xAA,0x3A,0x67,0x0D,0x92,0x5E,0xE1,0x37,0xE8, + + 0xA0,0x9F,0x6F,0xB6,0x4E,0xE0,0x25,0x32,0x3C,0xEB,0xBC,0x00,0xDD,0xE9,0x3A,0xAF, + + 0x2B,0x78,0x04,0x35,0x48,0xA4,0xA1,0x6A,0x72,0x75,0x8C,0x97,0xDE,0xAC,0xD3,0xC5, + + 0x95,0xE0,0xBB,0x3C,0xD7,0x04,0xA4,0x23,0xB8,0x89,0x37,0x1D,0x24,0xAD,0x5C,0xA5, + + 0x87,0x96,0x64,0x5A,0x95,0x1D,0x33,0x26,0x57,0xDD,0xB0,0x2E,0xD3,0xB2,0x4C,0xD6, + + 0x10,0x1C,0x39,0xE5,0x10,0xB8,0x71,0x30,0x60,0x33,0x7C,0x3E,0x52,0xF7,0x2D,0xA4, + + 0xE4,0x9D,0xA2,0xF6,0x99,0xB9,0xEA,0xD3,0xE2,0x69,0x29,0xE0,0xC7,0xC2,0x55,0x11, + + 0xAC,0xD7,0x2E,0x64,0xED,0x1E,0x05,0x4C,0x24,0xB1,0x14,0xE5,0xF3,0x9A,0x3D,0x9A, + + 0x83,0x1E,0x4C,0xE7,0xB4,0xB0,0xF4,0x24,0x0E,0xD5,0xD4,0x68,0xD7,0x78,0xFC,0x56, + + 0x2D,0x8E,0xFE,0xF6,0x57,0xF5,0xAB,0x76,0x65,0x37,0x55,0xBC,0xD4,0xF3,0xE1,0x23, + + 0xA2,0xF8,0x6E,0xA5,0xB8,0xF0,0x63,0xDB,0xE0,0xD4,0xBF,0xFA,0xB6,0xF0,0xAD,0x7F, + + 0x49,0x3A,0xC9,0x0E,0x35,0xB3,0x82,0x34,0xE1,0xF5,0xDD,0x79,0x56,0x7D,0x1E,0xDA, + + 0x28,0x97,0xB8,0x7C,0x7C,0x47,0xF2,0x7A,0x60,0xDB,0x5E,0x2A,0x51,0x94,0xD1,0x18, + + 0x0F,0xEC,0x6E,0xE6,0x12,0x14,0x3A,0x3E,0x5E,0xE4,0x29,0x56,0x9F,0xB6,0x7D,0x8A, + + 0xAA,0x81,0x9D,0x60,0xC7,0x45,0x0F,0xBF,0x6E,0x92,0x77,0x3A,0x0E,0x77,0x17,0xCB, + + 0xED,0x94,0xB5,0x0F,0x42,0x16,0x80,0xE9,0xE3,0xB9,0x04,0x0F,0xF5,0xE9,0x3D,0x0D, + + 0xEC,0x9C,0xED,0xAC,0x9A,0x11,0xFE,0xAA,0x30,0x9E,0x71,0xFE,0xFC,0xA0,0xCA,0x2B, + + 0x49,0xBD,0x06,0xBC,0xFE,0x37,0xB8,0x05,0xED,0xFB,0x1B,0x9C,0xBE,0x77,0x2F,0x56, + + 0xA8,0xFC,0x07,0xEB,0x3C,0xBA,0x37,0x25,0xE8,0xDC,0xDA,0x0D,0x7C,0xFA,0xDA,0x32, + + 0xA9,0x17,0x68,0x2E,0x1C,0xEF,0x76,0x99,0x1C,0xBA,0x78,0xEF,0x7D,0xA3,0xA9,0xE2, + + 0x82,0x04,0x5D,0x8D,0x16,0x22,0xD0,0xE5,0xE1,0x9F,0xEF,0x7E,0xA5,0xFC,0x0A,0x92, + + 0x94,0x7D,0xE0,0x76,0xE6,0x2F,0x30,0x52,0xBC,0x4D,0x80,0xB5,0xB8,0x9A,0xE4,0x63, + + 0xC3,0xF2,0x5F,0xC7,0x31,0xDD,0xA5,0x43,0x3F,0x9F,0xAF,0xD8,0xB1,0x37,0x71,0x63, + + 0x7E,0xFE,0xB1,0xEE,0x12,0x2E,0x21,0x42,0xAF,0x01,0x83,0x9A,0xF0,0x13,0xEF,0x2F, + + 0xDF,0xA0,0xF8,0x14,0x16,0x2B,0x2E,0x66,0xA3,0xC7,0x09,0x02,0x6E,0x76,0x68,0x63, + + 0xE2,0xAA,0xF0,0xAB,0x91,0x39,0x06,0x92,0x03,0xE8,0xF8,0xE6,0xD3,0x6F,0x11,0xE9, + + 0xCA,0x05,0x51,0xC7,0x5F,0x2B,0x75,0x92,0x4E,0x07,0x69,0xC9,0x5F,0xEF,0x19,0x6E, + + 0xA1,0xFA,0xAA,0x37,0x1C,0xD1,0x48,0x43,0xA3,0x46,0x5D,0x33,0xFF,0x26,0x59,0x08, + + 0x37,0x28,0xF9,0xCB,0x1E,0x3A,0x52,0xB3,0xBF,0xE5,0xAC,0xD1,0x39,0x1D,0x58,0x1A, + + 0xBE,0x4B,0x58,0xFC,0x1D,0x47,0x24,0x99,0x3F,0x0B,0xE8,0x92,0x53,0xE4,0x11,0x8E, + + 0x33,0x97,0x08,0x4D,0xDC,0x87,0xC3,0x14,0x23,0x0E,0x8B,0x3C,0x31,0x91,0x4D,0x33, + + 0x62,0x08,0x1B,0x99,0xDB,0x52,0x5B,0x99,0x32,0x45,0xE5,0x8C,0x32,0xA8,0xEE,0xDA, + + 0x4A,0x06,0x52,0x8B,0x98,0x30,0x2C,0x6E,0xA3,0x43,0x89,0x6C,0x21,0xEC,0x33,0x2E, + + 0xFC,0x4F,0xE3,0xC7,0xBA,0xFB,0xCA,0x88,0xA1,0x9C,0x63,0x22,0x5D,0xAF,0x53,0xB9, + + 0xE0,0xFF,0x20,0x2F,0x44,0x28,0x01,0xFB,0x21,0x2A,0x7C,0x02,0x07,0xB2,0x09,0xDB, + + 0x70,0x61,0x5B,0xDF,0x1B,0x97,0x25,0x7F,0x2A,0xCC,0x95,0xBA,0xE8,0xF4,0x1E,0xBF, + + 0x41,0xCB,0x50,0xDA,0xA3,0x0F,0x3C,0xC2,0x9D,0x5C,0xF2,0x00,0xC5,0xD6,0x0C,0x14, + + 0x6B,0xCC,0xE4,0xF6,0xCE,0x3F,0x5C,0x2B,0x96,0xFC,0xC8,0xBB,0x57,0xD5,0x05,0xBA, + + 0xC9,0x89,0x78,0x01,0xBA,0x38,0x2D,0xD2,0x8E,0x10,0xC1,0x65,0xBC,0x26,0xB2,0xA0, + + 0x00,0xEC,0xB5,0x6B,0x32,0x3E,0x4F,0x8C,0x0A,0x17,0xCD,0x04,0x7E,0x0E,0x06,0x42, + + 0x24,0x16,0x54,0x46,0xB2,0x8D,0x2D,0x30,0xC1,0x48,0x2C,0x82,0xFD,0xF2,0x5E,0x42, + + 0xB2,0x5A,0xAC,0x74,0x2D,0x74,0x55,0xD4,0xB9,0xC8,0x48,0xD0,0xA6,0x28,0x89,0x45, + + 0xAC,0x82,0xFD,0x97,0xF1,0xC6,0xEA,0xB3,0xA1,0xA6,0x16,0xA5,0x90,0x3A,0x4C,0xAE, + + 0x04,0x55,0xDB,0xB7,0xD3,0xB3,0x47,0xF3,0x50,0xDC,0x76,0xAA,0x4E,0x8B,0xBD,0x2D, + + 0xDF,0xE5,0xF9,0x4E,0x99,0xA7,0x28,0x0D,0x1E,0x1A,0xF0,0x1C,0xCD,0xDE,0xB5,0x28, + + 0x97,0xB6,0xC6,0x89,0xD0,0xFA,0x26,0x47,0xEA,0x54,0x4A,0xB3,0x1B,0xDD,0x15,0x09, + + 0x43,0x8A,0x2B,0x09,0xAA,0xE2,0x57,0x09,0x13,0x54,0x43,0xED,0xB4,0x2E,0x8A,0xBD, + + 0x7D,0x38,0xFD,0x9C,0xBD,0x55,0xE4,0x3D,0xD6,0x2C,0xCF,0x09,0x10,0x78,0x04,0x4A, + + 0x2C,0x1E,0xBF,0xAA,0xCD,0x2C,0x76,0x62,0x4E,0x53,0x8D,0xEC,0x01,0x3C,0x5C,0x4E, + + 0xBA,0x52,0x4E,0x3E,0x97,0xB0,0x5F,0x8E,0x4F,0x3F,0x83,0x9A,0x88,0x6D,0xDF,0x4D, + + 0xA4,0x8A,0x7F,0x32,0x9E,0xB5,0x0E,0xEF,0x0F,0x81,0x17,0x79,0xB1,0x65,0x4E,0xA6, + + 0x0C,0xBF,0xB7,0xF9,0x39,0x37,0x9B,0x29,0x95,0xDE,0x67,0x06,0x76,0x64,0x6A,0x17, + + 0x25,0x60,0x5B,0x3C,0x26,0x15,0x08,0xDD,0xC7,0xCD,0x8E,0xCF,0x16,0x4F,0xA8,0xD4, + + 0x2D,0x0A,0x92,0xEC,0xEE,0x3C,0x9B,0x9A,0x99,0xF2,0x62,0x2F,0xDC,0x72,0x1F,0xA3, + + 0x67,0x8B,0xF4,0x83,0xDE,0x7F,0xCA,0xA7,0xFB,0xB5,0x67,0xD4,0xE6,0xA0,0x02,0x2E, + + 0x83,0xDA,0x81,0x75,0x6C,0xAF,0x1F,0x83,0x41,0x67,0x83,0xC4,0xF7,0x4E,0x83,0x02, + + 0x5A,0x0F,0xD8,0xC3,0x18,0xC6,0xDA,0x91,0xCA,0xC9,0x48,0xF9,0xA3,0x6D,0x57,0x04, + + 0x64,0x26,0x17,0x34,0x6B,0xAA,0x2A,0xD6,0xB4,0x78,0xB0,0x6A,0x64,0xBE,0x37,0x7E, + + 0x35,0x4A,0x71,0xAF,0x76,0xEB,0x63,0x63,0x3D,0x4B,0xD1,0xE3,0xE3,0x7B,0x7F,0xF3, + + 0x34,0x4B,0x79,0x35,0x24,0xC2,0x63,0x76,0x2C,0x83,0x41,0x4A,0xC5,0xAA,0x5C,0x79, + + 0x2E,0x87,0x9A,0x70,0x9D,0xA5,0xE6,0x2D,0x27,0xC7,0xE2,0x69,0x96,0xD3,0x3A,0x3B, + + 0x4D,0x04,0x7F,0x20,0x2B,0xB2,0x7F,0x27,0xEC,0x16,0x7A,0xBE,0x52,0xAB,0xA4,0xB4, + + 0xCC,0x64,0x1C,0x4D,0x3D,0x07,0xB3,0x58,0xA2,0x88,0xFB,0xFF,0x35,0xE9,0x72,0x2D, + + 0x2A,0x29,0x2B,0x58,0xB3,0x77,0x8F,0x59,0x32,0x16,0x7B,0x57,0x62,0x87,0xD9,0x1C, + + 0x52,0x88,0xDA,0xB1,0xF7,0x16,0x51,0x6D,0x6A,0x81,0x21,0x29,0x3F,0xE8,0x3A,0xE8, + + 0x4F,0xA3,0x7A,0x0C,0x5C,0x5D,0xED,0x82,0x4F,0x8F,0xA3,0x4C,0xFA,0x12,0x8A,0x5A, + + 0xAC,0x23,0xF5,0x2D,0xF6,0xA3,0x8C,0x97,0xCE,0x7B,0x91,0x6D,0xDD,0xAC,0x51,0xA8, + + 0xAD,0xCD,0xB5,0xBD,0xBF,0x2A,0x3D,0x05,0x3A,0x43,0xA2,0x40,0x7A,0x1E,0x83,0x26, + + 0xF4,0xF3,0x34,0x97,0x5A,0x94,0x97,0x0E,0xB8,0xA3,0x74,0x26,0x51,0xB2,0x16,0x61, + + 0x4B,0x3C,0xFA,0x6E,0x35,0xEA,0xFC,0x33,0x3C,0x93,0xDB,0xD8,0xA7,0xFB,0x02,0x33, + + 0x38,0x31,0x38,0xC0,0x90,0xA9,0x86,0x0B,0x18,0xE1,0x75,0xCF,0x4B,0x9E,0x7B,0x03, + + 0x5A,0x3E,0x3D,0x7E,0x52,0xF1,0xFD,0x22,0x64,0xDE,0xB8,0xED,0x40,0x6F,0x34,0xB1, + + 0x04,0x13,0x12,0x36,0x3E,0xBB,0x70,0x19,0x87,0xB7,0xAF,0x80,0xAC,0x4B,0x12,0xEF, + + 0xD3,0x04,0xF4,0xD2,0x9E,0xCA,0xFB,0x10,0xCB,0x58,0x50,0x8D,0xA9,0x28,0x67,0x08, + + 0x82,0x9B,0x75,0x2F,0x4E,0xFB,0x0E,0xC7,0x27,0x5C,0xB4,0x81,0x24,0x69,0xDA,0xEA, + + 0x3A,0x6A,0xD3,0x0A,0x96,0xF7,0x05,0xD7,0x1B,0x26,0xE7,0xF5,0x44,0x6A,0xF0,0xCD, + + 0xF2,0x90,0x62,0x87,0x3A,0xFA,0x09,0xE8,0xCD,0x05,0x99,0xC1,0xA5,0x5C,0xFE,0x9C, + + 0xE5,0xBA,0x7E,0x80,0x13,0x16,0x06,0x84,0x5B,0x2C,0x59,0xD0,0xAB,0xF1,0xA7,0xA8, + + 0xC5,0x3E,0xA0,0x91,0x96,0x15,0x1F,0xC9,0x11,0xD6,0xE7,0x1A,0x73,0x87,0x8B,0xE8, + + 0xC3,0xD9,0xFD,0x1B,0xBF,0xE6,0xEA,0xC9,0x1E,0x64,0xBA,0xE1,0x48,0x27,0xCB,0x84, + + 0xDB,0xC0,0xDA,0x21,0x0D,0x04,0x0D,0x11,0x99,0x9E,0xEC,0xEC,0xEC,0xF6,0x91,0xE4, + + 0x17,0x3D,0x13,0x36,0xD7,0xF0,0x06,0xDD,0x0C,0x2D,0x06,0xF6,0xD8,0xBC,0x5D,0x20, + + 0x1D,0xDF,0x5F,0xAF,0xBA,0x93,0xB1,0x4A,0x1B,0x9F,0x75,0x9D,0xCD,0x2B,0x7A,0x2B, + + 0xAE,0x4E,0x12,0x33,0xBF,0xA4,0x07,0x79,0xE6,0x02,0xFF,0xFF,0xFF,0xFF,0x59,0x33, + + 0xA5,0xDF,0x31,0x80,0x12,0xC2,0x2F,0x52,0xAB,0x31,0x50,0xA0,0xE4,0x0C,0xB0,0x8B, + + 0x07,0x58,0xB0,0x29,0xEE,0x27,0x66,0x0D,0xAA,0x90,0x9E,0xB0,0x5F,0xEE,0x7E,0x46, + + 0xB3,0x99,0x7E,0x87,0x01,0x17,0x6F,0x19,0x2B,0x41,0x76,0x5F,0x06,0x68,0xB0,0xD1, + + 0x8D,0xF8,0xA0,0x3F,0x30,0xF0,0x67,0x08,0x75,0x52,0xB9,0x35,0xE2,0xA5,0x80,0xC0, + + 0xDB,0x0E,0xBF,0x37,0xB1,0x77,0xB7,0x1A,0x94,0x4E,0x89,0xCB,0x54,0xB5,0x70,0xAF, + + 0x05,0x0C,0xD6,0xB6,0xF3,0x81,0x62,0x9B,0x45,0x67,0xE5,0x36,0xF2,0x38,0x5B,0xC3, + + 0x47,0xA5,0xBA,0x36,0xE2,0x82,0xD5,0x9C,0xCA,0x07,0x2A,0x0F,0x53,0x6B,0xE9,0x91, + + 0x8F,0xFC,0xB1,0xED,0x78,0x94,0xDD,0xE1,0x3C,0x7A,0xF1,0x17,0x6E,0x6B,0xFD,0x2C, + + 0x28,0x29,0x2E,0x89,0xEF,0xD5,0xAB,0xEF,0xD6,0x42,0x29,0xCA,0x48,0x95,0x53,0xD4, + + 0xAC,0xFF,0x31,0xFA,0x09,0xD4,0xA3,0xBC,0x53,0xB9,0x5A,0xAC,0x05,0x2B,0xC2,0x77, + + 0x77,0x66,0x47,0xF2,0xAB,0xAC,0xC4,0xAD,0xFD,0xCD,0x6B,0xA9,0xD6,0x1B,0x4A,0x7F, + + 0x4B,0x0B,0x73,0xF5,0x0B,0xF6,0x23,0xCA,0xF1,0x2E,0xDB,0xA8,0x26,0x6D,0x46,0x6C, + + 0x88,0xC0,0x6D,0x23,0xC7,0xF0,0xFE,0xF7,0x49,0xF4,0xEA,0x1F,0x7C,0xCD,0x74,0xB1, + + 0x49,0xF2,0x13,0x73,0x1D,0xC6,0x1A,0xED,0xB4,0x70,0x0E,0x82,0xA6,0xEC,0x15,0x2B, + + 0xCA,0x31,0x7A,0x13,0xA5,0x2C,0x93,0xE9,0xB4,0x0C,0xEB,0x92,0x33,0x4D,0x76,0x1E, + + 0x55,0x05,0x99,0xAC,0xE3,0x5A,0x9B,0xF9,0xEE,0x0D,0x9B,0x82,0x2E,0xEC,0xD9,0x81, + + 0x5B,0xA0,0x7C,0x00,0x32,0x6E,0x6A,0x00,0x89,0xA1,0xCD,0x3E,0xD5,0x8F,0xB3,0xDF, + + 0xAC,0x6C,0xD5,0xA1,0x94,0xAE,0x4A,0x8C,0x8A,0x80,0x33,0x52,0x61,0x8C,0xC5,0x4D, + + 0xB2,0x6E,0x45,0x05,0xFE,0xCD,0xC6,0x52,0x9C,0xEF,0x94,0xC3,0xC3,0x77,0x6B,0xB9, + + 0x2E,0x95,0x8C,0xF3,0x4A,0x5F,0x26,0x00,0x99,0xFC,0x65,0x5D,0x67,0x3E,0x54,0x3F, + + 0xA0,0x08,0x57,0xEA,0x4A,0xC1,0x2B,0x27,0xBC,0xC9,0xE9,0x5D,0x89,0x69,0xB7,0xBB, + + 0x25,0x17,0x12,0x64,0xDA,0x44,0x98,0x49,0x65,0x57,0x1C,0x7C,0xC9,0xD8,0x74,0xA3, + + 0xC0,0x16,0x95,0xFB,0xCE,0x74,0xB6,0x21,0xEC,0x14,0x86,0x1F,0xC1,0x01,0x81,0x55, + + 0xA1,0x14,0x0D,0xE8,0x21,0x96,0x9B,0xC1,0xC3,0xA8,0xCE,0xC4,0xD5,0xD8,0x82,0xC8, + + 0x24,0xE3,0x61,0xF6,0xEE,0x32,0x01,0xA4,0xE8,0xCF,0x69,0xA4,0xDD,0x63,0xB7,0xDF, + + 0xE3,0x08,0xAE,0x9C,0x0A,0x6F,0x29,0x84,0x99,0xE8,0x21,0x5A,0x12,0x92,0xFC,0xAD, + + 0x49,0x45,0x81,0x09,0xB6,0xB5,0xA0,0x09,0x1C,0xAB,0x27,0xF2,0x5F,0x6A,0x47,0x85, + + 0xAF,0x42,0xAF,0x39,0xBF,0x39,0x46,0xBC,0xEF,0x49,0x9D,0xCF,0x06,0x86,0xAA,0x57, + + 0xDB,0xCA,0x55,0x3F,0x4E,0xE1,0x6C,0x54,0x9D,0x32,0x06,0x9E,0x10,0x5F,0x19,0x5C, + + 0x29,0x1E,0x0E,0xE1,0xFD,0x9C,0x56,0xE8,0x23,0xFE,0xFE,0x63,0x5F,0x7B,0x0F,0xD1, + + 0xAC,0x7C,0x91,0xF4,0x51,0x8F,0x68,0x76,0x1B,0x88,0xA9,0x4C,0xB2,0x2F,0xA3,0x46, + + 0x5A,0xC9,0x9F,0x2E,0x99,0xE2,0x7F,0xFC,0xF3,0x77,0x57,0xEA,0x1A,0x70,0x28,0x07, + + 0x7B,0x5F,0x58,0x0E,0xE9,0xEF,0x08,0xD1,0x70,0x61,0x50,0x7E,0xF5,0x7F,0x2A,0xE3, + + 0xA6,0x91,0xF0,0xA6,0x26,0x20,0x2D,0x83,0x79,0x6E,0x83,0x8A,0xD8,0x83,0xB1,0xEB, + + 0x34,0xCF,0x9F,0xFA,0xF5,0x7A,0x22,0xD0,0xB4,0x6F,0x05,0x45,0xA8,0x1D,0x1B,0xEC, + + 0xA1,0x98,0x69,0x93,0x21,0xCD,0xAC,0x5D,0x85,0xFC,0xE4,0xAD,0x7A,0x1E,0xFE,0x29, + + 0x00,0x86,0xBE,0x7A,0x14,0x0F,0x30,0xC2,0xC9,0x32,0x45,0x98,0xBF,0x75,0x84,0x2D, + + 0xDD,0x58,0xA8,0x45,0x67,0xF4,0xB8,0xF7,0x61,0x87,0xC1,0x8E,0xB5,0xA7,0xE2,0xC7, + + 0x80,0x7F,0x76,0x68,0xFD,0xA5,0x4A,0xFD,0xC5,0x05,0x0C,0x8B,0xD6,0x5D,0x0A,0x93, + + 0xE9,0xC5,0xD7,0x7B,0xB6,0xB4,0x39,0xD3,0x4A,0x31,0x61,0xFB,0x54,0xEA,0x13,0x6C, + + 0xF3,0xF3,0x45,0x74,0xCA,0xA0,0xCD,0xD6,0x4C,0x5D,0x76,0x27,0xF3,0xF3,0xE3,0x92, + + 0xD1,0x98,0x8A,0x1E,0x2E,0x6F,0x7C,0x44,0xAC,0x56,0x02,0xD6,0x8B,0x15,0xDC,0x79, + + 0x77,0xC8,0xA5,0x8B,0x92,0x25,0x26,0x10,0xF8,0x88,0x51,0x49,0x23,0xFA,0x72,0x31, + + 0x28,0x74,0x10,0xF9,0x8D,0x56,0x44,0x48,0xEF,0x3A,0x43,0x37,0x20,0xA4,0xA6,0xEE, + + 0x08,0x8E,0xDC,0xEE,0x7E,0xEC,0x49,0xF4,0x4F,0x9D,0x0F,0xAC,0xFF,0xB3,0x09,0x1A, + + 0x33,0x8B,0x91,0xAF,0x6D,0xAD,0xBA,0xFA,0x01,0x4C,0xC2,0x94,0xE2,0x1C,0xA5,0x0C, + + 0x54,0x53,0x9C,0x3D,0xF4,0x5F,0x4E,0xEF,0xCC,0xA4,0x9B,0x0D,0x65,0xE0,0x42,0x70, + + 0x2E,0x0E,0xCD,0x72,0xE5,0xDA,0x6B,0xFF,0xCD,0x1D,0x04,0x11,0xA9,0x30,0x56,0x06, + + 0x11,0x47,0x4D,0x02,0x36,0x52,0xEC,0xBD,0x46,0x04,0xA2,0xC4,0x14,0x76,0xBC,0x9E, + + 0xA5,0x0C,0xD7,0x9E,0x90,0x0E,0x2B,0x8C,0x59,0x24,0x04,0x4D,0x88,0xB3,0x2D,0x86, + + 0xDB,0x4D,0x5A,0x6F,0xD4,0xFF,0xA2,0xB8,0x90,0x46,0xCC,0xC1,0x07,0xE2,0xF4,0x8A, + + 0x10,0xFD,0x41,0x08,0x44,0x65,0x2E,0xFC,0x18,0xAF,0x7D,0x5E,0xF3,0x91,0x6C,0xD2, + + 0x6E,0x37,0xB2,0xFB,0xDD,0x45,0xD5,0x91,0x0C,0x53,0x94,0xA2,0x48,0xFB,0x2D,0x56, + + 0x2D,0xF5,0xD6,0x25,0x1D,0x1A,0xEC,0x0F,0x6F,0x94,0x7C,0x14,0xF5,0xDD,0x45,0xE7, + + 0xBE,0xBE,0xA3,0xEB,0x36,0x3A,0x71,0xE6,0x99,0xD6,0x95,0xA6,0xB2,0x7D,0x92,0x57, + + 0x86,0xD3,0x3D,0x3F,0x09,0xF5,0xBD,0xCE,0x3B,0x7A,0xFF,0xE7,0x54,0xF1,0xC3,0xCA, + + 0x78,0xDA,0xAE,0x9F,0x3A,0xDA,0x9F,0xD4,0xF9,0x55,0x7A,0xB3,0x82,0xE8,0xDD,0xDA, + + 0x21,0x62,0x4F,0xE0,0x9A,0xA9,0x8D,0x87,0x6B,0x3B,0xE8,0x3C,0xEC,0xAC,0xBE,0x39, + + 0xAA,0xC3,0xDD,0x8D,0xBC,0xA1,0x4A,0x41,0x10,0xD9,0x0E,0x8B,0x1D,0x55,0xD4,0xBF, + + 0xBB,0x9F,0x10,0x79,0x8E,0x5A,0x4C,0x9F,0xEB,0xD9,0x87,0x41,0x51,0xF6,0x6E,0xCF, + + 0x51,0xBC,0xA7,0x38,0x3E,0xBC,0x68,0x7A,0x85,0xAD,0xFA,0x91,0x1D,0x5C,0xAE,0x5A, + + 0x61,0x62,0x7F,0xAD,0x0B,0xD1,0x6D,0x89,0x06,0x76,0xC6,0xAE,0x7B,0xF2,0xF7,0x4F, + + 0xA8,0xA4,0xE7,0xCF,0x5F,0x11,0x49,0x9B,0xAC,0x71,0x8F,0x6D,0xF7,0x23,0xAF,0x5B, + + 0x8B,0xF3,0x89,0xF2,0xBC,0xE5,0x07,0xFF,0x0F,0xAE,0xC7,0xAF,0xF7,0xF0,0x60,0x40, + + 0x46,0x8D,0x4F,0x66,0x51,0x00,0x34,0x42,0x01,0x60,0x44,0x46,0x13,0x1F,0xB3,0xF2, + + 0xAD,0xFC,0xB0,0x44,0x10,0x2E,0x20,0x60,0xC1,0x4E,0xE0,0x56,0x10,0x21,0x79,0x83, + + 0x81,0x85,0xF9,0x87,0xB2,0x57,0x69,0xA3,0xC5,0x46,0xE9,0x47,0x91,0x42,0x71,0x93, + + 0x88,0x47,0xE9,0xB5,0xD9,0x2E,0x79,0x75,0x86,0xC8,0xE1,0xC8,0x66,0x21,0x9F,0x22, + + 0x20,0x49,0x1D,0xC2,0xCE,0x07,0x09,0x41,0x44,0xC6,0x0F,0xE2,0xBB,0xED,0x68,0x55, + + 0x05,0xAD,0xB7,0xAA,0x15,0xC7,0xE7,0xF5,0x5B,0x2A,0xA7,0xF0,0x3C,0x43,0x47,0xC5, + + 0xA0,0x06,0xFB,0xAE,0x21,0xB9,0xB7,0x88,0x40,0x29,0x2C,0x89,0xD2,0xEB,0xD7,0xD3, + + 0x41,0x06,0x9D,0xBD,0xDF,0x65,0x00,0x44,0x66,0x98,0xE3,0x8A,0x2E,0x0B,0x3A,0x58, + + 0x0C,0x07,0x88,0x04,0xBB,0x4D,0x96,0xCA,0xCA,0x00,0xCD,0xE5,0xDA,0x8B,0x6A,0x5C, + + 0x3C,0x82,0xDA,0x11,0xB8,0xA3,0x02,0xC8,0x36,0x46,0xC0,0xC3,0xFA,0x0C,0x39,0x8D, + + 0xBB,0xF5,0xD9,0x10,0x3B,0x2C,0xDA,0xCB,0x4A,0x02,0x81,0x5F,0x7B,0x0F,0x0F,0xFB, + + 0x0B,0x03,0xF3,0xFF,0x1B,0x28,0xAF,0xC9,0x36,0x44,0xC1,0x28,0x7A,0x0E,0x7A,0xB7, + + 0xA6,0x17,0x83,0x91,0x8F,0xF1,0x53,0x0E,0x79,0xED,0xB4,0x1C,0x59,0x15,0xFE,0xDC, + + 0x01,0xAE,0x0A,0x38,0xC5,0x70,0xA6,0x07,0x45,0x7D,0xE2,0x86,0xF7,0x60,0x61,0xCD, + + 0x80,0x3D,0x6A,0x02,0x67,0x52,0x93,0xF9,0x04,0x7E,0x6C,0xE9,0xED,0x8F,0x15,0xBB, + + 0xCB,0xA2,0xB3,0x7A,0x26,0x20,0xA7,0x5D,0x17,0x1E,0xA4,0x0E,0xEE,0x10,0x3C,0xD0, + + 0x60,0x1F,0x13,0xE6,0x73,0xDC,0x6C,0x22,0x65,0x21,0x4B,0xD4,0xCC,0x79,0x08,0x72, + + 0xA3,0x19,0xC6,0x7E,0x92,0x37,0x14,0x35,0xC0,0xDB,0x6D,0xA4,0x98,0xBA,0x65,0xC5, + + 0xC0,0x99,0x8F,0x8D,0x13,0x3F,0x57,0x43,0xC4,0x54,0x93,0xD6,0x8F,0xF5,0xB1,0x73, + + 0x23,0x1B,0x5B,0x30,0x10,0xB9,0x62,0x53,0x40,0xD9,0xBD,0x9D,0xF7,0x11,0xEB,0x26, + + 0x32,0xE9,0x8C,0x41,0xCE,0xE5,0x2A,0xDD,0xEF,0x16,0xC6,0xF8,0x74,0x2F,0xB7,0xD8, + + 0x86,0xEA,0xB2,0x75,0xBE,0x93,0x0E,0x01,0x4D,0xAA,0xD4,0xED,0x10,0x53,0xBD,0x29, + + 0xCE,0x5B,0x05,0x31,0x71,0xEB,0xCD,0x03,0xA0,0xF9,0xC2,0x61,0xC5,0x5E,0x14,0xC7, + + 0x56,0x58,0x19,0x15,0xF7,0x93,0x03,0x51,0x1C,0xDA,0x4A,0x06,0x77,0xFA,0xB2,0x6A, + + 0xAA,0x10,0x69,0x6E,0xBA,0x70,0xEB,0x4A,0xEA,0x5B,0x2C,0x53,0x9A,0x5C,0x06,0x6F, + + 0x88,0x91,0xF6,0x1E,0x3C,0xE3,0x66,0xDA,0x2A,0x26,0xBE,0x35,0x84,0xFE,0xF3,0xFB, + + 0x0B,0x1C,0x9F,0xFF,0x1B,0x5F,0xA2,0xCB,0xA9,0xDA,0x91,0x5C,0x87,0x68,0x0B,0x7B, + + 0x2B,0x13,0x8D,0x7F,0x15,0x36,0x67,0x3B,0xCB,0x59,0x3F,0xAC,0x18,0xD4,0x47,0xB7, + + 0x8D,0x07,0x92,0x69,0xF2,0xED,0x28,0xD1,0x83,0xED,0x84,0xC2,0x91,0x18,0xF6,0x30, + + 0xBB,0xA1,0x5D,0x9F,0xBC,0x7F,0xDE,0x9B,0x74,0x1F,0xC4,0x6C,0x8C,0x80,0x84,0xAF, + + 0x51,0x0E,0x97,0xDC,0xC2,0x9E,0xFB,0x7A,0x96,0x56,0x8D,0xEC,0x59,0xD3,0xB7,0xD1, + + 0x52,0x50,0x57,0x87,0x1A,0xC0,0xC7,0x66,0x4A,0x80,0x73,0x63,0xF8,0xED,0xE4,0x60, + + 0x45,0xC0,0xE4,0xF6,0x4E,0xAF,0x50,0x82,0xF8,0xCD,0xEA,0xD9,0xF7,0xE6,0x50,0x90, + + 0x04,0xC3,0xE2,0xE8,0xB6,0xAC,0xB0,0xF7,0xE4,0x49,0xD8,0x76,0x44,0x61,0x59,0x61, + + 0xC5,0x02,0xC1,0x43,0x9B,0xAF,0x7B,0x9C,0x67,0xC4,0xE1,0x03,0x35,0xED,0x11,0x43, + + 0x8D,0x8C,0xE3,0xEC,0x36,0xA5,0xB9,0xD1,0x64,0x4B,0xC1,0xB3,0xA2,0x85,0x3D,0x70, + + 0x66,0x16,0x9E,0xE7,0xE3,0xAD,0x57,0x4F,0xDA,0x55,0x1C,0x1D,0xC8,0x6F,0x10,0x42, + + 0xEE,0xBE,0x28,0x32,0x84,0xA8,0xE0,0xC0,0xE6,0x6A,0xD8,0xFC,0x56,0xEF,0xA1,0xC2, + + 0xFE,0x2D,0x65,0xB6,0xBC,0x59,0x2B,0xC0,0xBA,0x84,0xD1,0x8D,0x27,0x6F,0x5B,0x63, + + 0xD1,0xC5,0x16,0x24,0xBD,0xC9,0xA9,0x34,0x0D,0xEC,0xA3,0xF1,0xAB,0x48,0x96,0x68, + + 0x4D,0x89,0x2A,0xDA,0xFD,0xA7,0x36,0xC8,0xCE,0x80,0x32,0xD6,0xA7,0x45,0x52,0x98, + + 0x0C,0xCB,0xCA,0x5A,0x72,0x22,0x5A,0x7E,0x3C,0xC6,0xFE,0x4D,0x22,0x60,0x5B,0x69, + + 0xCD,0x82,0xC3,0x4B,0x8B,0xA5,0x2E,0xDB,0xC4,0xC5,0x6C,0x5F,0x68,0xE3,0x13,0xCB, + + 0x76,0x84,0x3E,0xFD,0x1F,0xA2,0x5B,0x7A,0x03,0x4B,0x4E,0x5F,0xC1,0x46,0x26,0x73, + + 0x08,0xEE,0x05,0x0E,0x5A,0xEE,0x0C,0x56,0x25,0x3D,0x52,0x1C,0x3C,0xB9,0x33,0x7A, + + 0xAA,0x72,0x92,0x2D,0x6B,0xA4,0x38,0x0B,0x7B,0xC6,0x82,0x01,0x7E,0x9F,0xD9,0xF9, + + 0xF7,0x5F,0x7B,0x85,0x77,0x8D,0xF4,0x83,0x1A,0x03,0x8D,0x68,0xBD,0xCE,0x6A,0x3D, + + 0xBC,0x0B,0xAA,0x18,0x55,0x2C,0x7D,0x93,0x4F,0x02,0xA5,0x9D,0xDB,0x6A,0xD6,0xE0, + + 0x67,0x60,0xAE,0x82,0x97,0xB6,0x6E,0xBF,0xC7,0xD6,0x6B,0xA4,0x76,0x0D,0x24,0x34, + + 0x84,0x1B,0xD4,0x14,0x30,0x8A,0x44,0xE2,0x29,0xDE,0x63,0x3F,0xF5,0x11,0x2F,0xE3, + + 0x07,0x94,0x2D,0x6B,0xD7,0x92,0x65,0x8D,0x45,0x58,0xC7,0xA0,0xBC,0x59,0xAA,0xC3, + + 0xA7,0x9C,0xD5,0x15,0xB0,0x48,0x5D,0x13,0xAF,0x58,0x02,0x05,0x35,0x93,0x65,0xBC, + + 0x81,0x84,0xDA,0x63,0xB9,0x42,0xC0,0x80,0xD9,0x88,0xAA,0x04,0x72,0x09,0x64,0xB0, + + 0xD8,0xF0,0xC7,0xA5,0x19,0xBA,0xC4,0x0D,0x8E,0x04,0x25,0xCF,0x71,0xAE,0xDA,0x25, + + 0x24,0x5A,0xED,0xD3,0xB0,0xFF,0xCE,0xAD,0xD5,0xC4,0xC7,0xD7,0xF0,0xB4,0x55,0x3B, + + 0x77,0x6B,0xDC,0xEF,0x52,0x48,0xD1,0x6C,0xE6,0xA7,0xF1,0xB7,0xAF,0x7C,0x46,0xCA, + + 0x8E,0x13,0x9C,0x6C,0xBE,0xF0,0x32,0x48,0xEE,0xDB,0xE8,0x53,0x6A,0xBA,0x56,0x18, + + 0x2C,0x7B,0x26,0x9C,0x9C,0x33,0x5E,0x1A,0x3D,0x52,0xE3,0xB9,0xD2,0xE4,0xA0,0x69, + + 0x00,0x17,0x7C,0x9F,0x1F,0xBC,0xF3,0x5B,0xA0,0xD5,0x73,0xD9,0x4F,0x77,0x2D,0x79, + + 0x2F,0xD3,0x40,0x7D,0x3F,0x58,0xBB,0x59,0x6F,0x93,0xFA,0x58,0x7F,0xFF,0x9E,0xC2, + + 0xD3,0xD3,0xD8,0x6B,0xB1,0x4A,0x66,0x6A,0x7E,0xC7,0x12,0xD3,0x95,0xB8,0x2A,0x6B, + + 0x1C,0x4F,0x7E,0xE8,0x11,0x48,0x44,0x56,0xD8,0x28,0x5A,0x0E,0x77,0xF2,0x07,0x9D, + + 0x00,0xDC,0xEF,0xCA,0xC1,0x41,0xB2,0x8D,0xD2,0xA1,0xCD,0x5F,0x4A,0x51,0xD7,0x25, + + 0xBF,0xD2,0xBF,0xFB,0xC8,0xEA,0xAF,0xEA,0xC9,0x9D,0x78,0x9C,0x2B,0xBE,0xA3,0x28, + + 0xDC,0x31,0x41,0xF5,0x24,0x20,0x28,0xDA,0xEC,0x4D,0x2F,0x7F,0xAD,0x3F,0x9B,0x57, + + 0xCB,0x88,0xB6,0x3C,0x17,0xC9,0xCB,0xC3,0x75,0x2F,0xA2,0x98,0xA6,0xCA,0x3B,0xF2, + + 0xF4,0xAF,0xFF,0x28,0x10,0x40,0x86,0xD2,0xFC,0xDF,0xAA,0x15,0xD0,0x9D,0x01,0x15, + + 0x89,0x3D,0x82,0xEC,0x99,0x61,0x27,0x1C,0x0B,0x1A,0xE1,0x25,0x38,0x72,0x52,0xBB, + + 0x04,0x8F,0xBE,0x43,0xB3,0xFB,0x0F,0x06,0x61,0x04,0x84,0xE0,0x1F,0xD6,0x9C,0x6E, + + 0x25,0xB0,0xF9,0xD0,0x1C,0xD6,0xBF,0x12,0x60,0xC5,0x59,0x67,0x23,0x26,0x48,0x2E, + + 0x21,0xF3,0x75,0x27,0x10,0x3A,0xAE,0x45,0x40,0x5A,0x9B,0x64,0xAB,0x6F,0x1D,0x6B, + + 0xA1,0x1C,0x81,0xDC,0x7A,0x36,0x67,0xAD,0xE2,0x77,0xFF,0x4C,0xFD,0x7C,0x3C,0x79, + + 0xF3,0x93,0xCE,0x26,0xF1,0xB2,0x48,0x2A,0x21,0x19,0xA0,0x1C,0x7C,0x2A,0xDF,0x34, + + 0x62,0x9A,0x1B,0xEF,0x25,0x6B,0x91,0x3A,0x5F,0x25,0x2E,0x43,0xFA,0xC9,0x03,0xE4, + + 0xF8,0xA1,0x9B,0x1C,0x79,0x85,0x72,0x69,0x88,0x51,0x19,0xAF,0x2D,0x65,0x8B,0x26, + + 0xB1,0xDE,0x01,0xF4,0x70,0x5A,0x21,0xAA,0xFC,0xB4,0x8A,0x1C,0xBB,0xC0,0x46,0xCC, + + 0x18,0xF6,0xD4,0x2E,0x7A,0x39,0x68,0x9B,0x77,0x4A,0x8E,0x6E,0x4A,0xC8,0x6D,0xF9, + + 0xDB,0x0E,0xE7,0xAF,0x97,0x20,0xCA,0xFC,0x06,0xED,0x0E,0x94,0x26,0x20,0xE4,0xEC, + + 0x5E,0x4D,0xBD,0x4B,0x7B,0xAD,0x7A,0xF6,0x69,0xB1,0xC0,0xC9,0x12,0xDF,0x4D,0xE9, + + 0x0B,0x83,0x30,0x7A,0x3A,0x29,0x53,0x7D,0xE2,0xAE,0xA5,0xCD,0xCB,0x22,0x1E,0x82, + + 0xB2,0x18,0x15,0xA3,0x91,0x9F,0xA0,0xD3,0x18,0x5F,0x4E,0xA5,0x52,0x52,0x2A,0xBD, + + 0x59,0x0A,0x19,0xAA,0x05,0x73,0x9C,0x82,0x95,0x5E,0x23,0x85,0xD0,0xD0,0x87,0x92, + + 0x94,0x83,0x10,0xF7,0x4B,0xC7,0x2B,0xD0,0x8B,0x5D,0x58,0x21,0x8B,0xCF,0x6E,0xE7, + + 0x5E,0x7F,0x41,0xCC,0x65,0x62,0x0B,0x98,0x0A,0x62,0xA5,0x85,0x4B,0xDC,0x50,0x87, + + 0xE0,0xB6,0xFC,0x3E,0x9E,0x39,0x7D,0x1C,0x64,0x3E,0xEA,0x54,0x10,0x8B,0xDB,0xD2, + + 0x25,0xE8,0x60,0xAA,0xF1,0x55,0x14,0xD1,0x82,0xFA,0x08,0x67,0x0F,0xD8,0x0D,0xD0, + + 0xA4,0x9D,0xBA,0x41,0x8D,0x41,0x03,0x65,0xAF,0x74,0xAB,0x41,0x7F,0xDB,0xE1,0x43, + + 0x9F,0x1D,0x5D,0xCB,0xC3,0xC3,0xC0,0x73,0x72,0x42,0x0D,0x66,0x87,0x7D,0x38,0xB1, + + 0xF6,0x93,0x21,0xA1,0xC5,0xA7,0xAD,0x19,0x58,0xF7,0x36,0xDE,0x1A,0xF3,0x6F,0x58, + + 0x72,0xB4,0x71,0xEE,0x4B,0xE6,0x98,0x9C,0x02,0x68,0xFA,0xA3,0x57,0xAD,0x27,0x63, + + 0xC1,0x8B,0xB9,0xA1,0xD8,0x3A,0x06,0xB8,0x9C,0x7A,0xE9,0xAA,0xFE,0x68,0x11,0xA9, + + 0x56,0xE4,0x4F,0xC9,0x29,0xE6,0x9A,0x50,0x6D,0x36,0x4F,0xA6,0xD3,0xEF,0x06,0xF6, + + 0x4C,0xBC,0xD1,0xB7,0x1B,0xEC,0x6E,0x17,0xC6,0x51,0x54,0xFF,0x0E,0x3F,0x30,0xDE, + + 0xCA,0x9E,0x1C,0xD4,0x9E,0x92,0x26,0xDF,0x96,0x52,0xE0,0x59,0xB1,0x8C,0x95,0x39, + + 0x25,0xCF,0x9E,0x81,0x1F,0x91,0x37,0xA3,0x99,0xA2,0xF1,0xD0,0xD4,0x12,0x61,0x2A, + + 0x27,0xE2,0x19,0x5F,0x3B,0x45,0x3F,0xB2,0x5B,0x52,0xA1,0x58,0x12,0x3C,0x31,0x86, + + 0x3D,0xA6,0xD8,0x75,0x20,0xE2,0x0A,0xB0,0x44,0x1F,0x6F,0xD9,0xB5,0x4F,0xB8,0x55, + + 0xE4,0x27,0xAE,0x3E,0xFC,0xB0,0x83,0x42,0xC5,0xDE,0x78,0xF3,0x0C,0x35,0x1F,0x2F, + + 0xA6,0x6F,0x2B,0xEF,0x69,0xAD,0x9D,0x50,0xF8,0x34,0xFA,0x23,0xA9,0xFC,0xBC,0xE0, + + 0xB9,0x0E,0x05,0x85,0x97,0xAB,0x07,0x1F,0xA4,0xC7,0x28,0x28,0xE9,0xA2,0x5A,0xB1, + + 0x6C,0x2B,0xCD,0x6C,0x10,0xCE,0x4E,0x0F,0x65,0x84,0x8E,0xD7,0xDB,0x49,0x1F,0xBF, + + 0x77,0x3E,0x96,0x3B,0xE8,0xE4,0x49,0x10,0xB0,0xA0,0xAE,0x05,0x35,0x43,0xB3,0xBF, + + 0x4F,0x7D,0x36,0x07,0xDE,0x2B,0x51,0x56,0x44,0xDA,0xA7,0xF4,0xFC,0x49,0x96,0xD7, + + 0xF0,0xDA,0xEF,0x7F,0x17,0x70,0x41,0xF1,0x56,0x5C,0xA9,0x84,0xB5,0x8B,0x44,0x26, + + 0xE7,0xD9,0x55,0x7C,0xF7,0xB9,0x53,0xEA,0x04,0xD3,0x88,0xC6,0x80,0x27,0x3D,0x69, + + 0x7D,0x00,0xE5,0xDE,0x7C,0xEB,0x04,0x06,0x4B,0x92,0x10,0x8D,0xFC,0x85,0xCF,0x78, + + 0xB0,0x2C,0x9D,0x27,0x11,0x0C,0x3E,0x4D,0x8C,0x85,0xE3,0x36,0xC0,0xEC,0x0B,0xF1, + + 0x64,0xDA,0x21,0x15,0x3C,0x04,0xAD,0x48,0xBD,0xC4,0xD9,0xAE,0xDC,0xAB,0x32,0x53, + + 0x28,0x01,0xE4,0x23,0x61,0x8C,0xB2,0xAF,0x24,0x8E,0xCC,0xCB,0x94,0x4F,0xC6,0xB2, + + 0x93,0x4B,0x5E,0x3C,0xE4,0xEF,0x1A,0x31,0xFF,0xC0,0xF2,0x66,0xB6,0x4E,0x1D,0xFB, + + 0x67,0x0D,0x73,0xB0,0x3F,0x31,0xFD,0xEA,0xCF,0x8C,0xCD,0xCB,0x14,0x6D,0x23,0x1B, + + 0x89,0x04,0x36,0xF0,0xBB,0x50,0x80,0x5C,0x6E,0xC9,0xE9,0x80,0x34,0x8C,0x1E,0x32, + + 0xDB,0x4F,0xDC,0xA1,0xC9,0xBF,0xF4,0xF6,0x57,0x2D,0xE4,0xD4,0x9F,0x73,0x97,0x37, + + 0xD2,0x3C,0xBD,0xA4,0x55,0xF0,0xFC,0xE6,0x56,0x2C,0xE4,0x76,0x1F,0x5C,0x9A,0xB2, + + 0x05,0x6D,0xFB,0x65,0xF4,0x1F,0x4D,0x4B,0x68,0x9F,0x8B,0x17,0x79,0x54,0x38,0xAE, + + 0x4E,0xD7,0x6D,0xC3,0x37,0xBE,0x45,0xC1,0x0E,0xC2,0x69,0x67,0xFD,0x0C,0x1C,0xD3, + + 0x44,0x90,0xC4,0xDE,0x05,0x5C,0x8B,0xC5,0xC7,0xD2,0x92,0xDA,0x9D,0xB7,0x52,0x62, + + 0xAA,0x8E,0x54,0x25,0x59,0xB3,0xC8,0x8D,0xC4,0x58,0x6B,0x05,0x1D,0x58,0x09,0xB1, + + 0x4D,0x15,0x5D,0x34,0xD0,0xA6,0x5C,0x1F,0x3B,0xD9,0x59,0x94,0x9C,0x50,0xC8,0x45, + + 0xA4,0x47,0xCD,0x0F,0x16,0x28,0x03,0xDB,0x0E,0xC6,0xAF,0x64,0x83,0x58,0x18,0xA2, + + 0x5A,0x37,0x5D,0xA9,0x9D,0x24,0x08,0x82,0x4C,0xD5,0x09,0xBE,0xC3,0x73,0x16,0x65, + + 0xE5,0xA8,0xAA,0x1A,0x32,0x01,0x04,0x41,0x6B,0xF3,0xE4,0xF6,0xC0,0xF6,0x83,0xE9, + + 0x5B,0xFF,0x1C,0xD5,0x43,0x01,0xF3,0x2F,0xA1,0x42,0xC8,0x9E,0x9E,0xB8,0x8F,0x88, + + 0x9D,0xFF,0x84,0xE1,0x6C,0x07,0x0E,0xC8,0xBE,0xD2,0x81,0x0F,0x95,0xF0,0xA6,0x3A, + + 0x06,0xDE,0x26,0x9B,0x04,0x18,0xDA,0x79,0x55,0xD6,0xA4,0xD0,0x58,0x09,0xD1,0x38, + + 0x67,0x1E,0xD5,0x5A,0x72,0xEE,0x46,0xCA,0xDF,0x72,0x4D,0x4A,0x83,0x1E,0x3D,0xF6, + + 0x45,0xFA,0x9F,0xF3,0x55,0x4F,0xA2,0x98,0xDE,0x7F,0x23,0x6B,0xBB,0x27,0x4F,0xB5, + + 0x8B,0x84,0xC9,0x3D,0x9D,0x10,0xDF,0x89,0x8D,0xC3,0x84,0x04,0xF9,0x1D,0x54,0x7E, + + 0x81,0x0D,0x34,0x66,0xEB,0xDD,0x28,0x5F,0xC1,0x4D,0x24,0x46,0xAB,0x21,0x5A,0x2F, + + 0x6B,0x43,0xF6,0x12,0xF0,0xA2,0x19,0x46,0xFE,0x1D,0x98,0x09,0xAE,0xFC,0xBE,0x43, + + 0x21,0xD7,0x97,0x67,0xF0,0x26,0x48,0x27,0x25,0x9D,0xEF,0x22,0x71,0xF9,0x83,0x6D, + + 0x02,0x0E,0xA0,0xE6,0x1D,0xBE,0xA2,0x7F,0x20,0x7C,0x4A,0xCB,0xF5,0x65,0xDC,0x33, + + 0x3B,0x07,0x00,0x95,0x84,0x2C,0x90,0xB1,0x0D,0x06,0x8B,0xDA,0x54,0x2D,0xB9,0x13, + + 0x2E,0xA8,0xF0,0xAE,0xBF,0x28,0x0F,0xF4,0x08,0xAE,0x4F,0x26,0xA6,0x6A,0xFB,0x98, + + 0xE9,0xCD,0x07,0xC7,0x5F,0x3A,0x1F,0x78,0x40,0x33,0x10,0x16,0xE6,0x24,0x90,0xB1, + + 0xC0,0x01,0xB6,0xBD,0xB4,0x6A,0x99,0xA1,0x62,0x4A,0x6D,0x0A,0x70,0xCA,0xFD,0xCA, + + 0xA9,0xD7,0xFA,0x2B,0xE1,0x27,0x6B,0xEA,0xE9,0xB7,0x3C,0x77,0xF9,0xDE,0x6A,0x1A, + + 0x38,0x04,0xF3,0x7A,0xE6,0xA2,0xDC,0x82,0x4F,0x00,0xF9,0x18,0xDB,0x85,0xC3,0x9C, + + 0x7A,0x4B,0x13,0xFD,0xB7,0x5B,0x7B,0x4B,0x3F,0x08,0xF3,0x7A,0x09,0x67,0xF0,0x9B, + + 0x09,0xE2,0xBF,0x31,0x72,0x6F,0x21,0x46,0x6A,0x09,0x75,0x5F,0x03,0x6D,0xE8,0x08, + + 0xAB,0xD3,0xA5,0xB7,0x08,0x61,0x92,0xB9,0x6F,0x0E,0x47,0x97,0x29,0x6C,0x0E,0x98, + + 0x0D,0x4F,0x84,0xD2,0x1A,0xED,0x62,0x1A,0x2B,0xB5,0x88,0x81,0xDA,0xB6,0xF7,0x2B, + + 0x35,0x4C,0xA0,0xB7,0x17,0x6C,0x1D,0x70,0xCC,0xC4,0x0E,0x51,0xB1,0x1D,0x0D,0x1B, + + 0x2A,0xB2,0xAB,0x17,0x45,0xA4,0x22,0x89,0x4B,0x00,0x28,0xF9,0xE8,0x8B,0x66,0x95, + + 0x21,0x50,0x30,0xE6,0xCB,0xCD,0x90,0x91,0x0A,0xFF,0x54,0x20,0x54,0x7C,0xAC,0x83, + + 0x43,0x75,0xF2,0x92,0xD0,0xB2,0x62,0x00,0xE9,0xE2,0x27,0xF6,0xD0,0x8C,0x21,0xDB, + + 0x68,0xB1,0x93,0xE7,0xD0,0xB6,0x43,0xD3,0x8A,0xD1,0xAD,0xDE,0x71,0x7F,0xB9,0xF3, + + 0x5E,0x98,0xA4,0xB1,0x40,0x98,0x44,0xAB,0x04,0x55,0xB5,0xD7,0xCE,0xF3,0xBB,0x44, + + 0x01,0x2C,0x9D,0x9F,0x97,0x9B,0x6C,0x65,0x6C,0x36,0x45,0xE6,0xA4,0xAF,0xFD,0x54, + + 0x21,0xF7,0x9B,0x39,0x82,0x6E,0xDB,0x74,0x28,0x7C,0xC6,0x0C,0x73,0x37,0x0D,0x58, + + 0xA4,0x14,0x96,0xCD,0x17,0x99,0x1F,0x7C,0xC0,0x5B,0x64,0x18,0x00,0xC3,0x8D,0x51, + + 0x7A,0x1D,0xBF,0x2C,0xB1,0xAC,0x9D,0x21,0x10,0x15,0x04,0x86,0x2F,0x14,0x17,0xB9, + + 0x0A,0xB7,0xFE,0x88,0xBA,0x4D,0x38,0x4B,0xCB,0x43,0x56,0x2C,0x09,0x76,0x70,0x9F, + + 0xD4,0x16,0xB6,0xAC,0xE8,0x96,0xC3,0x3E,0xEB,0xF5,0x65,0x7E,0xD8,0xC6,0xA7,0xFB, + + 0xCA,0xD6,0xD0,0xA9,0x45,0x9B,0x32,0xDF,0x17,0x18,0xAF,0x52,0x7B,0x77,0x29,0x28, + + 0x2D,0xBF,0x2F,0xEF,0xDB,0xD7,0x6F,0xC6,0x4A,0x1A,0xF7,0xDF,0x0A,0x15,0xC7,0xBB, + + 0x13,0x1F,0x73,0x31,0x8B,0xE7,0x18,0x3C,0x6C,0xF6,0x75,0x48,0xA2,0x5F,0xFF,0xDA, + + 0x3B,0xB0,0xF0,0xAD,0x5B,0xE2,0xE1,0x18,0x26,0x5B,0x7B,0x8E,0xC0,0x62,0x79,0xD0, + + 0xC1,0xD5,0xB5,0x49,0xD5,0xBD,0x04,0x6D,0xA1,0xEE,0xF4,0x4D,0xFC,0x8F,0x52,0x79, + + 0x46,0x7F,0xB1,0xF0,0x5A,0x90,0x76,0xCF,0x4A,0xC0,0x68,0x58,0x0F,0x3C,0x18,0xF9, + + 0xF1,0x2F,0x9A,0xB6,0x85,0x0F,0xA8,0x50,0xC5,0xA4,0x1E,0xF0,0xF5,0x76,0x76,0xA2, + + 0x85,0x2A,0x28,0x94,0xA9,0x53,0x62,0x5C,0x2D,0xC2,0x78,0xB7,0x66,0xA3,0xF1,0x78, + + 0x6F,0xE1,0x05,0x23,0xFF,0xAD,0x19,0x25,0x65,0x3D,0x21,0xD6,0xB3,0x1D,0x7F,0x15, + + 0x07,0x4F,0x29,0x9E,0xC9,0xEE,0x47,0x35,0x24,0x40,0x68,0x80,0x3C,0x78,0x48,0x20, + + 0xF3,0x88,0xE4,0xA4,0x4A,0x59,0x76,0xAF,0x1A,0xC0,0x5C,0x8E,0xC3,0xA9,0xB5,0xDB, + + 0x01,0x87,0xC4,0x61,0x33,0x28,0xF7,0x4F,0xF4,0x88,0x38,0x4A,0xE6,0xEF,0x59,0x3C, + + 0x07,0x8B,0xFB,0x43,0xB7,0xE6,0xDB,0x11,0x39,0x4D,0x97,0x5A,0x3F,0x37,0x72,0x91, + + 0x26,0x78,0x97,0x6F,0x7C,0x16,0x61,0x83,0xC1,0x6D,0x7F,0x04,0xA3,0xA8,0x33,0xFA, + + 0x8C,0x87,0x59,0x06,0xB9,0x57,0x1C,0xD9,0xC0,0xC5,0xEA,0xE7,0xDE,0x24,0x76,0xF8, + + 0x66,0x8A,0x3F,0x1A,0x07,0x59,0x52,0x3C,0xCE,0xAD,0x82,0xD1,0x5B,0xCB,0x43,0x58, + + 0x31,0x27,0xFD,0xED,0x98,0x07,0xC8,0x6C,0x31,0x1C,0xBB,0x4D,0x2B,0x8F,0x2F,0x68, + + 0xAF,0xE7,0xD5,0x18,0x3C,0x34,0x43,0x2A,0xEF,0x40,0xF3,0xBB,0x9F,0x92,0x0A,0x28, + + 0xF9,0x82,0xBB,0x05,0xB9,0xBC,0xB8,0xEE,0x0D,0x53,0xF3,0x1D,0x22,0xA3,0x11,0x1D, + + 0x09,0x9F,0x99,0xB3,0x5C,0xF2,0x34,0xC2,0x49,0x67,0x84,0x47,0xBE,0x4E,0x5B,0xB0, + + 0x0D,0x83,0x1B,0xB3,0x2A,0x55,0xB3,0xBA,0xE7,0x8C,0xCD,0x42,0xB6,0x5F,0xE0,0x9B, + + 0xEF,0x02,0x94,0xDB,0xF0,0x89,0x7C,0xF9,0x4F,0x77,0xE8,0x8C,0xAF,0x4F,0x76,0x85, + + 0x88,0xF5,0x34,0xF9,0x5C,0xBD,0x6E,0x8B,0x18,0x7F,0x74,0x2E,0x21,0xF8,0x16,0x7C, + + 0x9E,0x8E,0x96,0x26,0xF8,0xF0,0x42,0xB5,0x41,0x4C,0xE4,0xFF,0x76,0x03,0x1D,0x70, + + 0x8E,0xED,0xB7,0x51,0x5F,0xF6,0x95,0xD1,0x86,0xA7,0x27,0x5A,0xFC,0xB0,0x9E,0x37, + + 0x59,0xF0,0xF7,0x9D,0xC9,0x1C,0x63,0x51,0xE1,0xD5,0x7D,0x37,0x8B,0xB1,0x3A,0x36, + + 0x98,0x30,0x75,0xB5,0x02,0xD8,0xC0,0x80,0x9D,0xBA,0x34,0x73,0x84,0xEF,0xFC,0xA0, + + 0xD8,0x68,0xD2,0xEF,0x5F,0xB8,0xA8,0x1A,0x44,0x98,0x43,0x10,0x53,0x9B,0xBF,0x3E, + + 0x5A,0x5D,0x83,0xB7,0xB5,0xCC,0xB5,0x32,0x3A,0xDE,0x59,0x99,0x51,0xE6,0xC1,0x40, + + 0xB0,0x9D,0x12,0xA4,0xC7,0xD4,0x1A,0x08,0xF5,0x9A,0xBD,0xC8,0xFF,0x9B,0x5D,0x71, + + 0x2A,0x7A,0x06,0xFC,0x5E,0xA4,0x83,0x0F,0x6A,0xEA,0xF6,0x3B,0x7A,0xDA,0xD7,0x71, + + 0x9E,0xDB,0xD6,0x9A,0xC0,0xFB,0x06,0x52,0x21,0x98,0xA7,0x1E,0xDC,0x10,0x73,0xF9, + + 0x93,0xDA,0xD9,0x88,0x98,0x11,0xB0,0xC9,0x1B,0xBF,0xBF,0x6F,0xE8,0x57,0xE9,0x3A, + + 0x58,0x97,0xEA,0x82,0x1C,0x24,0x41,0xBC,0x4C,0x44,0xE1,0x4B,0x41,0xD7,0x34,0x4E, + + 0x6D,0x91,0x1D,0xB1,0x5E,0xA1,0x15,0x10,0xE3,0x9E,0x96,0xAE,0x9A,0xF1,0x7B,0x58, + + 0x93,0xFE,0x15,0xAD,0x03,0xC2,0x1E,0xAD,0xAE,0xD0,0xE9,0x78,0x83,0x28,0x5F,0x35, + + 0x4D,0x97,0x18,0xB1,0xDC,0x39,0x39,0xF4,0xED,0x5F,0x89,0xD7,0x36,0x00,0xAF,0x0A, + + 0xC0,0x42,0x36,0xDF,0xC4,0xB3,0x04,0xDC,0x4E,0x60,0xEC,0xC0,0x87,0xBE,0xA7,0x29, + + 0x06,0x0B,0x92,0xF4,0x53,0x71,0x81,0xA4,0x0B,0x71,0xC9,0x30,0xF5,0x91,0x30,0xE3, + + 0x35,0x64,0x0F,0x74,0x51,0x1D,0x0E,0x91,0xBA,0xEC,0x20,0xF3,0x93,0xE8,0x61,0x83, + + 0x3C,0x00,0xF8,0x63,0x2B,0xA8,0x29,0xDB,0x6C,0x4F,0x69,0x57,0x3B,0x29,0x31,0xE2, + + 0xBD,0x88,0xC3,0xF7,0x08,0xDF,0x49,0x89,0x32,0x2D,0x91,0xBC,0x74,0xE2,0x18,0x4D, + + 0x20,0x85,0xD1,0x7C,0xDA,0x15,0x55,0x40,0x2A,0x95,0xA8,0x43,0x31,0x0E,0x97,0x54, + + 0x05,0x5C,0x76,0x45,0xF2,0x8A,0x10,0x58,0x45,0x3C,0x6C,0x84,0x51,0x6A,0xC5,0xE1, + + 0xAE,0xA6,0xD6,0x36,0xA2,0x25,0x6E,0xA6,0x00,0x36,0xA9,0x42,0x92,0x69,0x03,0xF1, + + 0x81,0xE7,0xD8,0xA6,0xAB,0x49,0x5C,0x31,0xE5,0x05,0x6D,0x85,0xF1,0x68,0xFD,0xFB, + + 0x7C,0xA7,0x3B,0x53,0x1E,0xE3,0x2D,0xB7,0xB9,0x9E,0xF1,0xCA,0x6B,0xED,0x5E,0x6A, + + 0xB2,0x82,0x4A,0xCD,0x53,0xD4,0x2D,0x05,0xB9,0x98,0x9A,0x5A,0x19,0x26,0x94,0xFA, + + 0xAA,0xA5,0x5F,0x89,0xB7,0xE7,0x1B,0x25,0x74,0xDB,0xC9,0x2C,0x7F,0x71,0x3F,0x30, + + 0x8F,0xA1,0xF3,0xED,0xDA,0x7A,0xAC,0x15,0x49,0x5B,0x23,0xFA,0x1B,0x77,0x12,0x44, + + 0x4A,0x81,0xFC,0x65,0xD8,0xD3,0xCB,0x93,0xBD,0x31,0xB2,0x2D,0xA3,0x61,0x67,0x23, + + 0x92,0x70,0xA8,0x43,0x1A,0xED,0x62,0x8B,0xC7,0xB0,0xFA,0x85,0xFA,0x0E,0x1A,0x49, + + 0x2D,0x4F,0xFD,0x65,0xFB,0x2A,0x2D,0x6F,0xE4,0xE8,0x99,0x96,0x79,0x68,0x9F,0xDF, + + 0xE3,0xB3,0x95,0x75,0xC7,0x84,0x4D,0x7F,0x34,0x92,0x3B,0x71,0xF9,0x3F,0xA3,0xBD, + + 0xB8,0x81,0x90,0x00,0x1F,0xFD,0xD4,0x71,0x36,0x5D,0xD5,0xC2,0x11,0x74,0x99,0x14, + + 0x44,0x9A,0x56,0x71,0x37,0x9B,0x89,0x34,0x22,0x3C,0xC5,0x87,0xD4,0x8E,0x2A,0xEA, + + 0x79,0xE7,0x2A,0xEB,0x6D,0x70,0x0D,0x38,0x83,0x00,0xF3,0x47,0xF3,0x70,0xA1,0xEE, + + 0x6B,0x30,0xCB,0xEA,0x12,0xB8,0x25,0x51,0xA3,0xD8,0xC4,0x4D,0x54,0x85,0x39,0x33, + + 0x40,0xC0,0x79,0x40,0x28,0xC4,0xC4,0xBF,0x9B,0xA8,0x57,0x44,0x66,0x14,0x2A,0x60, + + 0xC8,0x96,0xF2,0xFD,0x90,0x45,0x22,0xDD,0x88,0xC4,0x5F,0xF9,0xF1,0x71,0x91,0x86, + + 0x4B,0x55,0xFB,0xED,0x11,0x53,0xC5,0x93,0x09,0x07,0x85,0xE4,0xA6,0x77,0x73,0x70, + + 0x69,0x74,0x70,0xA5,0xE7,0x3E,0x23,0xC8,0x5C,0xAB,0xD5,0x05,0x0C,0x78,0xBD,0x1B, + + 0x0A,0x12,0x47,0xA0,0x3E,0xB2,0x5C,0x85,0xDB,0x15,0xD7,0xCA,0x19,0x7C,0x5A,0x93, + + 0x51,0x29,0xD4,0xB5,0x05,0x7B,0xC1,0xDE,0xF0,0x61,0xA4,0x54,0x79,0x36,0x85,0x97, + + 0x8A,0xEE,0x3B,0x7D,0xB0,0x35,0x6A,0x49,0xAC,0x41,0xF1,0x4F,0xF9,0x9A,0x7A,0x88, + + 0x5B,0xB6,0xC5,0xFA,0x0C,0x34,0x32,0x49,0xAA,0x2A,0x60,0xBF,0xC5,0x60,0x38,0x6D, + + 0xC3,0x9F,0x46,0x8D,0xE7,0x27,0xEB,0xB7,0x6C,0x17,0x16,0xE8,0x76,0x78,0xE5,0x9F, + + 0x25,0xC1,0xCF,0xAF,0x07,0x72,0xDA,0xB8,0x27,0xD0,0xFE,0xF4,0x92,0xC4,0xF4,0x6C, + + 0x99,0x5E,0x1A,0xBE,0x8E,0x71,0xEC,0x96,0x65,0xD8,0xD0,0x69,0x99,0x24,0x8B,0x13, + + 0x10,0xB0,0x96,0x34,0x52,0xAE,0x21,0xD1,0x00,0x6E,0xAD,0xF9,0xF7,0x3D,0xE3,0x60, + + 0x25,0x63,0xD9,0x6D,0xB3,0xA4,0x85,0x1B,0xBC,0xE3,0xB8,0x2F,0x37,0xFC,0x62,0x75, + + 0xA4,0x8A,0x68,0xC6,0xB8,0xAC,0xF8,0xCB,0x0F,0x4A,0xE1,0x04,0xF2,0x4C,0x7B,0x8F, + + 0xBC,0xC0,0xAD,0xF7,0xAC,0xD3,0x02,0x83,0x38,0xB3,0x49,0x25,0x94,0x6F,0xBA,0x48, + + 0x3C,0x3F,0xD3,0xF7,0xFB,0x28,0xF8,0x02,0xFD,0x81,0xA6,0x85,0xD1,0x23,0xDF,0x19, + + 0xFF,0xBD,0xF5,0xB9,0x99,0x09,0x26,0x65,0x40,0x9D,0x76,0xE2,0x3B,0xC8,0xA8,0x3E, + + 0xE5,0x38,0x79,0x26,0x97,0xBA,0xD4,0xE1,0x61,0x18,0x50,0x77,0xD2,0x35,0x39,0x47, + + 0x8F,0xAA,0xF4,0xD4,0xAA,0x0B,0x9B,0x9D,0x6A,0xCB,0x11,0x66,0x56,0xA6,0xA9,0xDA, + + 0xDB,0x8A,0xD7,0x7F,0xF6,0xA3,0x1F,0xD2,0xC4,0xE5,0x99,0x75,0xA2,0xEA,0x95,0x26, + + 0x0A,0x41,0x7E,0x23,0xAF,0xE5,0x78,0x4D,0x2F,0xE8,0x88,0xC6,0x04,0xA7,0xBD,0x64, + + 0xC7,0x58,0xBD,0x6C,0xAA,0xEB,0x80,0xC9,0x7D,0x44,0x75,0x58,0x97,0xB0,0x79,0x4C, + + 0x71,0x2C,0x4F,0x9C,0xAC,0xA2,0x4B,0x0F,0xFF,0x5C,0xCD,0x56,0x53,0xF1,0x63,0x0F, + + 0x59,0x5A,0xE5,0x92,0x3C,0xA0,0xC6,0xCB,0x65,0xBA,0xE1,0x3D,0x36,0xE4,0x1C,0xEB, + + 0xA2,0x81,0x83,0x0E,0x0A,0x08,0x52,0x7B,0x48,0xB5,0xA2,0x19,0x7A,0x37,0x33,0x5F, + + 0xDA,0xE1,0x7F,0xB6,0x2C,0xD0,0x6D,0x81,0xCF,0x6D,0x8F,0xFA,0x24,0x49,0x1D,0xEF, + + 0x7A,0xAD,0xF2,0x63,0x56,0x9F,0x76,0x2B,0xDA,0xB3,0xD3,0x92,0x93,0x55,0xAF,0x05, + + 0x81,0x91,0x13,0xDB,0xAA,0x28,0xC6,0x42,0x34,0xE7,0x44,0x1F,0xDB,0xA1,0xB3,0x70, + + 0x07,0xF0,0x84,0x96,0x20,0xE7,0x4D,0xC9,0xC3,0xA0,0xB3,0xC0,0x57,0xC1,0x27,0x63, + + 0x86,0xD1,0x91,0xB2,0xDC,0xFA,0xC1,0xDD,0xE8,0x77,0xAE,0xB7,0x8A,0x7C,0x1B,0xBF, + + 0x47,0x9B,0xA3,0x54,0xA8,0x92,0xC0,0xB2,0x23,0x5F,0xD5,0xF0,0x55,0xFF,0x13,0xBE, + + 0xA3,0x39,0xF5,0x86,0xB3,0x68,0xF4,0x73,0xD2,0x58,0x69,0x49,0xC6,0xF3,0xB6,0xDC, + + 0x4C,0xD6,0x1C,0xCE,0xDF,0x05,0x54,0x2F,0x60,0x8D,0xBF,0xC1,0xF1,0xB6,0x86,0x21, + + 0x0D,0xF0,0x37,0xC6,0x31,0x2E,0xFB,0x90,0x8C,0xC4,0xEC,0xF2,0x63,0xB7,0xFC,0x38, + + 0xA0,0xCF,0x1D,0xE3,0xC9,0xB6,0x07,0x8C,0xE0,0xE4,0x5D,0xEA,0x73,0xB6,0x55,0x20, + + 0x81,0xFB,0xF7,0x55,0xB6,0xD0,0xC9,0x91,0x0C,0xE6,0x26,0x76,0x1E,0xBC,0x33,0xE8, + + 0xDB,0xFD,0xE2,0x8C,0xD3,0xA3,0xEA,0x87,0xDF,0x95,0x0E,0x69,0xA2,0x25,0x10,0xA6, + + 0x5B,0x46,0x76,0x81,0x9E,0x3C,0xAB,0x3E,0x2E,0xB4,0x9E,0x34,0x7C,0xDB,0x1F,0xBA, + + 0xD0,0x65,0x65,0xE9,0x43,0x17,0x2F,0x4B,0x8F,0xEB,0xAD,0xAD,0x4F,0x71,0x71,0x79, + + 0xA9,0x36,0x50,0x77,0xB9,0xF4,0x07,0x55,0x0E,0xD2,0xDF,0xBC,0xE0,0xF6,0x00,0x7A, + + 0xC7,0xBF,0xBC,0xCF,0x9D,0x11,0xDA,0x79,0x16,0x71,0x5A,0x7C,0x6A,0xF4,0x3E,0xEB, + + 0x6B,0x20,0xCA,0x9E,0x5C,0x55,0x40,0xD2,0x0E,0xD9,0xAE,0xFE,0x73,0xBF,0x01,0x6E, + + 0xAD,0x16,0xF8,0x2F,0x93,0xB8,0x64,0x9B,0x6E,0xC1,0x0B,0x6B,0x81,0xC6,0xC3,0x49, + + 0xAB,0x95,0x97,0xF8,0xDC,0x17,0x1E,0x3B,0xAB,0x7B,0x20,0x26,0xF9,0xFF,0x82,0x84, + + 0x1B,0x59,0xB8,0x14,0xB3,0x2B,0x68,0xA2,0x45,0x44,0xEB,0x4B,0xDF,0xF6,0x88,0x13, + + 0xA5,0x1A,0xB0,0x04,0xB2,0x27,0xF0,0xAD,0x61,0x93,0x63,0x36,0x11,0xD1,0x21,0x67, + + 0xA0,0x62,0x03,0x87,0x59,0x1F,0x29,0x71,0x40,0x4D,0xD9,0x34,0x29,0xE2,0xC8,0x77, + + 0xA0,0x43,0xA7,0x7E,0x30,0xA4,0x9B,0x43,0x3A,0xBC,0xEE,0x25,0x42,0xBE,0x80,0xD4, + + 0x02,0x78,0x79,0x06,0xB3,0x59,0x07,0x93,0xC6,0xCF,0xC0,0x97,0xD6,0xE9,0xE5,0x3E, + + 0x9E,0x78,0x7F,0x69,0x8E,0xD8,0xFC,0x54,0x6D,0x9A,0x59,0x44,0x52,0xCA,0xFE,0x0E, + + 0x02,0x66,0xE9,0x27,0x66,0xF7,0xA6,0xD0,0xB0,0xE9,0x83,0x4E,0xD4,0x0F,0x89,0xD1, + + 0x8C,0x45,0x64,0xD1,0xBE,0x99,0xF5,0x02,0xB9,0xB1,0x79,0x07,0xB1,0x52,0x26,0x2E, + + 0x2A,0xF8,0x86,0x15,0xB4,0x25,0xD2,0x54,0x1C,0x04,0x7E,0xBE,0x18,0x60,0x32,0xAA, + + 0x05,0x69,0xA3,0xF4,0x7A,0x09,0x42,0x3D,0x4F,0x92,0xC3,0x3F,0x3A,0x49,0x47,0x8B, + + 0x55,0x05,0xF1,0xF8,0x88,0x2C,0xD3,0x0D,0x21,0xB3,0x96,0x68,0x8F,0x2A,0xE7,0x1B, + + 0x81,0x67,0xF3,0x1F,0xC9,0xD0,0x01,0xBD,0xB2,0x23,0x63,0x19,0x2C,0x62,0x02,0xDD, + + 0xF5,0xA7,0x75,0x50,0xE9,0x93,0x2C,0xD1,0xA3,0xDF,0x12,0xB1,0xAB,0xC1,0x58,0x78, + + 0x0D,0x0F,0xA2,0x3E,0xA4,0x23,0xED,0x09,0x3C,0x4D,0xE2,0x86,0xF7,0x60,0x3B,0x59, + + 0x3F,0x8B,0x38,0xC9,0xD4,0x0D,0xB0,0x9A,0xB8,0x0F,0x58,0xE9,0xFF,0x0B,0xBC,0x36, + + 0x8D,0x0D,0xF3,0xB3,0x18,0x22,0xE4,0x48,0xB1,0xE0,0x77,0xE2,0x2A,0xB9,0x7C,0x46, + + 0x24,0x5C,0xC6,0xE2,0xCB,0x2B,0x01,0x5D,0x04,0xEB,0xF7,0x46,0x54,0xFD,0x56,0x95, + + 0x82,0x17,0x84,0x9C,0xD0,0x7E,0xB0,0xC3,0x0D,0xF7,0xA6,0x5A,0xC4,0x33,0x81,0x03, + + 0xA5,0xD8,0x30,0xE3,0x3D,0x84,0x04,0x25,0xDD,0x30,0xCC,0x9E,0x57,0x33,0x85,0x5D, + + 0x02,0x15,0xD4,0xAE,0x16,0x7F,0x88,0xC2,0x85,0xF5,0x5D,0x5C,0x1A,0x17,0x84,0x3D, + + 0x24,0x16,0x69,0x40,0x1F,0x8A,0xEC,0x90,0xE2,0xF2,0xE1,0x60,0x2D,0xE9,0x0C,0xB4, + + 0x25,0x17,0x37,0x50,0x7D,0x16,0x1E,0x0F,0x8A,0x46,0x81,0xEA,0x75,0x1C,0x83,0x3E, + + 0x17,0x54,0x72,0xDC,0x41,0x89,0x2D,0xC5,0x0B,0xFF,0x08,0xE4,0xC5,0xDA,0x63,0xDD, + + 0x0B,0xFA,0xA5,0xB7,0x0C,0x39,0xF1,0x6E,0xC7,0xFA,0x1F,0x71,0xB5,0xEB,0x8E,0xE8, + + 0x4B,0xE3,0x12,0xA8,0xC6,0xC7,0x87,0x68,0x67,0x34,0xAC,0x4E,0xD4,0x77,0x76,0x1A, + + 0x2C,0x73,0x3B,0x7A,0xB9,0x5A,0x24,0x2B,0x59,0x86,0xB8,0x55,0x22,0xD4,0x7F,0xAE, + + 0xCB,0xE5,0x01,0xFF,0x4F,0x21,0x2D,0x3A,0xD0,0xA5,0x16,0x03,0x78,0x35,0x37,0xC9, + + 0xA1,0x14,0x78,0x63,0xF9,0xE0,0xB3,0xC6,0x23,0x2A,0xD0,0x7A,0x3B,0x73,0x60,0x11, + + 0x11,0x5D,0xFE,0x22,0xB9,0x31,0x01,0xD8,0x62,0xF3,0xA9,0x2B,0x87,0xCA,0xB1,0xAB, + + 0x59,0x7E,0x67,0x8E,0x3D,0x54,0x8F,0xC7,0x55,0xC6,0xDB,0x78,0x56,0xBF,0x79,0x70, + + 0xC2,0x13,0xBA,0x0F,0x1B,0x38,0x80,0x9B,0xCE,0x8B,0x6C,0x7E,0x59,0x76,0xB4,0x29, + + 0xA9,0xEE,0x35,0x5F,0x2E,0xC8,0x5F,0xFD,0xA1,0x82,0x64,0xE2,0x58,0x3D,0x28,0x06, + + 0x8C,0xC5,0xA0,0xFA,0x12,0xE0,0x98,0x27,0x60,0x6B,0x20,0xB6,0xAB,0x6B,0x92,0x72, + + 0x38,0x82,0x81,0xFE,0xB6,0x2C,0xAD,0xB0,0xC5,0x06,0xB9,0x34,0x51,0x8D,0x89,0x1E, + + 0xB7,0x36,0x2C,0xC8,0x75,0xA4,0xA0,0x23,0x0C,0x9B,0xB5,0x6D,0x29,0xFE,0xA8,0x96, + + 0xA7,0x83,0xC9,0x44,0x2C,0xAC,0x01,0x53,0x81,0xCE,0x6D,0xFD,0x26,0xF8,0xE3,0xBD, + + 0xB3,0xC6,0x9D,0x84,0xB7,0xA2,0x27,0x1C,0x2C,0x57,0xB8,0x6A,0xBF,0x3C,0x6A,0x3C, + + 0x01,0xC7,0x12,0xD4,0x82,0x29,0x2F,0x42,0xB8,0x6A,0x80,0x51,0xAA,0xEA,0x21,0xE8, + + 0xED,0x89,0x48,0x05,0x90,0xCF,0x0F,0xDB,0xE2,0x6B,0x31,0x03,0x7A,0x3B,0x32,0xD7, + + 0x85,0x65,0x29,0x27,0x99,0xAB,0xAE,0x00,0xB5,0x44,0xC7,0x2A,0xBF,0xEA,0x62,0xCC, + + 0x10,0x93,0x16,0xEC,0x1A,0xE8,0x6C,0x06,0x4C,0x67,0x96,0xC8,0x6F,0x5D,0x2F,0xF8, + + 0x3E,0xAB,0x12,0xE5,0x2E,0xDC,0x00,0xC9,0x29,0x66,0x9E,0x58,0x6E,0x5C,0x63,0x6D, + + 0x0E,0x89,0x27,0x2B,0xAF,0x2F,0xA6,0xAF,0xA1,0x20,0x0B,0xCF,0xDE,0xF1,0x93,0x99, + + 0xAF,0x7B,0x13,0x26,0x3A,0xB0,0xAD,0xC8,0xFD,0x64,0x43,0x4D,0x5F,0xF7,0x9D,0x24, + + 0x08,0x8E,0xDA,0x25,0x9F,0xA1,0x8D,0x99,0x38,0x8D,0xE0,0x0E,0xB5,0xA8,0x34,0xB8, + + 0x4F,0xD0,0xC2,0x3C,0xEB,0x7C,0xAC,0x09,0x29,0x44,0x66,0x72,0x3F,0xE9,0xAF,0xCF, + + 0x8C,0x22,0x5A,0x0D,0x3F,0xD3,0x2A,0x17,0x6B,0x68,0xC9,0xDF,0x66,0xAC,0x59,0x6B, + + 0xAB,0xCD,0x5C,0x62,0x02,0x52,0x5B,0x88,0x6C,0xDD,0x85,0x79,0x3E,0x6C,0x44,0xC3, + + 0xA8,0x9D,0xA2,0x84,0x44,0x6B,0x8F,0x31,0x50,0xDA,0xBC,0xA3,0x1F,0x4A,0x24,0x17, + + 0x84,0x19,0x87,0xAF,0x33,0xE8,0x5C,0xE1,0x97,0xDC,0x10,0x25,0x2E,0xFB,0x2F,0x03, + + 0x07,0x94,0x27,0xF5,0x4F,0x39,0x39,0x83,0xF4,0xDC,0xBD,0xD5,0x43,0xAF,0xAD,0x71, + + 0x04,0x1B,0xD3,0xF5,0x46,0xBA,0xD1,0x21,0xF8,0xDB,0x21,0xC4,0xCE,0x75,0x1A,0xC4, + + 0x45,0xE3,0xDC,0xF7,0x4A,0xBB,0xD7,0xDE,0xBA,0x25,0x32,0xF6,0x3E,0x2C,0xFC,0x21, + + 0x41,0xF0,0xBA,0xEA,0x94,0xF4,0x7C,0x81,0x13,0x53,0x7B,0xB6,0xB7,0xB4,0xB6,0x30, + + 0x2A,0x9B,0x85,0x89,0x40,0xBB,0x99,0x90,0x9A,0x50,0xCB,0xBB,0x7B,0x70,0x55,0x20, + + 0xC9,0xF9,0xD7,0x24,0xE2,0x13,0x7E,0xB3,0xA3,0x7C,0x83,0xF0,0x56,0x68,0x24,0x68, + + 0x8D,0x10,0x67,0xC9,0xC1,0x2E,0x35,0xD8,0xCF,0xA3,0xBE,0xEE,0x36,0xA5,0x26,0x78, + + 0xAF,0xD1,0xA6,0x9B,0xCC,0x4F,0xE5,0x39,0x6B,0x02,0xE3,0x46,0x7D,0xBB,0x37,0x69, + + 0x0D,0x12,0x5A,0xF5,0x33,0x4C,0x3F,0x50,0x93,0xC6,0x48,0x53,0xFC,0x4F,0x0B,0xF9, + + 0xEC,0xBB,0x52,0x77,0x59,0xF6,0x86,0x39,0x24,0x86,0xF9,0xC1,0x05,0x41,0x00,0x6A, + + 0xC7,0x6D,0x6D,0x93,0x1C,0x7C,0xE5,0xF2,0x05,0x2D,0x42,0x8C,0x85,0xBE,0xBC,0xAA, + + 0xAF,0x8B,0x61,0x2D,0x62,0x10,0xBE,0x8A,0x61,0xD1,0x2C,0x68,0xB7,0x1E,0x7D,0xC9, + + 0x1D,0x33,0x65,0x3F,0xBF,0x1F,0x77,0x69,0x7B,0xD2,0xE8,0x96,0xDA,0x5A,0xFF,0x2B, + + 0x5C,0x3E,0x60,0xEE,0x1E,0x3E,0x47,0x90,0x6E,0xD2,0x19,0x8D,0x14,0x59,0x5E,0x92, + + 0x04,0xF5,0xF9,0x7A,0x71,0x24,0x72,0x04,0xBD,0x02,0xA8,0xB4,0xF3,0xCD,0xEB,0x0F, + + 0xDF,0xAA,0x18,0x53,0x35,0xF5,0xD8,0xB0,0x4E,0x03,0xAF,0x09,0xA1,0xB0,0xA1,0x3F, + + 0x0C,0xD6,0xE0,0x45,0x94,0x4C,0x51,0x11,0x3B,0xBF,0x8F,0xCA,0xE7,0x62,0x6E,0x15, + + 0xEA,0x95,0x1A,0x0A,0xED,0xB7,0xD9,0x59,0x4C,0xF5,0x46,0xBF,0xA6,0x17,0xF8,0x7D, + + 0xA5,0x4A,0x47,0x56,0xF5,0x89,0x85,0x13,0x74,0xE7,0xF9,0x72,0x54,0x06,0xB0,0xD4, + + 0x20,0x05,0xEA,0x70,0xF8,0x41,0x0D,0xC1,0xB9,0xEA,0x98,0x12,0x55,0x67,0xC7,0x33, + + 0xB1,0x22,0x91,0xB4,0x31,0xD6,0xA2,0x92,0xF4,0xEB,0x43,0x55,0xC3,0x24,0x89,0x19, + + 0x83,0x45,0xF1,0xAB,0x3F,0x2A,0x0C,0x02,0xF1,0xE4,0xF7,0x64,0xA8,0x26,0x82,0x16, + + 0xEC,0xFC,0xD2,0x17,0x32,0x7C,0x6C,0x90,0xFD,0xDE,0x12,0xC1,0x5B,0x69,0x54,0x2A, + + 0x0D,0x45,0x20,0x29,0xB8,0x22,0x5A,0x79,0x4F,0x4B,0xCA,0x18,0x67,0x72,0xB5,0xF8, + + 0x60,0x4A,0x53,0x02,0xB6,0x2C,0x6D,0x84,0x35,0x08,0x81,0x29,0xD1,0x58,0x6A,0x17, + + 0x59,0x7F,0xC5,0xEE,0xEB,0x8F,0x4B,0xC2,0x34,0x09,0xAD,0x5B,0x26,0x07,0x0D,0xFC, + + 0x28,0xEC,0x3D,0x3F,0x47,0x8D,0x21,0x9B,0x78,0xB9,0xAD,0x0E,0xAD,0x09,0xB2,0x7C, + + 0x84,0x0F,0x4A,0x2F,0x4E,0xA8,0x0F,0x82,0xC8,0x43,0x2F,0xBB,0xA6,0xEB,0x41,0x3B, + + 0xB9,0x2A,0xFB,0x69,0xF1,0x21,0x86,0x57,0xFC,0xFB,0xEB,0x92,0xDC,0x15,0xFC,0x58, + + 0x06,0x03,0xB5,0x5B,0x53,0x20,0xBB,0x46,0xEF,0xE2,0xDB,0x03,0x19,0x2F,0x3E,0x73, + + 0xEA,0xBB,0xC1,0x99,0x91,0xAF,0xAD,0x3A,0x8B,0xA3,0x86,0xC5,0xCB,0x1C,0x6F,0xCE, + + 0x94,0xCD,0x58,0x92,0xF9,0x72,0xDC,0x30,0x43,0xEE,0xFF,0xF4,0x61,0xFA,0x67,0x85, + + 0x84,0xBD,0x31,0xE7,0x4B,0x96,0xAA,0x25,0xE2,0x1B,0x29,0x3E,0xEA,0x1F,0xA2,0xFE, + + 0x7C,0xC7,0x29,0x64,0x12,0x73,0xA2,0x35,0xEF,0x30,0x41,0x89,0x42,0xFE,0xBA,0x31, + + 0xBE,0xF6,0x1F,0xAA,0x0D,0x30,0x42,0x82,0x02,0x57,0xF4,0x6E,0x56,0x72,0x33,0x54, + + 0x02,0xFE,0x17,0x57,0x35,0xEE,0x72,0x03,0xEF,0x14,0x68,0x96,0x88,0x10,0xAD,0x4B, + + 0x80,0xC0,0x9A,0x3A,0xCD,0x2E,0x2B,0xE7,0x03,0xD5,0x7C,0xB7,0x53,0xE9,0xFA,0xD7, + + 0x57,0x73,0x74,0xA6,0xC8,0x3E,0x07,0x16,0x8B,0x06,0xE5,0x0B,0x5F,0x7A,0xB4,0x97, + + 0xC4,0x59,0x39,0x08,0x22,0xC8,0xD6,0x28,0x26,0x34,0x6E,0x3D,0x27,0xA8,0x50,0x0B, + + 0x2D,0xB2,0x4C,0x93,0x65,0x3D,0xB3,0xC7,0xF4,0x06,0x80,0xFA,0x35,0x62,0xA4,0x1F, + + 0x74,0xFC,0xBC,0x96,0x1B,0x78,0x70,0x56,0x1D,0xCC,0xB7,0x7A,0xFE,0x92,0x6D,0x9D, + + 0x8D,0xCF,0x67,0xA3,0x9F,0xCE,0x2C,0x00,0x11,0x88,0xBB,0xDB,0xDA,0xDA,0x86,0xA8, + + 0x75,0xC8,0xD6,0x3D,0x99,0x7C,0x28,0xEE,0x8B,0xDF,0x29,0xC8,0x7C,0x6E,0x78,0x5C, + + 0x0A,0x0F,0x0E,0x5C,0x19,0x3B,0x04,0x82,0x03,0x8C,0xE6,0x02,0xD7,0x70,0xF5,0xD6, + + 0x46,0xB1,0xF5,0x49,0xF8,0xCE,0x79,0x1A,0x66,0x1F,0xE0,0x6F,0x6F,0xA9,0x11,0xD6, + + 0xA7,0x51,0xE6,0xDB,0xBD,0x56,0x21,0xFF,0x0A,0xDC,0x22,0xB3,0x0E,0x23,0x07,0x26, + + 0xD0,0x46,0xBE,0xBF,0xA8,0x83,0x70,0x46,0x42,0x82,0xE9,0xDE,0xF1,0x16,0x4E,0xE3, + + 0xC7,0xC1,0xF3,0x19,0x13,0x4A,0xEB,0x5C,0x97,0x6E,0xAF,0x09,0x0A,0x6C,0x86,0x94, + + 0x65,0x2D,0x10,0xA7,0xEF,0xB4,0x28,0x64,0x1E,0x6D,0x71,0x4B,0x61,0xEA,0x57,0x8D, + + 0x6E,0x75,0xFB,0x65,0x6A,0x5E,0x6E,0x4C,0xC3,0xC1,0x42,0x49,0x58,0x15,0x08,0x5C, + + 0x60,0x70,0x44,0x62,0xFF,0xDE,0xE5,0x53,0x3E,0x65,0x60,0x98,0xAB,0x45,0xCC,0xD6, + + 0x26,0x6E,0xD6,0xAF,0x9A,0x23,0xD8,0x00,0x25,0x69,0x03,0x86,0x55,0x14,0xB7,0x58, + + 0x02,0x12,0xFB,0x43,0xB5,0x4F,0x49,0x53,0xB7,0x69,0xC9,0x98,0x23,0x85,0xA9,0x33, + + 0xD8,0x72,0xE1,0x17,0xD7,0x0C,0x07,0x74,0xE3,0xDC,0x87,0x71,0xB4,0x90,0x7C,0x91, + + 0x1C,0x27,0x0E,0x9D,0x75,0xA2,0xFE,0xAE,0x4E,0xCB,0xFA,0x1E,0xD1,0x45,0x85,0x61, + + 0xD0,0xC8,0x8C,0xBE,0x91,0x02,0xE9,0xBE,0x4B,0xD0,0x84,0x4A,0x9F,0xE9,0x40,0x55, + + 0x7D,0x56,0xB2,0x1C,0xB6,0xEE,0x4C,0x54,0xCA,0xA8,0x2D,0xBC,0xB5,0x55,0x88,0x8D, + + 0x51,0x6D,0xD3,0x1B,0x60,0xE9,0x97,0xA0,0x26,0xC3,0xC0,0x41,0xB5,0xE6,0xC2,0x74, + + 0x82,0xCE,0xBD,0x0F,0x3A,0x01,0xD3,0x1C,0x2E,0xEB,0x21,0x9D,0xD2,0xE1,0x2E,0x9C, + + 0x9D,0x8E,0xCA,0xA7,0xE0,0x56,0x54,0x89,0xC3,0x8C,0x16,0xE5,0xAE,0x64,0x7B,0xCA, + + 0xE5,0xFA,0xBC,0xAF,0xD8,0xD5,0x0D,0x6D,0x2F,0x4D,0x63,0x91,0x72,0xE3,0x88,0xA0, + + 0x89,0x75,0xE0,0xA3,0x19,0xED,0x45,0xDB,0xA7,0xC2,0xDB,0x95,0x2A,0x66,0xC7,0x9D, + + 0xFA,0x3F,0x70,0xBD,0x5D,0x2B,0x87,0x1F,0x98,0xD8,0x8A,0x7B,0x57,0x70,0xBC,0x61, + + 0xC5,0xDD,0xF2,0x2E,0x3D,0xC4,0x98,0xAD,0xE1,0x4D,0x86,0x5E,0xCD,0xBE,0x42,0x72, + + 0x76,0xD2,0xA5,0x94,0xDE,0xC1,0xF5,0x32,0x11,0x06,0x8B,0x6A,0xD5,0x72,0x4C,0x89, + + 0x75,0x27,0xFF,0x13,0x8C,0x95,0x84,0xE9,0x3C,0xAE,0xE4,0x80,0x50,0x7F,0x05,0x62, + + 0xF0,0x2B,0x84,0x06,0x62,0xF6,0xDE,0x11,0xEA,0x95,0xCE,0x0D,0xC5,0xB5,0x9F,0x7E, + + 0xEF,0x22,0xBC,0x54,0xA6,0x71,0x02,0xF4,0x86,0x56,0xCB,0x87,0x04,0xF5,0x43,0x7C, + + 0x98,0x32,0xA5,0x09,0xB0,0xB4,0x2F,0x8C,0x8E,0xD5,0x42,0xFE,0x81,0xF6,0x38,0xC0, + + 0x55,0x84,0x2D,0xB2,0x35,0xBF,0x53,0x00,0x6B,0x96,0x3D,0x66,0x02,0x0A,0x01,0x7B, + + 0xB0,0x8A,0x86,0x0F,0x03,0xB0,0x19,0x94,0x52,0x2D,0xFC,0xB3,0x83,0xE3,0x50,0x0C, + + 0xC6,0x7F,0x1D,0x3A,0x3B,0x62,0xD2,0xC5,0xA7,0x9D,0xF6,0xB3,0x4E,0x7C,0xCF,0x01, + + 0x88,0x17,0x9D,0x74,0x40,0xD9,0x64,0x2F,0xA6,0x07,0x82,0xC9,0x71,0x0C,0x71,0x08, + + 0xBD,0x34,0x16,0x1D,0x78,0x5A,0x01,0xBC,0x8C,0xDF,0x07,0x40,0xCE,0xCE,0xA6,0x17, + + 0xC1,0x37,0x25,0x4C,0xAF,0xF8,0x2F,0xF0,0x8B,0x7A,0xE0,0xF2,0x81,0x61,0x3E,0x44, + + 0xD4,0x30,0xE5,0x5A,0x7D,0x9F,0xC6,0x04,0xE2,0x20,0x69,0x01,0xCA,0x2E,0xC2,0x5F, + + 0x29,0x88,0x27,0x4A,0xDA,0x3F,0x2B,0x14,0xDD,0xEC,0x24,0xCB,0x4D,0x83,0xBA,0xEA, + + 0x51,0x30,0x2F,0x5F,0x76,0xB9,0x9C,0xDF,0x84,0xD0,0x04,0x94,0x85,0x40,0x39,0xB8, + + 0xF3,0x40,0x1A,0x72,0x13,0xD0,0x2E,0x19,0xE7,0xE4,0xDE,0x10,0xB9,0x31,0x1E,0x28, + + 0xEA,0x45,0x70,0x72,0xD3,0x01,0x38,0xAB,0xCC,0x5A,0xE0,0x3D,0xD1,0x57,0x40,0x3A, + + 0xE3,0x9D,0xD8,0x5F,0x35,0xA2,0x00,0x08,0x88,0x53,0xE9,0x02,0x39,0x13,0x53,0xAE, + + 0xEB,0x72,0x81,0x1C,0x83,0xA8,0xD6,0x57,0x0B,0x1A,0x09,0x73,0xDF,0x2F,0x9E,0xC3, + + 0x04,0x4D,0x36,0xC0,0x66,0x98,0x94,0x3E,0x4C,0x5A,0x0F,0x65,0x54,0x9F,0x4D,0xB2, + + 0x30,0xA1,0x77,0xDB,0xEC,0xF8,0xCD,0x83,0xC7,0xC8,0x6D,0x05,0xA8,0x9E,0xF6,0x23, + + 0x00,0x05,0xA9,0x27,0x21,0x4A,0x2C,0x9E,0xA1,0xFB,0x95,0x17,0x39,0x4C,0x89,0x35, + + 0x29,0x0A,0x28,0xB8,0x80,0x7C,0x0B,0x26,0xC5,0xED,0xDD,0xF1,0xAC,0xD5,0x7C,0x0F, + + 0x2C,0x05,0x00,0xEA,0x3C,0xA5,0x48,0x2A,0x4E,0x13,0x50,0x6A,0x12,0x24,0xBE,0x7A, + + 0xBE,0x6C,0x57,0x0D,0x62,0xD6,0xC1,0x4B,0x71,0x06,0x5A,0x44,0x0F,0x2B,0x7A,0x2E, + + 0x29,0x35,0xDA,0x57,0x3F,0x6B,0x42,0xE9,0x80,0x51,0x56,0xA9,0xF2,0x34,0x33,0xF6, + + 0x38,0x4A,0x54,0x34,0xEE,0x5E,0x8B,0xC4,0xCB,0x90,0x55,0x10,0x56,0x70,0x22,0xE8, + + 0x56,0x03,0x42,0xC8,0x66,0x25,0x70,0x98,0xE3,0x3D,0x12,0x39,0x53,0x63,0x60,0x88, + + 0x57,0xF2,0x82,0x5D,0x3F,0x6F,0xF4,0xFC,0x74,0x0A,0x8A,0x75,0x5D,0xA5,0x23,0x4B, + + 0xF3,0x03,0x6F,0xC9,0x88,0xF6,0x2D,0x6F,0x2B,0xCD,0x8A,0xED,0x7F,0x68,0xA7,0xCB, + + 0x87,0x07,0x5C,0xC2,0x2A,0x23,0xF8,0xDD,0x17,0x2C,0x37,0x82,0xDD,0x14,0x1A,0x78, + + 0x20,0x6B,0x95,0x00,0x7B,0xE2,0xC5,0x5E,0x99,0x63,0x12,0x04,0x7E,0xB2,0xCC,0x78, + + 0xED,0xBC,0xB1,0xCB,0xC9,0x20,0x7C,0xFE,0xD7,0x11,0x23,0xF3,0x7F,0x8E,0x94,0x70, + + 0x9E,0x83,0xBD,0xE5,0xA2,0xCE,0x6A,0xDB,0xD2,0xCD,0x7D,0x31,0x70,0x30,0x13,0xA0, + + 0xDD,0xBC,0x4D,0xE1,0xD2,0x5F,0x5C,0x8A,0x63,0x0F,0x71,0xDA,0x2F,0xF8,0x7A,0xB1, + + 0xFA,0x1B,0x28,0x40,0x20,0xEC,0x06,0xB7,0x64,0x2F,0x44,0x66,0xF2,0xF7,0x48,0xCD, + + 0xD6,0xE1,0x20,0x46,0x3B,0x3F,0x77,0x8E,0xB2,0x17,0x5C,0xB3,0x57,0x8E,0x67,0xB2, + + 0x01,0x1F,0xCD,0xD8,0x5B,0x4C,0xA5,0xBA,0x1F,0xEA,0xED,0x95,0x46,0x7F,0x35,0xC3, + + 0x90,0x55,0x4F,0x3D,0xEA,0x7A,0x1B,0x8F,0x76,0x8A,0xDC,0x68,0x90,0x64,0x91,0xFA, + + 0x42,0xC9,0x39,0x1F,0x04,0xE5,0xE7,0x2C,0x14,0x81,0xB6,0x46,0x4D,0x6E,0xC1,0xFE, + + 0xE3,0x68,0x2D,0xB0,0xE5,0x48,0x5F,0x65,0x6F,0xA8,0x76,0x39,0xB1,0xB0,0x79,0xB5, + + 0x25,0x01,0xE1,0xA1,0xBB,0xDA,0xE8,0x41,0xA8,0x18,0x9F,0xA9,0x7F,0x08,0x31,0xB5, + + 0xAF,0x40,0xA9,0xB5,0x81,0x9B,0xF0,0x3D,0xFB,0xF7,0x8E,0xAE,0x94,0x4A,0xBE,0x20, + + 0xA8,0xD1,0xB4,0xCD,0x3E,0x52,0xFF,0xA7,0x97,0x20,0x41,0x1F,0xFE,0xF1,0xE9,0x3A, + + 0xEB,0xB0,0xAA,0xAA,0xC0,0xC6,0xED,0x5C,0x97,0x3E,0xE6,0x02,0x18,0x7E,0xB8,0x21, + + 0xAC,0x53,0x57,0x8A,0x9E,0x25,0x64,0x4D,0x12,0x3D,0x85,0xEF,0x11,0x1A,0x37,0x5D, + + 0x8E,0xC8,0xCB,0x59,0xCE,0xEF,0x9F,0x68,0x1E,0xA2,0x48,0x0E,0x7F,0xF2,0x1A,0xF1, + + 0x70,0x2F,0x60,0xFA,0xA1,0x2D,0x85,0xA6,0x7F,0xC9,0xD1,0x50,0x96,0xC0,0x39,0x55, + + 0xCF,0x08,0x61,0xD6,0x3C,0x2A,0xF8,0x7E,0xB4,0xDA,0xB0,0x96,0x66,0xD7,0xB6,0xF0, + + 0xB4,0x2F,0xDC,0x6C,0x19,0x04,0xEE,0xA3,0xB3,0xB7,0xF0,0x51,0x16,0xE2,0x61,0xCB, + + 0x6C,0x72,0x75,0x3E,0x26,0xEE,0x5F,0x45,0x48,0x45,0x03,0xC8,0x2E,0xF8,0xE0,0xBF, + + 0x0A,0x74,0xD8,0xAE,0xDF,0xE6,0xC9,0xE6,0x0D,0x3C,0x28,0x20,0xE2,0xE2,0xD7,0xB0, + + 0x34,0xC7,0x91,0x11,0xEA,0xE7,0xD4,0xF7,0x92,0xA7,0x80,0xF2,0x20,0x39,0xE6,0xC1, + + 0xA4,0xF4,0x72,0x1C,0x15,0xAB,0xB1,0xB3,0x61,0x1A,0xA1,0x7E,0xB5,0xC6,0xD1,0x43, + + 0x20,0x9C,0x7E,0x9F,0x18,0xE5,0x10,0x98,0x38,0x4C,0x99,0xD7,0xC5,0x6C,0x34,0x68, + + 0xF3,0x25,0xBA,0xDB,0x7F,0x57,0x72,0xEA,0x52,0x08,0x9F,0x48,0xEB,0xF8,0x38,0x9A, + + 0xF2,0x54,0xD4,0x37,0xFC,0x06,0xCF,0xBE,0x39,0xA6,0xE0,0x3C,0xEE,0xB4,0xB0,0xAE, + + 0x7B,0x77,0xDD,0x23,0x77,0xDB,0x53,0x65,0x7A,0xD1,0x0B,0xC0,0x53,0x5C,0x79,0xB4, + + 0x7A,0x3E,0xBA,0xEF,0x35,0x0A,0x84,0x16,0x32,0x16,0xA1,0x3D,0x4F,0xE3,0x61,0x2C, + + 0xF9,0x03,0xA3,0x12,0x1D,0xEE,0x8A,0x47,0xA5,0x88,0xC7,0x8C,0xF2,0x67,0xD0,0xA1, + + 0xE6,0x24,0x11,0xDA,0x63,0xD4,0x34,0x68,0x2C,0x00,0x7E,0x8E,0x57,0xE2,0x7B,0xC6, + + 0xBD,0x88,0xBA,0x1C,0x98,0x7F,0x49,0xDB,0x03,0x8C,0xE3,0x8D,0x5C,0xED,0x4C,0xB9, + + 0x4F,0x70,0x47,0xDB,0xE3,0xB5,0xEE,0x88,0x4B,0x42,0x13,0x67,0x58,0x1A,0xF6,0x42, + + 0x74,0x3D,0xB5,0xF5,0x04,0xDC,0x34,0xA2,0x64,0xD0,0xED,0xE9,0xD1,0x79,0xB9,0x74, + + 0x16,0x4A,0x92,0xBF,0xD6,0xB8,0x5C,0xFC,0xD5,0xCA,0x1E,0xC0,0x9E,0xE0,0xB4,0x65, + + 0xB4,0x3F,0xC7,0x96,0xB5,0x1C,0x0F,0x4B,0x2E,0x1D,0x35,0xC7,0xEC,0xE9,0x13,0xBB, + + 0x02,0xFD,0x6A,0x67,0x8D,0x82,0x13,0x37,0x91,0xBC,0xBC,0xC1,0x1E,0xC2,0x5C,0x38, + + 0x8A,0x99,0x24,0x23,0x8E,0xAF,0xE1,0x1D,0x93,0x87,0xA6,0xE4,0x9D,0x90,0xD8,0xB0, + + 0xD8,0x93,0x3B,0xE4,0xC8,0x60,0xBC,0xCE,0xBE,0x97,0x50,0xD2,0x8A,0xFE,0x1A,0xE4, + + 0x07,0x49,0x27,0xA1,0xDD,0xB9,0x8E,0xC7,0xD5,0x31,0xCD,0x9B,0xD7,0xB6,0xBD,0x83, + + 0xA1,0x85,0x95,0x53,0xC4,0x4C,0xEA,0x6C,0x6A,0x95,0xC5,0x0B,0x77,0x0C,0x7F,0x52, + + 0x89,0x3E,0x66,0x5E,0x91,0x15,0xDA,0x2E,0x7E,0x00,0x6D,0x01,0x03,0xFA,0xF7,0x2E, + + 0x2C,0xC9,0x6E,0x4E,0x90,0xB4,0xA3,0x45,0x5E,0x75,0x43,0xCD,0x4D,0x9A,0x30,0xF8, + + 0xDC,0xD8,0xB2,0x6D,0xDC,0xE8,0x3F,0xA2,0xEA,0x2B,0x89,0x86,0x94,0xF7,0x11,0xA3, + + 0x0A,0x8B,0xAD,0x7D,0x04,0xF9,0xFF,0x33,0x57,0x99,0x46,0xCD,0x06,0xBB,0x51,0xCE, + + 0x59,0x18,0x26,0x9B,0x69,0xA7,0x37,0xB6,0x6D,0x3D,0xA6,0x17,0x3E,0x63,0xD1,0x94, + + 0x9A,0xDF,0x3A,0x0E,0xBE,0x35,0x07,0xDD,0xC3,0xB8,0x75,0x9E,0x7B,0x91,0xCA,0xB0, + + 0x33,0xC2,0x40,0xB9,0x7F,0xDD,0x17,0xA5,0x5E,0xD3,0x37,0x03,0x17,0x03,0x25,0xA1, + + 0x7A,0xF3,0xBF,0x30,0x47,0x16,0x46,0xB9,0x4E,0xC4,0x6F,0x38,0xDB,0xFF,0xC0,0x55, + + 0x09,0x42,0xD0,0xF7,0x94,0xAD,0xD0,0xCD,0xFE,0xED,0xEF,0xDA,0x56,0x62,0xD5,0xF4, + + 0x32,0x03,0x37,0xF6,0xF8,0x22,0x26,0xDC,0xA3,0x61,0x58,0xB0,0xE3,0x6B,0x8B,0xC6, + + 0x7F,0x40,0xD3,0x52,0x7B,0x46,0x47,0x93,0xC8,0x63,0x48,0xA7,0x15,0x05,0xB1,0xEE, + + 0x03,0x00,0x49,0x95,0x9E,0x61,0xD8,0x42,0xB2,0x2D,0x19,0xF2,0xF5,0x0F,0xEB,0x07, + + 0x0C,0xD8,0xA6,0x26,0xE5,0x99,0x90,0x9C,0x48,0xE9,0x0D,0x75,0xB3,0xDB,0x88,0x80, + + 0xBE,0xD9,0x58,0x93,0xFA,0x66,0x50,0x92,0x70,0xA7,0xA6,0xB9,0x6C,0xC5,0x85,0x8B, + + 0x39,0x59,0x56,0xBA,0x73,0xF5,0x89,0xA6,0x00,0x16,0x11,0x99,0x67,0xEB,0xE5,0xD4, + + 0x56,0x65,0xAF,0xE1,0x7A,0x04,0xE1,0x91,0xD9,0x0A,0xA6,0x88,0xC5,0xBC,0x07,0xEA, + + 0x3B,0x2A,0xC0,0xC9,0x9A,0xE4,0x70,0x2C,0x4B,0x2A,0x02,0xEB,0x5A,0x9D,0x6A,0xB8, + + 0x55,0x06,0x35,0xFE,0xF0,0x2A,0x24,0x8C,0x8B,0x49,0x39,0x88,0x85,0x8A,0x53,0x10, + + 0xD8,0x47,0xB4,0x52,0x3B,0x4F,0x2D,0x9C,0x0A,0x4E,0x97,0x6A,0x59,0x64,0x6B,0xB9, + + 0xD1,0x86,0x4B,0x9D,0xBC,0x69,0x53,0x30,0x44,0xB6,0xB8,0x95,0x01,0x58,0x2B,0xA3, + + 0xF1,0xF0,0xA4,0xFD,0x3E,0xD8,0x50,0x8E,0x4C,0xA5,0x67,0xE8,0x2D,0x31,0x21,0x13, + + 0xF6,0x31,0x51,0xAA,0xFA,0x82,0x24,0x4D,0xA0,0x5C,0x1A,0x95,0x47,0x2F,0xFA,0x16, + + 0x8C,0xD5,0xD0,0x56,0xE2,0x6C,0x9D,0x1B,0x21,0x8F,0xED,0xA1,0xFB,0x8F,0x15,0xBB, + + 0x8F,0x72,0x13,0xD9,0xEC,0xAB,0x25,0x50,0xB4,0x8E,0xC4,0xC3,0x59,0xA3,0x64,0xC4, + + 0x2B,0x9B,0x06,0xC3,0xB2,0xFC,0xC2,0x32,0x2B,0xFD,0x22,0x55,0x98,0x60,0x17,0xF2, + + 0xDE,0x9D,0x26,0xD4,0x90,0xE7,0x9C,0x77,0x45,0x3D,0x30,0xC7,0x4B,0xD7,0x81,0x63, + + 0x22,0x16,0x89,0xE7,0x6E,0x34,0xC7,0x33,0xE0,0x58,0xEB,0x97,0x75,0x64,0xC9,0x14, + + 0xAF,0x99,0x85,0x8D,0x33,0xFF,0x8D,0x35,0xEF,0x29,0xCE,0x46,0x29,0xDE,0x9F,0x1A, + + 0xDF,0xBB,0xC5,0x40,0xFA,0xA5,0x11,0xFD,0xC3,0x8B,0x9D,0x52,0x74,0x2F,0x34,0xBB, + + 0xC8,0x1A,0x11,0x9E,0x48,0x2C,0x6A,0x96,0x98,0x39,0x4C,0x76,0xB6,0x8B,0x3D,0xF3, + + 0x59,0x83,0x97,0xD6,0xCA,0x95,0xE1,0x83,0x1D,0x4D,0xFD,0x61,0xB5,0x4F,0x7F,0xE8, + + 0x5C,0xBA,0x12,0x9D,0xB5,0x4E,0xE2,0x6A,0x80,0x53,0xE5,0x65,0x50,0xFC,0x02,0x0A, + + 0x2D,0x82,0xF4,0xEE,0xE6,0x3E,0x76,0xFE,0x90,0x1A,0xC7,0x3E,0x78,0xD7,0x44,0x9D, + + 0x85,0x16,0xC6,0x98,0xB6,0x78,0xA9,0xE7,0xCA,0x3C,0x76,0x36,0x5B,0xAF,0x7F,0xF6, + + 0x69,0x78,0x2D,0x2A,0x19,0xEC,0xD7,0x2E,0x6A,0x96,0xB4,0x5C,0x64,0x1A,0x6F,0x9B, + + 0x92,0x16,0xD4,0x9D,0x3B,0xF7,0xA0,0x5B,0x82,0x58,0xE0,0xF7,0x44,0x67,0x3E,0x70, + + 0xDD,0x5D,0x5C,0x0A,0x2A,0x7D,0x2F,0x96,0x0B,0x58,0x0A,0xD5,0xC9,0x31,0x56,0x11, + + 0xD6,0x16,0xD9,0x6D,0x04,0x20,0x48,0x9A,0x94,0x80,0xA7,0x9A,0xF6,0xAB,0x1E,0xD0, + + 0x0F,0xE7,0xE1,0xF5,0xD8,0x9A,0x36,0xCD,0x1D,0xA3,0x2C,0x1D,0xD5,0x8F,0xC9,0x31, + + 0xF3,0xE2,0x90,0xF7,0xC4,0x2B,0x8B,0x07,0x02,0xCF,0x97,0xE9,0x98,0x14,0x58,0x00, + + 0x14,0x7D,0xE2,0xC3,0x96,0x6C,0x52,0xF3,0xB1,0x46,0x8E,0x9E,0x3F,0xEF,0x72,0x13, + + 0xA6,0x87,0x17,0xF4,0x5D,0xA2,0xA8,0x41,0x72,0xAF,0x47,0x45,0xF6,0x42,0xD9,0x81, + + 0xA6,0x32,0x16,0x58,0x37,0xC7,0x31,0xE3,0xA4,0xAC,0x31,0x15,0xBC,0x01,0x09,0x7E, + + 0x24,0x7C,0x89,0xB0,0xB1,0xA5,0x5B,0x37,0xC6,0xF1,0x6B,0xC4,0x13,0xA1,0x00,0x6D, + + 0x7C,0xC6,0x20,0xBA,0x1C,0xA2,0x2F,0x4A,0x40,0xBD,0x1F,0x04,0xA9,0x63,0xAC,0x0C, + + 0x09,0x9B,0x6C,0x53,0x98,0xA1,0x42,0xF0,0x8E,0x52,0xFC,0x09,0xD8,0x63,0x2B,0xA5, + + 0x53,0xEA,0x4E,0xA5,0x37,0x21,0xB5,0x43,0xD6,0x7B,0x71,0x62,0xDB,0x3C,0x14,0xBC, + + 0x81,0x2D,0xED,0x10,0x96,0xF7,0x01,0x8C,0xB0,0x85,0x79,0x37,0x9B,0x4C,0xE6,0x8F, + + 0x02,0x02,0x82,0x10,0xBD,0x22,0x0C,0xD2,0xAE,0xE8,0xAA,0x92,0x94,0x2B,0x52,0x65, + + 0x4E,0x69,0x15,0xE3,0x1D,0x76,0x1A,0x44,0x8F,0xC9,0xC4,0xA5,0x36,0x7F,0xA7,0x89, + + 0x89,0xF0,0x24,0x3F,0xD8,0x55,0x71,0xEC,0x31,0x4C,0x50,0x3C,0xB2,0x1C,0x4B,0xBB, + + 0xDF,0x84,0xF4,0x0B,0xF6,0xA8,0x73,0x36,0x40,0x66,0x3B,0xCC,0x39,0x44,0xE9,0xCE, + + 0x4D,0xC3,0x22,0xB3,0x07,0x01,0xB2,0x27,0xD1,0x8D,0x3F,0x6B,0x53,0x36,0xAE,0x90, + + 0xB4,0x32,0xE2,0x35,0x60,0x8D,0xFF,0x7D,0x24,0xC2,0xBB,0xFA,0x21,0x80,0xC8,0x0C, + + 0x80,0x52,0x3B,0x88,0x5C,0xFE,0x55,0x73,0x4A,0x6A,0x73,0x4B,0xD8,0x47,0xC4,0x34, + + 0x52,0xCD,0x2B,0x23,0x27,0xAE,0xFB,0x5F,0x7A,0x8D,0x3B,0x92,0x54,0xAD,0x6E,0x97, + + 0xA6,0xD8,0xAC,0xE4,0x83,0xD5,0x30,0xD1,0x46,0xBC,0x06,0x14,0x64,0x35,0x7A,0x16, + + 0x27,0xD0,0x15,0xC8,0x33,0x73,0x02,0x12,0x63,0xD3,0x8F,0xBE,0x91,0x44,0xBD,0x61, + + 0x80,0x66,0x9D,0x68,0x4B,0x6E,0x53,0x4A,0xE7,0x1A,0xC3,0x8D,0xCA,0x37,0xED,0x17, + + 0xF5,0x6C,0xAD,0xD0,0x37,0x7F,0xF1,0x37,0xE7,0x31,0x62,0xB7,0x76,0xFD,0x9C,0x31, + + 0x5F,0xD5,0x24,0xAB,0x53,0xF8,0xE3,0x11,0xE2,0x79,0x63,0x0C,0x83,0xBB,0xE5,0x94, + + 0x37,0x8E,0xB7,0x55,0x40,0x93,0x44,0xD6,0x04,0xD1,0xC6,0x10,0x8A,0x54,0xDA,0xB3, + + 0xA2,0x9D,0xE4,0xE3,0x81,0x90,0xF0,0x5F,0x0D,0xB2,0xAF,0x02,0x8E,0xE9,0x6A,0xAC, + + 0x00,0x38,0x2D,0xB6,0xAB,0xF6,0x03,0x11,0xF5,0x9A,0xC5,0xC6,0x56,0x08,0xE6,0x67, + + 0x92,0x4C,0xD4,0xEC,0xE2,0xBE,0xC9,0xD9,0x4E,0x9A,0x56,0x91,0x58,0x64,0x6E,0x27, + + 0x2B,0x9B,0xA6,0x1B,0xDC,0x86,0x6E,0x41,0x6B,0x4A,0x13,0x4F,0xDE,0xB9,0xF5,0x94, + + 0xC2,0xD8,0x0D,0x28,0x1D,0x6C,0x77,0xCF,0xEA,0xD8,0x88,0xF5,0x61,0x07,0x7F,0x1F, + + 0xAF,0xA6,0xD6,0xA0,0x9F,0x24,0x3E,0x4B,0x0A,0x7A,0x02,0x3B,0xBE,0x06,0x79,0xB8, + + 0xC5,0xD7,0x4A,0xBD,0x61,0x1A,0x6C,0xE8,0xA4,0xD3,0xC9,0xDF,0xDF,0x5D,0xEE,0x38, + + 0x0F,0xDD,0x96,0xCD,0x60,0xE7,0x2C,0xB4,0x84,0xB9,0xA4,0xF4,0x07,0xBF,0x07,0x9D, + + 0xC2,0x15,0x2E,0x4D,0x7B,0x40,0xE7,0x18,0x6A,0x53,0xCF,0x14,0x89,0x7E,0x68,0x5F, + + 0xD0,0xA7,0x34,0x81,0xC0,0x47,0xEF,0x94,0x10,0xBC,0xB1,0x82,0x5E,0x60,0xC0,0xD1, + + 0x71,0x0D,0x58,0x80,0x44,0xA3,0x6B,0x5B,0x28,0x4D,0x92,0xD5,0xEF,0x22,0xD5,0x11, + + 0x81,0x41,0x08,0x52,0x0B,0x27,0xAE,0x16,0xAC,0x23,0x65,0x2C,0x73,0x7E,0xED,0x9B, + + 0x81,0x82,0x41,0xFC,0x51,0x28,0xEE,0x5B,0xC6,0x2B,0xCF,0xCA,0x9A,0xC9,0xD4,0x11, + + 0x74,0x89,0xA9,0xEC,0x30,0x22,0xE2,0x16,0x60,0x21,0xE6,0xC4,0x6E,0x31,0xF7,0x68, + + 0x04,0x6F,0xCC,0x64,0x02,0xF4,0x0D,0x61,0xFB,0x28,0x4F,0x84,0x46,0x7F,0x39,0x6F, + + 0x33,0x45,0x08,0x00,0xCC,0xF8,0xF7,0x1B,0x9E,0x07,0x07,0x75,0x55,0xBC,0x5A,0x50, + + 0xB2,0x02,0x7E,0x55,0x1F,0x44,0x37,0x4D,0xC1,0x54,0xB5,0x1B,0x35,0xD9,0x95,0x29, + + 0x56,0xBA,0x65,0xD1,0xD6,0x7B,0x83,0xA3,0x4E,0xBA,0x5A,0x51,0x56,0xE5,0x06,0x65, + + 0x29,0xA8,0xBC,0x1D,0x67,0x68,0xEF,0x66,0xBD,0x14,0xB1,0xD2,0x80,0x97,0x72,0x05, + + 0x51,0xD7,0x55,0xAC,0x96,0x2B,0x7C,0x5A,0xBE,0xB4,0x61,0x39,0x32,0x16,0xC3,0xD8, + + 0xF9,0x97,0x43,0x38,0x2B,0x6A,0xA4,0x11,0x35,0x29,0xCD,0xC2,0xE2,0x69,0xE6,0x3D, + + 0xE2,0x5A,0x3C,0x1C,0x14,0x27,0x0C,0xC2,0x3C,0xD8,0x99,0xCC,0x66,0x29,0xE9,0x37, + + 0x48,0x05,0xCA,0xD1,0x38,0x3C,0x34,0x51,0xBF,0xEA,0x7A,0xE0,0xDF,0x5E,0x2A,0x18, + + 0x25,0x80,0x40,0x93,0xEE,0x52,0x49,0x67,0x33,0x79,0x72,0xE4,0x5D,0x9C,0x03,0x59, + + 0xA9,0x66,0xD1,0x32,0xDA,0x6C,0x40,0xA9,0x8E,0x9A,0x7B,0xE5,0x5F,0x8C,0x33,0xDB, + + 0x8A,0x6A,0x27,0xD9,0xDE,0x73,0xCE,0x70,0x4B,0x02,0xB2,0x95,0x55,0xA0,0x52,0xAC, + + 0xD7,0xBB,0x50,0xDA,0x1E,0xEC,0x02,0xBC,0x8B,0x80,0x85,0xD7,0x67,0xF2,0x5B,0xBF, + + 0x59,0x44,0x2F,0x8E,0x5A,0x45,0xA3,0xEA,0x67,0x2A,0x7B,0x74,0x07,0xDC,0x56,0x81, + + 0x68,0xE3,0xEC,0x6E,0x5B,0x86,0x95,0x7D,0x41,0xCE,0x6A,0xD6,0xC0,0x1E,0x1E,0xAA, + + 0x9D,0x86,0x0D,0x53,0x23,0x30,0xFD,0x33,0x28,0x54,0x8C,0xA5,0x1A,0x42,0xFF,0x9F, + + 0x24,0x1F,0xE8,0x3E,0x16,0xAF,0x4C,0xF4,0x09,0x85,0x8D,0x6F,0x96,0x2D,0x16,0xD1, + + 0x80,0x13,0xC8,0x29,0x33,0xEE,0x85,0xDF,0x5C,0x57,0x23,0x87,0x12,0x81,0xAB,0x43, + + 0xA3,0x75,0x70,0x3C,0xB0,0x4D,0x55,0xF2,0x8B,0xA7,0xEB,0x94,0x92,0xA9,0x45,0xF6, + + 0x42,0x18,0xA5,0x51,0xBB,0x22,0x7B,0xCD,0x8D,0xF3,0xA5,0xC7,0x0C,0x6C,0x97,0x0C, + + 0x47,0x9B,0x65,0x77,0xD1,0x9F,0xA9,0x4A,0xB5,0xC5,0xA8,0x85,0xF5,0xDE,0x6F,0xA9, + + 0x51,0xB6,0xD4,0xC6,0x8E,0x46,0x47,0x31,0xCC,0xC8,0x42,0x8D,0x41,0x66,0x39,0xB4, + + 0xAE,0xEB,0x89,0x3F,0x9B,0xFA,0xB8,0x09,0xB0,0xAA,0x5E,0x6D,0xC0,0xF1,0x18,0xE7, + + 0xC3,0x8A,0xAF,0x8D,0x0D,0xEC,0xE0,0x19,0xA9,0xBB,0x27,0xDD,0xA3,0xCE,0x99,0x65, + + 0x2C,0xED,0x9F,0x4F,0x5D,0x24,0xC1,0x40,0x15,0x4A,0xF9,0x9F,0xD9,0x33,0x14,0xD9, + + 0x88,0x5C,0x31,0xAC,0x7E,0x36,0xEE,0x04,0xD7,0xA6,0xBE,0xBD,0x8E,0x70,0xBE,0x4B, + + 0xAB,0x7B,0xA7,0xE2,0xB8,0x33,0x8C,0xE6,0xEC,0xF5,0xD6,0x92,0x5D,0x3F,0x11,0xF4, + + 0xA3,0x94,0x9F,0x5F,0x07,0x7D,0x1F,0xD6,0x97,0x0A,0xD5,0xFC,0xFD,0xB7,0x04,0xF3, + + 0x38,0x8C,0xC8,0x82,0x35,0x2A,0x4B,0x59,0x2C,0xCD,0xEE,0xC9,0x1E,0x4B,0x3F,0x78, + + 0xEC,0x28,0x4F,0xE7,0xCF,0xB1,0x8E,0xCC,0xE9,0xCC,0xC7,0xC7,0xEA,0x73,0x7F,0x3B, + + 0x66,0x29,0x9B,0xF4,0x42,0x0D,0xCE,0x59,0xC2,0xAB,0x4C,0x3B,0xF6,0xFD,0x3B,0xED, + + 0x6E,0x72,0xD7,0x8D,0x7E,0x66,0xC6,0xF4,0x5B,0x1E,0xE7,0xD8,0xD9,0x48,0x18,0xBF, + + 0x52,0x80,0xE8,0x5B,0xEB,0x0F,0x4E,0x4F,0xB5,0x69,0xF1,0x90,0x65,0x13,0x50,0x82, + + 0xD8,0x8A,0x62,0x99,0x9A,0xD8,0xE8,0xD2,0x53,0xFD,0x55,0x90,0x64,0x23,0x76,0xC1, + + 0x83,0xEC,0x99,0x42,0x76,0xE4,0x62,0x9C,0x37,0x19,0x09,0x6F,0x71,0xFD,0x09,0x17, + + 0xA8,0x0C,0x29,0x03,0x02,0xAF,0x29,0x73,0x82,0xC1,0x03,0x9F,0x49,0x28,0x18,0xF9, + + 0x78,0x25,0xDC,0x39,0x77,0x0D,0xD3,0x6A,0x08,0x14,0x4F,0x8E,0x7E,0xF7,0x62,0xB2, + + 0xE4,0xF8,0xCB,0x65,0xC8,0x34,0x95,0x49,0x35,0x68,0x45,0xFC,0xDE,0xAF,0xB0,0x4C, + + 0x46,0x03,0x22,0xFC,0x7C,0xE6,0x8A,0x75,0x11,0xB7,0xCC,0x11,0x2B,0x1F,0x39,0x0B, + + 0x72,0x06,0x00,0xF7,0xD9,0xC7,0x3C,0xC8,0x95,0xF6,0x0C,0x1B,0x3C,0x44,0x66,0xA8, + + 0x8C,0xC4,0xE3,0xCA,0x5B,0x9A,0x5C,0xC8,0xEF,0x73,0xAB,0xDD,0x3D,0xAC,0xE2,0x33, + + 0xAC,0xE8,0x68,0xDA,0x5A,0x9B,0xC0,0x89,0x3B,0xDD,0x02,0x0C,0x6C,0xAB,0x78,0x39, + + 0x2D,0x88,0xB9,0x4B,0x3D,0xAA,0x6B,0xD6,0xFD,0x0A,0x0B,0x67,0xBD,0xF4,0xAB,0xB3, + + 0x28,0x73,0xB1,0x5E,0x3C,0x7F,0xC1,0x88,0xB3,0x32,0x01,0x8E,0x83,0xAC,0x5A,0xBA, + + 0x22,0x61,0x11,0x39,0xE9,0xCD,0x9F,0xD8,0xB1,0x4F,0xA1,0x99,0x44,0xB2,0xB9,0xEC, + + 0x4F,0xC0,0xC4,0x54,0xB3,0x44,0x7C,0xC8,0xC2,0xD7,0x21,0xD0,0xAB,0xE3,0xC7,0xB2, + + 0x98,0x3D,0x0A,0xD9,0x01,0x6E,0x9A,0xDD,0x39,0xC9,0xA8,0x40,0x7B,0xE9,0x53,0xBF, + + 0xED,0x42,0x3D,0x50,0xB7,0x46,0x6D,0xBA,0x46,0xC8,0x05,0x29,0xF4,0x63,0x9B,0x31, + + 0x56,0x3B,0xDC,0x38,0xCB,0x6D,0xE7,0x1B,0x2A,0x96,0x8D,0x64,0xE7,0x1F,0x32,0x30, + + 0x7B,0x10,0xD4,0xAB,0x14,0x94,0xA3,0x72,0xDB,0x24,0xCE,0x09,0x83,0xFA,0x72,0x2B, + + 0x72,0x5B,0x1A,0x45,0x0A,0x34,0xAB,0x5C,0x91,0xA3,0xCD,0x16,0x55,0xA9,0x34,0xD1, + + 0xC3,0x16,0x8D,0xF8,0xBD,0xBA,0xCC,0xCF,0x9C,0xC1,0x3D,0x1E,0x51,0xF1,0x06,0xC9, + + 0x08,0x6C,0xA2,0xC9,0xBD,0xB6,0x72,0xD5,0xCB,0xDE,0x81,0x87,0x80,0xE9,0x93,0xD1, + + 0x2B,0xF0,0xF0,0x71,0x07,0xBA,0x9E,0xCC,0x9A,0xC9,0xAF,0x3A,0x02,0x93,0x34,0x90, + + 0xD4,0xA6,0x04,0x71,0x60,0x45,0x67,0xB6,0x4F,0xC1,0x77,0xC2,0x65,0x0F,0x15,0xC0, + + 0x50,0x27,0x54,0x9A,0xD6,0xC4,0x85,0x44,0xEB,0xA0,0xB9,0x96,0x7D,0xF5,0x1E,0x39, + + 0x1A,0x9F,0x19,0x7C,0x33,0x8E,0x2D,0xE5,0x68,0xC7,0xDF,0x1B,0xDF,0x7B,0xD6,0x25, + + 0xA2,0x30,0x15,0xA1,0x4A,0x42,0xC4,0x05,0x8E,0x02,0x73,0x9C,0x5C,0x9D,0x60,0xC7, + + 0x9D,0xAC,0x87,0xE0,0xB0,0xB3,0x05,0xCF,0xDD,0xAA,0xB7,0xFB,0x7C,0xDA,0xFE,0x44, + + 0x44,0xCE,0x8F,0xF0,0xF5,0xB2,0xC4,0xBC,0x31,0xD5,0x3F,0x03,0x5B,0xBE,0x3A,0xE8, + + 0xB0,0x4F,0xE0,0x40,0x2D,0x2F,0x70,0x76,0x41,0x5B,0xAA,0x63,0xCE,0x1F,0x51,0xD9, + + 0xA6,0x11,0x77,0x53,0xD3,0x11,0x10,0x34,0xCE,0x00,0xFD,0xDF,0xB0,0x77,0x7F,0x29, + + 0x6B,0x33,0xE1,0x07,0x58,0x2F,0x0A,0xA5,0xC6,0x33,0xAB,0xAB,0x67,0xEF,0xF1,0xEE, + + 0x87,0x5A,0x81,0x01,0x6C,0x4D,0xB5,0x15,0x4C,0x02,0xE0,0x37,0xDD,0x21,0x26,0x24, + + 0x01,0x44,0xC0,0x46,0x52,0x99,0x37,0x9E,0xC2,0xC4,0xC8,0x74,0xAD,0x08,0x37,0xA8, + + 0x03,0xD9,0x0C,0xD1,0x1D,0xAF,0xE3,0x90,0x03,0xDE,0xDA,0x8A,0xAE,0x09,0xE6,0x25, + + 0x6B,0xAF,0xD3,0xBF,0x61,0xBB,0xFD,0x1A,0x1C,0x99,0xEF,0x00,0x18,0x2F,0xF0,0x0F, + + 0x5E,0x7A,0x0E,0xAE,0xB1,0x06,0x43,0x73,0xD5,0x9A,0xBB,0x7D,0xD0,0xC5,0x70,0x77, + + 0x0E,0x3A,0xE0,0xE6,0x19,0xE8,0x3F,0x57,0xD1,0xC3,0x54,0x96,0x7A,0xC6,0x32,0xE3, + + 0x86,0xAF,0x1D,0xFE,0x3D,0x2A,0xD3,0x4A,0xBA,0xE6,0x65,0x4E,0x8F,0xB6,0x84,0x6B, + + 0x7B,0x6F,0xE3,0x49,0xA5,0x27,0xEC,0xD6,0x3F,0xFF,0x94,0x5F,0x55,0x9C,0x1E,0x63, + + 0x43,0x1A,0xCF,0x3C,0xEE,0x87,0xCB,0x43,0x44,0xED,0xA1,0xA6,0x22,0xE6,0xED,0xCC, + + 0x4C,0x0C,0x02,0x5C,0xE9,0x91,0x48,0x69,0x6B,0x2C,0x69,0x2B,0x98,0x7C,0xA6,0xCB, + + 0x22,0x05,0x66,0xC7,0x1A,0x5D,0xD0,0x7A,0x1F,0x90,0xA2,0x4E,0xA4,0x6B,0xEC,0x32, + + 0x57,0xF3,0xDB,0x4C,0xC0,0xD3,0xA0,0x74,0x8A,0xD5,0x9B,0x70,0x27,0xBA,0xCF,0x46, + + 0xA2,0x4E,0x74,0x9A,0x49,0x25,0x41,0x7D,0xEA,0x2F,0xFB,0x77,0x7A,0xB0,0xFC,0x88, + + 0xD9,0x5F,0x1B,0xC3,0xFA,0x5B,0xE9,0xE7,0xBE,0x0D,0x33,0xE8,0x99,0x98,0x9C,0x8F, + + 0x03,0xBC,0x53,0x2F,0x37,0xFA,0xA5,0xEE,0xBC,0x2C,0xC2,0x56,0x75,0xDC,0x82,0x3E, + + 0xF4,0xDE,0xCD,0x90,0xC7,0x9E,0xF6,0x61,0xF8,0x8E,0x55,0x25,0xA4,0x8D,0x5D,0xE1, + + 0xA9,0x18,0xBF,0x35,0xE9,0xE3,0xB2,0xEA,0x10,0xEF,0x94,0x87,0xF7,0x31,0x9B,0x82, + + 0x24,0x4C,0x92,0x04,0x2C,0x41,0x0C,0x02,0x82,0xCB,0x5C,0xE6,0xD3,0xFE,0x15,0x67, + + 0x25,0x07,0x9D,0xC7,0x09,0x71,0x61,0x90,0x47,0xF8,0x96,0x0A,0xD0,0x73,0x7E,0x45, + + 0xD6,0x6A,0x17,0xEB,0xDC,0x03,0xE6,0x9C,0x5A,0x5D,0x0A,0x07,0x5E,0x7B,0x38,0x55, + + 0xCA,0xA3,0x93,0xD2,0xB3,0x75,0xD2,0xC9,0x08,0x13,0xD5,0x70,0x52,0xFD,0x41,0x0C, + + 0x26,0x7C,0xB8,0xF1,0xB5,0x9E,0x15,0xAA,0xFD,0xA4,0xB9,0x28,0x7A,0x7B,0x53,0x1C, + + 0x68,0xC3,0xA0,0x61,0xB6,0x7B,0xA1,0xE3,0x90,0xD3,0xB1,0xC3,0xA0,0xE5,0x59,0x3D, + + 0xA0,0x6F,0xDD,0x4D,0xF4,0xE1,0x28,0xF6,0xCC,0xE6,0xE8,0x29,0xC7,0x0D,0x47,0x9D, + + 0x24,0x5A,0x55,0xAF,0x9D,0x77,0x9B,0x48,0x4A,0x59,0x24,0xE7,0x0D,0x43,0x7C,0x20, + + 0xB7,0x53,0x80,0x8F,0xC5,0x7E,0x6C,0x59,0x3F,0xF3,0x21,0x0E,0xDB,0xF6,0x8F,0xD0, + + 0xCC,0x06,0xC8,0x70,0x73,0x0E,0x46,0x7D,0xB6,0x20,0x23,0x1E,0xDA,0xF7,0x1E,0x4E, + + 0x4D,0x52,0xDF,0xCB,0xB9,0x7E,0xF3,0x8B,0x55,0xD1,0x38,0x0F,0x5B,0xF4,0xB8,0x3F, + + 0xBB,0x50,0xEF,0x03,0x52,0x6C,0xF0,0x09,0x10,0x8E,0xA0,0x1F,0x79,0x57,0x28,0x87, + + 0x37,0xBA,0x7F,0xBD,0x27,0x54,0xF9,0xE2,0x66,0x4B,0xD3,0xDC,0x70,0x14,0x16,0x3B, + + 0xA2,0x15,0x3E,0x92,0x32,0x14,0x84,0x50,0x7C,0xCA,0x78,0xB6,0x5A,0xA3,0x1F,0x2B, + + 0x23,0x92,0x1B,0x37,0x6B,0xE4,0x24,0x1B,0xC2,0x48,0x3F,0x3C,0xC5,0x1F,0x38,0x08, + + 0xBD,0x98,0xF9,0x0E,0xE9,0x78,0xAD,0x1C,0xE3,0x63,0xF9,0xA2,0x2A,0x48,0xDF,0x05, + + 0xCC,0x8D,0x62,0x44,0x06,0x59,0x83,0x7E,0x06,0x5F,0x4F,0x21,0x80,0xEC,0xF8,0xBA, + + 0x9A,0xC8,0x1B,0x46,0xDE,0x59,0x03,0x2D,0xB6,0x39,0x68,0xF4,0x52,0x8F,0x29,0x47, + + 0x5A,0x8F,0xFE,0x27,0xD6,0x76,0xB2,0x61,0xC2,0x4B,0x75,0x22,0x81,0x66,0x71,0xEA, + + 0x08,0x01,0x52,0x08,0xB3,0x53,0xE9,0x6D,0x92,0x33,0xC1,0xA7,0x20,0xE8,0x13,0x75, + + 0xAB,0x8C,0x8C,0xF3,0x93,0xB3,0xE2,0xDA,0x4E,0xB9,0xCA,0x2A,0xA5,0x6D,0x92,0x81, + + 0x1F,0xC4,0xB8,0xE1,0x9B,0x48,0x42,0xBE,0x06,0x08,0xFA,0x9E,0xA6,0xAB,0xA4,0x4C, + + 0xBF,0xD0,0x04,0x79,0xFD,0x8A,0xF3,0xFB,0x61,0x57,0x73,0xAB,0x1D,0xA8,0x48,0xDB, + + 0xC5,0x16,0x2B,0xFB,0x65,0x06,0x03,0xD5,0x61,0xC6,0x66,0x90,0x09,0xD3,0xE4,0x0A, + + 0x4E,0xC1,0xB4,0x41,0x78,0xF8,0xFD,0x4A,0x22,0x4C,0x92,0x2A,0x7F,0x61,0x4E,0xA7, + + 0x8E,0xCF,0x94,0xF2,0xF4,0x9E,0xD6,0x92,0xC7,0x00,0x72,0xB2,0xFC,0xEB,0x21,0xAD, + + 0xAA,0x55,0x35,0x44,0xAC,0x23,0x4D,0x13,0x4E,0x2E,0x8B,0x48,0x7D,0xE8,0x36,0x3B, + + 0xF8,0xAB,0xD5,0xF6,0x12,0x09,0x1D,0x03,0x8D,0x6B,0x73,0xAB,0x7C,0xE9,0x44,0xD4, + + 0x8A,0x8B,0xCA,0xEC,0x16,0x5D,0x06,0x5D,0xE6,0x98,0x03,0xEA,0x72,0x49,0x24,0x96, + + 0xAA,0xD0,0x00,0x19,0x8A,0x3C,0x04,0x62,0xB8,0xAE,0x11,0xF8,0x80,0xAD,0x6A,0x07, + + 0xA2,0xE3,0x22,0x21,0x7F,0x3F,0x15,0xC1,0x53,0xB7,0xAA,0x83,0x69,0x0F,0x81,0xB7, + + 0x4C,0x90,0x4C,0x79,0x54,0x85,0x84,0xE2,0x46,0x0C,0x83,0xC6,0x0E,0x68,0x3D,0x54, + + 0xC1,0xD8,0xFC,0xD3,0x5F,0x17,0xB4,0x12,0x77,0xD9,0x50,0x84,0x35,0x09,0x35,0x47, + + 0x80,0xD4,0x7C,0x2B,0x37,0xF4,0x39,0xEA,0x33,0xD1,0x53,0xAD,0xC2,0x49,0x26,0x32, + + 0xFA,0xD5,0xFD,0xC2,0xC9,0x96,0x0A,0x67,0x91,0xB5,0x8D,0xC3,0x2B,0x8B,0x92,0x23, + + 0xA4,0x36,0x8D,0xD5,0x27,0xBA,0x90,0xD7,0x06,0x08,0xD6,0x88,0x26,0xB5,0x7E,0x12, + + 0x2A,0xFA,0xDB,0xFC,0xAE,0xA7,0x8B,0xF7,0x93,0xDE,0xB6,0x2A,0x3A,0xF8,0x73,0x1E, + + 0x6C,0x43,0x5E,0x4D,0x3B,0x92,0x8A,0xC5,0xCE,0x64,0xB6,0xAE,0xA1,0x90,0x83,0x78, + + 0xCA,0xEF,0x9C,0x2F,0x51,0x58,0xBF,0xA9,0x19,0xD5,0x08,0x68,0x36,0x93,0x67,0x9F, + + 0x20,0xDA,0xC9,0x1B,0xF3,0x2C,0xFB,0x3E,0xAE,0x28,0x9F,0xB7,0x00,0x97,0xB1,0x39, + + 0xAA,0x11,0xFE,0x7A,0x5D,0xD7,0x2C,0xB0,0x1A,0x9E,0xBC,0x81,0xAB,0x90,0x56,0x21, + + 0xD2,0xF3,0x79,0x5A,0x4C,0x4D,0x66,0xC3,0xE2,0x5B,0x83,0x01,0x1C,0xD0,0x35,0x68, + + 0x45,0xFA,0x70,0x25,0x1B,0xB7,0xEE,0x18,0x4F,0x61,0x33,0xB1,0xF0,0xE0,0x08,0x9B, + + 0xE7,0x62,0x43,0xAC,0x96,0x19,0x7D,0x3B,0xAF,0x44,0xE8,0x0C,0x7B,0x72,0x52,0x57, + + 0xEB,0x64,0x40,0xFD,0xE9,0xDD,0x7B,0xDC,0xC0,0xBB,0xC6,0x5A,0x32,0x17,0x83,0x94, + + 0x42,0x4E,0xF6,0x12,0xF0,0xA2,0x58,0xDD,0xFB,0x03,0x0F,0xC7,0xD5,0xEA,0xBE,0xE3, + + 0x86,0xA8,0x97,0x67,0xF0,0x05,0x9F,0xD9,0x7C,0xF9,0xEF,0x95,0xB3,0x6E,0xA2,0x56, + + 0x8F,0xDF,0xD3,0xE6,0x1D,0xAE,0xC0,0x31,0xC7,0x03,0xBD,0x89,0x2D,0x27,0xEC,0xC5, + + 0xF5,0xF9,0x3B,0x3F,0xED,0x65,0x6F,0x5D,0xA9,0x00,0x2B,0x17,0x59,0xE8,0xCC,0xAD, + + 0xFC,0x44,0x64,0x16,0x90,0x67,0xFC,0x0E,0xE0,0xCE,0xA7,0x67,0x5C,0x5F,0x85,0xBE, + + 0x77,0x0F,0x2D,0xC5,0x6E,0x06,0x6B,0xD1,0x0F,0xE9,0x05,0xB5,0x73,0xBE,0xD9,0xD3, + + 0x03,0xFC,0xD1,0xED,0x43,0xF1,0xE3,0x4C,0x28,0x03,0x6C,0xB1,0xD7,0x3C,0xC6,0xC2, + + 0xB3,0xF7,0x66,0xF2,0x7B,0x08,0x96,0x0C,0x40,0x68,0x69,0xDD,0x2A,0x68,0xAA,0x6A, + + 0x6B,0xE5,0xB5,0x5B,0xD3,0x22,0x1A,0x38,0xB6,0x49,0x4E,0x12,0x7F,0xDC,0x59,0x7F, + + 0xF0,0xA5,0x67,0xF2,0x79,0x95,0x17,0xD6,0x37,0xB5,0xB5,0x5C,0xA2,0x1F,0x75,0x1E, + + 0x74,0x04,0xC3,0x88,0x9F,0xA0,0xE4,0xC6,0x3E,0xB4,0xCD,0x07,0xBB,0x2B,0x7A,0xE8, + + 0xE7,0x7D,0xE5,0xD3,0x71,0x9A,0x68,0xD8,0x87,0xE3,0x59,0xAB,0x58,0x99,0x52,0x4C, + + 0xE2,0xF6,0xB4,0x6F,0x70,0xA8,0xA2,0x45,0xA0,0x09,0x84,0xEA,0x5B,0xD9,0x7D,0xB4, + + 0xEB,0x5B,0xC2,0xC9,0xBB,0xC6,0xF7,0x0B,0x3D,0xC5,0xD7,0x2A,0x5B,0x60,0x51,0xF6, + + 0xA8,0xFD,0x4B,0x1B,0x09,0x8B,0x61,0xC9,0x06,0xE0,0x3D,0x8C,0x11,0x1F,0x3E,0x3C, + + 0xCB,0x74,0xFB,0xF7,0x55,0x53,0x07,0xA0,0x60,0x70,0x96,0xE2,0xE2,0xD4,0x72,0x96, + + 0xC0,0x92,0xF2,0x92,0x52,0x15,0x78,0xAF,0x59,0xDA,0xBB,0x45,0xED,0xB1,0x3F,0x06, + + 0x53,0x53,0xFE,0x75,0x31,0x83,0x0C,0xA1,0xE0,0x92,0x43,0xBF,0x38,0x61,0x23,0x62, + + 0x2D,0x52,0xDE,0xAA,0x35,0xEC,0xDC,0x35,0xA2,0x1E,0x75,0x3F,0xD3,0xA5,0x1D,0xE9, + + 0x87,0x78,0x92,0x40,0x13,0xCE,0x2B,0x64,0x15,0x37,0x94,0xDB,0x7A,0x18,0x34,0x2D, + + 0x2B,0xE8,0xFA,0x25,0xD3,0x75,0xFC,0x82,0x55,0xFA,0x96,0x16,0x32,0x65,0x81,0x43, + + 0x16,0x9D,0x05,0xA5,0xAB,0x99,0xE8,0xD0,0x9F,0xF9,0xFD,0x27,0x0B,0xFA,0xE1,0x42, + + 0xCA,0x1D,0x65,0x5F,0x7B,0xA4,0xF9,0x93,0x1C,0xEC,0xA3,0x66,0x98,0xC1,0x78,0x8E, + + 0xC9,0x9B,0xB9,0xBC,0xAA,0x87,0x2E,0x5B,0x5C,0x1A,0xE9,0x51,0x78,0x76,0x76,0xBC, + + 0xC8,0xB6,0x53,0x04,0x3F,0x62,0xA5,0xFF,0xA3,0x08,0x45,0xBC,0x1A,0x04,0xB6,0x7A, + + 0x24,0x87,0xBC,0x3D,0x24,0xA5,0x4F,0x2B,0x09,0x85,0xFF,0x2B,0x04,0x3B,0x9D,0x61, + + 0x15,0xA0,0x8F,0x75,0x0D,0x76,0x57,0x98,0x8A,0x59,0x08,0x42,0x0C,0xF8,0x52,0x38, + + 0x1A,0xED,0xE5,0xDF,0x40,0x88,0xD6,0xEC,0x1D,0x3F,0xD7,0xF2,0x9E,0x88,0x5B,0xE5, + + 0x98,0x50,0xAF,0x7C,0xED,0x82,0x00,0x32,0xFE,0xA0,0x80,0xCE,0x3B,0x3F,0x3E,0xAF, + + 0x5D,0x95,0x99,0xC2,0xB6,0x70,0xFA,0x96,0x77,0x1C,0x61,0x1C,0x12,0x3A,0xE3,0x47, + + 0x5C,0x5A,0x10,0xDD,0x38,0x31,0xF6,0x97,0x94,0x5F,0xC7,0x70,0x90,0x0B,0xB0,0xF2, + + 0xEE,0x21,0xF3,0xF6,0x34,0x11,0x34,0x22,0xBB,0x3F,0x6E,0x96,0xDB,0xE2,0x7A,0x44, + + 0xEE,0xE5,0xF2,0xAE,0xFC,0xAA,0xC7,0xCD,0x45,0x3E,0xD0,0xB2,0x74,0x6B,0x73,0xF0, + + 0x00,0x0F,0x61,0xF7,0x97,0xE0,0x31,0x22,0xC4,0x3D,0x06,0x26,0x59,0xEE,0x11,0xEC, + + 0xA1,0x56,0xBE,0x27,0xB5,0xE1,0xC6,0x33,0x3A,0xC3,0x16,0x4C,0x08,0x48,0x00,0x40, + + 0x5F,0x89,0xB1,0x5C,0xDE,0x97,0xD4,0x1C,0xE5,0x85,0xCA,0x95,0x94,0x30,0xAF,0xF2, + + 0xA6,0xB5,0x00,0xDC,0x35,0x73,0xC3,0x3C,0xAE,0x3C,0xCE,0x73,0x3C,0x60,0xA5,0xC6, + + 0x88,0x0C,0xC6,0xB6,0x0A,0xC6,0xDC,0x1C,0x5B,0x9A,0x43,0x78,0x3A,0x4D,0x30,0xB3, + + 0x81,0xE5,0x96,0xAA,0x97,0xA9,0x61,0xE7,0xA7,0x38,0xFD,0xF3,0xF6,0x95,0x74,0x1B, + + 0x66,0x03,0xF8,0xCE,0x44,0xAC,0x32,0xDA,0xCA,0x43,0x51,0x2E,0x80,0x1E,0x10,0xAA, + + 0xC4,0xC8,0x7A,0x3E,0x31,0x58,0x88,0x3A,0x4D,0xC9,0x7A,0x5E,0x10,0x42,0x54,0x37, + + 0x67,0xCE,0x1F,0x2B,0xBE,0x2B,0xD1,0xDB,0x16,0x41,0xED,0xB4,0xC0,0x67,0x94,0x22, + + 0x66,0xCF,0x95,0x6A,0xF5,0xA6,0xBD,0x3B,0xCD,0xCB,0x8D,0x3D,0xB6,0x6E,0x20,0x8A, + + 0x5E,0x88,0x8A,0xC8,0xE2,0xED,0x8D,0x18,0x2C,0x33,0xAC,0x61,0x4C,0xA2,0xAE,0xCA, + + 0x0C,0xED,0x46,0x1C,0x9C,0xEF,0xDA,0x14,0x39,0x62,0x25,0x7E,0xDC,0xE3,0xE5,0xA3, + + 0xA9,0xCC,0x0F,0xCF,0x62,0x8E,0x88,0x04,0xB2,0x61,0x92,0xCF,0x08,0x51,0x35,0xA6, + + 0x70,0xCE,0xF3,0xE7,0x99,0xA6,0xDF,0x19,0x30,0x42,0x1B,0x40,0xFB,0x81,0x64,0x6F, + + 0x20,0x6B,0xD6,0x82,0x38,0xFE,0xA7,0x26,0x27,0xBD,0x1E,0x58,0xA8,0xB4,0x28,0xB8, + + 0x52,0xE4,0x14,0x86,0x92,0xF0,0xF8,0x42,0x5D,0x60,0x78,0x4D,0xD9,0xFC,0x25,0x7F, + + 0x05,0xD0,0x31,0xA3,0x87,0xE7,0x0D,0x58,0x99,0xDB,0xCB,0xA0,0x55,0x9E,0xF2,0x13, + + 0xDE,0xA4,0x0E,0x33,0x69,0xD0,0xFD,0x63,0x48,0x58,0xAA,0x4C,0x14,0x90,0xDA,0x47, + + 0xDD,0x1F,0x04,0xF9,0x12,0xB2,0x8F,0x42,0x3E,0x26,0xB7,0x20,0xE4,0xF7,0x56,0x62, + + 0x93,0x3A,0x94,0x54,0xEA,0x3A,0x83,0x76,0x0C,0xCB,0x94,0x34,0xF1,0x00,0x3F,0xFE, + + 0x4D,0xD2,0x4A,0x25,0xD5,0x96,0x2C,0x6A,0x43,0xA7,0x16,0x1C,0x89,0xF6,0xC9,0xA8, + + 0x04,0x67,0xB7,0x0D,0x14,0xB1,0x52,0x8C,0x3E,0x6A,0x6D,0x73,0x84,0xA1,0xE6,0x73, + + 0xE4,0x65,0x98,0xFF,0xE4,0xB7,0xC9,0x48,0x0F,0x8A,0xCD,0xB1,0xF8,0x2C,0x82,0x08, + + 0x29,0x93,0x90,0x7C,0x13,0x66,0x82,0xD8,0x2F,0xD6,0x12,0x3B,0x0A,0xF9,0x3F,0x86, + + 0x45,0x5B,0x95,0xBE,0x1D,0x45,0x21,0x82,0xEA,0x50,0x13,0x88,0x50,0xF7,0x52,0x8A, + + 0xC9,0x9F,0x10,0xAF,0xBF,0x14,0xBC,0xB9,0x76,0x9A,0xA8,0x40,0x08,0x68,0x46,0x01, + + 0x0A,0x17,0x49,0x38,0xD7,0x36,0x8D,0x84,0x85,0x98,0xC8,0x93,0x5D,0x8C,0x54,0x6A, + + 0xE2,0x32,0x96,0xB1,0xFE,0xDE,0xDE,0x05,0xE0,0x6B,0xFE,0x7A,0x08,0x21,0x5B,0xF6, + + 0x45,0xDA,0x9F,0xE8,0x57,0x14,0x29,0xEC,0xEE,0x73,0xB1,0x92,0xF8,0xE5,0xCB,0xB9, + + 0x58,0x14,0x3B,0x0F,0x3E,0x07,0x77,0xEA,0x06,0x9B,0x3F,0x8B,0xFB,0xBE,0x60,0xA0, + + 0x5E,0x0D,0x88,0xA1,0xB3,0x26,0x85,0xA4,0x03,0x2D,0xC3,0x3B,0x2A,0x95,0x58,0x89, + + 0x62,0x21,0xF7,0xF6,0x35,0xAC,0x58,0x0F,0x49,0x2D,0x46,0x84,0x26,0x65,0x0B,0x05, + + 0x23,0x04,0x8D,0x03,0x31,0xA8,0xAE,0xC3,0xE4,0x2C,0x04,0x1B,0xE4,0x22,0x71,0x93, + + 0xA3,0xF1,0xF7,0x3D,0x78,0x32,0x31,0xF3,0xC7,0x4A,0x46,0x60,0xAA,0x54,0xE3,0xE0, + + 0xDE,0x27,0x33,0x7F,0xE8,0xB1,0x62,0x5E,0xE1,0x5F,0x09,0xCB,0x69,0x74,0xF5,0x30, + + 0x1D,0x77,0x7F,0x70,0xFA,0x2E,0xF3,0xF5,0xD0,0x7A,0x17,0xF6,0x71,0xA7,0x62,0xE5, + + 0x5A,0x65,0xB2,0x87,0x11,0x60,0xD5,0x3F,0x4F,0x24,0x88,0x65,0xD4,0x4D,0x77,0xF4, + + 0xBF,0xA8,0x34,0x2E,0xAF,0x58,0xA6,0x81,0x32,0xF6,0xE3,0x97,0x7F,0x9A,0x3A,0x58, + + 0x00,0x07,0x2E,0x9F,0x47,0x22,0x41,0xDB,0xAC,0xE7,0x52,0xD5,0x90,0x95,0x72,0x9A, + + 0x0C,0xC3,0x9B,0xF6,0xBC,0x20,0xDA,0x58,0x70,0x4A,0x22,0xC3,0x6A,0x6D,0x63,0xA9, + + 0xDE,0x87,0xC7,0xFD,0xB7,0x8B,0xA5,0xD8,0x20,0x5A,0x8B,0xB8,0xEB,0xEF,0x51,0x1C, + + 0x2A,0x49,0x8D,0x22,0xA9,0x69,0xF8,0xC2,0x58,0x36,0x23,0x00,0x7E,0x26,0xE2,0x3A, + + 0x60,0x4F,0xF8,0xE9,0xAD,0xD1,0x92,0x0C,0x99,0xB1,0xAA,0x48,0x2D,0x4C,0x74,0xF9, + + 0x37,0xA2,0xEA,0xB6,0x78,0x29,0x35,0x5C,0x3C,0x69,0x42,0x16,0xFA,0xD2,0x3D,0x4E, + + 0x2B,0xF1,0x6F,0xC2,0x2F,0xA7,0x2B,0x70,0x30,0x88,0x89,0x02,0xAE,0x2C,0xEB,0x2B, + + 0xE1,0x0C,0xAA,0x1D,0x97,0xDA,0x84,0x3B,0xCD,0x17,0x64,0x3A,0x01,0x67,0xC4,0x70, + + 0x8F,0xA1,0xDA,0x46,0x22,0x72,0x2E,0x1C,0x8B,0x96,0x3D,0x20,0x3F,0x0D,0x77,0xD7, + + 0xFF,0x1B,0x81,0x16,0x30,0x56,0x7E,0xA0,0x80,0x13,0x27,0x3A,0x86,0x1D,0xC5,0xE5, + + 0x23,0x1F,0x85,0x01,0xB6,0xC9,0x4B,0x32,0xE4,0xF9,0x39,0xDA,0x6E,0x8D,0x8F,0xCE, + + 0x50,0xEF,0xB7,0x77,0x33,0x1B,0x05,0x89,0xE7,0x5A,0x22,0x2E,0x04,0xE5,0xD4,0xA2, + + 0xD1,0x71,0x99,0x68,0xCE,0xAF,0x6E,0x1E,0x01,0xDE,0xDC,0xF1,0x8F,0xC2,0x77,0xA0, + + 0xA3,0x93,0xD4,0xD1,0x4C,0x15,0x16,0xED,0x42,0x17,0x4C,0xB3,0x8A,0x83,0x7D,0x06, + + 0x60,0x06,0x05,0x20,0xCE,0xCB,0xC6,0x0B,0x47,0xA9,0x2A,0x9B,0x20,0xA9,0x6D,0xF5, + + 0x21,0xEB,0x5D,0x28,0xB3,0x76,0x9A,0x8E,0xA0,0xA7,0x22,0x8F,0x25,0xA8,0xAD,0xF3, + + 0xFD,0xA8,0x22,0xEE,0x79,0x18,0x52,0x59,0xF4,0x18,0x9E,0xA9,0xF7,0x7C,0xA1,0xBC, + + 0xF5,0x68,0x2E,0x5E,0xB5,0x37,0x61,0x45,0x69,0x57,0x0E,0x3E,0x5B,0x8B,0x27,0x53, + + 0x75,0xC7,0xFF,0x4F,0x3B,0x34,0xFF,0x23,0xCA,0x8C,0x93,0xEA,0xFB,0x47,0xCF,0xD8, + + 0xC5,0x00,0xF7,0x5F,0x18,0x78,0x77,0x3F,0x15,0x1A,0xA7,0x6D,0x0E,0x74,0xBB,0xB7, + + 0x89,0x1A,0x2A,0x4C,0xC6,0x1C,0x4E,0xF8,0x22,0x26,0x46,0x9E,0x91,0x6D,0x2E,0x87, + + 0x90,0x60,0xD6,0xF8,0xEF,0xF8,0xCD,0x7C,0x20,0x8F,0x1E,0x2C,0xD6,0x70,0xE8,0x27, + + 0x53,0x11,0x6B,0x8F,0x39,0x7C,0x77,0xE1,0x89,0x7B,0x8D,0x61,0x92,0x6F,0x37,0x5B, + + 0x76,0x00,0x68,0xEA,0x50,0x9A,0x65,0x1B,0x16,0x10,0x33,0x6F,0xF3,0x77,0xFB,0x85, + + 0x73,0x2C,0x7F,0xC3,0x5C,0xB1,0x19,0x14,0xA6,0xD0,0x5C,0xB4,0x16,0xE8,0x12,0xE9, + + 0x01,0x5A,0xF2,0xE9,0xB2,0x0C,0x8A,0x08,0x55,0x04,0x80,0x66,0x5D,0xEE,0xFE,0x7B, + + 0xBB,0x0A,0x81,0x6D,0xA7,0x32,0x83,0x90,0x74,0xB1,0xB2,0xA5,0xDD,0x86,0x90,0xEE, + + 0x7A,0x0E,0x66,0x77,0xD1,0x98,0x0E,0xCE,0xC5,0xCD,0x29,0x45,0xE6,0xE7,0x1E,0x45, + + 0xFB,0x8B,0xB8,0x62,0xEB,0xC8,0x4B,0xE6,0x32,0xB8,0xF2,0x7A,0xA0,0x24,0x10,0x56, + + 0xE7,0x04,0x8F,0xA9,0x33,0x5E,0x51,0x9A,0xA9,0x87,0x86,0x70,0xB6,0x66,0x41,0x25, + + 0xA2,0x2D,0x86,0x07,0xD6,0x5B,0x28,0x30,0xC0,0x17,0x4E,0x97,0xE6,0x37,0x29,0xA0, + + 0x03,0x2A,0xE9,0x73,0xA8,0x87,0xEA,0x39,0xC1,0x36,0x53,0x84,0x5B,0xEA,0xD9,0xF1, + + 0x3F,0x5C,0xD6,0x69,0x91,0xCA,0x5A,0xAC,0xB0,0x89,0x4A,0x0A,0x85,0x15,0x49,0xDA, + + 0x13,0x92,0x82,0xFC,0x9C,0xCD,0x96,0x78,0xCE,0x34,0x7A,0xEB,0xE0,0x95,0x99,0xF1, + + 0x75,0xE6,0x5B,0x2B,0x1D,0xA7,0xDF,0xAB,0x30,0xEA,0x9C,0x75,0x29,0x76,0x8A,0x6D, + + 0xF4,0x82,0x83,0x19,0x1C,0xA5,0x29,0x3F,0x26,0x2D,0x04,0x70,0x48,0x36,0x1A,0xFA, + + 0xB2,0x23,0x3B,0x18,0x25,0x0F,0x9D,0xEE,0x5C,0x60,0x0D,0x4A,0xB5,0x88,0x14,0xB8, + + 0x1D,0xC0,0x7D,0x21,0x3C,0x7D,0x40,0x92,0x85,0x02,0xC0,0xDB,0xAC,0x83,0xC7,0x6F, + + 0xEF,0x8A,0x54,0xA3,0x98,0xC5,0x73,0x6B,0xCE,0xCE,0xCB,0x5E,0x7F,0x51,0x71,0x59, + + 0x45,0x80,0x36,0x5E,0xA8,0x63,0x22,0x21,0x68,0x8E,0x44,0xE4,0x2A,0x79,0x50,0x00, + + 0x98,0xF3,0x64,0xBB,0xE8,0x1B,0x0C,0x72,0x93,0xDF,0xD4,0xE2,0x33,0x7D,0x54,0xB5, + + 0xD8,0x9E,0x84,0x6F,0x37,0x2A,0xAC,0xD0,0x26,0x6E,0x84,0x66,0x8E,0xFE,0xE5,0x52, + + 0xD8,0x4F,0x34,0x84,0xDF,0xC3,0x0D,0xF3,0xE0,0xDD,0xCD,0x25,0xD6,0x00,0x74,0x34, + + 0x27,0xE6,0x58,0xA8,0xD8,0x66,0x45,0xD1,0xA4,0xF3,0xDD,0x17,0xAF,0x7E,0x5A,0x0B, + + 0x85,0x92,0x24,0xA6,0x24,0x1F,0xF7,0x5C,0x2E,0x0A,0xF2,0xD9,0x46,0xB6,0x14,0x72, + + 0xD8,0x2A,0xBC,0x48,0xCC,0x4E,0x78,0xB5,0xE6,0xDB,0xC2,0xDE,0xFA,0x73,0x6D,0xAC, + + 0xC5,0xB6,0x40,0xC3,0x31,0xA0,0xE5,0x24,0xE4,0x23,0xAF,0xAC,0xBE,0xE7,0x0D,0x93, + + 0x58,0x9A,0xED,0x15,0x34,0xF1,0xBD,0x93,0xA4,0x5A,0xFB,0xB7,0x1E,0xB6,0x71,0x0E, + + 0x67,0x69,0x3C,0x66,0xA1,0xF5,0x4E,0x8E,0xCF,0xDE,0xCE,0x2C,0xFC,0x41,0x56,0x72, + + 0x8F,0xD4,0xF7,0x88,0xD8,0x66,0xC5,0x58,0xCC,0x53,0x39,0x3C,0x5F,0x8B,0x9C,0x69, + + 0x00,0x67,0xBD,0x8B,0x9D,0x5A,0xBF,0x6E,0x4D,0x50,0x8F,0x50,0x3D,0x70,0xD0,0x6B, + + 0xE0,0x3A,0xAE,0xE9,0x42,0x6F,0x40,0x59,0xC9,0xDD,0xC7,0xBB,0x8A,0xBA,0x76,0xA8, + + 0x95,0xDD,0x51,0xEA,0xDF,0x23,0x08,0xDC,0x85,0x39,0x5E,0x73,0x4D,0xDA,0x79,0x5E, + + 0x0A,0x03,0x78,0x35,0x8C,0xFF,0x66,0x93,0x4D,0x0B,0x3E,0x82,0x2B,0xBF,0x5D,0x30, + + 0xCD,0x03,0x98,0x22,0xBC,0xE5,0x29,0xD8,0xFA,0x9C,0x4D,0x14,0x81,0xDE,0x57,0x2A, + + 0x0C,0x7F,0x29,0x7E,0x80,0x0E,0x00,0xC4,0x11,0x0A,0x23,0xD4,0x1E,0x50,0x9F,0xF3, + + 0x71,0x4C,0x92,0x3C,0xEB,0xAD,0x18,0x97,0xA1,0x4F,0x4D,0x25,0x54,0x40,0x2F,0xE6, + + 0x84,0x41,0x92,0x11,0xFA,0x65,0x52,0xCE,0xE2,0x4C,0x27,0x0D,0xBA,0x25,0x83,0x47, + + 0xDC,0x19,0xD3,0xA1,0x63,0x9F,0x71,0x61,0x26,0x4F,0xA0,0x57,0x23,0xD0,0xE1,0x14, + + 0xA5,0xFE,0xAA,0x12,0x70,0x2C,0x53,0x2C,0x80,0x4B,0xA3,0x89,0x3A,0x07,0x64,0xB9, + + 0x83,0x1F,0x3B,0x63,0xB3,0xDB,0x8B,0x64,0x23,0x45,0x2F,0x9B,0xAD,0x9B,0xF2,0xBF, + + 0x7C,0x13,0x92,0x51,0xB0,0x23,0x20,0xD0,0xBC,0xFA,0x27,0x8B,0xAC,0x9A,0xE3,0x37, + + 0x35,0x16,0x51,0xC7,0x93,0x5E,0x31,0xC1,0xCE,0xCB,0x2E,0x9A,0x2D,0x99,0x92,0x5E, + + 0x87,0x7C,0xC1,0x19,0x72,0x28,0x39,0xD1,0xCF,0xCC,0x26,0x8A,0x2C,0x98,0x14,0x6A, + + 0x60,0x05,0x05,0xB3,0x1A,0x55,0x6A,0xAA,0x49,0xCF,0xAA,0x14,0xAB,0xD5,0x30,0xA8, + + 0x98,0xA6,0x37,0xFE,0x79,0x7B,0x62,0x1C,0xCB,0x4A,0x35,0x18,0xDB,0x4D,0x11,0x03, + + 0x63,0x4E,0x13,0x89,0xDB,0x27,0xA8,0xCB,0x64,0xB7,0xCB,0xCE,0x05,0xF7,0xAF,0x7B, + + 0x7A,0x6E,0x4B,0xCD,0x34,0xA0,0x5A,0x99,0x8D,0x7B,0x16,0x5F,0xF8,0x0B,0x0A,0x8F, + + 0x08,0xF9,0x52,0xCE,0xC7,0xA3,0x56,0x8A,0x6E,0xC1,0x2D,0x93,0xA5,0x93,0x4A,0xA9, + + 0xC7,0x2D,0x17,0x5D,0x1F,0x76,0x60,0x83,0x4D,0x96,0x25,0x83,0xA4,0x92,0x47,0x0E, + + 0x0B,0x00,0xF9,0xAF,0x06,0x14,0xA8,0x36,0x3F,0xB2,0x2C,0x92,0x25,0x91,0x4B,0x9B, + + 0x08,0x49,0x40,0xDF,0x46,0xA0,0x8F,0x65,0x3D,0x3E,0x24,0x82,0x24,0x90,0xE7,0x7B, + + 0x5F,0x10,0x6C,0x14,0x14,0x9D,0x5E,0xBD,0xC3,0x56,0x20,0xDB,0xD3,0x31,0x9C,0xD2, + + 0x80,0x1D,0xC4,0x8C,0x37,0xAA,0xA8,0xCF,0xC2,0x10,0xC5,0x02,0xD4,0xF7,0x6D,0x43, + + 0x26,0xE7,0x1A,0xC2,0x7A,0x39,0x1D,0x0B,0x15,0x5D,0x85,0x2D,0xF2,0x1C,0x75,0xD3, + + 0x2D,0x1F,0x6C,0x11,0xC6,0xEF,0x44,0x6D,0x82,0x57,0x8E,0x3D,0x54,0xFA,0xE0,0xBB, + + 0x81,0x55,0xCF,0x93,0x4D,0xFF,0x6E,0x13,0x1F,0xFB,0x2B,0x1B,0x8D,0x8B,0x2A,0xA8, + + 0x61,0xB1,0x38,0x56,0x32,0x52,0x24,0xE0,0xC0,0x1B,0x23,0x0B,0x8C,0x8A,0xE9,0x29, + + 0x2A,0xDB,0x1E,0xC1,0xB6,0xAD,0x4E,0x63,0xE3,0x21,0x2A,0x1A,0x0D,0x89,0x15,0x33, + + 0x43,0xA8,0xF5,0x2A,0x52,0x38,0xEC,0xD5,0x61,0x1F,0x22,0x0A,0x0C,0x88,0xA6,0xCA, + + 0xAB,0xB3,0x46,0x6D,0x26,0x7A,0xEE,0xA0,0x89,0x17,0xB6,0x3E,0xF0,0x70,0x8C,0x5A, + + 0xAA,0x17,0x1E,0x1E,0x38,0xDC,0xE6,0xB0,0x0A,0xA6,0x0E,0xCE,0x86,0xF2,0x6F,0x09, + + 0xAE,0x80,0x5C,0x9F,0xF0,0xC3,0x4E,0x64,0x8B,0xA1,0x17,0x6A,0xDC,0x16,0xAF,0x5B, + + 0x25,0x15,0xB7,0x63,0x3B,0x33,0xE7,0xCB,0xDA,0x83,0x63,0x80,0xFF,0x32,0x86,0x25, + + 0x3E,0x5D,0x79,0x2E,0x1E,0xC8,0xF6,0x9A,0xC9,0x5A,0x29,0x13,0x85,0x83,0x66,0xDE, + + 0x2D,0xE6,0x79,0xF0,0x3F,0x26,0x26,0xFC,0x1C,0x1C,0x21,0x03,0x84,0x82,0x6F,0xAB, + + 0x2B,0x7A,0x56,0x49,0xC9,0xCE,0x87,0xAD,0x49,0x3B,0x28,0x12,0x05,0x81,0xD5,0x1B, + + 0x2F,0x11,0x06,0x7D,0xA7,0x9F,0xE0,0x3E,0x31,0x57,0x20,0x02,0x04,0x80,0x18,0xF9, + + 0xA8,0x8D,0xA4,0xE4,0xE9,0xE2,0x6A,0x09,0xE7,0xA5,0x30,0x5B,0xC7,0x4D,0x71,0x72, + + 0x01,0x93,0x1C,0x6D,0xB6,0xE0,0xBE,0xC2,0xFD,0xCE,0x38,0xF6,0xC2,0xA3,0xDA,0x24, + + 0x25,0x7D,0xEF,0x33,0x65,0xAD,0x6B,0x01,0x67,0xC6,0x6E,0xD5,0xF5,0x82,0x1D,0xD4, + + 0x87,0x76,0xF0,0x98,0xD1,0xE1,0x8D,0xC3,0xE5,0xCC,0x62,0x11,0xF1,0xF8,0xD7,0x66, + + 0x84,0xCC,0xBA,0x47,0xB5,0x00,0x0A,0x46,0xC4,0xEC,0x0F,0x99,0xA9,0x1B,0x08,0xF6, + + 0x46,0xC7,0x63,0x25,0x34,0x01,0x00,0x55,0xE6,0x4F,0x07,0x89,0xA8,0x1A,0x3E,0xB3, + + 0x82,0x89,0xAD,0x8E,0x92,0xFD,0x4E,0x01,0x85,0x19,0x0E,0x98,0x29,0x19,0x28,0x00, + + 0xCD,0x2D,0xF2,0xB5,0x77,0x18,0x82,0xF7,0x82,0xD8,0x06,0x88,0x28,0x18,0x26,0x4D, + + 0x8D,0x86,0xFD,0xF1,0x2F,0xDE,0xC2,0x3E,0x68,0xCE,0x51,0x58,0xD1,0x6E,0x32,0x9B, + + 0x66,0xFD,0xA2,0x16,0x1B,0x00,0x5A,0x7A,0xFB,0xC4,0x59,0x48,0x19,0xAB,0xE3,0x6B, + + 0xA8,0xC8,0x19,0xC8,0x5E,0xEA,0x3B,0x84,0x2D,0xC5,0x70,0xEF,0x8C,0xF1,0xAB,0xDD, + + 0x1F,0x88,0x8C,0x9B,0xAA,0xFD,0x71,0xC5,0x6E,0xC6,0x60,0x9C,0x28,0xE4,0x2C,0x9B, + + 0x2A,0x70,0x22,0xA3,0x0A,0xED,0xE2,0x9B,0xED,0x8C,0x0D,0x91,0xA1,0x13,0xFD,0xA5, + + 0xEE,0x0E,0xB3,0x5F,0xB8,0xB6,0xDA,0x09,0xEC,0x4E,0x05,0x81,0xA0,0x12,0x79,0x4E, + + 0x53,0x03,0xD9,0xA7,0x5E,0x61,0x41,0x5B,0xFE,0x61,0x0C,0x90,0x21,0x11,0xBB,0x44, + + 0x0B,0x20,0xAD,0xB9,0xBB,0xED,0x8A,0x88,0x43,0x8E,0x04,0x80,0x20,0x10,0x5C,0x40, + + 0x85,0xD3,0x12,0xE4,0xB9,0x66,0xCC,0x4A,0x7D,0x9F,0xDC,0xC4,0x83,0x9C,0x54,0x10, + + 0x24,0xD6,0x40,0x94,0x3D,0xDD,0x98,0xF3,0xA0,0xE4,0x3D,0x55,0x71,0xAA,0x45,0xC3, + + 0x0A,0x1F,0x09,0x18,0xB5,0xD2,0xA5,0xE0,0xA0,0xFE,0x71,0x45,0xA8,0x05,0x15,0xC3, + + 0xAD,0x9C,0xE5,0x75,0x91,0x1E,0xB7,0xF2,0x20,0xA6,0xE7,0xC4,0xD6,0x9F,0xC0,0x00, + + 0x87,0xD7,0x4C,0xCB,0x30,0x77,0x76,0x9D,0xBC,0x2B,0x0B,0x19,0x89,0x0B,0xE8,0x30, + + 0x21,0x8C,0x8C,0x85,0xC5,0xB8,0x83,0xD6,0xBB,0x91,0x03,0x09,0x88,0x0A,0x05,0x87, + + 0xF9,0x1D,0xD1,0xE3,0xFE,0xFD,0xE5,0xA4,0x1F,0x20,0x0A,0x18,0x09,0x09,0x6D,0x51, + + 0xA2,0xF3,0xEF,0x35,0x93,0x48,0xDE,0xF4,0x5A,0xDE,0x02,0x08,0x08,0x08,0x1E,0x5A, + + 0x70,0x10,0xB8,0xBE,0xCB,0x19,0xA4,0xAB,0x57,0xD8,0xD4,0xBF,0x7F,0x98,0x5E,0xE4, + + 0x8E,0xFC,0xBC,0x9E,0xC2,0x14,0x2F,0xB9,0x34,0xD9,0xE6,0x8E,0xC2,0x95,0x17,0x69, + + 0x2E,0x92,0x9F,0x90,0x1F,0x3F,0x33,0x52,0xEC,0xF6,0x8D,0xAD,0xB8,0x57,0x90,0x79, + + 0x89,0x9D,0xD7,0x2F,0x1E,0x64,0x3F,0xC9,0x12,0x26,0x7B,0x40,0xD9,0x60,0x3C,0xDA, + + 0x8D,0xDD,0x19,0x31,0xC1,0x43,0xF4,0x67,0x97,0xD3,0x09,0x11,0x81,0x03,0x2E,0x26, + + 0x91,0xDF,0x11,0x21,0xC0,0x42,0x27,0x64,0x29,0x10,0x01,0x01,0x80,0x02,0xA7,0x33, + + 0x7F,0x65,0x18,0x30,0x41,0x41,0xC3,0xE9,0x01,0x9F,0x08,0x10,0x01,0x01,0x27,0xDB, + + 0xA9,0x67,0x10,0x20,0x40,0x40,0xBF,0x07,0x45,0xD2,0x00,0x00,0x0E,0x35,0x80,0x05, + + 0x76,0x8D,0xDE,0x85,0xB1,0x8B,0x52,0x92,0x14,0x40,0xCE,0xA1,0x58,0xCB,0xAC,0x72, + + 0x40,0x81,0x90,0xE5,0x5B,0x21,0x24,0xB2,0x41,0xA7,0xC6,0xB5,0xD3,0xCA,0x7F,0x19, + + 0x02,0x2A,0x41,0x05,0xFB,0xA0,0x19,0x24,0xC4,0x62,0x90,0x05,0x50,0x48,0x71,0xEC, + + 0xC1,0x41,0xD7,0x1D,0xB1,0x88,0x47,0xD3,0xCD,0xC6,0x59,0x35,0xBA,0xE1,0x7E,0x48, + + 0xC0,0x06,0x3F,0xBA,0x14,0xE4,0x46,0xF1,0xA9,0xE6,0xF9,0x23,0x7C,0xE8,0xFB,0xC0, + + 0x05,0xA5,0x08,0x40,0x82,0xA8,0x1A,0x03,0x5F,0x4C,0xF1,0x73,0x52,0xE5,0x49,0xC5, + + 0x7E,0xA4,0xD4,0xC1,0xD6,0xBB,0xEA,0xD0,0x80,0xE9,0x9B,0x78,0x93,0x67,0x05,0x23, + + 0xEB,0xA5,0x36,0xD1,0xD7,0xD2,0x2F,0xF3,0xCA,0x3A,0xA3,0xA1,0x53,0x47,0x80,0x6A, + + 0x73,0xDA,0x87,0x0C,0x9A,0x20,0x3C,0x2F,0x20,0x47,0x82,0xDD,0x12,0x68,0x7A,0x5E, + + 0xF5,0x4B,0xEA,0x5C,0x0C,0x26,0x1A,0x7B,0x4D,0x49,0x9B,0x1C,0xD9,0xA8,0xDC,0x08, + + 0x8E,0x8A,0x0E,0xFD,0x90,0x25,0x3D,0x2E,0xE7,0x0A,0xCD,0xA8,0xD0,0xC1,0x89,0x63, + + 0x0B,0x23,0x0B,0x1C,0x30,0x80,0xF1,0x3D,0xC9,0xE4,0xC5,0xBC,0x5B,0xC0,0xBD,0x3B, + + 0x48,0x8F,0x02,0x5D,0x8D,0x6E,0x08,0x75,0xE9,0x4A,0x58,0x9A,0x85,0xE1,0x74,0x54, + + 0x6A,0xED,0xB5,0xA6,0xE4,0xF2,0xDA,0x9A,0xEA,0xB2,0xD8,0x74,0x59,0x6C,0x03,0xB7, + + 0x0A,0x5E,0x41,0xF7,0x7B,0x51,0x5F,0x07,0x6B,0xC6,0xF3,0x60,0xD2,0x2E,0x53,0x4C, + + 0x77,0xAD,0x0B,0x4D,0xB1,0xA2,0x11,0x78,0x28,0xC5,0xD3,0x7F,0x59,0x8F,0xBF,0xE2, + + 0x61,0x50,0x03,0x75,0x3A,0x36,0xBA,0x51,0x6A,0x5C,0x95,0x84,0x1B,0x40,0x74,0xE3, + + 0x71,0x18,0xCE,0x1E,0x5A,0x93,0x62,0x20,0x8A,0xF3,0xD8,0x36,0x1A,0x33,0x7D,0xE3, + + 0xE3,0xCD,0xDB,0x01,0xB0,0x99,0x4B,0x25,0xE0,0xDF,0x95,0xA7,0xB2,0xD9,0x4C,0x6C, + + 0xC7,0x51,0x8D,0x64,0xA1,0x23,0x43,0xB9,0xC1,0xFC,0x9D,0x44,0xB3,0x7D,0x3A,0xCD, + + 0xAD,0xB9,0x04,0xD0,0xC3,0x2F,0x6C,0xB0,0x66,0x5B,0xEE,0x63,0xDE,0x2B,0x4D,0x42, + + 0x23,0x1D,0xB3,0x56,0xB3,0x35,0x26,0x20,0x6B,0x8A,0xE6,0x73,0xDF,0x69,0x40,0x53, + + 0x22,0xBB,0x3A,0xB7,0x55,0x28,0x6D,0x1E,0xA1,0x76,0xEF,0x62,0x5E,0x69,0x09,0x20, + + 0xB7,0x13,0x12,0xD5,0xC4,0x3D,0xE2,0x21,0x14,0x8F,0xF3,0xF3,0x62,0x2B,0x84,0x62, + + 0x57,0x10,0xD8,0x85,0x38,0x78,0x13,0x2A,0x69,0x20,0xC8,0x3D,0x78,0xF5,0x70,0x1A, + + 0x28,0xFE,0xEE,0x6D,0x3F,0x39,0x26,0x49,0x6F,0x59,0xDE,0x4F,0x61,0x7F,0xDC,0x8D, + + 0xAE,0xBA,0x83,0xEE,0xD3,0x18,0x37,0x3D,0x83,0x78,0xE9,0x28,0x93,0x6A,0x55,0x98, + + 0x0A,0xB4,0xD1,0x0D,0x19,0x90,0x41,0x29,0xC9,0xF0,0x97,0xF0,0x9A,0x1B,0x1C,0xCA, + + 0x42,0x2C,0xFC,0x2E,0x96,0xC2,0x2E,0x19,0x3A,0x7C,0xF8,0xEB,0xEF,0x73,0x18,0xD0, + + 0xC0,0x0D,0xFE,0x62,0x50,0x09,0x26,0x8B,0x3B,0x56,0xF7,0xB2,0xB2,0x19,0x39,0xC0, + + 0xC9,0xE1,0xBC,0x13,0x0D,0x95,0x37,0x29,0x24,0xD3,0x63,0xA7,0x33,0x3A,0x6F,0xCD, + + 0x63,0x2F,0xCF,0x2C,0x33,0xC0,0x24,0x99,0xBC,0x54,0x76,0x22,0x42,0xA1,0x9D,0xF2, + + 0x58,0x8F,0xE4,0x84,0x7F,0xE2,0xB0,0x23,0x44,0x80,0x70,0x26,0x3F,0x62,0x22,0x16, + + 0xA6,0x8C,0xF6,0x87,0x15,0x0A,0x68,0x36,0x4D,0xE9,0xE6,0xB3,0x5D,0x4A,0x41,0x42, + + 0x31,0x8F,0xA1,0xF6,0xD6,0xA6,0x35,0xBE,0xC0,0xE2,0xB9,0xD6,0x9E,0xE2,0xD6,0xC3, + + 0x8D,0x0C,0xA8,0x97,0x15,0xA2,0xB9,0x32,0x82,0x83,0xB8,0x17,0x55,0xA1,0xD3,0xD2, + + 0x00,0x24,0x1D,0xBD,0xE5,0x5B,0x74,0x9C,0xBB,0x4E,0xF2,0x14,0x21,0xC4,0x32,0x4F, + + 0xA4,0x83,0xD2,0xB9,0xEC,0x3A,0xF0,0x4E,0xA6,0xCA,0x07,0xA6,0x29,0xE6,0x2D,0xC1, + + 0x8F,0xFB,0x1A,0xC3,0x9A,0xCB,0x8A,0x3F,0x65,0xC0,0x15,0x07,0x24,0x83,0x65,0x3D, + + 0x26,0x0F,0x16,0xA9,0x91,0x27,0x19,0x33,0xDA,0x4C,0xC7,0x7E,0x94,0x15,0x68,0x0B, + + 0xFB,0x75,0xFC,0x8F,0x9E,0x03,0x36,0x5A,0x48,0xE8,0xEC,0xAF,0xDE,0x43,0x4A,0x5B, + + 0xF0,0x02,0xCA,0xEF,0x57,0xA9,0xBA,0x3B,0x9F,0x89,0xA2,0xCF,0x17,0xE9,0x69,0xF5, + + 0xD9,0x85,0x63,0x0F,0xF7,0x28,0x6D,0x2F,0xC4,0xDE,0x73,0x2F,0xB7,0x68,0xAC,0xF9, + + 0x0F,0xA3,0xF5,0x17,0x8D,0xAF,0x3F,0x99,0xC9,0xEB,0xE5,0xBA,0xD5,0x40,0xE2,0xA8, + + 0xAF,0x73,0x3A,0x3C,0xE1,0x73,0xF6,0x88,0xCC,0xC4,0x09,0x1C,0xD0,0x89,0x6E,0xA4, + + 0xF2,0x07,0x68,0xDE,0x19,0x6D,0x76,0x05,0x2C,0x3D,0xB0,0x3C,0x37,0xE0,0x29,0x4A, + + 0x6D,0x04,0x23,0x5E,0x95,0xEC,0xFA,0x19,0x6D,0xC8,0xEB,0x6E,0x8A,0x12,0x90,0x07, + + 0x2C,0x02,0x63,0x7B,0x1A,0x5A,0x03,0xF9,0xC6,0x12,0xE3,0x55,0xDE,0xF8,0x55,0x44, + + 0xD4,0xDE,0xE2,0x86,0xB4,0xD3,0x72,0xA2,0x0F,0xC0,0xCC,0x24,0x7D,0x8D,0x76,0x93, + + 0x86,0x97,0x6C,0x96,0x5E,0x33,0x5C,0xF2,0x78,0x5C,0xB0,0xD8,0xD4,0x79,0x92,0x01, + + 0xA1,0x63,0xFB,0x06,0x36,0x19,0x25,0x52,0xFC,0xD2,0xEF,0xBA,0x57,0xF4,0xA5,0xAF, + + 0x06,0x95,0x85,0x66,0xFF,0xB3,0x45,0x31,0xE4,0x8B,0x3D,0x55,0x54,0x0C,0xE5,0x33, + + 0x3A,0xB4,0x64,0xC3,0xE0,0xF4,0x3F,0x0D,0x9D,0x2B,0x4A,0xE4,0x80,0x20,0x5F,0x42, + + 0xDB,0xD7,0x58,0x3C,0xD6,0xD3,0xBC,0xE6,0x44,0x97,0x7B,0xED,0x75,0xBB,0xD0,0xCF, + + 0x5E,0x34,0xE5,0xC2,0x57,0xD0,0x8E,0x67,0xA2,0x58,0xF2,0xF8,0xA2,0x62,0xDE,0x52, + + 0xA1,0x17,0x59,0x97,0xBB,0x78,0x7B,0x0A,0x98,0x87,0x8B,0xB1,0x51,0xBB,0x6E,0x1D, + + 0x8D,0x91,0xF8,0x86,0x3E,0xBC,0x34,0x48,0x68,0xF8,0xFC,0xAF,0x9F,0x72,0x16,0x69, + + 0x39,0x14,0xF0,0x1A,0x3D,0x34,0x60,0x3E,0x6D,0x72,0x45,0xE2,0xDE,0x97,0xDE,0x09, + + 0xAF,0x7C,0xA8,0x7E,0xB6,0xBC,0x0B,0x5A,0xE6,0xD6,0xB3,0x51,0x01,0x70,0x51,0x1E, + + 0x44,0xCB,0xD1,0x0F,0x56,0x19,0x7D,0xFB,0x6D,0xEB,0x81,0xB6,0x3F,0xFB,0xBE,0xF5, + + 0x3A,0x47,0xC6,0xCF,0x99,0xAC,0xB6,0xFE,0x79,0x9E,0x82,0x13,0x40,0xBE,0x10,0x5E, + + 0xDA,0x3E,0xD4,0x59,0x93,0xA2,0x7E,0x7E,0x2B,0x79,0x3E,0xEA,0x83,0x08,0x67,0xB4, + + 0xC6,0xDC,0x08,0x3D,0x3E,0x8F,0xF5,0x65,0xE8,0xDE,0x75,0xD0,0x02,0x9C,0x2B,0x28, + + 0xA5,0x62,0xA5,0xCA,0xDF,0x2F,0xBF,0xEA,0x3D,0x52,0xF8,0x7B,0xBB,0x0A,0xB7,0x1C, + + 0x06,0xC0,0x24,0x66,0x33,0x40,0x63,0x66,0xEA,0xBB,0x94,0x63,0xD2,0x68,0x78,0x56, + + 0xA3,0xFF,0x68,0x1C,0x33,0x31,0xAF,0xB5,0x47,0x81,0xBE,0xEF,0x05,0xC5,0xB6,0xFC, + + 0x90,0x4C,0x6D,0x07,0x98,0x4E,0x91,0xA5,0x84,0xB7,0xA0,0x47,0x3B,0xD2,0xF0,0x57, + + 0x6B,0xA7,0x8C,0x06,0xDF,0x67,0xAE,0x0E,0x9D,0x01,0x72,0x28,0x19,0x9D,0x38,0x22, + + 0x41,0xF4,0x2F,0x36,0xB1,0x65,0xE3,0x79,0xBE,0x94,0xD0,0x64,0x52,0x64,0x40,0xE2, + + 0xF6,0x0A,0xB0,0x73,0x37,0x25,0x5C,0x37,0xC1,0x4D,0xD8,0x74,0x53,0x65,0x4B,0x01, + + 0x21,0x00,0xC5,0x65,0x92,0x26,0xC1,0xA6,0xC0,0xB3,0xD1,0x65,0xD2,0x66,0xFD,0x2E, + + 0x20,0x46,0xC9,0x55,0x93,0x27,0xEB,0x13,0x28,0xF7,0xD9,0x75,0xD3,0x67,0x42,0x0E, + + 0xC0,0xF8,0xA4,0x98,0x94,0xA3,0x90,0x17,0xB4,0x4A,0xD2,0xAA,0xA4,0x9D,0x08,0xDE, + + 0xAB,0x4C,0x71,0x3A,0x09,0xA4,0x99,0x3E,0x81,0xF9,0x19,0x06,0x01,0x28,0xA7,0xF5, + + 0x08,0xF1,0x87,0xEF,0x9E,0xEA,0xD3,0x3D,0x34,0xEE,0xD3,0x13,0x84,0xDF,0x79,0xBC, + + 0x2D,0xEC,0x5F,0xE2,0x1A,0x25,0xBF,0x5B,0x65,0xB4,0x77,0xBD,0x25,0x4B,0xAA,0xFB, + + 0x8F,0x4B,0xC2,0x4C,0x1A,0x2C,0x74,0xB7,0x1E,0x0A,0xD2,0x6C,0x5A,0x6C,0x3E,0xA5, + + 0x2A,0x4F,0xCA,0x5C,0x1B,0x2D,0xD9,0x5C,0xC4,0x4F,0xDA,0x7C,0x5B,0x6D,0x83,0x5D, + + 0x78,0x42,0xC3,0x4D,0x9A,0x2E,0xE4,0x57,0x92,0xBB,0xD3,0x6D,0xDA,0x6E,0xC9,0x66, + + 0x0E,0x08,0xCB,0x5D,0x9B,0x2F,0xEC,0x78,0x46,0x49,0xDB,0x7D,0xDB,0x6F,0x80,0x04, + + 0x64,0xE5,0x0C,0x86,0xC5,0x3F,0x74,0xE4,0x6F,0x5D,0xBC,0x66,0xF2,0x78,0xBB,0xAF, + + 0x79,0x53,0x48,0x11,0x72,0xC2,0x94,0xC8,0x80,0x5E,0xFC,0xF4,0x8A,0x7C,0x3F,0x7E, + + 0xA6,0xD2,0x31,0xFA,0x13,0x8F,0x5F,0x7E,0x43,0x54,0x7A,0x55,0xA8,0x7D,0x8F,0xAE, + + 0x5D,0xC3,0xED,0xD1,0x8C,0x3C,0x7D,0xF5,0xD8,0x5C,0xEF,0xAC,0xB1,0x88,0x3C,0xE4, + + 0xA7,0x33,0xC4,0xC4,0x32,0x34,0x94,0xF4,0x9E,0x18,0xD4,0xE4,0x72,0x74,0xFB,0x2D, + + 0x33,0x5B,0xCC,0xD4,0x33,0x35,0xF4,0x53,0x1C,0xD5,0xDC,0xF4,0x73,0x75,0x9A,0xD0, + + 0xA4,0xD6,0xC5,0xC5,0xB2,0x36,0x25,0x27,0x48,0x17,0xD5,0xE5,0xF2,0x76,0x3D,0xF7, + + 0x41,0x74,0xCD,0xD5,0xB3,0x37,0x9D,0xE5,0x1F,0x1B,0xDD,0xF5,0xF3,0x77,0xC6,0x9C, + + 0xD4,0xBC,0x16,0x92,0x60,0xCC,0xA2,0x4A,0xEA,0x10,0x92,0xAE,0x7C,0x83,0xAA,0x65, + + 0xA9,0xC2,0x7E,0x18,0x7D,0xAE,0x66,0xDA,0x2A,0xE6,0x29,0x98,0xFC,0x5E,0x47,0x8F, + + 0x60,0xEA,0x04,0x4B,0x52,0x76,0xDB,0xCB,0xAB,0x85,0x97,0x6F,0x7B,0x3C,0x0E,0x5F, + + 0x0B,0x5E,0x27,0x3E,0xC6,0x3A,0x67,0xE6,0x1C,0xA7,0x40,0xAC,0xFF,0xBB,0xEE,0x6A, + + 0xF5,0xF3,0xC6,0xCC,0x3A,0x3C,0x26,0x2E,0xC0,0x1D,0xD6,0xEC,0x7A,0x7C,0xB1,0xFC, + + 0xA9,0x15,0xCE,0xDC,0x3B,0x3D,0xF2,0xBA,0xE8,0x53,0xDE,0xFC,0x7B,0x7D,0xEF,0x6B, + + 0x2D,0x39,0xC7,0xCD,0xBA,0x3E,0xBB,0x69,0x16,0x7E,0xD7,0xED,0xFA,0x7E,0xF9,0xBB, + + 0x5C,0x19,0xCF,0xDD,0xBB,0x3F,0x37,0x7F,0x17,0x1E,0xDF,0xFD,0xFB,0x7F,0xF4,0x44, + + 0xA6,0x7E,0x40,0x39,0x30,0x1C,0xF0,0x36,0xB8,0xBE,0x1C,0xA4,0x55,0x65,0xC3,0x69, + + 0x9A,0xBC,0x2C,0xE7,0xB6,0xA3,0x4C,0xB6,0x0D,0x9F,0xD7,0x2A,0x9D,0x3F,0x5B,0x87, + + 0xC8,0x92,0x1E,0x5C,0x6D,0x28,0x48,0x65,0x66,0x8C,0x89,0xD4,0x8C,0x46,0x81,0xB1, + + 0x02,0xA4,0x9B,0xE8,0x17,0xEB,0xF9,0x27,0x54,0x82,0x3E,0x24,0x0A,0xE1,0x88,0xE1, + + 0x00,0x24,0xE0,0x46,0x16,0xA4,0x78,0x50,0xE7,0x6B,0xF0,0x66,0x56,0xE4,0xF8,0xD0, + + 0x06,0xF2,0xE8,0x56,0x17,0xA5,0x98,0x4D,0xB3,0x75,0xF8,0x76,0x57,0xE5,0x88,0xC7, + + 0xC2,0x9A,0xE1,0x47,0x96,0xA6,0x76,0x70,0x1D,0x16,0xF1,0x67,0xD6,0xE6,0x53,0xB1, + + 0x05,0x8F,0xE9,0x57,0x97,0xA7,0xCE,0x6F,0xE3,0x3A,0xF9,0x77,0xD7,0xE7,0xB2,0x14, + + 0x54,0x7C,0x82,0x6C,0xAB,0xCD,0x99,0x51,0x99,0x35,0x52,0x11,0xA0,0xEA,0x6A,0xDC, + + 0xE7,0xC5,0x13,0x4F,0xBE,0x76,0x62,0x07,0xCF,0xC1,0x89,0x27,0x79,0x87,0xA0,0x11, + + 0xD0,0x3E,0x9B,0xDF,0x41,0xD5,0x71,0x4B,0xD4,0x4A,0x00,0x32,0x24,0x3A,0xDB,0x5D, + + 0x27,0x70,0x16,0x42,0x62,0xAD,0xEF,0x49,0x6E,0x8A,0xFB,0x00,0xD5,0x87,0x93,0x28, + + 0x4D,0x53,0xE2,0x4E,0x1E,0xAC,0xAD,0x62,0x60,0x8A,0xF2,0x6E,0x5E,0xEC,0x12,0xD8, + + 0x0E,0x9A,0xEA,0x5E,0x1F,0xAD,0x0A,0xA5,0xA0,0x8C,0xFA,0x7E,0x5F,0xED,0x1B,0x29, + + 0xCD,0x7E,0xE3,0x4F,0x9E,0xAE,0x81,0xAD,0x6C,0x82,0xF3,0x6F,0xDE,0xEE,0xD0,0xB9, + + 0x23,0x72,0xEB,0x5F,0x9F,0xAF,0xD3,0xD8,0xB0,0x0F,0xFB,0x7F,0xDF,0xEF,0x56,0x27, + + 0xA1,0x97,0x64,0x92,0xC8,0x45,0xF4,0xB3,0x48,0xD6,0x03,0x5B,0x38,0xBE,0x2D,0x4D, + + 0x86,0xEF,0x1B,0x8F,0x33,0x71,0x44,0x96,0xEA,0xD3,0x45,0x70,0xD7,0xB4,0xCE,0x74, + + 0xA2,0x72,0x61,0x03,0xF0,0x47,0x3D,0x06,0x87,0xF2,0xC5,0xE1,0x56,0x0C,0x16,0xD5, + + 0x07,0xDD,0x1A,0xA8,0xE1,0xF1,0x8A,0xB2,0x68,0xDF,0xCF,0x31,0xED,0xBF,0x6C,0xF5, + + 0x87,0xF8,0xE4,0xC6,0x36,0xB4,0x14,0xA2,0x6A,0x29,0xF4,0xE6,0x76,0xF4,0xE8,0x15, + + 0xA7,0xB5,0xEC,0xD6,0x37,0xB5,0x26,0xF3,0xC4,0x94,0xFC,0xF6,0x77,0xF5,0x86,0x84, + + 0x78,0x9E,0xE5,0xC7,0xB6,0xB6,0x0D,0x61,0xE7,0x96,0xF5,0xE7,0xF6,0xF6,0xC1,0x13, + + 0x04,0xD6,0xED,0xD7,0xB7,0xB7,0x1D,0xB3,0xFA,0x5C,0xFD,0xF7,0xF7,0xF7,0x52,0xAE, + + 0xF8,0x28,0x24,0xB1,0xB9,0xBF,0x5E,0xB4,0x2A,0x2C,0xC6,0x8E,0x64,0x35,0x09,0x1A, + + 0xAA,0x3E,0x47,0x1A,0x79,0xA5,0x81,0xDA,0xDA,0x7D,0x84,0x5C,0xFF,0xF1,0x80,0x97, + + 0x7C,0x6A,0x4F,0x2C,0xBA,0x1A,0xF1,0x2F,0xA4,0xAD,0x27,0x2D,0xFD,0x1D,0x87,0x3D, + + 0xAB,0x5B,0x3F,0x58,0xBF,0x4E,0xF9,0xBD,0x25,0x19,0x4D,0xDD,0xBE,0x24,0x8A,0x4A, + + 0xD2,0xBC,0xE6,0xCE,0x3E,0xBC,0xF2,0x08,0xEC,0xD4,0xF6,0xEE,0x7E,0xFC,0x56,0x29, + + 0x77,0x39,0xEE,0xDE,0x3F,0xBD,0x1E,0xBA,0xC2,0x20,0xFE,0xFE,0x7F,0xFD,0xCB,0x49, + + 0xAF,0xCB,0xE7,0xCF,0xBE,0xBE,0xFE,0x99,0x4D,0x9F,0xF7,0xEF,0xFE,0xFE,0x80,0xC7, + + 0x29,0x6A,0xEF,0xDF,0xBF,0xBF,0x07,0xDF,0x6D,0xD7,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x90,0xAF, diff --git a/drivers/input/touchscreen/GT915L/FW_EACH.txt b/drivers/input/touchscreen/GT915L/FW_EACH.txt new file mode 100644 index 0000000000000..09980ef2ca352 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/FW_EACH.txt @@ -0,0 +1,11265 @@ + 0x00,0x01,0x60,0x00,0x39,0x31,0x35,0x4C,0x00,0x00,0x00,0x00,0x10,0x62,0x80,0x00, + + 0x55,0x40,0xBD,0xDA,0xFD,0x24,0x34,0xDF,0x44,0x40,0xAF,0xEB,0xE9,0x2C,0xC8,0xB4, + + 0x25,0x41,0x8C,0x90,0x5F,0xA4,0x22,0xB7,0xED,0x5E,0x58,0x35,0x89,0x94,0x01,0x88, + + 0x86,0x02,0x72,0xFC,0x81,0xD9,0x39,0x25,0xC8,0xE2,0xE1,0xE3,0x7A,0x23,0x09,0x05, + + 0x87,0x03,0xB3,0xE6,0xF0,0x25,0x23,0xB6,0x6D,0x4B,0x83,0x4A,0xAE,0x73,0x1E,0xA2, + + 0x12,0xF9,0x91,0xBE,0x36,0x39,0x28,0x69,0xEF,0x76,0xA8,0xB2,0xB3,0xB8,0x37,0x10, + + 0x4F,0x13,0x6D,0xB6,0xF3,0xB4,0xFC,0x02,0xCD,0xEA,0xE2,0x2E,0xE8,0x70,0xD6,0xBE, + + 0x7B,0x65,0x66,0xA7,0x72,0xBA,0xC1,0x6A,0x46,0x12,0x2C,0x17,0x0B,0x39,0x01,0x45, + + 0x48,0x08,0xB2,0x3E,0x47,0x28,0x21,0x81,0xCB,0x21,0x79,0x51,0x61,0x67,0xC0,0xAC, + + 0x2C,0x48,0xCA,0x9B,0xB9,0xA1,0x96,0xDE,0xC8,0x68,0x46,0xAA,0xBE,0x26,0x9A,0xBC, + + 0x2F,0x49,0x04,0xFC,0x9B,0x23,0x3A,0x11,0xA8,0x2F,0x64,0x18,0xE7,0x49,0xCB,0x4A, + + 0xC0,0x01,0x32,0x6D,0xC8,0x68,0xEB,0x21,0x17,0xC5,0xE3,0x6B,0x7A,0x94,0xC8,0xF0, + + 0x2A,0x6E,0xED,0x6F,0x3A,0x2D,0xAF,0xD3,0x8A,0xAB,0x19,0x36,0x5D,0x3F,0xBA,0x6C, + + 0x87,0x1A,0xF0,0x74,0xE9,0x78,0xC2,0xC7,0x42,0x4E,0xFE,0xC7,0x5A,0x56,0xF3,0x7C, + + 0x8E,0xA3,0xB1,0x32,0xCF,0x22,0xFA,0x0B,0xC7,0x1E,0x7F,0x9E,0x9B,0x91,0x3C,0x54, + + 0x41,0x01,0xBB,0x36,0x7A,0xBF,0x6D,0x6F,0xF2,0xE1,0x22,0x6D,0xA2,0xF3,0x70,0xF9, + + 0x66,0x3F,0xF9,0x06,0x2B,0x20,0x25,0x7E,0x6A,0xE0,0x70,0x26,0x28,0xC2,0x04,0x80, + + 0x78,0xF8,0xD4,0x9B,0x1A,0xA4,0x74,0x60,0xFF,0xDD,0xEC,0x96,0x04,0xAF,0xDE,0xB0, + + 0x26,0xE9,0xFA,0xD2,0x97,0x7D,0x6F,0x97,0x9E,0xDB,0x6F,0xB4,0x49,0x8C,0x4F,0x28, + + 0x82,0x11,0x55,0x9E,0x9E,0x7C,0xCE,0xA0,0x6E,0x5B,0x05,0x1F,0xF0,0x02,0x02,0x1D, + + 0x24,0xE6,0xF9,0x68,0x8F,0x71,0xCA,0x11,0x08,0x63,0xBA,0x57,0x31,0x8C,0x64,0xC5, + + 0x24,0x34,0x57,0x9F,0x08,0xEB,0xF0,0x8B,0xEC,0xFB,0xEE,0x0F,0xC5,0x35,0xE0,0xA2, + + 0xFD,0xEA,0xFE,0xED,0xE6,0x96,0xCC,0x1A,0xDD,0x75,0x23,0x8A,0x5D,0xAA,0x6B,0x61, + + 0x69,0xF6,0xFF,0x7D,0x41,0x6B,0x2D,0xC6,0x5B,0x30,0x8C,0x6D,0x0F,0x87,0x77,0x4F, + + 0x54,0x56,0xB5,0x2E,0x52,0xA4,0x19,0x82,0x67,0x66,0xE2,0x50,0x08,0xEA,0xC6,0x59, + + 0xE3,0x03,0x82,0x86,0xC4,0x3B,0x5C,0x35,0x9F,0xD5,0xA1,0x4E,0x5C,0xF5,0x71,0x1A, + + 0xA1,0x11,0xDA,0x18,0x31,0x8D,0x9D,0xE7,0x2A,0x55,0x9F,0xC3,0x05,0x86,0xF8,0xFB, + + 0x4F,0x04,0x47,0x8C,0x60,0xCF,0xF3,0x8E,0xC9,0x7A,0xBC,0x47,0x93,0x75,0xD0,0xDB, + + 0xDE,0xE3,0x50,0x95,0x3E,0x3C,0x09,0xDB,0xC8,0x4E,0x24,0x18,0x0E,0xE6,0x68,0x2A, + + 0x99,0x79,0xBD,0xE8,0x51,0x33,0x28,0xEE,0x83,0x38,0x02,0x16,0xE3,0x1F,0x36,0x32, + + 0xC2,0x59,0x71,0xE1,0xC4,0xE0,0x26,0x8B,0xC8,0x38,0x3B,0x97,0xED,0x75,0x7F,0xE1, + + 0x09,0xB2,0xC6,0x3C,0x3E,0x3E,0x86,0x1A,0x66,0x43,0xFA,0x6D,0x35,0xDE,0x09,0xDF, + + 0x88,0x5F,0x1B,0x23,0x62,0x5C,0x27,0xDD,0xE8,0x6F,0x59,0x87,0x65,0xE0,0xB0,0xA6, + + 0x04,0xC0,0xE8,0x94,0xB7,0xEC,0x22,0x3A,0xD5,0xAC,0x14,0x44,0x70,0xEA,0x28,0x12, + + 0x05,0xC1,0xB2,0xEA,0x15,0xE3,0x32,0x12,0xD4,0xA5,0x43,0x32,0xF8,0xA0,0x21,0x1F, + + 0x84,0x82,0x12,0x41,0xD4,0x59,0xE5,0x71,0x87,0x32,0x31,0x50,0xF0,0x95,0x29,0x9F, + + 0x85,0x83,0x65,0x42,0x17,0xAB,0x31,0x23,0x26,0x09,0x9C,0x31,0x41,0x87,0x90,0x91, + + 0xE7,0xE8,0x45,0xA4,0xF6,0x15,0x08,0x45,0xE7,0x85,0x88,0x29,0xED,0xFF,0x13,0x2C, + + 0x25,0x68,0x97,0x3D,0xCB,0xAA,0xD8,0x98,0x83,0xCA,0x43,0xD3,0xA0,0x58,0x06,0xB8, + + 0x67,0x10,0xCA,0xEF,0xFE,0xA9,0x39,0x6A,0x7F,0x67,0xB0,0x18,0xAA,0x19,0x2F,0xF5, + + 0x4C,0x0A,0xDB,0x6F,0x4E,0x04,0x78,0x05,0xE3,0xB0,0x2D,0x8C,0x26,0x84,0x22,0x0A, + + 0x0C,0xC8,0x57,0xFE,0x14,0xA7,0x12,0x2B,0x09,0x07,0x88,0xA9,0x78,0x15,0x2A,0x1A, + + 0x0D,0xC9,0xF3,0x88,0x7A,0xB1,0x3E,0x3E,0x0D,0xD9,0xC2,0x61,0x8D,0xE6,0x23,0x2A, + + 0x8C,0x8A,0x4B,0x21,0x1B,0x5F,0xDC,0x59,0x4C,0xBA,0x94,0xCD,0x3C,0xFF,0xA0,0x58, + + 0x8D,0x8B,0x2B,0x62,0xC1,0x7F,0x7B,0x1B,0xCC,0xCF,0x89,0x17,0x08,0x5F,0xCE,0xD5, + + 0xF1,0x01,0x9A,0xB4,0xA3,0x78,0x89,0x66,0xF7,0x6D,0x89,0x01,0x70,0x93,0x44,0x1D, + + 0xEE,0x3B,0x92,0x31,0xC3,0xA2,0x02,0x72,0xEA,0x8C,0xF2,0x6E,0xE2,0xDB,0x80,0xB5, + + 0x88,0xAE,0x9B,0x7D,0x69,0x9B,0xD3,0x81,0x6B,0x61,0xB3,0xB8,0xD2,0xD8,0x14,0x29, + + 0x5D,0x10,0xD9,0x00,0x56,0xA0,0x45,0x7C,0xFB,0x60,0x06,0x62,0x4C,0x42,0x1E,0x60, + + 0x88,0x6E,0x0C,0x24,0xEB,0xEF,0x3C,0x08,0x85,0xB6,0x60,0x5C,0x81,0x46,0x2C,0x6F, + + 0x25,0x1C,0x0C,0x85,0x13,0xD5,0x88,0x58,0x84,0xB7,0xC7,0xC8,0xAF,0x2E,0x5E,0x5D, + + 0x13,0x89,0x0D,0x34,0x7C,0xD1,0x81,0x4D,0x05,0xB4,0x8E,0x2D,0xF5,0x52,0xD5,0x9B, + + 0x7A,0x0C,0x76,0x95,0xCA,0x33,0x89,0xF9,0x2C,0x97,0x3A,0x64,0x56,0xCE,0x22,0xC5, + + 0x87,0x87,0xCB,0x9C,0x18,0x28,0x49,0xD3,0xE2,0xC8,0xC9,0x68,0xCD,0x04,0xED,0xD9, + + 0xA3,0xC1,0x4C,0x59,0xCE,0xE3,0xEC,0x5D,0x90,0xE5,0x05,0x84,0xA6,0x8A,0x1D,0xE7, + + 0x18,0xB6,0xCB,0xC1,0x98,0x1A,0x8F,0xEB,0x02,0xD9,0x9C,0x85,0x17,0xCA,0xC9,0xB1, + + 0x4C,0x98,0xD6,0x5C,0x5E,0xF3,0x40,0xC2,0x63,0xCB,0x6D,0x06,0x54,0xF5,0x78,0xA8, + + 0xF9,0x33,0x4E,0x2C,0x98,0x3F,0x1F,0xE4,0xA5,0xBC,0x8C,0xF0,0x87,0xB9,0x1E,0x6B, + + 0x54,0x72,0x06,0x3C,0xE2,0x36,0x10,0xBC,0xFC,0x85,0x05,0xAC,0x5D,0xB7,0xF9,0xD0, + + 0xC7,0x81,0x73,0xA9,0x52,0xD9,0x9E,0x49,0x40,0xC6,0x88,0x45,0x17,0xF5,0x71,0x90, + + 0xAD,0x30,0x6F,0x9F,0xEB,0x65,0x11,0xBC,0x78,0x25,0xFC,0x41,0x05,0xF4,0xD2,0xA8, + + 0x0A,0x96,0x87,0x8E,0x6E,0x13,0x8E,0x99,0xCD,0xCC,0x49,0xD3,0x81,0x21,0xD0,0x53, + + 0x0B,0xEA,0xD1,0x50,0xC4,0x20,0x81,0x84,0x59,0x02,0x81,0xA4,0x51,0x61,0xE5,0xDC, + + 0x0D,0xAE,0x47,0xB1,0x20,0x61,0x8F,0xCF,0x13,0xAF,0x23,0x11,0x07,0x9D,0x94,0xCE, + + 0x02,0x30,0x8A,0x25,0xE3,0x11,0x40,0x52,0x14,0x42,0xD6,0x5A,0x6E,0xFD,0xEE,0x15, + + 0x9E,0x9D,0x64,0xE2,0x00,0xAB,0xEB,0x07,0xE1,0xBF,0x96,0xDF,0xA5,0x0E,0x89,0x6B, + + 0x9F,0xBE,0xD2,0x11,0x9F,0x6E,0x42,0x31,0xCF,0xFE,0x7D,0x42,0x30,0x41,0xE0,0x6B, + + 0x1A,0x0A,0x01,0x82,0x37,0x32,0x81,0x53,0x4E,0xDD,0xF6,0x65,0xC2,0x79,0x32,0x9F, + + 0x72,0x1E,0xD3,0x05,0xBE,0xA6,0x43,0x35,0x4F,0x9C,0x81,0x3C,0xB6,0x23,0xBF,0x32, + + 0xD4,0xDB,0x77,0x29,0x65,0x24,0x40,0x49,0x0D,0x28,0xEA,0xF7,0x6F,0x26,0x76,0x9C, + + 0x05,0xF6,0x08,0xE9,0x4E,0x2F,0xCE,0x86,0x60,0x05,0x18,0xC9,0x74,0x7E,0xED,0x3E, + + 0x48,0x7C,0x2D,0x36,0x8D,0xD0,0x08,0xFA,0x27,0xE0,0x06,0xB1,0xD1,0x86,0x86,0x91, + + 0xC3,0xD2,0x8B,0x12,0x72,0x81,0xB1,0x49,0xE1,0xD6,0xBE,0x81,0xC7,0x7C,0x67,0xE2, + + 0x54,0xA6,0x94,0x0A,0xF3,0x6C,0x48,0x2D,0xC6,0xB7,0xD3,0x5F,0x34,0xA9,0xF7,0x6A, + + 0xD8,0x56,0xF4,0x1B,0x3D,0xA4,0x22,0xD3,0xE5,0x44,0xC3,0xB3,0xBE,0x7B,0x7B,0xC7, + + 0x69,0xB6,0xBD,0xEF,0xF2,0x4E,0x83,0x4B,0x7B,0x2F,0x69,0x2F,0xC2,0xE7,0x31,0x53, + + 0x32,0x4A,0xF5,0x28,0x66,0x86,0xE2,0x1E,0x68,0x34,0x61,0x3F,0xD3,0x70,0x8B,0x77, + + 0x15,0x17,0x5F,0xB7,0xFB,0xAA,0x4A,0xEC,0x34,0x7F,0xB5,0x1A,0x79,0xEC,0x02,0xC9, + + 0xFE,0x42,0x14,0x3A,0xC1,0xB0,0x5B,0x1E,0xB0,0x21,0x76,0x0F,0x44,0xCB,0x7C,0xCD, + + 0xF4,0x3C,0xC3,0xB7,0x17,0x35,0x0A,0x07,0x6F,0xD1,0x8D,0x95,0xDE,0x2F,0x4A,0x26, + + 0x2C,0x0C,0x0B,0xE0,0xC1,0x25,0xE4,0xE2,0x34,0x92,0x46,0xF9,0xA5,0x97,0x8C,0x62, + + 0x91,0x86,0xE6,0x84,0xD7,0x2B,0xEC,0xA8,0x9D,0x1F,0x75,0xD7,0x1C,0xB1,0x14,0x8D, + + 0xD0,0x7D,0x32,0x88,0x13,0x20,0xB8,0x52,0xE2,0x35,0x1C,0xC6,0x96,0x6A,0x0B,0x63, + + 0x84,0x0F,0x63,0xF3,0xA0,0x31,0x85,0x8B,0x64,0xF6,0x6F,0xD6,0xA3,0x7B,0xC9,0x6B, + + 0x58,0x71,0x0D,0x53,0xDD,0x7D,0x75,0xB7,0xE7,0xD3,0x7C,0xC3,0x7E,0xF5,0xBE,0xB6, + + 0xAD,0x92,0xCC,0xC0,0xB2,0xDC,0x9E,0x20,0x60,0x38,0xB4,0xE6,0x0B,0x79,0xB6,0x70, + + 0x0F,0x65,0xCD,0xB2,0xC8,0x59,0x4D,0x16,0x71,0x18,0x19,0x16,0x40,0xE5,0x41,0x81, + + 0xA0,0x9B,0x9C,0xAB,0x17,0xA9,0x0C,0x8E,0x47,0xF0,0x9F,0xF8,0x70,0x75,0x8D,0x29, + + 0xCC,0x1D,0xF3,0x18,0x69,0x88,0x3F,0xF1,0x44,0x4C,0x65,0x0B,0xE3,0x3A,0x79,0xF6, + + 0x26,0xC7,0x97,0x64,0xF6,0xF3,0x7D,0x2C,0x28,0xC6,0x97,0xEC,0x3C,0xF5,0x72,0xBC, + + 0x98,0x10,0x9E,0xB0,0x72,0x22,0x1C,0x62,0x88,0x32,0x0E,0x9C,0x1D,0xB9,0xB8,0x0C, + + 0x57,0x04,0x83,0x85,0xDF,0xAB,0xD7,0xB9,0x3B,0x18,0x6D,0x5C,0x8B,0x5A,0x88,0xE6, + + 0x24,0x78,0x01,0xFB,0x4E,0x90,0x25,0x3E,0x45,0xF7,0x8F,0x90,0xF5,0x7A,0xC4,0x39, + + 0x59,0x9C,0xF8,0x00,0xE8,0xA3,0x31,0x1C,0x7E,0x47,0x29,0x68,0x04,0x71,0xDA,0xDC, + + 0xA2,0x32,0xD4,0xDE,0x88,0xA0,0x62,0x6A,0x6D,0xAE,0xBE,0x5C,0x63,0x72,0xEF,0xF4, + + 0x8E,0x1F,0x2B,0xB6,0x64,0xE3,0x30,0x9F,0xC9,0x6C,0x8E,0x78,0x5F,0x81,0x1F,0xED, + + 0xAF,0x33,0xD5,0xDF,0x29,0x37,0x0A,0x11,0x35,0x92,0x86,0x74,0xD9,0xCF,0x9D,0x9D, + + 0xEF,0x8F,0x3D,0x41,0x1A,0x0F,0xA0,0x58,0xA3,0xD0,0x51,0x50,0xA3,0x8E,0x15,0x89, + + 0x00,0x8E,0xB0,0x07,0x7E,0x40,0xC2,0x3A,0xB8,0x0E,0x5F,0xC0,0xD5,0x61,0x98,0x9D, + + 0x81,0x8D,0xB0,0xEF,0x19,0xEF,0x0E,0xD5,0xD4,0x1F,0x56,0x67,0x9C,0x3F,0x12,0x63, + + 0x05,0x9F,0xAD,0xEA,0x91,0xA0,0xA9,0x49,0x66,0xA6,0x83,0xDF,0x43,0x2C,0xF4,0x5B, + + 0x00,0x1F,0xE5,0xAE,0xCC,0x69,0x13,0x9C,0xBE,0xD5,0xB8,0xEF,0xDB,0x69,0x31,0x28, + + 0xA0,0x95,0x7E,0xA0,0x24,0x13,0x1F,0x82,0xC7,0xDA,0x38,0xB6,0x55,0xFE,0xBF,0x83, + + 0x96,0x0B,0xF9,0x57,0x1B,0x00,0x2A,0x63,0x49,0x3B,0x97,0x0A,0xD0,0x15,0x91,0x51, + + 0xA3,0x9C,0x53,0xB7,0x93,0xE9,0xE2,0xF9,0xC6,0x97,0x1A,0x04,0xBB,0x26,0x38,0x08, + + 0x9E,0x20,0xB3,0x0B,0x3E,0x09,0x0D,0xC8,0xE0,0x15,0xEB,0xA0,0xB9,0x86,0x54,0xF8, + + 0xB8,0x5F,0x06,0xF6,0x8F,0x64,0xAA,0x40,0xEA,0xD9,0x52,0x12,0xBC,0x26,0x5B,0x2F, + + 0x31,0x7C,0x20,0x7C,0xF0,0x15,0x4B,0x0C,0x31,0xC5,0xD1,0x23,0xDD,0x6A,0xA3,0xF9, + + 0x34,0x3D,0xCC,0xE9,0x8F,0x66,0x04,0xDD,0xDD,0x16,0xEB,0x13,0xCB,0xF0,0x52,0xBE, + + 0x0A,0x88,0xF1,0xEE,0x6E,0x25,0x2B,0x05,0xEB,0x7D,0x08,0x18,0xD3,0x6A,0x92,0x52, + + 0xA8,0x96,0xB3,0x8E,0xBA,0xA6,0x5A,0xEA,0xC2,0x40,0xA1,0x7B,0x7B,0x60,0xF3,0x39, + + 0xBD,0x13,0xDD,0x97,0xBD,0xA6,0x8B,0xE3,0x6B,0x5D,0xF5,0x2F,0xCE,0x45,0x5B,0x28, + + 0xE3,0x4E,0x3E,0xDB,0xE1,0xF7,0x1D,0x53,0xC9,0x3C,0xA2,0xE1,0x38,0xAE,0xDB,0xFC, + + 0x0A,0x4F,0xDC,0x97,0xD4,0x31,0x90,0xF1,0xC7,0x7C,0x20,0x57,0x72,0x1B,0xF8,0x68, + + 0xB6,0xBE,0x14,0x6C,0xBA,0x07,0x15,0x50,0xC9,0x7D,0x84,0x16,0x98,0xB1,0x1A,0x26, + + 0x5F,0x0F,0xA3,0x7C,0x87,0x18,0x91,0xE9,0x2D,0x96,0xA5,0x25,0x74,0x2B,0xBD,0xE5, + + 0x56,0x83,0xA5,0x8F,0x86,0xC5,0x99,0xE0,0x46,0x7F,0x15,0x92,0x1C,0x69,0x18,0x46, + + 0x58,0xCC,0xE1,0x42,0x48,0xFF,0xD8,0x67,0x9D,0xB8,0xF7,0x80,0xF4,0xF7,0xD6,0x57, + + 0x29,0x1F,0xCC,0xE7,0xB8,0x08,0x05,0x8E,0xF5,0xDF,0xFB,0x84,0xD4,0xF1,0x2D,0x33, + + 0x95,0x60,0xBC,0x5C,0xD1,0xF5,0xCA,0x78,0x85,0xD2,0x72,0x05,0x74,0xF5,0xBA,0x2C, + + 0x5C,0xF9,0x8B,0xFF,0xD4,0xB3,0x7F,0x1B,0x3D,0x1C,0xFC,0x88,0x50,0xF1,0x9C,0x71, + + 0x3C,0x55,0x1C,0x49,0xFE,0x98,0x92,0xE0,0xA5,0x9C,0xEE,0xEB,0x4F,0x33,0xBE,0xF8, + + 0xDE,0xFC,0x8E,0x0A,0xCC,0x12,0x56,0xBC,0x8C,0xBF,0x41,0xC0,0x5F,0x14,0xDC,0x83, + + 0x49,0x65,0xEF,0xAE,0xDB,0x9A,0x1E,0x8F,0x6F,0xBE,0x0F,0x51,0xEC,0xB7,0x17,0x60, + + 0x01,0x96,0xD7,0x8E,0x5D,0x3A,0xC7,0xB3,0x8E,0xFB,0x39,0xF8,0x1C,0x0D,0x58,0x07, + + 0xF4,0xDE,0x9F,0xB6,0xAC,0xB4,0xA6,0x4A,0x42,0x7C,0xA6,0xF7,0x1D,0xDC,0xC2,0xA8, + + 0xF1,0xDF,0xCE,0x5F,0x0C,0xE0,0x89,0xBD,0x5C,0x6B,0x63,0x06,0xFF,0x46,0xB0,0x96, + + 0xAD,0xEE,0xE1,0x4B,0xC0,0xF5,0x67,0xDF,0xEA,0xF3,0x8F,0x13,0x7E,0x05,0xB8,0x5F, + + 0xAE,0xFF,0x2F,0x62,0x81,0xD3,0xC5,0x68,0x83,0x10,0xE4,0xFB,0x91,0xD3,0x10,0x05, + + 0x0C,0x42,0xEE,0x44,0x1C,0x21,0xCD,0x7F,0xE7,0x50,0x54,0xF4,0x0E,0x61,0xC8,0x59, + + 0x24,0x00,0x30,0xA6,0x15,0x13,0xA0,0xCF,0x51,0x0C,0x5C,0xB0,0x72,0xF3,0x08,0xF8, + + 0x05,0x62,0xD1,0x98,0xA3,0x08,0xAE,0xC7,0xF3,0xF5,0xA9,0xB1,0xF0,0xE0,0x1B,0x05, + + 0x87,0x69,0xD0,0x52,0x34,0xDC,0x40,0xCD,0x1C,0x0C,0xC0,0xCC,0x34,0x6A,0x42,0x80, + + 0x46,0x49,0x9A,0x26,0xD8,0xD5,0x02,0xE0,0xA3,0xEB,0xEA,0x9F,0x2D,0xFC,0x90,0xB8, + + 0xF1,0x48,0xB0,0x73,0xFA,0x26,0x3E,0x11,0x42,0x05,0x8B,0x06,0xB8,0x74,0x43,0xA7, + + 0xA2,0xD6,0x89,0x50,0x7B,0xD7,0xC7,0x12,0xAE,0x2A,0x0A,0x4A,0xD4,0x9E,0x4B,0xB7, + + 0xB0,0x4B,0xB1,0xA5,0x15,0x86,0x7D,0x53,0x2A,0xEE,0xE7,0x5D,0x5E,0xC1,0xF1,0x0C, + + 0x07,0x0E,0xDB,0xE5,0x1E,0x9A,0x13,0x57,0xEF,0x4C,0x94,0x8C,0x0C,0x28,0x72,0x49, + + 0xE2,0xC1,0xD3,0xF5,0xBC,0xDF,0x12,0x07,0x74,0x52,0x22,0xD4,0xD5,0xA6,0xC3,0x95, + + 0xB9,0xAE,0x9B,0x89,0xC2,0x5F,0x19,0x5A,0x9B,0x41,0x9F,0xC0,0xEB,0x6E,0xD0,0x1A, + + 0xF6,0x07,0xCA,0x7B,0x4F,0x23,0xC6,0xDF,0xD9,0xB6,0x42,0x92,0xE6,0x69,0xFA,0xA0, + + 0x85,0x43,0x54,0xBF,0x9E,0xA1,0x2D,0x90,0x4A,0x37,0xCC,0xAC,0x0E,0x2E,0x5E,0xB0, + + 0x00,0x40,0xF2,0xBC,0x5F,0x2B,0xED,0xC8,0xBF,0x2E,0x1A,0x3C,0x1B,0xED,0x83,0x51, + + 0x2B,0x42,0x91,0x63,0x71,0x4A,0xC6,0x98,0x8B,0xFF,0xDB,0x6D,0xBA,0xD6,0xB4,0xB9, + + 0xC3,0x0E,0x66,0xBC,0x3A,0xAF,0x9B,0x20,0xAA,0xC2,0xA3,0x6C,0xEB,0x6B,0x4E,0x15, + + 0x02,0x13,0x80,0x1C,0x03,0x5C,0x0A,0xD4,0xF2,0x58,0xCB,0x24,0x03,0x07,0xCC,0x40, + + 0xF6,0xCA,0x10,0xE6,0x5B,0x78,0x45,0x71,0xC4,0x5A,0xE2,0x7D,0x77,0x69,0x81,0x05, + + 0x86,0x89,0x3D,0xB4,0x9D,0x9D,0x91,0x81,0xC2,0x70,0x55,0x61,0x18,0xFF,0xFA,0x6C, + + 0x52,0x66,0xF3,0xF1,0xB7,0x81,0x1E,0xA1,0x46,0xDE,0x4A,0x31,0x97,0xD5,0xC4,0xD4, + + 0xC3,0x0F,0x40,0x35,0x0A,0xB4,0xC3,0x40,0x8F,0x24,0xAA,0xC9,0xFF,0xD9,0x8C,0xA4, + + 0xD6,0x57,0xD9,0xFC,0xDA,0x24,0x22,0x50,0x82,0xF3,0xE2,0x55,0xA5,0xDA,0x1C,0x27, + + 0xB2,0x59,0xFF,0x36,0x86,0x92,0xF9,0x93,0x28,0x55,0x05,0x7A,0x19,0xA7,0xD0,0xFD, + + 0xA5,0x14,0x21,0x47,0xB3,0x3F,0xCA,0x02,0x9F,0x3B,0xCA,0x55,0x1E,0xD7,0x1B,0xA6, + + 0x19,0x95,0x33,0xFF,0x15,0xCE,0x76,0xE3,0x6D,0x57,0xC6,0x2D,0x71,0x63,0xE2,0x70, + + 0xF7,0x5B,0x88,0xEE,0xBB,0x05,0xE6,0x7F,0x5A,0xFE,0xC8,0x54,0xFC,0x34,0x78,0x0D, + + 0xF5,0x89,0xB9,0xE9,0x6E,0x32,0x4E,0x41,0x4F,0x4A,0x7B,0xCB,0x07,0x73,0x4C,0xFE, + + 0xA8,0xB9,0x07,0x7F,0xBF,0x40,0xDF,0x21,0x44,0x53,0x64,0xDD,0x85,0x82,0xA8,0x4A, + + 0xAA,0xA7,0xC3,0xBF,0x0A,0x5E,0x36,0xA7,0x45,0x51,0xEC,0x1F,0x02,0xD3,0xCA,0x5C, + + 0x52,0x0C,0xEE,0x3E,0x3D,0x35,0x86,0x9A,0xA1,0xAC,0x60,0xED,0x9A,0xD2,0x7F,0x19, + + 0xF6,0x17,0xB9,0xE5,0xF2,0x6F,0x31,0x49,0x68,0x22,0x44,0x9E,0xC6,0x7D,0x8F,0x68, + + 0xE4,0x5D,0x06,0xE2,0xD9,0xEA,0x17,0xC4,0xED,0x57,0x4A,0x0E,0x8B,0xD2,0xF9,0xAD, + + 0x3B,0x82,0xA2,0x74,0x27,0x8A,0xC8,0xCA,0x87,0x8D,0x1F,0x49,0x89,0x3C,0xE8,0x4A, + + 0x0E,0x7A,0x4D,0x78,0x74,0xA5,0xE3,0x48,0xE2,0xD1,0x70,0x54,0x16,0x11,0x7E,0x89, + + 0xF7,0xF6,0x59,0x40,0x7D,0xD8,0x4E,0xDB,0xC4,0xD9,0x08,0x79,0x56,0xE6,0x2D,0x97, + + 0xF1,0xAF,0xD0,0x64,0x82,0x2A,0x06,0xD5,0x48,0x6E,0xC6,0xCF,0xD5,0x47,0xA6,0x46, + + 0xED,0x1E,0x98,0xB7,0x5B,0xA4,0x0E,0xC3,0xAD,0x87,0x4D,0x21,0xB7,0x42,0x10,0x32, + + 0x13,0xC8,0x7B,0x6C,0x6F,0xE7,0xD4,0xE1,0x2E,0xCF,0x9E,0x4F,0xBC,0xC6,0x38,0xBA, + + 0x23,0x0C,0xC7,0x36,0x87,0x13,0x0F,0x4B,0x2F,0xD7,0x62,0x94,0xF0,0x6B,0x7B,0xB1, + + 0x20,0xCA,0xEA,0x85,0x91,0xAF,0xFF,0xF7,0xC6,0x95,0x87,0x4A,0x1F,0xA4,0xE2,0x3E, + + 0xC2,0xCA,0x82,0x84,0x1F,0xF9,0xFF,0xB5,0x2F,0xCC,0xAB,0x7B,0x94,0xD1,0xAE,0x9E, + + 0x02,0x8F,0x2E,0x3E,0x3F,0xE8,0x72,0xA7,0xC0,0x64,0x61,0x91,0x22,0xEB,0xE9,0x33, + + 0xAE,0x5A,0x63,0x96,0x57,0xA2,0x4A,0x5A,0xDB,0xDC,0xBA,0xAB,0xC1,0x6C,0xEB,0xF3, + + 0x8D,0xC9,0xF2,0xDE,0x38,0x2C,0xA5,0xA0,0xAE,0xCF,0x0E,0x56,0x69,0xF2,0x28,0x57, + + 0x3D,0x7B,0xE8,0xB6,0x1E,0x17,0x74,0x42,0xCE,0x83,0xA2,0xEC,0xC3,0x67,0x6C,0xB2, + + 0xF1,0xC0,0x55,0x4E,0xF4,0x9C,0xA8,0x69,0x65,0x3C,0x05,0x4F,0x79,0x42,0x9B,0x38, + + 0xDD,0x85,0xEB,0xCB,0x9A,0xFC,0x44,0x1A,0xC8,0xC6,0xCB,0x91,0x72,0xE3,0x73,0x57, + + 0x72,0x08,0x47,0xCD,0xDF,0xA5,0x5D,0xDF,0xED,0x62,0xE8,0x0C,0xF5,0x3C,0xC8,0x6A, + + 0x88,0xDD,0x2F,0x02,0x29,0x90,0xB6,0xD1,0x37,0xDB,0xAC,0xAA,0x47,0x67,0xEC,0x0A, + + 0x94,0x9B,0x6F,0x8F,0x17,0xBC,0x1C,0xCF,0xC4,0xD8,0xB4,0xB2,0x94,0xBE,0x43,0xF6, + + 0x4D,0x5B,0x65,0xF7,0xC1,0xF0,0xB5,0xE5,0xAA,0xD4,0x0D,0x60,0x36,0x72,0xA9,0xB3, + + 0x87,0x33,0xAE,0xB7,0xE7,0x83,0x61,0xC0,0xD8,0xAC,0xE4,0x70,0x50,0x0C,0xAE,0xDE, + + 0x04,0xC6,0x30,0x42,0x35,0x0B,0x7E,0x91,0x5B,0xB8,0x67,0xD8,0x0E,0xE1,0x2E,0x34, + + 0x82,0x9E,0xEC,0xED,0x03,0x4E,0x1B,0x02,0xE7,0xCA,0x57,0xD0,0x9A,0x97,0x62,0x2B, + + 0x2E,0xDB,0xDB,0xB6,0x09,0xED,0xB1,0x18,0x6B,0x2B,0x64,0xEF,0x76,0x36,0x6B,0x95, + + 0xB1,0xD5,0xAD,0x2B,0x0B,0xF5,0xE6,0x79,0xE4,0x65,0x56,0x72,0x64,0xE8,0x18,0x6F, + + 0xCE,0x8C,0xC6,0xC5,0x5D,0xB5,0xEF,0xAA,0xE1,0x75,0xEF,0xE8,0xD9,0x01,0xD6,0x72, + + 0xCF,0xD4,0xD5,0x1C,0xBD,0x61,0x47,0xCB,0x7A,0xCF,0xE4,0xAE,0xDA,0xE2,0x37,0xF9, + + 0x9F,0xB0,0xBF,0x8A,0xBA,0x19,0xFA,0x24,0x8F,0xDE,0xEF,0xBE,0xCF,0x6D,0xD0,0x93, + + 0x08,0x80,0x97,0x60,0xB3,0xD9,0x77,0x8E,0xEB,0x69,0xCC,0xD9,0x70,0x7D,0xEC,0x47, + + 0x28,0xB6,0xED,0xF0,0x38,0xB4,0x48,0xD7,0xCD,0xB9,0x89,0x9D,0x0E,0x29,0x64,0xDB, + + 0x88,0xDC,0x5B,0x5A,0x34,0x6A,0x1E,0xB5,0x04,0xD0,0xDE,0xEA,0xAA,0xB8,0xA0,0x23, + + 0xBA,0xD3,0x2E,0x32,0xBC,0x65,0x49,0x4B,0x4D,0xB2,0x62,0xC5,0xCA,0xEE,0x31,0x7E, + + 0x11,0x34,0x32,0x9B,0x88,0xBF,0x19,0x5B,0x6D,0xA3,0x41,0x7A,0x2A,0x9D,0x69,0xEA, + + 0xFF,0x6C,0x84,0xC4,0x78,0x8D,0x10,0x33,0x29,0x58,0xD7,0x56,0x56,0xB2,0xD7,0xAD, + + 0xE0,0xDE,0x90,0x05,0x33,0xD3,0xD8,0x28,0x82,0xEC,0x80,0x31,0xAF,0xE1,0x63,0x41, + + 0x81,0x42,0xCA,0xE5,0x9C,0xDF,0x26,0x85,0x30,0x61,0x49,0xDA,0xB1,0x22,0x57,0x3D, + + 0x7E,0xF3,0x09,0x56,0x6D,0x38,0x07,0xC0,0x62,0x03,0x1B,0xB7,0x40,0x76,0xC0,0x03, + + 0xA1,0x05,0xFA,0xB7,0x41,0x3F,0x13,0x0A,0x43,0xE4,0x74,0x06,0xA1,0x01,0x88,0xCC, + + 0x77,0x0F,0x99,0x4B,0x29,0xA8,0x62,0xF4,0x15,0x0E,0xE3,0xC8,0xB8,0x36,0x55,0x45, + + 0x0B,0x09,0x36,0xA3,0xB6,0xF2,0x0B,0x21,0xC4,0xF4,0xE9,0x58,0x39,0x15,0xC9,0x12, + + 0x20,0x1C,0xB7,0xE9,0x7A,0xF4,0xA6,0x01,0xE3,0x4E,0x35,0x06,0xED,0xC1,0x3D,0x18, + + 0xE3,0x19,0x75,0x6A,0xE7,0x21,0x20,0x16,0xEB,0xE9,0xAA,0x3C,0xFB,0x6E,0x42,0x28, + + 0x6A,0x91,0xB4,0xC4,0x78,0x09,0x4C,0x9D,0xA2,0x2A,0x98,0x2D,0x5F,0xFB,0x3D,0x21, + + 0x07,0xFC,0x07,0xE5,0xE3,0x65,0x41,0xDA,0xAA,0x97,0xBA,0x43,0x79,0xED,0xCB,0x59, + + 0x8D,0xB4,0x93,0x19,0x10,0xD9,0x1D,0x0C,0xC0,0xEF,0xA3,0x7D,0xC1,0x6D,0x0E,0xB8, + + 0x0E,0x43,0x6E,0xDF,0x33,0x24,0xD6,0xD7,0x4B,0x8C,0x4F,0x9C,0xDA,0xC5,0xB2,0xA9, + + 0x7A,0xF2,0xD4,0xA7,0x68,0x2D,0x58,0x9A,0xC9,0x51,0x83,0xAD,0xDB,0x3F,0x1A,0x38, + + 0xE9,0xAE,0x43,0x2E,0x69,0x83,0x33,0x23,0x7A,0x43,0x02,0xE7,0xDB,0xEE,0x71,0xBB, + + 0xAF,0x14,0x16,0xE5,0xF0,0xA7,0xE2,0x1B,0x29,0x47,0x77,0x0F,0x11,0x16,0x50,0x73, + + 0x06,0xBF,0x44,0x1D,0xFC,0x38,0xEF,0xDF,0x6E,0xAF,0xAE,0x5B,0x76,0x68,0x1D,0xD7, + + 0xEB,0xB8,0xB4,0x6B,0xD8,0xA8,0x64,0x97,0x9C,0x5E,0x27,0xAB,0xD2,0x33,0x10,0x72, + + 0x90,0xBF,0x86,0x07,0x30,0x59,0x75,0xEE,0x83,0x8F,0xEF,0x27,0x61,0x6F,0x45,0x09, + + 0xA7,0x1B,0x6A,0xD5,0xB5,0x1F,0x27,0x33,0x7C,0x18,0x1D,0x75,0x73,0x77,0x7E,0x33, + + 0x07,0xBB,0xFA,0x7C,0x53,0x30,0x4F,0x64,0x38,0x29,0xCE,0xE6,0xC1,0xD9,0x8C,0x49, + + 0xD6,0x1D,0xEC,0x5E,0x32,0xF5,0xA3,0x83,0x12,0x3B,0xD4,0xE0,0xBB,0xE6,0xD9,0x43, + + 0x22,0x7D,0xBC,0xB6,0x84,0xBF,0x5D,0xCD,0x4E,0x5B,0x86,0x95,0x72,0x60,0xCD,0x92, + + 0x00,0x11,0xEB,0x79,0xC1,0x93,0xBA,0x31,0xCB,0x4C,0x14,0xE6,0x89,0x0D,0x06,0x77, + + 0xA5,0xBE,0xFE,0x0E,0xA9,0x65,0x6E,0x8F,0xCB,0x19,0xCA,0xCE,0x87,0x14,0x9F,0xA8, + + 0x2D,0xC6,0x4E,0x04,0x98,0x31,0xA9,0x08,0x9D,0x3A,0x79,0x3E,0xE8,0x64,0x96,0xC9, + + 0xF4,0xB7,0xBF,0x3F,0xB0,0x6A,0xA2,0x19,0x5C,0x39,0xF7,0xE7,0x41,0x77,0xB0,0x5E, + + 0x7F,0x11,0x89,0x6D,0xBD,0x79,0xDF,0xF4,0x2B,0x1A,0xA7,0x2F,0xF9,0x73,0x6F,0xA6, + + 0x8B,0x9B,0x13,0x75,0xB7,0x91,0xA1,0x8E,0x49,0xCE,0x88,0x0E,0x7E,0xD1,0x95,0x5C, + + 0x79,0x00,0xEE,0x36,0x52,0xAE,0x46,0x6C,0x6D,0x8F,0xA0,0xFA,0x92,0x72,0x07,0xD0, + + 0xAC,0xAC,0x90,0x5E,0xA9,0xB5,0x0E,0x10,0x4F,0xA1,0x04,0xDF,0x9A,0x7C,0x47,0xC8, + + 0xC8,0x1E,0xAE,0x1D,0xAC,0x92,0xCC,0xB9,0xE1,0x44,0x8D,0xD2,0x10,0x1B,0x7A,0x4F, + + 0x02,0x88,0xC0,0x4C,0xA1,0xAD,0x50,0x6D,0x6F,0xCD,0x99,0x0C,0xF5,0x8E,0x27,0x96, + + 0x04,0xC1,0x84,0x29,0x97,0xBD,0xA9,0x40,0xE6,0xC7,0x94,0x09,0xD7,0xFD,0xA1,0x3A, + + 0x7F,0x09,0xEB,0xE5,0xB5,0xE2,0xDD,0xB1,0x55,0xCA,0xD3,0x36,0xD5,0xA2,0x3E,0xE0, + + 0xBD,0xED,0x10,0x75,0xB6,0xF3,0x94,0xC3,0x64,0x1C,0x00,0x55,0x2A,0x6A,0x3F,0x24, + + 0x25,0xC4,0x31,0xB7,0x5F,0xE4,0x76,0xE6,0x14,0xC9,0x0F,0x14,0x94,0xE4,0xB0,0x32, + + 0x03,0xA9,0x28,0x16,0x76,0x08,0x49,0x10,0xC8,0x43,0x1F,0x08,0x36,0xE1,0x4D,0xA1, + + 0x80,0x54,0x56,0xEE,0x62,0xB5,0x79,0x6A,0x44,0xDA,0x0A,0x20,0x3F,0x95,0xDE,0xD1, + + 0x16,0xDA,0x38,0xF7,0x7A,0xE6,0x7F,0x33,0xCB,0x87,0x80,0x04,0xE1,0x6E,0xC1,0x4A, + + 0x40,0x5D,0x62,0x96,0xBD,0xA2,0x86,0x48,0xB3,0xCE,0xB6,0x4E,0x14,0x15,0x54,0x36, + + 0x45,0x98,0x69,0x3B,0xFC,0x06,0xC5,0xB8,0xD0,0x82,0xBC,0x46,0xD2,0xAB,0x36,0x78, + + 0xBC,0x08,0xA5,0xFF,0x94,0xE8,0x9E,0xCE,0x6D,0x3B,0xA9,0x2A,0xFF,0xA9,0x0B,0xCD, + + 0x6C,0x24,0x33,0xEC,0xB0,0xC7,0x03,0x87,0x40,0xA9,0xFC,0x28,0xDE,0xBA,0x5A,0xAA, + + 0x56,0xCE,0x4E,0x3C,0xD4,0xDF,0x7D,0xDF,0xCC,0xD0,0xD2,0xE4,0x5D,0x4C,0x53,0x9A, + + 0x47,0x06,0x3B,0xAD,0x29,0xC3,0x3A,0x1A,0x0F,0x30,0x02,0xB9,0xB6,0x5E,0x24,0xB7, + + 0x88,0x1C,0x9D,0xE2,0x7F,0x08,0xCA,0x09,0x31,0x47,0xAA,0x3A,0x7B,0x6E,0x2B,0xDF, + + 0xD9,0xEE,0xD5,0xF2,0x55,0x1C,0x09,0xDB,0xCB,0x6F,0x9D,0xB2,0x36,0xB5,0x22,0x06, + + 0x25,0xC2,0xE3,0xF4,0xB6,0xAC,0x6D,0x63,0xC1,0x59,0xB1,0x4E,0x7F,0x7B,0x0C,0x49, + + 0xCC,0xA0,0xAD,0x12,0x67,0xBC,0x5C,0xF8,0xD0,0xDE,0x43,0x92,0x73,0x43,0x23,0xAA, + + 0xEC,0x83,0x1C,0xE5,0x56,0xF2,0x31,0xC3,0xA0,0x5F,0x35,0x41,0x9F,0x6B,0xC1,0x01, + + 0xA5,0x9B,0xE5,0x92,0xD6,0xD3,0xAD,0x5B,0x60,0x9E,0x00,0x77,0xF1,0xDF,0xA4,0x5B, + + 0xC7,0x92,0xFA,0xF6,0xC9,0x4B,0x38,0x12,0x62,0x9B,0xCA,0x5E,0xD5,0x91,0x7C,0xDF, + + 0x21,0x27,0x53,0xE7,0x96,0x4A,0x23,0x14,0x0C,0x4C,0xE2,0x07,0xD4,0xB5,0x4C,0xAD, + + 0x07,0x11,0xDF,0x77,0x49,0x69,0xCA,0xB3,0xE5,0xCD,0xCB,0x5E,0x55,0x5B,0xB6,0x57, + + 0xF5,0x8A,0x56,0x72,0x40,0x1A,0x86,0x81,0x44,0x96,0xCF,0xC9,0x54,0x56,0xA0,0xB1, + + 0x14,0xDA,0xDE,0x0C,0xAD,0xE5,0xC9,0x6D,0xAE,0xF8,0xCE,0x89,0xDD,0x07,0x08,0xA7, + + 0x07,0x3D,0x6E,0x06,0x9C,0xB1,0x86,0xCA,0x25,0xD0,0xB6,0xBA,0xF4,0xF6,0x2F,0x3F, + + 0x2C,0x5A,0x9F,0x3D,0xB0,0xEA,0x7F,0x0F,0xDF,0x64,0x89,0xD7,0x73,0x0C,0x7F,0x3F, + + 0xC6,0x73,0xA9,0x6F,0xFD,0xF9,0xAA,0xC8,0xBE,0x5D,0xE6,0xF9,0x58,0xF2,0x2E,0xCF, + + 0x4D,0x9F,0xB3,0xF3,0xD5,0xF8,0x48,0x32,0x4D,0x4C,0xA3,0x1D,0x44,0x21,0x56,0x68, + + 0x0D,0x2D,0xE6,0x5B,0xC0,0x19,0xF8,0x78,0xFE,0x80,0xF8,0x42,0xD6,0x2D,0x1F,0x49, + + 0x3F,0xC3,0xD9,0x67,0xC8,0xFC,0x2E,0x54,0x4B,0xD5,0xA1,0x47,0x15,0xED,0xAF,0x42, + + 0xD8,0xDD,0xBA,0xD9,0x77,0xAC,0x07,0x13,0x94,0x90,0x6F,0xFF,0xFF,0xFF,0xFF,0x7A, + + 0x76,0xDF,0xD2,0x4F,0xFB,0x44,0x43,0xD3,0xC4,0xCB,0x35,0x22,0xC4,0x04,0xB3,0xB5, + + 0xF6,0x8A,0xB0,0x24,0x71,0x8E,0xBC,0x14,0xA8,0xA0,0x08,0xC4,0xA2,0xC0,0xBE,0x30, + + 0x21,0xFD,0x11,0x76,0xFC,0x83,0xE6,0x90,0xFE,0xED,0xA9,0xDB,0x7C,0x6F,0x49,0x2C, + + 0x6A,0x47,0x29,0x67,0xF3,0x1F,0x47,0xD3,0xC5,0x45,0x0C,0xC6,0x55,0xE8,0x72,0x64, + + 0xF6,0xE7,0xBE,0x42,0xFB,0x2B,0x31,0x44,0xFE,0x47,0x82,0x32,0xB9,0x00,0x88,0x55, + + 0x0F,0xD8,0x58,0x36,0xF8,0xC6,0x06,0x92,0x47,0xE8,0x71,0x0A,0xC6,0x24,0xF6,0xE9, + + 0x71,0xB9,0x93,0x6A,0x79,0x42,0xE0,0xC0,0x7A,0x05,0x41,0x2A,0x2F,0x1A,0xD9,0xA9, + + 0x83,0x45,0x7D,0x37,0x78,0x34,0x48,0x43,0x28,0x03,0xE7,0xC8,0xBB,0x6A,0x58,0xA7, + + 0x7E,0xA7,0xFC,0x0B,0x3C,0x6A,0x70,0xC4,0x4C,0xE8,0x65,0x9D,0x6C,0xC7,0x9C,0x9A, + + 0xCB,0x08,0x2D,0x21,0xED,0x1A,0x24,0x80,0x97,0xE6,0xA1,0x80,0xAE,0xF2,0xA7,0x6B, + + 0xAC,0xA7,0x03,0x81,0x4C,0xFB,0x94,0x8C,0x3F,0x26,0x37,0x09,0xA4,0x95,0x55,0xFB, + + 0x8D,0x4B,0x3C,0xB1,0xEA,0x2B,0x48,0x4A,0xF7,0x9D,0x9B,0xC4,0xD5,0x2B,0x46,0x1B, + + 0xF7,0x4D,0x2E,0xDF,0x3C,0x81,0x74,0x8A,0xC6,0x0C,0x2D,0x1F,0x2C,0x0F,0xDC,0xDC, + + 0x43,0xFD,0xF4,0xE9,0x7A,0x29,0x62,0x87,0xE7,0x40,0x4A,0x0F,0x7D,0xCC,0x1D,0xAB, + + 0x8E,0xA3,0x97,0x3D,0x1A,0x31,0xD3,0xEA,0xF9,0x2A,0x28,0x12,0xBA,0x6C,0x73,0x7D, + + 0xFC,0x0F,0xAA,0x79,0xF3,0x22,0xF4,0x9F,0xDB,0xB2,0xE3,0x82,0x32,0x4C,0xBC,0x13, + + 0x46,0xBD,0x84,0xBF,0x59,0xAB,0x82,0x91,0xC1,0xD1,0x86,0xD1,0x9B,0x34,0x74,0x18, + + 0x84,0x98,0x29,0x92,0xA5,0x55,0x4E,0xE6,0x8A,0x35,0x38,0x90,0x84,0x7E,0x53,0xF1, + + 0x20,0xBD,0x85,0x81,0xB8,0x55,0x1C,0x52,0x64,0xDF,0xAF,0x15,0x69,0xDD,0x2D,0x02, + + 0x02,0x52,0x39,0xB2,0x10,0xAC,0x8D,0xC2,0x8D,0xF2,0x29,0xCA,0x52,0xDE,0x76,0xF0, + + 0x20,0xBB,0x7B,0x22,0x16,0x5A,0x2C,0x82,0xD1,0x31,0x44,0x86,0x85,0x11,0x7F,0x23, + + 0xAF,0x54,0xF2,0x79,0x52,0x31,0xA5,0xD7,0xC2,0x2A,0x0C,0x8A,0xB9,0x56,0xE5,0xB2, + + 0x01,0x95,0xFB,0x69,0x78,0xA5,0x6D,0x0A,0x4E,0x5B,0xED,0x1A,0x7D,0xD0,0x75,0x2B, + + 0x0F,0x1A,0xB4,0xA6,0x89,0xBE,0xCD,0x7E,0x1C,0x8A,0x4D,0xC4,0x52,0xF6,0x38,0xBD, + + 0x43,0x17,0x32,0xEE,0x1C,0x95,0x2E,0x98,0x0D,0xF7,0x00,0x88,0x91,0x49,0x8E,0x89, + + 0x75,0xC6,0x9B,0x7E,0x1D,0xB2,0x60,0xBF,0x4D,0xF4,0xE6,0x98,0x90,0x08,0x87,0x0B, + + 0x6A,0x80,0x96,0x6F,0x14,0x97,0xB7,0xDB,0x8A,0x96,0xEF,0x8A,0x11,0x2B,0xBB,0xFB, + + 0x26,0xAD,0xDB,0xAC,0xD5,0x94,0x89,0x48,0x4A,0x9B,0xE7,0x9A,0x10,0xEA,0x39,0xEF, + + 0x8B,0xC3,0xE6,0x46,0x1E,0xB7,0xB7,0x16,0x93,0x6A,0xA5,0x1F,0xFE,0xF1,0xB3,0xD0, + + 0x8E,0x22,0x94,0xF3,0x4D,0x92,0x64,0x15,0x1B,0x06,0x4E,0x9E,0x90,0xAC,0xF3,0xAB, + + 0x55,0x53,0xCC,0xF0,0x51,0x7A,0x28,0x93,0x78,0xC1,0x85,0xC3,0x11,0x1A,0x4E,0xBF, + + 0x1C,0x0F,0x6B,0xF9,0xD8,0x42,0x5B,0x12,0x58,0x31,0x6B,0x9F,0x10,0x8E,0x26,0x1F, + + 0x02,0x00,0x30,0xF6,0x53,0x01,0x4E,0x8F,0x60,0x35,0xB4,0x75,0x52,0x80,0xAF,0x5D, + + 0xF8,0xFD,0xF2,0xC2,0x7D,0x40,0x2E,0x8A,0xAE,0x52,0x41,0xDD,0xE6,0xA1,0x16,0x3D, + + 0xD0,0x77,0x37,0xED,0x69,0xED,0x2F,0xDF,0xC4,0x3F,0x35,0x55,0xEB,0xE0,0x80,0x6D, + + 0x10,0x0E,0xD0,0x71,0xB1,0x7C,0x82,0x82,0xFB,0x6C,0x3D,0x29,0x3C,0x70,0x5E,0xFF, + + 0x6E,0xB7,0xF2,0xF4,0xFD,0xE0,0x88,0x46,0xC4,0x28,0x24,0x98,0xDB,0x19,0x93,0x2D, + + 0x6F,0x88,0x4C,0x72,0xE8,0x28,0x40,0x89,0xEB,0xC8,0x43,0x06,0xD7,0xF3,0x9E,0x3D, + + 0xEC,0x55,0xDB,0xF7,0x53,0x09,0x09,0x01,0x35,0xA3,0x61,0x17,0x56,0xF9,0x96,0x2D, + + 0xA9,0x58,0x3D,0xA9,0x7E,0xD6,0x82,0x54,0x66,0x86,0x69,0x84,0x53,0x6A,0x5F,0xE0, + + 0x28,0x25,0x9A,0xF5,0x6F,0xA8,0xE7,0x0E,0xA5,0x5B,0xA4,0x4C,0xA3,0x45,0x74,0xF8, + + 0x09,0xC9,0x00,0x0C,0xBC,0x16,0x04,0x97,0x2F,0x36,0xA8,0x3F,0xB6,0x3A,0xB5,0x89, + + 0x4E,0x59,0x63,0x0E,0x32,0xAC,0x21,0xD4,0x27,0x19,0x66,0x0B,0x35,0x79,0x2D,0x06, + + 0xBE,0x4F,0x3B,0x20,0x8D,0x70,0x45,0x82,0xE9,0x66,0x81,0x1B,0xB5,0xE6,0x38,0xCA, + + 0x72,0x23,0x0E,0xD1,0xEB,0x25,0x2B,0x0C,0xEB,0x53,0xA0,0x38,0xB5,0x88,0x14,0x5D, + + 0x2B,0x20,0x22,0x3C,0xE0,0xC8,0xC2,0x84,0x5F,0x80,0x6C,0x8D,0xDB,0x60,0xC3,0xBB, + + 0x30,0x5D,0xC3,0xA5,0xBA,0xB5,0x72,0x0D,0x35,0xDE,0x63,0x9F,0x1A,0x4F,0xFD,0xAA, + + 0x2C,0xCF,0xD3,0x00,0x38,0xBF,0x84,0x5F,0x4D,0x23,0xA9,0x29,0x34,0x8B,0x1F,0xF2, + + 0xA4,0x8F,0x04,0xF4,0x56,0x7C,0x06,0x92,0x98,0x7F,0xCC,0x82,0x9F,0xB4,0xBC,0x61, + + 0x4F,0xF4,0xFC,0x90,0xFD,0x40,0xAC,0xC1,0x09,0x7A,0x18,0xB2,0x35,0x44,0x9E,0xF3, + + 0x24,0x84,0xDB,0x80,0x90,0x16,0x95,0xD1,0x86,0x8E,0x8F,0x17,0x61,0x5D,0x15,0x60, + + 0xC3,0xFD,0x09,0xB3,0x86,0xA7,0x45,0xA7,0x05,0x52,0xE7,0xFF,0x89,0x5C,0xDC,0x8D, + + 0x95,0xD5,0xF2,0xEF,0xDD,0xF0,0xF4,0xF2,0x00,0x6B,0x64,0x96,0xF6,0x5B,0x7E,0xA7, + + 0xCC,0xD1,0x48,0xF2,0xB8,0x18,0x22,0x10,0x63,0x50,0xDC,0x65,0xD4,0xB4,0x5B,0xEB, + + 0xCE,0x9B,0xDF,0x77,0x27,0x19,0x46,0x01,0x0F,0xCC,0x8D,0x6F,0x53,0x7F,0x57,0x63, + + 0x3E,0x38,0x38,0x44,0xD0,0x1A,0x82,0x34,0x1E,0x21,0x02,0x84,0x83,0x01,0x40,0xB7, + + 0xC5,0x49,0x1E,0xBE,0x3C,0x47,0x33,0x59,0xE8,0x55,0x16,0x5E,0xF6,0x2B,0x78,0xEA, + + 0xAD,0x8F,0xB0,0x0E,0xC2,0x14,0xA8,0x8B,0xCC,0x58,0x3D,0x81,0x21,0x74,0x3D,0x89, + + 0x1F,0x37,0xE6,0xE9,0x98,0x17,0x65,0xE4,0xC8,0x77,0xC9,0xA8,0xD8,0x2F,0xBF,0x6B, + + 0x5E,0x3A,0x79,0xD8,0x63,0xFA,0xBD,0x48,0x69,0x56,0xC4,0x44,0x7F,0xE7,0xC2,0xEE, + + 0xA1,0x31,0xB8,0xBE,0xBE,0xA3,0x48,0x08,0x0F,0xD8,0xAC,0xEC,0xCD,0x55,0x39,0xAA, + + 0xAF,0x82,0x8F,0xFA,0x5C,0x18,0x1F,0xDE,0x04,0xD2,0xE8,0xC3,0x94,0x0C,0xB7,0x58, + + 0xD8,0x33,0xD9,0x63,0xDF,0xBA,0x0E,0x91,0x8F,0xDA,0xE0,0x65,0xDA,0x03,0x51,0x7A, + + 0xCE,0x9B,0xF8,0x2C,0x3B,0x32,0xFF,0xC9,0x8F,0xDD,0x44,0x4E,0x8B,0x50,0x93,0x24, + + 0xA1,0xDF,0x23,0xF2,0x23,0xE1,0x4E,0x09,0xBF,0x5B,0x68,0x63,0x92,0xE0,0x98,0x63, + + 0x68,0xAA,0x30,0x04,0xB6,0x4F,0x0D,0xC9,0x4B,0x03,0xC7,0x56,0x12,0x62,0xB5,0x63, + + 0x7F,0x6E,0x39,0xFA,0xA3,0x90,0x75,0x57,0x3F,0x39,0x99,0x10,0x52,0x66,0x71,0x15, + + 0x61,0x42,0x6E,0xD5,0x95,0x06,0x0A,0xA8,0x1D,0x52,0x66,0x8A,0xD3,0x61,0x45,0xA8, + + 0x17,0x49,0xD1,0x46,0xFC,0x3F,0xC6,0x13,0x2E,0x28,0xC6,0x4C,0xE1,0x79,0x36,0x7D, + + 0xE2,0xAA,0xD9,0x13,0xCD,0x2F,0x64,0x57,0x20,0x31,0x81,0x28,0xF6,0xBA,0x3F,0x6D, + + 0x92,0x4B,0x33,0x23,0x6D,0x8B,0x37,0xA8,0xC3,0x06,0xF9,0x07,0x77,0x99,0xDF,0xA1, + + 0x55,0xA6,0x49,0x36,0x4D,0x8A,0x4F,0x44,0x70,0x0A,0x66,0x29,0x2C,0x69,0x5C,0xEA, + + 0x0C,0xA5,0x77,0x7E,0xBF,0x6A,0x4B,0xAF,0xAD,0xB7,0xAC,0xF4,0x7B,0xC8,0xDA,0x9C, + + 0x14,0x66,0x29,0x34,0xF8,0xD6,0xDA,0x00,0x13,0xBD,0x1C,0xD4,0x0D,0x24,0x95,0x3B, + + 0xAC,0x46,0x89,0x9D,0x44,0x1B,0xCE,0x00,0x29,0xF5,0xCA,0x92,0x7D,0x63,0x52,0x9C, + + 0x2C,0xFA,0xD2,0x01,0x3C,0x22,0x8D,0x4A,0xA5,0xC4,0xD9,0xDB,0x59,0xDB,0xD4,0xCC, + + 0x22,0x82,0xD7,0x9C,0x46,0x25,0x0A,0x6C,0xE3,0xBA,0xEA,0x86,0xA7,0x23,0xD9,0x69, + + 0x67,0x4F,0x65,0x37,0xC6,0x6F,0x9A,0x59,0xDB,0x40,0xE4,0x54,0xD6,0xEB,0x7B,0x29, + + 0xD5,0x85,0x47,0x88,0xA2,0x21,0x09,0xA4,0xA2,0xAF,0xF3,0x64,0x92,0x7F,0x5F,0x53, + + 0x2A,0x04,0x87,0x1D,0x42,0x12,0x26,0x8B,0xE8,0x0F,0x5C,0x3D,0x56,0xCF,0x2A,0x7A, + + 0x81,0x99,0x03,0x96,0xDB,0xD1,0xB3,0x89,0x89,0x01,0xCD,0xB8,0xD5,0x7B,0xCC,0xF6, + + 0xD6,0x01,0xCE,0xE7,0x5D,0x2A,0xB0,0x23,0x59,0x59,0x3B,0x81,0x42,0x57,0x07,0x61, + + 0x8E,0x09,0xDC,0x02,0xD5,0x3B,0xD1,0x24,0xA3,0xA1,0x55,0x21,0xA9,0x22,0xB5,0x6E, + + 0xA7,0x9B,0xE9,0xE1,0x90,0x83,0x49,0x59,0xF3,0x1E,0x27,0xC4,0x9D,0x7A,0xC0,0xBF, + + 0x03,0xF4,0xD2,0xF1,0x34,0x15,0xF8,0x7F,0x61,0xA7,0x3B,0x06,0xF0,0x3C,0x59,0xD2, + + 0x35,0xBE,0x06,0xA7,0x5F,0x94,0x04,0x41,0x00,0x84,0xBC,0xB0,0x02,0xF8,0x1C,0x76, + + 0x07,0x5E,0xE4,0xA7,0x51,0x3D,0x95,0xC0,0x61,0x5B,0x09,0x15,0xFA,0x79,0x58,0xD0, + + 0x42,0xE8,0xF5,0xE5,0xDE,0x98,0x48,0x75,0xCB,0x43,0xA5,0x77,0xF6,0x4E,0xF2,0x60, + + 0x6A,0x55,0xDF,0x90,0x5B,0x18,0xE9,0x40,0x76,0x15,0x14,0x9A,0x14,0xF5,0xCE,0xC8, + + 0x87,0x02,0x18,0xEE,0x0A,0x79,0xA6,0x43,0xE4,0x84,0xD5,0xDC,0x61,0x62,0xFC,0x81, + + 0x0D,0xE5,0x7F,0x65,0x32,0xFF,0xF0,0x57,0xDB,0x1B,0xCE,0xA9,0x5F,0xD7,0xCA,0xFF, + + 0x56,0x1D,0x77,0x75,0xD1,0x76,0x78,0x4A,0x85,0xF6,0x33,0xDB,0x06,0x60,0x66,0x4D, + + 0xC3,0x2D,0x66,0xBE,0x58,0x00,0x6E,0x78,0xC9,0xD7,0xAE,0xCB,0xD9,0x7A,0x74,0x2B, + + 0x13,0xE2,0xA8,0xF1,0xCE,0x9B,0x4A,0xF2,0xCA,0xDD,0x25,0x1E,0xDA,0xF7,0x0D,0x2B, + + 0x8B,0xAE,0x07,0xE9,0x53,0x50,0xC4,0xD8,0xDA,0x1C,0x5F,0x28,0x5B,0xF4,0x15,0x47, + + 0xC3,0xFE,0x5E,0x9D,0xBA,0xB2,0x27,0xC2,0x87,0xAA,0xA0,0x1F,0x26,0xA2,0xD8,0x8A, + + 0xA1,0x53,0xA1,0x84,0xDD,0x17,0x28,0x27,0x8C,0x21,0x8A,0xCE,0x00,0xAF,0xA5,0xF5, + + 0x36,0x23,0x57,0x69,0x9A,0x27,0x66,0xD0,0x19,0x44,0xA9,0xC9,0x53,0x52,0xD9,0xC5, + + 0xA2,0xC0,0x99,0x40,0x5E,0xB3,0x20,0xCB,0x4A,0x0F,0xE8,0xAF,0x71,0x43,0x91,0x2E, + + 0x22,0x91,0x29,0x57,0x8D,0x5E,0x60,0xB5,0xA1,0x3C,0xB4,0xB5,0x1C,0xB4,0x2E,0xB2, + + 0x6F,0x25,0xCF,0x79,0x7A,0xE6,0x4C,0xDE,0x25,0x6D,0x66,0x25,0xDE,0xA5,0x7D,0xA2, + + 0xED,0x24,0xFE,0x63,0xA4,0xE8,0x6D,0x9A,0xA1,0x88,0xBA,0x16,0x55,0x65,0xF7,0xA9, + + 0x23,0x29,0xEB,0x37,0xF5,0xD2,0x64,0x89,0x63,0x69,0x5A,0x1C,0x03,0x1B,0xFF,0xD7, + + 0xA3,0x94,0x16,0xA7,0x41,0x96,0x86,0x18,0x4A,0x31,0xA1,0x2F,0x55,0xEF,0x9A,0xB6, + + 0xAB,0x8E,0xC0,0xF0,0x1F,0x28,0xF2,0x76,0xF1,0x15,0x8A,0xD1,0xB5,0xD9,0x52,0x98, + + 0xC4,0xFE,0xCA,0x4D,0xE7,0x04,0x82,0xC5,0xA4,0xF8,0x7A,0x63,0xC5,0xF2,0x0D,0xF1, + + 0x2D,0x0A,0x99,0xE7,0xC8,0xE5,0x4D,0x07,0xFF,0xC8,0x5F,0xB0,0xDD,0x8A,0x13,0x7B, + + 0xB3,0x8D,0xBA,0xFD,0xF6,0xA4,0x97,0xA4,0xCE,0x8B,0x18,0x49,0xFE,0x09,0x5A,0xB5, + + 0xE7,0xBD,0x22,0x6F,0xDD,0x51,0x7A,0xB3,0xA7,0xFD,0x26,0x1C,0xFD,0xEA,0x33,0xF4, + + 0xAA,0x86,0x93,0x2D,0x27,0xE2,0x04,0x52,0x7C,0x0A,0x79,0x7C,0x39,0xEB,0x3B,0xD3, + + 0x09,0xAF,0x9B,0xBF,0xF7,0x9F,0x39,0x89,0xED,0x24,0xFB,0x48,0x7D,0x15,0xEB,0xD3, + + 0x2A,0x86,0xD7,0xC0,0xFC,0xD5,0xC3,0x84,0x26,0xDE,0x73,0xBA,0x7E,0x65,0x0A,0x38, + + 0x85,0xFC,0xB2,0xAF,0xCB,0xDC,0x25,0xE5,0xAE,0x31,0x34,0xC0,0x08,0xBF,0x6D,0xF4, + + 0x86,0x1C,0x73,0x69,0xDC,0xE0,0xBE,0xC4,0xA7,0xF1,0x43,0x5E,0x71,0xBC,0xC2,0xC3, + + 0xE4,0x89,0xC3,0xAE,0xB7,0xF2,0x7D,0x3B,0xD7,0x06,0xD5,0xF4,0x5F,0xFF,0x4D,0xC0, + + 0x56,0x9C,0x41,0x08,0xB4,0x00,0x35,0x23,0x0C,0xC2,0x11,0x28,0xF4,0x53,0xA4,0xE3, + + 0xE5,0x19,0x9A,0xEE,0x30,0x95,0x65,0x66,0x7F,0x08,0x5B,0x62,0x33,0x51,0xFA,0x38, + + 0xCE,0xA4,0x2C,0xF7,0xCD,0x48,0x04,0x02,0xB1,0xE4,0xF8,0x14,0xF5,0xFD,0x1D,0x33, + + 0xCF,0x37,0x8D,0xA5,0x95,0x67,0xB5,0xC2,0x1C,0x2B,0x95,0xA7,0xD8,0x7D,0x95,0x23, + + 0x4D,0x36,0x95,0x27,0xC3,0x16,0xBD,0xD2,0x24,0x5A,0x49,0x85,0x54,0x0C,0x7F,0x0E, + + 0x8B,0x88,0xFF,0x92,0x99,0xB3,0xA1,0x55,0x6A,0x6B,0x8C,0x48,0x7A,0x72,0x2F,0x7C, + + 0xAF,0x65,0x94,0x76,0x39,0xF6,0x04,0x52,0x37,0x96,0xBE,0xAD,0x6E,0x88,0xDF,0x63, + + 0xEE,0xD5,0x21,0xE9,0xFC,0xF5,0x3A,0x2F,0xAF,0xFE,0x93,0x8B,0x97,0xAB,0x15,0x1F, + + 0x9F,0xB0,0xF6,0x83,0x18,0x3B,0x1F,0xAB,0x0C,0xC0,0xE6,0x7E,0x58,0xF0,0xF0,0x4E, + + 0x0A,0x8F,0xF7,0x4A,0x16,0xA8,0x0E,0xFB,0x3D,0x57,0x23,0x6A,0x23,0xA3,0x50,0xEF, + + 0x4E,0x6D,0x78,0xE1,0x0F,0xFF,0x6A,0xF0,0x0C,0x22,0xFA,0x1C,0x5B,0xFD,0xD8,0x29, + + 0xE6,0x7F,0xBD,0xCE,0x1D,0x0B,0xBA,0xDA,0x82,0x9C,0x97,0xAF,0x52,0x75,0x37,0xC4, + + 0x4E,0x30,0x62,0x7A,0xDC,0x16,0x07,0xF9,0xAF,0x7F,0xFF,0xFF,0xFF,0xFF,0x60,0x03, + + 0x55,0x0D,0xC7,0xF7,0xFB,0x44,0x16,0x09,0x23,0x48,0x67,0x42,0xA7,0x99,0x32,0xF8, + + 0x81,0xCE,0xB6,0x39,0xB2,0x63,0x63,0x43,0x2D,0x4E,0xC1,0x36,0x36,0x41,0x19,0x05, + + 0xA8,0x14,0xBF,0x29,0x33,0x47,0x07,0x09,0xC6,0xD0,0x89,0x31,0x25,0x6D,0x37,0xC9, + + 0xA2,0xB1,0x4A,0x14,0x7A,0x47,0x40,0xF0,0x64,0xC4,0xC0,0x37,0x34,0xE4,0x45,0xB2, + + 0x42,0x4B,0xB9,0x2B,0x4F,0xDB,0x68,0x88,0x62,0x0B,0x84,0x16,0xB9,0xF5,0xA0,0x44, + + 0x05,0xAF,0xC7,0xAF,0xA2,0xBD,0xA0,0x98,0x63,0x08,0xE6,0x4C,0xDE,0x93,0x79,0xA9, + + 0x88,0x49,0x78,0x19,0x65,0x1B,0xE9,0x81,0xC6,0xC6,0xEF,0xC4,0x90,0x99,0x83,0xB9, + + 0x91,0x4A,0xB2,0x97,0x17,0x29,0xB5,0xE3,0x9F,0x4F,0xD1,0x71,0x5B,0x3C,0x5B,0xB7, + + 0xAD,0x03,0xBC,0x34,0xBB,0x4D,0x92,0x25,0x2B,0x40,0x96,0x38,0xDA,0x4C,0x52,0x9D, + + 0x3A,0x88,0x1C,0x1D,0x0C,0x32,0x61,0x5A,0x08,0x4D,0xCA,0x20,0x41,0x72,0x42,0xE1, + + 0xCB,0x47,0xBD,0x34,0x3B,0x8A,0x05,0x01,0xCE,0xD8,0x18,0x5E,0xB4,0x65,0xB3,0xF9, + + 0x85,0x4B,0x7C,0x99,0xCB,0x44,0x63,0x28,0xF9,0x09,0xBB,0x4B,0x3B,0x4B,0xBD,0xA0, + + 0x00,0x41,0x66,0xC8,0x5A,0x99,0xD6,0x98,0x16,0x03,0xEC,0x54,0x1A,0xC3,0xF5,0x48, + + 0xAC,0x16,0xEA,0xFF,0x53,0x9C,0xCD,0x49,0x22,0xCF,0xBC,0xDD,0x5A,0x2D,0xAF,0xD6, + + 0x89,0x6E,0xC5,0xED,0xD2,0xFF,0x93,0xC1,0x5A,0xE1,0xC4,0x1E,0xA2,0x02,0xDB,0x3F, + + 0x74,0x14,0xC7,0x6B,0xA8,0x3D,0x7D,0x44,0x68,0xCB,0xFF,0x89,0xB8,0x6D,0xC1,0xF3, + + 0x73,0x1B,0x92,0x6C,0xB0,0x7D,0xE8,0xDF,0xC3,0xF0,0xAA,0x99,0x51,0xF0,0x72,0xA5, + + 0x12,0xD6,0x94,0x0C,0x3C,0xD0,0x5B,0x43,0x67,0xE3,0xC5,0x27,0x94,0x1F,0x85,0xA0, + + 0xBE,0x9F,0xDD,0x95,0x59,0x03,0x04,0xB0,0xD0,0x10,0x6F,0x4D,0x3A,0xB2,0xB5,0x6E, + + 0x48,0xF2,0x85,0xEA,0x70,0x51,0xA9,0x8E,0xDD,0x86,0xFF,0xB9,0xF0,0xB3,0x01,0x26, + + 0x00,0xD4,0x6E,0xAB,0x91,0x75,0x6A,0x40,0xED,0xA2,0x47,0x60,0x56,0x51,0xB4,0x38, + + 0x29,0x58,0x96,0xA5,0x4F,0x2A,0x66,0x03,0x17,0xF8,0x1C,0xD0,0xA9,0xF3,0xC4,0xA7, + + 0x91,0xF4,0x62,0xE8,0x35,0x75,0x5D,0xE5,0x3E,0x55,0xB7,0xF4,0xF1,0x96,0x14,0x58, + + 0x04,0x0C,0x75,0x05,0x10,0x59,0xCE,0xB6,0x29,0xA6,0xDB,0xB5,0xA7,0x19,0xAA,0x17, + + 0x29,0x58,0x42,0x09,0x7B,0x18,0x87,0x2C,0x6F,0x18,0x4C,0xA0,0x4B,0xEC,0x18,0xAD, + + 0x9A,0x54,0x18,0x7E,0xBB,0x65,0x61,0xFF,0x94,0xEF,0xC1,0x3E,0x5B,0x49,0x13,0x04, + + 0xCB,0xD0,0xD7,0xEF,0xFA,0x50,0x77,0xAB,0xA7,0x57,0x4D,0xB0,0xFE,0x69,0x57,0x9D, + + 0x81,0xF9,0x69,0x6D,0xB1,0x34,0xA4,0x2B,0xE9,0x51,0xA7,0x55,0xF3,0x34,0x80,0xAE, + + 0xA8,0x1F,0xA4,0x4C,0x3B,0x7C,0x1E,0xA0,0x6C,0x4F,0x8F,0xB5,0xDF,0x0A,0xF6,0x5A, + + 0x09,0xED,0x0E,0x8D,0xE3,0xB6,0xFE,0x9A,0xD8,0x38,0x9E,0xBA,0x5D,0x79,0x42,0x2B, + + 0x99,0x2C,0xE3,0x12,0x46,0x4F,0x10,0xAB,0x66,0x52,0x96,0x8B,0x6C,0x76,0x37,0x31, + + 0xB9,0x52,0xCB,0x21,0xBB,0x2A,0x67,0x12,0x47,0x52,0xDC,0x3A,0xC8,0x15,0xEC,0x3B, + + 0x37,0x84,0x1F,0xE4,0xFD,0x91,0x73,0xD1,0xAD,0xB1,0x34,0xA2,0x17,0xEF,0x90,0x82, + + 0xA2,0x85,0x17,0x76,0x19,0xC9,0x7B,0xC0,0xB8,0xCE,0x40,0xDE,0x47,0xAC,0xFB,0x02, + + 0xB7,0x03,0xAB,0x05,0x7F,0x43,0x49,0x50,0xF0,0x80,0x21,0x55,0xE7,0x83,0x2F,0xFB, + + 0xE5,0x08,0x3F,0x97,0x93,0x71,0xF9,0xAB,0x2E,0x6E,0x46,0xDF,0xCB,0xAE,0xA5,0x24, + + 0x8B,0x72,0x58,0xC4,0xD3,0x69,0x88,0x10,0xAD,0xC7,0xE6,0x5E,0x50,0xC5,0x2C,0x34, + + 0x8A,0x53,0x5C,0xB4,0x2C,0x35,0xC0,0x8D,0xAE,0x74,0xB8,0x47,0x2F,0xA7,0x9E,0xD3, + + 0x71,0x9D,0x99,0xAF,0x88,0xEB,0x0F,0x5A,0xF5,0xC7,0xD0,0x05,0x29,0x6D,0x61,0x43, + + 0x7A,0x06,0x55,0x70,0x34,0xBC,0xD5,0xEC,0xC4,0x1E,0xED,0x7D,0x76,0x58,0xA6,0xEC, + + 0x67,0x99,0xA5,0xAE,0xBD,0x4B,0x25,0xC8,0xA5,0x59,0x1E,0xB1,0xB7,0x59,0x73,0xDB, + + 0xA8,0x00,0xAE,0x7E,0x41,0xAF,0x42,0xCA,0x0A,0x68,0xB4,0x2D,0xFE,0x18,0xA4,0x79, + + 0x67,0xBB,0xFA,0xDF,0x39,0x23,0xF3,0xB3,0x2F,0x37,0xEA,0xBC,0xDA,0xF9,0x2F,0xFB, + + 0x89,0xAA,0x02,0x88,0x3C,0xA2,0xAD,0xD1,0xCB,0x59,0xE2,0x25,0xBA,0x1B,0x99,0xAC, + + 0x3D,0xAE,0xE5,0x28,0xB2,0xA3,0xB2,0xC2,0x14,0x8E,0x32,0x2E,0x9B,0x90,0x92,0xB2, + + 0x2B,0xC0,0x2A,0xF6,0x1D,0xA0,0x7A,0x7A,0xC2,0x60,0x53,0x0D,0x63,0x4C,0xDB,0xB4, + + 0xBD,0x6C,0x57,0xBF,0x96,0xA1,0x71,0x38,0xCE,0xCE,0x4C,0x20,0x4B,0x33,0x90,0x24, + + 0xFB,0x94,0xB2,0xD9,0xFB,0xA9,0x65,0xE8,0xB3,0x30,0xC3,0x4E,0x7E,0x40,0x1E,0x79, + + 0xD8,0x71,0x9E,0x6E,0xB4,0x7F,0xF5,0x26,0x32,0xF0,0x1C,0xB2,0x95,0xEB,0xBD,0x8D, + + 0x19,0x2A,0x05,0x01,0x96,0xB7,0x2B,0x8C,0x15,0x93,0x46,0x5E,0x2F,0xBE,0xE5,0xAE, + + 0xF6,0x46,0x85,0x96,0x55,0xB4,0xF5,0x3A,0x48,0x27,0x25,0x41,0xC7,0x26,0x29,0xAC, + + 0xC9,0xD1,0x84,0xBC,0x14,0x1A,0xF5,0xB7,0x67,0xD7,0xED,0xAE,0xEB,0xE8,0x9B,0x2A, + + 0x2C,0xD9,0x71,0xCE,0xB6,0x14,0x8D,0xC5,0xC7,0xAB,0x4C,0x69,0x64,0xB9,0x35,0x55, + + 0x21,0x86,0x47,0x1C,0x8C,0x4A,0x54,0x90,0x86,0x2E,0x2C,0x85,0x5D,0x7C,0xC9,0x5C, + + 0x4D,0x27,0x49,0x62,0x63,0xD5,0x4C,0xA1,0x47,0xEB,0x14,0xA7,0xF2,0xBA,0x63,0x3B, + + 0x21,0x3A,0xB4,0x7C,0x12,0x6D,0x79,0x0D,0x1C,0x48,0x7D,0x17,0xE6,0x02,0xB3,0x12, + + 0xF8,0x09,0x30,0xEE,0x70,0x15,0x7F,0xC8,0x97,0xB4,0xF2,0xC8,0x83,0xFE,0x38,0xAF, + + 0x9E,0xD4,0x74,0x9F,0xBF,0x85,0x3E,0xFA,0x3F,0xC2,0x59,0x56,0x59,0xB6,0x80,0xB2, + + 0xCF,0x50,0x31,0x6D,0x8F,0xBE,0x88,0x30,0x19,0x5C,0xE7,0xB2,0x5D,0x96,0x77,0x9F, + + 0x85,0x79,0xA9,0xFD,0x42,0xA0,0x1F,0x4F,0xE5,0x99,0x07,0x40,0xDF,0x16,0x1E,0x3C, + + 0x28,0x24,0x98,0xF3,0x2E,0xF1,0x2C,0xDF,0x06,0xDF,0x65,0x6A,0x79,0x45,0x94,0xA8, + + 0x1C,0xCF,0x7D,0xEF,0x03,0xFF,0xBE,0xEA,0x78,0xD3,0xF6,0xC6,0x79,0xBC,0xE6,0x23, + + 0x24,0x63,0x28,0x3C,0x9C,0x35,0x0E,0x8D,0x55,0xC1,0x48,0xA8,0x3C,0x7E,0x97,0x59, + + 0x2F,0xDB,0xFB,0xD5,0x1E,0x10,0x47,0x10,0x6C,0xD2,0x98,0x6D,0xBF,0xF7,0x16,0xE9, + + 0x8C,0x6D,0xA4,0xF7,0x9C,0x61,0xEF,0x53,0x3C,0xCF,0xA4,0x42,0x9A,0x89,0x88,0x57, + + 0x2F,0xDD,0x30,0xEE,0x01,0x6C,0xD3,0xD6,0x51,0x0C,0xB8,0xD4,0xF0,0x9E,0xFA,0x08, + + 0x2D,0x19,0x3C,0xFA,0xE7,0x22,0xEA,0xC9,0x7A,0x0F,0xAF,0x51,0xF4,0x64,0xDD,0x4F, + + 0x12,0x3C,0xF6,0x91,0x99,0x44,0xD6,0xD7,0xE5,0x45,0xA7,0x4D,0x0F,0x22,0xD0,0x33, + + 0x6E,0xA5,0xDE,0x7B,0x6F,0x66,0xF0,0x22,0xC1,0xEF,0x2F,0xE0,0x55,0xC7,0xE8,0x22, + + 0x61,0x59,0x70,0xAB,0x20,0x85,0x18,0xB6,0x0B,0x07,0xF8,0xF0,0x58,0xDB,0x79,0x71, + + 0xF0,0xA9,0x8F,0x26,0xA1,0x46,0x39,0xE1,0xE0,0x56,0xE6,0x28,0xD4,0xFE,0xD9,0xD3, + + 0x03,0xDF,0x71,0xAE,0xF8,0x2D,0x91,0xC0,0xB8,0x43,0xE7,0x09,0x5C,0xC1,0xFD,0xF0, + + 0x08,0xB3,0x39,0xF3,0x3C,0x44,0xA7,0xA8,0xE9,0xE7,0xAA,0xD0,0x58,0x74,0xE6,0x77, + + 0xD7,0x54,0x88,0xE3,0x94,0x84,0x24,0x00,0xC4,0xEF,0xC5,0x97,0x2E,0x6D,0x87,0x8D, + + 0x80,0xA6,0xBD,0xD1,0x52,0x90,0x80,0xD8,0xB8,0x6A,0xAC,0x67,0xC8,0x2B,0xE8,0x59, + + 0x86,0xA6,0x93,0x8E,0xC6,0xAB,0x4F,0xF9,0xF9,0xC0,0x44,0x68,0xDF,0xE1,0x7A,0xB7, + + 0xCB,0x6E,0xC2,0x63,0x73,0x6E,0x68,0x97,0x4C,0xD4,0x4D,0x2C,0x7F,0xE1,0x10,0x81, + + 0x7F,0xA2,0x70,0xB3,0xF2,0xD4,0x24,0xFA,0x69,0x09,0x84,0x00,0x5B,0x23,0x87,0x99, + + 0x86,0x4F,0x8D,0x36,0xA9,0x9A,0x73,0xAF,0x8A,0x63,0x2C,0xE9,0x99,0xC8,0xEB,0x2B, + + 0xE9,0x53,0x6E,0xBF,0x7B,0x8B,0x63,0x87,0x67,0x42,0x9B,0xBB,0x9B,0x74,0xFB,0xFA, + + 0x0E,0xCF,0xFA,0x82,0xD1,0xB3,0x2C,0x30,0xC3,0xF0,0xAE,0x14,0xE5,0xDF,0xEF,0xD0, + + 0x31,0xBC,0x29,0x76,0xD1,0x9C,0x8F,0x34,0x26,0x43,0x9C,0x5B,0x63,0x3C,0xE9,0xEE, + + 0x7E,0x4F,0xA8,0x76,0x3C,0x73,0x06,0xA3,0x6B,0xA7,0x31,0x81,0x55,0xF3,0x5D,0xC0, + + 0xDD,0x18,0xF5,0xA4,0xC5,0x9C,0x47,0xB0,0x96,0x53,0xCF,0x4E,0x46,0x1D,0x52,0xA2, + + 0x42,0x95,0x5B,0x3C,0x32,0x76,0x16,0xDF,0x49,0x16,0x86,0x60,0x31,0xC5,0x61,0xF4, + + 0xC8,0x71,0xB3,0xAE,0x45,0xAA,0xE3,0x16,0x9F,0x1E,0x85,0xD1,0xD6,0x19,0x3B,0xC7, + + 0x43,0x95,0xC1,0x62,0x4F,0x67,0xDB,0x07,0xD1,0x36,0x8C,0x7D,0x57,0x89,0x75,0x22, + + 0x85,0x72,0x70,0xE4,0x12,0x93,0x9D,0x20,0xED,0x4C,0x3A,0x35,0xAB,0x35,0x86,0x8B, + + 0xF7,0xA5,0x15,0xFE,0x52,0x89,0x27,0x85,0x78,0x5C,0xA9,0x23,0x89,0x2E,0x8E,0xDF, + + 0x07,0xC5,0x1D,0x0E,0xC6,0x94,0xCA,0xE6,0xFA,0x66,0x61,0xFB,0x90,0x90,0xAC,0xF3, + + 0x7D,0x01,0xF9,0xB4,0x37,0x97,0x11,0xEE,0xC6,0x86,0x07,0x45,0x3B,0x37,0xDB,0xC7, + + 0x3A,0x24,0x98,0x0F,0xB9,0x7A,0xDF,0x9D,0xD2,0x1A,0x78,0x4D,0x79,0x64,0x7E,0x3B, + + 0x04,0x5D,0x59,0x2E,0xDA,0xC3,0x50,0x97,0xCD,0x58,0x98,0x6A,0x7C,0x8F,0x30,0xDE, + + 0xCA,0x9E,0xF5,0x4F,0x98,0xE2,0xD0,0x1E,0x58,0xFD,0xDC,0x1A,0xFB,0x4D,0x51,0xAB, + + 0xCA,0xDE,0x6B,0xB6,0x64,0xC1,0x97,0xD6,0xCD,0x1C,0x8C,0x05,0xD6,0x33,0x62,0xFD, + + 0x36,0xE2,0xF8,0xAC,0xC8,0x3F,0xE0,0x1F,0x17,0x74,0x86,0xD8,0x1A,0x30,0x70,0x53, + + 0x78,0x8B,0xDF,0xFA,0x14,0x3B,0x70,0x13,0x34,0x82,0x7E,0x59,0x70,0x4F,0x0A,0x74, + + 0x9B,0x93,0xF1,0x10,0xB0,0x1E,0x2F,0xC9,0xB9,0x10,0x80,0xCD,0x71,0xE7,0x2E,0x27, + + 0x09,0x99,0xA1,0x83,0x9C,0xC5,0x25,0x29,0x65,0x6D,0x15,0x45,0x27,0x87,0x91,0x9D, + + 0x86,0xCB,0x05,0x68,0x4F,0x7E,0xF9,0x06,0x79,0x48,0x99,0x4A,0x74,0x1C,0x1E,0x45, + + 0x22,0x8B,0xFE,0xA4,0xF6,0x5B,0x8F,0xE0,0x8B,0x68,0xD7,0x72,0x6D,0x50,0x41,0x38, + + 0xA4,0xE0,0x10,0x5E,0xEA,0xEA,0xD6,0x20,0xE6,0x16,0x1A,0x36,0x42,0xFE,0x5B,0xB0, + + 0xF7,0x80,0xB8,0x53,0x7F,0xA9,0x49,0x5E,0x65,0xC0,0x4F,0x20,0xE5,0x12,0x11,0x77, + + 0x05,0xBB,0x58,0xB3,0xA4,0x55,0x01,0x9B,0xEB,0x8A,0xDE,0x83,0xD7,0xFC,0x1C,0xAA, + + 0x45,0x79,0xC1,0x2A,0xF7,0xCC,0xFF,0x1B,0x34,0x8A,0x69,0x2E,0x2F,0xE8,0x8E,0x7C, + + 0xFE,0x99,0xD5,0x6C,0x33,0x36,0x42,0xCA,0x39,0x68,0x4E,0xF9,0x79,0x62,0x7B,0xB3, + + 0xA8,0x91,0x9B,0xE4,0xFC,0x8A,0x27,0x21,0xAF,0x35,0xEC,0x23,0xDA,0xCA,0x93,0xE0, + + 0xE5,0x86,0x3B,0xEF,0x79,0x5A,0xAE,0xBF,0xE5,0xDF,0x76,0x03,0x36,0xAF,0xEA,0x28, + + 0x4E,0x83,0x5A,0xAE,0x1A,0xF9,0x6A,0x6E,0xE7,0xE0,0x90,0x7A,0x7C,0x9C,0xFA,0x28, + + 0xA8,0x9D,0xF8,0xA1,0xE0,0x20,0x62,0x7E,0xE6,0x34,0xFE,0x98,0xDA,0x6D,0x5B,0x0C, + + 0x4C,0xCE,0xBF,0xA7,0x42,0x63,0x4D,0x17,0xAF,0xEE,0xFB,0x87,0xF2,0x65,0x55,0x36, + + 0x28,0xCE,0xB9,0xA0,0x68,0x1A,0x22,0xE6,0x6A,0xC4,0x3B,0xAF,0xA7,0xEB,0xDB,0x45, + + 0x99,0x66,0x1C,0xBB,0x93,0xA2,0x98,0x4A,0xBE,0x9D,0xAA,0xD2,0xE6,0xB1,0x75,0xD4, + + 0x80,0x6E,0x3C,0xF4,0x8E,0xCE,0x26,0xB0,0x8E,0xDE,0x8D,0x54,0x51,0xF7,0x9C,0x1D, + + 0xA5,0xC2,0x1D,0x37,0xB4,0xFD,0x53,0x6E,0x0D,0x88,0xCD,0xD5,0x76,0xEE,0x13,0x5A, + + 0x2A,0x65,0x92,0x18,0xD6,0xB7,0x7C,0xD5,0x84,0xD7,0x9D,0x53,0x54,0x0C,0xC9,0x8C, + + 0xD3,0xC8,0x24,0xC7,0x98,0xAF,0xB4,0x33,0x68,0xCF,0x1C,0xF6,0x70,0x0C,0x35,0x46, + + 0x82,0x6A,0x53,0x30,0x5C,0xCD,0xF5,0x47,0xC3,0x97,0xA5,0xD3,0xD2,0xFE,0x5F,0x28, + + 0x15,0xD7,0xE4,0xB9,0x11,0xA6,0xF1,0x9C,0x41,0x94,0x9B,0x63,0xCC,0xD1,0x53,0xA2, + + 0x7B,0x98,0xED,0xD5,0xE3,0x1A,0x47,0x56,0xD4,0xF3,0xFC,0x75,0x3E,0x60,0x6E,0xF3, + + 0x64,0x29,0xDF,0xF6,0xAE,0xF9,0x50,0x48,0x48,0x95,0x88,0xD6,0xF1,0x0E,0x32,0x88, + + 0x0F,0xDA,0x8E,0x74,0x5E,0xBD,0x2F,0x4A,0x6C,0x08,0x86,0x8E,0x2B,0x56,0x3B,0x18, + + 0xE4,0x0B,0x4B,0x14,0x4D,0x33,0xC8,0x95,0xDC,0x7A,0x27,0xDC,0x90,0x5B,0xEF,0xE8, + + 0x8F,0x14,0xCE,0xBB,0x30,0xA0,0x41,0xBD,0x0C,0x58,0x1F,0xCD,0x9F,0xA7,0x54,0xEE, + + 0xAC,0x80,0x7D,0xBF,0x43,0xB7,0xFC,0x15,0x5D,0x2E,0xCE,0x11,0x78,0xA4,0xFE,0x98, + + 0x8E,0x91,0xCE,0xDB,0x54,0xC5,0xAA,0x2A,0xEE,0x25,0x5E,0x3C,0xF3,0xF3,0xDE,0xA9, + + 0xED,0x6E,0xE1,0x3E,0xA3,0xDE,0xCF,0x15,0x2F,0xBD,0x90,0x2D,0x7D,0xF0,0x17,0x99, + + 0x23,0x93,0xEB,0xAC,0xCA,0x3D,0x75,0x5B,0x50,0x6A,0x87,0x3D,0x5E,0xBC,0x59,0xD3, + + 0xA5,0xAB,0x04,0xF9,0xE7,0x61,0xEB,0x28,0xE5,0xBF,0x50,0x21,0x84,0x21,0x51,0xD1, + + 0xA4,0x0A,0xF6,0x3D,0xFA,0x70,0x7E,0x19,0x42,0xB1,0xE6,0x32,0xB0,0xE2,0x14,0x01, + + 0x6B,0x53,0x40,0x07,0x69,0xAF,0xFD,0xB2,0xF4,0x9F,0xCB,0x19,0xB8,0x83,0x0C,0xF9, + + 0xDC,0x4E,0xF7,0x28,0x7A,0xF2,0xA6,0xBE,0x74,0xCA,0x2C,0xC6,0x5D,0x22,0xC0,0x51, + + 0x5E,0xAB,0xEA,0xB8,0xAE,0x66,0xE8,0x3D,0xE5,0x05,0xB2,0x04,0xBB,0x55,0x70,0xAB, + + 0x05,0x4F,0x5E,0x27,0x7F,0x49,0x21,0x16,0xBC,0xCE,0xF8,0x3C,0xDE,0x98,0xE5,0x23, + + 0x71,0x63,0x4E,0xD4,0x73,0x89,0x0B,0x33,0xAA,0xA7,0xB3,0x6C,0xD3,0x26,0xC9,0x96, + + 0x7E,0x81,0xAF,0x9C,0x92,0x67,0x93,0x40,0xAF,0x58,0xBB,0x57,0x26,0xE1,0x7C,0x21, + + 0x18,0x45,0xFC,0x35,0xF3,0xB9,0x32,0xC2,0xBD,0xC1,0xEC,0x2B,0xED,0x67,0xB2,0xF6, + + 0x19,0x44,0x6F,0xDC,0x67,0x6B,0x4A,0x99,0x1D,0x52,0xC4,0xDE,0x5D,0x6F,0x7D,0x25, + + 0xBB,0xD1,0x32,0x20,0x2D,0x44,0x33,0xA3,0xC9,0x68,0x27,0x42,0x7B,0xD7,0xF6,0xDE, + + 0x43,0xE2,0x03,0x42,0x2C,0x69,0x72,0x5F,0x89,0xE0,0x2E,0xAA,0xDF,0xCB,0x42,0x36, + + 0x2E,0x87,0xE6,0xD0,0x79,0x56,0xED,0x8E,0x6E,0x41,0xD2,0xAC,0x0A,0xC1,0x70,0xE8, + + 0x92,0xA2,0xEB,0x3E,0xF0,0x3C,0xE5,0x8B,0xE8,0xC8,0xCF,0xEE,0x57,0x65,0xCF,0x64, + + 0x61,0x4A,0xD5,0x78,0x9C,0x0F,0x2C,0xED,0x81,0x4B,0x42,0xFF,0x5B,0xC3,0xEF,0x7D, + + 0xE8,0x45,0xB1,0xBD,0x9F,0x0B,0xCB,0x0A,0xBF,0xCE,0x5B,0x7F,0xF5,0x01,0x14,0xBC, + + 0x07,0x16,0xBE,0x7E,0xCB,0x9D,0xB3,0x8D,0x53,0xBE,0x02,0x20,0x31,0xF9,0x8B,0x6F, + + 0x56,0x11,0xB2,0xA8,0x47,0x9E,0x43,0xA9,0x67,0xD2,0x94,0x44,0xED,0xD0,0xA8,0xFC, + + 0x01,0x98,0x12,0xB8,0x5B,0xC3,0xAD,0x5E,0xDF,0x72,0x22,0x8D,0xF6,0x58,0x3E,0xE5, + + 0x59,0xFA,0x1E,0xEE,0xDB,0x82,0xAB,0xFE,0x1C,0x2F,0x0B,0x5F,0x54,0x8C,0x7A,0xF5, + + 0x49,0x1B,0xA6,0xC4,0x31,0x74,0x06,0xAB,0x89,0x30,0x68,0xED,0x9B,0x05,0x32,0xD6, + + 0xC2,0x96,0x0C,0x9C,0xD0,0x5B,0x0E,0xBB,0x88,0x31,0x1B,0xF6,0x3F,0xD8,0xC7,0xF3, + + 0xC2,0x31,0xD9,0xAF,0x4E,0x27,0xC5,0x12,0x66,0xDB,0x39,0x77,0x92,0x7E,0xE4,0xF5, + + 0x4A,0xF6,0xF3,0xF9,0x71,0x38,0xCD,0xCB,0x40,0xF8,0x48,0x32,0x31,0x71,0xC6,0x89, + + 0x86,0xC5,0xF8,0xB5,0xC9,0x9B,0xBA,0xC7,0xA2,0x29,0xCC,0x32,0x10,0x69,0x75,0x70, + + 0x69,0x5B,0xAE,0x26,0xC5,0xC8,0x9A,0x45,0x9E,0x18,0x37,0x4F,0xF5,0x38,0xD3,0x1A, + + 0x09,0xA5,0x94,0x7E,0xC8,0x6A,0xFB,0x3B,0xE4,0x52,0xE9,0xAB,0x19,0xF9,0x0D,0xCC, + + 0x7D,0xFA,0x3C,0xA1,0x41,0x8A,0x25,0x57,0x5C,0x37,0xA1,0x88,0x91,0x76,0x18,0x2A, + + 0x6E,0x99,0xF8,0xE5,0xF8,0x3C,0x2E,0xDA,0x12,0xA3,0xDE,0x78,0x19,0xAD,0x74,0x68, + + 0xB6,0x5C,0xB6,0xA2,0xF9,0x3D,0xCE,0x7C,0x6A,0x91,0xFF,0x9E,0x39,0x72,0x55,0xC4, + + 0x41,0x5A,0x8F,0xC5,0x47,0xB8,0x69,0x0B,0x98,0x81,0xC1,0xC5,0xFC,0x5F,0x77,0x27, + + 0x07,0x12,0xC7,0xD9,0x3C,0x4D,0xB3,0x11,0x2B,0x12,0x85,0x30,0x93,0x9E,0x1E,0x76, + + 0x65,0x84,0xA6,0x1B,0xB5,0x0F,0x48,0x2A,0xA4,0xC6,0x37,0x44,0x70,0x7C,0x49,0xD2, + + 0x07,0xED,0xB9,0x27,0x21,0x0E,0xB8,0x74,0x6F,0xDA,0x15,0x59,0x3E,0xEE,0x58,0x6D, + + 0xE5,0x86,0x37,0x20,0x35,0x0D,0x9C,0x53,0x67,0xC6,0x8E,0x7D,0x49,0x1F,0x17,0x66, + + 0x4F,0xD2,0x38,0x64,0xF9,0x00,0xD7,0x55,0x85,0x68,0x39,0xB5,0x69,0xD8,0xF5,0xB1, + + 0x82,0x09,0x21,0xB6,0x7F,0x05,0xF0,0x9D,0x40,0x8E,0xCE,0x4A,0x88,0x49,0xF8,0x21, + + 0x6B,0x2E,0x28,0x72,0x75,0xA8,0x26,0x90,0x43,0x68,0xD7,0x09,0x8E,0x79,0x33,0x08, + + 0x6D,0xE2,0xF0,0xAD,0x33,0x99,0x6E,0x1C,0x4B,0x87,0xE4,0xF9,0xD7,0x76,0x11,0x57, + + 0x05,0x01,0x97,0x6F,0x6F,0xB6,0x68,0xF7,0x8F,0x37,0x42,0x2D,0x2B,0xB6,0x1C,0x7E, + + 0xC6,0xB9,0xB7,0xFD,0x24,0xF5,0x4A,0x22,0xAC,0x37,0x32,0x3F,0x00,0x15,0x92,0xFA, + + 0x45,0xC5,0xAA,0x24,0x71,0x1C,0xC5,0xD7,0xB2,0x44,0x0F,0x87,0x59,0x49,0x6B,0x07, + + 0xBF,0x34,0xA1,0xE4,0x63,0x71,0xA3,0xC3,0x03,0x87,0xED,0xCD,0xD8,0xEC,0x7F,0xE6, + + 0x72,0xCA,0xBA,0x9B,0x95,0xCC,0x44,0xBF,0xAF,0x2E,0x3C,0x04,0xED,0x1E,0x90,0x4E, + + 0x46,0x7C,0x55,0x7B,0x18,0xB4,0xC9,0x88,0xE2,0x31,0x41,0x47,0xDE,0x6C,0x14,0x5C, + + 0xEE,0x0E,0x7B,0x19,0xF6,0xFC,0xCE,0x18,0xB4,0x30,0x3A,0xBA,0xC7,0x19,0x39,0xF8, + + 0xE6,0x9F,0xE3,0x51,0xA6,0x5A,0x0B,0x4F,0x6F,0x51,0xC4,0x43,0x2E,0xDF,0x46,0xA8, + + 0x03,0xCE,0x89,0x1F,0x76,0x9E,0xEB,0x88,0x4B,0x42,0x6E,0x0C,0xAF,0xEE,0x83,0xAA, + + 0x17,0x9D,0x97,0xBE,0x07,0xD0,0x52,0x8F,0x67,0x00,0xA6,0x96,0x9F,0xB4,0xD3,0x55, + + 0xEF,0x80,0x3B,0x88,0x41,0x05,0xB4,0x48,0x64,0xB1,0x18,0x92,0x9C,0x10,0x9D,0x7D, + + 0xB4,0xDF,0x65,0x97,0xA3,0x46,0xF5,0xE7,0x39,0x90,0x8F,0x17,0x6D,0x5D,0x96,0x00, + + 0xC9,0x99,0xBA,0x8D,0xC5,0x66,0xE2,0x4D,0xC1,0x83,0xAB,0xD5,0x95,0x33,0x3D,0xD7, + + 0x02,0x1F,0xD9,0x16,0x95,0x0B,0x93,0x6A,0xC3,0x02,0x34,0xC7,0xE6,0x7F,0x56,0x62, + + 0xB2,0x3A,0x54,0xE6,0x96,0x2A,0x87,0xD5,0xC6,0x94,0xC2,0xCE,0x57,0x98,0xA8,0xFE, + + 0x4D,0xD2,0xFD,0x52,0x85,0x6E,0xE5,0x10,0x6A,0xDB,0x0A,0x05,0x76,0xB5,0xC9,0xF7, + + 0xC4,0xF9,0xD2,0x90,0x65,0xBF,0x2D,0x6B,0xF3,0xCC,0xEA,0x85,0x48,0x42,0x23,0xCD, + + 0xD1,0x3E,0xB3,0xB1,0x08,0xC4,0x16,0xD0,0x5B,0x68,0xC8,0xA8,0x9D,0x7B,0x26,0x9F, + + 0x52,0x46,0x07,0xEC,0x86,0xA6,0xBD,0x3E,0x68,0x25,0x80,0x8B,0x16,0xF6,0xB6,0xF5, + + 0x66,0xAB,0x18,0xC0,0x29,0x67,0x8E,0x6C,0x72,0xD2,0x9A,0x5C,0x70,0xBB,0xBF,0x73, + + 0xCE,0xD6,0x18,0xA2,0x49,0x6A,0xFF,0xFF,0x1E,0xD3,0x3F,0x3D,0x3F,0xED,0x73,0x39, + + 0xAA,0x11,0xE5,0xB1,0xFC,0x2E,0x57,0x9C,0xE1,0x5A,0xE7,0xD1,0x12,0xBE,0xFE,0x25, + + 0x1C,0xAA,0xEC,0x22,0x3F,0x46,0x36,0x17,0x33,0x66,0x7B,0xC5,0x4F,0x08,0x35,0x9D, + + 0x45,0xFA,0x5C,0x5D,0xBE,0xB4,0x72,0xAB,0xEA,0xFA,0xA4,0x28,0xFF,0xAE,0xD7,0x87, + + 0x08,0x8F,0xAC,0x18,0x56,0xEE,0xEC,0x03,0x53,0x24,0x69,0x7B,0x8D,0x91,0x48,0x1D, + + 0xE9,0x91,0x67,0x62,0xCE,0xFD,0x70,0x6B,0x69,0x4D,0x1F,0x9C,0xB1,0xCF,0x1B,0x12, + + 0x81,0x11,0x8E,0x6A,0xB6,0x31,0x20,0x50,0x47,0x03,0xFE,0x55,0x50,0x21,0x11,0x76, + + 0xC8,0x6A,0x41,0x9D,0x21,0x2A,0x6E,0xA3,0x40,0x25,0x07,0x56,0xBC,0x0E,0x85,0x29, + + 0x91,0x07,0x36,0xF3,0x2C,0x2A,0x5E,0xB3,0x41,0xE3,0xB5,0xA3,0xBA,0x6C,0x12,0x6E, + + 0xE9,0x60,0xC0,0xBB,0xE7,0xA7,0x38,0x67,0xE1,0x21,0x3A,0x94,0x5A,0x2B,0xF5,0x61, + + 0x6F,0xAA,0x69,0x32,0xCD,0x37,0x5E,0x5C,0xAA,0x14,0x9E,0x9C,0x94,0x28,0x1B,0x40, + + 0x21,0x8D,0x45,0xBB,0x1D,0x3D,0xEE,0x83,0x8A,0x57,0x88,0xBE,0x77,0x6D,0xE9,0x23, + + 0xE1,0x1B,0x71,0xCB,0x90,0x3F,0x01,0x75,0x8B,0x76,0xC1,0xF5,0x32,0x28,0x86,0xCD, + + 0x78,0xF3,0xCD,0xFD,0x60,0x28,0xBE,0x8D,0x9D,0x2B,0x12,0x5F,0x34,0xED,0x19,0xFA, + + 0x41,0xE8,0x17,0x98,0x43,0x31,0x97,0xDF,0xBC,0x7B,0x9D,0xFB,0x93,0x10,0xC3,0x2D, + + 0xEA,0xA7,0xA5,0x60,0xEC,0x87,0xB8,0xE3,0x73,0x71,0x81,0xAD,0xDE,0x62,0x17,0x10, + + 0x68,0xA4,0x83,0x09,0xF2,0x9A,0xE7,0xBB,0x49,0x0C,0xC1,0x3F,0x6A,0xB6,0x3C,0x4F, + + 0xAB,0x85,0xFC,0x79,0x72,0x21,0x72,0xEF,0x02,0xAD,0xB2,0x23,0x27,0x61,0x54,0x4B, + + 0x67,0x02,0xF0,0xEC,0x82,0x6F,0x7A,0xA1,0xEA,0xC7,0xB7,0x9A,0xF7,0xC0,0xC7,0xA9, + + 0xB5,0xA3,0xD1,0x59,0x71,0x6A,0x67,0x7A,0xEE,0x48,0xF9,0xBD,0x86,0x75,0x79,0x4A, + + 0x28,0x3E,0x43,0x2F,0xA8,0xCF,0x23,0x2B,0x88,0xBF,0xCA,0x9F,0xFF,0xC0,0xE8,0xB1, + + 0x4C,0x52,0xC3,0x94,0x03,0x97,0xAB,0x46,0x53,0xC6,0x9C,0xBD,0xFF,0xF6,0x74,0x81, + + 0x4D,0xBC,0x05,0x10,0x6B,0xB1,0x3C,0x03,0xC0,0x58,0xFE,0xB6,0x70,0xA1,0x95,0x60, + + 0xC3,0x32,0x45,0x1C,0x91,0x29,0xD5,0x3D,0xDA,0x54,0x94,0xDB,0x91,0x76,0x9B,0x23, + + 0xFD,0x3D,0xD4,0xD8,0xB7,0x81,0xDD,0x35,0xBB,0x55,0xC7,0x36,0x99,0x92,0xD3,0x33, + + 0xA6,0x9F,0xAD,0x2F,0xCD,0xBF,0x34,0xAF,0x1F,0x59,0x8E,0xEB,0x0E,0x6B,0x88,0x97, + + 0xF9,0xEA,0x6C,0xA6,0x51,0x09,0x05,0x3B,0xC6,0x39,0xCB,0x1E,0x92,0x3A,0x61,0x7D, + + 0xA4,0x1E,0x0D,0xF4,0xDE,0x99,0x7F,0x31,0xBE,0xA9,0x6E,0x03,0x91,0x02,0xF6,0x4B, + + 0x7A,0xEA,0x0D,0xE0,0x6D,0x3F,0xBA,0x31,0xBB,0x4C,0x62,0xC4,0x52,0xD6,0x96,0xC7, + + 0xD5,0x64,0x9E,0xE3,0xC7,0xE3,0x36,0xB9,0xE5,0x3B,0xE8,0xAA,0x99,0xFB,0x70,0xF5, + + 0xAB,0x1D,0xC9,0x94,0x0A,0x8F,0x63,0x51,0xB7,0x36,0x9A,0x5E,0x90,0x50,0x67,0x8B, + + 0xEB,0x17,0x87,0x65,0x6A,0x78,0xBC,0x0C,0x3D,0x44,0x26,0x5E,0x74,0xF1,0xC3,0xFB, + + 0x42,0x01,0x4F,0x04,0x98,0xC7,0xA4,0x30,0x46,0x5D,0xDD,0x42,0x10,0x9A,0x69,0x32, + + 0xA5,0xA1,0x40,0xBE,0xB8,0x40,0xFA,0x8E,0x95,0x47,0xEE,0x13,0x83,0xDD,0x6E,0x4A, + + 0xAB,0x15,0xC8,0xE9,0xB2,0xF0,0x64,0x10,0xB8,0x12,0x05,0xEC,0x18,0x07,0x25,0xC9, + + 0x5B,0x97,0x9F,0x2F,0x3A,0xBE,0x3A,0x8F,0x96,0x11,0xEF,0xDC,0x5B,0xC1,0x5A,0x5D, + + 0xAA,0x15,0xF1,0x05,0x98,0xBE,0x06,0x38,0x4E,0xD6,0xC8,0x79,0xDF,0xB6,0xB6,0xF2, + + 0xC5,0x21,0xA0,0xF7,0x60,0x5F,0x08,0x42,0x42,0x82,0xAA,0x24,0xC6,0xEA,0x10,0x72, + + 0x53,0x0A,0xBF,0x16,0xDD,0xBB,0x94,0x97,0x90,0xA2,0x58,0x07,0x39,0x4E,0xB7,0x87, + + 0xAC,0x96,0x87,0x3B,0xA9,0x09,0x76,0xA1,0x44,0x62,0x31,0x64,0x52,0x69,0xBA,0x22, + + 0xE9,0xC1,0x3A,0x64,0x86,0xE1,0x92,0xF9,0x7E,0xF8,0x19,0x45,0xB7,0xB6,0x1E,0x6E, + + 0xE7,0x2B,0x4B,0x01,0x18,0x78,0x0E,0x4A,0x66,0xC7,0x54,0x04,0xAD,0xA6,0x0E,0x23, + + 0x04,0x4C,0xB2,0x13,0x7F,0x44,0x8F,0x14,0x66,0x85,0x9A,0x72,0x73,0xE3,0x70,0x30, + + 0xB6,0xEA,0x25,0x8D,0x2D,0x59,0xF1,0x00,0x10,0xDD,0xBF,0x45,0x2B,0x8A,0xA9,0x13, + + 0x84,0x0C,0x97,0x51,0x76,0x24,0x45,0xED,0x2E,0x5D,0x53,0xB1,0x76,0x65,0x36,0x00, + + 0xAD,0x83,0xE5,0x46,0x1D,0x68,0x44,0xCD,0xB9,0xFA,0xCC,0x29,0x3F,0xC8,0xBC,0xF0, + + 0xA8,0x03,0x39,0xE1,0xD5,0x78,0xC5,0x32,0xE8,0xD2,0xAE,0xCF,0xFE,0xA9,0x61,0xFB, + + 0xE5,0x2B,0xFD,0x36,0x9C,0x01,0xCF,0xC3,0x2E,0x87,0xCB,0x5C,0xB0,0xE3,0x53,0xFB, + + 0x99,0x00,0xE2,0xF7,0x7F,0xE9,0xD8,0x64,0x6A,0xDB,0x89,0x0F,0x89,0xA9,0x03,0x77, + + 0xE5,0xC8,0xCF,0xCA,0x72,0x5A,0x2A,0x66,0x7D,0x46,0x8A,0x9E,0xC2,0x5D,0xCE,0x38, + + 0xFC,0xE8,0x87,0xB6,0x53,0x71,0x90,0x1C,0x6E,0x4D,0x5F,0x43,0xEC,0xA0,0x39,0x59, + + 0xF8,0x21,0xAB,0xC2,0x98,0xE6,0xCB,0x8B,0x86,0xD5,0x8A,0x09,0x29,0x65,0x53,0xA0, + + 0xEC,0x83,0x47,0xDA,0x4A,0xCD,0x41,0x93,0x54,0x80,0x57,0xE1,0xDC,0x2F,0x44,0x80, + + 0x84,0x9D,0x19,0xD9,0x43,0xB0,0x14,0x10,0xC5,0xD9,0x18,0x39,0x77,0x91,0x30,0x70, + + 0x84,0xFF,0xAD,0x7E,0xEB,0xF3,0x1C,0xA3,0xE8,0xB2,0x2A,0x84,0x15,0xB3,0x6F,0x9E, + + 0x26,0xAE,0xFC,0x19,0xB2,0x00,0xF5,0x27,0xBE,0xD4,0xEB,0x45,0xF0,0x5F,0x4F,0x87, + + 0xA4,0xF3,0xEA,0xF7,0x86,0xC8,0x96,0x16,0x30,0xCD,0x7D,0xF7,0xAD,0x9D,0x3E,0x42, + + 0x5A,0x3B,0x84,0x89,0x15,0xB9,0x70,0x82,0x5D,0x59,0xCC,0x1C,0x70,0xB5,0x12,0xD5, + + 0xA6,0xF1,0x29,0x3E,0xBA,0xF8,0xC4,0x0D,0x8E,0x34,0xF4,0xE6,0x48,0xD5,0xC5,0x33, + + 0x18,0x45,0x49,0x54,0x86,0xBC,0x0B,0xD6,0xD5,0x11,0x69,0x85,0x79,0x60,0x45,0xD5, + + 0x2A,0xF2,0x12,0xB5,0xCB,0xB8,0xD1,0x6C,0xE4,0x4E,0xDD,0xF3,0xC8,0xF7,0x7C,0x9E, + + 0x8F,0x83,0x66,0x12,0x06,0xF9,0x4B,0x43,0xB6,0xB7,0xD4,0xA6,0x89,0x71,0x77,0xD6, + + 0xCC,0xD6,0x90,0xFF,0x82,0xE2,0xB7,0xDC,0x9A,0xC9,0x3D,0x4E,0xF3,0x58,0x55,0x0F, + + 0xFA,0xA9,0x7C,0xA1,0xC3,0xFC,0x8C,0x22,0x43,0xC1,0x97,0x3D,0x7C,0xF2,0x2E,0xE8, + + 0xBE,0xD4,0xAF,0xED,0x46,0xF9,0x87,0x44,0x62,0xC0,0x29,0x4C,0x79,0x76,0x5E,0x51, + + 0xD1,0x3C,0xDC,0x26,0xED,0xF3,0x2C,0x3E,0x06,0x3D,0x4D,0x3E,0x76,0x85,0x28,0xDD, + + 0x65,0xD9,0xB7,0x1F,0x9A,0x34,0x40,0x22,0x4E,0x47,0x62,0x84,0xDC,0x0D,0xC7,0x18, + + 0x2A,0xDE,0xE6,0xA9,0x9F,0x2E,0x0E,0x8D,0xCF,0xD7,0xEF,0xFE,0xF8,0xBF,0x57,0x41, + + 0x2C,0xDB,0xEB,0xBF,0xF7,0xA4,0xBF,0xBF,0x74,0x5E,0xF8,0x21,0x60,0xBE,0xA8,0x25, + + 0x85,0xC1,0x96,0x66,0xAF,0x8D,0x18,0x24,0xC7,0x31,0x50,0x18,0xD9,0x22,0x51,0xA2, + + 0xA4,0xAE,0xF7,0x10,0x4C,0xB2,0xA0,0xDE,0x51,0x0C,0x58,0x08,0xD8,0x65,0xA9,0x30, + + 0x05,0x73,0x98,0xA0,0x27,0xAF,0xF9,0x04,0xF3,0x9F,0xC9,0x6A,0xAF,0x22,0x9F,0x19, + + 0x24,0xAC,0xAF,0xF0,0xA1,0x25,0xB5,0xA3,0x89,0x1E,0xC4,0xB7,0x51,0x9A,0x1A,0x48, + + 0xA1,0x46,0x78,0x64,0xFF,0x44,0x45,0xE2,0xDF,0xCD,0xB6,0xC5,0xB9,0xC7,0x56,0x78, + + 0x22,0x35,0xA3,0x32,0xEC,0x4B,0xA5,0x0A,0xCC,0x13,0xA6,0xC4,0xBA,0x06,0x1D,0xDA, + + 0x6B,0x6D,0x79,0x55,0x35,0x3D,0x69,0x8F,0x4F,0xD0,0xEF,0xD5,0x18,0x65,0x29,0x53, + + 0xF3,0xAA,0xAB,0x51,0x92,0x57,0x51,0x60,0x62,0x38,0xCB,0x3F,0x2C,0xEA,0x13,0x4F, + + 0xCA,0x4B,0xA2,0x4C,0xB9,0x87,0x70,0x28,0x49,0x22,0xAA,0xCC,0x04,0x73,0x68,0x1A, + + 0x0A,0xC9,0xE8,0x09,0x18,0x79,0x0B,0x09,0xBD,0xA8,0x9F,0xBE,0xD9,0xF8,0x3D,0x3C, + + 0xE9,0x0E,0x96,0x7E,0xA0,0x44,0x03,0x00,0x8B,0x49,0xDF,0x4B,0x3A,0x2A,0x55,0x2C, + + 0x89,0xA0,0xEB,0x1F,0xDC,0x26,0xAC,0x11,0xBA,0x4B,0xC1,0x2A,0x7A,0xE4,0x9E,0xAA, + + 0xE9,0x69,0x7D,0x1C,0x9A,0x63,0x69,0xE7,0xF5,0x4A,0x84,0xC8,0xAD,0x00,0x13,0x1F, + + 0xAE,0xB2,0x9E,0x1A,0x63,0x6C,0xE7,0xBF,0x99,0x47,0xBC,0x40,0x5A,0x2F,0x3B,0x6D, + + 0x6B,0x31,0xFE,0x2D,0x9E,0x60,0xFE,0x18,0x6B,0xD1,0x6C,0xFE,0xA6,0xB3,0x12,0x96, + + 0x2E,0xBE,0xE0,0x22,0x4A,0x92,0x5C,0x89,0xC3,0x53,0xE5,0xCC,0xBB,0x73,0xC4,0x60, + + 0x9D,0xEB,0x44,0x74,0x97,0xCB,0xC3,0xD5,0xED,0x4B,0xAC,0xF4,0x74,0x7F,0xE0,0x78, + + 0xDC,0x5C,0xB2,0xBD,0xD3,0xA1,0x54,0x91,0x1A,0xD1,0x0B,0x56,0xF3,0x75,0x85,0x05, + + 0xD4,0x3E,0x05,0x01,0xC4,0x1E,0xEB,0x25,0x9E,0x00,0xAD,0x57,0x72,0x76,0x6F,0x90, + + 0xB3,0x5E,0x8D,0xD5,0xB5,0x1B,0xDD,0x0C,0xD8,0x3F,0xC4,0xD7,0x0E,0x77,0x9F,0xD9, + + 0xA2,0x8D,0x43,0x35,0x91,0x35,0x57,0xA0,0x72,0xD9,0x82,0xD4,0x8D,0xDB,0x16,0xBC, + + 0x5B,0xBA,0xB2,0xE9,0x8A,0xBF,0xE7,0xF2,0x7F,0x4E,0x23,0x07,0x55,0x19,0x9E,0xDD, + + 0x43,0xA9,0xF7,0xD6,0x11,0xE7,0x0C,0x3B,0x45,0x46,0x01,0x96,0x90,0xF5,0xED,0xA3, + + 0xC1,0x6B,0x4A,0x24,0x10,0x36,0x32,0x97,0x1C,0x39,0xE3,0x50,0x39,0x86,0x64,0x88, + + 0x2B,0x58,0x04,0x0E,0x00,0xD2,0x4F,0x4B,0x6E,0xAB,0xD0,0xEA,0x72,0x7E,0xB6,0x76, + + 0x39,0x54,0x11,0xBD,0x16,0x18,0xA7,0x2A,0x61,0x51,0x65,0x5E,0xD8,0xF3,0x03,0xE6, + + 0x9B,0xD5,0x91,0xEF,0x97,0x1B,0xD6,0x69,0xAA,0x36,0xB7,0x91,0x59,0xF0,0xF2,0x5E, + + 0x63,0x0A,0x53,0xBC,0xD6,0x1A,0x9C,0x7F,0xC5,0x15,0xE0,0x5F,0x58,0xF4,0x38,0xCF, + + 0x8B,0x83,0xF4,0xDF,0x99,0x3F,0x34,0xF0,0x6B,0x9C,0xE8,0x48,0xB0,0xAD,0x2D,0x37, + + 0xDA,0x73,0xC1,0xBE,0x35,0x5F,0x49,0xDC,0x96,0x56,0x0E,0xEF,0x07,0x1E,0x5F,0x19, + + 0x27,0xE3,0xB9,0x6C,0x38,0x3A,0x6D,0x61,0x4D,0x12,0x9F,0xF9,0x32,0xAF,0xA8,0x99, + + 0xA7,0x82,0x0B,0x0D,0xB3,0x86,0x5D,0x11,0x30,0x82,0x73,0x8E,0xD5,0xD9,0x31,0xA6, + + 0x02,0x4B,0xBE,0x2F,0x35,0xE0,0x6F,0x27,0x42,0xE0,0x04,0xC4,0x52,0x08,0xE8,0xE3, + + 0x5D,0x2C,0x88,0x42,0xB6,0x0C,0xF9,0xF5,0x76,0x2E,0x2B,0x75,0x2E,0xE1,0xB5,0x87, + + 0x8D,0xE3,0xAD,0x96,0x75,0xA4,0xC5,0xBA,0xC2,0x82,0x41,0x55,0x2B,0xA0,0x72,0x54, + + 0x47,0xE3,0xBC,0x50,0x57,0xA0,0xF9,0x8E,0xD3,0xCB,0xE2,0x57,0xAA,0xC3,0x98,0xC0, + + 0x9B,0x5D,0xF8,0x5A,0x25,0xBC,0x4F,0x28,0x56,0xC0,0x0F,0x14,0x3C,0x67,0x0F,0x12, + + 0x17,0x08,0x50,0xA5,0x79,0xA3,0x03,0x99,0x1F,0x78,0x1F,0x05,0x71,0x33,0x59,0xB8, + + 0x23,0xEA,0x59,0xB4,0xF0,0xB6,0xF1,0x24,0xE8,0xD8,0x0A,0xA0,0x3F,0x85,0x91,0x5B, + + 0x20,0x97,0xC9,0x9A,0x17,0x37,0x63,0x63,0xE4,0xD1,0xF1,0x63,0xB4,0x2D,0x6A,0x9E, + + 0x2E,0x69,0xAA,0x9A,0xF5,0x99,0xB2,0x28,0x2E,0xD3,0x72,0x4F,0x9B,0xEC,0x3A,0x0F, + + 0x55,0x72,0x2D,0xE3,0x11,0xEB,0xBA,0xFA,0x6F,0x02,0x3C,0xBC,0xDD,0x38,0xE7,0x2B, + + 0xB4,0x88,0x4F,0x9D,0x9D,0xA0,0x56,0x5D,0x41,0x4C,0xFF,0xE9,0xD6,0xA4,0xAF,0x9F, + + 0xF9,0xA7,0x38,0x5C,0x61,0x9A,0xBB,0x39,0xBD,0x89,0x83,0x6F,0xD5,0xE4,0x9A,0x0C, + + 0x72,0x7B,0xBB,0x1F,0xBB,0x03,0x12,0x68,0x4D,0xC1,0xE1,0x84,0xBF,0xA3,0x33,0x95, + + 0xA8,0x89,0x3C,0xDC,0x9F,0x37,0x07,0x11,0x3B,0x12,0xAC,0x0D,0x79,0x4B,0x9C,0x5E, + + 0x6F,0x51,0x31,0x47,0x3B,0x01,0x63,0x19,0xCA,0x43,0x5F,0x1C,0xF0,0x48,0xB7,0xE4, + + 0x78,0x0F,0xD3,0xB4,0x5E,0x25,0x63,0x6A,0x40,0x49,0xA9,0x3F,0x8F,0x42,0x1A,0xB7, + + 0x45,0x94,0x7F,0xA7,0xEC,0x91,0x21,0xD0,0x57,0xE6,0xD4,0xA4,0x08,0xFF,0x4D,0xD2, + + 0x69,0x92,0xD2,0xD7,0x71,0x90,0x59,0x46,0x6D,0xBD,0xF0,0xB4,0x6B,0x5A,0x5C,0xED, + + 0xC5,0x96,0xD3,0xA6,0x3F,0x93,0xCF,0xA1,0xA4,0xC9,0x8F,0x58,0xF2,0x73,0xB9,0x1B, + + 0x22,0x52,0x10,0xB6,0x16,0xFD,0x64,0xCD,0x40,0x55,0x61,0xBD,0x75,0x31,0x83,0x2D, + + 0xA4,0xE8,0xFC,0xCB,0xC7,0xF6,0x8C,0x0A,0xBD,0x99,0x63,0x15,0x58,0x59,0x80,0x5C, + + 0x24,0xD7,0x65,0x3E,0xAF,0xB1,0x3D,0x14,0x77,0x98,0x2C,0xB1,0x9E,0x56,0x7B,0xA1, + + 0x11,0xEB,0x26,0x87,0xB0,0x64,0xEE,0x83,0xA8,0x5B,0x25,0x74,0x82,0x59,0x37,0xD2, + + 0x36,0x2A,0xE8,0xAD,0xB1,0x65,0x82,0x34,0x25,0xD7,0x9B,0xCA,0x1C,0x54,0x06,0x1A, + + 0x2A,0x6B,0x25,0xCF,0x78,0xF4,0x32,0xEA,0x24,0xC3,0xE8,0x4B,0xE4,0xFC,0x95,0xEA, + + 0xAD,0x86,0xF5,0x8B,0xB8,0x48,0xD6,0x8B,0x1A,0xAE,0x2D,0xFD,0x7B,0xD2,0xB9,0x4C, + + 0x11,0x6C,0x24,0xCE,0xF8,0x11,0x52,0xDD,0xCD,0x9A,0xF3,0x52,0xF0,0xB8,0x96,0xEB, + + 0x2D,0x8D,0xA3,0x8B,0xC2,0xDB,0xE0,0x3B,0x04,0xE2,0x40,0x3D,0xFE,0x1D,0x4F,0xC2, + + 0xAE,0xDC,0xAC,0x4A,0x68,0xE4,0x7E,0xFF,0x93,0x5A,0xC8,0x5E,0xB4,0x2D,0x95,0x7A, + + 0x5B,0x4C,0xBC,0xD6,0x9A,0x12,0x69,0x12,0xB4,0x00,0x49,0x5B,0x79,0x2F,0xCB,0x6E, + + 0x3D,0x01,0xBE,0xD8,0x1B,0x11,0x70,0x2B,0xEA,0x90,0x89,0x5F,0x0A,0xBD,0x4F,0x7F, + + 0x8F,0x4E,0xB9,0x98,0x56,0x1C,0x87,0xDF,0xDC,0x41,0x34,0xC1,0x99,0x0A,0xD6,0xFA, + + 0xFB,0x42,0x67,0x44,0x1C,0xDB,0x49,0x11,0xE5,0x31,0x92,0x42,0x2C,0x2F,0x30,0x6F, + + 0x80,0x0C,0x3F,0xB5,0x35,0x6D,0xAF,0x95,0x09,0x22,0x74,0xA6,0x30,0x69,0x85,0x04, + + 0x75,0x0E,0x7E,0x21,0x74,0xA1,0xEC,0x53,0xF6,0x1D,0xAB,0xD6,0xF3,0x2F,0xBA,0xA1, + + 0x7D,0xA0,0x59,0x66,0xB2,0x28,0xD9,0xF1,0x4F,0xB7,0xD9,0x53,0xB1,0xF5,0xBB,0x70, + + 0x51,0xAB,0x47,0x37,0x26,0x85,0x11,0xA7,0x44,0xF6,0x98,0xF6,0xF3,0xE3,0x36,0x57, + + 0xA2,0x47,0x82,0x50,0xF8,0xB4,0x1A,0x83,0x1C,0xCE,0x80,0xF6,0x50,0xC3,0xE1,0x33, + + 0xE0,0x5A,0xF9,0xBA,0xFB,0x57,0x4C,0x21,0x82,0x7B,0x2E,0x96,0xD4,0x8E,0x0E,0xE5, + + 0x6A,0xBD,0xF7,0x78,0xD0,0x07,0x92,0x4D,0x28,0x03,0xE7,0x58,0x70,0x61,0xC2,0x94, + + 0x5F,0x06,0x4B,0xE4,0x44,0x65,0xC2,0x5A,0xF3,0x57,0x6A,0xC4,0xD5,0xE3,0xF1,0x9C, + + 0x05,0xDD,0x85,0x3C,0x3F,0x71,0x9E,0x3D,0x7A,0xA9,0x22,0x2C,0xFE,0x6D,0x3B,0xF6, + + 0x0B,0x07,0x9B,0xCD,0xBA,0x6A,0x68,0xD2,0x3F,0x08,0x97,0xCB,0xEB,0x6A,0x9B,0x06, + + 0xB5,0xBF,0x63,0xB9,0x9F,0x33,0xDB,0x29,0x84,0x17,0x99,0x4F,0xEA,0x07,0x82,0xD1, + + 0x69,0x04,0x4D,0xBF,0x26,0x81,0x68,0xD8,0xDF,0x0E,0x9A,0xFE,0xF9,0x6A,0x81,0xDC, + + 0x51,0xCE,0xAF,0xB4,0xDD,0xE0,0x42,0xFC,0x11,0xE6,0xA2,0x58,0x30,0x62,0xC3,0x0A, + + 0x70,0xA3,0xD0,0xAD,0x9E,0x03,0x14,0xCD,0x47,0xE3,0xDB,0x25,0xB9,0x4E,0x8B,0xC0, + + 0x35,0x63,0xB4,0xA0,0x93,0x6D,0x13,0x69,0x72,0xCF,0x5B,0x0E,0xE9,0x2D,0x02,0x68, + + 0xF0,0xDD,0x5F,0x2B,0x4F,0x32,0xD4,0x08,0x5A,0xFD,0xB4,0x75,0xD1,0xFA,0xB4,0xD7, + + 0xFF,0xEE,0xC2,0xDF,0x32,0xC3,0x04,0x38,0xEC,0xF7,0xAE,0x4B,0x42,0x71,0x7B,0x21, + + 0x93,0x60,0x45,0x98,0xFC,0x70,0xC5,0x43,0x09,0xA3,0x12,0x54,0x53,0x22,0x54,0xB5, + + 0x04,0xCC,0xDD,0x35,0xFF,0x71,0x4B,0x71,0xEF,0xA6,0x25,0x72,0x2F,0xDE,0x84,0x59, + + 0x44,0x56,0x04,0x80,0x41,0xC9,0xC4,0xFF,0x56,0x52,0x60,0x86,0x99,0x30,0xE0,0x54, + + 0x79,0x8C,0xDF,0xA7,0x43,0x59,0xED,0xFC,0xE1,0x5F,0xF4,0x87,0xFF,0xF3,0x86,0x49, + + 0x03,0x69,0x4E,0xA5,0xB8,0x96,0x1D,0x76,0x43,0xD1,0xF4,0xE2,0x7D,0xF0,0x45,0xAC, + + 0x4A,0xAD,0xAF,0xD0,0xB2,0x99,0x3F,0x93,0x1C,0x32,0xDD,0x35,0xE1,0xFC,0xAA,0xF7, + + 0xFE,0x9A,0x56,0x74,0x0B,0xB6,0x81,0x2C,0x3D,0x25,0xEE,0xDC,0xF8,0x67,0xF1,0x69, + + 0x03,0xE6,0x10,0x03,0x5A,0x3D,0x78,0x08,0x6A,0x99,0x98,0x41,0x71,0x3B,0x79,0x38, + + 0xC3,0x99,0x3F,0x72,0x37,0x97,0xAC,0x5A,0xCE,0x36,0xCD,0xAF,0x6A,0x72,0x35,0x6A, + + 0xDD,0xB6,0xF6,0xEC,0xDC,0x2D,0x39,0x1D,0x8B,0xFF,0x90,0x3E,0xD9,0xAB,0x86,0x51, + + 0x4C,0x21,0xA6,0x8D,0xD7,0xB7,0x6E,0x95,0x4B,0x8C,0x1B,0xDD,0x48,0x3E,0x55,0x98, + + 0x67,0x5F,0xAE,0x1C,0xF9,0x90,0x14,0x03,0xC8,0x5B,0xA6,0x0D,0xD8,0x3D,0xBA,0x0E, + + 0xAC,0xAC,0xBC,0x2F,0x3A,0xE1,0x37,0xA8,0x64,0x53,0xC3,0xE7,0x99,0x81,0x08,0x76, + + 0x0A,0x9D,0x5E,0x3F,0x39,0x37,0x53,0xFE,0x4A,0xD7,0xE1,0x55,0xFD,0x5E,0x33,0x0D, + + 0x7C,0x0B,0xFF,0xC0,0x18,0xBB,0x8B,0x6C,0xD9,0x3D,0x48,0xA2,0x1F,0xDC,0x6E,0x70, + + 0xEE,0xE2,0xB6,0x09,0xB6,0x24,0x81,0xD0,0xE9,0xBC,0xFC,0x44,0x66,0xE1,0x51,0x3E, + + 0x82,0x91,0x63,0x61,0x6B,0x0F,0x9C,0xA7,0xF6,0xC2,0xF9,0x22,0xF6,0x10,0x70,0x9B, + + 0x20,0x7C,0x8F,0xF5,0xDC,0x0C,0x41,0xC0,0xE3,0x1E,0x41,0xDF,0x13,0x2E,0xA0,0xDB, + + 0x3F,0x8E,0x26,0x74,0xF7,0x0B,0x0E,0x02,0xAF,0x7E,0xE4,0xD1,0xF7,0xFB,0xA3,0x6E, + + 0xEC,0xC1,0xD2,0xB4,0x11,0xFD,0x06,0xAB,0xAE,0x3F,0xD9,0x71,0xDA,0x63,0xE1,0x00, + + 0x7C,0x0D,0xF2,0xC5,0x97,0xBE,0x21,0x14,0xCA,0x4B,0x45,0x05,0x3D,0xA2,0x53,0xE3, + + 0x12,0x28,0x70,0xBA,0x87,0x18,0x29,0x04,0xCB,0x4A,0x99,0x04,0x5B,0x61,0x8E,0x79, + + 0x22,0x7E,0x28,0xF2,0x94,0x53,0x2A,0x2F,0x27,0x8B,0xCD,0xD3,0x54,0xAA,0xAD,0xF2, + + 0xC7,0x44,0xEA,0xE7,0x8F,0x32,0x02,0xC5,0xA4,0x8A,0x9A,0x1F,0x6E,0x19,0x5D,0x36, + + 0xE7,0x89,0x8B,0xE3,0x22,0xD1,0xCC,0xAF,0xFE,0xF9,0x75,0x1D,0x3D,0x15,0x69,0x6A, + + 0xB1,0x80,0x0E,0x9B,0xCC,0x81,0xD7,0xA4,0xCC,0x0B,0x03,0xDF,0x83,0xED,0xC6,0x28, + + 0x08,0x3E,0xB9,0x0C,0xE1,0x77,0x0C,0xB7,0x2D,0xB8,0xF2,0x2E,0x3C,0x51,0x2D,0xAA, + + 0x0E,0xCD,0xB5,0x56,0x6C,0xAD,0x85,0x6B,0x54,0xE8,0xFA,0x3E,0x2F,0xAF,0xB1,0x38, + + 0xD1,0xCC,0x80,0xCB,0x96,0x5D,0xE4,0x81,0x2F,0x81,0x91,0xED,0x2F,0x68,0x47,0xE0, + + 0x66,0x86,0x34,0x5F,0xE8,0xA3,0xC1,0x66,0x67,0x02,0xEF,0xD8,0x7E,0xF0,0xB7,0xC5, + + 0xEE,0x93,0xAC,0x96,0xB3,0x42,0xA3,0x03,0x2C,0x01,0xB6,0xD4,0x47,0xF0,0xEC,0x3A, + + 0x25,0x9C,0x2C,0x94,0x91,0x4A,0xFC,0x1A,0x1D,0xDC,0x04,0x48,0x88,0x9D,0x2D,0x87, + + 0x2C,0x8F,0x85,0x96,0xB2,0x18,0x33,0x9E,0x6C,0x28,0x4D,0x83,0xC7,0xF6,0xD6,0xB4, + + 0x04,0xEC,0xBC,0x7F,0xE9,0xFE,0xC2,0xC0,0x87,0xBD,0x5E,0xF7,0xF1,0xDF,0x1A,0x1B, + + 0x45,0x0E,0x12,0xB4,0x95,0xB2,0x70,0x00,0xE4,0xDE,0x02,0x16,0x89,0xFB,0x3E,0x9C, + + 0x21,0x27,0xE4,0x53,0x96,0x3F,0x42,0xDE,0xEA,0xB7,0x31,0xCB,0x71,0xD4,0xF6,0x30, + + 0x22,0x1B,0xED,0x68,0x15,0xB0,0x13,0x81,0x0D,0xA7,0x41,0x05,0xD2,0x7D,0xBD,0x94, + + 0x4E,0x4D,0x02,0x35,0x16,0x3D,0x65,0x76,0x0E,0xA6,0xDC,0x98,0x54,0x76,0x8F,0xF4, + + 0xB9,0x83,0xFE,0x9E,0x0F,0x6A,0xD1,0xEA,0x28,0x9A,0x9E,0x5E,0xE0,0x09,0xB9,0xDD, + + 0xF3,0x91,0x09,0x7C,0xDD,0x46,0x46,0x90,0x15,0x14,0x39,0xBC,0xC0,0x04,0x33,0xED, + + 0x53,0x37,0x1F,0x70,0x55,0xB1,0x66,0x92,0x05,0x59,0xCE,0xC9,0xDF,0x9A,0xAA,0xBB, + + 0xA7,0x8B,0xF6,0x9E,0x1A,0xA0,0xC0,0xC8,0x8F,0xB5,0xA9,0xDD,0x95,0xF6,0xA6,0x53, + + 0x45,0x96,0x11,0x2C,0xBC,0x94,0x68,0xC6,0x2D,0xFC,0x65,0x6A,0x56,0xE8,0xA5,0xA9, + + 0x70,0xDF,0x96,0xAC,0xC0,0x16,0x34,0xFB,0x90,0x70,0xEA,0x59,0x8E,0xF2,0x65,0xA0, + + 0xEE,0x31,0x43,0xAD,0xFD,0x51,0x09,0xD3,0x07,0x8F,0xAD,0xEE,0x5D,0xBC,0x28,0x6F, + + 0xA9,0x4D,0x49,0xDE,0xE3,0xB9,0xEA,0x2B,0x18,0xDB,0x4B,0x84,0x5C,0xBE,0xA7,0x2D, + + 0x06,0xA8,0x20,0x76,0x72,0x5C,0x72,0x21,0x43,0x0A,0x85,0x46,0xA7,0x05,0x30,0xE3, + + 0x71,0x64,0x2F,0x2C,0x93,0x25,0x0F,0xB4,0x69,0xA6,0x38,0x27,0x6D,0x05,0x26,0x83, + + 0x3C,0x00,0x36,0x03,0x7B,0x53,0x4F,0xC3,0xC4,0xEF,0xA9,0xDA,0x18,0xF3,0x31,0xE2, + + 0xF9,0x88,0x41,0x77,0x50,0xA9,0x21,0xCF,0x6D,0x4E,0x59,0x11,0x61,0xC3,0x1A,0xA2, + + 0x6A,0x15,0xD1,0x83,0xFB,0x35,0xC1,0x93,0x7E,0xEB,0xE8,0xB4,0x0E,0xCF,0x10,0x8C, + + 0x05,0x24,0xD2,0x56,0xA0,0x88,0xF7,0xF4,0x06,0x4C,0xE6,0x96,0x49,0x0A,0x3F,0x69, + + 0xC1,0x09,0xA7,0x69,0x7B,0x17,0x42,0x8E,0x1F,0x3B,0xA9,0x45,0x32,0x09,0x7C,0x33, + + 0x74,0x62,0x5F,0x25,0x13,0x31,0xE6,0xB6,0x01,0x27,0x49,0x85,0x60,0xC6,0xFD,0xFB, + + 0x2A,0xA7,0x05,0xFF,0x28,0x6A,0x04,0x89,0xB7,0xE5,0x83,0x5F,0x68,0xEF,0xDE,0x6A, + + 0xB2,0x82,0xB9,0x35,0x1F,0x0A,0x62,0x3C,0xA0,0xD8,0xA4,0x09,0xD4,0xEF,0x57,0xFA, + + 0xAE,0xA5,0x97,0x63,0x60,0x7B,0x43,0x95,0x3F,0xE1,0x17,0xFA,0x90,0x8B,0xE8,0x30, + + 0x8F,0x2A,0x3B,0x99,0xB1,0x76,0xDB,0x18,0x27,0x46,0x1C,0xFD,0xDD,0x4B,0x7A,0xB7, + + 0x0C,0x4D,0xCA,0x58,0xD2,0xCD,0x5A,0x7D,0xAB,0xE3,0x43,0x9F,0xDE,0xE1,0x28,0x5C, + + 0x08,0xAF,0x0A,0x18,0xC6,0x50,0x1B,0xFC,0x4E,0xB1,0xE2,0x58,0xD9,0x65,0x4B,0xCD, + + 0xAE,0x6E,0xD6,0x5E,0xAA,0x7F,0xC5,0x9A,0xFA,0x67,0x81,0x3A,0x31,0x0A,0x15,0xBB, + + 0x8F,0x72,0x0B,0x4C,0xC7,0x82,0xE6,0xFD,0x83,0xBF,0x0F,0x9F,0x59,0x47,0x62,0x20, + + 0x23,0xD0,0xCA,0x00,0x18,0x6D,0x45,0x8F,0x1C,0xE5,0xDE,0xB9,0x51,0x52,0x29,0xAC, + + 0xF8,0x2C,0x73,0x10,0x19,0x2E,0x0B,0x34,0x1D,0x07,0x85,0x8B,0x1D,0x33,0xA6,0x21, + + 0x7C,0x31,0xBD,0x7B,0x1C,0x3F,0xC1,0x9B,0xC6,0xA7,0xC5,0x3D,0xF4,0x5A,0x22,0xAE, + + 0xD9,0x51,0x4D,0xB1,0xF9,0xB5,0x47,0x8D,0x89,0x22,0xD5,0xB5,0xF7,0x32,0xFB,0x22, + + 0x24,0x55,0x4C,0x01,0x93,0xBE,0x52,0x92,0x89,0xB5,0xB4,0x44,0xCE,0x79,0xB3,0xA3, + + 0x4F,0x57,0xB3,0x36,0x17,0x38,0x4D,0x62,0x9C,0xF8,0x4C,0x07,0xF7,0xF8,0xCE,0x45, + + 0x86,0xBB,0x3E,0x27,0x13,0xBC,0x2B,0xC9,0x6D,0xFB,0xDF,0xF5,0x51,0x7B,0x59,0x0F, + + 0x56,0x18,0x87,0x2E,0x10,0x3A,0xCB,0x81,0x63,0xD1,0x8F,0xDB,0x18,0x13,0x51,0x36, + + 0xA5,0xE5,0x82,0x4C,0x3E,0x7A,0xD6,0x89,0xF8,0xD3,0xB4,0xBD,0x2B,0x50,0xDE,0x58, + + 0x6D,0xCD,0x3A,0xFE,0xC6,0x7B,0x60,0x8D,0x0A,0x93,0x08,0x38,0x51,0xF7,0x61,0x2C, + + 0x5D,0xBC,0x93,0x57,0x19,0xE5,0x13,0x4B,0xCC,0xD7,0x8E,0x5D,0x2E,0xDB,0xDF,0x86, + + 0x87,0x2F,0x1F,0xB4,0xBF,0x7A,0x09,0x8C,0x5A,0x16,0xA5,0x5F,0x9A,0xDC,0xF2,0xB7, + + 0x89,0x5E,0xCC,0xCD,0x99,0x7D,0xF1,0xA8,0x2E,0xF7,0xED,0x0E,0x5E,0xD3,0x8E,0x19, + + 0xF5,0xBD,0xF6,0x8C,0x3F,0x32,0xA1,0xD8,0x1F,0xFC,0xA0,0xFB,0xC6,0x72,0xD7,0xDB, + + 0x56,0xFF,0xFF,0x1D,0x4D,0x31,0xC1,0xF4,0x81,0x4F,0x77,0x9F,0x98,0xD2,0x04,0xDB, + + 0xB3,0x94,0x5F,0xBF,0xCC,0x3F,0x05,0x8D,0x97,0xF0,0x4F,0x9B,0x04,0x6F,0x4A,0x60, + + 0x25,0x33,0x1B,0xE4,0xB8,0x5D,0x4B,0x05,0xE5,0x61,0x59,0x02,0xF5,0x3F,0x70,0xA7, + + 0x66,0x50,0x9F,0x2E,0xE5,0xD0,0x6B,0xC8,0xCA,0x7C,0xA9,0xB2,0x28,0x3B,0xE1,0x27, + + 0xF1,0x8F,0xD9,0x83,0xBC,0x3C,0xE5,0xD8,0x2D,0x81,0x05,0x45,0x2B,0x97,0x3C,0x97, + + 0xAD,0x97,0x69,0xB6,0x31,0xE1,0xDE,0x49,0x13,0xCB,0x29,0x45,0x3E,0x02,0xA0,0x63, + + 0x98,0x5B,0x76,0xA4,0xBA,0x09,0x48,0x91,0x2A,0xA1,0x50,0x04,0x72,0x19,0xF8,0x0E, + + 0x01,0xC4,0xF2,0x4A,0x36,0xE5,0x1E,0x4A,0xAE,0xB4,0x2B,0x85,0xDB,0x68,0xD5,0x21, + + 0x79,0xC4,0xF0,0xA5,0x8A,0xDB,0x49,0x90,0xF6,0xAA,0xE6,0x94,0x52,0x6B,0xED,0xC1, + + 0x83,0x8F,0xE5,0x41,0x5F,0x96,0x63,0x71,0x74,0x6A,0x1D,0x8D,0xF3,0x9C,0x1A,0xEA, + + 0x78,0x34,0xB6,0xD4,0xE9,0xA7,0x35,0x39,0x34,0xDB,0xE8,0x5F,0x34,0x09,0xEA,0xA3, + + 0xFB,0xE5,0xB4,0x2F,0x71,0xB6,0x09,0x9A,0xB1,0x58,0xF0,0x23,0x7C,0x58,0x1E,0x50, + + 0x70,0x1B,0x17,0x70,0x3F,0x21,0x86,0x17,0x34,0xE9,0xCA,0x49,0x37,0xFB,0x94,0x88, + + 0xA7,0x56,0x13,0x6F,0x95,0xA0,0x1B,0x36,0x05,0x5A,0xFD,0x17,0x34,0xFA,0xF1,0xCE, + + 0x2A,0x84,0x78,0x5D,0x2A,0x45,0xE4,0x1A,0xCE,0xDA,0x72,0x96,0xE2,0x57,0x54,0x6F, + + 0x09,0xAC,0x12,0x56,0xF6,0x3C,0xEF,0x69,0x7F,0x5C,0x05,0x0C,0xF8,0xFD,0xA3,0x6F, + + 0x67,0x71,0xBA,0xC1,0x77,0xDF,0x3B,0x7F,0x06,0x2F,0xB3,0x92,0xDE,0xAF,0x50,0x25, + + 0x2C,0xEA,0x13,0x7B,0x3C,0xA9,0x45,0x4E,0xED,0x22,0x44,0x99,0xFB,0xE0,0xB3,0x8B, + + 0x9E,0x60,0xA2,0x14,0x3C,0xB8,0x6C,0xA6,0x4C,0x16,0xA2,0x93,0x72,0xB1,0x74,0x97, + + 0xCC,0x92,0xE4,0x96,0xD4,0x1E,0xBE,0x80,0x05,0x24,0xA5,0xC5,0x45,0x7B,0xD7,0xF0, + + 0x8E,0x1D,0xF1,0xB8,0xD8,0xF0,0x0B,0x96,0x8F,0xDD,0xE4,0xD5,0x57,0xDA,0x57,0xF3, + + 0xC8,0xFD,0xBC,0x13,0x9D,0xAC,0x43,0xB5,0x04,0x50,0xC5,0xD7,0xCE,0x06,0xA9,0xEF, + + 0x20,0xB5,0xCD,0xBC,0xA7,0xA4,0xD4,0x90,0x04,0xA8,0x4C,0xB9,0xD5,0x91,0x36,0xA3, + + 0x4F,0x74,0xB8,0x25,0xB3,0x38,0xCF,0xC7,0x9B,0xC4,0xF8,0x51,0x8A,0xEE,0x44,0xB0, + + 0xCA,0x99,0x75,0x37,0x73,0x17,0x0B,0xE4,0x47,0x69,0x4A,0x05,0xD2,0xB4,0x14,0xA0, + + 0x97,0xD8,0xBF,0x80,0x5C,0xD3,0x26,0xF3,0xE1,0xF7,0x7D,0xD3,0x08,0x2A,0x18,0x2B, + + 0xEE,0x99,0x9E,0x70,0x90,0xB5,0x9F,0x95,0xE8,0x77,0x20,0x2A,0x35,0x4C,0x66,0x42, + + 0xC4,0xFA,0x88,0xB7,0xB1,0xFB,0xA8,0x4B,0xCE,0x19,0x73,0x93,0x7B,0xD8,0x19,0x2B, + + 0x6E,0xBA,0x58,0x9C,0x88,0xFE,0x22,0xB4,0xD8,0x77,0x1A,0xD0,0x61,0x71,0x4D,0xBB, + + 0x44,0xD8,0x3F,0xB5,0xBB,0xFA,0x0D,0x8B,0xF5,0x74,0x9E,0x4F,0x02,0xF4,0x60,0xFF, + + 0xC7,0x7D,0xDE,0x31,0x1A,0x69,0x82,0x94,0xAF,0xC3,0x8E,0xC9,0x83,0xF3,0xEE,0xFB, + + 0x8D,0xDC,0x1D,0xE2,0xD4,0xF9,0x00,0xCF,0x92,0x51,0xDA,0xC8,0x5D,0xED,0xCB,0x59, + + 0xF2,0x94,0x37,0xDE,0x98,0x35,0x3D,0x09,0x7F,0xC7,0x67,0xCF,0xBE,0xBE,0x55,0x28, + + 0x97,0x30,0xD5,0x6F,0x76,0xFE,0x35,0xE6,0xFE,0x70,0x3D,0x5F,0xB7,0x9D,0x60,0x5F, + + 0xA3,0x0D,0xD4,0x43,0xDA,0x43,0x28,0x70,0x48,0x4F,0x6B,0xD4,0x17,0x91,0x28,0x11, + + 0x8C,0x09,0xC0,0x44,0x33,0x62,0x12,0x32,0xE2,0x5A,0xC2,0x06,0x2D,0x7E,0x73,0x04, + + 0x8C,0x6C,0xBF,0xA5,0x5A,0x61,0x71,0x65,0x40,0x4F,0xE8,0x43,0xF1,0xCB,0x89,0x12, + + 0x65,0x4F,0x0B,0x6E,0x1C,0xA5,0x9E,0x57,0x23,0x63,0x21,0xCE,0x5E,0xB5,0x38,0x44, + + 0xE2,0xA0,0xFA,0xBB,0x71,0xF2,0x30,0x62,0xC9,0x49,0x7F,0x0B,0x8F,0xB0,0x72,0xBF, + + 0x30,0x01,0xF0,0xB4,0x03,0xAE,0xBF,0x03,0x7B,0xC3,0x7B,0xE2,0x8F,0x83,0x39,0x68, + + 0x69,0x57,0x56,0xC1,0xBA,0xA8,0xAE,0xA6,0x2B,0x17,0x63,0x7A,0x3E,0x27,0xF1,0xAE, + + 0x3E,0x6B,0x25,0x68,0x95,0x66,0x59,0x31,0x8B,0x5C,0x87,0xE6,0xD7,0xCC,0x03,0x4E, + + 0x40,0x13,0x02,0xCC,0x00,0x29,0x90,0x5A,0xB3,0xB7,0x9A,0xFC,0xA1,0xBE,0x2E,0x2E, + + 0x2B,0x0B,0xE8,0x11,0x1A,0x38,0xDE,0x1C,0xA0,0x90,0xA2,0xC6,0xA0,0x07,0x97,0x6F, + + 0xA9,0x4A,0x53,0x31,0x61,0x44,0xD3,0xBC,0x28,0x06,0xEC,0xAF,0x49,0x3F,0x8C,0x9B, + + 0x54,0x04,0x4B,0x58,0xD7,0x23,0x43,0x3C,0xCF,0xE1,0xF8,0x7D,0x94,0x96,0xA5,0x88, + + 0x73,0x87,0x9E,0x3E,0xB9,0xDC,0x18,0x98,0x42,0x03,0xB0,0x68,0x7E,0xB8,0x52,0x3D, + + 0xD6,0x70,0x8C,0xAA,0x1D,0x56,0xA1,0x3F,0x81,0x77,0xBD,0x8D,0x89,0x2D,0xE6,0x64, + + 0x39,0x43,0x34,0x50,0x27,0x6C,0xC3,0x81,0x4A,0x03,0x30,0x72,0x04,0xC1,0xE4,0xDD, + + 0xC8,0x93,0x2E,0xD9,0xB1,0x9A,0x3B,0x2F,0x4C,0x40,0x4B,0x8E,0x3B,0x23,0x64,0x20, + + 0x7C,0x1F,0xCC,0x05,0xB0,0x90,0x44,0x87,0xC1,0xFF,0xCD,0xAA,0x76,0xC2,0x6C,0xD4, + + 0x66,0x9A,0x0D,0xFB,0x49,0x8E,0x98,0xEE,0xEC,0x33,0xDB,0x0D,0xD0,0xF1,0xED,0x85, + + 0x25,0x92,0x45,0xC0,0xFE,0x3A,0x41,0x9F,0xC2,0x49,0x3F,0xE5,0xA0,0x30,0x89,0x73, + + 0x23,0x5B,0xAD,0x84,0x0C,0x82,0xB6,0x34,0x72,0x6C,0xE5,0x37,0x68,0xD6,0x0B,0xBF, + + 0xAD,0xB2,0xA3,0xC0,0x59,0xA2,0x0C,0xF5,0x51,0x63,0x44,0xFB,0xF6,0xA0,0x37,0xE1, + + 0x13,0xBA,0x7A,0x25,0xDB,0x75,0x9F,0x82,0x88,0xCF,0x18,0x71,0x30,0x15,0x8E,0x01, + + 0xB4,0x9D,0x45,0xDB,0x56,0xC2,0xAD,0xE9,0x45,0x1A,0x71,0x87,0x4D,0x14,0xED,0x21, + + 0x5D,0xB4,0x93,0xE7,0xB7,0x7B,0x80,0xEC,0x18,0xAC,0xBD,0xB1,0xEC,0x78,0xCF,0x6A, + + 0xAA,0x50,0xF9,0x8F,0x92,0xC4,0x68,0x0D,0xBC,0x1B,0xCC,0xA4,0xDB,0x3A,0xBA,0x68, + + 0xD6,0x16,0xA7,0xB2,0x98,0x32,0xCA,0x4B,0x47,0xF4,0xFC,0x2C,0x78,0xEB,0x1F,0x79, + + 0xD7,0x15,0xB8,0xD2,0x9C,0x3C,0xBB,0xDA,0xC2,0xFC,0xD0,0x14,0x59,0x14,0x6F,0xDD, + + 0xA6,0x16,0x0F,0xBE,0x06,0x3D,0x4F,0x2A,0xCF,0xF4,0x5F,0x24,0x83,0xF6,0xD0,0x3B, + + 0xA6,0x11,0xA7,0xC2,0xEA,0x48,0xC5,0x14,0xD6,0x1E,0x6B,0x3C,0x36,0x7A,0x70,0xF0, + + 0x08,0x5D,0x69,0x4B,0xDA,0x92,0x46,0xCC,0x54,0xAD,0x56,0x3D,0x18,0x1D,0x52,0x22, + + 0xE2,0x0F,0xE0,0xE9,0x6E,0xF8,0x19,0xD7,0x03,0x64,0x87,0x75,0x59,0x78,0x49,0xEC, + + 0xF7,0x1B,0xA9,0x2C,0x79,0x7F,0x65,0x02,0x94,0xF8,0xA7,0xE6,0x7F,0xEB,0x18,0xB0, + + 0x08,0xE0,0x70,0x82,0x19,0xD0,0xBA,0xA6,0x4F,0x7E,0x70,0xBA,0x17,0xA2,0x60,0xEA, + + 0x80,0x83,0x7C,0x85,0xB4,0x0E,0x07,0x79,0xF8,0xA2,0xDA,0x33,0x54,0x93,0xCD,0x01, + + 0x8C,0xEE,0x5A,0x68,0x7F,0xE6,0x99,0x33,0xE0,0xFE,0xF6,0x00,0x59,0x7F,0x70,0x81, + + 0x60,0x8A,0x0D,0x68,0xFD,0xE7,0xD9,0x97,0x1C,0x3E,0xE0,0x3D,0xD3,0x51,0x5A,0xA9, + + 0xFE,0x7E,0x20,0x86,0x7E,0xA2,0xD3,0xAB,0x31,0x18,0x91,0x7C,0x86,0x50,0x20,0xFE, + + 0xFE,0x21,0x40,0xB0,0x33,0x01,0x42,0x89,0x41,0x6F,0x10,0xFC,0x73,0x31,0x5E,0x84, + + 0x4C,0x8F,0x4B,0x81,0x37,0xBD,0xAE,0xB7,0xF9,0x36,0xD6,0x96,0x4A,0xF4,0x77,0xB1, + + 0x67,0x78,0xBF,0xC1,0x5F,0x64,0xCA,0x9B,0x42,0x8A,0x4B,0x68,0x3B,0x4C,0x3F,0xAA, + + 0x10,0x8A,0x5D,0x70,0x76,0xCC,0x1D,0x51,0x75,0xC3,0x18,0xEE,0x1E,0x15,0x92,0x98, + + 0x2F,0xB9,0x22,0x6C,0x90,0x0F,0xB2,0x65,0xB4,0x8B,0xFD,0x19,0xD0,0x74,0xCB,0x13, + + 0xBF,0x68,0x63,0x4B,0x21,0xE8,0xB3,0x08,0xC3,0x88,0x73,0xB3,0xDD,0xA8,0x53,0xF3, + + 0x97,0xC6,0xFF,0x61,0x57,0xA8,0x3D,0x26,0x6C,0x64,0xD9,0x3A,0xDC,0x0B,0xD1,0xA8, + + 0xE7,0x36,0x04,0x3C,0xF5,0x0A,0x8D,0x1B,0x55,0xC5,0xC4,0x6B,0x35,0x69,0x14,0x72, + + 0xE6,0xE9,0x4A,0x60,0x93,0x79,0x37,0x9A,0x1B,0x60,0x18,0x8D,0x91,0x46,0x3D,0x4C, + + 0x8E,0x7F,0xBD,0xDD,0x9A,0x5B,0xF3,0x2D,0xD4,0x63,0xF7,0x4B,0x3F,0x41,0xB8,0xA8, + + 0xE3,0x7A,0x08,0x40,0x41,0x04,0x30,0x9B,0xDB,0x32,0x9D,0x77,0x34,0x69,0x2E,0x83, + + 0x87,0x96,0x89,0xB5,0x95,0x30,0xE4,0xD1,0x4A,0x05,0xCC,0x57,0x07,0x10,0x6C,0x70, + + 0xA7,0x99,0xAD,0x56,0x31,0x94,0x90,0x37,0xB0,0xB3,0x2B,0x5C,0x80,0xF5,0x29,0x84, + + 0x05,0x1A,0xDD,0xE5,0x3B,0x34,0xE5,0x4B,0xE0,0x0E,0x95,0x23,0x97,0x77,0xE9,0xF1, + + 0xE4,0xD3,0x50,0xE5,0x16,0x4C,0x54,0x58,0x0E,0x70,0xBB,0x47,0x15,0x02,0x5C,0xDB, + + 0xA6,0x98,0x9A,0x58,0xDD,0x42,0xAF,0xCD,0x60,0x7E,0x50,0x84,0x89,0x78,0x93,0xB9, + + 0xA8,0x63,0x8F,0x88,0xC6,0x69,0xBC,0x4A,0x70,0x97,0xF8,0x74,0x72,0x6F,0x05,0xC1, + + 0x25,0x9B,0xBB,0x5C,0xA6,0x19,0xC6,0x67,0x8B,0xF8,0x31,0x62,0xF8,0x7C,0x65,0xC2, + + 0x94,0x1D,0x42,0xAC,0x6A,0xF6,0xAC,0xA5,0xE1,0x0F,0x85,0x88,0x36,0x95,0x5E,0xE8, + + 0x6D,0x18,0xFF,0x38,0x99,0x67,0x95,0x1A,0x6A,0xB0,0xCF,0xDC,0xDB,0xBA,0x56,0xF8, + + 0x6C,0x91,0x2E,0xBD,0x82,0x32,0x40,0xBD,0xCC,0x76,0x39,0x9D,0x5E,0xB8,0x5F,0xE9, + + 0xED,0x9B,0x18,0xC8,0x6A,0xB2,0xB2,0x2F,0xE9,0xA7,0xF0,0x16,0x1D,0xF5,0x57,0x19, + + 0xA8,0xBF,0x0A,0xA2,0x0E,0xF6,0x6F,0x9C,0x4C,0x74,0xE6,0xBD,0x58,0x50,0x3C,0xCB, + + 0x89,0xA1,0x45,0x58,0xE2,0x5A,0xEB,0x6E,0x4A,0x41,0xBC,0xEB,0xD2,0xF3,0x54,0x6B, + + 0x17,0x32,0x8C,0xDA,0x1B,0x12,0xAD,0x5B,0x4F,0x4F,0xC6,0x2E,0x33,0xFB,0x71,0xE7, + + 0x45,0xCF,0xDD,0x3C,0x74,0x15,0xB7,0x2A,0x6E,0x9C,0xD0,0xE9,0x2E,0x9A,0x7A,0xD6, + + 0x2F,0xCB,0x8C,0x81,0x0A,0x63,0xFB,0x7F,0xBE,0x9E,0x77,0x9B,0x5C,0xBE,0x3E,0x38, + + 0x68,0xD1,0x7F,0xFC,0x10,0x9B,0x4A,0x21,0xE3,0x46,0xF6,0x1C,0xB9,0x11,0x76,0x16, + + 0xE0,0x82,0x24,0x67,0x7C,0x57,0x41,0x10,0xE4,0xBE,0xD9,0x52,0x30,0x65,0x17,0x63, + + 0xE0,0x9B,0x01,0x81,0x94,0x70,0x41,0x3D,0x63,0x03,0x8B,0x27,0x3B,0x6D,0x27,0xE2, + + 0x0D,0x42,0xF6,0x66,0xF4,0x75,0x0F,0x40,0x83,0xB7,0xFF,0xD7,0xD0,0x33,0x60,0xB3, + + 0x86,0x89,0xF8,0xBE,0xBE,0x29,0xA9,0x68,0xE7,0x3B,0xCE,0x49,0x71,0x7C,0x1C,0xBD, + + 0x0B,0x5E,0xDE,0x78,0xAC,0x37,0x10,0xE0,0x70,0x48,0x18,0x50,0xC8,0x6D,0x13,0x6A, + + 0x84,0x55,0xBE,0xAD,0xCB,0x6B,0xFD,0xFA,0x77,0xD0,0xE6,0x59,0x2E,0xD7,0x67,0xB8, + + 0x57,0x45,0x71,0xE4,0xAB,0x78,0xE0,0x97,0xD3,0x3A,0x0E,0x4E,0xA7,0x92,0x5B,0x8F, + + 0xED,0x89,0xF9,0x4B,0xE1,0xDE,0x6A,0x3A,0x6C,0x53,0xAC,0x01,0xFF,0x78,0x58,0x4B, + + 0xE2,0x6D,0xB1,0x6C,0x99,0x3F,0x0E,0x08,0x7A,0x92,0x0C,0x14,0x11,0x88,0x73,0xFA, + + 0x0C,0x87,0x38,0x7D,0x18,0x35,0x7C,0x4F,0xE9,0x0A,0xAD,0x15,0x7F,0xCE,0x9B,0x6A, + + 0xF1,0xAA,0xC3,0x09,0x78,0x30,0xA3,0xC7,0xD9,0x06,0xBB,0xBA,0x54,0xC6,0x13,0x91, + + 0x0C,0x4C,0x2E,0x37,0x84,0xB1,0xAA,0x80,0x29,0xD1,0xC5,0xE8,0x36,0x19,0x2D,0x26, + + 0xC1,0x02,0x07,0x61,0x1D,0x0C,0x03,0xB2,0xB6,0x02,0x1A,0x5D,0xCB,0xE6,0x27,0xB2, + + 0x05,0xF3,0x22,0x0D,0xC6,0xA5,0xAB,0x61,0x33,0x01,0x89,0xA0,0xB2,0xBF,0x43,0x50, + + 0x8D,0x1C,0xEA,0xAD,0x64,0x20,0x7B,0x64,0x46,0x54,0x24,0x9F,0x27,0xDE,0x56,0xD6, + + 0xCB,0x74,0x7F,0xFB,0x50,0x32,0x84,0x58,0x60,0xEB,0xAA,0xFD,0x18,0x7D,0x2E,0x66, + + 0xC8,0xA0,0x77,0xAF,0x58,0xAA,0xF0,0xC3,0x0C,0xA7,0xA6,0x04,0xC9,0x33,0x95,0x70, + + 0x03,0xE2,0x7A,0xFB,0xD2,0x45,0x17,0x25,0xE4,0x00,0x87,0x85,0x1B,0x36,0x53,0x73, + + 0xFD,0x97,0x8D,0x78,0x89,0x98,0xA6,0xC1,0x61,0x4C,0xCC,0x74,0x91,0x7B,0x3A,0xF5, + + 0xC9,0x05,0x04,0x64,0x32,0x94,0xFB,0x06,0x72,0xA9,0x44,0x0D,0x11,0xA5,0xB4,0x38, + + 0xB0,0x5A,0xAE,0xC9,0x30,0x75,0xCA,0x74,0x4B,0xD1,0xFD,0x96,0x31,0x7A,0x1C,0x31, + + 0x05,0x06,0x53,0xB6,0xDE,0x5A,0xAD,0xC5,0x03,0xF9,0xC3,0xC8,0xF4,0x57,0x14,0xB3, + + 0x04,0x07,0xC1,0x9E,0x97,0xC3,0x65,0x36,0x21,0x77,0xDB,0xC9,0x73,0x52,0x96,0x7B, + + 0xA4,0x15,0x8C,0xA1,0x3E,0x80,0x28,0xDC,0x09,0x5C,0xE8,0xAA,0x99,0xFB,0x30,0xC1, + + 0x41,0x14,0x1D,0x6F,0x4D,0xB4,0xFF,0xDE,0xDE,0x49,0xA0,0xE4,0x7F,0x6A,0xFC,0xAE, + + 0x09,0xE5,0x9D,0xFE,0xD1,0x9B,0x76,0x69,0xE2,0x41,0xA2,0x29,0xCE,0x59,0x9F,0x68, + + 0x0A,0x5B,0xD9,0xA4,0x52,0x8A,0xA7,0x56,0x95,0x06,0x9D,0xDF,0x0A,0x1E,0xBE,0x37, + + 0x2C,0x54,0x53,0xD7,0x4A,0xB1,0x5E,0x09,0x96,0xBD,0xD0,0xD5,0x53,0xB6,0xC9,0xBA, + + 0xD8,0x78,0x8C,0x23,0xD2,0x8C,0x4F,0x7C,0x43,0x3A,0xDA,0xBB,0xFA,0x73,0xE8,0xB6, + + 0xAC,0xBE,0xB9,0xF4,0x53,0x04,0x97,0xB8,0x32,0xAA,0x47,0x2A,0xF8,0x8B,0x77,0x22, + + 0x24,0xB9,0x63,0x42,0xB8,0xB4,0x67,0x0A,0xD3,0x3A,0x7C,0x4C,0x27,0xBC,0x18,0x33, + + 0xA5,0x01,0x4B,0xE0,0x04,0xEF,0xCF,0xCA,0xDA,0x8D,0x7D,0xB5,0x69,0x6B,0x7A,0x41, + + 0xEE,0xE5,0xD6,0x2A,0x7E,0xFB,0x94,0x42,0xC5,0x47,0xD9,0xF6,0x1D,0xFA,0x71,0xF0, + + 0x00,0x0F,0x31,0x75,0x7F,0x13,0xA6,0xAB,0x61,0x11,0x91,0xCD,0xBD,0xB8,0xB9,0xE3, + + 0x22,0x22,0x89,0xE4,0x8A,0x0C,0x19,0xF3,0xC3,0xD8,0x4D,0x44,0xE5,0xAC,0x2F,0x3C, + + 0xDA,0x8B,0x20,0x67,0xD6,0xA9,0x4C,0x04,0x9C,0xD6,0x30,0xB2,0x44,0x49,0x63,0x21, + + 0x56,0xE9,0x44,0xD2,0x3F,0x21,0x43,0x94,0x57,0x78,0x7A,0x05,0x23,0x4C,0xA1,0x47, + + 0x1F,0x26,0xA3,0xA5,0xCA,0xA2,0xC9,0xF9,0xC5,0x66,0xE6,0x16,0xA6,0xEF,0x0B,0x4E, + + 0x86,0x03,0xD1,0x90,0x55,0x87,0x81,0x6E,0x39,0x17,0xEA,0x97,0xD9,0x6C,0xB7,0xF9, + + 0x88,0x05,0x34,0x7D,0x70,0xC4,0x9E,0x4C,0xB7,0xD3,0x22,0x5C,0xB7,0x70,0xBA,0xEA, + + 0xFC,0x28,0x94,0x22,0x75,0xA4,0x82,0xFD,0x8F,0x69,0x3B,0x2A,0x3E,0xE1,0x71,0x58, + + 0x67,0xEE,0xC5,0x6E,0x9F,0x63,0xD8,0x4D,0xB4,0x85,0x95,0x77,0x85,0xE9,0xBC,0xE8, + + 0x09,0x06,0x54,0x6C,0xE5,0xC8,0x33,0x4F,0x48,0x3A,0xAD,0x66,0x36,0x53,0xF2,0xB9, + + 0x82,0x81,0xEA,0x5F,0xE2,0x4D,0x46,0xE8,0xCE,0xC6,0xF6,0x92,0x5E,0xF9,0xAA,0x1F, + + 0x82,0xCC,0xFE,0x4C,0xBE,0x2A,0x23,0x8A,0xEA,0x32,0x56,0xDB,0x8A,0x8E,0x18,0x6C, + + 0x2F,0x31,0x23,0xC2,0xDF,0xEC,0x4B,0x4B,0x2F,0x7E,0x66,0x67,0x5E,0x4E,0x51,0xB3, + + 0x40,0xC0,0x6B,0x4E,0x63,0x4E,0x7A,0x1D,0xFC,0xC2,0x50,0xB5,0x64,0xAD,0x1A,0xDA, + + 0xC4,0x3F,0x48,0xF5,0x00,0x16,0xE7,0xE5,0x05,0xD4,0x8C,0xE1,0xAA,0x6D,0xBC,0x61, + + 0xA1,0x1C,0x8C,0x7C,0xDC,0x80,0x65,0xF5,0xC0,0x2E,0xB7,0x32,0x47,0x71,0x85,0x90, + + 0x07,0xF6,0x68,0xF4,0xA3,0x3B,0x57,0xA1,0xE7,0x90,0x56,0x67,0xE0,0x5F,0x7F,0xD9, + + 0x4E,0xF7,0xB7,0x95,0x27,0xBB,0x64,0x6C,0x40,0x22,0x06,0x55,0x59,0x0E,0x75,0xB8, + + 0xEC,0x75,0xBE,0x0B,0x5E,0x05,0x4C,0x11,0x52,0x61,0xD3,0xE0,0xA6,0x90,0x52,0xE7, + + 0x80,0x85,0xF2,0xFB,0x14,0x3C,0xA9,0xAF,0x86,0x2A,0x2A,0x71,0x8B,0xB1,0x6D,0x56, + + 0x95,0x1D,0x25,0xE6,0x26,0xBB,0x64,0xDC,0x8A,0x94,0x35,0x52,0x10,0xB4,0x53,0xFB, + + 0x00,0x8C,0xD3,0xEE,0xF7,0x18,0xC2,0xB4,0x2D,0xED,0x4E,0xF0,0xF1,0x14,0xB6,0x62, + + 0x7C,0xD5,0x23,0x9D,0x04,0xE2,0xCE,0xCC,0xE3,0x5E,0xCE,0xDD,0x25,0x59,0x56,0xBD, + + 0xD0,0x96,0x5A,0xED,0x51,0xF6,0xA9,0x9E,0x5E,0x02,0x1E,0xCC,0x1F,0xCC,0xD8,0x83, + + 0x09,0x66,0x81,0xA3,0xA3,0xA1,0xF4,0xEB,0x94,0x96,0x8F,0x9F,0xDD,0x55,0xBF,0x19, + + 0x8F,0x8B,0x43,0x77,0xD2,0xF6,0x87,0x45,0xFD,0x96,0x7F,0x17,0xF6,0x7A,0x88,0xAC, + + 0x3E,0xD3,0x75,0xBD,0x4A,0xD0,0x3E,0x5F,0x0D,0xA6,0xF8,0x1F,0xE2,0xDE,0x2F,0xA5, + + 0x88,0x99,0xB4,0x13,0x57,0x6C,0x46,0x8B,0x03,0xD6,0x81,0x7A,0x11,0x8C,0x44,0xFE, + + 0x76,0x8F,0x81,0x06,0xBD,0xA4,0xE0,0x6F,0xC6,0xCA,0x1F,0x65,0xDC,0x28,0x3F,0x33, + + 0xCC,0xD2,0x2F,0xFE,0x2F,0xB2,0x6A,0x7F,0xC7,0xB8,0xA1,0xF0,0xB1,0xB1,0x61,0xA0, + + 0xD6,0xBF,0x97,0x80,0x38,0x56,0x6D,0xD0,0x96,0x71,0x6F,0xA0,0x2E,0x6D,0xA8,0x2E, + + 0x8D,0x43,0x0E,0x4A,0x9C,0x43,0x00,0xA9,0x47,0x00,0xB8,0x94,0x57,0x72,0xC1,0xB4, + + 0x66,0xF7,0x7A,0x22,0x31,0x39,0xD1,0x00,0x03,0x4F,0x51,0xAC,0x38,0x64,0xDF,0x96, + + 0x55,0xC6,0x22,0x90,0x02,0x1C,0x82,0x53,0xE2,0xA1,0xC5,0x12,0x38,0x12,0xD0,0x13, + + 0xA3,0x9F,0x05,0x22,0x90,0x88,0x71,0x02,0xBD,0xCB,0x81,0xE4,0xF3,0x62,0x9B,0xAE, + + 0x05,0x44,0x70,0xAB,0x15,0x2F,0x83,0x70,0xD2,0xB8,0xBC,0xF0,0x61,0x27,0x41,0x7C, + + 0x7D,0x9B,0xB9,0xA7,0xA1,0x04,0x49,0xF1,0xA1,0x66,0x81,0x6C,0x71,0x7D,0x8A,0xD5, + + 0x88,0x78,0x2D,0xBD,0x8F,0xDA,0x70,0x79,0x43,0xE7,0xE1,0xF7,0xF1,0x97,0xA5,0x3F, + + 0xE3,0xAD,0xFF,0xFC,0x1F,0x99,0x3D,0x43,0x91,0xBD,0xEA,0x0B,0xB1,0xF9,0xAF,0x1D, + + 0x8E,0x1F,0xF1,0xEC,0xDF,0x98,0xB6,0x47,0x83,0x18,0x5A,0xD1,0x9D,0x63,0xC3,0xBC, + + 0xD9,0xA1,0x43,0x29,0xB0,0x27,0x85,0xAD,0xB2,0x9D,0xEB,0xA9,0x8D,0xAC,0x5B,0x87, + + 0x72,0xAF,0xF5,0x1B,0x78,0xA8,0xA0,0xAA,0xF1,0x41,0x1B,0x7B,0xE1,0x6D,0x6D,0x37, + + 0xD3,0x90,0x3A,0x68,0xE5,0xA1,0xFE,0xCD,0x9F,0x2F,0xAA,0xEE,0xDA,0xD5,0xBE,0x16, + + 0xFE,0x51,0x14,0x1B,0xBE,0xDB,0xCA,0x91,0x03,0x5C,0x36,0xEE,0x57,0x65,0xF8,0x13, + + 0x8C,0x2E,0xA1,0x4D,0x6D,0x35,0xF8,0xA3,0x71,0x0C,0xEB,0xBD,0x86,0x91,0xE6,0x26, + + 0x16,0x9A,0x70,0x2D,0x1B,0x80,0x7B,0xDF,0x83,0xAE,0x5B,0x80,0xD7,0x9F,0x7A,0x29, + + 0xC9,0x03,0x3D,0x43,0xEE,0x38,0x16,0x42,0x89,0xB1,0x39,0xEA,0x8D,0x2C,0x32,0x25, + + 0x4B,0x86,0x1C,0x8B,0x0D,0x73,0x09,0x52,0xCD,0xFC,0x5C,0x90,0x22,0xAD,0x53,0x3A, + + 0x4B,0x01,0x05,0x42,0x94,0x5E,0xD5,0x80,0x02,0xFF,0x2C,0x21,0xD8,0x27,0x73,0x24, + + 0x5D,0x40,0xC5,0x12,0x82,0x43,0x8C,0x53,0xA9,0xB2,0x31,0x30,0x24,0x11,0xFC,0xA0, + + 0x3D,0x9F,0x68,0xB7,0x2D,0xC2,0xE0,0x82,0x91,0xDF,0x2B,0x0C,0x64,0x39,0x58,0xDA, + + 0x82,0x9A,0x37,0xF0,0xBE,0x98,0x66,0x40,0xA6,0xFA,0xA4,0x70,0x41,0x87,0x88,0xF0, + + 0xCE,0x54,0x3A,0xB6,0xA5,0xE0,0xC3,0xD8,0x09,0x12,0x72,0x07,0x32,0xDB,0x15,0x11, + + 0x48,0x06,0x00,0x46,0xA0,0xBC,0xF9,0x8B,0x40,0xA3,0xE5,0x0F,0x5F,0x7A,0xB5,0x21, + + 0xD0,0x0B,0x39,0x6A,0xF0,0x49,0x32,0xC0,0x4C,0xAC,0xFF,0x47,0x87,0xF3,0xB9,0xBC, + + 0x16,0xE9,0xD7,0xB8,0x9C,0x98,0x40,0x5A,0x6D,0xA4,0xE9,0xDE,0x0A,0x79,0x7C,0x4B, + + 0x2B,0x5C,0x94,0x2D,0xE0,0x38,0x00,0xC6,0xCB,0xDB,0x31,0x80,0xFE,0x3B,0x50,0x66, + + 0xD6,0x61,0x1A,0x6E,0xC9,0x38,0xDF,0x98,0x11,0x19,0x08,0x42,0x08,0xA8,0x78,0xE0, + + 0xA7,0xBA,0xE6,0x26,0x53,0x66,0xF6,0xF6,0xE6,0x39,0xA9,0xCB,0xDB,0xA3,0xD8,0xA9, + + 0x1B,0x14,0xAC,0xDC,0xC8,0x51,0x25,0x08,0xD2,0xEC,0x0E,0xAC,0x7D,0xFD,0x0A,0x09, + + 0xE7,0xB3,0xA6,0xE9,0x41,0xB3,0xE3,0x8B,0x82,0x53,0x63,0x8F,0x05,0x78,0x18,0x29, + + 0x37,0xBE,0x70,0x46,0x4A,0xB6,0x21,0xFF,0x0A,0xDC,0xE8,0xF9,0xB0,0xD6,0xD7,0xAE, + + 0xCC,0x57,0x8D,0xF5,0x98,0xAD,0xB2,0x3C,0x7C,0x34,0x90,0xDF,0xF5,0xE1,0x0E,0xA8, + + 0x6B,0xC3,0x57,0x7D,0x9A,0x57,0x4D,0x2F,0x82,0x6C,0x78,0xE2,0x10,0x1A,0x74,0x10, + + 0x7E,0x91,0x58,0x7D,0xF4,0xC2,0xA0,0x28,0xF4,0xF2,0x8F,0x2B,0xAB,0xA2,0xFF,0x3E, + + 0xEE,0xF7,0xA1,0x1E,0x20,0x22,0x28,0xC1,0xE4,0x82,0x39,0xB3,0x92,0xA2,0x32,0x79, + + 0x6C,0x51,0x98,0xCE,0xB3,0x2D,0x5C,0xD2,0x62,0x1F,0x77,0xE4,0x74,0x96,0x6C,0xF5, + + 0xFA,0xF4,0x28,0x46,0xAD,0xBE,0xD2,0x47,0x24,0xC1,0x40,0x66,0xF0,0xFE,0x33,0x7C, + + 0xEC,0xC4,0xC1,0xD4,0x35,0xE7,0x51,0x9E,0x42,0xC0,0x4E,0x85,0xE5,0xB4,0x96,0x2D, + + 0xB1,0x58,0x53,0x31,0x64,0xB7,0x01,0x9B,0xD5,0x8A,0x99,0x01,0x20,0x68,0xE0,0xCC, + + 0x9E,0x8B,0x26,0xF0,0xED,0xC6,0x68,0xE7,0x24,0x29,0x72,0xFF,0xE7,0x33,0x3C,0xA5, + + 0xE6,0xDA,0xB8,0x1B,0xEA,0x34,0x2B,0xD8,0x2D,0x18,0xA6,0x4C,0xA6,0xA9,0xC0,0xF0, + + 0x65,0xD9,0x40,0xCF,0xC8,0x97,0xF3,0x0A,0x5C,0x67,0x9A,0xD2,0x61,0x9F,0x15,0xB2, + + 0xE7,0x5C,0x47,0x81,0x9C,0x4B,0xFB,0x1A,0x5D,0xC6,0xF5,0x01,0x40,0x56,0xF2,0x38, + + 0xE5,0x6D,0x5A,0xB5,0x0E,0xE1,0x12,0x39,0xFB,0xC3,0xEA,0x63,0x58,0xFF,0x27,0x9A, + + 0x62,0x06,0x7A,0xB6,0x78,0xE0,0x18,0x6F,0x4C,0xA5,0x82,0x6C,0x6C,0xBF,0x5D,0x7E, + + 0x03,0x28,0x18,0x47,0x3B,0x51,0x2C,0x6A,0x37,0xA2,0xD2,0x90,0x2B,0x1A,0xCE,0x6A, + + 0xE3,0x90,0x10,0x57,0x3A,0x50,0xDC,0x7D,0x1B,0xAB,0x03,0x97,0xFF,0xA2,0xFF,0xAD, + + 0x22,0x3A,0x26,0x92,0xC8,0xC1,0xA4,0x7A,0xB1,0xBC,0x4F,0x22,0x50,0x92,0x12,0xA7, + + 0xA8,0x37,0xF5,0x03,0xDC,0xC0,0x41,0x59,0x06,0xB9,0xEE,0xA9,0x1F,0xAC,0x96,0xF1, + + 0x4F,0x73,0xDB,0xAA,0x68,0x23,0xF1,0xFD,0xEA,0xCC,0x75,0x66,0x4B,0x26,0x60,0x53, + + 0x88,0x18,0x55,0x15,0x97,0x83,0x2A,0x37,0xC1,0x11,0x7D,0x96,0x67,0x2C,0x75,0x28, + + 0x83,0x9D,0xC4,0x2C,0xC3,0x3D,0x5A,0x11,0xEA,0xD9,0xCE,0x1C,0x8D,0x8F,0xFA,0x56, + + 0x03,0xAB,0x6C,0xE8,0x5B,0x40,0x07,0x02,0xD2,0x64,0x85,0x72,0x7B,0x95,0x33,0xF8, + + 0x96,0x63,0xC5,0x4D,0x92,0x0D,0x88,0xA4,0x17,0xA0,0xB5,0x0B,0x9A,0xC9,0x65,0xEB, + + 0x5F,0x76,0xFC,0x2F,0xB7,0xF7,0x03,0xF5,0x06,0x54,0x20,0xCE,0xC0,0x80,0x83,0xBB, + + 0x40,0x87,0xDE,0x66,0x26,0x15,0x0E,0x50,0x0F,0x3C,0x02,0xCC,0x4F,0x18,0xD1,0x69, + + 0x15,0x36,0x29,0x7C,0x0E,0x29,0x6C,0xF1,0xED,0x78,0x7A,0x74,0xC6,0x06,0x9F,0xEB, + + 0xE3,0x11,0xB4,0x69,0x3E,0xB9,0x20,0x58,0x68,0x57,0x1C,0xE8,0xF2,0x26,0xBE,0x68, + + 0x9D,0x16,0x17,0x61,0xAD,0xF6,0x61,0x59,0xE9,0x76,0xE5,0x29,0xC1,0xB9,0xD1,0xE2, + + 0x28,0x7D,0x66,0x42,0x0D,0xE1,0x58,0x19,0xE2,0x41,0xAB,0xE6,0x4D,0xFC,0xA4,0x52, + + 0x4C,0xE7,0xD0,0x13,0x98,0xFC,0xE9,0x05,0x8E,0x0E,0xAE,0x6A,0x9E,0xF2,0xD2,0xF4, + + 0x9E,0xDC,0xD9,0x03,0x19,0xAE,0x0F,0xF2,0x8D,0xBE,0x37,0xBB,0x47,0xF8,0x79,0xF3, + + 0xA9,0xBE,0x2F,0x77,0xC4,0xFD,0x84,0xF9,0x01,0xC4,0x4B,0x80,0x5C,0xBE,0x5A,0x80, + + 0x68,0x11,0xE9,0xEF,0xAF,0x8B,0x6E,0xB6,0x46,0xA3,0xBD,0x5B,0xC9,0x5D,0xBD,0xE3, + + 0x8D,0x0C,0x9C,0x9B,0xE6,0x44,0x3E,0x70,0x9F,0xEE,0x67,0x4E,0x33,0xAD,0x7F,0x07, + + 0x61,0x81,0xF9,0x01,0x61,0x60,0xC9,0x32,0xBE,0x94,0xCA,0x25,0xB0,0x1F,0x99,0xE2, + + 0x05,0xAE,0xB1,0xFD,0xDD,0xFF,0x7E,0xC0,0x13,0x03,0x62,0x2A,0x55,0xCC,0x20,0x42, + + 0x31,0x09,0xF8,0xBA,0xBE,0x29,0xFC,0x22,0xC1,0x06,0xFF,0x1B,0x8B,0xE9,0xB7,0xD4, + + 0x63,0x2F,0xAE,0x7D,0x37,0x58,0xBB,0x83,0x9D,0xEE,0xCD,0xB4,0x7B,0xEE,0xBE,0x43, + + 0x86,0x8B,0x6D,0xD6,0xA6,0xFB,0x87,0x6B,0x23,0xE9,0x2E,0x1A,0x5F,0xC0,0x19,0x49, + + 0xCB,0x45,0x36,0xF0,0x59,0x2A,0x3E,0x79,0x28,0xD1,0x99,0x48,0xD5,0x46,0x7A,0xB8, + + 0xB4,0xA7,0x2E,0x89,0xCD,0x4A,0x6C,0x1E,0xA3,0xAD,0x36,0x4E,0xD5,0x0A,0x32,0x3C, + + 0xC1,0x8A,0x37,0x43,0x1F,0x68,0x28,0x7E,0xDB,0x25,0xE5,0x46,0x77,0xF6,0xA7,0x6B, + + 0x7F,0x6F,0xEA,0xE6,0x63,0xD6,0x4D,0x1A,0xD8,0xE5,0xEC,0x0A,0x79,0xDB,0xAB,0x0A, + + 0xA7,0x6F,0xED,0xE6,0x20,0x69,0x25,0x7D,0x03,0xE3,0x3C,0x3B,0x0D,0x0F,0x00,0xDD, + + 0x8F,0x9C,0x39,0x37,0x66,0xD3,0x2C,0x5E,0xA1,0xA9,0xF3,0x0E,0xAD,0xD5,0x5D,0x55, + + 0x38,0x5D,0xF4,0xFD,0xD1,0x8E,0x68,0x3E,0xD9,0xF0,0x49,0xF8,0x73,0x79,0x83,0x41, + + 0x8A,0x4C,0xF9,0xF1,0xBE,0x40,0x0D,0x5A,0xDE,0xE1,0xCB,0xE8,0xB9,0x14,0xF3,0xEB, + + 0x83,0x63,0xF5,0xFD,0x51,0xAC,0xF0,0x03,0x1E,0x54,0x81,0x82,0x78,0xE4,0x50,0x9F, + + 0x06,0x51,0x97,0xB4,0x70,0xCF,0x14,0x62,0xE3,0x16,0xCD,0xA0,0xA5,0x1C,0x9F,0x6F, + + 0xC8,0x60,0xD2,0xC5,0x31,0x95,0xA8,0x34,0x45,0xCB,0xE1,0x99,0x8A,0xAC,0xA9,0xF2, + + 0xD0,0xB4,0xBF,0x34,0x8C,0xED,0xA2,0x85,0xE6,0x73,0x51,0xFB,0xFE,0x6C,0x6B,0xA8, + + 0x56,0x52,0xDD,0xC1,0x0D,0xE2,0xB6,0xF6,0xEF,0x8F,0x4C,0xD5,0xFD,0x88,0x16,0xA2, + + 0x43,0x41,0xC0,0xF4,0xCD,0x72,0xE5,0x5E,0xDE,0xA3,0x59,0x41,0x56,0x1A,0x93,0xD8, + + 0x7D,0x9E,0xF2,0xA8,0xBE,0x93,0xE5,0xAE,0xE0,0x5B,0xF4,0x36,0xA7,0xAA,0x5D,0xC5, + + 0x2F,0x57,0x97,0xC1,0xFB,0xFE,0xFA,0x8E,0x3F,0x8A,0x95,0xDA,0xFA,0x1A,0x1C,0xEC, + + 0x48,0x53,0x91,0x15,0xAB,0xEC,0xBD,0xCE,0xC7,0xF3,0x7A,0x0A,0x98,0x08,0x38,0xA4, + + 0x40,0x15,0x37,0xB5,0xC0,0xA9,0xD2,0x62,0xD3,0x07,0x69,0x88,0xA5,0xC5,0xF5,0xBC, + + 0xC0,0xB0,0xC2,0xEF,0x1B,0x92,0xDE,0x99,0x91,0x1B,0x04,0x38,0x76,0x7F,0xF8,0xFA, + + 0x90,0x79,0xB4,0xA0,0xBE,0xA2,0x49,0x4B,0xEC,0xC7,0x38,0x89,0xFE,0x83,0xF2,0x75, + + 0xA9,0xA0,0xF7,0x99,0x59,0xEE,0x8F,0x61,0x3C,0x37,0x5F,0x69,0xB9,0xF6,0x7C,0x78, + + 0xAA,0xB3,0xE8,0x31,0xCC,0x7E,0x8B,0xEE,0xA2,0x07,0x83,0x4C,0x8D,0x1C,0x1E,0xE5, + + 0xC0,0x59,0x9E,0xD4,0x73,0xB0,0xCE,0x8B,0x07,0xFC,0x23,0x78,0x10,0x02,0xE3,0xAB, + + 0x5D,0x95,0x4A,0xBD,0x3A,0x2E,0xF3,0x18,0x49,0x1E,0x89,0x02,0xBA,0xD5,0x75,0x69, + + 0x2B,0xB0,0x30,0x59,0xF8,0x99,0x67,0xC9,0x8B,0xF0,0x99,0x0C,0x44,0xEF,0x7E,0xE0, + + 0x00,0x2D,0x30,0x5D,0x30,0x0B,0x4E,0x39,0xAD,0xE8,0x04,0x01,0xF5,0x8C,0x10,0xEC, + + 0xA9,0x8C,0x80,0xE7,0x6D,0x14,0x66,0x3D,0x49,0x8F,0x47,0x48,0x27,0x5D,0x30,0x87, + + 0xCC,0x72,0x34,0x04,0xFF,0x33,0x53,0x23,0x2F,0x56,0x75,0xDB,0xD4,0x53,0x3F,0xB7, + + 0x6E,0xC0,0xF7,0x2B,0x24,0x0E,0x58,0x93,0x13,0x7C,0x06,0x6C,0x26,0x68,0xA0,0x96, + + 0x46,0x09,0x70,0xE6,0x10,0x25,0xF2,0x25,0x68,0x18,0x63,0x57,0x66,0xA6,0x99,0xD0, + + 0x87,0xEC,0xC6,0xAB,0xE1,0xBE,0x06,0x69,0x93,0x51,0x80,0x6B,0xD7,0xDB,0x38,0x4F, + + 0x21,0x82,0xF1,0x4F,0xBE,0x7D,0xA5,0x3D,0x55,0xF9,0xE5,0x6D,0x77,0x64,0x51,0xF3, + + 0x6E,0x57,0x2E,0x31,0xF7,0x58,0x27,0x7C,0xC3,0x89,0xA3,0x06,0xBF,0xF6,0x99,0xBB, + + 0x26,0x27,0xBC,0x3E,0xEB,0x07,0x1B,0x45,0xDD,0x0D,0x31,0x07,0x5A,0xFB,0x9D,0xBE, + + 0x7E,0x89,0x94,0x23,0x90,0x0F,0x0B,0x6A,0xA9,0x5C,0x47,0x40,0x73,0xB6,0x77,0x2F, + + 0x78,0xA9,0xF3,0x7D,0x77,0x5B,0x41,0x23,0x28,0x6D,0xAE,0x4D,0xB4,0xE7,0xEB,0x1F, + + 0x9B,0x5F,0xB7,0xDF,0x9C,0x06,0x3A,0x0D,0x35,0x30,0x84,0x61,0x2C,0x37,0x02,0x48, + + 0x20,0x81,0x02,0xFE,0x18,0x04,0x13,0xCA,0x98,0x73,0x8B,0x08,0x1D,0xE3,0x52,0x27, + + 0x2C,0xCD,0x31,0x0D,0x60,0x23,0x22,0x6E,0x2C,0x51,0xE8,0x9C,0x22,0xE6,0x9C,0xC9, + + 0x0E,0xCD,0x69,0xEF,0xC6,0x9D,0x4D,0xD8,0x87,0x49,0x0C,0x87,0x8B,0xA3,0xC7,0x7F, + + 0x0D,0x8B,0xB2,0xC2,0x3A,0x26,0x82,0x94,0x4F,0x4F,0xFD,0x40,0xEF,0xAD,0x64,0x7A, + + 0x98,0xD1,0xDC,0xB7,0x40,0x1F,0xF0,0xFC,0x6A,0xCE,0xED,0xAA,0xD3,0xF1,0x80,0xD0, + + 0xA6,0x45,0xD2,0xAF,0xDC,0x18,0x93,0x36,0x2E,0xD4,0x3C,0xC5,0x56,0x9D,0xC9,0x03, + + 0x58,0xB2,0x36,0xF9,0xDE,0x03,0x48,0x58,0x39,0x8F,0x35,0xAB,0xF2,0x58,0xFA,0x8C, + + 0xA4,0x07,0xF3,0x75,0xB1,0x36,0x10,0xCC,0x7C,0x78,0xDF,0xBB,0xF4,0x9C,0xC0,0xA0, + + 0x53,0x9D,0xB4,0xDF,0x62,0x19,0xD4,0x90,0x04,0xE8,0xA4,0x0C,0x8D,0x5F,0x34,0xB0, + + 0x50,0x91,0xA4,0xC3,0x40,0x19,0xC8,0x90,0x43,0x0A,0xDB,0x09,0x1C,0x8A,0xE5,0x84, + + 0x82,0x6B,0x7E,0x80,0x7C,0xFD,0x0B,0xE4,0x47,0x09,0x08,0x6B,0x26,0x29,0xB2,0x73, + + 0xDC,0x17,0x32,0x05,0xB1,0xCF,0xC2,0xC2,0x46,0x28,0xA8,0x57,0x00,0x97,0x2A,0x91, + + 0x29,0x35,0x15,0x6C,0x54,0x29,0x4E,0xAE,0xD1,0x9A,0x76,0xF2,0x7D,0xFE,0x1C,0xAB, + + 0x2C,0x66,0x3B,0x6D,0x01,0x19,0x06,0x52,0x21,0x05,0x0F,0xBB,0x1E,0x06,0x29,0x7A, + + 0x0F,0xDA,0xD9,0xB7,0x49,0x19,0x23,0x24,0x1B,0xBF,0x97,0xEF,0x5D,0x7D,0x11,0x79, + + 0xC7,0x68,0x38,0x9D,0x07,0xFA,0x93,0x3E,0x38,0xB9,0xC7,0x1F,0xF7,0x1B,0x1D,0x4E, + + 0x2D,0xC4,0xFC,0xEA,0xE2,0xAD,0xCD,0x4F,0x99,0x71,0xA8,0x01,0x3E,0x57,0xC2,0xFE, + + 0xA0,0xDC,0xFA,0xD4,0x9E,0x12,0x40,0x16,0x19,0x9C,0xB8,0x0F,0xC0,0x2D,0xD8,0x97, + + 0x8F,0xDE,0xBD,0xF3,0xC2,0xFC,0xAA,0xD6,0x05,0x9A,0x0A,0x6B,0x95,0x81,0x83,0x5B, + + 0x53,0xBF,0xFA,0x5B,0xF6,0x0B,0xC6,0x7F,0xA7,0x2F,0xAF,0x15,0x04,0x54,0xFD,0x98, + + 0x6B,0x7F,0x8A,0x4D,0x03,0xDA,0xD0,0x01,0x86,0x9F,0xEE,0x23,0xF1,0xDF,0x58,0xFA, + + 0xFA,0xD4,0xD8,0xC9,0x3B,0x22,0xB3,0x77,0x4F,0x9D,0x9B,0x28,0xD1,0x8F,0x85,0xF0, + + 0x3F,0x01,0x0F,0xD5,0xAA,0x21,0xA5,0x43,0xF3,0xA2,0x51,0xF4,0xBA,0x50,0xF2,0x2E, + + 0x7E,0x0D,0x5B,0xB1,0x91,0x03,0xDD,0xFB,0x7A,0xBC,0x09,0x7E,0x2C,0x5F,0x51,0x40, + + 0x04,0x9F,0x7E,0xD1,0xB4,0x8A,0x94,0xB0,0x1C,0xFB,0x07,0x9D,0x72,0xFF,0x58,0x64, + + 0x5B,0x06,0x4C,0x4A,0xF2,0x49,0x23,0x0B,0x62,0x65,0xF0,0xF0,0x56,0xFE,0x05,0xE1, + + 0xAE,0x04,0x01,0x10,0xCC,0x64,0x01,0x5D,0xC4,0xC6,0xD1,0x98,0xD2,0xBD,0x0A,0x44, + + 0xB0,0xA3,0x2C,0xBA,0x72,0x71,0x1E,0x0E,0x4E,0xF1,0x66,0x29,0xF2,0x45,0x6A,0x8E, + + 0xF4,0x49,0x86,0x0D,0xE7,0xD7,0xD2,0x0C,0x1E,0xB5,0xC8,0xD3,0xA7,0xB7,0xF5,0xEB, + + 0x7D,0xA6,0x8A,0xE3,0xE6,0xF6,0x0C,0x5A,0x29,0x33,0xE4,0x8C,0xA8,0x05,0x5D,0x30, + + 0x80,0x81,0x7C,0x0D,0x98,0xD5,0x6B,0x52,0xA0,0x47,0xA4,0xE4,0x39,0xF5,0x9C,0xF1, + + 0x43,0xC6,0x74,0x1C,0x99,0xD4,0xDB,0x1D,0xAC,0x09,0xFD,0xF4,0xDA,0x68,0x98,0x48, + + 0x1A,0xC7,0x3B,0x3E,0x80,0x13,0x5A,0x65,0xB7,0x22,0xD4,0x55,0xB3,0xDD,0xA2,0x7C, + + 0x2F,0xB6,0x4E,0xD8,0x17,0xF9,0x5B,0x07,0x32,0x44,0x33,0xFE,0x52,0x80,0x47,0x0F, + + 0xAE,0x4F,0xF9,0xC7,0x29,0x2A,0x30,0xA9,0x8E,0x4A,0x7F,0xFF,0xD6,0x66,0x3A,0xDD, + + 0xD1,0x59,0x9B,0x8E,0xC3,0xA2,0x59,0x65,0x3D,0xCF,0x81,0x87,0x78,0x6B,0x4C,0x09, + + 0xDC,0x61,0x80,0xEC,0x30,0x30,0xF3,0x4F,0x00,0x80,0x2D,0x3A,0x73,0x40,0xB3,0x03, + + 0x5D,0xCC,0x2B,0xC8,0x11,0xB2,0xE5,0x32,0xA8,0x26,0x21,0xEB,0xA8,0xEC,0xC5,0xDD, + + 0x1D,0x7E,0x07,0x06,0x64,0x8A,0xD5,0x09,0xD9,0x5F,0x3E,0xCB,0x25,0x8E,0x6B,0xAD, + + 0xA2,0xF3,0x8B,0x7D,0x69,0xFE,0x25,0x40,0x42,0xD3,0xB2,0xAD,0x71,0x2F,0x9B,0x40, + + 0x51,0x10,0xC6,0xDB,0x13,0x30,0xAB,0x62,0x67,0x50,0xAB,0x19,0x7A,0x36,0x8C,0x8D, + + 0x69,0xEE,0x03,0x14,0x37,0xC1,0x24,0x8B,0x6D,0x37,0x10,0x96,0x30,0xAA,0x1A,0x94, + + 0x9D,0x21,0xC4,0xBA,0x3F,0x90,0xEE,0x03,0x4E,0xAB,0x13,0xD7,0x70,0x3E,0x4D,0x2D, + + 0x02,0x55,0x02,0xA6,0xDA,0x88,0x17,0x4C,0x61,0x1F,0xA5,0x77,0xF6,0x7E,0xA5,0xB4, + + 0xF4,0xE9,0xA6,0x84,0xB5,0x03,0x24,0x53,0x98,0x57,0x39,0xD7,0xA5,0x39,0x9B,0x9A, + + 0x88,0xB4,0x6C,0x0C,0xF1,0xC0,0x30,0xD6,0x15,0xA6,0x72,0x2E,0x35,0x71,0x21,0xA4, + + 0xD0,0xBA,0x20,0xFA,0x8B,0x8E,0xA0,0x91,0xEE,0x7A,0xA9,0x55,0xD9,0x32,0x18,0x63, + + 0x40,0xCA,0xF7,0xAF,0x4A,0xEE,0x25,0x05,0x64,0x39,0xDF,0x41,0x47,0x80,0x8E,0x09, + + 0x5D,0x69,0x9D,0xCC,0xEF,0x61,0xCB,0x0A,0xE8,0x58,0xEC,0x0E,0xD6,0x73,0x11,0xD8, + + 0x58,0x10,0x0E,0xDD,0xF2,0xC1,0x3C,0xF1,0x6A,0x9D,0xD6,0x79,0xDA,0xF7,0x98,0x49, + + 0x95,0x49,0x6C,0x92,0x07,0xC2,0x71,0x8B,0x15,0x32,0x17,0x3D,0xF2,0x78,0x8F,0x95, + + 0x76,0x5E,0xF0,0x82,0x46,0x51,0xE0,0x3E,0x29,0x40,0x28,0x1F,0x5A,0xF5,0x7E,0xE0, + + 0x58,0x05,0x5F,0x06,0x1C,0xA0,0x32,0xCB,0xF9,0x61,0xEA,0xEB,0x24,0xA2,0x50,0xE1, + + 0x75,0x82,0x57,0xE9,0x15,0x5E,0x80,0xC1,0xC1,0x4C,0xE0,0x13,0xE9,0x62,0x78,0x19, + + 0xE0,0x03,0x5E,0xF8,0x6B,0xA2,0x09,0x12,0x65,0x43,0xA5,0x2D,0x75,0xDB,0x2E,0x1F, + + 0xB6,0xC2,0xA9,0x17,0xDC,0x53,0x6B,0x78,0x2E,0xA7,0xBF,0x87,0xB6,0xE1,0x1A,0x52, + + 0x84,0x80,0x4C,0xD9,0xE9,0x29,0x5C,0x3D,0xB3,0x38,0x0B,0xE2,0x1D,0x4A,0xF3,0x30, + + 0x25,0x68,0x97,0x24,0xC5,0x3A,0x47,0xA2,0x4B,0x6E,0xB2,0x81,0xF4,0xE3,0x9E,0xA1, + + 0x04,0x82,0x02,0xB9,0x77,0x10,0xE1,0x38,0x3B,0x7A,0x91,0x26,0x5A,0xEB,0x2D,0xAA, + + 0xD4,0x1C,0x79,0x18,0x6A,0xDB,0x01,0xF3,0x27,0x38,0xB1,0xE0,0xB4,0xB2,0x9A,0xF5, + + 0x81,0x25,0xAC,0x8B,0x55,0xFA,0xB2,0x3A,0xB4,0x1C,0x27,0xAA,0x74,0xFC,0x74,0x37, + + 0x05,0x24,0xAA,0x0B,0x1D,0xA9,0x7B,0x5C,0xB2,0xCF,0xC8,0x5C,0xEA,0x8C,0x30,0x94, + + 0x67,0x1B,0xAD,0x2A,0x9C,0xAA,0xA6,0x34,0xBC,0xD1,0x88,0xCD,0xDA,0xCB,0xBE,0x5C, + + 0x47,0x1A,0xAB,0x27,0x9D,0xAB,0x15,0x81,0x6C,0xA7,0x83,0xD0,0x50,0x1D,0x62,0xB7, + + 0x1F,0x57,0x4B,0x30,0x8B,0x01,0x12,0x2E,0xCE,0xC1,0x8A,0x4A,0x7E,0x8E,0x0A,0x59, + + 0x0B,0xCD,0x2A,0x5F,0xD6,0x50,0xD5,0x95,0xFA,0x65,0x7D,0x18,0xBD,0xCD,0x43,0xCF, + + 0x8D,0xD6,0xFD,0xB4,0xED,0xAE,0x8A,0x4C,0x6F,0x44,0xA0,0xA9,0xD0,0xF5,0x69,0x60, + + 0xF8,0xFA,0x07,0xCC,0xBE,0xA7,0x03,0x85,0x72,0x37,0xFE,0x97,0x19,0x22,0xDB,0xF8, + + 0xD3,0xD1,0x3F,0xAD,0x49,0x8D,0xCF,0xDD,0x6A,0x2F,0xF4,0x4B,0xE7,0xAB,0x93,0xC9, + + 0x4E,0x9E,0xBF,0x65,0xB1,0x3C,0xC3,0xB0,0x69,0x8D,0x33,0x0E,0x3F,0x6A,0x88,0xF8, + + 0x39,0x2E,0xBD,0xB3,0x5D,0x6A,0x8E,0xC3,0xA4,0x89,0xB0,0xD5,0x0F,0xB0,0xAD,0xE8, + + 0xA3,0xB2,0xFB,0xCE,0x5E,0xD7,0x82,0xFD,0x86,0x03,0x2D,0x33,0xBE,0x97,0x5E,0x3C, + + 0x45,0xCD,0x82,0x1A,0x37,0xD4,0x7C,0xF6,0xE4,0x9C,0x1B,0x04,0xD7,0x7E,0x3E,0x9D, + + 0xCC,0xF1,0x40,0x45,0x6C,0xBF,0xEC,0xB4,0xAC,0xC8,0x83,0x14,0xF5,0xDD,0xF6,0x30, + + 0x22,0x1B,0x42,0x1B,0x92,0x4B,0xE8,0x81,0x9A,0xD9,0x08,0x05,0x57,0x7C,0x55,0x28, + + 0x86,0x26,0x6D,0xC8,0xEC,0xF6,0x2D,0x84,0xBB,0x90,0x59,0x95,0xB4,0x0A,0x11,0x0E, + + 0x08,0x02,0x9E,0x61,0xDF,0xB1,0xA3,0x2E,0x5E,0xE1,0x6D,0xAD,0x03,0xF4,0xEA,0x50, + + 0x96,0x66,0xF4,0x65,0x49,0x16,0x4D,0xD8,0x2D,0xD6,0x69,0x93,0x4E,0xB4,0x8C,0xCC, + + 0xA2,0x46,0x61,0xD0,0x01,0x46,0x8E,0x49,0x6E,0x76,0x77,0x56,0x9F,0xB8,0xEF,0xBF, + + 0xA3,0x66,0x0F,0xED,0xDF,0x17,0xAF,0xEE,0xB0,0x23,0x7F,0xAF,0x47,0xB9,0xCA,0x58, + + 0x6E,0x96,0xDC,0x3D,0x46,0xFE,0x18,0x98,0xE3,0xAA,0x8E,0xCA,0x4D,0x48,0x6C,0xA1, + + 0x4F,0x02,0x91,0x26,0xBE,0x42,0x44,0x71,0xD4,0x50,0x5D,0x1C,0x9F,0x42,0x65,0x33, + + 0xAE,0x9A,0x6E,0xA3,0x81,0xBF,0x8A,0x99,0x78,0x81,0x4D,0x11,0x17,0x07,0x14,0xA1, + + 0xA1,0xFD,0x34,0xDD,0xB9,0x9F,0x1E,0x11,0x1E,0xDC,0x3F,0x3F,0x82,0xBE,0xC0,0x21, + + 0xAC,0x42,0x0C,0x38,0x16,0x61,0x49,0x2D,0xE5,0xFF,0xAB,0x94,0xCC,0xFF,0xCC,0x4E, + + 0x0F,0x1F,0xC6,0x36,0xC0,0xDC,0x01,0x23,0xE2,0xA0,0xDE,0xDC,0xC6,0x2C,0x91,0xD9, + + 0x55,0x6E,0x43,0x67,0x6B,0x60,0x09,0x91,0xC6,0x90,0x4C,0xBD,0xD6,0x9A,0x74,0xEE, + + 0xE2,0x6B,0xA2,0xE5,0x57,0xF2,0x67,0x19,0xF6,0x36,0xEB,0x3D,0xDD,0x2D,0xFB,0xA6, + + 0x26,0xF0,0x13,0xE4,0x30,0xF5,0x30,0x24,0x36,0xC9,0xAF,0xE0,0x19,0xC7,0x16,0xB2, + + 0x07,0xA8,0x19,0xEC,0xF2,0x23,0xD8,0x42,0x23,0x54,0x78,0x06,0x65,0xCA,0x95,0xC5, + + 0xBB,0x4D,0x01,0xED,0x1C,0x64,0x29,0x45,0xA9,0x49,0x6C,0x54,0xA7,0xC9,0x9D,0xD5, + + 0xAB,0xB2,0x64,0x25,0x30,0x65,0x27,0x77,0x2A,0x48,0x7D,0x17,0x2C,0xDC,0x11,0x8C, + + 0x2C,0xCA,0x42,0x28,0xD1,0x25,0xCF,0xA8,0x80,0xA9,0x05,0x08,0x6B,0x36,0x3A,0x56, + + 0xF4,0x55,0x4A,0x38,0x31,0x6B,0x7B,0xC4,0xD5,0x0B,0x76,0xBC,0xA5,0x49,0x3B,0xF2, + + 0x8E,0xA0,0x7C,0xFD,0x9F,0xFB,0x80,0xDA,0xB4,0xB1,0x2B,0x3D,0x7F,0x2B,0x55,0xFB, + + 0x8D,0x76,0x1B,0x9A,0x26,0x7E,0x16,0xB3,0xBE,0x3E,0x37,0x7F,0x5A,0x29,0x7C,0x44, + + 0xA9,0x69,0xD2,0x4C,0x1C,0x7D,0x00,0xC6,0xA1,0x28,0x52,0x68,0x11,0xCF,0x32,0x5C, + + 0xE2,0x6E,0x93,0x8C,0xBE,0x24,0x62,0xA8,0x47,0xB2,0x76,0x3E,0xD8,0x2F,0x7D,0x44, + + 0x29,0xA5,0x01,0xED,0xE2,0x8E,0xC3,0xEB,0x4A,0xF6,0x3F,0xED,0x26,0x4E,0x2B,0x76, + + 0x45,0x4D,0xC9,0x2F,0xA8,0xD8,0xCB,0x66,0x9A,0x01,0x0D,0x9D,0x0B,0xB9,0x2C,0xE6, + + 0x01,0x60,0x67,0xC4,0x24,0x0D,0x2F,0x67,0xAA,0x59,0x31,0xB0,0xF7,0x66,0x2C,0xF6, + + 0x02,0x71,0x35,0x06,0x31,0xEE,0x02,0x52,0x81,0x0A,0x9C,0x76,0xF2,0x37,0xBD,0x11, + + 0x07,0x09,0x7A,0xEA,0x6E,0xCD,0x5D,0x98,0x11,0xF6,0xC5,0x3B,0x0B,0x89,0x54,0xD3, + + 0x06,0x08,0x1D,0xFE,0x8D,0xCC,0x1D,0x80,0xBA,0xAC,0x2A,0x91,0x9A,0x7C,0x9B,0xC1, + + 0xDF,0x78,0x04,0xE0,0x37,0x76,0x6B,0x62,0x40,0x64,0xBC,0x62,0x8E,0x35,0x16,0xE4, + + 0x5F,0x0A,0xF4,0x3B,0xCE,0x77,0x3C,0x50,0x3F,0x5A,0xD6,0xF0,0xD0,0x73,0x23,0xB0, + + 0xA1,0x37,0xD1,0x47,0x05,0x53,0x6B,0xB9,0x41,0xD6,0xB5,0x45,0xAC,0x7B,0xF5,0x2F, + + 0xC0,0xF6,0x5D,0x15,0x58,0x53,0xDD,0x30,0x38,0x83,0x8D,0x6C,0x90,0x57,0x4C,0xEE, + + 0x09,0x09,0xBC,0x20,0xCF,0x54,0xAF,0x19,0xCB,0x87,0x16,0xD7,0x7E,0x59,0x2E,0xFE, + + 0xD6,0xB4,0xC6,0x9D,0x1D,0xE5,0x78,0x64,0x6A,0xDB,0xA6,0x53,0x84,0xD8,0x3D,0x7A, + + 0xC4,0x01,0x38,0x16,0x4D,0xAC,0xA2,0x70,0x55,0x34,0xA0,0xCF,0x4F,0x1F,0x99,0xDE, + + 0x77,0x11,0xB4,0xC3,0x64,0x86,0x45,0x43,0x95,0xF4,0xA7,0x8D,0xBD,0xD4,0xD1,0x22, + + 0x8F,0x70,0x7F,0x2E,0x96,0x41,0x86,0xF7,0x44,0xC8,0xAE,0x6E,0x58,0x8E,0x8A,0x23, + + 0x48,0x96,0x0E,0xFD,0xAB,0x30,0x14,0xBE,0x14,0x1D,0xBE,0x5C,0x2D,0xF0,0xA4,0x37, + + 0x0E,0xF3,0xBF,0x3D,0x50,0x8F,0x05,0xF2,0x80,0x1C,0xEF,0xBD,0xF2,0x71,0xD8,0x2A, + + 0x2F,0x92,0x34,0x2D,0x7A,0xCE,0x9F,0xF8,0x7B,0xAA,0xA7,0x7F,0xFE,0xB5,0xE0,0x23, + + 0x9A,0x5F,0xD8,0x7C,0xFF,0xAF,0xEF,0xA2,0xF8,0xD1,0x66,0x2C,0x89,0x5D,0x83,0x55, + + 0x0B,0x5D,0xD0,0xBA,0xE2,0xE0,0xF8,0x6A,0x96,0x1A,0x1F,0xA9,0x3E,0x57,0x95,0x61, + + 0xB7,0x62,0x93,0x2A,0x6B,0x0F,0x80,0x16,0xBF,0x22,0x1E,0xD6,0x02,0xE2,0xED,0xD9, + + 0x3E,0x7C,0x04,0x68,0x08,0xFF,0x8C,0xCE,0xC7,0xB6,0x3C,0x45,0xD3,0x00,0x66,0x5F, + + 0xEF,0x14,0x18,0xAE,0xC5,0xE9,0x71,0x24,0x06,0xDF,0xD7,0xF9,0x3D,0x52,0x10,0xBA, + + 0xA3,0x48,0x2F,0x29,0x35,0x48,0xAC,0xA2,0xC6,0x4D,0x86,0x45,0x3C,0x60,0x19,0x64, + + 0x6F,0x36,0x1E,0x77,0x69,0xE0,0xB6,0x05,0x07,0xA5,0xF0,0xE3,0xB8,0x9D,0x96,0xA3, + + 0x6D,0x26,0xEF,0x5F,0x32,0xBC,0x09,0x9C,0x3F,0x6E,0x79,0x31,0x45,0x43,0x78,0xCE, + + 0x7C,0xCA,0x19,0x40,0xF5,0xF1,0x23,0x04,0x20,0x73,0x6F,0xDF,0xB4,0xEC,0xCE,0xE1, + + 0xB8,0xCB,0x55,0x6C,0x6F,0x76,0x35,0x51,0x69,0x75,0xDB,0x2D,0x29,0x7D,0xB3,0x2A, + + 0x8A,0xCB,0x0F,0x8A,0x27,0x1B,0x52,0xD3,0x50,0x88,0xED,0x1D,0x9C,0xA6,0xBB,0x40, + + 0xA9,0x90,0x47,0x70,0x43,0xF6,0x84,0x60,0x3D,0x31,0x9D,0x02,0x05,0x40,0xB6,0xCE, + + 0x26,0x98,0x15,0xA8,0x3A,0x07,0xC5,0x17,0x48,0x66,0x7C,0x74,0x96,0xF4,0xFC,0x3C, + + 0x82,0xEF,0xFE,0x65,0xBE,0xF2,0xCF,0x0B,0xB7,0x34,0x12,0xF4,0x7D,0x3B,0xDC,0xA9, + + 0xAA,0x95,0x9B,0x4B,0x67,0xEC,0x4F,0x19,0x25,0xC4,0xD4,0x9E,0x42,0x8E,0x0B,0x75, + + 0xEC,0x80,0x5F,0x3D,0x20,0x52,0xCC,0x06,0xC9,0x65,0x84,0x82,0xDF,0xE1,0xE1,0x72, + + 0xB8,0x31,0x0B,0xA2,0x16,0xB3,0x94,0x52,0x9A,0x03,0x14,0xD4,0x16,0xCC,0xAB,0xAD, + + 0x49,0xD3,0x92,0xFF,0x5D,0xBC,0xB9,0xAF,0x9B,0xD1,0x08,0xD4,0xCA,0x0C,0xB3,0x69, + + 0x01,0x9B,0x75,0xA7,0xC8,0x43,0x4B,0xA4,0x1D,0xDD,0x75,0x86,0x76,0xAD,0x67,0xC9, + + 0xA3,0x21,0xD2,0xE4,0x84,0xD0,0x39,0xAF,0x65,0x1E,0x7D,0x96,0x22,0xAE,0x36,0xEC, + + 0xCD,0xF0,0x9D,0xB8,0x91,0xF5,0x26,0x66,0x6E,0x60,0xAE,0xE3,0xD5,0x79,0x01,0xF6, + + 0xA5,0xBD,0x57,0x98,0xDE,0x6C,0x5B,0xE1,0x49,0x91,0x27,0xA5,0x08,0x6C,0x5A,0x21, + + 0xFA,0x92,0x48,0xB8,0x2B,0xEA,0xC2,0x52,0xE0,0xF6,0x0A,0x63,0xB5,0x50,0xC9,0xB1, + + 0xE6,0x87,0xF5,0x43,0xD7,0x48,0x5B,0x57,0x6B,0xDA,0x20,0xA7,0x16,0x48,0xE2,0xCA, + + 0x64,0x6D,0xDD,0x7E,0xBD,0x09,0x35,0xA8,0xB5,0x99,0xCE,0x89,0xC1,0xF7,0x28,0xAF, + + 0xAD,0xE7,0xFD,0xA1,0xB9,0x66,0x98,0x86,0x6B,0x98,0xAA,0xB4,0xDC,0x26,0xB1,0x0F, + + 0xD4,0x57,0xD9,0x89,0xDF,0x9E,0x9C,0xD4,0x39,0x51,0xED,0x1C,0x84,0xB8,0xBF,0x3B, + + 0xB1,0xC8,0x90,0xAF,0x2F,0x04,0x48,0xD9,0x12,0x50,0xE5,0x6B,0x81,0xE4,0x1E,0x48, + + 0x2F,0xE4,0x19,0xBC,0x5C,0x43,0xC2,0x15,0x68,0xFC,0x76,0x3F,0x8A,0x71,0x66,0x96, + + 0x6D,0x92,0x4E,0xB0,0x49,0x12,0x0E,0x3C,0xC5,0x9F,0x2E,0xEA,0xFD,0x51,0x3D,0xCF, + + 0x0D,0x98,0x1C,0xA0,0xC2,0x11,0x50,0x24,0x5D,0x92,0x08,0x11,0x05,0xFD,0x0F,0x9F, + + 0xD3,0x90,0x4B,0xBD,0x40,0x32,0xB3,0x7F,0xEB,0x15,0x0A,0x9D,0x87,0x40,0x60,0x53, + + 0xBE,0x0D,0xD0,0x9A,0xEB,0xDB,0x70,0x7F,0xE3,0xCB,0x91,0x12,0xBA,0x75,0x6B,0xD0, + + 0x47,0x7D,0x3F,0x30,0x6E,0xDE,0x62,0xC0,0x92,0x4E,0x2A,0x0F,0x2E,0x61,0x16,0xFB, + + 0x79,0x6E,0x81,0xC7,0x13,0x64,0x15,0xC3,0x42,0xBE,0x9B,0x13,0x20,0x72,0x36,0x5E, + + 0xD9,0x88,0xB3,0xEB,0x6A,0x38,0x79,0x6E,0x26,0xEE,0xF1,0xF7,0x57,0x96,0x80,0xF5, + + 0x23,0x46,0xCC,0x46,0xCB,0xD9,0x29,0x06,0x63,0xF4,0xAF,0xE6,0x53,0x9B,0xC8,0x96, + + 0x91,0x06,0x1E,0xBB,0xAE,0xDA,0x73,0xF4,0x7C,0x74,0x48,0x06,0xA8,0xEE,0x97,0x10, + + 0xE9,0x72,0xEE,0x3E,0x65,0x8B,0xE6,0x54,0xC4,0xCC,0xE9,0x45,0x73,0x59,0xAA,0xAA, + + 0xFC,0x07,0x25,0xCE,0x92,0xA7,0xEE,0x44,0xC7,0x1F,0xE2,0x4C,0xD5,0x74,0x02,0x25, + + 0xE3,0x4C,0xE4,0x7A,0xEB,0x95,0xDA,0xCA,0xE4,0xE5,0x02,0x33,0x34,0x73,0xAE,0x7A, + + 0x75,0xF6,0xD3,0x9B,0xFC,0x90,0xCE,0x9D,0x0A,0x45,0x82,0x18,0xB0,0x88,0x39,0xB9, + + 0x19,0xA5,0x2F,0x97,0x9B,0x58,0xDF,0xCB,0x75,0xC6,0x14,0x4B,0xB1,0x8B,0x31,0xA5, + + 0x7E,0x0F,0x93,0x99,0xFA,0x64,0x14,0xC7,0x20,0xB3,0xC3,0x25,0xEA,0xB9,0x2A,0x8A, + + 0x8C,0xF9,0x7F,0xB2,0xE3,0xD3,0xD6,0x79,0x26,0x48,0x85,0x0E,0x31,0x63,0xB5,0x2A, + + 0xFC,0x86,0xC2,0x46,0x12,0x99,0x08,0x88,0xFF,0x42,0x83,0x79,0x8E,0x01,0xD3,0xA1, + + 0x98,0x43,0x53,0x53,0xE4,0xDA,0x6B,0x4D,0x48,0x4A,0x55,0x5F,0x2E,0x61,0x3B,0x65, + + 0x8D,0x1C,0x43,0x32,0xBA,0x5D,0x80,0x7B,0xB4,0x4C,0x1F,0x23,0xD5,0x71,0xFC,0x70, + + 0xCA,0x61,0xCF,0x6C,0xCE,0x7F,0x3E,0x70,0xC3,0xD8,0xBC,0x20,0x0B,0xFB,0xB9,0x63, + + 0xAD,0x9C,0x51,0x89,0xCA,0x73,0x7E,0xB4,0x67,0xB2,0x64,0x30,0x0F,0x60,0x7B,0x87, + + 0x41,0x91,0x5E,0xDB,0xCF,0xF8,0x95,0x52,0x2A,0xF9,0x55,0x18,0xCC,0x69,0x75,0x9C, + + 0x21,0x9D,0xC3,0xAB,0xC6,0x6F,0x13,0x40,0x7D,0x41,0xC4,0xD3,0xF7,0x80,0x24,0xC2, + + 0x23,0x19,0x68,0x86,0xB1,0x9F,0x12,0xA2,0xC3,0x58,0xEA,0xB4,0xAC,0xD9,0x59,0xC8, + + 0xA1,0x11,0x92,0x47,0x2F,0xB8,0xFC,0xB2,0xE0,0xFE,0xE2,0xA4,0xAD,0x8A,0x3F,0xA1, + + 0xF6,0x54,0x27,0xC5,0x6A,0xD0,0x2D,0xA3,0x6E,0x5A,0x59,0x7B,0xF3,0x46,0x45,0xB3, + + 0xC2,0x42,0xB3,0x47,0xB5,0xD4,0x35,0x79,0xE5,0x57,0xE3,0xB0,0x25,0xA8,0x96,0x4F, + + 0x2A,0xED,0x59,0x12,0x07,0xC8,0xFE,0x22,0x4A,0x8E,0x87,0x2E,0xB5,0x77,0xCE,0x2D, + + 0x0A,0x5B,0x3D,0x60,0xEC,0xC2,0x76,0x3E,0x95,0x18,0x30,0x4E,0x7F,0xF9,0x03,0xCE, + + 0x29,0x14,0xBD,0x76,0xBE,0x90,0x68,0x54,0xE8,0x54,0x57,0xBD,0x00,0x7C,0xD9,0xF0, + + 0xAF,0xF8,0x91,0x70,0xE5,0xB6,0xF3,0x39,0x15,0x7B,0xB1,0xBD,0xF9,0x7B,0x5E,0xCD, + + 0x49,0xE3,0x73,0x48,0x54,0xC4,0xD7,0x6C,0x2D,0xDC,0x46,0x9E,0x8D,0x83,0x76,0x6A, + + 0x23,0xCD,0xAF,0x7C,0xED,0x82,0x26,0x7A,0x62,0x39,0xE6,0x2C,0x8C,0x72,0x3F,0x4B, + + 0x22,0x1E,0x99,0xC2,0xA8,0x70,0x37,0xA9,0x44,0xD3,0x47,0x6F,0xD8,0x8C,0x75,0x3B, + + 0xAD,0xAD,0x10,0xDD,0x38,0x31,0x67,0xA9,0xE3,0x50,0xBF,0xB9,0xBC,0xF2,0x1E,0x26, + + 0xE5,0xFF,0xB7,0x82,0x26,0x83,0x1A,0x87,0x07,0xCD,0x08,0xD7,0xF7,0x13,0x60,0x26, + + 0x66,0xF5,0xE0,0x02,0xC8,0x3C,0xF6,0x1D,0x46,0x81,0x98,0x26,0x2A,0xFF,0x9C,0x44, + + 0x4E,0xB8,0x99,0xFD,0x19,0x54,0xBA,0xD8,0x0C,0xE8,0x83,0xD8,0x20,0xED,0xBC,0xF9, + + 0x20,0x8A,0x06,0x49,0x6C,0x7F,0xB6,0x56,0x4A,0xC1,0x62,0x3E,0xD3,0xA9,0x26,0x3D, + + 0xA5,0x0F,0x25,0x35,0x13,0xD5,0x2F,0x67,0x35,0xC4,0x8D,0x99,0x35,0x79,0x3C,0x20, + + 0xA4,0x0E,0xE4,0xA5,0x9B,0xA8,0x42,0xED,0xB8,0x48,0x47,0x94,0x0F,0x52,0x99,0x7F, + + 0x80,0x95,0x9F,0x41,0x77,0x05,0xB1,0xA3,0xD3,0xAA,0xE6,0xE3,0xE4,0x55,0xEE,0x6E, + + 0x78,0x57,0x16,0x24,0x96,0xD6,0x9A,0xF1,0x47,0x04,0x1B,0xAC,0xF3,0x8B,0x61,0x55, + + 0xB1,0x74,0xA5,0x0C,0xCF,0x54,0x85,0x2B,0xC1,0xC4,0x4C,0xAC,0x5D,0x0F,0x6D,0x9F, + + 0x0C,0xAB,0xF3,0xDF,0xBA,0xAF,0x9E,0x29,0xC1,0x0F,0x3D,0x4D,0x31,0xA6,0xE3,0xDB, + + 0x5D,0xC8,0x18,0x50,0xB8,0x27,0x5B,0x34,0x48,0x1E,0xE9,0x2E,0x7F,0xF1,0x72,0xCB, + + 0xEE,0xAB,0x82,0x35,0x3E,0x04,0x1D,0x3D,0x03,0x76,0x2B,0xC3,0x55,0x10,0x91,0x46, + + 0xBF,0x57,0x9C,0x48,0xFF,0x0F,0x0A,0x4D,0xB3,0xC3,0xCD,0xE1,0xAF,0xBA,0x88,0xB6, + + 0x0F,0x00,0x92,0x5C,0xBA,0xEC,0x21,0x78,0x34,0xCE,0x6D,0x81,0xB6,0x85,0xC9,0xB6, + + 0x7F,0xF5,0x34,0xBC,0x12,0x53,0xA8,0x69,0xB1,0xDD,0xFB,0x66,0x37,0x66,0x14,0x5F, + + 0xD2,0x1C,0x07,0xDF,0x63,0x8F,0xA6,0x73,0xCB,0x37,0x28,0x81,0xFB,0x81,0xC0,0x06, + + 0x4A,0x2B,0xDB,0x82,0x7F,0x65,0x98,0xE0,0xE7,0x6D,0xB4,0xD4,0x47,0x66,0xAC,0xD4, + + 0xB7,0x35,0x00,0xD4,0xB6,0xF3,0x3D,0x41,0xAF,0x7A,0x2C,0x71,0x77,0x04,0x5B,0xB0, + + 0xCF,0x17,0x49,0x07,0x48,0x92,0x1F,0x73,0x47,0x5A,0x4F,0x4F,0x47,0xBD,0x23,0x89, + + 0x6D,0x5B,0x7B,0x77,0x5E,0x76,0x5A,0xBB,0x31,0x16,0xB9,0xF0,0x74,0xFD,0x05,0x22, + + 0x6A,0x6B,0x04,0xF9,0x12,0xB2,0x1C,0x20,0xE5,0x90,0x8C,0x64,0x54,0x06,0xF7,0xC8, + + 0x03,0x93,0x8C,0x89,0x80,0x08,0x14,0x90,0x41,0x21,0x9C,0x56,0x2D,0x78,0xA5,0xFF, + + 0x2F,0xD4,0x4A,0x28,0x4B,0xB9,0x1D,0xE4,0x65,0xD9,0xCD,0x37,0x0D,0xF9,0xC7,0x15, + + 0x06,0x1E,0x95,0x55,0x6A,0x88,0xAF,0x77,0xEE,0xD3,0x85,0x75,0x77,0x4E,0x01,0x7B, + + 0xB0,0xF8,0xD8,0xB9,0x57,0x1D,0x91,0x9D,0x07,0x7D,0x09,0x9E,0x78,0x57,0x51,0x67, + + 0x2D,0x97,0xFE,0x00,0xC6,0xA5,0xFE,0x0F,0x30,0x72,0x5C,0x4F,0xB7,0xB9,0xCF,0x01, + + 0x8E,0x4C,0xA6,0x0B,0xD2,0x0C,0x97,0x5A,0x0C,0x5A,0x51,0xDD,0x8A,0x55,0x47,0x1D, + + 0x51,0xDA,0x12,0xD5,0x59,0x3C,0x9A,0x23,0x6A,0xCD,0xE1,0x2D,0xBD,0x76,0x62,0x2A, + + 0x0A,0x33,0x5B,0x2C,0xBC,0x40,0xD1,0x5F,0x93,0x27,0xCE,0x3E,0x22,0xFA,0x08,0x13, + + 0x2C,0xAF,0x8E,0x9E,0x82,0x36,0xBB,0x12,0x4B,0x90,0xB0,0xCE,0xFD,0xF5,0xF1,0xB8, + + 0xC2,0xF2,0x9E,0xBC,0xF1,0xB1,0x77,0x15,0xCC,0x6E,0xA7,0x62,0x5D,0xBE,0x35,0xD4, + + 0xC7,0x7E,0xEB,0x3D,0x9D,0x40,0x69,0x4F,0x10,0x9D,0x43,0x80,0x5C,0xBE,0x5E,0xE2, + + 0x04,0xFD,0x84,0x43,0x91,0x2E,0x30,0xAA,0x41,0x20,0xAA,0xD7,0x3C,0xEB,0x98,0xA6, + + 0x07,0x20,0x3A,0x0B,0xFD,0x8E,0xB4,0xAB,0x40,0xC1,0x8C,0x3E,0xF0,0x0F,0xC1,0x20, + + 0x7B,0x40,0x41,0xB0,0xD7,0xF6,0xA6,0x5C,0xE4,0xBF,0x02,0x14,0xBC,0x20,0x32,0x6B, + + 0x22,0x66,0xBF,0x91,0xFF,0xBB,0xA6,0xAA,0x3E,0x02,0xFB,0x34,0xD0,0xC3,0x94,0xBA, + + 0x8D,0xF9,0x8A,0xBA,0xB1,0x29,0x7D,0x93,0xCE,0x49,0xE8,0xB4,0xA5,0x6B,0xCE,0x2F, + + 0xD9,0xFA,0xB0,0xD6,0x12,0xA2,0xC8,0x0F,0x16,0x4E,0xB8,0x35,0xA6,0x68,0x26,0x3F, + + 0x50,0x0E,0x8B,0x58,0xD3,0x2E,0xFD,0xFF,0x82,0xB9,0x65,0x95,0x8E,0x69,0xF2,0xCB, + + 0x74,0x46,0x72,0xB7,0x3F,0xDA,0x5F,0x6C,0x3D,0x47,0xD3,0x71,0x70,0x26,0x3D,0xEA, + + 0x63,0x07,0xDC,0x03,0x1C,0x66,0xCD,0x28,0x6C,0x93,0x25,0x19,0x5E,0x00,0x99,0x9C, + + 0x2D,0xCE,0x55,0x1C,0x9A,0x27,0x64,0x3E,0xA8,0xCA,0x0C,0x7B,0x9B,0x99,0x83,0x76, + + 0x8E,0x4B,0xE2,0xAD,0x4E,0x95,0x17,0xD9,0x7D,0x9B,0x4B,0x3C,0xB4,0xC7,0xCB,0x38, + + 0x5E,0x96,0x6B,0x22,0xBD,0x69,0x35,0xCA,0x45,0x46,0x93,0x4E,0xFD,0x96,0xEE,0x33, + + 0xD4,0xF3,0xBA,0x68,0x9F,0x0B,0x56,0x74,0xB3,0xD4,0x12,0x39,0xFC,0x20,0xE7,0x27, + + 0x96,0x51,0xED,0xA1,0x57,0x63,0x5A,0x79,0x1B,0x0F,0x20,0x3A,0x59,0x21,0x78,0xD7, + + 0x7D,0x4F,0x1C,0x5C,0x9C,0x0E,0x0B,0x78,0x92,0xF9,0x52,0x1F,0xE9,0xDA,0xF0,0x17, + + 0xE0,0x3E,0xBB,0x1B,0x39,0xD1,0x5F,0x2A,0x3E,0x46,0xDA,0x8E,0xAE,0x74,0xAF,0x04, + + 0x2B,0xE6,0xDE,0xC1,0x4C,0x72,0x2C,0x5B,0xED,0xAD,0x23,0xA5,0xFD,0x7C,0xE7,0xB4, + + 0xAE,0x13,0xD6,0x83,0x4D,0x73,0x67,0xF7,0x98,0xD7,0x5C,0x01,0xCD,0x33,0x03,0x59, + + 0xB8,0x16,0x15,0x11,0x11,0xED,0x72,0x5A,0x15,0xC4,0xFD,0x21,0x9E,0xB8,0xBA,0x90, + + 0x2C,0x1F,0x1D,0x2E,0x44,0x3C,0xF5,0xCB,0x23,0x53,0x4B,0xE8,0x9A,0x07,0xFC,0x33, + + 0x21,0x04,0x44,0x01,0x01,0x76,0xC4,0xA2,0xC3,0x58,0x56,0x60,0x39,0x10,0x4D,0xB6, + + 0xC8,0x5F,0xC4,0x7B,0xD2,0x3A,0xFC,0xB2,0xE0,0xFE,0xBE,0xFC,0x72,0x65,0xFD,0x32, + + 0xA9,0x0D,0x8B,0x35,0x96,0x30,0x2D,0xA3,0x6E,0x5A,0x8C,0xC6,0x17,0x18,0x4C,0xB7, + + 0x48,0x7D,0xAD,0x95,0x05,0x3A,0x35,0x71,0xE5,0x34,0x1D,0xDD,0xF3,0x35,0x6E,0x0C, + + 0x46,0x0C,0xDC,0x48,0x44,0x7A,0x1E,0xDB,0xEA,0x94,0x16,0x6A,0xEA,0x7B,0xB8,0x69, + + 0xC1,0x49,0xD4,0x0A,0x45,0x7B,0xA1,0x5A,0x4D,0x75,0xF6,0x7E,0xFF,0x8C,0x3D,0x7A, + + 0x4C,0xB5,0x17,0xAC,0x19,0xE5,0xAF,0xD7,0x4B,0x3F,0x74,0x56,0x87,0x7A,0xCF,0x2C, + + 0x73,0x18,0x1F,0xCE,0x4C,0x34,0x9E,0xFA,0xF1,0x77,0x0F,0xCE,0x8C,0x17,0xD6,0xD6, + + 0x0C,0xE8,0x8C,0x32,0x99,0x31,0x28,0x2A,0xE9,0x52,0xD9,0x57,0xFD,0xFD,0x91,0xF8, + + 0x2D,0x3D,0xC6,0x76,0xCE,0x32,0x26,0x3A,0xCA,0x1E,0x8E,0xF0,0x6B,0xF6,0x93,0x4D, + + 0xE9,0x52,0x8D,0xD0,0x19,0x38,0xF7,0x2B,0x66,0x50,0x47,0x6F,0xD8,0x6C,0x6E,0xE6, + + 0x8D,0x5D,0x7B,0xA2,0x18,0x7E,0x3F,0xB9,0x45,0xD2,0xEA,0x1F,0x57,0xF4,0x58,0x25, + + 0xFD,0x8F,0xE7,0x8C,0x35,0x42,0x4F,0x5D,0xC9,0x76,0x70,0x07,0xA5,0xA2,0x84,0x81, + + 0x1E,0x8B,0xF1,0xB9,0xB0,0x50,0xBA,0x5D,0x26,0x20,0x41,0x4C,0xF6,0x84,0xB1,0x71, + + 0x3F,0xBF,0xF8,0x40,0x31,0x5D,0x39,0x33,0x90,0x15,0x21,0x91,0xD2,0xC3,0x6A,0xE3, + + 0x9A,0xB2,0x51,0x71,0x1A,0x25,0xAA,0xC0,0x41,0x4E,0x86,0xD5,0x28,0xA1,0x44,0xB3, + + 0x32,0x88,0x19,0x80,0xB4,0xE1,0xF4,0x9F,0xB9,0x85,0x92,0x90,0xD3,0xA4,0x4E,0x3A, + + 0x4E,0x21,0x98,0x76,0x31,0x68,0x7C,0x35,0xC6,0xCB,0x31,0x74,0x3C,0x9F,0x3E,0xC3, + + 0xF5,0xF1,0x93,0xC1,0xB0,0xEA,0xE1,0xA4,0xC4,0x33,0x19,0x77,0xF2,0x4D,0x74,0x07, + + 0x7B,0xD6,0x79,0xD3,0xD4,0xEF,0xB9,0xC6,0x80,0x85,0xF9,0x9F,0xB0,0x6C,0xE2,0x2B, + + 0x9C,0x85,0xE0,0x4E,0x4C,0xAE,0x60,0x7C,0xA7,0xAC,0xA6,0xF0,0x5A,0xA9,0x85,0x60, + + 0xD0,0x35,0xAE,0xFC,0x39,0x24,0x70,0x7E,0xCF,0x05,0x81,0xDC,0xF1,0x54,0x58,0xF9, + + 0xAD,0x5A,0xAF,0x08,0x3D,0x22,0x0B,0xD4,0xE8,0x88,0x41,0xAB,0xF8,0x9B,0x16,0x40, + + 0x8B,0xB3,0xF2,0xB0,0x3A,0xEA,0x83,0x59,0x3E,0xAE,0xC3,0x1B,0x52,0xE9,0xD1,0x63, + + 0x0A,0x14,0x82,0x18,0xBB,0x71,0xA4,0x3B,0x25,0xB8,0x2D,0x88,0x4E,0x67,0x50,0xFF, + + 0xB0,0x26,0x2A,0x12,0xD5,0xA4,0x99,0x81,0x30,0xCD,0xB4,0x98,0x6C,0x05,0x2F,0x6D, + + 0x9A,0xE9,0x9B,0x68,0x63,0xA1,0xF3,0xAD,0x5C,0xCD,0x0C,0x89,0x3F,0xF5,0xE4,0x5B, + + 0xBC,0x4F,0x6F,0xE0,0x93,0xCF,0x13,0xB9,0x49,0x3A,0x03,0x5B,0xEC,0xCA,0xC7,0x79, + + 0xD8,0x67,0x34,0x04,0xBC,0x68,0x36,0xA1,0x27,0xD0,0xD2,0xDB,0x75,0x90,0x1F,0x28, + + 0xA6,0x9F,0x6C,0x46,0x96,0xB7,0x10,0x22,0xEC,0x83,0x70,0x65,0x73,0x5B,0x96,0x3D, + + 0x5C,0x25,0x9D,0xD7,0x34,0xBD,0x19,0x2A,0x6D,0x60,0xE5,0xAF,0xA0,0xB0,0xCD,0xAC, + + 0x81,0x3E,0x89,0xCB,0x14,0xBA,0xB5,0xFC,0x86,0xD3,0x5D,0x33,0xF8,0xD2,0x60,0xD9, + + 0xDA,0xF7,0xDE,0x38,0xC3,0x35,0x0C,0x60,0x67,0x93,0xC4,0x04,0x52,0x7F,0xA0,0x56, + + 0x23,0x5F,0x3C,0x2C,0xCE,0x3C,0x44,0x22,0x3B,0x5D,0xEC,0x14,0x53,0xF3,0xA5,0x13, + + 0x10,0xD4,0xF6,0x3C,0x57,0x35,0x4D,0xB3,0xEE,0xD9,0xC0,0x05,0x5A,0x7D,0xBE,0x23, + + 0x02,0x66,0x69,0x24,0x33,0x23,0x4D,0x11,0x65,0xDF,0xF5,0xC0,0x56,0x28,0xB9,0x65, + + 0xD5,0xE9,0xA5,0xFD,0x1F,0xD6,0x36,0xEE,0xF1,0x93,0x76,0x7F,0x15,0xBF,0x91,0xDD, + + 0xB3,0xC4,0x6E,0x4A,0x7D,0xBD,0x62,0xBA,0xE4,0x7A,0xB8,0xC2,0x59,0xF4,0xDA,0xF9, + + 0x82,0xC5,0xC5,0xFF,0xBF,0x1A,0x37,0xAB,0xE5,0xA6,0x36,0x8F,0xEC,0xBA,0x35,0x99, + + 0x1E,0x10,0x14,0x9B,0xB2,0xBD,0x3F,0x7C,0xEF,0x2E,0xA9,0xDD,0x06,0x76,0x18,0xCC, + + 0xCF,0x1F,0x42,0xB1,0x9D,0x6C,0x06,0x94,0xCD,0xB9,0x96,0xAE,0x92,0xF1,0x95,0x2A, + + 0x82,0x6C,0x8E,0x9F,0xC6,0xB0,0x76,0x4D,0x8E,0xD2,0xF6,0xFB,0xF0,0xF9,0x4A,0x38, + + 0x22,0x93,0x14,0x4F,0x03,0xFF,0xC8,0x09,0xCA,0xD8,0x5B,0x71,0x73,0x08,0x11,0xDD, + + 0x4E,0x1C,0xA5,0x21,0x1C,0xDA,0x1F,0xBB,0x09,0xD2,0xFB,0xB8,0xFC,0xF0,0x90,0x82, + + 0x05,0x5A,0xD9,0x20,0x9F,0x22,0x80,0x52,0xBF,0xCB,0x94,0xC6,0x74,0xFB,0xC2,0xF2, + + 0x83,0x49,0xE0,0x14,0x7A,0xC5,0x4C,0x52,0xB6,0x2D,0x85,0x1A,0x60,0x9A,0x3B,0xE3, + + 0x02,0x4A,0x36,0x04,0x1D,0x2E,0xE9,0x1C,0xC6,0x51,0xB5,0xDC,0x51,0x17,0x29,0x73, + + 0xC2,0xF8,0x8D,0x15,0x12,0x2D,0xDD,0xD3,0x9D,0xB4,0xF8,0xC9,0x4D,0x23,0x19,0xD9, + + 0xA5,0x45,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0xB7,0x22, + + 0xA0,0xF8,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x21,0x01, + + 0x2C,0x0B,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x31,0x75, + + 0x85,0x15,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x7A,0x2F, + + 0xA9,0x82,0x62,0x33,0x3C,0x44,0x93,0xCB,0x4C,0xB0,0xDA,0xD7,0xDA,0x20,0xC6,0x2F, + + 0x76,0x0B,0xAD,0x8A,0x5B,0x8D,0x20,0xC2,0x94,0xD4,0x4A,0x78,0xFA,0x0C,0xF8,0xEB, + + 0xAC,0x48,0xDE,0x12,0x75,0x31,0x36,0x77,0x35,0x96,0x33,0x5F,0x7B,0x6C,0xD0,0xB6, + + 0x8F,0xFB,0x14,0xFF,0x79,0x94,0xB4,0x62,0x3C,0xF7,0xE3,0x39,0x92,0xEA,0x42,0x68, + + 0x5E,0x6C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0xED,0xFC, + + 0x0D,0x87,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x83,0x88, + + 0xA3,0x4F,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x60,0x66, + + 0xAD,0x4F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x5F,0xA4, + + 0xAF,0x12,0x24,0x77,0xBC,0x8D,0x60,0x84,0xE7,0xF7,0x54,0xE8,0xB4,0x7D,0x04,0xA6, + + 0x80,0xBE,0x43,0x64,0x3D,0x3E,0xCE,0xF6,0xCB,0x10,0x0C,0x73,0x98,0x0B,0xB2,0x80, + + 0x2D,0x14,0xFD,0xA1,0x32,0x7A,0xBD,0x07,0xE6,0x98,0x6E,0x82,0x51,0x8D,0x9E,0x82, + + 0x7E,0xE2,0x4D,0x80,0x30,0x35,0xA2,0x80,0x40,0xF2,0xFB,0xD8,0x92,0x77,0x9B,0xD0, + + 0x24,0x9E,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0xCA,0x23, + + 0x50,0x54,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0xB4,0xE5, + + 0x5F,0x97,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xE6,0xB7, + + 0xDC,0xC9,0x0E,0x8B,0x5B,0xB8,0x2E,0x98,0x77,0x1A,0xEF,0xDD,0x6F,0x6E,0x75,0x01, + + 0xD4,0xA8,0x15,0x74,0xE1,0xF6,0x43,0x50,0x32,0x19,0xC4,0xB9,0xDA,0x7F,0xB0,0xB4, + + 0x8C,0x97,0xFF,0xA9,0x59,0x95,0x50,0x17,0xEE,0xDA,0x07,0x2F,0xF9,0x02,0x71,0x9F, + + 0x48,0xC8,0xEF,0xDD,0x07,0x34,0x1D,0x9A,0xEF,0x51,0x97,0xF1,0x18,0x74,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0xA6,0x86, + + 0x6C,0x0B,0x60,0xC6,0x69,0xE1,0xF0,0xF3,0x2E,0x50,0x0F,0xE1,0x8E,0xE8,0xA9,0xEA, + + 0x01,0xB2,0x28,0xF4,0x97,0xE2,0x06,0x4F,0xC8,0x47,0x28,0x71,0xAC,0x17,0x71,0x97, + + 0x88,0xC0,0xC1,0x43,0xEF,0x29,0x42,0x0E,0x6B,0x83,0xB3,0x58,0x0E,0x1D,0x3F,0x97, + + 0x8A,0x2D,0xA3,0x93,0xD5,0x0F,0x3F,0xF3,0xC9,0x4E,0x46,0x13,0x09,0xA7,0xE9,0x47, + + 0x83,0x75,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x31,0x9C, + + 0xA0,0xC4,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0xCD,0xB3, + + 0x96,0x70,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x39,0x63, + + 0xC3,0xC5,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xD2,0x06, + + 0xE5,0x51,0xE4,0xDF,0x57,0x02,0x12,0x3E,0xA5,0x31,0x11,0x29,0xE1,0xE1,0xEA,0x57, + + 0xCC,0xCB,0x05,0x6C,0x61,0x56,0xC5,0x1E,0x4B,0xE9,0x0E,0x3C,0xB2,0xA8,0x7B,0x06, + + 0xC6,0x53,0x33,0x50,0xFD,0xCA,0x21,0xC4,0x41,0xA8,0x31,0xA2,0x25,0xE5,0x65,0x9D, + + 0x8B,0x78,0x91,0xAF,0xBB,0x5F,0x1C,0x7D,0x6F,0x85,0xE2,0x31,0x9B,0x26,0x64,0xC7, + + 0x08,0x24,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0xB5,0x4E, + + 0x09,0x07,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x09,0x6F, + + 0x0B,0xA9,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x9A,0x7F, + + 0x0A,0xA8,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x5A,0x85, + + 0x85,0x01,0xA6,0x64,0xB3,0xE5,0xC2,0x26,0x71,0x76,0x24,0x24,0xA9,0x7F,0x83,0xE8, + + 0xF8,0xD0,0x96,0x74,0x17,0x4E,0x65,0x0D,0x6D,0xB1,0x61,0xB7,0x71,0x09,0x5E,0xF8, + + 0x87,0xBD,0x35,0x05,0x96,0xD2,0x6D,0xA6,0xE0,0xB8,0x8F,0x45,0x68,0x18,0x74,0x9D, + + 0x40,0xFF,0xD2,0x15,0x97,0xD3,0xFD,0x62,0x86,0x92,0x21,0x35,0x28,0x7C,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x44,0x16, + + 0x2F,0x08,0xFC,0x8F,0x9F,0xF9,0xF6,0x6A,0x82,0x9A,0xEC,0xAF,0xDF,0x5C,0xEE,0xD6, + + 0xE9,0x44,0xE4,0x65,0x9E,0xBF,0xC9,0xBF,0x61,0x99,0x22,0xCC,0x4E,0x29,0x7E,0x85, + + 0x49,0x5A,0xC7,0xCE,0x49,0xB7,0xBE,0x38,0xCD,0xBA,0xFF,0x7A,0xF8,0x02,0x57,0xBC, + + 0x50,0x94,0xA3,0xE4,0x1C,0x33,0x71,0x4B,0xEB,0xB1,0x47,0x57,0x29,0x34,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x90,0xE4,0xA8,0x30, + + 0x85,0x31,0x40,0xA1,0x4B,0x24,0x49,0xF3,0xE7,0x25,0xF0,0x26,0xCE,0x6D,0x32,0xF8, + + 0xF0,0x4E,0x5C,0x4A,0x82,0x1E,0xA0,0xCB,0x72,0xF6,0x35,0x5D,0xF2,0xEC,0xA9,0x29, + + 0x05,0xE3,0x87,0x42,0xBE,0xFE,0x29,0xC9,0x03,0x0D,0xDB,0x38,0x90,0x64,0x08,0xF7, + + 0xB2,0x26,0xD4,0x36,0x3E,0xFE,0xD9,0x94,0x73,0x58,0x66,0x4A,0xA2,0x63,0x80,0xE5, + + 0x07,0x02,0x48,0x74,0xF3,0x2B,0x30,0x24,0x05,0xCF,0xD7,0xE0,0x7C,0xEE,0xC0,0xD2, + + 0x0A,0xBA,0x7C,0x44,0xB0,0x23,0x91,0x92,0xC1,0x0D,0x65,0xF6,0x56,0x87,0x4D,0xB2, + + 0x84,0x65,0x75,0xA7,0x10,0x2E,0xD5,0x83,0x40,0x0E,0x0E,0x15,0xD4,0x0C,0x89,0xF4, + + 0x86,0x01,0x41,0x39,0x72,0x28,0x41,0x81,0xBC,0x48,0xE1,0x8A,0x12,0x05,0xF8,0xE0, + + 0xC6,0xC3,0xC7,0xEB,0x2B,0xD0,0x7C,0x4E,0x7B,0xB0,0x4F,0x2D,0x38,0x0E,0x53,0x93, + + 0xEE,0x12,0x75,0xDB,0x2A,0x4C,0x37,0x59,0xE8,0xD6,0x63,0xB8,0x51,0x3F,0x83,0x01, + + 0xEF,0x10,0x3B,0xF3,0x88,0x67,0xD3,0x8C,0x7A,0x4C,0xEE,0x57,0xBA,0x6E,0xEC,0x2F, + + 0xB4,0xA6,0x33,0x82,0x6C,0xA2,0x7B,0x3B,0x6D,0x46,0xE0,0xED,0x95,0x62,0x4E,0x4E, + + 0xAB,0x84,0xA2,0x0D,0x9E,0x21,0xE6,0x98,0xB5,0x43,0x16,0xBC,0x56,0x6F,0x9E,0xD6, + + 0x48,0xB2,0xCE,0xD8,0x35,0x7B,0x10,0xC7,0xE8,0x4B,0xDE,0xF8,0x75,0x15,0xC3,0xAB, + + 0x6B,0x4C,0xC9,0x49,0x39,0xA5,0x33,0xC9,0x76,0x43,0xEB,0x79,0x58,0x26,0x33,0xDB, + + 0x8E,0x56,0x81,0xA6,0x9D,0x4C,0xD3,0xBC,0x6A,0xC7,0x64,0x2F,0xD5,0x0D,0xD4,0xF3, + + 0x49,0x91,0x03,0x75,0x93,0x60,0xC0,0xFE,0x4E,0x8C,0x94,0x20,0x78,0x17,0xAB,0x72, + + 0xC1,0xEE,0x21,0xE8,0x92,0x37,0xE0,0xCE,0x7B,0x3E,0x27,0x11,0x86,0x8C,0xFE,0x7E, + + 0x49,0x3B,0xB7,0xB5,0xA4,0x34,0x7C,0x4A,0xDB,0x85,0x2A,0x94,0x51,0x8D,0x54,0x7A, + + 0x48,0x1C,0xAD,0x0F,0x10,0x35,0x44,0x0A,0x44,0xAC,0x8F,0x35,0x1A,0x08,0x84,0xA2, + + 0x63,0x54,0x94,0xF1,0x91,0x32,0x34,0xA4,0xEA,0x59,0xB4,0xA0,0x2A,0x36,0x34,0x52, + + 0x26,0x94,0xB3,0x36,0xB1,0x1D,0x0C,0xDF,0xC2,0xDF,0x96,0xDE,0x8E,0xD4,0x3D,0xA3, + + 0xE3,0x96,0xC9,0xAB,0x13,0xBC,0x1F,0x1A,0x41,0x50,0x01,0xA8,0xD6,0x34,0x17,0xD0, + + 0x00,0x11,0xF0,0x51,0x9D,0x7F,0xAA,0x13,0x61,0x1F,0xE5,0xC5,0x87,0xD8,0xFE,0x80, + + 0xD5,0x57,0x2B,0xF1,0x9B,0x35,0x17,0xCE,0x5B,0x1D,0x2D,0x1C,0xC6,0xD7,0xE0,0x75, + + 0x35,0x94,0x8C,0xE3,0x78,0x30,0xE6,0xC3,0x96,0x42,0x38,0xCE,0xDA,0x7F,0x97,0x75, + + 0x7D,0xE1,0x78,0x5D,0x1B,0x31,0xB8,0x4F,0xF8,0xA7,0x4E,0x89,0x7A,0x32,0x70,0x1D, + + 0xE2,0xCE,0xF7,0x1F,0x39,0x6D,0x2F,0xCB,0x4E,0x4B,0x93,0xC3,0x58,0xF1,0x4E,0xAF, + + 0x89,0x1A,0xA6,0x88,0x3E,0x31,0x4E,0x18,0x6B,0x53,0x76,0x9E,0x18,0xD4,0x2E,0x98, + + 0x85,0x12,0x46,0xC8,0x9A,0xB7,0x9E,0x28,0x63,0x5B,0x25,0x0C,0x73,0x1B,0x4F,0xEE, + + 0x4B,0x11,0x8D,0x36,0x19,0x38,0xE3,0x19,0xE6,0x51,0xA9,0xEA,0x1B,0x18,0x2F,0x99, + + 0x0D,0x12,0xB0,0x3F,0x39,0x77,0x57,0x7D,0x4A,0xD5,0x20,0x8F,0x00,0xC2,0xBD,0x45, + + 0xC6,0xC3,0x80,0xF5,0xB7,0xB2,0x28,0xA6,0x42,0xA3,0x32,0x5C,0xB7,0xE9,0x12,0xE1, + + 0x76,0x9A,0xD0,0x56,0x5D,0x7C,0xEC,0x6C,0x6B,0x1D,0x21,0x0B,0xBE,0xA5,0x69,0x07, + + 0xE3,0xC1,0x19,0x77,0x14,0x04,0x7E,0x21,0x8C,0xAE,0x31,0xE1,0xA0,0x69,0xC8,0xE5, + + 0x00,0xD2,0x51,0x1F,0x68,0xEC,0x50,0xD8,0xFE,0xC9,0x83,0x87,0x48,0x4C,0x3A,0x43, + + 0xA5,0x82,0x17,0x16,0x17,0xAB,0xF0,0x80,0xE7,0x4C,0x34,0xB6,0x5E,0xE7,0xE8,0xB0, + + 0xA6,0x0D,0x88,0x12,0xDB,0x2E,0x65,0x82,0x4F,0xCA,0xFE,0xF2,0x79,0x9D,0x69,0xC6, + + 0x27,0x0E,0xD9,0x97,0x29,0xA9,0x75,0x81,0x44,0x8E,0xC9,0x73,0x54,0xAE,0x6B,0xB1, + + 0x05,0x8F,0xED,0xB5,0x15,0xA4,0x19,0x37,0xB6,0xC8,0x99,0x33,0x91,0xEA,0x7B,0x85, + + 0xEB,0x93,0xC2,0x0C,0xD2,0xA5,0xCE,0x54,0x56,0xA7,0x16,0x54,0xFF,0x18,0x73,0x84, + + 0xEA,0xC5,0xB4,0xFC,0x9F,0xAD,0x22,0xBE,0x4B,0xAA,0xA6,0x01,0x74,0x32,0x9A,0xED, + + 0x9C,0xC5,0xE9,0x12,0x1E,0xD6,0x53,0x29,0x64,0xC7,0x44,0x3F,0x1B,0x48,0x38,0xF3, + + 0x57,0x40,0x4D,0x7D,0x5C,0x21,0x74,0x39,0x85,0xA7,0xBB,0x04,0xB4,0x70,0xA2,0x28, + + 0x4F,0xAC,0xE4,0x3C,0xBD,0xAA,0x12,0x2E,0x72,0xC3,0x0D,0xCE,0xFF,0x2C,0x7A,0xB8, + + 0xAE,0x05,0xBA,0xC7,0xBC,0xAB,0x40,0x98,0xCD,0x85,0x2E,0x33,0xA2,0x81,0x1B,0x6C, + + 0x2F,0x06,0xB3,0xE6,0x3D,0xA8,0xE3,0xE9,0xCB,0x57,0x93,0x2B,0xC6,0xAC,0x63,0xB9, + + 0x0D,0x87,0xBB,0x52,0x3C,0xA9,0x66,0xFF,0xE1,0x1C,0x3F,0xDF,0x7E,0x2F,0x1E,0x00, + + 0xBD,0x30,0x9C,0xD4,0x77,0x40,0x8B,0x44,0xE6,0xD4,0xCB,0x44,0xF6,0xD8,0xBF,0x7A, + + 0xE2,0xDE,0xD4,0x14,0xB5,0xE7,0xFC,0x17,0x3E,0xD5,0xC4,0x34,0x7C,0x3E,0x5D,0xC5, + + 0xD8,0xDE,0xA7,0x05,0x29,0x7B,0x07,0xC1,0xC5,0x90,0x4D,0xC5,0xB7,0x4D,0x4D,0xDC, + + 0x86,0x9C,0x95,0x47,0xE9,0x33,0x3B,0xF4,0xCB,0x0F,0x85,0x67,0x0E,0xFC,0x2E,0xDF, + + 0x67,0x95,0x65,0xA4,0x75,0x0B,0x89,0x00,0xC7,0x5E,0x58,0x75,0x0B,0xFE,0x57,0x30, + + 0x8B,0x28,0xD4,0x06,0xCC,0xBA,0x36,0x4D,0xC4,0xD8,0xA6,0xD6,0x0F,0xB7,0x1D,0x41, + + 0xA7,0x91,0x9D,0x45,0xB3,0x66,0x0A,0x01,0x4A,0xDB,0x33,0x63,0xD8,0x93,0x15,0x51, + + 0xA6,0x75,0x8D,0x93,0xBF,0xF5,0x37,0x2C,0x44,0xD1,0x29,0xBC,0xF1,0x94,0x46,0x88, + + 0x79,0x95,0xC6,0xC1,0x51,0xB7,0xE2,0xF4,0xFF,0xE7,0xD6,0xEF,0x8B,0xF5,0x7E,0x9E, + + 0x05,0x37,0x84,0x4E,0x61,0x39,0x7B,0x5D,0xEF,0xDD,0xB2,0xC5,0x7B,0x9A,0xE3,0x0D, + + 0x8E,0x9B,0xC7,0x8D,0x22,0xB7,0x6A,0x8C,0x43,0x07,0xFD,0x54,0x5F,0xFC,0x4F,0x99, + + 0x3F,0x96,0xCF,0xD0,0x8C,0xB4,0x8B,0xD9,0xCC,0x99,0xF5,0x3D,0xF4,0xD4,0xD9,0x28, + + 0xAC,0xD4,0x32,0x1E,0xBC,0xF4,0x7E,0x6E,0xCF,0x56,0x42,0x9D,0x03,0x4D,0x16,0x58, + + 0x2A,0x99,0x8E,0x9A,0x27,0xFF,0x34,0x15,0xCC,0xD0,0xD3,0xE7,0xFF,0x90,0x43,0xA9, + + 0xEF,0xBE,0xE1,0x4B,0x90,0x34,0x8C,0x09,0x42,0xD3,0xE5,0xCF,0xF8,0x9D,0x57,0x8B, + + 0x2F,0x90,0x3B,0x0F,0x3D,0xF7,0x35,0x00,0x4C,0xD9,0x6F,0x8D,0xCC,0x0D,0xF8,0xA0, + + 0x58,0x90,0x4F,0x66,0x51,0x00,0x49,0xB4,0xE5,0xBF,0xA8,0x74,0x54,0x6F,0xA4,0x82, + + 0x4B,0x09,0xB0,0x44,0x10,0x2E,0x50,0x74,0x47,0x22,0x25,0xB6,0x3F,0xE0,0x61,0x56, + + 0x45,0x0F,0xF9,0x87,0xB2,0x57,0x2F,0x80,0x4D,0xB4,0x4E,0xCB,0xD6,0x08,0x8D,0xE1, + + 0x89,0x4C,0xE9,0xB5,0xD9,0x2E,0x07,0x76,0x03,0xE1,0xA3,0xD7,0x7D,0xE8,0x20,0x6F, + + 0x14,0x09,0xCA,0x40,0xB1,0xD3,0x68,0x64,0x0A,0x55,0xA8,0x43,0xF1,0xDF,0x70,0xE2, + + 0x29,0x75,0x58,0x2A,0x6F,0xDA,0xDE,0x50,0xE2,0x05,0xF8,0xF0,0x10,0x8F,0x33,0xE8, + + 0x80,0x63,0x3E,0x40,0xED,0xD9,0xEE,0x33,0xCC,0xCC,0xD7,0x98,0xC4,0xBD,0xFD,0x33, + + 0x61,0xA4,0x59,0xA8,0xF2,0x65,0x5F,0x58,0x08,0xA6,0x66,0x87,0x93,0x61,0x52,0x8C, + + 0x47,0x4A,0x88,0x04,0xBB,0x4D,0x5A,0x39,0x4E,0x2B,0x6D,0xCE,0xF4,0xE3,0x32,0x29, + + 0xA8,0x88,0xDA,0x11,0xB8,0xA3,0xB6,0xAA,0x75,0x43,0x65,0xDE,0xDB,0x6A,0x49,0x23, + + 0x75,0xAB,0xD9,0x10,0x3B,0x2C,0xCF,0x2B,0xCE,0xB7,0x15,0xCF,0x74,0xE1,0xD9,0xEA, + + 0x0D,0x86,0xF3,0xFF,0x1B,0x28,0x5B,0x07,0xE7,0xEB,0x0B,0x4F,0x7A,0x6D,0xC0,0x6F, + + 0xAB,0x85,0x0E,0x23,0x98,0x64,0xEF,0xEA,0x43,0x73,0xF2,0xF1,0xF9,0x2D,0xB1,0x7C, + + 0x89,0x29,0x80,0x41,0x3F,0xA0,0x56,0x83,0x4D,0x2E,0xDA,0x7C,0x5B,0x6D,0x48,0x29, + + 0x8E,0x0A,0x05,0x2F,0x65,0xA2,0x93,0xCC,0xD7,0x48,0xD3,0x6D,0xDA,0x6E,0x43,0xA9, + + 0xB1,0x00,0xB5,0x68,0x19,0x2B,0xD6,0x88,0xA7,0x1F,0xDB,0x7D,0xDB,0x6F,0xF9,0x70, + + 0xDB,0xB1,0xFD,0x66,0xB2,0xD3,0x0A,0x24,0x4E,0x3B,0x90,0x19,0x43,0xB6,0x32,0x31, + + 0x49,0xE8,0xF4,0x16,0x34,0x38,0x1A,0x11,0xE1,0x4C,0xDC,0xD6,0x8E,0xF8,0x51,0x05, + + 0x8E,0x7C,0x51,0xE7,0xF3,0xCC,0x6B,0xA6,0x1D,0x5D,0x4F,0xED,0x72,0x07,0x1F,0x6A, + + 0xA7,0x70,0xB7,0x77,0x1D,0x3C,0x8D,0x33,0xE0,0x31,0x17,0x55,0xE4,0x75,0x3A,0xC6, + + 0xC3,0x97,0xC1,0xE1,0x34,0xFE,0x1E,0x1E,0xC1,0xAF,0xD4,0xE4,0x72,0x74,0x34,0xAF, + + 0x00,0x48,0xAE,0xD0,0x30,0xB5,0x25,0x90,0x6B,0xA5,0xDC,0xF4,0x73,0x75,0x65,0x32, + + 0x2E,0xCB,0xC7,0xB6,0xDE,0x5A,0xAA,0x92,0xD2,0xDC,0xD5,0xE5,0xF2,0x76,0xDD,0xA3, + + 0x48,0x06,0xCB,0xE0,0x33,0x09,0x63,0xDD,0xA0,0x48,0xDD,0xF5,0xF3,0x77,0xEA,0xB7, + + 0x0A,0xCD,0xE6,0xC8,0x6F,0xB8,0x2E,0x78,0x93,0x57,0x23,0x28,0xD9,0xA7,0x19,0x70, + + 0x21,0x5B,0x0E,0x7E,0xBB,0x71,0xCA,0x07,0x2A,0x26,0x2B,0x2C,0xD8,0x80,0x90,0xB2, + + 0xDC,0x8F,0xFF,0xAA,0x19,0xB2,0x2F,0x79,0x57,0x18,0x28,0xD1,0x07,0x7C,0x0D,0xCC, + + 0x75,0x18,0x56,0x6D,0xB1,0x34,0x67,0x3B,0xCB,0x59,0xC7,0x10,0x7B,0x0E,0x38,0xE1, + + 0xC1,0x4D,0x06,0x90,0x3B,0x38,0x4E,0xEC,0x36,0xAC,0xD6,0xEC,0x7A,0x7C,0xC2,0xBA, + + 0x68,0xC2,0x40,0x24,0x87,0x86,0x46,0xE0,0x8A,0x82,0xDE,0xFC,0x7B,0x7D,0x39,0xE4, + + 0x28,0x56,0x7E,0x31,0x3A,0xC5,0x69,0xC0,0xA9,0x41,0xD7,0xED,0xFA,0x7E,0x37,0x5B, + + 0xA2,0x40,0x8F,0x30,0x01,0x7D,0x61,0xD4,0xA8,0x40,0xDF,0xFD,0xFB,0x7F,0x72,0x53, + + 0xEF,0xE4,0xE4,0xF6,0x4E,0xE2,0xE4,0xD2,0x87,0x11,0xB8,0x6E,0x14,0xEF,0x78,0x0C, + + 0x79,0x35,0x62,0x64,0xB6,0xA7,0x16,0xC1,0xC9,0x3C,0xDE,0x44,0xAA,0xA1,0xE1,0x13, + + 0x4C,0x76,0x75,0xBB,0x16,0xEA,0x4F,0x25,0x25,0x41,0x8B,0xD8,0xD2,0x68,0xBA,0x09, + + 0xFD,0x0E,0x21,0xDB,0x36,0xA5,0x41,0x22,0xEF,0xC7,0x75,0x57,0xD3,0x6A,0xD4,0xB2, + + 0x2C,0x8B,0xE8,0xB6,0xE9,0xAB,0xB0,0x17,0x1E,0xC7,0xF0,0x66,0x56,0xE4,0xDC,0xA2, + + 0x56,0x8A,0x90,0xD2,0x39,0x50,0xC7,0x20,0x49,0x4F,0xF8,0x76,0x57,0xE5,0xD5,0xB3, + + 0xEC,0x89,0xDB,0xC5,0x16,0x4E,0x49,0x67,0x8E,0x97,0xF1,0x67,0xD6,0xE6,0xDD,0xA3, + + 0xA2,0x88,0x32,0x35,0x91,0x87,0xFF,0xD3,0x66,0x87,0xF9,0x77,0xD7,0xE7,0x5C,0xAB, + + 0xE5,0xAB,0x2A,0xFB,0x7F,0xD9,0x9D,0x58,0xA7,0xEB,0x9D,0xD3,0x3B,0x33,0x7E,0x69, + + 0x2F,0x03,0x92,0xCE,0xD0,0x21,0x04,0x9B,0xC0,0x3F,0x67,0x3F,0x5B,0x8A,0x8F,0x98, + + 0xF1,0x80,0xDB,0x8D,0xBD,0x5B,0x6A,0xBF,0x69,0x35,0x33,0x2B,0xD3,0x02,0x2F,0xE4, + + 0x70,0x0B,0xAA,0xFD,0x3C,0x21,0x73,0x27,0xCB,0xA8,0xCF,0xC3,0x5E,0xA9,0xD6,0xBA, + + 0x0C,0x83,0x35,0x08,0x06,0x77,0x74,0x47,0x85,0x2D,0xF2,0x6E,0x5E,0xEC,0x0A,0x0A, + + 0xF4,0xEB,0x9F,0xDA,0x5C,0x47,0x42,0xAA,0xB8,0xC2,0xFA,0x7E,0x5F,0xED,0xBC,0xCF, + + 0xD0,0x73,0x56,0xB2,0x9C,0x15,0xCE,0xE9,0xC7,0xF1,0xF3,0x6F,0xDE,0xEE,0x90,0xAB, + + 0x8F,0x7E,0x54,0x3F,0xD9,0xAE,0x1B,0x3A,0x34,0xC2,0xFB,0x7F,0xDF,0xEF,0x87,0xBF, + + 0xFC,0x41,0xC4,0xC2,0x0F,0xBF,0x6E,0xBF,0xC7,0xD6,0xF0,0xC4,0x8B,0x79,0x0C,0xD8, + + 0xC4,0x3E,0xD4,0x14,0x30,0x6A,0x44,0xE2,0x29,0xDE,0x09,0x33,0xD4,0x2E,0x06,0xBA, + + 0xEC,0xB1,0xC5,0xC3,0xCB,0x3F,0x65,0x8D,0x45,0x58,0x39,0x47,0xD2,0xF4,0xFD,0x60, + + 0x8B,0x48,0xAF,0x75,0x37,0xFB,0x5D,0x13,0xAF,0x58,0x02,0xCB,0x0A,0xF5,0x5C,0x12, + + 0xDD,0x9B,0x6B,0x57,0x30,0xAD,0x6C,0xF7,0x11,0xB4,0xF4,0xE6,0x76,0xF4,0x66,0xD6, + + 0x84,0x93,0xDA,0xB4,0xB5,0xB1,0xEC,0x8D,0x06,0x95,0xFC,0xF6,0x77,0xF5,0x05,0x82, + + 0x1D,0x9B,0xE5,0xE3,0x34,0xB2,0x55,0xE6,0x99,0x29,0xF5,0xE7,0xF6,0xF6,0x61,0x2D, + + 0x06,0x1D,0x2C,0x35,0x35,0xB3,0x65,0xF6,0x1A,0xDC,0xFD,0xF7,0xF7,0xF7,0x08,0x77, + + 0xDA,0xE3,0x86,0xEC,0x7F,0x46,0x32,0x48,0xEE,0xDB,0x03,0x3F,0xDD,0x01,0x60,0xA4, + + 0x0F,0x29,0x96,0x4E,0x82,0xB6,0x5E,0x1A,0x3D,0x52,0x05,0x48,0x86,0x02,0x34,0x72, + + 0x53,0xD8,0xDF,0x0D,0xD2,0xD9,0xF3,0x5B,0xA0,0xD5,0xEF,0x8A,0xCF,0x3C,0x7D,0xE9, + + 0x46,0xB8,0x97,0xCF,0xB5,0xB4,0xBB,0x59,0x6F,0x93,0xBB,0x3B,0xB3,0x7E,0x19,0x28, + + 0xAC,0xB4,0x54,0xAC,0xBC,0xB8,0xF0,0x68,0x67,0xE3,0xF6,0xEE,0x7E,0xFC,0x16,0x2B, + + 0x43,0xCD,0x31,0xBC,0xBD,0xB9,0xC5,0x08,0x4E,0x3D,0xFE,0xFE,0x7F,0xFD,0x18,0xA9, + + 0xEF,0xDE,0x22,0x2D,0x3C,0xBA,0x4F,0xBB,0xEA,0xD1,0xF7,0xEF,0xFE,0xFE,0xAF,0xAE, + + 0xF7,0x9E,0xAC,0x3D,0x13,0x32,0x1F,0xBA,0x14,0xD2,0xFF,0xFF,0xFF,0xFF,0xA8,0xA4, + + 0xE1,0x06,0x19,0x66,0x53,0x2C,0xDD,0xCD,0x32,0xFB,0x77,0x46,0x91,0xEA,0xA2,0x83, + + 0xA2,0xDA,0x0C,0xFC,0xA3,0x6E,0xC3,0x7B,0x3E,0x0C,0xD2,0xD6,0x39,0x6C,0x2C,0x32, + + 0x23,0x04,0xAB,0x80,0x9E,0xA8,0xEE,0xA5,0x8B,0x97,0x16,0x45,0x80,0x6F,0xA0,0xEC, + + 0x7D,0x78,0x31,0x85,0xB0,0xF3,0xC4,0x89,0xBA,0xBC,0xC4,0x6C,0x7E,0xEE,0x20,0x0E, + + 0x90,0x46,0x88,0x75,0xB3,0xAC,0x74,0x94,0xC2,0xE9,0xB0,0x66,0x47,0x69,0xF0,0xAA, + + 0x13,0x48,0x17,0x01,0x68,0x32,0x44,0x98,0x05,0x0A,0x20,0x0F,0x43,0x2A,0x95,0x3F, + + 0xB1,0x4C,0xE1,0xA7,0xE5,0x22,0x0D,0x50,0xE5,0xE9,0xAE,0x1B,0xE1,0x7E,0x36,0x0E, + + 0x3E,0xFB,0x09,0x85,0xDC,0xDA,0x49,0x68,0xD3,0xE8,0xB9,0x77,0x84,0x6A,0xCB,0xF1, + + 0xF7,0x4A,0xC0,0x6C,0x1E,0xA9,0xD2,0xF9,0xBC,0x93,0x46,0xA5,0xF7,0x73,0xFD,0xFE, + + 0x8C,0xFB,0xFB,0xEC,0x6E,0x66,0x9D,0x4A,0xB2,0x0B,0x22,0xC3,0xD6,0x72,0x4D,0x37, + + 0x69,0x11,0x03,0xED,0xD2,0x31,0xBA,0xD4,0x1E,0x31,0x37,0x4B,0x2F,0x7A,0xE3,0x05, + + 0x0E,0x3B,0xAB,0x98,0xAA,0x3C,0x55,0x07,0xBE,0x97,0x57,0x5B,0x07,0x79,0xE9,0x26, + + 0xDF,0x4E,0xB8,0x5C,0x98,0x28,0x0E,0x1A,0xA1,0x07,0xB2,0x3A,0x2E,0x63,0x8E,0x06, + + 0x05,0x13,0x91,0x5C,0x64,0x35,0x7A,0x04,0xEA,0xB2,0xBA,0x2A,0x27,0x62,0x97,0x3E, + + 0x5F,0x62,0x3C,0xAF,0xE1,0xB4,0x0A,0x6A,0x2D,0x48,0xB3,0x6F,0x85,0x63,0x36,0xDB, + + 0x12,0xAB,0x10,0x5F,0x9D,0x25,0x9F,0xFC,0x88,0xBD,0xBB,0x7F,0xFA,0x62,0x80,0x66, + + 0x57,0x34,0xE4,0x86,0x3B,0x3D,0x07,0xB4,0x89,0xC1,0x95,0xDB,0xD7,0x6B,0x53,0xD8, + + 0x1E,0x91,0x73,0x10,0x51,0x1B,0x64,0x58,0x34,0x1E,0x24,0x4F,0xF3,0x4D,0xDA,0xD5, + + 0xD3,0x16,0xDC,0x83,0x17,0xBF,0x17,0x5E,0x21,0xD8,0x31,0xC3,0x03,0x62,0xCD,0xCC, + + 0xEB,0xC8,0xD4,0x92,0x50,0x7C,0x7D,0xB3,0xBC,0x5E,0x05,0xCF,0x52,0x16,0xFF,0x22, + + 0x8E,0xE9,0xA6,0xBE,0xDB,0x2D,0xF8,0x73,0x45,0x5C,0x9E,0xF9,0x12,0xD4,0x97,0x87, + + 0x5C,0xD9,0xAC,0xD7,0x33,0x38,0x7C,0xF5,0xAB,0x1E,0x23,0x1C,0x7B,0x3A,0x3D,0x45, + + 0xCF,0xDF,0xA7,0xD5,0xB3,0x66,0x53,0xF2,0xC9,0xC7,0x8C,0x79,0x55,0x3B,0x16,0xD3, + + 0xD8,0xB9,0xD5,0xD1,0xBB,0x7F,0x4E,0x82,0x93,0xF6,0xE7,0x1D,0xAF,0x38,0x22,0x75, + + 0x79,0x63,0x87,0x7C,0x39,0x77,0x3C,0x78,0x34,0xD8,0xA9,0x4E,0x4B,0x32,0x40,0xA6, + + 0x2F,0xB0,0xC4,0x81,0x18,0x99,0xE5,0xC8,0x61,0x50,0x4A,0x67,0x4A,0xE1,0x5D,0xFB, + + 0x53,0x58,0xE7,0x8F,0x6E,0x37,0x4E,0x1E,0x4F,0x17,0xF7,0xE3,0x00,0x38,0x7E,0x1D, + + 0xA6,0xAA,0xD2,0x8F,0xBF,0x58,0x5D,0xCA,0x99,0xDA,0xFF,0xF3,0x2B,0x39,0x9B,0xE4, + + 0x2C,0xE4,0xE6,0x3A,0xD3,0x95,0xC9,0x78,0x81,0xCD,0x69,0x1D,0xD9,0x8F,0xD8,0x20, + + 0xAB,0xA6,0x32,0xB6,0x53,0x30,0x07,0xE7,0x8C,0x1F,0x1E,0x38,0x94,0x7B,0x01,0x35, + + 0x7F,0xE5,0xBE,0xBF,0x81,0x2A,0x71,0x94,0x49,0xDA,0xE5,0x12,0x0E,0x71,0xB9,0x34, + + 0xFD,0x5D,0x8A,0x3A,0x52,0x16,0x47,0x28,0x69,0x23,0xD7,0x4A,0x98,0x5F,0x79,0xAD, + + 0xA3,0x9B,0xFA,0xCA,0xB3,0xA4,0xEF,0x53,0x7B,0x30,0x08,0xB8,0x57,0xD0,0x56,0xDB, + + 0x36,0xCD,0x7A,0xF0,0x95,0x01,0x8B,0xB0,0xC5,0x39,0x40,0x44,0x23,0xF3,0x54,0xE5, + + 0x94,0xCD,0xA2,0xEF,0x26,0x29,0x0B,0xD8,0xC2,0x68,0x0E,0x17,0xD6,0xF2,0xD1,0xE0, + + 0xD6,0xCF,0xF0,0xBD,0x7C,0xFA,0x01,0xE3,0x99,0x6C,0x41,0xDF,0xD2,0xAE,0xA0,0xE7, + + 0xF3,0x29,0x69,0xC4,0x9E,0xE4,0x0E,0x1F,0x66,0x86,0x90,0x30,0x74,0xEB,0x52,0xF7, + + 0xF0,0x9E,0xC8,0x2A,0xB6,0xC6,0x46,0x93,0xC8,0x63,0x98,0x20,0x97,0xEA,0x72,0x73, + + 0xC6,0x79,0x21,0x57,0x6E,0xA0,0xF6,0x70,0xE1,0x3F,0x91,0x65,0xFF,0xEB,0x62,0x35, + + 0x74,0x97,0x09,0x57,0x7E,0x8E,0xA1,0x33,0x9B,0x63,0x51,0x48,0x52,0x85,0xE4,0xE2, + + 0x8D,0xC7,0x5A,0x8C,0x9C,0x12,0x21,0xCA,0x04,0x63,0x49,0x26,0xF9,0x17,0x82,0x1F, + + 0x3E,0x89,0x86,0xF8,0xB8,0xA2,0x04,0x02,0xC2,0x4F,0x5D,0xB6,0xF8,0x3F,0x8B,0x8A, + + 0x09,0x6A,0x9B,0xDF,0xC0,0xB1,0x20,0x2A,0x4C,0x9A,0x1F,0xC7,0x85,0xA7,0xD3,0xF3, + + 0xED,0x00,0x2F,0xEF,0xDD,0xE4,0xB9,0x7B,0xC1,0x60,0xF3,0x2E,0x28,0xA4,0xDA,0xB1, + + 0x08,0xEF,0xC4,0x3F,0xBD,0x29,0x2E,0x17,0xCE,0x9C,0x32,0x3B,0xF8,0x61,0xC1,0xDF, + + 0x9C,0xB2,0xF7,0x0F,0x2E,0xA4,0xFF,0x3A,0x43,0x66,0x02,0x96,0xD2,0xA2,0xDD,0x15, + + 0x03,0xEC,0xC5,0xAD,0xAF,0x01,0x4D,0x16,0x41,0x48,0x8D,0x8F,0xED,0x6E,0x94,0xD9, + + 0x16,0x26,0x6E,0x98,0x76,0x96,0xE4,0x76,0x26,0xE4,0x9B,0x7D,0x98,0xE2,0x44,0x80, + + 0x7D,0x9D,0x84,0x6E,0x33,0x3D,0x30,0x59,0x85,0xB3,0x60,0x7D,0xF6,0xF4,0xE8,0x14, + + 0x63,0x97,0x54,0x14,0xB5,0x47,0x07,0xC2,0xE5,0xCE,0xF6,0xAB,0x9E,0x60,0xE1,0x06, + + 0xE7,0x61,0x5D,0x8F,0xD7,0xB9,0x4E,0xDD,0x6B,0x64,0x85,0xC5,0x0B,0x7E,0x0D,0xCB, + + 0x04,0x88,0x95,0x47,0xE9,0xBA,0x67,0xB1,0x77,0xDB,0xAF,0xA7,0x4A,0x7E,0xEB,0x53, + + 0xA4,0x90,0x9D,0xB4,0x0D,0xE0,0xEB,0x80,0x99,0x58,0x8C,0x64,0x77,0x83,0x12,0x33, + + 0x86,0xF6,0xA9,0x31,0xB5,0xB1,0x84,0x76,0x46,0xD5,0x9C,0x56,0x7B,0xFA,0xFD,0xA1, + + 0xE5,0x64,0x19,0xAD,0xDE,0xBB,0x3F,0xFE,0xD5,0xE8,0xCF,0x05,0x73,0xA3,0x8D,0x57, + + 0x0B,0x9A,0xE0,0xB5,0x40,0xB1,0x1D,0xF1,0x92,0xDA,0x9D,0xF5,0x8C,0xFA,0xD4,0x6C, + + 0xAE,0x9C,0xA0,0x67,0x33,0xFA,0x34,0x42,0x82,0x25,0x62,0x40,0xA1,0x85,0x64,0x27, + + 0x23,0xDF,0x94,0x78,0x2D,0x32,0x06,0x6A,0x31,0x78,0x00,0xE0,0xF0,0x9B,0xAC,0xE9, + + 0xA2,0xF8,0x73,0x8D,0x8F,0x22,0xCF,0x29,0x6C,0xD0,0x18,0x51,0xFA,0x99,0x3F,0x67, + + 0x38,0x60,0x87,0x79,0x3F,0xBF,0x07,0x8A,0x4C,0x74,0x14,0x3A,0x6E,0xC4,0x2C,0x57, + + 0xC5,0xD7,0xC6,0x86,0x9F,0x03,0x66,0x9D,0x0C,0xC7,0x22,0x68,0x62,0xFF,0x69,0xFD, + + 0x8E,0x17,0xD1,0xD6,0x98,0xBB,0x1C,0xE2,0x6C,0xAC,0x69,0x9C,0x9C,0x02,0x5F,0xED, + + 0x47,0xD8,0x5C,0x27,0xF7,0xF1,0xB5,0x8D,0x11,0xB0,0x72,0x2F,0x7C,0xFA,0xE8,0x28, + + 0xC6,0x84,0xCF,0x92,0x1E,0x60,0xC0,0xBC,0x25,0x76,0x9F,0xFD,0x8B,0xF2,0x9F,0xE0, + + 0x58,0x0D,0xCA,0x19,0x78,0x2D,0x49,0xA9,0xA9,0x31,0x80,0xA6,0xD0,0x8B,0x4C,0x04, + + 0xA0,0x6D,0x70,0x96,0x91,0x25,0xD8,0x55,0xBA,0x03,0xE0,0x56,0xDC,0xE7,0xC5,0x87, + + 0x8A,0x01,0x97,0x67,0xA3,0x83,0xE9,0xA5,0x8C,0x4E,0xA9,0xA7,0x45,0x38,0xCD,0x94, + + 0x07,0xE3,0xB1,0x97,0x58,0x74,0x90,0x84,0xC7,0x2A,0x18,0xF5,0xDD,0xE8,0x6E,0xBA, + + 0xA1,0x1F,0xC4,0xAC,0x9A,0xAF,0xD1,0x47,0xE3,0x4D,0xA8,0x99,0x74,0x26,0x11,0xC0, + + 0xA4,0x15,0xE8,0x68,0xB0,0x67,0x02,0x71,0xE0,0x04,0xDA,0xF6,0x56,0x87,0x81,0xA7, + + 0x92,0x49,0x45,0xA3,0x73,0x20,0xD3,0xE3,0x5B,0xCF,0x1D,0x0A,0xD4,0xAC,0xB1,0xD3, + + 0x4A,0x70,0xD0,0x55,0xB7,0xAA,0x39,0x73,0xB6,0x4A,0xE1,0x8A,0x5E,0x05,0x62,0x0A, + + 0x2E,0x05,0xFA,0x6E,0x95,0xAE,0xBC,0x0E,0x4E,0xC5,0x88,0xCE,0x2F,0x74,0x74,0x35, + + 0x8B,0x0D,0x75,0xFE,0x2A,0x5B,0xE5,0xD0,0x17,0x04,0xA0,0xC7,0x5F,0xC3,0x7D,0x25, + + 0x24,0x07,0x02,0xCD,0x94,0xA1,0xC7,0xC1,0x40,0x82,0x4C,0x42,0x64,0x43,0xD2,0x7B, + + 0xBA,0x19,0x33,0xAF,0x66,0x4B,0xE0,0x6B,0xE7,0x28,0x28,0xBF,0x59,0xE5,0x3A,0xB4, + + 0x9B,0xF7,0xA2,0x4F,0x1A,0x23,0x42,0x1F,0x63,0x0E,0xC2,0x0E,0xFB,0x6A,0x35,0xB5, + + 0xCD,0x4F,0x35,0xBE,0x1D,0xE4,0x9A,0x79,0x35,0xF6,0xA5,0x9E,0x5D,0xA4,0xC0,0xA1, + + 0xE2,0x43,0xA3,0x4E,0x8F,0xA5,0x87,0x56,0xBD,0x43,0xDF,0x16,0x7B,0xE4,0x05,0x67, + + 0xFC,0xE3,0x0A,0xD9,0xBE,0x88,0x2E,0x84,0xC9,0x94,0xD4,0x02,0x38,0x66,0x91,0x1F, + + 0x21,0x50,0x95,0x66,0x9C,0x9D,0xD4,0x71,0x99,0x12,0xCC,0x2C,0x8D,0xF7,0x15,0xF2, + + 0xD6,0x17,0x1D,0x76,0x9D,0x9C,0xC0,0x32,0xE1,0xCA,0xFC,0xB6,0x01,0x7C,0xAD,0x80, + + 0x22,0x16,0x90,0x67,0x1C,0x9F,0x5B,0x75,0xC2,0x22,0xB4,0xA1,0x1B,0x19,0x2D,0xE4, + + 0x00,0xAC,0x18,0x77,0x91,0x83,0x25,0xE3,0xEF,0x31,0xEF,0xA2,0xED,0x68,0x4C,0xD4, + + 0x41,0x2B,0xC7,0x02,0x82,0x32,0xAB,0x10,0x60,0xA5,0x3C,0xF9,0xF2,0xD5,0x8C,0x75, + + 0xFB,0x97,0xB4,0x92,0xC7,0x7B,0xE9,0x03,0xEF,0x58,0x03,0xBC,0x04,0x71,0x53,0xED, + + 0x49,0x47,0xCD,0x23,0xD1,0x16,0x2B,0xE7,0x03,0xD5,0x8A,0x3D,0x81,0x76,0x35,0x55, + + 0x8D,0xA3,0x78,0x13,0x43,0x31,0xA6,0x01,0xAE,0xA6,0x1D,0x35,0xE6,0x71,0xBD,0x7B, + + 0x18,0xA5,0x02,0xFF,0x0C,0x37,0x5C,0xAD,0x5B,0xCA,0xDA,0x5C,0x7C,0x37,0x8C,0x38, + + 0x21,0x79,0x71,0x18,0x7A,0x9F,0x47,0x8C,0xCE,0x14,0x2A,0x5E,0x4A,0x9B,0x79,0xA0, + + 0x8A,0x6A,0x47,0xD1,0x7E,0xB7,0xEF,0xCB,0xAB,0xA9,0xCD,0xA6,0x5B,0xF5,0x5F,0x84, + + 0xF9,0x1D,0xB5,0x75,0x25,0xF4,0x41,0x5B,0xE5,0xDE,0x27,0x42,0x7B,0xD7,0x1E,0xDC, + + 0xA8,0xB0,0xCA,0xD9,0x59,0xFC,0x28,0xEE,0x8B,0xDF,0xF2,0xF8,0x7C,0xFC,0x48,0xE0, + + 0xAB,0x13,0xB6,0x5E,0x32,0x9D,0xC5,0x18,0x2B,0xAD,0x1E,0xEC,0x40,0x7B,0xB2,0xAB, + + 0xEA,0x11,0xBF,0x4F,0xB3,0xFE,0x77,0x1A,0x66,0x53,0xE0,0x6F,0x72,0x3E,0x2F,0x86, + + 0x4A,0xB2,0x95,0xC0,0x18,0x39,0xA8,0x53,0x4E,0xA8,0xFB,0xE9,0xFD,0xFF,0xD8,0x25, + + 0xA5,0x9B,0xFA,0xF8,0xB3,0xE2,0x7A,0x60,0x19,0x48,0x88,0xA4,0xC5,0xB5,0x90,0xED, + + 0xEC,0xD0,0x9E,0x92,0x5E,0x9E,0x8F,0x4F,0x43,0x6B,0x38,0x44,0xF6,0x4A,0xE4,0xE5, + + 0xB7,0x90,0x2A,0x96,0x92,0x90,0x61,0xCC,0x3C,0x6B,0xC9,0x45,0x36,0x1D,0x85,0x8C, + + 0x84,0x01,0x69,0xAB,0x39,0xB8,0x05,0x41,0xE5,0x73,0x65,0x3C,0x34,0xF8,0xBF,0xA8, + + 0x39,0x94,0x48,0x79,0x94,0x8C,0xC5,0xE6,0x05,0x2E,0x8D,0xE4,0xDE,0xBC,0xDB,0x20, + + 0xEC,0x14,0x90,0xD4,0x14,0x41,0x58,0x27,0xE6,0xCE,0xED,0xF0,0x5F,0xA9,0x3E,0x47, + + 0x80,0x2C,0x5D,0x25,0xD7,0xE6,0xCE,0x83,0x81,0xC0,0x4E,0x85,0xD0,0xAE,0x57,0x6B, + + 0x0A,0x21,0xB3,0x47,0x34,0xA1,0x7F,0x83,0xCE,0xC8,0x7E,0xF5,0x57,0x3E,0x1C,0x27, + + 0xD2,0x80,0xE3,0x68,0xE3,0xAE,0xB4,0xD9,0x4F,0xBD,0xFE,0xC8,0xDE,0xF4,0xD5,0x69, + + 0x39,0xE7,0x4D,0xF6,0x35,0xE6,0x44,0xFA,0xF1,0x60,0xA9,0x5C,0xA2,0x66,0xA4,0xE3, + + 0x92,0xC7,0x8D,0x70,0x3D,0xC6,0x2D,0xD0,0x4C,0x0A,0x0A,0xCD,0x5E,0xEE,0xCC,0xDB, + + 0xC5,0x26,0xCB,0x1D,0xBF,0x06,0x0C,0x46,0x31,0x32,0x40,0x18,0x7C,0x32,0x7C,0x8A, + + 0x36,0x07,0xAA,0x58,0xBD,0xAA,0x52,0x73,0xCC,0xB9,0xCA,0xCE,0xB3,0x64,0xD2,0x1D, + + 0x01,0x22,0x5E,0x4E,0xBC,0xEF,0x5A,0x2F,0xEE,0xA1,0xA5,0xD5,0x59,0x67,0xF5,0x7A, + + 0xFE,0x91,0x6B,0xE3,0x7F,0xA1,0x33,0x09,0x31,0xC8,0x28,0x6D,0xA1,0x06,0xFA,0x1C, + + 0x4D,0x6F,0xF5,0x61,0xF4,0xB8,0x9C,0x3B,0xE3,0x42,0x35,0x00,0xFE,0x6F,0x04,0xF3, + + 0x85,0x3F,0xFD,0x95,0xD3,0xA0,0x6A,0x40,0x2C,0x54,0xC7,0x44,0x47,0xE2,0xB9,0xD4, + + 0x79,0x6A,0xF5,0x91,0xD2,0xAA,0x5C,0xB0,0x12,0xDC,0x5F,0x76,0x35,0x2C,0xB4,0xA4, + + 0x05,0x3D,0x5F,0x6F,0x30,0x7D,0x55,0xF0,0x4F,0xDD,0x0D,0x59,0x09,0x9E,0x37,0x6F, + + 0xA5,0xD1,0x88,0x61,0x30,0xA1,0xC2,0xE1,0xA6,0x23,0xC5,0xB5,0xA9,0xE8,0x75,0x20, + + 0x8A,0x39,0xE8,0xD6,0x95,0xF4,0x05,0x6F,0x11,0xD0,0x92,0xA1,0x70,0x74,0x84,0xED, + + 0xA5,0x91,0x37,0xC6,0x31,0xFF,0x23,0x72,0x14,0xA0,0x7B,0x56,0x7F,0x65,0x70,0x21, + + 0x23,0x16,0xE9,0x11,0xC9,0xB6,0xAA,0xB6,0xD9,0xE1,0x27,0x87,0xF2,0xB8,0xE6,0xB1, + + 0x66,0xF5,0x86,0x55,0xB6,0xD0,0xBD,0xAE,0xAD,0xD4,0xED,0xEA,0xEF,0xF1,0xEA,0xDF, + + 0x1F,0x08,0x0E,0x16,0xBE,0xBC,0x6F,0x2A,0xCB,0x95,0x73,0xC8,0x83,0xFE,0x10,0xB3, + + 0x8A,0x82,0x54,0xE8,0xB0,0x3F,0xBA,0x4A,0x25,0x96,0x59,0xFE,0x71,0x04,0x19,0xA3, + + 0x0B,0x8A,0x7D,0xED,0x8F,0x5E,0x9B,0x39,0xA4,0xD0,0x99,0x15,0x5D,0x96,0xE9,0xE8, + + 0x99,0xD4,0xAE,0x5F,0xB9,0x70,0x5F,0xB9,0x9A,0xD6,0xFD,0x5D,0x1C,0xFD,0xA2,0x1A, + + 0x22,0x9F,0xBC,0xCF,0x9D,0xBA,0x76,0x72,0xEE,0xAC,0xD6,0xAE,0x1D,0x03,0x43,0xAA, + + 0x8C,0x9B,0x91,0x3C,0xBD,0x95,0x26,0xFF,0x0C,0xF5,0x3E,0x8B,0x61,0xBC,0x5F,0x5A, + + 0x4F,0x98,0xEB,0xB1,0x1F,0x34,0x17,0xE9,0xA3,0xD3,0x8F,0xEB,0xCF,0xFE,0x4F,0x19, + + 0x0E,0x96,0xD0,0xBD,0xFE,0xFF,0x07,0x3D,0xF9,0x93,0xFF,0xFF,0x07,0x71,0xAD,0x7F, + + 0x9D,0x1B,0x53,0xF7,0x68,0x84,0x4B,0x6E,0x3B,0x3A,0x50,0xA1,0xB8,0x68,0xB5,0x21, + + 0xA0,0xA0,0x64,0x87,0x46,0x2B,0xE5,0xCD,0x43,0x9A,0xC1,0xC9,0x97,0x73,0x4E,0x85, + + 0xC0,0xBB,0xCE,0x29,0x79,0x73,0x07,0x43,0xA8,0x4F,0xC5,0xE2,0x39,0x21,0x31,0x21, + + 0x9E,0xAC,0x00,0x66,0xE5,0x82,0xAC,0xB5,0x9C,0xE1,0x23,0xB1,0xD7,0x58,0x66,0x99, + + 0x36,0xA9,0xB6,0x37,0x2A,0x2B,0x45,0x41,0xEF,0xF9,0xD6,0x4C,0x7A,0xD3,0x00,0xA1, + + 0x60,0x9A,0xDE,0x36,0xEC,0x88,0x62,0x83,0x33,0xF7,0xBE,0x84,0xB8,0x14,0xD0,0x86, + + 0x48,0xDC,0xDD,0x47,0x7B,0xF5,0x09,0x65,0xEB,0x86,0x88,0x67,0x77,0x0A,0x5F,0x6D, + + 0x68,0x43,0x9E,0xF0,0x64,0x49,0x99,0xF4,0xF4,0x4A,0x80,0x81,0x76,0xB8,0xA2,0x7A, + + 0x6A,0x54,0xBA,0xF3,0xF1,0x99,0xC9,0x63,0x37,0xC4,0x9A,0x39,0x6B,0xB3,0x3D,0x09, + + 0x6A,0x48,0x4E,0x15,0x18,0xE9,0xDA,0xC9,0x45,0xC4,0x4A,0x4F,0x29,0x07,0x7D,0x0E, + + 0x8E,0x8A,0x43,0x89,0xEC,0x68,0x48,0x62,0xB3,0xA3,0x21,0x8C,0xC8,0xAF,0x55,0xB4, + + 0x89,0xAF,0xAD,0xA8,0xB3,0x8F,0x65,0x11,0x20,0x5A,0xF9,0x34,0xD8,0xDB,0x18,0xF7, + + 0x60,0xBD,0xFC,0xE8,0xC4,0xF1,0xAD,0xAF,0x80,0xDD,0xD3,0x0A,0xA5,0x00,0xDC,0x28, + + 0x57,0x04,0x48,0xDE,0x8A,0x78,0x7D,0x4D,0xB2,0x46,0x39,0x82,0xD4,0x90,0x3D,0x4E, + + 0x2B,0xA1,0x03,0xC9,0xA1,0x26,0x5B,0x79,0x16,0xDF,0xE9,0xF2,0x25,0xE3,0x81,0x2A, + + 0xE7,0x80,0xF3,0xBD,0xF3,0x6D,0xE0,0x8A,0xB7,0xEB,0xBD,0xC1,0x32,0xDC,0x0F,0x6C, + + 0x9C,0xAB,0xD6,0x3D,0xDB,0xB3,0x2A,0x88,0x08,0x5D,0x6B,0xD7,0x40,0x1C,0x4C,0x6C, + + 0x9F,0x53,0x58,0x85,0x41,0x91,0x62,0xB6,0x80,0xD2,0xBE,0x45,0xD2,0xF1,0x5D,0x79, + + 0x6C,0xE9,0xBB,0x20,0xC2,0x9D,0x03,0xC3,0x80,0x27,0x72,0xE5,0xF4,0x5B,0x06,0x50, + + 0xD6,0xE4,0x1C,0x84,0xC5,0x9E,0x34,0x42,0x6D,0x11,0xA3,0x9D,0xF7,0x31,0x3C,0xC2, + + 0x62,0xB4,0xFF,0x5A,0x33,0xA7,0x32,0xDD,0x63,0x14,0x65,0x86,0x51,0xB6,0x5F,0xA9, + + 0x00,0x17,0x0C,0x51,0xA9,0x93,0x49,0x8F,0x36,0x5C,0xDE,0x16,0xFC,0xF3,0x56,0xC3, + + 0x75,0xBB,0xFF,0x2D,0x36,0xF9,0x49,0xE3,0x2A,0xDD,0xB5,0xAA,0xDF,0x7B,0x17,0x47, + + 0xDB,0x55,0x1C,0xA6,0x89,0x75,0x5C,0x75,0xED,0xF0,0x59,0xB5,0xF1,0x6C,0xD9,0x72, + + 0x94,0x21,0x15,0x6C,0x96,0x98,0xD6,0x9B,0x97,0x43,0xE9,0x28,0x7E,0xDD,0xCE,0xC5, + + 0x5B,0x62,0x9B,0x9D,0x8C,0x7B,0x20,0x61,0x00,0x83,0x9C,0x9F,0x98,0xD6,0xB6,0xE1, + + 0xD3,0xE5,0x90,0x8F,0x44,0x9A,0x58,0x2D,0xA8,0x7F,0x68,0x45,0xA3,0x38,0x5A,0x68, + + 0xE8,0x38,0x4F,0x79,0xB8,0x11,0x47,0xB0,0x00,0xA1,0xCB,0x4E,0xDF,0xC4,0x82,0xF3, + + 0xC3,0xFD,0x02,0xFF,0x39,0xCC,0x6E,0x1B,0x52,0xFE,0xF0,0x18,0x66,0x6C,0x14,0xD9, + + 0x88,0xAD,0x9D,0xAF,0x05,0x7F,0x9E,0x7D,0xE2,0x55,0xFE,0xED,0x9A,0x7B,0x3F,0x4D, + + 0xA4,0x45,0x6B,0xBE,0x9C,0x98,0x0D,0x6D,0xEC,0xD7,0x0D,0x47,0x7D,0xEC,0x71,0xE5, + + 0xC3,0x12,0x0F,0x34,0xB8,0x5F,0x5D,0xE7,0xC1,0xAB,0x72,0x98,0x58,0x7E,0x69,0xBA, + + 0x37,0xAA,0xF1,0xA2,0x12,0xC2,0x9C,0xCA,0xD8,0x06,0xE9,0x29,0xB1,0x66,0xA1,0x74, + + 0xEE,0xF2,0x90,0x27,0x27,0x5E,0x02,0xC1,0x6F,0x6E,0xFB,0x33,0x53,0x9A,0x99,0xE3, + + 0x9C,0x99,0x6D,0x65,0x63,0xC7,0x39,0x27,0xEC,0x95,0x31,0xE7,0x90,0xE1,0x28,0x75, + + 0x6E,0x10,0x97,0xA2,0xE3,0x7C,0xE9,0xC0,0xA3,0x6C,0xAC,0x08,0xE5,0xE7,0x78,0xEE, + + 0xE7,0x2B,0x20,0xA2,0x17,0x64,0x63,0xC2,0x40,0x86,0x30,0xE3,0xBE,0xEC,0x0F,0x92, + + 0x55,0x0E,0xF0,0xDA,0x37,0x37,0x2C,0x4F,0x8F,0x86,0x9E,0x86,0x56,0x25,0x72,0x30, + + 0xF6,0xEA,0x81,0x0D,0x22,0xAB,0xA9,0x23,0x82,0x62,0xA7,0x14,0xEA,0x88,0x8B,0x62, + + 0xF7,0xC5,0x25,0x24,0xE5,0x06,0x29,0x83,0x01,0x66,0x99,0x3D,0x63,0xEA,0x7B,0xE7, + + 0xA9,0x27,0x76,0x9D,0xBD,0x17,0x64,0xD9,0x2E,0x67,0x32,0xD3,0x00,0xAA,0xF9,0x09, + + 0x3C,0x21,0xD4,0xAA,0xF4,0x0A,0x2B,0xBE,0x43,0x1B,0xBE,0xA0,0xBC,0x46,0x74,0x03, + + 0x29,0x25,0xD8,0x7C,0xFA,0x5B,0xE7,0xD8,0xBC,0x67,0xBA,0x80,0x94,0xFB,0x0D,0x72, + + 0xC8,0xF0,0x78,0xEC,0xF7,0x06,0x01,0xD9,0x61,0xC4,0xAA,0xD7,0x5D,0xA6,0xA6,0x71, + + 0xAF,0x25,0x31,0xB1,0xF7,0xDF,0xE4,0xEE,0x40,0x79,0xAA,0xEA,0xB7,0x67,0x5C,0x6B, + + 0x7F,0xCF,0x2A,0x2E,0xBE,0x32,0xBE,0xE6,0x49,0x4F,0x6B,0x8E,0xDF,0xFB,0xF5,0xAB, + + 0xDE,0x05,0xB5,0xF6,0x69,0xEC,0x4B,0x98,0xA2,0x8C,0xE1,0x6E,0xD8,0x8C,0xAF,0xA2, + + 0x2E,0x0F,0x5F,0x3D,0x10,0x59,0xFB,0xE8,0xED,0x12,0xF3,0xE7,0x5D,0xF3,0x13,0xEB, + + 0xD4,0x89,0x9E,0x79,0xC3,0x0F,0x2A,0xC2,0x47,0xB0,0x92,0x7B,0x4C,0x5D,0xEC,0xCB, + + 0x44,0xD3,0xFA,0xBD,0x57,0xA4,0xF3,0x9B,0x8C,0xE0,0xB4,0xB2,0x7C,0x95,0xFA,0xDB, + + 0xD3,0xE7,0xDE,0xA8,0xD2,0xE7,0xF5,0x4E,0xDC,0x76,0xA0,0x60,0x3E,0xFB,0xE9,0xD6, + + 0xA4,0x53,0x79,0x50,0xB3,0x33,0xD1,0x20,0xC4,0xD9,0x83,0x9E,0x3D,0x5A,0x9B,0xB1, + + 0x5E,0xF7,0xF4,0x5E,0x6C,0xF6,0xA4,0x91,0x5E,0x96,0xB7,0x6A,0x01,0xA8,0xAC,0x57, + + 0x3F,0x9D,0xC0,0x96,0x77,0x61,0x04,0xD5,0x8E,0x96,0xA3,0x76,0x04,0x80,0x9E,0x47, + + 0xA8,0xFC,0x25,0xB7,0xB0,0xD4,0xB5,0x97,0x0F,0xF5,0x2A,0x2A,0xC9,0x65,0xEF,0xC0, + + 0xC9,0xB4,0xB9,0xC8,0x91,0x1A,0x05,0xCC,0xDF,0x95,0x3D,0xAA,0xBD,0x2C,0x7F,0x9D, + + 0xC9,0x83,0xB6,0xCE,0x4A,0xA3,0xAF,0xD9,0x54,0x7C,0xCE,0x9C,0x83,0x2D,0x74,0x72, + + 0xAD,0xD4,0x6E,0x1B,0xA7,0xA2,0x46,0x42,0x6D,0x78,0xBE,0x83,0x96,0x28,0x02,0x7D, + + 0x4D,0x35,0x85,0xF9,0x9D,0x0A,0x29,0x49,0x0C,0x0F,0xCF,0xDC,0xA7,0xA1,0x77,0x9F, + + 0x84,0x1F,0x70,0x09,0xAF,0x76,0x70,0x48,0x99,0x46,0x06,0x03,0x16,0x4A,0x40,0x62, + + 0x08,0x3C,0xBC,0x4A,0x38,0x75,0x2E,0xEA,0x87,0x3D,0xDB,0x13,0x13,0x67,0xFD,0x3A, + + 0x2B,0x3D,0xD0,0x7A,0x9C,0x48,0xE9,0x18,0xC3,0x70,0xA0,0xFB,0xF7,0x58,0xF6,0xDA, + + 0xDA,0x33,0xD9,0x6E,0x1D,0xDB,0xB7,0x6E,0xB8,0x73,0xDA,0x16,0x3F,0xBC,0x78,0x9A, + + 0xA3,0x3F,0xB5,0x5B,0x9C,0xBF,0x2F,0x19,0xE9,0xBD,0xA6,0xED,0x1A,0xF6,0x84,0x94, + + 0x80,0xC0,0x84,0x90,0x34,0x3B,0x30,0xAA,0x41,0x80,0xE0,0xA0,0x09,0xE9,0x09,0xE6, + + 0xE0,0x1A,0x75,0x90,0x4C,0x83,0xC2,0xA0,0x72,0x45,0xFE,0x08,0xB8,0xD0,0x3B,0xE9, + + 0xF7,0xCD,0xA1,0x63,0xF8,0x2F,0xF9,0xA9,0xF3,0xC6,0x3D,0xCD,0x3F,0x2F,0x43,0xF7, + + 0x03,0x07,0x19,0x67,0x7A,0x52,0x27,0xC1,0x66,0x58,0x59,0xB0,0x78,0x69,0x08,0x0C, + + 0xDE,0x47,0x43,0xAC,0xB5,0x66,0xC4,0x44,0xA3,0x5F,0x10,0x42,0xAD,0x7F,0x6B,0x6D, + + 0xF7,0x1C,0x78,0x13,0x15,0x67,0xF0,0x55,0x67,0xEE,0x18,0x80,0xCF,0x6F,0xE2,0xE0, + + 0x5A,0x05,0x01,0x90,0x94,0x64,0xEA,0x87,0xD2,0x09,0x29,0xE1,0x92,0x51,0xFE,0x38, + + 0x85,0x65,0xE6,0x15,0xCF,0x8A,0x4C,0x75,0xA8,0x16,0x99,0x9D,0x60,0x2A,0x89,0x6A, + + 0xF7,0x84,0xFC,0x34,0x2B,0xE7,0xB6,0x5E,0xB7,0x41,0x14,0x5F,0x20,0x27,0x8A,0x5E, + + 0x4F,0xF4,0x3B,0xE1,0xEB,0x52,0x85,0x58,0x5D,0x52,0xA4,0x10,0x31,0xF8,0x49,0x14, + + 0xA8,0x07,0x7B,0x05,0x3F,0xF1,0x53,0xC1,0x48,0x07,0x92,0x5E,0xAC,0x25,0x21,0x9C, + + 0xCA,0xEB,0xC1,0xF3,0x62,0x69,0x44,0x4F,0x44,0xCD,0xE5,0x05,0x38,0xC8,0x64,0x3A, + + 0xB1,0x13,0x89,0x8B,0xD8,0x0C,0x1B,0x80,0x41,0x01,0xD0,0x8A,0xFF,0xEA,0x8A,0x5D, + + 0xDF,0x16,0x72,0xEE,0x13,0x6D,0x46,0x1A,0xB4,0xC6,0x81,0x68,0xDE,0x9C,0xF4,0xED, + + 0x7E,0x2D,0x8B,0x59,0xA9,0xA4,0x0B,0xE5,0x48,0x72,0xD7,0x2D,0xCE,0xC5,0x33,0x27, + + 0x2C,0x1F,0x27,0x79,0x16,0x6E,0x12,0x85,0xCF,0x53,0x4B,0x0F,0xE8,0x70,0x3C,0x05, + + 0x2E,0x9A,0xBE,0x77,0x08,0x9D,0xCF,0xEA,0x1F,0x25,0xAC,0x5F,0x99,0x13,0xA4,0x08, + + 0xA4,0x03,0x84,0x90,0x99,0xDE,0x22,0x40,0x09,0x5C,0xFD,0x4B,0x80,0xF2,0xD2,0x04, + + 0x26,0x13,0x90,0xC2,0x7A,0x1B,0x4E,0xEF,0x9B,0x28,0x41,0x5F,0x09,0xF3,0x33,0x61, + + 0x82,0xD1,0xB3,0xAD,0xD9,0x3E,0x0B,0xD3,0x5E,0x11,0xBF,0x4B,0x92,0x7F,0xEF,0x45, + + 0xB1,0x2B,0x51,0x3B,0xC7,0x67,0x2D,0xC7,0xCE,0x31,0xD4,0xE4,0x72,0x74,0xF9,0x2D, + + 0x23,0xCE,0xF7,0x7C,0xC0,0x33,0x9C,0x52,0xE0,0x58,0xDC,0xF4,0x73,0x75,0xB8,0x38, + + 0xA0,0x8D,0x3E,0xBE,0x88,0x89,0x6C,0xA3,0x43,0x14,0xD5,0xE5,0xF2,0x76,0x35,0x55, + + 0xAB,0xE4,0x63,0x27,0xB7,0xB7,0x24,0xB6,0x1E,0x21,0xDD,0xF5,0xF3,0x77,0xEA,0xFB, + + 0x37,0xBE,0x79,0xFF,0x04,0x5B,0x99,0x39,0xD4,0x61,0x81,0x5F,0xFC,0xF3,0x2E,0x72, + + 0xC0,0x43,0x71,0xE2,0x5B,0x8C,0x45,0xAF,0x16,0x5B,0xE5,0xCF,0x10,0xD8,0xD4,0xFA, + + 0xD2,0x93,0x7C,0xF2,0xD8,0x27,0xA6,0xC1,0x93,0x51,0xB3,0x15,0x00,0x3E,0x15,0x9B, + + 0x3B,0x13,0x74,0xEE,0x8D,0x44,0xC4,0x16,0xEF,0x51,0x81,0x52,0xFF,0x83,0x78,0xE4, + + 0x42,0x11,0xF1,0x4E,0xF7,0xB3,0xAB,0x96,0xFC,0x03,0xD6,0xEC,0x7A,0x7C,0xB5,0x28, + + 0x29,0x5F,0x97,0xCC,0x3D,0xBD,0x3F,0x12,0x9F,0x6C,0xDE,0xFC,0x7B,0x7D,0xB8,0xBA, + + 0x92,0x7D,0x07,0x49,0x52,0xC1,0x68,0x62,0x51,0xC3,0xD7,0xED,0xFA,0x7E,0x8B,0x08, + + 0x98,0xC2,0x41,0x5F,0x76,0x30,0xE8,0xD5,0x0A,0xC0,0xDF,0xFD,0xFB,0x7F,0x30,0x60, + + 0x00,0xCC,0x2F,0xBE,0x27,0x9F,0xB4,0xE2,0x40,0x00,0x25,0xD5,0x68,0xFB,0xEA,0x9A, + + 0x26,0xA1,0x10,0xE5,0x50,0xDA,0xC2,0xDA,0xDD,0x0C,0x14,0xB2,0x5B,0x7C,0x31,0xEB, + + 0x40,0x4F,0x19,0xF4,0xDD,0xB2,0xA1,0x51,0xF7,0x79,0x56,0x51,0x59,0x80,0xEB,0xFB, + + 0x41,0x4E,0x90,0xFB,0x6D,0x18,0xC6,0x74,0xF6,0x27,0xF1,0x86,0xD3,0x81,0xDF,0xA4, + + 0x22,0x9F,0x3F,0xC6,0x61,0xD1,0xCF,0x28,0x56,0xC0,0x08,0x42,0x56,0xE4,0x69,0x34, + + 0xEC,0xD4,0xA8,0xAA,0xAB,0xE7,0xAC,0x2C,0xD4,0xFA,0xF8,0x76,0x57,0xE5,0x1C,0x25, + + 0x6D,0xB7,0x21,0x83,0x84,0x5D,0x77,0x24,0xE8,0x1A,0xF1,0x67,0xD6,0xE6,0x7F,0x31, + + 0x78,0x2A,0xB6,0xA7,0xA4,0x31,0x07,0x5F,0x13,0xF6,0xF9,0x77,0xD7,0xE7,0x63,0x5E, + + 0x2F,0xCB,0xE2,0xF6,0xA0,0x53,0xD0,0xEA,0x54,0x35,0x79,0xDE,0x54,0xE7,0xEE,0x9F, + + 0x4E,0x7A,0xA1,0xDF,0xF4,0x00,0x32,0x9A,0x5F,0x7A,0xC2,0x0C,0x95,0xE6,0x43,0x09, + + 0xD5,0x87,0x9A,0xF3,0x64,0xE8,0x9F,0xB9,0xDC,0xC2,0x8D,0x06,0x14,0x43,0xEF,0x9D, + + 0xCB,0xEE,0xB9,0xE1,0x76,0xFA,0x62,0x34,0x29,0x40,0x6F,0xCC,0xBF,0x4A,0x77,0xEF, + + 0xF9,0x71,0x58,0x09,0xDC,0xAE,0xB2,0xEE,0xEC,0x8E,0xF2,0x6E,0x5E,0xEC,0xB9,0xA4, + + 0xF2,0x96,0x44,0xAC,0x2C,0x60,0x78,0xCE,0x4C,0xCE,0xFA,0x7E,0x5F,0xED,0x71,0x4C, + + 0x71,0x03,0xAB,0xC2,0xDA,0xA8,0xB3,0xD5,0x43,0x8C,0xF3,0x6F,0xDE,0xEE,0xED,0x05, + + 0x02,0xED,0x2B,0xDB,0xCE,0x52,0x1B,0x2C,0x6C,0xC2,0xFB,0x7F,0xDF,0xEF,0x22,0xF0, + + 0xDB,0xD2,0x7D,0x86,0x4F,0xBC,0x4B,0xD0,0x57,0xE4,0xF2,0xA4,0x76,0xEB,0x74,0x83, + + 0x16,0xD5,0xC2,0xE5,0x0D,0xF3,0x04,0x4D,0x56,0x95,0x78,0xCC,0x74,0x11,0xEF,0xD7, + + 0x4D,0x19,0xFE,0x25,0xB2,0xC1,0xCF,0x21,0x71,0x88,0x52,0xD1,0x7B,0xB0,0xAF,0x91, + + 0xE5,0x1E,0x69,0xCC,0x40,0xBC,0x87,0x74,0x3B,0xDB,0x7D,0x32,0xA2,0xFE,0xA4,0x46, + + 0xB4,0x39,0x24,0xD6,0xCE,0xB2,0x0B,0x25,0x60,0x54,0xF4,0xE6,0x76,0xF4,0x56,0x63, + + 0x1F,0x0A,0xC2,0xD6,0x37,0xB5,0x3F,0xF6,0xE8,0x94,0xFC,0xF6,0x77,0xF5,0xF4,0xF3, + + 0xA2,0x29,0x4B,0x35,0xB0,0x36,0xA7,0xA3,0xAE,0xD7,0xF5,0xE7,0xF6,0xF6,0xB2,0x53, + + 0xD0,0xE2,0xED,0xA5,0x84,0x21,0xBD,0x77,0x11,0xCA,0xFD,0xF7,0xF7,0xF7,0x7F,0x8C, + + 0xCB,0xDA,0x12,0xF1,0x9F,0x15,0xB3,0xD8,0x8B,0x27,0xBC,0xAA,0xDF,0x58,0x10,0x6A, + + 0x4D,0xD9,0x73,0xA7,0x56,0x31,0xBA,0x52,0xF5,0x19,0x0F,0x43,0x8F,0x4C,0xE3,0xCE, + + 0xAD,0xD8,0x36,0x74,0xCF,0xBA,0xF7,0x7F,0xA9,0xDE,0xA2,0x8C,0xF1,0x21,0xEF,0x1E, + + 0x99,0x10,0x7B,0x62,0x3C,0x60,0x66,0xB1,0x08,0xD2,0xA3,0x47,0xFD,0xB9,0xA6,0x0A, + + 0x3B,0x61,0x1C,0x4C,0xF3,0xB3,0x5E,0x88,0x5D,0x93,0xF6,0xEE,0x7E,0xFC,0x37,0xA4, + + 0x8A,0x1B,0xE5,0x19,0x39,0x3D,0x46,0x10,0xE2,0x20,0xFE,0xFE,0x7F,0xFD,0xEC,0x2B, + + 0xB2,0xF2,0xBE,0x29,0xB8,0xFC,0xB7,0x6F,0x48,0xD0,0xF7,0xEF,0xFE,0xFE,0x6B,0x9B, + + 0xB3,0xD1,0x3D,0x9F,0xA7,0xFD,0xBF,0x7F,0x36,0xD5,0xFF,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x38,0xAF,0x7F,0x76,0x72,0xDF,0x76,0x90,0xA9,0x4F,0x50,0x64,0xB9,0xB1,0x58,0x11, + + 0x6A,0x22,0x77,0x6A,0x3F,0xD5,0x42,0x40,0x29,0xA0,0xE0,0x47,0x3D,0x6A,0x12,0xF2, + + 0xF8,0xA9,0x7A,0x7A,0xF8,0x2F,0x77,0x84,0xC1,0x92,0xE9,0x02,0x39,0x93,0xFC,0xE0, + + 0xA7,0x01,0x29,0xE6,0x1D,0x61,0x67,0x37,0x20,0xC0,0x1D,0x26,0xE1,0x52,0x80,0x05, + + 0xA3,0xDB,0x77,0x6D,0x65,0x24,0xFC,0x1F,0x88,0x3D,0x89,0x3C,0x54,0x06,0x7B,0xD0, + + 0xA2,0x9A,0xC8,0xAF,0x60,0x25,0x42,0x72,0xD1,0x4F,0x98,0xB3,0x60,0x73,0xF5,0x23, + + 0x7D,0x00,0xFF,0x34,0x2D,0x7D,0x0B,0x63,0x71,0x9B,0x84,0x41,0xF2,0x77,0xFD,0x33, + + 0x78,0x6B,0x09,0x54,0x3D,0xDA,0xDC,0xF5,0x81,0x45,0x63,0xE7,0xA3,0x75,0x3C,0xC0, + + 0x60,0x71,0x02,0x8F,0x1E,0x6A,0xA1,0xDB,0xC4,0xC3,0x94,0x04,0xD8,0x24,0x74,0xBD, + + 0x8B,0x0D,0xC8,0x18,0x9E,0x9B,0xBA,0xD7,0xFD,0x46,0xBC,0x99,0x2D,0xCD,0x7D,0xB9, + + 0x69,0x69,0x3F,0x4D,0xD0,0x29,0x17,0xCB,0xCE,0x08,0x95,0x18,0xF0,0x32,0x51,0x7B, + + 0xE2,0xA8,0x4B,0x8D,0x81,0x8A,0xF7,0xAA,0xB1,0x16,0xC9,0x00,0x30,0x51,0xFD,0xD3, + + 0xF5,0xD1,0xD4,0x2E,0xE5,0xF1,0x40,0xEC,0x4C,0x0E,0x68,0x1C,0xDA,0xEA,0x58,0xA6, + + 0xF0,0x80,0x8A,0xA3,0xEE,0xAE,0x0A,0xE8,0x67,0xB8,0x4A,0x3B,0x7F,0x76,0x20,0xB7, + + 0x63,0x27,0x17,0xB3,0x67,0xAF,0xDF,0xED,0xC4,0x70,0xF7,0x2D,0xDE,0x00,0x19,0xA6, + + 0x78,0x4D,0x3E,0xA3,0xE0,0x2D,0x8D,0x85,0xCB,0xF3,0x97,0x1B,0xF8,0x64,0xB1,0x7D, + + 0x22,0xCB,0x28,0x01,0x5B,0x9B,0x75,0xE0,0x64,0x1E,0x03,0x5C,0x70,0xCB,0xA0,0xE3, + + 0x47,0x97,0xF2,0xA1,0xD8,0xD0,0xE1,0x9E,0xC2,0xFC,0x23,0x85,0x62,0x8E,0x36,0x05, + + 0xFD,0xB0,0x85,0x76,0xD7,0xBF,0x57,0x25,0xE6,0x16,0x93,0x21,0xF8,0x15,0x89,0xE2, + + 0xCB,0x9A,0x21,0x06,0x98,0x39,0xCF,0x81,0xE9,0xAC,0xA6,0x09,0x06,0xFE,0xC8,0xA2, + + 0xD5,0x71,0x0B,0xB7,0x1B,0xB6,0xC3,0x73,0x05,0xF9,0x56,0xD6,0x12,0x81,0x99,0xB2, + + 0xD0,0x70,0x2B,0x14,0x37,0x95,0x18,0x83,0x1F,0xF4,0x75,0x07,0xFF,0xFE,0x7D,0x3E, + + 0xA4,0x54,0x3A,0xB6,0x93,0x5A,0xC6,0x72,0x89,0x5E,0xAB,0xE3,0x13,0xF5,0x75,0x2A, + + 0x2E,0xE1,0xD5,0xF1,0x80,0x1D,0x87,0x0E,0x0A,0x86,0x22,0x17,0x5F,0x78,0x26,0x1A, + + 0xA8,0x12,0x08,0xFF,0x54,0xB8,0x2C,0x19,0x02,0x87,0xE9,0x2E,0xE9,0xFD,0x50,0x2C, + + 0x56,0x6C,0x22,0x0F,0x10,0x33,0xDE,0xB9,0xC7,0x37,0x5E,0xAC,0x1F,0x73,0x85,0x78, + + 0xC2,0x1A,0xF9,0xA5,0x51,0x2B,0x20,0x61,0x9B,0x5A,0x57,0x29,0x71,0x16,0x13,0xEB, + + 0x52,0xE0,0x59,0x19,0xBF,0x48,0xA2,0x26,0x1C,0xD2,0xDF,0x55,0xBA,0x36,0x38,0xE5, + + 0xDB,0xCA,0x7E,0x2C,0x6C,0x52,0x00,0x19,0xE7,0x3E,0x69,0x68,0x7C,0xB5,0x0E,0xE8, + + 0x2D,0x5F,0x03,0xAF,0x2C,0x7F,0x20,0x0C,0x6D,0x26,0xA1,0x14,0x6E,0x30,0x39,0xE5, + + 0xAC,0x9C,0x9E,0x7E,0x1F,0x98,0x29,0x18,0x17,0x3C,0xEF,0x17,0x56,0x73,0x8F,0x9C, + + 0xAD,0x9D,0x0B,0xBE,0xB8,0x1D,0x5F,0x8A,0x87,0x56,0x26,0xF5,0x5E,0x00,0x20,0xF1, + + 0x62,0xE5,0x70,0xED,0xFD,0x83,0x56,0x1A,0x45,0x90,0xE8,0xAE,0xBD,0x7A,0x38,0x16, + + 0x0C,0x7E,0xF8,0xE5,0x3F,0x95,0x58,0x78,0xA8,0x6C,0x00,0xD6,0x09,0xFA,0x19,0xF0, + + 0xEA,0x83,0xF7,0xE5,0x5C,0xA1,0x90,0x1B,0x58,0x73,0xE9,0xB7,0xE7,0xAE,0x13,0xE0, + + 0x92,0x2C,0x79,0x06,0xF9,0x83,0xAF,0xD1,0x39,0xD9,0xF3,0x51,0xF6,0xB3,0xE0,0xCE, + + 0x00,0xE6,0xBB,0x7D,0x10,0xAE,0xCD,0x39,0x97,0x99,0xE0,0xF3,0x2F,0x69,0x16,0x6F, + + 0x6C,0x64,0x78,0x25,0x4C,0xAC,0xB8,0xF7,0xA8,0xC6,0xB5,0xB6,0x3E,0x6E,0x47,0x31, + + 0x6D,0x57,0x9E,0x54,0xAE,0x47,0x5A,0xE7,0xCE,0xA1,0x0E,0x18,0x5B,0x40,0x6D,0x20, + + 0xAE,0x05,0x69,0xC6,0xCC,0x0A,0x3C,0xF3,0x7A,0x66,0x5C,0x4A,0x64,0xAA,0xEF,0xF7, + + 0x0E,0x53,0xBF,0x49,0xF5,0xD2,0xE9,0x2A,0xBC,0x6B,0x1A,0xA7,0xD9,0x6A,0x14,0x7B, + + 0x65,0x84,0xD3,0x6F,0x0A,0xBF,0xCE,0x55,0x4B,0xAB,0x9A,0x16,0x7D,0x4A,0xD6,0x8F, + + 0xD0,0x6A,0xC5,0x62,0xFF,0xAE,0x04,0x9F,0xCA,0xEA,0x1B,0xB6,0x59,0x49,0xD6,0xE2, + + 0x8F,0x10,0xE3,0x16,0x74,0xD2,0x6B,0x55,0xAC,0xCF,0xEB,0x01,0xA9,0x1E,0x9D,0x39, + + 0x62,0xE0,0xFC,0xDE,0xE1,0x01,0x4A,0x95,0xFB,0xAF,0xEA,0xA3,0x3D,0x96,0x99,0xDE, + + 0x4D,0x8F,0x6A,0x4F,0x48,0x00,0x5A,0x6A,0x07,0x2C,0xA8,0x51,0xB4,0x89,0x84,0x0B, + + 0x8A,0xA6,0x28,0x08,0x40,0xA4,0x88,0xEF,0xC0,0x21,0x64,0x9C,0x5A,0x63,0x79,0x47, + + 0x89,0xCD,0x24,0x3F,0x9B,0x0D,0x77,0x42,0x40,0x62,0xC3,0x81,0xB4,0xE0,0x3E,0x7E, + + 0xD0,0xD2,0x64,0x03,0xAF,0x1D,0x14,0x48,0xD1,0x59,0xEC,0xAB,0xF6,0xEC,0xBA,0xE1, + + 0x49,0xFD,0x6C,0x06,0x31,0x17,0xD4,0x3B,0x2D,0xC0,0xBC,0xB6,0x75,0xF1,0x6B,0xBD, + + 0x45,0x3D,0xB4,0x03,0xB2,0x01,0x15,0x29,0xE5,0x92,0x87,0x23,0xB4,0x5E,0x4B,0xF2, + + 0xA4,0xD3,0x3A,0xE9,0x7F,0x62,0x39,0x42,0x59,0xD0,0x2D,0x35,0x64,0x76,0xE4,0x59, + + 0xCD,0x25,0x84,0x8D,0x13,0xF6,0x71,0x73,0x0A,0x21,0x18,0x9D,0xE8,0x69,0xC0,0xA1, + + 0x1B,0xE3,0xDB,0x52,0x39,0x56,0x5C,0x15,0x61,0xAE,0x3A,0xF4,0x53,0x28,0xDE,0x59, + + 0x4D,0x07,0x25,0x51,0x34,0xEA,0xE3,0x67,0x91,0x7F,0x14,0xA7,0xB6,0xB8,0x53,0xFF, + + 0x31,0x9D,0x8D,0x99,0x65,0xB3,0x7D,0x80,0x8B,0xBB,0x87,0x97,0xA1,0x7C,0x32,0x2B, + + 0xCD,0x37,0xEE,0x12,0x3A,0xFA,0x87,0x0B,0xD4,0x9B,0x76,0xBE,0xB5,0xF8,0x48,0xEB, + + 0x2E,0xD2,0x11,0x7C,0x56,0xB6,0xFE,0xDD,0x6E,0xAB,0xC6,0xBA,0x94,0xD0,0x36,0xF8, + + 0x9C,0xF6,0x72,0xF1,0x1F,0xDF,0xF7,0xAF,0x89,0x98,0xB7,0xAF,0xFC,0x51,0xEF,0x1F, + + 0x29,0xF5,0x2F,0xEC,0x8D,0xF9,0x01,0xCA,0x8D,0x24,0x8D,0x8F,0xA9,0xB9,0x6B,0x8D, + + 0xC7,0x2D,0x61,0x4C,0xAB,0xAA,0x10,0x8B,0x6D,0xEC,0x15,0xD2,0x95,0xB8,0x66,0x9A, + + 0x29,0xDF,0xC3,0xCD,0x39,0xDF,0x60,0xEB,0x03,0xD9,0x5A,0x8C,0xDC,0x76,0x82,0xB8, + + 0xDE,0xC8,0x27,0x4B,0x78,0xB8,0xC0,0xDE,0xE8,0x05,0xCD,0x5F,0x6B,0x51,0xBA,0x5F, + + 0xA1,0xA1,0x39,0x5D,0x26,0x16,0x07,0x3D,0x85,0x9E,0x89,0xC3,0x14,0xBB,0x3A,0xB0, + + 0x99,0xAF,0x97,0xF7,0x68,0xAD,0xE8,0x53,0x78,0x2C,0x05,0xA0,0x12,0x50,0x16,0x2C, + + 0xB2,0x8C,0xB6,0x2D,0x79,0x50,0x88,0x42,0xAA,0x10,0x49,0xCE,0xB8,0x10,0xA5,0x73, + + 0x23,0x89,0xE7,0x3D,0x7B,0xB3,0x77,0x40,0xC1,0x62,0x04,0xDE,0x39,0x6D,0xF1,0x0C, + + 0x01,0xA5,0xF7,0x38,0x78,0xB2,0x67,0x1C,0xAA,0x92,0xBF,0x44,0x72,0xE6,0x7A,0xB3, + + 0x3A,0xA9,0x3B,0xC0,0x57,0x19,0x2E,0xCC,0xEE,0x49,0xA8,0x43,0xAF,0x6B,0x00,0x9C, + + 0x30,0xC8,0x73,0x0E,0x15,0x47,0x7B,0x8F,0xB6,0xC6,0x23,0x53,0xF2,0x9A,0x54,0x06, + + 0x48,0x57,0xEE,0x3A,0x4B,0xBA,0x2F,0xCC,0xC4,0x24,0x11,0xE1,0x84,0x6B,0x89,0xD5, + + 0xCC,0x1A,0x50,0x95,0x83,0x65,0xAC,0x8F,0x2A,0xEE,0x35,0xE7,0xD3,0xBA,0x92,0x7A, + + 0xE3,0x93,0xD4,0x20,0xF3,0x79,0x21,0xD9,0x34,0x4A,0xB4,0xCE,0x11,0xC7,0x9B,0xF0, + + 0x97,0xC6,0x9F,0x98,0x17,0x95,0xAD,0x11,0x4F,0xD2,0x31,0x52,0x8C,0x12,0x5A,0x87, + + 0x6F,0x46,0x84,0x0F,0x12,0x87,0x4C,0xA9,0xBB,0x3F,0x19,0x72,0x65,0x96,0x52,0x77, + + 0x2E,0x1B,0xB3,0xE7,0x35,0x26,0x8E,0x02,0xF1,0xBE,0xDB,0xD1,0x65,0x29,0x6A,0x2A, + + 0xB3,0x00,0x02,0xD0,0xBB,0xB3,0xAF,0x84,0x4A,0xF7,0xC8,0x6E,0x98,0x68,0xF7,0x1A, + + 0xAA,0xA0,0x8D,0x74,0xF2,0x1E,0x12,0x83,0xC9,0x51,0x93,0x8C,0xDB,0x72,0x7B,0x27, + + 0x0B,0x03,0x77,0x2F,0x61,0x2D,0x13,0x91,0x3E,0x0C,0xDB,0xF9,0x27,0xC8,0x1F,0x68, + + 0x2A,0xF0,0x27,0xCF,0x9F,0x27,0xE5,0x1B,0x30,0xBA,0x60,0x0D,0x5B,0x79,0xD3,0x9E, + + 0x02,0xE4,0x14,0xC3,0xC9,0x96,0x2A,0x9D,0x1C,0xFF,0x94,0xB7,0x44,0xB8,0x74,0xA2, + + 0x49,0x1C,0xEA,0xB8,0xDA,0xA0,0x62,0xB7,0xC0,0x8E,0x2B,0x89,0x85,0xA0,0x51,0xF2, + + 0xC9,0xA6,0x10,0x76,0xC8,0xAF,0xB5,0xD2,0x94,0x81,0x20,0x9C,0x44,0xE3,0xF2,0xE2, + + 0x02,0x70,0x61,0xE6,0xC9,0x95,0xA9,0xD3,0x1E,0xF7,0x5D,0xED,0xFA,0xDE,0x39,0x02, + + 0x83,0x0B,0x97,0x3E,0x34,0x76,0x01,0x93,0x58,0x38,0x0F,0xDA,0x76,0x7E,0x9F,0x2E, + + 0x9A,0xA6,0x6C,0xB6,0x84,0x50,0x60,0x52,0x65,0x17,0x8B,0xCF,0x1A,0xEE,0xF8,0xFC, + + 0x5D,0x4B,0x06,0x87,0x3E,0x3A,0x33,0x90,0xE3,0x16,0xAA,0xDB,0x80,0x83,0x32,0xBB, + + 0xD1,0x88,0xF5,0x3A,0xD8,0x38,0x9E,0x93,0x14,0x32,0xDD,0x71,0xF7,0x25,0xFD,0xF7, + + 0x48,0x1A,0x1B,0x7C,0xB8,0x27,0x81,0xAE,0xA0,0x89,0x07,0x5D,0xDB,0x38,0xFB,0x6B, + + 0x0F,0x92,0x0E,0x5A,0x1F,0x3A,0x21,0x3C,0x21,0xA9,0x89,0x4F,0x01,0xA4,0x79,0x2C, + + 0x5D,0x99,0x99,0xB5,0x2A,0x32,0xB3,0x58,0x4B,0x1A,0xA5,0x93,0x5B,0xDB,0x27,0xA4, + + 0x42,0x5F,0x5F,0x0D,0x99,0x0A,0x27,0x57,0x45,0x56,0xC9,0x85,0x12,0xEA,0x1F,0xBE, + + 0x2C,0x9C,0x46,0xBF,0x00,0xB9,0x6E,0x07,0xFF,0x81,0x75,0x54,0xA6,0xCF,0x1A,0x2B, + + 0x01,0x90,0xF0,0x3E,0x59,0x88,0x66,0x13,0xD8,0x88,0x65,0x4C,0xC5,0x22,0x32,0xBA, + + 0x96,0xBF,0xD5,0x4D,0x51,0x7A,0xFE,0x87,0xC4,0xF8,0x17,0x68,0x2A,0x01,0x19,0x79, + + 0x40,0x1C,0xB1,0xDA,0x1A,0xE0,0x01,0xC6,0x8C,0x82,0x70,0x92,0x26,0xA0,0xD8,0xEA, + + 0xD2,0x4F,0xDF,0x7C,0x99,0xC2,0xA7,0x1C,0x30,0x82,0xBB,0xE7,0x3F,0x71,0xF2,0xB6, + + 0x21,0x2C,0x04,0x65,0x29,0x57,0x06,0x43,0x25,0x1E,0xE6,0x0A,0xE9,0x4A,0x89,0x3B, + + 0xB7,0x34,0x5A,0x7C,0x9A,0x5D,0x6A,0x62,0x25,0x7D,0x04,0xD6,0xAC,0xE0,0x37,0x23, + + 0x72,0x22,0x97,0x3B,0x43,0xA9,0xC6,0x48,0x48,0x35,0x2E,0xB7,0x1D,0x92,0x5E,0xE2, + + 0x28,0x5B,0xF4,0x35,0x7F,0x25,0x21,0xE6,0x0D,0xC1,0xB8,0x6A,0xAB,0x45,0xD3,0xE2, + + 0xBB,0x5A,0x44,0xC9,0x14,0x67,0x70,0xE2,0xAE,0xD6,0xAE,0xCE,0xBC,0x76,0xDE,0x73, + + 0x84,0x79,0x1A,0xB8,0x7F,0x95,0xCE,0xA4,0x04,0x66,0xA6,0x94,0xAC,0x3B,0x57,0x7E, + + 0x38,0xDC,0xB3,0x27,0xFF,0xB4,0x1B,0x63,0xC6,0xB7,0xFF,0xDE,0x5E,0xCB,0x1A,0x15, + + 0xAF,0x0D,0x22,0xC8,0x3A,0x23,0x7A,0x5B,0xB5,0x49,0xA7,0x5D,0x64,0xE1,0x52,0xAA, + + 0xAE,0x56,0x6E,0x7A,0xBC,0x2E,0xC1,0x45,0x25,0xC4,0x3A,0xC5,0xBC,0x4A,0x31,0x0B, + + 0x73,0x27,0x1E,0x3E,0xA4,0xE8,0xB3,0xD4,0x2D,0xA9,0xE4,0x5C,0xA0,0x6B,0xF6,0x1A, + + 0x89,0xAB,0x2F,0x1A,0x39,0xE8,0xC4,0x45,0xE3,0x14,0x28,0xC5,0xB6,0x43,0x62,0xB3, + + 0xBF,0x17,0x9C,0x48,0xFF,0x2F,0x4C,0x0B,0x2E,0xB3,0x32,0xEB,0x6B,0xE6,0x02,0x38, + + 0xB0,0x83,0x98,0x5F,0x53,0x00,0x9D,0x3A,0x43,0x66,0x23,0x7E,0x24,0xEF,0x54,0xCF, + + 0xB0,0x20,0x50,0xBC,0x12,0xA3,0x8C,0x18,0xFC,0xA0,0xB3,0x1C,0xB7,0x91,0x53,0xB5, + + 0x0C,0x82,0x76,0x66,0x64,0x22,0x73,0x6A,0x2E,0x60,0xA0,0x44,0xA0,0xED,0x7E,0x81, + + 0x52,0x65,0x23,0x02,0x32,0xB7,0xC9,0xE5,0x99,0xA6,0x74,0x36,0x6C,0x25,0x2C,0x81, + + 0x4C,0x59,0x62,0x51,0x33,0x31,0x03,0x36,0x63,0x8E,0x2B,0xC8,0x1F,0x20,0x85,0x7D, + + 0xCF,0x3A,0xFC,0xF1,0xB2,0xF0,0xCA,0xDD,0x72,0x0D,0xCD,0x96,0x88,0x5D,0x98,0x32, + + 0x11,0x90,0x7F,0xD7,0xBD,0xF2,0x05,0x5D,0x49,0xDE,0xC3,0x8B,0xBF,0xC2,0x62,0xEB, + + 0xA6,0x62,0x50,0xA4,0x4E,0x4B,0xA0,0x71,0xC7,0x6B,0xAA,0xB3,0x76,0x50,0x12,0x6A, + + 0xCC,0x26,0xEC,0x2F,0x3B,0xF7,0xC7,0xB0,0xC6,0x28,0xCF,0x4E,0x71,0x8D,0xF5,0xDC, + + 0x94,0x1B,0x5E,0x7F,0x41,0x2D,0x0E,0x67,0xEA,0xB6,0xEB,0xAF,0x0E,0x45,0x53,0x7B, + + 0x6F,0x3E,0xE9,0x70,0x5E,0xBF,0x55,0x91,0x13,0x84,0x9F,0xD3,0xF7,0xF7,0x11,0x2F, + + 0xDC,0xDB,0x4A,0xAA,0xB1,0xF9,0xCB,0xED,0x91,0xAE,0x96,0x11,0x9D,0x57,0xFE,0x72, + + 0x83,0xD4,0xB0,0x0E,0xD6,0xE8,0x40,0x82,0x4F,0x34,0x04,0x3A,0x3D,0x36,0xA7,0xD3, + + 0xA7,0xD6,0x67,0x0A,0x74,0x17,0x49,0x92,0x19,0x8C,0xE7,0x5C,0xD6,0xE1,0x51,0xB2, + + 0xCE,0x64,0x91,0xFE,0xFF,0x14,0xBA,0xFC,0x0C,0x7D,0xBF,0xBF,0xFD,0xFB,0x1E,0xF8, + + 0xE6,0x93,0xF0,0xAC,0xC5,0xFE,0xC1,0x47,0x68,0xBE,0xF6,0xEE,0x7E,0xFC,0x66,0xDF, + + 0xC6,0x8E,0x09,0x21,0x8A,0x6B,0x46,0x11,0xDC,0xD3,0xFE,0xFE,0x7F,0xFD,0xB4,0x38, + + 0xD0,0x35,0x67,0x43,0x33,0xC3,0x51,0x85,0xC0,0x78,0xF7,0xEF,0xFE,0xFE,0xAF,0x5F, + + 0x18,0x92,0x87,0xD9,0x3C,0xDB,0x47,0x04,0x6C,0xD2,0xFF,0xFF,0x71,0x9D,0x80,0x19, + + 0x40,0x40,0x30,0x08,0xF1,0x43,0x16,0x7E,0xCD,0x22,0xA7,0x70,0x23,0x60,0xA7,0xE1, + + 0xED,0x0C,0x9A,0x10,0xF8,0xA0,0x0E,0x9D,0xAA,0x32,0x8E,0x56,0xAE,0xBC,0x00,0xDF, + + 0xEB,0xC7,0x83,0xF6,0xF4,0x89,0xBA,0xA4,0x53,0x7D,0x51,0x3D,0x83,0x9F,0x57,0x22, + + 0x01,0xA8,0x65,0x86,0xF9,0x29,0xA2,0x80,0xF7,0xEC,0x4D,0xCB,0x2C,0xE2,0x12,0x4F, + + 0xE9,0x95,0xB9,0x32,0xE1,0x34,0x46,0x48,0xA9,0x55,0x01,0x7B,0x6C,0x0A,0x5E,0x91, + + 0xFC,0x88,0x7B,0x69,0x15,0xF5,0xCE,0x0F,0x2B,0x34,0xE6,0xD8,0x91,0x65,0x61,0x61, + + 0x6B,0x47,0x7B,0xBE,0x6E,0x25,0xEA,0xD0,0xAE,0xE9,0xEF,0xC8,0x10,0x99,0x9D,0xAF, + + 0x7B,0xCF,0xD3,0x0F,0x66,0xBB,0x27,0x5C,0x36,0xE4,0xD1,0x61,0xB8,0x34,0x30,0x18, + + 0x8D,0x1E,0x06,0x08,0x58,0x9B,0xC3,0x7A,0xFB,0xC2,0xF3,0xDF,0x20,0xB5,0x2D,0x19, + + 0x62,0x7D,0xF4,0x20,0xF0,0xA8,0xCF,0x6A,0x0A,0xB9,0x2D,0x00,0xA4,0x0A,0x5D,0x13, + + 0x88,0xA1,0xBD,0xDD,0xDB,0x0A,0x6B,0x63,0xF9,0xE7,0xC1,0x22,0x33,0xFB,0x89,0xDF, + + 0x1B,0x08,0x91,0x19,0xB8,0x4B,0x12,0xCA,0xF3,0xE6,0xFD,0x5F,0x2E,0x96,0x19,0x48, + + 0x0C,0x9C,0xED,0x33,0xC3,0x22,0xC3,0x9B,0x7E,0x4D,0xD2,0x9D,0x64,0x93,0xB5,0x26, + + 0x25,0xD2,0x31,0x1B,0xE2,0xDB,0x76,0x0A,0xA0,0x2C,0xE9,0xC9,0x78,0x2D,0x08,0x36, + + 0xE2,0x03,0xFB,0xB2,0x19,0x23,0x54,0x6C,0xCE,0x2E,0xD5,0xC5,0x33,0x7D,0xF4,0x69, + + 0x19,0xA0,0xB5,0xED,0x6A,0xF9,0x65,0x5C,0x46,0xC9,0xDD,0xC8,0x99,0xC0,0x90,0x73, + + 0xA4,0x9D,0xA4,0x99,0x5B,0xD1,0x91,0xDD,0x89,0x31,0xAC,0x25,0x1B,0x91,0x36,0x72, + + 0x69,0x70,0xD2,0xBD,0x39,0x9A,0x65,0xE6,0x94,0x9D,0xC2,0x9D,0x79,0xDA,0x57,0xCB, + + 0x4B,0x76,0xB0,0x74,0x80,0x33,0x03,0xC3,0x80,0x28,0xA0,0x54,0xC0,0x7F,0x33,0xB4, + + 0x43,0xC3,0x1C,0xBE,0xDA,0x42,0x1C,0xE7,0x1C,0x9F,0x0C,0x9B,0x9A,0x02,0x8C,0xE6, + + 0x72,0x99,0xC8,0x2E,0xD7,0xAB,0x2A,0xE7,0xC3,0xFB,0xB7,0xF7,0x23,0x15,0x06,0xD1, + + 0x5E,0x1C,0x9C,0xEA,0x4F,0x77,0x0C,0xDF,0x5B,0x00,0xDC,0xB4,0x0A,0xD1,0x91,0x3E, + + 0x4B,0x9C,0xC4,0xB3,0x49,0xC3,0xC2,0xC6,0x43,0xF9,0xEB,0xC0,0x7D,0xF0,0x0F,0xA2, + + 0xFA,0x96,0x4E,0xA5,0x30,0x3A,0xCC,0xDA,0xDF,0x51,0xCC,0xF3,0x3B,0x96,0x39,0xFA, + + 0xC3,0x79,0x8E,0x2C,0x60,0x58,0xCD,0xA4,0x17,0xA1,0x96,0xAE,0x24,0xD3,0x8E,0xAA, + + 0x49,0x49,0x0B,0xB8,0xD0,0x78,0xDE,0xB5,0x14,0xF4,0x86,0x4D,0x41,0x59,0x39,0xAC, + + 0xC3,0x15,0x07,0x89,0xCE,0x39,0xA2,0x9D,0x10,0x69,0x01,0x86,0x93,0x6B,0xF0,0xEA, + + 0x0A,0x98,0x99,0x59,0x46,0xB6,0x8B,0x88,0x48,0xDA,0xC1,0x91,0x41,0xD0,0x1C,0x37, + + 0xCB,0x9F,0x51,0x3F,0x5C,0x32,0x56,0xF4,0x6C,0xCC,0x72,0x8E,0x8D,0x19,0x10,0x60, + + 0x23,0xB2,0xE8,0xF4,0xBF,0x99,0x26,0x59,0xE6,0xD6,0x6F,0xD0,0xC3,0x0C,0xF6,0x82, + + 0x57,0x22,0xFF,0x71,0x51,0x9D,0xE0,0x1A,0xCC,0xFA,0xEF,0x12,0x46,0x4F,0x18,0xD2, + + 0xDD,0x1B,0x59,0xDA,0x1A,0xE0,0xDF,0x6A,0x8B,0xF0,0x1F,0xE5,0x3B,0xC0,0xC3,0xF9, + + 0x20,0xC0,0x20,0x07,0xBA,0x0D,0xE5,0xF2,0x18,0x6F,0xA6,0x44,0xAB,0x3D,0x9F,0x13, + + 0x88,0x8D,0x2C,0x12,0x55,0xB2,0x5A,0x8F,0x44,0xB1,0xAF,0xC5,0x2D,0x3C,0xA6,0xAD, + + 0x0B,0x80,0x31,0x94,0x9F,0xAA,0xA3,0x50,0xFE,0xAC,0x65,0xD9,0x29,0x43,0x41,0x0C, + + 0xA1,0x82,0x97,0xD2,0xB7,0xAE,0x60,0x58,0xA6,0x3C,0xEF,0x0F,0x3E,0x72,0x77,0x3C, + + 0x64,0xF0,0x9E,0xE3,0xFF,0x97,0xF6,0x22,0x4A,0x84,0x50,0x7C,0xDA,0x49,0xD7,0xF7, + + 0xCD,0x88,0x91,0x20,0xE4,0xB5,0x6E,0x57,0xAC,0x81,0xA2,0x72,0x3F,0xF4,0x1F,0x7B, + + 0x7A,0x57,0xF7,0x25,0xF6,0xDC,0x73,0xCB,0xA5,0xD9,0x24,0x85,0x9E,0x87,0x92,0x2C, + + 0xEF,0x8A,0x53,0xAC,0x6B,0xE4,0x43,0xC3,0x0A,0x68,0x87,0x5F,0x36,0x44,0x25,0x0F, + + 0x08,0x88,0xE6,0xFF,0x70,0x9D,0xCA,0xC2,0xA9,0x87,0x32,0x2A,0x2A,0x45,0x74,0xB2, + + 0x0D,0x04,0xBF,0x1F,0x76,0xF8,0xBB,0xC7,0xB0,0xBC,0xB2,0x3B,0x59,0x69,0x5D,0xFA, + + 0xE2,0x96,0xFD,0x27,0x3C,0x01,0xB3,0x3B,0xB6,0x11,0x23,0x68,0x16,0xA0,0x55,0x3E, + + 0x6C,0x2A,0x9E,0xEE,0xA1,0xA7,0xA9,0x00,0xF7,0x89,0xEC,0x4C,0xD2,0xE8,0x9D,0x34, + + 0x20,0x53,0x51,0xEF,0x18,0x7C,0xD6,0x08,0x6F,0xAC,0x64,0x9D,0x32,0x67,0x7D,0x24, + + 0x65,0x1C,0x55,0x1C,0xBE,0x00,0x6B,0x4A,0x1B,0x62,0x6F,0x0C,0x35,0xBC,0xDC,0x7A, + + 0xF6,0x21,0xF9,0x31,0x1F,0xA3,0xF3,0x6E,0x2A,0x63,0x73,0x5E,0xE2,0x41,0x15,0x63, + + 0xAF,0x3F,0xBE,0x6E,0x3E,0x2E,0xDB,0x09,0xA5,0x2E,0x85,0x53,0xDB,0xAF,0x74,0x7C, + + 0xD9,0x19,0x70,0x78,0xCC,0x78,0x38,0x48,0xA1,0x0D,0x21,0xA4,0x54,0x40,0x88,0xF0, + + 0xDE,0x0A,0xE7,0xE9,0x5D,0xBC,0x96,0xA3,0x49,0x7C,0x0B,0x92,0x02,0xF1,0xA1,0x70, + + 0x20,0x46,0xFE,0x87,0xB2,0x22,0x9F,0xAB,0x21,0x2F,0xF8,0x07,0xE8,0x20,0x2D,0x7B, + + 0x44,0xDE,0x52,0xE9,0x9B,0x6C,0xA9,0xF4,0x27,0x93,0x8A,0xE3,0x86,0xF3,0x61,0x33, + + 0x54,0xB4,0x50,0xA4,0xBB,0x12,0x21,0xD3,0xC7,0x55,0xC7,0x04,0x70,0x24,0xBF,0x22, + + 0x9B,0x06,0x38,0x28,0x8B,0x84,0x7D,0x84,0x9C,0xAE,0xDA,0xCE,0xFB,0x28,0x3B,0x7A, + + 0x12,0x3D,0xB7,0x38,0x43,0x10,0x79,0x09,0x03,0x49,0x80,0xF4,0x8E,0xB2,0xDC,0x6A, + + 0x1F,0x44,0x5C,0xFB,0x0F,0xC6,0x7E,0xCC,0xC1,0x02,0x85,0xD0,0x0A,0xF8,0xDD,0x82, + + 0x89,0x67,0x19,0xBE,0xAE,0x17,0x7E,0xAF,0x68,0xD8,0x76,0xB6,0x2F,0x05,0x34,0x84, + + 0x1B,0x6D,0xD0,0xA6,0xBD,0x2B,0xE1,0xBB,0xED,0x99,0x6A,0x40,0x80,0x78,0xFA,0x87, + + 0xAA,0x4A,0xB0,0xF1,0xDE,0xCE,0x7D,0x8B,0xFC,0x5A,0xA1,0xCD,0x03,0x27,0xFA,0xE8, + + 0x93,0x80,0x18,0xBB,0xCA,0xBB,0xE0,0xBB,0x31,0x7A,0xDE,0x4C,0x85,0x26,0xA6,0xD2, + + 0x23,0x63,0x26,0xD6,0xFE,0xD0,0x22,0x6E,0x3A,0x55,0xAC,0xEF,0x16,0x2F,0xD1,0xEB, + + 0x8E,0x62,0x96,0x4D,0x55,0x22,0x56,0x98,0x86,0xEE,0xA9,0x0D,0x05,0x88,0xB3,0x58, + + 0x0F,0x41,0x81,0x7B,0x45,0x13,0xCC,0xA9,0x4F,0x23,0x89,0x53,0x1F,0x5D,0xD4,0x7E, + + 0x58,0x62,0x2F,0xC3,0x05,0x6B,0x69,0x99,0x8F,0xA5,0xAC,0x11,0x47,0x2C,0xC0,0x18, + + 0x0D,0xFF,0x05,0xB5,0xF9,0xCA,0x77,0x28,0x2B,0x85,0x35,0xD5,0x34,0x76,0xB7,0x21, + + 0xA0,0xFE,0x3F,0x40,0xE6,0x94,0x46,0x03,0xC1,0xEA,0xC0,0xAC,0xAD,0xA9,0xD5,0x92, + + 0x21,0xDD,0x8F,0xD1,0xB3,0xB0,0x77,0xD0,0x2C,0x49,0xAF,0xF0,0x99,0xA8,0xB2,0xB4, + + 0x76,0xFE,0x41,0xEF,0x97,0xB3,0x2B,0x21,0x44,0x55,0x62,0x0E,0xDA,0xFC,0x1E,0xD2, + + 0x06,0xD0,0xFE,0x3A,0xB1,0x41,0xC0,0x91,0xE1,0x04,0x46,0x95,0x62,0xC2,0x2F,0xA1, + + 0xD1,0x45,0x48,0x44,0xB6,0x2B,0x4A,0x83,0x23,0x98,0x16,0xCF,0x57,0x14,0xA2,0x5E, + + 0x5C,0xA9,0xFF,0x3A,0x31,0x54,0x63,0x5F,0x61,0xE7,0x8F,0x4C,0xB1,0x62,0x37,0x67, + + 0x68,0xE2,0xA1,0xD3,0x6F,0x66,0x0F,0x54,0x28,0x26,0xE7,0xB0,0xF1,0x6A,0x14,0x20, + + 0xE3,0x19,0xC9,0x73,0x70,0x25,0x31,0x32,0x90,0xFC,0x52,0x34,0x0B,0x95,0x9C,0x67, + + 0x61,0x78,0x35,0x2D,0x7D,0x86,0x7B,0x98,0x9F,0xF6,0x4E,0xC2,0xA4,0xC8,0xB8,0xB8, + + 0xE4,0xA5,0x7C,0x73,0xB6,0xF5,0x4D,0x26,0x9A,0x04,0x85,0x4F,0x27,0xB7,0x75,0x34, + + 0x7C,0xA8,0x19,0x63,0xF3,0x8A,0x45,0xAF,0x03,0xE0,0x09,0xCE,0xBD,0xB6,0x1C,0x7B, + + 0x1A,0xA3,0x2E,0xCC,0xE6,0x0C,0xEB,0x19,0x07,0x47,0x50,0x90,0xE2,0x97,0x69,0xA9, + + 0xD3,0x4D,0x5A,0x47,0x37,0xD0,0x64,0x2C,0x20,0x42,0xEF,0x81,0x7A,0xB9,0x71,0x0F, + + 0x18,0xA1,0x6F,0x0F,0x19,0xDA,0x40,0x7A,0x9B,0x7F,0xEB,0x6F,0x9A,0xB5,0x15,0x56, + + 0xCF,0x41,0xD9,0x7D,0x70,0x5E,0xDB,0x4B,0x3F,0x40,0x49,0x62,0xB7,0xC2,0xB3,0xA4, + + 0xAF,0x12,0x3B,0xB5,0x54,0x9F,0x33,0xBB,0x0B,0x24,0x40,0x5A,0x8D,0xD1,0x64,0x61, + + 0x0D,0x65,0xF2,0xA5,0xDA,0x50,0xFF,0x4B,0x43,0x41,0xCA,0x85,0x9A,0xD0,0xB2,0x80, + + 0x2D,0x1E,0x17,0xFB,0xDA,0x93,0x95,0x67,0x72,0x51,0x07,0x56,0x94,0xAF,0x53,0xA1, + + 0x33,0xB8,0xAB,0xA1,0xD1,0x73,0x1F,0x4C,0xE1,0x57,0xE3,0x90,0x39,0xB2,0x1A,0x2F, + + 0x2E,0xBF,0xBA,0xFD,0x49,0xB4,0xC0,0x26,0x3E,0x57,0xF4,0xF4,0x05,0x41,0x12,0xCA, + + 0x23,0xBE,0x84,0xD1,0x37,0x25,0x23,0xE3,0x9D,0xA8,0x7B,0xC1,0x9A,0xA4,0xB8,0x61, + + 0x27,0x00,0xFA,0x02,0x78,0xA7,0xB6,0x1A,0xC0,0x49,0x0A,0xE7,0x26,0xB7,0x6A,0xD5, + + 0xC8,0x63,0xA0,0x6E,0xF3,0x45,0x7B,0x4F,0x16,0xF3,0x6E,0xCC,0xC0,0x37,0x10,0x87, + + 0x43,0xD9,0x80,0x4B,0xC4,0x00,0x96,0x55,0x60,0xAC,0x84,0xEA,0x24,0xD5,0x03,0x64, + + 0x29,0xAC,0xD5,0x9C,0x3F,0xA9,0xC1,0xBC,0xE9,0x19,0x18,0xA9,0x85,0xE8,0x66,0xCF, + + 0xF4,0xEF,0x5C,0x8D,0x40,0xD2,0x82,0x09,0xFC,0xDA,0x06,0x4D,0xF4,0x3A,0x81,0x61, + + 0xA9,0x59,0xC4,0xE2,0x8A,0x7B,0xC0,0xB8,0x35,0x1A,0x20,0x18,0x33,0x76,0xC4,0x0E, + + 0xB8,0x1F,0xF8,0x09,0x18,0x31,0x21,0x93,0xA2,0xCB,0x7A,0x49,0xAF,0x1F,0xA2,0x4A, + + 0x2B,0x15,0xFE,0xDE,0x7B,0xE6,0x9F,0xFC,0x2F,0x0E,0x84,0x0F,0x43,0xA0,0xC0,0xA4, + + 0x43,0x2F,0x45,0x31,0x02,0xC5,0x6C,0x18,0x55,0x4C,0x7C,0x27,0x41,0xFF,0x9B,0x79, + + 0xF3,0x1D,0xFA,0x20,0x9B,0xEB,0x1A,0xFD,0xAF,0x1C,0x8D,0x6E,0x10,0x6E,0xB1,0xF1, + + 0x30,0x2D,0xDE,0x37,0x94,0xC2,0xD6,0xC6,0xA5,0x6F,0xE6,0x17,0xBF,0x41,0x1A,0x2C, + + 0xA6,0x20,0x57,0x65,0x52,0xC2,0x46,0xAC,0xAE,0x37,0xAE,0x54,0xAA,0x4C,0xB3,0xF2, + + 0x27,0xC2,0x9F,0xD2,0xFC,0xAF,0x57,0xD2,0x06,0x42,0x91,0xA2,0x3D,0x08,0x3E,0xE0, + + 0xFD,0x5E,0x52,0x68,0xFD,0x62,0x67,0xA8,0xD5,0x6C,0x73,0x92,0x22,0x1E,0x01,0xE2, + + 0xD0,0x3B,0xDA,0xF6,0xA2,0x0B,0x66,0x56,0xAD,0x05,0x63,0x58,0x2E,0xFF,0x9B,0xAC, + + 0xCF,0x32,0xB8,0x5E,0x1B,0x28,0x6E,0x4D,0x37,0x38,0x2C,0x28,0xC4,0xDA,0x47,0xFC, + + 0x79,0x22,0x70,0xB6,0xE6,0xE6,0xCA,0xD2,0xAE,0x69,0x71,0x20,0xF8,0x3A,0x16,0x40, + + 0x75,0x18,0x97,0x6F,0x6B,0x9F,0xAD,0xE0,0x66,0x18,0xEB,0x97,0x3C,0xD6,0x74,0x32, + + 0xE7,0x19,0xDC,0x3A,0xE9,0x0B,0x51,0xDB,0xA8,0x6E,0xA4,0x1A,0xB7,0x29,0x6C,0x2A, + + 0x09,0xA9,0xE7,0x2F,0xBC,0x56,0x0C,0xCB,0xAD,0x89,0xAC,0x4D,0x46,0x48,0x65,0x2E, + + 0x0C,0x1E,0xB5,0xFC,0xF4,0x07,0x6D,0x1C,0xEF,0x65,0x08,0x9E,0xB4,0x45,0xAA,0xD9, + + 0x0E,0xCD,0x95,0xD7,0xB3,0x74,0x93,0xB1,0x1D,0x5F,0x83,0xC0,0x34,0xF1,0x57,0x66, + + 0xB7,0x87,0x39,0x4E,0xE6,0x44,0xCD,0x5B,0xEF,0x33,0x49,0xDE,0x94,0x43,0xDB,0x0F, + + 0xBA,0x86,0xA1,0x21,0x77,0xA0,0x6C,0x4E,0xA4,0x4C,0x36,0xDE,0xFE,0x2D,0xE7,0x4F, + + 0xCA,0x83,0xB8,0x4F,0x98,0x3E,0xC8,0xCE,0x39,0x33,0xE2,0x6D,0xE6,0x43,0xEF,0x5F, + + 0xCB,0x11,0x95,0x63,0x6A,0xCC,0xC0,0xCA,0xA7,0x60,0x20,0x51,0xA0,0xEF,0x27,0x5A, + + 0xD9,0x31,0x08,0x23,0xE1,0xD3,0xE9,0xA6,0xD9,0xBE,0x4F,0xD9,0x1C,0xFD,0x03,0xED, + + 0xFC,0x0E,0xBD,0x65,0x05,0x6C,0xBC,0xA7,0x79,0x7C,0x03,0x87,0x15,0x5E,0x1D,0x7C, + + 0x51,0xF1,0x0E,0x4D,0x0F,0x13,0x53,0x8E,0xE7,0xB2,0x4A,0xD9,0xDA,0x2D,0x7D,0x9B, + + 0xE9,0x2E,0xFB,0xA2,0x5E,0x52,0x77,0x63,0xED,0x7C,0xAF,0xC9,0x9F,0x92,0x42,0xF2, + + 0xA2,0x30,0x76,0xD9,0x5A,0x1F,0x4A,0xCB,0xE9,0x52,0x44,0xFE,0x97,0x97,0x4A,0xAD, + + 0x84,0xD7,0xB4,0xD4,0x5C,0x02,0x7B,0x72,0xAF,0x54,0xF8,0x8B,0x56,0x77,0xF1,0xC4, + + 0x4F,0x4B,0xF4,0x54,0xDD,0x87,0x75,0xA3,0xC6,0xD5,0x0A,0x94,0xB5,0x7C,0x6E,0xAF, + + 0x27,0x27,0x69,0x5A,0x5E,0xDD,0xDD,0xE0,0xCB,0xB3,0xC3,0xAE,0x97,0x7C,0x30,0xE8, + + 0xD7,0x05,0x80,0x4A,0x08,0xBB,0x25,0xC5,0x0D,0x98,0xC8,0x8B,0xB4,0x60,0x04,0x4A, + + 0x8E,0x11,0x0B,0x6F,0x59,0xAF,0x58,0x4B,0x5D,0xD2,0xAF,0xA0,0xBB,0x0D,0xF3,0x71, + + 0x45,0x62,0x22,0x87,0xD7,0x1B,0x6F,0x73,0x87,0x3B,0xA2,0x91,0x90,0x0F,0x2E,0x68, + + 0x67,0x30,0x8F,0x32,0xD6,0x1A,0x19,0x7A,0xD9,0xD8,0x59,0xCD,0x16,0x5D,0x40,0xFA, + + 0xAA,0x38,0xB6,0xAC,0x7A,0x67,0x48,0x94,0xA6,0x21,0x09,0x9C,0x1C,0xA9,0x16,0xFD, + + 0xC6,0x60,0xEC,0x22,0x87,0x46,0x5E,0xE3,0xA7,0x5C,0x69,0xFF,0x94,0xFE,0xF3,0xCC, + + 0x47,0x43,0xD2,0x32,0x3F,0xBA,0x0F,0x6F,0xBE,0x07,0xDA,0x90,0x67,0x55,0x17,0x4A, + + 0x97,0x32,0xE7,0xC1,0xDB,0x4B,0xDF,0xE8,0xC3,0xBB,0xDA,0x5E,0x7F,0xCF,0x5E,0x3D, + + 0x08,0xAB,0x04,0x00,0x04,0x58,0xB8,0xAA,0x2B,0xD4,0x69,0x03,0xF1,0x1F,0x52,0x3F, + + 0x7D,0x54,0x08,0x1D,0xB8,0xA0,0x46,0x3F,0x0D,0x0F,0xC0,0x24,0xBA,0x19,0x51,0x2F, + + 0xEB,0x21,0x93,0x31,0xB3,0x42,0x11,0x32,0xD9,0xF6,0x3D,0xA1,0x80,0x8F,0x59,0x3A, + + 0xAB,0x41,0xE2,0x75,0x9D,0x63,0x78,0xC1,0xC9,0xE2,0xB9,0x6C,0xAE,0x43,0xF8,0xBF, + + 0x20,0xA9,0xB1,0x59,0xFA,0xD4,0x52,0x9A,0xA6,0xDB,0x74,0x95,0xF1,0x24,0xC8,0xAC, + + 0x03,0xD1,0x07,0x49,0x1E,0xD5,0xFB,0x9F,0x65,0x1A,0xE2,0xF3,0xA4,0xEE,0x43,0xBD, + + 0x8A,0x02,0xA1,0x58,0xA1,0xD6,0x58,0x8E,0x7F,0x39,0xEE,0xE1,0x82,0x79,0x03,0x2E, + + 0xC0,0xF5,0xDF,0x48,0xDB,0xF7,0xB7,0x9F,0xB0,0x18,0xDD,0xF2,0x2C,0x27,0x01,0x4D, + + 0xF7,0x6B,0x03,0xC1,0x2B,0x57,0x46,0xDB,0x62,0xC5,0x49,0x38,0x23,0x6E,0x1C,0x7A, + + 0xF6,0xD4,0x32,0xEF,0x54,0x3B,0xAF,0x05,0xFE,0x7C,0x8A,0x5E,0xEA,0x0C,0x65,0x6B, + + 0x7F,0xF7,0x3B,0xFE,0x8D,0x38,0x45,0x89,0x23,0x49,0xC8,0x2D,0x5A,0x22,0xDF,0xE7, + + 0x74,0xAA,0x33,0xEE,0xC4,0x39,0x4F,0xBD,0x99,0x23,0xA3,0xD6,0x75,0x66,0x3C,0x84, + + 0x39,0x33,0x7E,0x50,0xE4,0xFC,0xC6,0x83,0xDF,0x73,0xD1,0xD0,0x92,0x64,0xF2,0xAB, + + 0x10,0x16,0xC4,0x40,0x01,0x9D,0x70,0x92,0x36,0x52,0x84,0x9E,0x5F,0xD0,0xFB,0xBA, + + 0x99,0x1C,0xA2,0x51,0xB9,0xFE,0x0F,0x82,0xDC,0x51,0x73,0x7E,0xA4,0x0A,0xB1,0x3F, + + 0x60,0xC5,0x76,0x44,0x2D,0x9F,0x9E,0x8E,0x5A,0xA0,0x1B,0x65,0x68,0xE2,0x95,0x16, + + 0xE8,0x61,0x68,0x86,0x38,0x5C,0x05,0xB3,0x0C,0x14,0xAA,0x65,0x18,0x3A,0x52,0x02, + + 0x29,0xB5,0x4F,0xD3,0x3F,0x9E,0x62,0x80,0xCD,0x5C,0x8A,0xE8,0x9A,0xB9,0xE3,0x70, + + 0x6A,0x32,0x65,0x8C,0x4D,0xB8,0x33,0x95,0x6C,0x5F,0xEB,0xED,0x19,0xCA,0x1F,0x0F, + + 0x69,0xB2,0x83,0x17,0x05,0xB8,0x63,0x80,0xC3,0x85,0xA3,0x74,0x7E,0xD5,0xC0,0xD3, + + 0x29,0x1E,0x9A,0xCD,0x5E,0x24,0x15,0x06,0xC3,0x1B,0xB7,0x60,0x72,0xB4,0x4C,0xD2, + + 0x21,0x2E,0x9A,0xC1,0x96,0xD5,0x56,0x16,0x21,0x7A,0xE6,0x51,0x84,0x88,0x63,0x98, + + 0xF3,0x58,0xAC,0xCD,0x7E,0x26,0xE4,0x07,0x85,0x19,0xEA,0xD5,0xFA,0x89,0xB7,0xD8, + + 0x0E,0x9E,0x6E,0xC0,0x89,0xF7,0x63,0x12,0x59,0x78,0xCB,0x97,0x0C,0xAA,0xE1,0x79, + + 0xF2,0x08,0xBE,0x2C,0xD5,0xB8,0x69,0x30,0x6C,0x48,0x5E,0xEC,0x38,0x8D,0x1F,0xAE, + + 0xE1,0x28,0x26,0x84,0xBB,0x6C,0x14,0x7A,0xEA,0x1F,0x56,0xA3,0x60,0x62,0x3D,0x7A, + + 0x7A,0xBE,0x6F,0x95,0x38,0x7A,0xC5,0x30,0xEC,0xBA,0xDB,0xAF,0xFC,0x8F,0xB9,0x68, + + 0x41,0x1F,0xD5,0xFF,0x9B,0xF6,0xA8,0x9D,0x68,0x56,0xE7,0xCF,0x5E,0x7F,0xB3,0x28, + + 0x6A,0x2E,0x7A,0xD8,0xA6,0xFC,0xF1,0x0B,0x0F,0x73,0x02,0x12,0x93,0x74,0xCE,0x1E, + + 0x2F,0x1B,0xEE,0xCD,0x5F,0xBD,0xA7,0x1A,0xFC,0x52,0x09,0x40,0x90,0x19,0xFB,0xB9, + + 0x1E,0x15,0x13,0xDC,0x2D,0x9E,0x5F,0x0A,0xB8,0x51,0x40,0x1E,0x7E,0xD3,0x47,0xB7, + + 0xC8,0x3F,0x62,0xCD,0xC6,0xBF,0x2C,0x1B,0x4B,0x50,0xE5,0x7A,0x10,0xB9,0xB6,0xF1, + + 0x68,0x5D,0x18,0xF9,0x1A,0xE6,0xCF,0x87,0x8E,0xCD,0x49,0x01,0xF5,0x9F,0x0E,0x27, + + 0x81,0x2E,0x2C,0xD1,0x95,0x81,0xC7,0x4C,0x6B,0x1E,0xE0,0x97,0x3E,0x99,0x77,0x37, + + 0x6F,0x43,0x22,0x78,0xB6,0x4F,0xCA,0x5C,0xAC,0xCF,0x1D,0xA3,0x84,0x0F,0x8D,0x71, + + 0x6E,0x02,0x05,0x91,0x85,0x5E,0x86,0x02,0xA9,0x6C,0xBD,0x35,0xA5,0xF8,0x61,0x24, + + 0xED,0x6E,0xC1,0x5F,0x55,0x14,0xAA,0x95,0x2E,0x0B,0x14,0x95,0x90,0x6F,0x22,0xF2, + + 0xA6,0x95,0xDB,0x4E,0x34,0x35,0xAD,0x81,0xE4,0x6A,0xA6,0xE5,0x47,0x68,0x31,0x4B, + + 0x90,0x2B,0x22,0x5F,0x73,0x36,0x9B,0x95,0x56,0x09,0xF5,0xE0,0x3D,0x00,0x4F,0x97, + + 0x84,0x84,0x3D,0x5A,0x74,0xD7,0xCB,0x80,0x9C,0x68,0x87,0xE5,0x6A,0x18,0x96,0x68, + + 0xE7,0x29,0xF2,0x78,0x10,0xC6,0xA4,0x54,0x26,0x09,0x4F,0x48,0xB7,0xC2,0x48,0x1A, + + 0x0E,0xE9,0x2F,0xF6,0xAE,0xE4,0x2C,0x13,0xA6,0xF8,0xFB,0x58,0xB6,0x51,0x10,0x5E, + + 0x7D,0xE4,0x83,0x0E,0x11,0xEC,0x4D,0x1F,0xAF,0xDA,0xF2,0x49,0x37,0xA0,0xAB,0x13, + + 0x46,0x2F,0x54,0xBF,0x74,0xCB,0x01,0x8A,0xFD,0x64,0xFA,0x59,0x36,0x33,0x61,0x42, + + 0x8E,0x8E,0x16,0x43,0x35,0xDC,0xB0,0x98,0xC5,0x43,0x5E,0x9E,0x5C,0x1A,0x69,0x4B, + + 0xC7,0x55,0xDA,0x52,0x0C,0xFD,0xFB,0x9D,0xD2,0xA2,0xFA,0x8D,0x89,0x46,0x45,0x8A, + + 0x8D,0x8D,0xF4,0x43,0x73,0xFE,0x54,0x99,0xDB,0x41,0x8D,0xF0,0x3F,0x68,0x60,0x59, + + 0x9F,0x8B,0x68,0x56,0x1A,0x9F,0xD8,0x9C,0xC8,0xA0,0x9C,0x77,0x3E,0x40,0x1A,0xD7, + + 0x4F,0x9F,0xA6,0x40,0x20,0xB4,0x1C,0x40,0xE5,0xB4,0x6D,0x4E,0xCB,0xBD,0x12,0xB6, + + 0x06,0x13,0x1D,0x66,0x94,0x3B,0x62,0x70,0x75,0xD7,0x43,0x16,0x98,0x91,0x24,0xB1, + + 0x4F,0x17,0x25,0xC1,0xA0,0xB4,0x1D,0xA5,0x65,0xDC,0xCB,0x76,0xE6,0xBF,0x13,0xB6, + + 0x85,0x9E,0x7A,0x75,0xCA,0xB3,0x35,0x4C,0x44,0xD2,0x51,0xB5,0xFD,0x9F,0x1C,0x62, + + 0xD9,0x2B,0x24,0xC3,0xDC,0xD4,0xD2,0x00,0x1B,0xDB,0xAE,0xE7,0xF8,0x5B,0x04,0xD5, + + 0xA4,0x9A,0x0D,0xD2,0x09,0x95,0xAA,0x10,0x57,0xDA,0xC6,0x05,0xB5,0x09,0x0D,0x01, + + 0x25,0xD2,0x2B,0xC3,0x0D,0xF6,0xBC,0x01,0xAB,0xD9,0x13,0x16,0x3C,0xE6,0x05,0xB1, + + 0x81,0x97,0x86,0xD6,0xC4,0xD9,0x3E,0x11,0xE1,0xD5,0x40,0xA8,0x1C,0x21,0xA1,0xCC, + + 0xBE,0x33,0x7D,0x9A,0x47,0xBE,0x0E,0xAF,0x68,0x88,0x56,0xB7,0x81,0xFB,0x09,0x6B, + + 0xB1,0x59,0xBE,0xFC,0x8E,0xDC,0x7C,0x5A,0x61,0x99,0x9E,0xBA,0x02,0xF9,0x04,0x8B, + + 0x64,0xA2,0xFC,0x8F,0x3E,0xF2,0x2D,0x43,0x0F,0x97,0x0D,0xBF,0x83,0xDA,0xC7,0x11, + + 0x2D,0x2B,0x97,0x74,0x11,0xB6,0x3A,0x84,0xAF,0xD0,0x18,0x7A,0xCE,0xA4,0x66,0x35, + + 0x8E,0x63,0xA6,0xF1,0x36,0xD0,0x76,0xF7,0x91,0x2C,0x51,0x71,0x15,0x4A,0x4E,0x24, + + 0x07,0x22,0x49,0x9E,0x82,0xB6,0xC5,0xE7,0x8E,0x2D,0x4C,0xA1,0x14,0x18,0x6F,0x35, + + 0x0F,0x41,0xCF,0x0D,0x6A,0x4D,0x8A,0xF6,0x09,0x2E,0xF6,0x1C,0x2C,0x55,0x43,0x20, + + 0x8A,0x20,0xA9,0xC0,0x3B,0x6B,0x91,0xE6,0x76,0x2F,0xC7,0x0E,0x17,0xFB,0x5E,0x32, + + 0x40,0x4C,0x24,0xF7,0x9C,0x61,0x28,0x88,0xE3,0x01,0xB9,0x77,0xD4,0x7C,0x2F,0x11, + + 0x6A,0x75,0xB2,0xE2,0x82,0x9E,0xB8,0x3E,0xCD,0x4C,0xE0,0x13,0xC0,0xCD,0x60,0xF2, + + 0x50,0xA9,0x29,0x3A,0xA3,0xDD,0xE4,0x20,0xD4,0x76,0x38,0x76,0x5C,0x3E,0x8F,0xD7, + + 0x13,0x00,0xD7,0x37,0x4C,0x88,0x67,0xD3,0x6D,0x4E,0x39,0x7F,0x44,0xCF,0x48,0xF7, + + 0x61,0x24,0x48,0x41,0x71,0xD4,0xD2,0x0F,0x63,0x85,0xC0,0x84,0x1A,0x64,0x30,0x74, + + 0x8C,0x07,0xF0,0x04,0x17,0x2A,0x59,0x83,0x89,0xEE,0xB0,0xB6,0xD5,0x90,0x39,0xC3, + + 0x83,0x71,0xB9,0xC7,0x97,0x66,0x7B,0xB1,0x61,0xCE,0x8F,0x72,0xDA,0x66,0xFE,0x50, + + 0x0E,0x0B,0xF1,0x85,0x64,0x28,0x3E,0x79,0xA8,0x82,0x49,0xF1,0x8F,0x7C,0xE1,0xF3, + + 0x63,0xAE,0xA7,0x0C,0x73,0x0C,0x82,0xE8,0x0C,0xAC,0x36,0x62,0x87,0x55,0x54,0x2E, + + 0xD4,0xA2,0x0A,0x00,0xBA,0xA4,0x8A,0x97,0xBE,0xA9,0xC4,0x18,0x59,0xC2,0x0A,0xF8, + + 0x52,0x1A,0x7C,0x09,0xC0,0x40,0x6B,0x20,0x25,0x78,0x78,0x5A,0x58,0xBD,0xBD,0x7B, + + 0xE2,0xAE,0x6F,0x3A,0x2A,0xA6,0xA7,0xCA,0x6A,0x7B,0x0F,0x99,0x5C,0x2B,0x2A,0x56, + + 0xCC,0xF8,0xA2,0x08,0x56,0xA7,0xFD,0x99,0xA6,0x41,0x92,0x6C,0x5E,0x68,0x14,0xCA, + + 0x0F,0x80,0x48,0x3E,0x5A,0x6D,0x68,0x68,0xCE,0x5B,0x9A,0x78,0x5F,0x69,0xA5,0xB8, + + 0x40,0x4E,0x44,0xAF,0x18,0x66,0x0D,0x5A,0x4A,0xE5,0x57,0xE9,0x86,0xCF,0x35,0xC7, + + 0x60,0xF9,0xB3,0x3F,0xD8,0xF0,0x05,0x63,0xCB,0xE4,0xA3,0xF9,0x83,0x79,0xE4,0xBF, + + 0x04,0x67,0x86,0x76,0x77,0x34,0x2C,0x84,0x63,0x60,0x1D,0xB4,0xD3,0xCB,0xAD,0x97, + + 0x80,0x50,0xB6,0x96,0x2D,0x11,0xBE,0x52,0x71,0x9C,0x9C,0x48,0xF0,0x33,0x01,0x95, + + 0x38,0x56,0x81,0xD1,0x57,0xCC,0x28,0x90,0x64,0x4D,0xB5,0x5D,0xF0,0x89,0x45,0x95, + + 0x4C,0x52,0x0D,0x85,0xA1,0x31,0x8D,0x1E,0x16,0x03,0x1E,0xB9,0x0C,0xD2,0x67,0x31, + + 0xBE,0x54,0x04,0xD4,0x37,0x30,0x94,0xFD,0xC6,0xFF,0xD4,0xE4,0x72,0x74,0x33,0xA3, + + 0xC9,0xBD,0xCC,0xE0,0x00,0x3A,0x23,0x01,0xDC,0x07,0xDC,0xF4,0x73,0x75,0xAD,0x4B, + + 0x80,0xC0,0xC3,0xFA,0xF9,0x74,0xA8,0xF9,0xC0,0x49,0xD5,0xE5,0xF2,0x76,0x3F,0x31, + + 0xE7,0x9C,0x97,0xD0,0x14,0x76,0xF2,0x8A,0x3E,0x8B,0xDD,0xF5,0xF3,0x77,0xF3,0x76, + + 0x2C,0x75,0x96,0xCC,0xB8,0x3E,0x2B,0x99,0xEC,0x47,0x02,0x5F,0x54,0xA5,0xAA,0xEA, + + 0xA7,0x58,0x8A,0x1B,0x18,0xAE,0xA6,0x9C,0x80,0x3D,0xFE,0xFC,0x64,0xF2,0x97,0x82, + + 0x2C,0x4E,0x00,0x3B,0x59,0xE1,0xAF,0x5A,0x4B,0x4A,0xC1,0x89,0x13,0x3B,0xB0,0x82, + + 0x0A,0x9E,0x3B,0x62,0xFA,0xC8,0x8E,0x4A,0x65,0x66,0x1B,0x5F,0x7B,0x73,0x6D,0x26, + + 0x95,0x18,0xA6,0xAC,0x70,0x31,0x6D,0xB6,0x6C,0xAC,0xD6,0xEC,0x7A,0x7C,0xB9,0x87, + + 0x96,0xE1,0x30,0x5E,0xE6,0x82,0x0E,0x12,0x90,0xF6,0xDE,0xFC,0x7B,0x7D,0x45,0xE7, + + 0x5C,0x6B,0x6B,0x5F,0xBB,0x34,0xE7,0x18,0x55,0x8E,0xD7,0xED,0xFA,0x7E,0xE4,0xB7, + + 0x7E,0x11,0xF7,0x23,0xDB,0x33,0xA2,0x61,0x80,0x20,0xDF,0xFD,0xFB,0x7F,0x00,0xF3, + + 0xE4,0x00,0x44,0x21,0x15,0xC0,0x8C,0xAB,0x60,0xF4,0x8E,0x03,0x1E,0x81,0x28,0xE3, + + 0xDD,0xA1,0xA9,0xC9,0xF6,0xA5,0xDC,0xC1,0xE6,0x4A,0x86,0x13,0x1C,0xA0,0x89,0x89, + + 0xEF,0x16,0x5B,0x05,0x9C,0xED,0x91,0x2D,0x48,0x4F,0xE9,0x23,0x9E,0xA3,0x77,0x1C, + + 0xD7,0xCD,0xBC,0x65,0x1B,0xC6,0x3D,0xB4,0xE1,0xB4,0xE1,0xD1,0x57,0xEB,0x3E,0xD9, + + 0x16,0x2B,0x98,0xC2,0x4A,0x10,0x57,0x63,0x2D,0xB0,0xD0,0x09,0x82,0x3B,0xDE,0xA3, + + 0xEF,0xD5,0xB8,0x4A,0x01,0x10,0x9B,0x89,0xC5,0x39,0xAD,0xD6,0xA0,0x85,0x02,0xB0, + + 0x62,0x29,0x71,0xE7,0x8E,0xE7,0x32,0xA5,0x54,0xC5,0x56,0x98,0xBD,0x99,0x17,0x61, + + 0x02,0x91,0x20,0x68,0xDC,0xE5,0x41,0x54,0x6B,0xCA,0xA7,0x98,0x97,0x4C,0x43,0xAA, + + 0xDA,0x37,0xDB,0xDE,0x50,0x29,0x36,0xAA,0xA5,0x8C,0x76,0x4C,0x1D,0xF8,0x9E,0x78, + + 0xFA,0xEC,0x80,0xCE,0x41,0x21,0x9E,0x96,0xA6,0xAD,0xC2,0xBC,0x5C,0x91,0x43,0x54, + + 0x2D,0xEF,0xA0,0x45,0x11,0xC9,0x26,0xD8,0x48,0x67,0xCB,0x4D,0x9D,0xE8,0x13,0xE4, + + 0x0E,0x85,0xBB,0x55,0x11,0xA3,0x03,0xC8,0x6E,0xAE,0x81,0xDD,0x5F,0xE3,0x5D,0x14, + + 0xFF,0x50,0x64,0xCE,0xF7,0xF4,0x89,0x4D,0xEF,0x33,0x0F,0xEA,0x35,0x93,0xC1,0xFF, + + 0xDA,0x93,0xAE,0x2D,0x08,0xC1,0xEA,0xBD,0x4D,0x38,0xFA,0x7E,0x79,0xED,0x3A,0x5F, + + 0x03,0xED,0xA1,0x3E,0xD5,0xA5,0x1B,0xA9,0x48,0x3B,0xB5,0x4B,0xD6,0xEF,0x16,0xA8, + + 0x57,0x5B,0x89,0x5B,0x9E,0xFF,0x7F,0x3C,0x4E,0xC1,0xFB,0x7F,0xDF,0xEF,0x15,0x60, + + 0xF9,0x04,0xF4,0xF5,0x2C,0x3A,0xD0,0x51,0xC7,0xB5,0x3D,0xD4,0xD7,0x5D,0x0B,0x70, + + 0xC5,0x40,0x18,0xF6,0x3D,0x61,0xDB,0x41,0xC6,0x8C,0x87,0x56,0x35,0x7A,0x5D,0xB1, + + 0x94,0x4E,0x62,0x79,0x55,0xD4,0x08,0x24,0xC0,0xAF,0x21,0xF6,0xD0,0xE9,0xD6,0xB7, + + 0x6C,0x9C,0x02,0x47,0x34,0x12,0xDE,0xF7,0x46,0xEE,0x08,0xB5,0xF1,0x78,0x0C,0x44, + + 0xDA,0xD5,0x9A,0xC0,0xD7,0x37,0xF0,0x13,0xD9,0xD7,0xF4,0xE6,0x76,0xF4,0xC0,0x90, + + 0xA4,0x41,0x94,0xA8,0x77,0x3F,0x87,0xCD,0x98,0xDB,0xFC,0xF6,0x77,0xF5,0x89,0x43, + + 0x5A,0xB6,0xCA,0x34,0x3A,0x4B,0x25,0x09,0x1D,0x03,0xF5,0xE7,0xF6,0xF6,0x8F,0xCC, + + 0x69,0x3C,0x3A,0x55,0x6A,0x08,0x15,0x75,0x1B,0x96,0xFD,0xF7,0xF7,0xF7,0x5F,0xAD, + + 0x8D,0x89,0x9E,0xEE,0x8C,0xB0,0x51,0xEE,0xCF,0xC5,0x54,0x48,0x6C,0xB7,0x10,0x9C, + + 0x67,0xDD,0x57,0xEC,0xB3,0xDC,0x0C,0x8B,0xE9,0x76,0xF4,0x49,0xDE,0xF4,0x5F,0xD8, + + 0x0F,0x85,0xD6,0xFD,0x32,0xDF,0x54,0xFA,0x4F,0x9B,0xD7,0xEF,0xF2,0xF7,0x77,0x9F, + + 0xE7,0xFF,0xD6,0xED,0x33,0xDE,0x9F,0xC8,0x4E,0x78,0xF5,0xC0,0x5E,0xFD,0x00,0xC2, + + 0xCF,0x33,0x9E,0x4C,0x1F,0xCE,0xDE,0xD5,0x05,0xCB,0xF6,0xEE,0x7E,0xFC,0x89,0x2B, + + 0xF5,0x8D,0x02,0x5E,0xC3,0x9D,0x24,0xFB,0xCC,0x93,0xFE,0xFE,0x7F,0xFD,0x05,0xD1, + + 0x78,0x2A,0xBD,0xCE,0x1D,0xFF,0x73,0x69,0xEF,0xB1,0xF7,0xEF,0xFE,0xFE,0x11,0x41, + + 0xA9,0x9F,0x43,0x9D,0x3C,0x12,0x4E,0x3D,0x13,0xD9,0xFF,0xFF,0xAF,0xB9,0x80,0x00, + + 0x0C,0x4C,0x04,0x00,0x18,0x2E,0x6F,0xD8,0xC1,0xBF,0x43,0xCC,0x56,0xBD,0x51,0xEF, + + 0xE0,0xCE,0x90,0x11,0x15,0x01,0x47,0x32,0x32,0x41,0x45,0x36,0x2A,0x61,0xB6,0x85, + + 0xC0,0xB8,0x35,0x67,0xF1,0x38,0xEA,0xA5,0xC4,0x54,0x6B,0x2D,0x2D,0xAD,0x60,0xEA, + + 0xEA,0x06,0xE1,0x97,0x90,0x5B,0xC6,0x31,0xB6,0x4F,0xC2,0xB7,0xAE,0x63,0x38,0xC2, + + 0x01,0xE2,0x00,0x44,0x62,0xD1,0x22,0x80,0x06,0xCF,0xA8,0xE6,0x57,0x5D,0x31,0xB8, + + 0x09,0xCE,0xEE,0x59,0x97,0x81,0x5A,0x5E,0xB5,0x30,0x50,0xB1,0xF2,0xEF,0x79,0x31, + + 0x9A,0x0F,0xC4,0xC1,0x92,0xB7,0x7A,0x8F,0x7D,0x42,0xA9,0x42,0x71,0x60,0x4D,0xB9, + + 0x89,0xCA,0x48,0x52,0xEC,0x23,0xAE,0x2E,0x7E,0xBB,0x22,0x97,0x72,0xED,0xA9,0xE0, + + 0x08,0xF3,0xD8,0x09,0xBB,0x53,0xD2,0x2C,0x3E,0x53,0x49,0x6C,0x5E,0x28,0xE5,0xE2, + + 0x62,0x99,0xEA,0xE1,0x19,0xF2,0xA5,0xCE,0xCB,0x43,0x9A,0xC1,0x59,0xB2,0x03,0x7B, + + 0x2F,0x1A,0xC3,0xF4,0x98,0xB1,0xD3,0x57,0x2F,0x5A,0xF2,0xD4,0x58,0xF1,0x24,0xE8, + + 0xD1,0x0E,0xEA,0x99,0x9D,0x3D,0xFD,0xC9,0x8D,0x44,0xFB,0xB9,0xDD,0xB8,0x1A,0xA7, + + 0x0C,0x0C,0x19,0x44,0x9D,0x2B,0xF9,0x06,0x9F,0x42,0xAD,0x8E,0x87,0xB1,0x58,0xDC, + + 0x4B,0xA5,0xBA,0x82,0xF4,0x6F,0xF9,0x70,0x97,0x7D,0xBA,0x3C,0x75,0xE6,0x16,0x29, + + 0xEE,0x05,0x73,0xFF,0xB4,0x62,0x3B,0xEF,0x36,0x0F,0x7C,0xE9,0xD6,0x98,0x71,0xB6, + + 0x70,0x90,0xCB,0xE4,0x44,0x20,0x78,0x75,0x13,0x3F,0xDF,0x9F,0xFF,0xD3,0x04,0x80, + + 0x78,0xF8,0x84,0x7C,0xB2,0xCB,0xAB,0x94,0x87,0x42,0xEC,0x83,0x13,0x58,0xDE,0xB0, + + 0x26,0xE9,0x0C,0x1E,0x4A,0x38,0xA6,0x38,0x24,0x58,0xE4,0x93,0x12,0x69,0x4F,0x28, + + 0x82,0x11,0x85,0x79,0x10,0x70,0xAE,0x15,0x07,0x42,0xED,0x82,0x93,0x18,0x02,0x1D, + + 0xDA,0x02,0xD6,0x95,0xCE,0x33,0x1C,0x33,0xE8,0xBE,0xE5,0x92,0x10,0x7C,0xF3,0xC1, + + 0xAF,0x18,0xC4,0xFC,0xCE,0x64,0xBB,0x0E,0xE7,0xF3,0x60,0x9B,0xD1,0xC9,0xAA,0x21, + + 0xE9,0x55,0x49,0x50,0x33,0xA4,0xDD,0xF7,0x14,0x51,0xBC,0xB0,0x4E,0x7A,0x2D,0xDF, + + 0x64,0xE2,0x05,0xC5,0xC2,0xC3,0x73,0xEC,0x66,0xF2,0x11,0x60,0xB1,0x85,0x13,0x43, + + 0xA7,0x9A,0xEB,0xDC,0x37,0x93,0x82,0xE1,0x64,0x50,0x4D,0xEB,0xE3,0x83,0xD9,0x89, + + 0x2E,0x78,0x5D,0x0E,0x3E,0x78,0x4C,0x47,0xCB,0x5C,0xF6,0xE8,0x0C,0xF5,0x6E,0x58, + + 0xE7,0x92,0x74,0x94,0xC4,0xF6,0x26,0xC8,0x24,0x50,0xE6,0x3E,0x7A,0x9F,0x19,0xFB, + + 0x43,0x18,0x54,0x65,0xBE,0xE7,0xEC,0x2B,0x68,0x9B,0xEF,0x2F,0xF9,0x22,0x0D,0x7B, + + 0x2B,0x33,0x04,0xFD,0xA9,0x3D,0x9B,0xBD,0xE1,0x55,0xA7,0xCD,0xB5,0x72,0x38,0x56, + + 0xC1,0xEA,0xC7,0xCB,0x9B,0x59,0xE6,0x5A,0x44,0x19,0xD3,0x2A,0x90,0x30,0x2D,0x2B, + + 0xCF,0xB2,0x23,0x36,0xBE,0x3A,0xB1,0x0A,0x6D,0x5D,0x76,0x5F,0x04,0x7C,0x19,0x52, + + 0xBA,0xB1,0x38,0x49,0xBA,0xAF,0xA1,0x4C,0x6F,0x59,0x27,0x69,0xBA,0xD6,0xF9,0x28, + + 0x43,0x4F,0x27,0x7E,0xBD,0x5F,0x08,0x27,0x12,0x21,0x1F,0xFD,0x8B,0xF2,0x7E,0x1F, + + 0x54,0x2B,0xFF,0x86,0x67,0xA0,0x50,0x62,0x59,0x4B,0xE9,0xA3,0xA9,0x21,0xD7,0x16, + + 0x05,0x59,0x68,0x12,0x63,0xBA,0x67,0x32,0x36,0xCD,0x42,0x3E,0xB0,0xF3,0x04,0x03, + + 0xEF,0xA6,0x7E,0x07,0xE3,0xA4,0x35,0xC1,0xFB,0xC6,0x4B,0xAF,0x21,0x21,0x96,0xEE, + + 0x95,0xE0,0x69,0x69,0x72,0xB3,0xE6,0x33,0xB2,0xCB,0x33,0x57,0xC5,0xE5,0x9F,0xBC, + + 0x00,0xC4,0x0D,0x3C,0x93,0xA3,0x98,0xD1,0xC3,0x83,0x4F,0x3D,0xAF,0x6E,0x13,0xAD, + + 0xF0,0xC7,0xE9,0x49,0x0F,0x31,0xB8,0x72,0x37,0x30,0xCA,0x89,0xD5,0xAD,0xDB,0x31, + + 0x39,0x39,0x09,0xE4,0xB2,0x72,0xD9,0xC0,0xB9,0xB5,0x75,0x96,0x75,0xE4,0xED,0x66, + + 0x66,0x78,0x68,0x4C,0x8B,0xE9,0x39,0xF7,0xC7,0x56,0xD9,0x15,0x60,0x82,0xC2,0xBC, + + 0x8B,0x8F,0x1D,0xF8,0x49,0xA1,0xF2,0x2E,0xDE,0x73,0xBE,0x59,0x3F,0x97,0xBA,0x1E, + + 0x10,0x0B,0xF0,0xF1,0xBE,0xAD,0x3A,0xC6,0xCC,0x8B,0x9A,0x0A,0x3E,0x21,0x8B,0xA9, + + 0x53,0x65,0xA2,0x8D,0x95,0x47,0x13,0xD3,0xCC,0x31,0xCB,0x2D,0x2B,0xEC,0xBB,0xF9, + + 0x21,0xCA,0x50,0xF2,0xBC,0x10,0xBB,0x87,0xFE,0xA9,0xC3,0x18,0xBE,0x73,0x99,0xCE, + + 0x02,0x30,0x94,0x08,0xB8,0xEE,0xC5,0x62,0x48,0xCC,0xCA,0xBE,0x83,0x93,0x68,0x63, + + 0x09,0x8D,0x35,0x5A,0x19,0xAD,0x7A,0x42,0x30,0xDD,0x47,0x23,0xA0,0xEB,0xA3,0x5B, + + 0xCC,0xCC,0xE1,0x1E,0x1B,0x89,0x60,0x54,0xD6,0x8C,0x4A,0x3E,0x7D,0x31,0x3C,0x7F, + + 0x00,0x8D,0xF8,0x2D,0x60,0xED,0x93,0xD9,0x4A,0xC8,0x73,0x7D,0x2A,0xE0,0x80,0xE0, + + 0x65,0x10,0xA8,0xF1,0x57,0xCF,0x80,0xC0,0x05,0x28,0xCD,0x24,0x7D,0x96,0x76,0x93, + + 0x86,0x97,0xEC,0x97,0x0A,0xB5,0x54,0x95,0xC4,0x58,0xDC,0xF7,0xB9,0x7A,0x5D,0x01, + + 0xA1,0x63,0xDD,0x85,0x43,0x19,0x2D,0xA6,0xE0,0xF2,0x8D,0xF7,0xF0,0xFD,0xA5,0xAF, + + 0x06,0x95,0xF2,0x97,0xC6,0xB5,0xB2,0xD3,0xE9,0x93,0xB9,0x55,0x77,0xF9,0x1A,0xF0, + + 0xA3,0x82,0x99,0x42,0x76,0x9E,0x49,0xA4,0xC4,0x9A,0x0B,0x62,0x76,0x65,0x35,0xC6, + + 0xAA,0xF6,0x53,0x46,0x16,0x85,0xDB,0xFB,0xB7,0x85,0xEF,0xC9,0x6F,0xB7,0x5A,0x9D, + + 0x57,0x4A,0x75,0x99,0x4F,0x6A,0x01,0xC7,0x32,0xC6,0x42,0xEF,0xF0,0xF6,0xC6,0x76, + + 0x72,0x89,0xEF,0x37,0xCB,0xB1,0x5A,0xFE,0x60,0x70,0xFD,0xCF,0x72,0xF0,0x6E,0x1D, + + 0x4F,0x38,0x9C,0x71,0xCB,0xFA,0x32,0x68,0xC0,0xD5,0x50,0xCC,0x1D,0xE8,0x74,0x9B, + + 0x8E,0xFC,0xF5,0x9E,0x42,0xB9,0xBE,0xBB,0xEE,0xBC,0x1A,0xDC,0x3E,0x86,0x5F,0x09, + + 0xAD,0xC2,0x27,0x05,0xC7,0xBE,0x2D,0xFB,0xCD,0xBA,0xAF,0x45,0x7E,0xD2,0x15,0x79, + + 0x92,0x9F,0x74,0x1D,0xBB,0xFB,0x07,0xCB,0xF4,0xD2,0xC7,0xDD,0xBC,0xEB,0x1B,0x39, + + 0xF6,0x48,0xEE,0x6B,0xDF,0xB3,0xDE,0x4C,0xEB,0xFB,0x1E,0x4D,0x78,0x9C,0x86,0x50, + + 0x0D,0x4B,0xD6,0x0E,0xE0,0xB2,0x6D,0x88,0x90,0x9F,0x6E,0xB8,0xD5,0x06,0x44,0x3A, + + 0x32,0xDE,0x77,0x4D,0xBB,0xD4,0xA8,0xEE,0xE8,0xDE,0x8A,0x6B,0xBE,0xD4,0x10,0xA8, + + 0x45,0x37,0x8F,0x9B,0xCE,0x32,0x7F,0xC3,0x13,0xCF,0xF9,0x7B,0xFF,0x6E,0xDF,0x15, + + 0x87,0x07,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0xE0,0xB2, + + 0xA5,0x86,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0xA9,0xA3, + + 0x5F,0x5D,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0xE9,0x11, + + 0x04,0x04,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x12,0x08, + + 0xED,0x49,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0xCA,0x08, + + 0x40,0x45,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0xEB,0xBA, + + 0x0D,0x4D,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x7F,0xE4, + + 0xA8,0x49,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x74,0x46, + + 0x8A,0xEF,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x8E,0x14, + + 0x21,0x80,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x95,0xC7, + + 0x0A,0xE9,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0xA5,0x33, + + 0x26,0x34,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x96,0xCE, + + 0x82,0xE3,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0xA6,0x3A, + + 0xAE,0x3E,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x05,0x0D, + + 0xA8,0x8B,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x9F,0xBD, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x3A, + + 0x81,0x87,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x55,0x96, + + 0x45,0xAB,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0xC9,0xA0, + + 0x82,0xE2,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0xB9,0x55, + + 0x2F,0x78,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x24,0x8E, + + 0x0C,0x19,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x9A,0xA8, + + 0x23,0xC5,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0xFC,0x03, + + 0x0B,0x8D,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x5B,0xC4, + + 0x62,0xC7,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x8F,0x95,0x80,0x00, + + 0x0C,0x4C,0xF9,0xE6,0x92,0x08,0x0A,0x28,0x63,0x78,0x15,0xE2,0xBA,0x2C,0x51,0xEF, + + 0xE0,0xCE,0xF0,0x76,0x50,0x31,0x30,0xCF,0xB6,0x03,0x4D,0xB0,0x55,0x90,0xB6,0x85, + + 0x80,0xD1,0x25,0x67,0xD3,0x5D,0xCC,0x23,0x3B,0xD9,0x61,0x63,0x7A,0x99,0x60,0xEA, + + 0x03,0x27,0xF1,0x97,0x92,0xC5,0x1D,0xD8,0xBA,0x47,0x46,0x34,0xD7,0x23,0xD0,0x1B, + + 0xFF,0xB8,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x30,0xD0, + + 0xE3,0xFA,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x7E,0x91, + + 0x8E,0xAD,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x29,0x15, + + 0x03,0x0A,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x0A,0xF5, + + 0x89,0xD3,0xD8,0xE7,0xBB,0x33,0x49,0x28,0x37,0x48,0x05,0x13,0x48,0x2A,0xE5,0xE2, + + 0xDE,0x56,0xCA,0x6A,0x3A,0x56,0xDD,0xD0,0x43,0x94,0x5A,0x38,0x25,0x92,0x8C,0x7B, + + 0x2B,0x6F,0xC3,0xF9,0x90,0x31,0xC8,0x6B,0xCE,0x6A,0x13,0x10,0x24,0x5A,0x55,0x3B, + + 0x5C,0x10,0x0B,0x1D,0xAF,0x45,0xE1,0x31,0x34,0x84,0x9A,0xFB,0x7B,0x27,0xBB,0x6F, + + 0xAB,0x86,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x32,0xA6, + + 0xB6,0xF5,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0xEC,0xA6, + + 0x3F,0xA6,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0xB4,0xDB, + + 0x8E,0x0B,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0x05,0x77,0xD0,0x7C,0x3C,0x24,0x68,0xA2,0x79,0xCF,0xF5,0x77,0xDE,0xB0, + + 0x26,0xE9,0x27,0x7C,0x75,0x5D,0xE6,0x38,0x94,0x92,0xA3,0xEA,0x8C,0xF3,0x4F,0x28, + + 0x82,0x11,0xE4,0xFE,0x65,0xAF,0x4C,0x25,0x1D,0x93,0x7D,0x06,0xD4,0xAE,0x02,0x1D, + + 0xDA,0x02,0x59,0xCB,0x9F,0xEF,0xE7,0x59,0xE7,0x9E,0x85,0xBC,0xB1,0x78,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xD9,0x89, + + 0x2E,0x38,0xEF,0x67,0xD3,0x8C,0x57,0xFC,0x49,0x48,0x01,0x2E,0x79,0x1B,0x36,0x70, + + 0x27,0xD6,0x0E,0x5A,0xAB,0x3A,0xE3,0x5A,0xE9,0x86,0x16,0x79,0xD8,0xF3,0xA9,0x0B, + + 0xAB,0xFC,0x24,0x97,0xD3,0x4E,0x77,0xE8,0x05,0xD1,0xAD,0x4F,0xDC,0x7C,0x55,0x6B, + + 0x0A,0x1D,0x6C,0x66,0x50,0x9C,0x25,0x51,0xE7,0x94,0x70,0x5F,0x7B,0x33,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0xFF, + + 0x04,0x0D,0xE0,0x39,0x1C,0xCC,0x50,0xE2,0x8A,0x4B,0xC0,0xF9,0xE3,0xAC,0x76,0x0A, + + 0xDC,0x2A,0x0F,0x81,0x7E,0x07,0xB5,0xC2,0x4D,0xCE,0x9E,0x3A,0xD9,0x3A,0xD9,0x0B, + + 0x5B,0x1D,0x89,0xC5,0x40,0x64,0xCB,0xC1,0x46,0xCA,0xC7,0x34,0xC8,0xA6,0x2E,0x31, + + 0xEE,0x73,0x29,0xE6,0x57,0xE3,0xE4,0x31,0xBE,0xC3,0x99,0xCA,0x95,0xAD,0xDB,0xA0, + + 0xAA,0x79,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x22,0xEF, + + 0x85,0xCD,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x19,0x38, + + 0x88,0xE4,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0xF4,0xB1, + + 0xA3,0x7A,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x21,0xFB, + + 0x94,0x88,0x98,0xFD,0xCA,0x07,0x69,0x68,0x33,0xC8,0xC2,0x08,0xBE,0x8B,0x2A,0x46, + + 0x09,0xF1,0xD4,0x84,0xF6,0x6C,0x67,0xC3,0xCD,0x52,0xCA,0xE1,0xBE,0xAB,0x7D,0x08, + + 0x73,0xCA,0x44,0xFE,0x46,0xBA,0xE8,0x6B,0xCA,0xEA,0x03,0x98,0xF2,0xA6,0x69,0x3F, + + 0xA9,0x8B,0xD5,0x28,0xF6,0x0E,0x3B,0xC6,0xCD,0x10,0x3B,0x87,0x0A,0x56,0xBD,0x42, + + 0x20,0xCA,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x1A,0x85, + + 0xE0,0xCC,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x91,0x8D, + + 0x2C,0xC2,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x13,0x7C, + + 0xAB,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x28,0x85, + + 0x85,0x18,0xAA,0x34,0x17,0x70,0x54,0x62,0xAA,0x5B,0xAF,0xD4,0xD7,0xF6,0xBB,0x62, + + 0x2D,0x9E,0x8C,0x86,0x81,0x66,0xAF,0xC0,0xC6,0xD7,0xC4,0x34,0x70,0x9B,0x27,0x61, + + 0x26,0xDA,0xFF,0xDD,0x03,0xCD,0xCB,0x41,0x66,0x9A,0x3D,0xCE,0x57,0x97,0x4D,0xD7, + + 0xD1,0x9C,0x18,0x28,0x68,0xCE,0x35,0xFF,0x46,0xD5,0x85,0x67,0x02,0xFC,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x46,0x4A, + + 0xE2,0x13,0x09,0xD0,0x89,0x64,0x3A,0x2D,0xCD,0x50,0x8E,0x7E,0x87,0xF7,0xA7,0x6A, + + 0x25,0x96,0x3E,0x80,0x2D,0x4D,0x98,0x4A,0x65,0xD6,0x3E,0xBF,0xFF,0xF1,0x59,0x69, + + 0x2E,0x92,0xCF,0x4D,0x3A,0x4F,0xB7,0x49,0x6E,0xF2,0x18,0xD1,0x21,0xB8,0x9B,0xE9, + + 0x0E,0x56,0xAA,0x85,0xA9,0x0F,0x5F,0x7B,0x23,0x50,0x6B,0x4F,0xF5,0xF4,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x46,0x75,0x80,0x00, + + 0x0C,0x4C,0x88,0x49,0x73,0x00,0x6E,0xA0,0xC0,0xF3,0x26,0xD5,0xB8,0x30,0x51,0xEF, + + 0xE0,0xCE,0x88,0xE9,0x11,0xFA,0x41,0xB5,0x26,0x48,0xA7,0x6A,0xA0,0xBD,0xB6,0x85, + + 0x80,0x91,0xF9,0xFC,0x10,0xB9,0xAE,0x93,0x74,0xD2,0xEF,0x17,0x55,0x74,0x60,0xEA, + + 0xEA,0x06,0xA1,0x91,0x99,0x6A,0x18,0xC5,0xC1,0xE8,0xC0,0x21,0x5C,0x00,0x15,0x9E, + + 0xFB,0x7A,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x3C,0x74, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x7C,0x07, + + 0x20,0x48,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xA9,0xE0, + + 0x08,0xF3,0xDB,0x98,0xE5,0xE9,0x52,0x29,0xC8,0xF9,0x39,0x89,0x8D,0x76,0xE5,0xE2, + + 0x62,0x99,0x70,0x14,0xFC,0x3B,0x43,0xBD,0x6B,0x44,0xB9,0xCD,0xC5,0x29,0x03,0x7B, + + 0x2F,0x1A,0x79,0x85,0x6D,0xE9,0x29,0xDA,0xCA,0xB7,0xEE,0xDE,0x00,0xBE,0x24,0xE8, + + 0xD1,0x0E,0x01,0x7D,0x93,0x30,0x19,0xCD,0x69,0x4F,0x73,0xB7,0xFB,0xBD,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0xE4,0x44,0xF2,0xBB,0xEE,0xD2,0x53,0xB2,0xB7,0xA8,0xA8,0x00,0xDE,0xB0, + + 0x26,0xE9,0x48,0xF6,0x72,0xDE,0x46,0xB1,0xC2,0x57,0x34,0x17,0x0E,0x02,0x4F,0x28, + + 0x82,0x11,0x7A,0x67,0x32,0x3A,0xEF,0x23,0xE5,0xA3,0x7D,0x16,0x75,0x35,0x02,0x1D, + + 0x92,0xF1,0xF5,0xF7,0xF2,0xCE,0x95,0x8D,0x42,0x55,0x5D,0xB5,0x81,0x86,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xDC,0x84, + + 0x1B,0xFA,0xFE,0x0E,0x39,0xDF,0x1E,0xE5,0xCB,0x5E,0xD6,0x28,0x78,0xE9,0x6E,0xD8, + + 0x27,0x14,0x86,0x33,0x9A,0x39,0xDA,0xCE,0x9E,0x49,0x8D,0x83,0x61,0x3B,0xC5,0xFF, + + 0x8B,0x45,0xDD,0x8C,0x1B,0x3C,0x1F,0xE5,0x4B,0x41,0x20,0xA5,0xFE,0x7A,0x05,0x91, + + 0x0A,0x16,0xD1,0x8A,0xB1,0x3B,0xA5,0x46,0xDA,0x79,0x9F,0x85,0x86,0x6B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x7E,0x1F, + + 0x54,0x2B,0x66,0x70,0x50,0xCC,0xB0,0xD6,0x65,0xD0,0xCF,0x55,0xBE,0x48,0xD7,0x16, + + 0x05,0x59,0xC8,0x57,0xF8,0x2A,0x82,0x75,0x4B,0xC8,0x93,0xD8,0xEA,0xE5,0x04,0x03, + + 0xEF,0xA6,0xC3,0x02,0x95,0x14,0xEB,0x23,0xF7,0xD0,0xC3,0xC7,0x90,0x69,0x96,0xEE, + + 0x95,0xE0,0x54,0xF5,0x15,0x7C,0x7B,0xDB,0xC3,0x4E,0xBB,0x19,0x23,0x96,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xC2,0xBC, + + 0x8B,0x8F,0xC2,0x4A,0x68,0x25,0xA0,0xDC,0x5E,0x43,0x45,0x71,0xE1,0x14,0xBA,0xF8, + + 0xA1,0xC8,0xF0,0x1B,0xBE,0xAF,0x78,0x48,0x29,0x06,0xD2,0xB8,0xA1,0xA8,0x8B,0xA9, + + 0x53,0x65,0xDB,0x8D,0x9D,0xD2,0x73,0x9F,0x2B,0xD1,0x18,0x41,0x09,0xE4,0xBB,0x1B, + + 0x8D,0x8B,0xA3,0x53,0x7C,0xA4,0x7A,0xCB,0xCF,0x08,0x18,0x37,0x01,0xDB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x2E,0x02, + + 0x87,0x96,0x84,0x6D,0xBB,0xB2,0x8E,0x58,0x74,0x1D,0x5C,0x04,0xF1,0xF7,0x6D,0x64, + + 0x16,0xB3,0xC4,0x88,0xF3,0x45,0x38,0x08,0xE7,0xD9,0x9A,0xBB,0xF1,0x55,0x6D,0x11, + + 0x05,0x89,0x12,0x86,0x39,0xBE,0x4A,0x4E,0xC4,0x90,0x5A,0x49,0x71,0x55,0xF7,0xF1, + + 0xB5,0x58,0x4B,0x66,0x7F,0xF3,0xB0,0xC1,0x46,0x68,0x3C,0xB0,0x82,0xF7,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x62, + + 0x3E,0x55,0xF8,0x1C,0x38,0x35,0x16,0x50,0x93,0x03,0x69,0xBE,0xFB,0xFF,0x77,0x1F, + + 0x4A,0x95,0xF0,0x05,0x2D,0x16,0x67,0x2B,0x98,0x16,0x48,0x1B,0xF8,0xFE,0xD8,0x39, + + 0x7D,0x0A,0xD9,0x11,0x57,0x4C,0x1F,0x2F,0xE4,0x93,0x07,0x1D,0xD2,0xBF,0x2E,0x6F, + + 0xAD,0x16,0xCC,0x6C,0x59,0x14,0x3E,0xC4,0x0A,0xDD,0x50,0x4D,0xFB,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x29,0x22,0x59,0x0E, + + 0xE5,0x0B,0xC8,0x90,0xF9,0x89,0x40,0x06,0xAD,0x22,0xEE,0x18,0x56,0x62,0x46,0xAA, + + 0xD5,0x72,0x5E,0x53,0xCF,0x29,0xDC,0xC3,0x6B,0xEC,0x5B,0x47,0x78,0xE3,0x81,0x60, + + 0xB4,0x40,0x93,0xFB,0x6F,0x8F,0x6F,0x81,0x29,0x61,0x25,0x56,0xBE,0x6B,0xAE,0xA9, + + 0x87,0x21,0x09,0x54,0xFD,0x61,0x8E,0x0F,0xB5,0x58,0xE6,0x46,0xE3,0x0F,0xBF,0xF1, + + 0x3C,0xAB,0x99,0xA8,0xB7,0xA4,0x68,0x10,0x4A,0x4F,0x10,0xE5,0xF7,0x11,0xC8,0x31, + + 0x67,0xA8,0x08,0x31,0x2F,0xD0,0x8B,0x41,0xE2,0xBA,0xC0,0xB4,0x1C,0x30,0x94,0x32, + + 0xEC,0x0D,0x39,0xC1,0x90,0x9D,0xD1,0x00,0xA6,0xEB,0x1E,0x0A,0x5D,0xC0,0x18,0xB1, + + 0x87,0x2E,0x9A,0x6B,0xAD,0x65,0x67,0xC8,0xC5,0x45,0x96,0x1B,0x5C,0xC1,0xB1,0x8C, + + 0x0A,0x38,0xC6,0xBA,0x72,0x5B,0x92,0x76,0xEC,0xA5,0xF5,0xEC,0x1A,0x2A,0x74,0xB4, + + 0xE0,0xA0,0x8C,0xAC,0xF0,0x80,0x63,0xCB,0x67,0x9D,0xE4,0x85,0xD4,0xC4,0x7D,0xA0, + + 0x24,0x07,0xFD,0xB4,0x91,0xCB,0xD7,0x77,0xC6,0x54,0xD7,0x9B,0xB2,0x19,0xF6,0xF5, + + 0x89,0xDE,0x99,0x1C,0x66,0xA6,0xCB,0x4B,0x22,0xC8,0xC8,0xA2,0x32,0x63,0xD0,0xCC, + + 0x00,0xCB,0x88,0x34,0x9A,0x6E,0x57,0x9B,0x3A,0x29,0x19,0xAC,0x0B,0x11,0x91,0x58, + + 0xE2,0x9E,0x1E,0x2F,0x3D,0x6F,0x52,0x49,0xEA,0xB2,0x63,0x41,0x5D,0x6F,0x15,0xE4, + + 0x61,0xBD,0x2F,0x3E,0xFC,0x88,0x6B,0x9A,0xB2,0xE3,0x2C,0xE9,0xD0,0x9D,0x5D,0x28, + + 0x60,0x07,0x8B,0xAD,0x9A,0xEF,0x65,0xC4,0xCD,0x4D,0xDB,0x8E,0xAF,0x0A,0x66,0x84, + + 0x23,0x32,0x96,0x7B,0xCF,0xBD,0x10,0x46,0x48,0x02,0x73,0x64,0x76,0x32,0x8E,0x14, + + 0x29,0x76,0xCC,0xA3,0xD8,0xD2,0x08,0x9B,0x49,0xBF,0xCF,0x27,0x18,0xDE,0xC5,0x00, + + 0xB6,0xA9,0xD7,0x7A,0x47,0x70,0x01,0x1D,0xC8,0xC8,0xD5,0x03,0x7D,0xDF,0x52,0x99, + + 0xA7,0x31,0x95,0x8D,0x3E,0xB5,0x09,0x5A,0xE7,0x51,0x95,0xC6,0xCF,0xF5,0xC2,0xB3, + + 0x48,0x5B,0x94,0x5C,0x36,0x10,0x4E,0xE2,0xF0,0x5C,0xB2,0xD9,0x8D,0xA9,0x50,0xD0, + + 0xAC,0xB8,0x96,0x4A,0x5B,0x36,0x98,0x0A,0x9E,0x37,0x62,0xE1,0xFE,0xF8,0x44,0xB2, + + 0xC4,0x59,0x90,0xB7,0x59,0x35,0x49,0x9F,0x46,0xBB,0xB3,0xD9,0x05,0x75,0x9F,0x42, + + 0x8D,0xBA,0xB3,0xD3,0x52,0xB4,0x22,0x82,0x93,0x12,0x3A,0x0A,0x12,0xA1,0xC2,0x71, + + 0x24,0x1C,0x82,0x4C,0x3C,0x10,0xA2,0xDB,0x41,0xDA,0x96,0x5F,0x06,0x50,0x51,0x8D, + + 0x2F,0x39,0x82,0xA9,0x71,0xBA,0x79,0x78,0x23,0xF4,0x80,0x47,0x0A,0x79,0x84,0x0D, + + 0xA2,0x48,0x11,0x09,0xBA,0x7D,0x68,0xDA,0xDA,0x36,0xC8,0xBC,0x9A,0xD7,0xFB,0x80, + + 0xAF,0x39,0xB1,0xA1,0x1D,0xD6,0x03,0x89,0x1E,0xE4,0x89,0xDF,0x06,0xE6,0x96,0x4C, + + 0x28,0x97,0x6F,0x3F,0xB6,0x31,0xE8,0x6D,0x9D,0xF1,0x2D,0xAB,0x87,0xDA,0x70,0x64, + + 0xC8,0x16,0xF4,0x2F,0x4B,0x92,0x8C,0x86,0x19,0xF2,0x45,0x76,0x78,0x37,0x0F,0xCD, + + 0x83,0xDF,0x9F,0xC9,0x32,0xEF,0x40,0x6C,0x92,0xF1,0x83,0x1D,0x7A,0x61,0xCB,0xAA, + + 0xD1,0x90,0xD8,0xAE,0x99,0x9E,0x09,0x3E,0x02,0x9C,0x5E,0xFF,0x0F,0x0F,0xF5,0x3D, + + 0x76,0x3F,0x60,0x86,0xDE,0x0D,0x0E,0x92,0xC9,0x46,0x8E,0x8B,0x82,0x4F,0xE9,0x0D, + + 0x37,0x54,0xCA,0x17,0x16,0xE1,0x38,0xC2,0xBA,0x6E,0xEA,0xC6,0x51,0x40,0x7A,0x03, + + 0x82,0xC2,0xF0,0x67,0xDE,0xCC,0x30,0x63,0xC0,0xE2,0x66,0x66,0xAF,0x42,0xFC,0x2C, + + 0xF7,0x3F,0xA5,0x22,0x7C,0x30,0x6E,0xC0,0xB3,0x6E,0xEA,0xC4,0xA7,0x6E,0xDB,0xF3, + + 0x38,0x2B,0x20,0xC6,0x6D,0xE6,0x75,0x9C,0xEA,0xC9,0xC8,0x95,0x2A,0x8A,0x28,0xAB, + + 0xA6,0x0C,0xEC,0x74,0x33,0x2E,0x1E,0x4B,0xAE,0x54,0xE2,0x74,0xE4,0x48,0xB6,0x02, + + 0xFD,0xC4,0x7D,0x6A,0xDE,0x25,0x8E,0xA4,0x2F,0x95,0x97,0x5E,0x3F,0x77,0x6D,0xB3, + + 0x83,0xAE,0xED,0xB5,0x6B,0x34,0x63,0x71,0x74,0x6A,0x6A,0x07,0x57,0xF1,0x9F,0x51, + + 0x7F,0x88,0xC4,0x7F,0xF7,0x7B,0x60,0x98,0x5C,0xC8,0xE4,0x83,0xB7,0x9B,0xFC,0xBA, + + 0x1F,0xBB,0xD4,0xA7,0x14,0x48,0x5A,0x5A,0xBB,0x68,0xF9,0x4D,0x74,0x6B,0xE3,0x0F, + + 0x9A,0x3E,0x9D,0xA2,0x5E,0xAA,0x3B,0x2F,0xC5,0x2B,0x73,0xAE,0xB3,0xE0,0x72,0x14, + + 0x68,0xE7,0xAD,0xAF,0x74,0x02,0x03,0xDE,0xC5,0x17,0x44,0x4C,0xEF,0x87,0xF0,0xCE, + + 0x04,0x59,0x51,0xE3,0x18,0x44,0x27,0x1A,0xCE,0xDA,0xFA,0x7A,0x96,0x3D,0x2A,0x33, + + 0x0E,0x5D,0x8D,0x3C,0xF4,0x8E,0xAB,0xE5,0xBA,0x44,0x3A,0xFF,0xAE,0xE0,0xA3,0xCB, + + 0x96,0xCC,0xF4,0x6B,0x1C,0xAA,0x7B,0x8B,0x41,0x63,0xE0,0x7C,0xA2,0x5F,0xAB,0xDB, + + 0xF9,0x85,0xB3,0x5B,0x17,0x16,0x5B,0x91,0x26,0xFC,0x00,0x58,0x7E,0x83,0xE0,0x7B, + + 0x6C,0xD2,0x60,0x75,0x12,0x1D,0x0A,0x0A,0xE9,0x66,0x74,0x26,0xBE,0x5D,0xEC,0x96, + + 0x33,0x45,0x92,0xAB,0xC1,0x60,0x02,0x0A,0x19,0x7E,0xF8,0x43,0x76,0x81,0x21,0x24, + + 0xDF,0x82,0x32,0x02,0x5F,0xD1,0x3D,0xA7,0xED,0x33,0xE4,0xC7,0xF6,0xB0,0x7D,0x8C, + + 0x8F,0x88,0xF4,0x92,0x60,0xF6,0xEE,0xCD,0x65,0x92,0x7D,0x37,0x53,0x5E,0x7C,0x4B, + + 0xCF,0x47,0xDC,0xF7,0x97,0x35,0x12,0x43,0x8F,0xD7,0xD4,0xC1,0xFB,0xEF,0x3B,0x56, + + 0x25,0xA5,0xBE,0x9D,0xDC,0xD1,0x2B,0x76,0x6D,0x00,0xC2,0xCE,0x71,0xF7,0x73,0xA1, + + 0x59,0x3B,0x5D,0x34,0x32,0x3B,0xB5,0x63,0x85,0xDE,0x83,0x81,0x3C,0x47,0x96,0xF4, + + 0x06,0xFB,0x2D,0xC7,0x8C,0x43,0xBD,0x73,0xFF,0x95,0xF3,0x37,0x89,0x7C,0x0E,0xEC, + + 0x0F,0xE8,0x18,0x0B,0xE9,0xDA,0x30,0x1A,0x85,0x71,0xE5,0x97,0x97,0xF0,0x77,0x76, + + 0x88,0xF7,0x90,0xA3,0xE3,0x16,0x6C,0x45,0x6B,0xDB,0xEC,0x4E,0x8A,0x58,0x7E,0x8D, + + 0x09,0x65,0xCE,0x65,0x43,0xD6,0x25,0x54,0x13,0x57,0x8C,0xAD,0xC8,0x5A,0xC8,0xDB, + + 0xFD,0x36,0x38,0xEC,0xC9,0x6D,0xDD,0x3F,0xE7,0x30,0xEC,0x4C,0x8F,0x70,0x00,0x7E, + + 0xC7,0x3F,0xFE,0xD0,0x61,0x08,0x36,0x83,0x6F,0xDD,0xE8,0xDF,0x5C,0xE3,0xEE,0xBB, + + 0x4B,0xB4,0xCE,0xB8,0x57,0xB0,0xF8,0x89,0x05,0x92,0xA8,0x03,0x77,0xBF,0xA7,0x4B, + + 0x87,0x96,0x2C,0xD5,0xE5,0xA5,0xB7,0x6B,0x98,0xD4,0x4F,0x3F,0xA2,0xF5,0x7F,0x5F, + + 0xAD,0x24,0xF9,0xBD,0xDF,0xC5,0x7E,0x88,0x89,0x90,0xF6,0x50,0xCC,0xFB,0xB8,0xFF, + + 0x06,0x22,0x40,0x84,0x0F,0x28,0x6E,0x09,0xBD,0x2C,0xC8,0x20,0x42,0x2D,0xBC,0x63, + + 0x79,0x0E,0x94,0x84,0x78,0xC0,0x34,0x6D,0x72,0x6B,0xA6,0xE8,0x38,0xDB,0xF2,0x72, + + 0xF0,0x0D,0x01,0x46,0xEA,0x8F,0x73,0x3C,0xC1,0x02,0xC9,0x21,0x59,0xD1,0x53,0x1E, + + 0xFD,0x1C,0x91,0x85,0xE6,0x23,0xA1,0xD1,0x9D,0x2D,0xC1,0x2D,0x5C,0xCE,0x38,0x67, + + 0xFF,0x0B,0xBE,0x68,0xCE,0x55,0x2F,0x1E,0x30,0xDB,0xEF,0x82,0x31,0x47,0x12,0xAF, + + 0xA4,0x69,0xB1,0x32,0x30,0x44,0x63,0xF4,0x41,0x75,0x17,0x06,0xF0,0xC8,0x1B,0x4E, + + 0xFA,0x19,0x9B,0x91,0xFA,0xC7,0x6E,0x50,0x63,0xB9,0xC7,0x50,0xD4,0x44,0xF6,0xC3, + + 0x7C,0xDA,0xEE,0x53,0x43,0x43,0xA2,0x56,0x62,0xB8,0x4F,0xF1,0xD1,0x4B,0x58,0xF7, + + 0xAF,0x64,0xBC,0x21,0x70,0x81,0x4B,0x9B,0xED,0xEE,0x8A,0xBF,0x07,0x06,0x34,0x20, + + 0x68,0x0D,0x4A,0x9C,0x15,0x6B,0x5A,0x69,0x48,0x09,0xB6,0x85,0xD4,0xC4,0x3D,0x30, + + 0x4A,0xF5,0x7C,0x73,0xF2,0x7B,0xDE,0x5A,0xDF,0x08,0xF1,0x3D,0xD9,0x2A,0x69,0x1B, + + 0x8A,0x3B,0xCB,0xD0,0x98,0x6B,0x37,0x64,0x28,0xE4,0x50,0xAE,0x82,0x05,0x58,0x4A, + + 0xC8,0x08,0xFA,0xB2,0xB6,0x21,0xBE,0xE7,0xBF,0x1A,0x12,0xED,0xCF,0x2E,0xF2,0xA7, + + 0x68,0x79,0xB0,0xBC,0x1F,0x00,0xF1,0x27,0xF6,0xB1,0x16,0x0F,0x37,0x2F,0x0B,0x45, + + 0xB9,0xCA,0xB9,0xAD,0x9E,0xF3,0x5B,0x7D,0x1F,0x13,0x93,0x32,0xDC,0x4C,0x5C,0xB3, + + 0x76,0x40,0xE5,0x46,0x1F,0xBB,0x65,0xC8,0xA3,0x5F,0x9B,0xF4,0xDD,0x4D,0x3F,0x13, + + 0x11,0x1A,0xBA,0xA9,0xFA,0x99,0x32,0x42,0x54,0xFF,0xDB,0x5B,0x91,0xF6,0x72,0x96, + + 0x42,0xE6,0x8C,0x10,0x33,0x51,0x22,0x98,0xEC,0xF7,0x33,0x04,0x71,0xAE,0x14,0x71, + + 0x53,0xA3,0x7A,0xF6,0x84,0xB4,0x80,0xD3,0x0B,0x43,0x95,0xFA,0x90,0x52,0x5E,0x62, + + 0x2D,0x1E,0x4D,0x15,0xAE,0x3B,0x03,0xF1,0xE5,0x7F,0x5D,0xB4,0x5F,0x68,0xD1,0xB3, + + 0x1E,0x1D,0xD5,0xE3,0x93,0x9B,0x0E,0x78,0xC1,0x52,0x67,0xCC,0x74,0x2D,0xDD,0xD3, + + 0xB2,0xB5,0x68,0xB6,0x84,0x50,0x24,0x18,0xAF,0x18,0x4A,0xB3,0xB1,0x85,0xC5,0xC2, + + 0x33,0xB6,0xD0,0xDE,0x36,0xA2,0xFF,0xF3,0x81,0xD4,0xFD,0xF4,0x9E,0xDB,0xDB,0xD2, + + 0x0B,0x56,0xF5,0x27,0x90,0x77,0x26,0xF9,0x46,0xE8,0x95,0xF1,0x7A,0x58,0x5E,0x18, + + 0xD1,0xB9,0x06,0xCF,0x42,0x7A,0x9B,0x2C,0x62,0x6C,0x36,0xCA,0x83,0x14,0x4E,0x91, + + 0x9E,0x7C,0xF6,0x8F,0x09,0x83,0x49,0xCB,0x55,0xF8,0x9E,0xFC,0x6D,0x62,0x3F,0x76, + + 0x59,0x58,0xC3,0x86,0xDB,0x1A,0x2F,0xC9,0xEC,0x76,0x28,0x36,0x0D,0xFC,0x37,0x76, + + 0xAF,0x39,0xA9,0xB5,0xEE,0x9F,0x27,0x46,0x00,0x0A,0xD5,0x4D,0xF1,0x34,0xE1,0x78, + + 0xF2,0xBF,0x7F,0x3E,0x19,0x55,0xE1,0xE5,0x9E,0x0C,0x46,0x9E,0x91,0x9D,0x0A,0x61, + + 0xD6,0xBC,0x6E,0xC6,0xB7,0x00,0xDF,0xE7,0x77,0x46,0xE0,0xC9,0xF6,0x8B,0x6A,0xA6, + + 0x33,0x5C,0x9A,0xC8,0xA0,0x8A,0x97,0x81,0x0A,0x8A,0x8E,0xEF,0x5F,0x81,0x4A,0x26, + + 0x5A,0xCC,0x0F,0x5D,0xE9,0xE2,0x7A,0x9F,0x18,0x4F,0x97,0x7C,0x98,0x0B,0x79,0x00, + + 0xA1,0x01,0x8C,0xBF,0xFD,0xB1,0xA6,0x51,0x28,0xAC,0xD2,0x36,0x55,0xF0,0xD0,0xFA, + + 0x85,0xCC,0xBE,0x74,0xEA,0x0C,0x14,0x6F,0x26,0x87,0xE0,0x32,0xDC,0x52,0x84,0xE9, + + 0x6D,0x33,0xB9,0x96,0x7D,0xD3,0x57,0x42,0xC5,0x82,0x8F,0x47,0xBD,0x18,0x2B,0xF5, + + 0xCD,0x80,0x38,0xB2,0x62,0x28,0x2F,0x06,0x2E,0x87,0x15,0x44,0xF4,0x45,0x39,0x9B, + + 0x00,0x04,0x44,0xB6,0xE9,0xAB,0x0E,0x6A,0xFF,0x65,0x59,0xE2,0x54,0x47,0x7D,0xD6, + + 0x0D,0xC8,0xFE,0x63,0xA4,0x28,0x61,0x72,0xC5,0xC1,0x6E,0xF2,0x55,0xAF,0x7E,0xB3, + + 0x99,0x27,0x55,0xA5,0xF5,0x2A,0x74,0x90,0xDE,0x86,0x31,0xE6,0xD9,0x4B,0x33,0x43, + + 0xEF,0xB6,0x11,0x34,0x5E,0x0A,0x76,0x11,0x06,0x4D,0x39,0xF6,0x42,0xA5,0x1C,0xAA, + + 0x81,0x0E,0x21,0x8A,0x1E,0x18,0x08,0x9A,0xF8,0x67,0x7D,0xD1,0xBD,0x6E,0x23,0x68, + + 0xF6,0x16,0x2A,0x5D,0x67,0x04,0x16,0x77,0xA4,0x28,0xC5,0x4C,0x23,0x76,0xA4,0xCB, + + 0x88,0xA3,0x63,0x8F,0x83,0xA2,0x97,0x49,0xEF,0x8A,0xB3,0x70,0xBC,0xCA,0x87,0x60, + + 0x47,0xB2,0x3D,0x7F,0xDF,0xC7,0x1D,0x4A,0x6E,0x4E,0x17,0x4C,0x8A,0x4D,0x1C,0x63, + + 0x3D,0x88,0x74,0xCA,0x1C,0x93,0xF6,0x1A,0x42,0xC5,0xB2,0x74,0x58,0xCE,0xC6,0xC8, + + 0x53,0x87,0x15,0x2D,0x73,0xEF,0x20,0xEF,0xEC,0xA8,0x63,0x3C,0xA7,0x9C,0xDB,0x5B, + + 0x29,0xC3,0xDB,0xB1,0x32,0xA3,0x31,0xE9,0x0B,0x1F,0x3F,0x6D,0x8A,0xAC,0xAB,0x4A, + + 0xBF,0x2F,0xAF,0x4A,0x3E,0x00,0x21,0xF2,0x6C,0xAA,0xC8,0x53,0x23,0xDE,0x1F,0xEC, + + 0x87,0xF5,0x32,0x5B,0xFC,0x51,0xF4,0x22,0x7C,0x4F,0xED,0xE4,0x17,0x72,0x2C,0x93, + + 0x75,0x95,0xF5,0x85,0xC4,0xFE,0x65,0x4A,0xC0,0x67,0x43,0x71,0x46,0xE5,0x98,0x61, + + 0xFC,0x25,0xBD,0x6F,0x83,0xFD,0x81,0xC1,0x1F,0xBC,0x4D,0x4F,0xC3,0xBF,0x82,0xB7, + + 0x44,0x88,0xAC,0xEC,0x12,0x3E,0x06,0x37,0xE7,0x7B,0x5F,0xF7,0xF1,0x0E,0x4B,0xBD, + + 0xFF,0x0B,0x9C,0xE1,0xCB,0xBB,0xCC,0x19,0x9A,0x64,0xE2,0xD3,0xC5,0xB9,0x57,0x56, + + 0x25,0xA5,0x7D,0xD1,0x8E,0xF7,0x4E,0xEC,0x37,0x21,0x3C,0x22,0x65,0x55,0x5A,0xF2, + + 0x07,0x69,0xC3,0xEA,0x32,0x12,0xC6,0xFB,0xE0,0xCF,0xED,0xF6,0x0A,0x17,0xDD,0xA4, + + 0xA9,0x48,0xAD,0x7F,0xB1,0x95,0x7A,0xD7,0x06,0x78,0x6B,0xF5,0x1E,0xEC,0x6C,0x6C, + + 0x1F,0x9C,0xFF,0x80,0xDB,0x4D,0x3E,0xAE,0xE5,0x6B,0x4C,0x46,0xB4,0xB5,0x77,0x98, + + 0x88,0x66,0xE4,0xE6,0x3B,0xB0,0x2F,0xDA,0x3D,0x52,0xE7,0xBC,0xD8,0x46,0xDF,0x0F, + + 0x81,0x59,0x32,0xB1,0x88,0xF8,0x09,0xDA,0xAE,0x73,0x4C,0xA7,0x59,0x05,0x39,0xF9, + + 0xC5,0x96,0xAF,0x77,0x79,0xF6,0xFF,0x3F,0xEF,0x6B,0x7F,0x3E,0x0B,0x26,0xD2,0xA8, + + 0x20,0xE3,0x2A,0xA5,0x1D,0xF1,0xE0,0x99,0x02,0x9E,0x96,0x1A,0x81,0xE7,0x3C,0xA5, + + 0x01,0x3B,0x97,0xB8,0xC4,0x36,0x05,0x89,0x03,0x9F,0xC0,0xF2,0xF2,0x9F,0xCE,0xB5, + + 0x3B,0x6B,0xBD,0x1B,0xD6,0x5F,0x37,0x30,0x16,0x9A,0xD7,0x89,0xDF,0x1E,0x57,0x25, + + 0x52,0x2E,0xC5,0xEE,0xD3,0xA0,0x3F,0x94,0x13,0x9B,0xA6,0x7D,0x18,0xBE,0xA3,0xB4, + + 0xDC,0xE3,0xE6,0xB0,0x11,0x70,0x94,0x25,0xC3,0x4D,0x92,0x77,0x50,0x60,0x6E,0xDD, + + 0xE8,0x5B,0x77,0x67,0x77,0xA2,0x70,0x52,0xFA,0x4F,0x1B,0xC7,0x0D,0xC5,0xED,0xE9, + + 0x5E,0x4F,0xBF,0xB0,0xF0,0xDD,0xEC,0xE3,0x61,0x1D,0x91,0x25,0x31,0xCD,0xC9,0x91, + + 0xC8,0x09,0x76,0xEB,0xB5,0x9F,0x21,0xDB,0xC7,0x03,0x56,0x3D,0x38,0x73,0x9D,0x41, + + 0xE3,0xBB,0x74,0x26,0x7A,0x95,0x57,0x93,0x1A,0x56,0xE8,0x84,0x09,0xC9,0x00,0x41, + + 0x13,0x24,0x64,0xD1,0xE4,0xD8,0x5B,0xF4,0x49,0xAA,0x4A,0x07,0x2F,0xEF,0x9E,0x40, + + 0x84,0xCF,0x3E,0x36,0xE2,0xF5,0xE9,0xF2,0x92,0xE9,0xC6,0xB5,0x25,0x6F,0xEA,0xD3, + + 0x46,0x0F,0x0D,0xAA,0x13,0x25,0x99,0x61,0x09,0x2B,0x22,0x15,0xF3,0x25,0xC3,0x8A, + + 0x91,0x21,0x3D,0x57,0xC9,0xF5,0xE8,0xAA,0x8D,0xC0,0x7E,0xBF,0x79,0x62,0x34,0xAD, + + 0x98,0xF4,0x66,0x67,0xDB,0x29,0xCC,0x09,0x15,0xE6,0xA4,0x35,0xD6,0xCF,0x3B,0xF6, + + 0xA9,0x68,0xA8,0x7F,0x27,0x75,0xD3,0x39,0x30,0xE7,0xCA,0x3E,0x83,0x5A,0x22,0x11, + + 0x09,0xAB,0xB0,0x8F,0x9D,0x23,0x9C,0x4A,0xAF,0xE8,0x50,0xFD,0x90,0x29,0x82,0x58, + + 0x31,0x17,0x02,0xCD,0x9A,0x8D,0x92,0x78,0x2C,0x46,0x96,0x10,0x38,0xB3,0x2A,0x0E, + + 0x0A,0x4F,0x19,0xA2,0x1D,0x0F,0x9A,0x68,0xB3,0xE0,0x3D,0x0F,0x23,0xBB,0x46,0xCD, + + 0xCA,0x54,0xD4,0xB2,0x73,0xBF,0xD1,0xED,0xC0,0xA1,0x28,0xAA,0x33,0xBF,0x0B,0x7D, + + 0x09,0xC3,0xC2,0xD9,0x91,0xE9,0xD8,0x2B,0x78,0xC5,0x93,0xFC,0xE8,0x3B,0xD2,0x04, + + 0x22,0x21,0x80,0xC4,0x2A,0xBD,0x72,0x11,0x9F,0xDB,0xAE,0x4B,0x0B,0x8F,0xF7,0x14, + + 0x2D,0x71,0x73,0x16,0xF4,0xC0,0xDC,0xD9,0x3D,0x3D,0x80,0x24,0x8E,0xDC,0xB2,0x88, + + 0x53,0xAD,0x92,0x7A,0x41,0xB1,0x17,0x32,0x82,0x8D,0x55,0xD1,0xF3,0xDF,0x65,0xF3, + + 0x1E,0x1D,0x4D,0x14,0xCD,0x71,0x27,0x2E,0x1E,0xD8,0x85,0xF2,0x2F,0x79,0xD4,0x42, + + 0xE7,0x9C,0xE2,0x26,0x59,0xD5,0xF7,0xD8,0xBE,0xE5,0xB4,0xB2,0xBA,0x79,0xC8,0xCE, + + 0xC2,0xE4,0x88,0xFC,0x10,0x75,0x67,0xBE,0x65,0x77,0xDB,0x76,0xF3,0x1C,0x85,0xD1, + + 0x99,0x54,0x42,0x54,0xDE,0x74,0xF8,0x9A,0x7F,0x0A,0x79,0x77,0xC1,0x7C,0x33,0xC8, + + 0x56,0x94,0xF9,0xF4,0x7B,0x6E,0x7D,0x0E,0x6C,0xF1,0xE5,0xD5,0x16,0xB7,0x3E,0x66, + + 0xAB,0x15,0x82,0xDF,0xC5,0x49,0x14,0x36,0x9F,0x5B,0x95,0xBF,0x59,0x68,0xCE,0x9C, + + 0xCE,0x1F,0xD5,0x9D,0x42,0x39,0xE1,0xBA,0x47,0x37,0x29,0xCD,0x7F,0xB0,0x7A,0x4B, + + 0x09,0x05,0x7A,0xF3,0x8E,0x65,0xA9,0x01,0x09,0x85,0xAD,0x42,0x83,0x5A,0xA5,0xD9, + + 0xAF,0x9B,0xEF,0xCB,0xCD,0x36,0x21,0x08,0x23,0x68,0xD7,0xAE,0xD8,0x6B,0x42,0x3B, + + 0x7A,0x5E,0xD7,0x48,0x38,0xCB,0x41,0x96,0xA0,0xCD,0x8C,0x94,0x12,0x6D,0x41,0xBA, + + 0xD4,0x91,0xF6,0x2F,0x5D,0x7F,0x57,0x03,0xE4,0xA0,0x72,0x6F,0x4E,0x77,0xDD,0xE7, + + 0x28,0x1A,0xFF,0x3E,0xD0,0x5B,0x5F,0xE4,0xEC,0x7C,0xA9,0xC5,0x13,0x6F,0x8B,0x5C, + + 0xE8,0x7F,0x8F,0x86,0x1A,0x90,0x38,0x87,0x39,0x55,0x5B,0xEE,0xCE,0x6E,0x8B,0x45, + + 0x0A,0x5C,0xE5,0x74,0x6C,0x5F,0xB3,0xD1,0x10,0x81,0xF4,0x9F,0xA9,0x41,0xFE,0x0C, + + 0x63,0x87,0x02,0xB6,0x13,0x83,0x1B,0x86,0x9D,0x22,0x43,0x11,0xF4,0x1E,0xE5,0xC9, + + 0x3F,0x2D,0x9A,0xB7,0x63,0xA4,0x92,0x93,0x18,0x61,0xB4,0xA3,0xD6,0xE2,0x83,0x53, + + 0x83,0x03,0x3E,0x93,0x9D,0x0F,0x03,0x02,0xAB,0x6C,0x79,0x5F,0xD5,0x4E,0x68,0xC6, + + 0x46,0xBF,0x45,0x40,0x82,0xC0,0x08,0x28,0x77,0x6B,0x30,0xE7,0x75,0x67,0xFF,0xA1, + + 0x1B,0x58,0x90,0x72,0xFE,0x3F,0x32,0x6F,0x56,0x6A,0xA8,0xE9,0xBE,0x14,0xA1,0x46, + + 0x52,0x0B,0x5A,0xA5,0x3A,0x5B,0xF2,0x10,0x9A,0x4A,0x0A,0x99,0x59,0x4B,0x3B,0x52, + + 0x6C,0xD7,0xF1,0x4A,0x15,0x6B,0xFE,0x34,0x05,0x18,0x1A,0x37,0x9B,0xFC,0x44,0x60, + + 0x8D,0x85,0x1F,0x33,0xA3,0xF5,0x67,0x59,0x2A,0x4B,0xB3,0x5F,0x7D,0xE3,0x02,0x78, + + 0xB0,0x85,0xF5,0x1E,0x92,0x14,0x04,0x8A,0x8F,0x49,0x39,0xCD,0x4D,0x44,0x1E,0x49, + + 0x2D,0xD7,0x70,0xE1,0xEF,0xEA,0x48,0xD8,0xFE,0xA6,0x26,0x5C,0x83,0xE3,0x13,0x25, + + 0xEB,0x7E,0xC9,0x1F,0x6C,0x2D,0x73,0xA2,0x40,0x46,0xA5,0xCD,0x9D,0x14,0x02,0x1C, + + 0x4F,0xCE,0xC4,0x2C,0x91,0x2A,0x4C,0x76,0x8C,0xCC,0x83,0x08,0xB5,0xFD,0xAA,0x4A, + + 0x18,0x8B,0xF8,0x52,0xBC,0xA9,0xA0,0x85,0x6B,0x60,0x25,0x1C,0x7D,0x20,0x61,0xA2, + + 0xBD,0xBE,0xBA,0x8F,0x82,0xA3,0x2A,0x4D,0xCF,0xAE,0xD3,0x63,0x5C,0xEA,0xC1,0x0B, + + 0x89,0x8D,0xED,0x2D,0x1D,0x63,0xFC,0x8D,0x8B,0x8E,0x7F,0x8E,0xEF,0x2C,0x13,0x00, + + 0xE1,0x18,0x5B,0x7A,0x34,0xF2,0x0A,0x12,0xAE,0xC3,0xB2,0xAF,0xF4,0x77,0x04,0xF0, + + 0x9C,0x9D,0xAB,0xBB,0x8A,0x6C,0x5A,0x1B,0x9A,0x7C,0xC2,0xBF,0x4A,0x0E,0xE5,0x93, + + 0x6E,0x8F,0xE1,0x37,0xB2,0xF0,0x3D,0x8B,0x0D,0x71,0x8B,0x7E,0xD5,0x82,0x15,0xFD, + + 0x24,0x9E,0x7C,0x69,0x68,0xCE,0x6F,0x20,0xD7,0x0C,0x87,0x4C,0x8A,0x0C,0x34,0xA0, + + 0x72,0xF8,0x32,0xE1,0x97,0x1B,0xB2,0x66,0x6C,0xD0,0x47,0xDF,0x8A,0x25,0xE9,0x21, + + 0x3B,0x87,0x92,0xD1,0x96,0x1A,0xC7,0x61,0x17,0xDF,0x3C,0x32,0x73,0x21,0x3C,0xC9, + + 0x03,0x30,0xB4,0x43,0xB4,0xC8,0x8A,0xA4,0x2C,0x67,0xC2,0x53,0x06,0x55,0xD5,0x40, + + 0xB3,0x38,0xFA,0xF0,0x16,0x18,0xE9,0x77,0xED,0xCF,0xA9,0xE8,0xD1,0x22,0x9B,0xC8, + + 0x8D,0x4D,0x09,0xAA,0xBE,0x74,0xF6,0xC3,0x30,0x75,0x76,0xDA,0x7F,0x55,0x6E,0xB3, + + 0xD1,0x89,0xAE,0x9E,0x3D,0xB9,0x6F,0x06,0x9A,0xB5,0x75,0xF9,0xA3,0xF3,0xF5,0xB4, + + 0xC2,0xD8,0xAF,0x0B,0xFC,0x16,0x62,0x96,0x13,0x77,0xA9,0x3F,0x03,0x57,0x54,0x60, + + 0x5A,0xD9,0xCF,0xC9,0xFC,0xF9,0x80,0x28,0x83,0x06,0xBC,0xAC,0xAA,0xCB,0xE7,0xB5, + + 0xEF,0xFE,0x75,0x4A,0x3C,0x81,0x09,0xAD,0x93,0x6A,0x61,0xD1,0x5C,0x49,0x3E,0xB8, + + 0x7B,0xF1,0x79,0xF9,0x9E,0x12,0xDB,0xFC,0xFB,0xB9,0x36,0xFA,0xAB,0x9E,0xA3,0x4E, + + 0xED,0xBE,0x99,0xC8,0x1F,0x11,0xCC,0x71,0xED,0xCC,0xA6,0xD5,0x90,0xBC,0x36,0xD5, + + 0x0A,0x39,0xBF,0x5B,0xB5,0xC5,0xCB,0xDC,0x4E,0x00,0x58,0x4F,0x0B,0xDC,0xB7,0xA4, + + 0xF0,0x63,0x2C,0x81,0x6C,0xDF,0x2E,0x91,0x8A,0x63,0x50,0xA5,0xD7,0x22,0xA4,0x5F, + + 0xFC,0x7D,0x53,0x14,0x72,0xAD,0x4C,0x23,0x23,0x02,0x71,0x0F,0x25,0xF4,0x36,0xB1, + + 0x86,0x6A,0x41,0x84,0xB8,0xDD,0x6F,0x08,0x08,0x21,0xD1,0x80,0xD6,0x40,0xA0,0x6F, + + 0x14,0x6D,0x9F,0x20,0x22,0x6E,0x39,0x2F,0x4E,0xEE,0x8E,0x0A,0xE5,0xB6,0x19,0x44, + + 0x8F,0x67,0xF3,0x69,0xEE,0xB7,0xE3,0xCD,0xBE,0xD7,0xF3,0x63,0xBB,0x20,0x35,0x97, + + 0xC9,0x96,0x7F,0x4A,0x2F,0xD1,0x98,0x69,0x2B,0xD6,0xE2,0xC5,0xDF,0xCA,0xEA,0xE4, + + 0x57,0x18,0x72,0xE8,0x94,0xDE,0x7E,0x0E,0x1B,0x04,0xC3,0x75,0x39,0x22,0xF2,0xC2, + + 0xBD,0x0D,0xDA,0xBD,0x5F,0x6A,0x27,0xC9,0x36,0xE4,0x7D,0x17,0x20,0x02,0xBF,0x9B, + + 0x38,0x55,0xFD,0xF4,0x18,0x6A,0x42,0xBB,0x7A,0xE5,0x87,0xA8,0x5F,0x28,0x2E,0xA2, + + 0x8E,0x4A,0x9E,0xE3,0x7A,0xA5,0x99,0x4B,0x7B,0xE8,0xAD,0x9C,0xA9,0x98,0x61,0x09, + + 0x8B,0x4A,0x8E,0x35,0x9E,0x08,0x84,0xBA,0xA6,0x42,0x30,0x84,0x04,0x39,0x52,0x5A, + + 0x2C,0xF4,0x9D,0x28,0x2A,0xD6,0xCB,0xCA,0xB9,0xE6,0x2C,0x05,0x2D,0x1A,0x81,0x0F, + + 0xE3,0x9F,0x39,0x44,0xBF,0xD3,0x87,0x9B,0x74,0x48,0xEA,0xE8,0x50,0xAA,0x02,0xD0, + + 0xE2,0x9E,0xAC,0x75,0x18,0x7D,0x8B,0xFC,0x49,0x7C,0xE4,0xDC,0x3B,0xED,0x24,0x3A, + + 0xB4,0x98,0x2F,0xDE,0xAE,0xF3,0xD9,0x57,0xF0,0xBB,0x70,0xC9,0x06,0x0D,0xF8,0xF4, + + 0xB8,0x4F,0x74,0x6D,0x64,0x80,0x9B,0xFD,0xCF,0x43,0xA5,0x7B,0x3A,0xCC,0x62,0xA8, + + 0xDF,0x4D,0x4A,0x00,0x32,0xDF,0xC6,0x8C,0xA8,0xB3,0x38,0xD7,0x56,0x86,0x58,0xAB, + + 0x07,0x53,0xB4,0x67,0x05,0x73,0xDC,0x30,0xFE,0xFE,0x67,0x36,0xB3,0xB6,0x67,0x81, + + 0x57,0x87,0xBD,0x76,0x88,0x57,0x80,0xB2,0xD2,0xC3,0x6A,0xD6,0xDA,0xA4,0x09,0x36, + + 0x78,0x6E,0xC9,0x84,0x10,0x9C,0xB9,0xC2,0xD9,0x5C,0x5D,0x31,0xB3,0xEC,0xDF,0x70, + + 0xD1,0xCB,0x84,0x04,0x34,0x16,0x94,0xE4,0xE3,0x59,0xB6,0xE4,0xEF,0x89,0x72,0xF9, + + 0xF5,0x1F,0x0C,0x55,0xA4,0x77,0x0A,0xCF,0x05,0x17,0xA5,0xCA,0x0B,0x80,0xA9,0xB2, + + 0x96,0xE0,0x2D,0x41,0xB0,0x62,0xEA,0xA3,0x43,0x83,0x78,0x0B,0x13,0x49,0x09,0x39, + + 0x37,0x55,0x8D,0x22,0xB5,0x15,0x1D,0xD8,0x60,0x5A,0x4E,0x0F,0x08,0x35,0x29,0xD2, + + 0x9D,0x84,0x13,0xAB,0x99,0x97,0xA2,0xDB,0x5C,0x57,0x22,0xCE,0x83,0x14,0x5A,0x87, + + 0x0F,0x1A,0xB6,0x6F,0x41,0x5C,0xBA,0xCB,0x55,0x56,0xA0,0x19,0xAB,0xE6,0xC7,0x88, + + 0x61,0xCE,0x94,0x09,0xBA,0xD8,0xD7,0x29,0x51,0xF5,0xA9,0x1D,0x22,0xC5,0xDF,0x39, + + 0x2C,0x58,0xB7,0x6E,0xCD,0x79,0xAB,0xCA,0x99,0x54,0x5F,0xF8,0x74,0xAF,0x02,0x28, + + 0x48,0x83,0x2E,0x48,0x30,0x9C,0xA9,0x2A,0xCB,0x83,0x92,0xCA,0x8F,0x70,0xA9,0xAB, + + 0x17,0xCB,0x58,0xBC,0x3F,0x18,0x8B,0xE7,0x19,0xF9,0x6D,0x58,0x87,0x1E,0xBC,0x0E, + + 0x43,0x8F,0x07,0x4C,0x2D,0x93,0x97,0xEC,0x3E,0x8A,0xEF,0x92,0x7B,0x73,0x47,0xDC, + + 0xC0,0x0E,0x5A,0xF9,0x6F,0x8E,0x0B,0xBC,0x23,0x1C,0x1F,0x7D,0xC3,0x8A,0xCC,0x71, + + 0x22,0x76,0x58,0x75,0x78,0xA9,0xE6,0x93,0x6E,0x6F,0x70,0xE2,0x50,0x34,0x60,0x07, + + 0xE4,0x2E,0xF6,0x23,0x49,0x03,0x06,0x9A,0x8F,0x82,0xED,0x09,0x63,0x74,0x1F,0xA2, + + 0x46,0x82,0x21,0x66,0xDD,0xE3,0xA4,0x21,0x9C,0xAE,0x64,0x38,0xA6,0x37,0x7D,0xE0, + + 0xA3,0x87,0x3F,0x95,0x15,0x18,0x47,0x0B,0x2C,0x20,0x6C,0x0C,0xA7,0xA1,0xCC,0xE7, + + 0xD3,0xE7,0x71,0x38,0x74,0x5B,0x48,0x1D,0xC7,0xC9,0x67,0x95,0xDA,0xB9,0x0E,0xFE, + + 0xF2,0x23,0x50,0xA8,0x07,0xE8,0xB8,0xF2,0x7F,0xCB,0x38,0xF7,0x3A,0xE8,0xCA,0x89, + + 0x3D,0xE8,0x9F,0x6E,0xA5,0x92,0xC2,0xD2,0x3A,0x05,0x89,0x40,0x6B,0xE9,0x3C,0x13, + + 0x8B,0x2C,0x16,0x90,0x5D,0x36,0x41,0x8C,0x44,0xCA,0x06,0x50,0x76,0xA5,0xB3,0x79, + + 0x2A,0x02,0x9A,0xDE,0x40,0x29,0x54,0x8B,0xA7,0xB9,0x3E,0x69,0x88,0x4B,0xBA,0x74, + + 0x4E,0x56,0x60,0x2F,0x71,0xB6,0x3E,0xD8,0xCD,0x59,0xDB,0xBA,0x5B,0x6B,0x03,0x5A, + + 0xA6,0x81,0xE5,0xFC,0xAC,0x21,0xF3,0xAA,0xD3,0x41,0x14,0x9B,0x5E,0x6C,0x73,0x82, + + 0x00,0xF6,0x13,0xFF,0x99,0x86,0x1D,0x8A,0xF5,0x6F,0x40,0x18,0x7C,0x14,0x73,0xB5, + + 0xE7,0xBD,0x59,0xDD,0x22,0xA6,0x89,0xEE,0x42,0x18,0xB6,0x1B,0xF2,0x89,0x54,0x77, + + 0x4C,0x12,0x94,0x66,0xEA,0x2E,0xC9,0xD7,0xB3,0x5E,0x82,0x39,0x3C,0xEF,0x29,0xB1, + + 0xAF,0x4F,0x62,0x30,0xFE,0x51,0xD0,0xC2,0x12,0x9D,0x5C,0x8D,0x72,0x13,0x73,0x7B, + + 0x89,0xAD,0x14,0xAC,0xA3,0xED,0xBB,0xFB,0xF7,0x8D,0x9D,0xDE,0x20,0x62,0xC8,0xF1, + + 0x50,0x36,0xE4,0x23,0x95,0x1F,0xF4,0x22,0x9A,0x7D,0x62,0xB9,0x46,0x5D,0x7A,0xD2, + + 0x71,0x3C,0xFC,0x12,0x37,0xBB,0xAD,0x50,0x63,0xD3,0xEA,0xD6,0x79,0x5A,0xF7,0xF0, + + 0xDC,0x34,0x32,0xA0,0x15,0x1D,0x20,0x41,0x48,0x7F,0x67,0x77,0x74,0x5A,0xFF,0xA2, + + 0x83,0x3C,0x95,0x64,0x9F,0xD6,0x12,0xC0,0xD9,0xDC,0xAC,0x48,0x1C,0xE2,0x9B,0x85, + + 0xCF,0x87,0x43,0xFA,0xE6,0x45,0x7E,0xCD,0x12,0x81,0xA0,0x1C,0x8D,0x2B,0x0A,0x63, + + 0x26,0xA4,0x2C,0x57,0x5A,0xD0,0x69,0xCD,0x51,0x00,0xC4,0xCB,0x88,0xFB,0x03,0x77, + + 0x4F,0x75,0xC2,0x67,0x2A,0x95,0x62,0xD8,0xD2,0x43,0x35,0x66,0x52,0xF8,0x53,0xFB, + + 0x18,0x42,0x59,0xB5,0x00,0xD2,0x28,0x77,0xBA,0x22,0xC5,0x4B,0xF1,0xD5,0xB7,0xF9, + + 0x46,0x3B,0x9E,0x7D,0x1A,0xFA,0x82,0xD9,0x1C,0xD7,0xC9,0x56,0x7C,0x94,0x29,0xDD, + + 0xC4,0x5A,0x7A,0xB9,0x9C,0x16,0x47,0xDC,0xE0,0xBB,0xEB,0x24,0x7E,0x5B,0x73,0x78, + + 0x94,0x9E,0xE7,0x81,0x1D,0x15,0x6D,0xF9,0x84,0x3B,0x89,0x03,0x26,0x57,0x49,0x3F, + + 0x46,0xCA,0xFD,0x1B,0xBF,0x59,0xC0,0x3F,0xE7,0xCA,0x81,0x13,0x09,0xC8,0x33,0xF5, + + 0x18,0x23,0xDE,0x21,0x38,0x9E,0xD5,0xC3,0xB2,0x8D,0x68,0x0C,0xD2,0x01,0xBF,0x29, + + 0x19,0x40,0xD6,0xF3,0xC0,0x60,0x2C,0xAA,0xD3,0xDE,0x2A,0xDA,0x7F,0xFD,0xA7,0x4F, + + 0xF6,0x3F,0x79,0xAD,0x49,0xDB,0x51,0x4E,0xE3,0x7A,0x8F,0xD1,0xD8,0x0B,0x39,0x72, + + 0x44,0xAC,0x3E,0x21,0x67,0xFB,0xCE,0xC6,0x17,0x4E,0xFF,0xFF,0xA6,0x17,0x59,0xEB, + + 0xA5,0x5F,0x00,0x8C,0xB5,0x2B,0x68,0x07,0xB9,0x4F,0x14,0xE4,0x5C,0xA0,0x48,0xE8, + + 0xBD,0xFA,0x48,0xF4,0x11,0x00,0x4A,0x31,0xAA,0x30,0x70,0x1D,0xB0,0x7A,0x00,0x67, + + 0x3F,0xB9,0x80,0x81,0x99,0x43,0xAE,0x11,0xCC,0x9F,0xB1,0xA0,0x57,0x03,0x30,0xED, + + 0x79,0x43,0xEC,0xFD,0x2A,0x6E,0xC6,0x31,0xB6,0x4C,0xFC,0xC3,0x5C,0x78,0x3E,0x79, + + 0xE9,0x95,0xDC,0xBB,0xF9,0x95,0x28,0x02,0x02,0x4B,0x50,0x75,0x6E,0x08,0x93,0x53, + + 0x7C,0x09,0x08,0x55,0x6D,0xA8,0xB9,0x12,0x03,0x4A,0xBA,0x74,0x52,0xC8,0x3F,0x6C, + + 0x69,0x57,0x3E,0xC1,0xF9,0x30,0x09,0x75,0x40,0x1A,0xB3,0x68,0x3B,0x17,0x7E,0x38, + + 0x73,0x1E,0xB7,0x78,0x78,0xB6,0x86,0x71,0xB4,0x43,0xC5,0x8A,0xD5,0xCC,0x4A,0xF3, + + 0x3B,0x37,0x79,0x04,0xBD,0x97,0xD2,0xEC,0x43,0xE3,0x29,0x4A,0x9A,0x48,0xB2,0xEB, + + 0x23,0x67,0xCD,0xFC,0x11,0xBB,0x5A,0xC9,0x3D,0x46,0xEA,0xB8,0x7A,0x2B,0xBB,0xFA, + + 0xAA,0x1A,0xA8,0x73,0x49,0x97,0x00,0x06,0xA3,0xFB,0xDB,0x28,0xDE,0xC1,0x52,0x66, + + 0x2C,0x8D,0xB4,0x2C,0x38,0xD4,0x45,0x04,0xC9,0xE6,0x0B,0x7B,0x25,0x6D,0x82,0x88, + + 0x1F,0xF8,0x02,0xBD,0x7C,0x21,0x92,0xAC,0x41,0x4A,0x9A,0xE8,0x31,0x7D,0xDF,0x42, + + 0x3F,0xD0,0xD9,0x2F,0x6B,0x26,0x69,0x64,0xE8,0x4B,0xE4,0x44,0x78,0x2D,0x54,0x57, + + 0xFA,0xBA,0xB1,0xB2,0x98,0x8E,0xFA,0xE7,0x6B,0x48,0xEC,0x8F,0x92,0xFF,0x63,0x3B, + + 0x76,0x03,0x4B,0x4C,0xA7,0x24,0xF2,0xF6,0x6A,0x49,0xDD,0x50,0xF8,0xEF,0x45,0xE6, + + 0x42,0x10,0x21,0x66,0x36,0x70,0x4E,0xA1,0x0A,0x81,0x07,0xD6,0xD3,0x0B,0xB4,0x6B, + + 0xC8,0x32,0x27,0xD3,0x02,0xCC,0x3C,0x63,0x45,0x3D,0x63,0x48,0xE3,0x33,0xFD,0xE7, + + 0x53,0x02,0xCD,0xFE,0xE1,0x39,0x6B,0x9D,0xAA,0x23,0x94,0x5E,0x83,0x7E,0x1B,0xF3, + + 0x5E,0xBE,0x35,0x07,0xF9,0x21,0x44,0xCF,0x44,0xD5,0x99,0x08,0x8A,0x63,0x64,0xE0, + + 0x41,0x41,0xBE,0xA4,0x26,0xC9,0x74,0xA0,0xC3,0xD3,0x6F,0x76,0x72,0x7E,0x34,0xF7, + + 0xD6,0x1A,0xD4,0xD1,0x58,0x84,0x5E,0x72,0xFE,0x9E,0xE6,0x16,0x98,0x04,0x3D,0xE6, + + 0xC1,0xBC,0xDA,0x25,0xBA,0xEB,0x81,0x0A,0xE4,0x9C,0x04,0x61,0x99,0xDE,0xF9,0xAE, + + 0x00,0x72,0xC9,0xA6,0xCB,0x3E,0x65,0x81,0xC9,0x5E,0xA3,0xCD,0xF5,0xDC,0x56,0x2D, + + 0x2E,0xB3,0x3E,0x1E,0x38,0x30,0x12,0x68,0x64,0x1A,0xCD,0xAC,0x07,0x78,0x31,0x7A, + + 0xC0,0x3A,0x71,0x67,0x0A,0xD6,0xB6,0x89,0xEE,0x38,0xC5,0xC3,0x2C,0x70,0x0D,0xF3, + + 0x0B,0x7F,0x8D,0x65,0x66,0xF7,0x49,0x0B,0x6D,0x9B,0x4C,0xEF,0xFE,0x32,0x1D,0x98, + + 0x52,0x96,0x37,0x06,0xDA,0x3F,0xF7,0x90,0x08,0x40,0x9E,0x3F,0xF0,0x96,0xFD,0x2A, + + 0x86,0xE1,0x91,0x48,0x1D,0xF5,0xD6,0x89,0xDA,0xE3,0x04,0x9E,0xD9,0xDC,0x5E,0x24, + + 0xAB,0x5F,0x90,0xF4,0xC2,0x32,0x9E,0x28,0x24,0xA0,0x5E,0xED,0x47,0x76,0x3F,0x30, + + 0xEE,0xE5,0x07,0x3C,0xB9,0x7C,0x88,0x13,0x9D,0xA9,0xC4,0x9E,0x8A,0x75,0x05,0x0C, + + 0x56,0x90,0xC9,0xE5,0x52,0xAE,0x47,0xFC,0x80,0x8E,0xDD,0x8E,0xC7,0xF6,0x30,0x8A, + + 0xA1,0x06,0x9B,0xA3,0xE3,0x0D,0xA5,0x42,0x28,0x4D,0xBC,0x21,0xF5,0x68,0x81,0x90, + + 0xC0,0x27,0x96,0x3F,0x63,0x0E,0xAB,0x0D,0x3D,0x14,0xB1,0x44,0xF6,0xE7,0xAA,0x43, + + 0x80,0xA2,0x30,0x3A,0x7F,0xE6,0xCC,0x18,0xB8,0x57,0xB0,0xC5,0x56,0xEA,0x11,0xD4, + + 0x47,0x63,0x0D,0x75,0x31,0x4E,0x2A,0xB7,0xD0,0x3F,0xB1,0x90,0x76,0xE5,0x58,0x7C, + + 0x37,0x71,0xE2,0x35,0x2A,0x2D,0x43,0x7F,0xE5,0xBF,0xCE,0x4B,0x37,0xC4,0xC1,0x2C, + + 0x92,0x08,0xFB,0xB6,0x57,0x08,0x58,0x8F,0x13,0x1E,0x98,0x39,0x30,0xE8,0x7C,0x0C, + + 0x7B,0xFA,0xE5,0xA7,0x2F,0x0B,0xF1,0x9A,0x31,0x5D,0xA9,0x08,0x56,0x95,0x14,0xB9, + + 0x04,0x8A,0x7C,0x27,0x9F,0xAC,0x4A,0x77,0xD2,0x3B,0xE3,0xC2,0xF4,0x1F,0x2A,0x0E, + + 0x04,0xD4,0x66,0xE0,0xB0,0xA5,0x08,0x1B,0x34,0x67,0xBA,0x63,0x3F,0xA8,0x28,0xF8, + + 0x3E,0x74,0x92,0xE1,0xEC,0xCA,0x29,0xC9,0x3D,0x44,0xF8,0xDC,0xDF,0xA1,0x43,0x5D, + + 0x46,0x87,0x67,0xE0,0x65,0x0B,0x24,0xDB,0xC4,0x69,0xCB,0xAD,0xDD,0xB2,0x93,0x2B, + + 0x85,0xC4,0x6B,0xEE,0xDC,0xF6,0x2D,0x06,0x26,0x3A,0x2C,0xDD,0x5F,0xA3,0x9D,0x88, + + 0xAF,0x53,0xA7,0xCC,0xDB,0x21,0x48,0x99,0x7A,0x67,0x32,0x9F,0xDE,0xE4,0x7D,0x44, + + 0x7F,0x39,0x15,0x6E,0x1D,0xEF,0x72,0x8A,0x69,0xC2,0x3A,0x8F,0xF7,0xE5,0xA3,0x4E, + + 0x5A,0x7A,0xDB,0xB1,0x32,0xA3,0xE0,0xBA,0x4C,0xCA,0x77,0x9E,0xAA,0xBB,0xFE,0x41, + + 0xBB,0x89,0xB5,0x17,0x3E,0x10,0xBB,0xAF,0x8F,0xC9,0x73,0x00,0x1D,0x9F,0x72,0x22, + + 0xD7,0x6B,0xDA,0x64,0x26,0xFD,0x51,0x54,0x62,0xF8,0xEE,0x5C,0xD7,0xF4,0x64,0xDE, + + 0xA8,0x1C,0xE4,0xAB,0xC8,0xDD,0xBC,0x52,0x63,0x7A,0xDC,0xF6,0x7B,0xFC,0x65,0x7F, + + 0x18,0xD0,0xBF,0x85,0x7E,0xBD,0xA1,0x27,0xC7,0xD2,0x4E,0x23,0xBF,0x5C,0xCA,0x68, + + 0x44,0x45,0x69,0x68,0x38,0xA8,0x28,0x88,0x8E,0x82,0xF7,0x08,0x56,0xFE,0x66,0x40, + + 0xA6,0x55,0xBC,0xC2,0x7E,0xC5,0xC5,0x66,0x0D,0xD0,0xF0,0x06,0xCB,0xF2,0x8E,0x56, + + 0x2F,0x66,0xF6,0xD7,0x14,0xC8,0xCD,0x76,0x0C,0xF0,0x48,0x94,0x8C,0xB7,0x1D,0xE7, + + 0xA0,0x3D,0xBD,0xD7,0x5F,0xC7,0x7D,0xE6,0x8D,0x07,0x5F,0x95,0x57,0x69,0x0D,0xE9, + + 0xF3,0x9A,0xD7,0x24,0x8B,0x18,0x35,0xF7,0xCE,0x28,0xA3,0x16,0xC8,0xD7,0x5D,0xF9, + + 0x06,0x39,0xDA,0xE8,0xE2,0xAA,0x0F,0xEC,0x00,0xDE,0xFC,0x71,0xDF,0xFE,0xFA,0x64, + + 0x4E,0xDB,0xD6,0x5E,0x6B,0xA2,0x80,0xBE,0x45,0x4F,0x40,0x5C,0xDC,0x71,0x1F,0x74, + + 0x45,0x99,0x1F,0xFF,0x3C,0x1C,0x17,0xD7,0x4D,0xD9,0xBB,0xA8,0x5D,0x70,0xEF,0x6A, + + 0xE0,0x06,0xCA,0xE9,0x30,0x3D,0x66,0xC4,0x48,0xD0,0xBD,0x5D,0xD9,0x76,0x9D,0xED, + + 0x8F,0x07,0xF5,0xBD,0x4E,0xFE,0xC9,0x78,0x72,0x01,0x36,0xA2,0xA3,0xFA,0x55,0x66, + + 0xAD,0xC1,0x2E,0x92,0xE2,0x1D,0x62,0x05,0x86,0x0C,0xA0,0x87,0x9E,0x82,0x67,0xFB, + + 0xAE,0x61,0xB9,0xB6,0x5F,0xC1,0x15,0xEB,0xEF,0x9E,0x5D,0x9C,0x5F,0xBC,0x8E,0x39, + + 0x03,0x62,0xFC,0xAC,0xCF,0xB4,0x65,0x2A,0xCE,0x9F,0x3F,0xB3,0x22,0xBD,0xCA,0x10, + + 0x82,0x04,0x98,0x89,0x70,0x30,0xCD,0x21,0x46,0x18,0xF0,0x9B,0xA3,0x6D,0x68,0x12, + + 0x00,0x8A,0x52,0xE4,0x3B,0x25,0x8D,0xD0,0x45,0xE1,0x32,0x46,0xA4,0x6E,0x8B,0x72, + + 0xF4,0x0D,0xD9,0x89,0x12,0x5E,0xBE,0x30,0xFC,0xEF,0x6E,0xD9,0xD0,0x64,0x5B,0x95, + + 0xEA,0xCA,0x08,0x91,0xF2,0x0F,0x88,0x76,0x03,0x33,0x2D,0x4A,0x72,0x0D,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xDD,0xE6, + + 0x0E,0x62,0xA2,0x10,0x9A,0x54,0x2C,0x04,0x8A,0x48,0xF0,0x20,0xAD,0xEE,0x6A,0x1A, + + 0x08,0x04,0x4A,0xF8,0xBB,0x2D,0x12,0xC8,0x2B,0x46,0x47,0x1C,0x22,0x6B,0xBE,0x8D, + + 0xCF,0x8A,0x59,0xFD,0xF6,0x25,0x1B,0x16,0x4A,0x4E,0x93,0x09,0xA7,0x6A,0x13,0x98, + + 0xC1,0x9A,0x0F,0x99,0xFA,0x28,0x21,0xCA,0xFD,0xE4,0xC0,0x12,0xAE,0x6F,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x95,0x80, + + 0x4B,0x61,0x7B,0xF7,0x0C,0xE3,0x84,0x24,0x27,0xD0,0x94,0xA4,0x70,0x70,0x32,0xBD, + + 0xD6,0x9C,0xF2,0x92,0x52,0x44,0x3C,0xF0,0x02,0xD2,0x9C,0xB4,0x71,0x71,0x01,0x05, + + 0xE7,0x92,0x7E,0x75,0xB2,0xC3,0xD5,0x45,0x85,0x54,0x95,0xA5,0xF0,0x72,0x1F,0x11, + + 0x5E,0xCE,0x5E,0x66,0x3D,0x72,0x65,0xC3,0x0A,0x02,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x54,0xA7, + + 0xDF,0x95,0xE6,0xDA,0xD1,0x35,0x68,0x85,0x17,0x07,0x96,0xAC,0x78,0x78,0xB1,0xF8, + + 0x1D,0xB4,0xB6,0x66,0x95,0x34,0xD4,0xA8,0xEB,0x5D,0x9E,0xBC,0x79,0x79,0x78,0x0D, + + 0xEB,0xF0,0x78,0x0F,0x7D,0xB7,0xD7,0x6C,0x55,0x18,0x97,0xAD,0xF8,0x7A,0x9A,0x64, + + 0xA9,0xC4,0x9D,0x1D,0x52,0x7F,0x17,0xDB,0xC8,0x79,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x1E,0x3A, + + 0x27,0xC0,0x9A,0xF5,0x75,0xA6,0xA5,0xDF,0xF3,0x82,0x20,0xA4,0x91,0x6D,0x40,0x61, + + 0x39,0x07,0xF2,0xEC,0x7D,0x30,0x3A,0xB0,0xC5,0xC9,0x47,0xF1,0x97,0xE1,0x27,0x2E, + + 0x09,0x04,0x81,0x53,0x37,0xE3,0xFD,0x4C,0xC2,0x08,0x89,0xD9,0x78,0xEF,0xAF,0x53, + + 0x2C,0xC2,0xD7,0x11,0xF6,0x54,0x01,0x53,0xCF,0x63,0x02,0xA5,0xD5,0xA2,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xE2,0xDE, + + 0x4C,0x8E,0xF4,0x23,0xF7,0xCC,0xA7,0x59,0x70,0xC3,0xB3,0x48,0x3C,0xE8,0x52,0x9E, + + 0x66,0x4F,0x94,0x7C,0x62,0xA9,0x58,0xF8,0xA4,0x98,0xBE,0xD8,0x79,0xE9,0x03,0x4B, + + 0xEF,0xC9,0x9B,0xF4,0x1E,0x66,0xB3,0x3A,0xF8,0xA6,0x4B,0xA7,0x79,0x69,0xEB,0x1A, + + 0xF3,0x20,0x50,0x60,0xF5,0x3A,0x59,0x2E,0xCC,0xE6,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x9B,0xB2, + + 0x26,0xD2,0xFE,0xA9,0x46,0x1F,0x32,0x8F,0x8D,0xA1,0xB4,0xA6,0x74,0xF0,0x3E,0x12, + + 0xDA,0x4C,0xD2,0xBB,0xDE,0x20,0x90,0x20,0xE6,0x7C,0xBC,0xB6,0x75,0xF1,0x7B,0xCB, + + 0x45,0x9D,0x01,0xF8,0x17,0x3F,0x6D,0xA7,0xAC,0x83,0xB5,0xA7,0xF4,0xF2,0x7F,0xBC, + + 0x52,0x4E,0x3D,0x6E,0xB5,0x2C,0xAC,0x21,0xA9,0xDB,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x0E,0xE8, + + 0xC5,0xE9,0x99,0xBE,0x3E,0x47,0x0A,0x8E,0x07,0x51,0xB6,0xAE,0x7C,0xF8,0x51,0xE4, + + 0x4F,0x9D,0x94,0xA7,0xC6,0x24,0x26,0x3F,0x0D,0x06,0xBE,0xBE,0x7D,0xF9,0xDC,0xF9, + + 0xCC,0x9A,0x9C,0x3F,0x00,0x65,0x33,0xD4,0x8C,0xA6,0xB7,0xAF,0xFC,0xFA,0x54,0x59, + + 0x0C,0x44,0xFD,0x9D,0x4E,0xFA,0x27,0x2B,0x8D,0x04,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x2B,0xFD,0xA7,0x2C, + + 0xFD,0x06,0xD2,0x7D,0x16,0xB9,0x30,0xB0,0xA9,0x11,0x06,0x46,0xAF,0x1B,0xC8,0x18, + + 0x01,0x0B,0xB2,0xF6,0xBD,0xDC,0x9E,0x43,0x75,0x2F,0xDA,0xF8,0x57,0xF8,0x8E,0xC7, + + 0x0E,0xFD,0x62,0x81,0xAD,0x09,0xBD,0xB3,0xD2,0x4A,0x95,0xDC,0x8A,0x20,0x8D,0xEC, + + 0x7C,0x42,0xF1,0x91,0xAC,0x76,0x7B,0xAD,0xC0,0x83,0x9B,0x4A,0x72,0x67,0xA7,0x00, + + 0x0E,0xF9,0x7F,0xA6,0xFB,0x35,0x8B,0xE2,0x87,0xC7,0x6F,0x2F,0xA8,0x44,0x59,0xD2, + + 0x92,0x42,0xD3,0xE6,0xD1,0x7A,0x43,0x8F,0xA2,0xEA,0x86,0xCC,0xD9,0xBE,0x19,0x90, + + 0x63,0xA9,0x01,0x28,0x5E,0x64,0x0B,0x4F,0x61,0xED,0xD6,0x94,0xEC,0x9F,0x71,0x21, + + 0x8B,0x0C,0x72,0xC7,0x93,0x2D,0x40,0x8D,0x52,0xBC,0x5E,0x07,0x38,0xD4,0x3C,0x24, + + 0x85,0x8E,0x90,0x2F,0xF3,0x6C,0xD2,0x50,0x2B,0xCF,0x94,0xA8,0x29,0xE8,0x74,0x35, + + 0xE0,0x58,0x4A,0x64,0xCF,0x6B,0xF9,0xC8,0x4A,0x46,0x79,0x5E,0xA6,0x05,0x42,0xC9, + + 0x95,0x87,0xBD,0x0A,0xFA,0xF3,0x8F,0x21,0xCE,0x33,0xA9,0xCF,0xDE,0x13,0xF0,0xE8, + + 0x2A,0x3B,0x16,0xCC,0x78,0x69,0x3B,0x20,0xCF,0xD2,0xF9,0xEC,0x5B,0xC7,0xCB,0xCC, + + 0x7B,0x0E,0x82,0xC8,0x27,0xBB,0xEE,0x90,0xD3,0xF7,0xF2,0x70,0xA0,0x2C,0x8A,0x38, + + 0x0B,0xF9,0xB5,0xDE,0xDE,0x8E,0x62,0x97,0x4D,0x24,0x84,0xC4,0xF3,0xB6,0x79,0xAB, + + 0x76,0x1F,0xFB,0xB7,0x36,0x23,0xEF,0xEB,0x1F,0xAF,0x56,0x9C,0xE4,0x97,0x5E,0xDB, + + 0x42,0xA6,0x0B,0x25,0x23,0x27,0x66,0xFB,0x1E,0xAE,0x5C,0x8C,0xA1,0x6C,0x1F,0x17, + + 0xC2,0x00,0xD2,0xC3,0x3E,0xEF,0x50,0xE0,0x6A,0xFD,0x78,0x3A,0x71,0x12,0x74,0x99, + + 0xC1,0x90,0x24,0x10,0x0C,0xA2,0x9C,0x91,0xEB,0xFC,0x94,0xA1,0x98,0x20,0x6B,0xF2, + + 0x94,0xB9,0x3A,0x00,0x32,0xC7,0x84,0x33,0xF2,0x58,0xAB,0x89,0x32,0x60,0x31,0x62, + + 0x25,0x9E,0x36,0x77,0x1D,0xCE,0x8C,0x76,0x23,0x81,0x71,0x27,0xA7,0x7B,0x5F,0xC8, + + 0x83,0x78,0xDD,0xB7,0x03,0x5A,0x34,0xB3,0x9A,0x59,0x01,0x5C,0x99,0x10,0x5D,0xA8, + + 0xCA,0x0C,0xF2,0xAC,0x35,0x4C,0x24,0x74,0x5E,0xC2,0x70,0x6F,0x70,0x35,0xA2,0x01, + + 0xAE,0xB2,0xA7,0xC4,0xB3,0xA4,0x27,0xE0,0xB6,0xDB,0xEF,0x62,0x09,0x4B,0x3F,0xD0, + + 0xAF,0xB3,0x6B,0xB7,0x44,0x52,0x07,0xFC,0x40,0x32,0x7A,0x59,0xAF,0x73,0x54,0xF0, + + 0xC3,0x7C,0xFE,0x0E,0x9A,0xAC,0x1E,0xAC,0x40,0x7E,0x14,0x28,0x09,0xF3,0x6E,0x3B, + + 0x7E,0x16,0x75,0xBB,0x98,0xC6,0x5F,0xCB,0x5D,0x53,0xB0,0xCD,0x1A,0x59,0x3D,0x0E, + + 0xEB,0xEA,0x47,0xF5,0xE7,0x37,0x29,0x85,0x65,0xDC,0xE5,0xC8,0xE0,0x7C,0x6F,0xCA, + + 0x15,0x90,0xB1,0xA5,0xBF,0x42,0xDB,0x48,0x4A,0x6B,0xE7,0x82,0xCD,0x3A,0x57,0xB0, + + 0x62,0x0D,0xFE,0x33,0xD3,0x2D,0x0C,0x42,0xC9,0x75,0xBA,0x9F,0x08,0xAD,0x5E,0x98, + + 0xDF,0x90,0xB5,0xFB,0x9A,0x51,0x66,0x17,0x10,0x49,0xE3,0x3B,0xA5,0x75,0x79,0xE1, + + 0x27,0x98,0x07,0xA0,0x76,0x33,0x8B,0x6B,0x23,0x2B,0x17,0x95,0x44,0x81,0x31,0xA5, + + 0x29,0xB3,0x28,0xA7,0x6D,0x35,0x04,0x5B,0x94,0x53,0x5F,0xE3,0xCD,0xD2,0xE0,0x6F, + + 0xF8,0xC2,0xBB,0x95,0xF6,0x50,0xBD,0x50,0xFB,0x82,0x83,0x66,0x1C,0x6B,0x5C,0xD2, + + 0x03,0xF8,0x96,0x3B,0x7D,0xAC,0xDB,0x4D,0xE6,0x83,0xE2,0x02,0xF6,0xE7,0x3A,0x76, + + 0x45,0x84,0x49,0x75,0x7F,0xD3,0x73,0xEF,0xC2,0xBB,0x20,0xC5,0x54,0x82,0x90,0x6C, + + 0x26,0x28,0xD7,0x2F,0x17,0x56,0xA4,0xAD,0x64,0x3C,0x97,0x19,0x74,0x3C,0x58,0x22, + + 0x7A,0x29,0xA1,0x81,0xEB,0x22,0x48,0xF2,0xBD,0x3F,0xCA,0x99,0xAB,0x88,0x7D,0x43, + + 0x36,0x28,0xE0,0x06,0x11,0xDC,0x66,0x83,0xA6,0x6A,0xAB,0x4B,0x51,0x7C,0x74,0x33, + + 0x7B,0x8F,0x18,0x39,0x54,0xA6,0x58,0x9F,0x20,0x84,0x12,0xA7,0xE2,0x4B,0x70,0x94, + + 0x45,0xA7,0x9A,0x35,0x60,0xC2,0x68,0xF7,0xB6,0xC5,0x0C,0x8C,0x6E,0x8B,0x5A,0x03, + + 0xF9,0xCA,0x88,0x8A,0x21,0x5B,0x52,0x79,0xF8,0xC5,0x0D,0x69,0x8A,0xE0,0xB4,0x98, + + 0xA7,0xA3,0xCA,0x21,0x9C,0xEB,0x72,0x3E,0x65,0xC4,0x82,0xC1,0xDF,0x45,0xBE,0x34, + + 0x8A,0x13,0x9B,0xF1,0x30,0xA7,0xC8,0x54,0x41,0x1C,0x26,0xAB,0xAD,0x6A,0xEB,0x76, + + 0x38,0xC9,0x36,0xA7,0x9B,0x32,0x05,0x17,0x42,0x4D,0x88,0x5D,0x2A,0x16,0x6A,0xC2, + + 0x6D,0x95,0xDA,0x09,0xDC,0x25,0x48,0x88,0xB2,0xDD,0x95,0x2E,0x40,0x11,0x6B,0x38, + + 0xF0,0x06,0xBC,0xDA,0x6E,0xAF,0x6F,0x09,0x77,0x4A,0x2E,0x84,0xB6,0x7E,0x75,0x33, + + 0x88,0x17,0x58,0xDD,0x9E,0xA4,0xB3,0x07,0x7F,0x3A,0xE1,0x6E,0x25,0x63,0x72,0x6A, + + 0xBF,0xCD,0xB1,0x5E,0x3C,0x0F,0x86,0x7F,0x4F,0xFF,0xEC,0x8C,0x5B,0x42,0x64,0x60, + + 0xCD,0x49,0x6C,0x02,0x45,0x13,0x06,0x92,0xFF,0x7F,0x6B,0xD9,0x50,0x5B,0xEC,0xEA, + + 0x46,0x16,0x68,0x69,0xB7,0xB6,0x42,0xB5,0x84,0xB7,0x43,0x34,0xB0,0x72,0x3F,0x82, + + 0x85,0x22,0x09,0x02,0x43,0x4F,0x95,0xD1,0x86,0x4B,0x7A,0xA6,0x9F,0x6B,0xB2,0x86, + + 0xA3,0xEA,0x0C,0x13,0xC4,0x49,0x43,0x8B,0x65,0x53,0xE7,0x66,0x56,0x7E,0x7A,0xA0, + + 0x07,0xD4,0x60,0xD5,0x06,0x2D,0xAF,0xDD,0x60,0xBD,0x25,0x17,0xD5,0x94,0xB3,0xB0, + + 0x07,0x78,0x6D,0xC5,0x07,0x2C,0xA3,0x70,0x10,0x32,0x6C,0xE8,0x43,0x01,0x79,0x3F, + + 0x24,0x92,0xDB,0xAF,0x54,0x96,0x48,0x67,0x97,0xFC,0xC7,0xD6,0x8C,0x09,0xED,0xB2, + + 0xD0,0x91,0xCD,0xC6,0xB1,0x2E,0xBD,0x82,0x8C,0x6C,0x68,0xED,0x87,0x43,0xC5,0xF8, + + 0x8F,0x9C,0x1D,0x0A,0x4D,0x1E,0x24,0x59,0x87,0x49,0xD6,0xFD,0x15,0xF7,0x2A,0x92, + + 0x2B,0x00,0xCE,0xCD,0x81,0x32,0xA3,0x94,0x0D,0xFE,0x13,0xDC,0x82,0xFF,0xF5,0xF8, + + 0xD9,0x1D,0xBD,0x93,0x9F,0xBD,0x0D,0x58,0xD0,0x98,0xC9,0xC7,0x7E,0x16,0x75,0x29, + + 0xD0,0xDB,0xE8,0x7D,0x3F,0x67,0x41,0xBD,0x04,0xBF,0x96,0x09,0x5C,0x95,0xC8,0xA9, + + 0x8F,0x63,0xA6,0xBC,0x9D,0x1C,0x16,0x12,0x80,0x27,0xE1,0xE1,0x0A,0xFA,0x82,0x45, + + 0x2E,0x3D,0x8C,0xD2,0x3C,0xFD,0x67,0xFA,0x69,0xA4,0x88,0xFE,0x7F,0xFD,0x07,0x81, + + 0x48,0x93,0xF6,0xBC,0x8E,0xD2,0x5E,0x17,0x08,0x9C,0xD9,0x4F,0xF8,0x5E,0xD0,0xBB, + + 0xAB,0xB6,0xE3,0xE4,0x9B,0x83,0x0C,0x85,0x4C,0xBA,0xFF,0x8D,0x14,0x0E,0x3E,0x3C, + + 0x42,0xFF,0xA0,0xC4,0x1D,0x62,0x87,0xA4,0x7D,0xBD,0xEE,0x19,0xBB,0xB1,0x00,0x14, + + 0xA9,0x8A,0xFA,0xE4,0xF3,0xD7,0x67,0x77,0xBC,0xF7,0x57,0xBE,0xB0,0x9E,0x3F,0x3C, + + 0x0D,0xF4,0x1C,0x54,0x96,0xBB,0x29,0xDB,0x6C,0x4F,0x4C,0x6F,0x2B,0x20,0x2F,0x3C, + + 0x05,0xA7,0x76,0x67,0x47,0x27,0xA2,0xAB,0xC0,0xE3,0x62,0xCE,0x22,0x21,0x80,0x38, + + 0x7E,0xD9,0xA0,0x0E,0xB4,0x29,0xE9,0x90,0x1F,0xE5,0xD0,0x64,0x52,0x64,0xE4,0x23, + + 0x25,0xA3,0x77,0x93,0xD1,0x25,0x0A,0xD3,0xA8,0x21,0xD8,0x74,0x53,0x65,0x39,0x66, + + 0x7F,0x09,0x3A,0x38,0xB3,0xE6,0xC4,0x92,0x46,0xCB,0xD1,0x65,0xD2,0x66,0x9D,0x96, + + 0x41,0x27,0x81,0x59,0x66,0xA0,0xE6,0x93,0xC5,0x3E,0xD9,0x75,0xD3,0x67,0x93,0x0F, + + 0xE1,0xF9,0x91,0xCB,0xF1,0xAB,0x4C,0x99,0x40,0x4C,0x89,0x7F,0xD5,0x2A,0x11,0xA4, + + 0x0F,0x70,0xD4,0xFE,0x1D,0x84,0xA9,0x98,0xB5,0x6A,0xB6,0xF9,0xB8,0xC6,0xC3,0x64, + + 0x9D,0x48,0x99,0x0F,0x5A,0x2E,0x97,0xD8,0xA2,0xB5,0x95,0x34,0xFB,0x2A,0x97,0x6A, + + 0xB5,0xFA,0x1C,0x9F,0x3F,0x39,0x40,0x39,0xB2,0xC9,0x4F,0xCE,0xA1,0xC6,0x4A,0x61, + + 0xE3,0x6F,0xC6,0x45,0xE7,0x42,0x49,0xEC,0x3B,0x37,0xD2,0x6C,0x5A,0x6C,0x2C,0xFC, + + 0x08,0xFF,0x15,0xA7,0x3F,0xA0,0x41,0x72,0x03,0x3C,0xDA,0x7C,0x5B,0x6D,0x41,0xB6, + + 0x77,0x62,0xA1,0x4C,0x9B,0x4E,0x93,0x04,0xC9,0x0C,0xD3,0x6D,0xDA,0x6E,0x8B,0x21, + + 0x98,0xA2,0xB5,0x70,0x72,0x5E,0x7B,0x2A,0xEF,0xC2,0xDB,0x7D,0xDB,0x6F,0x1F,0x18, + + 0x26,0xCA,0x8A,0xFA,0x93,0x55,0x72,0x01,0x89,0x13,0xC2,0x99,0x9B,0x81,0xD8,0x14, + + 0x50,0x79,0x3B,0x35,0xC1,0x72,0xAB,0x15,0x12,0x51,0x0F,0xC6,0x0E,0xF8,0x40,0x9F, + + 0x86,0xE6,0x3A,0x67,0x44,0x31,0x73,0x01,0x14,0x11,0xAE,0x14,0x84,0xDD,0xCD,0xFC, + + 0x8C,0xBE,0xBA,0x30,0xB7,0x19,0x55,0xBD,0x9A,0xDA,0x66,0x9A,0xDB,0x26,0x70,0x5F, + + 0x24,0x8D,0x3B,0xB6,0x1C,0xEB,0x48,0x92,0x99,0xAF,0xD4,0xE4,0x72,0x74,0xB3,0xF7, + + 0x82,0x57,0x6C,0x24,0x8F,0xE6,0x97,0xA0,0x9E,0x5C,0xDC,0xF4,0x73,0x75,0x0C,0xE6, + + 0x0E,0x1B,0x9F,0x30,0xCE,0x99,0x0F,0x1D,0x5E,0x14,0xD5,0xE5,0xF2,0x76,0x56,0x19, + + 0x7E,0x18,0xB3,0xD2,0x12,0xC8,0x58,0xE0,0xDF,0xFA,0xDD,0xF5,0xF3,0x77,0x93,0xB5, + + 0xC3,0x5C,0x4C,0x92,0x0A,0xCC,0xD6,0xC5,0xFD,0xF3,0xC6,0x87,0x04,0x6D,0xAA,0xFA, + + 0xDA,0x7C,0x95,0xA4,0xD0,0x2A,0x41,0xB4,0x6F,0x20,0x5E,0xC4,0xB0,0x3B,0x39,0xA5, + + 0xDE,0xB5,0xD2,0xFE,0xC4,0x78,0xC1,0xA8,0x68,0x4A,0x04,0x29,0xF4,0x75,0x37,0x62, + + 0x61,0x6A,0xF7,0xBA,0x50,0x08,0xB6,0x48,0x87,0x1B,0x9D,0x50,0x25,0x38,0xF2,0xB7, + + 0x89,0x5D,0x98,0x2E,0x3E,0x91,0xC3,0xAF,0xA8,0x3C,0xD6,0xEC,0x7A,0x7C,0x55,0x35, + + 0xA9,0x1A,0xF4,0x3E,0x97,0xC0,0xF2,0x6A,0x67,0x55,0xDE,0xFC,0x7B,0x7D,0x27,0xF6, + + 0x2B,0x5C,0x52,0x49,0x87,0x94,0x5F,0x22,0x03,0x2F,0xD7,0xED,0xFA,0x7E,0x6E,0x5D, + + 0xDA,0x0B,0xB7,0xCC,0x87,0x3B,0xDB,0x04,0x54,0x1E,0xDF,0xFD,0xFB,0x7F,0x5E,0x04, + + 0xED,0xD1,0xE8,0x1A,0x12,0x00,0xF0,0x26,0xD9,0xAE,0xA7,0x61,0x9E,0x71,0xE3,0x9B, + + 0xD1,0x82,0x90,0x26,0xF7,0x5E,0xE8,0xAC,0x46,0x01,0x86,0x0F,0x53,0x78,0xE1,0x7B, + + 0xA8,0xC0,0x5E,0x65,0x63,0xC7,0x0F,0x86,0x1A,0x6F,0xB9,0x23,0x5D,0xAA,0x8E,0xB2, + + 0x4D,0x32,0x93,0xAB,0x15,0x13,0x07,0x92,0x8C,0xC0,0xAA,0x55,0x22,0x86,0xB0,0xC6, + + 0x77,0xAD,0x4C,0xD5,0x66,0xAE,0x0E,0x5A,0xBB,0x45,0xF0,0x66,0x56,0xE4,0x17,0xD6, + + 0x76,0x9F,0x7D,0xA5,0x93,0x28,0xEB,0x72,0xAC,0x74,0xF8,0x76,0x57,0xE5,0x59,0xB9, + + 0x2A,0x8B,0xB2,0xB7,0xF9,0x07,0x75,0x9C,0x3B,0x6D,0xF1,0x67,0xD6,0xE6,0x37,0xB1, + + 0x83,0x7A,0xBB,0x78,0x7C,0xC3,0x43,0x80,0xFB,0x4A,0xF9,0x77,0xD7,0xE7,0x82,0x19, + + 0x7C,0xEC,0x62,0x1F,0xE3,0xEA,0x6A,0x27,0x4A,0xB1,0x8A,0xD1,0xBD,0x77,0xF5,0x9E, + + 0x7C,0x5A,0x4D,0xE1,0x7E,0x89,0x60,0xF6,0xEE,0xCD,0xC4,0x9F,0xB4,0xEA,0x1D,0x36, + + 0x8A,0xF3,0xB8,0xBD,0xFF,0xB3,0x3D,0x59,0x6F,0xAF,0xCC,0x5C,0xF6,0x1B,0xEB,0x76, + + 0xA0,0xC9,0x48,0xE1,0x9B,0xD2,0x6D,0xFC,0x24,0xA8,0x68,0xCC,0xFF,0x56,0xA2,0x5B, + + 0xF1,0x11,0xDA,0xB1,0xF7,0xDD,0x64,0x56,0xB1,0x61,0xF2,0x6E,0x5E,0xEC,0xED,0x58, + + 0x90,0x29,0x92,0x79,0xE2,0xA2,0xA7,0x7E,0x34,0x46,0xFA,0x7E,0x5F,0xED,0x1B,0x6C, + + 0x77,0x81,0x23,0x22,0xEB,0x23,0x64,0xDB,0x4E,0x11,0xF3,0x6F,0xDE,0xEE,0xBB,0xFE, + + 0xC7,0x3E,0xD5,0x67,0xF7,0xDE,0x20,0x54,0xC9,0xEF,0xFB,0x7F,0xDF,0xEF,0x84,0x91, + + 0x10,0xF4,0xDC,0x02,0x45,0x1C,0x03,0x17,0x98,0x13,0x8A,0x02,0xFB,0x76,0x4D,0x16, + + 0x54,0xA4,0x28,0xF1,0xB7,0x1D,0xA1,0xE3,0x84,0xDE,0x6C,0x26,0x8A,0xF5,0x1B,0xBE, + + 0xA2,0xEB,0x9F,0x7D,0x4F,0xF0,0xF5,0xC6,0x9B,0x90,0xB5,0xE7,0xB0,0x5F,0x25,0x82, + + 0xCE,0x10,0xFD,0x13,0xFD,0x05,0x89,0xCC,0x46,0x5E,0x3D,0x88,0xD3,0x07,0x3A,0xEF, + + 0x2E,0x92,0x93,0xF9,0x46,0xF5,0x14,0xCD,0x01,0xD9,0xF4,0xE6,0x76,0xF4,0x52,0xFF, + + 0xAA,0x63,0x53,0x44,0xD5,0x68,0x0E,0x0D,0x6B,0x2E,0xFC,0xF6,0x77,0xF5,0x4B,0xEC, + + 0x07,0x69,0x25,0x1B,0xAC,0xD8,0x0B,0xDB,0x0F,0x47,0xF5,0xE7,0xF6,0xF6,0x25,0x73, + + 0xA1,0xEE,0x8F,0xD7,0xB6,0xA7,0x82,0xD7,0x0E,0x46,0xFD,0xF7,0xF7,0xF7,0x22,0x88, + + 0x20,0x33,0xA0,0xB3,0xB4,0xB8,0x48,0x1F,0xE1,0x75,0x66,0xDD,0x04,0xBA,0x6D,0x89, + + 0x55,0xDD,0x3B,0x85,0x4D,0x34,0x1E,0xFA,0x2B,0x74,0x0A,0xDC,0x82,0xBB,0x75,0x74, + + 0xAA,0x03,0x37,0x91,0x88,0x4E,0x61,0xDB,0x6C,0x5C,0x2A,0xFA,0x5D,0x25,0x09,0xA3, + + 0x21,0x36,0xD1,0x3E,0x56,0xB8,0x6D,0xCB,0x6D,0x5D,0xA4,0x77,0x14,0xB8,0x7D,0xA8, + + 0xD9,0xF9,0xBC,0xA6,0xE0,0x43,0x6E,0xFE,0xEC,0xA9,0xF6,0xEE,0x7E,0xFC,0x26,0xB8, + + 0xDC,0xF8,0x7E,0xDE,0x3F,0xBD,0xA1,0x01,0x4B,0xDB,0xFE,0xFE,0x7F,0xFD,0x5F,0x34, + + 0xA8,0xE7,0xBD,0xCE,0x68,0x61,0x2D,0x89,0xCD,0xBE,0xF7,0xEF,0xFE,0xFE,0x57,0x20, + + 0xA9,0x2E,0xEF,0xDF,0xBF,0xBF,0xCA,0x0A,0x4E,0x20,0xFF,0xFF,0xFF,0xFF,0xA3,0x2C, + + 0xDC,0x71,0x7F,0xF4,0xEF,0x2F,0x8D,0xB6,0xE1,0x9F,0x34,0x46,0xAB,0x05,0xAF,0x16, + + 0xD5,0x65,0xB6,0xB4,0xF3,0xA8,0x0F,0x36,0x89,0xD0,0xB7,0xD6,0xFD,0xDC,0x22,0x39, + + 0x58,0xB3,0x35,0xE7,0xD8,0x21,0xA5,0x43,0x3F,0xE6,0xA9,0xA7,0x15,0x19,0x31,0xEF, + + 0x2D,0x0E,0xB4,0x91,0xAC,0x45,0xBD,0xB5,0xF4,0xBD,0xE1,0x46,0xE3,0x92,0x20,0x16, + + 0xCA,0xF8,0x5D,0x57,0x71,0x04,0xFA,0x93,0xC6,0xC9,0xA8,0x60,0x56,0xC4,0x76,0x6C, + + 0x8E,0x83,0xB0,0xA9,0xAC,0x64,0x27,0xF2,0x86,0x71,0xE0,0x44,0xB0,0xCA,0x39,0x66, + + 0x7F,0x09,0xB9,0x62,0xF1,0xA9,0x07,0xD4,0xC4,0x3F,0x2E,0x16,0xE6,0xC7,0xCD,0x11, + + 0xDD,0xAA,0x09,0x21,0xD0,0xAA,0xF6,0x93,0x6F,0xBA,0x79,0x07,0xB1,0xCB,0xFD,0x13, + + 0x8C,0x9C,0xBA,0xF7,0xB4,0x25,0x72,0x07,0x1C,0x0A,0xEC,0x2A,0xB1,0x8B,0x6A,0x37, + + 0x0B,0xD4,0xF2,0x3B,0xE0,0x26,0x4C,0xC6,0x4F,0x30,0x30,0xC5,0x84,0x66,0xA7,0x8D, + + 0xBD,0xF4,0x43,0x75,0x1F,0x96,0x8E,0xBF,0xCE,0xD3,0x53,0x40,0x2B,0x6C,0x73,0x3E, + + 0x74,0x04,0x2C,0x20,0x70,0xDA,0xFF,0x47,0x6A,0x2E,0x2F,0x42,0x7A,0xCF,0xD5,0xDA, + + 0x0E,0x04,0xA2,0x1F,0xE2,0x23,0x2A,0x57,0x78,0x99,0xAC,0x6B,0x7E,0x6A,0xB1,0xDC, + + 0x36,0xF7,0xCE,0xD8,0x59,0x77,0x7C,0xC0,0x79,0xE9,0x84,0x9E,0x5F,0x2D,0x06,0x3A, + + 0xF6,0x8F,0x03,0x35,0x87,0x55,0x85,0x7A,0xF4,0xAD,0x66,0xED,0x33,0xBF,0x75,0xE1, + + 0xF7,0xA0,0x0B,0x30,0x53,0xF2,0x0E,0xD4,0x03,0x1C,0xDD,0x82,0xB8,0xC7,0xDA,0xE2, + + 0xD3,0x75,0xD6,0xC3,0xD9,0xB3,0x4A,0x18,0x52,0xFB,0xEA,0x26,0xB5,0x54,0xA1,0xF2, + + 0xD6,0x74,0xEE,0x94,0x32,0xD1,0x8F,0x23,0x47,0xAE,0xE4,0xC7,0x0D,0x1D,0x3D,0x7A, + + 0xA6,0x8B,0xE7,0x3D,0x59,0x51,0x86,0xA0,0x6D,0xFF,0x3A,0x47,0x5C,0x8F,0x35,0x6E, + + 0xA7,0xFA,0xB7,0x66,0x9F,0x9C,0x23,0x8D,0x89,0x10,0xFF,0xB1,0xF0,0x41,0xE4,0xB2, + + 0x40,0xD8,0xBC,0xC0,0x36,0x94,0x34,0xB6,0xF6,0x59,0xC6,0x42,0x99,0x30,0x2C,0x86, + + 0xB7,0x18,0x3C,0x5C,0x58,0x3A,0x79,0x92,0xA1,0x55,0x78,0xD0,0x75,0x35,0x85,0xB9, + + 0xC2,0x78,0x3A,0xB6,0xCE,0x30,0x37,0x77,0x60,0x9A,0xEF,0x55,0x3B,0xD9,0xAA,0x53, + + 0x66,0x23,0x4D,0xD1,0xFB,0xC8,0x55,0xF9,0x80,0xA8,0x70,0xAF,0x06,0xEB,0x1C,0x79, + + 0x8B,0x58,0xD4,0x8E,0x7E,0x54,0x68,0x09,0x81,0x1B,0xA8,0x91,0x18,0xA7,0xED,0x1C, + + 0x61,0xE6,0xB0,0x39,0xFB,0x39,0xCA,0x42,0x80,0x88,0x4C,0x81,0x92,0x3D,0x39,0xB4, + + 0x2A,0x8F,0xB9,0x3D,0x7A,0x60,0x05,0xA8,0x13,0xD7,0x57,0xC0,0xA7,0xD7,0xCF,0xE1, + + 0xC3,0xC4,0x87,0x90,0x50,0xB8,0xB3,0x22,0x18,0xD2,0xA1,0x0C,0xFF,0x02,0x7E,0x56, + + 0x2B,0xBC,0xF8,0xE1,0x51,0x33,0x08,0x0A,0x5F,0x1E,0xF9,0x93,0xA3,0xD1,0x36,0xC9, + + 0x09,0xB0,0x4E,0xCD,0xC4,0x90,0x7B,0x9A,0x9C,0x38,0xE0,0x5D,0x75,0xCC,0xFC,0x2B, + + 0x06,0xE3,0x47,0x4F,0x18,0x2A,0xD3,0x81,0x68,0x92,0x87,0xAA,0xF4,0xA1,0x1F,0x6B, + + 0xE7,0x21,0x58,0xED,0x44,0xC0,0x67,0x06,0xCF,0x52,0x20,0x87,0x8D,0xA0,0x40,0x2D, + + 0x06,0x8D,0x4C,0x95,0x3E,0xA8,0x8F,0xC0,0x0C,0x11,0x62,0x20,0x9C,0x43,0x1B,0x30, + + 0xD8,0x8E,0xB3,0x59,0x13,0xD8,0x22,0x72,0xCE,0x6A,0x80,0xC9,0xF9,0xEC,0xDE,0x24, + + 0x25,0x84,0x21,0x46,0xEF,0xE0,0x0F,0x1F,0x49,0x44,0x15,0xA3,0xE9,0x59,0x9D,0x6C, + + 0x26,0x38,0x4B,0x75,0x62,0xC6,0xEF,0x0D,0xAE,0xD0,0xD9,0x61,0xAA,0x1F,0xC0,0x31, + + 0x38,0xC6,0x98,0x61,0xEB,0xAB,0x23,0x71,0x2C,0xF7,0xE6,0x4A,0xBD,0xA0,0xCE,0x0D, + + 0xA4,0xE0,0x13,0x71,0xB6,0xCB,0x2E,0x6D,0x21,0x65,0x5C,0x52,0x3C,0xEA,0xFC,0xB9, + + 0x04,0x4A,0x21,0x2A,0x5E,0xAB,0x57,0xD7,0xF0,0x12,0xCB,0xD7,0x1F,0x49,0xD6,0xB1, + + 0xE4,0x78,0x8B,0x6F,0x62,0x21,0xEA,0x00,0xB3,0xAB,0x7E,0x04,0xA7,0x62,0x38,0xF7, + + 0x6D,0xCA,0x9A,0xF1,0x1A,0xD1,0x62,0xDB,0x26,0x5D,0xCA,0x09,0xA1,0xE7,0xAC,0xE9, + + 0x2B,0x22,0x92,0xE5,0x1B,0x40,0x6F,0x9D,0x26,0x9A,0x3A,0x7E,0x09,0xAB,0xEC,0x05, + + 0x71,0x0B,0x7D,0x6D,0x6F,0xCF,0x6D,0x9F,0x6C,0x61,0x8D,0x13,0x51,0x6C,0xBC,0x1A, + + 0x8B,0xF2,0xB1,0x01,0xB3,0x5F,0x0A,0xCA,0xF3,0x6C,0x26,0xF2,0xDB,0x92,0x02,0x1C, + + 0x96,0x83,0xE6,0x0E,0x5A,0xAA,0x10,0x1A,0x4D,0x8C,0xE4,0x43,0xB5,0xA8,0x3A,0x29, + + 0x2D,0x2C,0x92,0xA3,0xE2,0xEC,0x8A,0x18,0xC0,0x4B,0x5E,0x0D,0xDB,0xAC,0xD7,0xA9, + + 0x6F,0x21,0xCD,0x74,0xFD,0x8E,0x77,0x3D,0x4C,0xD2,0xC9,0xDE,0x7D,0x41,0x53,0x6B, + + 0xB0,0x20,0x14,0x2C,0xEF,0x04,0x7A,0x3B,0x81,0xA1,0xC5,0x57,0xB7,0xE2,0x7A,0x60, + + 0x20,0x3D,0xB2,0xE4,0xDF,0x33,0x14,0x48,0x07,0xD4,0xCF,0x24,0xB1,0x94,0xEC,0x83, + + 0xDA,0x4C,0x78,0x6A,0xF0,0x4A,0x38,0xC1,0x4F,0xBF,0xC4,0xC5,0x01,0x9D,0xB2,0x01, + + 0x54,0x97,0x9B,0x22,0x9A,0x1D,0x54,0x63,0xE0,0x29,0x1A,0x45,0x58,0x0F,0x55,0xB4, + + 0x58,0x9C,0x70,0x7A,0xE1,0x08,0x5F,0xC3,0xE4,0xB3,0xDF,0xB3,0xF4,0xE1,0x04,0x94, + + 0xB2,0x99,0xDE,0x76,0xC9,0x6B,0x0F,0xC5,0xC7,0x6B,0xC7,0x46,0x8E,0xD7,0xC6,0xD9, + + 0x86,0x36,0x57,0x73,0xC0,0xF4,0xDB,0xDE,0x61,0x1C,0x2E,0xD2,0x34,0x05,0x73,0x73, + + 0x59,0x90,0x5A,0xF6,0x17,0x49,0xB5,0x96,0x87,0x97,0x35,0xE3,0x2D,0x02,0xB9,0x2D, + + 0xA1,0x0E,0xD3,0xFA,0xDC,0xB8,0x9A,0x71,0x2E,0xA2,0x02,0x84,0xCB,0x5C,0x20,0xB7, + + 0xC5,0x69,0x59,0x0A,0x63,0xAE,0x68,0x0B,0x41,0x55,0x88,0x93,0xBE,0x98,0x00,0x6B, + + 0x59,0xB9,0x7C,0xA3,0xD6,0xFD,0xD6,0x4B,0xCE,0x99,0xAC,0x45,0x7B,0x80,0x8B,0x19, + + 0xCD,0x92,0x67,0xE2,0xA3,0x17,0x49,0x0B,0xEA,0x43,0xBF,0x2B,0x15,0x0B,0xEF,0xE3, + + 0x30,0xD9,0x91,0x2E,0xCB,0x14,0x01,0x1B,0xEB,0x7B,0x70,0x3B,0xC0,0x54,0x8E,0x4E, + + 0x13,0x27,0x66,0x4C,0xC2,0xB0,0xC9,0x08,0x8D,0xD5,0x8E,0xEA,0x7A,0x5C,0x16,0xCB, + + 0x53,0xBC,0xF9,0xD8,0xF7,0x2C,0x83,0x9A,0x2F,0x20,0x80,0xF8,0x96,0xCE,0xDC,0x29, + + 0x02,0x63,0x67,0xDE,0x41,0x1A,0xF6,0x89,0x11,0x57,0x08,0x9C,0xC8,0x0F,0xAC,0xA8, + + 0x9D,0x1E,0x4B,0xAC,0xC3,0x14,0x0D,0x00,0xB7,0x9D,0x2C,0x0C,0x73,0xF2,0xFF,0x27, + + 0xA1,0x41,0xF1,0xF0,0x53,0x63,0x3E,0x1E,0x9D,0x4F,0xDA,0x75,0x63,0x30,0x76,0x16, + + 0xE0,0x82,0x71,0x9E,0x76,0x4B,0x20,0xCF,0xED,0x4C,0x52,0xE4,0x18,0x09,0x5B,0x69, + + 0xE8,0x53,0x06,0x95,0x98,0xDD,0xA5,0x5E,0x63,0x03,0x6E,0xDA,0x2B,0x77,0x27,0xE2, + + 0x0D,0x42,0x9D,0x15,0xCD,0x63,0x79,0x62,0x63,0xBF,0x1D,0xCA,0x2E,0x3C,0x87,0xFD, + + 0x3B,0xB3,0xCB,0x56,0xE2,0x29,0x40,0x75,0x42,0x62,0x2C,0x9B,0x94,0x91,0xD7,0x15, + + 0x03,0x74,0x72,0x27,0x0D,0xB7,0xCD,0xBC,0xAB,0x6A,0xFB,0x85,0xD5,0x62,0xFA,0xBE, + + 0x2F,0xC1,0x3E,0xAE,0x67,0x7B,0x1C,0x49,0x8E,0x46,0xFE,0x92,0x05,0xE1,0x10,0x7A, + + 0x62,0xCA,0x50,0x42,0x3D,0x5B,0xA6,0xA3,0x51,0xAD,0x83,0xA1,0xE1,0x35,0x58,0x06, + + 0x60,0x19,0x56,0xA9,0xC9,0x64,0x6A,0x0F,0xB5,0x47,0xA3,0xFC,0x19,0xC0,0x24,0xEB, + + 0x85,0x48,0x0D,0xB9,0x3F,0x94,0x62,0x29,0x75,0xE4,0xD6,0x19,0x1C,0x32,0x7D,0x0F, + + 0x69,0x89,0x57,0xB5,0x49,0xBA,0x83,0xCB,0x64,0xB7,0xD9,0x39,0x27,0x8F,0x35,0x20, + + 0xF5,0xA4,0xA1,0xB8,0xED,0xB5,0x8E,0x1D,0x22,0x2F,0x30,0xC2,0xD9,0x94,0x6E,0xA5, + + 0x17,0x6E,0xFB,0xA2,0xB3,0x40,0x41,0x68,0x4A,0xCE,0xD6,0x6C,0x12,0x1C,0x25,0xA7, + + 0x53,0xDF,0xCA,0x5C,0x57,0xDD,0x07,0x7E,0xCD,0x88,0x48,0x45,0x75,0x3E,0x06,0xE4, + + 0xB5,0x2B,0x65,0x39,0xD7,0x5C,0x42,0x29,0x95,0x45,0x93,0xFC,0xC4,0x6F,0x59,0x75, + + 0xBD,0xA7,0x8E,0x6D,0xB1,0x17,0x73,0xBA,0x2E,0x50,0xD7,0x34,0xD0,0x35,0xB0,0xE2, + + 0xDB,0xBD,0xD6,0xD8,0x91,0x51,0x6A,0xA7,0x81,0x36,0x9E,0x32,0xB7,0x8F,0x36,0x35, + + 0x05,0x17,0xA7,0x11,0x43,0xED,0x9C,0xA1,0x52,0xF5,0x1F,0xB4,0x6D,0x62,0x92,0xB1, + + 0xA8,0xED,0x86,0x80,0x9C,0xA1,0x85,0x23,0x29,0x51,0xBC,0x83,0x81,0x23,0xA6,0xA4, + + 0x00,0x91,0x59,0x90,0xF1,0xA4,0x88,0xB7,0x29,0x02,0x00,0x0F,0x48,0x73,0x32,0x82, + + 0xF3,0xDA,0x5E,0x01,0x42,0xC6,0xB6,0xBB,0x8D,0x08,0xD4,0xE4,0x72,0x74,0x63,0x7B, + + 0x40,0xCF,0x93,0x4B,0xBE,0x78,0x2C,0x0F,0xEC,0x43,0xDC,0xF4,0x73,0x75,0x7F,0xBE, + + 0x5D,0xE9,0xC0,0xC5,0xD0,0x8C,0x76,0xB8,0x98,0xFD,0xD5,0xE5,0xF2,0x76,0x58,0x44, + + 0xA3,0xD7,0x32,0xAB,0x6A,0x70,0x0F,0xF0,0xF5,0x6C,0xDD,0xF5,0xF3,0x77,0xF9,0x0A, + + 0xE1,0x6D,0xA9,0x09,0x4A,0xA4,0xB2,0x8C,0xA0,0x4B,0x17,0x24,0x1C,0x82,0x28,0xB5, + + 0xAD,0xBD,0xA5,0xC6,0x17,0xAA,0x8E,0xB8,0xFB,0x92,0x7A,0x82,0xF2,0xB4,0x3F,0x19, + + 0x53,0x5B,0xBF,0xA8,0xB4,0xBA,0xB7,0xBA,0x86,0x3E,0xCF,0x44,0x7C,0x6E,0x9E,0x9E, + + 0x8D,0xB6,0xA4,0x38,0x95,0xAB,0x01,0xFC,0xCF,0x59,0xE6,0x42,0xE5,0x1B,0x57,0x9D, + + 0xFA,0x29,0xA2,0xB1,0x3D,0xDF,0xB9,0xCB,0x7F,0x6E,0xD6,0xEC,0x7A,0x7C,0xA5,0x1A, + + 0x9D,0x38,0x23,0x67,0xE1,0xE9,0x16,0x7D,0x2E,0x26,0xDE,0xFC,0x7B,0x7D,0xAA,0x2B, + + 0x15,0x63,0xC7,0x37,0x5D,0x23,0x1A,0x8F,0x65,0xE8,0xD7,0xED,0xFA,0x7E,0xEA,0xA8, + + 0xBE,0x0C,0xD0,0xBD,0xAE,0x9C,0xF3,0x37,0x73,0x9C,0xDF,0xFD,0xFB,0x7F,0x80,0x71, + + 0x74,0x53,0xA3,0x02,0x57,0xC8,0x0A,0xA5,0xBB,0x6B,0x09,0xD7,0x15,0x49,0x9C,0x70, + + 0xFA,0xC0,0xC3,0x1B,0x49,0xE3,0xA8,0x50,0xF2,0xA4,0x47,0x25,0xB6,0x30,0x5F,0x04, + + 0x25,0x5D,0xF5,0xDD,0x3A,0xE1,0x49,0x33,0x2D,0xB3,0x68,0x79,0x2B,0xE2,0x49,0xB5, + + 0x24,0x28,0xBD,0x58,0x37,0xE1,0x01,0xDC,0x48,0x7E,0x94,0x21,0xBC,0xA0,0x2F,0xC9, + + 0xBA,0x43,0x2E,0xA2,0xC2,0x01,0x8F,0x62,0x42,0x74,0xEA,0x66,0x4A,0x74,0x97,0xD7, + + 0x7D,0x4C,0xC3,0x65,0x83,0x1C,0x8C,0xA0,0xA6,0xBA,0x3A,0xFA,0x09,0x44,0x4E,0x8C, + + 0x63,0xB9,0x16,0x8C,0x6B,0x59,0xE3,0x2B,0x95,0x22,0x72,0x7A,0xDC,0x64,0x8D,0xE9, + + 0x26,0x18,0xA5,0x73,0x97,0x06,0x82,0x95,0x72,0xC9,0x6E,0xCA,0x88,0x10,0x5A,0x0E, + + 0x08,0x28,0xC9,0xB4,0x00,0xC8,0xD7,0x50,0xDA,0x89,0x35,0x7C,0xAC,0x63,0x12,0x27, + + 0xF2,0x14,0xA1,0xD8,0x33,0xC9,0xC5,0x7D,0x69,0x66,0xB8,0xAB,0x6D,0x03,0xDC,0x69, + + 0x7F,0xEF,0xF1,0x42,0x45,0x29,0x0B,0xD5,0x60,0xC7,0x3B,0x0F,0x9A,0x8A,0xF8,0x3F, + + 0x2C,0x14,0x2F,0x3B,0x6D,0x7B,0x9B,0x49,0xA7,0xB8,0x9A,0x81,0x1E,0x14,0x9D,0xB9, + + 0xD3,0x39,0xE8,0x3E,0x9E,0x5A,0xE9,0xB7,0x09,0x5F,0x0D,0x6E,0x5E,0xEC,0xEB,0xC7, + + 0x33,0xDE,0x93,0xA8,0xA6,0x00,0xE0,0xFD,0x9A,0x62,0xFA,0x7E,0x5F,0xED,0xC7,0x16, + + 0xA2,0x8E,0xCF,0x2D,0x61,0x51,0x71,0x6A,0xC4,0x1D,0xF3,0x6F,0xDE,0xEE,0x64,0x26, + + 0x17,0x4A,0x87,0xE0,0x49,0xFB,0x84,0x99,0x14,0xFD,0xFB,0x7F,0xDF,0xEF,0x37,0x73, + + 0x87,0xD0,0xA2,0x91,0x53,0xD8,0xCB,0xBE,0x64,0x1B,0xB0,0x2E,0x5A,0x99,0xC5,0x61, + + 0xA1,0x3C,0x2D,0x8A,0x52,0x38,0xBB,0x4C,0x90,0xD1,0xD9,0xF8,0x96,0x4E,0xA5,0x92, + + 0x5B,0x13,0xE5,0x87,0xF3,0xA9,0xAF,0xD2,0xA5,0x91,0xEF,0x56,0xCB,0x76,0x89,0x23, + + 0xD4,0x3C,0xAD,0x97,0xD1,0x5A,0x5C,0x39,0xDC,0x97,0xC2,0xB3,0xAD,0x32,0xF2,0x4B, + + 0x7E,0x34,0x75,0x52,0x62,0xB4,0xB1,0x22,0xE4,0xCA,0xF4,0xE6,0x76,0xF4,0xB4,0x70, + + 0x86,0x48,0x22,0xE6,0x31,0xF7,0x31,0x61,0xF6,0x2A,0xFC,0xF6,0x77,0xF5,0x65,0x42, + + 0xC2,0x3C,0x5B,0x81,0x0E,0x3D,0x01,0x93,0xF4,0xA4,0xF5,0xE7,0xF6,0xF6,0x92,0x21, + + 0x20,0x12,0xFB,0xB7,0x90,0x32,0x7F,0xF3,0xB3,0x36,0xFD,0xF7,0xF7,0xF7,0x82,0xF8, + + 0xA2,0xD9,0x78,0x9B,0x78,0x47,0xF6,0x8E,0x48,0xF8,0x3F,0xCA,0x5B,0xA3,0xC6,0x1D, + + 0x09,0x94,0x29,0x61,0x61,0x46,0x5F,0x4E,0x04,0xDA,0x05,0x4C,0xCA,0x06,0x19,0xA7, + + 0x2E,0x62,0x58,0x7C,0xD9,0x70,0x33,0x54,0x1B,0x84,0x11,0x28,0x42,0x97,0xD0,0xBC, + + 0x0C,0x9D,0x50,0x64,0x0D,0x71,0xB8,0xBA,0xB1,0x66,0x53,0x9D,0xE6,0xD8,0xC3,0x1B, + + 0x54,0x3E,0x4E,0xB5,0xC1,0xBC,0xFD,0x0A,0x11,0x88,0xF6,0xEE,0x7E,0xFC,0x9F,0xE9, + + 0xFD,0x79,0x72,0xAA,0x02,0x26,0x81,0x14,0x8C,0x4F,0xFE,0xFE,0x7F,0xFD,0x98,0x28, + + 0x03,0x72,0xA1,0x6B,0xA7,0x44,0x92,0x51,0x4B,0x71,0xF7,0xEF,0xFE,0xFE,0xB6,0x0F, + + 0xFE,0xDC,0x89,0x7C,0x66,0x52,0xF8,0xF3,0xEF,0xEE,0xFF,0xFF,0xFA,0xC0,0x80,0x00, + + 0x55,0x40,0xF8,0x76,0xFB,0xDA,0x69,0xF0,0x0C,0xC1,0x50,0x25,0xAC,0x9B,0x4C,0xB4, + + 0x25,0x41,0x92,0x3A,0x30,0xC1,0x32,0xE0,0x1D,0xC9,0xE8,0xEB,0xE6,0x2D,0x01,0x85, + + 0x86,0x02,0xE1,0xC5,0x5E,0x2F,0x12,0x6B,0x4D,0x21,0x90,0xE3,0x72,0x2E,0x09,0x05, + + 0x22,0x66,0x49,0xC4,0x90,0xAE,0x09,0x7B,0x4D,0x4B,0xEF,0x26,0xF7,0x27,0x65,0x46, + + 0x96,0x60,0xBB,0x3A,0xC8,0xFB,0xF0,0x6E,0xCE,0xC9,0x90,0x17,0xD6,0x55,0xA7,0xBE, + + 0x83,0x9D,0xF2,0x0A,0xE8,0x64,0xB7,0x9B,0xC3,0xD9,0x09,0x87,0xDF,0x68,0x79,0x66, + + 0x25,0x16,0x46,0x96,0x31,0x1B,0xB5,0x46,0x65,0x56,0xAF,0x63,0x3B,0x02,0x69,0x97, + + 0x03,0x58,0xF6,0xBF,0x78,0x28,0x78,0x93,0x3E,0x4E,0xA7,0x97,0x7F,0x6A,0x92,0x2C, + + 0x2E,0x48,0xDB,0x15,0xBF,0x6A,0x10,0xDA,0x0F,0x4C,0xB4,0x8D,0xD4,0xB3,0x0A,0x18, + + 0x09,0x49,0x4A,0xC1,0xFD,0x2F,0x20,0x3A,0x55,0x69,0xEA,0x1A,0xBB,0x0A,0xC5,0x6E, + + 0xAE,0x49,0x5D,0xB9,0x1D,0xDF,0x17,0x7D,0x2F,0xB4,0xB3,0xD0,0x98,0x24,0x1E,0x26, + + 0x89,0x0B,0x03,0x58,0x38,0xA1,0x9B,0x29,0xD9,0x49,0x2B,0x8A,0xF7,0x27,0x62,0x1E, + + 0x8A,0x82,0x79,0x5E,0x3A,0x62,0x56,0x74,0x1F,0x45,0x42,0xAC,0x42,0x51,0x6A,0xFD, + + 0x8B,0x0F,0x94,0xBE,0x0B,0xD0,0x48,0x7C,0xA9,0xCD,0xA2,0x74,0xBE,0x2C,0x63,0x20, + + 0x0A,0x41,0x80,0xB3,0x62,0x21,0xFF,0x63,0x69,0xF3,0xC5,0x6B,0x69,0xAA,0x6B,0x6F, + + 0x0B,0x52,0x5C,0xA2,0x62,0x4C,0x5B,0xB9,0x71,0xE0,0x2E,0x83,0xCF,0x52,0x04,0x80, + + 0x78,0xF8,0x7C,0x74,0x38,0x3F,0x2C,0xC0,0xD0,0x58,0x7B,0x4A,0xF0,0xB8,0xDE,0xB0, + + 0x26,0xE9,0x64,0xAE,0xB3,0x19,0xE5,0xC2,0xEF,0x34,0x73,0x5A,0xF1,0xA2,0x4F,0x28, + + 0x82,0x11,0x2D,0xBB,0x37,0x47,0x64,0xD3,0x6E,0x37,0x2B,0xAC,0x57,0x62,0x02,0x1D, + + 0x24,0xE6,0x0B,0x65,0xF5,0x3C,0x64,0xC3,0x6F,0x36,0xBC,0xB3,0x21,0x17,0x6A,0xC6, + + 0xB3,0x88,0xBF,0xBA,0x10,0xD9,0xAF,0xE4,0xCF,0x15,0x70,0x48,0x99,0x10,0x71,0x0E, + + 0xCE,0x11,0x60,0x4B,0xCC,0xB8,0x66,0x77,0x47,0xA8,0x68,0x16,0x57,0x7F,0x6B,0xC6, + + 0x73,0xE8,0x83,0x63,0x79,0xBB,0x70,0xE7,0x76,0x32,0xEC,0x07,0x1B,0x79,0x4A,0xDA, + + 0x27,0x43,0x2E,0x2B,0xB5,0x77,0x7A,0x13,0x03,0x42,0xD8,0x9E,0x9B,0x33,0xC6,0x55, + + 0xCC,0xB3,0xE6,0xCD,0x7C,0x37,0x3F,0xFB,0xEC,0x44,0x28,0xA5,0xDB,0x1D,0x21,0x69, + + 0x02,0x1C,0x09,0x7E,0xBB,0x11,0x66,0x9F,0xF8,0xF5,0x22,0xB5,0x9E,0x69,0x37,0xD7, + + 0xC3,0x11,0xE7,0xCC,0xF0,0xB1,0xBE,0xFA,0x64,0x06,0x78,0x43,0x78,0x39,0x51,0x91, + + 0x8A,0xB0,0x8D,0x7F,0xBD,0xD8,0xBF,0xF3,0x7C,0xF7,0x70,0x53,0x79,0x60,0xE2,0xBA, + + 0xA4,0x79,0xA9,0x8B,0xDB,0x8A,0x2E,0xB7,0xBA,0x53,0xFF,0x1A,0x6A,0xB9,0x75,0x36, + + 0x93,0x12,0xEE,0xD9,0x3D,0x7D,0x26,0xCA,0x1F,0x82,0xDB,0x97,0x13,0x39,0xBD,0xC1, + + 0x75,0x21,0xB8,0xBF,0x68,0xA1,0x65,0xC1,0x3F,0xEA,0xAF,0xC9,0x44,0xA1,0x70,0x36, + + 0x8F,0x2B,0xA0,0x7D,0x70,0xDF,0xCF,0x43,0xEB,0x2F,0xF6,0x1B,0x12,0x70,0x20,0x02, + + 0x04,0xC0,0x5B,0xE4,0x96,0x88,0x20,0x62,0xC4,0xC6,0xC0,0xF9,0xB7,0xA2,0x28,0x12, + + 0x05,0xC1,0xD0,0x94,0x10,0xF2,0x3C,0xB5,0x64,0x56,0x55,0x5D,0xD0,0xE6,0xEE,0x07, + + 0x84,0x82,0x1D,0x65,0xD5,0xE2,0x7E,0x83,0x25,0x19,0xB1,0x3B,0x03,0x5F,0x29,0x87, + + 0x85,0x83,0x93,0xF5,0x39,0x23,0x8D,0xCC,0x86,0x30,0x51,0x94,0xF1,0x1E,0x40,0xCC, + + 0x86,0x91,0x9F,0x06,0x5A,0xB2,0xD0,0x0D,0x26,0x84,0xE6,0x60,0xE5,0xA9,0x48,0x1C, + + 0x87,0xE6,0x10,0x72,0x9A,0xB3,0xCF,0x57,0x6B,0x6D,0x68,0x05,0xDB,0xB4,0x41,0x8D, + + 0x06,0xCB,0xA9,0x53,0x5D,0xA9,0x03,0x73,0xC6,0xCC,0x8F,0x85,0xC6,0xAB,0x4C,0x55, + + 0x13,0xE3,0x96,0x4A,0x5C,0xA8,0xD9,0x56,0x45,0x87,0x87,0x70,0x6E,0x81,0x22,0x0A, + + 0x0C,0xC8,0xDA,0x8A,0x43,0x06,0x62,0x59,0x54,0x42,0x6D,0x26,0x72,0xAE,0x2A,0x1A, + + 0x0D,0xC9,0xD7,0xEF,0xAF,0x39,0x8E,0x5A,0x45,0x19,0xCA,0xE1,0xB2,0xA8,0x23,0x9E, + + 0x8C,0x8A,0x7C,0xA2,0x9A,0x5B,0xF4,0xD5,0x2D,0xAC,0x41,0xE9,0x7E,0xA6,0xE6,0x47, + + 0x8D,0x8B,0x43,0x35,0x1F,0xA3,0x94,0xEB,0x4C,0x6A,0x05,0x36,0x3A,0xFB,0x59,0xA4, + + 0xEF,0xEA,0x5B,0x6A,0x9B,0x02,0x71,0x8F,0xF0,0xEC,0x8C,0x8C,0xF2,0xD1,0x43,0x00, + + 0xC6,0xE9,0x1A,0x8D,0xFE,0xC1,0xDE,0x18,0x6B,0xC7,0xFE,0xFF,0xB6,0xA9,0xD7,0x01, + + 0x47,0xCA,0xD8,0xEF,0x73,0x9E,0xF1,0x60,0x4A,0x9A,0x17,0x4B,0x6D,0x99,0x40,0xB9, + + 0x23,0x93,0x8C,0xA4,0x7E,0x39,0xFB,0x0C,0xEB,0xB8,0xEE,0x8C,0x5B,0x42,0x01,0x82, + + 0x4F,0xB4,0xED,0x98,0x48,0x44,0x90,0xEC,0xBB,0xED,0x08,0xAF,0xD3,0xE0,0xAC,0x92, + + 0x94,0x1C,0x7C,0x50,0xDF,0xFD,0x63,0xFA,0x1A,0xF1,0x9D,0xB0,0xA5,0x95,0xDA,0x87, + + 0xA4,0xF7,0xF5,0x9D,0x9E,0x06,0xDE,0xD4,0x64,0x05,0x5A,0x49,0x74,0xF9,0xC9,0xB4, + + 0x16,0x1E,0x5D,0xD1,0x1F,0x48,0xFD,0x73,0xF6,0xD5,0x01,0xBE,0x56,0x96,0xC4,0xCC, + + 0xAA,0x09,0x48,0xB4,0xE8,0x4B,0x87,0xE2,0x5E,0x29,0xF5,0x00,0x52,0x09,0x42,0xD4, + + 0xB6,0x09,0xC2,0x34,0x84,0xD0,0x4B,0x10,0x43,0x58,0x07,0x8D,0x4D,0x4A,0x9C,0xA1, + + 0x0A,0x8A,0xDF,0x59,0x41,0xF7,0x52,0x01,0x26,0x29,0x60,0x18,0x03,0xA5,0x43,0xD4, + + 0x76,0x98,0xD5,0xFF,0x14,0x1B,0x56,0x19,0x8C,0xD8,0xC6,0x5F,0x04,0xB6,0xC2,0xAD, + + 0x2D,0xF8,0x73,0x0A,0x34,0x4D,0x3A,0xD4,0xCD,0x52,0x59,0x40,0xFC,0x71,0x2F,0x45, + + 0xCE,0x9D,0x19,0xA1,0x41,0xFB,0xB9,0x58,0xEF,0xF1,0x86,0x99,0x9A,0xE9,0xDD,0x89, + + 0xA4,0xD5,0x10,0x52,0xBA,0x9A,0xCC,0x49,0x40,0x51,0x92,0xA9,0x68,0x9E,0x3A,0xE9, + + 0x23,0xFE,0xAB,0xA0,0x41,0xB8,0x84,0xD9,0xAC,0x9B,0x50,0x51,0x7D,0xE1,0xD2,0x80, + + 0xE7,0xD8,0x9E,0x24,0xD7,0xF8,0x77,0x95,0x12,0x23,0xCF,0xF1,0xDD,0x79,0x45,0x05, + + 0x9A,0x43,0xA8,0xD9,0x9E,0xAE,0xAA,0x00,0x9A,0x6B,0xED,0x04,0xC6,0x29,0x4E,0x91, + + 0x67,0xFA,0xA1,0xC9,0x9D,0xFE,0xCC,0x4E,0x19,0x43,0xDC,0xE0,0x5D,0x7B,0x56,0xD9, + + 0x30,0xAB,0x97,0xFB,0x01,0x9F,0x44,0x71,0xEE,0x7F,0x87,0xCD,0x8F,0x60,0xA1,0xE2, + + 0xF9,0x85,0xEE,0xE6,0x87,0xAD,0x5D,0x8E,0x40,0xF1,0x24,0x46,0xEF,0x21,0x70,0x22, + + 0xD8,0x14,0x71,0x66,0x80,0x1E,0xB7,0x6E,0x98,0xDE,0xE5,0x3C,0xF4,0x3E,0x12,0xFB, + + 0x35,0xD6,0xAE,0xEA,0x71,0xBE,0x2A,0x2E,0x63,0xC6,0x29,0xCA,0xC0,0x2F,0x71,0x1E, + + 0x22,0x86,0x19,0x7A,0x4F,0x8C,0x27,0xD3,0x5C,0x7C,0x98,0x53,0x4C,0x7C,0x56,0x46, + + 0xE9,0x40,0xC0,0x5B,0x96,0x8B,0x9F,0xEA,0xC0,0x58,0xFE,0xD4,0x8F,0x6B,0x36,0x57, + + 0x27,0x0B,0x63,0xBC,0x17,0xF9,0xEC,0x03,0x73,0x4A,0x98,0x07,0x6A,0xE2,0x7F,0xA3, + + 0xE8,0x62,0x65,0x2A,0x47,0x7B,0xED,0x12,0xAE,0x49,0x65,0x1A,0x71,0x62,0xED,0x93, + + 0x07,0x18,0x65,0xD0,0x46,0x45,0x39,0x3A,0x6E,0x05,0x5D,0x78,0x32,0xC8,0x15,0x52, + + 0x3A,0xA9,0xFA,0x62,0xCE,0x60,0x4B,0xA0,0xB5,0xB9,0x02,0x56,0xBF,0x78,0x72,0x2A, + + 0x79,0xB5,0xF2,0x76,0xCB,0x81,0x25,0x9D,0xB2,0xD4,0x60,0x34,0xA4,0xA6,0x7B,0xF2, + + 0x31,0xFE,0xFB,0x66,0x42,0x62,0xEC,0x57,0xE6,0x95,0xAC,0xDB,0xC8,0xB7,0x5D,0xFB, + + 0x7A,0x76,0xF3,0x39,0x28,0x22,0xCF,0xC3,0x74,0x28,0x0B,0x47,0x7A,0x0E,0x78,0xCF, + + 0x29,0x4E,0xAB,0xA7,0xE5,0x42,0x92,0xEC,0x6E,0x22,0xCF,0xEE,0x93,0xA5,0x4D,0x7F, + + 0xA7,0x6B,0xDC,0xC2,0x18,0x94,0x4B,0xF0,0xEE,0xEB,0xA2,0xFE,0x92,0xB8,0x19,0x48, + + 0x04,0x05,0xFD,0x79,0x44,0x83,0x0A,0x58,0x6F,0xE8,0xAB,0x4A,0xB9,0x91,0x32,0xA9, + + 0x83,0x69,0xF5,0x5B,0x6F,0x4B,0xCD,0x39,0xC7,0x0D,0x6C,0x55,0x2F,0x8E,0x7C,0x88, + + 0x4B,0x54,0xFF,0x4E,0x9B,0x71,0xC0,0xEB,0x62,0xBE,0xBF,0x20,0x38,0xEC,0xB7,0x35, + + 0xD6,0xAD,0xF3,0x9C,0xD4,0xEE,0x14,0xA5,0x90,0x27,0x9A,0xEE,0x90,0x1A,0x05,0xFE, + + 0xDC,0xED,0x3F,0x7F,0xA0,0xFF,0x13,0x2E,0x59,0x04,0x55,0xB4,0x21,0x30,0xD9,0xCA, + + 0x70,0x70,0x8C,0xE3,0x4E,0x72,0x66,0xDA,0x77,0x6C,0xA7,0x32,0x5D,0xDF,0x5C,0x01, + + 0x24,0x56,0x79,0x56,0x26,0x69,0xF8,0x08,0x40,0x19,0xEB,0x76,0x91,0xE9,0x88,0x44, + + 0x10,0x54,0x20,0xA7,0xB7,0xB3,0x3A,0xD9,0x60,0x35,0x85,0xC1,0xD6,0x8A,0xC3,0x29, + + 0xC2,0x54,0xA7,0xC5,0xB3,0x1C,0x33,0xCD,0xF0,0x1B,0xB7,0xE4,0xF3,0x07,0x8D,0x54, + + 0xE5,0x0C,0x4C,0xA6,0x3F,0xB1,0x9D,0x74,0xB5,0x15,0x71,0x67,0x73,0x7F,0x2D,0xDB, + + 0xAC,0x7B,0xBE,0x76,0x94,0x35,0x91,0x62,0xC9,0xD5,0x32,0xFF,0xDB,0xD4,0xEF,0xE2, + + 0xB3,0xB4,0x3A,0xFE,0xC6,0x78,0xE3,0x9C,0x02,0x56,0xB7,0x5E,0xD5,0xD5,0x29,0x8F, + + 0x36,0xA7,0xF8,0xAA,0x19,0xE5,0x3A,0x47,0x09,0xC6,0x33,0xE7,0x31,0x3E,0xAF,0x13, + + 0xA8,0x8B,0x37,0x67,0xA9,0x76,0x5F,0xC6,0x95,0xA4,0x3B,0xEE,0x5A,0xD7,0x53,0x4C, + + 0x24,0xCE,0xC6,0x8C,0x7F,0x97,0x96,0xDF,0x96,0x4D,0xD4,0x1C,0xFE,0x33,0x8D,0x29, + + 0x16,0x3D,0xCA,0x22,0xDA,0x5E,0x1B,0xE6,0x03,0xA9,0xD6,0x0F,0xF7,0xD0,0x1E,0xF4, + + 0xAC,0x7C,0xDA,0xCC,0x47,0xBF,0xE4,0xDC,0xEC,0x84,0x47,0x92,0xFC,0x7C,0x16,0xEC, + + 0xC8,0x3F,0xAF,0x8E,0xDE,0x30,0xCD,0x7D,0xE1,0xE2,0x49,0x1F,0x57,0xD2,0x83,0xE0, + + 0xE4,0x5F,0x27,0x7C,0x99,0xC2,0xCD,0xA2,0x8B,0xA0,0x8F,0xC4,0xF8,0x3D,0x50,0x20, + + 0xD8,0x2D,0x13,0x93,0xE2,0x5C,0x5D,0xDD,0x19,0xDF,0x28,0x4C,0xF2,0xF1,0x14,0xE1, + + 0x39,0x76,0xDA,0x7C,0x9A,0x1D,0x54,0x63,0x84,0xBF,0xC9,0x00,0x29,0xED,0x51,0x2F, + + 0x5C,0xB0,0x6D,0xE8,0x06,0x8C,0x07,0x41,0x7E,0x9C,0x86,0xD1,0xC5,0x3E,0x1E,0x44, + + 0x96,0xE0,0xB9,0x42,0xC3,0xC8,0xB4,0xF6,0xCB,0xDF,0x30,0x73,0xB5,0x30,0x8C,0x3A, + + 0x26,0x78,0x95,0xA9,0x98,0x18,0x39,0x14,0x8D,0x24,0xD6,0xD4,0xAB,0xB4,0x5B,0xA6, + + 0xE5,0xC6,0x25,0x19,0x98,0xB8,0xE5,0x05,0x0C,0xD7,0xE7,0x78,0xB2,0xE0,0xDD,0x74, + + 0x2B,0x83,0x0E,0x2D,0x41,0xAD,0x31,0x76,0xC1,0xA5,0x4A,0x5E,0xD1,0x07,0xD9,0x78, + + 0x7E,0x17,0x32,0x64,0x3D,0x58,0xA2,0xC2,0x5E,0x35,0x4A,0x26,0xA1,0xA7,0x7C,0xF8, + + 0xF6,0x04,0x11,0xBB,0xEA,0x14,0xC1,0x41,0x63,0x76,0x1E,0xDC,0xDE,0x8D,0x9A,0x39, + + 0xF4,0x56,0x1C,0x48,0xB2,0x55,0xA4,0xD4,0x39,0xA9,0x23,0x05,0x58,0x4E,0x78,0xE1, + + 0xA9,0x20,0x7F,0xE4,0x6C,0xC8,0x00,0x9E,0x3E,0xF7,0xD3,0x39,0xDB,0x4B,0x8D,0x54, + + 0x62,0x78,0xAB,0x3D,0x27,0x25,0xB0,0xAD,0x7D,0x9D,0x88,0xEA,0x1C,0x4F,0xFB,0xDE, + + 0x46,0xAB,0x7C,0x38,0xE0,0x2B,0xC2,0xE9,0x77,0xC5,0x80,0x0D,0x37,0x6B,0x72,0x51, + + 0xB6,0x3A,0xE7,0x2F,0x99,0xB5,0xCB,0xF8,0xFA,0xDC,0x5F,0x1C,0xBA,0x68,0x55,0x36, + + 0xEE,0xAF,0x6F,0x1F,0x8A,0xC1,0xFF,0xFF,0xC1,0x1D,0xFF,0xBF,0xC7,0x83,0x5A,0x84, + + 0xD1,0xE6,0xDB,0x8E,0x91,0x6F,0x8F,0x07,0x93,0x6D,0x10,0xEC,0xBD,0xB4,0x17,0x19, + + 0xD6,0x61,0x96,0x11,0xC6,0x3A,0x17,0xF8,0x4B,0xCD,0xD4,0xB0,0x94,0x97,0xDE,0xF8, + + 0x32,0x2D,0xA4,0xE1,0x4B,0xF3,0xE1,0x58,0x35,0xB1,0x9C,0x83,0x77,0x96,0x43,0x71, + + 0x62,0x1E,0xA9,0x10,0x4E,0x38,0x7D,0x64,0xA9,0xA5,0x45,0xBF,0x96,0xD3,0x9C,0x3E, + + 0xB7,0x6F,0x50,0x98,0x95,0xB2,0xC3,0xCE,0x92,0xE5,0xE5,0x04,0x8B,0xB6,0x93,0x56, + + 0x78,0x83,0xE7,0x3E,0x13,0xB3,0xC3,0xA9,0xB6,0x08,0x3C,0x72,0x71,0xB7,0x5B,0x2E, + + 0x51,0x2D,0xCB,0xCD,0xB0,0x94,0xB5,0x3F,0xFC,0x6A,0xB5,0x3E,0x1D,0x92,0xB6,0x98, + + 0xD8,0x3A,0xC3,0x92,0xB1,0xD5,0x56,0x77,0xED,0x18,0x3D,0xE2,0xC4,0x16,0x8D,0x65, + + 0xCD,0x24,0x26,0x09,0xCB,0x33,0x0D,0x24,0xDD,0xEE,0x52,0x48,0x6C,0x73,0x1F,0x9C, + + 0x09,0x8E,0x96,0x74,0x91,0xB4,0x41,0xC0,0xFB,0x46,0xE4,0xBB,0xF3,0xB6,0xDE,0xF9, + + 0x7D,0xA5,0x23,0x08,0x43,0xFB,0x3F,0xA7,0x15,0xAC,0x37,0x28,0x5B,0xEA,0x2F,0xD8, + + 0x17,0x9B,0xD2,0xB8,0x1C,0xE4,0x06,0x30,0x5E,0x2B,0xE5,0xAF,0xD2,0x7E,0xBB,0x34, + + 0x55,0x63,0x74,0x26,0x06,0xBA,0xDB,0x95,0xF3,0x83,0x4E,0xFE,0xD9,0xBD,0x47,0x27, + + 0x33,0xE6,0x7C,0x36,0x43,0xF0,0x7F,0x9C,0x90,0xB1,0x81,0x7A,0x28,0xCF,0xA7,0x16, + + 0x3C,0x45,0xC9,0x29,0xB8,0xDC,0x2E,0xC2,0x4B,0x01,0xCF,0x15,0x52,0xF3,0x4F,0x22, + + 0x50,0xDD,0x10,0xD7,0x1A,0xB9,0x26,0x5B,0xE9,0x9D,0x6F,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x74,0xFD,0xC0,0x18,0x9D,0xA6,0x72,0x20,0x41,0x00,0x16,0x2C,0xF5,0xBF,0xB7,0x60, + + 0x00,0x08,0xC0,0x15,0x35,0x8C,0x0F,0xB2,0x88,0xA2,0x74,0x10,0xA4,0x90,0x1B,0x75, + + 0xA1,0x10,0x89,0x7B,0x52,0x22,0xFD,0x05,0x21,0xED,0xF3,0x20,0xD1,0x22,0xCD,0x62, + + 0xF4,0x84,0x10,0xA7,0x95,0xD3,0x21,0xCE,0x28,0xF2,0x66,0x47,0xFF,0xBC,0xA7,0x80, + + 0x06,0xD0,0x39,0x83,0x8C,0x2E,0xEA,0x02,0x9C,0x42,0x69,0xFE,0x53,0x45,0x08,0x10, + + 0x05,0x27,0x8C,0x58,0x60,0x25,0x50,0x79,0xBE,0xC3,0x98,0xC9,0x55,0x67,0x56,0x32, + + 0xFA,0x44,0x41,0x06,0xAB,0x64,0x78,0x12,0x63,0x90,0xB1,0x36,0xBC,0x24,0xC9,0xBE, + + 0xEB,0x0A,0x96,0x50,0x95,0x67,0x71,0x0F,0x01,0x47,0x8F,0x45,0x98,0xD8,0x06,0x0D, + + 0xF6,0xF1,0xDB,0x24,0xBD,0x6A,0xBE,0xB7,0x49,0x08,0x7E,0x53,0x9A,0xC8,0x0E,0x78, + + 0x41,0xFE,0x82,0x62,0xDB,0x29,0xDA,0xB8,0x48,0xE6,0xBA,0x7C,0x5D,0x07,0x06,0x7A, + + 0xFD,0x83,0xC3,0x11,0x15,0xAC,0x3F,0x40,0x21,0xFB,0x28,0x5D,0x58,0xEC,0x94,0x1D, + + 0x06,0x4A,0xC3,0x1C,0xBD,0x86,0xBF,0x1E,0x68,0xB4,0x0B,0xB9,0x88,0x5C,0xBD,0x26, + + 0x24,0xD3,0xAD,0x23,0x1C,0x2E,0x1A,0x69,0x6E,0x0E,0xE8,0xD4,0xA9,0xC7,0xBC,0xDC, + + 0x09,0x13,0x5D,0xA3,0xEA,0xFE,0x0C,0x83,0x20,0x42,0x9A,0xBC,0x5D,0x6F,0x1C,0x4C, + + 0x8C,0x6C,0x8C,0xC9,0x98,0x8D,0x17,0x63,0xCC,0x4C,0xAB,0x69,0x27,0x2C,0x03,0xC9, + + 0x8D,0x0D,0x0B,0xDD,0x23,0xB4,0xDB,0x06,0xCD,0x4D,0x1D,0x3A,0x01,0xB2,0x52,0x74, + + 0x38,0xE5,0xC4,0x5D,0xDB,0x54,0x84,0xB1,0x18,0x54,0x78,0x36,0xE1,0xAD,0x0F,0x21, + + 0xA9,0x61,0xCC,0x58,0x37,0xE1,0xA4,0xB4,0xEE,0x10,0xA2,0xD8,0x10,0x31,0xDB,0x8C, + + 0xC6,0x49,0x31,0xE7,0x4F,0x70,0x3F,0xD2,0x81,0x53,0xF7,0xA5,0xF3,0xB2,0xBB,0x97, + + 0xBD,0x0E,0xD3,0xD5,0xB5,0x5D,0x44,0x9C,0x44,0x3D,0x85,0xB1,0x7E,0x32,0x84,0x40, + + 0x4F,0x56,0x28,0x56,0x36,0x3E,0x50,0x20,0x66,0x38,0x38,0x76,0x73,0xE9,0x93,0xAE, + + 0xE1,0x15,0xCE,0x94,0x37,0x5B,0xA3,0x74,0x61,0x5D,0x30,0xD0,0x75,0x77,0x05,0x54, + + 0x2D,0x90,0x47,0xCD,0x17,0xB0,0xC5,0x09,0x86,0x1B,0xB7,0xE5,0xF3,0x36,0x05,0xD5, + + 0x2A,0x2E,0x5D,0x12,0x31,0x0B,0x9D,0x71,0x89,0xE8,0x4F,0x32,0xF5,0x35,0xA2,0x90, + + 0xA4,0x9C,0x16,0xFF,0x41,0xB1,0x74,0xBC,0x6B,0xE8,0xCF,0x8D,0xDD,0x3A,0x30,0xE8, + + 0x09,0x34,0x93,0x18,0x3B,0x63,0x9C,0x78,0x2D,0xA4,0x8F,0x38,0x7B,0xE3,0x07,0x89, + + 0xFC,0x23,0x03,0xED,0xBC,0x16,0x16,0xCF,0x17,0xDC,0xD7,0xB1,0x07,0x61,0x8F,0x5E, + + 0x8D,0x00,0xF1,0x9A,0x15,0x36,0xB3,0x2B,0xE5,0x51,0x5F,0x3D,0x93,0xC4,0xAA,0xEC, + + 0xC3,0x75,0xFC,0xAE,0xF8,0x69,0x0F,0xC9,0xCF,0x83,0x88,0xAC,0x36,0x3E,0xDE,0x30, + + 0x17,0x50,0x49,0x34,0x57,0x70,0x1A,0xFC,0xE6,0xEB,0x32,0xD8,0x7D,0x7F,0x57,0xBA, + + 0xAE,0x70,0x07,0x5D,0xCE,0x34,0x97,0x69,0xEB,0x1C,0xD9,0xE9,0xFB,0x3E,0xA3,0x4B, + + 0xA7,0x15,0x30,0x59,0xB9,0x0E,0xE6,0x63,0xE8,0x5D,0x41,0x79,0xF9,0x9D,0x9F,0x86, + + 0x40,0xF0,0xBF,0x76,0x10,0xAB,0xF0,0xA2,0x51,0x82,0xF8,0x27,0x70,0xA2,0x16,0x52, + + 0x55,0xE5,0x90,0xE9,0x26,0x60,0x28,0xF2,0x03,0x6C,0xBC,0x56,0x51,0xCD,0xA4,0x69, + + 0xF2,0x32,0xB2,0x85,0x5D,0xD1,0xB2,0x4E,0x49,0x44,0xFA,0x19,0x29,0x6B,0xE2,0x0B, + + 0x0E,0xEA,0x11,0xE9,0xE8,0xA8,0x2E,0xB7,0xC7,0x79,0xA4,0xF0,0xF1,0x4E,0xE9,0xB1, + + 0x8A,0xE1,0xE0,0xBF,0x1A,0xE6,0x38,0xE6,0x44,0x26,0x93,0x26,0x52,0xC8,0x47,0xD6, + + 0x58,0xD1,0xA8,0x8F,0x11,0xA7,0x1B,0x32,0x5B,0xAB,0xE2,0x56,0xF6,0xA5,0x59,0xBC, + + 0x5F,0xFB,0x61,0x9C,0x23,0xE4,0x8E,0xA4,0x1C,0x1B,0xEC,0xA0,0xF2,0x4B,0xD6,0x14, + + 0x45,0xC4,0xBF,0x10,0x49,0x3A,0xC6,0xE1,0xC6,0x1A,0x15,0x53,0xA8,0xC7,0x23,0xC2, + + 0x65,0x38,0xA5,0x49,0x9E,0x94,0x4C,0x2D,0xE0,0xC5,0xA8,0x0E,0xBD,0xA8,0x35,0x13, + + 0x26,0x70,0x6A,0x8E,0x69,0xA3,0xFA,0x26,0x70,0xA5,0xA2,0xAE,0x6E,0x28,0x37,0x7F, + + 0x9C,0x26,0x99,0x6D,0x5E,0x51,0xCC,0xAF,0xCE,0x23,0x5F,0x0B,0x35,0x53,0xAA,0xDF, + + 0xA2,0x1B,0xAF,0x3B,0x68,0xE9,0x59,0x1B,0xCE,0xEB,0x03,0xBB,0xDF,0x3B,0x2A,0x4E, + + 0x81,0xCD,0x01,0x0E,0x1A,0x80,0x10,0x6A,0x4F,0x8C,0x32,0x37,0x7A,0xE4,0x52,0xC8, + + 0x9E,0xCF,0xFA,0x28,0x1B,0xC3,0xD6,0xE8,0x47,0xC5,0xC2,0x81,0x59,0xEF,0x8F,0xC9, + + 0x17,0x03,0xFE,0x6B,0x77,0xC7,0x9F,0x4F,0x27,0x77,0x37,0xED,0x17,0x2D,0x29,0x67, + + 0x8C,0x8D,0x7B,0xB7,0xA3,0xE2,0xF9,0x08,0xFA,0x49,0xF3,0xFB,0xDD,0x4C,0xB1,0xE4, + + 0xC6,0xD0,0x5B,0x04,0xFD,0x43,0xB4,0x65,0x40,0x7D,0x74,0x7A,0x6E,0x9E,0xC0,0x00, + + 0x29,0x9B,0x6C,0x8A,0x5E,0xBB,0x7C,0xC7,0x63,0xD3,0xDE,0xB6,0x74,0xB1,0xA6,0x8B, + + 0x01,0x6D,0x9D,0x03,0xB6,0x08,0xAC,0xC3,0xB0,0x90,0x0A,0x35,0x8B,0x2F,0xAF,0xEC, + + 0x28,0x15,0x2D,0xD4,0x8C,0xDD,0xFB,0xF4,0x27,0xD7,0x51,0x93,0xC6,0x42,0xE6,0xCA, + + 0x83,0x12,0x48,0x54,0x7D,0x29,0xCF,0x66,0x64,0x6E,0x34,0x67,0x54,0xFC,0xFC,0x50, + + 0xB6,0xE5,0x00,0xF2,0xB5,0xA9,0x1E,0x3E,0x96,0x53,0xC2,0x93,0x57,0x98,0x67,0x83, + + 0xA2,0xF8,0x87,0xC7,0xB5,0xF6,0xB5,0x63,0x8C,0xB8,0x75,0xA4,0xCF,0xB7,0x55,0x14, + + 0x65,0x17,0xD7,0xB5,0xD7,0x1D,0x7D,0x33,0xEF,0x96,0x7D,0x30,0xD3,0x0C,0x22,0x4A, + + 0x28,0xF6,0x36,0xFD,0x5D,0xB9,0x8D,0x38,0x6C,0xD2,0x0E,0x5D,0x04,0xBA,0x14,0xF8, + + 0xEF,0x9C,0xF7,0xB3,0x98,0x46,0xA7,0x08,0x65,0x29,0x59,0xFE,0x69,0xE2,0xB7,0x4C, + + 0x2E,0x86,0x1B,0x8B,0x33,0xFB,0xB7,0x6C,0xC8,0x77,0x73,0xE1,0x0B,0x94,0x4F,0xD1, + + 0x00,0x96,0x43,0x0D,0xB1,0xB1,0x66,0x9A,0x48,0x99,0xAE,0xD9,0x02,0x26,0x2E,0xDF, + + 0x82,0x91,0x99,0x4C,0xAF,0xD1,0x48,0x93,0x8C,0xFC,0xF2,0x6A,0x27,0xBD,0xFE,0x5E, + + 0x29,0x2E,0x2E,0x5E,0x4D,0xFF,0x86,0x12,0x47,0x90,0x2C,0x9C,0x80,0xBF,0x05,0xDB, + + 0xAD,0xBE,0xDF,0x7F,0xBE,0x21,0x75,0x03,0x96,0x23,0xFF,0x6A,0x7C,0x52,0x90,0x1C, + + 0x2D,0x83,0xAB,0xDB,0x32,0x09,0x82,0x13,0x97,0x92,0xBF,0xBF,0xF9,0xFD,0x56,0x47, + + 0xC2,0x0C,0xF2,0x00,0x08,0x62,0x0D,0xE7,0x64,0xED,0xBC,0x4D,0x63,0x81,0x88,0xD7, + + 0x25,0x43,0x80,0x10,0x9E,0x60,0xF4,0x14,0xA0,0xBE,0x38,0x46,0x33,0x7D,0x3A,0x93, + + 0x80,0x08,0x45,0x4B,0x1F,0xD4,0x8D,0x01,0x21,0x02,0x29,0x15,0xC8,0xCD,0x49,0x25, + + 0x0C,0x41,0x25,0x91,0x97,0xE8,0xD9,0x68,0xE5,0x4B,0xE7,0x32,0x70,0x9C,0xC2,0x00, + + 0x06,0x6A,0xFA,0xAC,0x29,0xEB,0x8F,0x44,0x29,0xA5,0x28,0x23,0x90,0xE4,0x11,0x78, + + 0xA6,0xFA,0x91,0xC1,0xB6,0xA5,0xA7,0x9D,0x2F,0xFE,0x87,0x16,0x10,0x66,0xD1,0x33, + + 0x69,0xB7,0x98,0x65,0x37,0xD9,0xAE,0x89,0xFD,0x8B,0xD9,0x45,0x50,0x62,0x77,0x68, + + 0x0E,0xF1,0x31,0x92,0x4D,0x2D,0x1D,0xF5,0xF9,0x48,0x26,0xCA,0xD1,0x57,0xC2,0xF9, + + 0x0B,0xA8,0x8A,0x08,0x91,0x11,0xD6,0xAA,0x81,0x3B,0x3E,0xBE,0x18,0x60,0xCB,0x9C, + + 0x0B,0xE0,0x75,0x98,0x50,0x69,0x55,0xBC,0x4B,0xEA,0x99,0xFC,0x5D,0x45,0xC3,0x58, + + 0x8C,0x00,0xE3,0x5E,0xFE,0x27,0x2B,0xD6,0xCE,0x48,0x92,0x52,0x57,0xEC,0xCB,0x99, + + 0xC7,0x65,0x83,0x19,0x10,0x12,0xF7,0xAB,0xC8,0xD6,0x86,0xB9,0xDB,0x82,0x0A,0x79, + + 0xE3,0xBD,0x42,0x2F,0xF8,0xA1,0xF5,0x5C,0x79,0x97,0xEC,0xB8,0x7B,0xCC,0x0A,0xCD, + + 0xF4,0x82,0x6D,0x69,0xCF,0xEC,0x60,0x83,0x4D,0x7E,0xDD,0x0E,0x68,0xBD,0x83,0xC9, + + 0x8B,0x4C,0x3B,0xC9,0x91,0xE1,0xE9,0x96,0xF5,0xAF,0x6B,0xFD,0x7D,0x6A,0xC0,0x39, + + 0x8D,0xF2,0xF1,0xA2,0xA8,0xFF,0x23,0x66,0xA3,0xE2,0x23,0x95,0x99,0x22,0x94,0xC0, + + 0x2E,0x16,0xC4,0x18,0xBD,0xC6,0x94,0xE3,0x59,0x56,0x1D,0x20,0x72,0x92,0xCC,0x10, + + 0x7A,0x53,0x1C,0x16,0xA0,0x9C,0xDC,0xE1,0x65,0x5B,0xDC,0x09,0x77,0x73,0x2B,0x2C, + + 0x01,0xED,0xBE,0x1B,0xB3,0x12,0x3B,0x0C,0x41,0xAD,0x55,0x24,0xFE,0x30,0x4D,0x20, + + 0x2C,0x95,0xB5,0x6B,0x1D,0x3E,0x9D,0xF2,0xD8,0x3D,0xCB,0x4E,0xF7,0xA9,0x53,0xA6, + + 0xC9,0xA5,0x43,0xD6,0xD9,0x95,0x1C,0xE4,0xBE,0xB5,0x79,0xFB,0x1A,0x6F,0x16,0xDC, + + 0x4B,0xA4,0x8E,0xA7,0x5B,0x2E,0x16,0x4D,0xEE,0xF3,0xC4,0xE0,0x97,0xD4,0x65,0xC5, + + 0x76,0xA7,0x9C,0x39,0xD7,0x3F,0x6B,0xC9,0xEC,0x34,0x08,0x93,0x9B,0xD7,0x33,0xD7, + + 0x42,0x94,0x10,0xA1,0x92,0x87,0xCB,0xB1,0xC9,0x4C,0xE7,0x1D,0xF7,0x38,0x2E,0xF2, + + 0xEA,0x18,0x6A,0x08,0x3A,0xD6,0x86,0xDB,0x09,0x59,0xD3,0x28,0x76,0x3D,0xCE,0x18, + + 0x3C,0x5B,0xAF,0x18,0x3B,0x9A,0xC1,0xB9,0x6F,0xE1,0xA6,0x46,0xF6,0x84,0x4F,0x8D, + + 0x27,0x5B,0x8F,0x05,0xBE,0x18,0x2F,0xAD,0x67,0x1B,0xFF,0xCF,0x03,0x74,0x4F,0x28, + + 0xAF,0x79,0xF0,0x6C,0x1A,0x7B,0x8F,0x79,0xE1,0x1A,0xF8,0xC3,0x2B,0x71,0x6F,0x3B, + + 0xA6,0x11,0x9F,0xD0,0x59,0x1C,0x14,0x8E,0x95,0x47,0xE8,0x38,0x5B,0x4C,0x4A,0xFC, + + 0x2D,0x1F,0xD8,0xAE,0x08,0x7D,0x07,0x61,0xCE,0xE2,0x87,0xF8,0xDE,0x8C,0xEB,0x5B, + + 0xBA,0x14,0x3F,0x25,0x85,0xFB,0x77,0x9F,0x34,0x81,0x8E,0xEE,0x5F,0x81,0xC6,0x5D, + + 0xA9,0xFD,0x37,0x35,0xE5,0x72,0xF3,0x87,0x31,0xF0,0x27,0x7F,0x66,0xBA,0xE0,0x83, + + 0x2E,0x8A,0x30,0xEE,0x57,0xED,0x52,0x22,0x45,0x80,0x70,0xA6,0x1A,0xA2,0x06,0xA6, + + 0xA4,0x7E,0x38,0xFE,0x29,0xEC,0xB1,0xB6,0x47,0x62,0xF8,0xEF,0x53,0xE3,0xA1,0x40, + + 0xBD,0x84,0xB1,0x75,0x90,0xCC,0xDD,0x07,0xC2,0xC0,0xF5,0xA2,0x75,0xA0,0xE9,0x42, + + 0x81,0x8B,0x45,0x85,0xDD,0xA9,0xF9,0xB6,0xF2,0xCB,0xEF,0xCC,0xD3,0x39,0xEB,0x22, + + 0x52,0x29,0x58,0x26,0x5A,0xBF,0x66,0x90,0x67,0xA4,0xE6,0x52,0xA9,0xA6,0x97,0xA0, + + 0x52,0x8C,0x7A,0xA9,0xEA,0xCB,0xA3,0x04,0x2C,0xCA,0x63,0x14,0xA8,0x48,0x76,0xC7, + + 0x84,0x56,0xA1,0x21,0x1B,0x00,0x57,0x52,0xA2,0xDD,0xBD,0x62,0x54,0x9A,0x6B,0x2C, + + 0xD2,0x8C,0x8B,0x53,0x96,0x97,0xFE,0x41,0xF4,0x5C,0x6F,0xB0,0x09,0xEF,0xA2,0x49, + + 0x35,0xE6,0x20,0x06,0xB9,0x2E,0x34,0xAE,0x05,0x88,0xF7,0xD6,0x5C,0x53,0x92,0x1E, + + 0x82,0xC8,0x3A,0x9C,0x84,0x24,0xB3,0xBE,0x4F,0x2B,0x01,0x7C,0xFC,0x14,0xB3,0x78, + + 0xA1,0x8B,0xA1,0x4F,0x98,0xC4,0x3B,0xA2,0xCA,0xC8,0x37,0xAB,0xD8,0x96,0x11,0xE4, + + 0x8B,0x33,0x93,0x2F,0xAD,0xE9,0xFB,0xBB,0x0A,0xC3,0x93,0x5D,0xDB,0xE9,0xE2,0x8D, + + 0x2A,0x2C,0x5D,0xDC,0xE9,0xA6,0xE0,0x95,0x48,0x96,0x76,0xEA,0x61,0x58,0xAE,0x14, + + 0xF8,0xE1,0x12,0xB6,0x1D,0x00,0x23,0xFB,0xEA,0x32,0x3C,0x96,0x0B,0xA0,0x74,0x49, + + 0x05,0xCC,0xE1,0x3D,0xAD,0x7E,0x7B,0x15,0x25,0xDF,0xAA,0x86,0x3B,0xE5,0x8C,0x9B, + + 0xC3,0x94,0x79,0xB9,0xF4,0xA0,0x45,0x4E,0x42,0x39,0xA3,0xFB,0xD9,0xB5,0xFD,0xC2, + + 0x6C,0xD2,0x1B,0x02,0x36,0xBA,0x54,0xE9,0x85,0xDD,0x34,0xE5,0x4D,0x9E,0xEC,0x12, + + 0x30,0xD3,0xCB,0xE8,0xE7,0xBB,0xFF,0x49,0xE8,0x27,0xAC,0xC5,0x71,0x9F,0x2B,0x87, + + 0xA7,0xA0,0x65,0x07,0xFA,0xDE,0x27,0xE3,0xE2,0xD0,0x25,0x4F,0xB7,0xBF,0x6D,0x06, + + 0xA3,0x91,0xA9,0xB3,0xB3,0x30,0x06,0x2D,0xE6,0xF3,0x2D,0xC4,0xC0,0x7A,0xC8,0x50, + + 0x06,0x49,0xF2,0xF3,0xC9,0xD8,0x62,0x91,0x02,0xB8,0xCC,0x19,0x45,0xB4,0xFC,0x95, + + 0x03,0x3A,0x33,0x29,0xDE,0xA4,0x25,0x1B,0x23,0x18,0xFA,0x84,0xD0,0xB7,0x07,0xC3, + + 0xA5,0xB6,0x83,0xF2,0xB5,0xF6,0x13,0xD2,0xE5,0x44,0x4D,0xA0,0x28,0xFE,0xC9,0xF4, + + 0x06,0x28,0x01,0x48,0xB6,0x74,0x1F,0xF2,0xE6,0x55,0x36,0xF0,0xD3,0x99,0xCC,0xCA, + + 0x28,0xB4,0xAD,0x31,0x34,0xF8,0xA6,0x2E,0x6E,0x4B,0x32,0xCE,0x6C,0x55,0x16,0x65, + + 0x2B,0x31,0xEC,0xFC,0xC2,0xFB,0x7E,0x6C,0x6E,0xF9,0x3E,0x79,0x59,0xE2,0x3A,0x09, + + 0x65,0xE9,0x4B,0xAB,0xBA,0x98,0xF7,0x2B,0xA2,0x98,0x2E,0xDF,0xF8,0xF3,0xAF,0xDB, + + 0xA9,0xB7,0xA1,0x9B,0xBE,0xFB,0xAF,0x53,0x9D,0x96,0x2A,0xD9,0x72,0x7D,0xA6,0x17, + + 0xBA,0x61,0xBF,0xD2,0x9B,0xB7,0x48,0xDE,0x12,0x23,0xB6,0xD1,0x76,0x90,0x56,0x21, + + 0x29,0x67,0xD4,0x36,0x3B,0xF2,0xB5,0xFD,0x8E,0xC6,0x58,0xFF,0x7F,0xF3,0xF7,0x38, + + 0x22,0xFB,0x61,0xA9,0xFE,0xF1,0xB7,0x2A,0xE2,0x9C,0xDF,0x2D,0xFE,0x55,0xCE,0xA4, + + 0x20,0x19,0xB6,0xC3,0x1A,0x3F,0xB9,0x1D,0x6F,0x5F,0x97,0x79,0x03,0xBE,0x7E,0x06, + + 0xE9,0x0F,0x10,0xBC,0xFB,0x44,0x6B,0xDB,0xF7,0x7F,0x6F,0x03,0xA5,0x6F,0xB3,0xF2, + + 0xAD,0xFC,0x18,0xEF,0x93,0x1D,0x31,0x4A,0xD0,0x7D,0xC1,0x01,0xF4,0x9E,0x53,0x93, + + 0x6B,0x66,0xB9,0xEB,0x3C,0x2F,0x68,0xA5,0xCC,0x4D,0x25,0x5A,0x73,0x23,0x71,0x67, + + 0xE9,0x0E,0x35,0x77,0x66,0x46,0x26,0x7A,0x54,0x9E,0xC7,0xD7,0xD5,0xE6,0xF8,0xDF, + + 0xFD,0x16,0x23,0x60,0xC7,0xB9,0xC0,0xE5,0xBD,0xC9,0xB7,0xE6,0xC3,0x09,0x66,0x6E, + + 0xEA,0xE4,0x58,0xA5,0xB0,0x65,0xA7,0x1E,0x35,0x9A,0x47,0xF6,0x0E,0x2B,0xF9,0xDF, + + 0xA6,0x00,0x6A,0x1A,0x6B,0xDA,0x2A,0x9A,0x7F,0xB7,0xE9,0xFF,0xF6,0xCB,0x31,0x76, + + 0x6A,0x16,0xFB,0x65,0x86,0x88,0x66,0xD8,0x38,0xDA,0x3D,0x51,0x3A,0x24,0x10,0x6F, + + 0xE3,0x4C,0xBA,0xF3,0x3C,0xD7,0xBB,0x67,0xB5,0x34,0x80,0xF3,0xB3,0x2C,0xAE,0x7A, + + 0xFE,0x6C,0xDC,0xEF,0x9D,0xA4,0x24,0x04,0x4F,0xE9,0x0A,0xCD,0xFA,0x29,0x39,0xB9, + + 0x11,0xA5,0xDA,0x20,0x3D,0xAB,0x83,0xD8,0x6B,0x0A,0xAD,0xCF,0xBA,0x76,0x33,0x3D, + + 0x76,0x0D,0xD9,0x4E,0x72,0x4F,0xE4,0x5B,0x3A,0x2E,0xA9,0x0D,0xF9,0xC4,0x3A,0x6F, + + 0xE3,0x3D,0x62,0x3F,0xB9,0xAF,0x03,0x92,0xBF,0x0D,0xC8,0x6E,0x98,0x68,0x32,0x7C, + + 0xD5,0xF2,0x32,0x54,0xF2,0x3C,0x7C,0x54,0xC7,0x0C,0x21,0x03,0x55,0x92,0x3B,0x6E, + + 0x63,0x5F,0x23,0x69,0x73,0xCF,0xAC,0x7A,0xF6,0x0A,0x43,0xD1,0x57,0x0C,0x73,0xC7, + + 0x7C,0x82,0x33,0x79,0x72,0x1E,0x04,0x79,0xF4,0xB0,0x60,0x9F,0x77,0x92,0x12,0xE2, + + 0x40,0x7D,0x95,0x74,0x0E,0xC1,0xAF,0x42,0xCC,0xAD,0xAA,0x1D,0x54,0xFB,0x25,0xB4, + + 0x12,0xF0,0xA2,0x67,0xBD,0x70,0xA4,0x41,0xC2,0x11,0x3C,0xC6,0x13,0x6D,0x7B,0x87, + + 0x41,0x91,0xFB,0x83,0x51,0xB1,0x6D,0x85,0xD3,0x83,0x10,0x94,0xC2,0xDD,0xB5,0x60, + + 0x02,0x53,0xD4,0xA5,0x14,0xCC,0x2F,0x81,0xA4,0xFC,0xE3,0xB2,0x50,0x32,0x7C,0x3E, + + 0x8E,0x19,0x54,0xB7,0x0E,0xC5,0xE0,0x82,0x9D,0xD9,0x79,0x86,0x8D,0x72,0xF3,0x32, + + 0xA1,0x29,0x1F,0xF0,0xBC,0x98,0x4A,0x92,0x03,0xF8,0x3B,0xD0,0x40,0x54,0xD5,0x9E, + + 0x01,0x73,0xBB,0xC3,0x5B,0x67,0x2E,0x1A,0xC6,0x6B,0xFC,0x53,0x53,0x18,0xF1,0xB3, + + 0x5C,0x72,0x19,0xA5,0x33,0xB1,0x23,0xF7,0x02,0xD4,0x65,0x0A,0xC0,0xB6,0x34,0xB8, + + 0x81,0xB7,0x87,0xEA,0xE5,0x37,0xB6,0xDB,0xCB,0xDB,0xA8,0x00,0x13,0x77,0x27,0xBC, + + 0x1A,0xA8,0x27,0xE2,0xAC,0xB4,0x7E,0xF2,0x88,0x54,0xE0,0xBA,0x90,0x76,0xA7,0xFA, + + 0x0B,0x99,0x33,0xF2,0x1B,0x7B,0x73,0x8D,0x65,0xA5,0x17,0x9F,0x98,0x7F,0xB7,0xA8, + + 0x08,0x9A,0xF2,0x77,0x3B,0xD7,0xF8,0x3B,0x78,0x36,0xCD,0x87,0xDD,0x76,0x7E,0xEC, + + 0xD5,0x97,0xE6,0xE8,0x51,0x33,0x7B,0xCC,0xD3,0xFD,0x6E,0xC8,0x49,0x4D,0xEE,0xAA, + + 0x49,0x3A,0xB0,0xDA,0xD2,0x32,0xFE,0x8A,0x09,0x41,0xA1,0x3B,0xA5,0xE0,0x0F,0xF8, + + 0x90,0xB1,0x47,0xFF,0xDA,0x32,0x6F,0xD9,0x03,0xF1,0x6F,0x17,0xEA,0x33,0x31,0xDE, + + 0x0A,0xA0,0x9D,0xE2,0x9F,0x90,0xCF,0x0A,0x67,0xC2,0x3C,0xD9,0x98,0x50,0x0D,0x65, + + 0xA5,0x03,0x30,0x75,0x26,0x0B,0x08,0xD9,0xAD,0x11,0x10,0x55,0xF7,0x63,0x90,0xE3, + + 0xA6,0xC1,0xE8,0xE5,0x91,0x0C,0xEC,0xCC,0xB8,0x60,0xB8,0x29,0x3B,0x4C,0x21,0xFD, + + 0xB7,0x63,0xD9,0x03,0x74,0x23,0x23,0x22,0x3B,0x4F,0xD3,0x03,0xBF,0x21,0x1B,0x23, + + 0x2C,0x2C,0xD1,0xA7,0x29,0xE2,0x01,0xCC,0x30,0xA0,0xEC,0x07,0x2A,0x1C,0x1B,0xB9, + + 0x39,0x24,0x18,0x4E,0xFF,0xF5,0xAB,0x62,0x39,0x44,0x88,0x42,0x25,0xE4,0xEC,0xB0, + + 0xE6,0xFE,0xE9,0x30,0xCA,0xAA,0x51,0x15,0xE6,0x5A,0x55,0x05,0x2B,0x5A,0x98,0xA8, + + 0x35,0xC4,0x19,0x63,0x33,0x59,0xF1,0x67,0x16,0xC0,0xAE,0x76,0xD2,0xA6,0x6B,0xBD, + + 0x3C,0x98,0x5D,0x28,0x34,0xE6,0xCD,0x11,0x3C,0x86,0x55,0x05,0x0D,0x58,0x82,0x79, + + 0xAF,0x0B,0x0E,0xF1,0x9E,0x94,0xC9,0x0E,0x27,0xC7,0x88,0x9E,0xA3,0x37,0x51,0x3D, + + 0xAC,0xC8,0x87,0x79,0xBC,0x7F,0x44,0x3C,0xA4,0xC6,0x01,0x9B,0xAE,0x44,0x0E,0xF8, + + 0x00,0x87,0x99,0x6D,0x42,0xAC,0x31,0x19,0xAC,0x8B,0x0C,0x1E,0x7D,0x55,0x4B,0x48, + + 0xEB,0x86,0x3B,0x20,0xAD,0x0B,0x69,0xA9,0x26,0xAF,0x68,0x06,0x36,0xAF,0xE2,0x5A, + + 0x31,0x8A,0xDC,0xE7,0x75,0xA3,0x8D,0x08,0xBD,0xA9,0xC8,0xFC,0x5E,0x73,0xDE,0x38, + + 0xF0,0xCC,0xD4,0x77,0x63,0x02,0x41,0xE4,0x6B,0xCB,0xFA,0xFA,0x5B,0x53,0x07,0x03, + + 0x2F,0x51,0x63,0x4B,0xD6,0x51,0x4B,0x90,0x41,0x38,0x63,0x96,0x9A,0x75,0x14,0xD9, + + 0x1E,0xE2,0x4B,0x2C,0xAF,0x7C,0xD1,0xCE,0x6E,0x10,0x17,0x5B,0x5D,0x03,0x98,0x71, + + 0xA0,0x1D,0x0E,0xE4,0xCB,0xDC,0x0C,0x3C,0x40,0x0B,0x18,0x23,0x8B,0x9E,0xBA,0xF4, + + 0x4E,0x9E,0x96,0x04,0x35,0x6E,0x11,0x4B,0xC8,0xCA,0x86,0x24,0x75,0xB0,0x77,0xC8, + + 0x80,0x89,0xFF,0x16,0x6A,0x4D,0x1C,0x5E,0x49,0x49,0x0D,0x5C,0x09,0x44,0xAD,0xA1, + + 0xC5,0xBE,0x97,0x6D,0x4E,0xF1,0xAB,0xD5,0x5A,0x92,0x42,0x35,0x6C,0x9E,0xF4,0x85, + + 0xF8,0x6B,0x40,0xA4,0xCD,0xD1,0x0C,0xC5,0x9F,0xDB,0x61,0x15,0xF2,0x79,0x14,0xD6, + + 0xDE,0x10,0xFA,0xEB,0xDC,0xF1,0xD5,0x8C,0xF2,0x58,0x6C,0xC7,0x19,0x5A,0x5E,0x5D, + + 0x51,0x3D,0xDD,0xE3,0xD5,0x26,0xE5,0xAC,0x1B,0xAA,0xA7,0xB0,0x1D,0x92,0x7F,0xD9, + + 0x4C,0xD3,0xD7,0x67,0x26,0x18,0x00,0x19,0xC3,0xD1,0x2B,0x07,0x08,0x54,0x58,0x8C, + + 0xC5,0x97,0x22,0x6C,0xCD,0xF9,0xC9,0xB9,0x54,0x9C,0x8E,0x54,0xD0,0xF5,0x84,0x2F, + + 0x8C,0x46,0xEF,0xF8,0x4B,0xD5,0xAD,0x4B,0xCE,0x99,0x06,0x40,0x6D,0xB4,0x75,0xC0, + + 0x88,0x9C,0x58,0xE9,0xC0,0x45,0x11,0x83,0x60,0x77,0xC8,0x8B,0xCF,0x7B,0x9B,0xF9, + + 0x52,0x16,0x6B,0x61,0x40,0xD9,0xFF,0xAA,0x12,0xD6,0xE6,0x9A,0x02,0x97,0x58,0x28, + + 0x4C,0x9B,0x42,0xAC,0x1A,0xB1,0x5F,0x8D,0xCF,0x23,0x24,0x1D,0x18,0xBD,0x54,0xB8, + + 0xF5,0x9B,0x42,0xFA,0xC4,0xD3,0xCA,0x98,0x9C,0xB8,0x03,0x39,0x86,0x8B,0xF7,0x30, + + 0x2C,0xA2,0x1C,0xE8,0x1F,0x41,0xC3,0x89,0xCA,0xBB,0xCF,0x01,0x52,0xF3,0x42,0xBC, + + 0x0E,0x09,0x8F,0x95,0x5E,0xB2,0x47,0x3C,0x31,0x42,0xC4,0x71,0xDB,0x52,0xD6,0x31, + + 0xA1,0xFF,0x40,0xD0,0xAB,0xFB,0xA8,0x1B,0x34,0xB5,0xAE,0x8C,0xDD,0xD6,0x98,0xE3, + + 0x8D,0x0C,0xB6,0xBD,0xF1,0xA0,0xBF,0x88,0xA8,0xB0,0xC2,0x36,0xC3,0x6B,0x3F,0xB5, + + 0xAE,0xDD,0x81,0xF4,0x33,0x62,0x06,0xA5,0x9F,0x16,0xAA,0x55,0x50,0x7D,0xF6,0x36, + + 0x20,0x42,0x6A,0x91,0x9B,0x3D,0x41,0x38,0x43,0x5F,0x19,0xC8,0xD9,0xCE,0x70,0xB1, + + 0x78,0xD1,0xBA,0xA4,0x56,0xFF,0x90,0xB4,0xF9,0x06,0xE8,0x14,0xE6,0x6D,0x1D,0x23, + + 0x39,0x6B,0x49,0x27,0x3D,0x84,0xFC,0x12,0xA8,0x46,0x83,0x74,0x33,0x9A,0x1F,0xFD, + + 0xA0,0xF2,0x3E,0xB8,0x6D,0x22,0x15,0x57,0xB0,0xE9,0xC3,0x16,0xA6,0xD9,0x2F,0xFC, + + 0x82,0x47,0x1F,0xAA,0x7A,0x64,0xED,0x13,0x28,0x64,0x26,0x0F,0xB1,0x98,0x79,0x2F, + + 0xA9,0xB7,0x42,0x8C,0x72,0xD9,0x97,0x4A,0x4E,0xA2,0x47,0xEB,0x92,0xB9,0x69,0x3C, + + 0x7A,0x09,0xB4,0xB5,0x1F,0x0B,0xB0,0x88,0xE8,0xCE,0xD8,0xCF,0x67,0xC4,0xEF,0x76, + + 0x52,0xD7,0x7C,0x73,0xEA,0xF5,0xA4,0x2B,0x90,0x4C,0x9B,0x3C,0x31,0xBB,0x54,0x15, + + 0x8F,0x4B,0x63,0x99,0x9B,0xFC,0x55,0xAC,0x28,0xF4,0xCA,0x9D,0x78,0x38,0x7E,0xA1, + + 0xE3,0xFD,0x94,0xF8,0xED,0xF8,0x32,0x3E,0x28,0x41,0x12,0xEC,0xE2,0xC1,0xE6,0xDC, + + 0x0D,0x47,0x19,0x5A,0xD3,0x9E,0xF6,0x0B,0x25,0xCB,0xE4,0xC1,0x2D,0x2F,0x1B,0x3D, + + 0x8C,0x2C,0x13,0x52,0xB4,0x8A,0x49,0xB8,0xE9,0xCD,0xDB,0x50,0x31,0x2A,0x8B,0x8C, + + 0x61,0x4D,0x6F,0xD9,0x95,0x2C,0x5D,0x0A,0xAD,0xC9,0x9B,0xE8,0x24,0xC2,0xF9,0xFB, + + 0xBE,0x8D,0xF9,0x78,0x30,0x9B,0xA0,0xDF,0xC3,0xDB,0x80,0x20,0x7E,0x8A,0x1E,0x57, + + 0xCA,0x55,0xBE,0xA4,0x65,0x73,0x4F,0x32,0xDD,0x53,0xE4,0x93,0x88,0x7E,0xE4,0xA5, + + 0xC8,0x1F,0xFD,0x81,0x59,0x21,0x91,0x90,0x92,0xFD,0xF5,0x9B,0xD2,0xCE,0x37,0x21, + + 0x30,0x52,0xC9,0xBC,0xB7,0x31,0x25,0x4E,0x4D,0x5E,0xC3,0x08,0x05,0xD8,0x7A,0x74, + + 0x54,0xBB,0x96,0xDB,0x58,0x5A,0x90,0x1F,0x8B,0x77,0x06,0xC3,0xD3,0xDB,0x6A,0x69, + + 0xAF,0xB8,0xF2,0x70,0xF9,0x36,0x8F,0x0E,0xE3,0x07,0xE4,0x33,0xB1,0x65,0x95,0xD2, + + 0xD4,0x52,0xFB,0x60,0x78,0x15,0xC2,0x1E,0x0B,0x55,0x03,0x67,0x63,0x31,0x18,0x55, + + 0xA1,0x28,0xC5,0xC1,0x7B,0x34,0x63,0x50,0x00,0x5C,0xD5,0x75,0x7C,0xDA,0xBE,0x72, + + 0x38,0x55,0xD0,0xB1,0xC7,0xE5,0x76,0x92,0xC8,0xA4,0x9E,0x0C,0x13,0xCB,0xED,0xBC, + + 0xF5,0xA8,0x9A,0x18,0x3B,0xEE,0x44,0xBC,0xE6,0xFF,0xBE,0x85,0x98,0xD6,0x78,0xCE, + + 0x76,0x87,0xD4,0x73,0xBE,0x18,0x6F,0x8E,0x15,0x55,0xA4,0x5C,0x8E,0x7F,0x28,0xA5, + + 0x35,0xEA,0x89,0x35,0x39,0xD7,0x4C,0xF9,0xE5,0xF0,0x4E,0x39,0xF7,0x4E,0xBD,0xEF, + + 0x8B,0xBD,0x16,0xDF,0x10,0x5F,0xD2,0x9B,0x48,0xD3,0x00,0x7E,0xBC,0xD1,0x9C,0x64, + + 0xC0,0x9E,0x1A,0xAF,0x59,0x9B,0x81,0x07,0xEB,0x0D,0xD8,0x0C,0x4E,0x3F,0x91,0x3A, + + 0xC0,0xB3,0x6B,0xBE,0xD0,0x98,0x0F,0xFD,0x9D,0xA1,0x05,0x7F,0xFA,0x76,0xE3,0xAA, + + 0x85,0xB9,0x1F,0x1D,0xFF,0x9B,0x61,0x58,0x83,0xBC,0x1B,0x96,0x0F,0xBC,0x8D,0xC5, + + 0xF9,0xC1,0xA6,0xAF,0x94,0x8C,0xCF,0xA6,0x03,0xFF,0x8A,0xD5,0x62,0xA2,0x3A,0x02, + + 0xFA,0x0C,0xF9,0x51,0xDF,0x32,0x0A,0xCD,0xC7,0xB4,0x38,0x45,0x63,0x64,0x41,0x54, + + 0x11,0x8F,0xFF,0xAF,0x9C,0x0F,0x8E,0xD2,0x67,0x82,0x75,0x0C,0xBF,0xED,0xFD,0x37, + + 0x07,0xBF,0xE1,0xB3,0x7C,0x52,0x79,0x40,0x66,0xCC,0xAB,0x97,0x3E,0xA7,0x24,0x74, + + 0x00,0xA6,0xD8,0xB5,0x74,0xC1,0x70,0xA2,0x0A,0x49,0xE7,0x5F,0xAD,0x69,0x97,0x3D, + + 0x7B,0x2A,0xB0,0x53,0xFE,0x26,0x58,0x63,0x24,0xBA,0x97,0x05,0x23,0x64,0x65,0xAC, + + 0x80,0xE4,0xD9,0xB4,0xFC,0x29,0x0F,0xD7,0x2D,0x25,0x25,0x9D,0xD2,0xA6,0x3D,0x3D, + + 0xF1,0x28,0x93,0xB7,0xD3,0x7C,0xB9,0xF6,0x7E,0x6A,0x06,0x88,0x36,0x64,0x9E,0x68, + + 0xCE,0x88,0xFA,0x06,0x1A,0x8A,0x86,0x55,0xEF,0xCC,0x8C,0xCC,0x3E,0x3D,0x05,0x65, + + 0xD4,0xC8,0x8A,0x0B,0xFC,0x16,0xFA,0xEE,0xF6,0xCF,0x6B,0x4D,0x6B,0x6E,0xB3,0x51, + + 0x79,0x16,0x0F,0x8B,0xD3,0x5F,0x71,0x59,0x37,0x35,0x73,0xAB,0x07,0x4A,0x13,0xF5, + + 0x21,0x86,0x1C,0xB7,0x9B,0x61,0x8E,0xBB,0x2C,0xC4,0xA1,0x4C,0xDB,0xC9,0x32,0x39, + + 0x0F,0x3D,0x1D,0xB3,0xE1,0xA8,0x26,0x98,0x6D,0xAC,0x0D,0xEA,0x5C,0xD9,0x39,0xDE, + + 0x0D,0x6F,0x3C,0xA1,0xF6,0x2E,0xF8,0x86,0xB0,0x36,0x5A,0x0D,0x21,0x3E,0x1D,0x4D, + + 0x67,0x7D,0x62,0x3C,0xF4,0x0F,0x4D,0xCB,0x2D,0xC5,0xCD,0x2F,0xA2,0x41,0x7D,0xEE, + + 0x64,0xEC,0xBD,0xEB,0x68,0x7B,0x84,0x79,0xA3,0x8D,0x85,0x78,0x7E,0x40,0x1E,0x71, + + 0x12,0xFC,0xFA,0x2E,0x3C,0x1D,0x67,0xA6,0x0F,0xE3,0x74,0x27,0xF7,0xB2,0x16,0x00, + + 0x25,0x4E,0xA4,0x92,0x9C,0x0A,0x5A,0x0A,0x66,0xC2,0x82,0x1A,0x97,0x78,0x1F,0x10, + + 0xD8,0x6D,0xF4,0xC0,0x7E,0x03,0x31,0xD0,0xDE,0xBE,0x75,0x7C,0xBC,0xA1,0xED,0x12, + + 0x26,0xD1,0x01,0xE4,0x87,0x15,0x03,0x8E,0xC6,0x43,0xC5,0x33,0xFF,0xD2,0x30,0xB1, + + 0x00,0x32,0xB6,0x62,0xFE,0x17,0x8B,0x91,0x44,0x77,0x43,0x53,0x52,0xF8,0x3C,0x76, + + 0xEF,0xB6,0xCA,0x6B,0xBB,0xF7,0xDB,0x53,0x8E,0xDD,0x58,0xB4,0xF3,0xF9,0x35,0x03, + + 0xE2,0x32,0x31,0xD4,0xB7,0xF2,0xA7,0x1D,0x32,0xD5,0xCD,0xA5,0x55,0xFA,0xB9,0x14, + + 0x4E,0x34,0x29,0x77,0x5E,0xF4,0x6A,0x00,0x63,0x7A,0x95,0x06,0x74,0xF5,0x66,0x34, + + 0xC5,0xCB,0xF5,0x71,0xD5,0xAB,0x56,0xE0,0x70,0xD5,0x76,0x2B,0x23,0xFE,0x6E,0x24, + + 0x65,0xCA,0x90,0x26,0x5D,0x99,0xF0,0x09,0xED,0x39,0x0A,0xC5,0xDE,0x52,0xE7,0x0A, + + 0x80,0xD8,0xB1,0x37,0x57,0xC9,0xF7,0x2F,0xEB,0x98,0x84,0x8D,0x25,0xF5,0x11,0x37, + + 0x4F,0x12,0xD0,0xED,0x93,0x24,0x08,0x12,0x0C,0x24,0x68,0x85,0x96,0xF3,0x00,0x6F, + + 0xC7,0x1F,0x9E,0xE9,0xD7,0xDF,0xA1,0x52,0x85,0xB8,0x36,0xAB,0x14,0xF2,0x52,0xAB, + + 0x86,0x67,0xEB,0xCF,0x0D,0x98,0x46,0x09,0x41,0x52,0x5A,0x3C,0xDC,0xF3,0x01,0x6F, + + 0xAD,0xDE,0x9F,0xDE,0x84,0x92,0x4F,0x18,0xC8,0xBB,0x9F,0x2D,0x7A,0xF0,0x58,0x72, + + 0x53,0x8C,0x73,0x5D,0x7A,0x3C,0x27,0xFE,0x06,0x9C,0xC7,0x5B,0xFF,0xFF,0x60,0x4A, + + 0xDC,0x42,0x6C,0x9B,0x11,0x22,0xA5,0x44,0xF4,0x69,0x66,0x46,0x31,0x40,0x30,0x72, + + 0xFE,0x07,0x26,0x77,0xB0,0xDE,0xD8,0xE1,0xC4,0xCC,0xF8,0x7E,0x89,0x6C,0x52,0x6D, + + 0x02,0xEE,0x3E,0x65,0xC8,0x24,0x4E,0xA1,0xB3,0x35,0x89,0x21,0xD9,0x4E,0x20,0x0E, + + 0x20,0x6D,0x32,0xD2,0x4F,0x2B,0x40,0xE0,0x66,0x01,0x81,0xE0,0x53,0x7F,0x46,0x31, + + 0x20,0xF6,0xA2,0x46,0x13,0x64,0x28,0x12,0xEE,0x4B,0x37,0xA4,0x5E,0xCF,0x4C,0xC0, + + 0x30,0x9E,0x90,0x50,0x3A,0x93,0xEC,0x92,0xA8,0x5F,0x82,0x8B,0xD1,0xC9,0x94,0x32, + + 0xEB,0x81,0xDD,0xDE,0x7B,0x5F,0xE5,0x83,0x6E,0x49,0x4E,0x9A,0x57,0xD4,0xF1,0x81, + + 0x8F,0xF8,0x21,0xCC,0xB1,0x67,0x39,0x3B,0x49,0x05,0x6A,0x97,0x7F,0x68,0xE5,0x48, + + 0x04,0x85,0x06,0x73,0x3B,0x38,0xD8,0x95,0x7B,0x4C,0x62,0x4E,0xA7,0x06,0xCA,0xD9, + + 0xE5,0x08,0xD9,0x70,0x99,0x49,0x07,0x5E,0x6A,0x09,0x25,0xDC,0x49,0x72,0x7D,0x78, + + 0x69,0xF5,0xE3,0x47,0x7E,0x68,0xAB,0xC9,0x84,0x51,0xF1,0x30,0xDB,0x00,0xCF,0x1C, + + 0x8F,0xE2,0x07,0xD4,0x89,0x86,0xB3,0xA1,0xEB,0xB9,0x0D,0x5B,0x3B,0x4B,0xB5,0x49, + + 0x16,0xA1,0xC7,0xA4,0x96,0xE1,0x01,0x8C,0x2A,0xB0,0xB2,0x3F,0xF8,0x63,0xD5,0xDA, + + 0x9A,0x21,0x82,0x94,0xF2,0x17,0x73,0xFC,0x75,0x60,0x82,0x79,0x30,0x77,0x8D,0x79, + + 0x0B,0xA1,0xBC,0xB0,0x92,0x6C,0x2D,0x6F,0x2B,0xCD,0x67,0x8F,0x33,0x74,0x6B,0xC9, + + 0x62,0xA6,0xD1,0x5C,0xB8,0x1E,0x3B,0x33,0x45,0x0D,0xDF,0xF9,0x8C,0x3A,0x86,0x04, + + 0x01,0x5D,0x74,0xE6,0x13,0x12,0xFC,0x3D,0x8B,0xBA,0x54,0x71,0x5F,0x6B,0xC3,0xB4, + + 0x03,0x50,0x4C,0x2C,0xD5,0xEA,0x43,0x90,0x67,0x11,0xFC,0xFE,0xD7,0x7C,0xC5,0xF1, + + 0xBD,0x50,0xE5,0xCF,0x56,0x3D,0xCE,0xA1,0x93,0x32,0x03,0xC3,0xB2,0x8D,0x89,0x15, + + 0xAC,0x5D,0x23,0x68,0x1A,0x48,0xB0,0x33,0x70,0xF5,0x8F,0x56,0x1A,0x37,0x7A,0xB1, + + 0x43,0x54,0xFE,0x2C,0x46,0x7B,0xE5,0x92,0xE0,0x48,0xD7,0x44,0x9F,0x95,0xF4,0x70, + + 0xC2,0xBE,0x9B,0x50,0x36,0x1E,0xAA,0x92,0x81,0x15,0x70,0x66,0x3B,0x7D,0x1D,0x2C, + + 0x91,0x8D,0xE3,0xB0,0xA1,0x32,0x21,0x03,0x60,0x4A,0xB5,0xB2,0x0B,0x7B,0x2D,0x9B, + + 0x2A,0x9C,0x0D,0xF0,0x54,0x9A,0x9D,0x73,0x72,0xE3,0x1E,0x87,0x18,0x0E,0xDD,0x37, + + 0x57,0x87,0xC6,0x77,0x3E,0xC2,0xAD,0x4A,0xC4,0xA5,0xAC,0x1C,0xB5,0xD7,0x34,0x63, + + 0x2F,0x23,0xEC,0x9D,0x38,0x89,0x0C,0xB8,0x9E,0x4B,0xB7,0x1A,0xD8,0xF9,0xB2,0xED, + + 0x1C,0x33,0xE6,0xFE,0xA3,0x54,0x6F,0x41,0xCF,0x17,0x33,0xD2,0x5B,0x7C,0xBC,0x1D, + + 0x9A,0x1B,0xB5,0x75,0xD5,0x74,0xA7,0x09,0xED,0x5D,0xE7,0x3F,0x68,0x9C,0x6D,0x2A, + + 0x86,0x91,0x43,0xAC,0x36,0xB1,0x6E,0x17,0xE8,0xB0,0x3E,0x74,0xFF,0x9C,0x76,0x26, + + 0x87,0x10,0x76,0x2F,0x28,0x3B,0x16,0xE9,0x6D,0xCE,0x26,0x14,0x23,0x32,0x3F,0x4B, + + 0x3B,0x38,0xB9,0xC0,0x89,0xDF,0xEF,0x8B,0x65,0xA8,0x8E,0xF0,0x99,0x3E,0xB0,0x5B, + + 0x3A,0x73,0xEF,0x20,0x1A,0x3C,0xC6,0x98,0x56,0xD2,0xBF,0xB2,0x64,0x70,0x1D,0x86, + + 0x17,0x45,0x6A,0xE6,0x5C,0xBB,0x72,0xCA,0x7D,0x8D,0x20,0x24,0x0E,0xE6,0x50,0xBF, + + 0xEE,0x12,0xF8,0x8E,0x19,0xC9,0x18,0xD4,0xC0,0x33,0xC0,0xC5,0xD1,0x6C,0xE1,0xBB, + + 0x56,0x26,0x81,0x61,0xB5,0x68,0x29,0x3E,0x25,0xD9,0x98,0x81,0x75,0x63,0xF2,0x10, + + 0xFA,0x8F,0xE4,0x15,0x74,0xA5,0x47,0x5E,0x2E,0x29,0xEB,0x60,0x3E,0x87,0x12,0x46, + + 0x4C,0x9F,0x9E,0x8F,0x7D,0x9D,0x23,0x86,0x26,0xEA,0xA0,0x7B,0x5A,0xE5,0x70,0x4E, + + 0x6C,0x7C,0x57,0xB6,0x5D,0xE7,0x51,0xF6,0x79,0xE8,0xA8,0x01,0x07,0xFE,0x3A,0x25, + + 0xC5,0xE6,0x65,0xC3,0xBC,0xE7,0x0F,0x65,0x27,0x45,0xF4,0x36,0x3F,0xDC,0x42,0xD1, + + 0x16,0xAB,0xBA,0xF5,0x7E,0x5E,0x7F,0xBB,0x2E,0xDD,0xDD,0x11,0x28,0xE1,0xFB,0xA5, + + 0x33,0x8A,0x8B,0x11,0xBF,0xAE,0x6B,0x1F,0xEB,0x67,0x8A,0x1E,0x58,0x17,0xEA,0xDE, + + 0x96,0xCB,0xCA,0x54,0x9F,0xA4,0x62,0x02,0x7E,0xCD,0x2C,0x58,0x20,0xE2,0x7C,0x81, + + 0xFF,0xFE,0x8A,0xB8,0xDC,0xA5,0x2D,0xC3,0xF5,0x87,0x89,0x8A,0x2B,0xF1,0x64,0x9B, + + 0xAF,0xE9,0xF3,0x8A,0x1F,0xB7,0x83,0xC4,0xEC,0x0A,0xBF,0x41,0xFE,0x8B,0x38,0x10, + + 0xAD,0xE9,0x19,0xB6,0x1E,0x21,0x00,0x7B,0xD5,0x67,0x5C,0x15,0xFF,0x1D,0xC2,0xC7, + + 0xEE,0x8B,0x39,0xDC,0x8E,0x81,0x64,0xF8,0xDE,0x8A,0x9A,0x29,0xA6,0xE2,0x59,0xA9, + + 0x65,0x27,0xF5,0x3A,0x61,0x33,0xEC,0x31,0x2F,0x61,0x8B,0x6D,0x96,0x63,0x42,0xEC, + + 0x86,0x38,0x93,0x78,0x62,0xA0,0x79,0x99,0xC9,0x15,0xC5,0xB6,0xFF,0x82,0xFD,0x2D, + + 0x1B,0x92,0xFD,0xBA,0x93,0x1F,0x1D,0x29,0xC7,0xB5,0xEE,0xA2,0xD7,0xF4,0x95,0xCC, + + 0xA7,0x95,0x9C,0x14,0xA4,0x17,0xDF,0x30,0xF4,0x36,0xE6,0xB7,0xD6,0x7C,0x8A,0xEC, + + 0x79,0x4E,0x38,0x74,0xDD,0x9B,0x9E,0x41,0xE2,0x39,0x37,0x25,0x65,0xB5,0xE5,0xF1, + + 0xE6,0x63,0x95,0x69,0x19,0xBE,0x05,0x01,0xE1,0x53,0xDD,0xE0,0x50,0xFC,0xDF,0x20, + + 0x8A,0x69,0x5C,0xCE,0xDF,0x5D,0x14,0xA8,0x88,0xDB,0xCE,0x64,0xEB,0xFF,0x54,0x28, + + 0x8B,0x98,0x72,0x1E,0xB5,0xA9,0x78,0xB2,0x6D,0x7E,0x3C,0x02,0x72,0xB7,0x1D,0x41, + + 0x37,0xF0,0x9F,0xA7,0xBA,0x12,0x4B,0x2A,0x69,0x50,0x8D,0x18,0x81,0xB4,0x12,0x51, + + 0x36,0x3B,0x45,0xA5,0x14,0xB1,0x60,0xF6,0x06,0x78,0x36,0x3E,0xD7,0x05,0x59,0x72, + + 0x2C,0x3C,0x59,0x0C,0xAD,0x8E,0x0C,0x42,0xA8,0x97,0x76,0xEF,0xC8,0x05,0x7C,0x1E, + + 0x66,0xDD,0xD1,0x1A,0x79,0x9A,0xBA,0x3E,0x1F,0x80,0xB2,0xFD,0x94,0xC3,0x3B,0x2E, + + 0x64,0xD3,0x9F,0x75,0x10,0xB7,0xF7,0x13,0xA9,0xD0,0xAD,0xAE,0xDD,0xBA,0xF4,0x34, + + 0xD2,0x99,0xB3,0xBD,0x3F,0xA7,0xFF,0x03,0x91,0x04,0xA7,0xBB,0xF4,0xD7,0x5D,0x28, + + 0x82,0x21,0xCF,0x8D,0x9F,0xB3,0x3B,0x02,0x1A,0x93,0x72,0x9C,0x95,0x16,0xDA,0xA5, + + 0x8C,0xF8,0x96,0x5C,0xAE,0x69,0x08,0x18,0x46,0x6B,0x34,0x1C,0x4C,0xF9,0x1F,0xEC, + + 0x5B,0x91,0x53,0xAD,0xF7,0xA4,0x09,0x9A,0x6C,0xC2,0x97,0xA5,0x7C,0x53,0x54,0x39, + + 0x03,0x22,0x2F,0x67,0x99,0xD3,0x26,0xCE,0x4A,0xB1,0x47,0x9F,0xF3,0xF2,0x02,0xE2, + + 0x04,0x7A,0x80,0xF7,0x2E,0x05,0x68,0xA2,0x12,0xA4,0xD8,0xBC,0xB9,0xBA,0x50,0x14, + + 0x88,0x4E,0x90,0x24,0xEE,0xDE,0xFE,0x33,0xFF,0x65,0x34,0xAB,0x52,0x23,0x31,0xE9, + + 0x0A,0xCF,0xF9,0x14,0xB6,0x8F,0x07,0x43,0xEF,0x66,0xD3,0xDA,0x39,0xA1,0xC9,0xAC, + + 0x2E,0xD7,0xB3,0xA5,0x6E,0xFC,0xA5,0x12,0x8D,0x66,0x59,0x61,0xFE,0x0F,0x48,0x5C, + + 0x04,0xCC,0xDA,0x6A,0x33,0x06,0xBC,0x13,0x70,0xB2,0xD2,0x56,0x32,0xF6,0x9C,0xB6, + + 0x13,0xA8,0xD0,0x59,0xFA,0xDC,0x66,0xC5,0x22,0x41,0x1C,0xA9,0xD1,0x79,0x61,0x81, + + 0xCE,0xAB,0xFF,0x38,0xF3,0x51,0xEA,0x11,0x42,0x59,0x11,0xE4,0x0C,0x24,0x1B,0xB7, + + 0x0A,0xEB,0xD3,0x7A,0xB2,0x87,0x38,0x31,0x9C,0x9A,0x77,0x2E,0x70,0x02,0x57,0x17, + + 0x3E,0x4A,0x42,0x58,0x29,0x85,0x04,0x0B,0x6F,0x6D,0xAC,0x80,0x92,0x61,0xBE,0x7A, + + 0xE2,0x1A,0xE8,0x1D,0x1A,0x69,0x90,0x48,0xA0,0x93,0xF8,0x3C,0xB2,0xDA,0x89,0x29, + + 0x63,0xE9,0xD5,0x6D,0xC8,0x44,0x23,0x0A,0x4D,0x08,0xED,0x91,0x31,0x59,0x35,0x79, + + 0x36,0x50,0xBF,0xFF,0x9F,0xE3,0x59,0xC2,0x20,0x88,0xB7,0x68,0x91,0x28,0xAE,0x3B, + + 0x68,0xAA,0xFC,0x31,0xF8,0x7B,0xE2,0x1F,0x44,0xD3,0xED,0x8E,0x31,0x63,0xC0,0x18, + + 0x08,0x4D,0xDB,0xD8,0x15,0xC9,0xCB,0x5E,0xA6,0x2F,0x19,0xF8,0x51,0x9B,0x17,0x3A, + + 0xA8,0x4C,0xC1,0x3E,0xFF,0x2A,0xEC,0xEC,0x31,0xE3,0xD1,0x12,0x3A,0xEF,0x67,0x27, + + 0x62,0x9C,0x34,0xEF,0x13,0x8F,0xA0,0x0A,0xF7,0x2D,0x1B,0xED,0xC3,0x69,0x03,0x04, + + 0x2C,0x53,0x28,0xF7,0x48,0xC6,0x2E,0x10,0x9F,0x12,0x92,0x00,0x13,0xAF,0x53,0x81, + + 0x27,0xD9,0x6F,0x67,0x41,0x73,0xFC,0x70,0x27,0xFC,0xC6,0x4B,0x1B,0x42,0xA6,0xB9, + + 0x7C,0xA3,0xFB,0xBC,0x59,0xA3,0x9F,0x74,0xE6,0x9A,0x83,0x09,0x1B,0x21,0xB9,0x68, + + 0xB1,0x51,0x07,0xE5,0x58,0x90,0x05,0x81,0x16,0xAC,0xE3,0x1C,0x18,0xD0,0x25,0x80, + + 0x26,0x38,0x62,0x46,0xA3,0x18,0x6A,0x45,0xC5,0x44,0xD5,0x82,0xDE,0xC8,0xC6,0x99, + + 0x82,0x9C,0xAC,0xD6,0x4C,0x38,0xF2,0x8E,0xC2,0xD5,0x1C,0x75,0xFB,0x73,0xFE,0x82, + + 0x13,0x54,0xBD,0xE2,0x53,0x39,0x6B,0x51,0x45,0x50,0xAD,0xC2,0x0B,0x79,0x49,0x31, + + 0xA7,0x3B,0x9D,0xB3,0xBF,0x75,0x25,0x75,0xA6,0x6F,0xF3,0xB4,0x52,0x88,0x82,0x2C, + + 0xFC,0xC9,0x9E,0x10,0xD1,0xE2,0x28,0x19,0xE5,0xAE,0xCE,0xA8,0xF1,0xA5,0xBD,0xA0, + + 0x1A,0x59,0x22,0x07,0x3A,0xBB,0xDE,0xEC,0xF7,0xFA,0xB2,0xC2,0x7F,0xB1,0xA0,0xB4, + + 0x41,0xAB,0xC5,0x76,0x51,0xF9,0x1F,0xAD,0x40,0x55,0xA9,0x19,0xDB,0x3A,0xA4,0xBF, + + 0x44,0x79,0x4F,0xC9,0x27,0x98,0x4A,0x4A,0xD7,0x7E,0x7A,0x0C,0xC3,0xD4,0xFD,0xBB, + + 0x58,0xBD,0x56,0xC0,0xB8,0x38,0x96,0x74,0xC5,0xA9,0x62,0x8E,0xF8,0x60,0x8E,0x8C, + + 0x47,0xB2,0x4A,0x58,0x1D,0x0E,0x95,0x84,0xEB,0x1F,0x61,0x1E,0xF9,0xB1,0x7F,0x36, + + 0x43,0x6D,0x18,0xAF,0x9A,0x73,0x86,0xD7,0xD0,0x1C,0x7A,0xB2,0x59,0x1B,0xDE,0xFE, + + 0x0A,0xB0,0xAF,0x4F,0x9B,0x32,0xB3,0x8A,0x89,0xF9,0x09,0x9F,0x04,0x1A,0x20,0x3C, + + 0x3E,0x75,0x7C,0x25,0xB7,0x00,0x9C,0xB9,0x47,0x62,0x8E,0x46,0xAF,0x7B,0xE8,0x17, + + 0x23,0x75,0x16,0x93,0xFE,0xA2,0x47,0x41,0x23,0xAD,0x83,0xB2,0x10,0x2B,0xF0,0xF8, + + 0xF7,0x82,0x71,0x74,0xE4,0xE7,0x0F,0xFF,0xA4,0x1D,0xB1,0x16,0x75,0x1D,0xFB,0x2D, + + 0xBF,0x76,0x97,0x2E,0x9B,0x0C,0x5E,0x73,0xC1,0xE6,0x87,0x83,0xF4,0xE1,0x1A,0xA2, + + 0x0A,0x29,0xBE,0x3B,0x04,0xA0,0x67,0x91,0x24,0x19,0xD9,0x2D,0x8B,0xEB,0x56,0xEA, + + 0x6F,0x88,0xEE,0x24,0xFC,0x5C,0x46,0xC2,0x8D,0x34,0x3C,0x61,0xB5,0x5C,0xB4,0xB1, + + 0xA7,0x34,0xA4,0x38,0x74,0xE2,0x22,0x90,0xE8,0xA8,0x45,0x18,0x75,0xA4,0x96,0x20, + + 0xB9,0xC5,0xC9,0xD7,0x6A,0x20,0x47,0x4F,0xC1,0x0F,0x3A,0xF5,0x46,0x8B,0xF3,0x51, + + 0xB1,0x34,0xF6,0x7D,0x64,0x7D,0x4A,0x59,0x7A,0x39,0x72,0x7A,0xDA,0xE2,0xFA,0x01, + + 0x67,0x32,0x1A,0x69,0x13,0x75,0xAA,0x2B,0x6B,0x64,0x84,0x92,0x25,0x46,0x78,0x0B, + + 0x8A,0xEA,0xB0,0xE7,0x90,0x76,0x4D,0x93,0x39,0xCE,0x36,0xAB,0x99,0x81,0xAD,0x9F, + + 0xC8,0xEE,0x6F,0xD5,0x2E,0x54,0x23,0x0B,0x32,0x34,0x68,0x45,0x5D,0xBA,0xE8,0x7F, + + 0xF9,0xE9,0x46,0x5F,0x75,0x55,0x7A,0x2A,0x70,0x8E,0x32,0xEF,0x0F,0xF7,0x54,0xFF, + + 0x6E,0x89,0x98,0x4C,0x13,0x06,0x2C,0x3A,0x67,0x8F,0x42,0xFA,0x55,0xE9,0x5B,0x0C, + + 0x44,0x0D,0xA6,0x4D,0xD2,0x53,0xF9,0x4B,0xC8,0x06,0x64,0x09,0x29,0xFE,0x12,0x25, + + 0xEE,0x8B,0x74,0xD3,0x99,0xCD,0xF1,0x79,0xCC,0x2F,0xA2,0x5B,0x7A,0x50,0x8F,0x07, + + 0xB7,0x8F,0xF1,0x75,0x0A,0xDC,0x4C,0xB3,0x42,0x7D,0x61,0x5A,0x74,0x5D,0x16,0x61, + + 0x03,0x3C,0x7F,0xE5,0x0F,0x67,0x06,0x36,0x20,0x1B,0x6F,0xC8,0x1F,0xC2,0x5B,0x22, + + 0x70,0x91,0x9B,0x2B,0x6A,0x1D,0x2D,0x93,0xEC,0x2D,0x64,0x96,0xD5,0x5D,0xFD,0xD4, + + 0x67,0x83,0xD3,0x2E,0x3C,0x5B,0x03,0x07,0xC4,0x71,0xC3,0x0E,0x7C,0x1B,0xF1,0xB1, + + 0x50,0x35,0x1B,0xE1,0x97,0xB2,0x20,0x91,0x44,0x96,0xCC,0x64,0xE7,0x48,0xAC,0x86, + + 0x4B,0x4A,0x58,0xA9,0x94,0xB3,0xBC,0xA6,0x7E,0x97,0x84,0x1E,0x53,0xB8,0x5D,0x3C, + + 0x4F,0x25,0xCC,0x80,0x6B,0xB9,0xFF,0xA3,0xE7,0x16,0x5A,0x05,0x5A,0x0B,0xD9,0xB1, + + 0x58,0xF9,0x8F,0xF3,0x16,0x48,0xBE,0x14,0xAF,0x94,0x06,0xFF,0x52,0xEC,0x6E,0x0D, + + 0x4F,0x67,0xA0,0x2A,0x5F,0xF8,0xDA,0x38,0x64,0xD2,0x76,0xFA,0x65,0xF5,0x10,0x3E, + + 0xCF,0x89,0x94,0x2F,0x07,0x16,0xEF,0x29,0x4C,0x76,0x92,0xC0,0x7B,0x31,0x59,0x26, + + 0x47,0x09,0xB1,0x23,0x57,0xE9,0xB7,0x88,0x4F,0x77,0xAD,0xAE,0xDF,0xBA,0x2F,0xDB, + + 0xA9,0xBE,0xFA,0x1B,0xF8,0xFD,0x6C,0xC8,0xD7,0x5D,0xAF,0x3B,0xB8,0x58,0x58,0x62, + + 0xE4,0xED,0x52,0xAC,0xBC,0xA0,0x52,0x87,0x4A,0x57,0xE0,0x6A,0x74,0x77,0x17,0xA9, + + 0x41,0x14,0x51,0x3C,0x0C,0x5C,0xCD,0x53,0x69,0x57,0xFF,0x98,0x4C,0xAC,0x59,0xE7, + + 0xCF,0x9A,0xC9,0x90,0x1D,0xDB,0x73,0x09,0x12,0x8D,0xAE,0xD2,0x5B,0x21,0x4F,0x51, + + 0xAE,0x46,0x57,0x20,0xD4,0xB0,0x00,0xDF,0x06,0x26,0x3F,0x7E,0x9C,0xBE,0xA7,0x3D, + + 0x33,0x53,0x3A,0xFB,0x73,0x73,0x40,0x81,0xC0,0xC0,0x2F,0xA0,0x52,0xD9,0x55,0xF6, + + 0x07,0x43,0x73,0xD3,0xCF,0x29,0xD8,0xB4,0x3B,0x95,0xF8,0xA6,0x71,0x6C,0x5A,0x01, + + 0xB7,0xFA,0x97,0xA5,0x23,0xEF,0x57,0x81,0xC8,0x13,0xEF,0x22,0xF8,0xDD,0x6A,0x93, + + 0x18,0x6E,0xC9,0xE5,0xA7,0x82,0xC9,0xC2,0xEF,0x97,0x62,0x12,0x70,0x65,0x78,0xC2, + + 0xC0,0xC7,0xBE,0x6C,0x14,0x06,0x09,0x58,0xE7,0x4D,0xC3,0x97,0x2A,0xCB,0x30,0x74, + + 0x30,0x34,0x08,0xD5,0x69,0x28,0x76,0xC4,0xE2,0xBA,0x27,0x07,0x63,0x09,0xEE,0xA3, + + 0x2E,0xFB,0x96,0x27,0x79,0x77,0xD1,0x7F,0xF6,0x40,0xC0,0x8D,0xBE,0x2B,0x12,0x51, + + 0xF8,0x07,0xB7,0x78,0x95,0x05,0x27,0x5C,0xF0,0xA6,0x3E,0xB5,0x85,0xCA,0x3A,0xF6, + + 0xA4,0x05,0xD6,0xE6,0xDD,0xF5,0x40,0xDB,0x22,0xC5,0xF0,0x8C,0x5E,0x2A,0xA9,0xB0, + + 0xE2,0x3A,0xDA,0xF6,0xDC,0xD4,0xF6,0xAB,0x63,0x43,0xF8,0x04,0x5F,0xEB,0xA0,0xBD, + + 0x63,0xE9,0x29,0xFD,0xAE,0x8B,0x6D,0x89,0x21,0x49,0xE3,0x6D,0xC8,0x6C,0x51,0xE6, + + 0x62,0x48,0x21,0x0C,0xB3,0x2F,0x57,0x4A,0xEB,0x09,0xC8,0x7D,0xDA,0x6D,0x9F,0xB7, + + 0x3D,0xF4,0x95,0x2E,0xF1,0xBD,0xEA,0xF8,0xBD,0xE3,0xC5,0xE8,0x58,0xD6,0x95,0x4C, + + 0x0D,0x4D,0x0A,0xDD,0x5A,0x20,0x62,0x83,0xC4,0xBB,0xE4,0x54,0x5D,0x6F,0x1E,0xBF, + + 0xFD,0x0E,0x99,0xE0,0xF2,0x3F,0x40,0xEB,0x03,0x3D,0x13,0xED,0xB0,0xD1,0x68,0xA8, + + 0xE6,0xF0,0x34,0xAF,0xBA,0xAF,0x53,0x75,0xF8,0xDE,0x94,0xF9,0xD1,0x2F,0x0C,0x04, + + 0x22,0xF2,0xFD,0xF2,0x36,0x32,0xB3,0x11,0xA8,0x53,0x9C,0xAC,0xF2,0xF6,0xCC,0x4C, + + 0x3B,0xCC,0x73,0x65,0x92,0xB1,0x5C,0xAC,0x9E,0x3D,0x94,0x85,0xF3,0xF7,0xFA,0x05, + + 0xA6,0xF7,0x8D,0x01,0xB2,0xD0,0xC0,0xD2,0xC2,0x10,0x06,0x21,0xB2,0xE1,0x25,0xF3, + + 0x5C,0x1F,0xB3,0x35,0x51,0xB2,0x7B,0x04,0x14,0xF5,0x0E,0x31,0xFF,0xFC,0x1A,0xB5, + + 0x26,0x3D,0x86,0x37,0x4A,0x9F,0x6E,0x13,0x5A,0x52,0x4A,0xF0,0x56,0xD9,0x8C,0xC4, + + 0x3F,0x54,0xF6,0x27,0x0B,0x33,0xCD,0x18,0x0F,0x18,0xE6,0x07,0x43,0xFE,0xE9,0x45, + + 0xAC,0xF2,0x5B,0xD4,0x9B,0x5A,0x7B,0x4C,0x43,0xF9,0x4B,0x17,0xD3,0xC7,0x3C,0x6D, + + 0x8F,0x40,0xE3,0x61,0x12,0x98,0x1F,0x02,0xDF,0xFC,0xC8,0xC4,0xC3,0x68,0x3E,0xFB, + + 0x0A,0x5A,0x94,0x08,0x3A,0x38,0xC4,0x68,0x24,0x8C,0x9E,0xB4,0xFA,0xFE,0x35,0x1C, + + 0x7E,0x2B,0xB0,0x3C,0xD9,0xB8,0x4E,0x00,0xE6,0xA4,0xA6,0x23,0x88,0xAF,0x47,0x95, + + 0xAE,0x38,0x78,0x7C,0x1B,0xBA,0xC5,0xB6,0x86,0xFE,0x47,0xCF,0x0B,0x1F,0xCF,0x09, + + 0xC3,0x15,0x1D,0x19,0xBB,0x2C,0x79,0x10,0x1C,0xFD,0x97,0x3C,0xFF,0x39,0x4E,0xEC, + + 0xAB,0xC6,0x57,0x3F,0x06,0x93,0xC8,0xED,0x43,0x30,0x6C,0x13,0x99,0x75,0x47,0xA9, + + 0x07,0x4A,0xF6,0x23,0xD2,0x2C,0x3E,0xAB,0x55,0x50,0xD6,0x78,0x79,0x9F,0xD7,0xB0, + + 0x87,0x7F,0xD6,0x4F,0x73,0xDD,0x0E,0xC8,0x4F,0xA1,0x92,0x92,0xFC,0x7C,0xD5,0xFD, + + 0x68,0xA6,0x63,0x42,0xB8,0x4D,0xA4,0x84,0xC8,0xBF,0x20,0x0C,0x58,0xFF,0x5E,0xA7, + + 0x37,0x61,0x4C,0x17,0x36,0x0D,0x70,0x62,0x42,0xC2,0xD2,0x1E,0x52,0x82,0x56,0xB2, + + 0x36,0x60,0x68,0x92,0xE8,0xA7,0xEC,0x4C,0x8F,0x82,0xDA,0x96,0xF4,0x7E,0x99,0x93, + + 0x6F,0xA1,0xF1,0xB5,0xD4,0x9E,0xF7,0xDC,0x49,0x64,0xCB,0x67,0x84,0xE4,0x91,0x54, + + 0x8B,0x7C,0xCB,0x37,0x93,0xE1,0x71,0x26,0x11,0x80,0x0D,0x55,0x0B,0x7E,0x5E,0x3F, + + 0x67,0xD1,0x47,0x7F,0x96,0x64,0xC8,0xD0,0x4E,0x44,0x1C,0xFD,0xE3,0x72,0x72,0xFD, + + 0x26,0xF5,0x96,0x6F,0x97,0x47,0x21,0x4A,0xE2,0x42,0xEF,0x67,0x67,0xE1,0x79,0xC2, + + 0x6F,0x7F,0xB8,0x72,0x33,0x24,0x56,0x5B,0x46,0x56,0xF9,0x62,0x1E,0xF7,0x57,0x2E, + + 0xE6,0xF2,0xD3,0xA4,0xAF,0xA1,0xF9,0x67,0x45,0x6B,0x90,0x08,0x95,0x48,0x1C,0xAA, + + 0x83,0x7E,0xAC,0x8C,0xDE,0xE9,0x95,0x8F,0x84,0xCB,0x51,0x6E,0x2E,0xEE,0x30,0x1B, + + 0x2E,0x11,0xD2,0x6C,0xF6,0xAA,0x6C,0x44,0x87,0x4A,0x0E,0x5C,0xDF,0x6F,0x2B,0xCF, + + 0x65,0x7B,0x0C,0xED,0x30,0x57,0xE2,0xEC,0x31,0x6C,0xD1,0x0B,0x7D,0x35,0x15,0xBB, + + 0x8B,0x89,0xF1,0xB3,0xF5,0xA8,0x33,0x2E,0x19,0x48,0x6B,0xBB,0xDB,0xEC,0x7A,0x5B, + + 0xE7,0x75,0xCC,0xE3,0xBF,0x03,0x21,0x08,0xA5,0x5D,0x61,0x9F,0x33,0x2C,0x14,0x73, + + 0x3C,0x6C,0x7F,0x79,0xBE,0x02,0x40,0x89,0x77,0xCB,0xDA,0x7A,0xBE,0x12,0x11,0xE5, + + 0xDA,0x03,0x72,0x68,0x3F,0x01,0xD0,0x52,0xE7,0xA6,0xD3,0x76,0xA1,0xCE,0xD3,0xCB, + + 0x64,0xDE,0xF8,0xB7,0xF3,0xE2,0x55,0xCF,0x4F,0x0F,0x3B,0x5F,0xDF,0x44,0x1C,0x7D, + + 0xA7,0x9D,0xA2,0x26,0xDD,0xB3,0x65,0xE2,0x28,0x04,0x0B,0x24,0xB6,0xF3,0x8F,0x22, + + 0xF9,0x32,0x3B,0x76,0x6F,0xAA,0x6C,0x0B,0x2D,0xD2,0xDE,0x12,0xA8,0xFE,0xDE,0x07, + + 0xAF,0x58,0xD7,0x97,0x7F,0x1F,0x64,0xBC,0xDE,0x76,0x75,0x23,0xBD,0xF4,0xC1,0xE0, + + 0xCF,0x35,0x3B,0xF1,0x4A,0xF1,0x1D,0x99,0x04,0x7C,0x09,0xC8,0x56,0xB1,0xF0,0x74, + + 0x5B,0xD5,0xDA,0xEB,0x30,0xB6,0xD7,0xCB,0x0D,0xC5,0xCA,0xCE,0x96,0x75,0xB2,0xD2, + + 0x27,0xF4,0x2C,0x56,0x6C,0xF7,0xEE,0x94,0x12,0xDE,0x03,0x85,0x47,0xB7,0x4D,0x37, + + 0x8A,0x07,0x66,0x38,0x5F,0xA7,0x71,0xE1,0xF8,0xCD,0xE5,0x63,0xF4,0xF6,0xC1,0xA1, + + 0x4C,0xA6,0xAD,0x66,0x3A,0x41,0x3D,0x80,0x9E,0x50,0xBD,0x51,0xBF,0xE6,0xF2,0xF9, + + 0x4E,0x3E,0xE6,0xD7,0x3A,0xDA,0x66,0xB9,0x4E,0xFB,0x76,0xD1,0xFE,0x7E,0x7C,0x3E, + + 0xE5,0x3A,0x81,0x7C,0x91,0x04,0x3C,0x7A,0x09,0x52,0x01,0x5C,0xFF,0xC5,0xF7,0x4B, + + 0xBC,0x3E,0x68,0x0D,0x7E,0x39,0x09,0x0A,0x61,0x5C,0xE5,0xF0,0x5F,0x9F,0xFB,0x99, + + 0xE5,0x3F,0xD7,0x6E,0x1E,0xFB,0xEE,0x8A,0xC7,0xC4,0x03,0xDD,0x02,0x9E,0x18,0xE6, + + 0xAC,0x30,0xDD,0x50,0x3D,0xDC,0xF2,0xE7,0xEC,0x70,0xC8,0xC6,0x9C,0x3C,0x40,0x77, + + 0x8E,0x42,0xFF,0xDC,0xA8,0xBB,0x20,0xD2,0x6B,0xD9,0x68,0x0F,0x02,0x02,0xB5,0xA9, + + 0x51,0x98,0xC1,0xE7,0x82,0x1E,0x24,0x89,0x05,0xEF,0x1D,0xCB,0x1F,0x51,0xC3,0x44, + + 0xAC,0x7F,0xC1,0x6A,0x1E,0x10,0x79,0x89,0x04,0xEE,0xA6,0xCA,0x5A,0x93,0x62,0x05, + + 0x03,0x40,0x40,0x35,0xD5,0x62,0x70,0x76,0x7B,0x9D,0xAE,0x10,0x73,0x25,0x54,0x62, + + 0xEA,0xA0,0x8E,0x90,0x4D,0xDC,0x78,0x66,0x7A,0x4C,0xA6,0x5C,0xDC,0xE7,0x35,0xB7, + + 0x86,0x4A,0x8E,0xE6,0xB0,0x62,0x69,0x06,0x3D,0x4D,0x97,0x14,0x50,0xB4,0x77,0x25, + + 0x7D,0xC2,0xA9,0xFF,0xEE,0xBF,0xB5,0xB4,0x62,0x26,0x9D,0x75,0xF9,0x65,0x80,0xD2, + + 0x04,0x46,0x00,0xC0,0xD0,0x66,0x94,0xC8,0x44,0x46,0x94,0x25,0xBB,0xB5,0x4C,0x52, + + 0x07,0xFE,0xF0,0xAF,0xEE,0x9C,0x23,0x57,0xE2,0xFA,0x4D,0x50,0xBA,0x34,0xBF,0x01, + + 0xC2,0xFD,0x81,0xB2,0x61,0x43,0x97,0xE5,0xC0,0x49,0xA9,0x74,0xA6,0x4A,0x49,0x4E, + + 0xA1,0xDC,0x91,0x51,0x66,0xBE,0xE6,0x08,0xE0,0x07,0xCF,0x4D,0xBB,0x6A,0x58,0x59, + + 0x74,0xA7,0x59,0x0C,0x1E,0x70,0x2A,0xAD,0xEB,0xC5,0x38,0x9C,0xF9,0xEF,0x74,0x1F, + + 0xE8,0x06,0xB0,0xEF,0x46,0xD2,0x3B,0xBC,0x47,0x22,0x05,0x38,0x0F,0xB6,0xA3,0x7B, + + 0xEA,0xA6,0x02,0x89,0xB1,0x47,0x6D,0x55,0x4A,0xE6,0xDD,0x39,0x10,0xF3,0x51,0x71, + + 0xF5,0xA4,0x3A,0xE3,0x9F,0x73,0x7B,0x6A,0x88,0x46,0xA5,0x45,0x99,0xC4,0x6C,0xB5, + + 0x34,0x77,0x9A,0x48,0xA6,0x2F,0xE9,0x10,0x69,0x0C,0xC0,0xF1,0xB1,0x28,0x85,0xD2, + + 0x7C,0xA1,0xD1,0x62,0x35,0xD8,0xC7,0x18,0x35,0x98,0x7E,0x58,0x68,0xB6,0xC1,0xB0, + + 0x75,0x4C,0xFD,0xED,0xA7,0x27,0xE6,0x54,0x23,0xBF,0xE9,0xDD,0x47,0xC1,0x94,0xED, + + 0xB4,0xAF,0x99,0xD9,0xD9,0x7D,0x0F,0x46,0xED,0x0D,0x61,0x4D,0xBA,0xC0,0x7C,0x68, + + 0x18,0x5D,0xF9,0x7F,0xE1,0xED,0x2C,0x22,0xA9,0xD3,0xF4,0xF2,0x4B,0x7D,0x5C,0x14, + + 0x2B,0xCE,0x2C,0x64,0xF3,0x73,0x5C,0xBA,0x67,0x13,0x3B,0x9D,0xA1,0x20,0xFE,0x89, + + 0x05,0x09,0xAE,0xB5,0x90,0x9D,0xD5,0x25,0xF6,0x10,0x76,0x81,0x24,0x63,0x6D,0xC7, + + 0xCF,0x1C,0xC9,0x94,0x0E,0x9E,0xE8,0x76,0xE7,0xF3,0xBA,0x98,0x6D,0xE2,0x84,0x45, + + 0x10,0x56,0xDB,0xB7,0x4B,0xB3,0xC1,0x86,0x9D,0x38,0xAA,0xE3,0x56,0xFF,0x87,0x59, + + 0xF7,0x36,0xEC,0xF4,0xDA,0x8C,0x06,0x44,0x1F,0xFA,0x7C,0x86,0x11,0x09,0x05,0x54, + + 0x5D,0x54,0xC1,0xD5,0x81,0xF7,0x37,0xF0,0xE1,0xE6,0x32,0xD4,0x8E,0xD9,0xEA,0x75, + + 0xA5,0x55,0xBF,0xD1,0xE5,0x2C,0xFD,0x83,0x81,0xFB,0xA3,0xF2,0xD7,0xDC,0xB2,0xF7, + + 0x8B,0x5A,0x14,0xBD,0x99,0xC7,0x11,0xE8,0x64,0xF3,0xAC,0x5F,0x01,0xD7,0x16,0x9C, + + 0x81,0x2F,0xD4,0xFB,0x45,0x96,0x97,0x3C,0x6B,0xFA,0x9F,0x5A,0x92,0xDA,0x56,0x67, + + 0x55,0x95,0xB9,0xBC,0x96,0xE5,0x8C,0xA8,0xEE,0x58,0x0E,0x45,0xC4,0x35,0xCF,0xC5, + + 0xEE,0x11,0x2F,0x6D,0x28,0xE8,0xDF,0x3D,0x9B,0xA4,0x38,0xBB,0x2D,0x1F,0x20,0x4C, + + 0x28,0xBA,0xD1,0xCE,0x74,0x91,0x28,0xEF,0x83,0x8D,0xAE,0xF1,0xBA,0xB3,0x0E,0x4D, + + 0xD4,0x5F,0xC8,0xB0,0xD2,0x64,0x5C,0x1E,0x6D,0x5F,0x59,0xEE,0x5F,0xD2,0x87,0x4C, + + 0xA3,0x5C,0x97,0x7F,0xB2,0x9C,0x2F,0x01,0xD6,0x13,0xE9,0xD0,0x91,0x71,0x84,0x50, + + 0x7F,0x7C,0xBD,0xDC,0xFB,0x24,0xEF,0x7D,0xE5,0x77,0x7B,0x9F,0x0C,0x1A,0x80,0x70, + + 0x66,0x2C,0x21,0x74,0xFF,0x01,0x50,0x71,0x49,0x82,0x2F,0xCE,0x38,0xAD,0x50,0x03, + + 0x61,0x2C,0x10,0xE9,0x98,0x0C,0x19,0xB0,0x8C,0xE9,0xD8,0x7C,0xDC,0xEE,0x5F,0x04, + + 0xE7,0x7D,0xDF,0x33,0xA7,0x43,0xF1,0xAF,0xC2,0xC0,0xCF,0x52,0x3D,0x1B,0xBB,0xF3, + + 0x81,0x23,0x3B,0x88,0x7C,0x02,0xF9,0xB7,0x33,0xAF,0x0D,0x45,0x76,0xA2,0x3F,0xBD, + + 0x00,0x7E,0x86,0xE2,0xE3,0x02,0x32,0xEE,0x8C,0x47,0x50,0x14,0x34,0x98,0x36,0x6E, + + 0x0F,0x28,0xBA,0x67,0xB6,0x5A,0x2C,0x01,0x61,0x64,0x6F,0x47,0xF6,0x44,0x00,0x31, + + 0x6D,0x37,0xB5,0x07,0xC1,0x0B,0xCA,0xF0,0xE8,0xCE,0x8F,0x60,0xF2,0x4B,0x7A,0xC3, + + 0x78,0x2A,0xD7,0xF2,0xB9,0x78,0x41,0x8C,0x2E,0xE4,0xC1,0x47,0x7A,0x48,0x34,0x7A, + + 0x2C,0x20,0xC0,0x0E,0x1F,0x22,0xF2,0x3B,0x14,0xC0,0xEC,0x5A,0xA3,0x43,0x6E,0xEC, + + 0x8F,0x25,0xF3,0x1A,0x90,0xCA,0x02,0xC4,0xE1,0xC4,0x71,0xB7,0xD0,0xEF,0x35,0xEB, + + 0x43,0xC8,0x9D,0x3B,0x68,0x0B,0x27,0xA9,0x05,0x85,0x2C,0xD0,0xF8,0xA8,0x27,0xF9, + + 0x21,0x76,0x00,0xBA,0x48,0xB5,0xC4,0xB9,0x04,0x68,0x11,0xD3,0x7C,0x1D,0xF1,0x0D, + + 0xD0,0x84,0x0E,0x31,0xD4,0xEF,0xA6,0x94,0xC1,0x31,0x52,0x1C,0x3C,0xB0,0x7F,0x5C, + + 0xC7,0x9C,0x6A,0x4F,0x75,0x00,0xAE,0xBA,0x4B,0x6D,0x4C,0x4F,0x67,0x42,0xE3,0x28, + + 0x16,0x2A,0x58,0xDC,0xB4,0xA4,0x15,0xDB,0x3B,0x68,0x8D,0x68,0xFA,0x65,0xCF,0xDF, + + 0x8D,0x29,0xBB,0xBF,0xDD,0x0F,0x2D,0x74,0xB3,0xD4,0x5B,0x0D,0xBD,0x93,0xA4,0xA1, + + 0xC2,0x3D,0xDA,0x81,0x81,0xBF,0xF4,0x93,0x8A,0xD8,0x8C,0x58,0xD8,0xFD,0xAC,0x91, + + 0x8A,0x97,0x3C,0xAF,0xDE,0xF5,0xFC,0x33,0x7D,0x93,0x9A,0x9E,0xF9,0xB3,0x38,0xF3, + + 0xAC,0x9B,0x11,0xE8,0x17,0x39,0xB0,0x27,0xE6,0x13,0x4A,0xB4,0xCC,0xB6,0x87,0x26, + + 0x04,0x4C,0xF7,0x05,0xC7,0xF1,0x2B,0x04,0xE6,0xB3,0x7D,0x40,0xF4,0x73,0xC3,0x72, + + 0x20,0x96,0xF0,0xC4,0x7A,0x19,0xB4,0x62,0x28,0x96,0xCC,0x19,0x9F,0x8C,0xAC,0x52, + + 0x69,0xD7,0xB5,0xFE,0xDE,0x64,0x82,0x76,0x25,0xD7,0x84,0xF2,0x9E,0xAD,0xD5,0x47, + + 0xA8,0x85,0x7C,0x75,0xB2,0x16,0xB5,0x71,0xE0,0xD4,0xE3,0x85,0xD2,0x5D,0x2D,0x31, + + 0xA1,0x15,0x15,0xD8,0x95,0xAC,0x75,0xE3,0x98,0xF7,0xCF,0x04,0x73,0x53,0x92,0xE8, + + 0xD3,0x9E,0xE6,0x3F,0xC7,0x33,0x0C,0x59,0x19,0x73,0x69,0xAF,0xFC,0xB8,0x5A,0xDA, + + 0x65,0xDB,0xF4,0xD5,0x4B,0xFB,0x86,0x45,0x6B,0x48,0x7E,0x3A,0xB7,0xF4,0x09,0xCA, + + 0xAA,0xD8,0x1B,0xB2,0x57,0xFE,0x2A,0xAE,0xDF,0x3B,0x68,0xAF,0x20,0x0B,0xEB,0x9F, + + 0x2D,0x9B,0x6F,0x44,0xF5,0x7A,0x0B,0x3F,0xEF,0xB6,0x44,0x98,0x5C,0xB9,0x26,0x8A, + + 0x6E,0x67,0xF5,0xA8,0x7E,0xF3,0x56,0xEE,0x11,0xDC,0x8E,0xE9,0x5A,0x77,0x6E,0x95, + + 0xD2,0xE1,0x6C,0x1E,0x2B,0x48,0x3E,0xDC,0x69,0xBF,0x5E,0x8C,0x1D,0x31,0x63,0xC9, + + 0xAA,0x65,0xD9,0xF6,0x33,0x38,0xDA,0x94,0x73,0x9C,0xCC,0xDE,0x86,0x51,0xAF,0x5B, + + 0x0B,0xDD,0xF8,0xCE,0xC7,0xFD,0x73,0x7F,0xED,0x3D,0x81,0xF8,0xDB,0xFF,0x3A,0xE8, + + 0x56,0x4F,0xBE,0x64,0x78,0x03,0x4F,0x56,0xCD,0x96,0x40,0x35,0x72,0x64,0xA4,0xF8, + + 0x81,0xCC,0xAA,0xFC,0x0F,0x6E,0xE3,0xC6,0x72,0xFA,0xDC,0xDC,0x13,0x2C,0x58,0x91, + + 0x25,0xFD,0xC3,0x16,0xBA,0x2D,0x19,0x31,0x3D,0xC3,0xE5,0x34,0xAC,0x43,0xEE,0xE2, + + 0xFD,0x18,0xB3,0xE6,0xB7,0x8C,0xA3,0xCE,0xF2,0x21,0xF9,0x63,0x34,0x6C,0x47,0xC4, + + 0x5D,0xDD,0x0B,0xD3,0x92,0xC5,0xB7,0x9F,0xB3,0xE2,0x40,0x16,0xB9,0x55,0xFF,0x48, + + 0x05,0xDF,0x0A,0x32,0xEC,0x3E,0x03,0x70,0x45,0x05,0xEB,0x85,0x27,0x67,0x18,0x55, + + 0x7F,0x49,0x01,0x99,0x5C,0x3D,0x29,0x9F,0x3A,0x4F,0xAF,0x49,0xB9,0xD7,0xE6,0xB9, + + 0xC3,0xFA,0x0A,0x33,0x1E,0xD1,0xF4,0x99,0xDB,0x9A,0x86,0xF5,0xA0,0x12,0xA2,0x8C, + + 0x64,0xF4,0x15,0xE4,0x06,0x65,0xEA,0xC0,0x12,0x05,0xCB,0x2E,0xBD,0x0D,0xD4,0xEC, + + 0x55,0xA4,0x6D,0xDC,0x6C,0x6B,0x4A,0x28,0x5D,0x04,0x2E,0xDE,0x6A,0xF9,0x25,0xEB, + + 0xA2,0x11,0x7C,0x7E,0xE4,0x46,0x84,0xC1,0x82,0x05,0xEB,0xC4,0xC4,0x07,0x5F,0x79, + + 0xC9,0xC4,0x1D,0x2A,0x9F,0x8B,0x42,0xBC,0x6E,0x50,0x23,0x1A,0x7A,0x0E,0xBA,0xCC, + + 0x11,0x77,0x8A,0x55,0x1C,0xD6,0xAA,0x60,0xB7,0x03,0x65,0x44,0x5C,0x75,0x13,0xDA, + + 0x4E,0xF2,0x93,0xC0,0xBE,0xAD,0xD9,0x0B,0x53,0xE4,0x1A,0xBC,0x0E,0x67,0xF3,0xC9, + + 0x6B,0x6D,0x98,0xC9,0x87,0xF7,0x0D,0x20,0xCA,0x4A,0x55,0x1F,0x31,0x8F,0x12,0xD5, + + 0x2E,0xD0,0x33,0x5F,0x83,0x34,0xDA,0x99,0x83,0xE4,0x0F,0xF9,0xD8,0xBF,0xFE,0x68, + + 0x6E,0x5F,0xAC,0x83,0xB1,0x74,0xD4,0x95,0xBD,0x4B,0x9B,0xA4,0x1B,0xA8,0x5C,0x8D, + + 0x80,0x7D,0xF1,0xB3,0x90,0x6E,0xDC,0x7C,0xFC,0x4A,0xC2,0x74,0x71,0xDA,0x55,0x99, + + 0xBE,0x14,0xBD,0x6F,0x1C,0x3F,0x4E,0xD2,0x43,0x9D,0x95,0x54,0xAD,0x72,0x54,0x68, + + 0x67,0x28,0x39,0xF7,0x0E,0x2E,0xC0,0xCE,0x06,0xDE,0xD1,0xB5,0x10,0x0C,0x1D,0x28, + + 0xC7,0x6B,0xFA,0xEC,0xBF,0x92,0x2A,0x20,0x72,0x19,0xAD,0x60,0x31,0xBF,0x7E,0xC3, + + 0x02,0x1A,0xAC,0x82,0x5E,0x38,0x9C,0x3C,0x40,0x17,0xA4,0xD3,0x8E,0x7A,0x7B,0xCD, + + 0x3E,0x19,0x0E,0x85,0xBA,0x77,0x2B,0x20,0x1A,0x6E,0x15,0x25,0xA6,0xAB,0x7F,0x2E, + + 0x90,0xF7,0xBF,0xFB,0xC3,0x52,0x12,0x8A,0x0A,0x67,0xDB,0xC0,0x73,0x6B,0x41,0x6F, + + 0x1B,0xAA,0xAE,0xEE,0x81,0x34,0x4F,0x55,0x8F,0x5E,0xE9,0x53,0x7E,0x22,0x0B,0x6A, + + 0x69,0x56,0x75,0x67,0xCA,0xB2,0xDB,0x5E,0xCC,0x52,0x5D,0xDA,0x58,0x39,0xBF,0x76, + + 0x8A,0xF7,0xBF,0xFF,0xC7,0x1A,0x37,0xAF,0x49,0x41,0xCF,0xCC,0xC4,0x61,0x37,0x71, + + 0xD2,0xD4,0xDB,0xAC,0x9F,0x24,0x9F,0xA9,0x4E,0x40,0x83,0xAD,0x10,0x4B,0x78,0x2A, + + 0x8D,0x0C,0xFE,0x7E,0x71,0xDD,0xBA,0x7B,0x7E,0x54,0xE1,0xC4,0x86,0xAD,0x17,0x54, + + 0x8E,0x16,0x5E,0xFB,0x9A,0xBA,0x00,0xF1,0x6B,0x13,0x24,0x8E,0x90,0x9C,0xF8,0x2F, + + 0x1E,0xAE,0x73,0xAF,0x58,0x94,0x9D,0x6D,0xB5,0x54,0x64,0xD4,0xFC,0x17,0xCF,0xF7, + + 0xFB,0x04,0x7E,0x44,0x39,0xF3,0xDC,0x3F,0xE7,0x44,0x1F,0x3D,0xAE,0x75,0x79,0x04, + + 0x40,0x9B,0xD6,0x06,0x14,0xA0,0x6F,0x54,0x77,0x62,0xEA,0x27,0xF7,0xA2,0xA9,0x52, + + 0x41,0x4A,0xCE,0xB7,0xEA,0x0C,0x58,0x92,0x5D,0xCE,0xE3,0x02,0xD7,0x2D,0x81,0x75, + + 0x0B,0x04,0xA1,0x40,0x7D,0xAB,0xC9,0xCB,0xCA,0x8F,0x27,0xA9,0x75,0xF9,0xA8,0xFB, + + 0xEA,0x48,0x79,0xD0,0x4B,0xAB,0x60,0xA2,0x60,0xC5,0x04,0xD5,0xF1,0xEF,0x4A,0xE7, + + 0x28,0x0E,0x23,0x34,0xB1,0xEA,0x7D,0x67,0xC6,0xA4,0xC8,0x98,0xFA,0xE9,0x95,0x69, + + 0x26,0x70,0x28,0x02,0xE7,0xAB,0x7D,0xE2,0xB8,0x80,0x41,0xD3,0x9D,0xE8,0x49,0x1E, + + 0xC7,0x85,0x65,0xC3,0x89,0x5B,0x2F,0x2A,0xCE,0x6B,0x0C,0x29,0x23,0xBA,0xE8,0xD7, + + 0xD8,0xC0,0x81,0x95,0x13,0xA9,0xFB,0xD4,0x26,0xA4,0x84,0x9D,0x23,0x96,0xA5,0x88, + + 0x2E,0xB8,0x22,0x11,0x3A,0x25,0x62,0x37,0xEF,0xD3,0x8A,0x6C,0xFF,0xE4,0x82,0x0A, + + 0xEC,0x92,0x06,0x8D,0x37,0xA3,0x63,0xC3,0xA8,0x3F,0xD2,0xCF,0xDE,0xEB,0x1B,0xE3, + + 0xF7,0x45,0xDD,0xAF,0x75,0xA9,0x71,0x4D,0x33,0xA6,0x17,0x6D,0x58,0xE6,0x6C,0xFD, + + 0xBE,0xB0,0xA2,0x9B,0xF1,0x4E,0x45,0x06,0xFE,0x10,0xEB,0x32,0xCF,0x40,0x3B,0x5A, + + 0xAB,0x73,0x46,0x8C,0xBD,0xA2,0x8F,0x9B,0x17,0xCC,0x45,0x56,0xAB,0x8F,0x34,0x03, + + 0x0F,0xF8,0xB3,0xA7,0xBA,0x02,0xF1,0x72,0xEA,0x62,0x3A,0x7B,0xFC,0x60,0x3A,0x5F, + + 0x2B,0x31,0xDB,0xEB,0x1B,0xCF,0x2A,0x7E,0x6B,0x61,0x95,0x0D,0x25,0x71,0x73,0xDF, + + 0xD0,0x58,0xFA,0xAF,0x60,0xE0,0xF4,0x93,0xD7,0x82,0x26,0x7D,0x68,0xD0,0xCC,0x92, + + 0x22,0x6A,0x1C,0x6D,0x87,0xF2,0xF1,0xC4,0xEB,0x56,0xAE,0xA7,0x55,0xB0,0xD3,0x7A, + + 0x5E,0x5C,0xD1,0x54,0x94,0xAE,0xBB,0x54,0x56,0xA3,0x04,0x56,0x37,0x04,0xF5,0x6B, + + 0xE6,0xDF,0xA3,0x26,0x37,0xBF,0xB2,0xE3,0xE8,0x59,0xB9,0x2C,0xC7,0xA0,0xC1,0x0C, + + 0xA6,0xF3,0x10,0xCA,0x4A,0xEE,0x85,0x4C,0x0C,0xDA,0xBE,0x33,0xAA,0x2A,0xBD,0xB4, + + 0x46,0x6B,0xFB,0xA4,0xC1,0xD1,0x2D,0xF6,0x5D,0xCF,0x6A,0x95,0x1A,0x75,0x97,0xE9, + + 0x33,0x0E,0x71,0xB4,0xC4,0xD0,0x9E,0xB2,0x66,0xCE,0x07,0x89,0x1F,0xF8,0x9A,0xB1, + + 0xC4,0x69,0xDD,0x38,0x34,0x7A,0xCB,0xA4,0xD5,0x8D,0x75,0x18,0x17,0x95,0x6D,0x57, + + 0xA3,0xEB,0xD5,0x2C,0xCA,0xBC,0x24,0x07,0xE7,0xCC,0x02,0x89,0xD9,0x28,0x99,0x9A, + + 0xCB,0x83,0x2D,0x70,0x85,0x00,0x91,0x48,0xAC,0x77,0xEF,0xBE,0x81,0xB7,0x77,0x98, + + 0xC8,0x6F,0xC6,0x98,0xBE,0xDD,0x46,0xA8,0x84,0xD6,0x11,0x56,0x39,0x04,0x60,0xED, + + 0x53,0xF6,0xD8,0xE5,0xED,0x25,0x63,0xD8,0xCD,0x2E,0x00,0xB6,0xFA,0x20,0xD0,0x0B, + + 0x5A,0x80,0x6F,0x8E,0x67,0x1B,0x27,0xBF,0xA5,0xF8,0x47,0xBD,0xFB,0x0E,0xD9,0xE6, + + 0xD5,0x01,0x66,0xB4,0x4B,0xB7,0x52,0xFE,0x4C,0xEC,0xC8,0xD2,0x02,0x53,0x56,0xC9, + + 0x3B,0x92,0xFD,0xDC,0x7B,0xF1,0x27,0x66,0x0C,0xFD,0x80,0xF9,0xDE,0x22,0xB4,0x31, + + 0x13,0x3F,0x65,0xD5,0x82,0x0A,0xA5,0x4B,0xEE,0xBD,0x57,0x9C,0x86,0x2D,0x5D,0x24, + + 0x22,0x22,0x2F,0x99,0xA9,0xD3,0x87,0xBD,0xE3,0x9D,0x4B,0x9D,0x00,0x5B,0x93,0x06, + + 0xC8,0xB1,0xE6,0x3C,0x11,0xA0,0x30,0xCA,0x29,0x31,0xAE,0x08,0xDD,0x02,0x36,0x25, + + 0x07,0xA1,0x8E,0x3D,0x91,0xA6,0x8C,0x90,0x6D,0x23,0x58,0x37,0xD0,0x6C,0xA5,0xF0, + + 0x23,0x42,0x22,0x3D,0x4C,0x93,0x70,0x61,0xC4,0x0C,0x6A,0x56,0xEC,0x20,0xF6,0x73, + + 0x72,0x66,0x25,0x66,0xAD,0x85,0x09,0xB9,0x95,0x01,0x26,0x77,0x70,0xB6,0x8B,0xC9, + + 0xD6,0x07,0x88,0x55,0x79,0xE7,0x17,0x27,0x44,0x26,0x2D,0x16,0xE5,0x5B,0x38,0x32, + + 0xF0,0x60,0x1E,0x93,0xD1,0x37,0x9C,0x6E,0x40,0xE5,0x08,0x8E,0xA8,0x27,0xE6,0xE0, + + 0x00,0xAA,0x41,0x47,0x86,0x8B,0xDC,0xA1,0xD6,0x04,0xA8,0x5B,0xF8,0x93,0x71,0xAA, + + 0x7F,0xF6,0xC1,0x50,0xF8,0xE4,0x07,0xC0,0xD3,0x43,0x5D,0x97,0x32,0x1C,0x3A,0xF3, + + 0x85,0xF5,0x15,0xFF,0x24,0x85,0x5A,0x28,0x58,0x0A,0x03,0x13,0x64,0x2A,0xF1,0x9C, + + 0x0A,0xD9,0x1B,0x5B,0xF0,0x98,0x1C,0x21,0x48,0x69,0x65,0xFE,0xF8,0xB6,0x64,0xF6, + + 0x7D,0x9C,0x12,0x9E,0xEC,0x85,0x5B,0x8D,0x47,0x08,0x53,0x5E,0x5B,0x67,0x33,0xE3, + + 0x25,0x06,0xED,0xBC,0x72,0x9A,0x8B,0xFE,0xED,0x27,0x5B,0x2D,0xE6,0xC6,0xF1,0x74, + + 0x0C,0xD6,0x46,0x3F,0x70,0xA5,0x55,0xEC,0x44,0x14,0x52,0x82,0xE1,0x73,0xE3,0x26, + + 0x9E,0x0B,0x9C,0xEE,0x4B,0x5D,0xF9,0x38,0x47,0xE6,0xF2,0x1E,0xA6,0x61,0x06,0x06, + + 0x77,0x72,0xC1,0x2D,0xD2,0x83,0x1B,0x61,0xCC,0x2C,0x13,0x68,0x79,0xB3,0x65,0x67, + + 0x8D,0x6D,0xF5,0xEC,0xFB,0x4F,0x0D,0x61,0x3F,0x4C,0xE3,0x95,0xC7,0x22,0x52,0xA9, + + 0xCB,0x21,0x67,0x44,0x2A,0x5C,0x2A,0x89,0xED,0xF6,0x6F,0xD7,0x08,0x32,0x32,0xB8, + + 0x49,0x1C,0xB2,0xB8,0xFB,0xA0,0x09,0x34,0x63,0x59,0x23,0xF6,0xD0,0xA4,0x03,0xB4, + + 0x20,0x94,0xBB,0xA8,0x7A,0x83,0x04,0x61,0xA9,0xFF,0x55,0xA6,0x71,0x7F,0x1F,0x2B, + + 0x4A,0x57,0xC5,0x9D,0x79,0xA2,0xDD,0x31,0xAF,0xAC,0x8E,0x8A,0x89,0x31,0x34,0x44, + + 0x2C,0x7F,0x9A,0x61,0xB2,0x9F,0x00,0x65,0x1A,0xAB,0x2B,0x14,0xA4,0xD5,0xDF,0x10, + + 0x6B,0xBE,0xA7,0x24,0xB3,0x3A,0x0C,0xCB,0x49,0x17,0x8E,0xBB,0x98,0x11,0x23,0xFC, + + 0x57,0xB0,0x97,0xC3,0x30,0x4A,0x6E,0x5D,0x15,0xC3,0x42,0x16,0x76,0xFB,0x99,0xD0, + + 0x23,0x35,0x94,0x45,0x16,0x31,0xDD,0x2A,0x3F,0xB4,0xE5,0x0B,0x7E,0x8A,0x3C,0x38, + + 0x9C,0xB7,0x17,0x9F,0x40,0x49,0xBA,0x3B,0x14,0x85,0x56,0xDF,0xFB,0x75,0x36,0x63, + + 0xD8,0x75,0x9D,0x8F,0x05,0x88,0xBD,0x84,0xB5,0xA8,0x5E,0xAC,0x46,0xD4,0xA3,0xEB, + + 0x5B,0x7F,0xA7,0x99,0x70,0x6B,0x71,0x95,0xEB,0xDA,0x68,0x6F,0x59,0xA5,0xCB,0x67, + + 0x50,0x79,0xB5,0x6E,0x81,0x96,0xF3,0xC6,0x23,0x2A,0x8A,0x39,0xFB,0xC1,0xF9,0xB9, + + 0x56,0x17,0x6B,0x53,0x99,0x97,0x76,0xED,0x01,0xBF,0x35,0x2E,0xFE,0x72,0x16,0xC8, + + 0xC0,0x7E,0x62,0x4E,0x77,0x35,0x3C,0xE8,0x68,0xFD,0x84,0xF9,0x13,0xFE,0xC3,0xB7, + + 0xC3,0xCF,0x50,0xCC,0x53,0xCF,0x87,0x9A,0x84,0x30,0x73,0x0F,0xB2,0x8F,0x6F,0xDC, + + 0xC0,0x7C,0x4F,0xBE,0x52,0x9B,0x65,0x0A,0x8D,0x5B,0xA1,0x4D,0x1A,0xDC,0x5F,0x45, + + 0xF9,0x36,0x9E,0x3E,0xDE,0xA3,0xA0,0x3D,0x74,0x82,0xA5,0xA2,0x56,0xE8,0x56,0x3F, + + 0x27,0x6C,0xBF,0x92,0x1B,0x06,0x46,0x1F,0x91,0x10,0xAD,0xB2,0x57,0x31,0x5F,0x3B, + + 0x71,0x14,0xDF,0x3F,0x63,0x57,0xF1,0x9A,0x10,0x93,0x71,0xA7,0x22,0x4F,0xAC,0x54, + + 0x64,0x25,0x97,0x3A,0x4B,0x0E,0x47,0x0E,0x47,0xFF,0x15,0xA4,0xFF,0x1C,0xBC,0xD1, + + 0x7E,0x59,0x4C,0xD5,0x70,0x0B,0xC7,0xC3,0x40,0xA6,0x0B,0x6E,0xF3,0x9B,0x36,0xF6, + + 0x0F,0x81,0xBE,0x67,0x71,0x0A,0xC1,0xEC,0x44,0x04,0x85,0x9C,0xD4,0xE8,0x07,0x7B, + + 0x85,0x26,0xB3,0x45,0xD2,0x0B,0xC1,0x24,0x7B,0x30,0x58,0x19,0x43,0x6B,0x2D,0x2C, + + 0xEE,0x36,0xBB,0x68,0xF5,0xE6,0xD2,0x1D,0x12,0x3B,0x06,0xB5,0x76,0x38,0x31,0xF9, + + 0x7C,0x05,0x33,0x90,0x1D,0x58,0x8E,0x48,0xBB,0xAD,0x09,0xBD,0x7E,0x37,0x14,0x22, + + 0x65,0xD8,0x6A,0x9B,0xF7,0x04,0x6E,0x24,0x3D,0x66,0x45,0xBA,0x5F,0xAD,0x45,0x26, + + 0x67,0xFB,0x10,0x23,0x60,0xDB,0x0B,0x35,0xEE,0x65,0x89,0xD5,0x27,0x91,0x55,0x37, + + 0x64,0xFA,0xBC,0x80,0x74,0x3A,0x2C,0x49,0x26,0xFA,0x85,0x07,0x50,0x89,0x3A,0x4F, + + 0xFB,0x25,0x82,0x4C,0x2F,0xA1,0xCF,0x35,0x35,0x9C,0x32,0x7E,0x61,0xAE,0xBA,0x58, + + 0x03,0x26,0xD2,0xA5,0xEA,0x02,0x38,0xCB,0xA6,0xCE,0x3A,0x4B,0xD2,0xE1,0x70,0xAB, + + 0xCE,0x21,0x18,0xCD,0x1E,0x47,0xB3,0x6F,0x53,0x8C,0x65,0x28,0x23,0xE1,0xBB,0xA4, + + 0x0D,0x23,0xBF,0x24,0x74,0xEC,0xD7,0xFE,0x38,0x62,0x5F,0x3D,0x5B,0xE2,0xDB,0xC5, + + 0xCD,0xC1,0xB1,0xC1,0xFE,0xA1,0x8F,0x31,0x50,0xD8,0x74,0x26,0x82,0x50,0x64,0x96, + + 0xA2,0xF0,0x92,0xBF,0x33,0xB3,0xA9,0xC1,0x5D,0x93,0xBC,0x92,0xA1,0x60,0xC2,0xF0, + + 0x9C,0x44,0xAD,0x83,0x1C,0x5F,0x37,0xBD,0xD0,0x26,0xA0,0x84,0xAB,0x09,0x81,0xE8, + + 0x6F,0xC2,0xA5,0x13,0xB7,0x51,0x7D,0xAF,0x1A,0xBF,0x1A,0x8E,0x25,0x22,0x9B,0x46, + + 0x28,0xCC,0xB6,0xC0,0xFE,0xD7,0x24,0x91,0x08,0xBA,0x20,0x15,0x58,0xD9,0xCF,0x92, + + 0x6F,0x18,0xB6,0x0C,0x5F,0x44,0x42,0x47,0xE8,0x53,0x9C,0xB9,0x9F,0xFA,0x6D,0xCF, + + 0xA0,0xF4,0x41,0xE0,0x17,0x49,0x17,0xF3,0xE7,0x46,0x3F,0x0F,0x76,0x3B,0x13,0x62, + + 0x27,0x46,0x93,0xD1,0x56,0x34,0xFC,0x33,0xAF,0x7C,0xA4,0x0E,0x12,0x08,0x58,0xB2, + + 0xDD,0x3E,0x0A,0x1D,0x40,0x47,0x50,0x0B,0x99,0x7E,0x91,0x93,0x9D,0x57,0xCE,0xEC, + + 0xD2,0xF7,0x94,0x64,0xC6,0xC2,0x6E,0xA5,0x47,0xB7,0x90,0x80,0xDC,0x66,0x32,0x78, + + 0x90,0x81,0x1C,0x1C,0xC8,0x65,0x67,0x6B,0xAC,0x0E,0xE5,0x5C,0x96,0xFC,0x11,0xA3, + + 0x73,0x10,0x50,0x1B,0xBF,0xFF,0x80,0x28,0x95,0x06,0x0B,0xDD,0x06,0xB9,0xCA,0x4E, + + 0x20,0xE4,0x4B,0x3D,0xB2,0x41,0xA4,0xEB,0xEE,0x6E,0x36,0x36,0xDD,0xFA,0xAA,0xC4, + + 0x2C,0x3D,0xC8,0x7B,0xB3,0xD8,0xFF,0xBA,0x3F,0x70,0x6E,0x7C,0x7E,0x90,0x6F,0xC6, + + 0x21,0xDC,0x9F,0xDC,0xDC,0xFA,0x49,0x5E,0x61,0x58,0x5A,0x8A,0x03,0xF1,0x31,0x6A, + + 0xEF,0x9B,0x5B,0xBD,0x54,0xBC,0xA9,0x3C,0x2D,0xCD,0x40,0x1D,0xDB,0xFF,0x5E,0x34, + + 0x1C,0x06,0x92,0x04,0xEF,0xAD,0x4F,0x21,0x46,0x63,0x28,0xCB,0x2B,0x78,0xA1,0x6F, + + 0xA2,0x07,0x9A,0x30,0x17,0x52,0x1E,0x42,0xAA,0xA0,0x43,0xB2,0x57,0x22,0x28,0x42, + + 0x86,0x71,0x50,0x81,0xE2,0x40,0xD0,0x52,0x8F,0x4B,0xCA,0xA6,0xAF,0xFA,0x20,0x57, + + 0x87,0x70,0x64,0x04,0xF9,0x03,0x67,0x19,0xC7,0x30,0x8F,0xF5,0xED,0x78,0x80,0xC0, + + 0xDF,0x46,0x9A,0x7D,0x7A,0x35,0xC6,0x06,0xFD,0xE9,0x03,0xE0,0x50,0xC7,0x2C,0x18, + + 0xA2,0x9A,0x4F,0x56,0xDC,0x85,0x12,0x03,0x73,0x07,0xB0,0x16,0xA4,0x27,0x01,0xD4, + + 0x7D,0x00,0xB8,0x13,0x67,0xEA,0x40,0x26,0x5C,0x4C,0xAE,0xA7,0x73,0x99,0xFD,0x33, + + 0x0E,0xF1,0xD8,0x26,0xA3,0xA0,0x19,0x31,0xC5,0x65,0x12,0xFC,0x07,0x64,0xAB,0x77, + + 0xAB,0x0E,0x34,0xFD,0x65,0xD7,0x39,0x5B,0x78,0x47,0x01,0x4A,0xE7,0xC3,0x72,0x7A, + + 0xF2,0x00,0x47,0xF4,0x1F,0x21,0xB7,0x47,0xEA,0xE9,0xC1,0xBF,0x26,0xF1,0x2A,0xAF, + + 0x29,0x88,0xB9,0xFE,0xD7,0x6A,0x2D,0x1C,0xCE,0x39,0x00,0x2C,0xA3,0x72,0x07,0x9B, + + 0x01,0x93,0x8B,0x03,0xF5,0xDF,0x0D,0x4A,0xA1,0x27,0x40,0xBB,0xDF,0x08,0x79,0xD6, + + 0x09,0x7C,0xC0,0x12,0xFB,0x83,0xD2,0x87,0xC7,0xEA,0x75,0xCD,0x92,0xFD,0x76,0x49, + + 0x60,0xF4,0xDB,0xB6,0xFE,0x6F,0x12,0x6D,0xDF,0x7C,0x84,0x9E,0x5F,0xC0,0x1A,0x99, + + 0x2F,0x0D,0xD2,0xBD,0xE2,0x8F,0xC2,0x07,0x00,0x7F,0x73,0x7E,0xE6,0x0A,0x42,0x5B, + + 0x87,0xA4,0x8B,0x1D,0x9D,0x2D,0xFE,0x55,0x03,0x5E,0x4C,0xF9,0x93,0x90,0x56,0xD7, + + 0xCB,0x74,0xE6,0x80,0x31,0x72,0x6A,0x88,0x81,0xEF,0x02,0x20,0x72,0x99,0x1A,0xA1, + + 0xCA,0x55,0xC4,0x8C,0xC4,0xB7,0xDC,0xF0,0x61,0x85,0x70,0x30,0x7B,0x32,0x3D,0x7E, + + 0xC3,0xEA,0x3A,0x42,0x72,0x3A,0xA2,0x89,0x14,0xB3,0x55,0x25,0xBE,0x8D,0x37,0x21, + + 0x29,0xBC,0x85,0x55,0xFD,0x28,0x8B,0xAE,0xD1,0xAE,0x95,0x39,0xF7,0x71,0x3F,0x44, + + 0x24,0x82,0xD5,0x76,0x72,0x1A,0x7F,0x8E,0xB3,0xE8,0xEC,0x1A,0x74,0xAE,0x59,0x23, + + 0x17,0xC1,0x5D,0xCE,0x0F,0x81,0xCB,0x37,0xDE,0xA3,0x08,0xCA,0x51,0x80,0x85,0x45, + + 0xD8,0xC2,0x55,0xDB,0x8A,0xC2,0xE8,0xBA,0x2A,0x47,0x90,0xFB,0xD4,0x82,0xD8,0x22, + + 0xD3,0x55,0xDE,0xDA,0xCB,0xBA,0xE4,0x6F,0xE2,0x67,0x89,0xBA,0x0E,0x0B,0xA2,0xF7, + + 0x8B,0xB8,0xCC,0xEA,0x7B,0x58,0x6D,0xDB,0x04,0xD9,0x3C,0x28,0x7A,0x9A,0x6E,0xD2, + + 0x8F,0x16,0x1E,0x18,0x3B,0x54,0xDE,0x00,0x67,0xD8,0x5E,0x38,0xC2,0x71,0x11,0x8B, + + 0x67,0x97,0xDF,0x88,0xC7,0x1A,0x17,0x56,0x09,0xC9,0x68,0x2F,0x72,0x62,0x2F,0xCD, + + 0x48,0xB4,0x4F,0x39,0xD1,0x31,0x0F,0x3D,0xD7,0x25,0x1A,0x55,0xBA,0x36,0x02,0xC4, + + 0xD1,0x80,0xB8,0xF1,0xD3,0x8D,0xFD,0x86,0xBF,0xA0,0x16,0x6D,0x69,0x70,0x54,0xF6, + + 0x0A,0x3F,0x62,0x43,0x3A,0x7D,0x0E,0xE9,0x5B,0x59,0x65,0xBE,0xDA,0x80,0xFC,0x93, + + 0x43,0xE7,0x85,0x32,0x53,0xCF,0xEA,0xB6,0x22,0x4F,0xEF,0x96,0x7B,0x73,0x71,0xA4, + + 0xCA,0x68,0xEB,0x91,0x73,0x6E,0xEF,0x8B,0x00,0x4E,0xF7,0x9F,0x0F,0x3C,0x18,0x52, + + 0x84,0x8F,0xB1,0x22,0xF5,0x0F,0x52,0xA2,0x45,0x77,0xBE,0x66,0x1A,0xA2,0x9C,0x69, + + 0xA6,0x0C,0x68,0x93,0xE3,0xA9,0x2E,0x75,0x8F,0xDB,0xEE,0xCD,0x53,0xA3,0x95,0xF3, + + 0xA0,0x8D,0xB7,0xF6,0xE9,0x5D,0x0B,0xD0,0xAC,0x6F,0xF1,0x71,0xD2,0xE0,0x57,0x22, + + 0x07,0x9F,0x2B,0x68,0xB4,0xC3,0x71,0x56,0xC3,0x50,0x6D,0xB3,0xF3,0x12,0x76,0x43, + + 0xFA,0x25,0x26,0xB9,0xFF,0xB5,0x67,0xA5,0xFB,0x62,0xC8,0x98,0xFA,0xE9,0x31,0x6A, + + 0xA2,0xEB,0x62,0xD2,0x15,0x65,0x70,0x67,0xD3,0xB4,0x47,0x34,0xF6,0x48,0xF1,0xC7, + + 0xEE,0x4A,0xF7,0x25,0x90,0x24,0x62,0x0D,0x0C,0xB7,0x0E,0x19,0x57,0xEB,0x0B,0x53, + + 0xA3,0xC5,0x16,0x24,0xA7,0x06,0xDC,0x4B,0x0F,0xD6,0x6E,0xF3,0xD5,0x62,0xD2,0x68, + + 0xF3,0x25,0x7D,0x0F,0x38,0xB3,0x70,0x1A,0x6C,0x67,0x0A,0xD5,0xD1,0x15,0xE9,0xEA, + + 0xA6,0x28,0xC8,0x1A,0x1C,0xFB,0x58,0xC9,0xC1,0xC4,0xF2,0x3B,0x36,0x48,0x35,0x4C, + + 0x52,0x80,0x35,0x69,0x63,0xC6,0x93,0x58,0x6F,0x49,0xD4,0x5D,0x1E,0xEA,0x3D,0xE8, + + 0x09,0x06,0xF2,0x23,0x38,0x74,0x45,0x0E,0x61,0xC6,0xBF,0x4C,0xB5,0xE0,0xA9,0xC3, + + 0xFB,0xE0,0xDA,0x7F,0xBF,0x2D,0xE1,0x19,0x7E,0x8E,0xCC,0x56,0x22,0x43,0xFA,0xB2, + + 0x77,0x16,0xB8,0x14,0x19,0xAF,0xFA,0x95,0xC2,0x7B,0x3A,0xFE,0x35,0x52,0xA7,0xB4, + + 0xBD,0x47,0x8D,0xBC,0x1A,0x23,0x33,0xB2,0xC8,0xEC,0x53,0x1C,0xE2,0x3D,0x6B,0xB7, + + 0xD2,0xB4,0x18,0x4E,0xAF,0x02,0xC2,0xE1,0xCC,0xFF,0x93,0x1D,0x20,0xE1,0x32,0xF1, + + 0x4C,0x91,0x65,0x02,0x36,0xDD,0xF4,0x1A,0x26,0x51,0xE4,0xC4,0x3C,0x5B,0xA8,0x6D, + + 0xC4,0x2E,0x78,0xC7,0x34,0x41,0x44,0x02,0xA7,0x93,0x82,0x87,0x56,0x92,0x1D,0x13, + + 0xA2,0x01,0xFB,0xBB,0xBC,0xF0,0xA5,0x50,0x60,0x7F,0x2A,0xFB,0x74,0xA1,0xED,0x32, + + 0xB3,0x3E,0x6D,0x17,0xD1,0xF1,0x6E,0xAB,0x34,0x0E,0x7D,0x37,0x98,0xB1,0x7C,0xCF, + + 0xCF,0x6D,0x44,0xD5,0x0E,0xD0,0xC3,0xCA,0x9B,0xB8,0x43,0x43,0x97,0x6B,0x52,0xAF, + + 0xC5,0xC2,0x3C,0xB4,0xC0,0xD0,0x26,0xCB,0x1B,0xCA,0xBC,0xF0,0xF4,0xF8,0x7F,0xEC, + + 0x87,0x36,0xDB,0xFA,0xB0,0xD4,0x17,0xF3,0xE5,0xB7,0x8A,0x0A,0xEC,0xB4,0xEA,0xA1, + + 0x4C,0x26,0xD5,0x28,0x42,0xBB,0xC7,0x0D,0x84,0x66,0x02,0x35,0x56,0x28,0xE8,0xEA, + + 0x32,0x33,0xE2,0x87,0x3A,0xFB,0x1D,0x55,0x17,0xF8,0xF6,0x3B,0x7A,0xDA,0x0E,0x0A, + + 0xC4,0x38,0x94,0x5E,0x31,0x12,0x85,0xE0,0xB4,0x24,0x2D,0xD8,0x16,0xF6,0xB1,0x8B, + + 0x47,0x8B,0x30,0xC8,0xBA,0x98,0xF7,0xEB,0xEC,0x46,0xE7,0x6F,0xCC,0xE1,0xEF,0x23, + + 0xA1,0x64,0xB9,0x9E,0x8E,0x6A,0x10,0xC4,0x5A,0x46,0x3F,0x8D,0x9D,0x73,0x18,0xF6, + + 0x1D,0x7D,0xDE,0xB1,0xBF,0xB1,0x60,0xC2,0xDD,0x11,0x9E,0x8C,0x85,0xF2,0x10,0x7A, + + 0x06,0xDF,0xDC,0xAD,0x0B,0x4C,0xF9,0x0A,0x17,0x2C,0xF8,0xE7,0x7E,0x3D,0xDF,0x5B, + + 0x45,0x6F,0xD9,0xF2,0xB8,0xBC,0x08,0x2C,0x38,0xD6,0xCF,0x15,0x71,0xBC,0x55,0x28, + + 0x9F,0x84,0x91,0xD9,0x56,0x8E,0x06,0xAD,0x16,0x13,0xC1,0xC3,0xDC,0xBF,0xEC,0x24, + + 0x06,0x82,0xC0,0xB5,0x9F,0xD6,0xAF,0xBB,0xB5,0xD6,0xB6,0x42,0x10,0xCB,0x3F,0xB1, + + 0x07,0x41,0x48,0x90,0xDC,0x63,0xB6,0xB4,0x43,0xA3,0x08,0xDC,0x99,0x2C,0x13,0xFF, + + 0x70,0x01,0xBA,0x9B,0x93,0x91,0x59,0x94,0xC6,0x00,0xE9,0x2D,0x30,0x9D,0xA4,0x63, + + 0x72,0xBC,0xC9,0xA4,0x1C,0xD5,0xB5,0xAA,0x34,0xD5,0x66,0xD8,0x2E,0xEE,0x55,0x33, + + 0x66,0xA7,0xB3,0xE1,0xDA,0x07,0xF7,0x57,0x29,0xE1,0x8A,0xE4,0xF1,0x62,0x4A,0xBB, + + 0xFC,0xDE,0xF2,0xA7,0xD9,0x8E,0xF0,0xFA,0xD7,0xD1,0xA7,0x96,0xD1,0x61,0x50,0xB2, + + 0xB2,0x5B,0x23,0x56,0xB4,0xC0,0xD1,0x90,0x22,0x06,0xDD,0x1E,0x73,0xEC,0x49,0x6B, + + 0xE7,0xB2,0xAB,0x51,0x6F,0x63,0xFC,0x6A,0xA8,0x33,0x86,0x17,0xFD,0x21,0x39,0x4A, + + 0xA9,0xB5,0xB9,0x92,0x19,0x0B,0x1A,0x05,0xCA,0x54,0xED,0xA8,0x26,0xA0,0x32,0x67, + + 0x88,0x04,0x4A,0x9C,0x57,0xA8,0xE5,0xBA,0xD8,0x24,0x22,0xC3,0x66,0x49,0x2B,0x6B, + + 0x7D,0x06,0xBE,0x89,0x9A,0x22,0x29,0x4B,0xA8,0x4B,0x34,0x1C,0xEB,0xCE,0x35,0xBC, + + 0x7D,0x48,0x9B,0xE2,0x78,0xF8,0x23,0x89,0xC9,0x94,0xC4,0x24,0xDF,0x98,0xD4,0xCC, + + 0x0E,0x70,0x71,0x4B,0xCE,0xFA,0x16,0xAE,0xD8,0x4F,0xD7,0xCC,0x42,0x8C,0x5D,0x65, + + 0xE0,0xBC,0x4A,0xAD,0xC9,0x6D,0xB8,0x6B,0x6D,0xAB,0xDE,0x7E,0x5F,0x21,0x79,0xB3, + + 0x71,0xA3,0x64,0xD2,0xF1,0x98,0xB0,0x92,0x02,0x6D,0x13,0xB9,0xD2,0x28,0x75,0x61, + + 0xFD,0xA0,0x68,0x6B,0x47,0xCA,0x61,0x8A,0x01,0xE4,0xDF,0x3B,0x83,0x69,0x97,0x32, + + 0x28,0x50,0x86,0x95,0x4C,0x34,0xD4,0x21,0x22,0x5D,0x4B,0x5A,0x54,0x20,0x10,0x54, + + 0xAC,0x50,0xB2,0xA9,0xD3,0x11,0x14,0xB5,0x1E,0x71,0x25,0x73,0xEF,0x79,0xE9,0xA5, + + 0xE8,0xE3,0x01,0x8C,0x38,0x0F,0xEA,0x25,0xA9,0x12,0xB5,0xDF,0xC7,0xC2,0x37,0x62, + + 0xDD,0x15,0x09,0x68,0xB1,0x72,0x8D,0x35,0xEB,0x47,0x1E,0x31,0xF2,0x86,0xD1,0xDA, + + 0x16,0xC1,0xFA,0x74,0x58,0x83,0x0A,0xEF,0x2C,0x1A,0x8E,0x1B,0xD1,0x36,0xF3,0x9F, + + 0xB6,0xC8,0x9A,0x6E,0xD8,0x56,0x66,0x03,0xA5,0xFA,0x1C,0x9C,0x62,0x71,0x54,0xFE, + + 0x9A,0x6A,0xBB,0x75,0x5B,0x55,0x34,0x41,0x34,0xE9,0xCC,0xAA,0x72,0xA6,0xE4,0xA3, + + 0x18,0x08,0x7A,0x61,0x47,0x94,0xBB,0x00,0x29,0x47,0xD8,0x1D,0xAB,0x3A,0x2F,0xFB, + + 0x89,0xC7,0x59,0x8D,0x1C,0x23,0xD6,0x28,0x02,0xE7,0x56,0x6C,0xC2,0x70,0xE4,0x58, + + 0x40,0x1F,0x22,0x74,0x06,0x74,0xDE,0x38,0x6A,0x1B,0x5F,0xBE,0x80,0xF4,0xB3,0xEB, + + 0xAE,0x18,0x27,0xEB,0x4F,0x85,0x49,0x4B,0xEC,0xA7,0x13,0x50,0x0F,0x3B,0x21,0x2D, + + 0x08,0xE4,0xE8,0x6D,0x39,0x94,0x5F,0x2C,0x64,0xED,0xE1,0x95,0x12,0x4A,0xF1,0xF1, + + 0xDE,0x8D,0xF1,0x7C,0xC9,0x32,0x28,0x7A,0x96,0x18,0xA4,0xE8,0x76,0x3E,0xA2,0x58, + + 0xD7,0x3D,0x11,0xDC,0x4C,0xBD,0xF9,0x67,0x80,0xEB,0x76,0xF0,0xFE,0x3D,0x87,0xD9, + + 0x95,0x5F,0xAF,0x4B,0x46,0x7F,0xE4,0xEE,0x3E,0x88,0xDD,0x94,0x7D,0x5C,0xE3,0x9B, + + 0x28,0xCB,0x0F,0x04,0xCA,0x39,0x01,0x63,0xEF,0x8B,0xCF,0xF9,0xEF,0x3D,0x79,0x06, + + 0x89,0xE3,0x5B,0x82,0x16,0x38,0x0D,0xA6,0x46,0xC8,0x3A,0x69,0xA9,0x9C,0x55,0xFD, + + 0x03,0xC3,0x44,0x89,0xE4,0x77,0xDF,0x48,0x93,0xCB,0x54,0xA4,0x59,0xE9,0x8A,0xA6, + + 0x51,0x9C,0x61,0x87,0xFE,0x1D,0xF1,0xA3,0xAE,0xAC,0x1D,0x48,0x1E,0x43,0x10,0xD1, + + 0x24,0x7C,0xE1,0x92,0x93,0xE1,0x3A,0xB7,0xC3,0x8D,0x3D,0xCA,0x22,0xA2,0x73,0x39, + + 0x6C,0xF5,0xBE,0x75,0x12,0x0F,0x12,0x66,0xBA,0x80,0xD0,0x1A,0xF7,0xE7,0xF9,0xA1, + + 0x33,0xD5,0x49,0x4C,0x8B,0x11,0xDF,0xED,0x2C,0x73,0x27,0x23,0x2C,0xD2,0x1F,0x6E, + + 0x77,0x25,0xD3,0x43,0x13,0xB0,0xC2,0x64,0x12,0x10,0x4F,0x43,0xA1,0xE2,0x49,0xE9, + + 0x7B,0x36,0xB7,0x58,0xD1,0xE9,0xF9,0x82,0x15,0x87,0x39,0xAB,0x96,0x1A,0x4A,0x68, + + 0xFB,0x86,0x4A,0x8A,0x1E,0x4A,0xF2,0xAA,0x26,0xA6,0x88,0xC0,0xE9,0x84,0x51,0x5D, + + 0x0B,0x29,0x79,0xE0,0x92,0x14,0x38,0x2B,0x31,0xCD,0x7A,0xFE,0xA1,0xAB,0x1B,0xF0, + + 0x0F,0x87,0xB1,0x2F,0x63,0x27,0xD4,0x51,0x1A,0xC2,0xD5,0x1E,0xDF,0x3A,0x2C,0xDB, + + 0xC1,0x26,0x4C,0x65,0x4B,0xA3,0xAA,0x32,0x45,0x12,0xF3,0x94,0xDC,0x8B,0xD1,0x72, + + 0xF6,0xFD,0x83,0xEE,0xC8,0x13,0xD1,0x5C,0x92,0x29,0xEA,0x6A,0xD9,0x5C,0xAA,0x4B, + + 0x25,0x79,0x94,0xEA,0xF6,0x0E,0x48,0x7E,0xCA,0xDB,0xFE,0x62,0x7F,0x5D,0x50,0x67, + + 0xBD,0xEE,0xDD,0xFB,0xF6,0x59,0x2D,0x58,0xCA,0x65,0xA3,0x66,0xD2,0xED,0x7C,0x45, + + 0xFF,0x3B,0xBD,0xE1,0x74,0x0C,0xDA,0x61,0x53,0x7B,0x7E,0xFD,0x5F,0xE7,0xE4,0xD3, + + 0x20,0x9A,0xDC,0x0E,0x91,0x39,0x8F,0x38,0x67,0xB0,0xCA,0x9F,0x9F,0x61,0x4C,0xC1, + + 0x43,0x9C,0x28,0x6B,0xCA,0xF0,0x41,0x36,0x6F,0x53,0x0D,0x87,0xC0,0x9F,0xA1,0x7E, + + 0xAC,0xD3,0x85,0x14,0x17,0xB8,0xEA,0xA2,0xC0,0x5F,0xCB,0x8A,0x1F,0xA3,0x2F,0x78, + + 0x96,0x72,0xBD,0xB7,0xA3,0x6E,0x05,0x23,0x1A,0xEE,0x58,0x77,0x8B,0xB1,0x30,0xDD, + + 0x00,0x20,0xEC,0x61,0x55,0x94,0xC6,0xFD,0x8A,0x7B,0x73,0x99,0x9F,0x84,0x12,0x44, + + 0xCC,0x73,0xB4,0xB3,0xB5,0x91,0xD4,0x78,0xF3,0x41,0x00,0x72,0x28,0x0B,0xC5,0xD9, + + 0x2A,0x1B,0x9D,0x2F,0xEE,0xFB,0x43,0x12,0x06,0x96,0x59,0x75,0xE2,0xFE,0x33,0x40, + + 0xB7,0x38,0xE5,0x27,0xFA,0xB8,0xD8,0xE8,0x8C,0xA3,0xAD,0xF7,0xFB,0xB5,0x9E,0x1A, + + 0xD3,0xA5,0x59,0xC9,0x0F,0xD1,0x9A,0x35,0x6F,0x52,0xFE,0x91,0xC9,0xBA,0x13,0x1E, + + 0x2F,0x49,0xCC,0x9E,0x3C,0xD9,0x7E,0x2F,0x92,0xE4,0x2C,0x99,0xDC,0x56,0x8B,0x14, + + 0xAF,0x63,0x1F,0x10,0xAE,0xF7,0xF7,0x2B,0x81,0x98,0xB1,0x50,0x5D,0x55,0xEF,0x1A, + + 0x5C,0xF5,0x70,0x61,0x99,0xA0,0xFF,0x3B,0xB6,0x99,0x29,0x8E,0xC5,0x54,0x04,0xD4, + + 0xF8,0x68,0x52,0x3E,0x77,0xB3,0xF2,0x2C,0xFC,0xDF,0x2B,0x48,0x78,0x87,0x0D,0xDE, + + 0xD3,0xD9,0x5A,0xCE,0x9C,0xD8,0xAC,0xE9,0x99,0x7E,0xDE,0x98,0x7F,0xFD,0x80,0x38, + + 0x74,0x35,0x53,0x3F,0xB1,0xB1,0x94,0x10,0x26,0x29,0xC0,0x6B,0xC1,0x89,0xDC,0xDC, + + 0x7B,0x5A,0xB5,0x1F,0x1C,0xDA,0x59,0x40,0x8D,0x7B,0xFF,0xFF,0xFF,0xFF,0xAD,0x7F, + + 0x9D,0x5C,0x88,0x10,0xED,0x29,0x03,0xD3,0x30,0xE2,0xB8,0x46,0xA9,0x6C,0x4A,0xE3, + + 0x31,0xAC,0x48,0x94,0xBC,0x63,0x66,0x0C,0xAA,0xB0,0x27,0x76,0xF0,0x1A,0xBA,0x4F, + + 0x69,0x0B,0x05,0x3A,0xF5,0x63,0x87,0x23,0x32,0xCF,0xA9,0x5B,0x51,0x6F,0xC2,0x81, + + 0x6A,0x32,0x9F,0x43,0xA2,0xB2,0x40,0xBB,0xC7,0xE3,0xDC,0xB1,0xD3,0x88,0x02,0x26, + + 0xFD,0x68,0xCA,0x51,0xB1,0x22,0x2E,0xC0,0xB7,0x4D,0xB0,0x20,0x69,0x6B,0x5F,0xA1, + + 0x77,0xF5,0xB0,0xD6,0x31,0x47,0x98,0x45,0xEC,0x48,0xA0,0xF6,0x56,0xBE,0x7F,0xE0, + + 0x5C,0xA9,0x91,0xD4,0xF1,0x06,0xD5,0x90,0xE0,0xB9,0xB1,0x21,0xAD,0xEB,0x10,0x57, + + 0x66,0x85,0x93,0x40,0x30,0x21,0xA6,0x02,0xE1,0x29,0xDB,0x97,0x51,0x2F,0x3C,0x68, + + 0x63,0x07,0x3A,0xEC,0x43,0x2E,0xA8,0x28,0x48,0x48,0xFA,0x4E,0xA7,0x66,0x34,0xFA, + + 0x3F,0x96,0x3E,0x7E,0xA6,0x6B,0x24,0x0D,0xC4,0xEF,0xE5,0xFE,0xF8,0xF6,0x83,0x3B, + + 0xB4,0xB5,0xAD,0x4C,0x39,0xF5,0x13,0x5B,0x23,0xAB,0xAB,0xD3,0x5B,0x67,0x35,0x30, + + 0x41,0x02,0x4B,0x77,0x9F,0xA9,0x0A,0xF9,0xDE,0x50,0x37,0xB9,0x91,0xDB,0x5C,0x61, + + 0x29,0xAC,0x92,0x54,0x79,0x4C,0xB5,0x28,0x0E,0x0E,0xF2,0x0E,0x19,0x92,0xD9,0x1F, + + 0x38,0x09,0xF2,0x0C,0x13,0x22,0x22,0x0B,0x33,0x44,0xE2,0xAC,0xE4,0x62,0x1A,0xBC, + + 0x6F,0xA1,0xBB,0xCF,0x9F,0xD4,0xC5,0x8E,0x23,0x4D,0xAB,0xEF,0xB4,0x0D,0xF1,0xC6, + + 0x74,0x14,0xAB,0xFD,0x27,0x22,0x1A,0x3E,0x01,0x2C,0xE3,0x2D,0xD3,0x60,0x22,0xA9, + + 0x4C,0xBD,0x68,0x00,0x78,0x80,0xEF,0xD3,0x58,0x2F,0xC4,0xD3,0x7C,0xDB,0x1B,0xA0, + + 0x25,0xAE,0x4C,0x51,0x85,0x3B,0x47,0x8B,0x67,0x92,0xED,0x30,0x7F,0x1A,0x93,0xE1, + + 0xA1,0xBF,0x8D,0xA9,0xCF,0x12,0xCC,0xA1,0x9B,0x4F,0x0F,0x0A,0x72,0x6E,0x37,0x20, + + 0xD1,0x8C,0x19,0x11,0xB3,0xDA,0x54,0x73,0x40,0x2C,0xC4,0x99,0x54,0x85,0xF0,0xA2, + + 0x9D,0x48,0x3F,0x26,0x93,0xBE,0x6A,0x44,0xED,0xA2,0xDC,0xAC,0x32,0x7B,0xF4,0x2F, + + 0xCA,0xA4,0x06,0xA6,0x90,0x33,0xAA,0x83,0x45,0x5A,0x12,0x9E,0xD2,0x8A,0xFE,0x8F, + + 0x91,0x84,0xBA,0x27,0x30,0x7E,0x5D,0xF5,0xE4,0xB7,0x15,0x38,0xF1,0x36,0xE1,0x4E, + + 0xA2,0x67,0x45,0x19,0x10,0x31,0x6C,0xDC,0x06,0xA8,0x6E,0xC1,0xBB,0xB6,0x58,0x25, + + 0x28,0xBC,0x46,0x0C,0x76,0x7A,0x7E,0xCA,0xDF,0x56,0xD7,0xCA,0xAE,0x70,0xBF,0xB4, + + 0xD5,0xA8,0xB0,0xF9,0x19,0x34,0x67,0xD7,0x15,0xA6,0xA6,0x42,0xD5,0x74,0x16,0x31, + + 0x14,0x6B,0xC3,0x2D,0xBB,0xAA,0x2F,0x42,0x6B,0x57,0x57,0x2F,0x35,0x87,0xBC,0xA1, + + 0xAF,0x51,0x0F,0xBC,0x0C,0x90,0xA6,0x05,0x1E,0x66,0x60,0x7A,0xCA,0x78,0x56,0xD5, + + 0x3A,0x07,0x4E,0x39,0x59,0x4D,0x68,0x4C,0xE5,0xAA,0x8C,0xAC,0x0E,0xD3,0x74,0x74, + + 0x9C,0xE8,0xF6,0x0C,0xF6,0xB5,0xCE,0xCE,0x4D,0xA8,0xA0,0xFB,0x5F,0xD2,0x80,0xAF, + + 0x96,0x61,0xBF,0x4F,0x9B,0xCF,0x5F,0xEC,0x95,0xA1,0x77,0x9F,0x98,0x5A,0x1B,0xC8, + + 0x81,0x5D,0xCE,0x3F,0x1A,0xB5,0xC8,0xDD,0x69,0x57,0x7F,0x8E,0x58,0xFC,0x58,0x30, + + 0xCC,0x8F,0xB2,0x82,0x1E,0xD9,0x51,0xA6,0x47,0x83,0xF8,0x6E,0xB5,0x1F,0x95,0x4D, + + 0xD0,0xDC,0x90,0x68,0x94,0xAC,0x10,0x50,0xF0,0xCD,0xB4,0xB2,0x57,0xB9,0xF4,0xF0, + + 0xF6,0x7E,0x89,0x65,0x6D,0xAE,0x08,0x61,0x65,0xFF,0x71,0xE2,0x60,0xE8,0x82,0xFE, + + 0x87,0xD8,0x16,0x55,0x34,0xD8,0x01,0x5C,0x44,0xCE,0x79,0xB7,0x9B,0xA1,0x27,0x24, + + 0xF1,0xE8,0xEA,0x06,0xB5,0xA2,0x38,0xE7,0xBA,0x75,0xC8,0x36,0x52,0xEB,0xBC,0xA3, + + 0x21,0x7A,0xE9,0xB4,0xBB,0x2E,0x06,0xD2,0xCA,0x63,0x7C,0xF4,0x39,0x64,0xDE,0xDD, + + 0xC4,0x29,0xB1,0x56,0x37,0x2E,0xB1,0xAF,0xC7,0x1B,0x2E,0x89,0xD0,0x3C,0x37,0x6E, + + 0x78,0x0A,0x6E,0xB5,0x15,0xA4,0xA9,0xB3,0x83,0x63,0xC3,0x95,0x7B,0x6C,0x97,0x8E, + + 0x0B,0xB6,0xA0,0x8A,0x1E,0x43,0x0C,0x17,0x24,0xC5,0xF2,0xF8,0x5F,0xB8,0xBF,0x9A, + + 0x66,0x18,0x92,0xE0,0x9E,0xA4,0xC1,0x45,0x2D,0xCB,0xBD,0xCF,0x38,0xBC,0x7D,0x27, + + 0x30,0x21,0xCB,0x6D,0x63,0xA4,0xCC,0x58,0xB8,0xA9,0x8D,0x5F,0xFE,0x47,0x9E,0xEA, + + 0xF5,0x89,0xD4,0xDD,0x3C,0x34,0xC4,0x45,0xAF,0xBE,0x9B,0x37,0x34,0x62,0x1C,0x72, + + 0xE7,0x1D,0x67,0x2C,0x5D,0xA3,0x22,0xCE,0x86,0x7D,0x0D,0x8C,0xF2,0x67,0xEA,0x1B, + + 0xB1,0xCF,0xB0,0xC7,0xBC,0xAB,0x6D,0x3B,0x69,0x8F,0x05,0x9C,0xDD,0xEE,0xCF,0xD8, + + 0xFA,0x86,0x9B,0xCD,0xBC,0x8C,0xE4,0x7A,0xBE,0x6E,0x75,0x8D,0x72,0x65,0xFD,0x55, + + 0x2E,0x50,0x63,0x9A,0x3E,0x25,0xED,0xCC,0x6E,0x30,0x6B,0x0D,0x7C,0xE9,0x49,0xF1, + + 0x14,0x3B,0x3E,0xA9,0x1C,0xED,0x63,0x59,0xD5,0x43,0x0C,0x39,0x66,0xBD,0x54,0xA3, + + 0x19,0x3E,0x2C,0xB7,0x80,0x1A,0x3A,0x99,0x8C,0xE0,0x26,0x49,0xBD,0x38,0x5D,0x87, + + 0x44,0x47,0x9B,0xF7,0x94,0x7F,0x4E,0x4B,0x76,0x90,0x56,0xE7,0xF8,0x59,0xB8,0xED, + + 0xCF,0xC2,0x37,0x39,0x9D,0xEE,0x2B,0x8E,0x0E,0x22,0x22,0x88,0x90,0xB2,0x2F,0x20, + + 0xFA,0x97,0x9D,0x24,0xB4,0x57,0xB0,0x80,0x25,0x6B,0x96,0x15,0xFA,0x29,0x13,0x2C, + + 0x21,0xF5,0x94,0x54,0x32,0xBC,0x04,0x70,0x45,0xA0,0x6C,0x06,0x4D,0x24,0x5F,0x28, + + 0x15,0x09,0x31,0xA5,0xF5,0x48,0x0D,0x81,0xA5,0xA9,0x8D,0xC0,0x0B,0xF9,0x15,0x3B, + + 0xEB,0xD5,0xD7,0x35,0x1B,0xB8,0x45,0xA3,0xA7,0xD8,0x83,0xF1,0x16,0x74,0x58,0xA6, + + 0xC5,0x91,0xFF,0xA3,0x99,0xB3,0x0C,0x1B,0x18,0x77,0x11,0x87,0xA4,0xA9,0x9D,0x78, + + 0x45,0x28,0x96,0x60,0x91,0xB4,0xD9,0x9E,0x06,0x10,0x29,0x3A,0x11,0x0F,0x79,0x69, + + 0xA8,0x1F,0xF9,0x0D,0x75,0x92,0xA4,0xBA,0x80,0xDE,0x12,0x82,0x9F,0x73,0x51,0xA2, + + 0x58,0x38,0x52,0x1B,0xB7,0xA1,0xC0,0x3F,0xE3,0x0C,0x87,0x4C,0xD7,0xE0,0x60,0x56, + + 0xBB,0x41,0x86,0x8A,0x69,0x3C,0x4E,0x3A,0xD1,0xD3,0x5C,0x1D,0xF2,0xF1,0xAE,0xEF, + + 0xBB,0xC0,0x6E,0x3C,0xBD,0xF5,0xF9,0x18,0xED,0xDE,0xAC,0x5A,0x8C,0x40,0xCE,0x84, + + 0x53,0xE2,0x9F,0xE8,0x1F,0x36,0x17,0x4B,0xEC,0x55,0xE5,0xEF,0x05,0x73,0x17,0xFC, + + 0x12,0x90,0x36,0x2F,0xB7,0xB0,0xCE,0x99,0xAC,0xD0,0xE5,0xFA,0x14,0xBB,0x23,0x07, + + 0x24,0xA1,0x15,0x80,0x12,0xEC,0x02,0x47,0xAB,0x04,0x1A,0xA0,0x52,0xC3,0xA8,0x62, + + 0x63,0x1D,0x48,0x91,0x96,0x29,0x0E,0x52,0x21,0x2C,0xFD,0xB0,0x57,0xDF,0x39,0x31, + + 0x0D,0xAD,0x41,0x85,0xDE,0xDD,0x2B,0x91,0x51,0x03,0xEE,0x5A,0xD6,0x40,0x77,0x16, + + 0x20,0xDC,0x8F,0x91,0x9F,0x63,0x67,0x37,0x20,0xC0,0x1E,0x8A,0xC1,0xDE,0xE0,0x33, + + 0x6A,0xD7,0x92,0x46,0xA5,0x66,0xDB,0x02,0x4C,0x02,0xEE,0xC5,0xA6,0x67,0xFC,0x32, + + 0xFC,0xA1,0x82,0x41,0x32,0xC5,0x64,0x21,0xC1,0x41,0x1C,0x2A,0x5D,0x7B,0x3F,0x46, + + 0x23,0xD9,0x41,0xE3,0x79,0xD7,0xC1,0x41,0xE6,0x06,0x88,0x61,0x07,0x0A,0xDB,0x57, + + 0x4B,0xA6,0xF7,0x68,0x70,0x2E,0x38,0x13,0xF0,0x03,0xA4,0x86,0xFD,0xB3,0xB6,0x6A, + + 0x2C,0xD7,0xA2,0x0C,0x9A,0x34,0x3F,0x0C,0xD5,0xB5,0x02,0x32,0x30,0x9C,0x1C,0x2A, + + 0x2D,0xBF,0x35,0xFE,0x1F,0x6B,0x20,0xD3,0xFA,0x08,0xA4,0x11,0xD4,0xCF,0x5D,0xEB, + + 0xC8,0xA7,0xEE,0x73,0x3B,0x4F,0xBE,0x67,0x3D,0x16,0x01,0x5F,0x33,0x1B,0x30,0x69, + + 0x09,0x14,0x5F,0xF5,0xE5,0x69,0x42,0xBD,0x6C,0xB4,0x50,0x7D,0xDD,0x47,0xE6,0x2A, + + 0xF9,0x69,0x42,0x8A,0x3A,0xA7,0xAA,0xEA,0xCA,0x6B,0x02,0xE8,0x59,0xD1,0x71,0xE4, + + 0xE0,0xEC,0xF4,0x2F,0x67,0x22,0xA5,0x84,0x4B,0x40,0x49,0x5B,0xFA,0xC2,0x7B,0x74, + + 0x61,0x1F,0xA6,0x70,0x9C,0x24,0x6B,0x09,0x84,0x03,0x13,0xAD,0x51,0xC1,0x12,0xDF, + + 0x6E,0xF0,0x4C,0xE2,0xDB,0xC1,0x24,0x81,0xCB,0x0D,0x4C,0x3A,0x11,0x4C,0xBF,0xE2, + + 0x61,0x50,0x30,0xE6,0x4C,0xCF,0x2C,0x22,0xF1,0x3E,0xAE,0x37,0x1C,0xDF,0x34,0xF2, + + 0xDE,0x17,0x4C,0x11,0xFB,0x37,0x35,0x67,0x94,0x5E,0xFA,0x98,0x98,0x40,0x7D,0xA5, + + 0x22,0xFE,0xBE,0x07,0x21,0x4C,0xD5,0x24,0x2A,0x54,0x03,0x62,0x19,0x63,0x24,0x32, + + 0x00,0x7D,0xA4,0x46,0x10,0xCC,0xA9,0xCE,0x42,0xFE,0x87,0xB7,0x42,0xDE,0x3D,0xB3, + + 0x4E,0x9D,0x7F,0x74,0x8C,0x9B,0x2C,0x00,0x22,0xA9,0x2F,0x8B,0x99,0x30,0x15,0x11, + + 0x86,0x95,0xE1,0xBB,0x1D,0x73,0x7C,0x7E,0xC2,0xD9,0x78,0x8B,0x1B,0x31,0x65,0x4B, + + 0xA1,0xB6,0x19,0xE1,0x2B,0x8B,0x5F,0x81,0x45,0x50,0x01,0x76,0x53,0xD9,0xB5,0xA2, + + 0x9F,0x55,0x59,0x8E,0x4E,0x8B,0x17,0xEC,0xA3,0x51,0x22,0x8B,0x99,0x13,0xE1,0xAC, + + 0xA7,0x1E,0x32,0xEE,0xBA,0x24,0x89,0xD8,0x3D,0x53,0x00,0xDC,0xF8,0x6E,0x6E,0xD2, + + 0x87,0x14,0x31,0x7E,0xBB,0x25,0xDE,0x3D,0xEE,0x51,0x8B,0xAF,0x49,0x28,0x2E,0x3B, + + 0x09,0xEC,0xE8,0xD2,0x1B,0x5F,0x04,0x2D,0xEE,0x39,0x9F,0xB9,0x30,0x9B,0xEC,0xBD, + + 0x2B,0x1F,0x62,0xFF,0x46,0x5E,0x19,0x3D,0xE7,0x1B,0xC6,0xA2,0x1C,0x84,0x0D,0x71, + + 0xC3,0x2D,0xF9,0xA5,0x19,0x7C,0xFC,0x7B,0xC9,0x5A,0x16,0x2C,0xF1,0xA3,0x36,0xAB, + + 0x0A,0xB6,0x79,0xA7,0x3D,0x9D,0xD9,0xE8,0xE9,0x91,0x49,0x82,0xB1,0xAC,0x3F,0xEE, + + 0x43,0x4F,0xFB,0xB2,0xBC,0x34,0x77,0x67,0x4B,0xD4,0x63,0x8F,0x77,0xD8,0x37,0xDD, + + 0x4B,0xCA,0x30,0xBF,0x50,0xEE,0xBD,0x1B,0x69,0x5B,0x97,0x7C,0x7B,0xDF,0x7A,0x00, + + 0x96,0xC1,0xE2,0xC6,0x17,0x00,0x0E,0x42,0x98,0xCF,0x2B,0x55,0x75,0x5F,0x3A,0x13, + + 0xFE,0x0C,0xA8,0x94,0x84,0x0F,0xC0,0xC1,0x78,0xC7,0xE6,0x9A,0x39,0x4A,0xE5,0x86, + + 0xC7,0x71,0x61,0x82,0x90,0xA6,0x03,0x07,0xF7,0x23,0xEA,0x27,0xEB,0xD3,0xFD,0xE9, + + 0xA1,0x85,0x12,0xF5,0x39,0x5E,0x10,0x90,0x66,0x82,0x6C,0x33,0x29,0x22,0x1F,0x85, + + 0xEF,0x95,0xF0,0x66,0x56,0x29,0xF0,0x2D,0xC4,0xC0,0xCE,0x5A,0x9C,0xE7,0x76,0x67, + + 0x95,0x8D,0x23,0x69,0x40,0x7E,0xF8,0xA9,0x74,0x81,0x7A,0x0D,0xDA,0x63,0x06,0xB3, + + 0x06,0x99,0xB8,0x40,0x31,0x04,0xBD,0x01,0x3D,0x84,0xB9,0x37,0xF4,0x87,0x6B,0xBB, + + 0xC8,0x83,0xE9,0x6C,0xB6,0x3C,0xC6,0x95,0x45,0xC3,0x79,0xB7,0xCF,0xE6,0x8C,0x45, + + 0xAD,0x77,0xDA,0xE6,0x68,0xE5,0xF2,0xAA,0x59,0x8A,0x01,0x1F,0x5A,0x50,0xBA,0xF8, + + 0xA1,0x02,0xEA,0x8B,0xE2,0xAF,0x13,0x48,0xEC,0x38,0x04,0x1A,0xD0,0x64,0x43,0x41, + + 0x6A,0x87,0x63,0x8A,0x84,0xE8,0x73,0xBE,0x33,0xCC,0x12,0x5C,0xB0,0xE9,0xAC,0xF9, + + 0x0F,0xA3,0x4B,0x47,0x3C,0x34,0xC4,0xB9,0x5C,0xA6,0xDD,0x17,0x36,0xFA,0x27,0x0D, + + 0xEF,0x7A,0xE2,0xCA,0x1A,0xD0,0x94,0x08,0x0D,0x3C,0x66,0x52,0xA7,0x82,0x91,0x1D, + + 0xE6,0x9C,0x51,0xFB,0xE8,0x50,0x5A,0xE0,0xEE,0xDD,0x3A,0xBE,0xE4,0xE5,0x9C,0x39, + + 0x4C,0x8E,0x5C,0x7E,0x3F,0x51,0x2A,0x6C,0x69,0xC8,0x91,0x62,0xDD,0xFF,0x8C,0x25, + + 0xEE,0x8B,0xF9,0xDF,0x74,0x24,0x83,0x1D,0x30,0x45,0x2B,0xFB,0xDC,0x52,0x3B,0xE0, + + 0xE5,0x1A,0x9C,0x04,0xA5,0x4E,0x14,0xA2,0xE6,0xCC,0x18,0xD5,0x40,0x06,0x54,0xB6, + + 0x16,0xB5,0xD4,0x14,0xA4,0x8F,0x83,0x50,0x63,0xD3,0xA9,0x3C,0x76,0xD8,0xA2,0x01, + + 0x86,0xE0,0x0A,0x65,0x18,0x4F,0x5B,0xDD,0x47,0xB7,0xEF,0xA5,0x47,0x5B,0x95,0x6C, + + 0x04,0x62,0x95,0x68,0x19,0xBE,0x97,0x37,0xE7,0x31,0x83,0xD7,0x95,0x0C,0x1C,0xF3, + + 0x42,0x3B,0x50,0xA4,0xDD,0x45,0x91,0x80,0xA7,0x5E,0x34,0x26,0xCD,0xFC,0x12,0xE3, + + 0x6F,0xE4,0x47,0x91,0x39,0x69,0x9A,0x10,0xE5,0xD1,0xDC,0xE7,0xCA,0x44,0xF7,0xBD, + + 0xCC,0x37,0x56,0xFB,0x85,0xD6,0xF2,0xF3,0x64,0x1A,0x74,0x88,0x8E,0x49,0x59,0x59, + + 0x83,0x4C,0x29,0x1D,0x0C,0x18,0x98,0x91,0xA4,0x27,0x82,0x94,0xF4,0x0B,0x5E,0xAE, + + 0x8D,0x47,0xC6,0xC4,0x95,0x44,0xC9,0xA2,0x6A,0x5A,0x49,0xDC,0x1E,0x07,0x67,0xAB, + + 0x8C,0x38,0xF0,0xEB,0x7D,0x34,0xFA,0xBE,0xED,0xD9,0x41,0xC0,0x53,0x26,0x93,0xE9, + + 0x53,0x37,0xDF,0xA8,0x41,0xB5,0x7F,0x6B,0xA4,0x98,0x4C,0xD0,0x94,0xF7,0x17,0xBF, + + 0xC5,0x96,0x50,0xE0,0xBB,0x39,0x5F,0xF1,0x76,0xDF,0x81,0x8B,0x81,0x54,0xCD,0x37, + + 0xE6,0xE7,0xB2,0xD0,0x1C,0xD0,0x74,0x68,0xAB,0xCA,0xC9,0xB1,0x5A,0xE7,0xA1,0x50, + + 0xAA,0xBC,0x90,0x7F,0xD6,0x6C,0x25,0xFA,0x50,0xFD,0x33,0x43,0xDE,0x22,0x66,0xB9, + + 0x55,0xDC,0xD9,0xF2,0x74,0x9D,0x0F,0x99,0x11,0x23,0x93,0x7B,0x1B,0xBC,0xC7,0xFB, + + 0x2D,0x9B,0x89,0x7F,0x54,0xBC,0x6D,0x7C,0x54,0x42,0x4B,0x9D,0x00,0xBE,0xA3,0x29, + + 0xDC,0x51,0x27,0xA0,0xC4,0x03,0x42,0xDF,0xAB,0xB1,0x03,0xD7,0xD4,0xED,0xC0,0x76, + + 0xEA,0x62,0xB2,0xE7,0x3F,0x8C,0x0B,0x43,0x3D,0xE7,0x27,0xD6,0x19,0x02,0x3E,0x61, + + 0xD4,0x19,0xA6,0xA5,0x40,0xD3,0xBD,0x52,0xE2,0xE4,0xC3,0x6A,0x3B,0x06,0x08,0x77, + + 0x6A,0x80,0x5D,0x52,0x5B,0x73,0x8C,0xF1,0x85,0xE7,0xB9,0x6A,0x30,0xCC,0x3E,0x31, + + 0x80,0x18,0x3F,0x2A,0x14,0x26,0x70,0x86,0x71,0xA5,0xC8,0x94,0x2D,0x6B,0x70,0xD2, + + 0x92,0x23,0x71,0xD0,0x19,0xB3,0x3A,0x30,0x42,0x25,0xB8,0x30,0x5C,0x68,0xFD,0x23, + + 0x7D,0x63,0x31,0xB4,0x31,0xA6,0xE9,0x92,0xD1,0x28,0x65,0x95,0x2D,0x69,0xE6,0xB3, + + 0x2F,0xFA,0x09,0xD5,0xDD,0xD8,0x07,0xB9,0xC2,0xCA,0xD3,0x74,0x70,0x61,0x62,0x0A, + + 0x17,0x0C,0xCA,0xBD,0xF1,0x6B,0x87,0x15,0x80,0xD9,0x46,0xC4,0x5E,0x25,0x74,0xBD, + + 0x19,0x44,0x88,0xF3,0x7A,0x0E,0x7C,0x00,0xA2,0x4A,0x7D,0xFC,0x0D,0x2B,0x00,0xE1, + + 0xD5,0x47,0xC9,0x0C,0x67,0xD7,0x43,0x6E,0x21,0x49,0x6C,0x5E,0xF6,0x06,0x75,0xA9, + + 0x0B,0x0F,0x9D,0xB8,0x9F,0x31,0x25,0x04,0x03,0x3A,0xD2,0x3D,0xDF,0x71,0x3A,0xCA, + + 0x93,0x61,0x7B,0xC8,0x18,0x24,0xAB,0x06,0xC7,0xEA,0xDE,0x6B,0xFB,0xE4,0x2A,0x12, + + 0x85,0xF1,0xB2,0x4C,0xAE,0xA8,0xCD,0x90,0x27,0x00,0x1E,0x1E,0x1A,0x2D,0x7B,0xB6, + + 0x26,0x03,0x03,0xCD,0x6C,0x85,0x1A,0x29,0xCE,0x67,0x93,0x8F,0x58,0x66,0x33,0x7E, + + 0x76,0x00,0xD9,0x79,0x9D,0x0D,0x24,0xEB,0xCA,0x47,0xA3,0x1F,0x9A,0xEF,0xC0,0x05, + + 0x63,0x30,0xD4,0x9E,0x4C,0x90,0x3C,0xC2,0x9D,0x5C,0x9C,0xBC,0x8D,0x79,0x19,0xAD, + + 0xE9,0x40,0xF2,0x24,0xDA,0x92,0xCC,0x34,0x13,0x17,0xFC,0xFE,0x9B,0x7E,0x1A,0xE1, + + 0xB4,0xB6,0x51,0x87,0x71,0xBF,0x2D,0x9F,0xCA,0xA7,0x90,0xD7,0x1B,0xDB,0x5D,0x79, + + 0x8A,0x17,0x56,0xDA,0xCE,0x18,0x75,0xD3,0x1E,0x5D,0x62,0x91,0xF7,0xE0,0x17,0xCA, + + 0x24,0x87,0xA8,0x64,0x66,0x16,0x6A,0xC8,0xED,0xA2,0x9C,0x2C,0xF7,0x56,0x8C,0x94, + + 0x0E,0x1D,0xBE,0xD1,0x3F,0x5B,0xAC,0x92,0x9C,0x28,0x58,0x70,0x2C,0x37,0x46,0x43, + + 0x3B,0x7B,0xA5,0x9A,0x11,0x3B,0x1D,0xFD,0x60,0x4A,0x45,0x96,0xEA,0x7D,0x4B,0xA3, + + 0x48,0xBE,0xED,0xD4,0x3E,0x3F,0xF1,0x6E,0xE0,0xD7,0x1D,0x2C,0x0A,0x3B,0x07,0x9B, + + 0x10,0xE9,0x5B,0xB4,0x43,0xC7,0x2E,0x56,0x6E,0xD8,0x1C,0xEC,0x7C,0x50,0x91,0xFE, + + 0xC2,0x3A,0x8D,0x2C,0xD8,0x96,0xDF,0x5E,0x4B,0xC9,0x1E,0xBE,0x15,0x7F,0x21,0xA5, + + 0x8A,0x01,0x47,0x50,0x2A,0x39,0xCA,0x8D,0x09,0x41,0x98,0xDE,0x91,0x71,0x0E,0xFF, + + 0x42,0x58,0x5B,0x75,0xBF,0x76,0x1C,0x3B,0x2C,0x68,0xB6,0xDA,0x58,0xA4,0xB9,0xEC, + + 0x62,0xBD,0x46,0xAD,0xB1,0x70,0xF7,0xC1,0xEA,0xDE,0x52,0xC8,0x9B,0xD3,0xDE,0x27, + + 0x8A,0x82,0xD6,0xB1,0x19,0x0D,0x1C,0x07,0xD6,0x31,0xCB,0x0F,0x4F,0x02,0x67,0x92, + + 0xD5,0x3E,0x44,0x25,0x32,0xF3,0x37,0xA3,0x4C,0x53,0x41,0x1E,0xCA,0xD1,0xFB,0xBB, + + 0x50,0x5D,0x0B,0x7D,0xBB,0x3D,0xB8,0x39,0xF3,0x1D,0x70,0x92,0x26,0x3D,0x6B,0x60, + + 0xF7,0x0C,0x36,0x69,0xB7,0x0D,0x4E,0x1F,0xC9,0x6D,0x33,0xD5,0xD8,0x1D,0x38,0x20, + + 0xCD,0x8E,0xDC,0x92,0x06,0x40,0xE8,0x41,0x6F,0x67,0x81,0x12,0x66,0x7A,0x6B,0x1E, + + 0xEF,0x8D,0x75,0x36,0x80,0x23,0xE1,0xB0,0xB4,0x6D,0xC9,0x36,0xFA,0xE6,0xBC,0xE0, + + 0xF5,0x1E,0x14,0xF5,0x69,0xE0,0xAC,0xC0,0xEF,0x16,0x01,0xD7,0xD1,0x1C,0x5A,0xB1, + + 0x6E,0x9F,0x07,0xC2,0x14,0x46,0xB0,0x0C,0xB9,0x1F,0x88,0x04,0x17,0xE5,0x7E,0x15, + + 0xD9,0x8F,0xA7,0xD2,0x15,0x72,0xF8,0x3D,0xBF,0xDF,0x80,0xF4,0x52,0xC1,0xF7,0x25, + + 0x79,0x2B,0x1E,0x29,0x90,0xA4,0x71,0x9B,0xC6,0x84,0x89,0x05,0x97,0xEE,0x7C,0x20, + + 0xEF,0xC5,0x68,0x16,0x1D,0xBC,0xB9,0x77,0x1C,0x33,0xC1,0x27,0xDF,0xE8,0x68,0x17, + + 0x67,0x87,0x11,0xAF,0xE4,0xAB,0xA5,0x15,0x6E,0x8A,0x22,0xAC,0xCD,0x4F,0x3D,0xE9, + + 0x79,0x8F,0x6A,0x0F,0x4B,0x5D,0x8D,0x8A,0xBE,0x76,0xF7,0xDE,0x49,0xAB,0x33,0x39, + + 0x44,0x85,0x90,0x32,0xAF,0x8A,0x60,0xAD,0x38,0xA9,0x8B,0xCF,0x88,0x47,0x0B,0x42, + + 0x2C,0xE9,0x7B,0x01,0xB7,0x1F,0xFB,0x3E,0x6E,0x16,0xE8,0x02,0x52,0x1D,0x31,0xB6, + + 0x08,0x1F,0x74,0x3D,0x0D,0xE3,0x63,0x68,0x4A,0x98,0x92,0x2A,0xDE,0xE1,0xAA,0x1E, + + 0x22,0x87,0xF6,0x9D,0x2C,0x7F,0x42,0x1A,0x37,0x8F,0x39,0x5E,0x05,0x2D,0x60,0xC9, + + 0x1F,0xE3,0x73,0x6F,0x92,0xEE,0x62,0xE9,0x5F,0x7A,0xF9,0x6D,0x7D,0xA0,0x2B,0x28, + + 0xE7,0xCD,0x53,0x3F,0x9B,0x86,0xBF,0xA5,0x6E,0x30,0xC1,0x84,0x20,0xAD,0x88,0xF1, + + 0x02,0x36,0x5B,0xF5,0x1A,0xDC,0x0C,0xE5,0xA6,0x72,0x00,0xC4,0xF6,0xEC,0x78,0x01, + + 0x5D,0x3E,0xE5,0x96,0xB8,0x37,0xC4,0x12,0x67,0xAB,0x7C,0x0E,0x72,0xF9,0xB6,0x70, + + 0x82,0x3F,0x42,0x47,0xB1,0xF0,0x3D,0xA6,0x87,0xF2,0xD1,0x23,0xF1,0xC8,0x79,0xD4, + + 0x4C,0x90,0xEB,0x57,0xFD,0xF1,0xFD,0x6F,0x1F,0x2E,0x7D,0x35,0x6C,0x9E,0xAF,0x4B, + + 0x02,0x6B,0x0C,0xCA,0x05,0xD6,0xB0,0x3C,0x8F,0xE5,0x7A,0x59,0x8B,0x9A,0x13,0x56, + + 0x70,0xA7,0x94,0x3E,0x7D,0xF8,0x42,0xDA,0x61,0xD7,0xC6,0x05,0x1F,0x5A,0x5D,0x39, + + 0x0A,0x9B,0x5D,0x45,0x94,0x86,0x0D,0xED,0xDE,0xA6,0x97,0xE2,0xF7,0x16,0xC1,0xAD, + + 0x65,0xF7,0x8D,0x77,0xEB,0xB8,0x75,0x77,0xE5,0x35,0x6F,0xF5,0xB8,0xB5,0x40,0x2E, + + 0xC5,0x69,0xEF,0x92,0xBC,0xFA,0x20,0xC8,0x04,0xD5,0x8E,0x50,0xD0,0xF5,0x10,0x3E, + + 0x4D,0x66,0xE6,0x1E,0xC9,0x1A,0x04,0x0A,0x7E,0x76,0x36,0x77,0x7B,0x6A,0x41,0x2A, + + 0xAD,0x0A,0x18,0xC8,0x7E,0xCB,0x25,0xCB,0x07,0x9E,0xD7,0xE5,0x72,0xB8,0x51,0x3B, + + 0x44,0xB8,0xA9,0x2E,0xDE,0x5F,0x9B,0x3F,0xA5,0xC2,0x77,0x7F,0xD5,0x76,0xF6,0xB8, + + 0x91,0xC3,0x0E,0xCA,0xBB,0xDC,0x89,0x1B,0xCD,0x5C,0xBE,0xD1,0xC3,0xBE,0x10,0xDD, + + 0xCE,0x92,0x6A,0x3C,0xBD,0xF5,0xBE,0x7A,0xDD,0x70,0xE8,0xD9,0xDE,0x52,0xDE,0x4F, + + 0xA4,0xA8,0x87,0x8B,0xF9,0x35,0xCE,0xD9,0x8E,0xDF,0xF1,0x10,0x5F,0x51,0xDB,0x39, + + 0xBB,0xC8,0x26,0x3D,0x3D,0xF7,0x6E,0x7F,0xED,0x0F,0x6D,0xB8,0x35,0xAE,0x3E,0x29, + + 0x61,0x04,0x2D,0x20,0x7B,0x2F,0x81,0xA4,0x5D,0xBE,0xF6,0x22,0xB9,0x04,0x28,0x9A, + + 0x02,0xC1,0xC0,0x90,0x13,0x82,0x8A,0xC3,0x2D,0xEE,0x82,0x36,0xC3,0x69,0x78,0x72, + + 0xE8,0x8B,0x01,0x7A,0x96,0x20,0x2B,0xD2,0xA8,0xED,0x8B,0x27,0x63,0xBF,0x2F,0x20, + + 0xB9,0xA7,0xF6,0x6A,0x97,0x21,0x08,0xCC,0xA9,0xF8,0x19,0xF2,0xF5,0x0F,0xC0,0x3B, + + 0xE2,0x85,0xF5,0xC0,0x5F,0xB5,0x09,0x1C,0xE7,0xE2,0xEB,0x7F,0xF1,0x26,0x88,0xD0, + + 0xF5,0x48,0x95,0x15,0x15,0xC4,0x78,0x83,0xE0,0x57,0x30,0x4A,0x79,0x90,0x48,0xC5, + + 0x80,0xFA,0x1C,0x44,0xA5,0x5A,0x03,0x12,0xEC,0xCF,0x55,0x0D,0x8E,0x62,0x4B,0xB7, + + 0xA7,0xB8,0x77,0xD1,0x9F,0xFC,0xE1,0x01,0x43,0xE1,0x09,0x4E,0xF2,0xFC,0x90,0x24, + + 0xE1,0xA9,0x8A,0x88,0x12,0x68,0x84,0xAC,0x15,0x3A,0x02,0x5F,0x1F,0xE1,0x74,0x29, + + 0xE2,0xC8,0x33,0x86,0xF2,0x4A,0x8B,0x4B,0x21,0xEF,0x09,0x5A,0xA6,0x05,0x53,0x7E, + + 0xC0,0x87,0x2F,0x96,0x73,0xA9,0xBF,0x5A,0xAC,0xEC,0x13,0xCD,0xB7,0x71,0xE7,0x6A, + + 0xED,0x8D,0xD5,0xFF,0x9D,0xD6,0x0E,0xF9,0xC6,0x27,0xF9,0x7D,0xD8,0xEB,0x7A,0xB6, + + 0xA6,0x01,0xBD,0x8B,0xE7,0x9A,0x2A,0x4C,0xA3,0x45,0xD2,0x7F,0x38,0x3F,0xA6,0x27, + + 0xC9,0x0D,0xCF,0xD8,0x77,0xC0,0xF6,0xE7,0x6F,0xE0,0x0E,0xF8,0x02,0x39,0xBC,0xCD, + + 0xDD,0x3C,0x78,0xDE,0x39,0x26,0x11,0x96,0x23,0xED,0x8D,0xC0,0xD2,0x1B,0xF0,0xCB, + + 0x8F,0x4E,0x70,0x42,0x38,0x6D,0x8A,0x49,0xC3,0xE0,0xFB,0xFC,0xE4,0x67,0x22,0xB1, + + 0x4C,0xB4,0xC0,0x80,0xBD,0x86,0x1C,0x5B,0x1F,0x4C,0x8C,0x3C,0x76,0x12,0xBB,0xFF, + + 0x27,0xB1,0xF2,0x21,0xCC,0x73,0x7D,0x32,0xFC,0x87,0xFC,0xFE,0xBF,0x33,0x97,0xA9, + + 0xA6,0x18,0xFB,0x2D,0x05,0xA4,0xCE,0x22,0xE6,0xA8,0x90,0x21,0xF2,0xD1,0xF2,0xE2, + + 0xC9,0x1C,0xCD,0x4C,0xB7,0x31,0x25,0xA1,0x42,0x58,0x17,0xA8,0xF2,0xA3,0x5E,0xC2, + + 0x91,0xB9,0x90,0xCB,0x14,0x32,0x44,0x13,0xE6,0xD9,0x2F,0x14,0xE8,0xA5,0xDC,0x20, + + 0xD0,0xB4,0x82,0x27,0x0D,0x91,0xB1,0xC0,0x62,0xFA,0xA3,0x94,0x0B,0x19,0x91,0xB1, + + 0x22,0x00,0x68,0x0A,0x13,0x3D,0x07,0xCA,0xE4,0xB7,0x15,0x25,0x1B,0x7B,0x9C,0x22, + + 0x27,0x9C,0xD5,0x6D,0x0F,0x34,0xFD,0x83,0x81,0x62,0xBF,0xE5,0xF0,0xF7,0xB2,0xFB, + + 0x4C,0x17,0xD0,0x77,0xC5,0x7A,0x94,0x2A,0xF5,0xEE,0x56,0x2C,0xBD,0x3A,0x56,0x9E, + + 0x1A,0x42,0x48,0xDB,0xE3,0xC6,0xB3,0x23,0xC8,0xDE,0x7B,0x38,0x3C,0x89,0x82,0xE6, + + 0xC9,0xCA,0x47,0xC7,0xBE,0x38,0x2F,0xB9,0x4B,0x5C,0xD7,0x1C,0x7A,0x66,0x31,0xAC, + + 0x0E,0x0B,0x34,0x07,0x24,0xC6,0x1B,0xA0,0x45,0x56,0x97,0x1D,0x7B,0x67,0xB1,0x79, + + 0x10,0xB3,0x77,0xF1,0x41,0x2A,0x96,0xBD,0x1A,0xF1,0x8D,0xEC,0xFA,0xFC,0xE2,0xAB, + + 0x1D,0xEB,0xA3,0xAE,0xC4,0xC0,0x66,0x02,0xC7,0x50,0xE5,0x79,0x75,0x1F,0xE3,0xED, + + 0x84,0xC1,0x9C,0xC2,0xBC,0x74,0xDE,0x6D,0x86,0x8A,0xE8,0xDD,0x09,0xE1,0x31,0x75, + + 0x42,0x2C,0x63,0x4E,0x9A,0x35,0xF3,0x66,0x1A,0x89,0x95,0x60,0x00,0x7C,0xDF,0x71, + + 0x6C,0x09,0x60,0x86,0x64,0x1F,0x0A,0xB1,0x74,0x3F,0xEA,0x67,0xF3,0xA1,0xAA,0xE3, + + 0x6D,0x71,0x68,0x97,0x11,0xCD,0x94,0x4D,0x8F,0x90,0x98,0xCF,0xAA,0x1A,0x01,0x91, + + 0x58,0x8A,0x1E,0x83,0x96,0x18,0x0B,0xB0,0xA8,0x1D,0x0E,0xC7,0x92,0x99,0x77,0x27, + + 0x7A,0xED,0xCE,0xE4,0xF3,0xFE,0x82,0xA0,0xFD,0xC9,0xB2,0xCB,0x53,0xA1,0x5E,0xEE, + + 0x6E,0x89,0x64,0xF0,0x5E,0xFC,0x23,0x10,0x62,0x11,0xCA,0x9D,0xAA,0xA7,0x93,0xA2, + + 0x05,0x74,0x6F,0x16,0xD7,0xE4,0x78,0x76,0x43,0xB9,0x99,0xF4,0xCA,0x9B,0x9E,0x30, + + 0xBC,0xE5,0xDF,0x0B,0x1B,0x20,0xA7,0x5C,0xF4,0x5D,0x42,0xC6,0xD0,0x1C,0x17,0x55, + + 0xE4,0xF0,0x97,0x50,0x36,0x38,0x43,0x80,0xD2,0x63,0xC1,0xE7,0x74,0x4A,0x1C,0x3E, + + 0xC6,0x99,0xC1,0xFD,0x76,0x55,0x3E,0x0A,0x00,0xC6,0x7D,0xA4,0x63,0xEC,0x53,0x69, + + 0x65,0x00,0xEA,0xAF,0xE6,0x54,0xD6,0xA8,0x50,0xC1,0x61,0xBD,0x5B,0x13,0x1D,0x3E, + + 0xED,0x8E,0x63,0x8F,0x9D,0xE8,0x53,0x64,0xEF,0xC7,0xEC,0xD0,0xA3,0xF2,0x0B,0x91, + + 0x8C,0x4B,0x6B,0x9B,0x12,0xE9,0x38,0x49,0x6E,0xB0,0xDA,0xD7,0xA9,0xA6,0xB1,0xB9, + + 0x82,0x81,0x56,0x2C,0xE5,0xEE,0xFB,0x27,0x6C,0x0C,0xEA,0x81,0x69,0xEC,0x52,0xA9, + + 0x6D,0xE3,0xFD,0x41,0x6B,0x39,0xF7,0x89,0x52,0x60,0x25,0xF4,0x28,0x99,0xF3,0xB8, + + 0xA0,0xEB,0xAF,0x9B,0xBA,0x7A,0xF1,0x9B,0xCF,0x6F,0xC4,0x53,0x2E,0x5F,0x0D,0x62, + + 0x66,0x1E,0x7C,0x44,0xBD,0xFB,0xF6,0x4A,0x6E,0x4E,0x7B,0xAB,0x61,0x62,0x1A,0xAA, + + 0x83,0x8B,0x09,0x68,0xC4,0x13,0x46,0x57,0x74,0xD6,0x52,0xC4,0x83,0x95,0x2D,0xE1, + + 0x11,0xDE,0x1B,0x3E,0x33,0xF1,0x44,0xB0,0x35,0x2A,0x04,0x4D,0x1E,0xFE,0x7C,0xF0, + + 0x9C,0xDD,0x92,0x33,0x40,0x51,0x1C,0xB9,0x87,0xF2,0x8D,0x58,0xC7,0x23,0xBD,0x7B, + + 0x23,0x5E,0x00,0x89,0x39,0x47,0x3D,0x4F,0xE3,0x93,0x3D,0x85,0x95,0x6B,0x87,0x31, + + 0x1C,0xD5,0xF5,0xD5,0x14,0xF0,0x3C,0xEE,0x8F,0x8C,0xE4,0x62,0x36,0x6B,0xD3,0xE3, + + 0x11,0x3A,0x94,0xD2,0xCA,0xF7,0x04,0xD5,0x9A,0xDA,0x43,0xB1,0xAD,0xFD,0xD2,0xA3, + + 0xD1,0x96,0xC3,0xFA,0x3A,0x1D,0xB5,0xD6,0x32,0x0B,0xCA,0x87,0xFE,0x44,0xBC,0xAD, + + 0xCD,0xA4,0xEB,0x28,0x16,0x28,0x43,0xBE,0x8F,0xDA,0x78,0x88,0x78,0x61,0x78,0xA3, + + 0x2C,0x37,0x06,0xD4,0x89,0x24,0xEC,0xEE,0x8D,0xDE,0x76,0x2B,0x20,0xBA,0x16,0xFA, + + 0x69,0x94,0x7A,0xA1,0x5F,0xFB,0x5E,0xF5,0xB7,0xD6,0x5B,0xDC,0x8A,0x9C,0xB6,0x09, + + 0x2C,0x5D,0x88,0xE0,0x65,0x6F,0x1E,0xB1,0x4F,0x57,0xF7,0x11,0x7E,0xE6,0x71,0xB2, + + 0xAD,0x34,0x2F,0xD0,0x32,0x46,0x8B,0x59,0xEB,0xC2,0x87,0x40,0x96,0xF4,0x18,0x63, + + 0x0A,0x31,0x52,0xAC,0xC5,0x18,0x64,0x8A,0x85,0x98,0xBE,0xFA,0xFE,0xEC,0x3D,0xA9, + + 0x15,0x1E,0x4A,0x2F,0x9C,0xFD,0xE8,0x35,0x0F,0xD9,0x7D,0x40,0x3F,0x51,0xB6,0xFB, + + 0x51,0x31,0x37,0xC9,0x76,0x9D,0x4D,0x5B,0x56,0x9C,0x48,0x96,0xDF,0x7E,0x90,0x28, + + 0x91,0xDE,0x50,0x5B,0xF7,0x40,0x01,0xFD,0x0E,0x5C,0x50,0x81,0x22,0xBE,0x59,0x06, + + 0xA5,0x7F,0xD2,0x2A,0xFB,0x44,0x92,0x52,0x73,0x34,0x50,0xFC,0x05,0x6A,0xB0,0x3D, + + 0x13,0x4C,0x8C,0x9E,0x35,0xAC,0xC3,0x1E,0x3E,0x07,0x0A,0xD2,0x75,0x95,0xD8,0x01, + + 0xB3,0x39,0xDB,0x04,0x33,0xD2,0xE9,0x29,0x67,0x03,0x97,0xCD,0xAB,0xCF,0xD8,0x56, + + 0xE0,0x07,0xF7,0x38,0x7A,0xB2,0x27,0xED,0x7E,0x18,0x15,0x2E,0x90,0xCE,0x5A,0xDF, + + 0x69,0x0B,0xE0,0xE1,0xEC,0xFB,0x0A,0x61,0xE1,0x05,0xB0,0x66,0x2B,0x69,0xB7,0x74, + + 0xDF,0x14,0xDB,0xA8,0x57,0xA8,0x10,0xCD,0xCE,0x07,0x34,0xE6,0x5F,0x6D,0xC0,0x53, + + 0xEA,0xCE,0xC3,0xB9,0xDA,0x22,0x91,0xA1,0xC2,0x04,0xFB,0xB5,0x8E,0x99,0x73,0xA2, + + 0xB7,0x01,0xB6,0xA5,0x09,0x96,0x5F,0x68,0xC0,0xE6,0x59,0x88,0xDF,0x97,0x60,0x0A, + + 0x0B,0x68,0xFC,0x3D,0xF1,0x89,0x12,0x5A,0xB3,0x0A,0x98,0xA8,0x56,0x22,0x0A,0xE1, + + 0x49,0xF5,0xC1,0x6F,0x69,0x88,0xA5,0x7F,0x83,0x93,0xA4,0x79,0x5F,0x6B,0xAB,0x28, + + 0xAC,0x91,0x2F,0x9E,0xCF,0x20,0x5E,0x17,0x29,0xB5,0x53,0xAD,0x96,0x95,0xB6,0x46, + + 0x5C,0x56,0xB3,0xE2,0x70,0x5A,0x53,0x41,0x34,0x09,0x93,0xB9,0xDB,0xC8,0x4A,0x00, + + 0xEB,0x03,0x02,0x8C,0xF3,0x21,0x32,0x3E,0x67,0x41,0x55,0xEE,0x78,0x1E,0x4B,0xA3, + + 0x78,0x01,0x75,0xC6,0xA4,0xB0,0x63,0x3A,0xEA,0x0F,0x58,0xFE,0xC6,0x94,0x83,0x84, + + 0xA6,0x75,0xB8,0x2D,0x8C,0x42,0x2A,0x4E,0x66,0x2B,0x6C,0x8F,0xE9,0x95,0xB4,0xA5, + + 0x59,0x4D,0x27,0xC2,0x9A,0x4F,0x13,0x79,0x48,0x42,0xE3,0x83,0x38,0x66,0x66,0x82, + + 0x23,0x52,0x11,0xC3,0x03,0x29,0xB0,0x50,0x68,0x5F,0x8E,0xD7,0x39,0xF6,0x55,0x8A, + + 0x84,0xE0,0x1A,0x10,0x62,0xA9,0x64,0xB4,0x81,0xD0,0x58,0x92,0x8C,0x6A,0x5C,0x82, + + 0x05,0xED,0x3D,0x16,0x80,0x9F,0xAA,0xC1,0xFE,0xF9,0x95,0xE5,0xB6,0x30,0xF5,0xF7, + + 0x2E,0x95,0xC5,0x8D,0x58,0xD2,0x9E,0x35,0xB2,0x3B,0x1D,0xEB,0x7C,0x11,0x64,0x3E, + + 0xA0,0x1E,0x9E,0xC5,0x95,0x75,0x3C,0x82,0xD1,0x38,0x8D,0x19,0x97,0x80,0x2C,0x90, + + 0xCD,0x98,0x33,0x24,0x3B,0x29,0xB0,0x74,0x2B,0xE5,0x1C,0xC1,0xCB,0x78,0x27,0xB2, + + 0x92,0x19,0x7E,0xA5,0x96,0xB4,0xEA,0x65,0xE1,0xA4,0xAD,0xF7,0x1B,0x79,0x35,0x53, + + 0xA2,0x60,0x72,0x9F,0xA3,0x33,0x15,0x69,0xD0,0x12,0xA6,0xD2,0x52,0xC8,0xC5,0xC8, + + 0x4A,0x54,0x7E,0x84,0xD1,0x29,0xD6,0x70,0x27,0x50,0x3D,0x29,0xEB,0x47,0xA5,0xC7, + + 0x94,0xE5,0x98,0x7A,0xB6,0x22,0x60,0xBE,0x88,0xDA,0x25,0x0D,0x30,0xD6,0x13,0xAD, + + 0x7D,0x47,0x7F,0x65,0xC3,0x97,0x10,0x59,0x62,0xAB,0x81,0xF9,0x13,0xB2,0x54,0x99, + + 0xD2,0x5B,0x91,0xFB,0x73,0x6A,0xAE,0x4A,0x65,0xD0,0x91,0x83,0xB0,0x8E,0x3E,0x4A, + + 0x2B,0x7E,0x46,0x8B,0x14,0x22,0x96,0x28,0x4C,0x5A,0x62,0x8E,0x8D,0x19,0x76,0x08, + + 0xD5,0x12,0x97,0xD2,0x9E,0x36,0xEA,0x9A,0x90,0x38,0xD4,0x78,0x33,0xCB,0x7F,0x19, + + 0x75,0x11,0xBC,0x25,0x3A,0x71,0xFD,0x8C,0x4B,0xC1,0xEF,0x12,0x78,0x3D,0x2F,0x98, + + 0x27,0x12,0x8F,0x35,0x3B,0x72,0x67,0x07,0x47,0x52,0x5F,0x20,0xF2,0x64,0x8B,0x86, + + 0x08,0xC3,0x74,0xF8,0xE9,0x21,0x7B,0x9B,0xE5,0x5F,0x70,0xA2,0x7D,0xA2,0xCF,0x6C, + + 0x64,0x85,0x5D,0xE8,0xED,0xA8,0xD8,0x44,0xFA,0xAF,0x34,0xB2,0x57,0x5B,0xCD,0xEB, + + 0xBB,0xCF,0xE1,0xF8,0x61,0x21,0x85,0x41,0x3F,0xD9,0xF1,0x96,0x2F,0x4F,0x57,0xF1, + + 0x97,0xCE,0xF2,0x17,0xAA,0x42,0x06,0xBC,0xA6,0xC7,0x79,0xB6,0xD1,0x8F,0x64,0x23, + + 0x7D,0x94,0xDB,0xD9,0xA9,0xBF,0x09,0x25,0xBB,0xB2,0x35,0x8E,0x48,0xA9,0xB3,0x10, + + 0x01,0x7D,0x04,0xCC,0x14,0x05,0x31,0x9E,0x43,0x87,0x80,0x64,0xA8,0x48,0x3A,0x43, + + 0xF9,0x86,0x45,0x21,0x65,0xDB,0x8E,0x1D,0x50,0xBD,0x8E,0x14,0xF7,0x52,0x30,0x2C, + + 0xD2,0x8E,0xD6,0x47,0x60,0xA3,0x31,0x46,0x4A,0x85,0xE1,0x6C,0x74,0x63,0x38,0x08, + + 0xC6,0x87,0xFC,0xBA,0x24,0xEA,0x4B,0x50,0x2D,0xCC,0xD5,0xD5,0xE9,0x7E,0x92,0x27, + + 0x1F,0xC4,0xBC,0x26,0xF6,0x38,0xDA,0x07,0xA6,0x8D,0x19,0x6F,0x81,0x21,0x6B,0x17, + + 0xBF,0xB1,0x69,0xF6,0x75,0xA3,0x52,0x6B,0xCF,0x41,0xC8,0xAB,0xD7,0x20,0xF8,0x5C, + + 0xEC,0x8F,0x91,0xAE,0xA1,0x04,0x01,0x8B,0x79,0x64,0x17,0x4C,0x98,0x6D,0x26,0x5B, + + 0x3A,0x21,0xE0,0x57,0xE4,0x2C,0x74,0x73,0x4D,0xEC,0xCC,0x8C,0x7F,0xCC,0x62,0x89, + + 0x8D,0xA5,0xE8,0x1E,0x07,0xC5,0x43,0x38,0xEE,0xD6,0xD8,0x96,0x20,0x22,0xF2,0x0C, + + 0x4C,0xEE,0x8A,0x31,0x11,0x28,0xE3,0xEF,0xCD,0x3D,0x74,0x11,0x02,0xE1,0xD5,0xAB, + + 0x7C,0x80,0xA6,0x5B,0xAC,0xAB,0xCB,0xFF,0xCC,0x8F,0xA2,0xF2,0x7A,0x10,0xE4,0x87, + + 0x02,0x8B,0x9A,0xAF,0x32,0x2A,0x30,0x40,0x8D,0x0A,0x3E,0x5E,0x74,0x4B,0x94,0x69, + + 0xA8,0x8A,0xB9,0x70,0x25,0x1C,0xDF,0x72,0x37,0x7A,0x1F,0xE7,0xA9,0x39,0x7C,0xE5, + + 0x57,0x82,0xAE,0xC7,0xA0,0x1F,0x77,0x5D,0x19,0xBE,0x34,0x23,0xF0,0x4C,0xF0,0xF5, + + 0x7F,0x2C,0x3C,0x71,0x7D,0x12,0x45,0xB7,0x18,0x56,0xE7,0xBA,0x9D,0x9B,0x2E,0x35, + + 0x85,0x19,0xBD,0xC8,0x91,0x39,0xD8,0x66,0x65,0x26,0x50,0x90,0x8D,0x0F,0xEB,0x50, + + 0x24,0x13,0x7C,0xA4,0x04,0xE1,0x74,0xEF,0x8E,0x1F,0x3C,0x23,0x11,0xEE,0x9A,0x32, + + 0x6A,0xB6,0x85,0x8D,0x1C,0xB9,0x99,0x67,0xAE,0x66,0xF1,0x63,0xF5,0xEC,0x55,0x61, + + 0x58,0x38,0x15,0xF3,0xB1,0x56,0x91,0x61,0xEF,0xDD,0xBC,0x91,0x9C,0xF8,0x67,0xEC, + + 0xFE,0x07,0x34,0x9F,0x54,0xBC,0x24,0x2E,0x6A,0x42,0x76,0x2F,0xB1,0x07,0x34,0x98, + + 0x9E,0x04,0x51,0xD9,0x0E,0xA0,0x36,0xA3,0x0E,0xBF,0x7E,0x3A,0x32,0xBB,0x8B,0xF0, + + 0x72,0x47,0xC0,0x67,0x3A,0x77,0xBB,0x2F,0xBF,0x30,0xED,0x6F,0x94,0x72,0x35,0x99, + + 0x3F,0x91,0x17,0x00,0xDE,0xBF,0xA8,0x48,0x69,0x56,0x71,0x0C,0x70,0x70,0xA6,0x1B, + + 0x2F,0x9A,0x07,0xAC,0xBC,0xBF,0xF4,0x02,0x29,0x91,0x21,0xDC,0x81,0x29,0x16,0x58, + + 0x2C,0x1B,0x2E,0xEB,0xED,0xB0,0xEE,0xBD,0x4B,0x2A,0x9E,0xBE,0x91,0x76,0x2F,0x58, + + 0x47,0xAF,0xE2,0x2D,0x8D,0xC5,0x05,0xEA,0xEA,0xB0,0x8F,0x6B,0xA5,0x1A,0x17,0x59, + + 0xAE,0x87,0x8F,0x7F,0xE3,0xB0,0x80,0xEB,0x0E,0x00,0xFB,0x1D,0xCC,0xAD,0xB8,0x52, + + 0x2E,0x63,0xE2,0x1D,0x13,0x60,0x28,0xDF,0x4E,0x22,0xAE,0x84,0x92,0x60,0xF5,0x2B, + + 0x20,0xFA,0x64,0x86,0x11,0x2B,0x90,0xFD,0xE2,0xBC,0x34,0x10,0xDE,0x63,0x4B,0x43, + + 0xC1,0x01,0x87,0xA5,0x79,0x21,0xD5,0xF1,0xCC,0x44,0xD9,0x21,0x5F,0x23,0x0D,0x95, + + 0xDE,0x44,0x8E,0x66,0xBB,0xA5,0x53,0x24,0x43,0x40,0x2E,0x34,0x5C,0x6F,0xFF,0xA2, + + 0x69,0x15,0x52,0xB7,0x7E,0x8B,0xD0,0xA7,0x66,0xDF,0x32,0x7B,0x9C,0xCF,0xB7,0x23, + + 0x33,0x69,0x5E,0xD0,0x4E,0x57,0x60,0x9E,0xEF,0x48,0x58,0x06,0xB8,0xB3,0x45,0xA9, + + 0xEE,0x4B,0xD0,0xB8,0xFA,0x9D,0x51,0xE3,0x0B,0x6E,0xB7,0x61,0xB9,0xE0,0xAE,0x91, + + 0xC6,0xAA,0xD9,0x40,0x6A,0xAA,0xA4,0x8E,0x16,0x1A,0xA7,0xEA,0xB8,0xD1,0x38,0xFB, + + 0x51,0x7D,0x02,0x4C,0x00,0x85,0x51,0xCA,0xCA,0x00,0xFA,0x32,0x32,0x9C,0xCA,0xC5, + + 0xFF,0x4B,0x82,0x18,0x96,0x68,0x7A,0x3A,0x38,0x44,0xCB,0x4F,0x67,0xC2,0x1B,0xF2, + + 0xF7,0x2A,0x53,0xCA,0x5A,0x6A,0x5F,0xD9,0xC4,0x45,0x41,0x37,0xB6,0xDE,0x58,0xC5, + + 0xBA,0x69,0x8D,0x20,0x19,0x4E,0xE4,0x6B,0xC7,0x29,0xE3,0x39,0x39,0xCA,0x53,0xCC, + + 0x08,0x04,0xA2,0x03,0x39,0x23,0xF9,0xEC,0x4E,0xF2,0xD3,0x9F,0x88,0xC3,0x74,0x70, + + 0x0D,0x0F,0x10,0x18,0x3F,0xD9,0x62,0xE7,0xC9,0x81,0xEC,0x70,0xB0,0xE8,0x83,0xC9, + + 0xC4,0xF1,0x3C,0xB1,0x9C,0x6C,0xFF,0xEB,0x0F,0x5D,0x61,0x9E,0x36,0xC5,0x04,0xDD, + + 0x89,0xAC,0x5E,0x46,0xEB,0x6D,0x8D,0x1B,0x1D,0x47,0x73,0xF7,0x22,0xB3,0xB0,0x70, + + 0x00,0x1F,0xF6,0x85,0x14,0x2B,0x4A,0x9D,0x68,0x4B,0xA2,0xAC,0x9B,0xF5,0x08,0x72, + + 0xA6,0x61,0x4D,0x9C,0x94,0x5F,0xE3,0xC3,0x1D,0x3D,0xCD,0x27,0x4F,0xDE,0x65,0x21, + + 0xAC,0x99,0x10,0xE3,0x52,0x12,0x83,0xC7,0x80,0xED,0x3D,0x2F,0x7D,0xDF,0xE5,0xAE, + + 0x85,0x51,0xEF,0x91,0xB2,0x51,0xFA,0x71,0xEA,0xD8,0xBA,0xC6,0x9F,0xF5,0x3C,0xB3, + + 0x12,0x56,0xCC,0xAF,0x4D,0x14,0x0C,0xE8,0x51,0xA4,0x29,0xE6,0x32,0x21,0x49,0x52, + + 0xEA,0x12,0x4A,0x50,0xFB,0x44,0xA4,0xD4,0x9E,0xDC,0x61,0xAB,0xA6,0x28,0x05,0x18, + + 0xA4,0x94,0x05,0x04,0x5E,0x37,0xEA,0x07,0xD1,0xE6,0x26,0xCA,0x0C,0x8A,0xE2,0x33, + + 0x0F,0xEA,0x19,0xC6,0xC3,0xB4,0xDD,0x11,0xFE,0x1B,0x76,0x37,0x70,0x31,0x55,0x54, + + 0x1B,0x68,0xB8,0x2D,0xFA,0x3C,0x93,0x99,0x14,0x1A,0x96,0x5F,0xA8,0xD3,0xF1,0x1C, + + 0x7A,0x17,0xC6,0x95,0xB4,0xC4,0xDA,0xCC,0x92,0x1B,0xCE,0x22,0x82,0x65,0xBF,0x77, + + 0xB8,0x57,0xB9,0x2D,0x7A,0x3A,0x53,0xFE,0x17,0x18,0x32,0xA8,0x7F,0x6C,0x56,0x1C, + + 0x0C,0xE4,0xED,0x4C,0x4C,0xBD,0xD0,0xB7,0xEF,0x39,0x22,0xF7,0x1D,0xFC,0x3E,0xD9, + + 0x1A,0x18,0x1B,0x86,0x41,0x25,0xD0,0x00,0x36,0xA1,0x61,0xC8,0x57,0x15,0xED,0xBA, + + 0x68,0xED,0x55,0x1A,0x77,0x7C,0x64,0x0B,0x77,0x5B,0x00,0x09,0x14,0x96,0x37,0xED, + + 0x28,0x1A,0x18,0x85,0xBC,0xC6,0xAF,0x01,0xB2,0x11,0x4B,0x9C,0x93,0xD7,0x5D,0xCD, + + 0x54,0xE2,0xE9,0xF0,0x95,0x9B,0xF2,0x36,0x88,0x1F,0xC0,0x84,0x82,0xC6,0x98,0x80, + + 0x26,0xB0,0x0C,0x22,0xC8,0x51,0xF4,0xF2,0x4C,0xC6,0x62,0xD9,0xBD,0xEF,0xD3,0x1A, + + 0xA0,0x7E,0xE8,0xA7,0x13,0xE3,0x12,0xB7,0x06,0xA1,0x1F,0xA1,0xB4,0x4E,0x59,0xEB, + + 0x98,0xCF,0x61,0x87,0x81,0xE0,0xB9,0xFB,0x67,0x3F,0xE7,0x96,0x3F,0x24,0xE9,0xCB, + + 0x06,0xCF,0xFA,0xE8,0x93,0x79,0x8D,0xD1,0x47,0xC7,0xDF,0xC6,0x17,0xA3,0x1F,0xC6, + + 0x7E,0xD9,0x28,0x03,0xF7,0x0B,0x32,0x10,0xFD,0xDB,0xCB,0x38,0x65,0x24,0x16,0x54, + + 0xE6,0x06,0x28,0x4B,0xEA,0xA3,0x83,0xF6,0x45,0x61,0x53,0xBC,0xEC,0x4A,0x3B,0x4F, + + 0xEE,0x97,0x64,0xC3,0xC9,0x8E,0xC6,0x4B,0x35,0x79,0x5D,0xC2,0x03,0x85,0x40,0xA0, + + 0x0B,0x7A,0x46,0xB5,0x36,0x20,0xB9,0xF7,0x79,0xAB,0xDE,0x69,0x07,0x4C,0x93,0x88, + + 0x2E,0x38,0xE7,0x10,0x3E,0x5C,0x6F,0x48,0x0F,0x28,0x94,0x9F,0x8A,0x4C,0xE5,0xE2, + + 0x8F,0x8A,0x6A,0x9F,0x05,0xEB,0xAA,0x48,0xA6,0xCA,0xE4,0xA4,0x59,0x46,0x79,0x0A, + + 0x2F,0xC8,0xF7,0x8B,0x9E,0x6B,0x53,0x6F,0xE9,0xC5,0x61,0xB0,0x37,0x5C,0x6A,0xEB, + + 0x35,0x84,0x60,0x96,0x74,0x5A,0x45,0x9A,0x26,0x88,0x09,0xCC,0x31,0x40,0x1A,0x39, + + 0x3E,0xCE,0x66,0x4B,0x91,0xA8,0xB2,0x7B,0x16,0xC6,0x57,0x6A,0xD9,0xFA,0x6F,0xD8, + + 0xC6,0x58,0x2A,0x83,0xC0,0x00,0xEA,0x92,0x13,0x80,0x8C,0x2F,0xBD,0xE6,0x23,0x0B, + + 0x88,0x0C,0xE7,0x08,0x9F,0xFE,0xF3,0xAC,0xEA,0xA2,0xA3,0xF1,0x25,0x43,0xC4,0xB9, + + 0x23,0x72,0x6E,0x98,0x5D,0xFF,0xE4,0x1B,0xD0,0x32,0x79,0x8F,0x0E,0xB0,0x44,0x22, + + 0x3C,0x9F,0xA4,0x46,0x5C,0xDE,0xAE,0x5C,0x07,0xA0,0xB5,0x90,0x9E,0xE5,0x2F,0xF4, + + 0xA7,0x92,0x40,0x04,0x31,0xBB,0x92,0x49,0xEA,0x07,0x0E,0x8D,0x0A,0xF1,0x7C,0x12, + + 0x86,0x02,0x35,0x6F,0x88,0xFF,0x23,0x9E,0xE2,0xF0,0x64,0x91,0x04,0xE2,0xAA,0x71, + + 0x27,0x90,0xE8,0x9F,0x10,0x34,0x35,0xA3,0xAD,0xF0,0xD5,0x75,0x73,0x06,0xBB,0xC2, + + 0xD1,0x2F,0xF7,0x76,0x09,0xA9,0x0C,0xC2,0x62,0x64,0xEB,0x03,0x59,0xAF,0xC0,0x50, + + 0xEE,0xDD,0x2C,0x8B,0x42,0xF9,0xFB,0x8D,0x8E,0xA5,0x66,0xB6,0x10,0x26,0xE7,0x32, + + 0x96,0x56,0xBA,0xED,0xC9,0xA2,0xB5,0x3E,0x39,0x94,0x6F,0x93,0x93,0x3F,0x55,0x4C, + + 0x25,0x3B,0x6B,0xF3,0x80,0x91,0x91,0x61,0xF3,0xDF,0x36,0xF1,0x7F,0x93,0x21,0xF8, + + 0x8F,0x9C,0xA2,0x1E,0xB3,0x45,0x16,0xBF,0x95,0xB4,0x26,0x2A,0x7A,0x05,0x7E,0x83, + + 0x4E,0xB9,0xAE,0x5E,0x21,0xD5,0xEE,0xC5,0xE2,0x5F,0x7E,0xEF,0xFF,0x55,0x26,0xF4, + + 0x0B,0x9C,0xC5,0x8D,0x49,0x3C,0xD4,0x6B,0xE8,0x7A,0xD7,0xFC,0x08,0xB8,0x57,0x19, + + 0x2D,0xE2,0x91,0x3E,0x7F,0x11,0xBB,0xFB,0xA1,0x26,0xCF,0xE0,0x5E,0x9E,0x6A,0xA8, + + 0xF8,0x94,0xBD,0x4D,0x49,0x9A,0x0E,0x02,0x74,0x91,0xD4,0x93,0x7E,0xFC,0x56,0x45, + + 0xAD,0x51,0x02,0x5E,0xC3,0x9D,0x86,0x7E,0x72,0x23,0x01,0x01,0x80,0x02,0x64,0x49, + + 0x6B,0x8D,0x27,0x9A,0xD0,0xFF,0x2F,0x62,0x4B,0x5E,0xF7,0xEF,0x01,0x01,0xB9,0xB9, + + 0x79,0x95,0x43,0x9D,0x3C,0x6B,0x45,0x08,0x87,0x70,0xFF,0xFF,0xFF,0xFF,0x59,0x92, + + 0xA5,0x9F,0xE6,0xA0,0x34,0xBC,0x68,0xA2,0x45,0x79,0xC0,0xDA,0x5C,0xCB,0xB0,0xEE, + + 0x11,0x4C,0xF0,0x96,0x8C,0x48,0x90,0xF5,0xE0,0xCB,0x58,0xC5,0xEE,0xC3,0x00,0x67, + + 0x7B,0x12,0x3E,0x5F,0x96,0xB8,0x69,0x06,0x63,0x44,0x6C,0x35,0xBB,0x1D,0xF6,0x35, + + 0xEA,0x0C,0x36,0xF7,0x4C,0xBE,0xE2,0xD3,0x60,0xC9,0xC7,0xDA,0x85,0x60,0xE0,0x36, + + 0x69,0x0B,0x72,0x5B,0xFE,0x8B,0x6D,0x90,0x46,0x4B,0x8E,0xFF,0x42,0xCB,0xDA,0x60, + + 0xA0,0xAA,0x60,0xDE,0xDB,0x56,0x65,0x80,0x4B,0x4A,0x77,0x0F,0x8E,0xB1,0xC6,0x73, + + 0xB1,0xED,0xF7,0xB4,0x72,0x66,0x71,0x75,0xC4,0x35,0xB2,0x3B,0x23,0xBA,0x5C,0xF1, + + 0xD3,0x57,0xEA,0x46,0xE1,0x93,0xDA,0x30,0xDA,0x06,0x6B,0x6A,0x3F,0xCC,0x82,0x7B, + + 0x64,0x8D,0x2D,0xAC,0x48,0xD8,0x6D,0xCA,0x95,0x95,0xEB,0xD7,0x33,0x17,0x34,0xFA, + + 0x6B,0x7C,0x75,0xBC,0x59,0xC9,0x7A,0x78,0x67,0xC2,0xC4,0xD3,0x7B,0x6A,0x11,0x89, + + 0x63,0x4E,0xDA,0x94,0x3D,0xBB,0xBC,0xAD,0xC7,0x97,0xD0,0xDC,0x67,0x0A,0x75,0x1E, + + 0xAD,0x7D,0x20,0x67,0x4C,0xB4,0x1F,0xDB,0x4B,0x43,0xE2,0xC6,0x2D,0xB4,0x1B,0xD1, + + 0xAF,0xF3,0x9C,0x43,0x16,0x62,0x68,0x80,0x82,0x03,0xE4,0x68,0x31,0xE9,0x34,0x71, + + 0x30,0x2D,0x15,0x5C,0x98,0x23,0x03,0x1C,0xEC,0x5D,0xF9,0x73,0x83,0xC6,0xEF,0x3A, + + 0xB2,0xF8,0xA2,0xED,0x4C,0x91,0x2D,0x58,0x21,0x8F,0x53,0x2B,0x48,0x3A,0x76,0x1E, + + 0x41,0x3E,0x2B,0x62,0xBF,0x41,0xA3,0x86,0xCD,0x45,0x7E,0x79,0x5C,0x79,0xAE,0xE5, + + 0x81,0x0F,0x44,0xE4,0x30,0x3A,0x2C,0x5F,0x53,0x14,0x8C,0xB0,0x1B,0xC1,0x34,0x7E, + + 0x8D,0x1C,0xAC,0x6D,0x90,0x30,0x7B,0x40,0xE1,0x4E,0x45,0x9B,0x4E,0x73,0xB1,0xE3, + + 0x1B,0x77,0x05,0xC3,0xA2,0x34,0xAD,0x5A,0x6D,0xAF,0x95,0xB6,0xD1,0xA3,0xF0,0xB5, + + 0x48,0x1A,0xB3,0x84,0xCE,0x73,0xA6,0xC1,0x61,0x45,0xBB,0x8C,0x93,0xD7,0x7F,0x3E, + + 0x06,0x0F,0x6F,0x9B,0x8F,0xC8,0x72,0x9F,0xC5,0x50,0x7E,0x51,0x41,0xBD,0xB7,0xAE, + + 0xAE,0xE3,0x92,0xE7,0xB3,0x9E,0xE4,0x6B,0x71,0x18,0x5C,0x33,0x57,0x19,0x85,0xA7, + + 0x5D,0x9B,0x66,0xF3,0x6E,0xD3,0xD2,0xA6,0xD1,0x3F,0x15,0x64,0x2D,0x7E,0x05,0x90, + + 0x83,0xF7,0xFF,0xC5,0x36,0x21,0x3E,0x31,0xAB,0xCA,0x4D,0x86,0xC3,0x7C,0x14,0x76, + + 0xD7,0xB5,0x46,0xE4,0x38,0x78,0x86,0x56,0x95,0xF9,0x05,0x1D,0x07,0x6E,0xA5,0xE3, + + 0xFC,0xE4,0x39,0x9D,0xB4,0x35,0xE5,0xCB,0x0A,0xA8,0x59,0x40,0xC5,0x82,0x91,0xCE, + + 0x76,0x5B,0x48,0xC3,0x37,0x38,0x2F,0x56,0x1D,0x39,0x4C,0xA2,0xFE,0x10,0x4D,0xF9, + + 0xAB,0x9B,0xE7,0x83,0x4E,0xCF,0x61,0xBF,0x00,0x30,0xDF,0x92,0x8D,0x2E,0xC5,0xB7, + + 0x6A,0x70,0xE0,0x7C,0xEA,0x98,0xAE,0xE0,0x93,0x13,0x13,0x68,0x78,0x11,0xF5,0x9F, + + 0x2D,0x8E,0x4C,0x1A,0xA9,0x3E,0xCE,0x3F,0x69,0xA8,0x0A,0xAD,0x78,0x3D,0x83,0x4D, + + 0xD8,0x0F,0x91,0xD6,0xD1,0x4A,0xD0,0x56,0xBE,0x92,0xED,0x1E,0x8E,0x3C,0x8A,0x99, + + 0xF5,0x1C,0x2C,0x26,0xC4,0x3F,0x5B,0xBE,0x6A,0x51,0x73,0xD9,0x79,0xD3,0xDF,0x7C, + + 0x92,0xFB,0x0F,0x78,0xC9,0xBB,0x84,0x50,0xE7,0x3B,0x07,0xD9,0xD7,0xEE,0x17,0x99, + + 0xFE,0x1C,0xF8,0x1F,0xB6,0xBA,0x58,0x72,0xE9,0x4A,0x07,0x6C,0x77,0xD1,0x32,0xEF, + + 0x8C,0x5D,0x65,0x7D,0x33,0xA4,0xE4,0xA7,0xB8,0xFD,0x51,0x18,0xF0,0x7E,0x48,0xE9, + + 0x64,0xBC,0xEF,0x68,0x32,0xA5,0x3D,0xD1,0xE1,0x67,0xB0,0x97,0xD5,0x4B,0x28,0xCA, + + 0xDB,0xB9,0xA0,0x79,0x1E,0xC8,0xC7,0x1D,0x40,0x64,0xA0,0xF8,0xAD,0x1F,0xC4,0x2D, + + 0xCD,0x14,0x4F,0xC1,0x7C,0x03,0x40,0x89,0xC8,0x63,0x4F,0x52,0x8B,0xF4,0xCE,0xC7, + + 0x91,0x8E,0xC9,0x85,0x42,0x60,0x8E,0x01,0x35,0xA3,0xF1,0xA5,0x55,0xA0,0xD2,0xC0, + + 0xBB,0x8D,0x69,0xA6,0x55,0xE7,0xEB,0x09,0x0D,0x66,0xC7,0x5F,0xB6,0xC7,0x5B,0x2E, + + 0xA9,0xF7,0xF2,0x13,0xBF,0xB3,0x68,0x2C,0x84,0xA3,0xD2,0x61,0x71,0xE5,0x92,0xF4, + + 0x1D,0xC4,0x12,0xE1,0x1B,0x33,0xAA,0x54,0x4B,0x69,0xE9,0xA4,0x95,0xE6,0x22,0x6D, + + 0x37,0x9A,0x26,0x69,0x6B,0xBA,0x97,0xDA,0x6F,0x8A,0xCC,0x4F,0xAA,0xA8,0x86,0xF1, + + 0xA9,0x8D,0xC3,0x9B,0xAD,0xAB,0xC4,0x59,0x3A,0xAE,0xAC,0xCC,0xA9,0x76,0xE0,0x54, + + 0x32,0x78,0x4D,0x35,0xC3,0x07,0x7A,0xEF,0x7D,0x85,0xAA,0xE3,0x58,0xEE,0x4A,0x3C, + + 0xE6,0xDC,0xB4,0xC5,0x03,0x20,0x44,0x4E,0xE8,0x59,0x3A,0xDB,0x16,0xE7,0x70,0x40, + + 0xBA,0xBE,0x00,0x4F,0x42,0x58,0x4D,0x5A,0x69,0xDE,0x4F,0x9E,0xAA,0xCE,0x10,0x28, + + 0xB3,0x70,0x95,0xC5,0x4A,0xF2,0x6D,0x60,0xAB,0xD4,0x7B,0x38,0xFB,0xE9,0x7C,0xDA, + + 0xA6,0x98,0x5B,0x77,0x8B,0x83,0xE7,0x51,0xE8,0xDD,0xA3,0x5F,0x38,0xB2,0x24,0xB5, + + 0x86,0x6A,0x51,0x86,0x5E,0xCE,0x6E,0xE4,0x8E,0xB5,0x63,0x36,0xC9,0x20,0xF1,0xF1, + + 0x07,0x94,0xF5,0x79,0xB8,0x19,0xA5,0x50,0x60,0x5F,0xF8,0x78,0x83,0x87,0xAE,0x91, + + 0xC3,0x95,0x6D,0x66,0x0A,0x11,0xAD,0xDC,0x1A,0xB0,0x0C,0x8E,0x8E,0xE5,0xE2,0xF2, + + 0xDB,0x14,0x8C,0x04,0xB0,0x41,0xD7,0x74,0xBA,0x32,0xF8,0x0E,0x07,0xB6,0x91,0x15, + + 0x21,0x06,0xE8,0x91,0xB6,0xBB,0x1E,0xF6,0xB2,0x48,0x10,0xD2,0xFA,0xB4,0xA5,0x7B, + + 0xC6,0x4B,0x75,0x00,0xB4,0x43,0x4F,0x10,0x2C,0x7D,0xB1,0x38,0xF7,0xB6,0xA8,0x93, + + 0xFB,0x6A,0x52,0xE7,0xB3,0x18,0xD6,0xAC,0x1E,0x2B,0x51,0xD3,0x2E,0x0A,0xAE,0x4F, + + 0x8D,0x12,0xF8,0x61,0x6C,0xBB,0x50,0xC8,0x9B,0x65,0xED,0xA1,0x7A,0x92,0xF2,0x6A, + + 0x25,0x96,0x6F,0x84,0xCA,0x0D,0xAE,0x7D,0x84,0x28,0xBA,0x4E,0x82,0x56,0xC8,0x69, + + 0x2E,0xD2,0xDE,0x74,0xD7,0xC5,0xA0,0x54,0x0D,0x09,0xA9,0x8B,0x97,0xAB,0x4F,0xDF, + + 0xDC,0x16,0x50,0x6E,0x02,0x88,0x59,0x1E,0x04,0x0A,0x2A,0x4C,0x8D,0xE0,0x38,0x28, + + 0x22,0x19,0x00,0xBC,0x48,0x13,0xD5,0x74,0xB2,0x2A,0xD9,0x95,0x3D,0x9C,0xD3,0x5E, + + 0x5D,0xEF,0xB0,0x4C,0x7F,0x30,0xFE,0xA4,0xDA,0x01,0x01,0x7C,0x7A,0xF9,0xA7,0x73, + + 0xCE,0xF2,0x05,0x3E,0x74,0xFE,0x09,0x70,0x85,0x48,0xA9,0x0D,0xFC,0x7B,0x67,0xD3, + + 0xA9,0xEC,0x91,0x41,0x54,0x49,0xD0,0x94,0x32,0x0B,0xC7,0x11,0x53,0xF2,0x4A,0x5F, + + 0xBF,0x5D,0x29,0x7A,0x85,0x8D,0xF5,0xCF,0xA1,0x16,0xE8,0x00,0xDF,0x62,0x87,0xEF, + + 0x83,0x49,0x48,0x10,0xCA,0xDC,0x22,0xBA,0xF2,0xDC,0xF0,0x2A,0x97,0x95,0x0F,0xE3, + + 0x77,0x7F,0x99,0xFE,0xE3,0x22,0xE8,0x53,0x5A,0x7D,0x26,0x24,0x5D,0x6E,0x29,0x6F, + + 0x22,0x66,0x65,0x86,0xCA,0x2B,0x49,0x46,0x8F,0x04,0x7F,0x47,0x3A,0xC5,0xD0,0xC2, + + 0x82,0x87,0xF8,0x34,0x59,0x2F,0x54,0x27,0xC3,0x4A,0x83,0x98,0x54,0x17,0xC8,0x17, + + 0x27,0xFE,0x0C,0x90,0x15,0x27,0x62,0x83,0x89,0xEE,0xE0,0x8A,0xFF,0x68,0x79,0x31, + + 0x36,0x0F,0xD4,0x36,0x97,0x64,0xF2,0xF7,0x1E,0xA0,0xED,0xE7,0x43,0x50,0x48,0xCC, + + 0xE0,0x14,0x0F,0xAA,0x7A,0x0F,0x3B,0x75,0x28,0x82,0x26,0x0E,0xD5,0xF4,0xBD,0xEA, + + 0xF1,0x6A,0x80,0x13,0x43,0x2C,0x7C,0xAC,0x0B,0xDD,0xCC,0xBE,0x5C,0xFC,0x82,0x75, + + 0xAA,0x0F,0xC1,0xDC,0x1D,0xDD,0xB6,0xB7,0xF6,0xC4,0xFD,0x34,0xB2,0xFF,0xC7,0xD9, + + 0xF6,0x0C,0x82,0x72,0x15,0x8C,0xD3,0x39,0xF7,0xC7,0x70,0x36,0x06,0xC1,0x2B,0x0A, + + 0x28,0xF4,0xC0,0x6E,0xB8,0x94,0xFA,0xD7,0x28,0x7D,0x30,0x53,0x0C,0x97,0xD5,0xBB, + + 0x8E,0x81,0x02,0xCC,0x1B,0x6E,0x2C,0x5F,0x21,0xE9,0xF3,0xE8,0x64,0x41,0x72,0xA6, + + 0x68,0x0E,0xD6,0xD8,0x19,0x8E,0x3B,0x62,0x9B,0xF9,0xA5,0x5B,0xFA,0x6B,0x11,0x4B, + + 0x61,0x6A,0x83,0xFC,0x9C,0x6C,0x52,0x9A,0x2A,0x02,0xB3,0x27,0x10,0x63,0xDC,0xAA, + + 0x0F,0x82,0xB4,0x2E,0x92,0x6D,0x7C,0x88,0x57,0x5D,0xF5,0x43,0x02,0x60,0xC4,0x50, + + 0x96,0x13,0xBE,0x77,0x0C,0x72,0x12,0x48,0x53,0x9D,0x23,0x80,0xFF,0x72,0xD3,0x87, + + 0x12,0x43,0xF3,0x6C,0xB0,0xCE,0xC5,0xC7,0x52,0x4A,0xF4,0xAA,0xB7,0x85,0x06,0xBC, + + 0xD7,0x6E,0x48,0xA0,0x8F,0x33,0x35,0xA9,0x6D,0x69,0x22,0xA4,0x7D,0x7E,0xB5,0xE1, + + 0xA9,0x92,0x56,0x97,0xB7,0x13,0xFF,0x21,0x29,0x03,0x7B,0xC7,0x1A,0xD5,0xD4,0x6C, + + 0x11,0x10,0xFE,0x26,0x9E,0x3B,0x7C,0x22,0xB6,0x92,0xEB,0x7B,0x85,0xA9,0x51,0xB6, + + 0x00,0x95,0xAC,0x90,0x74,0x3A,0x3A,0x01,0xA1,0x15,0xFC,0x78,0x86,0xFC,0xFD,0x21, + + 0x92,0x0D,0xA5,0x81,0xA5,0x39,0xF2,0x76,0x03,0xF9,0x8D,0xF5,0x81,0xFF,0x73,0x05, + + 0x82,0x97,0xAD,0x91,0x33,0x3A,0x23,0x6F,0x08,0xA1,0xD9,0x95,0xFF,0xA0,0xF9,0x0E, + + 0x40,0x58,0x9A,0x75,0x18,0xA3,0x6E,0x9A,0x9B,0x8D,0xC8,0x3E,0x7C,0xD7,0xA2,0x0B, + + 0x79,0x13,0xA6,0x18,0x64,0x22,0x06,0x9C,0x80,0x21,0xF9,0xB4,0x92,0xEF,0x4D,0x27, + + 0x41,0x2A,0x87,0x70,0xB8,0xE1,0x12,0x82,0xFC,0x67,0x74,0x5E,0x26,0xD1,0x89,0x65, + + 0x34,0xE0,0x30,0xC1,0x98,0x19,0x0C,0x4A,0x6D,0xD6,0x34,0xC7,0x2C,0x87,0x7C,0x20, + + 0xEE,0x53,0x8C,0x31,0x99,0x59,0x08,0x73,0x7A,0xF3,0x51,0xFC,0x09,0xB4,0x04,0xC5, + + 0xD4,0x06,0xAE,0x9C,0x35,0x30,0xF1,0x83,0xB6,0x89,0x5E,0x9C,0x77,0xAA,0x1E,0xDB, + + 0x0F,0x92,0xFF,0x1D,0x4D,0x31,0x34,0xB7,0x1B,0x82,0xF7,0xF1,0x0F,0xF7,0xED,0xBF, + + 0x26,0xE9,0x85,0x62,0x18,0x32,0xED,0xE6,0x07,0xF0,0x5C,0xED,0x88,0xAD,0x8C,0x90, + + 0x1C,0x88,0xFB,0x06,0xC1,0xFD,0x4D,0x50,0xD6,0xDF,0x0D,0x79,0x80,0x25,0x51,0x52, + + 0x41,0x87,0x68,0x12,0xCE,0x5D,0xE5,0x92,0x8E,0x71,0xE6,0x04,0x51,0xAD,0xA3,0x7C, + + 0x0B,0x04,0x0A,0x58,0x29,0x5E,0x11,0x26,0xC2,0x42,0x16,0x10,0x3F,0x47,0xA1,0x7E, + + 0x24,0x72,0x96,0x48,0x68,0xCD,0x03,0x74,0x1B,0x3C,0xD8,0x24,0xFB,0x77,0x32,0x40, + + 0xED,0xE0,0xA0,0x9F,0x10,0x86,0x98,0xE8,0x64,0x12,0x44,0x1D,0xF5,0xE2,0xC4,0x76, + + 0xFA,0x8E,0x51,0xCC,0xE4,0xE5,0xCA,0xC0,0x57,0x00,0x4C,0x09,0xF4,0xA8,0x59,0x3F, + + 0xA7,0xC6,0x61,0x00,0x4C,0x19,0x0E,0x29,0x7B,0xDA,0xDF,0xC5,0x23,0xE9,0x51,0xAF, + + 0x07,0x7C,0xA5,0x83,0x6F,0xEF,0x0F,0x59,0xA1,0x02,0xFB,0x91,0xF3,0x18,0x5A,0x2E, + + 0x2E,0x8A,0xC4,0xC3,0x1D,0xC8,0x08,0xB4,0xBB,0x45,0x94,0x9E,0x84,0x43,0x76,0xF2, + + 0x1B,0xC4,0x06,0x8D,0x0A,0xA3,0x41,0x1E,0x99,0x91,0xEA,0xA0,0xA6,0x12,0x37,0xF7, + + 0x11,0x71,0x04,0xC2,0xB8,0x57,0x54,0xD0,0x2D,0x5C,0x16,0x2A,0x5B,0xFC,0x39,0xE4, + + 0x0B,0x2A,0x2B,0x00,0x8A,0xEA,0x9C,0x76,0xED,0x6A,0xBB,0xFD,0x5E,0xAD,0x32,0xB3, + + 0x4E,0x13,0x55,0x0F,0x18,0x94,0x41,0x62,0xAA,0x79,0x92,0xCD,0x5D,0xE1,0xE1,0x3A, + + 0x0B,0xE1,0x26,0x3C,0x5C,0x72,0x9A,0x45,0x6B,0xA3,0xF2,0x6F,0xA2,0x5B,0xA3,0x83, + + 0x5D,0x73,0x46,0x6B,0x1C,0xE6,0xAC,0x6B,0x4D,0xC0,0x8C,0x10,0x51,0x58,0xFB,0x9C, + + 0xAB,0x8C,0x93,0xDD,0x9A,0xA6,0x3B,0x44,0xC7,0xA3,0x00,0x7D,0x9F,0x83,0x78,0x06, + + 0x33,0x92,0xA2,0xAB,0xDD,0xC1,0x62,0xEE,0x8F,0xB4,0x8B,0xF9,0xA0,0x35,0x29,0xD5, + + 0xEF,0x21,0x45,0x14,0x3C,0x5C,0xF8,0xED,0xD8,0x2D,0x3C,0x47,0x95,0xB1,0x75,0x9B, + + 0xF0,0x3F,0x09,0x15,0xB8,0xBA,0x0D,0x4C,0x07,0xDB,0x12,0x90,0x9F,0x57,0x65,0x86, + + 0xD2,0xEF,0xF7,0x6D,0x16,0xB7,0x67,0x10,0x91,0x91,0x15,0x3D,0x61,0x67,0x2C,0xCE, + + 0x15,0xB0,0xAE,0x19,0x95,0xB9,0x42,0x13,0x86,0x94,0xD4,0xE2,0x97,0x6B,0xD4,0xEF, + + 0x80,0xD4,0xA6,0x2D,0x94,0xB3,0xD9,0xE9,0x0C,0xA1,0xC6,0x09,0x8A,0x74,0xDD,0x3C, + + 0x95,0x52,0xAF,0x28,0x15,0xBB,0xDD,0x69,0x72,0x42,0x5A,0x9D,0x2B,0xB7,0xAD,0x9B, + + 0xA7,0x1A,0xE1,0xD0,0x16,0x3D,0xFD,0x35,0x75,0xD4,0xEE,0x0C,0x16,0x74,0xF9,0x9D, + + 0x2A,0xC2,0x5D,0x0A,0x63,0x7D,0x7F,0x9F,0xCD,0x67,0x13,0xB5,0x17,0x8C,0x17,0x3A, + + 0xC0,0x69,0xE4,0x69,0x9E,0xBF,0x3D,0xA6,0xED,0xA7,0x5D,0x45,0x02,0xF9,0x67,0xAF, + + 0x29,0x34,0xC7,0xCE,0x30,0xB7,0xF7,0x77,0x47,0xE8,0x37,0x69,0x6E,0xF9,0xDF,0x48, + + 0x4C,0xF7,0xE7,0x08,0xDE,0xEE,0xAF,0xF4,0x10,0xA7,0xD7,0x7D,0x7B,0x0E,0x3F,0xC8, + + 0x89,0xDE,0x59,0x2C,0x1A,0xBA,0x95,0x11,0x11,0xDC,0x26,0x14,0x87,0x75,0xA2,0x5E, + + 0x3A,0xE2,0x5A,0xBC,0xC0,0xA6,0xEE,0xE5,0x66,0x69,0x5A,0x8C,0xDC,0x0D,0xAF,0x49, + + 0xA8,0x3D,0xCE,0x5C,0x1F,0x61,0x1F,0x29,0x68,0x2B,0x73,0x1C,0x7A,0x6A,0xFF,0x1C, + + 0xAD,0x6A,0x79,0xB9,0x44,0xFD,0xF7,0x79,0x2A,0x5C,0x08,0x7F,0x42,0xBE,0x5A,0xA9, + + 0x68,0x63,0x68,0x8E,0x32,0xF6,0xF4,0xDE,0x23,0x60,0xF0,0x0A,0x33,0x6F,0xA2,0xE3, + + 0x8D,0x0C,0x7B,0x2F,0xEB,0xB4,0x27,0x77,0x8B,0x11,0xFE,0x54,0x52,0x40,0x7F,0x07, + + 0x61,0x81,0xFE,0x3A,0x6E,0xF7,0xF5,0xDE,0x21,0xFD,0x4E,0x24,0x2D,0x0E,0xF6,0x35, + + 0x75,0x80,0xFA,0xD7,0x12,0x65,0x51,0xA4,0xC7,0x59,0xC3,0x95,0xAD,0x7C,0x67,0xB1, + + 0x9E,0x96,0x53,0xC0,0x7E,0xD2,0x18,0x82,0xEE,0xE9,0x85,0xE6,0xC3,0x10,0x37,0xAD, + + 0x03,0x0B,0x5B,0xD0,0x7F,0x52,0x8C,0xD5,0x00,0x49,0xEA,0x8B,0xA7,0x6A,0xA9,0xCB, + + 0xA0,0xD0,0x7E,0xA7,0xF1,0xC3,0x1D,0x83,0x7F,0xCA,0xE9,0x94,0x71,0x39,0x21,0xD7, + + 0x7F,0x46,0xF3,0xB7,0xF0,0xD7,0x56,0x8F,0x2A,0xFF,0x19,0xB8,0x42,0x61,0x04,0xB8, + + 0x6B,0x23,0x35,0x28,0x6F,0x28,0xD7,0xD8,0x68,0xF9,0x2A,0xD2,0x3B,0x4B,0x58,0x57, + + 0x2D,0xF4,0x31,0xAC,0xDC,0xF6,0x53,0xB5,0xA0,0x19,0x79,0xC2,0xFD,0x84,0x90,0xFA, + + 0x0C,0x87,0xD9,0x62,0xE4,0xD5,0xD3,0xE1,0xB4,0x08,0x04,0xC7,0x7D,0x06,0x1C,0xEA, + + 0x0D,0x86,0x2C,0x1B,0x72,0x4F,0x0C,0x09,0xE9,0x09,0x5F,0xC6,0xBA,0xE0,0xEF,0x37, + + 0x97,0x50,0x55,0xB3,0x4E,0xFB,0x78,0xCD,0x09,0x41,0xFB,0x63,0xFB,0xEB,0x52,0xCC, + + 0x6B,0xF2,0x15,0x26,0x24,0xEB,0x14,0x57,0x1E,0x0D,0x57,0x1E,0x78,0x0D,0xF8,0x07, + + 0x63,0x3E,0x42,0x27,0xED,0xE2,0xD8,0x92,0x02,0xB6,0x93,0x79,0x58,0x4A,0xB4,0x2B, + + 0xE9,0xF0,0x12,0x5D,0x7A,0x90,0x10,0x09,0x49,0x4C,0x1B,0xA0,0x84,0x2E,0x04,0x7F, + + 0x20,0xEF,0x3F,0xE4,0x3C,0xCB,0x2B,0x90,0xF2,0xEF,0x37,0x92,0xAC,0x95,0x0C,0x6F, + + 0xDE,0x11,0x1B,0x8E,0x13,0x85,0xC1,0x28,0x67,0xCB,0xAE,0xB5,0xF4,0x67,0xFA,0x7F, + + 0x5F,0x32,0x7A,0xA1,0x94,0xC6,0x2E,0x11,0x7C,0xCD,0xCB,0x96,0xFC,0xD9,0x09,0x91, + + 0x5E,0xEC,0xD9,0xE7,0x5A,0x70,0xDF,0x59,0x2D,0x1E,0x3C,0xAF,0x6D,0xC7,0xE9,0xBF, + + 0xBF,0x56,0xBC,0xC0,0xD2,0xB5,0x8F,0xAF,0x1D,0xA6,0xD0,0x06,0x56,0xF9,0xE5,0xBE, + + 0x5C,0x15,0xB4,0x64,0x85,0x9A,0xDC,0x2D,0xF1,0xAE,0xF3,0x8B,0xAA,0xE9,0x08,0x45, + + 0x37,0xEB,0xD4,0x36,0x36,0x9B,0x88,0xB1,0x03,0xE9,0x8C,0x18,0x55,0x37,0xB6,0x71, + + 0xF3,0xE5,0x69,0xF1,0x32,0x3A,0xA2,0x83,0x14,0xE8,0x66,0xAF,0xF5,0xAD,0xF9,0x88, + + 0xD7,0xE7,0xFB,0xE7,0xB5,0x9E,0x64,0xAC,0x64,0x16,0xC8,0xA3,0x6A,0x36,0x47,0x31, + + 0x3A,0xAA,0xDA,0xB5,0xD2,0x7D,0xA6,0xA8,0xCE,0x18,0x41,0xBC,0xFA,0x77,0x07,0x76, + + 0xA8,0x1A,0x10,0x4D,0xFE,0x97,0x03,0x8D,0xDB,0xBE,0xF6,0x0D,0x2E,0xC5,0x46,0xC9, + + 0xBA,0xA3,0xB5,0x2C,0x9B,0x94,0xF3,0x39,0x15,0x7B,0x7F,0x82,0xDD,0x15,0x1F,0x51, + + 0x8F,0x6D,0xEE,0x2E,0xBB,0x58,0x0F,0xEE,0x8F,0xC3,0x41,0xA3,0x87,0x00,0x61,0xA7, + + 0xF2,0xA0,0x90,0x1E,0x29,0x7F,0x9B,0x10,0x1C,0x90,0x15,0xC1,0xF6,0x80,0xB8,0x4D, + + 0xB1,0x5C,0xEF,0xCB,0x3B,0x30,0x68,0xAE,0x38,0x54,0x7E,0x93,0x6F,0x3C,0xB4,0xB7, + + 0x40,0x5B,0xCF,0xD1,0xBD,0xC5,0x40,0x99,0xED,0xD4,0x3A,0x02,0x0E,0x29,0xF3,0xF1, + + 0x88,0x0D,0x98,0x41,0x1A,0x1F,0x79,0x1F,0x1C,0xC4,0x27,0xD5,0xD0,0x6D,0x88,0x60, + + 0x67,0xFD,0x92,0xB3,0xE6,0x55,0xE8,0x12,0x6D,0x30,0x87,0xD4,0x09,0xE5,0xC5,0xF9, + + 0xA0,0x2D,0x15,0x65,0xEC,0x1D,0x8D,0x07,0xE6,0x83,0xE3,0x09,0x3F,0x86,0x57,0x14, + + 0xA1,0x2C,0x09,0x09,0x19,0xC6,0x07,0x57,0xAD,0xCE,0xD4,0x13,0x5A,0xE1,0x9B,0x2D, + + 0x7A,0x2B,0x60,0x8F,0xE2,0xA2,0xB7,0x00,0x07,0x84,0x2B,0x64,0x29,0x0C,0xCC,0x30, + + 0xF8,0x08,0xE9,0xB4,0x95,0xAD,0x22,0x73,0xE4,0xC3,0xF2,0x09,0x76,0x07,0xC1,0x2D, + + 0xF0,0x29,0xED,0x40,0x37,0x2E,0x09,0xE1,0xE4,0x74,0xAE,0xCC,0xD0,0x3C,0x16,0xD7, + + 0xD0,0xA8,0x64,0xA7,0x93,0xA8,0x29,0xEE,0x66,0x4F,0xA0,0x74,0x72,0x18,0x82,0x78, + + 0x6E,0xDD,0x16,0x6C,0x91,0xCA,0x4D,0x59,0x65,0xAB,0x05,0x2F,0xD1,0xE4,0xBA,0x1B, + + 0x05,0xA9,0x11,0xA6,0x90,0xCB,0x44,0x3C,0x2E,0xED,0x9D,0xA9,0x36,0x4F,0x5D,0x0C, + + 0x7D,0x85,0x78,0x0F,0xE4,0x55,0x48,0xDB,0x4D,0x7B,0xDB,0xDE,0x1A,0xEA,0xD4,0xE4, + + 0x72,0x8B,0x50,0x60,0x93,0x54,0x68,0x04,0x49,0x14,0x3E,0x4D,0x36,0x6D,0xDF,0x7B, + + 0x16,0x23,0x82,0x0E,0x0B,0x2E,0x76,0x88,0xCC,0xCF,0xAB,0x93,0xFB,0x1D,0xCE,0x38, + + 0xF0,0x36,0x92,0xDC,0x1A,0x7C,0xF2,0xAE,0x2C,0xAD,0xB8,0x3E,0x0F,0xEB,0xC3,0x39, + + 0xB8,0x21,0x9B,0xCD,0x9B,0x5F,0xB0,0x19,0x6D,0xC8,0x0B,0x09,0x51,0x68,0xEB,0x5F, + + 0xD8,0xA0,0xD1,0xBD,0xBB,0x04,0x03,0xFF,0x90,0xC5,0xF7,0x78,0x7E,0x67,0x24,0x82, + + 0x24,0x70,0x00,0xE4,0xCB,0xF2,0x98,0xE0,0xE7,0x04,0xF4,0x99,0x7C,0x9C,0x2C,0x92, + + 0x2D,0x88,0xAA,0x32,0x2D,0xB5,0x5A,0xB6,0x0E,0x57,0xF6,0x54,0x34,0xE1,0x25,0x83, + + 0xA4,0x03,0xAB,0x83,0xB7,0xF2,0xD7,0xBC,0x2A,0x79,0x9D,0x65,0x0D,0x7E,0x2D,0x93, + + 0xE1,0xB5,0x97,0xE4,0x93,0xBA,0xBD,0xC1,0x0E,0x16,0xC3,0x24,0x9E,0x45,0x3A,0xC5, + + 0x26,0x39,0x0B,0x44,0x37,0xD3,0xC2,0xDB,0x60,0x35,0x0F,0xA1,0x8B,0x42,0x64,0xC3, + + 0xCE,0xD1,0x48,0xB4,0x76,0x95,0x9B,0x32,0x23,0x29,0x10,0xF4,0x7F,0x99,0xC5,0x3C, + + 0x29,0x20,0xDF,0x25,0x34,0x9E,0x80,0x81,0x15,0xBA,0x4E,0x7D,0xF7,0x96,0x96,0xA8, + + 0x58,0xD6,0x95,0x15,0x34,0xB9,0x46,0xAC,0x32,0x6A,0xB5,0x9C,0xD3,0xF1,0xE6,0x56, + + 0xD6,0x65,0x20,0xFF,0x40,0xB1,0x48,0x9D,0x07,0x7D,0xB7,0xB0,0x98,0x0C,0x50,0x9C, + + 0xCC,0x1A,0x71,0x9E,0x19,0xA2,0x5F,0xA0,0xBD,0x6D,0xE0,0x8C,0x3D,0xB5,0x31,0xE9, + + 0xCC,0x80,0x23,0x72,0xB4,0xFB,0xB6,0x58,0x0C,0x96,0x01,0x5E,0x14,0xBE,0x66,0x68, + + 0x21,0x16,0xFB,0xF9,0x30,0xD9,0x18,0x4A,0x71,0xC9,0xDE,0xB1,0x2D,0x8F,0x06,0x95, + + 0x8D,0x17,0x46,0x0C,0xB2,0xB2,0xDD,0xF3,0xEE,0x42,0xA6,0x73,0xDF,0x76,0x14,0x2A, + + 0xFC,0x92,0x8E,0x9F,0xCA,0xB0,0x27,0x6A,0xCA,0x22,0x34,0x8C,0xDC,0xFB,0x63,0x29, + + 0x2C,0x62,0x9F,0x0D,0x1F,0xFD,0xD8,0x95,0x33,0x9F,0x0C,0x0D,0x7C,0xB6,0x0F,0x84, + + 0x48,0x32,0xE5,0xDE,0xB9,0x2C,0x45,0x05,0x8C,0x56,0xAF,0x62,0x5E,0x75,0x7F,0xE2, + + 0x82,0x03,0x73,0x10,0xED,0xAB,0xEF,0xDB,0xC2,0x48,0xE0,0x5A,0xF3,0x05,0x28,0x69, + + 0xA0,0xFE,0xB2,0xA4,0x8C,0x8E,0x65,0x14,0xA8,0x11,0x90,0x83,0xB0,0x6E,0x46,0x73, + + 0x23,0x04,0xEA,0x39,0x7B,0x66,0xEE,0x43,0xE0,0x4F,0x2E,0xC7,0xF4,0x64,0x23,0xC1, + + 0xDD,0x05,0x2D,0x77,0x6E,0x62,0xE4,0x4A,0xFD,0x3C,0xF9,0x75,0x37,0x6E,0x46,0x49, + + 0x26,0x02,0xB8,0x60,0x93,0x29,0xEF,0x82,0x66,0xC9,0xA8,0xE6,0x74,0x2C,0x28,0x10, + + 0xEF,0x08,0x08,0x89,0xAA,0x2B,0x98,0x45,0xFD,0x48,0x13,0x16,0xAE,0x0B,0x49,0x76, + + 0x23,0xD9,0xE9,0x42,0x13,0x62,0xAE,0x91,0x2E,0xB7,0xA9,0x42,0x71,0x26,0xE5,0xCF, + + 0x0E,0xF1,0x69,0x97,0x1F,0x29,0xA2,0x36,0xCD,0x48,0xBE,0x35,0x93,0x9A,0x52,0x85, + + 0xAB,0x48,0x2A,0x90,0x2B,0x4C,0x28,0x8D,0xFF,0xB5,0xD8,0xD2,0xFB,0x65,0xAD,0xB8, + + 0xD9,0x2A,0x4A,0xDC,0x0A,0x6B,0x3A,0xD2,0x2A,0x4D,0xE2,0xBE,0x58,0xEE,0xC8,0x6B, + + 0x5C,0xFB,0x39,0xF6,0xE7,0x0A,0xBF,0xA6,0x7D,0xC3,0xD9,0x30,0x99,0x62,0x2C,0xBD, + + 0x34,0x02,0x45,0xA9,0x78,0x84,0x7A,0x79,0xC5,0xBE,0x20,0xDF,0x75,0x96,0x4A,0x4D, + + 0x85,0x08,0xFA,0xE8,0x98,0x64,0xD5,0xD7,0x5E,0x63,0xB5,0x93,0x7E,0x00,0xDA,0x9F, + + 0xF6,0xBB,0x0A,0x04,0x46,0x2B,0x15,0x5E,0xA2,0x7D,0x7D,0x7A,0x8F,0x09,0x47,0x0E, + + 0x89,0x01,0x0C,0xBD,0x96,0x21,0xD3,0x84,0x12,0x0C,0xEC,0xF2,0x25,0x2F,0xF0,0xC3, + + 0x8A,0xEF,0x43,0x5A,0xF8,0xAF,0x03,0x74,0x81,0x7F,0x66,0x1D,0x9F,0x1D,0x36,0xB0, + + 0x22,0xBF,0xFE,0x87,0x5C,0x30,0x4F,0xF3,0x1B,0x23,0xF4,0xE4,0xC6,0x7D,0xB9,0x63, + + 0xAD,0x50,0x11,0x94,0xB9,0xFB,0x04,0xB5,0x1E,0x71,0xD6,0xA9,0xD2,0x77,0xA5,0xF2, + + 0x03,0x91,0xA1,0xB9,0xB0,0x12,0xD5,0x68,0xAD,0xAF,0xDF,0x5B,0x53,0x7F,0x17,0x93, + + 0x4A,0x1C,0x8D,0x95,0x4C,0x92,0x8D,0x4C,0xE1,0x12,0x95,0x1F,0x04,0x7C,0x51,0xFF, + + 0x16,0x55,0x54,0x46,0x10,0x54,0x36,0xF1,0x61,0x34,0xAE,0x14,0x7A,0x7B,0x5B,0x23, + + 0xA7,0x98,0xB3,0x56,0x11,0x55,0xDD,0xC0,0xDC,0x39,0x97,0x84,0x92,0x6E,0x7F,0x3B, + + 0xF8,0xEB,0xFF,0x27,0x90,0xC9,0x6F,0xE3,0xA6,0xFB,0xF3,0xBC,0xB9,0x36,0x9E,0x22, + + 0x2F,0x1A,0x97,0xD4,0x10,0x76,0x99,0x0E,0xC7,0x3B,0x5E,0x13,0xC0,0x4C,0x47,0xEE, + + 0x49,0x1C,0xBE,0xBD,0x99,0xB9,0x2C,0x52,0x93,0x23,0x22,0xD3,0xDB,0x39,0x75,0xBF, + + 0x88,0x77,0xDC,0xD6,0xD2,0x5D,0x67,0x3C,0x65,0x56,0x66,0xB4,0x98,0x36,0x61,0x6B, + + 0x8C,0x17,0xE0,0x7E,0x3C,0xB7,0x57,0x45,0x84,0x65,0xCE,0xD8,0x9B,0x7E,0x6D,0x91, + + 0x58,0x92,0xB7,0x67,0x15,0x36,0xC2,0x80,0xDE,0x2C,0xC6,0xCD,0x9A,0x80,0x55,0x32, + + 0xD3,0x17,0xFC,0x32,0xE7,0xE1,0x0B,0x04,0x87,0x47,0x2C,0x04,0x34,0x33,0xDE,0x5A, + + 0xA3,0x65,0x05,0x3F,0x6F,0xEA,0xDF,0x1A,0x8B,0xE2,0x01,0x08,0x0C,0x3D,0x3B,0x96, + + 0x5B,0xE2,0x68,0xBF,0x41,0x7C,0x0E,0x7F,0xA8,0xFA,0x47,0x69,0xCC,0xA0,0x77,0xB9, + + 0xA7,0x5F,0x5A,0x2F,0x9F,0x39,0x9F,0x21,0x7F,0x1E,0x5F,0x24,0x45,0x79,0xE5,0x8F, + + 0xED,0xC3,0xA5,0xEE,0x27,0x6F,0xB1,0x06,0xB9,0xAC,0xC8,0x02,0xD6,0xE3,0x7E,0xB3, + + 0xEE,0xE5,0xF1,0x15,0xF2,0xED,0x5F,0xCD,0x61,0x3A,0xE2,0x1D,0xF6,0x84,0xB4,0xF0, + + 0x00,0x0F,0x09,0x13,0x11,0x72,0x56,0x63,0x84,0x3F,0xF0,0x87,0x90,0xD2,0x11,0xEC, + + 0x6C,0x80,0x29,0xD1,0x99,0xE2,0x39,0x17,0xF6,0xB2,0xE3,0x15,0x76,0xE7,0xDF,0xD9, + + 0xF9,0x59,0x98,0x62,0x10,0x1E,0xB0,0xAE,0x90,0x86,0xCF,0x84,0xFA,0xE0,0x57,0xCD, + + 0xF8,0x18,0x1D,0xD2,0x6D,0x83,0xE3,0x56,0xA6,0x87,0x75,0x86,0x5B,0xEA,0x02,0xBD, + + 0xA2,0xEA,0x8B,0xBA,0x94,0x7D,0xBE,0x9B,0xC0,0xBE,0x0F,0x43,0x54,0xEE,0x8A,0xAD, + + 0xA3,0xE9,0x29,0x1F,0x07,0xE7,0x2A,0x45,0x45,0xDB,0x99,0x37,0xC2,0x6A,0xB7,0xF9, + + 0x88,0x05,0x8E,0x1A,0x95,0xCC,0x8A,0xD5,0x3F,0x64,0x34,0xDE,0xE4,0xE7,0x95,0xF8, + + 0x8D,0xC4,0xA6,0x4D,0xED,0x68,0xB4,0x45,0x6E,0x19,0x4A,0x2A,0x79,0xEF,0x75,0x36, + + 0x67,0xEE,0xAF,0x5C,0x28,0x62,0x6C,0x9F,0xCA,0xF0,0x07,0xDF,0xFC,0xE5,0xBB,0xEA, + + 0x2E,0xCB,0x23,0x49,0xF7,0x8B,0x62,0x03,0x68,0x34,0xB3,0x90,0x3C,0xE4,0x22,0x75, + + 0x06,0xE0,0xEF,0x43,0xFF,0x03,0x80,0x88,0xA7,0x35,0x8A,0x4A,0xDC,0x10,0x14,0x73, + + 0xC7,0x73,0x8A,0x1E,0xA1,0xA2,0x1A,0x30,0xE9,0xC2,0xB4,0x93,0x57,0xAD,0x03,0x0B, + + 0x6A,0x83,0xE6,0xA7,0xAD,0x61,0x01,0x94,0x86,0x43,0x89,0x1D,0x7D,0x9A,0xFA,0xDD, + + 0x73,0x5A,0xE9,0xBD,0x18,0xFA,0xEB,0x08,0xDB,0xA3,0xB0,0x0F,0x5D,0x13,0x04,0x10, + + 0xA4,0xD1,0xDB,0xA1,0x95,0x6F,0x69,0xAA,0x57,0xD0,0x4C,0xAE,0x17,0x0F,0x54,0x10, + + 0xF8,0xCE,0x65,0x92,0x7D,0x97,0x6C,0x26,0x84,0xDE,0x44,0x5E,0x7E,0xBE,0x45,0xDC, + + 0x1B,0x6F,0x11,0xE5,0x4B,0xA9,0xF5,0x73,0x83,0xD4,0x4D,0xD5,0xC7,0x18,0x12,0x71, + + 0x27,0x6F,0xCD,0xD7,0x1B,0x3E,0x89,0xCC,0x46,0x92,0x2D,0xC4,0xED,0x9F,0xA9,0x2A, + + 0xCF,0x6D,0xE8,0xBD,0x97,0x3E,0x14,0xA6,0x1D,0x5F,0xFC,0x41,0xD7,0x0B,0x3C,0xD2, + + 0x21,0x6F,0xA6,0x28,0x31,0x26,0x76,0x76,0x2F,0x72,0x6C,0xE7,0x6B,0xF3,0x1F,0xA3, + + 0xAA,0xD6,0x1E,0x25,0x1A,0xBB,0xF5,0x01,0x64,0x95,0xCF,0x05,0x0B,0xF9,0xA2,0xF7, + + 0x94,0xB1,0xB8,0xF3,0x84,0xAC,0x3B,0x22,0xAC,0x7D,0x50,0x17,0x56,0x77,0x5B,0xE5, + + 0x8F,0x9E,0xDE,0x0C,0x3D,0xFF,0xED,0xAB,0x0F,0x2E,0xD0,0xA2,0x7F,0x68,0x56,0x18, + + 0x2C,0xE4,0x96,0x4E,0x61,0x31,0x06,0x41,0x90,0xB5,0x71,0x46,0x7B,0x73,0x88,0x61, + + 0x45,0x30,0x9F,0xDF,0xB4,0xB5,0xA4,0x2F,0x80,0x36,0x77,0x76,0x58,0xB8,0x75,0x9A, + + 0x0E,0x98,0x9F,0x7D,0x3F,0xB3,0x58,0xFB,0xAD,0x0B,0x6F,0x3B,0xA2,0xD3,0xDC,0x8D, + + 0xEC,0x4E,0x5C,0x30,0xD7,0xEC,0xE6,0xB5,0x0F,0xBC,0x8E,0xCA,0x7E,0xFC,0xD4,0xCE, + + 0x29,0xE7,0x2E,0x06,0xAB,0xFC,0x44,0x4A,0x49,0x29,0xFE,0xFE,0x7F,0xFD,0x2F,0xD3, + + 0x9D,0xB8,0x44,0x2D,0x5E,0x01,0xD8,0x99,0x92,0x21,0xF7,0xEF,0xFE,0xFE,0xB8,0xA5, + + 0x0C,0xFA,0x8F,0x9B,0x3B,0x32,0xDF,0x08,0x63,0x62,0xFF,0xFF,0x9E,0x15,0x10,0x95, + + 0x02,0x6E,0xD9,0x17,0xF7,0x3B,0xBA,0xD1,0x46,0xE0,0x13,0xCC,0x98,0xAD,0x1B,0x98, + + 0xA4,0x88,0xAD,0xE2,0x7A,0x80,0x1E,0x22,0x47,0x21,0x9E,0x4A,0x8F,0xAE,0x58,0x86, + + 0x25,0x84,0xA0,0xF1,0xB6,0x39,0x59,0xC9,0x52,0x00,0x6A,0xE2,0x0E,0x6A,0x29,0x83, + + 0x09,0x0B,0x6B,0xE8,0x57,0x2C,0xA5,0xB3,0x04,0xE8,0xB9,0x25,0x30,0x78,0x41,0x3F, + + 0xA5,0x07,0x5F,0xD1,0x11,0x84,0x33,0x06,0xB1,0x54,0xB3,0x02,0xA5,0x74,0x9A,0x90, + + 0x4B,0x47,0x8E,0xBC,0x83,0xE8,0x3F,0x8F,0xB6,0xD3,0x60,0x8E,0x43,0x28,0x81,0x4D, + + 0x84,0x77,0x01,0x38,0xDE,0x2C,0xE9,0x9A,0x4F,0xBB,0x69,0x9A,0xE1,0x8F,0xD6,0x8B, + + 0x03,0xF5,0x36,0x35,0xCF,0x49,0xA2,0x4A,0xA7,0xDC,0xA6,0x32,0x0D,0x98,0x82,0xCF, + + 0x2C,0x64,0xD2,0x99,0x14,0x2B,0x92,0x39,0x92,0x4E,0xB4,0xDA,0x6B,0xCC,0xF2,0xF0, + + 0xC1,0xC6,0xF5,0x5B,0x2A,0x4F,0x52,0xD0,0x09,0x0B,0x92,0x2C,0xDE,0x5B,0x93,0x7B, + + 0xBB,0x1F,0xC1,0x11,0x71,0x8B,0xB9,0xD8,0xCE,0xEA,0x29,0xEA,0x1A,0x3A,0xA3,0x90, + + 0xBA,0xCF,0x33,0x86,0x3E,0x39,0x1D,0xA5,0xCF,0xB2,0xA1,0xCB,0xFB,0x59,0x1B,0x53, + + 0x6D,0x4C,0xA4,0x7D,0x1B,0xEC,0x52,0xEC,0x37,0xEA,0xE9,0xF2,0xAD,0x51,0x21,0xB0, + + 0xD3,0xA0,0xEA,0x4C,0xFA,0x36,0xE2,0x41,0xEC,0x5F,0x27,0x0E,0x99,0x6D,0x63,0xD4, + + 0x8C,0xF7,0x7C,0xDE,0xF2,0xE1,0x5B,0x65,0xF9,0xF8,0x2E,0x2A,0x3B,0x18,0x5D,0x6D, + + 0x6C,0xC2,0xEA,0xAB,0xA8,0x3B,0xE3,0xC1,0x4B,0x6E,0x22,0x3A,0x26,0x19,0x5E,0x84, + + 0x87,0x00,0x3C,0x7A,0x5B,0x3F,0xD4,0xB1,0x63,0x4B,0x55,0xA1,0x50,0x32,0x55,0x82, + + 0xC6,0x0A,0xF3,0x7C,0x7E,0x7C,0xDC,0xFC,0xA1,0x5B,0xA2,0x60,0x52,0x29,0x5F,0x49, + + 0x07,0x9F,0x83,0xB7,0xD0,0x92,0xA5,0x25,0xA8,0x67,0xCD,0x21,0xD1,0x6B,0xED,0xE7, + + 0x92,0x87,0xF6,0x52,0x6B,0x3B,0x5D,0x59,0x59,0x1E,0xC4,0xC5,0x54,0xAC,0xDB,0x91, + + 0x23,0x54,0x3B,0x83,0xCB,0xC2,0x54,0x06,0x51,0x40,0x78,0x60,0x0F,0xB3,0xF6,0x55, + + 0x2D,0x9F,0x95,0x52,0xD6,0x0A,0xE6,0x10,0x29,0x7C,0x1A,0x70,0x0E,0x95,0x49,0x9A, + + 0x91,0x82,0x3A,0xBF,0x64,0xE9,0x8F,0xED,0xD1,0x42,0x15,0x98,0xBC,0x7C,0x9A,0x2E, + + 0x1C,0x79,0xB2,0x51,0xCE,0x91,0xAC,0x75,0x9E,0x7C,0x95,0x71,0xC0,0x43,0xFC,0x0C, + + 0x09,0xBA,0x85,0x64,0xFC,0xF5,0x14,0x4E,0xCD,0xDE,0x97,0xCA,0x87,0xA5,0xF1,0xEB, + + 0x7E,0xED,0x1E,0x68,0x31,0x3D,0x2F,0x48,0x2D,0x16,0xA4,0x23,0x86,0xF4,0x39,0xE9, + + 0xC8,0xC5,0x6B,0x1F,0xB0,0x30,0x13,0xE9,0xFC,0x41,0xC7,0xDA,0xB4,0x16,0x77,0xAB, + + 0x56,0x00,0x4D,0xE7,0xD2,0x34,0x8F,0xCB,0xDA,0x6E,0x7C,0x43,0xCA,0x92,0x79,0x47, + + 0x2C,0xE5,0xCE,0x49,0x09,0xD5,0x0F,0xF2,0x8F,0x30,0xE8,0xDD,0x1E,0xB3,0xD1,0xCD, + + 0x2A,0x7D,0x97,0x46,0xE2,0x72,0xC1,0x6E,0x68,0xDD,0xD6,0xF0,0x48,0x68,0x8F,0x09, + + 0xBA,0x5C,0x7F,0x36,0xAA,0x73,0x93,0x12,0x67,0x1C,0x6D,0xAA,0x38,0xDE,0x5F,0x51, + + 0xDE,0x04,0xCE,0xA6,0x1C,0x24,0x06,0xF3,0x8C,0x1C,0x85,0xF8,0x5C,0x3E,0xDA,0xEA, + + 0xD6,0xCF,0x18,0x94,0x14,0xEF,0x8C,0xA6,0x0C,0x67,0x75,0xCE,0x9C,0x4D,0xD2,0x54, + + 0x1B,0x9A,0xF8,0x61,0x17,0xA2,0x02,0xDA,0x89,0x0E,0x72,0x56,0x51,0x6C,0x20,0xE5, + + 0xB7,0xB6,0xF8,0x81,0x31,0xB2,0x31,0x23,0xC4,0xC2,0xA7,0x13,0x33,0x4F,0x08,0xE7, + + 0xA3,0xC2,0x6F,0x13,0x12,0x61,0x59,0x65,0xE8,0x81,0x43,0xDF,0x1D,0x2E,0x8C,0xD0, + + 0x0E,0x8C,0x5A,0xA6,0x12,0xEA,0xDC,0x10,0x8C,0x05,0x49,0x16,0xD6,0xFB,0xA8,0x5F, + + 0x01,0xF4,0xF4,0x14,0xFE,0x6F,0x03,0x35,0xBA,0x73,0xB0,0x7B,0x64,0x73,0x21,0x31, + + 0x61,0x85,0x24,0x67,0x88,0xE6,0x0E,0x11,0x04,0xC6,0x4A,0x17,0x56,0xF0,0xBB,0x93, + + 0xC3,0x9C,0xB1,0x0A,0xA4,0x6D,0x42,0x03,0x47,0xD8,0xC2,0x91,0xC7,0x5A,0x8A,0x8F, + + 0x89,0x9A,0x4A,0x9B,0x2F,0xEE,0x34,0xEA,0x7F,0x8D,0x5E,0xBC,0x4C,0xE0,0xEA,0x67, + + 0xDE,0x92,0xF0,0x26,0xBA,0xA8,0xFA,0x2B,0x15,0xC1,0x8B,0x2E,0xFA,0xA8,0x8B,0x9E, + + 0x09,0x48,0xF9,0x0E,0x3B,0xBA,0xF3,0x3A,0x0C,0xA4,0x35,0x5D,0x3B,0xF1,0x88,0xED, + + 0xBE,0xCD,0xEE,0xCF,0xAE,0x81,0xBE,0xB9,0x08,0xA2,0xAB,0xAE,0x99,0xEA,0x53,0xBA, + + 0x4E,0xC3,0x5A,0xAE,0x0B,0xEE,0xC9,0x1A,0xCE,0xDA,0x0A,0x86,0xCE,0x27,0x66,0x38, + + 0x2D,0x2F,0xCA,0xAB,0x2C,0x3B,0x1D,0x1C,0x85,0x0C,0xA2,0x6A,0x6C,0xF8,0xF3,0x6B, + + 0x88,0xCE,0x7C,0x1E,0x9F,0xEE,0x3B,0xEB,0x43,0xD5,0x72,0x87,0x4E,0x23,0xEB,0x1A, + + 0x2E,0xCD,0x53,0xA1,0x8F,0xE2,0x83,0xF3,0x6A,0x49,0xA1,0x7B,0x78,0xAE,0x95,0xF1, + + 0x87,0xDF,0xA2,0xB4,0x54,0x10,0xCC,0x86,0x85,0x7F,0x0C,0x5C,0x64,0xBD,0xF3,0x12, + + 0x52,0xE4,0xA4,0x03,0x06,0x75,0x86,0x4C,0xE8,0xB3,0xA6,0xB4,0xC6,0x6C,0x24,0xFC, + + 0x03,0xD3,0xDA,0xF9,0x3B,0x04,0x23,0x5C,0xD7,0x94,0xCA,0x60,0x2A,0x2F,0xED,0xE3, + + 0xD5,0x68,0x17,0xE7,0xBD,0xBA,0x43,0x87,0xD6,0xF7,0xA7,0xB5,0x67,0xFB,0x45,0xB4, + + 0xD9,0xFA,0xC5,0x32,0x10,0xB0,0x24,0x66,0x2E,0xD5,0xCE,0x0E,0xEE,0x3B,0xD3,0x41, + + 0x4F,0x5A,0x7E,0x26,0xB7,0xAA,0x25,0xF8,0x82,0x2A,0x01,0xD8,0xD4,0x6E,0x03,0xF2, + + 0xA7,0x56,0xAD,0x00,0x4B,0x10,0x33,0xE7,0xCF,0x5B,0x65,0x63,0x8B,0x92,0x4D,0xC3, + + 0x46,0x8C,0x76,0x5D,0xB6,0x47,0x91,0x60,0x8F,0xDF,0xD9,0x0E,0x76,0x0C,0x66,0x76, + + 0x90,0xDA,0x27,0x7A,0x38,0xA3,0x8E,0xCA,0x24,0x73,0x34,0xF0,0x8D,0x24,0x94,0xDD, + + 0xEF,0x9B,0x54,0x9C,0x73,0x34,0x5E,0xF0,0xBD,0xD4,0x59,0x3A,0x00,0xDB,0x76,0x8B, + + 0x9F,0x7E,0x81,0xFC,0xD4,0x7B,0x21,0xAA,0x93,0x9A,0x18,0xD4,0x21,0xE1,0x67,0x0A, + + 0xE9,0x9D,0xF6,0x89,0x5A,0xBF,0x4D,0xBA,0xE7,0x56,0xF7,0x3B,0x08,0xB4,0x47,0x3C, + + 0x1D,0x88,0xBF,0xBB,0x9B,0x43,0xF4,0x95,0xA4,0x7D,0x97,0x12,0xE2,0xBC,0xAB,0x7A, + + 0x31,0x14,0x41,0x38,0x2F,0x40,0x27,0xF0,0x88,0xB3,0x59,0x5E,0x96,0xF4,0xDD,0x2B, + + 0xAA,0xD0,0xE6,0xA9,0x8D,0x28,0x8D,0xE9,0xAE,0x53,0x3D,0x40,0x2A,0x0F,0xAF,0xA6, + + 0x84,0x84,0x17,0xDD,0x99,0xA4,0xBF,0x86,0x09,0x9D,0xD8,0x1D,0x1F,0x5E,0x38,0xFF, + + 0xE9,0x0F,0x98,0x34,0xE7,0x8F,0x29,0x53,0x61,0xC1,0x87,0x3F,0x20,0xF4,0x48,0xE3, + + 0x27,0xDC,0xB6,0x25,0x9C,0x87,0x66,0x19,0xA8,0x70,0x00,0xB0,0x2C,0x80,0xD5,0xFF, + + 0x7D,0x83,0x13,0x77,0x7B,0x83,0xEA,0xD2,0xF4,0xCF,0x04,0x1B,0xF9,0x97,0x5B,0xBE, + + 0x6A,0x20,0x42,0xD5,0xBC,0x8E,0xB5,0xA2,0x96,0x49,0x2E,0x09,0x25,0xD2,0x41,0x26, + + 0xE9,0x55,0xC8,0x80,0xF3,0x8B,0x38,0x02,0xB5,0x06,0x56,0x99,0xC0,0xBF,0x5B,0x23, + + 0x37,0xA4,0x91,0x7B,0xB6,0x83,0xFB,0x45,0x9B,0x84,0x81,0x5A,0xF6,0x3A,0x7B,0xB2, + + 0xBE,0xA9,0xD4,0xB6,0xA6,0x48,0x53,0x8C,0x1E,0x57,0xF3,0xE1,0xC9,0x98,0x71,0xAE, + + 0x6A,0x36,0x58,0xDD,0x36,0x81,0x7A,0x40,0x41,0x43,0xD8,0x13,0x6C,0xDC,0x58,0x4A, + + 0x74,0xA7,0x93,0x3D,0xB9,0xD7,0x1A,0x5B,0x2C,0xC9,0x52,0x3C,0x67,0x73,0xBD,0x1E, + + 0xFE,0xA2,0x35,0x2C,0xA8,0xD6,0x0C,0xC6,0x22,0x3A,0x25,0xDA,0x7D,0x25,0xA3,0xF9, + + 0x00,0xD9,0xBD,0x38,0xB6,0xF5,0x11,0xD6,0x29,0xE9,0xA3,0x53,0x7F,0x7A,0xDE,0x19, + + 0x41,0x02,0x30,0xAD,0x61,0xF4,0x1B,0x2A,0xFD,0xD8,0x5B,0x7B,0x93,0x27,0x96,0xB6, + + 0xF7,0x8D,0xD7,0x8C,0x1E,0x01,0x42,0x0A,0xBD,0x29,0x92,0x94,0xE6,0x97,0xB1,0x27, + + 0x38,0xED,0xF2,0xA2,0xB7,0x20,0xDE,0x06,0x2A,0x18,0x16,0x0D,0xB2,0xFC,0xE7,0xB6, + + 0x6B,0xDD,0xB5,0xC9,0xE7,0x0D,0x6B,0x19,0x81,0x45,0xB2,0x91,0x1A,0x2C,0xE0,0x1E, + + 0x85,0xD3,0x36,0x13,0x6E,0x73,0x43,0x7D,0x62,0x81,0x68,0x50,0xE8,0x8F,0x7C,0x2D, + + 0xCB,0x83,0xFB,0x7C,0x30,0x4B,0x94,0x92,0x94,0x5F,0x6D,0xAC,0xD5,0x0F,0x8C,0x54, + + 0xBA,0x0A,0x53,0xD6,0x46,0x36,0xA7,0x01,0x09,0xFE,0xE5,0xDA,0x10,0x75,0xB2,0xA9, + + 0x54,0xF3,0x90,0x74,0xD6,0xC3,0x03,0x95,0x0B,0x93,0x79,0x3E,0x93,0x76,0x3C,0xF7, + + 0x80,0x92,0x4D,0x41,0xCA,0x5F,0x0B,0xA0,0xD9,0x57,0xFC,0xF5,0xBD,0x70,0xC4,0x3B, + + 0xC3,0xB7,0x7F,0x9E,0x34,0xCD,0x5E,0x9F,0x43,0x14,0xAC,0xC3,0x11,0x21,0x97,0xFF, + + 0x25,0x0F,0xF3,0x36,0x7B,0x64,0x7C,0x0E,0x98,0xCA,0xA4,0xD3,0x9A,0xE4,0x50,0x3B, + + 0xDD,0x14,0x91,0xBF,0x11,0x53,0x69,0x37,0x03,0xAD,0xAD,0xC2,0x1B,0x07,0x26,0xAE, + + 0xF6,0x1E,0xF3,0xF9,0x90,0x77,0xE8,0xD9,0x57,0xB6,0xA5,0xD2,0x1A,0x06,0xEA,0x1A, + + 0x64,0x10,0xDF,0xBB,0x9D,0x9E,0x63,0x8C,0x89,0xF7,0x56,0x38,0xFF,0xDA,0x9E,0x64, + + 0xA1,0xE2,0x11,0x0D,0x3A,0xD9,0xAC,0x5E,0x79,0x16,0x5A,0x43,0xF6,0x04,0x05,0xEF, + + 0xEA,0x55,0x16,0xFE,0x80,0x78,0x81,0x5A,0xD8,0x41,0xB7,0x29,0x05,0x16,0x27,0x1D, + + 0xC8,0x8A,0xB1,0xB4,0x1E,0x2B,0xC4,0x97,0x96,0xCC,0x78,0x4D,0x79,0x64,0xC6,0xAB, + + 0xED,0x70,0xC0,0xE5,0xBA,0x5B,0x63,0xDC,0xDA,0xFD,0xAE,0xCB,0x93,0xED,0x4A,0x98, + + 0x2F,0x53,0xCE,0x24,0xBA,0xC6,0x76,0x9A,0x96,0x51,0x74,0x89,0xD8,0x18,0x1E,0xC7, + + 0x4F,0x98,0x07,0xB0,0x6C,0x85,0x97,0xEC,0x49,0x83,0xAF,0xC9,0x1B,0x78,0x8F,0x25, + + 0x23,0xE4,0x8F,0x21,0x07,0x7D,0x67,0x7B,0x6B,0x1E,0xA7,0xDA,0x58,0x1A,0x73,0x2D, + + 0x26,0xD5,0x9E,0x32,0xAB,0xFB,0x85,0x0A,0xF0,0x21,0xF2,0x60,0x42,0xA2,0x7C,0x16, + + 0x02,0xBF,0xD8,0x92,0x73,0xBB,0xF8,0xF6,0xDE,0x6C,0xE6,0xB2,0x34,0xAF,0xB6,0x38, + + 0xA2,0x17,0xA1,0xFE,0x15,0x39,0x06,0x17,0x34,0x63,0xAF,0xC8,0xD2,0x6B,0x84,0x6C, + + 0x18,0xDF,0x97,0x26,0xFD,0xAE,0xA8,0xC2,0x66,0x83,0x55,0xDF,0x49,0x2E,0xA4,0x88, + + 0xBD,0xFB,0x59,0xE3,0xDC,0xA9,0x10,0x60,0x26,0xC9,0x5C,0xC3,0x83,0x87,0xB7,0x52, + + 0x70,0x8A,0x5F,0x6E,0xE2,0xC6,0x18,0x70,0x63,0xC8,0xD3,0x08,0x86,0xA7,0x3E,0xC3, + + 0xF5,0xF3,0x9C,0xAD,0x62,0xD7,0x8A,0x44,0x67,0x39,0x5A,0xAD,0x6D,0x59,0xA9,0x52, + + 0xAE,0xC5,0x8F,0x35,0x6C,0x38,0x02,0x54,0x66,0x3E,0x66,0xE9,0xA8,0xE5,0x99,0x44, + + 0x67,0x69,0xB0,0xB4,0xF7,0xEC,0x00,0x14,0xEF,0x69,0xD0,0x2F,0x4E,0x25,0x75,0x9A, + + 0x7E,0xFE,0x0E,0x60,0xBE,0xCC,0x6C,0x0F,0xA6,0x28,0xE3,0x24,0xB8,0x16,0x07,0xFA, + + 0xBC,0x86,0x99,0xBF,0x28,0x05,0x22,0xD8,0xFC,0x17,0xD1,0x2F,0xDD,0xE9,0xEB,0x66, + + 0x01,0x2F,0x14,0xFD,0x74,0x6A,0x05,0x5B,0xA6,0xC4,0xC4,0xD7,0x39,0xA6,0xFD,0xEB, + + 0xAF,0x73,0x22,0x4B,0xBD,0x21,0x2A,0x6E,0xBF,0x15,0x29,0x41,0x58,0x46,0xC5,0xAC, + + 0x1F,0x70,0x93,0xDA,0x5C,0x66,0x25,0x6F,0x30,0xCC,0xA0,0x50,0xFC,0x88,0xD7,0x29, + + 0xBD,0xDA,0x3E,0x4D,0x29,0x91,0x6B,0x6F,0x67,0x00,0x53,0xED,0x1B,0x07,0x91,0x28, + + 0xBB,0x0E,0xC4,0x20,0x46,0x33,0xA0,0x79,0xC9,0x15,0xA1,0xAE,0x7C,0x8A,0xFF,0x81, + + 0x5B,0x9C,0x9A,0xAA,0x93,0x1D,0xE9,0x72,0xD3,0x6F,0x2D,0x2C,0x75,0xB0,0xB3,0x54, + + 0x23,0x38,0xBD,0xE4,0x5F,0x50,0x8D,0xD4,0x8E,0xA2,0x7C,0xCB,0xF9,0x5A,0xE5,0x2B, + + 0xA4,0xD0,0x37,0xB6,0x84,0x1D,0xF5,0x6A,0x10,0xC9,0x5D,0x2B,0x73,0xB0,0xC8,0x17, + + 0x84,0x31,0xD3,0xA2,0xFD,0x12,0x3C,0xD5,0x0E,0x40,0xC5,0xB3,0x15,0x8C,0x4C,0xF9, + + 0x03,0x01,0xAA,0xC0,0xCE,0x25,0x4C,0x1C,0xCA,0xD9,0x8C,0x0E,0xE2,0x3B,0xCB,0xFA, + + 0xF3,0x74,0xBE,0xDE,0x92,0x1A,0x14,0x90,0x98,0xDB,0x6C,0x1E,0xA3,0x35,0x79,0x47, + + 0xB5,0x08,0xBC,0xE9,0x13,0x19,0x88,0x67,0x9B,0x87,0xF4,0x11,0x73,0xB4,0x4A,0xE7, + + 0x77,0x36,0xBB,0x3A,0x25,0xEC,0x45,0x0D,0xE1,0x57,0x3D,0x92,0x1E,0xEC,0x1C,0x62, + + 0x36,0xD7,0x86,0x18,0x4B,0xED,0xEB,0xC0,0x5B,0x6D,0x07,0x4C,0x0B,0x8F,0x70,0xAE, + + 0xAC,0x32,0xF5,0x9E,0x3B,0xA3,0xE1,0xD0,0x1A,0x6C,0x3E,0x77,0x89,0xE2,0xB7,0x7A, + + 0xC4,0xBE,0x78,0x35,0x44,0x60,0x68,0x2B,0x9F,0xAF,0x68,0x2F,0x1D,0x45,0xB9,0xA0, + + 0xC6,0x8A,0xC4,0x80,0xC9,0x6F,0xFF,0x7F,0x76,0x76,0x0E,0xD9,0x16,0xCA,0xDD,0x88, + + 0x8F,0x61,0xC4,0x33,0x3C,0x67,0xAB,0xF4,0x52,0x28,0x55,0x98,0xF1,0x7A,0xD9,0xBE, + + 0x29,0x64,0xB7,0xF0,0x9A,0xE2,0x1C,0x05,0x86,0xAC,0xE0,0x71,0x79,0xE4,0x4F,0xA9, + + 0x5A,0xB7,0x52,0x4B,0xB1,0x4C,0x64,0x2C,0x07,0x4F,0x77,0xAF,0xEE,0xBC,0xF9,0x19, + + 0x0E,0x60,0xEE,0xB9,0x00,0x04,0x65,0xF9,0x2D,0xDB,0xB8,0x39,0xF1,0xBE,0xBF,0x30, + + 0x4C,0x1B,0xA0,0x32,0xB1,0xFF,0x4B,0x0F,0x3B,0x42,0xCA,0x56,0xAB,0x22,0x10,0x20, + + 0xF6,0xA0,0xF7,0x6A,0xFA,0x48,0xC3,0xF2,0x47,0x61,0xB8,0xB0,0x0E,0x9B,0x30,0xE7, + + 0xA4,0xAF,0xE1,0x07,0x78,0x2F,0xCC,0x20,0xBF,0x42,0x5E,0xAF,0xD6,0x7B,0x31,0x0E, + + 0x22,0x86,0xB6,0xE6,0xF0,0x25,0x05,0xD9,0x4D,0x88,0x42,0x7F,0xAE,0xD5,0x60,0xE3, + + 0xA3,0x0D,0x8E,0x26,0x90,0x38,0x51,0x93,0x12,0xC9,0x7D,0x06,0xD0,0x88,0x16,0xB2, + + 0x0F,0x80,0xA8,0x56,0x08,0x28,0xA2,0xF2,0xC3,0x9C,0x34,0x16,0xB1,0x9A,0x07,0x23, + + 0x65,0xCB,0x36,0xC1,0xEF,0x92,0x2F,0x78,0xF1,0x40,0xED,0x87,0x50,0x62,0xFA,0xB3, + + 0xB0,0x47,0xA9,0x02,0x52,0x65,0x61,0x8E,0xCD,0x25,0xDE,0x07,0x51,0x7B,0x10,0x08, + + 0xF7,0xA5,0xA2,0xF1,0xB9,0xA2,0x1B,0xAA,0xF4,0x4A,0x4F,0xBC,0x23,0x97,0xD7,0x19, + + 0x0D,0x29,0xB4,0x6C,0x50,0x40,0x42,0x98,0xCB,0x3C,0xB3,0xC1,0xEF,0x12,0x7B,0xB9, + + 0x2B,0xD5,0x77,0xE5,0xDB,0x65,0x2B,0xD6,0xA9,0x82,0x53,0xF0,0x4A,0xB1,0x17,0xE5, + + 0x01,0xF0,0xD3,0x14,0x3C,0x20,0xDB,0x5B,0x3E,0xB6,0x9D,0x4F,0x22,0x29,0xE9,0x0F, + + 0x04,0xD0,0x5D,0x57,0x98,0x28,0x18,0xF5,0xA1,0x1C,0xF5,0x8E,0xD8,0x80,0xAA,0xAE, + + 0x38,0x54,0xAA,0x0B,0x8A,0x22,0x5D,0x74,0xA2,0xDD,0xE6,0x9E,0xD9,0x71,0x87,0x83, + + 0x31,0x15,0x8E,0x2F,0xD9,0xDE,0x43,0xE9,0x96,0xEA,0x7E,0x0F,0x58,0x82,0x71,0xBF, + + 0x9B,0x84,0x7F,0x2F,0x38,0x29,0xB7,0xEA,0x93,0x47,0xFC,0x1F,0x54,0xE9,0x3E,0x68, + + 0xEC,0xDF,0x82,0x74,0x34,0x7F,0x4D,0xA7,0x95,0x9F,0x16,0xE4,0x7C,0xDB,0x36,0x63, + + 0x49,0x8A,0x74,0x96,0x77,0x9C,0x54,0x78,0x45,0x1D,0x13,0xD6,0xB0,0xFB,0x5C,0xAA, + + 0x07,0x53,0xA5,0x08,0xD3,0x30,0x6A,0x5C,0xE8,0x10,0x06,0xB1,0x72,0x76,0xB8,0x68, + + 0xA3,0x68,0x11,0x35,0x5C,0xF3,0x89,0xC3,0x63,0x4F,0x1A,0xA5,0xC2,0xA8,0x1B,0x13, + + 0x1D,0x45,0xFB,0x46,0xB2,0xE0,0xC7,0xD1,0x76,0xD6,0x9E,0xF9,0x41,0xED,0xE7,0x2D, + + 0x09,0x8E,0xAC,0x9E,0x9D,0x3A,0x24,0xE2,0x50,0x0E,0x85,0x80,0xD4,0x6E,0x85,0x19, + + 0xE4,0xCD,0xFD,0x97,0xF1,0xC6,0x2B,0xDD,0x2A,0x06,0x2D,0x87,0xB1,0x86,0x6D,0x28, + + 0x4D,0x6C,0x79,0xA7,0x10,0x31,0xA7,0x75,0x95,0xAE,0xC6,0x93,0xD0,0x17,0x86,0x75, + + 0x28,0xC3,0xDF,0x74,0x9D,0xB0,0xE4,0x4A,0xEA,0xB4,0x6E,0xCA,0x87,0xF1,0xD5,0xB7, + + 0x56,0x1B,0xDE,0xFF,0x7D,0x22,0xB6,0x25,0x82,0xB3,0x0D,0x8C,0x71,0xC6,0x3F,0x0D, + + 0xA0,0x33,0xC3,0x6B,0x51,0x53,0x28,0x4B,0x03,0x60,0x93,0xCD,0xBA,0xD7,0x50,0x32, + + 0xAF,0xC1,0xD4,0xFB,0xF8,0x79,0xB7,0x20,0x6C,0x89,0xA5,0x18,0x0A,0x15,0x85,0x4C, + + 0x79,0xDE,0xEF,0x6B,0x9B,0x37,0x36,0xEA,0x51,0x51,0x8C,0xFD,0xDD,0x67,0x04,0x45, + + 0xC0,0x8D,0xCB,0x5E,0xAA,0x5A,0x99,0x7A,0xA6,0x50,0x84,0xF4,0xDC,0xD9,0x27,0xCB, + + 0x8F,0x13,0x47,0xEA,0x1B,0x35,0x93,0x6C,0xE4,0xD4,0x4D,0x8B,0xD9,0x1E,0x77,0x7C, + + 0x2D,0x1D,0x95,0xD8,0x18,0x5A,0x27,0x9B,0xC8,0x3F,0xC7,0xC1,0xFD,0x86,0x08,0x86, + + 0x36,0x80,0x22,0xF7,0x39,0xC0,0xAB,0xDD,0xC6,0xB5,0x7F,0xAC,0x23,0x3C,0x63,0xFA, + + 0xA1,0xC3,0x88,0xEB,0xB4,0xA2,0x2C,0xB0,0xF9,0xE3,0x82,0xCD,0x53,0x1B,0x78,0x89, + + 0x82,0x22,0xFF,0x77,0x6B,0xA4,0x73,0x41,0xB9,0xC9,0x6E,0xFE,0xEB,0x42,0x2F,0x38, + + 0x83,0x7A,0x15,0x8E,0x7C,0xCA,0x01,0xCC,0x27,0xAB,0xD8,0xB5,0x55,0x1B,0x68,0xA4, + + 0x84,0x80,0xC9,0xF9,0xB7,0xAF,0xF7,0x71,0x16,0x94,0x71,0x26,0x5A,0x6F,0xEF,0x32, + + 0x5B,0x88,0xA9,0xD4,0x97,0x9F,0x94,0xE0,0x5B,0xCD,0x9C,0x14,0x14,0x15,0x82,0x21, + + 0x47,0x0C,0x61,0x60,0x37,0xAD,0x51,0x6F,0x2F,0x96,0x70,0x85,0x54,0xE2,0x43,0x83, + + 0xDB,0x2C,0xD1,0xB7,0x91,0xA1,0xFD,0x82,0xD3,0xB7,0x99,0x20,0x42,0xE8,0xCA,0xE2, + + 0x9E,0xCA,0xF2,0x79,0x50,0xB3,0x77,0xA8,0xF0,0xAA,0x8A,0xFE,0x00,0x47,0x96,0x9E, + + 0x45,0x2E,0x8A,0x2B,0xF4,0xC0,0xC5,0xB8,0xF1,0x6B,0x29,0x3F,0xDD,0xB9,0x25,0xD3, + + 0x8A,0x73,0xF8,0xFF,0x94,0xE5,0x0B,0xD5,0x31,0x13,0x20,0xCF,0x94,0x41,0x2B,0x1B, + + 0x8D,0x8B,0xF2,0xE7,0xBF,0x86,0x03,0x46,0xEE,0x9B,0x85,0x03,0x52,0x6D,0x1A,0x6A, + + 0xEE,0xB7,0xCB,0xF1,0x18,0x55,0x4C,0x72,0xC3,0x6A,0x92,0x6C,0xD4,0xE1,0x2F,0xBD, + + 0x78,0x41,0x2A,0x23,0xE6,0xAB,0x79,0x46,0xCF,0xAD,0x54,0x28,0xFC,0xEB,0xFE,0xAC, + + 0x67,0x81,0xDC,0xCD,0x53,0x22,0x74,0x2B,0x86,0x6A,0xD9,0xBF,0x82,0xE8,0xB4,0xF2, + + 0xFC,0x8B,0x45,0x15,0x99,0x56,0x5D,0x62,0xBB,0x62,0xDB,0x7C,0x7E,0x63,0x2E,0xFD, + + 0x05,0xE0,0x5C,0x6E,0x6C,0xFD,0x54,0xE8,0x8E,0xDF,0x0B,0x3D,0x85,0x79,0xAC,0x52, + + 0x9E,0x31,0x88,0xA5,0xB0,0x41,0x72,0x54,0x8E,0x1B,0xDD,0xF6,0x31,0x5C,0x1B,0xB2, + + 0x29,0x14,0xBF,0x83,0x97,0xF2,0x6C,0x5E,0x43,0xC9,0x95,0x4D,0x97,0xF6,0x3B,0x91, + + 0x76,0x48,0x05,0x86,0xC2,0x97,0x43,0xC2,0x8E,0x2A,0x2E,0xA7,0xC6,0x28,0xD0,0xA0, + + 0x65,0x66,0xDE,0x24,0xB4,0xB0,0x2E,0xFF,0xC5,0xD2,0x8E,0x46,0xD7,0x94,0x52,0x54, + + 0x77,0xF0,0x8C,0x9C,0xEF,0xBA,0xFB,0x70,0xAA,0xA9,0xE7,0x72,0x0A,0xAF,0x1B,0xDA, + + 0x07,0xD3,0x09,0xA5,0xF5,0x46,0x55,0x2F,0x47,0x5C,0xD3,0x3B,0x82,0xED,0x55,0x03, + + 0xFB,0x38,0x8D,0xD5,0x38,0xBA,0x05,0x91,0x8C,0xD8,0xA4,0x8F,0x50,0x53,0x06,0x77, + + 0x61,0x03,0x79,0xDA,0x4F,0xBC,0xC9,0x28,0xEC,0x12,0x4E,0x2C,0xFC,0x72,0x5B,0x1E, + + 0x7E,0x5B,0x6E,0x46,0x7B,0x62,0x3C,0x38,0xFC,0xAD,0xDE,0xBC,0x72,0xF4,0x92,0x72, + + 0xAE,0xE1,0xF8,0xC7,0x83,0x3A,0x0F,0xF9,0xAF,0x2A,0x8F,0x47,0x7A,0x35,0xEF,0xF3, + + 0x30,0xDA,0x8B,0x62,0xEC,0xC0,0x47,0xFD,0xF1,0xDD,0xE6,0xA0,0x1A,0xFD,0x7E,0x22, + + 0xAC,0x57,0xCC,0x1E,0x62,0x17,0xF7,0xD8,0xCD,0xDA,0x3D,0xD2,0x78,0x05,0x69,0x29, + + 0x78,0x86,0x40,0xBD,0x9C,0xB0,0x34,0xE7,0xED,0xC1,0xD8,0x9E,0x0B,0x70,0x47,0xB8, + + 0xFE,0x3F,0x9F,0xC3,0x5E,0xB8,0x57,0x27,0x4F,0x52,0x8D,0x4F,0x5F,0x9E,0xAF,0x3D, + + 0x8F,0x0F,0xB7,0xD7,0x3D,0x53,0xDC,0x19,0x6D,0xDB,0x9F,0xB5,0x4D,0xF0,0xB4,0xE2, + + 0x63,0xFF,0x87,0x62,0x71,0x60,0x2B,0x53,0x69,0xC6,0x4B,0x24,0x56,0xDA,0xBC,0xF2, + + 0x83,0x05,0xD7,0x76,0x3F,0x67,0x3C,0x30,0xE0,0x48,0x82,0x30,0x70,0xBB,0x61,0x56, + + 0x7D,0x0D,0x99,0xED,0x12,0x26,0x13,0x61,0x84,0x44,0x64,0xCD,0x88,0x2F,0xE1,0x73, + + 0x0E,0x85,0x8C,0x97,0x11,0x8A,0xE0,0x42,0xE0,0x5C,0xF9,0x37,0xE0,0x6E,0xF8,0xBE, + + 0xC3,0x67,0x43,0xC0,0x4D,0x2E,0x09,0xFD,0xE5,0x42,0x33,0x9A,0x76,0x7F,0x42,0xF0, + + 0xBC,0xB0,0xF2,0xCB,0xEC,0xA8,0xF5,0x0C,0xE0,0x48,0xC0,0x6B,0xF0,0xE0,0x95,0x91, + + 0x03,0xFE,0x29,0x7A,0xB6,0x4A,0x71,0x63,0x63,0x40,0x11,0x03,0x2D,0xCB,0x51,0x6E, + + 0x97,0x45,0xAB,0x55,0x64,0x3C,0xF5,0xE3,0xD7,0x4D,0x49,0x27,0x90,0x97,0x02,0x48, + + 0x7A,0x05,0xBA,0xFF,0x60,0x2B,0x28,0xC1,0x6B,0x27,0x69,0xAE,0xD8,0x81,0x40,0xF2, + + 0xE2,0xD8,0x1D,0x7E,0xFA,0xD6,0xE6,0x4B,0x1E,0x56,0x0F,0x47,0xB2,0xF8,0x79,0x69, + + 0xBA,0x07,0x86,0xD8,0x1A,0x2E,0x2A,0x18,0x69,0x78,0xAB,0xD6,0x2D,0xC5,0x55,0xFB, + + 0x88,0x8E,0xEB,0x1F,0xED,0x26,0x21,0xD0,0xEE,0x24,0xFB,0x3F,0xEC,0x66,0x8D,0xEE, + + 0xEB,0x0D,0xDC,0x0B,0xBF,0xDA,0xD6,0x98,0xB5,0x43,0xAA,0x4B,0xBB,0x63,0xFF,0x38, + + 0xF0,0x09,0xB2,0xD4,0xBE,0xA4,0xC5,0x58,0x4D,0xB4,0x80,0x7E,0xE8,0xB4,0x40,0x5C, + + 0x61,0xB6,0x78,0x3D,0x1A,0x81,0x33,0x6B,0xFD,0x0C,0x43,0xAA,0x27,0xD8,0xC9,0xAA, + + 0xD2,0x7A,0xEB,0xCE,0x38,0x6E,0x68,0x3B,0x6A,0xB2,0xBA,0x59,0xE8,0x3A,0x56,0x81, + + 0xF9,0x91,0xA4,0x68,0x91,0x2B,0xEF,0x22,0xE0,0x08,0x23,0x9D,0x76,0x89,0x6C,0xC7, + + 0xDC,0x1E,0xD5,0x96,0xD6,0x2A,0xB4,0x34,0x2E,0x92,0xB4,0xD6,0x77,0x88,0x05,0x7E, + + 0x59,0xC1,0xC7,0x63,0x1C,0x3F,0x4C,0x65,0xE6,0xAB,0x26,0xE7,0x51,0x8F,0xB9,0xEE, + + 0x02,0x08,0xCF,0xF3,0x46,0x9E,0x27,0x42,0xFD,0x48,0x34,0x31,0x8C,0x22,0x44,0xC4, + + 0xAB,0xE9,0x71,0x78,0xD9,0x50,0xEB,0xA2,0xC3,0x16,0xF4,0xC0,0xD3,0xCB,0x66,0x55, + + 0x2D,0x9F,0x33,0x3C,0x5E,0x78,0xCD,0x32,0xC2,0xAA,0x24,0xD0,0x40,0x05,0x25,0xC3, + + 0xD1,0x1B,0x55,0x2D,0x6E,0xFB,0xCA,0xAF,0xE4,0xAF,0x6E,0x03,0x0B,0x66,0xC9,0x39, + + 0xE5,0x58,0xB6,0xDD,0x16,0x88,0x35,0x93,0x14,0x15,0x65,0x0B,0xE3,0x3A,0x9C,0x0C, + + 0x55,0x42,0x91,0xCB,0xEE,0x30,0x10,0x4E,0x5B,0x7C,0xFE,0xCE,0x87,0x76,0x6E,0xD2, + + 0x8F,0x16,0x0D,0x74,0xB9,0xF4,0x26,0x88,0x21,0x42,0x43,0x54,0x77,0x84,0x5E,0xFD, + + 0x0F,0x97,0x47,0xF2,0x6E,0x32,0xEF,0x2B,0x68,0x5D,0xAF,0x53,0xFE,0xFA,0x6F,0xD3, + + 0x47,0x14,0x74,0xEE,0xC1,0x55,0x5E,0x5F,0x4C,0x40,0x67,0x3F,0x79,0xD2,0x7E,0x18, + + 0x54,0x07,0x6A,0x53,0x59,0x38,0x54,0x05,0x59,0x58,0x2B,0xC8,0x49,0x6A,0x36,0xDD, + + 0xCB,0xB6,0xAF,0xF8,0x9E,0xC2,0x27,0x7C,0x5B,0x5D,0xBC,0xF8,0x33,0x48,0x57,0x2F, + + 0x0F,0xB5,0xBE,0xB7,0xDB,0x3A,0xE8,0x1F,0xEC,0x04,0x17,0xFC,0xA9,0x65,0x37,0xC8, + + 0x6B,0x19,0x14,0xDD,0x43,0xEE,0x9F,0x24,0x7E,0x1D,0xE5,0x15,0x2D,0x30,0xDF,0x80, + + 0x95,0x97,0x3F,0xE6,0x4C,0xAD,0x09,0x13,0xE5,0xF2,0x4B,0xA4,0xD4,0xD9,0x97,0xF0, + + 0x87,0x85,0x2F,0x02,0xB4,0xCD,0xC7,0x60,0x06,0x31,0x3D,0xD0,0xAC,0xF1,0x1F,0xE1, + + 0x27,0xE7,0x65,0x81,0xC8,0xA1,0xCD,0xCB,0x04,0x8F,0x89,0xDC,0x21,0xF9,0xC1,0x71, + + 0xC6,0x63,0x6D,0x92,0x13,0x03,0x60,0x25,0x62,0xC5,0x41,0x51,0xF6,0xA3,0x78,0x79, + + 0x12,0x71,0xD8,0xB5,0x62,0x71,0x58,0x00,0x40,0x3D,0x48,0x95,0x78,0xF4,0x08,0xF2, + + 0x0B,0x0E,0x57,0x19,0x82,0x78,0x10,0x10,0xB8,0xCB,0xB8,0x9A,0xEB,0xA4,0xE0,0xC7, + + 0xD9,0x51,0x74,0x78,0xE6,0xDA,0xD8,0xE7,0xBB,0x97,0x49,0x94,0xB4,0x9D,0x6D,0xB1, + + 0x81,0x7D,0x40,0x25,0x2C,0xB8,0x41,0x8D,0xC1,0x47,0x4E,0x4B,0x24,0x58,0x5C,0x36, + + 0x2D,0xFA,0xF2,0x0F,0x2A,0xA9,0x12,0x63,0xED,0x17,0xF3,0x48,0x7F,0xD8,0x12,0x2A, + + 0x0D,0x36,0x7A,0x7C,0xF6,0x18,0xB5,0xBE,0x30,0x85,0x42,0x36,0x3E,0x82,0xD8,0x89, + + 0x1D,0xBD,0xA4,0xBA,0x1E,0xAE,0x53,0x29,0xDD,0xD1,0xEA,0x22,0xBF,0x88,0x4B,0x51, + + 0x3F,0x86,0x1F,0x7D,0x62,0xAD,0x5B,0x39,0xD0,0xC6,0x43,0xBB,0xA0,0x8A,0xB2,0xA2, + + 0x56,0xC1,0x72,0x3D,0x2A,0x0D,0xAF,0x82,0x0C,0x31,0x09,0xEA,0x52,0xE3,0x46,0x25, + + 0x2F,0xBD,0x3E,0xA0,0x7C,0xAF,0xBA,0x07,0x6F,0x8F,0x40,0x81,0xA4,0xF6,0x79,0x4F, + + 0xAD,0xCE,0xDB,0xB0,0x77,0x9F,0x8B,0xE9,0x4E,0xB5,0x48,0x4B,0xED,0xA8,0xEB,0x18, + + 0x72,0x8E,0x7C,0xAC,0x1B,0x24,0xE4,0x41,0x4E,0xC2,0xE2,0x19,0x05,0x64,0x5A,0xEB, + + 0xCF,0x49,0x47,0x46,0x74,0x4D,0x30,0x44,0x0F,0xDF,0x8C,0x58,0xD8,0xFD,0x69,0x74, + + 0x23,0x98,0x8C,0xE7,0x94,0x1E,0x44,0x36,0x3E,0x35,0xFA,0x50,0x73,0x69,0x7C,0x83, + + 0x03,0x89,0x46,0xC7,0xF0,0xB4,0xE2,0x91,0x1B,0x07,0x19,0x39,0x88,0xE9,0x7D,0xE0, + + 0xF2,0x37,0xBA,0xB1,0xE9,0xF5,0x5D,0xF3,0x0B,0x58,0x32,0x33,0xF4,0x3D,0xC9,0xF4, + + 0x85,0x92,0xBF,0xC6,0x30,0xF4,0xE3,0x42,0x55,0x56,0xF5,0x00,0x52,0xF2,0x26,0xCF, + + 0x14,0xB7,0xA6,0x34,0xA6,0x48,0x4E,0x90,0xEA,0x23,0x9B,0x74,0xB2,0x5E,0x45,0x3F, + + 0x07,0x1A,0x48,0xB9,0x77,0xA9,0xCD,0x1C,0x64,0xAA,0x5F,0x82,0xF0,0x56,0x95,0xB5, + + 0x2A,0x11,0xC7,0x07,0xEB,0xAF,0x24,0x6B,0x40,0xD1,0x6D,0x07,0xF3,0xF8,0x3E,0x68, + + 0xCC,0x3C,0xA6,0x0C,0xBC,0x60,0x32,0x48,0xE9,0x2D,0x76,0x67,0x43,0xBA,0x20,0xFB, + + 0x0C,0xE9,0x96,0x8E,0x99,0x89,0x46,0xFC,0xD9,0xDF,0x84,0x1B,0x4E,0xFF,0x5F,0xEA, + + 0x47,0xD3,0x9F,0xC8,0xB2,0xBB,0x57,0xEB,0x52,0x57,0xFE,0x4F,0x58,0xF8,0xC3,0xE8, + + 0x88,0x1D,0x4F,0x9F,0xC2,0x32,0x6F,0xBE,0x4E,0xC0,0x35,0x40,0xCE,0xA9,0x60,0x0A, + + 0x22,0x17,0x76,0x26,0x5F,0xF1,0x26,0xE2,0x0D,0xFC,0x42,0x9C,0xDD,0xBD,0xB5,0xB8, + + 0x6C,0x6D,0x42,0x36,0x0E,0xF0,0x06,0x88,0x5C,0xF9,0x3A,0x7B,0x71,0x77,0x61,0x2D, + + 0x2C,0x9A,0x1C,0xC7,0x1B,0x41,0x0F,0x69,0xCC,0x0E,0x97,0xED,0xA7,0xF3,0x79,0xB9, + + 0xC7,0x92,0x08,0x20,0xAD,0xF2,0x85,0x08,0xF7,0x93,0x38,0xDB,0x1A,0x74,0xA7,0xA0, + + 0xD8,0x23,0x91,0x80,0x63,0x4B,0x2A,0x85,0xB3,0x02,0x50,0xDD,0x1C,0xFD,0x53,0x7B, + + 0xD4,0x6D,0xF0,0xFC,0x93,0x6C,0x8E,0x2B,0x71,0x03,0x75,0x10,0xC8,0x9C,0xC1,0xF9, + + 0xFD,0x40,0x3A,0xE7,0x3C,0xDF,0xDA,0xA8,0xE4,0xB6,0xE9,0x38,0x88,0xBC,0xCD,0x4F, + + 0x8F,0x1D,0x72,0x1D,0x34,0xDC,0x42,0x4C,0xC7,0xD8,0xB4,0xC5,0x2E,0x9C,0xD6,0x32, + + 0xE9,0xC5,0xD2,0xD9,0x14,0xBF,0x2E,0x49,0x21,0xBB,0x98,0x25,0xBB,0xC5,0x88,0xA8, + + 0x82,0x08,0xF0,0x65,0x6F,0x9A,0x26,0x4C,0xA8,0xB4,0x96,0x12,0xAC,0xC8,0x1B,0xEF, + + 0xEA,0xC7,0x1B,0x27,0x61,0x43,0x2F,0x59,0x29,0xF7,0xD3,0x96,0xB6,0x7D,0x51,0xC4, + + 0x7B,0xC6,0xF7,0x69,0xE1,0xB8,0x63,0x82,0xAF,0xCC,0x4B,0x32,0x0D,0x6D,0x7F,0xF7, + + 0x6B,0x28,0xBC,0x24,0x1E,0x93,0x2F,0x76,0xC5,0x2A,0x69,0xC4,0x13,0x25,0x30,0xA8, + + 0x98,0x4B,0x31,0xFE,0xB5,0xD4,0x61,0x4B,0x79,0x0B,0xCA,0xD4,0x12,0x24,0x15,0xA8, + + 0x63,0x4E,0x4A,0x89,0xEB,0xE1,0xB8,0xAC,0x5B,0x75,0xEC,0x5F,0x2B,0xC5,0x54,0x1F, + + 0xEA,0x66,0xF3,0xF5,0x41,0x66,0x40,0xD9,0xCF,0xD0,0x66,0x47,0x54,0x1D,0xF5,0x79, + + 0x0C,0x07,0x2E,0x37,0xC4,0xB1,0xA3,0x59,0x26,0x0E,0xC7,0x9C,0x75,0xCD,0x5F,0x26, + + 0xC1,0x1C,0x5B,0x67,0x63,0xB8,0x0B,0x88,0x5D,0xEC,0x9D,0x47,0x3F,0x98,0x43,0x0E, + + 0x77,0xA8,0x20,0x0D,0x8E,0x5B,0x08,0x2B,0x6B,0x47,0x41,0x87,0x7F,0x67,0x03,0x4C, + + 0x5F,0x1E,0xD8,0x62,0xAB,0x2B,0xCD,0xFD,0xB8,0x0B,0xCD,0xF9,0xF8,0x8B,0xFB,0x70, + + 0x64,0xB1,0x7F,0x74,0x1F,0xC1,0xD0,0x6A,0xDB,0xCF,0x20,0xC6,0xCF,0x1C,0x5E,0xDA, + + 0x27,0xAA,0xC4,0x80,0x52,0x5A,0xD5,0x34,0x12,0x9A,0x99,0xEA,0xC4,0xAD,0x51,0x72, + + 0x24,0x9F,0xFC,0xE3,0x3D,0xE4,0x2B,0x89,0xE6,0xE9,0x72,0xCB,0x26,0x78,0xAD,0x61, + + 0x10,0xB2,0x1A,0x7F,0x44,0x7C,0xDD,0x49,0x58,0x8F,0x32,0xDA,0x2C,0xCF,0x1F,0xC6, + + 0x83,0x94,0xBD,0xA2,0x13,0xC5,0x54,0xA7,0x9F,0xF2,0xC2,0xE6,0x90,0x81,0x13,0xB1, + + 0x25,0x8E,0xF2,0x19,0xF9,0x6F,0x14,0xE5,0xB7,0x84,0xE6,0x07,0x1B,0xFE,0x3D,0xB2, + + 0xCA,0x54,0x05,0x1C,0xE7,0x5A,0xC2,0x9F,0x28,0x87,0xC3,0xE1,0xDD,0x95,0x97,0xA2, + + 0x93,0x18,0xCF,0x2A,0x3E,0x9A,0xFA,0xCC,0x2B,0xB6,0x1C,0xC4,0x9B,0x35,0x52,0x7B, + + 0xAC,0x95,0xDC,0x69,0x40,0x27,0xBA,0x2D,0xBD,0x3A,0xAD,0xF7,0x28,0x7C,0xD7,0xC3, + + 0xD4,0xA5,0xB6,0xAD,0x98,0xC6,0x25,0xE7,0x6F,0xA3,0x0E,0x51,0x31,0xC2,0x55,0xDE, + + 0xAE,0x11,0xBD,0x6B,0x45,0x9B,0x7E,0x42,0x13,0xA6,0xBD,0xF2,0x01,0x86,0x24,0xE7, + + 0x78,0x59,0xB0,0xAC,0x18,0x9A,0xBE,0xC6,0x02,0x54,0x60,0x40,0xC1,0xA0,0xF2,0xBB, + + 0x12,0x13,0x89,0x5F,0x69,0xBC,0xC3,0xF9,0x06,0xF1,0x8D,0xEA,0xDB,0xFB,0xDE,0x5C, + + 0x58,0xE6,0xCF,0x1C,0x71,0xE0,0x56,0x4B,0x82,0xEC,0x1E,0x18,0x54,0xDD,0x41,0xF8, + + 0x82,0xF3,0x3C,0xB2,0x37,0xB8,0xC1,0xAE,0x28,0xFE,0x57,0xFC,0x06,0xDF,0xF2,0x3B, + + 0xCB,0x4D,0x63,0x4F,0xAB,0x35,0x25,0x19,0xE7,0xF2,0xC9,0x8E,0x93,0x13,0x36,0xA3, + + 0xEF,0xC4,0x5F,0xF6,0x59,0x01,0x0D,0x7C,0xC9,0xA2,0xF8,0x83,0x37,0xD1,0x70,0xFE, + + 0xD1,0xC2,0x17,0xF4,0x31,0x55,0x47,0x6D,0xB4,0x3D,0x80,0x5F,0x76,0x20,0x1B,0xB3, + + 0x49,0xC0,0xB0,0x83,0xE7,0xE6,0x9A,0xA6,0x57,0xFD,0xA2,0xA3,0xA7,0xA6,0x8E,0xB6, + + 0x6C,0x80,0x3F,0x93,0xCE,0x7B,0xF9,0xEE,0x51,0x37,0x0C,0x97,0x9D,0xE0,0xC7,0x6B, + + 0xCE,0x45,0xE1,0x69,0x2A,0x11,0x48,0x82,0x32,0x71,0x1C,0x8E,0x6B,0xA9,0xFA,0x15, + + 0xC5,0x25,0xFD,0xD2,0x30,0x9F,0x20,0x72,0xCA,0x38,0xF0,0x6E,0xAF,0x24,0xF7,0x52, + + 0xE2,0x2B,0x76,0x7D,0xE2,0x53,0xE7,0x5C,0xF6,0x84,0x16,0xEF,0x73,0x30,0x61,0x85, + + 0x6E,0x66,0xB3,0xDB,0xFF,0x66,0x1F,0x4A,0x32,0x61,0x4E,0x46,0xD1,0xCC,0xE2,0xF3, + + 0x0C,0xCA,0x15,0x3B,0x18,0xA3,0x27,0x59,0x20,0x8A,0xE8,0xAE,0x60,0xAA,0x17,0x44, + + 0x80,0xEB,0x92,0x8E,0xBE,0x22,0xE0,0xBE,0x3E,0xF4,0x7A,0xC7,0x74,0xAB,0x78,0xFF, + + 0x8A,0x11,0xDB,0x8D,0x59,0x1C,0x6C,0x2B,0xCA,0x51,0xE8,0x29,0x2D,0xE5,0x80,0x9E, + + 0x1E,0xB4,0x77,0x26,0x2E,0xE6,0x90,0x7C,0xC3,0x17,0xE0,0xCB,0x7C,0xB4,0x18,0x2A, + + 0x66,0x07,0x22,0xB6,0x9A,0x27,0x61,0xAA,0x02,0x18,0xA4,0x51,0x36,0xAE,0x31,0x5C, + + 0xE6,0x6C,0xCA,0x54,0xBE,0xA4,0xEC,0x56,0xB7,0x2C,0xDA,0x25,0xA3,0x4C,0x76,0x7A, + + 0xE6,0xCC,0xE7,0xAD,0xBA,0xA8,0x60,0x74,0xB6,0x6A,0xAF,0x42,0x96,0x2F,0x13,0x6B, + + 0x99,0xCD,0x39,0xAF,0xB0,0x5E,0xCC,0x52,0xC9,0xC4,0x3B,0x9A,0xB1,0x4F,0xA4,0xCD, + + 0xB1,0x4D,0x9C,0x7D,0x43,0x30,0x06,0x59,0x94,0xDF,0x01,0x22,0x2B,0xE6,0x1F,0x36, + + 0xDD,0xF2,0xF3,0x9A,0x94,0x2E,0x0E,0x8B,0x9A,0x7C,0xF2,0xD0,0x8A,0x5C,0x8C,0xCC, + + 0x59,0xEE,0xFF,0x1C,0xCC,0xF0,0x0B,0x8A,0x0F,0xDD,0x8F,0x54,0x9C,0xE9,0x9E,0x37, + + 0x59,0xF0,0x6D,0x6E,0xF9,0xBE,0x45,0x0B,0x12,0x92,0xAB,0xF0,0x2B,0xF9,0xA4,0x3A, + + 0xA2,0x1F,0x63,0xB9,0xE2,0xBB,0x67,0x10,0x47,0x9E,0x96,0xE2,0x77,0x19,0x33,0xB3, + + 0x21,0x0E,0xCD,0xB4,0xC0,0x48,0x69,0xC0,0x07,0x27,0x82,0xF0,0x96,0x76,0x61,0x21, + + 0x5B,0xD4,0xD7,0x38,0x34,0xB2,0x2B,0x01,0xE2,0x7B,0x65,0x17,0x5B,0x07,0xB7,0xA9, + + 0x04,0xF2,0x41,0x49,0xB6,0xD7,0xBD,0x0B,0x80,0xDA,0x53,0x04,0x7B,0xFA,0xE6,0x8E, + + 0xB1,0x65,0x4A,0x14,0x3D,0x38,0x91,0x82,0x6A,0x83,0x28,0x5E,0x53,0x59,0xD5,0xBE, + + 0xC6,0xFD,0x73,0x9E,0xC8,0x33,0xC5,0xB2,0xC8,0x26,0x73,0x4E,0x82,0x56,0xB2,0x74, + + 0x59,0xC9,0x7A,0x8E,0x3C,0xFA,0xE2,0x43,0x38,0x97,0xA1,0x45,0x59,0xF3,0x17,0xAA, + + 0x0C,0x24,0xAB,0xF2,0x9C,0x1B,0x61,0x59,0xE9,0x76,0xAE,0x4C,0xC5,0x54,0x59,0x28, + + 0x0A,0x68,0x6A,0x07,0x7E,0xFD,0x8D,0xCD,0xCF,0x7D,0x0D,0x1E,0x76,0x0D,0x0E,0xF5, + + 0x2D,0x90,0xA0,0xB8,0x7D,0x42,0xAD,0x04,0x04,0xD2,0xD7,0x0D,0xF3,0x20,0xF5,0x4F, + + 0x85,0xCA,0xDD,0x3C,0xD6,0xA5,0x60,0x14,0x07,0x4F,0x89,0xE9,0x1F,0x7D,0x11,0xF3, + + 0x03,0x92,0xD1,0xEE,0x32,0x49,0xFF,0x88,0xDF,0x5A,0x87,0x0F,0x4E,0x0E,0x7E,0x06, + + 0xE1,0x83,0x20,0xF4,0x18,0x2F,0x49,0xDC,0xE5,0x7C,0x96,0xF0,0x0C,0x45,0xF3,0xE0, + + 0x45,0xF0,0xD3,0x12,0xA4,0x2E,0x8D,0xDA,0xF8,0x0E,0xD1,0x09,0xE2,0x2C,0xAF,0xF2, + + 0x0C,0x0F,0xDB,0x2C,0xAC,0x60,0x1C,0x6A,0xA3,0xF8,0xC6,0x57,0x2F,0xE9,0x77,0x17, + + 0x60,0x80,0xA9,0x05,0x85,0x74,0x9C,0x9E,0x89,0x8D,0x81,0xC5,0xD7,0xD8,0x44,0xA2, + + 0x5E,0xF9,0xB8,0xC6,0x17,0x7E,0x30,0x21,0xC6,0x49,0xAE,0x55,0x31,0x36,0x7C,0x47, + + 0x27,0xF1,0x92,0xA9,0xB0,0x40,0xD0,0x1C,0x20,0x65,0x78,0x16,0xDC,0xE3,0x5B,0x45, + + 0xA3,0x46,0xB9,0xC7,0x97,0x2F,0x1B,0x9A,0x61,0x40,0xC7,0x54,0xD4,0xFD,0xDB,0xA1, + + 0x95,0x45,0x93,0xAA,0x30,0x21,0x21,0xF3,0xC2,0x25,0xDD,0x35,0x9B,0x92,0x2B,0xFB, + + 0x84,0xD5,0x84,0xDF,0x04,0x0C,0x28,0xC7,0x7B,0xE2,0x40,0xA8,0x2B,0xBE,0xA5,0x43, + + 0xBC,0xB5,0xD0,0xC5,0x6D,0x36,0xFD,0xF8,0x7E,0xC2,0xC5,0xB8,0x5F,0xF2,0x7B,0x2D, + + 0x55,0x77,0x63,0x29,0x79,0xF5,0xAB,0xD6,0x75,0x26,0x53,0xD4,0xD1,0x28,0x20,0x66, + + 0x58,0xA0,0x33,0xE2,0xDA,0xDB,0xC7,0x14,0x7A,0x06,0x2C,0xBF,0x59,0xD3,0x19,0x4B, + + 0xAB,0xA3,0x92,0x63,0xBB,0xA6,0x6A,0x38,0x4E,0x43,0xC4,0xE8,0x3D,0x1C,0x70,0xA6, + + 0xFE,0x61,0x06,0x3E,0x5A,0x6D,0x3A,0x38,0x4D,0x40,0x76,0xEE,0x13,0x65,0xD5,0xCD, + + 0xA1,0x5A,0x34,0xAF,0x18,0x66,0x6B,0x39,0x8A,0x41,0xD5,0x5C,0x33,0xCF,0x2D,0x6C, + + 0x88,0x2E,0xB3,0x3F,0xDA,0x0F,0x51,0x78,0x68,0x2A,0xE5,0x59,0xE8,0xC5,0x3F,0xB2, + + 0x40,0xA3,0x7F,0xFB,0xBD,0xE6,0x2A,0x24,0x03,0x92,0x20,0xC6,0x8B,0x1E,0x57,0xFB, + + 0xF4,0x7D,0x53,0xF6,0xC6,0xBE,0x64,0x40,0x3A,0x00,0x48,0x5C,0x52,0x3C,0xC5,0x79, + + 0xC7,0x50,0xCD,0x38,0xB6,0xA9,0xD5,0x59,0x0E,0xAF,0x55,0x5C,0x28,0x7A,0xC9,0xCF, + + 0xAF,0x0D,0x95,0x25,0xB7,0xA8,0x64,0xDA,0x46,0x57,0xFA,0x4E,0xE3,0x3E,0x29,0xE4, + + 0xA0,0x5C,0xFC,0x14,0xCC,0x3B,0x2C,0x62,0x63,0x33,0xAB,0x19,0x64,0xAF,0xC4,0x7D, + + 0x80,0x13,0xC4,0x36,0x9F,0xBE,0xA2,0x92,0x22,0x75,0x85,0x25,0xD6,0x7C,0xE3,0xB3, + + 0x01,0x10,0xA5,0x81,0x93,0xBD,0x6F,0x03,0x60,0x5E,0x60,0x61,0xAD,0x60,0x41,0xC5, + + 0xC0,0x57,0x49,0x37,0x31,0x3F,0x25,0x73,0xE2,0x90,0x4B,0x71,0xCC,0xCD,0x7B,0x77, + + 0x4B,0x05,0x19,0xEE,0xCB,0x5D,0x1A,0x58,0x50,0x29,0xF5,0x56,0xF5,0x3A,0x5C,0xCF, + + 0xC2,0x7D,0xD1,0x29,0x3F,0xA2,0x64,0x58,0x07,0xD2,0xFE,0xEB,0xB8,0x74,0x10,0x7A, + + 0x2C,0x97,0xBF,0x76,0x4D,0x78,0xD7,0x51,0x6C,0x57,0xC8,0xB6,0xFB,0xFB,0xB0,0x7B, + + 0x8D,0x00,0x38,0x6C,0x1A,0x7B,0xC3,0x94,0x5A,0x16,0xE4,0x9A,0x58,0xC4,0x3E,0x4A, + + 0x23,0x9C,0x06,0xAE,0x79,0x43,0x6E,0x38,0x36,0xD4,0x16,0x09,0x19,0x7A,0xF1,0x28, + + 0x63,0x12,0xB6,0xBE,0x78,0xE2,0xAE,0x9A,0x28,0xAD,0xAC,0xF8,0x77,0x15,0x45,0x2B, + + 0x28,0x36,0xBF,0xAF,0xF9,0x81,0x4F,0x0B,0x68,0x56,0x7D,0x76,0x5B,0x81,0x2F,0x98, + + 0x5E,0x12,0xB7,0x5F,0xBE,0xBE,0x55,0x79,0x48,0x59,0x92,0xFC,0x06,0x11,0x58,0x06, + + 0xF5,0xC2,0xB8,0x82,0x4A,0x5D,0x28,0xC2,0x27,0xF1,0x88,0xA3,0x5A,0x82,0x15,0x4C, + + 0x88,0xE3,0xAE,0xC2,0x95,0xB1,0x00,0xDC,0xA6,0xC8,0x3F,0xB2,0x2E,0xC9,0x7A,0xE6, + + 0x82,0x19,0xEB,0x1A,0xB5,0x22,0xA4,0xA7,0xB7,0x86,0xFB,0xBA,0xF6,0xEF,0x82,0x96, + + 0x16,0xBC,0xF3,0xB9,0xE1,0xE1,0x2B,0xC3,0x9E,0x92,0x79,0xCF,0x03,0xA1,0x3A,0xC2, + + 0x72,0xC6,0x98,0xC4,0x13,0x9D,0x48,0x32,0x66,0xCB,0x48,0x99,0x65,0xDD,0xF7,0x32, + + 0x09,0x0E,0x60,0x2E,0xB4,0xA3,0x18,0x32,0x41,0xC8,0x98,0x20,0x8D,0xEA,0x3A,0x45, + + 0x27,0x39,0xBB,0x46,0x35,0xA0,0x49,0x33,0xC7,0xC9,0x49,0x99,0x5B,0x10,0x7C,0x6A, + + 0x81,0x1C,0xE5,0xC0,0xD7,0xA8,0x33,0x88,0x64,0xCA,0xA0,0xA6,0x22,0xA8,0xDD,0xFA, + + 0xA1,0x39,0xF9,0x4C,0xFD,0xA7,0x4B,0x4C,0xF7,0x42,0xED,0x9A,0x5A,0x53,0x84,0xE9, + + 0x81,0x74,0xAC,0xC0,0x39,0x24,0x70,0xD8,0xD4,0x35,0x05,0xDE,0x10,0xEF,0x5D,0x0D, + + 0x6D,0x09,0x1C,0xE9,0xC8,0x7D,0xB4,0x4B,0x8C,0xF6,0x73,0xAB,0xAF,0x1F,0x53,0xEA, + + 0x2E,0xCB,0x54,0xF7,0xD6,0xE6,0x82,0x64,0xCB,0xA0,0x92,0x80,0x7C,0x74,0xC2,0xBA, + + 0xF1,0x83,0x82,0x0A,0x22,0x2E,0x78,0x7A,0xED,0xCA,0x29,0x30,0x21,0xF6,0xAA,0xA2, + + 0x8B,0x80,0xCE,0x3C,0x5C,0x12,0x02,0xF8,0x4E,0xA0,0x3A,0xA3,0xCD,0x60,0x39,0xC7, + + 0xE6,0x4F,0x9B,0x6B,0x1C,0xE6,0xFB,0x5B,0xAD,0xEE,0x2E,0x7E,0x3F,0x51,0x29,0xB9, + + 0xDB,0x8B,0x93,0xDD,0xBD,0xDA,0x03,0xF9,0xCE,0xAA,0x85,0xAB,0xE0,0x4F,0x83,0xF4, + + 0xCF,0x31,0x1B,0xB4,0x54,0x03,0xD8,0x31,0x0C,0xD8,0x74,0x5F,0xE6,0xF8,0xB9,0x16, + + 0x56,0x9D,0xD7,0xB1,0x94,0x0E,0x67,0x09,0xC4,0xDA,0x84,0x4C,0xD9,0xFC,0x1F,0x6C, + + 0xC7,0xC5,0x65,0x7F,0xD3,0xBF,0x22,0xD1,0x53,0x90,0x73,0x25,0x39,0xEE,0x15,0xF3, + + 0xFF,0x18,0x6D,0x6F,0xCA,0xBE,0x29,0x37,0x86,0x11,0xC2,0x5F,0xD2,0xBE,0x6E,0xC6, + + 0x85,0x99,0xDE,0x24,0x9A,0xBB,0x7C,0x40,0x05,0x24,0x96,0xE2,0x77,0x14,0x64,0x46, + + 0xC6,0x9A,0x94,0x54,0x15,0x15,0x1C,0xB2,0x29,0x55,0xB1,0xF2,0x53,0xB7,0x6F,0xC2, + + 0x05,0x90,0x85,0x83,0x7A,0x36,0x0D,0xC4,0x07,0xD9,0xAB,0x33,0xFA,0x9E,0x0D,0x93, + + 0x45,0x4A,0xD7,0x35,0x35,0xB4,0x05,0x71,0xE2,0xF3,0xA1,0x3C,0xF1,0x9C,0xE7,0xA7, + + 0x2A,0x03,0x66,0x77,0x39,0xFA,0x99,0xC4,0xB1,0x9A,0xD1,0x55,0x6E,0xB5,0x74,0x43, + + 0x11,0x86,0x71,0xFC,0x5D,0xA3,0xC8,0xC5,0xCE,0x52,0xE1,0x34,0x7C,0x39,0x87,0xE9, + + 0x8F,0x18,0xFC,0xB0,0xBA,0x21,0xEB,0xD8,0xEA,0x41,0xD4,0x55,0x71,0xB8,0x97,0x70, + + 0x8E,0x5B,0xD6,0x6F,0x3D,0xF4,0xFE,0x97,0xEB,0x40,0xDF,0xF5,0x17,0x70,0x1E,0xED, + + 0xD3,0x93,0xB3,0x2C,0xBC,0xBF,0x4E,0xBA,0x66,0xD3,0xDF,0x6A,0x11,0x07,0x64,0xDE, + + 0x8C,0x9B,0x6B,0x3C,0xBD,0xBE,0x74,0xF8,0xCC,0xDB,0xA0,0x6A,0x79,0x56,0x07,0x8A, + + 0x2A,0x93,0xA0,0x2D,0x3C,0xBD,0x17,0xAF,0x6E,0xD3,0x37,0x1F,0xA1,0xBC,0x67,0x7E, + + 0x4E,0x90,0x79,0x3D,0x9B,0x32,0xF7,0x2F,0x8C,0xBF,0x2A,0xDB,0xFF,0xFF,0x3A,0xF3, + + 0x6C,0x1B,0xE6,0xDC,0x9F,0xA6,0x05,0x11,0x61,0xBF,0xB7,0xA0,0x2B,0xCB,0xF0,0xE3, + + 0x69,0xAC,0xB6,0xD9,0xDB,0x7B,0x43,0x3E,0x47,0xDA,0xA0,0x5A,0xD0,0x6C,0x1C,0xE7, + + 0xB3,0xC8,0x83,0xC5,0xCD,0x4E,0xAA,0x90,0xF0,0x00,0xB9,0x47,0x69,0x6E,0x1F,0x56, + + 0x4B,0xD9,0x65,0x87,0xD1,0x2B,0xF4,0x71,0xC5,0x62,0x24,0x77,0x70,0x21,0xBB,0x67, + + 0xA3,0x66,0xC5,0xC0,0x5A,0x07,0xD3,0x93,0x29,0xE9,0xA8,0x8C,0x6B,0x29,0xFF,0x79, + + 0xFE,0x66,0x97,0x73,0x91,0xE9,0x62,0x9F,0x38,0xBA,0x64,0x33,0x5D,0x6A,0xBC,0x0F, + + 0x77,0x5A,0xA1,0x13,0x18,0x64,0x49,0x93,0x82,0xB9,0xC9,0x71,0xE9,0xB2,0x2F,0x33, + + 0x74,0xFA,0xAD,0xD1,0xE0,0x3B,0x99,0x98,0x2E,0xEA,0x49,0x07,0x28,0x25,0x0A,0x0C, + + 0x20,0x11,0x00,0x7F,0x43,0x81,0xD8,0x5B,0x2C,0x41,0xCD,0x74,0xA4,0xA3,0x74,0x1E, + + 0xE8,0x8A,0x97,0x7A,0xE2,0xA8,0x22,0xC7,0xA0,0x58,0x1E,0xDE,0xDA,0x64,0x59,0x8F, + + 0xE0,0xAB,0xC8,0x6D,0xE6,0x31,0x55,0x5A,0xF0,0xEB,0xE8,0xD6,0x2F,0x28,0xBA,0xEA, + + 0x05,0x06,0x57,0xF7,0xFA,0xD4,0xCF,0xC7,0xAA,0x9B,0x66,0xFF,0x78,0x34,0x55,0xB3, + + 0xFF,0x9F,0x02,0x5C,0x25,0xA1,0x99,0xF8,0xB5,0xE1,0x8D,0x52,0xFB,0xC7,0xB5,0x22, + + 0x0D,0x96,0x71,0xEC,0x13,0x3F,0x59,0x6B,0x10,0xE6,0xA2,0x94,0x57,0xB1,0x38,0x32, + + 0xE2,0x03,0x54,0xA5,0x10,0x61,0x1C,0x2E,0x14,0x44,0xAB,0x78,0x3A,0xBB,0x2B,0xA7, + + 0x27,0x02,0x33,0xDF,0x1B,0x97,0x61,0x96,0xB0,0x6F,0x77,0xF8,0x0E,0x0D,0x84,0xA1, + + 0x67,0xBD,0xDB,0x88,0x36,0x90,0x00,0x74,0x66,0xEB,0xCA,0x5E,0x8B,0xAF,0x32,0xB8, + + 0x27,0x8A,0x1A,0x67,0x5D,0x2A,0x3A,0x84,0x76,0xF5,0xA4,0x5B,0xF2,0x7C,0x10,0xB0, + + 0x01,0xED,0xE2,0x75,0xF0,0x93,0x0C,0x51,0xE8,0x5D,0x55,0xA0,0x53,0x7C,0x6D,0x6B, + + 0x0D,0x1E,0x90,0xF3,0xF1,0x7C,0x8F,0x7C,0x29,0xF2,0x64,0x77,0x50,0x4C,0x32,0xC0, + + 0x22,0x14,0x00,0x41,0x3C,0xBE,0x99,0xA7,0xBC,0x5E,0x53,0x9B,0xF2,0x9B,0x8C,0xC1, + + 0xC9,0x15,0x95,0x56,0x96,0xEA,0x81,0xF1,0x82,0xEA,0xE2,0xF9,0xAF,0x7A,0x45,0x43, + + 0x67,0x30,0xC1,0x65,0x13,0xB4,0x56,0xF2,0xFD,0x9D,0x8C,0x6D,0x57,0x89,0x4D,0xD1, + + 0xA3,0x9A,0xCC,0xB3,0x4C,0x5B,0x82,0xF0,0xE5,0x6C,0xEF,0x0A,0xC0,0x57,0x79,0x60, + + 0xAE,0xD5,0x3E,0xCB,0xFA,0x98,0x5D,0xBB,0x00,0xE2,0xFE,0xCE,0xFA,0xB4,0x54,0x9A, + + 0x9A,0x84,0x88,0xB5,0xD0,0x08,0x47,0xC1,0x98,0x16,0xFE,0xEA,0xA9,0x74,0xFA,0xCE, + + 0x51,0x6C,0xCF,0x09,0xF0,0xFB,0x77,0xFE,0x1D,0x55,0xF3,0x29,0x8B,0x75,0x15,0x9B, + + 0x3B,0x11,0x97,0x99,0xB1,0x78,0x1E,0xC2,0x4E,0xD6,0x89,0x85,0x5A,0x7D,0x26,0x9E, + + 0xB6,0x13,0x9F,0x28,0x9F,0xCA,0xE8,0xF9,0x01,0x74,0x2E,0x04,0x32,0x31,0x10,0xAB, + + 0x40,0x73,0x76,0x42,0x21,0x52,0x9E,0x00,0xB6,0x46,0x5B,0x9A,0xF4,0xFB,0xF3,0x2B, + + 0x62,0x84,0x9A,0x4E,0x15,0x2C,0x1A,0x6B,0x2F,0xEA,0x40,0x0B,0x1B,0xD1,0x29,0x00, + + 0xA8,0xB4,0x5F,0xAF,0x50,0x9E,0x5A,0x7D,0xA3,0x7C,0xC5,0xBD,0xE1,0x32,0x78,0x06, + + 0x2C,0x09,0x58,0x41,0xE9,0x26,0xF0,0xDA,0x86,0x82,0xD8,0x44,0xEF,0xEE,0x50,0x20, + + 0xCD,0x8E,0xCA,0x14,0x16,0xF1,0x2C,0xE6,0xAC,0x60,0x78,0xCE,0xF6,0xE7,0x1F,0x32, + + 0x4C,0x8B,0x5E,0x79,0xF5,0xA6,0x6A,0xEC,0xC5,0x82,0x89,0xA5,0x11,0x56,0x38,0xE0, + + 0xBD,0x0E,0xF0,0x6B,0x30,0x5C,0x21,0xA3,0x48,0x6E,0x13,0xB4,0xD3,0x58,0x9F,0x85, + + 0x98,0x59,0xD8,0xB9,0xD7,0xC6,0xC7,0x02,0x40,0xFF,0x99,0x8D,0xA9,0xA6,0xD1,0x0C, + + 0xDA,0xF8,0xD0,0xC6,0x24,0x71,0x7E,0x86,0xC7,0x22,0xFF,0xCD,0x91,0x88,0x80,0x03, + + 0xC2,0x5A,0x25,0x97,0x9A,0xA5,0xCF,0x70,0x9D,0x6D,0xAE,0x59,0x2B,0xE9,0xC6,0x20, + + 0xB3,0x26,0x51,0xAD,0x87,0xEA,0x47,0xBF,0xE6,0xB7,0x69,0x31,0xD3,0xA7,0x5C,0x3E, + + 0xE5,0x49,0xF8,0xEB,0x64,0xB7,0x27,0xB9,0x6D,0x37,0xEC,0x6C,0xFD,0xD5,0xAA,0x3B, + + 0x6C,0xCB,0x6A,0x0F,0x5C,0x22,0xFA,0xC2,0xD9,0x8B,0x82,0x51,0xDC,0xE4,0x8F,0x98, + + 0xAD,0x82,0x1C,0xE9,0xAF,0xF0,0x0D,0x03,0x0E,0xCA,0x9B,0x4D,0x69,0xE6,0x74,0x73, + + 0x2C,0x82,0xCC,0x2E,0xF1,0xE9,0x60,0xF4,0xCC,0x8B,0x7B,0xC6,0x8C,0x1E,0x3C,0xB9, + + 0x65,0xB1,0x9D,0x09,0x2D,0xA7,0x0C,0x9E,0x71,0x33,0xB3,0x6E,0x7C,0xBC,0xEA,0xB3, + + 0x36,0x8B,0x16,0xD6,0xBA,0x3B,0xBA,0x93,0xA2,0x60,0x79,0x78,0x7B,0x40,0x75,0xBF, + + 0x65,0x45,0x5B,0xD4,0xA5,0x5A,0x49,0x90,0xB1,0x31,0xF5,0x29,0xCA,0xAC,0xC1,0x40, + + 0x89,0x2F,0xAE,0xB8,0x62,0x23,0x63,0xEB,0x30,0x62,0x7E,0x9F,0x97,0xAD,0xA4,0xA3, + + 0x63,0x3D,0xA2,0xAE,0x3C,0xF3,0x6D,0x21,0x83,0x25,0x1E,0xA9,0xD5,0x53,0x34,0x8A, + + 0x46,0xD3,0x3C,0x88,0x09,0x45,0xF7,0xCE,0x63,0x43,0xA9,0xAD,0x41,0xCD,0x3D,0x13, + + 0xCD,0x53,0xA3,0xB6,0xBC,0xC2,0x20,0x9D,0xD4,0x90,0x20,0x45,0xD0,0x06,0xED,0x6B, + + 0x67,0xD1,0xBE,0x50,0x5C,0x22,0x3B,0x5B,0x9C,0x9E,0x00,0xFC,0xF3,0x48,0x42,0x0E, + + 0x41,0x39,0xBD,0xAF,0x93,0x4B,0x14,0xB4,0xBE,0x96,0xE6,0x7C,0xD1,0xEF,0x24,0x96, + + 0x21,0x2E,0xA4,0x57,0x54,0xDE,0x5B,0x76,0x14,0xC9,0xA5,0xF6,0xD2,0x75,0xBF,0x04, + + 0x6C,0xEC,0xDB,0xF6,0x3B,0x40,0x2A,0xC4,0x64,0x1A,0xD1,0x17,0xFE,0xB9,0x7F,0x57, + + 0xD4,0xC3,0xFB,0xE6,0x04,0xFA,0xBD,0xE3,0xD8,0x5A,0x05,0x91,0x78,0x71,0x7D,0x45, + + 0x2D,0xD8,0xC4,0x8E,0xD5,0xC9,0xCD,0xA2,0xC9,0x27,0xA4,0xF5,0x81,0x44,0x6C,0xEB, + + 0x45,0x90,0xF0,0xB3,0x6D,0x12,0xF3,0xCB,0x7A,0xD2,0x41,0xC4,0x7B,0x62,0x33,0x5F, + + 0x45,0x40,0xC5,0x97,0xBD,0x7A,0xBC,0xCB,0xB3,0x77,0xCC,0xD4,0x94,0xF7,0x6D,0x67, + + 0xAD,0x36,0xBC,0x9F,0x3F,0x77,0xBE,0xFC,0x04,0x61,0xDF,0x99,0x10,0x99,0x9D,0xED, + + 0x8F,0x63,0xFE,0xDF,0xC2,0x1D,0xE1,0x02,0xB2,0x93,0xDF,0xAE,0x66,0x77,0x30,0xAB, + + 0x74,0x96,0xF8,0xDC,0xD6,0xBB,0x86,0x78,0xAA,0xFB,0xC4,0x16,0xF7,0xB2,0xA7,0x22, + + 0x97,0x33,0x27,0x2E,0x82,0x1E,0xCC,0x5B,0xE6,0xCC,0xDE,0x09,0x7E,0x7E,0xFA,0xA8, + + 0xFC,0x96,0x42,0xA2,0xDC,0x40,0xBF,0x03,0x32,0xC4,0xA6,0xE6,0x5A,0x78,0x80,0x15, + + 0xE1,0x1B,0xDE,0xE6,0x14,0xA5,0x05,0x1D,0xAB,0x04,0xA9,0x00,0xBB,0x04,0xF0,0xF8, + + 0x87,0xCC,0xEF,0x29,0xFA,0x65,0xBC,0x14,0xB6,0xBC,0x67,0x4E,0x27,0xBE,0x86,0xE7, + + 0xB3,0xB2,0x93,0xBC,0xB4,0xA9,0x2B,0x91,0x7C,0xED,0xA9,0xDD,0xD0,0x93,0xF6,0xD6, + + 0xB2,0x1A,0xB3,0xA5,0x00,0x8C,0x0F,0x53,0x3E,0x9E,0x09,0xB7,0x1C,0xDF,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xBA,0x97, + + 0x6B,0x0C,0x26,0x28,0xF3,0x4C,0xC6,0xD6,0x2B,0x4A,0xAA,0xB7,0xDA,0x84,0x10,0x1A, + + 0xC3,0x06,0xF5,0x63,0x71,0x24,0xEF,0x84,0xA2,0x2D,0xFA,0x6B,0x96,0x64,0x7D,0xEB, + + 0x9A,0x47,0xBB,0xF7,0x34,0x27,0x84,0xDA,0x4C,0xC1,0xB8,0x4F,0x0A,0x2B,0x43,0x99, + + 0xBA,0x4F,0x99,0x96,0x72,0x6F,0x23,0x1D,0x22,0x2F,0xFC,0xBF,0x14,0xA5,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x5D,0x80, + + 0x85,0xCF,0x14,0xFB,0x58,0x3D,0x6A,0xA6,0x81,0xD3,0x94,0xA4,0x70,0x70,0x6C,0xDA, + + 0xF9,0x1C,0xB6,0x24,0xFC,0x70,0xE1,0xFE,0x94,0x0D,0x9C,0xB4,0x71,0x71,0xE9,0x1E, + + 0xA1,0x80,0x97,0x53,0x5B,0x76,0x3C,0x52,0x6C,0x13,0x95,0xA5,0xF0,0x72,0x0F,0x6E, + + 0x54,0x7D,0x3E,0xB8,0x4D,0xA2,0x27,0x5A,0x52,0x5E,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xE1,0xC8, + + 0x22,0x1E,0x2B,0xF3,0xA5,0x64,0x6D,0x8F,0xC9,0xE7,0x96,0xAC,0x78,0x78,0x8B,0x38, + + 0x0D,0x79,0xF7,0xB8,0x52,0x36,0x26,0x47,0x4D,0x86,0x9E,0xBC,0x79,0x79,0x23,0xC4, + + 0x09,0x11,0x3C,0xC3,0x59,0x05,0xA3,0xCB,0x1F,0x3F,0x97,0xAD,0xF8,0x7A,0x5F,0xB8, + + 0xE1,0xE0,0x0F,0xAF,0xD9,0x88,0xAB,0xDB,0x66,0xED,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x98,0xFD, + + 0x37,0xFB,0x9A,0xB6,0x85,0xE1,0x08,0xD8,0xE8,0xCD,0x88,0xBC,0x70,0xA2,0x32,0x10, + + 0xCF,0x8E,0x9F,0x76,0x66,0xA1,0x2A,0xA1,0xAE,0x85,0x1D,0x54,0xA2,0x84,0x99,0x9C, + + 0x96,0xCF,0x16,0xF6,0xE3,0xA2,0x4E,0x5C,0xAC,0xCF,0xB7,0xBC,0x56,0x2E,0x21,0x06, + + 0x64,0x98,0x69,0x13,0x08,0x5E,0x03,0x83,0x54,0x6C,0x81,0x13,0xB6,0x7E,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0xEC, + + 0xF3,0x8C,0xB4,0xFA,0xE3,0x35,0x96,0x50,0xEF,0xAD,0xA5,0xDD,0xD8,0x65,0x72,0x36, + + 0x8F,0x65,0x92,0x2E,0xCC,0x06,0xE6,0x17,0xFE,0x84,0x2A,0x3E,0x5D,0xE9,0x30,0xE3, + + 0xD0,0xC7,0x70,0x2B,0x61,0x0B,0x0C,0xC9,0xE8,0x41,0xE1,0x79,0x37,0x8E,0x13,0x79, + + 0xCD,0x74,0x0B,0x6D,0xFF,0x47,0xC4,0xCB,0x7B,0x9A,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0xA4,0x06, + + 0x71,0xA7,0x34,0x77,0x97,0xF0,0x0F,0xD2,0xE4,0xCF,0xB4,0xA6,0x74,0xF0,0x29,0x82, + + 0xC4,0x8A,0xF6,0x6C,0x5D,0x80,0xAC,0xD0,0x92,0xB4,0xBC,0xB6,0x75,0xF1,0x75,0x9E, + + 0xE8,0x91,0x97,0xB7,0xEA,0xF3,0x8E,0xD3,0x64,0xC4,0xB5,0xA7,0xF4,0xF2,0x2D,0x75, + + 0x81,0x6E,0xD3,0x91,0xD6,0x44,0x05,0x5B,0xA9,0x92,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x78,0x68, + + 0x28,0x1D,0xF0,0xA6,0xD7,0xDC,0x4F,0xC5,0x10,0x27,0xB6,0xAE,0x7C,0xF8,0x10,0x78, + + 0x4F,0xEC,0x96,0x75,0x91,0xB4,0x69,0x41,0xDC,0x4A,0xBE,0xBE,0x7D,0xF9,0x35,0x2E, + + 0x47,0xDE,0x37,0xED,0x0F,0xDF,0x8E,0x17,0x1B,0xE7,0xB7,0xAF,0xFC,0xFA,0x51,0x9C, + + 0x89,0x10,0x56,0xB8,0x1C,0xC4,0x44,0xBF,0xA5,0x6D,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xEB,0x12,0x80,0x05, + + 0x76,0x8D,0xDE,0x85,0xB1,0x8B,0x52,0x92,0x14,0x40,0xCE,0xA1,0x58,0xCB,0xAC,0x72, + + 0x40,0x81,0x90,0xE5,0x5B,0x21,0x24,0xB2,0x41,0xA7,0xC6,0xB5,0xD3,0xCA,0x7F,0x19, + + 0x02,0x2A,0x41,0x05,0xFB,0xA0,0x19,0x24,0xC4,0x62,0x90,0x05,0x50,0x48,0x71,0xEC, + + 0xC1,0x41,0xD7,0x1D,0xB1,0x88,0x47,0xD3,0xCD,0xC6,0x59,0x35,0xBA,0xE1,0x7E,0x48, + + 0xC0,0x06,0x3F,0xBA,0x14,0xE4,0x46,0xF1,0xA9,0xE6,0xF9,0x23,0x7C,0xE8,0xFB,0xC0, + + 0x05,0xA5,0x08,0x40,0x82,0xA8,0x1A,0x03,0x5F,0x4C,0xF1,0x73,0x52,0xE5,0x49,0xC5, + + 0x7E,0xA4,0xD4,0xC1,0xD6,0xBB,0xEA,0xD0,0x80,0xE9,0x9B,0x78,0x93,0x67,0x05,0x23, + + 0xEB,0xA5,0x36,0xD1,0xD7,0xD2,0x2F,0xF3,0xCA,0x3A,0xA3,0xA1,0x53,0x47,0x80,0x6A, + + 0x73,0xDA,0x87,0x0C,0x9A,0x20,0x3C,0x2F,0x20,0x47,0x82,0xDD,0x12,0x68,0x7A,0x5E, + + 0xF5,0x4B,0xEA,0x5C,0x0C,0x26,0x1A,0x7B,0x4D,0x49,0x9B,0x1C,0xD9,0xA8,0xDC,0x08, + + 0x8E,0x8A,0x0E,0xFD,0x90,0x25,0x3D,0x2E,0xE7,0x0A,0xCD,0xA8,0xD0,0xC1,0x89,0x63, + + 0x0B,0x23,0x0B,0x1C,0x30,0x80,0xF1,0x3D,0xC9,0xE4,0xC5,0xBC,0x5B,0xC0,0xBD,0x3B, + + 0x48,0x8F,0x02,0x5D,0x8D,0x6E,0x08,0x75,0xE9,0x4A,0x58,0x9A,0x85,0xE1,0x74,0x54, + + 0x6A,0xED,0xB5,0xA6,0xE4,0xF2,0xDA,0x9A,0xEA,0xB2,0xD8,0x74,0x59,0x6C,0x03,0xB7, + + 0x0A,0x5E,0x41,0xF7,0x7B,0x51,0x5F,0x07,0x6B,0xC6,0xF3,0x60,0xD2,0x2E,0x53,0x4C, + + 0x77,0xAD,0x0B,0x4D,0xB1,0xA2,0x11,0x78,0x28,0xC5,0xD3,0x7F,0x59,0x8F,0xBF,0xE2, + + 0x61,0x50,0x03,0x75,0x3A,0x36,0xBA,0x51,0x6A,0x5C,0x95,0x84,0x1B,0x40,0x74,0xE3, + + 0x71,0x18,0xCE,0x1E,0x5A,0x93,0x62,0x20,0x8A,0xF3,0xD8,0x36,0x1A,0x33,0x7D,0xE3, + + 0xE3,0xCD,0xDB,0x01,0xB0,0x99,0x4B,0x25,0xE0,0xDF,0x95,0xA7,0xB2,0xD9,0x4C,0x6C, + + 0xC7,0x51,0x8D,0x64,0xA1,0x23,0x43,0xB9,0xC1,0xFC,0x9D,0x44,0xB3,0x7D,0x3A,0xCD, + + 0xAD,0xB9,0x04,0xD0,0xC3,0x2F,0x6C,0xB0,0x66,0x5B,0xEE,0x63,0xDE,0x2B,0x4D,0x42, + + 0x23,0x1D,0xB3,0x56,0xB3,0x35,0x26,0x20,0x6B,0x8A,0xE6,0x73,0xDF,0x69,0x40,0x53, + + 0x22,0xBB,0x3A,0xB7,0x55,0x28,0x6D,0x1E,0xA1,0x76,0xEF,0x62,0x5E,0x69,0x09,0x20, + + 0xB7,0x13,0x12,0xD5,0xC4,0x3D,0xE2,0x21,0x14,0x8F,0xF3,0xF3,0x62,0x2B,0x84,0x62, + + 0x57,0x10,0xD8,0x85,0x38,0x78,0x13,0x2A,0x69,0x20,0xC8,0x3D,0x78,0xF5,0x70,0x1A, + + 0x28,0xFE,0xEE,0x6D,0x3F,0x39,0x26,0x49,0x6F,0x59,0xDE,0x4F,0x61,0x7F,0xDC,0x8D, + + 0xAE,0xBA,0x83,0xEE,0xD3,0x18,0x37,0x3D,0x83,0x78,0xE9,0x28,0x93,0x6A,0x55,0x98, + + 0x0A,0xB4,0xD1,0x0D,0x19,0x90,0x41,0x29,0xC9,0xF0,0x97,0xF0,0x9A,0x1B,0x1C,0xCA, + + 0x42,0x2C,0xFC,0x2E,0x96,0xC2,0x2E,0x19,0x3A,0x7C,0xF8,0xEB,0xEF,0x73,0x18,0xD0, + + 0xC0,0x0D,0xFE,0x62,0x50,0x09,0x26,0x8B,0x3B,0x56,0xF7,0xB2,0xB2,0x19,0x39,0xC0, + + 0xC9,0xE1,0xBC,0x13,0x0D,0x95,0x37,0x29,0x24,0xD3,0x63,0xA7,0x33,0x3A,0x6F,0xCD, + + 0x63,0x2F,0xCF,0x2C,0x33,0xC0,0x24,0x99,0xBC,0x54,0x76,0x22,0x42,0xA1,0x9D,0xF2, + + 0x58,0x8F,0xE4,0x84,0x7F,0xE2,0xB0,0x23,0x44,0x80,0x70,0x26,0x3F,0x62,0x22,0x16, + + 0xA6,0x8C,0xF6,0x87,0x15,0x0A,0x68,0x36,0x4D,0xE9,0xE6,0xB3,0x5D,0x4A,0x41,0x42, + + 0x31,0x8F,0xA1,0xF6,0xD6,0xA6,0x35,0xBE,0xC0,0xE2,0xB9,0xD6,0x9E,0xE2,0xD6,0xC3, + + 0x8D,0x0C,0xA8,0x97,0x15,0xA2,0xB9,0x32,0x82,0x83,0xB8,0x17,0x55,0xA1,0xD3,0xD2, + + 0x00,0x24,0x1D,0xBD,0xE5,0x5B,0x74,0x9C,0xBB,0x4E,0xF2,0x14,0x21,0xC4,0x32,0x4F, + + 0xA4,0x83,0xD2,0xB9,0xEC,0x3A,0xF0,0x4E,0xA6,0xCA,0x07,0xA6,0x29,0xE6,0x2D,0xC1, + + 0x8F,0xFB,0x1A,0xC3,0x9A,0xCB,0x8A,0x3F,0x65,0xC0,0x15,0x07,0x24,0x83,0x65,0x3D, + + 0x26,0x0F,0x16,0xA9,0x91,0x27,0x19,0x33,0xDA,0x4C,0xC7,0x7E,0x94,0x15,0x68,0x0B, + + 0xFB,0x75,0xFC,0x8F,0x9E,0x03,0x36,0x5A,0x48,0xE8,0xEC,0xAF,0xDE,0x43,0x4A,0x5B, + + 0xF0,0x02,0xCA,0xEF,0x57,0xA9,0xBA,0x3B,0x9F,0x89,0xA2,0xCF,0x17,0xE9,0x69,0xF5, + + 0xD9,0x85,0x63,0x0F,0xF7,0x28,0x6D,0x2F,0xC4,0xDE,0x73,0x2F,0xB7,0x68,0xAC,0xF9, + + 0x0F,0xA3,0xF5,0x17,0x8D,0xAF,0x3F,0x99,0xC9,0xEB,0xE5,0xBA,0xD5,0x40,0xE2,0xA8, + + 0xAF,0x73,0x3A,0x3C,0xE1,0x73,0xF6,0x88,0xCC,0xC4,0x09,0x1C,0xD0,0x89,0x6E,0xA4, + + 0xF2,0x07,0x68,0xDE,0x19,0x6D,0x76,0x05,0x2C,0x3D,0xB0,0x3C,0x37,0xE0,0x29,0x4A, + + 0x6D,0x04,0x23,0x5E,0x95,0xEC,0xFA,0x19,0x6D,0xC8,0xEB,0x6E,0x8A,0x12,0x90,0x07, + + 0x2C,0x02,0x63,0x7B,0x1A,0x5A,0x03,0xF9,0xC6,0x12,0xE3,0x55,0xDE,0xF8,0x55,0x44, + + 0xD4,0xDE,0xE2,0x86,0xB4,0xD3,0x72,0xA2,0x0F,0xC0,0xCC,0x24,0x7D,0x8D,0x76,0x93, + + 0x86,0x97,0x6C,0x96,0x5E,0x33,0x5C,0xF2,0x78,0x5C,0xB0,0xD8,0xD4,0x79,0x92,0x01, + + 0xA1,0x63,0xFB,0x06,0x36,0x19,0x25,0x52,0xFC,0xD2,0xEF,0xBA,0x57,0xF4,0xA5,0xAF, + + 0x06,0x95,0x85,0x66,0xFF,0xB3,0x45,0x31,0xE4,0x8B,0x3D,0x55,0x54,0x0C,0xE5,0x33, + + 0x3A,0xB4,0x64,0xC3,0xE0,0xF4,0x3F,0x0D,0x9D,0x2B,0x4A,0xE4,0x80,0x20,0x5F,0x42, + + 0xDB,0xD7,0x58,0x3C,0xD6,0xD3,0xBC,0xE6,0x44,0x97,0x7B,0xED,0x75,0xBB,0xD0,0xCF, + + 0x5E,0x34,0xE5,0xC2,0x57,0xD0,0x8E,0x67,0xA2,0x58,0xF2,0xF8,0xA2,0x62,0xDE,0x52, + + 0xA1,0x17,0x59,0x97,0xBB,0x78,0x7B,0x0A,0x98,0x87,0x8B,0xB1,0x51,0xBB,0x6E,0x1D, + + 0x8D,0x91,0xF8,0x86,0x3E,0xBC,0x34,0x48,0x68,0xF8,0xFC,0xAF,0x9F,0x72,0x16,0x69, + + 0x39,0x14,0xF0,0x1A,0x3D,0x34,0x60,0x3E,0x6D,0x72,0x45,0xE2,0xDE,0x97,0xDE,0x09, + + 0xAF,0x7C,0xA8,0x7E,0xB6,0xBC,0x0B,0x5A,0xE6,0xD6,0xB3,0x51,0x01,0x70,0x51,0x1E, + + 0x44,0xCB,0xD1,0x0F,0x56,0x19,0x7D,0xFB,0x6D,0xEB,0x81,0xB6,0x3F,0xFB,0xBE,0xF5, + + 0x3A,0x47,0xC6,0xCF,0x99,0xAC,0xB6,0xFE,0x79,0x9E,0x82,0x13,0x40,0xBE,0x10,0x5E, + + 0xDA,0x3E,0xD4,0x59,0x93,0xA2,0x7E,0x7E,0x2B,0x79,0x3E,0xEA,0x83,0x08,0x67,0xB4, + + 0xC6,0xDC,0x08,0x3D,0x3E,0x8F,0xF5,0x65,0xE8,0xDE,0x75,0xD0,0x02,0x9C,0x2B,0x28, + + 0xA5,0x62,0xA5,0xCA,0xDF,0x2F,0xBF,0xEA,0x3D,0x52,0xF8,0x7B,0xBB,0x0A,0xB7,0x1C, + + 0x06,0xC0,0x24,0x66,0x33,0x40,0x63,0x66,0xEA,0xBB,0x94,0x63,0xD2,0x68,0x78,0x56, + + 0xA3,0xFF,0x68,0x1C,0x33,0x31,0xAF,0xB5,0x47,0x81,0xBE,0xEF,0x05,0xC5,0xB6,0xFC, + + 0x90,0x4C,0x6D,0x07,0x98,0x4E,0x91,0xA5,0x84,0xB7,0xA0,0x47,0x3B,0xD2,0xF0,0x57, + + 0x6B,0xA7,0x8C,0x06,0xDF,0x67,0xAE,0x0E,0x9D,0x01,0x72,0x28,0x19,0x9D,0x38,0x22, + + 0x41,0xF4,0x2F,0x36,0xB1,0x65,0xE3,0x79,0xBE,0x94,0xD0,0x64,0x52,0x64,0x40,0xE2, + + 0xF6,0x0A,0xB0,0x73,0x37,0x25,0x5C,0x37,0xC1,0x4D,0xD8,0x74,0x53,0x65,0x4B,0x01, + + 0x21,0x00,0xC5,0x65,0x92,0x26,0xC1,0xA6,0xC0,0xB3,0xD1,0x65,0xD2,0x66,0xFD,0x2E, + + 0x20,0x46,0xC9,0x55,0x93,0x27,0xEB,0x13,0x28,0xF7,0xD9,0x75,0xD3,0x67,0x42,0x0E, + + 0xC0,0xF8,0xA4,0x98,0x94,0xA3,0x90,0x17,0xB4,0x4A,0xD2,0xAA,0xA4,0x9D,0x08,0xDE, + + 0xAB,0x4C,0x71,0x3A,0x09,0xA4,0x99,0x3E,0x81,0xF9,0x19,0x06,0x01,0x28,0xA7,0xF5, + + 0x08,0xF1,0x87,0xEF,0x9E,0xEA,0xD3,0x3D,0x34,0xEE,0xD3,0x13,0x84,0xDF,0x79,0xBC, + + 0x2D,0xEC,0x5F,0xE2,0x1A,0x25,0xBF,0x5B,0x65,0xB4,0x77,0xBD,0x25,0x4B,0xAA,0xFB, + + 0x8F,0x4B,0xC2,0x4C,0x1A,0x2C,0x74,0xB7,0x1E,0x0A,0xD2,0x6C,0x5A,0x6C,0x3E,0xA5, + + 0x2A,0x4F,0xCA,0x5C,0x1B,0x2D,0xD9,0x5C,0xC4,0x4F,0xDA,0x7C,0x5B,0x6D,0x83,0x5D, + + 0x78,0x42,0xC3,0x4D,0x9A,0x2E,0xE4,0x57,0x92,0xBB,0xD3,0x6D,0xDA,0x6E,0xC9,0x66, + + 0x0E,0x08,0xCB,0x5D,0x9B,0x2F,0xEC,0x78,0x46,0x49,0xDB,0x7D,0xDB,0x6F,0x80,0x04, + + 0x64,0xE5,0x0C,0x86,0xC5,0x3F,0x74,0xE4,0x6F,0x5D,0xBC,0x66,0xF2,0x78,0xBB,0xAF, + + 0x79,0x53,0x48,0x11,0x72,0xC2,0x94,0xC8,0x80,0x5E,0xFC,0xF4,0x8A,0x7C,0x3F,0x7E, + + 0xA6,0xD2,0x31,0xFA,0x13,0x8F,0x5F,0x7E,0x43,0x54,0x7A,0x55,0xA8,0x7D,0x8F,0xAE, + + 0x5D,0xC3,0xED,0xD1,0x8C,0x3C,0x7D,0xF5,0xD8,0x5C,0xEF,0xAC,0xB1,0x88,0x3C,0xE4, + + 0xA7,0x33,0xC4,0xC4,0x32,0x34,0x94,0xF4,0x9E,0x18,0xD4,0xE4,0x72,0x74,0xFB,0x2D, + + 0x33,0x5B,0xCC,0xD4,0x33,0x35,0xF4,0x53,0x1C,0xD5,0xDC,0xF4,0x73,0x75,0x9A,0xD0, + + 0xA4,0xD6,0xC5,0xC5,0xB2,0x36,0x25,0x27,0x48,0x17,0xD5,0xE5,0xF2,0x76,0x3D,0xF7, + + 0x41,0x74,0xCD,0xD5,0xB3,0x37,0x9D,0xE5,0x1F,0x1B,0xDD,0xF5,0xF3,0x77,0xC6,0x9C, + + 0xD4,0xBC,0x16,0x92,0x60,0xCC,0xA2,0x4A,0xEA,0x10,0x92,0xAE,0x7C,0x83,0xAA,0x65, + + 0xA9,0xC2,0x7E,0x18,0x7D,0xAE,0x66,0xDA,0x2A,0xE6,0x29,0x98,0xFC,0x5E,0x47,0x8F, + + 0x60,0xEA,0x04,0x4B,0x52,0x76,0xDB,0xCB,0xAB,0x85,0x97,0x6F,0x7B,0x3C,0x0E,0x5F, + + 0x0B,0x5E,0x27,0x3E,0xC6,0x3A,0x67,0xE6,0x1C,0xA7,0x40,0xAC,0xFF,0xBB,0xEE,0x6A, + + 0xF5,0xF3,0xC6,0xCC,0x3A,0x3C,0x26,0x2E,0xC0,0x1D,0xD6,0xEC,0x7A,0x7C,0xB1,0xFC, + + 0xA9,0x15,0xCE,0xDC,0x3B,0x3D,0xF2,0xBA,0xE8,0x53,0xDE,0xFC,0x7B,0x7D,0xEF,0x6B, + + 0x2D,0x39,0xC7,0xCD,0xBA,0x3E,0xBB,0x69,0x16,0x7E,0xD7,0xED,0xFA,0x7E,0xF9,0xBB, + + 0x5C,0x19,0xCF,0xDD,0xBB,0x3F,0x37,0x7F,0x17,0x1E,0xDF,0xFD,0xFB,0x7F,0xF4,0x44, + + 0xA6,0x7E,0x40,0x39,0x30,0x1C,0xF0,0x36,0xB8,0xBE,0x1C,0xA4,0x55,0x65,0xC3,0x69, + + 0x9A,0xBC,0x2C,0xE7,0xB6,0xA3,0x4C,0xB6,0x0D,0x9F,0xD7,0x2A,0x9D,0x3F,0x5B,0x87, + + 0xC8,0x92,0x1E,0x5C,0x6D,0x28,0x48,0x65,0x66,0x8C,0x89,0xD4,0x8C,0x46,0x81,0xB1, + + 0x02,0xA4,0x9B,0xE8,0x17,0xEB,0xF9,0x27,0x54,0x82,0x3E,0x24,0x0A,0xE1,0x88,0xE1, + + 0x00,0x24,0xE0,0x46,0x16,0xA4,0x78,0x50,0xE7,0x6B,0xF0,0x66,0x56,0xE4,0xF8,0xD0, + + 0x06,0xF2,0xE8,0x56,0x17,0xA5,0x98,0x4D,0xB3,0x75,0xF8,0x76,0x57,0xE5,0x88,0xC7, + + 0xC2,0x9A,0xE1,0x47,0x96,0xA6,0x76,0x70,0x1D,0x16,0xF1,0x67,0xD6,0xE6,0x53,0xB1, + + 0x05,0x8F,0xE9,0x57,0x97,0xA7,0xCE,0x6F,0xE3,0x3A,0xF9,0x77,0xD7,0xE7,0xB2,0x14, + + 0x54,0x7C,0x82,0x6C,0xAB,0xCD,0x99,0x51,0x99,0x35,0x52,0x11,0xA0,0xEA,0x6A,0xDC, + + 0xE7,0xC5,0x13,0x4F,0xBE,0x76,0x62,0x07,0xCF,0xC1,0x89,0x27,0x79,0x87,0xA0,0x11, + + 0xD0,0x3E,0x9B,0xDF,0x41,0xD5,0x71,0x4B,0xD4,0x4A,0x00,0x32,0x24,0x3A,0xDB,0x5D, + + 0x27,0x70,0x16,0x42,0x62,0xAD,0xEF,0x49,0x6E,0x8A,0xFB,0x00,0xD5,0x87,0x93,0x28, + + 0x4D,0x53,0xE2,0x4E,0x1E,0xAC,0xAD,0x62,0x60,0x8A,0xF2,0x6E,0x5E,0xEC,0x12,0xD8, + + 0x0E,0x9A,0xEA,0x5E,0x1F,0xAD,0x0A,0xA5,0xA0,0x8C,0xFA,0x7E,0x5F,0xED,0x1B,0x29, + + 0xCD,0x7E,0xE3,0x4F,0x9E,0xAE,0x81,0xAD,0x6C,0x82,0xF3,0x6F,0xDE,0xEE,0xD0,0xB9, + + 0x23,0x72,0xEB,0x5F,0x9F,0xAF,0xD3,0xD8,0xB0,0x0F,0xFB,0x7F,0xDF,0xEF,0x56,0x27, + + 0xA1,0x97,0x64,0x92,0xC8,0x45,0xF4,0xB3,0x48,0xD6,0x03,0x5B,0x38,0xBE,0x2D,0x4D, + + 0x86,0xEF,0x1B,0x8F,0x33,0x71,0x44,0x96,0xEA,0xD3,0x45,0x70,0xD7,0xB4,0xCE,0x74, + + 0xA2,0x72,0x61,0x03,0xF0,0x47,0x3D,0x06,0x87,0xF2,0xC5,0xE1,0x56,0x0C,0x16,0xD5, + + 0x07,0xDD,0x1A,0xA8,0xE1,0xF1,0x8A,0xB2,0x68,0xDF,0xCF,0x31,0xED,0xBF,0x6C,0xF5, + + 0x87,0xF8,0xE4,0xC6,0x36,0xB4,0x14,0xA2,0x6A,0x29,0xF4,0xE6,0x76,0xF4,0xE8,0x15, + + 0xA7,0xB5,0xEC,0xD6,0x37,0xB5,0x26,0xF3,0xC4,0x94,0xFC,0xF6,0x77,0xF5,0x86,0x84, + + 0x78,0x9E,0xE5,0xC7,0xB6,0xB6,0x0D,0x61,0xE7,0x96,0xF5,0xE7,0xF6,0xF6,0xC1,0x13, + + 0x04,0xD6,0xED,0xD7,0xB7,0xB7,0x1D,0xB3,0xFA,0x5C,0xFD,0xF7,0xF7,0xF7,0x52,0xAE, + + 0xF8,0x28,0x24,0xB1,0xB9,0xBF,0x5E,0xB4,0x2A,0x2C,0xC6,0x8E,0x64,0x35,0x09,0x1A, + + 0xAA,0x3E,0x47,0x1A,0x79,0xA5,0x81,0xDA,0xDA,0x7D,0x84,0x5C,0xFF,0xF1,0x80,0x97, + + 0x7C,0x6A,0x4F,0x2C,0xBA,0x1A,0xF1,0x2F,0xA4,0xAD,0x27,0x2D,0xFD,0x1D,0x87,0x3D, + + 0xAB,0x5B,0x3F,0x58,0xBF,0x4E,0xF9,0xBD,0x25,0x19,0x4D,0xDD,0xBE,0x24,0x8A,0x4A, + + 0xD2,0xBC,0xE6,0xCE,0x3E,0xBC,0xF2,0x08,0xEC,0xD4,0xF6,0xEE,0x7E,0xFC,0x56,0x29, + + 0x77,0x39,0xEE,0xDE,0x3F,0xBD,0x1E,0xBA,0xC2,0x20,0xFE,0xFE,0x7F,0xFD,0xCB,0x49, + + 0xAF,0xCB,0xE7,0xCF,0xBE,0xBE,0xFE,0x99,0x4D,0x9F,0xF7,0xEF,0xFE,0xFE,0x80,0xC7, + + 0x29,0x6A,0xEF,0xDF,0xBF,0xBF,0x07,0xDF,0x6D,0xD7,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x90,0xAF, diff --git a/drivers/input/touchscreen/GT915L/Kconfig b/drivers/input/touchscreen/GT915L/Kconfig new file mode 100644 index 0000000000000..cc1039fb9959f --- /dev/null +++ b/drivers/input/touchscreen/GT915L/Kconfig @@ -0,0 +1,5 @@ + +config TOUCHSCREEN_GT915L + tristate "ATMEL GT915L touchpanel driver" + depends on CONFIG_INPUT_TOUCHSCREEN + default n diff --git a/drivers/input/touchscreen/GT915L/Makefile b/drivers/input/touchscreen/GT915L/Makefile new file mode 100644 index 0000000000000..c207dc3cb8502 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/Makefile @@ -0,0 +1,4 @@ +#GT915L touchpanel driver + +obj-y += gt9xx.o goodix_tool.o gt9xx_update.o + diff --git a/drivers/input/touchscreen/GT915L/goodix_tool.c b/drivers/input/touchscreen/GT915L/goodix_tool.c new file mode 100644 index 0000000000000..ca6020c4802c0 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/goodix_tool.c @@ -0,0 +1,736 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + + +#include "gt9xx.h" + +#define DATA_LENGTH_UINT 512 +#define CMD_HEAD_LENGTH (sizeof(st_cmd_head) - sizeof(u8 *)) +static char procname[20] = {0}; + +#define UPDATE_FUNCTIONS + +#ifdef UPDATE_FUNCTIONS +extern s32 gup_enter_update_mode(struct i2c_client *client); +extern void gup_leave_update_mode(void); +extern s32 gup_update_proc(void *dir); +#endif + +extern void gtp_irq_disable(struct goodix_ts_data *); +extern void gtp_irq_enable(struct goodix_ts_data *); + +#pragma pack(1) +typedef struct{ + u8 wr; + u8 flag; + u8 flag_addr[2]; + u8 flag_val; + u8 flag_relation; + u16 circle; + u8 times; + u8 retry; + u16 delay; + u16 data_len; + u8 addr_len; + u8 addr[2]; + u8 res[3]; + u8 *data; +} st_cmd_head; +#pragma pack() +st_cmd_head cmd_head; + +static struct i2c_client *gt_client; + +static struct proc_dir_entry *goodix_proc_entry; + + +static ssize_t goodix_tool_read(struct file *, char __user *, size_t, loff_t *); +static ssize_t goodix_tool_write(struct file *, const char __user *, size_t, loff_t *); +static const struct file_operations tool_ops = { + .owner = THIS_MODULE, + .read = goodix_tool_read, + .write = goodix_tool_write, +}; + +static struct class *ft_class; +#define CLASS_NAME "touchscreen" +static ssize_t goodix_sys_tool_write(struct class *class, struct class_attribute *attr, const char *buf, size_t len); +static ssize_t goodix_sys_tool_read(struct class *class, struct class_attribute *attr, char *buf); + +static CLASS_ATTR(gmnode, 0664, goodix_sys_tool_read, goodix_sys_tool_write); + + + +static s32 (*tool_i2c_read)(u8 *, u16); +static s32 (*tool_i2c_write)(u8 *, u16); + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *, s32); +#endif +s32 DATA_LENGTH = 0; +s8 IC_TYPE[16] = "GT9XX"; + +static void tool_set_proc_name(char *procname) +{ + char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", + "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + char date[20] = {0}; + char month[4] = {0}; + int i = 0, n_month = 1, n_day = 0, n_year = 0; + + + + GTP_DEBUG("compile date: %s", date); + + sscanf(date, "%s %d %d", month, &n_day, &n_year); + + for (i = 0; i < 12; ++i) { + if (!memcmp(months[i], month, 3)) { + n_month = i+1; + break; + } + } + + sprintf(procname, "gmnode%04d%02d%02d", n_year, n_month, n_day); + + +} + + +static s32 tool_i2c_read_no_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + s32 i = 0; + struct i2c_msg msgs[2]; + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = gt_client->addr; + msgs[0].len = cmd_head.addr_len; + msgs[0].buf = &buf[0]; + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = gt_client->addr; + msgs[1].len = len; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + for (i = 0; i < cmd_head.retry; i++) { + ret = i2c_transfer(gt_client->adapter, msgs, 2); + if (ret > 0) { + break; + } + } + return ret; +} + +static s32 tool_i2c_write_no_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + s32 i = 0; + struct i2c_msg msg; + + msg.flags = !I2C_M_RD; + msg.addr = gt_client->addr; + msg.len = len; + msg.buf = buf; + + for (i = 0; i < cmd_head.retry; i++) { + ret = i2c_transfer(gt_client->adapter, &msg, 1); + if (ret > 0) { + break; + } + } + return ret; +} + +static s32 tool_i2c_read_with_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_read_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static s32 tool_i2c_write_with_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_write_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static void register_i2c_func(void) +{ + + + + + if (strncmp(IC_TYPE, "GT8110", 6) && strncmp(IC_TYPE, "GT8105", 6) + && strncmp(IC_TYPE, "GT801", 5) && strncmp(IC_TYPE, "GT800", 5) + && strncmp(IC_TYPE, "GT801PLUS", 9) && strncmp(IC_TYPE, "GT811", 5) + && strncmp(IC_TYPE, "GTxxx", 5) && strncmp(IC_TYPE, "GT9XX", 5)) { + tool_i2c_read = tool_i2c_read_with_extra; + tool_i2c_write = tool_i2c_write_with_extra; + GTP_DEBUG("I2C function: with pre and end cmd!"); + } else { + tool_i2c_read = tool_i2c_read_no_extra; + tool_i2c_write = tool_i2c_write_no_extra; + GTP_INFO("I2C function: without pre and end cmd!"); + } +} + +static void unregister_i2c_func(void) +{ + tool_i2c_read = NULL; + tool_i2c_write = NULL; + GTP_INFO("I2C function: unregister i2c transfer function!"); +} + +s32 init_wr_node(struct i2c_client *client) +{ + s32 i; + s32 err; + + gt_client = client; + memset(&cmd_head, 0, sizeof(cmd_head)); + cmd_head.data = NULL; + + i = 5; + while ((!cmd_head.data) && i) { + cmd_head.data = kzalloc(i * DATA_LENGTH_UINT, GFP_KERNEL); + if (NULL != cmd_head.data) { + break; + } + i--; + } + if (i) { + DATA_LENGTH = i * DATA_LENGTH_UINT + GTP_ADDR_LENGTH; + GTP_INFO("Applied memory size:%d.", DATA_LENGTH); + } else { + GTP_ERROR("Apply for memory failed."); + return FAIL; + } + + cmd_head.addr_len = 2; + cmd_head.retry = 5; + + register_i2c_func(); + + tool_set_proc_name(procname); + goodix_proc_entry = proc_create(procname, 0666, NULL, &tool_ops); + if (goodix_proc_entry == NULL) { + GTP_ERROR("Couldn't create proc entry!"); + return FAIL; + } else { + GTP_INFO("Create proc entry success!"); + } + + ft_class = class_create(THIS_MODULE, CLASS_NAME); + if (IS_ERR(ft_class)) { + GTP_ERROR("Failed to create class.\n"); + return FAIL; + } + err = class_create_file(ft_class, &class_attr_gmnode); + if (err) { + GTP_ERROR("Failed to create class file.\n"); + } + return SUCCESS; +} + +void uninit_wr_node(void) +{ + kfree(cmd_head.data); + cmd_head.data = NULL; + unregister_i2c_func(); + remove_proc_entry(procname, NULL); +} + +static u8 relation(u8 src, u8 dst, u8 rlt) +{ + u8 ret = 0; + + switch (rlt) { + case 0: + ret = (src != dst) ? true : false; + break; + + case 1: + ret = (src == dst) ? true : false; + GTP_DEBUG("equal:src:0x%02x dst:0x%02x ret:%d.", src, dst, (s32)ret); + break; + + case 2: + ret = (src > dst) ? true : false; + break; + + case 3: + ret = (src < dst) ? true : false; + break; + + case 4: + ret = (src & dst) ? true : false; + break; + + case 5: + ret = (!(src | dst)) ? true : false; + break; + + default: + ret = false; + break; + } + + return ret; +} + +/******************************************************* +Function: + Comfirm function. +Input: + None. +Output: + Return write length. +********************************************************/ +static u8 comfirm(void) +{ + s32 i = 0; + u8 buf[32]; + + memcpy(buf, cmd_head.flag_addr, cmd_head.addr_len); + + for (i = 0; i < cmd_head.times; i++) { + if (tool_i2c_read(buf, 1) <= 0) { + GTP_ERROR("Read flag data failed!"); + return FAIL; + } + if (true == relation(buf[GTP_ADDR_LENGTH], cmd_head.flag_val, cmd_head.flag_relation)) { + GTP_DEBUG("value at flag addr:0x%02x.", buf[GTP_ADDR_LENGTH]); + GTP_DEBUG("flag value:0x%02x.", cmd_head.flag_val); + break; + } + + msleep(cmd_head.circle); + } + + if (i >= cmd_head.times) { + GTP_ERROR("Didn't get the flag to continue!"); + return FAIL; + } + + return SUCCESS; +} + +static ssize_t goodix_sys_tool_write(struct class *class, struct class_attribute *attr, const char *buf, size_t len) +{ + + GTP_DEBUG_FUNC(); + GTP_DEBUG_ARRAY((u8 *)buf, len); + + memcpy(&cmd_head, buf, CMD_HEAD_LENGTH); + + GTP_DEBUG("[Operation]wr: %02X", cmd_head.wr); + GTP_DEBUG("[Flag]flag: %02X, addr: %02X%02X, value: %02X, relation: %02X", cmd_head.flag, cmd_head.flag_addr[0], + cmd_head.flag_addr[1], cmd_head.flag_val, cmd_head.flag_relation); + GTP_DEBUG("[Retry]circle: %d, times: %d, retry: %d, delay: %d", (s32)cmd_head.circle, (s32)cmd_head.times, + (s32)cmd_head.retry, (s32)cmd_head.delay); + GTP_DEBUG("[Data]data len: %d, addr len: %d, addr: %02X%02X, buffer len: %d, data[0]: %02X", (s32)cmd_head.data_len, + (s32)cmd_head.addr_len, cmd_head.addr[0], cmd_head.addr[1], (s32)len, buf[CMD_HEAD_LENGTH]); + + if (1 == cmd_head.wr) { + memcpy(&cmd_head.data[GTP_ADDR_LENGTH], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG_ARRAY(cmd_head.data, cmd_head.data_len + cmd_head.addr_len); + GTP_DEBUG_ARRAY((u8 *)&buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[WRITE]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + + } + if (tool_i2c_write(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + cmd_head.data_len + cmd_head.addr_len) <= 0) { + GTP_ERROR("[WRITE]Write data failed!"); + return -EPERM; + } + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.data_len + cmd_head.addr_len); + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + } else if (3 == cmd_head.wr) { + memcpy(&cmd_head.data[0], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + + register_i2c_func(); + } else if (5 == cmd_head.wr) { + + } else if (7 == cmd_head.wr) { + gtp_irq_disable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_OFF); + #endif + } else if (9 == cmd_head.wr) { + gtp_irq_enable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_ON); + #endif + } else if (17 == cmd_head.wr) { + struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); + memcpy(&cmd_head.data[GTP_ADDR_LENGTH], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (cmd_head.data[GTP_ADDR_LENGTH]) { + GTP_INFO("gtp enter rawdiff."); + ts->gtp_rawdiff_mode = true; + } else { + ts->gtp_rawdiff_mode = false; + GTP_INFO("gtp leave rawdiff."); + } + } +#ifdef UPDATE_FUNCTIONS + else if (11 == cmd_head.wr) { + if (FAIL == gup_enter_update_mode(gt_client)) { + return -EPERM; + } + } else if (13 == cmd_head.wr) { + gup_leave_update_mode(); + } else if (15 == cmd_head.wr) { + show_len = 0; + total_len = 0; + memset(cmd_head.data, 0, cmd_head.data_len + 1); + memcpy(cmd_head.data, &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (FAIL == gup_update_proc((void *)cmd_head.data)) { + return -EPERM; + } + } + +#endif + + return len; +} +/******************************************************* +Function: + Goodix tool write function. +Input: + standard proc write function param. +Output: + Return write length. +********************************************************/ + +ssize_t goodix_tool_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + GTP_DEBUG_ARRAY((u8 *)buff, len); + + ret = copy_from_user(&cmd_head, buff, CMD_HEAD_LENGTH); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + + + GTP_DEBUG("[Operation]wr: %02X", cmd_head.wr); + GTP_DEBUG("[Flag]flag: %02X, addr: %02X%02X, value: %02X, relation: %02X", cmd_head.flag, cmd_head.flag_addr[0], + cmd_head.flag_addr[1], cmd_head.flag_val, cmd_head.flag_relation); + GTP_DEBUG("[Retry]circle: %d, times: %d, retry: %d, delay: %d", (s32)cmd_head.circle, (s32)cmd_head.times, + (s32)cmd_head.retry, (s32)cmd_head.delay); + GTP_DEBUG("[Data]data len: %d, addr len: %d, addr: %02X%02X, buffer len: %d, data[0]: %02X", (s32)cmd_head.data_len, + (s32)cmd_head.addr_len, cmd_head.addr[0], cmd_head.addr[1], (s32)len, buff[CMD_HEAD_LENGTH]); + + if (1 == cmd_head.wr) { + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG_ARRAY(cmd_head.data, cmd_head.data_len + cmd_head.addr_len); + GTP_DEBUG_ARRAY((u8 *)&buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[WRITE]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + + } + if (tool_i2c_write(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + cmd_head.data_len + cmd_head.addr_len) <= 0) { + GTP_ERROR("[WRITE]Write data failed!"); + return -EPERM; + } + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.data_len + cmd_head.addr_len); + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + } else if (3 == cmd_head.wr) { + ret = copy_from_user(&cmd_head.data[0], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + + register_i2c_func(); + } else if (5 == cmd_head.wr) { + + } else if (7 == cmd_head.wr) { + gtp_irq_disable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_OFF); + #endif + } else if (9 == cmd_head.wr) { + gtp_irq_enable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_ON); + #endif + } else if (17 == cmd_head.wr) { + struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_DEBUG("copy_from_user failed."); + return -EPERM; + } + if (cmd_head.data[GTP_ADDR_LENGTH]) { + GTP_INFO("gtp enter rawdiff."); + ts->gtp_rawdiff_mode = true; + } else { + ts->gtp_rawdiff_mode = false; + GTP_INFO("gtp leave rawdiff."); + } + } +#ifdef UPDATE_FUNCTIONS + else if (11 == cmd_head.wr) { + if (FAIL == gup_enter_update_mode(gt_client)) { + return -EPERM; + } + } else if (13 == cmd_head.wr) { + gup_leave_update_mode(); + } else if (15 == cmd_head.wr) { + show_len = 0; + total_len = 0; + memset(cmd_head.data, 0, cmd_head.data_len + 1); + memcpy(cmd_head.data, &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (FAIL == gup_update_proc((void *)cmd_head.data)) { + return -EPERM; + } + } + +#endif + + return len; +} +static ssize_t goodix_sys_tool_read(struct class *class, struct class_attribute *attr, char *buf) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + + if (cmd_head.wr % 2) { + return -EPERM; + } else if (!cmd_head.wr) { + u16 len = 0; + s16 data_len = 0; + u16 loc = 0; + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[READ]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + + } + + memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], cmd_head.data[1]); + GTP_DEBUG("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + + data_len = cmd_head.data_len; + + while (data_len > 0) { + if (data_len > DATA_LENGTH) { + len = DATA_LENGTH; + } else { + len = data_len; + } + data_len -= len; + + if (tool_i2c_read(cmd_head.data, len) <= 0) { + GTP_ERROR("[READ]Read data failed!"); + return -EPERM; + } + + memcpy(&buf[loc], &cmd_head.data[GTP_ADDR_LENGTH], len); + /*ret = simple_read_from_buffer(&page[loc], size, ppos, &cmd_head.data[GTP_ADDR_LENGTH], len); + if (ret < 0) { + return ret; + }*/ + loc += len; + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH], len); + GTP_DEBUG_ARRAY(buf, len); + } + return cmd_head.data_len; + } else if (2 == cmd_head.wr) { + memcpy(buf, IC_TYPE, sizeof(IC_TYPE)); + + return ret; + } else if (4 == cmd_head.wr) { + u8 progress_buf[4]; + progress_buf[0] = show_len >> 8; + progress_buf[1] = show_len & 0xff; + progress_buf[2] = total_len >> 8; + progress_buf[3] = total_len & 0xff; + memcpy(buf, progress_buf, 4); + + return ret; + } else if (6 == cmd_head.wr) { + + } else if (8 == cmd_head.wr) { + memcpy(buf, GTP_DRIVER_VERSION, strlen(GTP_DRIVER_VERSION)); + + return ret; + } + return -EPERM; +} +/******************************************************* +Function: + Goodix tool read function. +Input: + standard proc read function param. +Output: + Return read length. +********************************************************/ +ssize_t goodix_tool_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + + if (*ppos) { + + + + *ppos = 0; + return 0; + } + + if (cmd_head.wr % 2) { + return -EPERM; + } else if (!cmd_head.wr) { + u16 len = 0; + s16 data_len = 0; + u16 loc = 0; + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[READ]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + + } + + memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], cmd_head.data[1]); + GTP_DEBUG("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + + data_len = cmd_head.data_len; + + while (data_len > 0) { + if (data_len > DATA_LENGTH) { + len = DATA_LENGTH; + } else { + len = data_len; + } + data_len -= len; + + if (tool_i2c_read(cmd_head.data, len) <= 0) { + GTP_ERROR("[READ]Read data failed!"); + return -EPERM; + } + + + ret = simple_read_from_buffer(&page[loc], size, ppos, &cmd_head.data[GTP_ADDR_LENGTH], len); + if (ret < 0) { + return ret; + } + loc += len; + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH], len); + GTP_DEBUG_ARRAY(page, len); + } + return cmd_head.data_len; + } else if (2 == cmd_head.wr) { + ret = simple_read_from_buffer(page, size, ppos, IC_TYPE, sizeof(IC_TYPE)); + return ret; + } else if (4 == cmd_head.wr) { + u8 progress_buf[4]; + progress_buf[0] = show_len >> 8; + progress_buf[1] = show_len & 0xff; + progress_buf[2] = total_len >> 8; + progress_buf[3] = total_len & 0xff; + + ret = simple_read_from_buffer(page, size, ppos, progress_buf, 4); + return ret; + } else if (6 == cmd_head.wr) { + + } else if (8 == cmd_head.wr) { + ret = simple_read_from_buffer(page, size, ppos, GTP_DRIVER_VERSION, strlen(GTP_DRIVER_VERSION)); + return ret; + } + return -EPERM; +} diff --git a/drivers/input/touchscreen/GT915L/gt9xx.c b/drivers/input/touchscreen/GT915L/gt9xx.c new file mode 100644 index 0000000000000..4ec4d44338286 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/gt9xx.c @@ -0,0 +1,3495 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#include +#include "gt9xx.h" + +#if GTP_ICS_SLOT_REPORT + #include +#endif + +#if WT_ADD_CTP_INFO +#include +static char tp_string_version[40]; +static int tp_sensor_id = -1; +static u8 cfg_version; + +/*TP Color*/ +#define TP_White 0x31 +#define TP_Black 0x32 +#define TP_Golden 0x38 +#define GTP_LOCKDOWN_SIZE 8 +#define GTP_READ_LOCKDOWN_INFO_ADDR 0xC8A4 +static u8 lockdown_info[GTP_LOCKDOWN_SIZE]; +static u8 TP_Maker,LCD_Maker,Panel_Ink; +extern u8 tp_color; +static u16 IC_Version; +static int gtp_read_lockdown_info(void); +int gtp_hardwareinfo_set(void); +#endif + +static const char *goodix_ts_name = "goodix-ts"; +static const char *goodix_input_phys = "input/ts"; +static struct workqueue_struct *goodix_wq; +struct i2c_client * i2c_connect_client = NULL; +/* +int gtp_rst_gpio; +int gtp_int_gpio; +*/ +unsigned int gtp_rst_gpio; +unsigned int gtp_int_gpio; + +int gtp_ics_slot_report=0;/*use to choose report mode A or B, 0 for A and 1 for B */ + + +u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] + = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; + + +#ifdef GTP_GLOVE_MODE +u8 gtp_glove_config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] + = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; +#endif + + +#if GTP_HAVE_TOUCH_KEY + static const u16 touch_key_array[] = GTP_KEY_TAB; +#define GTP_MAX_KEY_NUM (sizeof(touch_key_array)/sizeof(touch_key_array[0])) +#define GTP_KEY_MAP_ARRAY {{175, 1500}, {387, 1500}, {582, 1500}} +struct touch_virtual_key_map_t { + int point_x; + int point_y; +}; +static struct touch_virtual_key_map_t touch_key_point_maping_array[] = GTP_KEY_MAP_ARRAY; + +#if GTP_DEBUG_ON + static const int key_codes[] = {KEY_HOME, KEY_BACK, KEY_MENU, KEY_SEARCH}; + static const char *key_names[] = {"Key_Home", "Key_Back", "Key_Menu", "Key_Search"}; +#endif + +#endif + +#ifdef PMX_DRIVER_GT915L +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" +static int goodix_ts_pinctrl_init(struct goodix_ts_data *goodix_data); +static int goodix_ts_pinctrl_select(struct goodix_ts_data *goodix_data, bool on); +#endif + +static s8 gtp_i2c_test(struct i2c_client *client); +void gtp_reset_guitar(struct i2c_client *client, s32 ms); +s32 gtp_send_cfg(struct i2c_client *client); +void gtp_int_sync(s32 ms); + +static ssize_t gt91xx_config_read_proc(struct file *, char __user *, size_t, loff_t *); +static ssize_t gt91xx_config_write_proc(struct file *, const char __user *, size_t, loff_t *); + +static struct proc_dir_entry *gt91xx_config_proc = NULL; +static const struct file_operations config_proc_ops = { + .owner = THIS_MODULE, + .read = gt91xx_config_read_proc, + .write = gt91xx_config_write_proc, +}; +static int gtp_register_powermanger(struct goodix_ts_data *ts); +static int gtp_unregister_powermanger(struct goodix_ts_data *ts); + +#if GTP_CREATE_WR_NODE +extern s32 init_wr_node(struct i2c_client*); +extern void uninit_wr_node(void); +#endif + +#if GTP_AUTO_UPDATE +extern u8 gup_init_update_proc(struct goodix_ts_data *); +#endif + +#if GTP_ESD_PROTECT +static struct delayed_work gtp_esd_check_work; +static struct workqueue_struct * gtp_esd_check_workqueue = NULL; +static void gtp_esd_check_func(struct work_struct *); +static s32 gtp_init_ext_watchdog(struct i2c_client *client); +void gtp_esd_switch(struct i2c_client *, s32); +#endif + +#if GTP_COMPATIBLE_MODE +extern s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len); +extern s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len); +extern s32 gup_clk_calibration(void); +extern s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +extern u8 gup_check_fs_mounted(char *path_name); + +void gtp_recovery_reset(struct i2c_client *client); +static s32 gtp_esd_recovery(struct i2c_client *client); +s32 gtp_fw_startup(struct i2c_client *client); +static s32 gtp_main_clk_proc(struct goodix_ts_data *ts); +static s32 gtp_bak_ref_proc(struct goodix_ts_data *ts, u8 mode); + +#endif + +#if GTP_GESTURE_WAKEUP +typedef enum { + DOZE_DISABLED = 0, + DOZE_ENABLED = 1, + DOZE_WAKEUP = 2, +}DOZE_T; +static DOZE_T doze_status = DOZE_DISABLED; +static s8 gtp_enter_doze(struct goodix_ts_data *ts); +#endif + +#ifdef GTP_CONFIG_OF +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid); +#endif + + +#if GTP_GLOVE_MODE +char gtp_glove_onoff = '0'; +static char gtp_glove_support_flag_changed = 0; +static const char gtp_glove_support_flag = GTP_GLOVE_SUPPORT_ONOFF; +s32 gtp_send_glove_cfg(struct i2c_client *client); + +static ssize_t proc_glove_onoff_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + if (0 == gtp_glove_support_flag_changed) + num = sprintf(page, "%c\n", gtp_glove_support_flag); + else + num = sprintf(page, "%c\n", gtp_glove_onoff); + *ppos += num; + return num; +} + +static ssize_t proc_glove_onoff_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer,"%c",>p_glove_onoff); + gtp_glove_support_flag_changed=1; + + if ('1' == gtp_glove_onoff) { + u8 cfg_group[] = CTP_CFG_GROUP1_GLOVE; + gtp_reset_guitar(i2c_connect_client, 50); + msleep(100); + memcpy(>p_glove_config[GTP_ADDR_LENGTH], cfg_group, GTP_CONFIG_MAX_LENGTH); + gtp_send_glove_cfg(i2c_connect_client); + } else if ('0' == gtp_glove_onoff) { + gtp_reset_guitar(i2c_connect_client, 50); + msleep(100); + gtp_send_cfg(i2c_connect_client); + } + return count; +} + +static const struct file_operations gt_glove_onoff_proc_fops = { + .write = proc_glove_onoff_write, + .read = proc_glove_onoff_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +#endif + +#if GTP_GESTURE_WAKEUP +char gtp_gesture_coordinate[60] = {0X8140 >> 8, 0X8140 & 0xFF}; +char gtp_gesture_value = 0; +char gtp_gesture_onoff = '0'; +const char gtp_gesture_type[] = GTP_GESTURE_TPYE_STR; +static const char gtp_gesture_support_flag = GTP_GESTURE_SUPPORT_ONOFF; +static const char gtp_verson[] = GTP_PROC_DRIVER_VERSION; +static char gtp_gesture_support_flag_changed = 0; +struct i2c_client *i2c_client_point = NULL; + + +static ssize_t proc_gesture_data_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + int num = 0; + if (*ppos) + return 0; + printk("proc_gesture_data_read=%d\n", gtp_gesture_value); + num = sprintf(buffer, "%c\n", gtp_gesture_value); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_data_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_value); + return count; +} + +static ssize_t proc_gesture_type_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) { + printk("%s\n",__func__); + return 0; + } + num = sprintf(buffer, "%s\n", gtp_gesture_type); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_type_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return -1; +} + +static ssize_t proc_gesture_onoff_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + if (0 == gtp_gesture_support_flag_changed) + num = sprintf(page, "%c\n", gtp_gesture_support_flag); + else + num = sprintf(page, "%c\n", gtp_gesture_onoff); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_onoff_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_onoff); + gtp_gesture_support_flag_changed = 1; + printk("in proc_gesture_onoff_write %c \n", gtp_gesture_onoff); + return count; +} + +static ssize_t proc_version_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + num = sprintf(page, "%s\n", gtp_verson); + *ppos += num; + return num; +} + +static ssize_t proc_version_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return count; +} + +static ssize_t proc_gesture_coordinate_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + if (*ppos) + return 0; + memcpy(page, gtp_gesture_coordinate, 60); + printk("GTP gtp_ges 0x%02x\n", gtp_gesture_coordinate[13]); + memset(gtp_gesture_coordinate, 0, 60); + *ppos += 60; + return 60; +} + +static ssize_t proc_gesture_coordinate_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return count; +} + +static const struct file_operations gt_gesture_var_proc_fops = { + .write = proc_gesture_data_write, + .read = proc_gesture_data_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_gesture_type_proc_fops = { + .write = proc_gesture_type_write, + .read = proc_gesture_type_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_gesture_onoff_proc_fops = { + .write = proc_gesture_onoff_write, + .read = proc_gesture_onoff_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_version_proc_fops = { + .write = proc_version_write, + .read = proc_version_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_coordinate_proc_fops = { + .write = proc_gesture_coordinate_write, + .read = proc_gesture_coordinate_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + + +void Ctp_Gesture_Fucntion_Proc_File(void) +{ + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_gesture_wakup_proc = NULL; + struct proc_dir_entry *ctp_gesture_var_proc = NULL; + struct proc_dir_entry *ctp_gesture_type_proc = NULL; + struct proc_dir_entry *ctp_gesture_onoff_proc = NULL; + struct proc_dir_entry *ctp_glove_onoff_proc = NULL; + struct proc_dir_entry *ctp_version_proc = NULL; + struct proc_dir_entry *ctp_coordinate_proc = NULL; +#define CTP_GESTURE_FUNCTION_AUTHORITY_PROC 0777 + + ctp_device_proc = proc_mkdir("touchscreen_feature", NULL); + ctp_gesture_wakup_proc = proc_mkdir("gesture", NULL); + + ctp_gesture_var_proc = proc_create("data", 0444, ctp_gesture_wakup_proc, >_gesture_var_proc_fops); + if (ctp_gesture_var_proc == NULL) { + GTP_ERROR("ctp_gesture_var_proc create failed\n"); + } + + ctp_gesture_type_proc = proc_create("gesture_type", 0444, ctp_device_proc, >_gesture_type_proc_fops); + if (ctp_gesture_type_proc == NULL) { + GTP_ERROR("ctp_gesture_type_proc create failed\n"); + } + + ctp_gesture_onoff_proc = proc_create("onoff", 0666, ctp_gesture_wakup_proc, >_gesture_onoff_proc_fops); + if (ctp_gesture_onoff_proc == NULL) { + GTP_ERROR("ctp_gesture_onoff_proc create failed\n"); + } + +#if GTP_GLOVE_MODE + ctp_glove_onoff_proc = proc_create("glove_onoff", 0666, ctp_device_proc, >_glove_onoff_proc_fops); + if (ctp_glove_onoff_proc == NULL) { + GTP_ERROR("ctp_gesture_onoff_proc create failed\n"); + } +#endif + + ctp_version_proc = proc_create("version", 0444, ctp_device_proc, >_version_proc_fops); + if (ctp_version_proc == NULL) { + GTP_ERROR("create_proc_entry version failed\n"); + } + + ctp_coordinate_proc = proc_create("gesture_coordinate", 0777, ctp_device_proc, >_coordinate_proc_fops); + if (ctp_coordinate_proc == NULL) { + GTP_ERROR("create_proc_entry version failed\n"); + } + +} + +#endif + + + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf,size_t count, loff_t *ppos) +{ + char *ptr = buf; + + if (*ppos) { + GTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + return sprintf(ptr, "%02X%02X%02X%02X%02X%02X%02X%02X\n", + lockdown_info[0], lockdown_info[1], lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], lockdown_info[6], lockdown_info[7]); +} +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -1; +} + +static const struct file_operations ctp_lockdown_procs_fops = +{ + .write = ctp_lockdown_proc_write, + .read = ctp_lockdown_proc_read, + .owner = THIS_MODULE, +}; + +void ctp_lockdown_fucntion_proc_file(void) +{ + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_lockdown_proc = NULL; + + ctp_device_proc = proc_mkdir("touchscreen", NULL); + + ctp_lockdown_proc = proc_create("lockdown_info", 0666, ctp_device_proc, &ctp_lockdown_procs_fops); + if (ctp_lockdown_proc == NULL) { + GTP_ERROR("create_proc_entry lockdown failed\n"); + } +} +#endif + +/******************************************************* +Function: + Read data from the i2c slave device. +Input: + client: i2c device. + buf[0~1]: read start address. + buf[2~len-1]: read data buffer. + len: GTP_ADDR_LENGTH + read bytes count +Output: + numbers of i2c_msgs to transfer: + 2: succeed, otherwise: failed +*********************************************************/ +s32 gtp_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + if ((retries >= 5)) { + #if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); + #endif + + #if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) { + return ret; + } + #endif + GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + gtp_recovery_reset(client); + } else + #endif + { + gtp_reset_guitar(client, 10); + } + } + return ret; +} + + + +/******************************************************* +Function: + Write data to the i2c slave device. +Input: + client: i2c device. + buf[0~1]: write start address. + buf[2~len-1]: data buffer + len: GTP_ADDR_LENGTH + write bytes count +Output: + numbers of i2c_msgs to transfer: + 1: succeed, otherwise: failed +*********************************************************/ +s32 gtp_i2c_write(struct i2c_client *client,u8 *buf,s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1)break; + retries++; + } + if ((retries >= 5)) { + #if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); + #endif + + #if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) { + return ret; + } + #endif + GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + gtp_recovery_reset(client); + } else + #endif + { + gtp_reset_guitar(client, 10); + } + } + return ret; +} + + +/******************************************************* +Function: + i2c read twice, compare the results +Input: + client: i2c device + addr: operate address + rxbuf: read data to store, if compare successful + len: bytes to read +Output: + FAIL: read failed + SUCCESS: read successful +*********************************************************/ +s32 gtp_i2c_read_dbl_check(struct i2c_client *client, u16 addr, u8 *rxbuf, int len) +{ + u8 buf[16] = {0}; + u8 confirm_buf[16] = {0}; + u8 retry = 0; + + while (retry++ < 3) { + memset(buf, 0xAA, 16); + buf[0] = (u8)(addr >> 8); + buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, buf, len + 2); + + memset(confirm_buf, 0xAB, 16); + confirm_buf[0] = (u8)(addr >> 8); + confirm_buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, confirm_buf, len + 2); + + if (!memcmp(buf, confirm_buf, len+2)) { + memcpy(rxbuf, confirm_buf+2, len); + return SUCCESS; + } + } + GTP_ERROR("I2C read 0x%04X, %d bytes, double check failed!", addr, len); + return FAIL; +} + +/******************************************************* +Function: + Send config. +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ + +s32 gtp_send_glove_cfg(struct i2c_client *client) +{ + s32 ret = 2; + +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts->pnl_init_error) { + GTP_INFO("Error occured in init_panel, no config sent"); + return 0; + } + GTP_INFO("Driver send config."); + for (retry = 0; retry < 5; retry++) { + ret = gtp_i2c_write(client, gtp_glove_config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + if (ret > 0) { + break; + } + } +#endif + return ret; +} + +/******************************************************* +Function: + Send config. +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ + +s32 gtp_send_cfg(struct i2c_client *client) +{ + s32 ret = 2; + +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts->pnl_init_error) { + GTP_INFO("Error occured in init_panel, no config sent"); + return 0; + } + + GTP_INFO("Driver send config."); + for (retry = 0; retry < 5; retry++) { + ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + if (ret > 0) { + break; + } + } +#endif + return ret; +} +/******************************************************* +Function: + Disable irq function +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +void gtp_irq_disable(struct goodix_ts_data *ts) +{ + unsigned long irqflags; + + GTP_DEBUG_FUNC(); + + spin_lock_irqsave(&ts->irq_lock, irqflags); + if (!ts->irq_is_disable) { + ts->irq_is_disable = 1; + disable_irq_nosync(ts->client->irq); + } + spin_unlock_irqrestore(&ts->irq_lock, irqflags); +} + +/******************************************************* +Function: + Enable irq function +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +void gtp_irq_enable(struct goodix_ts_data *ts) +{ + unsigned long irqflags = 0; + + GTP_DEBUG_FUNC(); + + spin_lock_irqsave(&ts->irq_lock, irqflags); + if (ts->irq_is_disable) { + enable_irq(ts->client->irq); + ts->irq_is_disable = 0; + } + spin_unlock_irqrestore(&ts->irq_lock, irqflags); +} + + +/******************************************************* +Function: + Report touch point event +Input: + ts: goodix i2c_client private data + id: trackId + x: input x coordinate + y: input y coordinate + w: input pressure +Output: + None. +*********************************************************/ +static void gtp_touch_down(struct goodix_ts_data* ts,s32 id,s32 x,s32 y,s32 w) +{ +#if GTP_CHANGE_X2Y + GTP_SWAP(x, y); +#endif + + if (gtp_ics_slot_report==1) { + input_mt_slot(ts->input_dev, id); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + } else { + input_report_key(ts->input_dev, BTN_TOUCH, 1); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); + input_mt_sync(ts->input_dev); + } + + GTP_DEBUG("ID:%d, X:%d, Y:%d, W:%d", id, x, y, w); +} + +/******************************************************* +Function: + Report touch release event +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +static void gtp_touch_up(struct goodix_ts_data* ts, s32 id) +{ + if (gtp_ics_slot_report==1) { + input_mt_slot(ts->input_dev, id); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, -1); + GTP_DEBUG("Touch id[%2d] release!", id); + } else { + input_report_key(ts->input_dev, BTN_TOUCH, 0); + } +} + +#if GTP_WITH_PEN + +static void gtp_pen_init(struct goodix_ts_data *ts) +{ + s32 ret = 0; + + GTP_INFO("Request input device for pen/stylus."); + + ts->pen_dev = input_allocate_device(); + if (ts->pen_dev == NULL) { + GTP_ERROR("Failed to allocate input device for pen/stylus."); + return; + } + + ts->pen_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; + + if (gtp_ics_slot_report == 1) { + input_mt_init_slots(ts->pen_dev, 16); + } else { + ts->pen_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + } + + + set_bit(BTN_TOOL_PEN, ts->pen_dev->keybit); + set_bit(INPUT_PROP_DIRECT, ts->pen_dev->propbit); + +#if GTP_PEN_HAVE_BUTTON + input_set_capability(ts->pen_dev, EV_KEY, BTN_STYLUS); + input_set_capability(ts->pen_dev, EV_KEY, BTN_STYLUS2); +#endif + + input_set_abs_params(ts->pen_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_PRESSURE, 0, 255, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); + + ts->pen_dev->name = "goodix-pen"; + ts->pen_dev->id.bustype = BUS_I2C; + + ret = input_register_device(ts->pen_dev); + if (ret) { + GTP_ERROR("Register %s input device failed", ts->pen_dev->name); + return; + } +} + +static void gtp_pen_down(s32 x, s32 y, s32 w, s32 id) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + +#if GTP_CHANGE_X2Y + GTP_SWAP(x, y); +#endif + + input_report_key(ts->pen_dev, BTN_TOOL_PEN, 1); + + if (gtp_ics_slot_report==1) { + input_mt_slot(ts->pen_dev, id); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, id); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->pen_dev, ABS_MT_PRESSURE, w); + input_report_abs(ts->pen_dev, ABS_MT_TOUCH_MAJOR, w); + } else { + input_report_key(ts->pen_dev, BTN_TOUCH, 1); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->pen_dev, ABS_MT_PRESSURE, w); + input_report_abs(ts->pen_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, id); + input_mt_sync(ts->pen_dev); + } + + GTP_DEBUG("(%d)(%d, %d)[%d]", id, x, y, w); +} + +static void gtp_pen_up(s32 id) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + + input_report_key(ts->pen_dev, BTN_TOOL_PEN, 0); + + if (gtp_ics_slot_report==1) { + input_mt_slot(ts->pen_dev, id); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, -1); + } else { + input_report_key(ts->pen_dev, BTN_TOUCH, 0); + } + +} +#endif + +/******************************************************* +Function: + Goodix touchscreen work function +Input: + work: work struct of goodix_workqueue +Output: + None. +*********************************************************/ +static void goodix_ts_work_func(struct work_struct *work) +{ + u8 end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0}; + u8 point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF}; + u8 touch_num = 0; + u8 finger = 0; + static u16 pre_touch = 0; + static u8 pre_key = 0; +#if GTP_WITH_PEN + u8 pen_active = 0; + static u8 pre_pen = 0; +#endif + u8 key_value = 0; + u8 *coor_data = NULL; + s32 input_x = 0; + s32 input_y = 0; + s32 input_w = 0; + s32 id = 0; + s32 i = 0; + s32 ret = -1; + struct goodix_ts_data *ts = NULL; + +#if GTP_COMPATIBLE_MODE + u8 rqst_buf[3] = {0x80, 0x43}; +#endif + +#if GTP_GESTURE_WAKEUP + u8 doze_buf[3] = {0x81, 0x4B}; +#endif + + GTP_DEBUG_FUNC(); + ts = container_of(work, struct goodix_ts_data, work); + if (ts->enter_update) { + return; + } +#if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) { + ret = gtp_i2c_read(i2c_connect_client, doze_buf, 3); + GTP_DEBUG("0x814B = 0x%02X", doze_buf[2]); + if (ret > 0) { + if ('1'== gtp_gesture_onoff) { + gtp_gesture_coordinate[0]=0X8140 >> 8; + gtp_gesture_coordinate[1]=0X8140 & 0xFF; + + if ((doze_buf[2] == 'a') || (doze_buf[2] == 'b') || (doze_buf[2] == 'c') || + (doze_buf[2] == 'd') || (doze_buf[2] == 'e') || (doze_buf[2] == 'g') || + (doze_buf[2] == 'h') || (doze_buf[2] == 'm') || (doze_buf[2] == 'o') || + (doze_buf[2] == 'q') || (doze_buf[2] == 's') || (doze_buf[2] == 'v') || + (doze_buf[2] == 'w') || (doze_buf[2] == 'y') || (doze_buf[2] == 'z') || + (doze_buf[2] == 0x5E) /* ^ */ + ) { + GTP_INFO("Gesture type;%c\n",doze_buf[2]); + gtp_gesture_value =doze_buf[2]; + if (doze_buf[2] != 0x5E) { + GTP_INFO("Wakeup by gesture(%c), light up the screen!", doze_buf[2]); + } else { + GTP_INFO("Wakeup by gesture(^), light up the screen!"); + } + + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL!=strchr(gtp_gesture_type, gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + }; + + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else if ((doze_buf[2] == 0xAA) || (doze_buf[2] == 0xBB) || + (doze_buf[2] == 0xAB) || (doze_buf[2] == 0xBA)) { + char *direction[4] = {"Right", "Down", "Up", "Left"}; + u8 type = ((doze_buf[2] & 0x0F) - 0x0A) + (((doze_buf[2] >> 4) & 0x0F) - 0x0A) * 2; + + GTP_INFO("%s slide to light up the screen!", direction[type]); + switch (doze_buf[2]) { + case 0xAA: + gtp_gesture_value = 'R'; + break; + case 0xAB: + gtp_gesture_value = 'D'; + break; + case 0xBA: + gtp_gesture_value = 'U'; + break; + case 0xBB: + gtp_gesture_value = 'L'; + break; + } + + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL!=strchr(gtp_gesture_type,gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + } + + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else if (0xCC == doze_buf[2]) { + GTP_INFO("Double click to light up the screen!"); + gtp_gesture_value = 'K'; + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL!=strchr(gtp_gesture_type, gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + } + + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else { + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + gtp_enter_doze(ts); + } + } + } + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } +#endif + + ret = gtp_i2c_read(ts->client, point_data, 12); + if (ret < 0) { + GTP_ERROR("I2C transfer error. errno:%d\n ", ret); + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } + + finger = point_data[GTP_ADDR_LENGTH]; + +#if GTP_COMPATIBLE_MODE + if ((finger == 0x00) && (CHIP_TYPE_GT9F == ts->chip_type)) { + ret = gtp_i2c_read(ts->client, rqst_buf, 3); + if (ret < 0) { + GTP_ERROR("Read request status error!"); + goto exit_work_func; + } + + switch (rqst_buf[2]) { + case GTP_RQST_CONFIG: + GTP_INFO("Request for config."); + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Request for config unresponded!"); + } else { + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + GTP_INFO("Request for config responded!"); + } + break; + + case GTP_RQST_BAK_REF: + GTP_INFO("Request for backup reference."); + ts->rqst_processing = 1; + ret = gtp_bak_ref_proc(ts, GTP_BAK_REF_SEND); + if (SUCCESS == ret) { + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + ts->rqst_processing = 0; + GTP_INFO("Request for backup reference responded!"); + } else { + GTP_ERROR("Requeset for backup reference unresponed!"); + } + break; + + case GTP_RQST_RESET: + GTP_INFO("Request for reset."); + gtp_recovery_reset(ts->client); + break; + + case GTP_RQST_MAIN_CLOCK: + GTP_INFO("Request for main clock."); + ts->rqst_processing = 1; + ret = gtp_main_clk_proc(ts); + if (FAIL == ret) { + GTP_ERROR("Request for main clock unresponded!"); + } else { + GTP_INFO("Request for main clock responded!"); + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + ts->rqst_processing = 0; + ts->clk_chk_fs_times = 0; + } + break; + + default: + GTP_INFO("Undefined request: 0x%02X", rqst_buf[2]); + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + break; + } + } +#endif + if (finger == 0x00) { + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } + + if ((finger & 0x80) == 0) { + goto exit_work_func; + } + + touch_num = finger & 0x0f; + + if (touch_num > GTP_MAX_TOUCH) { + goto exit_work_func; + } + + if (touch_num > 1) { + u8 buf[8 * GTP_MAX_TOUCH] = {(GTP_READ_COOR_ADDR + 10) >> 8, (GTP_READ_COOR_ADDR + 10) & 0xff}; + + ret = gtp_i2c_read(ts->client, buf, 2 + 8 * (touch_num - 1)); + memcpy(&point_data[12], &buf[2], 8 * (touch_num - 1)); + } + +#if (GTP_HAVE_TOUCH_KEY || GTP_PEN_HAVE_BUTTON) + key_value = point_data[3 + 8 * touch_num]; + + if (key_value || pre_key) { + #if GTP_PEN_HAVE_BUTTON + if (key_value == 0x40) { + GTP_DEBUG("BTN_STYLUS & BTN_STYLUS2 Down."); + input_report_key(ts->pen_dev, BTN_STYLUS, 1); + input_report_key(ts->pen_dev, BTN_STYLUS2, 1); + pen_active = 1; + } else if (key_value == 0x10) { + GTP_DEBUG("BTN_STYLUS Down, BTN_STYLUS2 Up."); + input_report_key(ts->pen_dev, BTN_STYLUS, 1); + input_report_key(ts->pen_dev, BTN_STYLUS2, 0); + pen_active = 1; + } else if (key_value == 0x20) { + GTP_DEBUG("BTN_STYLUS Up, BTN_STYLUS2 Down."); + input_report_key(ts->pen_dev, BTN_STYLUS, 0); + input_report_key(ts->pen_dev, BTN_STYLUS2, 1); + pen_active = 1; + } else { + GTP_DEBUG("BTN_STYLUS & BTN_STYLUS2 Up."); + input_report_key(ts->pen_dev, BTN_STYLUS, 0); + input_report_key(ts->pen_dev, BTN_STYLUS2, 0); + if ((pre_key == 0x40) || (pre_key == 0x20) || + (pre_key == 0x10) + ) { + pen_active = 1; + } + } + if (pen_active) { + touch_num = 0; + } + #endif + + #if GTP_HAVE_TOUCH_KEY + if (!pre_touch) { + for (i = 0; i < GTP_MAX_KEY_NUM; i++) { + #if GTP_DEBUG_ON + for (ret = 0; ret < 4; ++ret) { + if (key_codes[ret] == touch_key_array[i]) { + GTP_DEBUG("Key: %s %s", key_names[ret], (key_value & (0x01 << i)) ? "Down" : "Up"); + break; + } + } + #endif + if (gtp_ics_slot_report == 1) + input_report_key(ts->input_dev, touch_key_array[i], key_value & (0x01<pen_dev); + } else +#endif + { + input_sync(ts->input_dev); + } + +exit_work_func: + if (!ts->gtp_rawdiff_mode) { + ret = gtp_i2c_write(ts->client, end_cmd, 3); + if (ret < 0) { + GTP_INFO("I2C write end_cmd error!"); + } + } + if (ts->use_irq) { + gtp_irq_enable(ts); + } +} + +/******************************************************* +Function: + Timer interrupt service routine for polling mode. +Input: + timer: timer struct pointer +Output: + Timer work mode. + HRTIMER_NORESTART: no restart mode +*********************************************************/ +static enum hrtimer_restart goodix_ts_timer_handler(struct hrtimer *timer) +{ + struct goodix_ts_data *ts = container_of(timer, struct goodix_ts_data, timer); + + GTP_DEBUG_FUNC(); + + queue_work(goodix_wq, &ts->work); + hrtimer_start(&ts->timer, ktime_set(0, (GTP_POLL_TIME+6)*1000000), HRTIMER_MODE_REL); + return HRTIMER_NORESTART; +} + +/******************************************************* +Function: + External interrupt service routine for interrupt mode. +Input: + irq: interrupt number. + dev_id: private data pointer +Output: + Handle Result. + IRQ_HANDLED: interrupt handled successfully +*********************************************************/ +static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id) +{ + struct goodix_ts_data *ts = dev_id; + + GTP_DEBUG_FUNC(); + + gtp_irq_disable(ts); + + queue_work(goodix_wq, &ts->work); + + return IRQ_HANDLED; +} +/******************************************************* +Function: + Synchronization. +Input: + ms: synchronization time in millisecond. +Output: + None. +*******************************************************/ +void gtp_int_sync(s32 ms) +{ + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(ms); + GTP_GPIO_AS_INT(gtp_int_gpio); +} + + +/******************************************************* +Function: + Reset chip. +Input: + ms: reset time in millisecond +Output: + None. +*******************************************************/ +void gtp_reset_guitar(struct i2c_client *client, s32 ms) +{ +#if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); +#endif + + GTP_DEBUG_FUNC(); + GTP_INFO("Guitar reset"); + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(ms); + GTP_GPIO_OUTPUT(gtp_int_gpio, client->addr == 0x14); + + msleep(2); + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + msleep(6); + + GTP_GPIO_AS_INPUT(gtp_rst_gpio); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return; + } +#endif + + gtp_int_sync(50); +#if GTP_ESD_PROTECT + gtp_init_ext_watchdog(client); +#endif +} + +#if GTP_GESTURE_WAKEUP +/******************************************************* +Function: + Enter doze mode for sliding wakeup. +Input: + ts: goodix tp private data +Output: + 1: succeed, otherwise failed +*******************************************************/ +static s8 gtp_enter_doze(struct goodix_ts_data *ts) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 8}; + + GTP_DEBUG_FUNC(); + + GTP_DEBUG("Entering gesture mode."); + while (retry++ < 5) { + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x46; + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret < 0) { + GTP_DEBUG("failed to set doze flag into 0x8046, %d", retry); + continue; + } + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x40; + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret > 0) { + doze_status = DOZE_ENABLED; + GTP_INFO("Gesture mode enabled."); + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send gesture cmd failed."); + return ret; +} +#endif +/******************************************************* +Function: + Enter sleep mode. +Input: + ts: private data. +Output: + Executive outcomes. + 1: succeed, otherwise failed. +*******************************************************/ +static s8 gtp_enter_sleep(struct goodix_ts_data *ts) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 5}; + +#if GTP_COMPATIBLE_MODE + u8 status_buf[3] = {0x80, 0x44}; +#endif + + GTP_DEBUG_FUNC(); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + ret = gtp_i2c_read(ts->client, status_buf, 3); + if (ret < 0) { + GTP_ERROR("failed to get backup-reference status"); + } + + if (status_buf[2] & 0x80) { + ret = gtp_bak_ref_proc(ts, GTP_BAK_REF_STORE); + if (FAIL == ret) { + GTP_ERROR("failed to store bak_ref"); + } + } + } +#endif + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(5); + + while (retry++ < 5) { + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret > 0) { + GTP_INFO("GTP enter sleep!"); + + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send sleep cmd failed."); + return ret; +} + +/******************************************************* +Function: + Wakeup from sleep. +Input: + ts: private data. +Output: + Executive outcomes. + >0: succeed, otherwise: failed. +*******************************************************/ +static s8 gtp_wakeup_sleep(struct goodix_ts_data *ts) +{ + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG_FUNC(); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + u8 opr_buf[3] = {0x41, 0x80}; + + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(5); + + for (retry = 0; retry < 10; ++retry) { + opr_buf[2] = 0x0C; + ret = gtp_i2c_write(ts->client, opr_buf, 3); + if (FAIL == ret) { + GTP_ERROR("failed to hold ss51 & dsp!"); + continue; + } + opr_buf[2] = 0x00; + ret = gtp_i2c_read(ts->client, opr_buf, 3); + if (FAIL == ret) { + GTP_ERROR("failed to get ss51 & dsp status!"); + continue; + } + if (0x0C != opr_buf[2]) { + GTP_DEBUG("ss51 & dsp not been hold, %d", retry+1); + continue; + } + GTP_DEBUG("ss51 & dsp confirmed hold"); + + ret = gtp_fw_startup(ts->client); + if (FAIL == ret) { + GTP_ERROR("failed to startup GT9XXF, process recovery"); + gtp_esd_recovery(ts->client); + } + break; + } + if (retry >= 10) { + GTP_ERROR("failed to wakeup, processing esd recovery"); + gtp_esd_recovery(ts->client); + } else { + GTP_INFO("GT9XXF gtp wakeup success"); + } + return ret; + } +#endif + +#if GTP_POWER_CTRL_SLEEP + while (retry++ < 5) { + gtp_reset_guitar(ts->client, 20); + + GTP_INFO("GTP wakeup sleep."); + return 1; + } +#else + while (retry++ < 10) { + #if GTP_GESTURE_WAKEUP + if (DOZE_WAKEUP != doze_status) { + GTP_INFO("Powerkey wakeup."); + } else { + GTP_INFO("Gesture wakeup."); + } + doze_status = DOZE_DISABLED; + gtp_irq_disable(ts); + gtp_reset_guitar(ts->client, 10); + gtp_irq_enable(ts); + #else + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(5); + + #endif + + ret = gtp_i2c_test(ts->client); + if (ret > 0) { + GTP_INFO("GTP wakeup sleep."); + + #if (!GTP_GESTURE_WAKEUP) + { + gtp_int_sync(25); + #if GTP_ESD_PROTECT + gtp_init_ext_watchdog(ts->client); + #endif + } + #endif + + return ret; + } + gtp_reset_guitar(ts->client, 20); + } +#endif + + GTP_ERROR("GTP wakeup sleep failed."); + return ret; +} + +/******************************************************* +Function: + Initialize gtp. +Input: + ts: goodix private data +Output: + Executive outcomes. + 0: succeed, otherwise: failed +*******************************************************/ +static s32 gtp_init_panel(struct goodix_ts_data *ts) +{ + s32 ret = -1; + +#if GTP_DRIVER_SEND_CFG + s32 i = 0; + u8 check_sum = 0; + u8 opr_buf[16] = {0}; + u8 sensor_id = 0; + u8 drv_cfg_version; + u8 flash_cfg_version; + +/* if defined CONFIG_OF, parse config data from dtsi + * else parse config data form header file. + */ +#ifdef GTP_CONFIG_OF + u8 cfg_info_group0[] = CTP_CFG_GROUP0; + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + + u8 *send_cfg_buf[] = {cfg_info_group0,cfg_info_group1, + cfg_info_group2, cfg_info_group3, + cfg_info_group4, cfg_info_group5}; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group0), + CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5)}; + + GTP_DEBUG("Config Groups\' Lengths: %d, %d, %d, %d, %d, %d", + cfg_info_len[0], cfg_info_len[1], cfg_info_len[2], cfg_info_len[3], + cfg_info_len[4], cfg_info_len[5]); +#endif + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + ts->fw_error = 0; + } else +#endif + { /* check firmware */ + ret = gtp_i2c_read_dbl_check(ts->client, 0x41E4, opr_buf, 1); + if (SUCCESS == ret) { + if (opr_buf[0] != 0xBE) { + ts->fw_error = 1; + GTP_ERROR("Firmware error, no config sent!"); + return -1; + } + } + } + + /* read sensor id */ +#if GTP_COMPATIBLE_MODE + msleep(50); +#endif + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) { + if (sensor_id >= 0x06) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + ts->pnl_init_error = 1; + return -1; + } + } else { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + ts->pnl_init_error = 1; + return -1; + } + GTP_INFO("Sensor_ID: %d", sensor_id); + tp_sensor_id = sensor_id; + + /* parse config data*/ +#if 0 + GTP_DEBUG("Get config data from device tree."); + ret = gtp_parse_dt_cfg(&ts->client->dev, &config[GTP_ADDR_LENGTH], &ts->gtp_cfg_len, sensor_id); + if (ret < 0) { + GTP_ERROR("Failed to parse config data form device tree."); + ts->pnl_init_error = 1; + return -1; + } +#else + GTP_DEBUG("Get config data from header file."); + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) { + sensor_id = 0; + } + ts->gtp_cfg_len = cfg_info_len[sensor_id]; + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len); +#endif + + GTP_INFO("Config group%d used,length: %d", sensor_id, ts->gtp_cfg_len); + + if (ts->gtp_cfg_len < GTP_CONFIG_MIN_LENGTH) { + GTP_ERROR("Config Group%d is INVALID CONFIG GROUP(Len: %d)! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id, ts->gtp_cfg_len); + ts->pnl_init_error = 1; + return -1; + } + +#if GTP_COMPATIBLE_MODE + if (ts->chip_type != CHIP_TYPE_GT9F) +#endif + { + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + if (ret == SUCCESS) { + GTP_DEBUG("Config Version: %d, 0x%02X; IC Config Version: %d, 0x%02X", + config[GTP_ADDR_LENGTH], config[GTP_ADDR_LENGTH], opr_buf[0], opr_buf[0]); + + flash_cfg_version = opr_buf[0]; + drv_cfg_version = config[GTP_ADDR_LENGTH]; + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + config[GTP_ADDR_LENGTH] = 0x00; + } + } else { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -1; + } + } + +#if GTP_CUSTOM_CFG + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) { + config[TRIGGER_LOC] &= 0xfe; + } else if (GTP_INT_TRIGGER == 1) { + config[TRIGGER_LOC] |= 0x01; + } +#endif + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + +#else + + ts->gtp_cfg_len = GTP_CONFIG_MAX_LENGTH; + ret = gtp_i2c_read(ts->client, config, ts->gtp_cfg_len + GTP_ADDR_LENGTH); + if (ret < 0) { + GTP_ERROR("Read Config Failed, Using Default Resolution & INT Trigger!"); + ts->abs_x_max = GTP_MAX_WIDTH; + ts->abs_y_max = GTP_MAX_HEIGHT; + ts->int_trigger_type = GTP_INT_TRIGGER; + } + +#endif + + if ((ts->abs_x_max == 0) && (ts->abs_y_max == 0)) { + ts->abs_x_max = (config[RESOLUTION_LOC + 1] << 8) + config[RESOLUTION_LOC]; + ts->abs_y_max = (config[RESOLUTION_LOC + 3] << 8) + config[RESOLUTION_LOC + 2]; + ts->int_trigger_type = (config[TRIGGER_LOC]) & 0x03; + } + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + u8 sensor_num = 0; + u8 driver_num = 0; + u8 have_key = 0; + + have_key = (config[GTP_REG_HAVE_KEY - GTP_REG_CONFIG_DATA + 2] & 0x01); + + if (1 == ts->is_950) { + driver_num = config[GTP_REG_MATRIX_DRVNUM - GTP_REG_CONFIG_DATA + 2]; + sensor_num = config[GTP_REG_MATRIX_SENNUM - GTP_REG_CONFIG_DATA + 2]; + if (have_key) { + driver_num--; + } + ts->bak_ref_len = (driver_num * (sensor_num - 1) + 2) * 2 * 6; + } else { + driver_num = (config[CFG_LOC_DRVA_NUM] & 0x1F) + (config[CFG_LOC_DRVB_NUM]&0x1F); + if (have_key) { + driver_num--; + } + sensor_num = (config[CFG_LOC_SENS_NUM] & 0x0F) + ((config[CFG_LOC_SENS_NUM] >> 4) & 0x0F); + ts->bak_ref_len = (driver_num * (sensor_num - 2) + 2) * 2; + } + + GTP_INFO("Drv * Sen: %d * %d(key: %d), X_MAX: %d, Y_MAX: %d, TRIGGER: 0x%02x", + driver_num, sensor_num, have_key, ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type); + return 0; + } else +#endif + { +#if GTP_DRIVER_SEND_CFG + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Send config error."); + } +#if GTP_COMPATIBLE_MODE + if (ts->chip_type != CHIP_TYPE_GT9F) +#endif + { + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + check_sum = 0; + config[GTP_ADDR_LENGTH] = drv_cfg_version; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + } + } + +#endif + GTP_INFO("X_MAX: %d, Y_MAX: %d, TRIGGER: 0x%02x", ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type); + } + + msleep(10); + return 0; + +} + +static ssize_t gt91xx_config_read_proc(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + char *ptr = page; + char temp_data[GTP_CONFIG_MAX_LENGTH + 2] = {0x80, 0x47}; + int i; + + if (*ppos) { + return 0; + } + ptr += sprintf(ptr, "==== GT9XX config init value====\n"); + + for (i = 0 ; i < GTP_CONFIG_MAX_LENGTH ; i++) { + ptr += sprintf(ptr, "0x%02X ", config[i + 2]); + + if (i % 8 == 7) + ptr += sprintf(ptr, "\n"); + } + + ptr += sprintf(ptr, "\n"); + + ptr += sprintf(ptr, "==== GT9XX config real value====\n"); + gtp_i2c_read(i2c_connect_client, temp_data, GTP_CONFIG_MAX_LENGTH + 2); + for (i = 0 ; i < GTP_CONFIG_MAX_LENGTH ; i++) { + ptr += sprintf(ptr, "0x%02X ", temp_data[i+2]); + + if (i % 8 == 7) + ptr += sprintf(ptr, "\n"); + } + *ppos += ptr - page; + return (ptr - page); +} + +static ssize_t gt91xx_config_write_proc(struct file *filp, const char __user *buffer, size_t count, loff_t *off) +{ + s32 ret = 0; + + GTP_DEBUG("write count %ld\n", count); + + if (count > GTP_CONFIG_MAX_LENGTH) { + GTP_ERROR("size not match [%d:%ld]\n", GTP_CONFIG_MAX_LENGTH, count); + return -EFAULT; + } + + if (copy_from_user(&config[2], buffer, count)) { + GTP_ERROR("copy from user fail\n"); + return -EFAULT; + } + + ret = gtp_send_cfg(i2c_connect_client); + + if (ret < 0) { + GTP_ERROR("send config failed."); + } + + return count; +} +/******************************************************* +Function: + Read chip version. +Input: + client: i2c device + version: buffer to keep ic firmware version +Output: + read operation return. + 2: succeed, otherwise: failed +*******************************************************/ +s32 gtp_read_version(struct i2c_client *client, u16* version) +{ + s32 ret = -1; + u8 buf[8] = {GTP_REG_VERSION >> 8, GTP_REG_VERSION & 0xff}; + + GTP_DEBUG_FUNC(); + + ret = gtp_i2c_read(client, buf, sizeof(buf)); + if (ret < 0) { + GTP_ERROR("GTP read version failed"); + return ret; + } + + if (version) { + *version = (buf[7] << 8) | buf[6]; + } + if (buf[5] == 0x00) { + GTP_INFO("IC Version: %c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[7], buf[6]); + } else { + GTP_INFO("IC Version: %c%c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]); + } + return ret; +} + +/******************************************************* +Function: + I2c test Function. +Input: + client:i2c client. +Output: + Executive outcomes. + 2: succeed, otherwise failed. +*******************************************************/ +static s8 gtp_i2c_test(struct i2c_client *client) +{ + u8 test[3] = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG_FUNC(); + + while (retry++ < 5) { + ret = gtp_i2c_read(client, test, 3); + if (ret > 0) { + return ret; + } + GTP_ERROR("GTP i2c test failed time %d.",retry); + msleep(10); + } + return ret; +} + +/******************************************************* +Function: + Request gpio(INT & RST) ports. +Input: + ts: private data. +Output: + Executive outcomes. + >= 0: succeed, < 0: failed +*******************************************************/ +static s8 gtp_request_io_port(struct goodix_ts_data *ts) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + ret = GTP_GPIO_REQUEST(gtp_int_gpio, "GTP INT IRQ"); + + if (ret < 0) { + GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32)gtp_int_gpio, ret); + ret = -ENODEV; + } else { + GTP_GPIO_AS_INT(gtp_int_gpio); + ts->client->irq = gpio_to_irq(gtp_int_gpio); + } + + ret = GTP_GPIO_REQUEST(gtp_rst_gpio, "GTP RST PORT"); + if (ret < 0) { + GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32)gtp_rst_gpio, ret); + ret = -ENODEV; + } + + GTP_GPIO_AS_INPUT(gtp_rst_gpio); + + gtp_reset_guitar(ts->client, 20); + + if (ret < 0) { + GTP_GPIO_FREE(gtp_rst_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + } + + return ret; +} + +/******************************************************* +Function: + Request interrupt. +Input: + ts: private data. +Output: + Executive outcomes. + 0: succeed, -1: failed. +*******************************************************/ +static s8 gtp_request_irq(struct goodix_ts_data *ts) +{ + s32 ret = -1; + const u8 irq_table[] = GTP_IRQ_TAB; + + GTP_DEBUG_FUNC(); + GTP_DEBUG("INT trigger type:%x", ts->int_trigger_type); + + ret = request_irq(ts->client->irq, + goodix_ts_irq_handler, + irq_table[ts->int_trigger_type], + ts->client->name, + ts); + if (ret) { + GTP_ERROR("Request IRQ failed!ERRNO:%d.", ret); + GTP_GPIO_AS_INPUT(gtp_int_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + + hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ts->timer.function = goodix_ts_timer_handler; + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + return -1; + } else { + gtp_irq_disable(ts); + ts->use_irq = 1; + return 0; + } +} + +static int fts_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + char buffer[16]; + + if (type == EV_SYN && code == SYN_CONFIG) { + sprintf(buffer, "%d", value); + + GTP_INFO("GTP:Gesture on/off : %d",value); + if (value >= MXT_INPUT_EVENT_START && value <= MXT_INPUT_EVENT_END) { + if (value == MXT_INPUT_EVENT_WAKUP_MODE_ON) { + gtp_gesture_onoff = '1'; + } else if (value == MXT_INPUT_EVENT_WAKUP_MODE_OFF) { + gtp_gesture_onoff = '0'; + } else { + gtp_gesture_onoff = '0'; + GTP_ERROR("Failed Open/Close Gesture Function!\n"); + return -ENOMEM; + } + } + } + + return 0; +} +/******************************************************* +Function: + Request input device Function. +Input: + ts:private data. +Output: + Executive outcomes. + 0: succeed, otherwise: failed. +*******************************************************/ +static s8 gtp_request_input_dev(struct goodix_ts_data *ts) +{ + s8 ret = -1; +#if GTP_HAVE_TOUCH_KEY + u8 index = 0; +#endif + + GTP_DEBUG_FUNC(); + + ts->input_dev = input_allocate_device(); + if (ts->input_dev == NULL) { + GTP_ERROR("Failed to allocate input device."); + return -ENOMEM; + } + + ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; + + if (gtp_ics_slot_report==1) { + input_mt_init_slots(ts->input_dev, 10, 0); + } else { + ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + } + + __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit); + +#if GTP_HAVE_TOUCH_KEY + for (index = 0; index < GTP_MAX_KEY_NUM; index++) { + input_set_capability(ts->input_dev, EV_KEY, touch_key_array[index]); + } +#endif + +#if GTP_GESTURE_WAKEUP + input_set_capability(ts->input_dev, EV_KEY, KEY_POWER); + input_set_capability(ts->input_dev, EV_KEY, KEY_WAKEUP); + __set_bit(KEY_WAKEUP, ts->input_dev->keybit); + Ctp_Gesture_Fucntion_Proc_File(); +#endif + +#if GTP_CHANGE_X2Y + GTP_SWAP(ts->abs_x_max, ts->abs_y_max); +#endif + + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); + + ts->input_dev->name = goodix_ts_name; + ts->input_dev->phys = goodix_input_phys; + ts->input_dev->id.bustype = BUS_I2C; + ts->input_dev->id.vendor = 0xDEAD; + ts->input_dev->id.product = 0xBEEF; + ts->input_dev->id.version = 10427; + ts->input_dev->event = fts_input_event; + + ret = input_register_device(ts->input_dev); + if (ret) { + GTP_ERROR("Register %s input device failed", ts->input_dev->name); + return -ENODEV; + } + +#if GTP_WITH_PEN + gtp_pen_init(ts); +#endif + + return 0; +} + +#if GTP_COMPATIBLE_MODE + +s32 gtp_fw_startup(struct i2c_client *client) +{ + u8 opr_buf[4]; + s32 ret = 0; + + opr_buf[0] = 0xAA; + ret = i2c_write_bytes(client, 0x8041, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + + opr_buf[0] = 0x00; + ret = i2c_write_bytes(client, 0x4180, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + gtp_int_sync(25); + + ret = i2c_read_bytes(client, 0x8041, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + if (0xAA == opr_buf[0]) { + GTP_ERROR("IC works abnormally,startup failed."); + return FAIL; + } else { + GTP_INFO("IC works normally, Startup success."); + opr_buf[0] = 0xAA; + i2c_write_bytes(client, 0x8041, opr_buf, 1); + return SUCCESS; + } +} + +static s32 gtp_esd_recovery(struct i2c_client *client) +{ + s32 retry = 0; + s32 ret = 0; + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(client); + + gtp_irq_disable(ts); + + GTP_INFO("GT9XXF esd recovery mode"); + for (retry = 0; retry < 5; retry++) { + ret = gup_fw_download_proc(NULL, GTP_FL_ESD_RECOVERY); + if (FAIL == ret) { + GTP_ERROR("esd recovery failed %d", retry+1); + continue; + } + ret = gtp_fw_startup(ts->client); + if (FAIL == ret) { + GTP_ERROR("GT9XXF start up failed %d", retry+1); + continue; + } + break; + } + gtp_irq_enable(ts); + + if (retry >= 5) { + GTP_ERROR("failed to esd recovery"); + return FAIL; + } + + GTP_INFO("Esd recovery successful"); + return SUCCESS; +} + +void gtp_recovery_reset(struct i2c_client *client) +{ +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_OFF); +#endif + GTP_DEBUG_FUNC(); + + gtp_esd_recovery(client); + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif +} + +static s32 gtp_bak_ref_proc(struct goodix_ts_data *ts, u8 mode) +{ + s32 ret = 0; + s32 i = 0; + s32 j = 0; + u16 ref_sum = 0; + u16 learn_cnt = 0; + u16 chksum = 0; + s32 ref_seg_len = 0; + s32 ref_grps = 0; + struct file *ref_filp = NULL; + u8 *p_bak_ref; + + ret = gup_check_fs_mounted("/data"); + if (FAIL == ret) { + ts->ref_chk_fs_times++; + GTP_DEBUG("Ref check /data times/MAX_TIMES: %d / %d", ts->ref_chk_fs_times, GTP_CHK_FS_MNT_MAX); + if (ts->ref_chk_fs_times < GTP_CHK_FS_MNT_MAX) { + msleep(50); + GTP_INFO("/data not mounted."); + return FAIL; + } + GTP_INFO("check /data mount timeout..."); + } else { + GTP_INFO("/data mounted!!!(%d/%d)", ts->ref_chk_fs_times, GTP_CHK_FS_MNT_MAX); + } + + p_bak_ref = (u8 *)kzalloc(ts->bak_ref_len, GFP_KERNEL); + + if (NULL == p_bak_ref) { + GTP_ERROR("Allocate memory for p_bak_ref failed!"); + return FAIL; + } + + if (ts->is_950) { + ref_seg_len = ts->bak_ref_len / 6; + ref_grps = 6; + } else { + ref_seg_len = ts->bak_ref_len; + ref_grps = 1; + } + ref_filp = filp_open(GTP_BAK_REF_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(ref_filp)) { + GTP_ERROR("Failed to open/create %s.", GTP_BAK_REF_PATH); + if (GTP_BAK_REF_SEND == mode) { + goto bak_ref_default; + } else { + goto bak_ref_exit; + } + } + + switch (mode) { + case GTP_BAK_REF_SEND: + GTP_INFO("Send backup-reference"); + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ret = ref_filp->f_op->read(ref_filp, (char*)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + if (ret < 0) { + GTP_ERROR("failed to read bak_ref info from file, sending defualt bak_ref"); + goto bak_ref_default; + } + for (j = 0; j < ref_grps; ++j) { + ref_sum = 0; + for (i = 0; i < (ref_seg_len); i += 2) { + ref_sum += (p_bak_ref[i + j * ref_seg_len] << 8) + p_bak_ref[i+1 + j * ref_seg_len]; + } + learn_cnt = (p_bak_ref[j * ref_seg_len + ref_seg_len -4] << 8) + (p_bak_ref[j * ref_seg_len + ref_seg_len -3]); + chksum = (p_bak_ref[j * ref_seg_len + ref_seg_len -2] << 8) + (p_bak_ref[j * ref_seg_len + ref_seg_len -1]); + GTP_DEBUG("learn count = %d", learn_cnt); + GTP_DEBUG("chksum = %d", chksum); + GTP_DEBUG("ref_sum = 0x%04X", ref_sum & 0xFFFF); + if (1 != ref_sum) { + GTP_INFO("wrong chksum for bak_ref, reset to 0x00 bak_ref"); + memset(&p_bak_ref[j * ref_seg_len], 0, ref_seg_len); + p_bak_ref[ref_seg_len + j * ref_seg_len - 1] = 0x01; + } else { + if (j == (ref_grps - 1)) { + GTP_INFO("backup-reference data in %s used", GTP_BAK_REF_PATH); + } + } + } + ret = i2c_write_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (FAIL == ret) { + GTP_ERROR("failed to send bak_ref because of iic comm error"); + goto bak_ref_exit; + } + break; + + case GTP_BAK_REF_STORE: + GTP_INFO("Store backup-reference"); + ret = i2c_read_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (ret < 0) { + GTP_ERROR("failed to read bak_ref info, sending default back-reference"); + goto bak_ref_default; + } + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ref_filp->f_op->write(ref_filp, (char*)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + break; + + default: + GTP_ERROR("invalid backup-reference request"); + break; + } + ret = SUCCESS; + goto bak_ref_exit; + +bak_ref_default: + + for (j = 0; j < ref_grps; ++j) { + memset(&p_bak_ref[j * ref_seg_len], 0, ref_seg_len); + p_bak_ref[j * ref_seg_len + ref_seg_len - 1] = 0x01; + } + ret = i2c_write_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (!IS_ERR(ref_filp)) { + GTP_INFO("write backup-reference data into %s", GTP_BAK_REF_PATH); + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ref_filp->f_op->write(ref_filp, (char*)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + } + if (ret == FAIL) { + GTP_ERROR("failed to load the default backup reference"); + } + +bak_ref_exit: + + if (p_bak_ref) { + kfree(p_bak_ref); + } + if (ref_filp && !IS_ERR(ref_filp)) { + filp_close(ref_filp, NULL); + } + return ret; +} + + +static s32 gtp_verify_main_clk(u8 *p_main_clk) +{ + u8 chksum = 0; + u8 main_clock = p_main_clk[0]; + s32 i = 0; + + if (main_clock < 50 || main_clock > 120) { + return FAIL; + } + + for (i = 0; i < 5; ++i) { + if (main_clock != p_main_clk[i]) { + return FAIL; + } + chksum += p_main_clk[i]; + } + chksum += p_main_clk[5]; + if ((chksum) == 0) { + return SUCCESS; + } else { + return FAIL; + } +} + +static s32 gtp_main_clk_proc(struct goodix_ts_data *ts) +{ + s32 ret = 0; + s32 i = 0; + s32 clk_chksum = 0; + struct file *clk_filp = NULL; + u8 p_main_clk[6] = {0}; + + ret = gup_check_fs_mounted("/data"); + if (FAIL == ret) { + ts->clk_chk_fs_times++; + GTP_DEBUG("Clock check /data times/MAX_TIMES: %d / %d", ts->clk_chk_fs_times, GTP_CHK_FS_MNT_MAX); + if (ts->clk_chk_fs_times < GTP_CHK_FS_MNT_MAX) { + msleep(50); + GTP_INFO("/data not mounted."); + return FAIL; + } + GTP_INFO("Check /data mount timeout!"); + } else { + GTP_INFO("/data mounted!!!(%d/%d)", ts->clk_chk_fs_times, GTP_CHK_FS_MNT_MAX); + } + + clk_filp = filp_open(GTP_MAIN_CLK_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(clk_filp)) { + GTP_ERROR("%s is unavailable, calculate main clock", GTP_MAIN_CLK_PATH); + } else { + clk_filp->f_op->llseek(clk_filp, 0, SEEK_SET); + clk_filp->f_op->read(clk_filp, (char *)p_main_clk, 6, &clk_filp->f_pos); + + ret = gtp_verify_main_clk(p_main_clk); + if (FAIL == ret) { + GTP_ERROR("main clock data in %s is wrong, recalculate main clock", GTP_MAIN_CLK_PATH); + } else { + GTP_INFO("main clock data in %s used, main clock freq: %d", GTP_MAIN_CLK_PATH, p_main_clk[0]); + filp_close(clk_filp, NULL); + goto update_main_clk; + } + } + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ret = gup_clk_calibration(); + gtp_esd_recovery(ts->client); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + + GTP_INFO("calibrate main clock: %d", ret); + if (ret < 50 || ret > 120) { + GTP_ERROR("wrong main clock: %d", ret); + goto exit_main_clk; + } + + for (i = 0; i < 5; ++i) { + p_main_clk[i] = ret; + clk_chksum += p_main_clk[i]; + } + p_main_clk[5] = 0 - clk_chksum; + + if (!IS_ERR(clk_filp)) { + GTP_DEBUG("write main clock data into %s", GTP_MAIN_CLK_PATH); + clk_filp->f_op->llseek(clk_filp, 0, SEEK_SET); + clk_filp->f_op->write(clk_filp, (char *)p_main_clk, 6, &clk_filp->f_pos); + filp_close(clk_filp, NULL); + } + +update_main_clk: + ret = i2c_write_bytes(ts->client, GTP_REG_MAIN_CLK, p_main_clk, 6); + if (FAIL == ret) { + GTP_ERROR("update main clock failed!"); + return FAIL; + } + return SUCCESS; + +exit_main_clk: + if (!IS_ERR(clk_filp)) { + filp_close(clk_filp, NULL); + } + return FAIL; +} + + +s32 gtp_gt9xxf_init(struct i2c_client *client) +{ + s32 ret = 0; + + ret = gup_fw_download_proc(NULL, GTP_FL_FW_BURN); + if (FAIL == ret) { + return FAIL; + } + + ret = gtp_fw_startup(client); + if (FAIL == ret) { + return FAIL; + } + return SUCCESS; +} + +void gtp_get_chip_type(struct goodix_ts_data *ts) +{ + u8 opr_buf[10] = {0x00}; + s32 ret = 0; + + msleep(10); + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CHIP_TYPE, opr_buf, 10); + + if (FAIL == ret) { + GTP_ERROR("Failed to get chip-type, set chip type default: GOODIX_GT9"); + ts->chip_type = CHIP_TYPE_GT9; + return; + } + + if (!memcmp(opr_buf, "GOODIX_GT9", 10)) { + ts->chip_type = CHIP_TYPE_GT9; + } else { + ts->chip_type = CHIP_TYPE_GT9F; + } + GTP_INFO("Chip Type: %s", (ts->chip_type == CHIP_TYPE_GT9) ? "GOODIX_GT9" : "GOODIX_GT9F"); +} +#endif + +/* + * Devices Tree support, +*/ +#ifdef GTP_CONFIG_OF +/** + * gtp_parse_dt - parse platform infomation form devices tree. + */ +static void gtp_parse_dt(struct device *dev) +{ + struct device_node *np = dev->of_node; + + gtp_int_gpio = of_get_named_gpio(np, "goodix,irq-gpio", 0); + gtp_rst_gpio = of_get_named_gpio(np, "goodix,rst-gpio", 0); + + /********************** add 2016.4.28 **************/ +} + +/** + * gtp_parse_dt_cfg - parse config data from devices tree. + * @dev: device that this driver attached. + * @cfg: pointer of the config array. + * @cfg_len: pointer of the config length. + * @sid: sensor id. + * Return: 0-succeed, -1-faileds + */ +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid) +{ + struct device_node *np = dev->of_node; + struct property *prop; + char cfg_name[18]; + + snprintf(cfg_name, sizeof(cfg_name), "goodix,cfg-group%d", sid); + prop = of_find_property(np, cfg_name, cfg_len); + if (!prop || !prop->value || *cfg_len == 0 || *cfg_len > GTP_CONFIG_MAX_LENGTH) { + return -1;/* failed */ + } else { + memcpy(cfg, prop->value, *cfg_len); + return 0; + } +} + +/** + * gtp_power_switch - power switch . + * @on: 1-switch on, 0-switch off. + * return: 0-succeed, -1-faileds + */ +static int gtp_power_switch(struct i2c_client *client, int on) +{ + static struct regulator *vdd_ana; + static struct regulator *vcc_i2c; + int ret; + + if (!vdd_ana) { + vdd_ana = regulator_get(&client->dev, "vdd_ana"); + if (IS_ERR(vdd_ana)) { + GTP_ERROR("regulator get of vdd_ana failed"); + ret = PTR_ERR(vdd_ana); + vdd_ana = NULL; + return ret; + } + } + + if (!vcc_i2c) { + vcc_i2c = regulator_get(&client->dev, "vcc_i2c"); + if (IS_ERR(vcc_i2c)) { + GTP_ERROR("regulator get of vcc_i2c failed"); + ret = PTR_ERR(vcc_i2c); + vcc_i2c = NULL; + goto ERR_GET_VCC; + } + } + + if (on) { + GTP_DEBUG("GTP power on."); + ret = regulator_enable(vdd_ana); + udelay(2); + ret = regulator_enable(vcc_i2c); + } else { + GTP_DEBUG("GTP power off."); + ret = regulator_disable(vcc_i2c); + udelay(2); + ret = regulator_disable(vdd_ana); + } + return ret; + +ERR_GET_VCC: + regulator_put(vdd_ana); + return ret; +} +#endif + +#ifdef PMX_DRIVER_GT915L +static int goodix_ts_pinctrl_init(struct goodix_ts_data *goodix_data) +{ + int retval; + + goodix_data->ts_pinctrl = devm_pinctrl_get(&(goodix_data->client->dev)); + if (IS_ERR_OR_NULL(goodix_data->ts_pinctrl)) { + retval = PTR_ERR(goodix_data->ts_pinctrl); + dev_dbg(&goodix_data->client->dev, "Target does not use pinctrl %d\n", retval); + goto err_pinctrl_get; + } + goodix_data->pinctrl_state_active = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_ACTIVE); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_active)) { + retval = PTR_ERR(goodix_data->pinctrl_state_active); + dev_err(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_ACTIVE,retval); + goto err_pinctrl_lookup; + } + + goodix_data->pinctrl_state_suspend = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_SUSPEND); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_suspend)) { + retval = PTR_ERR(goodix_data->pinctrl_state_suspend); + dev_err(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_SUSPEND,retval); + goto err_pinctrl_lookup; + } + + goodix_data->pinctrl_state_release = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_RELEASE); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_release)) { + retval = PTR_ERR(goodix_data->pinctrl_state_release); + dev_dbg(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_RELEASE,retval); + } + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(goodix_data->ts_pinctrl); +err_pinctrl_get: + goodix_data->ts_pinctrl = NULL; + return retval; +} + +static void goodix_ts_pinctrl_free(struct goodix_ts_data *goodix_data) +{ + /* Put pinctrl if target uses pinctrl */ + if (!IS_ERR_OR_NULL(goodix_data->ts_pinctrl)) { + devm_pinctrl_put(goodix_data->ts_pinctrl); + goodix_data->ts_pinctrl = NULL; + } +} + +static int goodix_ts_pinctrl_select(struct goodix_ts_data *goodix_data, bool on) +{ + struct pinctrl_state *pins_state; + int ret; + + pins_state = on ? goodix_data->pinctrl_state_active + : goodix_data->pinctrl_state_suspend; + if (!IS_ERR_OR_NULL(pins_state)) { + ret = pinctrl_select_state(goodix_data->ts_pinctrl, pins_state); + if (ret) { + dev_err(&goodix_data->client->dev, + "can not set %s pins\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + return ret; + } + } else { + dev_err(&goodix_data->client->dev, + "not a valid '%s' pinstate\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + } + + return 0; +} + +#endif + +void parse_cmdline_for_gt915(void) +{ + int ret; + char *cmdline_tp; + char *temp; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + if (ret==0) { + gtp_ics_slot_report= 1;/* factory mode*/ + return; + } + } + gtp_ics_slot_report = 0; + return; +} + +static int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, 10); + dev_err(&client->dev, "cmd_line =%s \n", cmd_line); + if (ret == 0) { + dev_err(&client->dev, "mode: ffbm\n"); + return 1;/* factory mode*/ + } else { + dev_err(&client->dev, "mode: no ffbm\n"); + return 2;/* no factory mode*/ + } + } + dev_err(&client->dev, "has no androidboot.mode \n"); + return 0; +} + + +static int gtp_read_lockdown_info(void) +{ + int ret, k; + char buf[2+GTP_LOCKDOWN_SIZE] = {GTP_READ_LOCKDOWN_INFO_ADDR >> 8, GTP_READ_LOCKDOWN_INFO_ADDR & 0xFF}; + ret = gtp_i2c_read(i2c_connect_client, buf, GTP_LOCKDOWN_SIZE+2); + if (ret < 0) { + printk("Read Lockdown info error!"); + return -1; + } + + for (k = 0; k < GTP_LOCKDOWN_SIZE; k++) { + lockdown_info[k] = buf[2+k]; + } + + TP_Maker = lockdown_info[0]; + LCD_Maker = lockdown_info[1]; + Panel_Ink = lockdown_info[2]; + tp_color = lockdown_info[2]; + printk("Lockdown info: %02X %02X %02X %02X %02X %02X %02X %02X", + lockdown_info[0], lockdown_info[1], + lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], + lockdown_info[6], lockdown_info[7]); + + printk("WT: TP_Maker = %d \n", TP_Maker); + printk("WT: LCD_Maker = %d \n", LCD_Maker); + printk("WT: Panel_Ink = %d \n", Panel_Ink); + return 0; +} + +int gtp_hardwareinfo_set(void) +{ + char color[HARDWARE_MAX_ITEM_LONGTH]; + char vendor[HARDWARE_MAX_ITEM_LONGTH]; + int ret; + + gtp_read_lockdown_info(); + switch (tp_color) { + case TP_White: + snprintf(color,HARDWARE_MAX_ITEM_LONGTH,"White"); + break; + case TP_Black: + snprintf(color,HARDWARE_MAX_ITEM_LONGTH,"Black"); + break; + case TP_Golden: + snprintf(color,HARDWARE_MAX_ITEM_LONGTH,"Golden"); + break; + default: + snprintf(color,HARDWARE_MAX_ITEM_LONGTH,"Other Color"); + } + + switch (tp_sensor_id) { + case 1: + snprintf(vendor,HARDWARE_MAX_ITEM_LONGTH,"EACH"); + break; + case 2: + snprintf(vendor,HARDWARE_MAX_ITEM_LONGTH,"BIEL"); + break; + default: + snprintf(vendor, HARDWARE_MAX_ITEM_LONGTH, "Other Vendor"); + } + + ret = gtp_i2c_read_dbl_check(i2c_client_point, GTP_REG_CONFIG_DATA, &cfg_version, 1); + if (ret == FAIL) { + printk("Read IC Config Version Error\n"); + return -1; + } + + printk("IC Config Version: %d, 0x%02x", cfg_version, cfg_version); + sprintf(tp_string_version, "%s,GT915L_%x,V%d,%s", vendor, IC_Version, cfg_version, color); + hardwareinfo_set_prop(HARDWARE_TP, tp_string_version); + return 0; +} + +/******************************************************* +Function: + I2c probe. +Input: + client: i2c device struct. + id: device id. +Output: + Executive outcomes. + 0: succeed. +*******************************************************/ +static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + s32 ret = -1; + struct goodix_ts_data *ts; + u16 version_info; +#ifdef PMX_DRIVER_GT915L + int err; +#endif + + GTP_DEBUG_FUNC(); + + parse_cmdline_for_gt915(); + + GTP_INFO("GTP Driver Version: %s", GTP_DRIVER_VERSION); + GTP_INFO("GTP I2C Address: 0x%02x", client->addr); + + i2c_connect_client = client; + i2c_client_point = client; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + GTP_ERROR("I2C check functionality failed."); + return -ENODEV; + } + ts = kzalloc(sizeof(*ts), GFP_KERNEL); + if (ts == NULL) { + GTP_ERROR("Alloc GFP_KERNEL memory failed."); + return -ENOMEM; + } + + ts->client = client; + +#ifdef GTP_CONFIG_OF /* device tree support */ + if (client->dev.of_node) { + gtp_parse_dt(&client->dev); + } + ret = gtp_power_switch(client, 1); + if (ret) { + GTP_ERROR("GTP power on failed."); + return -EINVAL; + } +#else /* use gpio defined in gt9xx.h */ + gtp_rst_gpio = GTP_RST_PORT; + gtp_int_gpio = GTP_INT_PORT; +#endif + +#ifdef PMX_DRIVER_GT915L + err=goodix_ts_pinctrl_init(ts); + if (!err && ts->ts_pinctrl) { + ret = goodix_ts_pinctrl_select(ts, 1); + if (ret<0) { + dev_err(&client->dev,"can not get idle pin state\n"); + goto gtp_power_off; + } + } +#endif + + INIT_WORK(&ts->work, goodix_ts_work_func); + ts->client = client; + spin_lock_init(&ts->irq_lock); +#if GTP_ESD_PROTECT + ts->clk_tick_cnt = 2 * HZ; + GTP_DEBUG("Clock ticks for an esd cycle: %d", ts->clk_tick_cnt); + spin_lock_init(&ts->esd_lock); +#endif + i2c_set_clientdata(client, ts); + ts->gtp_rawdiff_mode = 0; + ret = gtp_request_io_port(ts); + if (ret < 0) { + GTP_ERROR("GTP request IO port failed."); + kfree(ts); + return ret; + } + +#if GTP_COMPATIBLE_MODE + gtp_get_chip_type(ts); + if (CHIP_TYPE_GT9F == ts->chip_type) { + ret = gtp_gt9xxf_init(ts->client); + if (FAIL == ret) { + GTP_INFO("Failed to init GT9XXF."); + } + } +#endif + + ret = gtp_i2c_test(client); + if (ret < 0) { + GTP_ERROR("I2C communication ERROR!"); + goto free_reset_irq_gpio; + } + + ret = gtp_read_version(client, &version_info); + if (ret < 0) { + GTP_ERROR("Read version failed."); + goto free_reset_irq_gpio; + } + + IC_Version = version_info; + + ret = gtp_init_panel(ts); + if (ret < 0) { + GTP_ERROR("GTP init panel failed."); + ts->abs_x_max = GTP_MAX_WIDTH; + ts->abs_y_max = GTP_MAX_HEIGHT; + ts->int_trigger_type = GTP_INT_TRIGGER; + } + + gt91xx_config_proc = proc_create(GT91XX_CONFIG_PROC_FILE, 0666, NULL, &config_proc_ops); + if (gt91xx_config_proc == NULL) { + GTP_ERROR("create_proc_entry %s failed\n", GT91XX_CONFIG_PROC_FILE); + } else { + GTP_INFO("create proc entry %s success", GT91XX_CONFIG_PROC_FILE); + } + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif + +#if GTP_AUTO_UPDATE + err = get_boot_mode(client); + if (err == 0) { + ret = gup_init_update_proc(ts); + if (ret < 0) { + GTP_ERROR("Create update thread error."); + } + } else { + GTP_INFO("not nomal_boot\n"); + } +#endif + + ret = gtp_request_input_dev(ts); + if (ret < 0) { + GTP_ERROR("GTP request input dev failed"); + } + + ret = gtp_request_irq(ts); + if (ret < 0) { + GTP_INFO("GTP works in polling mode."); + } else { + GTP_INFO("GTP works in interrupt mode."); + } + + if (ts->use_irq) { + gtp_irq_enable(ts); +#if GTP_GESTURE_WAKEUP + enable_irq_wake(client->irq); +#endif + } + +#if WT_ADD_CTP_INFO + gtp_hardwareinfo_set(); +#endif + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO + ctp_lockdown_fucntion_proc_file(); +#endif + + /* register suspend and resume fucntion*/ + gtp_register_powermanger(ts); + +#if GTP_CREATE_WR_NODE + init_wr_node(client); +#endif + return 0; + +free_reset_irq_gpio: + if (gpio_is_valid(gtp_rst_gpio)) + GTP_GPIO_FREE(gtp_rst_gpio); + if (ts->ts_pinctrl) { + err = goodix_ts_pinctrl_select(ts, false); + if (err < 0) + GTP_ERROR("Cannot get idle pinctrl state\n"); + } + + if (gpio_is_valid(gtp_int_gpio)) + GTP_GPIO_FREE(gtp_int_gpio); + if (ts->ts_pinctrl) { + err = goodix_ts_pinctrl_select(ts, false); + if (err < 0) + GTP_ERROR("Cannot get idle pinctrl state\n"); + } + + goodix_ts_pinctrl_free(ts); + +gtp_power_off: + gtp_power_switch(client, 0); + + return err; +} + + +/******************************************************* +Function: + Goodix touchscreen driver release function. +Input: + client: i2c device struct. +Output: + Executive outcomes. 0---succeed. +*******************************************************/ +static int goodix_ts_remove(struct i2c_client *client) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + GTP_DEBUG_FUNC(); + + gtp_unregister_powermanger(ts); + +#if GTP_CREATE_WR_NODE + uninit_wr_node(); +#endif + +#if GTP_ESD_PROTECT + destroy_workqueue(gtp_esd_check_workqueue); +#endif + + if (ts) { + if (ts->use_irq) { + GTP_GPIO_AS_INPUT(gtp_int_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + free_irq(client->irq, ts); + } else { + hrtimer_cancel(&ts->timer); + } + } + + GTP_INFO("GTP driver removing..."); + i2c_set_clientdata(client, NULL); + input_unregister_device(ts->input_dev); + kfree(ts); + + return 0; +} + + +/******************************************************* +Function: + Early suspend function. +Input: + h: early_suspend struct. +Output: + None. +*******************************************************/ +static void goodix_ts_suspend(struct goodix_ts_data *ts) +{ + s8 ret = -1; + + GTP_DEBUG_FUNC(); + if (ts->enter_update) { + return; + } + GTP_INFO("System suspend."); + + ts->gtp_is_suspend = 1; +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + +#if GTP_GESTURE_WAKEUP + GTP_INFO("Gesture gtp_gesture_onoff :%c\n",gtp_gesture_onoff); + if ('1' == gtp_gesture_onoff) + ret = gtp_enter_doze(ts); + else +#endif + { + if (ts->use_irq) { + gtp_irq_disable(ts); + } else { + hrtimer_cancel(&ts->timer); + } + ret = gtp_enter_sleep(ts); + } + + if (ret < 0) { + GTP_ERROR("GTP early suspend failed."); + } + msleep(58); +} + +/******************************************************* +Function: + Late resume function. +Input: + h: early_suspend struct. +Output: + None. +*******************************************************/ +static void goodix_ts_resume(struct goodix_ts_data *ts) +{ + s8 ret = -1; + + GTP_DEBUG_FUNC(); + if (ts->enter_update) { + return; + } + GTP_INFO("System resume."); + + ret = gtp_wakeup_sleep(ts); + +#if GTP_GESTURE_WAKEUP + doze_status = DOZE_DISABLED; +#endif + + if (ret < 0) { + GTP_ERROR("GTP later resume failed."); + } +#if (GTP_COMPATIBLE_MODE) + if (CHIP_TYPE_GT9F == ts->chip_type) { + } else +#endif + { + gtp_send_cfg(ts->client); + } + + if (ts->use_irq) { + GTP_DEBUG("GTP use_irq."); + gtp_irq_enable(ts); + } else { + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + } + + ts->gtp_is_suspend = 0; +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif +} + + +#if defined(CONFIG_FB) +/* frame buffer notifier block control the suspend/resume procedure */ +static int gtp_fb_notifier_callback(struct notifier_block *noti, unsigned long event, void *data) +{ + struct fb_event *ev_data = data; + struct goodix_ts_data *ts = container_of(noti, struct goodix_ts_data, notifier); + int *blank; + + if (ev_data && ev_data->data && event == FB_EVENT_BLANK && ts) { + blank = ev_data->data; + if (*blank == FB_BLANK_UNBLANK) { + GTP_DEBUG("Resume by fb notifier."); + goodix_ts_resume(ts); + + } else if (*blank == FB_BLANK_POWERDOWN) { + GTP_DEBUG("Suspend by fb notifier."); + goodix_ts_suspend(ts); + } + } + + return 0; +} +#elif defined(CONFIG_PM) +/* bus control the suspend/resume procedure */ +static int gtp_pm_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts) { + GTP_DEBUG("Suspend by i2c pm."); + goodix_ts_suspend(ts); + } + + return 0; +} +static int gtp_pm_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts) { + GTP_DEBUG("Resume by i2c pm."); + goodix_ts_resume(ts); + } + + return 0; +} + +static struct dev_pm_ops gtp_pm_ops = { + .suspend = gtp_pm_suspend, + .resume = gtp_pm_resume, +}; + +#elif defined(CONFIG_HAS_EARLYSUSPEND) +/* earlysuspend module the suspend/resume procedure */ +static void gtp_early_suspend(struct early_suspend *h) { + struct goodix_ts_data *ts = container_of(h, struct goodix_ts_data, early_suspend); + + if (ts) { + GTP_DEBUG("Suspend by earlysuspend module."); + goodix_ts_suspend(ts); + } +} +static void gtp_early_resume(struct early_suspend *h) +{ + struct goodix_ts_data *ts = container_of(h, struct goodix_ts_data, early_suspend); + + if (ts) { + GTP_DEBUG("Resume by earlysuspend module."); + goodix_ts_resume(ts); + } +} +#endif + +static int gtp_register_powermanger(struct goodix_ts_data *ts) +{ +#if defined(CONFIG_FB) + ts->notifier.notifier_call = gtp_fb_notifier_callback; + fb_register_client(&ts->notifier); + +#elif defined(CONFIG_HAS_EARLYSUSPEND) + ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + ts->early_suspend.suspend = goodix_ts_early_suspend; + ts->early_suspend.resume = goodix_ts_late_resume; + register_early_suspend(&ts->early_suspend); +#endif + + return 0; +} + +static int gtp_unregister_powermanger(struct goodix_ts_data *ts) +{ +#if defined(CONFIG_FB) + fb_unregister_client(&ts->notifier); + +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&ts->early_suspend); +#endif + return 0; +} + +/* end */ + +#if GTP_ESD_PROTECT +s32 gtp_i2c_read_no_rst(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + if ((retries >= 5)) { + GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d!", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + } + return ret; +} + +s32 gtp_i2c_write_no_rst(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1) + break; + retries++; + } + if ((retries >= 5)) { + GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d!", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + } + return ret; +} +/******************************************************* +Function: + switch on & off esd delayed work +Input: + client: i2c device + on: SWITCH_ON / SWITCH_OFF +Output: + void +*********************************************************/ +void gtp_esd_switch(struct i2c_client *client, s32 on) +{ + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(client); + spin_lock(&ts->esd_lock); + + if (SWITCH_ON == on) { + if (!ts->esd_running) { + ts->esd_running = 1; + spin_unlock(&ts->esd_lock); + GTP_INFO("Esd started"); + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); + } else { + spin_unlock(&ts->esd_lock); + } + } else { + if (ts->esd_running) { + ts->esd_running = 0; + spin_unlock(&ts->esd_lock); + GTP_INFO("Esd cancelled"); + cancel_delayed_work_sync(>p_esd_check_work); + } else { + spin_unlock(&ts->esd_lock); + } + } +} + +/******************************************************* +Function: + Initialize external watchdog for esd protect +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ +static s32 gtp_init_ext_watchdog(struct i2c_client *client) +{ + u8 opr_buffer[3] = {0x80, 0x41, 0xAA}; + GTP_DEBUG("[Esd]Init external watchdog"); + return gtp_i2c_write_no_rst(client, opr_buffer, 3); +} + +/******************************************************* +Function: + Esd protect function. + External watchdog added by meta, 2013/03/07 +Input: + work: delayed work +Output: + None. +*******************************************************/ +static void gtp_esd_check_func(struct work_struct *work) +{ + s32 i; + s32 ret = -1; + struct goodix_ts_data *ts = NULL; + u8 esd_buf[5] = {0x80, 0x40}; + + GTP_DEBUG_FUNC(); + + ts = i2c_get_clientdata(i2c_connect_client); + + if (ts->gtp_is_suspend || ts->enter_update) { + GTP_INFO("Esd suspended!"); + return; + } + + for (i = 0; i < 3; i++) { + ret = gtp_i2c_read_no_rst(ts->client, esd_buf, 4); + + GTP_DEBUG("[Esd]0x8040 = 0x%02X, 0x8041 = 0x%02X", esd_buf[2], esd_buf[3]); + if ((ret < 0)) { + continue; + } else { + if ((esd_buf[2] == 0xAA) || (esd_buf[3] != 0xAA)) { + u8 chk_buf[4] = {0x80, 0x40}; + + gtp_i2c_read_no_rst(ts->client, chk_buf, 4); + GTP_DEBUG("[Check]0x8040 = 0x%02X, 0x8041 = 0x%02X", chk_buf[2], chk_buf[3]); + if ((chk_buf[2] == 0xAA) || (chk_buf[3] != 0xAA)) { + i = 3; + break; + } else { + continue; + } + } else { + esd_buf[2] = 0xAA; + gtp_i2c_write_no_rst(ts->client, esd_buf, 3); + break; + } + } + } + if (i >= 3) { + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + if (ts->rqst_processing) { + GTP_INFO("Request processing, no esd recovery"); + } else { + GTP_ERROR("IC working abnormally! Process esd recovery."); + esd_buf[0] = 0x42; + esd_buf[1] = 0x26; + esd_buf[2] = 0x01; + esd_buf[3] = 0x01; + esd_buf[4] = 0x01; + gtp_i2c_write_no_rst(ts->client, esd_buf, 5); + msleep(50); + #ifdef GTP_CONFIG_OF + gtp_power_switch(ts->client, 0); + msleep(20); + gtp_power_switch(ts->client, 1); + msleep(20); + #endif + gtp_esd_recovery(ts->client); + } + } else + #endif + { + GTP_ERROR("IC working abnormally! Process reset guitar."); + esd_buf[0] = 0x42; + esd_buf[1] = 0x26; + esd_buf[2] = 0x01; + esd_buf[3] = 0x01; + esd_buf[4] = 0x01; + gtp_i2c_write_no_rst(ts->client, esd_buf, 5); + msleep(50); + #ifdef GTP_CONFIG_OF + gtp_power_switch(ts->client, 0); + msleep(20); + gtp_power_switch(ts->client, 1); + msleep(20); + #endif + gtp_reset_guitar(ts->client, 50); + msleep(50); + gtp_send_cfg(ts->client); + } + } + + if (!ts->gtp_is_suspend) { + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); + } else { + GTP_INFO("Esd suspended!"); + } + return; +} +#endif + +#ifdef GTP_CONFIG_OF +static const struct of_device_id goodix_match_table[] = { + {.compatible = "goodix,gt9xx",}, + { }, +}; +#endif + +static const struct i2c_device_id goodix_ts_id[] = { + { GTP_I2C_NAME, 0 }, + { } +}; + +static struct i2c_driver goodix_ts_driver = { + .probe = goodix_ts_probe, + .remove = goodix_ts_remove, + .id_table = goodix_ts_id, + .driver = { + .name = GTP_I2C_NAME, + .owner = THIS_MODULE, +#ifdef GTP_CONFIG_OF + .of_match_table = goodix_match_table, +#endif +#if !defined(CONFIG_FB) && defined(CONFIG_PM) + .pm = >p_pm_ops, +#endif + }, +}; + +/******************************************************* +Function: + Driver Install function. +Input: + None. +Output: + Executive Outcomes. 0---succeed. +********************************************************/ + +static int __init goodix_ts_init(void) +{ + s32 ret; + + GTP_DEBUG_FUNC(); + GTP_INFO("GTP driver installing..."); + goodix_wq = create_singlethread_workqueue("goodix_wq"); + if (!goodix_wq) { + GTP_ERROR("Creat workqueue failed."); + return -ENOMEM; + } +#if GTP_ESD_PROTECT + INIT_DELAYED_WORK(>p_esd_check_work, gtp_esd_check_func); + gtp_esd_check_workqueue = create_workqueue("gtp_esd_check"); +#endif + ret = i2c_add_driver(&goodix_ts_driver); + return ret; +} + +/******************************************************* +Function: + Driver uninstall function. +Input: + None. +Output: + Executive Outcomes. 0---succeed. +********************************************************/ +static void __exit goodix_ts_exit(void) +{ + GTP_DEBUG_FUNC(); + GTP_INFO("GTP driver exited."); + i2c_del_driver(&goodix_ts_driver); + if (goodix_wq) { + destroy_workqueue(goodix_wq); + } +} + +device_initcall_sync(goodix_ts_init); +module_exit(goodix_ts_exit); + +MODULE_DESCRIPTION("GTP Series Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/GT915L/gt9xx.h b/drivers/input/touchscreen/GT915L/gt9xx.h new file mode 100644 index 0000000000000..15462378706c1 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/gt9xx.h @@ -0,0 +1,370 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#ifndef _GOODIX_GT9XX_H_ +#define _GOODIX_GT9XX_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_OF +#include +#include +#endif +#ifdef CONFIG_FB +#include +#include +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#ifndef GTP_CONFIG_OF +#define GTP_CONFIG_OF +#endif + +#ifndef CONFIG_PM +#define CONFIG_PM +#endif + +#define PMX_DRIVER_GT915L + + +#define GTP_CUSTOM_CFG 1 +#define GTP_CHANGE_X2Y 0 +#define GTP_DRIVER_SEND_CFG 1 +#define GTP_HAVE_TOUCH_KEY 1 +#define GTP_POWER_CTRL_SLEEP 0 +#define GTP_ICS_SLOT_REPORT 1 + +#define GTP_AUTO_UPDATE 1 +#define GTP_HEADER_FW_UPDATE 1 +#define GTP_AUTO_UPDATE_CFG 0 + +#define GTP_COMPATIBLE_MODE 0 + +#define GTP_CREATE_WR_NODE 1 +#define GTP_ESD_PROTECT 1 + +#define GTP_WITH_PEN 0 +#define GTP_PEN_HAVE_BUTTON 0 + +#define GTP_GESTURE_WAKEUP 1 +#if GTP_GESTURE_WAKEUP +#define GTP_GESTURE_TPYE_STR "RLUDKcemosvwz" +#define GTP_GESTURE_SUPPORT_ONOFF 'Y' +#define GTP_PROC_DRIVER_VERSION "GTP_V1.0_20160606" +#define GTP_GESTURE_MAX_POINT_COUNT 64 +#define MXT_INPUT_EVENT_START 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define MXT_INPUT_EVENT_STYLUS_MODE_OFF 2 +#define MXT_INPUT_EVENT_STYLUS_MODE_ON 3 +#define MXT_INPUT_EVENT_WAKUP_MODE_OFF 4 +#define MXT_INPUT_EVENT_WAKUP_MODE_ON 5 +#define MXT_INPUT_EVENT_EDGE_DISABLE 6 +#define MXT_INPUT_EVENT_EDGE_FINGER 7 +#define MXT_INPUT_EVENT_EDGE_HANDGRIP 8 +#define MXT_INPUT_EVENT_EDGE_FINGER_HANDGRIP 9 +#define MXT_INPUT_EVENT_END 9 +#endif + +#define GTP_GLOVE_MODE 1 +#if GTP_GLOVE_MODE +#define GTP_GLOVE_SUPPORT_ONOFF 'Y' +#endif + +#define WT_ADD_CTP_INFO 1 + +#define GTP_DEBUG_ON 0 +#define GTP_DEBUG_ARRAY_ON 0 +#define GTP_DEBUG_FUNC_ON 0 + +#if GTP_COMPATIBLE_MODE +typedef enum { + CHIP_TYPE_GT9 = 0, + CHIP_TYPE_GT9F = 1, +} CHIP_TYPE_T; +#endif + +struct goodix_ts_data { + spinlock_t irq_lock; + struct i2c_client *client; + struct input_dev *input_dev; + struct hrtimer timer; + struct work_struct work; + s32 irq_is_disable; + s32 use_irq; + u16 abs_x_max; + u16 abs_y_max; + u8 max_touch_num; + u8 int_trigger_type; + u8 green_wake_mode; + u8 enter_update; + u8 gtp_is_suspend; + u8 gtp_rawdiff_mode; + int gtp_cfg_len; + u8 fw_error; + u8 pnl_init_error; + +#if defined(CONFIG_FB) + struct notifier_block notifier; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + +#if GTP_WITH_PEN + struct input_dev *pen_dev; +#endif + +#if GTP_ESD_PROTECT + spinlock_t esd_lock; + u8 esd_running; + s32 clk_tick_cnt; +#endif +#if GTP_COMPATIBLE_MODE + u16 bak_ref_len; + s32 ref_chk_fs_times; + s32 clk_chk_fs_times; + CHIP_TYPE_T chip_type; + u8 rqst_processing; + u8 is_950; +#endif + +#ifdef PMX_DRIVER_GT915L + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + struct pinctrl_state *pinctrl_state_release; + + struct pinctrl_state *pinctrl_state_int_active; + struct pinctrl_state *pinctrl_state_reset_active; +#endif +}; + +extern u16 show_len; +extern u16 total_len; + + +extern unsigned int gtp_rst_gpio; +extern unsigned int gtp_int_gpio; + + + + + +/* sensor_opt1 sensor_opt2 Sensor_ID + GND GND 0 + VDDIO GND 1 + NC GND 2 + GND NC/300K 3 + VDDIO NC/300K 4 + NC NC/300K 5 +*/ + + +#define CTP_CFG_GROUP0 {\ + 0x41, 0xD0, 0x02, 0x00, 0x05, 0x05, 0x75, 0x01, 0x01, 0x0F, 0x24, \ + 0x0F, 0x64, 0x3C, 0x03, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, \ + 0x00, 0x16, 0x19, 0x1C, 0x14, 0x8C, 0x0E, 0x0E, 0x24, 0x00, 0x31, \ + 0x0D, 0x00, 0x00, 0x00, 0x83, 0x33, 0x1D, 0x00, 0x41, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x2B, 0x1C, 0x3C, 0x94, 0xD5, \ + 0x03, 0x08, 0x00, 0x00, 0x04, 0x93, 0x1E, 0x00, 0x82, 0x23, 0x00, \ + 0x74, 0x29, 0x00, 0x69, 0x2F, 0x00, 0x5F, 0x37, 0x00, 0x5F, 0x20, \ + 0x40, 0x60, 0x00, 0xF0, 0x40, 0x30, 0x55, 0x50, 0x27, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x19, 0x00, 0x00, \ + 0x50, 0x50, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x10, 0x12, \ + 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, \ + 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x24, 0x26, 0x28, 0x29, 0x2A, 0x1C, \ + 0x18, 0x16, 0x14, 0x13, 0x12, 0x10, 0x0F, 0x0C, 0x0A, 0x08, 0x06, \ + 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x01\ + } + + +#define CTP_CFG_GROUP1 {\ +0x41, 0xD0, 0x02, 0x00, 0x05, 0x05, 0x04, 0xC1, 0x12, 0x0F, 0x28, 0x0A, 0x50, 0x32, 0x03, 0x05, 0x00, 0x00, 0xFF, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x2C, 0x0D, 0x3C, 0x3E, 0xD3, 0x07, 0x0F, 0x0F, 0x00, 0x99, 0x33, 0x10, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x29, 0x28, 0x5A, 0x94, 0x85, 0x02, 0x07, 0x00, 0x00, 0x04, 0xA9, 0x2B, 0x00, 0x92, 0x33, 0x00, 0x80, 0x3C, 0x00, 0x71, 0x46, 0x00, 0x63, 0x53, 0x00, 0x63, 0x18, 0x38, 0x58, 0x00, 0xF0, 0x4A, 0x3A, 0x77, 0x77, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x42, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x50, 0x3C, 0x02, 0x04, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x08, 0x06, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x5A, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x12, 0x13, 0x14, 0x0C, 0x0A, 0x08, 0x06, 0x04, 0x02, 0x00, 0x16, 0x18, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x24, 0x28, 0x26, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x01\ + } + + +#define CTP_CFG_GROUP2 {\ +0x49, 0xD0, 0x02, 0x00, 0x05, 0x0A, 0x04, 0xC1, 0x12, 0x3F, 0x25, 0x0A, 0x5A, 0x3C, 0x03, 0x05, 0x00, 0x00, 0x00, 0x67, 0x11, 0x11, 0x30, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x2C, 0x0D, 0x3C, 0x3E, 0xD3, 0x07, 0xD3, 0x07, 0x00, 0x9A, 0x33, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x28, 0x5A, 0x94, 0x80, 0x02, 0x0B, 0x00, 0x00, 0x04, 0xA9, 0x2B, 0x00, 0x92, 0x33, 0x1E, 0x80, 0x3C, 0x00, 0x71, 0x46, 0x00, 0x63, 0x53, 0x00, 0x63, 0x18, 0x38, 0x58, 0x00, 0xF0, 0x4A, 0x3A, 0x77, 0x77, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x50, 0x0F, 0x00, 0x00, 0x50, 0x3C, 0x02, 0x04, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x0A, 0x08, 0x06, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x28, 0x26, 0x24, 0x0C, 0x0A, 0x0F, 0x08, 0x10, 0x06, 0x12, 0x04, 0x13, 0x02, 0x14, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x01\ +} + + +#define CTP_CFG_GROUP3 {\ +} + +#define CTP_CFG_GROUP4 {\ + } + + +#define CTP_CFG_GROUP5 {\ + } + + +#define CTP_CFG_GROUP1_GLOVE {\ +0x44, 0x38, 0x04, 0x80, 0x07, 0x0A, 0x04, 0xC1, 0x12, 0x3F, 0x28, 0x0A, 0x50, 0x32, 0x03, 0x05, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x2C, 0x0E, 0x3C, 0x3E, 0xD3, 0x07, 0xD3, 0x07, 0x00, 0xF8, 0x33, 0x90, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x29, 0x32, 0x5A, 0x94, 0x85, 0x02, 0x80, 0x00, 0x00, 0x04, 0x8C, 0x35, 0x00, 0x81, 0x3B, 0x1E, 0x76, 0x43, 0x00, 0x6D, 0x4B, 0x00, 0x65, 0x55, 0x00, 0x65, 0x18, 0x40, 0x60, 0x00, 0xF0, 0x50, 0x3A, 0x77, 0x77, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x67, 0x00, 0x00, 0x00, 0x06, 0x00, 0x42, 0xF8, 0x0F, 0x00, 0x0F, 0x50, 0x0F, 0x00, 0x00, 0x50, 0x3C, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x0A, 0x08, 0x06, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x06, 0x08, 0x0A, 0x0C, 0x0F, 0x10, 0x12, 0x13, 0x14, 0x28, 0x26, 0x24, 0x22, 0x21, 0x20, 0x1F, 0x1E, 0x1D, 0x1C, 0x18, 0x16, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x01\ + } + + + + +#define GTP_RST_PORT 16 +#define GTP_INT_PORT 17 + +#define GTP_GPIO_AS_INPUT(pin) do {\ + gpio_direction_input(pin);\ + } while (0) +#define GTP_GPIO_AS_INT(pin) do {\ + GTP_GPIO_AS_INPUT(pin);\ + } while (0) +#define GTP_GPIO_GET_VALUE(pin) gpio_get_value(pin) +#define GTP_GPIO_OUTPUT(pin, level) gpio_direction_output(pin, level) +#define GTP_GPIO_REQUEST(pin, label) gpio_request(pin, label) +#define GTP_GPIO_FREE(pin) gpio_free(pin) +#define GTP_IRQ_TAB {IRQ_TYPE_EDGE_RISING, IRQ_TYPE_EDGE_FALLING, IRQ_TYPE_LEVEL_LOW, IRQ_TYPE_LEVEL_HIGH} + + +#if GTP_CUSTOM_CFG + #define GTP_MAX_HEIGHT 1280 + #define GTP_MAX_WIDTH 720 + #define GTP_INT_TRIGGER 0 +#else + #define GTP_MAX_HEIGHT 1280 + #define GTP_MAX_WIDTH 720 + #define GTP_INT_TRIGGER 1 +#endif +#define GTP_MAX_TOUCH 10 + + +#if GTP_HAVE_TOUCH_KEY + + #define GTP_KEY_TAB {KEY_MENU, KEY_HOMEPAGE, KEY_BACK} +#endif + + +#define GTP_DRIVER_VERSION "V2.4<2014/11/28>" +#define GTP_I2C_NAME "Goodix-TS" +#define GT91XX_CONFIG_PROC_FILE "gt9xx_config" +#define GTP_POLL_TIME 10 +#define GTP_ADDR_LENGTH 2 +#define GTP_CONFIG_MIN_LENGTH 186 +#define GTP_CONFIG_MAX_LENGTH 240 +#define FAIL 0 +#define SUCCESS 1 +#define SWITCH_OFF 0 +#define SWITCH_ON 1 + + +#define GTP_REG_BAK_REF 0x99D0 +#define GTP_REG_MAIN_CLK 0x8020 +#define GTP_REG_CHIP_TYPE 0x8000 +#define GTP_REG_HAVE_KEY 0x804E +#define GTP_REG_MATRIX_DRVNUM 0x8069 +#define GTP_REG_MATRIX_SENNUM 0x806A + +#define GTP_FL_FW_BURN 0x00 +#define GTP_FL_ESD_RECOVERY 0x01 +#define GTP_FL_READ_REPAIR 0x02 + +#define GTP_BAK_REF_SEND 0 +#define GTP_BAK_REF_STORE 1 +#define CFG_LOC_DRVA_NUM 29 +#define CFG_LOC_DRVB_NUM 30 +#define CFG_LOC_SENS_NUM 31 + +#define GTP_CHK_FW_MAX 40 +#define GTP_CHK_FS_MNT_MAX 300 +#define GTP_BAK_REF_PATH "/data/gtp_ref.bin" +#define GTP_MAIN_CLK_PATH "/data/gtp_clk.bin" +#define GTP_RQST_CONFIG 0x01 +#define GTP_RQST_BAK_REF 0x02 +#define GTP_RQST_RESET 0x03 +#define GTP_RQST_MAIN_CLOCK 0x04 +#define GTP_RQST_RESPONDED 0x00 +#define GTP_RQST_IDLE 0xFF + + + +#define GTP_READ_COOR_ADDR 0x814E +#define GTP_REG_SLEEP 0x8040 +#define GTP_REG_SENSOR_ID 0x814A +#define GTP_REG_CONFIG_DATA 0x8047 +#define GTP_REG_VERSION 0x8140 + +#define RESOLUTION_LOC 3 +#define TRIGGER_LOC 8 + +#define CFG_GROUP_LEN(p_cfg_grp) (sizeof(p_cfg_grp) / sizeof(p_cfg_grp[0])) + +#define GTP_INFO(fmt, arg...) printk("<<-GTP-INFO->> "fmt"\n", ##arg) +#define GTP_ERROR(fmt, arg...) printk("<<-GTP-ERROR->> "fmt"\n", ##arg) +#define GTP_DEBUG(fmt, arg...) do {\ + if (GTP_DEBUG_ON)\ + printk("<<-GTP-DEBUG->> [%d]"fmt"\n", __LINE__, ##arg);\ + } while (0) +#define GTP_DEBUG_ARRAY(array, num) do {\ + s32 i;\ + u8 *a = array;\ + if (GTP_DEBUG_ARRAY_ON)\ + {\ + printk("<<-GTP-DEBUG-ARRAY->>\n");\ + for (i = 0; i < (num); i++)\ + {\ + printk("%02x ", (a)[i]);\ + if ((i + 1) % 10 == 0)\ + {\ + printk("\n");\ + } \ + } \ + printk("\n");\ + } \ + } while (0) +#define GTP_DEBUG_FUNC() do {\ + if (GTP_DEBUG_FUNC_ON)\ + printk("<<-GTP-FUNC->> Func:%s@Line:%d\n", __func__, __LINE__);\ + } while (0) +#define GTP_SWAP(x, y) do {\ + typeof(x) z = x;\ + x = y;\ + y = z;\ + } while (0) + + +#ifdef CONFIG_OF +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid); +#endif +#endif /* _GOODIX_GT9XX_H_ */ diff --git a/drivers/input/touchscreen/GT915L/gt9xx_firmware.h b/drivers/input/touchscreen/GT915L/gt9xx_firmware.h new file mode 100644 index 0000000000000..4ba50cf969925 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/gt9xx_firmware.h @@ -0,0 +1,43 @@ +/* Copyright Statement: + * This firmware are protected under relevant copyright laws,this information contained + * herein is confidential and proprietary to Goodix. + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * WARNING:The GTP_COMPATIBLE_MODE part of this file was generated by the specialized tools, + * please do not modify it manually! + * +*/ + +#ifndef _GT9XX_FIRMWARE_H_ +#define _GT9XX_FIRMWARE_H_ + + +#if GTP_HEADER_FW_UPDATE + + +#define WT_ADD_FW_BIEL + +unsigned char gtp_default_FW[] = { + +#ifdef WT_ADD_FW_EACH + #include "FW_EACH.txt" +#elif defined WT_ADD_FW_BIEL + #include "FW_BIEL.txt" +#endif +}; +#endif + +/* +*[HW INFO]00900600 +*[PID]910 +*[VID]1010 +*[GENERATED]2013/08/27 20:59:13 +*/ +#if GTP_COMPATIBLE_MODE +unsigned char gtp_default_FW_fl[] = { +}; +#endif + +#endif diff --git a/drivers/input/touchscreen/GT915L/gt9xx_update.c b/drivers/input/touchscreen/GT915L/gt9xx_update.c new file mode 100644 index 0000000000000..e0ccddc95b795 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/gt9xx_update.c @@ -0,0 +1,3251 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#include +#include "gt9xx.h" + +#include +#include +#if ((GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) || GTP_COMPATIBLE_MODE) + #include "gt9xx_firmware.h" +#endif + +#define GUP_REG_HW_INFO 0x4220 +#define GUP_REG_FW_MSG 0x41E4 +#define GUP_REG_PID_VID 0x8140 + +#define GUP_SEARCH_FILE_TIMES 50 + +#define UPDATE_FILE_PATH_1 "/data/_goodix_update_.bin" +#define UPDATE_FILE_PATH_2 "/sdcard/_goodix_update_.bin" + +#define CONFIG_FILE_PATH_1 "/data/_goodix_config_.cfg" +#define CONFIG_FILE_PATH_2 "/sdcard/_goodix_config_.cfg" + +#define FW_HEAD_LENGTH 14 +#define FW_SECTION_LENGTH 0x2000 +#define FW_DSP_ISP_LENGTH 0x1000 +#define FW_DSP_LENGTH 0x1000 +#define FW_BOOT_LENGTH 0x800 +#define FW_SS51_LENGTH (4 * FW_SECTION_LENGTH) +#define FW_BOOT_ISP_LENGTH 0x800 +#define FW_GLINK_LENGTH 0x3000 +#define FW_GWAKE_LENGTH (4 * FW_SECTION_LENGTH) + +#define PACK_SIZE 256 +#define MAX_FRAME_CHECK_TIME 5 + + +#define _bRW_MISCTL__SRAM_BANK 0x4048 +#define _bRW_MISCTL__MEM_CD_EN 0x4049 +#define _bRW_MISCTL__CACHE_EN 0x404B +#define _bRW_MISCTL__TMR0_EN 0x40B0 +#define _rRW_MISCTL__SWRST_B0_ 0x4180 +#define _bWO_MISCTL__CPU_SWRST_PULSE 0x4184 +#define _rRW_MISCTL__BOOTCTL_B0_ 0x4190 +#define _rRW_MISCTL__BOOT_OPT_B0_ 0x4218 +#define _rRW_MISCTL__BOOT_CTL_ 0x5094 + +#define AUTO_SEARCH_BIN 0x01 +#define AUTO_SEARCH_CFG 0x02 +#define BIN_FILE_READY 0x80 +#define CFG_FILE_READY 0x08 +#define HEADER_FW_READY 0x00 + +#pragma pack(1) +typedef struct { + u8 hw_info[4]; + u8 pid[8]; + u16 vid; +} st_fw_head; +#pragma pack() + +typedef struct { + u8 force_update; + u8 fw_flag; + struct file *file; + struct file *cfg_file; + st_fw_head ic_fw_msg; + mm_segment_t old_fs; + u32 fw_total_len; + u32 fw_burned_len; +} st_update_msg; + +st_update_msg update_msg; +u16 show_len; +u16 total_len; +u8 got_file_flag = 0; +u8 searching_file = 0; + + +int FW_VERSION_ID; +static u8 GTP_FW_SENSOR_ID; + +#if WT_ADD_CTP_INFO +extern int gtp_hardwareinfo_set(void); +#endif + +extern u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH]; +extern void gtp_reset_guitar(struct i2c_client *client, s32 ms); +extern s32 gtp_send_cfg(struct i2c_client *client); +extern s32 gtp_read_version(struct i2c_client *, u16*); +extern struct i2c_client *i2c_connect_client; +extern void gtp_irq_enable(struct goodix_ts_data *ts); +extern void gtp_irq_disable(struct goodix_ts_data *ts); +extern s32 gtp_i2c_read_dbl_check(struct i2c_client *, u16, u8 *, int); +static u8 gup_burn_fw_gwake_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd); + +#define _CLOSE_FILE(p_file) if (p_file && !IS_ERR(p_file)) \ + { \ + filp_close(p_file, NULL); \ + } + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *, s32); +#endif + +#if GTP_COMPATIBLE_MODE +s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +#endif +/******************************************************* +Function: + Read data from the i2c slave device. +Input: + client: i2c device. + buf[0~1]: read start address. + buf[2~len-1]: read data buffer. + len: GTP_ADDR_LENGTH + read bytes count +Output: + numbers of i2c_msgs to transfer: + 2: succeed, otherwise: failed +*********************************************************/ +s32 gup_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + + return ret; +} + +/******************************************************* +Function: + Write data to the i2c slave device. +Input: + client: i2c device. + buf[0~1]: write start address. + buf[2~len-1]: data buffer + len: GTP_ADDR_LENGTH + write bytes count +Output: + numbers of i2c_msgs to transfer: + 1: succeed, otherwise: failed +*********************************************************/ +s32 gup_i2c_write(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1) + break; + retries++; + } + + return ret; +} + +static s32 gup_init_panel(struct goodix_ts_data *ts) +{ + s32 ret = 0; + s32 i = 0; + u8 check_sum = 0; + u8 opr_buf[16]; + u8 sensor_id = 0; + u16 version = 0; + u8 drv_cfg_version; + u8 flash_cfg_version; + +#ifndef GTP_CONFIG_OF + u8 cfg_info_group0[] = CTP_CFG_GROUP0; + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + u8 *send_cfg_buf[] = {cfg_info_group0, cfg_info_group1, + cfg_info_group2, cfg_info_group3, + cfg_info_group4, cfg_info_group5}; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group0), + CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5)}; + #endif + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) { + if (sensor_id >= 0x06) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + return -EPERM; + } + } else { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + return -EPERM; + } + + /* parse config data*/ +#ifdef GTP_CONFIG_OF + GTP_DEBUG("Get config data from dts file."); + ret = gtp_parse_dt_cfg(&ts->client->dev, &config[GTP_ADDR_LENGTH], &ts->gtp_cfg_len, sensor_id); + if (ret < 0) { + GTP_ERROR("Failed to parse config data form dts file."); + ts->pnl_init_error = 1; + return -EPERM; + } +#else + GTP_DEBUG("Get config data from header file."); + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) { + sensor_id = 0; + } + ts->gtp_cfg_len = cfg_info_len[sensor_id]; + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len); +#endif + + GTP_DEBUG("Sensor_ID: %d", sensor_id); + + if (ts->gtp_cfg_len < GTP_CONFIG_MIN_LENGTH) { + GTP_ERROR("Sensor_ID(%d) matches with NULL or INVALID CONFIG GROUP! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id); + return -EPERM; + } + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + if (ret == SUCCESS) { + GTP_DEBUG("CFG_GROUP%d Config Version: %d, IC Config Version: %d", sensor_id, + config[GTP_ADDR_LENGTH], opr_buf[0]); + + flash_cfg_version = opr_buf[0]; + drv_cfg_version = config[GTP_ADDR_LENGTH]; + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + config[GTP_ADDR_LENGTH] = 0x00; + } + } else { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -EPERM; + } + + GTP_DEBUG("X_MAX = %d, Y_MAX = %d, TRIGGER = 0x%02x", + ts->abs_x_max, ts->abs_y_max, ts->int_trigger_type); + + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) { + config[TRIGGER_LOC] &= 0xfe; + } else if (GTP_INT_TRIGGER == 1) { + config[TRIGGER_LOC] |= 0x01; + } + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + + GTP_DEBUG_FUNC(); + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Send config error."); + } + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + check_sum = 0; + config[GTP_ADDR_LENGTH] = drv_cfg_version; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + } + gtp_read_version(ts->client, &version); + msleep(10); + return 0; +} + + +static u8 gup_get_ic_msg(struct i2c_client *client, u16 addr, u8 *msg, s32 len) +{ + s32 i = 0; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + + for (i = 0; i < 5; i++) { + if (gup_i2c_read(client, msg, GTP_ADDR_LENGTH + len) > 0) { + break; + } + } + + if (i >= 5) { + GTP_ERROR("Read data from 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_set_ic_msg(struct i2c_client *client, u16 addr, u8 val) +{ + s32 i = 0; + u8 msg[3]; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + msg[2] = val; + + for (i = 0; i < 5; i++) { + if (gup_i2c_write(client, msg, GTP_ADDR_LENGTH + 1) > 0) { + break; + } + } + + if (i >= 5) { + GTP_ERROR("Set data to 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_get_ic_fw_msg(struct i2c_client *client) +{ + s32 ret = -1; + u8 retry = 0; + u8 buf[16]; + u8 i; + + + ret = gtp_i2c_read_dbl_check(client, GUP_REG_HW_INFO, &buf[GTP_ADDR_LENGTH], 4); + if (FAIL == ret) { + GTP_ERROR("[get_ic_fw_msg]get hw_info failed,exit"); + return FAIL; + } + + + + for (i = 0; i < 4; i++) { + update_msg.ic_fw_msg.hw_info[i] = buf[GTP_ADDR_LENGTH + 3 - i]; + } + GTP_DEBUG("IC Hardware info:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + + for (retry = 0; retry < 2; retry++) { + ret = gup_get_ic_msg(client, GUP_REG_FW_MSG, buf, 1); + if (FAIL == ret) { + GTP_ERROR("Read firmware message fail."); + return ret; + } + + update_msg.force_update = buf[GTP_ADDR_LENGTH]; + if ((0xBE != update_msg.force_update) && (!retry)) { + GTP_INFO("The check sum in ic is error."); + GTP_INFO("The IC will be updated by force."); + continue; + } + break; + } + GTP_DEBUG("IC force update flag:0x%x", update_msg.force_update); + + + ret = gtp_i2c_read_dbl_check(client, GUP_REG_PID_VID, &buf[GTP_ADDR_LENGTH], 6); + if (FAIL == ret) { + GTP_ERROR("[get_ic_fw_msg]get pid & vid failed,exit"); + return FAIL; + } + + memset(update_msg.ic_fw_msg.pid, 0, sizeof(update_msg.ic_fw_msg.pid)); + memcpy(update_msg.ic_fw_msg.pid, &buf[GTP_ADDR_LENGTH], 4); + GTP_DEBUG("IC Product id:%s", update_msg.ic_fw_msg.pid); + + + /*|-----FLASH-----RAM-----| + |------918------918-----| + |------968------968-----| + |------913------913-----| + |------913P-----913P----| + |------927------927-----| + |------927P-----927P----| + |------9110-----9110----| + |------9110P----9111----|*/ + if (update_msg.ic_fw_msg.pid[0] != 0) { + if (!memcmp(update_msg.ic_fw_msg.pid, "9111", 4)) { + GTP_DEBUG("IC Mapping Product id:%s", update_msg.ic_fw_msg.pid); + memcpy(update_msg.ic_fw_msg.pid, "9110P", 5); + } + } + + update_msg.ic_fw_msg.vid = buf[GTP_ADDR_LENGTH+4] + (buf[GTP_ADDR_LENGTH+5]<<8); + GTP_DEBUG("IC version id:%04x", update_msg.ic_fw_msg.vid); + + return SUCCESS; +} + +s32 gup_enter_update_mode(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_int_gpio, (client->addr == 0x14)); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + + msleep(5); + while (retry++ < 200) { + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if (0x0C == rd_buf[GTP_ADDR_LENGTH]) { + GTP_DEBUG("Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if (retry >= 200) { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, 0x4010, 0x00); + + + return ret; +} + +void gup_leave_update_mode(void) +{ + GTP_GPIO_AS_INT(gtp_int_gpio); + + GTP_DEBUG("[leave_update_mode]reset chip."); + gtp_reset_guitar(i2c_connect_client, 20); +} + + + + + + + +/* Update Conditions: + 1. Same hardware info + 2. Same PID + 3. File VID > IC VID + Force Update Conditions: + 1. Wrong ic firmware checksum + 2. INVALID IC PID or VID + 3. (IC PID == 91XX || File PID == 91XX) && (File VID > IC VID) +*/ + +static u8 gup_enter_update_judge(st_fw_head *fw_head) +{ + u16 u16_tmp; + s32 i = 0; + u32 fw_len = 0; + s32 pid_cmp_len = 0; + u16_tmp = fw_head->vid; + fw_head->vid = (u16)(u16_tmp>>8) + (u16)(u16_tmp<<8); + + GTP_INFO("FILE HARDWARE INFO:%02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID:%s", fw_head->pid); + GTP_INFO("FILE VID:%04x", fw_head->vid); + GTP_INFO("IC HARDWARE INFO:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + GTP_INFO("IC PID:%s", update_msg.ic_fw_msg.pid); + GTP_INFO("IC VID:%04x", update_msg.ic_fw_msg.vid); + + if (!memcmp(fw_head->pid, "9158", 4) && !memcmp(update_msg.ic_fw_msg.pid, "915S", 4)) { + GTP_INFO("Update GT915S to GT9158 directly!"); + return SUCCESS; + } + + if (!memcmp(fw_head->hw_info, update_msg.ic_fw_msg.hw_info, sizeof(update_msg.ic_fw_msg.hw_info))) { + fw_len = 42 * 1024; + } else { + fw_len = fw_head->hw_info[3]; + fw_len += (((u32)fw_head->hw_info[2]) << 8); + fw_len += (((u32)fw_head->hw_info[1]) << 16); + fw_len += (((u32)fw_head->hw_info[0]) << 24); + } + if (update_msg.fw_total_len != fw_len) { + GTP_ERROR("Inconsistent firmware size, Update aborted! Default size: %d(%dK), actual size: %d(%dK)", fw_len, fw_len/1024, update_msg.fw_total_len, update_msg.fw_total_len/1024); + return FAIL; + } + GTP_INFO("Firmware length:%d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + + if (update_msg.force_update != 0xBE) { + GTP_INFO("FW chksum error,need enter update."); + return SUCCESS; + } + + + if (strlen(update_msg.ic_fw_msg.pid) < 3) { + GTP_INFO("Illegal IC pid, need enter update"); + return SUCCESS; + } else { + for (i = 0; i < 3; i++) { + if ((update_msg.ic_fw_msg.pid[i] < 0x30) || (update_msg.ic_fw_msg.pid[i] > 0x39)) { + GTP_INFO("Illegal IC pid, out of bound, need enter update"); + return SUCCESS; + } + } + } + + + pid_cmp_len = strlen(fw_head->pid); + if (pid_cmp_len < strlen(update_msg.ic_fw_msg.pid)) { + pid_cmp_len = strlen(update_msg.ic_fw_msg.pid); + } + + if ((!memcmp(fw_head->pid, update_msg.ic_fw_msg.pid, pid_cmp_len)) || + (!memcmp(update_msg.ic_fw_msg.pid, "91XX", 4)) || + (!memcmp(fw_head->pid, "91XX", 4))) { + if (!memcmp(fw_head->pid, "91XX", 4)) { + GTP_DEBUG("Force none same pid update mode."); + } else { + GTP_DEBUG("Get the same pid."); + } + + + if (fw_head->vid > update_msg.ic_fw_msg.vid) { + GTP_INFO("Need enter update."); + return SUCCESS; + } + GTP_ERROR("Don't meet the third condition."); + GTP_ERROR("File VID <= Ic VID, update aborted!"); + } else { + GTP_ERROR("File PID != Ic PID, update aborted!"); + } + + return FAIL; +} + + + +#if GTP_AUTO_UPDATE_CFG +static u8 ascii2hex(u8 a) +{ + s8 value = 0; + + if (a >= '0' && a <= '9') { + value = a - '0'; + } else if (a >= 'A' && a <= 'F') { + value = a - 'A' + 0x0A; + } else if (a >= 'a' && a <= 'f') { + value = a - 'a' + 0x0A; + } else { + value = 0xff; + } + + return value; +} + +static s8 gup_update_config(struct i2c_client *client) +{ + s32 file_len = 0; + s32 ret = 0; + s32 i = 0; + s32 file_cfg_len = 0; + s32 chip_cfg_len = 0; + s32 count = 0; + u8 *buf; + u8 *pre_buf; + u8 *file_config; + + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (NULL == update_msg.cfg_file) { + GTP_ERROR("[update_cfg]No need to upgrade config!"); + return FAIL; + } + file_len = update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_END); + + chip_cfg_len = ts->gtp_cfg_len; + + GTP_DEBUG("[update_cfg]config file len:%d", file_len); + GTP_DEBUG("[update_cfg]need config len:%d", chip_cfg_len); + if ((file_len+5) < chip_cfg_len*5) { + GTP_ERROR("Config length error"); + return -EPERM; + } + + buf = (u8 *)kzalloc(file_len, GFP_KERNEL); + pre_buf = (u8 *)kzalloc(file_len, GFP_KERNEL); + file_config = (u8 *)kzalloc(chip_cfg_len + GTP_ADDR_LENGTH, GFP_KERNEL); + update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_SET); + + GTP_DEBUG("[update_cfg]Read config from file."); + ret = update_msg.cfg_file->f_op->read(update_msg.cfg_file, (char *)pre_buf, file_len, &update_msg.cfg_file->f_pos); + if (ret < 0) { + GTP_ERROR("[update_cfg]Read config file failed."); + goto update_cfg_file_failed; + } + + GTP_DEBUG("[update_cfg]Delete illgal charactor."); + for (i = 0, count = 0; i < file_len; i++) { + if (pre_buf[i] == ' ' || pre_buf[i] == '\r' || pre_buf[i] == '\n') { + continue; + } + buf[count++] = pre_buf[i]; + } + + GTP_DEBUG("[update_cfg]Ascii to hex."); + file_config[0] = GTP_REG_CONFIG_DATA >> 8; + file_config[1] = GTP_REG_CONFIG_DATA & 0xff; + for (i = 0, file_cfg_len = GTP_ADDR_LENGTH; i < count; i += 5) { + if ((buf[i] == '0') && ((buf[i+1] == 'x') || (buf[i+1] == 'X'))) { + u8 high, low; + high = ascii2hex(buf[i+2]); + low = ascii2hex(buf[i+3]); + + if ((high == 0xFF) || (low == 0xFF)) { + ret = 0; + GTP_ERROR("[update_cfg]Illegal config file."); + goto update_cfg_file_failed; + } + file_config[file_cfg_len++] = (high<<4) + low; + } else { + ret = 0; + GTP_ERROR("[update_cfg]Illegal config file."); + goto update_cfg_file_failed; + } + } + + + GTP_DEBUG("config:"); + GTP_DEBUG_ARRAY(file_config+2, file_cfg_len); + + i = 0; + while (i++ < 5) { + ret = gup_i2c_write(client, file_config, file_cfg_len); + if (ret > 0) { + GTP_INFO("[update_cfg]Send config SUCCESS."); + break; + } + GTP_ERROR("[update_cfg]Send config i2c error."); + } + +update_cfg_file_failed: + kfree(pre_buf); + kfree(buf); + kfree(file_config); + return ret; +} + +#endif + +#if (GTP_AUTO_UPDATE && (!GTP_HEADER_FW_UPDATE || GTP_AUTO_UPDATE_CFG)) +static void gup_search_file(s32 search_type) +{ + s32 i = 0; + struct file *pfile = NULL; + + got_file_flag = 0x00; + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) { + if (0 == searching_file) { + GTP_INFO("Force exiting file searching"); + got_file_flag = 0x00; + return; + } + + if (search_type & AUTO_SEARCH_BIN) { + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", UPDATE_FILE_PATH_1, UPDATE_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(UPDATE_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pfile = filp_open(UPDATE_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_2); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + } else { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_1); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + if (got_file_flag & BIN_FILE_READY) { + #if GTP_AUTO_UPDATE_CFG + if (search_type & AUTO_SEARCH_CFG) { + i = GUP_SEARCH_FILE_TIMES; + } else + #endif + { + searching_file = 0; + return; + } + } + } + + #if GTP_AUTO_UPDATE_CFG + if ((search_type & AUTO_SEARCH_CFG) && !(got_file_flag & CFG_FILE_READY)) { + GTP_DEBUG("Search for %s, %s for config update.(%d/%d)", CONFIG_FILE_PATH_1, CONFIG_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(CONFIG_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pfile = filp_open(CONFIG_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_2); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + } else { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_1); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + if (got_file_flag & CFG_FILE_READY) { + searching_file = 0; + return; + } + } + #endif + msleep(3000); + } + searching_file = 0; +} +#endif + + +static u8 gup_check_update_file(struct i2c_client *client, st_fw_head *fw_head, u8 *path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + u8 buf[FW_HEAD_LENGTH]; + + got_file_flag = 0x00; + if (path) { + GTP_DEBUG("Update File path:%s, %ld", path, strlen(path)); + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + got_file_flag = BIN_FILE_READY; + } else { +#if GTP_AUTO_UPDATE + #if GTP_HEADER_FW_UPDATE + + + ret = gtp_i2c_read_dbl_check(client, GTP_REG_SENSOR_ID, >P_FW_SENSOR_ID, 1); + if (SUCCESS == ret) { + if (GTP_FW_SENSOR_ID >= 0x09) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", GTP_FW_SENSOR_ID); + + } + } + + if (GTP_FW_SENSOR_ID == 0x2) { + GTP_INFO("Update GT915L FW, Sensor ID : %d", GTP_FW_SENSOR_ID); + } else { + GTP_INFO("Force Upgrade Error !"); + + } + + GTP_INFO("Update by default firmware array"); + update_msg.fw_total_len = sizeof(gtp_default_FW) - FW_HEAD_LENGTH; + if (sizeof(gtp_default_FW) < (FW_HEAD_LENGTH+FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) { + GTP_ERROR("INVALID gtp_default_FW, check your gt9xx_firmware.h file!"); + return FAIL; + } + GTP_DEBUG("Firmware actual size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + memcpy(fw_head, >p_default_FW[0], FW_HEAD_LENGTH); + + + fw_checksum = 0; + for (i = 0; i < update_msg.fw_total_len; i += 2) { + fw_checksum += (gtp_default_FW[FW_HEAD_LENGTH + i] << 8) + gtp_default_FW[FW_HEAD_LENGTH + i + 1]; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if (fw_checksum&0xFFFF) { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + got_file_flag = HEADER_FW_READY; + return SUCCESS; + #else + + #if GTP_AUTO_UPDATE_CFG + gup_search_file(AUTO_SEARCH_BIN | AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) { + ret = gup_update_config(i2c_connect_client); + if (ret <= 0) { + GTP_ERROR("Update config failed."); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); + } + #else + gup_search_file(AUTO_SEARCH_BIN); + #endif + + if (!(got_file_flag & BIN_FILE_READY)) { + GTP_ERROR("No bin file for fw update"); + return FAIL; + } + #endif + +#else + { + GTP_ERROR("NULL file for firmware update"); + return FAIL; + } +#endif + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.fw_total_len = update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_END); + if (update_msg.fw_total_len < (FW_HEAD_LENGTH + FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) { + GTP_ERROR("INVALID bin file(size: %d), update aborted.", update_msg.fw_total_len); + return FAIL; + } + + update_msg.fw_total_len -= FW_HEAD_LENGTH; + + GTP_DEBUG("Bin firmware actual size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, FW_HEAD_LENGTH, &update_msg.file->f_pos); + if (ret < 0) { + GTP_ERROR("Read firmware head in update file error."); + return FAIL; + } + + memcpy(fw_head, buf, FW_HEAD_LENGTH); + + + fw_checksum = 0; + for (i = 0; i < update_msg.fw_total_len; i += 2) { + u16 temp; + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, 2, &update_msg.file->f_pos); + if (ret < 0) { + GTP_ERROR("Read firmware file error."); + return FAIL; + } + + temp = (buf[0]<<8) + buf[1]; + fw_checksum += temp; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if (fw_checksum&0xFFFF) { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_proc(struct i2c_client *client, u8 *burn_buf, u16 start_addr, u16 total_length) +{ + s32 ret = 0; + u16 burn_addr = start_addr; + u16 frame_length = 0; + u16 burn_length = 0; + u8 wr_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 retry = 0; + + GTP_DEBUG("Begin burn %dk data to addr 0x%x", (total_length/1024), start_addr); + while (burn_length < total_length) { + GTP_DEBUG("B/T:%04d/%04d", burn_length, total_length); + frame_length = ((total_length - burn_length) > PACK_SIZE) ? PACK_SIZE : (total_length - burn_length); + wr_buf[0] = (u8)(burn_addr>>8); + rd_buf[0] = wr_buf[0]; + wr_buf[1] = (u8)burn_addr; + rd_buf[1] = wr_buf[1]; + memcpy(&wr_buf[GTP_ADDR_LENGTH], &burn_buf[burn_length], frame_length); + + for (retry = 0; retry < MAX_FRAME_CHECK_TIME; retry++) { + ret = gup_i2c_write(client, wr_buf, GTP_ADDR_LENGTH + frame_length); + if (ret <= 0) { + GTP_ERROR("Write frame data i2c error."); + continue; + } + ret = gup_i2c_read(client, rd_buf, GTP_ADDR_LENGTH + frame_length); + if (ret <= 0) { + GTP_ERROR("Read back frame data i2c error."); + continue; + } + + if (memcmp(&wr_buf[GTP_ADDR_LENGTH], &rd_buf[GTP_ADDR_LENGTH], frame_length)) { + GTP_ERROR("Check frame data fail,not equal."); + GTP_DEBUG("write array:"); + GTP_DEBUG_ARRAY(&wr_buf[GTP_ADDR_LENGTH], frame_length); + GTP_DEBUG("read array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + continue; + } else { + + break; + } + } + if (retry >= MAX_FRAME_CHECK_TIME) { + GTP_ERROR("Burn frame data time out,exit."); + return FAIL; + } + burn_length += frame_length; + burn_addr += frame_length; + } + return SUCCESS; +} + +static u8 gup_load_section_file(u8 *buf, u32 offset, u16 length, u8 set_or_end) +{ +#if (GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) + if (got_file_flag == HEADER_FW_READY) { + if (SEEK_SET == set_or_end) { + memcpy(buf, >p_default_FW[FW_HEAD_LENGTH + offset], length); + } else { + memcpy(buf, >p_default_FW[update_msg.fw_total_len + FW_HEAD_LENGTH - offset], length); + } + return SUCCESS; + } +#endif + { + s32 ret = 0; + + if ((update_msg.file == NULL) || IS_ERR(update_msg.file)) { + GTP_ERROR("cannot find update file,load section file fail."); + return FAIL; + } + + if (SEEK_SET == set_or_end) { + update_msg.file->f_pos = FW_HEAD_LENGTH + offset; + } else { + update_msg.file->f_pos = update_msg.fw_total_len + FW_HEAD_LENGTH - offset; + } + + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, length, &update_msg.file->f_pos); + + if (ret < 0) { + GTP_ERROR("Read update file fail."); + return FAIL; + } + + return SUCCESS; + } +} + +static u8 gup_recall_check(struct i2c_client *client, u8 *chk_src, u16 start_rd_addr, u16 chk_length) +{ + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + s32 ret = 0; + u16 recall_addr = start_rd_addr; + u16 recall_length = 0; + u16 frame_length = 0; + + while (recall_length < chk_length) { + frame_length = ((chk_length - recall_length) > PACK_SIZE) ? PACK_SIZE : (chk_length - recall_length); + ret = gup_get_ic_msg(client, recall_addr, rd_buf, frame_length); + if (ret <= 0) { + GTP_ERROR("recall i2c error,exit"); + return FAIL; + } + + if (memcmp(&rd_buf[GTP_ADDR_LENGTH], &chk_src[recall_length], frame_length)) { + GTP_ERROR("Recall frame data fail,not equal."); + GTP_DEBUG("chk_src array:"); + GTP_DEBUG_ARRAY(&chk_src[recall_length], frame_length); + GTP_DEBUG("recall array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + return FAIL; + } + + recall_length += frame_length; + recall_addr += frame_length; + } + GTP_DEBUG("Recall check %dk firmware success.", (chk_length/1024)); + + return SUCCESS; +} + +static u8 gup_burn_fw_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u8 bank_cmd) +{ + s32 ret = 0; + u8 rd_buf[5]; + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]hold ss51 & dsp fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + + ret = gup_burn_proc(client, fw_section, start_addr, FW_SECTION_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_section]burn fw_section fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]hold ss51 & release dsp fail."); + return FAIL; + } + + msleep(1); + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0f); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]send burn cmd fail."); + return FAIL; + } + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]Get burn state fail"); + return FAIL; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + + ret = gup_recall_check(client, fw_section, start_addr, FW_SECTION_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_section]recall check %dk firmware fail.", FW_SECTION_LENGTH/1024); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]disable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_dsp_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_dsp_isp = NULL; + u8 retry = 0; + + GTP_INFO("[burn_dsp_isp]Begin burn dsp isp---->>"); + + + GTP_DEBUG("[burn_dsp_isp]step1:alloc memory"); + while (retry++ < 5) { + fw_dsp_isp = (u8 *)kzalloc(FW_DSP_ISP_LENGTH, GFP_KERNEL); + if (fw_dsp_isp == NULL) { + continue; + } else { + GTP_INFO("[burn_dsp_isp]Alloc %dk byte memory success.", (FW_DSP_ISP_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_dsp_isp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_dsp_isp]step2:load dsp isp file data"); + ret = gup_load_section_file(fw_dsp_isp, FW_DSP_ISP_LENGTH, FW_DSP_ISP_LENGTH, SEEK_END); + if (FAIL == ret) { + GTP_ERROR("[burn_dsp_isp]load firmware dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step3:disable wdt,clear cache enable"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]disable wdt fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]clear cache enable fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step5:set boot from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]set boot from sram fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step6:software reboot"); + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]software reboot fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step7:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]select bank2 fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step8:enable accessing code"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]enable accessing code fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step9:burn 4k dsp_isp"); + ret = gup_burn_proc(client, fw_dsp_isp, 0xC000, FW_DSP_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_dsp_isp]burn dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step10:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + update_msg.fw_burned_len += FW_DSP_ISP_LENGTH; + GTP_DEBUG("[burn_dsp_isp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_dsp_isp: + kfree(fw_dsp_isp); + return ret; +} + +static u8 gup_burn_fw_ss51(struct i2c_client *client) +{ + u8 *fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_INFO("[burn_fw_ss51]Begin burn ss51 firmware---->>"); + + + GTP_DEBUG("[burn_fw_ss51]step1:alloc memory"); + while (retry++ < 5) { + fw_ss51 = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_ss51 == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_ss51]Alloc %dk byte memory success.", (FW_SECTION_LENGTH / 1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_ss51]Alloc memory fail,exit."); + return FAIL; + } + + + + + + + + + + + GTP_INFO("[burn_fw_ss51]Reset first 8K of ss51 to 0xFF."); + GTP_DEBUG("[burn_fw_ss51]step2: reset bank0 0xC000~0xD000"); + memset(fw_ss51, 0xFF, FW_SECTION_LENGTH); + + + GTP_DEBUG("[burn_fw_ss51]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_ss51]clear control flag fail."); + ret = FAIL; + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step5:load ss51 firmware section 2 file data"); + ret = gup_load_section_file(fw_ss51, FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step6:burn ss51 firmware section 2"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x02); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step7:load ss51 firmware section 3 file data"); + ret = gup_load_section_file(fw_ss51, 2 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step8:burn ss51 firmware section 3"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x13); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step9:load ss51 firmware section 4 file data"); + ret = gup_load_section_file(fw_ss51, 3 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step10:burn ss51 firmware section 4"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x14); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + update_msg.fw_burned_len += (FW_SECTION_LENGTH*4); + GTP_DEBUG("[burn_fw_ss51]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_ss51: + kfree(fw_ss51); + return ret; +} + +static u8 gup_burn_fw_dsp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_dsp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_INFO("[burn_fw_dsp]Begin burn dsp firmware---->>"); + + GTP_DEBUG("[burn_fw_dsp]step1:alloc memory"); + while (retry++ < 5) { + fw_dsp = (u8 *)kzalloc(FW_DSP_LENGTH, GFP_KERNEL); + if (fw_dsp == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_dsp]Alloc %dk byte memory success.", (FW_SECTION_LENGTH / 1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_dsp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_dsp]step2:load firmware dsp"); + ret = gup_load_section_file(fw_dsp, 4 * FW_SECTION_LENGTH, FW_DSP_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]load firmware dsp fail."); + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step3:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step5:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step6:release ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_dsp]step7:burn 4k dsp firmware"); + ret = gup_burn_proc(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]burn fw_section fail."); + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x05); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]send burn cmd fail."); + goto exit_burn_fw_dsp; + } + GTP_DEBUG("[burn_fw_dsp]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]Get burn state fail"); + goto exit_burn_fw_dsp; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_dsp]step9:recall check 4k dsp firmware"); + ret = gup_recall_check(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]recall check 4k dsp firmware fail."); + goto exit_burn_fw_dsp; + } + + update_msg.fw_burned_len += FW_DSP_LENGTH; + GTP_DEBUG("[burn_fw_dsp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_dsp: + kfree(fw_dsp); + return ret; +} + +static u8 gup_burn_fw_boot(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_boot = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_INFO("[burn_fw_boot]Begin burn bootloader firmware---->>"); + + + GTP_DEBUG("[burn_fw_boot]step1:Alloc memory"); + while (retry++ < 5) { + fw_boot = (u8 *)kzalloc(FW_BOOT_LENGTH, GFP_KERNEL); + if (fw_boot == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_boot]Alloc %dk byte memory success.", (FW_BOOT_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_boot]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_boot]step2:load firmware bootloader"); + ret = gup_load_section_file(fw_boot, (4 * FW_SECTION_LENGTH + FW_DSP_LENGTH), FW_BOOT_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]load firmware bootcode fail."); + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step5:hold ss51 & release dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_boot]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step6:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]burn fw_boot fail."); + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step7:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x06); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]send burn cmd fail."); + goto exit_burn_fw_boot; + } + GTP_DEBUG("[burn_fw_boot]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]Get burn state fail"); + goto exit_burn_fw_boot; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_boot]step8:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]recall check 2k bootcode firmware fail."); + goto exit_burn_fw_boot; + } + + update_msg.fw_burned_len += FW_BOOT_LENGTH; + GTP_DEBUG("[burn_fw_boot]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_boot: + kfree(fw_boot); + return ret; +} +static u8 gup_burn_fw_boot_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_boot_isp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the boot_isp code!"); + return SUCCESS; + } + GTP_INFO("[burn_fw_boot_isp]Begin burn boot_isp firmware---->>"); + + + GTP_DEBUG("[burn_fw_boot_isp]step1:Alloc memory"); + while (retry++ < 5) { + fw_boot_isp = (u8 *)kzalloc(FW_BOOT_ISP_LENGTH, GFP_KERNEL); + if (fw_boot_isp == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_boot_isp]Alloc %dk byte memory success.", (FW_BOOT_ISP_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_boot_isp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step2:load firmware bootloader isp"); + + ret = gup_load_section_file(fw_boot_isp, (update_msg.fw_burned_len - FW_DSP_ISP_LENGTH), FW_BOOT_ISP_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]load firmware boot_isp fail."); + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + + GTP_DEBUG("[burn_fw_boot_isp]step5:hold ss51 & release dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_boot_isp]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step7:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]burn fw_section fail."); + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x07); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]send burn cmd fail."); + goto exit_burn_fw_boot_isp; + } + GTP_DEBUG("[burn_fw_boot_isp]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]Get burn state fail"); + goto exit_burn_fw_boot_isp; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_boot_isp]step9:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]recall check 2k bootcode_isp firmware fail."); + goto exit_burn_fw_boot_isp; + } + + update_msg.fw_burned_len += FW_BOOT_ISP_LENGTH; + GTP_DEBUG("[burn_fw_boot_isp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_boot_isp: + kfree(fw_boot_isp); + return ret; +} + +static u8 gup_burn_fw_link(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_link = NULL; + u8 retry = 0; + u32 offset; + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the link code!"); + return SUCCESS; + } + GTP_INFO("[burn_fw_link]Begin burn link firmware---->>"); + + + GTP_DEBUG("[burn_fw_link]step1:Alloc memory"); + while (retry++ < 5) { + fw_link = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_link == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_link]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_link]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_link]step2:load firmware link section 1"); + offset = update_msg.fw_burned_len - FW_DSP_ISP_LENGTH; + ret = gup_load_section_file(fw_link, offset, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]load firmware link section 1 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step3:burn link firmware section 1"); + ret = gup_burn_fw_gwake_section(client, fw_link, 0x9000, FW_SECTION_LENGTH, 0x38); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]burn link firmware section 1 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step4:load link firmware section 2 file data"); + offset += FW_SECTION_LENGTH; + ret = gup_load_section_file(fw_link, offset, FW_GLINK_LENGTH - FW_SECTION_LENGTH, SEEK_SET); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]load link firmware section 2 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step4:burn link firmware section 2"); + ret = gup_burn_fw_gwake_section(client, fw_link, 0x9000, FW_GLINK_LENGTH - FW_SECTION_LENGTH, 0x39); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]burn link firmware section 2 fail."); + goto exit_burn_fw_link; + } + + update_msg.fw_burned_len += FW_GLINK_LENGTH; + GTP_DEBUG("[burn_fw_link]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_link: + kfree(fw_link); + return ret; +} + +static u8 gup_burn_fw_gwake_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd) +{ + s32 ret = 0; + u8 rd_buf[5]; + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]hold ss51 & dsp fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]hold ss51 & release dsp fail."); + return FAIL; + } + + msleep(1); + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_burn_proc(client, fw_section, start_addr, len); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_app_section]burn fw_section fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]send burn cmd fail."); + return FAIL; + } + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]Get burn state fail"); + return FAIL; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + ret = gup_recall_check(client, fw_section, start_addr, len); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_app_section]recall check %dk firmware fail.", len/1024); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_fw_gwake(struct i2c_client *client) +{ + u8 *fw_gwake = NULL; + u8 retry = 0; + s32 ret = 0; + u16 start_index = 4*FW_SECTION_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH + FW_BOOT_ISP_LENGTH + FW_GLINK_LENGTH; + + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the gwake code!"); + return SUCCESS; + } + + GTP_INFO("[burn_fw_gwake]Begin burn gwake firmware---->>"); + + + GTP_DEBUG("[burn_fw_gwake]step1:alloc memory"); + while (retry++ < 5) { + fw_gwake = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_gwake == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_gwake]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_gwake]Alloc memory fail,exit."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]clear control flag fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step2:load app_code firmware section 1 file data"); + ret = gup_load_section_file(fw_gwake, start_index, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 1 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step3:burn app_code firmware section 1"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3A); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 1 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step5:load app_code firmware section 2 file data"); + ret = gup_load_section_file(fw_gwake, start_index+FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 2 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step6:burn app_code firmware section 2"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3B); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 2 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step7:load app_code firmware section 3 file data"); + ret = gup_load_section_file(fw_gwake, start_index+2*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 3 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step8:burn app_code firmware section 3"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3C); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 3 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step9:load app_code firmware section 4 file data"); + ret = gup_load_section_file(fw_gwake, start_index + 3*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 4 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step10:burn app_code firmware section 4"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3D); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 4 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_gwake: + kfree(fw_gwake); + return ret; +} + +static u8 gup_burn_fw_finish(struct i2c_client *client) +{ + u8 *fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_INFO("[burn_fw_finish]burn first 8K of ss51 and finish update."); + + GTP_DEBUG("[burn_fw_finish]step1:alloc memory"); + while (retry++ < 5) { + fw_ss51 = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_ss51 == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_finish]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_finish]Alloc memory fail,exit."); + return FAIL; + } + + GTP_DEBUG("[burn_fw_finish]step2: burn ss51 first 8K."); + ret = gup_load_section_file(fw_ss51, 0, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_finish]load ss51 firmware section 1 fail."); + goto exit_burn_fw_finish; + } + + GTP_DEBUG("[burn_fw_finish]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]clear control flag fail."); + goto exit_burn_fw_finish; + } + + GTP_DEBUG("[burn_fw_finish]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_finish]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_finish; + } + + + GTP_DEBUG("[burn_fw_finish]step5:enable download DSP code "); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x99); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]enable download DSP code fail."); + goto exit_burn_fw_finish; + } + + + GTP_DEBUG("[burn_fw_finish]step6:release ss51 & hold dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x08); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]release ss51 & hold dsp fail."); + goto exit_burn_fw_finish; + } + + if (fw_ss51) { + kfree(fw_ss51); + } + return SUCCESS; + +exit_burn_fw_finish: + if (fw_ss51) { + kfree(fw_ss51); + } + return FAIL; +} +s32 gup_update_proc(void *dir) +{ + s32 ret = 0; + s32 update_ret = FAIL; + u8 retry = 0; + st_fw_head fw_head; + struct goodix_ts_data *ts = NULL; + + GTP_DEBUG("[update_proc]Begin update ......"); + + ts = i2c_get_clientdata(i2c_connect_client); + +#if GTP_AUTO_UPDATE + if (searching_file) { + u8 timeout = 0; + searching_file = 0; + GTP_INFO("Exiting searching .bin update file..."); + while ((show_len != 200) && (show_len != 100) && (timeout++ < 100)) { + msleep(100); + } + } +#endif + + show_len = 1; + total_len = 100; + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return gup_fw_download_proc(dir, GTP_FL_FW_BURN); + } +#endif + + update_msg.file = NULL; + ret = gup_check_update_file(i2c_connect_client, &fw_head, (u8 *)dir); + if (FAIL == ret) { + GTP_ERROR("[update_proc]check update file fail."); + goto file_fail; + } + + ret = gup_get_ic_fw_msg(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]get ic message fail."); + goto file_fail; + } + + ret = gup_enter_update_judge(&fw_head); + if (FAIL == ret) { + GTP_ERROR("[update_proc]Check *.bin file fail."); + goto file_fail; + } + + ts->enter_update = 1; + gtp_irq_disable(ts); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ret = gup_enter_update_mode(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]enter update mode fail."); + goto update_fail; + } + + while (retry++ < 5) { + show_len = 10; + total_len = 100; + update_msg.fw_burned_len = 0; + ret = gup_burn_dsp_isp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn dsp isp fail."); + continue; + } + + show_len = 20; + ret = gup_burn_fw_gwake(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn app_code firmware fail."); + continue; + } + + show_len = 30; + ret = gup_burn_fw_ss51(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn ss51 firmware fail."); + continue; + } + + show_len = 40; + ret = gup_burn_fw_dsp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn dsp firmware fail."); + continue; + } + + show_len = 50; + ret = gup_burn_fw_boot(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn bootloader firmware fail."); + continue; + } + show_len = 60; + + ret = gup_burn_fw_boot_isp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn boot_isp firmware fail."); + continue; + } + + show_len = 70; + ret = gup_burn_fw_link(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn link firmware fail."); + continue; + } + + show_len = 80; + ret = gup_burn_fw_finish(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn finish fail."); + continue; + } + show_len = 90; + GTP_INFO("[update_proc]UPDATE SUCCESS."); + retry = 0; + break; + } + + if (retry >= 5) { + GTP_ERROR("[update_proc]retry timeout,UPDATE FAIL."); + update_ret = FAIL; + } else { + update_ret = SUCCESS; + } + +#if WT_ADD_CTP_INFO +gtp_hardwareinfo_set(); +#endif + + +update_fail: + GTP_DEBUG("[update_proc]leave update mode."); + gup_leave_update_mode(); + + msleep(100); + + if (SUCCESS == update_ret) { + if (ts->fw_error) { + GTP_INFO("firmware error auto update, resent config!"); + gup_init_panel(ts); + } else { + GTP_DEBUG("[update_proc]send config."); + ret = gtp_send_cfg(i2c_connect_client); + if (ret < 0) { + GTP_ERROR("[update_proc]send config fail."); + } else { + msleep(100); + } + } + } + ts->enter_update = 0; + gtp_irq_enable(ts); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + +file_fail: + if (update_msg.file && !IS_ERR(update_msg.file)) { + if (update_msg.old_fs) { + set_fs(update_msg.old_fs); + } + filp_close(update_msg.file, NULL); + } +#if (GTP_AUTO_UPDATE && GTP_AUTO_UPDATE_CFG && GTP_HEADER_FW_UPDATE) + if (NULL == dir) { + gup_search_file(AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) { + ret = gup_update_config(i2c_connect_client); + if (ret <= 0) { + GTP_ERROR("Update config failed."); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); + } + } +#endif + + total_len = 100; + if (SUCCESS == update_ret) { + show_len = 100; + return SUCCESS; + } else { + show_len = 200; + return FAIL; + } +} + +#if GTP_AUTO_UPDATE +u8 gup_init_update_proc(struct goodix_ts_data *ts) +{ + struct task_struct *thread = NULL; + + GTP_INFO("Ready to run update thread."); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + thread = kthread_run(gup_update_proc, "update", "fl update"); + } else +#endif + { + thread = kthread_run(gup_update_proc, (void *)NULL, "guitar_update"); + } + if (IS_ERR(thread)) { + GTP_ERROR("Failed to create update thread.\n"); + return -EPERM; + } + + return 0; +} +#endif + + + +#define FW_DOWNLOAD_LENGTH 0x4000 +#define FW_SS51_SECTION_LEN 0x2000 +#define FL_PACK_SIZE 1024 +#define GUP_FW_CHK_SIZE FL_PACK_SIZE + +#define FL_UPDATE_PATH "/data/_fl_update_.bin" +#define FL_UPDATE_PATH_SD "/sdcard/_fl_update_.bin" + +#define PULSE_LENGTH (200) +#define INIT_CLK_DAC (50) +#define MAX_CLK_DAC (120) +#define CLK_AVG_TIME (1) +#define MILLION 1000000 + +#define _wRW_MISCTL__RG_DMY 0x4282 +#define _bRW_MISCTL__RG_OSC_CALIB 0x4268 +#define _fRW_MISCTL__GIO0 0x41e9 +#define _fRW_MISCTL__GIO1 0x41ed +#define _fRW_MISCTL__GIO2 0x41f1 +#define _fRW_MISCTL__GIO3 0x41f5 +#define _fRW_MISCTL__GIO4 0x41f9 +#define _fRW_MISCTL__GIO5 0x41fd +#define _fRW_MISCTL__GIO6 0x4201 +#define _fRW_MISCTL__GIO7 0x4205 +#define _fRW_MISCTL__GIO8 0x4209 +#define _fRW_MISCTL__GIO9 0x420d +#define _fRW_MISCTL__MEA 0x41a0 +#define _bRW_MISCTL__MEA_MODE 0x41a1 +#define _wRW_MISCTL__MEA_MAX_NUM 0x41a4 +#define _dRO_MISCTL__MEA_VAL 0x41b0 +#define _bRW_MISCTL__MEA_SRCSEL 0x41a3 +#define _bRO_MISCTL__MEA_RDY 0x41a8 +#define _rRW_MISCTL__ANA_RXADC_B0_ 0x4250 +#define _bRW_MISCTL__RG_LDO_A18_PWD 0x426f +#define _bRW_MISCTL__RG_BG_PWD 0x426a +#define _bRW_MISCTL__RG_CLKGEN_PWD 0x4269 +#define _fRW_MISCTL__RG_RXADC_PWD 0x426a +#define _bRW_MISCTL__OSC_CK_SEL 0x4030 +#define _rRW_MISCTL_RG_DMY83 0x4283 +#define _rRW_MISCTL__GIO1CTL_B2_ 0x41ee +#define _rRW_MISCTL__GIO1CTL_B1_ 0x41ed + + +#if GTP_COMPATIBLE_MODE + +u8 i2c_opr_buf[GTP_ADDR_LENGTH + FL_PACK_SIZE] = {0}; +u8 chk_cmp_buf[FL_PACK_SIZE] = {0}; + +extern s32 gtp_fw_startup(struct i2c_client *client); +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode); +static s32 gup_burn_fw_proc(struct i2c_client *client, u16 start_addr, s32 start_index, s32 burn_len); +static s32 gup_check_and_repair(struct i2c_client *client, u16 start_addr, s32 start_index, s32 chk_len); + + +u8 gup_check_fs_mounted(char *path_name) +{ + struct path root_path; + struct path path; + int err = -1; + err = kern_path("/", LOOKUP_FOLLOW, &root_path); + + if (err) { + GTP_DEBUG("\"/\" NOT Mounted: %d", err); + return FAIL; + } + err = kern_path(path_name, LOOKUP_FOLLOW, &path); + + if (err) { + GTP_DEBUG("%s NOT Mounted: %d", path_name, err); + err = FAIL; + goto exit_chk; + } + + if (path.mnt->mnt_sb == root_path.mnt->mnt_sb) { + err = FAIL; + } else { + err = SUCCESS; + } + + path_put(&path); +exit_chk: + path_put(&root_path); + return err; +} + +s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len) +{ + s32 ret = 0; + s32 write_bytes = 0; + s32 retry = 0; + u8 *tx_buf = buf; + + while (len > 0) { + i2c_opr_buf[0] = (u8)(addr >> 8); + i2c_opr_buf[1] = (u8)(addr & 0xFF); + if (len > FL_PACK_SIZE) { + write_bytes = FL_PACK_SIZE; + } else { + write_bytes = len; + } + memcpy(i2c_opr_buf + 2, tx_buf, write_bytes); + for (retry = 0; retry < 5; ++retry) { + ret = gup_i2c_write(client, i2c_opr_buf, write_bytes + GTP_ADDR_LENGTH); + if (ret == 1) { + break; + } + } + if (retry >= 5) { + GTP_ERROR("retry timeout, I2C write 0x%04X %d bytes failed!", addr, write_bytes); + return -EPERM; + } + addr += write_bytes; + len -= write_bytes; + tx_buf += write_bytes; + } + + return 1; +} + +s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len) +{ + s32 ret = 0; + s32 read_bytes = 0; + s32 retry = 0; + u8 *tx_buf = buf; + + while (len > 0) { + i2c_opr_buf[0] = (u8)(addr >> 8); + i2c_opr_buf[1] = (u8)(addr & 0xFF); + if (len > FL_PACK_SIZE) { + read_bytes = FL_PACK_SIZE; + } else { + read_bytes = len; + } + for (retry = 0; retry < 5; ++retry) { + ret = gup_i2c_read(client, i2c_opr_buf, read_bytes + GTP_ADDR_LENGTH); + if (ret == 2) { + break; + } + } + if (retry >= 5) { + GTP_ERROR("retry timeout, I2C read 0x%04X %d bytes failed!", addr, read_bytes); + return -EPERM; + } + memcpy(tx_buf, i2c_opr_buf + 2, read_bytes); + addr += read_bytes; + len -= read_bytes; + tx_buf += read_bytes; + } + return 2; +} + + + + + +static void gup_bit_write(s32 addr, s32 bit, s32 val) +{ + u8 buf; + i2c_read_bytes(i2c_connect_client, addr, &buf, 1); + + buf = (buf & (~((u8)1 << bit))) | ((u8)val << bit); + + i2c_write_bytes(i2c_connect_client, addr, &buf, 1); +} + +static void gup_clk_count_init(s32 bCh, s32 bCNT) +{ + u8 buf; + + + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + + gup_bit_write(_fRW_MISCTL__MEA, 1, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__MEA_MODE, &buf, 1); + + buf = 8 + bCh; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__MEA_SRCSEL, &buf, 1); + + buf = bCNT; + i2c_write_bytes(i2c_connect_client, _wRW_MISCTL__MEA_MAX_NUM, &buf, 1); + + gup_bit_write(_fRW_MISCTL__MEA, 1, 0); + + gup_bit_write(_fRW_MISCTL__MEA, 0, 1); +} + +static u32 gup_clk_count_get(void) +{ + s32 ready = 0; + s32 temp; + s8 buf[4]; + + while ((ready == 0)) { + i2c_read_bytes(i2c_connect_client, _bRO_MISCTL__MEA_RDY, buf, 1); + ready = buf[0]; + } + + msleep(50); + + + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + i2c_read_bytes(i2c_connect_client, _dRO_MISCTL__MEA_VAL, buf, 4); + GTP_DEBUG("Clk_count 0: %2X", buf[0]); + GTP_DEBUG("Clk_count 1: %2X", buf[1]); + GTP_DEBUG("Clk_count 2: %2X", buf[2]); + GTP_DEBUG("Clk_count 3: %2X", buf[3]); + + temp = (s32)buf[0] + ((s32)buf[1] << 8) + ((s32)buf[2] << 16) + ((s32)buf[3] << 24); + GTP_INFO("Clk_count : %d", temp); + return temp; +} +u8 gup_clk_dac_setting(int dac) +{ + s8 buf1, buf2; + + i2c_read_bytes(i2c_connect_client, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_read_bytes(i2c_connect_client, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + buf1 = (buf1 & 0xFFCF) | ((dac & 0x03) << 4); + buf2 = (dac >> 2) & 0x3f; + + i2c_write_bytes(i2c_connect_client, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + return 0; +} + +static u8 gup_clk_calibration_pin_select(s32 bCh) +{ + s32 i2c_addr; + + switch (bCh) { + case 0: + i2c_addr = _fRW_MISCTL__GIO0; + break; + + case 1: + i2c_addr = _fRW_MISCTL__GIO1; + break; + + case 2: + i2c_addr = _fRW_MISCTL__GIO2; + break; + + case 3: + i2c_addr = _fRW_MISCTL__GIO3; + break; + + case 4: + i2c_addr = _fRW_MISCTL__GIO4; + break; + + case 5: + i2c_addr = _fRW_MISCTL__GIO5; + break; + + case 6: + i2c_addr = _fRW_MISCTL__GIO6; + break; + + case 7: + i2c_addr = _fRW_MISCTL__GIO7; + break; + + case 8: + i2c_addr = _fRW_MISCTL__GIO8; + break; + + case 9: + i2c_addr = _fRW_MISCTL__GIO9; + break; + } + + gup_bit_write(i2c_addr, 1, 0); + + return 0; +} + +void gup_output_pulse(int t) +{ + unsigned long flags; + + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(10); + + local_irq_save(flags); + + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(50); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(t - 50); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + local_irq_restore(flags); + + msleep(20); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); +} + +static void gup_sys_clk_init(void) +{ + u8 buf; + + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 5, 0); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_LDO_A18_PWD, &buf, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_BG_PWD, &buf, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_CLKGEN_PWD, &buf, 1); + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 0, 0); + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 1, 0); + + + buf = 1; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__OSC_CK_SEL, &buf, 1); +} + +s32 gup_clk_calibration(void) +{ + u8 buf; + + s32 i; + struct timeval start, end; + s32 count; + s32 count_ref; + s32 sec; + s32 usec; + + struct goodix_ts_data *ts; + + buf = 0x0C; + i2c_write_bytes(i2c_connect_client, _rRW_MISCTL__SWRST_B0_, &buf, 1); + + + gup_bit_write(_rRW_MISCTL_RG_DMY83, 7, 0); + + + gup_bit_write(_rRW_MISCTL__GIO1CTL_B2_, 0, 0); + + + gup_bit_write(_rRW_MISCTL__GIO1CTL_B1_, 1, 0); + + + + + + GTP_INFO("CLK calibration GO"); + gup_sys_clk_init(); + gup_clk_calibration_pin_select(1); + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + ts = i2c_get_clientdata(i2c_connect_client); + + for (i = INIT_CLK_DAC; i < MAX_CLK_DAC; i++) { + GTP_INFO("CLK calibration DAC %d", i); + + if (ts->gtp_is_suspend) { + i = 72; + break; + } + + gup_clk_dac_setting(i); + gup_clk_count_init(1, CLK_AVG_TIME); + + #if 0 + gup_output_pulse(PULSE_LENGTH); + count = gup_clk_count_get(); + + if (count > PULSE_LENGTH * 60) { + break; + } + + #else + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + + do_gettimeofday(&start); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + + msleep(1); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(1); + + + do_gettimeofday(&end); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + + count = gup_clk_count_get(); + msleep(20); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + usec = end.tv_usec - start.tv_usec; + sec = end.tv_sec - start.tv_sec; + count_ref = 60 * (usec + sec * MILLION); + + GTP_DEBUG("== time %d, %d, %d", sec, usec, count_ref); + + if (count > count_ref) { + GTP_DEBUG("== count_diff %d", count - count_ref); + break; + } + + #endif + } + + + + gtp_reset_guitar(i2c_connect_client, 20); + +#if 0 + + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x41FA, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4104, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4105, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4106, &buf, 1); + buf = 0x01; + i2c_write_bytes(i2c_connect_client, 0x4107, &buf, 1); + buf = 0x06; + i2c_write_bytes(i2c_connect_client, 0x41F8, &buf, 1); + buf = 0x02; + i2c_write_bytes(i2c_connect_client, 0x41F9, &buf, 1); +#endif + + GTP_GPIO_AS_INT(gtp_int_gpio); + return i; +} + + + +s32 gup_hold_ss51_dsp(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + while (retry++ < 200) { + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if (0x0C == rd_buf[GTP_ADDR_LENGTH]) { + GTP_DEBUG("[enter_update_mode]Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if (retry >= 200) { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + + ret = gup_set_ic_msg(client, 0x4010, 0x00); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]DSP_CK and DSP_ALU_CK PowerOn fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]disable wdt fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]clear cache enable fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]set boot from sram fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]software reboot fail."); + return FAIL; + } + + return SUCCESS; +} + +s32 gup_enter_update_mode_fl(struct i2c_client *client) +{ + s32 ret = -1; + + + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_int_gpio, (client->addr == 0x14)); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + msleep(5); + + + ret = gup_hold_ss51_dsp(client); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]hold ss51 & dsp failed."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]clear control flag fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]enable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode) +{ + s32 ret = 0; + + + GTP_DEBUG("[download_fw_dsp]step1:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + if (ret == FAIL) { + GTP_ERROR("select bank 2 fail"); + return FAIL; + } + + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("[download_fw_dsp]Begin download dsp fw---->>"); + + if (ret <= 0) { + GTP_ERROR("[download_fw_dsp]select bank2 fail."); + return FAIL; + } + GTP_DEBUG("burn fw dsp"); + ret = gup_burn_fw_proc(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[download_fw_dsp]download FW dsp fail."); + return FAIL; + } + GTP_INFO("check firmware dsp"); + ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("check fw dsp failed!"); + return FAIL; + } + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + GTP_INFO("[download_fw_dsp]Begin esd check dsp fw---->>"); + + + + + { + + GTP_INFO("esd recovery redownload firmware dsp code"); + ret = gup_burn_fw_proc(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("redownload fw dsp failed!"); + return FAIL; + } + } + } else { + GTP_INFO("check firmware dsp"); + ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("check fw dsp failed!"); + return FAIL; + } + } + return SUCCESS; +} + +static s32 gup_burn_fw_proc(struct i2c_client *client, u16 start_addr, s32 start_index, s32 burn_len) +{ + s32 ret = 0; + + GTP_DEBUG("burn firmware: 0x%04X, %d bytes, start_index: 0x%04X", start_addr, burn_len, start_index); + + ret = i2c_write_bytes(client, start_addr, (u8 *)>p_default_FW_fl[FW_HEAD_LENGTH + start_index], burn_len); + if (ret < 0) { + GTP_ERROR("burn 0x%04X, %d bytes failed!", start_addr, burn_len); + return FAIL; + } + return SUCCESS; +} + +static s32 gup_check_and_repair(struct i2c_client *client, u16 start_addr, s32 start_index, s32 chk_len) +{ + s32 ret = 0; + s32 cmp_len = 0; + u16 cmp_addr = start_addr; + s32 i = 0; + s32 chked_times = 0; + u8 chk_fail = 0; + + GTP_DEBUG("check firmware: start 0x%04X, %d bytes", start_addr, chk_len); + while ((chk_len > 0) && (chked_times < GTP_CHK_FW_MAX)) { + if (chk_len >= GUP_FW_CHK_SIZE) { + cmp_len = GUP_FW_CHK_SIZE; + } else { + cmp_len = chk_len; + } + ret = i2c_read_bytes(client, cmp_addr, chk_cmp_buf, cmp_len); + if (ret < 0) { + chk_fail = 1; + break; + } + for (i = 0; i < cmp_len; ++i) { + if (chk_cmp_buf[i] != gtp_default_FW_fl[FW_HEAD_LENGTH + start_index + i]) { + chk_fail = 1; + i2c_write_bytes(client, cmp_addr + i, >p_default_FW_fl[FW_HEAD_LENGTH + start_index + i], cmp_len-i); + GTP_ERROR("Check failed index: %d(%d != %d), redownload chuck", i, chk_cmp_buf[i], + gtp_default_FW_fl[FW_HEAD_LENGTH + start_index + i]); + break; + } + } + if (chk_fail == 1) { + chk_fail = 0; + chked_times++; + } else { + cmp_addr += cmp_len; + start_index += cmp_len; + chk_len -= cmp_len; + } + } + if (chk_len > 0) { + GTP_ERROR("cmp_addr: 0x%04X, start_index: 0x%02X, chk_len: 0x%04X", cmp_addr, + start_index, chk_len); + return FAIL; + } + return SUCCESS; +} + +static u8 gup_download_fw_ss51(struct i2c_client *client, u8 dwn_mode) +{ + s32 section = 0; + s32 ret = 0; + s32 start_index = 0; + u8 bank = 0; + u16 burn_addr = 0xC000; + + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("download firmware ss51"); + } else { + GTP_INFO("check firmware ss51"); + } + for (section = 1; section <= 4; section += 2) { + switch (section) { + case 1: + bank = 0x00; + burn_addr = (section - 1) * FW_SS51_SECTION_LEN + 0xC000; + break; + case 3: + bank = 0x01; + burn_addr = (section - 3) * FW_SS51_SECTION_LEN + 0xC000; + break; + } + start_index = (section - 1) * FW_SS51_SECTION_LEN; + + GTP_DEBUG("download firmware ss51: select bank%d", bank); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, bank); + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_DEBUG("download firmware ss51 section%d & %d", section, section+1); + ret = gup_burn_fw_proc(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("download fw ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + GTP_DEBUG("check firmware ss51 section%d & %d", section, section+1); + ret = gup_check_and_repair(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("check ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + + + + { + + GTP_DEBUG("esd recovery redownload ss51 section%d & %d", section, section+1); + ret = gup_burn_fw_proc(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("download fw ss51 section%d failed!", section); + return FAIL; + } + } + } else { + GTP_DEBUG("check firmware ss51 section%d & %d", section, section+1); + ret = gup_check_and_repair(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("check ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + } + } + + return SUCCESS; +} + + +static s32 gup_prepare_fl_fw(char *path, st_fw_head *fw_head) +{ + s32 ret = 0; + s32 i = 0; + s32 timeout = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + + if (!memcmp(path, "update", 6)) { + GTP_INFO("Search for GT9XXF firmware file to update"); + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) { + if (0 == searching_file) { + GTP_INFO("Force terminate auto update for GT9XXF..."); + return FAIL; + } + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", FL_UPDATE_PATH, FL_UPDATE_PATH_SD, i+1, GUP_SEARCH_FILE_TIMES); + update_msg.file = filp_open(FL_UPDATE_PATH, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) { + update_msg.file = filp_open(FL_UPDATE_PATH_SD, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) { + msleep(3000); + continue; + } else { + path = FL_UPDATE_PATH_SD; + break; + } + } else { + path = FL_UPDATE_PATH; + break; + } + } + searching_file = 0; + if (i == 50) { + GTP_INFO("Search timeout, update aborted"); + return FAIL; + } else { + GTP_INFO("GT9XXF firmware file %s found!", path); + _CLOSE_FILE(update_msg.file); + } + while (ts->rqst_processing && (timeout++ < 5)) { + GTP_DEBUG("request processing, waiting for accomplishment"); + msleep(1000); + } + } + GTP_INFO("Firmware update file path: %s", path); + + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.fw_total_len = update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_END); + + update_msg.force_update = 0xBE; + if (update_msg.fw_total_len != sizeof(gtp_default_FW_fl)) { + GTP_ERROR("Inconsistent fw size. default size: %d(%dK), file size: %d(%dK)", sizeof(gtp_default_FW_fl), sizeof(gtp_default_FW_fl)/1024, update_msg.fw_total_len, update_msg.fw_total_len/1024); + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + return FAIL; + } + + update_msg.fw_total_len -= FW_HEAD_LENGTH; + GTP_DEBUG("Fimrware size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len / 1024); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + ret = update_msg.file->f_op->read(update_msg.file, (char *)gtp_default_FW_fl, + update_msg.fw_total_len + FW_HEAD_LENGTH, + &update_msg.file->f_pos); + update_msg.fw_total_len += FW_HEAD_LENGTH; + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + + if (ret < 0) { + GTP_ERROR("read %s failed, err-code: %d", path, ret); + return FAIL; + } + return SUCCESS; +} +static u8 gup_check_update_file_fl(struct i2c_client *client, st_fw_head *fw_head, char *path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + + if (NULL != path) { + ret = gup_prepare_fl_fw(path, fw_head); + if (FAIL == ret) { + return FAIL; + } + } else { + update_msg.fw_total_len = sizeof(gtp_default_FW_fl); + } + + memcpy(fw_head, gtp_default_FW_fl, FW_HEAD_LENGTH); + GTP_INFO("FILE HARDWARE INFO: %02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID: %s", fw_head->pid); + fw_head->vid = ((fw_head->vid & 0xFF00) >> 8) + ((fw_head->vid & 0x00FF) << 8); + GTP_INFO("FILE VID: %04x", fw_head->vid); + + + fw_checksum = 0; + for (i = FW_HEAD_LENGTH; i < update_msg.fw_total_len; i += 2) { + fw_checksum += (gtp_default_FW_fl[i] << 8) + gtp_default_FW_fl[i+1]; + } + ret = SUCCESS; + + GTP_DEBUG("firmware checksum: %x", fw_checksum&0xFFFF); + if (fw_checksum & 0xFFFF) { + GTP_ERROR("Illegal firmware file."); + ret = FAIL; + } + + return ret; +} + +s32 gup_fw_download_proc(void *dir, u8 dwn_mode) +{ + s32 ret = 0; + u8 retry = 0; + st_fw_head fw_head; + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(i2c_connect_client); + if (NULL == dir) { + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("[fw_download_proc]Begin fw download ......"); + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + GTP_INFO("[fw_download_proc]Begin fw esd recovery check ......"); + } else { + GTP_INFO("[fw_download_proc]Being fw repair check......"); + } + } else { + GTP_INFO("[fw_download_proc]Begin firmware update by bin file"); + } + + total_len = 100; + show_len = 0; + + ret = gup_check_update_file_fl(i2c_connect_client, &fw_head, (char *)dir); + show_len = 10; + + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]check update file fail."); + goto file_fail; + } + + if (!memcmp(fw_head.pid, "950", 3)) { + ts->is_950 = 1; + GTP_DEBUG("GT9XXF Ic Type: gt950"); + } else { + ts->is_950 = 0; + } + + if (NULL != dir) { + gtp_irq_disable(ts); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + } + + ret = gup_enter_update_mode_fl(i2c_connect_client); + show_len = 20; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]enter update mode fail."); + goto download_fail; + } + + while (retry++ < 5) { + ret = gup_download_fw_ss51(i2c_connect_client, dwn_mode); + show_len = 60; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]burn ss51 firmware fail."); + continue; + } + + ret = gup_download_fw_dsp(i2c_connect_client, dwn_mode); + show_len = 80; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]burn dsp firmware fail."); + continue; + } + + GTP_INFO("[fw_download_proc]UPDATE SUCCESS."); + break; + } + + if (retry >= 5) { + GTP_ERROR("[fw_download_proc]retry timeout,UPDATE FAIL."); + goto download_fail; + } + + if (NULL != dir) { + gtp_irq_enable(ts); + gtp_fw_startup(ts->client); + #if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); + #endif + } + show_len = 100; + return SUCCESS; + +download_fail: + if (NULL != dir) { + gtp_irq_enable(ts); + gtp_fw_startup(ts->client); + #if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); + #endif + } +file_fail: + show_len = 200; + + return FAIL; +} + +#endif + + diff --git a/drivers/input/touchscreen/GT917D/FW_BIEL.txt b/drivers/input/touchscreen/GT917D/FW_BIEL.txt new file mode 100644 index 0000000000000..88bf7ac73e24a --- /dev/null +++ b/drivers/input/touchscreen/GT917D/FW_BIEL.txt @@ -0,0 +1,5633 @@ +0x00,0x01,0x60,0x00,0x39,0x31,0x37,0x44,0x00,0x00,0x00,0x00,0x50,0x03,0x80,0x00, +0x55,0x40,0xbd,0xda,0xfd,0x24,0x34,0xdf,0x44,0x40,0x44,0x02,0xbe,0x03,0x08,0xb4, +0x27,0x41,0x8c,0x90,0x4c,0xa4,0x22,0xb7,0xed,0x5e,0x58,0x34,0x17,0xbf,0x01,0x08, +0x84,0x00,0x72,0xfc,0x81,0xd9,0x39,0x25,0xc8,0xe2,0x39,0x87,0x0f,0xed,0x09,0x1d, +0xc9,0x1a,0xe9,0xd5,0x5f,0x2e,0x23,0xb6,0x6d,0x4b,0xa6,0xe6,0xa3,0x7e,0x3f,0x64, +0xfb,0x1b,0x67,0xa6,0xf2,0xb5,0xf4,0x02,0xa9,0x4b,0x2b,0x1f,0x7c,0xdb,0x58,0x96, +0x51,0xda,0x75,0x4a,0xb0,0xa0,0x5d,0x1b,0x2b,0x01,0x0c,0x9b,0x51,0x8b,0x3f,0xa3, +0x77,0x82,0xee,0xf4,0x31,0xb9,0xe5,0x03,0xe6,0x4c,0xea,0xc0,0x21,0x1b,0x7e,0xb3, +0xe8,0x08,0x32,0x7e,0x30,0x5a,0x20,0x67,0x60,0x57,0x5d,0xfe,0xd2,0xe7,0xd2,0xac, +0x2e,0x48,0x98,0x22,0x39,0xb8,0x96,0xde,0xc8,0x68,0x3a,0x8e,0xdf,0x4f,0x9a,0x18, +0x09,0x49,0xc2,0x8f,0xf8,0x26,0x3a,0x11,0xa8,0x2f,0x35,0x42,0x84,0x94,0x8c,0x7b, +0x2b,0x6f,0x43,0x51,0x03,0x2c,0xeb,0x21,0x17,0xc5,0x03,0xa9,0xd0,0x1c,0xce,0x8b, +0x89,0x0b,0xeb,0xdd,0x5b,0x24,0xaf,0xd3,0x8a,0xab,0x44,0x35,0xf7,0x2d,0x43,0x37, +0x76,0xf3,0x65,0xae,0xfa,0xd0,0xe8,0x4c,0xf4,0x93,0x6f,0xe7,0xe5,0x9c,0xcc,0xd2, +0x08,0xcd,0x9f,0xa2,0xfa,0xbe,0x23,0x1e,0xa0,0x42,0x23,0x58,0x68,0x7f,0x7c,0xec, +0x71,0x06,0xed,0xaf,0xee,0x92,0xd2,0x02,0xa2,0x0a,0xba,0x1e,0x3b,0x51,0x25,0xbb, +0x2c,0x4e,0xb0,0x33,0x7b,0x9e,0x5a,0x1f,0xef,0xe2,0x64,0x40,0x24,0xb2,0x04,0x80, +0x78,0xf8,0xbe,0x7b,0x36,0xc1,0x74,0x7c,0xad,0xdd,0x04,0xdb,0xa8,0x7f,0xde,0xb0, +0x26,0xe9,0xaf,0x3c,0xe9,0x02,0x6f,0x97,0x9e,0xdb,0xbf,0x56,0x91,0x60,0x4f,0x28, +0x82,0x11,0x94,0x81,0xc5,0xa9,0xce,0xa0,0x6e,0x5b,0xa7,0x8f,0x53,0x8e,0x02,0x1d, +0x24,0xe6,0x2c,0x39,0x2d,0x40,0xca,0x11,0x08,0x63,0x36,0xae,0x52,0xf6,0xbb,0xb2, +0xf4,0xcb,0xfb,0x4a,0xc3,0x02,0xc4,0x20,0x7a,0x69,0xff,0x0b,0x56,0xdf,0x76,0x4b, +0xd8,0x98,0xcf,0x27,0xb7,0xe8,0x5d,0xc6,0xc0,0x14,0x23,0x8a,0x5d,0xaa,0x85,0xc0, +0x2d,0x7a,0xfb,0xc3,0x20,0x3e,0x43,0xe7,0x73,0x99,0xad,0x65,0x0f,0x87,0x2e,0x2b, +0x23,0x77,0x28,0x2b,0x4a,0x61,0xa8,0x0f,0xfb,0x6a,0xe2,0x50,0x08,0xeb,0xc6,0x55, +0x4c,0x03,0x2d,0xf3,0xed,0x76,0x5c,0x35,0x9f,0xd5,0x05,0x52,0x5c,0xef,0x71,0x1a, +0xa1,0x11,0xfa,0x61,0x07,0x7b,0x9d,0xe7,0x2a,0x55,0x8b,0xc3,0xa1,0x76,0xf8,0xfb, +0x4f,0x04,0xf1,0xcb,0x1e,0x76,0xf3,0x8e,0xc9,0x7a,0x97,0xa0,0x0e,0x7a,0xd0,0xdb, +0xde,0xe3,0x8b,0x0e,0x45,0x28,0x09,0xdb,0xc8,0x4e,0xbd,0x42,0x01,0x74,0x86,0xc9, +0xa5,0x1f,0xb9,0xb6,0xa0,0xa3,0x40,0xee,0xfb,0x13,0x02,0xb6,0xeb,0x1f,0xa9,0x27, +0xca,0xcb,0xf4,0x82,0x84,0xb0,0xce,0x92,0xb7,0x52,0x3b,0x86,0xed,0x60,0x29,0xdc, +0x27,0x93,0x40,0x1e,0x19,0xf0,0x69,0x0b,0xfa,0x11,0xfe,0x6d,0x35,0x9e,0xb4,0xfd, +0x62,0x10,0xe0,0x33,0x5a,0xa3,0x6d,0xa3,0x77,0x50,0xba,0xbd,0xef,0xc2,0x20,0x02, +0x04,0xc0,0x7f,0xab,0x12,0x52,0x22,0x3a,0xd5,0xac,0x42,0xe0,0xf6,0xac,0x28,0x12, +0x05,0xc1,0xaa,0xeb,0x74,0x7a,0x32,0x12,0xd4,0xa5,0x4d,0x37,0x11,0xd5,0x21,0x1f, +0x84,0x82,0x58,0x41,0x60,0xee,0xe5,0x71,0x87,0x32,0xc1,0xf8,0x3b,0xa3,0x29,0x92, +0x85,0x83,0xa9,0x93,0xda,0x4e,0x31,0x23,0x26,0x09,0x19,0x39,0x59,0xee,0xcc,0xc8, +0xfd,0x74,0x4b,0xf7,0xb5,0x1b,0xd4,0x4e,0xad,0xa0,0x24,0x98,0xaf,0x87,0xc0,0x81, +0xf6,0x86,0xb6,0xb4,0x07,0x0e,0xcc,0x19,0xc9,0x84,0xd5,0xd3,0xce,0xe7,0x0f,0xa1, +0x33,0xc7,0xdb,0xff,0x65,0xe7,0x4c,0xe4,0x2d,0xc9,0x8e,0x1d,0xf8,0x79,0xd7,0x5a, +0x21,0x29,0x49,0x57,0x6a,0x56,0x00,0xdc,0xcf,0xe5,0x17,0x66,0x49,0xda,0x22,0x0a, +0x0c,0xc8,0xc2,0x4e,0xa2,0x23,0x12,0x2b,0x09,0x07,0x22,0xee,0x58,0x05,0x2a,0x1a, +0x0d,0xc9,0x42,0x21,0x9f,0x7d,0x3e,0x3e,0x0d,0xd9,0x06,0x1a,0xc5,0xad,0x23,0x8f, +0x8c,0x8a,0xa7,0xed,0x1b,0xff,0xdc,0x59,0x4c,0xba,0x23,0x80,0x2b,0xaa,0x66,0xdd, +0x8d,0x8b,0x58,0xef,0x8c,0xa4,0x7b,0x1b,0xcc,0xcf,0x1a,0x38,0x3c,0x8d,0x58,0x0d, +0xd4,0x33,0x1d,0x30,0x30,0x73,0x4c,0x6c,0x76,0x63,0x13,0x2e,0x12,0x71,0x3a,0x2d, +0x45,0xca,0x3e,0x04,0xd6,0xe9,0x04,0x7d,0xfe,0xc2,0x87,0x63,0xcc,0xe0,0x59,0xd1, +0x7d,0x53,0xcc,0xea,0x47,0x32,0xd3,0x18,0x42,0x9d,0x16,0x95,0x67,0xb8,0x05,0x29, +0x02,0x79,0x3f,0x0c,0x1b,0xd9,0x45,0x99,0x63,0xc0,0xc1,0x34,0x68,0x62,0x1e,0x60, +0x88,0x6e,0x64,0x87,0xaa,0x45,0x3c,0x08,0x85,0xb6,0x24,0xd4,0xa5,0xef,0x2c,0x6f, +0x25,0x1c,0x73,0x9e,0xb2,0xb6,0x88,0x58,0x84,0xb7,0x2b,0x49,0x80,0x92,0x5e,0x5d, +0x13,0x89,0xf0,0x03,0xbc,0xc4,0x81,0x4d,0x05,0xb4,0xeb,0x45,0xe4,0x0f,0xd5,0x9b, +0x7a,0x0c,0x05,0x35,0x6a,0xec,0x89,0xf9,0x2c,0x97,0x46,0xcd,0xdb,0x6c,0x1d,0xe5, +0x87,0x85,0x99,0xec,0xb2,0xf5,0x46,0xda,0x95,0xe9,0x11,0x1d,0x87,0xa2,0x52,0xd4, +0x6d,0xd1,0xec,0x1f,0x81,0xb5,0x07,0xfc,0xc4,0x68,0x7b,0x25,0xd4,0xab,0x1d,0x90, +0x05,0x89,0x94,0xc7,0x3f,0x81,0xd6,0x01,0x06,0x47,0x8e,0x8d,0x6c,0xe9,0x35,0xd7, +0xed,0xf3,0xfa,0xad,0x2b,0xb8,0x4f,0xcb,0x14,0x8a,0xc7,0xac,0x48,0x7a,0x78,0xa8, +0xf9,0x33,0x0e,0x3d,0xf4,0xcb,0x1f,0xe4,0xa5,0xbc,0x0d,0x35,0x8d,0xee,0x1e,0x6b, +0x00,0xe9,0x75,0x9c,0x42,0x39,0x10,0xbc,0xfc,0x85,0xd9,0x40,0x21,0x57,0xa2,0xd0, +0xc7,0x0a,0x07,0x9c,0x8a,0xde,0x9e,0x49,0x40,0xc6,0xbf,0xbe,0x0f,0x27,0x71,0x90, +0xad,0x30,0x47,0x3d,0x19,0x3c,0x11,0xbc,0x78,0x25,0xc7,0xd4,0x1c,0x27,0x5e,0x62, +0x8d,0xdd,0xc4,0x91,0xeb,0x00,0xd5,0x08,0x8e,0x60,0xdd,0x00,0x9f,0xe0,0xce,0xf3, +0xc4,0xd9,0x93,0x36,0x2d,0x40,0x4c,0xc3,0xbe,0xce,0x80,0x1c,0xca,0x2b,0x92,0xca, +0xac,0x33,0x9c,0xbc,0x1d,0xc2,0x46,0x09,0x72,0xd1,0x8a,0xcb,0x43,0x08,0x51,0xdc, +0x99,0x30,0x78,0x20,0x4a,0xdc,0x69,0x19,0x14,0xe2,0x77,0x1d,0x46,0x49,0x88,0xe2, +0xf1,0x89,0x33,0xbc,0xec,0x93,0xaf,0xc6,0x64,0x55,0x15,0x67,0x43,0x4c,0x69,0x41, +0xa2,0x40,0x88,0x90,0x15,0x30,0x70,0x37,0xc2,0x05,0x0e,0xd9,0xb8,0x5b,0x21,0x4b, +0xe1,0x06,0xae,0x6a,0x49,0xb9,0xb1,0x32,0x4c,0x4d,0x33,0x66,0x60,0x20,0xb4,0x8e, +0x6a,0x0c,0xae,0xbd,0xb3,0x22,0xd9,0x21,0x57,0x01,0xdb,0xce,0x38,0x50,0x08,0x44, +0x8b,0xca,0x88,0x40,0xbb,0x4a,0x2e,0x20,0xeb,0xf5,0x6e,0xe1,0xa5,0xc9,0xa2,0x41, +0x69,0xa8,0x4c,0x27,0x65,0xaa,0x27,0x88,0x43,0xe4,0x0e,0x0a,0x21,0xca,0x81,0x74, +0x16,0x2a,0xff,0xf8,0x71,0x2d,0x57,0xd0,0x2b,0x1c,0x42,0xe0,0xaa,0xc9,0xde,0x77, +0x6e,0x65,0xd1,0xcc,0x7a,0xd4,0x61,0x8e,0x32,0x05,0x0b,0xb2,0x3a,0x84,0xbb,0x96, +0x0d,0x07,0xc7,0xe4,0x67,0xe5,0x10,0xa6,0x4e,0xc8,0x3e,0xb7,0x5b,0xca,0x33,0x82, +0x40,0x06,0xce,0x98,0x75,0xff,0x20,0xdd,0xa8,0x2f,0xe5,0x4f,0x63,0x05,0x3e,0x92, +0x8d,0x05,0x2f,0x9f,0x9c,0x20,0xf2,0xad,0x88,0x1c,0xad,0xe4,0xb8,0xb5,0x9b,0x73, +0xa8,0xfb,0xd4,0x09,0x9f,0x0b,0xaf,0x6a,0x45,0xe7,0xfc,0x7d,0xdd,0x47,0x3c,0xed, +0xe3,0x0f,0xd4,0x2e,0xe5,0x81,0xc4,0x11,0xa3,0x7f,0xb4,0xc8,0xb3,0x4f,0x1a,0x66, +0x77,0x16,0x31,0x7b,0xba,0x41,0x71,0xb8,0x57,0x0f,0x0b,0xf8,0x37,0x8c,0x87,0xba, +0xe8,0xa3,0x10,0xc9,0xf6,0xff,0x4b,0xe9,0xcc,0xaf,0x13,0x58,0x97,0x66,0xcf,0x07, +0x2f,0xe2,0xad,0xe8,0x72,0xec,0xcd,0x77,0x22,0xfc,0x1b,0x48,0xa9,0x67,0x6d,0x63, +0x04,0xdd,0x27,0x25,0xec,0x73,0x15,0x50,0x64,0x36,0x14,0xe7,0xb7,0x32,0x0d,0xe6, +0xd6,0x01,0xd5,0x90,0xe4,0x74,0xf8,0x56,0x02,0xd1,0xe2,0x08,0xf8,0xbf,0x7e,0x89, +0x45,0xad,0xbb,0x25,0x44,0xc3,0xed,0xa9,0x83,0x32,0x03,0x57,0x9a,0xe1,0xb7,0x6e, +0x85,0x9e,0x33,0x10,0x64,0x51,0xc1,0x83,0x89,0x17,0x9b,0x04,0x18,0x29,0x0c,0x50, +0x24,0xf5,0x57,0x37,0x4a,0x51,0x94,0xd5,0x81,0xf7,0x14,0x23,0x9b,0x97,0x9f,0x97, +0xca,0xa6,0xc0,0xe5,0x92,0xca,0x5c,0x83,0x19,0xf4,0x1c,0xc1,0x3e,0x7d,0x3f,0x70, +0xd0,0xb9,0xfd,0x36,0xc6,0x9b,0x06,0x12,0x94,0x8d,0xb3,0x55,0x1b,0x15,0xaa,0x22, +0xaa,0xba,0xf3,0x95,0xb5,0xd6,0x94,0x02,0xea,0x8a,0x5f,0x71,0x9f,0x7d,0xe2,0x72, +0x4b,0x38,0xef,0x66,0xd3,0xbb,0x68,0xae,0x81,0x57,0x84,0xad,0x87,0xf5,0xea,0x66, +0x4a,0x79,0xd8,0xef,0x53,0x55,0x8e,0xcb,0x3e,0x52,0xcb,0xdc,0x33,0x17,0xe3,0x72, +0xcb,0x5a,0x24,0x28,0x59,0x95,0x41,0xae,0x03,0x3e,0x57,0x98,0x81,0xd7,0xeb,0x66, +0x8d,0x86,0xed,0x95,0xb8,0x7b,0x9f,0xda,0x26,0x19,0xfd,0xbc,0xfa,0x3b,0x15,0x56, +0xc1,0x14,0x55,0x32,0x96,0x31,0x00,0x50,0x81,0x54,0x16,0xf9,0xe9,0xdc,0x14,0xdc, +0x43,0xae,0xa8,0xe0,0xd2,0x8c,0x16,0x9a,0x0a,0x7d,0x84,0xfd,0xd8,0x88,0x7b,0xf0, +0xe2,0xbd,0x38,0x0a,0x53,0x4d,0x6b,0xd0,0xec,0xbf,0x81,0xce,0xe1,0x3f,0x31,0x60, +0x4a,0xbc,0xd5,0xdf,0x08,0x92,0x07,0xfd,0x42,0x31,0x88,0xc3,0x89,0x3d,0x1b,0x45, +0x0a,0x1f,0x8c,0xff,0x04,0xe2,0x48,0x71,0xc8,0xdc,0x5a,0x55,0x2e,0x11,0xec,0xec, +0xf8,0xe3,0x88,0x0a,0x13,0x40,0x8c,0x61,0xc9,0x6d,0xff,0x27,0x3f,0xa3,0x1e,0x86, +0x7f,0x5f,0x37,0x90,0xef,0xc2,0x1f,0x25,0x55,0xcd,0xcf,0x9a,0x21,0xe6,0xd6,0xd9, +0x2e,0xc2,0x4a,0xee,0xd9,0xe1,0x41,0x60,0x49,0xdf,0x2f,0x04,0xd3,0x02,0xa4,0x1c, +0x08,0x9a,0xfa,0x44,0xa5,0x79,0x67,0x91,0x4f,0x59,0xe0,0xe2,0x3a,0x31,0x38,0xcd, +0xec,0x86,0x68,0x35,0x98,0x88,0x22,0x8c,0x2f,0x76,0x00,0x7e,0xbe,0x06,0x18,0xbc, +0x0b,0x2b,0xfb,0x45,0x04,0xae,0x51,0x4f,0x8e,0x65,0xb9,0x72,0x3f,0x25,0x57,0x6e, +0x51,0x28,0xc6,0xd3,0xfb,0xad,0x07,0xca,0xa4,0x38,0x01,0x9f,0xec,0xaa,0x1b,0x6a, +0x50,0x75,0xa6,0x4d,0x44,0xea,0x1c,0x2c,0xdd,0x89,0x29,0xaa,0x30,0x74,0xfe,0xe4, +0xf4,0xea,0x6a,0x1f,0x94,0x12,0x00,0xbd,0xea,0xd9,0xa8,0xc0,0xa2,0x44,0x8f,0xae, +0x73,0x57,0x35,0x98,0xe7,0x0a,0x5b,0x2c,0x4f,0x8e,0xfb,0xbb,0x35,0xb0,0x54,0x61, +0xa3,0x14,0xaa,0x9b,0x99,0xba,0x61,0x3a,0x43,0x84,0xea,0x78,0x03,0xe3,0xf5,0xce, +0x62,0xf7,0xda,0x3e,0x16,0xa7,0x24,0xd2,0xa5,0x5f,0xf0,0x88,0x58,0x0d,0x54,0x93, +0x4d,0x32,0x3d,0x6f,0xbe,0x52,0x46,0xbd,0xa6,0xfe,0x4d,0xc7,0xab,0x7e,0x5d,0xe3, +0xaf,0x5c,0x63,0x2c,0x11,0x03,0x4d,0xc3,0xed,0x8e,0xbb,0xeb,0x92,0xf0,0x55,0xf2, +0x02,0x39,0xd5,0xe3,0x99,0x4e,0x23,0x7f,0x66,0xa1,0x3b,0xa6,0x0d,0xeb,0xde,0x8a, +0xdd,0x5f,0x80,0x4d,0x57,0x4f,0xfb,0x2b,0xb0,0x43,0x98,0x70,0x9d,0x43,0x93,0x64, +0x01,0x0c,0x92,0x27,0xd7,0xa1,0xaa,0x41,0x53,0xb4,0x82,0x0e,0xb7,0xf1,0x24,0xfd, +0x43,0x82,0xdb,0x3b,0x5f,0x41,0x92,0x1a,0xe2,0x33,0xd3,0x6b,0x1f,0x01,0x55,0xb4, +0x5c,0x9c,0xad,0xd7,0xb1,0x9f,0x05,0x40,0xdb,0x7e,0xc3,0x0b,0x7c,0x3d,0x37,0x31, +0x54,0xd6,0x35,0xb6,0xb6,0xa2,0xb4,0xd7,0x0a,0x96,0x7b,0x87,0x52,0x01,0x52,0x1b, +0x65,0x6a,0x39,0x49,0xc2,0x3c,0xbc,0xc7,0x93,0xdf,0x2c,0xca,0x71,0xdd,0xf3,0x99, +0xa5,0x04,0xed,0xbe,0x39,0x1b,0xe3,0x5b,0xe7,0x06,0x6b,0x95,0x01,0x7d,0x53,0x7a, +0x2a,0x61,0xcd,0x3d,0x5e,0xe4,0xfb,0x80,0x81,0x98,0x45,0x88,0x54,0x7c,0x92,0xf4, +0x8f,0xfd,0x4c,0x0c,0x74,0x53,0xff,0x45,0x5b,0xd8,0xb0,0x1f,0x7a,0x19,0xd6,0x92, +0xd4,0xd6,0x08,0xbd,0x81,0x9c,0x41,0x42,0x6d,0x9b,0x61,0xcd,0x4f,0xf0,0x98,0x69, +0x88,0x07,0xb1,0xed,0x93,0x9f,0x84,0x13,0x10,0x69,0x81,0x51,0xfa,0x1b,0x2e,0xe5, +0x0a,0x8b,0x04,0xbc,0x1a,0x97,0xbf,0x93,0x31,0xe8,0xbc,0x78,0x3f,0xdb,0x2e,0x4e, +0x28,0x7d,0xfc,0xcc,0xac,0xb4,0x77,0x99,0x00,0x93,0xd6,0xd2,0x78,0xd4,0x08,0x16, +0xc4,0xb5,0x2a,0x24,0xc2,0xdf,0xa8,0x69,0x0d,0x70,0x79,0xc3,0x80,0x2d,0xc6,0x8c, +0x47,0x2d,0x2c,0xb1,0x1a,0x53,0x4b,0xd0,0x61,0x73,0x4c,0x9d,0x5d,0x75,0x51,0x63, +0x6d,0x9f,0x90,0xac,0xc7,0xfa,0xab,0x7f,0x83,0x37,0x0c,0xf3,0x4e,0xbe,0x3a,0xf3, +0x30,0xbf,0x91,0x08,0x16,0x11,0x2a,0xc8,0xc7,0x0f,0x6f,0x5a,0x82,0xbf,0xcc,0x63, +0x20,0x63,0x4e,0xc3,0x91,0x20,0x41,0xf3,0xe4,0xbe,0x74,0x4b,0x8b,0xea,0x3f,0xdc, +0x24,0xef,0x41,0xc5,0xd8,0x60,0x50,0xc7,0x40,0x60,0xa6,0x0c,0xa3,0x62,0x77,0x38, +0x68,0x2a,0xd0,0x67,0xf2,0x63,0xf5,0xaa,0xc0,0xe3,0xb9,0xdf,0xa4,0x75,0xc0,0x86, +0x28,0x07,0x99,0x47,0xb3,0xdb,0x09,0xb6,0xe5,0x05,0x32,0x17,0x0d,0x2b,0x10,0xf4, +0x30,0x6f,0xc9,0x2b,0xb4,0x64,0xa7,0x0e,0x6d,0x9a,0x48,0x0f,0x9b,0x3f,0x15,0x89, +0x6b,0x6c,0x75,0x27,0x4f,0x69,0xaa,0x1e,0xaa,0x4b,0xd0,0x16,0xf3,0x29,0xf1,0xb1, +0xfb,0x45,0x74,0xaa,0xe4,0x27,0x03,0x11,0xbf,0xe8,0xa1,0x47,0x2c,0x0b,0x1a,0x19, +0x63,0x19,0x7a,0x0e,0x46,0x6a,0xad,0xb3,0xef,0x4c,0x9a,0x20,0x6b,0xc6,0x1d,0x1d, +0x2b,0x58,0x32,0x2d,0x29,0x66,0xe2,0xd0,0xc2,0x04,0x22,0x84,0xd9,0x7b,0x07,0xf0, +0x8c,0x09,0x45,0xda,0xab,0xa7,0x11,0x5b,0xfb,0x64,0x2b,0x14,0x7f,0x78,0x08,0x5e, +0xba,0x17,0x33,0xda,0x5b,0x0b,0xf7,0xab,0xdd,0x43,0x37,0x4f,0x13,0x5a,0x84,0x1c, +0x0b,0x4c,0x7a,0xb6,0x0a,0x61,0xf2,0x98,0xe2,0x9f,0xec,0xc1,0x84,0x93,0x8a,0xcd, +0x65,0x63,0x31,0x7b,0xba,0x43,0xee,0x1a,0xf4,0xe0,0x6c,0x1c,0xf8,0x90,0x63,0xf0, +0xb9,0x80,0xbc,0x49,0x92,0x02,0x2d,0x6e,0x6b,0x11,0xed,0xc1,0xfe,0x68,0xf4,0xca, +0xaa,0xa2,0xad,0x1c,0x72,0x27,0x8e,0x48,0x6a,0xb0,0x6f,0x9f,0xa8,0x8a,0x14,0xbd, +0x67,0x0b,0xdb,0x6c,0xec,0xfd,0x10,0x84,0x40,0x21,0xc2,0x4c,0xac,0xbd,0x74,0x81, +0xc1,0x90,0x73,0x6f,0xbe,0x9c,0x0c,0x98,0x0c,0x13,0x23,0x2f,0x12,0x75,0x8b,0xe7, +0x5f,0xb9,0x41,0x00,0xf3,0xc1,0x97,0x81,0xc2,0x32,0x39,0x20,0x0b,0x1e,0x0b,0x6f, +0x92,0x99,0x45,0x0e,0xd2,0x37,0x17,0x5a,0x08,0x39,0xe4,0xc9,0x63,0x79,0x84,0x55, +0x4c,0x78,0x9d,0xde,0x97,0xc2,0x32,0x02,0x46,0x59,0xc4,0xd6,0xba,0x7b,0x76,0x43, +0x7c,0x57,0x5b,0x32,0x21,0x78,0x6f,0xdc,0x2b,0x04,0x96,0xe9,0x57,0x88,0x7f,0x52, +0x83,0xa9,0x55,0xbb,0x4d,0x7b,0xae,0xc6,0x43,0xe9,0x42,0x16,0xd0,0x4b,0x8b,0x3d, +0xa0,0xd7,0x9f,0xd5,0x14,0x76,0x07,0xb1,0x93,0xf8,0xca,0x06,0x77,0xfa,0xbe,0x72, +0xa7,0xce,0xff,0xfd,0x33,0x2e,0x4e,0xe9,0x5b,0xf3,0x12,0x5d,0x0d,0x3b,0xb6,0x5f, +0xeb,0x39,0x69,0x63,0xd8,0xbf,0xe1,0xc6,0x4b,0xb4,0x0b,0xb8,0x70,0x1d,0x0f,0x91, +0x9b,0x54,0xcf,0x90,0x35,0xb7,0xaf,0x57,0xf8,0x17,0xc7,0x85,0xb0,0x7b,0x47,0xbd, +0xca,0x3b,0x8f,0x19,0xff,0x64,0x99,0xfe,0x08,0xad,0x33,0xce,0x8c,0xdd,0x86,0x5d, +0xe6,0xb7,0x39,0x30,0x3a,0x7e,0xf6,0x9a,0x08,0x78,0x05,0x1f,0xf6,0x3d,0x16,0xc8, +0x40,0xe4,0xd9,0x2f,0x43,0xb0,0xe5,0x07,0x9f,0x0c,0x21,0x14,0xe1,0x30,0xdc,0xc5, +0x43,0xc7,0xc3,0x8e,0x4f,0x9f,0x29,0xee,0x13,0x51,0xb7,0xef,0xdd,0x73,0xcf,0xfd, +0x26,0xb2,0x99,0xe5,0x50,0xae,0x59,0xd5,0x88,0x57,0x24,0xba,0x25,0x3e,0x98,0x91, +0x34,0xcf,0xa8,0x86,0xf5,0xef,0x32,0xe4,0x38,0x4d,0xcf,0x54,0x96,0xe0,0xd0,0xfa, +0xc8,0xcc,0xbd,0x92,0x16,0x61,0x61,0xf1,0xe0,0x60,0x3f,0x71,0x66,0x4f,0x60,0x65, +0x46,0x82,0xf1,0x2f,0x88,0xe0,0xc9,0x83,0xb8,0x90,0x71,0xb2,0xe3,0xe8,0x28,0xb3, +0x68,0x81,0xf7,0x6a,0xd5,0xef,0x28,0xd5,0x2c,0xa9,0x01,0xa4,0xed,0xac,0xaf,0xc6, +0x48,0x7f,0xfa,0x44,0xa5,0x79,0x4e,0xce,0x68,0x1b,0xaf,0x06,0x3d,0x27,0xce,0xa3, +0x72,0xc6,0x44,0x25,0x10,0x03,0xd8,0x82,0xef,0x16,0xe3,0x9e,0x45,0xa8,0x69,0x4b, +0x80,0x64,0xfb,0x45,0x04,0xe7,0x2b,0x03,0xba,0x69,0x71,0x43,0x37,0x49,0x49,0x7b, +0x08,0x7a,0xf1,0x24,0xc8,0x2e,0x07,0x74,0x66,0x86,0x99,0x69,0xac,0xe8,0x72,0x33, +0x08,0xc6,0x76,0x2a,0x3c,0xb9,0x2a,0x2e,0xad,0x87,0xf3,0x48,0x9e,0xe8,0x84,0xea, +0x05,0xc6,0x3f,0x1a,0x35,0x27,0x58,0x32,0x4c,0x09,0x84,0x42,0x7e,0xfb,0x30,0xcd, +0xf4,0x91,0x23,0x2e,0x5f,0xa9,0x6a,0xe8,0x69,0xa4,0x4b,0xde,0xa9,0xba,0x2a,0xeb, +0xfd,0xc4,0x6b,0x8a,0xd8,0xa1,0x01,0xdd,0xa6,0x32,0xb7,0xf3,0xdb,0x09,0x04,0x63, +0x6d,0x88,0xc2,0xa4,0xf7,0x86,0xde,0x82,0x9a,0x81,0x92,0x70,0x74,0xe1,0x6c,0xde, +0x41,0x69,0xb3,0xdd,0xba,0x72,0x60,0x78,0xa4,0xc2,0x6a,0x1c,0xe4,0x61,0x1a,0x37, +0x1c,0x86,0xf9,0x4d,0x0c,0xef,0x15,0xaf,0x27,0xe4,0x93,0x71,0x4a,0xe1,0x4b,0xca, +0xbc,0x01,0xea,0x98,0x3a,0x50,0x3a,0x1d,0xae,0xcb,0xb1,0x62,0xb4,0xe0,0x04,0x16, +0xd5,0x3b,0xac,0x83,0x14,0x61,0xcb,0xd0,0xb2,0x0f,0xa5,0x55,0x01,0x9e,0x2a,0x6c, +0xd8,0xff,0xca,0xbe,0xde,0x68,0x02,0x73,0x63,0x33,0x82,0x6b,0x73,0x13,0x5d,0x92, +0x44,0x13,0xe8,0xc0,0x5d,0x6b,0x99,0xdc,0x2e,0x98,0x8b,0x63,0x3e,0xfb,0xce,0xd3, +0xbf,0x88,0xf5,0x93,0x32,0x90,0xe2,0x73,0xa5,0x06,0xb2,0x77,0xbd,0xb1,0xac,0x51, +0x07,0x39,0x08,0xb5,0x4e,0x32,0xe7,0x11,0xe2,0x59,0xcc,0x1a,0x76,0xe8,0x24,0x43, +0x21,0x57,0xec,0xf2,0xb5,0x99,0xec,0x0c,0xcb,0xd8,0xc4,0x09,0xd2,0x03,0xaa,0x47, +0xe8,0x2e,0x1a,0xb4,0xc6,0x30,0x27,0xe0,0x0d,0xb2,0xca,0xad,0xe6,0xb7,0x95,0x13, +0xa5,0x8c,0xe2,0xb5,0x40,0xd2,0xd1,0x60,0x99,0x28,0x02,0x7f,0x52,0x71,0xce,0xec, +0x4d,0xb8,0xf6,0x2f,0x15,0xfa,0x7a,0x95,0x6b,0xc3,0x74,0x48,0x7f,0xc8,0xd6,0x12, +0x88,0x38,0x16,0x64,0x2d,0xf4,0x76,0x3e,0x98,0x96,0x12,0x2d,0x4d,0x56,0x3f,0x87, +0xcf,0xda,0x61,0x3e,0x8f,0x34,0x5e,0x2f,0xaa,0x65,0x89,0xd3,0xdd,0x5a,0x3e,0x7d, +0x2d,0xa9,0xd0,0xd8,0x40,0x0d,0x3e,0xc4,0x4a,0xd8,0x24,0xcc,0x88,0xf0,0x8c,0xac, +0x46,0x8d,0xde,0x31,0x1a,0xa7,0xcd,0x79,0x18,0x03,0xf6,0x10,0xf1,0x41,0x68,0x9a, +0x3f,0x36,0xd6,0x81,0x98,0xad,0x64,0xf8,0xdc,0x80,0x9e,0xfc,0x02,0xf0,0x9f,0xad, +0x23,0x18,0xec,0xad,0x41,0xdb,0x9b,0x84,0x30,0x03,0x10,0x95,0x28,0xbf,0xf0,0xde, +0x8b,0x12,0x50,0x39,0x9b,0xa4,0x65,0xf9,0x7d,0x9e,0x00,0x03,0xff,0x64,0x00,0xf9, +0x14,0x42,0xc3,0x86,0x9d,0x6a,0x2a,0xc8,0xda,0x0f,0xc9,0x75,0x56,0x10,0x36,0x38, +0x69,0x0c,0x44,0x72,0x32,0x03,0xac,0xd2,0x65,0x47,0x23,0xd6,0xfd,0x9c,0x05,0x42, +0x0f,0x43,0xb9,0xe5,0xd6,0x39,0x71,0x62,0xb8,0x4d,0xd1,0xa1,0x80,0xa9,0x1b,0xba, +0x6a,0x47,0xd0,0x30,0x34,0x28,0x35,0x7a,0x60,0xc3,0xe1,0xdd,0x98,0x2e,0x43,0x48, +0xa3,0x9b,0xa0,0x03,0x15,0x2b,0x68,0x9f,0xcf,0xe9,0xd6,0x22,0x38,0x9f,0x4b,0x99, +0x05,0xbf,0x64,0x90,0xb2,0x2c,0x3a,0x70,0x42,0x57,0x60,0xa4,0x0f,0x9a,0xf5,0x23, +0x79,0x44,0x7e,0xa5,0x88,0x20,0xc2,0xfe,0x2b,0xf7,0x2e,0x41,0xe1,0xa1,0x02,0x4f, +0xbf,0xf3,0x0d,0xd7,0x16,0x77,0xb1,0xec,0xc5,0xd7,0x02,0x75,0xe0,0x13,0x38,0xb8, +0x8d,0xa7,0x06,0x08,0x4b,0x5c,0x6a,0x4a,0xc5,0xce,0x6b,0x24,0xfd,0x17,0x1c,0x7a, +0x69,0xe7,0x32,0x8c,0xbe,0x2d,0x24,0x61,0xee,0x59,0xc8,0xc3,0xae,0x07,0xa7,0x2d, +0x61,0x1b,0x6b,0x90,0xab,0x4b,0x93,0x0d,0xfb,0x12,0x81,0x4b,0x27,0x37,0x75,0x1f, +0x68,0x88,0x8d,0xf5,0xb5,0xa0,0x25,0x65,0x6e,0x0a,0xfb,0x7e,0x88,0x66,0x51,0xcc, +0x5a,0xce,0xfa,0x5c,0xb9,0x21,0x1f,0xec,0x1a,0x5c,0x6a,0x96,0x4a,0x21,0x35,0xdc, +0x17,0x54,0xc9,0x2e,0x99,0x41,0x22,0xfc,0x57,0x14,0x61,0xd9,0x91,0x60,0x7b,0xb3, +0x26,0x03,0x2f,0xdf,0xd2,0x26,0xe8,0x8b,0x66,0xb3,0xac,0xe9,0xd2,0x42,0x8b,0x80, +0xd8,0xdb,0x03,0xbf,0x1b,0x0f,0x9b,0x61,0x8d,0x92,0xa4,0x87,0xe8,0xef,0xd5,0x31, +0x83,0x51,0x63,0xc4,0x34,0x1c,0xeb,0xd2,0x4e,0x8f,0xec,0x83,0x8d,0x7f,0x6e,0x0c, +0xa3,0x3d,0xd4,0x90,0xb8,0xb4,0xa8,0xcf,0xc2,0x10,0x9d,0xd2,0xce,0xf0,0x65,0xc2, +0xf1,0x1f,0xb4,0x01,0xe0,0xfc,0x85,0x5e,0x15,0x5d,0xcc,0xed,0x55,0x2d,0x80,0xf3, +0x63,0x13,0xb7,0x6e,0x4d,0x22,0x22,0x4d,0xe1,0xf2,0x23,0x4a,0x44,0xf0,0x55,0x22, +0xcb,0xec,0xd4,0x59,0x66,0x99,0xab,0x08,0xe6,0x99,0x2b,0x23,0xec,0xa9,0x44,0xe1, +0x17,0x57,0x6c,0xa2,0x10,0x25,0xe7,0x12,0xe4,0xa7,0x83,0x92,0x80,0x65,0x37,0xc5, +0xbe,0x9d,0x09,0x25,0xea,0x2d,0xae,0x9c,0xc3,0xd6,0x34,0x25,0xb4,0x6d,0xcc,0xb2, +0x02,0x9f,0x94,0xf0,0x16,0x3e,0x04,0x34,0x46,0xa8,0x65,0x0e,0x0e,0xc1,0x96,0x0a, +0xa8,0xa0,0x46,0xb5,0x08,0x3e,0xc3,0x57,0x9d,0xfb,0x69,0x52,0xfa,0x54,0x9e,0x1a, +0xa0,0x61,0x3a,0xe3,0x9a,0x82,0x08,0x90,0xda,0x14,0xa6,0x47,0xf6,0x8f,0x3f,0x59, +0xa4,0xe5,0xab,0xc0,0x4d,0x35,0xc6,0x8d,0x8b,0xf0,0x98,0xcf,0x0b,0x1f,0x37,0x67, +0x05,0x16,0x8b,0xa2,0x89,0x79,0x8f,0x46,0x1c,0x14,0xa4,0x23,0xf8,0x89,0x66,0x2a, +0x62,0x4d,0x42,0x48,0x6d,0xdf,0x4c,0xe9,0x4b,0x8c,0xed,0x9c,0xfa,0x63,0xcf,0x9f, +0xd6,0x12,0x33,0x30,0x3b,0x90,0x46,0xc9,0x82,0xd7,0xd6,0x7d,0x59,0xde,0x27,0x8a, +0xb7,0x5c,0x57,0x25,0x58,0x73,0x37,0xae,0xed,0x53,0x6c,0x9d,0x7a,0x68,0x2f,0x9a, +0xf2,0x5d,0x40,0x3d,0xf7,0x24,0x07,0xe9,0x02,0x6e,0x5c,0x15,0x49,0x32,0x88,0xf1, +0x88,0xc1,0x24,0xe0,0x7f,0xf1,0x4e,0x25,0xe5,0x6f,0x57,0xa4,0xdd,0x98,0x28,0x2c, +0x33,0x74,0x96,0x4b,0x74,0x81,0x6a,0x16,0xd8,0x3c,0x78,0x3b,0x60,0x5d,0x1f,0xcf, +0x7f,0x19,0x26,0x75,0x7f,0x93,0xe5,0x04,0x65,0x6d,0x89,0xb9,0xd5,0x70,0xfc,0x17, +0x8d,0xed,0xf1,0x13,0x1c,0xb6,0x94,0x7d,0x30,0x9f,0x04,0x6c,0x04,0xbe,0x77,0x5d, +0x72,0x31,0xda,0xc4,0x93,0xf4,0x08,0x45,0xbb,0xcb,0x30,0x76,0x0c,0xff,0x7b,0x6c, +0x3b,0xc7,0xd0,0x27,0x27,0xac,0x21,0x74,0xa2,0x87,0x40,0x8d,0xd8,0x13,0xf2,0x79, +0xfe,0x73,0x99,0xc5,0x1b,0xcc,0x77,0x4b,0x6e,0xf5,0xd9,0x01,0x25,0xf6,0xf6,0x76, +0x7a,0x8e,0xef,0x24,0xa7,0xa8,0xf8,0xb8,0x3a,0xc8,0xc2,0xe9,0xd4,0x07,0xd9,0x75, +0x64,0x85,0x9c,0xcb,0x3f,0xe8,0x08,0xc1,0xff,0x89,0x99,0xaa,0x54,0xc4,0x0c,0xd6, +0xae,0x0c,0xbb,0xf6,0x8f,0xe4,0x95,0xd8,0xe1,0x34,0x07,0xa1,0xa2,0xb4,0xdc,0x75, +0xa8,0x37,0x8f,0x25,0x7d,0x05,0x8b,0xd4,0xdc,0x87,0x73,0x37,0xbb,0x86,0x3d,0xb6, +0x72,0x26,0x54,0x6c,0xad,0xc7,0x43,0x1f,0xad,0x4b,0x58,0xbd,0x54,0x93,0xbc,0xce, +0x5e,0x42,0x0a,0xd3,0xff,0xaa,0x4c,0x43,0x0f,0xc8,0x5e,0x15,0xc0,0x71,0x30,0x1a, +0x67,0xdc,0x2d,0x5b,0xf6,0xbc,0xfe,0x3f,0x7f,0xcf,0x01,0x5a,0x6c,0x86,0x7b,0x37, +0xc6,0xbf,0xc7,0x13,0x3d,0xad,0x0d,0x43,0x33,0xc7,0x12,0x2f,0xd2,0x15,0xab,0x57, +0x26,0x22,0x93,0xff,0x99,0x2d,0x1b,0x38,0xda,0xc2,0x43,0x81,0xcf,0xa2,0xdb,0xa6, +0xdb,0x9d,0xb3,0xae,0xb6,0x9c,0x35,0xdd,0xc3,0x91,0x74,0xbe,0x35,0xfa,0x80,0x0d, +0xd4,0x17,0x13,0x74,0xc9,0xa0,0x9c,0x41,0xe9,0x4c,0x43,0xd8,0xa7,0x2e,0x5e,0xa4, +0x05,0x2d,0xaa,0xf9,0x17,0xd7,0x4b,0xa5,0x05,0x51,0x74,0xe0,0x49,0x44,0x2d,0xb7, +0x6f,0xf0,0x6d,0x07,0x41,0xf1,0x45,0x97,0x67,0xf7,0xe4,0xe6,0xf3,0x83,0xe5,0x85, +0xdb,0x9b,0x6b,0xa0,0x81,0xa4,0x6c,0x7b,0x6b,0xc5,0xf6,0x17,0xd5,0xe4,0xed,0x19, +0xda,0x9a,0xb5,0x3e,0xab,0xf8,0x44,0x0c,0xa6,0xb7,0x84,0xf4,0x73,0xb9,0xa5,0xdb, +0x61,0xd4,0x5d,0x28,0xb0,0xce,0x7d,0x61,0x66,0x7d,0xc7,0x65,0x77,0xa6,0x6b,0xff, +0xef,0xc6,0x96,0xdf,0x12,0x08,0xb9,0x23,0xeb,0xd4,0xab,0x1f,0x19,0xba,0x18,0x2e, +0x4d,0x9c,0x23,0xe2,0xb1,0x3e,0xbd,0xc8,0x4d,0x98,0xf6,0xf5,0xc1,0x44,0x96,0x60, +0x3d,0xd4,0xe6,0xd2,0xb0,0xfb,0x00,0x7f,0x4e,0xf8,0xba,0x79,0x88,0xf6,0x5e,0xaf, +0x9f,0x82,0xe2,0xf1,0x7e,0xba,0x0b,0x12,0x69,0x28,0x9c,0xc1,0x2d,0xb8,0x50,0x9f, +0xa5,0xf5,0xac,0xcf,0xbe,0x0b,0x66,0xbd,0x08,0xd0,0x0b,0xc0,0x5e,0xb9,0x06,0xc8, +0x61,0x91,0x4a,0x4a,0x23,0xb8,0x4e,0x6e,0x61,0xcd,0xf4,0x1f,0xdd,0xec,0x89,0xa9, +0x13,0x1b,0xd5,0x50,0x3c,0xed,0x24,0xfb,0xcc,0x91,0xbe,0xef,0x79,0xcf,0x98,0x8c, +0x47,0x0f,0xef,0xc2,0x47,0xc8,0x0f,0x69,0x63,0x94,0xc5,0x10,0xda,0xfd,0x6f,0x1b, +0xf7,0xfa,0xb6,0x64,0x1a,0xb4,0xb8,0xf9,0xa7,0x52,0xd4,0xb9,0xfd,0xbe,0x50,0x29, +0x58,0x42,0xe0,0x47,0x89,0x2f,0xdb,0x11,0xfc,0xda,0xe9,0xa6,0xd5,0xba,0x49,0x63, +0x70,0x86,0x70,0xfc,0x26,0x63,0xc7,0x12,0x36,0x14,0xd7,0x56,0x87,0x69,0x48,0xc9, +0xa0,0x72,0xd8,0xf0,0x37,0x32,0xa0,0xec,0x21,0xfd,0xa9,0xba,0x52,0x2e,0x89,0x15, +0x01,0x21,0x0c,0x16,0x1e,0x38,0xd9,0xe5,0x83,0x2d,0x9f,0x47,0x53,0x4f,0x1f,0x20, +0x71,0x21,0x44,0x58,0x14,0x74,0x48,0x4c,0xab,0x2e,0x28,0x40,0x54,0x14,0x36,0x90, +0x81,0x69,0x14,0xa0,0x53,0xa8,0x66,0xb5,0x60,0x25,0xb9,0x53,0xf2,0x9a,0x81,0x81, +0x75,0x8b,0xb1,0x05,0x8a,0x3d,0x33,0x60,0xc1,0xc7,0xbb,0xa5,0xd6,0x42,0x50,0xb3, +0x85,0xc6,0xa9,0x17,0x6e,0x28,0xe6,0x11,0x8b,0x44,0x62,0xb2,0x0d,0x6f,0x12,0x0d, +0x04,0x4a,0x64,0x88,0x0c,0x4f,0x4b,0xaa,0x4e,0x18,0xbf,0xce,0x5e,0x22,0xca,0xdd, +0x29,0x08,0xd2,0x18,0x9c,0xfb,0xfe,0x5e,0xbe,0x59,0x5a,0xc0,0x57,0x2b,0xcf,0x9b, +0x0d,0x6a,0x8b,0x19,0x71,0x40,0xe7,0x69,0xe0,0x51,0x29,0xa9,0x93,0x27,0x1e,0x0d, +0x8f,0x91,0xeb,0x1f,0xe4,0x26,0xa3,0xc6,0xfa,0x3f,0xdc,0x61,0x38,0x6d,0x04,0xcc, +0x0c,0xe5,0x9b,0xa9,0xff,0xa6,0x44,0x6c,0xc2,0x56,0x52,0x6f,0xc8,0x77,0x12,0x49, +0x2b,0xdf,0xd2,0x59,0xe5,0xad,0x42,0x7d,0x78,0xd6,0xfe,0xf6,0x7b,0xac,0xeb,0x7d, +0x63,0xf6,0x44,0xb2,0xfb,0x6e,0x0a,0x6f,0x2f,0xb1,0xe7,0x0b,0xfb,0x2e,0xcb,0xaa, +0x84,0x14,0x49,0xdf,0x1a,0xd2,0xa3,0x0a,0xc4,0xc6,0x5b,0x7e,0x49,0x2d,0x15,0x04, +0x40,0x6f,0x98,0x00,0x2c,0x08,0x6c,0xd2,0x8b,0xa8,0xf4,0xa6,0x25,0x7d,0x17,0x22, +0x61,0x63,0xd5,0xf2,0xef,0x23,0x1d,0xd6,0x52,0xea,0xd6,0x29,0x51,0x7c,0xc5,0x89, +0xa0,0xbf,0x45,0x88,0x03,0x29,0x4c,0x3f,0x45,0xad,0x6a,0x20,0xfe,0x10,0x53,0x50, +0x21,0xb8,0x35,0x0b,0xb0,0x53,0xb2,0x57,0xf1,0xae,0xd9,0x31,0xd2,0x73,0x9a,0x26, +0x32,0x5b,0xc2,0xbb,0x53,0x54,0x34,0xa6,0x39,0x5b,0xcc,0xe0,0xfa,0x6e,0x5c,0xd0, +0x25,0x74,0x74,0xc4,0x94,0x33,0x04,0x74,0x7f,0xbb,0x9c,0x70,0x6f,0x66,0x85,0x78, +0xb2,0x54,0x9d,0x7d,0x81,0x00,0xe1,0x03,0x60,0x52,0x8c,0x00,0x17,0x7d,0xa6,0x55, +0x91,0x17,0xed,0x35,0x12,0xc8,0x55,0xfc,0x61,0x53,0x66,0x71,0xe7,0x60,0xce,0x88, +0x57,0x11,0xbc,0x7f,0x65,0x7a,0xee,0xaa,0x0e,0x43,0xcf,0x4c,0x9d,0x71,0x61,0xeb, +0x26,0x12,0xd7,0x3a,0x9c,0xc6,0x47,0x41,0x6f,0xc9,0x92,0xc8,0x4a,0xd2,0xdc,0xaa, +0xae,0x99,0x02,0xa5,0xbb,0x69,0xe7,0xcf,0x9f,0x5a,0x91,0x0d,0xfe,0x3a,0x8e,0x1d, +0xb5,0x0a,0x23,0x75,0x69,0x76,0x70,0x3d,0xf5,0x4a,0x2d,0x6d,0xce,0x5e,0x86,0x15, +0xc2,0x1f,0x7e,0x0b,0xe4,0x36,0x8a,0x8a,0x95,0x81,0xde,0xf9,0x49,0x17,0xf6,0x48, +0x8c,0x50,0x55,0xa6,0xb9,0x11,0x3f,0x10,0x44,0x90,0xfe,0x8e,0xf9,0x31,0x53,0xd0, +0x99,0xe5,0xd0,0xbf,0x45,0x7c,0xb0,0xa9,0xee,0x7a,0x0d,0x6d,0xfc,0xee,0x17,0xc8, +0x2e,0x3e,0x5c,0xbf,0xc7,0x30,0x2d,0xf8,0xbf,0x1d,0x90,0x1f,0x57,0x70,0x12,0x06, +0x57,0x13,0xb8,0xe6,0x12,0xd0,0x88,0xd8,0x54,0x8d,0x98,0x5c,0xf7,0xa2,0xf1,0x31, +0x3a,0x88,0x58,0x51,0x13,0xd1,0x18,0xd8,0xb4,0x48,0xe2,0x54,0x77,0x0c,0xfa,0x90, +0xfb,0x8b,0xb0,0xc7,0xe4,0xb9,0x4e,0xbc,0x31,0x4b,0x6b,0x07,0x56,0xe6,0x77,0x52, +0x8d,0x28,0x7a,0xe7,0x15,0xe1,0x19,0xb9,0xc4,0xa3,0x7d,0xb5,0x14,0x62,0x3b,0x24, +0x45,0x8b,0xd8,0x56,0xb5,0xbf,0x74,0x02,0x42,0xed,0xf3,0x69,0x55,0xa4,0x10,0xb4, +0xa2,0x0f,0xee,0xd2,0x03,0xa2,0x32,0x90,0x66,0x85,0x78,0x9e,0x36,0x6e,0x79,0x4f, +0x23,0x07,0x3d,0x31,0x74,0x26,0x03,0x8b,0xe9,0x0b,0xd5,0xed,0xbd,0x1e,0xee,0xbb, +0x03,0x48,0xe1,0x5e,0x15,0xab,0x5d,0xbb,0xf4,0xac,0xff,0x91,0xe4,0xd1,0xaa,0x28, +0x77,0x81,0x23,0xa0,0x1d,0xc8,0x22,0x9a,0x04,0x65,0x8a,0xdd,0x07,0x65,0xdb,0x9e, +0x14,0xbf,0x25,0xac,0x19,0x4b,0x5a,0x79,0x31,0xc4,0x7a,0xd3,0x1a,0x64,0x78,0x84, +0x8a,0x79,0xb3,0xbf,0xce,0x07,0x2c,0x99,0x5c,0xb8,0xd3,0x6c,0xac,0xe5,0xf4,0x1a, +0x8b,0x7a,0xf2,0xf7,0x38,0x0a,0x63,0x3e,0xae,0x8b,0x44,0xbb,0xf5,0x13,0x5c,0x8f, +0x2d,0x2c,0x5d,0x2c,0x91,0x2a,0xc8,0x8a,0x1e,0x8e,0xa8,0x91,0xd6,0x6a,0xef,0x29, +0x52,0x0a,0xa3,0xb6,0x30,0x60,0x23,0x9f,0x28,0xed,0x7a,0x7d,0xcd,0xf6,0x3a,0x4d, +0x6b,0x87,0xe5,0x0f,0x9a,0x8a,0xf2,0xc9,0xcd,0x2e,0xaa,0x97,0x7b,0xe5,0xeb,0x4f, +0x6e,0x94,0x14,0x2f,0x97,0xa6,0xbb,0x63,0x4f,0x42,0x27,0x09,0x9c,0x1f,0x6c,0x93, +0xc5,0x6f,0x43,0x76,0xb4,0xf2,0x7c,0x97,0xe9,0x6d,0x69,0xc6,0xa9,0x8d,0xa1,0x71, +0x07,0xd3,0xbc,0x26,0x59,0x1c,0x27,0x38,0x64,0xb1,0xdc,0xb4,0x72,0xfc,0xe5,0x5e, +0xf4,0xd0,0x24,0x29,0xb5,0xd2,0xd2,0x53,0x64,0xcd,0x1a,0xf9,0x41,0x2e,0xa9,0x17, +0xf6,0x00,0x22,0x25,0xbd,0xf2,0x2d,0x03,0xf3,0x7e,0xc2,0x4f,0xf5,0x57,0xa4,0x8f, +0xf0,0xd6,0x84,0x85,0x4e,0xb9,0xf5,0x40,0x67,0xe4,0x94,0xe4,0x59,0xf9,0xe3,0xa2, +0x2f,0x9c,0xb0,0xb4,0xc8,0xd9,0x46,0x70,0xe6,0x28,0x50,0x69,0x76,0xb5,0xfa,0x8b, +0x82,0x3b,0x36,0x25,0x34,0xb2,0x2c,0x06,0x81,0x96,0x0a,0x0f,0x6c,0xbb,0x6b,0xa1, +0x94,0xfc,0x8d,0x94,0xc3,0xba,0x05,0x1b,0xc8,0x1a,0xd9,0x7d,0xc4,0x9c,0xe6,0x87, +0x53,0xda,0xc6,0xc8,0x6b,0xb5,0xb9,0x4a,0x2a,0xde,0x7b,0x92,0xb4,0x62,0xcb,0x3a, +0x4f,0xf9,0x06,0x47,0x9c,0x3a,0x46,0xd8,0x4e,0xb9,0x65,0x9d,0x02,0xf0,0x24,0x1d, +0xaa,0x61,0xb1,0xee,0x1f,0xbc,0x1b,0x96,0x4d,0x58,0x20,0x2b,0xff,0xf2,0xef,0x36, +0x7d,0xd9,0xaf,0x7d,0xbb,0xcb,0x61,0xe6,0xe5,0x56,0x0a,0x67,0x49,0x81,0x9c,0xee, +0x1d,0xb9,0x01,0x4c,0xb7,0x0d,0x04,0xee,0x76,0x9e,0x4c,0x5c,0x7c,0xbe,0x6a,0x1a, +0x05,0x86,0xeb,0x2f,0x62,0xfd,0x27,0x1f,0x08,0xbd,0x3e,0xf2,0xcd,0xf7,0xdf,0x34, +0x21,0x18,0xdf,0x5d,0xbe,0xb6,0xf6,0x49,0xed,0x5e,0x37,0xe2,0xcc,0x23,0x18,0xbd, +0xce,0x3f,0xb6,0x54,0xdc,0x40,0x26,0x1e,0x0a,0x58,0xfa,0x17,0xd0,0x34,0x10,0x72, +0x82,0x0c,0x44,0x5a,0x1e,0x3e,0xa8,0xdf,0x61,0xc2,0x5e,0x91,0x98,0x7a,0xb2,0xa2, +0x21,0xb1,0xa4,0xdb,0x72,0x8b,0x9f,0xc1,0x1c,0x01,0xbe,0xe0,0x6b,0xc5,0xbe,0xe3, +0xb3,0x69,0xfc,0xa5,0x31,0x62,0xd1,0x39,0x5c,0x4a,0x43,0x36,0x9b,0x71,0xc9,0x1c, +0xb3,0xde,0x9f,0x28,0x22,0x6e,0xa6,0x61,0xc2,0x0c,0xd4,0x99,0x19,0x39,0x18,0x95, +0xeb,0xc7,0x7b,0x34,0x92,0x8b,0xc7,0x68,0xc2,0xe4,0xf0,0x8e,0xa7,0xed,0xdc,0x23, +0x79,0x47,0xe8,0xc7,0xb0,0x64,0x9c,0xba,0xf8,0x46,0xb2,0x07,0x58,0x2a,0xad,0xd3, +0x8a,0x0c,0xb9,0xcd,0x37,0xaf,0xfa,0x26,0xcc,0x9a,0xf1,0xef,0xf6,0x7d,0x4a,0x2d, +0x6a,0x94,0x09,0x45,0xfc,0x3c,0x61,0xe9,0xa0,0xed,0xd8,0x06,0xd4,0x28,0xc2,0x04, +0xba,0x00,0xda,0x08,0x91,0x56,0x4b,0xa3,0x2b,0x97,0x47,0x5f,0x6a,0xea,0x5a,0xf0, +0x26,0xc4,0xea,0x5f,0x04,0x6b,0x24,0xfd,0x6a,0x39,0x1b,0x1a,0xb2,0xfa,0x01,0xe1, +0xa7,0xc1,0xe3,0x5f,0xf0,0x27,0xeb,0x5b,0x6b,0x0b,0x53,0xb9,0x0b,0x28,0x79,0xb9, +0x8f,0x49,0x88,0x79,0x98,0x2a,0x42,0x3f,0x2c,0x40,0x2f,0x5f,0x32,0xd8,0x58,0x4a, +0x98,0x06,0xed,0x2a,0xe9,0x3c,0x44,0x55,0xf9,0xc1,0x42,0x9c,0x78,0xcd,0x49,0x24, +0xe2,0xde,0x31,0x54,0xbe,0xd2,0x6b,0x45,0x5b,0x49,0x88,0x3f,0xb0,0x09,0x05,0x3a, +0xf4,0x4c,0x7b,0xb6,0x8a,0x63,0xab,0x79,0xbd,0x4e,0xc2,0x9e,0x5e,0xe3,0x51,0x5b, +0x19,0x07,0x5b,0x3f,0x68,0x4a,0x5d,0x3e,0xe5,0x93,0x4b,0x0e,0xcc,0xc4,0xbb,0xe2, +0x60,0x1f,0xde,0x55,0x58,0xc1,0xc0,0x51,0x02,0xd0,0xea,0xe5,0x99,0x23,0x04,0x81, +0x27,0x41,0xb6,0x6b,0xcc,0x5d,0x3c,0x46,0xc0,0x58,0x9e,0x30,0x37,0x6c,0x5c,0x64, +0x45,0x95,0xfc,0xf7,0x17,0x73,0x4b,0x10,0xa8,0x54,0xd7,0x5a,0x19,0x41,0x7d,0xd1, +0xb9,0x15,0xeb,0x55,0xb2,0x71,0x1e,0xd3,0x1e,0xdf,0x5d,0xb9,0x55,0xac,0x64,0x4a, +0x21,0x76,0x3b,0xb7,0x39,0xe2,0x0e,0xe1,0x15,0x54,0x44,0x41,0x85,0x89,0x9c,0x54, +0x3f,0x14,0x04,0x47,0x66,0x98,0x5a,0xb7,0x4d,0x89,0x8e,0xc3,0x84,0x34,0xfa,0x52, +0x8c,0xbb,0x3e,0xe1,0x3f,0x9b,0x64,0xdc,0xf2,0x52,0xc7,0x85,0x0d,0xab,0x45,0xdc, +0x4a,0x64,0xc2,0xa5,0x33,0x28,0x89,0xaf,0x70,0x68,0x22,0x86,0x8b,0x81,0x2e,0xf7, +0x89,0x76,0xdc,0xa3,0x44,0x97,0x5c,0xb5,0x83,0xdb,0x22,0xce,0x87,0x7e,0x8e,0x51, +0xad,0x02,0xf0,0x9b,0x98,0x90,0x48,0x3a,0xe8,0xe4,0xa0,0x08,0xf6,0xcf,0x65,0x98, +0xa9,0x7a,0x27,0xff,0xda,0xdf,0x2f,0x79,0xb4,0xf5,0x3b,0xd5,0x59,0xc5,0xd3,0xef, +0x56,0x92,0x18,0xfd,0xb5,0xcb,0x27,0x57,0x45,0x56,0x97,0xa4,0x10,0x28,0x04,0x37, +0xc3,0x2f,0xf8,0x0d,0x5b,0x38,0xa9,0x6a,0xeb,0xe1,0x8c,0xee,0xc9,0xd5,0x98,0xab, +0x09,0x71,0x75,0x52,0xcc,0x80,0x66,0xa5,0xc8,0x1c,0x87,0x2b,0xdc,0x6d,0xa0,0x09, +0xae,0x50,0xa6,0xe9,0x24,0xc1,0x6f,0xb5,0x49,0x3b,0xc4,0x67,0xde,0xf3,0x2d,0xdd, +0xaa,0xdf,0xaa,0x26,0x4a,0x29,0x20,0x8b,0x14,0x1d,0x27,0xd9,0x79,0x73,0xa5,0xaa, +0xf1,0xc2,0xc0,0x41,0x2d,0xbb,0xb2,0xca,0x6b,0x0f,0x8e,0x8f,0x14,0xa2,0x71,0xf7, +0x62,0x89,0xe0,0x82,0x97,0xed,0x46,0xf7,0x76,0x85,0x08,0xc5,0x23,0x84,0xa0,0xa9, +0x87,0xb2,0x2b,0x83,0x88,0xbf,0x68,0xdb,0x63,0x4f,0x73,0xfd,0xd2,0xb2,0x13,0x91, +0x04,0x7e,0x2f,0x75,0x17,0x8f,0xc3,0x17,0x19,0x32,0x81,0xc4,0xab,0x4e,0xe5,0x31, +0x38,0x06,0xd8,0xbd,0xba,0xa9,0xa4,0x3c,0xd5,0xfb,0x88,0x62,0xb6,0x31,0x20,0x56, +0x80,0x66,0x50,0xb9,0x07,0xe8,0x58,0x5e,0x24,0xe5,0xbe,0x14,0xe4,0x80,0x1e,0x30, +0xbc,0x30,0x1a,0x60,0x37,0x59,0x8e,0xe1,0x4b,0x9f,0x89,0x43,0x54,0xea,0x57,0xff, +0xe7,0x58,0x94,0x5f,0x32,0xf8,0xa2,0x73,0x77,0x36,0xc1,0x9c,0x7b,0xea,0x5a,0xe2, +0x23,0x45,0xad,0x8a,0x4c,0xe1,0x52,0x78,0x28,0xc5,0x63,0xbe,0xa3,0x45,0x3a,0x7a, +0x01,0x7e,0xe0,0xf6,0x04,0xeb,0x5a,0x38,0xbe,0xc4,0x83,0xba,0x49,0xac,0x69,0x16, +0x73,0x03,0xab,0x03,0x1e,0xc6,0x6b,0x2f,0x45,0xb4,0xe2,0xbf,0xda,0x28,0x23,0x0f, +0x0f,0x87,0x2e,0x75,0x9c,0xbb,0x65,0x9f,0xcd,0x64,0xc5,0x7f,0x71,0xe6,0x1d,0x39, +0x60,0xe0,0xe3,0x28,0x83,0xb3,0x73,0x68,0x06,0xa0,0x0b,0x49,0xff,0x93,0x54,0x1b, +0x09,0x1d,0x11,0x56,0xba,0x52,0x13,0x91,0xb0,0xcb,0xb9,0x8d,0xdb,0x60,0x04,0x0b, +0xaa,0xe0,0x73,0xa7,0xf5,0xe3,0xa7,0x35,0xe0,0x12,0x63,0x5e,0x7f,0x6f,0xf0,0x28, +0x8e,0x06,0x47,0x2c,0x98,0x59,0x53,0x00,0x4f,0x4d,0xa9,0x60,0x34,0x8b,0x64,0xe2, +0x64,0x6d,0x84,0xec,0xd5,0x1f,0xc9,0xee,0x45,0x20,0xf6,0x3d,0x8f,0x5d,0x49,0xf4, +0x65,0xde,0xb2,0x56,0x14,0xd3,0x67,0xb2,0x1e,0x91,0x3c,0xf5,0xf4,0x5c,0x57,0x23, +0xec,0x89,0xf5,0x74,0x9e,0x4f,0x86,0x07,0x18,0xb1,0x63,0xe0,0x2e,0xf8,0xed,0x9e, +0x66,0x9b,0x6d,0x5a,0x04,0xdf,0xfd,0xb7,0xd5,0x07,0xed,0x05,0xfd,0x33,0x5a,0x63, +0xec,0x17,0x9f,0xb4,0x09,0x25,0xbb,0x9e,0x9b,0x75,0xb2,0x62,0x36,0x8d,0xc0,0x40, +0x2f,0x9d,0x00,0xd2,0x77,0x25,0x03,0x76,0x38,0x0c,0x51,0x89,0xea,0xa9,0x2d,0xda, +0x4f,0x95,0x3c,0xc6,0x0d,0xa9,0x4d,0x1c,0x13,0x97,0x95,0xa5,0xec,0xb7,0x6c,0xa0, +0x8d,0x31,0x8d,0x95,0xfd,0xba,0xc2,0xc2,0x46,0x28,0x46,0xb9,0xd3,0x01,0xb0,0xad, +0x8d,0x67,0x98,0x46,0xf6,0x52,0xe6,0xb5,0x42,0x94,0x88,0x0f,0x1d,0x98,0xe9,0x72, +0xa9,0x54,0x90,0x4a,0xf7,0x13,0x95,0x90,0x11,0xc9,0xa4,0xbf,0x5e,0x43,0x9c,0x4c, +0x72,0x90,0xa5,0x7c,0x9e,0xd6,0xe1,0xc4,0x39,0x87,0xaf,0xb7,0x15,0xf9,0x77,0x17, +0x9e,0x00,0xad,0x6c,0x97,0x1f,0x1f,0xaa,0x38,0xb7,0x81,0x1e,0x9c,0x7b,0x30,0x8a, +0x2a,0xd2,0x9d,0xe9,0x9f,0x03,0xcd,0xce,0xe3,0x51,0x4d,0x9e,0xfe,0xe3,0x0e,0x9d, +0x1a,0x90,0xd6,0xfa,0xcc,0xd1,0x18,0x27,0x98,0xc6,0x6e,0xb9,0x4c,0xc3,0xb1,0xeb, +0xc0,0x5c,0x53,0xad,0x49,0xdb,0x11,0x8b,0x11,0x53,0x4e,0x9f,0x7e,0xe8,0x94,0xfc, +0x0e,0x8a,0x50,0x44,0x4e,0x36,0xa5,0xbc,0x4a,0x29,0x47,0x6d,0xf7,0xbe,0x3a,0xe8, +0x24,0x4f,0x7f,0x77,0x64,0x4c,0xeb,0x53,0x21,0x2c,0x21,0xdb,0xb9,0x23,0x6e,0x65, +0xea,0xd0,0x3e,0x53,0xf8,0x7b,0x0a,0xce,0xaa,0xc8,0xcc,0xe4,0xe5,0xde,0xad,0xe9, +0x14,0xcf,0x66,0x45,0x94,0x03,0xf2,0x61,0x88,0xbf,0xdb,0x0b,0x27,0xcf,0x50,0x0a, +0x87,0x4b,0xef,0x28,0x6e,0x5e,0x40,0xb9,0x28,0xca,0xa7,0x95,0x92,0x32,0x41,0x26, +0xfd,0x46,0xfa,0xac,0x1e,0x6b,0xc1,0x20,0x66,0x06,0xcc,0x82,0xd0,0xb0,0xf0,0xae, +0x13,0x48,0x59,0xab,0x9e,0x83,0x66,0x59,0xce,0xe3,0x5c,0x12,0xde,0x93,0x4e,0xbd, +0xb1,0xa4,0x98,0x74,0x37,0x87,0xd9,0x65,0x29,0x57,0x0a,0x07,0x2d,0x7d,0xb6,0xd5, +0xda,0xdc,0x58,0x95,0x97,0xdc,0x48,0xb1,0xd5,0x5c,0xd1,0x64,0x32,0x28,0x43,0x1b, +0xab,0xf9,0x6e,0x93,0x19,0x48,0xea,0xc0,0x60,0x05,0xe9,0x5f,0x2c,0xc3,0x34,0x25, +0x28,0x89,0xf4,0xb9,0xf2,0x6a,0xe2,0x98,0x05,0x79,0xee,0xcf,0xdd,0xe4,0x5a,0x1b, +0xef,0xfa,0x2e,0x72,0x05,0xa7,0x05,0x59,0xfb,0x78,0xeb,0x25,0x38,0xeb,0xf1,0xf1, +0x51,0xcb,0xf5,0xbc,0x72,0x28,0xa3,0xd1,0xdb,0x04,0xc9,0x26,0x32,0x0f,0x22,0x56, +0x0f,0x01,0x3d,0x3f,0x26,0x42,0x56,0x0e,0x0a,0x03,0x12,0xb5,0x9f,0x2d,0x42,0x5d, +0xe2,0xe4,0x8a,0x3a,0x38,0xed,0x64,0x51,0x23,0xa4,0xf2,0x7b,0xda,0x29,0xef,0xa1, +0x1e,0xc8,0x24,0x0d,0xf4,0x35,0x31,0x68,0xcb,0x6c,0xfb,0x0f,0x5b,0x61,0x33,0x2b, +0x09,0xdb,0xc9,0xbb,0x7a,0x34,0xa4,0xfd,0x8e,0x42,0xf3,0xbf,0xb0,0x61,0x5d,0x81, +0x87,0x0b,0x50,0xd9,0xdb,0x53,0xb2,0xd3,0xc3,0x9f,0x54,0xe5,0xab,0x7d,0x4b,0x12, +0x03,0xe1,0x5c,0xe7,0x1b,0x89,0xbe,0xcf,0x86,0xdc,0x68,0xc5,0xd2,0x30,0xc0,0x67, +0x82,0x30,0xbb,0x21,0xe5,0x9d,0xd5,0x74,0x56,0x49,0xcc,0xb2,0x94,0x74,0x35,0xd6, +0x6b,0x9a,0xf3,0x34,0x58,0x30,0x7d,0xaf,0x9e,0x5c,0x35,0x00,0xf7,0xb9,0xe3,0xe9, +0x11,0xd0,0x84,0xa2,0x70,0x7b,0x41,0x92,0x9d,0x4f,0x60,0x86,0x8d,0x72,0x13,0x51, +0x25,0x46,0xda,0xa1,0xcc,0x77,0x3c,0xee,0x22,0x58,0xa4,0x76,0xf2,0x28,0xff,0x3e, +0x9d,0x47,0xe5,0xcd,0x5b,0x07,0x15,0x87,0xc3,0x46,0xfd,0x8a,0x53,0x87,0x39,0xce, +0x93,0xba,0x47,0xb7,0x31,0xe3,0xf1,0x62,0xdb,0xa8,0xe5,0x49,0x50,0x6c,0x5f,0xa9, +0x8f,0x55,0x8d,0x7f,0x1a,0x48,0x76,0xaa,0xec,0x55,0xfc,0x44,0x3a,0x35,0x74,0x88, +0x8e,0x14,0x5a,0x4c,0x72,0xc6,0x9e,0x55,0x61,0xf4,0x4d,0x5a,0xfe,0x9a,0xf8,0x29, +0x45,0x0a,0x06,0x8f,0x2d,0x97,0xbb,0x2c,0x57,0x51,0x00,0x4b,0xea,0x37,0x71,0xe9, +0x2e,0xfb,0xb1,0x39,0xfa,0x91,0xd6,0xb6,0x4a,0xdf,0x5f,0x69,0x3a,0x60,0x57,0x3a, +0x0b,0x7c,0x95,0xae,0xc5,0x91,0xe9,0x2f,0xa8,0x1c,0x46,0x8a,0x5b,0x3c,0x6f,0xae, +0x40,0x12,0x4a,0x58,0x2c,0xf5,0xa5,0x38,0x2b,0xd0,0xc4,0xfd,0x5a,0x3d,0x61,0xe1, +0x92,0x05,0x56,0x0a,0x64,0x36,0x5f,0xe0,0x17,0xd8,0xe3,0x69,0x13,0xd7,0xc8,0xeb, +0x98,0xfb,0x96,0xdc,0x1e,0x34,0x06,0x79,0x4c,0x59,0xfb,0x66,0x79,0xab,0x79,0x19, +0xe1,0xee,0x59,0x68,0x99,0x06,0x69,0xab,0xad,0x49,0x70,0x36,0x69,0x40,0xf2,0x1e, +0x36,0x05,0x5e,0x3b,0xfe,0xe5,0x58,0x92,0x5d,0xce,0x4c,0x56,0xbc,0x08,0x43,0x0f, +0x85,0x42,0x36,0xc7,0xb6,0x29,0xc9,0xcb,0xd6,0x8f,0x22,0x26,0x2f,0xe4,0xf3,0x0e, +0x83,0xcb,0x93,0xa7,0x15,0x0c,0x60,0xba,0x60,0xc5,0xc1,0xdf,0x41,0x2e,0x47,0xa0, +0x35,0xe6,0x64,0xa0,0x25,0xa6,0xb0,0xbb,0x83,0xc0,0xb0,0xc6,0x4e,0x06,0x2e,0xb4, +0x17,0xca,0x8a,0x46,0x16,0xe4,0x80,0x9a,0x23,0x88,0x0c,0xf0,0x6d,0xa9,0x99,0x4b, +0x21,0x9d,0x59,0x57,0x31,0xca,0x73,0x11,0xf5,0xe6,0x19,0x76,0x72,0x56,0x09,0x0c, +0x66,0xc5,0x89,0x55,0xec,0xaa,0x86,0x9b,0xd9,0x8a,0x28,0xf3,0x8c,0xb9,0x6a,0x88, +0x2e,0xb8,0x06,0x6c,0xa7,0x25,0x62,0x37,0xef,0xa4,0x06,0xcc,0x67,0x58,0xac,0x68, +0x3e,0x88,0xd1,0x54,0xa4,0xb5,0x44,0x06,0x7e,0xdd,0x39,0x58,0xf1,0xe6,0x1b,0xf8, +0xed,0xc6,0x7c,0x0e,0x6b,0x15,0x0d,0x5b,0x06,0x23,0x0f,0x08,0x7f,0xf1,0xd3,0xf3, +0x8f,0xc4,0x6b,0x0f,0xbf,0x06,0xfb,0x7f,0xdf,0xd0,0x0f,0xcf,0xd5,0xe4,0xea,0x1a, +0x65,0xdd,0xa8,0xee,0xe1,0x5b,0x70,0x8c,0xc1,0x3a,0xad,0x6c,0xbf,0x13,0x95,0xb7, +0x3b,0x00,0xb2,0x4f,0x2c,0xe9,0x40,0x9c,0x49,0x55,0xf8,0x5d,0x52,0xeb,0x9c,0xa3, +0x1e,0x43,0xa3,0xcf,0x77,0xc4,0x3b,0x6f,0xe7,0x54,0x33,0xbe,0xad,0xa0,0x14,0xdf, +0xb9,0xa8,0x51,0x3f,0xd3,0xb4,0x9f,0x64,0xfb,0x1b,0xab,0x79,0x7e,0x30,0x7d,0xa3, +0x81,0x8b,0x5f,0xf5,0x1e,0x3a,0x4a,0x9f,0x8d,0x8a,0x76,0xc0,0x08,0xbf,0x42,0xe1, +0x44,0xff,0xe6,0x07,0xc6,0x1c,0x44,0xd2,0x61,0x71,0xdc,0xa8,0xad,0xfc,0x35,0x65, +0xa2,0x48,0xeb,0x7c,0x5d,0xb1,0x90,0x41,0x24,0x7f,0xf4,0xc1,0x82,0xbd,0x4b,0xe6, +0xa6,0x33,0x3e,0x66,0x16,0xa3,0xaa,0xc0,0xf2,0x72,0xbf,0x55,0x77,0x27,0xf6,0x3d, +0x20,0xae,0x22,0x2e,0x34,0xf9,0xd7,0xb2,0x8f,0xe5,0x83,0x84,0x55,0x76,0x0c,0x94, +0x7e,0x9a,0x1d,0xc9,0x07,0xae,0x5e,0x01,0x57,0xce,0x25,0x1e,0x3f,0x08,0xe7,0xbd, +0x4d,0xe7,0xbd,0x43,0xb0,0x5c,0x0d,0x12,0x45,0x26,0x42,0x8b,0xf0,0x0c,0x34,0x57, +0x02,0x68,0x4f,0xa1,0xde,0xa6,0x5c,0x87,0xc6,0x55,0x05,0xc8,0xca,0xb5,0x18,0xff, +0x6c,0x37,0x94,0xbe,0xc4,0x17,0xa1,0x3a,0xa4,0x29,0x65,0xcc,0x5d,0xeb,0xd1,0xdd, +0x1e,0xcd,0xd0,0x99,0x3b,0x39,0xc6,0xc8,0xd2,0x76,0xa4,0xae,0x5e,0xfa,0x3d,0x63, +0x8c,0xd7,0x07,0xfd,0xde,0x0e,0x4f,0xb9,0xdf,0x68,0xd7,0xb1,0x24,0xf7,0x95,0x04, +0x52,0x19,0x32,0xec,0x93,0x31,0xac,0x53,0xb7,0x96,0xe6,0x3a,0x58,0x24,0x58,0xe6, +0xa3,0x6a,0xfe,0xda,0xda,0xad,0x48,0xc2,0x5d,0x18,0x3d,0x82,0x4d,0x1c,0x50,0xf7, +0x21,0xff,0xd0,0x1b,0x1e,0x7d,0x3e,0x0a,0x67,0x92,0x49,0x93,0x79,0x07,0x2f,0xcf, +0x72,0xcf,0xdd,0x27,0xb2,0xf1,0xed,0x8b,0xb6,0xc5,0x48,0x09,0x7e,0xbc,0x25,0x66, +0x22,0x39,0xb6,0xda,0x1a,0x1e,0x26,0xed,0x0b,0xce,0x26,0x17,0xb3,0x02,0xf8,0x3f, +0x35,0x42,0xd9,0x1e,0x54,0x23,0x8a,0xc2,0xa0,0xbf,0x81,0x37,0x47,0x6f,0xb7,0xf6, +0x07,0xf2,0xd2,0x15,0xb6,0x6d,0x23,0xa3,0xe2,0x9e,0xe6,0x0c,0xb0,0xce,0xca,0x6d, +0xb3,0xa2,0x02,0xbc,0xa3,0x63,0xbd,0x5a,0x1e,0xbd,0xa3,0x36,0x73,0x13,0xc8,0xf9, +0xdd,0x4e,0x8b,0x91,0xca,0x20,0xa4,0x00,0xf8,0xfc,0x8c,0x46,0xe9,0x0f,0x7e,0x68, +0x23,0x86,0xd1,0x67,0x77,0x65,0xe8,0x9b,0xcf,0xb9,0xc2,0x4f,0xb9,0x20,0x81,0xaf, +0xea,0x74,0xda,0x09,0xf8,0x61,0x50,0x78,0x63,0x24,0x6c,0x53,0xf2,0xfa,0xed,0x32, +0xf2,0xa0,0xff,0x6d,0xfa,0x2b,0x36,0x13,0x00,0x46,0xeb,0xd5,0x5b,0x27,0x2b,0x51, +0x85,0xd4,0xf3,0xe5,0x1a,0x88,0x5f,0x99,0xcc,0xcc,0x6d,0x17,0x28,0x25,0x7d,0x2e, +0x12,0x85,0xa2,0xad,0x1e,0x92,0x28,0x8d,0xbb,0x0a,0xf4,0xe0,0x59,0x28,0x6a,0x06, +0xf3,0x04,0x75,0xf4,0x3d,0x64,0xa1,0xde,0x59,0xb4,0x9a,0x5e,0x78,0x29,0xd7,0x59, +0x08,0xf5,0xd3,0xe5,0x8e,0x67,0x17,0x6a,0xfb,0x1a,0xbf,0xd2,0xde,0x99,0xf0,0x4b, +0xa7,0x68,0x27,0x82,0x9a,0x7b,0xe3,0xc0,0xc1,0xe6,0xb7,0xde,0x30,0xfa,0x1f,0xcc, +0x7c,0xb8,0x66,0x2e,0xed,0x49,0x56,0x8e,0x79,0x77,0x19,0x6c,0xd7,0x91,0x8a,0xe5, +0x0b,0x86,0xdc,0x3e,0x7b,0x94,0x01,0xee,0x4a,0x0d,0xda,0x58,0xee,0xcc,0x4b,0x4d, +0x03,0x21,0xfb,0x69,0x73,0x3f,0xeb,0x96,0x45,0x55,0xb1,0x6f,0x2f,0xe8,0x4f,0xbb, +0x43,0x3e,0xb5,0x5b,0x7a,0xac,0xe4,0x8f,0xf8,0x2b,0xe3,0x4d,0x9e,0xc0,0xf9,0xb1, +0x19,0xaf,0x44,0x41,0xe1,0x3e,0x5a,0x58,0x66,0xba,0xce,0xc0,0x76,0xa3,0x96,0x83, +0x04,0x1e,0x28,0x56,0x92,0x3f,0x46,0xb8,0xc2,0xfc,0x94,0xb0,0xf8,0x5e,0x3f,0x24, +0x53,0xbf,0xed,0x47,0x34,0x3c,0x91,0x23,0xe1,0xbc,0x31,0x21,0x86,0xc6,0x3f,0x6e, +0x55,0x1c,0xb5,0x31,0x50,0x9c,0x03,0x76,0x2b,0x9a,0xa3,0x7c,0xb3,0xda,0x29,0x28, +0xe2,0x59,0x68,0xe0,0x87,0x9f,0xab,0x9e,0x03,0x50,0xaa,0xe3,0x56,0xc0,0x14,0xd4, +0xaa,0x3a,0xe1,0x27,0xb7,0xb8,0xe4,0x0f,0x65,0x86,0x27,0xd3,0xd2,0x34,0x1d,0xc5, +0xb0,0x5b,0xbd,0xd1,0x52,0xb7,0x37,0xe3,0xe1,0xb6,0x75,0xff,0x7e,0x7b,0x73,0x05, +0xca,0xbd,0x9f,0x92,0x97,0x9a,0x32,0x8e,0x40,0x4c,0x87,0x24,0xc7,0x68,0xc6,0x89, +0xa1,0x03,0x17,0x7f,0x7b,0x23,0x1e,0x49,0x89,0xa7,0x87,0xcc,0x3a,0xa3,0xb1,0x7e, +0x9d,0x60,0xd6,0x95,0x0a,0xdf,0x00,0xb8,0xcf,0xa9,0x57,0x43,0x8c,0xda,0x06,0xf7, +0x0f,0x0a,0x4b,0x6b,0x51,0xc2,0xd7,0x74,0xce,0xf1,0x97,0xde,0x88,0xdb,0x6f,0x87, +0x53,0x16,0x4f,0x21,0x0d,0x33,0x46,0xb2,0xad,0x15,0x0a,0x39,0x8f,0x40,0x1e,0xd0, +0xa7,0xb1,0xd7,0xfd,0x9b,0xbd,0x18,0x6c,0x2a,0x34,0x69,0x0a,0x19,0xd6,0x2c,0xc8, +0x2a,0x5d,0x9c,0x9f,0xd0,0x59,0x20,0xfe,0x8a,0xde,0x4e,0x0f,0xf7,0xd0,0x0e,0x5a, +0xe5,0x70,0x62,0x3e,0x3e,0xb3,0x0d,0x7d,0x82,0x0f,0x46,0x07,0x5f,0x81,0x63,0x3a, +0x26,0xb2,0xf7,0x27,0x17,0x32,0xf3,0x0a,0x67,0x1d,0xce,0x1f,0x57,0xd2,0x6a,0x40, +0x59,0x08,0x60,0x43,0x37,0xbb,0x2e,0x90,0x4c,0xa0,0xa6,0x44,0xab,0x4d,0xe8,0xcf, +0x10,0x9a,0x88,0x1f,0x26,0xe0,0x26,0x43,0x20,0xca,0xc3,0x11,0xf4,0x5e,0x71,0xec, +0x78,0x4b,0x31,0x61,0xd4,0xed,0x76,0x21,0xd4,0x6f,0x24,0xa3,0xa2,0x19,0x2f,0x75, +0x7a,0x98,0x93,0xf1,0x12,0x23,0xb9,0xca,0xc9,0x6e,0x55,0xdf,0xea,0xae,0x2e,0x51, +0x3e,0x4e,0xcc,0x62,0xff,0xb5,0xc8,0x9c,0x56,0x89,0x50,0x14,0x34,0x68,0x79,0x9a, +0x34,0xbe,0x96,0x50,0xf6,0x26,0x40,0x42,0x1b,0x6a,0x5c,0x51,0xfb,0xe8,0x47,0x6b, +0xc9,0x22,0xf7,0x25,0xf6,0x5e,0x8e,0x10,0x85,0x67,0x61,0x7c,0x52,0x72,0x91,0xbb, +0x0b,0x1a,0xc5,0xa4,0x1b,0x7a,0xd9,0x01,0xa5,0x8b,0x00,0x50,0x76,0x98,0xa4,0x6c, +0xf7,0x93,0x62,0xdb,0xc4,0xea,0x2c,0xba,0xb3,0x8d,0xd5,0x54,0x5a,0x3b,0x9f,0x73, +0x0b,0x73,0x12,0xfe,0x0d,0xaf,0x8a,0x27,0xcb,0x9a,0xc6,0x4d,0x4a,0x6b,0xe0,0x6d, +0x67,0x62,0x2b,0x65,0xaf,0xeb,0x34,0x8c,0x4a,0xf9,0xc3,0x6f,0xd8,0xc6,0xe1,0xf3, +0xdb,0xc6,0x08,0x5b,0x3c,0x54,0xfb,0xe2,0x5a,0x89,0xa5,0x16,0xfc,0x7b,0x9a,0x42, +0xf7,0xc3,0x9a,0x69,0xe3,0xa3,0x0c,0x6d,0xbb,0xc3,0x62,0x7d,0x78,0xa8,0x79,0x64, +0x33,0xcf,0x68,0x6c,0x7f,0x54,0xa9,0xa1,0x2c,0x32,0xa0,0x56,0x6b,0x42,0x59,0xb8, +0xd9,0x7b,0x73,0x21,0xf5,0xa1,0xc7,0x14,0x6d,0x8c,0xd5,0xce,0x52,0xaf,0x24,0xc1, +0x89,0x0f,0x95,0x59,0x7e,0x2c,0x03,0x3c,0x32,0x49,0x5b,0x0d,0xbd,0x63,0x7c,0x86, +0x90,0xc9,0x24,0xe5,0x38,0x3d,0xf2,0x64,0x24,0xeb,0x74,0x1a,0xac,0xf8,0xd3,0x6d, +0xc4,0x12,0x00,0x05,0x2e,0xb9,0x99,0x24,0x64,0x3b,0xa9,0xd6,0x3f,0x5c,0x7c,0x93, +0x01,0x13,0xdb,0xaf,0x5d,0xa3,0x10,0xd4,0x69,0xc9,0x35,0xe4,0x5f,0x5f,0xd2,0x6d, +0x5d,0x5a,0x2d,0xf4,0xb9,0x38,0x95,0xae,0xd6,0xe7,0xae,0x86,0x54,0x0c,0xae,0x51, +0x6d,0x6b,0x74,0x57,0x06,0x00,0x76,0x8f,0x05,0x54,0xe1,0x04,0x52,0x27,0x6d,0xa1, +0x34,0x3c,0xfd,0x27,0x94,0xf5,0x7a,0x22,0x8e,0x5f,0x78,0xf2,0x7f,0x9b,0x89,0x51, +0xe6,0x9e,0x45,0xdd,0x3a,0x1b,0x63,0xcf,0x0d,0x87,0x0e,0x1f,0xf6,0x4d,0xa3,0x33, +0xa3,0xbb,0x6d,0xc7,0x6e,0xea,0xd1,0x61,0xbb,0xdd,0xdb,0xcf,0x73,0x53,0x7d,0x8a, +0x2a,0xb8,0xdd,0xbf,0x0c,0x17,0xec,0xaa,0x24,0x91,0x88,0x83,0x52,0x27,0x15,0x26, +0xde,0x34,0xd0,0x99,0x9c,0xb2,0x00,0xde,0xb3,0xd1,0x1a,0x3a,0x0b,0x4d,0x0b,0xf4, +0x98,0x25,0x07,0xfd,0xde,0x6e,0x6e,0xbb,0x49,0x25,0xed,0x73,0xfa,0x29,0xb7,0xaa, +0x0c,0x3f,0x2f,0xdc,0x42,0x16,0xb5,0x4a,0xc8,0xdb,0xb7,0xbb,0x74,0xd4,0x1a,0x8d, +0xc7,0x86,0xf0,0xac,0x5e,0x35,0xb6,0xfb,0x56,0x7c,0x63,0xe9,0x5a,0x58,0xd1,0xca, +0xfb,0x92,0xc4,0x2d,0xb3,0xfc,0xfe,0xd9,0xb7,0x7d,0x5a,0xda,0xfd,0xf5,0x01,0x1e, +0xee,0x41,0x99,0xc9,0x5f,0x3d,0x64,0x98,0x9e,0xd7,0x64,0xe9,0x36,0x4f,0x5d,0x24, +0x9c,0x9b,0xd1,0xf7,0xd7,0xb2,0xea,0xd8,0x37,0x7f,0x43,0x80,0x5c,0xbe,0x3e,0xc5, +0x21,0x30,0x08,0xf7,0x9c,0x8d,0xb4,0xda,0xcf,0xbd,0x5f,0xa6,0xd0,0x65,0x1a,0x1c, +0xa2,0x05,0x1d,0xf6,0x17,0xd3,0x99,0x5f,0xba,0xbc,0x30,0x20,0xf2,0x6c,0x61,0x53, +0x0a,0x0f,0x10,0xe7,0x3c,0x8f,0x76,0x5f,0x12,0x4a,0xa9,0xf5,0x8c,0x64,0x0f,0x63, +0x03,0x8f,0x68,0x91,0xcf,0x1d,0x7e,0xce,0x34,0xc5,0x75,0xa7,0x95,0x6b,0xc5,0x22, +0x82,0xa4,0x3f,0xc0,0x7c,0x81,0xaf,0x88,0x96,0x06,0xea,0x59,0x61,0xa8,0xe3,0x9a, +0xb8,0x3e,0xf6,0x9c,0x9e,0xd3,0xf7,0x8c,0x43,0x5e,0x99,0x92,0x55,0x8f,0xed,0xe4, +0x57,0x65,0xff,0x8c,0xd0,0xd9,0xd4,0x34,0x1f,0x3b,0x29,0x1b,0xb0,0x46,0xea,0xb6, +0x76,0x35,0x81,0x4d,0x5b,0x3d,0xfe,0xf5,0xdf,0x45,0x16,0xf7,0x2d,0x98,0x66,0xea, +0x3f,0xf8,0x42,0x91,0x65,0x85,0x12,0x2a,0x0a,0x35,0x16,0xdc,0x1c,0x67,0x73,0x7e, +0x2a,0x49,0x1f,0xfe,0x7a,0x6c,0x61,0x7f,0xb0,0xef,0x99,0xaa,0xdb,0x25,0xc2,0xf9, +0xc3,0x5b,0x12,0xef,0x34,0x87,0x84,0xd2,0x29,0x99,0x53,0x20,0xa7,0x28,0x1f,0x50, +0x35,0xb1,0x1a,0xf7,0x3c,0x47,0xbb,0x43,0x03,0x2f,0x19,0x5f,0x22,0x6d,0xbe,0xa0, +0x1f,0x41,0xc3,0x3e,0xa5,0x97,0xe9,0x97,0x79,0x4a,0xea,0x3e,0xe9,0xe6,0xa6,0xb0, +0x89,0x40,0x1c,0x6f,0xd3,0x37,0x83,0xfc,0x57,0x69,0x6e,0x1e,0x9a,0xe7,0xb8,0x41, +0x2f,0xf1,0xc7,0x72,0x8d,0x6c,0x93,0x64,0x87,0x55,0xab,0x27,0xeb,0x61,0xac,0x27, +0x8d,0x5f,0xca,0x4c,0x83,0x2b,0xcb,0xfd,0xd4,0x52,0x5c,0x35,0x78,0xc2,0x7a,0xb8, +0x8c,0x1d,0x44,0x19,0xe1,0xbb,0x83,0x8d,0xe0,0xd3,0xb4,0xb5,0xfd,0x13,0x93,0xf2, +0xca,0xc0,0x74,0xfa,0x10,0x71,0x45,0x92,0xc4,0x2e,0xe1,0x5d,0xbf,0x1e,0x7b,0xb8, +0xa6,0xe0,0x35,0xa9,0x03,0xcf,0x28,0x81,0x41,0x30,0x3e,0x00,0x25,0x6c,0xb9,0xf3, +0x4a,0xe2,0x89,0x05,0x95,0x4f,0x2a,0x8c,0x11,0x82,0x26,0x3c,0x5e,0x68,0x62,0xf8, +0x7d,0xb0,0xbb,0x39,0x3a,0x76,0xb8,0x73,0x71,0x5c,0x2b,0x06,0xff,0x72,0x5f,0xc3, +0x76,0xa4,0xc0,0x6a,0xb1,0x39,0x12,0xf9,0x8a,0x65,0x27,0x76,0x8d,0x8a,0x52,0xa1, +0x6a,0xae,0x13,0xf6,0xfa,0x26,0xd5,0x80,0xf7,0xf2,0xfd,0xe5,0x53,0xf0,0xf0,0xeb, +0xfa,0xa2,0xc9,0x51,0xc5,0xe1,0xb1,0x62,0xa4,0x5d,0xe5,0x67,0xf3,0x7f,0x3c,0x63, +0x2e,0xea,0x39,0xc3,0xba,0x14,0xa1,0x85,0x9c,0x09,0x74,0xca,0x87,0x68,0xf1,0x8b, +0x51,0x5d,0xee,0x9e,0x7a,0x34,0x8f,0xa7,0x55,0x64,0x66,0xb4,0x84,0x36,0x51,0x0d, +0xf6,0xea,0x94,0xef,0x9b,0x78,0xd7,0x79,0x0c,0x8e,0x2f,0x45,0x24,0x86,0x29,0xa1, +0x25,0x55,0xd1,0x40,0xb9,0x94,0x0f,0xda,0xe7,0x40,0xc6,0xa6,0xff,0x0b,0xcd,0x4c, +0x36,0x16,0x9f,0xc5,0x3c,0xbc,0x1e,0xd7,0x7a,0x87,0xd4,0x1d,0x6e,0x83,0x4e,0x29, +0x53,0xe2,0x0e,0x60,0x85,0x58,0x5e,0x7c,0x63,0x71,0xe6,0x0f,0x6f,0xdd,0x4f,0xdd, +0xc1,0x8f,0x97,0x4f,0x3b,0x1e,0x57,0xd2,0xfd,0xc5,0x47,0x6f,0x7b,0x7e,0x69,0xe1, +0xf2,0xbb,0x0f,0x61,0x6d,0x7d,0xe0,0xc8,0xf3,0xa0,0x5e,0xd9,0x1a,0xd0,0xe0,0x9f, +0xb6,0x8d,0x64,0xf9,0x77,0x0a,0x78,0x2e,0xf9,0x31,0x90,0x81,0xf5,0xe9,0x90,0xfd, +0x27,0xd3,0x6c,0x2b,0xea,0xe3,0x15,0x62,0x4d,0xfd,0x98,0x27,0xd8,0x82,0x79,0x93, +0xb7,0x14,0x30,0xed,0x31,0xce,0xce,0x51,0xb2,0x1d,0x71,0xa3,0xc8,0xef,0x2e,0x91, +0x44,0xa5,0x6e,0x4d,0xe2,0xa3,0x29,0x86,0x27,0x17,0x12,0x92,0x00,0xfd,0x11,0x02, +0x4e,0x59,0xd5,0x35,0x5d,0xad,0x10,0x20,0x4e,0x86,0x7f,0x86,0x08,0xe2,0xd5,0x32, +0x76,0x21,0x17,0x24,0xec,0x5e,0x78,0x72,0xc5,0xc9,0x98,0xc9,0xa8,0xe8,0x99,0x4b, +0x7b,0xc9,0x64,0xb4,0x8e,0xdd,0x73,0x64,0xc6,0xc6,0x59,0x73,0x77,0x19,0xa6,0x6b, +0x4f,0x8e,0x16,0xd3,0xf9,0x02,0x7f,0xf7,0x87,0xa3,0x02,0x50,0x76,0xfb,0x1a,0x4d, +0xce,0x93,0xf8,0x28,0x28,0xb7,0xa3,0x35,0x70,0xf5,0xcf,0xc7,0x41,0x87,0xbf,0xf5, +0x0b,0x7b,0x94,0xc7,0x90,0xcb,0x2b,0x29,0x35,0xf8,0x9a,0x98,0xfc,0xe0,0x6b,0x1b, +0xef,0x13,0x1b,0xf4,0xef,0xaa,0x6b,0x37,0x04,0x5b,0x08,0xa6,0x73,0xec,0xca,0xe8, +0x01,0x86,0x56,0x9b,0xde,0x6e,0x1d,0x07,0xf9,0x6f,0x7b,0xbb,0xc1,0xe6,0x75,0x70, +0x51,0x39,0xdc,0x82,0x5c,0x53,0x72,0x6a,0x4e,0xcc,0x4d,0x24,0x4e,0xe8,0x62,0x4e, +0x64,0x1c,0xa2,0x46,0xd7,0x67,0x02,0x5d,0xec,0x69,0x51,0xfb,0xcc,0xd2,0x7b,0xcf, +0x92,0x84,0xdd,0x9b,0x13,0x58,0x49,0xe9,0x30,0x31,0xf5,0x31,0x53,0x8c,0x6b,0xaa, +0xf7,0x70,0xee,0xb2,0x97,0x22,0xb5,0x73,0x26,0xdf,0x83,0x01,0x5d,0x18,0xf2,0x80, +0x6a,0xad,0xbc,0x04,0xb4,0xda,0x04,0xc4,0xdb,0x65,0x90,0x24,0xf4,0x57,0x3d,0x8d, +0x1d,0xd3,0xd2,0xca,0xb7,0x65,0x29,0x8c,0x55,0x93,0x39,0xd4,0xf5,0x51,0x33,0xe1, +0x1f,0x46,0x9d,0x76,0xed,0xb2,0x22,0x99,0x94,0x27,0x8d,0xc7,0xf2,0xb0,0xea,0xd7, +0xa3,0x61,0x7a,0xf5,0x94,0x91,0x77,0x85,0x31,0xc2,0x11,0x12,0x20,0x90,0x73,0x9e, +0x15,0x52,0x60,0xb6,0xd7,0x45,0x4f,0x5e,0x60,0x07,0xe5,0x16,0x3d,0x55,0x8a,0x56, +0x3b,0x3d,0xbe,0xd7,0x25,0xfa,0x83,0x76,0x66,0xd5,0x7c,0xf5,0xda,0x58,0xa5,0xce, +0xf6,0x8d,0xbc,0x95,0x11,0x6b,0x28,0x1d,0x4a,0xdb,0xe4,0x0d,0x53,0xfd,0x34,0x9f, +0xa1,0xe7,0x2d,0x6b,0x29,0xac,0x43,0xfb,0x8e,0xcd,0xec,0x73,0xa9,0x34,0xa1,0x75, +0xe4,0x49,0xc6,0x8d,0x3e,0xb5,0x91,0x83,0x6a,0x2a,0x1d,0x64,0xc7,0xc3,0x86,0x2f, +0x90,0x38,0x49,0x6d,0x1c,0x14,0xfe,0x27,0x07,0x9b,0x42,0x3c,0xfd,0x7e,0x83,0x98, +0xd0,0xde,0x58,0xc8,0x55,0xb3,0x46,0x5b,0xe4,0xd5,0xd7,0x48,0x09,0xc8,0x8f,0x60, +0x4c,0x38,0x60,0x0d,0xbd,0x14,0xf8,0x70,0xeb,0x29,0x87,0xdf,0xfb,0xb9,0x65,0x22, +0x33,0xde,0xe3,0x4a,0x7e,0xbf,0x2e,0xc7,0x87,0x36,0x41,0xe8,0x95,0x8d,0xb5,0xda, +0x1c,0x29,0x3d,0x71,0x39,0x6e,0x40,0x36,0x8c,0x5d,0x3e,0x63,0x72,0x08,0xe2,0x9a, +0x13,0x61,0x87,0x8d,0xf6,0xfc,0x6f,0xf7,0x05,0xce,0x50,0xd7,0x17,0xef,0xaf,0xd6, +0xad,0x42,0x0a,0x5b,0xb3,0x36,0x80,0x89,0x50,0x64,0x5f,0x0c,0x87,0x0b,0x93,0x84, +0x5e,0x80,0xd9,0x02,0xf5,0x29,0x9f,0xa4,0x20,0xbd,0x24,0x46,0x63,0x80,0xc8,0x8d, +0x47,0xae,0x44,0xf4,0x0d,0x3a,0xda,0xb4,0x1f,0xb1,0x5c,0xfe,0xea,0x9e,0xfc,0x4f, +0x75,0x5e,0x01,0x46,0xd2,0x8f,0x59,0xa5,0xc6,0xb0,0x3a,0x62,0xde,0xbe,0xad,0x73, +0x6a,0x32,0x45,0x73,0xb2,0xe3,0xe6,0xb5,0x9f,0xd8,0xc3,0x5f,0xb9,0x72,0x58,0xc4, +0xe3,0x0b,0xbe,0x42,0xf3,0xa7,0x83,0xec,0xe3,0x47,0xc6,0xdd,0xb9,0xd7,0x02,0x4d, +0x30,0x32,0xb0,0x45,0x23,0x88,0xde,0x0f,0xa1,0x65,0x8b,0x50,0xba,0xd6,0x18,0xf7, +0x27,0x8a,0x62,0xb6,0x1e,0xab,0xed,0x64,0xe2,0x07,0x6a,0xd4,0xa0,0xc9,0xb1,0xd5, +0x9e,0x53,0xd8,0xe7,0xcf,0xf9,0x5c,0xd1,0xe7,0x87,0xcb,0x8a,0x38,0x94,0xb6,0x6a, +0xe3,0x59,0xe2,0x4e,0x16,0x25,0xd2,0xb5,0x5f,0x0a,0xec,0x2a,0xb9,0xeb,0x31,0x7a, +0xfa,0x6c,0xff,0xfa,0x2a,0xee,0x24,0x10,0x21,0x44,0xe5,0xb8,0x0e,0x04,0x5e,0x08, +0x8e,0xf8,0x9b,0x1d,0x79,0x31,0x01,0x56,0xc9,0x32,0xbf,0xde,0x54,0x67,0x33,0xe6, +0x5c,0x96,0x33,0x4f,0xda,0xdb,0x09,0x36,0x22,0x0f,0xa5,0xf8,0xf8,0x1a,0x22,0x0a, +0x48,0x03,0x02,0x2c,0x1a,0x6e,0x32,0x76,0xdf,0xc7,0xec,0xd4,0x38,0x93,0x2c,0x98, +0x89,0xd9,0xb7,0xd8,0x04,0xac,0xdb,0xfc,0x3d,0x1f,0x5a,0x54,0x8f,0x9c,0xd3,0x0e, +0x63,0x84,0xdc,0x06,0x9c,0x6d,0x57,0x8b,0xea,0xcf,0xad,0xd1,0xfe,0x2c,0xf6,0xbb, +0x43,0x85,0x0b,0x11,0x45,0x29,0x63,0xd9,0x66,0x2f,0x7c,0xdd,0x2f,0x3c,0xfb,0xd2, +0x63,0xe0,0x95,0xc3,0xee,0x38,0xab,0x24,0x3e,0x69,0xf6,0xa0,0x71,0x90,0x88,0xcf, +0x9c,0xed,0xc2,0xa5,0x01,0x2e,0x64,0x34,0x3f,0xca,0xe4,0xb6,0x31,0xd1,0x15,0xe3, +0xa4,0x29,0x05,0xa6,0x6d,0xb9,0x2e,0x43,0x4c,0xef,0xaf,0x27,0x71,0xf0,0xa6,0xff, +0x74,0x6f,0x35,0xf5,0xc2,0x9e,0xdd,0x2c,0xf6,0xec,0x8c,0x96,0xcf,0xde,0xed,0x22, +0xa0,0xc0,0xba,0x71,0xbd,0x92,0xf7,0x5f,0xc1,0x50,0xea,0x28,0x1a,0x57,0xe0,0x43, +0x0a,0x1a,0xec,0x3e,0xda,0xf6,0x4d,0x80,0x3f,0x5e,0x8c,0x07,0x51,0x34,0xd6,0xa3, +0x83,0xd6,0x95,0xb6,0xce,0xbf,0x54,0xf0,0xd2,0xfb,0xab,0x44,0x13,0xd5,0x6d,0xd5, +0x26,0x96,0xd7,0xd7,0x21,0x76,0xe8,0x19,0x4b,0x1a,0xe3,0x39,0xb1,0x88,0x3b,0xc7, +0xd0,0x89,0x97,0xbd,0x99,0xb9,0xd6,0x35,0xc7,0xf3,0x5a,0x4c,0x18,0x3a,0xc3,0x1c, +0x77,0x58,0xdc,0xdf,0xd2,0x5d,0x1c,0xe3,0x98,0x56,0xb6,0x2c,0xd8,0x15,0x34,0xa4, +0xae,0x52,0x08,0x7e,0x3c,0xb7,0x6f,0xad,0x15,0x18,0x1a,0xa3,0x07,0x7c,0xa2,0xf2, +0x34,0xae,0xb7,0x63,0x15,0x36,0xab,0xc2,0x4a,0xab,0x78,0x7d,0xeb,0x76,0x7c,0x3b, +0x25,0x67,0x9c,0xee,0x52,0x8f,0x24,0xe9,0x6c,0x5f,0xe8,0x44,0xf7,0x8a,0x95,0xef, +0x2d,0xc7,0x98,0x64,0xd0,0x59,0x9e,0x44,0x0d,0x46,0x21,0x8f,0x07,0x11,0xc0,0x32, +0xd5,0xc5,0xb9,0xcb,0xd9,0x6b,0x45,0xf4,0xd9,0x1a,0x47,0x9e,0xe1,0xfc,0x33,0xaa, +0xa8,0x14,0x5f,0x22,0x5a,0x5c,0x97,0x7d,0x9d,0x9c,0x38,0xd9,0x12,0x25,0x8b,0x86, +0x5a,0x1d,0x5f,0xee,0xae,0xed,0x0a,0x92,0xcd,0x82,0x70,0x6b,0x6d,0x7f,0xeb,0x96, +0x5b,0xee,0x10,0x27,0x3c,0xee,0xff,0x16,0x43,0x33,0xc7,0x4c,0x37,0x81,0xe1,0x9e, +0x14,0x88,0x0d,0x98,0x97,0xb2,0xf6,0x3e,0x3b,0x80,0x05,0x45,0xb4,0xe2,0x11,0xe9, +0x29,0x8e,0x93,0xff,0x67,0xec,0x62,0xb7,0x9b,0x33,0xc2,0xf0,0xe6,0xf7,0x28,0xbe, +0xd3,0x7f,0x43,0x29,0xb7,0xbf,0x60,0x46,0x4c,0xc7,0x47,0xcb,0x25,0xe4,0x17,0xd6, +0x50,0xaa,0xbf,0x67,0xb6,0x5a,0xb9,0x10,0x65,0xa8,0x07,0x89,0xb6,0x66,0x2f,0xae, +0xda,0x0b,0xd5,0xa1,0xb2,0x0b,0x63,0xfe,0xc0,0x15,0x61,0x14,0xc1,0x67,0x57,0x93, +0xa4,0xc5,0xd7,0xef,0xb9,0x78,0x38,0xf1,0x13,0x30,0x06,0x53,0xe4,0x63,0xdd,0x54, +0xfd,0x54,0x9c,0x53,0x7d,0x88,0xcd,0xae,0x12,0x0a,0x0a,0xb5,0x4e,0xa5,0xed,0x10, +0x0e,0xf9,0x90,0xed,0x2d,0xb2,0xc5,0xbe,0x13,0x31,0xaf,0x79,0x9f,0xa9,0xe3,0x96, +0x23,0xc8,0xfb,0x0b,0x34,0x56,0xf3,0xb6,0xb4,0x47,0xd0,0xef,0x9e,0x47,0x4b,0x19, +0xe6,0x86,0xca,0x79,0x62,0x06,0x44,0xbf,0x93,0x56,0xf3,0x2b,0x20,0x87,0x5c,0x8f, +0x2d,0x5c,0xb8,0x2e,0x62,0x03,0x4a,0xd8,0x46,0xee,0x4a,0xfd,0x30,0x41,0x6f,0xb2, +0x8f,0x42,0x94,0x59,0xbe,0xec,0xe9,0x8a,0x13,0xc2,0x82,0xf6,0xfa,0x64,0x3a,0x68, +0x2b,0x85,0x43,0xbf,0x36,0x7d,0x9b,0x5b,0x4c,0x1a,0x21,0x1f,0x5e,0x41,0x6a,0xad, +0x0d,0x5b,0x95,0xeb,0x33,0xa2,0xd3,0x5f,0x2e,0xc9,0xdb,0xec,0x7c,0xae,0xb7,0xb8, +0x5c,0x65,0xfd,0x93,0xe1,0xdc,0xc3,0xa7,0xa3,0x70,0xa2,0xc7,0xd7,0x7d,0xa4,0x5f, +0x23,0x63,0xd1,0x69,0x56,0xed,0x5e,0xaf,0x66,0x91,0x04,0xd6,0x25,0x5c,0xb4,0xbd, +0x9c,0xd0,0x61,0xd9,0xba,0xac,0x24,0xd0,0xd4,0xbe,0xec,0x1d,0x53,0xe2,0xef,0x17, +0xfb,0x22,0xbb,0xbf,0x5e,0xf7,0x21,0xd0,0xc1,0x6c,0x32,0xc7,0xfd,0xfa,0xe4,0x81, +0x9b,0xd6,0x1f,0x81,0xdf,0x97,0x2d,0xbb,0x60,0x07,0xb6,0x19,0x9f,0x25,0x01,0x56, +0x1a,0x5d,0xbc,0x48,0xdc,0xb6,0xbc,0xb7,0x8c,0x58,0xcc,0xc7,0x5d,0x5a,0x2f,0xc6, +0xa0,0xbf,0x02,0x34,0x9c,0x1b,0xa7,0x67,0x9b,0x6f,0x59,0x78,0xd2,0x7d,0xad,0xbf, +0xd3,0xd5,0x7d,0x72,0x40,0xdb,0x03,0xdb,0x84,0xed,0x5d,0x07,0x43,0x54,0x7c,0xfa, +0x44,0x89,0x9c,0x3e,0xb5,0x17,0xf6,0x73,0x3f,0xb6,0x34,0x2c,0xfd,0x9a,0x76,0xf3, +0x2b,0x6b,0x65,0xf9,0xe1,0x88,0x5c,0xbb,0x49,0xd8,0xc9,0xd8,0x5e,0xeb,0x5e,0xed, +0xcd,0xba,0x03,0xed,0x47,0xf8,0x88,0x39,0xec,0x07,0xed,0xae,0x5f,0xe1,0x2d,0x64, +0xab,0x69,0x6f,0xd2,0x84,0x64,0x6d,0xbf,0x64,0x59,0xdf,0xfd,0xf3,0xf6,0x2f,0xd8, +0x28,0x35,0xd8,0x77,0xe0,0x13,0x60,0xc2,0x85,0x98,0xa6,0x1d,0xf2,0xbd,0x0e,0xc4, +0xba,0x90,0x90,0x66,0x1b,0x48,0xda,0x98,0x4c,0x6d,0x80,0x43,0x9e,0xbc,0x24,0xb9, +0x45,0x8f,0xb0,0xbc,0xcc,0x68,0x4d,0x5b,0x63,0x71,0xc9,0x56,0x9e,0xde,0x90,0x3b, +0xbb,0xdd,0x26,0x23,0xbf,0x42,0x25,0x81,0x87,0xce,0xff,0xff,0xff,0xff,0x3a,0xf3, +0x34,0xaf,0xba,0xef,0xa3,0xd5,0x11,0x53,0x38,0x0f,0xe8,0x20,0xe9,0xe5,0x09,0xf6, +0x76,0xf5,0x0c,0x64,0x22,0x5f,0x66,0x1d,0xa0,0xe2,0xa6,0xd6,0x33,0x84,0x94,0xe9, +0x29,0x4d,0xd5,0x3b,0xb2,0x60,0x2f,0x08,0xa8,0x33,0x83,0x55,0x3b,0x26,0xd6,0x89, +0xbe,0x0b,0x32,0xf3,0x81,0xde,0x88,0xc2,0xf5,0x58,0xe7,0x32,0x70,0x3c,0x21,0x00, +0x06,0x4a,0x63,0xb2,0x92,0xa4,0x41,0xa7,0xff,0x06,0x8e,0x4c,0x46,0x26,0x58,0x6c, +0x01,0x1e,0x08,0xc1,0xa8,0x2d,0xb0,0xd0,0xc4,0x54,0x58,0x65,0x2b,0x98,0x97,0xe1, +0xec,0xa4,0x98,0x5b,0xf5,0x06,0x97,0x1e,0xc3,0x06,0xc2,0xec,0xf0,0x6b,0x64,0xd5, +0xcd,0x25,0xcf,0xbd,0x47,0xea,0xf5,0x99,0x54,0x0a,0xf3,0xf0,0x90,0x87,0xfb,0xf3, +0x0e,0xc2,0x7a,0x28,0x9d,0xcb,0xb5,0x5e,0xc5,0x2a,0x26,0x4e,0xd5,0xde,0x41,0xf0, +0xe0,0x44,0x1b,0xec,0xe6,0x66,0x52,0x90,0x4f,0xab,0x36,0xa3,0xb2,0xb8,0x41,0xf1, +0x54,0xb1,0xda,0x9e,0x3d,0x85,0xbf,0xad,0x86,0xd6,0xec,0x43,0x0a,0xd6,0x75,0x58, +0x99,0x46,0xb5,0x31,0x14,0x8d,0x7f,0xc9,0xc1,0x44,0xa4,0xa3,0x32,0xda,0x43,0xcc, +0x44,0x1d,0xda,0x48,0x9d,0x7d,0x30,0x79,0x58,0x01,0x82,0x0e,0x5e,0xcc,0x42,0x59, +0x2f,0x63,0xf4,0x84,0x73,0x20,0x4a,0x44,0x32,0x4e,0xba,0x3d,0xe0,0x60,0xaf,0xcd, +0xca,0x9e,0x18,0x6e,0xe5,0x27,0x31,0x69,0xcb,0xd7,0x40,0xbe,0xea,0x13,0xdb,0x1e, +0xaf,0x43,0x36,0x2e,0x84,0x4c,0x4c,0x51,0xf8,0x89,0x91,0x83,0x78,0x69,0x91,0xb1, +0x81,0xef,0xfa,0xb9,0xec,0x33,0x6a,0xa6,0x03,0xf6,0x52,0x17,0xd1,0xef,0x20,0xe3, +0x19,0x6e,0xbb,0xb8,0x37,0xbb,0x22,0x7c,0x09,0x0b,0x30,0x31,0x86,0xcc,0x3b,0xad, +0xa6,0xf0,0x5e,0xb2,0xcf,0x3b,0x46,0x9a,0x64,0xcd,0x21,0xc7,0x0b,0xef,0xd4,0x91, +0xda,0x16,0xe6,0xe7,0x0a,0x9e,0xe0,0x35,0xfa,0x6c,0x59,0x4a,0x7c,0xde,0x9b,0xc5, +0x24,0xe5,0xfc,0x94,0x36,0x3b,0x1c,0xb4,0x05,0x14,0xaa,0xcd,0xf2,0x84,0x93,0xd4, +0x25,0xe4,0x86,0x2f,0x90,0x33,0xe4,0x1e,0x73,0x18,0xdd,0xb4,0x3b,0xde,0x54,0x45, +0x81,0x16,0xa5,0x84,0x45,0x3b,0x75,0xa5,0xd1,0x90,0xeb,0xdc,0x7f,0xf0,0x5c,0x16, +0x90,0x49,0xc1,0x2e,0x12,0xbf,0xa0,0x09,0xe3,0xec,0xc8,0xf4,0x73,0x17,0x5d,0xa6, +0x2e,0xc9,0x4f,0xbc,0xcf,0xc7,0x36,0x28,0x5b,0xac,0x85,0x33,0x91,0x09,0xc8,0x2b, +0xdc,0x16,0x94,0x8f,0x1b,0x7d,0x35,0xf8,0x25,0x1b,0x48,0x4c,0x5b,0xd8,0x16,0xfa, +0x98,0x58,0xba,0xca,0x66,0x30,0xad,0x6e,0xee,0xb8,0x74,0x6d,0xfc,0x34,0xbb,0xe6, +0x0a,0xb6,0xa9,0xa0,0x35,0x90,0xd9,0x3a,0x48,0xd3,0x0e,0x39,0xb7,0xdd,0xfe,0x5a, +0x22,0x0e,0x46,0x2e,0x51,0x2d,0xd6,0x17,0xbf,0x01,0x88,0xc5,0x85,0xd1,0xce,0xb9, +0x3b,0x06,0xde,0xbe,0x3f,0x9d,0xf2,0x10,0xce,0x1f,0xd6,0xe0,0x9a,0xd2,0xff,0x5b, +0xaa,0x14,0x46,0x49,0xca,0x0c,0xfc,0x6d,0xee,0x4f,0xc4,0xaa,0x38,0x6e,0xad,0xbf, +0x5c,0x0f,0x5a,0xa2,0x7a,0x5d,0x9d,0x07,0xe8,0x4e,0x4e,0x8e,0x8f,0xf9,0x5e,0x46, +0x3b,0x89,0xed,0x46,0x1c,0xe1,0x0e,0x0a,0x8c,0x9a,0xe0,0x51,0x48,0x8c,0xf3,0x25, +0x03,0x72,0xbb,0x65,0x02,0x20,0xe8,0xc1,0x6b,0x60,0x2b,0x44,0x9f,0x50,0xf8,0x34, +0xfb,0x8b,0x9b,0xf4,0xa8,0x0d,0x49,0x11,0x0c,0xcd,0x8b,0xb4,0xa0,0x4d,0xd8,0x60, +0x92,0x02,0x52,0xfc,0x5d,0xf2,0x01,0xc8,0x2c,0x80,0xc7,0x0e,0x3c,0x32,0x71,0x04, +0x3a,0xc8,0x19,0x34,0xed,0xe4,0xc8,0x9c,0x56,0x89,0xfc,0x9d,0xf7,0x6e,0xe6,0x97, +0x01,0xdd,0x7d,0xa5,0x67,0x0a,0xfc,0xf6,0x4f,0xe9,0x54,0xe4,0x47,0xed,0xf0,0x05, +0xa4,0xc4,0x2b,0xd7,0x77,0x09,0x8e,0x9b,0xc6,0x7d,0x0a,0x85,0x3f,0x97,0x17,0xd7, +0xb7,0x87,0xfe,0xa4,0xe3,0xa1,0x3e,0xf7,0xc3,0xd6,0x7c,0x04,0xaf,0x61,0xd9,0xf9, +0x34,0x05,0xda,0x3c,0x77,0xa7,0xe6,0xd0,0x2f,0x57,0xa4,0x16,0xb7,0x79,0x86,0x89, +0x16,0x81,0xd4,0x18,0xf4,0xa6,0x4f,0x82,0xb1,0x8d,0xc4,0x13,0x45,0xed,0x5d,0x23, +0x65,0x9b,0x23,0x3d,0xfc,0x30,0x24,0xd8,0x48,0x41,0x8d,0x16,0xb6,0x9b,0xab,0x1a, +0x68,0x26,0xf9,0x00,0x61,0xef,0xc0,0xcb,0xec,0x7a,0x5b,0x4c,0xe9,0xa9,0x5c,0x37, +0x83,0x0a,0x6a,0x0b,0xbf,0x26,0x9e,0x82,0xeb,0x8e,0xf3,0x2e,0x16,0x47,0x79,0xdf, +0x2f,0x5c,0x13,0x3c,0x5c,0x12,0x5a,0x36,0x7c,0x19,0xc4,0x53,0xd2,0x6b,0xe7,0x8b, +0xc8,0x8d,0x18,0xad,0x1c,0x86,0xb1,0x95,0xcf,0x8e,0xe6,0x6b,0x5e,0x9c,0x2b,0x7b, +0x9f,0x3f,0x93,0xdd,0x96,0x90,0xc1,0x3c,0x0d,0x8f,0xfa,0x3f,0x97,0x62,0x31,0x79, +0x57,0x90,0xdc,0x82,0x8d,0xf2,0xb4,0x40,0x2c,0xc1,0x8c,0x14,0x78,0x90,0xfc,0x6f, +0x85,0x4a,0x18,0xf4,0xca,0x1a,0xe3,0x2a,0x9d,0xeb,0x83,0x25,0x05,0x5e,0xf8,0xbb, +0xcf,0x9a,0xa7,0xdc,0x15,0x6d,0x31,0x17,0x93,0x26,0x05,0x12,0xd0,0x9e,0x9c,0x17, +0xae,0xe8,0xd5,0x93,0x0c,0x36,0x66,0xb3,0xe3,0x79,0x2e,0xcd,0x3f,0x82,0xdc,0x3d, +0x15,0xb9,0xae,0xd3,0x16,0xb9,0x2f,0xe2,0x1d,0x54,0xf5,0xa6,0x6a,0x5f,0x91,0x15, +0x21,0x77,0xfd,0xb9,0xb5,0x9d,0xc5,0xac,0x61,0x95,0xa2,0xdf,0x88,0x5e,0xdd,0x2d, +0xb6,0xdb,0x65,0xd6,0xc6,0x18,0xda,0x8c,0x3b,0x0a,0x64,0xe2,0x76,0x36,0xd2,0x93, +0xeb,0x94,0x90,0xb5,0xf4,0x08,0x6c,0xb4,0xd4,0x49,0x6c,0x08,0x1e,0xc6,0x8a,0x62, +0x89,0xd5,0xb4,0xee,0xd7,0xfc,0xf6,0xb5,0x46,0x0c,0xc8,0x97,0xf3,0x55,0xee,0x0f, +0x25,0x93,0xd0,0x99,0x9c,0x26,0xad,0x84,0x72,0x2c,0x71,0xce,0xfd,0xe6,0x41,0xb2, +0x45,0x0b,0x99,0x6d,0xde,0x5f,0x67,0xb0,0x90,0x4e,0x24,0x3c,0xdd,0x57,0xa9,0xe8, +0xdd,0xd4,0x1b,0xfd,0x46,0x10,0x74,0x3f,0xa3,0xc6,0x81,0x86,0x9c,0xff,0x77,0x46, +0xa9,0xed,0x9e,0xac,0x7f,0x9c,0xb6,0x7e,0x99,0xd6,0xec,0xea,0x5f,0x7c,0xd9,0xba, +0x5c,0x9d,0xd6,0x0e,0xc4,0xb2,0x76,0xe6,0xe8,0xcc,0x9e,0xbf,0xc4,0xf0,0x47,0x5f, +0x5a,0x64,0x9f,0x4d,0xb7,0x01,0xb3,0x6f,0xa0,0xe1,0xc9,0xc6,0xdd,0x1e,0x30,0xdf, +0xa9,0xdf,0xd7,0x8f,0xb7,0xb0,0x97,0xc7,0x0e,0xc4,0xf5,0xfb,0x5c,0x52,0x91,0xf2, +0x21,0xe0,0xbd,0x44,0x52,0x62,0xd0,0x2c,0xf9,0x48,0xb6,0x42,0xbb,0xc3,0x02,0x14, +0xa2,0xac,0x48,0x0c,0x33,0x63,0xd8,0x28,0x63,0x03,0x34,0x47,0x37,0xc7,0x61,0x40, +0x7b,0x0f,0x04,0x0e,0x5a,0x2d,0xd1,0xa5,0x90,0xde,0x90,0x43,0x3b,0xa1,0x1c,0xa3, +0x7e,0x63,0x08,0x33,0x97,0x53,0x98,0x17,0xc7,0x33,0x49,0xc6,0xb7,0xce,0x16,0x7e, +0x2c,0xf1,0xa1,0xe4,0xc4,0x9b,0xf3,0x56,0x9e,0xa1,0x67,0x16,0xb9,0xf5,0xfb,0xe5, +0xff,0x16,0xb6,0xfd,0xfa,0x36,0x6a,0x74,0xc6,0x53,0xa0,0xf0,0x40,0x1b,0x13,0xc5, +0xd2,0x53,0xff,0xec,0xfa,0xd1,0x0f,0x52,0xc6,0xed,0xb1,0x25,0xc3,0xeb,0x32,0xaa, +0x85,0x47,0x9f,0xeb,0x78,0x34,0xf8,0x6b,0x5f,0xf3,0x87,0xcd,0xc3,0x18,0xdd,0xf7, +0x2c,0xa5,0xc3,0x4c,0x58,0xb4,0x53,0x68,0x08,0xd4,0xc4,0xbf,0x72,0xc7,0x9a,0xe5, +0x68,0x4b,0x0d,0x19,0x66,0x09,0x4d,0x7f,0x93,0x41,0xb3,0xc3,0xb8,0xca,0x92,0x38, +0xb0,0xf5,0x89,0x05,0x49,0xbd,0x19,0x28,0x19,0xe7,0xc5,0x5e,0xba,0xeb,0x44,0x4d, +0x0b,0x43,0x1b,0x04,0x60,0xa2,0x9c,0x42,0x36,0x09,0x4f,0xc3,0x54,0x96,0x2f,0x36, +0x8b,0x01,0xfc,0xf9,0x70,0x9b,0x0c,0x67,0x04,0x02,0x0b,0x2e,0xa1,0xf7,0x1c,0x67, +0x6d,0x4f,0x9c,0xe6,0xf0,0xee,0x60,0x8b,0x8d,0xe2,0xd3,0x85,0x4b,0xf6,0xfc,0x0b, +0x2b,0xdb,0xbd,0xf8,0x73,0xed,0x32,0xc9,0x1c,0xf1,0xb0,0x92,0xdc,0x4e,0x48,0x77, +0x08,0x02,0x7c,0xf4,0x6f,0x3c,0xbd,0x88,0x01,0x5f,0xdb,0x80,0xdb,0xb4,0x0c,0x9f, +0x29,0x52,0xa4,0x00,0x03,0x98,0x3f,0xdb,0x08,0xc3,0xaa,0x14,0xba,0xb3,0xcc,0x88, +0x41,0xa5,0x34,0x67,0x03,0x37,0xb0,0xcf,0xab,0x6b,0x94,0xac,0x98,0xb2,0x06,0xb1, +0x7c,0x81,0x3d,0x76,0xde,0x22,0xea,0xd3,0xce,0x8d,0xab,0x00,0x3a,0xd1,0x5a,0xfe, +0x80,0x91,0xad,0x4d,0xb7,0x43,0x47,0xb3,0x52,0x8a,0x8f,0x4a,0x1a,0xf0,0x26,0xde, +0xf4,0xe0,0xbb,0x26,0xb0,0x1c,0xd0,0x26,0xf0,0x57,0xdc,0x53,0x93,0x7b,0x2f,0xd4, +0xdf,0x51,0xb4,0x56,0x30,0x93,0x09,0xe3,0x95,0x46,0xbc,0xb4,0x7d,0x78,0xa2,0x32, +0x78,0xbd,0x61,0xa7,0xf3,0x16,0xb6,0x1a,0x2a,0xa1,0xb5,0xa5,0x4c,0x79,0xfe,0xd6, +0x77,0xd2,0xf5,0x26,0x8f,0x9a,0x7b,0x4a,0x8d,0xf3,0x97,0x2a,0x50,0x7a,0xb5,0x34, +0xd4,0xeb,0xf3,0x7d,0x9b,0x39,0x77,0x68,0x74,0x1a,0xa8,0x1d,0x1a,0x87,0xce,0x9c, +0x19,0x75,0xf0,0x38,0x9d,0xf9,0x3c,0x3c,0x7d,0x64,0xcc,0x2f,0x5b,0xd4,0x5c,0x89, +0xd3,0x7a,0xb5,0x9e,0x1b,0x19,0x14,0x1c,0xee,0x0a,0xe9,0x08,0x75,0xd7,0x35,0x06, +0x42,0xe8,0xb5,0x38,0xc0,0x32,0x17,0x3d,0xef,0xcb,0x4b,0x2e,0x85,0x71,0xe1,0xff, +0x41,0xb9,0x57,0x8b,0x34,0x35,0x25,0x5c,0xa2,0xdf,0x9c,0x53,0xd9,0x7a,0xe6,0x52, +0xbf,0x89,0x5f,0x0c,0x33,0x92,0x64,0x0b,0xa1,0xf6,0x20,0x1e,0x10,0x99,0xc7,0x38, +0x4a,0x5e,0x03,0xbe,0x86,0x97,0xb5,0xfa,0x80,0xb8,0xdb,0xea,0x5b,0xf4,0xea,0xc2, +0xc0,0x6b,0xdc,0xae,0x8f,0xb5,0x3d,0xfd,0x17,0x1b,0xdb,0x7f,0xf8,0xf9,0xe6,0x60, +0xfb,0x0c,0xa2,0x66,0x10,0x84,0xb5,0xa0,0x86,0xc0,0xd6,0x86,0xa1,0x46,0xf9,0x0d, +0x3b,0xfd,0x83,0x69,0xc4,0x1c,0xb9,0x59,0x44,0x63,0x6a,0x06,0xc4,0x1e,0x6b,0x1e, +0xa0,0x56,0xb8,0xfa,0x94,0xe3,0xf1,0x2f,0x04,0x80,0x26,0x67,0xd2,0x4f,0x16,0x5c, +0x4d,0x79,0xb1,0x87,0xa6,0xbb,0x06,0xb7,0xd9,0x17,0x83,0x86,0xbf,0x3c,0x9f,0x80, +0xa7,0x5b,0xd7,0xf3,0xe5,0xaa,0x0e,0xf0,0xba,0x80,0xd8,0xe2,0x4f,0x17,0x84,0xd2, +0xfb,0xa5,0x4f,0x7a,0x95,0xaf,0xdf,0xed,0xac,0x73,0xfe,0x4e,0xbe,0x74,0xa1,0x46, +0xe7,0xc7,0x89,0xc1,0x6a,0xe7,0xc2,0x64,0x12,0x10,0x4e,0x3b,0xf7,0xc4,0xc5,0x11, +0x04,0x53,0x0f,0x35,0x75,0xf2,0x27,0xe9,0xc3,0x13,0x55,0xe5,0xdb,0xef,0xf1,0x19, +0x2d,0x7b,0x1a,0xfd,0x72,0xb8,0x50,0x2a,0x4a,0x58,0x5e,0x5d,0x3e,0x1e,0x71,0x1a, +0x76,0xc9,0x8a,0xd3,0x1b,0xd9,0xfa,0x37,0x5f,0xc1,0x38,0xce,0x16,0x78,0x90,0xd6, +0x70,0x83,0x1b,0xfc,0xae,0xac,0x63,0xaf,0xd8,0x8f,0x8d,0x8a,0x0a,0xe2,0xeb,0x1f, +0xbd,0x5f,0xde,0xee,0x3e,0xa9,0x39,0x61,0x8c,0x8b,0xc2,0x4d,0x7a,0x87,0x30,0x55, +0x64,0x38,0x63,0xcc,0x1d,0x2a,0xc0,0x75,0xa2,0x63,0x1e,0xec,0x57,0x01,0x14,0xcc, +0xe4,0x6b,0x75,0x3e,0x4b,0xab,0xd2,0xf0,0xdb,0x59,0x01,0xfc,0x5c,0x6b,0xc3,0x51, +0x02,0x03,0xdb,0xb0,0x32,0xa3,0x45,0x9a,0x2e,0x8e,0xa9,0x95,0x7d,0xea,0x35,0xc8, +0x9f,0x20,0xe7,0xd8,0x3e,0x25,0xde,0x60,0xa4,0xbb,0xc5,0x53,0x7c,0xe9,0x1e,0x1c, +0xcf,0x43,0xe0,0xfc,0x5c,0xbd,0xe2,0x26,0x34,0xd3,0x36,0xb5,0x08,0x93,0x13,0xa3, +0x5f,0x6e,0x96,0x26,0xbc,0xf3,0xb9,0x3a,0x64,0x51,0x82,0x06,0xbf,0xf2,0x7a,0x82, +0x45,0x0d,0xb7,0xfe,0x5f,0xf6,0xf5,0xaf,0x40,0x90,0x93,0x07,0x96,0x9e,0x17,0x36, +0x52,0xff,0xae,0xb5,0x86,0x57,0x16,0xe3,0xa5,0x4f,0xc3,0x07,0x1c,0x90,0x20,0x04, +0xb4,0x97,0xe0,0x39,0xdf,0xc5,0xc7,0xe5,0xb2,0x02,0xcc,0x54,0x89,0x3b,0x8e,0xc1, +0x4d,0x73,0xd2,0xfa,0x5f,0xb8,0xfc,0x03,0xb5,0x95,0xb4,0x65,0x9e,0x84,0x86,0x38, +0x6e,0x15,0xaf,0x39,0x36,0x46,0xd2,0x7c,0x8d,0x60,0x35,0xbb,0x6d,0xf0,0x57,0x20, +0x6d,0x3c,0x12,0xa6,0x8b,0x3d,0xde,0xc5,0x3b,0x32,0x85,0x75,0xf4,0x71,0x99,0x19, +0x3b,0x13,0x86,0x93,0xcd,0x19,0x08,0x12,0xe1,0x6e,0xd0,0x93,0x97,0x9b,0x66,0x97, +0x2b,0x09,0x0e,0xec,0x5f,0x95,0x1b,0x29,0xce,0x9b,0xee,0x4d,0x1b,0x54,0x07,0x61, +0xd9,0x8c,0x9f,0xbf,0xe1,0x15,0x3f,0xb2,0xea,0xaa,0x1b,0xdc,0x9a,0x5c,0x04,0x1f, +0xb9,0x1f,0x6f,0x87,0x1d,0xa0,0xbe,0xa9,0xeb,0x8b,0xe9,0x2c,0x81,0x54,0x04,0xce, +0xd2,0xd8,0x66,0x3d,0x4e,0x11,0x28,0xd9,0x6a,0x77,0x8e,0x6c,0x7f,0xe4,0xc9,0x45, +0x44,0x2b,0x90,0xf3,0xd6,0x2c,0xdf,0xe0,0xf3,0x69,0x56,0x5d,0x00,0x3d,0xd4,0xcc, +0x7a,0x48,0x72,0x1f,0xb6,0x46,0x45,0xef,0x6b,0xc8,0xad,0xee,0x5d,0xbf,0xef,0x2a, +0x7d,0xdf,0xf7,0x36,0xb9,0x45,0x21,0xf4,0xa9,0x91,0x3f,0x26,0x3d,0xbe,0x50,0x0d, +0x7b,0x4c,0xd9,0xab,0xb5,0x81,0x70,0x3e,0x62,0x4d,0x91,0x26,0x54,0x0c,0x58,0x80, +0x7d,0xba,0x30,0xef,0x22,0x56,0x40,0xb1,0x72,0x2b,0x9f,0x8f,0x11,0x24,0x43,0x85, +0xab,0xdc,0x9d,0xe3,0xa3,0x85,0x09,0x5c,0x29,0x28,0x45,0xef,0x23,0x5d,0x0a,0xe9, +0x81,0xf8,0x31,0x52,0x4b,0x2b,0xa1,0xd1,0x91,0x42,0xf9,0x37,0x84,0x6e,0xe1,0xe0, +0x9e,0x27,0xb9,0x22,0xf9,0x55,0xe9,0xfa,0x43,0xf5,0xe8,0x9f,0xdf,0x99,0x19,0xd2, +0x83,0x4a,0x8e,0x79,0xfa,0x54,0xbb,0x8a,0xce,0xe8,0x75,0x0b,0xce,0x3a,0x6c,0x3e, +0x1b,0x4a,0x8b,0x58,0xb3,0xe5,0x6b,0xfe,0x39,0xcb,0xb6,0x9a,0x27,0xf0,0x71,0xa0, +0x20,0x57,0x83,0x48,0xb2,0xe5,0xce,0xea,0x32,0xce,0xee,0x4c,0x23,0xf6,0xdb,0xf4, +0x88,0x4a,0x83,0x7e,0xbf,0x38,0x86,0x21,0x6a,0x59,0x56,0xa9,0x1b,0x9b,0x8f,0x8f, +0x36,0xd6,0x5e,0xa3,0xe6,0xc9,0x4a,0x98,0x51,0x4f,0xe7,0x57,0x2d,0xb6,0x4d,0x8d, +0x7d,0x48,0x7b,0x05,0x3f,0x66,0x91,0x09,0xf4,0x2a,0x83,0x4f,0xdc,0xe7,0xcb,0xb9, +0x6e,0x65,0xb1,0xe3,0xaa,0x5c,0xb8,0x78,0x68,0x4d,0x83,0x2c,0x56,0xed,0x70,0xb7, +0xfe,0x03,0x92,0x69,0x1e,0x05,0x72,0x82,0xa3,0x9d,0x65,0x45,0x5c,0x4f,0x72,0xa2, +0x86,0x90,0xdf,0xd8,0x6e,0x58,0x1b,0x90,0x83,0x00,0x0c,0x78,0x72,0x71,0x7e,0xcd, +0xf0,0x70,0xae,0x3f,0x61,0xdb,0x49,0x6b,0x58,0x44,0xa8,0xeb,0xb4,0x6d,0x51,0x5b, +0x49,0x6b,0xab,0x1a,0xaa,0x22,0x20,0x71,0x6e,0xf0,0xc7,0xba,0xdd,0xdc,0x00,0x73, +0xa2,0xc4,0xbf,0x43,0xee,0x38,0xd4,0x69,0x77,0xab,0x6c,0x4c,0x8a,0x3d,0x54,0x80, +0x8d,0x1c,0xd5,0x33,0x94,0x6e,0x7c,0x87,0x40,0xda,0xdd,0x52,0x61,0x3c,0xab,0xe3, +0xc1,0xca,0x01,0xff,0x6e,0x4d,0x91,0x25,0x9c,0x43,0x0e,0xc5,0xbe,0xff,0x17,0x83, +0x80,0xc3,0x30,0x52,0x27,0x39,0x36,0x53,0x82,0xb8,0x62,0x72,0x33,0x73,0x79,0x44, +0x54,0x14,0x8e,0x26,0x11,0x74,0x37,0xa0,0x4c,0xd9,0x2b,0x9a,0xff,0x82,0x56,0xd2, +0xe1,0x71,0x0c,0xa8,0x65,0xc1,0xa7,0xb7,0x8a,0x76,0x83,0xf5,0x8f,0x44,0x7d,0x3b, +0x2f,0x8b,0xd9,0x0e,0x4e,0x07,0xb2,0x1e,0x03,0x80,0xdd,0xe1,0x72,0x06,0x05,0xe1, +0x4a,0x34,0x5c,0x51,0xac,0x2a,0xba,0x8f,0x82,0x53,0x1d,0x89,0x4f,0xd7,0x66,0x96, +0xb9,0x15,0x01,0x7c,0x30,0x24,0xd6,0xa5,0xba,0x23,0x9e,0xb9,0x85,0xfe,0x6e,0x86, +0xe4,0x14,0x0e,0xdb,0x17,0x27,0x1a,0x3c,0x22,0xac,0x4e,0x54,0x83,0xa4,0x05,0x6b, +0x8b,0xda,0xb8,0xc7,0xa8,0x3e,0x6c,0x45,0x14,0xa1,0x90,0x6d,0xfc,0x34,0x0d,0x7b, +0x2b,0xcf,0xf4,0x63,0x39,0x2a,0x25,0x3b,0x3d,0x58,0x67,0x99,0xca,0xec,0xa1,0xb6, +0x4b,0x18,0x06,0x70,0x6e,0xb7,0x2f,0x9b,0x48,0xd5,0x1a,0xee,0x3e,0x3e,0x6e,0x52, +0x2a,0xdf,0xd8,0xf1,0xd0,0x4c,0x07,0xef,0xce,0x82,0xa6,0x0c,0x1a,0xdc,0x3e,0xba, +0x88,0x97,0x38,0x2f,0xd9,0x31,0x77,0x63,0xe9,0x8c,0x04,0xf1,0x13,0x4f,0x72,0x5d, +0xdd,0x1f,0x85,0x3f,0x98,0x04,0x5e,0x9f,0x14,0x62,0xca,0x17,0x12,0x0e,0x40,0x1c, +0x95,0x8d,0x58,0x04,0x2d,0x57,0x93,0x1f,0xe7,0x81,0xb3,0x66,0x44,0x6d,0x86,0x70, +0xc7,0x59,0x88,0x72,0x62,0x71,0x60,0x7f,0xc7,0x15,0x03,0x34,0x49,0xfa,0x43,0x23, +0x06,0x56,0x5a,0x17,0xe3,0x12,0x0f,0x42,0xa5,0xe2,0xe8,0x9d,0x73,0xf2,0x21,0x06, +0xe6,0x5b,0x93,0xec,0xf6,0x53,0xae,0x51,0x87,0xcc,0xce,0x51,0x2a,0x8d,0x28,0xde, +0xef,0x75,0xe2,0xa4,0x5e,0xce,0x4d,0xe6,0x3c,0xba,0xda,0xe2,0x20,0x25,0x11,0x21, +0x73,0x0c,0xfe,0x7f,0xfc,0xe1,0x00,0xf0,0xca,0xfc,0xc5,0xf2,0x21,0x24,0x86,0x3d, +0xe7,0x82,0xfd,0x8c,0xf5,0x9c,0x4a,0x81,0x6a,0x7b,0xb9,0x6f,0xd0,0x55,0x49,0xd9, +0x86,0x85,0xd3,0xe7,0x1a,0x08,0x41,0x93,0xc3,0x89,0xf1,0x46,0x23,0xfd,0x5a,0x2d, +0x6f,0x0c,0xb5,0xfd,0x98,0x25,0x6a,0x6f,0xb7,0x53,0xd0,0x36,0x5d,0x28,0xae,0xfc, +0x0b,0xf9,0x92,0xe4,0x3c,0x31,0x77,0xf6,0x36,0xc9,0x6a,0x1a,0xa0,0xe2,0x5b,0xe3, +0xdc,0x01,0xf1,0x4d,0x77,0xce,0x53,0xd6,0xc4,0x88,0x89,0xa7,0x7b,0xa6,0x99,0xbb, +0x91,0xcb,0x07,0x60,0x4f,0xd4,0x60,0x19,0xb2,0xeb,0xb9,0xd7,0x27,0x36,0x5f,0xce, +0x74,0xf2,0x46,0x3c,0xbd,0x27,0x23,0x82,0xde,0x8e,0xc5,0xa7,0xdc,0x80,0x0a,0x08, +0x67,0x80,0x39,0xc2,0xfe,0xa2,0x7a,0x18,0xf8,0xa8,0x34,0xb9,0x8d,0xe5,0x59,0xa9, +0x22,0x81,0x68,0x7e,0xa6,0xec,0xa0,0x0e,0xc8,0x1d,0xe8,0x0d,0x2d,0x43,0x33,0x5f, +0x08,0x9c,0xf7,0x94,0x76,0xde,0x43,0xbc,0x15,0x92,0xfe,0x04,0x9d,0x79,0x8a,0xe0, +0xdb,0xf5,0xc4,0xc4,0x20,0xbd,0x4c,0x64,0x78,0xcb,0x0c,0x86,0x99,0x90,0xca,0x7f, +0x92,0xd3,0x97,0x51,0xa3,0xb9,0x67,0x50,0xe7,0x05,0xcf,0xd0,0x8a,0x9f,0x1d,0xdc, +0xa2,0xe2,0x5c,0xc0,0x66,0xcd,0x36,0x45,0x66,0x06,0x0d,0xb7,0x53,0xe9,0x7d,0x65, +0x27,0x47,0xab,0xf5,0x0a,0x2e,0x10,0x51,0xd6,0xc1,0xdf,0xb3,0xf4,0x83,0x5e,0x20, +0x8a,0x9b,0xf4,0xe3,0x08,0xb2,0xb4,0x5e,0x66,0x09,0x0c,0xf7,0x4e,0x59,0x34,0xda, +0xa5,0x19,0xba,0x52,0x4d,0x39,0x1c,0xb5,0x24,0xd8,0xb4,0xf2,0x7e,0x6a,0x05,0x85, +0xea,0x9b,0xc5,0x21,0x17,0xbf,0x0d,0xc4,0x1b,0xd9,0xe0,0xa0,0x34,0x06,0xff,0xb1, +0x84,0xd7,0xd5,0x2d,0x1b,0xba,0x25,0xfb,0x65,0x5b,0x6d,0xd7,0xb7,0xb7,0x55,0xe8, +0xd3,0xda,0x43,0x61,0x0f,0xdf,0x8e,0x28,0xb8,0x4f,0x09,0xfe,0xfc,0xb7,0xee,0x47, +0x7d,0x62,0xcd,0x5e,0x65,0x32,0xe1,0xbb,0x6b,0x73,0xe8,0xf8,0x5b,0xb8,0xad,0xe9, +0xd3,0xba,0x1f,0x75,0x01,0xd4,0x4f,0x8f,0xdb,0x2f,0x8a,0xcf,0xf8,0xb4,0xaf,0x9f, +0xd1,0x8a,0xab,0xd5,0x44,0xa7,0x88,0x9f,0x0c,0xe4,0x9c,0x83,0x25,0x0a,0x8e,0x62, +0x1d,0x58,0x99,0x89,0xc3,0x0a,0xe4,0x88,0x4d,0x9c,0xd2,0x34,0x5c,0xcc,0x39,0x15, +0x8e,0xc2,0x90,0xe6,0x39,0x0e,0xee,0x88,0x84,0xec,0x9e,0xa1,0xdc,0xf0,0xa7,0x77, +0x83,0xdc,0x99,0xf6,0x4b,0x28,0x9f,0x43,0x4a,0xcd,0x35,0x4f,0xb6,0x9c,0xdb,0xb9, +0x20,0x29,0xd2,0xbd,0x4c,0xda,0x25,0x8b,0x87,0xee,0x8d,0xfa,0xf3,0x91,0x20,0x01, +0x8d,0x08,0xe9,0x77,0x64,0x23,0x70,0x64,0xc0,0x4d,0x28,0x34,0xf7,0x0e,0x0d,0x56, +0x49,0x1a,0xee,0x29,0xfa,0xd0,0x5c,0x56,0x20,0x61,0xa6,0xf5,0x30,0x65,0x81,0x02, +0x53,0x4e,0x3f,0x9c,0x1d,0xaf,0x1b,0x23,0x63,0x59,0xaf,0x84,0x1a,0x28,0x99,0x77, +0xa0,0x43,0xb3,0x86,0xe5,0x8c,0x41,0x98,0x43,0x4b,0xe0,0x46,0xf3,0xea,0x32,0x48, +0x02,0x0c,0x1e,0x9f,0x6d,0x64,0xc6,0xbe,0x43,0x86,0x01,0xe6,0xd2,0xac,0x9a,0x49, +0x6b,0x08,0xae,0xd6,0x93,0xdc,0x4e,0xd1,0xa8,0x66,0xf8,0x34,0xf0,0x61,0xc1,0x02, +0x14,0x00,0x01,0x78,0xa2,0x0b,0x57,0x58,0xa1,0x99,0x8b,0x9a,0x71,0x60,0x95,0x12, +0xd9,0x2b,0xf1,0xb5,0xc7,0x8a,0x03,0x8e,0xa9,0x44,0xd8,0x84,0xaa,0x73,0x26,0xd2, +0x2a,0xea,0x11,0xcb,0xf1,0xd9,0x3a,0x4a,0xbf,0x2d,0xb2,0xa6,0x59,0x18,0x32,0xaa, +0x05,0x69,0x4a,0xc5,0xe0,0x21,0xec,0x4a,0xea,0x4f,0xce,0xf8,0x6a,0xcf,0x47,0x8b, +0x55,0x05,0xe5,0xac,0x71,0x29,0x2b,0xd6,0x4a,0x42,0xb5,0x8d,0xd3,0xce,0xe7,0x1b, +0x81,0x67,0x09,0x0e,0xed,0x28,0x13,0x8b,0x68,0xd4,0xa5,0x99,0x7e,0xc0,0xd4,0x0b, +0x68,0x20,0x4d,0xfe,0x1e,0x1c,0x2c,0xc8,0xa3,0x9d,0xf2,0x69,0x31,0xd5,0xd6,0x1b, +0x68,0x21,0x6c,0xbe,0xf8,0x48,0x42,0xf5,0x4d,0xac,0xcf,0x1c,0x43,0x6b,0x4f,0x0a, +0xc1,0x22,0xa3,0x4f,0xea,0xa5,0x4b,0xf4,0x23,0xbf,0xf6,0x1e,0xa3,0xc7,0xe9,0xdd, +0xe7,0x03,0xb3,0xd9,0x82,0x00,0xe5,0x1b,0x29,0x6f,0xfb,0x45,0x32,0xd6,0xec,0x84, +0xa5,0x90,0xfc,0x80,0x36,0xb0,0x6c,0xd2,0x9b,0xaf,0xea,0x9d,0x85,0xd3,0x88,0x72, +0xa3,0x59,0xb4,0x6b,0xf9,0x80,0xd9,0x94,0x88,0xf8,0x4c,0xb7,0x90,0x30,0x65,0xc5, +0xe7,0x99,0xaa,0xe7,0x47,0x57,0xd5,0xfc,0x00,0x1e,0x86,0x56,0x80,0xd2,0xc4,0x73, +0x23,0x5b,0x2d,0x86,0xc1,0x57,0x45,0xb4,0xe7,0x89,0xa3,0x69,0xd2,0x33,0x53,0x44, +0x4e,0xb1,0xfc,0x94,0x36,0x3b,0x6c,0x52,0x32,0x54,0x64,0x93,0x7c,0xab,0x32,0x71, +0xd6,0xb6,0x5b,0x36,0xb1,0x31,0x3c,0x44,0xb6,0xf4,0x75,0x8a,0xe6,0x80,0xbe,0xbe, +0xca,0x35,0xfd,0x37,0x30,0x32,0x5d,0xe5,0x4b,0xf0,0x61,0x87,0xfc,0x09,0x1d,0x22, +0x81,0xba,0x94,0xb7,0x4c,0x33,0x65,0x14,0x6a,0x9a,0x8b,0x8a,0xdd,0xd1,0x1e,0x78, +0x57,0x17,0xbe,0x76,0x94,0x35,0xcf,0x2c,0x27,0x38,0xba,0x07,0x7e,0x82,0x6e,0xdc, +0x26,0x14,0x5d,0x6f,0x4d,0x57,0x1f,0x5a,0xec,0xd9,0xca,0xcf,0x6e,0x06,0xb3,0x79, +0x57,0x15,0x10,0x7e,0xc4,0xa7,0x77,0xe9,0x27,0xd1,0xd2,0xb3,0xda,0x8e,0x05,0x98, +0x0a,0x1d,0xb1,0xa0,0x73,0x32,0x8f,0xa7,0x99,0xaf,0x46,0xbd,0x02,0xe0,0xd5,0x28, +0x67,0xbc,0x80,0x8a,0x28,0x3a,0x7a,0x86,0xe3,0x01,0xee,0x12,0x87,0xcd,0x70,0xe4, +0x0a,0xbd,0x35,0x3e,0x9a,0xb7,0x62,0xf1,0xc2,0xfe,0xe1,0xcd,0xda,0x82,0x50,0x4d, +0xc6,0x12,0xe7,0xf1,0x1b,0xb4,0x7b,0x97,0x63,0x01,0xa8,0x93,0x88,0xe1,0x8f,0xec, +0x60,0x17,0xb0,0x3f,0x1a,0xb0,0x63,0x38,0x42,0x26,0xe4,0x79,0x8d,0x84,0x28,0x06, +0x8c,0x1e,0x86,0x3b,0x3e,0xcc,0x84,0x40,0xc9,0x36,0xc8,0x22,0xbd,0xa3,0x92,0xf2, +0x01,0xa5,0x96,0x4f,0x74,0xa5,0x87,0xda,0x41,0x1d,0x18,0x45,0xf6,0x62,0x89,0x96, +0xb7,0x16,0x9f,0xa6,0x5e,0x7a,0xce,0x59,0x12,0x1d,0x83,0x17,0xf5,0x4d,0x80,0xb3, +0xd1,0x81,0xd0,0x64,0xb7,0x2a,0x95,0xb6,0x10,0xa1,0x0f,0xc4,0x59,0x4e,0xa0,0x77, +0xcd,0x8c,0xda,0xb9,0x10,0x55,0x32,0xe6,0x2a,0x29,0x88,0x94,0xfa,0xeb,0xfe,0x61, +0x01,0x64,0x7f,0x7e,0x6c,0xa5,0x2c,0x4c,0x65,0x87,0x2a,0x79,0x39,0x50,0x3f,0x52, +0xfe,0xc4,0xf0,0xba,0x9a,0xe4,0x2b,0x13,0x65,0x33,0x61,0x78,0xbc,0x52,0x71,0xd7, +0xeb,0x59,0xb2,0x37,0xe8,0x87,0xf6,0x12,0x3b,0xe4,0xfc,0x48,0xc7,0xa5,0xca,0x8a, +0x3f,0x9a,0x82,0x84,0x1f,0x50,0x5b,0xc1,0xb3,0xce,0xe2,0xcc,0xf0,0x45,0x52,0xf2, +0x17,0xc4,0xb9,0x19,0xf4,0xf3,0x8e,0x45,0xee,0xcf,0xe4,0xdc,0x59,0x6c,0x9b,0x89, +0xae,0xba,0x85,0x36,0x18,0x0e,0x3b,0x99,0x39,0xc5,0xe7,0xcd,0x35,0xb0,0x4b,0xbb, +0xd1,0x84,0xe9,0xcf,0x6a,0x00,0x33,0x8c,0xae,0xeb,0x08,0xdd,0xb5,0x5a,0x6a,0x22, +0x46,0x3d,0x22,0xaa,0xad,0xa8,0xc1,0xca,0x48,0x76,0x3d,0x12,0x87,0x11,0xaa,0x6f, +0x54,0x20,0xeb,0xdc,0x9f,0x7c,0x84,0x5e,0x87,0x74,0xc5,0x4f,0xfe,0x12,0x5d,0x87, +0xee,0xae,0xfb,0x89,0x8c,0xe0,0x10,0x7a,0xb6,0xeb,0xdc,0x35,0x2b,0x72,0xfc,0xbb, +0x90,0x2f,0xd3,0x0f,0x97,0xa0,0x6e,0xf9,0x4f,0xc7,0xc0,0xfb,0xa9,0x14,0x28,0x85, +0x85,0x18,0x9a,0x5b,0x32,0x0a,0x23,0xd0,0x8f,0x93,0xb4,0x22,0x7c,0x9e,0xe8,0xf0, +0x64,0xd1,0xe6,0x94,0x7f,0xdd,0x71,0xf2,0x61,0xf4,0x0b,0x17,0xac,0x8c,0x65,0x61, +0x26,0x9a,0x9a,0xc7,0xf4,0xa9,0x0b,0x07,0x69,0x74,0x12,0x9a,0x00,0xf1,0x55,0xf1, +0xe4,0x13,0x97,0x04,0x94,0x4c,0x90,0xc0,0xf2,0x6c,0x92,0x4f,0xf5,0xb1,0x31,0xd3, +0x5e,0x1f,0x84,0xc4,0x4a,0xbb,0x48,0x1e,0xcf,0x60,0x0f,0xc1,0xd7,0x0b,0xac,0xe7, +0xf0,0x9f,0x63,0xd4,0x03,0x4e,0x40,0x61,0xe2,0x97,0xf4,0xe2,0xa2,0xa8,0xe5,0x47, +0xca,0xda,0xdf,0x38,0xb0,0x97,0x49,0x65,0x61,0x94,0x19,0x68,0x03,0xa0,0x6b,0x57, +0xcb,0x39,0x69,0x53,0xcb,0xa6,0x41,0x60,0x06,0x28,0x56,0xa8,0x4a,0x0b,0x5e,0xe8, +0x6d,0x99,0x9c,0x1d,0x63,0x67,0x6d,0xaa,0x53,0xdb,0xb2,0x69,0xa4,0x29,0x56,0x18, +0x28,0xbd,0x15,0x1a,0x66,0x04,0x6b,0xbe,0x91,0x68,0xa9,0xf9,0xbf,0xe9,0x5f,0xe9, +0xed,0x92,0x0b,0xfc,0xc0,0x4c,0x69,0x03,0x98,0x71,0x8d,0x5c,0x84,0x57,0x17,0xcb, +0xa5,0x94,0xe7,0x8e,0x8e,0x53,0x8c,0x83,0xeb,0xc3,0xf7,0xe1,0x14,0x4a,0x6e,0xe2, +0x66,0x2d,0x26,0x26,0x3e,0xba,0xb6,0x37,0xf3,0x51,0xc8,0x5a,0x16,0xec,0xae,0xef, +0x74,0x30,0x96,0x5a,0x58,0xc3,0x42,0x69,0x10,0xbd,0xe8,0xf7,0x94,0xcd,0x59,0x07, +0xc6,0x93,0xaf,0x58,0xdd,0xae,0x88,0x6f,0xb1,0xe9,0x89,0xe7,0x17,0x1d,0xf8,0xbb, +0xe7,0xdd,0xcf,0x4a,0xb9,0x35,0xbf,0xc6,0xdf,0x9d,0x7f,0xbf,0xff,0xff,0x60,0x52, +0x64,0x0d,0xff,0x77,0xb3,0x73,0xef,0x67,0xc2,0x4c,0xc9,0x7f,0x56,0x82,0x36,0xd5, +0x22,0x41,0x41,0xf6,0xf1,0x85,0x78,0x72,0xb8,0x4c,0xa5,0x76,0xf0,0x3c,0x59,0x05, +0x88,0x5f,0xfa,0x76,0xe8,0x86,0xaa,0x43,0x1e,0x4d,0x80,0x4f,0x51,0x6f,0x0d,0x92, +0x60,0xbc,0xf1,0x54,0x7a,0x6b,0xfa,0xd3,0x99,0x63,0xb1,0x57,0x6c,0x6f,0x1e,0x04, +0xa2,0xbf,0xd0,0xcc,0x02,0x3f,0xe7,0x12,0xbd,0x40,0xb6,0xd5,0x51,0x04,0x9f,0xfe, +0x74,0x20,0xf2,0xf8,0xa4,0xd0,0x00,0xed,0xc1,0x41,0x8e,0x4b,0x75,0x24,0x59,0xb9, +0x1c,0x44,0xd7,0x23,0xae,0x59,0x45,0x89,0xc8,0x0b,0x0e,0x9a,0xf6,0xa3,0x96,0x31, +0x85,0x84,0x9b,0x44,0xf1,0x65,0x17,0x13,0x80,0xb7,0xe3,0x86,0xe7,0xc8,0x5b,0x82, +0xad,0xf7,0x2d,0x63,0xc5,0xf4,0x52,0x5a,0xca,0x44,0xaa,0x5f,0x76,0xc9,0x8a,0x19, +0xbc,0x82,0x53,0x2b,0x1f,0xda,0x7a,0x7f,0x7c,0x46,0x5a,0xa9,0xd0,0xc4,0x3c,0x4e, +0x56,0x02,0x3a,0x53,0xa7,0x23,0x2c,0xcb,0x64,0x45,0xab,0xd2,0x31,0x29,0x45,0x20, +0x3a,0x46,0x7a,0xec,0xed,0xce,0xaf,0xdb,0x4b,0x6f,0x88,0xd2,0xee,0x6b,0x2d,0xcc, +0x5d,0x56,0x0f,0x4c,0xc6,0x4f,0x0c,0x8a,0x5e,0xc9,0x47,0x9f,0x2a,0xc3,0x09,0xdc, +0x35,0x99,0xb5,0xa2,0x1d,0x6d,0xb6,0xe7,0xa2,0x42,0x62,0x83,0xe6,0x01,0x0b,0x79, +0xa8,0x8d,0xf9,0xa6,0x29,0xb1,0xac,0x81,0xca,0x03,0xc4,0x82,0xe9,0x49,0x12,0xff, +0x2e,0xf0,0xa6,0xb5,0xd7,0x6d,0x41,0x7b,0x78,0xc4,0x3c,0x3d,0xdf,0x4b,0x05,0x82, +0x68,0x7c,0x13,0xaa,0x44,0xc5,0x74,0xe7,0x59,0x5f,0xbb,0x20,0x30,0x9b,0x65,0x7b, +0xde,0x7d,0x5b,0x3a,0xd8,0xa0,0x56,0xad,0x40,0x91,0xe2,0x11,0x90,0xd2,0xd1,0xdf, +0x8e,0xce,0xd1,0xbb,0x92,0x70,0x75,0xa2,0x02,0x5f,0xab,0x9d,0x98,0x11,0x6d,0xd6, +0x9c,0x1e,0x4d,0x00,0x6f,0x92,0x43,0x53,0xa9,0xd6,0x4d,0x46,0xd7,0xd3,0x46,0x28, +0x70,0x59,0x23,0x84,0x76,0x76,0xf8,0x73,0x0f,0xfb,0xc3,0x97,0x02,0xfd,0x34,0xe2, +0xdc,0x0e,0xb4,0xa7,0x11,0x3c,0x05,0xeb,0x86,0xd7,0xc6,0xf6,0xe1,0x7f,0xba,0xb2, +0x93,0xe2,0xc9,0x33,0x5b,0x55,0x05,0x10,0xc8,0xa6,0xf5,0x0f,0x1b,0x67,0xcd,0x37, +0x90,0xd7,0x8c,0x92,0x79,0xf4,0x43,0xc9,0xc0,0xf7,0x5f,0xe6,0xc3,0xe6,0xe1,0x6a, +0xaa,0x74,0x11,0x7f,0x44,0xe5,0x36,0xa9,0x89,0x5e,0x03,0xae,0x9c,0x39,0x6e,0xda, +0xd0,0x14,0x4e,0x09,0xe3,0x98,0x3a,0x0b,0xc8,0xd3,0xc6,0xdc,0x4a,0x5b,0x9e,0xeb, +0x7e,0x15,0xd1,0xb1,0x53,0xeb,0xbf,0xbc,0x4b,0x5c,0x3f,0x18,0x11,0x63,0xf4,0xbe, +0x08,0x07,0xdb,0x6e,0x93,0xe6,0x98,0xd9,0xad,0xf0,0x27,0x5d,0xb9,0xd6,0xfe,0xf5, +0x8d,0x91,0x8e,0x49,0xc6,0x3f,0x0f,0xfa,0x8f,0xf3,0xf0,0xc5,0x02,0xd1,0xf6,0x1f, +0xe9,0x94,0xb0,0x79,0xb6,0x9b,0xde,0x68,0x80,0x9e,0xe4,0x0f,0x4b,0xd2,0x39,0xa1, +0x41,0x37,0x07,0x04,0xfe,0xe3,0x03,0xae,0xec,0x16,0xc6,0x4d,0x17,0xde,0x47,0xc1, +0x0e,0x9e,0x99,0x1d,0xff,0x9b,0x01,0x48,0x14,0xd2,0xca,0x3a,0x12,0x4e,0x78,0x7a, +0x86,0xec,0xfe,0x3b,0x35,0x0b,0xc0,0x40,0x07,0x30,0xef,0x04,0x27,0xb5,0x10,0x58, +0xfc,0x9d,0xb0,0x05,0x6d,0xd0,0x3e,0x00,0xc5,0xe1,0x80,0xd9,0xd6,0xec,0xb8,0x61, +0x73,0xe7,0xf1,0x30,0xff,0x81,0x29,0x37,0xaf,0xcd,0x71,0x1b,0xe4,0xec,0x28,0x11, +0xcd,0x5f,0x97,0x3a,0xb4,0xb0,0x03,0xb1,0x04,0x62,0x40,0xf5,0x74,0xdc,0x8c,0xaa, +0xd6,0xc9,0xe2,0xdf,0x83,0x79,0x50,0xe8,0x47,0x64,0x26,0x39,0xeb,0x18,0x10,0xda, +0xa2,0x0c,0x28,0x17,0xce,0xf8,0x78,0x52,0x41,0x45,0x14,0xe4,0x5b,0xed,0x86,0xb3, +0x06,0x29,0x48,0x08,0x6b,0xda,0xae,0x62,0xc0,0xdc,0x31,0xb2,0xfc,0x1b,0x49,0xc0, +0x24,0x8f,0x91,0x70,0x2a,0xa8,0x43,0x9b,0xc7,0x88,0x7f,0x05,0x3c,0xf6,0x8e,0x8f, +0xd9,0xea,0x9c,0xaf,0x7c,0x28,0x4a,0xa8,0xc4,0xaf,0xda,0x4c,0xef,0x95,0xed,0xea, +0x05,0x52,0xd1,0xef,0x14,0xa9,0xb8,0xcb,0xee,0x69,0x41,0x55,0x27,0x56,0x4a,0xe0, +0xae,0x87,0xdc,0x7d,0xf6,0xa9,0x0b,0xfb,0x90,0xc3,0x24,0xd0,0x69,0x39,0x2b,0x51, +0x74,0x97,0x8d,0x27,0x98,0xde,0x09,0x39,0xc5,0x46,0x82,0x87,0x2e,0xf0,0x60,0x8c, +0x66,0x88,0x9c,0xeb,0xeb,0xa5,0xe2,0x75,0x3e,0x78,0x8c,0x47,0xd6,0xbd,0x4a,0xc0, +0x70,0x9c,0x2a,0x1f,0xf8,0xa0,0xaa,0x47,0x49,0xe5,0x84,0x56,0xf3,0xe0,0x65,0xcf, +0xd9,0xb6,0x67,0xbe,0xb0,0x51,0x64,0x64,0xba,0x45,0x33,0x22,0x8d,0xe3,0x32,0xda, +0x2a,0x84,0x14,0x2c,0xb1,0xc1,0xc3,0x19,0x24,0x4c,0x85,0x56,0x52,0x49,0x1b,0xc8, +0x34,0x94,0xf2,0x26,0xdf,0xb3,0x4c,0xb3,0x84,0xd4,0x78,0x46,0x73,0xf3,0x87,0x17, +0xb6,0xae,0x96,0x65,0x13,0x1e,0x76,0x50,0x41,0x93,0xb7,0x70,0x1b,0xb3,0x23,0xdd, +0x29,0xf0,0xe3,0xaa,0x34,0x3e,0x31,0xd1,0x66,0xbe,0x35,0xfa,0xd4,0x11,0x7d,0xf1, +0xfb,0x18,0x79,0x7f,0x6c,0xf1,0xfb,0xd9,0x0c,0x89,0xee,0xfb,0x72,0x63,0x07,0x24, +0x4d,0xbd,0x30,0x77,0xfe,0xb7,0x0a,0xdf,0x8f,0x25,0x96,0x19,0x9f,0xe5,0x6e,0x34, +0x21,0x4f,0xbc,0x97,0x92,0xf7,0xfc,0x93,0x5a,0x97,0xf4,0xe2,0x1c,0xe4,0x61,0x2b, +0xa6,0xdb,0x35,0xd6,0xca,0x16,0xd9,0x70,0xcc,0xde,0xef,0xe5,0x34,0x02,0xa4,0x13, +0xbb,0x96,0xe1,0xb9,0x16,0x48,0x71,0xa8,0x46,0x08,0x7a,0x06,0xcf,0x08,0x22,0x76, +0x2c,0x84,0xa4,0x3c,0x3c,0xb8,0x24,0x54,0x87,0x49,0x76,0x6b,0xbe,0xb6,0x28,0xdd, +0x03,0x45,0x3b,0xed,0x01,0xd5,0x29,0xc9,0x7a,0x72,0xa6,0x52,0xd5,0x82,0x18,0xc1, +0xbc,0x9e,0xa7,0x8f,0x5d,0x15,0x09,0x62,0xae,0x75,0x33,0x53,0x36,0x01,0xfb,0xc5, +0x3e,0xa4,0xc9,0xa6,0xbe,0xd1,0x47,0xbf,0x0d,0xaa,0xa7,0x4e,0xf4,0xdb,0x70,0xc2, +0x0e,0xec,0xd8,0x7f,0xb1,0x4a,0xc2,0x88,0xd1,0x80,0xac,0xe3,0x02,0x53,0xee,0xd7, +0xce,0x86,0x57,0xad,0x55,0xb2,0xc6,0x05,0x86,0xde,0x80,0xf9,0xde,0x42,0x61,0xb8, +0xdf,0x19,0xef,0xdb,0xb8,0x96,0xcc,0xa5,0xdd,0x2c,0x57,0x9d,0x9c,0xf2,0x6f,0x3d, +0xa9,0x65,0xde,0xe3,0x5a,0xd1,0xd3,0x64,0xee,0xaf,0x4c,0xd7,0x03,0xce,0x5b,0x00, +0x06,0x20,0x5f,0x64,0x67,0xc5,0x2e,0xc2,0x22,0xa5,0xe8,0x57,0x60,0x6b,0x42,0xf2, +0x90,0x18,0xb2,0xff,0xa8,0x63,0xac,0x4f,0xe2,0xec,0xe1,0x52,0xaa,0xea,0x2d,0x7f, +0x41,0x1d,0x41,0xc4,0x2a,0x63,0x6f,0x26,0x35,0x4d,0xab,0xd5,0x9b,0x53,0x77,0x39, +0x7c,0x8f,0x4e,0xa1,0x69,0x67,0xd0,0x01,0xc9,0xbc,0x29,0x1c,0x62,0xde,0x1e,0xa2, +0x46,0x81,0x9a,0x66,0x7a,0xb5,0xab,0x90,0x63,0xb5,0x8a,0x51,0x26,0x7b,0x72,0xe0, +0x8e,0xaa,0x9e,0x79,0xf8,0x41,0x8b,0x83,0xcf,0x48,0x66,0xf1,0xa8,0xf8,0x53,0x0e, +0x69,0x42,0xbf,0x43,0xf1,0x73,0x2f,0x67,0xa1,0x63,0x69,0x22,0x08,0x23,0xed,0x75, +0xe0,0x72,0x59,0x37,0x20,0x42,0xc9,0x8f,0x6f,0x4a,0x81,0x64,0xb0,0x6d,0x48,0x15, +0x19,0xa7,0xf9,0x67,0x1e,0xda,0x28,0x8d,0xbf,0xb5,0x6a,0xdc,0x68,0x59,0x34,0x34, +0x68,0x0d,0x1f,0x03,0x69,0xa2,0xa1,0x89,0x79,0xe6,0xe2,0x57,0x5f,0x9b,0x16,0xce, +0x42,0x7b,0x0f,0x32,0x1c,0x85,0x05,0x00,0x23,0x7b,0x53,0xb0,0x66,0xe7,0x72,0x6a, +0xb9,0x82,0xc5,0x34,0x2a,0x66,0x0a,0x28,0xb9,0x4f,0x7e,0xb9,0x87,0xda,0x54,0x64, +0xe1,0x48,0xfa,0xa7,0xb6,0x21,0xbe,0xf3,0xbb,0xc5,0xc7,0x6e,0x12,0xc1,0xee,0x7c, +0x68,0xd5,0xf3,0x78,0x28,0xcc,0x7a,0xf2,0x6f,0x4b,0xa4,0x7a,0xba,0xee,0x79,0xf9, +0x66,0xa1,0x3a,0x6a,0x3b,0x51,0x73,0x83,0x3f,0xc7,0xce,0x44,0xba,0x64,0x5d,0x71, +0x60,0x4b,0x73,0xd8,0x1d,0xed,0x73,0x68,0x6a,0xd0,0xfc,0x8e,0x57,0xd2,0x5d,0x8b, +0xc9,0x81,0xfd,0xf6,0x97,0x15,0x2c,0xdf,0xe1,0x5d,0x14,0x87,0x64,0x31,0xf4,0xb4, +0x01,0x92,0x0e,0x6b,0x88,0x73,0xd5,0x5f,0x56,0x51,0x0d,0x86,0x11,0x4d,0xfd,0x89, +0x49,0xa3,0x70,0xee,0xb6,0xc0,0xd5,0xec,0xf5,0xff,0xcb,0x47,0xf4,0xdf,0x8d,0xb2, +0xed,0x12,0x4a,0x1d,0x5a,0x57,0x75,0xd3,0x1e,0x5d,0xe3,0xb3,0x18,0x7c,0x3a,0xc6, +0xcb,0x1b,0xce,0xc6,0x91,0x58,0xab,0x82,0x95,0x31,0xbc,0xfa,0xb4,0x80,0xf7,0x32, +0x8f,0xe8,0x5a,0x3e,0x96,0x59,0xf5,0x82,0xd8,0x4a,0x82,0x66,0x77,0xa9,0x17,0xf6, +0x49,0x72,0x9f,0xc4,0x60,0xb7,0x6d,0x0e,0x77,0x8b,0x33,0x97,0x19,0xd0,0x35,0xf5, +0x48,0x53,0x09,0x2a,0xd0,0x3d,0xcd,0x1b,0x5e,0xa6,0xe6,0xab,0x2e,0xca,0xd4,0x8c, +0x80,0xf8,0xbe,0x7f,0x00,0x5d,0x2e,0x56,0x6e,0x72,0xc4,0x9b,0x93,0x1c,0xc7,0xb1, +0xc8,0xb6,0x2e,0x86,0xb5,0x34,0x1e,0xc7,0x09,0x79,0x61,0xcf,0x41,0xd2,0x59,0xa1, +0xa8,0xbe,0xbf,0x7e,0x8c,0x8e,0x62,0x96,0xff,0x81,0xaf,0x53,0x54,0x77,0x1c,0xea, +0xd9,0x77,0x76,0xba,0x18,0xb4,0x60,0xc7,0xc7,0xc4,0xe7,0xa9,0x19,0xfa,0x7c,0x78, +0xaf,0xb3,0xd0,0xa5,0xd1,0x78,0xa9,0x86,0x1c,0x83,0x79,0xf2,0xac,0x88,0xb5,0xd0, +0x8e,0xe2,0x6a,0xa3,0x98,0x06,0x0d,0x02,0x6f,0xdd,0xbd,0xf8,0xae,0x20,0xe3,0xab, +0x8e,0x53,0xfd,0x7d,0x62,0x91,0x6a,0x50,0x11,0x43,0x30,0x1e,0x20,0xd5,0x11,0x3b, +0xaf,0xb2,0xcb,0x35,0xed,0x72,0xc2,0x09,0x75,0xfe,0x74,0xa2,0x46,0x83,0x00,0x88, +0x05,0x40,0xf8,0x23,0x12,0x52,0x43,0x50,0xaf,0xd1,0x8d,0xa2,0x0a,0xeb,0x3d,0x3f, +0x03,0xf9,0x13,0xe4,0x36,0xe1,0x46,0x1f,0xae,0x50,0x86,0x1a,0xf6,0xe5,0x07,0x2b, +0xb0,0x26,0x0d,0xf5,0xb7,0xe2,0x4f,0x0a,0x2f,0x93,0x8f,0x0e,0x77,0x87,0x62,0x60, +0xb5,0x8c,0x9d,0xb8,0xfe,0xb2,0x07,0x0b,0x48,0x65,0x3a,0xb3,0x84,0x8e,0x5a,0xf2, +0x83,0x2b,0x50,0xd2,0xf7,0xc7,0xc4,0x00,0xbd,0xa1,0x88,0x19,0xd9,0x62,0xdc,0x30, +0xfc,0xc7,0x50,0x11,0x19,0xa3,0x87,0x56,0xc8,0x88,0xfc,0xec,0xa4,0xa0,0xc5,0x67, +0x27,0x19,0x9a,0x77,0xfa,0xb9,0x49,0x9d,0x6a,0xcb,0xf5,0x27,0x82,0x6d,0x26,0x8b, +0x08,0x7a,0xce,0x97,0x34,0xbc,0x1f,0xb7,0x2e,0xed,0x3b,0x05,0xf9,0x7e,0x96,0x79, +0x34,0x87,0x26,0x8a,0x42,0x81,0x7f,0xea,0x05,0x8a,0x85,0x16,0xac,0x99,0x8f,0x69, +0x39,0xc6,0xd2,0x6d,0x2d,0xa2,0x22,0xc5,0xb8,0x4a,0x7a,0x66,0xf0,0xd9,0xa6,0x6a, +0x4a,0x91,0xf9,0xf0,0x3f,0xcf,0xbe,0xb9,0x31,0x4b,0x04,0x03,0x28,0xdb,0x2a,0x68, +0xb1,0xc4,0xd1,0xef,0x39,0x9a,0xde,0xc5,0x38,0xc7,0x86,0x4f,0x81,0xe2,0x00,0x4a, +0xfb,0x0a,0x47,0x38,0xe9,0xc2,0x68,0x68,0xa5,0xc3,0xaa,0x7e,0x46,0xe8,0x5a,0xbc, +0x1d,0xc0,0xd2,0x0e,0x1e,0xa2,0x1c,0x98,0x6b,0x8f,0xc8,0x5a,0xd0,0xef,0xe3,0x6f, +0x2b,0x0f,0x81,0x4e,0x9f,0xcf,0x32,0x0d,0xaf,0xca,0xf7,0x66,0x8a,0xea,0x39,0x5b, +0x28,0xce,0xd0,0x3f,0xdf,0xa2,0x79,0x16,0x4d,0x38,0x4c,0x7e,0x52,0xe3,0x42,0x4b, +0x27,0x23,0xfc,0x82,0x81,0x3f,0x0b,0x93,0x5c,0x7f,0xe8,0x55,0xf0,0x7d,0x34,0xaf, +0xce,0xd5,0x28,0x12,0x6b,0x98,0x42,0x9a,0x98,0x70,0x2c,0x47,0xd6,0xb1,0xe5,0xce, +0x66,0x19,0xfd,0xd2,0xdf,0xa3,0x20,0xd9,0x8e,0xc3,0xe7,0xe0,0x1f,0x96,0x77,0x1c, +0xd3,0x3c,0x16,0x75,0x19,0x4e,0xa8,0x40,0xd9,0x0e,0x83,0x9b,0x15,0x72,0x36,0xf0, +0x02,0xd9,0x19,0xb5,0x0f,0xc5,0x3e,0x11,0xe2,0x59,0x57,0xd0,0xaa,0x11,0xd4,0x62, +0xdc,0x0a,0x57,0x91,0xa9,0xe8,0xec,0x76,0x6f,0xf9,0x7c,0xb0,0xe5,0x51,0x77,0xc3, +0x5d,0x84,0x18,0xb5,0x98,0xe9,0x27,0xa5,0x0d,0xb2,0x8b,0xd4,0x9d,0x73,0x50,0xf7, +0x4c,0xf3,0xf7,0xd5,0x04,0x3c,0x1d,0xb1,0xff,0xda,0xf1,0xed,0x3f,0xbf,0x82,0xe8, +0xdb,0xfd,0xde,0x9d,0x4c,0xfc,0x60,0x86,0x87,0x89,0x08,0x5d,0xf8,0x55,0xae,0xe9, +0x5d,0x1c,0x69,0xeb,0xd4,0x88,0xfe,0xf7,0x78,0x74,0x1a,0xdc,0x8a,0x9c,0x1f,0x74, +0xc7,0x95,0x81,0xa2,0x30,0xf8,0x31,0x93,0x6c,0x5d,0xcf,0x1f,0x10,0x55,0x3d,0xfb, +0x46,0xdf,0xd7,0xb8,0x54,0xea,0x72,0x54,0xda,0xdb,0x87,0x40,0x14,0xca,0x5e,0x30, +0x82,0x91,0xc6,0x44,0x3d,0x14,0x09,0xce,0x68,0xfc,0xd1,0x1f,0xe2,0x9c,0xfe,0x24, +0xd2,0x3c,0x42,0xa0,0xe1,0x3c,0x00,0x42,0x9a,0x7e,0x81,0x03,0x7f,0xf3,0x18,0xb5, +0xc6,0x93,0xbe,0xc0,0x5b,0x41,0x9b,0x94,0x86,0x4d,0x1f,0x65,0xdc,0x28,0x57,0x24, +0x5a,0xfc,0x79,0x35,0x1a,0x00,0xaa,0x08,0xd1,0x9e,0x97,0x79,0x03,0xbe,0xa3,0xa8, +0xdc,0x33,0x78,0x0c,0xe9,0x6f,0x28,0xce,0xc3,0x4d,0x69,0x5f,0xca,0x5f,0xb9,0xd0, +0x17,0x07,0xa8,0x09,0x9c,0x3a,0x30,0x21,0x47,0x92,0x0d,0x0b,0x21,0xec,0x58,0x83, +0x86,0xd1,0xd8,0xaf,0x6d,0x6d,0x6c,0xe3,0x61,0x44,0xaa,0xaf,0x63,0xb7,0xa1,0x05, +0x20,0xfc,0xa5,0x73,0x4b,0x31,0x36,0xb3,0x40,0x43,0xe2,0xce,0x5e,0x21,0xe4,0x64, +0x31,0x50,0x92,0x47,0x14,0x6c,0xf0,0x12,0x28,0x20,0xe8,0xe6,0x70,0x94,0x11,0x70, +0xa6,0xda,0x68,0x26,0x71,0x01,0xa7,0x0a,0x45,0xb7,0xe0,0xa4,0x0f,0x9a,0xfb,0xd2, +0xef,0xf9,0xd3,0x75,0x33,0x89,0x91,0xfc,0xd5,0xb7,0xa9,0xe7,0x52,0xdf,0xe5,0x2e, +0x55,0x46,0x09,0x11,0x91,0x65,0xe5,0x6f,0xa1,0xb3,0x75,0xe7,0xdf,0x6f,0x1a,0x8d, +0xe1,0x3b,0x3a,0x96,0x1b,0x88,0x2a,0x19,0x72,0x47,0x90,0x34,0x59,0xc8,0x2a,0x09, +0xdc,0x65,0x72,0x01,0x99,0xef,0x4c,0x90,0xea,0x08,0x0a,0xb8,0x17,0xac,0x2a,0x76, +0x19,0x1a,0xb8,0xeb,0x88,0x97,0x73,0x96,0x37,0x47,0x83,0x08,0xdc,0x04,0xcf,0x47, +0x87,0x15,0xeb,0x1f,0xcc,0x26,0x21,0xd1,0x27,0x04,0xa2,0x7f,0x78,0x70,0x3c,0x4f, +0xab,0x93,0xc9,0x08,0xf3,0x44,0x04,0x1b,0x6c,0xcd,0x52,0x91,0x56,0x91,0x14,0xba, +0x57,0x89,0xb1,0x7b,0xba,0x41,0x0c,0xd9,0xa0,0x29,0x1f,0x9e,0xd9,0xb9,0xf7,0x2b, +0x71,0x4f,0x03,0x0c,0x11,0x23,0x51,0x9a,0x4e,0xc3,0xc1,0x69,0x58,0x6d,0xb1,0x2a, +0xff,0xa4,0x2c,0x27,0x4d,0x25,0xe2,0x9b,0x67,0x32,0x04,0x1f,0x9b,0x60,0xb3,0x89, +0xd3,0xaf,0x2c,0x90,0x91,0xcf,0xb0,0xdf,0x66,0x28,0x90,0x64,0x34,0x6b,0x64,0xf2, +0x9e,0x1f,0xa5,0xeb,0xa0,0x21,0x24,0x4b,0xee,0xf7,0x1c,0x73,0x55,0x1d,0xfe,0x05, +0xa4,0x2c,0xdf,0x4d,0xc7,0x72,0x89,0xc3,0x13,0x37,0x59,0xc3,0x12,0x52,0x35,0x7f, +0x22,0x1e,0xad,0x84,0x3c,0x50,0x08,0xcb,0x2b,0x42,0x0d,0xc6,0x89,0xd2,0x6c,0x33, +0xae,0x55,0x04,0x80,0x30,0x76,0x94,0xe1,0xeb,0x08,0xac,0xf6,0x8d,0xa9,0x4d,0xb6, +0xfe,0x1a,0x15,0xca,0x08,0x45,0xf1,0xcf,0x4d,0x8e,0xca,0x96,0x07,0x8a,0x1c,0xd8, +0x07,0xe9,0xce,0x81,0x8d,0x16,0xee,0xaf,0x7f,0xab,0x9f,0xe4,0x05,0x8b,0xf9,0xae, +0x00,0x56,0x0d,0x91,0x91,0x75,0x5d,0xcb,0x9f,0xe2,0x84,0x6c,0x56,0xd6,0x7b,0x4a, +0x89,0x1e,0x2d,0x29,0xed,0x26,0x1e,0x3d,0x5b,0x33,0x01,0x9d,0xd9,0xf9,0x21,0x1a, +0xa8,0xb9,0x1b,0x74,0xa0,0x7b,0x20,0x91,0xce,0x42,0xcc,0xa7,0x92,0x1d,0x2f,0x88, +0xae,0xc9,0xfa,0x7e,0xc8,0xee,0x29,0x81,0x4f,0x4a,0xaa,0x5e,0x7c,0xf7,0xcf,0x24, +0xf1,0x17,0x49,0x1c,0xbf,0xd9,0xe9,0xdf,0xf9,0x14,0x0f,0x55,0x69,0xb6,0x26,0x68, +0x3a,0x97,0x46,0x3c,0xc1,0x52,0x06,0x6c,0x62,0x70,0xee,0x12,0x87,0xa8,0xcd,0x3a, +0x0f,0xc9,0xb6,0x9c,0x23,0x7f,0x9e,0x65,0xc6,0x1f,0xc8,0x9e,0x13,0x70,0x43,0x2b, +0x28,0x1d,0x78,0x56,0x4f,0x98,0xea,0xd4,0x15,0x03,0xaf,0xff,0x13,0x71,0xd8,0xc6, +0x89,0x8b,0x47,0x7d,0x4e,0xcb,0x98,0x5a,0x1e,0x50,0xcd,0xc6,0x10,0x3b,0x5d,0xf1, +0x3e,0x54,0x64,0x83,0x57,0x53,0x4e,0x0a,0xaf,0xf1,0xdf,0xa2,0x1a,0xc2,0xe8,0xaf, +0x5d,0x8d,0x74,0x70,0xea,0xb1,0xc0,0xda,0xf7,0x8e,0x07,0xb2,0x1b,0x2b,0x70,0x81, +0x05,0xa2,0xb1,0x65,0xcc,0xb9,0x68,0xc6,0x63,0xd2,0xd9,0x45,0x67,0x8e,0x11,0x78, +0x04,0x8e,0x11,0xff,0x14,0x5f,0x60,0x71,0x62,0xd3,0xf1,0x2b,0xe6,0x5d,0x18,0x5f, +0xc6,0xc5,0x61,0x35,0x1b,0xe6,0x08,0xe6,0x18,0xe3,0xc8,0x98,0xa9,0xff,0xdc,0x30, +0xf8,0x28,0x5c,0x29,0xb4,0x08,0xb8,0xef,0xed,0xa0,0xe0,0x52,0x64,0x57,0x1f,0x44, +0x27,0x59,0xed,0x84,0x63,0xa9,0x49,0x9c,0x6a,0xcb,0xd7,0x11,0x2d,0x69,0x63,0x62, +0x26,0xc6,0xe3,0x66,0x36,0x26,0xcd,0x2c,0x64,0xa2,0x41,0x8d,0x3e,0xbd,0x9b,0x48, +0xad,0xf5,0x5a,0x06,0xe1,0xe7,0xca,0xd5,0x7f,0xef,0x72,0xbb,0x6c,0xaa,0x9d,0xb3, +0x90,0x74,0xf4,0x26,0x0e,0x04,0xd9,0xfa,0x64,0x6d,0x7c,0xea,0x5c,0x19,0x0b,0x69, +0x78,0x99,0x33,0xfe,0xa0,0xea,0x8b,0xd5,0x31,0xa6,0x75,0x57,0x51,0xa8,0x86,0x9f, +0xfb,0x47,0x24,0xff,0x8b,0xad,0xbc,0x3d,0x05,0x1b,0x85,0xfa,0x52,0x6d,0x3c,0xa8, +0x0a,0x21,0xe2,0xbd,0x9a,0x21,0xcd,0x88,0xc3,0x47,0xd1,0x8c,0x9e,0x13,0x4c,0xb8, +0x83,0xcc,0xf8,0x6e,0x3f,0x02,0x40,0xe8,0x4f,0x12,0xd8,0x0d,0xfc,0xe4,0xef,0x79, +0x65,0xca,0xb1,0x49,0x98,0xe6,0xf7,0xf8,0xe0,0x31,0xcd,0xa3,0x0e,0xe1,0x15,0x5d, +0x6e,0x0c,0x4b,0x2d,0xfd,0xeb,0x48,0xcb,0x37,0x6c,0xff,0x62,0x26,0x1b,0x1c,0xe9, +0xa5,0x9d,0x16,0xc1,0x32,0x30,0x17,0x8a,0xbc,0xe1,0xa6,0x02,0x9f,0xb4,0x04,0xf0, +0xd1,0x82,0x84,0x07,0x94,0xae,0x6c,0x5a,0x4a,0x9c,0x18,0x92,0x16,0xf5,0x9c,0xc1, +0x05,0xef,0xa6,0x47,0x92,0xb4,0x74,0xdc,0x43,0xd6,0x8f,0x17,0x20,0x5d,0x9a,0x3a, +0x38,0x6e,0x19,0xb0,0x19,0xae,0xc4,0xbb,0x40,0xac,0xab,0x8f,0x1e,0xb7,0x30,0xd9, +0x00,0xe0,0x9c,0x42,0x32,0x21,0xc0,0x9d,0xc5,0x01,0xce,0x56,0xae,0xb6,0xac,0x4f, +0x9f,0xd7,0x40,0x44,0x6b,0xbf,0x46,0x01,0x6a,0x71,0x07,0xd1,0xd6,0x0a,0xb1,0x47, +0xf8,0xb1,0xe3,0x82,0x5f,0xde,0x27,0xdc,0x8c,0x97,0x7d,0x67,0x5a,0xfb,0xaa,0x70, +0x06,0x48,0x6d,0x96,0x0a,0xf6,0xf1,0xa3,0xc5,0x67,0x9d,0x53,0xb6,0xb5,0x8b,0x0e, +0x5a,0x54,0x8e,0xec,0x0f,0x84,0x9a,0x31,0xd9,0x4e,0x8c,0x1e,0xa8,0x57,0xd5,0x1e, +0x29,0xa7,0x96,0x74,0xb0,0x44,0x87,0x5c,0x7d,0xa4,0xa8,0x1e,0x96,0xbd,0x90,0x83, +0x5f,0x25,0x67,0x1a,0xb6,0xb4,0x7f,0x3b,0xdf,0xd6,0x13,0x8b,0x9f,0x33,0x47,0xf9, +0x12,0x95,0x4a,0x70,0x48,0xed,0xc7,0x53,0xc2,0x46,0x85,0x0f,0x53,0x54,0xd2,0xa8, +0x12,0x63,0x26,0x8a,0x3d,0xfe,0xf4,0x1a,0x6f,0x7d,0xf4,0x83,0x7a,0x26,0xce,0xc0, +0xa3,0x30,0xbe,0xd7,0x9c,0xa6,0x74,0xcb,0xce,0x5c,0xc0,0xd7,0xf2,0x5b,0xdc,0x67, +0x59,0x2a,0xeb,0x14,0x1f,0xb8,0x7d,0x18,0xaf,0x73,0x16,0x9d,0x15,0xcf,0xcf,0xeb, +0xef,0x30,0x4d,0x5b,0xb6,0x41,0x57,0x08,0x6b,0x52,0xb7,0x3f,0xcc,0x74,0xe5,0x31, +0x38,0x42,0x40,0xdc,0x3b,0xfb,0xce,0xc8,0x4f,0x0d,0x81,0x57,0x60,0x0c,0x52,0x3f, +0x69,0x30,0xd9,0x7b,0x22,0x4f,0x41,0xd8,0xd5,0x0c,0xc2,0xce,0x39,0x70,0xd2,0x5d, +0xa1,0x7b,0x37,0xf8,0xb1,0x60,0x49,0xc5,0xc6,0x3a,0xf7,0xec,0xd3,0x1b,0xc9,0xad, +0x87,0x0e,0x31,0x52,0x53,0x21,0x8e,0xb9,0x64,0x90,0xe7,0x33,0x30,0xe0,0xf4,0x3b, +0xa1,0x1f,0x99,0xcc,0xfb,0xb5,0xaf,0x0e,0x20,0x9b,0x10,0x65,0x43,0xc9,0x88,0x48, +0xe1,0x1e,0xb0,0xbc,0x09,0x88,0xb4,0x0b,0x81,0x99,0xe6,0x5c,0x7d,0xba,0x0d,0xc3, +0x0f,0xbf,0x39,0xc7,0xb0,0x16,0x7e,0x1e,0x1b,0xd9,0xc4,0x54,0x73,0x99,0x42,0xd3, +0x0e,0xed,0xde,0xb3,0x11,0x24,0x62,0xe3,0xc3,0x4f,0x83,0xad,0xaf,0xc8,0x78,0xe8, +0x29,0xa7,0xca,0x95,0xbd,0xa8,0x42,0x5f,0x14,0x53,0x31,0xdf,0xd4,0x65,0x6c,0xd8, +0x0a,0xe3,0xd3,0x47,0x1f,0xcb,0xe2,0x5e,0xc6,0xcf,0xc4,0xde,0x5d,0xec,0x92,0x7a, +0xbc,0x66,0x7b,0x8f,0x19,0x18,0xe0,0x4f,0xa0,0x63,0xcb,0x19,0x31,0x30,0x35,0x30, +0xe0,0x5a,0xcc,0x62,0xa5,0xd4,0x1d,0x79,0xd2,0x07,0x66,0x13,0x7a,0x29,0x82,0x50, +0xe8,0x0a,0x45,0xae,0x29,0x9c,0x17,0x13,0x2a,0x0f,0x72,0x9c,0x86,0xbf,0x00,0x45, +0xb4,0x4f,0x35,0xd8,0x04,0x39,0xa1,0xfa,0xc3,0xcf,0x6e,0x1e,0x68,0x53,0x63,0x6b, +0x2b,0x82,0x7b,0xb3,0x8a,0x63,0xac,0x13,0xa8,0xb1,0xad,0x6a,0x7b,0x91,0x48,0xe7, +0x8d,0x2f,0xab,0x5f,0xe0,0x22,0x63,0x82,0xb8,0x4f,0x74,0x9b,0xcb,0x92,0xc4,0xf4, +0xb2,0xe5,0x20,0x84,0x30,0x30,0xac,0x4f,0x1c,0x0d,0xf2,0x68,0x73,0x01,0x56,0xbf, +0x49,0x40,0x74,0x16,0xb0,0x93,0x45,0x0f,0xc4,0xf0,0xe2,0xb2,0x12,0x24,0x94,0x05, +0xbb,0x47,0x85,0xf7,0x83,0x5c,0xc6,0x01,0x0d,0xa2,0xcf,0x87,0x98,0x23,0xcd,0x2d, +0xa7,0x1e,0xd4,0x4e,0xb7,0xd1,0x01,0x57,0x44,0x3d,0xcb,0x9c,0x1a,0x17,0xef,0x45, +0xb1,0x2b,0xb4,0x40,0x69,0x13,0x6c,0x1f,0x15,0x54,0x2c,0xec,0xd5,0x38,0x4f,0x83, +0xfe,0x68,0x17,0x97,0x4c,0x36,0xe1,0xab,0x65,0x86,0xd8,0xf5,0x7b,0x55,0x25,0x87, +0xda,0x54,0x8d,0xc1,0x37,0xe7,0x7e,0x8f,0x33,0xea,0xc4,0xc1,0xfa,0x76,0xe2,0xbe, +0xa5,0x87,0x78,0x1c,0x52,0x88,0x60,0x09,0xe3,0x15,0x22,0xf4,0xf3,0x77,0xf9,0x7a, +0x09,0x6a,0xc1,0x4b,0x3e,0xb8,0x74,0x34,0x69,0xd9,0xae,0x4c,0x72,0x3a,0x27,0xe7, +0xb8,0x09,0x48,0xe4,0xc6,0x22,0x93,0x50,0x1a,0x59,0x09,0x4f,0xfd,0xf2,0x5d,0x88, +0xdf,0x1a,0x84,0xcd,0xa0,0x78,0xbf,0x0c,0xcc,0x18,0xd8,0x5b,0x9b,0x73,0x2f,0x88, +0x24,0x78,0xe0,0x19,0xf9,0xd0,0x40,0xbd,0xef,0x1b,0xab,0x01,0x12,0x1f,0xb5,0x20, +0x7b,0x5e,0x46,0x10,0x91,0x27,0x52,0x2f,0x97,0xfd,0xd6,0xed,0x72,0x83,0xce,0x86, +0xa6,0x7f,0xcf,0xba,0xd0,0x0c,0x08,0x55,0x80,0x2e,0x21,0x03,0x7b,0x7d,0xc2,0x49, +0x57,0x05,0xf9,0xab,0x51,0x2f,0x04,0x1a,0x98,0x83,0xd3,0x12,0xf2,0x1e,0xe4,0x5c, +0x38,0x20,0xd9,0xbf,0x44,0x92,0xa4,0xc6,0x99,0x1e,0x20,0xfd,0x04,0x80,0x38,0x5b, +0x67,0xf6,0x1b,0xaa,0xe3,0x1d,0xe4,0x06,0x37,0xc0,0xff,0xd0,0xa9,0x61,0xa3,0x72, +0x44,0x34,0xd3,0x94,0x94,0x93,0x29,0xf5,0x76,0x55,0x8c,0xc8,0xb4,0x5e,0x37,0x2f, +0x82,0x51,0xf4,0xfc,0x65,0xb1,0x6e,0x33,0xc2,0x82,0xa9,0xd8,0x21,0x61,0xb8,0x2c, +0xbd,0xc1,0x29,0x07,0xa8,0xa5,0x81,0xac,0x30,0x4a,0x79,0xe3,0x97,0x4e,0x4c,0x3d, +0x35,0xc4,0xf0,0x35,0x02,0x5f,0xb0,0xde,0xff,0x86,0x08,0x9a,0x8a,0x1f,0xac,0x98, +0xbc,0x83,0x37,0x52,0x11,0x5f,0x27,0x2c,0xc5,0xe1,0x78,0x8d,0xb6,0x46,0xca,0x04, +0x88,0x5a,0x61,0xc3,0xc9,0xda,0xa2,0x85,0xb5,0xc6,0xba,0x14,0xee,0x67,0xc5,0x82, +0x81,0x17,0x9c,0xd3,0x85,0xa7,0x3f,0x11,0x38,0x1c,0xe8,0x8d,0xd1,0x4d,0x39,0x81, +0x83,0x93,0x8a,0x87,0x1a,0x4a,0x12,0xd9,0xef,0xda,0x7b,0x1f,0x68,0x47,0x92,0x84, +0x0c,0xea,0x6a,0x0e,0x47,0xeb,0x42,0xfa,0x15,0xd2,0xc4,0x17,0xdd,0x8a,0x83,0x6d, +0x52,0x98,0x3c,0xf0,0xaf,0x2a,0x8b,0x5b,0x4c,0x6c,0x22,0x5d,0xb6,0xdb,0x1c,0x32, +0x71,0xda,0x6d,0xc1,0x9b,0x2b,0x1e,0x5d,0x7a,0xdb,0x81,0xc4,0x24,0x87,0x4c,0x25, +0x08,0x1c,0x82,0x4c,0x3c,0xee,0x72,0xee,0x38,0xf1,0x32,0x11,0x0b,0xe7,0xef,0xda, +0xf2,0x96,0xf9,0xbc,0xb3,0x00,0x82,0x96,0x4b,0xb6,0xf2,0x73,0xd8,0xfc,0x90,0xa3, +0x85,0xcc,0x6b,0x1f,0x32,0x03,0x28,0x6b,0xc8,0x1d,0xf2,0xeb,0x90,0xd1,0xeb,0x05, +0x02,0xed,0xfc,0xbd,0x99,0xb5,0x7b,0xf9,0x31,0x50,0x6b,0x0d,0xec,0xd1,0x8f,0x27, +0xf1,0x8e,0x64,0xc7,0x5e,0xba,0x25,0xe5,0x57,0x44,0x8e,0x44,0xd8,0xff,0x96,0xce, +0xc2,0x81,0xae,0x70,0x90,0x17,0x84,0x3c,0x96,0xbd,0xe4,0xb2,0x3d,0xc0,0x58,0x7c, +0x97,0x96,0xe5,0x6f,0x19,0xff,0x8d,0x2c,0x1f,0xc0,0xb3,0x8b,0x1d,0xa3,0x97,0xce, +0x42,0x33,0x3c,0xd7,0xa1,0x18,0x02,0x37,0xf8,0xd7,0xba,0xb5,0x28,0x53,0x9b,0x40, +0xa3,0x24,0xf5,0x63,0xc1,0x49,0xd3,0xda,0x60,0xae,0x0f,0x19,0x7e,0xf4,0x14,0xf6, +0xba,0x68,0x3f,0x28,0xca,0xae,0xc3,0x10,0xaf,0x44,0xfc,0xf6,0x77,0x55,0xde,0x21, +0x0a,0x6b,0xf7,0xc0,0x49,0x3b,0x75,0x61,0x32,0xf5,0x0a,0x18,0xf6,0xd6,0xc0,0x9d, +0x52,0xcb,0x6b,0x89,0x3a,0xd5,0x6a,0x53,0xed,0xd5,0xfd,0xf7,0xf7,0x17,0xb7,0x88, +0x88,0x38,0x39,0x9a,0xb9,0xdb,0x7e,0xbe,0x8d,0xc3,0xa7,0xac,0xa8,0xb9,0x77,0x21, +0x88,0x92,0x56,0xba,0xdc,0x16,0xae,0x4b,0x59,0xf9,0xbf,0xd8,0x86,0xff,0x32,0xea, +0x1f,0xdb,0x37,0xfd,0x8f,0xd7,0xc4,0x4d,0xfc,0x95,0xee,0xac,0x59,0x65,0xf2,0xe8, +0xa2,0x90,0xba,0x6c,0x89,0x14,0xe4,0x8c,0x92,0xd2,0x17,0xb2,0x0c,0xf4,0x5c,0x39, +0x10,0x33,0x4d,0x4b,0xad,0x83,0x2f,0xcb,0xcb,0x7d,0xf6,0xee,0x7e,0x5e,0x6e,0xb4, +0xed,0xdd,0x90,0x66,0x44,0xbd,0xf8,0xee,0x93,0x4c,0xfe,0xfe,0x7f,0x6c,0x34,0x0c, +0x13,0x18,0x3e,0xd0,0x81,0x24,0x64,0x18,0x96,0xdd,0xf7,0xef,0xfe,0x5d,0x67,0x66, +0x4e,0xee,0xb4,0x3d,0x5e,0x40,0x01,0xc3,0x33,0x6e,0xff,0xff,0xf7,0xe6,0xdb,0x02, +0x7f,0x44,0x63,0x17,0x72,0xd6,0xbc,0x53,0x2a,0xc6,0x9e,0x96,0x73,0xa0,0x28,0xf2, +0x83,0xd5,0x08,0xe7,0xf5,0x8e,0x22,0xa3,0x27,0xbe,0xb8,0x24,0xe5,0xb6,0x61,0x1f, +0x01,0x89,0xff,0x9e,0xfb,0xb4,0x13,0xe1,0x9a,0x2e,0xcb,0x7f,0x67,0x1d,0x57,0x62, +0xec,0x0c,0x3f,0xe4,0x79,0x33,0x43,0x21,0x0b,0xe0,0x2c,0x8a,0x0c,0x1e,0x29,0xbc, +0x1a,0x46,0xd8,0x37,0x05,0xa5,0x68,0x8f,0xb7,0x27,0x37,0x1a,0x33,0x60,0xbe,0xa0, +0x0b,0x0a,0xb6,0x68,0xfa,0xf4,0xf3,0x98,0x47,0x99,0xb9,0x50,0xd1,0x61,0x0a,0x55, +0x00,0x0e,0x3a,0xb6,0xee,0xab,0xa8,0x1a,0x17,0xdb,0xa8,0x1f,0xb3,0x62,0x29,0x15, +0x8c,0x0a,0x65,0xc6,0x88,0x2d,0xf5,0xf4,0x16,0x25,0x96,0x17,0x90,0x68,0x5d,0x09, +0xf1,0x64,0xfc,0x3e,0x9d,0x3e,0xe9,0xac,0x0d,0x11,0x3d,0x72,0xed,0xb4,0xad,0x1e, +0xdd,0x6d,0xdf,0xef,0xc1,0x84,0x40,0x28,0x9f,0x96,0x0a,0x4f,0x28,0xe0,0x61,0x1c, +0x8b,0x62,0x2f,0x7e,0xfe,0x8c,0xbf,0x5b,0x16,0xb5,0xfb,0xef,0x5e,0x9f,0xbf,0x7b, +0x7a,0x80,0xdd,0x8f,0x99,0x84,0x4b,0x4e,0xfb,0xc6,0x1f,0xdd,0xd8,0xb0,0x08,0xb6, +0xa9,0x0a,0x93,0x3f,0x26,0xad,0x3b,0x83,0x76,0xf3,0xf8,0xbc,0x06,0x2d,0xfe,0xba, +0x89,0x45,0x5b,0xa2,0x70,0x05,0x85,0x87,0x6f,0xb1,0x25,0x0f,0x6b,0x0e,0xcb,0x29, +0x6b,0x01,0xc1,0xb2,0x7b,0x8d,0xe8,0xc5,0xeb,0x2e,0xed,0x44,0xb2,0x63,0x82,0xbb, +0x09,0x47,0xcb,0x4e,0xe7,0x67,0x64,0x26,0xef,0xc2,0x20,0x59,0xac,0x6b,0xf9,0xc7, +0xd1,0x66,0xc4,0xbb,0x38,0x5c,0x2a,0x09,0x16,0x8f,0x71,0x20,0x69,0x7d,0x72,0x96, +0xc0,0x92,0x2b,0x03,0x5a,0x97,0xa7,0x23,0x0f,0x59,0x9e,0xd9,0xf3,0x7d,0x7e,0x71, +0xcb,0xa3,0xad,0x47,0x64,0xf4,0xb9,0xde,0x2a,0x41,0xf5,0xe7,0xba,0x30,0xae,0x62, +0x2d,0x8e,0x0d,0x64,0x73,0x73,0x9c,0xc2,0xd3,0xd2,0xd8,0x31,0xb1,0x17,0x3c,0x42, +0x2b,0x70,0x7f,0x75,0x06,0x9b,0x2a,0xe6,0x83,0xd7,0xf4,0x60,0x39,0x36,0xdc,0x9b, +0xde,0x29,0xe0,0xf0,0xda,0x44,0x4e,0xff,0x88,0x11,0xde,0x99,0x04,0x90,0x7d,0x11, +0x5f,0x19,0x54,0xd4,0xc6,0x32,0x79,0x65,0x94,0x8f,0xb5,0xe6,0x82,0x36,0x70,0x29, +0xa3,0x96,0xdb,0xb7,0x4c,0x9a,0x67,0x41,0x6a,0xf8,0x02,0x95,0x80,0x73,0x7e,0x91, +0x4b,0x78,0xbc,0x7f,0xee,0x97,0xe9,0x57,0x81,0xbb,0x96,0xac,0x78,0x78,0xf5,0x9a, +0xc7,0x02,0xf0,0x06,0xd2,0xfc,0xf2,0x38,0x95,0x79,0xe6,0x38,0x22,0x19,0x90,0x76, +0x49,0xc9,0x60,0x7c,0x62,0x2a,0x45,0x56,0x1f,0x1b,0xad,0x2f,0x2d,0x14,0xae,0xef, +0x2b,0xcf,0xf1,0xaa,0xd2,0x9e,0xb3,0xfb,0x6a,0x8f,0xc1,0xc5,0xb9,0x3a,0x58,0x37, +0xdb,0x9f,0x57,0x69,0xcd,0xc1,0xf2,0x92,0xc9,0x39,0x89,0xb9,0x45,0x11,0x30,0xdf, +0x8a,0x71,0x9c,0x53,0xc8,0x7c,0x66,0xc8,0x12,0xf2,0xde,0x04,0xda,0xf0,0xb3,0x37, +0x76,0x5a,0xd5,0xad,0x41,0xe3,0x68,0x0b,0x1f,0xff,0x17,0x24,0x41,0xc5,0x8b,0x22, +0x07,0x12,0xe9,0xc0,0x3f,0x9b,0xff,0x8b,0x89,0x73,0x20,0x79,0xe0,0x25,0x08,0x3b, +0xef,0xc4,0x83,0xf7,0x88,0xc0,0xcb,0xdd,0xc4,0xa3,0xd6,0xdb,0x75,0xa2,0x8c,0x68, +0xa6,0x75,0xd7,0x5c,0xa8,0xbd,0xe9,0x41,0x2f,0x67,0x78,0x26,0x3a,0xfa,0x1b,0xb3, +0x50,0x2d,0x49,0x8d,0xb6,0x74,0xdd,0x50,0xa2,0x64,0xbc,0x45,0xe7,0xde,0x89,0x0d, +0x09,0xe6,0x1b,0xa5,0x85,0x66,0x6c,0x73,0xf5,0x6e,0x94,0x51,0x26,0xf3,0xaa,0xa0, +0x84,0xcc,0x55,0x7f,0xa2,0x35,0x8f,0x1d,0xcb,0x62,0x2f,0x33,0x2d,0xa9,0x10,0x75, +0xa6,0x0f,0x28,0xeb,0xa1,0x08,0xcd,0x4f,0x41,0x16,0x82,0x66,0xd5,0xc1,0x41,0x21, +0xc5,0x7d,0xd6,0x6a,0x66,0xf7,0x39,0xa3,0x9f,0x4d,0x31,0xaa,0x66,0x1b,0x92,0xb1, +0x05,0x8f,0x7e,0xd3,0xd9,0x51,0xb9,0x11,0x30,0x48,0xec,0x95,0x55,0xe3,0x96,0x68, +0x64,0x85,0xd4,0x24,0x2e,0x6d,0xe0,0xb9,0x7a,0x37,0x0a,0xd5,0x4c,0xa5,0x54,0x1c, +0xec,0x0a,0x75,0x1e,0x9e,0xa7,0xc1,0xbe,0x08,0x90,0xe3,0xe5,0x5b,0x69,0x58,0xfb, +0xef,0x3b,0x90,0x07,0x78,0x1f,0x0d,0x9a,0x06,0xf9,0x48,0x27,0x79,0x15,0x88,0xe8, +0x01,0x86,0x4b,0x20,0xb9,0xc5,0x05,0x97,0xb1,0x34,0x65,0xc2,0xfc,0x30,0xa6,0x28, +0x4d,0x7b,0xf4,0x77,0xf5,0x1d,0x6a,0xd7,0x2d,0x45,0xac,0x0c,0x9f,0x8e,0x12,0x38, +0x4c,0xf2,0xf9,0xda,0x51,0x1b,0xfd,0x9a,0x29,0x10,0xbe,0x87,0x74,0x76,0x1b,0x29, +0xcd,0x70,0x58,0xfe,0xee,0x01,0xe0,0x81,0x6b,0x44,0xb9,0x7a,0xfc,0xe3,0x13,0x39, +0xcc,0x30,0xfd,0x72,0x74,0xde,0x6d,0x19,0xaf,0x37,0xfb,0x82,0xce,0x34,0xf9,0x60, +0xd8,0x19,0x25,0x75,0xd4,0xfc,0xe0,0xbd,0x06,0x44,0x74,0x0e,0xc9,0xeb,0x8f,0x33, +0xd8,0x9e,0x07,0x7e,0x71,0xdd,0x69,0x43,0xc6,0x91,0x04,0x4d,0x65,0xbc,0xe5,0x4e, +0xa4,0x94,0xc4,0xfc,0x61,0x2f,0x63,0xb8,0x82,0x7f,0x9a,0xc1,0x07,0xe2,0xbd,0x8d, +0xcf,0x67,0x79,0xc9,0x9b,0x6f,0x0f,0x82,0x87,0x2c,0x46,0xbf,0x50,0x0c,0x73,0x39, +0xd7,0xf7,0x67,0xc1,0x8b,0x1f,0xb4,0x5e,0x13,0x55,0xaf,0xd1,0x0d,0xfd,0xc8,0xf5, +0x8b,0x98,0xc3,0xa5,0x07,0x14,0x2e,0xb1,0x8c,0xb1,0xfc,0x1a,0xd6,0x78,0x1e,0xdc, +0x22,0x42,0x9d,0xc3,0xb2,0x36,0x40,0x10,0x62,0x5b,0xab,0x53,0x17,0x8d,0xc1,0x56, +0xd0,0x97,0xd5,0xe7,0xce,0x18,0x46,0x11,0x4b,0x6a,0x02,0x73,0xbc,0x02,0xf4,0x90, +0x42,0x2c,0xcf,0x65,0xd7,0x0c,0x08,0x48,0x06,0xbb,0x26,0x8e,0x62,0x72,0x50,0x36, +0xc4,0x7a,0x2e,0x58,0xaf,0xba,0x04,0x49,0xa7,0x72,0x06,0x0c,0x75,0xfb,0x76,0xf9, +0xc4,0x89,0x04,0x95,0xd7,0xce,0x49,0x3d,0x30,0x3c,0x5f,0x22,0xcf,0xd8,0x7d,0x61, +0x46,0xa8,0x4c,0x64,0x54,0x1c,0x5d,0xbf,0x25,0xb8,0x7f,0x62,0x01,0x00,0x71,0x35, +0xdb,0x0f,0x46,0xbc,0x5c,0x90,0x0e,0xf7,0xee,0x69,0x66,0x9d,0x03,0xf5,0x34,0x0a, +0x17,0xdf,0xb7,0x27,0x9a,0x62,0x20,0xd7,0x4e,0x76,0xf6,0x7e,0x08,0xd8,0x48,0xb4, +0x77,0x01,0x99,0xc8,0x1f,0xff,0xe7,0x1a,0xda,0x78,0xfc,0x28,0x3c,0x1e,0xe7,0x63, +0x0e,0x3e,0xee,0xb9,0x40,0xfe,0x6c,0xcc,0x84,0x6e,0x20,0x9f,0xc0,0xff,0xd9,0x14, +0xe1,0xbf,0x7f,0x43,0xda,0xf1,0x53,0xd1,0xff,0x20,0x37,0x1d,0xd2,0xb4,0x97,0x34, +0x83,0xb5,0x9d,0x90,0x4f,0x84,0x61,0xcb,0xb5,0x9e,0x06,0xdb,0x31,0xeb,0xc1,0xd5, +0xc2,0xa0,0x3a,0x96,0xe8,0x28,0x4f,0xce,0xe2,0x41,0x19,0x47,0x5d,0xc4,0x3a,0xe1, +0x89,0x0c,0x25,0x6a,0x0f,0xfe,0xae,0xce,0x42,0x4d,0x59,0x71,0xa3,0x6e,0x21,0xe0, +0xd4,0xbb,0xa2,0x41,0x13,0x3a,0xf8,0xea,0xd6,0xd0,0x1e,0x17,0x45,0xdb,0xa8,0x6f, +0x27,0x06,0xb3,0xb6,0x93,0xfa,0xd8,0xb6,0xd1,0x46,0x73,0x2b,0xee,0x99,0x9e,0x41, +0x01,0x08,0xa1,0x04,0x7f,0xad,0xf4,0x7a,0xa9,0x32,0x8a,0x65,0x07,0x3b,0x0c,0xc9, +0xa3,0x37,0x09,0x88,0xf7,0x21,0xba,0x8a,0xbc,0x47,0x19,0x74,0x5c,0x9b,0xd9,0x9b, +0x77,0x01,0x63,0xcc,0x46,0x9c,0xf2,0x17,0x6c,0xe3,0x6b,0xae,0x8c,0xbb,0x6c,0xe5, +0x28,0x4b,0x3e,0x7e,0xee,0x4c,0x64,0x05,0xa2,0x4a,0xa8,0xc7,0xa9,0x66,0xc3,0xd1, +0xa3,0xd1,0x23,0x17,0x14,0x4f,0x80,0x28,0xab,0xb5,0xab,0xdc,0x7b,0xea,0x5a,0x76, +0x8f,0xe9,0xb3,0x2c,0xed,0xd4,0x42,0x22,0x2c,0xe0,0x2c,0x04,0xdf,0x4b,0x07,0xca, +0xde,0xbb,0xce,0x4b,0xbb,0xa6,0x3a,0xaa,0xcc,0xb9,0xed,0x33,0xa7,0x02,0x8a,0x99, +0xe4,0x0e,0x2c,0xac,0xaf,0x22,0x65,0xa8,0x47,0xe6,0x7d,0xa8,0x7f,0x90,0x7b,0xb2, +0x6b,0xf1,0x3d,0xaf,0x18,0x24,0xc3,0x32,0x37,0xf2,0xb5,0xb9,0xdb,0x0e,0x0f,0xf8, +0x09,0xdb,0x5b,0x1b,0x50,0x32,0x23,0xf9,0x2b,0xb0,0x77,0xee,0x90,0x65,0x92,0xa4, +0xaf,0x12,0x81,0xf7,0x41,0xb9,0x51,0x9f,0x10,0x12,0x1c,0xc6,0x30,0x7f,0x64,0x8e, +0xd6,0xe5,0x97,0x95,0xd8,0xa8,0x7a,0x10,0x94,0xf7,0x98,0xf3,0xf0,0x7f,0xb2,0x80, +0x2d,0x1e,0x05,0xe5,0xbc,0x99,0x58,0xb5,0x6d,0xaf,0x05,0x62,0xf2,0x87,0xf2,0x60, +0x1e,0x20,0xff,0x91,0xe9,0xc8,0x8a,0x71,0xad,0x87,0x3e,0x23,0x2d,0x95,0x14,0x41, +0x72,0xb9,0x21,0x2b,0xd3,0x62,0xc9,0x02,0xe0,0x50,0xac,0x66,0x77,0xed,0x04,0xc1, +0x5c,0xd7,0xf6,0x5e,0x80,0x31,0x3e,0xf9,0x62,0x95,0xc1,0x16,0xdf,0x7a,0x5b,0x86, +0x68,0x6f,0x3c,0xb7,0x28,0x09,0x73,0x83,0x1d,0x3a,0xef,0x07,0x70,0x3e,0x8d,0x1d, +0x25,0x56,0x49,0x51,0xbf,0xbe,0xe2,0x36,0x21,0x48,0xbd,0xb1,0xfc,0x7a,0x56,0x76, +0x24,0xb3,0x02,0x08,0x44,0x29,0x81,0xb7,0x4a,0xfc,0xc8,0x3f,0x7c,0xd3,0xce,0x69, +0x96,0xbb,0x0e,0x18,0x45,0x28,0x3e,0xda,0x80,0x88,0x31,0x4d,0xaf,0x79,0xfa,0x99, +0xc3,0x65,0x47,0x65,0x56,0xc1,0x04,0x95,0xa0,0xcb,0xf5,0xa9,0x25,0xc7,0x51,0x76, +0xf9,0x18,0xb1,0xe5,0x5b,0x1b,0x64,0xca,0x95,0xa4,0x38,0x22,0x92,0xcd,0xaa,0x48, +0xd6,0x3c,0x96,0x1f,0x62,0xb1,0x5e,0xfc,0xe8,0x14,0x9c,0x12,0xd9,0x71,0x5c,0xdc, +0xc0,0xfb,0x2d,0x22,0xda,0x8b,0xce,0x8a,0x80,0xec,0x65,0xa3,0x7d,0xa5,0xeb,0x8b, +0x29,0xe3,0x6b,0x52,0x45,0xb3,0xca,0x8b,0x96,0x51,0x9d,0x16,0x59,0x82,0x75,0x65, +0x40,0xd9,0xb0,0xaf,0x69,0xa0,0x9f,0x31,0x74,0xf4,0xb9,0x7f,0xfa,0x1c,0xa7,0xea, +0x9d,0xc2,0x9e,0x3f,0x62,0xcc,0x48,0x3f,0xa4,0xdb,0x5c,0x48,0x28,0x1f,0xef,0x96, +0x5e,0xe1,0x57,0x0d,0x91,0x35,0x46,0x0b,0x67,0xe3,0x43,0x49,0x5b,0x1e,0x23,0xf6, +0x82,0xd3,0x65,0xf9,0x69,0xc0,0x13,0x17,0xa4,0xcd,0x8b,0x9b,0x59,0x80,0x79,0x3b, +0x87,0x82,0x0d,0x69,0x36,0xc6,0xb8,0xdb,0xe5,0x8e,0x02,0x57,0x95,0xb8,0x17,0x20, +0x67,0xa4,0xb0,0x31,0x4a,0xe3,0x10,0x26,0xc6,0xc9,0x70,0x79,0x1d,0xa5,0x24,0xa5, +0xee,0x2c,0x15,0x24,0x81,0xfa,0xd7,0x9d,0xf2,0x6d,0xba,0x16,0x4f,0x65,0x1e,0xbe, +0xc0,0xc6,0x8f,0x35,0x1b,0xd0,0x88,0x44,0x67,0x4c,0x5a,0x1c,0x03,0x1b,0xc5,0xc0, +0xb2,0x8d,0xd3,0xdc,0x2c,0x2a,0x01,0x8d,0x7a,0x3f,0xa1,0xc6,0x55,0xef,0xb7,0x13, +0x2e,0xe9,0x1d,0xec,0x38,0xa9,0xcd,0x6d,0xa5,0x79,0x4d,0x2c,0x50,0xb4,0x2a,0x12, +0x6a,0xa9,0x12,0xe1,0x9f,0x7d,0x29,0x3b,0xa4,0x58,0x2f,0xba,0x58,0x7a,0xa5,0xe3, +0xe3,0x41,0x26,0x5a,0xaf,0xb8,0xd4,0xd8,0xb4,0x61,0x0c,0x61,0xbf,0x60,0x83,0x2e, +0xa9,0xc5,0xf4,0x7d,0xe0,0xa2,0x97,0xa8,0xb5,0xc1,0x02,0xdd,0x5f,0x3f,0xe4,0x38, +0xf1,0xce,0x83,0xa4,0xef,0xaf,0x8d,0xe8,0x4b,0xc8,0x26,0x1c,0xfd,0xad,0x3a,0x53, +0x47,0x00,0x2a,0x03,0x10,0xef,0x02,0x01,0x41,0xaf,0xb0,0xa1,0xfc,0xeb,0xaa,0xcd, +0x0e,0x9e,0x5d,0xda,0x38,0x00,0xc8,0x89,0x62,0x33,0x93,0x2b,0xd1,0xe3,0x94,0xdf, +0xd0,0xcc,0x6f,0x2f,0x7e,0xc3,0x31,0xc6,0x4d,0x87,0x73,0x9a,0xbc,0xcf,0x5d,0x79, +0x4f,0xef,0xe7,0x7b,0x30,0xf2,0x0f,0x5c,0x40,0x04,0x31,0xd4,0x9f,0x66,0xd3,0x63, +0x9a,0xa2,0x14,0x51,0xf7,0x91,0xfb,0xf5,0x9a,0xbf,0x01,0xe9,0xa1,0x34,0xe4,0x99, +0x53,0x26,0x6a,0x2c,0x87,0x22,0x22,0xbc,0x90,0x90,0x1e,0xc9,0x21,0x0e,0x7d,0x6d, +0xa9,0x38,0xa5,0x9b,0xde,0x2a,0x5b,0x8f,0x10,0x75,0x1a,0x80,0x9e,0x56,0x3a,0x51, +0x22,0x3f,0x74,0x89,0xcb,0xc8,0x27,0xc2,0xd9,0x8f,0xae,0xe7,0xd5,0xb5,0x8f,0x21, +0xf9,0x3e,0x25,0x2d,0x44,0xb5,0x83,0x76,0x6f,0xcd,0xd4,0xf1,0xf6,0xb1,0x07,0xd3, +0x47,0x39,0x4c,0xb9,0x23,0x1b,0x5d,0x18,0x95,0xd2,0xdd,0x85,0x77,0xf9,0x0a,0xdb, +0x4c,0x01,0x2d,0xd6,0x38,0x4a,0x22,0xd3,0x94,0xd7,0xd5,0x35,0x9c,0xf9,0xdb,0x9a, +0x47,0xe7,0x26,0xfc,0x0f,0xd2,0x21,0xea,0x78,0x9a,0x96,0x5f,0x9c,0x78,0x70,0x75, +0x79,0x9a,0x71,0x9f,0x3b,0x43,0xdb,0xc4,0xfb,0xd3,0x9d,0xad,0x09,0x4d,0xe7,0x7a, +0x13,0x38,0x5f,0xc9,0x8c,0xfb,0xf0,0x98,0x63,0x27,0x1f,0x25,0x34,0x4b,0x56,0x60, +0xc6,0xe4,0xac,0xbb,0x69,0x2a,0xfd,0x3f,0xb3,0xb7,0xe1,0xb0,0xb9,0xb5,0xcd,0xb0, +0xfb,0x60,0x0a,0x5d,0x2d,0xb4,0xa9,0xea,0x19,0xd0,0xb6,0x6a,0x50,0x41,0xc9,0xed, +0x44,0x38,0xef,0xa1,0xb2,0x1b,0xf5,0x9a,0x65,0x7d,0x96,0xf9,0xfc,0xf2,0x58,0x94, +0x7a,0x5b,0xe5,0xd0,0xad,0xba,0xb7,0xa2,0x90,0x23,0x9f,0x2d,0x7d,0xba,0xef,0x2a, +0x4f,0xdf,0x21,0x1f,0xbb,0x4b,0x68,0x88,0x97,0xb3,0x97,0x9d,0xd9,0xff,0x60,0x02, +0x79,0x0d,0x37,0x05,0x9d,0x2c,0xb7,0x26,0x94,0x24,0xb8,0xe6,0x84,0xa6,0xcd,0xf2, +0x32,0xb1,0x6e,0x66,0xfa,0x87,0xdc,0xe0,0x4d,0x47,0xfe,0xc5,0x93,0x21,0x4b,0x1c, +0x02,0x01,0xe9,0x1b,0x56,0xd6,0x29,0xce,0xce,0x20,0x36,0xb2,0x31,0xcd,0xb1,0xef, +0x91,0x4e,0xd7,0x87,0x95,0x8c,0x91,0xfc,0x62,0x3e,0xe7,0x03,0x3a,0x86,0xf8,0x07, +0xc8,0x4d,0xa0,0x03,0x5d,0x20,0xab,0x90,0x4a,0x22,0xee,0xa8,0x32,0xbb,0x7a,0xae, +0xfe,0xd4,0x08,0x59,0x13,0x23,0xf4,0xe3,0x26,0x4f,0xa0,0x46,0xac,0x7e,0x03,0x52, +0xe7,0x09,0x07,0xc7,0x1f,0x8c,0xae,0x13,0x39,0xfb,0x2e,0x16,0xc9,0x92,0xb2,0x7e, +0xea,0x52,0x61,0x6c,0x32,0xd8,0x1e,0xf5,0xdf,0x3b,0xe7,0x06,0x70,0x28,0xfd,0x8c, +0x17,0x1c,0x61,0xff,0xc6,0x83,0x58,0x3d,0xca,0x4b,0xcc,0x1f,0x48,0xc7,0x6a,0xb8, +0x11,0x06,0x21,0x66,0xcc,0xd5,0x56,0xc8,0x45,0x46,0xb9,0x27,0x81,0xc2,0x5a,0x81, +0x2d,0xf5,0xe4,0x05,0x73,0xbc,0x50,0xcb,0x4a,0x02,0xa1,0x6b,0x4a,0xfe,0x52,0x90, +0xab,0x29,0xb4,0x42,0x4d,0xee,0x3c,0x3f,0x19,0x2f,0x3e,0xb5,0x5e,0x7d,0xd8,0x26, +0x2b,0xde,0x76,0x2e,0x29,0x06,0x68,0xef,0xb9,0xc7,0xd3,0x13,0xfd,0x2d,0x30,0x38, +0x45,0xf1,0x32,0xde,0x9e,0x9d,0x60,0xfc,0x57,0x31,0x79,0xdd,0xfa,0xd2,0x83,0x84, +0x95,0x91,0x6c,0xab,0x8a,0xd3,0x7b,0x50,0xcc,0xde,0x83,0x71,0xb8,0x68,0x70,0x06, +0xe8,0x09,0x0b,0x50,0xb4,0x6e,0x61,0xfe,0x38,0xe2,0xc3,0x44,0xec,0x8a,0xe8,0x00, +0xdc,0x30,0xbc,0xf4,0x84,0x39,0xda,0xc0,0x34,0xd1,0x37,0x32,0xac,0x96,0xee,0x8f, +0xef,0x9c,0x8d,0x09,0x52,0x22,0x4e,0xae,0x8a,0x35,0xfe,0xb0,0x9a,0xa7,0xa9,0xc3, +0x23,0xc6,0x05,0xc2,0x94,0xc9,0xe8,0x52,0x64,0xdf,0xaf,0x56,0x3a,0xd9,0x73,0x02, +0xca,0x95,0x1a,0x66,0x35,0xbe,0x25,0xd1,0xe5,0xf1,0xe3,0x2a,0x9a,0xc5,0x7a,0x04, +0xfc,0xb9,0x21,0x3e,0x01,0x13,0x5e,0xe4,0x89,0xf2,0x09,0xc6,0x45,0x54,0x5a,0x52, +0xa6,0xad,0x0c,0x1d,0x88,0x2e,0xee,0xef,0x8f,0xfe,0x1c,0xa8,0x70,0x34,0x09,0x52, +0x01,0x1c,0x7d,0xf4,0x13,0x49,0x0b,0x73,0xe6,0x82,0x8a,0x85,0x81,0x00,0x75,0x96, +0x61,0x95,0x3c,0xb3,0x51,0x27,0x6b,0xf5,0x88,0xd2,0x7a,0xb0,0x74,0x47,0x86,0x92, +0xfe,0xac,0xd4,0x8e,0xd3,0x5c,0xd8,0xdb,0x73,0xda,0x97,0x5f,0xaa,0xa4,0x70,0x02, +0xfc,0x44,0x19,0x6f,0xbd,0xb4,0xf9,0x78,0x6b,0xd2,0x31,0xa2,0x9d,0x8d,0xe0,0x78, +0x72,0x0a,0xbf,0x73,0xdb,0x39,0xe8,0xda,0xfb,0x36,0xac,0xf3,0x25,0xc7,0xa4,0xc6, +0x14,0xe7,0xdd,0x9f,0x52,0x5f,0x60,0x88,0xfa,0xf4,0x29,0x4e,0x11,0xd0,0x0e,0x50, +0xf7,0xa1,0x42,0x0a,0x14,0x7d,0xd6,0xae,0xf8,0x08,0x7e,0xfc,0x49,0x8c,0x76,0x9f, +0xf5,0xb2,0x36,0xf8,0xbe,0x0c,0xfb,0x70,0xec,0x4b,0xa9,0x9e,0xba,0x1e,0xe8,0x4b, +0x2a,0x74,0x9e,0x63,0x1f,0xbe,0x74,0xe6,0x32,0xf5,0x6f,0x16,0x78,0xaa,0xc4,0xab, +0x69,0x1f,0x67,0xe1,0x3e,0x8e,0x0f,0x67,0x10,0xa4,0x0b,0x2d,0x7a,0xf7,0x23,0x64, +0x86,0x83,0x07,0x31,0x7f,0x05,0x08,0xdd,0x85,0xa2,0xe0,0xb8,0xaf,0xfc,0x2f,0x60, +0xa6,0x85,0x00,0x9c,0x81,0x35,0x58,0x76,0x16,0xce,0xb9,0x00,0xbf,0xf4,0xa6,0xe1, +0x06,0x81,0x21,0xf6,0x74,0xe2,0xf5,0xa6,0x87,0xe2,0x0c,0x6d,0x30,0x65,0x28,0x6c, +0x22,0x85,0x0c,0x0c,0xfe,0xd7,0x86,0x61,0xcb,0x49,0xb1,0x01,0x25,0xf3,0xf5,0xb1, +0x82,0x09,0xb0,0xf6,0x70,0xa5,0xea,0x5b,0x26,0xc8,0x2d,0x06,0x3d,0x55,0x50,0xa9, +0x01,0x5f,0xfe,0x34,0xec,0x08,0x58,0xa9,0x63,0xab,0x27,0x16,0x20,0x93,0x33,0x5d, +0x6d,0xe2,0x35,0xe2,0x7f,0x3c,0xb1,0x7b,0x27,0x76,0xf5,0x96,0xa2,0xe3,0x96,0xdf, +0xd3,0xf7,0x24,0xf2,0x64,0x2c,0x39,0x4c,0xcf,0xab,0x39,0x2e,0x1e,0x3c,0x72,0x13, +0x6f,0xa8,0x22,0xc8,0x8e,0xab,0xb6,0x0d,0xef,0x7c,0x00,0x15,0x23,0xe8,0xb7,0xe2, +0x8d,0x32,0xc2,0xdc,0x9b,0x5c,0x70,0x2f,0xcf,0x81,0x2a,0xf9,0x5f,0x1c,0x5b,0xf7, +0x0c,0x71,0x40,0xf4,0xe3,0xaa,0x93,0x31,0x40,0xc7,0xdb,0xed,0x5a,0x1f,0x30,0x1f, +0x8e,0x8f,0x3b,0x9d,0x1d,0x28,0xa3,0xd9,0xe9,0x66,0xbf,0x78,0x5c,0xe5,0x42,0x95, +0x2a,0x30,0xfa,0x77,0xf5,0xe8,0x5a,0xa8,0x92,0x88,0x44,0x93,0x7f,0x97,0x20,0x38, +0x64,0x82,0x4a,0xa0,0xe6,0x2c,0x98,0x69,0xcb,0x2b,0x7c,0xfa,0x18,0x45,0xdc,0x10, +0x0c,0x8a,0xb9,0xdc,0xec,0x5b,0xd0,0x6c,0x06,0xaa,0xc3,0x83,0xd6,0x55,0xef,0x69, +0x70,0xe3,0xf3,0xa4,0x6e,0x2c,0x44,0x29,0x8c,0xc0,0x20,0x48,0xa0,0xe6,0x87,0xb4, +0xf8,0x75,0x9c,0xfa,0x15,0xf0,0x94,0xd0,0x06,0x04,0x86,0xa2,0xf1,0xe6,0xac,0xd4, +0xb7,0x35,0x94,0x6a,0xb5,0x4a,0xbc,0xa3,0x76,0x7c,0xe2,0xb9,0x71,0xbf,0x5b,0xb0, +0xcf,0x17,0x09,0xa3,0x49,0xb9,0x4b,0xa4,0x45,0xdb,0x14,0xbd,0x68,0x46,0xbe,0x89, +0x6d,0x62,0xfd,0x6e,0xf5,0x2c,0x73,0xd3,0xe1,0x71,0xdc,0x17,0x23,0x4c,0x1a,0x9b, +0xcf,0x4c,0x4c,0xfe,0x30,0x56,0x74,0x20,0xe5,0x92,0x84,0x09,0x8a,0x3d,0x52,0x8b, +0x45,0x6a,0xb5,0x81,0x54,0xf5,0x24,0x7f,0xe8,0xce,0x7b,0x90,0xc8,0x78,0x77,0xb9, +0x4d,0x9f,0x0b,0x2f,0x5b,0xf9,0xc2,0xc7,0x0f,0x2e,0x35,0x3a,0xe3,0xed,0x13,0x0e, +0x83,0xd5,0x15,0xdf,0xd4,0xad,0x9b,0x77,0xf3,0xb0,0x83,0xa2,0x0f,0x3e,0x01,0x7b, +0xb0,0xf8,0x66,0x5f,0x3a,0x45,0x78,0xd9,0x7b,0x5a,0x69,0xae,0xff,0xf6,0x51,0x67, +0x2d,0x97,0x3e,0x59,0x19,0xd7,0xd9,0x7a,0x69,0x79,0xe6,0xae,0x94,0xb0,0xcf,0x01, +0x8e,0x4c,0x2c,0xef,0xb8,0xd6,0xc8,0xd8,0xab,0xb6,0x57,0x90,0xd8,0x47,0x47,0x1d, +0x51,0xda,0xef,0xa0,0xb5,0xd7,0xf5,0x9f,0x62,0xd9,0x9f,0xaa,0xce,0x7b,0xf9,0xe4, +0xd3,0x3d,0x1e,0xbc,0x0d,0x68,0x3e,0x6f,0xec,0x90,0x41,0x9a,0x78,0x06,0xce,0xa8, +0x4d,0x67,0x14,0xac,0x0c,0x3c,0x1e,0xbd,0x16,0xc6,0xc0,0xbb,0xdc,0x7d,0x5f,0xfb, +0x8b,0x31,0x1d,0xc7,0x57,0xb7,0xf2,0x6f,0xf2,0xde,0x3d,0x6d,0xdc,0xce,0x11,0xdc, +0x4e,0xf9,0x17,0x5b,0xe4,0xdf,0x33,0x7f,0xf3,0x74,0x9f,0x5f,0xa3,0xf0,0x80,0xd5, +0x0c,0x7b,0x7b,0xf5,0x19,0x20,0x08,0x35,0x23,0xbf,0x94,0xc6,0xd2,0x9c,0x0e,0xec, +0xb1,0x43,0x58,0x3a,0x3b,0x94,0x60,0xb2,0xc9,0x10,0xf8,0x6b,0xb6,0xcc,0x86,0x73, +0x7b,0xf9,0xa7,0xc9,0x95,0x57,0x69,0xa3,0x40,0x8a,0xeb,0xd5,0x03,0x6d,0xc2,0xf2, +0x60,0xac,0xdb,0x2f,0xbf,0x63,0x21,0x83,0xc9,0xe1,0x17,0xd7,0x7d,0xce,0xe0,0xb6, +0x31,0x93,0xe0,0x37,0x36,0x89,0x9b,0x29,0xab,0x5d,0x6f,0x82,0x76,0x9b,0xa8,0x61, +0xfe,0x06,0xc0,0x51,0x31,0x15,0xa4,0xf4,0x1c,0x33,0xa7,0xf0,0x42,0xdc,0xf9,0xbe, +0xe2,0xf9,0xdf,0x02,0x58,0xef,0xfd,0xf3,0xd6,0x4e,0x69,0x9f,0xc2,0x2b,0xf7,0x40, +0x93,0x4a,0x0a,0xd1,0xc8,0x75,0x99,0xad,0xcd,0x46,0x49,0xf7,0xf1,0x95,0x17,0x7b, +0x30,0x64,0x55,0xa2,0x97,0x2a,0x28,0xca,0x3f,0x4c,0x9b,0xce,0xfc,0x5b,0x50,0x97, +0x61,0x38,0xe2,0x02,0xdf,0xdd,0xda,0xf5,0xf9,0xb4,0x4e,0xec,0xd8,0xd1,0x65,0xd9, +0x8b,0x68,0x34,0x0c,0x15,0x26,0xcc,0x7c,0xb3,0x27,0xa9,0x88,0x19,0x09,0xcb,0xa5, +0x20,0x06,0x6d,0xec,0x53,0x6b,0x43,0x2c,0x36,0x09,0x60,0x1b,0xef,0xe6,0x1b,0x4e, +0xed,0x4d,0x92,0x51,0x52,0x2f,0x51,0x6d,0x4c,0xdf,0xea,0xbc,0xad,0x63,0xe6,0x1a, +0x88,0xa6,0x9a,0xc8,0x53,0x6f,0xdf,0x7d,0x4d,0xbd,0xa2,0xfe,0x79,0x9f,0xaf,0xc9, +0x76,0x2e,0x01,0x5c,0x1a,0x3e,0xda,0x2f,0x9a,0x4f,0xb3,0x29,0x9d,0xe3,0xa9,0x59, +0x53,0xe9,0x04,0xdf,0x1b,0x4f,0xa5,0xfd,0xcb,0x8f,0xe3,0xad,0x20,0x60,0xc4,0x49, +0x37,0x8b,0xf3,0xbe,0xc2,0x3e,0xb0,0x32,0x60,0x8f,0xc6,0x20,0x78,0x06,0xde,0x14, +0x1e,0x11,0x60,0x14,0xcd,0x11,0xe3,0xc2,0x0b,0x35,0x79,0xa7,0x5f,0x35,0x21,0x78, +0x00,0xb9,0xed,0x03,0x4c,0x73,0x85,0xce,0x88,0x16,0x22,0x14,0xf6,0x52,0xd4,0x93, +0xde,0x33,0x21,0xd7,0x32,0xe7,0xe6,0xf6,0x1c,0xe5,0xbb,0x11,0x7d,0x7e,0x2c,0x02, +0xa4,0xe1,0x06,0x83,0xf0,0xb4,0x9e,0x10,0x6e,0x5b,0xf3,0x92,0x81,0xc9,0x48,0x97, +0xa2,0x1b,0xec,0xc4,0xca,0xb4,0x8c,0x0d,0x22,0x53,0x85,0xfe,0x96,0xcc,0xd5,0x06, +0xa0,0xe3,0x8d,0xd5,0xc1,0x36,0x6f,0x1e,0xe4,0xac,0x79,0x7f,0xf1,0x04,0x72,0x83, +0xe0,0x18,0xb6,0x2f,0x42,0x55,0x7a,0x9a,0x02,0x58,0xc5,0x71,0x90,0x73,0xc6,0x59, +0xd4,0x43,0x64,0x93,0xf6,0xb5,0xad,0x32,0x6b,0x78,0x22,0x53,0x7e,0x58,0x5d,0x99, +0x52,0x19,0x8c,0x6f,0xdd,0x96,0xb1,0xc3,0xb4,0x18,0x36,0x1e,0xfe,0x5e,0xb1,0x64, +0x89,0xb1,0xf9,0x1e,0xd3,0xbc,0x87,0xf7,0x19,0x86,0x72,0x7e,0x9e,0x95,0x54,0x9b, +0xd6,0x3b,0x39,0x6c,0x51,0x2b,0xbc,0x18,0x35,0x18,0x5f,0x65,0xd1,0x3b,0x4c,0xc0, +0xc1,0xba,0x02,0x49,0x79,0xce,0xe2,0x37,0x99,0x1d,0xc1,0x68,0x73,0xa1,0xfc,0xc7, +0xc7,0xb6,0x3d,0xcc,0xa8,0xc1,0x0e,0x4d,0x2f,0x5b,0x96,0xe8,0xa6,0xe0,0x19,0x52, +0xba,0xca,0x58,0xad,0xfa,0xee,0x6d,0x16,0x1d,0xe1,0xef,0x17,0x77,0x88,0x79,0xdf, +0xc0,0x9a,0x74,0x82,0x9f,0x24,0xfc,0x45,0x4a,0xee,0x70,0xa3,0x02,0xa3,0x38,0x13, +0xf8,0xb1,0xfe,0x94,0x10,0x2d,0xa7,0x0a,0x42,0x79,0x64,0x74,0x7a,0x6a,0x3d,0x10, +0xe0,0x9a,0xf6,0x25,0x01,0x0e,0x9b,0x35,0xf8,0x70,0x32,0x6e,0xe9,0x49,0xe1,0xca, +0x30,0x22,0xdf,0x31,0x7f,0x47,0xf3,0x07,0x18,0x86,0x89,0x7b,0x2f,0x46,0x0f,0xe7, +0x7a,0x2e,0x9b,0x51,0x07,0x37,0xc6,0x41,0xb7,0x1c,0x39,0xfb,0xf5,0x77,0x3e,0xd1, +0x1a,0x09,0x20,0x9b,0xde,0xe6,0xb0,0xcb,0x85,0xc0,0x90,0xc6,0x0c,0x69,0xcf,0x65, +0x6c,0x20,0x09,0xf0,0x4f,0xa4,0x40,0x22,0x43,0xca,0xc0,0xa6,0x0b,0xe3,0x1f,0xd1, +0x52,0x43,0x6a,0x4a,0x90,0x7c,0x9f,0xe1,0xe4,0x34,0x89,0xe5,0x56,0x5f,0xed,0xa2, +0x67,0xa7,0xec,0x53,0xdf,0x0e,0x19,0xd3,0x9d,0x4c,0xa9,0xfa,0x74,0xa5,0x68,0x6a, +0x48,0xb3,0x81,0x15,0xc4,0x03,0xde,0x59,0xc8,0x3e,0x62,0x35,0x72,0xbc,0xd0,0x3e, +0x76,0x89,0xfa,0x80,0xe6,0x5c,0x39,0x55,0xb2,0x64,0xf5,0x29,0x22,0xa9,0x8f,0x6c, +0x01,0xe8,0x06,0x87,0x1b,0xbc,0x0d,0x2c,0x1a,0xc2,0xe1,0x20,0xb6,0xa8,0x70,0x19, +0xf2,0xab,0x5c,0x21,0x6b,0x1e,0x9b,0xa4,0x32,0x66,0x7b,0x3e,0x17,0x1e,0xca,0xc0, +0x9a,0x18,0x72,0x3c,0xe9,0x27,0x76,0x88,0xcc,0xcf,0x3f,0xaf,0x58,0x6c,0x2b,0x9c, +0x9d,0x8e,0xd0,0xee,0x9e,0x02,0x02,0xf8,0x6d,0x1f,0xb4,0x5a,0x20,0x12,0xc6,0x50, +0xe5,0xfa,0x64,0x73,0x75,0xea,0xb4,0x09,0x8f,0xee,0x57,0xfe,0x95,0x44,0x88,0xa0, +0xf0,0x8f,0x4f,0x3d,0x64,0xa6,0x41,0x99,0x4d,0x87,0xc1,0x81,0x24,0xf4,0xe4,0x83, +0x35,0x4b,0xda,0xb4,0xb1,0xa6,0x0a,0x6e,0xbc,0xdf,0x7b,0xe1,0x56,0x73,0xec,0x6b, +0x04,0x0a,0x8f,0x89,0xed,0x1a,0x02,0x50,0x4b,0x0e,0x7c,0xf6,0xa7,0x7c,0x01,0x7e, +0x04,0xe9,0x0a,0xfc,0x69,0x1d,0x07,0x92,0x45,0x2d,0x26,0x23,0xb5,0xe9,0x9b,0x97, +0xbe,0xac,0x08,0x1f,0x32,0xa5,0x82,0x83,0xc4,0x7c,0xdd,0xf5,0xe1,0xfc,0x66,0x84, +0xb4,0xc0,0x48,0xa0,0xc1,0xa4,0x0b,0x60,0xb2,0x07,0xf3,0xe4,0xa5,0x08,0xc9,0x4a, +0xa0,0x83,0x22,0xd1,0x04,0xd9,0xd0,0x68,0x64,0x17,0xf4,0x59,0x96,0xfa,0x46,0xcc, +0x7e,0x3d,0x5d,0x2f,0x7e,0xf4,0x4d,0xda,0x15,0x6b,0x4e,0xb8,0xd2,0xf0,0x3d,0x4d, +0x5c,0x6c,0x56,0x31,0xa7,0x4a,0xd0,0x88,0x7a,0x67,0x9d,0xb7,0x41,0xfa,0x46,0x88, +0x2d,0x95,0xf6,0x10,0xc7,0x6d,0x64,0xd4,0x0e,0xfd,0x76,0xb3,0x37,0xba,0xfc,0x34, +0xaf,0x9d,0xc6,0x18,0xc1,0xf8,0xa9,0x49,0xe9,0x52,0xb8,0x56,0x72,0xb4,0x5d,0xeb, +0xaa,0xd8,0x54,0xb0,0x42,0xb4,0x49,0x0e,0x8f,0xd3,0xe7,0x51,0xde,0xb9,0x27,0xf9, +0xcc,0xce,0xcf,0xc0,0x1e,0x30,0x59,0x07,0x11,0x9f,0xa7,0xaf,0x1c,0xe0,0x66,0x08, +0xad,0xda,0x1e,0xc6,0x9b,0x63,0x2c,0xbe,0x52,0x73,0xbc,0x10,0xdd,0xf1,0xa0,0x5e, +0x7c,0x0e,0x2e,0x0b,0xb3,0xa6,0x00,0xfd,0xce,0x2c,0xf6,0x54,0x8a,0xf2,0xd0,0xef, +0xa8,0x07,0xe6,0xa9,0x8d,0x5a,0xd7,0x99,0x8c,0xd2,0xbd,0xf2,0x5d,0xf8,0x7f,0xdf, +0xbb,0xdd,0xc1,0xa1,0x18,0xaf,0x80,0x89,0x99,0x00,0x4b,0x80,0x5c,0xbe,0xa7,0x28, +0x33,0x22,0xf8,0xb4,0xe0,0x8f,0xd0,0x79,0x6e,0x01,0x5f,0x63,0xb1,0xcf,0x98,0x63, +0x31,0x0a,0x48,0x58,0x08,0xd5,0x02,0x31,0x62,0x20,0x38,0xc2,0x26,0xbd,0xb9,0x70, +0xb0,0x0b,0x25,0x21,0x4c,0xc1,0x71,0x3f,0x7d,0x4f,0x1e,0xd6,0xdf,0x79,0x0a,0xf9, +0xd3,0x4e,0xd8,0x6a,0xee,0x23,0x67,0x18,0x28,0x72,0x46,0xe4,0xee,0x93,0x93,0x2f, +0x23,0x76,0x1b,0x45,0x71,0x8f,0x90,0xf5,0x95,0x06,0x6a,0xec,0xa7,0xab,0x36,0x56, +0xe2,0xa6,0x9a,0x4a,0xf8,0x41,0x58,0x70,0xa2,0x5e,0xe2,0x8e,0xa8,0x1e,0x84,0x32, +0xf4,0x77,0x52,0xb6,0x16,0xab,0x53,0x66,0xc2,0x46,0xd0,0x1a,0x35,0x27,0x1e,0xa2, +0x0f,0x0a,0xf1,0xae,0x6e,0x4b,0xb5,0x97,0xf0,0x2a,0x99,0x99,0xbf,0x58,0x5c,0xea, +0x76,0x8d,0x79,0xac,0x12,0x5a,0xbe,0xbb,0x4b,0x42,0xed,0xa8,0x0f,0x47,0x08,0xe5, +0x89,0xd2,0x5c,0xe3,0x1f,0x71,0x0f,0xbc,0x3f,0x91,0x47,0x21,0xb8,0xd6,0xfc,0x37, +0x2b,0x0e,0xda,0x2d,0x3d,0x8b,0xd2,0xd9,0x56,0xeb,0x48,0x6a,0xa7,0x50,0x8b,0x9d, +0xda,0xcb,0x86,0x46,0x64,0x97,0x03,0x20,0x35,0x7a,0x5b,0xe1,0x72,0xb0,0xbd,0x3b, +0x78,0x7d,0xa5,0x0c,0x5a,0xfc,0xaa,0x4c,0x9f,0xb1,0xab,0xe8,0x5e,0x52,0x9f,0xab, +0x87,0xf0,0xe2,0x60,0xf0,0x69,0xa1,0x0b,0x22,0x44,0x87,0x74,0x68,0x6d,0x3d,0x4f, +0x6b,0xad,0x30,0x59,0x27,0xa5,0xf8,0x1a,0xa3,0x9f,0x0e,0x54,0xed,0x19,0x33,0x5b, +0x2e,0x4e,0xf1,0xed,0x4f,0x80,0x1f,0x89,0x8e,0x9e,0x1b,0x20,0x81,0x69,0x00,0x0f, +0xdc,0x93,0x7b,0xf6,0x46,0xef,0xd4,0xe7,0x81,0xa6,0x54,0x18,0x71,0xfb,0xf3,0x14, +0x29,0x67,0x33,0x72,0x51,0x33,0x3c,0x04,0xc2,0x34,0x3c,0xc6,0x13,0x64,0xc5,0x80, +0x3e,0x9f,0xdc,0x44,0x17,0x22,0xea,0xd3,0x36,0x54,0x93,0x94,0x92,0xdd,0x62,0x7a, +0x24,0x14,0xd4,0xcc,0x16,0xbe,0xa2,0x53,0x96,0x57,0xe3,0xb2,0x18,0x23,0xbb,0xa2, +0x02,0x19,0x08,0xd5,0x0a,0x30,0xab,0x93,0x25,0x38,0x50,0x19,0xc6,0x35,0x16,0xa4, +0x5b,0x57,0x6c,0xa6,0x90,0x33,0x96,0x83,0x2c,0x5c,0x07,0xd7,0x0c,0x7c,0x38,0xe5, +0x43,0xa9,0x7d,0xe1,0x30,0x7e,0xb2,0x21,0xe6,0xf6,0x7a,0x9e,0x2f,0x37,0x41,0x3f, +0x02,0xbc,0x1d,0x91,0x10,0x52,0xdd,0x60,0xac,0xfa,0x00,0xdd,0x98,0x7f,0xee,0x2b, +0x2e,0x82,0x55,0x04,0x9f,0x78,0xc9,0x00,0x1b,0x5c,0xee,0x88,0xf9,0x75,0x5e,0x1d, +0x19,0x1f,0xe0,0xb8,0xe9,0x1a,0x9e,0x71,0xd2,0x5f,0xb6,0xba,0xf8,0x77,0x13,0x8d, +0xf7,0x76,0x89,0x7f,0xbe,0xa0,0x48,0x09,0xd7,0x4a,0xbf,0x4f,0x79,0x1e,0x2f,0x68, +0x08,0xe4,0xa8,0x39,0xbf,0x81,0x13,0xbe,0x48,0xd3,0xc1,0x7f,0xeb,0x39,0x3e,0xdd, +0xca,0xc9,0xbe,0x4e,0x3f,0x87,0x1b,0x78,0x95,0xf1,0x47,0xd7,0x29,0xe9,0xe2,0x5d, +0xfe,0x7f,0x1e,0x8c,0x1f,0xb6,0xde,0xe9,0x78,0x1c,0xf8,0xd4,0x70,0xd9,0x3f,0x21, +0xa6,0xc2,0x9d,0xc9,0x19,0x38,0x1e,0xae,0x34,0x54,0x1a,0x69,0xf1,0x05,0x26,0x32, +0x54,0x94,0x41,0xe1,0x50,0x7b,0x61,0x8d,0x54,0xe2,0xca,0x39,0xc8,0xd4,0x40,0x42, +0xea,0x0b,0x9f,0xf8,0xfd,0xb3,0xf0,0xef,0xf5,0x82,0x1b,0xdb,0x35,0x9b,0x16,0x3a, +0xa2,0xc0,0xcf,0x56,0x55,0xdc,0xb8,0xfb,0xf1,0x61,0x73,0xd5,0x89,0x62,0x25,0xe1, +0xb7,0xa0,0x5c,0x68,0x6b,0xcc,0xf8,0x94,0x38,0xf3,0x36,0x55,0x2f,0xa2,0x8a,0xb6, +0x59,0x00,0x52,0x6c,0x6a,0xe2,0x2c,0x31,0x1a,0x82,0x79,0x13,0x0f,0xf8,0x00,0x1d, +0xb9,0x79,0x44,0x24,0xe9,0xe5,0x0e,0x64,0xa7,0x47,0xa0,0xf2,0xb7,0xeb,0x57,0xb0, +0x85,0x79,0xfd,0x11,0xdd,0xaf,0x87,0x00,0xbc,0x87,0xd5,0x0d,0xce,0x68,0x19,0xc1, +0x5b,0xd9,0xdb,0xb4,0xae,0x0b,0xd2,0x90,0x4a,0xcb,0x45,0x18,0x75,0xa7,0x14,0x3c, +0x24,0x81,0xa1,0xc2,0xf4,0xd2,0xb2,0x8c,0xc1,0xbd,0x86,0x8d,0xcd,0x1a,0xe2,0xd3, +0x98,0x73,0x1d,0x6e,0x30,0x03,0x52,0x28,0x2e,0x43,0x1e,0xaa,0x2a,0x02,0x10,0xe5, +0x0b,0xa9,0xd2,0xf6,0x95,0xeb,0xe5,0x9a,0x36,0xa9,0xb2,0xd6,0x94,0xab,0xa3,0x8f, +0x84,0xfc,0xdb,0x2f,0x7c,0x7f,0x82,0xc9,0xbb,0xce,0xa1,0x64,0xda,0x39,0xce,0x24, +0xa3,0xc9,0xa8,0xc4,0xfd,0xa3,0x60,0x3b,0xcb,0x61,0x68,0xea,0xbd,0x06,0xcd,0xa0, +0xe7,0x14,0xf4,0x67,0x18,0x7f,0xbf,0x95,0x35,0x8c,0xe7,0xea,0x42,0x50,0x30,0x5b, +0xac,0x8e,0xf2,0x4b,0xe7,0x9c,0x34,0x1a,0x4b,0x6f,0xa9,0x84,0xe6,0xe6,0x1b,0xc9, +0x8f,0xf3,0x23,0x2d,0x61,0x21,0xf3,0xb7,0x31,0x63,0xcb,0x56,0x25,0x63,0x94,0xa0, +0x0d,0x87,0x2b,0x23,0xf2,0x0f,0x35,0x08,0xd8,0x4d,0x87,0x04,0x8e,0xe4,0x0e,0x07, +0x67,0x70,0x02,0x7b,0x14,0xf2,0x35,0x40,0xe6,0xd8,0x7b,0x29,0xf6,0xf8,0xa9,0x17, +0xa7,0x25,0x6c,0x97,0xab,0x44,0x5c,0xf2,0x70,0x53,0xb0,0xb1,0xd4,0x79,0x35,0xe1, +0xf6,0x93,0xa1,0x14,0x48,0x91,0xb8,0x53,0xe0,0xdd,0x41,0xd5,0x57,0xf4,0x1e,0xf1, +0x84,0x23,0x7d,0x13,0xee,0x35,0x45,0x31,0xe0,0x22,0xb9,0x55,0x76,0xfd,0xfe,0xfb, +0x20,0xbc,0xde,0x76,0xe2,0x1b,0xe1,0x0d,0x87,0xb7,0xca,0xca,0xd1,0xe4,0x1b,0x44, +0xfc,0xd4,0xa3,0x32,0x04,0x8e,0xc5,0x82,0xe7,0xca,0x43,0xc7,0xd6,0x54,0x9c,0xbc, +0x05,0x26,0x41,0xa5,0x92,0xf4,0x8c,0x9c,0x6b,0xa0,0xcb,0xca,0x51,0xb7,0xb6,0x40, +0xd8,0x9e,0x57,0x2d,0xa7,0x7a,0x27,0xf1,0x75,0xdf,0xc5,0xc7,0xb1,0x58,0xf9,0x8f, +0x2a,0x69,0x66,0x56,0x14,0x23,0x4e,0x28,0x69,0x09,0xde,0xa8,0xff,0x9c,0xf1,0x9e, +0x2b,0x68,0x75,0x41,0x3b,0xa3,0x46,0xbe,0x8d,0x58,0x6e,0xa0,0x43,0x0d,0x36,0x0f, +0x8f,0xf6,0xe5,0xfd,0x47,0x45,0x0d,0x49,0xc8,0x71,0xdf,0x4d,0x7f,0xf7,0x3e,0x1f, +0x8f,0x9b,0xbc,0x45,0x5a,0xfb,0x37,0x48,0x69,0x76,0xec,0xa5,0x87,0x4f,0xa6,0x62, +0x93,0xde,0x99,0x89,0xc3,0x0a,0xf2,0xd5,0x0b,0x9d,0x56,0x9c,0x1c,0x90,0xae,0x4f, +0x7f,0x86,0x42,0xa5,0xfd,0xf3,0x7c,0x85,0xb5,0x22,0x4a,0x9c,0x84,0x98,0xa1,0xd6, +0x9d,0x20,0x98,0xb1,0x6c,0x21,0xc8,0xac,0x34,0xd6,0x89,0xe8,0x5f,0x61,0x42,0x5f, +0xe1,0x0f,0xd4,0x4d,0xbf,0xb7,0xef,0x06,0xef,0x9e,0xc7,0x01,0x53,0xf2,0xff,0xe8, +0x4b,0x40,0x0e,0xe2,0x34,0xad,0x1c,0x33,0x13,0x08,0x70,0x1b,0xa4,0x91,0xfe,0x62, +0xa2,0x07,0x70,0x52,0x6d,0x31,0x98,0x8d,0xf7,0x03,0x27,0x6a,0xd6,0xc6,0x03,0xdc, +0x02,0x0a,0xff,0x78,0xa3,0x0c,0xa6,0x19,0x34,0x33,0x26,0x85,0xf4,0xbe,0x01,0xa7, +0x20,0x89,0x71,0xfd,0x52,0x6c,0x56,0xd5,0xf2,0x78,0x31,0x93,0xd7,0x92,0xec,0x3f, +0xd8,0xfb,0x57,0xbb,0xf3,0xa7,0x90,0xa0,0x42,0x42,0xaf,0xe0,0x45,0xfa,0xf6,0x58, +0x8e,0x88,0x6c,0x2f,0xb0,0x64,0x20,0x54,0xa2,0xda,0x18,0x64,0xdf,0xc7,0xfa,0xdb, +0x75,0x05,0x11,0x5a,0x16,0x89,0xd9,0x66,0xa1,0xc6,0x41,0xe1,0xcd,0xae,0xae,0xae, +0x62,0xd1,0x6e,0x7d,0x95,0x57,0x1e,0xf5,0xdf,0x3b,0x97,0xa4,0x98,0x26,0xf9,0xea, +0xa9,0x82,0x83,0xea,0x08,0x67,0xa9,0xde,0x58,0xb5,0xeb,0x6a,0xf2,0x29,0x6a,0x58, +0xeb,0xd4,0x5a,0x38,0x9b,0x2a,0x02,0x3d,0xb7,0x29,0xea,0xfa,0xf3,0x28,0x84,0x59, +0x89,0x05,0x2b,0xac,0xf3,0xf3,0xe9,0xad,0x98,0x60,0x53,0x2c,0x46,0x26,0x73,0x3e, +0x74,0x04,0xca,0xbd,0xc1,0x3b,0x9f,0x3d,0x9a,0xfc,0xa5,0xe1,0x54,0xed,0xb9,0x6c, +0x2e,0x4e,0x70,0xc8,0x45,0x50,0x6a,0x50,0xb9,0xf1,0x12,0xa1,0x1f,0x2e,0x42,0x3a, +0xe9,0x58,0xbf,0xcd,0x4c,0x80,0xf5,0x5c,0xc9,0x4e,0x6b,0x52,0x7f,0x6b,0x09,0xa9, +0x08,0x0a,0x74,0x65,0x9e,0xd4,0x0b,0x9f,0x17,0xd3,0xd1,0x6a,0xee,0x3b,0xcd,0xa9, +0x74,0x00,0x00,0xd9,0x88,0xc0,0xdf,0x0b,0x68,0x4c,0xd3,0xda,0x7a,0x90,0x83,0xc6, +0x78,0x9d,0x4b,0x97,0x36,0x58,0x2c,0x70,0x97,0x5f,0x9c,0xa0,0xff,0x31,0x29,0x66, +0xa4,0xf3,0x3a,0xf6,0xc6,0x37,0x64,0x97,0x02,0xa1,0xc6,0xb6,0x0d,0x33,0x5c,0x9b, +0x47,0x09,0xdd,0xa1,0x32,0x3a,0xa1,0xc3,0xa3,0x8d,0x39,0x81,0x11,0x8d,0x73,0xe0, +0x4a,0x5a,0x85,0xa2,0x10,0x5f,0x65,0x33,0xe8,0x8e,0x91,0xcb,0x50,0xac,0xc0,0xc5, +0x26,0xce,0xeb,0x29,0x30,0xcf,0x8b,0x80,0x15,0x22,0x25,0x02,0x56,0x38,0xdc,0x17, +0x21,0xe0,0x07,0x37,0xb1,0xc9,0x5b,0xb3,0x3f,0x79,0x93,0x66,0x57,0x88,0x70,0x45, +0xf1,0xa1,0xd6,0x39,0x94,0x76,0xd5,0x20,0x58,0x7a,0xa1,0x18,0xb2,0x34,0x49,0x96, +0x22,0x19,0xb7,0xa7,0x10,0x43,0xdc,0xb2,0xa3,0x73,0xcf,0xe0,0x18,0x8e,0xae,0x81, +0xad,0x58,0x65,0xcb,0xe6,0x30,0x2e,0xf8,0x6c,0x57,0x3a,0x29,0xdb,0x88,0x3a,0x65, +0x08,0x62,0x22,0x5c,0x9a,0x78,0xde,0xb5,0x69,0x5f,0x57,0xe8,0x4a,0x69,0xef,0x99, +0x8c,0xc1,0x03,0x4a,0x38,0x1a,0x87,0x2b,0x65,0xd8,0x60,0xa1,0x53,0x3a,0x9e,0x68, +0xa8,0x0a,0x63,0xe2,0x63,0xe6,0xb7,0xb1,0xda,0x71,0x27,0x4e,0xb0,0x6b,0x46,0x39, +0xe6,0x3c,0xcd,0x21,0x32,0x7c,0x9a,0xe8,0xe3,0x7d,0x46,0xec,0x7a,0x7c,0xf9,0xfc, +0xa4,0xb0,0xb4,0x2c,0x33,0x32,0x20,0x9c,0xe9,0x55,0xde,0xfc,0x7b,0x7d,0x47,0x0b, +0x29,0x58,0x0e,0xed,0x38,0xc2,0x57,0x9b,0x01,0xf7,0xd7,0xed,0xfa,0x7e,0x87,0x4a, +0x8a,0xb2,0xe9,0x88,0xea,0x7f,0xaa,0x1b,0xab,0x50,0xdf,0xfd,0xfb,0x7f,0xb0,0x44, +0xae,0x7b,0xfa,0x00,0xb7,0xc5,0xf0,0xfe,0xfc,0x81,0x73,0xe6,0x0c,0x55,0xf7,0x07, +0x82,0x86,0xf2,0x15,0xb6,0xc4,0xc0,0xb6,0x12,0xd6,0x78,0xfe,0xba,0x3c,0x27,0x87, +0x8c,0xf4,0xfb,0x47,0x37,0xe3,0x68,0x54,0x61,0x42,0x7a,0x36,0x83,0x5f,0x81,0xb1, +0x5a,0xdc,0xf3,0x55,0x36,0xe2,0x60,0x44,0x60,0xad,0xc1,0x10,0x28,0xec,0x00,0x40, +0x43,0x8b,0xd8,0xb8,0xba,0xa9,0x8f,0x99,0xc4,0xc7,0xca,0x84,0xab,0xeb,0xa8,0x4a, +0x0c,0x8e,0x65,0xa6,0x1b,0xaa,0xe8,0xf0,0x4e,0x18,0xe8,0xf2,0x5b,0xa7,0xf1,0xc7, +0x99,0x6f,0x1e,0x63,0x14,0xae,0xf5,0x93,0xce,0xc9,0x61,0xe3,0x86,0x3b,0xed,0x57, +0xd4,0x30,0x89,0x17,0x82,0x2a,0x41,0xa3,0x3c,0xc8,0x66,0x6d,0xf3,0xe1,0xca,0xa8, +0xa8,0x0f,0x62,0xd7,0x0a,0xef,0x50,0x22,0x4d,0xd8,0x22,0x0e,0x24,0xea,0x3a,0xaf, +0xe8,0xc8,0xa9,0xef,0x74,0x56,0xf3,0x42,0xca,0xf8,0xd8,0x06,0x4f,0xa4,0xc3,0xbe, +0x09,0x8d,0xa4,0x7c,0xf5,0xa1,0xf3,0x07,0x92,0x88,0x5f,0xc7,0x4d,0xa7,0xeb,0x52, +0x26,0xc7,0x6b,0xcb,0x75,0xe9,0xab,0xb9,0xc4,0x76,0xa1,0x3d,0x1f,0xcf,0x95,0x4b, +0x02,0xce,0x9a,0x6a,0xc7,0x51,0x12,0x2b,0xb7,0xc1,0x51,0xd0,0xff,0x53,0xa7,0x2f, +0x09,0x1d,0xea,0xa2,0x39,0xed,0x21,0xe9,0x34,0xc4,0xc8,0x38,0x71,0x81,0xa8,0x60, +0xaa,0xcc,0xcc,0xa2,0xee,0x55,0x79,0x6a,0x6d,0x8f,0x2c,0x6e,0xda,0x16,0x27,0x3b, +0x83,0x78,0x20,0xbc,0x46,0x52,0xce,0xa3,0x7b,0xb5,0xa1,0x77,0x01,0xf4,0x13,0x5a, +0xd4,0xea,0xc7,0xc6,0x78,0x4d,0xf4,0xaf,0x60,0xd6,0x0c,0x55,0x31,0xeb,0x72,0xe1, +0x15,0xde,0x57,0xb2,0xb8,0x0c,0xe0,0xb6,0x2c,0x5e,0xbd,0xd0,0x9e,0xe9,0xe5,0x42, +0x9b,0x89,0xc2,0x78,0x41,0x24,0x19,0xf4,0xe2,0xa2,0x34,0xc1,0x1f,0x1a,0x2c,0xe0, +0x9d,0xdc,0x4a,0x68,0x44,0x65,0x63,0x72,0x65,0x78,0x2d,0xc7,0x75,0xec,0xab,0xb2, +0xa6,0x8b,0x2d,0xe6,0x7b,0x78,0x9c,0xcc,0x42,0x29,0xf4,0xe6,0x76,0xf4,0x0d,0xf6, +0x14,0x15,0x62,0x10,0x7a,0xab,0xc3,0x69,0x98,0x94,0xfc,0xf6,0x77,0xf5,0x5b,0x02, +0xc7,0x92,0x6b,0x8c,0xfb,0x0a,0x99,0x78,0xe7,0x56,0xf5,0xe7,0xf6,0xf6,0xd5,0x94, +0x6d,0xde,0x63,0x08,0x4a,0x13,0xd1,0x88,0x39,0x28,0xfd,0xf7,0xf7,0xf7,0xb6,0x0e, +0x62,0x85,0x5d,0xaa,0xb3,0xba,0xfe,0xaa,0x5f,0x73,0x88,0x92,0x1d,0xfc,0x3d,0xfa, +0x56,0x90,0xa6,0xa8,0x9c,0x16,0x64,0x45,0xca,0x54,0xa8,0xdc,0x82,0x54,0x79,0xa6, +0x66,0x31,0x10,0x8e,0x31,0xbc,0x6d,0x56,0x4b,0xca,0xd6,0x8b,0x15,0xab,0x74,0xb8, +0x65,0xe1,0x38,0x8c,0x62,0xb8,0x66,0x6b,0x4a,0xc0,0xaa,0x1a,0x0a,0xba,0x24,0xd9, +0x4b,0x93,0x2f,0x2c,0xde,0x0d,0xe6,0xf5,0xea,0x08,0xf6,0xee,0x7e,0xfc,0x05,0xfe, +0xad,0xd5,0x15,0xfa,0xd6,0x74,0xbb,0x81,0xcc,0xb8,0xfe,0xfe,0x7f,0xfd,0x55,0x30, +0xa8,0xc4,0x18,0xbd,0xd4,0xb1,0xd3,0x84,0xcf,0x1e,0xf7,0xef,0xfe,0xfe,0xa0,0x2b, +0xa3,0x90,0xc9,0xbb,0x1c,0x3a,0x5f,0x0c,0xcb,0x52,0xff,0xff,0x58,0x62,0xa8,0xb5, +0xe1,0x1b,0x0b,0x66,0xd1,0x42,0x5a,0xc2,0x73,0x98,0xc9,0x27,0xf5,0xbf,0xe0,0x94, +0x86,0x51,0x4c,0xb3,0x97,0x73,0x9f,0x20,0x72,0x17,0xc1,0xf0,0xf4,0x97,0xa1,0xf7, +0x05,0xa3,0x45,0x80,0xd3,0x02,0xe9,0x43,0x01,0xc8,0x90,0x43,0x2f,0x0c,0x50,0x8a, +0x26,0x05,0xe9,0x17,0xca,0x2e,0xe1,0x57,0x36,0xca,0xd8,0x53,0x07,0x69,0x94,0xae, +0x31,0x20,0x09,0x37,0x09,0x80,0x30,0x62,0x67,0x49,0x9d,0x8e,0xb3,0x5f,0xe4,0xd5, +0xd6,0x67,0xb0,0x99,0xf8,0xbf,0x60,0x56,0xaa,0x03,0xe0,0xfd,0xfc,0x63,0x81,0x2c, +0x48,0xda,0x08,0xa7,0x72,0x82,0x85,0xe7,0xd8,0x23,0xf0,0x82,0x63,0xc7,0x20,0xba, +0x01,0x6b,0xa9,0x57,0xf8,0x2a,0x1d,0x99,0x5f,0x8c,0xfd,0x69,0x72,0x61,0x2a,0x66, +0xab,0x6d,0xc8,0x11,0x2b,0x2d,0x16,0x48,0x0c,0x95,0x97,0x53,0x38,0x6a,0x95,0xf5, +0x1e,0xb2,0xd0,0x0c,0xbe,0x2f,0x18,0xd0,0xdf,0xb4,0xdb,0xda,0x6a,0x43,0x7b,0xf5, +0x05,0xf1,0x7b,0x6b,0xbb,0x4a,0xff,0xba,0xf4,0x42,0x92,0xcb,0x39,0xb9,0xf4,0x9d, +0xde,0x24,0xab,0xdc,0x38,0x30,0xe3,0xc5,0x44,0xb0,0x23,0xc3,0xc9,0x26,0x0c,0xcc, +0x37,0xa3,0xe8,0xc9,0x59,0xcc,0x56,0x80,0x1c,0x01,0x71,0x72,0x5c,0x15,0x2c,0x06, +0x86,0x6f,0x03,0x9b,0xd9,0xfd,0xff,0x6c,0x6b,0x6f,0xe2,0x8d,0xf8,0xed,0x1a,0x88, +0x8c,0x77,0xd3,0x2f,0xfc,0x83,0xac,0x09,0xc6,0x55,0x65,0xef,0x52,0x9e,0xe0,0xdc, +0x18,0x30,0x83,0x60,0xa8,0xcd,0x5e,0x0a,0xf6,0xee,0xe9,0x82,0x59,0xbb,0x5d,0xa5, +0x43,0x70,0x7c,0x06,0xb0,0xe6,0xcb,0xd0,0x5f,0xa0,0x95,0xc2,0x8b,0x76,0x86,0x68, +0xa1,0xaa,0x8a,0x7d,0xb5,0x73,0x60,0x32,0xe1,0x5b,0x28,0xcf,0xd2,0x6a,0xfd,0x7d, +0x28,0xe9,0xbd,0x55,0xec,0x3b,0x2f,0x5a,0xe6,0x88,0x3d,0xad,0x01,0x7d,0x04,0x7c, +0xe1,0x51,0x10,0xff,0x82,0x19,0x25,0x80,0x40,0xf2,0x96,0xd3,0x46,0x63,0x2d,0x2b, +0xdd,0x12,0x1b,0x8c,0x45,0x30,0x44,0x69,0x3a,0xf0,0x77,0x4a,0xd3,0x7f,0xf8,0xaf, +0x80,0xce,0xe8,0xec,0x35,0xb5,0xf0,0x63,0x5e,0x5f,0xd9,0x76,0xa7,0x22,0xed,0xd8, +0x57,0x19,0x05,0x14,0xb4,0x30,0xcc,0x95,0x0b,0x0f,0x55,0xc2,0x53,0x7d,0xee,0x2c, +0x3e,0x8c,0x50,0x57,0x33,0x9c,0xd9,0xe2,0xde,0x9e,0xdf,0x17,0x5f,0xfc,0x4b,0x63, +0x5f,0x3c,0xbc,0x6a,0x28,0xb3,0x2e,0x5b,0x33,0x36,0x2e,0x43,0xfa,0x54,0x34,0x63, +0x2f,0xc3,0x69,0xfe,0x7a,0xc9,0x7e,0xba,0x02,0x54,0x23,0x5e,0xfb,0x35,0xd8,0xd1, +0x97,0x90,0xdf,0x6b,0x3a,0x3e,0x75,0x39,0xe9,0xea,0x39,0xc3,0x5b,0x1f,0x73,0x1d, +0xdc,0x79,0x97,0x8c,0x82,0x71,0x35,0x69,0xb5,0x58,0x1a,0xc3,0x5a,0x1e,0x66,0x31, +0xe1,0x67,0xfe,0x9e,0x34,0xb6,0x70,0x85,0x56,0xf1,0xde,0x0e,0xf8,0x78,0x95,0x86, +0x54,0xfc,0xf0,0x04,0x72,0x47,0x56,0xfd,0xa3,0x04,0x1a,0x79,0x38,0x8f,0x57,0x4d, +0xb1,0x21,0x41,0x48,0x3c,0x3e,0xce,0xae,0x20,0x27,0xd8,0x8f,0x05,0x1c,0x14,0xdb, +0xd0,0xf8,0xd7,0xd0,0x34,0x92,0xca,0x8a,0xd7,0xfe,0x1b,0x7b,0xbf,0x79,0x1a,0xea, +0x84,0x4f,0x80,0xe0,0xf5,0xbb,0xf2,0xcf,0x36,0x7b,0x4f,0x61,0x67,0x58,0x71,0x31, +0xa2,0x2e,0xbb,0xf4,0x97,0xed,0xe3,0x74,0x3a,0x3b,0x5b,0xf6,0x1d,0x3c,0x20,0xf5, +0x6f,0x88,0x44,0xe1,0x16,0x8e,0xce,0xa7,0x93,0xed,0x09,0xb8,0xc6,0xaf,0xe5,0x55, +0xd3,0x85,0xa6,0xf5,0x17,0x2f,0xe4,0x8b,0xbe,0x3c,0x41,0x3f,0x28,0xac,0x9f,0xc0, +0x83,0x35,0x58,0xb9,0xff,0xfe,0xe9,0x91,0x73,0x49,0x01,0xe2,0x6b,0x71,0x10,0x21, +0x3b,0x04,0xd0,0x06,0x37,0xaa,0xe3,0x10,0xb0,0xa7,0x80,0x51,0x34,0xed,0xda,0xa1, +0x2a,0x7b,0x4d,0xd8,0x95,0x07,0x0f,0x0e,0x44,0xc2,0x91,0x79,0x4a,0x6b,0x6b,0xac, +0x66,0xe4,0x32,0x55,0xe8,0x4f,0xbd,0xa3,0x99,0x68,0x81,0xf5,0x03,0x33,0x8e,0xce, +0xaf,0x8e,0xb0,0x7d,0x47,0xa7,0xf2,0xf6,0xe7,0x13,0xeb,0x2d,0xf9,0x37,0x6b,0x5c, +0x1d,0xc5,0x25,0xf6,0x95,0x24,0xbd,0x48,0xb6,0x8b,0xf8,0xba,0x60,0x46,0x8b,0x07, +0x2f,0xc6,0x99,0xf0,0x9a,0x8b,0x9f,0xd6,0xd7,0xb1,0xb2,0x49,0x5e,0x86,0xaf,0xf3, +0x8d,0xc4,0x53,0x17,0xfe,0xa3,0xf0,0xd8,0xba,0x17,0xe2,0xfe,0x78,0x74,0x99,0xa2, +0x5f,0xc1,0xbd,0x28,0x18,0xd6,0xe8,0x82,0x12,0x61,0xca,0x8e,0x5a,0x89,0xaa,0x37, +0xaf,0x51,0x8a,0x5d,0x27,0xa2,0x32,0x6e,0x7c,0x1f,0x59,0x60,0xfc,0x88,0x18,0x43, +0x2b,0x31,0xd2,0x30,0x7d,0x2e,0x6e,0x8d,0x43,0x38,0xcb,0x8f,0xce,0xe8,0xc7,0xde, +0x5a,0xed,0xb4,0xbe,0xec,0xaf,0xc3,0x93,0x93,0x80,0xa1,0x97,0x7c,0xe9,0xe4,0x5a, +0xb8,0x96,0x64,0xeb,0x85,0xab,0x0c,0xa7,0x0f,0x6a,0x0b,0x44,0xf6,0x9c,0xe8,0x42, +0x5b,0xf3,0xf6,0xd4,0x92,0xb7,0x04,0xe0,0x6b,0xb3,0x83,0x54,0xf7,0x9d,0x05,0xda, +0x05,0xf0,0xae,0xf5,0x13,0xa2,0x77,0x21,0x64,0xd8,0xaa,0xdd,0x57,0x97,0xcd,0x0a, +0x27,0x97,0x8d,0x08,0x14,0x3f,0x77,0xb6,0x1a,0xd5,0x73,0xd9,0x56,0x96,0xb9,0x5e, +0x20,0xae,0xaf,0x54,0xc7,0x19,0xee,0x72,0x8d,0xa5,0xd4,0xaf,0xd7,0x2b,0x54,0x02, +0x79,0x3a,0x6d,0x54,0xbf,0xe4,0x25,0xe2,0xc0,0x78,0xf2,0x72,0x06,0xc5,0x18,0x41, +0x26,0xdf,0x28,0x55,0xf6,0xbe,0x53,0x97,0x45,0x52,0x95,0xe5,0xe7,0xed,0xf4,0xf4, +0x06,0x1d,0xd5,0xb7,0xb3,0x97,0xe4,0xc2,0xda,0x78,0x9d,0xf5,0xea,0xfa,0x2d,0xe8, +0x1f,0x8e,0xec,0x93,0x1d,0x28,0xa9,0x6c,0xe2,0xc3,0x0b,0x4c,0xfe,0xfc,0x16,0x4a, +0x71,0x36,0x96,0x77,0x64,0xd6,0x38,0xc9,0x36,0xb5,0xf4,0xa3,0x96,0x88,0xdf,0x09, +0x2c,0x62,0x9f,0x5f,0x1f,0x1b,0x54,0x4d,0x12,0xba,0x87,0xcd,0x03,0x76,0xba,0x8b, +0x52,0x17,0x95,0x3a,0xa7,0xd4,0xfb,0x5d,0x6f,0xdf,0xad,0xaf,0x42,0x76,0xa1,0x39, +0x13,0xf9,0xe8,0xcc,0xd9,0x11,0x3b,0x02,0x20,0x93,0x0d,0x6c,0xfe,0xa4,0x73,0xb8, +0xee,0x17,0x4c,0x39,0x8e,0x1c,0x63,0x09,0x78,0x9f,0xfb,0x7c,0xff,0x27,0x5f,0x1b, +0xf2,0x31,0x2e,0x25,0x5f,0x85,0x2e,0x77,0x4b,0x7f,0xae,0xa7,0xf8,0x67,0xe8,0x33, +0xf9,0xd0,0xd7,0x56,0x10,0x12,0x66,0xfb,0xe9,0xb5,0xc7,0x7d,0x01,0x60,0x78,0x82, +0x80,0x29,0x38,0x24,0x1a,0x30,0xea,0x53,0x78,0x2c,0x50,0x31,0xfd,0x22,0x70,0x56, +0xfd,0x4d,0xb2,0xef,0x91,0xe1,0x26,0x1c,0x8b,0xa8,0x98,0xb6,0x85,0x3a,0x39,0x83, +0x01,0x32,0xff,0x50,0x2c,0x1b,0x77,0x54,0xc1,0x20,0xd0,0x25,0xd6,0x7a,0xcc,0x95, +0x98,0x2c,0xf7,0x40,0x2d,0x1a,0x11,0x28,0x24,0xbc,0xa1,0x72,0x1b,0x8a,0x60,0x5d, +0x31,0x50,0x5b,0xa4,0x54,0xd9,0x28,0xe2,0xcf,0x1d,0x0e,0x94,0x6e,0x6b,0xc0,0x32, +0x8e,0xf3,0xd7,0xd6,0x93,0xb4,0x78,0x9e,0xe2,0xc9,0x92,0x23,0x12,0x75,0xfb,0xbe, +0x00,0xd2,0xb3,0x4f,0x96,0x89,0x29,0x46,0x61,0x40,0xb1,0x05,0xae,0x6b,0x41,0x54, +0x7e,0x85,0xf1,0xe7,0x5f,0x17,0x13,0x6c,0x41,0x2b,0xa1,0x17,0x90,0x78,0x38,0xfb, +0x39,0x13,0xb5,0x78,0xe4,0xe1,0x2c,0x01,0xc7,0xbe,0xcb,0xb1,0xff,0x6e,0x6a,0x1a, +0x4e,0x04,0x41,0xcf,0x9b,0x2a,0xfd,0x78,0x4d,0x05,0xde,0x1b,0xb0,0x58,0x81,0xef, +0x63,0x23,0x43,0xd0,0xdf,0x68,0x5b,0x38,0x21,0x1b,0xb3,0x8d,0xde,0xf3,0x41,0x04, +0xe9,0xab,0x0f,0xed,0x91,0x24,0x1f,0x99,0x9d,0x8b,0xe3,0x1a,0x30,0x3a,0x3a,0x3a, +0x88,0xd8,0x9c,0x11,0x1e,0xa7,0x49,0x8a,0xc8,0x48,0xaa,0xee,0x34,0x0f,0xb2,0x50, +0xac,0x16,0xb2,0x9a,0xe7,0x6c,0xc8,0x9a,0xaa,0x4b,0xba,0x38,0x7a,0xe0,0x64,0xab, +0xb9,0x6c,0xe6,0xaf,0x79,0x4b,0xae,0x0b,0x48,0xc2,0xeb,0xbd,0x05,0x61,0x0d,0xbf, +0x9b,0x40,0xab,0x1d,0x95,0x22,0xf3,0x6c,0x68,0x49,0xa3,0x5a,0x78,0x69,0x3e,0x62, +0xa5,0x45,0x5f,0x66,0xb2,0x34,0x8a,0xc2,0x9b,0x8d,0x6e,0xe2,0x50,0x3c,0x6c,0x92, +0x5a,0x1c,0x0b,0x7c,0x37,0x7e,0x1d,0x56,0x52,0x43,0xa4,0x5c,0x4e,0xbe,0x65,0x21, +0xac,0x1d,0x5e,0xe7,0x71,0xb8,0x4c,0xb8,0x47,0xef,0x01,0x27,0x70,0xb9,0xd9,0x17, +0xf5,0x10,0x35,0xd2,0x73,0x93,0x23,0x98,0x46,0x48,0x27,0xf2,0x33,0x63,0xc3,0xa6, +0xdd,0xb9,0xbc,0x46,0x10,0x56,0x7e,0xd4,0xc3,0xde,0xec,0x34,0xad,0x7b,0xd9,0xa3, +0x1f,0xb4,0x9c,0xcc,0x50,0x55,0x24,0xe1,0x83,0x53,0x96,0x1b,0xd0,0x78,0xd0,0x86, +0x7c,0x1c,0x9f,0xd0,0x11,0x30,0xd2,0x81,0xf2,0xfd,0xb5,0x50,0xdc,0x7b,0x75,0xe1, +0xcf,0x08,0xb5,0x57,0xb6,0xcd,0x77,0xc0,0x40,0x51,0xd7,0xf4,0x50,0x7a,0x85,0xc5, +0xaa,0x1c,0xce,0x89,0x5b,0x98,0x53,0xdb,0x5c,0x17,0xde,0xa8,0x1f,0x79,0x6e,0x9a, +0x5d,0x14,0xb6,0x4c,0x65,0x98,0x87,0xf3,0x6f,0xaa,0xc7,0x45,0x9e,0xb4,0x90,0xeb, +0x4b,0xe5,0x7f,0x0f,0x38,0xe1,0xd7,0x69,0xe8,0x18,0xf7,0xaf,0x97,0x77,0x90,0x79, +0xf1,0x16,0xb7,0xac,0x18,0x20,0xde,0x3d,0xee,0xa2,0x33,0x2f,0xed,0x71,0xfe,0x8f, +0x24,0xb3,0xfe,0x9c,0x32,0x33,0x7c,0xd9,0xcb,0x5a,0xdc,0xe8,0xd9,0x87,0x46,0xcc, +0x48,0x22,0xc4,0x9c,0x98,0x3b,0x74,0xcc,0xca,0xa2,0xbe,0x49,0x1b,0xf0,0x52,0x8e, +0x68,0xfe,0xa7,0x6d,0x06,0x33,0xfb,0x80,0x49,0x58,0x2e,0x69,0xa1,0xb6,0x59,0xf0, +0x40,0x2e,0x9f,0xcc,0x1a,0xb7,0x15,0xe4,0x69,0x7b,0xa7,0xda,0x98,0x80,0x79,0x9a, +0xa3,0xcd,0xf0,0x1a,0x37,0xa6,0x60,0x23,0x48,0xc3,0xc8,0x06,0x5e,0x80,0x12,0xfa, +0x0f,0xce,0x6c,0x93,0x56,0xc1,0x26,0x50,0xae,0xf0,0xf1,0x94,0xb4,0x1e,0xde,0xeb, +0x80,0xcd,0x81,0xff,0x35,0x2e,0x77,0x3b,0x46,0xc6,0x8f,0x0e,0x77,0xa0,0x96,0xe2, +0x26,0x70,0xf0,0x9b,0x32,0xae,0x8d,0x51,0x2e,0x92,0x79,0xea,0xf3,0x6e,0x00,0x5c, +0x70,0x8b,0xaa,0xbd,0xb5,0xa9,0x5a,0x56,0xe7,0x4e,0x78,0xba,0x16,0xeb,0x31,0x63, +0xa2,0x3a,0xe7,0x86,0xa8,0xaa,0x32,0x6f,0x2c,0xca,0x80,0xf4,0x52,0xbe,0xba,0x01, +0xf9,0x0c,0xab,0xa8,0x90,0x3f,0x09,0x03,0xda,0x4a,0x45,0x05,0x97,0xa6,0xb4,0xc5, +0x81,0x5d,0x89,0xf7,0x95,0x2c,0x7f,0x41,0x45,0x8b,0xa3,0x76,0x74,0xe1,0x10,0xf5, +0xf8,0x87,0xe8,0xb3,0x2f,0x69,0x9a,0xbb,0x33,0x41,0xeb,0xd3,0xbb,0xf3,0x22,0xad, +0x6e,0xa9,0x2e,0x2c,0x76,0xa6,0x84,0xb8,0xcd,0xd0,0xe3,0xce,0xba,0xf2,0xe3,0xd3, +0xc8,0x8c,0x5b,0x69,0xf7,0xa5,0xe8,0x2b,0xca,0x20,0x6d,0xd9,0xcc,0x25,0x53,0x99, +0x8c,0xfc,0xad,0x0d,0x1f,0x7f,0x03,0xc5,0x4f,0xcf,0xe5,0xc9,0xee,0x30,0x1e,0xb6, +0x8f,0x77,0x65,0xac,0x9c,0xaf,0xf4,0x88,0xcc,0x80,0x7a,0x87,0xfd,0xea,0xea,0xde, +0x58,0xa2,0xe0,0x4b,0xbc,0xab,0x30,0x98,0xae,0xcb,0x9a,0x3a,0x28,0x6d,0xb0,0xa6, +0x9e,0x35,0x52,0x2d,0xdd,0xa1,0xf5,0x09,0x4c,0xa2,0x7b,0x92,0x3f,0xe1,0x51,0xa8, +0xb3,0x94,0xbb,0xce,0xfc,0x8f,0x51,0x4a,0x6c,0xc9,0x83,0xfd,0xda,0xeb,0xe0,0x04, +0x36,0x93,0xb2,0x60,0xb6,0xb4,0x6d,0xbf,0xc1,0x6f,0x34,0x52,0x15,0x2b,0xe8,0x17, +0xa3,0x81,0xff,0x74,0x94,0xdd,0x36,0xb0,0x9a,0xd7,0xf1,0xc4,0x8e,0xb3,0x64,0x97, +0x05,0xfe,0x85,0xe5,0x36,0x66,0x85,0x2a,0x05,0xb1,0x99,0x5a,0xd6,0x87,0x4d,0x91, +0x83,0x9e,0xcf,0x9b,0xb6,0xd3,0x9e,0x08,0x44,0x0c,0x76,0x54,0xf3,0x4a,0xa4,0xaf, +0xd5,0x16,0xe5,0x24,0x9a,0x3f,0x84,0x00,0xca,0xdb,0x8c,0xc1,0x15,0x14,0x34,0xc6, +0xa5,0x41,0x69,0xb4,0x74,0xba,0xc8,0x10,0xcb,0xda,0x84,0x74,0x55,0xb4,0x1d,0x47, +0x9b,0x09,0x62,0x25,0x34,0xb5,0xca,0xb1,0xa5,0x26,0x8d,0xc0,0x95,0x09,0xbe,0xb1, +0xe7,0x98,0x95,0x55,0x95,0x95,0xd5,0xe3,0x8c,0x6e,0xc7,0x15,0x75,0xff,0x58,0xa3, +0x80,0x95,0xfc,0x71,0x9f,0x63,0x1c,0x0f,0x42,0x52,0x54,0x46,0x6e,0xb5,0xf7,0xf8, +0xc6,0x70,0x4c,0x72,0x3d,0x34,0xc3,0x85,0x08,0x9b,0x12,0x2d,0x10,0xf3,0x59,0xa7, +0x2e,0x9e,0x53,0x72,0xd9,0xc1,0x1f,0xf6,0xad,0xd9,0xd7,0xb1,0xf9,0xf5,0x9b,0xf9, +0x9e,0xcf,0xd0,0x1b,0xfa,0x39,0xf0,0xf7,0xde,0x09,0xb9,0xcc,0x90,0xf4,0x60,0xe7, +0xae,0xe0,0xbc,0x57,0x38,0xc5,0x53,0x98,0x85,0x24,0xff,0xfe,0xdd,0x71,0x75,0x5b, +0xce,0x9b,0xd4,0x3c,0xbd,0xf5,0x5e,0xc2,0xce,0x22,0xc4,0x01,0x7b,0x07,0x07,0x94, +0x4f,0xdc,0xc9,0x4d,0xbb,0x74,0x2e,0x0e,0x09,0xd8,0x08,0x6b,0xa1,0xbd,0x47,0xa0, +0x0c,0xfa,0x26,0x3d,0x3d,0xf7,0x05,0x05,0x43,0xd2,0x2c,0xff,0xff,0xff,0xdb,0x5e, +0x7f,0xe7,0x3f,0x54,0x31,0x6f,0xf4,0x7f,0xe7,0x50,0xae,0xe8,0xf7,0x95,0xc8,0xcc, +0xaa,0x8c,0xa2,0xc4,0x4d,0xa1,0x41,0xb3,0xa0,0x0e,0x51,0xcc,0x51,0x23,0xdc,0x0c, +0x61,0xbd,0xe1,0x07,0x06,0x2f,0xae,0xc7,0x39,0xbd,0xdc,0xd9,0xd0,0xd7,0x69,0x52, +0x94,0x0c,0xe9,0x57,0x8d,0x2c,0x18,0x4e,0x66,0x45,0x9d,0x76,0x2c,0xc2,0x38,0x67, +0xa1,0x02,0x3d,0x2b,0x9f,0x82,0x30,0x24,0x1a,0x06,0xaf,0x3e,0xaf,0xf8,0x28,0x14, +0x36,0x88,0x5f,0x84,0x1b,0xda,0x98,0xa9,0x06,0x43,0xa6,0x72,0xb2,0xe6,0x49,0x66, +0xc2,0x09,0x5b,0x85,0xe6,0x8b,0xcc,0xc6,0xbd,0xcf,0x56,0x95,0x89,0xf7,0x31,0xd3, +0x8a,0x43,0x76,0x45,0x24,0xac,0xd1,0xe4,0x62,0xb8,0x7a,0x86,0x5f,0xda,0xaa,0xad, +0x3b,0x2f,0xe2,0x0e,0x8e,0x25,0x32,0x1a,0xe9,0x41,0xaa,0xd3,0xad,0x0b,0x72,0x9a, +0x88,0x8b,0xa2,0x04,0xba,0x2f,0x3a,0x29,0xc4,0x2a,0xe4,0x21,0xac,0xea,0xfb,0x8b, +0x09,0x68,0xc9,0x10,0xd8,0x2c,0xd3,0xad,0xf5,0x04,0x68,0x52,0xb8,0x63,0x73,0x9b, +0x09,0xd3,0xab,0x92,0x38,0xa7,0xb0,0x9c,0x1c,0x55,0xaf,0xce,0x8d,0x2a,0x7a,0x18, +0x0e,0x03,0xa2,0x61,0x1c,0xb5,0x78,0xed,0x44,0xc6,0xaa,0x61,0xda,0x7b,0x4e,0xba, +0x89,0x25,0xd8,0xde,0x1d,0xb4,0x3a,0x3c,0x43,0x0f,0x62,0x87,0x86,0x10,0x23,0x09, +0xa4,0x85,0x13,0x3e,0xff,0x5f,0xd7,0xc9,0x6b,0x8e,0x43,0x0b,0x29,0x7e,0xeb,0x3b, +0xc8,0xb0,0x1b,0x62,0xe7,0xfa,0xc6,0xc3,0x36,0xc3,0x74,0x23,0x6e,0xb3,0x8b,0x04, +0x51,0x83,0x44,0x85,0x80,0xaf,0x9b,0xc6,0x97,0x40,0xce,0xa1,0xd3,0x76,0x77,0x12, +0xa1,0x54,0xb7,0x66,0x10,0x71,0x7e,0xd6,0xbf,0x8c,0xfc,0xf0,0x36,0x7e,0x65,0xc7, +0xe4,0x1f,0xcf,0x90,0x91,0xf2,0xad,0x5e,0x6f,0x49,0x1d,0x69,0x11,0x7d,0x35,0xf1, +0xa7,0x51,0x25,0x25,0xd2,0xc3,0x07,0xb3,0x0a,0x5c,0xfd,0xf1,0x71,0x7e,0x3c,0x42, +0x00,0xf5,0x70,0x0b,0xc1,0xef,0x6c,0xf4,0xe0,0x1c,0xec,0xb4,0x7a,0x7b,0x74,0x00, +0xd8,0x1a,0x17,0x45,0xd2,0x4a,0xcc,0x82,0xe1,0x81,0x10,0x96,0x30,0xaa,0x3d,0x43, +0xab,0x4b,0x50,0x65,0xb8,0x76,0x52,0x65,0xdf,0xc1,0x45,0x07,0x70,0x3e,0x2d,0x90, +0x1a,0x55,0x94,0x40,0x16,0x88,0x2a,0x13,0xc1,0x75,0xa5,0x97,0xb0,0xc8,0x9b,0x4e, +0xa8,0xb8,0x11,0x7f,0xbc,0xb5,0x57,0xce,0x09,0x5c,0xdc,0x51,0xdb,0x1d,0xa5,0x52, +0x92,0x22,0xb5,0x7e,0x65,0xce,0xa5,0x5e,0x79,0xa4,0xfe,0xfc,0x7f,0x74,0xab,0x2c, +0x7d,0x79,0xd5,0xcf,0x53,0x5e,0x71,0x4b,0xe9,0xfa,0xaf,0x7d,0x0f,0x75,0x47,0x7e, +0x5c,0x29,0x8d,0x4b,0x58,0x20,0xe7,0x3b,0x69,0xbd,0xd5,0x52,0x5a,0x76,0xdb,0x83, +0xa8,0x54,0x7b,0x8b,0xe0,0x36,0xd1,0x6a,0xbe,0x20,0xae,0xc8,0xdb,0xa7,0x36,0x5a, +0x2e,0xdd,0xb0,0xda,0xda,0xbe,0x56,0xec,0xe9,0x89,0xdf,0xd8,0x4c,0x98,0xc7,0xab, +0xe9,0xa1,0x10,0x3d,0x27,0x4f,0x6f,0xae,0x28,0xfc,0xd7,0xa7,0x0b,0x62,0x77,0x09, +0x50,0x10,0x6c,0x2e,0x37,0x32,0x28,0x09,0xe3,0x50,0x02,0x9d,0x90,0xec,0x18,0x87, +0x82,0x03,0xea,0x1b,0x54,0xa6,0x4d,0xcb,0x86,0xaf,0xd0,0x62,0x25,0x6d,0xcf,0x90, +0x85,0x97,0x88,0x99,0xb4,0x2b,0x18,0x15,0xe4,0xc8,0x78,0x5b,0x9c,0xe7,0x31,0xb3, +0x80,0xa3,0x89,0x1e,0x37,0xa4,0x8a,0xaa,0x6b,0xc4,0xc9,0xa5,0xd1,0xdb,0x11,0xfb, +0x67,0xcc,0x2e,0x07,0x17,0xaf,0xf9,0xb7,0xf8,0x8d,0x31,0x34,0x74,0x69,0xa0,0x3a, +0x5f,0x0c,0x73,0x7d,0x6e,0x31,0xb4,0xe7,0x48,0x4e,0x30,0x67,0xdf,0x19,0x95,0xb0, +0x85,0xcd,0xea,0xcf,0xcb,0x54,0x18,0x36,0x0f,0x87,0x80,0x66,0xb7,0x1a,0x69,0xa1, +0x27,0x0c,0xf2,0xaf,0x9e,0xe4,0x75,0xc3,0x67,0x06,0xa8,0x63,0xf2,0x4d,0xcf,0xa3, +0x8f,0x88,0x4a,0x6b,0x4f,0x16,0xe4,0xc9,0x45,0x8f,0xc7,0x95,0x74,0x82,0x96,0x68, +0x3f,0xcf,0x21,0xec,0xfd,0x57,0x12,0x3b,0xc1,0xab,0xcd,0xcc,0xde,0xeb,0xc9,0x9e, +0x7c,0x1a,0xae,0x2e,0x93,0x96,0x47,0xd3,0xcb,0xa6,0xc2,0xbc,0x58,0xe0,0xdb,0x6d, +0x77,0x91,0x1c,0xf7,0x9c,0xd1,0x98,0x8e,0x19,0xd4,0x06,0x4d,0x9f,0x1d,0x72,0xa9, +0x28,0x90,0x90,0xaf,0x1d,0xf4,0x80,0xb2,0x62,0xd0,0xe1,0x7f,0x7e,0x8e,0x02,0xea, +0x46,0x01,0xc1,0x76,0x02,0xa8,0xb0,0x08,0xb1,0xcf,0x4d,0x8c,0x7a,0xe1,0x12,0xd8, +0x2d,0x3f,0x37,0x66,0x9d,0x79,0x7f,0xfe,0x72,0x5a,0xf0,0x7a,0xfc,0xac,0x1b,0xc9, +0xac,0xbd,0xc8,0x3d,0x25,0x51,0x4b,0x7f,0x4c,0x86,0xb9,0x91,0x7d,0xe3,0x13,0xd9, +0xad,0xff,0x65,0xaf,0x60,0xa0,0xc4,0x3c,0xc1,0xcc,0xc3,0xaf,0x24,0xe0,0xd8,0x00, +0xa4,0xb5,0x50,0x60,0xb1,0x20,0x0c,0x72,0x38,0xcb,0xfe,0x5d,0xd7,0x95,0xb1,0x54, +0xa5,0x31,0x86,0x13,0x3b,0x3b,0x76,0xaf,0x0e,0xde,0x84,0x66,0xaa,0xfe,0x1d,0xe3, +0xa2,0xd0,0xc5,0x85,0xe1,0xbf,0xc1,0x45,0x45,0x5e,0x8d,0x77,0x0a,0xfd,0x81,0x36, +0x70,0xf0,0x29,0x12,0x33,0x70,0xbc,0x81,0x85,0x83,0xdd,0xf7,0xf3,0xfe,0x04,0x86, +0x32,0x99,0x1d,0x81,0xe0,0xbe,0x24,0x6b,0x61,0x96,0x74,0x1f,0x76,0x6f,0xe4,0xce, +0x86,0x1f,0x93,0x8c,0x8e,0x29,0x44,0xc3,0xc6,0x54,0xc4,0x26,0x2b,0x5e,0x2f,0x38, +0x05,0x90,0x25,0xa9,0xd7,0xd6,0xea,0xcd,0x1b,0x77,0xcd,0x95,0x09,0xb7,0x12,0x31, +0x25,0xdf,0xe8,0x27,0xfa,0x26,0x44,0x00,0x63,0x5a,0x85,0xd7,0x17,0x98,0x8d,0x40, +0x97,0xa3,0xf6,0x3a,0x24,0x1a,0x6f,0x19,0xcb,0xde,0xfc,0x50,0xdf,0x9d,0xd2,0x72, +0xfb,0xd4,0xe3,0x78,0xbd,0x59,0xcc,0x5c,0xc8,0x26,0x86,0x6e,0x86,0xf6,0xc0,0x6c, +0x59,0xa8,0x6e,0x67,0x16,0x17,0x17,0x31,0x4d,0xc1,0x8f,0x7f,0x43,0xf5,0xd0,0x93, +0x08,0x80,0xe9,0x56,0x8e,0x9c,0x75,0x59,0xce,0x5b,0xdf,0xfb,0x9d,0x76,0x62,0x4e, +0x13,0xfb,0x98,0xc8,0xdf,0x3f,0x24,0xbf,0x85,0xb8,0xc8,0x0c,0x64,0x93,0xf3,0x7d, +0xad,0xd5,0x42,0x4c,0x03,0xb7,0xe9,0xe4,0x1b,0x69,0x4a,0x81,0xdc,0xbc,0x07,0x8f, +0xe6,0xdc,0x44,0xcd,0xf8,0xe3,0xb7,0xfb,0xb3,0x2a,0x67,0x10,0x0b,0xf1,0x6a,0x5f, +0x92,0xf8,0xad,0xb1,0xde,0xdf,0x68,0xe1,0x9f,0x52,0xa5,0x43,0x97,0xce,0x7e,0x06, +0xe1,0x83,0xd0,0x18,0x1c,0x23,0xd6,0x42,0xcd,0x22,0x14,0xd4,0x59,0x6f,0x98,0x72, +0xfa,0xdc,0x8d,0x96,0x91,0x29,0x14,0x4b,0xe0,0xcb,0xc1,0xc9,0x32,0xe3,0x29,0xf2, +0x0c,0x0f,0x85,0x1d,0xb0,0x80,0x01,0x43,0x69,0x44,0x79,0x04,0x55,0x42,0xf1,0x6a, +0x91,0x4c,0xd3,0xea,0x32,0x63,0x66,0xd3,0xbe,0x03,0x61,0x47,0x53,0x67,0x43,0xa6, +0x80,0xd0,0xa2,0x40,0x11,0xa4,0x28,0xe2,0xca,0x1c,0xd0,0x59,0xb9,0x20,0x28,0x4b, +0xf3,0x8e,0x08,0x84,0x30,0x21,0xc7,0xa8,0x45,0x7c,0x7c,0x0a,0xf0,0x98,0xd6,0xb1, +0xe3,0x09,0xc7,0x6d,0x12,0x58,0x0b,0x9e,0x61,0x04,0xeb,0xd5,0x52,0xc9,0x4d,0xb3, +0x01,0xd3,0x70,0xa9,0x13,0xdc,0x69,0x37,0x3f,0x05,0x81,0x1b,0xf7,0x61,0x92,0xe0, +0x50,0x45,0x9a,0x0c,0x1e,0xf1,0xd2,0x15,0x78,0x0a,0x01,0xce,0x5e,0x61,0x72,0x3f, +0xf4,0x06,0x06,0x3c,0xb8,0xd3,0x02,0xd3,0xcb,0x6d,0xc5,0x5e,0xfd,0xa4,0xfc,0x01, +0x2d,0xf6,0x69,0x29,0x9e,0xb3,0x86,0x1d,0x35,0xc5,0x93,0x09,0x5a,0x6e,0x9b,0xe9, +0x29,0xda,0x4b,0x70,0x0e,0x69,0x92,0x46,0x6a,0x09,0x7b,0xb8,0x5b,0x6f,0x12,0xaa, +0x2e,0x4e,0x4c,0xb4,0xf6,0x97,0x9d,0x5c,0xc8,0x64,0xda,0xcb,0xbb,0x63,0x70,0xa7, +0x0d,0x2d,0x87,0xb7,0x1d,0x24,0x22,0xfa,0x48,0xa9,0xd0,0x7d,0xf8,0x60,0x58,0x61, +0xf9,0x00,0xdb,0xa0,0x37,0x6c,0xef,0x0b,0x8b,0x0e,0xb3,0x2d,0x7c,0x63,0x42,0xdb, +0x5f,0xd8,0xcb,0x79,0x9d,0xb6,0x01,0x69,0x68,0x49,0x91,0x60,0x9a,0x6a,0xbb,0x66, +0x04,0x16,0x0a,0xe6,0xbd,0xc6,0x9a,0x59,0xcd,0x12,0xf4,0xba,0x5f,0x32,0x26,0x15, +0x62,0xf1,0xd6,0xf4,0x4d,0x9e,0x1e,0x76,0x2b,0x55,0x92,0xd6,0x52,0x31,0x25,0x70, +0x01,0xed,0x8d,0xa0,0x51,0xcd,0xd8,0x8b,0x1d,0x5b,0x08,0x92,0x72,0xa6,0x9d,0x73, +0x23,0x10,0x2d,0xe7,0xd3,0xd6,0xc9,0x48,0xca,0xc8,0x29,0xd7,0xd2,0x63,0x5e,0x85, +0x01,0xf7,0x53,0x3b,0x66,0xe3,0x58,0xf5,0x01,0x94,0x5a,0xb9,0x2f,0xfc,0xb7,0xaf, +0x56,0xea,0xbc,0xb6,0xd1,0x60,0x24,0x72,0x6a,0xf5,0x96,0x5d,0x51,0x76,0x25,0xf6, +0x8f,0x1b,0x05,0xb6,0x30,0x12,0x2d,0x63,0xeb,0x96,0xd8,0x2d,0xad,0x9e,0x2d,0xe6, +0xca,0x1a,0x49,0xaa,0x92,0x47,0x07,0xec,0x40,0x51,0x12,0x44,0xd1,0x74,0xb3,0xea, +0x69,0x98,0xf8,0x8b,0x99,0xe7,0x16,0x55,0x79,0x83,0xf6,0xb2,0x31,0x77,0x0e,0x64, +0x69,0x5b,0x2e,0xee,0x5b,0x3d,0x7e,0xbb,0x4b,0x1b,0xfe,0xa2,0x56,0x74,0x7f,0xeb, +0x8c,0xe1,0xdd,0xd8,0xc4,0x95,0x37,0x2d,0xa3,0x18,0x23,0x5d,0x3e,0x75,0x90,0x86, +0x2b,0x13,0xf1,0x9a,0x18,0xe2,0x1d,0xd4,0x6b,0x7f,0xc7,0xb9,0x55,0x76,0xd9,0x28, +0x1a,0x1a,0x1d,0xcf,0x45,0x39,0x5a,0xf8,0xc9,0x1c,0x02,0xec,0x0d,0x26,0x8e,0x05, +0xd7,0x1b,0x0e,0x00,0x90,0x7c,0x4f,0x7a,0xeb,0x55,0x01,0x08,0x0c,0x3d,0xe4,0x77, +0x5f,0x11,0x1a,0x49,0xc1,0xc1,0x9d,0x1d,0x0b,0xf1,0x05,0x69,0x97,0xec,0xf9,0xb5, +0x0a,0x96,0xaf,0xde,0xba,0xb4,0x05,0x06,0x48,0x59,0x5f,0x28,0x16,0x7f,0x5e,0x04, +0xe5,0x03,0xa4,0x4e,0x6f,0xcd,0xaf,0xbe,0xc6,0xc4,0x0f,0x44,0xd6,0x34,0xf1,0x25, +0x3a,0x88,0x68,0xdb,0xa5,0x5c,0xbb,0x92,0x11,0x21,0x3c,0xc6,0x73,0xee,0x05,0xf0, +0x08,0xc3,0x7e,0x67,0xe3,0x47,0x6e,0x41,0xea,0x84,0xb9,0xc5,0x75,0xe9,0x77,0xab, +0x8d,0x38,0xf1,0xc3,0x17,0xa7,0xf9,0xf2,0xbf,0x85,0xd9,0x35,0x76,0xee,0x3a,0x0a, +0xa5,0x82,0xf1,0xbe,0x96,0x5f,0x38,0x74,0xe5,0xc2,0x88,0xe4,0x57,0xe3,0x72,0x06, +0x24,0x7d,0xd2,0xa9,0xe0,0x2e,0xcc,0x62,0xe4,0x87,0x80,0x52,0xbe,0x2c,0xd7,0x23, +0x27,0x79,0xe5,0xc3,0x9e,0xbe,0xf9,0xcf,0x27,0xc9,0x4a,0x85,0x7a,0x1b,0x09,0x64, +0xa2,0x8a,0xf1,0x6b,0x7c,0xe3,0xe6,0xa0,0xac,0xd0,0x15,0xe5,0xd3,0xef,0x22,0x2e, +0xe7,0xcc,0x2c,0x6c,0x3f,0x08,0x36,0x28,0x48,0x84,0xa4,0x4c,0xab,0x65,0x8e,0x74, +0xae,0xc8,0xad,0x9c,0xf1,0xa0,0x21,0x7f,0x6f,0xc4,0xc2,0x19,0x88,0xe6,0x19,0xbb, +0x58,0x25,0xf9,0x4e,0x3f,0xae,0x37,0x6d,0x86,0x88,0x67,0xad,0x08,0x42,0xd4,0x69, +0x2a,0x9b,0x93,0xe0,0x1f,0xaf,0x75,0xc7,0x4d,0x30,0xdb,0x3d,0x76,0xe6,0x99,0x35, +0x7b,0x73,0xd8,0xfe,0xf2,0x03,0x71,0xac,0xfe,0xca,0xf1,0x1d,0x3b,0x6a,0xf5,0xba, +0x0e,0x8b,0xf1,0xc7,0xe6,0xa2,0x02,0x3c,0xbb,0x83,0x60,0x4e,0xa4,0x12,0x03,0x7c, +0xef,0x83,0x47,0x2d,0x65,0xec,0x7b,0x8d,0xad,0xee,0xf2,0xaf,0x9a,0x43,0xdd,0x3a, +0x2e,0x70,0x2b,0x27,0xc5,0xa2,0xce,0xbd,0x3f,0xc9,0x6b,0x82,0x97,0xae,0xd0,0x72, +0x2c,0x9f,0xfc,0x96,0x68,0x47,0x27,0xc0,0x97,0xb5,0xec,0xaf,0xf6,0x24,0x4c,0xd3, +0xd0,0x9c,0x69,0x6a,0xb5,0x4a,0xc7,0x95,0xc4,0x2e,0xe6,0x8e,0xd6,0xea,0x8d,0x03, +0x21,0xd2,0x1d,0xe1,0x4a,0xff,0x0d,0x58,0x48,0xdf,0x69,0xb7,0x57,0x97,0x67,0x68, +0x06,0x95,0x23,0x7a,0x18,0x08,0x89,0xd1,0x56,0xb6,0xfc,0xd1,0x77,0x27,0x31,0x22, +0x60,0xf1,0xb1,0x24,0x9a,0x3f,0x54,0xb6,0xc5,0x96,0xf4,0xe6,0x76,0xf4,0xd8,0xb0, +0xc5,0x76,0x3a,0x34,0x9b,0x3e,0x75,0xb4,0x73,0x0e,0xfc,0xf6,0x77,0xf5,0x5d,0x71, +0x8c,0xb4,0xb1,0x25,0x1a,0x3d,0xe8,0x2d,0xe0,0xf6,0xf5,0xe7,0xf6,0xf6,0x6e,0xf4, +0x06,0x68,0xe7,0x35,0x1b,0x3c,0xcb,0x0e,0xc6,0x6c,0xfd,0xf7,0xf7,0xf7,0x2a,0xf1, +0x8d,0x10,0xbe,0x76,0xd0,0xfa,0x0e,0x41,0xc0,0xd5,0xe9,0x4c,0xfe,0x2c,0xee,0x43, +0x68,0xdb,0xed,0x9c,0x21,0xbf,0x92,0x3e,0x2d,0x49,0x1f,0x5c,0xf8,0x89,0xa7,0x69, +0xd3,0xd9,0xea,0x64,0x9e,0xba,0xce,0x8c,0x4d,0xa5,0xe3,0xcd,0x7e,0x2e,0xe0,0x14, +0x2f,0xd3,0x8f,0xca,0x1c,0xb0,0x27,0xbf,0x6a,0x79,0x85,0x4c,0x8c,0xe0,0x7c,0x9a, +0x0f,0x7c,0x62,0x2c,0x92,0x37,0xca,0x6e,0x71,0xc9,0xf6,0xee,0x7e,0xfc,0xee,0xd8, +0xd8,0xdc,0x29,0xa1,0xbd,0x44,0xff,0xdf,0x69,0x27,0xfe,0xfe,0x7f,0xfd,0xd8,0xbb, +0xa1,0x97,0xaf,0x2d,0xc1,0xfc,0xc8,0x8b,0xa8,0xdf,0xf7,0xef,0xfe,0xfe,0x55,0x59, +0x27,0xce,0xc7,0x58,0x48,0x34,0x9a,0x88,0xdf,0xb3,0xff,0xff,0x94,0x54,0x26,0x59, +0x6e,0xa4,0x82,0xf1,0x58,0xb1,0x16,0x11,0x78,0x02,0x82,0xdc,0xbb,0x24,0xb0,0xe3, +0x3b,0x11,0xb6,0x28,0x32,0x61,0x26,0x19,0x29,0x4c,0x58,0xdc,0xef,0xec,0x8a,0xa9, +0xb3,0x59,0x87,0x28,0xd8,0xf3,0x4c,0x6d,0x21,0x4d,0xaf,0xc7,0xb2,0xf7,0xb1,0xe2, +0xb7,0x98,0x8f,0x2c,0x99,0xd4,0x0f,0x53,0xa1,0x4c,0xe7,0x94,0x3a,0x20,0x1a,0x41, +0xa1,0xb4,0xc8,0x54,0xc6,0x07,0x09,0x30,0x44,0x7f,0x8c,0x92,0x42,0xab,0x11,0xd6, +0x02,0xc5,0xca,0x36,0xec,0x67,0x0c,0x6f,0x65,0xe8,0xf2,0xa4,0x0f,0x64,0x81,0xa9, +0xfe,0x44,0x66,0xe1,0x10,0x4a,0x89,0x21,0x82,0x92,0xb1,0x67,0x87,0x6b,0x6f,0xf4, +0xa9,0xa3,0x90,0x01,0x7a,0x04,0xc8,0xf5,0xf0,0x8f,0xe1,0x71,0x56,0xd5,0xf6,0xf1, +0xfb,0xac,0x84,0x20,0x10,0x7d,0x6c,0x2e,0xa9,0xcb,0xed,0x3f,0x17,0x39,0x82,0xf5, +0x28,0x52,0x81,0x6e,0xe6,0xf6,0x24,0xe9,0x20,0x83,0xd3,0x7c,0x5d,0x41,0xce,0x48, +0x40,0x90,0x43,0xe5,0xcf,0x22,0x3b,0xad,0xfb,0x3d,0xad,0x01,0x57,0xcc,0xbd,0xe4, +0xa8,0xd0,0xf4,0xe7,0x9f,0x30,0x43,0x30,0x20,0xa1,0x0b,0x4e,0xed,0x29,0x10,0xec, +0x42,0x7d,0xba,0x6b,0xf3,0x6f,0x6c,0xc9,0xe9,0x29,0x8b,0x84,0xbf,0xae,0x12,0x5c, +0x43,0xbc,0xcc,0x75,0x33,0x06,0xcb,0xfc,0x34,0xc1,0x83,0x94,0xbe,0x7f,0x45,0x75, +0x63,0xdf,0xbb,0xc9,0xe5,0xa2,0x6d,0xcd,0x69,0xbb,0x92,0x8d,0xd2,0xac,0x5f,0x76, +0xc3,0x5e,0xab,0x1a,0xdb,0x22,0x01,0x68,0xa3,0x5e,0x51,0x9d,0xe7,0x69,0xd9,0x04, +0x13,0x0e,0x3e,0x00,0x03,0x99,0x81,0x67,0xaa,0x9a,0x85,0xd4,0x2c,0x79,0xb6,0x78, +0x56,0xde,0x3e,0x35,0x21,0xf4,0x0a,0xd2,0x9e,0xfc,0x84,0x18,0x90,0xde,0x0d,0x95, +0x93,0x69,0x8d,0x90,0x83,0x19,0x5d,0xed,0x09,0x83,0x9a,0xd6,0xc0,0xfd,0x37,0x13, +0x2c,0x93,0x5d,0xe6,0xc1,0x5d,0x0a,0x35,0xd2,0xb3,0x8e,0xc6,0x81,0x1f,0x14,0x44, +0x11,0xce,0xa4,0xb2,0xbd,0x82,0x95,0xc0,0x4e,0xde,0xce,0xe6,0xe0,0x7c,0xdb,0xc3, +0x05,0x16,0xd6,0xd5,0x12,0xb7,0xa3,0x83,0x0d,0xf6,0x13,0xbb,0xf1,0x19,0x4d,0xd5, +0x6a,0x35,0xcd,0x49,0x5b,0xbc,0x6b,0x49,0x8a,0x05,0xd3,0x97,0x0d,0x34,0x17,0xff, +0xcb,0x06,0x94,0xd2,0xf7,0xfa,0x08,0x0f,0xe5,0x4c,0xdf,0x97,0x0c,0x7c,0x7e,0xfb, +0x6b,0x13,0xe4,0x85,0x39,0x88,0x2e,0x2c,0x5b,0x1e,0xf1,0x6c,0x2a,0xf3,0x53,0x13, +0x56,0x82,0x0e,0x5c,0x7d,0x3a,0x4a,0xab,0x0b,0x1a,0xc3,0x60,0xd8,0xd0,0x87,0xe8, +0xfa,0x58,0xde,0x70,0x5d,0xbc,0x1f,0xbd,0x20,0x39,0x26,0x9c,0x88,0x38,0xd4,0xa3, +0xaf,0x21,0x1b,0x98,0xbf,0x61,0xdf,0x51,0x46,0x19,0x8e,0x5d,0xa9,0xf0,0x86,0x21, +0x7d,0x11,0x2a,0x5e,0x36,0x34,0x5c,0x8a,0x99,0x39,0xd0,0x04,0x19,0xbc,0x8e,0x31, +0x3e,0x10,0x4b,0xd4,0x5c,0x2a,0xbd,0xb8,0x11,0xd0,0x84,0x0a,0x7d,0x66,0x39,0xe1, +0xca,0xbe,0x40,0x25,0xd5,0xf5,0x6f,0x2e,0x34,0xc3,0xf7,0xfd,0x1b,0x65,0xb0,0x22, +0x24,0xb2,0x27,0xf8,0x3b,0xbf,0x06,0x09,0x0c,0x1d,0xb6,0xbd,0xb1,0x82,0x14,0x86, +0x7a,0xd7,0x5c,0xc1,0x12,0xc0,0x2e,0xea,0x67,0xa0,0xed,0xb2,0xbf,0x31,0x77,0xed, +0x7a,0x84,0x72,0x60,0x34,0x11,0xf6,0x1e,0xac,0x90,0x9e,0xe7,0x69,0x4c,0x94,0xdb, +0x30,0xf8,0x5b,0x47,0xe2,0xb9,0xf1,0xef,0x2a,0x66,0x08,0x9b,0x3f,0x53,0xf2,0x3d, +0x83,0x49,0x69,0xfe,0x92,0xb8,0xd5,0xa0,0xd6,0xc9,0x2c,0xf0,0x1f,0x29,0x74,0xd0, +0xff,0x8f,0x9f,0x01,0xff,0x2e,0xb0,0x8b,0x53,0x69,0xd0,0x3f,0xf7,0x86,0x16,0x6a, +0x5d,0xc7,0x28,0xbf,0xc3,0xbe,0xe2,0x01,0x73,0xca,0x18,0xef,0xd2,0x84,0xe1,0x02, +0x72,0x0b,0x86,0xaf,0x14,0x69,0x21,0x81,0xc0,0xfd,0x35,0xb7,0xa8,0x84,0x34,0x57, +0x26,0x78,0xb7,0x31,0x20,0xb7,0x65,0xfb,0x2e,0x94,0x51,0x57,0x55,0x8b,0x60,0xe7, +0x66,0x23,0x7a,0x98,0x0e,0x65,0xae,0x59,0x78,0x8a,0xfa,0x56,0x3f,0xed,0x19,0xd7, +0x72,0x80,0xfe,0xd9,0xf4,0xea,0x01,0x86,0xa6,0x78,0xe0,0x10,0x37,0x58,0x2b,0xaa, +0x74,0x10,0x63,0xe7,0xf0,0xa2,0x6a,0x41,0x27,0x1b,0xa5,0x13,0x37,0xae,0xf0,0x2c, +0x8b,0xa1,0xf2,0xfb,0x5b,0xb9,0x1d,0xea,0xf1,0x66,0xc5,0x38,0x7c,0x44,0x8e,0xd9, +0x7e,0x84,0x5a,0xa1,0x93,0x21,0x64,0x08,0xb1,0x61,0xf0,0x0c,0x7d,0x2e,0x7b,0x21, +0x2c,0x50,0x13,0x99,0x19,0xb6,0x44,0xde,0x91,0x10,0x2b,0x0d,0x65,0x64,0x61,0x54, +0xfe,0x3a,0x06,0xa0,0x7f,0xf8,0x26,0xce,0x39,0xa0,0x1f,0x1c,0xd9,0x48,0x15,0x66, +0x47,0x1e,0xc4,0x1f,0xb7,0xb4,0xbb,0x93,0xa6,0xc5,0xdb,0x95,0x36,0xc5,0x59,0xf0, +0xcf,0xa1,0x52,0xb9,0x0c,0xb4,0x6d,0x9f,0x93,0xb5,0xca,0x97,0x04,0xb2,0xf3,0x04, +0x24,0xd1,0x77,0x78,0x7d,0x80,0x02,0x17,0x13,0x0e,0xc4,0xb4,0x35,0x51,0x1b,0xaa, +0x29,0x89,0x25,0x7a,0xe8,0xf0,0x0d,0x92,0x86,0x2d,0xe8,0xb6,0x55,0x72,0x39,0xef, +0x44,0x3c,0xa9,0xe7,0x54,0x1c,0xe9,0x20,0x44,0x6c,0xae,0xb5,0x22,0x5e,0x34,0x59, +0xcf,0x65,0xde,0x2e,0xba,0x7b,0x29,0x26,0xac,0x17,0xe6,0xe2,0x89,0x79,0x70,0x5a, +0xa5,0xf9,0x40,0x2b,0x71,0xce,0xea,0x32,0x3b,0xb9,0x46,0x72,0x4c,0x90,0x07,0xc3, +0xa5,0xd6,0xf5,0xe2,0xea,0x6d,0x4b,0x52,0xe0,0xcd,0x21,0x19,0xc5,0xf0,0x6f,0xb1, +0x4c,0xc6,0xbe,0x2e,0xc4,0x2c,0x43,0x57,0x2d,0xc4,0xf5,0xe3,0x70,0xf6,0x72,0x79, +0x0a,0x83,0xb3,0xfd,0x04,0xd4,0x4d,0xc5,0x10,0x27,0xa5,0xd7,0x5f,0xfa,0x2e,0x9a, +0x2d,0x99,0xb2,0x06,0x56,0xb6,0x69,0x41,0xdc,0x4a,0xe3,0x62,0x94,0xe8,0x1e,0x0f, +0xec,0x1d,0xc1,0x5f,0xbd,0xfa,0x8e,0x17,0x1b,0xe7,0xed,0x81,0x84,0xb8,0x15,0x68, +0xdd,0x10,0xad,0xec,0x85,0x3e,0x44,0x53,0x5c,0x99,0xc7,0x3b,0xc6,0xbb,0xd9,0xaa, +0x7e,0xde,0xd5,0x4a,0x25,0x83,0x48,0x5f,0x68,0xc7,0xaf,0x1a,0x19,0x7e,0xff,0x58, +0xa2,0x1d,0x54,0xbe,0x33,0x7f,0xea,0x66,0x69,0xc6,0x80,0x2e,0x4c,0x56,0x3a,0xbf, +0x0f,0x31,0xc3,0xd6,0x8d,0x75,0x69,0x2b,0xe2,0xdf,0x97,0xa8,0xbe,0xf3,0x57,0x4b, +0x0c,0xdd,0xcf,0xcb,0x5e,0xa4,0x75,0x7f,0xd4,0x94,0x45,0x9f,0xab,0x56,0x4a,0x60, +0x14,0x1b,0x80,0x66,0xe7,0x45,0xeb,0xd3,0x74,0x2c,0x2b,0xaa,0xbb,0xf1,0x8c,0xd0, +0x05,0xc1,0x59,0xfa,0x09,0x25,0x7a,0x32,0x40,0x80,0x50,0x47,0x5a,0xe8,0x59,0x77, +0x0d,0x84,0xb9,0x28,0x2f,0xff,0x2f,0x0d,0xa1,0x46,0x7d,0x56,0xa8,0xc4,0x99,0x63, +0xb2,0x08,0x8b,0x04,0xa5,0x27,0xd9,0xd9,0xb4,0x4e,0xb9,0xdf,0x38,0xf2,0x40,0x33, +0x72,0x0b,0x85,0x57,0x59,0x95,0x45,0x13,0x7a,0x4f,0x8a,0x9e,0x3a,0x55,0x88,0xb8, +0x76,0x8e,0x02,0x94,0x0f,0x90,0x78,0x12,0x13,0x41,0xc0,0x1d,0xba,0x3f,0xf5,0x32, +0xfa,0x09,0xff,0x7c,0x1d,0x80,0xd1,0x70,0xf2,0xb6,0x11,0x8c,0xa5,0x6b,0x41,0xb3, +0xe0,0x47,0xde,0x6a,0xe3,0x65,0x74,0x02,0xe2,0xc6,0xff,0x5c,0x70,0xe2,0xf8,0xe0, +0x7f,0xc5,0x2e,0x67,0x39,0xf8,0x0a,0x34,0x2b,0x97,0x88,0x2e,0xca,0x60,0xe8,0xd8, +0x11,0xf4,0x37,0x43,0xcc,0x74,0x40,0xc7,0x23,0x98,0xbc,0x05,0x5e,0x6d,0xfc,0x4e, +0xbb,0x71,0xfc,0xf5,0x98,0xd6,0x05,0x14,0x23,0xbb,0x92,0x3e,0xa8,0x40,0xa7,0x8b, +0x99,0x03,0x20,0x99,0x9d,0x3a,0x65,0x05,0x49,0xdb,0x5e,0xfa,0xea,0xa0,0x54,0x75, +0xe1,0xfd,0x1c,0x88,0x52,0x9d,0x91,0x97,0xab,0xef,0xf4,0x8e,0x66,0xc3,0xd9,0x49, +0x3f,0xad,0xea,0x3e,0xe3,0x5c,0x0d,0xfc,0x70,0x28,0xe4,0x54,0xd6,0xcb,0x79,0xf8, +0xfe,0xa1,0xe3,0x33,0xd2,0xbf,0x9c,0x97,0xcc,0x75,0xc0,0x1f,0x31,0x7f,0xda,0x7a, +0x8a,0x4e,0x7c,0x71,0x9d,0xc4,0x53,0x64,0x49,0x6b,0x12,0xbd,0x98,0x2d,0x30,0x04, +0x2b,0x27,0xb3,0xa8,0xc9,0x53,0xbb,0x90,0x68,0xff,0xce,0xa6,0xc3,0xa9,0x51,0x60, +0xcc,0x7f,0xb3,0x07,0x76,0xba,0x8f,0xc3,0x2a,0xdb,0xa2,0x8d,0xbb,0x78,0x3f,0x69, +0xd7,0xdd,0xe3,0xe7,0x43,0x5c,0x82,0xd3,0x9e,0xfd,0xf4,0x65,0x9e,0x1e,0x54,0x68, +0x67,0x1b,0xad,0x7f,0xc0,0x25,0x19,0x42,0xdd,0xfe,0xa3,0x68,0x90,0x77,0xd5,0xb3, +0x16,0x78,0x0b,0xb8,0xcf,0x95,0xb8,0x93,0x12,0xa2,0xce,0x06,0x74,0xd7,0x8c,0x39, +0x59,0x1c,0x95,0xc1,0xda,0x16,0x54,0xe1,0x50,0x3f,0x85,0x25,0x75,0xf5,0x23,0x11, +0xa1,0x7d,0xfd,0x3a,0x47,0x74,0x6b,0xcc,0x20,0x56,0xfe,0x61,0xf1,0x81,0xd4,0xee, +0x97,0x55,0xb5,0xf2,0x5a,0x74,0x07,0xf0,0x44,0x51,0x51,0x05,0x80,0xd6,0x01,0xfa, +0x1b,0x93,0x8e,0x88,0xb1,0xca,0xdc,0xb8,0x83,0x09,0xef,0xdf,0x08,0xf1,0xa3,0x9a, +0x25,0x02,0xb4,0x03,0xc6,0xb4,0x78,0xda,0x9a,0x35,0x27,0xcc,0xf9,0xff,0xfd,0x76, +0xae,0xe0,0x47,0x64,0x6c,0x56,0x20,0x85,0x11,0x39,0xb7,0x27,0xf9,0xbb,0xd4,0x8d, +0x9a,0x80,0x6c,0x63,0x34,0x79,0x20,0x2a,0xfe,0xd0,0xbf,0x7d,0xa7,0x39,0x8b,0xa2, +0xcb,0xa3,0xbe,0xe8,0x3c,0xc6,0x7e,0x92,0x83,0xcd,0x47,0x68,0x49,0xc7,0x28,0x10, +0x28,0x3e,0x31,0xa2,0x15,0x48,0x79,0xd5,0x00,0x8c,0x01,0x88,0x18,0xfd,0x74,0x1c, +0x5b,0x70,0x5c,0xb2,0xd2,0x33,0x2f,0xcd,0x36,0x0f,0x17,0xfd,0xc7,0x3c,0x74,0x35, +0xab,0x5d,0x5c,0xf3,0xc7,0x0a,0x5b,0x08,0x97,0xba,0xc9,0xd1,0x10,0x2e,0xf1,0xa2, +0x24,0x63,0x80,0x0a,0xfd,0x0a,0xf0,0xca,0x44,0xcd,0x08,0xb5,0x2c,0x4d,0x71,0xef, +0xe2,0x5a,0x66,0x92,0x6a,0x50,0x65,0x33,0xc5,0x01,0xc0,0xbe,0xf0,0x68,0x41,0x44, +0xc4,0x8f,0xeb,0x06,0x6f,0x57,0xc8,0x04,0x65,0xbd,0xa2,0x57,0x54,0x4d,0x01,0xee, +0x26,0xc1,0x00,0x69,0x00,0xdf,0x7f,0x1f,0x8f,0x92,0x99,0xa4,0x76,0xeb,0x30,0x67, +0x02,0xa8,0x28,0xc4,0x9e,0x14,0x76,0x00,0xb9,0x79,0xad,0xc6,0xf7,0x6d,0x50,0xb2, +0x03,0xa9,0x6c,0xa7,0x67,0xf5,0x21,0xb7,0x24,0xe5,0x33,0x49,0x27,0x30,0x0f,0xc1, +0x0e,0x26,0xd9,0xb4,0xe6,0xad,0x9d,0xfc,0xc7,0x66,0xf5,0x87,0xd7,0x49,0x07,0x74, +0x26,0x8c,0x5a,0xf6,0x6b,0xe4,0x81,0x08,0xaf,0x56,0x6c,0xf3,0x8c,0x71,0x7f,0x81, +0x0a,0xb2,0x1d,0x41,0xf5,0x42,0x12,0xe9,0xa5,0x22,0x34,0x5d,0x2c,0xa7,0x51,0x35, +0x5e,0xdc,0x3d,0x64,0x6b,0x06,0x61,0x3a,0x25,0x03,0xda,0x3c,0x87,0xe4,0x5e,0xf3, +0x22,0x31,0x63,0xe7,0x2d,0x05,0x15,0xe7,0x6f,0x4f,0xb2,0x5c,0xa4,0xa5,0xe6,0xe6, +0xac,0x50,0x38,0x0c,0xd6,0xfa,0xc4,0x41,0xa7,0xc4,0xc4,0x78,0x20,0x5d,0xe2,0x09, +0xc5,0x21,0xd5,0x76,0x6d,0xac,0x0c,0x52,0xaf,0x6f,0xd4,0x46,0x15,0x48,0x58,0x49, +0xac,0xfc,0xbe,0x41,0x39,0x18,0xeb,0x39,0x46,0xcb,0x34,0x6d,0x67,0xf7,0x29,0xba, +0x2d,0xce,0x23,0x4b,0xae,0x7a,0xe6,0x98,0xf2,0x6e,0xe2,0xbb,0x16,0xdf,0x15,0x63, +0x6e,0x20,0x7e,0x60,0xab,0xed,0x5f,0x6f,0x6e,0x30,0x3b,0x96,0xfd,0x64,0x9e,0xe2, +0x2c,0x52,0xfd,0xdd,0x37,0x70,0x14,0x48,0x15,0xc6,0xed,0xa6,0xd5,0x2f,0x51,0xe1, +0x6a,0x35,0x13,0xd9,0x33,0xaa,0x76,0xb3,0x0c,0xa0,0xbc,0x4f,0x71,0xb3,0xb5,0xf1, +0x1b,0xcd,0x0c,0xf9,0x21,0xce,0x7d,0x8e,0x0d,0x83,0x01,0xc5,0x0b,0x69,0xe4,0x71, +0x45,0x32,0x36,0xf5,0xd4,0xbb,0x65,0xa7,0xe3,0xc8,0x3d,0x9f,0x24,0x2e,0x3d,0xac, +0xcd,0xa5,0xb4,0xd9,0xb2,0x1b,0x2a,0x42,0x47,0x70,0x58,0x74,0xd6,0xfc,0xdb,0x03, +0xda,0xfb,0x5f,0x34,0x5f,0xf6,0xb6,0xe1,0x53,0x3f,0xef,0x85,0x07,0xfe,0xdc,0x7f, +0x4d,0x87,0x41,0x43,0xb2,0x3d,0xe0,0x32,0x2e,0xa7,0x75,0xe5,0xf4,0x56,0x0b,0x07, +0xa4,0xc5,0x93,0x73,0x42,0x14,0x5b,0xdf,0xf4,0x95,0x7d,0xe6,0xcb,0x57,0x68,0x0e, +0x17,0x5c,0xfe,0x8a,0xb5,0x68,0xad,0xc8,0x4d,0x88,0x9d,0xf5,0x81,0x44,0x91,0x2a, +0xd2,0x36,0x55,0xb9,0x9c,0x46,0x66,0x3f,0x25,0x08,0xc6,0x99,0x84,0xf6,0x35,0x75, +0x47,0x6b,0x67,0x67,0xbc,0xb7,0x31,0x96,0x05,0x2b,0x77,0x47,0xfc,0x67,0xbc,0xe8, +0xe6,0x1a,0x03,0x10,0x56,0x0a,0x1f,0xa6,0xeb,0xc0,0x9f,0xb3,0xfb,0xe0,0x3c,0xe8, +0x46,0xad,0xb2,0x3d,0x14,0xfd,0xbf,0x5d,0x8f,0x73,0xe7,0xec,0x96,0x5c,0x38,0xf2, +0xc4,0xf9,0xfb,0xad,0x07,0xd1,0xb0,0xc2,0x86,0x4c,0x56,0x8d,0x4b,0xb2,0x19,0xcd, +0xcd,0xcb,0xdd,0x3c,0x8a,0x11,0x23,0x18,0xc8,0x7a,0xe2,0x8c,0xc5,0xe5,0x57,0xe2, +0x54,0x3f,0x89,0x16,0xbc,0x54,0x93,0x68,0xfc,0xd5,0x6f,0xff,0xff,0xff,0x3e,0x3d, +0x68,0x0d,0xf9,0x20,0x73,0x8f,0x42,0x1a,0xab,0x24,0xaa,0x94,0x84,0xcf,0xf3,0xe0, +0x20,0xf0,0xda,0x52,0xfa,0x45,0x60,0x80,0xad,0xee,0x67,0x4e,0x3b,0x6e,0xfe,0x72, +0xf4,0x61,0x96,0xf6,0x14,0xaf,0x81,0xd2,0x44,0xef,0x35,0x01,0xa3,0x62,0x77,0x17, +0xe2,0x26,0x19,0x66,0x86,0x87,0xbd,0x53,0x36,0x26,0x36,0x11,0x38,0x99,0x0b,0xbb, +0xf3,0x87,0x00,0xac,0x55,0xaf,0x68,0x9e,0xee,0x49,0x8e,0xd4,0xe5,0xe9,0xfa,0xf5, +0xf4,0xf8,0x93,0x54,0x9e,0x98,0x40,0x9f,0xaa,0x94,0x21,0x87,0x3d,0xc1,0x75,0xbb, +0x84,0x1d,0xc5,0xa7,0x6a,0x7c,0xae,0x12,0xbe,0xe7,0xaf,0xd4,0xb9,0xa5,0x5b,0x31, +0x3c,0xda,0xaf,0x7c,0x6c,0xba,0x0f,0xac,0x4e,0x05,0xc1,0x58,0x38,0x76,0xd1,0xfb, +0x84,0x49,0x93,0xee,0xf8,0xfd,0x2a,0x0c,0xa3,0x2b,0x22,0x5b,0x56,0xb7,0xf5,0x6b, +0x75,0xa8,0xf2,0x2e,0xe6,0xfc,0xf6,0xab,0x6f,0xe4,0x0a,0xc4,0xd4,0xd2,0x3b,0xf7, +0x24,0x07,0xfb,0x29,0x50,0x70,0xa7,0x4b,0x23,0xc9,0xad,0x4d,0xd6,0x95,0x13,0xf6, +0x60,0xda,0xf3,0x6e,0xd2,0x70,0x4f,0x49,0x49,0x54,0x59,0x0c,0x78,0xca,0x10,0x7f, +0xbd,0xa1,0xa0,0x4c,0xc7,0xad,0x0b,0x4d,0x49,0xdd,0xec,0x44,0xd7,0xca,0xc2,0x2a, +0x69,0xf2,0x31,0xd8,0x20,0x98,0x22,0x7a,0x23,0x0f,0xcb,0xf8,0x44,0x70,0x8a,0x79, +0x7d,0xa1,0x3c,0x12,0x67,0xa4,0x93,0x81,0x3e,0xc3,0x99,0xad,0xf0,0x9b,0x35,0x18, +0x08,0x02,0x30,0xd9,0xa8,0x65,0x02,0x4f,0xcd,0x54,0xe5,0xac,0x56,0xc9,0x7a,0x87, +0x81,0x51,0x15,0x77,0xb4,0xbd,0x2c,0x5b,0xcc,0x5d,0x25,0x20,0x37,0xf2,0x1e,0x8d, +0xca,0x55,0xb4,0xb0,0xda,0x75,0x45,0x61,0x65,0xd1,0x8d,0xf3,0xbb,0x4b,0x3b,0xa8, +0xc8,0x1f,0xd7,0xc3,0x5b,0x56,0xee,0x86,0x41,0xad,0xaf,0x56,0xc0,0xdf,0x37,0x21, +0x24,0xbc,0xb7,0x25,0x3c,0x9c,0xd2,0xde,0x3f,0x8e,0x95,0xb1,0xd8,0xd9,0x9b,0xfd, +0xf6,0xc5,0x9e,0xc5,0x91,0x76,0x0e,0xe4,0x64,0x6f,0x50,0xf7,0x61,0x97,0x6a,0xf8, +0x80,0x90,0xb4,0xa7,0x0b,0x3e,0x97,0x74,0x58,0xe5,0x70,0x87,0x19,0xd3,0xe2,0xfc, +0x4b,0x4c,0x9c,0x01,0xd1,0x16,0x62,0xf8,0xba,0x7e,0xd3,0xcd,0x72,0x6a,0x5b,0xf8, +0xa5,0x2c,0xcf,0xc4,0x8b,0x1f,0x6a,0xd8,0x90,0x57,0x8f,0x06,0xc9,0x1b,0xa2,0xac, +0x4b,0xce,0x22,0xa8,0xd1,0x7b,0x0c,0xaa,0xdb,0x05,0xcc,0x56,0x10,0x69,0x54,0xb6, +0x5f,0xb6,0xda,0x39,0xce,0x55,0xf2,0xcb,0x0f,0xff,0xc6,0xb8,0x50,0x53,0x11,0x28, +0x43,0x5e,0x91,0xef,0x47,0x97,0x0d,0xab,0x7a,0x1b,0x57,0x44,0x8f,0x77,0xab,0xbd, +0x26,0xb6,0x30,0xb9,0x52,0x7f,0x4e,0xca,0x87,0xd2,0x5f,0x54,0xa1,0xfa,0xe4,0xf8, +0x2e,0xb3,0x13,0xdd,0x0a,0x1d,0x41,0x1b,0x40,0xc1,0xe8,0x59,0xb0,0xbf,0x1e,0xab, +0x13,0x9c,0x5d,0x2f,0x47,0x92,0x04,0xde,0x6d,0x46,0x16,0x6f,0x51,0xd0,0x13,0xbb, +0xd4,0xb1,0x69,0xe9,0x5b,0x91,0x84,0x1a,0xc8,0x81,0xa9,0x45,0x75,0xd3,0xcf,0x22, +0x52,0x73,0x1b,0x5f,0x33,0x7d,0x15,0x9b,0x09,0x7f,0x93,0x6e,0xd9,0x75,0x76,0xdf, +0x8b,0xdf,0xa0,0x3b,0x30,0x2b,0x0e,0x87,0x25,0xc4,0x88,0xc9,0x70,0x8e,0x08,0xf8, +0xf0,0x08,0x08,0xe6,0xa1,0x02,0x2e,0x50,0xba,0x6c,0xc1,0xc6,0xd5,0xf7,0x9e,0x8c, +0x31,0x0b,0x91,0x36,0xe0,0x0d,0x50,0x07,0x2d,0xe1,0x56,0x59,0xb5,0xe6,0x09,0x99, +0xa1,0x2e,0xbe,0xe4,0x19,0xe2,0x69,0x17,0xa6,0xc6,0x29,0x06,0xff,0x4c,0x9f,0x80, +0xa7,0x5b,0xd8,0x36,0x1e,0xaf,0xa2,0x8c,0xea,0xc9,0xa2,0xa6,0x5a,0x40,0xa7,0x7e, +0xcf,0x8c,0x28,0xbe,0x5b,0xe7,0x6b,0xf6,0x74,0xcb,0x14,0xe5,0x3d,0xed,0xa1,0xfe, +0x30,0x22,0xf3,0xc3,0xa5,0x63,0xdd,0xf0,0xbe,0x6b,0xbf,0xd7,0x3f,0x2c,0xfc,0x14, +0x66,0x21,0xb0,0xc7,0x96,0x95,0x31,0xf7,0xa4,0x5d,0x7d,0x64,0x90,0x44,0xb1,0x3b, +0xad,0x77,0xf8,0x2c,0x74,0x39,0x24,0x8b,0xa7,0x8c,0xe6,0x5c,0x36,0xeb,0x70,0x7a, +0x71,0x26,0xfc,0x33,0xf6,0xcd,0x44,0x3d,0x69,0x66,0xf1,0x10,0x42,0x64,0x1d,0x32, +0xa2,0x55,0xdd,0x09,0xff,0xff,0x69,0x05,0xa6,0xc9,0xcd,0x8f,0xf8,0x9f,0x8b,0xeb, +0x61,0x58,0x3b,0xef,0x03,0x0a,0x9f,0x59,0x3e,0xae,0xc4,0xc2,0x7d,0x30,0x7a,0xb9, +0x76,0x01,0x22,0xa7,0x46,0x1d,0xb2,0x82,0x52,0x8e,0xcc,0xbb,0xd3,0x4a,0x50,0xa9, +0x37,0x38,0x94,0xfe,0xe8,0x26,0x20,0xe4,0x49,0xd6,0x34,0xca,0xb6,0xf7,0x05,0x96, +0x65,0x1f,0x9d,0xee,0x6f,0x7d,0x2a,0xfb,0xcf,0xde,0x21,0xaf,0xd2,0x4a,0x7e,0x64, +0xbf,0xcd,0x0c,0xdb,0xac,0x25,0x0b,0x8b,0xc7,0xc0,0x17,0xec,0xb1,0xe7,0xf4,0x11, +0x12,0x3d,0x9e,0x36,0xb1,0x1f,0x14,0x48,0x8d,0x73,0x34,0x55,0x5e,0x7d,0x12,0x33, +0x44,0x95,0xba,0xbe,0xde,0xf5,0x67,0xb2,0xad,0x8b,0xe8,0x87,0xd4,0x4e,0x70,0xf3, +0x24,0x8d,0x01,0xa3,0xd7,0x5d,0x2f,0xa1,0x76,0x93,0x66,0x54,0xd6,0x5f,0x4c,0xb7, +0xc6,0x96,0x97,0x27,0x3c,0x1c,0x45,0x81,0x11,0xdc,0x83,0x17,0xdb,0x6c,0x02,0x0e, +0x25,0x3d,0xdc,0x37,0x95,0xe4,0x62,0x66,0x55,0x11,0x72,0x95,0x35,0xfd,0x35,0x66, +0x90,0xf0,0x92,0x77,0x9b,0xb8,0x25,0x62,0x66,0x87,0x3c,0x2e,0xbc,0x78,0xa5,0x2b, +0x42,0xd4,0xd7,0xd4,0x15,0xb5,0xb5,0x0b,0xaa,0x94,0x71,0x47,0xe4,0xe6,0x55,0x14, +0x6d,0xe6,0x93,0x73,0x35,0xb3,0x43,0x52,0x3d,0x28,0xa4,0x78,0x50,0xb6,0x30,0xb7, +0xc7,0xdc,0x02,0xaa,0x9d,0x67,0x20,0x7b,0x48,0xc3,0x89,0x9e,0x5d,0x07,0x50,0x9d, +0x09,0x38,0xc8,0x3a,0xc8,0x1f,0x86,0x51,0x7d,0x94,0x05,0xfc,0xdc,0x04,0x7d,0xa5, +0xc6,0x4b,0x13,0xed,0x43,0xd4,0x0e,0xcd,0x53,0xca,0x8c,0x1f,0x54,0x25,0x3e,0x68, +0x29,0x16,0xfb,0xbb,0x56,0xff,0xc6,0xb3,0x48,0xa7,0x97,0xdd,0x04,0x7a,0x58,0xe6, +0x28,0x87,0x2a,0xac,0xb3,0xde,0x48,0x4a,0xbc,0x03,0x96,0xac,0x8f,0xf1,0x37,0xe4, +0x4c,0xbd,0x09,0x9e,0x77,0xb0,0x27,0x2e,0x0c,0xfd,0x77,0x8d,0x4d,0x7b,0x0f,0x8b, +0xce,0xdc,0x18,0xbc,0x98,0xd2,0x2d,0xc9,0x92,0x9c,0x5b,0x7d,0xce,0xf4,0x17,0x5f, +0x9c,0xaf,0x10,0x5a,0x54,0xfc,0x07,0x0b,0x47,0x2e,0x7d,0x3f,0xb3,0x52,0x55,0x47, +0xc2,0xc0,0xfe,0x2c,0xf9,0x31,0x06,0x42,0xbf,0xed,0x86,0x0c,0xbb,0x24,0xe4,0x82, +0x45,0x0b,0x08,0x57,0x17,0x8a,0x20,0xce,0xed,0x4c,0x3c,0x56,0x30,0x01,0x49,0x1d, +0x69,0x31,0x2d,0x96,0x8b,0x2a,0x02,0xa5,0xf3,0xa2,0xab,0x95,0x59,0xcd,0xdb,0x62, +0xb3,0x6f,0xf1,0x11,0x78,0x32,0xb5,0xa2,0xfd,0xc8,0x81,0x31,0x58,0xb3,0xff,0xa2, +0x4a,0x35,0x2c,0xd7,0x01,0x2e,0x18,0x6d,0xba,0x75,0x10,0x8d,0x7e,0x69,0x10,0x54, +0x4b,0x54,0xb0,0x66,0x24,0x25,0xb2,0x61,0x7b,0x41,0x4c,0x84,0x32,0x6a,0x47,0x6c, +0x6b,0x77,0xd4,0x3f,0x5a,0x7c,0xe6,0x49,0xc4,0x8d,0x89,0x71,0xd4,0x5d,0x69,0xd3, +0xcb,0x16,0xdf,0x84,0x6c,0x7a,0xe4,0x60,0xf3,0x43,0xdf,0x49,0x3a,0xb6,0x60,0x1c, +0x09,0xf9,0xb0,0x3c,0x39,0x6a,0x32,0xc2,0xbd,0xc1,0xac,0xe0,0x90,0x79,0x0e,0xfa, +0x6a,0x19,0x92,0x6f,0x46,0x6b,0x45,0x39,0xb5,0xf8,0x0b,0xcf,0x65,0xe4,0x63,0x4a, +0xf8,0x81,0xda,0x1e,0x17,0x8c,0x33,0xa3,0xcb,0x9a,0xeb,0x1f,0x10,0x65,0x1d,0xc0, +0x62,0xb1,0xd2,0x28,0x9a,0x6b,0xa8,0x01,0xcf,0xda,0xe5,0x14,0x30,0x5a,0x76,0x4c, +0x2e,0x81,0x94,0xae,0xed,0x59,0xbb,0x4c,0x79,0x00,0x8a,0x68,0x12,0xdd,0x2a,0x5a, +0x00,0x00,0x00,0x9c,0x19,0xa6,0xf6,0xeb,0x4c,0xd2,0xfa,0x22,0x7f,0x2f,0x23,0x57, +0xf4,0x01,0x8d,0x22,0x15,0x88,0xeb,0x96,0xe9,0x2c,0x54,0x6f,0x77,0xde,0x12,0x5b, +0x2c,0x09,0xfb,0x60,0x9d,0x34,0x61,0xea,0xc0,0x54,0x90,0x07,0xa4,0x66,0x5a,0x25, +0x64,0xbd,0xa4,0xc4,0x64,0xbb,0x34,0x37,0x89,0xa1,0xea,0xa2,0x13,0xd6,0x04,0x94, +0xa9,0xef,0x2c,0xe6,0x53,0xe5,0x45,0x3f,0x02,0x71,0x30,0x2f,0x8e,0xac,0x54,0x46, +0x62,0xd2,0x78,0xb4,0x80,0x9d,0x1b,0x9d,0xc1,0xf2,0x46,0x21,0xc3,0x06,0x33,0x38, +0x63,0xd3,0xf3,0x92,0xd2,0x13,0xe5,0xc2,0xd3,0x3d,0xfe,0xee,0x0c,0xcf,0x3c,0x42, +0xaa,0x36,0x3f,0xb7,0x25,0xb4,0x8b,0x64,0x51,0x2f,0x14,0x29,0xe3,0x35,0x15,0xd2, +0x84,0x13,0xb2,0x70,0xce,0x94,0x92,0x37,0xa9,0x4f,0x92,0x70,0x33,0x1d,0x7d,0xa1, +0xe2,0x1b,0x69,0x5e,0x3f,0x54,0x6d,0x12,0xf1,0xfb,0x78,0x9a,0x6f,0x6d,0x6d,0x22, +0x02,0x9d,0xf5,0x2a,0x46,0x54,0x15,0xd4,0x80,0xcc,0x60,0xc4,0x52,0xd6,0x0e,0x8c, +0xa0,0xe6,0xfe,0xff,0x23,0xba,0x74,0xac,0x6b,0x98,0xed,0x6b,0x81,0xfe,0x1b,0xeb, +0x11,0x75,0x69,0x5c,0x15,0x92,0x16,0xa9,0x4b,0xd8,0xfc,0xbe,0x78,0xb8,0x39,0x3d, +0xe8,0xb5,0x78,0xfe,0x88,0x56,0x29,0x00,0x2a,0x1a,0x97,0xd7,0x99,0x7e,0x69,0x2c, +0xaa,0x52,0xf7,0x99,0x50,0x2a,0x9d,0xbb,0xe9,0xd6,0xa1,0x90,0x91,0x76,0xc1,0x3b, +0x1a,0x15,0x3d,0xb3,0x5a,0x35,0x96,0x00,0x55,0x51,0xee,0xdc,0x3c,0xd3,0x36,0x20, +0xc7,0xa6,0x35,0xe7,0x1d,0x7f,0x9e,0x10,0x54,0x50,0xa0,0xfb,0x7d,0xfd,0x45,0x4b, +0x7e,0xad,0x38,0xb3,0xd8,0x1b,0x29,0x38,0x89,0xe5,0x77,0x9f,0x98,0x12,0x57,0xf6, +0xf8,0x4a,0x81,0x95,0x43,0x7c,0x21,0x2d,0xed,0xd4,0x42,0x7f,0x76,0xff,0x97,0xa6, +0x02,0xca,0x8c,0x1a,0x77,0x3f,0xa6,0x5d,0x67,0x10,0x1c,0xb5,0x43,0xea,0x16,0xdb, +0x88,0xe3,0x73,0xe6,0x1d,0xae,0x8f,0x0b,0xb1,0x50,0x80,0xc9,0xbc,0xb0,0xf5,0xf2, +0xaa,0xc2,0xb7,0x2f,0x92,0x99,0x11,0xb3,0x25,0x7d,0xac,0x54,0xe8,0x43,0xd6,0x60, +0xb7,0xed,0x97,0x3f,0xb4,0x82,0xf9,0x0b,0xa9,0x3e,0x6d,0xc9,0xb6,0x7c,0xc3,0xfb, +0x65,0x94,0x2a,0x3d,0xb5,0xd4,0x2e,0x84,0x56,0x58,0x2b,0x45,0x50,0x67,0xc4,0xc0, +0x03,0x8d,0x6b,0x54,0xa2,0x35,0x06,0xb6,0x63,0x31,0xa8,0xef,0x1d,0xe3,0x19,0xab, +0x2e,0xcb,0x66,0xf8,0x96,0x86,0x89,0x11,0x2d,0xec,0x9e,0xe3,0xa5,0xc9,0x73,0xf3, +0xe7,0xae,0xc9,0x94,0xb3,0x53,0x6c,0x01,0x2c,0xd6,0xd5,0x4f,0x76,0xec,0xc5,0xca, +0x54,0x25,0xfc,0xec,0x18,0x2d,0x2a,0x22,0x04,0x39,0x25,0xdd,0xd8,0x63,0x08,0xe5, +0xe4,0xba,0x8c,0xd9,0xdf,0xb9,0x3c,0x06,0x05,0x98,0x82,0xc4,0xf1,0xe4,0xea,0xfa, +0x2f,0xea,0xb1,0xd3,0x9a,0xb1,0x0d,0x16,0xef,0x8a,0xc6,0x93,0x37,0x8e,0xc7,0x84, +0x8c,0xeb,0x10,0x6f,0x1d,0x2d,0x1b,0x0c,0x85,0xfa,0xc4,0xcf,0xfc,0x1a,0x02,0x48, +0x5b,0x81,0x32,0x3d,0x38,0x08,0x4c,0x42,0xc3,0x6a,0x75,0xea,0x65,0x0b,0x3a,0x38, +0x48,0x8b,0xd5,0xb2,0x1f,0x5c,0xa1,0xfe,0x7c,0xb6,0x21,0xf8,0x59,0x77,0x49,0xce, +0xcd,0x6e,0x2a,0xad,0x7e,0x51,0x66,0xab,0xcb,0x45,0x33,0x9a,0xbd,0xac,0xc8,0xe6, +0xec,0xaf,0x14,0x31,0xf5,0xa0,0x43,0x88,0x80,0x44,0x35,0x7b,0x96,0xb4,0x1a,0x32, +0x64,0x3f,0x96,0xb6,0x11,0xf2,0x6d,0x2d,0xc3,0xcb,0x4b,0xd5,0x40,0xb2,0x4a,0x23, +0x26,0xdb,0xad,0xe8,0x54,0xb5,0x62,0x17,0x21,0x24,0x94,0xb0,0xf8,0x94,0xb4,0xf0, +0x90,0xfe,0xfc,0x94,0x3b,0x34,0xd0,0xc5,0xc5,0xb2,0xec,0xb2,0x75,0x96,0x13,0xba, +0x6d,0xc9,0xcf,0x95,0xb4,0x63,0xe9,0x37,0xfe,0xd0,0x85,0x2c,0x0a,0x53,0xa9,0x3f, +0x07,0x4f,0xbf,0xc6,0x30,0xf4,0x6a,0xa5,0x8f,0x1e,0xcc,0xf6,0xd5,0xb5,0x32,0xfa, +0x2f,0x38,0xd3,0x11,0xfd,0xaf,0x7a,0x23,0x61,0x5e,0xfc,0xf6,0x77,0xf5,0x51,0x47, +0xad,0xa1,0xf4,0xe3,0x4e,0x5c,0x13,0x32,0xc7,0x76,0xf5,0xe7,0xf6,0xf6,0x20,0x43, +0x58,0x3a,0xa5,0xef,0x4e,0xf5,0x63,0xe2,0xa8,0xd3,0xfd,0xf7,0xf7,0xf7,0x5e,0xb8, +0xd8,0x97,0xfc,0x75,0x54,0xa9,0xa6,0x56,0xb8,0x23,0x16,0x7d,0xf8,0xb8,0x50,0xa3, +0xdc,0x4a,0x0d,0x6d,0xb1,0x32,0xe7,0xba,0x8c,0x66,0x86,0x24,0xfe,0xbd,0x7c,0x8b, +0xc4,0xcb,0xd9,0x89,0x5d,0x39,0x4c,0xd8,0xf7,0xa5,0xf1,0xa8,0xb6,0xbe,0x51,0xa3, +0x44,0x2a,0xab,0x7d,0xde,0xb8,0xff,0x6f,0xaf,0x56,0xd7,0xb8,0x5e,0x9e,0x77,0x8d, +0xf0,0x96,0xbb,0x5a,0xd5,0x6d,0x9c,0x1a,0x2e,0x7d,0xf6,0xee,0x7e,0xfc,0x50,0x16, +0x6d,0x62,0x59,0x0f,0xc2,0xd3,0x88,0xde,0xb6,0x20,0xfe,0xfe,0x7f,0xfd,0x24,0x3a, +0x96,0xbe,0x5e,0x73,0x55,0x0f,0x66,0x18,0xde,0xda,0xf7,0xef,0xfe,0xfe,0x51,0xf2, +0x22,0x69,0x89,0x0b,0xbc,0x5d,0x50,0xc1,0xa0,0x42,0xff,0xff,0xd7,0xef,0x80,0x0c, +0x8d,0x40,0x08,0xc4,0x1c,0x60,0xbb,0x67,0x4e,0x9c,0x15,0x6e,0xac,0x68,0xa7,0xe1, +0xed,0x0c,0xc2,0x15,0xee,0x85,0xd4,0xc3,0x4e,0x9c,0xc3,0x34,0x57,0x31,0x83,0xde, +0xeb,0xc7,0x01,0xe2,0x79,0x81,0xd5,0xeb,0x7b,0xe3,0x4a,0x25,0x28,0x83,0x57,0x22, +0x01,0xa8,0x5b,0x55,0x78,0x0b,0x4f,0xf5,0x2a,0x09,0x5c,0x4a,0xb9,0x6e,0xad,0x3e, +0x83,0x09,0xc8,0x60,0x79,0x0c,0x18,0x5a,0x1f,0x4f,0xd1,0x74,0x2d,0x64,0x04,0x61, +0xa2,0x84,0x96,0x11,0x8d,0x8e,0x26,0x76,0x93,0x21,0x7f,0x39,0x71,0x35,0xfe,0x03, +0x23,0xab,0x24,0xb4,0x97,0x2f,0xd1,0x70,0x9f,0xc4,0xf1,0x61,0xad,0x46,0x1a,0xd5, +0x9f,0x61,0xc3,0x35,0x16,0xd7,0x67,0xb4,0x60,0xe7,0xdb,0x88,0xd7,0x63,0x30,0x18, +0x8d,0x1e,0x98,0x08,0x3b,0x99,0x38,0xc2,0x0b,0x47,0x6d,0x52,0x76,0xb7,0x2d,0x19, +0x62,0x7d,0x82,0x19,0x1d,0x69,0x50,0x25,0x58,0xe6,0x13,0x42,0x3b,0x1f,0x5d,0x13, +0x88,0xa1,0xbd,0xb9,0x52,0x69,0x3a,0x5a,0xc7,0xc6,0x2c,0x1d,0xf9,0xc5,0x89,0xdf, +0x1b,0x08,0x30,0x6e,0xfb,0x28,0x57,0x4a,0xc6,0xc1,0xe5,0x74,0xf9,0xdb,0x69,0x36, +0xdb,0xb0,0x75,0x60,0x6d,0x2c,0x5a,0x98,0x4e,0xed,0x52,0x91,0x52,0x98,0xb5,0x9a, +0xaa,0xd2,0x0a,0x50,0x05,0xd0,0x0c,0x28,0xa0,0xc5,0x36,0xef,0x46,0x67,0xfc,0x12, +0x09,0x03,0xf4,0x65,0xe9,0x2e,0x5d,0x9a,0x83,0xc3,0xdb,0x80,0xde,0x13,0xe7,0x22, +0x55,0xa0,0xdd,0x3f,0x64,0xf2,0x01,0x7d,0xa3,0x57,0x5f,0x79,0x93,0x0d,0x7a,0x86, +0xc1,0x93,0x15,0xf7,0x56,0x5c,0x6d,0xf6,0x95,0x9c,0x91,0x55,0x33,0x50,0x74,0x81, +0x20,0xbc,0x0c,0x90,0x9e,0x9c,0xc7,0xb8,0x1e,0x80,0x56,0x74,0xc5,0xdb,0x2d,0x72, +0x2c,0x9f,0xe3,0x20,0xb1,0x52,0x14,0xf7,0x1d,0x9e,0xcb,0x74,0x28,0xd9,0x05,0x23, +0xf5,0x8e,0xdf,0x6d,0x35,0x30,0xdd,0xb5,0x52,0xf2,0x5d,0xb8,0xbe,0x72,0x3a,0x9c, +0xa1,0x19,0xe4,0x35,0xd2,0xb4,0xd1,0x26,0x99,0xc1,0xac,0xd6,0xba,0x7b,0x42,0xd6, +0xeb,0x9d,0x6b,0xcf,0x58,0x41,0x7a,0xbc,0xe7,0xf1,0x5e,0xe7,0x1d,0xdd,0x96,0x32, +0xfb,0xb2,0x6d,0x4f,0x66,0xa2,0x2d,0x65,0xb2,0xbe,0xdb,0x16,0xb7,0x72,0xe9,0xb3, +0x54,0x72,0x8e,0x13,0x21,0x34,0x50,0xf6,0x16,0x58,0xfb,0x5d,0xb6,0x35,0x3c,0x7b, +0x29,0xb5,0xbe,0x9c,0x43,0x3c,0x2e,0x98,0x4c,0x47,0x91,0xa9,0x7c,0x38,0x3c,0xa8, +0x3d,0xe6,0x4e,0x91,0xc9,0x02,0xb4,0xc7,0xac,0xf9,0xa0,0xfc,0xf4,0xff,0x0f,0x78, +0x0b,0x5a,0xa7,0x89,0xc3,0x3a,0xbd,0xd7,0x2d,0x4a,0x26,0xdf,0x13,0x72,0x31,0x7b, +0xcb,0x18,0xbf,0x92,0xfc,0x6f,0x17,0xca,0xe8,0x37,0x19,0xfd,0xf5,0x3b,0x7e,0x8f, +0xe0,0x84,0x25,0x37,0x51,0xfa,0xe2,0x97,0xc9,0xd7,0x53,0x11,0xfa,0x64,0xb5,0x5c, +0x37,0x53,0xf4,0x2f,0xf1,0x96,0x94,0x8a,0x01,0xf7,0xe9,0xd4,0x08,0x7d,0xb8,0xb7, +0x60,0x66,0x63,0x3c,0x74,0x7e,0x53,0xd8,0xad,0xf1,0x60,0xc1,0x8d,0x7e,0xe3,0x4a, +0xfe,0xa0,0xad,0xcd,0x50,0xe9,0x21,0x28,0x5c,0x1d,0x1f,0xf1,0xe5,0x82,0xc3,0xf9, +0x20,0xc0,0x98,0x12,0x67,0xe4,0xb7,0xd1,0x49,0x6d,0x23,0x00,0x04,0x6d,0x9f,0x13, +0x88,0x8d,0xf3,0x15,0x6e,0xad,0x30,0x3f,0x76,0xfc,0xf2,0x37,0x28,0xe8,0x26,0x5b, +0x0b,0x80,0xfe,0x47,0x14,0x22,0x7d,0xe4,0x06,0x31,0x65,0xd8,0x3d,0x41,0x41,0x33, +0xdd,0xe3,0x69,0x1a,0x65,0x98,0x63,0xcc,0x62,0xd8,0xfb,0x44,0xa1,0x62,0x6b,0x38, +0xd0,0x2b,0x34,0xb8,0x34,0xb4,0x0e,0x2a,0xa7,0x67,0xce,0xd7,0x15,0xc4,0x50,0x62, +0x75,0xc7,0x17,0x28,0x39,0x7a,0x7c,0xb8,0x8f,0x74,0x78,0x96,0x6f,0x4e,0xec,0x30, +0x8d,0x27,0x67,0x38,0xfe,0xab,0xff,0x90,0x8b,0x86,0x8f,0x3f,0x6b,0x6f,0xec,0x9c, +0x72,0x8b,0xd7,0xf7,0x56,0x2d,0x71,0x00,0xc6,0xa9,0x77,0x70,0x3c,0xff,0xa2,0x0a, +0xe1,0x23,0xba,0x01,0x59,0xfc,0x88,0xcc,0x48,0x88,0xfa,0xd1,0xbd,0x6b,0xa0,0x68, +0xe6,0x81,0xad,0xaf,0x3f,0xd9,0x89,0xbe,0x49,0xd6,0xe4,0xee,0x55,0x46,0xac,0x49, +0xe7,0x80,0x2d,0x04,0x8d,0xab,0xcf,0xd7,0xdc,0x31,0x94,0x64,0x21,0xd6,0x71,0x4f, +0xe5,0x83,0x7b,0x6c,0xb3,0xaf,0x2d,0x59,0xad,0x58,0xf5,0x34,0x9a,0xef,0x5a,0x35, +0x8f,0x81,0x9a,0x1e,0x0e,0x03,0x10,0x6a,0x4f,0x9f,0xd4,0xca,0x4b,0xef,0x78,0x7e, +0x09,0xfd,0xb4,0x68,0x93,0x06,0x70,0x7d,0xee,0x12,0xf4,0xcb,0x7c,0x5d,0x5d,0x8a, +0xe6,0x83,0x85,0xbe,0x44,0xbe,0x55,0x3a,0x4a,0x6a,0x76,0x1b,0x37,0xfd,0x8f,0x99, +0x2e,0x7e,0x5d,0x5f,0xf4,0x0a,0xcf,0x19,0x30,0x8d,0xc5,0x4a,0x17,0x8c,0xdf,0xfd, +0x45,0xf0,0x2a,0x8d,0x25,0xb1,0x56,0xa6,0x67,0xb0,0x34,0xd8,0x17,0x23,0x14,0x69, +0x56,0x91,0x2e,0xe5,0x13,0x10,0x3d,0xa2,0x1a,0xf1,0x86,0x06,0xf4,0x5e,0x5b,0x85, +0x70,0xf6,0xa2,0x8e,0x96,0xc2,0xb5,0xa3,0xeb,0xd3,0xa3,0xe7,0x1f,0xb6,0x74,0xe1, +0x00,0x4c,0xa5,0x64,0xb4,0xb2,0x1d,0xb7,0x9a,0xd3,0x19,0xd5,0xd4,0x93,0x5a,0x20, +0xec,0x2c,0x9a,0x59,0x5d,0x02,0xf1,0x37,0x8f,0xbc,0xad,0xe2,0xfb,0x97,0xcf,0x16, +0xfb,0xff,0x5e,0xd1,0xdc,0x50,0xf9,0xb8,0x2d,0xdd,0x81,0xc7,0x66,0x5a,0x1e,0x47, +0xf6,0x7e,0xe4,0x34,0x64,0x1d,0xb5,0xee,0x6f,0x94,0x5e,0x42,0x23,0xe8,0x81,0xa0, +0xa8,0x11,0x93,0xe4,0xdc,0x32,0x5d,0x4c,0xad,0xff,0xf4,0x89,0x9d,0x1f,0x27,0xec, +0xd3,0xe3,0xa1,0x0e,0xc1,0xdb,0x91,0xee,0xc8,0x88,0x36,0xaa,0xa0,0x94,0x8d,0x5e, +0xf1,0xf3,0xb8,0xfc,0xc2,0x64,0xb2,0x4b,0x64,0x99,0xc0,0x7f,0x15,0xf4,0xa6,0x0f, +0xb0,0xd5,0xc1,0xed,0x4b,0x47,0x0d,0x0e,0xac,0x75,0xed,0xab,0x36,0xd2,0x11,0x5e, +0x9e,0x3b,0x7b,0x61,0x40,0xf9,0x01,0xfa,0x62,0x7d,0xad,0x9b,0xfb,0x8b,0x99,0xb9, +0x29,0x1a,0x66,0x88,0xac,0x68,0xf6,0xea,0x9d,0xd2,0x88,0xbb,0xb6,0x9f,0xa6,0xda, +0x44,0xf7,0x4b,0xda,0xb8,0xab,0xcb,0xbf,0x97,0xf7,0xa0,0xae,0x5e,0xfc,0x67,0x8b, +0xea,0x35,0xc4,0xd0,0x66,0x15,0x1f,0x6d,0x12,0x9f,0x7e,0x1e,0xf3,0x88,0x90,0xca, +0xac,0x32,0xbf,0x41,0x44,0xbc,0xbf,0xf2,0x9b,0x72,0x7a,0x67,0x16,0xec,0x0e,0xb5, +0x23,0xb0,0xa2,0x77,0x09,0x4e,0x63,0xda,0xf8,0x18,0x37,0x61,0x3b,0xe8,0x70,0x22, +0xc9,0x0e,0x3f,0x50,0xe5,0x09,0x09,0x5e,0x60,0x6a,0xb8,0xe1,0xab,0x21,0x3f,0x34, +0x48,0x41,0xe3,0x05,0x91,0xc2,0x2c,0x41,0xf7,0x17,0x35,0xd4,0x99,0xe2,0x07,0xe2, +0xc4,0x07,0x49,0x0d,0x02,0x51,0x47,0xde,0xcd,0xe8,0x0c,0x46,0xb3,0x60,0x45,0xb1, +0x1f,0x24,0xd6,0xa4,0x1e,0x64,0x57,0x26,0xd0,0xef,0x89,0x8b,0xf7,0xcb,0x47,0x90, +0xbf,0x7d,0xd0,0x51,0x17,0x35,0x7f,0x81,0xdf,0xa5,0x0c,0xfc,0xf6,0xca,0x1f,0x19, +0x5a,0xad,0x47,0xe3,0xf2,0xb8,0x72,0x61,0x0a,0x17,0x01,0xed,0x77,0xc9,0xf8,0x09, +0x3b,0xbf,0x08,0xbd,0x2c,0x6a,0xb1,0xfb,0xa0,0x67,0x4a,0xfd,0x76,0xc8,0x80,0x1b, +0x66,0xa0,0x02,0x09,0xd6,0x69,0xef,0x88,0xcd,0x5e,0xaa,0x38,0x2f,0x2c,0x8f,0xe5, +0x8c,0xf9,0x26,0x5e,0x9a,0x84,0x3d,0x3c,0x22,0x3d,0x41,0x3a,0x26,0x69,0x25,0xa1, +0xcd,0x48,0x6f,0x8d,0x64,0x0a,0x4d,0x33,0xc8,0xe1,0x4c,0x2f,0x58,0xea,0x35,0xb5, +0xe1,0x06,0x59,0x2d,0x18,0x84,0x99,0xff,0x5b,0x48,0x38,0x79,0x05,0x03,0x82,0x44, +0x0e,0xf3,0xbc,0x61,0x08,0x61,0x44,0x31,0xa1,0xf4,0x45,0x1f,0x7c,0xcd,0xf5,0x69, +0xaa,0xf2,0xb4,0xfc,0x09,0x60,0x51,0x57,0x56,0x12,0x49,0x4d,0x27,0xc2,0x97,0xda, +0x2b,0xd1,0xbd,0x65,0x88,0x63,0x69,0xd8,0x9b,0xe1,0x07,0x9e,0xe2,0xc3,0xf0,0xfc, +0x7c,0xf2,0x34,0xd8,0x1d,0xff,0x6e,0x20,0xcd,0x1f,0x4d,0x0e,0xfd,0x01,0xbb,0x04, +0x3c,0xf7,0x50,0x77,0x29,0x8b,0x03,0xe9,0x89,0xb1,0xa4,0xa6,0x30,0xab,0x82,0xaf, +0x30,0xc5,0x85,0x54,0x3d,0x71,0x99,0xbb,0x9d,0xc9,0x14,0xab,0x7c,0xdc,0x23,0xb8, +0xb9,0xc7,0x87,0xfe,0x3f,0x94,0xd5,0xac,0x69,0x10,0x35,0x58,0xd0,0xa6,0xef,0x8e, +0x6f,0x9e,0x0f,0x5b,0x4b,0xb3,0xa2,0x14,0x2b,0x5e,0x14,0x8b,0xe8,0x68,0x62,0x94, +0xe4,0xb0,0xc1,0xbb,0x71,0xe6,0x2a,0xb0,0xaa,0x3c,0x78,0x62,0x2a,0x89,0x48,0x21, +0xe1,0x35,0xac,0xcf,0x30,0x38,0x64,0x03,0x62,0x30,0xd8,0xf6,0x77,0x8e,0xcb,0x56, +0xc9,0xb0,0x69,0x40,0x59,0xf7,0xf5,0xf2,0xe7,0x32,0x85,0x93,0xb2,0x8d,0x6b,0x91, +0x75,0xb3,0x9d,0xa2,0xf3,0x79,0x65,0x02,0xea,0x54,0xdd,0xea,0x91,0x6c,0x78,0x1b, +0x43,0x9e,0x43,0xff,0x5a,0x3b,0xed,0xd7,0x00,0x55,0x16,0xeb,0x56,0xa4,0xe9,0x6b, +0xf3,0xb2,0x51,0xdc,0xb9,0xb9,0xa1,0x89,0x28,0xf6,0x8c,0xac,0x92,0xd1,0x87,0x97, +0x7e,0xee,0xbf,0x99,0xcf,0x7e,0xe8,0xd7,0xc6,0x85,0x43,0xf3,0x6b,0x45,0x6c,0x9d, +0x42,0xde,0x54,0x9e,0xc6,0x37,0x97,0xc7,0x83,0x33,0x24,0x0d,0x75,0xd4,0x4a,0x57, +0x41,0xaa,0xc5,0xce,0x3e,0x70,0xb5,0x13,0x38,0x1c,0x2f,0x8a,0x85,0x7f,0x68,0x88, +0xcf,0xb9,0xf6,0x7c,0xde,0xbd,0x58,0xa9,0xe8,0x53,0xfe,0xf8,0x0c,0x7d,0x46,0xbb, +0x41,0x88,0xc4,0x4f,0x62,0x34,0xd5,0x5c,0xb0,0x1e,0xe9,0xfd,0x8d,0x5e,0x41,0xee, +0xc0,0xba,0x27,0xd1,0x3b,0x7f,0xbf,0xc6,0xcf,0x53,0x7c,0x4c,0x06,0xf5,0xdf,0x71, +0x3e,0xc2,0x2e,0x74,0x76,0xe4,0xb7,0x62,0xad,0xf8,0x8e,0x6a,0xa0,0xd8,0x0e,0x42, +0x00,0x2c,0x28,0xb6,0x05,0xc1,0x7c,0x0d,0x40,0x14,0x13,0x93,0x80,0xff,0xa4,0x15, +0x6f,0xaa,0xdf,0x53,0xff,0xba,0xdd,0xb1,0xc4,0xca,0xe8,0x23,0x59,0x81,0xa0,0xf3, +0x89,0xc3,0x93,0xe4,0x84,0x56,0x35,0xb7,0x95,0xdd,0xc4,0x07,0xd5,0x4c,0x76,0x07, +0xed,0xec,0x5f,0xe6,0xfb,0xc4,0xf0,0x9d,0x68,0x62,0x96,0xc3,0x57,0x64,0xe0,0x41, +0x0a,0xc1,0x08,0x5e,0xea,0xa6,0x40,0x8d,0xb2,0xa6,0x4f,0xd3,0x8b,0xb4,0xda,0xf2, +0x83,0x29,0x0d,0x45,0x9e,0xca,0x49,0x9d,0x3b,0x67,0x46,0xc3,0x56,0xa6,0x17,0x54, +0x26,0x28,0x53,0x52,0x18,0xa3,0x82,0x0c,0xaf,0xaf,0xa0,0x95,0x36,0xa8,0x24,0x17, +0xf0,0x10,0x33,0xf2,0x1c,0x1d,0x74,0x63,0xa5,0xc0,0xbc,0x50,0x3e,0x8c,0xd1,0x65, +0x65,0x84,0x2b,0x93,0xe0,0x08,0xbf,0x8d,0xf8,0x60,0x84,0x8e,0x7f,0xe4,0x9c,0xae, +0x46,0x87,0xb2,0xf7,0x9c,0xe8,0xf3,0x26,0x45,0x88,0xcd,0x7f,0x5c,0xdb,0xd4,0x65, +0xa3,0x54,0x93,0xec,0x88,0x76,0x2a,0xdb,0xe1,0x6f,0x39,0xc3,0x59,0x10,0x6a,0x6d, +0xaf,0x23,0xe6,0x09,0x98,0xdc,0x0c,0x2f,0xbb,0x6f,0xd2,0x06,0x6d,0x93,0x86,0xc8, +0x0f,0x87,0xba,0x2d,0x13,0xc3,0x7b,0x4b,0x06,0x62,0x42,0x81,0x7d,0x00,0x6f,0x71, +0xbe,0x13,0xba,0xa5,0x3b,0x51,0xfb,0x98,0xcb,0x45,0x4b,0x9c,0xb8,0xfc,0xef,0x5f, +0xcb,0x41,0xcb,0x5e,0x12,0xe9,0x75,0x09,0xa5,0x47,0x7f,0xb8,0x5f,0xcf,0x5a,0xb5, +0x4f,0x35,0x07,0xc2,0xe8,0xd8,0x4a,0xe3,0xe3,0x20,0xbe,0x80,0x24,0x7d,0x4d,0x61, +0xf5,0x3a,0xa2,0x96,0xb5,0x1a,0x45,0x49,0xad,0x26,0xf6,0xb7,0x08,0xf8,0x24,0x70, +0x44,0xde,0xfb,0xd7,0x38,0x19,0x65,0x3d,0x1f,0xd1,0x61,0x58,0x1d,0x51,0x0a,0x97, +0xce,0xe7,0xda,0x92,0xab,0x1e,0x82,0xa0,0x13,0x0e,0xff,0xc4,0x81,0x72,0x44,0xb1, +0x16,0x3f,0x4c,0xca,0xb4,0x00,0x4c,0xa0,0xc5,0xd8,0x33,0x15,0x48,0xef,0x5e,0xa1, +0x41,0x9e,0x94,0x2b,0x37,0xf7,0x14,0x03,0xe4,0xc5,0xbd,0x90,0x9c,0xa6,0x1d,0xcb, +0x46,0x39,0xad,0xa5,0xf5,0x45,0xd1,0xa1,0x62,0xda,0x88,0x81,0x1d,0xc5,0x2f,0xa0, +0x99,0x96,0xee,0x39,0x94,0x37,0x1d,0xb3,0x18,0xda,0xa4,0x01,0x52,0x58,0xa4,0x4c, +0xbe,0x9b,0xf4,0x2e,0x9d,0x78,0x10,0x11,0x95,0x7c,0xfe,0x51,0x9d,0x7b,0xd1,0x89, +0xdb,0x46,0x8e,0x8e,0x4a,0x9d,0x7f,0x36,0x69,0x59,0xe0,0xf3,0x75,0x56,0xc4,0x70, +0x64,0x6d,0x7c,0x89,0xc3,0xb3,0x44,0xd1,0x87,0xa5,0x90,0xe4,0x01,0xc6,0x09,0x20, +0x56,0x3f,0x70,0xfd,0x69,0xf3,0x1a,0x32,0xe9,0x5b,0xb4,0xb4,0xa4,0xff,0x5e,0xd7, +0xab,0x8a,0x98,0xf6,0xbe,0xaf,0x66,0x88,0x62,0x9c,0x20,0xe6,0xdb,0x53,0xff,0xc1, +0x44,0xe9,0x17,0x3e,0x15,0x16,0xc6,0x6a,0x4c,0xbd,0xc0,0x4f,0x5d,0xf0,0x39,0xd1, +0xae,0x3a,0x38,0xce,0xb8,0x2e,0x76,0xce,0xdd,0x51,0xa6,0x4f,0xee,0xac,0xed,0x1d, +0x3d,0x9b,0xfc,0xde,0x3f,0x2e,0xff,0xee,0x6f,0x5e,0xfe,0xec,0xd1,0xdc,0x50,0x18, +0x10,0x04,0x85,0x31,0x00,0x3e,0xe8,0x42,0xe7,0x15,0x50,0x24,0x14,0xdd,0x58,0x08, +0x49,0xa5,0x0e,0x72,0x5d,0xf5,0xe0,0xa0,0xea,0xec,0x4c,0xca,0xac,0xc0,0x41,0x12, +0xa6,0x21,0x80,0x12,0x80,0x81,0xe9,0xd5,0x67,0xca,0x83,0x24,0x2f,0xef,0x9e,0x28, +0x01,0x13,0x0f,0xbc,0xd5,0x4e,0x65,0x9a,0x6a,0xb7,0xa1,0xca,0x24,0x00,0xf7,0x64, +0xbc,0x24,0xba,0x90,0x92,0x04,0xc0,0xa0,0x5a,0x79,0x5a,0x55,0xf3,0x9b,0xec,0x32, +0x27,0x0f,0xe8,0x59,0x1b,0x65,0x20,0x78,0xa6,0x04,0x67,0x45,0x12,0xca,0xc3,0x4a, +0x06,0x52,0x4b,0xb3,0x4d,0xab,0x47,0x67,0x71,0x82,0xef,0x34,0xfc,0xb9,0xc9,0x26, +0xa7,0x70,0xcb,0x5d,0x91,0x26,0xac,0x8f,0xd7,0x7a,0xd3,0x0b,0xb9,0x0f,0x22,0x0d, +0xc0,0x4b,0x00,0x03,0x5c,0x4b,0x6e,0x5c,0xe3,0x40,0x69,0x5f,0x4b,0x99,0xe2,0x18, +0x8b,0x01,0x8c,0x28,0x59,0x55,0x62,0xf6,0xea,0xde,0x49,0xcf,0xd5,0xe4,0x57,0x1a, +0xfc,0xbb,0x85,0xc3,0xd0,0x2e,0x6f,0xb1,0x6b,0x15,0xed,0x2b,0x31,0x80,0xb2,0xe9, +0x81,0x04,0x89,0x60,0xd9,0x69,0x63,0x1b,0x6a,0xaf,0x7f,0xce,0x1f,0xe0,0xb9,0x4c, +0xa7,0x4d,0xca,0x4e,0x98,0x9c,0x44,0x6e,0xf9,0x01,0xac,0x29,0x7e,0x73,0x70,0xdf, +0x2f,0xf0,0x2e,0x3c,0xe9,0x48,0xca,0x0b,0xc7,0x1c,0xa5,0x0f,0x12,0xec,0x66,0x4f, +0x1e,0x6a,0xca,0x3f,0xed,0x0e,0x2d,0x8b,0xda,0x03,0x69,0x97,0xca,0xa3,0x6c,0xbb, +0x6b,0x1a,0x34,0x8d,0xe5,0x2c,0x25,0x7e,0x72,0x29,0x58,0x8e,0x5f,0xe2,0x7f,0xb6, +0xd3,0x08,0xda,0x66,0x34,0x8d,0x93,0x93,0x3c,0x56,0xa6,0xb4,0xf5,0x66,0xf1,0x34, +0x96,0xff,0x68,0x6a,0x52,0x11,0x9b,0xf5,0x3d,0xf0,0x98,0x45,0xed,0x91,0xf8,0xee, +0x1f,0xc6,0x45,0x89,0x5e,0xbf,0x92,0x49,0xbc,0xa8,0xeb,0xbf,0x9b,0xc6,0xf4,0x69, +0x16,0x72,0x69,0x6a,0xb5,0x03,0x9a,0xa0,0xb5,0x3e,0x75,0x3f,0xd3,0xa5,0x15,0x22, +0x06,0x63,0xea,0xc2,0xa3,0x68,0x2a,0xe7,0x46,0x18,0x44,0x15,0xd1,0x34,0xed,0xd7, +0x82,0xba,0x78,0x9e,0xfa,0x71,0xa6,0x3a,0x98,0xfe,0xca,0xb8,0x98,0x2d,0x41,0xcd, +0x3a,0x52,0xeb,0xc2,0x27,0x39,0xe2,0x09,0x1d,0xdb,0xe7,0xdb,0x51,0x37,0x35,0xf6, +0x02,0x56,0xe4,0x9b,0x7a,0x53,0x6d,0xae,0x88,0x63,0x66,0x44,0xea,0xd8,0x7b,0xc6, +0x93,0x33,0xf9,0x9f,0x2b,0x7c,0x95,0x17,0x3c,0x4e,0xe9,0x5d,0xb2,0x60,0x77,0xe5, +0x9a,0x6b,0xf6,0x98,0xc0,0x7b,0x9d,0x31,0x31,0x24,0x2c,0xe3,0x12,0x9c,0x7a,0x05, +0x1b,0x96,0xa1,0x58,0x34,0x91,0x94,0x49,0xbc,0xf2,0xc9,0x36,0xe8,0xd1,0xf1,0xd3, +0x46,0xd0,0x0e,0x2a,0x58,0x5d,0x18,0x17,0xb1,0x4f,0xa7,0x4c,0x11,0x7f,0x0e,0xdc, +0xe6,0x13,0x6f,0x13,0x83,0xe2,0x56,0x19,0xe2,0xa3,0xdb,0xc8,0xc6,0xb4,0xbb,0x26, +0x67,0x70,0x84,0xf7,0x7c,0x7f,0x5d,0x04,0x8a,0x3b,0x5e,0xf0,0x76,0x62,0x42,0xbe, +0xb0,0x5f,0x79,0xcf,0x4c,0x4b,0xd7,0xe4,0xec,0x1e,0x66,0xb8,0x42,0x66,0x31,0x3b, +0xb3,0x72,0x4e,0xd9,0x44,0x5c,0xeb,0x13,0x0a,0x39,0x65,0x07,0xeb,0xb2,0x70,0xfd, +0xff,0x8e,0x24,0xb5,0x18,0x4a,0x48,0x5f,0xe7,0x9a,0xb4,0xa1,0xbf,0x06,0x8c,0xd0, +0xa6,0x8f,0x28,0xbb,0x1d,0x3f,0x40,0x1a,0xe6,0x53,0xc6,0xa4,0x88,0x9c,0x49,0xc1, +0x00,0x8c,0x21,0xec,0x90,0xf4,0x49,0x76,0x67,0x21,0xef,0xb4,0xc4,0x6f,0x11,0xb7, +0x85,0x83,0xad,0xef,0x1a,0xa1,0x41,0xb7,0xc7,0xc3,0x16,0xc4,0x03,0x17,0x18,0x1d, +0xd6,0x8b,0xde,0x4f,0x55,0x56,0x0e,0x80,0xea,0xf9,0xa6,0x36,0xbd,0x80,0x10,0x60, +0x73,0x5a,0xf0,0x57,0x43,0x59,0x06,0x90,0xf2,0x13,0x07,0x72,0x4b,0xaa,0x53,0x6b, +0x53,0x32,0x1a,0x35,0x18,0xc3,0x95,0x47,0x7b,0x30,0xc9,0x99,0x7a,0xeb,0xf9,0x00, +0x24,0x98,0xa3,0x15,0xff,0xaa,0xf1,0x91,0x7e,0x71,0xda,0x27,0x0f,0x4f,0xdd,0x28, +0xf3,0x80,0x15,0x0f,0x91,0xa4,0xb5,0xd5,0x10,0xb7,0x55,0xdf,0x86,0xf8,0xd1,0x3b, +0xf6,0xa5,0xe3,0x71,0x3e,0x0b,0xbd,0x48,0x11,0x27,0x15,0xcf,0xb1,0xe4,0xd8,0x69, +0x7b,0x8e,0xcb,0x11,0xd3,0x5e,0xb4,0xdd,0x90,0x17,0xcd,0xb5,0xb7,0x2f,0x54,0x7f, +0x76,0x0b,0x0c,0x19,0x49,0xcf,0xbc,0x70,0x91,0xdc,0xe5,0x0c,0x5d,0x40,0xd6,0x28, +0x3e,0x83,0xfa,0x64,0x1f,0xbb,0xfa,0x88,0xff,0x5a,0xcc,0xde,0x61,0xcc,0xca,0xcb, +0x8b,0x86,0xd0,0xd9,0xb3,0xb2,0x6c,0x7c,0xa4,0x89,0x72,0x8d,0x5a,0x30,0x4d,0xa9, +0x3d,0x23,0xd9,0xc8,0x32,0xf1,0x7d,0x89,0xea,0x4b,0x2a,0x69,0xfa,0x4f,0xeb,0xca, +0x03,0x82,0xd1,0xd8,0x33,0xb3,0x45,0x99,0xa5,0xab,0xad,0x3e,0x34,0xc7,0xda,0xb3, +0xc3,0x5e,0xda,0x10,0x57,0x90,0x33,0x72,0x3c,0x02,0xea,0x94,0x34,0xbc,0x52,0x70, +0xce,0x54,0xca,0x9e,0xd4,0x1e,0x3f,0x52,0x35,0xb2,0xe2,0xad,0x7d,0x5a,0xdf,0x89, +0x43,0xe1,0x41,0x74,0x7a,0x19,0x36,0xd5,0xb4,0x47,0xd4,0x56,0x24,0xf2,0x53,0x4a, +0x4e,0x51,0xcf,0xf8,0x4a,0xdf,0xb8,0x41,0xf9,0xb4,0x18,0x2f,0x72,0xe5,0x21,0xe6, +0xbe,0xd0,0x82,0xa4,0xc1,0x49,0xc0,0xa2,0x6a,0x1b,0x8b,0xc9,0x33,0xa1,0x12,0x30, +0x44,0xb5,0x38,0x28,0xca,0x14,0x93,0x00,0xe7,0xe4,0xfc,0xea,0x71,0xa5,0xc4,0xc4, +0x47,0xf0,0xf3,0xa5,0x49,0x6b,0x55,0xe2,0x41,0xc6,0x7b,0xcc,0xe7,0xf0,0x89,0xf7, +0x19,0xb7,0xe3,0x24,0xfe,0x6a,0x47,0x74,0x4b,0xc8,0x66,0x08,0x03,0xf8,0x5c,0x49, +0xcf,0x2c,0xfc,0x0e,0xe2,0x17,0xb3,0x4b,0x70,0x69,0xe6,0x30,0x87,0xfe,0xd2,0xd5, +0x82,0x4d,0xd0,0x00,0x56,0x0f,0xbf,0x72,0x79,0x09,0x86,0x40,0xd1,0xf4,0x5d,0xc7, +0x4f,0xca,0x40,0xfd,0x7e,0xba,0xb6,0xdc,0xf8,0xdf,0x18,0xcd,0x50,0x9f,0xd3,0x5f, +0x02,0x89,0xae,0xed,0x56,0x2d,0x3a,0xfd,0xf5,0x70,0x40,0x7d,0x7e,0xbd,0x26,0xb9, +0xaa,0xad,0xb0,0x9e,0xd5,0x34,0x3c,0xff,0x0e,0x4c,0x2b,0xf6,0xf1,0xfe,0xbf,0x29, +0xa3,0x90,0xe7,0xa0,0x55,0x55,0x34,0xe7,0x2e,0xdc,0x96,0xe0,0xb9,0x09,0x19,0xcd, +0x47,0xfa,0x58,0xfe,0xaf,0x11,0x5e,0xac,0xc0,0x52,0x40,0xee,0x73,0xf2,0x11,0x39, +0x03,0x92,0x91,0x8a,0x9b,0x12,0x56,0xfc,0xee,0x5f,0x19,0x0e,0x35,0xef,0x3a,0xf3, +0xc2,0x94,0xe0,0x40,0x30,0x2d,0x4e,0x8a,0x48,0x46,0x6f,0xdb,0xaf,0x9f,0x6f,0x18, +0xea,0x97,0x3c,0x76,0xa6,0x44,0x60,0xf6,0xf1,0x0f,0x67,0xcb,0xae,0x9e,0xe2,0x1a, +0x5e,0xa9,0xf8,0x22,0x31,0x1d,0x19,0xc6,0xa3,0x62,0x6e,0xda,0x2f,0x9d,0xc9,0x11, +0xc5,0x7e,0xb1,0xfa,0x1c,0x63,0xae,0xb3,0xc4,0x23,0x66,0xca,0x2e,0x9c,0xbf,0xbf, +0xfd,0xfb,0x3f,0xbb,0xed,0xdb,0xaf,0x9f,0xbd,0xbb,0x2f,0x9b,0xad,0x9b,0xb7,0xaf, +0xfc,0xfa,0x37,0xab,0xec,0xda,0xa7,0x8f,0xbc,0xba,0x27,0x8b,0xac,0x9a,0xbe,0xbe, +0x7d,0xf9,0x3e,0xba,0x6d,0xd9,0xae,0x9e,0x3d,0xb9,0x2e,0x9a,0x2d,0x99,0xb6,0xae, +0x7c,0xf8,0x36,0xaa,0x6c,0xd8,0xa6,0x8e,0x3c,0xb8,0x26,0x8a,0x2c,0x98,0x1a,0x3c, +0xc9,0x82,0x03,0x3a,0x97,0x2a,0x48,0x35,0xeb,0x4e,0x6d,0xd3,0xa7,0x97,0x6c,0xe9, +0xd3,0x19,0xe2,0x6f,0x39,0x22,0x9a,0xda,0xe8,0xc3,0x65,0xc3,0xa6,0x96,0x7b,0x59, +0x98,0xa5,0x34,0x0c,0x15,0x26,0x9b,0x2d,0x69,0xc2,0x6c,0xd2,0x27,0x95,0x55,0x2f, +0x54,0xa0,0x8d,0x1d,0xf2,0xcf,0xe0,0xdb,0x4b,0x03,0x64,0xc2,0x26,0x94,0xbd,0xb7, +0xf5,0xf3,0x3d,0xb3,0xe5,0xd3,0xad,0x97,0xb5,0xb3,0x2d,0x93,0xa5,0x93,0xb5,0xa7, +0xf4,0xf2,0x35,0xa3,0xe4,0xd2,0xa5,0x87,0xb4,0xb2,0x25,0x83,0xa4,0x92,0xbc,0xb6, +0x75,0xf1,0x3c,0xb2,0x65,0xd1,0xac,0x96,0x35,0xb1,0x2c,0x92,0x25,0x91,0xb4,0xa6, +0x74,0xf0,0x34,0xa2,0x64,0xd0,0xa4,0x86,0x34,0xb0,0x24,0x82,0x24,0x90,0x3c,0x7f, +0xa3,0x1e,0x04,0x86,0x83,0x72,0xc6,0x40,0x3c,0xfd,0x6b,0x5b,0x8f,0x8f,0x4c,0xaf, +0x29,0x7d,0x88,0xb4,0x31,0x31,0x14,0xb8,0x67,0x31,0x63,0x4b,0x8e,0x8e,0xe5,0xbe, +0x84,0x7c,0x86,0x22,0x30,0x5d,0xc0,0xe6,0x22,0x12,0x6a,0x5a,0x0f,0x8d,0x25,0x53, +0xa7,0xa3,0x5d,0x6a,0x4e,0xcc,0x9d,0xb3,0xed,0x11,0x62,0x4a,0x0e,0x8c,0xbb,0x3f, +0xdd,0xeb,0x3b,0x3b,0xcd,0xcb,0xab,0x1f,0x9d,0xab,0x2b,0x1b,0x8d,0x8b,0xb3,0x2f, +0xdc,0xea,0x33,0x2b,0xcc,0xca,0xa3,0x0f,0x9c,0xaa,0x23,0x0b,0x8c,0x8a,0xba,0x3e, +0x5d,0xe9,0x3a,0x3a,0x4d,0xc9,0xaa,0x1e,0x1d,0xa9,0x2a,0x1a,0x0d,0x89,0xb2,0x2e, +0x5c,0xe8,0x32,0x2a,0x4c,0xc8,0xa2,0x0e,0x1c,0xa8,0x22,0x0a,0x0c,0x88,0x90,0x79, +0x97,0x88,0x79,0x73,0xc7,0xc7,0x16,0x9c,0x5b,0x57,0x69,0x53,0x87,0x87,0xf3,0x14, +0xf4,0xa4,0x71,0x63,0xc6,0xc6,0xf2,0x38,0x95,0x79,0x61,0x43,0x86,0x86,0x57,0x63, +0x53,0xb1,0x78,0x72,0x47,0xc5,0x4d,0xac,0x4f,0x1b,0x68,0x52,0x07,0x85,0xa0,0xc7, +0x58,0xc7,0x70,0x62,0x46,0xc4,0xb3,0xfb,0x6a,0xaf,0x60,0x42,0x06,0x84,0xb9,0x37, +0xd5,0xe3,0x39,0x33,0xc5,0xc3,0xa9,0x17,0x95,0xa3,0x29,0x13,0x85,0x83,0xb1,0x27, +0xd4,0xe2,0x31,0x23,0xc4,0xc2,0xa1,0x07,0x94,0xa2,0x21,0x03,0x84,0x82,0xb8,0x36, +0x55,0xe1,0x38,0x32,0x45,0xc1,0xa8,0x16,0x15,0xa1,0x28,0x12,0x05,0x81,0xb0,0x26, +0x54,0xe0,0x30,0x22,0x44,0xc0,0xa0,0x06,0x14,0xa0,0x20,0x02,0x04,0x80,0x96,0x60, +0x6f,0x25,0xa4,0x06,0x97,0xae,0xb6,0xd2,0x18,0xcf,0x4f,0xd9,0xab,0x1f,0x80,0x98, +0x6e,0x15,0x53,0x09,0xea,0x0a,0x32,0x36,0xe6,0xcc,0x47,0xc9,0xaa,0x1e,0x01,0xf2, +0x64,0x02,0x41,0x38,0xb0,0x76,0x51,0x67,0x80,0xcf,0x4e,0xd8,0x2b,0x1d,0x29,0xe2, +0x5d,0xa3,0x54,0xbe,0xb7,0x7c,0x73,0xcd,0x66,0x81,0x46,0xc8,0x2a,0x1c,0x9f,0xbd, +0xf9,0x7b,0x1f,0xb9,0xe9,0x5b,0x8f,0x9d,0xb9,0x3b,0x0f,0x99,0xa9,0x1b,0x97,0xad, +0xf8,0x7a,0x17,0xa9,0xe8,0x5a,0x87,0x8d,0xb8,0x3a,0x07,0x89,0xa8,0x1a,0x9e,0xbc, +0x79,0x79,0x1e,0xb8,0x69,0x59,0x8e,0x9c,0x39,0x39,0x0e,0x98,0x29,0x19,0x96,0xac, +0x78,0x78,0x16,0xa8,0x68,0x58,0x86,0x8c,0x38,0x38,0x06,0x88,0x28,0x18,0x7c,0x05, +0x5e,0xc6,0x26,0xff,0xa3,0x28,0x35,0x87,0x68,0xcb,0x4d,0xd1,0xa3,0x17,0x4a,0x45, +0xac,0xec,0x57,0x8f,0x39,0xeb,0xf8,0xbe,0x05,0x4b,0x45,0xc1,0xa2,0x16,0x42,0xab, +0x5a,0x35,0xfd,0xe0,0x9a,0x01,0x36,0xb3,0xee,0x1a,0x4c,0xd0,0x23,0x15,0x9f,0x79, +0x7a,0xee,0xac,0x9b,0x9f,0xab,0x05,0x16,0x8f,0x62,0x44,0xc0,0x22,0x14,0x9d,0xb5, +0xf1,0x73,0x1d,0xb1,0xe1,0x53,0x8d,0x95,0xb1,0x33,0x0d,0x91,0xa1,0x13,0x95,0xa5, +0xf0,0x72,0x15,0xa1,0xe0,0x52,0x85,0x85,0xb0,0x32,0x05,0x81,0xa0,0x12,0x9c,0xb4, +0x71,0x71,0x1c,0xb0,0x61,0x51,0x8c,0x94,0x31,0x31,0x0c,0x90,0x21,0x11,0x94,0xa4, +0x70,0x70,0x14,0xa0,0x60,0x50,0x84,0x84,0x30,0x30,0x04,0x80,0x20,0x10,0xe4,0x9b, +0x48,0x3b,0x5b,0x79,0xcb,0x4f,0x94,0xbc,0xe8,0x7d,0x4b,0x59,0x8b,0x0f,0x53,0x63, +0x9a,0x03,0x53,0x69,0xca,0x4e,0x1a,0xcd,0xc6,0x93,0x43,0x49,0x8a,0x0e,0xd8,0x9f, +0x86,0x8d,0x5a,0x78,0x4b,0x4d,0x8e,0x03,0xbc,0xc2,0x4a,0x58,0x0b,0x0d,0x73,0x7c, +0xa9,0x38,0x52,0x68,0x4a,0x4c,0xbc,0x8a,0x65,0x73,0x42,0x48,0x0a,0x0c,0x9b,0x3d, +0xd9,0x6b,0x1b,0x39,0xc9,0x4b,0x8b,0x1d,0x99,0x2b,0x0b,0x19,0x89,0x0b,0x93,0x2d, +0xd8,0x6a,0x13,0x29,0xc8,0x4a,0x83,0x0d,0x98,0x2a,0x03,0x09,0x88,0x0a,0x9a,0x3c, +0x59,0x69,0x1a,0x38,0x49,0x49,0x8a,0x1c,0x19,0x29,0x0a,0x18,0x09,0x09,0x92,0x2c, +0x58,0x68,0x12,0x28,0x48,0x48,0x82,0x0c,0x18,0x28,0x02,0x08,0x08,0x08,0xdb,0x2a, +0x0e,0x87,0x59,0x71,0xc3,0x47,0x4e,0x8d,0x85,0x25,0x49,0x51,0x83,0x07,0xd1,0x58, +0xae,0xdf,0x51,0x61,0xc2,0x46,0x89,0x9e,0x1a,0x19,0x41,0x41,0x82,0x06,0x58,0xb5, +0x5b,0x6f,0x58,0x70,0x43,0x45,0x4f,0x69,0x6f,0x9c,0x48,0x50,0x03,0x05,0x98,0xbf, +0x28,0x6e,0x50,0x60,0x42,0x44,0x60,0x39,0x9e,0xdb,0x40,0x40,0x02,0x04,0x99,0x35, +0xd1,0x63,0x19,0x31,0xc1,0x43,0x89,0x15,0x91,0x23,0x09,0x11,0x81,0x03,0x91,0x25, +0xd0,0x62,0x11,0x21,0xc0,0x42,0x81,0x05,0x90,0x22,0x01,0x01,0x80,0x02,0x98,0x34, +0x51,0x61,0x18,0x30,0x41,0x41,0x88,0x14,0x11,0x21,0x08,0x10,0x01,0x01,0x90,0x24, +0x50,0x60,0x10,0x20,0x40,0x40,0x80,0x04,0x10,0x20,0x00,0x00,0xf3,0x6e,0x80,0x00, +0x0c,0x4c,0x40,0x05,0x97,0x9b,0x10,0x20,0x40,0x40,0xf0,0x65,0x9c,0xeb,0x51,0xef, +0xe0,0xce,0x88,0xe8,0x90,0x63,0x9f,0xd2,0xc3,0x69,0x7e,0xc4,0x41,0x6e,0xb6,0x85, +0x8c,0xcc,0xa1,0xfd,0x90,0xd9,0x11,0x21,0x6c,0xc9,0x95,0xc7,0x52,0x68,0x60,0xea, +0xea,0x06,0x09,0x35,0xa2,0x01,0xa0,0x53,0x80,0x03,0xf9,0x74,0x5d,0x6e,0xe0,0x53, +0x16,0x60,0xdb,0x36,0xb1,0x22,0xe7,0x68,0x44,0x44,0x29,0xa2,0xf0,0x21,0xa0,0xf2, +0xa7,0x82,0xb0,0xd6,0x16,0x4f,0x58,0x48,0x8b,0x35,0xa8,0x54,0x53,0xa8,0x9a,0x43, +0xfd,0x86,0x49,0x2c,0x31,0x43,0x42,0x5e,0xda,0x04,0xa3,0xe3,0xd2,0x2a,0x9d,0x77, +0x6d,0x64,0xf1,0x85,0x64,0x28,0xf9,0x62,0xd7,0x23,0x49,0xb3,0x39,0x2b,0xa9,0xe0, +0x08,0xf3,0x39,0xfa,0x08,0xd5,0x6a,0x4a,0x0b,0x97,0xd8,0xc3,0xfb,0x65,0xe5,0xe2, +0x62,0x99,0xd0,0x08,0xba,0x2f,0x1a,0x38,0x49,0x49,0xd2,0xab,0x3a,0x59,0x03,0x7b, +0x2f,0x1a,0x79,0x8f,0x9b,0xcc,0x6b,0x29,0xc8,0x4a,0x99,0x25,0x7b,0x6c,0x24,0xe8, +0xd1,0x0e,0x83,0x50,0xfa,0x0b,0x1b,0x39,0xc9,0x4b,0xe3,0xd5,0xdb,0xa0,0xea,0xea, +0xd5,0x83,0xfa,0x9c,0xe1,0x23,0x8d,0x6a,0x3d,0x5c,0x22,0xe8,0x56,0xbb,0x75,0x97, +0xb2,0x41,0x4e,0x05,0x99,0x25,0x8e,0x3e,0xe9,0x93,0x1a,0x7c,0x2b,0x21,0x83,0x49, +0xf0,0xd0,0x6c,0x33,0x47,0x6c,0xbb,0xcb,0x6e,0xc9,0x7b,0xce,0xa5,0x67,0x3b,0x9f, +0x21,0x4e,0x1f,0xad,0x93,0x20,0xa5,0xfd,0xcb,0xfc,0xab,0xbb,0x71,0x2d,0x04,0x80, +0x78,0xf8,0x56,0x72,0x20,0xfd,0x2c,0xf0,0x20,0x5f,0x14,0x8f,0x91,0x8f,0xde,0xb0, +0x26,0xe9,0xec,0xd5,0xdc,0xba,0x18,0x52,0xe3,0x19,0x5c,0xb1,0xa9,0x33,0x4f,0x28, +0x82,0x11,0xc4,0xd1,0x91,0x22,0x75,0xe5,0x9c,0xd9,0x6e,0x21,0xfc,0x53,0x02,0x1d, +0x23,0x3b,0x70,0x77,0x31,0xec,0x8e,0x53,0x63,0x59,0x19,0x83,0xf7,0x73,0x72,0xcc, +0xc9,0x91,0xc4,0xfc,0xb7,0x33,0xab,0x64,0x62,0xc5,0x0b,0xf0,0x74,0x74,0x77,0x8e, +0x10,0xd5,0x14,0x50,0x3f,0x69,0x4f,0xcf,0x7f,0x17,0xa8,0xd0,0xf6,0x52,0xed,0x4b, +0x5b,0xca,0x2d,0x66,0xb4,0x56,0xe2,0xed,0xe4,0x56,0xc6,0xa3,0x50,0x38,0xe1,0x74, +0x76,0x74,0x5d,0xaa,0xf0,0x57,0x5d,0xc9,0x2b,0x67,0x02,0xe5,0xf5,0x77,0xbb,0x78, +0x74,0x17,0xe6,0xcd,0x85,0xb3,0xf0,0x58,0x20,0x57,0xc1,0x88,0xac,0x68,0x04,0x9c, +0x8a,0x14,0x37,0xfe,0x78,0x79,0x1a,0x5a,0xc5,0xd4,0xb9,0xb1,0xfe,0xde,0x67,0xc8, +0x1d,0x17,0x00,0x6f,0x3a,0x12,0x77,0xe9,0xfd,0xd1,0x30,0xa4,0x28,0x2a,0x45,0x67, +0x0a,0x1b,0xf7,0xff,0x46,0xb1,0x67,0x3b,0xe0,0x26,0x37,0x1b,0x7c,0x5c,0xed,0x02, +0x91,0xb3,0xb9,0x4e,0x3f,0x38,0xf6,0xfb,0x7a,0x38,0xc5,0xaa,0xd8,0x32,0xeb,0xdc, +0xac,0x0b,0x84,0x26,0x84,0x60,0x5e,0xc0,0xf4,0x42,0xde,0xfc,0x7b,0x7d,0x60,0xd7, +0x7a,0xb5,0xff,0x23,0x16,0x33,0x6f,0xce,0x15,0x1c,0xa3,0xc9,0xde,0x7e,0x1f,0x47, +0x50,0xca,0xb4,0xb2,0xe2,0x80,0xf7,0x5b,0x6c,0x78,0xdf,0xfd,0xfb,0x7f,0x7e,0x1f, +0x54,0x2b,0xd8,0xeb,0x94,0x1b,0x30,0x05,0x27,0x30,0xb4,0xce,0x56,0x2d,0xd7,0x16, +0x05,0x59,0xa8,0xea,0x14,0xe3,0x00,0x62,0x41,0xce,0xed,0x56,0x31,0xea,0x04,0x03, +0xef,0xa6,0xa1,0xff,0x15,0x59,0x49,0xa1,0xcd,0x9f,0xe9,0xc8,0xd2,0xe2,0x96,0xee, +0x95,0xe0,0xad,0xd1,0xee,0xa7,0x01,0x63,0xcd,0xcc,0xab,0xb3,0xd9,0x34,0x8c,0xc2, +0xfa,0xa4,0x70,0x58,0x06,0x50,0x9f,0x80,0xd9,0x59,0x74,0x82,0x50,0x84,0x8a,0x4d, +0xc9,0x2e,0x18,0xd2,0x1b,0x72,0xe8,0x6c,0x57,0x31,0x27,0x67,0x51,0xe5,0xcd,0x01, +0x05,0x52,0xe4,0x81,0x7c,0xea,0xd9,0xc1,0x41,0xe1,0x58,0x43,0x53,0xc1,0x0f,0x57, +0xec,0x01,0x41,0xf4,0xe8,0xa6,0x7c,0x69,0xd3,0x73,0xea,0x8a,0xc7,0xa9,0xc2,0xbc, +0x8b,0x8f,0xf9,0x0e,0x63,0xa8,0x6d,0x02,0x33,0xe8,0x88,0xc1,0xa7,0x77,0xba,0x1e, +0x10,0x0b,0xba,0xf6,0x1b,0x54,0x72,0xad,0x2e,0x49,0xa3,0x4c,0xe2,0x56,0x8b,0xa9, +0x53,0x65,0x78,0x4d,0x9a,0xea,0xf3,0x2f,0x21,0xcc,0x4c,0xd1,0xda,0xaa,0xbb,0xf9, +0x21,0xca,0x39,0xe9,0x8f,0x76,0x43,0xb9,0xc4,0xaf,0xc0,0xc0,0x2a,0xa9,0xe2,0x38, +0xe5,0x5a,0x22,0x4e,0x6e,0x21,0xf7,0xac,0xa4,0x80,0x82,0x48,0xbc,0x8f,0x6b,0xa9, +0xdd,0x22,0x5d,0x56,0x19,0xad,0xd2,0xd9,0x30,0x8d,0x52,0xdc,0xd8,0xca,0x1d,0xd4, +0xe5,0x38,0x1c,0xcb,0x9e,0x3f,0x83,0xef,0xc2,0x19,0x5b,0xcd,0x01,0x01,0xd9,0xa8, +0x63,0x24,0xf8,0x60,0x87,0xed,0xbb,0x7b,0xbf,0x42,0x04,0x5b,0x5a,0xc8,0x24,0x82, +0x24,0x90,0xa0,0x74,0x77,0x90,0x6e,0xbf,0xc7,0xd6,0x6b,0x0b,0x72,0xf0,0x2c,0x92, +0x25,0xf4,0x27,0x74,0xb7,0xbb,0xbc,0x50,0xc4,0x2e,0xbc,0x8e,0x89,0xe1,0x25,0x83, +0xa4,0x92,0x5e,0xf8,0xf7,0x6d,0x39,0xcd,0x45,0x5a,0xa6,0xd5,0x0b,0xb0,0x77,0x8e, +0x06,0x95,0x4b,0x67,0xf9,0xbc,0x77,0xb2,0x06,0x59,0x7d,0xb7,0x85,0x06,0x97,0xfd, +0xd8,0x9a,0x84,0x82,0xb6,0x29,0xb4,0xe7,0x41,0x96,0xf4,0xe6,0x76,0xf4,0xcf,0xda, +0xfb,0xa5,0x53,0x53,0x39,0x3f,0x43,0xac,0x9a,0x57,0xfc,0xf6,0x77,0xf5,0x0d,0x45, +0x5a,0xd7,0x9d,0xe0,0x4f,0xb9,0xf1,0xad,0xc2,0x0a,0xf5,0xe7,0xf6,0xf6,0x4e,0xdf, +0x7f,0xe7,0x3a,0x55,0xb2,0xce,0x65,0xfa,0xa7,0xdc,0xfd,0xf7,0xf7,0xf7,0x2a,0xe4, +0x8d,0x10,0xc6,0xca,0x48,0x35,0x32,0x54,0x91,0x52,0xb3,0x2a,0x7c,0x69,0x2a,0x78, +0x2d,0x99,0xd6,0x1c,0x34,0xdf,0x1e,0x43,0x6d,0x42,0x16,0x1c,0xa2,0xa6,0xa7,0x69, +0x0d,0x12,0xdf,0x0d,0xbd,0xe2,0xcc,0xf7,0x4f,0xa1,0x68,0xa7,0x7b,0xfd,0x2f,0x9b, +0xad,0x9b,0x97,0xcf,0xb9,0xb4,0x17,0xc9,0x12,0x04,0x17,0x0c,0x35,0x8b,0x8e,0x79, +0xab,0xdb,0x9e,0xea,0xbb,0x9b,0xe1,0x68,0x6f,0xbf,0xf6,0xee,0x7e,0xfc,0xae,0xda, +0x5f,0x10,0xfd,0x23,0x73,0xf3,0xf6,0x3f,0xce,0x57,0xfe,0xfe,0x7f,0xfd,0xcf,0x68, +0xd1,0xfe,0x38,0xde,0xb8,0xbe,0x4d,0x09,0xca,0xd8,0xf7,0xef,0xfe,0xfe,0x90,0x5f, +0xaf,0x0e,0x9f,0x99,0x1d,0x41,0x90,0x19,0x6d,0x97,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, +0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, +0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xc0,0x42,0x91,0x25,0xd0,0x62,0x09,0x11, +0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xc1,0x43,0x99,0x35,0xd1,0x63,0x40,0x40, +0x02,0x04,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0x49,0x51, +0x83,0x07,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0x02,0x08, +0x08,0x08,0x82,0x0c,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2c,0x58,0x68,0x0a,0x18, +0x09,0x09,0x8a,0x1c,0x19,0x29,0x1a,0x38,0x49,0x49,0x9a,0x3c,0x59,0x69,0x03,0x09, +0x88,0x0a,0x83,0x0d,0x98,0x2a,0x13,0x29,0xc8,0x4a,0x93,0x2d,0xd8,0x6a,0x0b,0x19, +0x89,0x0b,0x8b,0x1d,0x99,0x2b,0x1b,0x39,0xc9,0x4b,0x9b,0x3d,0xd9,0x6b,0x42,0x48, +0x0a,0x0c,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0x4a,0x58, +0x0b,0x0d,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0x43,0x49, +0x8a,0x0e,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x4b,0x59, +0x8b,0x0f,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xa0,0x60,0x50,0x94,0xa4,0x70,0x70,0x0c,0x90, +0x21,0x11,0x8c,0x94,0x31,0x31,0x1c,0xb0,0x61,0x51,0x9c,0xb4,0x71,0x71,0x05,0x81, +0xa0,0x12,0x85,0x85,0xb0,0x32,0x15,0xa1,0xe0,0x52,0x95,0xa5,0xf0,0x72,0x0d,0x91, +0xa1,0x13,0x8d,0x95,0xb1,0x33,0x1d,0xb1,0xe1,0x53,0x9d,0xb5,0xf1,0x73,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0x06,0x88, +0x28,0x18,0x86,0x8c,0x38,0x38,0x16,0xa8,0x68,0x58,0x96,0xac,0x78,0x78,0x0e,0x98, +0x29,0x19,0x8e,0x9c,0x39,0x39,0x1e,0xb8,0x69,0x59,0x9e,0xbc,0x79,0x79,0x07,0x89, +0xa8,0x1a,0x87,0x8d,0xb8,0x3a,0x17,0xa9,0xe8,0x5a,0x97,0xad,0xf8,0x7a,0x0f,0x99, +0xa9,0x1b,0x8f,0x9d,0xb9,0x3b,0x1f,0xb9,0xe9,0x5b,0x9f,0xbd,0xf9,0x7b,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x20,0x02, +0x04,0x80,0xa0,0x06,0x14,0xa0,0x30,0x22,0x44,0xc0,0xb0,0x26,0x54,0xe0,0x28,0x12, +0x05,0x81,0xa8,0x16,0x15,0xa1,0x38,0x32,0x45,0xc1,0xb8,0x36,0x55,0xe1,0x21,0x03, +0x84,0x82,0xa1,0x07,0x94,0xa2,0x31,0x23,0xc4,0xc2,0xb1,0x27,0xd4,0xe2,0x29,0x13, +0x85,0x83,0xa9,0x17,0x95,0xa3,0x39,0x33,0xc5,0xc3,0xb9,0x37,0xd5,0xe3,0x60,0x42, +0x06,0x84,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0x68,0x52, +0x07,0x85,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x61,0x43, +0x86,0x86,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x69,0x53, +0x87,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0x22,0x0a, +0x0c,0x88,0xa2,0x0e,0x1c,0xa8,0x32,0x2a,0x4c,0xc8,0xb2,0x2e,0x5c,0xe8,0x2a,0x1a, +0x0d,0x89,0xaa,0x1e,0x1d,0xa9,0x3a,0x3a,0x4d,0xc9,0xba,0x3e,0x5d,0xe9,0x23,0x0b, +0x8c,0x8a,0xa3,0x0f,0x9c,0xaa,0x33,0x2b,0xcc,0xca,0xb3,0x2f,0xdc,0xea,0x2b,0x1b, +0x8d,0x8b,0xab,0x1f,0x9d,0xab,0x3b,0x3b,0xcd,0xcb,0xbb,0x3f,0xdd,0xeb,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x24,0x82, +0x24,0x90,0xa4,0x86,0x34,0xb0,0x34,0xa2,0x64,0xd0,0xb4,0xa6,0x74,0xf0,0x2c,0x92, +0x25,0x91,0xac,0x96,0x35,0xb1,0x3c,0xb2,0x65,0xd1,0xbc,0xb6,0x75,0xf1,0x25,0x83, +0xa4,0x92,0xa5,0x87,0xb4,0xb2,0x35,0xa3,0xe4,0xd2,0xb5,0xa7,0xf4,0xf2,0x2d,0x93, +0xa5,0x93,0xad,0x97,0xb5,0xb3,0x3d,0xb3,0xe5,0xd3,0xbd,0xb7,0xf5,0xf3,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0x26,0x8a, +0x2c,0x98,0xa6,0x8e,0x3c,0xb8,0x36,0xaa,0x6c,0xd8,0xb6,0xae,0x7c,0xf8,0x2e,0x9a, +0x2d,0x99,0xae,0x9e,0x3d,0xb9,0x3e,0xba,0x6d,0xd9,0xbe,0xbe,0x7d,0xf9,0x27,0x8b, +0xac,0x9a,0xa7,0x8f,0xbc,0xba,0x37,0xab,0xec,0xda,0xb7,0xaf,0xfc,0xfa,0x2f,0x9b, +0xad,0x9b,0xaf,0x9f,0xbd,0xbb,0x3f,0xbb,0xed,0xdb,0xbf,0xbf,0xfd,0xfb,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0x80,0xd7,0x80,0x00, +0x0c,0x4c,0xf8,0x86,0x19,0x44,0x0a,0x28,0x63,0xd8,0x78,0x97,0xd5,0x27,0x51,0xef, +0xe0,0xce,0xb0,0x44,0x01,0x2e,0x38,0xcb,0x32,0x4d,0x58,0x34,0x21,0x94,0xb6,0x85, +0x84,0xd3,0xb9,0xd5,0x2f,0x2d,0x4f,0xa1,0xc8,0x39,0x39,0x86,0xaf,0x11,0x60,0xea, +0xea,0x06,0xe9,0xd5,0x5f,0xa8,0xe6,0xcf,0xc7,0x63,0xd9,0xb1,0xd1,0xf2,0x6f,0x3f, +0xdb,0xb9,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x08,0x62, +0xfc,0x03,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x0b,0x44, +0xe9,0x09,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0xc1,0x53, +0x22,0x58,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0xa9,0xe0, +0x08,0xf3,0xff,0xee,0x2b,0x0a,0x4b,0xd1,0xc8,0xd3,0x25,0x24,0x5e,0x68,0xe5,0xe2, +0x62,0x99,0x30,0xfc,0xa6,0x69,0x32,0xbc,0x41,0x9b,0x9a,0x04,0x26,0x79,0x03,0x7b, +0x2f,0x1a,0x59,0x0c,0xab,0x08,0x13,0xd4,0xc8,0x91,0x80,0x12,0xc0,0x28,0x24,0xe8, +0xd1,0x0e,0x8b,0xb4,0x16,0x29,0x42,0xbd,0x3c,0x84,0x73,0x9f,0x5c,0x6c,0xf6,0x2a, +0x49,0xf0,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0xb1,0x37, +0x56,0xf2,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0xbe,0x27, +0xc3,0x01,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x2b,0x1d, +0x0b,0xd2,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x78,0xf8,0xfa,0xb6,0xb5,0x26,0xcb,0xa0,0x17,0x5c,0xa9,0xe2,0xd2,0x3e,0xde,0xb0, +0x26,0xe9,0xd5,0x80,0xbc,0x52,0xd8,0xcf,0x05,0x9e,0x37,0xcb,0x33,0x78,0x4f,0x28, +0x82,0x11,0xba,0xdb,0x41,0xee,0xd5,0xa0,0xb6,0x49,0xe1,0x81,0x25,0xcf,0x02,0x1d, +0xda,0x02,0x26,0x30,0x64,0x2d,0x5c,0xcf,0x87,0x9c,0x98,0xa5,0xd2,0x82,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0xd9,0x89, +0x2e,0x38,0xfb,0x7f,0xe0,0xec,0x4f,0x2d,0x8d,0x4a,0xf6,0xec,0x56,0xf5,0x36,0x70, +0x6b,0xd6,0x66,0x16,0x1b,0xef,0x12,0xcf,0x0a,0x26,0x52,0xde,0x3a,0x87,0xad,0x0b, +0xab,0xfc,0xa4,0x7c,0x24,0x7a,0x9d,0xc9,0xf8,0x5c,0xef,0x89,0x7a,0x32,0x55,0x6b, +0x0a,0x1d,0xf0,0xee,0x53,0x93,0x67,0xbb,0x1e,0x5d,0xe7,0x3f,0xfc,0xe2,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x7e,0x1f, +0x54,0x2b,0x17,0x07,0x99,0xac,0x31,0x5d,0xa3,0xc6,0x5f,0xc8,0xd1,0x47,0xd7,0x16, +0x05,0x59,0x4e,0xe7,0xdf,0xe1,0x40,0xb0,0x44,0xb9,0x39,0x31,0x22,0xe5,0x04,0x03, +0xef,0xa6,0xc9,0x19,0x52,0x56,0x79,0xb4,0xa7,0x0d,0x97,0x2a,0x50,0x46,0x96,0xee, +0x95,0xe0,0xf7,0x85,0x91,0x2e,0x63,0x32,0x66,0xb8,0x66,0x27,0x52,0xe4,0x18,0x65, +0xfb,0x8b,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0xbf,0xd0, +0x02,0xfc,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x5e,0xc6, +0x88,0x0c,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x11,0x77, +0xa3,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0xc2,0xbc, +0x8b,0x8f,0xdc,0x90,0xf7,0x5e,0x12,0xd3,0x4c,0x53,0x02,0x9c,0x72,0xad,0xba,0x1e, +0x10,0x0b,0xc9,0xed,0xf9,0x06,0x32,0xbe,0x45,0xd2,0x55,0xcc,0x5b,0xe9,0x8b,0xa9, +0x53,0x65,0xfd,0x94,0x8c,0x05,0x1b,0xd6,0xcc,0x11,0x45,0x8a,0x59,0xed,0xbb,0xf9, +0x21,0xca,0x1d,0xee,0x75,0xfb,0x64,0x39,0xbe,0xcb,0xec,0xe1,0x24,0x95,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x28,0x85, +0x85,0x18,0xd6,0x66,0x70,0x3b,0x7c,0x35,0x07,0x3f,0x8e,0x44,0xf6,0xb8,0xbb,0x62, +0x2d,0x9e,0xae,0xb8,0xc3,0xc4,0x06,0x50,0xe7,0xd9,0xdc,0xf2,0x7a,0xfc,0x27,0x61, +0x26,0xda,0x8e,0x69,0x0b,0xb6,0x4d,0x21,0xe1,0x03,0xa8,0x45,0x58,0xfd,0x4d,0xd7, +0xd1,0x9c,0x5a,0xc8,0x08,0x4f,0xb4,0x51,0x67,0xfb,0xf7,0x49,0x56,0xfe,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0x46,0x4a, +0xe2,0x13,0x0d,0xe0,0xe9,0xb6,0xd2,0xc8,0x2d,0x98,0xfc,0x55,0xdf,0x04,0xa7,0x6a, +0x25,0x96,0x0d,0x96,0xe1,0x89,0x64,0xbb,0xce,0xdf,0xbe,0x3c,0x7c,0x9a,0x59,0x69, +0x2e,0x92,0xcf,0x09,0x40,0xfb,0x4f,0x29,0xe5,0x3e,0x0c,0xf0,0xfa,0xba,0x9b,0xe9, +0x0e,0x56,0x8c,0x93,0x65,0xcb,0x77,0x2c,0x8e,0xc4,0xe5,0xbe,0x5e,0xba,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0x8b,0xcc,0x80,0x00, +0x0c,0x4c,0x04,0x44,0xca,0x26,0x11,0xd4,0x40,0xbd,0xa2,0x62,0xc2,0xdd,0x51,0xef, +0xe0,0xce,0xe8,0x54,0x0c,0xaa,0x41,0xb1,0xa0,0x80,0x1a,0x73,0x7f,0xbd,0xb6,0x85, +0x8c,0x80,0x09,0x39,0x71,0x2d,0xbd,0xa4,0xe1,0xc0,0x3a,0x5f,0x05,0x79,0x60,0xea, +0xea,0x06,0x0d,0xf7,0x13,0x2b,0xe3,0xb9,0xa2,0x41,0x4d,0x6b,0x42,0x5c,0xe8,0xe2, +0x85,0x23,0x00,0x44,0x62,0x68,0x90,0x65,0x52,0x05,0xd0,0x64,0x52,0x64,0x4d,0x4a, +0x17,0xb1,0x60,0xf7,0x6c,0xa5,0xb0,0xc3,0xc6,0x02,0xd8,0x74,0x53,0x65,0xd1,0x5f, +0x92,0xf2,0xb1,0x83,0x38,0x67,0xf2,0x69,0x1e,0x76,0xd1,0x65,0xd2,0x66,0xcc,0x97, +0x69,0x4b,0x09,0x55,0xe3,0x6b,0x99,0x75,0x30,0x0b,0xd9,0x75,0xd3,0x67,0xa9,0xe0, +0x08,0xf3,0x0b,0x7e,0xbb,0x2e,0xc0,0xde,0x7b,0x2a,0xec,0x37,0x8c,0xfc,0xe5,0xe2, +0x62,0x99,0xf2,0x9e,0x18,0x4b,0x40,0xb8,0x2f,0x86,0xfb,0x9c,0x8f,0xd6,0x03,0x7b, +0x2f,0x1a,0xcb,0x9f,0xfb,0xd5,0x29,0x1d,0x2f,0x58,0xcd,0x22,0xdc,0x24,0x24,0xe8, +0xd1,0x0e,0xb3,0xcd,0x76,0x24,0x21,0xd1,0x8f,0x84,0xa5,0x8e,0x90,0xec,0xb2,0x0e, +0xa0,0xf7,0xb2,0x8a,0xb0,0x6d,0x26,0x95,0x6a,0x0e,0xd2,0x6c,0x5a,0x6c,0x70,0xa7, +0x0d,0x0d,0xca,0x5c,0x1b,0x2d,0x9a,0x78,0x3b,0xb8,0xda,0x7c,0x5b,0x6d,0xc7,0xcd, +0x8a,0x9f,0x53,0x4d,0x9a,0x2e,0x53,0x51,0x2b,0xb1,0xd3,0x6d,0xda,0x6e,0x58,0x66, +0x9b,0x4d,0xcb,0x5d,0x9b,0x2f,0x5a,0xfd,0xcb,0xde,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x78,0xf8,0x44,0x80,0x78,0xbd,0xc9,0x80,0x66,0x70,0xe2,0xe2,0xd6,0x3c,0xde,0xb0, +0x26,0xe9,0x77,0x10,0x35,0xf9,0x26,0x52,0x1a,0x55,0x9c,0x8c,0x90,0x8e,0x4f,0x28, +0x82,0x11,0x78,0x7e,0x43,0xcd,0xe3,0x23,0xe1,0x2a,0xe1,0x58,0xce,0x30,0x02,0x1d, +0x92,0xd1,0xb7,0x6a,0x46,0x71,0x66,0x4e,0x96,0x5f,0x5d,0xb5,0x81,0x86,0x7f,0x86, +0x80,0x5a,0xc4,0xc4,0x32,0x34,0x24,0xc6,0x80,0x12,0xd4,0xe4,0x72,0x74,0xeb,0xd9, +0xf3,0x45,0xcc,0xd4,0x33,0x35,0x5c,0x86,0x47,0x1b,0xdc,0xf4,0x73,0x75,0x31,0xe5, +0x76,0x06,0xc5,0xc5,0xb2,0x36,0x55,0xa7,0x40,0x57,0xd5,0xe5,0xf2,0x76,0x6a,0xdc, +0x24,0xb0,0xcd,0xd5,0xb3,0x37,0x2b,0xb7,0x45,0x15,0xdd,0xf5,0xf3,0x77,0xdc,0x84, +0x1b,0xda,0x06,0x9e,0x3e,0x78,0xd6,0xa9,0x33,0x43,0x97,0x28,0x78,0xe9,0x6e,0xd8, +0x27,0x14,0x4e,0x9c,0x43,0x3d,0xa1,0x4e,0xeb,0x51,0x8d,0x41,0x69,0x37,0xc5,0xff, +0x8b,0x45,0x2a,0x09,0xbc,0xb7,0x55,0xd7,0x0f,0x4a,0x20,0xa4,0xfe,0x7a,0x05,0x91, +0x0a,0x16,0xe3,0x5a,0xbb,0xce,0x92,0x49,0xe1,0x54,0xef,0xfb,0x5b,0x85,0xee,0x6e, +0x2c,0x5c,0xc6,0xcc,0x3a,0x3c,0xd6,0x12,0xef,0x7b,0xd6,0xec,0x7a,0x7c,0xce,0x5c, +0x2b,0x8c,0xce,0xdc,0x3b,0x3d,0x4d,0xbe,0xc9,0x13,0xde,0xfc,0x7b,0x7d,0x3c,0x8f, +0x00,0xe5,0xc7,0xcd,0xba,0x3e,0x88,0x89,0xec,0x5e,0xd7,0xed,0xfa,0x7e,0x75,0x26, +0xad,0x1f,0xcf,0xdd,0xbb,0x3f,0x2b,0x7d,0xef,0x58,0xdf,0xfd,0xfb,0x7f,0x7e,0x1f, +0x54,0x2b,0x98,0xd6,0xe9,0xaf,0x50,0x66,0x38,0x4b,0xe8,0x32,0x37,0x7c,0xd7,0x16, +0x05,0x59,0xac,0xf4,0x97,0xa9,0xab,0xd0,0xc7,0xc9,0x09,0x88,0xe9,0x16,0x04,0x03, +0xef,0xa6,0xc1,0x47,0x7a,0x29,0x35,0xc1,0x46,0x8a,0x48,0xc8,0x54,0x62,0x96,0xee, +0x95,0xe0,0x5c,0xf5,0x95,0x08,0xb4,0xd1,0x47,0xcb,0x16,0x58,0x08,0x3f,0x60,0x7a, +0xfa,0xb4,0xe0,0x46,0x16,0xa4,0xc7,0x6b,0x40,0xc4,0xf0,0x66,0x56,0xe4,0xed,0x54, +0xcf,0xd5,0xe8,0x56,0x17,0xa5,0x0c,0xf6,0x43,0xc2,0xf8,0x76,0x57,0xe5,0xa1,0x43, +0xf6,0x22,0xe1,0x47,0x96,0xa6,0x62,0x25,0x64,0x88,0xf1,0x67,0xd6,0xe6,0xcd,0xae, +0x07,0x5c,0xe9,0x57,0x97,0xa7,0xb9,0x76,0xd7,0x86,0xf9,0x77,0xd7,0xe7,0xc2,0xbc, +0x8b,0x8f,0x04,0x0f,0x1c,0xa1,0xbb,0xc8,0x7f,0x8a,0x0b,0x70,0xdf,0xe6,0xba,0x1e, +0x10,0x0b,0x2a,0xe4,0xfc,0xd6,0xc5,0xd2,0x4f,0x04,0xbb,0x21,0x45,0x7d,0x8b,0xa9, +0x53,0x65,0xde,0xef,0x73,0xe8,0x89,0xd5,0xdc,0x07,0x53,0x10,0xf8,0x3e,0xbb,0xf9, +0x21,0xca,0xd4,0xe5,0x62,0x74,0x40,0x33,0x28,0x74,0x3a,0x24,0xc1,0xa5,0x63,0x8c, +0xac,0xc9,0xe2,0x4e,0x1e,0xac,0xda,0xc9,0x31,0x6c,0xf2,0x6e,0x5e,0xec,0x81,0xad, +0x09,0x8d,0xea,0x5e,0x1f,0xad,0xfc,0xbc,0xed,0x81,0xfa,0x7e,0x5f,0xed,0x11,0xee, +0x0b,0x89,0xe3,0x4f,0x9e,0xae,0xb3,0x6b,0xbe,0x35,0xf3,0x6f,0xde,0xee,0x3c,0x84, +0x2c,0xf1,0xeb,0x5f,0x9f,0xaf,0x0b,0xa4,0x78,0x81,0xfb,0x7f,0xdf,0xef,0x2e,0x02, +0x87,0x96,0xa0,0xc1,0xb5,0xbe,0x6b,0xa0,0x17,0xd0,0x4d,0xe0,0x9e,0x54,0xea,0x64, +0x16,0x93,0xf2,0x05,0x31,0x1a,0xfc,0xb3,0x3e,0xca,0x18,0x4a,0xf5,0x0a,0x6d,0x11, +0x05,0x89,0x06,0x11,0x68,0x54,0xea,0xa3,0x93,0xde,0x30,0xa1,0x3c,0xa2,0xf7,0xf1, +0xb5,0x58,0xcf,0x93,0x54,0x1c,0x7b,0xcc,0x81,0x1c,0xbf,0x71,0x57,0xb6,0x77,0xfd, +0x32,0xd6,0xe4,0xc6,0x36,0xb4,0xb4,0xe7,0x76,0x95,0xf4,0xe6,0x76,0xf4,0xac,0xd2, +0x57,0x31,0xec,0xd6,0x37,0xb5,0xbc,0xf2,0x17,0x2e,0xfc,0xf6,0x77,0xf5,0x65,0xfb, +0x5a,0xe6,0xe5,0xc7,0xb6,0xb6,0xdd,0x40,0x99,0x76,0xf5,0xe7,0xf6,0xf6,0x68,0xd5, +0x6f,0x87,0xed,0xd7,0xb7,0xb7,0x7c,0x35,0x45,0x92,0xfd,0xf7,0xf7,0xf7,0x26,0x62, +0x62,0x55,0x45,0x7d,0xe2,0x13,0x77,0xd4,0x0a,0x17,0xc4,0x0b,0xd8,0x1f,0x16,0x8a, +0x4a,0x9c,0xd0,0xa8,0xd6,0x5c,0x26,0xb3,0x5e,0x1b,0xc4,0x3a,0x7d,0x4a,0xd8,0x63, +0xaa,0x99,0xc0,0x87,0x57,0x2c,0x36,0xdd,0xfe,0x12,0x63,0xe9,0x5e,0x04,0x0f,0x9f, +0xca,0x92,0xf1,0xac,0xa9,0x14,0x85,0xaf,0x60,0x5d,0x54,0xc4,0x62,0xc6,0xc2,0xa8, +0x82,0x63,0xe6,0xce,0x3e,0xbc,0x04,0x4f,0xeb,0xdb,0xf6,0xee,0x7e,0xfc,0x17,0x9c, +0x8d,0xd3,0xee,0xde,0x3f,0xbd,0x96,0x59,0x90,0x9c,0xfe,0xfe,0x7f,0xfd,0xa7,0xcb, +0xde,0xe0,0xe7,0xcf,0xbe,0xbe,0x98,0x1c,0x6b,0xd9,0xf7,0xef,0xfe,0xfe,0x1b,0x5f, +0xab,0x98,0xef,0xdf,0xbf,0xbf,0xd7,0x58,0x90,0x1f,0xff,0xff,0x57,0x3d,0x26,0x59, +0x70,0xa4,0xe1,0x62,0xef,0x8d,0x18,0x24,0x68,0x5e,0x8d,0xad,0xbb,0x04,0x1d,0xe0, +0x1a,0xa0,0x08,0x35,0xd2,0x8c,0xd8,0x58,0x46,0x4c,0xe0,0xc5,0xf2,0x21,0x8a,0x38, +0x61,0xad,0x10,0x42,0x4e,0x28,0x4b,0xae,0xa8,0x73,0x2a,0xc7,0x7c,0x9f,0x1c,0x95, +0xb0,0x50,0x1c,0xc5,0xcd,0x2a,0x41,0x35,0xe9,0xcd,0xa7,0x1c,0x31,0xe2,0x78,0xb3, +0x3e,0xa9,0xf8,0xbb,0xf0,0xdb,0x2a,0x80,0x50,0xf1,0x43,0x40,0x8e,0xd5,0x51,0x05, +0xa2,0x8a,0xdd,0xd0,0x22,0xcd,0xc2,0xfa,0xaa,0x46,0x4f,0x9e,0xf6,0xef,0x11,0x70, +0xba,0x44,0x85,0x36,0xb0,0x87,0xc0,0x5e,0xfa,0x04,0x39,0xd0,0xb1,0xef,0x51,0x55, +0x8a,0xf1,0xf7,0x7c,0x95,0x3e,0x4f,0x58,0xc5,0x5e,0xa1,0xb2,0x11,0x65,0x3a,0x68, +0x53,0x83,0x06,0xc9,0x24,0x27,0x48,0x07,0x20,0x79,0x2c,0xa8,0x69,0x88,0x13,0x89, +0xa8,0x02,0x15,0x33,0xc0,0x14,0x67,0xca,0x6a,0x09,0xa4,0x10,0x5f,0x50,0xd8,0x38, +0xb0,0x48,0x2c,0x66,0x45,0x68,0xd3,0x41,0x82,0x47,0x68,0x0a,0x79,0x95,0xc7,0xe9, +0xe8,0xaa,0xa4,0x22,0xa1,0x69,0x0f,0x81,0xaa,0xc2,0x8d,0xce,0x55,0xb6,0x7c,0x61, +0x4a,0xa3,0x4a,0x3f,0x22,0x23,0xdc,0x98,0x42,0x0e,0xda,0x68,0xf2,0x1e,0x2c,0x98, +0x0a,0x4d,0x46,0x23,0xb8,0x8d,0x22,0x7a,0x0b,0xed,0x19,0x8c,0x53,0xb6,0xd2,0x3a, +0xbe,0x62,0xe3,0x5c,0x9c,0x37,0x4a,0x2d,0xa9,0x6e,0x64,0x54,0xdc,0xb7,0x47,0xc6, +0x62,0x5e,0x5a,0x1c,0x3d,0x8f,0xca,0x38,0x81,0xef,0xdb,0x57,0xa3,0x7f,0xbc,0xc4, +0x1c,0x14,0x44,0xec,0x7a,0x3d,0xd4,0xc8,0x06,0x5d,0x6f,0xdb,0x25,0x8f,0x36,0x6f, +0xa1,0x73,0xe6,0xe7,0x09,0x73,0x09,0x34,0x50,0xf3,0x64,0xb6,0x69,0xd1,0xc4,0x70, +0x9c,0x32,0xff,0xe5,0xb4,0x13,0x4d,0x10,0x83,0x89,0xfd,0xc7,0x43,0x8f,0x33,0xbc, +0xe2,0x1c,0x94,0x6f,0x46,0x56,0x25,0x21,0x42,0xd8,0x0c,0xc6,0xc5,0x1f,0xe8,0x33, +0xae,0x19,0xdc,0xf9,0xdb,0x05,0x94,0x85,0x05,0x4f,0xaa,0xd8,0x9b,0x17,0x55,0x1c, +0xdc,0x9e,0x5d,0x93,0xf9,0xbf,0x18,0xb7,0xe1,0x81,0x70,0x6b,0x72,0x35,0x5a,0xa1, +0xac,0x54,0xc7,0x36,0x86,0x9b,0x61,0x87,0x00,0x76,0x97,0x1a,0x1b,0xa7,0x8b,0xe0, +0xd3,0xb8,0x85,0xf0,0xb5,0x2e,0xa8,0x93,0x29,0x86,0xf9,0x5f,0x1a,0xa6,0x1e,0x91, +0xc9,0xb7,0xbe,0x4b,0xf2,0x89,0xcd,0x99,0x5c,0x1a,0xf4,0xb1,0x79,0x6c,0x18,0xb1, +0x2f,0x00,0x53,0xee,0xd2,0x68,0x66,0x83,0x51,0xac,0x0e,0x4d,0x05,0x2c,0x92,0x76, +0xcb,0x20,0x3c,0x1e,0xc8,0x32,0x0e,0x38,0x49,0xda,0x91,0x84,0xf0,0x01,0xde,0xeb, +0x0a,0x90,0x4f,0xf5,0xdf,0x36,0x8e,0x3d,0x9c,0xb2,0xc1,0x1d,0x59,0x00,0xe6,0xba, +0x48,0x70,0x4a,0xae,0xc5,0x91,0x36,0xf6,0xdc,0x51,0xd4,0x1f,0x06,0xd1,0x16,0x45, +0x2d,0x04,0xd7,0x89,0x9a,0xc4,0x7e,0xe5,0xe6,0x5b,0xd6,0xf8,0xf3,0xfa,0x39,0xce, +0x0b,0xe7,0x97,0xfc,0x82,0x7c,0x31,0xd0,0xeb,0xbc,0x40,0xaa,0x30,0x1d,0x86,0x26, +0xad,0xc5,0x97,0xc0,0x52,0x6e,0xfc,0xe6,0x4a,0xf9,0x85,0x9d,0x93,0xae,0x35,0xe8, +0xa1,0x2f,0xbf,0x6e,0x77,0xd6,0x25,0xc8,0xe1,0x6f,0xc8,0x01,0xa9,0xef,0x3d,0x96, +0x34,0x37,0x60,0x74,0xea,0x2a,0xc7,0x59,0xc8,0x37,0x78,0x5e,0xdc,0x1e,0xb4,0xf3, +0xd1,0x23,0xb7,0x2e,0x92,0xbb,0xa4,0xcb,0x56,0x8f,0xeb,0x36,0xbc,0xd3,0x11,0xec, +0x6c,0xf2,0xe4,0x3e,0x93,0xba,0x31,0xea,0x2c,0xb2,0xe3,0x11,0xbd,0xb2,0x76,0x20, +0x6e,0x89,0xf5,0x07,0xf2,0x29,0x65,0x43,0xe1,0x49,0xd0,0x77,0xdb,0x87,0xe4,0x30, +0xe4,0x8e,0x44,0xc5,0x54,0xaf,0xd4,0xe1,0x04,0xcf,0x85,0x89,0xa2,0xfe,0x1f,0x7b, +0x80,0x9f,0x9f,0x6e,0x7f,0x97,0x0f,0x4a,0x2f,0xf7,0x5a,0xc2,0x03,0xf8,0xf2,0xd7, +0xaa,0x4c,0xe0,0xa7,0x09,0x06,0xa3,0x00,0xff,0x47,0xd9,0xa3,0x3c,0xc4,0x7a,0x86, +0x8b,0x49,0x73,0x71,0xbf,0x23,0x78,0xc8,0x6f,0x22,0xcb,0x51,0xfb,0x63,0xa0,0x7a, +0x01,0x74,0x3f,0xf8,0x35,0x27,0x82,0xc5,0xa4,0x98,0x83,0x7c,0xfc,0xa4,0x7a,0x08, +0x69,0x98,0xb9,0x26,0x2f,0x07,0x4d,0x07,0xff,0xdc,0xa9,0x1e,0xe8,0xf5,0x33,0x0e, +0xbe,0xdd,0xf1,0x30,0xf5,0x9a,0x97,0xa4,0xce,0x38,0x44,0xd7,0x88,0xa6,0x38,0xde, +0x66,0xfd,0xf7,0xca,0x2f,0xe6,0x0c,0x46,0xa7,0x9d,0x4d,0x66,0x19,0x43,0x30,0xcf, +0x67,0xfc,0xba,0x6f,0x27,0xef,0xe0,0xfe,0x7e,0xa5,0xed,0xfa,0x6e,0x4f,0xa3,0x23, +0xd9,0x31,0xdb,0x2f,0xa8,0x03,0xdf,0xf8,0x8d,0xc4,0x23,0x9f,0xa9,0x4f,0x15,0x5d, +0x6e,0x0c,0xf2,0x0a,0x3e,0x20,0x43,0x89,0xec,0xb5,0xc3,0x8c,0xf1,0x62,0x3e,0xb3, +0x1c,0x8f,0xfc,0xef,0x32,0xa9,0xf4,0xca,0x3e,0x2d,0x33,0x5f,0x8b,0x05,0xa7,0xa3, +0x1d,0xd3,0x77,0xa7,0x01,0xf3,0xfc,0xda,0x53,0x5c,0x77,0x55,0x57,0x70,0x1b,0xae, +0x03,0x19,0xe2,0xf8,0x17,0x39,0x4d,0x53,0xff,0xe3,0xe5,0x99,0x88,0xb0,0x34,0x08, +0x58,0x9c,0xb4,0x06,0xd6,0x93,0x45,0xa2,0xea,0x58,0x3d,0xf6,0x59,0x7e,0xd8,0x7d, +0x22,0x36,0xf2,0xa4,0x5e,0xb9,0xe7,0x60,0xb2,0x00,0x34,0x8e,0x3c,0xf9,0x54,0x41, +0x53,0x93,0x5b,0xff,0x31,0x7c,0xfe,0x02,0x98,0x7a,0x6b,0x72,0x46,0x57,0xc9,0x41, +0x72,0x02,0x9b,0xff,0x4e,0xe7,0x4d,0x70,0x9e,0xde,0x0a,0x17,0xd7,0x57,0xce,0xdc, +0x06,0x31,0x8c,0xc6,0x83,0xb3,0x6a,0x00,0x93,0x7a,0xc5,0x0c,0xf1,0x6e,0x20,0xa3, +0xc5,0xa9,0xde,0x7f,0x9f,0xf8,0x83,0x9b,0x54,0x9a,0xc8,0x87,0x95,0xc9,0x14,0x69, +0x15,0x34,0xac,0x60,0x91,0xb4,0x46,0xb8,0x2d,0x79,0x3e,0xdf,0x16,0x54,0x3d,0x96, +0x8f,0xbc,0x99,0xa6,0xba,0xa3,0x2e,0x3a,0x8f,0x25,0x1b,0x3c,0xff,0xf2,0x3a,0xdc, +0x67,0x91,0x50,0xec,0x89,0xf9,0xae,0xba,0x0b,0xc0,0xaa,0x8e,0x5c,0x5a,0x71,0x8a, +0x6a,0x17,0x0c,0xdf,0x06,0xb8,0xe5,0x18,0x4d,0xbc,0x93,0xa1,0x83,0x80,0xfd,0xa9, +0x5b,0x12,0x59,0xf7,0x39,0x24,0xee,0x89,0x4d,0x7c,0xe9,0xcf,0xde,0x5c,0x98,0x38, +0xd6,0x31,0x93,0xeb,0x46,0xef,0x49,0xd2,0x0d,0xd5,0x5e,0x91,0x6b,0x53,0x37,0xde, +0x46,0x2e,0x8a,0xc1,0xc7,0x4b,0x6a,0x7f,0xde,0x37,0xc7,0x0c,0xdd,0xbd,0x19,0xf3, +0xc2,0xa0,0x13,0x06,0x9b,0xd5,0xc4,0xde,0xcf,0x3d,0x98,0x20,0xd7,0x21,0x74,0x82, +0x49,0x09,0xd2,0x15,0x66,0x21,0x19,0x43,0x67,0xe9,0xe0,0x47,0x21,0xe7,0x49,0x14, +0x86,0x1b,0xd1,0x81,0x8b,0x77,0xf6,0x4f,0x16,0x4a,0x7d,0x56,0xa8,0xe4,0x8a,0xd6, +0xb2,0xbb,0xb8,0x2c,0x81,0x27,0x4d,0xd1,0xc5,0x66,0x99,0xf5,0xc1,0x9e,0x7e,0x5f, +0x76,0xa9,0x82,0xbb,0xfb,0xd5,0x2e,0x4c,0x01,0x4b,0xd6,0x59,0xdb,0xbb,0x76,0x6c, +0x8c,0x83,0x92,0x7b,0x7b,0xd4,0x4e,0x59,0x45,0x7c,0x03,0x49,0x55,0x7c,0xd6,0x61, +0x2f,0x36,0x6d,0xda,0x91,0xbd,0x09,0x6d,0xa1,0xdb,0x41,0x7a,0xe6,0xed,0x5b,0x11, +0xdd,0x03,0x09,0x3d,0xd9,0x2a,0x1d,0x81,0xcb,0x48,0x9f,0x17,0x38,0x16,0xba,0x87, +0x1a,0x45,0x84,0x4b,0x36,0xf4,0xd7,0x53,0x9d,0xd5,0xf0,0xce,0xad,0xee,0xdc,0x1a, +0x59,0x67,0x4a,0x75,0x33,0x68,0xce,0x66,0x67,0x95,0x39,0x83,0x3a,0x49,0xe2,0x49, +0x8a,0x46,0x57,0x53,0x0b,0x15,0xb8,0xc1,0xcc,0x26,0x93,0x6d,0x9c,0x6c,0x52,0xdd, +0x2c,0x7d,0x56,0x00,0xe2,0xf0,0x72,0xd2,0x36,0x25,0xe3,0x4e,0xed,0xe1,0xc4,0x3b, +0x7e,0x62,0xdc,0x75,0x39,0xb5,0x54,0x41,0xa3,0x7d,0x12,0x10,0x0c,0xe1,0x10,0xa4, +0x63,0x7c,0x9a,0x2f,0x39,0x41,0x3a,0x66,0xf6,0x40,0x4f,0xbc,0x73,0xe6,0x21,0xcb, +0x8b,0xcc,0xfd,0x70,0xda,0x81,0x21,0x74,0x49,0x0f,0x28,0x13,0x57,0xc8,0x8b,0x31, +0xc1,0x02,0xad,0x9d,0x98,0x26,0x19,0x9b,0xa8,0x39,0xc3,0x41,0xdd,0x76,0x20,0xe7, +0xd7,0x20,0xdc,0x80,0xb9,0x39,0x40,0x52,0x53,0x54,0x90,0xc4,0x4d,0x1e,0xd8,0xce, +0x0f,0xcd,0xf5,0xf2,0xda,0x60,0xd3,0x46,0x45,0x57,0xa2,0x8c,0xb3,0x41,0xb9,0x69, +0xa4,0x7e,0xdf,0xf5,0xd8,0x43,0xdf,0x57,0xf0,0x9f,0xab,0x9c,0x32,0x7b,0x64,0x7a, +0x5e,0x88,0x4d,0xfd,0x2b,0x3e,0xab,0xd1,0x40,0xfc,0x95,0xb1,0x71,0x6b,0xd1,0xff, +0x1a,0x56,0x53,0x40,0x57,0x22,0xab,0x9b,0x0a,0x59,0xad,0x82,0x31,0x7b,0x72,0xed, +0x03,0xf8,0x0c,0xbc,0x79,0xbe,0x5e,0x00,0x25,0xe4,0xce,0x16,0x06,0x7e,0xd8,0x02, +0xa1,0xe6,0x9f,0xea,0xda,0x35,0x43,0x83,0x19,0x8d,0x2e,0x0d,0xa7,0x3b,0x4b,0x94, +0xdf,0x13,0x32,0x37,0x4f,0xc6,0x9d,0x99,0xb4,0xc8,0x4a,0x71,0xc2,0x77,0x06,0x71, +0x24,0x5a,0xf8,0xb1,0xc0,0x49,0x46,0x59,0x1c,0x78,0x3a,0xd3,0xba,0x7d,0xe9,0xf6, +0xff,0x11,0x03,0x82,0x49,0xcd,0xca,0x78,0x59,0xd2,0x9d,0xcf,0x01,0xff,0x03,0x4e, +0x27,0x67,0x30,0xa4,0xbe,0xa3,0x29,0x95,0x65,0xfc,0x2c,0x3f,0xf8,0x70,0xc3,0xea, +0x8f,0xb3,0x98,0xda,0x50,0x8a,0x07,0x88,0x9d,0x19,0xb7,0xce,0x89,0xfd,0x66,0xc0, +0x27,0xed,0x06,0x05,0x8e,0x91,0x0c,0x7c,0x16,0x1e,0xad,0xcb,0xdb,0xc3,0xd9,0x25, +0x2d,0x04,0x4c,0xaf,0x19,0x94,0x56,0xe8,0x54,0x7d,0x9b,0x78,0x4a,0x5a,0x46,0xcb, +0xa6,0x74,0x50,0xbc,0xce,0x37,0x4e,0x35,0x65,0xc8,0xe9,0xc1,0xfc,0x47,0x2a,0xaa, +0xd7,0x10,0x5c,0x3d,0xb5,0xb4,0x7f,0xfd,0xd4,0x5f,0x1f,0x95,0x41,0x3d,0x61,0x64, +0x92,0x88,0xfb,0x31,0x6b,0x22,0x8d,0xbd,0xf1,0x16,0xc8,0xdd,0x75,0x02,0xfc,0x62, +0x01,0x8a,0xd5,0x64,0xfe,0x90,0x80,0xcd,0xac,0xcb,0x80,0xcc,0xac,0x8d,0xa1,0x45, +0xea,0x2f,0x7a,0x2d,0x92,0x98,0x39,0x2f,0xf7,0xe7,0xe8,0x7b,0x71,0x63,0x20,0x2c, +0xa7,0xc1,0x97,0x3e,0x18,0x05,0xd5,0xac,0xc6,0xba,0xda,0x77,0x85,0x1e,0x22,0xa0, +0x65,0xf1,0xba,0x69,0x7e,0xa7,0x67,0xe6,0x77,0x8e,0xb6,0x04,0xad,0x1d,0x2e,0xa2, +0xf8,0x8a,0xf6,0x6f,0x34,0xaf,0xf7,0x10,0xca,0x13,0xef,0xf2,0x66,0x47,0x77,0x6a, +0x80,0x9f,0x21,0x2f,0xdc,0xab,0x49,0x9d,0xc0,0xdf,0xe9,0xe2,0xb5,0x93,0x49,0xf7, +0x6e,0x76,0xde,0xf7,0x6b,0x56,0x31,0x62,0xc1,0xde,0xa3,0x88,0x74,0x6c,0xbd,0x41, +0xf1,0xe4,0xea,0x4e,0x18,0x84,0x34,0x17,0x65,0xa6,0xd0,0xb6,0xa9,0x6e,0xea,0x72, +0xa6,0x0f,0xbf,0x9a,0x2c,0x0b,0x6a,0x8f,0x4f,0x64,0xba,0xc3,0x0f,0xef,0x41,0x1b, +0x8d,0x1b,0xb9,0xff,0x20,0x0b,0x35,0x17,0xe5,0x86,0xb3,0xef,0x9c,0x31,0x29,0x5b, +0xe5,0xb0,0x93,0xec,0xa1,0x24,0xeb,0xc9,0x32,0x66,0x18,0x71,0x7c,0x62,0x72,0x2d, +0x76,0x01,0x22,0x36,0x84,0xc2,0xfd,0x14,0xed,0x47,0x29,0x5f,0x6a,0xae,0x7f,0xde, +0x32,0xa3,0xab,0x38,0xc9,0xa5,0xb2,0x08,0xec,0x30,0x82,0x62,0xdf,0xd3,0x9e,0x70, +0xb2,0x7b,0xba,0x49,0x3b,0x58,0x96,0x52,0xc8,0xd7,0xea,0xfe,0x7f,0x6c,0x63,0x57, +0x93,0x3a,0x3c,0x64,0xbd,0x5a,0x6d,0x19,0xa7,0xc2,0xa1,0x0f,0xb7,0xbe,0x70,0x62, +0x7d,0xd1,0xc6,0xc6,0xdd,0x21,0x2d,0x33,0xc5,0x7f,0x30,0xe6,0x70,0xf4,0xc9,0x1a, +0x80,0xc7,0x80,0xaa,0xc9,0xc0,0xfc,0xc6,0xf7,0x5a,0x5b,0xc5,0x05,0x27,0x89,0x6b, +0x20,0xdf,0xc7,0x87,0xb7,0xf2,0xa2,0x58,0x18,0xd1,0x61,0x60,0x1d,0x43,0x65,0xd7, +0x4c,0xd0,0x6d,0xeb,0x44,0xdd,0x88,0x82,0x99,0x91,0xb5,0xaf,0x2c,0x0e,0x62,0xeb, +0x8e,0x05,0xe0,0x3a,0x36,0xa1,0xcf,0x32,0x6e,0xad,0xed,0xf3,0x85,0x91,0x2e,0xe3, +0x1f,0xd7,0x40,0x73,0xe2,0xd6,0xeb,0x01,0xe3,0x58,0x3c,0x9f,0x1f,0xb7,0x5f,0x30, +0x9e,0x1d,0xf2,0xcf,0x36,0x16,0x6d,0xfb,0x85,0x14,0xcd,0x1c,0x1f,0xa7,0x74,0x90, +0x86,0x96,0x46,0x1d,0x0c,0xf5,0x2f,0xb4,0x0c,0xb3,0xe4,0x54,0x94,0x57,0x28,0x2b, +0x0f,0x0b,0x98,0xb7,0xfe,0xb2,0x2f,0x3b,0x0f,0x27,0x99,0xf4,0x89,0x64,0x55,0x92, +0x88,0x26,0xe6,0x96,0xc0,0x3f,0x29,0x3e,0x5c,0x7b,0x9e,0xae,0x85,0x48,0xb7,0x63, +0x24,0xd7,0x99,0xb7,0x7e,0xba,0x4f,0x5b,0x9b,0x7b,0x00,0x96,0x08,0x6b,0x39,0xf9, +0x52,0x06,0xe7,0xe1,0x7f,0xbb,0x07,0x2b,0x4e,0x7b,0x8c,0x87,0xfb,0x02,0x3c,0x36, +0x46,0xad,0xfb,0x6f,0x5d,0x67,0x4d,0x08,0x32,0x6c,0x61,0x6a,0x4f,0xd0,0x36,0x4e, +0x4c,0x14,0xa8,0xbc,0x7d,0xb2,0x69,0xe1,0x1b,0x50,0x6f,0x14,0x82,0xb2,0xa7,0xa3, +0xe4,0x93,0xf1,0xf6,0xb8,0xa7,0x9c,0x2c,0xca,0x2a,0x08,0x1f,0x5a,0x5f,0x79,0xf2, +0x1c,0xd2,0xe9,0x7f,0x3f,0x89,0x01,0xc6,0x06,0xd5,0x6f,0xff,0xff,0xff,0xbf,0xf1, +0xa3,0x40,0xfe,0x02,0xf1,0xa3,0xf7,0x5e,0x21,0x44,0xd6,0x46,0x73,0xb1,0xa8,0x63, +0xa2,0x82,0x18,0xe7,0x95,0xac,0x88,0xc3,0xc5,0xcc,0x58,0x58,0xef,0x0d,0x33,0x31, +0x19,0xad,0x29,0xf6,0x1c,0x2f,0x68,0xd1,0x40,0x54,0xa6,0x19,0x2c,0x93,0xbf,0xe2, +0x0d,0x0e,0xdb,0x53,0x7a,0x47,0x4b,0x72,0x2a,0x27,0x26,0xa6,0xb3,0xbe,0x3b,0x87, +0xfb,0xf2,0x3f,0xb4,0x64,0x85,0xb1,0x20,0x1e,0xcf,0x94,0x06,0x71,0x86,0x6e,0xf0, +0x3d,0x70,0xf0,0xac,0x13,0xd4,0x1e,0x80,0xbc,0x4a,0x18,0x18,0xed,0x09,0x7a,0xdf, +0x83,0xb6,0x90,0xc1,0xab,0x16,0xe4,0x5c,0xc4,0x5f,0xe6,0x49,0x2e,0x57,0x1d,0x6a, +0xe1,0x92,0x36,0x2f,0xe5,0xf8,0x99,0x19,0xc9,0x4a,0x66,0xe6,0xab,0xba,0x92,0xf8, +0x7f,0xa9,0x12,0xff,0x9c,0xa5,0x82,0xdb,0xcc,0xc5,0xf4,0x89,0x5b,0x88,0x58,0x2f, +0xe2,0x6d,0x1a,0xed,0xba,0xe9,0x8a,0xc8,0x1c,0xe8,0xbc,0x00,0x73,0xdc,0x16,0xfa, +0x0c,0x87,0xd1,0x13,0x73,0x4e,0x41,0x6a,0x23,0x2e,0x30,0x88,0x04,0xe9,0x9b,0x22, +0xbd,0xfe,0xb9,0x2d,0xb2,0x84,0x8e,0xca,0x4d,0xc6,0x08,0x02,0xfb,0x29,0x96,0x77, +0x76,0x08,0x98,0x26,0x72,0x3f,0x10,0x8a,0x16,0x48,0xb4,0x54,0x59,0x8c,0xff,0xfc, +0xf3,0xce,0x57,0xf1,0xc2,0xd0,0x62,0xbf,0x89,0x6d,0xfc,0x50,0x67,0xcd,0xc6,0x5a, +0xf6,0x7d,0x03,0x25,0x10,0x6c,0x7f,0xed,0xfb,0x6c,0x70,0x55,0x06,0xdf,0x78,0xe8, +0x77,0x0c,0xe4,0x07,0x6e,0xb3,0x53,0x68,0x37,0x7e,0x4a,0x0e,0xef,0x03,0xa0,0xa4, +0x83,0xbd,0x96,0xf3,0x14,0x9f,0x84,0x53,0xe4,0xdd,0xaa,0x01,0x93,0x79,0xac,0xe2, +0x4b,0xe0,0x3a,0xb0,0xed,0x80,0x24,0x94,0x8a,0x35,0xfe,0x94,0x98,0x12,0x55,0xb0, +0x94,0xbd,0x25,0xf6,0x13,0xb1,0x47,0x8b,0x0b,0x36,0x8c,0x62,0x19,0xf1,0x73,0x96, +0x85,0x98,0x4d,0xe9,0xe7,0x35,0x43,0x53,0xe5,0xfe,0xff,0xb4,0xf2,0xc9,0xd5,0x44, +0x13,0xfd,0x10,0x3e,0x34,0x8e,0x4d,0xe0,0x95,0x31,0x14,0x8d,0x7f,0xdb,0xd9,0xf7, +0x82,0xba,0x93,0x2b,0x4c,0x40,0xf0,0x75,0xb6,0x37,0x68,0x87,0x0b,0x7a,0x85,0xa9, +0xee,0xb9,0x8e,0xe1,0x8d,0xc6,0x6d,0x09,0xae,0x8a,0x71,0x96,0x82,0x79,0x5e,0xea, +0x97,0xe2,0x16,0xe2,0xb5,0xed,0x34,0x1a,0x1c,0xdc,0xdb,0xdc,0xda,0xfd,0xe3,0xb5, +0xc3,0x5c,0x30,0xec,0x99,0x97,0x85,0x2c,0x28,0xe4,0xa8,0x18,0xba,0x79,0xaa,0xbc, +0x4a,0xdb,0xde,0x6c,0xc6,0x96,0x61,0xc7,0x01,0x54,0xd6,0x79,0x90,0x7a,0x3d,0x39, +0x2d,0xb5,0x10,0xaa,0x19,0x95,0x2f,0x53,0x44,0x57,0xa9,0x1c,0x3a,0x5a,0x19,0xa1, +0x42,0x5f,0x5b,0x6e,0xdb,0x94,0x8f,0x49,0x95,0xaa,0x5f,0xd5,0x4c,0x39,0x53,0x4c, +0x4f,0xf3,0xba,0xbe,0xd1,0x0d,0xc1,0xd9,0x58,0x1e,0x46,0x83,0x59,0x1d,0x28,0x18, +0x28,0x2e,0x86,0x1c,0x50,0xb6,0x5e,0xc5,0x94,0xc0,0x6a,0x9e,0x48,0x9d,0x7d,0x36, +0x57,0x72,0xf9,0xe4,0x37,0x98,0x4e,0x8b,0x4b,0xc5,0x17,0x85,0xfa,0xa1,0x15,0xf6, +0xd7,0x5d,0x2a,0xec,0x83,0x7d,0x8c,0x07,0x88,0x03,0x74,0xba,0xf5,0xa3,0x35,0x86, +0x7d,0x99,0x00,0x74,0x76,0xcc,0x62,0x64,0xaf,0xa4,0x29,0x89,0xd9,0x1d,0x9d,0xe2, +0x9b,0x20,0x9a,0x26,0x88,0x0e,0x40,0x00,0x3d,0x3e,0xee,0xf6,0x19,0x35,0x96,0x2f, +0x82,0x7b,0x31,0xf6,0x37,0x62,0xa1,0x19,0x67,0x6d,0xd7,0x93,0x21,0x44,0x3c,0xe0, +0x01,0x0e,0x09,0x65,0xf7,0xcf,0x07,0xd1,0xb7,0x1c,0xef,0x28,0xb3,0x47,0xa0,0x3b, +0x02,0x0f,0x20,0x47,0x9f,0xf8,0xb0,0x07,0xc2,0x86,0x92,0x7b,0x57,0x78,0x71,0xc3, +0x64,0xa5,0x45,0x6c,0x2d,0x10,0xf8,0x63,0xbb,0xf4,0x6e,0x86,0xeb,0x44,0xba,0x72, +0xfe,0xc4,0x5a,0x09,0x0b,0x5b,0x68,0xe2,0x67,0x41,0xcf,0x4a,0x35,0xef,0x11,0x77, +0x66,0x28,0x38,0x69,0xad,0x52,0xb9,0x1a,0xd2,0x67,0xec,0xf3,0xe6,0x45,0x70,0x4c, +0xe7,0xec,0x32,0xf1,0x2f,0xac,0xa2,0xd9,0xc0,0x55,0x21,0x8a,0x14,0x39,0x3c,0x36, +0xe6,0xcd,0x10,0x43,0xfa,0xe8,0xaa,0x45,0x26,0xc6,0x3d,0x7e,0xe1,0x44,0x1b,0xf4, +0xef,0xb0,0x19,0x53,0x7b,0xba,0x4b,0x0c,0x35,0xc5,0x8d,0x13,0x51,0x6c,0x11,0xab, +0x00,0x24,0xf5,0xfd,0x99,0x2e,0xbb,0x09,0xad,0x26,0xe9,0xcd,0xfe,0x8b,0x77,0xce, +0x3f,0xae,0x33,0xca,0x16,0x80,0x67,0x19,0x76,0xa0,0xcc,0x43,0xfd,0x6d,0x62,0xab, +0xf3,0xbc,0x3b,0xa0,0x3b,0xa0,0x76,0xdb,0x6b,0x39,0xc2,0x6e,0xfc,0x40,0x5b,0x8c, +0x4c,0xae,0x5c,0x62,0x61,0x73,0x11,0x76,0xcd,0x8e,0x28,0xeb,0xef,0x4c,0xab,0x27, +0xd9,0x7b,0xfd,0x3d,0x64,0x22,0xad,0x60,0xfd,0x8d,0xee,0xfb,0xee,0xf6,0x1e,0x32, +0xa9,0x3f,0xf2,0x75,0x52,0x3d,0x4a,0xa4,0x85,0x53,0xad,0xb3,0x83,0x95,0x72,0x70, +0x21,0x14,0xba,0xaa,0x33,0xa8,0x02,0x1f,0x0e,0xde,0x82,0x13,0x03,0x2e,0x81,0xe1, +0x80,0x6f,0xdb,0xbb,0xd7,0x88,0x9d,0x50,0x68,0x93,0x8d,0x96,0x96,0x0d,0x3f,0x88, +0x81,0x9c,0x7c,0xf5,0x94,0xfb,0xbd,0x81,0x85,0x67,0xe3,0x55,0xf1,0x5e,0x7d,0x53, +0x87,0x3d,0xfd,0x02,0x97,0xbd,0x62,0x4a,0x60,0xcd,0x30,0x2c,0xcd,0x5b,0x75,0xa7, +0x21,0x8c,0xff,0x25,0x4f,0x1a,0xdf,0x5b,0xbb,0x86,0x3c,0x9e,0xef,0xf8,0x70,0x23, +0x9a,0xd4,0x7b,0x37,0x49,0x19,0x50,0x67,0xdb,0xa5,0xa5,0x17,0x63,0x47,0xeb,0x29, +0x0b,0x9a,0x78,0xa5,0x5c,0xe6,0x43,0x46,0xe1,0xce,0x86,0x07,0x8b,0x46,0x19,0x7b, +0x8f,0xd8,0xfc,0xf4,0x54,0x69,0xa6,0xd9,0x4e,0x59,0x21,0x9c,0x1c,0x4c,0x3c,0x9e, +0xd2,0x14,0xf6,0x36,0x5e,0x62,0x13,0xc5,0xe0,0x98,0x0a,0xdc,0x15,0x3a,0x15,0xbb, +0x41,0xdb,0x67,0xe6,0xb6,0xb7,0xb7,0x54,0xea,0x23,0x77,0xc7,0xb0,0x65,0xfb,0x65, +0x5c,0xf5,0xb9,0xa3,0xbb,0xa2,0x29,0xd9,0x8d,0x2b,0xc0,0xcc,0x97,0x68,0x19,0x22, +0x77,0xd1,0xbc,0x07,0x56,0xed,0x2a,0x6e,0x5f,0x3c,0x88,0xe8,0x9f,0x7f,0xd6,0x6b, +0x13,0xc2,0xf6,0xff,0x5c,0x20,0xf8,0xa4,0xe2,0xbf,0xe7,0x55,0x79,0xe4,0x71,0xf3, +0x11,0x8c,0x27,0xa7,0x88,0xb3,0x8c,0xcc,0x4f,0xc5,0x5f,0xed,0x9e,0xbc,0x83,0xa0, +0x31,0x02,0xf9,0xf3,0xb9,0x86,0xd4,0x7e,0x7c,0xe0,0x79,0x01,0x53,0xf2,0x59,0x15, +0xd5,0x6c,0xb6,0x20,0x16,0x39,0x6d,0xdf,0x23,0x5d,0xed,0xdb,0x33,0x3c,0x75,0xe3, +0x23,0x8a,0xf1,0x33,0xb0,0x8e,0x7c,0x52,0xba,0x03,0x27,0xb0,0x60,0x98,0xc5,0x5f, +0x8e,0x1c,0xb8,0x81,0xa1,0xc2,0x07,0x80,0xc6,0x5b,0x04,0xa1,0xe1,0x56,0x30,0x28, +0x87,0x1a,0x29,0x1f,0x1d,0x4f,0xd2,0x56,0x3c,0xec,0x59,0x5d,0x9d,0xbc,0xfb,0xb2, +0x23,0xc6,0x94,0xb4,0x64,0x85,0xe4,0x0f,0x44,0x5d,0x4e,0x77,0x1a,0x55,0x51,0xfc, +0xe2,0x0a,0xf0,0xab,0x70,0x38,0xa1,0x57,0xe2,0x3a,0x5f,0x34,0xba,0x24,0x1b,0x88, +0xf6,0x44,0x91,0xc1,0xab,0x16,0xce,0xe5,0xf3,0xa6,0xef,0x4c,0x5f,0xe0,0x13,0x0d, +0xf7,0x45,0xdf,0xf5,0x95,0x3e,0xe6,0x40,0x62,0xc6,0xb9,0x76,0x86,0x6a,0x66,0x6a, +0xfb,0x83,0xe0,0x8e,0xf1,0x4c,0x6a,0x1a,0xb3,0xe5,0x26,0x4e,0x6b,0x88,0x30,0xa8, +0x8c,0xa6,0xb5,0x8e,0x9b,0xb4,0x8a,0x27,0x2b,0xfd,0x5e,0xf6,0xe2,0x96,0xd0,0x30, +0x63,0x4e,0xe1,0x0d,0x99,0xe9,0xc3,0xad,0xf9,0xef,0x38,0x6a,0xd6,0xb6,0xaf,0x7b, +0x32,0x96,0xe9,0x1d,0x98,0xfa,0x4d,0xbd,0xf8,0x4b,0xc1,0x57,0xe5,0x29,0x5b,0xd3, +0xeb,0x03,0xa6,0x2e,0xe1,0x6e,0x4d,0x9b,0xce,0xc1,0xd8,0x6e,0xf9,0x2e,0x70,0xbe, +0x57,0x09,0xb2,0x6e,0xe0,0xb8,0xe3,0x9a,0xe7,0x30,0x51,0x1e,0x7a,0xfd,0x19,0x39, +0xfe,0x11,0x08,0x2a,0x67,0x81,0x01,0x2a,0x21,0x2a,0x18,0xd8,0x58,0x4a,0x3d,0x7d, +0x12,0xf2,0xb3,0x2e,0xb1,0x6d,0x23,0x89,0x83,0xfe,0xe5,0x15,0x54,0xe9,0xff,0xeb, +0x26,0x09,0x44,0xec,0x81,0x72,0x2f,0xff,0x66,0x8a,0x34,0xd6,0x12,0x3c,0x9c,0xd7, +0x05,0xe5,0xd6,0x6b,0x92,0x54,0x4e,0x34,0x50,0x06,0x01,0xc7,0x2c,0x7a,0xda,0xc1, +0xa4,0x7c,0x98,0xc0,0x5b,0x56,0xa9,0xbe,0x86,0xff,0xeb,0xa2,0xf4,0xf2,0x5d,0x8a, +0x8b,0x51,0xf5,0xb1,0xd2,0x46,0xdd,0xd9,0xad,0x8c,0xd5,0x95,0xa7,0xcb,0x5c,0xed, +0x24,0x0d,0xcc,0xc1,0x4d,0x34,0x6e,0x50,0xeb,0x16,0x8e,0x58,0x0e,0x36,0x55,0xb8, +0x25,0x0c,0x17,0xd6,0x4c,0xdd,0x24,0xe4,0x83,0xd4,0x4c,0x04,0x2c,0x84,0x03,0xbb, +0x01,0x54,0x55,0x38,0xba,0x77,0x4c,0x42,0x1f,0xfd,0xc8,0xec,0x07,0x79,0xcb,0x3f, +0x0f,0x1a,0x92,0xb2,0xb5,0x4d,0x70,0x02,0x67,0xda,0xa3,0xf3,0x12,0xf4,0x1f,0x88, +0xdf,0x7d,0x11,0x08,0x09,0x9a,0xa2,0xca,0x5b,0xb8,0xac,0x53,0x85,0x14,0xa2,0x1d, +0xfc,0x7b,0x4e,0xf4,0x73,0xb2,0xda,0x72,0xd2,0xc6,0x5e,0xd4,0x24,0x74,0x3f,0x61, +0xe4,0xc6,0x3a,0x6f,0xd8,0xe1,0xbc,0xee,0xe6,0x86,0xf1,0x6d,0xfb,0xd2,0x66,0x72, +0x56,0x90,0x8b,0x7f,0xbf,0x22,0x21,0x08,0xef,0x62,0x87,0x05,0x9a,0x0e,0xbb,0x8f, +0xf4,0x41,0xf7,0xb3,0x1b,0xbe,0x04,0xaf,0x6c,0x45,0x7e,0x1f,0xf6,0x71,0xf7,0x86, +0xf6,0x60,0xd2,0x3a,0x9e,0x53,0xfe,0x8a,0x09,0x71,0xa0,0xfa,0x9a,0xfe,0xa4,0x09, +0xb2,0xc2,0x9e,0x56,0x1f,0x9f,0xfe,0xd9,0x93,0xf1,0x2c,0x1d,0xdb,0x8f,0xe0,0x82, +0x5a,0xa3,0xad,0x4d,0xba,0xaf,0x9f,0x91,0x41,0xd4,0x77,0x0e,0x77,0x72,0x32,0x06, +0xfb,0x0d,0x60,0x6e,0x79,0xe2,0xcb,0x05,0xe5,0xdb,0xa9,0xa5,0xa9,0xef,0xe8,0x7a, +0x7a,0x89,0x90,0xe5,0x91,0xb5,0x93,0xb7,0xd6,0xfe,0x80,0x06,0x13,0xa3,0xf5,0xfd, +0x6d,0x81,0xb8,0x12,0x27,0xc7,0xb7,0x7d,0x49,0xa0,0x8e,0x16,0x75,0x43,0xab,0x78, +0x83,0x9a,0x0d,0xd0,0x57,0xaf,0x42,0x40,0xaf,0x81,0xa0,0xeb,0x26,0x86,0x4d,0xb2, +0xf9,0x7b,0xf9,0x71,0x32,0x09,0xb0,0x0a,0xcf,0x1b,0xea,0xa6,0x1e,0xa6,0x13,0xa1, +0x69,0x18,0x88,0x11,0x26,0xa8,0xc3,0x94,0x63,0x71,0x78,0xae,0x25,0x6e,0x9a,0x78, +0x85,0x0b,0x2d,0xf5,0x9e,0x14,0x2b,0xb2,0xba,0xd9,0x3e,0xe8,0x56,0x3b,0xc5,0xc0, +0x84,0x8d,0xf1,0xc2,0xb7,0x26,0xea,0x0c,0xac,0xc8,0x50,0x4a,0xd1,0xfe,0x7b,0xca, +0x4e,0x25,0x9c,0x09,0xde,0xa8,0x2b,0x2b,0xbb,0xad,0x8a,0xd5,0xf0,0xe5,0x22,0x07, +0xfc,0x08,0xbc,0xb3,0x1b,0xb0,0x96,0xbf,0x98,0xab,0x07,0x0f,0xfc,0x48,0x73,0x8f, +0xbd,0x91,0xeb,0x87,0xff,0xdf,0x0b,0xc3,0x80,0x16,0x48,0x08,0x7d,0x15,0xab,0xe4, +0x6c,0xe8,0xed,0xef,0x62,0xa4,0x52,0xd0,0x36,0x37,0x83,0x0f,0x82,0x44,0xb2,0xba, +0xb2,0x1d,0xa0,0x89,0xe3,0x2a,0xf0,0x58,0x2e,0x35,0xd7,0x0c,0xa9,0xae,0x77,0xba, +0x67,0xf8,0xa2,0x56,0xe6,0x2b,0xd6,0xfe,0x7e,0x91,0xa0,0x14,0x23,0xaf,0xa3,0x23, +0xc4,0x83,0xf2,0x31,0x5c,0xae,0x0d,0x6d,0x2f,0x4d,0xea,0xb4,0x2b,0xe1,0xbd,0x4a, +0xe1,0x04,0xfa,0x25,0x5d,0xaf,0x69,0x26,0x24,0x8b,0xe2,0xfc,0x7e,0x30,0x8d,0xb3, +0x0e,0xd2,0x3a,0x02,0x0d,0xd8,0x67,0x26,0x55,0x30,0x23,0x22,0x45,0x52,0xec,0x4e, +0x88,0x65,0x01,0xed,0xa8,0x0d,0xba,0xec,0xe8,0xb3,0xa5,0x4c,0x86,0x94,0x3c,0x88, +0x05,0x2d,0x65,0xef,0x1e,0xf3,0xce,0x84,0x45,0xc9,0x8d,0x59,0x09,0xb0,0xfd,0xe0, +0x87,0xd1,0x12,0xcc,0xde,0xbc,0x96,0x36,0x76,0xec,0x85,0x4c,0xc6,0xab,0x67,0xc0, +0xb7,0x68,0x84,0x87,0xba,0xb9,0xc4,0xdf,0xd5,0x99,0x58,0x78,0x36,0x0b,0x14,0xd6, +0xde,0xd7,0xd6,0x3e,0xed,0xfa,0x05,0x8c,0xc0,0x94,0x78,0x08,0x08,0xd5,0x5a,0x9c, +0x82,0x3d,0xef,0xc6,0x15,0xf7,0x8e,0x13,0xad,0x27,0x65,0x98,0xa3,0xfd,0x74,0xc3, +0x10,0xf2,0x7d,0xa5,0x5c,0x86,0xda,0x53,0xe1,0xce,0xc2,0xaf,0xd4,0x97,0x3b,0x32, +0x2a,0x81,0x26,0xf5,0x3a,0xa1,0x49,0xf5,0x9d,0x24,0x0e,0x40,0x6c,0xb5,0x77,0x8f, +0xf8,0xf5,0xf7,0x8b,0xe8,0xd5,0x40,0x58,0x8d,0x66,0x85,0x30,0x7c,0x79,0xa1,0x75, +0x00,0x97,0xa5,0x71,0x10,0xb7,0xf7,0x77,0x41,0x27,0x4a,0x68,0x05,0x8c,0xeb,0xc5, +0xa3,0x85,0x6b,0xc1,0xb3,0xa5,0x01,0x0f,0xeb,0xc2,0x57,0x23,0x7d,0xa9,0x5e,0x25, +0xd3,0x3d,0xbc,0x32,0x56,0x8d,0x19,0x88,0x91,0x57,0x8d,0x17,0x76,0xbe,0xce,0xa8, +0x4d,0xb1,0x02,0x4c,0x37,0xb5,0x67,0xf1,0xce,0x62,0x7a,0x03,0x80,0xbc,0x5f,0xfb, +0xf3,0x31,0x27,0xa7,0xf4,0xb3,0xde,0xda,0xcc,0x9c,0xf3,0x28,0x0b,0xf7,0x11,0xdc, +0x1a,0x90,0xe9,0xe0,0x87,0xfd,0xbf,0x27,0x42,0x2b,0x6f,0xff,0xda,0x49,0x5e,0x28, +0xec,0xab,0xe0,0x1a,0xdd,0xfd,0xa8,0xbb,0x23,0x44,0xcb,0x24,0x2f,0x69,0x68,0x12, +0x6a,0x0c,0x24,0x86,0xd1,0xfc,0x02,0x32,0x8b,0x4e,0x73,0x2a,0x61,0x95,0x14,0x61, +0x05,0x93,0xf9,0x22,0x6d,0x2d,0x6f,0xc3,0xd2,0x0f,0x4a,0x12,0xd6,0x79,0xf6,0x43, +0x8f,0x89,0xeb,0x49,0x90,0x83,0x51,0x90,0x3c,0x21,0x8c,0x0b,0x88,0x96,0x58,0x44, +0x0b,0x4a,0xf8,0x94,0xe9,0x2b,0x45,0x93,0x7a,0xc9,0xd8,0x43,0xb3,0x6b,0x6e,0x7c, +0x0a,0xa1,0x82,0xaf,0xb0,0x23,0x66,0x5d,0x2b,0x48,0xb8,0x34,0xf5,0x68,0x9a,0xd2, +0xfd,0x0f,0xa1,0x04,0x35,0x2b,0x37,0x49,0x29,0x57,0xb1,0x25,0x7c,0x69,0xdc,0x15, +0xbc,0x0e,0xc5,0xa3,0x32,0xad,0xa6,0x02,0xf7,0x24,0x93,0x68,0x92,0x66,0x84,0xa8, +0xa9,0x48,0xb8,0x8e,0xcc,0x2b,0xd6,0xf8,0x36,0xb7,0x19,0xa8,0x33,0x61,0xb2,0xf8, +0x0d,0x1b,0x8a,0xe1,0x2e,0xf2,0xfd,0xb0,0xec,0xc0,0xc0,0x39,0xfe,0x6d,0x07,0x4f, +0xbb,0x54,0xfb,0xf4,0xc8,0xb1,0xbf,0xc1,0x1b,0x07,0xdb,0x38,0xeb,0xfa,0xb3,0xf9, +0x99,0x49,0xab,0x99,0xd2,0x69,0x3b,0xaa,0x6a,0x41,0xcd,0xfa,0x5b,0xbf,0x9b,0x6b, +0x71,0x05,0xbd,0xae,0x98,0x04,0xa9,0x98,0x6b,0xbd,0xaa,0xee,0x5b,0x6b,0xbb,0xdc, +0x60,0x60,0xb2,0xde,0x12,0x90,0x89,0x8b,0xc7,0xe0,0xa2,0xfe,0x5a,0x8f,0x18,0xc6, +0x8c,0xfd,0x38,0x2f,0xd9,0x91,0x2d,0x6f,0xa9,0xab,0xe8,0x8f,0x76,0xd3,0x15,0x71, +0x8b,0xa0,0xf3,0x8d,0x6c,0x20,0x4a,0x9b,0x67,0xe2,0x64,0x9f,0x59,0x27,0x7a,0x86, +0xc9,0x01,0xe4,0x9a,0x3d,0x3d,0x4e,0x92,0x44,0xdd,0xf4,0xba,0x79,0xfb,0xbc,0xe7, +0x2f,0x4e,0x98,0x4f,0x46,0xd4,0x7c,0xae,0x68,0xda,0x24,0x4a,0x61,0x3c,0xd6,0x72, +0x2c,0x1f,0x9f,0x84,0x93,0x72,0x75,0xba,0x10,0x5d,0x8f,0x47,0xc3,0x2a,0xb9,0xf3, +0xaf,0x6c,0x52,0xf5,0xb7,0x98,0xcd,0x53,0x00,0x48,0x62,0x31,0x9a,0x7a,0xa3,0x30, +0xa2,0x0b,0xfe,0x26,0xb0,0x1c,0x2c,0x62,0xb6,0xcf,0xb4,0x44,0xce,0x79,0xc8,0x96, +0x3f,0x54,0xb4,0x56,0x36,0x6c,0x3e,0xe0,0x62,0x95,0x54,0x31,0xd2,0xfd,0x5b,0x00, +0x30,0x1e,0x65,0xa7,0xf1,0x89,0x6d,0xf1,0x41,0x3a,0x9f,0x5a,0x51,0x70,0x96,0x42, +0xdc,0x1e,0x97,0xd4,0x10,0x31,0xf5,0xfc,0x64,0xd5,0x5d,0x17,0x52,0xff,0x39,0xb9, +0x89,0xe7,0x34,0x08,0x5f,0xa1,0x15,0x4e,0x5f,0xbd,0xde,0xa1,0x99,0x7e,0x45,0xa5, +0xc2,0x5d,0xd5,0xab,0x42,0x30,0x1a,0x41,0xde,0xc2,0xc7,0xa4,0x1a,0x59,0x3c,0x2c, +0x5f,0x91,0x5c,0x1e,0xc7,0x33,0xca,0xc9,0x83,0xc9,0x34,0x0d,0x5b,0x3b,0x55,0x86, +0xdf,0xb4,0xa9,0x50,0xb0,0x9f,0xa8,0x44,0xe1,0x19,0x67,0x99,0x31,0x01,0x9f,0xff, +0x15,0x15,0xce,0x49,0x9b,0xb4,0xba,0xcc,0xe8,0x88,0xd2,0x0e,0xf8,0x34,0xdb,0x75, +0x50,0x14,0xcc,0x3e,0xb9,0x35,0x3e,0xe6,0x18,0x50,0xbe,0xb8,0x0a,0x72,0x61,0xe5, +0x9c,0xba,0x47,0x2f,0x1b,0xb6,0x7a,0x8b,0xc9,0x4c,0xca,0x1d,0xf2,0x71,0x14,0x56, +0xad,0xf4,0x0f,0xbf,0xfa,0x1f,0x4d,0x0d,0x00,0x1b,0xbf,0xbc,0x35,0xff,0xa9,0xf1, +0x02,0x9b,0x03,0x2e,0xc8,0x91,0xf3,0xca,0x90,0x0d,0x3a,0x44,0x9e,0xd1,0x16,0x74, +0xf2,0x91,0xb6,0x3e,0x36,0x21,0xbc,0x26,0xc5,0xa3,0xde,0x1e,0x54,0x70,0xde,0x02, +0x7a,0x99,0xc1,0x30,0xf5,0xaf,0x9d,0xb1,0xc8,0xc8,0xd1,0x39,0x9d,0xef,0x91,0xe8, +0x54,0x5e,0x1d,0x75,0xfc,0x92,0xd1,0x1b,0x42,0x12,0x55,0xb5,0x01,0x68,0x75,0xbf, +0x27,0x5f,0xd8,0x16,0x12,0xab,0x65,0x80,0xc4,0x10,0xd4,0x04,0x17,0xc4,0x31,0xc1, +0xee,0xb4,0xb6,0x5d,0x95,0x8d,0x78,0xd7,0x69,0xa6,0xc0,0x26,0xd7,0xea,0x55,0xc7, +0xe4,0x38,0x81,0x06,0x3d,0xe4,0x2a,0x01,0xad,0xb7,0x89,0xe5,0xd3,0xe2,0x91,0x6c, +0x80,0x52,0x97,0xd3,0xfc,0x93,0x33,0x99,0x2c,0x96,0x99,0x33,0x90,0x6c,0x09,0x71, +0x56,0x83,0xba,0x0a,0x34,0x16,0x08,0xc2,0x98,0x07,0x8a,0xbd,0x5b,0xee,0x12,0xe5, +0xfc,0xea,0xd2,0xf6,0x0f,0xe4,0x58,0x3b,0x4e,0xa9,0xf6,0x7e,0x07,0xf2,0x27,0x93, +0x75,0x2b,0x99,0x8d,0x48,0xc2,0x9f,0xc3,0x57,0x87,0x10,0xca,0x7d,0x4c,0xd0,0x68, +0xb5,0x7a,0x54,0x9b,0xb2,0x46,0xfb,0xca,0x6b,0x89,0xb8,0xcf,0xd9,0xa4,0x2e,0xce, +0x35,0xae,0x82,0x0f,0xe5,0xee,0x48,0x5b,0x72,0x33,0x76,0x8c,0xdc,0xa4,0x0a,0x44, +0x0e,0x80,0x4a,0x3c,0x5e,0xed,0x81,0xfe,0x20,0x9b,0xe2,0x8e,0x20,0xe2,0xc0,0x8a, +0x52,0xc4,0xbd,0x44,0x1c,0x86,0x4d,0x47,0xac,0xc8,0x3a,0x8d,0x5c,0xa6,0x94,0x9c, +0x66,0xc5,0x93,0xdd,0x9e,0xcc,0x41,0xf9,0x1b,0xf3,0x4f,0x8f,0x20,0xe0,0x80,0xec, +0xb8,0x9f,0xef,0xc2,0x0b,0xb9,0x30,0xea,0xe6,0x35,0x25,0xb5,0x27,0x81,0x27,0x72, +0xe0,0xfd,0x5d,0x12,0x5e,0xdc,0x64,0xa2,0xc9,0xdc,0xce,0xb3,0x29,0x6a,0xe5,0x87, +0xf3,0x2f,0x7c,0xa4,0xb2,0x41,0xad,0xc1,0x85,0x4e,0xd5,0xb9,0x6d,0xff,0x74,0x5d, +0x00,0x15,0xf3,0xbf,0xb5,0x1c,0x27,0x46,0xc4,0xc3,0xdb,0x4e,0xd4,0x86,0x68,0x3e, +0xca,0x6f,0x9c,0xe1,0x97,0x3c,0x4e,0x52,0xb2,0x7b,0x8c,0x64,0x73,0x85,0xfd,0x2b, +0x2f,0xd7,0xe4,0x34,0xb5,0xbd,0xf6,0x90,0xe5,0x01,0x78,0x74,0xa3,0x1e,0x7d,0xec, +0x9a,0xc3,0xf5,0x25,0x17,0x3e,0xd1,0x81,0x19,0x94,0xb7,0x05,0xd2,0x2d,0xa5,0xfc, +0xd0,0x72,0x2d,0xb5,0xf6,0xf7,0x50,0x03,0xef,0xd8,0xc5,0x0c,0x0a,0x99,0x20,0x02, +0x89,0x1e,0xb3,0x73,0x1d,0x63,0x0c,0x28,0xb8,0x34,0x23,0x80,0x48,0x03,0x89,0xec, +0xd2,0xfb,0xf7,0x0d,0xd4,0x88,0x5e,0x8d,0x4c,0xd4,0xf2,0x15,0xff,0x2d,0x27,0xcb, +0xbd,0x81,0x93,0x0b,0xde,0x04,0x4f,0x8c,0x4f,0x9b,0xaf,0x53,0x62,0xb8,0x50,0xdc, +0x9e,0xd6,0x57,0xec,0xa6,0x04,0xc4,0x9c,0x4c,0x24,0x92,0xdd,0x9c,0x7b,0xb9,0xaa, +0xd6,0xed,0x9e,0xac,0x7f,0x3c,0x16,0xf4,0xf7,0xd1,0x91,0x2e,0x3e,0x27,0xae,0xc4, +0x1f,0x69,0xb4,0xdf,0x9c,0xbb,0x1e,0xbe,0xa3,0x50,0x5d,0x16,0xde,0x42,0x54,0xe7, +0xa8,0x34,0x9f,0x4d,0xbb,0x3f,0x75,0x09,0x63,0x9f,0xf3,0xed,0xae,0xf8,0x7a,0x9c, +0x4e,0x39,0xe7,0xb8,0x1c,0xb9,0x07,0x79,0xe6,0x02,0x40,0x38,0x25,0xf5,0x80,0xfc, +0x04,0x8b,0x40,0x43,0xf1,0xd6,0x4b,0x03,0x46,0xb3,0x07,0xd7,0xd4,0xcd,0x32,0xa0, +0xd5,0xae,0x48,0xe5,0xcc,0xaa,0x00,0x1f,0x3d,0x14,0x08,0x56,0x12,0xbe,0x5f,0x3d, +0x6b,0x46,0xfe,0x77,0x46,0xbd,0xe0,0xdd,0x2c,0xb9,0xc3,0x99,0x3b,0x06,0xad,0x73, +0xea,0x92,0x42,0x28,0x7a,0x67,0x8a,0x0a,0xb9,0xd6,0xe1,0x57,0x92,0xdc,0x9f,0x20, +0x80,0xd0,0x53,0x36,0xb1,0x8f,0x36,0xb8,0xab,0x17,0x83,0x9e,0x54,0xcf,0x48,0xa9, +0x83,0x9e,0xe0,0xaf,0x60,0x33,0x98,0x81,0x28,0x48,0xa6,0x72,0xba,0x76,0xe0,0x23, +0x3d,0x5d,0x92,0x4d,0x2d,0x7d,0x37,0xac,0xc1,0x0c,0xbc,0x16,0xe8,0x97,0x49,0xd5, +0xe4,0x9e,0x36,0xd1,0x9b,0x3f,0xa2,0x56,0x62,0x38,0x19,0x84,0x55,0xc7,0x02,0xfb, +0x70,0x83,0xd8,0x13,0x1e,0x83,0x01,0xac,0x2f,0xd1,0xea,0x08,0x2e,0xc7,0x30,0xa8, +0xdd,0xa6,0x31,0xac,0x11,0x86,0xca,0x94,0x81,0x2a,0xa5,0xde,0x7d,0x32,0xd9,0x35, +0x63,0x4e,0x63,0x72,0xf8,0x4a,0xd3,0xd8,0x56,0xee,0x37,0x57,0x7b,0x0f,0xaf,0x7b, +0x04,0xad,0x1a,0xe4,0x99,0xb0,0xce,0xc0,0xe8,0xd0,0x2d,0xd0,0xf8,0x97,0x9b,0xdb, +0x35,0x05,0x9d,0x44,0x69,0x2c,0xfb,0x16,0xdf,0x11,0x85,0x1f,0x20,0x67,0xfc,0xa1, +0x2a,0xa9,0x0a,0x15,0x65,0xd0,0x23,0x46,0x2d,0xb8,0xaf,0x58,0x8f,0xfc,0x83,0xb8, +0x54,0x95,0x1c,0x4d,0xed,0x22,0x87,0xfa,0x6b,0x71,0xa4,0x7c,0xa8,0x6a,0xda,0x18, +0x43,0x7e,0x40,0x3d,0x8b,0x29,0x8d,0x07,0xe5,0xe9,0x7c,0x44,0xb0,0x9e,0x3e,0x30, +0xdf,0xed,0x11,0x7b,0x36,0x9a,0xee,0x60,0x64,0x75,0xac,0x5b,0x99,0x0a,0xd8,0x35, +0x62,0x0e,0xf2,0xac,0x52,0x11,0xf0,0x22,0x2d,0x59,0x31,0xcb,0xec,0x2d,0x5b,0x20, +0xa0,0x71,0x32,0xf7,0xd8,0xa3,0xda,0x49,0x80,0x1f,0x41,0x5b,0x0d,0x33,0x73,0x31, +0x40,0xb2,0xdb,0xb8,0x5a,0x42,0x9d,0x92,0xbe,0x48,0x26,0xfb,0xd5,0xde,0x22,0x2d, +0x03,0xa8,0x54,0xda,0x50,0xc0,0xdb,0x79,0xbb,0xa9,0x9a,0xdb,0x93,0xd5,0x67,0xc3, +0x17,0x46,0x1a,0xda,0x01,0x41,0x9c,0x01,0x08,0xc8,0xd8,0x45,0x0f,0xda,0xf8,0x9a, +0x73,0x4b,0x93,0xdf,0xd4,0x82,0x7a,0xbb,0x17,0xca,0x85,0x16,0xd0,0xfd,0x6b,0xfc, +0x9d,0x55,0x98,0xa7,0x58,0xa4,0x25,0xd6,0x1a,0x58,0x4a,0x87,0x9b,0xc6,0x52,0x77, +0xc1,0x1b,0xbc,0xbd,0x4c,0x97,0x04,0xce,0x28,0x17,0xc6,0x9d,0xd9,0x87,0x57,0xe8, +0x5e,0xfc,0x99,0x6f,0x41,0x9b,0x1a,0x5e,0x7b,0x14,0x0e,0xcf,0x03,0xd8,0x55,0x0b, +0x5f,0x58,0x14,0x7d,0xb0,0x99,0x4e,0x67,0x4d,0xdb,0xa9,0x90,0xd6,0xa5,0xd0,0xf9, +0x15,0x78,0x1e,0x9f,0x36,0x7a,0x4d,0xb9,0x4e,0x16,0xa7,0x42,0x10,0xe8,0x98,0x89, +0x5d,0xba,0xb8,0x75,0xb7,0x91,0x50,0x45,0x83,0x2f,0xa8,0xd5,0x19,0x5c,0xfc,0xdc, +0x4c,0x84,0x9d,0x4f,0x0d,0x37,0x7e,0xdf,0x4f,0x11,0x98,0xc0,0xfb,0x33,0x98,0xa9, +0xac,0xb5,0x90,0x5e,0x84,0x93,0x0f,0xde,0xa2,0x0d,0x81,0xd5,0x11,0xef,0xb0,0x5d, +0x84,0xf2,0x9c,0x59,0xd0,0x01,0xe8,0x8b,0x1c,0x59,0x4f,0xba,0xc8,0x41,0x37,0xf1, +0x78,0x0d,0xd8,0x74,0xeb,0xe2,0x04,0x26,0x2b,0xe8,0x0d,0x79,0x81,0xbd,0x97,0x55, +0xcf,0x30,0x0f,0xe7,0x65,0x3b,0xaf,0x3a,0xe0,0x6e,0xec,0x54,0xae,0x7a,0x47,0x3b, +0x6f,0x53,0xec,0xcb,0xff,0xd3,0x68,0x50,0x61,0x6d,0x1a,0x03,0x56,0x36,0x57,0x2a, +0x64,0x25,0xf7,0x2e,0x36,0x08,0x69,0xdb,0x5e,0x8e,0xb9,0xda,0x55,0xb8,0xe8,0xc6, +0x78,0xd3,0xec,0x31,0x75,0x3b,0x48,0x99,0xb5,0x86,0x46,0x97,0x74,0xed,0xb2,0x8a, +0xde,0x78,0x27,0x62,0x95,0xad,0x40,0x0d,0xc6,0xc8,0xfc,0x08,0x35,0xc5,0x38,0xcb, +0x23,0xc4,0x99,0x45,0x61,0xe4,0xf1,0xa8,0x33,0xca,0x31,0x96,0x2c,0x67,0x46,0x09, +0x72,0x1b,0x2d,0x35,0xd4,0x50,0xca,0xdb,0x3b,0xf4,0x87,0x4b,0x3e,0x36,0x31,0xf9, +0x7c,0x2c,0x31,0x0e,0xf5,0xf9,0xc9,0x22,0xe9,0x37,0xb2,0x0a,0x4c,0xa5,0xfe,0x45, +0xf8,0x75,0x78,0x31,0x69,0xfc,0x32,0xd6,0x9f,0xf6,0x02,0x8e,0x55,0xa6,0xee,0xaf, +0x44,0x10,0xbb,0x26,0x7d,0x05,0x09,0xd1,0x37,0xb1,0xa1,0x2f,0x7b,0xf8,0x94,0x2b, +0x72,0x74,0xbc,0x24,0xed,0x3e,0x42,0x7c,0xcb,0xab,0x2b,0x4c,0x8e,0x4a,0xb9,0xd9, +0x71,0x85,0x9a,0x2c,0x5d,0x52,0xb2,0x9b,0xdf,0x91,0xea,0x42,0xbf,0x43,0xaa,0xae, +0x7e,0x56,0xd2,0x8e,0xf0,0xa2,0x03,0xb8,0xee,0x32,0xe9,0x45,0x7d,0x78,0xd6,0x62, +0x3a,0x9f,0x9b,0xcd,0x97,0xca,0xa7,0xf8,0x6f,0xf1,0x21,0x40,0xa6,0xbb,0xdd,0xa6, +0xae,0xd4,0xd3,0x0f,0xdf,0xa0,0x13,0x19,0x38,0x8d,0x6c,0x82,0xd7,0xad,0x95,0x26, +0x5f,0x99,0xff,0x86,0x4f,0xf0,0x4f,0xaa,0xc1,0x6f,0x60,0x58,0x50,0x5b,0x59,0xe0, +0x4d,0xb2,0x92,0x52,0xeb,0x6c,0x77,0x8f,0x8e,0x95,0xbc,0x5e,0xbf,0xbc,0x7e,0xa0, +0xa2,0xb8,0x65,0x83,0x84,0xde,0xf5,0x52,0x39,0x59,0xf9,0xa5,0x9f,0xb8,0xd2,0xe0, +0x87,0x10,0xb7,0x95,0x06,0x1e,0x67,0xac,0xe3,0x78,0x2d,0xa4,0xea,0xa2,0xbf,0xf5, +0x59,0x9d,0xda,0x73,0x4a,0x1b,0x78,0xe5,0xc7,0x5c,0x4c,0x74,0x7e,0xfe,0xac,0x3a, +0xf0,0xd4,0x92,0xd1,0x96,0x2a,0x75,0x80,0xc4,0xd3,0x54,0xdb,0xf2,0xa4,0x52,0xee, +0x56,0xc7,0x45,0xb4,0xd0,0x65,0x74,0x01,0x64,0xde,0x71,0x63,0x9d,0xb1,0xce,0x63, +0x7b,0x34,0x59,0xb5,0x4c,0x1a,0x75,0x54,0x44,0xd1,0x15,0xdf,0x70,0x26,0x47,0x74, +0x2a,0x83,0xea,0xfe,0xbc,0xae,0xd6,0x56,0xb0,0x23,0x90,0x76,0x40,0xfe,0x08,0x3e, +0x24,0x3d,0x96,0x61,0xd4,0xea,0x3a,0x41,0x8c,0x7a,0x64,0x66,0xa9,0xe8,0x3d,0x0f, +0xc7,0xec,0x37,0xfc,0x82,0x1b,0x7c,0xd8,0xce,0x5b,0x14,0x56,0x5d,0xb8,0xfb,0xdf, +0xd6,0x92,0x7b,0x61,0x54,0x18,0xa8,0x41,0xeb,0x71,0x18,0x96,0x8a,0x5d,0x45,0x7e, +0xf6,0x7f,0xb0,0xf3,0xd5,0xf8,0x7e,0xa7,0x0d,0x9c,0xcc,0x06,0xaa,0x33,0x54,0x29, +0x19,0x32,0x4a,0xbc,0xc8,0xd8,0x3c,0x18,0xed,0x95,0xa7,0x01,0x7b,0x76,0xc6,0x63, +0x32,0xad,0xd9,0x7f,0xc8,0x11,0x0f,0x69,0xef,0x86,0x37,0xa3,0x15,0xbc,0xba,0x9c, +0x46,0xec,0xd7,0xe6,0x44,0x62,0xe8,0x19,0x6d,0x97,0xcd,0xff,0xff,0xff,0x3a,0xf3, +0x78,0xaf,0x27,0xfd,0x43,0x3b,0x08,0xd3,0x32,0x02,0x90,0x24,0x50,0x60,0x99,0xec, +0xcb,0xfa,0x30,0xfb,0x6e,0x28,0xc1,0x07,0x7e,0x48,0x98,0x34,0x51,0x61,0x12,0xf2, +0xbc,0xad,0xbf,0x63,0x27,0x32,0x48,0xae,0xe1,0x00,0x91,0x25,0xd0,0x62,0x11,0x2a, +0xd2,0x96,0x52,0x22,0x95,0x09,0x3f,0x85,0xb3,0x01,0x99,0x35,0xd1,0x63,0x40,0x40, +0x02,0x04,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0x49,0x51, +0x83,0x07,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0xcf,0x8c, +0x43,0x4a,0xf7,0x4b,0xed,0xa1,0x4b,0xa7,0x69,0x88,0x92,0x2c,0x58,0x68,0x2d,0x35, +0xd9,0x58,0x8b,0x5b,0xf8,0xdf,0x1e,0xda,0x6d,0xfc,0x9a,0x3c,0x59,0x69,0xa4,0x30, +0x5c,0x9b,0xa3,0x9f,0x18,0x20,0x73,0x37,0xc5,0xc1,0x93,0x2d,0xd8,0x6a,0xb0,0x5b, +0x28,0xf6,0x74,0x6f,0x4f,0xf4,0x4d,0x03,0xab,0xb0,0x9b,0x3d,0xd9,0x6b,0x42,0x48, +0x0a,0x0c,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0x4a,0x58, +0x0b,0x0d,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0x43,0x49, +0x8a,0x0e,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x4b,0x59, +0x8b,0x0f,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x5e,0xae, +0x83,0x75,0x84,0x84,0x30,0x30,0x4a,0xdb,0x53,0x42,0x94,0xa4,0x70,0x70,0xb7,0x72, +0x8d,0xec,0x8c,0x94,0x31,0x31,0x64,0x32,0xb5,0x72,0x9c,0xb4,0x71,0x71,0x5f,0x50, +0x03,0x77,0x85,0x85,0xb0,0x32,0xad,0x23,0x34,0xe9,0x95,0xa5,0xf0,0x72,0x75,0xb6, +0x54,0x1c,0x8d,0x95,0xb1,0x33,0x25,0x33,0x35,0x07,0x9d,0xb5,0xf1,0x73,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0xb2,0xf7, +0x8b,0xc3,0x86,0x8c,0x38,0x38,0x6e,0x2a,0xbc,0x30,0x96,0xac,0x78,0x78,0x8c,0x1c, +0x7e,0x4d,0x8e,0x9c,0x39,0x39,0x24,0x47,0x6f,0xa3,0x9e,0xbc,0x79,0x79,0x27,0x74, +0xc0,0xa1,0x87,0x8d,0xb8,0x3a,0x2f,0x1b,0xe0,0xfa,0x97,0xad,0xf8,0x7a,0xb0,0x6b, +0xe9,0x1d,0x8f,0x9d,0xb9,0x3b,0x1c,0x9d,0x39,0xca,0x9f,0xbd,0xf9,0x7b,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x08,0x60, +0xf0,0xfa,0x30,0x22,0x14,0xa0,0x34,0xa6,0x4c,0xd8,0xb0,0x26,0x54,0xe0,0x01,0x60, +0xbe,0x9e,0xa8,0x16,0x15,0xa1,0x06,0xea,0x25,0xe1,0xb8,0x36,0x55,0xe1,0x96,0xdb, +0x82,0x29,0xa1,0x07,0x94,0xa2,0xea,0x14,0xbb,0xcb,0xb1,0x27,0xd4,0xe2,0x41,0x71, +0x7a,0x8d,0xa9,0x17,0x95,0xa3,0x46,0x41,0xaf,0xb9,0xb9,0x37,0xd5,0xe3,0x60,0x42, +0x06,0x84,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0x68,0x52, +0x07,0x85,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x61,0x43, +0x86,0x86,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x69,0x53, +0x87,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0x1a,0xf4, +0x0a,0xe8,0xa2,0x0e,0x1c,0xa8,0x49,0xae,0x07,0x8a,0xb2,0x2e,0x5c,0xe8,0x39,0x01, +0x31,0x1d,0xaa,0x1e,0x1d,0xa9,0x21,0x3f,0xac,0xcf,0xba,0x3e,0x5d,0xe9,0x39,0x14, +0xf4,0x5e,0xa3,0x0f,0x9c,0xaa,0x8c,0x77,0xe8,0x61,0xb3,0x2f,0xdc,0xea,0xba,0x99, +0x0d,0x2a,0xab,0x1f,0x9d,0xab,0x98,0x7e,0x6e,0x89,0xbb,0x3f,0xdd,0xeb,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x04,0xaf, +0x87,0xd1,0xa4,0x86,0x34,0xb0,0x13,0x9b,0x62,0x7a,0xb4,0xa6,0x74,0xf0,0xec,0x63, +0xdf,0x10,0xac,0x96,0x35,0xb1,0x6c,0xa9,0x19,0x45,0xbc,0xb6,0x75,0xf1,0x86,0x33, +0x78,0x31,0xa5,0x87,0xb4,0xb2,0xf5,0xbc,0xce,0x06,0xb5,0xa7,0xf4,0xf2,0x09,0x6c, +0x44,0x40,0xad,0x97,0xb5,0xb3,0xae,0x8d,0x95,0x26,0xbd,0xb7,0xf5,0xf3,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0xdd,0xf5, +0x1f,0x78,0xa6,0x8e,0x3c,0xb8,0x21,0x2e,0x07,0xc4,0xb6,0xae,0x7c,0xf8,0xea,0x50, +0x96,0x36,0xae,0x9e,0x3d,0xb9,0x6a,0x84,0x4f,0x9b,0xbe,0xbe,0x7d,0xf9,0x8c,0xcc, +0xa2,0x46,0xa7,0x8f,0xbc,0xba,0x0d,0x40,0x5f,0x2f,0xb7,0xaf,0xfc,0xfa,0xfd,0x77, +0x41,0xe0,0xaf,0x9f,0xbd,0xbb,0xbb,0xcb,0xc9,0x40,0xbf,0xbf,0xfd,0xfb,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, +0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, +0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xc0,0x42,0x91,0x25,0xd0,0x62,0x09,0x11, +0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xc1,0x43,0x99,0x35,0xd1,0x63,0x40,0x40, +0x02,0x04,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0x49,0x51, +0x83,0x07,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0x02,0x08, +0x08,0x08,0x82,0x0c,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2c,0x58,0x68,0x0a,0x18, +0x09,0x09,0x8a,0x1c,0x19,0x29,0x1a,0x38,0x49,0x49,0x9a,0x3c,0x59,0x69,0x03,0x09, +0x88,0x0a,0x83,0x0d,0x98,0x2a,0x13,0x29,0xc8,0x4a,0x93,0x2d,0xd8,0x6a,0x0b,0x19, +0x89,0x0b,0x8b,0x1d,0x99,0x2b,0x1b,0x39,0xc9,0x4b,0x9b,0x3d,0xd9,0x6b,0x42,0x48, +0x0a,0x0c,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0x4a,0x58, +0x0b,0x0d,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0x43,0x49, +0x8a,0x0e,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x4b,0x59, +0x8b,0x0f,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xa0,0x60,0x50,0x94,0xa4,0x70,0x70,0x0c,0x90, +0x21,0x11,0x8c,0x94,0x31,0x31,0x1c,0xb0,0x61,0x51,0x9c,0xb4,0x71,0x71,0x05,0x81, +0xa0,0x12,0x85,0x85,0xb0,0x32,0x15,0xa1,0xe0,0x52,0x95,0xa5,0xf0,0x72,0x0d,0x91, +0xa1,0x13,0x8d,0x95,0xb1,0x33,0x1d,0xb1,0xe1,0x53,0x9d,0xb5,0xf1,0x73,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0x06,0x88, +0x28,0x18,0x86,0x8c,0x38,0x38,0x16,0xa8,0x68,0x58,0x96,0xac,0x78,0x78,0x0e,0x98, +0x29,0x19,0x8e,0x9c,0x39,0x39,0x1e,0xb8,0x69,0x59,0x9e,0xbc,0x79,0x79,0x07,0x89, +0xa8,0x1a,0x87,0x8d,0xb8,0x3a,0x17,0xa9,0xe8,0x5a,0x97,0xad,0xf8,0x7a,0x0f,0x99, +0xa9,0x1b,0x8f,0x9d,0xb9,0x3b,0x1f,0xb9,0xe9,0x5b,0x9f,0xbd,0xf9,0x7b,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x20,0x02, +0x04,0x80,0xa0,0x06,0x14,0xa0,0x30,0x22,0x44,0xc0,0xb0,0x26,0x54,0xe0,0x28,0x12, +0x05,0x81,0xa8,0x16,0x15,0xa1,0x38,0x32,0x45,0xc1,0xb8,0x36,0x55,0xe1,0x21,0x03, +0x84,0x82,0xa1,0x07,0x94,0xa2,0x31,0x23,0xc4,0xc2,0xb1,0x27,0xd4,0xe2,0x29,0x13, +0x85,0x83,0xa9,0x17,0x95,0xa3,0x39,0x33,0xc5,0xc3,0xb9,0x37,0xd5,0xe3,0x60,0x42, +0x06,0x84,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0x68,0x52, +0x07,0x85,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x61,0x43, +0x86,0x86,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x69,0x53, +0x87,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0x22,0x0a, +0x0c,0x88,0xa2,0x0e,0x1c,0xa8,0x32,0x2a,0x4c,0xc8,0xb2,0x2e,0x5c,0xe8,0x2a,0x1a, +0x0d,0x89,0xaa,0x1e,0x1d,0xa9,0x3a,0x3a,0x4d,0xc9,0xba,0x3e,0x5d,0xe9,0x23,0x0b, +0x8c,0x8a,0xa3,0x0f,0x9c,0xaa,0x33,0x2b,0xcc,0xca,0xb3,0x2f,0xdc,0xea,0x2b,0x1b, +0x8d,0x8b,0xab,0x1f,0x9d,0xab,0x3b,0x3b,0xcd,0xcb,0xbb,0x3f,0xdd,0xeb,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x24,0x82, +0x24,0x90,0xa4,0x86,0x34,0xb0,0x34,0xa2,0x64,0xd0,0xb4,0xa6,0x74,0xf0,0x2c,0x92, +0x25,0x91,0xac,0x96,0x35,0xb1,0x3c,0xb2,0x65,0xd1,0xbc,0xb6,0x75,0xf1,0x25,0x83, +0xa4,0x92,0xa5,0x87,0xb4,0xb2,0x35,0xa3,0xe4,0xd2,0xb5,0xa7,0xf4,0xf2,0x2d,0x93, +0xa5,0x93,0xad,0x97,0xb5,0xb3,0x3d,0xb3,0xe5,0xd3,0xbd,0xb7,0xf5,0xf3,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0x26,0x8a, +0x2c,0x98,0xa6,0x8e,0x3c,0xb8,0x36,0xaa,0x6c,0xd8,0xb6,0xae,0x7c,0xf8,0x2e,0x9a, +0x2d,0x99,0xae,0x9e,0x3d,0xb9,0x3e,0xba,0x6d,0xd9,0xbe,0xbe,0x7d,0xf9,0x27,0x8b, +0xac,0x9a,0xa7,0x8f,0xbc,0xba,0x37,0xab,0xec,0xda,0xb7,0xaf,0xfc,0xfa,0x2f,0x9b, +0xad,0x9b,0xaf,0x9f,0xbd,0xbb,0x3f,0xbb,0xed,0xdb,0xbf,0xbf,0xfd,0xfb,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0x68,0x13,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0xff,0x80,0x00, +0x55,0x40,0xa9,0x57,0x94,0x3c,0x0f,0x02,0x2b,0xfa,0xca,0x0a,0xf3,0x2e,0x88,0x98, +0x01,0x41,0x67,0x7f,0xc6,0xcc,0x46,0x33,0xbe,0x01,0x60,0xb0,0x58,0x10,0x01,0x80, +0x05,0x42,0x28,0x56,0x1c,0x7e,0x0a,0xd0,0x58,0x42,0x83,0x57,0xe3,0x92,0x09,0x95, +0x22,0x66,0xa9,0xab,0x14,0xa2,0x19,0x7a,0xc5,0x63,0x31,0x0a,0xd7,0xd8,0xe8,0xe2, +0xdd,0x5b,0xfe,0xe0,0x73,0x04,0x80,0x23,0xb9,0xe9,0x10,0xe1,0x5d,0x65,0xe8,0x43, +0x2d,0x61,0x96,0xf0,0x1b,0x88,0x74,0x97,0x45,0xd6,0xaa,0x70,0x4b,0x0b,0xe9,0xf2, +0x4a,0x85,0x99,0x41,0x1b,0x99,0x18,0x41,0x67,0x06,0xe9,0x4d,0x3b,0xf6,0x92,0x53, +0xfc,0x87,0x05,0xd0,0x95,0xa5,0x1f,0x6e,0xe5,0x6b,0x19,0xe5,0x62,0x6f,0x92,0xac, +0x2e,0x48,0xdd,0x44,0x67,0x08,0x91,0x5a,0xc6,0x2d,0xf7,0xae,0x51,0x05,0x0a,0x18, +0x09,0x49,0x86,0x62,0xb8,0xa3,0x12,0x3d,0xae,0x4d,0xfa,0xfc,0x95,0xe2,0xda,0x97, +0xae,0x49,0x43,0x75,0x2d,0x2c,0x6a,0x5b,0x46,0x2f,0xab,0x7d,0xdc,0x65,0xc9,0x49, +0x89,0x0b,0x70,0xff,0x35,0xa0,0x1f,0xdf,0xd9,0xb5,0x99,0xdf,0x5b,0x61,0xaa,0xea, +0xae,0x8b,0x4a,0x3f,0x4e,0x4e,0x2d,0x1b,0x59,0x4d,0x56,0x9d,0x7c,0x4c,0xe2,0xfa, +0xd4,0x82,0x88,0x17,0x78,0x29,0x64,0x75,0x23,0xdd,0x5b,0x6e,0x33,0x5d,0x97,0x6f, +0x64,0x6d,0x07,0x9d,0xe4,0x6c,0xef,0x6d,0x43,0x21,0xed,0x71,0xb1,0x61,0x8b,0x59, +0xdf,0xd1,0xaa,0x9d,0x9f,0x03,0xa4,0x0b,0xe5,0x90,0x24,0x0f,0xf5,0xb0,0x04,0x80, +0x78,0xf8,0xde,0x80,0x93,0x36,0x91,0xa1,0x64,0xd0,0x21,0x62,0x80,0x76,0xde,0xb0, +0x26,0xe9,0xec,0xd0,0x4d,0x3e,0x3c,0x32,0x5e,0xb5,0xe4,0x36,0x78,0xb1,0x4f,0x28, +0x82,0x11,0x8d,0xc9,0xf2,0x3d,0x14,0x21,0xc0,0x5a,0x99,0xb0,0x93,0xb2,0x02,0x1d, +0x24,0xe6,0xed,0xd1,0xc5,0xbe,0x27,0x4d,0xe9,0x35,0xe5,0x37,0xf8,0xd3,0x97,0xd0, +0x3a,0xce,0xe8,0x23,0x4d,0x14,0xd3,0x10,0x52,0xf5,0xab,0x60,0x3e,0x47,0x12,0xa1, +0x27,0x71,0x1c,0x3c,0x1f,0x78,0x9c,0x94,0x07,0xa2,0xf0,0x13,0x9a,0x9f,0xc1,0x6c, +0x8f,0x56,0x05,0x09,0xae,0xc2,0x01,0x0b,0x47,0xa9,0xdd,0xe1,0x7b,0xc9,0x52,0xd5, +0x29,0xee,0x32,0xee,0xa3,0x75,0x59,0xf5,0x63,0xd5,0xcd,0x92,0xf7,0x5b,0xc6,0x71, +0xb2,0x1e,0xfe,0x61,0x18,0x87,0x0e,0x12,0xc4,0xa7,0xcc,0xb1,0xdb,0x7e,0x8e,0x12, +0x08,0xab,0xae,0x18,0x31,0x67,0x1b,0x68,0x37,0x86,0x54,0x34,0xad,0x5a,0xac,0x94, +0x09,0x01,0xdc,0xcf,0x47,0xe1,0x5d,0x14,0xca,0xf7,0x9b,0xbd,0x5b,0x3a,0x56,0x66, +0x48,0xd4,0xd0,0xbd,0xca,0x3b,0x25,0x3e,0x45,0x52,0x38,0x19,0x29,0x18,0x40,0xe4, +0x05,0x9c,0x99,0xa9,0xc7,0x5e,0x68,0x49,0xe7,0xfa,0x2a,0x68,0x36,0x7c,0x90,0xcc, +0xde,0x46,0x71,0x9e,0x9a,0x26,0x49,0xc9,0x41,0x42,0x1e,0x78,0xf1,0x13,0x95,0x3d, +0xa6,0xaf,0x03,0x1d,0xc4,0xc1,0x54,0x29,0xec,0xd5,0x3b,0x72,0xf9,0x9e,0x4d,0xc7, +0x2f,0x9f,0xdd,0xbb,0x40,0xca,0xe7,0x06,0xed,0x16,0x38,0xbd,0xf7,0xd4,0x20,0x02, +0x04,0xc0,0x27,0xe4,0x96,0x88,0x4a,0x20,0x7c,0x4d,0x12,0xc4,0xd6,0xa8,0x28,0x12, +0x05,0xc1,0xd0,0x64,0x97,0x85,0xbe,0x02,0x15,0xdd,0xba,0xd4,0x53,0x5a,0xe7,0x6c, +0x84,0x82,0x1a,0x65,0xd5,0xe2,0xd5,0x04,0x77,0x48,0x60,0x55,0x77,0x87,0x29,0x87, +0x85,0x83,0x38,0xf5,0x17,0xa9,0x95,0x96,0x04,0x49,0x52,0xca,0xeb,0xa1,0x5f,0x8d, +0xbf,0xc8,0x9f,0x35,0x3c,0x2d,0xdc,0x1d,0x84,0xa4,0x30,0xe2,0xa0,0xa6,0xd7,0xaf, +0x17,0xe6,0x97,0xa5,0x31,0x89,0x58,0xb2,0x4b,0x6e,0x99,0xb6,0x5b,0x4e,0x11,0x85, +0x2c,0xc7,0x65,0x27,0x92,0x8a,0xca,0x13,0x46,0x40,0xb3,0x2d,0xb5,0xe2,0x89,0xe5, +0x00,0x80,0x96,0x24,0x84,0xa6,0xa9,0x72,0xc1,0xcc,0x29,0x76,0xe4,0xf6,0x22,0x0a, +0x0c,0xc8,0x44,0x6c,0x7d,0xfd,0xb5,0x7a,0x6c,0xd4,0x25,0xc0,0x37,0xff,0x2a,0x1a, +0x0d,0xc9,0x0e,0x7c,0x5c,0xb9,0xf0,0x38,0x45,0x01,0xb2,0xd8,0x3e,0xc9,0x23,0x9e, +0x8c,0x8a,0xbb,0xca,0x1e,0x82,0x97,0x6b,0x8c,0x45,0xb0,0xe9,0x6c,0xec,0x72,0xc8, +0x8d,0x8b,0xd3,0x9d,0x9c,0xd3,0xc1,0xe4,0x2c,0xcf,0xc3,0x79,0x29,0xa5,0xca,0xe8, +0xd1,0x63,0xd8,0x4a,0x97,0xc3,0xf4,0xd5,0x46,0xac,0x4a,0x95,0xbf,0x13,0x14,0xff, +0xf2,0xcf,0x3a,0x1d,0xe4,0x00,0x04,0xdb,0xa6,0xee,0x7d,0x96,0x6f,0xa0,0xf3,0x39, +0x65,0xcd,0x23,0x1a,0xa7,0x5a,0x2d,0xcf,0xc6,0x43,0x33,0x7a,0xe4,0xe6,0xab,0xf3, +0x83,0xd3,0xa2,0x7f,0x3e,0xef,0xd7,0xe8,0xd3,0xc5,0x04,0x0c,0xcb,0x6d,0x4d,0x79, +0xa6,0xb4,0x7b,0x86,0x43,0xbc,0x30,0xbe,0xb9,0x5a,0x93,0x16,0xf3,0x57,0xa3,0xe0, +0x86,0xf4,0x27,0xf6,0x25,0xb7,0x0d,0xf2,0xd7,0x5c,0x63,0x1b,0x73,0xb1,0x2d,0x7e, +0x25,0x49,0x65,0xee,0x76,0x4f,0x1d,0x92,0x45,0xdb,0x1d,0x01,0x71,0xd5,0xc2,0x69, +0x72,0xcc,0xa1,0xe0,0xd6,0x2c,0xd9,0x94,0x52,0x5e,0xac,0xc5,0x0a,0xb1,0xca,0xc5, +0x6e,0x54,0xe5,0x42,0x4d,0xdd,0xe6,0x5d,0x6e,0x74,0x24,0xe7,0x45,0xe5,0x6a,0x95, +0x9b,0x55,0xd4,0x29,0xc2,0xd9,0x79,0xe3,0x4d,0x78,0x66,0x72,0x79,0x0d,0x47,0xd7, +0xf5,0xc3,0x4e,0xb8,0x63,0xb8,0x2b,0x47,0xee,0xd2,0x4d,0x18,0xf0,0xcc,0xff,0x7d, +0xe3,0x52,0x0a,0x17,0xbb,0x1c,0x29,0xb4,0x25,0x77,0xad,0x95,0xf3,0xdb,0x7f,0x8a, +0x53,0x98,0xde,0x8c,0xcb,0xfa,0xd2,0x8d,0xdf,0x55,0x36,0x86,0x80,0xdb,0x55,0x6b, +0x8d,0x45,0x0a,0xfc,0x7e,0x56,0x9e,0xf0,0xf8,0x75,0x6e,0x3a,0x79,0xe8,0x1d,0x6d, +0xbc,0x64,0xf8,0x04,0x3e,0x92,0xd3,0x8c,0x7d,0x76,0x77,0xab,0xcc,0x0f,0x71,0xe3, +0x74,0x30,0xd7,0x1d,0xbe,0x5d,0x9b,0xf5,0x4e,0xbe,0x60,0xb7,0x7a,0xfc,0x93,0xca, +0x2e,0x5c,0x36,0xcf,0x38,0xfe,0x7e,0xa0,0x68,0x7f,0x89,0x9d,0x2e,0x75,0x52,0xde, +0xa6,0xf2,0xa6,0xdb,0x54,0xfe,0x2a,0xbd,0xad,0xbd,0x81,0x16,0x07,0xb0,0x18,0xb8, +0xbd,0x9f,0x83,0x4b,0xf8,0xbf,0xf8,0xf4,0xc4,0x73,0x77,0x8f,0xfa,0xd2,0xaf,0x47, +0xcc,0x6b,0xeb,0x5b,0xf3,0x4f,0x37,0xff,0x66,0x60,0x00,0x7b,0x90,0xde,0xbf,0x70, +0x08,0x09,0x88,0x00,0x99,0x9f,0xf7,0xe0,0x58,0x02,0x28,0xda,0x56,0x22,0xf4,0x63, +0x4e,0x00,0x98,0x66,0x15,0x0d,0x10,0x34,0xc8,0xfe,0x34,0xab,0xde,0xe7,0x81,0x42, +0x7b,0x2e,0xad,0xe2,0x79,0xc8,0xd1,0xa2,0x4d,0xb4,0xb7,0xa1,0xd6,0x64,0x33,0x15, +0x08,0x6c,0x75,0x91,0xdd,0x31,0x35,0xd6,0x28,0x59,0x98,0xf5,0x9b,0x21,0x81,0xc4, +0x04,0xaf,0x1f,0x45,0x14,0x7e,0x0e,0xc4,0x4a,0xe4,0xf0,0xf0,0x61,0xe1,0xf7,0xa1, +0xa0,0xb5,0x3e,0xc8,0xb2,0xda,0x88,0x16,0xbc,0x3e,0xe7,0xb4,0x4b,0x7e,0x3e,0xc5, +0xf9,0x6f,0x44,0x5a,0xb4,0x20,0x05,0x63,0x1d,0x5d,0x66,0x6d,0xd4,0x86,0x7b,0x96, +0x49,0xd7,0xf7,0x5d,0xb7,0x3c,0xd9,0xf5,0xcd,0x5b,0xef,0x4a,0xcb,0x25,0x38,0xf7, +0x0e,0x52,0x2e,0x93,0x19,0xc8,0x02,0x4a,0x4c,0x64,0x52,0x92,0xf9,0x97,0xca,0x9b, +0x0f,0xcb,0x6d,0x5c,0x15,0x82,0xb6,0xa7,0x48,0xa9,0x5a,0x44,0xa2,0x2b,0x86,0x16, +0xae,0x48,0x43,0x89,0x12,0x44,0xef,0xad,0x84,0x4a,0xc9,0xa2,0xac,0x28,0x1b,0x59, +0xc1,0xf6,0x5b,0x1c,0xaa,0xea,0xdb,0xbd,0x43,0x27,0xc4,0x58,0x24,0x05,0x18,0x4a, +0xb9,0xa5,0xd3,0x2a,0xe5,0x6e,0x8f,0x79,0x4c,0x0e,0x54,0x17,0x5b,0xdc,0x14,0xfc, +0x03,0xa0,0xf0,0xa3,0x1d,0x77,0x12,0x7d,0x20,0x0e,0x83,0x4e,0xb2,0x7d,0x3b,0xc3, +0x8b,0x6e,0x8e,0x39,0x67,0x6f,0x6b,0xed,0x80,0x7e,0xe9,0x85,0x36,0x21,0x48,0x9e, +0x49,0x0f,0x4e,0x42,0xbd,0x29,0x5f,0x0a,0xd7,0x21,0x23,0x75,0x32,0x5f,0xe8,0x1f, +0x21,0x70,0xe4,0x37,0x16,0x3d,0x2d,0xe0,0x64,0x7c,0xeb,0xe7,0xdf,0xdd,0x9c,0xf6, +0xde,0x53,0x2c,0x54,0x2d,0x54,0xd2,0x90,0xcc,0x11,0xb0,0x53,0x1a,0x52,0x5b,0x25, +0xa8,0x09,0x69,0xf5,0x30,0xb4,0x6a,0xe2,0x4f,0xff,0x5b,0x85,0x51,0x32,0x40,0xe5, +0x5c,0x5b,0xb5,0xe5,0x31,0xb5,0x31,0x56,0x9e,0x73,0x99,0x31,0xbb,0x7a,0xfb,0x53, +0x3a,0xc9,0x7f,0x56,0x32,0x75,0x72,0x20,0x72,0x38,0x46,0x17,0xf6,0xf9,0x12,0x74, +0x2b,0xb8,0x73,0x46,0x77,0xe8,0xfc,0x30,0x6f,0xfe,0x85,0xc7,0x75,0x95,0x27,0xc1, +0xa3,0x76,0x05,0x7c,0xf9,0x58,0xea,0x91,0x62,0xd0,0x87,0x53,0x19,0x12,0xc8,0x16, +0x61,0x57,0xaf,0xd5,0x97,0x9a,0x8d,0xf0,0xab,0x74,0xe1,0xb5,0xb7,0xfa,0xd6,0x60, +0x0c,0x55,0x26,0x4c,0x34,0xc3,0xd6,0x64,0x74,0xac,0xde,0x35,0x1b,0x3b,0xce,0x8d, +0x68,0x13,0x7d,0xfe,0xc6,0x94,0x56,0xad,0x6f,0x1b,0x6a,0xfb,0x18,0x7d,0x45,0x72, +0x49,0xe5,0x83,0xa9,0xbe,0x78,0xc7,0x2d,0xae,0x6a,0x81,0x0c,0xfe,0x38,0x8c,0x71, +0x8d,0x56,0x8a,0xda,0x67,0x31,0x7b,0x7e,0x37,0x53,0xfd,0xbe,0xf8,0x6b,0x0e,0xc0, +0xc3,0x8c,0x08,0x1c,0xbe,0x37,0x76,0x36,0x59,0x1f,0x8f,0xdb,0xdd,0x83,0x62,0x23, +0xa2,0x72,0x38,0x3d,0x9a,0xb4,0x18,0x4e,0xe6,0xf0,0x73,0x14,0x97,0x30,0x25,0xcd, +0xa9,0x5e,0x47,0x32,0x9e,0x38,0xef,0x10,0xa2,0x1c,0x47,0xfc,0x9e,0x7a,0x71,0x11, +0x8b,0xb2,0xcb,0xbd,0xb7,0xc4,0xdc,0x66,0x0a,0x89,0xdd,0x1b,0x84,0x5f,0x46,0x0a, +0x07,0xe0,0x18,0xf9,0x12,0x9a,0xd7,0xe2,0x48,0x6b,0xd2,0x2e,0x55,0x80,0xba,0x74, +0xfa,0xc3,0x84,0xed,0xfc,0x4b,0x80,0xcd,0x43,0xfb,0x78,0xc7,0xae,0xa3,0x7f,0xa7, +0x8c,0x99,0x3b,0x78,0x91,0xe1,0xe1,0x22,0xf7,0xd3,0xef,0x83,0xdc,0xa0,0x64,0x67, +0x08,0x08,0xb9,0x64,0x91,0x8f,0xa3,0xb7,0xcb,0x3b,0xe6,0x52,0x28,0x48,0x28,0x46, +0x8f,0x3b,0x16,0xda,0xb7,0x5b,0x12,0x62,0x47,0xfe,0x08,0x14,0xbd,0x25,0x78,0x24, +0x03,0xa9,0xf9,0x30,0xe8,0xe7,0x68,0x05,0x43,0xc1,0x79,0xb6,0x23,0x6e,0x4d,0xa4, +0x6f,0x9c,0xdf,0x4f,0xb2,0xbd,0x51,0x3a,0x2f,0xdc,0xcf,0x53,0x5b,0x40,0x95,0xd7, +0x81,0x50,0xa4,0x23,0x6a,0xe6,0xf3,0x82,0xed,0xe7,0x3c,0x46,0xb3,0x48,0x26,0x95, +0x09,0xcb,0x5e,0x7d,0x00,0x21,0x62,0x48,0x48,0xe4,0xca,0x22,0x5a,0x4a,0x3a,0x7c, +0x09,0xa5,0x2f,0x6e,0x11,0xa0,0xba,0x5a,0x49,0xe5,0x9a,0xd4,0x3e,0xed,0x0f,0xf0, +0x65,0x60,0x23,0x6f,0x84,0x07,0x4c,0x58,0x9c,0x43,0xa6,0x5c,0x7f,0x63,0xd7,0x9f, +0xc1,0x99,0x2f,0xee,0xbb,0x8b,0x44,0x7c,0xcb,0x49,0xda,0xff,0xd9,0xc7,0x5a,0xb5, +0xe7,0x5c,0xbb,0x67,0xbb,0x53,0xb2,0xfb,0x6f,0xc6,0x52,0x1c,0x3c,0x2b,0x15,0x25, +0x77,0x72,0x7a,0xda,0x65,0x07,0x2e,0xfe,0x49,0xaa,0x3a,0x6b,0xf6,0xe7,0x3d,0xa9, +0x82,0x0a,0x23,0x86,0xfb,0x53,0x34,0x9b,0xe8,0x6f,0x8d,0x68,0xed,0x6b,0x51,0xfe, +0x78,0xe1,0x47,0x20,0x5d,0x8f,0x97,0x0b,0x4f,0x49,0x3b,0x8f,0x41,0x4e,0x26,0x7d, +0xcd,0xc0,0x24,0x84,0x3c,0xdc,0xb0,0x53,0x42,0xf0,0x58,0xd9,0x15,0xf4,0x26,0xd2, +0x29,0x3a,0xa8,0x12,0x79,0x50,0xf8,0x77,0x47,0xdc,0xe2,0x12,0x7d,0x51,0x67,0x78, +0xa2,0x72,0xad,0x82,0xdf,0xf1,0xf5,0xb6,0xb8,0x90,0xd7,0xa0,0xf5,0x92,0xfd,0x92, +0x4c,0x03,0xb7,0x96,0x94,0x13,0xbd,0xf0,0x1e,0x7e,0xe9,0xb5,0x22,0x5e,0xe4,0x81, +0x89,0x3f,0xe4,0xe2,0xd7,0xb2,0x7c,0xe7,0x0d,0x97,0x64,0x84,0x89,0xb9,0x74,0x12, +0x75,0x1e,0x9a,0x35,0x96,0xbc,0x1e,0xf2,0x66,0xf7,0x43,0xb1,0xb5,0x35,0x31,0xc2, +0xa0,0x34,0x13,0x26,0x15,0xb0,0x71,0x90,0xfa,0xb8,0x8a,0x63,0x8d,0x9f,0xbd,0xe2, +0x8d,0xd5,0x6b,0xa5,0x84,0x52,0x5d,0xe2,0x0e,0x3d,0x6d,0x91,0x0c,0xb5,0x3c,0x8b, +0x0d,0xf8,0x66,0x9b,0x1e,0xb3,0x35,0xda,0x68,0xd1,0x33,0xde,0x78,0xf3,0x39,0x1e, +0x2b,0x1d,0x90,0x93,0x5c,0xd9,0xae,0xdc,0x92,0xc2,0xe6,0x9f,0x7b,0x19,0x79,0x2f, +0xa4,0x81,0x23,0x7e,0x9a,0x9a,0xb7,0xe8,0x17,0xc1,0x25,0x2b,0xb0,0x1b,0xd0,0xe8, +0xbd,0xf5,0xf7,0xb6,0x8e,0xea,0xad,0xdd,0x60,0x2d,0xef,0xcf,0xf5,0xf0,0xa6,0x6d, +0xa1,0x15,0x1e,0x2c,0xc1,0xfd,0x66,0x9c,0x26,0x77,0xa9,0x8b,0x83,0x90,0xef,0xa5, +0x4e,0x99,0x6e,0xdc,0x7c,0xa6,0xbe,0x22,0xb3,0x29,0xfd,0xef,0xfa,0x6d,0x47,0x59, +0x26,0x96,0x27,0x9f,0xc2,0xb6,0xa7,0xea,0x6e,0x7e,0x95,0xe7,0xda,0xfd,0x0d,0xcc, +0xac,0xff,0x59,0xb9,0x9c,0xff,0xaf,0xc4,0xc9,0x9e,0x3f,0x56,0xa8,0xbe,0xa8,0x31, +0xe1,0x1b,0x07,0x66,0xd1,0xaa,0x28,0xd3,0x5f,0x46,0x77,0xe4,0x14,0x7b,0x76,0x49, +0x84,0x60,0xba,0xfd,0xdf,0x4e,0x9f,0xc1,0xe2,0x11,0x60,0x14,0x5f,0xd1,0x34,0xe7, +0x05,0x43,0x06,0xf4,0x33,0x23,0x31,0x0a,0x61,0xc8,0x54,0x43,0xe3,0xb2,0x77,0x49, +0xb2,0xe6,0xb7,0xf7,0x8b,0x4c,0x2b,0xb3,0x23,0xd1,0xbf,0x44,0xf0,0xce,0xd7,0xa8, +0x90,0x49,0x81,0x22,0x21,0x44,0xd2,0x86,0xa9,0xde,0xee,0x59,0x98,0x4d,0xdb,0xa8, +0x03,0x47,0xfa,0xab,0xe7,0x2a,0x4a,0x61,0x70,0x57,0x3f,0xb4,0x57,0x2b,0xbe,0xbd, +0x82,0xb3,0x39,0xb4,0x31,0xd5,0x31,0x63,0x60,0x4b,0xd9,0x70,0x3b,0x97,0xc5,0x23, +0xb0,0x11,0x09,0xb9,0x50,0x65,0xa1,0xf3,0x43,0x7c,0xcf,0xf7,0x53,0xbf,0xfa,0x4e, +0x56,0x44,0xb8,0xe4,0xac,0x67,0x6a,0x6e,0x1e,0x4e,0x8c,0x6b,0x92,0xa1,0x72,0xe9, +0x55,0xf6,0xd1,0x1e,0x62,0x87,0x7a,0x3a,0xa1,0x44,0x82,0x2f,0x3c,0x6a,0x13,0x8b, +0x62,0x25,0x58,0x13,0xe7,0x64,0x33,0x1f,0x69,0x95,0xdb,0x28,0x10,0xa3,0x6b,0x1b, +0xce,0x06,0x56,0x3d,0x9f,0x10,0x64,0x47,0x22,0xa1,0xa5,0x4c,0x54,0xcd,0xba,0xa0, +0xd6,0x41,0xc8,0x10,0x98,0x24,0x6a,0xed,0x44,0x2e,0xea,0x2b,0x54,0x6d,0xdd,0xdc, +0x06,0x80,0x7b,0xde,0x39,0x4d,0x59,0x9a,0xea,0x46,0x3a,0x7c,0xdb,0xed,0xbc,0xb5, +0x8a,0xbb,0x36,0x3f,0x39,0x62,0x19,0xf4,0x48,0xc9,0xeb,0x79,0x7e,0x3e,0x12,0x46, +0x2c,0x4d,0xb3,0xb5,0xc7,0x62,0xdf,0x89,0x97,0x40,0x6b,0xf9,0x5d,0x6f,0xd9,0x10, +0x5b,0xef,0xfa,0xf4,0x91,0xbc,0x5e,0xbd,0x8b,0x53,0x82,0xd4,0x9b,0xfa,0x7a,0x6d, +0xc2,0x6a,0x74,0x16,0xb1,0x78,0x18,0x32,0xe1,0xa9,0xbc,0x9e,0xd0,0xfd,0xc5,0x78, +0x8b,0xc9,0xcf,0x98,0x83,0x40,0x4d,0xa4,0x8b,0x51,0x55,0xe8,0x61,0x74,0x0b,0xe3, +0x5a,0x51,0xb5,0x30,0x37,0x51,0x25,0xe3,0xa2,0xa3,0xd7,0xa8,0xc2,0x65,0x7a,0x10, +0x49,0x1b,0x9a,0xa6,0x3c,0x56,0x34,0xe2,0xd1,0x59,0xb4,0xe6,0x47,0x79,0xa9,0xa3, +0x80,0x5a,0xce,0xf2,0x35,0x73,0xa7,0x12,0xe1,0x51,0xe4,0x0f,0x86,0x6e,0x47,0xf3, +0x5d,0x0d,0x8f,0x78,0x90,0x3b,0x1f,0xfc,0x60,0x31,0x2e,0x67,0x72,0x4f,0x4c,0xae, +0x04,0xba,0x4b,0x57,0x33,0x8c,0x20,0x93,0x22,0xdd,0xde,0x13,0x0a,0x67,0x59,0x69, +0x5f,0xc4,0x32,0xee,0x9c,0x95,0x14,0x40,0xd8,0x17,0x6e,0xce,0x3b,0x88,0x34,0x63, +0x2f,0xa2,0x54,0x9d,0x0a,0x4b,0x06,0xac,0x94,0x37,0xff,0xda,0x5a,0x19,0xd8,0x9f, +0x97,0xba,0x67,0x91,0x8b,0xce,0xaf,0x56,0x89,0x7a,0xce,0xb2,0x5f,0x61,0x53,0xeb, +0x9a,0x29,0x37,0x62,0x98,0x5b,0x79,0x19,0xe8,0x9b,0xc5,0xac,0x5e,0x60,0x8a,0x39, +0x89,0x9c,0xfe,0x69,0xbc,0x6c,0xd1,0x6a,0xc4,0xc3,0x2e,0x6e,0xfa,0xf6,0x36,0x3e, +0x3b,0xe0,0xee,0x30,0x9a,0x92,0x66,0x28,0x37,0x5b,0xfe,0x39,0xda,0xd6,0x75,0x36, +0xba,0xb3,0x97,0xc1,0xdc,0x38,0x2f,0x6b,0x6a,0x61,0xef,0x1e,0xed,0x78,0xb7,0x5b, +0x2b,0x27,0xd3,0xfa,0x1a,0x24,0xab,0x06,0x48,0xd2,0xd6,0xfd,0x10,0x47,0x0a,0xd2, +0x58,0x00,0x34,0xfa,0xc1,0x5b,0x0f,0xd1,0x57,0xc6,0x2a,0x66,0x58,0x44,0x12,0x90, +0xef,0x16,0x5e,0xfb,0x43,0xe3,0xe7,0xd4,0xac,0xdb,0xae,0x56,0x17,0x4e,0x41,0xb0, +0x22,0x8d,0xea,0xff,0x14,0x19,0x11,0x14,0x65,0xd9,0xaf,0x87,0x3d,0xe1,0x51,0x55, +0xdd,0x98,0xf4,0x32,0x17,0xa7,0x37,0xe6,0xe6,0x53,0xe9,0x24,0xf4,0xec,0xfb,0xa0, +0xef,0xee,0xfa,0x42,0x37,0x3f,0x10,0x60,0xfa,0xc9,0x2f,0x16,0x21,0xe4,0x4e,0xb0, +0x4c,0x2a,0x92,0xa9,0x95,0xa1,0x8c,0x89,0xe4,0xc3,0x7f,0x10,0x36,0xa5,0x47,0x93, +0x25,0x03,0x81,0x45,0xea,0xab,0x5b,0xb3,0x9a,0xc0,0x31,0x8a,0xa4,0xfd,0xa3,0x02, +0xcc,0x8c,0x7a,0x35,0xea,0xac,0x59,0x5c,0x66,0x4d,0xa1,0x73,0x7f,0x87,0xc3,0xfc, +0x1c,0x47,0x3a,0x6c,0x5f,0x5a,0x8a,0xca,0x54,0x63,0x90,0xc6,0xcc,0x27,0x4a,0xa9, +0xca,0x86,0xe0,0x83,0xf6,0x60,0x45,0xca,0x41,0x86,0xc4,0xfb,0x6e,0x8b,0x5d,0x47, +0x67,0xf2,0xdd,0x7e,0x30,0xa7,0xfd,0xb6,0xa7,0xd0,0x8d,0x5e,0xb4,0x23,0xf0,0xa8, +0xf2,0xf5,0x1f,0x7d,0xde,0x5b,0x5b,0x39,0x90,0xc6,0x43,0xd7,0xc3,0xa6,0xe2,0x4b, +0x29,0xe2,0xe5,0x2c,0x10,0xea,0xf5,0xe8,0xac,0xcc,0x92,0x6c,0x6f,0xe1,0x54,0x8b, +0xcd,0x0d,0xd2,0x19,0x11,0xcf,0x42,0x28,0x0c,0x3d,0xc2,0x85,0xaa,0x42,0x5d,0x9f, +0x4c,0x13,0x23,0xef,0x98,0x6e,0x0b,0xe9,0x4e,0xd1,0x08,0xed,0x5e,0x07,0x63,0x5f, +0x87,0xc4,0x0b,0x4e,0x1d,0xab,0x1b,0xcc,0xd1,0xc0,0xe8,0x04,0x34,0x5e,0xdc,0x6a, +0x78,0xdd,0xfd,0x99,0x70,0xb1,0x0a,0x02,0x24,0xcb,0x13,0xc0,0x57,0x90,0x20,0x67, +0xa0,0xd3,0xba,0xe7,0xde,0x18,0x8d,0xd0,0x44,0x51,0x9c,0xef,0xd4,0x93,0x3f,0x87, +0x87,0xd2,0x26,0x8e,0x5d,0x7b,0x04,0x45,0x66,0xd6,0xef,0xaf,0x53,0xf4,0x85,0x82, +0x44,0x88,0x97,0x64,0xd0,0xb5,0x05,0x5b,0x2f,0x9c,0x79,0x32,0xb6,0x01,0x5c,0x3c, +0xa4,0x90,0x47,0x30,0xb4,0xb0,0x14,0x51,0xc1,0xdb,0xad,0x61,0x97,0xbb,0x66,0x7f, +0xa5,0x91,0x58,0xb4,0xdc,0x44,0x36,0xef,0xe5,0x52,0x9c,0xf4,0xe5,0xf8,0x6c,0x2b, +0x91,0xd4,0x35,0xa5,0x5d,0x67,0x15,0xe0,0xf2,0xdb,0xf4,0x94,0xe1,0xb9,0xe0,0xb1, +0x50,0x91,0xbd,0xd6,0xe1,0xb6,0x79,0x11,0x46,0x7c,0x02,0x1f,0xf2,0x7a,0x26,0x6c, +0xcd,0x9e,0x86,0xf2,0x9d,0x67,0x6f,0x3c,0x8d,0x97,0xe6,0xcc,0x6c,0x5c,0xb5,0x17, +0x2b,0x22,0xd0,0xfe,0x0e,0x69,0x5e,0xb8,0xbb,0xd4,0x29,0xbc,0x39,0x5d,0x03,0xd7, +0x0f,0xd8,0x63,0x0a,0xff,0x48,0x36,0x5b,0xed,0x95,0x7b,0x93,0x34,0x70,0x3e,0x19, +0x2d,0x03,0x91,0xef,0x1a,0xd7,0x15,0x6b,0xb1,0xd2,0xf5,0x83,0x35,0x91,0x46,0x86, +0x1d,0x27,0x61,0x43,0xd7,0x6d,0x0e,0xe6,0x8e,0xd3,0x0e,0xe6,0x83,0xb3,0xd9,0x5e, +0x00,0x83,0xac,0xa8,0xc0,0x10,0x54,0x2a,0x33,0xdb,0xfd,0x8d,0x0f,0xb2,0xa7,0x9b, +0x90,0xd2,0x0b,0x5c,0x97,0xb6,0x17,0xe8,0xfa,0xd3,0xa7,0xfa,0xc3,0xe5,0x55,0x28, +0x8a,0x84,0x7c,0x40,0xbc,0x0f,0x09,0x55,0x4c,0xc4,0xfe,0x8c,0x87,0xb0,0x60,0x02, +0x79,0x0d,0xd9,0x95,0xb7,0x62,0xd0,0x3d,0x74,0xbd,0x4b,0x46,0x91,0xea,0x92,0xf2, +0x83,0x05,0xed,0x90,0x0e,0xdc,0xdc,0x6e,0x4f,0x5f,0x20,0x73,0x93,0xc1,0x4b,0x1c, +0x02,0xd6,0x1b,0x9d,0x96,0x08,0x48,0x25,0x15,0x2e,0x16,0xcd,0xd6,0x2d,0x39,0x73, +0xc2,0xf3,0x49,0xe5,0x3e,0x38,0x64,0xc2,0xd6,0xbc,0xd1,0x30,0xb2,0xc3,0x5e,0xc4, +0x28,0xda,0x7d,0x74,0x16,0xa3,0xb1,0x62,0xf2,0x40,0xd8,0x71,0xc0,0x6e,0xeb,0x2c, +0xa2,0x69,0x5c,0x71,0x5a,0x61,0xf1,0x72,0x6d,0x71,0x48,0x33,0xc1,0xda,0x81,0x85, +0xab,0x00,0xc3,0x45,0x91,0xd3,0xb8,0x63,0x67,0x42,0x53,0xb6,0x71,0x29,0x2f,0x30, +0xb0,0x95,0x5d,0xd7,0xc7,0x5e,0xf9,0x7f,0x4f,0xda,0x5e,0xa6,0x70,0x3a,0x7c,0xa8, +0x87,0x8e,0x01,0x6a,0xe3,0x6d,0x4b,0xaf,0xa9,0x07,0x6a,0xae,0xd8,0xb3,0x5a,0x0c, +0x8b,0x0d,0xaa,0xe3,0xf0,0x40,0x13,0x03,0x50,0x52,0xa2,0x0d,0xf8,0x72,0x81,0x49, +0x84,0xa1,0x47,0x7f,0xb6,0xa2,0x12,0x56,0x6f,0xdf,0xab,0xfd,0x84,0xcb,0xff,0x7b, +0xa8,0x09,0xa1,0xb8,0xb7,0xa1,0x93,0x5f,0x3e,0x5b,0x8b,0xdb,0x5b,0x6f,0xba,0x3a, +0xf5,0x4e,0x1e,0xe3,0x12,0xec,0xab,0x1a,0xc4,0x29,0x42,0x2a,0x91,0xf1,0xa2,0x67, +0x2f,0xe0,0xf2,0x78,0x18,0x6d,0x71,0x2b,0xc7,0xd1,0xb4,0x0e,0xd6,0xdb,0x1c,0x7a, +0x0f,0x6e,0xe6,0x4b,0x0e,0x4a,0x7a,0x3a,0x4e,0x52,0x83,0x1a,0xc2,0x29,0x4e,0xaf, +0x9b,0xf1,0x75,0x79,0x25,0xf0,0x23,0x5e,0x5a,0xe3,0xa4,0x0f,0x09,0xf0,0x6d,0x6b, +0x1b,0x96,0x44,0x7c,0xad,0x72,0xac,0x40,0x78,0x4b,0x69,0x20,0x7d,0xa9,0x6c,0x92, +0x85,0x1c,0x08,0x64,0x39,0x3e,0x1d,0x40,0x4e,0x1e,0xa4,0x4a,0x77,0x73,0xf9,0xff, +0xba,0x7d,0xde,0x6a,0x32,0x31,0x16,0x51,0xee,0x1d,0xfd,0xc7,0x0f,0x7c,0x15,0xf9, +0xa7,0x9b,0x9d,0x99,0xb5,0x1f,0x0d,0x80,0xf5,0x55,0xb2,0xaa,0xd8,0x75,0x41,0x26, +0x32,0xea,0xc4,0xed,0xcf,0x80,0xf5,0xe7,0x93,0x0b,0xee,0x7b,0x8d,0xf9,0xec,0xca, +0xaf,0x78,0xb4,0xf0,0xd2,0xa9,0xfc,0xba,0xb2,0xf9,0xa4,0x1e,0xdf,0x78,0xbc,0xc3, +0x81,0x02,0xbd,0xd7,0x4d,0x83,0x6d,0xc6,0x73,0xfa,0x36,0x1b,0xd6,0xda,0x48,0x33, +0x0f,0xe9,0xb4,0x24,0x10,0x27,0xf9,0xab,0x40,0x32,0xcc,0x17,0x3a,0x78,0x48,0x8a, +0x60,0x74,0xc2,0xac,0x38,0x78,0x36,0xd9,0xc9,0xf7,0xb6,0x41,0x7e,0x10,0x67,0x73, +0x12,0x71,0x36,0xec,0x3d,0x32,0x89,0x3c,0x64,0xb0,0xb6,0xde,0x84,0x75,0xd3,0xd7, +0x86,0xc6,0xab,0x0c,0x8b,0xca,0x84,0x8e,0x49,0xf5,0x8d,0x29,0xb9,0x68,0xf3,0xe7, +0xb3,0x74,0x0f,0xde,0xb3,0x3d,0xa8,0x85,0xef,0xd3,0xa7,0x39,0xf4,0xe7,0xbf,0xca, +0x4b,0x28,0x79,0xf1,0xc5,0xe1,0x7f,0xbb,0xee,0x40,0xaf,0x9f,0xfe,0xde,0xfa,0x2e, +0x3b,0xe3,0xb5,0xa2,0xe1,0xa0,0xb1,0x96,0xbc,0x40,0x7a,0x9e,0x49,0x72,0xe7,0xc7, +0x26,0x13,0x13,0x33,0x4b,0x5d,0x7c,0xba,0x66,0xc2,0x77,0x0d,0xfe,0xdc,0xb6,0xdb, +0xb8,0x2b,0xae,0x9d,0xf3,0xa0,0x7f,0x36,0x73,0x1b,0x4f,0x52,0xf3,0x7d,0xe0,0x52, +0x4f,0x84,0x88,0x5b,0x55,0xa3,0x88,0xdd,0x42,0x30,0x90,0x44,0xd6,0x34,0xfc,0x4c, +0x96,0xbe,0xf7,0x9f,0x26,0xd3,0x00,0xc9,0x36,0xc1,0xda,0x3a,0x56,0x81,0x27,0x44, +0xaa,0x5e,0x5c,0x38,0xb5,0xe0,0xa0,0xa1,0x44,0xa8,0x67,0xc5,0x75,0x8e,0x57,0x5a, +0x51,0x9b,0x11,0x37,0xc1,0xb3,0xf9,0x2e,0xb7,0xd8,0xe3,0xc8,0x76,0xe5,0x99,0x40, +0x43,0x69,0x60,0x21,0x32,0x90,0xd0,0x28,0x97,0x68,0x4b,0xc6,0xbb,0x46,0x91,0x50, +0x71,0x91,0x0c,0x72,0xea,0x11,0x93,0x05,0xc7,0x75,0x1f,0x89,0xb6,0x33,0x64,0xa5, +0x96,0x78,0x41,0x49,0x1a,0x2b,0xd5,0x39,0x19,0xfb,0x01,0xb4,0x37,0x8a,0xc9,0x49, +0x0b,0x6a,0x91,0x65,0x27,0xa8,0x5c,0x75,0x53,0xa3,0x02,0xf3,0x8b,0x74,0x42,0x08, +0xaa,0x85,0xdc,0x5f,0xa0,0x21,0xba,0x54,0xeb,0xd8,0x92,0xc2,0x5a,0x80,0x64,0x18, +0x45,0xe5,0xd4,0x4f,0xa1,0x20,0x88,0xf6,0x7e,0x79,0x92,0x5c,0xa0,0xe5,0x3b,0x8f, +0x8a,0x02,0x99,0xf4,0x1c,0x6a,0x8c,0xcd,0xff,0x2c,0xa9,0xab,0x9d,0xf8,0xff,0x45, +0xa3,0x57,0x9c,0x7f,0x61,0xa2,0x83,0xdb,0xc9,0xd9,0x83,0xbb,0xd0,0x77,0x67,0xa8, +0xa2,0x72,0x4d,0x54,0xbd,0x29,0x48,0xed,0xe2,0x03,0x5e,0x1c,0x84,0x53,0x6f,0xac, +0x1f,0x73,0xd8,0x62,0xe8,0xec,0x83,0x51,0xec,0x70,0x7e,0xfa,0x03,0x7e,0x9a,0x49, +0xa8,0xe3,0xf2,0x11,0x46,0xa1,0x72,0xb4,0x75,0x53,0xc9,0xf5,0x2d,0xea,0x92,0x59, +0xbc,0xe2,0x98,0x5f,0x83,0x78,0x86,0x5f,0x57,0x8b,0xab,0xac,0x93,0x83,0x04,0x52, +0xa6,0x94,0x84,0x7e,0x95,0x3c,0xf5,0xe0,0xc5,0x2d,0x49,0x22,0x79,0x29,0xab,0x10, +0xf1,0x58,0xf5,0x02,0x92,0xbc,0x17,0x5d,0x63,0xb9,0x84,0x48,0x73,0xf3,0x3a,0xe1, +0x65,0x18,0x61,0x02,0xf7,0xd2,0x1d,0xc1,0xe2,0xba,0xdd,0xc5,0x0b,0xfc,0x55,0x11, +0x25,0xb4,0xe7,0x2a,0x86,0x92,0xa6,0x71,0x44,0x2c,0x92,0x5f,0x21,0x0e,0xc4,0xcc, +0xaa,0x99,0x5f,0x5d,0xc1,0x44,0xd5,0xe5,0x87,0xb2,0xca,0xe0,0x4e,0x5b,0x95,0xd0, +0x76,0x91,0x47,0x2d,0x13,0x08,0x01,0xf0,0xb6,0xc1,0x82,0xf1,0xd6,0x5a,0xd1,0x25, +0xb6,0x68,0x8b,0x25,0x0f,0x3b,0xc1,0x05,0xf6,0x28,0x55,0x94,0x7a,0xa5,0x85,0xd1, +0x10,0x93,0x94,0x24,0x14,0x6a,0x05,0x8c,0xc6,0xf7,0x85,0xd0,0x56,0xb6,0x1e,0xea, +0x21,0x95,0x5e,0xe8,0x57,0xb7,0x5e,0xc8,0x9b,0x9a,0x4c,0x52,0xd2,0x03,0x23,0xa4, +0x3c,0x66,0xa8,0x8c,0xbf,0x6d,0x81,0x5c,0xe0,0x74,0xbe,0xcc,0x86,0xbb,0x79,0xc3, +0xac,0x35,0x23,0xbd,0xd7,0xb5,0x77,0xf0,0xdf,0x58,0x2d,0x42,0x3a,0xa1,0x74,0x9b, +0xd6,0xfb,0xf7,0x7d,0x3f,0xbf,0xa8,0x28,0x99,0x2a,0x65,0xa0,0xfb,0xa0,0xcc,0xc8, +0xed,0x98,0xc4,0xee,0xb9,0x2e,0xf5,0xb6,0x4f,0xb0,0xbe,0xe7,0xc7,0x5d,0xba,0xd8, +0x2d,0x99,0x96,0xd6,0xc2,0x4c,0xfe,0x48,0x2f,0xdd,0xff,0x88,0x5b,0x8a,0x7a,0xc9, +0x09,0x9a,0x1c,0xf4,0x1d,0x15,0x56,0x09,0x17,0x5f,0x57,0x05,0x3a,0xf1,0xdd,0xd9, +0x1a,0x9b,0x10,0xa4,0x91,0x00,0x37,0x50,0x04,0x9b,0x04,0xf3,0x46,0x5e,0xa0,0xea, +0xa5,0xaf,0xfd,0xea,0x34,0x3b,0x3f,0x89,0xb7,0xcd,0xf9,0xc7,0x74,0x7d,0x36,0x17, +0x35,0xae,0x33,0xb1,0xe6,0x9c,0x0f,0x6e,0x2b,0x4e,0x4c,0xcb,0xa4,0x02,0x79,0x09, +0x25,0x43,0xc0,0x7a,0xec,0xdd,0x42,0xdb,0x75,0xc7,0x89,0x38,0x2d,0x0e,0xad,0x7a, +0x0f,0xac,0x5d,0xee,0x60,0x40,0x66,0x43,0xb3,0xdc,0x62,0x4e,0xff,0xdc,0x6e,0x47, +0x93,0xa8,0xbe,0x42,0x71,0xc3,0xf4,0x02,0x52,0xbb,0xa8,0x9a,0xaf,0xc5,0x66,0x57, +0xca,0x0a,0xf6,0x68,0x7b,0x28,0xf8,0x02,0x21,0x82,0x23,0x50,0x28,0xa5,0xe1,0x0b, +0x21,0x63,0x12,0xb6,0x1e,0x67,0xe9,0x51,0xdc,0xe9,0xe9,0x9a,0x27,0x05,0x67,0x56, +0x12,0xab,0xdb,0x75,0x78,0x63,0x27,0x76,0x62,0x06,0x6e,0x69,0xa4,0x67,0x7a,0x2f, +0xb1,0x6e,0xf9,0x47,0x36,0x14,0x82,0xd9,0xeb,0x58,0xa9,0x89,0xab,0x76,0x4e,0x6b, +0x8d,0x38,0xb7,0x92,0x18,0xc9,0x8d,0xc7,0xbc,0x2a,0x9b,0x4a,0xa2,0x79,0x93,0xe3, +0x36,0x2a,0xc3,0xda,0xd0,0x5c,0x4d,0x2f,0xc8,0xb7,0xef,0x09,0x3d,0xf5,0x75,0x1f, +0x60,0x6f,0xb0,0x92,0x6a,0x16,0xe0,0x62,0xe7,0xf7,0x21,0xc3,0xc9,0xa6,0xe2,0x02, +0x2e,0x02,0xf8,0xfc,0xf4,0x83,0xad,0x98,0x5c,0xed,0x89,0x6c,0x5c,0x9c,0xae,0xbe, +0x1b,0x86,0xf2,0xa3,0x68,0x2d,0x08,0xce,0xa0,0x29,0x36,0xe3,0xaa,0xbb,0xe7,0x8b, +0x0e,0x83,0x67,0x2f,0x6d,0x4b,0xd2,0x9a,0x4e,0xc3,0x42,0x85,0xfc,0x23,0x4f,0xde, +0x2c,0x1f,0x94,0x58,0x9d,0xdf,0x63,0x5d,0x6a,0xb0,0x4b,0x95,0xb5,0xe4,0xfc,0xa4, +0x91,0xe4,0x02,0x0b,0xc1,0x66,0xfe,0xd2,0xb5,0x2f,0x95,0xdf,0x97,0x60,0x74,0xa2, +0x51,0x8e,0xb3,0x1b,0xca,0xac,0x37,0x5b,0xd1,0x15,0x66,0x90,0x80,0x7e,0x7d,0xb3, +0x71,0x66,0xbc,0x0e,0xb1,0x62,0x2f,0xfa,0x57,0xdf,0x2e,0x53,0xe0,0x8f,0x30,0x8f, +0x02,0x96,0x6c,0x6f,0x00,0x05,0x8d,0x1b,0xe1,0x7f,0x29,0xce,0x52,0x16,0x84,0x30, +0x2a,0x72,0xbb,0xaa,0x40,0xab,0x42,0xec,0x89,0x10,0xee,0x54,0x98,0xdb,0xa8,0x3a, +0x40,0x35,0x6c,0x24,0xdf,0xe6,0xf8,0xd4,0xbd,0xaa,0xe6,0x0e,0x88,0xaa,0x1d,0xd8, +0x0e,0x73,0x9f,0xa5,0xce,0x99,0x6f,0x51,0x04,0xf9,0x71,0xc1,0xcd,0x44,0xa9,0x22, +0x27,0x03,0xb3,0xd2,0x97,0x5b,0x67,0x63,0xe3,0x2b,0x24,0x1e,0x40,0x37,0x15,0x72, +0xbc,0x17,0xff,0x91,0xf3,0x37,0x63,0xa8,0x73,0x0f,0x2d,0x4e,0xd4,0x85,0xb7,0x86, +0x8a,0x9c,0xb4,0xc6,0x8e,0xb4,0x66,0xaa,0xb4,0x85,0x9f,0xc7,0xde,0x69,0x38,0xbb, +0xd8,0x85,0x6e,0xff,0x61,0x45,0x17,0x90,0x19,0x2e,0xef,0x89,0x09,0x35,0x20,0xb3, +0x0a,0x6f,0xa6,0x76,0x9d,0x46,0x30,0x43,0x00,0x54,0x24,0x5b,0xe9,0x86,0xe2,0xba, +0x05,0x97,0x9c,0xcd,0xe4,0x74,0xe9,0xa7,0xdd,0xd1,0x96,0xa8,0xf8,0x9b,0xf1,0xff, +0x87,0x78,0xf6,0x59,0x35,0x5f,0x25,0x03,0x9c,0x1f,0xe6,0x17,0xd7,0x70,0xc7,0x4e, +0x9b,0x17,0x17,0x4f,0x3a,0x95,0x2a,0x03,0x16,0xef,0x37,0x8f,0x49,0x1b,0x6f,0x06, +0x40,0x5b,0x85,0x40,0x9f,0x80,0x1f,0xbd,0xd4,0x5d,0x26,0xda,0x5a,0x00,0xf1,0xf1, +0x88,0x9d,0x41,0xed,0x48,0xbe,0x1b,0x87,0x95,0x6c,0x4f,0x02,0xf5,0x7f,0x50,0x36, +0x06,0xb1,0x92,0x4c,0xaa,0xe0,0xdd,0x49,0xd3,0x5c,0x80,0xc8,0xf9,0xec,0x59,0x70, +0x27,0xe7,0x99,0x75,0x0d,0xfd,0x91,0x86,0x0d,0x86,0x05,0x45,0x2f,0x87,0x14,0x22, +0x01,0x9f,0xf7,0xf5,0x97,0x5e,0x5c,0x40,0x41,0xd5,0x46,0x13,0x34,0x85,0x3a,0x46, +0x88,0xcb,0x71,0xdf,0x10,0x54,0x4e,0x57,0xa6,0x45,0x74,0x80,0x65,0x67,0x90,0xa2, +0x47,0xee,0xd0,0x66,0x37,0x0a,0x00,0xc2,0xbb,0x6a,0x80,0xf4,0xb9,0x57,0x60,0xb3, +0x8a,0xe0,0x85,0x34,0xee,0x07,0x69,0x90,0x42,0x6b,0x09,0xe5,0x38,0xed,0x5b,0x62, +0x03,0x28,0x49,0x25,0xf5,0x40,0xdd,0x0c,0x64,0x4c,0x81,0x05,0x55,0x00,0xd8,0x02, +0xe8,0x87,0x35,0xf1,0xe9,0xcb,0x3a,0x32,0xa7,0x8c,0xc9,0xde,0x54,0x8e,0x17,0x2b, +0x89,0x95,0x81,0xbb,0xcc,0xb5,0xdb,0xc1,0xbc,0xff,0x41,0xce,0x51,0x8f,0xb3,0xa4, +0x7b,0xba,0x58,0x74,0xb2,0x15,0x88,0xa4,0x3b,0x77,0xcc,0xdf,0xd8,0x8c,0xd3,0x68, +0x2e,0x9b,0x7f,0x55,0x9f,0x45,0x40,0x26,0x06,0xc4,0x44,0x1b,0x2c,0x24,0xc2,0x39, +0xad,0x2f,0x9c,0x49,0x3a,0x5d,0xa2,0x5b,0x22,0x63,0xae,0x8c,0x3d,0x8c,0x02,0x5d, +0x8c,0xc9,0x39,0xad,0x93,0xa0,0x04,0x7d,0xee,0x32,0x02,0x5a,0x3c,0xae,0xc7,0xb8, +0x02,0xcf,0x9d,0x49,0xfd,0x4b,0xd3,0x19,0xac,0x69,0x0b,0x1d,0xed,0xe6,0x12,0x29, +0x01,0x84,0x12,0x78,0x3e,0x1e,0xeb,0x99,0xac,0x99,0xed,0x4a,0x34,0xab,0x5c,0xb0, +0x5c,0x0c,0x43,0x75,0x97,0xed,0x99,0x49,0x57,0xc2,0x4c,0x82,0xc4,0xb4,0x11,0x8d, +0x86,0x14,0xcb,0xd2,0x96,0xac,0xe8,0x4c,0x9c,0xb2,0x18,0x74,0xf1,0xb3,0x74,0xb2, +0x07,0x2d,0x46,0xc3,0x17,0x8f,0x8a,0x9e,0x1b,0x0f,0x93,0xa0,0x57,0xfc,0x3e,0xc8, +0xcf,0x9c,0xce,0xc6,0x16,0xf2,0x42,0xc9,0xcb,0x4c,0xf9,0x5c,0xf3,0xd1,0x5e,0x72, +0xc0,0x3b,0xba,0x24,0x76,0x19,0x4e,0x0c,0xdd,0xcb,0x64,0x0e,0x50,0xb9,0x93,0xb4, +0x47,0xe3,0x92,0xd0,0xde,0xba,0x47,0xb8,0xfe,0x68,0x07,0x89,0xf8,0x23,0xc1,0x2b, +0xc2,0x9b,0x74,0xf5,0xd6,0xeb,0xb5,0x63,0x3f,0xca,0xab,0x05,0xfa,0x72,0x13,0xd5, +0x46,0x14,0xbf,0x95,0x5c,0xd3,0x50,0xbd,0x12,0x8b,0x6d,0xb0,0x1e,0xe6,0x5d,0xe5, +0xf8,0x97,0x9f,0xee,0x60,0x25,0x8b,0x0f,0xd3,0xda,0xcb,0x2a,0x76,0xc7,0x93,0x85, +0x8e,0x1c,0x6a,0x65,0xc8,0xdb,0x3c,0xd5,0xf7,0xa6,0x62,0xcc,0xf3,0x9c,0x15,0x75, +0x14,0x95,0x0b,0x0a,0x4f,0x07,0xd9,0xae,0x76,0xd2,0x77,0x2e,0x47,0x77,0x80,0xc8, +0x0e,0x4a,0x54,0xe0,0xb3,0x44,0xb8,0x71,0x04,0x56,0x91,0xb8,0x34,0xf4,0x94,0x39, +0xa2,0x91,0xdc,0x2c,0x92,0xfd,0xdb,0x95,0xf3,0x9d,0xec,0xec,0xbc,0xf8,0x7c,0x57, +0xc4,0xd9,0xdc,0xef,0x51,0x26,0x81,0x89,0x53,0xbe,0x3a,0x2e,0x01,0x22,0xf7,0x23, +0x9e,0xd3,0xda,0x3e,0x1d,0x4e,0x49,0xd3,0x86,0xd3,0x67,0x9c,0xaa,0x9c,0x55,0x6b, +0x49,0x30,0xef,0x20,0x4e,0x1c,0x84,0x0b,0xcf,0x2e,0x40,0xdb,0x00,0x93,0x3e,0x08, +0xde,0xaf,0xd2,0x3b,0xfb,0x44,0xef,0x52,0x82,0x40,0xf2,0x24,0xbb,0xe3,0x76,0xbd, +0x25,0xac,0x18,0x2b,0x45,0xac,0x20,0x01,0xe0,0xc0,0xa6,0x19,0x39,0x62,0x52,0x73, +0x42,0x02,0x3e,0xe7,0xd8,0xc3,0x81,0x52,0xf4,0xe3,0xcb,0xaa,0xac,0x23,0xd8,0x9e, +0x34,0x8a,0x65,0xef,0x6a,0xfc,0x9c,0xc2,0x45,0xce,0xe7,0x33,0x30,0xc0,0x72,0x64, +0xeb,0xb5,0xe1,0x32,0x72,0xdb,0x12,0x5f,0x2b,0x06,0x8e,0xb9,0x52,0x23,0xd8,0xd2, +0xed,0xd7,0x33,0x6f,0x32,0xbe,0xe7,0x96,0xbf,0x8c,0x30,0xf5,0xd4,0x05,0x21,0x7d, +0x7a,0x60,0x3e,0x37,0xf0,0xd9,0x0e,0xb0,0xf1,0xe6,0x54,0x8d,0x0a,0xa6,0x71,0xae, +0x6a,0x17,0xc9,0xd1,0xcf,0x76,0x99,0x89,0xe4,0x5c,0x63,0x32,0xe0,0x93,0x22,0xe2, +0xe1,0x3b,0x02,0x8d,0x47,0x2e,0x40,0x9e,0xa3,0x2c,0x03,0xdf,0xd4,0x65,0xb9,0xb0, +0xf5,0x3a,0xf2,0x0d,0xf9,0xa8,0x24,0x14,0x21,0x44,0xca,0xcf,0xdd,0xe4,0x19,0x0b, +0x1a,0x4b,0xf1,0x0d,0x39,0x81,0x29,0xcb,0x64,0x0b,0x03,0x5e,0xa0,0xcb,0xcb,0x04, +0xbd,0x97,0x0f,0xe2,0x78,0x88,0x0d,0x5b,0xa9,0xfb,0xcd,0x05,0x32,0x0f,0xae,0xd7, +0x2e,0xf0,0x7d,0x60,0xe1,0xb1,0xd4,0x17,0xed,0x48,0x30,0x2c,0x03,0x20,0xe1,0x7c, +0x89,0xea,0xf2,0x4f,0x3a,0x22,0x05,0xa9,0x78,0xad,0xda,0x94,0x53,0x20,0xfe,0x16, +0x5f,0x53,0x10,0xb7,0x27,0x8f,0x93,0x56,0xaf,0x0c,0x56,0x85,0x02,0xa5,0xab,0x5d, +0x81,0x53,0xf9,0xa2,0x16,0x92,0xe4,0x9f,0x37,0xe6,0xd9,0x9b,0x7e,0x74,0x3a,0x20, +0x40,0x30,0x82,0xb6,0xc4,0x3f,0x6c,0x87,0x9d,0x5f,0xc7,0x9a,0x16,0x85,0x9c,0xf2, +0xde,0xbc,0xb6,0x7f,0x82,0x70,0x24,0xf7,0xbf,0x8c,0x4c,0xb0,0x2d,0x20,0xfa,0xf3, +0x8e,0xcd,0x78,0xcb,0x45,0x6e,0x85,0xc3,0x13,0x37,0x43,0x5d,0xf0,0xc9,0xdc,0xa0, +0xcf,0x0c,0x49,0x10,0xf2,0xc0,0x07,0xb3,0x52,0x12,0xa3,0x98,0x8d,0xdc,0x7a,0xf8, +0x85,0x55,0xc5,0xb7,0x6d,0x9d,0xe3,0x80,0x64,0xef,0x16,0x82,0x8d,0x6f,0x64,0xd7, +0xa2,0x51,0x48,0xa7,0x6c,0xb7,0xa3,0x18,0x2f,0x18,0x94,0xf8,0x75,0x3c,0x6d,0xa3, +0x23,0x19,0xdd,0x25,0xb6,0x8d,0x10,0x09,0xaa,0x1b,0x12,0x83,0x7f,0x80,0x65,0x13, +0xc8,0x19,0x32,0xf3,0xa3,0x50,0x22,0x19,0xfd,0x1a,0x68,0x1d,0xad,0x3a,0xbc,0x73, +0x2e,0xb3,0x79,0xea,0xcf,0xc5,0x49,0xa1,0x9c,0xbb,0x36,0xdf,0x4c,0xab,0x2e,0x72, +0xdc,0x90,0xf0,0x20,0xd8,0xbf,0x9e,0xa5,0x5d,0xe6,0xa0,0x85,0x05,0xd6,0x61,0xf6, +0x8c,0x93,0x6b,0x13,0x9c,0xcc,0xa0,0x01,0x9b,0x5a,0xe9,0xaa,0x59,0x3b,0x2f,0x13, +0x8d,0xce,0x8f,0x6e,0xc3,0x7a,0x45,0x21,0x95,0xf4,0x3f,0xce,0x89,0xa8,0x06,0x68, +0x72,0x4e,0x26,0xf9,0x9e,0x4c,0x28,0xb9,0xd6,0xd5,0xd4,0x0a,0xfa,0x4c,0xae,0xf0, +0x40,0x95,0x76,0x2f,0x7a,0x2d,0x9b,0x9e,0xd0,0xfc,0x36,0xf9,0x7d,0x66,0xef,0xfc, +0x0e,0x6e,0x27,0xe5,0x89,0x2e,0x97,0x11,0x77,0x45,0x8e,0x70,0x1b,0x31,0x4f,0x28, +0xe2,0x1f,0x77,0x2e,0xf2,0x24,0x45,0x02,0x0a,0x3c,0x96,0x79,0xd2,0x6d,0x9b,0x58, +0xdd,0x7d,0xd8,0xf8,0x30,0xbb,0x4e,0x24,0xa5,0x43,0x88,0x02,0xdb,0x1d,0x3e,0x1e, +0xee,0xc5,0xaa,0x24,0xea,0xcf,0x40,0x15,0x61,0x3e,0xb8,0x12,0xda,0x4c,0x0e,0x27, +0xe7,0xa1,0x71,0x61,0xff,0xad,0xc3,0xd0,0x48,0x4f,0xd3,0xb7,0x21,0x64,0x13,0xa3, +0x6f,0x2c,0x97,0x0b,0x4b,0xe2,0x81,0x74,0x1b,0x3c,0x6a,0xa5,0xd5,0x4e,0x9f,0xc0, +0xe8,0x56,0x07,0xb9,0xe7,0x02,0xb0,0x9a,0x61,0xdf,0xd1,0xf0,0x57,0x77,0x8b,0x76, +0x7c,0x85,0xf2,0xad,0xf6,0xc6,0xb5,0x0d,0x74,0x15,0xa1,0xf4,0x13,0xe6,0x59,0xbd, +0x7b,0xea,0x99,0xb9,0x2f,0x07,0x77,0x1c,0x61,0x84,0xa8,0x66,0x37,0xa9,0xb4,0xac, +0xf0,0x87,0x92,0xd3,0xcb,0xf6,0xc1,0x88,0x63,0xa5,0x78,0xd3,0xf5,0xe7,0x86,0x68, +0x28,0x27,0x9c,0x13,0x9e,0x79,0x08,0xb8,0x4c,0x17,0xe5,0x5e,0xdc,0x6e,0x7f,0x2a, +0x05,0x36,0xd2,0x0a,0xf4,0x48,0xc5,0x5c,0x31,0xa5,0x45,0x4c,0x73,0x36,0x87,0x69, +0x73,0x27,0x94,0x88,0xb8,0x01,0x09,0xd1,0x37,0x8b,0x93,0x0b,0xb4,0xe7,0x11,0xbe, +0x7e,0xca,0x99,0x3b,0xf6,0xa4,0xff,0x1c,0x32,0x46,0xe0,0x3f,0xd9,0x1b,0xe2,0x56, +0xb3,0x97,0xbb,0x42,0xeb,0xe3,0x48,0xcf,0x0f,0xc8,0x65,0x86,0x00,0x6c,0xd2,0x7e, +0x3c,0x1e,0xee,0x2d,0x40,0x2a,0xae,0xdf,0x0c,0xc1,0xa1,0xca,0xdf,0x6c,0x71,0x2d, +0x71,0x9c,0xe2,0x30,0x39,0x15,0x8c,0x18,0xe3,0x42,0x0b,0x29,0xd2,0xac,0x55,0x76, +0x28,0x9f,0xef,0x5a,0xc5,0xab,0xf4,0x2b,0xed,0xb0,0x3b,0x87,0xb9,0xf4,0x73,0xbd, +0x52,0x0b,0x9a,0x8a,0x76,0x4f,0x94,0xd0,0x06,0x17,0xca,0xa1,0xd5,0xb1,0xab,0xbe, +0xaa,0x3c,0x3c,0xe4,0x96,0x1c,0x65,0x96,0xc0,0x2e,0x8b,0x31,0x8a,0x5c,0x25,0x7a, +0xb0,0xd2,0x9b,0x26,0x39,0x44,0x4b,0xa4,0x45,0x93,0x8b,0x9b,0x76,0x23,0x38,0xe3, +0x25,0x15,0xac,0xb0,0x16,0xd6,0x64,0x87,0x40,0x25,0xaa,0x30,0xd1,0x5e,0x3a,0x96, +0x26,0x3f,0x65,0xa0,0xdd,0x7c,0x0f,0x0a,0x6e,0x99,0x9c,0x24,0xf5,0xb0,0x93,0x56, +0x04,0xfb,0x2c,0x36,0xb8,0xf7,0x04,0xc0,0x98,0x00,0x94,0x94,0x51,0xf9,0xeb,0xc3, +0x47,0x29,0xe4,0xa1,0x5d,0x5e,0x88,0x90,0xc7,0xa2,0x9d,0xe0,0x75,0xf9,0x51,0xb1, +0x94,0x65,0x33,0x19,0x35,0xbf,0x05,0x77,0xbb,0x86,0xc5,0xb5,0x7b,0xfb,0x06,0xae, +0xd7,0x13,0x9c,0x6c,0x90,0xf9,0xa6,0x95,0x58,0x78,0x35,0x5f,0xdf,0x38,0x14,0x2a, +0xcb,0x36,0x99,0x19,0x19,0xd5,0x47,0xdc,0x2d,0x98,0x5d,0x9a,0x82,0x52,0x44,0xb6, +0x47,0xde,0x99,0xb7,0x3e,0x6b,0xa6,0x5b,0x94,0x2b,0x95,0x51,0x01,0x96,0x8b,0xf9, +0x20,0x2d,0xc8,0x6c,0xd7,0x36,0x41,0xbd,0x04,0xd4,0xc7,0xaf,0x14,0xaa,0xde,0xaa, +0x2a,0xb1,0x08,0x3e,0x2e,0xb3,0x2f,0xe2,0x9b,0x93,0x56,0xff,0x5b,0xfa,0x6a,0xba, +0x2b,0xb0,0xf6,0x9e,0x56,0x30,0xe4,0x89,0x42,0xd6,0x86,0x3c,0xfb,0xf3,0x14,0xb8, +0xf1,0x17,0xd9,0x12,0x31,0x18,0x76,0x94,0x49,0x8b,0x54,0x47,0x5f,0x7e,0xb9,0xa8, +0x82,0x94,0x10,0x5b,0xc4,0x1a,0xff,0xd5,0x86,0xc4,0x5b,0x3d,0x5e,0xbc,0xa8,0x21, +0x33,0x25,0x8f,0x14,0x92,0xa7,0x4b,0x20,0x88,0xea,0x10,0x45,0x32,0x63,0x68,0xa2, +0x51,0x0c,0xfe,0xf2,0xb0,0x4f,0xd8,0xd4,0x60,0x9a,0xa2,0xb6,0xbb,0xf6,0xb9,0x30, +0xd3,0x4d,0x85,0x67,0x6f,0x24,0x43,0x32,0x87,0xe1,0x85,0x21,0xf9,0xe1,0xf6,0x77, +0x0e,0xf5,0x6e,0x55,0x9d,0xde,0x2d,0xcc,0xe0,0x36,0xe1,0xf3,0x87,0x65,0x60,0xa0, +0x00,0xa9,0x39,0x36,0xb1,0x22,0x68,0x50,0x0e,0xeb,0x00,0xe0,0x5c,0xb3,0xcf,0xd2, +0xe9,0x3a,0xa8,0xe7,0xa8,0x28,0x26,0x77,0xa2,0x4a,0x29,0x0f,0xf0,0xc8,0x4a,0x71, +0x03,0xa9,0xb7,0xdc,0x33,0xd9,0xf1,0x13,0xa0,0x81,0xe9,0x9e,0xd4,0x04,0x31,0x76, +0x62,0x08,0xb1,0x72,0x32,0xdf,0xed,0x0a,0x60,0x57,0x4f,0x44,0x72,0x25,0x0a,0x18, +0xe9,0x13,0xda,0x05,0x9a,0x8f,0xd8,0x06,0x03,0xf3,0x64,0xcd,0xfb,0xc7,0xca,0x61, +0x82,0x08,0xf2,0x1e,0x15,0x41,0xc2,0xe7,0xa8,0xe6,0x1a,0xb8,0x60,0xb4,0xb5,0xef, +0x0d,0xcb,0x7b,0x6f,0xf0,0xb0,0x0b,0xd1,0x60,0x08,0x12,0xde,0x80,0x91,0x4d,0x1c, +0x8f,0x70,0x84,0x15,0x70,0x53,0x92,0xbd,0xf8,0x25,0x87,0x8d,0x38,0x6d,0xba,0x4a, +0x04,0xb1,0xba,0xce,0xf0,0x7b,0xea,0x93,0xb7,0xed,0x12,0x7f,0xa1,0xe7,0x84,0x88, +0x8f,0x04,0x32,0x3e,0x96,0xdb,0x5f,0x8b,0xcf,0xc0,0x7a,0x0e,0x39,0xaa,0x31,0x4d, +0xd6,0xa3,0xfb,0xb2,0x18,0x89,0x6b,0x58,0x6b,0xcf,0x16,0x5c,0xb6,0xc1,0x4e,0xa8, +0xd7,0x93,0x83,0x58,0xf0,0xdf,0x09,0xcf,0x20,0x2b,0xa5,0x7a,0x22,0x60,0x90,0x10, +0x26,0x89,0xcc,0x81,0x12,0xe2,0x74,0x17,0x4b,0x5f,0x81,0xd7,0x64,0x1e,0x5c,0xbd, +0x2d,0x53,0xf2,0x8d,0xb3,0xd6,0x45,0x87,0xc6,0xfc,0x80,0x9d,0xf3,0x96,0xe0,0x05, +0xd3,0x6f,0x00,0xf7,0x5b,0x62,0x6b,0xf9,0x0b,0x02,0xf7,0xa7,0xf1,0x32,0x45,0xcf, +0x1d,0xd9,0xd1,0x77,0x31,0x83,0x96,0x51,0xf3,0x48,0xc1,0xd7,0xd2,0x33,0xfc,0x3f, +0x55,0x14,0xdc,0xc1,0x93,0xb4,0x74,0x3d,0xe5,0xa6,0x8e,0x68,0x1a,0x24,0xf3,0x32, +0x33,0x58,0xf2,0xd8,0xbe,0xb3,0x24,0x74,0x7d,0x4d,0x2e,0x07,0xff,0xc8,0xf1,0xbf, +0x01,0x73,0xbd,0xc1,0xc1,0xec,0x35,0xa1,0x0c,0xdb,0xab,0xe3,0x13,0xf5,0x32,0x29, +0xa3,0x72,0x4d,0x15,0xfb,0x75,0x9d,0xa1,0xb6,0x54,0xa5,0x05,0x6d,0x86,0xb7,0x59, +0xc9,0xa7,0xe6,0x3f,0xf7,0x35,0x23,0xce,0x97,0x51,0x8a,0x85,0x7e,0x98,0xce,0x6c, +0xf5,0x5b,0xb6,0x67,0x3f,0x28,0x15,0x49,0xca,0x49,0x86,0xb8,0x70,0x6e,0xd8,0xe9, +0xdf,0xaf,0x78,0x0f,0x52,0x04,0xd7,0x6f,0xc4,0xf5,0x18,0xd2,0x99,0x5a,0xdb,0xb7, +0x2b,0xbc,0x8f,0x1f,0x5b,0xa9,0x2d,0x3b,0x03,0xb5,0xa1,0xe4,0xd8,0x3b,0x7d,0x2a, +0x86,0xa1,0x02,0x57,0xc5,0x7d,0x46,0xfc,0x8b,0xe3,0x16,0x68,0x0b,0x83,0xfa,0xa7, +0x88,0x78,0x31,0xae,0x59,0xc2,0xf6,0x65,0xe9,0x59,0xa6,0x78,0x3d,0x1e,0x3f,0xee, +0x5f,0x11,0xf9,0xc1,0xda,0xc1,0xa8,0x6d,0x9b,0x03,0x17,0x69,0x0c,0x83,0x74,0x3b, +0x07,0xa2,0x34,0xae,0xaf,0x51,0x01,0x9b,0xe5,0x3d,0x73,0x62,0xc8,0x3c,0xbb,0x86, +0x7a,0x0c,0xf8,0x17,0x27,0x95,0x50,0x20,0x2f,0xcd,0xc6,0x9c,0xf7,0xac,0xf1,0x31, +0x3a,0x88,0xf1,0x35,0xb2,0xa7,0x72,0xaf,0x65,0xcc,0xda,0x37,0x54,0x71,0xfa,0x90, +0xfb,0x8b,0x19,0x67,0xfb,0x2f,0xce,0xa6,0xca,0xa0,0x72,0x54,0x8d,0x8c,0x77,0x53, +0x89,0x28,0xdf,0xc1,0x34,0xa8,0xbd,0xb7,0xa6,0x7b,0x83,0xc4,0x8c,0x4c,0xa0,0x12, +0x55,0x9f,0x1f,0xc4,0xfc,0x16,0x4a,0x80,0xea,0x79,0xce,0x53,0x3e,0xe9,0x74,0x73, +0x34,0x60,0x90,0x24,0xfc,0xf5,0x40,0x62,0xe4,0xc1,0xa2,0xf9,0x3f,0x04,0xd7,0xa5, +0x03,0xe7,0xd9,0xa7,0x92,0x26,0x09,0xe1,0x2c,0x74,0x31,0xe3,0xe3,0x59,0xd1,0x23, +0x83,0x8e,0x89,0xe4,0x34,0xa8,0x55,0x82,0x9b,0x5b,0x87,0x71,0x36,0x64,0x2e,0x0a, +0x77,0x81,0x23,0x8c,0xf6,0xe7,0x62,0x0f,0x5e,0xa4,0xb5,0xc6,0xb0,0xa7,0xf8,0x9e, +0x6e,0x2b,0x5c,0xff,0xbe,0x04,0x22,0xbb,0xac,0xd2,0x84,0x32,0xd0,0x6f,0x78,0x84, +0x8a,0x73,0xdb,0xfc,0x88,0xac,0x0d,0x77,0x06,0x92,0xd3,0x9c,0x77,0xe5,0x7b,0x8a, +0xc9,0xc9,0xa4,0xd8,0x5f,0x8b,0x0e,0xdd,0x48,0xaa,0xbb,0xff,0xd9,0xc2,0xe2,0x2b, +0x26,0x21,0x82,0xfd,0xb9,0xa3,0x48,0x82,0xa2,0x83,0x00,0x9d,0xd2,0x51,0xea,0x3b, +0x27,0xcf,0x9c,0x88,0xf6,0xd5,0x44,0x23,0xad,0xed,0x0f,0x8e,0x41,0x1c,0xad,0x9b, +0x0a,0x85,0x23,0xa2,0x71,0xa8,0x0d,0x33,0x4e,0xf7,0x8b,0x7e,0xb2,0xea,0x61,0x83, +0xbc,0x0a,0x93,0xb7,0x27,0xe2,0x7d,0x09,0x24,0x77,0x3b,0xfb,0x13,0x50,0x51,0xe0, +0x4c,0x48,0x9c,0x79,0xbb,0x36,0x4c,0x20,0x8e,0xee,0xb8,0x0c,0x56,0x91,0xd9,0x70, +0x06,0x31,0xfe,0x14,0xdf,0x26,0xa5,0xe7,0x63,0x59,0xc1,0x5b,0x51,0x4e,0x5d,0xe1, +0x26,0x35,0xa5,0x47,0xb0,0x9b,0x6f,0x4d,0x47,0x90,0xbb,0x5b,0x1e,0x09,0x4d,0x20, +0x0a,0x13,0x95,0xa6,0xe6,0xbc,0xaa,0x73,0xa5,0xde,0x7d,0x4e,0xde,0xe8,0x1c,0xb0, +0x8a,0x9b,0x86,0x86,0x37,0x1e,0xb0,0x32,0x38,0xd7,0x0c,0x0e,0x4c,0xb9,0xd8,0x30, +0xa5,0x32,0xcc,0x16,0x62,0x18,0xc4,0x70,0x8d,0x67,0x50,0x69,0x9c,0x25,0xd1,0x21, +0x0a,0x99,0xdb,0xcb,0x39,0x30,0x4d,0xea,0xd5,0x77,0x0a,0x0f,0xff,0xbb,0x2a,0x31, +0x25,0x30,0x6c,0x90,0xb9,0x18,0x05,0xf1,0xbb,0x7a,0x9d,0x44,0xd1,0xfa,0x5e,0x66, +0x84,0xe3,0xf6,0x12,0x78,0xb5,0x20,0x72,0xcf,0xde,0x00,0xc8,0x87,0x7f,0x85,0xf4, +0xf8,0x9f,0x2f,0x1c,0xd7,0x2e,0x3b,0x38,0xed,0x8c,0xf4,0xb8,0x8a,0x74,0x3f,0xd4, +0x11,0x66,0x0b,0x1d,0xf8,0xb0,0x9c,0x66,0x4d,0xd3,0xb3,0x36,0x15,0x10,0x0f,0x5f, +0x0c,0x24,0x97,0xd8,0x63,0xb1,0x07,0xdb,0xe1,0xb3,0xe7,0xba,0x08,0x72,0x21,0xa8, +0xd1,0xf0,0x67,0xbc,0xd5,0x5d,0xf7,0xfa,0xec,0x7b,0x09,0x9e,0x32,0xf5,0x37,0xe8, +0x8a,0x22,0x6f,0x1e,0x49,0x10,0x76,0xba,0x63,0x56,0xe6,0xfb,0x82,0xf6,0x05,0xda, +0xad,0x3d,0xd9,0xfa,0x33,0x18,0x30,0x09,0x61,0x58,0xf6,0x90,0x9f,0xde,0xd0,0xea, +0x0e,0x3e,0x79,0xee,0x1e,0x3e,0x77,0x19,0x6d,0x78,0x79,0x17,0x91,0x74,0x04,0xe6, +0x80,0x80,0x40,0x9a,0x7b,0x2f,0xa3,0x08,0xbc,0x71,0x27,0xd4,0x71,0xc1,0xc8,0x80, +0x65,0xfe,0x9a,0x75,0x17,0x63,0x4d,0xb4,0x1d,0xd2,0x58,0xa5,0x51,0x65,0x3b,0xe9, +0xee,0x4d,0x05,0x76,0xfc,0xa7,0x2f,0x2d,0xc6,0xc0,0x07,0xd6,0x54,0xef,0xe5,0x61, +0x01,0x85,0xbf,0xe4,0x32,0x43,0xba,0x19,0x1d,0x72,0x20,0x0a,0xc5,0x21,0x80,0xc4, +0xf8,0x09,0x5c,0xc0,0x1c,0x8b,0x54,0x00,0x56,0x5f,0xcd,0x9a,0x42,0x26,0x0a,0xee, +0x05,0xa7,0x17,0x55,0x37,0x67,0x15,0x04,0xbd,0x65,0x3b,0xb4,0x47,0x75,0x21,0xf7, +0x8a,0x44,0x2d,0xdb,0x93,0x46,0x44,0x07,0x3d,0x04,0x11,0x0c,0x29,0x08,0x19,0xe3, +0xfa,0x94,0x09,0xd6,0x64,0x8a,0xdd,0x8c,0xcb,0x06,0x19,0xf1,0xea,0xf8,0xa2,0x48, +0x5c,0xf5,0xbc,0x39,0xf8,0xa9,0x2c,0x24,0x4e,0xca,0xc2,0x2c,0x84,0xa9,0x42,0x0d, +0xe8,0x0f,0xaa,0xd6,0xf0,0x79,0xda,0x25,0x3b,0x0b,0x65,0xcd,0x3d,0x96,0x19,0x0b, +0x4a,0xce,0x1b,0x89,0xda,0xb5,0x46,0xad,0x8e,0x28,0xb3,0x39,0xb3,0x9a,0xfd,0xf9, +0x2a,0x0f,0xd5,0xff,0x95,0x0e,0xdb,0x42,0x4b,0xac,0x5b,0xb8,0x03,0xc6,0x22,0x0a, +0xbf,0x01,0xc3,0x8b,0xcc,0x24,0x0b,0x58,0xef,0x73,0xed,0xab,0x88,0x64,0x3c,0xb7, +0xd6,0x02,0xf4,0x51,0xf9,0x6d,0x52,0x44,0xb7,0x5d,0xe1,0x3b,0x8d,0x65,0xbc,0x6e, +0x2b,0x08,0x47,0xb0,0x92,0x6f,0x6d,0x61,0x45,0x78,0x57,0x90,0xd2,0x2f,0xff,0x26, +0x28,0x09,0x48,0x2e,0xcb,0x41,0x80,0x79,0xd9,0x02,0xde,0x95,0xa7,0x2d,0xf6,0x7d, +0x3e,0x8b,0x1c,0x00,0x36,0x95,0xe2,0x3d,0xc1,0xaf,0xe6,0xa3,0x38,0xdb,0x8d,0x14, +0x13,0x11,0x10,0x10,0x37,0x94,0x14,0xb8,0xe3,0xb6,0x23,0x06,0xb1,0x11,0xf7,0x78, +0x3e,0x67,0x45,0x14,0xde,0xb3,0x2b,0xa8,0x6d,0xa4,0x12,0x38,0x70,0x92,0x53,0xb9, +0xa1,0xb7,0x4d,0x04,0xdf,0xb2,0x5e,0x41,0xe9,0x5c,0xc3,0xa8,0xd1,0x31,0x7c,0x3f, +0x8e,0x19,0xc0,0xe0,0xdb,0xa4,0x94,0x70,0x2d,0x5c,0x8d,0xcd,0x74,0x36,0x34,0xf7, +0xde,0x1a,0x95,0xe8,0x35,0x77,0x03,0xf5,0x65,0x37,0x64,0x0a,0x75,0x37,0x25,0x77, +0xaa,0xea,0xdf,0xc1,0x91,0xe7,0xd1,0x1c,0xea,0x17,0xf7,0x1a,0xc1,0xc7,0x14,0x75, +0x06,0xe8,0xd0,0x2b,0x3e,0x91,0x7e,0xb1,0xef,0xac,0xfb,0xb2,0x2d,0x7d,0x07,0xa1, +0x94,0x28,0x9c,0x08,0x3e,0x9d,0x36,0xb9,0x89,0x5e,0xd0,0x0c,0xfa,0xdf,0x98,0xeb, +0x45,0x75,0x90,0x18,0x7b,0xa6,0x9f,0xff,0xab,0x19,0xe6,0x3e,0xf9,0xd2,0xde,0x89, +0x49,0xb5,0x47,0x1c,0xd6,0xbb,0xe1,0x31,0x4b,0xf7,0xea,0x4f,0x54,0xf7,0x69,0x95, +0xaa,0x1a,0xbb,0xad,0x50,0x6b,0x57,0xbd,0x41,0xb2,0xa7,0x42,0xf7,0x19,0x26,0x7e, +0x26,0x91,0xc3,0x0c,0x6a,0x2e,0x52,0xcc,0x59,0xaf,0x14,0x1c,0xe4,0xad,0x51,0xab, +0x7f,0x12,0xa8,0xd5,0x38,0x5d,0xdd,0x10,0x5b,0x10,0x69,0xf5,0x7d,0xc6,0x3f,0xb6, +0xac,0xbc,0x07,0x49,0x83,0x52,0xef,0x17,0x08,0x1e,0x17,0x69,0x8b,0xc1,0x16,0xfc, +0x0e,0x0f,0x10,0xdc,0x9f,0x24,0xa0,0x11,0x8f,0x12,0x43,0x79,0xf5,0xd0,0xa2,0x80, +0xea,0x8b,0x3c,0x74,0xff,0x41,0xf7,0x5d,0xe7,0xc6,0x22,0x61,0x96,0xe0,0xfb,0x81, +0xe4,0x9a,0x29,0xd6,0x3b,0xe3,0xf8,0xb6,0xbf,0xcc,0x86,0x02,0x97,0xf0,0x7b,0x02, +0x27,0xc0,0x9f,0x32,0x19,0x04,0xc7,0xbf,0x2d,0xf3,0xf9,0x23,0x5d,0x3b,0xf8,0xf5, +0xb6,0x70,0x6d,0xb9,0xfe,0xac,0x95,0xbc,0x24,0x95,0xb1,0x33,0x5c,0x3a,0x48,0x38, +0xa7,0x7b,0x82,0x56,0x15,0x44,0x97,0x99,0xa7,0x12,0x30,0x0f,0xdb,0x52,0x17,0x0d, +0xa4,0xe0,0xec,0x96,0x1b,0x5e,0xbc,0xf7,0x04,0x36,0x68,0x9e,0x6f,0xa7,0xd5,0x21, +0x04,0x21,0xdf,0x5f,0x1b,0x20,0x0a,0x8b,0xe0,0x8b,0xb9,0x62,0xa9,0xc6,0xd6,0xb1, +0x05,0x8b,0xed,0x73,0x91,0x25,0xa0,0x73,0xbf,0x78,0x39,0x65,0x28,0x89,0xda,0xe2, +0x68,0x03,0x20,0x8a,0x1a,0x7e,0x3a,0x22,0xce,0x2f,0x94,0x1a,0x00,0xaa,0xd2,0xf2, +0x29,0xc6,0xb6,0x9a,0x1b,0x0c,0x1a,0x2b,0xac,0xcf,0x1a,0x2f,0xbc,0x46,0xdc,0xed, +0xbf,0xf9,0x63,0x9e,0xf2,0x2b,0x74,0xdb,0xc4,0xc5,0xf5,0x8f,0x23,0x6d,0x72,0xb3, +0x2a,0x50,0x6b,0x8e,0xf3,0x2a,0xcd,0xa2,0x6e,0xcd,0x3c,0x3d,0xdf,0x16,0x9b,0x28, +0xf1,0xe9,0x70,0x3e,0x52,0xa5,0xcb,0xd2,0xbd,0xf1,0x94,0x66,0x5f,0x7c,0xc5,0xb8, +0xa3,0x70,0xd2,0xa1,0xea,0xc1,0x85,0x04,0xd9,0x12,0x3a,0xfb,0xf6,0xe5,0x5b,0xc9, +0x64,0x71,0xe4,0xcd,0x70,0x7c,0x8e,0x2c,0x33,0xb8,0x4c,0xfc,0xce,0x11,0x13,0xd9, +0x0e,0x10,0x0c,0x9f,0x93,0x54,0x97,0x04,0x15,0x52,0x7f,0x82,0xd7,0xae,0x7e,0x0f, +0x4c,0x71,0xfa,0x64,0x70,0x35,0x0a,0xae,0xa6,0xd2,0x70,0x76,0x2a,0xf1,0x39,0x61, +0x1d,0x1c,0x2d,0xd1,0xf7,0xb3,0x02,0xbe,0xe8,0x57,0xbc,0x32,0x43,0x66,0xe5,0x07, +0x68,0x33,0x5a,0x85,0x84,0x1f,0x3d,0xa7,0x4c,0x3b,0x8d,0xa2,0xf2,0xea,0x7b,0xbb, +0x4e,0x82,0xa5,0xbf,0x5c,0xe3,0x3c,0xf3,0xc3,0x5e,0xdd,0x04,0x4a,0xb1,0xa4,0x52, +0x94,0x8f,0xf3,0x42,0x30,0x8d,0x98,0x7d,0x67,0xb4,0x18,0x78,0x77,0x94,0xac,0x42, +0x95,0x60,0xe4,0x52,0x31,0x62,0x90,0x60,0x63,0xdd,0xfc,0xd2,0xf5,0xfd,0x69,0xa5, +0x95,0xa5,0x1a,0x00,0x60,0xbe,0xaa,0xe2,0xc2,0x0b,0x2a,0xe6,0xd2,0x0d,0xff,0xf7, +0xcc,0x67,0xd5,0x29,0x4a,0xdb,0xf9,0x0e,0xef,0x96,0x4b,0x95,0x00,0xf1,0x7c,0x05, +0x44,0x79,0xc4,0xce,0x3f,0xf9,0x48,0x9f,0x85,0x39,0xf0,0xc7,0x95,0xc8,0xd3,0xe8, +0x1b,0xc6,0x38,0xd9,0xf7,0xe9,0x2a,0x3e,0x63,0x8e,0x41,0x3c,0x97,0x06,0xe7,0x0f, +0xdd,0xeb,0x9d,0x7c,0xd0,0x17,0x9b,0x38,0xf8,0xd0,0xcf,0x2b,0xfa,0xdc,0x29,0xae, +0x2d,0xa5,0xe7,0x82,0xbb,0xf9,0x61,0x59,0xe1,0x99,0x85,0x5d,0x51,0x06,0x99,0x37, +0xd1,0xdd,0x05,0x8e,0x58,0x47,0x2f,0x46,0xcb,0x5b,0xfe,0xd9,0xdf,0x90,0x14,0xba, +0x3f,0xdf,0xf4,0xdb,0x1c,0x0c,0xbe,0x7e,0x56,0x22,0x7a,0x39,0xff,0xdd,0x3e,0xe3, +0x0b,0x61,0xe3,0xeb,0x57,0x2e,0xf7,0x7a,0xdd,0x9f,0x14,0xa8,0x20,0xf6,0x22,0xaf, +0x52,0x16,0xb6,0xe6,0xb9,0xfd,0x48,0xf2,0xe9,0x64,0x53,0x3f,0x5c,0xbe,0x3e,0xc9, +0x23,0x40,0xba,0x80,0x31,0xe3,0xc4,0x53,0x6e,0x2c,0x47,0x57,0x66,0xb6,0x2b,0x0e, +0x37,0xf5,0x64,0x86,0x19,0x2b,0x1c,0x30,0x22,0xbe,0x9e,0x91,0x32,0x21,0x1d,0x09, +0x86,0xb9,0xbf,0xb0,0xb1,0x80,0x73,0x29,0xc1,0x02,0xef,0x99,0xd9,0xb8,0xdc,0x95, +0xa0,0x03,0x09,0x54,0x81,0x8e,0x67,0x89,0x2a,0xf0,0x8f,0x98,0x3a,0x10,0x97,0x3e, +0x68,0x57,0xd5,0xc0,0x3e,0x14,0x48,0x75,0xb5,0x21,0x22,0x02,0xdd,0xe2,0x88,0x30, +0x3b,0x08,0x58,0xa4,0x1b,0x2a,0x0d,0xe3,0x33,0xe8,0xdc,0x76,0x15,0xf8,0x3f,0xfd, +0x8b,0xdc,0xc7,0xe0,0x9a,0x02,0x69,0x9e,0x4d,0xeb,0xd5,0xa5,0xf6,0xed,0x53,0x50, +0xa0,0x47,0x7e,0xf8,0x67,0x74,0xcc,0x01,0x43,0x58,0x87,0x97,0x9b,0xe2,0x7c,0xa0, +0xa4,0x05,0x57,0x9f,0x5b,0x87,0x2c,0x8d,0xaa,0x58,0xa8,0x9d,0x6e,0xc7,0xf7,0xf4, +0x09,0xdc,0x8a,0xef,0x6b,0x01,0x1b,0xba,0x69,0xbf,0xd2,0xa4,0xb0,0x03,0x7d,0xa0, +0x61,0x80,0xd4,0x7e,0xae,0xac,0x13,0x69,0xcc,0x62,0x42,0xa9,0xf9,0x21,0xda,0x26, +0xb7,0xb4,0x8a,0x0c,0xb7,0x86,0x0d,0x5b,0xe6,0x6b,0xd9,0xc2,0x30,0x88,0x5e,0x58, +0x0c,0x05,0x02,0xad,0x01,0x6d,0x6c,0xc0,0x2b,0x48,0xc0,0x7d,0xa1,0xb1,0x42,0x44, +0x0d,0x04,0xf4,0x90,0x96,0x4f,0x64,0xd1,0x95,0x90,0x83,0xca,0xfe,0xe4,0x43,0xcd, +0xab,0xac,0xf9,0xbe,0xfe,0xd1,0x32,0x29,0xb3,0x20,0x3f,0xf6,0xdb,0x5c,0x53,0x99, +0xc7,0xa2,0xb5,0x68,0x72,0xb5,0x41,0x7b,0x78,0xe2,0xdf,0x1d,0xcf,0xe4,0xa3,0xbc, +0x5b,0xb0,0x3a,0x01,0xdb,0x13,0x6b,0xd3,0x0e,0x3c,0xaf,0x20,0x51,0xb3,0x0d,0x14, +0x7d,0x37,0x5c,0xe7,0x45,0xe4,0x1d,0xc3,0x5f,0xa0,0x5c,0xd4,0x56,0x7b,0xc5,0xe1, +0x2c,0xa9,0xbb,0xb9,0xbe,0x9d,0x72,0xe1,0xe4,0x7a,0xab,0x10,0xd1,0x70,0xae,0xac, +0x7d,0x10,0x9a,0x7d,0xbd,0xef,0x63,0x08,0x14,0x57,0x18,0x31,0xd0,0x19,0x1e,0xa0, +0x4a,0xa7,0x40,0x64,0x74,0xe4,0x02,0x73,0x40,0xf9,0xa2,0x02,0x41,0xd3,0x1a,0x68, +0xc8,0x71,0x95,0xee,0x96,0x83,0x54,0x5c,0x65,0x5c,0xd4,0xe4,0xf4,0x07,0x3b,0xc7, +0xc1,0x33,0xfb,0xf1,0x49,0x5a,0xc2,0x65,0xc3,0x57,0x6d,0x22,0x30,0x26,0x75,0x2e, +0x2c,0xba,0x35,0x5d,0x16,0xb1,0x5d,0x75,0xc2,0xf5,0xe7,0x13,0xd1,0x05,0x5f,0xa6, +0x8d,0x13,0x36,0xfb,0x36,0xe4,0x86,0xb9,0x46,0xf5,0xa8,0x01,0x00,0xd7,0xf1,0x70, +0xaf,0x54,0x22,0xef,0x4d,0xcf,0x24,0x08,0x96,0x1b,0x98,0x19,0x1a,0xa6,0x82,0x61, +0x62,0x57,0x43,0x47,0x0b,0xc5,0x5d,0x99,0x17,0xa5,0x40,0xd7,0x78,0x2b,0xe3,0x06, +0xa8,0x8b,0xf1,0xa1,0x50,0x8a,0x07,0x0c,0xef,0x52,0x89,0x10,0x12,0x08,0x10,0x57, +0x49,0x18,0xc6,0x2a,0x09,0x49,0x5e,0xc8,0x6c,0x55,0x13,0x04,0x90,0x31,0x06,0xdc, +0x02,0x9d,0x8e,0x7c,0x21,0x7d,0x0c,0x1e,0x7b,0xf0,0x53,0x9c,0x7f,0xf0,0x3e,0xb8, +0xc8,0x08,0x7f,0xc5,0x98,0xd3,0x4f,0x29,0xa6,0xf3,0xc1,0xd9,0x5d,0xd3,0x43,0x27, +0xad,0x16,0x27,0x55,0x3c,0x0d,0x09,0x1f,0xd8,0x19,0x27,0x15,0x11,0x32,0x7b,0x02, +0x02,0x70,0xea,0x36,0xeb,0x5f,0x87,0x23,0xcb,0xe0,0x1c,0xb9,0x57,0xa2,0xf9,0x2d, +0x3b,0x3d,0x68,0x76,0x04,0x0c,0x6f,0x13,0xd1,0xe0,0x86,0x9b,0x9f,0x6b,0x45,0x1c, +0xea,0x57,0x9b,0xb7,0x6b,0x7d,0xcc,0x02,0x9a,0xe3,0x71,0x47,0xdb,0x8e,0x94,0x48, +0xf6,0x83,0x7b,0x77,0xc5,0xcd,0x48,0x12,0x52,0x81,0xc7,0x8a,0x3c,0xb0,0x32,0xa4, +0x16,0x29,0xf8,0x57,0x7d,0x65,0x21,0x12,0xc6,0xd2,0x70,0x80,0x44,0xa9,0x84,0x21, +0x6d,0x23,0x9e,0xfc,0xb6,0x22,0xc6,0xf7,0xb4,0x38,0xbd,0x04,0x64,0x22,0x37,0xa5, +0x8f,0x58,0xe5,0xba,0x92,0xa0,0x79,0xbf,0x33,0x83,0xe7,0x53,0x71,0xe2,0xb9,0x20, +0xad,0xc5,0xed,0xd7,0x76,0xa8,0xbd,0x88,0x2e,0xb6,0x01,0xff,0x70,0xe3,0xe2,0x17, +0x86,0x3c,0xc0,0x0f,0x1f,0xe8,0x2a,0x7a,0xa5,0xa2,0xd0,0x2e,0xb7,0x3b,0x32,0x1d, +0x55,0xcb,0x66,0x5f,0x0d,0x09,0x96,0xa1,0x4e,0x6b,0x84,0xee,0xa6,0x72,0xf1,0xf2, +0xc0,0xc8,0xaf,0x07,0x9a,0xa3,0x71,0xd0,0x25,0x29,0xbf,0xf3,0x94,0x89,0xac,0x98, +0x59,0x3a,0x7f,0x6c,0xe5,0xee,0x05,0xfe,0xad,0x14,0xbb,0x0e,0x7c,0x14,0x7a,0x6a, +0x0d,0xcc,0xbb,0xfd,0xb9,0x07,0xc2,0x1d,0x40,0x13,0xb6,0x86,0xb4,0xa1,0x10,0xba, +0x03,0x20,0x12,0xaf,0x7b,0x6b,0x04,0xcb,0xba,0x5e,0xfc,0x00,0x81,0xa2,0x7f,0x5b, +0x67,0x3d,0xbf,0xd9,0xad,0xf9,0x4d,0x53,0xc0,0x7f,0x08,0xa8,0x00,0xe6,0x38,0xa9, +0xae,0x1d,0x34,0xc9,0xbd,0x9d,0x05,0xcb,0x40,0x62,0xdb,0x6f,0x3e,0xf4,0x1a,0xbf, +0x80,0x7d,0x47,0x75,0x4c,0xf2,0xec,0x62,0x22,0x7d,0xee,0x59,0x1e,0xa3,0x7c,0x17, +0xce,0x92,0xb4,0x0a,0xdc,0xdb,0x02,0x06,0xe8,0x27,0xe4,0xb2,0x5c,0x71,0xe1,0x70, +0xd8,0x3f,0xbd,0xd7,0x5d,0x71,0x7f,0x93,0x13,0x2d,0xcb,0x0b,0x1d,0x31,0x13,0xaf, +0x51,0x22,0xef,0x6c,0x5c,0x50,0x35,0xb7,0xec,0xc3,0x83,0x02,0xd6,0xb3,0x71,0xa0, +0x47,0xb4,0xbd,0xe9,0x55,0x94,0xcc,0xf2,0xc1,0x96,0x18,0x74,0x66,0xfc,0x52,0x6b, +0x4f,0x98,0x14,0xf6,0x29,0x7f,0x79,0xcd,0x59,0x00,0x1e,0x02,0x7f,0xb4,0x3d,0xc7, +0x8f,0x16,0x1d,0xcf,0xd5,0x27,0x6d,0xca,0xe0,0xb7,0x73,0x95,0x51,0xed,0x92,0xa0, +0xd5,0xd5,0xb4,0x2f,0x12,0x68,0xac,0x77,0x94,0x47,0xed,0x62,0xb3,0xf6,0x7f,0x8e, +0xf9,0xdd,0x0a,0x15,0x3f,0x3a,0xf6,0xca,0x53,0x7b,0xaa,0xbe,0x7a,0xf1,0x47,0x70, +0xc6,0xda,0x7f,0x6d,0x4f,0xd5,0x3f,0xab,0x43,0x74,0xed,0x42,0x7d,0x54,0x99,0x0e, +0x79,0xf8,0x67,0xef,0x83,0x19,0xe6,0x58,0x9e,0xf2,0x6a,0x1e,0xca,0x55,0x8c,0x3a, +0x4c,0x34,0x91,0x32,0x63,0x14,0x75,0x8b,0xe5,0x24,0x6a,0x8e,0xbe,0x54,0x7e,0xdf, +0xc5,0xed,0xb8,0x2c,0x76,0x39,0x56,0x6e,0xe1,0x71,0xb5,0xeb,0x5e,0x7e,0x50,0x67, +0x47,0x90,0xce,0xb8,0xcc,0xd3,0x2a,0x7e,0x4e,0xdc,0xc0,0xb3,0x5c,0x15,0xd3,0xa9, +0x45,0x0f,0xf5,0xde,0x45,0xa5,0x21,0x78,0xc8,0x73,0x6c,0x6b,0x9f,0x0f,0x90,0xa8, +0xd9,0xdd,0x88,0x9f,0xef,0xa4,0x77,0xef,0xe9,0xd6,0xa6,0xe4,0x5a,0x20,0x01,0x66, +0xff,0xdd,0xe2,0x04,0xb7,0x8b,0xaa,0xa5,0x4e,0xca,0x7c,0x5b,0x9a,0x3a,0x32,0x8f, +0xfe,0x8c,0xd0,0x9c,0xb9,0x0c,0xa7,0xbf,0x22,0x45,0xf9,0x74,0x01,0x7a,0x51,0x76, +0xcc,0x6e,0xdd,0x99,0x79,0x09,0xc6,0xda,0x7f,0x2c,0xcb,0x27,0x63,0xbb,0xea,0xef, +0x87,0xe0,0x49,0xa0,0xae,0x38,0x60,0x4f,0xa0,0x47,0xe8,0x4f,0x76,0x73,0x22,0x51, +0x03,0x34,0x00,0xf1,0x70,0xb9,0xf3,0x48,0x9a,0xa5,0x8a,0x4a,0xf1,0x01,0xd8,0x22, +0x30,0x52,0xce,0x6d,0xfa,0x94,0x78,0x8e,0xb8,0xda,0xa0,0x53,0x30,0x30,0x18,0xd7, +0xe5,0x66,0xb9,0x62,0x6b,0x29,0x72,0x55,0x23,0xbd,0x8b,0xb4,0x71,0x03,0xb1,0x75, +0x06,0x85,0x91,0x51,0xdb,0xb6,0xec,0x58,0x77,0x56,0xa1,0x52,0x3a,0x36,0x8d,0xcf, +0xd6,0xd5,0x64,0x7a,0x95,0x4a,0x73,0xe8,0x10,0xf5,0xad,0xca,0x33,0x43,0x10,0x1a, +0x9b,0x01,0xd0,0x1e,0xaa,0xf0,0xda,0x8d,0x0d,0x41,0x25,0xaf,0x35,0xe2,0x19,0x0b, +0x3b,0x97,0xfc,0x4a,0x65,0x9c,0xec,0x6e,0x29,0xbc,0x71,0x2f,0x9d,0x04,0x89,0x47, +0x78,0xd7,0xea,0xdd,0x95,0x80,0x9f,0x19,0xdf,0xd2,0xbb,0xd7,0xac,0x7d,0xea,0xdd, +0x8f,0xce,0xe2,0xfa,0x1c,0xcf,0x67,0x5d,0xfa,0x8d,0xaa,0x4b,0xb3,0x1d,0x4a,0x78, +0x49,0x4d,0x95,0x5c,0x68,0x21,0x72,0x1a,0xb6,0x41,0xa2,0x5b,0xb2,0x1c,0xeb,0xd1, +0x8c,0x17,0xb3,0xc9,0xf4,0x81,0x93,0xe9,0xcf,0x93,0xab,0x4a,0x33,0x3f,0x77,0xc6, +0x09,0x0b,0x0b,0xb9,0xba,0xf4,0x63,0xfb,0x4b,0xae,0xa3,0x7f,0xdd,0xe2,0xfc,0x82, +0x00,0x52,0x82,0x00,0x5e,0x70,0xac,0x5b,0xed,0xad,0x5d,0x4b,0x91,0xf6,0xb4,0xa1, +0x45,0x5e,0x94,0x8d,0xbe,0x97,0xe7,0x8b,0x0d,0xca,0x79,0xda,0x10,0x75,0xd3,0x5a, +0x93,0xde,0xcd,0x04,0x59,0x19,0x72,0x5e,0x15,0xc4,0x95,0x4b,0x7d,0x8f,0xb5,0x56, +0x63,0x33,0x1f,0xd5,0xf9,0x71,0x1d,0x76,0x1c,0xe5,0xe4,0xcb,0x90,0x77,0x1c,0xc4, +0xd3,0xcd,0x9b,0xd1,0x34,0xff,0x54,0xa0,0x3f,0xd9,0x95,0x92,0xb0,0x74,0x97,0xd2, +0x5c,0xb4,0xd4,0x2c,0xef,0x8e,0xf0,0x83,0x1b,0x4e,0x64,0x0e,0x63,0x38,0x5d,0xc5, +0x0b,0xe0,0xed,0x39,0x5e,0xcd,0x2b,0xd9,0x09,0xe7,0xdd,0xd1,0xc1,0x1a,0x12,0xc4, +0xa5,0x6c,0x86,0x3d,0x21,0xfa,0x38,0x67,0x0a,0xc6,0xa2,0x71,0x9d,0x9b,0x0e,0x09, +0xc9,0x57,0x50,0xf2,0xb8,0x58,0x4c,0xaa,0xdb,0x81,0xf7,0x6c,0x6c,0x63,0x06,0x98, +0x2a,0xf9,0xd2,0x7c,0x3d,0x77,0x6b,0xde,0x11,0x16,0xa1,0x5a,0x12,0x52,0x57,0x19, +0xf8,0x58,0xbd,0x7e,0x93,0x97,0x76,0xe9,0xfc,0x41,0xe6,0xd7,0x5f,0x6a,0x56,0x0f, +0xce,0x9b,0xc8,0xbd,0xe3,0x7b,0x5e,0xdf,0x9b,0x5f,0x1e,0xce,0xd2,0x70,0xfe,0xb7, +0x0b,0x5c,0x3f,0xc4,0xdf,0x43,0x17,0x7e,0x6b,0x1c,0xde,0xf9,0x58,0xfe,0x91,0xb8, +0xd3,0xd7,0x18,0x7e,0xce,0x31,0x0c,0x9a,0x9c,0x38,0x1a,0x8f,0x6c,0x11,0x7b,0x56, +0xdd,0xb8,0x07,0xb0,0x3f,0x7c,0x6b,0x10,0xec,0xbd,0x11,0x2b,0xb4,0x7a,0x7c,0x08, +0xad,0xb4,0xf7,0xa2,0x3a,0x32,0x67,0x16,0x7e,0x82,0x1b,0x02,0x74,0xc2,0x8f,0x79, +0xd9,0x9b,0xfc,0x90,0x36,0x22,0x0e,0xc3,0xcb,0x66,0xb8,0xa2,0x67,0xe6,0x60,0x96, +0xf0,0xce,0x84,0x0f,0xfc,0x8a,0xee,0x4c,0xc5,0xa1,0xe1,0x9c,0x88,0xae,0x52,0x87, +0xea,0x32,0xa7,0x27,0xda,0xe2,0xa3,0x63,0x8c,0x80,0x09,0xd8,0xc4,0xaf,0x28,0x6c, +0x22,0x80,0x45,0x84,0xf1,0xab,0x03,0xc0,0xee,0x6e,0xb8,0x48,0x72,0x48,0x76,0x20, +0xf1,0xe1,0x47,0xbb,0x45,0x11,0x48,0x9c,0xea,0xc9,0x90,0xd1,0x31,0xeb,0xec,0x2c, +0x66,0xd0,0xf0,0xbe,0x85,0x68,0x42,0x99,0xf4,0xcb,0x4c,0x94,0xd2,0x67,0x59,0x33, +0xcd,0x8d,0x74,0xab,0x7a,0xdd,0x8c,0x2d,0x33,0x9a,0x45,0x85,0x7a,0xe9,0x71,0x57, +0x2e,0x71,0x97,0xe6,0x87,0x6a,0x41,0x8c,0x44,0xca,0xa0,0xe5,0x30,0xf7,0x60,0x06, +0x0a,0x80,0xa4,0x8a,0x72,0x75,0x6e,0xca,0x48,0x86,0xee,0xb2,0xdc,0xd9,0xfc,0xc1, +0x8d,0x88,0xf6,0x9a,0x73,0x51,0xfa,0x8f,0x72,0xd2,0x5d,0xc1,0xac,0x3f,0x23,0xcb, +0xc4,0xc8,0x83,0x0a,0x7d,0x05,0x74,0x8b,0x96,0x93,0x73,0x9a,0xcd,0x86,0x72,0x4d, +0xee,0xcb,0x6b,0xaa,0x50,0xa1,0x4a,0x5d,0x3e,0xdb,0x40,0x78,0x3c,0x4d,0x02,0x48, +0x36,0x81,0x9c,0xfa,0x18,0x55,0x89,0xee,0x4c,0x70,0x08,0xea,0x63,0x54,0x0a,0x58, +0x63,0x80,0xf2,0xb6,0x8d,0x60,0x96,0x09,0x73,0x4b,0xb4,0xa3,0xd0,0xf6,0x98,0x6c, +0x2f,0x71,0xb8,0xb3,0x72,0x55,0xd0,0x47,0x12,0xbf,0xa3,0xff,0xd2,0xac,0x10,0x7c, +0x2e,0x76,0x12,0x57,0x7a,0xd0,0x84,0x08,0xfb,0x49,0x9d,0x09,0x1d,0xcf,0x8c,0xae, +0x00,0x91,0x90,0xf0,0xdd,0xc8,0x20,0xe5,0x85,0x76,0xb2,0x4e,0xb2,0x3b,0x7c,0x07, +0x21,0xb4,0x61,0xf4,0x16,0x81,0x3c,0x48,0xe8,0x2c,0xd8,0xd0,0xbf,0xab,0x67,0x87, +0x0c,0xd3,0xfd,0x9a,0x36,0x6e,0xa3,0x58,0x05,0x54,0x35,0x83,0x79,0xe9,0xbd,0x7b, +0x27,0xde,0x01,0xec,0x7f,0x8b,0x5a,0xc9,0x84,0xd7,0xe7,0xb5,0xf3,0x10,0xab,0xdd, +0x1e,0x40,0xda,0xeb,0xc2,0xe5,0xdd,0x8c,0x48,0x72,0x13,0x16,0xf6,0xeb,0xfe,0xac, +0xa6,0x98,0x47,0x73,0xe2,0xab,0xed,0xcd,0x5b,0x58,0x14,0x6e,0xf0,0x77,0x74,0xd8, +0xca,0x02,0xbc,0xd2,0x3b,0xd5,0x4d,0x08,0x55,0x03,0xee,0x6d,0xf7,0xb6,0xd2,0x91, +0x06,0xd5,0x90,0x2c,0x66,0x6a,0x06,0x08,0xe1,0xd5,0x26,0xd4,0x88,0xfe,0xdd,0x82, +0x89,0x67,0x9d,0x1d,0x2d,0xb0,0x4f,0xd4,0x0d,0xdc,0x72,0x6e,0x3a,0xba,0x48,0xd2, +0x2c,0xd9,0x78,0xd6,0xb0,0x4f,0x67,0x11,0xc8,0x7f,0xe7,0x10,0xd8,0x58,0x8b,0x18, +0xb5,0x47,0x27,0x8d,0x91,0xf8,0x56,0x6b,0xb0,0xb6,0x61,0xab,0xff,0xd8,0x1b,0x83, +0x9e,0x7d,0x50,0xe5,0x6b,0x64,0xa9,0x5d,0xff,0x96,0x2d,0x59,0x58,0x97,0xb0,0xd1, +0xcf,0xa3,0xcd,0x4a,0x50,0x13,0xfe,0x98,0x51,0xd8,0xc8,0x3a,0x16,0xf1,0x06,0xb8, +0xd8,0xdf,0xd6,0x20,0x39,0xf6,0x26,0xe5,0xb6,0x20,0x07,0x8c,0x84,0xbd,0x1e,0x09, +0x0f,0x61,0x8f,0xad,0x41,0xb0,0x8e,0x00,0x5d,0x9c,0x0a,0x9c,0xb5,0x9d,0x2f,0x80, +0x73,0xae,0xf7,0x5d,0x51,0x74,0x50,0xa1,0x1a,0x43,0x25,0xe0,0xff,0xff,0x3a,0xf3, +0x34,0x06,0x2c,0x97,0x60,0x2a,0x94,0xd1,0x38,0xc0,0x68,0xcc,0x6a,0x2d,0xcc,0x95, +0x0f,0x8b,0x77,0x16,0x15,0xd4,0xd8,0xb4,0xd4,0xb4,0xd0,0x30,0xd1,0x21,0x21,0x58, +0x21,0xdd,0x03,0xed,0xaa,0x6f,0xd1,0xb5,0xee,0x2e,0x6e,0x62,0x1a,0xf3,0xce,0xb1, +0x20,0xc3,0x9a,0xfd,0xe7,0xde,0x8b,0x43,0x4c,0x01,0x2e,0x0d,0xe2,0x50,0x1e,0x6c, +0x06,0x00,0x9a,0x48,0x9c,0x3f,0x02,0xd6,0xa9,0x20,0x57,0xe6,0xae,0x6d,0x00,0x5c, +0x05,0x87,0x72,0xab,0x9c,0xa3,0x9a,0xdc,0x0b,0x15,0x18,0xe4,0x50,0x06,0xc8,0xc5, +0x8c,0xbb,0x63,0xb3,0xa1,0x4d,0x6f,0x59,0x61,0x04,0xe9,0x9a,0x62,0x35,0xd4,0x11, +0xcb,0xac,0xcd,0x95,0x83,0x3c,0xc9,0x6e,0xe9,0xca,0xbf,0x17,0x51,0x82,0x25,0x25, +0xd4,0x99,0x7a,0x76,0x97,0x8e,0x54,0x31,0x4b,0x08,0x2d,0xca,0x6b,0x40,0x2d,0x20, +0x0f,0x73,0x86,0x7a,0xe6,0x2d,0xa2,0xc7,0x7a,0x61,0x89,0x7c,0x5d,0x6d,0x23,0x19, +0x54,0x7b,0x90,0x4d,0xdc,0x31,0x07,0x18,0xfb,0x79,0x2b,0xd2,0x57,0xcc,0x84,0x9b, +0x67,0x20,0x0b,0x22,0xe9,0x30,0xa3,0xbd,0xcf,0x17,0x1b,0x02,0xa9,0x70,0xd3,0x4d, +0x8a,0x7f,0x90,0x2a,0x67,0x25,0xaf,0x86,0xf7,0xed,0xca,0x8e,0xf6,0x91,0x4f,0x2b, +0x33,0x06,0x12,0x2a,0xe4,0x43,0xa1,0xfc,0x45,0xc5,0xe4,0xc9,0xd6,0xcb,0x83,0xcc, +0x73,0x04,0x43,0x4f,0xbb,0x35,0x6b,0x96,0x7f,0x2d,0xab,0x9c,0xb4,0x4e,0x4d,0xa8, +0xbf,0x8f,0xa9,0x5c,0x98,0xed,0x61,0x9b,0x67,0x40,0x09,0xbd,0xf3,0x69,0x3e,0x73, +0x34,0xcb,0x33,0xbc,0x36,0x8b,0x76,0xa1,0x61,0xe9,0x2c,0x5b,0x99,0xe1,0x2c,0x69, +0xde,0x53,0x1e,0xd3,0xf3,0xb1,0x45,0xf1,0xc4,0xce,0xc2,0x9d,0x79,0x75,0xf7,0x7c, +0xbe,0x69,0x19,0x9a,0xdc,0x9f,0x4c,0x08,0x45,0xed,0x79,0x3a,0xf1,0xd2,0x52,0x70, +0xd6,0xd4,0xc5,0x9c,0x58,0xd2,0x7a,0x76,0x23,0x73,0x9e,0xc6,0x81,0x8a,0xc7,0x07, +0x24,0x76,0x32,0x24,0x93,0xcd,0x42,0x55,0x89,0x10,0x8a,0x51,0x7a,0xd9,0x0e,0xbd, +0x20,0x75,0x5e,0x2b,0x52,0x75,0x66,0x77,0x08,0xd6,0x94,0x50,0x10,0x7c,0xfe,0x81, +0xb2,0x54,0xdd,0xd8,0xb4,0xb4,0x6f,0x59,0x09,0x32,0x03,0xa2,0x38,0x55,0x13,0xfd, +0xef,0x55,0xd5,0xc0,0x4e,0xbe,0x5d,0x02,0x89,0x82,0xcb,0x40,0x18,0x33,0xd9,0x07, +0x17,0x1c,0x2a,0x1e,0x78,0x32,0x1e,0x75,0x5b,0xdb,0xce,0xbc,0x93,0x49,0x52,0x64, +0xc3,0xe2,0x0f,0xdb,0xfb,0x3d,0x9f,0xa8,0x79,0x16,0x61,0x7b,0x7f,0x1b,0x58,0x76, +0xae,0xa1,0x07,0xcc,0x68,0x97,0x4d,0xa8,0x4f,0xf7,0xb7,0xa8,0x93,0x4b,0xdf,0x74, +0x29,0xa0,0x87,0x99,0xb0,0xaf,0xa0,0x2a,0xd5,0x51,0x24,0xfd,0xe9,0xd6,0x82,0xb3, +0x2b,0x0c,0x44,0xac,0x3e,0x38,0x04,0x00,0x2a,0x80,0xec,0x5c,0x86,0xd3,0x4a,0x3a, +0xab,0xbd,0x31,0x1b,0xf9,0x1d,0x9a,0x32,0xd8,0xd7,0x0f,0x78,0x39,0x77,0x27,0x7e, +0x89,0x95,0x57,0x25,0xd1,0xf3,0xe7,0x9e,0xe4,0x82,0x73,0x8f,0x05,0x6b,0x75,0x5b, +0x45,0x14,0x87,0xd4,0x39,0xd8,0xd8,0x06,0x02,0xbc,0xa0,0x58,0x31,0x72,0x18,0x72, +0x0c,0x89,0x36,0x79,0xb3,0xa4,0x87,0x17,0xa5,0x5f,0xbc,0x59,0xf3,0xfb,0x0e,0x2a, +0x1d,0xc3,0xda,0x13,0x51,0x2c,0x7c,0xef,0x44,0xfa,0x2d,0xf1,0x8b,0xe9,0xf6,0x10, +0xb8,0x92,0xa2,0xef,0xf6,0xef,0x4e,0xdd,0x49,0x80,0xe2,0x41,0x2b,0x4f,0xeb,0xbf, +0xb6,0x02,0x51,0x1f,0xf6,0x5c,0x60,0x83,0x60,0x4a,0xbf,0xc6,0xe5,0xc3,0x40,0x7b, +0x00,0xe6,0xb9,0xf3,0xb3,0x5d,0xf5,0xcd,0x46,0xe4,0x47,0x06,0x50,0x66,0xa8,0xc2, +0x3a,0x8f,0x38,0x34,0xe8,0x2c,0xc1,0x02,0x07,0xce,0xc0,0x8c,0xbe,0x06,0x5e,0x83, +0x9a,0xea,0xf9,0xc7,0x14,0x01,0xf0,0x0c,0xe5,0xa6,0xfc,0x9c,0xf8,0x40,0x6f,0xa2, +0xb3,0x27,0x69,0x37,0xdb,0x5a,0x47,0x01,0x78,0x9c,0xef,0x15,0x28,0x6a,0x1c,0x27, +0xab,0x9a,0x5a,0xe6,0x6e,0xe5,0x36,0x4a,0x6b,0x65,0x92,0x36,0xb5,0x99,0x39,0xfc, +0x3e,0xa1,0xf5,0x7b,0xc1,0x68,0x32,0x57,0x4b,0x0b,0xab,0x3c,0x51,0x42,0xdb,0xe3, +0xb6,0x27,0xdc,0x30,0xa0,0xe8,0xb2,0xec,0x0e,0xaa,0x2c,0xcf,0x9c,0x45,0xd3,0xeb, +0x85,0x84,0xf2,0xa6,0x38,0x14,0xef,0xc5,0x13,0xa5,0xaa,0xc0,0xee,0x58,0x42,0xd3, +0xe7,0x9d,0xf8,0x5a,0x3f,0xec,0x34,0x82,0x69,0x41,0x26,0x90,0x3d,0x36,0x28,0x37, +0x0c,0x2d,0x50,0xa1,0x90,0x2b,0xa3,0x7a,0x70,0x6f,0x82,0x59,0xa6,0xe2,0x3b,0x46, +0x03,0xcc,0xc3,0x0e,0xad,0x25,0x89,0x63,0x59,0x51,0x33,0xea,0xf0,0x73,0x35,0x77, +0xcb,0x8b,0xef,0x9f,0xd9,0xa9,0x41,0x88,0xa1,0x72,0xfd,0xca,0x5f,0xf1,0xdb,0x86, +0x5f,0xbb,0xfd,0xb6,0x91,0x4f,0xb6,0x4a,0x04,0x9d,0xa1,0x46,0x34,0x5f,0xec,0x6b, +0x08,0x65,0x2c,0x94,0x31,0x44,0xa9,0x5a,0x03,0x2c,0x7c,0x33,0x80,0xf9,0x12,0x8b, +0x58,0xe3,0x09,0x14,0x88,0xb8,0xca,0xa1,0xe0,0x27,0x24,0xe6,0xa9,0x9c,0xbf,0xa8, +0xbd,0x66,0x38,0x7f,0xd5,0x4e,0xc5,0xcd,0x6a,0x75,0x3c,0x33,0xb7,0xaa,0x1c,0x32, +0x00,0x35,0xa3,0xa4,0x4b,0xbd,0x62,0x80,0x06,0x9f,0x8f,0x95,0x18,0x5f,0x52,0xfe, +0x84,0x1e,0x36,0xa0,0xc8,0xdb,0x2a,0x22,0x3b,0x2a,0xc4,0x09,0x9e,0xfa,0xe4,0x47, +0xa8,0x41,0x65,0xc5,0xb4,0xad,0x0c,0x9c,0x01,0x7b,0x8d,0xfa,0x16,0x57,0xa8,0xe2, +0xb3,0x38,0x8f,0xd6,0xb4,0xc7,0x43,0x46,0x8f,0xda,0x29,0x09,0x94,0xbf,0x35,0x0e, +0x57,0xf1,0x5e,0x06,0x99,0x47,0xa3,0xea,0x28,0xc3,0xbe,0xbf,0x17,0xa9,0xd0,0xf8, +0xec,0x13,0x2e,0x9c,0x39,0x4c,0xbe,0x85,0x51,0xc2,0xaf,0x5e,0x69,0xbb,0x80,0xbe, +0x2e,0x9e,0x4b,0x1c,0x80,0xb2,0xa3,0xcd,0x13,0xde,0xb3,0xad,0xef,0x57,0xa8,0x68, +0xd5,0x90,0x3a,0x77,0x91,0x46,0xeb,0xc4,0x4a,0x66,0xfd,0xd3,0xfc,0x5b,0xc6,0xb8, +0x4c,0x5b,0x86,0x79,0x6c,0xb1,0x64,0x0f,0xdd,0x21,0x36,0x6b,0x50,0x61,0x16,0x2a, +0xb1,0x3c,0x15,0x21,0x1b,0x16,0xa8,0x48,0x7b,0xb1,0xf8,0x4b,0xff,0x11,0x19,0xcc, +0x47,0xef,0x78,0xaf,0xfe,0x33,0x8d,0xfa,0x80,0x73,0x8f,0xc8,0x07,0xf1,0xee,0x28, +0x2b,0x12,0x3e,0x37,0xd4,0x7c,0x58,0xfd,0x3f,0xbb,0xc8,0x4b,0x03,0xdc,0xc0,0xf9, +0x2d,0xfd,0x80,0x81,0x1c,0xa8,0x06,0x95,0xbf,0x1d,0x06,0xc4,0x56,0x80,0x55,0x11, +0xb8,0x6d,0xcc,0x95,0x19,0x21,0xd3,0xb4,0x4f,0x89,0x46,0xb5,0x5b,0x82,0x13,0x05, +0x6b,0x31,0x55,0xa0,0xbe,0x01,0xd1,0xa4,0xbf,0xc9,0x45,0x84,0xde,0x89,0x6f,0xb0, +0x80,0x43,0x4d,0x10,0xda,0x4b,0x21,0xdf,0x6d,0x4e,0x47,0xb4,0xd9,0x00,0x04,0xc1, +0x08,0x26,0x94,0x46,0x08,0xf9,0xd6,0xc0,0x60,0x44,0x10,0xe0,0xe7,0x7f,0x48,0xf1, +0x03,0xaf,0x73,0x24,0xaf,0x2c,0x16,0xa1,0x08,0x85,0x23,0xb6,0xf2,0x7a,0x05,0xc0, +0x88,0x26,0xdb,0xeb,0xb3,0x96,0xc5,0xc4,0xe4,0xec,0x01,0x03,0x2d,0xeb,0xc5,0xf4, +0xab,0x25,0xc8,0x2b,0xf2,0x50,0x59,0xf4,0xcd,0xef,0x19,0xf5,0xd6,0xfa,0x26,0xd7, +0x85,0x35,0x56,0x28,0x12,0x08,0x04,0x99,0xa3,0x2b,0xc6,0xa9,0x37,0x83,0x5f,0x31, +0xe2,0x1a,0x5e,0x1c,0x51,0x43,0xca,0xc8,0x4c,0x0b,0x4e,0x39,0x73,0x0a,0x65,0xa0, +0x77,0xa7,0x45,0x18,0x92,0x48,0x2d,0x99,0xfe,0xe5,0x47,0x88,0xb6,0x81,0x35,0xb0, +0x8f,0x89,0x5f,0x3c,0x93,0x09,0xdf,0x6d,0x68,0x94,0x4f,0x98,0xf7,0x48,0x96,0xf9, +0x42,0x0c,0xda,0x49,0xec,0x79,0x1c,0xbc,0x27,0xa7,0xfa,0x0e,0xa3,0x60,0x9e,0xd9, +0x64,0x6f,0x4e,0xa1,0xe4,0x6c,0xde,0xdd,0x07,0xa6,0x65,0x3e,0xfa,0x98,0x17,0x4c, +0xe1,0x66,0xc1,0x56,0xb0,0x2a,0xd5,0x9c,0x86,0x4c,0xeb,0x13,0x5b,0x63,0x9f,0x48, +0xa5,0x6c,0xf5,0xfc,0x19,0xfe,0x85,0x89,0x80,0xe5,0x58,0xf9,0xd5,0xa3,0x62,0x28, +0x21,0x50,0x5a,0x85,0x12,0x33,0x2a,0x04,0x66,0xd2,0x4a,0x51,0x7a,0x52,0x19,0x63, +0xa5,0x9c,0xd4,0x30,0x7f,0xda,0xcc,0xaf,0x4f,0x13,0x48,0xc0,0x1c,0xba,0x21,0x5b, +0xc3,0x1b,0x01,0x21,0xba,0xd9,0xdb,0xe1,0xa0,0x86,0x41,0xb4,0xde,0x11,0x5f,0xae, +0x4a,0x77,0x0f,0x35,0x93,0x53,0xd9,0x41,0xe7,0x31,0x83,0x60,0x94,0xba,0x14,0xc0, +0x06,0x57,0xac,0xa6,0xc5,0x5a,0xa5,0x4e,0xd4,0x21,0x61,0xe8,0x74,0x7e,0xd6,0xc5, +0x21,0x75,0xd9,0xa7,0x15,0xbc,0xed,0x5f,0xdd,0x9e,0xe2,0xf8,0x31,0xca,0x51,0x34, +0xcd,0xdf,0x05,0x44,0xed,0x3e,0xe0,0xce,0xcd,0x3d,0xd5,0x5a,0xfa,0x54,0x99,0xd1, +0xa9,0x35,0x3c,0xb5,0xf7,0x9a,0x8e,0x2d,0xd4,0x0c,0xe7,0x0a,0xf5,0xc4,0xc6,0x18, +0x31,0x7b,0x56,0xad,0x76,0xd3,0x1c,0xdb,0x4e,0x57,0x14,0x09,0x56,0x1b,0xa9,0x29, +0x2f,0x7b,0xde,0x3c,0x35,0x1b,0x18,0x0d,0xe1,0xea,0x54,0xc9,0x1c,0x99,0x61,0xeb, +0x43,0x99,0xc3,0x18,0xdf,0x1a,0xa3,0xda,0xc6,0x55,0x49,0xd9,0x95,0xd1,0x55,0x69, +0xa8,0x59,0x4b,0x68,0x92,0x19,0x1a,0xba,0xfd,0xf6,0x4b,0x18,0xd7,0xd1,0x02,0x6d, +0x04,0x7f,0x16,0xbc,0x86,0x37,0x8f,0xeb,0xee,0x38,0x98,0x68,0x30,0x39,0x90,0x2d, +0x44,0xf6,0x71,0xac,0x33,0x34,0x5e,0x07,0x94,0xa2,0x4e,0x8f,0x5d,0xf4,0x45,0x69, +0x80,0x3c,0x06,0x49,0x89,0x5a,0x75,0xe9,0xea,0x5e,0xdf,0xe8,0x85,0x81,0x9f,0xfd, +0x8d,0x3f,0x4b,0x20,0x44,0x7e,0xa0,0x06,0x16,0x59,0x6e,0x9d,0xb3,0xd2,0x75,0x69, +0x89,0x36,0xa0,0x87,0x1a,0xc3,0x84,0x40,0x2c,0x63,0xf4,0xd3,0x3b,0x4a,0x72,0x10, +0x97,0x8b,0xbc,0x97,0x5b,0x41,0xc3,0x75,0xac,0xa2,0xfc,0xb7,0x7b,0x82,0x1a,0x73, +0x04,0x9d,0x7f,0xf2,0xdf,0xc1,0xce,0x50,0xa6,0x11,0xb7,0x86,0xfa,0x81,0xa9,0xee, +0x8d,0x2e,0x6d,0x92,0xbb,0x81,0x5e,0x49,0xa4,0xc7,0xf7,0xe6,0xba,0xc3,0xb4,0x42, +0x06,0x84,0xd7,0xc1,0xfd,0xe7,0x3e,0x73,0x64,0xe7,0x30,0xe2,0xbb,0xea,0x68,0xf7, +0x29,0xe6,0x38,0x30,0xec,0x3e,0x36,0x37,0x69,0x86,0x03,0xb4,0xf6,0x5a,0x61,0x43, +0x86,0x86,0x21,0xd6,0x98,0xbd,0x35,0xb7,0x8d,0x6c,0xc9,0x98,0x55,0xeb,0xbd,0x03, +0xc6,0x0f,0xe9,0xd3,0xcb,0xf6,0xfd,0x16,0xea,0xae,0x91,0x15,0x24,0x8b,0x73,0x4d, +0xc6,0x4b,0x7c,0xdf,0x13,0x89,0x4b,0x59,0x6a,0x41,0xe6,0x8b,0x72,0x03,0x68,0xe9, +0x3f,0x7d,0xfa,0x1b,0x17,0xeb,0x19,0x9e,0x95,0xaa,0x6e,0xbf,0x11,0xca,0x2b,0x1a, +0x65,0x49,0xe7,0x9a,0xd0,0xa9,0x13,0xa1,0xcf,0x4a,0x6d,0xfe,0x97,0x89,0xfd,0x68, +0xe3,0xe5,0x75,0xea,0x97,0x49,0xd7,0x44,0x07,0xa8,0x6f,0x9a,0x96,0x41,0x68,0x1a, +0x4f,0x0c,0xd8,0xb5,0xeb,0xa0,0x6c,0x1b,0x27,0x27,0x32,0xef,0x01,0xe6,0x60,0x0a, +0x4e,0x05,0xd4,0x42,0x19,0x0f,0x65,0x03,0x36,0x74,0x3f,0x86,0xb9,0x56,0xb7,0xee, +0xa0,0x24,0xdb,0x30,0x1f,0xa3,0xad,0x9e,0xa1,0x77,0x7b,0x93,0x38,0x15,0x61,0x0b, +0xcf,0x8c,0x38,0x9d,0x3e,0x50,0xe4,0x06,0xb2,0x36,0x1e,0x0d,0x34,0xfc,0xe0,0xd6, +0x85,0xcf,0x62,0x73,0x78,0xb3,0x60,0x53,0xc7,0x20,0x7e,0xd2,0x1d,0x3a,0x7e,0xad, +0x4f,0x2a,0xf4,0x12,0x59,0xba,0xf8,0x5f,0x06,0xd9,0xe8,0xb3,0x51,0xb0,0x91,0xe1, +0x1b,0x47,0xf1,0x83,0xb2,0x73,0x07,0x92,0x82,0x90,0x6b,0xd3,0xbc,0xf1,0xa9,0x17, +0xf9,0xc2,0x6d,0x93,0x9b,0x90,0xfd,0x36,0xa0,0xde,0x2d,0x93,0xd1,0xb2,0x24,0x47, +0x08,0xb6,0xda,0xda,0x05,0x40,0xe7,0xd9,0xe8,0x7b,0x24,0x54,0xc8,0xf6,0x2c,0xd2, +0x6b,0x97,0x68,0xe9,0x1d,0xf4,0x42,0x56,0x06,0x82,0x9d,0x72,0x3d,0x6d,0xa1,0x66, +0x88,0xf5,0x25,0x56,0xe7,0xbe,0xa5,0x98,0x68,0x09,0xac,0x43,0x53,0xed,0xa9,0x76, +0xa7,0x7c,0x32,0x28,0x93,0x4c,0x65,0x72,0x0e,0x94,0xf5,0xf2,0x0b,0xd4,0x9b,0xb7, +0xd3,0xc5,0x26,0x0f,0x7b,0xb3,0xcd,0x8d,0xcd,0x27,0x26,0xaa,0x5e,0xdb,0x55,0xf1, +0x46,0x96,0x2e,0x3b,0x17,0xd9,0xb2,0x1f,0x4b,0xf8,0x6a,0x1b,0x53,0x9a,0xf4,0xd0, +0x51,0x26,0x67,0xba,0x9f,0xf8,0xa7,0xab,0xe2,0xba,0x33,0x0a,0xd2,0x99,0xa8,0xa9, +0x9a,0x9b,0x6b,0x4b,0x9e,0xf9,0x7b,0xae,0x82,0x1b,0x3b,0x1f,0xd7,0x9b,0xe2,0x6f, +0x00,0x9e,0x19,0xea,0xbc,0xdb,0x6c,0xc5,0x4f,0xac,0x66,0x13,0x81,0xbd,0xba,0x2f, +0x40,0xf6,0xb4,0xc3,0x39,0x3f,0x66,0xeb,0x86,0x9e,0x01,0xda,0xfd,0xf5,0x67,0xde, +0xac,0xfc,0x98,0xad,0x41,0xd2,0x49,0x4f,0x8f,0xa9,0x28,0x10,0xda,0x05,0xbb,0x7e, +0xad,0x9f,0x5c,0xa5,0x3e,0xb2,0x0d,0xd5,0xaf,0x2b,0x43,0x80,0x5c,0xbe,0xa7,0x2c, +0xe1,0xaf,0x93,0x38,0x58,0xb1,0xd0,0xb1,0x23,0xbf,0xd2,0x77,0xa1,0xe9,0x1f,0xef, +0xea,0x70,0x8e,0x39,0x70,0x30,0x1c,0x25,0x47,0x03,0x25,0x44,0xe7,0x68,0x96,0xf2, +0xa2,0xa9,0xbf,0x3d,0xb3,0x62,0xd1,0x25,0xaa,0xb5,0xb1,0xaf,0xd1,0xe0,0x77,0x29, +0x87,0x41,0x87,0x38,0xb2,0xf4,0x63,0x43,0x62,0x26,0x8d,0x5a,0xb0,0x16,0xfa,0x87, +0xc0,0x54,0x6c,0xd7,0x34,0x2e,0x6e,0xbc,0xe5,0x5f,0x79,0x75,0x78,0x4c,0x11,0x47, +0x64,0xf5,0xb6,0x52,0xf2,0xa6,0x5d,0x92,0x70,0xe7,0xe6,0x15,0xf0,0x7e,0x49,0x55, +0xe5,0x56,0x91,0xb5,0x7c,0x57,0x13,0x07,0x40,0x45,0x3c,0xe7,0x7c,0x6f,0x89,0x35, +0x9d,0x01,0xe9,0xa6,0x1f,0x2a,0xe1,0xf3,0xe1,0xb7,0x7a,0x03,0x7f,0x68,0x78,0x7a, +0xab,0x6d,0x42,0x89,0x70,0x25,0x6a,0xac,0x4e,0xc7,0x8a,0xb4,0xe5,0xe1,0x19,0xf8, +0x0d,0xa9,0xf4,0xbc,0xf0,0x98,0xe5,0x7f,0xa0,0x4a,0x6f,0x38,0xd9,0x2b,0x7b,0x18, +0xf8,0xa7,0xfd,0x30,0x34,0x27,0x2b,0xd7,0x64,0x47,0x22,0x4d,0x96,0x1d,0x9e,0x69, +0xb9,0xa3,0x27,0x8f,0xa9,0x23,0xfc,0x47,0xa8,0x4f,0x5b,0xac,0x38,0x92,0x12,0x41, +0xab,0xa3,0xbf,0x3e,0x65,0x0c,0x2a,0x2f,0xa3,0x96,0x8f,0x74,0xf7,0x09,0x13,0xc1, +0xac,0x16,0xf7,0x16,0x1d,0x0f,0x03,0x62,0x4d,0x64,0x6e,0x9e,0xf7,0xe6,0x88,0x0f, +0xca,0x83,0x38,0xb6,0x69,0x32,0x35,0x08,0x21,0x6d,0xab,0x85,0x82,0x23,0x0b,0xbf, +0xb8,0x4f,0x6f,0x2e,0xfd,0xd7,0xa5,0x91,0x57,0xe2,0xdf,0x9f,0xdd,0x46,0x01,0x04, +0x26,0x9f,0x17,0xbf,0xbe,0xb9,0x10,0x88,0xa8,0xe1,0xaa,0x99,0x11,0x74,0x2c,0x24, +0xa3,0x80,0x4e,0x90,0xd3,0x58,0x62,0x10,0x8a,0x20,0x5c,0x25,0x90,0xae,0x3f,0x63, +0x0c,0x1d,0x19,0x65,0xae,0x70,0x86,0xd3,0x0b,0xa3,0xf7,0xa7,0xf1,0x10,0x73,0x60, +0x02,0x63,0x8e,0x11,0xbf,0x92,0x63,0x89,0xe7,0x11,0x02,0x55,0xa1,0xae,0xfc,0x28, +0x78,0x5b,0x96,0x14,0x79,0x8b,0x6a,0x30,0xfe,0x5b,0xe0,0xb8,0x11,0xeb,0x87,0x17, +0xe9,0x3c,0xb7,0xa7,0x19,0x9e,0xdc,0xe1,0x45,0xf8,0xe6,0x44,0xa7,0xda,0x85,0x39, +0x1d,0xbb,0xfb,0x60,0xf1,0x94,0x77,0x92,0x41,0x5f,0xc3,0xd1,0x19,0x32,0x05,0xc0, +0x4a,0x3e,0xb5,0xdd,0x53,0xb6,0x17,0xc0,0xc5,0xd5,0x79,0x97,0xd0,0x37,0x38,0xb0, +0x2e,0x5a,0xbc,0x6e,0x94,0x37,0x6c,0xca,0x9f,0x3d,0x8c,0xd5,0x59,0xf8,0x76,0x95, +0xc9,0xb8,0x8b,0xef,0x4d,0x7b,0x4e,0xcb,0x15,0x1b,0x29,0x85,0x5d,0x82,0x14,0xfa, +0x94,0xb1,0xa1,0xb1,0xc0,0x3e,0x2f,0x56,0x67,0xfc,0x2c,0x1f,0x85,0x1a,0xab,0xa2, +0x2d,0x84,0x4b,0xa8,0x58,0x34,0x5d,0x6c,0xe8,0x1a,0x60,0x99,0x18,0x60,0x44,0x3b, +0x7d,0x07,0xf5,0x3f,0xbe,0xb1,0x70,0x4c,0xc9,0xd8,0xe2,0xa0,0x93,0xbd,0x17,0xc6, +0xce,0xeb,0x0e,0x5d,0xae,0x90,0xa3,0x0b,0x41,0x46,0xf8,0x1e,0x43,0xd2,0x00,0xaf, +0x55,0x72,0x95,0xd6,0x51,0x5a,0x0e,0x65,0x4d,0xd3,0xf1,0x3d,0x59,0xfb,0xb0,0x49, +0x5c,0xb2,0x1d,0x0d,0x0f,0xc0,0x9e,0x9f,0x14,0xf2,0x4e,0x8f,0x10,0x9e,0xb5,0xe2, +0xb9,0x0d,0xa5,0x75,0x6c,0x26,0x49,0x51,0x38,0x49,0xa8,0xb2,0x52,0x82,0x71,0x52, +0xa0,0x3e,0x57,0x32,0x13,0x63,0x9b,0x0f,0x99,0xc2,0x83,0x46,0xd5,0xf7,0x5f,0x2e, +0x6f,0x13,0xa1,0xc7,0x98,0x59,0x11,0xa9,0xc7,0x22,0xb0,0xa3,0x96,0x4e,0x5b,0x12, +0x9d,0xc1,0x29,0xe8,0x77,0xca,0x1f,0x0b,0xbd,0x63,0xf1,0x3b,0x2d,0x32,0x98,0xaa, +0x48,0xcb,0x9e,0xf2,0xff,0x07,0x08,0x94,0x40,0x2f,0x80,0x04,0x65,0x90,0x38,0x4f, +0xa6,0xe9,0xba,0x0f,0xfc,0x26,0x82,0x00,0xc5,0x11,0x80,0x52,0xb6,0x4a,0x31,0x5f, +0xdc,0x80,0x6a,0xb4,0xfc,0x0b,0x46,0x8b,0x52,0x3b,0x63,0xe5,0x78,0x4f,0x0f,0x8f, +0xb4,0x55,0xd7,0xf2,0xc6,0x08,0x25,0x91,0x45,0xc3,0xe8,0x84,0x82,0xe1,0x64,0xfa, +0x6d,0x71,0x24,0x7d,0x68,0xce,0x21,0x59,0x3c,0xc3,0x05,0x17,0x5a,0x39,0x15,0xfa, +0x51,0xcb,0x15,0x6e,0x7a,0xa2,0x58,0x12,0xa4,0xb8,0x0d,0x07,0x79,0x87,0x3b,0x0f, +0x0c,0xba,0xb9,0xfb,0xbd,0x5a,0xb3,0x3a,0xf0,0xa6,0x58,0x30,0xa4,0xab,0x6d,0xeb, +0x6f,0x72,0xbd,0x6c,0xe9,0xad,0x59,0x3b,0xce,0x8b,0x85,0x9f,0x1f,0x7f,0x9a,0x2c, +0xf1,0x8f,0x36,0x43,0x0a,0xa8,0xd2,0x08,0xc3,0xae,0x59,0xa3,0xfd,0xea,0x92,0x38, +0xe4,0x57,0xa4,0xa1,0xf6,0x0e,0x7e,0x09,0x0c,0xb9,0x68,0x0d,0x3b,0x81,0xdd,0x43, +0x6d,0x0e,0x4a,0x3c,0xf8,0x24,0x8e,0x8b,0xca,0xb5,0x85,0xc4,0x7d,0x41,0x83,0x4b, +0xbc,0x5d,0xa1,0x8e,0x68,0x02,0x03,0x69,0x24,0x8c,0x9d,0xba,0xde,0xaf,0x93,0xae, +0x22,0xc1,0x10,0x64,0xbb,0x1d,0x0a,0x9b,0x0d,0x41,0x73,0x40,0xf9,0xeb,0xec,0x16, +0xc6,0x0c,0x3b,0xe6,0xb5,0x37,0x24,0x3a,0xea,0x2c,0xc2,0x17,0x46,0xd7,0x02,0x07, +0xe6,0x60,0xf5,0x15,0x25,0x1f,0x6d,0xa7,0x0d,0xa3,0x16,0xd1,0x3e,0xdb,0x55,0xb4, +0x5c,0x9c,0x8d,0xd7,0xe4,0xf1,0x5f,0xf9,0x10,0x5a,0x7d,0xd6,0x1a,0x57,0xaf,0x85, +0xf0,0x9c,0xda,0x77,0x75,0xe1,0x20,0xa5,0xb8,0xdc,0xca,0xd3,0xfb,0x52,0x12,0x0e, +0x14,0x17,0x5d,0x2d,0xde,0xd6,0x42,0x22,0xad,0x96,0x75,0x72,0x2c,0x60,0x63,0xbc, +0xc6,0x49,0x1e,0xb4,0xd4,0x3c,0xf5,0x82,0x2e,0xba,0xbf,0xa7,0xf2,0xd3,0x53,0x0f, +0x00,0x8c,0xa7,0xfb,0x44,0x1a,0x82,0x9c,0x68,0x21,0xc5,0x97,0xf3,0xd2,0xe6,0x1b, +0x4f,0x1f,0x64,0x8a,0xc3,0xc7,0x16,0x38,0xec,0xd0,0xce,0x0a,0x4f,0x1c,0x51,0x6a, +0x25,0x96,0x11,0xe2,0x1c,0x29,0x06,0x49,0x11,0xbc,0xa6,0xae,0x9a,0xe2,0xd6,0x87, +0xaa,0xd8,0x99,0xb3,0x32,0x65,0x30,0x2f,0xea,0x55,0x6d,0xb2,0x15,0xb9,0x9b,0x6b, +0x89,0x94,0x6f,0x1a,0xad,0xf9,0x07,0x48,0xcf,0x7f,0xdb,0xab,0xce,0xdd,0xa5,0xac, +0x46,0x46,0xb2,0x3f,0x9d,0xac,0x7e,0xef,0xf3,0x21,0xa5,0x9d,0x4a,0x5d,0x6c,0xd3, +0x8a,0x86,0x4e,0xac,0x5d,0x09,0x00,0x4b,0x84,0x5e,0x3e,0x27,0x51,0x62,0x3e,0x5a, +0x09,0x9d,0xd5,0xff,0x1c,0x11,0xda,0x99,0x05,0x1d,0xcf,0x10,0x17,0xcf,0x2d,0x3d, +0x9c,0x3d,0x91,0xd8,0xb9,0x9d,0x01,0x5e,0x58,0x82,0x4b,0x9d,0x04,0x91,0x59,0x92, +0xa5,0xb6,0xbe,0x58,0x78,0x2d,0x5c,0x33,0x24,0x0a,0x50,0xb4,0x0f,0xf5,0x70,0x98, +0xa4,0x88,0xb2,0xa4,0xfb,0x8e,0x7d,0x4a,0xe6,0x51,0x1f,0xb7,0x85,0x82,0x3a,0x71, +0x00,0xad,0x93,0x99,0x7b,0x66,0x48,0xa7,0x67,0x59,0x44,0x1e,0xa2,0x20,0x29,0x82, +0x22,0x0b,0x2d,0x6b,0x32,0x46,0x26,0xd7,0x20,0xec,0x3e,0x9d,0x5e,0xce,0x8f,0x7a, +0x3c,0xb1,0x3f,0x60,0x9f,0xa9,0x90,0xe4,0x8e,0x06,0x68,0x9b,0xdf,0x7f,0xeb,0xf9, +0xdf,0x56,0xaa,0x54,0xe4,0x3e,0x4e,0xc0,0x45,0x07,0x99,0x12,0x85,0xba,0x12,0xc5, +0xde,0x20,0xa7,0x89,0x6d,0xab,0x95,0x9f,0xa1,0x30,0xb5,0x03,0x0c,0x99,0xa5,0x22, +0xb5,0x81,0x6a,0x12,0x36,0xd1,0x42,0x8e,0x4e,0xea,0x49,0x4b,0x98,0x92,0x82,0x2b, +0x7a,0xa5,0x3d,0xee,0x1e,0x92,0x5f,0x17,0x7c,0x9d,0xc3,0xbe,0xe9,0xc5,0x12,0x00, +0x6a,0x40,0x26,0x63,0xdb,0xd6,0xda,0x18,0x49,0x52,0x3e,0x7c,0x1d,0xc2,0x49,0x99, +0xe1,0xeb,0xb3,0xfd,0x67,0x25,0x06,0xad,0xbb,0xda,0x45,0x5d,0x58,0xec,0xcb,0xc0, +0xe7,0x49,0x30,0x6d,0x19,0xad,0xfa,0x5f,0xea,0x0b,0x4d,0x38,0xb2,0x78,0x7b,0x3b, +0x30,0x85,0x79,0x3c,0x9a,0x83,0x57,0x6a,0x66,0xc7,0x18,0x23,0xa7,0x10,0xc8,0xa9, +0x31,0x6d,0xea,0xcf,0xb8,0x6c,0x9a,0x6f,0xb4,0xc6,0xe4,0xac,0x30,0x62,0x63,0xdb, +0x06,0x06,0xbb,0xc5,0x3f,0xa7,0x96,0x58,0xa8,0x0c,0x7a,0x13,0x4f,0x2f,0x15,0xf5, +0x3a,0x63,0xf3,0xa7,0x37,0x22,0x9e,0x48,0xb5,0x0d,0x5b,0x4f,0x2f,0x60,0x57,0xf3, +0x4c,0x19,0xba,0xa8,0x11,0x70,0x1c,0xb4,0x89,0x1a,0xce,0x29,0x18,0xf3,0x34,0x6f, +0xc8,0x20,0x90,0xf6,0x79,0xf0,0xdc,0x69,0x1a,0x13,0xc6,0x38,0x19,0xf2,0x43,0xf2, +0x94,0xb3,0x99,0xe7,0xf8,0x03,0x0b,0x60,0xc1,0xd9,0x55,0x21,0x3c,0x8d,0xd9,0x6f, +0xc2,0xc9,0x91,0x3e,0x95,0xbe,0xd6,0xc7,0x1c,0x58,0x5d,0x31,0x3b,0x1f,0x06,0xcd, +0x23,0x36,0xba,0xc2,0x51,0xc0,0x94,0x65,0xcb,0x5e,0x74,0x96,0x10,0x80,0x8c,0xcd, +0xa9,0x7b,0x95,0x7e,0x96,0xea,0xa3,0x74,0x18,0x3c,0xba,0x38,0x10,0x71,0x85,0x51, +0x21,0xa4,0x16,0x36,0x3e,0x77,0xd6,0xda,0x94,0xdb,0xab,0xe2,0xd6,0x18,0x73,0x7d, +0x7d,0xca,0xcc,0xb3,0x4c,0x2c,0x63,0xed,0xe5,0x35,0xa4,0x8f,0x92,0x73,0xc6,0x51, +0x46,0x5a,0xf8,0x3d,0xd3,0xfb,0x8b,0xef,0x81,0x12,0x56,0x3c,0x7c,0xf3,0x3a,0x20, +0xc0,0xd8,0x7c,0x11,0x98,0x7b,0xb2,0xcb,0x6a,0xff,0x5e,0xc4,0x86,0xf2,0x48,0xc8, +0xa9,0x5a,0xd9,0x30,0x47,0x3c,0x71,0x68,0xa8,0xa5,0x72,0x9c,0x9a,0x38,0x17,0x09, +0x24,0xb6,0x4b,0x63,0x3b,0xfc,0x90,0xa9,0x35,0x54,0x7e,0x8c,0x9b,0x39,0x86,0x58, +0x76,0x14,0xa6,0xaa,0xc9,0x2c,0x6c,0xa8,0x76,0xfc,0xb7,0xc8,0x54,0xa3,0x09,0x5c, +0x77,0x3b,0x31,0xa2,0xad,0xe2,0x3c,0xfc,0x6a,0x1d,0x65,0x4c,0x97,0xa2,0x81,0x4d, +0xe8,0x10,0x7f,0x36,0x9e,0x48,0x85,0x9a,0x80,0x30,0x68,0xdd,0xdb,0x81,0xe3,0xaa, +0x9d,0xe9,0xf0,0x56,0x40,0xa2,0x59,0x4d,0x0a,0xf0,0x4f,0x8f,0xc8,0x08,0x6f,0x43, +0x05,0xc0,0x80,0xc6,0x58,0xed,0x71,0x44,0x67,0x80,0x89,0x61,0xbd,0xf3,0x6a,0x63, +0x61,0x88,0x17,0xf4,0x13,0x1b,0x26,0x6f,0x66,0x51,0xa2,0x34,0x97,0x7a,0x15,0xbb, +0x6d,0xe8,0x5e,0x83,0xcf,0xa7,0x05,0x9b,0x2d,0xc8,0xd3,0xaf,0x3d,0x01,0x6b,0xef, +0x85,0x2e,0xf6,0xe7,0xd5,0x02,0x95,0x40,0xc2,0x65,0xf1,0x23,0xbe,0x00,0x5e,0xee, +0xc4,0x96,0x9f,0x61,0xb7,0x7b,0xb0,0x75,0xcb,0x86,0x60,0xe4,0xb8,0xaf,0x0a,0xaa, +0x04,0x45,0x15,0x5e,0xb2,0x9a,0x6e,0xc2,0x41,0x87,0x85,0x51,0xf6,0xba,0x5f,0xea, +0xe7,0x82,0x55,0x25,0x69,0xeb,0x33,0x67,0xa5,0xb0,0xc9,0x8d,0x7a,0xeb,0x37,0xfa, +0x74,0x2c,0xe8,0x31,0x20,0xb7,0x62,0x8c,0xa4,0xb1,0x4d,0x15,0x68,0xa6,0xb3,0x3b, +0x4f,0x77,0xb3,0xfd,0x2c,0x08,0x7e,0xed,0x8e,0x48,0xc9,0xdf,0x6e,0xfa,0x65,0x23, +0x0b,0x33,0xc8,0x0f,0x1e,0xeb,0x96,0x49,0x4e,0x6f,0xe8,0x79,0x97,0xb9,0x98,0xba, +0xb4,0xc8,0x28,0x7c,0xc9,0xc6,0x3b,0x2f,0x64,0x59,0xed,0x9f,0xd4,0x47,0x27,0x5b, +0x89,0xae,0xad,0x2a,0xd5,0xfa,0xb4,0xfc,0x0f,0x4b,0xb3,0x3b,0x54,0x36,0xb3,0xc2, +0x75,0x6c,0x5a,0x01,0xad,0xed,0x64,0xd7,0x48,0x8e,0x2b,0x71,0x61,0x76,0xaa,0x47, +0x85,0xcf,0x15,0x2d,0x6f,0xce,0xb4,0x41,0x3d,0x40,0x43,0x20,0x7b,0x4c,0xa3,0xdb, +0x09,0x3e,0xdd,0x76,0xf6,0xa3,0x68,0x2c,0xc8,0x6c,0x5c,0x00,0x03,0x32,0xab,0x20, +0x02,0xcd,0x10,0xaf,0xcc,0x5e,0x84,0xff,0xb4,0xa6,0xc3,0x4f,0x8d,0x40,0xb5,0x11, +0x67,0x6f,0x41,0xe4,0xcb,0xdc,0x06,0x5d,0x57,0x76,0x74,0xe0,0xd5,0x9c,0xec,0x4b, +0x5d,0xd3,0x62,0xe5,0x47,0x19,0x5b,0xc0,0xa7,0xd1,0xef,0xe7,0x4b,0xfa,0x1b,0xaa, +0x66,0x92,0x9b,0x8e,0xb2,0x10,0x8d,0x58,0x69,0x2f,0x75,0x36,0xbb,0x5f,0x62,0xd2, +0xa4,0xd3,0x78,0x77,0xbf,0xf1,0x35,0xbe,0x67,0x0f,0xf9,0x33,0xbf,0xa6,0xdf,0x46, +0x64,0x64,0x85,0x3c,0xd7,0xcf,0x22,0xf1,0x04,0x27,0x0c,0xee,0xd1,0xb5,0x2e,0xdf, +0x24,0x15,0x95,0x11,0x33,0x97,0xad,0x5a,0x2f,0x56,0xb8,0xb8,0xf5,0x12,0x6d,0xcf, +0x29,0xd4,0xf6,0x2b,0xbe,0x89,0x53,0x4a,0x88,0x72,0x95,0x50,0xd1,0xb4,0x6b,0x62, +0x2e,0xca,0x22,0x55,0x59,0xfc,0x49,0x44,0x1b,0x14,0xdf,0xd3,0x1e,0xdc,0x12,0x32, +0x2a,0x22,0xe0,0xa0,0x3d,0x78,0xfb,0x5a,0x64,0xd7,0xbe,0xba,0x0b,0x98,0x08,0xaf, +0x70,0x3d,0x8e,0x1e,0x4a,0x26,0xc6,0x52,0xf7,0x94,0x65,0x44,0x02,0xeb,0x14,0x7b, +0xa4,0x95,0x7c,0x8a,0xc3,0xa7,0x6e,0x85,0x8f,0x58,0x68,0xc5,0x7c,0xf8,0xb9,0x5b, +0x65,0x5a,0x70,0x17,0x3d,0xeb,0xc4,0xb3,0x48,0x24,0x9f,0xb3,0xfb,0x79,0x58,0x7b, +0xa3,0x1a,0xde,0x34,0x92,0xb1,0xe6,0x6e,0x64,0x12,0x90,0xda,0x95,0xd7,0xb9,0x28, +0x0c,0x7f,0x5a,0xbc,0x1b,0xa6,0x7f,0x9c,0x94,0xcd,0x80,0x4e,0x6f,0x30,0x63,0x8b, +0xc3,0x33,0x98,0xe8,0x1f,0x61,0x2e,0x48,0x4b,0x41,0x67,0x07,0x6c,0x33,0x35,0x56, +0xc7,0x1c,0xc8,0xb9,0x48,0xaf,0xc7,0x05,0xff,0x92,0x81,0x4e,0xdb,0xff,0xa3,0x2c, +0xdc,0x71,0xd9,0xb9,0xb5,0xa0,0xb7,0x94,0x46,0xc2,0xb6,0x10,0x3c,0x7b,0xad,0x2c, +0xe0,0xae,0x8c,0x04,0x22,0xe0,0x65,0xb4,0x0b,0x55,0x1f,0x06,0x62,0x15,0x22,0x39, +0x58,0xb3,0x79,0x63,0x6f,0xa5,0x19,0xa5,0x8a,0xde,0xb2,0x53,0xbb,0x6d,0x8c,0xe2, +0xd1,0xf7,0xa9,0x34,0x6c,0xa4,0xe6,0x5a,0x4e,0xb5,0x0b,0xca,0xd7,0xa8,0xbb,0x80, +0x42,0x89,0x82,0x24,0x0d,0xa5,0xd4,0xe4,0x79,0x1c,0xc6,0x94,0xad,0x2b,0xeb,0xf9, +0xea,0xe4,0xb6,0x79,0x20,0x34,0x9e,0x98,0x41,0x08,0xa2,0x14,0x5a,0xe8,0x18,0xc1, +0x25,0x00,0x94,0xa5,0xb5,0xab,0x08,0x65,0x67,0x4d,0x88,0x54,0x77,0x99,0x31,0xa0, +0x20,0xf7,0xe9,0x44,0x72,0x88,0x01,0xf5,0xc5,0xac,0xa7,0x59,0xb0,0x16,0xa2,0x16, +0x84,0x05,0x02,0x2c,0x2b,0x5b,0x1a,0x38,0x3f,0x68,0xee,0x52,0xb3,0x59,0x08,0xe5, +0x01,0x0d,0xf8,0x1d,0x57,0x32,0xb7,0x46,0xd4,0x74,0xa4,0x14,0xd4,0x9f,0xef,0x9a, +0x98,0x02,0xa3,0x84,0x71,0x69,0x33,0x2d,0xbf,0x4a,0xca,0xa9,0x7d,0x95,0x8b,0xe4, +0x89,0xff,0x5a,0x7b,0xd9,0x64,0x84,0xd9,0xcd,0x3e,0xd3,0x39,0x05,0x7a,0x60,0xbb, +0x6e,0x17,0x57,0xa4,0x62,0x61,0x65,0x77,0x2e,0x57,0xc4,0x40,0xe9,0xa1,0x74,0x6c, +0x38,0x59,0x4b,0x65,0x28,0x8c,0x42,0x6c,0xaf,0x8c,0x61,0x9c,0x47,0xc0,0x60,0x3d, +0xab,0x8c,0xc1,0xbe,0xea,0x8a,0xf2,0x1f,0xa3,0x8f,0x28,0x9f,0xfb,0x1f,0xd1,0x39, +0xd3,0x14,0x91,0x58,0x3c,0x2b,0x61,0x91,0x8b,0x00,0xda,0xf9,0xd5,0x95,0xdf,0xde, +0x5f,0x01,0x13,0x74,0x48,0xc1,0x02,0xad,0xd3,0xfd,0xaa,0x91,0x18,0x59,0xcc,0x69, +0x0a,0x9c,0x8a,0x34,0x39,0x3b,0xdc,0x20,0x60,0x13,0x5c,0x4c,0x64,0x75,0xd8,0x90, +0xdb,0xed,0xfc,0xf6,0x92,0x7d,0x45,0x47,0xa8,0x22,0x6a,0x21,0xc5,0x9d,0x73,0xac, +0x4a,0x10,0xb3,0x98,0x3e,0xb5,0x5b,0x7b,0x5a,0x11,0x9f,0xc7,0xc2,0x33,0x04,0xa6, +0x01,0xd4,0x86,0x27,0xd9,0x85,0x8d,0xdc,0x59,0x6a,0xcd,0x9f,0xd1,0xd4,0x4e,0x36, +0x10,0x17,0x5f,0x24,0x4b,0x94,0xcd,0x18,0x0b,0xde,0xda,0x14,0xfe,0x34,0x47,0x27, +0x43,0x0d,0x05,0x55,0x19,0x99,0x8a,0xf0,0xe4,0x94,0x44,0x96,0xc6,0xff,0xf5,0xc1, +0x04,0x7b,0x5c,0x3f,0x16,0xc8,0xa2,0x17,0xe5,0xf5,0x62,0x07,0xd0,0xff,0x38,0xb4, +0x6a,0xe7,0x02,0x4c,0x7c,0x95,0x50,0x3b,0x97,0x65,0x6e,0x44,0x50,0x35,0x06,0x9c, +0x01,0x81,0x8c,0xee,0x0a,0x31,0xc5,0xb9,0xe9,0x19,0x9c,0x5a,0xf6,0x8f,0x39,0x29, +0x25,0xec,0x84,0x1f,0xb4,0x32,0xfb,0x36,0xe9,0xda,0x68,0x45,0xb6,0x37,0xcf,0x09, +0xa8,0x59,0x77,0xb9,0xd2,0x2a,0xc4,0xb9,0x74,0x86,0xd7,0xb9,0xf0,0xff,0x24,0xd8, +0x2b,0x5d,0xbc,0xac,0x7e,0xc1,0x06,0x17,0x0b,0x09,0xe8,0xf1,0x99,0x75,0x04,0x78, +0xd4,0xea,0x0b,0xcf,0x2f,0xcc,0xab,0x98,0x73,0xa0,0x87,0xcd,0xdc,0x7b,0x27,0xcb, +0xd1,0x13,0xc5,0x3e,0xc6,0x3a,0x4f,0xf5,0x17,0xd7,0x00,0x9e,0xee,0xfe,0x0f,0x59, +0x42,0x67,0xef,0x49,0x5a,0x90,0x45,0xd6,0xca,0xdf,0xf7,0x93,0xfd,0xdd,0x74,0x11, +0x7c,0xc4,0x18,0xf9,0xf6,0x80,0x64,0x51,0x6e,0xb9,0x8e,0x0f,0x5a,0x82,0xc4,0x81, +0x1d,0x89,0x2a,0x69,0xf7,0xe1,0x8f,0x82,0x43,0x43,0xa9,0x76,0x71,0xa3,0x07,0x3b, +0x08,0x8f,0xa3,0xef,0xb0,0xa6,0x29,0x07,0x30,0xa1,0xfb,0x9a,0x59,0x44,0x2b,0xee, +0x8d,0x87,0xaf,0xff,0xa7,0x0e,0xa5,0xf4,0x38,0x65,0xa5,0x54,0x3e,0x22,0x20,0xb2, +0x0e,0xcb,0xa9,0xae,0x32,0xe9,0x4e,0x2f,0x67,0x04,0xcf,0x84,0xbf,0xd4,0x52,0xba, +0x47,0xca,0x13,0x2b,0x34,0x95,0x33,0x94,0xc5,0x11,0x39,0xf2,0x51,0x43,0x38,0x4d, +0x62,0x47,0x1e,0xaf,0xee,0xeb,0x28,0x73,0x63,0x67,0xd1,0xe3,0x33,0x67,0x30,0x73, +0x22,0x26,0x52,0x47,0x7c,0xd6,0x21,0x11,0x38,0xdc,0x39,0xf2,0x88,0x5a,0xa2,0xf7, +0x0c,0x7c,0xf2,0xe8,0x80,0xeb,0xe0,0x54,0x86,0x6b,0x8c,0x1b,0xd1,0x4e,0x3d,0xf7, +0x45,0x32,0x06,0x8c,0x55,0xa3,0x04,0x37,0x8f,0x69,0x3a,0x58,0x1d,0xa6,0xf3,0xf7, +0x59,0x71,0xa5,0x17,0x75,0x5b,0x3b,0xaf,0x50,0xe9,0x21,0xef,0xca,0xf1,0xd4,0x9f, +0xf6,0xa0,0x2e,0x20,0xe1,0x0b,0x73,0x33,0xae,0xda,0xd9,0x3e,0xdc,0xc9,0x73,0xb5, +0x83,0x2a,0xbc,0x62,0x16,0xa8,0x70,0x0c,0xc3,0x3a,0x8a,0x18,0x3e,0xba,0x95,0x29, +0x37,0xe3,0x94,0x72,0x19,0x2f,0xba,0x82,0x5a,0x8c,0x85,0xfa,0x15,0x92,0x72,0x8b, +0x8a,0x75,0xe5,0x3d,0x75,0xdf,0x7b,0x7a,0x2f,0x81,0x33,0xeb,0x5b,0xe3,0x8c,0x1b, +0xe1,0x94,0x97,0xac,0xef,0xed,0x22,0x56,0xbc,0xcf,0xe9,0x05,0xd9,0x8d,0x62,0xd8, +0xdb,0xd2,0x5b,0x6e,0xe4,0x7d,0x99,0xc9,0x19,0xdb,0x8e,0x40,0x72,0x49,0x73,0xf7, +0x4e,0xf2,0xd3,0x12,0x6c,0x55,0xec,0xdf,0x44,0x4b,0x2a,0xc4,0x8a,0xea,0x63,0x89, +0x5f,0xd0,0x5a,0x6a,0x84,0x3f,0xb5,0x8c,0xc2,0x7f,0xe4,0xb8,0xc4,0x26,0x2d,0x8c, +0xc7,0xd1,0x0a,0xa2,0x86,0xe7,0x8e,0x02,0x19,0x10,0xfd,0xd1,0xd4,0xe3,0x3c,0xd3, +0x15,0xa1,0x71,0x2e,0x4e,0xf9,0xcb,0x50,0xd0,0xa4,0xe9,0x95,0x6e,0xfb,0x2c,0xb4, +0x65,0xda,0x54,0xc6,0xdc,0x04,0xfd,0xca,0x54,0x74,0x6d,0xb1,0xbd,0xa5,0xdd,0xa3, +0xea,0x8d,0xe7,0x34,0xc6,0xa6,0x4f,0x10,0xda,0x72,0xcf,0x14,0xc2,0x5b,0x4d,0xdb, +0x4e,0x76,0xec,0xb1,0xf7,0x18,0x27,0xf7,0x40,0x2a,0xb5,0xc3,0x94,0x85,0x64,0xca, +0x2a,0x3a,0x1c,0x71,0x03,0xa9,0xf6,0x3a,0x41,0xb6,0xd6,0xb0,0x46,0xf5,0x48,0x61, +0x2b,0x22,0x08,0x81,0x59,0x14,0x58,0x1f,0x6c,0x41,0x01,0x79,0xbf,0xb9,0x4e,0x74, +0xaa,0x38,0xf8,0x0e,0xba,0x02,0x88,0x38,0x8e,0x07,0x1b,0x3c,0x90,0x05,0xb3,0x6a, +0xc7,0x9b,0x3d,0x6d,0x9c,0xdb,0x01,0x1f,0xce,0x19,0xb7,0xb6,0x00,0x7d,0x70,0xab, +0xd1,0xde,0x75,0xdd,0x2a,0x4d,0x64,0xcc,0x4f,0x8e,0xe0,0xc2,0x78,0xbe,0xb8,0xb8, +0xd0,0x30,0x16,0x5a,0x31,0x17,0x6c,0x0c,0x4e,0x7c,0xec,0x80,0x79,0x9f,0xfe,0x3c, +0x2c,0x4a,0xbe,0xfe,0xdd,0x1e,0x65,0x04,0xcf,0x2e,0x51,0x6b,0xb4,0xa1,0x7e,0x1c, +0x71,0x97,0xff,0xbd,0xf7,0xa4,0x6d,0x0c,0xce,0x0f,0xe6,0x80,0x5c,0x74,0xe5,0x31, +0x34,0x42,0x38,0xfb,0x00,0x6d,0xf3,0x60,0x0a,0xcb,0x86,0x88,0x56,0xe2,0xf1,0x20, +0xa2,0x43,0x48,0x96,0x9c,0xd7,0xbe,0xb4,0x47,0x47,0x3b,0x80,0x8d,0x82,0xc1,0x79, +0x86,0xa0,0x16,0x42,0x9e,0x60,0xd4,0x1c,0xc6,0x00,0x7e,0xa1,0xa6,0xb6,0xcd,0x79, +0x7c,0x0c,0xc1,0x10,0xee,0x03,0x66,0xb5,0xba,0x2a,0xc3,0xba,0xb9,0x30,0xe3,0xf4, +0xde,0xe7,0x00,0xc0,0x97,0x66,0x10,0x3b,0x44,0x86,0x41,0x23,0x5c,0xcb,0x88,0xd4, +0x72,0xfa,0x0f,0x96,0xb2,0xda,0x60,0x8e,0xef,0x48,0xa6,0x59,0xd1,0xa2,0x1b,0xce, +0xea,0x85,0x16,0x7b,0x94,0xa4,0x90,0xe3,0x2c,0xc0,0x40,0x16,0xee,0x04,0x92,0x51, +0xe0,0x71,0xa1,0x37,0x64,0x65,0xa6,0x55,0x38,0xdc,0x1c,0x17,0x2c,0xbc,0x04,0x24, +0x88,0x66,0x12,0xe4,0x7c,0x65,0xd2,0xad,0xe1,0x40,0x52,0xa8,0x29,0x97,0xf5,0xf0, +0x6d,0x44,0xd3,0xb1,0x1f,0x6b,0x43,0x85,0xec,0xc0,0x8c,0x90,0xb2,0x2d,0x93,0xe1, +0xf0,0x47,0x78,0x89,0x9e,0x8e,0x97,0xd4,0xc0,0x0b,0x48,0x2d,0xbb,0xfc,0x94,0xf9, +0xd1,0x10,0x2f,0xda,0x47,0x21,0x9b,0x59,0xc5,0xb0,0xa1,0x8d,0x3f,0xc4,0x54,0xf9, +0x0c,0x4e,0xd9,0x00,0x99,0x21,0x52,0xec,0x75,0xd0,0xd2,0xe8,0x5c,0x4a,0x8a,0xb5, +0xda,0xd9,0x66,0x23,0xc1,0xf0,0xa2,0x90,0x29,0x00,0x9a,0xfe,0xbd,0x1b,0x58,0xb2, +0xf9,0x0e,0xbc,0x8f,0x3b,0xb1,0xc3,0x1b,0xf9,0x46,0x13,0xd0,0x3c,0x64,0x1a,0x46, +0xb1,0x4d,0xa8,0x1d,0xdf,0x34,0x41,0x78,0xea,0x0f,0xe3,0x82,0xac,0x6f,0x4c,0x05, +0x13,0x51,0xcc,0x81,0x4f,0x10,0x95,0x48,0x5e,0x1d,0xd5,0x20,0x36,0x12,0xcc,0x4c, +0xda,0x53,0xf3,0xab,0x29,0x73,0xeb,0xb1,0x6d,0xaa,0xe7,0x4f,0xf2,0x7c,0xbd,0xb1, +0x3e,0x50,0x15,0x78,0xb0,0x73,0xea,0x25,0x8b,0x2d,0x55,0xdd,0xe5,0xff,0x52,0xf4, +0xa7,0x71,0xd2,0xf0,0x58,0xe3,0x19,0x95,0x08,0x23,0x60,0x77,0x50,0x2c,0x0c,0xdc, +0xa0,0xf3,0x7c,0x2b,0xd3,0x6b,0x8f,0xe0,0x51,0xf7,0x6f,0x77,0x46,0x35,0x74,0x2f, +0xc2,0x8a,0x33,0x13,0x35,0x17,0x9c,0xb6,0x65,0xa6,0x4d,0x51,0x9a,0xbf,0xa7,0xa3, +0x55,0x73,0xb8,0x2f,0x31,0x3b,0xed,0xd1,0x74,0x14,0x85,0xc8,0x94,0x77,0x32,0x55, +0xe5,0x45,0x02,0x15,0xe5,0x2c,0xee,0x75,0xa1,0xa5,0xcb,0x97,0x08,0xda,0x78,0xcf, +0xfe,0x12,0x2a,0x09,0xcf,0xc5,0xfa,0x3a,0x2c,0x52,0xfe,0xce,0xc3,0x76,0x57,0xb1, +0x8c,0xe6,0xd8,0x1e,0xd7,0x7f,0x18,0x78,0x25,0xf4,0x61,0xd2,0x0f,0xa6,0x83,0x74, +0xa0,0x5b,0x17,0x92,0xda,0x8e,0x10,0xda,0xb8,0xdc,0xaf,0x47,0x45,0x8b,0x75,0xf9, +0xaf,0x00,0x4f,0x1c,0x1c,0x3b,0x1c,0xfe,0x2b,0x3b,0xa0,0x14,0x02,0xe6,0x26,0x7f, +0xec,0x11,0x15,0xaa,0x09,0xdd,0x3e,0x8a,0x95,0x52,0x98,0x49,0x89,0xf7,0xe7,0xa6, +0xbe,0x1b,0xc8,0x36,0x3d,0x3f,0xd7,0x86,0xea,0x50,0x84,0x6f,0x09,0x88,0xbc,0xee, +0x0b,0x61,0x07,0x5d,0x06,0x45,0x6f,0x17,0xec,0xc7,0xcf,0xd4,0x11,0x3a,0xb9,0x5f, +0x0a,0x80,0x47,0xaf,0x84,0xbf,0xe0,0xbb,0x4a,0xaa,0x7f,0x03,0x02,0xfe,0x75,0x64, +0x02,0x33,0x24,0xfb,0x1c,0xe1,0x34,0x06,0xa5,0x3f,0x14,0x44,0x52,0x33,0xac,0xef, +0x0d,0xc0,0xf0,0x13,0x05,0xa5,0x3c,0x37,0x3a,0xe1,0xed,0xb2,0x5b,0xaf,0x28,0x44, +0x52,0x88,0xf8,0x3e,0x31,0x7b,0xf1,0x4e,0x60,0x35,0x12,0x39,0xe6,0x16,0x70,0x2a, +0x20,0x7c,0x29,0xff,0xe9,0xee,0xa9,0xb7,0xcb,0x97,0x80,0x75,0x74,0xde,0x26,0x01, +0x00,0xc6,0xe8,0xb6,0x1e,0xeb,0x4c,0x59,0x40,0x86,0x30,0xe2,0xa0,0xe9,0xa8,0xc6, +0x09,0xc7,0xb1,0xf3,0x11,0x27,0x79,0x14,0x27,0x97,0xfa,0x04,0x64,0xed,0x5e,0xc7, +0xc4,0x94,0x71,0xaf,0xf0,0xeb,0x15,0x9c,0xb1,0xc6,0x31,0xda,0x30,0xee,0x72,0x1f, +0x05,0x60,0x5c,0xba,0xdf,0xe5,0xb9,0xf7,0x0d,0x78,0x01,0x53,0x76,0x58,0x7b,0x2e, +0xa9,0x71,0xdc,0xbe,0x7f,0xde,0x3a,0x2f,0x33,0xe8,0x9a,0x4c,0xe9,0xe4,0xea,0x9e, +0x34,0xcb,0x61,0xe5,0x1b,0x12,0xc5,0xbe,0x26,0xb6,0x7a,0xaf,0xd4,0xab,0x7b,0x2f, +0xbf,0x4b,0xb5,0xbf,0x9a,0xe8,0xa3,0xc3,0xa8,0x87,0x8b,0x40,0x5d,0xe7,0x7c,0x53, +0x02,0x5d,0x37,0x9b,0xd7,0x56,0x84,0x4b,0xc5,0xc2,0x7b,0x44,0xdb,0x69,0x80,0x34, +0xad,0xe9,0x26,0x14,0xff,0xd7,0x29,0x6a,0x48,0xb7,0xa9,0x6e,0x58,0x97,0x15,0xde, +0x01,0xc3,0x2a,0xde,0xc6,0x50,0xc5,0x38,0xee,0x8f,0xfa,0xfa,0x60,0x71,0xdc,0xa9, +0x6f,0x11,0xe1,0xa1,0x25,0xb1,0x58,0x15,0x4f,0xc3,0xd8,0x4b,0x25,0x75,0xc7,0xdf, +0x85,0x75,0xc3,0x3d,0xac,0xec,0xbb,0xc5,0x6e,0x30,0x17,0x00,0x15,0x9e,0xb4,0xe4, +0xd3,0x6d,0xa4,0x86,0x34,0x3d,0x7c,0xa7,0x1b,0xf0,0xe5,0x5c,0x72,0x32,0x75,0xa6, +0x80,0x47,0x18,0x74,0xfd,0x32,0x74,0x33,0x8c,0x41,0xa3,0x46,0x6b,0x50,0x89,0x1d, +0xa7,0xa2,0xc5,0x30,0x72,0xbd,0xa5,0x27,0xa2,0xe2,0x74,0xb6,0xc2,0xd7,0x25,0x96, +0xda,0xb3,0x7c,0xe4,0x83,0xdf,0x4f,0xb6,0xb9,0xc8,0xef,0x33,0xf3,0x17,0xd0,0xa0, +0xdd,0xf1,0x24,0x42,0x9f,0xf6,0x75,0x1e,0x66,0xcf,0xec,0x1d,0x87,0x77,0xc0,0x5d, +0xd8,0x48,0xb5,0x96,0x54,0x95,0xbc,0x76,0xad,0x6a,0x46,0xc7,0xd6,0x8a,0x5d,0x3d, +0x0a,0x9b,0xa3,0xce,0xb7,0x16,0x23,0x85,0x86,0x84,0x10,0x1d,0xc5,0x60,0x8c,0x2d, +0x5e,0x11,0x15,0x3f,0x91,0xfa,0x26,0xf3,0xe1,0xac,0x3d,0x1e,0xdb,0xec,0xb6,0xf9, +0x30,0x91,0xc0,0x3f,0x3f,0x13,0xa5,0x2e,0x6a,0x5c,0x49,0x52,0x7c,0x73,0x96,0x65, +0x1e,0xea,0x6e,0x1a,0xf1,0x46,0xd9,0xfa,0x61,0x22,0x7e,0xa9,0x86,0x62,0xb3,0xbb, +0xc0,0x85,0xfd,0x02,0xd4,0xe9,0xc8,0xd8,0xfc,0xb4,0x72,0x9e,0x96,0xb8,0x97,0x65, +0x50,0xf5,0x74,0x9f,0xde,0x29,0x3b,0x9f,0xde,0xba,0xbf,0x3b,0xc2,0x67,0x66,0x31, +0xdf,0x1a,0x19,0x09,0xf4,0x6c,0x5d,0x94,0xef,0xd1,0xfb,0x88,0x9c,0xbc,0x74,0x5e, +0x21,0x01,0x59,0xc2,0x54,0xec,0x7b,0x06,0x6f,0xc6,0xa7,0xb7,0xda,0x7d,0x67,0x31, +0x4f,0xe5,0xef,0xcb,0x3e,0xfe,0xc8,0xa9,0x4f,0x2b,0x73,0x29,0xca,0xbf,0xaf,0x5e, +0x28,0xdd,0xef,0xc0,0x83,0x12,0x29,0x9d,0x8f,0x89,0x07,0xdb,0xff,0xff,0xa8,0x31, +0x33,0xc5,0xfe,0x29,0x9f,0x8d,0x2d,0xa4,0x46,0xd1,0xda,0xcb,0xf3,0x6d,0xf7,0xf6, +0xe8,0x10,0xa8,0xfe,0x78,0x50,0xe7,0xc1,0xe2,0x01,0x10,0x04,0xb0,0x6e,0xb9,0xf2, +0xb0,0x89,0x92,0x96,0x87,0xa9,0x29,0xdf,0x6c,0x4f,0xdb,0xde,0x73,0x64,0xa5,0x82, +0x8e,0x0b,0xe8,0x55,0x95,0x6d,0x24,0x03,0xa1,0x4a,0x2d,0xd7,0x53,0x6b,0x80,0xa8, +0x7a,0x02,0xe8,0x26,0xab,0x28,0x82,0x91,0x7e,0xa1,0xea,0xd4,0xda,0xcb,0x5f,0xd2, +0x06,0xb5,0x75,0x16,0xb2,0x88,0x4f,0x47,0x28,0x94,0xe0,0x9f,0x33,0x45,0xc9,0x48, +0x84,0x1d,0xf9,0x2b,0x13,0x2b,0x0f,0x59,0xe3,0xed,0x75,0x41,0x39,0x02,0x89,0xb9, +0xfb,0xfc,0x9d,0x12,0x9d,0xb8,0x41,0x62,0xf7,0x56,0xa6,0x07,0xfd,0xf8,0x06,0x2c, +0x8a,0xef,0x94,0xac,0x70,0x8a,0x6c,0x2e,0xa1,0x47,0x26,0x3c,0xfb,0x6e,0x9e,0x3f, +0xa8,0x8e,0xbd,0x98,0x7f,0xe6,0x22,0xc2,0xe5,0x44,0xfa,0x7d,0xdd,0x64,0xd9,0x6b, +0x6a,0x5f,0x93,0x81,0x9a,0x31,0x41,0x1e,0x23,0x2e,0x1b,0x41,0x39,0x65,0x45,0x85, +0x25,0x06,0x8a,0x99,0xf7,0xca,0x64,0xc8,0x6a,0x0b,0x91,0x39,0x7a,0xe0,0x58,0xcc, +0x54,0x51,0xfc,0xe8,0x14,0x93,0x6c,0x40,0x6b,0x5f,0x42,0x2b,0x80,0xf1,0xb5,0x0a, +0x05,0x6f,0x0a,0xe9,0x9c,0x41,0x25,0x0a,0x21,0xfc,0xfa,0xf6,0x7f,0xe6,0x23,0x0d, +0xc4,0x03,0xd5,0x2f,0x65,0xb3,0x6d,0x55,0xaa,0xce,0xc9,0x6f,0x69,0xe5,0x01,0x5c, +0xa9,0x02,0xf5,0xf9,0x41,0x50,0x20,0x88,0xca,0x4f,0x33,0x41,0x30,0x2b,0xa8,0xa4, +0xc1,0xbf,0xbc,0x54,0xce,0x3f,0x91,0xe7,0x81,0xf6,0xc1,0x46,0xf2,0x73,0x46,0xa0, +0xd6,0x2e,0x84,0x76,0x9d,0xba,0x7a,0x9d,0x8a,0x20,0x19,0x56,0xf3,0x72,0x10,0x72, +0x94,0xbf,0xe5,0xc1,0x91,0xb9,0x06,0x52,0x90,0xdf,0xd2,0x47,0x72,0x71,0x2b,0xb9, +0x02,0x96,0x09,0x77,0x33,0x7b,0x23,0x89,0x89,0x02,0x0b,0x57,0x73,0x5b,0xcc,0xc9, +0x24,0x0f,0xfd,0x7c,0xc1,0x2f,0xc7,0x13,0x16,0x89,0xec,0x0f,0xcd,0xc9,0x1c,0xb2, +0x67,0x13,0x7f,0xe9,0xcf,0x36,0x1a,0xd8,0xe3,0xd9,0xc7,0x7e,0x57,0x7a,0x97,0xbe, +0x2f,0x74,0xb1,0x41,0xb8,0xf8,0x03,0xd8,0x09,0xe7,0x30,0x15,0x72,0x69,0xc5,0xc8, +0xa5,0x0c,0xf7,0x2f,0x48,0x2c,0x63,0xd8,0x2b,0x06,0x84,0xed,0x56,0xa8,0x58,0x6a, +0x2c,0x9d,0x4f,0xfe,0x9b,0x3e,0x68,0x84,0x81,0x29,0x2f,0xce,0x3b,0xc7,0x30,0x7a, +0x4b,0xed,0x06,0x9e,0x98,0xb3,0x1b,0xba,0xef,0xf4,0x5e,0x54,0x74,0x7f,0x15,0x51, +0x43,0x5e,0x0f,0x59,0x1b,0x3c,0x41,0x80,0x03,0x6b,0xef,0x2f,0xf1,0x47,0xb8,0x9f, +0x42,0xaa,0x50,0x7f,0x15,0x36,0x0e,0x3d,0x87,0x2c,0x17,0xb9,0x58,0xf1,0x94,0xec, +0x2c,0xff,0xb2,0x48,0x54,0xdd,0x2e,0xda,0xa2,0x53,0xd7,0x8a,0x5e,0xdd,0xb5,0x2b, +0x13,0xb0,0x86,0xd5,0x08,0x1a,0x0a,0xbf,0x65,0x02,0x7e,0x8e,0x19,0xda,0x23,0xba, +0xe9,0x9f,0x6b,0x49,0xb0,0xc4,0x03,0x1a,0xcc,0xf3,0xef,0xdd,0x45,0xd1,0x83,0x49, +0x40,0x4e,0x0f,0x59,0xb5,0x3f,0x61,0x5d,0xe5,0x20,0xa1,0xfa,0x5a,0xa0,0x52,0xd3, +0x1e,0xe5,0x4c,0x82,0x1e,0x5a,0x0d,0x10,0x24,0x49,0xb4,0xa2,0x67,0x78,0x48,0xa5, +0x76,0x8c,0x38,0x51,0x31,0xa7,0x6a,0x05,0xae,0xa5,0xb2,0x26,0xf6,0xec,0x19,0xb1, +0x30,0x00,0xa9,0x06,0xb0,0xcc,0x4f,0x25,0x2d,0xcd,0xd1,0x87,0x68,0xef,0xd2,0x34, +0x24,0x7c,0x21,0x6f,0x74,0xac,0x01,0xdd,0x69,0xce,0xb3,0x77,0x76,0xee,0xe2,0xc0, +0x03,0xa4,0xde,0xe7,0xc4,0xfb,0x56,0x4b,0x4f,0xb1,0xca,0xd6,0x82,0x4b,0x42,0xd7, +0x09,0xe7,0x28,0x02,0x2e,0xab,0xeb,0x4c,0x3f,0x87,0x87,0x04,0x35,0xa6,0xa1,0xab, +0xe0,0x7b,0xbe,0x27,0xe5,0x13,0x62,0x4d,0xfa,0x33,0x55,0x05,0xb6,0xe6,0x23,0x52, +0xa5,0x8a,0xd1,0xb8,0x14,0xaa,0xe6,0xc7,0x2e,0xf6,0x82,0x0c,0xb6,0x87,0x42,0xbd, +0x3b,0x85,0xc2,0x4a,0x25,0xea,0x9e,0xb1,0xb7,0x95,0xf8,0xc1,0xff,0xee,0x12,0x67, +0x2c,0x49,0x8e,0x7c,0x5e,0x16,0x44,0x02,0xb4,0x1f,0xc2,0xbc,0x7f,0x49,0xb8,0xeb, +0x80,0xef,0xfa,0xb2,0x1e,0xe2,0x50,0x70,0x41,0x3c,0x3b,0x38,0xbf,0xca,0x83,0x8b, +0x08,0x19,0xd3,0x9d,0xbf,0xde,0x45,0x16,0xef,0x26,0x81,0xdd,0x5f,0xe8,0xe0,0xc8, +0x0b,0x2c,0x1b,0x8c,0xbf,0x93,0xb2,0xdf,0xd8,0x6d,0x8c,0x68,0x8e,0x88,0xe2,0xce, +0xae,0x72,0x7d,0xa1,0xaa,0x7e,0x2c,0x57,0xa4,0xbc,0xa4,0x9c,0x1f,0x40,0xa3,0xa3, +0xe8,0x88,0x8b,0x2d,0x2d,0xd3,0x60,0x98,0xbe,0x13,0x63,0xed,0x5f,0xb3,0x3b,0x39, +0xcb,0x89,0x10,0x34,0xe5,0x10,0xbb,0xce,0x5d,0x6e,0x69,0x7b,0xd9,0x7e,0x83,0xbe, +0x53,0x75,0xee,0x78,0x97,0xb6,0x0c,0x58,0xc8,0xdd,0xcb,0x44,0xf6,0xb8,0xec,0x63, +0x1d,0x1c,0x51,0x74,0x94,0x3b,0xc7,0xc9,0x6b,0x2e,0xc4,0x34,0x70,0xa1,0xfa,0xe3, +0x5c,0x83,0xad,0x03,0x15,0x38,0x4a,0xd9,0x69,0xb0,0x37,0xc5,0xb7,0x4d,0x50,0xe0, +0xe6,0x12,0xd2,0x75,0x19,0xbe,0x91,0xc0,0xd1,0x25,0x85,0x67,0x0e,0xfc,0x5a,0x12, +0x4d,0x9b,0xe4,0x39,0xc9,0xf5,0x2b,0x82,0x15,0x61,0x40,0x84,0x89,0xb5,0x52,0x30, +0x11,0x0a,0xff,0xe9,0x4f,0xc9,0xbc,0xa6,0x5e,0xce,0xd6,0x1c,0x34,0xfa,0xe5,0xf1, +0x9a,0x29,0xdd,0x34,0x94,0x63,0xaa,0x83,0x91,0x33,0x35,0xfa,0xc2,0x2b,0x53,0xff, +0x6f,0x1d,0x52,0x98,0x22,0x6a,0x09,0x77,0xed,0x19,0xd4,0x88,0x36,0x7d,0xdd,0x75, +0x95,0xf4,0xec,0x31,0x9f,0xb5,0x08,0x83,0xba,0xd2,0xd6,0xea,0x28,0xf5,0xbd,0x9c, +0xe5,0x28,0xa6,0x1a,0x9c,0x33,0x01,0x29,0x59,0x76,0x36,0xbf,0x7b,0xe2,0xc0,0x4b, +0xcd,0x3e,0xed,0x50,0x1f,0xbc,0xb7,0x6d,0x84,0xb6,0xfd,0x54,0x5f,0xfc,0x8b,0x6a, +0x0e,0xdb,0x54,0x7d,0x11,0xb6,0x2c,0xc1,0x27,0xea,0xa8,0x3d,0xf8,0x5b,0x1e,0xf8, +0xe6,0x93,0x4f,0xbc,0x85,0xa3,0x2f,0x4d,0xcb,0x03,0x71,0xa6,0x5a,0x77,0xb8,0x68, +0x10,0x94,0x78,0xcf,0x53,0x36,0x00,0x5a,0x5c,0xfa,0xc4,0x4e,0x95,0x52,0x6f,0x38, +0xa7,0xdc,0x77,0xad,0x41,0x6b,0x76,0x8d,0x3a,0x2f,0x80,0xd2,0x15,0xba,0xb6,0xec, +0xa9,0x66,0xe7,0xe3,0x54,0xfb,0xbf,0x4e,0x83,0xc2,0x5b,0xdb,0x9c,0x81,0x93,0xf3, +0x84,0x8d,0x67,0xc4,0x40,0x84,0xe8,0xc2,0xec,0x4f,0xc9,0x71,0xf5,0xe0,0x98,0xb5, +0x69,0x0c,0xb2,0xef,0x6e,0x01,0x86,0xf7,0x8b,0x0b,0x67,0x10,0x62,0x89,0x53,0xb2, +0x6b,0x66,0xc9,0x6d,0xaf,0x02,0x37,0xe0,0xad,0xef,0xcf,0xc7,0xc0,0xe7,0xf6,0x63, +0xaf,0xdc,0x49,0x7c,0xfb,0x83,0x11,0x35,0x69,0x21,0x21,0xca,0xee,0x9c,0x80,0x34, +0x80,0x59,0x65,0x41,0x95,0x32,0x2e,0xf2,0x96,0x92,0x14,0x6a,0x53,0x04,0x36,0x65, +0xaf,0x08,0x3f,0xe9,0xdb,0xf2,0x06,0xea,0x47,0xb0,0x18,0xca,0xf2,0x9a,0x81,0xc5, +0xf2,0x0b,0x91,0xdb,0x69,0x82,0xf6,0xfe,0x29,0xf0,0x8f,0xd5,0xda,0x24,0x37,0x79, +0xeb,0x56,0x1a,0x46,0x69,0x94,0xf9,0x4f,0x4f,0x93,0xee,0x7c,0xd5,0xdc,0xbd,0x38, +0x29,0xf7,0x1c,0x0f,0xd4,0x2e,0x34,0x75,0x79,0xe5,0xa8,0xd7,0x5e,0x72,0xbd,0xb8, +0xfa,0xb6,0x42,0xf4,0x1d,0x6b,0x52,0xf8,0xb5,0xa0,0x14,0x5a,0xa6,0x72,0xb8,0xb9, +0x16,0x4b,0x20,0xff,0x9e,0x90,0x0a,0xee,0x02,0x40,0xe1,0x32,0xbc,0x71,0xf0,0x9d, +0x8b,0x43,0xcf,0x1a,0x1b,0xff,0xc0,0x39,0x31,0xc1,0xf8,0x4b,0x9b,0xd4,0x3c,0x64, +0xe3,0xed,0xe4,0xf6,0x68,0x88,0xe0,0x77,0xa6,0xe7,0x4e,0x13,0xe5,0xc1,0xf3,0x48, +0xb0,0xf2,0x2c,0x2e,0xf0,0x8b,0xda,0x3e,0xd9,0x19,0x9c,0xca,0xd4,0x10,0x15,0x60, +0x61,0x3f,0x12,0xdb,0x52,0x5d,0x65,0x6d,0xa1,0xcb,0x50,0x94,0xd6,0x2c,0x90,0x59, +0x7b,0xee,0x95,0xcf,0x9f,0xda,0x78,0x76,0x13,0xe4,0x3c,0x0f,0x0d,0x67,0x05,0x66, +0x04,0x9b,0x0b,0x00,0x32,0x8c,0x8a,0xd3,0x23,0xdf,0x0e,0x2a,0xfd,0x8d,0x36,0x20, +0xcb,0xbe,0x11,0x16,0xb1,0x9a,0x43,0x4f,0x67,0x68,0x18,0x49,0x86,0x30,0x6a,0xbd, +0x4b,0x56,0x3a,0xb5,0xb4,0x9d,0x17,0x5e,0x01,0x2d,0xf2,0xdb,0x22,0x7a,0xa9,0xb5, +0x23,0x1b,0xb5,0x6a,0x93,0x3e,0x4b,0xc2,0xee,0xd1,0x1c,0xb7,0x1c,0x68,0xd7,0xfe, +0x5a,0xa1,0x2c,0x4e,0x10,0xe2,0xd4,0xfe,0x86,0xa0,0xea,0xfc,0x13,0x14,0xc8,0x54, +0x29,0x71,0x3b,0x27,0x4d,0x98,0x02,0xc2,0x67,0x19,0xd8,0x1c,0x41,0x37,0x56,0xfb, +0x9e,0x0d,0xba,0xb6,0xcc,0x97,0xe3,0x10,0x0a,0x16,0xcd,0xe0,0x99,0xf5,0xea,0xed, +0x77,0xa6,0x1e,0x64,0x45,0x98,0x3c,0xff,0x33,0x23,0x1d,0xe7,0x04,0xfc,0xf0,0x78, +0x20,0x17,0x87,0x64,0xea,0x75,0xe9,0xdb,0x6f,0x34,0xf5,0xda,0x3a,0x27,0x3f,0x38, +0x39,0x58,0x17,0xe3,0xb4,0x5b,0xd6,0xcd,0x88,0x26,0x5a,0x38,0x1c,0x7f,0x97,0xeb, +0xdf,0x1a,0x2b,0x1e,0x8d,0x95,0xf0,0x69,0xb8,0xfe,0x2e,0x6a,0x66,0x72,0x6f,0x2a, +0x12,0x90,0xdf,0xff,0xa9,0x20,0x40,0xb8,0x15,0xd1,0x5f,0xc9,0x6f,0x17,0x61,0xf0, +0xfa,0x6d,0x15,0xbf,0x40,0x9f,0x71,0x19,0xf6,0xbe,0x13,0xd1,0x7c,0x3e,0xe3,0xa7, +0xb6,0x41,0x9d,0x6d,0xc9,0x92,0x21,0x8a,0x80,0x9b,0x5a,0x0d,0x19,0x5d,0xf4,0xe0, +0x56,0x4f,0xb0,0x3e,0xc0,0x93,0xbf,0x63,0xc8,0x88,0x71,0xaa,0x2c,0x76,0xf4,0x97, +0x4a,0x20,0x9c,0xe2,0xc5,0xea,0x21,0x6e,0x80,0xf9,0x00,0xfc,0xfd,0x06,0x9b,0x26, +0xa7,0xe5,0xda,0x82,0x4f,0x7a,0x6b,0x22,0x42,0x30,0x6d,0x27,0x52,0xfa,0x24,0x6c, +0xa4,0x09,0x68,0x96,0xcc,0x5c,0xc7,0x48,0x33,0x83,0x14,0x59,0x9f,0x20,0x7b,0x1e, +0x27,0x84,0x15,0x83,0xcf,0xe8,0xa0,0x5c,0xac,0xdb,0xc3,0x68,0x29,0x9e,0xa9,0xf1, +0xa1,0x85,0xbb,0x13,0x7e,0xfa,0x76,0x0a,0x32,0xa6,0x55,0xa5,0xd9,0xeb,0x57,0x6a, +0x00,0x74,0x40,0x78,0x9a,0x70,0xd5,0xe3,0xc1,0xd2,0x74,0x97,0x34,0xc4,0x56,0x6e, +0x7b,0x2a,0x8f,0x52,0x7c,0x33,0xa9,0xe4,0x8f,0xb6,0x38,0xf2,0x62,0x3a,0xf0,0x31, +0x75,0x39,0x02,0x58,0x48,0x0d,0x21,0xfd,0x3d,0x62,0xa8,0x43,0x73,0x19,0xfa,0x20, +0xff,0x54,0x69,0x49,0x73,0x53,0x9f,0x01,0x2c,0x61,0x99,0xc0,0x89,0xea,0x50,0x12, +0xad,0x77,0x62,0xd7,0x41,0xb3,0x0a,0xd5,0x4a,0xc1,0x36,0xd3,0xab,0xa9,0xc6,0x85, +0x29,0x84,0xca,0x00,0xae,0xeb,0xf2,0xda,0x71,0x64,0xdc,0x0a,0x5e,0x8b,0x43,0xb8, +0x2f,0x87,0x23,0x8b,0x96,0xce,0x10,0x58,0xa1,0x63,0x89,0xc1,0x69,0x86,0x54,0x65, +0x2a,0x36,0xe4,0xc3,0x9b,0x11,0x77,0x5b,0x99,0x64,0x7b,0x4b,0x5f,0xa9,0x1c,0x73, +0xf7,0x2f,0x54,0xbf,0xf6,0xec,0x2c,0xf8,0x4a,0x39,0x8d,0x10,0xd3,0x5a,0x3c,0x77, +0xe4,0xfc,0x8b,0x50,0xcf,0xd9,0x99,0x65,0x91,0x66,0xfe,0x0d,0x43,0x83,0x70,0xb8, +0xfe,0x13,0xbd,0x7d,0x9a,0xe2,0xd3,0x55,0x42,0x1a,0xbb,0x6a,0xb5,0x6d,0xea,0x59, +0x7d,0x7a,0xcc,0xae,0x03,0x6d,0x1c,0x7f,0xa4,0x59,0x99,0x6f,0xdc,0x2f,0x0f,0x60, +0x88,0x1d,0x47,0xe0,0xb9,0x16,0xf4,0xcb,0x0e,0x74,0x0b,0x3d,0x81,0x66,0xca,0x10, +0xf1,0x1e,0x6c,0xe2,0x99,0xaa,0x1c,0x99,0x8c,0x29,0x2c,0x3a,0xf5,0xec,0x5d,0xa7, +0xa2,0x09,0x38,0x74,0x89,0xf3,0xfd,0xd6,0xac,0xcb,0xbd,0xa2,0x8b,0x2d,0xed,0x12, +0x00,0x93,0x19,0x13,0xd0,0xcd,0x25,0xbe,0x0e,0xca,0x87,0x44,0xcd,0x5c,0x1d,0xfd, +0x52,0x41,0x37,0xfd,0x4c,0x2b,0x75,0x11,0xa4,0x21,0x44,0x99,0x57,0x94,0xfc,0x15, +0x25,0x60,0x7c,0xa4,0xdc,0x36,0x9f,0xed,0xb9,0x7a,0x6e,0x72,0x71,0xcc,0x72,0x47, +0xa4,0x2a,0x8d,0x05,0x30,0x43,0xd5,0xdd,0x6a,0x02,0xab,0x57,0xfe,0xed,0x69,0x94, +0x26,0x99,0xb4,0x7b,0x12,0x30,0x1a,0x02,0x35,0x97,0x02,0x1f,0xfe,0xba,0x26,0x8a, +0x2c,0x9e,0xee,0x8b,0x43,0x47,0xeb,0x55,0x8d,0x67,0x27,0x5d,0x08,0x57,0x96,0x9a, +0x2d,0x99,0x6e,0xea,0xa6,0xb1,0x68,0xc9,0x2e,0x5b,0x2b,0x90,0x19,0xa4,0x84,0x61, +0xaa,0xb8,0x37,0xaf,0x84,0xf8,0xe8,0x54,0xea,0xe3,0xa0,0x5c,0x8c,0x55,0x2f,0xe9, +0x2f,0x4f,0x2b,0x62,0x4a,0xfa,0xc0,0xc8,0xee,0xb7,0x53,0x30,0xfe,0x08,0xc5,0x66, +0xf2,0xef,0x66,0xc2,0x38,0xfe,0xd5,0xdc,0xb2,0x39,0x89,0x6a,0x05,0x95,0x54,0x29, +0xe9,0x32,0x02,0x41,0x3e,0xdd,0xfe,0xbc,0xfd,0x89,0x7a,0x0f,0x1d,0xdd,0x40,0xcd, +0x7e,0xfa,0x83,0x30,0x57,0xae,0x09,0xd8,0x85,0x5b,0x37,0x7e,0x03,0xf4,0x89,0x2a, +0x65,0x8f,0xb1,0x6f,0xb7,0xfd,0x5c,0xf4,0x37,0x74,0x48,0x4f,0xdb,0xff,0x59,0x2d, +0x73,0x00,0x88,0x81,0xb1,0xaa,0x3b,0x53,0x74,0xc0,0xda,0xce,0xf3,0x66,0xd7,0x00, +0x07,0xc3,0x75,0xf6,0x93,0x22,0x38,0x93,0xa0,0xee,0x77,0xd6,0xd3,0x29,0xd8,0x3d, +0xbb,0xac,0xfe,0xe7,0x31,0xa8,0x6f,0x1d,0x88,0x13,0x47,0x80,0x71,0xe8,0x98,0x2e, +0x91,0xd6,0x3c,0x77,0xd0,0xa3,0x88,0x0e,0xf5,0xbe,0x81,0x47,0x72,0x06,0x0a,0xbb, +0x71,0x04,0xb8,0xc6,0x13,0xe6,0x99,0x9f,0xa3,0xc2,0x58,0x67,0xf3,0xec,0x59,0xa1, +0x71,0x45,0xba,0x2a,0xb0,0x40,0x4d,0xef,0xb6,0xcc,0xf8,0x16,0x12,0x61,0x9c,0x6d, +0xe9,0x75,0xfb,0xa7,0x10,0x2e,0x51,0x9f,0x4f,0xeb,0xd5,0x87,0x50,0x2e,0xfe,0x64, +0x77,0xc6,0x76,0xb7,0x11,0x0f,0x79,0x9b,0x2a,0x56,0xa1,0xf7,0xd6,0xad,0x03,0x33, +0x10,0x9d,0xfa,0x6e,0x5b,0x57,0xbe,0xba,0x08,0x42,0xea,0xae,0x5d,0xb2,0xf7,0x68, +0xbd,0x00,0xd0,0x01,0xba,0x2f,0x63,0x4e,0xbe,0xc2,0x90,0x38,0xfa,0x6f,0x06,0x8d, +0xc2,0x09,0xfb,0x8f,0xba,0x28,0x87,0xd9,0xf4,0xbb,0x91,0xcf,0x74,0x67,0x88,0x76, +0xe8,0x7c,0xdb,0x33,0x38,0xa1,0x8e,0x08,0xfd,0x54,0x13,0xd1,0xba,0x4b,0x82,0x20, +0x7b,0xa1,0x62,0x2e,0x5b,0x6c,0x48,0x6a,0xd8,0x46,0x88,0x69,0xf9,0x6a,0xe6,0x2a, +0xc1,0x3c,0xc1,0xde,0x1e,0x74,0x58,0x9e,0xc6,0x56,0x52,0x1c,0x38,0x96,0x52,0xe9, +0x67,0x4f,0xbb,0x3f,0x9c,0x35,0x55,0x81,0xb9,0x03,0x5b,0xa1,0x79,0x68,0x35,0x70, +0x6a,0xa9,0x91,0x5c,0x38,0x29,0x3f,0x1f,0x01,0x3e,0xa3,0x5a,0xb8,0x90,0x4c,0xc8, +0x43,0x62,0xbc,0xd4,0x31,0x3f,0x6a,0x8c,0x03,0x21,0xec,0xc6,0x31,0x30,0xaa,0x7f, +0xdc,0x7f,0x86,0x9c,0x92,0x54,0xe3,0x50,0x67,0xfc,0x5b,0xda,0xf3,0x92,0x13,0xad, +0xa6,0x50,0xe5,0x25,0xf8,0x3f,0x03,0x8d,0x53,0x9f,0xed,0x58,0x47,0x30,0xe8,0xd1, +0xb1,0xef,0xd7,0x88,0x12,0x35,0x1c,0x4a,0xe7,0xd1,0x8f,0xc7,0x52,0x16,0xd5,0x53, +0x33,0x1e,0xbc,0xa6,0x73,0xb4,0xc5,0x02,0xce,0xf9,0xd6,0x06,0xf0,0x3c,0x6a,0xe4, +0xaf,0xb8,0x96,0xd5,0x90,0x33,0x02,0x12,0x67,0xd0,0x07,0xaa,0x0c,0x9d,0x0b,0xd2, +0xce,0x52,0xbd,0x47,0xb7,0xb7,0xc0,0x03,0x0b,0xdc,0x40,0x75,0x51,0x37,0x07,0x41, +0xe0,0xc8,0xc5,0xb2,0x10,0x31,0xee,0x13,0x8b,0xb6,0x00,0xfd,0x12,0xc8,0xbb,0xd7, +0xc1,0x49,0xd6,0x81,0x99,0xb2,0x30,0xd3,0xcb,0xf5,0xcc,0x53,0xdb,0x1d,0xa2,0x17, +0x2a,0x09,0xca,0x6c,0x63,0x36,0x7f,0xc3,0xca,0x5d,0xc4,0x43,0xda,0x7f,0x05,0x7a, +0x94,0xc7,0xff,0x6f,0x3a,0x39,0x12,0x52,0xee,0xd8,0xcd,0xb8,0x5b,0x1f,0xa4,0xf6, +0x7c,0xb6,0xef,0xd9,0xb6,0x36,0x5a,0x49,0xff,0xaa,0xcf,0x99,0x18,0x74,0x18,0x2a, +0x2e,0x5e,0xce,0xeb,0x99,0x3a,0x28,0xdd,0x9f,0xff,0x16,0x15,0x51,0xf1,0xfa,0xba, +0xd4,0xb9,0xae,0x9c,0xd4,0x30,0x4d,0xd9,0x8c,0x1c,0x4f,0xba,0x43,0x7b,0x87,0xf1, +0x0b,0xc1,0xcf,0x6a,0x5b,0x31,0xc5,0x1a,0x8e,0xfe,0x8e,0x77,0x1d,0x32,0xd9,0xdf, +0x63,0xde,0xc5,0xdc,0x18,0x39,0x3f,0xbd,0x27,0xd2,0xff,0xa1,0x5a,0x1d,0x38,0x0b, +0xb9,0x09,0xd8,0x56,0x58,0xaf,0x8a,0xd9,0xcb,0x16,0xc8,0xa4,0x51,0xdb,0x5a,0xbc, +0x5d,0x0c,0xac,0xf4,0x97,0xa2,0xaf,0xd8,0x80,0x7c,0x82,0xd4,0xd7,0xa9,0x94,0x63, +0xc4,0xff,0xc1,0xa7,0xde,0x29,0x39,0x3e,0xa7,0xb3,0xc9,0xa5,0xd1,0x19,0x57,0x3e, +0x6e,0x12,0x6d,0xe7,0xd9,0xac,0x93,0xc3,0xf9,0x62,0x62,0x27,0x76,0xe5,0x71,0xb1, +0x36,0xea,0xe8,0xc3,0xb7,0x2c,0x4e,0x4e,0x27,0xc0,0x88,0xe4,0x74,0x91,0x56,0x7e, +0x66,0x81,0xea,0xb4,0x95,0xad,0x62,0x70,0x8d,0xca,0x98,0x32,0x58,0xe8,0x5f,0x6a, +0x4c,0xf7,0x61,0xa5,0x37,0x2e,0x0f,0x81,0xd4,0x8b,0xc9,0xb7,0x28,0xe9,0x10,0x20, +0xb7,0x0e,0x29,0x35,0xd6,0x87,0x31,0x6b,0x2e,0x96,0xf3,0x73,0x74,0xea,0x04,0x06, +0x74,0x2c,0xc2,0xae,0x4c,0x23,0xa3,0xc0,0x89,0x15,0x3a,0x2c,0xfd,0x62,0x10,0xe9, +0x39,0x24,0x65,0x7c,0x5c,0x89,0x3c,0x16,0xa4,0x98,0x6e,0x5c,0x1e,0x96,0xa2,0x37, +0x84,0x7d,0x27,0xed,0x1e,0xe2,0x99,0x36,0x4c,0x24,0x5c,0xcd,0x5e,0x09,0xba,0x5c, +0x47,0xdb,0xd3,0x9d,0xbf,0xde,0x49,0x2b,0x18,0x46,0xc3,0x5d,0x9c,0xcb,0x42,0xc0, +0x0f,0x4c,0x9a,0x69,0xbf,0x24,0x8a,0x62,0xa7,0xbd,0xf8,0x6f,0xfd,0xea,0x7f,0x77, +0x82,0x20,0xe2,0xbc,0x9d,0xa5,0x69,0x9c,0xa6,0x5c,0x82,0xfc,0x5a,0x74,0x45,0x63, +0xba,0x2a,0xf3,0xad,0x3f,0x26,0x8b,0x83,0x2a,0x63,0x7b,0x06,0xbd,0xce,0xfe,0xc8, +0x96,0x22,0x2b,0x3d,0xdc,0x10,0xbb,0x97,0x4b,0x62,0x83,0xfd,0xd6,0x09,0xb5,0x92, +0xcf,0x01,0xee,0x78,0x97,0xbd,0xf4,0x26,0xae,0x2f,0xd4,0xe6,0x65,0x70,0xec,0x16, +0x54,0xee,0x24,0x42,0xd4,0xbe,0x44,0xc4,0x05,0x87,0xe3,0x85,0x94,0x0e,0x7f,0x0c, +0xcc,0xc3,0xef,0x7c,0x17,0xb4,0xf5,0x33,0x2c,0x2f,0xcd,0xd5,0x0b,0xb0,0x12,0x54, +0x3b,0x9b,0xcd,0xd3,0xa2,0xbc,0xfd,0x37,0x60,0xde,0x3d,0x4e,0x5f,0x27,0xc0,0xa0, +0xd5,0xf1,0xec,0x70,0x97,0x3e,0x0c,0x60,0x63,0xa7,0x14,0xcb,0x56,0x85,0x57,0x6e, +0xcc,0x84,0x8c,0x96,0x91,0xb8,0x26,0xf6,0xc4,0xd3,0xdc,0x61,0xd6,0x79,0x5d,0xfe, +0x4d,0xa7,0x62,0x97,0x97,0xb9,0x0d,0x61,0xef,0x16,0x75,0xe4,0x46,0xf0,0x81,0xa0, +0x9f,0x31,0xa7,0xca,0xf6,0xb5,0x71,0xe3,0xa7,0xd8,0xb7,0xea,0x9c,0xf8,0x27,0xd1, +0x91,0x24,0xc6,0xca,0x53,0x33,0xc9,0x2e,0x2e,0xce,0x24,0xb1,0x10,0x75,0x39,0xe0, +0xa0,0xef,0x39,0xfc,0x7e,0x55,0x00,0x96,0x0c,0x59,0x12,0x2d,0x72,0xf1,0x19,0xa7, +0xec,0x35,0x32,0x6d,0x3e,0xb3,0x88,0x49,0xa4,0x8b,0xc9,0x97,0x15,0x6b,0x67,0x93, +0x7c,0xe6,0xa5,0x97,0x1e,0xb6,0x67,0xe9,0xc9,0xdd,0x3f,0xfe,0x62,0x56,0xaf,0x3a, +0xae,0x83,0x9e,0x4c,0x3f,0xbb,0x16,0xab,0x93,0x57,0x77,0xdc,0x1e,0xac,0x6c,0x32, +0xaf,0x99,0xd4,0x3c,0xbd,0xb5,0xc5,0x98,0x2e,0x9d,0xb4,0xe3,0x6d,0xb2,0x79,0xe3, +0x3c,0x96,0xbd,0xd2,0x1d,0xdb,0x71,0x09,0x6c,0xf6,0xae,0xbe,0x59,0xf3,0xae,0x9c, +0x4e,0x39,0x29,0xcf,0x1c,0xb9,0x07,0x99,0xae,0xff,0x9f,0xfd,0x2d,0xf2,0x59,0x54, +0xa7,0x4d,0x86,0x30,0xf9,0xe1,0x49,0xba,0xa4,0x2a,0x5c,0x11,0x84,0x71,0x0a,0x6f, +0x40,0x08,0x7f,0x66,0xfa,0xe0,0x41,0xaa,0xa5,0xcb,0x09,0x2f,0x6d,0x15,0xfe,0xd1, +0x23,0x09,0x2d,0x97,0x92,0x2a,0x31,0x35,0x8a,0x28,0x36,0x0c,0xf4,0x96,0xf1,0x93, +0x01,0x55,0xe9,0xa6,0xcb,0x2e,0xae,0xf4,0xb6,0x43,0x8a,0xc5,0xa9,0x92,0x70,0x2e, +0xa1,0x61,0xfd,0xd4,0xf9,0x0e,0x2e,0x67,0xe3,0x06,0x5d,0x79,0xd2,0x33,0xf3,0x30, +0x0f,0xae,0x68,0x26,0x71,0x82,0xd7,0xf4,0x4e,0x03,0x4f,0x9e,0xf6,0x6c,0xfc,0xa3, +0x69,0x25,0x9b,0x9b,0xe6,0x89,0xdd,0x6f,0x4d,0xeb,0xeb,0x9a,0xb1,0x42,0x1d,0xae, +0x85,0x2e,0x09,0x10,0x57,0x8a,0x51,0x75,0x6a,0x54,0xc0,0x85,0xd7,0x96,0x3a,0x5a, +0x4b,0xf8,0x7d,0x7f,0x7c,0x44,0x25,0xf8,0x3b,0x48,0x52,0x4d,0xb2,0x65,0x72,0x9a, +0x89,0x5f,0x06,0xaf,0xb8,0x86,0x0c,0x5a,0xb6,0x94,0x86,0xcf,0x2d,0xc2,0x01,0x8b, +0x66,0x1e,0x64,0xcd,0xc7,0x68,0xd3,0x34,0xfc,0xb7,0xed,0x89,0x55,0xcc,0x33,0xc9, +0xd5,0x8b,0x9a,0x3a,0x38,0x84,0xcf,0xc7,0x34,0xca,0x0c,0x20,0xea,0x4d,0x6f,0x2a, +0xf5,0xa1,0x0a,0xc8,0x17,0x0a,0x6c,0xa8,0x4c,0x24,0xac,0x6a,0xbb,0xef,0xc8,0xdc, +0x22,0x31,0xb4,0x98,0xf2,0xd5,0xf6,0xfc,0x46,0x41,0x21,0x8c,0x94,0x9c,0x17,0x8e, +0x54,0x06,0x8b,0x5d,0x23,0xae,0xf2,0xed,0xc7,0x91,0xa1,0x9e,0x56,0x63,0x75,0xf8, +0x28,0xa2,0x27,0xcf,0xcd,0x27,0x13,0x7d,0x62,0x5c,0xa5,0x7b,0x3a,0xec,0xd9,0x81, +0x40,0x76,0xe4,0xc6,0xc1,0x72,0x0c,0xa5,0x81,0xff,0x98,0x20,0x59,0x75,0xf5,0x14, +0x7d,0x33,0x38,0xf6,0xe0,0xec,0x22,0x84,0x41,0x5c,0x61,0xfa,0x84,0x2d,0x78,0xfb, +0xc2,0x16,0x09,0x2f,0x11,0xed,0x1e,0xd3,0x0b,0x93,0xad,0x5b,0x5c,0x7f,0x73,0x30, +0xe2,0xf3,0xa6,0x6a,0xca,0x13,0xd9,0x35,0xec,0x3d,0xc4,0x2d,0x54,0x8c,0x35,0x44, +0x0b,0xa3,0xa2,0x88,0x31,0x3c,0x6c,0x0f,0xef,0x16,0xb4,0x53,0x6c,0x79,0xa0,0x4f, +0x22,0xd5,0x37,0x26,0x12,0x96,0x62,0xad,0x65,0x3d,0xe4,0x0f,0xfc,0xa3,0x7d,0x3e, +0x4b,0x75,0x05,0xb0,0x9d,0x3b,0xd9,0xa6,0xe3,0x5d,0x2e,0x67,0x10,0x36,0x8d,0xb0, +0x59,0xba,0x97,0xd2,0xb5,0xde,0xfc,0x9a,0x5c,0x39,0xd5,0xd4,0x71,0x10,0x1e,0x9d, +0xc1,0x3b,0x46,0x49,0x54,0xa4,0x2c,0x53,0x6e,0xe0,0xa8,0x90,0xf5,0x8e,0x1b,0x68, +0xf9,0xe8,0xa1,0xe3,0x8e,0xa4,0xdf,0x49,0x59,0x59,0x9f,0x54,0x59,0x34,0x7d,0xe9, +0xac,0x54,0x3c,0xd7,0x61,0xc7,0xc8,0xda,0xb9,0x53,0x9f,0xa0,0xd8,0x38,0xcf,0xed, +0x22,0xb6,0x9d,0x9d,0x46,0xb6,0x61,0x90,0x69,0x39,0x0a,0x52,0x18,0x28,0x92,0x2a, +0x9a,0x8d,0x98,0xae,0xc1,0xb7,0x96,0xad,0xe7,0x54,0x2d,0x04,0xa8,0x3e,0x06,0xdd, +0x54,0xe2,0xf4,0x6c,0xd9,0x92,0x66,0x68,0x80,0xa5,0xbe,0x5b,0x88,0x70,0xfd,0x0e, +0x60,0x7d,0x47,0xf1,0x51,0x7a,0xd1,0x6d,0xe7,0x81,0x49,0xc6,0xf9,0x9c,0xdf,0xef, +0x85,0xea,0x6b,0xa6,0x18,0xb4,0x05,0x23,0x9f,0xf0,0x24,0x7f,0x19,0x9f,0x40,0xb5, +0x9c,0x8f,0xb5,0x74,0xef,0x55,0x28,0xd1,0x67,0x1d,0x0a,0xb6,0x3d,0xb1,0x02,0xc2, +0x59,0x01,0x64,0x23,0xc1,0xb0,0xa8,0xc3,0x29,0xb1,0x02,0xc5,0x29,0x8d,0x41,0x01, +0x1a,0x8f,0xb4,0x39,0xa4,0xe0,0x63,0x00,0x2f,0x3b,0xe9,0x36,0xe7,0x06,0x49,0xa4, +0x11,0x8c,0x0e,0x3e,0x68,0x3c,0x59,0x80,0x7e,0x81,0x79,0x56,0x7c,0x61,0xf3,0x22, +0x14,0xe8,0x64,0x34,0xfd,0x5c,0x2a,0xbc,0x32,0x6b,0x86,0x95,0xda,0x39,0xdf,0x6e, +0x01,0x4e,0x79,0x16,0x1b,0x28,0x06,0x75,0xe6,0x87,0x86,0x70,0xb6,0x66,0x07,0xf3, +0x85,0xe4,0xdf,0x86,0x19,0x20,0xd1,0x11,0xa4,0x61,0x89,0x97,0x9a,0x17,0x15,0x2d, +0x6c,0xa4,0x97,0x96,0x91,0xcf,0xf5,0x7d,0x48,0x6a,0x8b,0x84,0x5b,0xea,0x42,0x08, +0x92,0x85,0x9c,0x26,0x7c,0xa8,0xbe,0xdb,0xb1,0xc7,0xcc,0x9e,0x37,0x8b,0xdc,0x15, +0xae,0x04,0x6a,0x5b,0xf7,0x74,0xb6,0xcb,0xb0,0xc6,0x84,0x07,0xd0,0x4f,0x69,0x16, +0xcc,0x8c,0x5c,0x7d,0xee,0x75,0x53,0x98,0x7b,0x88,0x4c,0x5d,0x37,0x5b,0xd4,0x64, +0xfe,0x8b,0xd3,0x38,0x60,0xa4,0x05,0x26,0xac,0x57,0x2c,0x7f,0xd9,0xc7,0xce,0xd9, +0x20,0x86,0x1e,0x3c,0xbd,0x53,0x3e,0xee,0x43,0x8a,0x09,0x9e,0xc5,0x1d,0x4c,0x66, +0x2d,0x2d,0x6d,0x1d,0x3a,0xec,0x44,0xbe,0x49,0xa5,0x8c,0x8d,0xd3,0x30,0xe1,0x58, +0xa4,0xed,0xe5,0x03,0x17,0xe7,0x7b,0x6f,0x67,0xdd,0x8d,0x69,0x3f,0x6d,0x7c,0x4a, +0xfb,0xaa,0xd1,0xa0,0x62,0xc3,0xda,0xff,0x8e,0xa7,0x83,0x00,0xfc,0x4c,0x70,0x60, +0x78,0x67,0x75,0x78,0x5f,0xbf,0x0a,0x96,0x62,0xb8,0x4d,0x99,0x52,0x50,0x2e,0xe0, +0x16,0x19,0x84,0xec,0x33,0xf3,0x33,0x4f,0x8c,0x49,0x1b,0x17,0x94,0xce,0x27,0x54, +0x84,0xa3,0xa7,0xf4,0xd0,0xb4,0xd9,0x5a,0xec,0x90,0x65,0x23,0xc3,0x33,0xd5,0xd5, +0xe1,0x95,0xbe,0xe9,0x16,0xd6,0x25,0xa2,0x04,0x7c,0xc4,0x4d,0x0e,0x2c,0x34,0xe6, +0xdb,0xf8,0xc3,0x42,0x5b,0x1f,0xd4,0x90,0x04,0x73,0xcc,0x1d,0xa0,0xfc,0x50,0x7f, +0x21,0xfd,0x30,0xb4,0x57,0x55,0x34,0x76,0x6a,0xf3,0xa5,0x68,0x71,0x1c,0x03,0x9f, +0xa7,0xd6,0xdd,0x39,0xb0,0x5f,0xb5,0xa6,0x22,0x7b,0x74,0x65,0x58,0x09,0x91,0xb1, +0x84,0xf7,0x93,0xd1,0x56,0x34,0x35,0xe3,0x5e,0x57,0xc8,0xb7,0xb3,0xf1,0x06,0xd6, +0x8d,0x14,0x19,0x6c,0x74,0x79,0x27,0x59,0x54,0x9a,0x76,0x2e,0x79,0xe3,0xea,0x1c, +0x5d,0x9a,0x51,0xec,0xd6,0x21,0x46,0xc9,0x5d,0x9b,0x17,0xc0,0xe8,0x85,0xe3,0x0e, +0xef,0xfa,0x87,0x19,0xd7,0x4a,0xbb,0x5e,0x05,0xeb,0x31,0x2b,0xf6,0xf1,0x3c,0x93, +0xe7,0x11,0x2f,0x6b,0xc5,0xf9,0xb3,0x4f,0x10,0xd4,0x00,0xf0,0xfb,0xd2,0xe1,0xc8, +0xd3,0x61,0x94,0x3d,0xb2,0x61,0x08,0x2a,0x87,0xf6,0x80,0x0d,0x1d,0xdc,0x95,0xea, +0xfc,0x32,0xd6,0xee,0xb7,0xa2,0x74,0xbf,0xe0,0x9f,0x7e,0x1e,0xe3,0xbc,0x71,0xa9, +0xc6,0x93,0x9f,0x4b,0xd3,0xd5,0xb7,0xae,0x7a,0x9c,0x8f,0xf2,0x03,0x77,0xcf,0xa9, +0xcd,0x38,0xb5,0xdd,0x18,0x1f,0xf3,0xb9,0xee,0x5f,0xff,0xff,0xff,0xff,0xa3,0xa5, +0xdc,0x83,0x34,0x66,0xfb,0xc1,0xd0,0xa4,0xad,0x4e,0xae,0x11,0xf3,0x10,0xad,0xa5, +0xe0,0xae,0x19,0x64,0x91,0x3e,0xe3,0xf2,0xe0,0xfe,0xa6,0x1c,0xf6,0x71,0x22,0xb0, +0x58,0xc1,0x2d,0x96,0xac,0x8f,0x29,0xde,0x43,0x4f,0x95,0xef,0xe3,0x27,0x5c,0x62, +0xef,0x81,0xb7,0x21,0xf0,0x27,0x71,0x53,0x32,0x2d,0xa7,0x1c,0x76,0x78,0xed,0x32, +0xb9,0xfb,0x23,0x86,0x96,0x2a,0x6e,0x01,0xe1,0xef,0xee,0xc5,0x98,0x95,0x99,0xa0, +0xfc,0x0a,0x92,0x51,0x7b,0xe6,0xf4,0xe2,0x0f,0x4d,0xbe,0x48,0xb8,0x66,0x9c,0x79, +0x00,0xd2,0x65,0xa7,0xda,0x05,0x05,0x60,0x2b,0x65,0xaf,0xc4,0x3b,0x65,0xfd,0x9e, +0x70,0xdc,0xb7,0xe1,0x72,0x84,0xd9,0x10,0x89,0xe3,0x75,0x0a,0x19,0x44,0xfd,0x7b, +0x32,0x64,0xe3,0xcc,0x5c,0x8c,0xd2,0xa9,0x17,0x40,0x75,0x5f,0x6c,0x27,0xa7,0x6b, +0x6b,0xa8,0x1f,0x6f,0x7d,0x2a,0x9e,0xc5,0x41,0x08,0x0a,0x4e,0xb2,0x00,0xe4,0x49, +0x8c,0x2a,0x11,0x21,0x50,0xcb,0x95,0x5a,0xfa,0x41,0x92,0x5e,0xe4,0x25,0x5e,0xea, +0x0d,0x86,0x35,0x0c,0x78,0x84,0xdb,0xa8,0xc7,0xfe,0xcb,0x21,0x89,0x6d,0xd7,0xe8, +0x5e,0x4c,0x94,0xbf,0x70,0x04,0x80,0x6e,0x82,0xef,0x69,0xff,0x78,0x64,0x13,0xdd, +0xae,0xb2,0xaa,0x42,0x66,0x22,0x00,0x4f,0x23,0x6e,0x25,0x83,0xb2,0x6e,0x98,0xd8, +0x6b,0x71,0x61,0xa5,0x4e,0xe3,0xf7,0x4e,0x6b,0xb1,0x52,0x1e,0xf0,0xef,0xf6,0x1e, +0x51,0x05,0x7c,0x81,0x9d,0x74,0x25,0x7f,0x2a,0xcc,0x89,0x82,0x2c,0x03,0x46,0x25, +0xc9,0xd3,0x72,0x77,0xbc,0x3d,0x45,0x12,0x68,0x30,0xd0,0x9a,0xac,0xf3,0x5a,0x28, +0xca,0x75,0x1a,0x6c,0x31,0x73,0x49,0xb1,0x39,0xaa,0xbf,0x15,0x90,0x0e,0x12,0x72, +0x24,0xbf,0xfa,0xbb,0xd4,0xc7,0xca,0xa0,0xc4,0xf2,0x36,0x00,0x28,0x31,0x35,0x6a, +0xa7,0xa8,0x0a,0xb9,0x44,0xbf,0x1d,0x95,0x00,0xfc,0x20,0xf2,0x3b,0x7a,0xe7,0xc2, +0x64,0x49,0x14,0xcc,0x97,0x9b,0xd4,0x0e,0xd9,0x4b,0xaa,0x44,0x74,0x1c,0x0e,0xbe, +0x42,0x75,0xf4,0x2e,0xf2,0xbf,0x74,0x92,0x9e,0x59,0x08,0x0e,0x88,0x37,0xe9,0x53, +0x9e,0x1c,0x11,0x47,0x32,0xac,0x95,0x61,0xe7,0x8b,0x48,0xdb,0xd4,0x83,0x32,0x8b, +0x5e,0x8b,0x4a,0x24,0x10,0xb7,0x65,0x19,0xb3,0x1a,0x9d,0xb1,0x06,0x7b,0x9a,0x97, +0x16,0x1e,0xff,0x5c,0x9b,0x24,0x07,0x5b,0x50,0xf7,0xde,0x91,0x91,0xfb,0xa2,0x68, +0x75,0xef,0xa4,0x4c,0x65,0x21,0x47,0x22,0x8c,0xa6,0x9c,0x52,0x7f,0x52,0xf3,0x72, +0x09,0xe5,0x9e,0x7e,0xdc,0xc7,0x86,0x5a,0xd4,0x25,0xdd,0xac,0x07,0x87,0xf0,0xeb, +0x6b,0x1b,0xf1,0xa8,0x36,0x96,0xa2,0xfe,0x37,0x53,0xeb,0xd3,0x5a,0xd6,0xc1,0x38, +0x29,0x8d,0xf4,0xdf,0x99,0xad,0xad,0xe0,0xcf,0x23,0xee,0x93,0xfb,0x71,0xed,0x2b, +0xa7,0xa0,0x49,0x2d,0x98,0xbd,0x23,0x12,0xe8,0x50,0x1e,0xb9,0x46,0x73,0x39,0xcf, +0x4b,0x9d,0xb9,0xf4,0x4b,0xb4,0xfe,0x97,0x7f,0xd3,0x64,0x4d,0x06,0x5d,0x37,0xd4, +0x2b,0x08,0xfd,0xce,0x18,0xee,0xa0,0x3b,0x4a,0x80,0xe7,0x02,0x78,0x72,0x76,0xa7, +0x02,0x02,0x32,0xf5,0x78,0xce,0xe1,0xda,0x44,0x82,0x13,0xe0,0xf5,0x8c,0x56,0x14, +0xec,0xe2,0x96,0x22,0x74,0xa5,0x83,0x70,0xe4,0x3c,0xe6,0x53,0x5d,0xe2,0xf5,0x70, +0xe6,0x33,0x9f,0x32,0x56,0x5d,0xb6,0x0f,0x25,0x7d,0xd3,0xb6,0xd5,0x82,0x7a,0xe0, +0x09,0x8e,0xcb,0x08,0x94,0x63,0x11,0x51,0x2c,0xb0,0x7d,0xf2,0xd3,0x98,0xb7,0xb2, +0x81,0xf5,0x72,0xc4,0xc2,0x35,0xd3,0x91,0xca,0x39,0x4f,0xf5,0x2e,0x39,0xcb,0xa1, +0x8b,0x88,0x79,0x49,0x2b,0x18,0x5e,0xc3,0xcb,0xa0,0x4b,0x4e,0xab,0x54,0x1f,0x45, +0x67,0x05,0x5e,0xa5,0xb2,0x72,0x09,0x70,0xa0,0x82,0x97,0x5f,0xd5,0x66,0x90,0x14, +0x51,0x8d,0xf1,0x4b,0xa4,0x1c,0xcd,0x11,0x2c,0x84,0x55,0x08,0x1d,0x56,0x5d,0x8e, +0x77,0xe1,0xfc,0x3a,0x40,0x03,0xf2,0xbb,0x3a,0xc6,0x40,0x51,0x34,0xe5,0x3c,0xb3, +0xe6,0xcd,0xbc,0xee,0x8d,0x58,0xc1,0x7d,0x4b,0xeb,0xc4,0x38,0xbc,0x6a,0x84,0xa7, +0x65,0x49,0x35,0xf0,0xbc,0x9b,0x0b,0xd4,0x4f,0xc7,0xa5,0x4d,0xbc,0xf4,0x11,0xaa, +0xe7,0xc9,0xd5,0x19,0x7c,0x28,0xf4,0xfb,0xdd,0x66,0x20,0xcc,0x51,0xa9,0xa2,0x24, +0x6f,0xec,0x5a,0xbd,0x38,0xbc,0x8f,0x18,0xf9,0xf3,0x0d,0x10,0x94,0x7d,0x6f,0xaa, +0x39,0x1c,0xca,0x93,0x9f,0x3d,0x28,0x80,0xb4,0x8f,0x9c,0x47,0xb4,0xce,0x1c,0x11, +0x37,0x12,0x5b,0xbc,0xb0,0xa8,0x0a,0x55,0xe0,0x3b,0x08,0x28,0x37,0xcd,0x15,0x5d, +0x6e,0x0c,0xb2,0xb3,0x3a,0x00,0x3b,0x3f,0x2e,0xb4,0xc5,0xdf,0x15,0x7e,0x89,0xfd, +0xb9,0xcf,0x32,0x15,0x0c,0x1d,0xb4,0x83,0xa0,0x2c,0xac,0x8b,0x14,0x6b,0xfd,0x68, +0xde,0x4e,0x92,0xa2,0x54,0xb5,0xfb,0xcd,0xea,0x57,0xc4,0x89,0x17,0x24,0x1f,0x68, +0x17,0x67,0xb4,0xf7,0x34,0xad,0x88,0xfc,0xe2,0x99,0x75,0x46,0x16,0xaf,0xed,0x13, +0xa0,0x0e,0xcc,0xd7,0xf1,0x17,0xb9,0xf3,0xa9,0x5e,0x69,0x8c,0xd3,0x66,0xf4,0x40, +0xa6,0x8d,0x9a,0xfb,0xca,0xc5,0xb4,0x62,0xbf,0x96,0x0f,0x62,0x74,0x48,0xf2,0xb0, +0xdc,0x48,0xe3,0xb4,0x39,0xd7,0xbc,0x93,0xac,0xd9,0xd8,0xd0,0x57,0x64,0x5d,0x3d, +0x24,0x92,0x56,0xeb,0x34,0xb2,0x69,0x30,0x1b,0xd9,0x65,0xc7,0xca,0xb6,0x13,0x76, +0x5e,0x38,0x29,0x07,0xbf,0x0e,0xd9,0xb1,0x63,0xda,0x7d,0xf4,0x53,0x5c,0x0e,0xe8, +0xd5,0x94,0x34,0xa6,0xf4,0x59,0x48,0x9e,0x87,0x39,0xe2,0x46,0x74,0xba,0x91,0xd8, +0x8c,0x6c,0x13,0x1a,0x3b,0x28,0x5e,0xd5,0x6b,0x9b,0x1d,0x1b,0xa5,0xba,0x1f,0xf5, +0x2d,0x97,0xb2,0x0b,0xd9,0xbc,0x23,0x5a,0xea,0x13,0xf3,0x4f,0x20,0x79,0xfa,0x1f, +0xa3,0x57,0x91,0xab,0x1e,0xde,0x2c,0xd9,0x06,0x1a,0x9c,0x1e,0xe1,0xff,0x34,0x3b, +0x44,0x98,0xfe,0xde,0x0d,0x0a,0x89,0x1a,0x5f,0x7d,0x64,0xee,0xb6,0x76,0xcd,0xed, +0x4c,0x99,0x56,0x2d,0x1d,0xad,0x2c,0xe4,0x84,0xb9,0xc0,0xd2,0xf2,0x5b,0x39,0x7f, +0x2a,0x98,0xc7,0xcb,0x8d,0xc8,0x23,0x18,0x6a,0x53,0x61,0x9d,0x15,0xaf,0x17,0x59, +0x7b,0xa6,0x57,0x2c,0x95,0xd3,0x47,0x05,0x62,0x22,0x33,0x3f,0x85,0xbd,0x9a,0xea, +0x63,0x09,0xd9,0x3e,0x16,0xeb,0x2b,0x91,0x24,0xef,0x9c,0xc9,0x71,0x3b,0xed,0xac, +0xea,0x65,0x37,0xf6,0x72,0xe5,0x66,0x19,0xb4,0xe2,0x2e,0xb0,0x2c,0xa2,0x96,0xf2, +0x04,0x89,0x4a,0x81,0xfd,0xf9,0x83,0x5e,0xa8,0x73,0x27,0xd8,0xf1,0xb9,0x31,0xef, +0x2d,0x0e,0x18,0xff,0x60,0x6c,0x08,0xc2,0xf1,0xe3,0xa7,0xe5,0xb1,0xbc,0x16,0x5a, +0x60,0x46,0x77,0x6c,0x14,0x8d,0xde,0x99,0xef,0x06,0x4e,0x90,0x31,0x44,0x31,0x6f, +0x6d,0xd0,0xdf,0x2a,0xd9,0xb4,0xd8,0xb6,0x1f,0x46,0x58,0x85,0x6b,0x7f,0x97,0x5a, +0x63,0x39,0x50,0x02,0x6f,0x80,0x8c,0x07,0x3f,0x4f,0xa9,0x41,0xb9,0x77,0x9b,0xd5, +0x81,0xbb,0x81,0x41,0x47,0xb6,0xd8,0x74,0xe1,0x67,0x80,0x4e,0xd5,0xa4,0xfd,0xf9, +0xab,0x48,0xa2,0x45,0xa1,0xa7,0x83,0x2a,0xaa,0x0a,0xec,0x11,0xb9,0xc7,0x12,0xeb, +0x8d,0xa4,0xb2,0x2c,0x4f,0x86,0xe7,0xd4,0x49,0xb2,0xfc,0xf9,0x5a,0xe3,0x3d,0x25, +0x68,0x8b,0xdb,0x5c,0x25,0x8b,0x89,0x96,0x21,0x20,0x00,0x5e,0xac,0x06,0x73,0xa9, +0x65,0xa4,0x2b,0x6f,0xfb,0x8c,0x03,0xc5,0x25,0x09,0xa5,0x9c,0xb1,0x66,0x1b,0xf3, +0xff,0x43,0x65,0x75,0x82,0x7d,0x53,0x48,0x16,0xec,0x28,0xe8,0x34,0x49,0x95,0x58, +0x7c,0x8d,0xdf,0xd8,0x72,0x7c,0xd9,0xfc,0x60,0x8f,0x92,0x41,0xd9,0x8a,0x42,0x36, +0x2d,0x4f,0xec,0x26,0x43,0xdb,0x93,0x61,0xca,0x4a,0x7f,0xe9,0xd0,0x94,0x8b,0xb5, +0x31,0x09,0x67,0x22,0x51,0xde,0x7b,0x70,0xf8,0xbf,0x03,0x1f,0x68,0x0a,0x92,0x73, +0x10,0xbf,0x1a,0x78,0xcd,0x3f,0x25,0xc6,0xb1,0xc8,0x94,0x49,0x56,0xdb,0x9d,0xd7, +0xeb,0x7b,0x12,0x60,0x52,0x11,0x65,0xca,0xc6,0x21,0x47,0x8f,0x77,0x1a,0x10,0x72, +0x94,0xbf,0xdf,0xe9,0x84,0x70,0x3e,0x51,0x24,0x23,0x42,0x0d,0x8f,0x7b,0x45,0xc0, +0xa7,0xda,0xf5,0x65,0x8a,0x42,0xe8,0xa0,0x26,0xde,0xd6,0xf2,0xc2,0xff,0x1e,0x05, +0x81,0x71,0x70,0xa6,0xc5,0x51,0xfc,0xf4,0x40,0x54,0xab,0x23,0x74,0x56,0x4d,0x32, +0x8f,0x9e,0xf2,0xec,0x45,0xea,0x9c,0xf0,0x27,0x17,0x4c,0x70,0x1d,0x50,0x47,0x23, +0x0e,0x9d,0xfd,0xf4,0xca,0xc9,0xd1,0x65,0xae,0xb9,0x1a,0xa5,0xf6,0x18,0x5d,0x33, +0x21,0x5f,0x93,0x37,0xb7,0x9a,0x14,0xf1,0x63,0x09,0xe4,0xb7,0x52,0x6c,0x7f,0xf7, +0x48,0x11,0x46,0xf9,0x5f,0x65,0xeb,0xc7,0xe5,0xfe,0x2e,0x3f,0x56,0xd5,0xf5,0xe6, +0xa8,0x14,0x7f,0x8d,0xf2,0x49,0xd5,0x48,0x93,0x28,0xd6,0xa9,0x90,0x3a,0xf8,0xf7, +0xca,0x6c,0xff,0x8f,0xf8,0x6a,0x9e,0xe9,0xec,0x7f,0x47,0x29,0x96,0x58,0xb0,0xdb, +0x08,0x59,0xab,0x5e,0x9d,0xb6,0xdf,0xcc,0x7b,0x56,0x67,0xb5,0x10,0x18,0xca,0xaa, +0x69,0xc3,0xd7,0x48,0x57,0x59,0xf1,0xdd,0x6c,0x85,0x21,0x68,0x1c,0xb3,0x76,0x08, +0xd0,0x12,0xd8,0xe1,0xc0,0x90,0x66,0x0b,0x5b,0x38,0x61,0x78,0x15,0x97,0x3f,0x4b, +0xa3,0xa3,0xff,0x37,0x16,0x33,0xcb,0x6b,0x06,0x57,0xbf,0x8f,0x49,0x12,0x2f,0xdb, +0xd0,0x12,0x5c,0x65,0x48,0x51,0x67,0x0a,0xd3,0xd4,0x97,0xe1,0xc8,0x88,0x84,0x7c, +0xa7,0xe5,0xde,0x01,0xb5,0x7f,0xec,0xac,0x60,0x4d,0x4f,0x55,0x76,0xa2,0x3a,0x13, +0xfa,0x0c,0xa5,0x68,0xdf,0xb9,0xf8,0x47,0x9d,0xcc,0x45,0xda,0x55,0x5a,0x9e,0xe1, +0x6d,0x08,0x15,0x65,0x1b,0x04,0xcc,0xd3,0x27,0xb3,0x67,0xe1,0x3d,0x13,0xfd,0xed, +0x78,0x22,0xa1,0x2e,0x74,0xfc,0x21,0xaa,0xa6,0x9a,0xa1,0xcf,0x2d,0xa1,0x68,0xe5, +0x65,0xa4,0x5b,0xd5,0x62,0xae,0xc8,0xd0,0x42,0xa4,0x44,0x41,0xe7,0xe8,0xe8,0xba, +0x5b,0xc8,0x7f,0x5d,0x2b,0x95,0x22,0xe3,0x67,0x85,0x2a,0x80,0xd4,0xe8,0x19,0x05, +0xd6,0xca,0x63,0x59,0xe2,0x52,0xb1,0x06,0x64,0x84,0xc9,0x8f,0x2e,0xa4,0x31,0xb3, +0x05,0xaf,0x9c,0x46,0x65,0x0a,0xf8,0xf7,0xb4,0xf2,0x80,0x30,0x2a,0x91,0xb4,0xf9, +0x60,0x55,0x62,0x7b,0x88,0xa5,0xa7,0xae,0x21,0x03,0x38,0x47,0xb5,0x39,0x2c,0x36, +0x8d,0x1e,0x61,0x41,0xa8,0x55,0x98,0x17,0xfe,0x84,0xc2,0x19,0xa0,0xe6,0x75,0x3f, +0x67,0x4b,0xfb,0x2e,0x9a,0x61,0x0b,0xcb,0x8e,0x41,0x73,0x9a,0x62,0x37,0x11,0xe8, +0xe9,0x24,0x6b,0xf7,0x6d,0xe9,0x40,0xdb,0x89,0xd0,0x85,0x02,0x26,0x70,0x5d,0x28, +0x4d,0x33,0xf5,0xbc,0x3d,0xcc,0x4c,0x0e,0xc3,0x4a,0x0f,0x10,0xc8,0xb3,0x30,0x0f, +0xac,0xe8,0xe1,0xaf,0xbc,0xed,0x25,0x10,0x6f,0x0d,0x9b,0x94,0xab,0xfc,0x1b,0xc9, +0x06,0x86,0xdd,0x77,0x7d,0xa7,0xf2,0x2b,0x61,0x8c,0xcc,0xe4,0x65,0x73,0x31,0x0a, +0x2c,0xea,0xd5,0x76,0x99,0x46,0xff,0xff,0xc0,0x62,0x4c,0x56,0x3e,0x70,0xbe,0x3d, +0xcd,0x1a,0xda,0x26,0xdf,0x93,0x2c,0x4b,0x07,0xeb,0x4c,0xd5,0x08,0x51,0x14,0x6d, +0xa6,0x9c,0x54,0x6a,0xe9,0x4a,0x04,0x59,0xd2,0x5e,0xea,0x16,0x9e,0xf2,0xd8,0x6f, +0xa4,0x9c,0xfc,0xc0,0x13,0xa2,0xa0,0x27,0x89,0x19,0xe1,0x54,0xde,0x7f,0xd6,0x17, +0x8a,0xc5,0xee,0x7a,0xb4,0xec,0x25,0x83,0x86,0x17,0xbb,0x8b,0x75,0x56,0xb0,0x44, +0x32,0x97,0xdb,0x59,0xc7,0x62,0x8b,0x11,0x16,0x7b,0x34,0x53,0x1a,0xb6,0xaf,0x54, +0x2f,0x91,0xdb,0xef,0xc7,0x24,0xeb,0x80,0xdc,0x5e,0x2a,0x23,0x76,0xf7,0xe4,0xd6, +0xa0,0xfd,0xed,0xcb,0x0a,0xe7,0x62,0x10,0x92,0x79,0x23,0x9e,0x7b,0xb4,0xed,0x95, +0xaf,0xdb,0x5a,0xff,0x37,0xa7,0x07,0xda,0xe1,0x3e,0xc3,0xba,0x78,0x71,0x91,0x5a, +0x5b,0x98,0xd9,0x0a,0x5b,0x4c,0xa7,0x40,0xc9,0x47,0x6d,0xb1,0x03,0x6a,0x95,0x3f, +0xde,0x24,0xf7,0x14,0xd8,0x16,0x15,0x6a,0xce,0x45,0x7e,0x4f,0x22,0x0d,0x98,0xbb, +0xa4,0x25,0xfc,0x90,0xc7,0x20,0x7d,0xb6,0xcd,0x5a,0x80,0x6a,0x8f,0xfa,0x39,0xae, +0x46,0x7a,0xa7,0x97,0x58,0x14,0x90,0xd5,0x30,0x99,0x69,0xa1,0x9b,0x4f,0xe1,0x48, +0xae,0x37,0x53,0xe3,0xc6,0x4d,0x51,0x88,0x4f,0x3f,0xf2,0x2e,0x32,0xfa,0x24,0xcf, +0x0d,0x90,0x2e,0x33,0xe1,0x36,0xe0,0x0e,0xce,0xd6,0xfa,0xfa,0xf0,0xbc,0x5f,0x34, +0x6f,0xfc,0xd4,0xf3,0x42,0x8f,0x2d,0x87,0xd6,0x9c,0x5c,0x22,0x5f,0x79,0x2c,0x27, +0x2f,0x64,0x76,0xee,0xd3,0xfd,0xec,0xa0,0x56,0x63,0x53,0xdb,0xff,0xff,0xa8,0x31, +0xe9,0x49,0x1a,0x62,0x16,0xe9,0x49,0xa1,0xe5,0x4b,0xee,0x8c,0x33,0x36,0x3d,0x12, +0xee,0x1a,0xb0,0xe7,0x33,0x4d,0x20,0x00,0x49,0xbe,0xa0,0xcf,0x32,0x17,0x59,0x10, +0x86,0x99,0x34,0xf6,0xec,0x47,0x85,0xa3,0x22,0xd2,0x06,0xa1,0xd6,0x2e,0x48,0x77, +0x7e,0xae,0xef,0xb1,0x78,0xd2,0x23,0x94,0x36,0x58,0x0e,0xb1,0xd7,0xfa,0x80,0xd0, +0x4d,0x0c,0x3f,0xa6,0x90,0x6c,0x08,0x65,0x3d,0x64,0x88,0xf0,0x25,0xe3,0x97,0x50, +0x27,0xf8,0xb0,0xd6,0x1a,0x41,0x9c,0xf5,0x00,0xb6,0x87,0x8b,0x55,0xde,0xc5,0xbc, +0x8a,0x47,0x0d,0x27,0xd3,0x06,0xc1,0x89,0xe4,0x0b,0x0e,0xfc,0xed,0x62,0x53,0x50, +0xa0,0x6d,0xf1,0x05,0x91,0x28,0xa6,0x02,0x97,0x2b,0x85,0x89,0x31,0x9c,0x9a,0x17, +0xab,0x8d,0xe4,0xad,0x1b,0x10,0x12,0x4e,0xc7,0xbe,0x3e,0xb7,0xd8,0xe9,0x53,0x0c, +0xac,0xf8,0x26,0x8e,0x1d,0x23,0x40,0x3a,0xdb,0x41,0x5f,0x01,0x5f,0x2b,0xfc,0xe1, +0x84,0x45,0xd3,0x3c,0xdc,0x97,0xa8,0x59,0x48,0x55,0x2c,0xcd,0xe8,0xe1,0xf3,0x6b, +0x62,0x42,0x08,0x3d,0xf1,0x48,0x9e,0xbb,0x41,0x33,0x3d,0xc6,0x30,0x7b,0x82,0xd9, +0x26,0x81,0xa2,0x0c,0x14,0x21,0xb5,0xa8,0x46,0xb7,0xb5,0x81,0xda,0xd7,0x95,0x59, +0x2f,0xa0,0xc0,0x4c,0xb8,0x20,0x14,0xd8,0xea,0x4f,0xe4,0x65,0x7a,0xbf,0x25,0xab, +0x8b,0x6e,0xc9,0x49,0x39,0x23,0x57,0x4d,0xcc,0x2c,0x2c,0xe9,0xa1,0x45,0xce,0xeb, +0x83,0xef,0xc1,0x7d,0x38,0x22,0x65,0x74,0x44,0xc9,0x6c,0x40,0xbb,0xfd,0x76,0x84, +0x6c,0x9d,0x3f,0x35,0xbc,0x72,0x4c,0xa4,0x48,0x19,0x51,0x99,0x76,0x32,0x8b,0x76, +0x12,0x77,0xb4,0xd3,0xfb,0x32,0xdc,0x34,0x11,0x5c,0x30,0x2f,0x9a,0xc2,0x5c,0x00, +0x07,0x09,0x1f,0xaa,0x47,0x57,0xd5,0xd5,0x62,0xef,0x33,0x21,0xb2,0x0c,0xb5,0x6f, +0xb1,0x5e,0x36,0x06,0xcd,0x39,0x63,0x8c,0x4d,0x5e,0xa7,0x27,0xf1,0xdc,0xf3,0xc8, +0x24,0xaf,0x04,0x3c,0xad,0x76,0x2c,0x82,0x80,0x34,0xee,0x54,0x90,0xdb,0xe0,0x4e, +0x22,0x97,0x22,0x24,0x23,0x3a,0xf0,0xb0,0x67,0x7c,0x86,0x6f,0x1b,0xc5,0xd9,0x45, +0xac,0xb9,0x1b,0x0b,0x30,0x3e,0xd1,0x26,0x62,0x76,0x71,0x96,0x8e,0x79,0x8d,0x55, +0x29,0xe8,0x65,0xd0,0x97,0x31,0xd6,0xb7,0xe9,0x4c,0xa3,0xf3,0x12,0xf4,0xf9,0x4f, +0x1b,0x3e,0xc2,0x8e,0x70,0x7a,0x68,0x08,0x9c,0xa9,0xc5,0x5c,0xe6,0x89,0x2e,0x6b, +0x8a,0x0b,0x33,0xa5,0xc2,0x3d,0xda,0xe6,0x67,0x47,0xdc,0x58,0xe4,0x84,0xbf,0x16, +0x5d,0x93,0x1d,0xf3,0xb9,0x6a,0x4e,0xac,0x3d,0x36,0x57,0x29,0x89,0x38,0xb7,0xe9, +0x29,0xbd,0x89,0xf2,0xc1,0x84,0x62,0x4a,0xcf,0x8f,0x32,0x53,0x09,0x28,0x1f,0xe0, +0x2c,0x5e,0xe6,0x95,0x3c,0x5e,0x36,0x9e,0x4b,0x45,0xa4,0x1f,0xf6,0xd1,0xd2,0x5c, +0x25,0xb2,0xae,0x6f,0xac,0x30,0x5e,0x78,0xec,0xcd,0xe0,0xe5,0xf4,0xfb,0x65,0x32, +0xac,0xa5,0x8e,0x6d,0x1b,0xee,0x07,0xe5,0xe4,0x5d,0x83,0x0f,0xb2,0xce,0xe3,0x47, +0xa8,0x87,0x91,0xe1,0xbb,0x90,0x06,0x69,0x4e,0x59,0x00,0xbd,0xf7,0xd4,0x5e,0xda, +0xa1,0xee,0xf9,0x9c,0xf1,0x21,0x08,0xc2,0x0c,0x3b,0x4d,0x61,0xad,0x96,0x90,0x22, +0xd7,0xce,0x4f,0xd6,0x25,0xe3,0x68,0xb6,0x55,0x4c,0xb8,0xc5,0x67,0x6a,0x43,0x73, +0x85,0x20,0xde,0xf8,0x6d,0xcc,0xb1,0xa7,0xfd,0x1f,0xcf,0x8e,0x35,0x64,0x77,0xcb, +0x8d,0x98,0x33,0x69,0x94,0xe0,0x60,0x33,0x62,0xc5,0x5c,0x0a,0xd3,0xa1,0x5e,0x5a, +0x89,0x02,0xea,0x06,0xb5,0xa2,0x74,0xa2,0x02,0x69,0x8e,0x60,0xb7,0x67,0x6c,0x76, +0x01,0xe7,0xec,0xb4,0x95,0xed,0xfc,0x8f,0x4f,0x84,0xb0,0xf6,0xab,0xc6,0xe1,0x03, +0x8a,0x7d,0x69,0x44,0x37,0x2e,0x72,0x13,0xce,0xcf,0x83,0xe3,0xc9,0x8b,0x27,0xf3, +0x26,0xd7,0xc9,0x35,0xd6,0xa3,0xa6,0x73,0xe3,0xc6,0xa3,0xed,0xbf,0x57,0x22,0x6c, +0x4c,0xc7,0x62,0x7a,0xb9,0x77,0x44,0x90,0xef,0x89,0xa9,0xd5,0xb5,0xd8,0x22,0x1f, +0x6e,0x95,0xcc,0x7c,0xf6,0xcd,0xee,0xbc,0x25,0x75,0xc4,0x93,0xbc,0x6f,0x9b,0xcc, +0x4e,0x96,0x1e,0xfc,0x18,0xc9,0x1e,0x50,0x55,0xb7,0x4e,0x68,0x25,0x9c,0xd3,0xf3, +0xd1,0xc6,0x14,0x2e,0x19,0x54,0x84,0x60,0x34,0xf2,0xbb,0xcc,0xeb,0x60,0x5c,0x52, +0x81,0x0a,0x9a,0x88,0x3e,0xad,0xf6,0x6e,0x67,0x14,0x8c,0x68,0xbf,0x6f,0x6e,0x7e, +0x3c,0x9c,0x15,0x5a,0x6e,0xf0,0xfa,0x1b,0x1a,0xce,0xf2,0x56,0x3c,0x5f,0x67,0x0b, +0x82,0x75,0x24,0xc7,0x7f,0x11,0x2a,0xf6,0x6b,0xc7,0x81,0xeb,0xc1,0x83,0xab,0xdf, +0x4f,0x30,0xd5,0x82,0xbc,0xcf,0x3f,0xfa,0x4d,0x33,0xed,0x66,0x34,0xab,0x5c,0x42, +0x62,0x8b,0xa0,0x38,0xe9,0x0d,0x60,0xe5,0x8d,0xd3,0x83,0x0b,0x80,0x63,0x94,0x6d, +0x16,0xf4,0xce,0x96,0x34,0xa0,0x02,0x8f,0xaf,0xf2,0x2d,0xa8,0xf9,0x05,0xad,0xe5, +0x53,0x82,0x0a,0xa3,0x49,0xdc,0x53,0x07,0x0f,0x91,0x02,0x1e,0xf2,0x02,0x95,0x0c, +0xb7,0xde,0xf7,0x1b,0xc9,0xf1,0x43,0x12,0x0c,0x90,0x1d,0xed,0x40,0x6f,0xbb,0xc3, +0x02,0x39,0x73,0x44,0xdc,0xaa,0x24,0xeb,0xc5,0xcf,0xf3,0x1b,0x52,0x5b,0x52,0xca, +0x46,0xd5,0x85,0xb4,0x5c,0x64,0xfb,0x10,0xe0,0x95,0xa3,0x93,0x8a,0x9b,0xe0,0x71, +0xa2,0x56,0xc5,0xdf,0x34,0x11,0x33,0x85,0x64,0xd5,0x51,0x85,0x0d,0xb4,0x75,0xca, +0x4e,0xe7,0xed,0x24,0xcb,0xb1,0xd5,0xf6,0x65,0x9f,0x9f,0xe7,0xd3,0xec,0xc5,0x4a, +0x68,0x99,0x66,0x1d,0xc7,0x33,0x85,0x0b,0x5f,0x98,0x99,0xc1,0xa5,0x2d,0xa8,0xe8, +0x1e,0x99,0x08,0xd9,0xe7,0x16,0xfa,0x70,0xd6,0x76,0x39,0x92,0xf2,0x04,0xb6,0x87, +0x8e,0xeb,0x62,0xb2,0xba,0xf8,0x9c,0xec,0xe2,0x06,0xe6,0x90,0xc6,0xb8,0xd7,0x64, +0x2d,0x3a,0xfa,0xed,0x7f,0xbb,0x6d,0xa5,0xc3,0x99,0xd9,0xb9,0x14,0x9f,0x8a,0x58, +0x2a,0x96,0x90,0x00,0x9f,0x17,0xbc,0x1a,0x62,0xd3,0xbd,0x88,0x70,0xba,0xee,0x9a, +0x23,0x66,0xd0,0x93,0x5e,0xfd,0x1e,0xbe,0x4e,0x56,0x2a,0x04,0x1f,0x67,0xe5,0xb8, +0xfe,0x18,0xb7,0xcf,0x55,0x9d,0x17,0xaf,0xf9,0xd1,0xb7,0xc9,0xfc,0x73,0x6b,0xff, +0x46,0x0f,0xb7,0xaf,0x56,0x0f,0xa0,0x19,0x43,0x54,0x86,0x99,0x72,0x9d,0x60,0x1b, +0x03,0x0f,0x84,0x06,0x14,0xdb,0xa0,0xa0,0xa1,0x23,0xd4,0xb2,0x33,0x1e,0xe4,0x82, +0x09,0x09,0xa8,0x86,0x91,0x29,0x38,0x31,0x59,0x91,0xa2,0x84,0xbb,0xce,0x58,0x1e, +0x65,0xdd,0x81,0xc2,0x6d,0xab,0x0a,0xc1,0x80,0x72,0x87,0x0d,0x3b,0x26,0x9d,0x73, +0xc0,0x0b,0x0d,0xe8,0x99,0x62,0x39,0x03,0xe5,0x01,0x3d,0x31,0xdb,0x3f,0x14,0x46, +0xca,0x07,0x78,0xba,0x71,0x90,0x43,0x9c,0x06,0xc9,0x07,0x56,0xad,0xb1,0xf7,0xd4, +0x05,0x94,0xb7,0xbc,0xc5,0x68,0x98,0x04,0xc8,0x48,0x18,0x24,0x06,0x7e,0xe5,0xb0, +0x21,0x46,0x01,0x9c,0xb5,0x19,0x2e,0x91,0x12,0xf7,0xa9,0xe1,0xe5,0xe8,0x71,0xbf, +0x2f,0x0a,0xb2,0xba,0x11,0x23,0x22,0x11,0xd5,0x2b,0x5a,0x13,0x28,0xca,0x7a,0x72, +0x29,0x88,0xdb,0x25,0x1e,0x6a,0x54,0x0d,0xa9,0xee,0xeb,0x43,0x24,0x97,0xa6,0xe8, +0x01,0x9f,0x66,0x83,0x1a,0x59,0x1e,0x1c,0xa0,0x39,0xcd,0xc7,0xe8,0xfa,0x3b,0x59, +0x08,0x05,0x9e,0xf2,0x71,0x1a,0x6b,0x69,0xc4,0xb1,0x2a,0x91,0x2f,0x57,0x19,0xc1, +0x3a,0x46,0x4b,0x99,0x6f,0x39,0x01,0x3d,0xe8,0x2b,0xe0,0x39,0xd3,0x37,0xbf,0x5b, +0x2c,0x68,0xcd,0x2e,0x14,0x4e,0xed,0xf2,0xf5,0xd1,0x4e,0x3e,0x74,0x0f,0x32,0x5c, +0xf6,0x4f,0xf2,0x40,0xc6,0x10,0x61,0xe7,0xf4,0x56,0x27,0x81,0x53,0x2f,0x65,0xec, +0x0e,0xa5,0x07,0x9d,0xc4,0x2d,0xbf,0xf6,0xcb,0x2e,0x99,0x2f,0x9b,0x69,0x8b,0x61, +0x3e,0x7b,0x64,0x03,0x6a,0xf3,0x51,0x1f,0x38,0x32,0x84,0xf4,0xe8,0x1d,0xbd,0xf0, +0xa0,0x0f,0x14,0x7a,0x9c,0x3d,0x90,0x5d,0x68,0x11,0x6d,0x83,0xd1,0x0f,0x02,0x78, +0xfd,0xdc,0xac,0x7e,0xc4,0xb8,0x66,0xd0,0x25,0x13,0x3b,0x89,0xa1,0x72,0x5f,0x83, +0x32,0x18,0x69,0x1e,0x41,0xbb,0x4c,0x89,0x45,0xad,0xac,0x81,0x24,0xa3,0xf2,0xd6, +0x54,0xe5,0xad,0x1f,0x95,0x35,0x50,0xc5,0x1c,0x5a,0xba,0x14,0x65,0x30,0x7c,0x50, +0x81,0x51,0xc5,0x46,0xd8,0x03,0xab,0x10,0x6a,0x48,0x8d,0x74,0xd7,0x72,0x49,0x2e, +0x10,0xc5,0x48,0x25,0x43,0x15,0xdc,0xb7,0x4d,0x4b,0x71,0x0b,0x75,0x9c,0xc0,0xb3, +0xa4,0x9e,0xfd,0xd5,0x11,0x32,0xea,0xab,0xf2,0x52,0x85,0xec,0xf4,0x1e,0xf5,0x3e, +0x94,0x17,0xad,0x66,0x0d,0x3a,0x26,0x19,0x5b,0x18,0x32,0x77,0xd1,0xc7,0x14,0x50, +0x9b,0x55,0x25,0x66,0x99,0xa7,0x11,0x40,0x50,0x15,0x33,0x09,0xfa,0xac,0x77,0xfe, +0xa4,0xaf,0xb6,0x62,0x95,0x34,0xde,0x71,0x0c,0xae,0x2e,0xb1,0x7f,0xf1,0x78,0x79, +0xfb,0xcb,0x33,0xef,0x43,0x5f,0xe8,0x5b,0xc9,0x6a,0x25,0xcf,0xdb,0x33,0xbf,0xee, +0xa7,0xa4,0x70,0xb9,0xbf,0x19,0x1b,0xbc,0x96,0x7b,0x9a,0xe6,0x04,0xc7,0x71,0xf5, +0xda,0xcd,0x9e,0x48,0xd3,0xad,0x0f,0xb0,0xcf,0x57,0x8c,0xed,0xd9,0x30,0xc7,0xbe, +0x43,0x87,0xae,0x6f,0x94,0x32,0x07,0xa0,0xcc,0xd0,0xc8,0x8c,0x1b,0x07,0xc7,0x2c, +0x3c,0x05,0xb5,0xcc,0xf6,0xb3,0x17,0x01,0x52,0x13,0x66,0x05,0xe4,0x33,0xb7,0x31, +0xe2,0x52,0xef,0xc9,0x39,0x98,0x3f,0x4a,0x48,0x50,0xa6,0x9b,0xd9,0x72,0x8c,0x87, +0xfb,0x0b,0x60,0x82,0x79,0xce,0xef,0x23,0x60,0xdb,0xea,0x9d,0x3c,0x38,0x88,0x60, +0x67,0x35,0xac,0x32,0x6a,0xa1,0xc7,0xb6,0x3f,0x6b,0xce,0xc5,0xd9,0xa0,0x69,0x32, +0xe5,0x2d,0x46,0x47,0x98,0x59,0x20,0x45,0x3f,0x4f,0xcf,0x21,0x35,0x61,0x57,0x14, +0x78,0x8c,0x39,0xe9,0x68,0x02,0xf9,0xa2,0x61,0xc9,0xe3,0x57,0xbd,0xb2,0x18,0xc6, +0x5a,0x68,0x20,0x9f,0x35,0x1b,0x9c,0xf8,0x45,0x64,0x48,0x95,0x1f,0x91,0xb8,0x6d, +0x29,0x1e,0x57,0x11,0xdd,0xd4,0x7a,0x6b,0xbd,0x45,0xfc,0xf2,0x24,0x99,0xe6,0x41, +0x5b,0x53,0xb8,0xdd,0x33,0xd9,0x4e,0x73,0x31,0xc2,0xeb,0x15,0x2d,0x1d,0x69,0x40, +0xed,0xf4,0xe1,0xd2,0x62,0x01,0x10,0x0d,0x48,0x41,0x51,0x7a,0xe4,0x95,0x7f,0x0b, +0x3f,0xfa,0x9a,0xf1,0xe9,0xcb,0x72,0xc2,0x74,0x85,0xcc,0x28,0x3f,0x5d,0xbf,0xf5, +0xec,0xea,0xd4,0x18,0x7e,0x8c,0x45,0xbe,0x37,0x63,0x2a,0x5c,0xee,0x8c,0x9b,0xe4, +0x65,0x03,0x58,0xff,0xbd,0x5b,0xcc,0x58,0xd8,0x48,0xe5,0x06,0x37,0x8e,0xd2,0x65, +0x00,0xfd,0x78,0xec,0x11,0xa6,0xfb,0xaa,0x69,0xc3,0x83,0xd4,0x71,0xe6,0x3c,0xf2, +0x06,0xf9,0x77,0xb0,0xe3,0xc2,0x70,0x2a,0x56,0xa4,0x4a,0xa9,0x94,0x65,0x4a,0x53, +0x09,0x36,0x57,0xcd,0x23,0x52,0x20,0x7b,0xe8,0x8c,0x9a,0x60,0x3a,0xe0,0x31,0xcf, +0xbf,0x17,0x00,0x8f,0x8a,0xc2,0x7c,0x6f,0xfd,0xfb,0xfb,0x6b,0x59,0x9e,0x87,0xd9, +0x5b,0x4a,0xd4,0x98,0x41,0xa7,0xc0,0x1b,0xeb,0x4d,0x9b,0xdf,0xc1,0xe0,0x1f,0x62, +0x6c,0x1b,0x0d,0x04,0xe0,0xff,0xa4,0x4a,0x54,0x92,0xcf,0x4e,0x20,0xbd,0x12,0xe2, +0x1d,0x10,0x51,0xd8,0xc0,0xed,0x3d,0x36,0x63,0x95,0xb0,0x99,0x5f,0xa4,0x6d,0xaa, +0x24,0x32,0x9d,0x79,0x18,0xbf,0xf5,0xb1,0x69,0x74,0xeb,0xe7,0xf4,0x5d,0x65,0x60, +0x21,0x1e,0x97,0x7c,0x06,0xf2,0xc6,0x37,0xe3,0xf5,0xed,0x88,0x89,0x26,0x1b,0x2a, +0x33,0xd9,0x18,0x36,0x3e,0xbb,0xe4,0x90,0x55,0x4c,0xf2,0x62,0x0d,0xe8,0x56,0x34, +0x37,0xda,0x9e,0xd7,0x7b,0x18,0x6f,0x70,0xe7,0x3a,0x8b,0x74,0x55,0xe7,0xc9,0x58, +0xa7,0x86,0x85,0x74,0x19,0xbb,0x8d,0xc7,0x07,0x79,0xd5,0xe2,0xf0,0x4d,0x6c,0x35, +0x22,0xc6,0xfe,0x37,0xbb,0x4c,0x45,0x23,0xbb,0x78,0xa7,0xf4,0x54,0x92,0x74,0x91, +0xc7,0xfc,0xfc,0x89,0x54,0x60,0x9a,0x34,0x97,0x9a,0x25,0x2a,0x01,0x3b,0x4c,0x9b, +0x2c,0x49,0x18,0x6d,0xb1,0xb4,0x86,0x44,0x90,0xb7,0x06,0x45,0x80,0x95,0x18,0x69, +0x51,0xf4,0xd9,0x89,0x5d,0x39,0x68,0xce,0xdf,0x99,0x8d,0x50,0xcf,0x2a,0x75,0x9a, +0x7f,0x04,0x3f,0x77,0xe0,0xf9,0xdc,0xfb,0xad,0x20,0xd8,0x7f,0xcd,0x5f,0x91,0x35, +0x62,0x11,0xe2,0xea,0x41,0xbc,0xe3,0x0a,0x6a,0x23,0xac,0xac,0xdd,0xfa,0x4e,0x7f, +0xd1,0x42,0x2e,0x3b,0xac,0xa6,0xa7,0x85,0x69,0x67,0x86,0x38,0x27,0xb3,0x9c,0x23, +0xbb,0xd1,0x77,0x4b,0xc5,0x21,0xe7,0xd4,0xbb,0x9c,0xa7,0xea,0x9d,0xde,0x6d,0x27, +0xe7,0x9b,0xae,0xb9,0xd4,0xb0,0x27,0x04,0xdc,0x49,0x48,0xdb,0xff,0xff,0x3e,0xad, +0x68,0x0d,0xfd,0xc6,0xb1,0x26,0x47,0x52,0x64,0x95,0x17,0xff,0xab,0x0e,0xf3,0xe0, +0x20,0xf0,0xe8,0x96,0xc5,0x4e,0x18,0x34,0x1d,0x10,0xe0,0x74,0x49,0x23,0xfe,0x72, +0xb6,0x61,0x22,0xef,0x96,0x98,0x40,0x1e,0xfa,0xd9,0x2e,0xbe,0x25,0xc4,0x77,0x17, +0xe2,0x26,0xb1,0x24,0xbb,0x2c,0xba,0x91,0x1d,0x60,0x01,0x28,0x24,0x97,0xc7,0x52, +0x26,0xab,0x7f,0x75,0xb3,0xf5,0x12,0x84,0xb5,0xd1,0x82,0x7a,0xb9,0x00,0x70,0xaf, +0xea,0x6d,0xde,0x36,0xe4,0xd8,0xdf,0x5c,0xce,0xc8,0x14,0xe4,0xa4,0x98,0xe5,0x23, +0x75,0x63,0x3e,0xad,0x84,0x6b,0x83,0x5a,0xac,0x04,0x8b,0x64,0x71,0xcb,0x5f,0x33, +0xa7,0xac,0x6a,0xb7,0x53,0x8a,0xbe,0x9e,0x22,0x91,0x75,0xeb,0xd0,0xf5,0xd1,0xfb, +0x84,0x05,0xe2,0x12,0xbf,0x25,0xfe,0x5b,0x62,0xce,0xea,0xa8,0x5a,0xca,0x32,0xeb, +0x63,0x67,0xb0,0xef,0x1c,0x8d,0x19,0x78,0x0d,0xe2,0x36,0xae,0x05,0x63,0x93,0xfa, +0xea,0x6f,0xd5,0xad,0x3b,0x6b,0x13,0x5a,0xea,0xcc,0x95,0x69,0x31,0x22,0x6d,0x25, +0x60,0xba,0x03,0x58,0xbb,0x3b,0x4b,0x21,0xa2,0x68,0x1b,0x1c,0xc7,0x2a,0x3a,0x4c, +0xe3,0x44,0xba,0x7d,0xbb,0x8d,0xab,0x52,0x78,0xf9,0x8c,0x8e,0x5e,0x91,0x32,0x5f, +0x2f,0x0b,0x6a,0x2e,0x79,0x99,0x0c,0xfc,0x17,0x1c,0x03,0x76,0x5d,0x36,0x71,0xba, +0x0e,0xaa,0xfb,0x7d,0x6a,0x81,0x06,0x57,0xa8,0xbb,0xe1,0x5d,0xff,0x2c,0x1b,0x51, +0xe8,0x2f,0x0b,0x3c,0x66,0x4a,0xf7,0x06,0x55,0x12,0xbf,0x3d,0x83,0xe4,0xe7,0x73, +0x16,0x51,0x9f,0xc8,0xd9,0x78,0xef,0x24,0x62,0x18,0x05,0x57,0xf4,0xfd,0xb3,0xa1, +0x1f,0xbe,0xf7,0xb3,0x90,0x5d,0x24,0x5e,0xe2,0x5c,0x0c,0x44,0x14,0xd0,0xb2,0x51, +0xd7,0x12,0x45,0xe4,0x50,0x3f,0x7d,0xc3,0x5f,0x5c,0xc7,0xbb,0x1b,0x16,0xd8,0xef, +0xcb,0x40,0x6a,0xef,0x67,0x39,0x60,0x73,0x40,0x55,0x0e,0x46,0x75,0xfe,0x1e,0x4e, +0x5e,0x56,0xa2,0x01,0x31,0x4d,0x34,0xfe,0x07,0x59,0xaa,0xc9,0x74,0x8e,0x0a,0xaf, +0x00,0x67,0xf4,0x2e,0x9f,0x38,0x54,0xf4,0x1c,0x35,0xcd,0x70,0x1e,0x35,0x85,0x87, +0x03,0x12,0x7a,0x41,0x85,0x72,0xaa,0xa6,0x20,0x36,0x8b,0x18,0x96,0xcd,0x17,0x5c, +0xdf,0x55,0xb2,0xa6,0xa4,0x48,0xe2,0xc1,0xe7,0x51,0x71,0x86,0x9f,0xd1,0x78,0x24, +0x0c,0xb5,0x07,0xff,0x3d,0x7a,0xb5,0x5a,0x6e,0xe2,0xc4,0x0b,0x93,0x1c,0x59,0xeb, +0x1f,0x9a,0x3a,0xe3,0x9a,0x94,0xde,0x61,0xd3,0x55,0xca,0x4f,0xfd,0xf4,0xd2,0xb9, +0x57,0xb5,0x9b,0xbf,0x4d,0x35,0x77,0x2b,0x3c,0x45,0x07,0x5d,0xc1,0xdb,0xf0,0x6a, +0xdb,0x5a,0x03,0xac,0x18,0xba,0x27,0xd2,0x68,0x56,0xcd,0xa3,0x12,0x1f,0x86,0xdf, +0xd1,0xb1,0x2a,0xb7,0xa4,0xb7,0x06,0x65,0xc9,0x5a,0x43,0x9f,0x1e,0xda,0x8e,0x5c, +0x5a,0xa2,0xee,0x56,0x3a,0x37,0x26,0x9a,0x9c,0xa2,0xe4,0x6f,0x43,0x82,0x46,0x4d, +0xe0,0x65,0xe7,0x27,0x4b,0xb7,0xf4,0x08,0x4b,0xde,0x46,0x2d,0xeb,0x12,0x71,0xd0, +0x26,0xa9,0x95,0x27,0xc7,0x90,0x06,0xf2,0x0e,0xe0,0xe5,0x6e,0xcb,0xa0,0x3a,0x00, +0xb7,0x2d,0x22,0xf6,0x15,0x01,0x30,0xa0,0x90,0x4f,0x8e,0x0b,0x3c,0x51,0xb8,0xe2, +0x24,0x20,0x24,0x27,0xb4,0x20,0x00,0x59,0xc4,0xcc,0xc6,0x30,0xb4,0x62,0x73,0x73, +0x04,0x94,0x2d,0xf4,0x99,0x0f,0xf1,0xfa,0x7e,0xce,0xa7,0x45,0xb4,0xff,0xfc,0xe0, +0x01,0x08,0x81,0xe4,0x11,0x2e,0x80,0x71,0x64,0xbe,0x9e,0xc4,0x59,0xa2,0x18,0xc0, +0x24,0x54,0xd8,0xb8,0xba,0xa9,0xb0,0xf2,0x09,0xcc,0x8f,0x5b,0xbd,0xa0,0x0a,0x52, +0x06,0x37,0x28,0xd7,0x82,0xe5,0xa7,0x72,0x63,0x87,0x5c,0x86,0x5f,0xea,0x19,0x67, +0x7b,0xe8,0x1e,0xc5,0xb0,0x2e,0xf5,0x9e,0xce,0x87,0xcb,0xd7,0x02,0x49,0x33,0xde, +0xfb,0xc5,0xb6,0x5b,0xe0,0x73,0xe1,0xfe,0xc1,0xee,0x7e,0x16,0xa1,0xa6,0x15,0xbb, +0x3a,0x27,0xf0,0x0d,0x1a,0xe1,0x1a,0x48,0xb8,0xcb,0xeb,0x34,0xb9,0x69,0x86,0x69, +0x33,0x7f,0x0a,0x6c,0x7f,0x8d,0x97,0xbe,0x16,0xf0,0xe8,0x20,0xb6,0x8d,0x87,0x2f, +0xa2,0x55,0x27,0x3f,0x3d,0x05,0x84,0x8a,0x51,0x37,0xa4,0xdc,0x58,0x67,0x55,0xb6, +0x64,0xd8,0x6b,0x7e,0x60,0xe9,0x8c,0x53,0x3e,0x74,0x2b,0xcf,0xfa,0x4a,0xa2,0x5d, +0xf5,0x07,0x3d,0xb4,0xf7,0xc6,0x02,0x08,0xcc,0xcf,0xac,0x42,0x5e,0x48,0x0c,0xde, +0x45,0xf6,0x95,0xda,0x78,0x59,0xba,0x1b,0xe9,0xc0,0x08,0x1c,0x7e,0x2d,0xa2,0x76, +0x88,0xcc,0x1e,0xa3,0x9e,0x23,0x76,0x89,0xfd,0x9a,0x3a,0x42,0x5c,0xea,0xab,0xdf, +0xfe,0x30,0xd1,0xa0,0x62,0xc3,0x1b,0xdb,0x93,0xc0,0xc3,0x8e,0xeb,0xef,0x7d,0x0c, +0x81,0x36,0xa4,0x75,0xb0,0x3d,0x8d,0xe0,0xc5,0xad,0x24,0x4e,0xa0,0x3d,0x0c,0x61, +0x86,0x83,0x28,0xa6,0x15,0x1e,0x8b,0x13,0xf8,0x2c,0xfb,0xd0,0x82,0x9d,0x73,0xf0, +0xc6,0x1b,0xf7,0x81,0xb2,0xfb,0x1d,0xc1,0x10,0xd1,0xd3,0xc6,0x0b,0xe9,0x95,0xe3, +0x25,0x35,0x0d,0xe5,0xd7,0xf7,0x90,0x37,0xbe,0xea,0x02,0x29,0xd1,0x5c,0x1a,0x77, +0xc7,0x12,0x44,0xb4,0x54,0x60,0x0e,0x82,0x42,0xcf,0x58,0x99,0xbc,0x85,0xa9,0xef, +0x21,0xd7,0x94,0xa9,0x16,0xc7,0x36,0xe8,0xc4,0x51,0x2e,0xd6,0x6f,0xcb,0x65,0x30, +0xc0,0x1d,0x9b,0xc0,0xd5,0x96,0xb4,0x85,0x15,0x7b,0x4e,0x74,0xc2,0xfc,0xcb,0x57, +0xe5,0xe9,0xb3,0x35,0xb3,0x32,0x82,0x80,0xa4,0x43,0x9d,0xe9,0xc5,0xfa,0x5e,0xae, +0xc5,0x12,0x66,0xef,0xc1,0xfa,0x81,0xdf,0x9f,0x67,0x12,0xcc,0x8f,0x9d,0x82,0x05, +0x09,0x34,0x77,0x80,0x06,0xe9,0x56,0xd8,0xd2,0xd7,0xc6,0xa3,0xbd,0x36,0x65,0x74, +0x45,0x59,0xbc,0xc3,0x83,0x9a,0xcc,0x2f,0xee,0x92,0x8f,0x54,0xd8,0x51,0xfa,0xab, +0xa5,0x34,0x6f,0xfb,0xe1,0xf9,0x07,0x55,0x6e,0xd6,0x81,0x1e,0x96,0xf4,0xca,0x51, +0xc5,0xaf,0xf4,0x12,0x38,0xe7,0x0e,0xf8,0x87,0xd3,0x1a,0x7c,0x63,0xf4,0x3f,0x2a, +0xb1,0x6c,0xe6,0xc7,0x5c,0xc2,0xd9,0x18,0xaf,0x22,0xa1,0x39,0xfd,0x29,0x5d,0x59, +0xae,0x31,0xc6,0x4b,0x89,0x98,0x6f,0xea,0xb2,0x63,0xf1,0x9d,0x5d,0xbc,0xaf,0x5f, +0xde,0xdd,0x78,0x2c,0x3b,0x32,0xc4,0x2b,0xe7,0x00,0x61,0x8d,0x94,0xf0,0x04,0x84, +0x5c,0xec,0xcb,0xe2,0xb5,0x4e,0xe7,0xa4,0x2e,0xd2,0x6b,0xa0,0x6f,0xfc,0x7a,0x11, +0x59,0x64,0x20,0x38,0x35,0x4d,0x10,0x39,0x47,0xa2,0x23,0x6e,0x57,0x91,0x61,0x1f, +0xed,0x0f,0xe3,0x09,0x91,0x03,0xfd,0xa5,0xca,0xb8,0xbe,0x5a,0x09,0xfe,0x31,0xa3, +0xee,0x13,0xb6,0x9a,0x6a,0xbe,0x06,0xce,0xf2,0xb4,0x08,0x7b,0x24,0x3f,0xde,0xb4, +0xeb,0xe5,0x3b,0x60,0xce,0xb5,0x70,0x89,0xe3,0x40,0x45,0x97,0xd6,0xe9,0xd6,0xa4, +0xa2,0x85,0xe1,0x26,0xf4,0x35,0x60,0xa0,0x0f,0x43,0xe0,0x8b,0x30,0xea,0x39,0x71, +0xb7,0x44,0xe6,0x7c,0x03,0xdb,0x53,0xe3,0x42,0xdf,0x83,0xd6,0x39,0x02,0x31,0x3a, +0x85,0xee,0x33,0x7f,0xeb,0xe8,0xd1,0x15,0x60,0x06,0x48,0x86,0x57,0xea,0x62,0xbb, +0xba,0x83,0x63,0xf6,0x23,0x60,0xd2,0xa9,0x8f,0x0a,0x3f,0x53,0xc5,0xfd,0xd5,0x18, +0x7e,0x4b,0x8f,0x7b,0x17,0xd6,0x43,0x6b,0xec,0xc9,0xca,0x03,0x73,0x2b,0x07,0xeb, +0x08,0x9a,0x3f,0x4a,0x96,0xf5,0xdd,0x3f,0xcb,0x68,0xc3,0x16,0xf2,0xbf,0x8b,0x55, +0x5a,0x86,0x27,0x66,0x47,0xb6,0xe3,0x5f,0x0b,0x6b,0x1c,0x11,0x24,0x1a,0x72,0x3b, +0x3a,0x03,0xc3,0xba,0x1c,0x55,0x74,0x88,0xce,0xe8,0x80,0xdf,0xb1,0x08,0x4f,0x5a, +0xc5,0x4c,0xaa,0x1c,0xd4,0xa6,0xda,0x5c,0xfe,0x0f,0xa4,0x7a,0xba,0xee,0xf7,0x3a, +0xb2,0x01,0x39,0x3f,0x71,0x67,0xcc,0x6e,0xa1,0x41,0x43,0x9d,0x20,0xdf,0x2b,0x47, +0xee,0x02,0xca,0xbf,0x9d,0x94,0x9b,0x41,0x6a,0x90,0xad,0x8e,0x57,0x2e,0xa8,0x12, +0x22,0x1a,0x44,0xf1,0xf3,0x3c,0xef,0xa8,0xc5,0xaf,0x5a,0x54,0x8f,0xdf,0x6c,0x27, +0xe1,0x0a,0x4c,0xe1,0xf0,0x3c,0x5d,0xd6,0x17,0x52,0x0a,0xc6,0x9a,0xb0,0x42,0xe7, +0xe0,0x5d,0xbd,0x75,0xe8,0x43,0x4c,0x83,0x45,0xa3,0x84,0x56,0xc8,0xdd,0x79,0x15, +0xcf,0x81,0x9b,0xf7,0x4a,0xee,0xa3,0xb8,0xd2,0xeb,0xc7,0x47,0x99,0xb2,0x3c,0xc2, +0x32,0xe9,0xd4,0xcd,0x20,0x90,0x41,0xd1,0xc3,0xab,0xa2,0x17,0xfe,0x35,0x16,0xd1, +0x80,0x13,0x9a,0x39,0xa2,0x6e,0xe3,0xc0,0x42,0xea,0xae,0x07,0xff,0x34,0xbd,0x43, +0x80,0xa6,0xd6,0x75,0x7a,0x87,0x6b,0xc9,0xcc,0x89,0xab,0xe3,0x13,0xf5,0x6d,0xbc, +0x02,0xe8,0xae,0x2c,0xf1,0xac,0xe6,0x41,0x7d,0xc8,0xa3,0xf3,0x12,0xf4,0xb9,0xa5, +0xd7,0xc5,0x52,0x76,0xbb,0x35,0xae,0x99,0x3b,0x17,0x56,0xd9,0xa0,0x75,0x71,0xe2, +0x1b,0x86,0x2d,0x3c,0xe5,0x1a,0x47,0xbc,0xbc,0x35,0x31,0x87,0x1d,0x3b,0xd6,0x77, +0x51,0x29,0x7c,0x09,0x87,0xa6,0xbf,0x85,0xcc,0xa7,0x8f,0x25,0x25,0x47,0x6f,0x2e, +0x69,0x5b,0xd5,0x86,0x8d,0x79,0xdb,0xe7,0xe7,0x45,0x81,0x91,0x74,0x86,0x82,0x4d, +0x24,0x96,0xa5,0x31,0xa9,0xe7,0xc6,0x1b,0xee,0xd1,0xa4,0x1f,0xf6,0x3d,0x36,0xa7, +0x68,0xfd,0x26,0xd5,0x1f,0x99,0xce,0x10,0xbb,0x31,0x61,0xc0,0x84,0xa6,0xc3,0x4b, +0xaf,0x64,0x22,0x49,0xe1,0xf2,0x05,0x5e,0x01,0x3a,0xa9,0xea,0x5b,0xa1,0x2f,0x79, +0xf9,0x10,0xdc,0x6d,0x73,0x8e,0xe7,0x62,0xf9,0x12,0xdf,0x83,0xdf,0xf2,0x40,0xb1, +0xb6,0x8f,0x43,0xc6,0x50,0x2d,0x38,0x2f,0x77,0x06,0x4f,0x58,0x62,0x3f,0x50,0x35, +0xa6,0xc3,0x50,0x32,0x88,0x1c,0xa8,0x40,0x76,0x6d,0x47,0xcb,0x6e,0x3a,0x1b,0x81, +0x50,0x6b,0xf8,0x5e,0x33,0xb2,0xeb,0x37,0x41,0x93,0x21,0xca,0x9c,0x59,0x28,0x13, +0xa1,0x58,0x04,0x59,0x68,0xff,0xc1,0x17,0xf6,0x5b,0x0f,0xb3,0xae,0xc8,0x00,0xe2, +0x18,0xc6,0x61,0xc2,0x65,0x91,0xc4,0x00,0xb9,0xdf,0xae,0x84,0x52,0xe2,0xf6,0x8d, +0x34,0x07,0x9a,0x53,0x1b,0xcb,0xc0,0x89,0x63,0x1a,0xeb,0x14,0xe8,0xa8,0xed,0x0c, +0x79,0xc4,0x81,0x18,0x35,0xab,0xf9,0x05,0x35,0xd6,0x47,0x1a,0xd2,0xa4,0xd1,0xac, +0x05,0x84,0xc9,0x56,0x1a,0xaf,0xc6,0x42,0x66,0x38,0x1c,0x98,0xc5,0xaa,0x94,0xf7, +0x2d,0xca,0xf8,0x09,0x28,0xea,0x8a,0xca,0x2b,0x65,0x88,0xc5,0xe5,0x84,0xf5,0x7a, +0x0b,0xc1,0xf0,0x36,0x21,0x06,0x91,0xf7,0xec,0xc2,0xe0,0x85,0x65,0xab,0xfe,0x02, +0xfb,0x6f,0x3d,0xfb,0x3d,0x55,0xbe,0xcb,0xeb,0xcc,0xd5,0x63,0xdf,0x83,0xe3,0xf3, +0x63,0xc6,0x0b,0x6d,0xff,0x0c,0x20,0xd3,0xc8,0x86,0x25,0xb5,0x7c,0xe2,0x67,0xa8, +0x3d,0x2e,0x63,0xca,0x65,0xb1,0xc9,0xcf,0xb9,0x61,0x90,0x6e,0xe9,0x80,0x0a,0xfa, +0x53,0x82,0x6b,0x1e,0xa6,0xe3,0x44,0x07,0x39,0x62,0x6a,0x8e,0xc0,0x1c,0x33,0x57, +0xde,0xc3,0xdd,0x2b,0x11,0x28,0x2b,0x56,0x25,0x8a,0xcc,0xe0,0x3f,0xb8,0x0b,0xfb, +0xd7,0x02,0x79,0xdb,0xe6,0x81,0xdf,0x19,0xeb,0x62,0x85,0x79,0x3e,0x6c,0x60,0xcc, +0xa6,0x77,0x3a,0x72,0x95,0x4f,0x49,0x5d,0x57,0x95,0xd2,0x8f,0x81,0x56,0xd3,0x7a, +0x65,0xd3,0x0c,0xe4,0x57,0x16,0x43,0x75,0xbb,0x4c,0xad,0xa9,0x4d,0x55,0x07,0x07, +0xca,0x99,0xff,0xbe,0x88,0x1d,0x8d,0x59,0xf4,0x9f,0xa4,0x67,0xb8,0x26,0x69,0x73, +0xa3,0x70,0x6d,0xe2,0x76,0xbf,0xde,0x73,0xbd,0xc8,0x2f,0x82,0xbd,0x32,0x04,0x86, +0x2d,0x1f,0xb2,0x2b,0x76,0xef,0x17,0xc6,0xdb,0x2b,0x8f,0x1d,0x49,0xf6,0x77,0xb0, +0xd8,0x19,0x8f,0x2b,0x34,0x6e,0x43,0xcf,0x98,0x58,0x3c,0x76,0x72,0x8e,0xe1,0x21, +0x24,0x92,0x82,0x3e,0x66,0x2d,0xa1,0x70,0x47,0x09,0x2c,0xd2,0x4d,0xe9,0xa9,0x56, +0xa9,0x1d,0x8e,0x53,0xec,0x7b,0xae,0xd7,0x68,0x7a,0xea,0x1b,0x49,0xcc,0x1c,0x0e, +0x26,0xd5,0x9e,0x7e,0x72,0xc9,0xd1,0xcc,0xdb,0xc8,0x88,0x9a,0xf1,0x7e,0x14,0x72, +0xc3,0xd6,0xb8,0xfc,0xc6,0x64,0xed,0x1a,0x80,0x29,0x28,0x4c,0x5c,0x0b,0x27,0x8b, +0xac,0x9a,0x67,0xfa,0x6d,0xb7,0x8f,0x44,0x90,0x87,0xb1,0xef,0x37,0x57,0x4f,0x2c, +0x8a,0x80,0x7b,0x65,0x3e,0xb6,0x66,0xe7,0x48,0x7a,0xe5,0x56,0xc5,0xb9,0x62,0x48, +0x2b,0x06,0x4e,0xc7,0x1a,0x37,0x26,0x79,0x0c,0x71,0xf7,0x06,0x7e,0xbe,0x24,0xdf, +0x83,0x92,0xd4,0x6e,0xd3,0x12,0x40,0xcf,0x07,0xd0,0x3c,0x8c,0xdc,0x98,0x1f,0xb4, +0x6f,0xfc,0xba,0xf2,0x55,0xfa,0xe0,0x78,0xc0,0x9f,0xaf,0xf0,0x7c,0xfd,0x7f,0xce, +0xeb,0x99,0x4b,0xfb,0xdc,0x08,0x80,0x88,0x8b,0xbc,0x40,0x1d,0xdb,0xff,0x59,0x8a, +0xe5,0xaf,0xe6,0x59,0x50,0xdf,0x22,0x11,0x2e,0xbf,0x3b,0x4a,0x85,0x9c,0x58,0x21, +0xa0,0xfe,0xc4,0x04,0xe6,0xdc,0x66,0xa6,0x9d,0xa7,0x8e,0x41,0xba,0x88,0x96,0x09, +0x65,0xad,0x2d,0x76,0x97,0x84,0x2f,0xc3,0xaa,0x81,0x2c,0x7a,0x39,0x93,0x37,0x2c, +0xaf,0xdc,0x25,0x87,0x81,0x29,0x23,0xc2,0x0b,0xe8,0xa4,0x04,0xe0,0xcc,0x5a,0x44, +0x21,0x4c,0x7f,0xa6,0xcf,0xb9,0xef,0xa7,0x80,0x04,0x10,0x19,0x34,0xc9,0xf7,0xb6, +0x30,0xf5,0x91,0xc8,0xb6,0xb4,0xdc,0x35,0x1a,0x05,0xce,0xd5,0xb8,0x46,0xe9,0x48, +0xb1,0x24,0x6e,0xe5,0xc6,0xd6,0x59,0x74,0xa9,0x3e,0x05,0xe1,0xbc,0x30,0xb1,0x23, +0x68,0x4e,0x36,0xf5,0xd3,0xc7,0xc9,0xf5,0xaa,0xe2,0x62,0xc4,0xf1,0xc8,0xbd,0x38, +0x84,0xf7,0x43,0x72,0x95,0xae,0x70,0x2c,0x80,0x8b,0x8b,0x28,0x79,0xfc,0x53,0x0d, +0xdc,0x65,0x29,0xfe,0xf9,0xd6,0x64,0xa3,0x22,0xdf,0x36,0x7e,0xda,0xbd,0x39,0xb5, +0x7f,0xf7,0x82,0xcd,0xda,0xd7,0xf0,0x3a,0xa6,0xbc,0x7f,0xad,0x24,0x4a,0xcf,0x47, +0x87,0x15,0xd2,0x8e,0x3c,0x94,0x9b,0xca,0x2d,0xe4,0x79,0x22,0x17,0xc0,0x22,0x56, +0xee,0x87,0x69,0x36,0xcf,0xb3,0x92,0x81,0x95,0x0e,0x82,0xe8,0x34,0x7a,0x4d,0xdc, +0x70,0x10,0x88,0x26,0xbc,0x2b,0xee,0xfc,0x78,0xd2,0x61,0xcd,0x2f,0xc2,0xc3,0xab, +0xaa,0x4e,0x6c,0x33,0x47,0x35,0x8a,0x3d,0xcc,0xc4,0xc5,0x50,0x31,0x9f,0x8b,0xa1, +0x33,0xa2,0x9b,0x54,0x38,0x34,0x9b,0x24,0xb9,0x0e,0x48,0x6c,0xfd,0x6b,0xfe,0x88, +0xdd,0xdf,0xfc,0xb6,0x43,0x30,0xa6,0x12,0x70,0x95,0x38,0x01,0xa5,0x13,0x32,0x30, +0x41,0x51,0xda,0x76,0xe8,0xcc,0x2f,0xb8,0x85,0xe4,0xbb,0xaa,0xa1,0xda,0xde,0x9e, +0xdf,0x88,0x93,0xed,0x4f,0xaf,0x63,0x8b,0xde,0x97,0x3e,0x6f,0x4b,0xdd,0x72,0xe3, +0xcb,0xe2,0xa2,0x6f,0x48,0x92,0xc2,0xb1,0x62,0x5d,0x38,0xb1,0x76,0x65,0xbb,0x3c, +0x24,0x56,0x9b,0x22,0x34,0x17,0x32,0x92,0xc1,0xa9,0x14,0x60,0x03,0x8b,0x72,0x8c, +0xe9,0x4d,0x84,0xd0,0xb6,0x67,0xa3,0x8b,0x0b,0x58,0x1c,0x70,0x02,0xca,0xcc,0x1b, +0x86,0x7a,0x2e,0x41,0xc1,0x17,0x43,0x83,0x8a,0x5b,0x8f,0x6a,0x9a,0x95,0x2d,0x66, +0x31,0x18,0x5d,0x24,0xc7,0x91,0x4b,0x93,0x18,0x8c,0x1d,0x0c,0xde,0xda,0x7d,0x0c, +0x43,0xe2,0xbe,0x73,0xc9,0x7a,0xf6,0x97,0x4c,0x43,0xc6,0x32,0x83,0xd5,0xa2,0x70, +0xeb,0xd4,0x4a,0x62,0x95,0x34,0xa6,0x28,0xce,0xf4,0x1c,0x4c,0xa8,0x26,0xb8,0xd5, +0x8b,0x6a,0xc8,0x28,0x1c,0xd7,0xa6,0xcf,0xc9,0x4a,0xe1,0xfc,0x1a,0x71,0x6d,0x98, +0xa8,0x6b,0x4b,0x72,0x2c,0xe6,0x94,0x59,0xe1,0x14,0x62,0xbf,0xb9,0x2e,0x60,0x94, +0x3f,0xc7,0x98,0xf1,0x1b,0x97,0x54,0x18,0xf5,0xed,0x55,0xab,0x74,0xa3,0x48,0xaa, +0xd0,0x5f,0xd6,0xaf,0x78,0xbc,0x25,0x7c,0x06,0x6a,0x5a,0x01,0x73,0x3c,0xec,0x34, +0x22,0x65,0x97,0xfa,0xd1,0x1d,0x97,0x9c,0x18,0x53,0x68,0x2a,0x2c,0x76,0x10,0x38, +0x4a,0xb0,0x34,0x2e,0x95,0xb2,0x67,0x3e,0x39,0x57,0x68,0x49,0xfd,0x45,0x5d,0xf1, +0x70,0x1b,0x0c,0x79,0xce,0x2b,0x86,0xd3,0xac,0xd0,0xd6,0x22,0x3f,0x66,0xf7,0x12, +0x72,0x8e,0xc9,0x56,0x51,0x5d,0x94,0x41,0x7f,0x67,0xc6,0xa9,0x3e,0x57,0x86,0xfa, +0xd7,0xfd,0x81,0xed,0xfd,0xad,0x4f,0x11,0x41,0xd4,0x31,0x55,0x3f,0x34,0xe9,0x12, +0x12,0x2e,0x10,0x48,0x93,0x7b,0x6a,0xc0,0x1d,0x6e,0xb8,0xc4,0x07,0x4c,0xf8,0x85, +0xc4,0xd4,0xa6,0x39,0xb1,0xa2,0x10,0xd5,0xd4,0xc9,0xdc,0x42,0x8a,0x47,0xd0,0xb2, +0x05,0xc8,0xeb,0x30,0xe0,0xb5,0x1e,0x10,0xb0,0x4e,0xfd,0x9e,0x73,0xa8,0x69,0xa1, +0xb5,0xb4,0xb1,0x5a,0x35,0xbd,0x33,0x81,0xc0,0x2f,0xcf,0xd6,0x34,0xc6,0x6b,0xb5, +0x81,0x7d,0x51,0xa8,0x91,0x4e,0x0e,0x4e,0xc1,0x2e,0x87,0xc3,0xe4,0xf4,0x72,0x3b, +0xad,0x77,0x3a,0x02,0x9c,0x2f,0x63,0xb8,0x4c,0x67,0x00,0xdd,0xb0,0x43,0xff,0x78, +0xf2,0xec,0x3d,0x55,0xa0,0x95,0xd2,0xb0,0x6f,0x1f,0x12,0xb4,0xa4,0x35,0x1d,0x36, +0x8a,0x69,0x33,0x10,0xe8,0x1e,0x10,0xda,0x50,0xaa,0x85,0x23,0x37,0x6f,0x13,0xf3, +0x4f,0x77,0x95,0x6a,0x55,0x21,0x44,0x71,0x70,0xd7,0x80,0x61,0xee,0x2b,0x3c,0xb7, +0x6a,0x37,0x0d,0xcc,0x9e,0x17,0x13,0x08,0xc3,0x1a,0xd2,0x7b,0x6d,0x2d,0x7a,0x53, +0xe8,0x00,0x35,0x5a,0x19,0x76,0xed,0xfe,0x22,0xdb,0x2f,0x18,0xb4,0x0e,0x72,0xcf, +0xe3,0xce,0xdb,0x6f,0x77,0xfe,0x3b,0x63,0xad,0x79,0x4b,0x9c,0xb8,0xf5,0x0b,0x45, +0xbd,0x80,0xed,0xa2,0x9b,0xed,0xc0,0x99,0xc9,0x26,0xa1,0xf0,0xb7,0x2c,0xcc,0x12, +0x00,0x1d,0x0d,0xb9,0x40,0x4d,0x54,0xfc,0x7b,0xdd,0x47,0x89,0x8a,0x0c,0xd6,0xd4, +0x67,0xd0,0x13,0xaf,0xce,0x6c,0x85,0xf5,0xaf,0x09,0x17,0x74,0xf6,0xb7,0x7c,0x11, +0x43,0x82,0x71,0x14,0x15,0x6d,0x2d,0xff,0x05,0x8d,0x08,0xf8,0x21,0xaf,0xc1,0x13, +0x59,0xb3,0xfe,0x6d,0x4c,0x12,0x75,0xe7,0x86,0x64,0x0a,0x93,0xc6,0xd1,0xe9,0x2f, +0x6e,0x2b,0x9a,0x62,0xdf,0xf7,0x76,0x0f,0x6e,0xd0,0x6e,0x99,0x1f,0x57,0xac,0x2b, +0x0c,0x38,0xbd,0xa5,0x4b,0x34,0x36,0xf3,0x5a,0xdc,0x3c,0x3f,0x12,0x08,0xba,0xaf, +0xd1,0x73,0x49,0x54,0xb9,0xbc,0xf5,0x0e,0xe6,0x0b,0xed,0xeb,0x0a,0x15,0xe4,0xb3, +0xcb,0xd5,0xef,0x28,0x56,0x14,0x7b,0x77,0x8a,0xe0,0xe3,0x46,0xd4,0x97,0x8a,0xc8, +0xaf,0x4c,0x9e,0x71,0xcd,0xfa,0xa7,0x2e,0x61,0x17,0x0e,0xd3,0x5d,0xb2,0x7f,0x81, +0x17,0x34,0x96,0x61,0xb2,0xcf,0x87,0xe5,0x6b,0x42,0xfa,0xc1,0xda,0xe2,0xf5,0x94, +0xc2,0x0e,0xe8,0x2a,0x4b,0xdf,0x0f,0xcb,0xda,0x26,0x08,0x4f,0xec,0xe1,0x7c,0x6a, +0x0e,0xdb,0x14,0x11,0xbc,0x7b,0xd9,0xfc,0x04,0xd1,0x38,0x59,0xd9,0x06,0x3f,0xca, +0x28,0xd7,0x75,0x30,0x55,0xb4,0x4d,0x08,0x32,0x6c,0x29,0xef,0x5a,0x07,0x56,0x25, +0xcd,0xdd,0x5b,0x7f,0x8b,0xbe,0xc1,0xa0,0x69,0x86,0x46,0x01,0x9e,0x22,0x57,0x49, +0x40,0x88,0xe7,0xdc,0x90,0x96,0x9c,0x24,0xca,0x42,0xf7,0xcb,0xcd,0x9c,0xeb,0x9e, +0xf6,0xbf,0xd8,0xe2,0x4f,0x6e,0xed,0x79,0x3b,0x4e,0x44,0xb8,0x21,0xf5,0x09,0x20, +0x18,0xb0,0x97,0x86,0x15,0x4a,0x4e,0xcf,0x14,0x43,0x83,0xdb,0xa1,0xbf,0xc8,0x55, +0x95,0xdc,0xe8,0x50,0x3e,0xaa,0x5b,0xc1,0xfe,0x21,0x60,0xc7,0x35,0xce,0xbe,0x11, +0x0d,0x60,0xb9,0xd5,0x4f,0x2d,0x68,0xda,0xab,0x3d,0x01,0x57,0xe3,0x8a,0xc9,0x54, +0x0b,0x0b,0x8d,0xf7,0x13,0x6b,0x47,0xde,0xe3,0x40,0x0f,0xdd,0x4d,0x2c,0x9f,0x20, +0xbe,0xf5,0xb6,0xa2,0x02,0x6b,0xe5,0xc0,0x0a,0x47,0x7c,0x26,0xd1,0xb0,0x88,0xa4, +0x82,0xde,0x30,0xbc,0xd5,0xea,0xc6,0x84,0xb2,0x4a,0xbe,0x70,0x38,0xe3,0xf0,0x7d, +0xf9,0xe6,0x98,0xef,0x35,0x36,0x0b,0x01,0xfe,0x04,0x33,0x7a,0x1c,0xcd,0xff,0xac, +0xa2,0x72,0x90,0xfb,0x34,0x3c,0x99,0x04,0x63,0x4a,0x59,0x2a,0x2a,0x9b,0x94,0xa8, +0x10,0x99,0x99,0x7e,0xbb,0x2e,0x6b,0xd3,0xbc,0x97,0x93,0xca,0xa7,0x73,0x40,0xa5, +0x0f,0x61,0x4a,0xf4,0x67,0xd5,0xfa,0x07,0x6d,0x52,0x36,0xa2,0x5a,0xea,0xbc,0x19, +0x86,0x68,0x0b,0x64,0x3b,0x4f,0xa4,0xd6,0x4b,0x44,0xf0,0x5b,0x2f,0x97,0xaa,0x67, +0x36,0x65,0x30,0x42,0x9f,0x20,0xf9,0x4f,0xe8,0x73,0x5b,0x49,0x5b,0x96,0xd5,0x66, +0x7e,0xb7,0x6c,0xaa,0x29,0x59,0xab,0x4f,0xeb,0x33,0x8c,0xf2,0x5a,0x98,0xd5,0x1e, +0x2f,0x96,0x90,0x94,0xbc,0xa0,0x12,0x71,0x9e,0x10,0xe0,0x8f,0x89,0xb1,0x5b,0xb1, +0x14,0x4c,0x99,0x49,0x3d,0x3e,0xff,0xf6,0x7f,0x98,0x34,0x9c,0x00,0x1e,0xfd,0xa0, +0xaa,0x74,0x92,0xda,0x7c,0x84,0xf0,0x26,0x76,0xb3,0x62,0x23,0x06,0x12,0xc4,0xc5, +0xbe,0x9b,0x93,0x6c,0xba,0xfd,0x0c,0x24,0x65,0x1a,0x6c,0xa6,0x64,0x32,0x77,0xb4, +0xae,0x13,0xd5,0x83,0x55,0xb0,0x2b,0x34,0x6b,0x9f,0xa7,0x52,0x61,0xcc,0x01,0x63, +0xf4,0x3b,0xdb,0x67,0xec,0xb7,0xd5,0x15,0x03,0x49,0x0f,0x6e,0xf3,0xd2,0xba,0x90, +0x2c,0x1f,0xf5,0x66,0x85,0x30,0xdd,0x85,0xb5,0xde,0x65,0xa8,0x71,0x1f,0x7c,0xbd, +0x01,0xc6,0x22,0xb6,0xd9,0x92,0xab,0xe0,0x9d,0xab,0x63,0xc0,0xfd,0x76,0xb3,0x62, +0x2e,0xd7,0xf7,0x8a,0xee,0x88,0xa3,0x0f,0x63,0x75,0xb4,0x8b,0x13,0x35,0x25,0xf6, +0x8b,0x1b,0x9b,0x57,0xb6,0xea,0xae,0x1e,0xea,0x56,0x62,0xe4,0x7f,0x7a,0x2d,0xe6, +0x8e,0x1a,0x62,0xcb,0x65,0xc3,0xc6,0xdf,0x96,0xe2,0xa3,0x62,0x12,0xa4,0x6e,0x96, +0xdf,0xec,0x05,0x80,0x0b,0x8a,0x4f,0x3e,0x8f,0x43,0x06,0x0c,0x6c,0xb0,0x5e,0x66, +0x25,0xb2,0x1f,0x03,0xd2,0x68,0x1f,0x5e,0x5a,0x4e,0x3d,0x84,0xd8,0xc6,0xf8,0x78, +0x17,0x29,0x3f,0x72,0x35,0x97,0x61,0x4f,0x6d,0x28,0xc7,0xad,0xf5,0x7c,0xf2,0x89, +0xc2,0x64,0xd2,0x9c,0x00,0x57,0xe7,0xb1,0x4e,0x4b,0x87,0x05,0x92,0xaa,0xbd,0xb7, +0x5f,0xe3,0x21,0x3f,0xe0,0x97,0xcd,0x4b,0x1f,0x9b,0xa8,0x7a,0x11,0xda,0xd1,0x38, +0x67,0x06,0x65,0x83,0x86,0xc1,0x5e,0xf8,0x6b,0xfd,0xe4,0x0f,0xad,0xd2,0x27,0xfe, +0xc3,0x13,0xa4,0xc9,0x6f,0x63,0xcc,0x53,0x9f,0x32,0x57,0x1c,0x38,0xfe,0xaf,0xa7, +0x4c,0x5d,0x6c,0xeb,0x67,0xda,0x5f,0xf9,0xeb,0xbf,0x38,0x0c,0x21,0x6f,0xe0,0x47, +0x82,0x88,0x2d,0x84,0x15,0xc3,0xdc,0xb0,0x08,0xc8,0x70,0xa2,0x24,0xed,0xac,0x20, +0x0b,0xe3,0xa0,0x31,0xf4,0xae,0x20,0xdf,0x45,0x9a,0x54,0xa5,0x39,0x7c,0xe5,0x7c, +0xef,0x8d,0xfb,0x06,0x37,0xa4,0x75,0xdf,0x6c,0x39,0xca,0x00,0x75,0x5d,0x63,0xae, +0x83,0xeb,0x76,0xba,0x93,0x52,0xbb,0x41,0x3e,0x81,0xdf,0x03,0xd4,0x81,0x64,0xbf, +0x06,0x5f,0xbc,0xd0,0xff,0x2e,0x5f,0x18,0x9f,0x54,0x5f,0x78,0xb2,0x10,0x31,0xd4, +0x60,0x9d,0x24,0x49,0xb4,0x20,0xd7,0x56,0x4f,0xc5,0xa6,0x44,0x17,0xa9,0x09,0xc7, +0x8e,0xd8,0xf3,0xb9,0x69,0x0b,0x51,0x2d,0x1b,0x7b,0x47,0x96,0x3e,0xe2,0x09,0x64, +0xa6,0x8a,0x16,0xbf,0x05,0x0a,0x7d,0x72,0xcf,0xe7,0x98,0x64,0xbd,0x73,0x83,0x4d, +0xb1,0xca,0x5b,0x8c,0x1d,0xcd,0xe8,0x35,0x7f,0x0e,0xeb,0x21,0xb5,0x29,0xea,0x5f, +0x93,0x02,0xf4,0x33,0x15,0x22,0xe5,0x5a,0x4b,0xb2,0x42,0x24,0x39,0x5d,0xaf,0x8d, +0x8d,0x9a,0xf9,0x0e,0x3f,0xeb,0xf1,0x0f,0xbb,0x6c,0x4b,0x27,0x35,0x0b,0xab,0xf9, +0x0d,0x4b,0x54,0xec,0xed,0x04,0x3e,0xc7,0x07,0x30,0x2d,0xd7,0x90,0x16,0x9d,0x3a, +0x4b,0x87,0x9a,0xb8,0x0e,0x51,0x8d,0x6b,0x4e,0xcc,0xd4,0xda,0x86,0x47,0x52,0xa4, +0xf2,0x54,0x5d,0x5f,0x92,0xa1,0x7e,0x85,0x47,0xad,0xaa,0xe0,0xa4,0x16,0x74,0xc9, +0x62,0xc7,0x19,0x6b,0x11,0xac,0x73,0x6a,0xc6,0x31,0x56,0x7b,0x59,0xf8,0x94,0xd9, +0x63,0x06,0x83,0x41,0x59,0x5b,0x84,0x84,0xcf,0xcf,0xfb,0xbd,0x5c,0xa9,0xe4,0x73, +0x9b,0x32,0xc2,0xaa,0x37,0xa2,0xcc,0xe4,0x3e,0x7b,0x30,0x57,0x08,0xf0,0x55,0x69, +0x4e,0xee,0x76,0x75,0xb8,0x4c,0xc4,0x96,0xb0,0x6c,0x2f,0xb6,0x1e,0x00,0x7b,0x6c, +0xf4,0x91,0x0a,0xec,0x69,0xf0,0x69,0x35,0xd7,0xe0,0xe5,0x93,0xb0,0x59,0xec,0x89, +0x52,0x27,0xcb,0xae,0x40,0x15,0x96,0xcc,0xa7,0xda,0x7e,0x5b,0x19,0x88,0x3b,0x38, +0x02,0xa8,0x9a,0xf5,0x5d,0x31,0x74,0xe2,0x66,0x76,0x8a,0x7c,0xa3,0x69,0x93,0x2c, +0xdf,0xcd,0xe4,0xcc,0xff,0x9d,0x7c,0xf2,0x67,0x44,0x5f,0xc0,0xab,0x10,0xda,0x88, +0xc5,0x69,0x65,0x81,0x24,0x12,0x75,0xe3,0xe6,0x75,0x5e,0xb8,0x0f,0x0a,0x57,0x29, +0x4c,0x94,0xca,0x26,0x2b,0xd7,0x7d,0xf3,0xef,0xce,0xa3,0xc4,0xf3,0x5c,0xd9,0x7b, +0x93,0xab,0xb5,0x4e,0x78,0x6c,0x76,0xba,0x4f,0xb0,0xae,0xbd,0x08,0x5b,0xd3,0x8a, +0x46,0xe6,0x3b,0x97,0xbd,0xf4,0x46,0x38,0x6c,0xbc,0xa6,0x42,0xe3,0xbb,0x77,0x75, +0xa0,0x31,0xb4,0x90,0xc4,0x8e,0x57,0xeb,0xc2,0x57,0x91,0x92,0x9a,0x01,0xef,0x6a, +0x12,0x39,0x91,0xb2,0x4e,0x16,0x47,0x46,0xb9,0xdf,0x20,0x47,0x8a,0x1e,0x5d,0x8d, +0xe4,0xc4,0x0e,0x44,0x1c,0x6a,0xde,0x7b,0xeb,0xae,0xc4,0xea,0xfb,0xea,0x7d,0x5e, +0x42,0x56,0x86,0x58,0xc3,0xfc,0xd6,0x72,0xea,0x6f,0xa0,0xf1,0x7b,0xb3,0x2f,0x6b, +0xcd,0xa5,0x98,0x32,0xbe,0xb0,0xdf,0x67,0x6b,0xec,0x56,0xf5,0x62,0x4a,0x57,0xb2, +0x8c,0xfe,0x03,0x5f,0x43,0x9f,0xbf,0x4e,0x34,0xc4,0x9e,0x5f,0x29,0x40,0xdf,0x00, +0x83,0x0e,0xca,0x66,0x4d,0x26,0x18,0x34,0xbd,0x2e,0x3b,0x7b,0xed,0x9c,0x76,0xa0, +0xba,0x8a,0x27,0xff,0xf8,0xa9,0x78,0x74,0x7c,0x4c,0xa7,0x6b,0xac,0x0f,0xe1,0x3e, +0xa4,0x8f,0x2e,0xeb,0x33,0x24,0x73,0xcb,0xc1,0x82,0x51,0x38,0xa2,0x9e,0x18,0x38, +0x32,0x4e,0xf1,0x97,0x4c,0x3c,0x8e,0xd3,0xe5,0x0f,0xff,0xf5,0xd0,0x03,0x78,0xbf, +0x61,0xb0,0x72,0x5b,0xfe,0x8f,0xf3,0x56,0x9e,0xa1,0xb1,0xc4,0x84,0xdb,0x70,0xab, +0x05,0xbe,0x48,0x12,0x81,0x71,0xd8,0x36,0xd1,0xe1,0xaa,0x7c,0xb7,0xc2,0xd2,0xc5, +0xef,0xcd,0xf7,0x41,0xf9,0xa3,0x2f,0x52,0xa9,0xc3,0xf8,0x0a,0x43,0xa3,0xd5,0x2e, +0x68,0x08,0xea,0x5a,0x4b,0x8c,0x0b,0x6b,0x0b,0xe4,0xe8,0xc8,0x37,0xf2,0xfd,0xfa, +0x29,0x18,0xbc,0x5d,0xbb,0x68,0x7c,0x42,0x6a,0xa5,0x35,0xec,0x7c,0x95,0x1c,0xa8, +0xe2,0x8a,0x18,0xe4,0xf5,0x92,0xb6,0xb7,0xf6,0xc4,0x1a,0x23,0x04,0x28,0xc3,0xc0, +0xed,0xf7,0xd8,0xa3,0x79,0x85,0x94,0x8f,0x03,0xc7,0x3f,0xbe,0x85,0x60,0x51,0x20, +0xb1,0x14,0x93,0xf0,0x9d,0xd0,0xfa,0xd7,0x28,0x7d,0xfb,0x79,0x5d,0xe6,0x70,0xb3, +0xfa,0x03,0x67,0x48,0x9d,0x3a,0x75,0x99,0xd6,0x2c,0xd3,0x5a,0xa2,0x97,0x5d,0xa7, +0xe2,0x02,0xca,0x9e,0x98,0x6b,0x25,0x85,0x4b,0x43,0x6d,0x58,0xd4,0x6f,0xfe,0xba, +0x29,0x8b,0x93,0xd3,0x61,0xd5,0xbb,0xe3,0xe8,0x98,0xd3,0xaf,0x59,0x28,0x18,0xa7, +0xaf,0x82,0x7c,0x79,0x19,0x2b,0x33,0xff,0x37,0x0e,0x6c,0x7c,0x56,0x63,0x5c,0x81, +0xd5,0x1b,0xe4,0xc5,0xbc,0x3d,0x54,0xfb,0x42,0xfe,0xae,0x18,0x9b,0x14,0xd3,0x91, +0x05,0xad,0x57,0x96,0x4e,0xd9,0xe3,0xc2,0xb7,0x8e,0xc6,0x18,0x05,0xde,0x81,0x7c, +0xa0,0x53,0x8f,0x84,0x13,0x73,0x12,0xd3,0x6d,0xa4,0xaf,0x22,0x03,0x33,0xb2,0xca, +0x58,0x99,0xd6,0xa2,0xca,0x3a,0x27,0x2a,0x1a,0xde,0x3d,0xc7,0x93,0xa7,0x51,0x44, +0x62,0x8b,0x60,0xa6,0x47,0x3d,0xb8,0x08,0xac,0x19,0x8a,0xd6,0x76,0x38,0xf3,0x97, +0xf9,0x1d,0x94,0xb6,0x44,0x31,0x54,0xe8,0x9b,0xb4,0xfb,0x05,0xef,0x35,0x7a,0xa1, +0xaa,0xa4,0x45,0x82,0x96,0xcb,0xb2,0x69,0x47,0x80,0xb4,0xeb,0x22,0x02,0xc8,0xae, +0x2c,0x81,0x12,0x75,0xc8,0xb7,0xea,0xc5,0xe5,0x0e,0x35,0x7f,0xd1,0xa1,0x82,0x79, +0x8b,0x1a,0x5b,0xeb,0x3e,0x03,0x75,0x52,0x4c,0x5e,0xe8,0xab,0xd9,0x39,0x2e,0xfa, +0x9e,0x7c,0x1e,0xd3,0xc4,0x45,0x66,0x3a,0xb4,0xd6,0x3e,0x4f,0xf5,0xe4,0x35,0x76, +0x2a,0x52,0x13,0x09,0xa8,0x3a,0xb8,0x4b,0x8b,0x7a,0xe9,0xab,0x19,0xf9,0x37,0x49, +0x74,0x64,0x26,0xe3,0x2c,0x96,0x45,0x63,0x4a,0x5d,0xe7,0x99,0x2c,0xc6,0x0e,0xdc, +0xaa,0x0c,0xbd,0x48,0x51,0xc6,0x66,0xd7,0x0e,0x1e,0xa9,0x11,0x7a,0x72,0xcd,0x66, +0x6b,0xb1,0x62,0xf8,0xb4,0x7c,0x7e,0x32,0x23,0x9c,0xbe,0xb8,0x74,0x70,0xf8,0xb0, +0x8b,0x9e,0x78,0x91,0x9b,0x7e,0x8e,0x96,0xa2,0xbf,0xbf,0x6b,0x06,0x3f,0xe0,0xa7, +0x76,0x5e,0x23,0x5d,0x47,0x1f,0x7f,0xaa,0xcf,0x31,0x95,0x03,0x58,0x79,0x98,0xfd, +0xe7,0x89,0xa0,0xfa,0xb5,0xe2,0x4d,0x50,0xd6,0xdf,0xc8,0xa4,0x72,0xa8,0x97,0x23, +0x67,0x2e,0x77,0x76,0x6e,0xcc,0xc8,0xe1,0x43,0xca,0x30,0xcf,0x36,0xa1,0x20,0x87, +0x9f,0x4b,0xa5,0xc9,0xe3,0x47,0x0a,0x83,0x29,0x20,0xc9,0x00,0x77,0xe4,0x7b,0x1a, +0x3f,0x23,0x69,0xfa,0x30,0x5e,0x17,0xb7,0xc7,0x7f,0xc1,0xb5,0xf3,0x6b,0x9b,0xb2, +0xd6,0x55,0xb2,0x24,0x77,0xf1,0x4a,0x91,0x22,0x69,0x98,0x78,0x90,0x10,0x17,0x32, +0x7f,0xe9,0x37,0x5e,0x49,0x2e,0xea,0x35,0x99,0xcf,0xa6,0xe4,0x53,0x4a,0xa1,0x37, +0x0d,0x8b,0xf9,0x43,0x1b,0xe7,0xf8,0xf3,0x39,0x6b,0x17,0x15,0x3d,0x40,0x0b,0x43, +0x84,0x07,0xb8,0x6a,0x7c,0xe3,0x2d,0x00,0xa3,0x47,0x1a,0x84,0x09,0x4c,0xcb,0x79, +0x6e,0x81,0xba,0x9a,0x1a,0x13,0x08,0x6d,0xd2,0xb7,0x22,0xde,0x2f,0x99,0x29,0xe5, +0xec,0xea,0xc8,0x1a,0x1e,0x29,0x5f,0xd1,0xac,0xdf,0x19,0xcd,0xd1,0xa8,0x63,0x78, +0x90,0x2b,0x9a,0x7c,0xf8,0xc6,0x09,0xa5,0x7b,0x47,0xcd,0x29,0x3d,0x69,0xd0,0x68, +0xef,0x72,0xad,0x2b,0x1d,0x95,0x42,0x39,0xc1,0x89,0x04,0x06,0x36,0xaf,0x39,0x4a, +0x8e,0x0c,0xd8,0xfe,0x9e,0x03,0x0c,0x5f,0xa7,0x2d,0x95,0x66,0xb5,0x7a,0x51,0xdf, +0x01,0xef,0xba,0x63,0xf4,0xe9,0x6e,0x41,0x23,0x38,0xc5,0x21,0x8b,0x28,0x5c,0x7b, +0x7d,0x11,0x47,0x2d,0x69,0x25,0xdf,0xf8,0xdb,0xc4,0x58,0x15,0x0b,0x12,0x21,0xc6, +0x74,0x8c,0xd1,0xef,0x1f,0x00,0xe9,0xff,0xe4,0x11,0x5c,0x48,0x34,0x4a,0x9d,0xd3, +0x87,0x4f,0xee,0x7d,0x47,0xb0,0x9b,0x54,0x8d,0x18,0x1f,0xfc,0x89,0x6c,0xa4,0x90, +0xd0,0x9e,0x40,0x05,0x32,0xb9,0x44,0x30,0xb8,0xae,0x22,0x42,0xd4,0x0e,0x98,0xde, +0x5b,0x94,0x65,0x9a,0xc6,0x4f,0x4d,0x84,0x0d,0x3a,0xef,0xa0,0x84,0xb0,0x99,0xec, +0x06,0x2e,0xaf,0x88,0xb2,0xb7,0x82,0x51,0x41,0x32,0xe7,0xb0,0x81,0xb1,0x88,0x42, +0xda,0xb4,0x48,0x84,0xb5,0x60,0x34,0xdd,0x6e,0xb8,0x7c,0x86,0x97,0xfb,0x8e,0xcd, +0xe9,0x18,0x92,0x45,0x5c,0x33,0xdb,0x65,0x86,0x7a,0x35,0x14,0xf5,0xbd,0xc9,0x81, +0x25,0x42,0x07,0xd8,0x78,0x3b,0x5d,0x21,0x32,0x10,0x41,0x05,0x74,0xbe,0x13,0x40, +0xcc,0x11,0x6d,0x24,0x53,0x18,0x1b,0x02,0x25,0x97,0x37,0x15,0x75,0xbf,0xe2,0x0f, +0x6f,0x6b,0xa7,0xf1,0xb1,0x1e,0x0c,0x0f,0xad,0xbb,0x28,0x5a,0xdd,0x47,0x4e,0x98, +0xe5,0x94,0xe2,0xed,0x7e,0x06,0xc1,0x9c,0x5d,0x54,0x01,0xf1,0x1e,0x4d,0x47,0xcf, +0x91,0x95,0xeb,0x4f,0xb8,0x4e,0xe3,0x7b,0x6d,0x62,0x77,0x56,0xd1,0x86,0xd0,0xdc, +0x6f,0xab,0xf4,0x9f,0x68,0xe6,0xeb,0x45,0x2c,0xb8,0xac,0x3b,0x90,0x30,0xe6,0xd0, +0xf8,0x28,0x50,0x3f,0xd6,0xac,0x08,0x74,0x85,0x2a,0xd6,0x8c,0x3d,0x07,0x10,0x40, +0xfa,0xc0,0xcd,0xc4,0xe7,0x09,0x1d,0xa4,0x9e,0x01,0x05,0x1c,0xfd,0xf5,0x80,0x3a, +0x74,0x8e,0x99,0xfd,0x3b,0xa8,0x29,0x70,0xfe,0x71,0x8f,0xc8,0x5f,0x74,0xc4,0x84, +0x12,0x63,0xb1,0xd0,0xad,0xf1,0xd0,0x80,0x32,0x0b,0x3b,0x9d,0xbc,0x08,0x78,0x62, +0x43,0xfe,0xfe,0x03,0xf1,0x46,0x09,0xa4,0x17,0xaa,0xce,0x2b,0x42,0x2e,0x70,0x72, +0x42,0xbe,0x77,0x66,0xea,0x9c,0x40,0x35,0xe4,0x45,0x2f,0x8b,0xa5,0xb6,0x79,0x63, +0xc3,0x7d,0x7a,0xf5,0x98,0x44,0x81,0x5a,0xf3,0x62,0xf0,0x85,0x06,0xdd,0x71,0x93, +0x88,0x67,0x25,0x86,0xb0,0x29,0x18,0x57,0x36,0x2f,0xae,0x8e,0x21,0xf4,0x08,0x68, +0x61,0x72,0x07,0xac,0x48,0x69,0x94,0xe5,0x4c,0xce,0xd0,0x94,0x3b,0x95,0x37,0xa0, +0x9d,0xf4,0x17,0x0f,0xee,0x99,0x4f,0xf4,0x2e,0xd9,0x23,0x6b,0xd7,0xca,0xd2,0xc5, +0x84,0x9f,0x54,0xba,0x94,0xcd,0x55,0x9e,0xa1,0xa4,0x2e,0x1b,0xb0,0x01,0x89,0xd5, +0xf2,0x6b,0xf6,0xab,0x26,0x88,0xe6,0x93,0xe7,0x29,0x7d,0x17,0x5e,0x05,0x3a,0xd8, +0xf5,0x07,0x44,0x88,0x33,0xbf,0x4b,0x22,0xad,0x9e,0xfa,0xee,0xde,0x9d,0xea,0x6e, +0xf2,0xf2,0xd6,0xce,0x1f,0x02,0x28,0xc6,0xb4,0x98,0xba,0xd6,0xa4,0xe0,0x93,0x4f, +0xa8,0x11,0xd9,0x4f,0xe0,0x68,0x51,0x3a,0xe9,0x45,0x03,0xea,0x21,0xe3,0x0f,0x9d, +0xf8,0x56,0xf8,0x6e,0xb8,0x9a,0xe0,0x16,0x96,0x1e,0xbb,0xb7,0xd8,0xcb,0x25,0x88, +0x48,0x87,0x62,0xbd,0x96,0x2c,0x12,0x57,0x42,0x20,0xad,0x4b,0xfb,0xdd,0xec,0xa3, +0x68,0x7f,0xad,0x1c,0x53,0x80,0x5a,0x63,0x85,0xe6,0x7d,0x7a,0x8f,0x09,0x86,0x75, +0x8c,0x4c,0xfd,0x4b,0x65,0x40,0x7b,0xab,0xa1,0x88,0xac,0x1f,0xf4,0xf1,0xdc,0xdd, +0x8d,0xeb,0x6b,0xa3,0x62,0xd0,0x3d,0x74,0x2a,0xe0,0x6f,0x5a,0x7a,0x03,0x23,0x76, +0xa5,0x60,0xb0,0x77,0x1a,0xbb,0xd4,0xd5,0x0b,0x5d,0xa6,0x56,0x30,0xef,0xa4,0x94, +0xa6,0x71,0xd6,0x07,0x47,0xc4,0x80,0xc2,0x96,0x8c,0xcc,0x31,0x33,0xc4,0xad,0x00, +0x25,0x02,0x9d,0xb8,0x5b,0x76,0x6b,0x89,0xe6,0x8b,0x3a,0xdf,0x2d,0x33,0x9d,0x31, +0x9d,0x90,0x2d,0x6b,0xda,0x3b,0xb1,0x22,0xd1,0x59,0x01,0xc7,0x0e,0x31,0xe8,0x5f, +0x21,0x24,0x7b,0x9a,0xb1,0x39,0xb8,0x60,0x9e,0x74,0x14,0x14,0x55,0xc5,0xf5,0xc1, +0x17,0x11,0xc4,0xd1,0x4c,0x15,0x76,0x20,0xc0,0xdd,0xa7,0xb3,0xad,0x7f,0x9a,0x2f, +0xa4,0xe4,0x3a,0xbb,0x3d,0xc0,0xf9,0xa3,0x61,0xeb,0x15,0x84,0x7b,0x7b,0x76,0x53, +0x49,0x50,0x5d,0x28,0xb3,0x76,0x5c,0x02,0x29,0xfc,0x5f,0xaa,0x02,0x8b,0x5f,0xa3, +0x8d,0x13,0x86,0x9f,0x7b,0x10,0x02,0x58,0x49,0x89,0xcc,0xbf,0x5a,0xa8,0x0c,0xeb, +0x34,0x10,0xb9,0x38,0xc9,0x1a,0x61,0xc5,0x48,0x3b,0x9a,0x47,0x06,0xbb,0xc0,0xfa, +0xfd,0x11,0x32,0x2d,0x0c,0xcb,0xd7,0xdc,0x8f,0x57,0x81,0xde,0xd5,0xf3,0x0d,0xeb, +0x9a,0x03,0x0f,0xe0,0xdf,0x55,0x45,0x50,0x91,0x19,0x1f,0x4d,0x31,0xd6,0x7e,0x7a, +0x28,0xdc,0xa6,0x6c,0x64,0x31,0x31,0xe0,0xbe,0x99,0x7d,0x97,0xaf,0xcc,0x16,0xdd, +0x2d,0xa6,0x9e,0x45,0x58,0x1d,0xfe,0x09,0x8b,0xdd,0x71,0xd8,0x92,0x87,0x27,0xca, +0xb7,0x13,0xcd,0xc9,0x19,0x38,0xf0,0xde,0x81,0xfb,0xf7,0x37,0x27,0xa3,0x5e,0xfd, +0x76,0x62,0xb7,0x5f,0x99,0xcd,0xf7,0x73,0x7f,0xcb,0x73,0x6e,0xda,0x75,0x79,0x8a, +0xa1,0x2b,0xb2,0x44,0x12,0x8b,0x28,0x4c,0x65,0x22,0x0f,0xbd,0xa3,0xe4,0x9b,0xf0, +0x03,0xda,0x38,0x08,0x69,0x55,0x42,0x52,0x47,0x3d,0x43,0x48,0x76,0x61,0x59,0xbe, +0x64,0x7d,0xcb,0x1e,0x14,0xcf,0xf1,0xc2,0x55,0x5d,0xb3,0x60,0x2d,0x14,0x43,0x91, +0x84,0x64,0xf9,0x64,0xd6,0x17,0x02,0x6c,0xc3,0xe8,0xe2,0x3b,0x55,0x61,0x8c,0xd9, +0x05,0xe4,0x70,0x59,0x74,0x2f,0x12,0x7c,0xa2,0x30,0x34,0x9a,0x56,0x55,0x48,0x95, +0x78,0x85,0x4e,0xad,0xeb,0xb5,0x26,0x40,0x4f,0x89,0x3c,0x09,0x59,0x1a,0xbe,0x42, +0xa2,0x56,0x24,0x7a,0x90,0xe4,0xc7,0x92,0x2e,0xa6,0x0e,0x19,0xa4,0x8a,0xf9,0xd1, +0x8e,0x5a,0x29,0xae,0xba,0x5a,0x18,0x7d,0x17,0xb3,0x69,0x8a,0x28,0x6a,0x78,0x0b, +0xaf,0xca,0xda,0x3c,0x74,0xa5,0x46,0x48,0xb7,0x8a,0x09,0x5e,0x54,0xe1,0xe5,0xf2, +0x05,0xc6,0x51,0x61,0x7d,0xa0,0xbf,0x38,0xa8,0x88,0xe1,0x2a,0xdd,0xf9,0xff,0xc1, +0x6d,0x25,0x5c,0x7c,0x3f,0xc9,0x6c,0xd6,0xda,0x1a,0x37,0x91,0x90,0x6a,0x72,0x99, +0x6a,0x90,0xd5,0xbb,0x68,0x28,0x9c,0x0e,0xae,0x92,0x00,0xce,0x7e,0xbb,0x5a,0x1a, +0x06,0xce,0xca,0x2c,0x7d,0xda,0x55,0x9b,0xd2,0xde,0x09,0x95,0x6d,0xca,0xfb,0xd8, +0xe5,0xca,0xf1,0xa1,0xe7,0x9d,0x05,0x87,0x4f,0xc3,0x99,0xbe,0x41,0xf6,0x69,0x6f, +0x6f,0x21,0xf5,0xff,0x98,0xec,0x9b,0xe1,0xec,0x18,0x49,0x95,0x27,0x82,0x53,0xa4, +0x66,0xde,0x2b,0xa6,0xb2,0x73,0x13,0xfd,0x33,0x8e,0xd8,0x09,0xa6,0xe6,0xdc,0x6a, +0x61,0xdd,0xe4,0xb9,0x3c,0xdc,0xaa,0x56,0x07,0x2f,0x7b,0xe1,0xbe,0x59,0x75,0xda, +0x80,0xfd,0x0b,0x01,0x5e,0x17,0xaa,0x36,0x08,0x1a,0x7c,0x5f,0xb3,0xf2,0x0f,0x53, +0xf8,0x6d,0x8d,0x45,0x60,0x74,0x4d,0x53,0xd1,0x73,0xfd,0xb6,0x15,0x0d,0xca,0x53, +0xed,0xde,0x2d,0x66,0x77,0xf3,0x05,0x23,0x46,0x03,0x3e,0xaf,0x1c,0x09,0xcb,0x99, +0x93,0x28,0xdc,0x96,0x3e,0xbb,0xd1,0xf9,0x0d,0xa0,0xb7,0x62,0x49,0x95,0x32,0xb0, +0xe6,0xf7,0x94,0x54,0x32,0x7f,0x9f,0x09,0x18,0xd5,0xbc,0xe7,0xf7,0xe5,0x3f,0xc4, +0xa0,0x7f,0x85,0x67,0xe0,0x3b,0x36,0x25,0x74,0xd5,0xa5,0xea,0xbe,0xf5,0xa9,0x56, +0xe4,0xb7,0xb7,0xd2,0x14,0x3a,0x15,0x31,0x61,0x22,0xad,0x77,0xbf,0xb5,0x30,0x52, +0x8b,0xd9,0x9c,0x7d,0xd8,0x17,0x16,0x61,0x48,0x9a,0x1a,0x3d,0x19,0xf2,0xee,0xea, +0xd9,0xdb,0xd0,0xac,0xb8,0xaf,0x06,0x8a,0xbc,0x76,0xe3,0x28,0x59,0x74,0x1d,0x63, +0x14,0xd5,0x11,0x7e,0x54,0xea,0xea,0x1d,0x11,0x7b,0xb1,0x52,0xba,0xb8,0x30,0x88, +0xab,0x33,0x8c,0x85,0x65,0x0f,0x9f,0xc9,0x8f,0x02,0x44,0xc1,0x70,0x0d,0x9d,0x3a, +0x76,0x2d,0x19,0x4a,0x45,0x19,0xe6,0xa5,0x93,0xa0,0xa9,0xa4,0xfe,0x9c,0x16,0x2a, +0xf7,0xdf,0xd7,0xac,0x9c,0xd8,0xc1,0xb4,0xda,0x26,0xa0,0xb4,0x79,0x46,0xa7,0xbe, +0x6f,0x43,0x38,0x9f,0x3c,0x0a,0xb7,0x1e,0x91,0x82,0x37,0x16,0x04,0xbc,0xf1,0x2a, +0x0e,0x13,0x00,0x25,0x9b,0x64,0x7f,0x05,0xcd,0x0f,0x7e,0xee,0xa0,0xbe,0x3a,0xf3, +0x64,0xad,0x13,0xee,0xb5,0xdf,0x5e,0xf1,0x64,0xed,0xa7,0xa0,0x36,0x4f,0x40,0x95, +0x62,0xb6,0x60,0x35,0x4f,0xdc,0x50,0xad,0xa8,0x11,0xdc,0x52,0x51,0x61,0x93,0x46, +0x4a,0xda,0xcb,0x18,0xb1,0xa0,0x12,0xe6,0x02,0x62,0x51,0x90,0x31,0x20,0x1f,0x25, +0x87,0xb9,0xc3,0x08,0xb0,0xa3,0x5b,0xca,0x20,0xbc,0x99,0x35,0x30,0x78,0x48,0x22, +0x26,0xdf,0xd6,0x7d,0x14,0xcd,0x69,0x44,0x29,0x4b,0x53,0xe0,0x69,0x6f,0xda,0xa1, +0x7d,0x14,0x58,0xd0,0x7d,0x03,0x26,0x76,0xaa,0x4a,0xd9,0x37,0x4f,0x49,0x75,0xbc, +0xa3,0x7d,0x1b,0x36,0xaf,0x29,0xd1,0x53,0xa2,0x4f,0x39,0xf4,0xf6,0x4a,0x7e,0x85, +0x73,0xad,0x97,0x7d,0x59,0x8c,0x0b,0x46,0x28,0x23,0x5f,0x36,0xdf,0x47,0x30,0x6a, +0x29,0xa8,0x84,0x41,0x98,0x38,0xd2,0x91,0x03,0x4e,0x64,0xca,0x6b,0xc4,0xb5,0x09, +0x6d,0x0d,0x14,0x07,0xf8,0x26,0xae,0x47,0xea,0x27,0x31,0x4f,0x06,0xb8,0xb4,0x3d, +0x8e,0x51,0xd9,0xff,0xec,0x68,0xe5,0xab,0x3d,0x45,0x6b,0x09,0x0d,0x97,0xb1,0xf1, +0x11,0xc0,0x34,0xfb,0xcd,0xfc,0x79,0xa9,0x3c,0xcd,0x60,0x4e,0x86,0x62,0x82,0xad, +0x59,0x17,0xd7,0x2c,0x61,0x25,0xc2,0x0a,0xb9,0x29,0x53,0x6c,0x53,0x8b,0x4b,0x2b, +0x67,0x42,0xc2,0x4f,0x5c,0x05,0x61,0x08,0xcb,0xcb,0x99,0x79,0x52,0x8a,0x23,0x3a, +0xee,0x41,0x98,0x6e,0x52,0x84,0x6b,0xae,0x08,0x5e,0x94,0x68,0xd3,0x89,0x12,0x42, +0x62,0x1e,0x7c,0x74,0x6f,0x3e,0x7b,0x5d,0x4a,0x42,0x87,0x7d,0xdb,0x2d,0x64,0xc4, +0x2f,0x1d,0xbe,0x35,0x1a,0x9f,0x4e,0x35,0x1c,0x12,0x69,0xd6,0x5e,0x2f,0x46,0x6b, +0x82,0x50,0x34,0xb0,0xd0,0x8e,0x46,0x89,0x1d,0xfe,0x86,0xb6,0xc2,0xfa,0x4f,0x7f, +0x03,0x1f,0x21,0xfa,0x13,0x36,0x8b,0xfb,0x41,0x8d,0x2a,0xe2,0x6e,0x2f,0x6d,0xd1, +0x8f,0x1c,0xd7,0xe1,0xc9,0x71,0xbd,0xc3,0x83,0xf4,0xbd,0x3f,0xf0,0x13,0xe7,0x33, +0xae,0x19,0xbc,0x46,0x33,0x63,0xa4,0x82,0x23,0x74,0xd5,0x24,0x36,0xd9,0xde,0x20, +0x16,0xb4,0xf4,0x04,0x6f,0x3a,0x56,0xd2,0xc0,0x53,0x4c,0x09,0x3b,0x34,0xba,0xe5, +0x43,0xb9,0xfd,0x15,0x45,0x39,0x2d,0x83,0xa1,0xa6,0xcd,0xd5,0x09,0x89,0xdf,0x55, +0xce,0xdc,0xad,0x95,0x01,0xea,0x55,0x53,0x16,0x58,0x31,0x8a,0x29,0xaa,0x66,0xc9, +0xac,0x15,0x9a,0xd7,0x99,0x93,0x68,0xaf,0x9d,0x57,0x21,0xcc,0x5c,0x85,0x6e,0x38, +0x77,0x14,0xf6,0x74,0x35,0xe5,0x66,0xfa,0xe5,0x55,0x21,0x27,0x86,0x38,0x4d,0x72, +0x0b,0x5b,0xff,0x98,0x58,0xef,0x87,0xeb,0x49,0x56,0x3b,0x36,0xf9,0xfa,0x45,0x67, +0x0a,0x1d,0x23,0x18,0x6c,0x59,0xbf,0xfb,0x6a,0xf0,0x40,0xbd,0xdd,0xf6,0x7e,0x0f, +0xe8,0x3c,0xbe,0xeb,0xc7,0x33,0xe2,0x97,0xc9,0x1d,0xb5,0xac,0x36,0x81,0x8e,0x28, +0xd9,0xbd,0xee,0x3a,0x2b,0xb0,0x26,0x7a,0x6a,0x9a,0x25,0xd8,0xf6,0xc0,0x4f,0xd8, +0x56,0xdf,0x57,0x25,0x38,0xb5,0x37,0xa9,0x04,0xd3,0xb0,0x12,0x0f,0xe8,0xdd,0xaa, +0xcf,0x73,0x37,0x35,0x63,0xb4,0x67,0x29,0x1c,0x50,0x38,0x02,0x0a,0xa9,0xdf,0x71, +0x51,0x89,0xa6,0xdc,0x30,0x74,0x30,0xe2,0x48,0x3b,0xf4,0xd6,0x6e,0x31,0xec,0xc2, +0x7b,0x4e,0x7c,0x0d,0x77,0xdc,0xa8,0xcf,0x45,0x80,0x1b,0xc5,0xd9,0xec,0xa7,0x70, +0xb1,0xe0,0xf5,0x18,0xb2,0x36,0x35,0x07,0xbb,0xc2,0xcf,0x21,0x35,0x61,0xb9,0x71, +0xc6,0x5c,0xb1,0x9a,0x8b,0x0e,0x63,0x2a,0xb9,0x81,0x46,0x45,0x2e,0xa1,0x98,0x4a, +0xef,0xb5,0x60,0x3b,0x70,0xa2,0x58,0x80,0xc7,0xa0,0x6e,0x83,0xeb,0xeb,0x32,0x3b, +0x73,0xc7,0xed,0xa6,0x93,0xaa,0x26,0xb0,0x45,0x87,0x22,0x86,0x5f,0xea,0x99,0x67, +0xf1,0xa6,0xb1,0xcf,0xb4,0xb6,0x59,0x65,0x47,0xc8,0xe3,0x0b,0xd0,0x0f,0x75,0x98, +0x26,0x38,0x5d,0xa7,0x96,0xa8,0xb0,0x4c,0x44,0xc9,0x46,0xf3,0xba,0xe2,0x5a,0x68, +0x4d,0xc8,0xf0,0x23,0xf7,0xec,0xac,0x78,0xed,0x17,0xed,0xd3,0x5a,0xc3,0x55,0xf8, +0xac,0x01,0x0e,0x7c,0xe2,0x04,0x9a,0x48,0x2f,0x6e,0x3a,0xc7,0x22,0x44,0x5b,0x2f, +0x2d,0x00,0x99,0xbe,0xb2,0x05,0x69,0x03,0xb0,0x65,0x9a,0xd0,0xa7,0xaa,0x2f,0xf9, +0xa9,0x84,0x7b,0x32,0x76,0xef,0x45,0x3c,0x38,0xc4,0xa3,0xd0,0x24,0x9a,0xdd,0x0d, +0xd4,0x84,0xc2,0x5b,0x7d,0x88,0x1a,0x6c,0xcd,0xa8,0xc9,0x8c,0xf2,0x51,0xd5,0xaa, +0xe3,0x5c,0x92,0xf8,0x0f,0xec,0xaa,0xf8,0x4e,0xaa,0x16,0xec,0x5b,0xe5,0x61,0x57, +0x78,0x4e,0x9b,0x68,0xfd,0xa2,0x1b,0x89,0x4d,0xc3,0x8b,0x4b,0x37,0xe7,0x15,0x5d, +0x6e,0x0c,0x8b,0x1f,0x21,0x22,0x41,0x99,0x4d,0xc7,0xf8,0x0c,0xfe,0x69,0xac,0x56, +0xc5,0x9f,0xcd,0x6d,0xcb,0x3b,0x5c,0x2a,0x62,0x6b,0xca,0x92,0x17,0xa9,0x66,0x69, +0x86,0x97,0x83,0xe9,0x96,0x01,0x06,0x50,0xe7,0xf9,0x66,0xd4,0x8a,0x9f,0x45,0x23, +0xfa,0x9f,0x3f,0xbe,0xb2,0x9b,0x0c,0x21,0xe5,0xb5,0xa3,0x93,0xf2,0x1b,0x7d,0x0a, +0x44,0x9c,0xda,0x01,0x6e,0xf2,0x99,0xd1,0xa4,0xf3,0xdf,0xb6,0xf4,0xc3,0x06,0xd3, +0x27,0x39,0x3b,0x20,0x26,0x3f,0x4c,0x32,0x3a,0x5c,0x0f,0xc2,0x97,0x6b,0x97,0x22, +0x5f,0x44,0xcc,0x30,0x04,0x2e,0x0e,0x8c,0xc4,0xb0,0x5c,0x84,0x01,0x5a,0xf5,0xfc, +0x8f,0x1b,0x1a,0x21,0x57,0xad,0x7d,0x01,0x64,0xde,0xb2,0x98,0x8e,0x59,0xad,0xb2, +0x4d,0x6a,0x15,0xf3,0x84,0x5b,0xc2,0x11,0xc3,0x23,0x59,0x95,0x87,0x68,0x46,0x94, +0x49,0x95,0x7d,0x1d,0x43,0xb1,0x4e,0x68,0xef,0xd6,0x09,0x1c,0x78,0x58,0xee,0x7b, +0xc1,0xdb,0x7c,0x6c,0x0e,0x4e,0x46,0x78,0xcc,0x9a,0xd6,0xaf,0x19,0x54,0x47,0x2b, +0xb2,0x95,0x67,0xcb,0xbb,0xf8,0x97,0x69,0x60,0xd4,0x00,0x9b,0xfa,0x30,0x6b,0xfd, +0xe7,0x31,0x6f,0x2b,0x16,0xa0,0x05,0x45,0x8e,0x1f,0x2d,0xf8,0x3f,0x5b,0x1e,0x3a, +0x09,0x4d,0x5e,0xde,0x99,0xfe,0x61,0x6e,0x2f,0x15,0xc9,0x0e,0xd5,0x00,0x16,0x2a, +0x73,0x6c,0x56,0x19,0xfd,0xfd,0xbe,0x8f,0x08,0x70,0xda,0xb3,0xde,0xf4,0xa7,0xaa, +0x27,0x13,0xb8,0x9b,0x8d,0x52,0x2d,0xec,0x86,0x6f,0xcc,0xb0,0xda,0xf8,0x90,0xc7, +0x59,0xcf,0xe7,0xd7,0xb9,0x7e,0xe6,0x19,0x8c,0x6b,0x7b,0xfb,0x98,0x4e,0x3e,0x1d, +0xe3,0x09,0x78,0x86,0x11,0x57,0x6f,0xa4,0x7b,0x37,0x07,0xdb,0xb1,0xe3,0xc8,0xe9, +0x31,0x40,0x39,0x30,0x93,0x22,0x60,0xb2,0x9c,0x3e,0x3c,0x4f,0xf2,0x20,0x85,0x05, +0xd1,0x37,0xf9,0x15,0x33,0x6c,0x81,0xa3,0x1d,0xcd,0x41,0x3a,0x54,0xcd,0x37,0xd8, +0x0c,0x85,0x0d,0x67,0x32,0x20,0xa6,0xd3,0x43,0xbf,0xdf,0xfc,0x38,0x59,0x9f,0x41, +0x06,0x9d,0x3f,0xbb,0xed,0xdb,0xaf,0x9f,0xbd,0xbb,0x2f,0x9b,0xad,0x9b,0x11,0xc6, +0xe4,0x44,0x37,0xab,0xec,0xda,0xa7,0x8f,0xbc,0xba,0x27,0x8b,0xac,0x9a,0xf8,0x3e, +0xe2,0xe6,0x3e,0xba,0x6d,0xd9,0xae,0x9e,0x3d,0xb9,0x2e,0x9a,0x2d,0x99,0xb6,0xae, +0x7c,0xf8,0x36,0xaa,0x6c,0xd8,0xa6,0x8e,0x3c,0xb8,0x26,0x8a,0x2c,0x98,0xc1,0xc8, +0x50,0xbd,0x7d,0xf7,0x9a,0x2b,0xeb,0x53,0xeb,0x4e,0x52,0xd5,0x36,0x65,0xca,0xe1, +0x67,0xd4,0x1a,0x6e,0x1f,0xb2,0x0c,0x5a,0x21,0x44,0x0a,0xbe,0x58,0x11,0x4e,0x18, +0x93,0xb7,0x07,0xfd,0x90,0x25,0xbc,0xc2,0xec,0xb7,0x68,0x0a,0x79,0x95,0x73,0x3e, +0x74,0x04,0xad,0xed,0x91,0x24,0x09,0xf6,0xcf,0xc3,0xc1,0x38,0x7a,0x6d,0xbd,0xb7, +0xf5,0xf3,0x3d,0xb3,0xe5,0xd3,0xad,0x97,0xb5,0xb3,0x2d,0x93,0xa5,0x93,0xb5,0xa7, +0xf4,0xf2,0x35,0xa3,0xe4,0xd2,0xa5,0x87,0xb4,0xb2,0x25,0x83,0xa4,0x92,0xbc,0xb6, +0x75,0xf1,0x3c,0xb2,0x65,0xd1,0xac,0x96,0x35,0xb1,0x2c,0x92,0x25,0x91,0xb4,0xa6, +0x74,0xf0,0x34,0xa2,0x64,0xd0,0xa4,0x86,0x34,0xb0,0x24,0x82,0x24,0x90,0xc4,0x75, +0x23,0x52,0xfc,0x34,0x92,0x9f,0x44,0x5f,0x9b,0x56,0x54,0x25,0xd5,0xd2,0xb9,0xb4, +0xc0,0xee,0xd3,0xf4,0x8d,0xfb,0x24,0x5b,0x45,0xda,0x5c,0x55,0xa3,0x33,0x5a,0x3a, +0xa6,0x5b,0x21,0xa1,0xc3,0x94,0x1d,0x5e,0x41,0x53,0xdb,0x74,0xbb,0x33,0x57,0x75, +0xdd,0x51,0x3c,0x44,0xce,0x3a,0x19,0x35,0x92,0xf7,0xd9,0xd3,0xc5,0x26,0xbb,0x3f, +0xdd,0xeb,0x3b,0x3b,0xcd,0xcb,0xab,0x1f,0x9d,0xab,0x2b,0x1b,0x8d,0x8b,0xb3,0x2f, +0xdc,0xea,0x33,0x2b,0xcc,0xca,0xa3,0x0f,0x9c,0xaa,0x23,0x0b,0x8c,0x8a,0xba,0x3e, +0x5d,0xe9,0x3a,0x3a,0x4d,0xc9,0xaa,0x1e,0x1d,0xa9,0x2a,0x1a,0x0d,0x89,0xb2,0x2e, +0x5c,0xe8,0x32,0x2a,0x4c,0xc8,0xa2,0x0e,0x1c,0xa8,0x22,0x0a,0x0c,0x88,0x1a,0xcb, +0x89,0xc7,0x5d,0x03,0x3c,0x53,0xab,0x4a,0xea,0xa4,0x27,0x82,0x5c,0x03,0xf9,0x94, +0x82,0x59,0x75,0xef,0x18,0xed,0x9e,0x40,0xdf,0x5f,0xb7,0x40,0xab,0x39,0xab,0x0c, +0x0b,0xea,0x66,0x65,0xb0,0x77,0x6e,0xda,0xa1,0x55,0xce,0xdf,0x03,0x81,0x52,0xd5, +0xde,0x1f,0xf7,0xaf,0x42,0x79,0x97,0x64,0x8a,0x3b,0xc0,0x5c,0xff,0x63,0xb9,0x37, +0xd5,0xe3,0x39,0x33,0xc5,0xc3,0xa9,0x17,0x95,0xa3,0x29,0x13,0x85,0x83,0xb1,0x27, +0xd4,0xe2,0x31,0x23,0xc4,0xc2,0xa1,0x07,0x94,0xa2,0x21,0x03,0x84,0x82,0xb8,0x36, +0x55,0xe1,0x38,0x32,0x45,0xc1,0xa8,0x16,0x15,0xa1,0x28,0x12,0x05,0x81,0xb0,0x26, +0x54,0xe0,0x30,0x22,0x44,0xc0,0xa0,0x06,0x14,0xa0,0x20,0x02,0x04,0x80,0xb0,0x22, +0x1e,0x82,0xc0,0x59,0xa7,0xdd,0x34,0xa6,0x4e,0x85,0xb8,0x6a,0xb5,0xef,0x4a,0x2a, +0x17,0xcc,0xc8,0x57,0xec,0xac,0xcb,0xf5,0x47,0x34,0x65,0x0e,0x2a,0xe1,0xcd,0xeb, +0x74,0xcf,0xd9,0x03,0xe7,0xf5,0x68,0x7e,0xc0,0xe0,0x21,0x7c,0x29,0x5e,0x33,0x11, +0x47,0xa7,0xe3,0xe9,0x36,0xc6,0x3d,0x74,0x44,0xcd,0x62,0x93,0xd1,0x58,0x9f,0xbd, +0xf9,0x7b,0x1f,0xb9,0xe9,0x5b,0x8f,0x9d,0xb9,0x3b,0x0f,0x99,0xa9,0x1b,0x97,0xad, +0xf8,0x7a,0x17,0xa9,0xe8,0x5a,0x87,0x8d,0xb8,0x3a,0x07,0x89,0xa8,0x1a,0x9e,0xbc, +0x79,0x79,0x1e,0xb8,0x69,0x59,0x8e,0x9c,0x39,0x39,0x0e,0x98,0x29,0x19,0x96,0xac, +0x78,0x78,0x16,0xa8,0x68,0x58,0x86,0x8c,0x38,0x38,0x06,0x88,0x28,0x18,0x2a,0x0e, +0x83,0xc9,0x9a,0xde,0xeb,0xea,0x32,0xdb,0x80,0xe8,0xee,0x75,0xa1,0x54,0xbe,0x69, +0x52,0x82,0xd2,0x1a,0xfd,0x28,0x8d,0x1e,0xcf,0xc1,0x61,0x9a,0x59,0x52,0x8f,0x2f, +0x8a,0xf1,0xa9,0x2b,0xb8,0x01,0x33,0xe9,0x4f,0x8c,0x6e,0xaf,0xa3,0x7b,0x28,0xea, +0xd2,0x74,0xb3,0xec,0x19,0x06,0x86,0xcb,0xc5,0xc4,0xe7,0xbb,0xf6,0x7d,0x9d,0xb5, +0xf1,0x73,0x1d,0xb1,0xe1,0x53,0x8d,0x95,0xb1,0x33,0x0d,0x91,0xa1,0x13,0x95,0xa5, +0xf0,0x72,0x15,0xa1,0xe0,0x52,0x85,0x85,0xb0,0x32,0x05,0x81,0xa0,0x12,0x9c,0xb4, +0x71,0x71,0x1c,0xb0,0x61,0x51,0x8c,0x94,0x31,0x31,0x0c,0x90,0x21,0x11,0x94,0xa4, +0x70,0x70,0x14,0xa0,0x60,0x50,0x84,0x84,0x30,0x30,0x04,0x80,0x20,0x10,0xfb,0xd7, +0x5f,0xfd,0xf9,0x29,0x10,0x4d,0x4c,0x26,0x01,0x42,0x4b,0x5b,0x13,0x2b,0x34,0x87, +0xa7,0xb9,0x13,0x0d,0xca,0xf0,0x3e,0x50,0x41,0x93,0xdc,0xf6,0xdb,0xfc,0xe5,0x6e, +0x01,0x6f,0x49,0x1c,0xb5,0x32,0x55,0xe7,0x68,0x59,0x35,0xa3,0xcb,0x61,0x89,0xf1, +0xe4,0xb3,0x01,0xec,0x6b,0x4c,0xe0,0x62,0x9a,0xda,0x42,0xc5,0x56,0x0e,0x9b,0x3d, +0xd9,0x6b,0x1b,0x39,0xc9,0x4b,0x8b,0x1d,0x99,0x2b,0x0b,0x19,0x89,0x0b,0x93,0x2d, +0xd8,0x6a,0x13,0x29,0xc8,0x4a,0x83,0x0d,0x98,0x2a,0x03,0x09,0x88,0x0a,0x9a,0x3c, +0x59,0x69,0x1a,0x38,0x49,0x49,0x8a,0x1c,0x19,0x29,0x0a,0x18,0x09,0x09,0x92,0x2c, +0x58,0x68,0x12,0x28,0x48,0x48,0x82,0x0c,0x18,0x28,0x02,0x08,0x08,0x08,0x5e,0xae, +0x1f,0xb8,0x36,0x91,0xb8,0x6c,0xed,0x89,0x6a,0xe0,0xce,0x8a,0xf9,0xa9,0x0f,0xec, +0xfb,0x1b,0x6b,0xe5,0x9e,0xdc,0xbe,0x56,0x61,0x54,0xe7,0xf7,0xda,0xb8,0x9f,0x75, +0x21,0x81,0x03,0xe0,0x9d,0x7a,0x88,0x2f,0xc1,0x0b,0x1b,0x5f,0xf8,0x0c,0x09,0xfb, +0x0e,0x1e,0x8f,0x68,0x99,0x36,0x41,0x66,0xde,0xfb,0xe6,0x39,0x18,0x44,0x99,0x35, +0xd1,0x63,0x19,0x31,0xc1,0x43,0x89,0x15,0x91,0x23,0x09,0x11,0x81,0x03,0x91,0x25, +0xd0,0x62,0x11,0x21,0xc0,0x42,0x81,0x05,0x90,0x22,0x01,0x01,0x80,0x02,0x98,0x34, +0x51,0x61,0x18,0x30,0x41,0x41,0x88,0x14,0x11,0x21,0x08,0x10,0x01,0x01,0x90,0x24, +0x50,0x60,0x10,0x20,0x40,0x40,0x80,0x04,0x10,0x20,0x00,0x00,0x97,0x4a,0x80,0x05, +0x76,0x8d,0xde,0x85,0xb1,0x8b,0x52,0x92,0x14,0x40,0xce,0xa1,0x58,0xcb,0xac,0x72, +0x40,0x81,0x90,0xe5,0x5b,0x21,0x24,0xb2,0x41,0xa7,0xc6,0xb5,0xd3,0xca,0x7f,0x19, +0x02,0x2a,0x41,0x05,0xfb,0xa0,0x19,0x24,0xc4,0x62,0x90,0x05,0x50,0x48,0x71,0xec, +0xc1,0x41,0xd7,0x1d,0xb1,0x88,0x47,0xd3,0xcd,0xc6,0x59,0x35,0xba,0xe1,0x7e,0x48, +0xc0,0x06,0x3f,0xba,0x14,0xe4,0x46,0xf1,0xa9,0xe6,0xf9,0x23,0x7c,0xe8,0xfb,0xc0, +0x05,0xa5,0x08,0x40,0x82,0xa8,0x1a,0x03,0x5f,0x4c,0xf1,0x73,0x52,0xe5,0x49,0xc5, +0x7e,0xa4,0xd4,0xc1,0xd6,0xbb,0xea,0xd0,0x80,0xe9,0x9b,0x78,0x93,0x67,0x05,0x23, +0xeb,0xa5,0x36,0xd1,0xd7,0xd2,0x2f,0xf3,0xca,0x3a,0xa3,0xa1,0x53,0x47,0x80,0x6a, +0x73,0xda,0x87,0x0c,0x9a,0x20,0x3c,0x2f,0x20,0x47,0x82,0xdd,0x12,0x68,0x7a,0x5e, +0xf5,0x4b,0xea,0x5c,0x0c,0x26,0x1a,0x7b,0x4d,0x49,0x9b,0x1c,0xd9,0xa8,0xdc,0x08, +0x8e,0x8a,0x0e,0xfd,0x90,0x25,0x3d,0x2e,0xe7,0x0a,0xcd,0xa8,0xd0,0xc1,0x89,0x63, +0x0b,0x23,0x0b,0x1c,0x30,0x80,0xf1,0x3d,0xc9,0xe4,0xc5,0xbc,0x5b,0xc0,0xbd,0x3b, +0x48,0x8f,0x02,0x5d,0x8d,0x6e,0x08,0x75,0xe9,0x4a,0x58,0x9a,0x85,0xe1,0x74,0x54, +0x6a,0xed,0xb5,0xa6,0xe4,0xf2,0xda,0x9a,0xea,0xb2,0xd8,0x74,0x59,0x6c,0x03,0xb7, +0x0a,0x5e,0x41,0xf7,0x7b,0x51,0x5f,0x07,0x6b,0xc6,0xf3,0x60,0xd2,0x2e,0x53,0x4c, +0x77,0xad,0x0b,0x4d,0xb1,0xa2,0x11,0x78,0x28,0xc5,0xd3,0x7f,0x59,0x8f,0xbf,0xe2, +0x61,0x50,0x03,0x75,0x3a,0x36,0xba,0x51,0x6a,0x5c,0x95,0x84,0x1b,0x40,0x74,0xe3, +0x71,0x18,0xce,0x1e,0x5a,0x93,0x62,0x20,0x8a,0xf3,0xd8,0x36,0x1a,0x33,0x7d,0xe3, +0xe3,0xcd,0xdb,0x01,0xb0,0x99,0x4b,0x25,0xe0,0xdf,0x95,0xa7,0xb2,0xd9,0x4c,0x6c, +0xc7,0x51,0x8d,0x64,0xa1,0x23,0x43,0xb9,0xc1,0xfc,0x9d,0x44,0xb3,0x7d,0x3a,0xcd, +0xad,0xb9,0x04,0xd0,0xc3,0x2f,0x6c,0xb0,0x66,0x5b,0xee,0x63,0xde,0x2b,0x4d,0x42, +0x23,0x1d,0xb3,0x56,0xb3,0x35,0x26,0x20,0x6b,0x8a,0xe6,0x73,0xdf,0x69,0x40,0x53, +0x22,0xbb,0x3a,0xb7,0x55,0x28,0x6d,0x1e,0xa1,0x76,0xef,0x62,0x5e,0x69,0x09,0x20, +0xb7,0x13,0x12,0xd5,0xc4,0x3d,0xe2,0x21,0x14,0x8f,0xf3,0xf3,0x62,0x2b,0x84,0x62, +0x57,0x10,0xd8,0x85,0x38,0x78,0x13,0x2a,0x69,0x20,0xc8,0x3d,0x78,0xf5,0x70,0x1a, +0x28,0xfe,0xee,0x6d,0x3f,0x39,0x26,0x49,0x6f,0x59,0xde,0x4f,0x61,0x7f,0xdc,0x8d, +0xae,0xba,0x83,0xee,0xd3,0x18,0x37,0x3d,0x83,0x78,0xe9,0x28,0x93,0x6a,0x55,0x98, +0x0a,0xb4,0xd1,0x0d,0x19,0x90,0x41,0x29,0xc9,0xf0,0x97,0xf0,0x9a,0x1b,0x1c,0xca, +0x42,0x2c,0xfc,0x2e,0x96,0xc2,0x2e,0x19,0x3a,0x7c,0xf8,0xeb,0xef,0x73,0x18,0xd0, +0xc0,0x0d,0xfe,0x62,0x50,0x09,0x26,0x8b,0x3b,0x56,0xf7,0xb2,0xb2,0x19,0x39,0xc0, +0xc9,0xe1,0xbc,0x13,0x0d,0x95,0x37,0x29,0x24,0xd3,0x63,0xa7,0x33,0x3a,0x6f,0xcd, +0x63,0x2f,0xcf,0x2c,0x33,0xc0,0x24,0x99,0xbc,0x54,0x76,0x22,0x42,0xa1,0x9d,0xf2, +0x58,0x8f,0xe4,0x84,0x7f,0xe2,0xb0,0x23,0x44,0x80,0x70,0x26,0x3f,0x62,0x22,0x16, +0xa6,0x8c,0xf6,0x87,0x15,0x0a,0x68,0x36,0x4d,0xe9,0xe6,0xb3,0x5d,0x4a,0x41,0x42, +0x31,0x8f,0xa1,0xf6,0xd6,0xa6,0x35,0xbe,0xc0,0xe2,0xb9,0xd6,0x9e,0xe2,0xd6,0xc3, +0x8d,0x0c,0xa8,0x97,0x15,0xa2,0xb9,0x32,0x82,0x83,0xb8,0x17,0x55,0xa1,0xd3,0xd2, +0x00,0x24,0x1d,0xbd,0xe5,0x5b,0x74,0x9c,0xbb,0x4e,0xf2,0x14,0x21,0xc4,0x32,0x4f, +0xa4,0x83,0xd2,0xb9,0xec,0x3a,0xf0,0x4e,0xa6,0xca,0x07,0xa6,0x29,0xe6,0x2d,0xc1, +0x8f,0xfb,0x1a,0xc3,0x9a,0xcb,0x8a,0x3f,0x65,0xc0,0x15,0x07,0x24,0x83,0x65,0x3d, +0x26,0x0f,0x16,0xa9,0x91,0x27,0x19,0x33,0xda,0x4c,0xc7,0x7e,0x94,0x15,0x68,0x0b, +0xfb,0x75,0xfc,0x8f,0x9e,0x03,0x36,0x5a,0x48,0xe8,0xec,0xaf,0xde,0x43,0x4a,0x5b, +0xf0,0x02,0xca,0xef,0x57,0xa9,0xba,0x3b,0x9f,0x89,0xa2,0xcf,0x17,0xe9,0x69,0xf5, +0xd9,0x85,0x63,0x0f,0xf7,0x28,0x6d,0x2f,0xc4,0xde,0x73,0x2f,0xb7,0x68,0xac,0xf9, +0x0f,0xa3,0xf5,0x17,0x8d,0xaf,0x3f,0x99,0xc9,0xeb,0xe5,0xba,0xd5,0x40,0xe2,0xa8, +0xaf,0x73,0x3a,0x3c,0xe1,0x73,0xf6,0x88,0xcc,0xc4,0x09,0x1c,0xd0,0x89,0x6e,0xa4, +0xf2,0x07,0x68,0xde,0x19,0x6d,0x76,0x05,0x2c,0x3d,0xb0,0x3c,0x37,0xe0,0x29,0x4a, +0x6d,0x04,0x23,0x5e,0x95,0xec,0xfa,0x19,0x6d,0xc8,0xeb,0x6e,0x8a,0x12,0x90,0x07, +0x2c,0x02,0x63,0x7b,0x1a,0x5a,0x03,0xf9,0xc6,0x12,0xe3,0x55,0xde,0xf8,0x55,0x44, +0xd4,0xde,0xe2,0x86,0xb4,0xd3,0x72,0xa2,0x0f,0xc0,0xcc,0x24,0x7d,0x8d,0x76,0x93, +0x86,0x97,0x6c,0x96,0x5e,0x33,0x5c,0xf2,0x78,0x5c,0xb0,0xd8,0xd4,0x79,0x92,0x01, +0xa1,0x63,0xfb,0x06,0x36,0x19,0x25,0x52,0xfc,0xd2,0xef,0xba,0x57,0xf4,0xa5,0xaf, +0x06,0x95,0x85,0x66,0xff,0xb3,0x45,0x31,0xe4,0x8b,0x3d,0x55,0x54,0x0c,0xe5,0x33, +0x3a,0xb4,0x64,0xc3,0xe0,0xf4,0x3f,0x0d,0x9d,0x2b,0x4a,0xe4,0x80,0x20,0x5f,0x42, +0xdb,0xd7,0x58,0x3c,0xd6,0xd3,0xbc,0xe6,0x44,0x97,0x7b,0xed,0x75,0xbb,0xd0,0xcf, +0x5e,0x34,0xe5,0xc2,0x57,0xd0,0x8e,0x67,0xa2,0x58,0xf2,0xf8,0xa2,0x62,0xde,0x52, +0xa1,0x17,0x59,0x97,0xbb,0x78,0x7b,0x0a,0x98,0x87,0x8b,0xb1,0x51,0xbb,0x6e,0x1d, +0x8d,0x91,0xf8,0x86,0x3e,0xbc,0x34,0x48,0x68,0xf8,0xfc,0xaf,0x9f,0x72,0x16,0x69, +0x39,0x14,0xf0,0x1a,0x3d,0x34,0x60,0x3e,0x6d,0x72,0x45,0xe2,0xde,0x97,0xde,0x09, +0xaf,0x7c,0xa8,0x7e,0xb6,0xbc,0x0b,0x5a,0xe6,0xd6,0xb3,0x51,0x01,0x70,0x51,0x1e, +0x44,0xcb,0xd1,0x0f,0x56,0x19,0x7d,0xfb,0x6d,0xeb,0x81,0xb6,0x3f,0xfb,0xbe,0xf5, +0x3a,0x47,0xc6,0xcf,0x99,0xac,0xb6,0xfe,0x79,0x9e,0x82,0x13,0x40,0xbe,0x10,0x5e, +0xda,0x3e,0xd4,0x59,0x93,0xa2,0x7e,0x7e,0x2b,0x79,0x3e,0xea,0x83,0x08,0x67,0xb4, +0xc6,0xdc,0x08,0x3d,0x3e,0x8f,0xf5,0x65,0xe8,0xde,0x75,0xd0,0x02,0x9c,0x2b,0x28, +0xa5,0x62,0xa5,0xca,0xdf,0x2f,0xbf,0xea,0x3d,0x52,0xf8,0x7b,0xbb,0x0a,0xb7,0x1c, +0x06,0xc0,0x24,0x66,0x33,0x40,0x63,0x66,0xea,0xbb,0x94,0x63,0xd2,0x68,0x78,0x56, +0xa3,0xff,0x68,0x1c,0x33,0x31,0xaf,0xb5,0x47,0x81,0xbe,0xef,0x05,0xc5,0xb6,0xfc, +0x90,0x4c,0x6d,0x07,0x98,0x4e,0x91,0xa5,0x84,0xb7,0xa0,0x47,0x3b,0xd2,0xf0,0x57, +0x6b,0xa7,0x8c,0x06,0xdf,0x67,0xae,0x0e,0x9d,0x01,0x72,0x28,0x19,0x9d,0x38,0x22, +0x41,0xf4,0x2f,0x36,0xb1,0x65,0xe3,0x79,0xbe,0x94,0xd0,0x64,0x52,0x64,0x40,0xe2, +0xf6,0x0a,0xb0,0x73,0x37,0x25,0x5c,0x37,0xc1,0x4d,0xd8,0x74,0x53,0x65,0x4b,0x01, +0x21,0x00,0xc5,0x65,0x92,0x26,0xc1,0xa6,0xc0,0xb3,0xd1,0x65,0xd2,0x66,0xfd,0x2e, +0x20,0x46,0xc9,0x55,0x93,0x27,0xeb,0x13,0x28,0xf7,0xd9,0x75,0xd3,0x67,0x42,0x0e, +0xc0,0xf8,0xa4,0x98,0x94,0xa3,0x90,0x17,0xb4,0x4a,0xd2,0xaa,0xa4,0x9d,0x08,0xde, +0xab,0x4c,0x71,0x3a,0x09,0xa4,0x99,0x3e,0x81,0xf9,0x19,0x06,0x01,0x28,0xa7,0xf5, +0x08,0xf1,0x87,0xef,0x9e,0xea,0xd3,0x3d,0x34,0xee,0xd3,0x13,0x84,0xdf,0x79,0xbc, +0x2d,0xec,0x5f,0xe2,0x1a,0x25,0xbf,0x5b,0x65,0xb4,0x77,0xbd,0x25,0x4b,0xaa,0xfb, +0x8f,0x4b,0xc2,0x4c,0x1a,0x2c,0x74,0xb7,0x1e,0x0a,0xd2,0x6c,0x5a,0x6c,0x3e,0xa5, +0x2a,0x4f,0xca,0x5c,0x1b,0x2d,0xd9,0x5c,0xc4,0x4f,0xda,0x7c,0x5b,0x6d,0x83,0x5d, +0x78,0x42,0xc3,0x4d,0x9a,0x2e,0xe4,0x57,0x92,0xbb,0xd3,0x6d,0xda,0x6e,0xc9,0x66, +0x0e,0x08,0xcb,0x5d,0x9b,0x2f,0xec,0x78,0x46,0x49,0xdb,0x7d,0xdb,0x6f,0x80,0x04, +0x64,0xe5,0x0c,0x86,0xc5,0x3f,0x74,0xe4,0x6f,0x5d,0xbc,0x66,0xf2,0x78,0xbb,0xaf, +0x79,0x53,0x48,0x11,0x72,0xc2,0x94,0xc8,0x80,0x5e,0xfc,0xf4,0x8a,0x7c,0x3f,0x7e, +0xa6,0xd2,0x31,0xfa,0x13,0x8f,0x5f,0x7e,0x43,0x54,0x7a,0x55,0xa8,0x7d,0x8f,0xae, +0x5d,0xc3,0xed,0xd1,0x8c,0x3c,0x7d,0xf5,0xd8,0x5c,0xef,0xac,0xb1,0x88,0x3c,0xe4, +0xa7,0x33,0xc4,0xc4,0x32,0x34,0x94,0xf4,0x9e,0x18,0xd4,0xe4,0x72,0x74,0xfb,0x2d, +0x33,0x5b,0xcc,0xd4,0x33,0x35,0xf4,0x53,0x1c,0xd5,0xdc,0xf4,0x73,0x75,0x9a,0xd0, +0xa4,0xd6,0xc5,0xc5,0xb2,0x36,0x25,0x27,0x48,0x17,0xd5,0xe5,0xf2,0x76,0x3d,0xf7, +0x41,0x74,0xcd,0xd5,0xb3,0x37,0x9d,0xe5,0x1f,0x1b,0xdd,0xf5,0xf3,0x77,0xc6,0x9c, +0xd4,0xbc,0x16,0x92,0x60,0xcc,0xa2,0x4a,0xea,0x10,0x92,0xae,0x7c,0x83,0xaa,0x65, +0xa9,0xc2,0x7e,0x18,0x7d,0xae,0x66,0xda,0x2a,0xe6,0x29,0x98,0xfc,0x5e,0x47,0x8f, +0x60,0xea,0x04,0x4b,0x52,0x76,0xdb,0xcb,0xab,0x85,0x97,0x6f,0x7b,0x3c,0x0e,0x5f, +0x0b,0x5e,0x27,0x3e,0xc6,0x3a,0x67,0xe6,0x1c,0xa7,0x40,0xac,0xff,0xbb,0xee,0x6a, +0xf5,0xf3,0xc6,0xcc,0x3a,0x3c,0x26,0x2e,0xc0,0x1d,0xd6,0xec,0x7a,0x7c,0xb1,0xfc, +0xa9,0x15,0xce,0xdc,0x3b,0x3d,0xf2,0xba,0xe8,0x53,0xde,0xfc,0x7b,0x7d,0xef,0x6b, +0x2d,0x39,0xc7,0xcd,0xba,0x3e,0xbb,0x69,0x16,0x7e,0xd7,0xed,0xfa,0x7e,0xf9,0xbb, +0x5c,0x19,0xcf,0xdd,0xbb,0x3f,0x37,0x7f,0x17,0x1e,0xdf,0xfd,0xfb,0x7f,0xf4,0x44, +0xa6,0x7e,0x40,0x39,0x30,0x1c,0xf0,0x36,0xb8,0xbe,0x1c,0xa4,0x55,0x65,0xc3,0x69, +0x9a,0xbc,0x2c,0xe7,0xb6,0xa3,0x4c,0xb6,0x0d,0x9f,0xd7,0x2a,0x9d,0x3f,0x5b,0x87, +0xc8,0x92,0x1e,0x5c,0x6d,0x28,0x48,0x65,0x66,0x8c,0x89,0xd4,0x8c,0x46,0x81,0xb1, +0x02,0xa4,0x9b,0xe8,0x17,0xeb,0xf9,0x27,0x54,0x82,0x3e,0x24,0x0a,0xe1,0x88,0xe1, +0x00,0x24,0xe0,0x46,0x16,0xa4,0x78,0x50,0xe7,0x6b,0xf0,0x66,0x56,0xe4,0xf8,0xd0, +0x06,0xf2,0xe8,0x56,0x17,0xa5,0x98,0x4d,0xb3,0x75,0xf8,0x76,0x57,0xe5,0x88,0xc7, +0xc2,0x9a,0xe1,0x47,0x96,0xa6,0x76,0x70,0x1d,0x16,0xf1,0x67,0xd6,0xe6,0x53,0xb1, +0x05,0x8f,0xe9,0x57,0x97,0xa7,0xce,0x6f,0xe3,0x3a,0xf9,0x77,0xd7,0xe7,0xb2,0x14, +0x54,0x7c,0x82,0x6c,0xab,0xcd,0x99,0x51,0x99,0x35,0x52,0x11,0xa0,0xea,0x6a,0xdc, +0xe7,0xc5,0x13,0x4f,0xbe,0x76,0x62,0x07,0xcf,0xc1,0x89,0x27,0x79,0x87,0xa0,0x11, +0xd0,0x3e,0x9b,0xdf,0x41,0xd5,0x71,0x4b,0xd4,0x4a,0x00,0x32,0x24,0x3a,0xdb,0x5d, +0x27,0x70,0x16,0x42,0x62,0xad,0xef,0x49,0x6e,0x8a,0xfb,0x00,0xd5,0x87,0x93,0x28, +0x4d,0x53,0xe2,0x4e,0x1e,0xac,0xad,0x62,0x60,0x8a,0xf2,0x6e,0x5e,0xec,0x12,0xd8, +0x0e,0x9a,0xea,0x5e,0x1f,0xad,0x0a,0xa5,0xa0,0x8c,0xfa,0x7e,0x5f,0xed,0x1b,0x29, +0xcd,0x7e,0xe3,0x4f,0x9e,0xae,0x81,0xad,0x6c,0x82,0xf3,0x6f,0xde,0xee,0xd0,0xb9, +0x23,0x72,0xeb,0x5f,0x9f,0xaf,0xd3,0xd8,0xb0,0x0f,0xfb,0x7f,0xdf,0xef,0x56,0x27, +0xa1,0x97,0x64,0x92,0xc8,0x45,0xf4,0xb3,0x48,0xd6,0x03,0x5b,0x38,0xbe,0x2d,0x4d, +0x86,0xef,0x1b,0x8f,0x33,0x71,0x44,0x96,0xea,0xd3,0x45,0x70,0xd7,0xb4,0xce,0x74, +0xa2,0x72,0x61,0x03,0xf0,0x47,0x3d,0x06,0x87,0xf2,0xc5,0xe1,0x56,0x0c,0x16,0xd5, +0x07,0xdd,0x1a,0xa8,0xe1,0xf1,0x8a,0xb2,0x68,0xdf,0xcf,0x31,0xed,0xbf,0x6c,0xf5, +0x87,0xf8,0xe4,0xc6,0x36,0xb4,0x14,0xa2,0x6a,0x29,0xf4,0xe6,0x76,0xf4,0xe8,0x15, +0xa7,0xb5,0xec,0xd6,0x37,0xb5,0x26,0xf3,0xc4,0x94,0xfc,0xf6,0x77,0xf5,0x86,0x84, +0x78,0x9e,0xe5,0xc7,0xb6,0xb6,0x0d,0x61,0xe7,0x96,0xf5,0xe7,0xf6,0xf6,0xc1,0x13, +0x04,0xd6,0xed,0xd7,0xb7,0xb7,0x1d,0xb3,0xfa,0x5c,0xfd,0xf7,0xf7,0xf7,0x52,0xae, +0xf8,0x28,0x24,0xb1,0xb9,0xbf,0x5e,0xb4,0x2a,0x2c,0xc6,0x8e,0x64,0x35,0x09,0x1a, +0xaa,0x3e,0x47,0x1a,0x79,0xa5,0x81,0xda,0xda,0x7d,0x84,0x5c,0xff,0xf1,0x80,0x97, +0x7c,0x6a,0x4f,0x2c,0xba,0x1a,0xf1,0x2f,0xa4,0xad,0x27,0x2d,0xfd,0x1d,0x87,0x3d, +0xab,0x5b,0x3f,0x58,0xbf,0x4e,0xf9,0xbd,0x25,0x19,0x4d,0xdd,0xbe,0x24,0x8a,0x4a, +0xd2,0xbc,0xe6,0xce,0x3e,0xbc,0xf2,0x08,0xec,0xd4,0xf6,0xee,0x7e,0xfc,0x56,0x29, +0x77,0x39,0xee,0xde,0x3f,0xbd,0x1e,0xba,0xc2,0x20,0xfe,0xfe,0x7f,0xfd,0xcb,0x49, +0xaf,0xcb,0xe7,0xcf,0xbe,0xbe,0xfe,0x99,0x4d,0x9f,0xf7,0xef,0xfe,0xfe,0x80,0xc7, +0x29,0x6a,0xef,0xdf,0xbf,0xbf,0x07,0xdf,0x6d,0xd7,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, +0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, +0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xc0,0x42,0x91,0x25,0xd0,0x62,0x09,0x11, +0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xc1,0x43,0x99,0x35,0xd1,0x63,0x40,0x40, +0x02,0x04,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0x49,0x51, +0x83,0x07,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0x02,0x08, +0x08,0x08,0x82,0x0c,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2c,0x58,0x68,0x0a,0x18, +0x09,0x09,0x8a,0x1c,0x19,0x29,0x1a,0x38,0x49,0x49,0x9a,0x3c,0x59,0x69,0x03,0x09, +0x88,0x0a,0x83,0x0d,0x98,0x2a,0x13,0x29,0xc8,0x4a,0x93,0x2d,0xd8,0x6a,0x0b,0x19, +0x89,0x0b,0x8b,0x1d,0x99,0x2b,0x1b,0x39,0xc9,0x4b,0x9b,0x3d,0xd9,0x6b,0x42,0x48, +0x0a,0x0c,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0x4a,0x58, +0x0b,0x0d,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0x43,0x49, +0x8a,0x0e,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x4b,0x59, +0x8b,0x0f,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xa0,0x60,0x50,0x94,0xa4,0x70,0x70,0x0c,0x90, +0x21,0x11,0x8c,0x94,0x31,0x31,0x1c,0xb0,0x61,0x51,0x9c,0xb4,0x71,0x71,0x05,0x81, +0xa0,0x12,0x85,0x85,0xb0,0x32,0x15,0xa1,0xe0,0x52,0x95,0xa5,0xf0,0x72,0x0d,0x91, +0xa1,0x13,0x8d,0x95,0xb1,0x33,0x1d,0xb1,0xe1,0x53,0x9d,0xb5,0xf1,0x73,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0x06,0x88, +0x28,0x18,0x86,0x8c,0x38,0x38,0x16,0xa8,0x68,0x58,0x96,0xac,0x78,0x78,0x0e,0x98, +0x29,0x19,0x8e,0x9c,0x39,0x39,0x1e,0xb8,0x69,0x59,0x9e,0xbc,0x79,0x79,0x07,0x89, +0xa8,0x1a,0x87,0x8d,0xb8,0x3a,0x17,0xa9,0xe8,0x5a,0x97,0xad,0xf8,0x7a,0x0f,0x99, +0xa9,0x1b,0x8f,0x9d,0xb9,0x3b,0x1f,0xb9,0xe9,0x5b,0x9f,0xbd,0xf9,0x7b,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x20,0x02, +0x04,0x80,0xa0,0x06,0x14,0xa0,0x30,0x22,0x44,0xc0,0xb0,0x26,0x54,0xe0,0x28,0x12, +0x05,0x81,0xa8,0x16,0x15,0xa1,0x38,0x32,0x45,0xc1,0xb8,0x36,0x55,0xe1,0x21,0x03, +0x84,0x82,0xa1,0x07,0x94,0xa2,0x31,0x23,0xc4,0xc2,0xb1,0x27,0xd4,0xe2,0x29,0x13, +0x85,0x83,0xa9,0x17,0x95,0xa3,0x39,0x33,0xc5,0xc3,0xb9,0x37,0xd5,0xe3,0x60,0x42, +0x06,0x84,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0x68,0x52, +0x07,0x85,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x61,0x43, +0x86,0x86,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x69,0x53, +0x87,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0x22,0x0a, +0x0c,0x88,0xa2,0x0e,0x1c,0xa8,0x32,0x2a,0x4c,0xc8,0xb2,0x2e,0x5c,0xe8,0x2a,0x1a, +0x0d,0x89,0xaa,0x1e,0x1d,0xa9,0x3a,0x3a,0x4d,0xc9,0xba,0x3e,0x5d,0xe9,0x23,0x0b, +0x8c,0x8a,0xa3,0x0f,0x9c,0xaa,0x33,0x2b,0xcc,0xca,0xb3,0x2f,0xdc,0xea,0x2b,0x1b, +0x8d,0x8b,0xab,0x1f,0x9d,0xab,0x3b,0x3b,0xcd,0xcb,0xbb,0x3f,0xdd,0xeb,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x24,0x82, +0x24,0x90,0xa4,0x86,0x34,0xb0,0x34,0xa2,0x64,0xd0,0xb4,0xa6,0x74,0xf0,0x2c,0x92, +0x25,0x91,0xac,0x96,0x35,0xb1,0x3c,0xb2,0x65,0xd1,0xbc,0xb6,0x75,0xf1,0x25,0x83, +0xa4,0x92,0xa5,0x87,0xb4,0xb2,0x35,0xa3,0xe4,0xd2,0xb5,0xa7,0xf4,0xf2,0x2d,0x93, +0xa5,0x93,0xad,0x97,0xb5,0xb3,0x3d,0xb3,0xe5,0xd3,0xbd,0xb7,0xf5,0xf3,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0x26,0x8a, +0x2c,0x98,0xa6,0x8e,0x3c,0xb8,0x36,0xaa,0x6c,0xd8,0xb6,0xae,0x7c,0xf8,0x2e,0x9a, +0x2d,0x99,0xae,0x9e,0x3d,0xb9,0x3e,0xba,0x6d,0xd9,0xbe,0xbe,0x7d,0xf9,0x27,0x8b, +0xac,0x9a,0xa7,0x8f,0xbc,0xba,0x37,0xab,0xec,0xda,0xb7,0xaf,0xfc,0xfa,0x2f,0x9b, +0xad,0x9b,0xaf,0x9f,0xbd,0xbb,0x3f,0xbb,0xed,0xdb,0xbf,0xbf,0xfd,0xfb,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, +0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, +0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xc0,0x42,0x91,0x25,0xd0,0x62,0x09,0x11, +0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xc1,0x43,0x99,0x35,0xd1,0x63,0x40,0x40, +0x02,0x04,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0x49,0x51, +0x83,0x07,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0x02,0x08, +0x08,0x08,0x82,0x0c,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2c,0x58,0x68,0x0a,0x18, +0x09,0x09,0x8a,0x1c,0x19,0x29,0x1a,0x38,0x49,0x49,0x9a,0x3c,0x59,0x69,0x03,0x09, +0x88,0x0a,0x83,0x0d,0x98,0x2a,0x13,0x29,0xc8,0x4a,0x93,0x2d,0xd8,0x6a,0x0b,0x19, +0x89,0x0b,0x8b,0x1d,0x99,0x2b,0x1b,0x39,0xc9,0x4b,0x9b,0x3d,0xd9,0x6b,0x42,0x48, +0x0a,0x0c,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0x4a,0x58, +0x0b,0x0d,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0x43,0x49, +0x8a,0x0e,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x4b,0x59, +0x8b,0x0f,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xa0,0x60,0x50,0x94,0xa4,0x70,0x70,0x0c,0x90, +0x21,0x11,0x8c,0x94,0x31,0x31,0x1c,0xb0,0x61,0x51,0x9c,0xb4,0x71,0x71,0x05,0x81, +0xa0,0x12,0x85,0x85,0xb0,0x32,0x15,0xa1,0xe0,0x52,0x95,0xa5,0xf0,0x72,0x0d,0x91, +0xa1,0x13,0x8d,0x95,0xb1,0x33,0x1d,0xb1,0xe1,0x53,0x9d,0xb5,0xf1,0x73,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0x06,0x88, +0x28,0x18,0x86,0x8c,0x38,0x38,0x16,0xa8,0x68,0x58,0x96,0xac,0x78,0x78,0x0e,0x98, +0x29,0x19,0x8e,0x9c,0x39,0x39,0x1e,0xb8,0x69,0x59,0x9e,0xbc,0x79,0x79,0x07,0x89, +0xa8,0x1a,0x87,0x8d,0xb8,0x3a,0x17,0xa9,0xe8,0x5a,0x97,0xad,0xf8,0x7a,0x0f,0x99, +0xa9,0x1b,0x8f,0x9d,0xb9,0x3b,0x1f,0xb9,0xe9,0x5b,0x9f,0xbd,0xf9,0x7b,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x20,0x02, +0x04,0x80,0xa0,0x06,0x14,0xa0,0x30,0x22,0x44,0xc0,0xb0,0x26,0x54,0xe0,0x28,0x12, +0x05,0x81,0xa8,0x16,0x15,0xa1,0x38,0x32,0x45,0xc1,0xb8,0x36,0x55,0xe1,0x21,0x03, +0x84,0x82,0xa1,0x07,0x94,0xa2,0x31,0x23,0xc4,0xc2,0xb1,0x27,0xd4,0xe2,0x29,0x13, +0x85,0x83,0xa9,0x17,0x95,0xa3,0x39,0x33,0xc5,0xc3,0xb9,0x37,0xd5,0xe3,0x60,0x42, +0x06,0x84,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0x68,0x52, +0x07,0x85,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x61,0x43, +0x86,0x86,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x69,0x53, +0x87,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0x22,0x0a, +0x0c,0x88,0xa2,0x0e,0x1c,0xa8,0x32,0x2a,0x4c,0xc8,0xb2,0x2e,0x5c,0xe8,0x2a,0x1a, +0x0d,0x89,0xaa,0x1e,0x1d,0xa9,0x3a,0x3a,0x4d,0xc9,0xba,0x3e,0x5d,0xe9,0x23,0x0b, +0x8c,0x8a,0xa3,0x0f,0x9c,0xaa,0x33,0x2b,0xcc,0xca,0xb3,0x2f,0xdc,0xea,0x2b,0x1b, +0x8d,0x8b,0xab,0x1f,0x9d,0xab,0x3b,0x3b,0xcd,0xcb,0xbb,0x3f,0xdd,0xeb,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x24,0x82, +0x24,0x90,0xa4,0x86,0x34,0xb0,0x34,0xa2,0x64,0xd0,0xb4,0xa6,0x74,0xf0,0x2c,0x92, +0x25,0x91,0xac,0x96,0x35,0xb1,0x3c,0xb2,0x65,0xd1,0xbc,0xb6,0x75,0xf1,0x25,0x83, +0xa4,0x92,0xa5,0x87,0xb4,0xb2,0x35,0xa3,0xe4,0xd2,0xb5,0xa7,0xf4,0xf2,0x2d,0x93, +0xa5,0x93,0xad,0x97,0xb5,0xb3,0x3d,0xb3,0xe5,0xd3,0xbd,0xb7,0xf5,0xf3,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0x26,0x8a, +0x2c,0x98,0xa6,0x8e,0x3c,0xb8,0x36,0xaa,0x6c,0xd8,0xb6,0xae,0x7c,0xf8,0x2e,0x9a, +0x2d,0x99,0xae,0x9e,0x3d,0xb9,0x3e,0xba,0x6d,0xd9,0xbe,0xbe,0x7d,0xf9,0x27,0x8b, +0xac,0x9a,0xa7,0x8f,0xbc,0xba,0x37,0xab,0xec,0xda,0xb7,0xaf,0xfc,0xfa,0x2f,0x9b, +0xad,0x9b,0xaf,0x9f,0xbd,0xbb,0x3f,0xbb,0xed,0xdb,0xbf,0xbf,0xfd,0xfb,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0x90,0xaf, diff --git a/drivers/input/touchscreen/GT917D/FW_EACH.txt b/drivers/input/touchscreen/GT917D/FW_EACH.txt new file mode 100644 index 0000000000000..09980ef2ca352 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/FW_EACH.txt @@ -0,0 +1,11265 @@ + 0x00,0x01,0x60,0x00,0x39,0x31,0x35,0x4C,0x00,0x00,0x00,0x00,0x10,0x62,0x80,0x00, + + 0x55,0x40,0xBD,0xDA,0xFD,0x24,0x34,0xDF,0x44,0x40,0xAF,0xEB,0xE9,0x2C,0xC8,0xB4, + + 0x25,0x41,0x8C,0x90,0x5F,0xA4,0x22,0xB7,0xED,0x5E,0x58,0x35,0x89,0x94,0x01,0x88, + + 0x86,0x02,0x72,0xFC,0x81,0xD9,0x39,0x25,0xC8,0xE2,0xE1,0xE3,0x7A,0x23,0x09,0x05, + + 0x87,0x03,0xB3,0xE6,0xF0,0x25,0x23,0xB6,0x6D,0x4B,0x83,0x4A,0xAE,0x73,0x1E,0xA2, + + 0x12,0xF9,0x91,0xBE,0x36,0x39,0x28,0x69,0xEF,0x76,0xA8,0xB2,0xB3,0xB8,0x37,0x10, + + 0x4F,0x13,0x6D,0xB6,0xF3,0xB4,0xFC,0x02,0xCD,0xEA,0xE2,0x2E,0xE8,0x70,0xD6,0xBE, + + 0x7B,0x65,0x66,0xA7,0x72,0xBA,0xC1,0x6A,0x46,0x12,0x2C,0x17,0x0B,0x39,0x01,0x45, + + 0x48,0x08,0xB2,0x3E,0x47,0x28,0x21,0x81,0xCB,0x21,0x79,0x51,0x61,0x67,0xC0,0xAC, + + 0x2C,0x48,0xCA,0x9B,0xB9,0xA1,0x96,0xDE,0xC8,0x68,0x46,0xAA,0xBE,0x26,0x9A,0xBC, + + 0x2F,0x49,0x04,0xFC,0x9B,0x23,0x3A,0x11,0xA8,0x2F,0x64,0x18,0xE7,0x49,0xCB,0x4A, + + 0xC0,0x01,0x32,0x6D,0xC8,0x68,0xEB,0x21,0x17,0xC5,0xE3,0x6B,0x7A,0x94,0xC8,0xF0, + + 0x2A,0x6E,0xED,0x6F,0x3A,0x2D,0xAF,0xD3,0x8A,0xAB,0x19,0x36,0x5D,0x3F,0xBA,0x6C, + + 0x87,0x1A,0xF0,0x74,0xE9,0x78,0xC2,0xC7,0x42,0x4E,0xFE,0xC7,0x5A,0x56,0xF3,0x7C, + + 0x8E,0xA3,0xB1,0x32,0xCF,0x22,0xFA,0x0B,0xC7,0x1E,0x7F,0x9E,0x9B,0x91,0x3C,0x54, + + 0x41,0x01,0xBB,0x36,0x7A,0xBF,0x6D,0x6F,0xF2,0xE1,0x22,0x6D,0xA2,0xF3,0x70,0xF9, + + 0x66,0x3F,0xF9,0x06,0x2B,0x20,0x25,0x7E,0x6A,0xE0,0x70,0x26,0x28,0xC2,0x04,0x80, + + 0x78,0xF8,0xD4,0x9B,0x1A,0xA4,0x74,0x60,0xFF,0xDD,0xEC,0x96,0x04,0xAF,0xDE,0xB0, + + 0x26,0xE9,0xFA,0xD2,0x97,0x7D,0x6F,0x97,0x9E,0xDB,0x6F,0xB4,0x49,0x8C,0x4F,0x28, + + 0x82,0x11,0x55,0x9E,0x9E,0x7C,0xCE,0xA0,0x6E,0x5B,0x05,0x1F,0xF0,0x02,0x02,0x1D, + + 0x24,0xE6,0xF9,0x68,0x8F,0x71,0xCA,0x11,0x08,0x63,0xBA,0x57,0x31,0x8C,0x64,0xC5, + + 0x24,0x34,0x57,0x9F,0x08,0xEB,0xF0,0x8B,0xEC,0xFB,0xEE,0x0F,0xC5,0x35,0xE0,0xA2, + + 0xFD,0xEA,0xFE,0xED,0xE6,0x96,0xCC,0x1A,0xDD,0x75,0x23,0x8A,0x5D,0xAA,0x6B,0x61, + + 0x69,0xF6,0xFF,0x7D,0x41,0x6B,0x2D,0xC6,0x5B,0x30,0x8C,0x6D,0x0F,0x87,0x77,0x4F, + + 0x54,0x56,0xB5,0x2E,0x52,0xA4,0x19,0x82,0x67,0x66,0xE2,0x50,0x08,0xEA,0xC6,0x59, + + 0xE3,0x03,0x82,0x86,0xC4,0x3B,0x5C,0x35,0x9F,0xD5,0xA1,0x4E,0x5C,0xF5,0x71,0x1A, + + 0xA1,0x11,0xDA,0x18,0x31,0x8D,0x9D,0xE7,0x2A,0x55,0x9F,0xC3,0x05,0x86,0xF8,0xFB, + + 0x4F,0x04,0x47,0x8C,0x60,0xCF,0xF3,0x8E,0xC9,0x7A,0xBC,0x47,0x93,0x75,0xD0,0xDB, + + 0xDE,0xE3,0x50,0x95,0x3E,0x3C,0x09,0xDB,0xC8,0x4E,0x24,0x18,0x0E,0xE6,0x68,0x2A, + + 0x99,0x79,0xBD,0xE8,0x51,0x33,0x28,0xEE,0x83,0x38,0x02,0x16,0xE3,0x1F,0x36,0x32, + + 0xC2,0x59,0x71,0xE1,0xC4,0xE0,0x26,0x8B,0xC8,0x38,0x3B,0x97,0xED,0x75,0x7F,0xE1, + + 0x09,0xB2,0xC6,0x3C,0x3E,0x3E,0x86,0x1A,0x66,0x43,0xFA,0x6D,0x35,0xDE,0x09,0xDF, + + 0x88,0x5F,0x1B,0x23,0x62,0x5C,0x27,0xDD,0xE8,0x6F,0x59,0x87,0x65,0xE0,0xB0,0xA6, + + 0x04,0xC0,0xE8,0x94,0xB7,0xEC,0x22,0x3A,0xD5,0xAC,0x14,0x44,0x70,0xEA,0x28,0x12, + + 0x05,0xC1,0xB2,0xEA,0x15,0xE3,0x32,0x12,0xD4,0xA5,0x43,0x32,0xF8,0xA0,0x21,0x1F, + + 0x84,0x82,0x12,0x41,0xD4,0x59,0xE5,0x71,0x87,0x32,0x31,0x50,0xF0,0x95,0x29,0x9F, + + 0x85,0x83,0x65,0x42,0x17,0xAB,0x31,0x23,0x26,0x09,0x9C,0x31,0x41,0x87,0x90,0x91, + + 0xE7,0xE8,0x45,0xA4,0xF6,0x15,0x08,0x45,0xE7,0x85,0x88,0x29,0xED,0xFF,0x13,0x2C, + + 0x25,0x68,0x97,0x3D,0xCB,0xAA,0xD8,0x98,0x83,0xCA,0x43,0xD3,0xA0,0x58,0x06,0xB8, + + 0x67,0x10,0xCA,0xEF,0xFE,0xA9,0x39,0x6A,0x7F,0x67,0xB0,0x18,0xAA,0x19,0x2F,0xF5, + + 0x4C,0x0A,0xDB,0x6F,0x4E,0x04,0x78,0x05,0xE3,0xB0,0x2D,0x8C,0x26,0x84,0x22,0x0A, + + 0x0C,0xC8,0x57,0xFE,0x14,0xA7,0x12,0x2B,0x09,0x07,0x88,0xA9,0x78,0x15,0x2A,0x1A, + + 0x0D,0xC9,0xF3,0x88,0x7A,0xB1,0x3E,0x3E,0x0D,0xD9,0xC2,0x61,0x8D,0xE6,0x23,0x2A, + + 0x8C,0x8A,0x4B,0x21,0x1B,0x5F,0xDC,0x59,0x4C,0xBA,0x94,0xCD,0x3C,0xFF,0xA0,0x58, + + 0x8D,0x8B,0x2B,0x62,0xC1,0x7F,0x7B,0x1B,0xCC,0xCF,0x89,0x17,0x08,0x5F,0xCE,0xD5, + + 0xF1,0x01,0x9A,0xB4,0xA3,0x78,0x89,0x66,0xF7,0x6D,0x89,0x01,0x70,0x93,0x44,0x1D, + + 0xEE,0x3B,0x92,0x31,0xC3,0xA2,0x02,0x72,0xEA,0x8C,0xF2,0x6E,0xE2,0xDB,0x80,0xB5, + + 0x88,0xAE,0x9B,0x7D,0x69,0x9B,0xD3,0x81,0x6B,0x61,0xB3,0xB8,0xD2,0xD8,0x14,0x29, + + 0x5D,0x10,0xD9,0x00,0x56,0xA0,0x45,0x7C,0xFB,0x60,0x06,0x62,0x4C,0x42,0x1E,0x60, + + 0x88,0x6E,0x0C,0x24,0xEB,0xEF,0x3C,0x08,0x85,0xB6,0x60,0x5C,0x81,0x46,0x2C,0x6F, + + 0x25,0x1C,0x0C,0x85,0x13,0xD5,0x88,0x58,0x84,0xB7,0xC7,0xC8,0xAF,0x2E,0x5E,0x5D, + + 0x13,0x89,0x0D,0x34,0x7C,0xD1,0x81,0x4D,0x05,0xB4,0x8E,0x2D,0xF5,0x52,0xD5,0x9B, + + 0x7A,0x0C,0x76,0x95,0xCA,0x33,0x89,0xF9,0x2C,0x97,0x3A,0x64,0x56,0xCE,0x22,0xC5, + + 0x87,0x87,0xCB,0x9C,0x18,0x28,0x49,0xD3,0xE2,0xC8,0xC9,0x68,0xCD,0x04,0xED,0xD9, + + 0xA3,0xC1,0x4C,0x59,0xCE,0xE3,0xEC,0x5D,0x90,0xE5,0x05,0x84,0xA6,0x8A,0x1D,0xE7, + + 0x18,0xB6,0xCB,0xC1,0x98,0x1A,0x8F,0xEB,0x02,0xD9,0x9C,0x85,0x17,0xCA,0xC9,0xB1, + + 0x4C,0x98,0xD6,0x5C,0x5E,0xF3,0x40,0xC2,0x63,0xCB,0x6D,0x06,0x54,0xF5,0x78,0xA8, + + 0xF9,0x33,0x4E,0x2C,0x98,0x3F,0x1F,0xE4,0xA5,0xBC,0x8C,0xF0,0x87,0xB9,0x1E,0x6B, + + 0x54,0x72,0x06,0x3C,0xE2,0x36,0x10,0xBC,0xFC,0x85,0x05,0xAC,0x5D,0xB7,0xF9,0xD0, + + 0xC7,0x81,0x73,0xA9,0x52,0xD9,0x9E,0x49,0x40,0xC6,0x88,0x45,0x17,0xF5,0x71,0x90, + + 0xAD,0x30,0x6F,0x9F,0xEB,0x65,0x11,0xBC,0x78,0x25,0xFC,0x41,0x05,0xF4,0xD2,0xA8, + + 0x0A,0x96,0x87,0x8E,0x6E,0x13,0x8E,0x99,0xCD,0xCC,0x49,0xD3,0x81,0x21,0xD0,0x53, + + 0x0B,0xEA,0xD1,0x50,0xC4,0x20,0x81,0x84,0x59,0x02,0x81,0xA4,0x51,0x61,0xE5,0xDC, + + 0x0D,0xAE,0x47,0xB1,0x20,0x61,0x8F,0xCF,0x13,0xAF,0x23,0x11,0x07,0x9D,0x94,0xCE, + + 0x02,0x30,0x8A,0x25,0xE3,0x11,0x40,0x52,0x14,0x42,0xD6,0x5A,0x6E,0xFD,0xEE,0x15, + + 0x9E,0x9D,0x64,0xE2,0x00,0xAB,0xEB,0x07,0xE1,0xBF,0x96,0xDF,0xA5,0x0E,0x89,0x6B, + + 0x9F,0xBE,0xD2,0x11,0x9F,0x6E,0x42,0x31,0xCF,0xFE,0x7D,0x42,0x30,0x41,0xE0,0x6B, + + 0x1A,0x0A,0x01,0x82,0x37,0x32,0x81,0x53,0x4E,0xDD,0xF6,0x65,0xC2,0x79,0x32,0x9F, + + 0x72,0x1E,0xD3,0x05,0xBE,0xA6,0x43,0x35,0x4F,0x9C,0x81,0x3C,0xB6,0x23,0xBF,0x32, + + 0xD4,0xDB,0x77,0x29,0x65,0x24,0x40,0x49,0x0D,0x28,0xEA,0xF7,0x6F,0x26,0x76,0x9C, + + 0x05,0xF6,0x08,0xE9,0x4E,0x2F,0xCE,0x86,0x60,0x05,0x18,0xC9,0x74,0x7E,0xED,0x3E, + + 0x48,0x7C,0x2D,0x36,0x8D,0xD0,0x08,0xFA,0x27,0xE0,0x06,0xB1,0xD1,0x86,0x86,0x91, + + 0xC3,0xD2,0x8B,0x12,0x72,0x81,0xB1,0x49,0xE1,0xD6,0xBE,0x81,0xC7,0x7C,0x67,0xE2, + + 0x54,0xA6,0x94,0x0A,0xF3,0x6C,0x48,0x2D,0xC6,0xB7,0xD3,0x5F,0x34,0xA9,0xF7,0x6A, + + 0xD8,0x56,0xF4,0x1B,0x3D,0xA4,0x22,0xD3,0xE5,0x44,0xC3,0xB3,0xBE,0x7B,0x7B,0xC7, + + 0x69,0xB6,0xBD,0xEF,0xF2,0x4E,0x83,0x4B,0x7B,0x2F,0x69,0x2F,0xC2,0xE7,0x31,0x53, + + 0x32,0x4A,0xF5,0x28,0x66,0x86,0xE2,0x1E,0x68,0x34,0x61,0x3F,0xD3,0x70,0x8B,0x77, + + 0x15,0x17,0x5F,0xB7,0xFB,0xAA,0x4A,0xEC,0x34,0x7F,0xB5,0x1A,0x79,0xEC,0x02,0xC9, + + 0xFE,0x42,0x14,0x3A,0xC1,0xB0,0x5B,0x1E,0xB0,0x21,0x76,0x0F,0x44,0xCB,0x7C,0xCD, + + 0xF4,0x3C,0xC3,0xB7,0x17,0x35,0x0A,0x07,0x6F,0xD1,0x8D,0x95,0xDE,0x2F,0x4A,0x26, + + 0x2C,0x0C,0x0B,0xE0,0xC1,0x25,0xE4,0xE2,0x34,0x92,0x46,0xF9,0xA5,0x97,0x8C,0x62, + + 0x91,0x86,0xE6,0x84,0xD7,0x2B,0xEC,0xA8,0x9D,0x1F,0x75,0xD7,0x1C,0xB1,0x14,0x8D, + + 0xD0,0x7D,0x32,0x88,0x13,0x20,0xB8,0x52,0xE2,0x35,0x1C,0xC6,0x96,0x6A,0x0B,0x63, + + 0x84,0x0F,0x63,0xF3,0xA0,0x31,0x85,0x8B,0x64,0xF6,0x6F,0xD6,0xA3,0x7B,0xC9,0x6B, + + 0x58,0x71,0x0D,0x53,0xDD,0x7D,0x75,0xB7,0xE7,0xD3,0x7C,0xC3,0x7E,0xF5,0xBE,0xB6, + + 0xAD,0x92,0xCC,0xC0,0xB2,0xDC,0x9E,0x20,0x60,0x38,0xB4,0xE6,0x0B,0x79,0xB6,0x70, + + 0x0F,0x65,0xCD,0xB2,0xC8,0x59,0x4D,0x16,0x71,0x18,0x19,0x16,0x40,0xE5,0x41,0x81, + + 0xA0,0x9B,0x9C,0xAB,0x17,0xA9,0x0C,0x8E,0x47,0xF0,0x9F,0xF8,0x70,0x75,0x8D,0x29, + + 0xCC,0x1D,0xF3,0x18,0x69,0x88,0x3F,0xF1,0x44,0x4C,0x65,0x0B,0xE3,0x3A,0x79,0xF6, + + 0x26,0xC7,0x97,0x64,0xF6,0xF3,0x7D,0x2C,0x28,0xC6,0x97,0xEC,0x3C,0xF5,0x72,0xBC, + + 0x98,0x10,0x9E,0xB0,0x72,0x22,0x1C,0x62,0x88,0x32,0x0E,0x9C,0x1D,0xB9,0xB8,0x0C, + + 0x57,0x04,0x83,0x85,0xDF,0xAB,0xD7,0xB9,0x3B,0x18,0x6D,0x5C,0x8B,0x5A,0x88,0xE6, + + 0x24,0x78,0x01,0xFB,0x4E,0x90,0x25,0x3E,0x45,0xF7,0x8F,0x90,0xF5,0x7A,0xC4,0x39, + + 0x59,0x9C,0xF8,0x00,0xE8,0xA3,0x31,0x1C,0x7E,0x47,0x29,0x68,0x04,0x71,0xDA,0xDC, + + 0xA2,0x32,0xD4,0xDE,0x88,0xA0,0x62,0x6A,0x6D,0xAE,0xBE,0x5C,0x63,0x72,0xEF,0xF4, + + 0x8E,0x1F,0x2B,0xB6,0x64,0xE3,0x30,0x9F,0xC9,0x6C,0x8E,0x78,0x5F,0x81,0x1F,0xED, + + 0xAF,0x33,0xD5,0xDF,0x29,0x37,0x0A,0x11,0x35,0x92,0x86,0x74,0xD9,0xCF,0x9D,0x9D, + + 0xEF,0x8F,0x3D,0x41,0x1A,0x0F,0xA0,0x58,0xA3,0xD0,0x51,0x50,0xA3,0x8E,0x15,0x89, + + 0x00,0x8E,0xB0,0x07,0x7E,0x40,0xC2,0x3A,0xB8,0x0E,0x5F,0xC0,0xD5,0x61,0x98,0x9D, + + 0x81,0x8D,0xB0,0xEF,0x19,0xEF,0x0E,0xD5,0xD4,0x1F,0x56,0x67,0x9C,0x3F,0x12,0x63, + + 0x05,0x9F,0xAD,0xEA,0x91,0xA0,0xA9,0x49,0x66,0xA6,0x83,0xDF,0x43,0x2C,0xF4,0x5B, + + 0x00,0x1F,0xE5,0xAE,0xCC,0x69,0x13,0x9C,0xBE,0xD5,0xB8,0xEF,0xDB,0x69,0x31,0x28, + + 0xA0,0x95,0x7E,0xA0,0x24,0x13,0x1F,0x82,0xC7,0xDA,0x38,0xB6,0x55,0xFE,0xBF,0x83, + + 0x96,0x0B,0xF9,0x57,0x1B,0x00,0x2A,0x63,0x49,0x3B,0x97,0x0A,0xD0,0x15,0x91,0x51, + + 0xA3,0x9C,0x53,0xB7,0x93,0xE9,0xE2,0xF9,0xC6,0x97,0x1A,0x04,0xBB,0x26,0x38,0x08, + + 0x9E,0x20,0xB3,0x0B,0x3E,0x09,0x0D,0xC8,0xE0,0x15,0xEB,0xA0,0xB9,0x86,0x54,0xF8, + + 0xB8,0x5F,0x06,0xF6,0x8F,0x64,0xAA,0x40,0xEA,0xD9,0x52,0x12,0xBC,0x26,0x5B,0x2F, + + 0x31,0x7C,0x20,0x7C,0xF0,0x15,0x4B,0x0C,0x31,0xC5,0xD1,0x23,0xDD,0x6A,0xA3,0xF9, + + 0x34,0x3D,0xCC,0xE9,0x8F,0x66,0x04,0xDD,0xDD,0x16,0xEB,0x13,0xCB,0xF0,0x52,0xBE, + + 0x0A,0x88,0xF1,0xEE,0x6E,0x25,0x2B,0x05,0xEB,0x7D,0x08,0x18,0xD3,0x6A,0x92,0x52, + + 0xA8,0x96,0xB3,0x8E,0xBA,0xA6,0x5A,0xEA,0xC2,0x40,0xA1,0x7B,0x7B,0x60,0xF3,0x39, + + 0xBD,0x13,0xDD,0x97,0xBD,0xA6,0x8B,0xE3,0x6B,0x5D,0xF5,0x2F,0xCE,0x45,0x5B,0x28, + + 0xE3,0x4E,0x3E,0xDB,0xE1,0xF7,0x1D,0x53,0xC9,0x3C,0xA2,0xE1,0x38,0xAE,0xDB,0xFC, + + 0x0A,0x4F,0xDC,0x97,0xD4,0x31,0x90,0xF1,0xC7,0x7C,0x20,0x57,0x72,0x1B,0xF8,0x68, + + 0xB6,0xBE,0x14,0x6C,0xBA,0x07,0x15,0x50,0xC9,0x7D,0x84,0x16,0x98,0xB1,0x1A,0x26, + + 0x5F,0x0F,0xA3,0x7C,0x87,0x18,0x91,0xE9,0x2D,0x96,0xA5,0x25,0x74,0x2B,0xBD,0xE5, + + 0x56,0x83,0xA5,0x8F,0x86,0xC5,0x99,0xE0,0x46,0x7F,0x15,0x92,0x1C,0x69,0x18,0x46, + + 0x58,0xCC,0xE1,0x42,0x48,0xFF,0xD8,0x67,0x9D,0xB8,0xF7,0x80,0xF4,0xF7,0xD6,0x57, + + 0x29,0x1F,0xCC,0xE7,0xB8,0x08,0x05,0x8E,0xF5,0xDF,0xFB,0x84,0xD4,0xF1,0x2D,0x33, + + 0x95,0x60,0xBC,0x5C,0xD1,0xF5,0xCA,0x78,0x85,0xD2,0x72,0x05,0x74,0xF5,0xBA,0x2C, + + 0x5C,0xF9,0x8B,0xFF,0xD4,0xB3,0x7F,0x1B,0x3D,0x1C,0xFC,0x88,0x50,0xF1,0x9C,0x71, + + 0x3C,0x55,0x1C,0x49,0xFE,0x98,0x92,0xE0,0xA5,0x9C,0xEE,0xEB,0x4F,0x33,0xBE,0xF8, + + 0xDE,0xFC,0x8E,0x0A,0xCC,0x12,0x56,0xBC,0x8C,0xBF,0x41,0xC0,0x5F,0x14,0xDC,0x83, + + 0x49,0x65,0xEF,0xAE,0xDB,0x9A,0x1E,0x8F,0x6F,0xBE,0x0F,0x51,0xEC,0xB7,0x17,0x60, + + 0x01,0x96,0xD7,0x8E,0x5D,0x3A,0xC7,0xB3,0x8E,0xFB,0x39,0xF8,0x1C,0x0D,0x58,0x07, + + 0xF4,0xDE,0x9F,0xB6,0xAC,0xB4,0xA6,0x4A,0x42,0x7C,0xA6,0xF7,0x1D,0xDC,0xC2,0xA8, + + 0xF1,0xDF,0xCE,0x5F,0x0C,0xE0,0x89,0xBD,0x5C,0x6B,0x63,0x06,0xFF,0x46,0xB0,0x96, + + 0xAD,0xEE,0xE1,0x4B,0xC0,0xF5,0x67,0xDF,0xEA,0xF3,0x8F,0x13,0x7E,0x05,0xB8,0x5F, + + 0xAE,0xFF,0x2F,0x62,0x81,0xD3,0xC5,0x68,0x83,0x10,0xE4,0xFB,0x91,0xD3,0x10,0x05, + + 0x0C,0x42,0xEE,0x44,0x1C,0x21,0xCD,0x7F,0xE7,0x50,0x54,0xF4,0x0E,0x61,0xC8,0x59, + + 0x24,0x00,0x30,0xA6,0x15,0x13,0xA0,0xCF,0x51,0x0C,0x5C,0xB0,0x72,0xF3,0x08,0xF8, + + 0x05,0x62,0xD1,0x98,0xA3,0x08,0xAE,0xC7,0xF3,0xF5,0xA9,0xB1,0xF0,0xE0,0x1B,0x05, + + 0x87,0x69,0xD0,0x52,0x34,0xDC,0x40,0xCD,0x1C,0x0C,0xC0,0xCC,0x34,0x6A,0x42,0x80, + + 0x46,0x49,0x9A,0x26,0xD8,0xD5,0x02,0xE0,0xA3,0xEB,0xEA,0x9F,0x2D,0xFC,0x90,0xB8, + + 0xF1,0x48,0xB0,0x73,0xFA,0x26,0x3E,0x11,0x42,0x05,0x8B,0x06,0xB8,0x74,0x43,0xA7, + + 0xA2,0xD6,0x89,0x50,0x7B,0xD7,0xC7,0x12,0xAE,0x2A,0x0A,0x4A,0xD4,0x9E,0x4B,0xB7, + + 0xB0,0x4B,0xB1,0xA5,0x15,0x86,0x7D,0x53,0x2A,0xEE,0xE7,0x5D,0x5E,0xC1,0xF1,0x0C, + + 0x07,0x0E,0xDB,0xE5,0x1E,0x9A,0x13,0x57,0xEF,0x4C,0x94,0x8C,0x0C,0x28,0x72,0x49, + + 0xE2,0xC1,0xD3,0xF5,0xBC,0xDF,0x12,0x07,0x74,0x52,0x22,0xD4,0xD5,0xA6,0xC3,0x95, + + 0xB9,0xAE,0x9B,0x89,0xC2,0x5F,0x19,0x5A,0x9B,0x41,0x9F,0xC0,0xEB,0x6E,0xD0,0x1A, + + 0xF6,0x07,0xCA,0x7B,0x4F,0x23,0xC6,0xDF,0xD9,0xB6,0x42,0x92,0xE6,0x69,0xFA,0xA0, + + 0x85,0x43,0x54,0xBF,0x9E,0xA1,0x2D,0x90,0x4A,0x37,0xCC,0xAC,0x0E,0x2E,0x5E,0xB0, + + 0x00,0x40,0xF2,0xBC,0x5F,0x2B,0xED,0xC8,0xBF,0x2E,0x1A,0x3C,0x1B,0xED,0x83,0x51, + + 0x2B,0x42,0x91,0x63,0x71,0x4A,0xC6,0x98,0x8B,0xFF,0xDB,0x6D,0xBA,0xD6,0xB4,0xB9, + + 0xC3,0x0E,0x66,0xBC,0x3A,0xAF,0x9B,0x20,0xAA,0xC2,0xA3,0x6C,0xEB,0x6B,0x4E,0x15, + + 0x02,0x13,0x80,0x1C,0x03,0x5C,0x0A,0xD4,0xF2,0x58,0xCB,0x24,0x03,0x07,0xCC,0x40, + + 0xF6,0xCA,0x10,0xE6,0x5B,0x78,0x45,0x71,0xC4,0x5A,0xE2,0x7D,0x77,0x69,0x81,0x05, + + 0x86,0x89,0x3D,0xB4,0x9D,0x9D,0x91,0x81,0xC2,0x70,0x55,0x61,0x18,0xFF,0xFA,0x6C, + + 0x52,0x66,0xF3,0xF1,0xB7,0x81,0x1E,0xA1,0x46,0xDE,0x4A,0x31,0x97,0xD5,0xC4,0xD4, + + 0xC3,0x0F,0x40,0x35,0x0A,0xB4,0xC3,0x40,0x8F,0x24,0xAA,0xC9,0xFF,0xD9,0x8C,0xA4, + + 0xD6,0x57,0xD9,0xFC,0xDA,0x24,0x22,0x50,0x82,0xF3,0xE2,0x55,0xA5,0xDA,0x1C,0x27, + + 0xB2,0x59,0xFF,0x36,0x86,0x92,0xF9,0x93,0x28,0x55,0x05,0x7A,0x19,0xA7,0xD0,0xFD, + + 0xA5,0x14,0x21,0x47,0xB3,0x3F,0xCA,0x02,0x9F,0x3B,0xCA,0x55,0x1E,0xD7,0x1B,0xA6, + + 0x19,0x95,0x33,0xFF,0x15,0xCE,0x76,0xE3,0x6D,0x57,0xC6,0x2D,0x71,0x63,0xE2,0x70, + + 0xF7,0x5B,0x88,0xEE,0xBB,0x05,0xE6,0x7F,0x5A,0xFE,0xC8,0x54,0xFC,0x34,0x78,0x0D, + + 0xF5,0x89,0xB9,0xE9,0x6E,0x32,0x4E,0x41,0x4F,0x4A,0x7B,0xCB,0x07,0x73,0x4C,0xFE, + + 0xA8,0xB9,0x07,0x7F,0xBF,0x40,0xDF,0x21,0x44,0x53,0x64,0xDD,0x85,0x82,0xA8,0x4A, + + 0xAA,0xA7,0xC3,0xBF,0x0A,0x5E,0x36,0xA7,0x45,0x51,0xEC,0x1F,0x02,0xD3,0xCA,0x5C, + + 0x52,0x0C,0xEE,0x3E,0x3D,0x35,0x86,0x9A,0xA1,0xAC,0x60,0xED,0x9A,0xD2,0x7F,0x19, + + 0xF6,0x17,0xB9,0xE5,0xF2,0x6F,0x31,0x49,0x68,0x22,0x44,0x9E,0xC6,0x7D,0x8F,0x68, + + 0xE4,0x5D,0x06,0xE2,0xD9,0xEA,0x17,0xC4,0xED,0x57,0x4A,0x0E,0x8B,0xD2,0xF9,0xAD, + + 0x3B,0x82,0xA2,0x74,0x27,0x8A,0xC8,0xCA,0x87,0x8D,0x1F,0x49,0x89,0x3C,0xE8,0x4A, + + 0x0E,0x7A,0x4D,0x78,0x74,0xA5,0xE3,0x48,0xE2,0xD1,0x70,0x54,0x16,0x11,0x7E,0x89, + + 0xF7,0xF6,0x59,0x40,0x7D,0xD8,0x4E,0xDB,0xC4,0xD9,0x08,0x79,0x56,0xE6,0x2D,0x97, + + 0xF1,0xAF,0xD0,0x64,0x82,0x2A,0x06,0xD5,0x48,0x6E,0xC6,0xCF,0xD5,0x47,0xA6,0x46, + + 0xED,0x1E,0x98,0xB7,0x5B,0xA4,0x0E,0xC3,0xAD,0x87,0x4D,0x21,0xB7,0x42,0x10,0x32, + + 0x13,0xC8,0x7B,0x6C,0x6F,0xE7,0xD4,0xE1,0x2E,0xCF,0x9E,0x4F,0xBC,0xC6,0x38,0xBA, + + 0x23,0x0C,0xC7,0x36,0x87,0x13,0x0F,0x4B,0x2F,0xD7,0x62,0x94,0xF0,0x6B,0x7B,0xB1, + + 0x20,0xCA,0xEA,0x85,0x91,0xAF,0xFF,0xF7,0xC6,0x95,0x87,0x4A,0x1F,0xA4,0xE2,0x3E, + + 0xC2,0xCA,0x82,0x84,0x1F,0xF9,0xFF,0xB5,0x2F,0xCC,0xAB,0x7B,0x94,0xD1,0xAE,0x9E, + + 0x02,0x8F,0x2E,0x3E,0x3F,0xE8,0x72,0xA7,0xC0,0x64,0x61,0x91,0x22,0xEB,0xE9,0x33, + + 0xAE,0x5A,0x63,0x96,0x57,0xA2,0x4A,0x5A,0xDB,0xDC,0xBA,0xAB,0xC1,0x6C,0xEB,0xF3, + + 0x8D,0xC9,0xF2,0xDE,0x38,0x2C,0xA5,0xA0,0xAE,0xCF,0x0E,0x56,0x69,0xF2,0x28,0x57, + + 0x3D,0x7B,0xE8,0xB6,0x1E,0x17,0x74,0x42,0xCE,0x83,0xA2,0xEC,0xC3,0x67,0x6C,0xB2, + + 0xF1,0xC0,0x55,0x4E,0xF4,0x9C,0xA8,0x69,0x65,0x3C,0x05,0x4F,0x79,0x42,0x9B,0x38, + + 0xDD,0x85,0xEB,0xCB,0x9A,0xFC,0x44,0x1A,0xC8,0xC6,0xCB,0x91,0x72,0xE3,0x73,0x57, + + 0x72,0x08,0x47,0xCD,0xDF,0xA5,0x5D,0xDF,0xED,0x62,0xE8,0x0C,0xF5,0x3C,0xC8,0x6A, + + 0x88,0xDD,0x2F,0x02,0x29,0x90,0xB6,0xD1,0x37,0xDB,0xAC,0xAA,0x47,0x67,0xEC,0x0A, + + 0x94,0x9B,0x6F,0x8F,0x17,0xBC,0x1C,0xCF,0xC4,0xD8,0xB4,0xB2,0x94,0xBE,0x43,0xF6, + + 0x4D,0x5B,0x65,0xF7,0xC1,0xF0,0xB5,0xE5,0xAA,0xD4,0x0D,0x60,0x36,0x72,0xA9,0xB3, + + 0x87,0x33,0xAE,0xB7,0xE7,0x83,0x61,0xC0,0xD8,0xAC,0xE4,0x70,0x50,0x0C,0xAE,0xDE, + + 0x04,0xC6,0x30,0x42,0x35,0x0B,0x7E,0x91,0x5B,0xB8,0x67,0xD8,0x0E,0xE1,0x2E,0x34, + + 0x82,0x9E,0xEC,0xED,0x03,0x4E,0x1B,0x02,0xE7,0xCA,0x57,0xD0,0x9A,0x97,0x62,0x2B, + + 0x2E,0xDB,0xDB,0xB6,0x09,0xED,0xB1,0x18,0x6B,0x2B,0x64,0xEF,0x76,0x36,0x6B,0x95, + + 0xB1,0xD5,0xAD,0x2B,0x0B,0xF5,0xE6,0x79,0xE4,0x65,0x56,0x72,0x64,0xE8,0x18,0x6F, + + 0xCE,0x8C,0xC6,0xC5,0x5D,0xB5,0xEF,0xAA,0xE1,0x75,0xEF,0xE8,0xD9,0x01,0xD6,0x72, + + 0xCF,0xD4,0xD5,0x1C,0xBD,0x61,0x47,0xCB,0x7A,0xCF,0xE4,0xAE,0xDA,0xE2,0x37,0xF9, + + 0x9F,0xB0,0xBF,0x8A,0xBA,0x19,0xFA,0x24,0x8F,0xDE,0xEF,0xBE,0xCF,0x6D,0xD0,0x93, + + 0x08,0x80,0x97,0x60,0xB3,0xD9,0x77,0x8E,0xEB,0x69,0xCC,0xD9,0x70,0x7D,0xEC,0x47, + + 0x28,0xB6,0xED,0xF0,0x38,0xB4,0x48,0xD7,0xCD,0xB9,0x89,0x9D,0x0E,0x29,0x64,0xDB, + + 0x88,0xDC,0x5B,0x5A,0x34,0x6A,0x1E,0xB5,0x04,0xD0,0xDE,0xEA,0xAA,0xB8,0xA0,0x23, + + 0xBA,0xD3,0x2E,0x32,0xBC,0x65,0x49,0x4B,0x4D,0xB2,0x62,0xC5,0xCA,0xEE,0x31,0x7E, + + 0x11,0x34,0x32,0x9B,0x88,0xBF,0x19,0x5B,0x6D,0xA3,0x41,0x7A,0x2A,0x9D,0x69,0xEA, + + 0xFF,0x6C,0x84,0xC4,0x78,0x8D,0x10,0x33,0x29,0x58,0xD7,0x56,0x56,0xB2,0xD7,0xAD, + + 0xE0,0xDE,0x90,0x05,0x33,0xD3,0xD8,0x28,0x82,0xEC,0x80,0x31,0xAF,0xE1,0x63,0x41, + + 0x81,0x42,0xCA,0xE5,0x9C,0xDF,0x26,0x85,0x30,0x61,0x49,0xDA,0xB1,0x22,0x57,0x3D, + + 0x7E,0xF3,0x09,0x56,0x6D,0x38,0x07,0xC0,0x62,0x03,0x1B,0xB7,0x40,0x76,0xC0,0x03, + + 0xA1,0x05,0xFA,0xB7,0x41,0x3F,0x13,0x0A,0x43,0xE4,0x74,0x06,0xA1,0x01,0x88,0xCC, + + 0x77,0x0F,0x99,0x4B,0x29,0xA8,0x62,0xF4,0x15,0x0E,0xE3,0xC8,0xB8,0x36,0x55,0x45, + + 0x0B,0x09,0x36,0xA3,0xB6,0xF2,0x0B,0x21,0xC4,0xF4,0xE9,0x58,0x39,0x15,0xC9,0x12, + + 0x20,0x1C,0xB7,0xE9,0x7A,0xF4,0xA6,0x01,0xE3,0x4E,0x35,0x06,0xED,0xC1,0x3D,0x18, + + 0xE3,0x19,0x75,0x6A,0xE7,0x21,0x20,0x16,0xEB,0xE9,0xAA,0x3C,0xFB,0x6E,0x42,0x28, + + 0x6A,0x91,0xB4,0xC4,0x78,0x09,0x4C,0x9D,0xA2,0x2A,0x98,0x2D,0x5F,0xFB,0x3D,0x21, + + 0x07,0xFC,0x07,0xE5,0xE3,0x65,0x41,0xDA,0xAA,0x97,0xBA,0x43,0x79,0xED,0xCB,0x59, + + 0x8D,0xB4,0x93,0x19,0x10,0xD9,0x1D,0x0C,0xC0,0xEF,0xA3,0x7D,0xC1,0x6D,0x0E,0xB8, + + 0x0E,0x43,0x6E,0xDF,0x33,0x24,0xD6,0xD7,0x4B,0x8C,0x4F,0x9C,0xDA,0xC5,0xB2,0xA9, + + 0x7A,0xF2,0xD4,0xA7,0x68,0x2D,0x58,0x9A,0xC9,0x51,0x83,0xAD,0xDB,0x3F,0x1A,0x38, + + 0xE9,0xAE,0x43,0x2E,0x69,0x83,0x33,0x23,0x7A,0x43,0x02,0xE7,0xDB,0xEE,0x71,0xBB, + + 0xAF,0x14,0x16,0xE5,0xF0,0xA7,0xE2,0x1B,0x29,0x47,0x77,0x0F,0x11,0x16,0x50,0x73, + + 0x06,0xBF,0x44,0x1D,0xFC,0x38,0xEF,0xDF,0x6E,0xAF,0xAE,0x5B,0x76,0x68,0x1D,0xD7, + + 0xEB,0xB8,0xB4,0x6B,0xD8,0xA8,0x64,0x97,0x9C,0x5E,0x27,0xAB,0xD2,0x33,0x10,0x72, + + 0x90,0xBF,0x86,0x07,0x30,0x59,0x75,0xEE,0x83,0x8F,0xEF,0x27,0x61,0x6F,0x45,0x09, + + 0xA7,0x1B,0x6A,0xD5,0xB5,0x1F,0x27,0x33,0x7C,0x18,0x1D,0x75,0x73,0x77,0x7E,0x33, + + 0x07,0xBB,0xFA,0x7C,0x53,0x30,0x4F,0x64,0x38,0x29,0xCE,0xE6,0xC1,0xD9,0x8C,0x49, + + 0xD6,0x1D,0xEC,0x5E,0x32,0xF5,0xA3,0x83,0x12,0x3B,0xD4,0xE0,0xBB,0xE6,0xD9,0x43, + + 0x22,0x7D,0xBC,0xB6,0x84,0xBF,0x5D,0xCD,0x4E,0x5B,0x86,0x95,0x72,0x60,0xCD,0x92, + + 0x00,0x11,0xEB,0x79,0xC1,0x93,0xBA,0x31,0xCB,0x4C,0x14,0xE6,0x89,0x0D,0x06,0x77, + + 0xA5,0xBE,0xFE,0x0E,0xA9,0x65,0x6E,0x8F,0xCB,0x19,0xCA,0xCE,0x87,0x14,0x9F,0xA8, + + 0x2D,0xC6,0x4E,0x04,0x98,0x31,0xA9,0x08,0x9D,0x3A,0x79,0x3E,0xE8,0x64,0x96,0xC9, + + 0xF4,0xB7,0xBF,0x3F,0xB0,0x6A,0xA2,0x19,0x5C,0x39,0xF7,0xE7,0x41,0x77,0xB0,0x5E, + + 0x7F,0x11,0x89,0x6D,0xBD,0x79,0xDF,0xF4,0x2B,0x1A,0xA7,0x2F,0xF9,0x73,0x6F,0xA6, + + 0x8B,0x9B,0x13,0x75,0xB7,0x91,0xA1,0x8E,0x49,0xCE,0x88,0x0E,0x7E,0xD1,0x95,0x5C, + + 0x79,0x00,0xEE,0x36,0x52,0xAE,0x46,0x6C,0x6D,0x8F,0xA0,0xFA,0x92,0x72,0x07,0xD0, + + 0xAC,0xAC,0x90,0x5E,0xA9,0xB5,0x0E,0x10,0x4F,0xA1,0x04,0xDF,0x9A,0x7C,0x47,0xC8, + + 0xC8,0x1E,0xAE,0x1D,0xAC,0x92,0xCC,0xB9,0xE1,0x44,0x8D,0xD2,0x10,0x1B,0x7A,0x4F, + + 0x02,0x88,0xC0,0x4C,0xA1,0xAD,0x50,0x6D,0x6F,0xCD,0x99,0x0C,0xF5,0x8E,0x27,0x96, + + 0x04,0xC1,0x84,0x29,0x97,0xBD,0xA9,0x40,0xE6,0xC7,0x94,0x09,0xD7,0xFD,0xA1,0x3A, + + 0x7F,0x09,0xEB,0xE5,0xB5,0xE2,0xDD,0xB1,0x55,0xCA,0xD3,0x36,0xD5,0xA2,0x3E,0xE0, + + 0xBD,0xED,0x10,0x75,0xB6,0xF3,0x94,0xC3,0x64,0x1C,0x00,0x55,0x2A,0x6A,0x3F,0x24, + + 0x25,0xC4,0x31,0xB7,0x5F,0xE4,0x76,0xE6,0x14,0xC9,0x0F,0x14,0x94,0xE4,0xB0,0x32, + + 0x03,0xA9,0x28,0x16,0x76,0x08,0x49,0x10,0xC8,0x43,0x1F,0x08,0x36,0xE1,0x4D,0xA1, + + 0x80,0x54,0x56,0xEE,0x62,0xB5,0x79,0x6A,0x44,0xDA,0x0A,0x20,0x3F,0x95,0xDE,0xD1, + + 0x16,0xDA,0x38,0xF7,0x7A,0xE6,0x7F,0x33,0xCB,0x87,0x80,0x04,0xE1,0x6E,0xC1,0x4A, + + 0x40,0x5D,0x62,0x96,0xBD,0xA2,0x86,0x48,0xB3,0xCE,0xB6,0x4E,0x14,0x15,0x54,0x36, + + 0x45,0x98,0x69,0x3B,0xFC,0x06,0xC5,0xB8,0xD0,0x82,0xBC,0x46,0xD2,0xAB,0x36,0x78, + + 0xBC,0x08,0xA5,0xFF,0x94,0xE8,0x9E,0xCE,0x6D,0x3B,0xA9,0x2A,0xFF,0xA9,0x0B,0xCD, + + 0x6C,0x24,0x33,0xEC,0xB0,0xC7,0x03,0x87,0x40,0xA9,0xFC,0x28,0xDE,0xBA,0x5A,0xAA, + + 0x56,0xCE,0x4E,0x3C,0xD4,0xDF,0x7D,0xDF,0xCC,0xD0,0xD2,0xE4,0x5D,0x4C,0x53,0x9A, + + 0x47,0x06,0x3B,0xAD,0x29,0xC3,0x3A,0x1A,0x0F,0x30,0x02,0xB9,0xB6,0x5E,0x24,0xB7, + + 0x88,0x1C,0x9D,0xE2,0x7F,0x08,0xCA,0x09,0x31,0x47,0xAA,0x3A,0x7B,0x6E,0x2B,0xDF, + + 0xD9,0xEE,0xD5,0xF2,0x55,0x1C,0x09,0xDB,0xCB,0x6F,0x9D,0xB2,0x36,0xB5,0x22,0x06, + + 0x25,0xC2,0xE3,0xF4,0xB6,0xAC,0x6D,0x63,0xC1,0x59,0xB1,0x4E,0x7F,0x7B,0x0C,0x49, + + 0xCC,0xA0,0xAD,0x12,0x67,0xBC,0x5C,0xF8,0xD0,0xDE,0x43,0x92,0x73,0x43,0x23,0xAA, + + 0xEC,0x83,0x1C,0xE5,0x56,0xF2,0x31,0xC3,0xA0,0x5F,0x35,0x41,0x9F,0x6B,0xC1,0x01, + + 0xA5,0x9B,0xE5,0x92,0xD6,0xD3,0xAD,0x5B,0x60,0x9E,0x00,0x77,0xF1,0xDF,0xA4,0x5B, + + 0xC7,0x92,0xFA,0xF6,0xC9,0x4B,0x38,0x12,0x62,0x9B,0xCA,0x5E,0xD5,0x91,0x7C,0xDF, + + 0x21,0x27,0x53,0xE7,0x96,0x4A,0x23,0x14,0x0C,0x4C,0xE2,0x07,0xD4,0xB5,0x4C,0xAD, + + 0x07,0x11,0xDF,0x77,0x49,0x69,0xCA,0xB3,0xE5,0xCD,0xCB,0x5E,0x55,0x5B,0xB6,0x57, + + 0xF5,0x8A,0x56,0x72,0x40,0x1A,0x86,0x81,0x44,0x96,0xCF,0xC9,0x54,0x56,0xA0,0xB1, + + 0x14,0xDA,0xDE,0x0C,0xAD,0xE5,0xC9,0x6D,0xAE,0xF8,0xCE,0x89,0xDD,0x07,0x08,0xA7, + + 0x07,0x3D,0x6E,0x06,0x9C,0xB1,0x86,0xCA,0x25,0xD0,0xB6,0xBA,0xF4,0xF6,0x2F,0x3F, + + 0x2C,0x5A,0x9F,0x3D,0xB0,0xEA,0x7F,0x0F,0xDF,0x64,0x89,0xD7,0x73,0x0C,0x7F,0x3F, + + 0xC6,0x73,0xA9,0x6F,0xFD,0xF9,0xAA,0xC8,0xBE,0x5D,0xE6,0xF9,0x58,0xF2,0x2E,0xCF, + + 0x4D,0x9F,0xB3,0xF3,0xD5,0xF8,0x48,0x32,0x4D,0x4C,0xA3,0x1D,0x44,0x21,0x56,0x68, + + 0x0D,0x2D,0xE6,0x5B,0xC0,0x19,0xF8,0x78,0xFE,0x80,0xF8,0x42,0xD6,0x2D,0x1F,0x49, + + 0x3F,0xC3,0xD9,0x67,0xC8,0xFC,0x2E,0x54,0x4B,0xD5,0xA1,0x47,0x15,0xED,0xAF,0x42, + + 0xD8,0xDD,0xBA,0xD9,0x77,0xAC,0x07,0x13,0x94,0x90,0x6F,0xFF,0xFF,0xFF,0xFF,0x7A, + + 0x76,0xDF,0xD2,0x4F,0xFB,0x44,0x43,0xD3,0xC4,0xCB,0x35,0x22,0xC4,0x04,0xB3,0xB5, + + 0xF6,0x8A,0xB0,0x24,0x71,0x8E,0xBC,0x14,0xA8,0xA0,0x08,0xC4,0xA2,0xC0,0xBE,0x30, + + 0x21,0xFD,0x11,0x76,0xFC,0x83,0xE6,0x90,0xFE,0xED,0xA9,0xDB,0x7C,0x6F,0x49,0x2C, + + 0x6A,0x47,0x29,0x67,0xF3,0x1F,0x47,0xD3,0xC5,0x45,0x0C,0xC6,0x55,0xE8,0x72,0x64, + + 0xF6,0xE7,0xBE,0x42,0xFB,0x2B,0x31,0x44,0xFE,0x47,0x82,0x32,0xB9,0x00,0x88,0x55, + + 0x0F,0xD8,0x58,0x36,0xF8,0xC6,0x06,0x92,0x47,0xE8,0x71,0x0A,0xC6,0x24,0xF6,0xE9, + + 0x71,0xB9,0x93,0x6A,0x79,0x42,0xE0,0xC0,0x7A,0x05,0x41,0x2A,0x2F,0x1A,0xD9,0xA9, + + 0x83,0x45,0x7D,0x37,0x78,0x34,0x48,0x43,0x28,0x03,0xE7,0xC8,0xBB,0x6A,0x58,0xA7, + + 0x7E,0xA7,0xFC,0x0B,0x3C,0x6A,0x70,0xC4,0x4C,0xE8,0x65,0x9D,0x6C,0xC7,0x9C,0x9A, + + 0xCB,0x08,0x2D,0x21,0xED,0x1A,0x24,0x80,0x97,0xE6,0xA1,0x80,0xAE,0xF2,0xA7,0x6B, + + 0xAC,0xA7,0x03,0x81,0x4C,0xFB,0x94,0x8C,0x3F,0x26,0x37,0x09,0xA4,0x95,0x55,0xFB, + + 0x8D,0x4B,0x3C,0xB1,0xEA,0x2B,0x48,0x4A,0xF7,0x9D,0x9B,0xC4,0xD5,0x2B,0x46,0x1B, + + 0xF7,0x4D,0x2E,0xDF,0x3C,0x81,0x74,0x8A,0xC6,0x0C,0x2D,0x1F,0x2C,0x0F,0xDC,0xDC, + + 0x43,0xFD,0xF4,0xE9,0x7A,0x29,0x62,0x87,0xE7,0x40,0x4A,0x0F,0x7D,0xCC,0x1D,0xAB, + + 0x8E,0xA3,0x97,0x3D,0x1A,0x31,0xD3,0xEA,0xF9,0x2A,0x28,0x12,0xBA,0x6C,0x73,0x7D, + + 0xFC,0x0F,0xAA,0x79,0xF3,0x22,0xF4,0x9F,0xDB,0xB2,0xE3,0x82,0x32,0x4C,0xBC,0x13, + + 0x46,0xBD,0x84,0xBF,0x59,0xAB,0x82,0x91,0xC1,0xD1,0x86,0xD1,0x9B,0x34,0x74,0x18, + + 0x84,0x98,0x29,0x92,0xA5,0x55,0x4E,0xE6,0x8A,0x35,0x38,0x90,0x84,0x7E,0x53,0xF1, + + 0x20,0xBD,0x85,0x81,0xB8,0x55,0x1C,0x52,0x64,0xDF,0xAF,0x15,0x69,0xDD,0x2D,0x02, + + 0x02,0x52,0x39,0xB2,0x10,0xAC,0x8D,0xC2,0x8D,0xF2,0x29,0xCA,0x52,0xDE,0x76,0xF0, + + 0x20,0xBB,0x7B,0x22,0x16,0x5A,0x2C,0x82,0xD1,0x31,0x44,0x86,0x85,0x11,0x7F,0x23, + + 0xAF,0x54,0xF2,0x79,0x52,0x31,0xA5,0xD7,0xC2,0x2A,0x0C,0x8A,0xB9,0x56,0xE5,0xB2, + + 0x01,0x95,0xFB,0x69,0x78,0xA5,0x6D,0x0A,0x4E,0x5B,0xED,0x1A,0x7D,0xD0,0x75,0x2B, + + 0x0F,0x1A,0xB4,0xA6,0x89,0xBE,0xCD,0x7E,0x1C,0x8A,0x4D,0xC4,0x52,0xF6,0x38,0xBD, + + 0x43,0x17,0x32,0xEE,0x1C,0x95,0x2E,0x98,0x0D,0xF7,0x00,0x88,0x91,0x49,0x8E,0x89, + + 0x75,0xC6,0x9B,0x7E,0x1D,0xB2,0x60,0xBF,0x4D,0xF4,0xE6,0x98,0x90,0x08,0x87,0x0B, + + 0x6A,0x80,0x96,0x6F,0x14,0x97,0xB7,0xDB,0x8A,0x96,0xEF,0x8A,0x11,0x2B,0xBB,0xFB, + + 0x26,0xAD,0xDB,0xAC,0xD5,0x94,0x89,0x48,0x4A,0x9B,0xE7,0x9A,0x10,0xEA,0x39,0xEF, + + 0x8B,0xC3,0xE6,0x46,0x1E,0xB7,0xB7,0x16,0x93,0x6A,0xA5,0x1F,0xFE,0xF1,0xB3,0xD0, + + 0x8E,0x22,0x94,0xF3,0x4D,0x92,0x64,0x15,0x1B,0x06,0x4E,0x9E,0x90,0xAC,0xF3,0xAB, + + 0x55,0x53,0xCC,0xF0,0x51,0x7A,0x28,0x93,0x78,0xC1,0x85,0xC3,0x11,0x1A,0x4E,0xBF, + + 0x1C,0x0F,0x6B,0xF9,0xD8,0x42,0x5B,0x12,0x58,0x31,0x6B,0x9F,0x10,0x8E,0x26,0x1F, + + 0x02,0x00,0x30,0xF6,0x53,0x01,0x4E,0x8F,0x60,0x35,0xB4,0x75,0x52,0x80,0xAF,0x5D, + + 0xF8,0xFD,0xF2,0xC2,0x7D,0x40,0x2E,0x8A,0xAE,0x52,0x41,0xDD,0xE6,0xA1,0x16,0x3D, + + 0xD0,0x77,0x37,0xED,0x69,0xED,0x2F,0xDF,0xC4,0x3F,0x35,0x55,0xEB,0xE0,0x80,0x6D, + + 0x10,0x0E,0xD0,0x71,0xB1,0x7C,0x82,0x82,0xFB,0x6C,0x3D,0x29,0x3C,0x70,0x5E,0xFF, + + 0x6E,0xB7,0xF2,0xF4,0xFD,0xE0,0x88,0x46,0xC4,0x28,0x24,0x98,0xDB,0x19,0x93,0x2D, + + 0x6F,0x88,0x4C,0x72,0xE8,0x28,0x40,0x89,0xEB,0xC8,0x43,0x06,0xD7,0xF3,0x9E,0x3D, + + 0xEC,0x55,0xDB,0xF7,0x53,0x09,0x09,0x01,0x35,0xA3,0x61,0x17,0x56,0xF9,0x96,0x2D, + + 0xA9,0x58,0x3D,0xA9,0x7E,0xD6,0x82,0x54,0x66,0x86,0x69,0x84,0x53,0x6A,0x5F,0xE0, + + 0x28,0x25,0x9A,0xF5,0x6F,0xA8,0xE7,0x0E,0xA5,0x5B,0xA4,0x4C,0xA3,0x45,0x74,0xF8, + + 0x09,0xC9,0x00,0x0C,0xBC,0x16,0x04,0x97,0x2F,0x36,0xA8,0x3F,0xB6,0x3A,0xB5,0x89, + + 0x4E,0x59,0x63,0x0E,0x32,0xAC,0x21,0xD4,0x27,0x19,0x66,0x0B,0x35,0x79,0x2D,0x06, + + 0xBE,0x4F,0x3B,0x20,0x8D,0x70,0x45,0x82,0xE9,0x66,0x81,0x1B,0xB5,0xE6,0x38,0xCA, + + 0x72,0x23,0x0E,0xD1,0xEB,0x25,0x2B,0x0C,0xEB,0x53,0xA0,0x38,0xB5,0x88,0x14,0x5D, + + 0x2B,0x20,0x22,0x3C,0xE0,0xC8,0xC2,0x84,0x5F,0x80,0x6C,0x8D,0xDB,0x60,0xC3,0xBB, + + 0x30,0x5D,0xC3,0xA5,0xBA,0xB5,0x72,0x0D,0x35,0xDE,0x63,0x9F,0x1A,0x4F,0xFD,0xAA, + + 0x2C,0xCF,0xD3,0x00,0x38,0xBF,0x84,0x5F,0x4D,0x23,0xA9,0x29,0x34,0x8B,0x1F,0xF2, + + 0xA4,0x8F,0x04,0xF4,0x56,0x7C,0x06,0x92,0x98,0x7F,0xCC,0x82,0x9F,0xB4,0xBC,0x61, + + 0x4F,0xF4,0xFC,0x90,0xFD,0x40,0xAC,0xC1,0x09,0x7A,0x18,0xB2,0x35,0x44,0x9E,0xF3, + + 0x24,0x84,0xDB,0x80,0x90,0x16,0x95,0xD1,0x86,0x8E,0x8F,0x17,0x61,0x5D,0x15,0x60, + + 0xC3,0xFD,0x09,0xB3,0x86,0xA7,0x45,0xA7,0x05,0x52,0xE7,0xFF,0x89,0x5C,0xDC,0x8D, + + 0x95,0xD5,0xF2,0xEF,0xDD,0xF0,0xF4,0xF2,0x00,0x6B,0x64,0x96,0xF6,0x5B,0x7E,0xA7, + + 0xCC,0xD1,0x48,0xF2,0xB8,0x18,0x22,0x10,0x63,0x50,0xDC,0x65,0xD4,0xB4,0x5B,0xEB, + + 0xCE,0x9B,0xDF,0x77,0x27,0x19,0x46,0x01,0x0F,0xCC,0x8D,0x6F,0x53,0x7F,0x57,0x63, + + 0x3E,0x38,0x38,0x44,0xD0,0x1A,0x82,0x34,0x1E,0x21,0x02,0x84,0x83,0x01,0x40,0xB7, + + 0xC5,0x49,0x1E,0xBE,0x3C,0x47,0x33,0x59,0xE8,0x55,0x16,0x5E,0xF6,0x2B,0x78,0xEA, + + 0xAD,0x8F,0xB0,0x0E,0xC2,0x14,0xA8,0x8B,0xCC,0x58,0x3D,0x81,0x21,0x74,0x3D,0x89, + + 0x1F,0x37,0xE6,0xE9,0x98,0x17,0x65,0xE4,0xC8,0x77,0xC9,0xA8,0xD8,0x2F,0xBF,0x6B, + + 0x5E,0x3A,0x79,0xD8,0x63,0xFA,0xBD,0x48,0x69,0x56,0xC4,0x44,0x7F,0xE7,0xC2,0xEE, + + 0xA1,0x31,0xB8,0xBE,0xBE,0xA3,0x48,0x08,0x0F,0xD8,0xAC,0xEC,0xCD,0x55,0x39,0xAA, + + 0xAF,0x82,0x8F,0xFA,0x5C,0x18,0x1F,0xDE,0x04,0xD2,0xE8,0xC3,0x94,0x0C,0xB7,0x58, + + 0xD8,0x33,0xD9,0x63,0xDF,0xBA,0x0E,0x91,0x8F,0xDA,0xE0,0x65,0xDA,0x03,0x51,0x7A, + + 0xCE,0x9B,0xF8,0x2C,0x3B,0x32,0xFF,0xC9,0x8F,0xDD,0x44,0x4E,0x8B,0x50,0x93,0x24, + + 0xA1,0xDF,0x23,0xF2,0x23,0xE1,0x4E,0x09,0xBF,0x5B,0x68,0x63,0x92,0xE0,0x98,0x63, + + 0x68,0xAA,0x30,0x04,0xB6,0x4F,0x0D,0xC9,0x4B,0x03,0xC7,0x56,0x12,0x62,0xB5,0x63, + + 0x7F,0x6E,0x39,0xFA,0xA3,0x90,0x75,0x57,0x3F,0x39,0x99,0x10,0x52,0x66,0x71,0x15, + + 0x61,0x42,0x6E,0xD5,0x95,0x06,0x0A,0xA8,0x1D,0x52,0x66,0x8A,0xD3,0x61,0x45,0xA8, + + 0x17,0x49,0xD1,0x46,0xFC,0x3F,0xC6,0x13,0x2E,0x28,0xC6,0x4C,0xE1,0x79,0x36,0x7D, + + 0xE2,0xAA,0xD9,0x13,0xCD,0x2F,0x64,0x57,0x20,0x31,0x81,0x28,0xF6,0xBA,0x3F,0x6D, + + 0x92,0x4B,0x33,0x23,0x6D,0x8B,0x37,0xA8,0xC3,0x06,0xF9,0x07,0x77,0x99,0xDF,0xA1, + + 0x55,0xA6,0x49,0x36,0x4D,0x8A,0x4F,0x44,0x70,0x0A,0x66,0x29,0x2C,0x69,0x5C,0xEA, + + 0x0C,0xA5,0x77,0x7E,0xBF,0x6A,0x4B,0xAF,0xAD,0xB7,0xAC,0xF4,0x7B,0xC8,0xDA,0x9C, + + 0x14,0x66,0x29,0x34,0xF8,0xD6,0xDA,0x00,0x13,0xBD,0x1C,0xD4,0x0D,0x24,0x95,0x3B, + + 0xAC,0x46,0x89,0x9D,0x44,0x1B,0xCE,0x00,0x29,0xF5,0xCA,0x92,0x7D,0x63,0x52,0x9C, + + 0x2C,0xFA,0xD2,0x01,0x3C,0x22,0x8D,0x4A,0xA5,0xC4,0xD9,0xDB,0x59,0xDB,0xD4,0xCC, + + 0x22,0x82,0xD7,0x9C,0x46,0x25,0x0A,0x6C,0xE3,0xBA,0xEA,0x86,0xA7,0x23,0xD9,0x69, + + 0x67,0x4F,0x65,0x37,0xC6,0x6F,0x9A,0x59,0xDB,0x40,0xE4,0x54,0xD6,0xEB,0x7B,0x29, + + 0xD5,0x85,0x47,0x88,0xA2,0x21,0x09,0xA4,0xA2,0xAF,0xF3,0x64,0x92,0x7F,0x5F,0x53, + + 0x2A,0x04,0x87,0x1D,0x42,0x12,0x26,0x8B,0xE8,0x0F,0x5C,0x3D,0x56,0xCF,0x2A,0x7A, + + 0x81,0x99,0x03,0x96,0xDB,0xD1,0xB3,0x89,0x89,0x01,0xCD,0xB8,0xD5,0x7B,0xCC,0xF6, + + 0xD6,0x01,0xCE,0xE7,0x5D,0x2A,0xB0,0x23,0x59,0x59,0x3B,0x81,0x42,0x57,0x07,0x61, + + 0x8E,0x09,0xDC,0x02,0xD5,0x3B,0xD1,0x24,0xA3,0xA1,0x55,0x21,0xA9,0x22,0xB5,0x6E, + + 0xA7,0x9B,0xE9,0xE1,0x90,0x83,0x49,0x59,0xF3,0x1E,0x27,0xC4,0x9D,0x7A,0xC0,0xBF, + + 0x03,0xF4,0xD2,0xF1,0x34,0x15,0xF8,0x7F,0x61,0xA7,0x3B,0x06,0xF0,0x3C,0x59,0xD2, + + 0x35,0xBE,0x06,0xA7,0x5F,0x94,0x04,0x41,0x00,0x84,0xBC,0xB0,0x02,0xF8,0x1C,0x76, + + 0x07,0x5E,0xE4,0xA7,0x51,0x3D,0x95,0xC0,0x61,0x5B,0x09,0x15,0xFA,0x79,0x58,0xD0, + + 0x42,0xE8,0xF5,0xE5,0xDE,0x98,0x48,0x75,0xCB,0x43,0xA5,0x77,0xF6,0x4E,0xF2,0x60, + + 0x6A,0x55,0xDF,0x90,0x5B,0x18,0xE9,0x40,0x76,0x15,0x14,0x9A,0x14,0xF5,0xCE,0xC8, + + 0x87,0x02,0x18,0xEE,0x0A,0x79,0xA6,0x43,0xE4,0x84,0xD5,0xDC,0x61,0x62,0xFC,0x81, + + 0x0D,0xE5,0x7F,0x65,0x32,0xFF,0xF0,0x57,0xDB,0x1B,0xCE,0xA9,0x5F,0xD7,0xCA,0xFF, + + 0x56,0x1D,0x77,0x75,0xD1,0x76,0x78,0x4A,0x85,0xF6,0x33,0xDB,0x06,0x60,0x66,0x4D, + + 0xC3,0x2D,0x66,0xBE,0x58,0x00,0x6E,0x78,0xC9,0xD7,0xAE,0xCB,0xD9,0x7A,0x74,0x2B, + + 0x13,0xE2,0xA8,0xF1,0xCE,0x9B,0x4A,0xF2,0xCA,0xDD,0x25,0x1E,0xDA,0xF7,0x0D,0x2B, + + 0x8B,0xAE,0x07,0xE9,0x53,0x50,0xC4,0xD8,0xDA,0x1C,0x5F,0x28,0x5B,0xF4,0x15,0x47, + + 0xC3,0xFE,0x5E,0x9D,0xBA,0xB2,0x27,0xC2,0x87,0xAA,0xA0,0x1F,0x26,0xA2,0xD8,0x8A, + + 0xA1,0x53,0xA1,0x84,0xDD,0x17,0x28,0x27,0x8C,0x21,0x8A,0xCE,0x00,0xAF,0xA5,0xF5, + + 0x36,0x23,0x57,0x69,0x9A,0x27,0x66,0xD0,0x19,0x44,0xA9,0xC9,0x53,0x52,0xD9,0xC5, + + 0xA2,0xC0,0x99,0x40,0x5E,0xB3,0x20,0xCB,0x4A,0x0F,0xE8,0xAF,0x71,0x43,0x91,0x2E, + + 0x22,0x91,0x29,0x57,0x8D,0x5E,0x60,0xB5,0xA1,0x3C,0xB4,0xB5,0x1C,0xB4,0x2E,0xB2, + + 0x6F,0x25,0xCF,0x79,0x7A,0xE6,0x4C,0xDE,0x25,0x6D,0x66,0x25,0xDE,0xA5,0x7D,0xA2, + + 0xED,0x24,0xFE,0x63,0xA4,0xE8,0x6D,0x9A,0xA1,0x88,0xBA,0x16,0x55,0x65,0xF7,0xA9, + + 0x23,0x29,0xEB,0x37,0xF5,0xD2,0x64,0x89,0x63,0x69,0x5A,0x1C,0x03,0x1B,0xFF,0xD7, + + 0xA3,0x94,0x16,0xA7,0x41,0x96,0x86,0x18,0x4A,0x31,0xA1,0x2F,0x55,0xEF,0x9A,0xB6, + + 0xAB,0x8E,0xC0,0xF0,0x1F,0x28,0xF2,0x76,0xF1,0x15,0x8A,0xD1,0xB5,0xD9,0x52,0x98, + + 0xC4,0xFE,0xCA,0x4D,0xE7,0x04,0x82,0xC5,0xA4,0xF8,0x7A,0x63,0xC5,0xF2,0x0D,0xF1, + + 0x2D,0x0A,0x99,0xE7,0xC8,0xE5,0x4D,0x07,0xFF,0xC8,0x5F,0xB0,0xDD,0x8A,0x13,0x7B, + + 0xB3,0x8D,0xBA,0xFD,0xF6,0xA4,0x97,0xA4,0xCE,0x8B,0x18,0x49,0xFE,0x09,0x5A,0xB5, + + 0xE7,0xBD,0x22,0x6F,0xDD,0x51,0x7A,0xB3,0xA7,0xFD,0x26,0x1C,0xFD,0xEA,0x33,0xF4, + + 0xAA,0x86,0x93,0x2D,0x27,0xE2,0x04,0x52,0x7C,0x0A,0x79,0x7C,0x39,0xEB,0x3B,0xD3, + + 0x09,0xAF,0x9B,0xBF,0xF7,0x9F,0x39,0x89,0xED,0x24,0xFB,0x48,0x7D,0x15,0xEB,0xD3, + + 0x2A,0x86,0xD7,0xC0,0xFC,0xD5,0xC3,0x84,0x26,0xDE,0x73,0xBA,0x7E,0x65,0x0A,0x38, + + 0x85,0xFC,0xB2,0xAF,0xCB,0xDC,0x25,0xE5,0xAE,0x31,0x34,0xC0,0x08,0xBF,0x6D,0xF4, + + 0x86,0x1C,0x73,0x69,0xDC,0xE0,0xBE,0xC4,0xA7,0xF1,0x43,0x5E,0x71,0xBC,0xC2,0xC3, + + 0xE4,0x89,0xC3,0xAE,0xB7,0xF2,0x7D,0x3B,0xD7,0x06,0xD5,0xF4,0x5F,0xFF,0x4D,0xC0, + + 0x56,0x9C,0x41,0x08,0xB4,0x00,0x35,0x23,0x0C,0xC2,0x11,0x28,0xF4,0x53,0xA4,0xE3, + + 0xE5,0x19,0x9A,0xEE,0x30,0x95,0x65,0x66,0x7F,0x08,0x5B,0x62,0x33,0x51,0xFA,0x38, + + 0xCE,0xA4,0x2C,0xF7,0xCD,0x48,0x04,0x02,0xB1,0xE4,0xF8,0x14,0xF5,0xFD,0x1D,0x33, + + 0xCF,0x37,0x8D,0xA5,0x95,0x67,0xB5,0xC2,0x1C,0x2B,0x95,0xA7,0xD8,0x7D,0x95,0x23, + + 0x4D,0x36,0x95,0x27,0xC3,0x16,0xBD,0xD2,0x24,0x5A,0x49,0x85,0x54,0x0C,0x7F,0x0E, + + 0x8B,0x88,0xFF,0x92,0x99,0xB3,0xA1,0x55,0x6A,0x6B,0x8C,0x48,0x7A,0x72,0x2F,0x7C, + + 0xAF,0x65,0x94,0x76,0x39,0xF6,0x04,0x52,0x37,0x96,0xBE,0xAD,0x6E,0x88,0xDF,0x63, + + 0xEE,0xD5,0x21,0xE9,0xFC,0xF5,0x3A,0x2F,0xAF,0xFE,0x93,0x8B,0x97,0xAB,0x15,0x1F, + + 0x9F,0xB0,0xF6,0x83,0x18,0x3B,0x1F,0xAB,0x0C,0xC0,0xE6,0x7E,0x58,0xF0,0xF0,0x4E, + + 0x0A,0x8F,0xF7,0x4A,0x16,0xA8,0x0E,0xFB,0x3D,0x57,0x23,0x6A,0x23,0xA3,0x50,0xEF, + + 0x4E,0x6D,0x78,0xE1,0x0F,0xFF,0x6A,0xF0,0x0C,0x22,0xFA,0x1C,0x5B,0xFD,0xD8,0x29, + + 0xE6,0x7F,0xBD,0xCE,0x1D,0x0B,0xBA,0xDA,0x82,0x9C,0x97,0xAF,0x52,0x75,0x37,0xC4, + + 0x4E,0x30,0x62,0x7A,0xDC,0x16,0x07,0xF9,0xAF,0x7F,0xFF,0xFF,0xFF,0xFF,0x60,0x03, + + 0x55,0x0D,0xC7,0xF7,0xFB,0x44,0x16,0x09,0x23,0x48,0x67,0x42,0xA7,0x99,0x32,0xF8, + + 0x81,0xCE,0xB6,0x39,0xB2,0x63,0x63,0x43,0x2D,0x4E,0xC1,0x36,0x36,0x41,0x19,0x05, + + 0xA8,0x14,0xBF,0x29,0x33,0x47,0x07,0x09,0xC6,0xD0,0x89,0x31,0x25,0x6D,0x37,0xC9, + + 0xA2,0xB1,0x4A,0x14,0x7A,0x47,0x40,0xF0,0x64,0xC4,0xC0,0x37,0x34,0xE4,0x45,0xB2, + + 0x42,0x4B,0xB9,0x2B,0x4F,0xDB,0x68,0x88,0x62,0x0B,0x84,0x16,0xB9,0xF5,0xA0,0x44, + + 0x05,0xAF,0xC7,0xAF,0xA2,0xBD,0xA0,0x98,0x63,0x08,0xE6,0x4C,0xDE,0x93,0x79,0xA9, + + 0x88,0x49,0x78,0x19,0x65,0x1B,0xE9,0x81,0xC6,0xC6,0xEF,0xC4,0x90,0x99,0x83,0xB9, + + 0x91,0x4A,0xB2,0x97,0x17,0x29,0xB5,0xE3,0x9F,0x4F,0xD1,0x71,0x5B,0x3C,0x5B,0xB7, + + 0xAD,0x03,0xBC,0x34,0xBB,0x4D,0x92,0x25,0x2B,0x40,0x96,0x38,0xDA,0x4C,0x52,0x9D, + + 0x3A,0x88,0x1C,0x1D,0x0C,0x32,0x61,0x5A,0x08,0x4D,0xCA,0x20,0x41,0x72,0x42,0xE1, + + 0xCB,0x47,0xBD,0x34,0x3B,0x8A,0x05,0x01,0xCE,0xD8,0x18,0x5E,0xB4,0x65,0xB3,0xF9, + + 0x85,0x4B,0x7C,0x99,0xCB,0x44,0x63,0x28,0xF9,0x09,0xBB,0x4B,0x3B,0x4B,0xBD,0xA0, + + 0x00,0x41,0x66,0xC8,0x5A,0x99,0xD6,0x98,0x16,0x03,0xEC,0x54,0x1A,0xC3,0xF5,0x48, + + 0xAC,0x16,0xEA,0xFF,0x53,0x9C,0xCD,0x49,0x22,0xCF,0xBC,0xDD,0x5A,0x2D,0xAF,0xD6, + + 0x89,0x6E,0xC5,0xED,0xD2,0xFF,0x93,0xC1,0x5A,0xE1,0xC4,0x1E,0xA2,0x02,0xDB,0x3F, + + 0x74,0x14,0xC7,0x6B,0xA8,0x3D,0x7D,0x44,0x68,0xCB,0xFF,0x89,0xB8,0x6D,0xC1,0xF3, + + 0x73,0x1B,0x92,0x6C,0xB0,0x7D,0xE8,0xDF,0xC3,0xF0,0xAA,0x99,0x51,0xF0,0x72,0xA5, + + 0x12,0xD6,0x94,0x0C,0x3C,0xD0,0x5B,0x43,0x67,0xE3,0xC5,0x27,0x94,0x1F,0x85,0xA0, + + 0xBE,0x9F,0xDD,0x95,0x59,0x03,0x04,0xB0,0xD0,0x10,0x6F,0x4D,0x3A,0xB2,0xB5,0x6E, + + 0x48,0xF2,0x85,0xEA,0x70,0x51,0xA9,0x8E,0xDD,0x86,0xFF,0xB9,0xF0,0xB3,0x01,0x26, + + 0x00,0xD4,0x6E,0xAB,0x91,0x75,0x6A,0x40,0xED,0xA2,0x47,0x60,0x56,0x51,0xB4,0x38, + + 0x29,0x58,0x96,0xA5,0x4F,0x2A,0x66,0x03,0x17,0xF8,0x1C,0xD0,0xA9,0xF3,0xC4,0xA7, + + 0x91,0xF4,0x62,0xE8,0x35,0x75,0x5D,0xE5,0x3E,0x55,0xB7,0xF4,0xF1,0x96,0x14,0x58, + + 0x04,0x0C,0x75,0x05,0x10,0x59,0xCE,0xB6,0x29,0xA6,0xDB,0xB5,0xA7,0x19,0xAA,0x17, + + 0x29,0x58,0x42,0x09,0x7B,0x18,0x87,0x2C,0x6F,0x18,0x4C,0xA0,0x4B,0xEC,0x18,0xAD, + + 0x9A,0x54,0x18,0x7E,0xBB,0x65,0x61,0xFF,0x94,0xEF,0xC1,0x3E,0x5B,0x49,0x13,0x04, + + 0xCB,0xD0,0xD7,0xEF,0xFA,0x50,0x77,0xAB,0xA7,0x57,0x4D,0xB0,0xFE,0x69,0x57,0x9D, + + 0x81,0xF9,0x69,0x6D,0xB1,0x34,0xA4,0x2B,0xE9,0x51,0xA7,0x55,0xF3,0x34,0x80,0xAE, + + 0xA8,0x1F,0xA4,0x4C,0x3B,0x7C,0x1E,0xA0,0x6C,0x4F,0x8F,0xB5,0xDF,0x0A,0xF6,0x5A, + + 0x09,0xED,0x0E,0x8D,0xE3,0xB6,0xFE,0x9A,0xD8,0x38,0x9E,0xBA,0x5D,0x79,0x42,0x2B, + + 0x99,0x2C,0xE3,0x12,0x46,0x4F,0x10,0xAB,0x66,0x52,0x96,0x8B,0x6C,0x76,0x37,0x31, + + 0xB9,0x52,0xCB,0x21,0xBB,0x2A,0x67,0x12,0x47,0x52,0xDC,0x3A,0xC8,0x15,0xEC,0x3B, + + 0x37,0x84,0x1F,0xE4,0xFD,0x91,0x73,0xD1,0xAD,0xB1,0x34,0xA2,0x17,0xEF,0x90,0x82, + + 0xA2,0x85,0x17,0x76,0x19,0xC9,0x7B,0xC0,0xB8,0xCE,0x40,0xDE,0x47,0xAC,0xFB,0x02, + + 0xB7,0x03,0xAB,0x05,0x7F,0x43,0x49,0x50,0xF0,0x80,0x21,0x55,0xE7,0x83,0x2F,0xFB, + + 0xE5,0x08,0x3F,0x97,0x93,0x71,0xF9,0xAB,0x2E,0x6E,0x46,0xDF,0xCB,0xAE,0xA5,0x24, + + 0x8B,0x72,0x58,0xC4,0xD3,0x69,0x88,0x10,0xAD,0xC7,0xE6,0x5E,0x50,0xC5,0x2C,0x34, + + 0x8A,0x53,0x5C,0xB4,0x2C,0x35,0xC0,0x8D,0xAE,0x74,0xB8,0x47,0x2F,0xA7,0x9E,0xD3, + + 0x71,0x9D,0x99,0xAF,0x88,0xEB,0x0F,0x5A,0xF5,0xC7,0xD0,0x05,0x29,0x6D,0x61,0x43, + + 0x7A,0x06,0x55,0x70,0x34,0xBC,0xD5,0xEC,0xC4,0x1E,0xED,0x7D,0x76,0x58,0xA6,0xEC, + + 0x67,0x99,0xA5,0xAE,0xBD,0x4B,0x25,0xC8,0xA5,0x59,0x1E,0xB1,0xB7,0x59,0x73,0xDB, + + 0xA8,0x00,0xAE,0x7E,0x41,0xAF,0x42,0xCA,0x0A,0x68,0xB4,0x2D,0xFE,0x18,0xA4,0x79, + + 0x67,0xBB,0xFA,0xDF,0x39,0x23,0xF3,0xB3,0x2F,0x37,0xEA,0xBC,0xDA,0xF9,0x2F,0xFB, + + 0x89,0xAA,0x02,0x88,0x3C,0xA2,0xAD,0xD1,0xCB,0x59,0xE2,0x25,0xBA,0x1B,0x99,0xAC, + + 0x3D,0xAE,0xE5,0x28,0xB2,0xA3,0xB2,0xC2,0x14,0x8E,0x32,0x2E,0x9B,0x90,0x92,0xB2, + + 0x2B,0xC0,0x2A,0xF6,0x1D,0xA0,0x7A,0x7A,0xC2,0x60,0x53,0x0D,0x63,0x4C,0xDB,0xB4, + + 0xBD,0x6C,0x57,0xBF,0x96,0xA1,0x71,0x38,0xCE,0xCE,0x4C,0x20,0x4B,0x33,0x90,0x24, + + 0xFB,0x94,0xB2,0xD9,0xFB,0xA9,0x65,0xE8,0xB3,0x30,0xC3,0x4E,0x7E,0x40,0x1E,0x79, + + 0xD8,0x71,0x9E,0x6E,0xB4,0x7F,0xF5,0x26,0x32,0xF0,0x1C,0xB2,0x95,0xEB,0xBD,0x8D, + + 0x19,0x2A,0x05,0x01,0x96,0xB7,0x2B,0x8C,0x15,0x93,0x46,0x5E,0x2F,0xBE,0xE5,0xAE, + + 0xF6,0x46,0x85,0x96,0x55,0xB4,0xF5,0x3A,0x48,0x27,0x25,0x41,0xC7,0x26,0x29,0xAC, + + 0xC9,0xD1,0x84,0xBC,0x14,0x1A,0xF5,0xB7,0x67,0xD7,0xED,0xAE,0xEB,0xE8,0x9B,0x2A, + + 0x2C,0xD9,0x71,0xCE,0xB6,0x14,0x8D,0xC5,0xC7,0xAB,0x4C,0x69,0x64,0xB9,0x35,0x55, + + 0x21,0x86,0x47,0x1C,0x8C,0x4A,0x54,0x90,0x86,0x2E,0x2C,0x85,0x5D,0x7C,0xC9,0x5C, + + 0x4D,0x27,0x49,0x62,0x63,0xD5,0x4C,0xA1,0x47,0xEB,0x14,0xA7,0xF2,0xBA,0x63,0x3B, + + 0x21,0x3A,0xB4,0x7C,0x12,0x6D,0x79,0x0D,0x1C,0x48,0x7D,0x17,0xE6,0x02,0xB3,0x12, + + 0xF8,0x09,0x30,0xEE,0x70,0x15,0x7F,0xC8,0x97,0xB4,0xF2,0xC8,0x83,0xFE,0x38,0xAF, + + 0x9E,0xD4,0x74,0x9F,0xBF,0x85,0x3E,0xFA,0x3F,0xC2,0x59,0x56,0x59,0xB6,0x80,0xB2, + + 0xCF,0x50,0x31,0x6D,0x8F,0xBE,0x88,0x30,0x19,0x5C,0xE7,0xB2,0x5D,0x96,0x77,0x9F, + + 0x85,0x79,0xA9,0xFD,0x42,0xA0,0x1F,0x4F,0xE5,0x99,0x07,0x40,0xDF,0x16,0x1E,0x3C, + + 0x28,0x24,0x98,0xF3,0x2E,0xF1,0x2C,0xDF,0x06,0xDF,0x65,0x6A,0x79,0x45,0x94,0xA8, + + 0x1C,0xCF,0x7D,0xEF,0x03,0xFF,0xBE,0xEA,0x78,0xD3,0xF6,0xC6,0x79,0xBC,0xE6,0x23, + + 0x24,0x63,0x28,0x3C,0x9C,0x35,0x0E,0x8D,0x55,0xC1,0x48,0xA8,0x3C,0x7E,0x97,0x59, + + 0x2F,0xDB,0xFB,0xD5,0x1E,0x10,0x47,0x10,0x6C,0xD2,0x98,0x6D,0xBF,0xF7,0x16,0xE9, + + 0x8C,0x6D,0xA4,0xF7,0x9C,0x61,0xEF,0x53,0x3C,0xCF,0xA4,0x42,0x9A,0x89,0x88,0x57, + + 0x2F,0xDD,0x30,0xEE,0x01,0x6C,0xD3,0xD6,0x51,0x0C,0xB8,0xD4,0xF0,0x9E,0xFA,0x08, + + 0x2D,0x19,0x3C,0xFA,0xE7,0x22,0xEA,0xC9,0x7A,0x0F,0xAF,0x51,0xF4,0x64,0xDD,0x4F, + + 0x12,0x3C,0xF6,0x91,0x99,0x44,0xD6,0xD7,0xE5,0x45,0xA7,0x4D,0x0F,0x22,0xD0,0x33, + + 0x6E,0xA5,0xDE,0x7B,0x6F,0x66,0xF0,0x22,0xC1,0xEF,0x2F,0xE0,0x55,0xC7,0xE8,0x22, + + 0x61,0x59,0x70,0xAB,0x20,0x85,0x18,0xB6,0x0B,0x07,0xF8,0xF0,0x58,0xDB,0x79,0x71, + + 0xF0,0xA9,0x8F,0x26,0xA1,0x46,0x39,0xE1,0xE0,0x56,0xE6,0x28,0xD4,0xFE,0xD9,0xD3, + + 0x03,0xDF,0x71,0xAE,0xF8,0x2D,0x91,0xC0,0xB8,0x43,0xE7,0x09,0x5C,0xC1,0xFD,0xF0, + + 0x08,0xB3,0x39,0xF3,0x3C,0x44,0xA7,0xA8,0xE9,0xE7,0xAA,0xD0,0x58,0x74,0xE6,0x77, + + 0xD7,0x54,0x88,0xE3,0x94,0x84,0x24,0x00,0xC4,0xEF,0xC5,0x97,0x2E,0x6D,0x87,0x8D, + + 0x80,0xA6,0xBD,0xD1,0x52,0x90,0x80,0xD8,0xB8,0x6A,0xAC,0x67,0xC8,0x2B,0xE8,0x59, + + 0x86,0xA6,0x93,0x8E,0xC6,0xAB,0x4F,0xF9,0xF9,0xC0,0x44,0x68,0xDF,0xE1,0x7A,0xB7, + + 0xCB,0x6E,0xC2,0x63,0x73,0x6E,0x68,0x97,0x4C,0xD4,0x4D,0x2C,0x7F,0xE1,0x10,0x81, + + 0x7F,0xA2,0x70,0xB3,0xF2,0xD4,0x24,0xFA,0x69,0x09,0x84,0x00,0x5B,0x23,0x87,0x99, + + 0x86,0x4F,0x8D,0x36,0xA9,0x9A,0x73,0xAF,0x8A,0x63,0x2C,0xE9,0x99,0xC8,0xEB,0x2B, + + 0xE9,0x53,0x6E,0xBF,0x7B,0x8B,0x63,0x87,0x67,0x42,0x9B,0xBB,0x9B,0x74,0xFB,0xFA, + + 0x0E,0xCF,0xFA,0x82,0xD1,0xB3,0x2C,0x30,0xC3,0xF0,0xAE,0x14,0xE5,0xDF,0xEF,0xD0, + + 0x31,0xBC,0x29,0x76,0xD1,0x9C,0x8F,0x34,0x26,0x43,0x9C,0x5B,0x63,0x3C,0xE9,0xEE, + + 0x7E,0x4F,0xA8,0x76,0x3C,0x73,0x06,0xA3,0x6B,0xA7,0x31,0x81,0x55,0xF3,0x5D,0xC0, + + 0xDD,0x18,0xF5,0xA4,0xC5,0x9C,0x47,0xB0,0x96,0x53,0xCF,0x4E,0x46,0x1D,0x52,0xA2, + + 0x42,0x95,0x5B,0x3C,0x32,0x76,0x16,0xDF,0x49,0x16,0x86,0x60,0x31,0xC5,0x61,0xF4, + + 0xC8,0x71,0xB3,0xAE,0x45,0xAA,0xE3,0x16,0x9F,0x1E,0x85,0xD1,0xD6,0x19,0x3B,0xC7, + + 0x43,0x95,0xC1,0x62,0x4F,0x67,0xDB,0x07,0xD1,0x36,0x8C,0x7D,0x57,0x89,0x75,0x22, + + 0x85,0x72,0x70,0xE4,0x12,0x93,0x9D,0x20,0xED,0x4C,0x3A,0x35,0xAB,0x35,0x86,0x8B, + + 0xF7,0xA5,0x15,0xFE,0x52,0x89,0x27,0x85,0x78,0x5C,0xA9,0x23,0x89,0x2E,0x8E,0xDF, + + 0x07,0xC5,0x1D,0x0E,0xC6,0x94,0xCA,0xE6,0xFA,0x66,0x61,0xFB,0x90,0x90,0xAC,0xF3, + + 0x7D,0x01,0xF9,0xB4,0x37,0x97,0x11,0xEE,0xC6,0x86,0x07,0x45,0x3B,0x37,0xDB,0xC7, + + 0x3A,0x24,0x98,0x0F,0xB9,0x7A,0xDF,0x9D,0xD2,0x1A,0x78,0x4D,0x79,0x64,0x7E,0x3B, + + 0x04,0x5D,0x59,0x2E,0xDA,0xC3,0x50,0x97,0xCD,0x58,0x98,0x6A,0x7C,0x8F,0x30,0xDE, + + 0xCA,0x9E,0xF5,0x4F,0x98,0xE2,0xD0,0x1E,0x58,0xFD,0xDC,0x1A,0xFB,0x4D,0x51,0xAB, + + 0xCA,0xDE,0x6B,0xB6,0x64,0xC1,0x97,0xD6,0xCD,0x1C,0x8C,0x05,0xD6,0x33,0x62,0xFD, + + 0x36,0xE2,0xF8,0xAC,0xC8,0x3F,0xE0,0x1F,0x17,0x74,0x86,0xD8,0x1A,0x30,0x70,0x53, + + 0x78,0x8B,0xDF,0xFA,0x14,0x3B,0x70,0x13,0x34,0x82,0x7E,0x59,0x70,0x4F,0x0A,0x74, + + 0x9B,0x93,0xF1,0x10,0xB0,0x1E,0x2F,0xC9,0xB9,0x10,0x80,0xCD,0x71,0xE7,0x2E,0x27, + + 0x09,0x99,0xA1,0x83,0x9C,0xC5,0x25,0x29,0x65,0x6D,0x15,0x45,0x27,0x87,0x91,0x9D, + + 0x86,0xCB,0x05,0x68,0x4F,0x7E,0xF9,0x06,0x79,0x48,0x99,0x4A,0x74,0x1C,0x1E,0x45, + + 0x22,0x8B,0xFE,0xA4,0xF6,0x5B,0x8F,0xE0,0x8B,0x68,0xD7,0x72,0x6D,0x50,0x41,0x38, + + 0xA4,0xE0,0x10,0x5E,0xEA,0xEA,0xD6,0x20,0xE6,0x16,0x1A,0x36,0x42,0xFE,0x5B,0xB0, + + 0xF7,0x80,0xB8,0x53,0x7F,0xA9,0x49,0x5E,0x65,0xC0,0x4F,0x20,0xE5,0x12,0x11,0x77, + + 0x05,0xBB,0x58,0xB3,0xA4,0x55,0x01,0x9B,0xEB,0x8A,0xDE,0x83,0xD7,0xFC,0x1C,0xAA, + + 0x45,0x79,0xC1,0x2A,0xF7,0xCC,0xFF,0x1B,0x34,0x8A,0x69,0x2E,0x2F,0xE8,0x8E,0x7C, + + 0xFE,0x99,0xD5,0x6C,0x33,0x36,0x42,0xCA,0x39,0x68,0x4E,0xF9,0x79,0x62,0x7B,0xB3, + + 0xA8,0x91,0x9B,0xE4,0xFC,0x8A,0x27,0x21,0xAF,0x35,0xEC,0x23,0xDA,0xCA,0x93,0xE0, + + 0xE5,0x86,0x3B,0xEF,0x79,0x5A,0xAE,0xBF,0xE5,0xDF,0x76,0x03,0x36,0xAF,0xEA,0x28, + + 0x4E,0x83,0x5A,0xAE,0x1A,0xF9,0x6A,0x6E,0xE7,0xE0,0x90,0x7A,0x7C,0x9C,0xFA,0x28, + + 0xA8,0x9D,0xF8,0xA1,0xE0,0x20,0x62,0x7E,0xE6,0x34,0xFE,0x98,0xDA,0x6D,0x5B,0x0C, + + 0x4C,0xCE,0xBF,0xA7,0x42,0x63,0x4D,0x17,0xAF,0xEE,0xFB,0x87,0xF2,0x65,0x55,0x36, + + 0x28,0xCE,0xB9,0xA0,0x68,0x1A,0x22,0xE6,0x6A,0xC4,0x3B,0xAF,0xA7,0xEB,0xDB,0x45, + + 0x99,0x66,0x1C,0xBB,0x93,0xA2,0x98,0x4A,0xBE,0x9D,0xAA,0xD2,0xE6,0xB1,0x75,0xD4, + + 0x80,0x6E,0x3C,0xF4,0x8E,0xCE,0x26,0xB0,0x8E,0xDE,0x8D,0x54,0x51,0xF7,0x9C,0x1D, + + 0xA5,0xC2,0x1D,0x37,0xB4,0xFD,0x53,0x6E,0x0D,0x88,0xCD,0xD5,0x76,0xEE,0x13,0x5A, + + 0x2A,0x65,0x92,0x18,0xD6,0xB7,0x7C,0xD5,0x84,0xD7,0x9D,0x53,0x54,0x0C,0xC9,0x8C, + + 0xD3,0xC8,0x24,0xC7,0x98,0xAF,0xB4,0x33,0x68,0xCF,0x1C,0xF6,0x70,0x0C,0x35,0x46, + + 0x82,0x6A,0x53,0x30,0x5C,0xCD,0xF5,0x47,0xC3,0x97,0xA5,0xD3,0xD2,0xFE,0x5F,0x28, + + 0x15,0xD7,0xE4,0xB9,0x11,0xA6,0xF1,0x9C,0x41,0x94,0x9B,0x63,0xCC,0xD1,0x53,0xA2, + + 0x7B,0x98,0xED,0xD5,0xE3,0x1A,0x47,0x56,0xD4,0xF3,0xFC,0x75,0x3E,0x60,0x6E,0xF3, + + 0x64,0x29,0xDF,0xF6,0xAE,0xF9,0x50,0x48,0x48,0x95,0x88,0xD6,0xF1,0x0E,0x32,0x88, + + 0x0F,0xDA,0x8E,0x74,0x5E,0xBD,0x2F,0x4A,0x6C,0x08,0x86,0x8E,0x2B,0x56,0x3B,0x18, + + 0xE4,0x0B,0x4B,0x14,0x4D,0x33,0xC8,0x95,0xDC,0x7A,0x27,0xDC,0x90,0x5B,0xEF,0xE8, + + 0x8F,0x14,0xCE,0xBB,0x30,0xA0,0x41,0xBD,0x0C,0x58,0x1F,0xCD,0x9F,0xA7,0x54,0xEE, + + 0xAC,0x80,0x7D,0xBF,0x43,0xB7,0xFC,0x15,0x5D,0x2E,0xCE,0x11,0x78,0xA4,0xFE,0x98, + + 0x8E,0x91,0xCE,0xDB,0x54,0xC5,0xAA,0x2A,0xEE,0x25,0x5E,0x3C,0xF3,0xF3,0xDE,0xA9, + + 0xED,0x6E,0xE1,0x3E,0xA3,0xDE,0xCF,0x15,0x2F,0xBD,0x90,0x2D,0x7D,0xF0,0x17,0x99, + + 0x23,0x93,0xEB,0xAC,0xCA,0x3D,0x75,0x5B,0x50,0x6A,0x87,0x3D,0x5E,0xBC,0x59,0xD3, + + 0xA5,0xAB,0x04,0xF9,0xE7,0x61,0xEB,0x28,0xE5,0xBF,0x50,0x21,0x84,0x21,0x51,0xD1, + + 0xA4,0x0A,0xF6,0x3D,0xFA,0x70,0x7E,0x19,0x42,0xB1,0xE6,0x32,0xB0,0xE2,0x14,0x01, + + 0x6B,0x53,0x40,0x07,0x69,0xAF,0xFD,0xB2,0xF4,0x9F,0xCB,0x19,0xB8,0x83,0x0C,0xF9, + + 0xDC,0x4E,0xF7,0x28,0x7A,0xF2,0xA6,0xBE,0x74,0xCA,0x2C,0xC6,0x5D,0x22,0xC0,0x51, + + 0x5E,0xAB,0xEA,0xB8,0xAE,0x66,0xE8,0x3D,0xE5,0x05,0xB2,0x04,0xBB,0x55,0x70,0xAB, + + 0x05,0x4F,0x5E,0x27,0x7F,0x49,0x21,0x16,0xBC,0xCE,0xF8,0x3C,0xDE,0x98,0xE5,0x23, + + 0x71,0x63,0x4E,0xD4,0x73,0x89,0x0B,0x33,0xAA,0xA7,0xB3,0x6C,0xD3,0x26,0xC9,0x96, + + 0x7E,0x81,0xAF,0x9C,0x92,0x67,0x93,0x40,0xAF,0x58,0xBB,0x57,0x26,0xE1,0x7C,0x21, + + 0x18,0x45,0xFC,0x35,0xF3,0xB9,0x32,0xC2,0xBD,0xC1,0xEC,0x2B,0xED,0x67,0xB2,0xF6, + + 0x19,0x44,0x6F,0xDC,0x67,0x6B,0x4A,0x99,0x1D,0x52,0xC4,0xDE,0x5D,0x6F,0x7D,0x25, + + 0xBB,0xD1,0x32,0x20,0x2D,0x44,0x33,0xA3,0xC9,0x68,0x27,0x42,0x7B,0xD7,0xF6,0xDE, + + 0x43,0xE2,0x03,0x42,0x2C,0x69,0x72,0x5F,0x89,0xE0,0x2E,0xAA,0xDF,0xCB,0x42,0x36, + + 0x2E,0x87,0xE6,0xD0,0x79,0x56,0xED,0x8E,0x6E,0x41,0xD2,0xAC,0x0A,0xC1,0x70,0xE8, + + 0x92,0xA2,0xEB,0x3E,0xF0,0x3C,0xE5,0x8B,0xE8,0xC8,0xCF,0xEE,0x57,0x65,0xCF,0x64, + + 0x61,0x4A,0xD5,0x78,0x9C,0x0F,0x2C,0xED,0x81,0x4B,0x42,0xFF,0x5B,0xC3,0xEF,0x7D, + + 0xE8,0x45,0xB1,0xBD,0x9F,0x0B,0xCB,0x0A,0xBF,0xCE,0x5B,0x7F,0xF5,0x01,0x14,0xBC, + + 0x07,0x16,0xBE,0x7E,0xCB,0x9D,0xB3,0x8D,0x53,0xBE,0x02,0x20,0x31,0xF9,0x8B,0x6F, + + 0x56,0x11,0xB2,0xA8,0x47,0x9E,0x43,0xA9,0x67,0xD2,0x94,0x44,0xED,0xD0,0xA8,0xFC, + + 0x01,0x98,0x12,0xB8,0x5B,0xC3,0xAD,0x5E,0xDF,0x72,0x22,0x8D,0xF6,0x58,0x3E,0xE5, + + 0x59,0xFA,0x1E,0xEE,0xDB,0x82,0xAB,0xFE,0x1C,0x2F,0x0B,0x5F,0x54,0x8C,0x7A,0xF5, + + 0x49,0x1B,0xA6,0xC4,0x31,0x74,0x06,0xAB,0x89,0x30,0x68,0xED,0x9B,0x05,0x32,0xD6, + + 0xC2,0x96,0x0C,0x9C,0xD0,0x5B,0x0E,0xBB,0x88,0x31,0x1B,0xF6,0x3F,0xD8,0xC7,0xF3, + + 0xC2,0x31,0xD9,0xAF,0x4E,0x27,0xC5,0x12,0x66,0xDB,0x39,0x77,0x92,0x7E,0xE4,0xF5, + + 0x4A,0xF6,0xF3,0xF9,0x71,0x38,0xCD,0xCB,0x40,0xF8,0x48,0x32,0x31,0x71,0xC6,0x89, + + 0x86,0xC5,0xF8,0xB5,0xC9,0x9B,0xBA,0xC7,0xA2,0x29,0xCC,0x32,0x10,0x69,0x75,0x70, + + 0x69,0x5B,0xAE,0x26,0xC5,0xC8,0x9A,0x45,0x9E,0x18,0x37,0x4F,0xF5,0x38,0xD3,0x1A, + + 0x09,0xA5,0x94,0x7E,0xC8,0x6A,0xFB,0x3B,0xE4,0x52,0xE9,0xAB,0x19,0xF9,0x0D,0xCC, + + 0x7D,0xFA,0x3C,0xA1,0x41,0x8A,0x25,0x57,0x5C,0x37,0xA1,0x88,0x91,0x76,0x18,0x2A, + + 0x6E,0x99,0xF8,0xE5,0xF8,0x3C,0x2E,0xDA,0x12,0xA3,0xDE,0x78,0x19,0xAD,0x74,0x68, + + 0xB6,0x5C,0xB6,0xA2,0xF9,0x3D,0xCE,0x7C,0x6A,0x91,0xFF,0x9E,0x39,0x72,0x55,0xC4, + + 0x41,0x5A,0x8F,0xC5,0x47,0xB8,0x69,0x0B,0x98,0x81,0xC1,0xC5,0xFC,0x5F,0x77,0x27, + + 0x07,0x12,0xC7,0xD9,0x3C,0x4D,0xB3,0x11,0x2B,0x12,0x85,0x30,0x93,0x9E,0x1E,0x76, + + 0x65,0x84,0xA6,0x1B,0xB5,0x0F,0x48,0x2A,0xA4,0xC6,0x37,0x44,0x70,0x7C,0x49,0xD2, + + 0x07,0xED,0xB9,0x27,0x21,0x0E,0xB8,0x74,0x6F,0xDA,0x15,0x59,0x3E,0xEE,0x58,0x6D, + + 0xE5,0x86,0x37,0x20,0x35,0x0D,0x9C,0x53,0x67,0xC6,0x8E,0x7D,0x49,0x1F,0x17,0x66, + + 0x4F,0xD2,0x38,0x64,0xF9,0x00,0xD7,0x55,0x85,0x68,0x39,0xB5,0x69,0xD8,0xF5,0xB1, + + 0x82,0x09,0x21,0xB6,0x7F,0x05,0xF0,0x9D,0x40,0x8E,0xCE,0x4A,0x88,0x49,0xF8,0x21, + + 0x6B,0x2E,0x28,0x72,0x75,0xA8,0x26,0x90,0x43,0x68,0xD7,0x09,0x8E,0x79,0x33,0x08, + + 0x6D,0xE2,0xF0,0xAD,0x33,0x99,0x6E,0x1C,0x4B,0x87,0xE4,0xF9,0xD7,0x76,0x11,0x57, + + 0x05,0x01,0x97,0x6F,0x6F,0xB6,0x68,0xF7,0x8F,0x37,0x42,0x2D,0x2B,0xB6,0x1C,0x7E, + + 0xC6,0xB9,0xB7,0xFD,0x24,0xF5,0x4A,0x22,0xAC,0x37,0x32,0x3F,0x00,0x15,0x92,0xFA, + + 0x45,0xC5,0xAA,0x24,0x71,0x1C,0xC5,0xD7,0xB2,0x44,0x0F,0x87,0x59,0x49,0x6B,0x07, + + 0xBF,0x34,0xA1,0xE4,0x63,0x71,0xA3,0xC3,0x03,0x87,0xED,0xCD,0xD8,0xEC,0x7F,0xE6, + + 0x72,0xCA,0xBA,0x9B,0x95,0xCC,0x44,0xBF,0xAF,0x2E,0x3C,0x04,0xED,0x1E,0x90,0x4E, + + 0x46,0x7C,0x55,0x7B,0x18,0xB4,0xC9,0x88,0xE2,0x31,0x41,0x47,0xDE,0x6C,0x14,0x5C, + + 0xEE,0x0E,0x7B,0x19,0xF6,0xFC,0xCE,0x18,0xB4,0x30,0x3A,0xBA,0xC7,0x19,0x39,0xF8, + + 0xE6,0x9F,0xE3,0x51,0xA6,0x5A,0x0B,0x4F,0x6F,0x51,0xC4,0x43,0x2E,0xDF,0x46,0xA8, + + 0x03,0xCE,0x89,0x1F,0x76,0x9E,0xEB,0x88,0x4B,0x42,0x6E,0x0C,0xAF,0xEE,0x83,0xAA, + + 0x17,0x9D,0x97,0xBE,0x07,0xD0,0x52,0x8F,0x67,0x00,0xA6,0x96,0x9F,0xB4,0xD3,0x55, + + 0xEF,0x80,0x3B,0x88,0x41,0x05,0xB4,0x48,0x64,0xB1,0x18,0x92,0x9C,0x10,0x9D,0x7D, + + 0xB4,0xDF,0x65,0x97,0xA3,0x46,0xF5,0xE7,0x39,0x90,0x8F,0x17,0x6D,0x5D,0x96,0x00, + + 0xC9,0x99,0xBA,0x8D,0xC5,0x66,0xE2,0x4D,0xC1,0x83,0xAB,0xD5,0x95,0x33,0x3D,0xD7, + + 0x02,0x1F,0xD9,0x16,0x95,0x0B,0x93,0x6A,0xC3,0x02,0x34,0xC7,0xE6,0x7F,0x56,0x62, + + 0xB2,0x3A,0x54,0xE6,0x96,0x2A,0x87,0xD5,0xC6,0x94,0xC2,0xCE,0x57,0x98,0xA8,0xFE, + + 0x4D,0xD2,0xFD,0x52,0x85,0x6E,0xE5,0x10,0x6A,0xDB,0x0A,0x05,0x76,0xB5,0xC9,0xF7, + + 0xC4,0xF9,0xD2,0x90,0x65,0xBF,0x2D,0x6B,0xF3,0xCC,0xEA,0x85,0x48,0x42,0x23,0xCD, + + 0xD1,0x3E,0xB3,0xB1,0x08,0xC4,0x16,0xD0,0x5B,0x68,0xC8,0xA8,0x9D,0x7B,0x26,0x9F, + + 0x52,0x46,0x07,0xEC,0x86,0xA6,0xBD,0x3E,0x68,0x25,0x80,0x8B,0x16,0xF6,0xB6,0xF5, + + 0x66,0xAB,0x18,0xC0,0x29,0x67,0x8E,0x6C,0x72,0xD2,0x9A,0x5C,0x70,0xBB,0xBF,0x73, + + 0xCE,0xD6,0x18,0xA2,0x49,0x6A,0xFF,0xFF,0x1E,0xD3,0x3F,0x3D,0x3F,0xED,0x73,0x39, + + 0xAA,0x11,0xE5,0xB1,0xFC,0x2E,0x57,0x9C,0xE1,0x5A,0xE7,0xD1,0x12,0xBE,0xFE,0x25, + + 0x1C,0xAA,0xEC,0x22,0x3F,0x46,0x36,0x17,0x33,0x66,0x7B,0xC5,0x4F,0x08,0x35,0x9D, + + 0x45,0xFA,0x5C,0x5D,0xBE,0xB4,0x72,0xAB,0xEA,0xFA,0xA4,0x28,0xFF,0xAE,0xD7,0x87, + + 0x08,0x8F,0xAC,0x18,0x56,0xEE,0xEC,0x03,0x53,0x24,0x69,0x7B,0x8D,0x91,0x48,0x1D, + + 0xE9,0x91,0x67,0x62,0xCE,0xFD,0x70,0x6B,0x69,0x4D,0x1F,0x9C,0xB1,0xCF,0x1B,0x12, + + 0x81,0x11,0x8E,0x6A,0xB6,0x31,0x20,0x50,0x47,0x03,0xFE,0x55,0x50,0x21,0x11,0x76, + + 0xC8,0x6A,0x41,0x9D,0x21,0x2A,0x6E,0xA3,0x40,0x25,0x07,0x56,0xBC,0x0E,0x85,0x29, + + 0x91,0x07,0x36,0xF3,0x2C,0x2A,0x5E,0xB3,0x41,0xE3,0xB5,0xA3,0xBA,0x6C,0x12,0x6E, + + 0xE9,0x60,0xC0,0xBB,0xE7,0xA7,0x38,0x67,0xE1,0x21,0x3A,0x94,0x5A,0x2B,0xF5,0x61, + + 0x6F,0xAA,0x69,0x32,0xCD,0x37,0x5E,0x5C,0xAA,0x14,0x9E,0x9C,0x94,0x28,0x1B,0x40, + + 0x21,0x8D,0x45,0xBB,0x1D,0x3D,0xEE,0x83,0x8A,0x57,0x88,0xBE,0x77,0x6D,0xE9,0x23, + + 0xE1,0x1B,0x71,0xCB,0x90,0x3F,0x01,0x75,0x8B,0x76,0xC1,0xF5,0x32,0x28,0x86,0xCD, + + 0x78,0xF3,0xCD,0xFD,0x60,0x28,0xBE,0x8D,0x9D,0x2B,0x12,0x5F,0x34,0xED,0x19,0xFA, + + 0x41,0xE8,0x17,0x98,0x43,0x31,0x97,0xDF,0xBC,0x7B,0x9D,0xFB,0x93,0x10,0xC3,0x2D, + + 0xEA,0xA7,0xA5,0x60,0xEC,0x87,0xB8,0xE3,0x73,0x71,0x81,0xAD,0xDE,0x62,0x17,0x10, + + 0x68,0xA4,0x83,0x09,0xF2,0x9A,0xE7,0xBB,0x49,0x0C,0xC1,0x3F,0x6A,0xB6,0x3C,0x4F, + + 0xAB,0x85,0xFC,0x79,0x72,0x21,0x72,0xEF,0x02,0xAD,0xB2,0x23,0x27,0x61,0x54,0x4B, + + 0x67,0x02,0xF0,0xEC,0x82,0x6F,0x7A,0xA1,0xEA,0xC7,0xB7,0x9A,0xF7,0xC0,0xC7,0xA9, + + 0xB5,0xA3,0xD1,0x59,0x71,0x6A,0x67,0x7A,0xEE,0x48,0xF9,0xBD,0x86,0x75,0x79,0x4A, + + 0x28,0x3E,0x43,0x2F,0xA8,0xCF,0x23,0x2B,0x88,0xBF,0xCA,0x9F,0xFF,0xC0,0xE8,0xB1, + + 0x4C,0x52,0xC3,0x94,0x03,0x97,0xAB,0x46,0x53,0xC6,0x9C,0xBD,0xFF,0xF6,0x74,0x81, + + 0x4D,0xBC,0x05,0x10,0x6B,0xB1,0x3C,0x03,0xC0,0x58,0xFE,0xB6,0x70,0xA1,0x95,0x60, + + 0xC3,0x32,0x45,0x1C,0x91,0x29,0xD5,0x3D,0xDA,0x54,0x94,0xDB,0x91,0x76,0x9B,0x23, + + 0xFD,0x3D,0xD4,0xD8,0xB7,0x81,0xDD,0x35,0xBB,0x55,0xC7,0x36,0x99,0x92,0xD3,0x33, + + 0xA6,0x9F,0xAD,0x2F,0xCD,0xBF,0x34,0xAF,0x1F,0x59,0x8E,0xEB,0x0E,0x6B,0x88,0x97, + + 0xF9,0xEA,0x6C,0xA6,0x51,0x09,0x05,0x3B,0xC6,0x39,0xCB,0x1E,0x92,0x3A,0x61,0x7D, + + 0xA4,0x1E,0x0D,0xF4,0xDE,0x99,0x7F,0x31,0xBE,0xA9,0x6E,0x03,0x91,0x02,0xF6,0x4B, + + 0x7A,0xEA,0x0D,0xE0,0x6D,0x3F,0xBA,0x31,0xBB,0x4C,0x62,0xC4,0x52,0xD6,0x96,0xC7, + + 0xD5,0x64,0x9E,0xE3,0xC7,0xE3,0x36,0xB9,0xE5,0x3B,0xE8,0xAA,0x99,0xFB,0x70,0xF5, + + 0xAB,0x1D,0xC9,0x94,0x0A,0x8F,0x63,0x51,0xB7,0x36,0x9A,0x5E,0x90,0x50,0x67,0x8B, + + 0xEB,0x17,0x87,0x65,0x6A,0x78,0xBC,0x0C,0x3D,0x44,0x26,0x5E,0x74,0xF1,0xC3,0xFB, + + 0x42,0x01,0x4F,0x04,0x98,0xC7,0xA4,0x30,0x46,0x5D,0xDD,0x42,0x10,0x9A,0x69,0x32, + + 0xA5,0xA1,0x40,0xBE,0xB8,0x40,0xFA,0x8E,0x95,0x47,0xEE,0x13,0x83,0xDD,0x6E,0x4A, + + 0xAB,0x15,0xC8,0xE9,0xB2,0xF0,0x64,0x10,0xB8,0x12,0x05,0xEC,0x18,0x07,0x25,0xC9, + + 0x5B,0x97,0x9F,0x2F,0x3A,0xBE,0x3A,0x8F,0x96,0x11,0xEF,0xDC,0x5B,0xC1,0x5A,0x5D, + + 0xAA,0x15,0xF1,0x05,0x98,0xBE,0x06,0x38,0x4E,0xD6,0xC8,0x79,0xDF,0xB6,0xB6,0xF2, + + 0xC5,0x21,0xA0,0xF7,0x60,0x5F,0x08,0x42,0x42,0x82,0xAA,0x24,0xC6,0xEA,0x10,0x72, + + 0x53,0x0A,0xBF,0x16,0xDD,0xBB,0x94,0x97,0x90,0xA2,0x58,0x07,0x39,0x4E,0xB7,0x87, + + 0xAC,0x96,0x87,0x3B,0xA9,0x09,0x76,0xA1,0x44,0x62,0x31,0x64,0x52,0x69,0xBA,0x22, + + 0xE9,0xC1,0x3A,0x64,0x86,0xE1,0x92,0xF9,0x7E,0xF8,0x19,0x45,0xB7,0xB6,0x1E,0x6E, + + 0xE7,0x2B,0x4B,0x01,0x18,0x78,0x0E,0x4A,0x66,0xC7,0x54,0x04,0xAD,0xA6,0x0E,0x23, + + 0x04,0x4C,0xB2,0x13,0x7F,0x44,0x8F,0x14,0x66,0x85,0x9A,0x72,0x73,0xE3,0x70,0x30, + + 0xB6,0xEA,0x25,0x8D,0x2D,0x59,0xF1,0x00,0x10,0xDD,0xBF,0x45,0x2B,0x8A,0xA9,0x13, + + 0x84,0x0C,0x97,0x51,0x76,0x24,0x45,0xED,0x2E,0x5D,0x53,0xB1,0x76,0x65,0x36,0x00, + + 0xAD,0x83,0xE5,0x46,0x1D,0x68,0x44,0xCD,0xB9,0xFA,0xCC,0x29,0x3F,0xC8,0xBC,0xF0, + + 0xA8,0x03,0x39,0xE1,0xD5,0x78,0xC5,0x32,0xE8,0xD2,0xAE,0xCF,0xFE,0xA9,0x61,0xFB, + + 0xE5,0x2B,0xFD,0x36,0x9C,0x01,0xCF,0xC3,0x2E,0x87,0xCB,0x5C,0xB0,0xE3,0x53,0xFB, + + 0x99,0x00,0xE2,0xF7,0x7F,0xE9,0xD8,0x64,0x6A,0xDB,0x89,0x0F,0x89,0xA9,0x03,0x77, + + 0xE5,0xC8,0xCF,0xCA,0x72,0x5A,0x2A,0x66,0x7D,0x46,0x8A,0x9E,0xC2,0x5D,0xCE,0x38, + + 0xFC,0xE8,0x87,0xB6,0x53,0x71,0x90,0x1C,0x6E,0x4D,0x5F,0x43,0xEC,0xA0,0x39,0x59, + + 0xF8,0x21,0xAB,0xC2,0x98,0xE6,0xCB,0x8B,0x86,0xD5,0x8A,0x09,0x29,0x65,0x53,0xA0, + + 0xEC,0x83,0x47,0xDA,0x4A,0xCD,0x41,0x93,0x54,0x80,0x57,0xE1,0xDC,0x2F,0x44,0x80, + + 0x84,0x9D,0x19,0xD9,0x43,0xB0,0x14,0x10,0xC5,0xD9,0x18,0x39,0x77,0x91,0x30,0x70, + + 0x84,0xFF,0xAD,0x7E,0xEB,0xF3,0x1C,0xA3,0xE8,0xB2,0x2A,0x84,0x15,0xB3,0x6F,0x9E, + + 0x26,0xAE,0xFC,0x19,0xB2,0x00,0xF5,0x27,0xBE,0xD4,0xEB,0x45,0xF0,0x5F,0x4F,0x87, + + 0xA4,0xF3,0xEA,0xF7,0x86,0xC8,0x96,0x16,0x30,0xCD,0x7D,0xF7,0xAD,0x9D,0x3E,0x42, + + 0x5A,0x3B,0x84,0x89,0x15,0xB9,0x70,0x82,0x5D,0x59,0xCC,0x1C,0x70,0xB5,0x12,0xD5, + + 0xA6,0xF1,0x29,0x3E,0xBA,0xF8,0xC4,0x0D,0x8E,0x34,0xF4,0xE6,0x48,0xD5,0xC5,0x33, + + 0x18,0x45,0x49,0x54,0x86,0xBC,0x0B,0xD6,0xD5,0x11,0x69,0x85,0x79,0x60,0x45,0xD5, + + 0x2A,0xF2,0x12,0xB5,0xCB,0xB8,0xD1,0x6C,0xE4,0x4E,0xDD,0xF3,0xC8,0xF7,0x7C,0x9E, + + 0x8F,0x83,0x66,0x12,0x06,0xF9,0x4B,0x43,0xB6,0xB7,0xD4,0xA6,0x89,0x71,0x77,0xD6, + + 0xCC,0xD6,0x90,0xFF,0x82,0xE2,0xB7,0xDC,0x9A,0xC9,0x3D,0x4E,0xF3,0x58,0x55,0x0F, + + 0xFA,0xA9,0x7C,0xA1,0xC3,0xFC,0x8C,0x22,0x43,0xC1,0x97,0x3D,0x7C,0xF2,0x2E,0xE8, + + 0xBE,0xD4,0xAF,0xED,0x46,0xF9,0x87,0x44,0x62,0xC0,0x29,0x4C,0x79,0x76,0x5E,0x51, + + 0xD1,0x3C,0xDC,0x26,0xED,0xF3,0x2C,0x3E,0x06,0x3D,0x4D,0x3E,0x76,0x85,0x28,0xDD, + + 0x65,0xD9,0xB7,0x1F,0x9A,0x34,0x40,0x22,0x4E,0x47,0x62,0x84,0xDC,0x0D,0xC7,0x18, + + 0x2A,0xDE,0xE6,0xA9,0x9F,0x2E,0x0E,0x8D,0xCF,0xD7,0xEF,0xFE,0xF8,0xBF,0x57,0x41, + + 0x2C,0xDB,0xEB,0xBF,0xF7,0xA4,0xBF,0xBF,0x74,0x5E,0xF8,0x21,0x60,0xBE,0xA8,0x25, + + 0x85,0xC1,0x96,0x66,0xAF,0x8D,0x18,0x24,0xC7,0x31,0x50,0x18,0xD9,0x22,0x51,0xA2, + + 0xA4,0xAE,0xF7,0x10,0x4C,0xB2,0xA0,0xDE,0x51,0x0C,0x58,0x08,0xD8,0x65,0xA9,0x30, + + 0x05,0x73,0x98,0xA0,0x27,0xAF,0xF9,0x04,0xF3,0x9F,0xC9,0x6A,0xAF,0x22,0x9F,0x19, + + 0x24,0xAC,0xAF,0xF0,0xA1,0x25,0xB5,0xA3,0x89,0x1E,0xC4,0xB7,0x51,0x9A,0x1A,0x48, + + 0xA1,0x46,0x78,0x64,0xFF,0x44,0x45,0xE2,0xDF,0xCD,0xB6,0xC5,0xB9,0xC7,0x56,0x78, + + 0x22,0x35,0xA3,0x32,0xEC,0x4B,0xA5,0x0A,0xCC,0x13,0xA6,0xC4,0xBA,0x06,0x1D,0xDA, + + 0x6B,0x6D,0x79,0x55,0x35,0x3D,0x69,0x8F,0x4F,0xD0,0xEF,0xD5,0x18,0x65,0x29,0x53, + + 0xF3,0xAA,0xAB,0x51,0x92,0x57,0x51,0x60,0x62,0x38,0xCB,0x3F,0x2C,0xEA,0x13,0x4F, + + 0xCA,0x4B,0xA2,0x4C,0xB9,0x87,0x70,0x28,0x49,0x22,0xAA,0xCC,0x04,0x73,0x68,0x1A, + + 0x0A,0xC9,0xE8,0x09,0x18,0x79,0x0B,0x09,0xBD,0xA8,0x9F,0xBE,0xD9,0xF8,0x3D,0x3C, + + 0xE9,0x0E,0x96,0x7E,0xA0,0x44,0x03,0x00,0x8B,0x49,0xDF,0x4B,0x3A,0x2A,0x55,0x2C, + + 0x89,0xA0,0xEB,0x1F,0xDC,0x26,0xAC,0x11,0xBA,0x4B,0xC1,0x2A,0x7A,0xE4,0x9E,0xAA, + + 0xE9,0x69,0x7D,0x1C,0x9A,0x63,0x69,0xE7,0xF5,0x4A,0x84,0xC8,0xAD,0x00,0x13,0x1F, + + 0xAE,0xB2,0x9E,0x1A,0x63,0x6C,0xE7,0xBF,0x99,0x47,0xBC,0x40,0x5A,0x2F,0x3B,0x6D, + + 0x6B,0x31,0xFE,0x2D,0x9E,0x60,0xFE,0x18,0x6B,0xD1,0x6C,0xFE,0xA6,0xB3,0x12,0x96, + + 0x2E,0xBE,0xE0,0x22,0x4A,0x92,0x5C,0x89,0xC3,0x53,0xE5,0xCC,0xBB,0x73,0xC4,0x60, + + 0x9D,0xEB,0x44,0x74,0x97,0xCB,0xC3,0xD5,0xED,0x4B,0xAC,0xF4,0x74,0x7F,0xE0,0x78, + + 0xDC,0x5C,0xB2,0xBD,0xD3,0xA1,0x54,0x91,0x1A,0xD1,0x0B,0x56,0xF3,0x75,0x85,0x05, + + 0xD4,0x3E,0x05,0x01,0xC4,0x1E,0xEB,0x25,0x9E,0x00,0xAD,0x57,0x72,0x76,0x6F,0x90, + + 0xB3,0x5E,0x8D,0xD5,0xB5,0x1B,0xDD,0x0C,0xD8,0x3F,0xC4,0xD7,0x0E,0x77,0x9F,0xD9, + + 0xA2,0x8D,0x43,0x35,0x91,0x35,0x57,0xA0,0x72,0xD9,0x82,0xD4,0x8D,0xDB,0x16,0xBC, + + 0x5B,0xBA,0xB2,0xE9,0x8A,0xBF,0xE7,0xF2,0x7F,0x4E,0x23,0x07,0x55,0x19,0x9E,0xDD, + + 0x43,0xA9,0xF7,0xD6,0x11,0xE7,0x0C,0x3B,0x45,0x46,0x01,0x96,0x90,0xF5,0xED,0xA3, + + 0xC1,0x6B,0x4A,0x24,0x10,0x36,0x32,0x97,0x1C,0x39,0xE3,0x50,0x39,0x86,0x64,0x88, + + 0x2B,0x58,0x04,0x0E,0x00,0xD2,0x4F,0x4B,0x6E,0xAB,0xD0,0xEA,0x72,0x7E,0xB6,0x76, + + 0x39,0x54,0x11,0xBD,0x16,0x18,0xA7,0x2A,0x61,0x51,0x65,0x5E,0xD8,0xF3,0x03,0xE6, + + 0x9B,0xD5,0x91,0xEF,0x97,0x1B,0xD6,0x69,0xAA,0x36,0xB7,0x91,0x59,0xF0,0xF2,0x5E, + + 0x63,0x0A,0x53,0xBC,0xD6,0x1A,0x9C,0x7F,0xC5,0x15,0xE0,0x5F,0x58,0xF4,0x38,0xCF, + + 0x8B,0x83,0xF4,0xDF,0x99,0x3F,0x34,0xF0,0x6B,0x9C,0xE8,0x48,0xB0,0xAD,0x2D,0x37, + + 0xDA,0x73,0xC1,0xBE,0x35,0x5F,0x49,0xDC,0x96,0x56,0x0E,0xEF,0x07,0x1E,0x5F,0x19, + + 0x27,0xE3,0xB9,0x6C,0x38,0x3A,0x6D,0x61,0x4D,0x12,0x9F,0xF9,0x32,0xAF,0xA8,0x99, + + 0xA7,0x82,0x0B,0x0D,0xB3,0x86,0x5D,0x11,0x30,0x82,0x73,0x8E,0xD5,0xD9,0x31,0xA6, + + 0x02,0x4B,0xBE,0x2F,0x35,0xE0,0x6F,0x27,0x42,0xE0,0x04,0xC4,0x52,0x08,0xE8,0xE3, + + 0x5D,0x2C,0x88,0x42,0xB6,0x0C,0xF9,0xF5,0x76,0x2E,0x2B,0x75,0x2E,0xE1,0xB5,0x87, + + 0x8D,0xE3,0xAD,0x96,0x75,0xA4,0xC5,0xBA,0xC2,0x82,0x41,0x55,0x2B,0xA0,0x72,0x54, + + 0x47,0xE3,0xBC,0x50,0x57,0xA0,0xF9,0x8E,0xD3,0xCB,0xE2,0x57,0xAA,0xC3,0x98,0xC0, + + 0x9B,0x5D,0xF8,0x5A,0x25,0xBC,0x4F,0x28,0x56,0xC0,0x0F,0x14,0x3C,0x67,0x0F,0x12, + + 0x17,0x08,0x50,0xA5,0x79,0xA3,0x03,0x99,0x1F,0x78,0x1F,0x05,0x71,0x33,0x59,0xB8, + + 0x23,0xEA,0x59,0xB4,0xF0,0xB6,0xF1,0x24,0xE8,0xD8,0x0A,0xA0,0x3F,0x85,0x91,0x5B, + + 0x20,0x97,0xC9,0x9A,0x17,0x37,0x63,0x63,0xE4,0xD1,0xF1,0x63,0xB4,0x2D,0x6A,0x9E, + + 0x2E,0x69,0xAA,0x9A,0xF5,0x99,0xB2,0x28,0x2E,0xD3,0x72,0x4F,0x9B,0xEC,0x3A,0x0F, + + 0x55,0x72,0x2D,0xE3,0x11,0xEB,0xBA,0xFA,0x6F,0x02,0x3C,0xBC,0xDD,0x38,0xE7,0x2B, + + 0xB4,0x88,0x4F,0x9D,0x9D,0xA0,0x56,0x5D,0x41,0x4C,0xFF,0xE9,0xD6,0xA4,0xAF,0x9F, + + 0xF9,0xA7,0x38,0x5C,0x61,0x9A,0xBB,0x39,0xBD,0x89,0x83,0x6F,0xD5,0xE4,0x9A,0x0C, + + 0x72,0x7B,0xBB,0x1F,0xBB,0x03,0x12,0x68,0x4D,0xC1,0xE1,0x84,0xBF,0xA3,0x33,0x95, + + 0xA8,0x89,0x3C,0xDC,0x9F,0x37,0x07,0x11,0x3B,0x12,0xAC,0x0D,0x79,0x4B,0x9C,0x5E, + + 0x6F,0x51,0x31,0x47,0x3B,0x01,0x63,0x19,0xCA,0x43,0x5F,0x1C,0xF0,0x48,0xB7,0xE4, + + 0x78,0x0F,0xD3,0xB4,0x5E,0x25,0x63,0x6A,0x40,0x49,0xA9,0x3F,0x8F,0x42,0x1A,0xB7, + + 0x45,0x94,0x7F,0xA7,0xEC,0x91,0x21,0xD0,0x57,0xE6,0xD4,0xA4,0x08,0xFF,0x4D,0xD2, + + 0x69,0x92,0xD2,0xD7,0x71,0x90,0x59,0x46,0x6D,0xBD,0xF0,0xB4,0x6B,0x5A,0x5C,0xED, + + 0xC5,0x96,0xD3,0xA6,0x3F,0x93,0xCF,0xA1,0xA4,0xC9,0x8F,0x58,0xF2,0x73,0xB9,0x1B, + + 0x22,0x52,0x10,0xB6,0x16,0xFD,0x64,0xCD,0x40,0x55,0x61,0xBD,0x75,0x31,0x83,0x2D, + + 0xA4,0xE8,0xFC,0xCB,0xC7,0xF6,0x8C,0x0A,0xBD,0x99,0x63,0x15,0x58,0x59,0x80,0x5C, + + 0x24,0xD7,0x65,0x3E,0xAF,0xB1,0x3D,0x14,0x77,0x98,0x2C,0xB1,0x9E,0x56,0x7B,0xA1, + + 0x11,0xEB,0x26,0x87,0xB0,0x64,0xEE,0x83,0xA8,0x5B,0x25,0x74,0x82,0x59,0x37,0xD2, + + 0x36,0x2A,0xE8,0xAD,0xB1,0x65,0x82,0x34,0x25,0xD7,0x9B,0xCA,0x1C,0x54,0x06,0x1A, + + 0x2A,0x6B,0x25,0xCF,0x78,0xF4,0x32,0xEA,0x24,0xC3,0xE8,0x4B,0xE4,0xFC,0x95,0xEA, + + 0xAD,0x86,0xF5,0x8B,0xB8,0x48,0xD6,0x8B,0x1A,0xAE,0x2D,0xFD,0x7B,0xD2,0xB9,0x4C, + + 0x11,0x6C,0x24,0xCE,0xF8,0x11,0x52,0xDD,0xCD,0x9A,0xF3,0x52,0xF0,0xB8,0x96,0xEB, + + 0x2D,0x8D,0xA3,0x8B,0xC2,0xDB,0xE0,0x3B,0x04,0xE2,0x40,0x3D,0xFE,0x1D,0x4F,0xC2, + + 0xAE,0xDC,0xAC,0x4A,0x68,0xE4,0x7E,0xFF,0x93,0x5A,0xC8,0x5E,0xB4,0x2D,0x95,0x7A, + + 0x5B,0x4C,0xBC,0xD6,0x9A,0x12,0x69,0x12,0xB4,0x00,0x49,0x5B,0x79,0x2F,0xCB,0x6E, + + 0x3D,0x01,0xBE,0xD8,0x1B,0x11,0x70,0x2B,0xEA,0x90,0x89,0x5F,0x0A,0xBD,0x4F,0x7F, + + 0x8F,0x4E,0xB9,0x98,0x56,0x1C,0x87,0xDF,0xDC,0x41,0x34,0xC1,0x99,0x0A,0xD6,0xFA, + + 0xFB,0x42,0x67,0x44,0x1C,0xDB,0x49,0x11,0xE5,0x31,0x92,0x42,0x2C,0x2F,0x30,0x6F, + + 0x80,0x0C,0x3F,0xB5,0x35,0x6D,0xAF,0x95,0x09,0x22,0x74,0xA6,0x30,0x69,0x85,0x04, + + 0x75,0x0E,0x7E,0x21,0x74,0xA1,0xEC,0x53,0xF6,0x1D,0xAB,0xD6,0xF3,0x2F,0xBA,0xA1, + + 0x7D,0xA0,0x59,0x66,0xB2,0x28,0xD9,0xF1,0x4F,0xB7,0xD9,0x53,0xB1,0xF5,0xBB,0x70, + + 0x51,0xAB,0x47,0x37,0x26,0x85,0x11,0xA7,0x44,0xF6,0x98,0xF6,0xF3,0xE3,0x36,0x57, + + 0xA2,0x47,0x82,0x50,0xF8,0xB4,0x1A,0x83,0x1C,0xCE,0x80,0xF6,0x50,0xC3,0xE1,0x33, + + 0xE0,0x5A,0xF9,0xBA,0xFB,0x57,0x4C,0x21,0x82,0x7B,0x2E,0x96,0xD4,0x8E,0x0E,0xE5, + + 0x6A,0xBD,0xF7,0x78,0xD0,0x07,0x92,0x4D,0x28,0x03,0xE7,0x58,0x70,0x61,0xC2,0x94, + + 0x5F,0x06,0x4B,0xE4,0x44,0x65,0xC2,0x5A,0xF3,0x57,0x6A,0xC4,0xD5,0xE3,0xF1,0x9C, + + 0x05,0xDD,0x85,0x3C,0x3F,0x71,0x9E,0x3D,0x7A,0xA9,0x22,0x2C,0xFE,0x6D,0x3B,0xF6, + + 0x0B,0x07,0x9B,0xCD,0xBA,0x6A,0x68,0xD2,0x3F,0x08,0x97,0xCB,0xEB,0x6A,0x9B,0x06, + + 0xB5,0xBF,0x63,0xB9,0x9F,0x33,0xDB,0x29,0x84,0x17,0x99,0x4F,0xEA,0x07,0x82,0xD1, + + 0x69,0x04,0x4D,0xBF,0x26,0x81,0x68,0xD8,0xDF,0x0E,0x9A,0xFE,0xF9,0x6A,0x81,0xDC, + + 0x51,0xCE,0xAF,0xB4,0xDD,0xE0,0x42,0xFC,0x11,0xE6,0xA2,0x58,0x30,0x62,0xC3,0x0A, + + 0x70,0xA3,0xD0,0xAD,0x9E,0x03,0x14,0xCD,0x47,0xE3,0xDB,0x25,0xB9,0x4E,0x8B,0xC0, + + 0x35,0x63,0xB4,0xA0,0x93,0x6D,0x13,0x69,0x72,0xCF,0x5B,0x0E,0xE9,0x2D,0x02,0x68, + + 0xF0,0xDD,0x5F,0x2B,0x4F,0x32,0xD4,0x08,0x5A,0xFD,0xB4,0x75,0xD1,0xFA,0xB4,0xD7, + + 0xFF,0xEE,0xC2,0xDF,0x32,0xC3,0x04,0x38,0xEC,0xF7,0xAE,0x4B,0x42,0x71,0x7B,0x21, + + 0x93,0x60,0x45,0x98,0xFC,0x70,0xC5,0x43,0x09,0xA3,0x12,0x54,0x53,0x22,0x54,0xB5, + + 0x04,0xCC,0xDD,0x35,0xFF,0x71,0x4B,0x71,0xEF,0xA6,0x25,0x72,0x2F,0xDE,0x84,0x59, + + 0x44,0x56,0x04,0x80,0x41,0xC9,0xC4,0xFF,0x56,0x52,0x60,0x86,0x99,0x30,0xE0,0x54, + + 0x79,0x8C,0xDF,0xA7,0x43,0x59,0xED,0xFC,0xE1,0x5F,0xF4,0x87,0xFF,0xF3,0x86,0x49, + + 0x03,0x69,0x4E,0xA5,0xB8,0x96,0x1D,0x76,0x43,0xD1,0xF4,0xE2,0x7D,0xF0,0x45,0xAC, + + 0x4A,0xAD,0xAF,0xD0,0xB2,0x99,0x3F,0x93,0x1C,0x32,0xDD,0x35,0xE1,0xFC,0xAA,0xF7, + + 0xFE,0x9A,0x56,0x74,0x0B,0xB6,0x81,0x2C,0x3D,0x25,0xEE,0xDC,0xF8,0x67,0xF1,0x69, + + 0x03,0xE6,0x10,0x03,0x5A,0x3D,0x78,0x08,0x6A,0x99,0x98,0x41,0x71,0x3B,0x79,0x38, + + 0xC3,0x99,0x3F,0x72,0x37,0x97,0xAC,0x5A,0xCE,0x36,0xCD,0xAF,0x6A,0x72,0x35,0x6A, + + 0xDD,0xB6,0xF6,0xEC,0xDC,0x2D,0x39,0x1D,0x8B,0xFF,0x90,0x3E,0xD9,0xAB,0x86,0x51, + + 0x4C,0x21,0xA6,0x8D,0xD7,0xB7,0x6E,0x95,0x4B,0x8C,0x1B,0xDD,0x48,0x3E,0x55,0x98, + + 0x67,0x5F,0xAE,0x1C,0xF9,0x90,0x14,0x03,0xC8,0x5B,0xA6,0x0D,0xD8,0x3D,0xBA,0x0E, + + 0xAC,0xAC,0xBC,0x2F,0x3A,0xE1,0x37,0xA8,0x64,0x53,0xC3,0xE7,0x99,0x81,0x08,0x76, + + 0x0A,0x9D,0x5E,0x3F,0x39,0x37,0x53,0xFE,0x4A,0xD7,0xE1,0x55,0xFD,0x5E,0x33,0x0D, + + 0x7C,0x0B,0xFF,0xC0,0x18,0xBB,0x8B,0x6C,0xD9,0x3D,0x48,0xA2,0x1F,0xDC,0x6E,0x70, + + 0xEE,0xE2,0xB6,0x09,0xB6,0x24,0x81,0xD0,0xE9,0xBC,0xFC,0x44,0x66,0xE1,0x51,0x3E, + + 0x82,0x91,0x63,0x61,0x6B,0x0F,0x9C,0xA7,0xF6,0xC2,0xF9,0x22,0xF6,0x10,0x70,0x9B, + + 0x20,0x7C,0x8F,0xF5,0xDC,0x0C,0x41,0xC0,0xE3,0x1E,0x41,0xDF,0x13,0x2E,0xA0,0xDB, + + 0x3F,0x8E,0x26,0x74,0xF7,0x0B,0x0E,0x02,0xAF,0x7E,0xE4,0xD1,0xF7,0xFB,0xA3,0x6E, + + 0xEC,0xC1,0xD2,0xB4,0x11,0xFD,0x06,0xAB,0xAE,0x3F,0xD9,0x71,0xDA,0x63,0xE1,0x00, + + 0x7C,0x0D,0xF2,0xC5,0x97,0xBE,0x21,0x14,0xCA,0x4B,0x45,0x05,0x3D,0xA2,0x53,0xE3, + + 0x12,0x28,0x70,0xBA,0x87,0x18,0x29,0x04,0xCB,0x4A,0x99,0x04,0x5B,0x61,0x8E,0x79, + + 0x22,0x7E,0x28,0xF2,0x94,0x53,0x2A,0x2F,0x27,0x8B,0xCD,0xD3,0x54,0xAA,0xAD,0xF2, + + 0xC7,0x44,0xEA,0xE7,0x8F,0x32,0x02,0xC5,0xA4,0x8A,0x9A,0x1F,0x6E,0x19,0x5D,0x36, + + 0xE7,0x89,0x8B,0xE3,0x22,0xD1,0xCC,0xAF,0xFE,0xF9,0x75,0x1D,0x3D,0x15,0x69,0x6A, + + 0xB1,0x80,0x0E,0x9B,0xCC,0x81,0xD7,0xA4,0xCC,0x0B,0x03,0xDF,0x83,0xED,0xC6,0x28, + + 0x08,0x3E,0xB9,0x0C,0xE1,0x77,0x0C,0xB7,0x2D,0xB8,0xF2,0x2E,0x3C,0x51,0x2D,0xAA, + + 0x0E,0xCD,0xB5,0x56,0x6C,0xAD,0x85,0x6B,0x54,0xE8,0xFA,0x3E,0x2F,0xAF,0xB1,0x38, + + 0xD1,0xCC,0x80,0xCB,0x96,0x5D,0xE4,0x81,0x2F,0x81,0x91,0xED,0x2F,0x68,0x47,0xE0, + + 0x66,0x86,0x34,0x5F,0xE8,0xA3,0xC1,0x66,0x67,0x02,0xEF,0xD8,0x7E,0xF0,0xB7,0xC5, + + 0xEE,0x93,0xAC,0x96,0xB3,0x42,0xA3,0x03,0x2C,0x01,0xB6,0xD4,0x47,0xF0,0xEC,0x3A, + + 0x25,0x9C,0x2C,0x94,0x91,0x4A,0xFC,0x1A,0x1D,0xDC,0x04,0x48,0x88,0x9D,0x2D,0x87, + + 0x2C,0x8F,0x85,0x96,0xB2,0x18,0x33,0x9E,0x6C,0x28,0x4D,0x83,0xC7,0xF6,0xD6,0xB4, + + 0x04,0xEC,0xBC,0x7F,0xE9,0xFE,0xC2,0xC0,0x87,0xBD,0x5E,0xF7,0xF1,0xDF,0x1A,0x1B, + + 0x45,0x0E,0x12,0xB4,0x95,0xB2,0x70,0x00,0xE4,0xDE,0x02,0x16,0x89,0xFB,0x3E,0x9C, + + 0x21,0x27,0xE4,0x53,0x96,0x3F,0x42,0xDE,0xEA,0xB7,0x31,0xCB,0x71,0xD4,0xF6,0x30, + + 0x22,0x1B,0xED,0x68,0x15,0xB0,0x13,0x81,0x0D,0xA7,0x41,0x05,0xD2,0x7D,0xBD,0x94, + + 0x4E,0x4D,0x02,0x35,0x16,0x3D,0x65,0x76,0x0E,0xA6,0xDC,0x98,0x54,0x76,0x8F,0xF4, + + 0xB9,0x83,0xFE,0x9E,0x0F,0x6A,0xD1,0xEA,0x28,0x9A,0x9E,0x5E,0xE0,0x09,0xB9,0xDD, + + 0xF3,0x91,0x09,0x7C,0xDD,0x46,0x46,0x90,0x15,0x14,0x39,0xBC,0xC0,0x04,0x33,0xED, + + 0x53,0x37,0x1F,0x70,0x55,0xB1,0x66,0x92,0x05,0x59,0xCE,0xC9,0xDF,0x9A,0xAA,0xBB, + + 0xA7,0x8B,0xF6,0x9E,0x1A,0xA0,0xC0,0xC8,0x8F,0xB5,0xA9,0xDD,0x95,0xF6,0xA6,0x53, + + 0x45,0x96,0x11,0x2C,0xBC,0x94,0x68,0xC6,0x2D,0xFC,0x65,0x6A,0x56,0xE8,0xA5,0xA9, + + 0x70,0xDF,0x96,0xAC,0xC0,0x16,0x34,0xFB,0x90,0x70,0xEA,0x59,0x8E,0xF2,0x65,0xA0, + + 0xEE,0x31,0x43,0xAD,0xFD,0x51,0x09,0xD3,0x07,0x8F,0xAD,0xEE,0x5D,0xBC,0x28,0x6F, + + 0xA9,0x4D,0x49,0xDE,0xE3,0xB9,0xEA,0x2B,0x18,0xDB,0x4B,0x84,0x5C,0xBE,0xA7,0x2D, + + 0x06,0xA8,0x20,0x76,0x72,0x5C,0x72,0x21,0x43,0x0A,0x85,0x46,0xA7,0x05,0x30,0xE3, + + 0x71,0x64,0x2F,0x2C,0x93,0x25,0x0F,0xB4,0x69,0xA6,0x38,0x27,0x6D,0x05,0x26,0x83, + + 0x3C,0x00,0x36,0x03,0x7B,0x53,0x4F,0xC3,0xC4,0xEF,0xA9,0xDA,0x18,0xF3,0x31,0xE2, + + 0xF9,0x88,0x41,0x77,0x50,0xA9,0x21,0xCF,0x6D,0x4E,0x59,0x11,0x61,0xC3,0x1A,0xA2, + + 0x6A,0x15,0xD1,0x83,0xFB,0x35,0xC1,0x93,0x7E,0xEB,0xE8,0xB4,0x0E,0xCF,0x10,0x8C, + + 0x05,0x24,0xD2,0x56,0xA0,0x88,0xF7,0xF4,0x06,0x4C,0xE6,0x96,0x49,0x0A,0x3F,0x69, + + 0xC1,0x09,0xA7,0x69,0x7B,0x17,0x42,0x8E,0x1F,0x3B,0xA9,0x45,0x32,0x09,0x7C,0x33, + + 0x74,0x62,0x5F,0x25,0x13,0x31,0xE6,0xB6,0x01,0x27,0x49,0x85,0x60,0xC6,0xFD,0xFB, + + 0x2A,0xA7,0x05,0xFF,0x28,0x6A,0x04,0x89,0xB7,0xE5,0x83,0x5F,0x68,0xEF,0xDE,0x6A, + + 0xB2,0x82,0xB9,0x35,0x1F,0x0A,0x62,0x3C,0xA0,0xD8,0xA4,0x09,0xD4,0xEF,0x57,0xFA, + + 0xAE,0xA5,0x97,0x63,0x60,0x7B,0x43,0x95,0x3F,0xE1,0x17,0xFA,0x90,0x8B,0xE8,0x30, + + 0x8F,0x2A,0x3B,0x99,0xB1,0x76,0xDB,0x18,0x27,0x46,0x1C,0xFD,0xDD,0x4B,0x7A,0xB7, + + 0x0C,0x4D,0xCA,0x58,0xD2,0xCD,0x5A,0x7D,0xAB,0xE3,0x43,0x9F,0xDE,0xE1,0x28,0x5C, + + 0x08,0xAF,0x0A,0x18,0xC6,0x50,0x1B,0xFC,0x4E,0xB1,0xE2,0x58,0xD9,0x65,0x4B,0xCD, + + 0xAE,0x6E,0xD6,0x5E,0xAA,0x7F,0xC5,0x9A,0xFA,0x67,0x81,0x3A,0x31,0x0A,0x15,0xBB, + + 0x8F,0x72,0x0B,0x4C,0xC7,0x82,0xE6,0xFD,0x83,0xBF,0x0F,0x9F,0x59,0x47,0x62,0x20, + + 0x23,0xD0,0xCA,0x00,0x18,0x6D,0x45,0x8F,0x1C,0xE5,0xDE,0xB9,0x51,0x52,0x29,0xAC, + + 0xF8,0x2C,0x73,0x10,0x19,0x2E,0x0B,0x34,0x1D,0x07,0x85,0x8B,0x1D,0x33,0xA6,0x21, + + 0x7C,0x31,0xBD,0x7B,0x1C,0x3F,0xC1,0x9B,0xC6,0xA7,0xC5,0x3D,0xF4,0x5A,0x22,0xAE, + + 0xD9,0x51,0x4D,0xB1,0xF9,0xB5,0x47,0x8D,0x89,0x22,0xD5,0xB5,0xF7,0x32,0xFB,0x22, + + 0x24,0x55,0x4C,0x01,0x93,0xBE,0x52,0x92,0x89,0xB5,0xB4,0x44,0xCE,0x79,0xB3,0xA3, + + 0x4F,0x57,0xB3,0x36,0x17,0x38,0x4D,0x62,0x9C,0xF8,0x4C,0x07,0xF7,0xF8,0xCE,0x45, + + 0x86,0xBB,0x3E,0x27,0x13,0xBC,0x2B,0xC9,0x6D,0xFB,0xDF,0xF5,0x51,0x7B,0x59,0x0F, + + 0x56,0x18,0x87,0x2E,0x10,0x3A,0xCB,0x81,0x63,0xD1,0x8F,0xDB,0x18,0x13,0x51,0x36, + + 0xA5,0xE5,0x82,0x4C,0x3E,0x7A,0xD6,0x89,0xF8,0xD3,0xB4,0xBD,0x2B,0x50,0xDE,0x58, + + 0x6D,0xCD,0x3A,0xFE,0xC6,0x7B,0x60,0x8D,0x0A,0x93,0x08,0x38,0x51,0xF7,0x61,0x2C, + + 0x5D,0xBC,0x93,0x57,0x19,0xE5,0x13,0x4B,0xCC,0xD7,0x8E,0x5D,0x2E,0xDB,0xDF,0x86, + + 0x87,0x2F,0x1F,0xB4,0xBF,0x7A,0x09,0x8C,0x5A,0x16,0xA5,0x5F,0x9A,0xDC,0xF2,0xB7, + + 0x89,0x5E,0xCC,0xCD,0x99,0x7D,0xF1,0xA8,0x2E,0xF7,0xED,0x0E,0x5E,0xD3,0x8E,0x19, + + 0xF5,0xBD,0xF6,0x8C,0x3F,0x32,0xA1,0xD8,0x1F,0xFC,0xA0,0xFB,0xC6,0x72,0xD7,0xDB, + + 0x56,0xFF,0xFF,0x1D,0x4D,0x31,0xC1,0xF4,0x81,0x4F,0x77,0x9F,0x98,0xD2,0x04,0xDB, + + 0xB3,0x94,0x5F,0xBF,0xCC,0x3F,0x05,0x8D,0x97,0xF0,0x4F,0x9B,0x04,0x6F,0x4A,0x60, + + 0x25,0x33,0x1B,0xE4,0xB8,0x5D,0x4B,0x05,0xE5,0x61,0x59,0x02,0xF5,0x3F,0x70,0xA7, + + 0x66,0x50,0x9F,0x2E,0xE5,0xD0,0x6B,0xC8,0xCA,0x7C,0xA9,0xB2,0x28,0x3B,0xE1,0x27, + + 0xF1,0x8F,0xD9,0x83,0xBC,0x3C,0xE5,0xD8,0x2D,0x81,0x05,0x45,0x2B,0x97,0x3C,0x97, + + 0xAD,0x97,0x69,0xB6,0x31,0xE1,0xDE,0x49,0x13,0xCB,0x29,0x45,0x3E,0x02,0xA0,0x63, + + 0x98,0x5B,0x76,0xA4,0xBA,0x09,0x48,0x91,0x2A,0xA1,0x50,0x04,0x72,0x19,0xF8,0x0E, + + 0x01,0xC4,0xF2,0x4A,0x36,0xE5,0x1E,0x4A,0xAE,0xB4,0x2B,0x85,0xDB,0x68,0xD5,0x21, + + 0x79,0xC4,0xF0,0xA5,0x8A,0xDB,0x49,0x90,0xF6,0xAA,0xE6,0x94,0x52,0x6B,0xED,0xC1, + + 0x83,0x8F,0xE5,0x41,0x5F,0x96,0x63,0x71,0x74,0x6A,0x1D,0x8D,0xF3,0x9C,0x1A,0xEA, + + 0x78,0x34,0xB6,0xD4,0xE9,0xA7,0x35,0x39,0x34,0xDB,0xE8,0x5F,0x34,0x09,0xEA,0xA3, + + 0xFB,0xE5,0xB4,0x2F,0x71,0xB6,0x09,0x9A,0xB1,0x58,0xF0,0x23,0x7C,0x58,0x1E,0x50, + + 0x70,0x1B,0x17,0x70,0x3F,0x21,0x86,0x17,0x34,0xE9,0xCA,0x49,0x37,0xFB,0x94,0x88, + + 0xA7,0x56,0x13,0x6F,0x95,0xA0,0x1B,0x36,0x05,0x5A,0xFD,0x17,0x34,0xFA,0xF1,0xCE, + + 0x2A,0x84,0x78,0x5D,0x2A,0x45,0xE4,0x1A,0xCE,0xDA,0x72,0x96,0xE2,0x57,0x54,0x6F, + + 0x09,0xAC,0x12,0x56,0xF6,0x3C,0xEF,0x69,0x7F,0x5C,0x05,0x0C,0xF8,0xFD,0xA3,0x6F, + + 0x67,0x71,0xBA,0xC1,0x77,0xDF,0x3B,0x7F,0x06,0x2F,0xB3,0x92,0xDE,0xAF,0x50,0x25, + + 0x2C,0xEA,0x13,0x7B,0x3C,0xA9,0x45,0x4E,0xED,0x22,0x44,0x99,0xFB,0xE0,0xB3,0x8B, + + 0x9E,0x60,0xA2,0x14,0x3C,0xB8,0x6C,0xA6,0x4C,0x16,0xA2,0x93,0x72,0xB1,0x74,0x97, + + 0xCC,0x92,0xE4,0x96,0xD4,0x1E,0xBE,0x80,0x05,0x24,0xA5,0xC5,0x45,0x7B,0xD7,0xF0, + + 0x8E,0x1D,0xF1,0xB8,0xD8,0xF0,0x0B,0x96,0x8F,0xDD,0xE4,0xD5,0x57,0xDA,0x57,0xF3, + + 0xC8,0xFD,0xBC,0x13,0x9D,0xAC,0x43,0xB5,0x04,0x50,0xC5,0xD7,0xCE,0x06,0xA9,0xEF, + + 0x20,0xB5,0xCD,0xBC,0xA7,0xA4,0xD4,0x90,0x04,0xA8,0x4C,0xB9,0xD5,0x91,0x36,0xA3, + + 0x4F,0x74,0xB8,0x25,0xB3,0x38,0xCF,0xC7,0x9B,0xC4,0xF8,0x51,0x8A,0xEE,0x44,0xB0, + + 0xCA,0x99,0x75,0x37,0x73,0x17,0x0B,0xE4,0x47,0x69,0x4A,0x05,0xD2,0xB4,0x14,0xA0, + + 0x97,0xD8,0xBF,0x80,0x5C,0xD3,0x26,0xF3,0xE1,0xF7,0x7D,0xD3,0x08,0x2A,0x18,0x2B, + + 0xEE,0x99,0x9E,0x70,0x90,0xB5,0x9F,0x95,0xE8,0x77,0x20,0x2A,0x35,0x4C,0x66,0x42, + + 0xC4,0xFA,0x88,0xB7,0xB1,0xFB,0xA8,0x4B,0xCE,0x19,0x73,0x93,0x7B,0xD8,0x19,0x2B, + + 0x6E,0xBA,0x58,0x9C,0x88,0xFE,0x22,0xB4,0xD8,0x77,0x1A,0xD0,0x61,0x71,0x4D,0xBB, + + 0x44,0xD8,0x3F,0xB5,0xBB,0xFA,0x0D,0x8B,0xF5,0x74,0x9E,0x4F,0x02,0xF4,0x60,0xFF, + + 0xC7,0x7D,0xDE,0x31,0x1A,0x69,0x82,0x94,0xAF,0xC3,0x8E,0xC9,0x83,0xF3,0xEE,0xFB, + + 0x8D,0xDC,0x1D,0xE2,0xD4,0xF9,0x00,0xCF,0x92,0x51,0xDA,0xC8,0x5D,0xED,0xCB,0x59, + + 0xF2,0x94,0x37,0xDE,0x98,0x35,0x3D,0x09,0x7F,0xC7,0x67,0xCF,0xBE,0xBE,0x55,0x28, + + 0x97,0x30,0xD5,0x6F,0x76,0xFE,0x35,0xE6,0xFE,0x70,0x3D,0x5F,0xB7,0x9D,0x60,0x5F, + + 0xA3,0x0D,0xD4,0x43,0xDA,0x43,0x28,0x70,0x48,0x4F,0x6B,0xD4,0x17,0x91,0x28,0x11, + + 0x8C,0x09,0xC0,0x44,0x33,0x62,0x12,0x32,0xE2,0x5A,0xC2,0x06,0x2D,0x7E,0x73,0x04, + + 0x8C,0x6C,0xBF,0xA5,0x5A,0x61,0x71,0x65,0x40,0x4F,0xE8,0x43,0xF1,0xCB,0x89,0x12, + + 0x65,0x4F,0x0B,0x6E,0x1C,0xA5,0x9E,0x57,0x23,0x63,0x21,0xCE,0x5E,0xB5,0x38,0x44, + + 0xE2,0xA0,0xFA,0xBB,0x71,0xF2,0x30,0x62,0xC9,0x49,0x7F,0x0B,0x8F,0xB0,0x72,0xBF, + + 0x30,0x01,0xF0,0xB4,0x03,0xAE,0xBF,0x03,0x7B,0xC3,0x7B,0xE2,0x8F,0x83,0x39,0x68, + + 0x69,0x57,0x56,0xC1,0xBA,0xA8,0xAE,0xA6,0x2B,0x17,0x63,0x7A,0x3E,0x27,0xF1,0xAE, + + 0x3E,0x6B,0x25,0x68,0x95,0x66,0x59,0x31,0x8B,0x5C,0x87,0xE6,0xD7,0xCC,0x03,0x4E, + + 0x40,0x13,0x02,0xCC,0x00,0x29,0x90,0x5A,0xB3,0xB7,0x9A,0xFC,0xA1,0xBE,0x2E,0x2E, + + 0x2B,0x0B,0xE8,0x11,0x1A,0x38,0xDE,0x1C,0xA0,0x90,0xA2,0xC6,0xA0,0x07,0x97,0x6F, + + 0xA9,0x4A,0x53,0x31,0x61,0x44,0xD3,0xBC,0x28,0x06,0xEC,0xAF,0x49,0x3F,0x8C,0x9B, + + 0x54,0x04,0x4B,0x58,0xD7,0x23,0x43,0x3C,0xCF,0xE1,0xF8,0x7D,0x94,0x96,0xA5,0x88, + + 0x73,0x87,0x9E,0x3E,0xB9,0xDC,0x18,0x98,0x42,0x03,0xB0,0x68,0x7E,0xB8,0x52,0x3D, + + 0xD6,0x70,0x8C,0xAA,0x1D,0x56,0xA1,0x3F,0x81,0x77,0xBD,0x8D,0x89,0x2D,0xE6,0x64, + + 0x39,0x43,0x34,0x50,0x27,0x6C,0xC3,0x81,0x4A,0x03,0x30,0x72,0x04,0xC1,0xE4,0xDD, + + 0xC8,0x93,0x2E,0xD9,0xB1,0x9A,0x3B,0x2F,0x4C,0x40,0x4B,0x8E,0x3B,0x23,0x64,0x20, + + 0x7C,0x1F,0xCC,0x05,0xB0,0x90,0x44,0x87,0xC1,0xFF,0xCD,0xAA,0x76,0xC2,0x6C,0xD4, + + 0x66,0x9A,0x0D,0xFB,0x49,0x8E,0x98,0xEE,0xEC,0x33,0xDB,0x0D,0xD0,0xF1,0xED,0x85, + + 0x25,0x92,0x45,0xC0,0xFE,0x3A,0x41,0x9F,0xC2,0x49,0x3F,0xE5,0xA0,0x30,0x89,0x73, + + 0x23,0x5B,0xAD,0x84,0x0C,0x82,0xB6,0x34,0x72,0x6C,0xE5,0x37,0x68,0xD6,0x0B,0xBF, + + 0xAD,0xB2,0xA3,0xC0,0x59,0xA2,0x0C,0xF5,0x51,0x63,0x44,0xFB,0xF6,0xA0,0x37,0xE1, + + 0x13,0xBA,0x7A,0x25,0xDB,0x75,0x9F,0x82,0x88,0xCF,0x18,0x71,0x30,0x15,0x8E,0x01, + + 0xB4,0x9D,0x45,0xDB,0x56,0xC2,0xAD,0xE9,0x45,0x1A,0x71,0x87,0x4D,0x14,0xED,0x21, + + 0x5D,0xB4,0x93,0xE7,0xB7,0x7B,0x80,0xEC,0x18,0xAC,0xBD,0xB1,0xEC,0x78,0xCF,0x6A, + + 0xAA,0x50,0xF9,0x8F,0x92,0xC4,0x68,0x0D,0xBC,0x1B,0xCC,0xA4,0xDB,0x3A,0xBA,0x68, + + 0xD6,0x16,0xA7,0xB2,0x98,0x32,0xCA,0x4B,0x47,0xF4,0xFC,0x2C,0x78,0xEB,0x1F,0x79, + + 0xD7,0x15,0xB8,0xD2,0x9C,0x3C,0xBB,0xDA,0xC2,0xFC,0xD0,0x14,0x59,0x14,0x6F,0xDD, + + 0xA6,0x16,0x0F,0xBE,0x06,0x3D,0x4F,0x2A,0xCF,0xF4,0x5F,0x24,0x83,0xF6,0xD0,0x3B, + + 0xA6,0x11,0xA7,0xC2,0xEA,0x48,0xC5,0x14,0xD6,0x1E,0x6B,0x3C,0x36,0x7A,0x70,0xF0, + + 0x08,0x5D,0x69,0x4B,0xDA,0x92,0x46,0xCC,0x54,0xAD,0x56,0x3D,0x18,0x1D,0x52,0x22, + + 0xE2,0x0F,0xE0,0xE9,0x6E,0xF8,0x19,0xD7,0x03,0x64,0x87,0x75,0x59,0x78,0x49,0xEC, + + 0xF7,0x1B,0xA9,0x2C,0x79,0x7F,0x65,0x02,0x94,0xF8,0xA7,0xE6,0x7F,0xEB,0x18,0xB0, + + 0x08,0xE0,0x70,0x82,0x19,0xD0,0xBA,0xA6,0x4F,0x7E,0x70,0xBA,0x17,0xA2,0x60,0xEA, + + 0x80,0x83,0x7C,0x85,0xB4,0x0E,0x07,0x79,0xF8,0xA2,0xDA,0x33,0x54,0x93,0xCD,0x01, + + 0x8C,0xEE,0x5A,0x68,0x7F,0xE6,0x99,0x33,0xE0,0xFE,0xF6,0x00,0x59,0x7F,0x70,0x81, + + 0x60,0x8A,0x0D,0x68,0xFD,0xE7,0xD9,0x97,0x1C,0x3E,0xE0,0x3D,0xD3,0x51,0x5A,0xA9, + + 0xFE,0x7E,0x20,0x86,0x7E,0xA2,0xD3,0xAB,0x31,0x18,0x91,0x7C,0x86,0x50,0x20,0xFE, + + 0xFE,0x21,0x40,0xB0,0x33,0x01,0x42,0x89,0x41,0x6F,0x10,0xFC,0x73,0x31,0x5E,0x84, + + 0x4C,0x8F,0x4B,0x81,0x37,0xBD,0xAE,0xB7,0xF9,0x36,0xD6,0x96,0x4A,0xF4,0x77,0xB1, + + 0x67,0x78,0xBF,0xC1,0x5F,0x64,0xCA,0x9B,0x42,0x8A,0x4B,0x68,0x3B,0x4C,0x3F,0xAA, + + 0x10,0x8A,0x5D,0x70,0x76,0xCC,0x1D,0x51,0x75,0xC3,0x18,0xEE,0x1E,0x15,0x92,0x98, + + 0x2F,0xB9,0x22,0x6C,0x90,0x0F,0xB2,0x65,0xB4,0x8B,0xFD,0x19,0xD0,0x74,0xCB,0x13, + + 0xBF,0x68,0x63,0x4B,0x21,0xE8,0xB3,0x08,0xC3,0x88,0x73,0xB3,0xDD,0xA8,0x53,0xF3, + + 0x97,0xC6,0xFF,0x61,0x57,0xA8,0x3D,0x26,0x6C,0x64,0xD9,0x3A,0xDC,0x0B,0xD1,0xA8, + + 0xE7,0x36,0x04,0x3C,0xF5,0x0A,0x8D,0x1B,0x55,0xC5,0xC4,0x6B,0x35,0x69,0x14,0x72, + + 0xE6,0xE9,0x4A,0x60,0x93,0x79,0x37,0x9A,0x1B,0x60,0x18,0x8D,0x91,0x46,0x3D,0x4C, + + 0x8E,0x7F,0xBD,0xDD,0x9A,0x5B,0xF3,0x2D,0xD4,0x63,0xF7,0x4B,0x3F,0x41,0xB8,0xA8, + + 0xE3,0x7A,0x08,0x40,0x41,0x04,0x30,0x9B,0xDB,0x32,0x9D,0x77,0x34,0x69,0x2E,0x83, + + 0x87,0x96,0x89,0xB5,0x95,0x30,0xE4,0xD1,0x4A,0x05,0xCC,0x57,0x07,0x10,0x6C,0x70, + + 0xA7,0x99,0xAD,0x56,0x31,0x94,0x90,0x37,0xB0,0xB3,0x2B,0x5C,0x80,0xF5,0x29,0x84, + + 0x05,0x1A,0xDD,0xE5,0x3B,0x34,0xE5,0x4B,0xE0,0x0E,0x95,0x23,0x97,0x77,0xE9,0xF1, + + 0xE4,0xD3,0x50,0xE5,0x16,0x4C,0x54,0x58,0x0E,0x70,0xBB,0x47,0x15,0x02,0x5C,0xDB, + + 0xA6,0x98,0x9A,0x58,0xDD,0x42,0xAF,0xCD,0x60,0x7E,0x50,0x84,0x89,0x78,0x93,0xB9, + + 0xA8,0x63,0x8F,0x88,0xC6,0x69,0xBC,0x4A,0x70,0x97,0xF8,0x74,0x72,0x6F,0x05,0xC1, + + 0x25,0x9B,0xBB,0x5C,0xA6,0x19,0xC6,0x67,0x8B,0xF8,0x31,0x62,0xF8,0x7C,0x65,0xC2, + + 0x94,0x1D,0x42,0xAC,0x6A,0xF6,0xAC,0xA5,0xE1,0x0F,0x85,0x88,0x36,0x95,0x5E,0xE8, + + 0x6D,0x18,0xFF,0x38,0x99,0x67,0x95,0x1A,0x6A,0xB0,0xCF,0xDC,0xDB,0xBA,0x56,0xF8, + + 0x6C,0x91,0x2E,0xBD,0x82,0x32,0x40,0xBD,0xCC,0x76,0x39,0x9D,0x5E,0xB8,0x5F,0xE9, + + 0xED,0x9B,0x18,0xC8,0x6A,0xB2,0xB2,0x2F,0xE9,0xA7,0xF0,0x16,0x1D,0xF5,0x57,0x19, + + 0xA8,0xBF,0x0A,0xA2,0x0E,0xF6,0x6F,0x9C,0x4C,0x74,0xE6,0xBD,0x58,0x50,0x3C,0xCB, + + 0x89,0xA1,0x45,0x58,0xE2,0x5A,0xEB,0x6E,0x4A,0x41,0xBC,0xEB,0xD2,0xF3,0x54,0x6B, + + 0x17,0x32,0x8C,0xDA,0x1B,0x12,0xAD,0x5B,0x4F,0x4F,0xC6,0x2E,0x33,0xFB,0x71,0xE7, + + 0x45,0xCF,0xDD,0x3C,0x74,0x15,0xB7,0x2A,0x6E,0x9C,0xD0,0xE9,0x2E,0x9A,0x7A,0xD6, + + 0x2F,0xCB,0x8C,0x81,0x0A,0x63,0xFB,0x7F,0xBE,0x9E,0x77,0x9B,0x5C,0xBE,0x3E,0x38, + + 0x68,0xD1,0x7F,0xFC,0x10,0x9B,0x4A,0x21,0xE3,0x46,0xF6,0x1C,0xB9,0x11,0x76,0x16, + + 0xE0,0x82,0x24,0x67,0x7C,0x57,0x41,0x10,0xE4,0xBE,0xD9,0x52,0x30,0x65,0x17,0x63, + + 0xE0,0x9B,0x01,0x81,0x94,0x70,0x41,0x3D,0x63,0x03,0x8B,0x27,0x3B,0x6D,0x27,0xE2, + + 0x0D,0x42,0xF6,0x66,0xF4,0x75,0x0F,0x40,0x83,0xB7,0xFF,0xD7,0xD0,0x33,0x60,0xB3, + + 0x86,0x89,0xF8,0xBE,0xBE,0x29,0xA9,0x68,0xE7,0x3B,0xCE,0x49,0x71,0x7C,0x1C,0xBD, + + 0x0B,0x5E,0xDE,0x78,0xAC,0x37,0x10,0xE0,0x70,0x48,0x18,0x50,0xC8,0x6D,0x13,0x6A, + + 0x84,0x55,0xBE,0xAD,0xCB,0x6B,0xFD,0xFA,0x77,0xD0,0xE6,0x59,0x2E,0xD7,0x67,0xB8, + + 0x57,0x45,0x71,0xE4,0xAB,0x78,0xE0,0x97,0xD3,0x3A,0x0E,0x4E,0xA7,0x92,0x5B,0x8F, + + 0xED,0x89,0xF9,0x4B,0xE1,0xDE,0x6A,0x3A,0x6C,0x53,0xAC,0x01,0xFF,0x78,0x58,0x4B, + + 0xE2,0x6D,0xB1,0x6C,0x99,0x3F,0x0E,0x08,0x7A,0x92,0x0C,0x14,0x11,0x88,0x73,0xFA, + + 0x0C,0x87,0x38,0x7D,0x18,0x35,0x7C,0x4F,0xE9,0x0A,0xAD,0x15,0x7F,0xCE,0x9B,0x6A, + + 0xF1,0xAA,0xC3,0x09,0x78,0x30,0xA3,0xC7,0xD9,0x06,0xBB,0xBA,0x54,0xC6,0x13,0x91, + + 0x0C,0x4C,0x2E,0x37,0x84,0xB1,0xAA,0x80,0x29,0xD1,0xC5,0xE8,0x36,0x19,0x2D,0x26, + + 0xC1,0x02,0x07,0x61,0x1D,0x0C,0x03,0xB2,0xB6,0x02,0x1A,0x5D,0xCB,0xE6,0x27,0xB2, + + 0x05,0xF3,0x22,0x0D,0xC6,0xA5,0xAB,0x61,0x33,0x01,0x89,0xA0,0xB2,0xBF,0x43,0x50, + + 0x8D,0x1C,0xEA,0xAD,0x64,0x20,0x7B,0x64,0x46,0x54,0x24,0x9F,0x27,0xDE,0x56,0xD6, + + 0xCB,0x74,0x7F,0xFB,0x50,0x32,0x84,0x58,0x60,0xEB,0xAA,0xFD,0x18,0x7D,0x2E,0x66, + + 0xC8,0xA0,0x77,0xAF,0x58,0xAA,0xF0,0xC3,0x0C,0xA7,0xA6,0x04,0xC9,0x33,0x95,0x70, + + 0x03,0xE2,0x7A,0xFB,0xD2,0x45,0x17,0x25,0xE4,0x00,0x87,0x85,0x1B,0x36,0x53,0x73, + + 0xFD,0x97,0x8D,0x78,0x89,0x98,0xA6,0xC1,0x61,0x4C,0xCC,0x74,0x91,0x7B,0x3A,0xF5, + + 0xC9,0x05,0x04,0x64,0x32,0x94,0xFB,0x06,0x72,0xA9,0x44,0x0D,0x11,0xA5,0xB4,0x38, + + 0xB0,0x5A,0xAE,0xC9,0x30,0x75,0xCA,0x74,0x4B,0xD1,0xFD,0x96,0x31,0x7A,0x1C,0x31, + + 0x05,0x06,0x53,0xB6,0xDE,0x5A,0xAD,0xC5,0x03,0xF9,0xC3,0xC8,0xF4,0x57,0x14,0xB3, + + 0x04,0x07,0xC1,0x9E,0x97,0xC3,0x65,0x36,0x21,0x77,0xDB,0xC9,0x73,0x52,0x96,0x7B, + + 0xA4,0x15,0x8C,0xA1,0x3E,0x80,0x28,0xDC,0x09,0x5C,0xE8,0xAA,0x99,0xFB,0x30,0xC1, + + 0x41,0x14,0x1D,0x6F,0x4D,0xB4,0xFF,0xDE,0xDE,0x49,0xA0,0xE4,0x7F,0x6A,0xFC,0xAE, + + 0x09,0xE5,0x9D,0xFE,0xD1,0x9B,0x76,0x69,0xE2,0x41,0xA2,0x29,0xCE,0x59,0x9F,0x68, + + 0x0A,0x5B,0xD9,0xA4,0x52,0x8A,0xA7,0x56,0x95,0x06,0x9D,0xDF,0x0A,0x1E,0xBE,0x37, + + 0x2C,0x54,0x53,0xD7,0x4A,0xB1,0x5E,0x09,0x96,0xBD,0xD0,0xD5,0x53,0xB6,0xC9,0xBA, + + 0xD8,0x78,0x8C,0x23,0xD2,0x8C,0x4F,0x7C,0x43,0x3A,0xDA,0xBB,0xFA,0x73,0xE8,0xB6, + + 0xAC,0xBE,0xB9,0xF4,0x53,0x04,0x97,0xB8,0x32,0xAA,0x47,0x2A,0xF8,0x8B,0x77,0x22, + + 0x24,0xB9,0x63,0x42,0xB8,0xB4,0x67,0x0A,0xD3,0x3A,0x7C,0x4C,0x27,0xBC,0x18,0x33, + + 0xA5,0x01,0x4B,0xE0,0x04,0xEF,0xCF,0xCA,0xDA,0x8D,0x7D,0xB5,0x69,0x6B,0x7A,0x41, + + 0xEE,0xE5,0xD6,0x2A,0x7E,0xFB,0x94,0x42,0xC5,0x47,0xD9,0xF6,0x1D,0xFA,0x71,0xF0, + + 0x00,0x0F,0x31,0x75,0x7F,0x13,0xA6,0xAB,0x61,0x11,0x91,0xCD,0xBD,0xB8,0xB9,0xE3, + + 0x22,0x22,0x89,0xE4,0x8A,0x0C,0x19,0xF3,0xC3,0xD8,0x4D,0x44,0xE5,0xAC,0x2F,0x3C, + + 0xDA,0x8B,0x20,0x67,0xD6,0xA9,0x4C,0x04,0x9C,0xD6,0x30,0xB2,0x44,0x49,0x63,0x21, + + 0x56,0xE9,0x44,0xD2,0x3F,0x21,0x43,0x94,0x57,0x78,0x7A,0x05,0x23,0x4C,0xA1,0x47, + + 0x1F,0x26,0xA3,0xA5,0xCA,0xA2,0xC9,0xF9,0xC5,0x66,0xE6,0x16,0xA6,0xEF,0x0B,0x4E, + + 0x86,0x03,0xD1,0x90,0x55,0x87,0x81,0x6E,0x39,0x17,0xEA,0x97,0xD9,0x6C,0xB7,0xF9, + + 0x88,0x05,0x34,0x7D,0x70,0xC4,0x9E,0x4C,0xB7,0xD3,0x22,0x5C,0xB7,0x70,0xBA,0xEA, + + 0xFC,0x28,0x94,0x22,0x75,0xA4,0x82,0xFD,0x8F,0x69,0x3B,0x2A,0x3E,0xE1,0x71,0x58, + + 0x67,0xEE,0xC5,0x6E,0x9F,0x63,0xD8,0x4D,0xB4,0x85,0x95,0x77,0x85,0xE9,0xBC,0xE8, + + 0x09,0x06,0x54,0x6C,0xE5,0xC8,0x33,0x4F,0x48,0x3A,0xAD,0x66,0x36,0x53,0xF2,0xB9, + + 0x82,0x81,0xEA,0x5F,0xE2,0x4D,0x46,0xE8,0xCE,0xC6,0xF6,0x92,0x5E,0xF9,0xAA,0x1F, + + 0x82,0xCC,0xFE,0x4C,0xBE,0x2A,0x23,0x8A,0xEA,0x32,0x56,0xDB,0x8A,0x8E,0x18,0x6C, + + 0x2F,0x31,0x23,0xC2,0xDF,0xEC,0x4B,0x4B,0x2F,0x7E,0x66,0x67,0x5E,0x4E,0x51,0xB3, + + 0x40,0xC0,0x6B,0x4E,0x63,0x4E,0x7A,0x1D,0xFC,0xC2,0x50,0xB5,0x64,0xAD,0x1A,0xDA, + + 0xC4,0x3F,0x48,0xF5,0x00,0x16,0xE7,0xE5,0x05,0xD4,0x8C,0xE1,0xAA,0x6D,0xBC,0x61, + + 0xA1,0x1C,0x8C,0x7C,0xDC,0x80,0x65,0xF5,0xC0,0x2E,0xB7,0x32,0x47,0x71,0x85,0x90, + + 0x07,0xF6,0x68,0xF4,0xA3,0x3B,0x57,0xA1,0xE7,0x90,0x56,0x67,0xE0,0x5F,0x7F,0xD9, + + 0x4E,0xF7,0xB7,0x95,0x27,0xBB,0x64,0x6C,0x40,0x22,0x06,0x55,0x59,0x0E,0x75,0xB8, + + 0xEC,0x75,0xBE,0x0B,0x5E,0x05,0x4C,0x11,0x52,0x61,0xD3,0xE0,0xA6,0x90,0x52,0xE7, + + 0x80,0x85,0xF2,0xFB,0x14,0x3C,0xA9,0xAF,0x86,0x2A,0x2A,0x71,0x8B,0xB1,0x6D,0x56, + + 0x95,0x1D,0x25,0xE6,0x26,0xBB,0x64,0xDC,0x8A,0x94,0x35,0x52,0x10,0xB4,0x53,0xFB, + + 0x00,0x8C,0xD3,0xEE,0xF7,0x18,0xC2,0xB4,0x2D,0xED,0x4E,0xF0,0xF1,0x14,0xB6,0x62, + + 0x7C,0xD5,0x23,0x9D,0x04,0xE2,0xCE,0xCC,0xE3,0x5E,0xCE,0xDD,0x25,0x59,0x56,0xBD, + + 0xD0,0x96,0x5A,0xED,0x51,0xF6,0xA9,0x9E,0x5E,0x02,0x1E,0xCC,0x1F,0xCC,0xD8,0x83, + + 0x09,0x66,0x81,0xA3,0xA3,0xA1,0xF4,0xEB,0x94,0x96,0x8F,0x9F,0xDD,0x55,0xBF,0x19, + + 0x8F,0x8B,0x43,0x77,0xD2,0xF6,0x87,0x45,0xFD,0x96,0x7F,0x17,0xF6,0x7A,0x88,0xAC, + + 0x3E,0xD3,0x75,0xBD,0x4A,0xD0,0x3E,0x5F,0x0D,0xA6,0xF8,0x1F,0xE2,0xDE,0x2F,0xA5, + + 0x88,0x99,0xB4,0x13,0x57,0x6C,0x46,0x8B,0x03,0xD6,0x81,0x7A,0x11,0x8C,0x44,0xFE, + + 0x76,0x8F,0x81,0x06,0xBD,0xA4,0xE0,0x6F,0xC6,0xCA,0x1F,0x65,0xDC,0x28,0x3F,0x33, + + 0xCC,0xD2,0x2F,0xFE,0x2F,0xB2,0x6A,0x7F,0xC7,0xB8,0xA1,0xF0,0xB1,0xB1,0x61,0xA0, + + 0xD6,0xBF,0x97,0x80,0x38,0x56,0x6D,0xD0,0x96,0x71,0x6F,0xA0,0x2E,0x6D,0xA8,0x2E, + + 0x8D,0x43,0x0E,0x4A,0x9C,0x43,0x00,0xA9,0x47,0x00,0xB8,0x94,0x57,0x72,0xC1,0xB4, + + 0x66,0xF7,0x7A,0x22,0x31,0x39,0xD1,0x00,0x03,0x4F,0x51,0xAC,0x38,0x64,0xDF,0x96, + + 0x55,0xC6,0x22,0x90,0x02,0x1C,0x82,0x53,0xE2,0xA1,0xC5,0x12,0x38,0x12,0xD0,0x13, + + 0xA3,0x9F,0x05,0x22,0x90,0x88,0x71,0x02,0xBD,0xCB,0x81,0xE4,0xF3,0x62,0x9B,0xAE, + + 0x05,0x44,0x70,0xAB,0x15,0x2F,0x83,0x70,0xD2,0xB8,0xBC,0xF0,0x61,0x27,0x41,0x7C, + + 0x7D,0x9B,0xB9,0xA7,0xA1,0x04,0x49,0xF1,0xA1,0x66,0x81,0x6C,0x71,0x7D,0x8A,0xD5, + + 0x88,0x78,0x2D,0xBD,0x8F,0xDA,0x70,0x79,0x43,0xE7,0xE1,0xF7,0xF1,0x97,0xA5,0x3F, + + 0xE3,0xAD,0xFF,0xFC,0x1F,0x99,0x3D,0x43,0x91,0xBD,0xEA,0x0B,0xB1,0xF9,0xAF,0x1D, + + 0x8E,0x1F,0xF1,0xEC,0xDF,0x98,0xB6,0x47,0x83,0x18,0x5A,0xD1,0x9D,0x63,0xC3,0xBC, + + 0xD9,0xA1,0x43,0x29,0xB0,0x27,0x85,0xAD,0xB2,0x9D,0xEB,0xA9,0x8D,0xAC,0x5B,0x87, + + 0x72,0xAF,0xF5,0x1B,0x78,0xA8,0xA0,0xAA,0xF1,0x41,0x1B,0x7B,0xE1,0x6D,0x6D,0x37, + + 0xD3,0x90,0x3A,0x68,0xE5,0xA1,0xFE,0xCD,0x9F,0x2F,0xAA,0xEE,0xDA,0xD5,0xBE,0x16, + + 0xFE,0x51,0x14,0x1B,0xBE,0xDB,0xCA,0x91,0x03,0x5C,0x36,0xEE,0x57,0x65,0xF8,0x13, + + 0x8C,0x2E,0xA1,0x4D,0x6D,0x35,0xF8,0xA3,0x71,0x0C,0xEB,0xBD,0x86,0x91,0xE6,0x26, + + 0x16,0x9A,0x70,0x2D,0x1B,0x80,0x7B,0xDF,0x83,0xAE,0x5B,0x80,0xD7,0x9F,0x7A,0x29, + + 0xC9,0x03,0x3D,0x43,0xEE,0x38,0x16,0x42,0x89,0xB1,0x39,0xEA,0x8D,0x2C,0x32,0x25, + + 0x4B,0x86,0x1C,0x8B,0x0D,0x73,0x09,0x52,0xCD,0xFC,0x5C,0x90,0x22,0xAD,0x53,0x3A, + + 0x4B,0x01,0x05,0x42,0x94,0x5E,0xD5,0x80,0x02,0xFF,0x2C,0x21,0xD8,0x27,0x73,0x24, + + 0x5D,0x40,0xC5,0x12,0x82,0x43,0x8C,0x53,0xA9,0xB2,0x31,0x30,0x24,0x11,0xFC,0xA0, + + 0x3D,0x9F,0x68,0xB7,0x2D,0xC2,0xE0,0x82,0x91,0xDF,0x2B,0x0C,0x64,0x39,0x58,0xDA, + + 0x82,0x9A,0x37,0xF0,0xBE,0x98,0x66,0x40,0xA6,0xFA,0xA4,0x70,0x41,0x87,0x88,0xF0, + + 0xCE,0x54,0x3A,0xB6,0xA5,0xE0,0xC3,0xD8,0x09,0x12,0x72,0x07,0x32,0xDB,0x15,0x11, + + 0x48,0x06,0x00,0x46,0xA0,0xBC,0xF9,0x8B,0x40,0xA3,0xE5,0x0F,0x5F,0x7A,0xB5,0x21, + + 0xD0,0x0B,0x39,0x6A,0xF0,0x49,0x32,0xC0,0x4C,0xAC,0xFF,0x47,0x87,0xF3,0xB9,0xBC, + + 0x16,0xE9,0xD7,0xB8,0x9C,0x98,0x40,0x5A,0x6D,0xA4,0xE9,0xDE,0x0A,0x79,0x7C,0x4B, + + 0x2B,0x5C,0x94,0x2D,0xE0,0x38,0x00,0xC6,0xCB,0xDB,0x31,0x80,0xFE,0x3B,0x50,0x66, + + 0xD6,0x61,0x1A,0x6E,0xC9,0x38,0xDF,0x98,0x11,0x19,0x08,0x42,0x08,0xA8,0x78,0xE0, + + 0xA7,0xBA,0xE6,0x26,0x53,0x66,0xF6,0xF6,0xE6,0x39,0xA9,0xCB,0xDB,0xA3,0xD8,0xA9, + + 0x1B,0x14,0xAC,0xDC,0xC8,0x51,0x25,0x08,0xD2,0xEC,0x0E,0xAC,0x7D,0xFD,0x0A,0x09, + + 0xE7,0xB3,0xA6,0xE9,0x41,0xB3,0xE3,0x8B,0x82,0x53,0x63,0x8F,0x05,0x78,0x18,0x29, + + 0x37,0xBE,0x70,0x46,0x4A,0xB6,0x21,0xFF,0x0A,0xDC,0xE8,0xF9,0xB0,0xD6,0xD7,0xAE, + + 0xCC,0x57,0x8D,0xF5,0x98,0xAD,0xB2,0x3C,0x7C,0x34,0x90,0xDF,0xF5,0xE1,0x0E,0xA8, + + 0x6B,0xC3,0x57,0x7D,0x9A,0x57,0x4D,0x2F,0x82,0x6C,0x78,0xE2,0x10,0x1A,0x74,0x10, + + 0x7E,0x91,0x58,0x7D,0xF4,0xC2,0xA0,0x28,0xF4,0xF2,0x8F,0x2B,0xAB,0xA2,0xFF,0x3E, + + 0xEE,0xF7,0xA1,0x1E,0x20,0x22,0x28,0xC1,0xE4,0x82,0x39,0xB3,0x92,0xA2,0x32,0x79, + + 0x6C,0x51,0x98,0xCE,0xB3,0x2D,0x5C,0xD2,0x62,0x1F,0x77,0xE4,0x74,0x96,0x6C,0xF5, + + 0xFA,0xF4,0x28,0x46,0xAD,0xBE,0xD2,0x47,0x24,0xC1,0x40,0x66,0xF0,0xFE,0x33,0x7C, + + 0xEC,0xC4,0xC1,0xD4,0x35,0xE7,0x51,0x9E,0x42,0xC0,0x4E,0x85,0xE5,0xB4,0x96,0x2D, + + 0xB1,0x58,0x53,0x31,0x64,0xB7,0x01,0x9B,0xD5,0x8A,0x99,0x01,0x20,0x68,0xE0,0xCC, + + 0x9E,0x8B,0x26,0xF0,0xED,0xC6,0x68,0xE7,0x24,0x29,0x72,0xFF,0xE7,0x33,0x3C,0xA5, + + 0xE6,0xDA,0xB8,0x1B,0xEA,0x34,0x2B,0xD8,0x2D,0x18,0xA6,0x4C,0xA6,0xA9,0xC0,0xF0, + + 0x65,0xD9,0x40,0xCF,0xC8,0x97,0xF3,0x0A,0x5C,0x67,0x9A,0xD2,0x61,0x9F,0x15,0xB2, + + 0xE7,0x5C,0x47,0x81,0x9C,0x4B,0xFB,0x1A,0x5D,0xC6,0xF5,0x01,0x40,0x56,0xF2,0x38, + + 0xE5,0x6D,0x5A,0xB5,0x0E,0xE1,0x12,0x39,0xFB,0xC3,0xEA,0x63,0x58,0xFF,0x27,0x9A, + + 0x62,0x06,0x7A,0xB6,0x78,0xE0,0x18,0x6F,0x4C,0xA5,0x82,0x6C,0x6C,0xBF,0x5D,0x7E, + + 0x03,0x28,0x18,0x47,0x3B,0x51,0x2C,0x6A,0x37,0xA2,0xD2,0x90,0x2B,0x1A,0xCE,0x6A, + + 0xE3,0x90,0x10,0x57,0x3A,0x50,0xDC,0x7D,0x1B,0xAB,0x03,0x97,0xFF,0xA2,0xFF,0xAD, + + 0x22,0x3A,0x26,0x92,0xC8,0xC1,0xA4,0x7A,0xB1,0xBC,0x4F,0x22,0x50,0x92,0x12,0xA7, + + 0xA8,0x37,0xF5,0x03,0xDC,0xC0,0x41,0x59,0x06,0xB9,0xEE,0xA9,0x1F,0xAC,0x96,0xF1, + + 0x4F,0x73,0xDB,0xAA,0x68,0x23,0xF1,0xFD,0xEA,0xCC,0x75,0x66,0x4B,0x26,0x60,0x53, + + 0x88,0x18,0x55,0x15,0x97,0x83,0x2A,0x37,0xC1,0x11,0x7D,0x96,0x67,0x2C,0x75,0x28, + + 0x83,0x9D,0xC4,0x2C,0xC3,0x3D,0x5A,0x11,0xEA,0xD9,0xCE,0x1C,0x8D,0x8F,0xFA,0x56, + + 0x03,0xAB,0x6C,0xE8,0x5B,0x40,0x07,0x02,0xD2,0x64,0x85,0x72,0x7B,0x95,0x33,0xF8, + + 0x96,0x63,0xC5,0x4D,0x92,0x0D,0x88,0xA4,0x17,0xA0,0xB5,0x0B,0x9A,0xC9,0x65,0xEB, + + 0x5F,0x76,0xFC,0x2F,0xB7,0xF7,0x03,0xF5,0x06,0x54,0x20,0xCE,0xC0,0x80,0x83,0xBB, + + 0x40,0x87,0xDE,0x66,0x26,0x15,0x0E,0x50,0x0F,0x3C,0x02,0xCC,0x4F,0x18,0xD1,0x69, + + 0x15,0x36,0x29,0x7C,0x0E,0x29,0x6C,0xF1,0xED,0x78,0x7A,0x74,0xC6,0x06,0x9F,0xEB, + + 0xE3,0x11,0xB4,0x69,0x3E,0xB9,0x20,0x58,0x68,0x57,0x1C,0xE8,0xF2,0x26,0xBE,0x68, + + 0x9D,0x16,0x17,0x61,0xAD,0xF6,0x61,0x59,0xE9,0x76,0xE5,0x29,0xC1,0xB9,0xD1,0xE2, + + 0x28,0x7D,0x66,0x42,0x0D,0xE1,0x58,0x19,0xE2,0x41,0xAB,0xE6,0x4D,0xFC,0xA4,0x52, + + 0x4C,0xE7,0xD0,0x13,0x98,0xFC,0xE9,0x05,0x8E,0x0E,0xAE,0x6A,0x9E,0xF2,0xD2,0xF4, + + 0x9E,0xDC,0xD9,0x03,0x19,0xAE,0x0F,0xF2,0x8D,0xBE,0x37,0xBB,0x47,0xF8,0x79,0xF3, + + 0xA9,0xBE,0x2F,0x77,0xC4,0xFD,0x84,0xF9,0x01,0xC4,0x4B,0x80,0x5C,0xBE,0x5A,0x80, + + 0x68,0x11,0xE9,0xEF,0xAF,0x8B,0x6E,0xB6,0x46,0xA3,0xBD,0x5B,0xC9,0x5D,0xBD,0xE3, + + 0x8D,0x0C,0x9C,0x9B,0xE6,0x44,0x3E,0x70,0x9F,0xEE,0x67,0x4E,0x33,0xAD,0x7F,0x07, + + 0x61,0x81,0xF9,0x01,0x61,0x60,0xC9,0x32,0xBE,0x94,0xCA,0x25,0xB0,0x1F,0x99,0xE2, + + 0x05,0xAE,0xB1,0xFD,0xDD,0xFF,0x7E,0xC0,0x13,0x03,0x62,0x2A,0x55,0xCC,0x20,0x42, + + 0x31,0x09,0xF8,0xBA,0xBE,0x29,0xFC,0x22,0xC1,0x06,0xFF,0x1B,0x8B,0xE9,0xB7,0xD4, + + 0x63,0x2F,0xAE,0x7D,0x37,0x58,0xBB,0x83,0x9D,0xEE,0xCD,0xB4,0x7B,0xEE,0xBE,0x43, + + 0x86,0x8B,0x6D,0xD6,0xA6,0xFB,0x87,0x6B,0x23,0xE9,0x2E,0x1A,0x5F,0xC0,0x19,0x49, + + 0xCB,0x45,0x36,0xF0,0x59,0x2A,0x3E,0x79,0x28,0xD1,0x99,0x48,0xD5,0x46,0x7A,0xB8, + + 0xB4,0xA7,0x2E,0x89,0xCD,0x4A,0x6C,0x1E,0xA3,0xAD,0x36,0x4E,0xD5,0x0A,0x32,0x3C, + + 0xC1,0x8A,0x37,0x43,0x1F,0x68,0x28,0x7E,0xDB,0x25,0xE5,0x46,0x77,0xF6,0xA7,0x6B, + + 0x7F,0x6F,0xEA,0xE6,0x63,0xD6,0x4D,0x1A,0xD8,0xE5,0xEC,0x0A,0x79,0xDB,0xAB,0x0A, + + 0xA7,0x6F,0xED,0xE6,0x20,0x69,0x25,0x7D,0x03,0xE3,0x3C,0x3B,0x0D,0x0F,0x00,0xDD, + + 0x8F,0x9C,0x39,0x37,0x66,0xD3,0x2C,0x5E,0xA1,0xA9,0xF3,0x0E,0xAD,0xD5,0x5D,0x55, + + 0x38,0x5D,0xF4,0xFD,0xD1,0x8E,0x68,0x3E,0xD9,0xF0,0x49,0xF8,0x73,0x79,0x83,0x41, + + 0x8A,0x4C,0xF9,0xF1,0xBE,0x40,0x0D,0x5A,0xDE,0xE1,0xCB,0xE8,0xB9,0x14,0xF3,0xEB, + + 0x83,0x63,0xF5,0xFD,0x51,0xAC,0xF0,0x03,0x1E,0x54,0x81,0x82,0x78,0xE4,0x50,0x9F, + + 0x06,0x51,0x97,0xB4,0x70,0xCF,0x14,0x62,0xE3,0x16,0xCD,0xA0,0xA5,0x1C,0x9F,0x6F, + + 0xC8,0x60,0xD2,0xC5,0x31,0x95,0xA8,0x34,0x45,0xCB,0xE1,0x99,0x8A,0xAC,0xA9,0xF2, + + 0xD0,0xB4,0xBF,0x34,0x8C,0xED,0xA2,0x85,0xE6,0x73,0x51,0xFB,0xFE,0x6C,0x6B,0xA8, + + 0x56,0x52,0xDD,0xC1,0x0D,0xE2,0xB6,0xF6,0xEF,0x8F,0x4C,0xD5,0xFD,0x88,0x16,0xA2, + + 0x43,0x41,0xC0,0xF4,0xCD,0x72,0xE5,0x5E,0xDE,0xA3,0x59,0x41,0x56,0x1A,0x93,0xD8, + + 0x7D,0x9E,0xF2,0xA8,0xBE,0x93,0xE5,0xAE,0xE0,0x5B,0xF4,0x36,0xA7,0xAA,0x5D,0xC5, + + 0x2F,0x57,0x97,0xC1,0xFB,0xFE,0xFA,0x8E,0x3F,0x8A,0x95,0xDA,0xFA,0x1A,0x1C,0xEC, + + 0x48,0x53,0x91,0x15,0xAB,0xEC,0xBD,0xCE,0xC7,0xF3,0x7A,0x0A,0x98,0x08,0x38,0xA4, + + 0x40,0x15,0x37,0xB5,0xC0,0xA9,0xD2,0x62,0xD3,0x07,0x69,0x88,0xA5,0xC5,0xF5,0xBC, + + 0xC0,0xB0,0xC2,0xEF,0x1B,0x92,0xDE,0x99,0x91,0x1B,0x04,0x38,0x76,0x7F,0xF8,0xFA, + + 0x90,0x79,0xB4,0xA0,0xBE,0xA2,0x49,0x4B,0xEC,0xC7,0x38,0x89,0xFE,0x83,0xF2,0x75, + + 0xA9,0xA0,0xF7,0x99,0x59,0xEE,0x8F,0x61,0x3C,0x37,0x5F,0x69,0xB9,0xF6,0x7C,0x78, + + 0xAA,0xB3,0xE8,0x31,0xCC,0x7E,0x8B,0xEE,0xA2,0x07,0x83,0x4C,0x8D,0x1C,0x1E,0xE5, + + 0xC0,0x59,0x9E,0xD4,0x73,0xB0,0xCE,0x8B,0x07,0xFC,0x23,0x78,0x10,0x02,0xE3,0xAB, + + 0x5D,0x95,0x4A,0xBD,0x3A,0x2E,0xF3,0x18,0x49,0x1E,0x89,0x02,0xBA,0xD5,0x75,0x69, + + 0x2B,0xB0,0x30,0x59,0xF8,0x99,0x67,0xC9,0x8B,0xF0,0x99,0x0C,0x44,0xEF,0x7E,0xE0, + + 0x00,0x2D,0x30,0x5D,0x30,0x0B,0x4E,0x39,0xAD,0xE8,0x04,0x01,0xF5,0x8C,0x10,0xEC, + + 0xA9,0x8C,0x80,0xE7,0x6D,0x14,0x66,0x3D,0x49,0x8F,0x47,0x48,0x27,0x5D,0x30,0x87, + + 0xCC,0x72,0x34,0x04,0xFF,0x33,0x53,0x23,0x2F,0x56,0x75,0xDB,0xD4,0x53,0x3F,0xB7, + + 0x6E,0xC0,0xF7,0x2B,0x24,0x0E,0x58,0x93,0x13,0x7C,0x06,0x6C,0x26,0x68,0xA0,0x96, + + 0x46,0x09,0x70,0xE6,0x10,0x25,0xF2,0x25,0x68,0x18,0x63,0x57,0x66,0xA6,0x99,0xD0, + + 0x87,0xEC,0xC6,0xAB,0xE1,0xBE,0x06,0x69,0x93,0x51,0x80,0x6B,0xD7,0xDB,0x38,0x4F, + + 0x21,0x82,0xF1,0x4F,0xBE,0x7D,0xA5,0x3D,0x55,0xF9,0xE5,0x6D,0x77,0x64,0x51,0xF3, + + 0x6E,0x57,0x2E,0x31,0xF7,0x58,0x27,0x7C,0xC3,0x89,0xA3,0x06,0xBF,0xF6,0x99,0xBB, + + 0x26,0x27,0xBC,0x3E,0xEB,0x07,0x1B,0x45,0xDD,0x0D,0x31,0x07,0x5A,0xFB,0x9D,0xBE, + + 0x7E,0x89,0x94,0x23,0x90,0x0F,0x0B,0x6A,0xA9,0x5C,0x47,0x40,0x73,0xB6,0x77,0x2F, + + 0x78,0xA9,0xF3,0x7D,0x77,0x5B,0x41,0x23,0x28,0x6D,0xAE,0x4D,0xB4,0xE7,0xEB,0x1F, + + 0x9B,0x5F,0xB7,0xDF,0x9C,0x06,0x3A,0x0D,0x35,0x30,0x84,0x61,0x2C,0x37,0x02,0x48, + + 0x20,0x81,0x02,0xFE,0x18,0x04,0x13,0xCA,0x98,0x73,0x8B,0x08,0x1D,0xE3,0x52,0x27, + + 0x2C,0xCD,0x31,0x0D,0x60,0x23,0x22,0x6E,0x2C,0x51,0xE8,0x9C,0x22,0xE6,0x9C,0xC9, + + 0x0E,0xCD,0x69,0xEF,0xC6,0x9D,0x4D,0xD8,0x87,0x49,0x0C,0x87,0x8B,0xA3,0xC7,0x7F, + + 0x0D,0x8B,0xB2,0xC2,0x3A,0x26,0x82,0x94,0x4F,0x4F,0xFD,0x40,0xEF,0xAD,0x64,0x7A, + + 0x98,0xD1,0xDC,0xB7,0x40,0x1F,0xF0,0xFC,0x6A,0xCE,0xED,0xAA,0xD3,0xF1,0x80,0xD0, + + 0xA6,0x45,0xD2,0xAF,0xDC,0x18,0x93,0x36,0x2E,0xD4,0x3C,0xC5,0x56,0x9D,0xC9,0x03, + + 0x58,0xB2,0x36,0xF9,0xDE,0x03,0x48,0x58,0x39,0x8F,0x35,0xAB,0xF2,0x58,0xFA,0x8C, + + 0xA4,0x07,0xF3,0x75,0xB1,0x36,0x10,0xCC,0x7C,0x78,0xDF,0xBB,0xF4,0x9C,0xC0,0xA0, + + 0x53,0x9D,0xB4,0xDF,0x62,0x19,0xD4,0x90,0x04,0xE8,0xA4,0x0C,0x8D,0x5F,0x34,0xB0, + + 0x50,0x91,0xA4,0xC3,0x40,0x19,0xC8,0x90,0x43,0x0A,0xDB,0x09,0x1C,0x8A,0xE5,0x84, + + 0x82,0x6B,0x7E,0x80,0x7C,0xFD,0x0B,0xE4,0x47,0x09,0x08,0x6B,0x26,0x29,0xB2,0x73, + + 0xDC,0x17,0x32,0x05,0xB1,0xCF,0xC2,0xC2,0x46,0x28,0xA8,0x57,0x00,0x97,0x2A,0x91, + + 0x29,0x35,0x15,0x6C,0x54,0x29,0x4E,0xAE,0xD1,0x9A,0x76,0xF2,0x7D,0xFE,0x1C,0xAB, + + 0x2C,0x66,0x3B,0x6D,0x01,0x19,0x06,0x52,0x21,0x05,0x0F,0xBB,0x1E,0x06,0x29,0x7A, + + 0x0F,0xDA,0xD9,0xB7,0x49,0x19,0x23,0x24,0x1B,0xBF,0x97,0xEF,0x5D,0x7D,0x11,0x79, + + 0xC7,0x68,0x38,0x9D,0x07,0xFA,0x93,0x3E,0x38,0xB9,0xC7,0x1F,0xF7,0x1B,0x1D,0x4E, + + 0x2D,0xC4,0xFC,0xEA,0xE2,0xAD,0xCD,0x4F,0x99,0x71,0xA8,0x01,0x3E,0x57,0xC2,0xFE, + + 0xA0,0xDC,0xFA,0xD4,0x9E,0x12,0x40,0x16,0x19,0x9C,0xB8,0x0F,0xC0,0x2D,0xD8,0x97, + + 0x8F,0xDE,0xBD,0xF3,0xC2,0xFC,0xAA,0xD6,0x05,0x9A,0x0A,0x6B,0x95,0x81,0x83,0x5B, + + 0x53,0xBF,0xFA,0x5B,0xF6,0x0B,0xC6,0x7F,0xA7,0x2F,0xAF,0x15,0x04,0x54,0xFD,0x98, + + 0x6B,0x7F,0x8A,0x4D,0x03,0xDA,0xD0,0x01,0x86,0x9F,0xEE,0x23,0xF1,0xDF,0x58,0xFA, + + 0xFA,0xD4,0xD8,0xC9,0x3B,0x22,0xB3,0x77,0x4F,0x9D,0x9B,0x28,0xD1,0x8F,0x85,0xF0, + + 0x3F,0x01,0x0F,0xD5,0xAA,0x21,0xA5,0x43,0xF3,0xA2,0x51,0xF4,0xBA,0x50,0xF2,0x2E, + + 0x7E,0x0D,0x5B,0xB1,0x91,0x03,0xDD,0xFB,0x7A,0xBC,0x09,0x7E,0x2C,0x5F,0x51,0x40, + + 0x04,0x9F,0x7E,0xD1,0xB4,0x8A,0x94,0xB0,0x1C,0xFB,0x07,0x9D,0x72,0xFF,0x58,0x64, + + 0x5B,0x06,0x4C,0x4A,0xF2,0x49,0x23,0x0B,0x62,0x65,0xF0,0xF0,0x56,0xFE,0x05,0xE1, + + 0xAE,0x04,0x01,0x10,0xCC,0x64,0x01,0x5D,0xC4,0xC6,0xD1,0x98,0xD2,0xBD,0x0A,0x44, + + 0xB0,0xA3,0x2C,0xBA,0x72,0x71,0x1E,0x0E,0x4E,0xF1,0x66,0x29,0xF2,0x45,0x6A,0x8E, + + 0xF4,0x49,0x86,0x0D,0xE7,0xD7,0xD2,0x0C,0x1E,0xB5,0xC8,0xD3,0xA7,0xB7,0xF5,0xEB, + + 0x7D,0xA6,0x8A,0xE3,0xE6,0xF6,0x0C,0x5A,0x29,0x33,0xE4,0x8C,0xA8,0x05,0x5D,0x30, + + 0x80,0x81,0x7C,0x0D,0x98,0xD5,0x6B,0x52,0xA0,0x47,0xA4,0xE4,0x39,0xF5,0x9C,0xF1, + + 0x43,0xC6,0x74,0x1C,0x99,0xD4,0xDB,0x1D,0xAC,0x09,0xFD,0xF4,0xDA,0x68,0x98,0x48, + + 0x1A,0xC7,0x3B,0x3E,0x80,0x13,0x5A,0x65,0xB7,0x22,0xD4,0x55,0xB3,0xDD,0xA2,0x7C, + + 0x2F,0xB6,0x4E,0xD8,0x17,0xF9,0x5B,0x07,0x32,0x44,0x33,0xFE,0x52,0x80,0x47,0x0F, + + 0xAE,0x4F,0xF9,0xC7,0x29,0x2A,0x30,0xA9,0x8E,0x4A,0x7F,0xFF,0xD6,0x66,0x3A,0xDD, + + 0xD1,0x59,0x9B,0x8E,0xC3,0xA2,0x59,0x65,0x3D,0xCF,0x81,0x87,0x78,0x6B,0x4C,0x09, + + 0xDC,0x61,0x80,0xEC,0x30,0x30,0xF3,0x4F,0x00,0x80,0x2D,0x3A,0x73,0x40,0xB3,0x03, + + 0x5D,0xCC,0x2B,0xC8,0x11,0xB2,0xE5,0x32,0xA8,0x26,0x21,0xEB,0xA8,0xEC,0xC5,0xDD, + + 0x1D,0x7E,0x07,0x06,0x64,0x8A,0xD5,0x09,0xD9,0x5F,0x3E,0xCB,0x25,0x8E,0x6B,0xAD, + + 0xA2,0xF3,0x8B,0x7D,0x69,0xFE,0x25,0x40,0x42,0xD3,0xB2,0xAD,0x71,0x2F,0x9B,0x40, + + 0x51,0x10,0xC6,0xDB,0x13,0x30,0xAB,0x62,0x67,0x50,0xAB,0x19,0x7A,0x36,0x8C,0x8D, + + 0x69,0xEE,0x03,0x14,0x37,0xC1,0x24,0x8B,0x6D,0x37,0x10,0x96,0x30,0xAA,0x1A,0x94, + + 0x9D,0x21,0xC4,0xBA,0x3F,0x90,0xEE,0x03,0x4E,0xAB,0x13,0xD7,0x70,0x3E,0x4D,0x2D, + + 0x02,0x55,0x02,0xA6,0xDA,0x88,0x17,0x4C,0x61,0x1F,0xA5,0x77,0xF6,0x7E,0xA5,0xB4, + + 0xF4,0xE9,0xA6,0x84,0xB5,0x03,0x24,0x53,0x98,0x57,0x39,0xD7,0xA5,0x39,0x9B,0x9A, + + 0x88,0xB4,0x6C,0x0C,0xF1,0xC0,0x30,0xD6,0x15,0xA6,0x72,0x2E,0x35,0x71,0x21,0xA4, + + 0xD0,0xBA,0x20,0xFA,0x8B,0x8E,0xA0,0x91,0xEE,0x7A,0xA9,0x55,0xD9,0x32,0x18,0x63, + + 0x40,0xCA,0xF7,0xAF,0x4A,0xEE,0x25,0x05,0x64,0x39,0xDF,0x41,0x47,0x80,0x8E,0x09, + + 0x5D,0x69,0x9D,0xCC,0xEF,0x61,0xCB,0x0A,0xE8,0x58,0xEC,0x0E,0xD6,0x73,0x11,0xD8, + + 0x58,0x10,0x0E,0xDD,0xF2,0xC1,0x3C,0xF1,0x6A,0x9D,0xD6,0x79,0xDA,0xF7,0x98,0x49, + + 0x95,0x49,0x6C,0x92,0x07,0xC2,0x71,0x8B,0x15,0x32,0x17,0x3D,0xF2,0x78,0x8F,0x95, + + 0x76,0x5E,0xF0,0x82,0x46,0x51,0xE0,0x3E,0x29,0x40,0x28,0x1F,0x5A,0xF5,0x7E,0xE0, + + 0x58,0x05,0x5F,0x06,0x1C,0xA0,0x32,0xCB,0xF9,0x61,0xEA,0xEB,0x24,0xA2,0x50,0xE1, + + 0x75,0x82,0x57,0xE9,0x15,0x5E,0x80,0xC1,0xC1,0x4C,0xE0,0x13,0xE9,0x62,0x78,0x19, + + 0xE0,0x03,0x5E,0xF8,0x6B,0xA2,0x09,0x12,0x65,0x43,0xA5,0x2D,0x75,0xDB,0x2E,0x1F, + + 0xB6,0xC2,0xA9,0x17,0xDC,0x53,0x6B,0x78,0x2E,0xA7,0xBF,0x87,0xB6,0xE1,0x1A,0x52, + + 0x84,0x80,0x4C,0xD9,0xE9,0x29,0x5C,0x3D,0xB3,0x38,0x0B,0xE2,0x1D,0x4A,0xF3,0x30, + + 0x25,0x68,0x97,0x24,0xC5,0x3A,0x47,0xA2,0x4B,0x6E,0xB2,0x81,0xF4,0xE3,0x9E,0xA1, + + 0x04,0x82,0x02,0xB9,0x77,0x10,0xE1,0x38,0x3B,0x7A,0x91,0x26,0x5A,0xEB,0x2D,0xAA, + + 0xD4,0x1C,0x79,0x18,0x6A,0xDB,0x01,0xF3,0x27,0x38,0xB1,0xE0,0xB4,0xB2,0x9A,0xF5, + + 0x81,0x25,0xAC,0x8B,0x55,0xFA,0xB2,0x3A,0xB4,0x1C,0x27,0xAA,0x74,0xFC,0x74,0x37, + + 0x05,0x24,0xAA,0x0B,0x1D,0xA9,0x7B,0x5C,0xB2,0xCF,0xC8,0x5C,0xEA,0x8C,0x30,0x94, + + 0x67,0x1B,0xAD,0x2A,0x9C,0xAA,0xA6,0x34,0xBC,0xD1,0x88,0xCD,0xDA,0xCB,0xBE,0x5C, + + 0x47,0x1A,0xAB,0x27,0x9D,0xAB,0x15,0x81,0x6C,0xA7,0x83,0xD0,0x50,0x1D,0x62,0xB7, + + 0x1F,0x57,0x4B,0x30,0x8B,0x01,0x12,0x2E,0xCE,0xC1,0x8A,0x4A,0x7E,0x8E,0x0A,0x59, + + 0x0B,0xCD,0x2A,0x5F,0xD6,0x50,0xD5,0x95,0xFA,0x65,0x7D,0x18,0xBD,0xCD,0x43,0xCF, + + 0x8D,0xD6,0xFD,0xB4,0xED,0xAE,0x8A,0x4C,0x6F,0x44,0xA0,0xA9,0xD0,0xF5,0x69,0x60, + + 0xF8,0xFA,0x07,0xCC,0xBE,0xA7,0x03,0x85,0x72,0x37,0xFE,0x97,0x19,0x22,0xDB,0xF8, + + 0xD3,0xD1,0x3F,0xAD,0x49,0x8D,0xCF,0xDD,0x6A,0x2F,0xF4,0x4B,0xE7,0xAB,0x93,0xC9, + + 0x4E,0x9E,0xBF,0x65,0xB1,0x3C,0xC3,0xB0,0x69,0x8D,0x33,0x0E,0x3F,0x6A,0x88,0xF8, + + 0x39,0x2E,0xBD,0xB3,0x5D,0x6A,0x8E,0xC3,0xA4,0x89,0xB0,0xD5,0x0F,0xB0,0xAD,0xE8, + + 0xA3,0xB2,0xFB,0xCE,0x5E,0xD7,0x82,0xFD,0x86,0x03,0x2D,0x33,0xBE,0x97,0x5E,0x3C, + + 0x45,0xCD,0x82,0x1A,0x37,0xD4,0x7C,0xF6,0xE4,0x9C,0x1B,0x04,0xD7,0x7E,0x3E,0x9D, + + 0xCC,0xF1,0x40,0x45,0x6C,0xBF,0xEC,0xB4,0xAC,0xC8,0x83,0x14,0xF5,0xDD,0xF6,0x30, + + 0x22,0x1B,0x42,0x1B,0x92,0x4B,0xE8,0x81,0x9A,0xD9,0x08,0x05,0x57,0x7C,0x55,0x28, + + 0x86,0x26,0x6D,0xC8,0xEC,0xF6,0x2D,0x84,0xBB,0x90,0x59,0x95,0xB4,0x0A,0x11,0x0E, + + 0x08,0x02,0x9E,0x61,0xDF,0xB1,0xA3,0x2E,0x5E,0xE1,0x6D,0xAD,0x03,0xF4,0xEA,0x50, + + 0x96,0x66,0xF4,0x65,0x49,0x16,0x4D,0xD8,0x2D,0xD6,0x69,0x93,0x4E,0xB4,0x8C,0xCC, + + 0xA2,0x46,0x61,0xD0,0x01,0x46,0x8E,0x49,0x6E,0x76,0x77,0x56,0x9F,0xB8,0xEF,0xBF, + + 0xA3,0x66,0x0F,0xED,0xDF,0x17,0xAF,0xEE,0xB0,0x23,0x7F,0xAF,0x47,0xB9,0xCA,0x58, + + 0x6E,0x96,0xDC,0x3D,0x46,0xFE,0x18,0x98,0xE3,0xAA,0x8E,0xCA,0x4D,0x48,0x6C,0xA1, + + 0x4F,0x02,0x91,0x26,0xBE,0x42,0x44,0x71,0xD4,0x50,0x5D,0x1C,0x9F,0x42,0x65,0x33, + + 0xAE,0x9A,0x6E,0xA3,0x81,0xBF,0x8A,0x99,0x78,0x81,0x4D,0x11,0x17,0x07,0x14,0xA1, + + 0xA1,0xFD,0x34,0xDD,0xB9,0x9F,0x1E,0x11,0x1E,0xDC,0x3F,0x3F,0x82,0xBE,0xC0,0x21, + + 0xAC,0x42,0x0C,0x38,0x16,0x61,0x49,0x2D,0xE5,0xFF,0xAB,0x94,0xCC,0xFF,0xCC,0x4E, + + 0x0F,0x1F,0xC6,0x36,0xC0,0xDC,0x01,0x23,0xE2,0xA0,0xDE,0xDC,0xC6,0x2C,0x91,0xD9, + + 0x55,0x6E,0x43,0x67,0x6B,0x60,0x09,0x91,0xC6,0x90,0x4C,0xBD,0xD6,0x9A,0x74,0xEE, + + 0xE2,0x6B,0xA2,0xE5,0x57,0xF2,0x67,0x19,0xF6,0x36,0xEB,0x3D,0xDD,0x2D,0xFB,0xA6, + + 0x26,0xF0,0x13,0xE4,0x30,0xF5,0x30,0x24,0x36,0xC9,0xAF,0xE0,0x19,0xC7,0x16,0xB2, + + 0x07,0xA8,0x19,0xEC,0xF2,0x23,0xD8,0x42,0x23,0x54,0x78,0x06,0x65,0xCA,0x95,0xC5, + + 0xBB,0x4D,0x01,0xED,0x1C,0x64,0x29,0x45,0xA9,0x49,0x6C,0x54,0xA7,0xC9,0x9D,0xD5, + + 0xAB,0xB2,0x64,0x25,0x30,0x65,0x27,0x77,0x2A,0x48,0x7D,0x17,0x2C,0xDC,0x11,0x8C, + + 0x2C,0xCA,0x42,0x28,0xD1,0x25,0xCF,0xA8,0x80,0xA9,0x05,0x08,0x6B,0x36,0x3A,0x56, + + 0xF4,0x55,0x4A,0x38,0x31,0x6B,0x7B,0xC4,0xD5,0x0B,0x76,0xBC,0xA5,0x49,0x3B,0xF2, + + 0x8E,0xA0,0x7C,0xFD,0x9F,0xFB,0x80,0xDA,0xB4,0xB1,0x2B,0x3D,0x7F,0x2B,0x55,0xFB, + + 0x8D,0x76,0x1B,0x9A,0x26,0x7E,0x16,0xB3,0xBE,0x3E,0x37,0x7F,0x5A,0x29,0x7C,0x44, + + 0xA9,0x69,0xD2,0x4C,0x1C,0x7D,0x00,0xC6,0xA1,0x28,0x52,0x68,0x11,0xCF,0x32,0x5C, + + 0xE2,0x6E,0x93,0x8C,0xBE,0x24,0x62,0xA8,0x47,0xB2,0x76,0x3E,0xD8,0x2F,0x7D,0x44, + + 0x29,0xA5,0x01,0xED,0xE2,0x8E,0xC3,0xEB,0x4A,0xF6,0x3F,0xED,0x26,0x4E,0x2B,0x76, + + 0x45,0x4D,0xC9,0x2F,0xA8,0xD8,0xCB,0x66,0x9A,0x01,0x0D,0x9D,0x0B,0xB9,0x2C,0xE6, + + 0x01,0x60,0x67,0xC4,0x24,0x0D,0x2F,0x67,0xAA,0x59,0x31,0xB0,0xF7,0x66,0x2C,0xF6, + + 0x02,0x71,0x35,0x06,0x31,0xEE,0x02,0x52,0x81,0x0A,0x9C,0x76,0xF2,0x37,0xBD,0x11, + + 0x07,0x09,0x7A,0xEA,0x6E,0xCD,0x5D,0x98,0x11,0xF6,0xC5,0x3B,0x0B,0x89,0x54,0xD3, + + 0x06,0x08,0x1D,0xFE,0x8D,0xCC,0x1D,0x80,0xBA,0xAC,0x2A,0x91,0x9A,0x7C,0x9B,0xC1, + + 0xDF,0x78,0x04,0xE0,0x37,0x76,0x6B,0x62,0x40,0x64,0xBC,0x62,0x8E,0x35,0x16,0xE4, + + 0x5F,0x0A,0xF4,0x3B,0xCE,0x77,0x3C,0x50,0x3F,0x5A,0xD6,0xF0,0xD0,0x73,0x23,0xB0, + + 0xA1,0x37,0xD1,0x47,0x05,0x53,0x6B,0xB9,0x41,0xD6,0xB5,0x45,0xAC,0x7B,0xF5,0x2F, + + 0xC0,0xF6,0x5D,0x15,0x58,0x53,0xDD,0x30,0x38,0x83,0x8D,0x6C,0x90,0x57,0x4C,0xEE, + + 0x09,0x09,0xBC,0x20,0xCF,0x54,0xAF,0x19,0xCB,0x87,0x16,0xD7,0x7E,0x59,0x2E,0xFE, + + 0xD6,0xB4,0xC6,0x9D,0x1D,0xE5,0x78,0x64,0x6A,0xDB,0xA6,0x53,0x84,0xD8,0x3D,0x7A, + + 0xC4,0x01,0x38,0x16,0x4D,0xAC,0xA2,0x70,0x55,0x34,0xA0,0xCF,0x4F,0x1F,0x99,0xDE, + + 0x77,0x11,0xB4,0xC3,0x64,0x86,0x45,0x43,0x95,0xF4,0xA7,0x8D,0xBD,0xD4,0xD1,0x22, + + 0x8F,0x70,0x7F,0x2E,0x96,0x41,0x86,0xF7,0x44,0xC8,0xAE,0x6E,0x58,0x8E,0x8A,0x23, + + 0x48,0x96,0x0E,0xFD,0xAB,0x30,0x14,0xBE,0x14,0x1D,0xBE,0x5C,0x2D,0xF0,0xA4,0x37, + + 0x0E,0xF3,0xBF,0x3D,0x50,0x8F,0x05,0xF2,0x80,0x1C,0xEF,0xBD,0xF2,0x71,0xD8,0x2A, + + 0x2F,0x92,0x34,0x2D,0x7A,0xCE,0x9F,0xF8,0x7B,0xAA,0xA7,0x7F,0xFE,0xB5,0xE0,0x23, + + 0x9A,0x5F,0xD8,0x7C,0xFF,0xAF,0xEF,0xA2,0xF8,0xD1,0x66,0x2C,0x89,0x5D,0x83,0x55, + + 0x0B,0x5D,0xD0,0xBA,0xE2,0xE0,0xF8,0x6A,0x96,0x1A,0x1F,0xA9,0x3E,0x57,0x95,0x61, + + 0xB7,0x62,0x93,0x2A,0x6B,0x0F,0x80,0x16,0xBF,0x22,0x1E,0xD6,0x02,0xE2,0xED,0xD9, + + 0x3E,0x7C,0x04,0x68,0x08,0xFF,0x8C,0xCE,0xC7,0xB6,0x3C,0x45,0xD3,0x00,0x66,0x5F, + + 0xEF,0x14,0x18,0xAE,0xC5,0xE9,0x71,0x24,0x06,0xDF,0xD7,0xF9,0x3D,0x52,0x10,0xBA, + + 0xA3,0x48,0x2F,0x29,0x35,0x48,0xAC,0xA2,0xC6,0x4D,0x86,0x45,0x3C,0x60,0x19,0x64, + + 0x6F,0x36,0x1E,0x77,0x69,0xE0,0xB6,0x05,0x07,0xA5,0xF0,0xE3,0xB8,0x9D,0x96,0xA3, + + 0x6D,0x26,0xEF,0x5F,0x32,0xBC,0x09,0x9C,0x3F,0x6E,0x79,0x31,0x45,0x43,0x78,0xCE, + + 0x7C,0xCA,0x19,0x40,0xF5,0xF1,0x23,0x04,0x20,0x73,0x6F,0xDF,0xB4,0xEC,0xCE,0xE1, + + 0xB8,0xCB,0x55,0x6C,0x6F,0x76,0x35,0x51,0x69,0x75,0xDB,0x2D,0x29,0x7D,0xB3,0x2A, + + 0x8A,0xCB,0x0F,0x8A,0x27,0x1B,0x52,0xD3,0x50,0x88,0xED,0x1D,0x9C,0xA6,0xBB,0x40, + + 0xA9,0x90,0x47,0x70,0x43,0xF6,0x84,0x60,0x3D,0x31,0x9D,0x02,0x05,0x40,0xB6,0xCE, + + 0x26,0x98,0x15,0xA8,0x3A,0x07,0xC5,0x17,0x48,0x66,0x7C,0x74,0x96,0xF4,0xFC,0x3C, + + 0x82,0xEF,0xFE,0x65,0xBE,0xF2,0xCF,0x0B,0xB7,0x34,0x12,0xF4,0x7D,0x3B,0xDC,0xA9, + + 0xAA,0x95,0x9B,0x4B,0x67,0xEC,0x4F,0x19,0x25,0xC4,0xD4,0x9E,0x42,0x8E,0x0B,0x75, + + 0xEC,0x80,0x5F,0x3D,0x20,0x52,0xCC,0x06,0xC9,0x65,0x84,0x82,0xDF,0xE1,0xE1,0x72, + + 0xB8,0x31,0x0B,0xA2,0x16,0xB3,0x94,0x52,0x9A,0x03,0x14,0xD4,0x16,0xCC,0xAB,0xAD, + + 0x49,0xD3,0x92,0xFF,0x5D,0xBC,0xB9,0xAF,0x9B,0xD1,0x08,0xD4,0xCA,0x0C,0xB3,0x69, + + 0x01,0x9B,0x75,0xA7,0xC8,0x43,0x4B,0xA4,0x1D,0xDD,0x75,0x86,0x76,0xAD,0x67,0xC9, + + 0xA3,0x21,0xD2,0xE4,0x84,0xD0,0x39,0xAF,0x65,0x1E,0x7D,0x96,0x22,0xAE,0x36,0xEC, + + 0xCD,0xF0,0x9D,0xB8,0x91,0xF5,0x26,0x66,0x6E,0x60,0xAE,0xE3,0xD5,0x79,0x01,0xF6, + + 0xA5,0xBD,0x57,0x98,0xDE,0x6C,0x5B,0xE1,0x49,0x91,0x27,0xA5,0x08,0x6C,0x5A,0x21, + + 0xFA,0x92,0x48,0xB8,0x2B,0xEA,0xC2,0x52,0xE0,0xF6,0x0A,0x63,0xB5,0x50,0xC9,0xB1, + + 0xE6,0x87,0xF5,0x43,0xD7,0x48,0x5B,0x57,0x6B,0xDA,0x20,0xA7,0x16,0x48,0xE2,0xCA, + + 0x64,0x6D,0xDD,0x7E,0xBD,0x09,0x35,0xA8,0xB5,0x99,0xCE,0x89,0xC1,0xF7,0x28,0xAF, + + 0xAD,0xE7,0xFD,0xA1,0xB9,0x66,0x98,0x86,0x6B,0x98,0xAA,0xB4,0xDC,0x26,0xB1,0x0F, + + 0xD4,0x57,0xD9,0x89,0xDF,0x9E,0x9C,0xD4,0x39,0x51,0xED,0x1C,0x84,0xB8,0xBF,0x3B, + + 0xB1,0xC8,0x90,0xAF,0x2F,0x04,0x48,0xD9,0x12,0x50,0xE5,0x6B,0x81,0xE4,0x1E,0x48, + + 0x2F,0xE4,0x19,0xBC,0x5C,0x43,0xC2,0x15,0x68,0xFC,0x76,0x3F,0x8A,0x71,0x66,0x96, + + 0x6D,0x92,0x4E,0xB0,0x49,0x12,0x0E,0x3C,0xC5,0x9F,0x2E,0xEA,0xFD,0x51,0x3D,0xCF, + + 0x0D,0x98,0x1C,0xA0,0xC2,0x11,0x50,0x24,0x5D,0x92,0x08,0x11,0x05,0xFD,0x0F,0x9F, + + 0xD3,0x90,0x4B,0xBD,0x40,0x32,0xB3,0x7F,0xEB,0x15,0x0A,0x9D,0x87,0x40,0x60,0x53, + + 0xBE,0x0D,0xD0,0x9A,0xEB,0xDB,0x70,0x7F,0xE3,0xCB,0x91,0x12,0xBA,0x75,0x6B,0xD0, + + 0x47,0x7D,0x3F,0x30,0x6E,0xDE,0x62,0xC0,0x92,0x4E,0x2A,0x0F,0x2E,0x61,0x16,0xFB, + + 0x79,0x6E,0x81,0xC7,0x13,0x64,0x15,0xC3,0x42,0xBE,0x9B,0x13,0x20,0x72,0x36,0x5E, + + 0xD9,0x88,0xB3,0xEB,0x6A,0x38,0x79,0x6E,0x26,0xEE,0xF1,0xF7,0x57,0x96,0x80,0xF5, + + 0x23,0x46,0xCC,0x46,0xCB,0xD9,0x29,0x06,0x63,0xF4,0xAF,0xE6,0x53,0x9B,0xC8,0x96, + + 0x91,0x06,0x1E,0xBB,0xAE,0xDA,0x73,0xF4,0x7C,0x74,0x48,0x06,0xA8,0xEE,0x97,0x10, + + 0xE9,0x72,0xEE,0x3E,0x65,0x8B,0xE6,0x54,0xC4,0xCC,0xE9,0x45,0x73,0x59,0xAA,0xAA, + + 0xFC,0x07,0x25,0xCE,0x92,0xA7,0xEE,0x44,0xC7,0x1F,0xE2,0x4C,0xD5,0x74,0x02,0x25, + + 0xE3,0x4C,0xE4,0x7A,0xEB,0x95,0xDA,0xCA,0xE4,0xE5,0x02,0x33,0x34,0x73,0xAE,0x7A, + + 0x75,0xF6,0xD3,0x9B,0xFC,0x90,0xCE,0x9D,0x0A,0x45,0x82,0x18,0xB0,0x88,0x39,0xB9, + + 0x19,0xA5,0x2F,0x97,0x9B,0x58,0xDF,0xCB,0x75,0xC6,0x14,0x4B,0xB1,0x8B,0x31,0xA5, + + 0x7E,0x0F,0x93,0x99,0xFA,0x64,0x14,0xC7,0x20,0xB3,0xC3,0x25,0xEA,0xB9,0x2A,0x8A, + + 0x8C,0xF9,0x7F,0xB2,0xE3,0xD3,0xD6,0x79,0x26,0x48,0x85,0x0E,0x31,0x63,0xB5,0x2A, + + 0xFC,0x86,0xC2,0x46,0x12,0x99,0x08,0x88,0xFF,0x42,0x83,0x79,0x8E,0x01,0xD3,0xA1, + + 0x98,0x43,0x53,0x53,0xE4,0xDA,0x6B,0x4D,0x48,0x4A,0x55,0x5F,0x2E,0x61,0x3B,0x65, + + 0x8D,0x1C,0x43,0x32,0xBA,0x5D,0x80,0x7B,0xB4,0x4C,0x1F,0x23,0xD5,0x71,0xFC,0x70, + + 0xCA,0x61,0xCF,0x6C,0xCE,0x7F,0x3E,0x70,0xC3,0xD8,0xBC,0x20,0x0B,0xFB,0xB9,0x63, + + 0xAD,0x9C,0x51,0x89,0xCA,0x73,0x7E,0xB4,0x67,0xB2,0x64,0x30,0x0F,0x60,0x7B,0x87, + + 0x41,0x91,0x5E,0xDB,0xCF,0xF8,0x95,0x52,0x2A,0xF9,0x55,0x18,0xCC,0x69,0x75,0x9C, + + 0x21,0x9D,0xC3,0xAB,0xC6,0x6F,0x13,0x40,0x7D,0x41,0xC4,0xD3,0xF7,0x80,0x24,0xC2, + + 0x23,0x19,0x68,0x86,0xB1,0x9F,0x12,0xA2,0xC3,0x58,0xEA,0xB4,0xAC,0xD9,0x59,0xC8, + + 0xA1,0x11,0x92,0x47,0x2F,0xB8,0xFC,0xB2,0xE0,0xFE,0xE2,0xA4,0xAD,0x8A,0x3F,0xA1, + + 0xF6,0x54,0x27,0xC5,0x6A,0xD0,0x2D,0xA3,0x6E,0x5A,0x59,0x7B,0xF3,0x46,0x45,0xB3, + + 0xC2,0x42,0xB3,0x47,0xB5,0xD4,0x35,0x79,0xE5,0x57,0xE3,0xB0,0x25,0xA8,0x96,0x4F, + + 0x2A,0xED,0x59,0x12,0x07,0xC8,0xFE,0x22,0x4A,0x8E,0x87,0x2E,0xB5,0x77,0xCE,0x2D, + + 0x0A,0x5B,0x3D,0x60,0xEC,0xC2,0x76,0x3E,0x95,0x18,0x30,0x4E,0x7F,0xF9,0x03,0xCE, + + 0x29,0x14,0xBD,0x76,0xBE,0x90,0x68,0x54,0xE8,0x54,0x57,0xBD,0x00,0x7C,0xD9,0xF0, + + 0xAF,0xF8,0x91,0x70,0xE5,0xB6,0xF3,0x39,0x15,0x7B,0xB1,0xBD,0xF9,0x7B,0x5E,0xCD, + + 0x49,0xE3,0x73,0x48,0x54,0xC4,0xD7,0x6C,0x2D,0xDC,0x46,0x9E,0x8D,0x83,0x76,0x6A, + + 0x23,0xCD,0xAF,0x7C,0xED,0x82,0x26,0x7A,0x62,0x39,0xE6,0x2C,0x8C,0x72,0x3F,0x4B, + + 0x22,0x1E,0x99,0xC2,0xA8,0x70,0x37,0xA9,0x44,0xD3,0x47,0x6F,0xD8,0x8C,0x75,0x3B, + + 0xAD,0xAD,0x10,0xDD,0x38,0x31,0x67,0xA9,0xE3,0x50,0xBF,0xB9,0xBC,0xF2,0x1E,0x26, + + 0xE5,0xFF,0xB7,0x82,0x26,0x83,0x1A,0x87,0x07,0xCD,0x08,0xD7,0xF7,0x13,0x60,0x26, + + 0x66,0xF5,0xE0,0x02,0xC8,0x3C,0xF6,0x1D,0x46,0x81,0x98,0x26,0x2A,0xFF,0x9C,0x44, + + 0x4E,0xB8,0x99,0xFD,0x19,0x54,0xBA,0xD8,0x0C,0xE8,0x83,0xD8,0x20,0xED,0xBC,0xF9, + + 0x20,0x8A,0x06,0x49,0x6C,0x7F,0xB6,0x56,0x4A,0xC1,0x62,0x3E,0xD3,0xA9,0x26,0x3D, + + 0xA5,0x0F,0x25,0x35,0x13,0xD5,0x2F,0x67,0x35,0xC4,0x8D,0x99,0x35,0x79,0x3C,0x20, + + 0xA4,0x0E,0xE4,0xA5,0x9B,0xA8,0x42,0xED,0xB8,0x48,0x47,0x94,0x0F,0x52,0x99,0x7F, + + 0x80,0x95,0x9F,0x41,0x77,0x05,0xB1,0xA3,0xD3,0xAA,0xE6,0xE3,0xE4,0x55,0xEE,0x6E, + + 0x78,0x57,0x16,0x24,0x96,0xD6,0x9A,0xF1,0x47,0x04,0x1B,0xAC,0xF3,0x8B,0x61,0x55, + + 0xB1,0x74,0xA5,0x0C,0xCF,0x54,0x85,0x2B,0xC1,0xC4,0x4C,0xAC,0x5D,0x0F,0x6D,0x9F, + + 0x0C,0xAB,0xF3,0xDF,0xBA,0xAF,0x9E,0x29,0xC1,0x0F,0x3D,0x4D,0x31,0xA6,0xE3,0xDB, + + 0x5D,0xC8,0x18,0x50,0xB8,0x27,0x5B,0x34,0x48,0x1E,0xE9,0x2E,0x7F,0xF1,0x72,0xCB, + + 0xEE,0xAB,0x82,0x35,0x3E,0x04,0x1D,0x3D,0x03,0x76,0x2B,0xC3,0x55,0x10,0x91,0x46, + + 0xBF,0x57,0x9C,0x48,0xFF,0x0F,0x0A,0x4D,0xB3,0xC3,0xCD,0xE1,0xAF,0xBA,0x88,0xB6, + + 0x0F,0x00,0x92,0x5C,0xBA,0xEC,0x21,0x78,0x34,0xCE,0x6D,0x81,0xB6,0x85,0xC9,0xB6, + + 0x7F,0xF5,0x34,0xBC,0x12,0x53,0xA8,0x69,0xB1,0xDD,0xFB,0x66,0x37,0x66,0x14,0x5F, + + 0xD2,0x1C,0x07,0xDF,0x63,0x8F,0xA6,0x73,0xCB,0x37,0x28,0x81,0xFB,0x81,0xC0,0x06, + + 0x4A,0x2B,0xDB,0x82,0x7F,0x65,0x98,0xE0,0xE7,0x6D,0xB4,0xD4,0x47,0x66,0xAC,0xD4, + + 0xB7,0x35,0x00,0xD4,0xB6,0xF3,0x3D,0x41,0xAF,0x7A,0x2C,0x71,0x77,0x04,0x5B,0xB0, + + 0xCF,0x17,0x49,0x07,0x48,0x92,0x1F,0x73,0x47,0x5A,0x4F,0x4F,0x47,0xBD,0x23,0x89, + + 0x6D,0x5B,0x7B,0x77,0x5E,0x76,0x5A,0xBB,0x31,0x16,0xB9,0xF0,0x74,0xFD,0x05,0x22, + + 0x6A,0x6B,0x04,0xF9,0x12,0xB2,0x1C,0x20,0xE5,0x90,0x8C,0x64,0x54,0x06,0xF7,0xC8, + + 0x03,0x93,0x8C,0x89,0x80,0x08,0x14,0x90,0x41,0x21,0x9C,0x56,0x2D,0x78,0xA5,0xFF, + + 0x2F,0xD4,0x4A,0x28,0x4B,0xB9,0x1D,0xE4,0x65,0xD9,0xCD,0x37,0x0D,0xF9,0xC7,0x15, + + 0x06,0x1E,0x95,0x55,0x6A,0x88,0xAF,0x77,0xEE,0xD3,0x85,0x75,0x77,0x4E,0x01,0x7B, + + 0xB0,0xF8,0xD8,0xB9,0x57,0x1D,0x91,0x9D,0x07,0x7D,0x09,0x9E,0x78,0x57,0x51,0x67, + + 0x2D,0x97,0xFE,0x00,0xC6,0xA5,0xFE,0x0F,0x30,0x72,0x5C,0x4F,0xB7,0xB9,0xCF,0x01, + + 0x8E,0x4C,0xA6,0x0B,0xD2,0x0C,0x97,0x5A,0x0C,0x5A,0x51,0xDD,0x8A,0x55,0x47,0x1D, + + 0x51,0xDA,0x12,0xD5,0x59,0x3C,0x9A,0x23,0x6A,0xCD,0xE1,0x2D,0xBD,0x76,0x62,0x2A, + + 0x0A,0x33,0x5B,0x2C,0xBC,0x40,0xD1,0x5F,0x93,0x27,0xCE,0x3E,0x22,0xFA,0x08,0x13, + + 0x2C,0xAF,0x8E,0x9E,0x82,0x36,0xBB,0x12,0x4B,0x90,0xB0,0xCE,0xFD,0xF5,0xF1,0xB8, + + 0xC2,0xF2,0x9E,0xBC,0xF1,0xB1,0x77,0x15,0xCC,0x6E,0xA7,0x62,0x5D,0xBE,0x35,0xD4, + + 0xC7,0x7E,0xEB,0x3D,0x9D,0x40,0x69,0x4F,0x10,0x9D,0x43,0x80,0x5C,0xBE,0x5E,0xE2, + + 0x04,0xFD,0x84,0x43,0x91,0x2E,0x30,0xAA,0x41,0x20,0xAA,0xD7,0x3C,0xEB,0x98,0xA6, + + 0x07,0x20,0x3A,0x0B,0xFD,0x8E,0xB4,0xAB,0x40,0xC1,0x8C,0x3E,0xF0,0x0F,0xC1,0x20, + + 0x7B,0x40,0x41,0xB0,0xD7,0xF6,0xA6,0x5C,0xE4,0xBF,0x02,0x14,0xBC,0x20,0x32,0x6B, + + 0x22,0x66,0xBF,0x91,0xFF,0xBB,0xA6,0xAA,0x3E,0x02,0xFB,0x34,0xD0,0xC3,0x94,0xBA, + + 0x8D,0xF9,0x8A,0xBA,0xB1,0x29,0x7D,0x93,0xCE,0x49,0xE8,0xB4,0xA5,0x6B,0xCE,0x2F, + + 0xD9,0xFA,0xB0,0xD6,0x12,0xA2,0xC8,0x0F,0x16,0x4E,0xB8,0x35,0xA6,0x68,0x26,0x3F, + + 0x50,0x0E,0x8B,0x58,0xD3,0x2E,0xFD,0xFF,0x82,0xB9,0x65,0x95,0x8E,0x69,0xF2,0xCB, + + 0x74,0x46,0x72,0xB7,0x3F,0xDA,0x5F,0x6C,0x3D,0x47,0xD3,0x71,0x70,0x26,0x3D,0xEA, + + 0x63,0x07,0xDC,0x03,0x1C,0x66,0xCD,0x28,0x6C,0x93,0x25,0x19,0x5E,0x00,0x99,0x9C, + + 0x2D,0xCE,0x55,0x1C,0x9A,0x27,0x64,0x3E,0xA8,0xCA,0x0C,0x7B,0x9B,0x99,0x83,0x76, + + 0x8E,0x4B,0xE2,0xAD,0x4E,0x95,0x17,0xD9,0x7D,0x9B,0x4B,0x3C,0xB4,0xC7,0xCB,0x38, + + 0x5E,0x96,0x6B,0x22,0xBD,0x69,0x35,0xCA,0x45,0x46,0x93,0x4E,0xFD,0x96,0xEE,0x33, + + 0xD4,0xF3,0xBA,0x68,0x9F,0x0B,0x56,0x74,0xB3,0xD4,0x12,0x39,0xFC,0x20,0xE7,0x27, + + 0x96,0x51,0xED,0xA1,0x57,0x63,0x5A,0x79,0x1B,0x0F,0x20,0x3A,0x59,0x21,0x78,0xD7, + + 0x7D,0x4F,0x1C,0x5C,0x9C,0x0E,0x0B,0x78,0x92,0xF9,0x52,0x1F,0xE9,0xDA,0xF0,0x17, + + 0xE0,0x3E,0xBB,0x1B,0x39,0xD1,0x5F,0x2A,0x3E,0x46,0xDA,0x8E,0xAE,0x74,0xAF,0x04, + + 0x2B,0xE6,0xDE,0xC1,0x4C,0x72,0x2C,0x5B,0xED,0xAD,0x23,0xA5,0xFD,0x7C,0xE7,0xB4, + + 0xAE,0x13,0xD6,0x83,0x4D,0x73,0x67,0xF7,0x98,0xD7,0x5C,0x01,0xCD,0x33,0x03,0x59, + + 0xB8,0x16,0x15,0x11,0x11,0xED,0x72,0x5A,0x15,0xC4,0xFD,0x21,0x9E,0xB8,0xBA,0x90, + + 0x2C,0x1F,0x1D,0x2E,0x44,0x3C,0xF5,0xCB,0x23,0x53,0x4B,0xE8,0x9A,0x07,0xFC,0x33, + + 0x21,0x04,0x44,0x01,0x01,0x76,0xC4,0xA2,0xC3,0x58,0x56,0x60,0x39,0x10,0x4D,0xB6, + + 0xC8,0x5F,0xC4,0x7B,0xD2,0x3A,0xFC,0xB2,0xE0,0xFE,0xBE,0xFC,0x72,0x65,0xFD,0x32, + + 0xA9,0x0D,0x8B,0x35,0x96,0x30,0x2D,0xA3,0x6E,0x5A,0x8C,0xC6,0x17,0x18,0x4C,0xB7, + + 0x48,0x7D,0xAD,0x95,0x05,0x3A,0x35,0x71,0xE5,0x34,0x1D,0xDD,0xF3,0x35,0x6E,0x0C, + + 0x46,0x0C,0xDC,0x48,0x44,0x7A,0x1E,0xDB,0xEA,0x94,0x16,0x6A,0xEA,0x7B,0xB8,0x69, + + 0xC1,0x49,0xD4,0x0A,0x45,0x7B,0xA1,0x5A,0x4D,0x75,0xF6,0x7E,0xFF,0x8C,0x3D,0x7A, + + 0x4C,0xB5,0x17,0xAC,0x19,0xE5,0xAF,0xD7,0x4B,0x3F,0x74,0x56,0x87,0x7A,0xCF,0x2C, + + 0x73,0x18,0x1F,0xCE,0x4C,0x34,0x9E,0xFA,0xF1,0x77,0x0F,0xCE,0x8C,0x17,0xD6,0xD6, + + 0x0C,0xE8,0x8C,0x32,0x99,0x31,0x28,0x2A,0xE9,0x52,0xD9,0x57,0xFD,0xFD,0x91,0xF8, + + 0x2D,0x3D,0xC6,0x76,0xCE,0x32,0x26,0x3A,0xCA,0x1E,0x8E,0xF0,0x6B,0xF6,0x93,0x4D, + + 0xE9,0x52,0x8D,0xD0,0x19,0x38,0xF7,0x2B,0x66,0x50,0x47,0x6F,0xD8,0x6C,0x6E,0xE6, + + 0x8D,0x5D,0x7B,0xA2,0x18,0x7E,0x3F,0xB9,0x45,0xD2,0xEA,0x1F,0x57,0xF4,0x58,0x25, + + 0xFD,0x8F,0xE7,0x8C,0x35,0x42,0x4F,0x5D,0xC9,0x76,0x70,0x07,0xA5,0xA2,0x84,0x81, + + 0x1E,0x8B,0xF1,0xB9,0xB0,0x50,0xBA,0x5D,0x26,0x20,0x41,0x4C,0xF6,0x84,0xB1,0x71, + + 0x3F,0xBF,0xF8,0x40,0x31,0x5D,0x39,0x33,0x90,0x15,0x21,0x91,0xD2,0xC3,0x6A,0xE3, + + 0x9A,0xB2,0x51,0x71,0x1A,0x25,0xAA,0xC0,0x41,0x4E,0x86,0xD5,0x28,0xA1,0x44,0xB3, + + 0x32,0x88,0x19,0x80,0xB4,0xE1,0xF4,0x9F,0xB9,0x85,0x92,0x90,0xD3,0xA4,0x4E,0x3A, + + 0x4E,0x21,0x98,0x76,0x31,0x68,0x7C,0x35,0xC6,0xCB,0x31,0x74,0x3C,0x9F,0x3E,0xC3, + + 0xF5,0xF1,0x93,0xC1,0xB0,0xEA,0xE1,0xA4,0xC4,0x33,0x19,0x77,0xF2,0x4D,0x74,0x07, + + 0x7B,0xD6,0x79,0xD3,0xD4,0xEF,0xB9,0xC6,0x80,0x85,0xF9,0x9F,0xB0,0x6C,0xE2,0x2B, + + 0x9C,0x85,0xE0,0x4E,0x4C,0xAE,0x60,0x7C,0xA7,0xAC,0xA6,0xF0,0x5A,0xA9,0x85,0x60, + + 0xD0,0x35,0xAE,0xFC,0x39,0x24,0x70,0x7E,0xCF,0x05,0x81,0xDC,0xF1,0x54,0x58,0xF9, + + 0xAD,0x5A,0xAF,0x08,0x3D,0x22,0x0B,0xD4,0xE8,0x88,0x41,0xAB,0xF8,0x9B,0x16,0x40, + + 0x8B,0xB3,0xF2,0xB0,0x3A,0xEA,0x83,0x59,0x3E,0xAE,0xC3,0x1B,0x52,0xE9,0xD1,0x63, + + 0x0A,0x14,0x82,0x18,0xBB,0x71,0xA4,0x3B,0x25,0xB8,0x2D,0x88,0x4E,0x67,0x50,0xFF, + + 0xB0,0x26,0x2A,0x12,0xD5,0xA4,0x99,0x81,0x30,0xCD,0xB4,0x98,0x6C,0x05,0x2F,0x6D, + + 0x9A,0xE9,0x9B,0x68,0x63,0xA1,0xF3,0xAD,0x5C,0xCD,0x0C,0x89,0x3F,0xF5,0xE4,0x5B, + + 0xBC,0x4F,0x6F,0xE0,0x93,0xCF,0x13,0xB9,0x49,0x3A,0x03,0x5B,0xEC,0xCA,0xC7,0x79, + + 0xD8,0x67,0x34,0x04,0xBC,0x68,0x36,0xA1,0x27,0xD0,0xD2,0xDB,0x75,0x90,0x1F,0x28, + + 0xA6,0x9F,0x6C,0x46,0x96,0xB7,0x10,0x22,0xEC,0x83,0x70,0x65,0x73,0x5B,0x96,0x3D, + + 0x5C,0x25,0x9D,0xD7,0x34,0xBD,0x19,0x2A,0x6D,0x60,0xE5,0xAF,0xA0,0xB0,0xCD,0xAC, + + 0x81,0x3E,0x89,0xCB,0x14,0xBA,0xB5,0xFC,0x86,0xD3,0x5D,0x33,0xF8,0xD2,0x60,0xD9, + + 0xDA,0xF7,0xDE,0x38,0xC3,0x35,0x0C,0x60,0x67,0x93,0xC4,0x04,0x52,0x7F,0xA0,0x56, + + 0x23,0x5F,0x3C,0x2C,0xCE,0x3C,0x44,0x22,0x3B,0x5D,0xEC,0x14,0x53,0xF3,0xA5,0x13, + + 0x10,0xD4,0xF6,0x3C,0x57,0x35,0x4D,0xB3,0xEE,0xD9,0xC0,0x05,0x5A,0x7D,0xBE,0x23, + + 0x02,0x66,0x69,0x24,0x33,0x23,0x4D,0x11,0x65,0xDF,0xF5,0xC0,0x56,0x28,0xB9,0x65, + + 0xD5,0xE9,0xA5,0xFD,0x1F,0xD6,0x36,0xEE,0xF1,0x93,0x76,0x7F,0x15,0xBF,0x91,0xDD, + + 0xB3,0xC4,0x6E,0x4A,0x7D,0xBD,0x62,0xBA,0xE4,0x7A,0xB8,0xC2,0x59,0xF4,0xDA,0xF9, + + 0x82,0xC5,0xC5,0xFF,0xBF,0x1A,0x37,0xAB,0xE5,0xA6,0x36,0x8F,0xEC,0xBA,0x35,0x99, + + 0x1E,0x10,0x14,0x9B,0xB2,0xBD,0x3F,0x7C,0xEF,0x2E,0xA9,0xDD,0x06,0x76,0x18,0xCC, + + 0xCF,0x1F,0x42,0xB1,0x9D,0x6C,0x06,0x94,0xCD,0xB9,0x96,0xAE,0x92,0xF1,0x95,0x2A, + + 0x82,0x6C,0x8E,0x9F,0xC6,0xB0,0x76,0x4D,0x8E,0xD2,0xF6,0xFB,0xF0,0xF9,0x4A,0x38, + + 0x22,0x93,0x14,0x4F,0x03,0xFF,0xC8,0x09,0xCA,0xD8,0x5B,0x71,0x73,0x08,0x11,0xDD, + + 0x4E,0x1C,0xA5,0x21,0x1C,0xDA,0x1F,0xBB,0x09,0xD2,0xFB,0xB8,0xFC,0xF0,0x90,0x82, + + 0x05,0x5A,0xD9,0x20,0x9F,0x22,0x80,0x52,0xBF,0xCB,0x94,0xC6,0x74,0xFB,0xC2,0xF2, + + 0x83,0x49,0xE0,0x14,0x7A,0xC5,0x4C,0x52,0xB6,0x2D,0x85,0x1A,0x60,0x9A,0x3B,0xE3, + + 0x02,0x4A,0x36,0x04,0x1D,0x2E,0xE9,0x1C,0xC6,0x51,0xB5,0xDC,0x51,0x17,0x29,0x73, + + 0xC2,0xF8,0x8D,0x15,0x12,0x2D,0xDD,0xD3,0x9D,0xB4,0xF8,0xC9,0x4D,0x23,0x19,0xD9, + + 0xA5,0x45,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0xB7,0x22, + + 0xA0,0xF8,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x21,0x01, + + 0x2C,0x0B,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x31,0x75, + + 0x85,0x15,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x7A,0x2F, + + 0xA9,0x82,0x62,0x33,0x3C,0x44,0x93,0xCB,0x4C,0xB0,0xDA,0xD7,0xDA,0x20,0xC6,0x2F, + + 0x76,0x0B,0xAD,0x8A,0x5B,0x8D,0x20,0xC2,0x94,0xD4,0x4A,0x78,0xFA,0x0C,0xF8,0xEB, + + 0xAC,0x48,0xDE,0x12,0x75,0x31,0x36,0x77,0x35,0x96,0x33,0x5F,0x7B,0x6C,0xD0,0xB6, + + 0x8F,0xFB,0x14,0xFF,0x79,0x94,0xB4,0x62,0x3C,0xF7,0xE3,0x39,0x92,0xEA,0x42,0x68, + + 0x5E,0x6C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0xED,0xFC, + + 0x0D,0x87,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x83,0x88, + + 0xA3,0x4F,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x60,0x66, + + 0xAD,0x4F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x5F,0xA4, + + 0xAF,0x12,0x24,0x77,0xBC,0x8D,0x60,0x84,0xE7,0xF7,0x54,0xE8,0xB4,0x7D,0x04,0xA6, + + 0x80,0xBE,0x43,0x64,0x3D,0x3E,0xCE,0xF6,0xCB,0x10,0x0C,0x73,0x98,0x0B,0xB2,0x80, + + 0x2D,0x14,0xFD,0xA1,0x32,0x7A,0xBD,0x07,0xE6,0x98,0x6E,0x82,0x51,0x8D,0x9E,0x82, + + 0x7E,0xE2,0x4D,0x80,0x30,0x35,0xA2,0x80,0x40,0xF2,0xFB,0xD8,0x92,0x77,0x9B,0xD0, + + 0x24,0x9E,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0xCA,0x23, + + 0x50,0x54,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0xB4,0xE5, + + 0x5F,0x97,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xE6,0xB7, + + 0xDC,0xC9,0x0E,0x8B,0x5B,0xB8,0x2E,0x98,0x77,0x1A,0xEF,0xDD,0x6F,0x6E,0x75,0x01, + + 0xD4,0xA8,0x15,0x74,0xE1,0xF6,0x43,0x50,0x32,0x19,0xC4,0xB9,0xDA,0x7F,0xB0,0xB4, + + 0x8C,0x97,0xFF,0xA9,0x59,0x95,0x50,0x17,0xEE,0xDA,0x07,0x2F,0xF9,0x02,0x71,0x9F, + + 0x48,0xC8,0xEF,0xDD,0x07,0x34,0x1D,0x9A,0xEF,0x51,0x97,0xF1,0x18,0x74,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0xA6,0x86, + + 0x6C,0x0B,0x60,0xC6,0x69,0xE1,0xF0,0xF3,0x2E,0x50,0x0F,0xE1,0x8E,0xE8,0xA9,0xEA, + + 0x01,0xB2,0x28,0xF4,0x97,0xE2,0x06,0x4F,0xC8,0x47,0x28,0x71,0xAC,0x17,0x71,0x97, + + 0x88,0xC0,0xC1,0x43,0xEF,0x29,0x42,0x0E,0x6B,0x83,0xB3,0x58,0x0E,0x1D,0x3F,0x97, + + 0x8A,0x2D,0xA3,0x93,0xD5,0x0F,0x3F,0xF3,0xC9,0x4E,0x46,0x13,0x09,0xA7,0xE9,0x47, + + 0x83,0x75,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x31,0x9C, + + 0xA0,0xC4,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0xCD,0xB3, + + 0x96,0x70,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x39,0x63, + + 0xC3,0xC5,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xD2,0x06, + + 0xE5,0x51,0xE4,0xDF,0x57,0x02,0x12,0x3E,0xA5,0x31,0x11,0x29,0xE1,0xE1,0xEA,0x57, + + 0xCC,0xCB,0x05,0x6C,0x61,0x56,0xC5,0x1E,0x4B,0xE9,0x0E,0x3C,0xB2,0xA8,0x7B,0x06, + + 0xC6,0x53,0x33,0x50,0xFD,0xCA,0x21,0xC4,0x41,0xA8,0x31,0xA2,0x25,0xE5,0x65,0x9D, + + 0x8B,0x78,0x91,0xAF,0xBB,0x5F,0x1C,0x7D,0x6F,0x85,0xE2,0x31,0x9B,0x26,0x64,0xC7, + + 0x08,0x24,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0xB5,0x4E, + + 0x09,0x07,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x09,0x6F, + + 0x0B,0xA9,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x9A,0x7F, + + 0x0A,0xA8,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x5A,0x85, + + 0x85,0x01,0xA6,0x64,0xB3,0xE5,0xC2,0x26,0x71,0x76,0x24,0x24,0xA9,0x7F,0x83,0xE8, + + 0xF8,0xD0,0x96,0x74,0x17,0x4E,0x65,0x0D,0x6D,0xB1,0x61,0xB7,0x71,0x09,0x5E,0xF8, + + 0x87,0xBD,0x35,0x05,0x96,0xD2,0x6D,0xA6,0xE0,0xB8,0x8F,0x45,0x68,0x18,0x74,0x9D, + + 0x40,0xFF,0xD2,0x15,0x97,0xD3,0xFD,0x62,0x86,0x92,0x21,0x35,0x28,0x7C,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x44,0x16, + + 0x2F,0x08,0xFC,0x8F,0x9F,0xF9,0xF6,0x6A,0x82,0x9A,0xEC,0xAF,0xDF,0x5C,0xEE,0xD6, + + 0xE9,0x44,0xE4,0x65,0x9E,0xBF,0xC9,0xBF,0x61,0x99,0x22,0xCC,0x4E,0x29,0x7E,0x85, + + 0x49,0x5A,0xC7,0xCE,0x49,0xB7,0xBE,0x38,0xCD,0xBA,0xFF,0x7A,0xF8,0x02,0x57,0xBC, + + 0x50,0x94,0xA3,0xE4,0x1C,0x33,0x71,0x4B,0xEB,0xB1,0x47,0x57,0x29,0x34,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x90,0xE4,0xA8,0x30, + + 0x85,0x31,0x40,0xA1,0x4B,0x24,0x49,0xF3,0xE7,0x25,0xF0,0x26,0xCE,0x6D,0x32,0xF8, + + 0xF0,0x4E,0x5C,0x4A,0x82,0x1E,0xA0,0xCB,0x72,0xF6,0x35,0x5D,0xF2,0xEC,0xA9,0x29, + + 0x05,0xE3,0x87,0x42,0xBE,0xFE,0x29,0xC9,0x03,0x0D,0xDB,0x38,0x90,0x64,0x08,0xF7, + + 0xB2,0x26,0xD4,0x36,0x3E,0xFE,0xD9,0x94,0x73,0x58,0x66,0x4A,0xA2,0x63,0x80,0xE5, + + 0x07,0x02,0x48,0x74,0xF3,0x2B,0x30,0x24,0x05,0xCF,0xD7,0xE0,0x7C,0xEE,0xC0,0xD2, + + 0x0A,0xBA,0x7C,0x44,0xB0,0x23,0x91,0x92,0xC1,0x0D,0x65,0xF6,0x56,0x87,0x4D,0xB2, + + 0x84,0x65,0x75,0xA7,0x10,0x2E,0xD5,0x83,0x40,0x0E,0x0E,0x15,0xD4,0x0C,0x89,0xF4, + + 0x86,0x01,0x41,0x39,0x72,0x28,0x41,0x81,0xBC,0x48,0xE1,0x8A,0x12,0x05,0xF8,0xE0, + + 0xC6,0xC3,0xC7,0xEB,0x2B,0xD0,0x7C,0x4E,0x7B,0xB0,0x4F,0x2D,0x38,0x0E,0x53,0x93, + + 0xEE,0x12,0x75,0xDB,0x2A,0x4C,0x37,0x59,0xE8,0xD6,0x63,0xB8,0x51,0x3F,0x83,0x01, + + 0xEF,0x10,0x3B,0xF3,0x88,0x67,0xD3,0x8C,0x7A,0x4C,0xEE,0x57,0xBA,0x6E,0xEC,0x2F, + + 0xB4,0xA6,0x33,0x82,0x6C,0xA2,0x7B,0x3B,0x6D,0x46,0xE0,0xED,0x95,0x62,0x4E,0x4E, + + 0xAB,0x84,0xA2,0x0D,0x9E,0x21,0xE6,0x98,0xB5,0x43,0x16,0xBC,0x56,0x6F,0x9E,0xD6, + + 0x48,0xB2,0xCE,0xD8,0x35,0x7B,0x10,0xC7,0xE8,0x4B,0xDE,0xF8,0x75,0x15,0xC3,0xAB, + + 0x6B,0x4C,0xC9,0x49,0x39,0xA5,0x33,0xC9,0x76,0x43,0xEB,0x79,0x58,0x26,0x33,0xDB, + + 0x8E,0x56,0x81,0xA6,0x9D,0x4C,0xD3,0xBC,0x6A,0xC7,0x64,0x2F,0xD5,0x0D,0xD4,0xF3, + + 0x49,0x91,0x03,0x75,0x93,0x60,0xC0,0xFE,0x4E,0x8C,0x94,0x20,0x78,0x17,0xAB,0x72, + + 0xC1,0xEE,0x21,0xE8,0x92,0x37,0xE0,0xCE,0x7B,0x3E,0x27,0x11,0x86,0x8C,0xFE,0x7E, + + 0x49,0x3B,0xB7,0xB5,0xA4,0x34,0x7C,0x4A,0xDB,0x85,0x2A,0x94,0x51,0x8D,0x54,0x7A, + + 0x48,0x1C,0xAD,0x0F,0x10,0x35,0x44,0x0A,0x44,0xAC,0x8F,0x35,0x1A,0x08,0x84,0xA2, + + 0x63,0x54,0x94,0xF1,0x91,0x32,0x34,0xA4,0xEA,0x59,0xB4,0xA0,0x2A,0x36,0x34,0x52, + + 0x26,0x94,0xB3,0x36,0xB1,0x1D,0x0C,0xDF,0xC2,0xDF,0x96,0xDE,0x8E,0xD4,0x3D,0xA3, + + 0xE3,0x96,0xC9,0xAB,0x13,0xBC,0x1F,0x1A,0x41,0x50,0x01,0xA8,0xD6,0x34,0x17,0xD0, + + 0x00,0x11,0xF0,0x51,0x9D,0x7F,0xAA,0x13,0x61,0x1F,0xE5,0xC5,0x87,0xD8,0xFE,0x80, + + 0xD5,0x57,0x2B,0xF1,0x9B,0x35,0x17,0xCE,0x5B,0x1D,0x2D,0x1C,0xC6,0xD7,0xE0,0x75, + + 0x35,0x94,0x8C,0xE3,0x78,0x30,0xE6,0xC3,0x96,0x42,0x38,0xCE,0xDA,0x7F,0x97,0x75, + + 0x7D,0xE1,0x78,0x5D,0x1B,0x31,0xB8,0x4F,0xF8,0xA7,0x4E,0x89,0x7A,0x32,0x70,0x1D, + + 0xE2,0xCE,0xF7,0x1F,0x39,0x6D,0x2F,0xCB,0x4E,0x4B,0x93,0xC3,0x58,0xF1,0x4E,0xAF, + + 0x89,0x1A,0xA6,0x88,0x3E,0x31,0x4E,0x18,0x6B,0x53,0x76,0x9E,0x18,0xD4,0x2E,0x98, + + 0x85,0x12,0x46,0xC8,0x9A,0xB7,0x9E,0x28,0x63,0x5B,0x25,0x0C,0x73,0x1B,0x4F,0xEE, + + 0x4B,0x11,0x8D,0x36,0x19,0x38,0xE3,0x19,0xE6,0x51,0xA9,0xEA,0x1B,0x18,0x2F,0x99, + + 0x0D,0x12,0xB0,0x3F,0x39,0x77,0x57,0x7D,0x4A,0xD5,0x20,0x8F,0x00,0xC2,0xBD,0x45, + + 0xC6,0xC3,0x80,0xF5,0xB7,0xB2,0x28,0xA6,0x42,0xA3,0x32,0x5C,0xB7,0xE9,0x12,0xE1, + + 0x76,0x9A,0xD0,0x56,0x5D,0x7C,0xEC,0x6C,0x6B,0x1D,0x21,0x0B,0xBE,0xA5,0x69,0x07, + + 0xE3,0xC1,0x19,0x77,0x14,0x04,0x7E,0x21,0x8C,0xAE,0x31,0xE1,0xA0,0x69,0xC8,0xE5, + + 0x00,0xD2,0x51,0x1F,0x68,0xEC,0x50,0xD8,0xFE,0xC9,0x83,0x87,0x48,0x4C,0x3A,0x43, + + 0xA5,0x82,0x17,0x16,0x17,0xAB,0xF0,0x80,0xE7,0x4C,0x34,0xB6,0x5E,0xE7,0xE8,0xB0, + + 0xA6,0x0D,0x88,0x12,0xDB,0x2E,0x65,0x82,0x4F,0xCA,0xFE,0xF2,0x79,0x9D,0x69,0xC6, + + 0x27,0x0E,0xD9,0x97,0x29,0xA9,0x75,0x81,0x44,0x8E,0xC9,0x73,0x54,0xAE,0x6B,0xB1, + + 0x05,0x8F,0xED,0xB5,0x15,0xA4,0x19,0x37,0xB6,0xC8,0x99,0x33,0x91,0xEA,0x7B,0x85, + + 0xEB,0x93,0xC2,0x0C,0xD2,0xA5,0xCE,0x54,0x56,0xA7,0x16,0x54,0xFF,0x18,0x73,0x84, + + 0xEA,0xC5,0xB4,0xFC,0x9F,0xAD,0x22,0xBE,0x4B,0xAA,0xA6,0x01,0x74,0x32,0x9A,0xED, + + 0x9C,0xC5,0xE9,0x12,0x1E,0xD6,0x53,0x29,0x64,0xC7,0x44,0x3F,0x1B,0x48,0x38,0xF3, + + 0x57,0x40,0x4D,0x7D,0x5C,0x21,0x74,0x39,0x85,0xA7,0xBB,0x04,0xB4,0x70,0xA2,0x28, + + 0x4F,0xAC,0xE4,0x3C,0xBD,0xAA,0x12,0x2E,0x72,0xC3,0x0D,0xCE,0xFF,0x2C,0x7A,0xB8, + + 0xAE,0x05,0xBA,0xC7,0xBC,0xAB,0x40,0x98,0xCD,0x85,0x2E,0x33,0xA2,0x81,0x1B,0x6C, + + 0x2F,0x06,0xB3,0xE6,0x3D,0xA8,0xE3,0xE9,0xCB,0x57,0x93,0x2B,0xC6,0xAC,0x63,0xB9, + + 0x0D,0x87,0xBB,0x52,0x3C,0xA9,0x66,0xFF,0xE1,0x1C,0x3F,0xDF,0x7E,0x2F,0x1E,0x00, + + 0xBD,0x30,0x9C,0xD4,0x77,0x40,0x8B,0x44,0xE6,0xD4,0xCB,0x44,0xF6,0xD8,0xBF,0x7A, + + 0xE2,0xDE,0xD4,0x14,0xB5,0xE7,0xFC,0x17,0x3E,0xD5,0xC4,0x34,0x7C,0x3E,0x5D,0xC5, + + 0xD8,0xDE,0xA7,0x05,0x29,0x7B,0x07,0xC1,0xC5,0x90,0x4D,0xC5,0xB7,0x4D,0x4D,0xDC, + + 0x86,0x9C,0x95,0x47,0xE9,0x33,0x3B,0xF4,0xCB,0x0F,0x85,0x67,0x0E,0xFC,0x2E,0xDF, + + 0x67,0x95,0x65,0xA4,0x75,0x0B,0x89,0x00,0xC7,0x5E,0x58,0x75,0x0B,0xFE,0x57,0x30, + + 0x8B,0x28,0xD4,0x06,0xCC,0xBA,0x36,0x4D,0xC4,0xD8,0xA6,0xD6,0x0F,0xB7,0x1D,0x41, + + 0xA7,0x91,0x9D,0x45,0xB3,0x66,0x0A,0x01,0x4A,0xDB,0x33,0x63,0xD8,0x93,0x15,0x51, + + 0xA6,0x75,0x8D,0x93,0xBF,0xF5,0x37,0x2C,0x44,0xD1,0x29,0xBC,0xF1,0x94,0x46,0x88, + + 0x79,0x95,0xC6,0xC1,0x51,0xB7,0xE2,0xF4,0xFF,0xE7,0xD6,0xEF,0x8B,0xF5,0x7E,0x9E, + + 0x05,0x37,0x84,0x4E,0x61,0x39,0x7B,0x5D,0xEF,0xDD,0xB2,0xC5,0x7B,0x9A,0xE3,0x0D, + + 0x8E,0x9B,0xC7,0x8D,0x22,0xB7,0x6A,0x8C,0x43,0x07,0xFD,0x54,0x5F,0xFC,0x4F,0x99, + + 0x3F,0x96,0xCF,0xD0,0x8C,0xB4,0x8B,0xD9,0xCC,0x99,0xF5,0x3D,0xF4,0xD4,0xD9,0x28, + + 0xAC,0xD4,0x32,0x1E,0xBC,0xF4,0x7E,0x6E,0xCF,0x56,0x42,0x9D,0x03,0x4D,0x16,0x58, + + 0x2A,0x99,0x8E,0x9A,0x27,0xFF,0x34,0x15,0xCC,0xD0,0xD3,0xE7,0xFF,0x90,0x43,0xA9, + + 0xEF,0xBE,0xE1,0x4B,0x90,0x34,0x8C,0x09,0x42,0xD3,0xE5,0xCF,0xF8,0x9D,0x57,0x8B, + + 0x2F,0x90,0x3B,0x0F,0x3D,0xF7,0x35,0x00,0x4C,0xD9,0x6F,0x8D,0xCC,0x0D,0xF8,0xA0, + + 0x58,0x90,0x4F,0x66,0x51,0x00,0x49,0xB4,0xE5,0xBF,0xA8,0x74,0x54,0x6F,0xA4,0x82, + + 0x4B,0x09,0xB0,0x44,0x10,0x2E,0x50,0x74,0x47,0x22,0x25,0xB6,0x3F,0xE0,0x61,0x56, + + 0x45,0x0F,0xF9,0x87,0xB2,0x57,0x2F,0x80,0x4D,0xB4,0x4E,0xCB,0xD6,0x08,0x8D,0xE1, + + 0x89,0x4C,0xE9,0xB5,0xD9,0x2E,0x07,0x76,0x03,0xE1,0xA3,0xD7,0x7D,0xE8,0x20,0x6F, + + 0x14,0x09,0xCA,0x40,0xB1,0xD3,0x68,0x64,0x0A,0x55,0xA8,0x43,0xF1,0xDF,0x70,0xE2, + + 0x29,0x75,0x58,0x2A,0x6F,0xDA,0xDE,0x50,0xE2,0x05,0xF8,0xF0,0x10,0x8F,0x33,0xE8, + + 0x80,0x63,0x3E,0x40,0xED,0xD9,0xEE,0x33,0xCC,0xCC,0xD7,0x98,0xC4,0xBD,0xFD,0x33, + + 0x61,0xA4,0x59,0xA8,0xF2,0x65,0x5F,0x58,0x08,0xA6,0x66,0x87,0x93,0x61,0x52,0x8C, + + 0x47,0x4A,0x88,0x04,0xBB,0x4D,0x5A,0x39,0x4E,0x2B,0x6D,0xCE,0xF4,0xE3,0x32,0x29, + + 0xA8,0x88,0xDA,0x11,0xB8,0xA3,0xB6,0xAA,0x75,0x43,0x65,0xDE,0xDB,0x6A,0x49,0x23, + + 0x75,0xAB,0xD9,0x10,0x3B,0x2C,0xCF,0x2B,0xCE,0xB7,0x15,0xCF,0x74,0xE1,0xD9,0xEA, + + 0x0D,0x86,0xF3,0xFF,0x1B,0x28,0x5B,0x07,0xE7,0xEB,0x0B,0x4F,0x7A,0x6D,0xC0,0x6F, + + 0xAB,0x85,0x0E,0x23,0x98,0x64,0xEF,0xEA,0x43,0x73,0xF2,0xF1,0xF9,0x2D,0xB1,0x7C, + + 0x89,0x29,0x80,0x41,0x3F,0xA0,0x56,0x83,0x4D,0x2E,0xDA,0x7C,0x5B,0x6D,0x48,0x29, + + 0x8E,0x0A,0x05,0x2F,0x65,0xA2,0x93,0xCC,0xD7,0x48,0xD3,0x6D,0xDA,0x6E,0x43,0xA9, + + 0xB1,0x00,0xB5,0x68,0x19,0x2B,0xD6,0x88,0xA7,0x1F,0xDB,0x7D,0xDB,0x6F,0xF9,0x70, + + 0xDB,0xB1,0xFD,0x66,0xB2,0xD3,0x0A,0x24,0x4E,0x3B,0x90,0x19,0x43,0xB6,0x32,0x31, + + 0x49,0xE8,0xF4,0x16,0x34,0x38,0x1A,0x11,0xE1,0x4C,0xDC,0xD6,0x8E,0xF8,0x51,0x05, + + 0x8E,0x7C,0x51,0xE7,0xF3,0xCC,0x6B,0xA6,0x1D,0x5D,0x4F,0xED,0x72,0x07,0x1F,0x6A, + + 0xA7,0x70,0xB7,0x77,0x1D,0x3C,0x8D,0x33,0xE0,0x31,0x17,0x55,0xE4,0x75,0x3A,0xC6, + + 0xC3,0x97,0xC1,0xE1,0x34,0xFE,0x1E,0x1E,0xC1,0xAF,0xD4,0xE4,0x72,0x74,0x34,0xAF, + + 0x00,0x48,0xAE,0xD0,0x30,0xB5,0x25,0x90,0x6B,0xA5,0xDC,0xF4,0x73,0x75,0x65,0x32, + + 0x2E,0xCB,0xC7,0xB6,0xDE,0x5A,0xAA,0x92,0xD2,0xDC,0xD5,0xE5,0xF2,0x76,0xDD,0xA3, + + 0x48,0x06,0xCB,0xE0,0x33,0x09,0x63,0xDD,0xA0,0x48,0xDD,0xF5,0xF3,0x77,0xEA,0xB7, + + 0x0A,0xCD,0xE6,0xC8,0x6F,0xB8,0x2E,0x78,0x93,0x57,0x23,0x28,0xD9,0xA7,0x19,0x70, + + 0x21,0x5B,0x0E,0x7E,0xBB,0x71,0xCA,0x07,0x2A,0x26,0x2B,0x2C,0xD8,0x80,0x90,0xB2, + + 0xDC,0x8F,0xFF,0xAA,0x19,0xB2,0x2F,0x79,0x57,0x18,0x28,0xD1,0x07,0x7C,0x0D,0xCC, + + 0x75,0x18,0x56,0x6D,0xB1,0x34,0x67,0x3B,0xCB,0x59,0xC7,0x10,0x7B,0x0E,0x38,0xE1, + + 0xC1,0x4D,0x06,0x90,0x3B,0x38,0x4E,0xEC,0x36,0xAC,0xD6,0xEC,0x7A,0x7C,0xC2,0xBA, + + 0x68,0xC2,0x40,0x24,0x87,0x86,0x46,0xE0,0x8A,0x82,0xDE,0xFC,0x7B,0x7D,0x39,0xE4, + + 0x28,0x56,0x7E,0x31,0x3A,0xC5,0x69,0xC0,0xA9,0x41,0xD7,0xED,0xFA,0x7E,0x37,0x5B, + + 0xA2,0x40,0x8F,0x30,0x01,0x7D,0x61,0xD4,0xA8,0x40,0xDF,0xFD,0xFB,0x7F,0x72,0x53, + + 0xEF,0xE4,0xE4,0xF6,0x4E,0xE2,0xE4,0xD2,0x87,0x11,0xB8,0x6E,0x14,0xEF,0x78,0x0C, + + 0x79,0x35,0x62,0x64,0xB6,0xA7,0x16,0xC1,0xC9,0x3C,0xDE,0x44,0xAA,0xA1,0xE1,0x13, + + 0x4C,0x76,0x75,0xBB,0x16,0xEA,0x4F,0x25,0x25,0x41,0x8B,0xD8,0xD2,0x68,0xBA,0x09, + + 0xFD,0x0E,0x21,0xDB,0x36,0xA5,0x41,0x22,0xEF,0xC7,0x75,0x57,0xD3,0x6A,0xD4,0xB2, + + 0x2C,0x8B,0xE8,0xB6,0xE9,0xAB,0xB0,0x17,0x1E,0xC7,0xF0,0x66,0x56,0xE4,0xDC,0xA2, + + 0x56,0x8A,0x90,0xD2,0x39,0x50,0xC7,0x20,0x49,0x4F,0xF8,0x76,0x57,0xE5,0xD5,0xB3, + + 0xEC,0x89,0xDB,0xC5,0x16,0x4E,0x49,0x67,0x8E,0x97,0xF1,0x67,0xD6,0xE6,0xDD,0xA3, + + 0xA2,0x88,0x32,0x35,0x91,0x87,0xFF,0xD3,0x66,0x87,0xF9,0x77,0xD7,0xE7,0x5C,0xAB, + + 0xE5,0xAB,0x2A,0xFB,0x7F,0xD9,0x9D,0x58,0xA7,0xEB,0x9D,0xD3,0x3B,0x33,0x7E,0x69, + + 0x2F,0x03,0x92,0xCE,0xD0,0x21,0x04,0x9B,0xC0,0x3F,0x67,0x3F,0x5B,0x8A,0x8F,0x98, + + 0xF1,0x80,0xDB,0x8D,0xBD,0x5B,0x6A,0xBF,0x69,0x35,0x33,0x2B,0xD3,0x02,0x2F,0xE4, + + 0x70,0x0B,0xAA,0xFD,0x3C,0x21,0x73,0x27,0xCB,0xA8,0xCF,0xC3,0x5E,0xA9,0xD6,0xBA, + + 0x0C,0x83,0x35,0x08,0x06,0x77,0x74,0x47,0x85,0x2D,0xF2,0x6E,0x5E,0xEC,0x0A,0x0A, + + 0xF4,0xEB,0x9F,0xDA,0x5C,0x47,0x42,0xAA,0xB8,0xC2,0xFA,0x7E,0x5F,0xED,0xBC,0xCF, + + 0xD0,0x73,0x56,0xB2,0x9C,0x15,0xCE,0xE9,0xC7,0xF1,0xF3,0x6F,0xDE,0xEE,0x90,0xAB, + + 0x8F,0x7E,0x54,0x3F,0xD9,0xAE,0x1B,0x3A,0x34,0xC2,0xFB,0x7F,0xDF,0xEF,0x87,0xBF, + + 0xFC,0x41,0xC4,0xC2,0x0F,0xBF,0x6E,0xBF,0xC7,0xD6,0xF0,0xC4,0x8B,0x79,0x0C,0xD8, + + 0xC4,0x3E,0xD4,0x14,0x30,0x6A,0x44,0xE2,0x29,0xDE,0x09,0x33,0xD4,0x2E,0x06,0xBA, + + 0xEC,0xB1,0xC5,0xC3,0xCB,0x3F,0x65,0x8D,0x45,0x58,0x39,0x47,0xD2,0xF4,0xFD,0x60, + + 0x8B,0x48,0xAF,0x75,0x37,0xFB,0x5D,0x13,0xAF,0x58,0x02,0xCB,0x0A,0xF5,0x5C,0x12, + + 0xDD,0x9B,0x6B,0x57,0x30,0xAD,0x6C,0xF7,0x11,0xB4,0xF4,0xE6,0x76,0xF4,0x66,0xD6, + + 0x84,0x93,0xDA,0xB4,0xB5,0xB1,0xEC,0x8D,0x06,0x95,0xFC,0xF6,0x77,0xF5,0x05,0x82, + + 0x1D,0x9B,0xE5,0xE3,0x34,0xB2,0x55,0xE6,0x99,0x29,0xF5,0xE7,0xF6,0xF6,0x61,0x2D, + + 0x06,0x1D,0x2C,0x35,0x35,0xB3,0x65,0xF6,0x1A,0xDC,0xFD,0xF7,0xF7,0xF7,0x08,0x77, + + 0xDA,0xE3,0x86,0xEC,0x7F,0x46,0x32,0x48,0xEE,0xDB,0x03,0x3F,0xDD,0x01,0x60,0xA4, + + 0x0F,0x29,0x96,0x4E,0x82,0xB6,0x5E,0x1A,0x3D,0x52,0x05,0x48,0x86,0x02,0x34,0x72, + + 0x53,0xD8,0xDF,0x0D,0xD2,0xD9,0xF3,0x5B,0xA0,0xD5,0xEF,0x8A,0xCF,0x3C,0x7D,0xE9, + + 0x46,0xB8,0x97,0xCF,0xB5,0xB4,0xBB,0x59,0x6F,0x93,0xBB,0x3B,0xB3,0x7E,0x19,0x28, + + 0xAC,0xB4,0x54,0xAC,0xBC,0xB8,0xF0,0x68,0x67,0xE3,0xF6,0xEE,0x7E,0xFC,0x16,0x2B, + + 0x43,0xCD,0x31,0xBC,0xBD,0xB9,0xC5,0x08,0x4E,0x3D,0xFE,0xFE,0x7F,0xFD,0x18,0xA9, + + 0xEF,0xDE,0x22,0x2D,0x3C,0xBA,0x4F,0xBB,0xEA,0xD1,0xF7,0xEF,0xFE,0xFE,0xAF,0xAE, + + 0xF7,0x9E,0xAC,0x3D,0x13,0x32,0x1F,0xBA,0x14,0xD2,0xFF,0xFF,0xFF,0xFF,0xA8,0xA4, + + 0xE1,0x06,0x19,0x66,0x53,0x2C,0xDD,0xCD,0x32,0xFB,0x77,0x46,0x91,0xEA,0xA2,0x83, + + 0xA2,0xDA,0x0C,0xFC,0xA3,0x6E,0xC3,0x7B,0x3E,0x0C,0xD2,0xD6,0x39,0x6C,0x2C,0x32, + + 0x23,0x04,0xAB,0x80,0x9E,0xA8,0xEE,0xA5,0x8B,0x97,0x16,0x45,0x80,0x6F,0xA0,0xEC, + + 0x7D,0x78,0x31,0x85,0xB0,0xF3,0xC4,0x89,0xBA,0xBC,0xC4,0x6C,0x7E,0xEE,0x20,0x0E, + + 0x90,0x46,0x88,0x75,0xB3,0xAC,0x74,0x94,0xC2,0xE9,0xB0,0x66,0x47,0x69,0xF0,0xAA, + + 0x13,0x48,0x17,0x01,0x68,0x32,0x44,0x98,0x05,0x0A,0x20,0x0F,0x43,0x2A,0x95,0x3F, + + 0xB1,0x4C,0xE1,0xA7,0xE5,0x22,0x0D,0x50,0xE5,0xE9,0xAE,0x1B,0xE1,0x7E,0x36,0x0E, + + 0x3E,0xFB,0x09,0x85,0xDC,0xDA,0x49,0x68,0xD3,0xE8,0xB9,0x77,0x84,0x6A,0xCB,0xF1, + + 0xF7,0x4A,0xC0,0x6C,0x1E,0xA9,0xD2,0xF9,0xBC,0x93,0x46,0xA5,0xF7,0x73,0xFD,0xFE, + + 0x8C,0xFB,0xFB,0xEC,0x6E,0x66,0x9D,0x4A,0xB2,0x0B,0x22,0xC3,0xD6,0x72,0x4D,0x37, + + 0x69,0x11,0x03,0xED,0xD2,0x31,0xBA,0xD4,0x1E,0x31,0x37,0x4B,0x2F,0x7A,0xE3,0x05, + + 0x0E,0x3B,0xAB,0x98,0xAA,0x3C,0x55,0x07,0xBE,0x97,0x57,0x5B,0x07,0x79,0xE9,0x26, + + 0xDF,0x4E,0xB8,0x5C,0x98,0x28,0x0E,0x1A,0xA1,0x07,0xB2,0x3A,0x2E,0x63,0x8E,0x06, + + 0x05,0x13,0x91,0x5C,0x64,0x35,0x7A,0x04,0xEA,0xB2,0xBA,0x2A,0x27,0x62,0x97,0x3E, + + 0x5F,0x62,0x3C,0xAF,0xE1,0xB4,0x0A,0x6A,0x2D,0x48,0xB3,0x6F,0x85,0x63,0x36,0xDB, + + 0x12,0xAB,0x10,0x5F,0x9D,0x25,0x9F,0xFC,0x88,0xBD,0xBB,0x7F,0xFA,0x62,0x80,0x66, + + 0x57,0x34,0xE4,0x86,0x3B,0x3D,0x07,0xB4,0x89,0xC1,0x95,0xDB,0xD7,0x6B,0x53,0xD8, + + 0x1E,0x91,0x73,0x10,0x51,0x1B,0x64,0x58,0x34,0x1E,0x24,0x4F,0xF3,0x4D,0xDA,0xD5, + + 0xD3,0x16,0xDC,0x83,0x17,0xBF,0x17,0x5E,0x21,0xD8,0x31,0xC3,0x03,0x62,0xCD,0xCC, + + 0xEB,0xC8,0xD4,0x92,0x50,0x7C,0x7D,0xB3,0xBC,0x5E,0x05,0xCF,0x52,0x16,0xFF,0x22, + + 0x8E,0xE9,0xA6,0xBE,0xDB,0x2D,0xF8,0x73,0x45,0x5C,0x9E,0xF9,0x12,0xD4,0x97,0x87, + + 0x5C,0xD9,0xAC,0xD7,0x33,0x38,0x7C,0xF5,0xAB,0x1E,0x23,0x1C,0x7B,0x3A,0x3D,0x45, + + 0xCF,0xDF,0xA7,0xD5,0xB3,0x66,0x53,0xF2,0xC9,0xC7,0x8C,0x79,0x55,0x3B,0x16,0xD3, + + 0xD8,0xB9,0xD5,0xD1,0xBB,0x7F,0x4E,0x82,0x93,0xF6,0xE7,0x1D,0xAF,0x38,0x22,0x75, + + 0x79,0x63,0x87,0x7C,0x39,0x77,0x3C,0x78,0x34,0xD8,0xA9,0x4E,0x4B,0x32,0x40,0xA6, + + 0x2F,0xB0,0xC4,0x81,0x18,0x99,0xE5,0xC8,0x61,0x50,0x4A,0x67,0x4A,0xE1,0x5D,0xFB, + + 0x53,0x58,0xE7,0x8F,0x6E,0x37,0x4E,0x1E,0x4F,0x17,0xF7,0xE3,0x00,0x38,0x7E,0x1D, + + 0xA6,0xAA,0xD2,0x8F,0xBF,0x58,0x5D,0xCA,0x99,0xDA,0xFF,0xF3,0x2B,0x39,0x9B,0xE4, + + 0x2C,0xE4,0xE6,0x3A,0xD3,0x95,0xC9,0x78,0x81,0xCD,0x69,0x1D,0xD9,0x8F,0xD8,0x20, + + 0xAB,0xA6,0x32,0xB6,0x53,0x30,0x07,0xE7,0x8C,0x1F,0x1E,0x38,0x94,0x7B,0x01,0x35, + + 0x7F,0xE5,0xBE,0xBF,0x81,0x2A,0x71,0x94,0x49,0xDA,0xE5,0x12,0x0E,0x71,0xB9,0x34, + + 0xFD,0x5D,0x8A,0x3A,0x52,0x16,0x47,0x28,0x69,0x23,0xD7,0x4A,0x98,0x5F,0x79,0xAD, + + 0xA3,0x9B,0xFA,0xCA,0xB3,0xA4,0xEF,0x53,0x7B,0x30,0x08,0xB8,0x57,0xD0,0x56,0xDB, + + 0x36,0xCD,0x7A,0xF0,0x95,0x01,0x8B,0xB0,0xC5,0x39,0x40,0x44,0x23,0xF3,0x54,0xE5, + + 0x94,0xCD,0xA2,0xEF,0x26,0x29,0x0B,0xD8,0xC2,0x68,0x0E,0x17,0xD6,0xF2,0xD1,0xE0, + + 0xD6,0xCF,0xF0,0xBD,0x7C,0xFA,0x01,0xE3,0x99,0x6C,0x41,0xDF,0xD2,0xAE,0xA0,0xE7, + + 0xF3,0x29,0x69,0xC4,0x9E,0xE4,0x0E,0x1F,0x66,0x86,0x90,0x30,0x74,0xEB,0x52,0xF7, + + 0xF0,0x9E,0xC8,0x2A,0xB6,0xC6,0x46,0x93,0xC8,0x63,0x98,0x20,0x97,0xEA,0x72,0x73, + + 0xC6,0x79,0x21,0x57,0x6E,0xA0,0xF6,0x70,0xE1,0x3F,0x91,0x65,0xFF,0xEB,0x62,0x35, + + 0x74,0x97,0x09,0x57,0x7E,0x8E,0xA1,0x33,0x9B,0x63,0x51,0x48,0x52,0x85,0xE4,0xE2, + + 0x8D,0xC7,0x5A,0x8C,0x9C,0x12,0x21,0xCA,0x04,0x63,0x49,0x26,0xF9,0x17,0x82,0x1F, + + 0x3E,0x89,0x86,0xF8,0xB8,0xA2,0x04,0x02,0xC2,0x4F,0x5D,0xB6,0xF8,0x3F,0x8B,0x8A, + + 0x09,0x6A,0x9B,0xDF,0xC0,0xB1,0x20,0x2A,0x4C,0x9A,0x1F,0xC7,0x85,0xA7,0xD3,0xF3, + + 0xED,0x00,0x2F,0xEF,0xDD,0xE4,0xB9,0x7B,0xC1,0x60,0xF3,0x2E,0x28,0xA4,0xDA,0xB1, + + 0x08,0xEF,0xC4,0x3F,0xBD,0x29,0x2E,0x17,0xCE,0x9C,0x32,0x3B,0xF8,0x61,0xC1,0xDF, + + 0x9C,0xB2,0xF7,0x0F,0x2E,0xA4,0xFF,0x3A,0x43,0x66,0x02,0x96,0xD2,0xA2,0xDD,0x15, + + 0x03,0xEC,0xC5,0xAD,0xAF,0x01,0x4D,0x16,0x41,0x48,0x8D,0x8F,0xED,0x6E,0x94,0xD9, + + 0x16,0x26,0x6E,0x98,0x76,0x96,0xE4,0x76,0x26,0xE4,0x9B,0x7D,0x98,0xE2,0x44,0x80, + + 0x7D,0x9D,0x84,0x6E,0x33,0x3D,0x30,0x59,0x85,0xB3,0x60,0x7D,0xF6,0xF4,0xE8,0x14, + + 0x63,0x97,0x54,0x14,0xB5,0x47,0x07,0xC2,0xE5,0xCE,0xF6,0xAB,0x9E,0x60,0xE1,0x06, + + 0xE7,0x61,0x5D,0x8F,0xD7,0xB9,0x4E,0xDD,0x6B,0x64,0x85,0xC5,0x0B,0x7E,0x0D,0xCB, + + 0x04,0x88,0x95,0x47,0xE9,0xBA,0x67,0xB1,0x77,0xDB,0xAF,0xA7,0x4A,0x7E,0xEB,0x53, + + 0xA4,0x90,0x9D,0xB4,0x0D,0xE0,0xEB,0x80,0x99,0x58,0x8C,0x64,0x77,0x83,0x12,0x33, + + 0x86,0xF6,0xA9,0x31,0xB5,0xB1,0x84,0x76,0x46,0xD5,0x9C,0x56,0x7B,0xFA,0xFD,0xA1, + + 0xE5,0x64,0x19,0xAD,0xDE,0xBB,0x3F,0xFE,0xD5,0xE8,0xCF,0x05,0x73,0xA3,0x8D,0x57, + + 0x0B,0x9A,0xE0,0xB5,0x40,0xB1,0x1D,0xF1,0x92,0xDA,0x9D,0xF5,0x8C,0xFA,0xD4,0x6C, + + 0xAE,0x9C,0xA0,0x67,0x33,0xFA,0x34,0x42,0x82,0x25,0x62,0x40,0xA1,0x85,0x64,0x27, + + 0x23,0xDF,0x94,0x78,0x2D,0x32,0x06,0x6A,0x31,0x78,0x00,0xE0,0xF0,0x9B,0xAC,0xE9, + + 0xA2,0xF8,0x73,0x8D,0x8F,0x22,0xCF,0x29,0x6C,0xD0,0x18,0x51,0xFA,0x99,0x3F,0x67, + + 0x38,0x60,0x87,0x79,0x3F,0xBF,0x07,0x8A,0x4C,0x74,0x14,0x3A,0x6E,0xC4,0x2C,0x57, + + 0xC5,0xD7,0xC6,0x86,0x9F,0x03,0x66,0x9D,0x0C,0xC7,0x22,0x68,0x62,0xFF,0x69,0xFD, + + 0x8E,0x17,0xD1,0xD6,0x98,0xBB,0x1C,0xE2,0x6C,0xAC,0x69,0x9C,0x9C,0x02,0x5F,0xED, + + 0x47,0xD8,0x5C,0x27,0xF7,0xF1,0xB5,0x8D,0x11,0xB0,0x72,0x2F,0x7C,0xFA,0xE8,0x28, + + 0xC6,0x84,0xCF,0x92,0x1E,0x60,0xC0,0xBC,0x25,0x76,0x9F,0xFD,0x8B,0xF2,0x9F,0xE0, + + 0x58,0x0D,0xCA,0x19,0x78,0x2D,0x49,0xA9,0xA9,0x31,0x80,0xA6,0xD0,0x8B,0x4C,0x04, + + 0xA0,0x6D,0x70,0x96,0x91,0x25,0xD8,0x55,0xBA,0x03,0xE0,0x56,0xDC,0xE7,0xC5,0x87, + + 0x8A,0x01,0x97,0x67,0xA3,0x83,0xE9,0xA5,0x8C,0x4E,0xA9,0xA7,0x45,0x38,0xCD,0x94, + + 0x07,0xE3,0xB1,0x97,0x58,0x74,0x90,0x84,0xC7,0x2A,0x18,0xF5,0xDD,0xE8,0x6E,0xBA, + + 0xA1,0x1F,0xC4,0xAC,0x9A,0xAF,0xD1,0x47,0xE3,0x4D,0xA8,0x99,0x74,0x26,0x11,0xC0, + + 0xA4,0x15,0xE8,0x68,0xB0,0x67,0x02,0x71,0xE0,0x04,0xDA,0xF6,0x56,0x87,0x81,0xA7, + + 0x92,0x49,0x45,0xA3,0x73,0x20,0xD3,0xE3,0x5B,0xCF,0x1D,0x0A,0xD4,0xAC,0xB1,0xD3, + + 0x4A,0x70,0xD0,0x55,0xB7,0xAA,0x39,0x73,0xB6,0x4A,0xE1,0x8A,0x5E,0x05,0x62,0x0A, + + 0x2E,0x05,0xFA,0x6E,0x95,0xAE,0xBC,0x0E,0x4E,0xC5,0x88,0xCE,0x2F,0x74,0x74,0x35, + + 0x8B,0x0D,0x75,0xFE,0x2A,0x5B,0xE5,0xD0,0x17,0x04,0xA0,0xC7,0x5F,0xC3,0x7D,0x25, + + 0x24,0x07,0x02,0xCD,0x94,0xA1,0xC7,0xC1,0x40,0x82,0x4C,0x42,0x64,0x43,0xD2,0x7B, + + 0xBA,0x19,0x33,0xAF,0x66,0x4B,0xE0,0x6B,0xE7,0x28,0x28,0xBF,0x59,0xE5,0x3A,0xB4, + + 0x9B,0xF7,0xA2,0x4F,0x1A,0x23,0x42,0x1F,0x63,0x0E,0xC2,0x0E,0xFB,0x6A,0x35,0xB5, + + 0xCD,0x4F,0x35,0xBE,0x1D,0xE4,0x9A,0x79,0x35,0xF6,0xA5,0x9E,0x5D,0xA4,0xC0,0xA1, + + 0xE2,0x43,0xA3,0x4E,0x8F,0xA5,0x87,0x56,0xBD,0x43,0xDF,0x16,0x7B,0xE4,0x05,0x67, + + 0xFC,0xE3,0x0A,0xD9,0xBE,0x88,0x2E,0x84,0xC9,0x94,0xD4,0x02,0x38,0x66,0x91,0x1F, + + 0x21,0x50,0x95,0x66,0x9C,0x9D,0xD4,0x71,0x99,0x12,0xCC,0x2C,0x8D,0xF7,0x15,0xF2, + + 0xD6,0x17,0x1D,0x76,0x9D,0x9C,0xC0,0x32,0xE1,0xCA,0xFC,0xB6,0x01,0x7C,0xAD,0x80, + + 0x22,0x16,0x90,0x67,0x1C,0x9F,0x5B,0x75,0xC2,0x22,0xB4,0xA1,0x1B,0x19,0x2D,0xE4, + + 0x00,0xAC,0x18,0x77,0x91,0x83,0x25,0xE3,0xEF,0x31,0xEF,0xA2,0xED,0x68,0x4C,0xD4, + + 0x41,0x2B,0xC7,0x02,0x82,0x32,0xAB,0x10,0x60,0xA5,0x3C,0xF9,0xF2,0xD5,0x8C,0x75, + + 0xFB,0x97,0xB4,0x92,0xC7,0x7B,0xE9,0x03,0xEF,0x58,0x03,0xBC,0x04,0x71,0x53,0xED, + + 0x49,0x47,0xCD,0x23,0xD1,0x16,0x2B,0xE7,0x03,0xD5,0x8A,0x3D,0x81,0x76,0x35,0x55, + + 0x8D,0xA3,0x78,0x13,0x43,0x31,0xA6,0x01,0xAE,0xA6,0x1D,0x35,0xE6,0x71,0xBD,0x7B, + + 0x18,0xA5,0x02,0xFF,0x0C,0x37,0x5C,0xAD,0x5B,0xCA,0xDA,0x5C,0x7C,0x37,0x8C,0x38, + + 0x21,0x79,0x71,0x18,0x7A,0x9F,0x47,0x8C,0xCE,0x14,0x2A,0x5E,0x4A,0x9B,0x79,0xA0, + + 0x8A,0x6A,0x47,0xD1,0x7E,0xB7,0xEF,0xCB,0xAB,0xA9,0xCD,0xA6,0x5B,0xF5,0x5F,0x84, + + 0xF9,0x1D,0xB5,0x75,0x25,0xF4,0x41,0x5B,0xE5,0xDE,0x27,0x42,0x7B,0xD7,0x1E,0xDC, + + 0xA8,0xB0,0xCA,0xD9,0x59,0xFC,0x28,0xEE,0x8B,0xDF,0xF2,0xF8,0x7C,0xFC,0x48,0xE0, + + 0xAB,0x13,0xB6,0x5E,0x32,0x9D,0xC5,0x18,0x2B,0xAD,0x1E,0xEC,0x40,0x7B,0xB2,0xAB, + + 0xEA,0x11,0xBF,0x4F,0xB3,0xFE,0x77,0x1A,0x66,0x53,0xE0,0x6F,0x72,0x3E,0x2F,0x86, + + 0x4A,0xB2,0x95,0xC0,0x18,0x39,0xA8,0x53,0x4E,0xA8,0xFB,0xE9,0xFD,0xFF,0xD8,0x25, + + 0xA5,0x9B,0xFA,0xF8,0xB3,0xE2,0x7A,0x60,0x19,0x48,0x88,0xA4,0xC5,0xB5,0x90,0xED, + + 0xEC,0xD0,0x9E,0x92,0x5E,0x9E,0x8F,0x4F,0x43,0x6B,0x38,0x44,0xF6,0x4A,0xE4,0xE5, + + 0xB7,0x90,0x2A,0x96,0x92,0x90,0x61,0xCC,0x3C,0x6B,0xC9,0x45,0x36,0x1D,0x85,0x8C, + + 0x84,0x01,0x69,0xAB,0x39,0xB8,0x05,0x41,0xE5,0x73,0x65,0x3C,0x34,0xF8,0xBF,0xA8, + + 0x39,0x94,0x48,0x79,0x94,0x8C,0xC5,0xE6,0x05,0x2E,0x8D,0xE4,0xDE,0xBC,0xDB,0x20, + + 0xEC,0x14,0x90,0xD4,0x14,0x41,0x58,0x27,0xE6,0xCE,0xED,0xF0,0x5F,0xA9,0x3E,0x47, + + 0x80,0x2C,0x5D,0x25,0xD7,0xE6,0xCE,0x83,0x81,0xC0,0x4E,0x85,0xD0,0xAE,0x57,0x6B, + + 0x0A,0x21,0xB3,0x47,0x34,0xA1,0x7F,0x83,0xCE,0xC8,0x7E,0xF5,0x57,0x3E,0x1C,0x27, + + 0xD2,0x80,0xE3,0x68,0xE3,0xAE,0xB4,0xD9,0x4F,0xBD,0xFE,0xC8,0xDE,0xF4,0xD5,0x69, + + 0x39,0xE7,0x4D,0xF6,0x35,0xE6,0x44,0xFA,0xF1,0x60,0xA9,0x5C,0xA2,0x66,0xA4,0xE3, + + 0x92,0xC7,0x8D,0x70,0x3D,0xC6,0x2D,0xD0,0x4C,0x0A,0x0A,0xCD,0x5E,0xEE,0xCC,0xDB, + + 0xC5,0x26,0xCB,0x1D,0xBF,0x06,0x0C,0x46,0x31,0x32,0x40,0x18,0x7C,0x32,0x7C,0x8A, + + 0x36,0x07,0xAA,0x58,0xBD,0xAA,0x52,0x73,0xCC,0xB9,0xCA,0xCE,0xB3,0x64,0xD2,0x1D, + + 0x01,0x22,0x5E,0x4E,0xBC,0xEF,0x5A,0x2F,0xEE,0xA1,0xA5,0xD5,0x59,0x67,0xF5,0x7A, + + 0xFE,0x91,0x6B,0xE3,0x7F,0xA1,0x33,0x09,0x31,0xC8,0x28,0x6D,0xA1,0x06,0xFA,0x1C, + + 0x4D,0x6F,0xF5,0x61,0xF4,0xB8,0x9C,0x3B,0xE3,0x42,0x35,0x00,0xFE,0x6F,0x04,0xF3, + + 0x85,0x3F,0xFD,0x95,0xD3,0xA0,0x6A,0x40,0x2C,0x54,0xC7,0x44,0x47,0xE2,0xB9,0xD4, + + 0x79,0x6A,0xF5,0x91,0xD2,0xAA,0x5C,0xB0,0x12,0xDC,0x5F,0x76,0x35,0x2C,0xB4,0xA4, + + 0x05,0x3D,0x5F,0x6F,0x30,0x7D,0x55,0xF0,0x4F,0xDD,0x0D,0x59,0x09,0x9E,0x37,0x6F, + + 0xA5,0xD1,0x88,0x61,0x30,0xA1,0xC2,0xE1,0xA6,0x23,0xC5,0xB5,0xA9,0xE8,0x75,0x20, + + 0x8A,0x39,0xE8,0xD6,0x95,0xF4,0x05,0x6F,0x11,0xD0,0x92,0xA1,0x70,0x74,0x84,0xED, + + 0xA5,0x91,0x37,0xC6,0x31,0xFF,0x23,0x72,0x14,0xA0,0x7B,0x56,0x7F,0x65,0x70,0x21, + + 0x23,0x16,0xE9,0x11,0xC9,0xB6,0xAA,0xB6,0xD9,0xE1,0x27,0x87,0xF2,0xB8,0xE6,0xB1, + + 0x66,0xF5,0x86,0x55,0xB6,0xD0,0xBD,0xAE,0xAD,0xD4,0xED,0xEA,0xEF,0xF1,0xEA,0xDF, + + 0x1F,0x08,0x0E,0x16,0xBE,0xBC,0x6F,0x2A,0xCB,0x95,0x73,0xC8,0x83,0xFE,0x10,0xB3, + + 0x8A,0x82,0x54,0xE8,0xB0,0x3F,0xBA,0x4A,0x25,0x96,0x59,0xFE,0x71,0x04,0x19,0xA3, + + 0x0B,0x8A,0x7D,0xED,0x8F,0x5E,0x9B,0x39,0xA4,0xD0,0x99,0x15,0x5D,0x96,0xE9,0xE8, + + 0x99,0xD4,0xAE,0x5F,0xB9,0x70,0x5F,0xB9,0x9A,0xD6,0xFD,0x5D,0x1C,0xFD,0xA2,0x1A, + + 0x22,0x9F,0xBC,0xCF,0x9D,0xBA,0x76,0x72,0xEE,0xAC,0xD6,0xAE,0x1D,0x03,0x43,0xAA, + + 0x8C,0x9B,0x91,0x3C,0xBD,0x95,0x26,0xFF,0x0C,0xF5,0x3E,0x8B,0x61,0xBC,0x5F,0x5A, + + 0x4F,0x98,0xEB,0xB1,0x1F,0x34,0x17,0xE9,0xA3,0xD3,0x8F,0xEB,0xCF,0xFE,0x4F,0x19, + + 0x0E,0x96,0xD0,0xBD,0xFE,0xFF,0x07,0x3D,0xF9,0x93,0xFF,0xFF,0x07,0x71,0xAD,0x7F, + + 0x9D,0x1B,0x53,0xF7,0x68,0x84,0x4B,0x6E,0x3B,0x3A,0x50,0xA1,0xB8,0x68,0xB5,0x21, + + 0xA0,0xA0,0x64,0x87,0x46,0x2B,0xE5,0xCD,0x43,0x9A,0xC1,0xC9,0x97,0x73,0x4E,0x85, + + 0xC0,0xBB,0xCE,0x29,0x79,0x73,0x07,0x43,0xA8,0x4F,0xC5,0xE2,0x39,0x21,0x31,0x21, + + 0x9E,0xAC,0x00,0x66,0xE5,0x82,0xAC,0xB5,0x9C,0xE1,0x23,0xB1,0xD7,0x58,0x66,0x99, + + 0x36,0xA9,0xB6,0x37,0x2A,0x2B,0x45,0x41,0xEF,0xF9,0xD6,0x4C,0x7A,0xD3,0x00,0xA1, + + 0x60,0x9A,0xDE,0x36,0xEC,0x88,0x62,0x83,0x33,0xF7,0xBE,0x84,0xB8,0x14,0xD0,0x86, + + 0x48,0xDC,0xDD,0x47,0x7B,0xF5,0x09,0x65,0xEB,0x86,0x88,0x67,0x77,0x0A,0x5F,0x6D, + + 0x68,0x43,0x9E,0xF0,0x64,0x49,0x99,0xF4,0xF4,0x4A,0x80,0x81,0x76,0xB8,0xA2,0x7A, + + 0x6A,0x54,0xBA,0xF3,0xF1,0x99,0xC9,0x63,0x37,0xC4,0x9A,0x39,0x6B,0xB3,0x3D,0x09, + + 0x6A,0x48,0x4E,0x15,0x18,0xE9,0xDA,0xC9,0x45,0xC4,0x4A,0x4F,0x29,0x07,0x7D,0x0E, + + 0x8E,0x8A,0x43,0x89,0xEC,0x68,0x48,0x62,0xB3,0xA3,0x21,0x8C,0xC8,0xAF,0x55,0xB4, + + 0x89,0xAF,0xAD,0xA8,0xB3,0x8F,0x65,0x11,0x20,0x5A,0xF9,0x34,0xD8,0xDB,0x18,0xF7, + + 0x60,0xBD,0xFC,0xE8,0xC4,0xF1,0xAD,0xAF,0x80,0xDD,0xD3,0x0A,0xA5,0x00,0xDC,0x28, + + 0x57,0x04,0x48,0xDE,0x8A,0x78,0x7D,0x4D,0xB2,0x46,0x39,0x82,0xD4,0x90,0x3D,0x4E, + + 0x2B,0xA1,0x03,0xC9,0xA1,0x26,0x5B,0x79,0x16,0xDF,0xE9,0xF2,0x25,0xE3,0x81,0x2A, + + 0xE7,0x80,0xF3,0xBD,0xF3,0x6D,0xE0,0x8A,0xB7,0xEB,0xBD,0xC1,0x32,0xDC,0x0F,0x6C, + + 0x9C,0xAB,0xD6,0x3D,0xDB,0xB3,0x2A,0x88,0x08,0x5D,0x6B,0xD7,0x40,0x1C,0x4C,0x6C, + + 0x9F,0x53,0x58,0x85,0x41,0x91,0x62,0xB6,0x80,0xD2,0xBE,0x45,0xD2,0xF1,0x5D,0x79, + + 0x6C,0xE9,0xBB,0x20,0xC2,0x9D,0x03,0xC3,0x80,0x27,0x72,0xE5,0xF4,0x5B,0x06,0x50, + + 0xD6,0xE4,0x1C,0x84,0xC5,0x9E,0x34,0x42,0x6D,0x11,0xA3,0x9D,0xF7,0x31,0x3C,0xC2, + + 0x62,0xB4,0xFF,0x5A,0x33,0xA7,0x32,0xDD,0x63,0x14,0x65,0x86,0x51,0xB6,0x5F,0xA9, + + 0x00,0x17,0x0C,0x51,0xA9,0x93,0x49,0x8F,0x36,0x5C,0xDE,0x16,0xFC,0xF3,0x56,0xC3, + + 0x75,0xBB,0xFF,0x2D,0x36,0xF9,0x49,0xE3,0x2A,0xDD,0xB5,0xAA,0xDF,0x7B,0x17,0x47, + + 0xDB,0x55,0x1C,0xA6,0x89,0x75,0x5C,0x75,0xED,0xF0,0x59,0xB5,0xF1,0x6C,0xD9,0x72, + + 0x94,0x21,0x15,0x6C,0x96,0x98,0xD6,0x9B,0x97,0x43,0xE9,0x28,0x7E,0xDD,0xCE,0xC5, + + 0x5B,0x62,0x9B,0x9D,0x8C,0x7B,0x20,0x61,0x00,0x83,0x9C,0x9F,0x98,0xD6,0xB6,0xE1, + + 0xD3,0xE5,0x90,0x8F,0x44,0x9A,0x58,0x2D,0xA8,0x7F,0x68,0x45,0xA3,0x38,0x5A,0x68, + + 0xE8,0x38,0x4F,0x79,0xB8,0x11,0x47,0xB0,0x00,0xA1,0xCB,0x4E,0xDF,0xC4,0x82,0xF3, + + 0xC3,0xFD,0x02,0xFF,0x39,0xCC,0x6E,0x1B,0x52,0xFE,0xF0,0x18,0x66,0x6C,0x14,0xD9, + + 0x88,0xAD,0x9D,0xAF,0x05,0x7F,0x9E,0x7D,0xE2,0x55,0xFE,0xED,0x9A,0x7B,0x3F,0x4D, + + 0xA4,0x45,0x6B,0xBE,0x9C,0x98,0x0D,0x6D,0xEC,0xD7,0x0D,0x47,0x7D,0xEC,0x71,0xE5, + + 0xC3,0x12,0x0F,0x34,0xB8,0x5F,0x5D,0xE7,0xC1,0xAB,0x72,0x98,0x58,0x7E,0x69,0xBA, + + 0x37,0xAA,0xF1,0xA2,0x12,0xC2,0x9C,0xCA,0xD8,0x06,0xE9,0x29,0xB1,0x66,0xA1,0x74, + + 0xEE,0xF2,0x90,0x27,0x27,0x5E,0x02,0xC1,0x6F,0x6E,0xFB,0x33,0x53,0x9A,0x99,0xE3, + + 0x9C,0x99,0x6D,0x65,0x63,0xC7,0x39,0x27,0xEC,0x95,0x31,0xE7,0x90,0xE1,0x28,0x75, + + 0x6E,0x10,0x97,0xA2,0xE3,0x7C,0xE9,0xC0,0xA3,0x6C,0xAC,0x08,0xE5,0xE7,0x78,0xEE, + + 0xE7,0x2B,0x20,0xA2,0x17,0x64,0x63,0xC2,0x40,0x86,0x30,0xE3,0xBE,0xEC,0x0F,0x92, + + 0x55,0x0E,0xF0,0xDA,0x37,0x37,0x2C,0x4F,0x8F,0x86,0x9E,0x86,0x56,0x25,0x72,0x30, + + 0xF6,0xEA,0x81,0x0D,0x22,0xAB,0xA9,0x23,0x82,0x62,0xA7,0x14,0xEA,0x88,0x8B,0x62, + + 0xF7,0xC5,0x25,0x24,0xE5,0x06,0x29,0x83,0x01,0x66,0x99,0x3D,0x63,0xEA,0x7B,0xE7, + + 0xA9,0x27,0x76,0x9D,0xBD,0x17,0x64,0xD9,0x2E,0x67,0x32,0xD3,0x00,0xAA,0xF9,0x09, + + 0x3C,0x21,0xD4,0xAA,0xF4,0x0A,0x2B,0xBE,0x43,0x1B,0xBE,0xA0,0xBC,0x46,0x74,0x03, + + 0x29,0x25,0xD8,0x7C,0xFA,0x5B,0xE7,0xD8,0xBC,0x67,0xBA,0x80,0x94,0xFB,0x0D,0x72, + + 0xC8,0xF0,0x78,0xEC,0xF7,0x06,0x01,0xD9,0x61,0xC4,0xAA,0xD7,0x5D,0xA6,0xA6,0x71, + + 0xAF,0x25,0x31,0xB1,0xF7,0xDF,0xE4,0xEE,0x40,0x79,0xAA,0xEA,0xB7,0x67,0x5C,0x6B, + + 0x7F,0xCF,0x2A,0x2E,0xBE,0x32,0xBE,0xE6,0x49,0x4F,0x6B,0x8E,0xDF,0xFB,0xF5,0xAB, + + 0xDE,0x05,0xB5,0xF6,0x69,0xEC,0x4B,0x98,0xA2,0x8C,0xE1,0x6E,0xD8,0x8C,0xAF,0xA2, + + 0x2E,0x0F,0x5F,0x3D,0x10,0x59,0xFB,0xE8,0xED,0x12,0xF3,0xE7,0x5D,0xF3,0x13,0xEB, + + 0xD4,0x89,0x9E,0x79,0xC3,0x0F,0x2A,0xC2,0x47,0xB0,0x92,0x7B,0x4C,0x5D,0xEC,0xCB, + + 0x44,0xD3,0xFA,0xBD,0x57,0xA4,0xF3,0x9B,0x8C,0xE0,0xB4,0xB2,0x7C,0x95,0xFA,0xDB, + + 0xD3,0xE7,0xDE,0xA8,0xD2,0xE7,0xF5,0x4E,0xDC,0x76,0xA0,0x60,0x3E,0xFB,0xE9,0xD6, + + 0xA4,0x53,0x79,0x50,0xB3,0x33,0xD1,0x20,0xC4,0xD9,0x83,0x9E,0x3D,0x5A,0x9B,0xB1, + + 0x5E,0xF7,0xF4,0x5E,0x6C,0xF6,0xA4,0x91,0x5E,0x96,0xB7,0x6A,0x01,0xA8,0xAC,0x57, + + 0x3F,0x9D,0xC0,0x96,0x77,0x61,0x04,0xD5,0x8E,0x96,0xA3,0x76,0x04,0x80,0x9E,0x47, + + 0xA8,0xFC,0x25,0xB7,0xB0,0xD4,0xB5,0x97,0x0F,0xF5,0x2A,0x2A,0xC9,0x65,0xEF,0xC0, + + 0xC9,0xB4,0xB9,0xC8,0x91,0x1A,0x05,0xCC,0xDF,0x95,0x3D,0xAA,0xBD,0x2C,0x7F,0x9D, + + 0xC9,0x83,0xB6,0xCE,0x4A,0xA3,0xAF,0xD9,0x54,0x7C,0xCE,0x9C,0x83,0x2D,0x74,0x72, + + 0xAD,0xD4,0x6E,0x1B,0xA7,0xA2,0x46,0x42,0x6D,0x78,0xBE,0x83,0x96,0x28,0x02,0x7D, + + 0x4D,0x35,0x85,0xF9,0x9D,0x0A,0x29,0x49,0x0C,0x0F,0xCF,0xDC,0xA7,0xA1,0x77,0x9F, + + 0x84,0x1F,0x70,0x09,0xAF,0x76,0x70,0x48,0x99,0x46,0x06,0x03,0x16,0x4A,0x40,0x62, + + 0x08,0x3C,0xBC,0x4A,0x38,0x75,0x2E,0xEA,0x87,0x3D,0xDB,0x13,0x13,0x67,0xFD,0x3A, + + 0x2B,0x3D,0xD0,0x7A,0x9C,0x48,0xE9,0x18,0xC3,0x70,0xA0,0xFB,0xF7,0x58,0xF6,0xDA, + + 0xDA,0x33,0xD9,0x6E,0x1D,0xDB,0xB7,0x6E,0xB8,0x73,0xDA,0x16,0x3F,0xBC,0x78,0x9A, + + 0xA3,0x3F,0xB5,0x5B,0x9C,0xBF,0x2F,0x19,0xE9,0xBD,0xA6,0xED,0x1A,0xF6,0x84,0x94, + + 0x80,0xC0,0x84,0x90,0x34,0x3B,0x30,0xAA,0x41,0x80,0xE0,0xA0,0x09,0xE9,0x09,0xE6, + + 0xE0,0x1A,0x75,0x90,0x4C,0x83,0xC2,0xA0,0x72,0x45,0xFE,0x08,0xB8,0xD0,0x3B,0xE9, + + 0xF7,0xCD,0xA1,0x63,0xF8,0x2F,0xF9,0xA9,0xF3,0xC6,0x3D,0xCD,0x3F,0x2F,0x43,0xF7, + + 0x03,0x07,0x19,0x67,0x7A,0x52,0x27,0xC1,0x66,0x58,0x59,0xB0,0x78,0x69,0x08,0x0C, + + 0xDE,0x47,0x43,0xAC,0xB5,0x66,0xC4,0x44,0xA3,0x5F,0x10,0x42,0xAD,0x7F,0x6B,0x6D, + + 0xF7,0x1C,0x78,0x13,0x15,0x67,0xF0,0x55,0x67,0xEE,0x18,0x80,0xCF,0x6F,0xE2,0xE0, + + 0x5A,0x05,0x01,0x90,0x94,0x64,0xEA,0x87,0xD2,0x09,0x29,0xE1,0x92,0x51,0xFE,0x38, + + 0x85,0x65,0xE6,0x15,0xCF,0x8A,0x4C,0x75,0xA8,0x16,0x99,0x9D,0x60,0x2A,0x89,0x6A, + + 0xF7,0x84,0xFC,0x34,0x2B,0xE7,0xB6,0x5E,0xB7,0x41,0x14,0x5F,0x20,0x27,0x8A,0x5E, + + 0x4F,0xF4,0x3B,0xE1,0xEB,0x52,0x85,0x58,0x5D,0x52,0xA4,0x10,0x31,0xF8,0x49,0x14, + + 0xA8,0x07,0x7B,0x05,0x3F,0xF1,0x53,0xC1,0x48,0x07,0x92,0x5E,0xAC,0x25,0x21,0x9C, + + 0xCA,0xEB,0xC1,0xF3,0x62,0x69,0x44,0x4F,0x44,0xCD,0xE5,0x05,0x38,0xC8,0x64,0x3A, + + 0xB1,0x13,0x89,0x8B,0xD8,0x0C,0x1B,0x80,0x41,0x01,0xD0,0x8A,0xFF,0xEA,0x8A,0x5D, + + 0xDF,0x16,0x72,0xEE,0x13,0x6D,0x46,0x1A,0xB4,0xC6,0x81,0x68,0xDE,0x9C,0xF4,0xED, + + 0x7E,0x2D,0x8B,0x59,0xA9,0xA4,0x0B,0xE5,0x48,0x72,0xD7,0x2D,0xCE,0xC5,0x33,0x27, + + 0x2C,0x1F,0x27,0x79,0x16,0x6E,0x12,0x85,0xCF,0x53,0x4B,0x0F,0xE8,0x70,0x3C,0x05, + + 0x2E,0x9A,0xBE,0x77,0x08,0x9D,0xCF,0xEA,0x1F,0x25,0xAC,0x5F,0x99,0x13,0xA4,0x08, + + 0xA4,0x03,0x84,0x90,0x99,0xDE,0x22,0x40,0x09,0x5C,0xFD,0x4B,0x80,0xF2,0xD2,0x04, + + 0x26,0x13,0x90,0xC2,0x7A,0x1B,0x4E,0xEF,0x9B,0x28,0x41,0x5F,0x09,0xF3,0x33,0x61, + + 0x82,0xD1,0xB3,0xAD,0xD9,0x3E,0x0B,0xD3,0x5E,0x11,0xBF,0x4B,0x92,0x7F,0xEF,0x45, + + 0xB1,0x2B,0x51,0x3B,0xC7,0x67,0x2D,0xC7,0xCE,0x31,0xD4,0xE4,0x72,0x74,0xF9,0x2D, + + 0x23,0xCE,0xF7,0x7C,0xC0,0x33,0x9C,0x52,0xE0,0x58,0xDC,0xF4,0x73,0x75,0xB8,0x38, + + 0xA0,0x8D,0x3E,0xBE,0x88,0x89,0x6C,0xA3,0x43,0x14,0xD5,0xE5,0xF2,0x76,0x35,0x55, + + 0xAB,0xE4,0x63,0x27,0xB7,0xB7,0x24,0xB6,0x1E,0x21,0xDD,0xF5,0xF3,0x77,0xEA,0xFB, + + 0x37,0xBE,0x79,0xFF,0x04,0x5B,0x99,0x39,0xD4,0x61,0x81,0x5F,0xFC,0xF3,0x2E,0x72, + + 0xC0,0x43,0x71,0xE2,0x5B,0x8C,0x45,0xAF,0x16,0x5B,0xE5,0xCF,0x10,0xD8,0xD4,0xFA, + + 0xD2,0x93,0x7C,0xF2,0xD8,0x27,0xA6,0xC1,0x93,0x51,0xB3,0x15,0x00,0x3E,0x15,0x9B, + + 0x3B,0x13,0x74,0xEE,0x8D,0x44,0xC4,0x16,0xEF,0x51,0x81,0x52,0xFF,0x83,0x78,0xE4, + + 0x42,0x11,0xF1,0x4E,0xF7,0xB3,0xAB,0x96,0xFC,0x03,0xD6,0xEC,0x7A,0x7C,0xB5,0x28, + + 0x29,0x5F,0x97,0xCC,0x3D,0xBD,0x3F,0x12,0x9F,0x6C,0xDE,0xFC,0x7B,0x7D,0xB8,0xBA, + + 0x92,0x7D,0x07,0x49,0x52,0xC1,0x68,0x62,0x51,0xC3,0xD7,0xED,0xFA,0x7E,0x8B,0x08, + + 0x98,0xC2,0x41,0x5F,0x76,0x30,0xE8,0xD5,0x0A,0xC0,0xDF,0xFD,0xFB,0x7F,0x30,0x60, + + 0x00,0xCC,0x2F,0xBE,0x27,0x9F,0xB4,0xE2,0x40,0x00,0x25,0xD5,0x68,0xFB,0xEA,0x9A, + + 0x26,0xA1,0x10,0xE5,0x50,0xDA,0xC2,0xDA,0xDD,0x0C,0x14,0xB2,0x5B,0x7C,0x31,0xEB, + + 0x40,0x4F,0x19,0xF4,0xDD,0xB2,0xA1,0x51,0xF7,0x79,0x56,0x51,0x59,0x80,0xEB,0xFB, + + 0x41,0x4E,0x90,0xFB,0x6D,0x18,0xC6,0x74,0xF6,0x27,0xF1,0x86,0xD3,0x81,0xDF,0xA4, + + 0x22,0x9F,0x3F,0xC6,0x61,0xD1,0xCF,0x28,0x56,0xC0,0x08,0x42,0x56,0xE4,0x69,0x34, + + 0xEC,0xD4,0xA8,0xAA,0xAB,0xE7,0xAC,0x2C,0xD4,0xFA,0xF8,0x76,0x57,0xE5,0x1C,0x25, + + 0x6D,0xB7,0x21,0x83,0x84,0x5D,0x77,0x24,0xE8,0x1A,0xF1,0x67,0xD6,0xE6,0x7F,0x31, + + 0x78,0x2A,0xB6,0xA7,0xA4,0x31,0x07,0x5F,0x13,0xF6,0xF9,0x77,0xD7,0xE7,0x63,0x5E, + + 0x2F,0xCB,0xE2,0xF6,0xA0,0x53,0xD0,0xEA,0x54,0x35,0x79,0xDE,0x54,0xE7,0xEE,0x9F, + + 0x4E,0x7A,0xA1,0xDF,0xF4,0x00,0x32,0x9A,0x5F,0x7A,0xC2,0x0C,0x95,0xE6,0x43,0x09, + + 0xD5,0x87,0x9A,0xF3,0x64,0xE8,0x9F,0xB9,0xDC,0xC2,0x8D,0x06,0x14,0x43,0xEF,0x9D, + + 0xCB,0xEE,0xB9,0xE1,0x76,0xFA,0x62,0x34,0x29,0x40,0x6F,0xCC,0xBF,0x4A,0x77,0xEF, + + 0xF9,0x71,0x58,0x09,0xDC,0xAE,0xB2,0xEE,0xEC,0x8E,0xF2,0x6E,0x5E,0xEC,0xB9,0xA4, + + 0xF2,0x96,0x44,0xAC,0x2C,0x60,0x78,0xCE,0x4C,0xCE,0xFA,0x7E,0x5F,0xED,0x71,0x4C, + + 0x71,0x03,0xAB,0xC2,0xDA,0xA8,0xB3,0xD5,0x43,0x8C,0xF3,0x6F,0xDE,0xEE,0xED,0x05, + + 0x02,0xED,0x2B,0xDB,0xCE,0x52,0x1B,0x2C,0x6C,0xC2,0xFB,0x7F,0xDF,0xEF,0x22,0xF0, + + 0xDB,0xD2,0x7D,0x86,0x4F,0xBC,0x4B,0xD0,0x57,0xE4,0xF2,0xA4,0x76,0xEB,0x74,0x83, + + 0x16,0xD5,0xC2,0xE5,0x0D,0xF3,0x04,0x4D,0x56,0x95,0x78,0xCC,0x74,0x11,0xEF,0xD7, + + 0x4D,0x19,0xFE,0x25,0xB2,0xC1,0xCF,0x21,0x71,0x88,0x52,0xD1,0x7B,0xB0,0xAF,0x91, + + 0xE5,0x1E,0x69,0xCC,0x40,0xBC,0x87,0x74,0x3B,0xDB,0x7D,0x32,0xA2,0xFE,0xA4,0x46, + + 0xB4,0x39,0x24,0xD6,0xCE,0xB2,0x0B,0x25,0x60,0x54,0xF4,0xE6,0x76,0xF4,0x56,0x63, + + 0x1F,0x0A,0xC2,0xD6,0x37,0xB5,0x3F,0xF6,0xE8,0x94,0xFC,0xF6,0x77,0xF5,0xF4,0xF3, + + 0xA2,0x29,0x4B,0x35,0xB0,0x36,0xA7,0xA3,0xAE,0xD7,0xF5,0xE7,0xF6,0xF6,0xB2,0x53, + + 0xD0,0xE2,0xED,0xA5,0x84,0x21,0xBD,0x77,0x11,0xCA,0xFD,0xF7,0xF7,0xF7,0x7F,0x8C, + + 0xCB,0xDA,0x12,0xF1,0x9F,0x15,0xB3,0xD8,0x8B,0x27,0xBC,0xAA,0xDF,0x58,0x10,0x6A, + + 0x4D,0xD9,0x73,0xA7,0x56,0x31,0xBA,0x52,0xF5,0x19,0x0F,0x43,0x8F,0x4C,0xE3,0xCE, + + 0xAD,0xD8,0x36,0x74,0xCF,0xBA,0xF7,0x7F,0xA9,0xDE,0xA2,0x8C,0xF1,0x21,0xEF,0x1E, + + 0x99,0x10,0x7B,0x62,0x3C,0x60,0x66,0xB1,0x08,0xD2,0xA3,0x47,0xFD,0xB9,0xA6,0x0A, + + 0x3B,0x61,0x1C,0x4C,0xF3,0xB3,0x5E,0x88,0x5D,0x93,0xF6,0xEE,0x7E,0xFC,0x37,0xA4, + + 0x8A,0x1B,0xE5,0x19,0x39,0x3D,0x46,0x10,0xE2,0x20,0xFE,0xFE,0x7F,0xFD,0xEC,0x2B, + + 0xB2,0xF2,0xBE,0x29,0xB8,0xFC,0xB7,0x6F,0x48,0xD0,0xF7,0xEF,0xFE,0xFE,0x6B,0x9B, + + 0xB3,0xD1,0x3D,0x9F,0xA7,0xFD,0xBF,0x7F,0x36,0xD5,0xFF,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x38,0xAF,0x7F,0x76,0x72,0xDF,0x76,0x90,0xA9,0x4F,0x50,0x64,0xB9,0xB1,0x58,0x11, + + 0x6A,0x22,0x77,0x6A,0x3F,0xD5,0x42,0x40,0x29,0xA0,0xE0,0x47,0x3D,0x6A,0x12,0xF2, + + 0xF8,0xA9,0x7A,0x7A,0xF8,0x2F,0x77,0x84,0xC1,0x92,0xE9,0x02,0x39,0x93,0xFC,0xE0, + + 0xA7,0x01,0x29,0xE6,0x1D,0x61,0x67,0x37,0x20,0xC0,0x1D,0x26,0xE1,0x52,0x80,0x05, + + 0xA3,0xDB,0x77,0x6D,0x65,0x24,0xFC,0x1F,0x88,0x3D,0x89,0x3C,0x54,0x06,0x7B,0xD0, + + 0xA2,0x9A,0xC8,0xAF,0x60,0x25,0x42,0x72,0xD1,0x4F,0x98,0xB3,0x60,0x73,0xF5,0x23, + + 0x7D,0x00,0xFF,0x34,0x2D,0x7D,0x0B,0x63,0x71,0x9B,0x84,0x41,0xF2,0x77,0xFD,0x33, + + 0x78,0x6B,0x09,0x54,0x3D,0xDA,0xDC,0xF5,0x81,0x45,0x63,0xE7,0xA3,0x75,0x3C,0xC0, + + 0x60,0x71,0x02,0x8F,0x1E,0x6A,0xA1,0xDB,0xC4,0xC3,0x94,0x04,0xD8,0x24,0x74,0xBD, + + 0x8B,0x0D,0xC8,0x18,0x9E,0x9B,0xBA,0xD7,0xFD,0x46,0xBC,0x99,0x2D,0xCD,0x7D,0xB9, + + 0x69,0x69,0x3F,0x4D,0xD0,0x29,0x17,0xCB,0xCE,0x08,0x95,0x18,0xF0,0x32,0x51,0x7B, + + 0xE2,0xA8,0x4B,0x8D,0x81,0x8A,0xF7,0xAA,0xB1,0x16,0xC9,0x00,0x30,0x51,0xFD,0xD3, + + 0xF5,0xD1,0xD4,0x2E,0xE5,0xF1,0x40,0xEC,0x4C,0x0E,0x68,0x1C,0xDA,0xEA,0x58,0xA6, + + 0xF0,0x80,0x8A,0xA3,0xEE,0xAE,0x0A,0xE8,0x67,0xB8,0x4A,0x3B,0x7F,0x76,0x20,0xB7, + + 0x63,0x27,0x17,0xB3,0x67,0xAF,0xDF,0xED,0xC4,0x70,0xF7,0x2D,0xDE,0x00,0x19,0xA6, + + 0x78,0x4D,0x3E,0xA3,0xE0,0x2D,0x8D,0x85,0xCB,0xF3,0x97,0x1B,0xF8,0x64,0xB1,0x7D, + + 0x22,0xCB,0x28,0x01,0x5B,0x9B,0x75,0xE0,0x64,0x1E,0x03,0x5C,0x70,0xCB,0xA0,0xE3, + + 0x47,0x97,0xF2,0xA1,0xD8,0xD0,0xE1,0x9E,0xC2,0xFC,0x23,0x85,0x62,0x8E,0x36,0x05, + + 0xFD,0xB0,0x85,0x76,0xD7,0xBF,0x57,0x25,0xE6,0x16,0x93,0x21,0xF8,0x15,0x89,0xE2, + + 0xCB,0x9A,0x21,0x06,0x98,0x39,0xCF,0x81,0xE9,0xAC,0xA6,0x09,0x06,0xFE,0xC8,0xA2, + + 0xD5,0x71,0x0B,0xB7,0x1B,0xB6,0xC3,0x73,0x05,0xF9,0x56,0xD6,0x12,0x81,0x99,0xB2, + + 0xD0,0x70,0x2B,0x14,0x37,0x95,0x18,0x83,0x1F,0xF4,0x75,0x07,0xFF,0xFE,0x7D,0x3E, + + 0xA4,0x54,0x3A,0xB6,0x93,0x5A,0xC6,0x72,0x89,0x5E,0xAB,0xE3,0x13,0xF5,0x75,0x2A, + + 0x2E,0xE1,0xD5,0xF1,0x80,0x1D,0x87,0x0E,0x0A,0x86,0x22,0x17,0x5F,0x78,0x26,0x1A, + + 0xA8,0x12,0x08,0xFF,0x54,0xB8,0x2C,0x19,0x02,0x87,0xE9,0x2E,0xE9,0xFD,0x50,0x2C, + + 0x56,0x6C,0x22,0x0F,0x10,0x33,0xDE,0xB9,0xC7,0x37,0x5E,0xAC,0x1F,0x73,0x85,0x78, + + 0xC2,0x1A,0xF9,0xA5,0x51,0x2B,0x20,0x61,0x9B,0x5A,0x57,0x29,0x71,0x16,0x13,0xEB, + + 0x52,0xE0,0x59,0x19,0xBF,0x48,0xA2,0x26,0x1C,0xD2,0xDF,0x55,0xBA,0x36,0x38,0xE5, + + 0xDB,0xCA,0x7E,0x2C,0x6C,0x52,0x00,0x19,0xE7,0x3E,0x69,0x68,0x7C,0xB5,0x0E,0xE8, + + 0x2D,0x5F,0x03,0xAF,0x2C,0x7F,0x20,0x0C,0x6D,0x26,0xA1,0x14,0x6E,0x30,0x39,0xE5, + + 0xAC,0x9C,0x9E,0x7E,0x1F,0x98,0x29,0x18,0x17,0x3C,0xEF,0x17,0x56,0x73,0x8F,0x9C, + + 0xAD,0x9D,0x0B,0xBE,0xB8,0x1D,0x5F,0x8A,0x87,0x56,0x26,0xF5,0x5E,0x00,0x20,0xF1, + + 0x62,0xE5,0x70,0xED,0xFD,0x83,0x56,0x1A,0x45,0x90,0xE8,0xAE,0xBD,0x7A,0x38,0x16, + + 0x0C,0x7E,0xF8,0xE5,0x3F,0x95,0x58,0x78,0xA8,0x6C,0x00,0xD6,0x09,0xFA,0x19,0xF0, + + 0xEA,0x83,0xF7,0xE5,0x5C,0xA1,0x90,0x1B,0x58,0x73,0xE9,0xB7,0xE7,0xAE,0x13,0xE0, + + 0x92,0x2C,0x79,0x06,0xF9,0x83,0xAF,0xD1,0x39,0xD9,0xF3,0x51,0xF6,0xB3,0xE0,0xCE, + + 0x00,0xE6,0xBB,0x7D,0x10,0xAE,0xCD,0x39,0x97,0x99,0xE0,0xF3,0x2F,0x69,0x16,0x6F, + + 0x6C,0x64,0x78,0x25,0x4C,0xAC,0xB8,0xF7,0xA8,0xC6,0xB5,0xB6,0x3E,0x6E,0x47,0x31, + + 0x6D,0x57,0x9E,0x54,0xAE,0x47,0x5A,0xE7,0xCE,0xA1,0x0E,0x18,0x5B,0x40,0x6D,0x20, + + 0xAE,0x05,0x69,0xC6,0xCC,0x0A,0x3C,0xF3,0x7A,0x66,0x5C,0x4A,0x64,0xAA,0xEF,0xF7, + + 0x0E,0x53,0xBF,0x49,0xF5,0xD2,0xE9,0x2A,0xBC,0x6B,0x1A,0xA7,0xD9,0x6A,0x14,0x7B, + + 0x65,0x84,0xD3,0x6F,0x0A,0xBF,0xCE,0x55,0x4B,0xAB,0x9A,0x16,0x7D,0x4A,0xD6,0x8F, + + 0xD0,0x6A,0xC5,0x62,0xFF,0xAE,0x04,0x9F,0xCA,0xEA,0x1B,0xB6,0x59,0x49,0xD6,0xE2, + + 0x8F,0x10,0xE3,0x16,0x74,0xD2,0x6B,0x55,0xAC,0xCF,0xEB,0x01,0xA9,0x1E,0x9D,0x39, + + 0x62,0xE0,0xFC,0xDE,0xE1,0x01,0x4A,0x95,0xFB,0xAF,0xEA,0xA3,0x3D,0x96,0x99,0xDE, + + 0x4D,0x8F,0x6A,0x4F,0x48,0x00,0x5A,0x6A,0x07,0x2C,0xA8,0x51,0xB4,0x89,0x84,0x0B, + + 0x8A,0xA6,0x28,0x08,0x40,0xA4,0x88,0xEF,0xC0,0x21,0x64,0x9C,0x5A,0x63,0x79,0x47, + + 0x89,0xCD,0x24,0x3F,0x9B,0x0D,0x77,0x42,0x40,0x62,0xC3,0x81,0xB4,0xE0,0x3E,0x7E, + + 0xD0,0xD2,0x64,0x03,0xAF,0x1D,0x14,0x48,0xD1,0x59,0xEC,0xAB,0xF6,0xEC,0xBA,0xE1, + + 0x49,0xFD,0x6C,0x06,0x31,0x17,0xD4,0x3B,0x2D,0xC0,0xBC,0xB6,0x75,0xF1,0x6B,0xBD, + + 0x45,0x3D,0xB4,0x03,0xB2,0x01,0x15,0x29,0xE5,0x92,0x87,0x23,0xB4,0x5E,0x4B,0xF2, + + 0xA4,0xD3,0x3A,0xE9,0x7F,0x62,0x39,0x42,0x59,0xD0,0x2D,0x35,0x64,0x76,0xE4,0x59, + + 0xCD,0x25,0x84,0x8D,0x13,0xF6,0x71,0x73,0x0A,0x21,0x18,0x9D,0xE8,0x69,0xC0,0xA1, + + 0x1B,0xE3,0xDB,0x52,0x39,0x56,0x5C,0x15,0x61,0xAE,0x3A,0xF4,0x53,0x28,0xDE,0x59, + + 0x4D,0x07,0x25,0x51,0x34,0xEA,0xE3,0x67,0x91,0x7F,0x14,0xA7,0xB6,0xB8,0x53,0xFF, + + 0x31,0x9D,0x8D,0x99,0x65,0xB3,0x7D,0x80,0x8B,0xBB,0x87,0x97,0xA1,0x7C,0x32,0x2B, + + 0xCD,0x37,0xEE,0x12,0x3A,0xFA,0x87,0x0B,0xD4,0x9B,0x76,0xBE,0xB5,0xF8,0x48,0xEB, + + 0x2E,0xD2,0x11,0x7C,0x56,0xB6,0xFE,0xDD,0x6E,0xAB,0xC6,0xBA,0x94,0xD0,0x36,0xF8, + + 0x9C,0xF6,0x72,0xF1,0x1F,0xDF,0xF7,0xAF,0x89,0x98,0xB7,0xAF,0xFC,0x51,0xEF,0x1F, + + 0x29,0xF5,0x2F,0xEC,0x8D,0xF9,0x01,0xCA,0x8D,0x24,0x8D,0x8F,0xA9,0xB9,0x6B,0x8D, + + 0xC7,0x2D,0x61,0x4C,0xAB,0xAA,0x10,0x8B,0x6D,0xEC,0x15,0xD2,0x95,0xB8,0x66,0x9A, + + 0x29,0xDF,0xC3,0xCD,0x39,0xDF,0x60,0xEB,0x03,0xD9,0x5A,0x8C,0xDC,0x76,0x82,0xB8, + + 0xDE,0xC8,0x27,0x4B,0x78,0xB8,0xC0,0xDE,0xE8,0x05,0xCD,0x5F,0x6B,0x51,0xBA,0x5F, + + 0xA1,0xA1,0x39,0x5D,0x26,0x16,0x07,0x3D,0x85,0x9E,0x89,0xC3,0x14,0xBB,0x3A,0xB0, + + 0x99,0xAF,0x97,0xF7,0x68,0xAD,0xE8,0x53,0x78,0x2C,0x05,0xA0,0x12,0x50,0x16,0x2C, + + 0xB2,0x8C,0xB6,0x2D,0x79,0x50,0x88,0x42,0xAA,0x10,0x49,0xCE,0xB8,0x10,0xA5,0x73, + + 0x23,0x89,0xE7,0x3D,0x7B,0xB3,0x77,0x40,0xC1,0x62,0x04,0xDE,0x39,0x6D,0xF1,0x0C, + + 0x01,0xA5,0xF7,0x38,0x78,0xB2,0x67,0x1C,0xAA,0x92,0xBF,0x44,0x72,0xE6,0x7A,0xB3, + + 0x3A,0xA9,0x3B,0xC0,0x57,0x19,0x2E,0xCC,0xEE,0x49,0xA8,0x43,0xAF,0x6B,0x00,0x9C, + + 0x30,0xC8,0x73,0x0E,0x15,0x47,0x7B,0x8F,0xB6,0xC6,0x23,0x53,0xF2,0x9A,0x54,0x06, + + 0x48,0x57,0xEE,0x3A,0x4B,0xBA,0x2F,0xCC,0xC4,0x24,0x11,0xE1,0x84,0x6B,0x89,0xD5, + + 0xCC,0x1A,0x50,0x95,0x83,0x65,0xAC,0x8F,0x2A,0xEE,0x35,0xE7,0xD3,0xBA,0x92,0x7A, + + 0xE3,0x93,0xD4,0x20,0xF3,0x79,0x21,0xD9,0x34,0x4A,0xB4,0xCE,0x11,0xC7,0x9B,0xF0, + + 0x97,0xC6,0x9F,0x98,0x17,0x95,0xAD,0x11,0x4F,0xD2,0x31,0x52,0x8C,0x12,0x5A,0x87, + + 0x6F,0x46,0x84,0x0F,0x12,0x87,0x4C,0xA9,0xBB,0x3F,0x19,0x72,0x65,0x96,0x52,0x77, + + 0x2E,0x1B,0xB3,0xE7,0x35,0x26,0x8E,0x02,0xF1,0xBE,0xDB,0xD1,0x65,0x29,0x6A,0x2A, + + 0xB3,0x00,0x02,0xD0,0xBB,0xB3,0xAF,0x84,0x4A,0xF7,0xC8,0x6E,0x98,0x68,0xF7,0x1A, + + 0xAA,0xA0,0x8D,0x74,0xF2,0x1E,0x12,0x83,0xC9,0x51,0x93,0x8C,0xDB,0x72,0x7B,0x27, + + 0x0B,0x03,0x77,0x2F,0x61,0x2D,0x13,0x91,0x3E,0x0C,0xDB,0xF9,0x27,0xC8,0x1F,0x68, + + 0x2A,0xF0,0x27,0xCF,0x9F,0x27,0xE5,0x1B,0x30,0xBA,0x60,0x0D,0x5B,0x79,0xD3,0x9E, + + 0x02,0xE4,0x14,0xC3,0xC9,0x96,0x2A,0x9D,0x1C,0xFF,0x94,0xB7,0x44,0xB8,0x74,0xA2, + + 0x49,0x1C,0xEA,0xB8,0xDA,0xA0,0x62,0xB7,0xC0,0x8E,0x2B,0x89,0x85,0xA0,0x51,0xF2, + + 0xC9,0xA6,0x10,0x76,0xC8,0xAF,0xB5,0xD2,0x94,0x81,0x20,0x9C,0x44,0xE3,0xF2,0xE2, + + 0x02,0x70,0x61,0xE6,0xC9,0x95,0xA9,0xD3,0x1E,0xF7,0x5D,0xED,0xFA,0xDE,0x39,0x02, + + 0x83,0x0B,0x97,0x3E,0x34,0x76,0x01,0x93,0x58,0x38,0x0F,0xDA,0x76,0x7E,0x9F,0x2E, + + 0x9A,0xA6,0x6C,0xB6,0x84,0x50,0x60,0x52,0x65,0x17,0x8B,0xCF,0x1A,0xEE,0xF8,0xFC, + + 0x5D,0x4B,0x06,0x87,0x3E,0x3A,0x33,0x90,0xE3,0x16,0xAA,0xDB,0x80,0x83,0x32,0xBB, + + 0xD1,0x88,0xF5,0x3A,0xD8,0x38,0x9E,0x93,0x14,0x32,0xDD,0x71,0xF7,0x25,0xFD,0xF7, + + 0x48,0x1A,0x1B,0x7C,0xB8,0x27,0x81,0xAE,0xA0,0x89,0x07,0x5D,0xDB,0x38,0xFB,0x6B, + + 0x0F,0x92,0x0E,0x5A,0x1F,0x3A,0x21,0x3C,0x21,0xA9,0x89,0x4F,0x01,0xA4,0x79,0x2C, + + 0x5D,0x99,0x99,0xB5,0x2A,0x32,0xB3,0x58,0x4B,0x1A,0xA5,0x93,0x5B,0xDB,0x27,0xA4, + + 0x42,0x5F,0x5F,0x0D,0x99,0x0A,0x27,0x57,0x45,0x56,0xC9,0x85,0x12,0xEA,0x1F,0xBE, + + 0x2C,0x9C,0x46,0xBF,0x00,0xB9,0x6E,0x07,0xFF,0x81,0x75,0x54,0xA6,0xCF,0x1A,0x2B, + + 0x01,0x90,0xF0,0x3E,0x59,0x88,0x66,0x13,0xD8,0x88,0x65,0x4C,0xC5,0x22,0x32,0xBA, + + 0x96,0xBF,0xD5,0x4D,0x51,0x7A,0xFE,0x87,0xC4,0xF8,0x17,0x68,0x2A,0x01,0x19,0x79, + + 0x40,0x1C,0xB1,0xDA,0x1A,0xE0,0x01,0xC6,0x8C,0x82,0x70,0x92,0x26,0xA0,0xD8,0xEA, + + 0xD2,0x4F,0xDF,0x7C,0x99,0xC2,0xA7,0x1C,0x30,0x82,0xBB,0xE7,0x3F,0x71,0xF2,0xB6, + + 0x21,0x2C,0x04,0x65,0x29,0x57,0x06,0x43,0x25,0x1E,0xE6,0x0A,0xE9,0x4A,0x89,0x3B, + + 0xB7,0x34,0x5A,0x7C,0x9A,0x5D,0x6A,0x62,0x25,0x7D,0x04,0xD6,0xAC,0xE0,0x37,0x23, + + 0x72,0x22,0x97,0x3B,0x43,0xA9,0xC6,0x48,0x48,0x35,0x2E,0xB7,0x1D,0x92,0x5E,0xE2, + + 0x28,0x5B,0xF4,0x35,0x7F,0x25,0x21,0xE6,0x0D,0xC1,0xB8,0x6A,0xAB,0x45,0xD3,0xE2, + + 0xBB,0x5A,0x44,0xC9,0x14,0x67,0x70,0xE2,0xAE,0xD6,0xAE,0xCE,0xBC,0x76,0xDE,0x73, + + 0x84,0x79,0x1A,0xB8,0x7F,0x95,0xCE,0xA4,0x04,0x66,0xA6,0x94,0xAC,0x3B,0x57,0x7E, + + 0x38,0xDC,0xB3,0x27,0xFF,0xB4,0x1B,0x63,0xC6,0xB7,0xFF,0xDE,0x5E,0xCB,0x1A,0x15, + + 0xAF,0x0D,0x22,0xC8,0x3A,0x23,0x7A,0x5B,0xB5,0x49,0xA7,0x5D,0x64,0xE1,0x52,0xAA, + + 0xAE,0x56,0x6E,0x7A,0xBC,0x2E,0xC1,0x45,0x25,0xC4,0x3A,0xC5,0xBC,0x4A,0x31,0x0B, + + 0x73,0x27,0x1E,0x3E,0xA4,0xE8,0xB3,0xD4,0x2D,0xA9,0xE4,0x5C,0xA0,0x6B,0xF6,0x1A, + + 0x89,0xAB,0x2F,0x1A,0x39,0xE8,0xC4,0x45,0xE3,0x14,0x28,0xC5,0xB6,0x43,0x62,0xB3, + + 0xBF,0x17,0x9C,0x48,0xFF,0x2F,0x4C,0x0B,0x2E,0xB3,0x32,0xEB,0x6B,0xE6,0x02,0x38, + + 0xB0,0x83,0x98,0x5F,0x53,0x00,0x9D,0x3A,0x43,0x66,0x23,0x7E,0x24,0xEF,0x54,0xCF, + + 0xB0,0x20,0x50,0xBC,0x12,0xA3,0x8C,0x18,0xFC,0xA0,0xB3,0x1C,0xB7,0x91,0x53,0xB5, + + 0x0C,0x82,0x76,0x66,0x64,0x22,0x73,0x6A,0x2E,0x60,0xA0,0x44,0xA0,0xED,0x7E,0x81, + + 0x52,0x65,0x23,0x02,0x32,0xB7,0xC9,0xE5,0x99,0xA6,0x74,0x36,0x6C,0x25,0x2C,0x81, + + 0x4C,0x59,0x62,0x51,0x33,0x31,0x03,0x36,0x63,0x8E,0x2B,0xC8,0x1F,0x20,0x85,0x7D, + + 0xCF,0x3A,0xFC,0xF1,0xB2,0xF0,0xCA,0xDD,0x72,0x0D,0xCD,0x96,0x88,0x5D,0x98,0x32, + + 0x11,0x90,0x7F,0xD7,0xBD,0xF2,0x05,0x5D,0x49,0xDE,0xC3,0x8B,0xBF,0xC2,0x62,0xEB, + + 0xA6,0x62,0x50,0xA4,0x4E,0x4B,0xA0,0x71,0xC7,0x6B,0xAA,0xB3,0x76,0x50,0x12,0x6A, + + 0xCC,0x26,0xEC,0x2F,0x3B,0xF7,0xC7,0xB0,0xC6,0x28,0xCF,0x4E,0x71,0x8D,0xF5,0xDC, + + 0x94,0x1B,0x5E,0x7F,0x41,0x2D,0x0E,0x67,0xEA,0xB6,0xEB,0xAF,0x0E,0x45,0x53,0x7B, + + 0x6F,0x3E,0xE9,0x70,0x5E,0xBF,0x55,0x91,0x13,0x84,0x9F,0xD3,0xF7,0xF7,0x11,0x2F, + + 0xDC,0xDB,0x4A,0xAA,0xB1,0xF9,0xCB,0xED,0x91,0xAE,0x96,0x11,0x9D,0x57,0xFE,0x72, + + 0x83,0xD4,0xB0,0x0E,0xD6,0xE8,0x40,0x82,0x4F,0x34,0x04,0x3A,0x3D,0x36,0xA7,0xD3, + + 0xA7,0xD6,0x67,0x0A,0x74,0x17,0x49,0x92,0x19,0x8C,0xE7,0x5C,0xD6,0xE1,0x51,0xB2, + + 0xCE,0x64,0x91,0xFE,0xFF,0x14,0xBA,0xFC,0x0C,0x7D,0xBF,0xBF,0xFD,0xFB,0x1E,0xF8, + + 0xE6,0x93,0xF0,0xAC,0xC5,0xFE,0xC1,0x47,0x68,0xBE,0xF6,0xEE,0x7E,0xFC,0x66,0xDF, + + 0xC6,0x8E,0x09,0x21,0x8A,0x6B,0x46,0x11,0xDC,0xD3,0xFE,0xFE,0x7F,0xFD,0xB4,0x38, + + 0xD0,0x35,0x67,0x43,0x33,0xC3,0x51,0x85,0xC0,0x78,0xF7,0xEF,0xFE,0xFE,0xAF,0x5F, + + 0x18,0x92,0x87,0xD9,0x3C,0xDB,0x47,0x04,0x6C,0xD2,0xFF,0xFF,0x71,0x9D,0x80,0x19, + + 0x40,0x40,0x30,0x08,0xF1,0x43,0x16,0x7E,0xCD,0x22,0xA7,0x70,0x23,0x60,0xA7,0xE1, + + 0xED,0x0C,0x9A,0x10,0xF8,0xA0,0x0E,0x9D,0xAA,0x32,0x8E,0x56,0xAE,0xBC,0x00,0xDF, + + 0xEB,0xC7,0x83,0xF6,0xF4,0x89,0xBA,0xA4,0x53,0x7D,0x51,0x3D,0x83,0x9F,0x57,0x22, + + 0x01,0xA8,0x65,0x86,0xF9,0x29,0xA2,0x80,0xF7,0xEC,0x4D,0xCB,0x2C,0xE2,0x12,0x4F, + + 0xE9,0x95,0xB9,0x32,0xE1,0x34,0x46,0x48,0xA9,0x55,0x01,0x7B,0x6C,0x0A,0x5E,0x91, + + 0xFC,0x88,0x7B,0x69,0x15,0xF5,0xCE,0x0F,0x2B,0x34,0xE6,0xD8,0x91,0x65,0x61,0x61, + + 0x6B,0x47,0x7B,0xBE,0x6E,0x25,0xEA,0xD0,0xAE,0xE9,0xEF,0xC8,0x10,0x99,0x9D,0xAF, + + 0x7B,0xCF,0xD3,0x0F,0x66,0xBB,0x27,0x5C,0x36,0xE4,0xD1,0x61,0xB8,0x34,0x30,0x18, + + 0x8D,0x1E,0x06,0x08,0x58,0x9B,0xC3,0x7A,0xFB,0xC2,0xF3,0xDF,0x20,0xB5,0x2D,0x19, + + 0x62,0x7D,0xF4,0x20,0xF0,0xA8,0xCF,0x6A,0x0A,0xB9,0x2D,0x00,0xA4,0x0A,0x5D,0x13, + + 0x88,0xA1,0xBD,0xDD,0xDB,0x0A,0x6B,0x63,0xF9,0xE7,0xC1,0x22,0x33,0xFB,0x89,0xDF, + + 0x1B,0x08,0x91,0x19,0xB8,0x4B,0x12,0xCA,0xF3,0xE6,0xFD,0x5F,0x2E,0x96,0x19,0x48, + + 0x0C,0x9C,0xED,0x33,0xC3,0x22,0xC3,0x9B,0x7E,0x4D,0xD2,0x9D,0x64,0x93,0xB5,0x26, + + 0x25,0xD2,0x31,0x1B,0xE2,0xDB,0x76,0x0A,0xA0,0x2C,0xE9,0xC9,0x78,0x2D,0x08,0x36, + + 0xE2,0x03,0xFB,0xB2,0x19,0x23,0x54,0x6C,0xCE,0x2E,0xD5,0xC5,0x33,0x7D,0xF4,0x69, + + 0x19,0xA0,0xB5,0xED,0x6A,0xF9,0x65,0x5C,0x46,0xC9,0xDD,0xC8,0x99,0xC0,0x90,0x73, + + 0xA4,0x9D,0xA4,0x99,0x5B,0xD1,0x91,0xDD,0x89,0x31,0xAC,0x25,0x1B,0x91,0x36,0x72, + + 0x69,0x70,0xD2,0xBD,0x39,0x9A,0x65,0xE6,0x94,0x9D,0xC2,0x9D,0x79,0xDA,0x57,0xCB, + + 0x4B,0x76,0xB0,0x74,0x80,0x33,0x03,0xC3,0x80,0x28,0xA0,0x54,0xC0,0x7F,0x33,0xB4, + + 0x43,0xC3,0x1C,0xBE,0xDA,0x42,0x1C,0xE7,0x1C,0x9F,0x0C,0x9B,0x9A,0x02,0x8C,0xE6, + + 0x72,0x99,0xC8,0x2E,0xD7,0xAB,0x2A,0xE7,0xC3,0xFB,0xB7,0xF7,0x23,0x15,0x06,0xD1, + + 0x5E,0x1C,0x9C,0xEA,0x4F,0x77,0x0C,0xDF,0x5B,0x00,0xDC,0xB4,0x0A,0xD1,0x91,0x3E, + + 0x4B,0x9C,0xC4,0xB3,0x49,0xC3,0xC2,0xC6,0x43,0xF9,0xEB,0xC0,0x7D,0xF0,0x0F,0xA2, + + 0xFA,0x96,0x4E,0xA5,0x30,0x3A,0xCC,0xDA,0xDF,0x51,0xCC,0xF3,0x3B,0x96,0x39,0xFA, + + 0xC3,0x79,0x8E,0x2C,0x60,0x58,0xCD,0xA4,0x17,0xA1,0x96,0xAE,0x24,0xD3,0x8E,0xAA, + + 0x49,0x49,0x0B,0xB8,0xD0,0x78,0xDE,0xB5,0x14,0xF4,0x86,0x4D,0x41,0x59,0x39,0xAC, + + 0xC3,0x15,0x07,0x89,0xCE,0x39,0xA2,0x9D,0x10,0x69,0x01,0x86,0x93,0x6B,0xF0,0xEA, + + 0x0A,0x98,0x99,0x59,0x46,0xB6,0x8B,0x88,0x48,0xDA,0xC1,0x91,0x41,0xD0,0x1C,0x37, + + 0xCB,0x9F,0x51,0x3F,0x5C,0x32,0x56,0xF4,0x6C,0xCC,0x72,0x8E,0x8D,0x19,0x10,0x60, + + 0x23,0xB2,0xE8,0xF4,0xBF,0x99,0x26,0x59,0xE6,0xD6,0x6F,0xD0,0xC3,0x0C,0xF6,0x82, + + 0x57,0x22,0xFF,0x71,0x51,0x9D,0xE0,0x1A,0xCC,0xFA,0xEF,0x12,0x46,0x4F,0x18,0xD2, + + 0xDD,0x1B,0x59,0xDA,0x1A,0xE0,0xDF,0x6A,0x8B,0xF0,0x1F,0xE5,0x3B,0xC0,0xC3,0xF9, + + 0x20,0xC0,0x20,0x07,0xBA,0x0D,0xE5,0xF2,0x18,0x6F,0xA6,0x44,0xAB,0x3D,0x9F,0x13, + + 0x88,0x8D,0x2C,0x12,0x55,0xB2,0x5A,0x8F,0x44,0xB1,0xAF,0xC5,0x2D,0x3C,0xA6,0xAD, + + 0x0B,0x80,0x31,0x94,0x9F,0xAA,0xA3,0x50,0xFE,0xAC,0x65,0xD9,0x29,0x43,0x41,0x0C, + + 0xA1,0x82,0x97,0xD2,0xB7,0xAE,0x60,0x58,0xA6,0x3C,0xEF,0x0F,0x3E,0x72,0x77,0x3C, + + 0x64,0xF0,0x9E,0xE3,0xFF,0x97,0xF6,0x22,0x4A,0x84,0x50,0x7C,0xDA,0x49,0xD7,0xF7, + + 0xCD,0x88,0x91,0x20,0xE4,0xB5,0x6E,0x57,0xAC,0x81,0xA2,0x72,0x3F,0xF4,0x1F,0x7B, + + 0x7A,0x57,0xF7,0x25,0xF6,0xDC,0x73,0xCB,0xA5,0xD9,0x24,0x85,0x9E,0x87,0x92,0x2C, + + 0xEF,0x8A,0x53,0xAC,0x6B,0xE4,0x43,0xC3,0x0A,0x68,0x87,0x5F,0x36,0x44,0x25,0x0F, + + 0x08,0x88,0xE6,0xFF,0x70,0x9D,0xCA,0xC2,0xA9,0x87,0x32,0x2A,0x2A,0x45,0x74,0xB2, + + 0x0D,0x04,0xBF,0x1F,0x76,0xF8,0xBB,0xC7,0xB0,0xBC,0xB2,0x3B,0x59,0x69,0x5D,0xFA, + + 0xE2,0x96,0xFD,0x27,0x3C,0x01,0xB3,0x3B,0xB6,0x11,0x23,0x68,0x16,0xA0,0x55,0x3E, + + 0x6C,0x2A,0x9E,0xEE,0xA1,0xA7,0xA9,0x00,0xF7,0x89,0xEC,0x4C,0xD2,0xE8,0x9D,0x34, + + 0x20,0x53,0x51,0xEF,0x18,0x7C,0xD6,0x08,0x6F,0xAC,0x64,0x9D,0x32,0x67,0x7D,0x24, + + 0x65,0x1C,0x55,0x1C,0xBE,0x00,0x6B,0x4A,0x1B,0x62,0x6F,0x0C,0x35,0xBC,0xDC,0x7A, + + 0xF6,0x21,0xF9,0x31,0x1F,0xA3,0xF3,0x6E,0x2A,0x63,0x73,0x5E,0xE2,0x41,0x15,0x63, + + 0xAF,0x3F,0xBE,0x6E,0x3E,0x2E,0xDB,0x09,0xA5,0x2E,0x85,0x53,0xDB,0xAF,0x74,0x7C, + + 0xD9,0x19,0x70,0x78,0xCC,0x78,0x38,0x48,0xA1,0x0D,0x21,0xA4,0x54,0x40,0x88,0xF0, + + 0xDE,0x0A,0xE7,0xE9,0x5D,0xBC,0x96,0xA3,0x49,0x7C,0x0B,0x92,0x02,0xF1,0xA1,0x70, + + 0x20,0x46,0xFE,0x87,0xB2,0x22,0x9F,0xAB,0x21,0x2F,0xF8,0x07,0xE8,0x20,0x2D,0x7B, + + 0x44,0xDE,0x52,0xE9,0x9B,0x6C,0xA9,0xF4,0x27,0x93,0x8A,0xE3,0x86,0xF3,0x61,0x33, + + 0x54,0xB4,0x50,0xA4,0xBB,0x12,0x21,0xD3,0xC7,0x55,0xC7,0x04,0x70,0x24,0xBF,0x22, + + 0x9B,0x06,0x38,0x28,0x8B,0x84,0x7D,0x84,0x9C,0xAE,0xDA,0xCE,0xFB,0x28,0x3B,0x7A, + + 0x12,0x3D,0xB7,0x38,0x43,0x10,0x79,0x09,0x03,0x49,0x80,0xF4,0x8E,0xB2,0xDC,0x6A, + + 0x1F,0x44,0x5C,0xFB,0x0F,0xC6,0x7E,0xCC,0xC1,0x02,0x85,0xD0,0x0A,0xF8,0xDD,0x82, + + 0x89,0x67,0x19,0xBE,0xAE,0x17,0x7E,0xAF,0x68,0xD8,0x76,0xB6,0x2F,0x05,0x34,0x84, + + 0x1B,0x6D,0xD0,0xA6,0xBD,0x2B,0xE1,0xBB,0xED,0x99,0x6A,0x40,0x80,0x78,0xFA,0x87, + + 0xAA,0x4A,0xB0,0xF1,0xDE,0xCE,0x7D,0x8B,0xFC,0x5A,0xA1,0xCD,0x03,0x27,0xFA,0xE8, + + 0x93,0x80,0x18,0xBB,0xCA,0xBB,0xE0,0xBB,0x31,0x7A,0xDE,0x4C,0x85,0x26,0xA6,0xD2, + + 0x23,0x63,0x26,0xD6,0xFE,0xD0,0x22,0x6E,0x3A,0x55,0xAC,0xEF,0x16,0x2F,0xD1,0xEB, + + 0x8E,0x62,0x96,0x4D,0x55,0x22,0x56,0x98,0x86,0xEE,0xA9,0x0D,0x05,0x88,0xB3,0x58, + + 0x0F,0x41,0x81,0x7B,0x45,0x13,0xCC,0xA9,0x4F,0x23,0x89,0x53,0x1F,0x5D,0xD4,0x7E, + + 0x58,0x62,0x2F,0xC3,0x05,0x6B,0x69,0x99,0x8F,0xA5,0xAC,0x11,0x47,0x2C,0xC0,0x18, + + 0x0D,0xFF,0x05,0xB5,0xF9,0xCA,0x77,0x28,0x2B,0x85,0x35,0xD5,0x34,0x76,0xB7,0x21, + + 0xA0,0xFE,0x3F,0x40,0xE6,0x94,0x46,0x03,0xC1,0xEA,0xC0,0xAC,0xAD,0xA9,0xD5,0x92, + + 0x21,0xDD,0x8F,0xD1,0xB3,0xB0,0x77,0xD0,0x2C,0x49,0xAF,0xF0,0x99,0xA8,0xB2,0xB4, + + 0x76,0xFE,0x41,0xEF,0x97,0xB3,0x2B,0x21,0x44,0x55,0x62,0x0E,0xDA,0xFC,0x1E,0xD2, + + 0x06,0xD0,0xFE,0x3A,0xB1,0x41,0xC0,0x91,0xE1,0x04,0x46,0x95,0x62,0xC2,0x2F,0xA1, + + 0xD1,0x45,0x48,0x44,0xB6,0x2B,0x4A,0x83,0x23,0x98,0x16,0xCF,0x57,0x14,0xA2,0x5E, + + 0x5C,0xA9,0xFF,0x3A,0x31,0x54,0x63,0x5F,0x61,0xE7,0x8F,0x4C,0xB1,0x62,0x37,0x67, + + 0x68,0xE2,0xA1,0xD3,0x6F,0x66,0x0F,0x54,0x28,0x26,0xE7,0xB0,0xF1,0x6A,0x14,0x20, + + 0xE3,0x19,0xC9,0x73,0x70,0x25,0x31,0x32,0x90,0xFC,0x52,0x34,0x0B,0x95,0x9C,0x67, + + 0x61,0x78,0x35,0x2D,0x7D,0x86,0x7B,0x98,0x9F,0xF6,0x4E,0xC2,0xA4,0xC8,0xB8,0xB8, + + 0xE4,0xA5,0x7C,0x73,0xB6,0xF5,0x4D,0x26,0x9A,0x04,0x85,0x4F,0x27,0xB7,0x75,0x34, + + 0x7C,0xA8,0x19,0x63,0xF3,0x8A,0x45,0xAF,0x03,0xE0,0x09,0xCE,0xBD,0xB6,0x1C,0x7B, + + 0x1A,0xA3,0x2E,0xCC,0xE6,0x0C,0xEB,0x19,0x07,0x47,0x50,0x90,0xE2,0x97,0x69,0xA9, + + 0xD3,0x4D,0x5A,0x47,0x37,0xD0,0x64,0x2C,0x20,0x42,0xEF,0x81,0x7A,0xB9,0x71,0x0F, + + 0x18,0xA1,0x6F,0x0F,0x19,0xDA,0x40,0x7A,0x9B,0x7F,0xEB,0x6F,0x9A,0xB5,0x15,0x56, + + 0xCF,0x41,0xD9,0x7D,0x70,0x5E,0xDB,0x4B,0x3F,0x40,0x49,0x62,0xB7,0xC2,0xB3,0xA4, + + 0xAF,0x12,0x3B,0xB5,0x54,0x9F,0x33,0xBB,0x0B,0x24,0x40,0x5A,0x8D,0xD1,0x64,0x61, + + 0x0D,0x65,0xF2,0xA5,0xDA,0x50,0xFF,0x4B,0x43,0x41,0xCA,0x85,0x9A,0xD0,0xB2,0x80, + + 0x2D,0x1E,0x17,0xFB,0xDA,0x93,0x95,0x67,0x72,0x51,0x07,0x56,0x94,0xAF,0x53,0xA1, + + 0x33,0xB8,0xAB,0xA1,0xD1,0x73,0x1F,0x4C,0xE1,0x57,0xE3,0x90,0x39,0xB2,0x1A,0x2F, + + 0x2E,0xBF,0xBA,0xFD,0x49,0xB4,0xC0,0x26,0x3E,0x57,0xF4,0xF4,0x05,0x41,0x12,0xCA, + + 0x23,0xBE,0x84,0xD1,0x37,0x25,0x23,0xE3,0x9D,0xA8,0x7B,0xC1,0x9A,0xA4,0xB8,0x61, + + 0x27,0x00,0xFA,0x02,0x78,0xA7,0xB6,0x1A,0xC0,0x49,0x0A,0xE7,0x26,0xB7,0x6A,0xD5, + + 0xC8,0x63,0xA0,0x6E,0xF3,0x45,0x7B,0x4F,0x16,0xF3,0x6E,0xCC,0xC0,0x37,0x10,0x87, + + 0x43,0xD9,0x80,0x4B,0xC4,0x00,0x96,0x55,0x60,0xAC,0x84,0xEA,0x24,0xD5,0x03,0x64, + + 0x29,0xAC,0xD5,0x9C,0x3F,0xA9,0xC1,0xBC,0xE9,0x19,0x18,0xA9,0x85,0xE8,0x66,0xCF, + + 0xF4,0xEF,0x5C,0x8D,0x40,0xD2,0x82,0x09,0xFC,0xDA,0x06,0x4D,0xF4,0x3A,0x81,0x61, + + 0xA9,0x59,0xC4,0xE2,0x8A,0x7B,0xC0,0xB8,0x35,0x1A,0x20,0x18,0x33,0x76,0xC4,0x0E, + + 0xB8,0x1F,0xF8,0x09,0x18,0x31,0x21,0x93,0xA2,0xCB,0x7A,0x49,0xAF,0x1F,0xA2,0x4A, + + 0x2B,0x15,0xFE,0xDE,0x7B,0xE6,0x9F,0xFC,0x2F,0x0E,0x84,0x0F,0x43,0xA0,0xC0,0xA4, + + 0x43,0x2F,0x45,0x31,0x02,0xC5,0x6C,0x18,0x55,0x4C,0x7C,0x27,0x41,0xFF,0x9B,0x79, + + 0xF3,0x1D,0xFA,0x20,0x9B,0xEB,0x1A,0xFD,0xAF,0x1C,0x8D,0x6E,0x10,0x6E,0xB1,0xF1, + + 0x30,0x2D,0xDE,0x37,0x94,0xC2,0xD6,0xC6,0xA5,0x6F,0xE6,0x17,0xBF,0x41,0x1A,0x2C, + + 0xA6,0x20,0x57,0x65,0x52,0xC2,0x46,0xAC,0xAE,0x37,0xAE,0x54,0xAA,0x4C,0xB3,0xF2, + + 0x27,0xC2,0x9F,0xD2,0xFC,0xAF,0x57,0xD2,0x06,0x42,0x91,0xA2,0x3D,0x08,0x3E,0xE0, + + 0xFD,0x5E,0x52,0x68,0xFD,0x62,0x67,0xA8,0xD5,0x6C,0x73,0x92,0x22,0x1E,0x01,0xE2, + + 0xD0,0x3B,0xDA,0xF6,0xA2,0x0B,0x66,0x56,0xAD,0x05,0x63,0x58,0x2E,0xFF,0x9B,0xAC, + + 0xCF,0x32,0xB8,0x5E,0x1B,0x28,0x6E,0x4D,0x37,0x38,0x2C,0x28,0xC4,0xDA,0x47,0xFC, + + 0x79,0x22,0x70,0xB6,0xE6,0xE6,0xCA,0xD2,0xAE,0x69,0x71,0x20,0xF8,0x3A,0x16,0x40, + + 0x75,0x18,0x97,0x6F,0x6B,0x9F,0xAD,0xE0,0x66,0x18,0xEB,0x97,0x3C,0xD6,0x74,0x32, + + 0xE7,0x19,0xDC,0x3A,0xE9,0x0B,0x51,0xDB,0xA8,0x6E,0xA4,0x1A,0xB7,0x29,0x6C,0x2A, + + 0x09,0xA9,0xE7,0x2F,0xBC,0x56,0x0C,0xCB,0xAD,0x89,0xAC,0x4D,0x46,0x48,0x65,0x2E, + + 0x0C,0x1E,0xB5,0xFC,0xF4,0x07,0x6D,0x1C,0xEF,0x65,0x08,0x9E,0xB4,0x45,0xAA,0xD9, + + 0x0E,0xCD,0x95,0xD7,0xB3,0x74,0x93,0xB1,0x1D,0x5F,0x83,0xC0,0x34,0xF1,0x57,0x66, + + 0xB7,0x87,0x39,0x4E,0xE6,0x44,0xCD,0x5B,0xEF,0x33,0x49,0xDE,0x94,0x43,0xDB,0x0F, + + 0xBA,0x86,0xA1,0x21,0x77,0xA0,0x6C,0x4E,0xA4,0x4C,0x36,0xDE,0xFE,0x2D,0xE7,0x4F, + + 0xCA,0x83,0xB8,0x4F,0x98,0x3E,0xC8,0xCE,0x39,0x33,0xE2,0x6D,0xE6,0x43,0xEF,0x5F, + + 0xCB,0x11,0x95,0x63,0x6A,0xCC,0xC0,0xCA,0xA7,0x60,0x20,0x51,0xA0,0xEF,0x27,0x5A, + + 0xD9,0x31,0x08,0x23,0xE1,0xD3,0xE9,0xA6,0xD9,0xBE,0x4F,0xD9,0x1C,0xFD,0x03,0xED, + + 0xFC,0x0E,0xBD,0x65,0x05,0x6C,0xBC,0xA7,0x79,0x7C,0x03,0x87,0x15,0x5E,0x1D,0x7C, + + 0x51,0xF1,0x0E,0x4D,0x0F,0x13,0x53,0x8E,0xE7,0xB2,0x4A,0xD9,0xDA,0x2D,0x7D,0x9B, + + 0xE9,0x2E,0xFB,0xA2,0x5E,0x52,0x77,0x63,0xED,0x7C,0xAF,0xC9,0x9F,0x92,0x42,0xF2, + + 0xA2,0x30,0x76,0xD9,0x5A,0x1F,0x4A,0xCB,0xE9,0x52,0x44,0xFE,0x97,0x97,0x4A,0xAD, + + 0x84,0xD7,0xB4,0xD4,0x5C,0x02,0x7B,0x72,0xAF,0x54,0xF8,0x8B,0x56,0x77,0xF1,0xC4, + + 0x4F,0x4B,0xF4,0x54,0xDD,0x87,0x75,0xA3,0xC6,0xD5,0x0A,0x94,0xB5,0x7C,0x6E,0xAF, + + 0x27,0x27,0x69,0x5A,0x5E,0xDD,0xDD,0xE0,0xCB,0xB3,0xC3,0xAE,0x97,0x7C,0x30,0xE8, + + 0xD7,0x05,0x80,0x4A,0x08,0xBB,0x25,0xC5,0x0D,0x98,0xC8,0x8B,0xB4,0x60,0x04,0x4A, + + 0x8E,0x11,0x0B,0x6F,0x59,0xAF,0x58,0x4B,0x5D,0xD2,0xAF,0xA0,0xBB,0x0D,0xF3,0x71, + + 0x45,0x62,0x22,0x87,0xD7,0x1B,0x6F,0x73,0x87,0x3B,0xA2,0x91,0x90,0x0F,0x2E,0x68, + + 0x67,0x30,0x8F,0x32,0xD6,0x1A,0x19,0x7A,0xD9,0xD8,0x59,0xCD,0x16,0x5D,0x40,0xFA, + + 0xAA,0x38,0xB6,0xAC,0x7A,0x67,0x48,0x94,0xA6,0x21,0x09,0x9C,0x1C,0xA9,0x16,0xFD, + + 0xC6,0x60,0xEC,0x22,0x87,0x46,0x5E,0xE3,0xA7,0x5C,0x69,0xFF,0x94,0xFE,0xF3,0xCC, + + 0x47,0x43,0xD2,0x32,0x3F,0xBA,0x0F,0x6F,0xBE,0x07,0xDA,0x90,0x67,0x55,0x17,0x4A, + + 0x97,0x32,0xE7,0xC1,0xDB,0x4B,0xDF,0xE8,0xC3,0xBB,0xDA,0x5E,0x7F,0xCF,0x5E,0x3D, + + 0x08,0xAB,0x04,0x00,0x04,0x58,0xB8,0xAA,0x2B,0xD4,0x69,0x03,0xF1,0x1F,0x52,0x3F, + + 0x7D,0x54,0x08,0x1D,0xB8,0xA0,0x46,0x3F,0x0D,0x0F,0xC0,0x24,0xBA,0x19,0x51,0x2F, + + 0xEB,0x21,0x93,0x31,0xB3,0x42,0x11,0x32,0xD9,0xF6,0x3D,0xA1,0x80,0x8F,0x59,0x3A, + + 0xAB,0x41,0xE2,0x75,0x9D,0x63,0x78,0xC1,0xC9,0xE2,0xB9,0x6C,0xAE,0x43,0xF8,0xBF, + + 0x20,0xA9,0xB1,0x59,0xFA,0xD4,0x52,0x9A,0xA6,0xDB,0x74,0x95,0xF1,0x24,0xC8,0xAC, + + 0x03,0xD1,0x07,0x49,0x1E,0xD5,0xFB,0x9F,0x65,0x1A,0xE2,0xF3,0xA4,0xEE,0x43,0xBD, + + 0x8A,0x02,0xA1,0x58,0xA1,0xD6,0x58,0x8E,0x7F,0x39,0xEE,0xE1,0x82,0x79,0x03,0x2E, + + 0xC0,0xF5,0xDF,0x48,0xDB,0xF7,0xB7,0x9F,0xB0,0x18,0xDD,0xF2,0x2C,0x27,0x01,0x4D, + + 0xF7,0x6B,0x03,0xC1,0x2B,0x57,0x46,0xDB,0x62,0xC5,0x49,0x38,0x23,0x6E,0x1C,0x7A, + + 0xF6,0xD4,0x32,0xEF,0x54,0x3B,0xAF,0x05,0xFE,0x7C,0x8A,0x5E,0xEA,0x0C,0x65,0x6B, + + 0x7F,0xF7,0x3B,0xFE,0x8D,0x38,0x45,0x89,0x23,0x49,0xC8,0x2D,0x5A,0x22,0xDF,0xE7, + + 0x74,0xAA,0x33,0xEE,0xC4,0x39,0x4F,0xBD,0x99,0x23,0xA3,0xD6,0x75,0x66,0x3C,0x84, + + 0x39,0x33,0x7E,0x50,0xE4,0xFC,0xC6,0x83,0xDF,0x73,0xD1,0xD0,0x92,0x64,0xF2,0xAB, + + 0x10,0x16,0xC4,0x40,0x01,0x9D,0x70,0x92,0x36,0x52,0x84,0x9E,0x5F,0xD0,0xFB,0xBA, + + 0x99,0x1C,0xA2,0x51,0xB9,0xFE,0x0F,0x82,0xDC,0x51,0x73,0x7E,0xA4,0x0A,0xB1,0x3F, + + 0x60,0xC5,0x76,0x44,0x2D,0x9F,0x9E,0x8E,0x5A,0xA0,0x1B,0x65,0x68,0xE2,0x95,0x16, + + 0xE8,0x61,0x68,0x86,0x38,0x5C,0x05,0xB3,0x0C,0x14,0xAA,0x65,0x18,0x3A,0x52,0x02, + + 0x29,0xB5,0x4F,0xD3,0x3F,0x9E,0x62,0x80,0xCD,0x5C,0x8A,0xE8,0x9A,0xB9,0xE3,0x70, + + 0x6A,0x32,0x65,0x8C,0x4D,0xB8,0x33,0x95,0x6C,0x5F,0xEB,0xED,0x19,0xCA,0x1F,0x0F, + + 0x69,0xB2,0x83,0x17,0x05,0xB8,0x63,0x80,0xC3,0x85,0xA3,0x74,0x7E,0xD5,0xC0,0xD3, + + 0x29,0x1E,0x9A,0xCD,0x5E,0x24,0x15,0x06,0xC3,0x1B,0xB7,0x60,0x72,0xB4,0x4C,0xD2, + + 0x21,0x2E,0x9A,0xC1,0x96,0xD5,0x56,0x16,0x21,0x7A,0xE6,0x51,0x84,0x88,0x63,0x98, + + 0xF3,0x58,0xAC,0xCD,0x7E,0x26,0xE4,0x07,0x85,0x19,0xEA,0xD5,0xFA,0x89,0xB7,0xD8, + + 0x0E,0x9E,0x6E,0xC0,0x89,0xF7,0x63,0x12,0x59,0x78,0xCB,0x97,0x0C,0xAA,0xE1,0x79, + + 0xF2,0x08,0xBE,0x2C,0xD5,0xB8,0x69,0x30,0x6C,0x48,0x5E,0xEC,0x38,0x8D,0x1F,0xAE, + + 0xE1,0x28,0x26,0x84,0xBB,0x6C,0x14,0x7A,0xEA,0x1F,0x56,0xA3,0x60,0x62,0x3D,0x7A, + + 0x7A,0xBE,0x6F,0x95,0x38,0x7A,0xC5,0x30,0xEC,0xBA,0xDB,0xAF,0xFC,0x8F,0xB9,0x68, + + 0x41,0x1F,0xD5,0xFF,0x9B,0xF6,0xA8,0x9D,0x68,0x56,0xE7,0xCF,0x5E,0x7F,0xB3,0x28, + + 0x6A,0x2E,0x7A,0xD8,0xA6,0xFC,0xF1,0x0B,0x0F,0x73,0x02,0x12,0x93,0x74,0xCE,0x1E, + + 0x2F,0x1B,0xEE,0xCD,0x5F,0xBD,0xA7,0x1A,0xFC,0x52,0x09,0x40,0x90,0x19,0xFB,0xB9, + + 0x1E,0x15,0x13,0xDC,0x2D,0x9E,0x5F,0x0A,0xB8,0x51,0x40,0x1E,0x7E,0xD3,0x47,0xB7, + + 0xC8,0x3F,0x62,0xCD,0xC6,0xBF,0x2C,0x1B,0x4B,0x50,0xE5,0x7A,0x10,0xB9,0xB6,0xF1, + + 0x68,0x5D,0x18,0xF9,0x1A,0xE6,0xCF,0x87,0x8E,0xCD,0x49,0x01,0xF5,0x9F,0x0E,0x27, + + 0x81,0x2E,0x2C,0xD1,0x95,0x81,0xC7,0x4C,0x6B,0x1E,0xE0,0x97,0x3E,0x99,0x77,0x37, + + 0x6F,0x43,0x22,0x78,0xB6,0x4F,0xCA,0x5C,0xAC,0xCF,0x1D,0xA3,0x84,0x0F,0x8D,0x71, + + 0x6E,0x02,0x05,0x91,0x85,0x5E,0x86,0x02,0xA9,0x6C,0xBD,0x35,0xA5,0xF8,0x61,0x24, + + 0xED,0x6E,0xC1,0x5F,0x55,0x14,0xAA,0x95,0x2E,0x0B,0x14,0x95,0x90,0x6F,0x22,0xF2, + + 0xA6,0x95,0xDB,0x4E,0x34,0x35,0xAD,0x81,0xE4,0x6A,0xA6,0xE5,0x47,0x68,0x31,0x4B, + + 0x90,0x2B,0x22,0x5F,0x73,0x36,0x9B,0x95,0x56,0x09,0xF5,0xE0,0x3D,0x00,0x4F,0x97, + + 0x84,0x84,0x3D,0x5A,0x74,0xD7,0xCB,0x80,0x9C,0x68,0x87,0xE5,0x6A,0x18,0x96,0x68, + + 0xE7,0x29,0xF2,0x78,0x10,0xC6,0xA4,0x54,0x26,0x09,0x4F,0x48,0xB7,0xC2,0x48,0x1A, + + 0x0E,0xE9,0x2F,0xF6,0xAE,0xE4,0x2C,0x13,0xA6,0xF8,0xFB,0x58,0xB6,0x51,0x10,0x5E, + + 0x7D,0xE4,0x83,0x0E,0x11,0xEC,0x4D,0x1F,0xAF,0xDA,0xF2,0x49,0x37,0xA0,0xAB,0x13, + + 0x46,0x2F,0x54,0xBF,0x74,0xCB,0x01,0x8A,0xFD,0x64,0xFA,0x59,0x36,0x33,0x61,0x42, + + 0x8E,0x8E,0x16,0x43,0x35,0xDC,0xB0,0x98,0xC5,0x43,0x5E,0x9E,0x5C,0x1A,0x69,0x4B, + + 0xC7,0x55,0xDA,0x52,0x0C,0xFD,0xFB,0x9D,0xD2,0xA2,0xFA,0x8D,0x89,0x46,0x45,0x8A, + + 0x8D,0x8D,0xF4,0x43,0x73,0xFE,0x54,0x99,0xDB,0x41,0x8D,0xF0,0x3F,0x68,0x60,0x59, + + 0x9F,0x8B,0x68,0x56,0x1A,0x9F,0xD8,0x9C,0xC8,0xA0,0x9C,0x77,0x3E,0x40,0x1A,0xD7, + + 0x4F,0x9F,0xA6,0x40,0x20,0xB4,0x1C,0x40,0xE5,0xB4,0x6D,0x4E,0xCB,0xBD,0x12,0xB6, + + 0x06,0x13,0x1D,0x66,0x94,0x3B,0x62,0x70,0x75,0xD7,0x43,0x16,0x98,0x91,0x24,0xB1, + + 0x4F,0x17,0x25,0xC1,0xA0,0xB4,0x1D,0xA5,0x65,0xDC,0xCB,0x76,0xE6,0xBF,0x13,0xB6, + + 0x85,0x9E,0x7A,0x75,0xCA,0xB3,0x35,0x4C,0x44,0xD2,0x51,0xB5,0xFD,0x9F,0x1C,0x62, + + 0xD9,0x2B,0x24,0xC3,0xDC,0xD4,0xD2,0x00,0x1B,0xDB,0xAE,0xE7,0xF8,0x5B,0x04,0xD5, + + 0xA4,0x9A,0x0D,0xD2,0x09,0x95,0xAA,0x10,0x57,0xDA,0xC6,0x05,0xB5,0x09,0x0D,0x01, + + 0x25,0xD2,0x2B,0xC3,0x0D,0xF6,0xBC,0x01,0xAB,0xD9,0x13,0x16,0x3C,0xE6,0x05,0xB1, + + 0x81,0x97,0x86,0xD6,0xC4,0xD9,0x3E,0x11,0xE1,0xD5,0x40,0xA8,0x1C,0x21,0xA1,0xCC, + + 0xBE,0x33,0x7D,0x9A,0x47,0xBE,0x0E,0xAF,0x68,0x88,0x56,0xB7,0x81,0xFB,0x09,0x6B, + + 0xB1,0x59,0xBE,0xFC,0x8E,0xDC,0x7C,0x5A,0x61,0x99,0x9E,0xBA,0x02,0xF9,0x04,0x8B, + + 0x64,0xA2,0xFC,0x8F,0x3E,0xF2,0x2D,0x43,0x0F,0x97,0x0D,0xBF,0x83,0xDA,0xC7,0x11, + + 0x2D,0x2B,0x97,0x74,0x11,0xB6,0x3A,0x84,0xAF,0xD0,0x18,0x7A,0xCE,0xA4,0x66,0x35, + + 0x8E,0x63,0xA6,0xF1,0x36,0xD0,0x76,0xF7,0x91,0x2C,0x51,0x71,0x15,0x4A,0x4E,0x24, + + 0x07,0x22,0x49,0x9E,0x82,0xB6,0xC5,0xE7,0x8E,0x2D,0x4C,0xA1,0x14,0x18,0x6F,0x35, + + 0x0F,0x41,0xCF,0x0D,0x6A,0x4D,0x8A,0xF6,0x09,0x2E,0xF6,0x1C,0x2C,0x55,0x43,0x20, + + 0x8A,0x20,0xA9,0xC0,0x3B,0x6B,0x91,0xE6,0x76,0x2F,0xC7,0x0E,0x17,0xFB,0x5E,0x32, + + 0x40,0x4C,0x24,0xF7,0x9C,0x61,0x28,0x88,0xE3,0x01,0xB9,0x77,0xD4,0x7C,0x2F,0x11, + + 0x6A,0x75,0xB2,0xE2,0x82,0x9E,0xB8,0x3E,0xCD,0x4C,0xE0,0x13,0xC0,0xCD,0x60,0xF2, + + 0x50,0xA9,0x29,0x3A,0xA3,0xDD,0xE4,0x20,0xD4,0x76,0x38,0x76,0x5C,0x3E,0x8F,0xD7, + + 0x13,0x00,0xD7,0x37,0x4C,0x88,0x67,0xD3,0x6D,0x4E,0x39,0x7F,0x44,0xCF,0x48,0xF7, + + 0x61,0x24,0x48,0x41,0x71,0xD4,0xD2,0x0F,0x63,0x85,0xC0,0x84,0x1A,0x64,0x30,0x74, + + 0x8C,0x07,0xF0,0x04,0x17,0x2A,0x59,0x83,0x89,0xEE,0xB0,0xB6,0xD5,0x90,0x39,0xC3, + + 0x83,0x71,0xB9,0xC7,0x97,0x66,0x7B,0xB1,0x61,0xCE,0x8F,0x72,0xDA,0x66,0xFE,0x50, + + 0x0E,0x0B,0xF1,0x85,0x64,0x28,0x3E,0x79,0xA8,0x82,0x49,0xF1,0x8F,0x7C,0xE1,0xF3, + + 0x63,0xAE,0xA7,0x0C,0x73,0x0C,0x82,0xE8,0x0C,0xAC,0x36,0x62,0x87,0x55,0x54,0x2E, + + 0xD4,0xA2,0x0A,0x00,0xBA,0xA4,0x8A,0x97,0xBE,0xA9,0xC4,0x18,0x59,0xC2,0x0A,0xF8, + + 0x52,0x1A,0x7C,0x09,0xC0,0x40,0x6B,0x20,0x25,0x78,0x78,0x5A,0x58,0xBD,0xBD,0x7B, + + 0xE2,0xAE,0x6F,0x3A,0x2A,0xA6,0xA7,0xCA,0x6A,0x7B,0x0F,0x99,0x5C,0x2B,0x2A,0x56, + + 0xCC,0xF8,0xA2,0x08,0x56,0xA7,0xFD,0x99,0xA6,0x41,0x92,0x6C,0x5E,0x68,0x14,0xCA, + + 0x0F,0x80,0x48,0x3E,0x5A,0x6D,0x68,0x68,0xCE,0x5B,0x9A,0x78,0x5F,0x69,0xA5,0xB8, + + 0x40,0x4E,0x44,0xAF,0x18,0x66,0x0D,0x5A,0x4A,0xE5,0x57,0xE9,0x86,0xCF,0x35,0xC7, + + 0x60,0xF9,0xB3,0x3F,0xD8,0xF0,0x05,0x63,0xCB,0xE4,0xA3,0xF9,0x83,0x79,0xE4,0xBF, + + 0x04,0x67,0x86,0x76,0x77,0x34,0x2C,0x84,0x63,0x60,0x1D,0xB4,0xD3,0xCB,0xAD,0x97, + + 0x80,0x50,0xB6,0x96,0x2D,0x11,0xBE,0x52,0x71,0x9C,0x9C,0x48,0xF0,0x33,0x01,0x95, + + 0x38,0x56,0x81,0xD1,0x57,0xCC,0x28,0x90,0x64,0x4D,0xB5,0x5D,0xF0,0x89,0x45,0x95, + + 0x4C,0x52,0x0D,0x85,0xA1,0x31,0x8D,0x1E,0x16,0x03,0x1E,0xB9,0x0C,0xD2,0x67,0x31, + + 0xBE,0x54,0x04,0xD4,0x37,0x30,0x94,0xFD,0xC6,0xFF,0xD4,0xE4,0x72,0x74,0x33,0xA3, + + 0xC9,0xBD,0xCC,0xE0,0x00,0x3A,0x23,0x01,0xDC,0x07,0xDC,0xF4,0x73,0x75,0xAD,0x4B, + + 0x80,0xC0,0xC3,0xFA,0xF9,0x74,0xA8,0xF9,0xC0,0x49,0xD5,0xE5,0xF2,0x76,0x3F,0x31, + + 0xE7,0x9C,0x97,0xD0,0x14,0x76,0xF2,0x8A,0x3E,0x8B,0xDD,0xF5,0xF3,0x77,0xF3,0x76, + + 0x2C,0x75,0x96,0xCC,0xB8,0x3E,0x2B,0x99,0xEC,0x47,0x02,0x5F,0x54,0xA5,0xAA,0xEA, + + 0xA7,0x58,0x8A,0x1B,0x18,0xAE,0xA6,0x9C,0x80,0x3D,0xFE,0xFC,0x64,0xF2,0x97,0x82, + + 0x2C,0x4E,0x00,0x3B,0x59,0xE1,0xAF,0x5A,0x4B,0x4A,0xC1,0x89,0x13,0x3B,0xB0,0x82, + + 0x0A,0x9E,0x3B,0x62,0xFA,0xC8,0x8E,0x4A,0x65,0x66,0x1B,0x5F,0x7B,0x73,0x6D,0x26, + + 0x95,0x18,0xA6,0xAC,0x70,0x31,0x6D,0xB6,0x6C,0xAC,0xD6,0xEC,0x7A,0x7C,0xB9,0x87, + + 0x96,0xE1,0x30,0x5E,0xE6,0x82,0x0E,0x12,0x90,0xF6,0xDE,0xFC,0x7B,0x7D,0x45,0xE7, + + 0x5C,0x6B,0x6B,0x5F,0xBB,0x34,0xE7,0x18,0x55,0x8E,0xD7,0xED,0xFA,0x7E,0xE4,0xB7, + + 0x7E,0x11,0xF7,0x23,0xDB,0x33,0xA2,0x61,0x80,0x20,0xDF,0xFD,0xFB,0x7F,0x00,0xF3, + + 0xE4,0x00,0x44,0x21,0x15,0xC0,0x8C,0xAB,0x60,0xF4,0x8E,0x03,0x1E,0x81,0x28,0xE3, + + 0xDD,0xA1,0xA9,0xC9,0xF6,0xA5,0xDC,0xC1,0xE6,0x4A,0x86,0x13,0x1C,0xA0,0x89,0x89, + + 0xEF,0x16,0x5B,0x05,0x9C,0xED,0x91,0x2D,0x48,0x4F,0xE9,0x23,0x9E,0xA3,0x77,0x1C, + + 0xD7,0xCD,0xBC,0x65,0x1B,0xC6,0x3D,0xB4,0xE1,0xB4,0xE1,0xD1,0x57,0xEB,0x3E,0xD9, + + 0x16,0x2B,0x98,0xC2,0x4A,0x10,0x57,0x63,0x2D,0xB0,0xD0,0x09,0x82,0x3B,0xDE,0xA3, + + 0xEF,0xD5,0xB8,0x4A,0x01,0x10,0x9B,0x89,0xC5,0x39,0xAD,0xD6,0xA0,0x85,0x02,0xB0, + + 0x62,0x29,0x71,0xE7,0x8E,0xE7,0x32,0xA5,0x54,0xC5,0x56,0x98,0xBD,0x99,0x17,0x61, + + 0x02,0x91,0x20,0x68,0xDC,0xE5,0x41,0x54,0x6B,0xCA,0xA7,0x98,0x97,0x4C,0x43,0xAA, + + 0xDA,0x37,0xDB,0xDE,0x50,0x29,0x36,0xAA,0xA5,0x8C,0x76,0x4C,0x1D,0xF8,0x9E,0x78, + + 0xFA,0xEC,0x80,0xCE,0x41,0x21,0x9E,0x96,0xA6,0xAD,0xC2,0xBC,0x5C,0x91,0x43,0x54, + + 0x2D,0xEF,0xA0,0x45,0x11,0xC9,0x26,0xD8,0x48,0x67,0xCB,0x4D,0x9D,0xE8,0x13,0xE4, + + 0x0E,0x85,0xBB,0x55,0x11,0xA3,0x03,0xC8,0x6E,0xAE,0x81,0xDD,0x5F,0xE3,0x5D,0x14, + + 0xFF,0x50,0x64,0xCE,0xF7,0xF4,0x89,0x4D,0xEF,0x33,0x0F,0xEA,0x35,0x93,0xC1,0xFF, + + 0xDA,0x93,0xAE,0x2D,0x08,0xC1,0xEA,0xBD,0x4D,0x38,0xFA,0x7E,0x79,0xED,0x3A,0x5F, + + 0x03,0xED,0xA1,0x3E,0xD5,0xA5,0x1B,0xA9,0x48,0x3B,0xB5,0x4B,0xD6,0xEF,0x16,0xA8, + + 0x57,0x5B,0x89,0x5B,0x9E,0xFF,0x7F,0x3C,0x4E,0xC1,0xFB,0x7F,0xDF,0xEF,0x15,0x60, + + 0xF9,0x04,0xF4,0xF5,0x2C,0x3A,0xD0,0x51,0xC7,0xB5,0x3D,0xD4,0xD7,0x5D,0x0B,0x70, + + 0xC5,0x40,0x18,0xF6,0x3D,0x61,0xDB,0x41,0xC6,0x8C,0x87,0x56,0x35,0x7A,0x5D,0xB1, + + 0x94,0x4E,0x62,0x79,0x55,0xD4,0x08,0x24,0xC0,0xAF,0x21,0xF6,0xD0,0xE9,0xD6,0xB7, + + 0x6C,0x9C,0x02,0x47,0x34,0x12,0xDE,0xF7,0x46,0xEE,0x08,0xB5,0xF1,0x78,0x0C,0x44, + + 0xDA,0xD5,0x9A,0xC0,0xD7,0x37,0xF0,0x13,0xD9,0xD7,0xF4,0xE6,0x76,0xF4,0xC0,0x90, + + 0xA4,0x41,0x94,0xA8,0x77,0x3F,0x87,0xCD,0x98,0xDB,0xFC,0xF6,0x77,0xF5,0x89,0x43, + + 0x5A,0xB6,0xCA,0x34,0x3A,0x4B,0x25,0x09,0x1D,0x03,0xF5,0xE7,0xF6,0xF6,0x8F,0xCC, + + 0x69,0x3C,0x3A,0x55,0x6A,0x08,0x15,0x75,0x1B,0x96,0xFD,0xF7,0xF7,0xF7,0x5F,0xAD, + + 0x8D,0x89,0x9E,0xEE,0x8C,0xB0,0x51,0xEE,0xCF,0xC5,0x54,0x48,0x6C,0xB7,0x10,0x9C, + + 0x67,0xDD,0x57,0xEC,0xB3,0xDC,0x0C,0x8B,0xE9,0x76,0xF4,0x49,0xDE,0xF4,0x5F,0xD8, + + 0x0F,0x85,0xD6,0xFD,0x32,0xDF,0x54,0xFA,0x4F,0x9B,0xD7,0xEF,0xF2,0xF7,0x77,0x9F, + + 0xE7,0xFF,0xD6,0xED,0x33,0xDE,0x9F,0xC8,0x4E,0x78,0xF5,0xC0,0x5E,0xFD,0x00,0xC2, + + 0xCF,0x33,0x9E,0x4C,0x1F,0xCE,0xDE,0xD5,0x05,0xCB,0xF6,0xEE,0x7E,0xFC,0x89,0x2B, + + 0xF5,0x8D,0x02,0x5E,0xC3,0x9D,0x24,0xFB,0xCC,0x93,0xFE,0xFE,0x7F,0xFD,0x05,0xD1, + + 0x78,0x2A,0xBD,0xCE,0x1D,0xFF,0x73,0x69,0xEF,0xB1,0xF7,0xEF,0xFE,0xFE,0x11,0x41, + + 0xA9,0x9F,0x43,0x9D,0x3C,0x12,0x4E,0x3D,0x13,0xD9,0xFF,0xFF,0xAF,0xB9,0x80,0x00, + + 0x0C,0x4C,0x04,0x00,0x18,0x2E,0x6F,0xD8,0xC1,0xBF,0x43,0xCC,0x56,0xBD,0x51,0xEF, + + 0xE0,0xCE,0x90,0x11,0x15,0x01,0x47,0x32,0x32,0x41,0x45,0x36,0x2A,0x61,0xB6,0x85, + + 0xC0,0xB8,0x35,0x67,0xF1,0x38,0xEA,0xA5,0xC4,0x54,0x6B,0x2D,0x2D,0xAD,0x60,0xEA, + + 0xEA,0x06,0xE1,0x97,0x90,0x5B,0xC6,0x31,0xB6,0x4F,0xC2,0xB7,0xAE,0x63,0x38,0xC2, + + 0x01,0xE2,0x00,0x44,0x62,0xD1,0x22,0x80,0x06,0xCF,0xA8,0xE6,0x57,0x5D,0x31,0xB8, + + 0x09,0xCE,0xEE,0x59,0x97,0x81,0x5A,0x5E,0xB5,0x30,0x50,0xB1,0xF2,0xEF,0x79,0x31, + + 0x9A,0x0F,0xC4,0xC1,0x92,0xB7,0x7A,0x8F,0x7D,0x42,0xA9,0x42,0x71,0x60,0x4D,0xB9, + + 0x89,0xCA,0x48,0x52,0xEC,0x23,0xAE,0x2E,0x7E,0xBB,0x22,0x97,0x72,0xED,0xA9,0xE0, + + 0x08,0xF3,0xD8,0x09,0xBB,0x53,0xD2,0x2C,0x3E,0x53,0x49,0x6C,0x5E,0x28,0xE5,0xE2, + + 0x62,0x99,0xEA,0xE1,0x19,0xF2,0xA5,0xCE,0xCB,0x43,0x9A,0xC1,0x59,0xB2,0x03,0x7B, + + 0x2F,0x1A,0xC3,0xF4,0x98,0xB1,0xD3,0x57,0x2F,0x5A,0xF2,0xD4,0x58,0xF1,0x24,0xE8, + + 0xD1,0x0E,0xEA,0x99,0x9D,0x3D,0xFD,0xC9,0x8D,0x44,0xFB,0xB9,0xDD,0xB8,0x1A,0xA7, + + 0x0C,0x0C,0x19,0x44,0x9D,0x2B,0xF9,0x06,0x9F,0x42,0xAD,0x8E,0x87,0xB1,0x58,0xDC, + + 0x4B,0xA5,0xBA,0x82,0xF4,0x6F,0xF9,0x70,0x97,0x7D,0xBA,0x3C,0x75,0xE6,0x16,0x29, + + 0xEE,0x05,0x73,0xFF,0xB4,0x62,0x3B,0xEF,0x36,0x0F,0x7C,0xE9,0xD6,0x98,0x71,0xB6, + + 0x70,0x90,0xCB,0xE4,0x44,0x20,0x78,0x75,0x13,0x3F,0xDF,0x9F,0xFF,0xD3,0x04,0x80, + + 0x78,0xF8,0x84,0x7C,0xB2,0xCB,0xAB,0x94,0x87,0x42,0xEC,0x83,0x13,0x58,0xDE,0xB0, + + 0x26,0xE9,0x0C,0x1E,0x4A,0x38,0xA6,0x38,0x24,0x58,0xE4,0x93,0x12,0x69,0x4F,0x28, + + 0x82,0x11,0x85,0x79,0x10,0x70,0xAE,0x15,0x07,0x42,0xED,0x82,0x93,0x18,0x02,0x1D, + + 0xDA,0x02,0xD6,0x95,0xCE,0x33,0x1C,0x33,0xE8,0xBE,0xE5,0x92,0x10,0x7C,0xF3,0xC1, + + 0xAF,0x18,0xC4,0xFC,0xCE,0x64,0xBB,0x0E,0xE7,0xF3,0x60,0x9B,0xD1,0xC9,0xAA,0x21, + + 0xE9,0x55,0x49,0x50,0x33,0xA4,0xDD,0xF7,0x14,0x51,0xBC,0xB0,0x4E,0x7A,0x2D,0xDF, + + 0x64,0xE2,0x05,0xC5,0xC2,0xC3,0x73,0xEC,0x66,0xF2,0x11,0x60,0xB1,0x85,0x13,0x43, + + 0xA7,0x9A,0xEB,0xDC,0x37,0x93,0x82,0xE1,0x64,0x50,0x4D,0xEB,0xE3,0x83,0xD9,0x89, + + 0x2E,0x78,0x5D,0x0E,0x3E,0x78,0x4C,0x47,0xCB,0x5C,0xF6,0xE8,0x0C,0xF5,0x6E,0x58, + + 0xE7,0x92,0x74,0x94,0xC4,0xF6,0x26,0xC8,0x24,0x50,0xE6,0x3E,0x7A,0x9F,0x19,0xFB, + + 0x43,0x18,0x54,0x65,0xBE,0xE7,0xEC,0x2B,0x68,0x9B,0xEF,0x2F,0xF9,0x22,0x0D,0x7B, + + 0x2B,0x33,0x04,0xFD,0xA9,0x3D,0x9B,0xBD,0xE1,0x55,0xA7,0xCD,0xB5,0x72,0x38,0x56, + + 0xC1,0xEA,0xC7,0xCB,0x9B,0x59,0xE6,0x5A,0x44,0x19,0xD3,0x2A,0x90,0x30,0x2D,0x2B, + + 0xCF,0xB2,0x23,0x36,0xBE,0x3A,0xB1,0x0A,0x6D,0x5D,0x76,0x5F,0x04,0x7C,0x19,0x52, + + 0xBA,0xB1,0x38,0x49,0xBA,0xAF,0xA1,0x4C,0x6F,0x59,0x27,0x69,0xBA,0xD6,0xF9,0x28, + + 0x43,0x4F,0x27,0x7E,0xBD,0x5F,0x08,0x27,0x12,0x21,0x1F,0xFD,0x8B,0xF2,0x7E,0x1F, + + 0x54,0x2B,0xFF,0x86,0x67,0xA0,0x50,0x62,0x59,0x4B,0xE9,0xA3,0xA9,0x21,0xD7,0x16, + + 0x05,0x59,0x68,0x12,0x63,0xBA,0x67,0x32,0x36,0xCD,0x42,0x3E,0xB0,0xF3,0x04,0x03, + + 0xEF,0xA6,0x7E,0x07,0xE3,0xA4,0x35,0xC1,0xFB,0xC6,0x4B,0xAF,0x21,0x21,0x96,0xEE, + + 0x95,0xE0,0x69,0x69,0x72,0xB3,0xE6,0x33,0xB2,0xCB,0x33,0x57,0xC5,0xE5,0x9F,0xBC, + + 0x00,0xC4,0x0D,0x3C,0x93,0xA3,0x98,0xD1,0xC3,0x83,0x4F,0x3D,0xAF,0x6E,0x13,0xAD, + + 0xF0,0xC7,0xE9,0x49,0x0F,0x31,0xB8,0x72,0x37,0x30,0xCA,0x89,0xD5,0xAD,0xDB,0x31, + + 0x39,0x39,0x09,0xE4,0xB2,0x72,0xD9,0xC0,0xB9,0xB5,0x75,0x96,0x75,0xE4,0xED,0x66, + + 0x66,0x78,0x68,0x4C,0x8B,0xE9,0x39,0xF7,0xC7,0x56,0xD9,0x15,0x60,0x82,0xC2,0xBC, + + 0x8B,0x8F,0x1D,0xF8,0x49,0xA1,0xF2,0x2E,0xDE,0x73,0xBE,0x59,0x3F,0x97,0xBA,0x1E, + + 0x10,0x0B,0xF0,0xF1,0xBE,0xAD,0x3A,0xC6,0xCC,0x8B,0x9A,0x0A,0x3E,0x21,0x8B,0xA9, + + 0x53,0x65,0xA2,0x8D,0x95,0x47,0x13,0xD3,0xCC,0x31,0xCB,0x2D,0x2B,0xEC,0xBB,0xF9, + + 0x21,0xCA,0x50,0xF2,0xBC,0x10,0xBB,0x87,0xFE,0xA9,0xC3,0x18,0xBE,0x73,0x99,0xCE, + + 0x02,0x30,0x94,0x08,0xB8,0xEE,0xC5,0x62,0x48,0xCC,0xCA,0xBE,0x83,0x93,0x68,0x63, + + 0x09,0x8D,0x35,0x5A,0x19,0xAD,0x7A,0x42,0x30,0xDD,0x47,0x23,0xA0,0xEB,0xA3,0x5B, + + 0xCC,0xCC,0xE1,0x1E,0x1B,0x89,0x60,0x54,0xD6,0x8C,0x4A,0x3E,0x7D,0x31,0x3C,0x7F, + + 0x00,0x8D,0xF8,0x2D,0x60,0xED,0x93,0xD9,0x4A,0xC8,0x73,0x7D,0x2A,0xE0,0x80,0xE0, + + 0x65,0x10,0xA8,0xF1,0x57,0xCF,0x80,0xC0,0x05,0x28,0xCD,0x24,0x7D,0x96,0x76,0x93, + + 0x86,0x97,0xEC,0x97,0x0A,0xB5,0x54,0x95,0xC4,0x58,0xDC,0xF7,0xB9,0x7A,0x5D,0x01, + + 0xA1,0x63,0xDD,0x85,0x43,0x19,0x2D,0xA6,0xE0,0xF2,0x8D,0xF7,0xF0,0xFD,0xA5,0xAF, + + 0x06,0x95,0xF2,0x97,0xC6,0xB5,0xB2,0xD3,0xE9,0x93,0xB9,0x55,0x77,0xF9,0x1A,0xF0, + + 0xA3,0x82,0x99,0x42,0x76,0x9E,0x49,0xA4,0xC4,0x9A,0x0B,0x62,0x76,0x65,0x35,0xC6, + + 0xAA,0xF6,0x53,0x46,0x16,0x85,0xDB,0xFB,0xB7,0x85,0xEF,0xC9,0x6F,0xB7,0x5A,0x9D, + + 0x57,0x4A,0x75,0x99,0x4F,0x6A,0x01,0xC7,0x32,0xC6,0x42,0xEF,0xF0,0xF6,0xC6,0x76, + + 0x72,0x89,0xEF,0x37,0xCB,0xB1,0x5A,0xFE,0x60,0x70,0xFD,0xCF,0x72,0xF0,0x6E,0x1D, + + 0x4F,0x38,0x9C,0x71,0xCB,0xFA,0x32,0x68,0xC0,0xD5,0x50,0xCC,0x1D,0xE8,0x74,0x9B, + + 0x8E,0xFC,0xF5,0x9E,0x42,0xB9,0xBE,0xBB,0xEE,0xBC,0x1A,0xDC,0x3E,0x86,0x5F,0x09, + + 0xAD,0xC2,0x27,0x05,0xC7,0xBE,0x2D,0xFB,0xCD,0xBA,0xAF,0x45,0x7E,0xD2,0x15,0x79, + + 0x92,0x9F,0x74,0x1D,0xBB,0xFB,0x07,0xCB,0xF4,0xD2,0xC7,0xDD,0xBC,0xEB,0x1B,0x39, + + 0xF6,0x48,0xEE,0x6B,0xDF,0xB3,0xDE,0x4C,0xEB,0xFB,0x1E,0x4D,0x78,0x9C,0x86,0x50, + + 0x0D,0x4B,0xD6,0x0E,0xE0,0xB2,0x6D,0x88,0x90,0x9F,0x6E,0xB8,0xD5,0x06,0x44,0x3A, + + 0x32,0xDE,0x77,0x4D,0xBB,0xD4,0xA8,0xEE,0xE8,0xDE,0x8A,0x6B,0xBE,0xD4,0x10,0xA8, + + 0x45,0x37,0x8F,0x9B,0xCE,0x32,0x7F,0xC3,0x13,0xCF,0xF9,0x7B,0xFF,0x6E,0xDF,0x15, + + 0x87,0x07,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0xE0,0xB2, + + 0xA5,0x86,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0xA9,0xA3, + + 0x5F,0x5D,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0xE9,0x11, + + 0x04,0x04,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x12,0x08, + + 0xED,0x49,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0xCA,0x08, + + 0x40,0x45,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0xEB,0xBA, + + 0x0D,0x4D,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x7F,0xE4, + + 0xA8,0x49,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x74,0x46, + + 0x8A,0xEF,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x8E,0x14, + + 0x21,0x80,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x95,0xC7, + + 0x0A,0xE9,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0xA5,0x33, + + 0x26,0x34,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x96,0xCE, + + 0x82,0xE3,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0xA6,0x3A, + + 0xAE,0x3E,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x05,0x0D, + + 0xA8,0x8B,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x9F,0xBD, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x3A, + + 0x81,0x87,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x55,0x96, + + 0x45,0xAB,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0xC9,0xA0, + + 0x82,0xE2,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0xB9,0x55, + + 0x2F,0x78,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x24,0x8E, + + 0x0C,0x19,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x9A,0xA8, + + 0x23,0xC5,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0xFC,0x03, + + 0x0B,0x8D,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x5B,0xC4, + + 0x62,0xC7,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x8F,0x95,0x80,0x00, + + 0x0C,0x4C,0xF9,0xE6,0x92,0x08,0x0A,0x28,0x63,0x78,0x15,0xE2,0xBA,0x2C,0x51,0xEF, + + 0xE0,0xCE,0xF0,0x76,0x50,0x31,0x30,0xCF,0xB6,0x03,0x4D,0xB0,0x55,0x90,0xB6,0x85, + + 0x80,0xD1,0x25,0x67,0xD3,0x5D,0xCC,0x23,0x3B,0xD9,0x61,0x63,0x7A,0x99,0x60,0xEA, + + 0x03,0x27,0xF1,0x97,0x92,0xC5,0x1D,0xD8,0xBA,0x47,0x46,0x34,0xD7,0x23,0xD0,0x1B, + + 0xFF,0xB8,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x30,0xD0, + + 0xE3,0xFA,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x7E,0x91, + + 0x8E,0xAD,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x29,0x15, + + 0x03,0x0A,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x0A,0xF5, + + 0x89,0xD3,0xD8,0xE7,0xBB,0x33,0x49,0x28,0x37,0x48,0x05,0x13,0x48,0x2A,0xE5,0xE2, + + 0xDE,0x56,0xCA,0x6A,0x3A,0x56,0xDD,0xD0,0x43,0x94,0x5A,0x38,0x25,0x92,0x8C,0x7B, + + 0x2B,0x6F,0xC3,0xF9,0x90,0x31,0xC8,0x6B,0xCE,0x6A,0x13,0x10,0x24,0x5A,0x55,0x3B, + + 0x5C,0x10,0x0B,0x1D,0xAF,0x45,0xE1,0x31,0x34,0x84,0x9A,0xFB,0x7B,0x27,0xBB,0x6F, + + 0xAB,0x86,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x32,0xA6, + + 0xB6,0xF5,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0xEC,0xA6, + + 0x3F,0xA6,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0xB4,0xDB, + + 0x8E,0x0B,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0x05,0x77,0xD0,0x7C,0x3C,0x24,0x68,0xA2,0x79,0xCF,0xF5,0x77,0xDE,0xB0, + + 0x26,0xE9,0x27,0x7C,0x75,0x5D,0xE6,0x38,0x94,0x92,0xA3,0xEA,0x8C,0xF3,0x4F,0x28, + + 0x82,0x11,0xE4,0xFE,0x65,0xAF,0x4C,0x25,0x1D,0x93,0x7D,0x06,0xD4,0xAE,0x02,0x1D, + + 0xDA,0x02,0x59,0xCB,0x9F,0xEF,0xE7,0x59,0xE7,0x9E,0x85,0xBC,0xB1,0x78,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xD9,0x89, + + 0x2E,0x38,0xEF,0x67,0xD3,0x8C,0x57,0xFC,0x49,0x48,0x01,0x2E,0x79,0x1B,0x36,0x70, + + 0x27,0xD6,0x0E,0x5A,0xAB,0x3A,0xE3,0x5A,0xE9,0x86,0x16,0x79,0xD8,0xF3,0xA9,0x0B, + + 0xAB,0xFC,0x24,0x97,0xD3,0x4E,0x77,0xE8,0x05,0xD1,0xAD,0x4F,0xDC,0x7C,0x55,0x6B, + + 0x0A,0x1D,0x6C,0x66,0x50,0x9C,0x25,0x51,0xE7,0x94,0x70,0x5F,0x7B,0x33,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0xFF, + + 0x04,0x0D,0xE0,0x39,0x1C,0xCC,0x50,0xE2,0x8A,0x4B,0xC0,0xF9,0xE3,0xAC,0x76,0x0A, + + 0xDC,0x2A,0x0F,0x81,0x7E,0x07,0xB5,0xC2,0x4D,0xCE,0x9E,0x3A,0xD9,0x3A,0xD9,0x0B, + + 0x5B,0x1D,0x89,0xC5,0x40,0x64,0xCB,0xC1,0x46,0xCA,0xC7,0x34,0xC8,0xA6,0x2E,0x31, + + 0xEE,0x73,0x29,0xE6,0x57,0xE3,0xE4,0x31,0xBE,0xC3,0x99,0xCA,0x95,0xAD,0xDB,0xA0, + + 0xAA,0x79,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x22,0xEF, + + 0x85,0xCD,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x19,0x38, + + 0x88,0xE4,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0xF4,0xB1, + + 0xA3,0x7A,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x21,0xFB, + + 0x94,0x88,0x98,0xFD,0xCA,0x07,0x69,0x68,0x33,0xC8,0xC2,0x08,0xBE,0x8B,0x2A,0x46, + + 0x09,0xF1,0xD4,0x84,0xF6,0x6C,0x67,0xC3,0xCD,0x52,0xCA,0xE1,0xBE,0xAB,0x7D,0x08, + + 0x73,0xCA,0x44,0xFE,0x46,0xBA,0xE8,0x6B,0xCA,0xEA,0x03,0x98,0xF2,0xA6,0x69,0x3F, + + 0xA9,0x8B,0xD5,0x28,0xF6,0x0E,0x3B,0xC6,0xCD,0x10,0x3B,0x87,0x0A,0x56,0xBD,0x42, + + 0x20,0xCA,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x1A,0x85, + + 0xE0,0xCC,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x91,0x8D, + + 0x2C,0xC2,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x13,0x7C, + + 0xAB,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x28,0x85, + + 0x85,0x18,0xAA,0x34,0x17,0x70,0x54,0x62,0xAA,0x5B,0xAF,0xD4,0xD7,0xF6,0xBB,0x62, + + 0x2D,0x9E,0x8C,0x86,0x81,0x66,0xAF,0xC0,0xC6,0xD7,0xC4,0x34,0x70,0x9B,0x27,0x61, + + 0x26,0xDA,0xFF,0xDD,0x03,0xCD,0xCB,0x41,0x66,0x9A,0x3D,0xCE,0x57,0x97,0x4D,0xD7, + + 0xD1,0x9C,0x18,0x28,0x68,0xCE,0x35,0xFF,0x46,0xD5,0x85,0x67,0x02,0xFC,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x46,0x4A, + + 0xE2,0x13,0x09,0xD0,0x89,0x64,0x3A,0x2D,0xCD,0x50,0x8E,0x7E,0x87,0xF7,0xA7,0x6A, + + 0x25,0x96,0x3E,0x80,0x2D,0x4D,0x98,0x4A,0x65,0xD6,0x3E,0xBF,0xFF,0xF1,0x59,0x69, + + 0x2E,0x92,0xCF,0x4D,0x3A,0x4F,0xB7,0x49,0x6E,0xF2,0x18,0xD1,0x21,0xB8,0x9B,0xE9, + + 0x0E,0x56,0xAA,0x85,0xA9,0x0F,0x5F,0x7B,0x23,0x50,0x6B,0x4F,0xF5,0xF4,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x46,0x75,0x80,0x00, + + 0x0C,0x4C,0x88,0x49,0x73,0x00,0x6E,0xA0,0xC0,0xF3,0x26,0xD5,0xB8,0x30,0x51,0xEF, + + 0xE0,0xCE,0x88,0xE9,0x11,0xFA,0x41,0xB5,0x26,0x48,0xA7,0x6A,0xA0,0xBD,0xB6,0x85, + + 0x80,0x91,0xF9,0xFC,0x10,0xB9,0xAE,0x93,0x74,0xD2,0xEF,0x17,0x55,0x74,0x60,0xEA, + + 0xEA,0x06,0xA1,0x91,0x99,0x6A,0x18,0xC5,0xC1,0xE8,0xC0,0x21,0x5C,0x00,0x15,0x9E, + + 0xFB,0x7A,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x3C,0x74, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x7C,0x07, + + 0x20,0x48,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xA9,0xE0, + + 0x08,0xF3,0xDB,0x98,0xE5,0xE9,0x52,0x29,0xC8,0xF9,0x39,0x89,0x8D,0x76,0xE5,0xE2, + + 0x62,0x99,0x70,0x14,0xFC,0x3B,0x43,0xBD,0x6B,0x44,0xB9,0xCD,0xC5,0x29,0x03,0x7B, + + 0x2F,0x1A,0x79,0x85,0x6D,0xE9,0x29,0xDA,0xCA,0xB7,0xEE,0xDE,0x00,0xBE,0x24,0xE8, + + 0xD1,0x0E,0x01,0x7D,0x93,0x30,0x19,0xCD,0x69,0x4F,0x73,0xB7,0xFB,0xBD,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0xE4,0x44,0xF2,0xBB,0xEE,0xD2,0x53,0xB2,0xB7,0xA8,0xA8,0x00,0xDE,0xB0, + + 0x26,0xE9,0x48,0xF6,0x72,0xDE,0x46,0xB1,0xC2,0x57,0x34,0x17,0x0E,0x02,0x4F,0x28, + + 0x82,0x11,0x7A,0x67,0x32,0x3A,0xEF,0x23,0xE5,0xA3,0x7D,0x16,0x75,0x35,0x02,0x1D, + + 0x92,0xF1,0xF5,0xF7,0xF2,0xCE,0x95,0x8D,0x42,0x55,0x5D,0xB5,0x81,0x86,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xDC,0x84, + + 0x1B,0xFA,0xFE,0x0E,0x39,0xDF,0x1E,0xE5,0xCB,0x5E,0xD6,0x28,0x78,0xE9,0x6E,0xD8, + + 0x27,0x14,0x86,0x33,0x9A,0x39,0xDA,0xCE,0x9E,0x49,0x8D,0x83,0x61,0x3B,0xC5,0xFF, + + 0x8B,0x45,0xDD,0x8C,0x1B,0x3C,0x1F,0xE5,0x4B,0x41,0x20,0xA5,0xFE,0x7A,0x05,0x91, + + 0x0A,0x16,0xD1,0x8A,0xB1,0x3B,0xA5,0x46,0xDA,0x79,0x9F,0x85,0x86,0x6B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x7E,0x1F, + + 0x54,0x2B,0x66,0x70,0x50,0xCC,0xB0,0xD6,0x65,0xD0,0xCF,0x55,0xBE,0x48,0xD7,0x16, + + 0x05,0x59,0xC8,0x57,0xF8,0x2A,0x82,0x75,0x4B,0xC8,0x93,0xD8,0xEA,0xE5,0x04,0x03, + + 0xEF,0xA6,0xC3,0x02,0x95,0x14,0xEB,0x23,0xF7,0xD0,0xC3,0xC7,0x90,0x69,0x96,0xEE, + + 0x95,0xE0,0x54,0xF5,0x15,0x7C,0x7B,0xDB,0xC3,0x4E,0xBB,0x19,0x23,0x96,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xC2,0xBC, + + 0x8B,0x8F,0xC2,0x4A,0x68,0x25,0xA0,0xDC,0x5E,0x43,0x45,0x71,0xE1,0x14,0xBA,0xF8, + + 0xA1,0xC8,0xF0,0x1B,0xBE,0xAF,0x78,0x48,0x29,0x06,0xD2,0xB8,0xA1,0xA8,0x8B,0xA9, + + 0x53,0x65,0xDB,0x8D,0x9D,0xD2,0x73,0x9F,0x2B,0xD1,0x18,0x41,0x09,0xE4,0xBB,0x1B, + + 0x8D,0x8B,0xA3,0x53,0x7C,0xA4,0x7A,0xCB,0xCF,0x08,0x18,0x37,0x01,0xDB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x2E,0x02, + + 0x87,0x96,0x84,0x6D,0xBB,0xB2,0x8E,0x58,0x74,0x1D,0x5C,0x04,0xF1,0xF7,0x6D,0x64, + + 0x16,0xB3,0xC4,0x88,0xF3,0x45,0x38,0x08,0xE7,0xD9,0x9A,0xBB,0xF1,0x55,0x6D,0x11, + + 0x05,0x89,0x12,0x86,0x39,0xBE,0x4A,0x4E,0xC4,0x90,0x5A,0x49,0x71,0x55,0xF7,0xF1, + + 0xB5,0x58,0x4B,0x66,0x7F,0xF3,0xB0,0xC1,0x46,0x68,0x3C,0xB0,0x82,0xF7,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x62, + + 0x3E,0x55,0xF8,0x1C,0x38,0x35,0x16,0x50,0x93,0x03,0x69,0xBE,0xFB,0xFF,0x77,0x1F, + + 0x4A,0x95,0xF0,0x05,0x2D,0x16,0x67,0x2B,0x98,0x16,0x48,0x1B,0xF8,0xFE,0xD8,0x39, + + 0x7D,0x0A,0xD9,0x11,0x57,0x4C,0x1F,0x2F,0xE4,0x93,0x07,0x1D,0xD2,0xBF,0x2E,0x6F, + + 0xAD,0x16,0xCC,0x6C,0x59,0x14,0x3E,0xC4,0x0A,0xDD,0x50,0x4D,0xFB,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x29,0x22,0x59,0x0E, + + 0xE5,0x0B,0xC8,0x90,0xF9,0x89,0x40,0x06,0xAD,0x22,0xEE,0x18,0x56,0x62,0x46,0xAA, + + 0xD5,0x72,0x5E,0x53,0xCF,0x29,0xDC,0xC3,0x6B,0xEC,0x5B,0x47,0x78,0xE3,0x81,0x60, + + 0xB4,0x40,0x93,0xFB,0x6F,0x8F,0x6F,0x81,0x29,0x61,0x25,0x56,0xBE,0x6B,0xAE,0xA9, + + 0x87,0x21,0x09,0x54,0xFD,0x61,0x8E,0x0F,0xB5,0x58,0xE6,0x46,0xE3,0x0F,0xBF,0xF1, + + 0x3C,0xAB,0x99,0xA8,0xB7,0xA4,0x68,0x10,0x4A,0x4F,0x10,0xE5,0xF7,0x11,0xC8,0x31, + + 0x67,0xA8,0x08,0x31,0x2F,0xD0,0x8B,0x41,0xE2,0xBA,0xC0,0xB4,0x1C,0x30,0x94,0x32, + + 0xEC,0x0D,0x39,0xC1,0x90,0x9D,0xD1,0x00,0xA6,0xEB,0x1E,0x0A,0x5D,0xC0,0x18,0xB1, + + 0x87,0x2E,0x9A,0x6B,0xAD,0x65,0x67,0xC8,0xC5,0x45,0x96,0x1B,0x5C,0xC1,0xB1,0x8C, + + 0x0A,0x38,0xC6,0xBA,0x72,0x5B,0x92,0x76,0xEC,0xA5,0xF5,0xEC,0x1A,0x2A,0x74,0xB4, + + 0xE0,0xA0,0x8C,0xAC,0xF0,0x80,0x63,0xCB,0x67,0x9D,0xE4,0x85,0xD4,0xC4,0x7D,0xA0, + + 0x24,0x07,0xFD,0xB4,0x91,0xCB,0xD7,0x77,0xC6,0x54,0xD7,0x9B,0xB2,0x19,0xF6,0xF5, + + 0x89,0xDE,0x99,0x1C,0x66,0xA6,0xCB,0x4B,0x22,0xC8,0xC8,0xA2,0x32,0x63,0xD0,0xCC, + + 0x00,0xCB,0x88,0x34,0x9A,0x6E,0x57,0x9B,0x3A,0x29,0x19,0xAC,0x0B,0x11,0x91,0x58, + + 0xE2,0x9E,0x1E,0x2F,0x3D,0x6F,0x52,0x49,0xEA,0xB2,0x63,0x41,0x5D,0x6F,0x15,0xE4, + + 0x61,0xBD,0x2F,0x3E,0xFC,0x88,0x6B,0x9A,0xB2,0xE3,0x2C,0xE9,0xD0,0x9D,0x5D,0x28, + + 0x60,0x07,0x8B,0xAD,0x9A,0xEF,0x65,0xC4,0xCD,0x4D,0xDB,0x8E,0xAF,0x0A,0x66,0x84, + + 0x23,0x32,0x96,0x7B,0xCF,0xBD,0x10,0x46,0x48,0x02,0x73,0x64,0x76,0x32,0x8E,0x14, + + 0x29,0x76,0xCC,0xA3,0xD8,0xD2,0x08,0x9B,0x49,0xBF,0xCF,0x27,0x18,0xDE,0xC5,0x00, + + 0xB6,0xA9,0xD7,0x7A,0x47,0x70,0x01,0x1D,0xC8,0xC8,0xD5,0x03,0x7D,0xDF,0x52,0x99, + + 0xA7,0x31,0x95,0x8D,0x3E,0xB5,0x09,0x5A,0xE7,0x51,0x95,0xC6,0xCF,0xF5,0xC2,0xB3, + + 0x48,0x5B,0x94,0x5C,0x36,0x10,0x4E,0xE2,0xF0,0x5C,0xB2,0xD9,0x8D,0xA9,0x50,0xD0, + + 0xAC,0xB8,0x96,0x4A,0x5B,0x36,0x98,0x0A,0x9E,0x37,0x62,0xE1,0xFE,0xF8,0x44,0xB2, + + 0xC4,0x59,0x90,0xB7,0x59,0x35,0x49,0x9F,0x46,0xBB,0xB3,0xD9,0x05,0x75,0x9F,0x42, + + 0x8D,0xBA,0xB3,0xD3,0x52,0xB4,0x22,0x82,0x93,0x12,0x3A,0x0A,0x12,0xA1,0xC2,0x71, + + 0x24,0x1C,0x82,0x4C,0x3C,0x10,0xA2,0xDB,0x41,0xDA,0x96,0x5F,0x06,0x50,0x51,0x8D, + + 0x2F,0x39,0x82,0xA9,0x71,0xBA,0x79,0x78,0x23,0xF4,0x80,0x47,0x0A,0x79,0x84,0x0D, + + 0xA2,0x48,0x11,0x09,0xBA,0x7D,0x68,0xDA,0xDA,0x36,0xC8,0xBC,0x9A,0xD7,0xFB,0x80, + + 0xAF,0x39,0xB1,0xA1,0x1D,0xD6,0x03,0x89,0x1E,0xE4,0x89,0xDF,0x06,0xE6,0x96,0x4C, + + 0x28,0x97,0x6F,0x3F,0xB6,0x31,0xE8,0x6D,0x9D,0xF1,0x2D,0xAB,0x87,0xDA,0x70,0x64, + + 0xC8,0x16,0xF4,0x2F,0x4B,0x92,0x8C,0x86,0x19,0xF2,0x45,0x76,0x78,0x37,0x0F,0xCD, + + 0x83,0xDF,0x9F,0xC9,0x32,0xEF,0x40,0x6C,0x92,0xF1,0x83,0x1D,0x7A,0x61,0xCB,0xAA, + + 0xD1,0x90,0xD8,0xAE,0x99,0x9E,0x09,0x3E,0x02,0x9C,0x5E,0xFF,0x0F,0x0F,0xF5,0x3D, + + 0x76,0x3F,0x60,0x86,0xDE,0x0D,0x0E,0x92,0xC9,0x46,0x8E,0x8B,0x82,0x4F,0xE9,0x0D, + + 0x37,0x54,0xCA,0x17,0x16,0xE1,0x38,0xC2,0xBA,0x6E,0xEA,0xC6,0x51,0x40,0x7A,0x03, + + 0x82,0xC2,0xF0,0x67,0xDE,0xCC,0x30,0x63,0xC0,0xE2,0x66,0x66,0xAF,0x42,0xFC,0x2C, + + 0xF7,0x3F,0xA5,0x22,0x7C,0x30,0x6E,0xC0,0xB3,0x6E,0xEA,0xC4,0xA7,0x6E,0xDB,0xF3, + + 0x38,0x2B,0x20,0xC6,0x6D,0xE6,0x75,0x9C,0xEA,0xC9,0xC8,0x95,0x2A,0x8A,0x28,0xAB, + + 0xA6,0x0C,0xEC,0x74,0x33,0x2E,0x1E,0x4B,0xAE,0x54,0xE2,0x74,0xE4,0x48,0xB6,0x02, + + 0xFD,0xC4,0x7D,0x6A,0xDE,0x25,0x8E,0xA4,0x2F,0x95,0x97,0x5E,0x3F,0x77,0x6D,0xB3, + + 0x83,0xAE,0xED,0xB5,0x6B,0x34,0x63,0x71,0x74,0x6A,0x6A,0x07,0x57,0xF1,0x9F,0x51, + + 0x7F,0x88,0xC4,0x7F,0xF7,0x7B,0x60,0x98,0x5C,0xC8,0xE4,0x83,0xB7,0x9B,0xFC,0xBA, + + 0x1F,0xBB,0xD4,0xA7,0x14,0x48,0x5A,0x5A,0xBB,0x68,0xF9,0x4D,0x74,0x6B,0xE3,0x0F, + + 0x9A,0x3E,0x9D,0xA2,0x5E,0xAA,0x3B,0x2F,0xC5,0x2B,0x73,0xAE,0xB3,0xE0,0x72,0x14, + + 0x68,0xE7,0xAD,0xAF,0x74,0x02,0x03,0xDE,0xC5,0x17,0x44,0x4C,0xEF,0x87,0xF0,0xCE, + + 0x04,0x59,0x51,0xE3,0x18,0x44,0x27,0x1A,0xCE,0xDA,0xFA,0x7A,0x96,0x3D,0x2A,0x33, + + 0x0E,0x5D,0x8D,0x3C,0xF4,0x8E,0xAB,0xE5,0xBA,0x44,0x3A,0xFF,0xAE,0xE0,0xA3,0xCB, + + 0x96,0xCC,0xF4,0x6B,0x1C,0xAA,0x7B,0x8B,0x41,0x63,0xE0,0x7C,0xA2,0x5F,0xAB,0xDB, + + 0xF9,0x85,0xB3,0x5B,0x17,0x16,0x5B,0x91,0x26,0xFC,0x00,0x58,0x7E,0x83,0xE0,0x7B, + + 0x6C,0xD2,0x60,0x75,0x12,0x1D,0x0A,0x0A,0xE9,0x66,0x74,0x26,0xBE,0x5D,0xEC,0x96, + + 0x33,0x45,0x92,0xAB,0xC1,0x60,0x02,0x0A,0x19,0x7E,0xF8,0x43,0x76,0x81,0x21,0x24, + + 0xDF,0x82,0x32,0x02,0x5F,0xD1,0x3D,0xA7,0xED,0x33,0xE4,0xC7,0xF6,0xB0,0x7D,0x8C, + + 0x8F,0x88,0xF4,0x92,0x60,0xF6,0xEE,0xCD,0x65,0x92,0x7D,0x37,0x53,0x5E,0x7C,0x4B, + + 0xCF,0x47,0xDC,0xF7,0x97,0x35,0x12,0x43,0x8F,0xD7,0xD4,0xC1,0xFB,0xEF,0x3B,0x56, + + 0x25,0xA5,0xBE,0x9D,0xDC,0xD1,0x2B,0x76,0x6D,0x00,0xC2,0xCE,0x71,0xF7,0x73,0xA1, + + 0x59,0x3B,0x5D,0x34,0x32,0x3B,0xB5,0x63,0x85,0xDE,0x83,0x81,0x3C,0x47,0x96,0xF4, + + 0x06,0xFB,0x2D,0xC7,0x8C,0x43,0xBD,0x73,0xFF,0x95,0xF3,0x37,0x89,0x7C,0x0E,0xEC, + + 0x0F,0xE8,0x18,0x0B,0xE9,0xDA,0x30,0x1A,0x85,0x71,0xE5,0x97,0x97,0xF0,0x77,0x76, + + 0x88,0xF7,0x90,0xA3,0xE3,0x16,0x6C,0x45,0x6B,0xDB,0xEC,0x4E,0x8A,0x58,0x7E,0x8D, + + 0x09,0x65,0xCE,0x65,0x43,0xD6,0x25,0x54,0x13,0x57,0x8C,0xAD,0xC8,0x5A,0xC8,0xDB, + + 0xFD,0x36,0x38,0xEC,0xC9,0x6D,0xDD,0x3F,0xE7,0x30,0xEC,0x4C,0x8F,0x70,0x00,0x7E, + + 0xC7,0x3F,0xFE,0xD0,0x61,0x08,0x36,0x83,0x6F,0xDD,0xE8,0xDF,0x5C,0xE3,0xEE,0xBB, + + 0x4B,0xB4,0xCE,0xB8,0x57,0xB0,0xF8,0x89,0x05,0x92,0xA8,0x03,0x77,0xBF,0xA7,0x4B, + + 0x87,0x96,0x2C,0xD5,0xE5,0xA5,0xB7,0x6B,0x98,0xD4,0x4F,0x3F,0xA2,0xF5,0x7F,0x5F, + + 0xAD,0x24,0xF9,0xBD,0xDF,0xC5,0x7E,0x88,0x89,0x90,0xF6,0x50,0xCC,0xFB,0xB8,0xFF, + + 0x06,0x22,0x40,0x84,0x0F,0x28,0x6E,0x09,0xBD,0x2C,0xC8,0x20,0x42,0x2D,0xBC,0x63, + + 0x79,0x0E,0x94,0x84,0x78,0xC0,0x34,0x6D,0x72,0x6B,0xA6,0xE8,0x38,0xDB,0xF2,0x72, + + 0xF0,0x0D,0x01,0x46,0xEA,0x8F,0x73,0x3C,0xC1,0x02,0xC9,0x21,0x59,0xD1,0x53,0x1E, + + 0xFD,0x1C,0x91,0x85,0xE6,0x23,0xA1,0xD1,0x9D,0x2D,0xC1,0x2D,0x5C,0xCE,0x38,0x67, + + 0xFF,0x0B,0xBE,0x68,0xCE,0x55,0x2F,0x1E,0x30,0xDB,0xEF,0x82,0x31,0x47,0x12,0xAF, + + 0xA4,0x69,0xB1,0x32,0x30,0x44,0x63,0xF4,0x41,0x75,0x17,0x06,0xF0,0xC8,0x1B,0x4E, + + 0xFA,0x19,0x9B,0x91,0xFA,0xC7,0x6E,0x50,0x63,0xB9,0xC7,0x50,0xD4,0x44,0xF6,0xC3, + + 0x7C,0xDA,0xEE,0x53,0x43,0x43,0xA2,0x56,0x62,0xB8,0x4F,0xF1,0xD1,0x4B,0x58,0xF7, + + 0xAF,0x64,0xBC,0x21,0x70,0x81,0x4B,0x9B,0xED,0xEE,0x8A,0xBF,0x07,0x06,0x34,0x20, + + 0x68,0x0D,0x4A,0x9C,0x15,0x6B,0x5A,0x69,0x48,0x09,0xB6,0x85,0xD4,0xC4,0x3D,0x30, + + 0x4A,0xF5,0x7C,0x73,0xF2,0x7B,0xDE,0x5A,0xDF,0x08,0xF1,0x3D,0xD9,0x2A,0x69,0x1B, + + 0x8A,0x3B,0xCB,0xD0,0x98,0x6B,0x37,0x64,0x28,0xE4,0x50,0xAE,0x82,0x05,0x58,0x4A, + + 0xC8,0x08,0xFA,0xB2,0xB6,0x21,0xBE,0xE7,0xBF,0x1A,0x12,0xED,0xCF,0x2E,0xF2,0xA7, + + 0x68,0x79,0xB0,0xBC,0x1F,0x00,0xF1,0x27,0xF6,0xB1,0x16,0x0F,0x37,0x2F,0x0B,0x45, + + 0xB9,0xCA,0xB9,0xAD,0x9E,0xF3,0x5B,0x7D,0x1F,0x13,0x93,0x32,0xDC,0x4C,0x5C,0xB3, + + 0x76,0x40,0xE5,0x46,0x1F,0xBB,0x65,0xC8,0xA3,0x5F,0x9B,0xF4,0xDD,0x4D,0x3F,0x13, + + 0x11,0x1A,0xBA,0xA9,0xFA,0x99,0x32,0x42,0x54,0xFF,0xDB,0x5B,0x91,0xF6,0x72,0x96, + + 0x42,0xE6,0x8C,0x10,0x33,0x51,0x22,0x98,0xEC,0xF7,0x33,0x04,0x71,0xAE,0x14,0x71, + + 0x53,0xA3,0x7A,0xF6,0x84,0xB4,0x80,0xD3,0x0B,0x43,0x95,0xFA,0x90,0x52,0x5E,0x62, + + 0x2D,0x1E,0x4D,0x15,0xAE,0x3B,0x03,0xF1,0xE5,0x7F,0x5D,0xB4,0x5F,0x68,0xD1,0xB3, + + 0x1E,0x1D,0xD5,0xE3,0x93,0x9B,0x0E,0x78,0xC1,0x52,0x67,0xCC,0x74,0x2D,0xDD,0xD3, + + 0xB2,0xB5,0x68,0xB6,0x84,0x50,0x24,0x18,0xAF,0x18,0x4A,0xB3,0xB1,0x85,0xC5,0xC2, + + 0x33,0xB6,0xD0,0xDE,0x36,0xA2,0xFF,0xF3,0x81,0xD4,0xFD,0xF4,0x9E,0xDB,0xDB,0xD2, + + 0x0B,0x56,0xF5,0x27,0x90,0x77,0x26,0xF9,0x46,0xE8,0x95,0xF1,0x7A,0x58,0x5E,0x18, + + 0xD1,0xB9,0x06,0xCF,0x42,0x7A,0x9B,0x2C,0x62,0x6C,0x36,0xCA,0x83,0x14,0x4E,0x91, + + 0x9E,0x7C,0xF6,0x8F,0x09,0x83,0x49,0xCB,0x55,0xF8,0x9E,0xFC,0x6D,0x62,0x3F,0x76, + + 0x59,0x58,0xC3,0x86,0xDB,0x1A,0x2F,0xC9,0xEC,0x76,0x28,0x36,0x0D,0xFC,0x37,0x76, + + 0xAF,0x39,0xA9,0xB5,0xEE,0x9F,0x27,0x46,0x00,0x0A,0xD5,0x4D,0xF1,0x34,0xE1,0x78, + + 0xF2,0xBF,0x7F,0x3E,0x19,0x55,0xE1,0xE5,0x9E,0x0C,0x46,0x9E,0x91,0x9D,0x0A,0x61, + + 0xD6,0xBC,0x6E,0xC6,0xB7,0x00,0xDF,0xE7,0x77,0x46,0xE0,0xC9,0xF6,0x8B,0x6A,0xA6, + + 0x33,0x5C,0x9A,0xC8,0xA0,0x8A,0x97,0x81,0x0A,0x8A,0x8E,0xEF,0x5F,0x81,0x4A,0x26, + + 0x5A,0xCC,0x0F,0x5D,0xE9,0xE2,0x7A,0x9F,0x18,0x4F,0x97,0x7C,0x98,0x0B,0x79,0x00, + + 0xA1,0x01,0x8C,0xBF,0xFD,0xB1,0xA6,0x51,0x28,0xAC,0xD2,0x36,0x55,0xF0,0xD0,0xFA, + + 0x85,0xCC,0xBE,0x74,0xEA,0x0C,0x14,0x6F,0x26,0x87,0xE0,0x32,0xDC,0x52,0x84,0xE9, + + 0x6D,0x33,0xB9,0x96,0x7D,0xD3,0x57,0x42,0xC5,0x82,0x8F,0x47,0xBD,0x18,0x2B,0xF5, + + 0xCD,0x80,0x38,0xB2,0x62,0x28,0x2F,0x06,0x2E,0x87,0x15,0x44,0xF4,0x45,0x39,0x9B, + + 0x00,0x04,0x44,0xB6,0xE9,0xAB,0x0E,0x6A,0xFF,0x65,0x59,0xE2,0x54,0x47,0x7D,0xD6, + + 0x0D,0xC8,0xFE,0x63,0xA4,0x28,0x61,0x72,0xC5,0xC1,0x6E,0xF2,0x55,0xAF,0x7E,0xB3, + + 0x99,0x27,0x55,0xA5,0xF5,0x2A,0x74,0x90,0xDE,0x86,0x31,0xE6,0xD9,0x4B,0x33,0x43, + + 0xEF,0xB6,0x11,0x34,0x5E,0x0A,0x76,0x11,0x06,0x4D,0x39,0xF6,0x42,0xA5,0x1C,0xAA, + + 0x81,0x0E,0x21,0x8A,0x1E,0x18,0x08,0x9A,0xF8,0x67,0x7D,0xD1,0xBD,0x6E,0x23,0x68, + + 0xF6,0x16,0x2A,0x5D,0x67,0x04,0x16,0x77,0xA4,0x28,0xC5,0x4C,0x23,0x76,0xA4,0xCB, + + 0x88,0xA3,0x63,0x8F,0x83,0xA2,0x97,0x49,0xEF,0x8A,0xB3,0x70,0xBC,0xCA,0x87,0x60, + + 0x47,0xB2,0x3D,0x7F,0xDF,0xC7,0x1D,0x4A,0x6E,0x4E,0x17,0x4C,0x8A,0x4D,0x1C,0x63, + + 0x3D,0x88,0x74,0xCA,0x1C,0x93,0xF6,0x1A,0x42,0xC5,0xB2,0x74,0x58,0xCE,0xC6,0xC8, + + 0x53,0x87,0x15,0x2D,0x73,0xEF,0x20,0xEF,0xEC,0xA8,0x63,0x3C,0xA7,0x9C,0xDB,0x5B, + + 0x29,0xC3,0xDB,0xB1,0x32,0xA3,0x31,0xE9,0x0B,0x1F,0x3F,0x6D,0x8A,0xAC,0xAB,0x4A, + + 0xBF,0x2F,0xAF,0x4A,0x3E,0x00,0x21,0xF2,0x6C,0xAA,0xC8,0x53,0x23,0xDE,0x1F,0xEC, + + 0x87,0xF5,0x32,0x5B,0xFC,0x51,0xF4,0x22,0x7C,0x4F,0xED,0xE4,0x17,0x72,0x2C,0x93, + + 0x75,0x95,0xF5,0x85,0xC4,0xFE,0x65,0x4A,0xC0,0x67,0x43,0x71,0x46,0xE5,0x98,0x61, + + 0xFC,0x25,0xBD,0x6F,0x83,0xFD,0x81,0xC1,0x1F,0xBC,0x4D,0x4F,0xC3,0xBF,0x82,0xB7, + + 0x44,0x88,0xAC,0xEC,0x12,0x3E,0x06,0x37,0xE7,0x7B,0x5F,0xF7,0xF1,0x0E,0x4B,0xBD, + + 0xFF,0x0B,0x9C,0xE1,0xCB,0xBB,0xCC,0x19,0x9A,0x64,0xE2,0xD3,0xC5,0xB9,0x57,0x56, + + 0x25,0xA5,0x7D,0xD1,0x8E,0xF7,0x4E,0xEC,0x37,0x21,0x3C,0x22,0x65,0x55,0x5A,0xF2, + + 0x07,0x69,0xC3,0xEA,0x32,0x12,0xC6,0xFB,0xE0,0xCF,0xED,0xF6,0x0A,0x17,0xDD,0xA4, + + 0xA9,0x48,0xAD,0x7F,0xB1,0x95,0x7A,0xD7,0x06,0x78,0x6B,0xF5,0x1E,0xEC,0x6C,0x6C, + + 0x1F,0x9C,0xFF,0x80,0xDB,0x4D,0x3E,0xAE,0xE5,0x6B,0x4C,0x46,0xB4,0xB5,0x77,0x98, + + 0x88,0x66,0xE4,0xE6,0x3B,0xB0,0x2F,0xDA,0x3D,0x52,0xE7,0xBC,0xD8,0x46,0xDF,0x0F, + + 0x81,0x59,0x32,0xB1,0x88,0xF8,0x09,0xDA,0xAE,0x73,0x4C,0xA7,0x59,0x05,0x39,0xF9, + + 0xC5,0x96,0xAF,0x77,0x79,0xF6,0xFF,0x3F,0xEF,0x6B,0x7F,0x3E,0x0B,0x26,0xD2,0xA8, + + 0x20,0xE3,0x2A,0xA5,0x1D,0xF1,0xE0,0x99,0x02,0x9E,0x96,0x1A,0x81,0xE7,0x3C,0xA5, + + 0x01,0x3B,0x97,0xB8,0xC4,0x36,0x05,0x89,0x03,0x9F,0xC0,0xF2,0xF2,0x9F,0xCE,0xB5, + + 0x3B,0x6B,0xBD,0x1B,0xD6,0x5F,0x37,0x30,0x16,0x9A,0xD7,0x89,0xDF,0x1E,0x57,0x25, + + 0x52,0x2E,0xC5,0xEE,0xD3,0xA0,0x3F,0x94,0x13,0x9B,0xA6,0x7D,0x18,0xBE,0xA3,0xB4, + + 0xDC,0xE3,0xE6,0xB0,0x11,0x70,0x94,0x25,0xC3,0x4D,0x92,0x77,0x50,0x60,0x6E,0xDD, + + 0xE8,0x5B,0x77,0x67,0x77,0xA2,0x70,0x52,0xFA,0x4F,0x1B,0xC7,0x0D,0xC5,0xED,0xE9, + + 0x5E,0x4F,0xBF,0xB0,0xF0,0xDD,0xEC,0xE3,0x61,0x1D,0x91,0x25,0x31,0xCD,0xC9,0x91, + + 0xC8,0x09,0x76,0xEB,0xB5,0x9F,0x21,0xDB,0xC7,0x03,0x56,0x3D,0x38,0x73,0x9D,0x41, + + 0xE3,0xBB,0x74,0x26,0x7A,0x95,0x57,0x93,0x1A,0x56,0xE8,0x84,0x09,0xC9,0x00,0x41, + + 0x13,0x24,0x64,0xD1,0xE4,0xD8,0x5B,0xF4,0x49,0xAA,0x4A,0x07,0x2F,0xEF,0x9E,0x40, + + 0x84,0xCF,0x3E,0x36,0xE2,0xF5,0xE9,0xF2,0x92,0xE9,0xC6,0xB5,0x25,0x6F,0xEA,0xD3, + + 0x46,0x0F,0x0D,0xAA,0x13,0x25,0x99,0x61,0x09,0x2B,0x22,0x15,0xF3,0x25,0xC3,0x8A, + + 0x91,0x21,0x3D,0x57,0xC9,0xF5,0xE8,0xAA,0x8D,0xC0,0x7E,0xBF,0x79,0x62,0x34,0xAD, + + 0x98,0xF4,0x66,0x67,0xDB,0x29,0xCC,0x09,0x15,0xE6,0xA4,0x35,0xD6,0xCF,0x3B,0xF6, + + 0xA9,0x68,0xA8,0x7F,0x27,0x75,0xD3,0x39,0x30,0xE7,0xCA,0x3E,0x83,0x5A,0x22,0x11, + + 0x09,0xAB,0xB0,0x8F,0x9D,0x23,0x9C,0x4A,0xAF,0xE8,0x50,0xFD,0x90,0x29,0x82,0x58, + + 0x31,0x17,0x02,0xCD,0x9A,0x8D,0x92,0x78,0x2C,0x46,0x96,0x10,0x38,0xB3,0x2A,0x0E, + + 0x0A,0x4F,0x19,0xA2,0x1D,0x0F,0x9A,0x68,0xB3,0xE0,0x3D,0x0F,0x23,0xBB,0x46,0xCD, + + 0xCA,0x54,0xD4,0xB2,0x73,0xBF,0xD1,0xED,0xC0,0xA1,0x28,0xAA,0x33,0xBF,0x0B,0x7D, + + 0x09,0xC3,0xC2,0xD9,0x91,0xE9,0xD8,0x2B,0x78,0xC5,0x93,0xFC,0xE8,0x3B,0xD2,0x04, + + 0x22,0x21,0x80,0xC4,0x2A,0xBD,0x72,0x11,0x9F,0xDB,0xAE,0x4B,0x0B,0x8F,0xF7,0x14, + + 0x2D,0x71,0x73,0x16,0xF4,0xC0,0xDC,0xD9,0x3D,0x3D,0x80,0x24,0x8E,0xDC,0xB2,0x88, + + 0x53,0xAD,0x92,0x7A,0x41,0xB1,0x17,0x32,0x82,0x8D,0x55,0xD1,0xF3,0xDF,0x65,0xF3, + + 0x1E,0x1D,0x4D,0x14,0xCD,0x71,0x27,0x2E,0x1E,0xD8,0x85,0xF2,0x2F,0x79,0xD4,0x42, + + 0xE7,0x9C,0xE2,0x26,0x59,0xD5,0xF7,0xD8,0xBE,0xE5,0xB4,0xB2,0xBA,0x79,0xC8,0xCE, + + 0xC2,0xE4,0x88,0xFC,0x10,0x75,0x67,0xBE,0x65,0x77,0xDB,0x76,0xF3,0x1C,0x85,0xD1, + + 0x99,0x54,0x42,0x54,0xDE,0x74,0xF8,0x9A,0x7F,0x0A,0x79,0x77,0xC1,0x7C,0x33,0xC8, + + 0x56,0x94,0xF9,0xF4,0x7B,0x6E,0x7D,0x0E,0x6C,0xF1,0xE5,0xD5,0x16,0xB7,0x3E,0x66, + + 0xAB,0x15,0x82,0xDF,0xC5,0x49,0x14,0x36,0x9F,0x5B,0x95,0xBF,0x59,0x68,0xCE,0x9C, + + 0xCE,0x1F,0xD5,0x9D,0x42,0x39,0xE1,0xBA,0x47,0x37,0x29,0xCD,0x7F,0xB0,0x7A,0x4B, + + 0x09,0x05,0x7A,0xF3,0x8E,0x65,0xA9,0x01,0x09,0x85,0xAD,0x42,0x83,0x5A,0xA5,0xD9, + + 0xAF,0x9B,0xEF,0xCB,0xCD,0x36,0x21,0x08,0x23,0x68,0xD7,0xAE,0xD8,0x6B,0x42,0x3B, + + 0x7A,0x5E,0xD7,0x48,0x38,0xCB,0x41,0x96,0xA0,0xCD,0x8C,0x94,0x12,0x6D,0x41,0xBA, + + 0xD4,0x91,0xF6,0x2F,0x5D,0x7F,0x57,0x03,0xE4,0xA0,0x72,0x6F,0x4E,0x77,0xDD,0xE7, + + 0x28,0x1A,0xFF,0x3E,0xD0,0x5B,0x5F,0xE4,0xEC,0x7C,0xA9,0xC5,0x13,0x6F,0x8B,0x5C, + + 0xE8,0x7F,0x8F,0x86,0x1A,0x90,0x38,0x87,0x39,0x55,0x5B,0xEE,0xCE,0x6E,0x8B,0x45, + + 0x0A,0x5C,0xE5,0x74,0x6C,0x5F,0xB3,0xD1,0x10,0x81,0xF4,0x9F,0xA9,0x41,0xFE,0x0C, + + 0x63,0x87,0x02,0xB6,0x13,0x83,0x1B,0x86,0x9D,0x22,0x43,0x11,0xF4,0x1E,0xE5,0xC9, + + 0x3F,0x2D,0x9A,0xB7,0x63,0xA4,0x92,0x93,0x18,0x61,0xB4,0xA3,0xD6,0xE2,0x83,0x53, + + 0x83,0x03,0x3E,0x93,0x9D,0x0F,0x03,0x02,0xAB,0x6C,0x79,0x5F,0xD5,0x4E,0x68,0xC6, + + 0x46,0xBF,0x45,0x40,0x82,0xC0,0x08,0x28,0x77,0x6B,0x30,0xE7,0x75,0x67,0xFF,0xA1, + + 0x1B,0x58,0x90,0x72,0xFE,0x3F,0x32,0x6F,0x56,0x6A,0xA8,0xE9,0xBE,0x14,0xA1,0x46, + + 0x52,0x0B,0x5A,0xA5,0x3A,0x5B,0xF2,0x10,0x9A,0x4A,0x0A,0x99,0x59,0x4B,0x3B,0x52, + + 0x6C,0xD7,0xF1,0x4A,0x15,0x6B,0xFE,0x34,0x05,0x18,0x1A,0x37,0x9B,0xFC,0x44,0x60, + + 0x8D,0x85,0x1F,0x33,0xA3,0xF5,0x67,0x59,0x2A,0x4B,0xB3,0x5F,0x7D,0xE3,0x02,0x78, + + 0xB0,0x85,0xF5,0x1E,0x92,0x14,0x04,0x8A,0x8F,0x49,0x39,0xCD,0x4D,0x44,0x1E,0x49, + + 0x2D,0xD7,0x70,0xE1,0xEF,0xEA,0x48,0xD8,0xFE,0xA6,0x26,0x5C,0x83,0xE3,0x13,0x25, + + 0xEB,0x7E,0xC9,0x1F,0x6C,0x2D,0x73,0xA2,0x40,0x46,0xA5,0xCD,0x9D,0x14,0x02,0x1C, + + 0x4F,0xCE,0xC4,0x2C,0x91,0x2A,0x4C,0x76,0x8C,0xCC,0x83,0x08,0xB5,0xFD,0xAA,0x4A, + + 0x18,0x8B,0xF8,0x52,0xBC,0xA9,0xA0,0x85,0x6B,0x60,0x25,0x1C,0x7D,0x20,0x61,0xA2, + + 0xBD,0xBE,0xBA,0x8F,0x82,0xA3,0x2A,0x4D,0xCF,0xAE,0xD3,0x63,0x5C,0xEA,0xC1,0x0B, + + 0x89,0x8D,0xED,0x2D,0x1D,0x63,0xFC,0x8D,0x8B,0x8E,0x7F,0x8E,0xEF,0x2C,0x13,0x00, + + 0xE1,0x18,0x5B,0x7A,0x34,0xF2,0x0A,0x12,0xAE,0xC3,0xB2,0xAF,0xF4,0x77,0x04,0xF0, + + 0x9C,0x9D,0xAB,0xBB,0x8A,0x6C,0x5A,0x1B,0x9A,0x7C,0xC2,0xBF,0x4A,0x0E,0xE5,0x93, + + 0x6E,0x8F,0xE1,0x37,0xB2,0xF0,0x3D,0x8B,0x0D,0x71,0x8B,0x7E,0xD5,0x82,0x15,0xFD, + + 0x24,0x9E,0x7C,0x69,0x68,0xCE,0x6F,0x20,0xD7,0x0C,0x87,0x4C,0x8A,0x0C,0x34,0xA0, + + 0x72,0xF8,0x32,0xE1,0x97,0x1B,0xB2,0x66,0x6C,0xD0,0x47,0xDF,0x8A,0x25,0xE9,0x21, + + 0x3B,0x87,0x92,0xD1,0x96,0x1A,0xC7,0x61,0x17,0xDF,0x3C,0x32,0x73,0x21,0x3C,0xC9, + + 0x03,0x30,0xB4,0x43,0xB4,0xC8,0x8A,0xA4,0x2C,0x67,0xC2,0x53,0x06,0x55,0xD5,0x40, + + 0xB3,0x38,0xFA,0xF0,0x16,0x18,0xE9,0x77,0xED,0xCF,0xA9,0xE8,0xD1,0x22,0x9B,0xC8, + + 0x8D,0x4D,0x09,0xAA,0xBE,0x74,0xF6,0xC3,0x30,0x75,0x76,0xDA,0x7F,0x55,0x6E,0xB3, + + 0xD1,0x89,0xAE,0x9E,0x3D,0xB9,0x6F,0x06,0x9A,0xB5,0x75,0xF9,0xA3,0xF3,0xF5,0xB4, + + 0xC2,0xD8,0xAF,0x0B,0xFC,0x16,0x62,0x96,0x13,0x77,0xA9,0x3F,0x03,0x57,0x54,0x60, + + 0x5A,0xD9,0xCF,0xC9,0xFC,0xF9,0x80,0x28,0x83,0x06,0xBC,0xAC,0xAA,0xCB,0xE7,0xB5, + + 0xEF,0xFE,0x75,0x4A,0x3C,0x81,0x09,0xAD,0x93,0x6A,0x61,0xD1,0x5C,0x49,0x3E,0xB8, + + 0x7B,0xF1,0x79,0xF9,0x9E,0x12,0xDB,0xFC,0xFB,0xB9,0x36,0xFA,0xAB,0x9E,0xA3,0x4E, + + 0xED,0xBE,0x99,0xC8,0x1F,0x11,0xCC,0x71,0xED,0xCC,0xA6,0xD5,0x90,0xBC,0x36,0xD5, + + 0x0A,0x39,0xBF,0x5B,0xB5,0xC5,0xCB,0xDC,0x4E,0x00,0x58,0x4F,0x0B,0xDC,0xB7,0xA4, + + 0xF0,0x63,0x2C,0x81,0x6C,0xDF,0x2E,0x91,0x8A,0x63,0x50,0xA5,0xD7,0x22,0xA4,0x5F, + + 0xFC,0x7D,0x53,0x14,0x72,0xAD,0x4C,0x23,0x23,0x02,0x71,0x0F,0x25,0xF4,0x36,0xB1, + + 0x86,0x6A,0x41,0x84,0xB8,0xDD,0x6F,0x08,0x08,0x21,0xD1,0x80,0xD6,0x40,0xA0,0x6F, + + 0x14,0x6D,0x9F,0x20,0x22,0x6E,0x39,0x2F,0x4E,0xEE,0x8E,0x0A,0xE5,0xB6,0x19,0x44, + + 0x8F,0x67,0xF3,0x69,0xEE,0xB7,0xE3,0xCD,0xBE,0xD7,0xF3,0x63,0xBB,0x20,0x35,0x97, + + 0xC9,0x96,0x7F,0x4A,0x2F,0xD1,0x98,0x69,0x2B,0xD6,0xE2,0xC5,0xDF,0xCA,0xEA,0xE4, + + 0x57,0x18,0x72,0xE8,0x94,0xDE,0x7E,0x0E,0x1B,0x04,0xC3,0x75,0x39,0x22,0xF2,0xC2, + + 0xBD,0x0D,0xDA,0xBD,0x5F,0x6A,0x27,0xC9,0x36,0xE4,0x7D,0x17,0x20,0x02,0xBF,0x9B, + + 0x38,0x55,0xFD,0xF4,0x18,0x6A,0x42,0xBB,0x7A,0xE5,0x87,0xA8,0x5F,0x28,0x2E,0xA2, + + 0x8E,0x4A,0x9E,0xE3,0x7A,0xA5,0x99,0x4B,0x7B,0xE8,0xAD,0x9C,0xA9,0x98,0x61,0x09, + + 0x8B,0x4A,0x8E,0x35,0x9E,0x08,0x84,0xBA,0xA6,0x42,0x30,0x84,0x04,0x39,0x52,0x5A, + + 0x2C,0xF4,0x9D,0x28,0x2A,0xD6,0xCB,0xCA,0xB9,0xE6,0x2C,0x05,0x2D,0x1A,0x81,0x0F, + + 0xE3,0x9F,0x39,0x44,0xBF,0xD3,0x87,0x9B,0x74,0x48,0xEA,0xE8,0x50,0xAA,0x02,0xD0, + + 0xE2,0x9E,0xAC,0x75,0x18,0x7D,0x8B,0xFC,0x49,0x7C,0xE4,0xDC,0x3B,0xED,0x24,0x3A, + + 0xB4,0x98,0x2F,0xDE,0xAE,0xF3,0xD9,0x57,0xF0,0xBB,0x70,0xC9,0x06,0x0D,0xF8,0xF4, + + 0xB8,0x4F,0x74,0x6D,0x64,0x80,0x9B,0xFD,0xCF,0x43,0xA5,0x7B,0x3A,0xCC,0x62,0xA8, + + 0xDF,0x4D,0x4A,0x00,0x32,0xDF,0xC6,0x8C,0xA8,0xB3,0x38,0xD7,0x56,0x86,0x58,0xAB, + + 0x07,0x53,0xB4,0x67,0x05,0x73,0xDC,0x30,0xFE,0xFE,0x67,0x36,0xB3,0xB6,0x67,0x81, + + 0x57,0x87,0xBD,0x76,0x88,0x57,0x80,0xB2,0xD2,0xC3,0x6A,0xD6,0xDA,0xA4,0x09,0x36, + + 0x78,0x6E,0xC9,0x84,0x10,0x9C,0xB9,0xC2,0xD9,0x5C,0x5D,0x31,0xB3,0xEC,0xDF,0x70, + + 0xD1,0xCB,0x84,0x04,0x34,0x16,0x94,0xE4,0xE3,0x59,0xB6,0xE4,0xEF,0x89,0x72,0xF9, + + 0xF5,0x1F,0x0C,0x55,0xA4,0x77,0x0A,0xCF,0x05,0x17,0xA5,0xCA,0x0B,0x80,0xA9,0xB2, + + 0x96,0xE0,0x2D,0x41,0xB0,0x62,0xEA,0xA3,0x43,0x83,0x78,0x0B,0x13,0x49,0x09,0x39, + + 0x37,0x55,0x8D,0x22,0xB5,0x15,0x1D,0xD8,0x60,0x5A,0x4E,0x0F,0x08,0x35,0x29,0xD2, + + 0x9D,0x84,0x13,0xAB,0x99,0x97,0xA2,0xDB,0x5C,0x57,0x22,0xCE,0x83,0x14,0x5A,0x87, + + 0x0F,0x1A,0xB6,0x6F,0x41,0x5C,0xBA,0xCB,0x55,0x56,0xA0,0x19,0xAB,0xE6,0xC7,0x88, + + 0x61,0xCE,0x94,0x09,0xBA,0xD8,0xD7,0x29,0x51,0xF5,0xA9,0x1D,0x22,0xC5,0xDF,0x39, + + 0x2C,0x58,0xB7,0x6E,0xCD,0x79,0xAB,0xCA,0x99,0x54,0x5F,0xF8,0x74,0xAF,0x02,0x28, + + 0x48,0x83,0x2E,0x48,0x30,0x9C,0xA9,0x2A,0xCB,0x83,0x92,0xCA,0x8F,0x70,0xA9,0xAB, + + 0x17,0xCB,0x58,0xBC,0x3F,0x18,0x8B,0xE7,0x19,0xF9,0x6D,0x58,0x87,0x1E,0xBC,0x0E, + + 0x43,0x8F,0x07,0x4C,0x2D,0x93,0x97,0xEC,0x3E,0x8A,0xEF,0x92,0x7B,0x73,0x47,0xDC, + + 0xC0,0x0E,0x5A,0xF9,0x6F,0x8E,0x0B,0xBC,0x23,0x1C,0x1F,0x7D,0xC3,0x8A,0xCC,0x71, + + 0x22,0x76,0x58,0x75,0x78,0xA9,0xE6,0x93,0x6E,0x6F,0x70,0xE2,0x50,0x34,0x60,0x07, + + 0xE4,0x2E,0xF6,0x23,0x49,0x03,0x06,0x9A,0x8F,0x82,0xED,0x09,0x63,0x74,0x1F,0xA2, + + 0x46,0x82,0x21,0x66,0xDD,0xE3,0xA4,0x21,0x9C,0xAE,0x64,0x38,0xA6,0x37,0x7D,0xE0, + + 0xA3,0x87,0x3F,0x95,0x15,0x18,0x47,0x0B,0x2C,0x20,0x6C,0x0C,0xA7,0xA1,0xCC,0xE7, + + 0xD3,0xE7,0x71,0x38,0x74,0x5B,0x48,0x1D,0xC7,0xC9,0x67,0x95,0xDA,0xB9,0x0E,0xFE, + + 0xF2,0x23,0x50,0xA8,0x07,0xE8,0xB8,0xF2,0x7F,0xCB,0x38,0xF7,0x3A,0xE8,0xCA,0x89, + + 0x3D,0xE8,0x9F,0x6E,0xA5,0x92,0xC2,0xD2,0x3A,0x05,0x89,0x40,0x6B,0xE9,0x3C,0x13, + + 0x8B,0x2C,0x16,0x90,0x5D,0x36,0x41,0x8C,0x44,0xCA,0x06,0x50,0x76,0xA5,0xB3,0x79, + + 0x2A,0x02,0x9A,0xDE,0x40,0x29,0x54,0x8B,0xA7,0xB9,0x3E,0x69,0x88,0x4B,0xBA,0x74, + + 0x4E,0x56,0x60,0x2F,0x71,0xB6,0x3E,0xD8,0xCD,0x59,0xDB,0xBA,0x5B,0x6B,0x03,0x5A, + + 0xA6,0x81,0xE5,0xFC,0xAC,0x21,0xF3,0xAA,0xD3,0x41,0x14,0x9B,0x5E,0x6C,0x73,0x82, + + 0x00,0xF6,0x13,0xFF,0x99,0x86,0x1D,0x8A,0xF5,0x6F,0x40,0x18,0x7C,0x14,0x73,0xB5, + + 0xE7,0xBD,0x59,0xDD,0x22,0xA6,0x89,0xEE,0x42,0x18,0xB6,0x1B,0xF2,0x89,0x54,0x77, + + 0x4C,0x12,0x94,0x66,0xEA,0x2E,0xC9,0xD7,0xB3,0x5E,0x82,0x39,0x3C,0xEF,0x29,0xB1, + + 0xAF,0x4F,0x62,0x30,0xFE,0x51,0xD0,0xC2,0x12,0x9D,0x5C,0x8D,0x72,0x13,0x73,0x7B, + + 0x89,0xAD,0x14,0xAC,0xA3,0xED,0xBB,0xFB,0xF7,0x8D,0x9D,0xDE,0x20,0x62,0xC8,0xF1, + + 0x50,0x36,0xE4,0x23,0x95,0x1F,0xF4,0x22,0x9A,0x7D,0x62,0xB9,0x46,0x5D,0x7A,0xD2, + + 0x71,0x3C,0xFC,0x12,0x37,0xBB,0xAD,0x50,0x63,0xD3,0xEA,0xD6,0x79,0x5A,0xF7,0xF0, + + 0xDC,0x34,0x32,0xA0,0x15,0x1D,0x20,0x41,0x48,0x7F,0x67,0x77,0x74,0x5A,0xFF,0xA2, + + 0x83,0x3C,0x95,0x64,0x9F,0xD6,0x12,0xC0,0xD9,0xDC,0xAC,0x48,0x1C,0xE2,0x9B,0x85, + + 0xCF,0x87,0x43,0xFA,0xE6,0x45,0x7E,0xCD,0x12,0x81,0xA0,0x1C,0x8D,0x2B,0x0A,0x63, + + 0x26,0xA4,0x2C,0x57,0x5A,0xD0,0x69,0xCD,0x51,0x00,0xC4,0xCB,0x88,0xFB,0x03,0x77, + + 0x4F,0x75,0xC2,0x67,0x2A,0x95,0x62,0xD8,0xD2,0x43,0x35,0x66,0x52,0xF8,0x53,0xFB, + + 0x18,0x42,0x59,0xB5,0x00,0xD2,0x28,0x77,0xBA,0x22,0xC5,0x4B,0xF1,0xD5,0xB7,0xF9, + + 0x46,0x3B,0x9E,0x7D,0x1A,0xFA,0x82,0xD9,0x1C,0xD7,0xC9,0x56,0x7C,0x94,0x29,0xDD, + + 0xC4,0x5A,0x7A,0xB9,0x9C,0x16,0x47,0xDC,0xE0,0xBB,0xEB,0x24,0x7E,0x5B,0x73,0x78, + + 0x94,0x9E,0xE7,0x81,0x1D,0x15,0x6D,0xF9,0x84,0x3B,0x89,0x03,0x26,0x57,0x49,0x3F, + + 0x46,0xCA,0xFD,0x1B,0xBF,0x59,0xC0,0x3F,0xE7,0xCA,0x81,0x13,0x09,0xC8,0x33,0xF5, + + 0x18,0x23,0xDE,0x21,0x38,0x9E,0xD5,0xC3,0xB2,0x8D,0x68,0x0C,0xD2,0x01,0xBF,0x29, + + 0x19,0x40,0xD6,0xF3,0xC0,0x60,0x2C,0xAA,0xD3,0xDE,0x2A,0xDA,0x7F,0xFD,0xA7,0x4F, + + 0xF6,0x3F,0x79,0xAD,0x49,0xDB,0x51,0x4E,0xE3,0x7A,0x8F,0xD1,0xD8,0x0B,0x39,0x72, + + 0x44,0xAC,0x3E,0x21,0x67,0xFB,0xCE,0xC6,0x17,0x4E,0xFF,0xFF,0xA6,0x17,0x59,0xEB, + + 0xA5,0x5F,0x00,0x8C,0xB5,0x2B,0x68,0x07,0xB9,0x4F,0x14,0xE4,0x5C,0xA0,0x48,0xE8, + + 0xBD,0xFA,0x48,0xF4,0x11,0x00,0x4A,0x31,0xAA,0x30,0x70,0x1D,0xB0,0x7A,0x00,0x67, + + 0x3F,0xB9,0x80,0x81,0x99,0x43,0xAE,0x11,0xCC,0x9F,0xB1,0xA0,0x57,0x03,0x30,0xED, + + 0x79,0x43,0xEC,0xFD,0x2A,0x6E,0xC6,0x31,0xB6,0x4C,0xFC,0xC3,0x5C,0x78,0x3E,0x79, + + 0xE9,0x95,0xDC,0xBB,0xF9,0x95,0x28,0x02,0x02,0x4B,0x50,0x75,0x6E,0x08,0x93,0x53, + + 0x7C,0x09,0x08,0x55,0x6D,0xA8,0xB9,0x12,0x03,0x4A,0xBA,0x74,0x52,0xC8,0x3F,0x6C, + + 0x69,0x57,0x3E,0xC1,0xF9,0x30,0x09,0x75,0x40,0x1A,0xB3,0x68,0x3B,0x17,0x7E,0x38, + + 0x73,0x1E,0xB7,0x78,0x78,0xB6,0x86,0x71,0xB4,0x43,0xC5,0x8A,0xD5,0xCC,0x4A,0xF3, + + 0x3B,0x37,0x79,0x04,0xBD,0x97,0xD2,0xEC,0x43,0xE3,0x29,0x4A,0x9A,0x48,0xB2,0xEB, + + 0x23,0x67,0xCD,0xFC,0x11,0xBB,0x5A,0xC9,0x3D,0x46,0xEA,0xB8,0x7A,0x2B,0xBB,0xFA, + + 0xAA,0x1A,0xA8,0x73,0x49,0x97,0x00,0x06,0xA3,0xFB,0xDB,0x28,0xDE,0xC1,0x52,0x66, + + 0x2C,0x8D,0xB4,0x2C,0x38,0xD4,0x45,0x04,0xC9,0xE6,0x0B,0x7B,0x25,0x6D,0x82,0x88, + + 0x1F,0xF8,0x02,0xBD,0x7C,0x21,0x92,0xAC,0x41,0x4A,0x9A,0xE8,0x31,0x7D,0xDF,0x42, + + 0x3F,0xD0,0xD9,0x2F,0x6B,0x26,0x69,0x64,0xE8,0x4B,0xE4,0x44,0x78,0x2D,0x54,0x57, + + 0xFA,0xBA,0xB1,0xB2,0x98,0x8E,0xFA,0xE7,0x6B,0x48,0xEC,0x8F,0x92,0xFF,0x63,0x3B, + + 0x76,0x03,0x4B,0x4C,0xA7,0x24,0xF2,0xF6,0x6A,0x49,0xDD,0x50,0xF8,0xEF,0x45,0xE6, + + 0x42,0x10,0x21,0x66,0x36,0x70,0x4E,0xA1,0x0A,0x81,0x07,0xD6,0xD3,0x0B,0xB4,0x6B, + + 0xC8,0x32,0x27,0xD3,0x02,0xCC,0x3C,0x63,0x45,0x3D,0x63,0x48,0xE3,0x33,0xFD,0xE7, + + 0x53,0x02,0xCD,0xFE,0xE1,0x39,0x6B,0x9D,0xAA,0x23,0x94,0x5E,0x83,0x7E,0x1B,0xF3, + + 0x5E,0xBE,0x35,0x07,0xF9,0x21,0x44,0xCF,0x44,0xD5,0x99,0x08,0x8A,0x63,0x64,0xE0, + + 0x41,0x41,0xBE,0xA4,0x26,0xC9,0x74,0xA0,0xC3,0xD3,0x6F,0x76,0x72,0x7E,0x34,0xF7, + + 0xD6,0x1A,0xD4,0xD1,0x58,0x84,0x5E,0x72,0xFE,0x9E,0xE6,0x16,0x98,0x04,0x3D,0xE6, + + 0xC1,0xBC,0xDA,0x25,0xBA,0xEB,0x81,0x0A,0xE4,0x9C,0x04,0x61,0x99,0xDE,0xF9,0xAE, + + 0x00,0x72,0xC9,0xA6,0xCB,0x3E,0x65,0x81,0xC9,0x5E,0xA3,0xCD,0xF5,0xDC,0x56,0x2D, + + 0x2E,0xB3,0x3E,0x1E,0x38,0x30,0x12,0x68,0x64,0x1A,0xCD,0xAC,0x07,0x78,0x31,0x7A, + + 0xC0,0x3A,0x71,0x67,0x0A,0xD6,0xB6,0x89,0xEE,0x38,0xC5,0xC3,0x2C,0x70,0x0D,0xF3, + + 0x0B,0x7F,0x8D,0x65,0x66,0xF7,0x49,0x0B,0x6D,0x9B,0x4C,0xEF,0xFE,0x32,0x1D,0x98, + + 0x52,0x96,0x37,0x06,0xDA,0x3F,0xF7,0x90,0x08,0x40,0x9E,0x3F,0xF0,0x96,0xFD,0x2A, + + 0x86,0xE1,0x91,0x48,0x1D,0xF5,0xD6,0x89,0xDA,0xE3,0x04,0x9E,0xD9,0xDC,0x5E,0x24, + + 0xAB,0x5F,0x90,0xF4,0xC2,0x32,0x9E,0x28,0x24,0xA0,0x5E,0xED,0x47,0x76,0x3F,0x30, + + 0xEE,0xE5,0x07,0x3C,0xB9,0x7C,0x88,0x13,0x9D,0xA9,0xC4,0x9E,0x8A,0x75,0x05,0x0C, + + 0x56,0x90,0xC9,0xE5,0x52,0xAE,0x47,0xFC,0x80,0x8E,0xDD,0x8E,0xC7,0xF6,0x30,0x8A, + + 0xA1,0x06,0x9B,0xA3,0xE3,0x0D,0xA5,0x42,0x28,0x4D,0xBC,0x21,0xF5,0x68,0x81,0x90, + + 0xC0,0x27,0x96,0x3F,0x63,0x0E,0xAB,0x0D,0x3D,0x14,0xB1,0x44,0xF6,0xE7,0xAA,0x43, + + 0x80,0xA2,0x30,0x3A,0x7F,0xE6,0xCC,0x18,0xB8,0x57,0xB0,0xC5,0x56,0xEA,0x11,0xD4, + + 0x47,0x63,0x0D,0x75,0x31,0x4E,0x2A,0xB7,0xD0,0x3F,0xB1,0x90,0x76,0xE5,0x58,0x7C, + + 0x37,0x71,0xE2,0x35,0x2A,0x2D,0x43,0x7F,0xE5,0xBF,0xCE,0x4B,0x37,0xC4,0xC1,0x2C, + + 0x92,0x08,0xFB,0xB6,0x57,0x08,0x58,0x8F,0x13,0x1E,0x98,0x39,0x30,0xE8,0x7C,0x0C, + + 0x7B,0xFA,0xE5,0xA7,0x2F,0x0B,0xF1,0x9A,0x31,0x5D,0xA9,0x08,0x56,0x95,0x14,0xB9, + + 0x04,0x8A,0x7C,0x27,0x9F,0xAC,0x4A,0x77,0xD2,0x3B,0xE3,0xC2,0xF4,0x1F,0x2A,0x0E, + + 0x04,0xD4,0x66,0xE0,0xB0,0xA5,0x08,0x1B,0x34,0x67,0xBA,0x63,0x3F,0xA8,0x28,0xF8, + + 0x3E,0x74,0x92,0xE1,0xEC,0xCA,0x29,0xC9,0x3D,0x44,0xF8,0xDC,0xDF,0xA1,0x43,0x5D, + + 0x46,0x87,0x67,0xE0,0x65,0x0B,0x24,0xDB,0xC4,0x69,0xCB,0xAD,0xDD,0xB2,0x93,0x2B, + + 0x85,0xC4,0x6B,0xEE,0xDC,0xF6,0x2D,0x06,0x26,0x3A,0x2C,0xDD,0x5F,0xA3,0x9D,0x88, + + 0xAF,0x53,0xA7,0xCC,0xDB,0x21,0x48,0x99,0x7A,0x67,0x32,0x9F,0xDE,0xE4,0x7D,0x44, + + 0x7F,0x39,0x15,0x6E,0x1D,0xEF,0x72,0x8A,0x69,0xC2,0x3A,0x8F,0xF7,0xE5,0xA3,0x4E, + + 0x5A,0x7A,0xDB,0xB1,0x32,0xA3,0xE0,0xBA,0x4C,0xCA,0x77,0x9E,0xAA,0xBB,0xFE,0x41, + + 0xBB,0x89,0xB5,0x17,0x3E,0x10,0xBB,0xAF,0x8F,0xC9,0x73,0x00,0x1D,0x9F,0x72,0x22, + + 0xD7,0x6B,0xDA,0x64,0x26,0xFD,0x51,0x54,0x62,0xF8,0xEE,0x5C,0xD7,0xF4,0x64,0xDE, + + 0xA8,0x1C,0xE4,0xAB,0xC8,0xDD,0xBC,0x52,0x63,0x7A,0xDC,0xF6,0x7B,0xFC,0x65,0x7F, + + 0x18,0xD0,0xBF,0x85,0x7E,0xBD,0xA1,0x27,0xC7,0xD2,0x4E,0x23,0xBF,0x5C,0xCA,0x68, + + 0x44,0x45,0x69,0x68,0x38,0xA8,0x28,0x88,0x8E,0x82,0xF7,0x08,0x56,0xFE,0x66,0x40, + + 0xA6,0x55,0xBC,0xC2,0x7E,0xC5,0xC5,0x66,0x0D,0xD0,0xF0,0x06,0xCB,0xF2,0x8E,0x56, + + 0x2F,0x66,0xF6,0xD7,0x14,0xC8,0xCD,0x76,0x0C,0xF0,0x48,0x94,0x8C,0xB7,0x1D,0xE7, + + 0xA0,0x3D,0xBD,0xD7,0x5F,0xC7,0x7D,0xE6,0x8D,0x07,0x5F,0x95,0x57,0x69,0x0D,0xE9, + + 0xF3,0x9A,0xD7,0x24,0x8B,0x18,0x35,0xF7,0xCE,0x28,0xA3,0x16,0xC8,0xD7,0x5D,0xF9, + + 0x06,0x39,0xDA,0xE8,0xE2,0xAA,0x0F,0xEC,0x00,0xDE,0xFC,0x71,0xDF,0xFE,0xFA,0x64, + + 0x4E,0xDB,0xD6,0x5E,0x6B,0xA2,0x80,0xBE,0x45,0x4F,0x40,0x5C,0xDC,0x71,0x1F,0x74, + + 0x45,0x99,0x1F,0xFF,0x3C,0x1C,0x17,0xD7,0x4D,0xD9,0xBB,0xA8,0x5D,0x70,0xEF,0x6A, + + 0xE0,0x06,0xCA,0xE9,0x30,0x3D,0x66,0xC4,0x48,0xD0,0xBD,0x5D,0xD9,0x76,0x9D,0xED, + + 0x8F,0x07,0xF5,0xBD,0x4E,0xFE,0xC9,0x78,0x72,0x01,0x36,0xA2,0xA3,0xFA,0x55,0x66, + + 0xAD,0xC1,0x2E,0x92,0xE2,0x1D,0x62,0x05,0x86,0x0C,0xA0,0x87,0x9E,0x82,0x67,0xFB, + + 0xAE,0x61,0xB9,0xB6,0x5F,0xC1,0x15,0xEB,0xEF,0x9E,0x5D,0x9C,0x5F,0xBC,0x8E,0x39, + + 0x03,0x62,0xFC,0xAC,0xCF,0xB4,0x65,0x2A,0xCE,0x9F,0x3F,0xB3,0x22,0xBD,0xCA,0x10, + + 0x82,0x04,0x98,0x89,0x70,0x30,0xCD,0x21,0x46,0x18,0xF0,0x9B,0xA3,0x6D,0x68,0x12, + + 0x00,0x8A,0x52,0xE4,0x3B,0x25,0x8D,0xD0,0x45,0xE1,0x32,0x46,0xA4,0x6E,0x8B,0x72, + + 0xF4,0x0D,0xD9,0x89,0x12,0x5E,0xBE,0x30,0xFC,0xEF,0x6E,0xD9,0xD0,0x64,0x5B,0x95, + + 0xEA,0xCA,0x08,0x91,0xF2,0x0F,0x88,0x76,0x03,0x33,0x2D,0x4A,0x72,0x0D,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xDD,0xE6, + + 0x0E,0x62,0xA2,0x10,0x9A,0x54,0x2C,0x04,0x8A,0x48,0xF0,0x20,0xAD,0xEE,0x6A,0x1A, + + 0x08,0x04,0x4A,0xF8,0xBB,0x2D,0x12,0xC8,0x2B,0x46,0x47,0x1C,0x22,0x6B,0xBE,0x8D, + + 0xCF,0x8A,0x59,0xFD,0xF6,0x25,0x1B,0x16,0x4A,0x4E,0x93,0x09,0xA7,0x6A,0x13,0x98, + + 0xC1,0x9A,0x0F,0x99,0xFA,0x28,0x21,0xCA,0xFD,0xE4,0xC0,0x12,0xAE,0x6F,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x95,0x80, + + 0x4B,0x61,0x7B,0xF7,0x0C,0xE3,0x84,0x24,0x27,0xD0,0x94,0xA4,0x70,0x70,0x32,0xBD, + + 0xD6,0x9C,0xF2,0x92,0x52,0x44,0x3C,0xF0,0x02,0xD2,0x9C,0xB4,0x71,0x71,0x01,0x05, + + 0xE7,0x92,0x7E,0x75,0xB2,0xC3,0xD5,0x45,0x85,0x54,0x95,0xA5,0xF0,0x72,0x1F,0x11, + + 0x5E,0xCE,0x5E,0x66,0x3D,0x72,0x65,0xC3,0x0A,0x02,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x54,0xA7, + + 0xDF,0x95,0xE6,0xDA,0xD1,0x35,0x68,0x85,0x17,0x07,0x96,0xAC,0x78,0x78,0xB1,0xF8, + + 0x1D,0xB4,0xB6,0x66,0x95,0x34,0xD4,0xA8,0xEB,0x5D,0x9E,0xBC,0x79,0x79,0x78,0x0D, + + 0xEB,0xF0,0x78,0x0F,0x7D,0xB7,0xD7,0x6C,0x55,0x18,0x97,0xAD,0xF8,0x7A,0x9A,0x64, + + 0xA9,0xC4,0x9D,0x1D,0x52,0x7F,0x17,0xDB,0xC8,0x79,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x1E,0x3A, + + 0x27,0xC0,0x9A,0xF5,0x75,0xA6,0xA5,0xDF,0xF3,0x82,0x20,0xA4,0x91,0x6D,0x40,0x61, + + 0x39,0x07,0xF2,0xEC,0x7D,0x30,0x3A,0xB0,0xC5,0xC9,0x47,0xF1,0x97,0xE1,0x27,0x2E, + + 0x09,0x04,0x81,0x53,0x37,0xE3,0xFD,0x4C,0xC2,0x08,0x89,0xD9,0x78,0xEF,0xAF,0x53, + + 0x2C,0xC2,0xD7,0x11,0xF6,0x54,0x01,0x53,0xCF,0x63,0x02,0xA5,0xD5,0xA2,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xE2,0xDE, + + 0x4C,0x8E,0xF4,0x23,0xF7,0xCC,0xA7,0x59,0x70,0xC3,0xB3,0x48,0x3C,0xE8,0x52,0x9E, + + 0x66,0x4F,0x94,0x7C,0x62,0xA9,0x58,0xF8,0xA4,0x98,0xBE,0xD8,0x79,0xE9,0x03,0x4B, + + 0xEF,0xC9,0x9B,0xF4,0x1E,0x66,0xB3,0x3A,0xF8,0xA6,0x4B,0xA7,0x79,0x69,0xEB,0x1A, + + 0xF3,0x20,0x50,0x60,0xF5,0x3A,0x59,0x2E,0xCC,0xE6,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x9B,0xB2, + + 0x26,0xD2,0xFE,0xA9,0x46,0x1F,0x32,0x8F,0x8D,0xA1,0xB4,0xA6,0x74,0xF0,0x3E,0x12, + + 0xDA,0x4C,0xD2,0xBB,0xDE,0x20,0x90,0x20,0xE6,0x7C,0xBC,0xB6,0x75,0xF1,0x7B,0xCB, + + 0x45,0x9D,0x01,0xF8,0x17,0x3F,0x6D,0xA7,0xAC,0x83,0xB5,0xA7,0xF4,0xF2,0x7F,0xBC, + + 0x52,0x4E,0x3D,0x6E,0xB5,0x2C,0xAC,0x21,0xA9,0xDB,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x0E,0xE8, + + 0xC5,0xE9,0x99,0xBE,0x3E,0x47,0x0A,0x8E,0x07,0x51,0xB6,0xAE,0x7C,0xF8,0x51,0xE4, + + 0x4F,0x9D,0x94,0xA7,0xC6,0x24,0x26,0x3F,0x0D,0x06,0xBE,0xBE,0x7D,0xF9,0xDC,0xF9, + + 0xCC,0x9A,0x9C,0x3F,0x00,0x65,0x33,0xD4,0x8C,0xA6,0xB7,0xAF,0xFC,0xFA,0x54,0x59, + + 0x0C,0x44,0xFD,0x9D,0x4E,0xFA,0x27,0x2B,0x8D,0x04,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x2B,0xFD,0xA7,0x2C, + + 0xFD,0x06,0xD2,0x7D,0x16,0xB9,0x30,0xB0,0xA9,0x11,0x06,0x46,0xAF,0x1B,0xC8,0x18, + + 0x01,0x0B,0xB2,0xF6,0xBD,0xDC,0x9E,0x43,0x75,0x2F,0xDA,0xF8,0x57,0xF8,0x8E,0xC7, + + 0x0E,0xFD,0x62,0x81,0xAD,0x09,0xBD,0xB3,0xD2,0x4A,0x95,0xDC,0x8A,0x20,0x8D,0xEC, + + 0x7C,0x42,0xF1,0x91,0xAC,0x76,0x7B,0xAD,0xC0,0x83,0x9B,0x4A,0x72,0x67,0xA7,0x00, + + 0x0E,0xF9,0x7F,0xA6,0xFB,0x35,0x8B,0xE2,0x87,0xC7,0x6F,0x2F,0xA8,0x44,0x59,0xD2, + + 0x92,0x42,0xD3,0xE6,0xD1,0x7A,0x43,0x8F,0xA2,0xEA,0x86,0xCC,0xD9,0xBE,0x19,0x90, + + 0x63,0xA9,0x01,0x28,0x5E,0x64,0x0B,0x4F,0x61,0xED,0xD6,0x94,0xEC,0x9F,0x71,0x21, + + 0x8B,0x0C,0x72,0xC7,0x93,0x2D,0x40,0x8D,0x52,0xBC,0x5E,0x07,0x38,0xD4,0x3C,0x24, + + 0x85,0x8E,0x90,0x2F,0xF3,0x6C,0xD2,0x50,0x2B,0xCF,0x94,0xA8,0x29,0xE8,0x74,0x35, + + 0xE0,0x58,0x4A,0x64,0xCF,0x6B,0xF9,0xC8,0x4A,0x46,0x79,0x5E,0xA6,0x05,0x42,0xC9, + + 0x95,0x87,0xBD,0x0A,0xFA,0xF3,0x8F,0x21,0xCE,0x33,0xA9,0xCF,0xDE,0x13,0xF0,0xE8, + + 0x2A,0x3B,0x16,0xCC,0x78,0x69,0x3B,0x20,0xCF,0xD2,0xF9,0xEC,0x5B,0xC7,0xCB,0xCC, + + 0x7B,0x0E,0x82,0xC8,0x27,0xBB,0xEE,0x90,0xD3,0xF7,0xF2,0x70,0xA0,0x2C,0x8A,0x38, + + 0x0B,0xF9,0xB5,0xDE,0xDE,0x8E,0x62,0x97,0x4D,0x24,0x84,0xC4,0xF3,0xB6,0x79,0xAB, + + 0x76,0x1F,0xFB,0xB7,0x36,0x23,0xEF,0xEB,0x1F,0xAF,0x56,0x9C,0xE4,0x97,0x5E,0xDB, + + 0x42,0xA6,0x0B,0x25,0x23,0x27,0x66,0xFB,0x1E,0xAE,0x5C,0x8C,0xA1,0x6C,0x1F,0x17, + + 0xC2,0x00,0xD2,0xC3,0x3E,0xEF,0x50,0xE0,0x6A,0xFD,0x78,0x3A,0x71,0x12,0x74,0x99, + + 0xC1,0x90,0x24,0x10,0x0C,0xA2,0x9C,0x91,0xEB,0xFC,0x94,0xA1,0x98,0x20,0x6B,0xF2, + + 0x94,0xB9,0x3A,0x00,0x32,0xC7,0x84,0x33,0xF2,0x58,0xAB,0x89,0x32,0x60,0x31,0x62, + + 0x25,0x9E,0x36,0x77,0x1D,0xCE,0x8C,0x76,0x23,0x81,0x71,0x27,0xA7,0x7B,0x5F,0xC8, + + 0x83,0x78,0xDD,0xB7,0x03,0x5A,0x34,0xB3,0x9A,0x59,0x01,0x5C,0x99,0x10,0x5D,0xA8, + + 0xCA,0x0C,0xF2,0xAC,0x35,0x4C,0x24,0x74,0x5E,0xC2,0x70,0x6F,0x70,0x35,0xA2,0x01, + + 0xAE,0xB2,0xA7,0xC4,0xB3,0xA4,0x27,0xE0,0xB6,0xDB,0xEF,0x62,0x09,0x4B,0x3F,0xD0, + + 0xAF,0xB3,0x6B,0xB7,0x44,0x52,0x07,0xFC,0x40,0x32,0x7A,0x59,0xAF,0x73,0x54,0xF0, + + 0xC3,0x7C,0xFE,0x0E,0x9A,0xAC,0x1E,0xAC,0x40,0x7E,0x14,0x28,0x09,0xF3,0x6E,0x3B, + + 0x7E,0x16,0x75,0xBB,0x98,0xC6,0x5F,0xCB,0x5D,0x53,0xB0,0xCD,0x1A,0x59,0x3D,0x0E, + + 0xEB,0xEA,0x47,0xF5,0xE7,0x37,0x29,0x85,0x65,0xDC,0xE5,0xC8,0xE0,0x7C,0x6F,0xCA, + + 0x15,0x90,0xB1,0xA5,0xBF,0x42,0xDB,0x48,0x4A,0x6B,0xE7,0x82,0xCD,0x3A,0x57,0xB0, + + 0x62,0x0D,0xFE,0x33,0xD3,0x2D,0x0C,0x42,0xC9,0x75,0xBA,0x9F,0x08,0xAD,0x5E,0x98, + + 0xDF,0x90,0xB5,0xFB,0x9A,0x51,0x66,0x17,0x10,0x49,0xE3,0x3B,0xA5,0x75,0x79,0xE1, + + 0x27,0x98,0x07,0xA0,0x76,0x33,0x8B,0x6B,0x23,0x2B,0x17,0x95,0x44,0x81,0x31,0xA5, + + 0x29,0xB3,0x28,0xA7,0x6D,0x35,0x04,0x5B,0x94,0x53,0x5F,0xE3,0xCD,0xD2,0xE0,0x6F, + + 0xF8,0xC2,0xBB,0x95,0xF6,0x50,0xBD,0x50,0xFB,0x82,0x83,0x66,0x1C,0x6B,0x5C,0xD2, + + 0x03,0xF8,0x96,0x3B,0x7D,0xAC,0xDB,0x4D,0xE6,0x83,0xE2,0x02,0xF6,0xE7,0x3A,0x76, + + 0x45,0x84,0x49,0x75,0x7F,0xD3,0x73,0xEF,0xC2,0xBB,0x20,0xC5,0x54,0x82,0x90,0x6C, + + 0x26,0x28,0xD7,0x2F,0x17,0x56,0xA4,0xAD,0x64,0x3C,0x97,0x19,0x74,0x3C,0x58,0x22, + + 0x7A,0x29,0xA1,0x81,0xEB,0x22,0x48,0xF2,0xBD,0x3F,0xCA,0x99,0xAB,0x88,0x7D,0x43, + + 0x36,0x28,0xE0,0x06,0x11,0xDC,0x66,0x83,0xA6,0x6A,0xAB,0x4B,0x51,0x7C,0x74,0x33, + + 0x7B,0x8F,0x18,0x39,0x54,0xA6,0x58,0x9F,0x20,0x84,0x12,0xA7,0xE2,0x4B,0x70,0x94, + + 0x45,0xA7,0x9A,0x35,0x60,0xC2,0x68,0xF7,0xB6,0xC5,0x0C,0x8C,0x6E,0x8B,0x5A,0x03, + + 0xF9,0xCA,0x88,0x8A,0x21,0x5B,0x52,0x79,0xF8,0xC5,0x0D,0x69,0x8A,0xE0,0xB4,0x98, + + 0xA7,0xA3,0xCA,0x21,0x9C,0xEB,0x72,0x3E,0x65,0xC4,0x82,0xC1,0xDF,0x45,0xBE,0x34, + + 0x8A,0x13,0x9B,0xF1,0x30,0xA7,0xC8,0x54,0x41,0x1C,0x26,0xAB,0xAD,0x6A,0xEB,0x76, + + 0x38,0xC9,0x36,0xA7,0x9B,0x32,0x05,0x17,0x42,0x4D,0x88,0x5D,0x2A,0x16,0x6A,0xC2, + + 0x6D,0x95,0xDA,0x09,0xDC,0x25,0x48,0x88,0xB2,0xDD,0x95,0x2E,0x40,0x11,0x6B,0x38, + + 0xF0,0x06,0xBC,0xDA,0x6E,0xAF,0x6F,0x09,0x77,0x4A,0x2E,0x84,0xB6,0x7E,0x75,0x33, + + 0x88,0x17,0x58,0xDD,0x9E,0xA4,0xB3,0x07,0x7F,0x3A,0xE1,0x6E,0x25,0x63,0x72,0x6A, + + 0xBF,0xCD,0xB1,0x5E,0x3C,0x0F,0x86,0x7F,0x4F,0xFF,0xEC,0x8C,0x5B,0x42,0x64,0x60, + + 0xCD,0x49,0x6C,0x02,0x45,0x13,0x06,0x92,0xFF,0x7F,0x6B,0xD9,0x50,0x5B,0xEC,0xEA, + + 0x46,0x16,0x68,0x69,0xB7,0xB6,0x42,0xB5,0x84,0xB7,0x43,0x34,0xB0,0x72,0x3F,0x82, + + 0x85,0x22,0x09,0x02,0x43,0x4F,0x95,0xD1,0x86,0x4B,0x7A,0xA6,0x9F,0x6B,0xB2,0x86, + + 0xA3,0xEA,0x0C,0x13,0xC4,0x49,0x43,0x8B,0x65,0x53,0xE7,0x66,0x56,0x7E,0x7A,0xA0, + + 0x07,0xD4,0x60,0xD5,0x06,0x2D,0xAF,0xDD,0x60,0xBD,0x25,0x17,0xD5,0x94,0xB3,0xB0, + + 0x07,0x78,0x6D,0xC5,0x07,0x2C,0xA3,0x70,0x10,0x32,0x6C,0xE8,0x43,0x01,0x79,0x3F, + + 0x24,0x92,0xDB,0xAF,0x54,0x96,0x48,0x67,0x97,0xFC,0xC7,0xD6,0x8C,0x09,0xED,0xB2, + + 0xD0,0x91,0xCD,0xC6,0xB1,0x2E,0xBD,0x82,0x8C,0x6C,0x68,0xED,0x87,0x43,0xC5,0xF8, + + 0x8F,0x9C,0x1D,0x0A,0x4D,0x1E,0x24,0x59,0x87,0x49,0xD6,0xFD,0x15,0xF7,0x2A,0x92, + + 0x2B,0x00,0xCE,0xCD,0x81,0x32,0xA3,0x94,0x0D,0xFE,0x13,0xDC,0x82,0xFF,0xF5,0xF8, + + 0xD9,0x1D,0xBD,0x93,0x9F,0xBD,0x0D,0x58,0xD0,0x98,0xC9,0xC7,0x7E,0x16,0x75,0x29, + + 0xD0,0xDB,0xE8,0x7D,0x3F,0x67,0x41,0xBD,0x04,0xBF,0x96,0x09,0x5C,0x95,0xC8,0xA9, + + 0x8F,0x63,0xA6,0xBC,0x9D,0x1C,0x16,0x12,0x80,0x27,0xE1,0xE1,0x0A,0xFA,0x82,0x45, + + 0x2E,0x3D,0x8C,0xD2,0x3C,0xFD,0x67,0xFA,0x69,0xA4,0x88,0xFE,0x7F,0xFD,0x07,0x81, + + 0x48,0x93,0xF6,0xBC,0x8E,0xD2,0x5E,0x17,0x08,0x9C,0xD9,0x4F,0xF8,0x5E,0xD0,0xBB, + + 0xAB,0xB6,0xE3,0xE4,0x9B,0x83,0x0C,0x85,0x4C,0xBA,0xFF,0x8D,0x14,0x0E,0x3E,0x3C, + + 0x42,0xFF,0xA0,0xC4,0x1D,0x62,0x87,0xA4,0x7D,0xBD,0xEE,0x19,0xBB,0xB1,0x00,0x14, + + 0xA9,0x8A,0xFA,0xE4,0xF3,0xD7,0x67,0x77,0xBC,0xF7,0x57,0xBE,0xB0,0x9E,0x3F,0x3C, + + 0x0D,0xF4,0x1C,0x54,0x96,0xBB,0x29,0xDB,0x6C,0x4F,0x4C,0x6F,0x2B,0x20,0x2F,0x3C, + + 0x05,0xA7,0x76,0x67,0x47,0x27,0xA2,0xAB,0xC0,0xE3,0x62,0xCE,0x22,0x21,0x80,0x38, + + 0x7E,0xD9,0xA0,0x0E,0xB4,0x29,0xE9,0x90,0x1F,0xE5,0xD0,0x64,0x52,0x64,0xE4,0x23, + + 0x25,0xA3,0x77,0x93,0xD1,0x25,0x0A,0xD3,0xA8,0x21,0xD8,0x74,0x53,0x65,0x39,0x66, + + 0x7F,0x09,0x3A,0x38,0xB3,0xE6,0xC4,0x92,0x46,0xCB,0xD1,0x65,0xD2,0x66,0x9D,0x96, + + 0x41,0x27,0x81,0x59,0x66,0xA0,0xE6,0x93,0xC5,0x3E,0xD9,0x75,0xD3,0x67,0x93,0x0F, + + 0xE1,0xF9,0x91,0xCB,0xF1,0xAB,0x4C,0x99,0x40,0x4C,0x89,0x7F,0xD5,0x2A,0x11,0xA4, + + 0x0F,0x70,0xD4,0xFE,0x1D,0x84,0xA9,0x98,0xB5,0x6A,0xB6,0xF9,0xB8,0xC6,0xC3,0x64, + + 0x9D,0x48,0x99,0x0F,0x5A,0x2E,0x97,0xD8,0xA2,0xB5,0x95,0x34,0xFB,0x2A,0x97,0x6A, + + 0xB5,0xFA,0x1C,0x9F,0x3F,0x39,0x40,0x39,0xB2,0xC9,0x4F,0xCE,0xA1,0xC6,0x4A,0x61, + + 0xE3,0x6F,0xC6,0x45,0xE7,0x42,0x49,0xEC,0x3B,0x37,0xD2,0x6C,0x5A,0x6C,0x2C,0xFC, + + 0x08,0xFF,0x15,0xA7,0x3F,0xA0,0x41,0x72,0x03,0x3C,0xDA,0x7C,0x5B,0x6D,0x41,0xB6, + + 0x77,0x62,0xA1,0x4C,0x9B,0x4E,0x93,0x04,0xC9,0x0C,0xD3,0x6D,0xDA,0x6E,0x8B,0x21, + + 0x98,0xA2,0xB5,0x70,0x72,0x5E,0x7B,0x2A,0xEF,0xC2,0xDB,0x7D,0xDB,0x6F,0x1F,0x18, + + 0x26,0xCA,0x8A,0xFA,0x93,0x55,0x72,0x01,0x89,0x13,0xC2,0x99,0x9B,0x81,0xD8,0x14, + + 0x50,0x79,0x3B,0x35,0xC1,0x72,0xAB,0x15,0x12,0x51,0x0F,0xC6,0x0E,0xF8,0x40,0x9F, + + 0x86,0xE6,0x3A,0x67,0x44,0x31,0x73,0x01,0x14,0x11,0xAE,0x14,0x84,0xDD,0xCD,0xFC, + + 0x8C,0xBE,0xBA,0x30,0xB7,0x19,0x55,0xBD,0x9A,0xDA,0x66,0x9A,0xDB,0x26,0x70,0x5F, + + 0x24,0x8D,0x3B,0xB6,0x1C,0xEB,0x48,0x92,0x99,0xAF,0xD4,0xE4,0x72,0x74,0xB3,0xF7, + + 0x82,0x57,0x6C,0x24,0x8F,0xE6,0x97,0xA0,0x9E,0x5C,0xDC,0xF4,0x73,0x75,0x0C,0xE6, + + 0x0E,0x1B,0x9F,0x30,0xCE,0x99,0x0F,0x1D,0x5E,0x14,0xD5,0xE5,0xF2,0x76,0x56,0x19, + + 0x7E,0x18,0xB3,0xD2,0x12,0xC8,0x58,0xE0,0xDF,0xFA,0xDD,0xF5,0xF3,0x77,0x93,0xB5, + + 0xC3,0x5C,0x4C,0x92,0x0A,0xCC,0xD6,0xC5,0xFD,0xF3,0xC6,0x87,0x04,0x6D,0xAA,0xFA, + + 0xDA,0x7C,0x95,0xA4,0xD0,0x2A,0x41,0xB4,0x6F,0x20,0x5E,0xC4,0xB0,0x3B,0x39,0xA5, + + 0xDE,0xB5,0xD2,0xFE,0xC4,0x78,0xC1,0xA8,0x68,0x4A,0x04,0x29,0xF4,0x75,0x37,0x62, + + 0x61,0x6A,0xF7,0xBA,0x50,0x08,0xB6,0x48,0x87,0x1B,0x9D,0x50,0x25,0x38,0xF2,0xB7, + + 0x89,0x5D,0x98,0x2E,0x3E,0x91,0xC3,0xAF,0xA8,0x3C,0xD6,0xEC,0x7A,0x7C,0x55,0x35, + + 0xA9,0x1A,0xF4,0x3E,0x97,0xC0,0xF2,0x6A,0x67,0x55,0xDE,0xFC,0x7B,0x7D,0x27,0xF6, + + 0x2B,0x5C,0x52,0x49,0x87,0x94,0x5F,0x22,0x03,0x2F,0xD7,0xED,0xFA,0x7E,0x6E,0x5D, + + 0xDA,0x0B,0xB7,0xCC,0x87,0x3B,0xDB,0x04,0x54,0x1E,0xDF,0xFD,0xFB,0x7F,0x5E,0x04, + + 0xED,0xD1,0xE8,0x1A,0x12,0x00,0xF0,0x26,0xD9,0xAE,0xA7,0x61,0x9E,0x71,0xE3,0x9B, + + 0xD1,0x82,0x90,0x26,0xF7,0x5E,0xE8,0xAC,0x46,0x01,0x86,0x0F,0x53,0x78,0xE1,0x7B, + + 0xA8,0xC0,0x5E,0x65,0x63,0xC7,0x0F,0x86,0x1A,0x6F,0xB9,0x23,0x5D,0xAA,0x8E,0xB2, + + 0x4D,0x32,0x93,0xAB,0x15,0x13,0x07,0x92,0x8C,0xC0,0xAA,0x55,0x22,0x86,0xB0,0xC6, + + 0x77,0xAD,0x4C,0xD5,0x66,0xAE,0x0E,0x5A,0xBB,0x45,0xF0,0x66,0x56,0xE4,0x17,0xD6, + + 0x76,0x9F,0x7D,0xA5,0x93,0x28,0xEB,0x72,0xAC,0x74,0xF8,0x76,0x57,0xE5,0x59,0xB9, + + 0x2A,0x8B,0xB2,0xB7,0xF9,0x07,0x75,0x9C,0x3B,0x6D,0xF1,0x67,0xD6,0xE6,0x37,0xB1, + + 0x83,0x7A,0xBB,0x78,0x7C,0xC3,0x43,0x80,0xFB,0x4A,0xF9,0x77,0xD7,0xE7,0x82,0x19, + + 0x7C,0xEC,0x62,0x1F,0xE3,0xEA,0x6A,0x27,0x4A,0xB1,0x8A,0xD1,0xBD,0x77,0xF5,0x9E, + + 0x7C,0x5A,0x4D,0xE1,0x7E,0x89,0x60,0xF6,0xEE,0xCD,0xC4,0x9F,0xB4,0xEA,0x1D,0x36, + + 0x8A,0xF3,0xB8,0xBD,0xFF,0xB3,0x3D,0x59,0x6F,0xAF,0xCC,0x5C,0xF6,0x1B,0xEB,0x76, + + 0xA0,0xC9,0x48,0xE1,0x9B,0xD2,0x6D,0xFC,0x24,0xA8,0x68,0xCC,0xFF,0x56,0xA2,0x5B, + + 0xF1,0x11,0xDA,0xB1,0xF7,0xDD,0x64,0x56,0xB1,0x61,0xF2,0x6E,0x5E,0xEC,0xED,0x58, + + 0x90,0x29,0x92,0x79,0xE2,0xA2,0xA7,0x7E,0x34,0x46,0xFA,0x7E,0x5F,0xED,0x1B,0x6C, + + 0x77,0x81,0x23,0x22,0xEB,0x23,0x64,0xDB,0x4E,0x11,0xF3,0x6F,0xDE,0xEE,0xBB,0xFE, + + 0xC7,0x3E,0xD5,0x67,0xF7,0xDE,0x20,0x54,0xC9,0xEF,0xFB,0x7F,0xDF,0xEF,0x84,0x91, + + 0x10,0xF4,0xDC,0x02,0x45,0x1C,0x03,0x17,0x98,0x13,0x8A,0x02,0xFB,0x76,0x4D,0x16, + + 0x54,0xA4,0x28,0xF1,0xB7,0x1D,0xA1,0xE3,0x84,0xDE,0x6C,0x26,0x8A,0xF5,0x1B,0xBE, + + 0xA2,0xEB,0x9F,0x7D,0x4F,0xF0,0xF5,0xC6,0x9B,0x90,0xB5,0xE7,0xB0,0x5F,0x25,0x82, + + 0xCE,0x10,0xFD,0x13,0xFD,0x05,0x89,0xCC,0x46,0x5E,0x3D,0x88,0xD3,0x07,0x3A,0xEF, + + 0x2E,0x92,0x93,0xF9,0x46,0xF5,0x14,0xCD,0x01,0xD9,0xF4,0xE6,0x76,0xF4,0x52,0xFF, + + 0xAA,0x63,0x53,0x44,0xD5,0x68,0x0E,0x0D,0x6B,0x2E,0xFC,0xF6,0x77,0xF5,0x4B,0xEC, + + 0x07,0x69,0x25,0x1B,0xAC,0xD8,0x0B,0xDB,0x0F,0x47,0xF5,0xE7,0xF6,0xF6,0x25,0x73, + + 0xA1,0xEE,0x8F,0xD7,0xB6,0xA7,0x82,0xD7,0x0E,0x46,0xFD,0xF7,0xF7,0xF7,0x22,0x88, + + 0x20,0x33,0xA0,0xB3,0xB4,0xB8,0x48,0x1F,0xE1,0x75,0x66,0xDD,0x04,0xBA,0x6D,0x89, + + 0x55,0xDD,0x3B,0x85,0x4D,0x34,0x1E,0xFA,0x2B,0x74,0x0A,0xDC,0x82,0xBB,0x75,0x74, + + 0xAA,0x03,0x37,0x91,0x88,0x4E,0x61,0xDB,0x6C,0x5C,0x2A,0xFA,0x5D,0x25,0x09,0xA3, + + 0x21,0x36,0xD1,0x3E,0x56,0xB8,0x6D,0xCB,0x6D,0x5D,0xA4,0x77,0x14,0xB8,0x7D,0xA8, + + 0xD9,0xF9,0xBC,0xA6,0xE0,0x43,0x6E,0xFE,0xEC,0xA9,0xF6,0xEE,0x7E,0xFC,0x26,0xB8, + + 0xDC,0xF8,0x7E,0xDE,0x3F,0xBD,0xA1,0x01,0x4B,0xDB,0xFE,0xFE,0x7F,0xFD,0x5F,0x34, + + 0xA8,0xE7,0xBD,0xCE,0x68,0x61,0x2D,0x89,0xCD,0xBE,0xF7,0xEF,0xFE,0xFE,0x57,0x20, + + 0xA9,0x2E,0xEF,0xDF,0xBF,0xBF,0xCA,0x0A,0x4E,0x20,0xFF,0xFF,0xFF,0xFF,0xA3,0x2C, + + 0xDC,0x71,0x7F,0xF4,0xEF,0x2F,0x8D,0xB6,0xE1,0x9F,0x34,0x46,0xAB,0x05,0xAF,0x16, + + 0xD5,0x65,0xB6,0xB4,0xF3,0xA8,0x0F,0x36,0x89,0xD0,0xB7,0xD6,0xFD,0xDC,0x22,0x39, + + 0x58,0xB3,0x35,0xE7,0xD8,0x21,0xA5,0x43,0x3F,0xE6,0xA9,0xA7,0x15,0x19,0x31,0xEF, + + 0x2D,0x0E,0xB4,0x91,0xAC,0x45,0xBD,0xB5,0xF4,0xBD,0xE1,0x46,0xE3,0x92,0x20,0x16, + + 0xCA,0xF8,0x5D,0x57,0x71,0x04,0xFA,0x93,0xC6,0xC9,0xA8,0x60,0x56,0xC4,0x76,0x6C, + + 0x8E,0x83,0xB0,0xA9,0xAC,0x64,0x27,0xF2,0x86,0x71,0xE0,0x44,0xB0,0xCA,0x39,0x66, + + 0x7F,0x09,0xB9,0x62,0xF1,0xA9,0x07,0xD4,0xC4,0x3F,0x2E,0x16,0xE6,0xC7,0xCD,0x11, + + 0xDD,0xAA,0x09,0x21,0xD0,0xAA,0xF6,0x93,0x6F,0xBA,0x79,0x07,0xB1,0xCB,0xFD,0x13, + + 0x8C,0x9C,0xBA,0xF7,0xB4,0x25,0x72,0x07,0x1C,0x0A,0xEC,0x2A,0xB1,0x8B,0x6A,0x37, + + 0x0B,0xD4,0xF2,0x3B,0xE0,0x26,0x4C,0xC6,0x4F,0x30,0x30,0xC5,0x84,0x66,0xA7,0x8D, + + 0xBD,0xF4,0x43,0x75,0x1F,0x96,0x8E,0xBF,0xCE,0xD3,0x53,0x40,0x2B,0x6C,0x73,0x3E, + + 0x74,0x04,0x2C,0x20,0x70,0xDA,0xFF,0x47,0x6A,0x2E,0x2F,0x42,0x7A,0xCF,0xD5,0xDA, + + 0x0E,0x04,0xA2,0x1F,0xE2,0x23,0x2A,0x57,0x78,0x99,0xAC,0x6B,0x7E,0x6A,0xB1,0xDC, + + 0x36,0xF7,0xCE,0xD8,0x59,0x77,0x7C,0xC0,0x79,0xE9,0x84,0x9E,0x5F,0x2D,0x06,0x3A, + + 0xF6,0x8F,0x03,0x35,0x87,0x55,0x85,0x7A,0xF4,0xAD,0x66,0xED,0x33,0xBF,0x75,0xE1, + + 0xF7,0xA0,0x0B,0x30,0x53,0xF2,0x0E,0xD4,0x03,0x1C,0xDD,0x82,0xB8,0xC7,0xDA,0xE2, + + 0xD3,0x75,0xD6,0xC3,0xD9,0xB3,0x4A,0x18,0x52,0xFB,0xEA,0x26,0xB5,0x54,0xA1,0xF2, + + 0xD6,0x74,0xEE,0x94,0x32,0xD1,0x8F,0x23,0x47,0xAE,0xE4,0xC7,0x0D,0x1D,0x3D,0x7A, + + 0xA6,0x8B,0xE7,0x3D,0x59,0x51,0x86,0xA0,0x6D,0xFF,0x3A,0x47,0x5C,0x8F,0x35,0x6E, + + 0xA7,0xFA,0xB7,0x66,0x9F,0x9C,0x23,0x8D,0x89,0x10,0xFF,0xB1,0xF0,0x41,0xE4,0xB2, + + 0x40,0xD8,0xBC,0xC0,0x36,0x94,0x34,0xB6,0xF6,0x59,0xC6,0x42,0x99,0x30,0x2C,0x86, + + 0xB7,0x18,0x3C,0x5C,0x58,0x3A,0x79,0x92,0xA1,0x55,0x78,0xD0,0x75,0x35,0x85,0xB9, + + 0xC2,0x78,0x3A,0xB6,0xCE,0x30,0x37,0x77,0x60,0x9A,0xEF,0x55,0x3B,0xD9,0xAA,0x53, + + 0x66,0x23,0x4D,0xD1,0xFB,0xC8,0x55,0xF9,0x80,0xA8,0x70,0xAF,0x06,0xEB,0x1C,0x79, + + 0x8B,0x58,0xD4,0x8E,0x7E,0x54,0x68,0x09,0x81,0x1B,0xA8,0x91,0x18,0xA7,0xED,0x1C, + + 0x61,0xE6,0xB0,0x39,0xFB,0x39,0xCA,0x42,0x80,0x88,0x4C,0x81,0x92,0x3D,0x39,0xB4, + + 0x2A,0x8F,0xB9,0x3D,0x7A,0x60,0x05,0xA8,0x13,0xD7,0x57,0xC0,0xA7,0xD7,0xCF,0xE1, + + 0xC3,0xC4,0x87,0x90,0x50,0xB8,0xB3,0x22,0x18,0xD2,0xA1,0x0C,0xFF,0x02,0x7E,0x56, + + 0x2B,0xBC,0xF8,0xE1,0x51,0x33,0x08,0x0A,0x5F,0x1E,0xF9,0x93,0xA3,0xD1,0x36,0xC9, + + 0x09,0xB0,0x4E,0xCD,0xC4,0x90,0x7B,0x9A,0x9C,0x38,0xE0,0x5D,0x75,0xCC,0xFC,0x2B, + + 0x06,0xE3,0x47,0x4F,0x18,0x2A,0xD3,0x81,0x68,0x92,0x87,0xAA,0xF4,0xA1,0x1F,0x6B, + + 0xE7,0x21,0x58,0xED,0x44,0xC0,0x67,0x06,0xCF,0x52,0x20,0x87,0x8D,0xA0,0x40,0x2D, + + 0x06,0x8D,0x4C,0x95,0x3E,0xA8,0x8F,0xC0,0x0C,0x11,0x62,0x20,0x9C,0x43,0x1B,0x30, + + 0xD8,0x8E,0xB3,0x59,0x13,0xD8,0x22,0x72,0xCE,0x6A,0x80,0xC9,0xF9,0xEC,0xDE,0x24, + + 0x25,0x84,0x21,0x46,0xEF,0xE0,0x0F,0x1F,0x49,0x44,0x15,0xA3,0xE9,0x59,0x9D,0x6C, + + 0x26,0x38,0x4B,0x75,0x62,0xC6,0xEF,0x0D,0xAE,0xD0,0xD9,0x61,0xAA,0x1F,0xC0,0x31, + + 0x38,0xC6,0x98,0x61,0xEB,0xAB,0x23,0x71,0x2C,0xF7,0xE6,0x4A,0xBD,0xA0,0xCE,0x0D, + + 0xA4,0xE0,0x13,0x71,0xB6,0xCB,0x2E,0x6D,0x21,0x65,0x5C,0x52,0x3C,0xEA,0xFC,0xB9, + + 0x04,0x4A,0x21,0x2A,0x5E,0xAB,0x57,0xD7,0xF0,0x12,0xCB,0xD7,0x1F,0x49,0xD6,0xB1, + + 0xE4,0x78,0x8B,0x6F,0x62,0x21,0xEA,0x00,0xB3,0xAB,0x7E,0x04,0xA7,0x62,0x38,0xF7, + + 0x6D,0xCA,0x9A,0xF1,0x1A,0xD1,0x62,0xDB,0x26,0x5D,0xCA,0x09,0xA1,0xE7,0xAC,0xE9, + + 0x2B,0x22,0x92,0xE5,0x1B,0x40,0x6F,0x9D,0x26,0x9A,0x3A,0x7E,0x09,0xAB,0xEC,0x05, + + 0x71,0x0B,0x7D,0x6D,0x6F,0xCF,0x6D,0x9F,0x6C,0x61,0x8D,0x13,0x51,0x6C,0xBC,0x1A, + + 0x8B,0xF2,0xB1,0x01,0xB3,0x5F,0x0A,0xCA,0xF3,0x6C,0x26,0xF2,0xDB,0x92,0x02,0x1C, + + 0x96,0x83,0xE6,0x0E,0x5A,0xAA,0x10,0x1A,0x4D,0x8C,0xE4,0x43,0xB5,0xA8,0x3A,0x29, + + 0x2D,0x2C,0x92,0xA3,0xE2,0xEC,0x8A,0x18,0xC0,0x4B,0x5E,0x0D,0xDB,0xAC,0xD7,0xA9, + + 0x6F,0x21,0xCD,0x74,0xFD,0x8E,0x77,0x3D,0x4C,0xD2,0xC9,0xDE,0x7D,0x41,0x53,0x6B, + + 0xB0,0x20,0x14,0x2C,0xEF,0x04,0x7A,0x3B,0x81,0xA1,0xC5,0x57,0xB7,0xE2,0x7A,0x60, + + 0x20,0x3D,0xB2,0xE4,0xDF,0x33,0x14,0x48,0x07,0xD4,0xCF,0x24,0xB1,0x94,0xEC,0x83, + + 0xDA,0x4C,0x78,0x6A,0xF0,0x4A,0x38,0xC1,0x4F,0xBF,0xC4,0xC5,0x01,0x9D,0xB2,0x01, + + 0x54,0x97,0x9B,0x22,0x9A,0x1D,0x54,0x63,0xE0,0x29,0x1A,0x45,0x58,0x0F,0x55,0xB4, + + 0x58,0x9C,0x70,0x7A,0xE1,0x08,0x5F,0xC3,0xE4,0xB3,0xDF,0xB3,0xF4,0xE1,0x04,0x94, + + 0xB2,0x99,0xDE,0x76,0xC9,0x6B,0x0F,0xC5,0xC7,0x6B,0xC7,0x46,0x8E,0xD7,0xC6,0xD9, + + 0x86,0x36,0x57,0x73,0xC0,0xF4,0xDB,0xDE,0x61,0x1C,0x2E,0xD2,0x34,0x05,0x73,0x73, + + 0x59,0x90,0x5A,0xF6,0x17,0x49,0xB5,0x96,0x87,0x97,0x35,0xE3,0x2D,0x02,0xB9,0x2D, + + 0xA1,0x0E,0xD3,0xFA,0xDC,0xB8,0x9A,0x71,0x2E,0xA2,0x02,0x84,0xCB,0x5C,0x20,0xB7, + + 0xC5,0x69,0x59,0x0A,0x63,0xAE,0x68,0x0B,0x41,0x55,0x88,0x93,0xBE,0x98,0x00,0x6B, + + 0x59,0xB9,0x7C,0xA3,0xD6,0xFD,0xD6,0x4B,0xCE,0x99,0xAC,0x45,0x7B,0x80,0x8B,0x19, + + 0xCD,0x92,0x67,0xE2,0xA3,0x17,0x49,0x0B,0xEA,0x43,0xBF,0x2B,0x15,0x0B,0xEF,0xE3, + + 0x30,0xD9,0x91,0x2E,0xCB,0x14,0x01,0x1B,0xEB,0x7B,0x70,0x3B,0xC0,0x54,0x8E,0x4E, + + 0x13,0x27,0x66,0x4C,0xC2,0xB0,0xC9,0x08,0x8D,0xD5,0x8E,0xEA,0x7A,0x5C,0x16,0xCB, + + 0x53,0xBC,0xF9,0xD8,0xF7,0x2C,0x83,0x9A,0x2F,0x20,0x80,0xF8,0x96,0xCE,0xDC,0x29, + + 0x02,0x63,0x67,0xDE,0x41,0x1A,0xF6,0x89,0x11,0x57,0x08,0x9C,0xC8,0x0F,0xAC,0xA8, + + 0x9D,0x1E,0x4B,0xAC,0xC3,0x14,0x0D,0x00,0xB7,0x9D,0x2C,0x0C,0x73,0xF2,0xFF,0x27, + + 0xA1,0x41,0xF1,0xF0,0x53,0x63,0x3E,0x1E,0x9D,0x4F,0xDA,0x75,0x63,0x30,0x76,0x16, + + 0xE0,0x82,0x71,0x9E,0x76,0x4B,0x20,0xCF,0xED,0x4C,0x52,0xE4,0x18,0x09,0x5B,0x69, + + 0xE8,0x53,0x06,0x95,0x98,0xDD,0xA5,0x5E,0x63,0x03,0x6E,0xDA,0x2B,0x77,0x27,0xE2, + + 0x0D,0x42,0x9D,0x15,0xCD,0x63,0x79,0x62,0x63,0xBF,0x1D,0xCA,0x2E,0x3C,0x87,0xFD, + + 0x3B,0xB3,0xCB,0x56,0xE2,0x29,0x40,0x75,0x42,0x62,0x2C,0x9B,0x94,0x91,0xD7,0x15, + + 0x03,0x74,0x72,0x27,0x0D,0xB7,0xCD,0xBC,0xAB,0x6A,0xFB,0x85,0xD5,0x62,0xFA,0xBE, + + 0x2F,0xC1,0x3E,0xAE,0x67,0x7B,0x1C,0x49,0x8E,0x46,0xFE,0x92,0x05,0xE1,0x10,0x7A, + + 0x62,0xCA,0x50,0x42,0x3D,0x5B,0xA6,0xA3,0x51,0xAD,0x83,0xA1,0xE1,0x35,0x58,0x06, + + 0x60,0x19,0x56,0xA9,0xC9,0x64,0x6A,0x0F,0xB5,0x47,0xA3,0xFC,0x19,0xC0,0x24,0xEB, + + 0x85,0x48,0x0D,0xB9,0x3F,0x94,0x62,0x29,0x75,0xE4,0xD6,0x19,0x1C,0x32,0x7D,0x0F, + + 0x69,0x89,0x57,0xB5,0x49,0xBA,0x83,0xCB,0x64,0xB7,0xD9,0x39,0x27,0x8F,0x35,0x20, + + 0xF5,0xA4,0xA1,0xB8,0xED,0xB5,0x8E,0x1D,0x22,0x2F,0x30,0xC2,0xD9,0x94,0x6E,0xA5, + + 0x17,0x6E,0xFB,0xA2,0xB3,0x40,0x41,0x68,0x4A,0xCE,0xD6,0x6C,0x12,0x1C,0x25,0xA7, + + 0x53,0xDF,0xCA,0x5C,0x57,0xDD,0x07,0x7E,0xCD,0x88,0x48,0x45,0x75,0x3E,0x06,0xE4, + + 0xB5,0x2B,0x65,0x39,0xD7,0x5C,0x42,0x29,0x95,0x45,0x93,0xFC,0xC4,0x6F,0x59,0x75, + + 0xBD,0xA7,0x8E,0x6D,0xB1,0x17,0x73,0xBA,0x2E,0x50,0xD7,0x34,0xD0,0x35,0xB0,0xE2, + + 0xDB,0xBD,0xD6,0xD8,0x91,0x51,0x6A,0xA7,0x81,0x36,0x9E,0x32,0xB7,0x8F,0x36,0x35, + + 0x05,0x17,0xA7,0x11,0x43,0xED,0x9C,0xA1,0x52,0xF5,0x1F,0xB4,0x6D,0x62,0x92,0xB1, + + 0xA8,0xED,0x86,0x80,0x9C,0xA1,0x85,0x23,0x29,0x51,0xBC,0x83,0x81,0x23,0xA6,0xA4, + + 0x00,0x91,0x59,0x90,0xF1,0xA4,0x88,0xB7,0x29,0x02,0x00,0x0F,0x48,0x73,0x32,0x82, + + 0xF3,0xDA,0x5E,0x01,0x42,0xC6,0xB6,0xBB,0x8D,0x08,0xD4,0xE4,0x72,0x74,0x63,0x7B, + + 0x40,0xCF,0x93,0x4B,0xBE,0x78,0x2C,0x0F,0xEC,0x43,0xDC,0xF4,0x73,0x75,0x7F,0xBE, + + 0x5D,0xE9,0xC0,0xC5,0xD0,0x8C,0x76,0xB8,0x98,0xFD,0xD5,0xE5,0xF2,0x76,0x58,0x44, + + 0xA3,0xD7,0x32,0xAB,0x6A,0x70,0x0F,0xF0,0xF5,0x6C,0xDD,0xF5,0xF3,0x77,0xF9,0x0A, + + 0xE1,0x6D,0xA9,0x09,0x4A,0xA4,0xB2,0x8C,0xA0,0x4B,0x17,0x24,0x1C,0x82,0x28,0xB5, + + 0xAD,0xBD,0xA5,0xC6,0x17,0xAA,0x8E,0xB8,0xFB,0x92,0x7A,0x82,0xF2,0xB4,0x3F,0x19, + + 0x53,0x5B,0xBF,0xA8,0xB4,0xBA,0xB7,0xBA,0x86,0x3E,0xCF,0x44,0x7C,0x6E,0x9E,0x9E, + + 0x8D,0xB6,0xA4,0x38,0x95,0xAB,0x01,0xFC,0xCF,0x59,0xE6,0x42,0xE5,0x1B,0x57,0x9D, + + 0xFA,0x29,0xA2,0xB1,0x3D,0xDF,0xB9,0xCB,0x7F,0x6E,0xD6,0xEC,0x7A,0x7C,0xA5,0x1A, + + 0x9D,0x38,0x23,0x67,0xE1,0xE9,0x16,0x7D,0x2E,0x26,0xDE,0xFC,0x7B,0x7D,0xAA,0x2B, + + 0x15,0x63,0xC7,0x37,0x5D,0x23,0x1A,0x8F,0x65,0xE8,0xD7,0xED,0xFA,0x7E,0xEA,0xA8, + + 0xBE,0x0C,0xD0,0xBD,0xAE,0x9C,0xF3,0x37,0x73,0x9C,0xDF,0xFD,0xFB,0x7F,0x80,0x71, + + 0x74,0x53,0xA3,0x02,0x57,0xC8,0x0A,0xA5,0xBB,0x6B,0x09,0xD7,0x15,0x49,0x9C,0x70, + + 0xFA,0xC0,0xC3,0x1B,0x49,0xE3,0xA8,0x50,0xF2,0xA4,0x47,0x25,0xB6,0x30,0x5F,0x04, + + 0x25,0x5D,0xF5,0xDD,0x3A,0xE1,0x49,0x33,0x2D,0xB3,0x68,0x79,0x2B,0xE2,0x49,0xB5, + + 0x24,0x28,0xBD,0x58,0x37,0xE1,0x01,0xDC,0x48,0x7E,0x94,0x21,0xBC,0xA0,0x2F,0xC9, + + 0xBA,0x43,0x2E,0xA2,0xC2,0x01,0x8F,0x62,0x42,0x74,0xEA,0x66,0x4A,0x74,0x97,0xD7, + + 0x7D,0x4C,0xC3,0x65,0x83,0x1C,0x8C,0xA0,0xA6,0xBA,0x3A,0xFA,0x09,0x44,0x4E,0x8C, + + 0x63,0xB9,0x16,0x8C,0x6B,0x59,0xE3,0x2B,0x95,0x22,0x72,0x7A,0xDC,0x64,0x8D,0xE9, + + 0x26,0x18,0xA5,0x73,0x97,0x06,0x82,0x95,0x72,0xC9,0x6E,0xCA,0x88,0x10,0x5A,0x0E, + + 0x08,0x28,0xC9,0xB4,0x00,0xC8,0xD7,0x50,0xDA,0x89,0x35,0x7C,0xAC,0x63,0x12,0x27, + + 0xF2,0x14,0xA1,0xD8,0x33,0xC9,0xC5,0x7D,0x69,0x66,0xB8,0xAB,0x6D,0x03,0xDC,0x69, + + 0x7F,0xEF,0xF1,0x42,0x45,0x29,0x0B,0xD5,0x60,0xC7,0x3B,0x0F,0x9A,0x8A,0xF8,0x3F, + + 0x2C,0x14,0x2F,0x3B,0x6D,0x7B,0x9B,0x49,0xA7,0xB8,0x9A,0x81,0x1E,0x14,0x9D,0xB9, + + 0xD3,0x39,0xE8,0x3E,0x9E,0x5A,0xE9,0xB7,0x09,0x5F,0x0D,0x6E,0x5E,0xEC,0xEB,0xC7, + + 0x33,0xDE,0x93,0xA8,0xA6,0x00,0xE0,0xFD,0x9A,0x62,0xFA,0x7E,0x5F,0xED,0xC7,0x16, + + 0xA2,0x8E,0xCF,0x2D,0x61,0x51,0x71,0x6A,0xC4,0x1D,0xF3,0x6F,0xDE,0xEE,0x64,0x26, + + 0x17,0x4A,0x87,0xE0,0x49,0xFB,0x84,0x99,0x14,0xFD,0xFB,0x7F,0xDF,0xEF,0x37,0x73, + + 0x87,0xD0,0xA2,0x91,0x53,0xD8,0xCB,0xBE,0x64,0x1B,0xB0,0x2E,0x5A,0x99,0xC5,0x61, + + 0xA1,0x3C,0x2D,0x8A,0x52,0x38,0xBB,0x4C,0x90,0xD1,0xD9,0xF8,0x96,0x4E,0xA5,0x92, + + 0x5B,0x13,0xE5,0x87,0xF3,0xA9,0xAF,0xD2,0xA5,0x91,0xEF,0x56,0xCB,0x76,0x89,0x23, + + 0xD4,0x3C,0xAD,0x97,0xD1,0x5A,0x5C,0x39,0xDC,0x97,0xC2,0xB3,0xAD,0x32,0xF2,0x4B, + + 0x7E,0x34,0x75,0x52,0x62,0xB4,0xB1,0x22,0xE4,0xCA,0xF4,0xE6,0x76,0xF4,0xB4,0x70, + + 0x86,0x48,0x22,0xE6,0x31,0xF7,0x31,0x61,0xF6,0x2A,0xFC,0xF6,0x77,0xF5,0x65,0x42, + + 0xC2,0x3C,0x5B,0x81,0x0E,0x3D,0x01,0x93,0xF4,0xA4,0xF5,0xE7,0xF6,0xF6,0x92,0x21, + + 0x20,0x12,0xFB,0xB7,0x90,0x32,0x7F,0xF3,0xB3,0x36,0xFD,0xF7,0xF7,0xF7,0x82,0xF8, + + 0xA2,0xD9,0x78,0x9B,0x78,0x47,0xF6,0x8E,0x48,0xF8,0x3F,0xCA,0x5B,0xA3,0xC6,0x1D, + + 0x09,0x94,0x29,0x61,0x61,0x46,0x5F,0x4E,0x04,0xDA,0x05,0x4C,0xCA,0x06,0x19,0xA7, + + 0x2E,0x62,0x58,0x7C,0xD9,0x70,0x33,0x54,0x1B,0x84,0x11,0x28,0x42,0x97,0xD0,0xBC, + + 0x0C,0x9D,0x50,0x64,0x0D,0x71,0xB8,0xBA,0xB1,0x66,0x53,0x9D,0xE6,0xD8,0xC3,0x1B, + + 0x54,0x3E,0x4E,0xB5,0xC1,0xBC,0xFD,0x0A,0x11,0x88,0xF6,0xEE,0x7E,0xFC,0x9F,0xE9, + + 0xFD,0x79,0x72,0xAA,0x02,0x26,0x81,0x14,0x8C,0x4F,0xFE,0xFE,0x7F,0xFD,0x98,0x28, + + 0x03,0x72,0xA1,0x6B,0xA7,0x44,0x92,0x51,0x4B,0x71,0xF7,0xEF,0xFE,0xFE,0xB6,0x0F, + + 0xFE,0xDC,0x89,0x7C,0x66,0x52,0xF8,0xF3,0xEF,0xEE,0xFF,0xFF,0xFA,0xC0,0x80,0x00, + + 0x55,0x40,0xF8,0x76,0xFB,0xDA,0x69,0xF0,0x0C,0xC1,0x50,0x25,0xAC,0x9B,0x4C,0xB4, + + 0x25,0x41,0x92,0x3A,0x30,0xC1,0x32,0xE0,0x1D,0xC9,0xE8,0xEB,0xE6,0x2D,0x01,0x85, + + 0x86,0x02,0xE1,0xC5,0x5E,0x2F,0x12,0x6B,0x4D,0x21,0x90,0xE3,0x72,0x2E,0x09,0x05, + + 0x22,0x66,0x49,0xC4,0x90,0xAE,0x09,0x7B,0x4D,0x4B,0xEF,0x26,0xF7,0x27,0x65,0x46, + + 0x96,0x60,0xBB,0x3A,0xC8,0xFB,0xF0,0x6E,0xCE,0xC9,0x90,0x17,0xD6,0x55,0xA7,0xBE, + + 0x83,0x9D,0xF2,0x0A,0xE8,0x64,0xB7,0x9B,0xC3,0xD9,0x09,0x87,0xDF,0x68,0x79,0x66, + + 0x25,0x16,0x46,0x96,0x31,0x1B,0xB5,0x46,0x65,0x56,0xAF,0x63,0x3B,0x02,0x69,0x97, + + 0x03,0x58,0xF6,0xBF,0x78,0x28,0x78,0x93,0x3E,0x4E,0xA7,0x97,0x7F,0x6A,0x92,0x2C, + + 0x2E,0x48,0xDB,0x15,0xBF,0x6A,0x10,0xDA,0x0F,0x4C,0xB4,0x8D,0xD4,0xB3,0x0A,0x18, + + 0x09,0x49,0x4A,0xC1,0xFD,0x2F,0x20,0x3A,0x55,0x69,0xEA,0x1A,0xBB,0x0A,0xC5,0x6E, + + 0xAE,0x49,0x5D,0xB9,0x1D,0xDF,0x17,0x7D,0x2F,0xB4,0xB3,0xD0,0x98,0x24,0x1E,0x26, + + 0x89,0x0B,0x03,0x58,0x38,0xA1,0x9B,0x29,0xD9,0x49,0x2B,0x8A,0xF7,0x27,0x62,0x1E, + + 0x8A,0x82,0x79,0x5E,0x3A,0x62,0x56,0x74,0x1F,0x45,0x42,0xAC,0x42,0x51,0x6A,0xFD, + + 0x8B,0x0F,0x94,0xBE,0x0B,0xD0,0x48,0x7C,0xA9,0xCD,0xA2,0x74,0xBE,0x2C,0x63,0x20, + + 0x0A,0x41,0x80,0xB3,0x62,0x21,0xFF,0x63,0x69,0xF3,0xC5,0x6B,0x69,0xAA,0x6B,0x6F, + + 0x0B,0x52,0x5C,0xA2,0x62,0x4C,0x5B,0xB9,0x71,0xE0,0x2E,0x83,0xCF,0x52,0x04,0x80, + + 0x78,0xF8,0x7C,0x74,0x38,0x3F,0x2C,0xC0,0xD0,0x58,0x7B,0x4A,0xF0,0xB8,0xDE,0xB0, + + 0x26,0xE9,0x64,0xAE,0xB3,0x19,0xE5,0xC2,0xEF,0x34,0x73,0x5A,0xF1,0xA2,0x4F,0x28, + + 0x82,0x11,0x2D,0xBB,0x37,0x47,0x64,0xD3,0x6E,0x37,0x2B,0xAC,0x57,0x62,0x02,0x1D, + + 0x24,0xE6,0x0B,0x65,0xF5,0x3C,0x64,0xC3,0x6F,0x36,0xBC,0xB3,0x21,0x17,0x6A,0xC6, + + 0xB3,0x88,0xBF,0xBA,0x10,0xD9,0xAF,0xE4,0xCF,0x15,0x70,0x48,0x99,0x10,0x71,0x0E, + + 0xCE,0x11,0x60,0x4B,0xCC,0xB8,0x66,0x77,0x47,0xA8,0x68,0x16,0x57,0x7F,0x6B,0xC6, + + 0x73,0xE8,0x83,0x63,0x79,0xBB,0x70,0xE7,0x76,0x32,0xEC,0x07,0x1B,0x79,0x4A,0xDA, + + 0x27,0x43,0x2E,0x2B,0xB5,0x77,0x7A,0x13,0x03,0x42,0xD8,0x9E,0x9B,0x33,0xC6,0x55, + + 0xCC,0xB3,0xE6,0xCD,0x7C,0x37,0x3F,0xFB,0xEC,0x44,0x28,0xA5,0xDB,0x1D,0x21,0x69, + + 0x02,0x1C,0x09,0x7E,0xBB,0x11,0x66,0x9F,0xF8,0xF5,0x22,0xB5,0x9E,0x69,0x37,0xD7, + + 0xC3,0x11,0xE7,0xCC,0xF0,0xB1,0xBE,0xFA,0x64,0x06,0x78,0x43,0x78,0x39,0x51,0x91, + + 0x8A,0xB0,0x8D,0x7F,0xBD,0xD8,0xBF,0xF3,0x7C,0xF7,0x70,0x53,0x79,0x60,0xE2,0xBA, + + 0xA4,0x79,0xA9,0x8B,0xDB,0x8A,0x2E,0xB7,0xBA,0x53,0xFF,0x1A,0x6A,0xB9,0x75,0x36, + + 0x93,0x12,0xEE,0xD9,0x3D,0x7D,0x26,0xCA,0x1F,0x82,0xDB,0x97,0x13,0x39,0xBD,0xC1, + + 0x75,0x21,0xB8,0xBF,0x68,0xA1,0x65,0xC1,0x3F,0xEA,0xAF,0xC9,0x44,0xA1,0x70,0x36, + + 0x8F,0x2B,0xA0,0x7D,0x70,0xDF,0xCF,0x43,0xEB,0x2F,0xF6,0x1B,0x12,0x70,0x20,0x02, + + 0x04,0xC0,0x5B,0xE4,0x96,0x88,0x20,0x62,0xC4,0xC6,0xC0,0xF9,0xB7,0xA2,0x28,0x12, + + 0x05,0xC1,0xD0,0x94,0x10,0xF2,0x3C,0xB5,0x64,0x56,0x55,0x5D,0xD0,0xE6,0xEE,0x07, + + 0x84,0x82,0x1D,0x65,0xD5,0xE2,0x7E,0x83,0x25,0x19,0xB1,0x3B,0x03,0x5F,0x29,0x87, + + 0x85,0x83,0x93,0xF5,0x39,0x23,0x8D,0xCC,0x86,0x30,0x51,0x94,0xF1,0x1E,0x40,0xCC, + + 0x86,0x91,0x9F,0x06,0x5A,0xB2,0xD0,0x0D,0x26,0x84,0xE6,0x60,0xE5,0xA9,0x48,0x1C, + + 0x87,0xE6,0x10,0x72,0x9A,0xB3,0xCF,0x57,0x6B,0x6D,0x68,0x05,0xDB,0xB4,0x41,0x8D, + + 0x06,0xCB,0xA9,0x53,0x5D,0xA9,0x03,0x73,0xC6,0xCC,0x8F,0x85,0xC6,0xAB,0x4C,0x55, + + 0x13,0xE3,0x96,0x4A,0x5C,0xA8,0xD9,0x56,0x45,0x87,0x87,0x70,0x6E,0x81,0x22,0x0A, + + 0x0C,0xC8,0xDA,0x8A,0x43,0x06,0x62,0x59,0x54,0x42,0x6D,0x26,0x72,0xAE,0x2A,0x1A, + + 0x0D,0xC9,0xD7,0xEF,0xAF,0x39,0x8E,0x5A,0x45,0x19,0xCA,0xE1,0xB2,0xA8,0x23,0x9E, + + 0x8C,0x8A,0x7C,0xA2,0x9A,0x5B,0xF4,0xD5,0x2D,0xAC,0x41,0xE9,0x7E,0xA6,0xE6,0x47, + + 0x8D,0x8B,0x43,0x35,0x1F,0xA3,0x94,0xEB,0x4C,0x6A,0x05,0x36,0x3A,0xFB,0x59,0xA4, + + 0xEF,0xEA,0x5B,0x6A,0x9B,0x02,0x71,0x8F,0xF0,0xEC,0x8C,0x8C,0xF2,0xD1,0x43,0x00, + + 0xC6,0xE9,0x1A,0x8D,0xFE,0xC1,0xDE,0x18,0x6B,0xC7,0xFE,0xFF,0xB6,0xA9,0xD7,0x01, + + 0x47,0xCA,0xD8,0xEF,0x73,0x9E,0xF1,0x60,0x4A,0x9A,0x17,0x4B,0x6D,0x99,0x40,0xB9, + + 0x23,0x93,0x8C,0xA4,0x7E,0x39,0xFB,0x0C,0xEB,0xB8,0xEE,0x8C,0x5B,0x42,0x01,0x82, + + 0x4F,0xB4,0xED,0x98,0x48,0x44,0x90,0xEC,0xBB,0xED,0x08,0xAF,0xD3,0xE0,0xAC,0x92, + + 0x94,0x1C,0x7C,0x50,0xDF,0xFD,0x63,0xFA,0x1A,0xF1,0x9D,0xB0,0xA5,0x95,0xDA,0x87, + + 0xA4,0xF7,0xF5,0x9D,0x9E,0x06,0xDE,0xD4,0x64,0x05,0x5A,0x49,0x74,0xF9,0xC9,0xB4, + + 0x16,0x1E,0x5D,0xD1,0x1F,0x48,0xFD,0x73,0xF6,0xD5,0x01,0xBE,0x56,0x96,0xC4,0xCC, + + 0xAA,0x09,0x48,0xB4,0xE8,0x4B,0x87,0xE2,0x5E,0x29,0xF5,0x00,0x52,0x09,0x42,0xD4, + + 0xB6,0x09,0xC2,0x34,0x84,0xD0,0x4B,0x10,0x43,0x58,0x07,0x8D,0x4D,0x4A,0x9C,0xA1, + + 0x0A,0x8A,0xDF,0x59,0x41,0xF7,0x52,0x01,0x26,0x29,0x60,0x18,0x03,0xA5,0x43,0xD4, + + 0x76,0x98,0xD5,0xFF,0x14,0x1B,0x56,0x19,0x8C,0xD8,0xC6,0x5F,0x04,0xB6,0xC2,0xAD, + + 0x2D,0xF8,0x73,0x0A,0x34,0x4D,0x3A,0xD4,0xCD,0x52,0x59,0x40,0xFC,0x71,0x2F,0x45, + + 0xCE,0x9D,0x19,0xA1,0x41,0xFB,0xB9,0x58,0xEF,0xF1,0x86,0x99,0x9A,0xE9,0xDD,0x89, + + 0xA4,0xD5,0x10,0x52,0xBA,0x9A,0xCC,0x49,0x40,0x51,0x92,0xA9,0x68,0x9E,0x3A,0xE9, + + 0x23,0xFE,0xAB,0xA0,0x41,0xB8,0x84,0xD9,0xAC,0x9B,0x50,0x51,0x7D,0xE1,0xD2,0x80, + + 0xE7,0xD8,0x9E,0x24,0xD7,0xF8,0x77,0x95,0x12,0x23,0xCF,0xF1,0xDD,0x79,0x45,0x05, + + 0x9A,0x43,0xA8,0xD9,0x9E,0xAE,0xAA,0x00,0x9A,0x6B,0xED,0x04,0xC6,0x29,0x4E,0x91, + + 0x67,0xFA,0xA1,0xC9,0x9D,0xFE,0xCC,0x4E,0x19,0x43,0xDC,0xE0,0x5D,0x7B,0x56,0xD9, + + 0x30,0xAB,0x97,0xFB,0x01,0x9F,0x44,0x71,0xEE,0x7F,0x87,0xCD,0x8F,0x60,0xA1,0xE2, + + 0xF9,0x85,0xEE,0xE6,0x87,0xAD,0x5D,0x8E,0x40,0xF1,0x24,0x46,0xEF,0x21,0x70,0x22, + + 0xD8,0x14,0x71,0x66,0x80,0x1E,0xB7,0x6E,0x98,0xDE,0xE5,0x3C,0xF4,0x3E,0x12,0xFB, + + 0x35,0xD6,0xAE,0xEA,0x71,0xBE,0x2A,0x2E,0x63,0xC6,0x29,0xCA,0xC0,0x2F,0x71,0x1E, + + 0x22,0x86,0x19,0x7A,0x4F,0x8C,0x27,0xD3,0x5C,0x7C,0x98,0x53,0x4C,0x7C,0x56,0x46, + + 0xE9,0x40,0xC0,0x5B,0x96,0x8B,0x9F,0xEA,0xC0,0x58,0xFE,0xD4,0x8F,0x6B,0x36,0x57, + + 0x27,0x0B,0x63,0xBC,0x17,0xF9,0xEC,0x03,0x73,0x4A,0x98,0x07,0x6A,0xE2,0x7F,0xA3, + + 0xE8,0x62,0x65,0x2A,0x47,0x7B,0xED,0x12,0xAE,0x49,0x65,0x1A,0x71,0x62,0xED,0x93, + + 0x07,0x18,0x65,0xD0,0x46,0x45,0x39,0x3A,0x6E,0x05,0x5D,0x78,0x32,0xC8,0x15,0x52, + + 0x3A,0xA9,0xFA,0x62,0xCE,0x60,0x4B,0xA0,0xB5,0xB9,0x02,0x56,0xBF,0x78,0x72,0x2A, + + 0x79,0xB5,0xF2,0x76,0xCB,0x81,0x25,0x9D,0xB2,0xD4,0x60,0x34,0xA4,0xA6,0x7B,0xF2, + + 0x31,0xFE,0xFB,0x66,0x42,0x62,0xEC,0x57,0xE6,0x95,0xAC,0xDB,0xC8,0xB7,0x5D,0xFB, + + 0x7A,0x76,0xF3,0x39,0x28,0x22,0xCF,0xC3,0x74,0x28,0x0B,0x47,0x7A,0x0E,0x78,0xCF, + + 0x29,0x4E,0xAB,0xA7,0xE5,0x42,0x92,0xEC,0x6E,0x22,0xCF,0xEE,0x93,0xA5,0x4D,0x7F, + + 0xA7,0x6B,0xDC,0xC2,0x18,0x94,0x4B,0xF0,0xEE,0xEB,0xA2,0xFE,0x92,0xB8,0x19,0x48, + + 0x04,0x05,0xFD,0x79,0x44,0x83,0x0A,0x58,0x6F,0xE8,0xAB,0x4A,0xB9,0x91,0x32,0xA9, + + 0x83,0x69,0xF5,0x5B,0x6F,0x4B,0xCD,0x39,0xC7,0x0D,0x6C,0x55,0x2F,0x8E,0x7C,0x88, + + 0x4B,0x54,0xFF,0x4E,0x9B,0x71,0xC0,0xEB,0x62,0xBE,0xBF,0x20,0x38,0xEC,0xB7,0x35, + + 0xD6,0xAD,0xF3,0x9C,0xD4,0xEE,0x14,0xA5,0x90,0x27,0x9A,0xEE,0x90,0x1A,0x05,0xFE, + + 0xDC,0xED,0x3F,0x7F,0xA0,0xFF,0x13,0x2E,0x59,0x04,0x55,0xB4,0x21,0x30,0xD9,0xCA, + + 0x70,0x70,0x8C,0xE3,0x4E,0x72,0x66,0xDA,0x77,0x6C,0xA7,0x32,0x5D,0xDF,0x5C,0x01, + + 0x24,0x56,0x79,0x56,0x26,0x69,0xF8,0x08,0x40,0x19,0xEB,0x76,0x91,0xE9,0x88,0x44, + + 0x10,0x54,0x20,0xA7,0xB7,0xB3,0x3A,0xD9,0x60,0x35,0x85,0xC1,0xD6,0x8A,0xC3,0x29, + + 0xC2,0x54,0xA7,0xC5,0xB3,0x1C,0x33,0xCD,0xF0,0x1B,0xB7,0xE4,0xF3,0x07,0x8D,0x54, + + 0xE5,0x0C,0x4C,0xA6,0x3F,0xB1,0x9D,0x74,0xB5,0x15,0x71,0x67,0x73,0x7F,0x2D,0xDB, + + 0xAC,0x7B,0xBE,0x76,0x94,0x35,0x91,0x62,0xC9,0xD5,0x32,0xFF,0xDB,0xD4,0xEF,0xE2, + + 0xB3,0xB4,0x3A,0xFE,0xC6,0x78,0xE3,0x9C,0x02,0x56,0xB7,0x5E,0xD5,0xD5,0x29,0x8F, + + 0x36,0xA7,0xF8,0xAA,0x19,0xE5,0x3A,0x47,0x09,0xC6,0x33,0xE7,0x31,0x3E,0xAF,0x13, + + 0xA8,0x8B,0x37,0x67,0xA9,0x76,0x5F,0xC6,0x95,0xA4,0x3B,0xEE,0x5A,0xD7,0x53,0x4C, + + 0x24,0xCE,0xC6,0x8C,0x7F,0x97,0x96,0xDF,0x96,0x4D,0xD4,0x1C,0xFE,0x33,0x8D,0x29, + + 0x16,0x3D,0xCA,0x22,0xDA,0x5E,0x1B,0xE6,0x03,0xA9,0xD6,0x0F,0xF7,0xD0,0x1E,0xF4, + + 0xAC,0x7C,0xDA,0xCC,0x47,0xBF,0xE4,0xDC,0xEC,0x84,0x47,0x92,0xFC,0x7C,0x16,0xEC, + + 0xC8,0x3F,0xAF,0x8E,0xDE,0x30,0xCD,0x7D,0xE1,0xE2,0x49,0x1F,0x57,0xD2,0x83,0xE0, + + 0xE4,0x5F,0x27,0x7C,0x99,0xC2,0xCD,0xA2,0x8B,0xA0,0x8F,0xC4,0xF8,0x3D,0x50,0x20, + + 0xD8,0x2D,0x13,0x93,0xE2,0x5C,0x5D,0xDD,0x19,0xDF,0x28,0x4C,0xF2,0xF1,0x14,0xE1, + + 0x39,0x76,0xDA,0x7C,0x9A,0x1D,0x54,0x63,0x84,0xBF,0xC9,0x00,0x29,0xED,0x51,0x2F, + + 0x5C,0xB0,0x6D,0xE8,0x06,0x8C,0x07,0x41,0x7E,0x9C,0x86,0xD1,0xC5,0x3E,0x1E,0x44, + + 0x96,0xE0,0xB9,0x42,0xC3,0xC8,0xB4,0xF6,0xCB,0xDF,0x30,0x73,0xB5,0x30,0x8C,0x3A, + + 0x26,0x78,0x95,0xA9,0x98,0x18,0x39,0x14,0x8D,0x24,0xD6,0xD4,0xAB,0xB4,0x5B,0xA6, + + 0xE5,0xC6,0x25,0x19,0x98,0xB8,0xE5,0x05,0x0C,0xD7,0xE7,0x78,0xB2,0xE0,0xDD,0x74, + + 0x2B,0x83,0x0E,0x2D,0x41,0xAD,0x31,0x76,0xC1,0xA5,0x4A,0x5E,0xD1,0x07,0xD9,0x78, + + 0x7E,0x17,0x32,0x64,0x3D,0x58,0xA2,0xC2,0x5E,0x35,0x4A,0x26,0xA1,0xA7,0x7C,0xF8, + + 0xF6,0x04,0x11,0xBB,0xEA,0x14,0xC1,0x41,0x63,0x76,0x1E,0xDC,0xDE,0x8D,0x9A,0x39, + + 0xF4,0x56,0x1C,0x48,0xB2,0x55,0xA4,0xD4,0x39,0xA9,0x23,0x05,0x58,0x4E,0x78,0xE1, + + 0xA9,0x20,0x7F,0xE4,0x6C,0xC8,0x00,0x9E,0x3E,0xF7,0xD3,0x39,0xDB,0x4B,0x8D,0x54, + + 0x62,0x78,0xAB,0x3D,0x27,0x25,0xB0,0xAD,0x7D,0x9D,0x88,0xEA,0x1C,0x4F,0xFB,0xDE, + + 0x46,0xAB,0x7C,0x38,0xE0,0x2B,0xC2,0xE9,0x77,0xC5,0x80,0x0D,0x37,0x6B,0x72,0x51, + + 0xB6,0x3A,0xE7,0x2F,0x99,0xB5,0xCB,0xF8,0xFA,0xDC,0x5F,0x1C,0xBA,0x68,0x55,0x36, + + 0xEE,0xAF,0x6F,0x1F,0x8A,0xC1,0xFF,0xFF,0xC1,0x1D,0xFF,0xBF,0xC7,0x83,0x5A,0x84, + + 0xD1,0xE6,0xDB,0x8E,0x91,0x6F,0x8F,0x07,0x93,0x6D,0x10,0xEC,0xBD,0xB4,0x17,0x19, + + 0xD6,0x61,0x96,0x11,0xC6,0x3A,0x17,0xF8,0x4B,0xCD,0xD4,0xB0,0x94,0x97,0xDE,0xF8, + + 0x32,0x2D,0xA4,0xE1,0x4B,0xF3,0xE1,0x58,0x35,0xB1,0x9C,0x83,0x77,0x96,0x43,0x71, + + 0x62,0x1E,0xA9,0x10,0x4E,0x38,0x7D,0x64,0xA9,0xA5,0x45,0xBF,0x96,0xD3,0x9C,0x3E, + + 0xB7,0x6F,0x50,0x98,0x95,0xB2,0xC3,0xCE,0x92,0xE5,0xE5,0x04,0x8B,0xB6,0x93,0x56, + + 0x78,0x83,0xE7,0x3E,0x13,0xB3,0xC3,0xA9,0xB6,0x08,0x3C,0x72,0x71,0xB7,0x5B,0x2E, + + 0x51,0x2D,0xCB,0xCD,0xB0,0x94,0xB5,0x3F,0xFC,0x6A,0xB5,0x3E,0x1D,0x92,0xB6,0x98, + + 0xD8,0x3A,0xC3,0x92,0xB1,0xD5,0x56,0x77,0xED,0x18,0x3D,0xE2,0xC4,0x16,0x8D,0x65, + + 0xCD,0x24,0x26,0x09,0xCB,0x33,0x0D,0x24,0xDD,0xEE,0x52,0x48,0x6C,0x73,0x1F,0x9C, + + 0x09,0x8E,0x96,0x74,0x91,0xB4,0x41,0xC0,0xFB,0x46,0xE4,0xBB,0xF3,0xB6,0xDE,0xF9, + + 0x7D,0xA5,0x23,0x08,0x43,0xFB,0x3F,0xA7,0x15,0xAC,0x37,0x28,0x5B,0xEA,0x2F,0xD8, + + 0x17,0x9B,0xD2,0xB8,0x1C,0xE4,0x06,0x30,0x5E,0x2B,0xE5,0xAF,0xD2,0x7E,0xBB,0x34, + + 0x55,0x63,0x74,0x26,0x06,0xBA,0xDB,0x95,0xF3,0x83,0x4E,0xFE,0xD9,0xBD,0x47,0x27, + + 0x33,0xE6,0x7C,0x36,0x43,0xF0,0x7F,0x9C,0x90,0xB1,0x81,0x7A,0x28,0xCF,0xA7,0x16, + + 0x3C,0x45,0xC9,0x29,0xB8,0xDC,0x2E,0xC2,0x4B,0x01,0xCF,0x15,0x52,0xF3,0x4F,0x22, + + 0x50,0xDD,0x10,0xD7,0x1A,0xB9,0x26,0x5B,0xE9,0x9D,0x6F,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x74,0xFD,0xC0,0x18,0x9D,0xA6,0x72,0x20,0x41,0x00,0x16,0x2C,0xF5,0xBF,0xB7,0x60, + + 0x00,0x08,0xC0,0x15,0x35,0x8C,0x0F,0xB2,0x88,0xA2,0x74,0x10,0xA4,0x90,0x1B,0x75, + + 0xA1,0x10,0x89,0x7B,0x52,0x22,0xFD,0x05,0x21,0xED,0xF3,0x20,0xD1,0x22,0xCD,0x62, + + 0xF4,0x84,0x10,0xA7,0x95,0xD3,0x21,0xCE,0x28,0xF2,0x66,0x47,0xFF,0xBC,0xA7,0x80, + + 0x06,0xD0,0x39,0x83,0x8C,0x2E,0xEA,0x02,0x9C,0x42,0x69,0xFE,0x53,0x45,0x08,0x10, + + 0x05,0x27,0x8C,0x58,0x60,0x25,0x50,0x79,0xBE,0xC3,0x98,0xC9,0x55,0x67,0x56,0x32, + + 0xFA,0x44,0x41,0x06,0xAB,0x64,0x78,0x12,0x63,0x90,0xB1,0x36,0xBC,0x24,0xC9,0xBE, + + 0xEB,0x0A,0x96,0x50,0x95,0x67,0x71,0x0F,0x01,0x47,0x8F,0x45,0x98,0xD8,0x06,0x0D, + + 0xF6,0xF1,0xDB,0x24,0xBD,0x6A,0xBE,0xB7,0x49,0x08,0x7E,0x53,0x9A,0xC8,0x0E,0x78, + + 0x41,0xFE,0x82,0x62,0xDB,0x29,0xDA,0xB8,0x48,0xE6,0xBA,0x7C,0x5D,0x07,0x06,0x7A, + + 0xFD,0x83,0xC3,0x11,0x15,0xAC,0x3F,0x40,0x21,0xFB,0x28,0x5D,0x58,0xEC,0x94,0x1D, + + 0x06,0x4A,0xC3,0x1C,0xBD,0x86,0xBF,0x1E,0x68,0xB4,0x0B,0xB9,0x88,0x5C,0xBD,0x26, + + 0x24,0xD3,0xAD,0x23,0x1C,0x2E,0x1A,0x69,0x6E,0x0E,0xE8,0xD4,0xA9,0xC7,0xBC,0xDC, + + 0x09,0x13,0x5D,0xA3,0xEA,0xFE,0x0C,0x83,0x20,0x42,0x9A,0xBC,0x5D,0x6F,0x1C,0x4C, + + 0x8C,0x6C,0x8C,0xC9,0x98,0x8D,0x17,0x63,0xCC,0x4C,0xAB,0x69,0x27,0x2C,0x03,0xC9, + + 0x8D,0x0D,0x0B,0xDD,0x23,0xB4,0xDB,0x06,0xCD,0x4D,0x1D,0x3A,0x01,0xB2,0x52,0x74, + + 0x38,0xE5,0xC4,0x5D,0xDB,0x54,0x84,0xB1,0x18,0x54,0x78,0x36,0xE1,0xAD,0x0F,0x21, + + 0xA9,0x61,0xCC,0x58,0x37,0xE1,0xA4,0xB4,0xEE,0x10,0xA2,0xD8,0x10,0x31,0xDB,0x8C, + + 0xC6,0x49,0x31,0xE7,0x4F,0x70,0x3F,0xD2,0x81,0x53,0xF7,0xA5,0xF3,0xB2,0xBB,0x97, + + 0xBD,0x0E,0xD3,0xD5,0xB5,0x5D,0x44,0x9C,0x44,0x3D,0x85,0xB1,0x7E,0x32,0x84,0x40, + + 0x4F,0x56,0x28,0x56,0x36,0x3E,0x50,0x20,0x66,0x38,0x38,0x76,0x73,0xE9,0x93,0xAE, + + 0xE1,0x15,0xCE,0x94,0x37,0x5B,0xA3,0x74,0x61,0x5D,0x30,0xD0,0x75,0x77,0x05,0x54, + + 0x2D,0x90,0x47,0xCD,0x17,0xB0,0xC5,0x09,0x86,0x1B,0xB7,0xE5,0xF3,0x36,0x05,0xD5, + + 0x2A,0x2E,0x5D,0x12,0x31,0x0B,0x9D,0x71,0x89,0xE8,0x4F,0x32,0xF5,0x35,0xA2,0x90, + + 0xA4,0x9C,0x16,0xFF,0x41,0xB1,0x74,0xBC,0x6B,0xE8,0xCF,0x8D,0xDD,0x3A,0x30,0xE8, + + 0x09,0x34,0x93,0x18,0x3B,0x63,0x9C,0x78,0x2D,0xA4,0x8F,0x38,0x7B,0xE3,0x07,0x89, + + 0xFC,0x23,0x03,0xED,0xBC,0x16,0x16,0xCF,0x17,0xDC,0xD7,0xB1,0x07,0x61,0x8F,0x5E, + + 0x8D,0x00,0xF1,0x9A,0x15,0x36,0xB3,0x2B,0xE5,0x51,0x5F,0x3D,0x93,0xC4,0xAA,0xEC, + + 0xC3,0x75,0xFC,0xAE,0xF8,0x69,0x0F,0xC9,0xCF,0x83,0x88,0xAC,0x36,0x3E,0xDE,0x30, + + 0x17,0x50,0x49,0x34,0x57,0x70,0x1A,0xFC,0xE6,0xEB,0x32,0xD8,0x7D,0x7F,0x57,0xBA, + + 0xAE,0x70,0x07,0x5D,0xCE,0x34,0x97,0x69,0xEB,0x1C,0xD9,0xE9,0xFB,0x3E,0xA3,0x4B, + + 0xA7,0x15,0x30,0x59,0xB9,0x0E,0xE6,0x63,0xE8,0x5D,0x41,0x79,0xF9,0x9D,0x9F,0x86, + + 0x40,0xF0,0xBF,0x76,0x10,0xAB,0xF0,0xA2,0x51,0x82,0xF8,0x27,0x70,0xA2,0x16,0x52, + + 0x55,0xE5,0x90,0xE9,0x26,0x60,0x28,0xF2,0x03,0x6C,0xBC,0x56,0x51,0xCD,0xA4,0x69, + + 0xF2,0x32,0xB2,0x85,0x5D,0xD1,0xB2,0x4E,0x49,0x44,0xFA,0x19,0x29,0x6B,0xE2,0x0B, + + 0x0E,0xEA,0x11,0xE9,0xE8,0xA8,0x2E,0xB7,0xC7,0x79,0xA4,0xF0,0xF1,0x4E,0xE9,0xB1, + + 0x8A,0xE1,0xE0,0xBF,0x1A,0xE6,0x38,0xE6,0x44,0x26,0x93,0x26,0x52,0xC8,0x47,0xD6, + + 0x58,0xD1,0xA8,0x8F,0x11,0xA7,0x1B,0x32,0x5B,0xAB,0xE2,0x56,0xF6,0xA5,0x59,0xBC, + + 0x5F,0xFB,0x61,0x9C,0x23,0xE4,0x8E,0xA4,0x1C,0x1B,0xEC,0xA0,0xF2,0x4B,0xD6,0x14, + + 0x45,0xC4,0xBF,0x10,0x49,0x3A,0xC6,0xE1,0xC6,0x1A,0x15,0x53,0xA8,0xC7,0x23,0xC2, + + 0x65,0x38,0xA5,0x49,0x9E,0x94,0x4C,0x2D,0xE0,0xC5,0xA8,0x0E,0xBD,0xA8,0x35,0x13, + + 0x26,0x70,0x6A,0x8E,0x69,0xA3,0xFA,0x26,0x70,0xA5,0xA2,0xAE,0x6E,0x28,0x37,0x7F, + + 0x9C,0x26,0x99,0x6D,0x5E,0x51,0xCC,0xAF,0xCE,0x23,0x5F,0x0B,0x35,0x53,0xAA,0xDF, + + 0xA2,0x1B,0xAF,0x3B,0x68,0xE9,0x59,0x1B,0xCE,0xEB,0x03,0xBB,0xDF,0x3B,0x2A,0x4E, + + 0x81,0xCD,0x01,0x0E,0x1A,0x80,0x10,0x6A,0x4F,0x8C,0x32,0x37,0x7A,0xE4,0x52,0xC8, + + 0x9E,0xCF,0xFA,0x28,0x1B,0xC3,0xD6,0xE8,0x47,0xC5,0xC2,0x81,0x59,0xEF,0x8F,0xC9, + + 0x17,0x03,0xFE,0x6B,0x77,0xC7,0x9F,0x4F,0x27,0x77,0x37,0xED,0x17,0x2D,0x29,0x67, + + 0x8C,0x8D,0x7B,0xB7,0xA3,0xE2,0xF9,0x08,0xFA,0x49,0xF3,0xFB,0xDD,0x4C,0xB1,0xE4, + + 0xC6,0xD0,0x5B,0x04,0xFD,0x43,0xB4,0x65,0x40,0x7D,0x74,0x7A,0x6E,0x9E,0xC0,0x00, + + 0x29,0x9B,0x6C,0x8A,0x5E,0xBB,0x7C,0xC7,0x63,0xD3,0xDE,0xB6,0x74,0xB1,0xA6,0x8B, + + 0x01,0x6D,0x9D,0x03,0xB6,0x08,0xAC,0xC3,0xB0,0x90,0x0A,0x35,0x8B,0x2F,0xAF,0xEC, + + 0x28,0x15,0x2D,0xD4,0x8C,0xDD,0xFB,0xF4,0x27,0xD7,0x51,0x93,0xC6,0x42,0xE6,0xCA, + + 0x83,0x12,0x48,0x54,0x7D,0x29,0xCF,0x66,0x64,0x6E,0x34,0x67,0x54,0xFC,0xFC,0x50, + + 0xB6,0xE5,0x00,0xF2,0xB5,0xA9,0x1E,0x3E,0x96,0x53,0xC2,0x93,0x57,0x98,0x67,0x83, + + 0xA2,0xF8,0x87,0xC7,0xB5,0xF6,0xB5,0x63,0x8C,0xB8,0x75,0xA4,0xCF,0xB7,0x55,0x14, + + 0x65,0x17,0xD7,0xB5,0xD7,0x1D,0x7D,0x33,0xEF,0x96,0x7D,0x30,0xD3,0x0C,0x22,0x4A, + + 0x28,0xF6,0x36,0xFD,0x5D,0xB9,0x8D,0x38,0x6C,0xD2,0x0E,0x5D,0x04,0xBA,0x14,0xF8, + + 0xEF,0x9C,0xF7,0xB3,0x98,0x46,0xA7,0x08,0x65,0x29,0x59,0xFE,0x69,0xE2,0xB7,0x4C, + + 0x2E,0x86,0x1B,0x8B,0x33,0xFB,0xB7,0x6C,0xC8,0x77,0x73,0xE1,0x0B,0x94,0x4F,0xD1, + + 0x00,0x96,0x43,0x0D,0xB1,0xB1,0x66,0x9A,0x48,0x99,0xAE,0xD9,0x02,0x26,0x2E,0xDF, + + 0x82,0x91,0x99,0x4C,0xAF,0xD1,0x48,0x93,0x8C,0xFC,0xF2,0x6A,0x27,0xBD,0xFE,0x5E, + + 0x29,0x2E,0x2E,0x5E,0x4D,0xFF,0x86,0x12,0x47,0x90,0x2C,0x9C,0x80,0xBF,0x05,0xDB, + + 0xAD,0xBE,0xDF,0x7F,0xBE,0x21,0x75,0x03,0x96,0x23,0xFF,0x6A,0x7C,0x52,0x90,0x1C, + + 0x2D,0x83,0xAB,0xDB,0x32,0x09,0x82,0x13,0x97,0x92,0xBF,0xBF,0xF9,0xFD,0x56,0x47, + + 0xC2,0x0C,0xF2,0x00,0x08,0x62,0x0D,0xE7,0x64,0xED,0xBC,0x4D,0x63,0x81,0x88,0xD7, + + 0x25,0x43,0x80,0x10,0x9E,0x60,0xF4,0x14,0xA0,0xBE,0x38,0x46,0x33,0x7D,0x3A,0x93, + + 0x80,0x08,0x45,0x4B,0x1F,0xD4,0x8D,0x01,0x21,0x02,0x29,0x15,0xC8,0xCD,0x49,0x25, + + 0x0C,0x41,0x25,0x91,0x97,0xE8,0xD9,0x68,0xE5,0x4B,0xE7,0x32,0x70,0x9C,0xC2,0x00, + + 0x06,0x6A,0xFA,0xAC,0x29,0xEB,0x8F,0x44,0x29,0xA5,0x28,0x23,0x90,0xE4,0x11,0x78, + + 0xA6,0xFA,0x91,0xC1,0xB6,0xA5,0xA7,0x9D,0x2F,0xFE,0x87,0x16,0x10,0x66,0xD1,0x33, + + 0x69,0xB7,0x98,0x65,0x37,0xD9,0xAE,0x89,0xFD,0x8B,0xD9,0x45,0x50,0x62,0x77,0x68, + + 0x0E,0xF1,0x31,0x92,0x4D,0x2D,0x1D,0xF5,0xF9,0x48,0x26,0xCA,0xD1,0x57,0xC2,0xF9, + + 0x0B,0xA8,0x8A,0x08,0x91,0x11,0xD6,0xAA,0x81,0x3B,0x3E,0xBE,0x18,0x60,0xCB,0x9C, + + 0x0B,0xE0,0x75,0x98,0x50,0x69,0x55,0xBC,0x4B,0xEA,0x99,0xFC,0x5D,0x45,0xC3,0x58, + + 0x8C,0x00,0xE3,0x5E,0xFE,0x27,0x2B,0xD6,0xCE,0x48,0x92,0x52,0x57,0xEC,0xCB,0x99, + + 0xC7,0x65,0x83,0x19,0x10,0x12,0xF7,0xAB,0xC8,0xD6,0x86,0xB9,0xDB,0x82,0x0A,0x79, + + 0xE3,0xBD,0x42,0x2F,0xF8,0xA1,0xF5,0x5C,0x79,0x97,0xEC,0xB8,0x7B,0xCC,0x0A,0xCD, + + 0xF4,0x82,0x6D,0x69,0xCF,0xEC,0x60,0x83,0x4D,0x7E,0xDD,0x0E,0x68,0xBD,0x83,0xC9, + + 0x8B,0x4C,0x3B,0xC9,0x91,0xE1,0xE9,0x96,0xF5,0xAF,0x6B,0xFD,0x7D,0x6A,0xC0,0x39, + + 0x8D,0xF2,0xF1,0xA2,0xA8,0xFF,0x23,0x66,0xA3,0xE2,0x23,0x95,0x99,0x22,0x94,0xC0, + + 0x2E,0x16,0xC4,0x18,0xBD,0xC6,0x94,0xE3,0x59,0x56,0x1D,0x20,0x72,0x92,0xCC,0x10, + + 0x7A,0x53,0x1C,0x16,0xA0,0x9C,0xDC,0xE1,0x65,0x5B,0xDC,0x09,0x77,0x73,0x2B,0x2C, + + 0x01,0xED,0xBE,0x1B,0xB3,0x12,0x3B,0x0C,0x41,0xAD,0x55,0x24,0xFE,0x30,0x4D,0x20, + + 0x2C,0x95,0xB5,0x6B,0x1D,0x3E,0x9D,0xF2,0xD8,0x3D,0xCB,0x4E,0xF7,0xA9,0x53,0xA6, + + 0xC9,0xA5,0x43,0xD6,0xD9,0x95,0x1C,0xE4,0xBE,0xB5,0x79,0xFB,0x1A,0x6F,0x16,0xDC, + + 0x4B,0xA4,0x8E,0xA7,0x5B,0x2E,0x16,0x4D,0xEE,0xF3,0xC4,0xE0,0x97,0xD4,0x65,0xC5, + + 0x76,0xA7,0x9C,0x39,0xD7,0x3F,0x6B,0xC9,0xEC,0x34,0x08,0x93,0x9B,0xD7,0x33,0xD7, + + 0x42,0x94,0x10,0xA1,0x92,0x87,0xCB,0xB1,0xC9,0x4C,0xE7,0x1D,0xF7,0x38,0x2E,0xF2, + + 0xEA,0x18,0x6A,0x08,0x3A,0xD6,0x86,0xDB,0x09,0x59,0xD3,0x28,0x76,0x3D,0xCE,0x18, + + 0x3C,0x5B,0xAF,0x18,0x3B,0x9A,0xC1,0xB9,0x6F,0xE1,0xA6,0x46,0xF6,0x84,0x4F,0x8D, + + 0x27,0x5B,0x8F,0x05,0xBE,0x18,0x2F,0xAD,0x67,0x1B,0xFF,0xCF,0x03,0x74,0x4F,0x28, + + 0xAF,0x79,0xF0,0x6C,0x1A,0x7B,0x8F,0x79,0xE1,0x1A,0xF8,0xC3,0x2B,0x71,0x6F,0x3B, + + 0xA6,0x11,0x9F,0xD0,0x59,0x1C,0x14,0x8E,0x95,0x47,0xE8,0x38,0x5B,0x4C,0x4A,0xFC, + + 0x2D,0x1F,0xD8,0xAE,0x08,0x7D,0x07,0x61,0xCE,0xE2,0x87,0xF8,0xDE,0x8C,0xEB,0x5B, + + 0xBA,0x14,0x3F,0x25,0x85,0xFB,0x77,0x9F,0x34,0x81,0x8E,0xEE,0x5F,0x81,0xC6,0x5D, + + 0xA9,0xFD,0x37,0x35,0xE5,0x72,0xF3,0x87,0x31,0xF0,0x27,0x7F,0x66,0xBA,0xE0,0x83, + + 0x2E,0x8A,0x30,0xEE,0x57,0xED,0x52,0x22,0x45,0x80,0x70,0xA6,0x1A,0xA2,0x06,0xA6, + + 0xA4,0x7E,0x38,0xFE,0x29,0xEC,0xB1,0xB6,0x47,0x62,0xF8,0xEF,0x53,0xE3,0xA1,0x40, + + 0xBD,0x84,0xB1,0x75,0x90,0xCC,0xDD,0x07,0xC2,0xC0,0xF5,0xA2,0x75,0xA0,0xE9,0x42, + + 0x81,0x8B,0x45,0x85,0xDD,0xA9,0xF9,0xB6,0xF2,0xCB,0xEF,0xCC,0xD3,0x39,0xEB,0x22, + + 0x52,0x29,0x58,0x26,0x5A,0xBF,0x66,0x90,0x67,0xA4,0xE6,0x52,0xA9,0xA6,0x97,0xA0, + + 0x52,0x8C,0x7A,0xA9,0xEA,0xCB,0xA3,0x04,0x2C,0xCA,0x63,0x14,0xA8,0x48,0x76,0xC7, + + 0x84,0x56,0xA1,0x21,0x1B,0x00,0x57,0x52,0xA2,0xDD,0xBD,0x62,0x54,0x9A,0x6B,0x2C, + + 0xD2,0x8C,0x8B,0x53,0x96,0x97,0xFE,0x41,0xF4,0x5C,0x6F,0xB0,0x09,0xEF,0xA2,0x49, + + 0x35,0xE6,0x20,0x06,0xB9,0x2E,0x34,0xAE,0x05,0x88,0xF7,0xD6,0x5C,0x53,0x92,0x1E, + + 0x82,0xC8,0x3A,0x9C,0x84,0x24,0xB3,0xBE,0x4F,0x2B,0x01,0x7C,0xFC,0x14,0xB3,0x78, + + 0xA1,0x8B,0xA1,0x4F,0x98,0xC4,0x3B,0xA2,0xCA,0xC8,0x37,0xAB,0xD8,0x96,0x11,0xE4, + + 0x8B,0x33,0x93,0x2F,0xAD,0xE9,0xFB,0xBB,0x0A,0xC3,0x93,0x5D,0xDB,0xE9,0xE2,0x8D, + + 0x2A,0x2C,0x5D,0xDC,0xE9,0xA6,0xE0,0x95,0x48,0x96,0x76,0xEA,0x61,0x58,0xAE,0x14, + + 0xF8,0xE1,0x12,0xB6,0x1D,0x00,0x23,0xFB,0xEA,0x32,0x3C,0x96,0x0B,0xA0,0x74,0x49, + + 0x05,0xCC,0xE1,0x3D,0xAD,0x7E,0x7B,0x15,0x25,0xDF,0xAA,0x86,0x3B,0xE5,0x8C,0x9B, + + 0xC3,0x94,0x79,0xB9,0xF4,0xA0,0x45,0x4E,0x42,0x39,0xA3,0xFB,0xD9,0xB5,0xFD,0xC2, + + 0x6C,0xD2,0x1B,0x02,0x36,0xBA,0x54,0xE9,0x85,0xDD,0x34,0xE5,0x4D,0x9E,0xEC,0x12, + + 0x30,0xD3,0xCB,0xE8,0xE7,0xBB,0xFF,0x49,0xE8,0x27,0xAC,0xC5,0x71,0x9F,0x2B,0x87, + + 0xA7,0xA0,0x65,0x07,0xFA,0xDE,0x27,0xE3,0xE2,0xD0,0x25,0x4F,0xB7,0xBF,0x6D,0x06, + + 0xA3,0x91,0xA9,0xB3,0xB3,0x30,0x06,0x2D,0xE6,0xF3,0x2D,0xC4,0xC0,0x7A,0xC8,0x50, + + 0x06,0x49,0xF2,0xF3,0xC9,0xD8,0x62,0x91,0x02,0xB8,0xCC,0x19,0x45,0xB4,0xFC,0x95, + + 0x03,0x3A,0x33,0x29,0xDE,0xA4,0x25,0x1B,0x23,0x18,0xFA,0x84,0xD0,0xB7,0x07,0xC3, + + 0xA5,0xB6,0x83,0xF2,0xB5,0xF6,0x13,0xD2,0xE5,0x44,0x4D,0xA0,0x28,0xFE,0xC9,0xF4, + + 0x06,0x28,0x01,0x48,0xB6,0x74,0x1F,0xF2,0xE6,0x55,0x36,0xF0,0xD3,0x99,0xCC,0xCA, + + 0x28,0xB4,0xAD,0x31,0x34,0xF8,0xA6,0x2E,0x6E,0x4B,0x32,0xCE,0x6C,0x55,0x16,0x65, + + 0x2B,0x31,0xEC,0xFC,0xC2,0xFB,0x7E,0x6C,0x6E,0xF9,0x3E,0x79,0x59,0xE2,0x3A,0x09, + + 0x65,0xE9,0x4B,0xAB,0xBA,0x98,0xF7,0x2B,0xA2,0x98,0x2E,0xDF,0xF8,0xF3,0xAF,0xDB, + + 0xA9,0xB7,0xA1,0x9B,0xBE,0xFB,0xAF,0x53,0x9D,0x96,0x2A,0xD9,0x72,0x7D,0xA6,0x17, + + 0xBA,0x61,0xBF,0xD2,0x9B,0xB7,0x48,0xDE,0x12,0x23,0xB6,0xD1,0x76,0x90,0x56,0x21, + + 0x29,0x67,0xD4,0x36,0x3B,0xF2,0xB5,0xFD,0x8E,0xC6,0x58,0xFF,0x7F,0xF3,0xF7,0x38, + + 0x22,0xFB,0x61,0xA9,0xFE,0xF1,0xB7,0x2A,0xE2,0x9C,0xDF,0x2D,0xFE,0x55,0xCE,0xA4, + + 0x20,0x19,0xB6,0xC3,0x1A,0x3F,0xB9,0x1D,0x6F,0x5F,0x97,0x79,0x03,0xBE,0x7E,0x06, + + 0xE9,0x0F,0x10,0xBC,0xFB,0x44,0x6B,0xDB,0xF7,0x7F,0x6F,0x03,0xA5,0x6F,0xB3,0xF2, + + 0xAD,0xFC,0x18,0xEF,0x93,0x1D,0x31,0x4A,0xD0,0x7D,0xC1,0x01,0xF4,0x9E,0x53,0x93, + + 0x6B,0x66,0xB9,0xEB,0x3C,0x2F,0x68,0xA5,0xCC,0x4D,0x25,0x5A,0x73,0x23,0x71,0x67, + + 0xE9,0x0E,0x35,0x77,0x66,0x46,0x26,0x7A,0x54,0x9E,0xC7,0xD7,0xD5,0xE6,0xF8,0xDF, + + 0xFD,0x16,0x23,0x60,0xC7,0xB9,0xC0,0xE5,0xBD,0xC9,0xB7,0xE6,0xC3,0x09,0x66,0x6E, + + 0xEA,0xE4,0x58,0xA5,0xB0,0x65,0xA7,0x1E,0x35,0x9A,0x47,0xF6,0x0E,0x2B,0xF9,0xDF, + + 0xA6,0x00,0x6A,0x1A,0x6B,0xDA,0x2A,0x9A,0x7F,0xB7,0xE9,0xFF,0xF6,0xCB,0x31,0x76, + + 0x6A,0x16,0xFB,0x65,0x86,0x88,0x66,0xD8,0x38,0xDA,0x3D,0x51,0x3A,0x24,0x10,0x6F, + + 0xE3,0x4C,0xBA,0xF3,0x3C,0xD7,0xBB,0x67,0xB5,0x34,0x80,0xF3,0xB3,0x2C,0xAE,0x7A, + + 0xFE,0x6C,0xDC,0xEF,0x9D,0xA4,0x24,0x04,0x4F,0xE9,0x0A,0xCD,0xFA,0x29,0x39,0xB9, + + 0x11,0xA5,0xDA,0x20,0x3D,0xAB,0x83,0xD8,0x6B,0x0A,0xAD,0xCF,0xBA,0x76,0x33,0x3D, + + 0x76,0x0D,0xD9,0x4E,0x72,0x4F,0xE4,0x5B,0x3A,0x2E,0xA9,0x0D,0xF9,0xC4,0x3A,0x6F, + + 0xE3,0x3D,0x62,0x3F,0xB9,0xAF,0x03,0x92,0xBF,0x0D,0xC8,0x6E,0x98,0x68,0x32,0x7C, + + 0xD5,0xF2,0x32,0x54,0xF2,0x3C,0x7C,0x54,0xC7,0x0C,0x21,0x03,0x55,0x92,0x3B,0x6E, + + 0x63,0x5F,0x23,0x69,0x73,0xCF,0xAC,0x7A,0xF6,0x0A,0x43,0xD1,0x57,0x0C,0x73,0xC7, + + 0x7C,0x82,0x33,0x79,0x72,0x1E,0x04,0x79,0xF4,0xB0,0x60,0x9F,0x77,0x92,0x12,0xE2, + + 0x40,0x7D,0x95,0x74,0x0E,0xC1,0xAF,0x42,0xCC,0xAD,0xAA,0x1D,0x54,0xFB,0x25,0xB4, + + 0x12,0xF0,0xA2,0x67,0xBD,0x70,0xA4,0x41,0xC2,0x11,0x3C,0xC6,0x13,0x6D,0x7B,0x87, + + 0x41,0x91,0xFB,0x83,0x51,0xB1,0x6D,0x85,0xD3,0x83,0x10,0x94,0xC2,0xDD,0xB5,0x60, + + 0x02,0x53,0xD4,0xA5,0x14,0xCC,0x2F,0x81,0xA4,0xFC,0xE3,0xB2,0x50,0x32,0x7C,0x3E, + + 0x8E,0x19,0x54,0xB7,0x0E,0xC5,0xE0,0x82,0x9D,0xD9,0x79,0x86,0x8D,0x72,0xF3,0x32, + + 0xA1,0x29,0x1F,0xF0,0xBC,0x98,0x4A,0x92,0x03,0xF8,0x3B,0xD0,0x40,0x54,0xD5,0x9E, + + 0x01,0x73,0xBB,0xC3,0x5B,0x67,0x2E,0x1A,0xC6,0x6B,0xFC,0x53,0x53,0x18,0xF1,0xB3, + + 0x5C,0x72,0x19,0xA5,0x33,0xB1,0x23,0xF7,0x02,0xD4,0x65,0x0A,0xC0,0xB6,0x34,0xB8, + + 0x81,0xB7,0x87,0xEA,0xE5,0x37,0xB6,0xDB,0xCB,0xDB,0xA8,0x00,0x13,0x77,0x27,0xBC, + + 0x1A,0xA8,0x27,0xE2,0xAC,0xB4,0x7E,0xF2,0x88,0x54,0xE0,0xBA,0x90,0x76,0xA7,0xFA, + + 0x0B,0x99,0x33,0xF2,0x1B,0x7B,0x73,0x8D,0x65,0xA5,0x17,0x9F,0x98,0x7F,0xB7,0xA8, + + 0x08,0x9A,0xF2,0x77,0x3B,0xD7,0xF8,0x3B,0x78,0x36,0xCD,0x87,0xDD,0x76,0x7E,0xEC, + + 0xD5,0x97,0xE6,0xE8,0x51,0x33,0x7B,0xCC,0xD3,0xFD,0x6E,0xC8,0x49,0x4D,0xEE,0xAA, + + 0x49,0x3A,0xB0,0xDA,0xD2,0x32,0xFE,0x8A,0x09,0x41,0xA1,0x3B,0xA5,0xE0,0x0F,0xF8, + + 0x90,0xB1,0x47,0xFF,0xDA,0x32,0x6F,0xD9,0x03,0xF1,0x6F,0x17,0xEA,0x33,0x31,0xDE, + + 0x0A,0xA0,0x9D,0xE2,0x9F,0x90,0xCF,0x0A,0x67,0xC2,0x3C,0xD9,0x98,0x50,0x0D,0x65, + + 0xA5,0x03,0x30,0x75,0x26,0x0B,0x08,0xD9,0xAD,0x11,0x10,0x55,0xF7,0x63,0x90,0xE3, + + 0xA6,0xC1,0xE8,0xE5,0x91,0x0C,0xEC,0xCC,0xB8,0x60,0xB8,0x29,0x3B,0x4C,0x21,0xFD, + + 0xB7,0x63,0xD9,0x03,0x74,0x23,0x23,0x22,0x3B,0x4F,0xD3,0x03,0xBF,0x21,0x1B,0x23, + + 0x2C,0x2C,0xD1,0xA7,0x29,0xE2,0x01,0xCC,0x30,0xA0,0xEC,0x07,0x2A,0x1C,0x1B,0xB9, + + 0x39,0x24,0x18,0x4E,0xFF,0xF5,0xAB,0x62,0x39,0x44,0x88,0x42,0x25,0xE4,0xEC,0xB0, + + 0xE6,0xFE,0xE9,0x30,0xCA,0xAA,0x51,0x15,0xE6,0x5A,0x55,0x05,0x2B,0x5A,0x98,0xA8, + + 0x35,0xC4,0x19,0x63,0x33,0x59,0xF1,0x67,0x16,0xC0,0xAE,0x76,0xD2,0xA6,0x6B,0xBD, + + 0x3C,0x98,0x5D,0x28,0x34,0xE6,0xCD,0x11,0x3C,0x86,0x55,0x05,0x0D,0x58,0x82,0x79, + + 0xAF,0x0B,0x0E,0xF1,0x9E,0x94,0xC9,0x0E,0x27,0xC7,0x88,0x9E,0xA3,0x37,0x51,0x3D, + + 0xAC,0xC8,0x87,0x79,0xBC,0x7F,0x44,0x3C,0xA4,0xC6,0x01,0x9B,0xAE,0x44,0x0E,0xF8, + + 0x00,0x87,0x99,0x6D,0x42,0xAC,0x31,0x19,0xAC,0x8B,0x0C,0x1E,0x7D,0x55,0x4B,0x48, + + 0xEB,0x86,0x3B,0x20,0xAD,0x0B,0x69,0xA9,0x26,0xAF,0x68,0x06,0x36,0xAF,0xE2,0x5A, + + 0x31,0x8A,0xDC,0xE7,0x75,0xA3,0x8D,0x08,0xBD,0xA9,0xC8,0xFC,0x5E,0x73,0xDE,0x38, + + 0xF0,0xCC,0xD4,0x77,0x63,0x02,0x41,0xE4,0x6B,0xCB,0xFA,0xFA,0x5B,0x53,0x07,0x03, + + 0x2F,0x51,0x63,0x4B,0xD6,0x51,0x4B,0x90,0x41,0x38,0x63,0x96,0x9A,0x75,0x14,0xD9, + + 0x1E,0xE2,0x4B,0x2C,0xAF,0x7C,0xD1,0xCE,0x6E,0x10,0x17,0x5B,0x5D,0x03,0x98,0x71, + + 0xA0,0x1D,0x0E,0xE4,0xCB,0xDC,0x0C,0x3C,0x40,0x0B,0x18,0x23,0x8B,0x9E,0xBA,0xF4, + + 0x4E,0x9E,0x96,0x04,0x35,0x6E,0x11,0x4B,0xC8,0xCA,0x86,0x24,0x75,0xB0,0x77,0xC8, + + 0x80,0x89,0xFF,0x16,0x6A,0x4D,0x1C,0x5E,0x49,0x49,0x0D,0x5C,0x09,0x44,0xAD,0xA1, + + 0xC5,0xBE,0x97,0x6D,0x4E,0xF1,0xAB,0xD5,0x5A,0x92,0x42,0x35,0x6C,0x9E,0xF4,0x85, + + 0xF8,0x6B,0x40,0xA4,0xCD,0xD1,0x0C,0xC5,0x9F,0xDB,0x61,0x15,0xF2,0x79,0x14,0xD6, + + 0xDE,0x10,0xFA,0xEB,0xDC,0xF1,0xD5,0x8C,0xF2,0x58,0x6C,0xC7,0x19,0x5A,0x5E,0x5D, + + 0x51,0x3D,0xDD,0xE3,0xD5,0x26,0xE5,0xAC,0x1B,0xAA,0xA7,0xB0,0x1D,0x92,0x7F,0xD9, + + 0x4C,0xD3,0xD7,0x67,0x26,0x18,0x00,0x19,0xC3,0xD1,0x2B,0x07,0x08,0x54,0x58,0x8C, + + 0xC5,0x97,0x22,0x6C,0xCD,0xF9,0xC9,0xB9,0x54,0x9C,0x8E,0x54,0xD0,0xF5,0x84,0x2F, + + 0x8C,0x46,0xEF,0xF8,0x4B,0xD5,0xAD,0x4B,0xCE,0x99,0x06,0x40,0x6D,0xB4,0x75,0xC0, + + 0x88,0x9C,0x58,0xE9,0xC0,0x45,0x11,0x83,0x60,0x77,0xC8,0x8B,0xCF,0x7B,0x9B,0xF9, + + 0x52,0x16,0x6B,0x61,0x40,0xD9,0xFF,0xAA,0x12,0xD6,0xE6,0x9A,0x02,0x97,0x58,0x28, + + 0x4C,0x9B,0x42,0xAC,0x1A,0xB1,0x5F,0x8D,0xCF,0x23,0x24,0x1D,0x18,0xBD,0x54,0xB8, + + 0xF5,0x9B,0x42,0xFA,0xC4,0xD3,0xCA,0x98,0x9C,0xB8,0x03,0x39,0x86,0x8B,0xF7,0x30, + + 0x2C,0xA2,0x1C,0xE8,0x1F,0x41,0xC3,0x89,0xCA,0xBB,0xCF,0x01,0x52,0xF3,0x42,0xBC, + + 0x0E,0x09,0x8F,0x95,0x5E,0xB2,0x47,0x3C,0x31,0x42,0xC4,0x71,0xDB,0x52,0xD6,0x31, + + 0xA1,0xFF,0x40,0xD0,0xAB,0xFB,0xA8,0x1B,0x34,0xB5,0xAE,0x8C,0xDD,0xD6,0x98,0xE3, + + 0x8D,0x0C,0xB6,0xBD,0xF1,0xA0,0xBF,0x88,0xA8,0xB0,0xC2,0x36,0xC3,0x6B,0x3F,0xB5, + + 0xAE,0xDD,0x81,0xF4,0x33,0x62,0x06,0xA5,0x9F,0x16,0xAA,0x55,0x50,0x7D,0xF6,0x36, + + 0x20,0x42,0x6A,0x91,0x9B,0x3D,0x41,0x38,0x43,0x5F,0x19,0xC8,0xD9,0xCE,0x70,0xB1, + + 0x78,0xD1,0xBA,0xA4,0x56,0xFF,0x90,0xB4,0xF9,0x06,0xE8,0x14,0xE6,0x6D,0x1D,0x23, + + 0x39,0x6B,0x49,0x27,0x3D,0x84,0xFC,0x12,0xA8,0x46,0x83,0x74,0x33,0x9A,0x1F,0xFD, + + 0xA0,0xF2,0x3E,0xB8,0x6D,0x22,0x15,0x57,0xB0,0xE9,0xC3,0x16,0xA6,0xD9,0x2F,0xFC, + + 0x82,0x47,0x1F,0xAA,0x7A,0x64,0xED,0x13,0x28,0x64,0x26,0x0F,0xB1,0x98,0x79,0x2F, + + 0xA9,0xB7,0x42,0x8C,0x72,0xD9,0x97,0x4A,0x4E,0xA2,0x47,0xEB,0x92,0xB9,0x69,0x3C, + + 0x7A,0x09,0xB4,0xB5,0x1F,0x0B,0xB0,0x88,0xE8,0xCE,0xD8,0xCF,0x67,0xC4,0xEF,0x76, + + 0x52,0xD7,0x7C,0x73,0xEA,0xF5,0xA4,0x2B,0x90,0x4C,0x9B,0x3C,0x31,0xBB,0x54,0x15, + + 0x8F,0x4B,0x63,0x99,0x9B,0xFC,0x55,0xAC,0x28,0xF4,0xCA,0x9D,0x78,0x38,0x7E,0xA1, + + 0xE3,0xFD,0x94,0xF8,0xED,0xF8,0x32,0x3E,0x28,0x41,0x12,0xEC,0xE2,0xC1,0xE6,0xDC, + + 0x0D,0x47,0x19,0x5A,0xD3,0x9E,0xF6,0x0B,0x25,0xCB,0xE4,0xC1,0x2D,0x2F,0x1B,0x3D, + + 0x8C,0x2C,0x13,0x52,0xB4,0x8A,0x49,0xB8,0xE9,0xCD,0xDB,0x50,0x31,0x2A,0x8B,0x8C, + + 0x61,0x4D,0x6F,0xD9,0x95,0x2C,0x5D,0x0A,0xAD,0xC9,0x9B,0xE8,0x24,0xC2,0xF9,0xFB, + + 0xBE,0x8D,0xF9,0x78,0x30,0x9B,0xA0,0xDF,0xC3,0xDB,0x80,0x20,0x7E,0x8A,0x1E,0x57, + + 0xCA,0x55,0xBE,0xA4,0x65,0x73,0x4F,0x32,0xDD,0x53,0xE4,0x93,0x88,0x7E,0xE4,0xA5, + + 0xC8,0x1F,0xFD,0x81,0x59,0x21,0x91,0x90,0x92,0xFD,0xF5,0x9B,0xD2,0xCE,0x37,0x21, + + 0x30,0x52,0xC9,0xBC,0xB7,0x31,0x25,0x4E,0x4D,0x5E,0xC3,0x08,0x05,0xD8,0x7A,0x74, + + 0x54,0xBB,0x96,0xDB,0x58,0x5A,0x90,0x1F,0x8B,0x77,0x06,0xC3,0xD3,0xDB,0x6A,0x69, + + 0xAF,0xB8,0xF2,0x70,0xF9,0x36,0x8F,0x0E,0xE3,0x07,0xE4,0x33,0xB1,0x65,0x95,0xD2, + + 0xD4,0x52,0xFB,0x60,0x78,0x15,0xC2,0x1E,0x0B,0x55,0x03,0x67,0x63,0x31,0x18,0x55, + + 0xA1,0x28,0xC5,0xC1,0x7B,0x34,0x63,0x50,0x00,0x5C,0xD5,0x75,0x7C,0xDA,0xBE,0x72, + + 0x38,0x55,0xD0,0xB1,0xC7,0xE5,0x76,0x92,0xC8,0xA4,0x9E,0x0C,0x13,0xCB,0xED,0xBC, + + 0xF5,0xA8,0x9A,0x18,0x3B,0xEE,0x44,0xBC,0xE6,0xFF,0xBE,0x85,0x98,0xD6,0x78,0xCE, + + 0x76,0x87,0xD4,0x73,0xBE,0x18,0x6F,0x8E,0x15,0x55,0xA4,0x5C,0x8E,0x7F,0x28,0xA5, + + 0x35,0xEA,0x89,0x35,0x39,0xD7,0x4C,0xF9,0xE5,0xF0,0x4E,0x39,0xF7,0x4E,0xBD,0xEF, + + 0x8B,0xBD,0x16,0xDF,0x10,0x5F,0xD2,0x9B,0x48,0xD3,0x00,0x7E,0xBC,0xD1,0x9C,0x64, + + 0xC0,0x9E,0x1A,0xAF,0x59,0x9B,0x81,0x07,0xEB,0x0D,0xD8,0x0C,0x4E,0x3F,0x91,0x3A, + + 0xC0,0xB3,0x6B,0xBE,0xD0,0x98,0x0F,0xFD,0x9D,0xA1,0x05,0x7F,0xFA,0x76,0xE3,0xAA, + + 0x85,0xB9,0x1F,0x1D,0xFF,0x9B,0x61,0x58,0x83,0xBC,0x1B,0x96,0x0F,0xBC,0x8D,0xC5, + + 0xF9,0xC1,0xA6,0xAF,0x94,0x8C,0xCF,0xA6,0x03,0xFF,0x8A,0xD5,0x62,0xA2,0x3A,0x02, + + 0xFA,0x0C,0xF9,0x51,0xDF,0x32,0x0A,0xCD,0xC7,0xB4,0x38,0x45,0x63,0x64,0x41,0x54, + + 0x11,0x8F,0xFF,0xAF,0x9C,0x0F,0x8E,0xD2,0x67,0x82,0x75,0x0C,0xBF,0xED,0xFD,0x37, + + 0x07,0xBF,0xE1,0xB3,0x7C,0x52,0x79,0x40,0x66,0xCC,0xAB,0x97,0x3E,0xA7,0x24,0x74, + + 0x00,0xA6,0xD8,0xB5,0x74,0xC1,0x70,0xA2,0x0A,0x49,0xE7,0x5F,0xAD,0x69,0x97,0x3D, + + 0x7B,0x2A,0xB0,0x53,0xFE,0x26,0x58,0x63,0x24,0xBA,0x97,0x05,0x23,0x64,0x65,0xAC, + + 0x80,0xE4,0xD9,0xB4,0xFC,0x29,0x0F,0xD7,0x2D,0x25,0x25,0x9D,0xD2,0xA6,0x3D,0x3D, + + 0xF1,0x28,0x93,0xB7,0xD3,0x7C,0xB9,0xF6,0x7E,0x6A,0x06,0x88,0x36,0x64,0x9E,0x68, + + 0xCE,0x88,0xFA,0x06,0x1A,0x8A,0x86,0x55,0xEF,0xCC,0x8C,0xCC,0x3E,0x3D,0x05,0x65, + + 0xD4,0xC8,0x8A,0x0B,0xFC,0x16,0xFA,0xEE,0xF6,0xCF,0x6B,0x4D,0x6B,0x6E,0xB3,0x51, + + 0x79,0x16,0x0F,0x8B,0xD3,0x5F,0x71,0x59,0x37,0x35,0x73,0xAB,0x07,0x4A,0x13,0xF5, + + 0x21,0x86,0x1C,0xB7,0x9B,0x61,0x8E,0xBB,0x2C,0xC4,0xA1,0x4C,0xDB,0xC9,0x32,0x39, + + 0x0F,0x3D,0x1D,0xB3,0xE1,0xA8,0x26,0x98,0x6D,0xAC,0x0D,0xEA,0x5C,0xD9,0x39,0xDE, + + 0x0D,0x6F,0x3C,0xA1,0xF6,0x2E,0xF8,0x86,0xB0,0x36,0x5A,0x0D,0x21,0x3E,0x1D,0x4D, + + 0x67,0x7D,0x62,0x3C,0xF4,0x0F,0x4D,0xCB,0x2D,0xC5,0xCD,0x2F,0xA2,0x41,0x7D,0xEE, + + 0x64,0xEC,0xBD,0xEB,0x68,0x7B,0x84,0x79,0xA3,0x8D,0x85,0x78,0x7E,0x40,0x1E,0x71, + + 0x12,0xFC,0xFA,0x2E,0x3C,0x1D,0x67,0xA6,0x0F,0xE3,0x74,0x27,0xF7,0xB2,0x16,0x00, + + 0x25,0x4E,0xA4,0x92,0x9C,0x0A,0x5A,0x0A,0x66,0xC2,0x82,0x1A,0x97,0x78,0x1F,0x10, + + 0xD8,0x6D,0xF4,0xC0,0x7E,0x03,0x31,0xD0,0xDE,0xBE,0x75,0x7C,0xBC,0xA1,0xED,0x12, + + 0x26,0xD1,0x01,0xE4,0x87,0x15,0x03,0x8E,0xC6,0x43,0xC5,0x33,0xFF,0xD2,0x30,0xB1, + + 0x00,0x32,0xB6,0x62,0xFE,0x17,0x8B,0x91,0x44,0x77,0x43,0x53,0x52,0xF8,0x3C,0x76, + + 0xEF,0xB6,0xCA,0x6B,0xBB,0xF7,0xDB,0x53,0x8E,0xDD,0x58,0xB4,0xF3,0xF9,0x35,0x03, + + 0xE2,0x32,0x31,0xD4,0xB7,0xF2,0xA7,0x1D,0x32,0xD5,0xCD,0xA5,0x55,0xFA,0xB9,0x14, + + 0x4E,0x34,0x29,0x77,0x5E,0xF4,0x6A,0x00,0x63,0x7A,0x95,0x06,0x74,0xF5,0x66,0x34, + + 0xC5,0xCB,0xF5,0x71,0xD5,0xAB,0x56,0xE0,0x70,0xD5,0x76,0x2B,0x23,0xFE,0x6E,0x24, + + 0x65,0xCA,0x90,0x26,0x5D,0x99,0xF0,0x09,0xED,0x39,0x0A,0xC5,0xDE,0x52,0xE7,0x0A, + + 0x80,0xD8,0xB1,0x37,0x57,0xC9,0xF7,0x2F,0xEB,0x98,0x84,0x8D,0x25,0xF5,0x11,0x37, + + 0x4F,0x12,0xD0,0xED,0x93,0x24,0x08,0x12,0x0C,0x24,0x68,0x85,0x96,0xF3,0x00,0x6F, + + 0xC7,0x1F,0x9E,0xE9,0xD7,0xDF,0xA1,0x52,0x85,0xB8,0x36,0xAB,0x14,0xF2,0x52,0xAB, + + 0x86,0x67,0xEB,0xCF,0x0D,0x98,0x46,0x09,0x41,0x52,0x5A,0x3C,0xDC,0xF3,0x01,0x6F, + + 0xAD,0xDE,0x9F,0xDE,0x84,0x92,0x4F,0x18,0xC8,0xBB,0x9F,0x2D,0x7A,0xF0,0x58,0x72, + + 0x53,0x8C,0x73,0x5D,0x7A,0x3C,0x27,0xFE,0x06,0x9C,0xC7,0x5B,0xFF,0xFF,0x60,0x4A, + + 0xDC,0x42,0x6C,0x9B,0x11,0x22,0xA5,0x44,0xF4,0x69,0x66,0x46,0x31,0x40,0x30,0x72, + + 0xFE,0x07,0x26,0x77,0xB0,0xDE,0xD8,0xE1,0xC4,0xCC,0xF8,0x7E,0x89,0x6C,0x52,0x6D, + + 0x02,0xEE,0x3E,0x65,0xC8,0x24,0x4E,0xA1,0xB3,0x35,0x89,0x21,0xD9,0x4E,0x20,0x0E, + + 0x20,0x6D,0x32,0xD2,0x4F,0x2B,0x40,0xE0,0x66,0x01,0x81,0xE0,0x53,0x7F,0x46,0x31, + + 0x20,0xF6,0xA2,0x46,0x13,0x64,0x28,0x12,0xEE,0x4B,0x37,0xA4,0x5E,0xCF,0x4C,0xC0, + + 0x30,0x9E,0x90,0x50,0x3A,0x93,0xEC,0x92,0xA8,0x5F,0x82,0x8B,0xD1,0xC9,0x94,0x32, + + 0xEB,0x81,0xDD,0xDE,0x7B,0x5F,0xE5,0x83,0x6E,0x49,0x4E,0x9A,0x57,0xD4,0xF1,0x81, + + 0x8F,0xF8,0x21,0xCC,0xB1,0x67,0x39,0x3B,0x49,0x05,0x6A,0x97,0x7F,0x68,0xE5,0x48, + + 0x04,0x85,0x06,0x73,0x3B,0x38,0xD8,0x95,0x7B,0x4C,0x62,0x4E,0xA7,0x06,0xCA,0xD9, + + 0xE5,0x08,0xD9,0x70,0x99,0x49,0x07,0x5E,0x6A,0x09,0x25,0xDC,0x49,0x72,0x7D,0x78, + + 0x69,0xF5,0xE3,0x47,0x7E,0x68,0xAB,0xC9,0x84,0x51,0xF1,0x30,0xDB,0x00,0xCF,0x1C, + + 0x8F,0xE2,0x07,0xD4,0x89,0x86,0xB3,0xA1,0xEB,0xB9,0x0D,0x5B,0x3B,0x4B,0xB5,0x49, + + 0x16,0xA1,0xC7,0xA4,0x96,0xE1,0x01,0x8C,0x2A,0xB0,0xB2,0x3F,0xF8,0x63,0xD5,0xDA, + + 0x9A,0x21,0x82,0x94,0xF2,0x17,0x73,0xFC,0x75,0x60,0x82,0x79,0x30,0x77,0x8D,0x79, + + 0x0B,0xA1,0xBC,0xB0,0x92,0x6C,0x2D,0x6F,0x2B,0xCD,0x67,0x8F,0x33,0x74,0x6B,0xC9, + + 0x62,0xA6,0xD1,0x5C,0xB8,0x1E,0x3B,0x33,0x45,0x0D,0xDF,0xF9,0x8C,0x3A,0x86,0x04, + + 0x01,0x5D,0x74,0xE6,0x13,0x12,0xFC,0x3D,0x8B,0xBA,0x54,0x71,0x5F,0x6B,0xC3,0xB4, + + 0x03,0x50,0x4C,0x2C,0xD5,0xEA,0x43,0x90,0x67,0x11,0xFC,0xFE,0xD7,0x7C,0xC5,0xF1, + + 0xBD,0x50,0xE5,0xCF,0x56,0x3D,0xCE,0xA1,0x93,0x32,0x03,0xC3,0xB2,0x8D,0x89,0x15, + + 0xAC,0x5D,0x23,0x68,0x1A,0x48,0xB0,0x33,0x70,0xF5,0x8F,0x56,0x1A,0x37,0x7A,0xB1, + + 0x43,0x54,0xFE,0x2C,0x46,0x7B,0xE5,0x92,0xE0,0x48,0xD7,0x44,0x9F,0x95,0xF4,0x70, + + 0xC2,0xBE,0x9B,0x50,0x36,0x1E,0xAA,0x92,0x81,0x15,0x70,0x66,0x3B,0x7D,0x1D,0x2C, + + 0x91,0x8D,0xE3,0xB0,0xA1,0x32,0x21,0x03,0x60,0x4A,0xB5,0xB2,0x0B,0x7B,0x2D,0x9B, + + 0x2A,0x9C,0x0D,0xF0,0x54,0x9A,0x9D,0x73,0x72,0xE3,0x1E,0x87,0x18,0x0E,0xDD,0x37, + + 0x57,0x87,0xC6,0x77,0x3E,0xC2,0xAD,0x4A,0xC4,0xA5,0xAC,0x1C,0xB5,0xD7,0x34,0x63, + + 0x2F,0x23,0xEC,0x9D,0x38,0x89,0x0C,0xB8,0x9E,0x4B,0xB7,0x1A,0xD8,0xF9,0xB2,0xED, + + 0x1C,0x33,0xE6,0xFE,0xA3,0x54,0x6F,0x41,0xCF,0x17,0x33,0xD2,0x5B,0x7C,0xBC,0x1D, + + 0x9A,0x1B,0xB5,0x75,0xD5,0x74,0xA7,0x09,0xED,0x5D,0xE7,0x3F,0x68,0x9C,0x6D,0x2A, + + 0x86,0x91,0x43,0xAC,0x36,0xB1,0x6E,0x17,0xE8,0xB0,0x3E,0x74,0xFF,0x9C,0x76,0x26, + + 0x87,0x10,0x76,0x2F,0x28,0x3B,0x16,0xE9,0x6D,0xCE,0x26,0x14,0x23,0x32,0x3F,0x4B, + + 0x3B,0x38,0xB9,0xC0,0x89,0xDF,0xEF,0x8B,0x65,0xA8,0x8E,0xF0,0x99,0x3E,0xB0,0x5B, + + 0x3A,0x73,0xEF,0x20,0x1A,0x3C,0xC6,0x98,0x56,0xD2,0xBF,0xB2,0x64,0x70,0x1D,0x86, + + 0x17,0x45,0x6A,0xE6,0x5C,0xBB,0x72,0xCA,0x7D,0x8D,0x20,0x24,0x0E,0xE6,0x50,0xBF, + + 0xEE,0x12,0xF8,0x8E,0x19,0xC9,0x18,0xD4,0xC0,0x33,0xC0,0xC5,0xD1,0x6C,0xE1,0xBB, + + 0x56,0x26,0x81,0x61,0xB5,0x68,0x29,0x3E,0x25,0xD9,0x98,0x81,0x75,0x63,0xF2,0x10, + + 0xFA,0x8F,0xE4,0x15,0x74,0xA5,0x47,0x5E,0x2E,0x29,0xEB,0x60,0x3E,0x87,0x12,0x46, + + 0x4C,0x9F,0x9E,0x8F,0x7D,0x9D,0x23,0x86,0x26,0xEA,0xA0,0x7B,0x5A,0xE5,0x70,0x4E, + + 0x6C,0x7C,0x57,0xB6,0x5D,0xE7,0x51,0xF6,0x79,0xE8,0xA8,0x01,0x07,0xFE,0x3A,0x25, + + 0xC5,0xE6,0x65,0xC3,0xBC,0xE7,0x0F,0x65,0x27,0x45,0xF4,0x36,0x3F,0xDC,0x42,0xD1, + + 0x16,0xAB,0xBA,0xF5,0x7E,0x5E,0x7F,0xBB,0x2E,0xDD,0xDD,0x11,0x28,0xE1,0xFB,0xA5, + + 0x33,0x8A,0x8B,0x11,0xBF,0xAE,0x6B,0x1F,0xEB,0x67,0x8A,0x1E,0x58,0x17,0xEA,0xDE, + + 0x96,0xCB,0xCA,0x54,0x9F,0xA4,0x62,0x02,0x7E,0xCD,0x2C,0x58,0x20,0xE2,0x7C,0x81, + + 0xFF,0xFE,0x8A,0xB8,0xDC,0xA5,0x2D,0xC3,0xF5,0x87,0x89,0x8A,0x2B,0xF1,0x64,0x9B, + + 0xAF,0xE9,0xF3,0x8A,0x1F,0xB7,0x83,0xC4,0xEC,0x0A,0xBF,0x41,0xFE,0x8B,0x38,0x10, + + 0xAD,0xE9,0x19,0xB6,0x1E,0x21,0x00,0x7B,0xD5,0x67,0x5C,0x15,0xFF,0x1D,0xC2,0xC7, + + 0xEE,0x8B,0x39,0xDC,0x8E,0x81,0x64,0xF8,0xDE,0x8A,0x9A,0x29,0xA6,0xE2,0x59,0xA9, + + 0x65,0x27,0xF5,0x3A,0x61,0x33,0xEC,0x31,0x2F,0x61,0x8B,0x6D,0x96,0x63,0x42,0xEC, + + 0x86,0x38,0x93,0x78,0x62,0xA0,0x79,0x99,0xC9,0x15,0xC5,0xB6,0xFF,0x82,0xFD,0x2D, + + 0x1B,0x92,0xFD,0xBA,0x93,0x1F,0x1D,0x29,0xC7,0xB5,0xEE,0xA2,0xD7,0xF4,0x95,0xCC, + + 0xA7,0x95,0x9C,0x14,0xA4,0x17,0xDF,0x30,0xF4,0x36,0xE6,0xB7,0xD6,0x7C,0x8A,0xEC, + + 0x79,0x4E,0x38,0x74,0xDD,0x9B,0x9E,0x41,0xE2,0x39,0x37,0x25,0x65,0xB5,0xE5,0xF1, + + 0xE6,0x63,0x95,0x69,0x19,0xBE,0x05,0x01,0xE1,0x53,0xDD,0xE0,0x50,0xFC,0xDF,0x20, + + 0x8A,0x69,0x5C,0xCE,0xDF,0x5D,0x14,0xA8,0x88,0xDB,0xCE,0x64,0xEB,0xFF,0x54,0x28, + + 0x8B,0x98,0x72,0x1E,0xB5,0xA9,0x78,0xB2,0x6D,0x7E,0x3C,0x02,0x72,0xB7,0x1D,0x41, + + 0x37,0xF0,0x9F,0xA7,0xBA,0x12,0x4B,0x2A,0x69,0x50,0x8D,0x18,0x81,0xB4,0x12,0x51, + + 0x36,0x3B,0x45,0xA5,0x14,0xB1,0x60,0xF6,0x06,0x78,0x36,0x3E,0xD7,0x05,0x59,0x72, + + 0x2C,0x3C,0x59,0x0C,0xAD,0x8E,0x0C,0x42,0xA8,0x97,0x76,0xEF,0xC8,0x05,0x7C,0x1E, + + 0x66,0xDD,0xD1,0x1A,0x79,0x9A,0xBA,0x3E,0x1F,0x80,0xB2,0xFD,0x94,0xC3,0x3B,0x2E, + + 0x64,0xD3,0x9F,0x75,0x10,0xB7,0xF7,0x13,0xA9,0xD0,0xAD,0xAE,0xDD,0xBA,0xF4,0x34, + + 0xD2,0x99,0xB3,0xBD,0x3F,0xA7,0xFF,0x03,0x91,0x04,0xA7,0xBB,0xF4,0xD7,0x5D,0x28, + + 0x82,0x21,0xCF,0x8D,0x9F,0xB3,0x3B,0x02,0x1A,0x93,0x72,0x9C,0x95,0x16,0xDA,0xA5, + + 0x8C,0xF8,0x96,0x5C,0xAE,0x69,0x08,0x18,0x46,0x6B,0x34,0x1C,0x4C,0xF9,0x1F,0xEC, + + 0x5B,0x91,0x53,0xAD,0xF7,0xA4,0x09,0x9A,0x6C,0xC2,0x97,0xA5,0x7C,0x53,0x54,0x39, + + 0x03,0x22,0x2F,0x67,0x99,0xD3,0x26,0xCE,0x4A,0xB1,0x47,0x9F,0xF3,0xF2,0x02,0xE2, + + 0x04,0x7A,0x80,0xF7,0x2E,0x05,0x68,0xA2,0x12,0xA4,0xD8,0xBC,0xB9,0xBA,0x50,0x14, + + 0x88,0x4E,0x90,0x24,0xEE,0xDE,0xFE,0x33,0xFF,0x65,0x34,0xAB,0x52,0x23,0x31,0xE9, + + 0x0A,0xCF,0xF9,0x14,0xB6,0x8F,0x07,0x43,0xEF,0x66,0xD3,0xDA,0x39,0xA1,0xC9,0xAC, + + 0x2E,0xD7,0xB3,0xA5,0x6E,0xFC,0xA5,0x12,0x8D,0x66,0x59,0x61,0xFE,0x0F,0x48,0x5C, + + 0x04,0xCC,0xDA,0x6A,0x33,0x06,0xBC,0x13,0x70,0xB2,0xD2,0x56,0x32,0xF6,0x9C,0xB6, + + 0x13,0xA8,0xD0,0x59,0xFA,0xDC,0x66,0xC5,0x22,0x41,0x1C,0xA9,0xD1,0x79,0x61,0x81, + + 0xCE,0xAB,0xFF,0x38,0xF3,0x51,0xEA,0x11,0x42,0x59,0x11,0xE4,0x0C,0x24,0x1B,0xB7, + + 0x0A,0xEB,0xD3,0x7A,0xB2,0x87,0x38,0x31,0x9C,0x9A,0x77,0x2E,0x70,0x02,0x57,0x17, + + 0x3E,0x4A,0x42,0x58,0x29,0x85,0x04,0x0B,0x6F,0x6D,0xAC,0x80,0x92,0x61,0xBE,0x7A, + + 0xE2,0x1A,0xE8,0x1D,0x1A,0x69,0x90,0x48,0xA0,0x93,0xF8,0x3C,0xB2,0xDA,0x89,0x29, + + 0x63,0xE9,0xD5,0x6D,0xC8,0x44,0x23,0x0A,0x4D,0x08,0xED,0x91,0x31,0x59,0x35,0x79, + + 0x36,0x50,0xBF,0xFF,0x9F,0xE3,0x59,0xC2,0x20,0x88,0xB7,0x68,0x91,0x28,0xAE,0x3B, + + 0x68,0xAA,0xFC,0x31,0xF8,0x7B,0xE2,0x1F,0x44,0xD3,0xED,0x8E,0x31,0x63,0xC0,0x18, + + 0x08,0x4D,0xDB,0xD8,0x15,0xC9,0xCB,0x5E,0xA6,0x2F,0x19,0xF8,0x51,0x9B,0x17,0x3A, + + 0xA8,0x4C,0xC1,0x3E,0xFF,0x2A,0xEC,0xEC,0x31,0xE3,0xD1,0x12,0x3A,0xEF,0x67,0x27, + + 0x62,0x9C,0x34,0xEF,0x13,0x8F,0xA0,0x0A,0xF7,0x2D,0x1B,0xED,0xC3,0x69,0x03,0x04, + + 0x2C,0x53,0x28,0xF7,0x48,0xC6,0x2E,0x10,0x9F,0x12,0x92,0x00,0x13,0xAF,0x53,0x81, + + 0x27,0xD9,0x6F,0x67,0x41,0x73,0xFC,0x70,0x27,0xFC,0xC6,0x4B,0x1B,0x42,0xA6,0xB9, + + 0x7C,0xA3,0xFB,0xBC,0x59,0xA3,0x9F,0x74,0xE6,0x9A,0x83,0x09,0x1B,0x21,0xB9,0x68, + + 0xB1,0x51,0x07,0xE5,0x58,0x90,0x05,0x81,0x16,0xAC,0xE3,0x1C,0x18,0xD0,0x25,0x80, + + 0x26,0x38,0x62,0x46,0xA3,0x18,0x6A,0x45,0xC5,0x44,0xD5,0x82,0xDE,0xC8,0xC6,0x99, + + 0x82,0x9C,0xAC,0xD6,0x4C,0x38,0xF2,0x8E,0xC2,0xD5,0x1C,0x75,0xFB,0x73,0xFE,0x82, + + 0x13,0x54,0xBD,0xE2,0x53,0x39,0x6B,0x51,0x45,0x50,0xAD,0xC2,0x0B,0x79,0x49,0x31, + + 0xA7,0x3B,0x9D,0xB3,0xBF,0x75,0x25,0x75,0xA6,0x6F,0xF3,0xB4,0x52,0x88,0x82,0x2C, + + 0xFC,0xC9,0x9E,0x10,0xD1,0xE2,0x28,0x19,0xE5,0xAE,0xCE,0xA8,0xF1,0xA5,0xBD,0xA0, + + 0x1A,0x59,0x22,0x07,0x3A,0xBB,0xDE,0xEC,0xF7,0xFA,0xB2,0xC2,0x7F,0xB1,0xA0,0xB4, + + 0x41,0xAB,0xC5,0x76,0x51,0xF9,0x1F,0xAD,0x40,0x55,0xA9,0x19,0xDB,0x3A,0xA4,0xBF, + + 0x44,0x79,0x4F,0xC9,0x27,0x98,0x4A,0x4A,0xD7,0x7E,0x7A,0x0C,0xC3,0xD4,0xFD,0xBB, + + 0x58,0xBD,0x56,0xC0,0xB8,0x38,0x96,0x74,0xC5,0xA9,0x62,0x8E,0xF8,0x60,0x8E,0x8C, + + 0x47,0xB2,0x4A,0x58,0x1D,0x0E,0x95,0x84,0xEB,0x1F,0x61,0x1E,0xF9,0xB1,0x7F,0x36, + + 0x43,0x6D,0x18,0xAF,0x9A,0x73,0x86,0xD7,0xD0,0x1C,0x7A,0xB2,0x59,0x1B,0xDE,0xFE, + + 0x0A,0xB0,0xAF,0x4F,0x9B,0x32,0xB3,0x8A,0x89,0xF9,0x09,0x9F,0x04,0x1A,0x20,0x3C, + + 0x3E,0x75,0x7C,0x25,0xB7,0x00,0x9C,0xB9,0x47,0x62,0x8E,0x46,0xAF,0x7B,0xE8,0x17, + + 0x23,0x75,0x16,0x93,0xFE,0xA2,0x47,0x41,0x23,0xAD,0x83,0xB2,0x10,0x2B,0xF0,0xF8, + + 0xF7,0x82,0x71,0x74,0xE4,0xE7,0x0F,0xFF,0xA4,0x1D,0xB1,0x16,0x75,0x1D,0xFB,0x2D, + + 0xBF,0x76,0x97,0x2E,0x9B,0x0C,0x5E,0x73,0xC1,0xE6,0x87,0x83,0xF4,0xE1,0x1A,0xA2, + + 0x0A,0x29,0xBE,0x3B,0x04,0xA0,0x67,0x91,0x24,0x19,0xD9,0x2D,0x8B,0xEB,0x56,0xEA, + + 0x6F,0x88,0xEE,0x24,0xFC,0x5C,0x46,0xC2,0x8D,0x34,0x3C,0x61,0xB5,0x5C,0xB4,0xB1, + + 0xA7,0x34,0xA4,0x38,0x74,0xE2,0x22,0x90,0xE8,0xA8,0x45,0x18,0x75,0xA4,0x96,0x20, + + 0xB9,0xC5,0xC9,0xD7,0x6A,0x20,0x47,0x4F,0xC1,0x0F,0x3A,0xF5,0x46,0x8B,0xF3,0x51, + + 0xB1,0x34,0xF6,0x7D,0x64,0x7D,0x4A,0x59,0x7A,0x39,0x72,0x7A,0xDA,0xE2,0xFA,0x01, + + 0x67,0x32,0x1A,0x69,0x13,0x75,0xAA,0x2B,0x6B,0x64,0x84,0x92,0x25,0x46,0x78,0x0B, + + 0x8A,0xEA,0xB0,0xE7,0x90,0x76,0x4D,0x93,0x39,0xCE,0x36,0xAB,0x99,0x81,0xAD,0x9F, + + 0xC8,0xEE,0x6F,0xD5,0x2E,0x54,0x23,0x0B,0x32,0x34,0x68,0x45,0x5D,0xBA,0xE8,0x7F, + + 0xF9,0xE9,0x46,0x5F,0x75,0x55,0x7A,0x2A,0x70,0x8E,0x32,0xEF,0x0F,0xF7,0x54,0xFF, + + 0x6E,0x89,0x98,0x4C,0x13,0x06,0x2C,0x3A,0x67,0x8F,0x42,0xFA,0x55,0xE9,0x5B,0x0C, + + 0x44,0x0D,0xA6,0x4D,0xD2,0x53,0xF9,0x4B,0xC8,0x06,0x64,0x09,0x29,0xFE,0x12,0x25, + + 0xEE,0x8B,0x74,0xD3,0x99,0xCD,0xF1,0x79,0xCC,0x2F,0xA2,0x5B,0x7A,0x50,0x8F,0x07, + + 0xB7,0x8F,0xF1,0x75,0x0A,0xDC,0x4C,0xB3,0x42,0x7D,0x61,0x5A,0x74,0x5D,0x16,0x61, + + 0x03,0x3C,0x7F,0xE5,0x0F,0x67,0x06,0x36,0x20,0x1B,0x6F,0xC8,0x1F,0xC2,0x5B,0x22, + + 0x70,0x91,0x9B,0x2B,0x6A,0x1D,0x2D,0x93,0xEC,0x2D,0x64,0x96,0xD5,0x5D,0xFD,0xD4, + + 0x67,0x83,0xD3,0x2E,0x3C,0x5B,0x03,0x07,0xC4,0x71,0xC3,0x0E,0x7C,0x1B,0xF1,0xB1, + + 0x50,0x35,0x1B,0xE1,0x97,0xB2,0x20,0x91,0x44,0x96,0xCC,0x64,0xE7,0x48,0xAC,0x86, + + 0x4B,0x4A,0x58,0xA9,0x94,0xB3,0xBC,0xA6,0x7E,0x97,0x84,0x1E,0x53,0xB8,0x5D,0x3C, + + 0x4F,0x25,0xCC,0x80,0x6B,0xB9,0xFF,0xA3,0xE7,0x16,0x5A,0x05,0x5A,0x0B,0xD9,0xB1, + + 0x58,0xF9,0x8F,0xF3,0x16,0x48,0xBE,0x14,0xAF,0x94,0x06,0xFF,0x52,0xEC,0x6E,0x0D, + + 0x4F,0x67,0xA0,0x2A,0x5F,0xF8,0xDA,0x38,0x64,0xD2,0x76,0xFA,0x65,0xF5,0x10,0x3E, + + 0xCF,0x89,0x94,0x2F,0x07,0x16,0xEF,0x29,0x4C,0x76,0x92,0xC0,0x7B,0x31,0x59,0x26, + + 0x47,0x09,0xB1,0x23,0x57,0xE9,0xB7,0x88,0x4F,0x77,0xAD,0xAE,0xDF,0xBA,0x2F,0xDB, + + 0xA9,0xBE,0xFA,0x1B,0xF8,0xFD,0x6C,0xC8,0xD7,0x5D,0xAF,0x3B,0xB8,0x58,0x58,0x62, + + 0xE4,0xED,0x52,0xAC,0xBC,0xA0,0x52,0x87,0x4A,0x57,0xE0,0x6A,0x74,0x77,0x17,0xA9, + + 0x41,0x14,0x51,0x3C,0x0C,0x5C,0xCD,0x53,0x69,0x57,0xFF,0x98,0x4C,0xAC,0x59,0xE7, + + 0xCF,0x9A,0xC9,0x90,0x1D,0xDB,0x73,0x09,0x12,0x8D,0xAE,0xD2,0x5B,0x21,0x4F,0x51, + + 0xAE,0x46,0x57,0x20,0xD4,0xB0,0x00,0xDF,0x06,0x26,0x3F,0x7E,0x9C,0xBE,0xA7,0x3D, + + 0x33,0x53,0x3A,0xFB,0x73,0x73,0x40,0x81,0xC0,0xC0,0x2F,0xA0,0x52,0xD9,0x55,0xF6, + + 0x07,0x43,0x73,0xD3,0xCF,0x29,0xD8,0xB4,0x3B,0x95,0xF8,0xA6,0x71,0x6C,0x5A,0x01, + + 0xB7,0xFA,0x97,0xA5,0x23,0xEF,0x57,0x81,0xC8,0x13,0xEF,0x22,0xF8,0xDD,0x6A,0x93, + + 0x18,0x6E,0xC9,0xE5,0xA7,0x82,0xC9,0xC2,0xEF,0x97,0x62,0x12,0x70,0x65,0x78,0xC2, + + 0xC0,0xC7,0xBE,0x6C,0x14,0x06,0x09,0x58,0xE7,0x4D,0xC3,0x97,0x2A,0xCB,0x30,0x74, + + 0x30,0x34,0x08,0xD5,0x69,0x28,0x76,0xC4,0xE2,0xBA,0x27,0x07,0x63,0x09,0xEE,0xA3, + + 0x2E,0xFB,0x96,0x27,0x79,0x77,0xD1,0x7F,0xF6,0x40,0xC0,0x8D,0xBE,0x2B,0x12,0x51, + + 0xF8,0x07,0xB7,0x78,0x95,0x05,0x27,0x5C,0xF0,0xA6,0x3E,0xB5,0x85,0xCA,0x3A,0xF6, + + 0xA4,0x05,0xD6,0xE6,0xDD,0xF5,0x40,0xDB,0x22,0xC5,0xF0,0x8C,0x5E,0x2A,0xA9,0xB0, + + 0xE2,0x3A,0xDA,0xF6,0xDC,0xD4,0xF6,0xAB,0x63,0x43,0xF8,0x04,0x5F,0xEB,0xA0,0xBD, + + 0x63,0xE9,0x29,0xFD,0xAE,0x8B,0x6D,0x89,0x21,0x49,0xE3,0x6D,0xC8,0x6C,0x51,0xE6, + + 0x62,0x48,0x21,0x0C,0xB3,0x2F,0x57,0x4A,0xEB,0x09,0xC8,0x7D,0xDA,0x6D,0x9F,0xB7, + + 0x3D,0xF4,0x95,0x2E,0xF1,0xBD,0xEA,0xF8,0xBD,0xE3,0xC5,0xE8,0x58,0xD6,0x95,0x4C, + + 0x0D,0x4D,0x0A,0xDD,0x5A,0x20,0x62,0x83,0xC4,0xBB,0xE4,0x54,0x5D,0x6F,0x1E,0xBF, + + 0xFD,0x0E,0x99,0xE0,0xF2,0x3F,0x40,0xEB,0x03,0x3D,0x13,0xED,0xB0,0xD1,0x68,0xA8, + + 0xE6,0xF0,0x34,0xAF,0xBA,0xAF,0x53,0x75,0xF8,0xDE,0x94,0xF9,0xD1,0x2F,0x0C,0x04, + + 0x22,0xF2,0xFD,0xF2,0x36,0x32,0xB3,0x11,0xA8,0x53,0x9C,0xAC,0xF2,0xF6,0xCC,0x4C, + + 0x3B,0xCC,0x73,0x65,0x92,0xB1,0x5C,0xAC,0x9E,0x3D,0x94,0x85,0xF3,0xF7,0xFA,0x05, + + 0xA6,0xF7,0x8D,0x01,0xB2,0xD0,0xC0,0xD2,0xC2,0x10,0x06,0x21,0xB2,0xE1,0x25,0xF3, + + 0x5C,0x1F,0xB3,0x35,0x51,0xB2,0x7B,0x04,0x14,0xF5,0x0E,0x31,0xFF,0xFC,0x1A,0xB5, + + 0x26,0x3D,0x86,0x37,0x4A,0x9F,0x6E,0x13,0x5A,0x52,0x4A,0xF0,0x56,0xD9,0x8C,0xC4, + + 0x3F,0x54,0xF6,0x27,0x0B,0x33,0xCD,0x18,0x0F,0x18,0xE6,0x07,0x43,0xFE,0xE9,0x45, + + 0xAC,0xF2,0x5B,0xD4,0x9B,0x5A,0x7B,0x4C,0x43,0xF9,0x4B,0x17,0xD3,0xC7,0x3C,0x6D, + + 0x8F,0x40,0xE3,0x61,0x12,0x98,0x1F,0x02,0xDF,0xFC,0xC8,0xC4,0xC3,0x68,0x3E,0xFB, + + 0x0A,0x5A,0x94,0x08,0x3A,0x38,0xC4,0x68,0x24,0x8C,0x9E,0xB4,0xFA,0xFE,0x35,0x1C, + + 0x7E,0x2B,0xB0,0x3C,0xD9,0xB8,0x4E,0x00,0xE6,0xA4,0xA6,0x23,0x88,0xAF,0x47,0x95, + + 0xAE,0x38,0x78,0x7C,0x1B,0xBA,0xC5,0xB6,0x86,0xFE,0x47,0xCF,0x0B,0x1F,0xCF,0x09, + + 0xC3,0x15,0x1D,0x19,0xBB,0x2C,0x79,0x10,0x1C,0xFD,0x97,0x3C,0xFF,0x39,0x4E,0xEC, + + 0xAB,0xC6,0x57,0x3F,0x06,0x93,0xC8,0xED,0x43,0x30,0x6C,0x13,0x99,0x75,0x47,0xA9, + + 0x07,0x4A,0xF6,0x23,0xD2,0x2C,0x3E,0xAB,0x55,0x50,0xD6,0x78,0x79,0x9F,0xD7,0xB0, + + 0x87,0x7F,0xD6,0x4F,0x73,0xDD,0x0E,0xC8,0x4F,0xA1,0x92,0x92,0xFC,0x7C,0xD5,0xFD, + + 0x68,0xA6,0x63,0x42,0xB8,0x4D,0xA4,0x84,0xC8,0xBF,0x20,0x0C,0x58,0xFF,0x5E,0xA7, + + 0x37,0x61,0x4C,0x17,0x36,0x0D,0x70,0x62,0x42,0xC2,0xD2,0x1E,0x52,0x82,0x56,0xB2, + + 0x36,0x60,0x68,0x92,0xE8,0xA7,0xEC,0x4C,0x8F,0x82,0xDA,0x96,0xF4,0x7E,0x99,0x93, + + 0x6F,0xA1,0xF1,0xB5,0xD4,0x9E,0xF7,0xDC,0x49,0x64,0xCB,0x67,0x84,0xE4,0x91,0x54, + + 0x8B,0x7C,0xCB,0x37,0x93,0xE1,0x71,0x26,0x11,0x80,0x0D,0x55,0x0B,0x7E,0x5E,0x3F, + + 0x67,0xD1,0x47,0x7F,0x96,0x64,0xC8,0xD0,0x4E,0x44,0x1C,0xFD,0xE3,0x72,0x72,0xFD, + + 0x26,0xF5,0x96,0x6F,0x97,0x47,0x21,0x4A,0xE2,0x42,0xEF,0x67,0x67,0xE1,0x79,0xC2, + + 0x6F,0x7F,0xB8,0x72,0x33,0x24,0x56,0x5B,0x46,0x56,0xF9,0x62,0x1E,0xF7,0x57,0x2E, + + 0xE6,0xF2,0xD3,0xA4,0xAF,0xA1,0xF9,0x67,0x45,0x6B,0x90,0x08,0x95,0x48,0x1C,0xAA, + + 0x83,0x7E,0xAC,0x8C,0xDE,0xE9,0x95,0x8F,0x84,0xCB,0x51,0x6E,0x2E,0xEE,0x30,0x1B, + + 0x2E,0x11,0xD2,0x6C,0xF6,0xAA,0x6C,0x44,0x87,0x4A,0x0E,0x5C,0xDF,0x6F,0x2B,0xCF, + + 0x65,0x7B,0x0C,0xED,0x30,0x57,0xE2,0xEC,0x31,0x6C,0xD1,0x0B,0x7D,0x35,0x15,0xBB, + + 0x8B,0x89,0xF1,0xB3,0xF5,0xA8,0x33,0x2E,0x19,0x48,0x6B,0xBB,0xDB,0xEC,0x7A,0x5B, + + 0xE7,0x75,0xCC,0xE3,0xBF,0x03,0x21,0x08,0xA5,0x5D,0x61,0x9F,0x33,0x2C,0x14,0x73, + + 0x3C,0x6C,0x7F,0x79,0xBE,0x02,0x40,0x89,0x77,0xCB,0xDA,0x7A,0xBE,0x12,0x11,0xE5, + + 0xDA,0x03,0x72,0x68,0x3F,0x01,0xD0,0x52,0xE7,0xA6,0xD3,0x76,0xA1,0xCE,0xD3,0xCB, + + 0x64,0xDE,0xF8,0xB7,0xF3,0xE2,0x55,0xCF,0x4F,0x0F,0x3B,0x5F,0xDF,0x44,0x1C,0x7D, + + 0xA7,0x9D,0xA2,0x26,0xDD,0xB3,0x65,0xE2,0x28,0x04,0x0B,0x24,0xB6,0xF3,0x8F,0x22, + + 0xF9,0x32,0x3B,0x76,0x6F,0xAA,0x6C,0x0B,0x2D,0xD2,0xDE,0x12,0xA8,0xFE,0xDE,0x07, + + 0xAF,0x58,0xD7,0x97,0x7F,0x1F,0x64,0xBC,0xDE,0x76,0x75,0x23,0xBD,0xF4,0xC1,0xE0, + + 0xCF,0x35,0x3B,0xF1,0x4A,0xF1,0x1D,0x99,0x04,0x7C,0x09,0xC8,0x56,0xB1,0xF0,0x74, + + 0x5B,0xD5,0xDA,0xEB,0x30,0xB6,0xD7,0xCB,0x0D,0xC5,0xCA,0xCE,0x96,0x75,0xB2,0xD2, + + 0x27,0xF4,0x2C,0x56,0x6C,0xF7,0xEE,0x94,0x12,0xDE,0x03,0x85,0x47,0xB7,0x4D,0x37, + + 0x8A,0x07,0x66,0x38,0x5F,0xA7,0x71,0xE1,0xF8,0xCD,0xE5,0x63,0xF4,0xF6,0xC1,0xA1, + + 0x4C,0xA6,0xAD,0x66,0x3A,0x41,0x3D,0x80,0x9E,0x50,0xBD,0x51,0xBF,0xE6,0xF2,0xF9, + + 0x4E,0x3E,0xE6,0xD7,0x3A,0xDA,0x66,0xB9,0x4E,0xFB,0x76,0xD1,0xFE,0x7E,0x7C,0x3E, + + 0xE5,0x3A,0x81,0x7C,0x91,0x04,0x3C,0x7A,0x09,0x52,0x01,0x5C,0xFF,0xC5,0xF7,0x4B, + + 0xBC,0x3E,0x68,0x0D,0x7E,0x39,0x09,0x0A,0x61,0x5C,0xE5,0xF0,0x5F,0x9F,0xFB,0x99, + + 0xE5,0x3F,0xD7,0x6E,0x1E,0xFB,0xEE,0x8A,0xC7,0xC4,0x03,0xDD,0x02,0x9E,0x18,0xE6, + + 0xAC,0x30,0xDD,0x50,0x3D,0xDC,0xF2,0xE7,0xEC,0x70,0xC8,0xC6,0x9C,0x3C,0x40,0x77, + + 0x8E,0x42,0xFF,0xDC,0xA8,0xBB,0x20,0xD2,0x6B,0xD9,0x68,0x0F,0x02,0x02,0xB5,0xA9, + + 0x51,0x98,0xC1,0xE7,0x82,0x1E,0x24,0x89,0x05,0xEF,0x1D,0xCB,0x1F,0x51,0xC3,0x44, + + 0xAC,0x7F,0xC1,0x6A,0x1E,0x10,0x79,0x89,0x04,0xEE,0xA6,0xCA,0x5A,0x93,0x62,0x05, + + 0x03,0x40,0x40,0x35,0xD5,0x62,0x70,0x76,0x7B,0x9D,0xAE,0x10,0x73,0x25,0x54,0x62, + + 0xEA,0xA0,0x8E,0x90,0x4D,0xDC,0x78,0x66,0x7A,0x4C,0xA6,0x5C,0xDC,0xE7,0x35,0xB7, + + 0x86,0x4A,0x8E,0xE6,0xB0,0x62,0x69,0x06,0x3D,0x4D,0x97,0x14,0x50,0xB4,0x77,0x25, + + 0x7D,0xC2,0xA9,0xFF,0xEE,0xBF,0xB5,0xB4,0x62,0x26,0x9D,0x75,0xF9,0x65,0x80,0xD2, + + 0x04,0x46,0x00,0xC0,0xD0,0x66,0x94,0xC8,0x44,0x46,0x94,0x25,0xBB,0xB5,0x4C,0x52, + + 0x07,0xFE,0xF0,0xAF,0xEE,0x9C,0x23,0x57,0xE2,0xFA,0x4D,0x50,0xBA,0x34,0xBF,0x01, + + 0xC2,0xFD,0x81,0xB2,0x61,0x43,0x97,0xE5,0xC0,0x49,0xA9,0x74,0xA6,0x4A,0x49,0x4E, + + 0xA1,0xDC,0x91,0x51,0x66,0xBE,0xE6,0x08,0xE0,0x07,0xCF,0x4D,0xBB,0x6A,0x58,0x59, + + 0x74,0xA7,0x59,0x0C,0x1E,0x70,0x2A,0xAD,0xEB,0xC5,0x38,0x9C,0xF9,0xEF,0x74,0x1F, + + 0xE8,0x06,0xB0,0xEF,0x46,0xD2,0x3B,0xBC,0x47,0x22,0x05,0x38,0x0F,0xB6,0xA3,0x7B, + + 0xEA,0xA6,0x02,0x89,0xB1,0x47,0x6D,0x55,0x4A,0xE6,0xDD,0x39,0x10,0xF3,0x51,0x71, + + 0xF5,0xA4,0x3A,0xE3,0x9F,0x73,0x7B,0x6A,0x88,0x46,0xA5,0x45,0x99,0xC4,0x6C,0xB5, + + 0x34,0x77,0x9A,0x48,0xA6,0x2F,0xE9,0x10,0x69,0x0C,0xC0,0xF1,0xB1,0x28,0x85,0xD2, + + 0x7C,0xA1,0xD1,0x62,0x35,0xD8,0xC7,0x18,0x35,0x98,0x7E,0x58,0x68,0xB6,0xC1,0xB0, + + 0x75,0x4C,0xFD,0xED,0xA7,0x27,0xE6,0x54,0x23,0xBF,0xE9,0xDD,0x47,0xC1,0x94,0xED, + + 0xB4,0xAF,0x99,0xD9,0xD9,0x7D,0x0F,0x46,0xED,0x0D,0x61,0x4D,0xBA,0xC0,0x7C,0x68, + + 0x18,0x5D,0xF9,0x7F,0xE1,0xED,0x2C,0x22,0xA9,0xD3,0xF4,0xF2,0x4B,0x7D,0x5C,0x14, + + 0x2B,0xCE,0x2C,0x64,0xF3,0x73,0x5C,0xBA,0x67,0x13,0x3B,0x9D,0xA1,0x20,0xFE,0x89, + + 0x05,0x09,0xAE,0xB5,0x90,0x9D,0xD5,0x25,0xF6,0x10,0x76,0x81,0x24,0x63,0x6D,0xC7, + + 0xCF,0x1C,0xC9,0x94,0x0E,0x9E,0xE8,0x76,0xE7,0xF3,0xBA,0x98,0x6D,0xE2,0x84,0x45, + + 0x10,0x56,0xDB,0xB7,0x4B,0xB3,0xC1,0x86,0x9D,0x38,0xAA,0xE3,0x56,0xFF,0x87,0x59, + + 0xF7,0x36,0xEC,0xF4,0xDA,0x8C,0x06,0x44,0x1F,0xFA,0x7C,0x86,0x11,0x09,0x05,0x54, + + 0x5D,0x54,0xC1,0xD5,0x81,0xF7,0x37,0xF0,0xE1,0xE6,0x32,0xD4,0x8E,0xD9,0xEA,0x75, + + 0xA5,0x55,0xBF,0xD1,0xE5,0x2C,0xFD,0x83,0x81,0xFB,0xA3,0xF2,0xD7,0xDC,0xB2,0xF7, + + 0x8B,0x5A,0x14,0xBD,0x99,0xC7,0x11,0xE8,0x64,0xF3,0xAC,0x5F,0x01,0xD7,0x16,0x9C, + + 0x81,0x2F,0xD4,0xFB,0x45,0x96,0x97,0x3C,0x6B,0xFA,0x9F,0x5A,0x92,0xDA,0x56,0x67, + + 0x55,0x95,0xB9,0xBC,0x96,0xE5,0x8C,0xA8,0xEE,0x58,0x0E,0x45,0xC4,0x35,0xCF,0xC5, + + 0xEE,0x11,0x2F,0x6D,0x28,0xE8,0xDF,0x3D,0x9B,0xA4,0x38,0xBB,0x2D,0x1F,0x20,0x4C, + + 0x28,0xBA,0xD1,0xCE,0x74,0x91,0x28,0xEF,0x83,0x8D,0xAE,0xF1,0xBA,0xB3,0x0E,0x4D, + + 0xD4,0x5F,0xC8,0xB0,0xD2,0x64,0x5C,0x1E,0x6D,0x5F,0x59,0xEE,0x5F,0xD2,0x87,0x4C, + + 0xA3,0x5C,0x97,0x7F,0xB2,0x9C,0x2F,0x01,0xD6,0x13,0xE9,0xD0,0x91,0x71,0x84,0x50, + + 0x7F,0x7C,0xBD,0xDC,0xFB,0x24,0xEF,0x7D,0xE5,0x77,0x7B,0x9F,0x0C,0x1A,0x80,0x70, + + 0x66,0x2C,0x21,0x74,0xFF,0x01,0x50,0x71,0x49,0x82,0x2F,0xCE,0x38,0xAD,0x50,0x03, + + 0x61,0x2C,0x10,0xE9,0x98,0x0C,0x19,0xB0,0x8C,0xE9,0xD8,0x7C,0xDC,0xEE,0x5F,0x04, + + 0xE7,0x7D,0xDF,0x33,0xA7,0x43,0xF1,0xAF,0xC2,0xC0,0xCF,0x52,0x3D,0x1B,0xBB,0xF3, + + 0x81,0x23,0x3B,0x88,0x7C,0x02,0xF9,0xB7,0x33,0xAF,0x0D,0x45,0x76,0xA2,0x3F,0xBD, + + 0x00,0x7E,0x86,0xE2,0xE3,0x02,0x32,0xEE,0x8C,0x47,0x50,0x14,0x34,0x98,0x36,0x6E, + + 0x0F,0x28,0xBA,0x67,0xB6,0x5A,0x2C,0x01,0x61,0x64,0x6F,0x47,0xF6,0x44,0x00,0x31, + + 0x6D,0x37,0xB5,0x07,0xC1,0x0B,0xCA,0xF0,0xE8,0xCE,0x8F,0x60,0xF2,0x4B,0x7A,0xC3, + + 0x78,0x2A,0xD7,0xF2,0xB9,0x78,0x41,0x8C,0x2E,0xE4,0xC1,0x47,0x7A,0x48,0x34,0x7A, + + 0x2C,0x20,0xC0,0x0E,0x1F,0x22,0xF2,0x3B,0x14,0xC0,0xEC,0x5A,0xA3,0x43,0x6E,0xEC, + + 0x8F,0x25,0xF3,0x1A,0x90,0xCA,0x02,0xC4,0xE1,0xC4,0x71,0xB7,0xD0,0xEF,0x35,0xEB, + + 0x43,0xC8,0x9D,0x3B,0x68,0x0B,0x27,0xA9,0x05,0x85,0x2C,0xD0,0xF8,0xA8,0x27,0xF9, + + 0x21,0x76,0x00,0xBA,0x48,0xB5,0xC4,0xB9,0x04,0x68,0x11,0xD3,0x7C,0x1D,0xF1,0x0D, + + 0xD0,0x84,0x0E,0x31,0xD4,0xEF,0xA6,0x94,0xC1,0x31,0x52,0x1C,0x3C,0xB0,0x7F,0x5C, + + 0xC7,0x9C,0x6A,0x4F,0x75,0x00,0xAE,0xBA,0x4B,0x6D,0x4C,0x4F,0x67,0x42,0xE3,0x28, + + 0x16,0x2A,0x58,0xDC,0xB4,0xA4,0x15,0xDB,0x3B,0x68,0x8D,0x68,0xFA,0x65,0xCF,0xDF, + + 0x8D,0x29,0xBB,0xBF,0xDD,0x0F,0x2D,0x74,0xB3,0xD4,0x5B,0x0D,0xBD,0x93,0xA4,0xA1, + + 0xC2,0x3D,0xDA,0x81,0x81,0xBF,0xF4,0x93,0x8A,0xD8,0x8C,0x58,0xD8,0xFD,0xAC,0x91, + + 0x8A,0x97,0x3C,0xAF,0xDE,0xF5,0xFC,0x33,0x7D,0x93,0x9A,0x9E,0xF9,0xB3,0x38,0xF3, + + 0xAC,0x9B,0x11,0xE8,0x17,0x39,0xB0,0x27,0xE6,0x13,0x4A,0xB4,0xCC,0xB6,0x87,0x26, + + 0x04,0x4C,0xF7,0x05,0xC7,0xF1,0x2B,0x04,0xE6,0xB3,0x7D,0x40,0xF4,0x73,0xC3,0x72, + + 0x20,0x96,0xF0,0xC4,0x7A,0x19,0xB4,0x62,0x28,0x96,0xCC,0x19,0x9F,0x8C,0xAC,0x52, + + 0x69,0xD7,0xB5,0xFE,0xDE,0x64,0x82,0x76,0x25,0xD7,0x84,0xF2,0x9E,0xAD,0xD5,0x47, + + 0xA8,0x85,0x7C,0x75,0xB2,0x16,0xB5,0x71,0xE0,0xD4,0xE3,0x85,0xD2,0x5D,0x2D,0x31, + + 0xA1,0x15,0x15,0xD8,0x95,0xAC,0x75,0xE3,0x98,0xF7,0xCF,0x04,0x73,0x53,0x92,0xE8, + + 0xD3,0x9E,0xE6,0x3F,0xC7,0x33,0x0C,0x59,0x19,0x73,0x69,0xAF,0xFC,0xB8,0x5A,0xDA, + + 0x65,0xDB,0xF4,0xD5,0x4B,0xFB,0x86,0x45,0x6B,0x48,0x7E,0x3A,0xB7,0xF4,0x09,0xCA, + + 0xAA,0xD8,0x1B,0xB2,0x57,0xFE,0x2A,0xAE,0xDF,0x3B,0x68,0xAF,0x20,0x0B,0xEB,0x9F, + + 0x2D,0x9B,0x6F,0x44,0xF5,0x7A,0x0B,0x3F,0xEF,0xB6,0x44,0x98,0x5C,0xB9,0x26,0x8A, + + 0x6E,0x67,0xF5,0xA8,0x7E,0xF3,0x56,0xEE,0x11,0xDC,0x8E,0xE9,0x5A,0x77,0x6E,0x95, + + 0xD2,0xE1,0x6C,0x1E,0x2B,0x48,0x3E,0xDC,0x69,0xBF,0x5E,0x8C,0x1D,0x31,0x63,0xC9, + + 0xAA,0x65,0xD9,0xF6,0x33,0x38,0xDA,0x94,0x73,0x9C,0xCC,0xDE,0x86,0x51,0xAF,0x5B, + + 0x0B,0xDD,0xF8,0xCE,0xC7,0xFD,0x73,0x7F,0xED,0x3D,0x81,0xF8,0xDB,0xFF,0x3A,0xE8, + + 0x56,0x4F,0xBE,0x64,0x78,0x03,0x4F,0x56,0xCD,0x96,0x40,0x35,0x72,0x64,0xA4,0xF8, + + 0x81,0xCC,0xAA,0xFC,0x0F,0x6E,0xE3,0xC6,0x72,0xFA,0xDC,0xDC,0x13,0x2C,0x58,0x91, + + 0x25,0xFD,0xC3,0x16,0xBA,0x2D,0x19,0x31,0x3D,0xC3,0xE5,0x34,0xAC,0x43,0xEE,0xE2, + + 0xFD,0x18,0xB3,0xE6,0xB7,0x8C,0xA3,0xCE,0xF2,0x21,0xF9,0x63,0x34,0x6C,0x47,0xC4, + + 0x5D,0xDD,0x0B,0xD3,0x92,0xC5,0xB7,0x9F,0xB3,0xE2,0x40,0x16,0xB9,0x55,0xFF,0x48, + + 0x05,0xDF,0x0A,0x32,0xEC,0x3E,0x03,0x70,0x45,0x05,0xEB,0x85,0x27,0x67,0x18,0x55, + + 0x7F,0x49,0x01,0x99,0x5C,0x3D,0x29,0x9F,0x3A,0x4F,0xAF,0x49,0xB9,0xD7,0xE6,0xB9, + + 0xC3,0xFA,0x0A,0x33,0x1E,0xD1,0xF4,0x99,0xDB,0x9A,0x86,0xF5,0xA0,0x12,0xA2,0x8C, + + 0x64,0xF4,0x15,0xE4,0x06,0x65,0xEA,0xC0,0x12,0x05,0xCB,0x2E,0xBD,0x0D,0xD4,0xEC, + + 0x55,0xA4,0x6D,0xDC,0x6C,0x6B,0x4A,0x28,0x5D,0x04,0x2E,0xDE,0x6A,0xF9,0x25,0xEB, + + 0xA2,0x11,0x7C,0x7E,0xE4,0x46,0x84,0xC1,0x82,0x05,0xEB,0xC4,0xC4,0x07,0x5F,0x79, + + 0xC9,0xC4,0x1D,0x2A,0x9F,0x8B,0x42,0xBC,0x6E,0x50,0x23,0x1A,0x7A,0x0E,0xBA,0xCC, + + 0x11,0x77,0x8A,0x55,0x1C,0xD6,0xAA,0x60,0xB7,0x03,0x65,0x44,0x5C,0x75,0x13,0xDA, + + 0x4E,0xF2,0x93,0xC0,0xBE,0xAD,0xD9,0x0B,0x53,0xE4,0x1A,0xBC,0x0E,0x67,0xF3,0xC9, + + 0x6B,0x6D,0x98,0xC9,0x87,0xF7,0x0D,0x20,0xCA,0x4A,0x55,0x1F,0x31,0x8F,0x12,0xD5, + + 0x2E,0xD0,0x33,0x5F,0x83,0x34,0xDA,0x99,0x83,0xE4,0x0F,0xF9,0xD8,0xBF,0xFE,0x68, + + 0x6E,0x5F,0xAC,0x83,0xB1,0x74,0xD4,0x95,0xBD,0x4B,0x9B,0xA4,0x1B,0xA8,0x5C,0x8D, + + 0x80,0x7D,0xF1,0xB3,0x90,0x6E,0xDC,0x7C,0xFC,0x4A,0xC2,0x74,0x71,0xDA,0x55,0x99, + + 0xBE,0x14,0xBD,0x6F,0x1C,0x3F,0x4E,0xD2,0x43,0x9D,0x95,0x54,0xAD,0x72,0x54,0x68, + + 0x67,0x28,0x39,0xF7,0x0E,0x2E,0xC0,0xCE,0x06,0xDE,0xD1,0xB5,0x10,0x0C,0x1D,0x28, + + 0xC7,0x6B,0xFA,0xEC,0xBF,0x92,0x2A,0x20,0x72,0x19,0xAD,0x60,0x31,0xBF,0x7E,0xC3, + + 0x02,0x1A,0xAC,0x82,0x5E,0x38,0x9C,0x3C,0x40,0x17,0xA4,0xD3,0x8E,0x7A,0x7B,0xCD, + + 0x3E,0x19,0x0E,0x85,0xBA,0x77,0x2B,0x20,0x1A,0x6E,0x15,0x25,0xA6,0xAB,0x7F,0x2E, + + 0x90,0xF7,0xBF,0xFB,0xC3,0x52,0x12,0x8A,0x0A,0x67,0xDB,0xC0,0x73,0x6B,0x41,0x6F, + + 0x1B,0xAA,0xAE,0xEE,0x81,0x34,0x4F,0x55,0x8F,0x5E,0xE9,0x53,0x7E,0x22,0x0B,0x6A, + + 0x69,0x56,0x75,0x67,0xCA,0xB2,0xDB,0x5E,0xCC,0x52,0x5D,0xDA,0x58,0x39,0xBF,0x76, + + 0x8A,0xF7,0xBF,0xFF,0xC7,0x1A,0x37,0xAF,0x49,0x41,0xCF,0xCC,0xC4,0x61,0x37,0x71, + + 0xD2,0xD4,0xDB,0xAC,0x9F,0x24,0x9F,0xA9,0x4E,0x40,0x83,0xAD,0x10,0x4B,0x78,0x2A, + + 0x8D,0x0C,0xFE,0x7E,0x71,0xDD,0xBA,0x7B,0x7E,0x54,0xE1,0xC4,0x86,0xAD,0x17,0x54, + + 0x8E,0x16,0x5E,0xFB,0x9A,0xBA,0x00,0xF1,0x6B,0x13,0x24,0x8E,0x90,0x9C,0xF8,0x2F, + + 0x1E,0xAE,0x73,0xAF,0x58,0x94,0x9D,0x6D,0xB5,0x54,0x64,0xD4,0xFC,0x17,0xCF,0xF7, + + 0xFB,0x04,0x7E,0x44,0x39,0xF3,0xDC,0x3F,0xE7,0x44,0x1F,0x3D,0xAE,0x75,0x79,0x04, + + 0x40,0x9B,0xD6,0x06,0x14,0xA0,0x6F,0x54,0x77,0x62,0xEA,0x27,0xF7,0xA2,0xA9,0x52, + + 0x41,0x4A,0xCE,0xB7,0xEA,0x0C,0x58,0x92,0x5D,0xCE,0xE3,0x02,0xD7,0x2D,0x81,0x75, + + 0x0B,0x04,0xA1,0x40,0x7D,0xAB,0xC9,0xCB,0xCA,0x8F,0x27,0xA9,0x75,0xF9,0xA8,0xFB, + + 0xEA,0x48,0x79,0xD0,0x4B,0xAB,0x60,0xA2,0x60,0xC5,0x04,0xD5,0xF1,0xEF,0x4A,0xE7, + + 0x28,0x0E,0x23,0x34,0xB1,0xEA,0x7D,0x67,0xC6,0xA4,0xC8,0x98,0xFA,0xE9,0x95,0x69, + + 0x26,0x70,0x28,0x02,0xE7,0xAB,0x7D,0xE2,0xB8,0x80,0x41,0xD3,0x9D,0xE8,0x49,0x1E, + + 0xC7,0x85,0x65,0xC3,0x89,0x5B,0x2F,0x2A,0xCE,0x6B,0x0C,0x29,0x23,0xBA,0xE8,0xD7, + + 0xD8,0xC0,0x81,0x95,0x13,0xA9,0xFB,0xD4,0x26,0xA4,0x84,0x9D,0x23,0x96,0xA5,0x88, + + 0x2E,0xB8,0x22,0x11,0x3A,0x25,0x62,0x37,0xEF,0xD3,0x8A,0x6C,0xFF,0xE4,0x82,0x0A, + + 0xEC,0x92,0x06,0x8D,0x37,0xA3,0x63,0xC3,0xA8,0x3F,0xD2,0xCF,0xDE,0xEB,0x1B,0xE3, + + 0xF7,0x45,0xDD,0xAF,0x75,0xA9,0x71,0x4D,0x33,0xA6,0x17,0x6D,0x58,0xE6,0x6C,0xFD, + + 0xBE,0xB0,0xA2,0x9B,0xF1,0x4E,0x45,0x06,0xFE,0x10,0xEB,0x32,0xCF,0x40,0x3B,0x5A, + + 0xAB,0x73,0x46,0x8C,0xBD,0xA2,0x8F,0x9B,0x17,0xCC,0x45,0x56,0xAB,0x8F,0x34,0x03, + + 0x0F,0xF8,0xB3,0xA7,0xBA,0x02,0xF1,0x72,0xEA,0x62,0x3A,0x7B,0xFC,0x60,0x3A,0x5F, + + 0x2B,0x31,0xDB,0xEB,0x1B,0xCF,0x2A,0x7E,0x6B,0x61,0x95,0x0D,0x25,0x71,0x73,0xDF, + + 0xD0,0x58,0xFA,0xAF,0x60,0xE0,0xF4,0x93,0xD7,0x82,0x26,0x7D,0x68,0xD0,0xCC,0x92, + + 0x22,0x6A,0x1C,0x6D,0x87,0xF2,0xF1,0xC4,0xEB,0x56,0xAE,0xA7,0x55,0xB0,0xD3,0x7A, + + 0x5E,0x5C,0xD1,0x54,0x94,0xAE,0xBB,0x54,0x56,0xA3,0x04,0x56,0x37,0x04,0xF5,0x6B, + + 0xE6,0xDF,0xA3,0x26,0x37,0xBF,0xB2,0xE3,0xE8,0x59,0xB9,0x2C,0xC7,0xA0,0xC1,0x0C, + + 0xA6,0xF3,0x10,0xCA,0x4A,0xEE,0x85,0x4C,0x0C,0xDA,0xBE,0x33,0xAA,0x2A,0xBD,0xB4, + + 0x46,0x6B,0xFB,0xA4,0xC1,0xD1,0x2D,0xF6,0x5D,0xCF,0x6A,0x95,0x1A,0x75,0x97,0xE9, + + 0x33,0x0E,0x71,0xB4,0xC4,0xD0,0x9E,0xB2,0x66,0xCE,0x07,0x89,0x1F,0xF8,0x9A,0xB1, + + 0xC4,0x69,0xDD,0x38,0x34,0x7A,0xCB,0xA4,0xD5,0x8D,0x75,0x18,0x17,0x95,0x6D,0x57, + + 0xA3,0xEB,0xD5,0x2C,0xCA,0xBC,0x24,0x07,0xE7,0xCC,0x02,0x89,0xD9,0x28,0x99,0x9A, + + 0xCB,0x83,0x2D,0x70,0x85,0x00,0x91,0x48,0xAC,0x77,0xEF,0xBE,0x81,0xB7,0x77,0x98, + + 0xC8,0x6F,0xC6,0x98,0xBE,0xDD,0x46,0xA8,0x84,0xD6,0x11,0x56,0x39,0x04,0x60,0xED, + + 0x53,0xF6,0xD8,0xE5,0xED,0x25,0x63,0xD8,0xCD,0x2E,0x00,0xB6,0xFA,0x20,0xD0,0x0B, + + 0x5A,0x80,0x6F,0x8E,0x67,0x1B,0x27,0xBF,0xA5,0xF8,0x47,0xBD,0xFB,0x0E,0xD9,0xE6, + + 0xD5,0x01,0x66,0xB4,0x4B,0xB7,0x52,0xFE,0x4C,0xEC,0xC8,0xD2,0x02,0x53,0x56,0xC9, + + 0x3B,0x92,0xFD,0xDC,0x7B,0xF1,0x27,0x66,0x0C,0xFD,0x80,0xF9,0xDE,0x22,0xB4,0x31, + + 0x13,0x3F,0x65,0xD5,0x82,0x0A,0xA5,0x4B,0xEE,0xBD,0x57,0x9C,0x86,0x2D,0x5D,0x24, + + 0x22,0x22,0x2F,0x99,0xA9,0xD3,0x87,0xBD,0xE3,0x9D,0x4B,0x9D,0x00,0x5B,0x93,0x06, + + 0xC8,0xB1,0xE6,0x3C,0x11,0xA0,0x30,0xCA,0x29,0x31,0xAE,0x08,0xDD,0x02,0x36,0x25, + + 0x07,0xA1,0x8E,0x3D,0x91,0xA6,0x8C,0x90,0x6D,0x23,0x58,0x37,0xD0,0x6C,0xA5,0xF0, + + 0x23,0x42,0x22,0x3D,0x4C,0x93,0x70,0x61,0xC4,0x0C,0x6A,0x56,0xEC,0x20,0xF6,0x73, + + 0x72,0x66,0x25,0x66,0xAD,0x85,0x09,0xB9,0x95,0x01,0x26,0x77,0x70,0xB6,0x8B,0xC9, + + 0xD6,0x07,0x88,0x55,0x79,0xE7,0x17,0x27,0x44,0x26,0x2D,0x16,0xE5,0x5B,0x38,0x32, + + 0xF0,0x60,0x1E,0x93,0xD1,0x37,0x9C,0x6E,0x40,0xE5,0x08,0x8E,0xA8,0x27,0xE6,0xE0, + + 0x00,0xAA,0x41,0x47,0x86,0x8B,0xDC,0xA1,0xD6,0x04,0xA8,0x5B,0xF8,0x93,0x71,0xAA, + + 0x7F,0xF6,0xC1,0x50,0xF8,0xE4,0x07,0xC0,0xD3,0x43,0x5D,0x97,0x32,0x1C,0x3A,0xF3, + + 0x85,0xF5,0x15,0xFF,0x24,0x85,0x5A,0x28,0x58,0x0A,0x03,0x13,0x64,0x2A,0xF1,0x9C, + + 0x0A,0xD9,0x1B,0x5B,0xF0,0x98,0x1C,0x21,0x48,0x69,0x65,0xFE,0xF8,0xB6,0x64,0xF6, + + 0x7D,0x9C,0x12,0x9E,0xEC,0x85,0x5B,0x8D,0x47,0x08,0x53,0x5E,0x5B,0x67,0x33,0xE3, + + 0x25,0x06,0xED,0xBC,0x72,0x9A,0x8B,0xFE,0xED,0x27,0x5B,0x2D,0xE6,0xC6,0xF1,0x74, + + 0x0C,0xD6,0x46,0x3F,0x70,0xA5,0x55,0xEC,0x44,0x14,0x52,0x82,0xE1,0x73,0xE3,0x26, + + 0x9E,0x0B,0x9C,0xEE,0x4B,0x5D,0xF9,0x38,0x47,0xE6,0xF2,0x1E,0xA6,0x61,0x06,0x06, + + 0x77,0x72,0xC1,0x2D,0xD2,0x83,0x1B,0x61,0xCC,0x2C,0x13,0x68,0x79,0xB3,0x65,0x67, + + 0x8D,0x6D,0xF5,0xEC,0xFB,0x4F,0x0D,0x61,0x3F,0x4C,0xE3,0x95,0xC7,0x22,0x52,0xA9, + + 0xCB,0x21,0x67,0x44,0x2A,0x5C,0x2A,0x89,0xED,0xF6,0x6F,0xD7,0x08,0x32,0x32,0xB8, + + 0x49,0x1C,0xB2,0xB8,0xFB,0xA0,0x09,0x34,0x63,0x59,0x23,0xF6,0xD0,0xA4,0x03,0xB4, + + 0x20,0x94,0xBB,0xA8,0x7A,0x83,0x04,0x61,0xA9,0xFF,0x55,0xA6,0x71,0x7F,0x1F,0x2B, + + 0x4A,0x57,0xC5,0x9D,0x79,0xA2,0xDD,0x31,0xAF,0xAC,0x8E,0x8A,0x89,0x31,0x34,0x44, + + 0x2C,0x7F,0x9A,0x61,0xB2,0x9F,0x00,0x65,0x1A,0xAB,0x2B,0x14,0xA4,0xD5,0xDF,0x10, + + 0x6B,0xBE,0xA7,0x24,0xB3,0x3A,0x0C,0xCB,0x49,0x17,0x8E,0xBB,0x98,0x11,0x23,0xFC, + + 0x57,0xB0,0x97,0xC3,0x30,0x4A,0x6E,0x5D,0x15,0xC3,0x42,0x16,0x76,0xFB,0x99,0xD0, + + 0x23,0x35,0x94,0x45,0x16,0x31,0xDD,0x2A,0x3F,0xB4,0xE5,0x0B,0x7E,0x8A,0x3C,0x38, + + 0x9C,0xB7,0x17,0x9F,0x40,0x49,0xBA,0x3B,0x14,0x85,0x56,0xDF,0xFB,0x75,0x36,0x63, + + 0xD8,0x75,0x9D,0x8F,0x05,0x88,0xBD,0x84,0xB5,0xA8,0x5E,0xAC,0x46,0xD4,0xA3,0xEB, + + 0x5B,0x7F,0xA7,0x99,0x70,0x6B,0x71,0x95,0xEB,0xDA,0x68,0x6F,0x59,0xA5,0xCB,0x67, + + 0x50,0x79,0xB5,0x6E,0x81,0x96,0xF3,0xC6,0x23,0x2A,0x8A,0x39,0xFB,0xC1,0xF9,0xB9, + + 0x56,0x17,0x6B,0x53,0x99,0x97,0x76,0xED,0x01,0xBF,0x35,0x2E,0xFE,0x72,0x16,0xC8, + + 0xC0,0x7E,0x62,0x4E,0x77,0x35,0x3C,0xE8,0x68,0xFD,0x84,0xF9,0x13,0xFE,0xC3,0xB7, + + 0xC3,0xCF,0x50,0xCC,0x53,0xCF,0x87,0x9A,0x84,0x30,0x73,0x0F,0xB2,0x8F,0x6F,0xDC, + + 0xC0,0x7C,0x4F,0xBE,0x52,0x9B,0x65,0x0A,0x8D,0x5B,0xA1,0x4D,0x1A,0xDC,0x5F,0x45, + + 0xF9,0x36,0x9E,0x3E,0xDE,0xA3,0xA0,0x3D,0x74,0x82,0xA5,0xA2,0x56,0xE8,0x56,0x3F, + + 0x27,0x6C,0xBF,0x92,0x1B,0x06,0x46,0x1F,0x91,0x10,0xAD,0xB2,0x57,0x31,0x5F,0x3B, + + 0x71,0x14,0xDF,0x3F,0x63,0x57,0xF1,0x9A,0x10,0x93,0x71,0xA7,0x22,0x4F,0xAC,0x54, + + 0x64,0x25,0x97,0x3A,0x4B,0x0E,0x47,0x0E,0x47,0xFF,0x15,0xA4,0xFF,0x1C,0xBC,0xD1, + + 0x7E,0x59,0x4C,0xD5,0x70,0x0B,0xC7,0xC3,0x40,0xA6,0x0B,0x6E,0xF3,0x9B,0x36,0xF6, + + 0x0F,0x81,0xBE,0x67,0x71,0x0A,0xC1,0xEC,0x44,0x04,0x85,0x9C,0xD4,0xE8,0x07,0x7B, + + 0x85,0x26,0xB3,0x45,0xD2,0x0B,0xC1,0x24,0x7B,0x30,0x58,0x19,0x43,0x6B,0x2D,0x2C, + + 0xEE,0x36,0xBB,0x68,0xF5,0xE6,0xD2,0x1D,0x12,0x3B,0x06,0xB5,0x76,0x38,0x31,0xF9, + + 0x7C,0x05,0x33,0x90,0x1D,0x58,0x8E,0x48,0xBB,0xAD,0x09,0xBD,0x7E,0x37,0x14,0x22, + + 0x65,0xD8,0x6A,0x9B,0xF7,0x04,0x6E,0x24,0x3D,0x66,0x45,0xBA,0x5F,0xAD,0x45,0x26, + + 0x67,0xFB,0x10,0x23,0x60,0xDB,0x0B,0x35,0xEE,0x65,0x89,0xD5,0x27,0x91,0x55,0x37, + + 0x64,0xFA,0xBC,0x80,0x74,0x3A,0x2C,0x49,0x26,0xFA,0x85,0x07,0x50,0x89,0x3A,0x4F, + + 0xFB,0x25,0x82,0x4C,0x2F,0xA1,0xCF,0x35,0x35,0x9C,0x32,0x7E,0x61,0xAE,0xBA,0x58, + + 0x03,0x26,0xD2,0xA5,0xEA,0x02,0x38,0xCB,0xA6,0xCE,0x3A,0x4B,0xD2,0xE1,0x70,0xAB, + + 0xCE,0x21,0x18,0xCD,0x1E,0x47,0xB3,0x6F,0x53,0x8C,0x65,0x28,0x23,0xE1,0xBB,0xA4, + + 0x0D,0x23,0xBF,0x24,0x74,0xEC,0xD7,0xFE,0x38,0x62,0x5F,0x3D,0x5B,0xE2,0xDB,0xC5, + + 0xCD,0xC1,0xB1,0xC1,0xFE,0xA1,0x8F,0x31,0x50,0xD8,0x74,0x26,0x82,0x50,0x64,0x96, + + 0xA2,0xF0,0x92,0xBF,0x33,0xB3,0xA9,0xC1,0x5D,0x93,0xBC,0x92,0xA1,0x60,0xC2,0xF0, + + 0x9C,0x44,0xAD,0x83,0x1C,0x5F,0x37,0xBD,0xD0,0x26,0xA0,0x84,0xAB,0x09,0x81,0xE8, + + 0x6F,0xC2,0xA5,0x13,0xB7,0x51,0x7D,0xAF,0x1A,0xBF,0x1A,0x8E,0x25,0x22,0x9B,0x46, + + 0x28,0xCC,0xB6,0xC0,0xFE,0xD7,0x24,0x91,0x08,0xBA,0x20,0x15,0x58,0xD9,0xCF,0x92, + + 0x6F,0x18,0xB6,0x0C,0x5F,0x44,0x42,0x47,0xE8,0x53,0x9C,0xB9,0x9F,0xFA,0x6D,0xCF, + + 0xA0,0xF4,0x41,0xE0,0x17,0x49,0x17,0xF3,0xE7,0x46,0x3F,0x0F,0x76,0x3B,0x13,0x62, + + 0x27,0x46,0x93,0xD1,0x56,0x34,0xFC,0x33,0xAF,0x7C,0xA4,0x0E,0x12,0x08,0x58,0xB2, + + 0xDD,0x3E,0x0A,0x1D,0x40,0x47,0x50,0x0B,0x99,0x7E,0x91,0x93,0x9D,0x57,0xCE,0xEC, + + 0xD2,0xF7,0x94,0x64,0xC6,0xC2,0x6E,0xA5,0x47,0xB7,0x90,0x80,0xDC,0x66,0x32,0x78, + + 0x90,0x81,0x1C,0x1C,0xC8,0x65,0x67,0x6B,0xAC,0x0E,0xE5,0x5C,0x96,0xFC,0x11,0xA3, + + 0x73,0x10,0x50,0x1B,0xBF,0xFF,0x80,0x28,0x95,0x06,0x0B,0xDD,0x06,0xB9,0xCA,0x4E, + + 0x20,0xE4,0x4B,0x3D,0xB2,0x41,0xA4,0xEB,0xEE,0x6E,0x36,0x36,0xDD,0xFA,0xAA,0xC4, + + 0x2C,0x3D,0xC8,0x7B,0xB3,0xD8,0xFF,0xBA,0x3F,0x70,0x6E,0x7C,0x7E,0x90,0x6F,0xC6, + + 0x21,0xDC,0x9F,0xDC,0xDC,0xFA,0x49,0x5E,0x61,0x58,0x5A,0x8A,0x03,0xF1,0x31,0x6A, + + 0xEF,0x9B,0x5B,0xBD,0x54,0xBC,0xA9,0x3C,0x2D,0xCD,0x40,0x1D,0xDB,0xFF,0x5E,0x34, + + 0x1C,0x06,0x92,0x04,0xEF,0xAD,0x4F,0x21,0x46,0x63,0x28,0xCB,0x2B,0x78,0xA1,0x6F, + + 0xA2,0x07,0x9A,0x30,0x17,0x52,0x1E,0x42,0xAA,0xA0,0x43,0xB2,0x57,0x22,0x28,0x42, + + 0x86,0x71,0x50,0x81,0xE2,0x40,0xD0,0x52,0x8F,0x4B,0xCA,0xA6,0xAF,0xFA,0x20,0x57, + + 0x87,0x70,0x64,0x04,0xF9,0x03,0x67,0x19,0xC7,0x30,0x8F,0xF5,0xED,0x78,0x80,0xC0, + + 0xDF,0x46,0x9A,0x7D,0x7A,0x35,0xC6,0x06,0xFD,0xE9,0x03,0xE0,0x50,0xC7,0x2C,0x18, + + 0xA2,0x9A,0x4F,0x56,0xDC,0x85,0x12,0x03,0x73,0x07,0xB0,0x16,0xA4,0x27,0x01,0xD4, + + 0x7D,0x00,0xB8,0x13,0x67,0xEA,0x40,0x26,0x5C,0x4C,0xAE,0xA7,0x73,0x99,0xFD,0x33, + + 0x0E,0xF1,0xD8,0x26,0xA3,0xA0,0x19,0x31,0xC5,0x65,0x12,0xFC,0x07,0x64,0xAB,0x77, + + 0xAB,0x0E,0x34,0xFD,0x65,0xD7,0x39,0x5B,0x78,0x47,0x01,0x4A,0xE7,0xC3,0x72,0x7A, + + 0xF2,0x00,0x47,0xF4,0x1F,0x21,0xB7,0x47,0xEA,0xE9,0xC1,0xBF,0x26,0xF1,0x2A,0xAF, + + 0x29,0x88,0xB9,0xFE,0xD7,0x6A,0x2D,0x1C,0xCE,0x39,0x00,0x2C,0xA3,0x72,0x07,0x9B, + + 0x01,0x93,0x8B,0x03,0xF5,0xDF,0x0D,0x4A,0xA1,0x27,0x40,0xBB,0xDF,0x08,0x79,0xD6, + + 0x09,0x7C,0xC0,0x12,0xFB,0x83,0xD2,0x87,0xC7,0xEA,0x75,0xCD,0x92,0xFD,0x76,0x49, + + 0x60,0xF4,0xDB,0xB6,0xFE,0x6F,0x12,0x6D,0xDF,0x7C,0x84,0x9E,0x5F,0xC0,0x1A,0x99, + + 0x2F,0x0D,0xD2,0xBD,0xE2,0x8F,0xC2,0x07,0x00,0x7F,0x73,0x7E,0xE6,0x0A,0x42,0x5B, + + 0x87,0xA4,0x8B,0x1D,0x9D,0x2D,0xFE,0x55,0x03,0x5E,0x4C,0xF9,0x93,0x90,0x56,0xD7, + + 0xCB,0x74,0xE6,0x80,0x31,0x72,0x6A,0x88,0x81,0xEF,0x02,0x20,0x72,0x99,0x1A,0xA1, + + 0xCA,0x55,0xC4,0x8C,0xC4,0xB7,0xDC,0xF0,0x61,0x85,0x70,0x30,0x7B,0x32,0x3D,0x7E, + + 0xC3,0xEA,0x3A,0x42,0x72,0x3A,0xA2,0x89,0x14,0xB3,0x55,0x25,0xBE,0x8D,0x37,0x21, + + 0x29,0xBC,0x85,0x55,0xFD,0x28,0x8B,0xAE,0xD1,0xAE,0x95,0x39,0xF7,0x71,0x3F,0x44, + + 0x24,0x82,0xD5,0x76,0x72,0x1A,0x7F,0x8E,0xB3,0xE8,0xEC,0x1A,0x74,0xAE,0x59,0x23, + + 0x17,0xC1,0x5D,0xCE,0x0F,0x81,0xCB,0x37,0xDE,0xA3,0x08,0xCA,0x51,0x80,0x85,0x45, + + 0xD8,0xC2,0x55,0xDB,0x8A,0xC2,0xE8,0xBA,0x2A,0x47,0x90,0xFB,0xD4,0x82,0xD8,0x22, + + 0xD3,0x55,0xDE,0xDA,0xCB,0xBA,0xE4,0x6F,0xE2,0x67,0x89,0xBA,0x0E,0x0B,0xA2,0xF7, + + 0x8B,0xB8,0xCC,0xEA,0x7B,0x58,0x6D,0xDB,0x04,0xD9,0x3C,0x28,0x7A,0x9A,0x6E,0xD2, + + 0x8F,0x16,0x1E,0x18,0x3B,0x54,0xDE,0x00,0x67,0xD8,0x5E,0x38,0xC2,0x71,0x11,0x8B, + + 0x67,0x97,0xDF,0x88,0xC7,0x1A,0x17,0x56,0x09,0xC9,0x68,0x2F,0x72,0x62,0x2F,0xCD, + + 0x48,0xB4,0x4F,0x39,0xD1,0x31,0x0F,0x3D,0xD7,0x25,0x1A,0x55,0xBA,0x36,0x02,0xC4, + + 0xD1,0x80,0xB8,0xF1,0xD3,0x8D,0xFD,0x86,0xBF,0xA0,0x16,0x6D,0x69,0x70,0x54,0xF6, + + 0x0A,0x3F,0x62,0x43,0x3A,0x7D,0x0E,0xE9,0x5B,0x59,0x65,0xBE,0xDA,0x80,0xFC,0x93, + + 0x43,0xE7,0x85,0x32,0x53,0xCF,0xEA,0xB6,0x22,0x4F,0xEF,0x96,0x7B,0x73,0x71,0xA4, + + 0xCA,0x68,0xEB,0x91,0x73,0x6E,0xEF,0x8B,0x00,0x4E,0xF7,0x9F,0x0F,0x3C,0x18,0x52, + + 0x84,0x8F,0xB1,0x22,0xF5,0x0F,0x52,0xA2,0x45,0x77,0xBE,0x66,0x1A,0xA2,0x9C,0x69, + + 0xA6,0x0C,0x68,0x93,0xE3,0xA9,0x2E,0x75,0x8F,0xDB,0xEE,0xCD,0x53,0xA3,0x95,0xF3, + + 0xA0,0x8D,0xB7,0xF6,0xE9,0x5D,0x0B,0xD0,0xAC,0x6F,0xF1,0x71,0xD2,0xE0,0x57,0x22, + + 0x07,0x9F,0x2B,0x68,0xB4,0xC3,0x71,0x56,0xC3,0x50,0x6D,0xB3,0xF3,0x12,0x76,0x43, + + 0xFA,0x25,0x26,0xB9,0xFF,0xB5,0x67,0xA5,0xFB,0x62,0xC8,0x98,0xFA,0xE9,0x31,0x6A, + + 0xA2,0xEB,0x62,0xD2,0x15,0x65,0x70,0x67,0xD3,0xB4,0x47,0x34,0xF6,0x48,0xF1,0xC7, + + 0xEE,0x4A,0xF7,0x25,0x90,0x24,0x62,0x0D,0x0C,0xB7,0x0E,0x19,0x57,0xEB,0x0B,0x53, + + 0xA3,0xC5,0x16,0x24,0xA7,0x06,0xDC,0x4B,0x0F,0xD6,0x6E,0xF3,0xD5,0x62,0xD2,0x68, + + 0xF3,0x25,0x7D,0x0F,0x38,0xB3,0x70,0x1A,0x6C,0x67,0x0A,0xD5,0xD1,0x15,0xE9,0xEA, + + 0xA6,0x28,0xC8,0x1A,0x1C,0xFB,0x58,0xC9,0xC1,0xC4,0xF2,0x3B,0x36,0x48,0x35,0x4C, + + 0x52,0x80,0x35,0x69,0x63,0xC6,0x93,0x58,0x6F,0x49,0xD4,0x5D,0x1E,0xEA,0x3D,0xE8, + + 0x09,0x06,0xF2,0x23,0x38,0x74,0x45,0x0E,0x61,0xC6,0xBF,0x4C,0xB5,0xE0,0xA9,0xC3, + + 0xFB,0xE0,0xDA,0x7F,0xBF,0x2D,0xE1,0x19,0x7E,0x8E,0xCC,0x56,0x22,0x43,0xFA,0xB2, + + 0x77,0x16,0xB8,0x14,0x19,0xAF,0xFA,0x95,0xC2,0x7B,0x3A,0xFE,0x35,0x52,0xA7,0xB4, + + 0xBD,0x47,0x8D,0xBC,0x1A,0x23,0x33,0xB2,0xC8,0xEC,0x53,0x1C,0xE2,0x3D,0x6B,0xB7, + + 0xD2,0xB4,0x18,0x4E,0xAF,0x02,0xC2,0xE1,0xCC,0xFF,0x93,0x1D,0x20,0xE1,0x32,0xF1, + + 0x4C,0x91,0x65,0x02,0x36,0xDD,0xF4,0x1A,0x26,0x51,0xE4,0xC4,0x3C,0x5B,0xA8,0x6D, + + 0xC4,0x2E,0x78,0xC7,0x34,0x41,0x44,0x02,0xA7,0x93,0x82,0x87,0x56,0x92,0x1D,0x13, + + 0xA2,0x01,0xFB,0xBB,0xBC,0xF0,0xA5,0x50,0x60,0x7F,0x2A,0xFB,0x74,0xA1,0xED,0x32, + + 0xB3,0x3E,0x6D,0x17,0xD1,0xF1,0x6E,0xAB,0x34,0x0E,0x7D,0x37,0x98,0xB1,0x7C,0xCF, + + 0xCF,0x6D,0x44,0xD5,0x0E,0xD0,0xC3,0xCA,0x9B,0xB8,0x43,0x43,0x97,0x6B,0x52,0xAF, + + 0xC5,0xC2,0x3C,0xB4,0xC0,0xD0,0x26,0xCB,0x1B,0xCA,0xBC,0xF0,0xF4,0xF8,0x7F,0xEC, + + 0x87,0x36,0xDB,0xFA,0xB0,0xD4,0x17,0xF3,0xE5,0xB7,0x8A,0x0A,0xEC,0xB4,0xEA,0xA1, + + 0x4C,0x26,0xD5,0x28,0x42,0xBB,0xC7,0x0D,0x84,0x66,0x02,0x35,0x56,0x28,0xE8,0xEA, + + 0x32,0x33,0xE2,0x87,0x3A,0xFB,0x1D,0x55,0x17,0xF8,0xF6,0x3B,0x7A,0xDA,0x0E,0x0A, + + 0xC4,0x38,0x94,0x5E,0x31,0x12,0x85,0xE0,0xB4,0x24,0x2D,0xD8,0x16,0xF6,0xB1,0x8B, + + 0x47,0x8B,0x30,0xC8,0xBA,0x98,0xF7,0xEB,0xEC,0x46,0xE7,0x6F,0xCC,0xE1,0xEF,0x23, + + 0xA1,0x64,0xB9,0x9E,0x8E,0x6A,0x10,0xC4,0x5A,0x46,0x3F,0x8D,0x9D,0x73,0x18,0xF6, + + 0x1D,0x7D,0xDE,0xB1,0xBF,0xB1,0x60,0xC2,0xDD,0x11,0x9E,0x8C,0x85,0xF2,0x10,0x7A, + + 0x06,0xDF,0xDC,0xAD,0x0B,0x4C,0xF9,0x0A,0x17,0x2C,0xF8,0xE7,0x7E,0x3D,0xDF,0x5B, + + 0x45,0x6F,0xD9,0xF2,0xB8,0xBC,0x08,0x2C,0x38,0xD6,0xCF,0x15,0x71,0xBC,0x55,0x28, + + 0x9F,0x84,0x91,0xD9,0x56,0x8E,0x06,0xAD,0x16,0x13,0xC1,0xC3,0xDC,0xBF,0xEC,0x24, + + 0x06,0x82,0xC0,0xB5,0x9F,0xD6,0xAF,0xBB,0xB5,0xD6,0xB6,0x42,0x10,0xCB,0x3F,0xB1, + + 0x07,0x41,0x48,0x90,0xDC,0x63,0xB6,0xB4,0x43,0xA3,0x08,0xDC,0x99,0x2C,0x13,0xFF, + + 0x70,0x01,0xBA,0x9B,0x93,0x91,0x59,0x94,0xC6,0x00,0xE9,0x2D,0x30,0x9D,0xA4,0x63, + + 0x72,0xBC,0xC9,0xA4,0x1C,0xD5,0xB5,0xAA,0x34,0xD5,0x66,0xD8,0x2E,0xEE,0x55,0x33, + + 0x66,0xA7,0xB3,0xE1,0xDA,0x07,0xF7,0x57,0x29,0xE1,0x8A,0xE4,0xF1,0x62,0x4A,0xBB, + + 0xFC,0xDE,0xF2,0xA7,0xD9,0x8E,0xF0,0xFA,0xD7,0xD1,0xA7,0x96,0xD1,0x61,0x50,0xB2, + + 0xB2,0x5B,0x23,0x56,0xB4,0xC0,0xD1,0x90,0x22,0x06,0xDD,0x1E,0x73,0xEC,0x49,0x6B, + + 0xE7,0xB2,0xAB,0x51,0x6F,0x63,0xFC,0x6A,0xA8,0x33,0x86,0x17,0xFD,0x21,0x39,0x4A, + + 0xA9,0xB5,0xB9,0x92,0x19,0x0B,0x1A,0x05,0xCA,0x54,0xED,0xA8,0x26,0xA0,0x32,0x67, + + 0x88,0x04,0x4A,0x9C,0x57,0xA8,0xE5,0xBA,0xD8,0x24,0x22,0xC3,0x66,0x49,0x2B,0x6B, + + 0x7D,0x06,0xBE,0x89,0x9A,0x22,0x29,0x4B,0xA8,0x4B,0x34,0x1C,0xEB,0xCE,0x35,0xBC, + + 0x7D,0x48,0x9B,0xE2,0x78,0xF8,0x23,0x89,0xC9,0x94,0xC4,0x24,0xDF,0x98,0xD4,0xCC, + + 0x0E,0x70,0x71,0x4B,0xCE,0xFA,0x16,0xAE,0xD8,0x4F,0xD7,0xCC,0x42,0x8C,0x5D,0x65, + + 0xE0,0xBC,0x4A,0xAD,0xC9,0x6D,0xB8,0x6B,0x6D,0xAB,0xDE,0x7E,0x5F,0x21,0x79,0xB3, + + 0x71,0xA3,0x64,0xD2,0xF1,0x98,0xB0,0x92,0x02,0x6D,0x13,0xB9,0xD2,0x28,0x75,0x61, + + 0xFD,0xA0,0x68,0x6B,0x47,0xCA,0x61,0x8A,0x01,0xE4,0xDF,0x3B,0x83,0x69,0x97,0x32, + + 0x28,0x50,0x86,0x95,0x4C,0x34,0xD4,0x21,0x22,0x5D,0x4B,0x5A,0x54,0x20,0x10,0x54, + + 0xAC,0x50,0xB2,0xA9,0xD3,0x11,0x14,0xB5,0x1E,0x71,0x25,0x73,0xEF,0x79,0xE9,0xA5, + + 0xE8,0xE3,0x01,0x8C,0x38,0x0F,0xEA,0x25,0xA9,0x12,0xB5,0xDF,0xC7,0xC2,0x37,0x62, + + 0xDD,0x15,0x09,0x68,0xB1,0x72,0x8D,0x35,0xEB,0x47,0x1E,0x31,0xF2,0x86,0xD1,0xDA, + + 0x16,0xC1,0xFA,0x74,0x58,0x83,0x0A,0xEF,0x2C,0x1A,0x8E,0x1B,0xD1,0x36,0xF3,0x9F, + + 0xB6,0xC8,0x9A,0x6E,0xD8,0x56,0x66,0x03,0xA5,0xFA,0x1C,0x9C,0x62,0x71,0x54,0xFE, + + 0x9A,0x6A,0xBB,0x75,0x5B,0x55,0x34,0x41,0x34,0xE9,0xCC,0xAA,0x72,0xA6,0xE4,0xA3, + + 0x18,0x08,0x7A,0x61,0x47,0x94,0xBB,0x00,0x29,0x47,0xD8,0x1D,0xAB,0x3A,0x2F,0xFB, + + 0x89,0xC7,0x59,0x8D,0x1C,0x23,0xD6,0x28,0x02,0xE7,0x56,0x6C,0xC2,0x70,0xE4,0x58, + + 0x40,0x1F,0x22,0x74,0x06,0x74,0xDE,0x38,0x6A,0x1B,0x5F,0xBE,0x80,0xF4,0xB3,0xEB, + + 0xAE,0x18,0x27,0xEB,0x4F,0x85,0x49,0x4B,0xEC,0xA7,0x13,0x50,0x0F,0x3B,0x21,0x2D, + + 0x08,0xE4,0xE8,0x6D,0x39,0x94,0x5F,0x2C,0x64,0xED,0xE1,0x95,0x12,0x4A,0xF1,0xF1, + + 0xDE,0x8D,0xF1,0x7C,0xC9,0x32,0x28,0x7A,0x96,0x18,0xA4,0xE8,0x76,0x3E,0xA2,0x58, + + 0xD7,0x3D,0x11,0xDC,0x4C,0xBD,0xF9,0x67,0x80,0xEB,0x76,0xF0,0xFE,0x3D,0x87,0xD9, + + 0x95,0x5F,0xAF,0x4B,0x46,0x7F,0xE4,0xEE,0x3E,0x88,0xDD,0x94,0x7D,0x5C,0xE3,0x9B, + + 0x28,0xCB,0x0F,0x04,0xCA,0x39,0x01,0x63,0xEF,0x8B,0xCF,0xF9,0xEF,0x3D,0x79,0x06, + + 0x89,0xE3,0x5B,0x82,0x16,0x38,0x0D,0xA6,0x46,0xC8,0x3A,0x69,0xA9,0x9C,0x55,0xFD, + + 0x03,0xC3,0x44,0x89,0xE4,0x77,0xDF,0x48,0x93,0xCB,0x54,0xA4,0x59,0xE9,0x8A,0xA6, + + 0x51,0x9C,0x61,0x87,0xFE,0x1D,0xF1,0xA3,0xAE,0xAC,0x1D,0x48,0x1E,0x43,0x10,0xD1, + + 0x24,0x7C,0xE1,0x92,0x93,0xE1,0x3A,0xB7,0xC3,0x8D,0x3D,0xCA,0x22,0xA2,0x73,0x39, + + 0x6C,0xF5,0xBE,0x75,0x12,0x0F,0x12,0x66,0xBA,0x80,0xD0,0x1A,0xF7,0xE7,0xF9,0xA1, + + 0x33,0xD5,0x49,0x4C,0x8B,0x11,0xDF,0xED,0x2C,0x73,0x27,0x23,0x2C,0xD2,0x1F,0x6E, + + 0x77,0x25,0xD3,0x43,0x13,0xB0,0xC2,0x64,0x12,0x10,0x4F,0x43,0xA1,0xE2,0x49,0xE9, + + 0x7B,0x36,0xB7,0x58,0xD1,0xE9,0xF9,0x82,0x15,0x87,0x39,0xAB,0x96,0x1A,0x4A,0x68, + + 0xFB,0x86,0x4A,0x8A,0x1E,0x4A,0xF2,0xAA,0x26,0xA6,0x88,0xC0,0xE9,0x84,0x51,0x5D, + + 0x0B,0x29,0x79,0xE0,0x92,0x14,0x38,0x2B,0x31,0xCD,0x7A,0xFE,0xA1,0xAB,0x1B,0xF0, + + 0x0F,0x87,0xB1,0x2F,0x63,0x27,0xD4,0x51,0x1A,0xC2,0xD5,0x1E,0xDF,0x3A,0x2C,0xDB, + + 0xC1,0x26,0x4C,0x65,0x4B,0xA3,0xAA,0x32,0x45,0x12,0xF3,0x94,0xDC,0x8B,0xD1,0x72, + + 0xF6,0xFD,0x83,0xEE,0xC8,0x13,0xD1,0x5C,0x92,0x29,0xEA,0x6A,0xD9,0x5C,0xAA,0x4B, + + 0x25,0x79,0x94,0xEA,0xF6,0x0E,0x48,0x7E,0xCA,0xDB,0xFE,0x62,0x7F,0x5D,0x50,0x67, + + 0xBD,0xEE,0xDD,0xFB,0xF6,0x59,0x2D,0x58,0xCA,0x65,0xA3,0x66,0xD2,0xED,0x7C,0x45, + + 0xFF,0x3B,0xBD,0xE1,0x74,0x0C,0xDA,0x61,0x53,0x7B,0x7E,0xFD,0x5F,0xE7,0xE4,0xD3, + + 0x20,0x9A,0xDC,0x0E,0x91,0x39,0x8F,0x38,0x67,0xB0,0xCA,0x9F,0x9F,0x61,0x4C,0xC1, + + 0x43,0x9C,0x28,0x6B,0xCA,0xF0,0x41,0x36,0x6F,0x53,0x0D,0x87,0xC0,0x9F,0xA1,0x7E, + + 0xAC,0xD3,0x85,0x14,0x17,0xB8,0xEA,0xA2,0xC0,0x5F,0xCB,0x8A,0x1F,0xA3,0x2F,0x78, + + 0x96,0x72,0xBD,0xB7,0xA3,0x6E,0x05,0x23,0x1A,0xEE,0x58,0x77,0x8B,0xB1,0x30,0xDD, + + 0x00,0x20,0xEC,0x61,0x55,0x94,0xC6,0xFD,0x8A,0x7B,0x73,0x99,0x9F,0x84,0x12,0x44, + + 0xCC,0x73,0xB4,0xB3,0xB5,0x91,0xD4,0x78,0xF3,0x41,0x00,0x72,0x28,0x0B,0xC5,0xD9, + + 0x2A,0x1B,0x9D,0x2F,0xEE,0xFB,0x43,0x12,0x06,0x96,0x59,0x75,0xE2,0xFE,0x33,0x40, + + 0xB7,0x38,0xE5,0x27,0xFA,0xB8,0xD8,0xE8,0x8C,0xA3,0xAD,0xF7,0xFB,0xB5,0x9E,0x1A, + + 0xD3,0xA5,0x59,0xC9,0x0F,0xD1,0x9A,0x35,0x6F,0x52,0xFE,0x91,0xC9,0xBA,0x13,0x1E, + + 0x2F,0x49,0xCC,0x9E,0x3C,0xD9,0x7E,0x2F,0x92,0xE4,0x2C,0x99,0xDC,0x56,0x8B,0x14, + + 0xAF,0x63,0x1F,0x10,0xAE,0xF7,0xF7,0x2B,0x81,0x98,0xB1,0x50,0x5D,0x55,0xEF,0x1A, + + 0x5C,0xF5,0x70,0x61,0x99,0xA0,0xFF,0x3B,0xB6,0x99,0x29,0x8E,0xC5,0x54,0x04,0xD4, + + 0xF8,0x68,0x52,0x3E,0x77,0xB3,0xF2,0x2C,0xFC,0xDF,0x2B,0x48,0x78,0x87,0x0D,0xDE, + + 0xD3,0xD9,0x5A,0xCE,0x9C,0xD8,0xAC,0xE9,0x99,0x7E,0xDE,0x98,0x7F,0xFD,0x80,0x38, + + 0x74,0x35,0x53,0x3F,0xB1,0xB1,0x94,0x10,0x26,0x29,0xC0,0x6B,0xC1,0x89,0xDC,0xDC, + + 0x7B,0x5A,0xB5,0x1F,0x1C,0xDA,0x59,0x40,0x8D,0x7B,0xFF,0xFF,0xFF,0xFF,0xAD,0x7F, + + 0x9D,0x5C,0x88,0x10,0xED,0x29,0x03,0xD3,0x30,0xE2,0xB8,0x46,0xA9,0x6C,0x4A,0xE3, + + 0x31,0xAC,0x48,0x94,0xBC,0x63,0x66,0x0C,0xAA,0xB0,0x27,0x76,0xF0,0x1A,0xBA,0x4F, + + 0x69,0x0B,0x05,0x3A,0xF5,0x63,0x87,0x23,0x32,0xCF,0xA9,0x5B,0x51,0x6F,0xC2,0x81, + + 0x6A,0x32,0x9F,0x43,0xA2,0xB2,0x40,0xBB,0xC7,0xE3,0xDC,0xB1,0xD3,0x88,0x02,0x26, + + 0xFD,0x68,0xCA,0x51,0xB1,0x22,0x2E,0xC0,0xB7,0x4D,0xB0,0x20,0x69,0x6B,0x5F,0xA1, + + 0x77,0xF5,0xB0,0xD6,0x31,0x47,0x98,0x45,0xEC,0x48,0xA0,0xF6,0x56,0xBE,0x7F,0xE0, + + 0x5C,0xA9,0x91,0xD4,0xF1,0x06,0xD5,0x90,0xE0,0xB9,0xB1,0x21,0xAD,0xEB,0x10,0x57, + + 0x66,0x85,0x93,0x40,0x30,0x21,0xA6,0x02,0xE1,0x29,0xDB,0x97,0x51,0x2F,0x3C,0x68, + + 0x63,0x07,0x3A,0xEC,0x43,0x2E,0xA8,0x28,0x48,0x48,0xFA,0x4E,0xA7,0x66,0x34,0xFA, + + 0x3F,0x96,0x3E,0x7E,0xA6,0x6B,0x24,0x0D,0xC4,0xEF,0xE5,0xFE,0xF8,0xF6,0x83,0x3B, + + 0xB4,0xB5,0xAD,0x4C,0x39,0xF5,0x13,0x5B,0x23,0xAB,0xAB,0xD3,0x5B,0x67,0x35,0x30, + + 0x41,0x02,0x4B,0x77,0x9F,0xA9,0x0A,0xF9,0xDE,0x50,0x37,0xB9,0x91,0xDB,0x5C,0x61, + + 0x29,0xAC,0x92,0x54,0x79,0x4C,0xB5,0x28,0x0E,0x0E,0xF2,0x0E,0x19,0x92,0xD9,0x1F, + + 0x38,0x09,0xF2,0x0C,0x13,0x22,0x22,0x0B,0x33,0x44,0xE2,0xAC,0xE4,0x62,0x1A,0xBC, + + 0x6F,0xA1,0xBB,0xCF,0x9F,0xD4,0xC5,0x8E,0x23,0x4D,0xAB,0xEF,0xB4,0x0D,0xF1,0xC6, + + 0x74,0x14,0xAB,0xFD,0x27,0x22,0x1A,0x3E,0x01,0x2C,0xE3,0x2D,0xD3,0x60,0x22,0xA9, + + 0x4C,0xBD,0x68,0x00,0x78,0x80,0xEF,0xD3,0x58,0x2F,0xC4,0xD3,0x7C,0xDB,0x1B,0xA0, + + 0x25,0xAE,0x4C,0x51,0x85,0x3B,0x47,0x8B,0x67,0x92,0xED,0x30,0x7F,0x1A,0x93,0xE1, + + 0xA1,0xBF,0x8D,0xA9,0xCF,0x12,0xCC,0xA1,0x9B,0x4F,0x0F,0x0A,0x72,0x6E,0x37,0x20, + + 0xD1,0x8C,0x19,0x11,0xB3,0xDA,0x54,0x73,0x40,0x2C,0xC4,0x99,0x54,0x85,0xF0,0xA2, + + 0x9D,0x48,0x3F,0x26,0x93,0xBE,0x6A,0x44,0xED,0xA2,0xDC,0xAC,0x32,0x7B,0xF4,0x2F, + + 0xCA,0xA4,0x06,0xA6,0x90,0x33,0xAA,0x83,0x45,0x5A,0x12,0x9E,0xD2,0x8A,0xFE,0x8F, + + 0x91,0x84,0xBA,0x27,0x30,0x7E,0x5D,0xF5,0xE4,0xB7,0x15,0x38,0xF1,0x36,0xE1,0x4E, + + 0xA2,0x67,0x45,0x19,0x10,0x31,0x6C,0xDC,0x06,0xA8,0x6E,0xC1,0xBB,0xB6,0x58,0x25, + + 0x28,0xBC,0x46,0x0C,0x76,0x7A,0x7E,0xCA,0xDF,0x56,0xD7,0xCA,0xAE,0x70,0xBF,0xB4, + + 0xD5,0xA8,0xB0,0xF9,0x19,0x34,0x67,0xD7,0x15,0xA6,0xA6,0x42,0xD5,0x74,0x16,0x31, + + 0x14,0x6B,0xC3,0x2D,0xBB,0xAA,0x2F,0x42,0x6B,0x57,0x57,0x2F,0x35,0x87,0xBC,0xA1, + + 0xAF,0x51,0x0F,0xBC,0x0C,0x90,0xA6,0x05,0x1E,0x66,0x60,0x7A,0xCA,0x78,0x56,0xD5, + + 0x3A,0x07,0x4E,0x39,0x59,0x4D,0x68,0x4C,0xE5,0xAA,0x8C,0xAC,0x0E,0xD3,0x74,0x74, + + 0x9C,0xE8,0xF6,0x0C,0xF6,0xB5,0xCE,0xCE,0x4D,0xA8,0xA0,0xFB,0x5F,0xD2,0x80,0xAF, + + 0x96,0x61,0xBF,0x4F,0x9B,0xCF,0x5F,0xEC,0x95,0xA1,0x77,0x9F,0x98,0x5A,0x1B,0xC8, + + 0x81,0x5D,0xCE,0x3F,0x1A,0xB5,0xC8,0xDD,0x69,0x57,0x7F,0x8E,0x58,0xFC,0x58,0x30, + + 0xCC,0x8F,0xB2,0x82,0x1E,0xD9,0x51,0xA6,0x47,0x83,0xF8,0x6E,0xB5,0x1F,0x95,0x4D, + + 0xD0,0xDC,0x90,0x68,0x94,0xAC,0x10,0x50,0xF0,0xCD,0xB4,0xB2,0x57,0xB9,0xF4,0xF0, + + 0xF6,0x7E,0x89,0x65,0x6D,0xAE,0x08,0x61,0x65,0xFF,0x71,0xE2,0x60,0xE8,0x82,0xFE, + + 0x87,0xD8,0x16,0x55,0x34,0xD8,0x01,0x5C,0x44,0xCE,0x79,0xB7,0x9B,0xA1,0x27,0x24, + + 0xF1,0xE8,0xEA,0x06,0xB5,0xA2,0x38,0xE7,0xBA,0x75,0xC8,0x36,0x52,0xEB,0xBC,0xA3, + + 0x21,0x7A,0xE9,0xB4,0xBB,0x2E,0x06,0xD2,0xCA,0x63,0x7C,0xF4,0x39,0x64,0xDE,0xDD, + + 0xC4,0x29,0xB1,0x56,0x37,0x2E,0xB1,0xAF,0xC7,0x1B,0x2E,0x89,0xD0,0x3C,0x37,0x6E, + + 0x78,0x0A,0x6E,0xB5,0x15,0xA4,0xA9,0xB3,0x83,0x63,0xC3,0x95,0x7B,0x6C,0x97,0x8E, + + 0x0B,0xB6,0xA0,0x8A,0x1E,0x43,0x0C,0x17,0x24,0xC5,0xF2,0xF8,0x5F,0xB8,0xBF,0x9A, + + 0x66,0x18,0x92,0xE0,0x9E,0xA4,0xC1,0x45,0x2D,0xCB,0xBD,0xCF,0x38,0xBC,0x7D,0x27, + + 0x30,0x21,0xCB,0x6D,0x63,0xA4,0xCC,0x58,0xB8,0xA9,0x8D,0x5F,0xFE,0x47,0x9E,0xEA, + + 0xF5,0x89,0xD4,0xDD,0x3C,0x34,0xC4,0x45,0xAF,0xBE,0x9B,0x37,0x34,0x62,0x1C,0x72, + + 0xE7,0x1D,0x67,0x2C,0x5D,0xA3,0x22,0xCE,0x86,0x7D,0x0D,0x8C,0xF2,0x67,0xEA,0x1B, + + 0xB1,0xCF,0xB0,0xC7,0xBC,0xAB,0x6D,0x3B,0x69,0x8F,0x05,0x9C,0xDD,0xEE,0xCF,0xD8, + + 0xFA,0x86,0x9B,0xCD,0xBC,0x8C,0xE4,0x7A,0xBE,0x6E,0x75,0x8D,0x72,0x65,0xFD,0x55, + + 0x2E,0x50,0x63,0x9A,0x3E,0x25,0xED,0xCC,0x6E,0x30,0x6B,0x0D,0x7C,0xE9,0x49,0xF1, + + 0x14,0x3B,0x3E,0xA9,0x1C,0xED,0x63,0x59,0xD5,0x43,0x0C,0x39,0x66,0xBD,0x54,0xA3, + + 0x19,0x3E,0x2C,0xB7,0x80,0x1A,0x3A,0x99,0x8C,0xE0,0x26,0x49,0xBD,0x38,0x5D,0x87, + + 0x44,0x47,0x9B,0xF7,0x94,0x7F,0x4E,0x4B,0x76,0x90,0x56,0xE7,0xF8,0x59,0xB8,0xED, + + 0xCF,0xC2,0x37,0x39,0x9D,0xEE,0x2B,0x8E,0x0E,0x22,0x22,0x88,0x90,0xB2,0x2F,0x20, + + 0xFA,0x97,0x9D,0x24,0xB4,0x57,0xB0,0x80,0x25,0x6B,0x96,0x15,0xFA,0x29,0x13,0x2C, + + 0x21,0xF5,0x94,0x54,0x32,0xBC,0x04,0x70,0x45,0xA0,0x6C,0x06,0x4D,0x24,0x5F,0x28, + + 0x15,0x09,0x31,0xA5,0xF5,0x48,0x0D,0x81,0xA5,0xA9,0x8D,0xC0,0x0B,0xF9,0x15,0x3B, + + 0xEB,0xD5,0xD7,0x35,0x1B,0xB8,0x45,0xA3,0xA7,0xD8,0x83,0xF1,0x16,0x74,0x58,0xA6, + + 0xC5,0x91,0xFF,0xA3,0x99,0xB3,0x0C,0x1B,0x18,0x77,0x11,0x87,0xA4,0xA9,0x9D,0x78, + + 0x45,0x28,0x96,0x60,0x91,0xB4,0xD9,0x9E,0x06,0x10,0x29,0x3A,0x11,0x0F,0x79,0x69, + + 0xA8,0x1F,0xF9,0x0D,0x75,0x92,0xA4,0xBA,0x80,0xDE,0x12,0x82,0x9F,0x73,0x51,0xA2, + + 0x58,0x38,0x52,0x1B,0xB7,0xA1,0xC0,0x3F,0xE3,0x0C,0x87,0x4C,0xD7,0xE0,0x60,0x56, + + 0xBB,0x41,0x86,0x8A,0x69,0x3C,0x4E,0x3A,0xD1,0xD3,0x5C,0x1D,0xF2,0xF1,0xAE,0xEF, + + 0xBB,0xC0,0x6E,0x3C,0xBD,0xF5,0xF9,0x18,0xED,0xDE,0xAC,0x5A,0x8C,0x40,0xCE,0x84, + + 0x53,0xE2,0x9F,0xE8,0x1F,0x36,0x17,0x4B,0xEC,0x55,0xE5,0xEF,0x05,0x73,0x17,0xFC, + + 0x12,0x90,0x36,0x2F,0xB7,0xB0,0xCE,0x99,0xAC,0xD0,0xE5,0xFA,0x14,0xBB,0x23,0x07, + + 0x24,0xA1,0x15,0x80,0x12,0xEC,0x02,0x47,0xAB,0x04,0x1A,0xA0,0x52,0xC3,0xA8,0x62, + + 0x63,0x1D,0x48,0x91,0x96,0x29,0x0E,0x52,0x21,0x2C,0xFD,0xB0,0x57,0xDF,0x39,0x31, + + 0x0D,0xAD,0x41,0x85,0xDE,0xDD,0x2B,0x91,0x51,0x03,0xEE,0x5A,0xD6,0x40,0x77,0x16, + + 0x20,0xDC,0x8F,0x91,0x9F,0x63,0x67,0x37,0x20,0xC0,0x1E,0x8A,0xC1,0xDE,0xE0,0x33, + + 0x6A,0xD7,0x92,0x46,0xA5,0x66,0xDB,0x02,0x4C,0x02,0xEE,0xC5,0xA6,0x67,0xFC,0x32, + + 0xFC,0xA1,0x82,0x41,0x32,0xC5,0x64,0x21,0xC1,0x41,0x1C,0x2A,0x5D,0x7B,0x3F,0x46, + + 0x23,0xD9,0x41,0xE3,0x79,0xD7,0xC1,0x41,0xE6,0x06,0x88,0x61,0x07,0x0A,0xDB,0x57, + + 0x4B,0xA6,0xF7,0x68,0x70,0x2E,0x38,0x13,0xF0,0x03,0xA4,0x86,0xFD,0xB3,0xB6,0x6A, + + 0x2C,0xD7,0xA2,0x0C,0x9A,0x34,0x3F,0x0C,0xD5,0xB5,0x02,0x32,0x30,0x9C,0x1C,0x2A, + + 0x2D,0xBF,0x35,0xFE,0x1F,0x6B,0x20,0xD3,0xFA,0x08,0xA4,0x11,0xD4,0xCF,0x5D,0xEB, + + 0xC8,0xA7,0xEE,0x73,0x3B,0x4F,0xBE,0x67,0x3D,0x16,0x01,0x5F,0x33,0x1B,0x30,0x69, + + 0x09,0x14,0x5F,0xF5,0xE5,0x69,0x42,0xBD,0x6C,0xB4,0x50,0x7D,0xDD,0x47,0xE6,0x2A, + + 0xF9,0x69,0x42,0x8A,0x3A,0xA7,0xAA,0xEA,0xCA,0x6B,0x02,0xE8,0x59,0xD1,0x71,0xE4, + + 0xE0,0xEC,0xF4,0x2F,0x67,0x22,0xA5,0x84,0x4B,0x40,0x49,0x5B,0xFA,0xC2,0x7B,0x74, + + 0x61,0x1F,0xA6,0x70,0x9C,0x24,0x6B,0x09,0x84,0x03,0x13,0xAD,0x51,0xC1,0x12,0xDF, + + 0x6E,0xF0,0x4C,0xE2,0xDB,0xC1,0x24,0x81,0xCB,0x0D,0x4C,0x3A,0x11,0x4C,0xBF,0xE2, + + 0x61,0x50,0x30,0xE6,0x4C,0xCF,0x2C,0x22,0xF1,0x3E,0xAE,0x37,0x1C,0xDF,0x34,0xF2, + + 0xDE,0x17,0x4C,0x11,0xFB,0x37,0x35,0x67,0x94,0x5E,0xFA,0x98,0x98,0x40,0x7D,0xA5, + + 0x22,0xFE,0xBE,0x07,0x21,0x4C,0xD5,0x24,0x2A,0x54,0x03,0x62,0x19,0x63,0x24,0x32, + + 0x00,0x7D,0xA4,0x46,0x10,0xCC,0xA9,0xCE,0x42,0xFE,0x87,0xB7,0x42,0xDE,0x3D,0xB3, + + 0x4E,0x9D,0x7F,0x74,0x8C,0x9B,0x2C,0x00,0x22,0xA9,0x2F,0x8B,0x99,0x30,0x15,0x11, + + 0x86,0x95,0xE1,0xBB,0x1D,0x73,0x7C,0x7E,0xC2,0xD9,0x78,0x8B,0x1B,0x31,0x65,0x4B, + + 0xA1,0xB6,0x19,0xE1,0x2B,0x8B,0x5F,0x81,0x45,0x50,0x01,0x76,0x53,0xD9,0xB5,0xA2, + + 0x9F,0x55,0x59,0x8E,0x4E,0x8B,0x17,0xEC,0xA3,0x51,0x22,0x8B,0x99,0x13,0xE1,0xAC, + + 0xA7,0x1E,0x32,0xEE,0xBA,0x24,0x89,0xD8,0x3D,0x53,0x00,0xDC,0xF8,0x6E,0x6E,0xD2, + + 0x87,0x14,0x31,0x7E,0xBB,0x25,0xDE,0x3D,0xEE,0x51,0x8B,0xAF,0x49,0x28,0x2E,0x3B, + + 0x09,0xEC,0xE8,0xD2,0x1B,0x5F,0x04,0x2D,0xEE,0x39,0x9F,0xB9,0x30,0x9B,0xEC,0xBD, + + 0x2B,0x1F,0x62,0xFF,0x46,0x5E,0x19,0x3D,0xE7,0x1B,0xC6,0xA2,0x1C,0x84,0x0D,0x71, + + 0xC3,0x2D,0xF9,0xA5,0x19,0x7C,0xFC,0x7B,0xC9,0x5A,0x16,0x2C,0xF1,0xA3,0x36,0xAB, + + 0x0A,0xB6,0x79,0xA7,0x3D,0x9D,0xD9,0xE8,0xE9,0x91,0x49,0x82,0xB1,0xAC,0x3F,0xEE, + + 0x43,0x4F,0xFB,0xB2,0xBC,0x34,0x77,0x67,0x4B,0xD4,0x63,0x8F,0x77,0xD8,0x37,0xDD, + + 0x4B,0xCA,0x30,0xBF,0x50,0xEE,0xBD,0x1B,0x69,0x5B,0x97,0x7C,0x7B,0xDF,0x7A,0x00, + + 0x96,0xC1,0xE2,0xC6,0x17,0x00,0x0E,0x42,0x98,0xCF,0x2B,0x55,0x75,0x5F,0x3A,0x13, + + 0xFE,0x0C,0xA8,0x94,0x84,0x0F,0xC0,0xC1,0x78,0xC7,0xE6,0x9A,0x39,0x4A,0xE5,0x86, + + 0xC7,0x71,0x61,0x82,0x90,0xA6,0x03,0x07,0xF7,0x23,0xEA,0x27,0xEB,0xD3,0xFD,0xE9, + + 0xA1,0x85,0x12,0xF5,0x39,0x5E,0x10,0x90,0x66,0x82,0x6C,0x33,0x29,0x22,0x1F,0x85, + + 0xEF,0x95,0xF0,0x66,0x56,0x29,0xF0,0x2D,0xC4,0xC0,0xCE,0x5A,0x9C,0xE7,0x76,0x67, + + 0x95,0x8D,0x23,0x69,0x40,0x7E,0xF8,0xA9,0x74,0x81,0x7A,0x0D,0xDA,0x63,0x06,0xB3, + + 0x06,0x99,0xB8,0x40,0x31,0x04,0xBD,0x01,0x3D,0x84,0xB9,0x37,0xF4,0x87,0x6B,0xBB, + + 0xC8,0x83,0xE9,0x6C,0xB6,0x3C,0xC6,0x95,0x45,0xC3,0x79,0xB7,0xCF,0xE6,0x8C,0x45, + + 0xAD,0x77,0xDA,0xE6,0x68,0xE5,0xF2,0xAA,0x59,0x8A,0x01,0x1F,0x5A,0x50,0xBA,0xF8, + + 0xA1,0x02,0xEA,0x8B,0xE2,0xAF,0x13,0x48,0xEC,0x38,0x04,0x1A,0xD0,0x64,0x43,0x41, + + 0x6A,0x87,0x63,0x8A,0x84,0xE8,0x73,0xBE,0x33,0xCC,0x12,0x5C,0xB0,0xE9,0xAC,0xF9, + + 0x0F,0xA3,0x4B,0x47,0x3C,0x34,0xC4,0xB9,0x5C,0xA6,0xDD,0x17,0x36,0xFA,0x27,0x0D, + + 0xEF,0x7A,0xE2,0xCA,0x1A,0xD0,0x94,0x08,0x0D,0x3C,0x66,0x52,0xA7,0x82,0x91,0x1D, + + 0xE6,0x9C,0x51,0xFB,0xE8,0x50,0x5A,0xE0,0xEE,0xDD,0x3A,0xBE,0xE4,0xE5,0x9C,0x39, + + 0x4C,0x8E,0x5C,0x7E,0x3F,0x51,0x2A,0x6C,0x69,0xC8,0x91,0x62,0xDD,0xFF,0x8C,0x25, + + 0xEE,0x8B,0xF9,0xDF,0x74,0x24,0x83,0x1D,0x30,0x45,0x2B,0xFB,0xDC,0x52,0x3B,0xE0, + + 0xE5,0x1A,0x9C,0x04,0xA5,0x4E,0x14,0xA2,0xE6,0xCC,0x18,0xD5,0x40,0x06,0x54,0xB6, + + 0x16,0xB5,0xD4,0x14,0xA4,0x8F,0x83,0x50,0x63,0xD3,0xA9,0x3C,0x76,0xD8,0xA2,0x01, + + 0x86,0xE0,0x0A,0x65,0x18,0x4F,0x5B,0xDD,0x47,0xB7,0xEF,0xA5,0x47,0x5B,0x95,0x6C, + + 0x04,0x62,0x95,0x68,0x19,0xBE,0x97,0x37,0xE7,0x31,0x83,0xD7,0x95,0x0C,0x1C,0xF3, + + 0x42,0x3B,0x50,0xA4,0xDD,0x45,0x91,0x80,0xA7,0x5E,0x34,0x26,0xCD,0xFC,0x12,0xE3, + + 0x6F,0xE4,0x47,0x91,0x39,0x69,0x9A,0x10,0xE5,0xD1,0xDC,0xE7,0xCA,0x44,0xF7,0xBD, + + 0xCC,0x37,0x56,0xFB,0x85,0xD6,0xF2,0xF3,0x64,0x1A,0x74,0x88,0x8E,0x49,0x59,0x59, + + 0x83,0x4C,0x29,0x1D,0x0C,0x18,0x98,0x91,0xA4,0x27,0x82,0x94,0xF4,0x0B,0x5E,0xAE, + + 0x8D,0x47,0xC6,0xC4,0x95,0x44,0xC9,0xA2,0x6A,0x5A,0x49,0xDC,0x1E,0x07,0x67,0xAB, + + 0x8C,0x38,0xF0,0xEB,0x7D,0x34,0xFA,0xBE,0xED,0xD9,0x41,0xC0,0x53,0x26,0x93,0xE9, + + 0x53,0x37,0xDF,0xA8,0x41,0xB5,0x7F,0x6B,0xA4,0x98,0x4C,0xD0,0x94,0xF7,0x17,0xBF, + + 0xC5,0x96,0x50,0xE0,0xBB,0x39,0x5F,0xF1,0x76,0xDF,0x81,0x8B,0x81,0x54,0xCD,0x37, + + 0xE6,0xE7,0xB2,0xD0,0x1C,0xD0,0x74,0x68,0xAB,0xCA,0xC9,0xB1,0x5A,0xE7,0xA1,0x50, + + 0xAA,0xBC,0x90,0x7F,0xD6,0x6C,0x25,0xFA,0x50,0xFD,0x33,0x43,0xDE,0x22,0x66,0xB9, + + 0x55,0xDC,0xD9,0xF2,0x74,0x9D,0x0F,0x99,0x11,0x23,0x93,0x7B,0x1B,0xBC,0xC7,0xFB, + + 0x2D,0x9B,0x89,0x7F,0x54,0xBC,0x6D,0x7C,0x54,0x42,0x4B,0x9D,0x00,0xBE,0xA3,0x29, + + 0xDC,0x51,0x27,0xA0,0xC4,0x03,0x42,0xDF,0xAB,0xB1,0x03,0xD7,0xD4,0xED,0xC0,0x76, + + 0xEA,0x62,0xB2,0xE7,0x3F,0x8C,0x0B,0x43,0x3D,0xE7,0x27,0xD6,0x19,0x02,0x3E,0x61, + + 0xD4,0x19,0xA6,0xA5,0x40,0xD3,0xBD,0x52,0xE2,0xE4,0xC3,0x6A,0x3B,0x06,0x08,0x77, + + 0x6A,0x80,0x5D,0x52,0x5B,0x73,0x8C,0xF1,0x85,0xE7,0xB9,0x6A,0x30,0xCC,0x3E,0x31, + + 0x80,0x18,0x3F,0x2A,0x14,0x26,0x70,0x86,0x71,0xA5,0xC8,0x94,0x2D,0x6B,0x70,0xD2, + + 0x92,0x23,0x71,0xD0,0x19,0xB3,0x3A,0x30,0x42,0x25,0xB8,0x30,0x5C,0x68,0xFD,0x23, + + 0x7D,0x63,0x31,0xB4,0x31,0xA6,0xE9,0x92,0xD1,0x28,0x65,0x95,0x2D,0x69,0xE6,0xB3, + + 0x2F,0xFA,0x09,0xD5,0xDD,0xD8,0x07,0xB9,0xC2,0xCA,0xD3,0x74,0x70,0x61,0x62,0x0A, + + 0x17,0x0C,0xCA,0xBD,0xF1,0x6B,0x87,0x15,0x80,0xD9,0x46,0xC4,0x5E,0x25,0x74,0xBD, + + 0x19,0x44,0x88,0xF3,0x7A,0x0E,0x7C,0x00,0xA2,0x4A,0x7D,0xFC,0x0D,0x2B,0x00,0xE1, + + 0xD5,0x47,0xC9,0x0C,0x67,0xD7,0x43,0x6E,0x21,0x49,0x6C,0x5E,0xF6,0x06,0x75,0xA9, + + 0x0B,0x0F,0x9D,0xB8,0x9F,0x31,0x25,0x04,0x03,0x3A,0xD2,0x3D,0xDF,0x71,0x3A,0xCA, + + 0x93,0x61,0x7B,0xC8,0x18,0x24,0xAB,0x06,0xC7,0xEA,0xDE,0x6B,0xFB,0xE4,0x2A,0x12, + + 0x85,0xF1,0xB2,0x4C,0xAE,0xA8,0xCD,0x90,0x27,0x00,0x1E,0x1E,0x1A,0x2D,0x7B,0xB6, + + 0x26,0x03,0x03,0xCD,0x6C,0x85,0x1A,0x29,0xCE,0x67,0x93,0x8F,0x58,0x66,0x33,0x7E, + + 0x76,0x00,0xD9,0x79,0x9D,0x0D,0x24,0xEB,0xCA,0x47,0xA3,0x1F,0x9A,0xEF,0xC0,0x05, + + 0x63,0x30,0xD4,0x9E,0x4C,0x90,0x3C,0xC2,0x9D,0x5C,0x9C,0xBC,0x8D,0x79,0x19,0xAD, + + 0xE9,0x40,0xF2,0x24,0xDA,0x92,0xCC,0x34,0x13,0x17,0xFC,0xFE,0x9B,0x7E,0x1A,0xE1, + + 0xB4,0xB6,0x51,0x87,0x71,0xBF,0x2D,0x9F,0xCA,0xA7,0x90,0xD7,0x1B,0xDB,0x5D,0x79, + + 0x8A,0x17,0x56,0xDA,0xCE,0x18,0x75,0xD3,0x1E,0x5D,0x62,0x91,0xF7,0xE0,0x17,0xCA, + + 0x24,0x87,0xA8,0x64,0x66,0x16,0x6A,0xC8,0xED,0xA2,0x9C,0x2C,0xF7,0x56,0x8C,0x94, + + 0x0E,0x1D,0xBE,0xD1,0x3F,0x5B,0xAC,0x92,0x9C,0x28,0x58,0x70,0x2C,0x37,0x46,0x43, + + 0x3B,0x7B,0xA5,0x9A,0x11,0x3B,0x1D,0xFD,0x60,0x4A,0x45,0x96,0xEA,0x7D,0x4B,0xA3, + + 0x48,0xBE,0xED,0xD4,0x3E,0x3F,0xF1,0x6E,0xE0,0xD7,0x1D,0x2C,0x0A,0x3B,0x07,0x9B, + + 0x10,0xE9,0x5B,0xB4,0x43,0xC7,0x2E,0x56,0x6E,0xD8,0x1C,0xEC,0x7C,0x50,0x91,0xFE, + + 0xC2,0x3A,0x8D,0x2C,0xD8,0x96,0xDF,0x5E,0x4B,0xC9,0x1E,0xBE,0x15,0x7F,0x21,0xA5, + + 0x8A,0x01,0x47,0x50,0x2A,0x39,0xCA,0x8D,0x09,0x41,0x98,0xDE,0x91,0x71,0x0E,0xFF, + + 0x42,0x58,0x5B,0x75,0xBF,0x76,0x1C,0x3B,0x2C,0x68,0xB6,0xDA,0x58,0xA4,0xB9,0xEC, + + 0x62,0xBD,0x46,0xAD,0xB1,0x70,0xF7,0xC1,0xEA,0xDE,0x52,0xC8,0x9B,0xD3,0xDE,0x27, + + 0x8A,0x82,0xD6,0xB1,0x19,0x0D,0x1C,0x07,0xD6,0x31,0xCB,0x0F,0x4F,0x02,0x67,0x92, + + 0xD5,0x3E,0x44,0x25,0x32,0xF3,0x37,0xA3,0x4C,0x53,0x41,0x1E,0xCA,0xD1,0xFB,0xBB, + + 0x50,0x5D,0x0B,0x7D,0xBB,0x3D,0xB8,0x39,0xF3,0x1D,0x70,0x92,0x26,0x3D,0x6B,0x60, + + 0xF7,0x0C,0x36,0x69,0xB7,0x0D,0x4E,0x1F,0xC9,0x6D,0x33,0xD5,0xD8,0x1D,0x38,0x20, + + 0xCD,0x8E,0xDC,0x92,0x06,0x40,0xE8,0x41,0x6F,0x67,0x81,0x12,0x66,0x7A,0x6B,0x1E, + + 0xEF,0x8D,0x75,0x36,0x80,0x23,0xE1,0xB0,0xB4,0x6D,0xC9,0x36,0xFA,0xE6,0xBC,0xE0, + + 0xF5,0x1E,0x14,0xF5,0x69,0xE0,0xAC,0xC0,0xEF,0x16,0x01,0xD7,0xD1,0x1C,0x5A,0xB1, + + 0x6E,0x9F,0x07,0xC2,0x14,0x46,0xB0,0x0C,0xB9,0x1F,0x88,0x04,0x17,0xE5,0x7E,0x15, + + 0xD9,0x8F,0xA7,0xD2,0x15,0x72,0xF8,0x3D,0xBF,0xDF,0x80,0xF4,0x52,0xC1,0xF7,0x25, + + 0x79,0x2B,0x1E,0x29,0x90,0xA4,0x71,0x9B,0xC6,0x84,0x89,0x05,0x97,0xEE,0x7C,0x20, + + 0xEF,0xC5,0x68,0x16,0x1D,0xBC,0xB9,0x77,0x1C,0x33,0xC1,0x27,0xDF,0xE8,0x68,0x17, + + 0x67,0x87,0x11,0xAF,0xE4,0xAB,0xA5,0x15,0x6E,0x8A,0x22,0xAC,0xCD,0x4F,0x3D,0xE9, + + 0x79,0x8F,0x6A,0x0F,0x4B,0x5D,0x8D,0x8A,0xBE,0x76,0xF7,0xDE,0x49,0xAB,0x33,0x39, + + 0x44,0x85,0x90,0x32,0xAF,0x8A,0x60,0xAD,0x38,0xA9,0x8B,0xCF,0x88,0x47,0x0B,0x42, + + 0x2C,0xE9,0x7B,0x01,0xB7,0x1F,0xFB,0x3E,0x6E,0x16,0xE8,0x02,0x52,0x1D,0x31,0xB6, + + 0x08,0x1F,0x74,0x3D,0x0D,0xE3,0x63,0x68,0x4A,0x98,0x92,0x2A,0xDE,0xE1,0xAA,0x1E, + + 0x22,0x87,0xF6,0x9D,0x2C,0x7F,0x42,0x1A,0x37,0x8F,0x39,0x5E,0x05,0x2D,0x60,0xC9, + + 0x1F,0xE3,0x73,0x6F,0x92,0xEE,0x62,0xE9,0x5F,0x7A,0xF9,0x6D,0x7D,0xA0,0x2B,0x28, + + 0xE7,0xCD,0x53,0x3F,0x9B,0x86,0xBF,0xA5,0x6E,0x30,0xC1,0x84,0x20,0xAD,0x88,0xF1, + + 0x02,0x36,0x5B,0xF5,0x1A,0xDC,0x0C,0xE5,0xA6,0x72,0x00,0xC4,0xF6,0xEC,0x78,0x01, + + 0x5D,0x3E,0xE5,0x96,0xB8,0x37,0xC4,0x12,0x67,0xAB,0x7C,0x0E,0x72,0xF9,0xB6,0x70, + + 0x82,0x3F,0x42,0x47,0xB1,0xF0,0x3D,0xA6,0x87,0xF2,0xD1,0x23,0xF1,0xC8,0x79,0xD4, + + 0x4C,0x90,0xEB,0x57,0xFD,0xF1,0xFD,0x6F,0x1F,0x2E,0x7D,0x35,0x6C,0x9E,0xAF,0x4B, + + 0x02,0x6B,0x0C,0xCA,0x05,0xD6,0xB0,0x3C,0x8F,0xE5,0x7A,0x59,0x8B,0x9A,0x13,0x56, + + 0x70,0xA7,0x94,0x3E,0x7D,0xF8,0x42,0xDA,0x61,0xD7,0xC6,0x05,0x1F,0x5A,0x5D,0x39, + + 0x0A,0x9B,0x5D,0x45,0x94,0x86,0x0D,0xED,0xDE,0xA6,0x97,0xE2,0xF7,0x16,0xC1,0xAD, + + 0x65,0xF7,0x8D,0x77,0xEB,0xB8,0x75,0x77,0xE5,0x35,0x6F,0xF5,0xB8,0xB5,0x40,0x2E, + + 0xC5,0x69,0xEF,0x92,0xBC,0xFA,0x20,0xC8,0x04,0xD5,0x8E,0x50,0xD0,0xF5,0x10,0x3E, + + 0x4D,0x66,0xE6,0x1E,0xC9,0x1A,0x04,0x0A,0x7E,0x76,0x36,0x77,0x7B,0x6A,0x41,0x2A, + + 0xAD,0x0A,0x18,0xC8,0x7E,0xCB,0x25,0xCB,0x07,0x9E,0xD7,0xE5,0x72,0xB8,0x51,0x3B, + + 0x44,0xB8,0xA9,0x2E,0xDE,0x5F,0x9B,0x3F,0xA5,0xC2,0x77,0x7F,0xD5,0x76,0xF6,0xB8, + + 0x91,0xC3,0x0E,0xCA,0xBB,0xDC,0x89,0x1B,0xCD,0x5C,0xBE,0xD1,0xC3,0xBE,0x10,0xDD, + + 0xCE,0x92,0x6A,0x3C,0xBD,0xF5,0xBE,0x7A,0xDD,0x70,0xE8,0xD9,0xDE,0x52,0xDE,0x4F, + + 0xA4,0xA8,0x87,0x8B,0xF9,0x35,0xCE,0xD9,0x8E,0xDF,0xF1,0x10,0x5F,0x51,0xDB,0x39, + + 0xBB,0xC8,0x26,0x3D,0x3D,0xF7,0x6E,0x7F,0xED,0x0F,0x6D,0xB8,0x35,0xAE,0x3E,0x29, + + 0x61,0x04,0x2D,0x20,0x7B,0x2F,0x81,0xA4,0x5D,0xBE,0xF6,0x22,0xB9,0x04,0x28,0x9A, + + 0x02,0xC1,0xC0,0x90,0x13,0x82,0x8A,0xC3,0x2D,0xEE,0x82,0x36,0xC3,0x69,0x78,0x72, + + 0xE8,0x8B,0x01,0x7A,0x96,0x20,0x2B,0xD2,0xA8,0xED,0x8B,0x27,0x63,0xBF,0x2F,0x20, + + 0xB9,0xA7,0xF6,0x6A,0x97,0x21,0x08,0xCC,0xA9,0xF8,0x19,0xF2,0xF5,0x0F,0xC0,0x3B, + + 0xE2,0x85,0xF5,0xC0,0x5F,0xB5,0x09,0x1C,0xE7,0xE2,0xEB,0x7F,0xF1,0x26,0x88,0xD0, + + 0xF5,0x48,0x95,0x15,0x15,0xC4,0x78,0x83,0xE0,0x57,0x30,0x4A,0x79,0x90,0x48,0xC5, + + 0x80,0xFA,0x1C,0x44,0xA5,0x5A,0x03,0x12,0xEC,0xCF,0x55,0x0D,0x8E,0x62,0x4B,0xB7, + + 0xA7,0xB8,0x77,0xD1,0x9F,0xFC,0xE1,0x01,0x43,0xE1,0x09,0x4E,0xF2,0xFC,0x90,0x24, + + 0xE1,0xA9,0x8A,0x88,0x12,0x68,0x84,0xAC,0x15,0x3A,0x02,0x5F,0x1F,0xE1,0x74,0x29, + + 0xE2,0xC8,0x33,0x86,0xF2,0x4A,0x8B,0x4B,0x21,0xEF,0x09,0x5A,0xA6,0x05,0x53,0x7E, + + 0xC0,0x87,0x2F,0x96,0x73,0xA9,0xBF,0x5A,0xAC,0xEC,0x13,0xCD,0xB7,0x71,0xE7,0x6A, + + 0xED,0x8D,0xD5,0xFF,0x9D,0xD6,0x0E,0xF9,0xC6,0x27,0xF9,0x7D,0xD8,0xEB,0x7A,0xB6, + + 0xA6,0x01,0xBD,0x8B,0xE7,0x9A,0x2A,0x4C,0xA3,0x45,0xD2,0x7F,0x38,0x3F,0xA6,0x27, + + 0xC9,0x0D,0xCF,0xD8,0x77,0xC0,0xF6,0xE7,0x6F,0xE0,0x0E,0xF8,0x02,0x39,0xBC,0xCD, + + 0xDD,0x3C,0x78,0xDE,0x39,0x26,0x11,0x96,0x23,0xED,0x8D,0xC0,0xD2,0x1B,0xF0,0xCB, + + 0x8F,0x4E,0x70,0x42,0x38,0x6D,0x8A,0x49,0xC3,0xE0,0xFB,0xFC,0xE4,0x67,0x22,0xB1, + + 0x4C,0xB4,0xC0,0x80,0xBD,0x86,0x1C,0x5B,0x1F,0x4C,0x8C,0x3C,0x76,0x12,0xBB,0xFF, + + 0x27,0xB1,0xF2,0x21,0xCC,0x73,0x7D,0x32,0xFC,0x87,0xFC,0xFE,0xBF,0x33,0x97,0xA9, + + 0xA6,0x18,0xFB,0x2D,0x05,0xA4,0xCE,0x22,0xE6,0xA8,0x90,0x21,0xF2,0xD1,0xF2,0xE2, + + 0xC9,0x1C,0xCD,0x4C,0xB7,0x31,0x25,0xA1,0x42,0x58,0x17,0xA8,0xF2,0xA3,0x5E,0xC2, + + 0x91,0xB9,0x90,0xCB,0x14,0x32,0x44,0x13,0xE6,0xD9,0x2F,0x14,0xE8,0xA5,0xDC,0x20, + + 0xD0,0xB4,0x82,0x27,0x0D,0x91,0xB1,0xC0,0x62,0xFA,0xA3,0x94,0x0B,0x19,0x91,0xB1, + + 0x22,0x00,0x68,0x0A,0x13,0x3D,0x07,0xCA,0xE4,0xB7,0x15,0x25,0x1B,0x7B,0x9C,0x22, + + 0x27,0x9C,0xD5,0x6D,0x0F,0x34,0xFD,0x83,0x81,0x62,0xBF,0xE5,0xF0,0xF7,0xB2,0xFB, + + 0x4C,0x17,0xD0,0x77,0xC5,0x7A,0x94,0x2A,0xF5,0xEE,0x56,0x2C,0xBD,0x3A,0x56,0x9E, + + 0x1A,0x42,0x48,0xDB,0xE3,0xC6,0xB3,0x23,0xC8,0xDE,0x7B,0x38,0x3C,0x89,0x82,0xE6, + + 0xC9,0xCA,0x47,0xC7,0xBE,0x38,0x2F,0xB9,0x4B,0x5C,0xD7,0x1C,0x7A,0x66,0x31,0xAC, + + 0x0E,0x0B,0x34,0x07,0x24,0xC6,0x1B,0xA0,0x45,0x56,0x97,0x1D,0x7B,0x67,0xB1,0x79, + + 0x10,0xB3,0x77,0xF1,0x41,0x2A,0x96,0xBD,0x1A,0xF1,0x8D,0xEC,0xFA,0xFC,0xE2,0xAB, + + 0x1D,0xEB,0xA3,0xAE,0xC4,0xC0,0x66,0x02,0xC7,0x50,0xE5,0x79,0x75,0x1F,0xE3,0xED, + + 0x84,0xC1,0x9C,0xC2,0xBC,0x74,0xDE,0x6D,0x86,0x8A,0xE8,0xDD,0x09,0xE1,0x31,0x75, + + 0x42,0x2C,0x63,0x4E,0x9A,0x35,0xF3,0x66,0x1A,0x89,0x95,0x60,0x00,0x7C,0xDF,0x71, + + 0x6C,0x09,0x60,0x86,0x64,0x1F,0x0A,0xB1,0x74,0x3F,0xEA,0x67,0xF3,0xA1,0xAA,0xE3, + + 0x6D,0x71,0x68,0x97,0x11,0xCD,0x94,0x4D,0x8F,0x90,0x98,0xCF,0xAA,0x1A,0x01,0x91, + + 0x58,0x8A,0x1E,0x83,0x96,0x18,0x0B,0xB0,0xA8,0x1D,0x0E,0xC7,0x92,0x99,0x77,0x27, + + 0x7A,0xED,0xCE,0xE4,0xF3,0xFE,0x82,0xA0,0xFD,0xC9,0xB2,0xCB,0x53,0xA1,0x5E,0xEE, + + 0x6E,0x89,0x64,0xF0,0x5E,0xFC,0x23,0x10,0x62,0x11,0xCA,0x9D,0xAA,0xA7,0x93,0xA2, + + 0x05,0x74,0x6F,0x16,0xD7,0xE4,0x78,0x76,0x43,0xB9,0x99,0xF4,0xCA,0x9B,0x9E,0x30, + + 0xBC,0xE5,0xDF,0x0B,0x1B,0x20,0xA7,0x5C,0xF4,0x5D,0x42,0xC6,0xD0,0x1C,0x17,0x55, + + 0xE4,0xF0,0x97,0x50,0x36,0x38,0x43,0x80,0xD2,0x63,0xC1,0xE7,0x74,0x4A,0x1C,0x3E, + + 0xC6,0x99,0xC1,0xFD,0x76,0x55,0x3E,0x0A,0x00,0xC6,0x7D,0xA4,0x63,0xEC,0x53,0x69, + + 0x65,0x00,0xEA,0xAF,0xE6,0x54,0xD6,0xA8,0x50,0xC1,0x61,0xBD,0x5B,0x13,0x1D,0x3E, + + 0xED,0x8E,0x63,0x8F,0x9D,0xE8,0x53,0x64,0xEF,0xC7,0xEC,0xD0,0xA3,0xF2,0x0B,0x91, + + 0x8C,0x4B,0x6B,0x9B,0x12,0xE9,0x38,0x49,0x6E,0xB0,0xDA,0xD7,0xA9,0xA6,0xB1,0xB9, + + 0x82,0x81,0x56,0x2C,0xE5,0xEE,0xFB,0x27,0x6C,0x0C,0xEA,0x81,0x69,0xEC,0x52,0xA9, + + 0x6D,0xE3,0xFD,0x41,0x6B,0x39,0xF7,0x89,0x52,0x60,0x25,0xF4,0x28,0x99,0xF3,0xB8, + + 0xA0,0xEB,0xAF,0x9B,0xBA,0x7A,0xF1,0x9B,0xCF,0x6F,0xC4,0x53,0x2E,0x5F,0x0D,0x62, + + 0x66,0x1E,0x7C,0x44,0xBD,0xFB,0xF6,0x4A,0x6E,0x4E,0x7B,0xAB,0x61,0x62,0x1A,0xAA, + + 0x83,0x8B,0x09,0x68,0xC4,0x13,0x46,0x57,0x74,0xD6,0x52,0xC4,0x83,0x95,0x2D,0xE1, + + 0x11,0xDE,0x1B,0x3E,0x33,0xF1,0x44,0xB0,0x35,0x2A,0x04,0x4D,0x1E,0xFE,0x7C,0xF0, + + 0x9C,0xDD,0x92,0x33,0x40,0x51,0x1C,0xB9,0x87,0xF2,0x8D,0x58,0xC7,0x23,0xBD,0x7B, + + 0x23,0x5E,0x00,0x89,0x39,0x47,0x3D,0x4F,0xE3,0x93,0x3D,0x85,0x95,0x6B,0x87,0x31, + + 0x1C,0xD5,0xF5,0xD5,0x14,0xF0,0x3C,0xEE,0x8F,0x8C,0xE4,0x62,0x36,0x6B,0xD3,0xE3, + + 0x11,0x3A,0x94,0xD2,0xCA,0xF7,0x04,0xD5,0x9A,0xDA,0x43,0xB1,0xAD,0xFD,0xD2,0xA3, + + 0xD1,0x96,0xC3,0xFA,0x3A,0x1D,0xB5,0xD6,0x32,0x0B,0xCA,0x87,0xFE,0x44,0xBC,0xAD, + + 0xCD,0xA4,0xEB,0x28,0x16,0x28,0x43,0xBE,0x8F,0xDA,0x78,0x88,0x78,0x61,0x78,0xA3, + + 0x2C,0x37,0x06,0xD4,0x89,0x24,0xEC,0xEE,0x8D,0xDE,0x76,0x2B,0x20,0xBA,0x16,0xFA, + + 0x69,0x94,0x7A,0xA1,0x5F,0xFB,0x5E,0xF5,0xB7,0xD6,0x5B,0xDC,0x8A,0x9C,0xB6,0x09, + + 0x2C,0x5D,0x88,0xE0,0x65,0x6F,0x1E,0xB1,0x4F,0x57,0xF7,0x11,0x7E,0xE6,0x71,0xB2, + + 0xAD,0x34,0x2F,0xD0,0x32,0x46,0x8B,0x59,0xEB,0xC2,0x87,0x40,0x96,0xF4,0x18,0x63, + + 0x0A,0x31,0x52,0xAC,0xC5,0x18,0x64,0x8A,0x85,0x98,0xBE,0xFA,0xFE,0xEC,0x3D,0xA9, + + 0x15,0x1E,0x4A,0x2F,0x9C,0xFD,0xE8,0x35,0x0F,0xD9,0x7D,0x40,0x3F,0x51,0xB6,0xFB, + + 0x51,0x31,0x37,0xC9,0x76,0x9D,0x4D,0x5B,0x56,0x9C,0x48,0x96,0xDF,0x7E,0x90,0x28, + + 0x91,0xDE,0x50,0x5B,0xF7,0x40,0x01,0xFD,0x0E,0x5C,0x50,0x81,0x22,0xBE,0x59,0x06, + + 0xA5,0x7F,0xD2,0x2A,0xFB,0x44,0x92,0x52,0x73,0x34,0x50,0xFC,0x05,0x6A,0xB0,0x3D, + + 0x13,0x4C,0x8C,0x9E,0x35,0xAC,0xC3,0x1E,0x3E,0x07,0x0A,0xD2,0x75,0x95,0xD8,0x01, + + 0xB3,0x39,0xDB,0x04,0x33,0xD2,0xE9,0x29,0x67,0x03,0x97,0xCD,0xAB,0xCF,0xD8,0x56, + + 0xE0,0x07,0xF7,0x38,0x7A,0xB2,0x27,0xED,0x7E,0x18,0x15,0x2E,0x90,0xCE,0x5A,0xDF, + + 0x69,0x0B,0xE0,0xE1,0xEC,0xFB,0x0A,0x61,0xE1,0x05,0xB0,0x66,0x2B,0x69,0xB7,0x74, + + 0xDF,0x14,0xDB,0xA8,0x57,0xA8,0x10,0xCD,0xCE,0x07,0x34,0xE6,0x5F,0x6D,0xC0,0x53, + + 0xEA,0xCE,0xC3,0xB9,0xDA,0x22,0x91,0xA1,0xC2,0x04,0xFB,0xB5,0x8E,0x99,0x73,0xA2, + + 0xB7,0x01,0xB6,0xA5,0x09,0x96,0x5F,0x68,0xC0,0xE6,0x59,0x88,0xDF,0x97,0x60,0x0A, + + 0x0B,0x68,0xFC,0x3D,0xF1,0x89,0x12,0x5A,0xB3,0x0A,0x98,0xA8,0x56,0x22,0x0A,0xE1, + + 0x49,0xF5,0xC1,0x6F,0x69,0x88,0xA5,0x7F,0x83,0x93,0xA4,0x79,0x5F,0x6B,0xAB,0x28, + + 0xAC,0x91,0x2F,0x9E,0xCF,0x20,0x5E,0x17,0x29,0xB5,0x53,0xAD,0x96,0x95,0xB6,0x46, + + 0x5C,0x56,0xB3,0xE2,0x70,0x5A,0x53,0x41,0x34,0x09,0x93,0xB9,0xDB,0xC8,0x4A,0x00, + + 0xEB,0x03,0x02,0x8C,0xF3,0x21,0x32,0x3E,0x67,0x41,0x55,0xEE,0x78,0x1E,0x4B,0xA3, + + 0x78,0x01,0x75,0xC6,0xA4,0xB0,0x63,0x3A,0xEA,0x0F,0x58,0xFE,0xC6,0x94,0x83,0x84, + + 0xA6,0x75,0xB8,0x2D,0x8C,0x42,0x2A,0x4E,0x66,0x2B,0x6C,0x8F,0xE9,0x95,0xB4,0xA5, + + 0x59,0x4D,0x27,0xC2,0x9A,0x4F,0x13,0x79,0x48,0x42,0xE3,0x83,0x38,0x66,0x66,0x82, + + 0x23,0x52,0x11,0xC3,0x03,0x29,0xB0,0x50,0x68,0x5F,0x8E,0xD7,0x39,0xF6,0x55,0x8A, + + 0x84,0xE0,0x1A,0x10,0x62,0xA9,0x64,0xB4,0x81,0xD0,0x58,0x92,0x8C,0x6A,0x5C,0x82, + + 0x05,0xED,0x3D,0x16,0x80,0x9F,0xAA,0xC1,0xFE,0xF9,0x95,0xE5,0xB6,0x30,0xF5,0xF7, + + 0x2E,0x95,0xC5,0x8D,0x58,0xD2,0x9E,0x35,0xB2,0x3B,0x1D,0xEB,0x7C,0x11,0x64,0x3E, + + 0xA0,0x1E,0x9E,0xC5,0x95,0x75,0x3C,0x82,0xD1,0x38,0x8D,0x19,0x97,0x80,0x2C,0x90, + + 0xCD,0x98,0x33,0x24,0x3B,0x29,0xB0,0x74,0x2B,0xE5,0x1C,0xC1,0xCB,0x78,0x27,0xB2, + + 0x92,0x19,0x7E,0xA5,0x96,0xB4,0xEA,0x65,0xE1,0xA4,0xAD,0xF7,0x1B,0x79,0x35,0x53, + + 0xA2,0x60,0x72,0x9F,0xA3,0x33,0x15,0x69,0xD0,0x12,0xA6,0xD2,0x52,0xC8,0xC5,0xC8, + + 0x4A,0x54,0x7E,0x84,0xD1,0x29,0xD6,0x70,0x27,0x50,0x3D,0x29,0xEB,0x47,0xA5,0xC7, + + 0x94,0xE5,0x98,0x7A,0xB6,0x22,0x60,0xBE,0x88,0xDA,0x25,0x0D,0x30,0xD6,0x13,0xAD, + + 0x7D,0x47,0x7F,0x65,0xC3,0x97,0x10,0x59,0x62,0xAB,0x81,0xF9,0x13,0xB2,0x54,0x99, + + 0xD2,0x5B,0x91,0xFB,0x73,0x6A,0xAE,0x4A,0x65,0xD0,0x91,0x83,0xB0,0x8E,0x3E,0x4A, + + 0x2B,0x7E,0x46,0x8B,0x14,0x22,0x96,0x28,0x4C,0x5A,0x62,0x8E,0x8D,0x19,0x76,0x08, + + 0xD5,0x12,0x97,0xD2,0x9E,0x36,0xEA,0x9A,0x90,0x38,0xD4,0x78,0x33,0xCB,0x7F,0x19, + + 0x75,0x11,0xBC,0x25,0x3A,0x71,0xFD,0x8C,0x4B,0xC1,0xEF,0x12,0x78,0x3D,0x2F,0x98, + + 0x27,0x12,0x8F,0x35,0x3B,0x72,0x67,0x07,0x47,0x52,0x5F,0x20,0xF2,0x64,0x8B,0x86, + + 0x08,0xC3,0x74,0xF8,0xE9,0x21,0x7B,0x9B,0xE5,0x5F,0x70,0xA2,0x7D,0xA2,0xCF,0x6C, + + 0x64,0x85,0x5D,0xE8,0xED,0xA8,0xD8,0x44,0xFA,0xAF,0x34,0xB2,0x57,0x5B,0xCD,0xEB, + + 0xBB,0xCF,0xE1,0xF8,0x61,0x21,0x85,0x41,0x3F,0xD9,0xF1,0x96,0x2F,0x4F,0x57,0xF1, + + 0x97,0xCE,0xF2,0x17,0xAA,0x42,0x06,0xBC,0xA6,0xC7,0x79,0xB6,0xD1,0x8F,0x64,0x23, + + 0x7D,0x94,0xDB,0xD9,0xA9,0xBF,0x09,0x25,0xBB,0xB2,0x35,0x8E,0x48,0xA9,0xB3,0x10, + + 0x01,0x7D,0x04,0xCC,0x14,0x05,0x31,0x9E,0x43,0x87,0x80,0x64,0xA8,0x48,0x3A,0x43, + + 0xF9,0x86,0x45,0x21,0x65,0xDB,0x8E,0x1D,0x50,0xBD,0x8E,0x14,0xF7,0x52,0x30,0x2C, + + 0xD2,0x8E,0xD6,0x47,0x60,0xA3,0x31,0x46,0x4A,0x85,0xE1,0x6C,0x74,0x63,0x38,0x08, + + 0xC6,0x87,0xFC,0xBA,0x24,0xEA,0x4B,0x50,0x2D,0xCC,0xD5,0xD5,0xE9,0x7E,0x92,0x27, + + 0x1F,0xC4,0xBC,0x26,0xF6,0x38,0xDA,0x07,0xA6,0x8D,0x19,0x6F,0x81,0x21,0x6B,0x17, + + 0xBF,0xB1,0x69,0xF6,0x75,0xA3,0x52,0x6B,0xCF,0x41,0xC8,0xAB,0xD7,0x20,0xF8,0x5C, + + 0xEC,0x8F,0x91,0xAE,0xA1,0x04,0x01,0x8B,0x79,0x64,0x17,0x4C,0x98,0x6D,0x26,0x5B, + + 0x3A,0x21,0xE0,0x57,0xE4,0x2C,0x74,0x73,0x4D,0xEC,0xCC,0x8C,0x7F,0xCC,0x62,0x89, + + 0x8D,0xA5,0xE8,0x1E,0x07,0xC5,0x43,0x38,0xEE,0xD6,0xD8,0x96,0x20,0x22,0xF2,0x0C, + + 0x4C,0xEE,0x8A,0x31,0x11,0x28,0xE3,0xEF,0xCD,0x3D,0x74,0x11,0x02,0xE1,0xD5,0xAB, + + 0x7C,0x80,0xA6,0x5B,0xAC,0xAB,0xCB,0xFF,0xCC,0x8F,0xA2,0xF2,0x7A,0x10,0xE4,0x87, + + 0x02,0x8B,0x9A,0xAF,0x32,0x2A,0x30,0x40,0x8D,0x0A,0x3E,0x5E,0x74,0x4B,0x94,0x69, + + 0xA8,0x8A,0xB9,0x70,0x25,0x1C,0xDF,0x72,0x37,0x7A,0x1F,0xE7,0xA9,0x39,0x7C,0xE5, + + 0x57,0x82,0xAE,0xC7,0xA0,0x1F,0x77,0x5D,0x19,0xBE,0x34,0x23,0xF0,0x4C,0xF0,0xF5, + + 0x7F,0x2C,0x3C,0x71,0x7D,0x12,0x45,0xB7,0x18,0x56,0xE7,0xBA,0x9D,0x9B,0x2E,0x35, + + 0x85,0x19,0xBD,0xC8,0x91,0x39,0xD8,0x66,0x65,0x26,0x50,0x90,0x8D,0x0F,0xEB,0x50, + + 0x24,0x13,0x7C,0xA4,0x04,0xE1,0x74,0xEF,0x8E,0x1F,0x3C,0x23,0x11,0xEE,0x9A,0x32, + + 0x6A,0xB6,0x85,0x8D,0x1C,0xB9,0x99,0x67,0xAE,0x66,0xF1,0x63,0xF5,0xEC,0x55,0x61, + + 0x58,0x38,0x15,0xF3,0xB1,0x56,0x91,0x61,0xEF,0xDD,0xBC,0x91,0x9C,0xF8,0x67,0xEC, + + 0xFE,0x07,0x34,0x9F,0x54,0xBC,0x24,0x2E,0x6A,0x42,0x76,0x2F,0xB1,0x07,0x34,0x98, + + 0x9E,0x04,0x51,0xD9,0x0E,0xA0,0x36,0xA3,0x0E,0xBF,0x7E,0x3A,0x32,0xBB,0x8B,0xF0, + + 0x72,0x47,0xC0,0x67,0x3A,0x77,0xBB,0x2F,0xBF,0x30,0xED,0x6F,0x94,0x72,0x35,0x99, + + 0x3F,0x91,0x17,0x00,0xDE,0xBF,0xA8,0x48,0x69,0x56,0x71,0x0C,0x70,0x70,0xA6,0x1B, + + 0x2F,0x9A,0x07,0xAC,0xBC,0xBF,0xF4,0x02,0x29,0x91,0x21,0xDC,0x81,0x29,0x16,0x58, + + 0x2C,0x1B,0x2E,0xEB,0xED,0xB0,0xEE,0xBD,0x4B,0x2A,0x9E,0xBE,0x91,0x76,0x2F,0x58, + + 0x47,0xAF,0xE2,0x2D,0x8D,0xC5,0x05,0xEA,0xEA,0xB0,0x8F,0x6B,0xA5,0x1A,0x17,0x59, + + 0xAE,0x87,0x8F,0x7F,0xE3,0xB0,0x80,0xEB,0x0E,0x00,0xFB,0x1D,0xCC,0xAD,0xB8,0x52, + + 0x2E,0x63,0xE2,0x1D,0x13,0x60,0x28,0xDF,0x4E,0x22,0xAE,0x84,0x92,0x60,0xF5,0x2B, + + 0x20,0xFA,0x64,0x86,0x11,0x2B,0x90,0xFD,0xE2,0xBC,0x34,0x10,0xDE,0x63,0x4B,0x43, + + 0xC1,0x01,0x87,0xA5,0x79,0x21,0xD5,0xF1,0xCC,0x44,0xD9,0x21,0x5F,0x23,0x0D,0x95, + + 0xDE,0x44,0x8E,0x66,0xBB,0xA5,0x53,0x24,0x43,0x40,0x2E,0x34,0x5C,0x6F,0xFF,0xA2, + + 0x69,0x15,0x52,0xB7,0x7E,0x8B,0xD0,0xA7,0x66,0xDF,0x32,0x7B,0x9C,0xCF,0xB7,0x23, + + 0x33,0x69,0x5E,0xD0,0x4E,0x57,0x60,0x9E,0xEF,0x48,0x58,0x06,0xB8,0xB3,0x45,0xA9, + + 0xEE,0x4B,0xD0,0xB8,0xFA,0x9D,0x51,0xE3,0x0B,0x6E,0xB7,0x61,0xB9,0xE0,0xAE,0x91, + + 0xC6,0xAA,0xD9,0x40,0x6A,0xAA,0xA4,0x8E,0x16,0x1A,0xA7,0xEA,0xB8,0xD1,0x38,0xFB, + + 0x51,0x7D,0x02,0x4C,0x00,0x85,0x51,0xCA,0xCA,0x00,0xFA,0x32,0x32,0x9C,0xCA,0xC5, + + 0xFF,0x4B,0x82,0x18,0x96,0x68,0x7A,0x3A,0x38,0x44,0xCB,0x4F,0x67,0xC2,0x1B,0xF2, + + 0xF7,0x2A,0x53,0xCA,0x5A,0x6A,0x5F,0xD9,0xC4,0x45,0x41,0x37,0xB6,0xDE,0x58,0xC5, + + 0xBA,0x69,0x8D,0x20,0x19,0x4E,0xE4,0x6B,0xC7,0x29,0xE3,0x39,0x39,0xCA,0x53,0xCC, + + 0x08,0x04,0xA2,0x03,0x39,0x23,0xF9,0xEC,0x4E,0xF2,0xD3,0x9F,0x88,0xC3,0x74,0x70, + + 0x0D,0x0F,0x10,0x18,0x3F,0xD9,0x62,0xE7,0xC9,0x81,0xEC,0x70,0xB0,0xE8,0x83,0xC9, + + 0xC4,0xF1,0x3C,0xB1,0x9C,0x6C,0xFF,0xEB,0x0F,0x5D,0x61,0x9E,0x36,0xC5,0x04,0xDD, + + 0x89,0xAC,0x5E,0x46,0xEB,0x6D,0x8D,0x1B,0x1D,0x47,0x73,0xF7,0x22,0xB3,0xB0,0x70, + + 0x00,0x1F,0xF6,0x85,0x14,0x2B,0x4A,0x9D,0x68,0x4B,0xA2,0xAC,0x9B,0xF5,0x08,0x72, + + 0xA6,0x61,0x4D,0x9C,0x94,0x5F,0xE3,0xC3,0x1D,0x3D,0xCD,0x27,0x4F,0xDE,0x65,0x21, + + 0xAC,0x99,0x10,0xE3,0x52,0x12,0x83,0xC7,0x80,0xED,0x3D,0x2F,0x7D,0xDF,0xE5,0xAE, + + 0x85,0x51,0xEF,0x91,0xB2,0x51,0xFA,0x71,0xEA,0xD8,0xBA,0xC6,0x9F,0xF5,0x3C,0xB3, + + 0x12,0x56,0xCC,0xAF,0x4D,0x14,0x0C,0xE8,0x51,0xA4,0x29,0xE6,0x32,0x21,0x49,0x52, + + 0xEA,0x12,0x4A,0x50,0xFB,0x44,0xA4,0xD4,0x9E,0xDC,0x61,0xAB,0xA6,0x28,0x05,0x18, + + 0xA4,0x94,0x05,0x04,0x5E,0x37,0xEA,0x07,0xD1,0xE6,0x26,0xCA,0x0C,0x8A,0xE2,0x33, + + 0x0F,0xEA,0x19,0xC6,0xC3,0xB4,0xDD,0x11,0xFE,0x1B,0x76,0x37,0x70,0x31,0x55,0x54, + + 0x1B,0x68,0xB8,0x2D,0xFA,0x3C,0x93,0x99,0x14,0x1A,0x96,0x5F,0xA8,0xD3,0xF1,0x1C, + + 0x7A,0x17,0xC6,0x95,0xB4,0xC4,0xDA,0xCC,0x92,0x1B,0xCE,0x22,0x82,0x65,0xBF,0x77, + + 0xB8,0x57,0xB9,0x2D,0x7A,0x3A,0x53,0xFE,0x17,0x18,0x32,0xA8,0x7F,0x6C,0x56,0x1C, + + 0x0C,0xE4,0xED,0x4C,0x4C,0xBD,0xD0,0xB7,0xEF,0x39,0x22,0xF7,0x1D,0xFC,0x3E,0xD9, + + 0x1A,0x18,0x1B,0x86,0x41,0x25,0xD0,0x00,0x36,0xA1,0x61,0xC8,0x57,0x15,0xED,0xBA, + + 0x68,0xED,0x55,0x1A,0x77,0x7C,0x64,0x0B,0x77,0x5B,0x00,0x09,0x14,0x96,0x37,0xED, + + 0x28,0x1A,0x18,0x85,0xBC,0xC6,0xAF,0x01,0xB2,0x11,0x4B,0x9C,0x93,0xD7,0x5D,0xCD, + + 0x54,0xE2,0xE9,0xF0,0x95,0x9B,0xF2,0x36,0x88,0x1F,0xC0,0x84,0x82,0xC6,0x98,0x80, + + 0x26,0xB0,0x0C,0x22,0xC8,0x51,0xF4,0xF2,0x4C,0xC6,0x62,0xD9,0xBD,0xEF,0xD3,0x1A, + + 0xA0,0x7E,0xE8,0xA7,0x13,0xE3,0x12,0xB7,0x06,0xA1,0x1F,0xA1,0xB4,0x4E,0x59,0xEB, + + 0x98,0xCF,0x61,0x87,0x81,0xE0,0xB9,0xFB,0x67,0x3F,0xE7,0x96,0x3F,0x24,0xE9,0xCB, + + 0x06,0xCF,0xFA,0xE8,0x93,0x79,0x8D,0xD1,0x47,0xC7,0xDF,0xC6,0x17,0xA3,0x1F,0xC6, + + 0x7E,0xD9,0x28,0x03,0xF7,0x0B,0x32,0x10,0xFD,0xDB,0xCB,0x38,0x65,0x24,0x16,0x54, + + 0xE6,0x06,0x28,0x4B,0xEA,0xA3,0x83,0xF6,0x45,0x61,0x53,0xBC,0xEC,0x4A,0x3B,0x4F, + + 0xEE,0x97,0x64,0xC3,0xC9,0x8E,0xC6,0x4B,0x35,0x79,0x5D,0xC2,0x03,0x85,0x40,0xA0, + + 0x0B,0x7A,0x46,0xB5,0x36,0x20,0xB9,0xF7,0x79,0xAB,0xDE,0x69,0x07,0x4C,0x93,0x88, + + 0x2E,0x38,0xE7,0x10,0x3E,0x5C,0x6F,0x48,0x0F,0x28,0x94,0x9F,0x8A,0x4C,0xE5,0xE2, + + 0x8F,0x8A,0x6A,0x9F,0x05,0xEB,0xAA,0x48,0xA6,0xCA,0xE4,0xA4,0x59,0x46,0x79,0x0A, + + 0x2F,0xC8,0xF7,0x8B,0x9E,0x6B,0x53,0x6F,0xE9,0xC5,0x61,0xB0,0x37,0x5C,0x6A,0xEB, + + 0x35,0x84,0x60,0x96,0x74,0x5A,0x45,0x9A,0x26,0x88,0x09,0xCC,0x31,0x40,0x1A,0x39, + + 0x3E,0xCE,0x66,0x4B,0x91,0xA8,0xB2,0x7B,0x16,0xC6,0x57,0x6A,0xD9,0xFA,0x6F,0xD8, + + 0xC6,0x58,0x2A,0x83,0xC0,0x00,0xEA,0x92,0x13,0x80,0x8C,0x2F,0xBD,0xE6,0x23,0x0B, + + 0x88,0x0C,0xE7,0x08,0x9F,0xFE,0xF3,0xAC,0xEA,0xA2,0xA3,0xF1,0x25,0x43,0xC4,0xB9, + + 0x23,0x72,0x6E,0x98,0x5D,0xFF,0xE4,0x1B,0xD0,0x32,0x79,0x8F,0x0E,0xB0,0x44,0x22, + + 0x3C,0x9F,0xA4,0x46,0x5C,0xDE,0xAE,0x5C,0x07,0xA0,0xB5,0x90,0x9E,0xE5,0x2F,0xF4, + + 0xA7,0x92,0x40,0x04,0x31,0xBB,0x92,0x49,0xEA,0x07,0x0E,0x8D,0x0A,0xF1,0x7C,0x12, + + 0x86,0x02,0x35,0x6F,0x88,0xFF,0x23,0x9E,0xE2,0xF0,0x64,0x91,0x04,0xE2,0xAA,0x71, + + 0x27,0x90,0xE8,0x9F,0x10,0x34,0x35,0xA3,0xAD,0xF0,0xD5,0x75,0x73,0x06,0xBB,0xC2, + + 0xD1,0x2F,0xF7,0x76,0x09,0xA9,0x0C,0xC2,0x62,0x64,0xEB,0x03,0x59,0xAF,0xC0,0x50, + + 0xEE,0xDD,0x2C,0x8B,0x42,0xF9,0xFB,0x8D,0x8E,0xA5,0x66,0xB6,0x10,0x26,0xE7,0x32, + + 0x96,0x56,0xBA,0xED,0xC9,0xA2,0xB5,0x3E,0x39,0x94,0x6F,0x93,0x93,0x3F,0x55,0x4C, + + 0x25,0x3B,0x6B,0xF3,0x80,0x91,0x91,0x61,0xF3,0xDF,0x36,0xF1,0x7F,0x93,0x21,0xF8, + + 0x8F,0x9C,0xA2,0x1E,0xB3,0x45,0x16,0xBF,0x95,0xB4,0x26,0x2A,0x7A,0x05,0x7E,0x83, + + 0x4E,0xB9,0xAE,0x5E,0x21,0xD5,0xEE,0xC5,0xE2,0x5F,0x7E,0xEF,0xFF,0x55,0x26,0xF4, + + 0x0B,0x9C,0xC5,0x8D,0x49,0x3C,0xD4,0x6B,0xE8,0x7A,0xD7,0xFC,0x08,0xB8,0x57,0x19, + + 0x2D,0xE2,0x91,0x3E,0x7F,0x11,0xBB,0xFB,0xA1,0x26,0xCF,0xE0,0x5E,0x9E,0x6A,0xA8, + + 0xF8,0x94,0xBD,0x4D,0x49,0x9A,0x0E,0x02,0x74,0x91,0xD4,0x93,0x7E,0xFC,0x56,0x45, + + 0xAD,0x51,0x02,0x5E,0xC3,0x9D,0x86,0x7E,0x72,0x23,0x01,0x01,0x80,0x02,0x64,0x49, + + 0x6B,0x8D,0x27,0x9A,0xD0,0xFF,0x2F,0x62,0x4B,0x5E,0xF7,0xEF,0x01,0x01,0xB9,0xB9, + + 0x79,0x95,0x43,0x9D,0x3C,0x6B,0x45,0x08,0x87,0x70,0xFF,0xFF,0xFF,0xFF,0x59,0x92, + + 0xA5,0x9F,0xE6,0xA0,0x34,0xBC,0x68,0xA2,0x45,0x79,0xC0,0xDA,0x5C,0xCB,0xB0,0xEE, + + 0x11,0x4C,0xF0,0x96,0x8C,0x48,0x90,0xF5,0xE0,0xCB,0x58,0xC5,0xEE,0xC3,0x00,0x67, + + 0x7B,0x12,0x3E,0x5F,0x96,0xB8,0x69,0x06,0x63,0x44,0x6C,0x35,0xBB,0x1D,0xF6,0x35, + + 0xEA,0x0C,0x36,0xF7,0x4C,0xBE,0xE2,0xD3,0x60,0xC9,0xC7,0xDA,0x85,0x60,0xE0,0x36, + + 0x69,0x0B,0x72,0x5B,0xFE,0x8B,0x6D,0x90,0x46,0x4B,0x8E,0xFF,0x42,0xCB,0xDA,0x60, + + 0xA0,0xAA,0x60,0xDE,0xDB,0x56,0x65,0x80,0x4B,0x4A,0x77,0x0F,0x8E,0xB1,0xC6,0x73, + + 0xB1,0xED,0xF7,0xB4,0x72,0x66,0x71,0x75,0xC4,0x35,0xB2,0x3B,0x23,0xBA,0x5C,0xF1, + + 0xD3,0x57,0xEA,0x46,0xE1,0x93,0xDA,0x30,0xDA,0x06,0x6B,0x6A,0x3F,0xCC,0x82,0x7B, + + 0x64,0x8D,0x2D,0xAC,0x48,0xD8,0x6D,0xCA,0x95,0x95,0xEB,0xD7,0x33,0x17,0x34,0xFA, + + 0x6B,0x7C,0x75,0xBC,0x59,0xC9,0x7A,0x78,0x67,0xC2,0xC4,0xD3,0x7B,0x6A,0x11,0x89, + + 0x63,0x4E,0xDA,0x94,0x3D,0xBB,0xBC,0xAD,0xC7,0x97,0xD0,0xDC,0x67,0x0A,0x75,0x1E, + + 0xAD,0x7D,0x20,0x67,0x4C,0xB4,0x1F,0xDB,0x4B,0x43,0xE2,0xC6,0x2D,0xB4,0x1B,0xD1, + + 0xAF,0xF3,0x9C,0x43,0x16,0x62,0x68,0x80,0x82,0x03,0xE4,0x68,0x31,0xE9,0x34,0x71, + + 0x30,0x2D,0x15,0x5C,0x98,0x23,0x03,0x1C,0xEC,0x5D,0xF9,0x73,0x83,0xC6,0xEF,0x3A, + + 0xB2,0xF8,0xA2,0xED,0x4C,0x91,0x2D,0x58,0x21,0x8F,0x53,0x2B,0x48,0x3A,0x76,0x1E, + + 0x41,0x3E,0x2B,0x62,0xBF,0x41,0xA3,0x86,0xCD,0x45,0x7E,0x79,0x5C,0x79,0xAE,0xE5, + + 0x81,0x0F,0x44,0xE4,0x30,0x3A,0x2C,0x5F,0x53,0x14,0x8C,0xB0,0x1B,0xC1,0x34,0x7E, + + 0x8D,0x1C,0xAC,0x6D,0x90,0x30,0x7B,0x40,0xE1,0x4E,0x45,0x9B,0x4E,0x73,0xB1,0xE3, + + 0x1B,0x77,0x05,0xC3,0xA2,0x34,0xAD,0x5A,0x6D,0xAF,0x95,0xB6,0xD1,0xA3,0xF0,0xB5, + + 0x48,0x1A,0xB3,0x84,0xCE,0x73,0xA6,0xC1,0x61,0x45,0xBB,0x8C,0x93,0xD7,0x7F,0x3E, + + 0x06,0x0F,0x6F,0x9B,0x8F,0xC8,0x72,0x9F,0xC5,0x50,0x7E,0x51,0x41,0xBD,0xB7,0xAE, + + 0xAE,0xE3,0x92,0xE7,0xB3,0x9E,0xE4,0x6B,0x71,0x18,0x5C,0x33,0x57,0x19,0x85,0xA7, + + 0x5D,0x9B,0x66,0xF3,0x6E,0xD3,0xD2,0xA6,0xD1,0x3F,0x15,0x64,0x2D,0x7E,0x05,0x90, + + 0x83,0xF7,0xFF,0xC5,0x36,0x21,0x3E,0x31,0xAB,0xCA,0x4D,0x86,0xC3,0x7C,0x14,0x76, + + 0xD7,0xB5,0x46,0xE4,0x38,0x78,0x86,0x56,0x95,0xF9,0x05,0x1D,0x07,0x6E,0xA5,0xE3, + + 0xFC,0xE4,0x39,0x9D,0xB4,0x35,0xE5,0xCB,0x0A,0xA8,0x59,0x40,0xC5,0x82,0x91,0xCE, + + 0x76,0x5B,0x48,0xC3,0x37,0x38,0x2F,0x56,0x1D,0x39,0x4C,0xA2,0xFE,0x10,0x4D,0xF9, + + 0xAB,0x9B,0xE7,0x83,0x4E,0xCF,0x61,0xBF,0x00,0x30,0xDF,0x92,0x8D,0x2E,0xC5,0xB7, + + 0x6A,0x70,0xE0,0x7C,0xEA,0x98,0xAE,0xE0,0x93,0x13,0x13,0x68,0x78,0x11,0xF5,0x9F, + + 0x2D,0x8E,0x4C,0x1A,0xA9,0x3E,0xCE,0x3F,0x69,0xA8,0x0A,0xAD,0x78,0x3D,0x83,0x4D, + + 0xD8,0x0F,0x91,0xD6,0xD1,0x4A,0xD0,0x56,0xBE,0x92,0xED,0x1E,0x8E,0x3C,0x8A,0x99, + + 0xF5,0x1C,0x2C,0x26,0xC4,0x3F,0x5B,0xBE,0x6A,0x51,0x73,0xD9,0x79,0xD3,0xDF,0x7C, + + 0x92,0xFB,0x0F,0x78,0xC9,0xBB,0x84,0x50,0xE7,0x3B,0x07,0xD9,0xD7,0xEE,0x17,0x99, + + 0xFE,0x1C,0xF8,0x1F,0xB6,0xBA,0x58,0x72,0xE9,0x4A,0x07,0x6C,0x77,0xD1,0x32,0xEF, + + 0x8C,0x5D,0x65,0x7D,0x33,0xA4,0xE4,0xA7,0xB8,0xFD,0x51,0x18,0xF0,0x7E,0x48,0xE9, + + 0x64,0xBC,0xEF,0x68,0x32,0xA5,0x3D,0xD1,0xE1,0x67,0xB0,0x97,0xD5,0x4B,0x28,0xCA, + + 0xDB,0xB9,0xA0,0x79,0x1E,0xC8,0xC7,0x1D,0x40,0x64,0xA0,0xF8,0xAD,0x1F,0xC4,0x2D, + + 0xCD,0x14,0x4F,0xC1,0x7C,0x03,0x40,0x89,0xC8,0x63,0x4F,0x52,0x8B,0xF4,0xCE,0xC7, + + 0x91,0x8E,0xC9,0x85,0x42,0x60,0x8E,0x01,0x35,0xA3,0xF1,0xA5,0x55,0xA0,0xD2,0xC0, + + 0xBB,0x8D,0x69,0xA6,0x55,0xE7,0xEB,0x09,0x0D,0x66,0xC7,0x5F,0xB6,0xC7,0x5B,0x2E, + + 0xA9,0xF7,0xF2,0x13,0xBF,0xB3,0x68,0x2C,0x84,0xA3,0xD2,0x61,0x71,0xE5,0x92,0xF4, + + 0x1D,0xC4,0x12,0xE1,0x1B,0x33,0xAA,0x54,0x4B,0x69,0xE9,0xA4,0x95,0xE6,0x22,0x6D, + + 0x37,0x9A,0x26,0x69,0x6B,0xBA,0x97,0xDA,0x6F,0x8A,0xCC,0x4F,0xAA,0xA8,0x86,0xF1, + + 0xA9,0x8D,0xC3,0x9B,0xAD,0xAB,0xC4,0x59,0x3A,0xAE,0xAC,0xCC,0xA9,0x76,0xE0,0x54, + + 0x32,0x78,0x4D,0x35,0xC3,0x07,0x7A,0xEF,0x7D,0x85,0xAA,0xE3,0x58,0xEE,0x4A,0x3C, + + 0xE6,0xDC,0xB4,0xC5,0x03,0x20,0x44,0x4E,0xE8,0x59,0x3A,0xDB,0x16,0xE7,0x70,0x40, + + 0xBA,0xBE,0x00,0x4F,0x42,0x58,0x4D,0x5A,0x69,0xDE,0x4F,0x9E,0xAA,0xCE,0x10,0x28, + + 0xB3,0x70,0x95,0xC5,0x4A,0xF2,0x6D,0x60,0xAB,0xD4,0x7B,0x38,0xFB,0xE9,0x7C,0xDA, + + 0xA6,0x98,0x5B,0x77,0x8B,0x83,0xE7,0x51,0xE8,0xDD,0xA3,0x5F,0x38,0xB2,0x24,0xB5, + + 0x86,0x6A,0x51,0x86,0x5E,0xCE,0x6E,0xE4,0x8E,0xB5,0x63,0x36,0xC9,0x20,0xF1,0xF1, + + 0x07,0x94,0xF5,0x79,0xB8,0x19,0xA5,0x50,0x60,0x5F,0xF8,0x78,0x83,0x87,0xAE,0x91, + + 0xC3,0x95,0x6D,0x66,0x0A,0x11,0xAD,0xDC,0x1A,0xB0,0x0C,0x8E,0x8E,0xE5,0xE2,0xF2, + + 0xDB,0x14,0x8C,0x04,0xB0,0x41,0xD7,0x74,0xBA,0x32,0xF8,0x0E,0x07,0xB6,0x91,0x15, + + 0x21,0x06,0xE8,0x91,0xB6,0xBB,0x1E,0xF6,0xB2,0x48,0x10,0xD2,0xFA,0xB4,0xA5,0x7B, + + 0xC6,0x4B,0x75,0x00,0xB4,0x43,0x4F,0x10,0x2C,0x7D,0xB1,0x38,0xF7,0xB6,0xA8,0x93, + + 0xFB,0x6A,0x52,0xE7,0xB3,0x18,0xD6,0xAC,0x1E,0x2B,0x51,0xD3,0x2E,0x0A,0xAE,0x4F, + + 0x8D,0x12,0xF8,0x61,0x6C,0xBB,0x50,0xC8,0x9B,0x65,0xED,0xA1,0x7A,0x92,0xF2,0x6A, + + 0x25,0x96,0x6F,0x84,0xCA,0x0D,0xAE,0x7D,0x84,0x28,0xBA,0x4E,0x82,0x56,0xC8,0x69, + + 0x2E,0xD2,0xDE,0x74,0xD7,0xC5,0xA0,0x54,0x0D,0x09,0xA9,0x8B,0x97,0xAB,0x4F,0xDF, + + 0xDC,0x16,0x50,0x6E,0x02,0x88,0x59,0x1E,0x04,0x0A,0x2A,0x4C,0x8D,0xE0,0x38,0x28, + + 0x22,0x19,0x00,0xBC,0x48,0x13,0xD5,0x74,0xB2,0x2A,0xD9,0x95,0x3D,0x9C,0xD3,0x5E, + + 0x5D,0xEF,0xB0,0x4C,0x7F,0x30,0xFE,0xA4,0xDA,0x01,0x01,0x7C,0x7A,0xF9,0xA7,0x73, + + 0xCE,0xF2,0x05,0x3E,0x74,0xFE,0x09,0x70,0x85,0x48,0xA9,0x0D,0xFC,0x7B,0x67,0xD3, + + 0xA9,0xEC,0x91,0x41,0x54,0x49,0xD0,0x94,0x32,0x0B,0xC7,0x11,0x53,0xF2,0x4A,0x5F, + + 0xBF,0x5D,0x29,0x7A,0x85,0x8D,0xF5,0xCF,0xA1,0x16,0xE8,0x00,0xDF,0x62,0x87,0xEF, + + 0x83,0x49,0x48,0x10,0xCA,0xDC,0x22,0xBA,0xF2,0xDC,0xF0,0x2A,0x97,0x95,0x0F,0xE3, + + 0x77,0x7F,0x99,0xFE,0xE3,0x22,0xE8,0x53,0x5A,0x7D,0x26,0x24,0x5D,0x6E,0x29,0x6F, + + 0x22,0x66,0x65,0x86,0xCA,0x2B,0x49,0x46,0x8F,0x04,0x7F,0x47,0x3A,0xC5,0xD0,0xC2, + + 0x82,0x87,0xF8,0x34,0x59,0x2F,0x54,0x27,0xC3,0x4A,0x83,0x98,0x54,0x17,0xC8,0x17, + + 0x27,0xFE,0x0C,0x90,0x15,0x27,0x62,0x83,0x89,0xEE,0xE0,0x8A,0xFF,0x68,0x79,0x31, + + 0x36,0x0F,0xD4,0x36,0x97,0x64,0xF2,0xF7,0x1E,0xA0,0xED,0xE7,0x43,0x50,0x48,0xCC, + + 0xE0,0x14,0x0F,0xAA,0x7A,0x0F,0x3B,0x75,0x28,0x82,0x26,0x0E,0xD5,0xF4,0xBD,0xEA, + + 0xF1,0x6A,0x80,0x13,0x43,0x2C,0x7C,0xAC,0x0B,0xDD,0xCC,0xBE,0x5C,0xFC,0x82,0x75, + + 0xAA,0x0F,0xC1,0xDC,0x1D,0xDD,0xB6,0xB7,0xF6,0xC4,0xFD,0x34,0xB2,0xFF,0xC7,0xD9, + + 0xF6,0x0C,0x82,0x72,0x15,0x8C,0xD3,0x39,0xF7,0xC7,0x70,0x36,0x06,0xC1,0x2B,0x0A, + + 0x28,0xF4,0xC0,0x6E,0xB8,0x94,0xFA,0xD7,0x28,0x7D,0x30,0x53,0x0C,0x97,0xD5,0xBB, + + 0x8E,0x81,0x02,0xCC,0x1B,0x6E,0x2C,0x5F,0x21,0xE9,0xF3,0xE8,0x64,0x41,0x72,0xA6, + + 0x68,0x0E,0xD6,0xD8,0x19,0x8E,0x3B,0x62,0x9B,0xF9,0xA5,0x5B,0xFA,0x6B,0x11,0x4B, + + 0x61,0x6A,0x83,0xFC,0x9C,0x6C,0x52,0x9A,0x2A,0x02,0xB3,0x27,0x10,0x63,0xDC,0xAA, + + 0x0F,0x82,0xB4,0x2E,0x92,0x6D,0x7C,0x88,0x57,0x5D,0xF5,0x43,0x02,0x60,0xC4,0x50, + + 0x96,0x13,0xBE,0x77,0x0C,0x72,0x12,0x48,0x53,0x9D,0x23,0x80,0xFF,0x72,0xD3,0x87, + + 0x12,0x43,0xF3,0x6C,0xB0,0xCE,0xC5,0xC7,0x52,0x4A,0xF4,0xAA,0xB7,0x85,0x06,0xBC, + + 0xD7,0x6E,0x48,0xA0,0x8F,0x33,0x35,0xA9,0x6D,0x69,0x22,0xA4,0x7D,0x7E,0xB5,0xE1, + + 0xA9,0x92,0x56,0x97,0xB7,0x13,0xFF,0x21,0x29,0x03,0x7B,0xC7,0x1A,0xD5,0xD4,0x6C, + + 0x11,0x10,0xFE,0x26,0x9E,0x3B,0x7C,0x22,0xB6,0x92,0xEB,0x7B,0x85,0xA9,0x51,0xB6, + + 0x00,0x95,0xAC,0x90,0x74,0x3A,0x3A,0x01,0xA1,0x15,0xFC,0x78,0x86,0xFC,0xFD,0x21, + + 0x92,0x0D,0xA5,0x81,0xA5,0x39,0xF2,0x76,0x03,0xF9,0x8D,0xF5,0x81,0xFF,0x73,0x05, + + 0x82,0x97,0xAD,0x91,0x33,0x3A,0x23,0x6F,0x08,0xA1,0xD9,0x95,0xFF,0xA0,0xF9,0x0E, + + 0x40,0x58,0x9A,0x75,0x18,0xA3,0x6E,0x9A,0x9B,0x8D,0xC8,0x3E,0x7C,0xD7,0xA2,0x0B, + + 0x79,0x13,0xA6,0x18,0x64,0x22,0x06,0x9C,0x80,0x21,0xF9,0xB4,0x92,0xEF,0x4D,0x27, + + 0x41,0x2A,0x87,0x70,0xB8,0xE1,0x12,0x82,0xFC,0x67,0x74,0x5E,0x26,0xD1,0x89,0x65, + + 0x34,0xE0,0x30,0xC1,0x98,0x19,0x0C,0x4A,0x6D,0xD6,0x34,0xC7,0x2C,0x87,0x7C,0x20, + + 0xEE,0x53,0x8C,0x31,0x99,0x59,0x08,0x73,0x7A,0xF3,0x51,0xFC,0x09,0xB4,0x04,0xC5, + + 0xD4,0x06,0xAE,0x9C,0x35,0x30,0xF1,0x83,0xB6,0x89,0x5E,0x9C,0x77,0xAA,0x1E,0xDB, + + 0x0F,0x92,0xFF,0x1D,0x4D,0x31,0x34,0xB7,0x1B,0x82,0xF7,0xF1,0x0F,0xF7,0xED,0xBF, + + 0x26,0xE9,0x85,0x62,0x18,0x32,0xED,0xE6,0x07,0xF0,0x5C,0xED,0x88,0xAD,0x8C,0x90, + + 0x1C,0x88,0xFB,0x06,0xC1,0xFD,0x4D,0x50,0xD6,0xDF,0x0D,0x79,0x80,0x25,0x51,0x52, + + 0x41,0x87,0x68,0x12,0xCE,0x5D,0xE5,0x92,0x8E,0x71,0xE6,0x04,0x51,0xAD,0xA3,0x7C, + + 0x0B,0x04,0x0A,0x58,0x29,0x5E,0x11,0x26,0xC2,0x42,0x16,0x10,0x3F,0x47,0xA1,0x7E, + + 0x24,0x72,0x96,0x48,0x68,0xCD,0x03,0x74,0x1B,0x3C,0xD8,0x24,0xFB,0x77,0x32,0x40, + + 0xED,0xE0,0xA0,0x9F,0x10,0x86,0x98,0xE8,0x64,0x12,0x44,0x1D,0xF5,0xE2,0xC4,0x76, + + 0xFA,0x8E,0x51,0xCC,0xE4,0xE5,0xCA,0xC0,0x57,0x00,0x4C,0x09,0xF4,0xA8,0x59,0x3F, + + 0xA7,0xC6,0x61,0x00,0x4C,0x19,0x0E,0x29,0x7B,0xDA,0xDF,0xC5,0x23,0xE9,0x51,0xAF, + + 0x07,0x7C,0xA5,0x83,0x6F,0xEF,0x0F,0x59,0xA1,0x02,0xFB,0x91,0xF3,0x18,0x5A,0x2E, + + 0x2E,0x8A,0xC4,0xC3,0x1D,0xC8,0x08,0xB4,0xBB,0x45,0x94,0x9E,0x84,0x43,0x76,0xF2, + + 0x1B,0xC4,0x06,0x8D,0x0A,0xA3,0x41,0x1E,0x99,0x91,0xEA,0xA0,0xA6,0x12,0x37,0xF7, + + 0x11,0x71,0x04,0xC2,0xB8,0x57,0x54,0xD0,0x2D,0x5C,0x16,0x2A,0x5B,0xFC,0x39,0xE4, + + 0x0B,0x2A,0x2B,0x00,0x8A,0xEA,0x9C,0x76,0xED,0x6A,0xBB,0xFD,0x5E,0xAD,0x32,0xB3, + + 0x4E,0x13,0x55,0x0F,0x18,0x94,0x41,0x62,0xAA,0x79,0x92,0xCD,0x5D,0xE1,0xE1,0x3A, + + 0x0B,0xE1,0x26,0x3C,0x5C,0x72,0x9A,0x45,0x6B,0xA3,0xF2,0x6F,0xA2,0x5B,0xA3,0x83, + + 0x5D,0x73,0x46,0x6B,0x1C,0xE6,0xAC,0x6B,0x4D,0xC0,0x8C,0x10,0x51,0x58,0xFB,0x9C, + + 0xAB,0x8C,0x93,0xDD,0x9A,0xA6,0x3B,0x44,0xC7,0xA3,0x00,0x7D,0x9F,0x83,0x78,0x06, + + 0x33,0x92,0xA2,0xAB,0xDD,0xC1,0x62,0xEE,0x8F,0xB4,0x8B,0xF9,0xA0,0x35,0x29,0xD5, + + 0xEF,0x21,0x45,0x14,0x3C,0x5C,0xF8,0xED,0xD8,0x2D,0x3C,0x47,0x95,0xB1,0x75,0x9B, + + 0xF0,0x3F,0x09,0x15,0xB8,0xBA,0x0D,0x4C,0x07,0xDB,0x12,0x90,0x9F,0x57,0x65,0x86, + + 0xD2,0xEF,0xF7,0x6D,0x16,0xB7,0x67,0x10,0x91,0x91,0x15,0x3D,0x61,0x67,0x2C,0xCE, + + 0x15,0xB0,0xAE,0x19,0x95,0xB9,0x42,0x13,0x86,0x94,0xD4,0xE2,0x97,0x6B,0xD4,0xEF, + + 0x80,0xD4,0xA6,0x2D,0x94,0xB3,0xD9,0xE9,0x0C,0xA1,0xC6,0x09,0x8A,0x74,0xDD,0x3C, + + 0x95,0x52,0xAF,0x28,0x15,0xBB,0xDD,0x69,0x72,0x42,0x5A,0x9D,0x2B,0xB7,0xAD,0x9B, + + 0xA7,0x1A,0xE1,0xD0,0x16,0x3D,0xFD,0x35,0x75,0xD4,0xEE,0x0C,0x16,0x74,0xF9,0x9D, + + 0x2A,0xC2,0x5D,0x0A,0x63,0x7D,0x7F,0x9F,0xCD,0x67,0x13,0xB5,0x17,0x8C,0x17,0x3A, + + 0xC0,0x69,0xE4,0x69,0x9E,0xBF,0x3D,0xA6,0xED,0xA7,0x5D,0x45,0x02,0xF9,0x67,0xAF, + + 0x29,0x34,0xC7,0xCE,0x30,0xB7,0xF7,0x77,0x47,0xE8,0x37,0x69,0x6E,0xF9,0xDF,0x48, + + 0x4C,0xF7,0xE7,0x08,0xDE,0xEE,0xAF,0xF4,0x10,0xA7,0xD7,0x7D,0x7B,0x0E,0x3F,0xC8, + + 0x89,0xDE,0x59,0x2C,0x1A,0xBA,0x95,0x11,0x11,0xDC,0x26,0x14,0x87,0x75,0xA2,0x5E, + + 0x3A,0xE2,0x5A,0xBC,0xC0,0xA6,0xEE,0xE5,0x66,0x69,0x5A,0x8C,0xDC,0x0D,0xAF,0x49, + + 0xA8,0x3D,0xCE,0x5C,0x1F,0x61,0x1F,0x29,0x68,0x2B,0x73,0x1C,0x7A,0x6A,0xFF,0x1C, + + 0xAD,0x6A,0x79,0xB9,0x44,0xFD,0xF7,0x79,0x2A,0x5C,0x08,0x7F,0x42,0xBE,0x5A,0xA9, + + 0x68,0x63,0x68,0x8E,0x32,0xF6,0xF4,0xDE,0x23,0x60,0xF0,0x0A,0x33,0x6F,0xA2,0xE3, + + 0x8D,0x0C,0x7B,0x2F,0xEB,0xB4,0x27,0x77,0x8B,0x11,0xFE,0x54,0x52,0x40,0x7F,0x07, + + 0x61,0x81,0xFE,0x3A,0x6E,0xF7,0xF5,0xDE,0x21,0xFD,0x4E,0x24,0x2D,0x0E,0xF6,0x35, + + 0x75,0x80,0xFA,0xD7,0x12,0x65,0x51,0xA4,0xC7,0x59,0xC3,0x95,0xAD,0x7C,0x67,0xB1, + + 0x9E,0x96,0x53,0xC0,0x7E,0xD2,0x18,0x82,0xEE,0xE9,0x85,0xE6,0xC3,0x10,0x37,0xAD, + + 0x03,0x0B,0x5B,0xD0,0x7F,0x52,0x8C,0xD5,0x00,0x49,0xEA,0x8B,0xA7,0x6A,0xA9,0xCB, + + 0xA0,0xD0,0x7E,0xA7,0xF1,0xC3,0x1D,0x83,0x7F,0xCA,0xE9,0x94,0x71,0x39,0x21,0xD7, + + 0x7F,0x46,0xF3,0xB7,0xF0,0xD7,0x56,0x8F,0x2A,0xFF,0x19,0xB8,0x42,0x61,0x04,0xB8, + + 0x6B,0x23,0x35,0x28,0x6F,0x28,0xD7,0xD8,0x68,0xF9,0x2A,0xD2,0x3B,0x4B,0x58,0x57, + + 0x2D,0xF4,0x31,0xAC,0xDC,0xF6,0x53,0xB5,0xA0,0x19,0x79,0xC2,0xFD,0x84,0x90,0xFA, + + 0x0C,0x87,0xD9,0x62,0xE4,0xD5,0xD3,0xE1,0xB4,0x08,0x04,0xC7,0x7D,0x06,0x1C,0xEA, + + 0x0D,0x86,0x2C,0x1B,0x72,0x4F,0x0C,0x09,0xE9,0x09,0x5F,0xC6,0xBA,0xE0,0xEF,0x37, + + 0x97,0x50,0x55,0xB3,0x4E,0xFB,0x78,0xCD,0x09,0x41,0xFB,0x63,0xFB,0xEB,0x52,0xCC, + + 0x6B,0xF2,0x15,0x26,0x24,0xEB,0x14,0x57,0x1E,0x0D,0x57,0x1E,0x78,0x0D,0xF8,0x07, + + 0x63,0x3E,0x42,0x27,0xED,0xE2,0xD8,0x92,0x02,0xB6,0x93,0x79,0x58,0x4A,0xB4,0x2B, + + 0xE9,0xF0,0x12,0x5D,0x7A,0x90,0x10,0x09,0x49,0x4C,0x1B,0xA0,0x84,0x2E,0x04,0x7F, + + 0x20,0xEF,0x3F,0xE4,0x3C,0xCB,0x2B,0x90,0xF2,0xEF,0x37,0x92,0xAC,0x95,0x0C,0x6F, + + 0xDE,0x11,0x1B,0x8E,0x13,0x85,0xC1,0x28,0x67,0xCB,0xAE,0xB5,0xF4,0x67,0xFA,0x7F, + + 0x5F,0x32,0x7A,0xA1,0x94,0xC6,0x2E,0x11,0x7C,0xCD,0xCB,0x96,0xFC,0xD9,0x09,0x91, + + 0x5E,0xEC,0xD9,0xE7,0x5A,0x70,0xDF,0x59,0x2D,0x1E,0x3C,0xAF,0x6D,0xC7,0xE9,0xBF, + + 0xBF,0x56,0xBC,0xC0,0xD2,0xB5,0x8F,0xAF,0x1D,0xA6,0xD0,0x06,0x56,0xF9,0xE5,0xBE, + + 0x5C,0x15,0xB4,0x64,0x85,0x9A,0xDC,0x2D,0xF1,0xAE,0xF3,0x8B,0xAA,0xE9,0x08,0x45, + + 0x37,0xEB,0xD4,0x36,0x36,0x9B,0x88,0xB1,0x03,0xE9,0x8C,0x18,0x55,0x37,0xB6,0x71, + + 0xF3,0xE5,0x69,0xF1,0x32,0x3A,0xA2,0x83,0x14,0xE8,0x66,0xAF,0xF5,0xAD,0xF9,0x88, + + 0xD7,0xE7,0xFB,0xE7,0xB5,0x9E,0x64,0xAC,0x64,0x16,0xC8,0xA3,0x6A,0x36,0x47,0x31, + + 0x3A,0xAA,0xDA,0xB5,0xD2,0x7D,0xA6,0xA8,0xCE,0x18,0x41,0xBC,0xFA,0x77,0x07,0x76, + + 0xA8,0x1A,0x10,0x4D,0xFE,0x97,0x03,0x8D,0xDB,0xBE,0xF6,0x0D,0x2E,0xC5,0x46,0xC9, + + 0xBA,0xA3,0xB5,0x2C,0x9B,0x94,0xF3,0x39,0x15,0x7B,0x7F,0x82,0xDD,0x15,0x1F,0x51, + + 0x8F,0x6D,0xEE,0x2E,0xBB,0x58,0x0F,0xEE,0x8F,0xC3,0x41,0xA3,0x87,0x00,0x61,0xA7, + + 0xF2,0xA0,0x90,0x1E,0x29,0x7F,0x9B,0x10,0x1C,0x90,0x15,0xC1,0xF6,0x80,0xB8,0x4D, + + 0xB1,0x5C,0xEF,0xCB,0x3B,0x30,0x68,0xAE,0x38,0x54,0x7E,0x93,0x6F,0x3C,0xB4,0xB7, + + 0x40,0x5B,0xCF,0xD1,0xBD,0xC5,0x40,0x99,0xED,0xD4,0x3A,0x02,0x0E,0x29,0xF3,0xF1, + + 0x88,0x0D,0x98,0x41,0x1A,0x1F,0x79,0x1F,0x1C,0xC4,0x27,0xD5,0xD0,0x6D,0x88,0x60, + + 0x67,0xFD,0x92,0xB3,0xE6,0x55,0xE8,0x12,0x6D,0x30,0x87,0xD4,0x09,0xE5,0xC5,0xF9, + + 0xA0,0x2D,0x15,0x65,0xEC,0x1D,0x8D,0x07,0xE6,0x83,0xE3,0x09,0x3F,0x86,0x57,0x14, + + 0xA1,0x2C,0x09,0x09,0x19,0xC6,0x07,0x57,0xAD,0xCE,0xD4,0x13,0x5A,0xE1,0x9B,0x2D, + + 0x7A,0x2B,0x60,0x8F,0xE2,0xA2,0xB7,0x00,0x07,0x84,0x2B,0x64,0x29,0x0C,0xCC,0x30, + + 0xF8,0x08,0xE9,0xB4,0x95,0xAD,0x22,0x73,0xE4,0xC3,0xF2,0x09,0x76,0x07,0xC1,0x2D, + + 0xF0,0x29,0xED,0x40,0x37,0x2E,0x09,0xE1,0xE4,0x74,0xAE,0xCC,0xD0,0x3C,0x16,0xD7, + + 0xD0,0xA8,0x64,0xA7,0x93,0xA8,0x29,0xEE,0x66,0x4F,0xA0,0x74,0x72,0x18,0x82,0x78, + + 0x6E,0xDD,0x16,0x6C,0x91,0xCA,0x4D,0x59,0x65,0xAB,0x05,0x2F,0xD1,0xE4,0xBA,0x1B, + + 0x05,0xA9,0x11,0xA6,0x90,0xCB,0x44,0x3C,0x2E,0xED,0x9D,0xA9,0x36,0x4F,0x5D,0x0C, + + 0x7D,0x85,0x78,0x0F,0xE4,0x55,0x48,0xDB,0x4D,0x7B,0xDB,0xDE,0x1A,0xEA,0xD4,0xE4, + + 0x72,0x8B,0x50,0x60,0x93,0x54,0x68,0x04,0x49,0x14,0x3E,0x4D,0x36,0x6D,0xDF,0x7B, + + 0x16,0x23,0x82,0x0E,0x0B,0x2E,0x76,0x88,0xCC,0xCF,0xAB,0x93,0xFB,0x1D,0xCE,0x38, + + 0xF0,0x36,0x92,0xDC,0x1A,0x7C,0xF2,0xAE,0x2C,0xAD,0xB8,0x3E,0x0F,0xEB,0xC3,0x39, + + 0xB8,0x21,0x9B,0xCD,0x9B,0x5F,0xB0,0x19,0x6D,0xC8,0x0B,0x09,0x51,0x68,0xEB,0x5F, + + 0xD8,0xA0,0xD1,0xBD,0xBB,0x04,0x03,0xFF,0x90,0xC5,0xF7,0x78,0x7E,0x67,0x24,0x82, + + 0x24,0x70,0x00,0xE4,0xCB,0xF2,0x98,0xE0,0xE7,0x04,0xF4,0x99,0x7C,0x9C,0x2C,0x92, + + 0x2D,0x88,0xAA,0x32,0x2D,0xB5,0x5A,0xB6,0x0E,0x57,0xF6,0x54,0x34,0xE1,0x25,0x83, + + 0xA4,0x03,0xAB,0x83,0xB7,0xF2,0xD7,0xBC,0x2A,0x79,0x9D,0x65,0x0D,0x7E,0x2D,0x93, + + 0xE1,0xB5,0x97,0xE4,0x93,0xBA,0xBD,0xC1,0x0E,0x16,0xC3,0x24,0x9E,0x45,0x3A,0xC5, + + 0x26,0x39,0x0B,0x44,0x37,0xD3,0xC2,0xDB,0x60,0x35,0x0F,0xA1,0x8B,0x42,0x64,0xC3, + + 0xCE,0xD1,0x48,0xB4,0x76,0x95,0x9B,0x32,0x23,0x29,0x10,0xF4,0x7F,0x99,0xC5,0x3C, + + 0x29,0x20,0xDF,0x25,0x34,0x9E,0x80,0x81,0x15,0xBA,0x4E,0x7D,0xF7,0x96,0x96,0xA8, + + 0x58,0xD6,0x95,0x15,0x34,0xB9,0x46,0xAC,0x32,0x6A,0xB5,0x9C,0xD3,0xF1,0xE6,0x56, + + 0xD6,0x65,0x20,0xFF,0x40,0xB1,0x48,0x9D,0x07,0x7D,0xB7,0xB0,0x98,0x0C,0x50,0x9C, + + 0xCC,0x1A,0x71,0x9E,0x19,0xA2,0x5F,0xA0,0xBD,0x6D,0xE0,0x8C,0x3D,0xB5,0x31,0xE9, + + 0xCC,0x80,0x23,0x72,0xB4,0xFB,0xB6,0x58,0x0C,0x96,0x01,0x5E,0x14,0xBE,0x66,0x68, + + 0x21,0x16,0xFB,0xF9,0x30,0xD9,0x18,0x4A,0x71,0xC9,0xDE,0xB1,0x2D,0x8F,0x06,0x95, + + 0x8D,0x17,0x46,0x0C,0xB2,0xB2,0xDD,0xF3,0xEE,0x42,0xA6,0x73,0xDF,0x76,0x14,0x2A, + + 0xFC,0x92,0x8E,0x9F,0xCA,0xB0,0x27,0x6A,0xCA,0x22,0x34,0x8C,0xDC,0xFB,0x63,0x29, + + 0x2C,0x62,0x9F,0x0D,0x1F,0xFD,0xD8,0x95,0x33,0x9F,0x0C,0x0D,0x7C,0xB6,0x0F,0x84, + + 0x48,0x32,0xE5,0xDE,0xB9,0x2C,0x45,0x05,0x8C,0x56,0xAF,0x62,0x5E,0x75,0x7F,0xE2, + + 0x82,0x03,0x73,0x10,0xED,0xAB,0xEF,0xDB,0xC2,0x48,0xE0,0x5A,0xF3,0x05,0x28,0x69, + + 0xA0,0xFE,0xB2,0xA4,0x8C,0x8E,0x65,0x14,0xA8,0x11,0x90,0x83,0xB0,0x6E,0x46,0x73, + + 0x23,0x04,0xEA,0x39,0x7B,0x66,0xEE,0x43,0xE0,0x4F,0x2E,0xC7,0xF4,0x64,0x23,0xC1, + + 0xDD,0x05,0x2D,0x77,0x6E,0x62,0xE4,0x4A,0xFD,0x3C,0xF9,0x75,0x37,0x6E,0x46,0x49, + + 0x26,0x02,0xB8,0x60,0x93,0x29,0xEF,0x82,0x66,0xC9,0xA8,0xE6,0x74,0x2C,0x28,0x10, + + 0xEF,0x08,0x08,0x89,0xAA,0x2B,0x98,0x45,0xFD,0x48,0x13,0x16,0xAE,0x0B,0x49,0x76, + + 0x23,0xD9,0xE9,0x42,0x13,0x62,0xAE,0x91,0x2E,0xB7,0xA9,0x42,0x71,0x26,0xE5,0xCF, + + 0x0E,0xF1,0x69,0x97,0x1F,0x29,0xA2,0x36,0xCD,0x48,0xBE,0x35,0x93,0x9A,0x52,0x85, + + 0xAB,0x48,0x2A,0x90,0x2B,0x4C,0x28,0x8D,0xFF,0xB5,0xD8,0xD2,0xFB,0x65,0xAD,0xB8, + + 0xD9,0x2A,0x4A,0xDC,0x0A,0x6B,0x3A,0xD2,0x2A,0x4D,0xE2,0xBE,0x58,0xEE,0xC8,0x6B, + + 0x5C,0xFB,0x39,0xF6,0xE7,0x0A,0xBF,0xA6,0x7D,0xC3,0xD9,0x30,0x99,0x62,0x2C,0xBD, + + 0x34,0x02,0x45,0xA9,0x78,0x84,0x7A,0x79,0xC5,0xBE,0x20,0xDF,0x75,0x96,0x4A,0x4D, + + 0x85,0x08,0xFA,0xE8,0x98,0x64,0xD5,0xD7,0x5E,0x63,0xB5,0x93,0x7E,0x00,0xDA,0x9F, + + 0xF6,0xBB,0x0A,0x04,0x46,0x2B,0x15,0x5E,0xA2,0x7D,0x7D,0x7A,0x8F,0x09,0x47,0x0E, + + 0x89,0x01,0x0C,0xBD,0x96,0x21,0xD3,0x84,0x12,0x0C,0xEC,0xF2,0x25,0x2F,0xF0,0xC3, + + 0x8A,0xEF,0x43,0x5A,0xF8,0xAF,0x03,0x74,0x81,0x7F,0x66,0x1D,0x9F,0x1D,0x36,0xB0, + + 0x22,0xBF,0xFE,0x87,0x5C,0x30,0x4F,0xF3,0x1B,0x23,0xF4,0xE4,0xC6,0x7D,0xB9,0x63, + + 0xAD,0x50,0x11,0x94,0xB9,0xFB,0x04,0xB5,0x1E,0x71,0xD6,0xA9,0xD2,0x77,0xA5,0xF2, + + 0x03,0x91,0xA1,0xB9,0xB0,0x12,0xD5,0x68,0xAD,0xAF,0xDF,0x5B,0x53,0x7F,0x17,0x93, + + 0x4A,0x1C,0x8D,0x95,0x4C,0x92,0x8D,0x4C,0xE1,0x12,0x95,0x1F,0x04,0x7C,0x51,0xFF, + + 0x16,0x55,0x54,0x46,0x10,0x54,0x36,0xF1,0x61,0x34,0xAE,0x14,0x7A,0x7B,0x5B,0x23, + + 0xA7,0x98,0xB3,0x56,0x11,0x55,0xDD,0xC0,0xDC,0x39,0x97,0x84,0x92,0x6E,0x7F,0x3B, + + 0xF8,0xEB,0xFF,0x27,0x90,0xC9,0x6F,0xE3,0xA6,0xFB,0xF3,0xBC,0xB9,0x36,0x9E,0x22, + + 0x2F,0x1A,0x97,0xD4,0x10,0x76,0x99,0x0E,0xC7,0x3B,0x5E,0x13,0xC0,0x4C,0x47,0xEE, + + 0x49,0x1C,0xBE,0xBD,0x99,0xB9,0x2C,0x52,0x93,0x23,0x22,0xD3,0xDB,0x39,0x75,0xBF, + + 0x88,0x77,0xDC,0xD6,0xD2,0x5D,0x67,0x3C,0x65,0x56,0x66,0xB4,0x98,0x36,0x61,0x6B, + + 0x8C,0x17,0xE0,0x7E,0x3C,0xB7,0x57,0x45,0x84,0x65,0xCE,0xD8,0x9B,0x7E,0x6D,0x91, + + 0x58,0x92,0xB7,0x67,0x15,0x36,0xC2,0x80,0xDE,0x2C,0xC6,0xCD,0x9A,0x80,0x55,0x32, + + 0xD3,0x17,0xFC,0x32,0xE7,0xE1,0x0B,0x04,0x87,0x47,0x2C,0x04,0x34,0x33,0xDE,0x5A, + + 0xA3,0x65,0x05,0x3F,0x6F,0xEA,0xDF,0x1A,0x8B,0xE2,0x01,0x08,0x0C,0x3D,0x3B,0x96, + + 0x5B,0xE2,0x68,0xBF,0x41,0x7C,0x0E,0x7F,0xA8,0xFA,0x47,0x69,0xCC,0xA0,0x77,0xB9, + + 0xA7,0x5F,0x5A,0x2F,0x9F,0x39,0x9F,0x21,0x7F,0x1E,0x5F,0x24,0x45,0x79,0xE5,0x8F, + + 0xED,0xC3,0xA5,0xEE,0x27,0x6F,0xB1,0x06,0xB9,0xAC,0xC8,0x02,0xD6,0xE3,0x7E,0xB3, + + 0xEE,0xE5,0xF1,0x15,0xF2,0xED,0x5F,0xCD,0x61,0x3A,0xE2,0x1D,0xF6,0x84,0xB4,0xF0, + + 0x00,0x0F,0x09,0x13,0x11,0x72,0x56,0x63,0x84,0x3F,0xF0,0x87,0x90,0xD2,0x11,0xEC, + + 0x6C,0x80,0x29,0xD1,0x99,0xE2,0x39,0x17,0xF6,0xB2,0xE3,0x15,0x76,0xE7,0xDF,0xD9, + + 0xF9,0x59,0x98,0x62,0x10,0x1E,0xB0,0xAE,0x90,0x86,0xCF,0x84,0xFA,0xE0,0x57,0xCD, + + 0xF8,0x18,0x1D,0xD2,0x6D,0x83,0xE3,0x56,0xA6,0x87,0x75,0x86,0x5B,0xEA,0x02,0xBD, + + 0xA2,0xEA,0x8B,0xBA,0x94,0x7D,0xBE,0x9B,0xC0,0xBE,0x0F,0x43,0x54,0xEE,0x8A,0xAD, + + 0xA3,0xE9,0x29,0x1F,0x07,0xE7,0x2A,0x45,0x45,0xDB,0x99,0x37,0xC2,0x6A,0xB7,0xF9, + + 0x88,0x05,0x8E,0x1A,0x95,0xCC,0x8A,0xD5,0x3F,0x64,0x34,0xDE,0xE4,0xE7,0x95,0xF8, + + 0x8D,0xC4,0xA6,0x4D,0xED,0x68,0xB4,0x45,0x6E,0x19,0x4A,0x2A,0x79,0xEF,0x75,0x36, + + 0x67,0xEE,0xAF,0x5C,0x28,0x62,0x6C,0x9F,0xCA,0xF0,0x07,0xDF,0xFC,0xE5,0xBB,0xEA, + + 0x2E,0xCB,0x23,0x49,0xF7,0x8B,0x62,0x03,0x68,0x34,0xB3,0x90,0x3C,0xE4,0x22,0x75, + + 0x06,0xE0,0xEF,0x43,0xFF,0x03,0x80,0x88,0xA7,0x35,0x8A,0x4A,0xDC,0x10,0x14,0x73, + + 0xC7,0x73,0x8A,0x1E,0xA1,0xA2,0x1A,0x30,0xE9,0xC2,0xB4,0x93,0x57,0xAD,0x03,0x0B, + + 0x6A,0x83,0xE6,0xA7,0xAD,0x61,0x01,0x94,0x86,0x43,0x89,0x1D,0x7D,0x9A,0xFA,0xDD, + + 0x73,0x5A,0xE9,0xBD,0x18,0xFA,0xEB,0x08,0xDB,0xA3,0xB0,0x0F,0x5D,0x13,0x04,0x10, + + 0xA4,0xD1,0xDB,0xA1,0x95,0x6F,0x69,0xAA,0x57,0xD0,0x4C,0xAE,0x17,0x0F,0x54,0x10, + + 0xF8,0xCE,0x65,0x92,0x7D,0x97,0x6C,0x26,0x84,0xDE,0x44,0x5E,0x7E,0xBE,0x45,0xDC, + + 0x1B,0x6F,0x11,0xE5,0x4B,0xA9,0xF5,0x73,0x83,0xD4,0x4D,0xD5,0xC7,0x18,0x12,0x71, + + 0x27,0x6F,0xCD,0xD7,0x1B,0x3E,0x89,0xCC,0x46,0x92,0x2D,0xC4,0xED,0x9F,0xA9,0x2A, + + 0xCF,0x6D,0xE8,0xBD,0x97,0x3E,0x14,0xA6,0x1D,0x5F,0xFC,0x41,0xD7,0x0B,0x3C,0xD2, + + 0x21,0x6F,0xA6,0x28,0x31,0x26,0x76,0x76,0x2F,0x72,0x6C,0xE7,0x6B,0xF3,0x1F,0xA3, + + 0xAA,0xD6,0x1E,0x25,0x1A,0xBB,0xF5,0x01,0x64,0x95,0xCF,0x05,0x0B,0xF9,0xA2,0xF7, + + 0x94,0xB1,0xB8,0xF3,0x84,0xAC,0x3B,0x22,0xAC,0x7D,0x50,0x17,0x56,0x77,0x5B,0xE5, + + 0x8F,0x9E,0xDE,0x0C,0x3D,0xFF,0xED,0xAB,0x0F,0x2E,0xD0,0xA2,0x7F,0x68,0x56,0x18, + + 0x2C,0xE4,0x96,0x4E,0x61,0x31,0x06,0x41,0x90,0xB5,0x71,0x46,0x7B,0x73,0x88,0x61, + + 0x45,0x30,0x9F,0xDF,0xB4,0xB5,0xA4,0x2F,0x80,0x36,0x77,0x76,0x58,0xB8,0x75,0x9A, + + 0x0E,0x98,0x9F,0x7D,0x3F,0xB3,0x58,0xFB,0xAD,0x0B,0x6F,0x3B,0xA2,0xD3,0xDC,0x8D, + + 0xEC,0x4E,0x5C,0x30,0xD7,0xEC,0xE6,0xB5,0x0F,0xBC,0x8E,0xCA,0x7E,0xFC,0xD4,0xCE, + + 0x29,0xE7,0x2E,0x06,0xAB,0xFC,0x44,0x4A,0x49,0x29,0xFE,0xFE,0x7F,0xFD,0x2F,0xD3, + + 0x9D,0xB8,0x44,0x2D,0x5E,0x01,0xD8,0x99,0x92,0x21,0xF7,0xEF,0xFE,0xFE,0xB8,0xA5, + + 0x0C,0xFA,0x8F,0x9B,0x3B,0x32,0xDF,0x08,0x63,0x62,0xFF,0xFF,0x9E,0x15,0x10,0x95, + + 0x02,0x6E,0xD9,0x17,0xF7,0x3B,0xBA,0xD1,0x46,0xE0,0x13,0xCC,0x98,0xAD,0x1B,0x98, + + 0xA4,0x88,0xAD,0xE2,0x7A,0x80,0x1E,0x22,0x47,0x21,0x9E,0x4A,0x8F,0xAE,0x58,0x86, + + 0x25,0x84,0xA0,0xF1,0xB6,0x39,0x59,0xC9,0x52,0x00,0x6A,0xE2,0x0E,0x6A,0x29,0x83, + + 0x09,0x0B,0x6B,0xE8,0x57,0x2C,0xA5,0xB3,0x04,0xE8,0xB9,0x25,0x30,0x78,0x41,0x3F, + + 0xA5,0x07,0x5F,0xD1,0x11,0x84,0x33,0x06,0xB1,0x54,0xB3,0x02,0xA5,0x74,0x9A,0x90, + + 0x4B,0x47,0x8E,0xBC,0x83,0xE8,0x3F,0x8F,0xB6,0xD3,0x60,0x8E,0x43,0x28,0x81,0x4D, + + 0x84,0x77,0x01,0x38,0xDE,0x2C,0xE9,0x9A,0x4F,0xBB,0x69,0x9A,0xE1,0x8F,0xD6,0x8B, + + 0x03,0xF5,0x36,0x35,0xCF,0x49,0xA2,0x4A,0xA7,0xDC,0xA6,0x32,0x0D,0x98,0x82,0xCF, + + 0x2C,0x64,0xD2,0x99,0x14,0x2B,0x92,0x39,0x92,0x4E,0xB4,0xDA,0x6B,0xCC,0xF2,0xF0, + + 0xC1,0xC6,0xF5,0x5B,0x2A,0x4F,0x52,0xD0,0x09,0x0B,0x92,0x2C,0xDE,0x5B,0x93,0x7B, + + 0xBB,0x1F,0xC1,0x11,0x71,0x8B,0xB9,0xD8,0xCE,0xEA,0x29,0xEA,0x1A,0x3A,0xA3,0x90, + + 0xBA,0xCF,0x33,0x86,0x3E,0x39,0x1D,0xA5,0xCF,0xB2,0xA1,0xCB,0xFB,0x59,0x1B,0x53, + + 0x6D,0x4C,0xA4,0x7D,0x1B,0xEC,0x52,0xEC,0x37,0xEA,0xE9,0xF2,0xAD,0x51,0x21,0xB0, + + 0xD3,0xA0,0xEA,0x4C,0xFA,0x36,0xE2,0x41,0xEC,0x5F,0x27,0x0E,0x99,0x6D,0x63,0xD4, + + 0x8C,0xF7,0x7C,0xDE,0xF2,0xE1,0x5B,0x65,0xF9,0xF8,0x2E,0x2A,0x3B,0x18,0x5D,0x6D, + + 0x6C,0xC2,0xEA,0xAB,0xA8,0x3B,0xE3,0xC1,0x4B,0x6E,0x22,0x3A,0x26,0x19,0x5E,0x84, + + 0x87,0x00,0x3C,0x7A,0x5B,0x3F,0xD4,0xB1,0x63,0x4B,0x55,0xA1,0x50,0x32,0x55,0x82, + + 0xC6,0x0A,0xF3,0x7C,0x7E,0x7C,0xDC,0xFC,0xA1,0x5B,0xA2,0x60,0x52,0x29,0x5F,0x49, + + 0x07,0x9F,0x83,0xB7,0xD0,0x92,0xA5,0x25,0xA8,0x67,0xCD,0x21,0xD1,0x6B,0xED,0xE7, + + 0x92,0x87,0xF6,0x52,0x6B,0x3B,0x5D,0x59,0x59,0x1E,0xC4,0xC5,0x54,0xAC,0xDB,0x91, + + 0x23,0x54,0x3B,0x83,0xCB,0xC2,0x54,0x06,0x51,0x40,0x78,0x60,0x0F,0xB3,0xF6,0x55, + + 0x2D,0x9F,0x95,0x52,0xD6,0x0A,0xE6,0x10,0x29,0x7C,0x1A,0x70,0x0E,0x95,0x49,0x9A, + + 0x91,0x82,0x3A,0xBF,0x64,0xE9,0x8F,0xED,0xD1,0x42,0x15,0x98,0xBC,0x7C,0x9A,0x2E, + + 0x1C,0x79,0xB2,0x51,0xCE,0x91,0xAC,0x75,0x9E,0x7C,0x95,0x71,0xC0,0x43,0xFC,0x0C, + + 0x09,0xBA,0x85,0x64,0xFC,0xF5,0x14,0x4E,0xCD,0xDE,0x97,0xCA,0x87,0xA5,0xF1,0xEB, + + 0x7E,0xED,0x1E,0x68,0x31,0x3D,0x2F,0x48,0x2D,0x16,0xA4,0x23,0x86,0xF4,0x39,0xE9, + + 0xC8,0xC5,0x6B,0x1F,0xB0,0x30,0x13,0xE9,0xFC,0x41,0xC7,0xDA,0xB4,0x16,0x77,0xAB, + + 0x56,0x00,0x4D,0xE7,0xD2,0x34,0x8F,0xCB,0xDA,0x6E,0x7C,0x43,0xCA,0x92,0x79,0x47, + + 0x2C,0xE5,0xCE,0x49,0x09,0xD5,0x0F,0xF2,0x8F,0x30,0xE8,0xDD,0x1E,0xB3,0xD1,0xCD, + + 0x2A,0x7D,0x97,0x46,0xE2,0x72,0xC1,0x6E,0x68,0xDD,0xD6,0xF0,0x48,0x68,0x8F,0x09, + + 0xBA,0x5C,0x7F,0x36,0xAA,0x73,0x93,0x12,0x67,0x1C,0x6D,0xAA,0x38,0xDE,0x5F,0x51, + + 0xDE,0x04,0xCE,0xA6,0x1C,0x24,0x06,0xF3,0x8C,0x1C,0x85,0xF8,0x5C,0x3E,0xDA,0xEA, + + 0xD6,0xCF,0x18,0x94,0x14,0xEF,0x8C,0xA6,0x0C,0x67,0x75,0xCE,0x9C,0x4D,0xD2,0x54, + + 0x1B,0x9A,0xF8,0x61,0x17,0xA2,0x02,0xDA,0x89,0x0E,0x72,0x56,0x51,0x6C,0x20,0xE5, + + 0xB7,0xB6,0xF8,0x81,0x31,0xB2,0x31,0x23,0xC4,0xC2,0xA7,0x13,0x33,0x4F,0x08,0xE7, + + 0xA3,0xC2,0x6F,0x13,0x12,0x61,0x59,0x65,0xE8,0x81,0x43,0xDF,0x1D,0x2E,0x8C,0xD0, + + 0x0E,0x8C,0x5A,0xA6,0x12,0xEA,0xDC,0x10,0x8C,0x05,0x49,0x16,0xD6,0xFB,0xA8,0x5F, + + 0x01,0xF4,0xF4,0x14,0xFE,0x6F,0x03,0x35,0xBA,0x73,0xB0,0x7B,0x64,0x73,0x21,0x31, + + 0x61,0x85,0x24,0x67,0x88,0xE6,0x0E,0x11,0x04,0xC6,0x4A,0x17,0x56,0xF0,0xBB,0x93, + + 0xC3,0x9C,0xB1,0x0A,0xA4,0x6D,0x42,0x03,0x47,0xD8,0xC2,0x91,0xC7,0x5A,0x8A,0x8F, + + 0x89,0x9A,0x4A,0x9B,0x2F,0xEE,0x34,0xEA,0x7F,0x8D,0x5E,0xBC,0x4C,0xE0,0xEA,0x67, + + 0xDE,0x92,0xF0,0x26,0xBA,0xA8,0xFA,0x2B,0x15,0xC1,0x8B,0x2E,0xFA,0xA8,0x8B,0x9E, + + 0x09,0x48,0xF9,0x0E,0x3B,0xBA,0xF3,0x3A,0x0C,0xA4,0x35,0x5D,0x3B,0xF1,0x88,0xED, + + 0xBE,0xCD,0xEE,0xCF,0xAE,0x81,0xBE,0xB9,0x08,0xA2,0xAB,0xAE,0x99,0xEA,0x53,0xBA, + + 0x4E,0xC3,0x5A,0xAE,0x0B,0xEE,0xC9,0x1A,0xCE,0xDA,0x0A,0x86,0xCE,0x27,0x66,0x38, + + 0x2D,0x2F,0xCA,0xAB,0x2C,0x3B,0x1D,0x1C,0x85,0x0C,0xA2,0x6A,0x6C,0xF8,0xF3,0x6B, + + 0x88,0xCE,0x7C,0x1E,0x9F,0xEE,0x3B,0xEB,0x43,0xD5,0x72,0x87,0x4E,0x23,0xEB,0x1A, + + 0x2E,0xCD,0x53,0xA1,0x8F,0xE2,0x83,0xF3,0x6A,0x49,0xA1,0x7B,0x78,0xAE,0x95,0xF1, + + 0x87,0xDF,0xA2,0xB4,0x54,0x10,0xCC,0x86,0x85,0x7F,0x0C,0x5C,0x64,0xBD,0xF3,0x12, + + 0x52,0xE4,0xA4,0x03,0x06,0x75,0x86,0x4C,0xE8,0xB3,0xA6,0xB4,0xC6,0x6C,0x24,0xFC, + + 0x03,0xD3,0xDA,0xF9,0x3B,0x04,0x23,0x5C,0xD7,0x94,0xCA,0x60,0x2A,0x2F,0xED,0xE3, + + 0xD5,0x68,0x17,0xE7,0xBD,0xBA,0x43,0x87,0xD6,0xF7,0xA7,0xB5,0x67,0xFB,0x45,0xB4, + + 0xD9,0xFA,0xC5,0x32,0x10,0xB0,0x24,0x66,0x2E,0xD5,0xCE,0x0E,0xEE,0x3B,0xD3,0x41, + + 0x4F,0x5A,0x7E,0x26,0xB7,0xAA,0x25,0xF8,0x82,0x2A,0x01,0xD8,0xD4,0x6E,0x03,0xF2, + + 0xA7,0x56,0xAD,0x00,0x4B,0x10,0x33,0xE7,0xCF,0x5B,0x65,0x63,0x8B,0x92,0x4D,0xC3, + + 0x46,0x8C,0x76,0x5D,0xB6,0x47,0x91,0x60,0x8F,0xDF,0xD9,0x0E,0x76,0x0C,0x66,0x76, + + 0x90,0xDA,0x27,0x7A,0x38,0xA3,0x8E,0xCA,0x24,0x73,0x34,0xF0,0x8D,0x24,0x94,0xDD, + + 0xEF,0x9B,0x54,0x9C,0x73,0x34,0x5E,0xF0,0xBD,0xD4,0x59,0x3A,0x00,0xDB,0x76,0x8B, + + 0x9F,0x7E,0x81,0xFC,0xD4,0x7B,0x21,0xAA,0x93,0x9A,0x18,0xD4,0x21,0xE1,0x67,0x0A, + + 0xE9,0x9D,0xF6,0x89,0x5A,0xBF,0x4D,0xBA,0xE7,0x56,0xF7,0x3B,0x08,0xB4,0x47,0x3C, + + 0x1D,0x88,0xBF,0xBB,0x9B,0x43,0xF4,0x95,0xA4,0x7D,0x97,0x12,0xE2,0xBC,0xAB,0x7A, + + 0x31,0x14,0x41,0x38,0x2F,0x40,0x27,0xF0,0x88,0xB3,0x59,0x5E,0x96,0xF4,0xDD,0x2B, + + 0xAA,0xD0,0xE6,0xA9,0x8D,0x28,0x8D,0xE9,0xAE,0x53,0x3D,0x40,0x2A,0x0F,0xAF,0xA6, + + 0x84,0x84,0x17,0xDD,0x99,0xA4,0xBF,0x86,0x09,0x9D,0xD8,0x1D,0x1F,0x5E,0x38,0xFF, + + 0xE9,0x0F,0x98,0x34,0xE7,0x8F,0x29,0x53,0x61,0xC1,0x87,0x3F,0x20,0xF4,0x48,0xE3, + + 0x27,0xDC,0xB6,0x25,0x9C,0x87,0x66,0x19,0xA8,0x70,0x00,0xB0,0x2C,0x80,0xD5,0xFF, + + 0x7D,0x83,0x13,0x77,0x7B,0x83,0xEA,0xD2,0xF4,0xCF,0x04,0x1B,0xF9,0x97,0x5B,0xBE, + + 0x6A,0x20,0x42,0xD5,0xBC,0x8E,0xB5,0xA2,0x96,0x49,0x2E,0x09,0x25,0xD2,0x41,0x26, + + 0xE9,0x55,0xC8,0x80,0xF3,0x8B,0x38,0x02,0xB5,0x06,0x56,0x99,0xC0,0xBF,0x5B,0x23, + + 0x37,0xA4,0x91,0x7B,0xB6,0x83,0xFB,0x45,0x9B,0x84,0x81,0x5A,0xF6,0x3A,0x7B,0xB2, + + 0xBE,0xA9,0xD4,0xB6,0xA6,0x48,0x53,0x8C,0x1E,0x57,0xF3,0xE1,0xC9,0x98,0x71,0xAE, + + 0x6A,0x36,0x58,0xDD,0x36,0x81,0x7A,0x40,0x41,0x43,0xD8,0x13,0x6C,0xDC,0x58,0x4A, + + 0x74,0xA7,0x93,0x3D,0xB9,0xD7,0x1A,0x5B,0x2C,0xC9,0x52,0x3C,0x67,0x73,0xBD,0x1E, + + 0xFE,0xA2,0x35,0x2C,0xA8,0xD6,0x0C,0xC6,0x22,0x3A,0x25,0xDA,0x7D,0x25,0xA3,0xF9, + + 0x00,0xD9,0xBD,0x38,0xB6,0xF5,0x11,0xD6,0x29,0xE9,0xA3,0x53,0x7F,0x7A,0xDE,0x19, + + 0x41,0x02,0x30,0xAD,0x61,0xF4,0x1B,0x2A,0xFD,0xD8,0x5B,0x7B,0x93,0x27,0x96,0xB6, + + 0xF7,0x8D,0xD7,0x8C,0x1E,0x01,0x42,0x0A,0xBD,0x29,0x92,0x94,0xE6,0x97,0xB1,0x27, + + 0x38,0xED,0xF2,0xA2,0xB7,0x20,0xDE,0x06,0x2A,0x18,0x16,0x0D,0xB2,0xFC,0xE7,0xB6, + + 0x6B,0xDD,0xB5,0xC9,0xE7,0x0D,0x6B,0x19,0x81,0x45,0xB2,0x91,0x1A,0x2C,0xE0,0x1E, + + 0x85,0xD3,0x36,0x13,0x6E,0x73,0x43,0x7D,0x62,0x81,0x68,0x50,0xE8,0x8F,0x7C,0x2D, + + 0xCB,0x83,0xFB,0x7C,0x30,0x4B,0x94,0x92,0x94,0x5F,0x6D,0xAC,0xD5,0x0F,0x8C,0x54, + + 0xBA,0x0A,0x53,0xD6,0x46,0x36,0xA7,0x01,0x09,0xFE,0xE5,0xDA,0x10,0x75,0xB2,0xA9, + + 0x54,0xF3,0x90,0x74,0xD6,0xC3,0x03,0x95,0x0B,0x93,0x79,0x3E,0x93,0x76,0x3C,0xF7, + + 0x80,0x92,0x4D,0x41,0xCA,0x5F,0x0B,0xA0,0xD9,0x57,0xFC,0xF5,0xBD,0x70,0xC4,0x3B, + + 0xC3,0xB7,0x7F,0x9E,0x34,0xCD,0x5E,0x9F,0x43,0x14,0xAC,0xC3,0x11,0x21,0x97,0xFF, + + 0x25,0x0F,0xF3,0x36,0x7B,0x64,0x7C,0x0E,0x98,0xCA,0xA4,0xD3,0x9A,0xE4,0x50,0x3B, + + 0xDD,0x14,0x91,0xBF,0x11,0x53,0x69,0x37,0x03,0xAD,0xAD,0xC2,0x1B,0x07,0x26,0xAE, + + 0xF6,0x1E,0xF3,0xF9,0x90,0x77,0xE8,0xD9,0x57,0xB6,0xA5,0xD2,0x1A,0x06,0xEA,0x1A, + + 0x64,0x10,0xDF,0xBB,0x9D,0x9E,0x63,0x8C,0x89,0xF7,0x56,0x38,0xFF,0xDA,0x9E,0x64, + + 0xA1,0xE2,0x11,0x0D,0x3A,0xD9,0xAC,0x5E,0x79,0x16,0x5A,0x43,0xF6,0x04,0x05,0xEF, + + 0xEA,0x55,0x16,0xFE,0x80,0x78,0x81,0x5A,0xD8,0x41,0xB7,0x29,0x05,0x16,0x27,0x1D, + + 0xC8,0x8A,0xB1,0xB4,0x1E,0x2B,0xC4,0x97,0x96,0xCC,0x78,0x4D,0x79,0x64,0xC6,0xAB, + + 0xED,0x70,0xC0,0xE5,0xBA,0x5B,0x63,0xDC,0xDA,0xFD,0xAE,0xCB,0x93,0xED,0x4A,0x98, + + 0x2F,0x53,0xCE,0x24,0xBA,0xC6,0x76,0x9A,0x96,0x51,0x74,0x89,0xD8,0x18,0x1E,0xC7, + + 0x4F,0x98,0x07,0xB0,0x6C,0x85,0x97,0xEC,0x49,0x83,0xAF,0xC9,0x1B,0x78,0x8F,0x25, + + 0x23,0xE4,0x8F,0x21,0x07,0x7D,0x67,0x7B,0x6B,0x1E,0xA7,0xDA,0x58,0x1A,0x73,0x2D, + + 0x26,0xD5,0x9E,0x32,0xAB,0xFB,0x85,0x0A,0xF0,0x21,0xF2,0x60,0x42,0xA2,0x7C,0x16, + + 0x02,0xBF,0xD8,0x92,0x73,0xBB,0xF8,0xF6,0xDE,0x6C,0xE6,0xB2,0x34,0xAF,0xB6,0x38, + + 0xA2,0x17,0xA1,0xFE,0x15,0x39,0x06,0x17,0x34,0x63,0xAF,0xC8,0xD2,0x6B,0x84,0x6C, + + 0x18,0xDF,0x97,0x26,0xFD,0xAE,0xA8,0xC2,0x66,0x83,0x55,0xDF,0x49,0x2E,0xA4,0x88, + + 0xBD,0xFB,0x59,0xE3,0xDC,0xA9,0x10,0x60,0x26,0xC9,0x5C,0xC3,0x83,0x87,0xB7,0x52, + + 0x70,0x8A,0x5F,0x6E,0xE2,0xC6,0x18,0x70,0x63,0xC8,0xD3,0x08,0x86,0xA7,0x3E,0xC3, + + 0xF5,0xF3,0x9C,0xAD,0x62,0xD7,0x8A,0x44,0x67,0x39,0x5A,0xAD,0x6D,0x59,0xA9,0x52, + + 0xAE,0xC5,0x8F,0x35,0x6C,0x38,0x02,0x54,0x66,0x3E,0x66,0xE9,0xA8,0xE5,0x99,0x44, + + 0x67,0x69,0xB0,0xB4,0xF7,0xEC,0x00,0x14,0xEF,0x69,0xD0,0x2F,0x4E,0x25,0x75,0x9A, + + 0x7E,0xFE,0x0E,0x60,0xBE,0xCC,0x6C,0x0F,0xA6,0x28,0xE3,0x24,0xB8,0x16,0x07,0xFA, + + 0xBC,0x86,0x99,0xBF,0x28,0x05,0x22,0xD8,0xFC,0x17,0xD1,0x2F,0xDD,0xE9,0xEB,0x66, + + 0x01,0x2F,0x14,0xFD,0x74,0x6A,0x05,0x5B,0xA6,0xC4,0xC4,0xD7,0x39,0xA6,0xFD,0xEB, + + 0xAF,0x73,0x22,0x4B,0xBD,0x21,0x2A,0x6E,0xBF,0x15,0x29,0x41,0x58,0x46,0xC5,0xAC, + + 0x1F,0x70,0x93,0xDA,0x5C,0x66,0x25,0x6F,0x30,0xCC,0xA0,0x50,0xFC,0x88,0xD7,0x29, + + 0xBD,0xDA,0x3E,0x4D,0x29,0x91,0x6B,0x6F,0x67,0x00,0x53,0xED,0x1B,0x07,0x91,0x28, + + 0xBB,0x0E,0xC4,0x20,0x46,0x33,0xA0,0x79,0xC9,0x15,0xA1,0xAE,0x7C,0x8A,0xFF,0x81, + + 0x5B,0x9C,0x9A,0xAA,0x93,0x1D,0xE9,0x72,0xD3,0x6F,0x2D,0x2C,0x75,0xB0,0xB3,0x54, + + 0x23,0x38,0xBD,0xE4,0x5F,0x50,0x8D,0xD4,0x8E,0xA2,0x7C,0xCB,0xF9,0x5A,0xE5,0x2B, + + 0xA4,0xD0,0x37,0xB6,0x84,0x1D,0xF5,0x6A,0x10,0xC9,0x5D,0x2B,0x73,0xB0,0xC8,0x17, + + 0x84,0x31,0xD3,0xA2,0xFD,0x12,0x3C,0xD5,0x0E,0x40,0xC5,0xB3,0x15,0x8C,0x4C,0xF9, + + 0x03,0x01,0xAA,0xC0,0xCE,0x25,0x4C,0x1C,0xCA,0xD9,0x8C,0x0E,0xE2,0x3B,0xCB,0xFA, + + 0xF3,0x74,0xBE,0xDE,0x92,0x1A,0x14,0x90,0x98,0xDB,0x6C,0x1E,0xA3,0x35,0x79,0x47, + + 0xB5,0x08,0xBC,0xE9,0x13,0x19,0x88,0x67,0x9B,0x87,0xF4,0x11,0x73,0xB4,0x4A,0xE7, + + 0x77,0x36,0xBB,0x3A,0x25,0xEC,0x45,0x0D,0xE1,0x57,0x3D,0x92,0x1E,0xEC,0x1C,0x62, + + 0x36,0xD7,0x86,0x18,0x4B,0xED,0xEB,0xC0,0x5B,0x6D,0x07,0x4C,0x0B,0x8F,0x70,0xAE, + + 0xAC,0x32,0xF5,0x9E,0x3B,0xA3,0xE1,0xD0,0x1A,0x6C,0x3E,0x77,0x89,0xE2,0xB7,0x7A, + + 0xC4,0xBE,0x78,0x35,0x44,0x60,0x68,0x2B,0x9F,0xAF,0x68,0x2F,0x1D,0x45,0xB9,0xA0, + + 0xC6,0x8A,0xC4,0x80,0xC9,0x6F,0xFF,0x7F,0x76,0x76,0x0E,0xD9,0x16,0xCA,0xDD,0x88, + + 0x8F,0x61,0xC4,0x33,0x3C,0x67,0xAB,0xF4,0x52,0x28,0x55,0x98,0xF1,0x7A,0xD9,0xBE, + + 0x29,0x64,0xB7,0xF0,0x9A,0xE2,0x1C,0x05,0x86,0xAC,0xE0,0x71,0x79,0xE4,0x4F,0xA9, + + 0x5A,0xB7,0x52,0x4B,0xB1,0x4C,0x64,0x2C,0x07,0x4F,0x77,0xAF,0xEE,0xBC,0xF9,0x19, + + 0x0E,0x60,0xEE,0xB9,0x00,0x04,0x65,0xF9,0x2D,0xDB,0xB8,0x39,0xF1,0xBE,0xBF,0x30, + + 0x4C,0x1B,0xA0,0x32,0xB1,0xFF,0x4B,0x0F,0x3B,0x42,0xCA,0x56,0xAB,0x22,0x10,0x20, + + 0xF6,0xA0,0xF7,0x6A,0xFA,0x48,0xC3,0xF2,0x47,0x61,0xB8,0xB0,0x0E,0x9B,0x30,0xE7, + + 0xA4,0xAF,0xE1,0x07,0x78,0x2F,0xCC,0x20,0xBF,0x42,0x5E,0xAF,0xD6,0x7B,0x31,0x0E, + + 0x22,0x86,0xB6,0xE6,0xF0,0x25,0x05,0xD9,0x4D,0x88,0x42,0x7F,0xAE,0xD5,0x60,0xE3, + + 0xA3,0x0D,0x8E,0x26,0x90,0x38,0x51,0x93,0x12,0xC9,0x7D,0x06,0xD0,0x88,0x16,0xB2, + + 0x0F,0x80,0xA8,0x56,0x08,0x28,0xA2,0xF2,0xC3,0x9C,0x34,0x16,0xB1,0x9A,0x07,0x23, + + 0x65,0xCB,0x36,0xC1,0xEF,0x92,0x2F,0x78,0xF1,0x40,0xED,0x87,0x50,0x62,0xFA,0xB3, + + 0xB0,0x47,0xA9,0x02,0x52,0x65,0x61,0x8E,0xCD,0x25,0xDE,0x07,0x51,0x7B,0x10,0x08, + + 0xF7,0xA5,0xA2,0xF1,0xB9,0xA2,0x1B,0xAA,0xF4,0x4A,0x4F,0xBC,0x23,0x97,0xD7,0x19, + + 0x0D,0x29,0xB4,0x6C,0x50,0x40,0x42,0x98,0xCB,0x3C,0xB3,0xC1,0xEF,0x12,0x7B,0xB9, + + 0x2B,0xD5,0x77,0xE5,0xDB,0x65,0x2B,0xD6,0xA9,0x82,0x53,0xF0,0x4A,0xB1,0x17,0xE5, + + 0x01,0xF0,0xD3,0x14,0x3C,0x20,0xDB,0x5B,0x3E,0xB6,0x9D,0x4F,0x22,0x29,0xE9,0x0F, + + 0x04,0xD0,0x5D,0x57,0x98,0x28,0x18,0xF5,0xA1,0x1C,0xF5,0x8E,0xD8,0x80,0xAA,0xAE, + + 0x38,0x54,0xAA,0x0B,0x8A,0x22,0x5D,0x74,0xA2,0xDD,0xE6,0x9E,0xD9,0x71,0x87,0x83, + + 0x31,0x15,0x8E,0x2F,0xD9,0xDE,0x43,0xE9,0x96,0xEA,0x7E,0x0F,0x58,0x82,0x71,0xBF, + + 0x9B,0x84,0x7F,0x2F,0x38,0x29,0xB7,0xEA,0x93,0x47,0xFC,0x1F,0x54,0xE9,0x3E,0x68, + + 0xEC,0xDF,0x82,0x74,0x34,0x7F,0x4D,0xA7,0x95,0x9F,0x16,0xE4,0x7C,0xDB,0x36,0x63, + + 0x49,0x8A,0x74,0x96,0x77,0x9C,0x54,0x78,0x45,0x1D,0x13,0xD6,0xB0,0xFB,0x5C,0xAA, + + 0x07,0x53,0xA5,0x08,0xD3,0x30,0x6A,0x5C,0xE8,0x10,0x06,0xB1,0x72,0x76,0xB8,0x68, + + 0xA3,0x68,0x11,0x35,0x5C,0xF3,0x89,0xC3,0x63,0x4F,0x1A,0xA5,0xC2,0xA8,0x1B,0x13, + + 0x1D,0x45,0xFB,0x46,0xB2,0xE0,0xC7,0xD1,0x76,0xD6,0x9E,0xF9,0x41,0xED,0xE7,0x2D, + + 0x09,0x8E,0xAC,0x9E,0x9D,0x3A,0x24,0xE2,0x50,0x0E,0x85,0x80,0xD4,0x6E,0x85,0x19, + + 0xE4,0xCD,0xFD,0x97,0xF1,0xC6,0x2B,0xDD,0x2A,0x06,0x2D,0x87,0xB1,0x86,0x6D,0x28, + + 0x4D,0x6C,0x79,0xA7,0x10,0x31,0xA7,0x75,0x95,0xAE,0xC6,0x93,0xD0,0x17,0x86,0x75, + + 0x28,0xC3,0xDF,0x74,0x9D,0xB0,0xE4,0x4A,0xEA,0xB4,0x6E,0xCA,0x87,0xF1,0xD5,0xB7, + + 0x56,0x1B,0xDE,0xFF,0x7D,0x22,0xB6,0x25,0x82,0xB3,0x0D,0x8C,0x71,0xC6,0x3F,0x0D, + + 0xA0,0x33,0xC3,0x6B,0x51,0x53,0x28,0x4B,0x03,0x60,0x93,0xCD,0xBA,0xD7,0x50,0x32, + + 0xAF,0xC1,0xD4,0xFB,0xF8,0x79,0xB7,0x20,0x6C,0x89,0xA5,0x18,0x0A,0x15,0x85,0x4C, + + 0x79,0xDE,0xEF,0x6B,0x9B,0x37,0x36,0xEA,0x51,0x51,0x8C,0xFD,0xDD,0x67,0x04,0x45, + + 0xC0,0x8D,0xCB,0x5E,0xAA,0x5A,0x99,0x7A,0xA6,0x50,0x84,0xF4,0xDC,0xD9,0x27,0xCB, + + 0x8F,0x13,0x47,0xEA,0x1B,0x35,0x93,0x6C,0xE4,0xD4,0x4D,0x8B,0xD9,0x1E,0x77,0x7C, + + 0x2D,0x1D,0x95,0xD8,0x18,0x5A,0x27,0x9B,0xC8,0x3F,0xC7,0xC1,0xFD,0x86,0x08,0x86, + + 0x36,0x80,0x22,0xF7,0x39,0xC0,0xAB,0xDD,0xC6,0xB5,0x7F,0xAC,0x23,0x3C,0x63,0xFA, + + 0xA1,0xC3,0x88,0xEB,0xB4,0xA2,0x2C,0xB0,0xF9,0xE3,0x82,0xCD,0x53,0x1B,0x78,0x89, + + 0x82,0x22,0xFF,0x77,0x6B,0xA4,0x73,0x41,0xB9,0xC9,0x6E,0xFE,0xEB,0x42,0x2F,0x38, + + 0x83,0x7A,0x15,0x8E,0x7C,0xCA,0x01,0xCC,0x27,0xAB,0xD8,0xB5,0x55,0x1B,0x68,0xA4, + + 0x84,0x80,0xC9,0xF9,0xB7,0xAF,0xF7,0x71,0x16,0x94,0x71,0x26,0x5A,0x6F,0xEF,0x32, + + 0x5B,0x88,0xA9,0xD4,0x97,0x9F,0x94,0xE0,0x5B,0xCD,0x9C,0x14,0x14,0x15,0x82,0x21, + + 0x47,0x0C,0x61,0x60,0x37,0xAD,0x51,0x6F,0x2F,0x96,0x70,0x85,0x54,0xE2,0x43,0x83, + + 0xDB,0x2C,0xD1,0xB7,0x91,0xA1,0xFD,0x82,0xD3,0xB7,0x99,0x20,0x42,0xE8,0xCA,0xE2, + + 0x9E,0xCA,0xF2,0x79,0x50,0xB3,0x77,0xA8,0xF0,0xAA,0x8A,0xFE,0x00,0x47,0x96,0x9E, + + 0x45,0x2E,0x8A,0x2B,0xF4,0xC0,0xC5,0xB8,0xF1,0x6B,0x29,0x3F,0xDD,0xB9,0x25,0xD3, + + 0x8A,0x73,0xF8,0xFF,0x94,0xE5,0x0B,0xD5,0x31,0x13,0x20,0xCF,0x94,0x41,0x2B,0x1B, + + 0x8D,0x8B,0xF2,0xE7,0xBF,0x86,0x03,0x46,0xEE,0x9B,0x85,0x03,0x52,0x6D,0x1A,0x6A, + + 0xEE,0xB7,0xCB,0xF1,0x18,0x55,0x4C,0x72,0xC3,0x6A,0x92,0x6C,0xD4,0xE1,0x2F,0xBD, + + 0x78,0x41,0x2A,0x23,0xE6,0xAB,0x79,0x46,0xCF,0xAD,0x54,0x28,0xFC,0xEB,0xFE,0xAC, + + 0x67,0x81,0xDC,0xCD,0x53,0x22,0x74,0x2B,0x86,0x6A,0xD9,0xBF,0x82,0xE8,0xB4,0xF2, + + 0xFC,0x8B,0x45,0x15,0x99,0x56,0x5D,0x62,0xBB,0x62,0xDB,0x7C,0x7E,0x63,0x2E,0xFD, + + 0x05,0xE0,0x5C,0x6E,0x6C,0xFD,0x54,0xE8,0x8E,0xDF,0x0B,0x3D,0x85,0x79,0xAC,0x52, + + 0x9E,0x31,0x88,0xA5,0xB0,0x41,0x72,0x54,0x8E,0x1B,0xDD,0xF6,0x31,0x5C,0x1B,0xB2, + + 0x29,0x14,0xBF,0x83,0x97,0xF2,0x6C,0x5E,0x43,0xC9,0x95,0x4D,0x97,0xF6,0x3B,0x91, + + 0x76,0x48,0x05,0x86,0xC2,0x97,0x43,0xC2,0x8E,0x2A,0x2E,0xA7,0xC6,0x28,0xD0,0xA0, + + 0x65,0x66,0xDE,0x24,0xB4,0xB0,0x2E,0xFF,0xC5,0xD2,0x8E,0x46,0xD7,0x94,0x52,0x54, + + 0x77,0xF0,0x8C,0x9C,0xEF,0xBA,0xFB,0x70,0xAA,0xA9,0xE7,0x72,0x0A,0xAF,0x1B,0xDA, + + 0x07,0xD3,0x09,0xA5,0xF5,0x46,0x55,0x2F,0x47,0x5C,0xD3,0x3B,0x82,0xED,0x55,0x03, + + 0xFB,0x38,0x8D,0xD5,0x38,0xBA,0x05,0x91,0x8C,0xD8,0xA4,0x8F,0x50,0x53,0x06,0x77, + + 0x61,0x03,0x79,0xDA,0x4F,0xBC,0xC9,0x28,0xEC,0x12,0x4E,0x2C,0xFC,0x72,0x5B,0x1E, + + 0x7E,0x5B,0x6E,0x46,0x7B,0x62,0x3C,0x38,0xFC,0xAD,0xDE,0xBC,0x72,0xF4,0x92,0x72, + + 0xAE,0xE1,0xF8,0xC7,0x83,0x3A,0x0F,0xF9,0xAF,0x2A,0x8F,0x47,0x7A,0x35,0xEF,0xF3, + + 0x30,0xDA,0x8B,0x62,0xEC,0xC0,0x47,0xFD,0xF1,0xDD,0xE6,0xA0,0x1A,0xFD,0x7E,0x22, + + 0xAC,0x57,0xCC,0x1E,0x62,0x17,0xF7,0xD8,0xCD,0xDA,0x3D,0xD2,0x78,0x05,0x69,0x29, + + 0x78,0x86,0x40,0xBD,0x9C,0xB0,0x34,0xE7,0xED,0xC1,0xD8,0x9E,0x0B,0x70,0x47,0xB8, + + 0xFE,0x3F,0x9F,0xC3,0x5E,0xB8,0x57,0x27,0x4F,0x52,0x8D,0x4F,0x5F,0x9E,0xAF,0x3D, + + 0x8F,0x0F,0xB7,0xD7,0x3D,0x53,0xDC,0x19,0x6D,0xDB,0x9F,0xB5,0x4D,0xF0,0xB4,0xE2, + + 0x63,0xFF,0x87,0x62,0x71,0x60,0x2B,0x53,0x69,0xC6,0x4B,0x24,0x56,0xDA,0xBC,0xF2, + + 0x83,0x05,0xD7,0x76,0x3F,0x67,0x3C,0x30,0xE0,0x48,0x82,0x30,0x70,0xBB,0x61,0x56, + + 0x7D,0x0D,0x99,0xED,0x12,0x26,0x13,0x61,0x84,0x44,0x64,0xCD,0x88,0x2F,0xE1,0x73, + + 0x0E,0x85,0x8C,0x97,0x11,0x8A,0xE0,0x42,0xE0,0x5C,0xF9,0x37,0xE0,0x6E,0xF8,0xBE, + + 0xC3,0x67,0x43,0xC0,0x4D,0x2E,0x09,0xFD,0xE5,0x42,0x33,0x9A,0x76,0x7F,0x42,0xF0, + + 0xBC,0xB0,0xF2,0xCB,0xEC,0xA8,0xF5,0x0C,0xE0,0x48,0xC0,0x6B,0xF0,0xE0,0x95,0x91, + + 0x03,0xFE,0x29,0x7A,0xB6,0x4A,0x71,0x63,0x63,0x40,0x11,0x03,0x2D,0xCB,0x51,0x6E, + + 0x97,0x45,0xAB,0x55,0x64,0x3C,0xF5,0xE3,0xD7,0x4D,0x49,0x27,0x90,0x97,0x02,0x48, + + 0x7A,0x05,0xBA,0xFF,0x60,0x2B,0x28,0xC1,0x6B,0x27,0x69,0xAE,0xD8,0x81,0x40,0xF2, + + 0xE2,0xD8,0x1D,0x7E,0xFA,0xD6,0xE6,0x4B,0x1E,0x56,0x0F,0x47,0xB2,0xF8,0x79,0x69, + + 0xBA,0x07,0x86,0xD8,0x1A,0x2E,0x2A,0x18,0x69,0x78,0xAB,0xD6,0x2D,0xC5,0x55,0xFB, + + 0x88,0x8E,0xEB,0x1F,0xED,0x26,0x21,0xD0,0xEE,0x24,0xFB,0x3F,0xEC,0x66,0x8D,0xEE, + + 0xEB,0x0D,0xDC,0x0B,0xBF,0xDA,0xD6,0x98,0xB5,0x43,0xAA,0x4B,0xBB,0x63,0xFF,0x38, + + 0xF0,0x09,0xB2,0xD4,0xBE,0xA4,0xC5,0x58,0x4D,0xB4,0x80,0x7E,0xE8,0xB4,0x40,0x5C, + + 0x61,0xB6,0x78,0x3D,0x1A,0x81,0x33,0x6B,0xFD,0x0C,0x43,0xAA,0x27,0xD8,0xC9,0xAA, + + 0xD2,0x7A,0xEB,0xCE,0x38,0x6E,0x68,0x3B,0x6A,0xB2,0xBA,0x59,0xE8,0x3A,0x56,0x81, + + 0xF9,0x91,0xA4,0x68,0x91,0x2B,0xEF,0x22,0xE0,0x08,0x23,0x9D,0x76,0x89,0x6C,0xC7, + + 0xDC,0x1E,0xD5,0x96,0xD6,0x2A,0xB4,0x34,0x2E,0x92,0xB4,0xD6,0x77,0x88,0x05,0x7E, + + 0x59,0xC1,0xC7,0x63,0x1C,0x3F,0x4C,0x65,0xE6,0xAB,0x26,0xE7,0x51,0x8F,0xB9,0xEE, + + 0x02,0x08,0xCF,0xF3,0x46,0x9E,0x27,0x42,0xFD,0x48,0x34,0x31,0x8C,0x22,0x44,0xC4, + + 0xAB,0xE9,0x71,0x78,0xD9,0x50,0xEB,0xA2,0xC3,0x16,0xF4,0xC0,0xD3,0xCB,0x66,0x55, + + 0x2D,0x9F,0x33,0x3C,0x5E,0x78,0xCD,0x32,0xC2,0xAA,0x24,0xD0,0x40,0x05,0x25,0xC3, + + 0xD1,0x1B,0x55,0x2D,0x6E,0xFB,0xCA,0xAF,0xE4,0xAF,0x6E,0x03,0x0B,0x66,0xC9,0x39, + + 0xE5,0x58,0xB6,0xDD,0x16,0x88,0x35,0x93,0x14,0x15,0x65,0x0B,0xE3,0x3A,0x9C,0x0C, + + 0x55,0x42,0x91,0xCB,0xEE,0x30,0x10,0x4E,0x5B,0x7C,0xFE,0xCE,0x87,0x76,0x6E,0xD2, + + 0x8F,0x16,0x0D,0x74,0xB9,0xF4,0x26,0x88,0x21,0x42,0x43,0x54,0x77,0x84,0x5E,0xFD, + + 0x0F,0x97,0x47,0xF2,0x6E,0x32,0xEF,0x2B,0x68,0x5D,0xAF,0x53,0xFE,0xFA,0x6F,0xD3, + + 0x47,0x14,0x74,0xEE,0xC1,0x55,0x5E,0x5F,0x4C,0x40,0x67,0x3F,0x79,0xD2,0x7E,0x18, + + 0x54,0x07,0x6A,0x53,0x59,0x38,0x54,0x05,0x59,0x58,0x2B,0xC8,0x49,0x6A,0x36,0xDD, + + 0xCB,0xB6,0xAF,0xF8,0x9E,0xC2,0x27,0x7C,0x5B,0x5D,0xBC,0xF8,0x33,0x48,0x57,0x2F, + + 0x0F,0xB5,0xBE,0xB7,0xDB,0x3A,0xE8,0x1F,0xEC,0x04,0x17,0xFC,0xA9,0x65,0x37,0xC8, + + 0x6B,0x19,0x14,0xDD,0x43,0xEE,0x9F,0x24,0x7E,0x1D,0xE5,0x15,0x2D,0x30,0xDF,0x80, + + 0x95,0x97,0x3F,0xE6,0x4C,0xAD,0x09,0x13,0xE5,0xF2,0x4B,0xA4,0xD4,0xD9,0x97,0xF0, + + 0x87,0x85,0x2F,0x02,0xB4,0xCD,0xC7,0x60,0x06,0x31,0x3D,0xD0,0xAC,0xF1,0x1F,0xE1, + + 0x27,0xE7,0x65,0x81,0xC8,0xA1,0xCD,0xCB,0x04,0x8F,0x89,0xDC,0x21,0xF9,0xC1,0x71, + + 0xC6,0x63,0x6D,0x92,0x13,0x03,0x60,0x25,0x62,0xC5,0x41,0x51,0xF6,0xA3,0x78,0x79, + + 0x12,0x71,0xD8,0xB5,0x62,0x71,0x58,0x00,0x40,0x3D,0x48,0x95,0x78,0xF4,0x08,0xF2, + + 0x0B,0x0E,0x57,0x19,0x82,0x78,0x10,0x10,0xB8,0xCB,0xB8,0x9A,0xEB,0xA4,0xE0,0xC7, + + 0xD9,0x51,0x74,0x78,0xE6,0xDA,0xD8,0xE7,0xBB,0x97,0x49,0x94,0xB4,0x9D,0x6D,0xB1, + + 0x81,0x7D,0x40,0x25,0x2C,0xB8,0x41,0x8D,0xC1,0x47,0x4E,0x4B,0x24,0x58,0x5C,0x36, + + 0x2D,0xFA,0xF2,0x0F,0x2A,0xA9,0x12,0x63,0xED,0x17,0xF3,0x48,0x7F,0xD8,0x12,0x2A, + + 0x0D,0x36,0x7A,0x7C,0xF6,0x18,0xB5,0xBE,0x30,0x85,0x42,0x36,0x3E,0x82,0xD8,0x89, + + 0x1D,0xBD,0xA4,0xBA,0x1E,0xAE,0x53,0x29,0xDD,0xD1,0xEA,0x22,0xBF,0x88,0x4B,0x51, + + 0x3F,0x86,0x1F,0x7D,0x62,0xAD,0x5B,0x39,0xD0,0xC6,0x43,0xBB,0xA0,0x8A,0xB2,0xA2, + + 0x56,0xC1,0x72,0x3D,0x2A,0x0D,0xAF,0x82,0x0C,0x31,0x09,0xEA,0x52,0xE3,0x46,0x25, + + 0x2F,0xBD,0x3E,0xA0,0x7C,0xAF,0xBA,0x07,0x6F,0x8F,0x40,0x81,0xA4,0xF6,0x79,0x4F, + + 0xAD,0xCE,0xDB,0xB0,0x77,0x9F,0x8B,0xE9,0x4E,0xB5,0x48,0x4B,0xED,0xA8,0xEB,0x18, + + 0x72,0x8E,0x7C,0xAC,0x1B,0x24,0xE4,0x41,0x4E,0xC2,0xE2,0x19,0x05,0x64,0x5A,0xEB, + + 0xCF,0x49,0x47,0x46,0x74,0x4D,0x30,0x44,0x0F,0xDF,0x8C,0x58,0xD8,0xFD,0x69,0x74, + + 0x23,0x98,0x8C,0xE7,0x94,0x1E,0x44,0x36,0x3E,0x35,0xFA,0x50,0x73,0x69,0x7C,0x83, + + 0x03,0x89,0x46,0xC7,0xF0,0xB4,0xE2,0x91,0x1B,0x07,0x19,0x39,0x88,0xE9,0x7D,0xE0, + + 0xF2,0x37,0xBA,0xB1,0xE9,0xF5,0x5D,0xF3,0x0B,0x58,0x32,0x33,0xF4,0x3D,0xC9,0xF4, + + 0x85,0x92,0xBF,0xC6,0x30,0xF4,0xE3,0x42,0x55,0x56,0xF5,0x00,0x52,0xF2,0x26,0xCF, + + 0x14,0xB7,0xA6,0x34,0xA6,0x48,0x4E,0x90,0xEA,0x23,0x9B,0x74,0xB2,0x5E,0x45,0x3F, + + 0x07,0x1A,0x48,0xB9,0x77,0xA9,0xCD,0x1C,0x64,0xAA,0x5F,0x82,0xF0,0x56,0x95,0xB5, + + 0x2A,0x11,0xC7,0x07,0xEB,0xAF,0x24,0x6B,0x40,0xD1,0x6D,0x07,0xF3,0xF8,0x3E,0x68, + + 0xCC,0x3C,0xA6,0x0C,0xBC,0x60,0x32,0x48,0xE9,0x2D,0x76,0x67,0x43,0xBA,0x20,0xFB, + + 0x0C,0xE9,0x96,0x8E,0x99,0x89,0x46,0xFC,0xD9,0xDF,0x84,0x1B,0x4E,0xFF,0x5F,0xEA, + + 0x47,0xD3,0x9F,0xC8,0xB2,0xBB,0x57,0xEB,0x52,0x57,0xFE,0x4F,0x58,0xF8,0xC3,0xE8, + + 0x88,0x1D,0x4F,0x9F,0xC2,0x32,0x6F,0xBE,0x4E,0xC0,0x35,0x40,0xCE,0xA9,0x60,0x0A, + + 0x22,0x17,0x76,0x26,0x5F,0xF1,0x26,0xE2,0x0D,0xFC,0x42,0x9C,0xDD,0xBD,0xB5,0xB8, + + 0x6C,0x6D,0x42,0x36,0x0E,0xF0,0x06,0x88,0x5C,0xF9,0x3A,0x7B,0x71,0x77,0x61,0x2D, + + 0x2C,0x9A,0x1C,0xC7,0x1B,0x41,0x0F,0x69,0xCC,0x0E,0x97,0xED,0xA7,0xF3,0x79,0xB9, + + 0xC7,0x92,0x08,0x20,0xAD,0xF2,0x85,0x08,0xF7,0x93,0x38,0xDB,0x1A,0x74,0xA7,0xA0, + + 0xD8,0x23,0x91,0x80,0x63,0x4B,0x2A,0x85,0xB3,0x02,0x50,0xDD,0x1C,0xFD,0x53,0x7B, + + 0xD4,0x6D,0xF0,0xFC,0x93,0x6C,0x8E,0x2B,0x71,0x03,0x75,0x10,0xC8,0x9C,0xC1,0xF9, + + 0xFD,0x40,0x3A,0xE7,0x3C,0xDF,0xDA,0xA8,0xE4,0xB6,0xE9,0x38,0x88,0xBC,0xCD,0x4F, + + 0x8F,0x1D,0x72,0x1D,0x34,0xDC,0x42,0x4C,0xC7,0xD8,0xB4,0xC5,0x2E,0x9C,0xD6,0x32, + + 0xE9,0xC5,0xD2,0xD9,0x14,0xBF,0x2E,0x49,0x21,0xBB,0x98,0x25,0xBB,0xC5,0x88,0xA8, + + 0x82,0x08,0xF0,0x65,0x6F,0x9A,0x26,0x4C,0xA8,0xB4,0x96,0x12,0xAC,0xC8,0x1B,0xEF, + + 0xEA,0xC7,0x1B,0x27,0x61,0x43,0x2F,0x59,0x29,0xF7,0xD3,0x96,0xB6,0x7D,0x51,0xC4, + + 0x7B,0xC6,0xF7,0x69,0xE1,0xB8,0x63,0x82,0xAF,0xCC,0x4B,0x32,0x0D,0x6D,0x7F,0xF7, + + 0x6B,0x28,0xBC,0x24,0x1E,0x93,0x2F,0x76,0xC5,0x2A,0x69,0xC4,0x13,0x25,0x30,0xA8, + + 0x98,0x4B,0x31,0xFE,0xB5,0xD4,0x61,0x4B,0x79,0x0B,0xCA,0xD4,0x12,0x24,0x15,0xA8, + + 0x63,0x4E,0x4A,0x89,0xEB,0xE1,0xB8,0xAC,0x5B,0x75,0xEC,0x5F,0x2B,0xC5,0x54,0x1F, + + 0xEA,0x66,0xF3,0xF5,0x41,0x66,0x40,0xD9,0xCF,0xD0,0x66,0x47,0x54,0x1D,0xF5,0x79, + + 0x0C,0x07,0x2E,0x37,0xC4,0xB1,0xA3,0x59,0x26,0x0E,0xC7,0x9C,0x75,0xCD,0x5F,0x26, + + 0xC1,0x1C,0x5B,0x67,0x63,0xB8,0x0B,0x88,0x5D,0xEC,0x9D,0x47,0x3F,0x98,0x43,0x0E, + + 0x77,0xA8,0x20,0x0D,0x8E,0x5B,0x08,0x2B,0x6B,0x47,0x41,0x87,0x7F,0x67,0x03,0x4C, + + 0x5F,0x1E,0xD8,0x62,0xAB,0x2B,0xCD,0xFD,0xB8,0x0B,0xCD,0xF9,0xF8,0x8B,0xFB,0x70, + + 0x64,0xB1,0x7F,0x74,0x1F,0xC1,0xD0,0x6A,0xDB,0xCF,0x20,0xC6,0xCF,0x1C,0x5E,0xDA, + + 0x27,0xAA,0xC4,0x80,0x52,0x5A,0xD5,0x34,0x12,0x9A,0x99,0xEA,0xC4,0xAD,0x51,0x72, + + 0x24,0x9F,0xFC,0xE3,0x3D,0xE4,0x2B,0x89,0xE6,0xE9,0x72,0xCB,0x26,0x78,0xAD,0x61, + + 0x10,0xB2,0x1A,0x7F,0x44,0x7C,0xDD,0x49,0x58,0x8F,0x32,0xDA,0x2C,0xCF,0x1F,0xC6, + + 0x83,0x94,0xBD,0xA2,0x13,0xC5,0x54,0xA7,0x9F,0xF2,0xC2,0xE6,0x90,0x81,0x13,0xB1, + + 0x25,0x8E,0xF2,0x19,0xF9,0x6F,0x14,0xE5,0xB7,0x84,0xE6,0x07,0x1B,0xFE,0x3D,0xB2, + + 0xCA,0x54,0x05,0x1C,0xE7,0x5A,0xC2,0x9F,0x28,0x87,0xC3,0xE1,0xDD,0x95,0x97,0xA2, + + 0x93,0x18,0xCF,0x2A,0x3E,0x9A,0xFA,0xCC,0x2B,0xB6,0x1C,0xC4,0x9B,0x35,0x52,0x7B, + + 0xAC,0x95,0xDC,0x69,0x40,0x27,0xBA,0x2D,0xBD,0x3A,0xAD,0xF7,0x28,0x7C,0xD7,0xC3, + + 0xD4,0xA5,0xB6,0xAD,0x98,0xC6,0x25,0xE7,0x6F,0xA3,0x0E,0x51,0x31,0xC2,0x55,0xDE, + + 0xAE,0x11,0xBD,0x6B,0x45,0x9B,0x7E,0x42,0x13,0xA6,0xBD,0xF2,0x01,0x86,0x24,0xE7, + + 0x78,0x59,0xB0,0xAC,0x18,0x9A,0xBE,0xC6,0x02,0x54,0x60,0x40,0xC1,0xA0,0xF2,0xBB, + + 0x12,0x13,0x89,0x5F,0x69,0xBC,0xC3,0xF9,0x06,0xF1,0x8D,0xEA,0xDB,0xFB,0xDE,0x5C, + + 0x58,0xE6,0xCF,0x1C,0x71,0xE0,0x56,0x4B,0x82,0xEC,0x1E,0x18,0x54,0xDD,0x41,0xF8, + + 0x82,0xF3,0x3C,0xB2,0x37,0xB8,0xC1,0xAE,0x28,0xFE,0x57,0xFC,0x06,0xDF,0xF2,0x3B, + + 0xCB,0x4D,0x63,0x4F,0xAB,0x35,0x25,0x19,0xE7,0xF2,0xC9,0x8E,0x93,0x13,0x36,0xA3, + + 0xEF,0xC4,0x5F,0xF6,0x59,0x01,0x0D,0x7C,0xC9,0xA2,0xF8,0x83,0x37,0xD1,0x70,0xFE, + + 0xD1,0xC2,0x17,0xF4,0x31,0x55,0x47,0x6D,0xB4,0x3D,0x80,0x5F,0x76,0x20,0x1B,0xB3, + + 0x49,0xC0,0xB0,0x83,0xE7,0xE6,0x9A,0xA6,0x57,0xFD,0xA2,0xA3,0xA7,0xA6,0x8E,0xB6, + + 0x6C,0x80,0x3F,0x93,0xCE,0x7B,0xF9,0xEE,0x51,0x37,0x0C,0x97,0x9D,0xE0,0xC7,0x6B, + + 0xCE,0x45,0xE1,0x69,0x2A,0x11,0x48,0x82,0x32,0x71,0x1C,0x8E,0x6B,0xA9,0xFA,0x15, + + 0xC5,0x25,0xFD,0xD2,0x30,0x9F,0x20,0x72,0xCA,0x38,0xF0,0x6E,0xAF,0x24,0xF7,0x52, + + 0xE2,0x2B,0x76,0x7D,0xE2,0x53,0xE7,0x5C,0xF6,0x84,0x16,0xEF,0x73,0x30,0x61,0x85, + + 0x6E,0x66,0xB3,0xDB,0xFF,0x66,0x1F,0x4A,0x32,0x61,0x4E,0x46,0xD1,0xCC,0xE2,0xF3, + + 0x0C,0xCA,0x15,0x3B,0x18,0xA3,0x27,0x59,0x20,0x8A,0xE8,0xAE,0x60,0xAA,0x17,0x44, + + 0x80,0xEB,0x92,0x8E,0xBE,0x22,0xE0,0xBE,0x3E,0xF4,0x7A,0xC7,0x74,0xAB,0x78,0xFF, + + 0x8A,0x11,0xDB,0x8D,0x59,0x1C,0x6C,0x2B,0xCA,0x51,0xE8,0x29,0x2D,0xE5,0x80,0x9E, + + 0x1E,0xB4,0x77,0x26,0x2E,0xE6,0x90,0x7C,0xC3,0x17,0xE0,0xCB,0x7C,0xB4,0x18,0x2A, + + 0x66,0x07,0x22,0xB6,0x9A,0x27,0x61,0xAA,0x02,0x18,0xA4,0x51,0x36,0xAE,0x31,0x5C, + + 0xE6,0x6C,0xCA,0x54,0xBE,0xA4,0xEC,0x56,0xB7,0x2C,0xDA,0x25,0xA3,0x4C,0x76,0x7A, + + 0xE6,0xCC,0xE7,0xAD,0xBA,0xA8,0x60,0x74,0xB6,0x6A,0xAF,0x42,0x96,0x2F,0x13,0x6B, + + 0x99,0xCD,0x39,0xAF,0xB0,0x5E,0xCC,0x52,0xC9,0xC4,0x3B,0x9A,0xB1,0x4F,0xA4,0xCD, + + 0xB1,0x4D,0x9C,0x7D,0x43,0x30,0x06,0x59,0x94,0xDF,0x01,0x22,0x2B,0xE6,0x1F,0x36, + + 0xDD,0xF2,0xF3,0x9A,0x94,0x2E,0x0E,0x8B,0x9A,0x7C,0xF2,0xD0,0x8A,0x5C,0x8C,0xCC, + + 0x59,0xEE,0xFF,0x1C,0xCC,0xF0,0x0B,0x8A,0x0F,0xDD,0x8F,0x54,0x9C,0xE9,0x9E,0x37, + + 0x59,0xF0,0x6D,0x6E,0xF9,0xBE,0x45,0x0B,0x12,0x92,0xAB,0xF0,0x2B,0xF9,0xA4,0x3A, + + 0xA2,0x1F,0x63,0xB9,0xE2,0xBB,0x67,0x10,0x47,0x9E,0x96,0xE2,0x77,0x19,0x33,0xB3, + + 0x21,0x0E,0xCD,0xB4,0xC0,0x48,0x69,0xC0,0x07,0x27,0x82,0xF0,0x96,0x76,0x61,0x21, + + 0x5B,0xD4,0xD7,0x38,0x34,0xB2,0x2B,0x01,0xE2,0x7B,0x65,0x17,0x5B,0x07,0xB7,0xA9, + + 0x04,0xF2,0x41,0x49,0xB6,0xD7,0xBD,0x0B,0x80,0xDA,0x53,0x04,0x7B,0xFA,0xE6,0x8E, + + 0xB1,0x65,0x4A,0x14,0x3D,0x38,0x91,0x82,0x6A,0x83,0x28,0x5E,0x53,0x59,0xD5,0xBE, + + 0xC6,0xFD,0x73,0x9E,0xC8,0x33,0xC5,0xB2,0xC8,0x26,0x73,0x4E,0x82,0x56,0xB2,0x74, + + 0x59,0xC9,0x7A,0x8E,0x3C,0xFA,0xE2,0x43,0x38,0x97,0xA1,0x45,0x59,0xF3,0x17,0xAA, + + 0x0C,0x24,0xAB,0xF2,0x9C,0x1B,0x61,0x59,0xE9,0x76,0xAE,0x4C,0xC5,0x54,0x59,0x28, + + 0x0A,0x68,0x6A,0x07,0x7E,0xFD,0x8D,0xCD,0xCF,0x7D,0x0D,0x1E,0x76,0x0D,0x0E,0xF5, + + 0x2D,0x90,0xA0,0xB8,0x7D,0x42,0xAD,0x04,0x04,0xD2,0xD7,0x0D,0xF3,0x20,0xF5,0x4F, + + 0x85,0xCA,0xDD,0x3C,0xD6,0xA5,0x60,0x14,0x07,0x4F,0x89,0xE9,0x1F,0x7D,0x11,0xF3, + + 0x03,0x92,0xD1,0xEE,0x32,0x49,0xFF,0x88,0xDF,0x5A,0x87,0x0F,0x4E,0x0E,0x7E,0x06, + + 0xE1,0x83,0x20,0xF4,0x18,0x2F,0x49,0xDC,0xE5,0x7C,0x96,0xF0,0x0C,0x45,0xF3,0xE0, + + 0x45,0xF0,0xD3,0x12,0xA4,0x2E,0x8D,0xDA,0xF8,0x0E,0xD1,0x09,0xE2,0x2C,0xAF,0xF2, + + 0x0C,0x0F,0xDB,0x2C,0xAC,0x60,0x1C,0x6A,0xA3,0xF8,0xC6,0x57,0x2F,0xE9,0x77,0x17, + + 0x60,0x80,0xA9,0x05,0x85,0x74,0x9C,0x9E,0x89,0x8D,0x81,0xC5,0xD7,0xD8,0x44,0xA2, + + 0x5E,0xF9,0xB8,0xC6,0x17,0x7E,0x30,0x21,0xC6,0x49,0xAE,0x55,0x31,0x36,0x7C,0x47, + + 0x27,0xF1,0x92,0xA9,0xB0,0x40,0xD0,0x1C,0x20,0x65,0x78,0x16,0xDC,0xE3,0x5B,0x45, + + 0xA3,0x46,0xB9,0xC7,0x97,0x2F,0x1B,0x9A,0x61,0x40,0xC7,0x54,0xD4,0xFD,0xDB,0xA1, + + 0x95,0x45,0x93,0xAA,0x30,0x21,0x21,0xF3,0xC2,0x25,0xDD,0x35,0x9B,0x92,0x2B,0xFB, + + 0x84,0xD5,0x84,0xDF,0x04,0x0C,0x28,0xC7,0x7B,0xE2,0x40,0xA8,0x2B,0xBE,0xA5,0x43, + + 0xBC,0xB5,0xD0,0xC5,0x6D,0x36,0xFD,0xF8,0x7E,0xC2,0xC5,0xB8,0x5F,0xF2,0x7B,0x2D, + + 0x55,0x77,0x63,0x29,0x79,0xF5,0xAB,0xD6,0x75,0x26,0x53,0xD4,0xD1,0x28,0x20,0x66, + + 0x58,0xA0,0x33,0xE2,0xDA,0xDB,0xC7,0x14,0x7A,0x06,0x2C,0xBF,0x59,0xD3,0x19,0x4B, + + 0xAB,0xA3,0x92,0x63,0xBB,0xA6,0x6A,0x38,0x4E,0x43,0xC4,0xE8,0x3D,0x1C,0x70,0xA6, + + 0xFE,0x61,0x06,0x3E,0x5A,0x6D,0x3A,0x38,0x4D,0x40,0x76,0xEE,0x13,0x65,0xD5,0xCD, + + 0xA1,0x5A,0x34,0xAF,0x18,0x66,0x6B,0x39,0x8A,0x41,0xD5,0x5C,0x33,0xCF,0x2D,0x6C, + + 0x88,0x2E,0xB3,0x3F,0xDA,0x0F,0x51,0x78,0x68,0x2A,0xE5,0x59,0xE8,0xC5,0x3F,0xB2, + + 0x40,0xA3,0x7F,0xFB,0xBD,0xE6,0x2A,0x24,0x03,0x92,0x20,0xC6,0x8B,0x1E,0x57,0xFB, + + 0xF4,0x7D,0x53,0xF6,0xC6,0xBE,0x64,0x40,0x3A,0x00,0x48,0x5C,0x52,0x3C,0xC5,0x79, + + 0xC7,0x50,0xCD,0x38,0xB6,0xA9,0xD5,0x59,0x0E,0xAF,0x55,0x5C,0x28,0x7A,0xC9,0xCF, + + 0xAF,0x0D,0x95,0x25,0xB7,0xA8,0x64,0xDA,0x46,0x57,0xFA,0x4E,0xE3,0x3E,0x29,0xE4, + + 0xA0,0x5C,0xFC,0x14,0xCC,0x3B,0x2C,0x62,0x63,0x33,0xAB,0x19,0x64,0xAF,0xC4,0x7D, + + 0x80,0x13,0xC4,0x36,0x9F,0xBE,0xA2,0x92,0x22,0x75,0x85,0x25,0xD6,0x7C,0xE3,0xB3, + + 0x01,0x10,0xA5,0x81,0x93,0xBD,0x6F,0x03,0x60,0x5E,0x60,0x61,0xAD,0x60,0x41,0xC5, + + 0xC0,0x57,0x49,0x37,0x31,0x3F,0x25,0x73,0xE2,0x90,0x4B,0x71,0xCC,0xCD,0x7B,0x77, + + 0x4B,0x05,0x19,0xEE,0xCB,0x5D,0x1A,0x58,0x50,0x29,0xF5,0x56,0xF5,0x3A,0x5C,0xCF, + + 0xC2,0x7D,0xD1,0x29,0x3F,0xA2,0x64,0x58,0x07,0xD2,0xFE,0xEB,0xB8,0x74,0x10,0x7A, + + 0x2C,0x97,0xBF,0x76,0x4D,0x78,0xD7,0x51,0x6C,0x57,0xC8,0xB6,0xFB,0xFB,0xB0,0x7B, + + 0x8D,0x00,0x38,0x6C,0x1A,0x7B,0xC3,0x94,0x5A,0x16,0xE4,0x9A,0x58,0xC4,0x3E,0x4A, + + 0x23,0x9C,0x06,0xAE,0x79,0x43,0x6E,0x38,0x36,0xD4,0x16,0x09,0x19,0x7A,0xF1,0x28, + + 0x63,0x12,0xB6,0xBE,0x78,0xE2,0xAE,0x9A,0x28,0xAD,0xAC,0xF8,0x77,0x15,0x45,0x2B, + + 0x28,0x36,0xBF,0xAF,0xF9,0x81,0x4F,0x0B,0x68,0x56,0x7D,0x76,0x5B,0x81,0x2F,0x98, + + 0x5E,0x12,0xB7,0x5F,0xBE,0xBE,0x55,0x79,0x48,0x59,0x92,0xFC,0x06,0x11,0x58,0x06, + + 0xF5,0xC2,0xB8,0x82,0x4A,0x5D,0x28,0xC2,0x27,0xF1,0x88,0xA3,0x5A,0x82,0x15,0x4C, + + 0x88,0xE3,0xAE,0xC2,0x95,0xB1,0x00,0xDC,0xA6,0xC8,0x3F,0xB2,0x2E,0xC9,0x7A,0xE6, + + 0x82,0x19,0xEB,0x1A,0xB5,0x22,0xA4,0xA7,0xB7,0x86,0xFB,0xBA,0xF6,0xEF,0x82,0x96, + + 0x16,0xBC,0xF3,0xB9,0xE1,0xE1,0x2B,0xC3,0x9E,0x92,0x79,0xCF,0x03,0xA1,0x3A,0xC2, + + 0x72,0xC6,0x98,0xC4,0x13,0x9D,0x48,0x32,0x66,0xCB,0x48,0x99,0x65,0xDD,0xF7,0x32, + + 0x09,0x0E,0x60,0x2E,0xB4,0xA3,0x18,0x32,0x41,0xC8,0x98,0x20,0x8D,0xEA,0x3A,0x45, + + 0x27,0x39,0xBB,0x46,0x35,0xA0,0x49,0x33,0xC7,0xC9,0x49,0x99,0x5B,0x10,0x7C,0x6A, + + 0x81,0x1C,0xE5,0xC0,0xD7,0xA8,0x33,0x88,0x64,0xCA,0xA0,0xA6,0x22,0xA8,0xDD,0xFA, + + 0xA1,0x39,0xF9,0x4C,0xFD,0xA7,0x4B,0x4C,0xF7,0x42,0xED,0x9A,0x5A,0x53,0x84,0xE9, + + 0x81,0x74,0xAC,0xC0,0x39,0x24,0x70,0xD8,0xD4,0x35,0x05,0xDE,0x10,0xEF,0x5D,0x0D, + + 0x6D,0x09,0x1C,0xE9,0xC8,0x7D,0xB4,0x4B,0x8C,0xF6,0x73,0xAB,0xAF,0x1F,0x53,0xEA, + + 0x2E,0xCB,0x54,0xF7,0xD6,0xE6,0x82,0x64,0xCB,0xA0,0x92,0x80,0x7C,0x74,0xC2,0xBA, + + 0xF1,0x83,0x82,0x0A,0x22,0x2E,0x78,0x7A,0xED,0xCA,0x29,0x30,0x21,0xF6,0xAA,0xA2, + + 0x8B,0x80,0xCE,0x3C,0x5C,0x12,0x02,0xF8,0x4E,0xA0,0x3A,0xA3,0xCD,0x60,0x39,0xC7, + + 0xE6,0x4F,0x9B,0x6B,0x1C,0xE6,0xFB,0x5B,0xAD,0xEE,0x2E,0x7E,0x3F,0x51,0x29,0xB9, + + 0xDB,0x8B,0x93,0xDD,0xBD,0xDA,0x03,0xF9,0xCE,0xAA,0x85,0xAB,0xE0,0x4F,0x83,0xF4, + + 0xCF,0x31,0x1B,0xB4,0x54,0x03,0xD8,0x31,0x0C,0xD8,0x74,0x5F,0xE6,0xF8,0xB9,0x16, + + 0x56,0x9D,0xD7,0xB1,0x94,0x0E,0x67,0x09,0xC4,0xDA,0x84,0x4C,0xD9,0xFC,0x1F,0x6C, + + 0xC7,0xC5,0x65,0x7F,0xD3,0xBF,0x22,0xD1,0x53,0x90,0x73,0x25,0x39,0xEE,0x15,0xF3, + + 0xFF,0x18,0x6D,0x6F,0xCA,0xBE,0x29,0x37,0x86,0x11,0xC2,0x5F,0xD2,0xBE,0x6E,0xC6, + + 0x85,0x99,0xDE,0x24,0x9A,0xBB,0x7C,0x40,0x05,0x24,0x96,0xE2,0x77,0x14,0x64,0x46, + + 0xC6,0x9A,0x94,0x54,0x15,0x15,0x1C,0xB2,0x29,0x55,0xB1,0xF2,0x53,0xB7,0x6F,0xC2, + + 0x05,0x90,0x85,0x83,0x7A,0x36,0x0D,0xC4,0x07,0xD9,0xAB,0x33,0xFA,0x9E,0x0D,0x93, + + 0x45,0x4A,0xD7,0x35,0x35,0xB4,0x05,0x71,0xE2,0xF3,0xA1,0x3C,0xF1,0x9C,0xE7,0xA7, + + 0x2A,0x03,0x66,0x77,0x39,0xFA,0x99,0xC4,0xB1,0x9A,0xD1,0x55,0x6E,0xB5,0x74,0x43, + + 0x11,0x86,0x71,0xFC,0x5D,0xA3,0xC8,0xC5,0xCE,0x52,0xE1,0x34,0x7C,0x39,0x87,0xE9, + + 0x8F,0x18,0xFC,0xB0,0xBA,0x21,0xEB,0xD8,0xEA,0x41,0xD4,0x55,0x71,0xB8,0x97,0x70, + + 0x8E,0x5B,0xD6,0x6F,0x3D,0xF4,0xFE,0x97,0xEB,0x40,0xDF,0xF5,0x17,0x70,0x1E,0xED, + + 0xD3,0x93,0xB3,0x2C,0xBC,0xBF,0x4E,0xBA,0x66,0xD3,0xDF,0x6A,0x11,0x07,0x64,0xDE, + + 0x8C,0x9B,0x6B,0x3C,0xBD,0xBE,0x74,0xF8,0xCC,0xDB,0xA0,0x6A,0x79,0x56,0x07,0x8A, + + 0x2A,0x93,0xA0,0x2D,0x3C,0xBD,0x17,0xAF,0x6E,0xD3,0x37,0x1F,0xA1,0xBC,0x67,0x7E, + + 0x4E,0x90,0x79,0x3D,0x9B,0x32,0xF7,0x2F,0x8C,0xBF,0x2A,0xDB,0xFF,0xFF,0x3A,0xF3, + + 0x6C,0x1B,0xE6,0xDC,0x9F,0xA6,0x05,0x11,0x61,0xBF,0xB7,0xA0,0x2B,0xCB,0xF0,0xE3, + + 0x69,0xAC,0xB6,0xD9,0xDB,0x7B,0x43,0x3E,0x47,0xDA,0xA0,0x5A,0xD0,0x6C,0x1C,0xE7, + + 0xB3,0xC8,0x83,0xC5,0xCD,0x4E,0xAA,0x90,0xF0,0x00,0xB9,0x47,0x69,0x6E,0x1F,0x56, + + 0x4B,0xD9,0x65,0x87,0xD1,0x2B,0xF4,0x71,0xC5,0x62,0x24,0x77,0x70,0x21,0xBB,0x67, + + 0xA3,0x66,0xC5,0xC0,0x5A,0x07,0xD3,0x93,0x29,0xE9,0xA8,0x8C,0x6B,0x29,0xFF,0x79, + + 0xFE,0x66,0x97,0x73,0x91,0xE9,0x62,0x9F,0x38,0xBA,0x64,0x33,0x5D,0x6A,0xBC,0x0F, + + 0x77,0x5A,0xA1,0x13,0x18,0x64,0x49,0x93,0x82,0xB9,0xC9,0x71,0xE9,0xB2,0x2F,0x33, + + 0x74,0xFA,0xAD,0xD1,0xE0,0x3B,0x99,0x98,0x2E,0xEA,0x49,0x07,0x28,0x25,0x0A,0x0C, + + 0x20,0x11,0x00,0x7F,0x43,0x81,0xD8,0x5B,0x2C,0x41,0xCD,0x74,0xA4,0xA3,0x74,0x1E, + + 0xE8,0x8A,0x97,0x7A,0xE2,0xA8,0x22,0xC7,0xA0,0x58,0x1E,0xDE,0xDA,0x64,0x59,0x8F, + + 0xE0,0xAB,0xC8,0x6D,0xE6,0x31,0x55,0x5A,0xF0,0xEB,0xE8,0xD6,0x2F,0x28,0xBA,0xEA, + + 0x05,0x06,0x57,0xF7,0xFA,0xD4,0xCF,0xC7,0xAA,0x9B,0x66,0xFF,0x78,0x34,0x55,0xB3, + + 0xFF,0x9F,0x02,0x5C,0x25,0xA1,0x99,0xF8,0xB5,0xE1,0x8D,0x52,0xFB,0xC7,0xB5,0x22, + + 0x0D,0x96,0x71,0xEC,0x13,0x3F,0x59,0x6B,0x10,0xE6,0xA2,0x94,0x57,0xB1,0x38,0x32, + + 0xE2,0x03,0x54,0xA5,0x10,0x61,0x1C,0x2E,0x14,0x44,0xAB,0x78,0x3A,0xBB,0x2B,0xA7, + + 0x27,0x02,0x33,0xDF,0x1B,0x97,0x61,0x96,0xB0,0x6F,0x77,0xF8,0x0E,0x0D,0x84,0xA1, + + 0x67,0xBD,0xDB,0x88,0x36,0x90,0x00,0x74,0x66,0xEB,0xCA,0x5E,0x8B,0xAF,0x32,0xB8, + + 0x27,0x8A,0x1A,0x67,0x5D,0x2A,0x3A,0x84,0x76,0xF5,0xA4,0x5B,0xF2,0x7C,0x10,0xB0, + + 0x01,0xED,0xE2,0x75,0xF0,0x93,0x0C,0x51,0xE8,0x5D,0x55,0xA0,0x53,0x7C,0x6D,0x6B, + + 0x0D,0x1E,0x90,0xF3,0xF1,0x7C,0x8F,0x7C,0x29,0xF2,0x64,0x77,0x50,0x4C,0x32,0xC0, + + 0x22,0x14,0x00,0x41,0x3C,0xBE,0x99,0xA7,0xBC,0x5E,0x53,0x9B,0xF2,0x9B,0x8C,0xC1, + + 0xC9,0x15,0x95,0x56,0x96,0xEA,0x81,0xF1,0x82,0xEA,0xE2,0xF9,0xAF,0x7A,0x45,0x43, + + 0x67,0x30,0xC1,0x65,0x13,0xB4,0x56,0xF2,0xFD,0x9D,0x8C,0x6D,0x57,0x89,0x4D,0xD1, + + 0xA3,0x9A,0xCC,0xB3,0x4C,0x5B,0x82,0xF0,0xE5,0x6C,0xEF,0x0A,0xC0,0x57,0x79,0x60, + + 0xAE,0xD5,0x3E,0xCB,0xFA,0x98,0x5D,0xBB,0x00,0xE2,0xFE,0xCE,0xFA,0xB4,0x54,0x9A, + + 0x9A,0x84,0x88,0xB5,0xD0,0x08,0x47,0xC1,0x98,0x16,0xFE,0xEA,0xA9,0x74,0xFA,0xCE, + + 0x51,0x6C,0xCF,0x09,0xF0,0xFB,0x77,0xFE,0x1D,0x55,0xF3,0x29,0x8B,0x75,0x15,0x9B, + + 0x3B,0x11,0x97,0x99,0xB1,0x78,0x1E,0xC2,0x4E,0xD6,0x89,0x85,0x5A,0x7D,0x26,0x9E, + + 0xB6,0x13,0x9F,0x28,0x9F,0xCA,0xE8,0xF9,0x01,0x74,0x2E,0x04,0x32,0x31,0x10,0xAB, + + 0x40,0x73,0x76,0x42,0x21,0x52,0x9E,0x00,0xB6,0x46,0x5B,0x9A,0xF4,0xFB,0xF3,0x2B, + + 0x62,0x84,0x9A,0x4E,0x15,0x2C,0x1A,0x6B,0x2F,0xEA,0x40,0x0B,0x1B,0xD1,0x29,0x00, + + 0xA8,0xB4,0x5F,0xAF,0x50,0x9E,0x5A,0x7D,0xA3,0x7C,0xC5,0xBD,0xE1,0x32,0x78,0x06, + + 0x2C,0x09,0x58,0x41,0xE9,0x26,0xF0,0xDA,0x86,0x82,0xD8,0x44,0xEF,0xEE,0x50,0x20, + + 0xCD,0x8E,0xCA,0x14,0x16,0xF1,0x2C,0xE6,0xAC,0x60,0x78,0xCE,0xF6,0xE7,0x1F,0x32, + + 0x4C,0x8B,0x5E,0x79,0xF5,0xA6,0x6A,0xEC,0xC5,0x82,0x89,0xA5,0x11,0x56,0x38,0xE0, + + 0xBD,0x0E,0xF0,0x6B,0x30,0x5C,0x21,0xA3,0x48,0x6E,0x13,0xB4,0xD3,0x58,0x9F,0x85, + + 0x98,0x59,0xD8,0xB9,0xD7,0xC6,0xC7,0x02,0x40,0xFF,0x99,0x8D,0xA9,0xA6,0xD1,0x0C, + + 0xDA,0xF8,0xD0,0xC6,0x24,0x71,0x7E,0x86,0xC7,0x22,0xFF,0xCD,0x91,0x88,0x80,0x03, + + 0xC2,0x5A,0x25,0x97,0x9A,0xA5,0xCF,0x70,0x9D,0x6D,0xAE,0x59,0x2B,0xE9,0xC6,0x20, + + 0xB3,0x26,0x51,0xAD,0x87,0xEA,0x47,0xBF,0xE6,0xB7,0x69,0x31,0xD3,0xA7,0x5C,0x3E, + + 0xE5,0x49,0xF8,0xEB,0x64,0xB7,0x27,0xB9,0x6D,0x37,0xEC,0x6C,0xFD,0xD5,0xAA,0x3B, + + 0x6C,0xCB,0x6A,0x0F,0x5C,0x22,0xFA,0xC2,0xD9,0x8B,0x82,0x51,0xDC,0xE4,0x8F,0x98, + + 0xAD,0x82,0x1C,0xE9,0xAF,0xF0,0x0D,0x03,0x0E,0xCA,0x9B,0x4D,0x69,0xE6,0x74,0x73, + + 0x2C,0x82,0xCC,0x2E,0xF1,0xE9,0x60,0xF4,0xCC,0x8B,0x7B,0xC6,0x8C,0x1E,0x3C,0xB9, + + 0x65,0xB1,0x9D,0x09,0x2D,0xA7,0x0C,0x9E,0x71,0x33,0xB3,0x6E,0x7C,0xBC,0xEA,0xB3, + + 0x36,0x8B,0x16,0xD6,0xBA,0x3B,0xBA,0x93,0xA2,0x60,0x79,0x78,0x7B,0x40,0x75,0xBF, + + 0x65,0x45,0x5B,0xD4,0xA5,0x5A,0x49,0x90,0xB1,0x31,0xF5,0x29,0xCA,0xAC,0xC1,0x40, + + 0x89,0x2F,0xAE,0xB8,0x62,0x23,0x63,0xEB,0x30,0x62,0x7E,0x9F,0x97,0xAD,0xA4,0xA3, + + 0x63,0x3D,0xA2,0xAE,0x3C,0xF3,0x6D,0x21,0x83,0x25,0x1E,0xA9,0xD5,0x53,0x34,0x8A, + + 0x46,0xD3,0x3C,0x88,0x09,0x45,0xF7,0xCE,0x63,0x43,0xA9,0xAD,0x41,0xCD,0x3D,0x13, + + 0xCD,0x53,0xA3,0xB6,0xBC,0xC2,0x20,0x9D,0xD4,0x90,0x20,0x45,0xD0,0x06,0xED,0x6B, + + 0x67,0xD1,0xBE,0x50,0x5C,0x22,0x3B,0x5B,0x9C,0x9E,0x00,0xFC,0xF3,0x48,0x42,0x0E, + + 0x41,0x39,0xBD,0xAF,0x93,0x4B,0x14,0xB4,0xBE,0x96,0xE6,0x7C,0xD1,0xEF,0x24,0x96, + + 0x21,0x2E,0xA4,0x57,0x54,0xDE,0x5B,0x76,0x14,0xC9,0xA5,0xF6,0xD2,0x75,0xBF,0x04, + + 0x6C,0xEC,0xDB,0xF6,0x3B,0x40,0x2A,0xC4,0x64,0x1A,0xD1,0x17,0xFE,0xB9,0x7F,0x57, + + 0xD4,0xC3,0xFB,0xE6,0x04,0xFA,0xBD,0xE3,0xD8,0x5A,0x05,0x91,0x78,0x71,0x7D,0x45, + + 0x2D,0xD8,0xC4,0x8E,0xD5,0xC9,0xCD,0xA2,0xC9,0x27,0xA4,0xF5,0x81,0x44,0x6C,0xEB, + + 0x45,0x90,0xF0,0xB3,0x6D,0x12,0xF3,0xCB,0x7A,0xD2,0x41,0xC4,0x7B,0x62,0x33,0x5F, + + 0x45,0x40,0xC5,0x97,0xBD,0x7A,0xBC,0xCB,0xB3,0x77,0xCC,0xD4,0x94,0xF7,0x6D,0x67, + + 0xAD,0x36,0xBC,0x9F,0x3F,0x77,0xBE,0xFC,0x04,0x61,0xDF,0x99,0x10,0x99,0x9D,0xED, + + 0x8F,0x63,0xFE,0xDF,0xC2,0x1D,0xE1,0x02,0xB2,0x93,0xDF,0xAE,0x66,0x77,0x30,0xAB, + + 0x74,0x96,0xF8,0xDC,0xD6,0xBB,0x86,0x78,0xAA,0xFB,0xC4,0x16,0xF7,0xB2,0xA7,0x22, + + 0x97,0x33,0x27,0x2E,0x82,0x1E,0xCC,0x5B,0xE6,0xCC,0xDE,0x09,0x7E,0x7E,0xFA,0xA8, + + 0xFC,0x96,0x42,0xA2,0xDC,0x40,0xBF,0x03,0x32,0xC4,0xA6,0xE6,0x5A,0x78,0x80,0x15, + + 0xE1,0x1B,0xDE,0xE6,0x14,0xA5,0x05,0x1D,0xAB,0x04,0xA9,0x00,0xBB,0x04,0xF0,0xF8, + + 0x87,0xCC,0xEF,0x29,0xFA,0x65,0xBC,0x14,0xB6,0xBC,0x67,0x4E,0x27,0xBE,0x86,0xE7, + + 0xB3,0xB2,0x93,0xBC,0xB4,0xA9,0x2B,0x91,0x7C,0xED,0xA9,0xDD,0xD0,0x93,0xF6,0xD6, + + 0xB2,0x1A,0xB3,0xA5,0x00,0x8C,0x0F,0x53,0x3E,0x9E,0x09,0xB7,0x1C,0xDF,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xBA,0x97, + + 0x6B,0x0C,0x26,0x28,0xF3,0x4C,0xC6,0xD6,0x2B,0x4A,0xAA,0xB7,0xDA,0x84,0x10,0x1A, + + 0xC3,0x06,0xF5,0x63,0x71,0x24,0xEF,0x84,0xA2,0x2D,0xFA,0x6B,0x96,0x64,0x7D,0xEB, + + 0x9A,0x47,0xBB,0xF7,0x34,0x27,0x84,0xDA,0x4C,0xC1,0xB8,0x4F,0x0A,0x2B,0x43,0x99, + + 0xBA,0x4F,0x99,0x96,0x72,0x6F,0x23,0x1D,0x22,0x2F,0xFC,0xBF,0x14,0xA5,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x5D,0x80, + + 0x85,0xCF,0x14,0xFB,0x58,0x3D,0x6A,0xA6,0x81,0xD3,0x94,0xA4,0x70,0x70,0x6C,0xDA, + + 0xF9,0x1C,0xB6,0x24,0xFC,0x70,0xE1,0xFE,0x94,0x0D,0x9C,0xB4,0x71,0x71,0xE9,0x1E, + + 0xA1,0x80,0x97,0x53,0x5B,0x76,0x3C,0x52,0x6C,0x13,0x95,0xA5,0xF0,0x72,0x0F,0x6E, + + 0x54,0x7D,0x3E,0xB8,0x4D,0xA2,0x27,0x5A,0x52,0x5E,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xE1,0xC8, + + 0x22,0x1E,0x2B,0xF3,0xA5,0x64,0x6D,0x8F,0xC9,0xE7,0x96,0xAC,0x78,0x78,0x8B,0x38, + + 0x0D,0x79,0xF7,0xB8,0x52,0x36,0x26,0x47,0x4D,0x86,0x9E,0xBC,0x79,0x79,0x23,0xC4, + + 0x09,0x11,0x3C,0xC3,0x59,0x05,0xA3,0xCB,0x1F,0x3F,0x97,0xAD,0xF8,0x7A,0x5F,0xB8, + + 0xE1,0xE0,0x0F,0xAF,0xD9,0x88,0xAB,0xDB,0x66,0xED,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x98,0xFD, + + 0x37,0xFB,0x9A,0xB6,0x85,0xE1,0x08,0xD8,0xE8,0xCD,0x88,0xBC,0x70,0xA2,0x32,0x10, + + 0xCF,0x8E,0x9F,0x76,0x66,0xA1,0x2A,0xA1,0xAE,0x85,0x1D,0x54,0xA2,0x84,0x99,0x9C, + + 0x96,0xCF,0x16,0xF6,0xE3,0xA2,0x4E,0x5C,0xAC,0xCF,0xB7,0xBC,0x56,0x2E,0x21,0x06, + + 0x64,0x98,0x69,0x13,0x08,0x5E,0x03,0x83,0x54,0x6C,0x81,0x13,0xB6,0x7E,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0xEC, + + 0xF3,0x8C,0xB4,0xFA,0xE3,0x35,0x96,0x50,0xEF,0xAD,0xA5,0xDD,0xD8,0x65,0x72,0x36, + + 0x8F,0x65,0x92,0x2E,0xCC,0x06,0xE6,0x17,0xFE,0x84,0x2A,0x3E,0x5D,0xE9,0x30,0xE3, + + 0xD0,0xC7,0x70,0x2B,0x61,0x0B,0x0C,0xC9,0xE8,0x41,0xE1,0x79,0x37,0x8E,0x13,0x79, + + 0xCD,0x74,0x0B,0x6D,0xFF,0x47,0xC4,0xCB,0x7B,0x9A,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0xA4,0x06, + + 0x71,0xA7,0x34,0x77,0x97,0xF0,0x0F,0xD2,0xE4,0xCF,0xB4,0xA6,0x74,0xF0,0x29,0x82, + + 0xC4,0x8A,0xF6,0x6C,0x5D,0x80,0xAC,0xD0,0x92,0xB4,0xBC,0xB6,0x75,0xF1,0x75,0x9E, + + 0xE8,0x91,0x97,0xB7,0xEA,0xF3,0x8E,0xD3,0x64,0xC4,0xB5,0xA7,0xF4,0xF2,0x2D,0x75, + + 0x81,0x6E,0xD3,0x91,0xD6,0x44,0x05,0x5B,0xA9,0x92,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x78,0x68, + + 0x28,0x1D,0xF0,0xA6,0xD7,0xDC,0x4F,0xC5,0x10,0x27,0xB6,0xAE,0x7C,0xF8,0x10,0x78, + + 0x4F,0xEC,0x96,0x75,0x91,0xB4,0x69,0x41,0xDC,0x4A,0xBE,0xBE,0x7D,0xF9,0x35,0x2E, + + 0x47,0xDE,0x37,0xED,0x0F,0xDF,0x8E,0x17,0x1B,0xE7,0xB7,0xAF,0xFC,0xFA,0x51,0x9C, + + 0x89,0x10,0x56,0xB8,0x1C,0xC4,0x44,0xBF,0xA5,0x6D,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xEB,0x12,0x80,0x05, + + 0x76,0x8D,0xDE,0x85,0xB1,0x8B,0x52,0x92,0x14,0x40,0xCE,0xA1,0x58,0xCB,0xAC,0x72, + + 0x40,0x81,0x90,0xE5,0x5B,0x21,0x24,0xB2,0x41,0xA7,0xC6,0xB5,0xD3,0xCA,0x7F,0x19, + + 0x02,0x2A,0x41,0x05,0xFB,0xA0,0x19,0x24,0xC4,0x62,0x90,0x05,0x50,0x48,0x71,0xEC, + + 0xC1,0x41,0xD7,0x1D,0xB1,0x88,0x47,0xD3,0xCD,0xC6,0x59,0x35,0xBA,0xE1,0x7E,0x48, + + 0xC0,0x06,0x3F,0xBA,0x14,0xE4,0x46,0xF1,0xA9,0xE6,0xF9,0x23,0x7C,0xE8,0xFB,0xC0, + + 0x05,0xA5,0x08,0x40,0x82,0xA8,0x1A,0x03,0x5F,0x4C,0xF1,0x73,0x52,0xE5,0x49,0xC5, + + 0x7E,0xA4,0xD4,0xC1,0xD6,0xBB,0xEA,0xD0,0x80,0xE9,0x9B,0x78,0x93,0x67,0x05,0x23, + + 0xEB,0xA5,0x36,0xD1,0xD7,0xD2,0x2F,0xF3,0xCA,0x3A,0xA3,0xA1,0x53,0x47,0x80,0x6A, + + 0x73,0xDA,0x87,0x0C,0x9A,0x20,0x3C,0x2F,0x20,0x47,0x82,0xDD,0x12,0x68,0x7A,0x5E, + + 0xF5,0x4B,0xEA,0x5C,0x0C,0x26,0x1A,0x7B,0x4D,0x49,0x9B,0x1C,0xD9,0xA8,0xDC,0x08, + + 0x8E,0x8A,0x0E,0xFD,0x90,0x25,0x3D,0x2E,0xE7,0x0A,0xCD,0xA8,0xD0,0xC1,0x89,0x63, + + 0x0B,0x23,0x0B,0x1C,0x30,0x80,0xF1,0x3D,0xC9,0xE4,0xC5,0xBC,0x5B,0xC0,0xBD,0x3B, + + 0x48,0x8F,0x02,0x5D,0x8D,0x6E,0x08,0x75,0xE9,0x4A,0x58,0x9A,0x85,0xE1,0x74,0x54, + + 0x6A,0xED,0xB5,0xA6,0xE4,0xF2,0xDA,0x9A,0xEA,0xB2,0xD8,0x74,0x59,0x6C,0x03,0xB7, + + 0x0A,0x5E,0x41,0xF7,0x7B,0x51,0x5F,0x07,0x6B,0xC6,0xF3,0x60,0xD2,0x2E,0x53,0x4C, + + 0x77,0xAD,0x0B,0x4D,0xB1,0xA2,0x11,0x78,0x28,0xC5,0xD3,0x7F,0x59,0x8F,0xBF,0xE2, + + 0x61,0x50,0x03,0x75,0x3A,0x36,0xBA,0x51,0x6A,0x5C,0x95,0x84,0x1B,0x40,0x74,0xE3, + + 0x71,0x18,0xCE,0x1E,0x5A,0x93,0x62,0x20,0x8A,0xF3,0xD8,0x36,0x1A,0x33,0x7D,0xE3, + + 0xE3,0xCD,0xDB,0x01,0xB0,0x99,0x4B,0x25,0xE0,0xDF,0x95,0xA7,0xB2,0xD9,0x4C,0x6C, + + 0xC7,0x51,0x8D,0x64,0xA1,0x23,0x43,0xB9,0xC1,0xFC,0x9D,0x44,0xB3,0x7D,0x3A,0xCD, + + 0xAD,0xB9,0x04,0xD0,0xC3,0x2F,0x6C,0xB0,0x66,0x5B,0xEE,0x63,0xDE,0x2B,0x4D,0x42, + + 0x23,0x1D,0xB3,0x56,0xB3,0x35,0x26,0x20,0x6B,0x8A,0xE6,0x73,0xDF,0x69,0x40,0x53, + + 0x22,0xBB,0x3A,0xB7,0x55,0x28,0x6D,0x1E,0xA1,0x76,0xEF,0x62,0x5E,0x69,0x09,0x20, + + 0xB7,0x13,0x12,0xD5,0xC4,0x3D,0xE2,0x21,0x14,0x8F,0xF3,0xF3,0x62,0x2B,0x84,0x62, + + 0x57,0x10,0xD8,0x85,0x38,0x78,0x13,0x2A,0x69,0x20,0xC8,0x3D,0x78,0xF5,0x70,0x1A, + + 0x28,0xFE,0xEE,0x6D,0x3F,0x39,0x26,0x49,0x6F,0x59,0xDE,0x4F,0x61,0x7F,0xDC,0x8D, + + 0xAE,0xBA,0x83,0xEE,0xD3,0x18,0x37,0x3D,0x83,0x78,0xE9,0x28,0x93,0x6A,0x55,0x98, + + 0x0A,0xB4,0xD1,0x0D,0x19,0x90,0x41,0x29,0xC9,0xF0,0x97,0xF0,0x9A,0x1B,0x1C,0xCA, + + 0x42,0x2C,0xFC,0x2E,0x96,0xC2,0x2E,0x19,0x3A,0x7C,0xF8,0xEB,0xEF,0x73,0x18,0xD0, + + 0xC0,0x0D,0xFE,0x62,0x50,0x09,0x26,0x8B,0x3B,0x56,0xF7,0xB2,0xB2,0x19,0x39,0xC0, + + 0xC9,0xE1,0xBC,0x13,0x0D,0x95,0x37,0x29,0x24,0xD3,0x63,0xA7,0x33,0x3A,0x6F,0xCD, + + 0x63,0x2F,0xCF,0x2C,0x33,0xC0,0x24,0x99,0xBC,0x54,0x76,0x22,0x42,0xA1,0x9D,0xF2, + + 0x58,0x8F,0xE4,0x84,0x7F,0xE2,0xB0,0x23,0x44,0x80,0x70,0x26,0x3F,0x62,0x22,0x16, + + 0xA6,0x8C,0xF6,0x87,0x15,0x0A,0x68,0x36,0x4D,0xE9,0xE6,0xB3,0x5D,0x4A,0x41,0x42, + + 0x31,0x8F,0xA1,0xF6,0xD6,0xA6,0x35,0xBE,0xC0,0xE2,0xB9,0xD6,0x9E,0xE2,0xD6,0xC3, + + 0x8D,0x0C,0xA8,0x97,0x15,0xA2,0xB9,0x32,0x82,0x83,0xB8,0x17,0x55,0xA1,0xD3,0xD2, + + 0x00,0x24,0x1D,0xBD,0xE5,0x5B,0x74,0x9C,0xBB,0x4E,0xF2,0x14,0x21,0xC4,0x32,0x4F, + + 0xA4,0x83,0xD2,0xB9,0xEC,0x3A,0xF0,0x4E,0xA6,0xCA,0x07,0xA6,0x29,0xE6,0x2D,0xC1, + + 0x8F,0xFB,0x1A,0xC3,0x9A,0xCB,0x8A,0x3F,0x65,0xC0,0x15,0x07,0x24,0x83,0x65,0x3D, + + 0x26,0x0F,0x16,0xA9,0x91,0x27,0x19,0x33,0xDA,0x4C,0xC7,0x7E,0x94,0x15,0x68,0x0B, + + 0xFB,0x75,0xFC,0x8F,0x9E,0x03,0x36,0x5A,0x48,0xE8,0xEC,0xAF,0xDE,0x43,0x4A,0x5B, + + 0xF0,0x02,0xCA,0xEF,0x57,0xA9,0xBA,0x3B,0x9F,0x89,0xA2,0xCF,0x17,0xE9,0x69,0xF5, + + 0xD9,0x85,0x63,0x0F,0xF7,0x28,0x6D,0x2F,0xC4,0xDE,0x73,0x2F,0xB7,0x68,0xAC,0xF9, + + 0x0F,0xA3,0xF5,0x17,0x8D,0xAF,0x3F,0x99,0xC9,0xEB,0xE5,0xBA,0xD5,0x40,0xE2,0xA8, + + 0xAF,0x73,0x3A,0x3C,0xE1,0x73,0xF6,0x88,0xCC,0xC4,0x09,0x1C,0xD0,0x89,0x6E,0xA4, + + 0xF2,0x07,0x68,0xDE,0x19,0x6D,0x76,0x05,0x2C,0x3D,0xB0,0x3C,0x37,0xE0,0x29,0x4A, + + 0x6D,0x04,0x23,0x5E,0x95,0xEC,0xFA,0x19,0x6D,0xC8,0xEB,0x6E,0x8A,0x12,0x90,0x07, + + 0x2C,0x02,0x63,0x7B,0x1A,0x5A,0x03,0xF9,0xC6,0x12,0xE3,0x55,0xDE,0xF8,0x55,0x44, + + 0xD4,0xDE,0xE2,0x86,0xB4,0xD3,0x72,0xA2,0x0F,0xC0,0xCC,0x24,0x7D,0x8D,0x76,0x93, + + 0x86,0x97,0x6C,0x96,0x5E,0x33,0x5C,0xF2,0x78,0x5C,0xB0,0xD8,0xD4,0x79,0x92,0x01, + + 0xA1,0x63,0xFB,0x06,0x36,0x19,0x25,0x52,0xFC,0xD2,0xEF,0xBA,0x57,0xF4,0xA5,0xAF, + + 0x06,0x95,0x85,0x66,0xFF,0xB3,0x45,0x31,0xE4,0x8B,0x3D,0x55,0x54,0x0C,0xE5,0x33, + + 0x3A,0xB4,0x64,0xC3,0xE0,0xF4,0x3F,0x0D,0x9D,0x2B,0x4A,0xE4,0x80,0x20,0x5F,0x42, + + 0xDB,0xD7,0x58,0x3C,0xD6,0xD3,0xBC,0xE6,0x44,0x97,0x7B,0xED,0x75,0xBB,0xD0,0xCF, + + 0x5E,0x34,0xE5,0xC2,0x57,0xD0,0x8E,0x67,0xA2,0x58,0xF2,0xF8,0xA2,0x62,0xDE,0x52, + + 0xA1,0x17,0x59,0x97,0xBB,0x78,0x7B,0x0A,0x98,0x87,0x8B,0xB1,0x51,0xBB,0x6E,0x1D, + + 0x8D,0x91,0xF8,0x86,0x3E,0xBC,0x34,0x48,0x68,0xF8,0xFC,0xAF,0x9F,0x72,0x16,0x69, + + 0x39,0x14,0xF0,0x1A,0x3D,0x34,0x60,0x3E,0x6D,0x72,0x45,0xE2,0xDE,0x97,0xDE,0x09, + + 0xAF,0x7C,0xA8,0x7E,0xB6,0xBC,0x0B,0x5A,0xE6,0xD6,0xB3,0x51,0x01,0x70,0x51,0x1E, + + 0x44,0xCB,0xD1,0x0F,0x56,0x19,0x7D,0xFB,0x6D,0xEB,0x81,0xB6,0x3F,0xFB,0xBE,0xF5, + + 0x3A,0x47,0xC6,0xCF,0x99,0xAC,0xB6,0xFE,0x79,0x9E,0x82,0x13,0x40,0xBE,0x10,0x5E, + + 0xDA,0x3E,0xD4,0x59,0x93,0xA2,0x7E,0x7E,0x2B,0x79,0x3E,0xEA,0x83,0x08,0x67,0xB4, + + 0xC6,0xDC,0x08,0x3D,0x3E,0x8F,0xF5,0x65,0xE8,0xDE,0x75,0xD0,0x02,0x9C,0x2B,0x28, + + 0xA5,0x62,0xA5,0xCA,0xDF,0x2F,0xBF,0xEA,0x3D,0x52,0xF8,0x7B,0xBB,0x0A,0xB7,0x1C, + + 0x06,0xC0,0x24,0x66,0x33,0x40,0x63,0x66,0xEA,0xBB,0x94,0x63,0xD2,0x68,0x78,0x56, + + 0xA3,0xFF,0x68,0x1C,0x33,0x31,0xAF,0xB5,0x47,0x81,0xBE,0xEF,0x05,0xC5,0xB6,0xFC, + + 0x90,0x4C,0x6D,0x07,0x98,0x4E,0x91,0xA5,0x84,0xB7,0xA0,0x47,0x3B,0xD2,0xF0,0x57, + + 0x6B,0xA7,0x8C,0x06,0xDF,0x67,0xAE,0x0E,0x9D,0x01,0x72,0x28,0x19,0x9D,0x38,0x22, + + 0x41,0xF4,0x2F,0x36,0xB1,0x65,0xE3,0x79,0xBE,0x94,0xD0,0x64,0x52,0x64,0x40,0xE2, + + 0xF6,0x0A,0xB0,0x73,0x37,0x25,0x5C,0x37,0xC1,0x4D,0xD8,0x74,0x53,0x65,0x4B,0x01, + + 0x21,0x00,0xC5,0x65,0x92,0x26,0xC1,0xA6,0xC0,0xB3,0xD1,0x65,0xD2,0x66,0xFD,0x2E, + + 0x20,0x46,0xC9,0x55,0x93,0x27,0xEB,0x13,0x28,0xF7,0xD9,0x75,0xD3,0x67,0x42,0x0E, + + 0xC0,0xF8,0xA4,0x98,0x94,0xA3,0x90,0x17,0xB4,0x4A,0xD2,0xAA,0xA4,0x9D,0x08,0xDE, + + 0xAB,0x4C,0x71,0x3A,0x09,0xA4,0x99,0x3E,0x81,0xF9,0x19,0x06,0x01,0x28,0xA7,0xF5, + + 0x08,0xF1,0x87,0xEF,0x9E,0xEA,0xD3,0x3D,0x34,0xEE,0xD3,0x13,0x84,0xDF,0x79,0xBC, + + 0x2D,0xEC,0x5F,0xE2,0x1A,0x25,0xBF,0x5B,0x65,0xB4,0x77,0xBD,0x25,0x4B,0xAA,0xFB, + + 0x8F,0x4B,0xC2,0x4C,0x1A,0x2C,0x74,0xB7,0x1E,0x0A,0xD2,0x6C,0x5A,0x6C,0x3E,0xA5, + + 0x2A,0x4F,0xCA,0x5C,0x1B,0x2D,0xD9,0x5C,0xC4,0x4F,0xDA,0x7C,0x5B,0x6D,0x83,0x5D, + + 0x78,0x42,0xC3,0x4D,0x9A,0x2E,0xE4,0x57,0x92,0xBB,0xD3,0x6D,0xDA,0x6E,0xC9,0x66, + + 0x0E,0x08,0xCB,0x5D,0x9B,0x2F,0xEC,0x78,0x46,0x49,0xDB,0x7D,0xDB,0x6F,0x80,0x04, + + 0x64,0xE5,0x0C,0x86,0xC5,0x3F,0x74,0xE4,0x6F,0x5D,0xBC,0x66,0xF2,0x78,0xBB,0xAF, + + 0x79,0x53,0x48,0x11,0x72,0xC2,0x94,0xC8,0x80,0x5E,0xFC,0xF4,0x8A,0x7C,0x3F,0x7E, + + 0xA6,0xD2,0x31,0xFA,0x13,0x8F,0x5F,0x7E,0x43,0x54,0x7A,0x55,0xA8,0x7D,0x8F,0xAE, + + 0x5D,0xC3,0xED,0xD1,0x8C,0x3C,0x7D,0xF5,0xD8,0x5C,0xEF,0xAC,0xB1,0x88,0x3C,0xE4, + + 0xA7,0x33,0xC4,0xC4,0x32,0x34,0x94,0xF4,0x9E,0x18,0xD4,0xE4,0x72,0x74,0xFB,0x2D, + + 0x33,0x5B,0xCC,0xD4,0x33,0x35,0xF4,0x53,0x1C,0xD5,0xDC,0xF4,0x73,0x75,0x9A,0xD0, + + 0xA4,0xD6,0xC5,0xC5,0xB2,0x36,0x25,0x27,0x48,0x17,0xD5,0xE5,0xF2,0x76,0x3D,0xF7, + + 0x41,0x74,0xCD,0xD5,0xB3,0x37,0x9D,0xE5,0x1F,0x1B,0xDD,0xF5,0xF3,0x77,0xC6,0x9C, + + 0xD4,0xBC,0x16,0x92,0x60,0xCC,0xA2,0x4A,0xEA,0x10,0x92,0xAE,0x7C,0x83,0xAA,0x65, + + 0xA9,0xC2,0x7E,0x18,0x7D,0xAE,0x66,0xDA,0x2A,0xE6,0x29,0x98,0xFC,0x5E,0x47,0x8F, + + 0x60,0xEA,0x04,0x4B,0x52,0x76,0xDB,0xCB,0xAB,0x85,0x97,0x6F,0x7B,0x3C,0x0E,0x5F, + + 0x0B,0x5E,0x27,0x3E,0xC6,0x3A,0x67,0xE6,0x1C,0xA7,0x40,0xAC,0xFF,0xBB,0xEE,0x6A, + + 0xF5,0xF3,0xC6,0xCC,0x3A,0x3C,0x26,0x2E,0xC0,0x1D,0xD6,0xEC,0x7A,0x7C,0xB1,0xFC, + + 0xA9,0x15,0xCE,0xDC,0x3B,0x3D,0xF2,0xBA,0xE8,0x53,0xDE,0xFC,0x7B,0x7D,0xEF,0x6B, + + 0x2D,0x39,0xC7,0xCD,0xBA,0x3E,0xBB,0x69,0x16,0x7E,0xD7,0xED,0xFA,0x7E,0xF9,0xBB, + + 0x5C,0x19,0xCF,0xDD,0xBB,0x3F,0x37,0x7F,0x17,0x1E,0xDF,0xFD,0xFB,0x7F,0xF4,0x44, + + 0xA6,0x7E,0x40,0x39,0x30,0x1C,0xF0,0x36,0xB8,0xBE,0x1C,0xA4,0x55,0x65,0xC3,0x69, + + 0x9A,0xBC,0x2C,0xE7,0xB6,0xA3,0x4C,0xB6,0x0D,0x9F,0xD7,0x2A,0x9D,0x3F,0x5B,0x87, + + 0xC8,0x92,0x1E,0x5C,0x6D,0x28,0x48,0x65,0x66,0x8C,0x89,0xD4,0x8C,0x46,0x81,0xB1, + + 0x02,0xA4,0x9B,0xE8,0x17,0xEB,0xF9,0x27,0x54,0x82,0x3E,0x24,0x0A,0xE1,0x88,0xE1, + + 0x00,0x24,0xE0,0x46,0x16,0xA4,0x78,0x50,0xE7,0x6B,0xF0,0x66,0x56,0xE4,0xF8,0xD0, + + 0x06,0xF2,0xE8,0x56,0x17,0xA5,0x98,0x4D,0xB3,0x75,0xF8,0x76,0x57,0xE5,0x88,0xC7, + + 0xC2,0x9A,0xE1,0x47,0x96,0xA6,0x76,0x70,0x1D,0x16,0xF1,0x67,0xD6,0xE6,0x53,0xB1, + + 0x05,0x8F,0xE9,0x57,0x97,0xA7,0xCE,0x6F,0xE3,0x3A,0xF9,0x77,0xD7,0xE7,0xB2,0x14, + + 0x54,0x7C,0x82,0x6C,0xAB,0xCD,0x99,0x51,0x99,0x35,0x52,0x11,0xA0,0xEA,0x6A,0xDC, + + 0xE7,0xC5,0x13,0x4F,0xBE,0x76,0x62,0x07,0xCF,0xC1,0x89,0x27,0x79,0x87,0xA0,0x11, + + 0xD0,0x3E,0x9B,0xDF,0x41,0xD5,0x71,0x4B,0xD4,0x4A,0x00,0x32,0x24,0x3A,0xDB,0x5D, + + 0x27,0x70,0x16,0x42,0x62,0xAD,0xEF,0x49,0x6E,0x8A,0xFB,0x00,0xD5,0x87,0x93,0x28, + + 0x4D,0x53,0xE2,0x4E,0x1E,0xAC,0xAD,0x62,0x60,0x8A,0xF2,0x6E,0x5E,0xEC,0x12,0xD8, + + 0x0E,0x9A,0xEA,0x5E,0x1F,0xAD,0x0A,0xA5,0xA0,0x8C,0xFA,0x7E,0x5F,0xED,0x1B,0x29, + + 0xCD,0x7E,0xE3,0x4F,0x9E,0xAE,0x81,0xAD,0x6C,0x82,0xF3,0x6F,0xDE,0xEE,0xD0,0xB9, + + 0x23,0x72,0xEB,0x5F,0x9F,0xAF,0xD3,0xD8,0xB0,0x0F,0xFB,0x7F,0xDF,0xEF,0x56,0x27, + + 0xA1,0x97,0x64,0x92,0xC8,0x45,0xF4,0xB3,0x48,0xD6,0x03,0x5B,0x38,0xBE,0x2D,0x4D, + + 0x86,0xEF,0x1B,0x8F,0x33,0x71,0x44,0x96,0xEA,0xD3,0x45,0x70,0xD7,0xB4,0xCE,0x74, + + 0xA2,0x72,0x61,0x03,0xF0,0x47,0x3D,0x06,0x87,0xF2,0xC5,0xE1,0x56,0x0C,0x16,0xD5, + + 0x07,0xDD,0x1A,0xA8,0xE1,0xF1,0x8A,0xB2,0x68,0xDF,0xCF,0x31,0xED,0xBF,0x6C,0xF5, + + 0x87,0xF8,0xE4,0xC6,0x36,0xB4,0x14,0xA2,0x6A,0x29,0xF4,0xE6,0x76,0xF4,0xE8,0x15, + + 0xA7,0xB5,0xEC,0xD6,0x37,0xB5,0x26,0xF3,0xC4,0x94,0xFC,0xF6,0x77,0xF5,0x86,0x84, + + 0x78,0x9E,0xE5,0xC7,0xB6,0xB6,0x0D,0x61,0xE7,0x96,0xF5,0xE7,0xF6,0xF6,0xC1,0x13, + + 0x04,0xD6,0xED,0xD7,0xB7,0xB7,0x1D,0xB3,0xFA,0x5C,0xFD,0xF7,0xF7,0xF7,0x52,0xAE, + + 0xF8,0x28,0x24,0xB1,0xB9,0xBF,0x5E,0xB4,0x2A,0x2C,0xC6,0x8E,0x64,0x35,0x09,0x1A, + + 0xAA,0x3E,0x47,0x1A,0x79,0xA5,0x81,0xDA,0xDA,0x7D,0x84,0x5C,0xFF,0xF1,0x80,0x97, + + 0x7C,0x6A,0x4F,0x2C,0xBA,0x1A,0xF1,0x2F,0xA4,0xAD,0x27,0x2D,0xFD,0x1D,0x87,0x3D, + + 0xAB,0x5B,0x3F,0x58,0xBF,0x4E,0xF9,0xBD,0x25,0x19,0x4D,0xDD,0xBE,0x24,0x8A,0x4A, + + 0xD2,0xBC,0xE6,0xCE,0x3E,0xBC,0xF2,0x08,0xEC,0xD4,0xF6,0xEE,0x7E,0xFC,0x56,0x29, + + 0x77,0x39,0xEE,0xDE,0x3F,0xBD,0x1E,0xBA,0xC2,0x20,0xFE,0xFE,0x7F,0xFD,0xCB,0x49, + + 0xAF,0xCB,0xE7,0xCF,0xBE,0xBE,0xFE,0x99,0x4D,0x9F,0xF7,0xEF,0xFE,0xFE,0x80,0xC7, + + 0x29,0x6A,0xEF,0xDF,0xBF,0xBF,0x07,0xDF,0x6D,0xD7,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x90,0xAF, diff --git a/drivers/input/touchscreen/GT917D/Kconfig b/drivers/input/touchscreen/GT917D/Kconfig new file mode 100644 index 0000000000000..f714e46bbea07 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/Kconfig @@ -0,0 +1,5 @@ + +config TOUCHSCREEN_GT917D + tristate "ATMEL GT917D touchpanel driver" + depends on CONFIG_INPUT_TOUCHSCREEN + default n diff --git a/drivers/input/touchscreen/GT917D/Makefile b/drivers/input/touchscreen/GT917D/Makefile new file mode 100644 index 0000000000000..c050268fc9335 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/Makefile @@ -0,0 +1,4 @@ +#GT915L touchpanel driver + +obj-y += gt917.o goodix_tool.o gt9xx_update.o + diff --git a/drivers/input/touchscreen/GT917D/goodix_tool.c b/drivers/input/touchscreen/GT917D/goodix_tool.c new file mode 100644 index 0000000000000..d09b181020043 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/goodix_tool.c @@ -0,0 +1,707 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + + +#include "gt9xx.h" + +#define DATA_LENGTH_UINT 512 +#define CMD_HEAD_LENGTH (sizeof(st_cmd_head) - sizeof(u8*)) +static char procname[20] = {0}; + +#define UPDATE_FUNCTIONS + +#ifdef UPDATE_FUNCTIONS +extern s32 gup_enter_update_mode(struct i2c_client *client); +extern void gup_leave_update_mode(void); +extern s32 gup_update_proc(void *dir); +#endif + +extern void gtp_irq_disable(struct goodix_ts_data *); +extern void gtp_irq_enable(struct goodix_ts_data *); + +#pragma pack(1) +typedef struct{ + u8 wr; + u8 flag; + u8 flag_addr[2]; + u8 flag_val; + u8 flag_relation; + u16 circle; + u8 times; + u8 retry; + u16 delay; + u16 data_len; + u8 addr_len; + u8 addr[2]; + u8 res[3]; + u8* data; +}st_cmd_head; +#pragma pack() +st_cmd_head cmd_head; + +static struct i2c_client *gt_client = NULL; + +static struct proc_dir_entry *goodix_proc_entry; + + +static ssize_t goodix_tool_read(struct file *, char __user *, size_t, loff_t *); +static ssize_t goodix_tool_write(struct file *, const char __user *, size_t, loff_t *); +static const struct file_operations tool_ops = { + .owner = THIS_MODULE, + .read = goodix_tool_read, + .write = goodix_tool_write, +}; + +static struct class *ft_class; +#define CLASS_NAME "touchscreen" +static ssize_t goodix_sys_tool_write(struct class *class, struct class_attribute *attr,const char *buf, size_t len); +static ssize_t goodix_sys_tool_read(struct class *class, struct class_attribute *attr, char *buf); + +static CLASS_ATTR(gmnode, 0664,goodix_sys_tool_read, goodix_sys_tool_write); + + +static s32 (*tool_i2c_read)(u8 *, u16); +static s32 (*tool_i2c_write)(u8 *, u16); + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *, s32); +#endif +s32 DATA_LENGTH = 0; +s8 IC_TYPE[16] = "GT9XX"; + +static void tool_set_proc_name(char * procname) +{ + char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", + "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + char date[20] = {0}; + char month[4] = {0}; + int i = 0, n_month = 1, n_day = 0, n_year = 0; + + + GTP_DEBUG("compile date: %s", date); + + sscanf(date, "%s %d %d", month, &n_day, &n_year); + + for (i = 0; i < 12; ++i) { + if (!memcmp(months[i], month, 3)) { + n_month = i+1; + break; + } + } + + sprintf(procname, "gmnode%04d%02d%02d", n_year, n_month, n_day); +} + + +static s32 tool_i2c_read_no_extra(u8* buf, u16 len) +{ + s32 ret = -1; + s32 i = 0; + struct i2c_msg msgs[2]; + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = gt_client->addr; + msgs[0].len = cmd_head.addr_len; + msgs[0].buf = &buf[0]; + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = gt_client->addr; + msgs[1].len = len; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + for (i = 0; i < cmd_head.retry; i++) { + ret=i2c_transfer(gt_client->adapter, msgs, 2); + if (ret > 0) { + break; + } + } + return ret; +} + +static s32 tool_i2c_write_no_extra(u8* buf, u16 len) +{ + s32 ret = -1; + s32 i = 0; + struct i2c_msg msg; + + msg.flags = !I2C_M_RD; + msg.addr = gt_client->addr; + msg.len = len; + msg.buf = buf; + + for (i = 0; i < cmd_head.retry; i++) { + ret=i2c_transfer(gt_client->adapter, &msg, 1); + if (ret > 0) { + break; + } + } + return ret; +} + +static s32 tool_i2c_read_with_extra(u8* buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_read_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static s32 tool_i2c_write_with_extra(u8* buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_write_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static void register_i2c_func(void) +{ + if (strncmp(IC_TYPE, "GT8110", 6) && strncmp(IC_TYPE, "GT8105", 6) + && strncmp(IC_TYPE, "GT801", 5) && strncmp(IC_TYPE, "GT800", 5) + && strncmp(IC_TYPE, "GT801PLUS", 9) && strncmp(IC_TYPE, "GT811", 5) + && strncmp(IC_TYPE, "GTxxx", 5) && strncmp(IC_TYPE, "GT9XX", 5)) { + tool_i2c_read = tool_i2c_read_with_extra; + tool_i2c_write = tool_i2c_write_with_extra; + GTP_DEBUG("I2C function: with pre and end cmd!"); + } else { + tool_i2c_read = tool_i2c_read_no_extra; + tool_i2c_write = tool_i2c_write_no_extra; + GTP_INFO("I2C function: without pre and end cmd!"); + } +} + +static void unregister_i2c_func(void) +{ + tool_i2c_read = NULL; + tool_i2c_write = NULL; + GTP_INFO("I2C function: unregister i2c transfer function!"); +} + +s32 init_wr_node(struct i2c_client *client) +{ + s32 i; + s32 err; + + gt_client = client; + memset(&cmd_head, 0, sizeof(cmd_head)); + cmd_head.data = NULL; + + i = 5; + while ((!cmd_head.data) && i) { + cmd_head.data = kzalloc(i * DATA_LENGTH_UINT, GFP_KERNEL); + if (NULL != cmd_head.data) { + break; + } + i--; + } + if (i) { + DATA_LENGTH = i * DATA_LENGTH_UINT + GTP_ADDR_LENGTH; + GTP_INFO("Applied memory size:%d.", DATA_LENGTH); + } else { + GTP_ERROR("Apply for memory failed."); + return FAIL; + } + + cmd_head.addr_len = 2; + cmd_head.retry = 5; + + register_i2c_func(); + + tool_set_proc_name(procname); + goodix_proc_entry = proc_create(procname, 0666, NULL, &tool_ops); + if (goodix_proc_entry == NULL) { + GTP_ERROR("Couldn't create proc entry!"); + return FAIL; + } else { + GTP_INFO("Create proc entry success!"); + } + + ft_class = class_create(THIS_MODULE, CLASS_NAME); + if (IS_ERR(ft_class)) { + GTP_ERROR("Failed to create class.\n"); + return FAIL; + } + err = class_create_file(ft_class, &class_attr_gmnode); + if (err) { + GTP_ERROR("Failed to create class file.\n"); + } + return SUCCESS; +} + +void uninit_wr_node(void) +{ + kfree(cmd_head.data); + cmd_head.data = NULL; + unregister_i2c_func(); + remove_proc_entry(procname, NULL); +} + +static u8 relation(u8 src, u8 dst, u8 rlt) +{ + u8 ret = 0; + + switch (rlt) { + case 0: + ret = (src != dst) ? true : false; + break; + + case 1: + ret = (src == dst) ? true : false; + GTP_DEBUG("equal:src:0x%02x dst:0x%02x ret:%d.", src, dst, (s32)ret); + break; + + case 2: + ret = (src > dst) ? true : false; + break; + + case 3: + ret = (src < dst) ? true : false; + break; + + case 4: + ret = (src & dst) ? true : false; + break; + + case 5: + ret = (!(src | dst)) ? true : false; + break; + + default: + ret = false; + break; + } + + return ret; +} + +/******************************************************* +Function: + Comfirm function. +Input: + None. +Output: + Return write length. +********************************************************/ +static u8 comfirm(void) +{ + s32 i = 0; + u8 buf[32]; + + memcpy(buf, cmd_head.flag_addr, cmd_head.addr_len); + + for (i = 0; i < cmd_head.times; i++) { + if (tool_i2c_read(buf, 1) <= 0) { + GTP_ERROR("Read flag data failed!"); + return FAIL; + } + if (true == relation(buf[GTP_ADDR_LENGTH], cmd_head.flag_val, cmd_head.flag_relation)) { + GTP_DEBUG("value at flag addr:0x%02x.", buf[GTP_ADDR_LENGTH]); + GTP_DEBUG("flag value:0x%02x.", cmd_head.flag_val); + break; + } + + msleep(cmd_head.circle); + } + + if (i >= cmd_head.times) { + GTP_ERROR("Didn't get the flag to continue!"); + return FAIL; + } + + return SUCCESS; +} + +static ssize_t goodix_sys_tool_write(struct class *class, struct class_attribute *attr,const char *buf, size_t len) +{ + + GTP_DEBUG_FUNC(); + GTP_DEBUG_ARRAY((u8*)buf, len); + + memcpy(&cmd_head, buf, CMD_HEAD_LENGTH); + + GTP_DEBUG("[Operation]wr: %02X", cmd_head.wr); + GTP_DEBUG("[Flag]flag: %02X, addr: %02X%02X, value: %02X, relation: %02X", cmd_head.flag, cmd_head.flag_addr[0], + cmd_head.flag_addr[1], cmd_head.flag_val, cmd_head.flag_relation); + GTP_DEBUG("[Retry]circle: %d, times: %d, retry: %d, delay: %d", (s32)cmd_head.circle, (s32)cmd_head.times, + (s32)cmd_head.retry, (s32)cmd_head.delay); + GTP_DEBUG("[Data]data len: %d, addr len: %d, addr: %02X%02X, buffer len: %d, data[0]: %02X", (s32)cmd_head.data_len, + (s32)cmd_head.addr_len, cmd_head.addr[0], cmd_head.addr[1], (s32)len, buf[CMD_HEAD_LENGTH]); + + if (1 == cmd_head.wr) { + memcpy(&cmd_head.data[GTP_ADDR_LENGTH], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG_ARRAY(cmd_head.data, cmd_head.data_len + cmd_head.addr_len); + GTP_DEBUG_ARRAY((u8*)&buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[WRITE]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + } + if (tool_i2c_write(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + cmd_head.data_len + cmd_head.addr_len) <= 0) { + GTP_ERROR("[WRITE]Write data failed!"); + return -EPERM; + } + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len],cmd_head.data_len + cmd_head.addr_len); + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + } else if (3 == cmd_head.wr) { + memcpy(&cmd_head.data[0], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + + register_i2c_func(); + } else if (5 == cmd_head.wr) { + } else if (7 == cmd_head.wr) { + gtp_irq_disable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_OFF); + #endif + } else if (9 == cmd_head.wr) { + gtp_irq_enable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_ON); + #endif + } else if (17 == cmd_head.wr) { + struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); + memcpy(&cmd_head.data[GTP_ADDR_LENGTH], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (cmd_head.data[GTP_ADDR_LENGTH]) { + GTP_INFO("gtp enter rawdiff."); + ts->gtp_rawdiff_mode = true; + } else { + ts->gtp_rawdiff_mode = false; + GTP_INFO("gtp leave rawdiff."); + } + } +#ifdef UPDATE_FUNCTIONS + else if (11 == cmd_head.wr) { + if (FAIL == gup_enter_update_mode(gt_client)) { + return -EPERM; + } + } else if (13 == cmd_head.wr) { + gup_leave_update_mode(); + } else if (15 == cmd_head.wr) { + show_len = 0; + total_len = 0; + memset(cmd_head.data, 0, cmd_head.data_len + 1); + memcpy(cmd_head.data, &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (FAIL == gup_update_proc((void*)cmd_head.data)) { + return -EPERM; + } + } + +#endif + + return len; +} +/******************************************************* +Function: + Goodix tool write function. +Input: + standard proc write function param. +Output: + Return write length. +********************************************************/ +ssize_t goodix_tool_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + GTP_DEBUG_ARRAY((u8*)buff, len); + + ret = copy_from_user(&cmd_head, buff, CMD_HEAD_LENGTH); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + + + GTP_DEBUG("[Operation]wr: %02X", cmd_head.wr); + GTP_DEBUG("[Flag]flag: %02X, addr: %02X%02X, value: %02X, relation: %02X", cmd_head.flag, cmd_head.flag_addr[0], + cmd_head.flag_addr[1], cmd_head.flag_val, cmd_head.flag_relation); + GTP_DEBUG("[Retry]circle: %d, times: %d, retry: %d, delay: %d", (s32)cmd_head.circle, (s32)cmd_head.times, + (s32)cmd_head.retry, (s32)cmd_head.delay); + GTP_DEBUG("[Data]data len: %d, addr len: %d, addr: %02X%02X, buffer len: %d, data[0]: %02X", (s32)cmd_head.data_len, + (s32)cmd_head.addr_len, cmd_head.addr[0], cmd_head.addr[1], (s32)len, buff[CMD_HEAD_LENGTH]); + + if (1 == cmd_head.wr) { + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG_ARRAY(cmd_head.data, cmd_head.data_len + cmd_head.addr_len); + GTP_DEBUG_ARRAY((u8*)&buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[WRITE]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + } + if (tool_i2c_write(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + cmd_head.data_len + cmd_head.addr_len) <= 0) { + GTP_ERROR("[WRITE]Write data failed!"); + return -EPERM; + } + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len],cmd_head.data_len + cmd_head.addr_len); + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + } else if (3 == cmd_head.wr) { + ret = copy_from_user(&cmd_head.data[0], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + + register_i2c_func(); + } else if (5 == cmd_head.wr) { + } else if (7 == cmd_head.wr) { + gtp_irq_disable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_OFF); + #endif + } else if (9 == cmd_head.wr) { + gtp_irq_enable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_ON); + #endif + } else if (17 == cmd_head.wr) { + struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_DEBUG("copy_from_user failed."); + return -EPERM; + } + if (cmd_head.data[GTP_ADDR_LENGTH]) { + GTP_INFO("gtp enter rawdiff."); + ts->gtp_rawdiff_mode = true; + } else { + ts->gtp_rawdiff_mode = false; + GTP_INFO("gtp leave rawdiff."); + } + } +#ifdef UPDATE_FUNCTIONS + else if (11 == cmd_head.wr) { + if (FAIL == gup_enter_update_mode(gt_client)) { + return -EPERM; + } + } else if (13 == cmd_head.wr) { + gup_leave_update_mode(); + } else if (15 == cmd_head.wr) { + show_len = 0; + total_len = 0; + memset(cmd_head.data, 0, cmd_head.data_len + 1); + memcpy(cmd_head.data, &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (FAIL == gup_update_proc((void*)cmd_head.data)) { + return -EPERM; + } + } + +#endif + + return len; +} +static ssize_t goodix_sys_tool_read(struct class *class, struct class_attribute *attr, char *buf) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + + if (cmd_head.wr % 2) { + return -EPERM; + } else if (!cmd_head.wr) { + u16 len = 0; + s16 data_len = 0; + u16 loc = 0; + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[READ]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + } + + memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], cmd_head.data[1]); + GTP_DEBUG("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + + data_len = cmd_head.data_len; + + while(data_len > 0) { + if (data_len > DATA_LENGTH) { + len = DATA_LENGTH; + } else { + len = data_len; + } + data_len -= len; + + if (tool_i2c_read(cmd_head.data, len) <= 0) { + GTP_ERROR("[READ]Read data failed!"); + return -EPERM; + } + + memcpy(&buf[loc], &cmd_head.data[GTP_ADDR_LENGTH], len); + loc += len; + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH], len); + GTP_DEBUG_ARRAY(buf, len); + } + return cmd_head.data_len; + } else if (2 == cmd_head.wr) { + memcpy(buf, IC_TYPE, sizeof(IC_TYPE)); + return ret; + } else if (4 == cmd_head.wr) { + u8 progress_buf[4]; + progress_buf[0] = show_len >> 8; + progress_buf[1] = show_len & 0xff; + progress_buf[2] = total_len >> 8; + progress_buf[3] = total_len & 0xff; + memcpy(buf, progress_buf, 4); + return ret; + } else if (6 == cmd_head.wr) { + } else if (8 == cmd_head.wr) { + memcpy(buf, GTP_DRIVER_VERSION, strlen(GTP_DRIVER_VERSION)); + return ret; + } + return -EPERM; +} +/******************************************************* +Function: + Goodix tool read function. +Input: + standard proc read function param. +Output: + Return read length. +********************************************************/ +ssize_t goodix_tool_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + + if (*ppos) { + *ppos = 0; + return 0; + } + + if (cmd_head.wr % 2) { + return -EPERM; + } else if (!cmd_head.wr) { + u16 len = 0; + s16 data_len = 0; + u16 loc = 0; + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[READ]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + } + + memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], cmd_head.data[1]); + GTP_DEBUG("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + + data_len = cmd_head.data_len; + + while(data_len > 0) { + if (data_len > DATA_LENGTH) { + len = DATA_LENGTH; + } else { + len = data_len; + } + data_len -= len; + + if (tool_i2c_read(cmd_head.data, len) <= 0) { + GTP_ERROR("[READ]Read data failed!"); + return -EPERM; + } + + ret = simple_read_from_buffer(&page[loc], size, ppos, &cmd_head.data[GTP_ADDR_LENGTH], len); + if (ret < 0) { + return ret; + } + loc += len; + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH], len); + GTP_DEBUG_ARRAY(page, len); + } + return cmd_head.data_len; + } else if (2 == cmd_head.wr) { + ret = simple_read_from_buffer(page, size, ppos, IC_TYPE, sizeof(IC_TYPE)); + return ret; + } else if (4 == cmd_head.wr) { + u8 progress_buf[4]; + progress_buf[0] = show_len >> 8; + progress_buf[1] = show_len & 0xff; + progress_buf[2] = total_len >> 8; + progress_buf[3] = total_len & 0xff; + + ret = simple_read_from_buffer(page, size, ppos, progress_buf, 4); + return ret; + } else if (6 == cmd_head.wr) { + } else if (8 == cmd_head.wr) { + ret = simple_read_from_buffer(page, size, ppos, GTP_DRIVER_VERSION, strlen(GTP_DRIVER_VERSION)); + return ret; + } + return -EPERM; +} diff --git a/drivers/input/touchscreen/GT917D/gt917.c b/drivers/input/touchscreen/GT917D/gt917.c new file mode 100644 index 0000000000000..f7fed69dc383d --- /dev/null +++ b/drivers/input/touchscreen/GT917D/gt917.c @@ -0,0 +1,3570 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#include +#include "gt9xx.h" + +#if GTP_ICS_SLOT_REPORT + #include +#endif + + +#if WT_ADD_CTP_INFO +#include +static char tp_string_version[40]; +static int tp_sensor_id = -1; +static u8 cfg_version; + +/*TP Color*/ +#define TP_White 0x31 +#define TP_Black 0x32 +#define TP_Golden 0x38 +/*TP Maker*/ +#define TP_BIEL 0x31 +#define GTP_LOCKDOWN_SIZE 8 +#define GTP_READ_LOCKDOWN_INFO_ADDR 0x81A0 +static u8 lockdown_info[GTP_LOCKDOWN_SIZE]; +static u8 TP_Maker, LCD_Maker, Panel_Ink; +extern u8 tp_color; +static u16 IC_Version; +static int gtp_read_lockdown_info(void); +int gtp_hardwareinfo_set(void); +#endif + +static const char *goodix_ts_name = "goodix-ts"; +static const char *goodix_input_phys = "input/ts"; +static struct workqueue_struct *goodix_wq; +struct i2c_client *i2c_connect_client = NULL; +/* +int gtp_rst_gpio; +int gtp_int_gpio; +*/ +unsigned int gtp_rst_gpio; +unsigned int gtp_int_gpio; + + +int gtp_ics_slot_report = 0;/*use to choose report mode A or B, 0 for A and 1 for B */ + + +u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] + = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; + + +#ifdef GTP_GLOVE_MODE +u8 gtp_glove_config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] + = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; +#endif + + +#if GTP_HAVE_TOUCH_KEY + static const u16 touch_key_array[] = GTP_KEY_TAB; + #define GTP_MAX_KEY_NUM (sizeof(touch_key_array)/sizeof(touch_key_array[0])) + + #define GTP_KEY_MAP_ARRAY {{175, 1500} , {387, 1500} , {582, 1500} } + struct touch_virtual_key_map_t { + int point_x; + int point_y; +}; +static struct touch_virtual_key_map_t touch_key_point_maping_array[] = GTP_KEY_MAP_ARRAY; + + +#if GTP_DEBUG_ON + static const int key_codes[] = {KEY_HOME, KEY_BACK, KEY_MENU, KEY_SEARCH}; + static const char *key_names[] = {"Key_Home", "Key_Back", "Key_Menu", "Key_Search"}; +#endif + +#endif + +#ifdef PMX_DRIVER_GT915L +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" +static int goodix_ts_pinctrl_init(struct goodix_ts_data *goodix_data); +static int goodix_ts_pinctrl_select(struct goodix_ts_data *goodix_data, bool on); +#endif + +static s8 gtp_i2c_test(struct i2c_client *client); +void gtp_reset_guitar(struct i2c_client *client, s32 ms); +s32 gtp_send_cfg(struct i2c_client *client); +void gtp_int_sync(s32 ms); + +static ssize_t gt91xx_config_read_proc(struct file *, char __user *, size_t, loff_t *); +static ssize_t gt91xx_config_write_proc(struct file *, const char __user *, size_t, loff_t *); + +static struct proc_dir_entry *gt91xx_config_proc = NULL; +static const struct file_operations config_proc_ops = { + .owner = THIS_MODULE, + .read = gt91xx_config_read_proc, + .write = gt91xx_config_write_proc, +}; +static int gtp_register_powermanger(struct goodix_ts_data *ts); +static int gtp_unregister_powermanger(struct goodix_ts_data *ts); + +#if GTP_CREATE_WR_NODE +extern s32 init_wr_node(struct i2c_client *); +extern void uninit_wr_node(void); +#endif + +#if GTP_AUTO_UPDATE +extern u8 gup_init_update_proc(struct goodix_ts_data *); +#endif + +#if GTP_ESD_PROTECT +static struct delayed_work gtp_esd_check_work; +static struct workqueue_struct *gtp_esd_check_workqueue = NULL; +static void gtp_esd_check_func(struct work_struct *); +static s32 gtp_init_ext_watchdog(struct i2c_client *client); +void gtp_esd_switch(struct i2c_client *, s32); +#endif + + +#if GTP_COMPATIBLE_MODE +extern s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len); +extern s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len); +extern s32 gup_clk_calibration(void); +extern s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +extern u8 gup_check_fs_mounted(char *path_name); + +void gtp_recovery_reset(struct i2c_client *client); +static s32 gtp_esd_recovery(struct i2c_client *client); +s32 gtp_fw_startup(struct i2c_client *client); +static s32 gtp_main_clk_proc(struct goodix_ts_data *ts); +static s32 gtp_bak_ref_proc(struct goodix_ts_data *ts, u8 mode); + +#endif + + +#if GTP_GESTURE_WAKEUP +typedef enum { + DOZE_DISABLED = 0, + DOZE_ENABLED = 1, + DOZE_WAKEUP = 2, +} DOZE_T; +static DOZE_T doze_status = DOZE_DISABLED; +static s8 gtp_enter_doze(struct goodix_ts_data *ts); +#endif + +#ifdef GTP_CONFIG_OF +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid); +#endif + + +#if GTP_GLOVE_MODE +char gtp_glove_onoff = '0'; +static char gtp_glove_support_flag_changed = 0; +static const char gtp_glove_support_flag = GTP_GLOVE_SUPPORT_ONOFF; +s32 gtp_send_glove_cfg(struct i2c_client *client); + +static ssize_t proc_glove_onoff_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + if (0 == gtp_glove_support_flag_changed) + num = sprintf(page, "%c\n", gtp_glove_support_flag); + else + num = sprintf(page, "%c\n", gtp_glove_onoff); + *ppos += num; + return num; +} + +static ssize_t proc_glove_onoff_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_glove_onoff); + gtp_glove_support_flag_changed = 1; + + if ('1' == gtp_glove_onoff) { + u8 cfg_group[] = CTP_CFG_GROUP1_GLOVE; + gtp_reset_guitar(i2c_connect_client, 50); + msleep(100); + memcpy(>p_glove_config[GTP_ADDR_LENGTH], cfg_group, GTP_CONFIG_MAX_LENGTH); + gtp_send_glove_cfg(i2c_connect_client); + } else if ('0' == gtp_glove_onoff) { + gtp_reset_guitar(i2c_connect_client, 50); + msleep(100); + gtp_send_cfg(i2c_connect_client); + } + return count; +} + +static const struct file_operations gt_glove_onoff_proc_fops = { + .write = proc_glove_onoff_write, + .read = proc_glove_onoff_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +#endif + + +#if GTP_GESTURE_WAKEUP +char gtp_gesture_coordinate[60] = {0X8140 >> 8, 0X8140 & 0xFF}; +char gtp_gesture_value = 0; +char gtp_gesture_onoff = '0'; +const char gtp_gesture_type[] = GTP_GESTURE_TPYE_STR; +static const char gtp_gesture_support_flag = GTP_GESTURE_SUPPORT_ONOFF; +static const char gtp_verson[] = GTP_PROC_DRIVER_VERSION; +static char gtp_gesture_support_flag_changed = 0; +struct i2c_client *i2c_client_point = NULL; + + +static ssize_t proc_gesture_data_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + int num = 0; + if (*ppos) + return 0; + printk("proc_gesture_data_read=%d\n", gtp_gesture_value); + num = sprintf(buffer, "%c\n", gtp_gesture_value); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_data_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_value); + return count; +} + +static ssize_t proc_gesture_type_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) { + printk("%s\n", __func__); + return 0; + } + num = sprintf(buffer, "%s\n", gtp_gesture_type); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_type_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static ssize_t proc_gesture_onoff_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + if (0 == gtp_gesture_support_flag_changed) + num = sprintf(page, "%c\n", gtp_gesture_support_flag); + else + num = sprintf(page, "%c\n", gtp_gesture_onoff); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_onoff_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_onoff); + gtp_gesture_support_flag_changed = 1; + printk("in proc_gesture_onoff_write %c \n", gtp_gesture_onoff); + return count; +} + +static ssize_t proc_version_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + num = sprintf(page, "%s\n", gtp_verson); + *ppos += num; + return num; +} + +static ssize_t proc_version_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return count; +} + +static ssize_t proc_gesture_coordinate_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + if (*ppos) + return 0; + memcpy(page, gtp_gesture_coordinate, 60); + printk("GTP gtp_ges 0x%02x\n", gtp_gesture_coordinate[13]); + memset(gtp_gesture_coordinate, 0, 60); + *ppos += 60; + return 60; +} + +static ssize_t proc_gesture_coordinate_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return count; +} + +static const struct file_operations gt_gesture_var_proc_fops = { + .write = proc_gesture_data_write, + .read = proc_gesture_data_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_gesture_type_proc_fops = { + .write = proc_gesture_type_write, + .read = proc_gesture_type_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_gesture_onoff_proc_fops = { + .write = proc_gesture_onoff_write, + .read = proc_gesture_onoff_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_version_proc_fops = { + .write = proc_version_write, + .read = proc_version_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_coordinate_proc_fops = { + .write = proc_gesture_coordinate_write, + .read = proc_gesture_coordinate_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + + +void Ctp_Gesture_Fucntion_Proc_File(void) +{ + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_gesture_wakup_proc = NULL; + struct proc_dir_entry *ctp_gesture_var_proc = NULL; + struct proc_dir_entry *ctp_gesture_type_proc = NULL; + struct proc_dir_entry *ctp_gesture_onoff_proc = NULL; + struct proc_dir_entry *ctp_glove_onoff_proc = NULL; + struct proc_dir_entry *ctp_version_proc = NULL; + struct proc_dir_entry *ctp_coordinate_proc = NULL; +#define CTP_GESTURE_FUNCTION_AUTHORITY_PROC 0777 + + ctp_device_proc = proc_mkdir("touchscreen_feature", NULL); + ctp_gesture_wakup_proc = proc_mkdir("gesture", NULL); + + ctp_gesture_var_proc = proc_create("data", 0444, ctp_gesture_wakup_proc, >_gesture_var_proc_fops); + if (ctp_gesture_var_proc == NULL) { + GTP_ERROR("ctp_gesture_var_proc create failed\n"); + } + + ctp_gesture_type_proc = proc_create("gesture_type", 0444, ctp_device_proc, >_gesture_type_proc_fops); + if (ctp_gesture_type_proc == NULL) { + GTP_ERROR("ctp_gesture_type_proc create failed\n"); + } + + ctp_gesture_onoff_proc = proc_create("onoff", 0666, ctp_gesture_wakup_proc, >_gesture_onoff_proc_fops); + if (ctp_gesture_onoff_proc == NULL) { + GTP_ERROR("ctp_gesture_onoff_proc create failed\n"); + } + +#if GTP_GLOVE_MODE + ctp_glove_onoff_proc = proc_create("glove_onoff", 0666, ctp_device_proc, >_glove_onoff_proc_fops); + if (ctp_glove_onoff_proc == NULL) { + GTP_ERROR("ctp_gesture_onoff_proc create failed\n"); + } +#endif + + ctp_version_proc = proc_create("version", 0444, ctp_device_proc, >_version_proc_fops); + if (ctp_version_proc == NULL) { + GTP_ERROR("create_proc_entry version failed\n"); + } + + ctp_coordinate_proc = proc_create("gesture_coordinate", 0777, ctp_device_proc, >_coordinate_proc_fops); + if (ctp_coordinate_proc == NULL) { + GTP_ERROR("create_proc_entry version failed\n"); + } + +} + +#endif + + + + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + + if (*ppos) { + GTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + return sprintf(ptr, "%02X%02X%02X%02X%02X%02X%02X%02X\n", + lockdown_info[0], lockdown_info[1], lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], lockdown_info[6], lockdown_info[7]); +} +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static const struct file_operations ctp_lockdown_procs_fops = { + .write = ctp_lockdown_proc_write, + .read = ctp_lockdown_proc_read, + .owner = THIS_MODULE, +}; + +void ctp_lockdown_fucntion_proc_file(void) +{ + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_lockdown_proc = NULL; + + ctp_device_proc = proc_mkdir("touchscreen", NULL); + + ctp_lockdown_proc = proc_create("lockdown_info", 0666, ctp_device_proc, &ctp_lockdown_procs_fops); + if (ctp_lockdown_proc == NULL) { + GTP_ERROR("create_proc_entry lockdown failed\n"); + } +} +#endif + + +/******************************************************* +Function: + Read data from the i2c slave device. +Input: + client: i2c device. + buf[0~1]: read start address. + buf[2~len-1]: read data buffer. + len: GTP_ADDR_LENGTH + read bytes count +Output: + numbers of i2c_msgs to transfer: + 2: succeed, otherwise: failed +*********************************************************/ +s32 gtp_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + if ((retries >= 5)) { + #if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); + #endif + + #if GTP_GESTURE_WAKEUP + + if (DOZE_ENABLED == doze_status) { + return ret; + } + #endif + GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + gtp_recovery_reset(client); + } else + #endif + { + gtp_reset_guitar(client, 10); + } + } + return ret; +} + + + +/******************************************************* +Function: + Write data to the i2c slave device. +Input: + client: i2c device. + buf[0~1]: write start address. + buf[2~len-1]: data buffer + len: GTP_ADDR_LENGTH + write bytes count +Output: + numbers of i2c_msgs to transfer: + 1: succeed, otherwise: failed +*********************************************************/ +s32 gtp_i2c_write(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1) + break; + retries++; + } + if ((retries >= 5)) { + #if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); + #endif + + #if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) { + return ret; + } + #endif + GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + gtp_recovery_reset(client); + } else + #endif + { + gtp_reset_guitar(client, 10); + } + } + return ret; +} + + +/******************************************************* +Function: + i2c read twice, compare the results +Input: + client: i2c device + addr: operate address + rxbuf: read data to store, if compare successful + len: bytes to read +Output: + FAIL: read failed + SUCCESS: read successful +*********************************************************/ +s32 gtp_i2c_read_dbl_check(struct i2c_client *client, u16 addr, u8 *rxbuf, int len) +{ + u8 buf[16] = {0}; + u8 confirm_buf[16] = {0}; + u8 retry = 0; + + while (retry++ < 3) { + memset(buf, 0xAA, 16); + buf[0] = (u8)(addr >> 8); + buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, buf, len + 2); + + memset(confirm_buf, 0xAB, 16); + confirm_buf[0] = (u8)(addr >> 8); + confirm_buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, confirm_buf, len + 2); + + if (!memcmp(buf, confirm_buf, len+2)) { + memcpy(rxbuf, confirm_buf+2, len); + return SUCCESS; + } + } + GTP_ERROR("I2C read 0x%04X, %d bytes, double check failed!", addr, len); + return FAIL; +} + +/******************************************************* +Function: + Send config. +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ + +s32 gtp_send_glove_cfg(struct i2c_client *client) +{ + s32 ret = 2; + +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts->pnl_init_error) { + GTP_INFO("Error occured in init_panel, no config sent"); + return 0; + } + GTP_INFO("Driver send config."); + for (retry = 0; retry < 5; retry++) { + ret = gtp_i2c_write(client, gtp_glove_config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + if (ret > 0) { + break; + } + } +#endif + return ret; +} + +/******************************************************* +Function: + Send config. +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ + +s32 gtp_send_cfg(struct i2c_client *client) +{ + s32 ret = 2; + +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts->pnl_init_error) { + GTP_INFO("Error occured in init_panel, no config sent"); + return 0; + } + + GTP_INFO("Driver send config."); + for (retry = 0; retry < 5; retry++) { + ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + if (ret > 0) { + break; + } + } +#endif + return ret; +} +/******************************************************* +Function: + Disable irq function +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +void gtp_irq_disable(struct goodix_ts_data *ts) +{ + unsigned long irqflags; + + GTP_DEBUG_FUNC(); + + spin_lock_irqsave(&ts->irq_lock, irqflags); + if (!ts->irq_is_disable) { + ts->irq_is_disable = 1; + disable_irq_nosync(ts->client->irq); + } + spin_unlock_irqrestore(&ts->irq_lock, irqflags); +} + +/******************************************************* +Function: + Enable irq function +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +void gtp_irq_enable(struct goodix_ts_data *ts) +{ + unsigned long irqflags = 0; + + GTP_DEBUG_FUNC(); + + spin_lock_irqsave(&ts->irq_lock, irqflags); + if (ts->irq_is_disable) { + enable_irq(ts->client->irq); + ts->irq_is_disable = 0; + } + spin_unlock_irqrestore(&ts->irq_lock, irqflags); +} + + +/******************************************************* +Function: + Report touch point event +Input: + ts: goodix i2c_client private data + id: trackId + x: input x coordinate + y: input y coordinate + w: input pressure +Output: + None. +*********************************************************/ +static void gtp_touch_down(struct goodix_ts_data *ts, s32 id, s32 x, s32 y, s32 w) +{ +#if GTP_CHANGE_X2Y + GTP_SWAP(x, y); +#endif + + + if (gtp_ics_slot_report == 1) { + input_mt_slot(ts->input_dev, id); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + } else { + input_report_key(ts->input_dev, BTN_TOUCH, 1); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); + input_mt_sync(ts->input_dev); + } + + GTP_DEBUG("ID:%d, X:%d, Y:%d, W:%d", id, x, y, w); +} + +/******************************************************* +Function: + Report touch release event +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +static void gtp_touch_up(struct goodix_ts_data *ts, s32 id) +{ + + if (gtp_ics_slot_report == 1) { + input_mt_slot(ts->input_dev, id); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, -1); + GTP_DEBUG("Touch id[%2d] release!", id); + } else { + input_report_key(ts->input_dev, BTN_TOUCH, 0); + } + +} + +#if GTP_WITH_PEN + +static void gtp_pen_init(struct goodix_ts_data *ts) +{ + s32 ret = 0; + + GTP_INFO("Request input device for pen/stylus."); + + ts->pen_dev = input_allocate_device(); + if (ts->pen_dev == NULL) { + GTP_ERROR("Failed to allocate input device for pen/stylus."); + return; + } + + ts->pen_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; + + + if (gtp_ics_slot_report == 1) { + input_mt_init_slots(ts->pen_dev, 16); + } else { + ts->pen_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + } + + set_bit(BTN_TOOL_PEN, ts->pen_dev->keybit); + set_bit(INPUT_PROP_DIRECT, ts->pen_dev->propbit); + + +#if GTP_PEN_HAVE_BUTTON + input_set_capability(ts->pen_dev, EV_KEY, BTN_STYLUS); + input_set_capability(ts->pen_dev, EV_KEY, BTN_STYLUS2); +#endif + + input_set_abs_params(ts->pen_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_PRESSURE, 0, 255, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); + + ts->pen_dev->name = "goodix-pen"; + ts->pen_dev->id.bustype = BUS_I2C; + + ret = input_register_device(ts->pen_dev); + if (ret) { + GTP_ERROR("Register %s input device failed", ts->pen_dev->name); + return; + } +} + +static void gtp_pen_down(s32 x, s32 y, s32 w, s32 id) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + +#if GTP_CHANGE_X2Y + GTP_SWAP(x, y); +#endif + + input_report_key(ts->pen_dev, BTN_TOOL_PEN, 1); + + + if (gtp_ics_slot_report == 1) { + input_mt_slot(ts->pen_dev, id); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, id); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->pen_dev, ABS_MT_PRESSURE, w); + input_report_abs(ts->pen_dev, ABS_MT_TOUCH_MAJOR, w); + } else { + input_report_key(ts->pen_dev, BTN_TOUCH, 1); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->pen_dev, ABS_MT_PRESSURE, w); + input_report_abs(ts->pen_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, id); + input_mt_sync(ts->pen_dev); + } + + GTP_DEBUG("(%d)(%d, %d)[%d]", id, x, y, w); +} + +static void gtp_pen_up(s32 id) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + + input_report_key(ts->pen_dev, BTN_TOOL_PEN, 0); + + + if (gtp_ics_slot_report == 1) { + input_mt_slot(ts->pen_dev, id); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, -1); + } else { + input_report_key(ts->pen_dev, BTN_TOUCH, 0); + } + +} +#endif + +/******************************************************* +Function: + Goodix touchscreen work function +Input: + work: work struct of goodix_workqueue +Output: + None. +*********************************************************/ +static void goodix_ts_work_func(struct work_struct *work) +{ + u8 end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0}; + u8 point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF}; + u8 touch_num = 0; + u8 finger = 0; + static u16 pre_touch; + static u8 pre_key; +#if GTP_WITH_PEN + u8 pen_active = 0; + static u8 pre_pen; +#endif + u8 key_value = 0; + u8 *coor_data = NULL; + s32 input_x = 0; + s32 input_y = 0; + s32 input_w = 0; + s32 id = 0; + s32 i = 0; + s32 ret = -1; + struct goodix_ts_data *ts = NULL; + +#if GTP_COMPATIBLE_MODE + u8 rqst_buf[3] = {0x80, 0x43}; +#endif + +#if GTP_GESTURE_WAKEUP + u8 doze_buf[3] = {0x81, 0x4B}; +#endif + + GTP_DEBUG_FUNC(); + ts = container_of(work, struct goodix_ts_data, work); + if (ts->enter_update) { + return; + } +#if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) { + ret = gtp_i2c_read(i2c_connect_client, doze_buf, 3); + GTP_DEBUG("0x814B = 0x%02X", doze_buf[2]); + if (ret > 0) { + if ('1' == gtp_gesture_onoff) { + gtp_gesture_coordinate[0] = 0X8140 >> 8; + gtp_gesture_coordinate[1] = 0X8140 & 0xFF; + + if ((doze_buf[2] == 'a') || (doze_buf[2] == 'b') || (doze_buf[2] == 'c') || + (doze_buf[2] == 'd') || (doze_buf[2] == 'e') || (doze_buf[2] == 'g') || + (doze_buf[2] == 'h') || (doze_buf[2] == 'm') || (doze_buf[2] == 'o') || + (doze_buf[2] == 'q') || (doze_buf[2] == 's') || (doze_buf[2] == 'v') || + (doze_buf[2] == 'w') || (doze_buf[2] == 'y') || (doze_buf[2] == 'z') || + (doze_buf[2] == 0x5E) /* ^ */ + ) { + GTP_INFO("Gesture type;%c\n", doze_buf[2]); + gtp_gesture_value = doze_buf[2]; + if (doze_buf[2] != 0x5E) { + GTP_INFO("Wakeup by gesture(%c), light up the screen!", doze_buf[2]); + } else { + GTP_INFO("Wakeup by gesture(^), light up the screen!"); + } + + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL != strchr(gtp_gesture_type, gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + }; + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else if ((doze_buf[2] == 0xAA) || (doze_buf[2] == 0xBB) || + (doze_buf[2] == 0xAB) || (doze_buf[2] == 0xBA)) { + char *direction[4] = {"Right", "Down", "Up", "Left"}; + u8 type = ((doze_buf[2] & 0x0F) - 0x0A) + (((doze_buf[2] >> 4) & 0x0F) - 0x0A) * 2; + GTP_INFO("%s slide to light up the screen!", direction[type]); + switch (doze_buf[2]) { + case 0xAA: + gtp_gesture_value = 'R'; + break; + case 0xAB: + gtp_gesture_value = 'D'; + break; + case 0xBA: + gtp_gesture_value = 'U'; + break; + case 0xBB: + gtp_gesture_value = 'L'; + break; + } + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL != strchr(gtp_gesture_type, gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + } + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else if (0xCC == doze_buf[2]) { + GTP_INFO("Double click to light up the screen!"); + gtp_gesture_value = 'K'; + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL != strchr(gtp_gesture_type, gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + } + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else { + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + gtp_enter_doze(ts); + } + } + } + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } +#endif + + ret = gtp_i2c_read(ts->client, point_data, 12); + if (ret < 0) { + GTP_ERROR("I2C transfer error. errno:%d\n ", ret); + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } + + finger = point_data[GTP_ADDR_LENGTH]; + +#if GTP_COMPATIBLE_MODE + + if ((finger == 0x00) && (CHIP_TYPE_GT9F == ts->chip_type)) { + ret = gtp_i2c_read(ts->client, rqst_buf, 3); + if (ret < 0) { + GTP_ERROR("Read request status error!"); + goto exit_work_func; + } + + switch (rqst_buf[2]) { + case GTP_RQST_CONFIG: + GTP_INFO("Request for config."); + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Request for config unresponded!"); + } else { + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + GTP_INFO("Request for config responded!"); + } + break; + + case GTP_RQST_BAK_REF: + GTP_INFO("Request for backup reference."); + ts->rqst_processing = 1; + ret = gtp_bak_ref_proc(ts, GTP_BAK_REF_SEND); + if (SUCCESS == ret) { + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + ts->rqst_processing = 0; + GTP_INFO("Request for backup reference responded!"); + } else { + GTP_ERROR("Requeset for backup reference unresponed!"); + } + break; + + case GTP_RQST_RESET: + GTP_INFO("Request for reset."); + gtp_recovery_reset(ts->client); + break; + + case GTP_RQST_MAIN_CLOCK: + GTP_INFO("Request for main clock."); + ts->rqst_processing = 1; + ret = gtp_main_clk_proc(ts); + if (FAIL == ret) { + GTP_ERROR("Request for main clock unresponded!"); + } else { + GTP_INFO("Request for main clock responded!"); + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + ts->rqst_processing = 0; + ts->clk_chk_fs_times = 0; + } + break; + + default: + GTP_INFO("Undefined request: 0x%02X", rqst_buf[2]); + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + break; + } + } +#endif + if (finger == 0x00) { + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } + + if ((finger & 0x80) == 0) { + goto exit_work_func; + } + + touch_num = finger & 0x0f; + + if (touch_num > GTP_MAX_TOUCH) { + goto exit_work_func; + } + + if (touch_num > 1) { + u8 buf[8 * GTP_MAX_TOUCH] = {(GTP_READ_COOR_ADDR + 10) >> 8, (GTP_READ_COOR_ADDR + 10) & 0xff}; + + ret = gtp_i2c_read(ts->client, buf, 2 + 8 * (touch_num - 1)); + memcpy(&point_data[12], &buf[2], 8 * (touch_num - 1)); + } + +#if (GTP_HAVE_TOUCH_KEY || GTP_PEN_HAVE_BUTTON) + key_value = point_data[3 + 8 * touch_num]; + + if (key_value || pre_key) { + #if GTP_PEN_HAVE_BUTTON + if (key_value == 0x40) { + GTP_DEBUG("BTN_STYLUS & BTN_STYLUS2 Down."); + input_report_key(ts->pen_dev, BTN_STYLUS, 1); + input_report_key(ts->pen_dev, BTN_STYLUS2, 1); + pen_active = 1; + } else if (key_value == 0x10) { + GTP_DEBUG("BTN_STYLUS Down, BTN_STYLUS2 Up."); + input_report_key(ts->pen_dev, BTN_STYLUS, 1); + input_report_key(ts->pen_dev, BTN_STYLUS2, 0); + pen_active = 1; + } else if (key_value == 0x20) { + GTP_DEBUG("BTN_STYLUS Up, BTN_STYLUS2 Down."); + input_report_key(ts->pen_dev, BTN_STYLUS, 0); + input_report_key(ts->pen_dev, BTN_STYLUS2, 1); + pen_active = 1; + } else { + GTP_DEBUG("BTN_STYLUS & BTN_STYLUS2 Up."); + input_report_key(ts->pen_dev, BTN_STYLUS, 0); + input_report_key(ts->pen_dev, BTN_STYLUS2, 0); + if ((pre_key == 0x40) || (pre_key == 0x20) || + (pre_key == 0x10) + ) { + pen_active = 1; + } + } + if (pen_active) { + touch_num = 0; + + } + #endif + + #if GTP_HAVE_TOUCH_KEY + if (!pre_touch) { + for (i = 0; i < GTP_MAX_KEY_NUM; i++) { + #if GTP_DEBUG_ON + for (ret = 0; ret < 4; ++ret) { + if (key_codes[ret] == touch_key_array[i]) { + GTP_DEBUG("Key: %s %s", key_names[ret], (key_value & (0x01 << i)) ? "Down" : "Up"); + break; + } + } + #endif + + if (gtp_ics_slot_report == 1) + input_report_key(ts->input_dev, touch_key_array[i], key_value & (0x01<pen_dev); + } else +#endif + { + input_sync(ts->input_dev); + } + +exit_work_func: + if (!ts->gtp_rawdiff_mode) { + ret = gtp_i2c_write(ts->client, end_cmd, 3); + if (ret < 0) { + GTP_INFO("I2C write end_cmd error!"); + } + } + if (ts->use_irq) { + gtp_irq_enable(ts); + } +} + +/******************************************************* +Function: + Timer interrupt service routine for polling mode. +Input: + timer: timer struct pointer +Output: + Timer work mode. + HRTIMER_NORESTART: no restart mode +*********************************************************/ +static enum hrtimer_restart goodix_ts_timer_handler(struct hrtimer *timer) +{ + struct goodix_ts_data *ts = container_of(timer, struct goodix_ts_data, timer); + + GTP_DEBUG_FUNC(); + + queue_work(goodix_wq, &ts->work); + hrtimer_start(&ts->timer, ktime_set(0, (GTP_POLL_TIME+6)*1000000), HRTIMER_MODE_REL); + return HRTIMER_NORESTART; +} + +/******************************************************* +Function: + External interrupt service routine for interrupt mode. +Input: + irq: interrupt number. + dev_id: private data pointer +Output: + Handle Result. + IRQ_HANDLED: interrupt handled successfully +*********************************************************/ +static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id) +{ + struct goodix_ts_data *ts = dev_id; + + GTP_DEBUG_FUNC(); + + gtp_irq_disable(ts); + + queue_work(goodix_wq, &ts->work); + + return IRQ_HANDLED; +} +/******************************************************* +Function: + Synchronization. +Input: + ms: synchronization time in millisecond. +Output: + None. +*******************************************************/ +void gtp_int_sync(s32 ms) +{ + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(ms); + GTP_GPIO_AS_INT(gtp_int_gpio); +} + + +/******************************************************* +Function: + Reset chip. +Input: + ms: reset time in millisecond +Output: + None. +*******************************************************/ +void gtp_reset_guitar(struct i2c_client *client, s32 ms) +{ +#if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); +#endif + + GTP_DEBUG_FUNC(); + GTP_INFO("Guitar reset"); + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(ms); + + GTP_GPIO_OUTPUT(gtp_int_gpio, client->addr == 0x14); + + msleep(2); + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + msleep(6); + + GTP_GPIO_AS_INPUT(gtp_rst_gpio); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return; + } +#endif + + gtp_int_sync(50); +#if GTP_ESD_PROTECT + gtp_init_ext_watchdog(client); +#endif +} + +#if GTP_GESTURE_WAKEUP +/******************************************************* +Function: + Enter doze mode for sliding wakeup. +Input: + ts: goodix tp private data +Output: + 1: succeed, otherwise failed +*******************************************************/ +static s8 gtp_enter_doze(struct goodix_ts_data *ts) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 8}; + + GTP_DEBUG_FUNC(); + + GTP_DEBUG("Entering gesture mode."); + while (retry++ < 5) { + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x46; + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret < 0) { + GTP_DEBUG("failed to set doze flag into 0x8046, %d", retry); + continue; + } + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x40; + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret > 0) { + doze_status = DOZE_ENABLED; + GTP_INFO("Gesture mode enabled."); + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send gesture cmd failed."); + return ret; +} +#endif +/******************************************************* +Function: + Enter sleep mode. +Input: + ts: private data. +Output: + Executive outcomes. + 1: succeed, otherwise failed. +*******************************************************/ +static s8 gtp_enter_sleep(struct goodix_ts_data *ts) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 5}; + +#if GTP_COMPATIBLE_MODE + u8 status_buf[3] = {0x80, 0x44}; +#endif + + GTP_DEBUG_FUNC(); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + + ret = gtp_i2c_read(ts->client, status_buf, 3); + if (ret < 0) { + GTP_ERROR("failed to get backup-reference status"); + } + + if (status_buf[2] & 0x80) { + ret = gtp_bak_ref_proc(ts, GTP_BAK_REF_STORE); + if (FAIL == ret) { + GTP_ERROR("failed to store bak_ref"); + } + } + } +#endif + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(5); + + while (retry++ < 5) { + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret > 0) { + GTP_INFO("GTP enter sleep!"); + + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send sleep cmd failed."); + return ret; +} + +/******************************************************* +Function: + Wakeup from sleep. +Input: + ts: private data. +Output: + Executive outcomes. + >0: succeed, otherwise: failed. +*******************************************************/ +static s8 gtp_wakeup_sleep(struct goodix_ts_data *ts) +{ + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG_FUNC(); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + u8 opr_buf[3] = {0x41, 0x80}; + + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(5); + + for (retry = 0; retry < 10; ++retry) { + + opr_buf[2] = 0x0C; + ret = gtp_i2c_write(ts->client, opr_buf, 3); + if (FAIL == ret) { + GTP_ERROR("failed to hold ss51 & dsp!"); + continue; + } + opr_buf[2] = 0x00; + ret = gtp_i2c_read(ts->client, opr_buf, 3); + if (FAIL == ret) { + GTP_ERROR("failed to get ss51 & dsp status!"); + continue; + } + if (0x0C != opr_buf[2]) { + GTP_DEBUG("ss51 & dsp not been hold, %d", retry+1); + continue; + } + GTP_DEBUG("ss51 & dsp confirmed hold"); + + ret = gtp_fw_startup(ts->client); + if (FAIL == ret) { + GTP_ERROR("failed to startup GT9XXF, process recovery"); + gtp_esd_recovery(ts->client); + } + break; + } + if (retry >= 10) { + GTP_ERROR("failed to wakeup, processing esd recovery"); + gtp_esd_recovery(ts->client); + } else { + GTP_INFO("GT9XXF gtp wakeup success"); + } + return ret; + } +#endif + +#if GTP_POWER_CTRL_SLEEP + while (retry++ < 5) { + gtp_reset_guitar(ts->client, 20); + + GTP_INFO("GTP wakeup sleep."); + return 1; + } +#else + while (retry++ < 10) { + #if GTP_GESTURE_WAKEUP + if (DOZE_WAKEUP != doze_status) { + GTP_INFO("Powerkey wakeup."); + } else { + GTP_INFO("Gesture wakeup."); + } + doze_status = DOZE_DISABLED; + gtp_irq_disable(ts); + gtp_reset_guitar(ts->client, 10); + gtp_irq_enable(ts); + #else + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(5); + + #endif + + ret = gtp_i2c_test(ts->client); + if (ret > 0) { + GTP_INFO("GTP wakeup sleep."); + + #if (!GTP_GESTURE_WAKEUP) + { + gtp_int_sync(25); + #if GTP_ESD_PROTECT + gtp_init_ext_watchdog(ts->client); + #endif + } + #endif + + return ret; + } + gtp_reset_guitar(ts->client, 20); + } +#endif + + GTP_ERROR("GTP wakeup sleep failed."); + return ret; +} + +/******************************************************* +Function: + Initialize gtp. +Input: + ts: goodix private data +Output: + Executive outcomes. + 0: succeed, otherwise: failed +*******************************************************/ +static s32 gtp_init_panel(struct goodix_ts_data *ts) +{ + s32 ret = -1; + +#if GTP_DRIVER_SEND_CFG + s32 i = 0; + u8 check_sum = 0; + u8 opr_buf[16] = {0}; + u8 sensor_id = 0; + u8 drv_cfg_version; + u8 flash_cfg_version; + +/* if defined CONFIG_OF, parse config data from dtsi + * else parse config data form header file. + */ + +#ifdef GTP_CONFIG_OF + u8 cfg_info_group0[] = CTP_CFG_GROUP0; + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + + u8 *send_cfg_buf[] = {cfg_info_group0, cfg_info_group1, + cfg_info_group2, cfg_info_group3, + cfg_info_group4, cfg_info_group5}; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group0), + CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5)}; + + GTP_DEBUG("Config Groups\' Lengths: %d, %d, %d, %d, %d, %d", + cfg_info_len[0], cfg_info_len[1], cfg_info_len[2], cfg_info_len[3], + cfg_info_len[4], cfg_info_len[5]); +#endif + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + ts->fw_error = 0; + } else +#endif + { /* check firmware */ + ret = gtp_i2c_read_dbl_check(ts->client, 0x41E4, opr_buf, 1); + if (SUCCESS == ret) { + if (opr_buf[0] != 0xBE) { + ts->fw_error = 1; + GTP_ERROR("Firmware error, no config sent!"); + return -EPERM; + } + } + } + + /* read sensor id */ +#if GTP_COMPATIBLE_MODE + msleep(50); +#endif + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) { + if (sensor_id >= 0x06) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + ts->pnl_init_error = 1; + return -EPERM; + } + } else { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + ts->pnl_init_error = 1; + return -EPERM; + } + GTP_INFO("Sensor_ID: %d", sensor_id); + tp_sensor_id = sensor_id; + + /* parse config data*/ + + GTP_DEBUG("Get config data from header file."); + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) { + sensor_id = 0; + } + ts->gtp_cfg_len = cfg_info_len[sensor_id]; + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len); + + GTP_INFO("Config group%d used,length: %d", sensor_id, ts->gtp_cfg_len); + + if (ts->gtp_cfg_len < GTP_CONFIG_MIN_LENGTH) { + GTP_ERROR("Config Group%d is INVALID CONFIG GROUP(Len: %d)! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id, ts->gtp_cfg_len); + ts->pnl_init_error = 1; + return -EPERM; + } + +#if GTP_COMPATIBLE_MODE + if (ts->chip_type != CHIP_TYPE_GT9F) +#endif + { + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + if (ret == SUCCESS) { + GTP_DEBUG("Config Version: %d, 0x%02X; IC Config Version: %d, 0x%02X", + config[GTP_ADDR_LENGTH], config[GTP_ADDR_LENGTH], opr_buf[0], opr_buf[0]); + + flash_cfg_version = opr_buf[0]; + drv_cfg_version = config[GTP_ADDR_LENGTH]; + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + config[GTP_ADDR_LENGTH] = 0x00; + } + } else { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -EPERM; + } + } + +#if GTP_CUSTOM_CFG + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) { + config[TRIGGER_LOC] &= 0xfe; + } else if (GTP_INT_TRIGGER == 1) { + config[TRIGGER_LOC] |= 0x01; + } +#endif + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + +#else + + ts->gtp_cfg_len = GTP_CONFIG_MAX_LENGTH; + ret = gtp_i2c_read(ts->client, config, ts->gtp_cfg_len + GTP_ADDR_LENGTH); + if (ret < 0) { + GTP_ERROR("Read Config Failed, Using Default Resolution & INT Trigger!"); + ts->abs_x_max = GTP_MAX_WIDTH; + ts->abs_y_max = GTP_MAX_HEIGHT; + ts->int_trigger_type = GTP_INT_TRIGGER; + } + +#endif + + if ((ts->abs_x_max == 0) && (ts->abs_y_max == 0)) { + ts->abs_x_max = (config[RESOLUTION_LOC + 1] << 8) + config[RESOLUTION_LOC]; + ts->abs_y_max = (config[RESOLUTION_LOC + 3] << 8) + config[RESOLUTION_LOC + 2]; + ts->int_trigger_type = (config[TRIGGER_LOC]) & 0x03; + } + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + u8 sensor_num = 0; + u8 driver_num = 0; + u8 have_key = 0; + + have_key = (config[GTP_REG_HAVE_KEY - GTP_REG_CONFIG_DATA + 2] & 0x01); + + if (1 == ts->is_950) { + driver_num = config[GTP_REG_MATRIX_DRVNUM - GTP_REG_CONFIG_DATA + 2]; + sensor_num = config[GTP_REG_MATRIX_SENNUM - GTP_REG_CONFIG_DATA + 2]; + if (have_key) { + driver_num--; + } + ts->bak_ref_len = (driver_num * (sensor_num - 1) + 2) * 2 * 6; + } else { + driver_num = (config[CFG_LOC_DRVA_NUM] & 0x1F) + (config[CFG_LOC_DRVB_NUM]&0x1F); + if (have_key) { + driver_num--; + } + sensor_num = (config[CFG_LOC_SENS_NUM] & 0x0F) + ((config[CFG_LOC_SENS_NUM] >> 4) & 0x0F); + ts->bak_ref_len = (driver_num * (sensor_num - 2) + 2) * 2; + } + + GTP_INFO("Drv * Sen: %d * %d(key: %d), X_MAX: %d, Y_MAX: %d, TRIGGER: 0x%02x", + driver_num, sensor_num, have_key, ts->abs_x_max, ts->abs_y_max, ts->int_trigger_type); + return 0; + } else +#endif + { +#if GTP_DRIVER_SEND_CFG + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Send config error."); + } +#if GTP_COMPATIBLE_MODE + if (ts->chip_type != CHIP_TYPE_GT9F) +#endif + { + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + check_sum = 0; + config[GTP_ADDR_LENGTH] = drv_cfg_version; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + } + } + +#endif + GTP_INFO("X_MAX: %d, Y_MAX: %d, TRIGGER: 0x%02x", ts->abs_x_max, ts->abs_y_max, ts->int_trigger_type); + } + + msleep(10); + return 0; + +} + +static ssize_t gt91xx_config_read_proc(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + char *ptr = page; + char temp_data[GTP_CONFIG_MAX_LENGTH + 2] = {0x80, 0x47}; + int i; + + if (*ppos) { + return 0; + } + ptr += sprintf(ptr, "==== GT9XX config init value====\n"); + + for (i = 0 ; i < GTP_CONFIG_MAX_LENGTH ; i++) { + ptr += sprintf(ptr, "0x%02X ", config[i + 2]); + + if (i % 8 == 7) + ptr += sprintf(ptr, "\n"); + } + + ptr += sprintf(ptr, "\n"); + + ptr += sprintf(ptr, "==== GT9XX config real value====\n"); + gtp_i2c_read(i2c_connect_client, temp_data, GTP_CONFIG_MAX_LENGTH + 2); + for (i = 0 ; i < GTP_CONFIG_MAX_LENGTH ; i++) { + ptr += sprintf(ptr, "0x%02X ", temp_data[i+2]); + + if (i % 8 == 7) + ptr += sprintf(ptr, "\n"); + } + *ppos += ptr - page; + return (ptr - page); +} + +static ssize_t gt91xx_config_write_proc(struct file *filp, const char __user *buffer, size_t count, loff_t *off) +{ + s32 ret = 0; + + GTP_DEBUG("write count %ld\n", count); + + if (count > GTP_CONFIG_MAX_LENGTH) { + GTP_ERROR("size not match [%d:%ld]\n", GTP_CONFIG_MAX_LENGTH, count); + return -EFAULT; + } + + if (copy_from_user(&config[2], buffer, count)) { + GTP_ERROR("copy from user fail\n"); + return -EFAULT; + } + + ret = gtp_send_cfg(i2c_connect_client); + + if (ret < 0) { + GTP_ERROR("send config failed."); + } + + return count; +} +/******************************************************* +Function: + Read chip version. +Input: + client: i2c device + version: buffer to keep ic firmware version +Output: + read operation return. + 2: succeed, otherwise: failed +*******************************************************/ +s32 gtp_read_version(struct i2c_client *client, u16 *version) +{ + s32 ret = -1; + u8 buf[8] = {GTP_REG_VERSION >> 8, GTP_REG_VERSION & 0xff}; + + GTP_DEBUG_FUNC(); + + ret = gtp_i2c_read(client, buf, sizeof(buf)); + if (ret < 0) { + GTP_ERROR("GTP read version failed"); + return ret; + } + + if (version) { + *version = (buf[7] << 8) | buf[6]; + } + if (buf[5] == 0x00) { + GTP_INFO("IC Version: %c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[7], buf[6]); + } else { + GTP_INFO("IC Version: %c%c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]); + } + return ret; +} + +/******************************************************* +Function: + I2c test Function. +Input: + client:i2c client. +Output: + Executive outcomes. + 2: succeed, otherwise failed. +*******************************************************/ +static s8 gtp_i2c_test(struct i2c_client *client) +{ + u8 test[3] = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG_FUNC(); + + while (retry++ < 5) { + ret = gtp_i2c_read(client, test, 3); + if (ret > 0) { + return ret; + } + GTP_ERROR("GTP i2c test failed time %d.", retry); + msleep(10); + } + return ret; +} + +/******************************************************* +Function: + Request gpio(INT & RST) ports. +Input: + ts: private data. +Output: + Executive outcomes. + >= 0: succeed, < 0: failed +*******************************************************/ +static s8 gtp_request_io_port(struct goodix_ts_data *ts) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + ret = GTP_GPIO_REQUEST(gtp_int_gpio, "GTP INT IRQ"); + + if (ret < 0) { + GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32)gtp_int_gpio, ret); + ret = -ENODEV; + } else { + GTP_GPIO_AS_INT(gtp_int_gpio); + ts->client->irq = gpio_to_irq(gtp_int_gpio); + } + + ret = GTP_GPIO_REQUEST(gtp_rst_gpio, "GTP RST PORT"); + if (ret < 0) { + GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32)gtp_rst_gpio, ret); + ret = -ENODEV; + } + + GTP_GPIO_AS_INPUT(gtp_rst_gpio); + + gtp_reset_guitar(ts->client, 20); + + if (ret < 0) { + GTP_GPIO_FREE(gtp_rst_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + } + + return ret; +} + +/******************************************************* +Function: + Request interrupt. +Input: + ts: private data. +Output: + Executive outcomes. + 0: succeed, -1: failed. +*******************************************************/ +static s8 gtp_request_irq(struct goodix_ts_data *ts) +{ + s32 ret = -1; + const u8 irq_table[] = GTP_IRQ_TAB; + + GTP_DEBUG_FUNC(); + GTP_DEBUG("INT trigger type:%x", ts->int_trigger_type); + + ret = request_irq(ts->client->irq, + goodix_ts_irq_handler, + irq_table[ts->int_trigger_type], + ts->client->name, + ts); + if (ret) { + GTP_ERROR("Request IRQ failed!ERRNO:%d.", ret); + GTP_GPIO_AS_INPUT(gtp_int_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + + hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ts->timer.function = goodix_ts_timer_handler; + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + return -EPERM; + } else { + gtp_irq_disable(ts); + ts->use_irq = 1; + return 0; + } +} + +static int fts_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + char buffer[16]; + + if (type == EV_SYN && code == SYN_CONFIG) { + sprintf(buffer, "%d", value); + + GTP_INFO("GTP:Gesture on/off : %d", value); + if (value >= MXT_INPUT_EVENT_START && value <= MXT_INPUT_EVENT_END) { + if (value == MXT_INPUT_EVENT_WAKUP_MODE_ON) { + gtp_gesture_onoff = '1'; + } else if (value == MXT_INPUT_EVENT_WAKUP_MODE_OFF) { + gtp_gesture_onoff = '0'; + } else { + gtp_gesture_onoff = '0'; + GTP_ERROR("Failed Open/Close Gesture Function!\n"); + return -ENOMEM; + } + } + } + + return 0; +} +/******************************************************* +Function: + Request input device Function. +Input: + ts:private data. +Output: + Executive outcomes. + 0: succeed, otherwise: failed. +*******************************************************/ +static s8 gtp_request_input_dev(struct goodix_ts_data *ts) +{ + s8 ret = -1; +#if GTP_HAVE_TOUCH_KEY + u8 index = 0; +#endif + + GTP_DEBUG_FUNC(); + + ts->input_dev = input_allocate_device(); + if (ts->input_dev == NULL) { + GTP_ERROR("Failed to allocate input device."); + return -ENOMEM; + } + + ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; + + +if (gtp_ics_slot_report == 1) { + input_mt_init_slots(ts->input_dev, 10, 0); +} else { + ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); +} + + __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit); + +#if GTP_HAVE_TOUCH_KEY + for (index = 0; index < GTP_MAX_KEY_NUM; index++) { + input_set_capability(ts->input_dev, EV_KEY, touch_key_array[index]); + } +#endif + +#if GTP_GESTURE_WAKEUP + input_set_capability(ts->input_dev, EV_KEY, KEY_POWER); + input_set_capability(ts->input_dev, EV_KEY, KEY_WAKEUP); + __set_bit(KEY_WAKEUP, ts->input_dev->keybit); + Ctp_Gesture_Fucntion_Proc_File(); +#endif + +#if GTP_CHANGE_X2Y + GTP_SWAP(ts->abs_x_max, ts->abs_y_max); +#endif + + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); + + ts->input_dev->name = goodix_ts_name; + ts->input_dev->phys = goodix_input_phys; + ts->input_dev->id.bustype = BUS_I2C; + ts->input_dev->id.vendor = 0xDEAD; + ts->input_dev->id.product = 0xBEEF; + ts->input_dev->id.version = 10427; + + ts->input_dev->event = fts_input_event; + + + ret = input_register_device(ts->input_dev); + if (ret) { + GTP_ERROR("Register %s input device failed", ts->input_dev->name); + return -ENODEV; + } + +#if GTP_WITH_PEN + gtp_pen_init(ts); +#endif + + return 0; +} + + +#if GTP_COMPATIBLE_MODE + +s32 gtp_fw_startup(struct i2c_client *client) +{ + u8 opr_buf[4]; + s32 ret = 0; + + + opr_buf[0] = 0xAA; + ret = i2c_write_bytes(client, 0x8041, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + + + opr_buf[0] = 0x00; + ret = i2c_write_bytes(client, 0x4180, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + + gtp_int_sync(25); + + + ret = i2c_read_bytes(client, 0x8041, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + if (0xAA == opr_buf[0]) { + GTP_ERROR("IC works abnormally,startup failed."); + return FAIL; + } else { + GTP_INFO("IC works normally, Startup success."); + opr_buf[0] = 0xAA; + i2c_write_bytes(client, 0x8041, opr_buf, 1); + return SUCCESS; + } +} + +static s32 gtp_esd_recovery(struct i2c_client *client) +{ + s32 retry = 0; + s32 ret = 0; + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(client); + + gtp_irq_disable(ts); + + GTP_INFO("GT9XXF esd recovery mode"); + for (retry = 0; retry < 5; retry++) { + ret = gup_fw_download_proc(NULL, GTP_FL_ESD_RECOVERY); + if (FAIL == ret) { + GTP_ERROR("esd recovery failed %d", retry+1); + continue; + } + ret = gtp_fw_startup(ts->client); + if (FAIL == ret) { + GTP_ERROR("GT9XXF start up failed %d", retry+1); + continue; + } + break; + } + gtp_irq_enable(ts); + + if (retry >= 5) { + GTP_ERROR("failed to esd recovery"); + return FAIL; + } + + GTP_INFO("Esd recovery successful"); + return SUCCESS; +} + +void gtp_recovery_reset(struct i2c_client *client) +{ +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_OFF); +#endif + GTP_DEBUG_FUNC(); + + gtp_esd_recovery(client); + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif +} + +static s32 gtp_bak_ref_proc(struct goodix_ts_data *ts, u8 mode) +{ + s32 ret = 0; + s32 i = 0; + s32 j = 0; + u16 ref_sum = 0; + u16 learn_cnt = 0; + u16 chksum = 0; + s32 ref_seg_len = 0; + s32 ref_grps = 0; + struct file *ref_filp = NULL; + u8 *p_bak_ref; + + ret = gup_check_fs_mounted("/data"); + if (FAIL == ret) { + ts->ref_chk_fs_times++; + GTP_DEBUG("Ref check /data times/MAX_TIMES: %d / %d", ts->ref_chk_fs_times, GTP_CHK_FS_MNT_MAX); + if (ts->ref_chk_fs_times < GTP_CHK_FS_MNT_MAX) { + msleep(50); + GTP_INFO("/data not mounted."); + return FAIL; + } + GTP_INFO("check /data mount timeout..."); + } else { + GTP_INFO("/data mounted!!!(%d/%d)", ts->ref_chk_fs_times, GTP_CHK_FS_MNT_MAX); + } + + p_bak_ref = (u8 *)kzalloc(ts->bak_ref_len, GFP_KERNEL); + + if (NULL == p_bak_ref) { + GTP_ERROR("Allocate memory for p_bak_ref failed!"); + return FAIL; + } + + if (ts->is_950) { + ref_seg_len = ts->bak_ref_len / 6; + ref_grps = 6; + } else { + ref_seg_len = ts->bak_ref_len; + ref_grps = 1; + } + ref_filp = filp_open(GTP_BAK_REF_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(ref_filp)) { + GTP_ERROR("Failed to open/create %s.", GTP_BAK_REF_PATH); + if (GTP_BAK_REF_SEND == mode) { + goto bak_ref_default; + } else { + goto bak_ref_exit; + } + } + + switch (mode) { + case GTP_BAK_REF_SEND: + GTP_INFO("Send backup-reference"); + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ret = ref_filp->f_op->read(ref_filp, (char *)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + if (ret < 0) { + GTP_ERROR("failed to read bak_ref info from file, sending defualt bak_ref"); + goto bak_ref_default; + } + for (j = 0; j < ref_grps; ++j) { + ref_sum = 0; + for (i = 0; i < (ref_seg_len); i += 2) { + ref_sum += (p_bak_ref[i + j * ref_seg_len] << 8) + p_bak_ref[i+1 + j * ref_seg_len]; + } + learn_cnt = (p_bak_ref[j * ref_seg_len + ref_seg_len - 4] << 8) + (p_bak_ref[j * ref_seg_len + ref_seg_len - 3]); + chksum = (p_bak_ref[j * ref_seg_len + ref_seg_len - 2] << 8) + (p_bak_ref[j * ref_seg_len + ref_seg_len - 1]); + GTP_DEBUG("learn count = %d", learn_cnt); + GTP_DEBUG("chksum = %d", chksum); + GTP_DEBUG("ref_sum = 0x%04X", ref_sum & 0xFFFF); + + if (1 != ref_sum) { + GTP_INFO("wrong chksum for bak_ref, reset to 0x00 bak_ref"); + memset(&p_bak_ref[j * ref_seg_len], 0, ref_seg_len); + p_bak_ref[ref_seg_len + j * ref_seg_len - 1] = 0x01; + } else { + if (j == (ref_grps - 1)) { + GTP_INFO("backup-reference data in %s used", GTP_BAK_REF_PATH); + } + } + } + ret = i2c_write_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (FAIL == ret) { + GTP_ERROR("failed to send bak_ref because of iic comm error"); + goto bak_ref_exit; + } + break; + + case GTP_BAK_REF_STORE: + GTP_INFO("Store backup-reference"); + ret = i2c_read_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (ret < 0) { + GTP_ERROR("failed to read bak_ref info, sending default back-reference"); + goto bak_ref_default; + } + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ref_filp->f_op->write(ref_filp, (char *)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + break; + + default: + GTP_ERROR("invalid backup-reference request"); + break; + } + ret = SUCCESS; + goto bak_ref_exit; + +bak_ref_default: + + for (j = 0; j < ref_grps; ++j) { + memset(&p_bak_ref[j * ref_seg_len], 0, ref_seg_len); + p_bak_ref[j * ref_seg_len + ref_seg_len - 1] = 0x01; + } + ret = i2c_write_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (!IS_ERR(ref_filp)) { + GTP_INFO("write backup-reference data into %s", GTP_BAK_REF_PATH); + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ref_filp->f_op->write(ref_filp, (char *)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + } + if (ret == FAIL) { + GTP_ERROR("failed to load the default backup reference"); + } + +bak_ref_exit: + + if (p_bak_ref) { + kfree(p_bak_ref); + } + if (ref_filp && !IS_ERR(ref_filp)) { + filp_close(ref_filp, NULL); + } + return ret; +} + + +static s32 gtp_verify_main_clk(u8 *p_main_clk) +{ + u8 chksum = 0; + u8 main_clock = p_main_clk[0]; + s32 i = 0; + + if (main_clock < 50 || main_clock > 120) { + return FAIL; + } + + for (i = 0; i < 5; ++i) { + if (main_clock != p_main_clk[i]) { + return FAIL; + } + chksum += p_main_clk[i]; + } + chksum += p_main_clk[5]; + if ((chksum) == 0) { + return SUCCESS; + } else { + return FAIL; + } +} + +static s32 gtp_main_clk_proc(struct goodix_ts_data *ts) +{ + s32 ret = 0; + s32 i = 0; + s32 clk_chksum = 0; + struct file *clk_filp = NULL; + u8 p_main_clk[6] = {0}; + + ret = gup_check_fs_mounted("/data"); + if (FAIL == ret) { + ts->clk_chk_fs_times++; + GTP_DEBUG("Clock check /data times/MAX_TIMES: %d / %d", ts->clk_chk_fs_times, GTP_CHK_FS_MNT_MAX); + if (ts->clk_chk_fs_times < GTP_CHK_FS_MNT_MAX) { + msleep(50); + GTP_INFO("/data not mounted."); + return FAIL; + } + GTP_INFO("Check /data mount timeout!"); + } else { + GTP_INFO("/data mounted!!!(%d/%d)", ts->clk_chk_fs_times, GTP_CHK_FS_MNT_MAX); + } + + clk_filp = filp_open(GTP_MAIN_CLK_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(clk_filp)) { + GTP_ERROR("%s is unavailable, calculate main clock", GTP_MAIN_CLK_PATH); + } else { + clk_filp->f_op->llseek(clk_filp, 0, SEEK_SET); + clk_filp->f_op->read(clk_filp, (char *)p_main_clk, 6, &clk_filp->f_pos); + + ret = gtp_verify_main_clk(p_main_clk); + if (FAIL == ret) { + + GTP_ERROR("main clock data in %s is wrong, recalculate main clock", GTP_MAIN_CLK_PATH); + } else { + GTP_INFO("main clock data in %s used, main clock freq: %d", GTP_MAIN_CLK_PATH, p_main_clk[0]); + filp_close(clk_filp, NULL); + goto update_main_clk; + } + } + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ret = gup_clk_calibration(); + gtp_esd_recovery(ts->client); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + + GTP_INFO("calibrate main clock: %d", ret); + if (ret < 50 || ret > 120) { + GTP_ERROR("wrong main clock: %d", ret); + goto exit_main_clk; + } + + + for (i = 0; i < 5; ++i) { + p_main_clk[i] = ret; + clk_chksum += p_main_clk[i]; + } + p_main_clk[5] = 0 - clk_chksum; + + if (!IS_ERR(clk_filp)) { + GTP_DEBUG("write main clock data into %s", GTP_MAIN_CLK_PATH); + clk_filp->f_op->llseek(clk_filp, 0, SEEK_SET); + clk_filp->f_op->write(clk_filp, (char *)p_main_clk, 6, &clk_filp->f_pos); + filp_close(clk_filp, NULL); + } + +update_main_clk: + ret = i2c_write_bytes(ts->client, GTP_REG_MAIN_CLK, p_main_clk, 6); + if (FAIL == ret) { + GTP_ERROR("update main clock failed!"); + return FAIL; + } + return SUCCESS; + +exit_main_clk: + if (!IS_ERR(clk_filp)) + filp_close(clk_filp, NULL); + return FAIL; +} + + +s32 gtp_gt9xxf_init(struct i2c_client *client) +{ + s32 ret = 0; + + ret = gup_fw_download_proc(NULL, GTP_FL_FW_BURN); + if (FAIL == ret) + return FAIL; + + ret = gtp_fw_startup(client); + if (FAIL == ret) + return FAIL; + return SUCCESS; +} + +void gtp_get_chip_type(struct goodix_ts_data *ts) +{ + u8 opr_buf[10] = {0x00}; + s32 ret = 0; + + msleep(10); + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CHIP_TYPE, opr_buf, 10); + + if (FAIL == ret) { + GTP_ERROR("Failed to get chip-type, set chip type default: GOODIX_GT9"); + ts->chip_type = CHIP_TYPE_GT9; + return; + } + + if (!memcmp(opr_buf, "GOODIX_GT9", 10)) { + ts->chip_type = CHIP_TYPE_GT9; + } else { + ts->chip_type = CHIP_TYPE_GT9F; + } + GTP_INFO("Chip Type: %s", (ts->chip_type == CHIP_TYPE_GT9) ? "GOODIX_GT9" : "GOODIX_GT9F"); +} +#endif + +/* + * Devices Tree support, +*/ +#ifdef GTP_CONFIG_OF +/** + * gtp_parse_dt - parse platform infomation form devices tree. + */ +static void gtp_parse_dt(struct device *dev) +{ + struct device_node *np = dev->of_node; + + gtp_int_gpio = of_get_named_gpio(np, "goodix,irq-gpio", 0); + gtp_rst_gpio = of_get_named_gpio(np, "goodix,rst-gpio", 0); + + /********************** add 2016.4.28 **************/ + + +} + +/** + * gtp_parse_dt_cfg - parse config data from devices tree. + * @dev: device that this driver attached. + * @cfg: pointer of the config array. + * @cfg_len: pointer of the config length. + * @sid: sensor id. + * Return: 0-succeed, -1-faileds + */ +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid) +{ + struct device_node *np = dev->of_node; + struct property *prop; + char cfg_name[18]; + + snprintf(cfg_name, sizeof(cfg_name), "goodix,cfg-group%d", sid); + prop = of_find_property(np, cfg_name, cfg_len); + if (!prop || !prop->value || *cfg_len == 0 || *cfg_len > GTP_CONFIG_MAX_LENGTH) { + return -EPERM;/* failed */ + } else { + memcpy(cfg, prop->value, *cfg_len); + return 0; + } +} + +/** + * gtp_power_switch - power switch . + * @on: 1-switch on, 0-switch off. + * return: 0-succeed, -1-faileds + */ +static int gtp_power_switch(struct i2c_client *client, int on) +{ + static struct regulator *vdd_ana; + static struct regulator *vcc_i2c; + int ret; + + if (!vdd_ana) { + vdd_ana = regulator_get(&client->dev, "vdd_ana"); + if (IS_ERR(vdd_ana)) { + GTP_ERROR("regulator get of vdd_ana failed"); + ret = PTR_ERR(vdd_ana); + vdd_ana = NULL; + return ret; + } + } + + if (!vcc_i2c) { + vcc_i2c = regulator_get(&client->dev, "vcc_i2c"); + if (IS_ERR(vcc_i2c)) { + GTP_ERROR("regulator get of vcc_i2c failed"); + ret = PTR_ERR(vcc_i2c); + vcc_i2c = NULL; + goto ERR_GET_VCC; + } + } + + if (on) { + GTP_DEBUG("GTP power on."); + ret = regulator_enable(vdd_ana); + udelay(2); + ret = regulator_enable(vcc_i2c); + } else { + GTP_DEBUG("GTP power off."); + ret = regulator_disable(vcc_i2c); + udelay(2); + ret = regulator_disable(vdd_ana); + } + return ret; + +ERR_GET_VCC: + regulator_put(vdd_ana); + return ret; +} +#endif + +#ifdef PMX_DRIVER_GT915L +static int goodix_ts_pinctrl_init(struct goodix_ts_data *goodix_data) +{ + int retval; + + goodix_data->ts_pinctrl = devm_pinctrl_get(&(goodix_data->client->dev)); + if (IS_ERR_OR_NULL(goodix_data->ts_pinctrl)) { + retval = PTR_ERR(goodix_data->ts_pinctrl); + dev_dbg(&goodix_data->client->dev, "Target does not use pinctrl %d\n", retval); + goto err_pinctrl_get; + } + goodix_data->pinctrl_state_active = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_ACTIVE); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_active)) { + retval = PTR_ERR(goodix_data->pinctrl_state_active); + dev_err(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_lookup; + } + + goodix_data->pinctrl_state_suspend = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_SUSPEND); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_suspend)) { + retval = PTR_ERR(goodix_data->pinctrl_state_suspend); + dev_err(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_SUSPEND, retval); + goto err_pinctrl_lookup; + } + + goodix_data->pinctrl_state_release = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_RELEASE); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_release)) { + retval = PTR_ERR(goodix_data->pinctrl_state_release); + dev_dbg(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_RELEASE, retval); + } + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(goodix_data->ts_pinctrl); +err_pinctrl_get: + goodix_data->ts_pinctrl = NULL; + return retval; +} + + +static void goodix_ts_pinctrl_free(struct goodix_ts_data *goodix_data) +{ + /* Put pinctrl if target uses pinctrl */ + if (!IS_ERR_OR_NULL(goodix_data->ts_pinctrl)) { + devm_pinctrl_put(goodix_data->ts_pinctrl); + goodix_data->ts_pinctrl = NULL; + } +} + +static int goodix_ts_pinctrl_select(struct goodix_ts_data *goodix_data, bool on) +{ + struct pinctrl_state *pins_state; + int ret; + + pins_state = on ? goodix_data->pinctrl_state_active + : goodix_data->pinctrl_state_suspend; + if (!IS_ERR_OR_NULL(pins_state)) { + ret = pinctrl_select_state(goodix_data->ts_pinctrl, pins_state); + if (ret) { + dev_err(&goodix_data->client->dev, + "can not set %s pins\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + return ret; + } + } else { + dev_err(&goodix_data->client->dev, + "not a valid '%s' pinstate\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + } + + return 0; +} + +#endif + + +void parse_cmdline_for_gt915(void) +{ + int ret; + char *cmdline_tp; + char *temp; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + if (ret == 0) { + gtp_ics_slot_report = 1;/* factory mode*/ + return; + } + } + gtp_ics_slot_report = 0; + return; +} + + +static int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, 10); + dev_err(&client->dev, "cmd_line =%s \n", cmd_line); + if (ret == 0) { + dev_err(&client->dev, "mode: ffbm\n"); + return 1;/* factory mode*/ + } else { + dev_err(&client->dev, "mode: no ffbm\n"); + return 2;/* no factory mode*/ + } + } + dev_err(&client->dev, "has no androidboot.mode \n"); + return 0; +} + + +static int gtp_read_lockdown_info(void) +{ + int ret, k; + char buf[2+GTP_LOCKDOWN_SIZE] = {GTP_READ_LOCKDOWN_INFO_ADDR >> 8, GTP_READ_LOCKDOWN_INFO_ADDR & 0xFF}; + + ret = gtp_i2c_read(i2c_connect_client, buf, GTP_LOCKDOWN_SIZE+2); + if (ret < 0) { + printk("Read Lockdown info error!"); + return -EPERM; + } + + for (k = 0; k < GTP_LOCKDOWN_SIZE; k++) { + lockdown_info[k] = buf[2+k]; + } + + TP_Maker = lockdown_info[0]; + LCD_Maker = lockdown_info[1]; + Panel_Ink = lockdown_info[2]; + tp_color = lockdown_info[2]; + GTP_INFO("Lockdown info: %02X %02X %02X %02X %02X %02X %02X %02X", + lockdown_info[0], lockdown_info[1], + lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], + lockdown_info[6], lockdown_info[7]); + + GTP_INFO("WT: TP_Maker = 0x%x\n", TP_Maker); + GTP_INFO("WT: LCD_Maker = 0x%x\n", LCD_Maker); + GTP_INFO("WT: Panel_Ink = 0x%x\n", Panel_Ink); + + return 0; +} + +int gtp_hardwareinfo_set(void) +{ + char color[HARDWARE_MAX_ITEM_LONGTH]; + char vendor[HARDWARE_MAX_ITEM_LONGTH]; + int ret; + u16 ic_ver; + gtp_read_lockdown_info(); + switch (tp_color) { + case TP_White: + snprintf(color, HARDWARE_MAX_ITEM_LONGTH, "White"); + break; + case TP_Black: + snprintf(color, HARDWARE_MAX_ITEM_LONGTH, "Black"); + break; + case TP_Golden: + snprintf(color, HARDWARE_MAX_ITEM_LONGTH, "Golden"); + break; + default: + snprintf(color, HARDWARE_MAX_ITEM_LONGTH, "Other Color"); + } + + switch (TP_Maker) { + case TP_BIEL: + snprintf(vendor, HARDWARE_MAX_ITEM_LONGTH, "BIEL"); + break; + default: + snprintf(vendor, HARDWARE_MAX_ITEM_LONGTH, "Other Vendor"); + } + + ret = gtp_i2c_read_dbl_check(i2c_client_point, GTP_REG_CONFIG_DATA, &cfg_version, 1); + if (ret == FAIL) { + printk("Read IC Config Version Error\n"); + return -EPERM; + } + + ret = gtp_read_version(i2c_client_point, &ic_ver); + if (ret < 0) { + GTP_ERROR("Read version failed."); + return -EPERM; + } + IC_Version = ic_ver; + + printk("IC Config Version: %x, V%d\n", IC_Version, cfg_version); + + + sprintf(tp_string_version, "%s, GT917D_%x, V%d, %s", vendor, IC_Version, cfg_version, color); + hardwareinfo_set_prop(HARDWARE_TP, tp_string_version); + return 0; +} + +/******************************************************* +Function: + I2c probe. +Input: + client: i2c device struct. + id: device id. +Output: + Executive outcomes. + 0: succeed. +*******************************************************/ +static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + s32 ret = -1; + struct goodix_ts_data *ts; + u16 version_info; +#ifdef PMX_DRIVER_GT915L + int err; +#endif + + GTP_DEBUG_FUNC(); + + + parse_cmdline_for_gt915(); + + + GTP_INFO("GTP Driver Version: %s", GTP_DRIVER_VERSION); + + GTP_INFO("GTP I2C Address: 0x%02x", client->addr); + + i2c_connect_client = client; + i2c_client_point = client; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + GTP_ERROR("I2C check functionality failed."); + return -ENODEV; + } + ts = kzalloc(sizeof(*ts), GFP_KERNEL); + if (ts == NULL) { + GTP_ERROR("Alloc GFP_KERNEL memory failed."); + return -ENOMEM; + } + + ts->client = client; + +#ifdef GTP_CONFIG_OF /* device tree support */ + if (client->dev.of_node) { + gtp_parse_dt(&client->dev); + } + ret = gtp_power_switch(client, 1); + if (ret) { + GTP_ERROR("GTP power on failed."); + return -EINVAL; + } +#else /* use gpio defined in gt9xx.h */ + gtp_rst_gpio = GTP_RST_PORT; + gtp_int_gpio = GTP_INT_PORT; +#endif + +#ifdef PMX_DRIVER_GT915L + err = goodix_ts_pinctrl_init(ts); + if (!err && ts->ts_pinctrl) { + ret = goodix_ts_pinctrl_select(ts, 1); + if (ret < 0) { + dev_err(&client->dev, "can not get idle pin state\n"); + goto gtp_power_off; + } +} + #endif + + INIT_WORK(&ts->work, goodix_ts_work_func); + ts->client = client; + spin_lock_init(&ts->irq_lock); + +#if GTP_ESD_PROTECT + ts->clk_tick_cnt = 2 * HZ; + GTP_DEBUG("Clock ticks for an esd cycle: %d", ts->clk_tick_cnt); + spin_lock_init(&ts->esd_lock); + +#endif + i2c_set_clientdata(client, ts); + ts->gtp_rawdiff_mode = 0; + ret = gtp_request_io_port(ts); + if (ret < 0) { + GTP_ERROR("GTP request IO port failed."); + kfree(ts); + return ret; + } + +#if GTP_COMPATIBLE_MODE + gtp_get_chip_type(ts); + if (CHIP_TYPE_GT9F == ts->chip_type) { + ret = gtp_gt9xxf_init(ts->client); + if (FAIL == ret) { + GTP_INFO("Failed to init GT9XXF."); + } + } +#endif + +#ifdef WT_COMPILE_FACTORY_VERSION + ret = gtp_read_version(client, &version_info); + if (ret < 0) { + GTP_ERROR("Read version failed."); + goto free_reset_irq_gpio; + } + + IC_Version = version_info; + + ret = gtp_i2c_test(client); + if (ret < 0) { + GTP_ERROR("I2C communication ERROR!"); + goto free_reset_irq_gpio; + } +#else + ret = gtp_i2c_test(client); + if (ret < 0) { + GTP_ERROR("I2C communication ERROR!"); + goto free_reset_irq_gpio; + } + + ret = gtp_read_version(client, &version_info); + if (ret < 0) { + GTP_ERROR("Read version failed."); + goto free_reset_irq_gpio; + } + + IC_Version = version_info; +#endif + + ret = gtp_init_panel(ts); + if (ret < 0) { + GTP_ERROR("GTP init panel failed."); + ts->abs_x_max = GTP_MAX_WIDTH; + ts->abs_y_max = GTP_MAX_HEIGHT; + ts->int_trigger_type = GTP_INT_TRIGGER; + } + + + gt91xx_config_proc = proc_create(GT91XX_CONFIG_PROC_FILE, 0666, NULL, &config_proc_ops); + if (gt91xx_config_proc == NULL) { + GTP_ERROR("create_proc_entry %s failed\n", GT91XX_CONFIG_PROC_FILE); + } else { + GTP_INFO("create proc entry %s success", GT91XX_CONFIG_PROC_FILE); + } + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif + +#if GTP_AUTO_UPDATE + +err = get_boot_mode(client); +if (err == 0) { + ret = gup_init_update_proc(ts); + if (ret < 0) { + GTP_ERROR("Create update thread error."); + } +} else { + GTP_INFO("not nomal_boot\n"); +} +#endif + + ret = gtp_request_input_dev(ts); + if (ret < 0) { + GTP_ERROR("GTP request input dev failed"); + } + + ret = gtp_request_irq(ts); + if (ret < 0) { + GTP_INFO("GTP works in polling mode."); + } else { + GTP_INFO("GTP works in interrupt mode."); + } + + if (ts->use_irq) { + gtp_irq_enable(ts); +#if GTP_GESTURE_WAKEUP + enable_irq_wake(client->irq); +#endif + } + +#if WT_ADD_CTP_INFO + gtp_hardwareinfo_set(); +#endif + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO + ctp_lockdown_fucntion_proc_file(); +#endif + + + /* register suspend and resume fucntion*/ + gtp_register_powermanger(ts); + +#if GTP_CREATE_WR_NODE + init_wr_node(client); +#endif + return 0; + + +free_reset_irq_gpio: + if (gpio_is_valid(gtp_rst_gpio)) + GTP_GPIO_FREE(gtp_rst_gpio); + if (ts->ts_pinctrl) { + err = goodix_ts_pinctrl_select(ts, false); + if (err < 0) + GTP_ERROR("Cannot get idle pinctrl state\n"); + } + + if (gpio_is_valid(gtp_int_gpio)) + GTP_GPIO_FREE(gtp_int_gpio); + if (ts->ts_pinctrl) { + err = goodix_ts_pinctrl_select(ts, false); + if (err < 0) + GTP_ERROR("Cannot get idle pinctrl state\n"); + } + + goodix_ts_pinctrl_free(ts); + +gtp_power_off: + gtp_power_switch(client, 0); + + return err; +} + + +/******************************************************* +Function: + Goodix touchscreen driver release function. +Input: + client: i2c device struct. +Output: + Executive outcomes. 0---succeed. +*******************************************************/ +static int goodix_ts_remove(struct i2c_client *client) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + GTP_DEBUG_FUNC(); + + gtp_unregister_powermanger(ts); + +#if GTP_CREATE_WR_NODE + uninit_wr_node(); +#endif + +#if GTP_ESD_PROTECT + destroy_workqueue(gtp_esd_check_workqueue); +#endif + + if (ts) { + if (ts->use_irq) { + GTP_GPIO_AS_INPUT(gtp_int_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + free_irq(client->irq, ts); + } else { + hrtimer_cancel(&ts->timer); + } + } + + GTP_INFO("GTP driver removing..."); + i2c_set_clientdata(client, NULL); + input_unregister_device(ts->input_dev); + kfree(ts); + + return 0; +} + + +/******************************************************* +Function: + Early suspend function. +Input: + h: early_suspend struct. +Output: + None. +*******************************************************/ +static void goodix_ts_suspend(struct goodix_ts_data *ts) +{ + s8 ret = -1; + + GTP_DEBUG_FUNC(); + if (ts->enter_update) { + return; + } + GTP_INFO("System suspend."); + + ts->gtp_is_suspend = 1; +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + + +#if GTP_GESTURE_WAKEUP +GTP_INFO("Gesture gtp_gesture_onoff :%c\n", gtp_gesture_onoff); +if ('1' == gtp_gesture_onoff) + ret = gtp_enter_doze(ts); +else +#endif +{ + if (ts->use_irq) { + gtp_irq_disable(ts); + } else { + hrtimer_cancel(&ts->timer); + } + ret = gtp_enter_sleep(ts); +} + + if (ret < 0) { + GTP_ERROR("GTP early suspend failed."); + } + + + msleep(58); +} + +/******************************************************* +Function: + Late resume function. +Input: + h: early_suspend struct. +Output: + None. +*******************************************************/ +static void goodix_ts_resume(struct goodix_ts_data *ts) +{ + s8 ret = -1; + + GTP_DEBUG_FUNC(); + if (ts->enter_update) { + return; + } + GTP_INFO("System resume."); + + ret = gtp_wakeup_sleep(ts); + +#if GTP_GESTURE_WAKEUP + doze_status = DOZE_DISABLED; +#endif + + if (ret < 0) { + GTP_ERROR("GTP later resume failed."); + } +#if (GTP_COMPATIBLE_MODE) + if (CHIP_TYPE_GT9F == ts->chip_type) { + + } else +#endif + { + gtp_send_cfg(ts->client); + } + + if (ts->use_irq) { + GTP_DEBUG("GTP use_irq."); + gtp_irq_enable(ts); + } else { + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + } + + ts->gtp_is_suspend = 0; +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif +} + + +#if defined(CONFIG_FB) +/* frame buffer notifier block control the suspend/resume procedure */ +static int gtp_fb_notifier_callback(struct notifier_block *noti, unsigned long event, void *data) +{ + struct fb_event *ev_data = data; + struct goodix_ts_data *ts = container_of(noti, struct goodix_ts_data, notifier); + int *blank; + + if (ev_data && ev_data->data && event == FB_EVENT_BLANK && ts) { + blank = ev_data->data; + if (*blank == FB_BLANK_UNBLANK) { + GTP_DEBUG("Resume by fb notifier."); + goodix_ts_resume(ts); + + } else if (*blank == FB_BLANK_POWERDOWN) { + GTP_DEBUG("Suspend by fb notifier."); + goodix_ts_suspend(ts); + } + } + + return 0; +} +#elif defined(CONFIG_PM) +/* bus control the suspend/resume procedure */ +static int gtp_pm_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts) { + GTP_DEBUG("Suspend by i2c pm."); + goodix_ts_suspend(ts); + } + + return 0; +} +static int gtp_pm_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts) { + GTP_DEBUG("Resume by i2c pm."); + goodix_ts_resume(ts); + } + + return 0; +} + +static struct dev_pm_ops gtp_pm_ops = { + .suspend = gtp_pm_suspend, + .resume = gtp_pm_resume, +}; + +#elif defined(CONFIG_HAS_EARLYSUSPEND) +/* earlysuspend module the suspend/resume procedure */ +static void gtp_early_suspend(struct early_suspend *h) +{ + struct goodix_ts_data *ts = container_of(h, struct goodix_ts_data, early_suspend); + + if (ts) { + GTP_DEBUG("Suspend by earlysuspend module."); + goodix_ts_suspend(ts); + } +} +static void gtp_early_resume(struct early_suspend *h) +{ + struct goodix_ts_data *ts = container_of(h, struct goodix_ts_data, early_suspend); + + if (ts) { + GTP_DEBUG("Resume by earlysuspend module."); + goodix_ts_resume(ts); + } +} +#endif + +static int gtp_register_powermanger(struct goodix_ts_data *ts) +{ +#if defined(CONFIG_FB) + ts->notifier.notifier_call = gtp_fb_notifier_callback; + fb_register_client(&ts->notifier); + +#elif defined(CONFIG_HAS_EARLYSUSPEND) + ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + ts->early_suspend.suspend = goodix_ts_early_suspend; + ts->early_suspend.resume = goodix_ts_late_resume; + register_early_suspend(&ts->early_suspend); +#endif + + return 0; +} + +static int gtp_unregister_powermanger(struct goodix_ts_data *ts) +{ +#if defined(CONFIG_FB) + fb_unregister_client(&ts->notifier); + +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&ts->early_suspend); +#endif + return 0; +} + +/* end */ + +#if GTP_ESD_PROTECT +s32 gtp_i2c_read_no_rst(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + if ((retries >= 5)) { + GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d!", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + } + return ret; +} + +s32 gtp_i2c_write_no_rst(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1) + break; + retries++; + } + if ((retries >= 5)) { + GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d!", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + } + return ret; +} +/******************************************************* +Function: + switch on & off esd delayed work +Input: + client: i2c device + on: SWITCH_ON / SWITCH_OFF +Output: + void +*********************************************************/ +void gtp_esd_switch(struct i2c_client *client, s32 on) +{ + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(client); + spin_lock(&ts->esd_lock); + + if (SWITCH_ON == on) { + if (!ts->esd_running) { + ts->esd_running = 1; + spin_unlock(&ts->esd_lock); + GTP_INFO("Esd started"); + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); + } else { + spin_unlock(&ts->esd_lock); + } + } else { + if (ts->esd_running) { + ts->esd_running = 0; + spin_unlock(&ts->esd_lock); + GTP_INFO("Esd cancelled"); + cancel_delayed_work_sync(>p_esd_check_work); + } else { + spin_unlock(&ts->esd_lock); + } + } +} + +/******************************************************* +Function: + Initialize external watchdog for esd protect +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ +static s32 gtp_init_ext_watchdog(struct i2c_client *client) +{ + u8 opr_buffer[3] = {0x80, 0x41, 0xAA}; + GTP_DEBUG("[Esd]Init external watchdog"); + return gtp_i2c_write_no_rst(client, opr_buffer, 3); +} + +/******************************************************* +Function: + Esd protect function. + External watchdog added by meta, 2013/03/07 +Input: + work: delayed work +Output: + None. +*******************************************************/ +static void gtp_esd_check_func(struct work_struct *work) +{ + s32 i; + s32 ret = -1; + struct goodix_ts_data *ts = NULL; + u8 esd_buf[5] = {0x80, 0x40}; + + GTP_DEBUG_FUNC(); + + ts = i2c_get_clientdata(i2c_connect_client); + + if (ts->gtp_is_suspend || ts->enter_update) { + GTP_INFO("Esd suspended!"); + return; + } + + for (i = 0; i < 3; i++) { + ret = gtp_i2c_read_no_rst(ts->client, esd_buf, 4); + + GTP_DEBUG("[Esd]0x8040 = 0x%02X, 0x8041 = 0x%02X", esd_buf[2], esd_buf[3]); + if ((ret < 0)) { + continue; + } else { + if ((esd_buf[2] == 0xAA) || (esd_buf[3] != 0xAA)) { + u8 chk_buf[4] = {0x80, 0x40}; + gtp_i2c_read_no_rst(ts->client, chk_buf, 4); + GTP_DEBUG("[Check]0x8040 = 0x%02X, 0x8041 = 0x%02X", chk_buf[2], chk_buf[3]); + if ((chk_buf[2] == 0xAA) || (chk_buf[3] != 0xAA)) { + i = 3; + break; + } else { + continue; + } + } else { + + esd_buf[2] = 0xAA; + gtp_i2c_write_no_rst(ts->client, esd_buf, 3); + break; + } + } + } + if (i >= 3) { + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + if (ts->rqst_processing) { + GTP_INFO("Request processing, no esd recovery"); + } else { + GTP_ERROR("IC working abnormally! Process esd recovery."); + esd_buf[0] = 0x42; + esd_buf[1] = 0x26; + esd_buf[2] = 0x01; + esd_buf[3] = 0x01; + esd_buf[4] = 0x01; + gtp_i2c_write_no_rst(ts->client, esd_buf, 5); + msleep(50); + #ifdef GTP_CONFIG_OF + gtp_power_switch(ts->client, 0); + msleep(20); + gtp_power_switch(ts->client, 1); + msleep(20); + #endif + gtp_esd_recovery(ts->client); + } + } else + #endif + { + GTP_ERROR("IC working abnormally! Process reset guitar."); + esd_buf[0] = 0x42; + esd_buf[1] = 0x26; + esd_buf[2] = 0x01; + esd_buf[3] = 0x01; + esd_buf[4] = 0x01; + gtp_i2c_write_no_rst(ts->client, esd_buf, 5); + msleep(50); + #ifdef GTP_CONFIG_OF + gtp_power_switch(ts->client, 0); + msleep(20); + gtp_power_switch(ts->client, 1); + msleep(20); + #endif + gtp_reset_guitar(ts->client, 50); + msleep(50); + gtp_send_cfg(ts->client); + } + } + + if (!ts->gtp_is_suspend) { + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); + } else { + GTP_INFO("Esd suspended!"); + } + return; +} +#endif + +#ifdef GTP_CONFIG_OF +static const struct of_device_id goodix_match_table[] = { + {.compatible = "goodix,gt9xx",}, + { }, +}; +#endif + +static const struct i2c_device_id goodix_ts_id[] = { + { GTP_I2C_NAME, 0 }, + { } +}; + +static struct i2c_driver goodix_ts_driver = { + .probe = goodix_ts_probe, + .remove = goodix_ts_remove, + .id_table = goodix_ts_id, + .driver = { + .name = GTP_I2C_NAME, + .owner = THIS_MODULE, +#ifdef GTP_CONFIG_OF + .of_match_table = goodix_match_table, +#endif +#if !defined(CONFIG_FB) && defined(CONFIG_PM) + .pm = >p_pm_ops, +#endif + }, +}; + +/******************************************************* +Function: + Driver Install function. +Input: + None. +Output: + Executive Outcomes. 0---succeed. +********************************************************/ + +static int __init goodix_ts_init(void) +{ + s32 ret; + + GTP_DEBUG_FUNC(); + GTP_INFO("GTP driver installing..."); + goodix_wq = create_singlethread_workqueue("goodix_wq"); + if (!goodix_wq) { + GTP_ERROR("Creat workqueue failed."); + return -ENOMEM; + } +#if GTP_ESD_PROTECT + INIT_DELAYED_WORK(>p_esd_check_work, gtp_esd_check_func); + gtp_esd_check_workqueue = create_workqueue("gtp_esd_check"); +#endif + ret = i2c_add_driver(&goodix_ts_driver); + return ret; +} + +/******************************************************* +Function: + Driver uninstall function. +Input: + None. +Output: + Executive Outcomes. 0---succeed. +********************************************************/ +static void __exit goodix_ts_exit(void) +{ + GTP_DEBUG_FUNC(); + GTP_INFO("GTP driver exited."); + i2c_del_driver(&goodix_ts_driver); + if (goodix_wq) { + destroy_workqueue(goodix_wq); + } +} + +device_initcall_sync(goodix_ts_init); +module_exit(goodix_ts_exit); + +MODULE_DESCRIPTION("GTP Series Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/GT917D/gt9xx.h b/drivers/input/touchscreen/GT917D/gt9xx.h new file mode 100644 index 0000000000000..c98ca79877bd7 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/gt9xx.h @@ -0,0 +1,349 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#ifndef _GOODIX_GT9XX_H_ +#define _GOODIX_GT9XX_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_OF +#include +#include +#endif +#ifdef CONFIG_FB +#include +#include +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#ifndef GTP_CONFIG_OF +#define GTP_CONFIG_OF +#endif + +#ifndef CONFIG_PM +#define CONFIG_PM +#endif + +#define PMX_DRIVER_GT915L + +/***************************PART1:ON/OFF define*******************************/ +#define GTP_CUSTOM_CFG 1 +#define GTP_CHANGE_X2Y 0 +#define GTP_DRIVER_SEND_CFG 1 +#define GTP_HAVE_TOUCH_KEY 1 +#define GTP_POWER_CTRL_SLEEP 0 +#define GTP_ICS_SLOT_REPORT 1 + +#define GTP_AUTO_UPDATE 1 +#define GTP_HEADER_FW_UPDATE 1 +#define GTP_AUTO_UPDATE_CFG 0 + +#define GTP_COMPATIBLE_MODE 0 + +#define GTP_CREATE_WR_NODE 1 +#define GTP_ESD_PROTECT 1 + +#define GTP_WITH_PEN 0 +#define GTP_PEN_HAVE_BUTTON 0 + +#define GTP_GESTURE_WAKEUP 1 +#if GTP_GESTURE_WAKEUP +#define GTP_GESTURE_TPYE_STR "RLUDKcemosvwz" +#define GTP_GESTURE_SUPPORT_ONOFF 'Y' +#define GTP_PROC_DRIVER_VERSION "GTP_V1.0_20160606" +#define GTP_GESTURE_MAX_POINT_COUNT 64 + +#define MXT_INPUT_EVENT_START 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define MXT_INPUT_EVENT_STYLUS_MODE_OFF 2 +#define MXT_INPUT_EVENT_STYLUS_MODE_ON 3 +#define MXT_INPUT_EVENT_WAKUP_MODE_OFF 4 +#define MXT_INPUT_EVENT_WAKUP_MODE_ON 5 +#define MXT_INPUT_EVENT_EDGE_DISABLE 6 +#define MXT_INPUT_EVENT_EDGE_FINGER 7 +#define MXT_INPUT_EVENT_EDGE_HANDGRIP 8 +#define MXT_INPUT_EVENT_EDGE_FINGER_HANDGRIP 9 +#define MXT_INPUT_EVENT_END 9 +#endif + +#define GTP_GLOVE_MODE 1 +#if GTP_GLOVE_MODE +#define GTP_GLOVE_SUPPORT_ONOFF 'Y' +#endif + +#define WT_ADD_CTP_INFO 1 + +#define GTP_DEBUG_ON 0 +#define GTP_DEBUG_ARRAY_ON 0 +#define GTP_DEBUG_FUNC_ON 0 + +#if GTP_COMPATIBLE_MODE +typedef enum +{ + CHIP_TYPE_GT9 = 0, + CHIP_TYPE_GT9F = 1, +} CHIP_TYPE_T; +#endif + +struct goodix_ts_data { + spinlock_t irq_lock; + struct i2c_client *client; + struct input_dev *input_dev; + struct hrtimer timer; + struct work_struct work; + s32 irq_is_disable; + s32 use_irq; + u16 abs_x_max; + u16 abs_y_max; + u8 max_touch_num; + u8 int_trigger_type; + u8 green_wake_mode; + u8 enter_update; + u8 gtp_is_suspend; + u8 gtp_rawdiff_mode; + int gtp_cfg_len; + u8 fw_error; + u8 pnl_init_error; + +#if defined(CONFIG_FB) + struct notifier_block notifier; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + +#if GTP_WITH_PEN + struct input_dev *pen_dev; +#endif + +#if GTP_ESD_PROTECT + spinlock_t esd_lock; + u8 esd_running; + s32 clk_tick_cnt; +#endif +#if GTP_COMPATIBLE_MODE + u16 bak_ref_len; + s32 ref_chk_fs_times; + s32 clk_chk_fs_times; + CHIP_TYPE_T chip_type; + u8 rqst_processing; + u8 is_950; +#endif + +#ifdef PMX_DRIVER_GT915L + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + struct pinctrl_state *pinctrl_state_release; + + struct pinctrl_state *pinctrl_state_int_active; + struct pinctrl_state *pinctrl_state_reset_active; +#endif +}; + +extern u16 show_len; +extern u16 total_len; + +extern unsigned int gtp_rst_gpio; +extern unsigned int gtp_int_gpio; + + +/*************************** PART2:TODO define **********************************/ +/* STEP_1(REQUIRED): Define Configuration Information Group(s) + sensor_opt1 sensor_opt2 Sensor_ID + GND GND 0 + VDDIO GND 1 + NC GND 2 + GND NC/300K 3 + VDDIO NC/300K 4 + NC NC/300K 5 +*/ + + +#define CTP_CFG_GROUP0 {\ +0x45,0xD0,0x02,0x00,0x05,0x0A,0x3C,0x4D,0x01,0xC8,0x28,0x0F,0x5A,0x3C,0x03,0x65,0x00,0x00,0x60,0x62,0x22,0x23,0x0A,0x15,0x16,0x28,0x14,0x87,0x26,0xCC,0x40,0x42,0xD3,0x07,0xD3,0x07,0x00,0x22,0x33,0x91,0x00,0x00,0x00,0x00,0x00,0x84,0xC4,0x0A,0x14,0x00,0x32,0x32,0x5A,0x94,0xD0,0x83,0x07,0x1E,0x00,0x04,0x94,0x35,0x00,0x88,0x3B,0x00,0x7B,0x43,0x00,0x72,0x4B,0x00,0x68,0x55,0x00,0x68,0x18,0x38,0x58,0x00,0x57,0x60,0x48,0xBB,0xBB,0x17,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x0F,0x28,0x00,0x00,0x00,0x00,0x00,0x0A,0x50,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x02,0x03,0x04,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x02,0x04,0x05,0x06,0x08,0x0A,0x1E,0x1F,0x20,0x22,0x24,0x28,0xFF,0xFF,0xFF,0xFF,0x78,0x31,0x00,0x00,0x00,0x87,0x70,0x12,0x00,0x28,0x32,0x3C,0x10,0x23,0x28,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x4B,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x4B,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x01,0x01,0x14,0x78,0x1C,0x1E,0x55,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x01} + + +#define CTP_CFG_GROUP1 {\ +0x41,0xD0,0x02,0x00,0x05,0x05,0x04,0xC1,0x12,0x0F,0x28,0x0A,0x50,0x32,0x03,0x05,0x00,0x00,0xFF,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x2C,0x0D,0x3C,0x3E,0xD3,0x07,0x0F,0x0F,0x00,0x99,0x33,0x10,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x29,0x28,0x5A,0x94,0x85,0x02,0x07,0x00,0x00,0x04,0xA9,0x2B,0x00,0x92,0x33,0x00,0x80,0x3C,0x00,0x71,0x46,0x00,0x63,0x53,0x00,0x63,0x18,0x38,0x58,0x00,0xF0,0x4A,0x3A,0x77,0x77,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x42,0xF8,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x50,0x3C,0x02,0x04,0x0A,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x08,0x06,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x5A,0x00,0x00,0x00,0x0F,0x10,0x12,0x13,0x14,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0x16,0x18,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x24,0x28,0x26,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x01\ + } + + +#define CTP_CFG_GROUP2 {\ +0x49,0xD0,0x02,0x00,0x05,0x0A,0x04,0xC1,0x12,0x3F,0x25,0x0A,0x5A,0x3C,0x03,0x05,0x00,0x00,0x00,0x67,0x11,0x11,0x30,0x00,0x00,0x00,0x00,0x8C,0x2C,0x0D,0x3C,0x3E,0xD3,0x07,0xD3,0x07,0x00,0x9A,0x33,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,0x28,0x5A,0x94,0x80,0x02,0x0B,0x00,0x00,0x04,0xA9,0x2B,0x00,0x92,0x33,0x1E,0x80,0x3C,0x00,0x71,0x46,0x00,0x63,0x53,0x00,0x63,0x18,0x38,0x58,0x00,0xF0,0x4A,0x3A,0x77,0x77,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x50,0x0F,0x00,0x00,0x50,0x3C,0x02,0x04,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x0A,0x08,0x06,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x18,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x28,0x26,0x24,0x0C,0x0A,0x0F,0x08,0x10,0x06,0x12,0x04,0x13,0x02,0x14,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x01\ +} + + +#define CTP_CFG_GROUP3 {\ +} + +#define CTP_CFG_GROUP4 {\ + } + + +#define CTP_CFG_GROUP5 {\ + } + + +#define CTP_CFG_GROUP1_GLOVE {\ +0x44,0x38,0x04,0x80,0x07,0x0A,0x04,0xC1,0x12,0x3F,0x28,0x0A,0x50,0x32,0x03,0x05,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x2C,0x0E,0x3C,0x3E,0xD3,0x07,0xD3,0x07,0x00,0xF8,0x33,0x90,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x29,0x32,0x5A,0x94,0x85,0x02,0x80,0x00,0x00,0x04,0x8C,0x35,0x00,0x81,0x3B,0x1E,0x76,0x43,0x00,0x6D,0x4B,0x00,0x65,0x55,0x00,0x65,0x18,0x40,0x60,0x00,0xF0,0x50,0x3A,0x77,0x77,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x67,0x00,0x00,0x00,0x06,0x00,0x42,0xF8,0x0F,0x00,0x0F,0x50,0x0F,0x00,0x00,0x50,0x3C,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x1C,0x0A,0x08,0x06,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x41,0x00,0x00,0x00,0x00,0x04,0x02,0x06,0x08,0x0A,0x0C,0x0F,0x10,0x12,0x13,0x14,0x28,0x26,0x24,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1C,0x18,0x16,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9A,0x01\ + } + +#define GTP_RST_PORT 16 +#define GTP_INT_PORT 17 + +#define GTP_GPIO_AS_INPUT(pin) do{\ + gpio_direction_input(pin);\ + }while(0) +#define GTP_GPIO_AS_INT(pin) do{\ + GTP_GPIO_AS_INPUT(pin);\ + }while(0) +#define GTP_GPIO_GET_VALUE(pin) gpio_get_value(pin) +#define GTP_GPIO_OUTPUT(pin,level) gpio_direction_output(pin,level) +#define GTP_GPIO_REQUEST(pin, label) gpio_request(pin, label) +#define GTP_GPIO_FREE(pin) gpio_free(pin) +#define GTP_IRQ_TAB {IRQ_TYPE_EDGE_RISING, IRQ_TYPE_EDGE_FALLING, IRQ_TYPE_LEVEL_LOW, IRQ_TYPE_LEVEL_HIGH} + + +#if GTP_CUSTOM_CFG + #define GTP_MAX_HEIGHT 1280 + #define GTP_MAX_WIDTH 720 + #define GTP_INT_TRIGGER 0 +#else + #define GTP_MAX_HEIGHT 1280 + #define GTP_MAX_WIDTH 720 + #define GTP_INT_TRIGGER 1 +#endif +#define GTP_MAX_TOUCH 10 + + +#if GTP_HAVE_TOUCH_KEY + + #define GTP_KEY_TAB {KEY_MENU, KEY_HOMEPAGE, KEY_BACK} +#endif + +/***************************PART3:OTHER define*********************************/ +#define GTP_DRIVER_VERSION "V2.4<2014/11/28>" +#define GTP_I2C_NAME "Goodix-TS" +#define GT91XX_CONFIG_PROC_FILE "gt9xx_config" +#define GTP_POLL_TIME 10 +#define GTP_ADDR_LENGTH 2 +#define GTP_CONFIG_MIN_LENGTH 186 +#define GTP_CONFIG_MAX_LENGTH 240 +#define FAIL 0 +#define SUCCESS 1 +#define SWITCH_OFF 0 +#define SWITCH_ON 1 + +/******************** For GT9XXF Start **********************/ +#define GTP_REG_BAK_REF 0x99D0 +#define GTP_REG_MAIN_CLK 0x8020 +#define GTP_REG_CHIP_TYPE 0x8000 +#define GTP_REG_HAVE_KEY 0x804E +#define GTP_REG_MATRIX_DRVNUM 0x8069 +#define GTP_REG_MATRIX_SENNUM 0x806A + +#define GTP_FL_FW_BURN 0x00 +#define GTP_FL_ESD_RECOVERY 0x01 +#define GTP_FL_READ_REPAIR 0x02 + +#define GTP_BAK_REF_SEND 0 +#define GTP_BAK_REF_STORE 1 +#define CFG_LOC_DRVA_NUM 29 +#define CFG_LOC_DRVB_NUM 30 +#define CFG_LOC_SENS_NUM 31 + +#define GTP_CHK_FW_MAX 40 +#define GTP_CHK_FS_MNT_MAX 300 +#define GTP_BAK_REF_PATH "/data/gtp_ref.bin" +#define GTP_MAIN_CLK_PATH "/data/gtp_clk.bin" +#define GTP_RQST_CONFIG 0x01 +#define GTP_RQST_BAK_REF 0x02 +#define GTP_RQST_RESET 0x03 +#define GTP_RQST_MAIN_CLOCK 0x04 +#define GTP_RQST_RESPONDED 0x00 +#define GTP_RQST_IDLE 0xFF + +/******************** For GT9XXF End **********************/ + +#define GTP_READ_COOR_ADDR 0x814E +#define GTP_REG_SLEEP 0x8040 +#define GTP_REG_SENSOR_ID 0x814A +#define GTP_REG_CONFIG_DATA 0x8047 +#define GTP_REG_VERSION 0x8140 + +#define RESOLUTION_LOC 3 +#define TRIGGER_LOC 8 + +#define CFG_GROUP_LEN(p_cfg_grp) (sizeof(p_cfg_grp) / sizeof(p_cfg_grp[0])) + +#define GTP_INFO(fmt,arg...) printk("<<-GTP-INFO->> "fmt"\n",##arg) +#define GTP_ERROR(fmt,arg...) printk("<<-GTP-ERROR->> "fmt"\n",##arg) +#define GTP_DEBUG(fmt,arg...) do{\ + if(GTP_DEBUG_ON)\ + printk("<<-GTP-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\ + }while(0) +#define GTP_DEBUG_ARRAY(array, num) do{\ + s32 i;\ + u8* a = array;\ + if(GTP_DEBUG_ARRAY_ON)\ + {\ + printk("<<-GTP-DEBUG-ARRAY->>\n");\ + for (i = 0; i < (num); i++)\ + {\ + printk("%02x ", (a)[i]);\ + if ((i + 1 ) %10 == 0)\ + {\ + printk("\n");\ + }\ + }\ + printk("\n");\ + }\ + }while(0) +#define GTP_DEBUG_FUNC() do{\ + if(GTP_DEBUG_FUNC_ON)\ + printk("<<-GTP-FUNC->> Func:%s@Line:%d\n",__func__,__LINE__);\ + }while(0) +#define GTP_SWAP(x, y) do{\ + typeof(x) z = x;\ + x = y;\ + y = z;\ + }while (0) + +/*****************************End of Part III********************************/ +#ifdef CONFIG_OF +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid); +#endif +#endif /* _GOODIX_GT9XX_H_ */ diff --git a/drivers/input/touchscreen/GT917D/gt9xx_firmware.h b/drivers/input/touchscreen/GT917D/gt9xx_firmware.h new file mode 100644 index 0000000000000..53c2517e9dc88 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/gt9xx_firmware.h @@ -0,0 +1,42 @@ +/* Copyright Statement: + * This firmware are protected under relevant copyright laws,this information contained + * herein is confidential and proprietary to Goodix. + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * + * WARNING:The GTP_COMPATIBLE_MODE part of this file was generated by the specialized tools, + * please do not modify it manually! + * +*/ + +#ifndef _GT9XX_FIRMWARE_H_ +#define _GT9XX_FIRMWARE_H_ + + +#if GTP_HEADER_FW_UPDATE + + +#define WT_ADD_FW_BIEL + +unsigned char gtp_default_FW[] = { + +#ifdef WT_ADD_FW_EACH + #include "FW_EACH.txt" +#elif defined WT_ADD_FW_BIEL + #include "FW_BIEL.txt" +#endif +}; +#endif + +/* +*[HW INFO]00900600 +*[PID]910 +*[VID]1010 +*[GENERATED]2013/08/27 20:59:13 +*/ +#if GTP_COMPATIBLE_MODE +unsigned char gtp_default_FW_fl[] = { +}; +#endif + +#endif diff --git a/drivers/input/touchscreen/GT917D/gt9xx_update.c b/drivers/input/touchscreen/GT917D/gt9xx_update.c new file mode 100644 index 0000000000000..21ac5a609ee20 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/gt9xx_update.c @@ -0,0 +1,3251 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#include +#include "gt9xx.h" + +#include +#include +#if ((GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) || GTP_COMPATIBLE_MODE) + #include "gt9xx_firmware.h" +#endif + +#define GUP_REG_HW_INFO 0x4220 +#define GUP_REG_FW_MSG 0x41E4 +#define GUP_REG_PID_VID 0x8140 + +#define GUP_SEARCH_FILE_TIMES 50 + +#define UPDATE_FILE_PATH_1 "/data/_goodix_update_.bin" +#define UPDATE_FILE_PATH_2 "/sdcard/_goodix_update_.bin" + +#define CONFIG_FILE_PATH_1 "/data/_goodix_config_.cfg" +#define CONFIG_FILE_PATH_2 "/sdcard/_goodix_config_.cfg" + +#define FW_HEAD_LENGTH 14 +#define FW_SECTION_LENGTH 0x2000 +#define FW_DSP_ISP_LENGTH 0x1000 +#define FW_DSP_LENGTH 0x1000 +#define FW_BOOT_LENGTH 0x800 +#define FW_SS51_LENGTH (4 * FW_SECTION_LENGTH) +#define FW_BOOT_ISP_LENGTH 0x800 +#define FW_GLINK_LENGTH 0x3000 +#define FW_GWAKE_LENGTH (4 * FW_SECTION_LENGTH) + +#define PACK_SIZE 256 +#define MAX_FRAME_CHECK_TIME 5 + + +#define _bRW_MISCTL__SRAM_BANK 0x4048 +#define _bRW_MISCTL__MEM_CD_EN 0x4049 +#define _bRW_MISCTL__CACHE_EN 0x404B +#define _bRW_MISCTL__TMR0_EN 0x40B0 +#define _rRW_MISCTL__SWRST_B0_ 0x4180 +#define _bWO_MISCTL__CPU_SWRST_PULSE 0x4184 +#define _rRW_MISCTL__BOOTCTL_B0_ 0x4190 +#define _rRW_MISCTL__BOOT_OPT_B0_ 0x4218 +#define _rRW_MISCTL__BOOT_CTL_ 0x5094 + +#define AUTO_SEARCH_BIN 0x01 +#define AUTO_SEARCH_CFG 0x02 +#define BIN_FILE_READY 0x80 +#define CFG_FILE_READY 0x08 +#define HEADER_FW_READY 0x00 + +#pragma pack(1) +typedef struct { + u8 hw_info[4]; + u8 pid[8]; + u16 vid; +} st_fw_head; +#pragma pack() + +typedef struct { + u8 force_update; + u8 fw_flag; + struct file *file; + struct file *cfg_file; + st_fw_head ic_fw_msg; + mm_segment_t old_fs; + u32 fw_total_len; + u32 fw_burned_len; +} st_update_msg; + +st_update_msg update_msg; +u16 show_len; +u16 total_len; +u8 got_file_flag = 0; +u8 searching_file = 0; + + +int FW_VERSION_ID; +static u8 GTP_FW_SENSOR_ID; + +#if WT_ADD_CTP_INFO +extern int gtp_hardwareinfo_set(void); +#endif + +extern u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH]; +extern void gtp_reset_guitar(struct i2c_client *client, s32 ms); +extern s32 gtp_send_cfg(struct i2c_client *client); +extern s32 gtp_read_version(struct i2c_client *, u16*); +extern struct i2c_client *i2c_connect_client; +extern void gtp_irq_enable(struct goodix_ts_data *ts); +extern void gtp_irq_disable(struct goodix_ts_data *ts); +extern s32 gtp_i2c_read_dbl_check(struct i2c_client *, u16, u8 *, int); +static u8 gup_burn_fw_gwake_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd); + +#define _CLOSE_FILE(p_file) if (p_file && !IS_ERR(p_file)) \ + { \ + filp_close(p_file, NULL); \ + } + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *, s32); +#endif + +#if GTP_COMPATIBLE_MODE +s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +#endif +/******************************************************* +Function: + Read data from the i2c slave device. +Input: + client: i2c device. + buf[0~1]: read start address. + buf[2~len-1]: read data buffer. + len: GTP_ADDR_LENGTH + read bytes count +Output: + numbers of i2c_msgs to transfer: + 2: succeed, otherwise: failed +*********************************************************/ +s32 gup_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + + return ret; +} + +/******************************************************* +Function: + Write data to the i2c slave device. +Input: + client: i2c device. + buf[0~1]: write start address. + buf[2~len-1]: data buffer + len: GTP_ADDR_LENGTH + write bytes count +Output: + numbers of i2c_msgs to transfer: + 1: succeed, otherwise: failed +*********************************************************/ +s32 gup_i2c_write(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1) + break; + retries++; + } + + return ret; +} + +static s32 gup_init_panel(struct goodix_ts_data *ts) +{ + s32 ret = 0; + s32 i = 0; + u8 check_sum = 0; + u8 opr_buf[16]; + u8 sensor_id = 0; + u16 version = 0; + u8 drv_cfg_version; + u8 flash_cfg_version; + +#ifndef GTP_CONFIG_OF + u8 cfg_info_group0[] = CTP_CFG_GROUP0; + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + u8 *send_cfg_buf[] = {cfg_info_group0, cfg_info_group1, + cfg_info_group2, cfg_info_group3, + cfg_info_group4, cfg_info_group5}; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group0), + CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5)}; + #endif + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) { + if (sensor_id >= 0x06) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + return -EPERM; + } + } else { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + return -EPERM; + } + + /* parse config data*/ +#ifdef GTP_CONFIG_OF + GTP_DEBUG("Get config data from dts file."); + ret = gtp_parse_dt_cfg(&ts->client->dev, &config[GTP_ADDR_LENGTH], &ts->gtp_cfg_len, sensor_id); + if (ret < 0) { + GTP_ERROR("Failed to parse config data form dts file."); + ts->pnl_init_error = 1; + return -EPERM; + } +#else + GTP_DEBUG("Get config data from header file."); + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) { + sensor_id = 0; + } + ts->gtp_cfg_len = cfg_info_len[sensor_id]; + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len); +#endif + + GTP_DEBUG("Sensor_ID: %d", sensor_id); + + if (ts->gtp_cfg_len < GTP_CONFIG_MIN_LENGTH) { + GTP_ERROR("Sensor_ID(%d) matches with NULL or INVALID CONFIG GROUP! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id); + return -EPERM; + } + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + if (ret == SUCCESS) { + GTP_DEBUG("CFG_GROUP%d Config Version: %d, IC Config Version: %d", sensor_id, + config[GTP_ADDR_LENGTH], opr_buf[0]); + + flash_cfg_version = opr_buf[0]; + drv_cfg_version = config[GTP_ADDR_LENGTH]; + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + config[GTP_ADDR_LENGTH] = 0x00; + } + } else { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -EPERM; + } + + GTP_DEBUG("X_MAX = %d, Y_MAX = %d, TRIGGER = 0x%02x", + ts->abs_x_max, ts->abs_y_max, ts->int_trigger_type); + + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) { + config[TRIGGER_LOC] &= 0xfe; + } else if (GTP_INT_TRIGGER == 1) { + config[TRIGGER_LOC] |= 0x01; + } + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + + GTP_DEBUG_FUNC(); + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Send config error."); + } + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + check_sum = 0; + config[GTP_ADDR_LENGTH] = drv_cfg_version; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + } + gtp_read_version(ts->client, &version); + msleep(10); + return 0; +} + + +static u8 gup_get_ic_msg(struct i2c_client *client, u16 addr, u8 *msg, s32 len) +{ + s32 i = 0; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + + for (i = 0; i < 5; i++) { + if (gup_i2c_read(client, msg, GTP_ADDR_LENGTH + len) > 0) { + break; + } + } + + if (i >= 5) { + GTP_ERROR("Read data from 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_set_ic_msg(struct i2c_client *client, u16 addr, u8 val) +{ + s32 i = 0; + u8 msg[3]; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + msg[2] = val; + + for (i = 0; i < 5; i++) { + if (gup_i2c_write(client, msg, GTP_ADDR_LENGTH + 1) > 0) { + break; + } + } + + if (i >= 5) { + GTP_ERROR("Set data to 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_get_ic_fw_msg(struct i2c_client *client) +{ + s32 ret = -1; + u8 retry = 0; + u8 buf[16]; + u8 i; + + + ret = gtp_i2c_read_dbl_check(client, GUP_REG_HW_INFO, &buf[GTP_ADDR_LENGTH], 4); + if (FAIL == ret) { + GTP_ERROR("[get_ic_fw_msg]get hw_info failed,exit"); + return FAIL; + } + + + + for (i = 0; i < 4; i++) { + update_msg.ic_fw_msg.hw_info[i] = buf[GTP_ADDR_LENGTH + 3 - i]; + } + GTP_DEBUG("IC Hardware info:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + + for (retry = 0; retry < 2; retry++) { + ret = gup_get_ic_msg(client, GUP_REG_FW_MSG, buf, 1); + if (FAIL == ret) { + GTP_ERROR("Read firmware message fail."); + return ret; + } + + update_msg.force_update = buf[GTP_ADDR_LENGTH]; + if ((0xBE != update_msg.force_update) && (!retry)) { + GTP_INFO("The check sum in ic is error."); + GTP_INFO("The IC will be updated by force."); + continue; + } + break; + } + GTP_DEBUG("IC force update flag:0x%x", update_msg.force_update); + + + ret = gtp_i2c_read_dbl_check(client, GUP_REG_PID_VID, &buf[GTP_ADDR_LENGTH], 6); + if (FAIL == ret) { + GTP_ERROR("[get_ic_fw_msg]get pid & vid failed,exit"); + return FAIL; + } + + memset(update_msg.ic_fw_msg.pid, 0, sizeof(update_msg.ic_fw_msg.pid)); + memcpy(update_msg.ic_fw_msg.pid, &buf[GTP_ADDR_LENGTH], 4); + GTP_DEBUG("IC Product id:%s", update_msg.ic_fw_msg.pid); + + + /*|-----FLASH-----RAM-----| + |------918------918-----| + |------968------968-----| + |------913------913-----| + |------913P-----913P----| + |------927------927-----| + |------927P-----927P----| + |------9110-----9110----| + |------9110P----9111----|*/ + if (update_msg.ic_fw_msg.pid[0] != 0) { + if (!memcmp(update_msg.ic_fw_msg.pid, "9111", 4)) { + GTP_DEBUG("IC Mapping Product id:%s", update_msg.ic_fw_msg.pid); + memcpy(update_msg.ic_fw_msg.pid, "9110P", 5); + } + } + + update_msg.ic_fw_msg.vid = buf[GTP_ADDR_LENGTH+4] + (buf[GTP_ADDR_LENGTH+5]<<8); + GTP_DEBUG("IC version id:%04x", update_msg.ic_fw_msg.vid); + + return SUCCESS; +} + +s32 gup_enter_update_mode(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_int_gpio, (client->addr == 0x14)); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + + msleep(5); + while (retry++ < 200) { + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if (0x0C == rd_buf[GTP_ADDR_LENGTH]) { + GTP_DEBUG("Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if (retry >= 200) { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, 0x4010, 0x00); + + + return ret; +} + +void gup_leave_update_mode(void) +{ + GTP_GPIO_AS_INT(gtp_int_gpio); + + GTP_DEBUG("[leave_update_mode]reset chip."); + gtp_reset_guitar(i2c_connect_client, 20); +} + + + + + + + +/* Update Conditions: + 1. Same hardware info + 2. Same PID + 3. File VID > IC VID + Force Update Conditions: + 1. Wrong ic firmware checksum + 2. INVALID IC PID or VID + 3. (IC PID == 91XX || File PID == 91XX) && (File VID > IC VID) +*/ + +static u8 gup_enter_update_judge(st_fw_head *fw_head) +{ + u16 u16_tmp; + s32 i = 0; + u32 fw_len = 0; + s32 pid_cmp_len = 0; + u16_tmp = fw_head->vid; + fw_head->vid = (u16)(u16_tmp>>8) + (u16)(u16_tmp<<8); + + GTP_INFO("FILE HARDWARE INFO:%02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID:%s", fw_head->pid); + GTP_INFO("FILE VID:%04x", fw_head->vid); + GTP_INFO("IC HARDWARE INFO:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + GTP_INFO("IC PID:%s", update_msg.ic_fw_msg.pid); + GTP_INFO("IC VID:%04x", update_msg.ic_fw_msg.vid); + + if (!memcmp(fw_head->pid, "9158", 4) && !memcmp(update_msg.ic_fw_msg.pid, "915S", 4)) { + GTP_INFO("Update GT915S to GT9158 directly!"); + return SUCCESS; + } + + if (!memcmp(fw_head->hw_info, update_msg.ic_fw_msg.hw_info, sizeof(update_msg.ic_fw_msg.hw_info))) { + fw_len = 42 * 1024; + } else { + fw_len = fw_head->hw_info[3]; + fw_len += (((u32)fw_head->hw_info[2]) << 8); + fw_len += (((u32)fw_head->hw_info[1]) << 16); + fw_len += (((u32)fw_head->hw_info[0]) << 24); + } + if (update_msg.fw_total_len != fw_len) { + GTP_ERROR("Inconsistent firmware size, Update aborted! Default size: %d(%dK), actual size: %d(%dK)", fw_len, fw_len/1024, update_msg.fw_total_len, update_msg.fw_total_len/1024); + return FAIL; + } + GTP_INFO("Firmware length:%d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + + if (update_msg.force_update != 0xBE) { + GTP_INFO("FW chksum error,need enter update."); + return SUCCESS; + } + + + if (strlen(update_msg.ic_fw_msg.pid) < 3) { + GTP_INFO("Illegal IC pid, need enter update"); + return SUCCESS; + } else { + for (i = 0; i < 3; i++) { + if ((update_msg.ic_fw_msg.pid[i] < 0x30) || (update_msg.ic_fw_msg.pid[i] > 0x39)) { + GTP_INFO("Illegal IC pid, out of bound, need enter update"); + return SUCCESS; + } + } + } + + + pid_cmp_len = strlen(fw_head->pid); + if (pid_cmp_len < strlen(update_msg.ic_fw_msg.pid)) { + pid_cmp_len = strlen(update_msg.ic_fw_msg.pid); + } + + if ((!memcmp(fw_head->pid, update_msg.ic_fw_msg.pid, pid_cmp_len)) || + (!memcmp(update_msg.ic_fw_msg.pid, "91XX", 4)) || + (!memcmp(fw_head->pid, "91XX", 4))) { + if (!memcmp(fw_head->pid, "91XX", 4)) { + GTP_DEBUG("Force none same pid update mode."); + } else { + GTP_DEBUG("Get the same pid."); + } + + + if (fw_head->vid > update_msg.ic_fw_msg.vid) { + GTP_INFO("Need enter update."); + return SUCCESS; + } + GTP_ERROR("Don't meet the third condition."); + GTP_ERROR("File VID <= Ic VID, update aborted!"); + } else { + GTP_ERROR("File PID != Ic PID, update aborted!"); + } + + return FAIL; +} + + + +#if GTP_AUTO_UPDATE_CFG +static u8 ascii2hex(u8 a) +{ + s8 value = 0; + + if (a >= '0' && a <= '9') { + value = a - '0'; + } else if (a >= 'A' && a <= 'F') { + value = a - 'A' + 0x0A; + } else if (a >= 'a' && a <= 'f') { + value = a - 'a' + 0x0A; + } else { + value = 0xff; + } + + return value; +} + +static s8 gup_update_config(struct i2c_client *client) +{ + s32 file_len = 0; + s32 ret = 0; + s32 i = 0; + s32 file_cfg_len = 0; + s32 chip_cfg_len = 0; + s32 count = 0; + u8 *buf; + u8 *pre_buf; + u8 *file_config; + + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (NULL == update_msg.cfg_file) { + GTP_ERROR("[update_cfg]No need to upgrade config!"); + return FAIL; + } + file_len = update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_END); + + chip_cfg_len = ts->gtp_cfg_len; + + GTP_DEBUG("[update_cfg]config file len:%d", file_len); + GTP_DEBUG("[update_cfg]need config len:%d", chip_cfg_len); + if ((file_len+5) < chip_cfg_len*5) { + GTP_ERROR("Config length error"); + return -EPERM; + } + + buf = (u8 *)kzalloc(file_len, GFP_KERNEL); + pre_buf = (u8 *)kzalloc(file_len, GFP_KERNEL); + file_config = (u8 *)kzalloc(chip_cfg_len + GTP_ADDR_LENGTH, GFP_KERNEL); + update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_SET); + + GTP_DEBUG("[update_cfg]Read config from file."); + ret = update_msg.cfg_file->f_op->read(update_msg.cfg_file, (char *)pre_buf, file_len, &update_msg.cfg_file->f_pos); + if (ret < 0) { + GTP_ERROR("[update_cfg]Read config file failed."); + goto update_cfg_file_failed; + } + + GTP_DEBUG("[update_cfg]Delete illgal charactor."); + for (i = 0, count = 0; i < file_len; i++) { + if (pre_buf[i] == ' ' || pre_buf[i] == '\r' || pre_buf[i] == '\n') { + continue; + } + buf[count++] = pre_buf[i]; + } + + GTP_DEBUG("[update_cfg]Ascii to hex."); + file_config[0] = GTP_REG_CONFIG_DATA >> 8; + file_config[1] = GTP_REG_CONFIG_DATA & 0xff; + for (i = 0, file_cfg_len = GTP_ADDR_LENGTH; i < count; i += 5) { + if ((buf[i] == '0') && ((buf[i+1] == 'x') || (buf[i+1] == 'X'))) { + u8 high, low; + high = ascii2hex(buf[i+2]); + low = ascii2hex(buf[i+3]); + + if ((high == 0xFF) || (low == 0xFF)) { + ret = 0; + GTP_ERROR("[update_cfg]Illegal config file."); + goto update_cfg_file_failed; + } + file_config[file_cfg_len++] = (high<<4) + low; + } else { + ret = 0; + GTP_ERROR("[update_cfg]Illegal config file."); + goto update_cfg_file_failed; + } + } + + + GTP_DEBUG("config:"); + GTP_DEBUG_ARRAY(file_config+2, file_cfg_len); + + i = 0; + while (i++ < 5) { + ret = gup_i2c_write(client, file_config, file_cfg_len); + if (ret > 0) { + GTP_INFO("[update_cfg]Send config SUCCESS."); + break; + } + GTP_ERROR("[update_cfg]Send config i2c error."); + } + +update_cfg_file_failed: + kfree(pre_buf); + kfree(buf); + kfree(file_config); + return ret; +} + +#endif + +#if (GTP_AUTO_UPDATE && (!GTP_HEADER_FW_UPDATE || GTP_AUTO_UPDATE_CFG)) +static void gup_search_file(s32 search_type) +{ + s32 i = 0; + struct file *pfile = NULL; + + got_file_flag = 0x00; + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) { + if (0 == searching_file) { + GTP_INFO("Force exiting file searching"); + got_file_flag = 0x00; + return; + } + + if (search_type & AUTO_SEARCH_BIN) { + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", UPDATE_FILE_PATH_1, UPDATE_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(UPDATE_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pfile = filp_open(UPDATE_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_2); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + } else { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_1); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + if (got_file_flag & BIN_FILE_READY) { + #if GTP_AUTO_UPDATE_CFG + if (search_type & AUTO_SEARCH_CFG) { + i = GUP_SEARCH_FILE_TIMES; + } else + #endif + { + searching_file = 0; + return; + } + } + } + + #if GTP_AUTO_UPDATE_CFG + if ((search_type & AUTO_SEARCH_CFG) && !(got_file_flag & CFG_FILE_READY)) { + GTP_DEBUG("Search for %s, %s for config update.(%d/%d)", CONFIG_FILE_PATH_1, CONFIG_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(CONFIG_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pfile = filp_open(CONFIG_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_2); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + } else { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_1); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + if (got_file_flag & CFG_FILE_READY) { + searching_file = 0; + return; + } + } + #endif + msleep(3000); + } + searching_file = 0; +} +#endif + + +static u8 gup_check_update_file(struct i2c_client *client, st_fw_head *fw_head, u8 *path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + u8 buf[FW_HEAD_LENGTH]; + + got_file_flag = 0x00; + if (path) { + GTP_DEBUG("Update File path:%s, %ld", path, strlen(path)); + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + got_file_flag = BIN_FILE_READY; + } else { +#if GTP_AUTO_UPDATE + #if GTP_HEADER_FW_UPDATE + + + ret = gtp_i2c_read_dbl_check(client, GTP_REG_SENSOR_ID, >P_FW_SENSOR_ID, 1); + if (SUCCESS == ret) { + if (GTP_FW_SENSOR_ID >= 0x09) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", GTP_FW_SENSOR_ID); + + } + } + + if (GTP_FW_SENSOR_ID == 0x2) { + GTP_INFO("Update GT915L FW, Sensor ID : %d", GTP_FW_SENSOR_ID); + } else { + GTP_INFO("Force Upgrade Error !"); + + } + + GTP_INFO("Update by default firmware array"); + update_msg.fw_total_len = sizeof(gtp_default_FW) - FW_HEAD_LENGTH; + if (sizeof(gtp_default_FW) < (FW_HEAD_LENGTH+FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) { + GTP_ERROR("INVALID gtp_default_FW, check your gt9xx_firmware.h file!"); + return FAIL; + } + GTP_DEBUG("Firmware actual size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + memcpy(fw_head, >p_default_FW[0], FW_HEAD_LENGTH); + + + fw_checksum = 0; + for (i = 0; i < update_msg.fw_total_len; i += 2) { + fw_checksum += (gtp_default_FW[FW_HEAD_LENGTH + i] << 8) + gtp_default_FW[FW_HEAD_LENGTH + i + 1]; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if (fw_checksum&0xFFFF) { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + got_file_flag = HEADER_FW_READY; + return SUCCESS; + #else + + #if GTP_AUTO_UPDATE_CFG + gup_search_file(AUTO_SEARCH_BIN | AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) { + ret = gup_update_config(i2c_connect_client); + if (ret <= 0) { + GTP_ERROR("Update config failed."); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); + } + #else + gup_search_file(AUTO_SEARCH_BIN); + #endif + + if (!(got_file_flag & BIN_FILE_READY)) { + GTP_ERROR("No bin file for fw update"); + return FAIL; + } + #endif + +#else + { + GTP_ERROR("NULL file for firmware update"); + return FAIL; + } +#endif + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.fw_total_len = update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_END); + if (update_msg.fw_total_len < (FW_HEAD_LENGTH + FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) { + GTP_ERROR("INVALID bin file(size: %d), update aborted.", update_msg.fw_total_len); + return FAIL; + } + + update_msg.fw_total_len -= FW_HEAD_LENGTH; + + GTP_DEBUG("Bin firmware actual size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, FW_HEAD_LENGTH, &update_msg.file->f_pos); + if (ret < 0) { + GTP_ERROR("Read firmware head in update file error."); + return FAIL; + } + + memcpy(fw_head, buf, FW_HEAD_LENGTH); + + + fw_checksum = 0; + for (i = 0; i < update_msg.fw_total_len; i += 2) { + u16 temp; + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, 2, &update_msg.file->f_pos); + if (ret < 0) { + GTP_ERROR("Read firmware file error."); + return FAIL; + } + + temp = (buf[0]<<8) + buf[1]; + fw_checksum += temp; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if (fw_checksum&0xFFFF) { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_proc(struct i2c_client *client, u8 *burn_buf, u16 start_addr, u16 total_length) +{ + s32 ret = 0; + u16 burn_addr = start_addr; + u16 frame_length = 0; + u16 burn_length = 0; + u8 wr_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 retry = 0; + + GTP_DEBUG("Begin burn %dk data to addr 0x%x", (total_length/1024), start_addr); + while (burn_length < total_length) { + GTP_DEBUG("B/T:%04d/%04d", burn_length, total_length); + frame_length = ((total_length - burn_length) > PACK_SIZE) ? PACK_SIZE : (total_length - burn_length); + wr_buf[0] = (u8)(burn_addr>>8); + rd_buf[0] = wr_buf[0]; + wr_buf[1] = (u8)burn_addr; + rd_buf[1] = wr_buf[1]; + memcpy(&wr_buf[GTP_ADDR_LENGTH], &burn_buf[burn_length], frame_length); + + for (retry = 0; retry < MAX_FRAME_CHECK_TIME; retry++) { + ret = gup_i2c_write(client, wr_buf, GTP_ADDR_LENGTH + frame_length); + if (ret <= 0) { + GTP_ERROR("Write frame data i2c error."); + continue; + } + ret = gup_i2c_read(client, rd_buf, GTP_ADDR_LENGTH + frame_length); + if (ret <= 0) { + GTP_ERROR("Read back frame data i2c error."); + continue; + } + + if (memcmp(&wr_buf[GTP_ADDR_LENGTH], &rd_buf[GTP_ADDR_LENGTH], frame_length)) { + GTP_ERROR("Check frame data fail,not equal."); + GTP_DEBUG("write array:"); + GTP_DEBUG_ARRAY(&wr_buf[GTP_ADDR_LENGTH], frame_length); + GTP_DEBUG("read array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + continue; + } else { + + break; + } + } + if (retry >= MAX_FRAME_CHECK_TIME) { + GTP_ERROR("Burn frame data time out,exit."); + return FAIL; + } + burn_length += frame_length; + burn_addr += frame_length; + } + return SUCCESS; +} + +static u8 gup_load_section_file(u8 *buf, u32 offset, u16 length, u8 set_or_end) +{ +#if (GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) + if (got_file_flag == HEADER_FW_READY) { + if (SEEK_SET == set_or_end) { + memcpy(buf, >p_default_FW[FW_HEAD_LENGTH + offset], length); + } else { + memcpy(buf, >p_default_FW[update_msg.fw_total_len + FW_HEAD_LENGTH - offset], length); + } + return SUCCESS; + } +#endif + { + s32 ret = 0; + + if ((update_msg.file == NULL) || IS_ERR(update_msg.file)) { + GTP_ERROR("cannot find update file,load section file fail."); + return FAIL; + } + + if (SEEK_SET == set_or_end) { + update_msg.file->f_pos = FW_HEAD_LENGTH + offset; + } else { + update_msg.file->f_pos = update_msg.fw_total_len + FW_HEAD_LENGTH - offset; + } + + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, length, &update_msg.file->f_pos); + + if (ret < 0) { + GTP_ERROR("Read update file fail."); + return FAIL; + } + + return SUCCESS; + } +} + +static u8 gup_recall_check(struct i2c_client *client, u8 *chk_src, u16 start_rd_addr, u16 chk_length) +{ + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + s32 ret = 0; + u16 recall_addr = start_rd_addr; + u16 recall_length = 0; + u16 frame_length = 0; + + while (recall_length < chk_length) { + frame_length = ((chk_length - recall_length) > PACK_SIZE) ? PACK_SIZE : (chk_length - recall_length); + ret = gup_get_ic_msg(client, recall_addr, rd_buf, frame_length); + if (ret <= 0) { + GTP_ERROR("recall i2c error,exit"); + return FAIL; + } + + if (memcmp(&rd_buf[GTP_ADDR_LENGTH], &chk_src[recall_length], frame_length)) { + GTP_ERROR("Recall frame data fail,not equal."); + GTP_DEBUG("chk_src array:"); + GTP_DEBUG_ARRAY(&chk_src[recall_length], frame_length); + GTP_DEBUG("recall array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + return FAIL; + } + + recall_length += frame_length; + recall_addr += frame_length; + } + GTP_DEBUG("Recall check %dk firmware success.", (chk_length/1024)); + + return SUCCESS; +} + +static u8 gup_burn_fw_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u8 bank_cmd) +{ + s32 ret = 0; + u8 rd_buf[5]; + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]hold ss51 & dsp fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + + ret = gup_burn_proc(client, fw_section, start_addr, FW_SECTION_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_section]burn fw_section fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]hold ss51 & release dsp fail."); + return FAIL; + } + + msleep(1); + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0f); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]send burn cmd fail."); + return FAIL; + } + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]Get burn state fail"); + return FAIL; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + + ret = gup_recall_check(client, fw_section, start_addr, FW_SECTION_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_section]recall check %dk firmware fail.", FW_SECTION_LENGTH/1024); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]disable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_dsp_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_dsp_isp = NULL; + u8 retry = 0; + + GTP_INFO("[burn_dsp_isp]Begin burn dsp isp---->>"); + + + GTP_DEBUG("[burn_dsp_isp]step1:alloc memory"); + while (retry++ < 5) { + fw_dsp_isp = (u8 *)kzalloc(FW_DSP_ISP_LENGTH, GFP_KERNEL); + if (fw_dsp_isp == NULL) { + continue; + } else { + GTP_INFO("[burn_dsp_isp]Alloc %dk byte memory success.", (FW_DSP_ISP_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_dsp_isp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_dsp_isp]step2:load dsp isp file data"); + ret = gup_load_section_file(fw_dsp_isp, FW_DSP_ISP_LENGTH, FW_DSP_ISP_LENGTH, SEEK_END); + if (FAIL == ret) { + GTP_ERROR("[burn_dsp_isp]load firmware dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step3:disable wdt,clear cache enable"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]disable wdt fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]clear cache enable fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step5:set boot from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]set boot from sram fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step6:software reboot"); + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]software reboot fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step7:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]select bank2 fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step8:enable accessing code"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]enable accessing code fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step9:burn 4k dsp_isp"); + ret = gup_burn_proc(client, fw_dsp_isp, 0xC000, FW_DSP_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_dsp_isp]burn dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step10:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + update_msg.fw_burned_len += FW_DSP_ISP_LENGTH; + GTP_DEBUG("[burn_dsp_isp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_dsp_isp: + kfree(fw_dsp_isp); + return ret; +} + +static u8 gup_burn_fw_ss51(struct i2c_client *client) +{ + u8 *fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_INFO("[burn_fw_ss51]Begin burn ss51 firmware---->>"); + + + GTP_DEBUG("[burn_fw_ss51]step1:alloc memory"); + while (retry++ < 5) { + fw_ss51 = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_ss51 == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_ss51]Alloc %dk byte memory success.", (FW_SECTION_LENGTH / 1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_ss51]Alloc memory fail,exit."); + return FAIL; + } + + + + + + + + + + + GTP_INFO("[burn_fw_ss51]Reset first 8K of ss51 to 0xFF."); + GTP_DEBUG("[burn_fw_ss51]step2: reset bank0 0xC000~0xD000"); + memset(fw_ss51, 0xFF, FW_SECTION_LENGTH); + + + GTP_DEBUG("[burn_fw_ss51]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_ss51]clear control flag fail."); + ret = FAIL; + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step5:load ss51 firmware section 2 file data"); + ret = gup_load_section_file(fw_ss51, FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step6:burn ss51 firmware section 2"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x02); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step7:load ss51 firmware section 3 file data"); + ret = gup_load_section_file(fw_ss51, 2 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step8:burn ss51 firmware section 3"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x13); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step9:load ss51 firmware section 4 file data"); + ret = gup_load_section_file(fw_ss51, 3 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step10:burn ss51 firmware section 4"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x14); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + update_msg.fw_burned_len += (FW_SECTION_LENGTH*4); + GTP_DEBUG("[burn_fw_ss51]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_ss51: + kfree(fw_ss51); + return ret; +} + +static u8 gup_burn_fw_dsp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_dsp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_INFO("[burn_fw_dsp]Begin burn dsp firmware---->>"); + + GTP_DEBUG("[burn_fw_dsp]step1:alloc memory"); + while (retry++ < 5) { + fw_dsp = (u8 *)kzalloc(FW_DSP_LENGTH, GFP_KERNEL); + if (fw_dsp == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_dsp]Alloc %dk byte memory success.", (FW_SECTION_LENGTH / 1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_dsp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_dsp]step2:load firmware dsp"); + ret = gup_load_section_file(fw_dsp, 4 * FW_SECTION_LENGTH, FW_DSP_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]load firmware dsp fail."); + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step3:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step5:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step6:release ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_dsp]step7:burn 4k dsp firmware"); + ret = gup_burn_proc(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]burn fw_section fail."); + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x05); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]send burn cmd fail."); + goto exit_burn_fw_dsp; + } + GTP_DEBUG("[burn_fw_dsp]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]Get burn state fail"); + goto exit_burn_fw_dsp; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_dsp]step9:recall check 4k dsp firmware"); + ret = gup_recall_check(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]recall check 4k dsp firmware fail."); + goto exit_burn_fw_dsp; + } + + update_msg.fw_burned_len += FW_DSP_LENGTH; + GTP_DEBUG("[burn_fw_dsp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_dsp: + kfree(fw_dsp); + return ret; +} + +static u8 gup_burn_fw_boot(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_boot = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_INFO("[burn_fw_boot]Begin burn bootloader firmware---->>"); + + + GTP_DEBUG("[burn_fw_boot]step1:Alloc memory"); + while (retry++ < 5) { + fw_boot = (u8 *)kzalloc(FW_BOOT_LENGTH, GFP_KERNEL); + if (fw_boot == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_boot]Alloc %dk byte memory success.", (FW_BOOT_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_boot]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_boot]step2:load firmware bootloader"); + ret = gup_load_section_file(fw_boot, (4 * FW_SECTION_LENGTH + FW_DSP_LENGTH), FW_BOOT_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]load firmware bootcode fail."); + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step5:hold ss51 & release dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_boot]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step6:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]burn fw_boot fail."); + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step7:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x06); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]send burn cmd fail."); + goto exit_burn_fw_boot; + } + GTP_DEBUG("[burn_fw_boot]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]Get burn state fail"); + goto exit_burn_fw_boot; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_boot]step8:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]recall check 2k bootcode firmware fail."); + goto exit_burn_fw_boot; + } + + update_msg.fw_burned_len += FW_BOOT_LENGTH; + GTP_DEBUG("[burn_fw_boot]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_boot: + kfree(fw_boot); + return ret; +} +static u8 gup_burn_fw_boot_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_boot_isp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the boot_isp code!"); + return SUCCESS; + } + GTP_INFO("[burn_fw_boot_isp]Begin burn boot_isp firmware---->>"); + + + GTP_DEBUG("[burn_fw_boot_isp]step1:Alloc memory"); + while (retry++ < 5) { + fw_boot_isp = (u8 *)kzalloc(FW_BOOT_ISP_LENGTH, GFP_KERNEL); + if (fw_boot_isp == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_boot_isp]Alloc %dk byte memory success.", (FW_BOOT_ISP_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_boot_isp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step2:load firmware bootloader isp"); + + ret = gup_load_section_file(fw_boot_isp, (update_msg.fw_burned_len - FW_DSP_ISP_LENGTH), FW_BOOT_ISP_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]load firmware boot_isp fail."); + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + + GTP_DEBUG("[burn_fw_boot_isp]step5:hold ss51 & release dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_boot_isp]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step7:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]burn fw_section fail."); + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x07); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]send burn cmd fail."); + goto exit_burn_fw_boot_isp; + } + GTP_DEBUG("[burn_fw_boot_isp]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]Get burn state fail"); + goto exit_burn_fw_boot_isp; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_boot_isp]step9:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]recall check 2k bootcode_isp firmware fail."); + goto exit_burn_fw_boot_isp; + } + + update_msg.fw_burned_len += FW_BOOT_ISP_LENGTH; + GTP_DEBUG("[burn_fw_boot_isp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_boot_isp: + kfree(fw_boot_isp); + return ret; +} + +static u8 gup_burn_fw_link(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_link = NULL; + u8 retry = 0; + u32 offset; + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the link code!"); + return SUCCESS; + } + GTP_INFO("[burn_fw_link]Begin burn link firmware---->>"); + + + GTP_DEBUG("[burn_fw_link]step1:Alloc memory"); + while (retry++ < 5) { + fw_link = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_link == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_link]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_link]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_link]step2:load firmware link section 1"); + offset = update_msg.fw_burned_len - FW_DSP_ISP_LENGTH; + ret = gup_load_section_file(fw_link, offset, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]load firmware link section 1 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step3:burn link firmware section 1"); + ret = gup_burn_fw_gwake_section(client, fw_link, 0x9000, FW_SECTION_LENGTH, 0x38); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]burn link firmware section 1 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step4:load link firmware section 2 file data"); + offset += FW_SECTION_LENGTH; + ret = gup_load_section_file(fw_link, offset, FW_GLINK_LENGTH - FW_SECTION_LENGTH, SEEK_SET); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]load link firmware section 2 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step4:burn link firmware section 2"); + ret = gup_burn_fw_gwake_section(client, fw_link, 0x9000, FW_GLINK_LENGTH - FW_SECTION_LENGTH, 0x39); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]burn link firmware section 2 fail."); + goto exit_burn_fw_link; + } + + update_msg.fw_burned_len += FW_GLINK_LENGTH; + GTP_DEBUG("[burn_fw_link]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_link: + kfree(fw_link); + return ret; +} + +static u8 gup_burn_fw_gwake_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd) +{ + s32 ret = 0; + u8 rd_buf[5]; + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]hold ss51 & dsp fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]hold ss51 & release dsp fail."); + return FAIL; + } + + msleep(1); + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_burn_proc(client, fw_section, start_addr, len); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_app_section]burn fw_section fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]send burn cmd fail."); + return FAIL; + } + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]Get burn state fail"); + return FAIL; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + ret = gup_recall_check(client, fw_section, start_addr, len); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_app_section]recall check %dk firmware fail.", len/1024); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_fw_gwake(struct i2c_client *client) +{ + u8 *fw_gwake = NULL; + u8 retry = 0; + s32 ret = 0; + u16 start_index = 4*FW_SECTION_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH + FW_BOOT_ISP_LENGTH + FW_GLINK_LENGTH; + + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the gwake code!"); + return SUCCESS; + } + + GTP_INFO("[burn_fw_gwake]Begin burn gwake firmware---->>"); + + + GTP_DEBUG("[burn_fw_gwake]step1:alloc memory"); + while (retry++ < 5) { + fw_gwake = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_gwake == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_gwake]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_gwake]Alloc memory fail,exit."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]clear control flag fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step2:load app_code firmware section 1 file data"); + ret = gup_load_section_file(fw_gwake, start_index, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 1 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step3:burn app_code firmware section 1"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3A); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 1 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step5:load app_code firmware section 2 file data"); + ret = gup_load_section_file(fw_gwake, start_index+FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 2 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step6:burn app_code firmware section 2"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3B); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 2 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step7:load app_code firmware section 3 file data"); + ret = gup_load_section_file(fw_gwake, start_index+2*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 3 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step8:burn app_code firmware section 3"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3C); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 3 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step9:load app_code firmware section 4 file data"); + ret = gup_load_section_file(fw_gwake, start_index + 3*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 4 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step10:burn app_code firmware section 4"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3D); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 4 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_gwake: + kfree(fw_gwake); + return ret; +} + +static u8 gup_burn_fw_finish(struct i2c_client *client) +{ + u8 *fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_INFO("[burn_fw_finish]burn first 8K of ss51 and finish update."); + + GTP_DEBUG("[burn_fw_finish]step1:alloc memory"); + while (retry++ < 5) { + fw_ss51 = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_ss51 == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_finish]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_finish]Alloc memory fail,exit."); + return FAIL; + } + + GTP_DEBUG("[burn_fw_finish]step2: burn ss51 first 8K."); + ret = gup_load_section_file(fw_ss51, 0, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_finish]load ss51 firmware section 1 fail."); + goto exit_burn_fw_finish; + } + + GTP_DEBUG("[burn_fw_finish]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]clear control flag fail."); + goto exit_burn_fw_finish; + } + + GTP_DEBUG("[burn_fw_finish]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_finish]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_finish; + } + + + GTP_DEBUG("[burn_fw_finish]step5:enable download DSP code "); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x99); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]enable download DSP code fail."); + goto exit_burn_fw_finish; + } + + + GTP_DEBUG("[burn_fw_finish]step6:release ss51 & hold dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x08); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]release ss51 & hold dsp fail."); + goto exit_burn_fw_finish; + } + + if (fw_ss51) { + kfree(fw_ss51); + } + return SUCCESS; + +exit_burn_fw_finish: + if (fw_ss51) { + kfree(fw_ss51); + } + return FAIL; +} +s32 gup_update_proc(void *dir) +{ + s32 ret = 0; + s32 update_ret = FAIL; + u8 retry = 0; + st_fw_head fw_head; + struct goodix_ts_data *ts = NULL; + + GTP_DEBUG("[update_proc]Begin update ......"); + + ts = i2c_get_clientdata(i2c_connect_client); + +#if GTP_AUTO_UPDATE + if (searching_file) { + u8 timeout = 0; + searching_file = 0; + GTP_INFO("Exiting searching .bin update file..."); + while ((show_len != 200) && (show_len != 100) && (timeout++ < 100)) { + msleep(100); + } + } +#endif + + show_len = 1; + total_len = 100; + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return gup_fw_download_proc(dir, GTP_FL_FW_BURN); + } +#endif + + update_msg.file = NULL; + ret = gup_check_update_file(i2c_connect_client, &fw_head, (u8 *)dir); + if (FAIL == ret) { + GTP_ERROR("[update_proc]check update file fail."); + goto file_fail; + } + + ret = gup_get_ic_fw_msg(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]get ic message fail."); + goto file_fail; + } + + ret = gup_enter_update_judge(&fw_head); + if (FAIL == ret) { + GTP_ERROR("[update_proc]Check *.bin file fail."); + goto file_fail; + } + + ts->enter_update = 1; + gtp_irq_disable(ts); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ret = gup_enter_update_mode(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]enter update mode fail."); + goto update_fail; + } + + while (retry++ < 5) { + show_len = 10; + total_len = 100; + update_msg.fw_burned_len = 0; + ret = gup_burn_dsp_isp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn dsp isp fail."); + continue; + } + + show_len = 20; + ret = gup_burn_fw_gwake(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn app_code firmware fail."); + continue; + } + + show_len = 30; + ret = gup_burn_fw_ss51(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn ss51 firmware fail."); + continue; + } + + show_len = 40; + ret = gup_burn_fw_dsp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn dsp firmware fail."); + continue; + } + + show_len = 50; + ret = gup_burn_fw_boot(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn bootloader firmware fail."); + continue; + } + show_len = 60; + + ret = gup_burn_fw_boot_isp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn boot_isp firmware fail."); + continue; + } + + show_len = 70; + ret = gup_burn_fw_link(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn link firmware fail."); + continue; + } + + show_len = 80; + ret = gup_burn_fw_finish(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn finish fail."); + continue; + } + show_len = 90; + GTP_INFO("[update_proc]UPDATE SUCCESS."); + retry = 0; + break; + } + + if (retry >= 5) { + GTP_ERROR("[update_proc]retry timeout,UPDATE FAIL."); + update_ret = FAIL; + } else { + update_ret = SUCCESS; + } + +update_fail: + GTP_DEBUG("[update_proc]leave update mode."); + gup_leave_update_mode(); + + msleep(100); + +#if WT_ADD_CTP_INFO + gtp_hardwareinfo_set(); +#endif + + if (SUCCESS == update_ret) { + if (ts->fw_error) { + GTP_INFO("firmware error auto update, resent config!"); + gup_init_panel(ts); + } else { + GTP_DEBUG("[update_proc]send config."); + ret = gtp_send_cfg(i2c_connect_client); + if (ret < 0) { + GTP_ERROR("[update_proc]send config fail."); + } else { + msleep(100); + } + } + } + ts->enter_update = 0; + gtp_irq_enable(ts); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + +file_fail: + if (update_msg.file && !IS_ERR(update_msg.file)) { + if (update_msg.old_fs) { + set_fs(update_msg.old_fs); + } + filp_close(update_msg.file, NULL); + } +#if (GTP_AUTO_UPDATE && GTP_AUTO_UPDATE_CFG && GTP_HEADER_FW_UPDATE) + if (NULL == dir) { + gup_search_file(AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) { + ret = gup_update_config(i2c_connect_client); + if (ret <= 0) { + GTP_ERROR("Update config failed."); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); + } + } +#endif + + total_len = 100; + if (SUCCESS == update_ret) { + show_len = 100; + return SUCCESS; + } else { + show_len = 200; + return FAIL; + } +} + +#if GTP_AUTO_UPDATE +u8 gup_init_update_proc(struct goodix_ts_data *ts) +{ + struct task_struct *thread = NULL; + + GTP_INFO("Ready to run update thread."); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + thread = kthread_run(gup_update_proc, "update", "fl update"); + } else +#endif + { + thread = kthread_run(gup_update_proc, (void *)NULL, "guitar_update"); + } + if (IS_ERR(thread)) { + GTP_ERROR("Failed to create update thread.\n"); + return -EPERM; + } + + return 0; +} +#endif + + + +#define FW_DOWNLOAD_LENGTH 0x4000 +#define FW_SS51_SECTION_LEN 0x2000 +#define FL_PACK_SIZE 1024 +#define GUP_FW_CHK_SIZE FL_PACK_SIZE + +#define FL_UPDATE_PATH "/data/_fl_update_.bin" +#define FL_UPDATE_PATH_SD "/sdcard/_fl_update_.bin" + +#define PULSE_LENGTH (200) +#define INIT_CLK_DAC (50) +#define MAX_CLK_DAC (120) +#define CLK_AVG_TIME (1) +#define MILLION 1000000 + +#define _wRW_MISCTL__RG_DMY 0x4282 +#define _bRW_MISCTL__RG_OSC_CALIB 0x4268 +#define _fRW_MISCTL__GIO0 0x41e9 +#define _fRW_MISCTL__GIO1 0x41ed +#define _fRW_MISCTL__GIO2 0x41f1 +#define _fRW_MISCTL__GIO3 0x41f5 +#define _fRW_MISCTL__GIO4 0x41f9 +#define _fRW_MISCTL__GIO5 0x41fd +#define _fRW_MISCTL__GIO6 0x4201 +#define _fRW_MISCTL__GIO7 0x4205 +#define _fRW_MISCTL__GIO8 0x4209 +#define _fRW_MISCTL__GIO9 0x420d +#define _fRW_MISCTL__MEA 0x41a0 +#define _bRW_MISCTL__MEA_MODE 0x41a1 +#define _wRW_MISCTL__MEA_MAX_NUM 0x41a4 +#define _dRO_MISCTL__MEA_VAL 0x41b0 +#define _bRW_MISCTL__MEA_SRCSEL 0x41a3 +#define _bRO_MISCTL__MEA_RDY 0x41a8 +#define _rRW_MISCTL__ANA_RXADC_B0_ 0x4250 +#define _bRW_MISCTL__RG_LDO_A18_PWD 0x426f +#define _bRW_MISCTL__RG_BG_PWD 0x426a +#define _bRW_MISCTL__RG_CLKGEN_PWD 0x4269 +#define _fRW_MISCTL__RG_RXADC_PWD 0x426a +#define _bRW_MISCTL__OSC_CK_SEL 0x4030 +#define _rRW_MISCTL_RG_DMY83 0x4283 +#define _rRW_MISCTL__GIO1CTL_B2_ 0x41ee +#define _rRW_MISCTL__GIO1CTL_B1_ 0x41ed + + +#if GTP_COMPATIBLE_MODE + +u8 i2c_opr_buf[GTP_ADDR_LENGTH + FL_PACK_SIZE] = {0}; +u8 chk_cmp_buf[FL_PACK_SIZE] = {0}; + +extern s32 gtp_fw_startup(struct i2c_client *client); +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode); +static s32 gup_burn_fw_proc(struct i2c_client *client, u16 start_addr, s32 start_index, s32 burn_len); +static s32 gup_check_and_repair(struct i2c_client *client, u16 start_addr, s32 start_index, s32 chk_len); + + +u8 gup_check_fs_mounted(char *path_name) +{ + struct path root_path; + struct path path; + int err = -1; + err = kern_path("/", LOOKUP_FOLLOW, &root_path); + + if (err) { + GTP_DEBUG("\"/\" NOT Mounted: %d", err); + return FAIL; + } + err = kern_path(path_name, LOOKUP_FOLLOW, &path); + + if (err) { + GTP_DEBUG("%s NOT Mounted: %d", path_name, err); + err = FAIL; + goto exit_chk; + } + + if (path.mnt->mnt_sb == root_path.mnt->mnt_sb) { + err = FAIL; + } else { + err = SUCCESS; + } + + path_put(&path); +exit_chk: + path_put(&root_path); + return err; +} + +s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len) +{ + s32 ret = 0; + s32 write_bytes = 0; + s32 retry = 0; + u8 *tx_buf = buf; + + while (len > 0) { + i2c_opr_buf[0] = (u8)(addr >> 8); + i2c_opr_buf[1] = (u8)(addr & 0xFF); + if (len > FL_PACK_SIZE) { + write_bytes = FL_PACK_SIZE; + } else { + write_bytes = len; + } + memcpy(i2c_opr_buf + 2, tx_buf, write_bytes); + for (retry = 0; retry < 5; ++retry) { + ret = gup_i2c_write(client, i2c_opr_buf, write_bytes + GTP_ADDR_LENGTH); + if (ret == 1) { + break; + } + } + if (retry >= 5) { + GTP_ERROR("retry timeout, I2C write 0x%04X %d bytes failed!", addr, write_bytes); + return -EPERM; + } + addr += write_bytes; + len -= write_bytes; + tx_buf += write_bytes; + } + + return 1; +} + +s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len) +{ + s32 ret = 0; + s32 read_bytes = 0; + s32 retry = 0; + u8 *tx_buf = buf; + + while (len > 0) { + i2c_opr_buf[0] = (u8)(addr >> 8); + i2c_opr_buf[1] = (u8)(addr & 0xFF); + if (len > FL_PACK_SIZE) { + read_bytes = FL_PACK_SIZE; + } else { + read_bytes = len; + } + for (retry = 0; retry < 5; ++retry) { + ret = gup_i2c_read(client, i2c_opr_buf, read_bytes + GTP_ADDR_LENGTH); + if (ret == 2) { + break; + } + } + if (retry >= 5) { + GTP_ERROR("retry timeout, I2C read 0x%04X %d bytes failed!", addr, read_bytes); + return -EPERM; + } + memcpy(tx_buf, i2c_opr_buf + 2, read_bytes); + addr += read_bytes; + len -= read_bytes; + tx_buf += read_bytes; + } + return 2; +} + + + + + +static void gup_bit_write(s32 addr, s32 bit, s32 val) +{ + u8 buf; + i2c_read_bytes(i2c_connect_client, addr, &buf, 1); + + buf = (buf & (~((u8)1 << bit))) | ((u8)val << bit); + + i2c_write_bytes(i2c_connect_client, addr, &buf, 1); +} + +static void gup_clk_count_init(s32 bCh, s32 bCNT) +{ + u8 buf; + + + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + + gup_bit_write(_fRW_MISCTL__MEA, 1, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__MEA_MODE, &buf, 1); + + buf = 8 + bCh; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__MEA_SRCSEL, &buf, 1); + + buf = bCNT; + i2c_write_bytes(i2c_connect_client, _wRW_MISCTL__MEA_MAX_NUM, &buf, 1); + + gup_bit_write(_fRW_MISCTL__MEA, 1, 0); + + gup_bit_write(_fRW_MISCTL__MEA, 0, 1); +} + +static u32 gup_clk_count_get(void) +{ + s32 ready = 0; + s32 temp; + s8 buf[4]; + + while ((ready == 0)) { + i2c_read_bytes(i2c_connect_client, _bRO_MISCTL__MEA_RDY, buf, 1); + ready = buf[0]; + } + + msleep(50); + + + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + i2c_read_bytes(i2c_connect_client, _dRO_MISCTL__MEA_VAL, buf, 4); + GTP_DEBUG("Clk_count 0: %2X", buf[0]); + GTP_DEBUG("Clk_count 1: %2X", buf[1]); + GTP_DEBUG("Clk_count 2: %2X", buf[2]); + GTP_DEBUG("Clk_count 3: %2X", buf[3]); + + temp = (s32)buf[0] + ((s32)buf[1] << 8) + ((s32)buf[2] << 16) + ((s32)buf[3] << 24); + GTP_INFO("Clk_count : %d", temp); + return temp; +} +u8 gup_clk_dac_setting(int dac) +{ + s8 buf1, buf2; + + i2c_read_bytes(i2c_connect_client, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_read_bytes(i2c_connect_client, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + buf1 = (buf1 & 0xFFCF) | ((dac & 0x03) << 4); + buf2 = (dac >> 2) & 0x3f; + + i2c_write_bytes(i2c_connect_client, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + return 0; +} + +static u8 gup_clk_calibration_pin_select(s32 bCh) +{ + s32 i2c_addr; + + switch (bCh) { + case 0: + i2c_addr = _fRW_MISCTL__GIO0; + break; + + case 1: + i2c_addr = _fRW_MISCTL__GIO1; + break; + + case 2: + i2c_addr = _fRW_MISCTL__GIO2; + break; + + case 3: + i2c_addr = _fRW_MISCTL__GIO3; + break; + + case 4: + i2c_addr = _fRW_MISCTL__GIO4; + break; + + case 5: + i2c_addr = _fRW_MISCTL__GIO5; + break; + + case 6: + i2c_addr = _fRW_MISCTL__GIO6; + break; + + case 7: + i2c_addr = _fRW_MISCTL__GIO7; + break; + + case 8: + i2c_addr = _fRW_MISCTL__GIO8; + break; + + case 9: + i2c_addr = _fRW_MISCTL__GIO9; + break; + } + + gup_bit_write(i2c_addr, 1, 0); + + return 0; +} + +void gup_output_pulse(int t) +{ + unsigned long flags; + + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(10); + + local_irq_save(flags); + + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(50); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(t - 50); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + local_irq_restore(flags); + + msleep(20); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); +} + +static void gup_sys_clk_init(void) +{ + u8 buf; + + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 5, 0); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_LDO_A18_PWD, &buf, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_BG_PWD, &buf, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_CLKGEN_PWD, &buf, 1); + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 0, 0); + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 1, 0); + + + buf = 1; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__OSC_CK_SEL, &buf, 1); +} + +s32 gup_clk_calibration(void) +{ + u8 buf; + + s32 i; + struct timeval start, end; + s32 count; + s32 count_ref; + s32 sec; + s32 usec; + + struct goodix_ts_data *ts; + + buf = 0x0C; + i2c_write_bytes(i2c_connect_client, _rRW_MISCTL__SWRST_B0_, &buf, 1); + + + gup_bit_write(_rRW_MISCTL_RG_DMY83, 7, 0); + + + gup_bit_write(_rRW_MISCTL__GIO1CTL_B2_, 0, 0); + + + gup_bit_write(_rRW_MISCTL__GIO1CTL_B1_, 1, 0); + + + + + + GTP_INFO("CLK calibration GO"); + gup_sys_clk_init(); + gup_clk_calibration_pin_select(1); + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + ts = i2c_get_clientdata(i2c_connect_client); + + for (i = INIT_CLK_DAC; i < MAX_CLK_DAC; i++) { + GTP_INFO("CLK calibration DAC %d", i); + + if (ts->gtp_is_suspend) { + i = 72; + break; + } + + gup_clk_dac_setting(i); + gup_clk_count_init(1, CLK_AVG_TIME); + + #if 0 + gup_output_pulse(PULSE_LENGTH); + count = gup_clk_count_get(); + + if (count > PULSE_LENGTH * 60) { + break; + } + + #else + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + + do_gettimeofday(&start); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + + msleep(1); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(1); + + + do_gettimeofday(&end); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + + count = gup_clk_count_get(); + msleep(20); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + usec = end.tv_usec - start.tv_usec; + sec = end.tv_sec - start.tv_sec; + count_ref = 60 * (usec+ sec * MILLION); + + GTP_DEBUG("== time %d, %d, %d", sec, usec, count_ref); + + if (count > count_ref) { + GTP_DEBUG("== count_diff %d", count - count_ref); + break; + } + + #endif + } + + + + gtp_reset_guitar(i2c_connect_client, 20); + +#if 0 + + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x41FA, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4104, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4105, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4106, &buf, 1); + buf = 0x01; + i2c_write_bytes(i2c_connect_client, 0x4107, &buf, 1); + buf = 0x06; + i2c_write_bytes(i2c_connect_client, 0x41F8, &buf, 1); + buf = 0x02; + i2c_write_bytes(i2c_connect_client, 0x41F9, &buf, 1); +#endif + + GTP_GPIO_AS_INT(gtp_int_gpio); + return i; +} + + + +s32 gup_hold_ss51_dsp(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + while (retry++ < 200) { + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if (0x0C == rd_buf[GTP_ADDR_LENGTH]) { + GTP_DEBUG("[enter_update_mode]Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if (retry >= 200) { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + + ret = gup_set_ic_msg(client, 0x4010, 0x00); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]DSP_CK and DSP_ALU_CK PowerOn fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]disable wdt fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]clear cache enable fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]set boot from sram fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]software reboot fail."); + return FAIL; + } + + return SUCCESS; +} + +s32 gup_enter_update_mode_fl(struct i2c_client *client) +{ + s32 ret = -1; + + + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_int_gpio, (client->addr == 0x14)); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + msleep(5); + + + ret = gup_hold_ss51_dsp(client); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]hold ss51 & dsp failed."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]clear control flag fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]enable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode) +{ + s32 ret = 0; + + + GTP_DEBUG("[download_fw_dsp]step1:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + if (ret == FAIL) { + GTP_ERROR("select bank 2 fail"); + return FAIL; + } + + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("[download_fw_dsp]Begin download dsp fw---->>"); + + if (ret <= 0) { + GTP_ERROR("[download_fw_dsp]select bank2 fail."); + return FAIL; + } + GTP_DEBUG("burn fw dsp"); + ret = gup_burn_fw_proc(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[download_fw_dsp]download FW dsp fail."); + return FAIL; + } + GTP_INFO("check firmware dsp"); + ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("check fw dsp failed!"); + return FAIL; + } + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + GTP_INFO("[download_fw_dsp]Begin esd check dsp fw---->>"); + + + + + { + + GTP_INFO("esd recovery redownload firmware dsp code"); + ret = gup_burn_fw_proc(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("redownload fw dsp failed!"); + return FAIL; + } + } + } else { + GTP_INFO("check firmware dsp"); + ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("check fw dsp failed!"); + return FAIL; + } + } + return SUCCESS; +} + +static s32 gup_burn_fw_proc(struct i2c_client *client, u16 start_addr, s32 start_index, s32 burn_len) +{ + s32 ret = 0; + + GTP_DEBUG("burn firmware: 0x%04X, %d bytes, start_index: 0x%04X", start_addr, burn_len, start_index); + + ret = i2c_write_bytes(client, start_addr, (u8 *)>p_default_FW_fl[FW_HEAD_LENGTH + start_index], burn_len); + if (ret < 0) { + GTP_ERROR("burn 0x%04X, %d bytes failed!", start_addr, burn_len); + return FAIL; + } + return SUCCESS; +} + +static s32 gup_check_and_repair(struct i2c_client *client, u16 start_addr, s32 start_index, s32 chk_len) +{ + s32 ret = 0; + s32 cmp_len = 0; + u16 cmp_addr = start_addr; + s32 i = 0; + s32 chked_times = 0; + u8 chk_fail = 0; + + GTP_DEBUG("check firmware: start 0x%04X, %d bytes", start_addr, chk_len); + while ((chk_len > 0) && (chked_times < GTP_CHK_FW_MAX)) { + if (chk_len >= GUP_FW_CHK_SIZE) { + cmp_len = GUP_FW_CHK_SIZE; + } else { + cmp_len = chk_len; + } + ret = i2c_read_bytes(client, cmp_addr, chk_cmp_buf, cmp_len); + if (ret < 0) { + chk_fail = 1; + break; + } + for (i = 0; i < cmp_len; ++i) { + if (chk_cmp_buf[i] != gtp_default_FW_fl[FW_HEAD_LENGTH + start_index + i]) { + chk_fail = 1; + i2c_write_bytes(client, cmp_addr+i, >p_default_FW_fl[FW_HEAD_LENGTH + start_index + i], cmp_len-i); + GTP_ERROR("Check failed index: %d(%d != %d), redownload chuck", i, chk_cmp_buf[i], + gtp_default_FW_fl[FW_HEAD_LENGTH + start_index + i]); + break; + } + } + if (chk_fail == 1) { + chk_fail = 0; + chked_times++; + } else { + cmp_addr += cmp_len; + start_index += cmp_len; + chk_len -= cmp_len; + } + } + if (chk_len > 0) { + GTP_ERROR("cmp_addr: 0x%04X, start_index: 0x%02X, chk_len: 0x%04X", cmp_addr, + start_index, chk_len); + return FAIL; + } + return SUCCESS; +} + +static u8 gup_download_fw_ss51(struct i2c_client *client, u8 dwn_mode) +{ + s32 section = 0; + s32 ret = 0; + s32 start_index = 0; + u8 bank = 0; + u16 burn_addr = 0xC000; + + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("download firmware ss51"); + } else { + GTP_INFO("check firmware ss51"); + } + for (section = 1; section <= 4; section += 2) { + switch (section) { + case 1: + bank = 0x00; + burn_addr = (section - 1) * FW_SS51_SECTION_LEN + 0xC000; + break; + case 3: + bank = 0x01; + burn_addr = (section - 3) * FW_SS51_SECTION_LEN + 0xC000; + break; + } + start_index = (section - 1) * FW_SS51_SECTION_LEN; + + GTP_DEBUG("download firmware ss51: select bank%d", bank); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, bank); + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_DEBUG("download firmware ss51 section%d & %d", section, section+1); + ret = gup_burn_fw_proc(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("download fw ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + GTP_DEBUG("check firmware ss51 section%d & %d", section, section+1); + ret = gup_check_and_repair(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("check ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + + + + { + + GTP_DEBUG("esd recovery redownload ss51 section%d & %d", section, section+1); + ret = gup_burn_fw_proc(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("download fw ss51 section%d failed!", section); + return FAIL; + } + } + } else { + GTP_DEBUG("check firmware ss51 section%d & %d", section, section+1); + ret = gup_check_and_repair(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("check ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + } + } + + return SUCCESS; +} + + +static s32 gup_prepare_fl_fw(char *path, st_fw_head *fw_head) +{ + s32 ret = 0; + s32 i = 0; + s32 timeout = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + + if (!memcmp(path, "update", 6)) { + GTP_INFO("Search for GT9XXF firmware file to update"); + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) { + if (0 == searching_file) { + GTP_INFO("Force terminate auto update for GT9XXF..."); + return FAIL; + } + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", FL_UPDATE_PATH, FL_UPDATE_PATH_SD, i+1, GUP_SEARCH_FILE_TIMES); + update_msg.file = filp_open(FL_UPDATE_PATH, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) { + update_msg.file = filp_open(FL_UPDATE_PATH_SD, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) { + msleep(3000); + continue; + } else { + path = FL_UPDATE_PATH_SD; + break; + } + } else { + path = FL_UPDATE_PATH; + break; + } + } + searching_file = 0; + if (i == 50) { + GTP_INFO("Search timeout, update aborted"); + return FAIL; + } else { + GTP_INFO("GT9XXF firmware file %s found!", path); + _CLOSE_FILE(update_msg.file); + } + while (ts->rqst_processing && (timeout++ < 5)) { + GTP_DEBUG("request processing, waiting for accomplishment"); + msleep(1000); + } + } + GTP_INFO("Firmware update file path: %s", path); + + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.fw_total_len = update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_END); + + update_msg.force_update = 0xBE; + if (update_msg.fw_total_len != sizeof(gtp_default_FW_fl)) { + GTP_ERROR("Inconsistent fw size. default size: %d(%dK), file size: %d(%dK)", sizeof(gtp_default_FW_fl), sizeof(gtp_default_FW_fl)/1024, update_msg.fw_total_len, update_msg.fw_total_len/1024); + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + return FAIL; + } + + update_msg.fw_total_len -= FW_HEAD_LENGTH; + GTP_DEBUG("Fimrware size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len / 1024); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + ret = update_msg.file->f_op->read(update_msg.file, (char *)gtp_default_FW_fl, + update_msg.fw_total_len + FW_HEAD_LENGTH, + &update_msg.file->f_pos); + update_msg.fw_total_len += FW_HEAD_LENGTH; + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + + if (ret < 0) { + GTP_ERROR("read %s failed, err-code: %d", path, ret); + return FAIL; + } + return SUCCESS; +} +static u8 gup_check_update_file_fl(struct i2c_client *client, st_fw_head *fw_head, char *path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + + if (NULL != path) { + ret = gup_prepare_fl_fw(path, fw_head); + if (FAIL == ret) { + return FAIL; + } + } + else { + update_msg.fw_total_len = sizeof(gtp_default_FW_fl); + } + + memcpy(fw_head, gtp_default_FW_fl, FW_HEAD_LENGTH); + GTP_INFO("FILE HARDWARE INFO: %02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID: %s", fw_head->pid); + fw_head->vid = ((fw_head->vid & 0xFF00) >> 8) + ((fw_head->vid & 0x00FF) << 8); + GTP_INFO("FILE VID: %04x", fw_head->vid); + + + fw_checksum = 0; + for (i = FW_HEAD_LENGTH; i < update_msg.fw_total_len; i += 2) { + fw_checksum += (gtp_default_FW_fl[i] << 8) + gtp_default_FW_fl[i+1]; + } + ret = SUCCESS; + + GTP_DEBUG("firmware checksum: %x", fw_checksum&0xFFFF); + if (fw_checksum & 0xFFFF) { + GTP_ERROR("Illegal firmware file."); + ret = FAIL; + } + + return ret; +} + +s32 gup_fw_download_proc(void *dir, u8 dwn_mode) +{ + s32 ret = 0; + u8 retry = 0; + st_fw_head fw_head; + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(i2c_connect_client); + if (NULL == dir) { + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("[fw_download_proc]Begin fw download ......"); + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + GTP_INFO("[fw_download_proc]Begin fw esd recovery check ......"); + } else { + GTP_INFO("[fw_download_proc]Being fw repair check......"); + } + } else { + GTP_INFO("[fw_download_proc]Begin firmware update by bin file"); + } + + total_len = 100; + show_len = 0; + + ret = gup_check_update_file_fl(i2c_connect_client, &fw_head, (char *)dir); + show_len = 10; + + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]check update file fail."); + goto file_fail; + } + + if (!memcmp(fw_head.pid, "950", 3)) { + ts->is_950 = 1; + GTP_DEBUG("GT9XXF Ic Type: gt950"); + } else { + ts->is_950 = 0; + } + + if (NULL != dir) { + gtp_irq_disable(ts); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + } + + ret = gup_enter_update_mode_fl(i2c_connect_client); + show_len = 20; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]enter update mode fail."); + goto download_fail; + } + + while (retry++ < 5) { + ret = gup_download_fw_ss51(i2c_connect_client, dwn_mode); + show_len = 60; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]burn ss51 firmware fail."); + continue; + } + + ret = gup_download_fw_dsp(i2c_connect_client, dwn_mode); + show_len = 80; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]burn dsp firmware fail."); + continue; + } + + GTP_INFO("[fw_download_proc]UPDATE SUCCESS."); + break; + } + + if (retry >= 5) { + GTP_ERROR("[fw_download_proc]retry timeout,UPDATE FAIL."); + goto download_fail; + } + + if (NULL != dir) { + gtp_irq_enable(ts); + gtp_fw_startup(ts->client); + #if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); + #endif + } + show_len = 100; + return SUCCESS; + +download_fail: + if (NULL != dir) { + gtp_irq_enable(ts); + gtp_fw_startup(ts->client); + #if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); + #endif + } +file_fail: + show_len = 200; + + return FAIL; +} + +#endif + + diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index dd9b928e36948..7fa3abaa206b3 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -1137,4 +1137,34 @@ config TOUCHSCREEN_MAXIM_STI source "drivers/input/touchscreen/gt9xx/Kconfig" +source "drivers/input/touchscreen/FT8716/Kconfig" +source "drivers/input/touchscreen/FT8006m/Kconfig" + +config TOUCHSCREEN_FT5336 + bool "FOCALTECH touchpanel FT5336 series" + depends on I2C + +source "drivers/input/touchscreen/ft5336/Kconfig" + +config TOUCHSCREEN_FT5346 + bool "FOCALTECH touchpanel FT5346 series" + depends on I2C + +source "drivers/input/touchscreen/FT5346/Kconfig" + +config TOUCHSCREEN_GT915L + tristate "GT915L touchscreens" + depends on I2C + +source "drivers/input/touchscreen/GT915L/Kconfig" + +config TOUCHSCREEN_GT917D + tristate "GT917D touchscreens" + depends on I2C + +source "drivers/input/touchscreen/GT917D/Kconfig" + +config TOUCHSCREEN_LOCKDOWN_INFO + bool "lockdown info" + default n endif diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index be0eb9b34f5b6..318c9c9f721ec 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_TOUCHSCREEN_EGALAX) += egalax_ts.o obj-$(CONFIG_TOUCHSCREEN_FT5X06) += ft5x06_ts.o obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o obj-$(CONFIG_TOUCHSCREEN_GEN_VKEYS) += gen_vkeys.o +obj-$(CONFIG_TOUCHSCREEN_GEN_VKEYS) += gen_vkeys_gt.o obj-$(CONFIG_TOUCHSCREEN_ILI210X) += ili210x.o obj-$(CONFIG_TOUCHSCREEN_INEXIO) += inexio.o obj-$(CONFIG_TOUCHSCREEN_INTEL_MID) += intel-mid-touch.o @@ -89,4 +90,10 @@ obj-$(CONFIG_TOUCHSCREEN_ZFORCE) += zforce_ts.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4) += synaptics_i2c_rmi4.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI4_DEV) += synaptics_rmi_dev.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE) += synaptics_fw_update.o +obj-$(CONFIG_TOUCHSCREEN_GT915L) += GT915L/ +obj-$(CONFIG_TOUCHSCREEN_GT917D) += GT917D/ +obj-$(CONFIG_TOUCHSCREEN_FT5346) += FT5346/ +obj-$(CONFIG_TOUCHSCREEN_FT5336) += ft5336/ obj-$(CONFIG_TOUCHSCREEN_GT9XX) += gt9xx/ +obj-$(CONFIG_TOUCHSCREEN_FTS) += FT8716/ +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += FT8006m/ diff --git a/drivers/input/touchscreen/ft5336/Kconfig b/drivers/input/touchscreen/ft5336/Kconfig new file mode 100644 index 0000000000000..d43e699ec034b --- /dev/null +++ b/drivers/input/touchscreen/ft5336/Kconfig @@ -0,0 +1,5 @@ + +config TOUCHSCREEN_FT5336 + tristate "FOCALTECH FT5336 touchpanel driver" + depends on CONFIG_INPUT_TOUCHSCREEN + default n diff --git a/drivers/input/touchscreen/ft5336/Makefile b/drivers/input/touchscreen/ft5336/Makefile new file mode 100644 index 0000000000000..0e63ed69d53a4 --- /dev/null +++ b/drivers/input/touchscreen/ft5336/Makefile @@ -0,0 +1,3 @@ +#FT5336 touchpanel driver + +obj-y += ft5x06_720p.o focal_mcap_test_lib64.a diff --git a/drivers/input/touchscreen/ft5336/focal_mcap_test_lib64.a_shipped b/drivers/input/touchscreen/ft5336/focal_mcap_test_lib64.a_shipped new file mode 100644 index 0000000000000000000000000000000000000000..e8064eb692a414c731dd8ef1afc10571bf515ccf GIT binary patch literal 71588 zcmd?S33yf2)i=J+JvZT!gb)aG0=WrOL^1#Y5@onah)e-O5)g;JH`C2vMv@y0LQPbx zwy|GHMa7B=4lN+IwAHGu71Y+3R&AYXZM78~T3e~5RV!2}-*4@`_PHlJ$y=ZIeV^z5 zJIHD?Ul{TD#MkcE*M6*jlvz__J)=^u{@-r zH&!-vhMZ8D6X~RPrxj(KN(x=s(hv@=oLd+y4OP|zFY0Wm7PYO_l}!#N9FB|I8^R%z ztg1uqD*Kv9$@YbwOP7Yiim_$w&ma%DYOt)^;|FhH`aLA#kZM z2nShLTiZc6$xw7@7iHw&4h>utqN8$4C>UyQZ*33OkO@g#<(0DF7lr4~o3|iHCSoYR zrDj<}ZLO$6n7AoQ(5bvll!YtX!;&r$4J{2pR6r1BZVtBh4>rkQT__xE3~d#K7cCF2 zEiaSTva({nmO4Bgq3Uo$YfFb{-Wse7w>F4|j*hm<>JY9q4RsA+Awel+WtnKMu56Po z5Nv9w%52SI@6VYJCwKe(ob2ocIcO2{=gps+EB(JBrn{*4B9CRE5vaowkBCS}qe5)D zB0>iw84%;e7;$#n69>-PqVL04aVAlSofV$I86g5^!1EB;c6A`!?Ga}_j18PQyX~p{ zNA2LN=WO4LXSe-Wr7N=zeE(_D_mSq%1D-(7OCQ_f;6H5Z;Bh%4ux_K3bC-7(;eRoK(szA=&~PKE8LK9WKDQW>uO&b6hg4C7@PZbm&y z{N5cBuZR{~kJ~D)!Xvg)T!GcoFHJ?f!mnM@9~X;6;?M58_NDshqg(4dN4Hj9mD^Vv ze{^euXLv9Ak}idiu>*e|{Hbz`J6N42@@i&?yzWeqS3OtcQCUT@D65zy^8E8e z4yAMRQ+x$@W!YSEB#!iVAiqgSGZB9i@VD(k(KjA^j~Ci~m!eJN;co)|K8Y5i{$VE_ zOhjA<=(p|hv)-{2XT4=lf)7oEpC=!@yIUN%yW7H_2Y)vHy!ea4Uo`%P$$Cjc`V-(i zZcmVPa&(61>b^>Bt~`6L{2Z>^J`{cXK2vr$di`}TB|#_BufrpHE1(DIxp%2J69Bz; zxj5seYoVYv1pQ?@>)U&w3IprgyHK3bzDPbbewY|VWxr=>;0%>v-}1nj&#U|1!oZog zAcOQL87U&Av3Z6lAJ-kY+3OYSkAATIkx<&TPdHR>LwNTciTzY=)(UU8?8zHf5}G4L)$3%zhR?=|2sCy z7(KX+{`ool=trN!k1mC;1nng0M*+i+D6XF$1!hU!|1Cd)?48ukJZO*9=Kd$`ZG=zR z$>#P}&F$^<=djab9=kUQZGgt5f$c3dHx=z|0&J0DPn32NhMg#m?DW)A7xsP$?JYl$ zD|u6e)r+<`>PcL6d-KDWD4+kTy;b~O^iiMpA?6CFVV5U=d#+rMsh?CAVvJmdF|r8r zfM@n&OqKJ1YmhIcOO3;rgT6CGB)vh9za3{@1zjgN`E@lUg|L z?6xCvyidiv#xG<)yi33iXSY2m=S`G864z5obDP01nv+F=cPgbtAAjFToyIdznY>%w> zbDW3Yw)*zYQ}Z11=|}%)<$2(5 ze$ad0w%|Ks50d|puj}@eiuUXuetIGLtJs`HqO50$NVK-6B&KekT;>5*;1i>R!fLdV z#i)J5MLFf`Kio4(q!+$iF-+tnqTYIj^_1?KBFd;AjqcuiM+fM=7z1feI3D^<64AXK z?UT#K!3Gs6qU;3vlpP+iS_H%>((5hETY6x#>Ci33FE-zuB+l&EdF!ORFBFea-+4RY z?n7DhJo0UO;w&m3m518--l)?Hr*&IpkeP$I*7}C-%VN*_qLqmHc8!*=$2EM(R z>tfz8YOEOh?8Bb1y(iHYebDKfp19sr==3xA!B73keZ#Hcy+6Uc^nMZ5yF++;qpYaj zzrZ&B$w#+(EpIOt>N)PmW&O|`v8ctrVFguekfNJHb!u5R1kSOvcPx0m+ai#C*$ea9pkcela!{Kw|!c4D0w z6k{82f{z{rpO%HRJ8AusF-*y%bp+N)kULSzJ>u~n8L~M?HD7Z<$mLxwoKP zfn#~Ok3nv?m?-6T!xvB|SX1SakIhiNvcP;X|9I}<3$&DG{zYad*haNNRiG4>rNsXVJJvU#;m^5pc z7{B@)@^8kP=eLk|68=woTK;>~Mxe`4=yn10xcFZCMY5Y-w-0r#aM|iFQ$+cb2>Yo2 zg6*TwSNIl-vgOxJ>^l!O@kOCM{bl>h;%G|Wj3}`_UHG2$eSG!H&nyyU&!FFU2EM%1 zN@=u^t{J}cwkN9B3x9qKf7SJsT|4ksExfA>>r=bb8bA7d>fi6j`u~XVy`Ku2>`5|c zZB6w=a`Isl=szp<*p<1ozWxOLF_n$%sO&es@g&td%1-!r_~mi-NB>w+{%KkukNmMa zR%~98fc_eOdfs?ZP8ii8`B3*%vH3Xi+%~Ug(s4UU))VQ1j;QaGd*)OA2TAr&*DIwi zV&_xp+IIqb9ps-f4QL-^Q(y9z5h~x|@XPbie^CC()aN6wvB)b@rj*9#V@3I-F9vS5 zk@k|mZhsl}AC+fMdiFNdO`bimHx_<&L|BdQqkjsbA815>(F>YnR6Biv-S{BJs2cP; zC*E4xxA)o!eKT!u?>*N}?0dj7u`jj$s@#JppQx|NJ&E>O(Dlczcg3(?^4G?On%vYl zF>1}$x~?zb?>Of1`P;3e#xEu(d8rSxqF1MGPfEI;>KJPwl(m=ELaA}jPU-=D2z}MH z2tOmNSkjIBUp~keI$$7}$ z%s?LXSC^tsCtWD4`o2l*H-lfFgf9D__wl)bJj^*CqqLubCV!X+f5^L+d~YJl82nlZ zol|`9ZM2mn)EAXw9WY&{V$erXp5gGvbkNf8ovu2j9vFu4!nI;eyJJ5N?Y^@X9WU<8}<)>j<^ey%2|62m@zsLAP1x7LK|PA}J|G z6t&dI5aNQxp)H{%1>>gCmdd7vnzgMpA&E@yxNLgO7wAthtX#V>zj)=c;M#S|u)XWj zyRs{YJ3J`Q^cup;+CtS0l}%IxdAQ0a`ARBVLQO$cl;9dp49@;|LyKeve%VFkWnU<2 z35VMKwUyQ3*7mKqHZ*m%hhn6BSG>ICQ&wHs;-6llA~`v3BKi3iQUAnHyJoihf1wn{ z{O#&?l0S@FNjgEMzZpuwMxCL>(`)?A(A)_yzcv`+b@n5ekXoucW>C)2Pr@~*R=Ruj zxwF#=T>1Hx`fsNRfg3V7d~h*=d8l#hp}9IA9-r-vYG?@yuMZuH5K#+oT7$o6I$0VX z=DQR@AI2=gYZt~dm8nAAeXc}HKXC zo_!!=z25H>!bEYPh4*k4U0A?(Gl9qYybo17@eh-xI{pW1fsdeYg7>kT9iAT&$?_!a zgU&6$Fv}$MZwKj3kQR#dMol`Z6GkNwDa1%e!>Hs3fXE!Y(PRFk8KcMkR5B)bqw~*# z8bzt13tk|QnF9$h#Ar&v%0?Fxr?lFz@l+nkIKh{?8jP~+zBEe1^i%TdXG#z#0#SJX`YY8F02G;)Q*Ff&|i3W4$pm z{xNiFl|rYJQ-6e6Chjo!WQSuxu&%@-|C(py>IYypiO}z%q+!ZGsA{l`(!5D3>w0D)1lHTBHf6K$S&ayg~)4Eo#oiDo|^kLZCzi z8l-?tDsY7iRH#6kRSs$ON#GSRJr=da9$SU3k)a(Nx>gFmkwe#8) zT7nLH6Nes`aTOeTONQz>^tKGOap)Zx>f+F!ta7qM6xt_MAvcM)zk-^RPUdbB>`}@? z0x=)_CzzBc{8e_ZiatfOSJ8hX+NbD`h&@4h%dbI7Z}BK$6)~UCU^1?)x=qBKrp#IJ z+1o${lz@K`OTLIA2sbvAfF$maV!YCihSXV(f8A5KM_f_Ma3Y&X z)7c`5+=29KgFf2qUHph<|-Dkk5XjHS4ezt&4e$K#U))kD3kKk^tkkA5iLD3?mQC5 z^sE;^D_4&@{}a#&if6V5gYyJMXJi2P3qPqe%tvxk-^GdkQcmIo@O@m;hWY-E3zz3r zkbYtr<~xhC91jylOv->*DRo2=wP2=`-vvqYl6i=htbzDNzt^nsizBS@OXO5QiilrI z(v*_%f!|;^!>{oCbX?QNb<~LXf_Wgb6 z!R0EL%)u2Zn6wBA`=G%vAE_$Uo-ks25;Bqbjrd{?NT#pe1X|g7ME4g#Cy3M$@PA@S zp<<+vj1=rdkUWwhqbZdun(UC`K{D`MKs;pNc87;3#B|}piv0&jshD@io9Q#ftpeZCr79DYUpojTNaQ6KfVp3~B(VvdLf?~-3 zhxs;ulx88hI=&P1G%B)hczpO-1n?iZbrLD2OL~hO3#=JcowXwV%GVL$wNy-(92tg- zD5@NakX-}rZ_u>tB*HV-fH*gdJs^JDWLSj+i}>wx$UutzVhLzA#?@DWh6j*jVo9MY zP|EriAUw=RGE%9!DU~~VgN$B8(UdyeFFJ*SNc|OL>Fbu9m&tQ4&OXwW;)OpU^LY?b zuY@cj#kg=ojY!C*4oT^lFo$N!s=^ZH5=|Xe2I8d%U&7))gTO2`VTtVY6nr#c*&k4e zN^%jAOfPpyUO_ZVUP*;eu8^>b=wy|4HPL=W7ZW{gTx+XHSo1P6O&^Dqu1F{$I(rpy)D6N}hxa%c&b%q38{SlRp99NOZZPFD81EqBoKGD-?YRHH>;i zUq+3gOVRZwQN%}Kn4QQ!>N5oBPdW(IgJ-1U(_}5A!}4gv1fauwQ*f45xClgwJY^v| zLV+g?KqZP_BNLVBM0NcVDd%1=)f%3fz!tY+woz_UO)HjYkD}v<_9}V=(b0+?N$#xb z-bx^PxWY#f9iwR6wZzg((YRXz@roWx*~ZJ}VvQqu+%OdwPk|{MGl2p##;TZ!6v#{# zQKZ5`(9&p=)mfwi6c(n^h&Zpg10>l-K0zR?MB91;`1z72(LM=!wxq|}WH3dKv;Xek z<82QXr5RTUYl4eI(HTvl7L8{#XiCYLXp?e^p5&sFY^jY@opNWThxtgYDAIxQlc-09 zN9*u~B2%imnIv0zfTbu)hO=c<2StfFl5U_g9XaYEtUWbIGnYfcmj-Gcg{*B-5J%j| zS8ER@Q7W;u?M()ytN}rtTq*HI3eKkl*3~4!?(5m^=>g)>yFW4 z1;4CwAgR0Pgu~i%3mBC~U+%BqP(h{DSF~0OWCiw;a7U-16>KF1m2GdQ{OLH2DJC7( zp70o5=sSo+p|`2r?${xNN3Y_b&U_(!YL70LvYZUM$OUjJi7jYkVsJJ4)$9LmfC}wo z+D~*pL-k{$`g77ywK{?Sm(x(;l>bqM$rjkH!n<^MDZ68pt~RQAIXRFn@DliP2(qfQ zJ31vNR~5N3GFdJ;h@=B)FZKm+3ygL zhPBuf9sP2MSaR|>Ar@`HcE8o(pj%1*bWUuZpR@nsoFd~_^Q7bO1_$<+wZ zD>;-FHz_UpB3e*^`m3aB{f;5zmW|hP?{vw%>vPL}u%FfBcnO`YJ>Q00`N9}O;ARnXIeRL}-T?9+}|Rf0&^v8?nPCF|HA zvi3Q$jv2Bd;r_Bzk)QA9!}U(>$4}Hne%_EkGu+1m3*Y%COB#!<`aKrHK^Q#YM@>2wR7 z_R;AvjP0(VM$ zkP5ld&FbSc)<#bn#1F#mBp%R$K1a-t+$N@g5Uc3)8_J8UBg?a#%tOa&GLhZ)X!mL| zlcz5rEw!91MaOco79E3G%+W?=;{;tE`7P|Zssm3r$-~;SV2W<%2W;x+RNWqwG}ZV6 za$ZSu(?hNq=7Tc6m}FSrmNb#vj$LvNyXfz_=jbDHa{@yP7&@k(02*iiN74qg4M*DlSoHr`K)b{*ozckVSYE;@J3!s}swqt}k7{N(Q9SpD33TRC| z+_BnxN?;WZ1}+;6Eb0%+W!$sKikG)a+(kbEV&<`YFmOeGP>M_P^Q!QV!&v84F@PfS zBv$~C%=8>Ht);iTh5 zK-MD@%qVE75ix}V7ZeNv=F)P(O7>?gfwo)U>l`5C2>8cxon=9fYn{EC0{cFKT8kQ625Vv3?B2hH&(QPjXF zYkGWQtR0^eKgt?CECIuUXQYV5uC6@|mnE?_s?^IQb_k;^Yh@xmOdp*pRwibF4^5!0&z00v)SJH7v%F0oi@l*(G<2p&DY7?a{QP5OM zn#9>fseF=L!6>ZP9K|Iww!dWt%sgeRHFF}VlM*F!!b7<;CsLNF6rn7cHUrf$m8HUJ zv9Tj!<6=p@X^tXNujvt>JSBk6n5yNt0vQO9xnxXcMDEH&B{_>z%DT?xlrk{K$p&hWX9XtQRv;}g_siE> zVw5!pdChY(txW94mJ<=}fm6#>#0hd&W$!D8NO_faxGGQAff;B0O5_1wM z(`7jzumqY6j#6vG_)W2wNT<6f76GgRD4O_IPy(!Hh>s*`zE#9W-nd$FLY-n)F_3Ug z3|Bq|BlOW?9Y>=|mrkVSSQ6n^zISG9~~9)jJ`~iXmYm$h3;eWa0Ft?xoAN(4$FE?Mg-Lk6eN3F zM+yinhIqOur9hUVv)k6^|!mp^q9QC-vB4<->wih_+q{C9O4ATlaF6ZkY237YL zF&M=uR=gnL*YqOBEU{jbZ7w!VhaI*Ob<-9%pImHBn2ph~ldqJ61YD=X%s+v7EK#4# zWNrjn!K9W5E|&~RPUDhhM@pQ)sm3^hN-k%zA_AF$9%qdfIV=qWvu`j{y)jxLn=p3K zVTs0f#whYVz5)_s6*PvgfSQ=x6M+sfc{l<+%H-n_=oKbki$F?v*o!G(9WgZwI446W3;RCRXt82_)!XzJJJ+p zb1j%&WTv=}YiU1Ub*(+bVUxd@tFVNx6?|>ttI1D~@q0urOyspbjUOQ_9N@v9RU|CnXH6)pvZFbpF4PigZ>Sbot!?3~riPZzu8et^ zbFwoRW+S0u>#S^R=*O!gB>P|~>BDhZmF>+7avUMZOBf&1swOq@@}XV>=H{zfTSAI%3$<6bbt<~Cwdx9dBP`fLI#9-2J8GHaDCTPq)iOs@XH~F9 zhx&gqte#5QhA+p3IorliJ6@kr37bRBcpC;Z%7XkOx`i8>S+gtfYDt4M2UH=rT_wG; zwY_n3XQ-3eI+`l0R0O`11_GI?@6{==Ce&0(`9Q{^s?LU{a7IJR66H+8Rr^A~{*$m4 zuTIOdM=V-1dCufHi?5$+U$tq*r82POOJA_JUORKnOnYnQyreH&Iwv`0UUJ5~n})KQg6o{6CSU})31PZq zNjg7MUY5v9mMw#}ErWIlQTBColETYCd1l*VH?2($*y)+}k#4{Jr10ArnfCqNir>5Fh)!HfkVsNefH(XObFW1HYUe=$k z&a@x#tfErbpIm*2u2W=S16g4Zx*RWd0=HKzvUhcd6H~IX)9i=sMTtx1;D2g{KlQ@Y z#dF3b&z+K%k(vbqWF}^0F)$@<+S0_-6#Pq_I&D^38fws=wm5yMn_iMeTH!r*q*-0zRYh=_uCbVGE%2xFJ3ZbPF+gsQakQd z`>I7VR%}emE>7E#m60_$ZH3*IX?JAW*<@-z+VQK>rexb=GnX!%d)OW+ z+m@ZSNhYtN(pj^~0MG-p$8O(r>9?l@p;7jfY?uRPnVB>LXZ!e-o9ugh{^`?`?bojK zPqh#DGPCUjzumS;o-^ru`_-H5Jysa{XW1#M?DS3cGgpVvzUSI6iJeK)lTxSIV}6)r zZ=q7#A6&gEC3R(L2RterT}c+%{faGD+FSo_U*DZMZ5lG2OBVllYo`76=*-n?rOHiy zdlB08)>ZZs(V6q@<%{54jqtIoz*LVHqh4!!U67uAsA*^qZw*#eHdVG%hl1^)j!^rS zkmzW*DijRUhbYwtE-6eSi{NiT2GI`(n=9KyNny!`;6;VOwWSzZDqC7YHNm#Zx=@GM z(u}W9R)z(}i6A;^MlW8IU%EQDV&(D`g5Mv6lrBNT3SQF0`;Nhj(MzwP_c5CqI>Nzv ze6dqpx^8U|UcoF~lV2>F+B@-G$&RoZV}h-19ipv%Ye%pWU+sj#&B4+x^`T8sRT-|X z7eNw@VFw?t42HW}@!ibghL#Y0%2O7HG^@g=Me#?ascvn?hb_aw>dNYRl%%<#uDuc; z6K$()5mc&RU3+V1Td-}d2;VfNS7+51I;lQF zLA=l@$7kV|Q6|=w2Fr@`3xXTgmKGHj=dWCoUjQxX^-p}tHH?>A1--Y*w(Y>ILeP7u z!WmTQTce%TVL`J9KfPcn>yM@%jpw@6>O;K5}nnBQj@}h z$VXmL&iYVSu(G2X4XF-o!VhiRrPR`*qF~{g{9sA`a=3@ov$mq;*f{CmQ(rbu!S?G!GFZlgnlyIQC_!7N$zOlUAQbAqbr z%d!UXm0g;_20N*7sBTq#E?AbM8E<`ayHXvcYHpYvS9Ugq@x|S6J9@8hBYdy2hV)nS z^&ks_nWTLMii)uuXVs>G*)Nhjn7U+2Ew zd8^*|;<9W4%d4vg|3#%tWXyXO#F%HmQWb0y+-Oys`2gQ zR(OkA)94}8{jqDc@Q{6Yc^j3tYz5q~Uk@EzTU1Ufo*=DTWIIwrhN_gxst(ae!%w?( zZf%At3UxF#v;}LMIy>sAZ=kP3%SMdxn$}p65eq(|2CdRiA+;~(E7{t4sL!Id*-)bz zpd7lm+R^dS@<~PL?5W@lsBqLZk8I?=dW77tR`*4+?YPGeXAprYC|A`>yN61Q{2`3Z z^0U;{t(`P=5H0X5j28Vq(K+jt{c|` z<$!=TRUTYfUbIHe0pzf!1}E7IQ@TjISD#U@ZPQ<37wt|K)Dv=URDY0*S^(dJDxP6Vpt01fv9MQ zgEFVDc2Jj5j*%8Y_w38nhu2qj)Cb`@lmoU6L=_E4s)(`$NV&2hp%KwY?KqL{fP>{B z1^jD@*I|gQX>V<#p-U}9V=FcUN96>v%&f-D!a0Tl&tS!V! zi+%*5xh>Le_0o%GI+QJ|1IL&1VKrMVUU#veZtlv0PWk{58TlfbysN&ktrim`waSna zP2~|-jIcXU->$kjS!O-Al8yyQa$Z|rn!mQJB)_z1ZFz9ThUG;{GUResaB(Sm{LFC7J=OJ%c)E2F~D$AIKg(HUvoE4qTMVY&Q;mvcKn zLPL<9gutNE9+s0GDVcv+BFv7{OtXYeI_nWdI-%4XR&Q;Wu1Uf2qP2R#<_rW-fRJLLxtv?_>LcuI{S>V!KppDpQ$^%SH(9Ae zT!eX5|Bk?w3k)iFk)VD71$7s$*SkZ)^{Xg)-l%7dt|2wDT8sQX3^gR#wrOh!(=yew z1m&brXqS*9y!^2k=@To_gRjMiBU(aT7?YhE!x|~Hh1XpRa$rWgm@^}FA5*p#>H-^tr($}5b>D~K26S~0%rcOmoRPem2RzYu-r6?Zj2 zzl(0J-&J=@?X98PYIaxOUiFR2J1X`B?Vno^{`wog`R%V?Q!1Z|k}5;iG()Zq7sMyr zi4T83WYO<`2OF8U0d-hkwHO`Nax|XH1lzxG#AFyBa!tN$<|}aOX~m#?I$fco=dwZh zW)G0Je9-bFGoO~rLFWath~BFP&1VrO_;-Bi{rL(|WrNE5ynI^kd}Rm7D;!kbP<%PM zpnR?GuOI3O?PN9FhZ;(L?24Dk!@+a8k?ttp%*&5IYTY^EuJKT0`OV{YjlE^et%AaUo1G>yS$pruZQpjjTi_Ei7olnc0HnLMGNZ zJb8C3AeRl=Qvb87AIWiRSVS9Q0vtArkDX9HJ__KN zpe}+QIwqW-!edm3H}DuJ9nQUI6_mV8$_x1o$u!d+=k&)`xVa%73l~_^Q)y zG8EAIQyMyo@TX}B@JW5lOo%_GxzT~V0YndGznx!K=}zUTE7_0gNawHZw;tGF`KQSD zY=wB-5N`4Yhe-c=J|b{5^Sk{jG%&ALM3^#(cg0GTLbpp58pwMEA`BHJYtM82(^L8B z(L%HQR|6X?|1Qq|loI2dP2RpC($}w2Nz}(Ko#X@Zx(QK(>3^8@*Y!mD(?e^f{&xZ+ zolHBmQN`j|&X1a@P^7H79QzS5So%k5REi6ALcZ#B`ubf?Z?K8Kb9xik=`{Y#5a~~I z`Wp@7=<@6IPl7O5WYjUXUkOK&{pjgConG5@6fm>xlYkz6c<*HjxDHc)3L8yaa!+Ve ziFR_wNRPPDTPtS%!+{N!|Nbp1eWfAX%wKU0JQJT+{O#Pp7|L&ODfXb65dT06liecT z)IS$|#jQVpkeWXZg%6ZZ-7n_+jvP%*WnA0wJ?>vJ89&8g-R>4Jewv@J(?zFel}P?+ zexQ)*h7M}>gilD2L80Z)yoGQ-j|-Y#^?zOwFmTncc|`@|S`NL`MRMv{fW|2|d%!44 zDB-%aDy+}8AnzG?*s`Y^438TK0?{8nH6v}o#xWvn^@-VjsH)%5_^8&v!?Fnl2Q z4zP`eh4hib#I3lFg5BDtD?nRhKY|0L2=Q&;BuA&eQ6&?P55fQR5cn^Lz+VAQ@<|>Y zyVOOzjq70gybqlCOSouyop%~Im8*-(wSXKPhZlUruiqhz!=7-0Vg>} zS13T+XCCwGw+J-3;J=vp^}7MNEI-J&e%e2q@p{JfBmP>?PAT7JF7kPGT*LhQ znEz~s{}02(j3+ZrA4jHQ9cDFkZ@8E7ZyWfxSWZ35S;TS=H1NUPYT^*M zpXKPslmkAM@dZQh=K~*wjsR-OLtodj9Q|na9**C@coTPT+8qWwkvpwROsnB-Dz$ax z+Opy;D(A+4>sG((_MGdXCAE*NZX41zu=_T+-sBu)Kh1Rm5^E&dfmd6n`cB$Lc~gqF zmfd$KNW-xmh#?Ap0+R?{A$ygw)R^jH4>>X(^eUHRCG>&6^!Uh>WTp`VID zQred8_gIG9Q1Ab<&Fp`AAX^AWrELp+=r%$xaJg~a9+QCkH8ZZ7Hu-CqhxpT6{JQ;` z`F1gnDW}IJhkJI3+~mS_mr2k`7w*pY6ys*Ty1|f1GjBU-zXXNq(drSJTd~81lLM5^ostHU19c zBqvp=D9`UPPWEx@3Fraq`gR-N|}-4SX--J_A3@IDRQw9=d+DoMZ#v%lv)= z*K+C^CwscvSCiVv za38OzP5HAK*X8X|>WLi2b$Kq{yYh9*XKuXSn!xxcJ@pZpKadhg|$_`FdGs%74wp@0PE3D2RWKOP@Gihmrl=_!!2? zo>?w_hD|ZEhY+*KC5Cp4^r4rXBqv9MxR$u&&v)VFF8OZ$O)lKczulFuTm79b+^x@} zF5J!koC|mJpB@7D$10`CY;OL53wO)cZ@imkZeo6Nf9@Hj;O&f)`@8WT#wQ!Neyg42 z^9=?mN58jj;-`nuGmhu~rk?t3Tf&#R>MPyF@3w>bGP&vw-F8r4BUiXvPQ?&%^b75# z|LkUda%Z=n>}OneC$x(~hknsrcPARxubY#6cQZQXlJCZkGfw<&KYYi<@5Wb*Q27)8 z`HGZh{bc~s-;L{+=FRdtZ{>sEUEZ2_C6wwV;F7Q3rq*^yM?4*E%&+aB@$e9GdKlMo zRiVv@RN+2{`nc>+MYMEJ@tmL#&gW(72Y9 z%sA=O&p%zbyI%IVa5w*97w)bX{rLdX&d)KwSzoU(Zt|aGoa|qqiXzV+F|O_N9@|IX zWzgl-cwB-?Omf_JkP{duJGjf6&bX=PB9|PuKP(#pFCGFf9|GURIO*fIXB*?DK3y(3 zxi0(k3?XN~3wPJ!LyVI>WxG?ioy0N5oqQR8fpM}Y-}sifzcz$?Kc_S0EMuJHxbJ|j zVBGXi{WS(tj{Z6W$#IV(kGkZ$>+9$c_^~1I7ly!JVce{*cU-vJ&Lne(lbB;_$W5y>+PlzLypEPT)4Zv z)G%(=%Z(;K=evIh{&e`>TkN3c0TEnljD-_ zAFBe6KX6<+<0RkhKe;a4?GJ$=@D)SgB}3pfF5I1O8{>|i+>W-p_}%*K7y`d(2z=KN zxc(B5S?_N!zgb_W7$<&reT|{V7jTe0-OKkT7w(?VKjgv#GNn4b!?>C6Nyg25KXS>* za>)^V+llmX_a|N#zQD!rW1RAJ`%fI>roWAG$yw-vHj#>U@IQMLzz_Z5I}H7wt~t-eKY?kw=&_#kp|sg7 zzl3=-p2^`V1OEk2>KhFFhrE5!X5e+a{dlE;zsva520lGO0oNP2m&dc441Bjw0XG|X z6R*=AG;sPYIy!!+E{;9*(}zb4ypgvVe{SF(bH2Ya@W1nV;134Ag3I+c1E0wH{L8>^ zU_0BWCpvV!Oi@7*Z{R%~o@n3}I}|>uw*SQjuK8;Wd>)UB ztp>hNWhb^7_!Q>9!N4;a|Av9z#CpuuF}2CmDs)WAzvPO*W%%l;5F z@O8W|w%x!V=I{*$9%MUcJLz&&a=ZJ6!C%k$?lti5a=ZAZfsbbW4;lE=Ea!U$zKYw? zqXw=YSNW-dzr^Kz$-u8-zk1EU-{JM@?+yHWYzKWiPTL`d<>-D|W zuVvik{!+`SWc!RX@RvE?*#=(1eqL(e1?->yVc^+Z-Wmh1X1iTs;FodxYBTVi9NuE! zySTo#8~9&Y{L%Z{Xi#`^+)$Hg2a24g4&(=fwt|#qyUKcs-X_KaH)+ ztM8*+Zt#DV!wm-hZEhEx2L2rDe~p2UVSThbo$puKZU+s1jX!GO*Kqs&sexa~c6iCa zv$-DMG;nSf;-rD!!2QM<1J~nVG`DZ9|MSeBXyCtN|MVMpGRw^{a9TIeae;yB{&~59 zU(N;CVBoKEyRJ6y7REOl_@x}~Ht;WS{eIQJb-mwV;Pgw~bQ~~ne05(Qj~IA`g2hh_ z{I5LTy=>qwarlIRA7;P$tAYQE{p75HYx~BsJ#;;O!g3}WxW3OZ)4)qv|M>wWo&+|G18KEdG`22MZ1PRDEme?Y-v zu7Q8Z<;peiH`!0N8TeuD2fl3JU*>-4Rs+9@$0PmNh1UNAmj6A2-{$%~YT%=|zx{=Q z|C#OehJpWv>;2CLK8pGE)9_lK->|<$v;S&*3F|Y)!0+UKEX}}YaQ$W*cq*5-$iPcj zPN{)^mFp{L;7hr_nhksl>#yhCTK{sk+YJW)A6fn_242Gb(hCN@oa^^>15aUl>c?Aj zz6)8tUf*kc7W8941r(Q$`?k6?fJmVxWXrM_?A&vL#; z415avtzJ*-axG?l?xr>TB)jui1J~Vrs)5sQM$(aE;MZ}s0Rz`^^kXtQ-|sM=e(Xi# z`st(^L(bRO-P#QNN38!12L2Lv7dIRD-E8K24E#f`mhT$)5_Zp{2ELHX`%44Y!{z%1 zepFgbh))c>m#fd#%?WzYHe?0cd8C2sZJZqjuFJdAz>``2od&M$dBDIAvVIR6xPF=N zNdteD?VzWXx*lT~KW^~9&i2&5C87Bzb9wb+I~vz^Q@?s2*{<8i-9rNJ8*BdS*dO%c zJQ~+_%QE=&Q>DEIUdYW?KZc{_yvoh!K7)S=Z_7Pl;3wJse=+cbjGr-awnG$`L+7j8 z5q|kg9vat=OX=mA#=pqjQ`ruBdaC6- z%3X;yqEoXse#|Z{?lUM*K_}Hm4WMa^d$o? zU_HNX;4kwquBVB*yd7-+g9iUg+%A4#;JV(QGH~5ae_`OdJ^t3fujlgWX_?k%Gv^!6 z(<6<)&-N@d@PBc=>t(s-e}VhYPJ{m%<*woy1AmI;eAU1o=K8wbz@KM*?l zFJiy^v4Nk@{`@lo*V`<=GVswHK4IXw+&}!q!2g5$yMG#ZE91ks9NKP&*-yq8_*V9l zTm!FU{nr`z{Ve}-1J^(ORBzyCxL(2rK8^L(kK1THFXDQ+)!<*pc7D{rzr+6a69dd`z`z^X-vW%Aw+Amaa6j88WXLIDJGUDA z`quE541W5RP&#(HaK2M6@mpLtjr(J{|Ge9U6aPxdErk9N7j2(ITwmWd_`lBl-*@38 z|L4sAgn?^&KF_$ePd&@|t%2`g{Er5{lksS_x7PCxu9pPHwfx7Kf2P5&?Ka1SlO0}X z{sk`FZMT36Cw_gKugHZHzqZ>t7f$@m+>e#JaN^hYX<=OJe+qGQY%}mUmUE+lYkh7t zDUH7Bf&Sl(=UNrcJaXr1~!l}GJU_Jlh!l}GZb3b$1z|*)M zwV!G`yuxzQ*nc&yA6LvWa4(OWiws=f{-Yn_q(jTeVg8K_yq1hUo-Gx#@{vY%NhT>fxpA} zIRjtB^{XGt(spiRd?G)aq46HZXBfEt2*o@D*UQ#`f$wHNUt{3=8NbxP_4Z4hfd_be zyoGV?|N3pMyA6K*_RJ3q{#tHFM_o9zi{G$6|J0CE!TG-I;-~iV3vMUBH~95>_G5$p zLT*R$>r_Zj`cuB2alX+Mz@f{fx8+AM?$itGqaRz-{8MK>eXWYKdGx(Xk*kHedr&X63?0Wm9!Qj_V4YwKmdRyiOgMSrw8@CwvO>Bny4179@ zK*x6s`TAoT&lvn#{!0d~%XPw#)5CW7z`%Dg{+S_XJL^A;pF-2-*B|ki!nk%fU9MRM zuJy??OQX zBYV2Op5kG16yv&F+037A@N0X{bKzvq)vRZ(3nzQ(ZG%D=PW&y*zk+d{?=sF;{#G;i zw4P~P_3J-_C{iT@$y-^IArvx4=!$Hh-_9_D&{ z(BRh}pZSTwe+zf#zjWc0@2@%ES6n#BZ{=y}n=YLAM{qs<)xZlG|A=v|{~p%gBB3}m zew6W%jBESr<@^Ez*Z#KLkn;k|sdDj?p0%vcod&=B$S~sXck#0elX~L2L*PGg;Ur%# zFP=B#>)!$f?# z8~7=<|CbG1Kh1Effd{x=?lo}zwD(~H*H7d9*uXcjoSz%`cE*2g;IASf;moxqg1FvWNbp!8V z{5=D|k@1fWd?(``emy|f<8H=B8u$cWKO`HtUN45H}GYQ|H;5lbGiOu;QB2nJ4Gp`?Wx~t zN-*$rmOt6Ra~Ypy;5CfrGOq2J#qGM#;MX4yywt#NVmbAOoV&T*g!9zsq{Y8TdY)UrjJ@{ne8T3|v3Owb8&|XE~JyK9BvdnQ>~@=PT9Zd5gh+KDUc& zUHlm?{$7J$KmB@}i@(stzt`Zugzb6A#h>Hif7sxk&h73=7yo=0|IZD6{nXp5F8(<# z{x=Q&VwV5Di$C4P|B=CeE$gqpEJpU^rY2JjPg99?z2C>}dXjPIByROkh4sQ8Nk1SaV=l_)~+G=cN_eVbNHPh_}?@5_3gVw zTt8IrZv6v{Ykl->3isQCZvJ|MU*BHXK7@Sz7NnN1KjyV-2>#uMe7*hu_z?U@4Su~n z|IQHn`gWk!M{l3Uab=tK(QgT9e(rws-9VE)*Ki-bz3qPK&uz{UgI{k~hlfz7%i!1B z$@(sXsn1@6UvKyRWC;1k41T@sdU6PU{nDH^kKXur+R+^v}UXEUz(^|bo(A^0l{em!l(hnh26v;596 zCueS6_QHh==gjx}vn8s|bF#A+Y5WUxsqh5yQhLPZ zCq1IPCR+6U!5%Y9l|_uXeoP?u2;x!^M|z&Hy$8ERbYuRxbLAxG1Z3)b==xz<{(+A# zD>!g=+td4@Yai)+0yxRL)?=?G9SXJwZYKRsojW)F-<5}SkCbPO)SJqv%d^E*o^F)q zd6cKeGp<*h3g%LoQf=rRE$HFhF*`g_y(q)_9f-Rdar?mgu5HgMJa=w>q%10r=^?S%f}VF@ z;is;jW(m7az|NHK4CHyj7PFSZHphW=c&ym>QO`ZdU)uvObsn@JFDOzP$yTY5J0ePy zKXpZAZV`uG7Kv@j(Z-PE=0K zpMo;}0rpsfGNE0(gf4l^o6z%l*yMVY_buC+b(_cPO+}fGOcR^^XuH&=kE0HPsOPVs zZ6Emv{SvMPXyYluBm0GXl<#_^y9P3rBK}GASJ)jN<7O0)>yEoECsV(R>O6>tJrpor2kG4xb zT!?mZ?awQ7E4fVrE5F1e=1&+VM(K7~>B@T*e5DI@fOb1;D8ED5rC)j=zvuO?(9+A_H`h$O$u0&m{alkukI>H*Shp(g}-7>4Ev@ki4E4<#MN`$8(J@GV< zFKrh|ls4ZR$h-R?DQ`6VrEeaEWK+Ah8ovx$_{Dna`%c_& z_oU-!2P8`%E&1SaU=%*P?FpyPrm=+^*eq&mJs2Z;zAe_jg>XvOly=Pj z%894vDY4!{n`-O<5 z`Z>Gpsr{r!I69Em5hMEEM|q}R@P*6h#Vj?=fn*%=M1($yc@0QmkI(i-;b+2yS3S7J zmnh#VL`JW}$!ke=uUD>Qy_Q_TY0x9LiM$>a=TjjqNrq&MXXFA%Qsnag12W2|M8jtM zJ66`^Ru*XMd7OrK2@Z-FVz4X~Hx)&Z_t^m42YfJ^gv2!n%a%#vu5hU8`Z>b#T9mIC zLAmIoh6!s=9puOVo`WO*48mHUKvT|9^z^1xK586YN=N^LSmf%}`YGw5j~AG*_6TwY z`hD^U!&v%B3hO^fzj4q{62w2AelXiQMk(yRp6wG@hM)&Goj{vA&@bkCcMJu@L@FYE zO=Z$z5cqW%rRiI4O`qdjtUdHu5v8fapfr7lG#v{~C84x@_kT}IRk5k6Vxuwk4439g zl@&X@F|<`!sg}g?o6(x4ik+$|wh^_d$+->*3o8&FM&(sSpGrm1$6;Q2SbONv$s~fU zsoFM1aE#Prs93phw5F37yYJMM{eq{r$r}*X43g|3$3nxI(g)h{n=^_e73B81m97;{ zA<$23#OJ6_*%eDmXR}OWvt|zi6 z)@Aar_N+qRs66QA{tk6B#n3SZKb0;lC%JN&Ta^c$-bT)G8;Mp9Bgt{nPb5hKl%MR@ z`71wpgktD$s_DN|8U518(ntA9pm&t72BN2ud~1bld_>Z5le!3N&jIjF!_V#z$1+Bz z)74t#q)_42PFRfiE_2dlHq+LgcOfhODGtuytA4IVj8-v9otlU+@Hu;kd&Xg?!LLPG zu6WhoG+Q@-(b|Z3HFz}3{wA(kSglglOv=w{lWdCKtnyG9-qJ5aT1L@f?Rg#o(R`fZ%#?zH3Mo@SwzT~EaKxdGe`)vO%)>(I$6=qyvj;aGOH-x37~W4l8C4=Ql=vq z)iBDM9-kO%$0x;)vPKU}z@peQQpBR7?P<6yiM5f~%Ovi*L{TKYR}eiz&}G;-VaHz( zd!fX9nby*YG8i>;;>tvStObtYQNs3tBZ}B#GA%Pc7V#uO#>eHjm`7wVC?)+Bg3=L6GHa7HX@o0iryBRHC1 z#Qwx|o-2QpY8ExR^CS8$owx{(0?m#HP(X&8gUXw!v?Sx_APHFtMj{u;cJ!B3qvGaJ zpEcKvA(!Q&n6LN+#}Xzlk3dX0ml~#=&Q_FYQqAw-_@a6O4?;P71>{IzLeEamao7@N ze&)_{Qk9vhw7|<9mJ&_A;y^Wed!OcqbXY>Gt-^HXD6dyRD19=M(;O%iVDd2Piw;YK z6yZ9vApK!0ORU#|^fs|28U_k#aEVYP3o3JzE***`l2_Tlysj9S*A=FqHb*lTERHXw`4e;6b*us0ARP_T>)kkts)Gn|6P&$58+=y~ZFq<)e)N?(yme?oVYlS=n{N(#=J+wZV!NN4i$ z2oz>=djxVMFrlM%J1ix8nbcowfktL3{kGYmNGg-%QI2{p!lKEK9H?6VIO+;aHRu?m zAJ*LZjd8GOZoM-zNUF~`51%7=z5a4hb_7zHM$WTAs&>yj9Hldga4M>eTau3*CV{W@ zeBIAi?Yw4sZ4s@KHpfu;ErD_#aX-X(txw}e&`u8xD)_T%+8efn+B>ouTG~3pS>e{s z>iUlA_7FBvvRd21SxpTson0C8GUsGxF3bi~byH_eD66xwts$$jqdB84)DmiMs1`ax zvI_(oGBMZ3M7Fh~p(_~P+7{}_tS1wx9~A|SUb!*U-V$n3G!`}Zkyk}y0;oGtVPm^_ zd{#=@lC^f%Dmx}K&EA?he@dGDP`7{DtU$7VTGrA_vV_O$xsy)VxAS^Z=C84@tWBA2 zkKCkLE|o0NhbTHaWhTW>yU6~*)tQ$kuPU*}_|vD@E&e4bsWXOISJ{^3r$Es9qfKo?Ew(k$N)uX5OBz#t5&8Pn_hg=gNI~uy9jSTUfdDEp9g_Pjn}G zZlS*}T36RdPMUtJ`*b9B!^Fv(+zp;vLrGq(`vq@tZC&jH?z-5_sqWaO>+9%d0ynqm zbMqRnpXq)j*5s~=)h?YdW!lY)>uRI!q`+O>HiDip9HHZrq6M^UqUfiBbS_(TXdS7M z-)1^;TGS}JZWOCUq&%E_yi|MYc-{J8}=pg2pB+%1>3tj@Gbxe5b4!svNHf4lRFZ_jU@2RA*Ph&vrP)HMv6Il^LQE z5@akv9kn}=acG5s?TS0N#}B3!*d^?dAQ#Z8nn}xN(g8K6HxbscnBM5~Y2l=c#e6d5 z)5*}A$kWW8lFha=o$=X&B- ze>&wwJC`kLrYJQm$oNrmTRNGgxVa`IGtq+IRgC7cnOnn8K9 zxhOd)oeHAKOgdSllRt#1Tz7Yl%&?$?$_)HywkMN`=5y2zzYtBW@l$JyFpx~Gjphrv zfI4Na5W-w{I*4`_lHES?2+s%UZt_dCm~N-bR97^W%w)vS`eY#*6v!C!WRW{#x1SA4 z#h7~L=sMY%$vsHsxTpJt^<*ocOb+*&Vk#(_u0y9pr(baB(bU`n*x`IAjn}DIpA+~w z*v&1iiRH_e$o6h$jlUt0ET+uCFuC|Jl}Bhz4|5T zY_gE^D8ffB%Ev9%*f{ln9Y$Kcrw@StP>48H8zxoPnwz-x=S+u07TA#XF~5n|Y^`dp zIaYPJ<;b1!Q4`~P=I@Qq-@Ra50)~a}o6E`bBj-&0I61x@cv=48G zT3r^f&>XKhdJWkcdAL7vWLJc1wEM}(z!Q;{J$;eA-;L~hJhFdhXgid%J^VJ8gqPxLt!iI_Z@`7 zwHJ#{%+L5nKD^OX1jdK9f}dNY?-q|lBohtj4uUr z7CNyko!~LLGRf&?SHPU;($fEL<56}V6v@!LWNe=7>9Lgz;YvDQk=Be8-!dzOj#HX* z5#w?&Qlym+6K>4%|Ojs`K}wAX`lPIzQh!)Qqzr|G$+Tt!*T& zt|RB)Z#H#m_z&L6Vo;cIXlPjyW<=!jS0iJ*79USGgeNO6Nc^wmj$g| zO{to3hC}j`!Um35L2K`)wBg$C#luX<&(#@8FWvqeF>RA`o|5wO9I=AdK1^wvvAoIL zDjEET2$;~??@+>U^(BR_*(TaayC!TlcUc@~uj-g6A6s6q9xng5 zy3o!Y;imMCeAqrC`AY)Xxl8hEj(p(1q#eyTZJFf91G}I{`w@SMc82rcns}%&kI;iWu$DsbQAYVw``8HI`nweD0IOl^@>epnqBk z&6M7C`K1K4!@4Tx3YJ65QfX#U7DvP#z9vM6dN`c054FR0qDENuJ7Ao)uDJqPKz7~m z%M(Kq+>*D-lU#EqmotvJ;cc%W32y2BT6vP|(0!6&f?K-THkep%cE=2p!sW`va!_ve zT<1DP!k?RrCI7%LZ;9e|+KwKgcAR(xzOVvcMx5gpO0I5yFMo>@CEWwrtRQ?E1G94y{C;qyL z_4aY;v-C2QGamX_xbDxFEpGeyQ;XaEVZ4mXbv-9o+^(l*al5_s!u4@)vbbHJ`z&tP z=cHxdZtr=yGr;xqq>u1Mkar{K?ZpA;4dahI)*WcBOBi^O>KCzQk{AJ-iihm;U zO^Ty_k0_4$0DrD?KzlP`)Y&ClaFlmY@#myIKT*6-_)Chf6pryQ?0-$p^FJ&7I??}4 zarzOD3I9}_ztO>=UbgzUHw))-dCZQm#^T)HJc$=%3p*I^?Y8u6XSNvnvEo~Vzpm`` z3qPeekDEB)pBz!{u@IO3kq{gM9XtsDyg}@al}-;o^Oghtu@riYGx5L$_~+$N?)YK{ z`qg5mpg8=vMe(ho?^7J@KcM)hqJKd+>fa=MlpKHXH-z6L9QDLWA5(htEA%_G_cLkl z9HqxsS6VI3$Gug`{g&eW!tb{@_p9gOPm8mipNsz67H9of(f2A&UmP+4pQrFcQta$j z`m}KTWFPIlD*P8pKU3`E^B4Nfay)*k^nVfkAB4mI_}Ya2%_Q#OzHix)rEX)%ez2U) zUHQC5ecq7zj8Popo-ZoiBIVI<&rCo)H%L6D_zJOqhvFDVE>s-j$a@suBzD>r|4?{N z@qY>5q&V8OQ*n&v_9{MJ+WP~=R|`L;IQ~)iHO0}-ey@0+*g2>8uY`Z7I39#}MREA? zGsRa(oW8VJcD&Gk#%nI|n-vcvK11=X5}&Jhzrxu!*M7hopTD@y z?6mCg`TmUf=ShpR{|;EAN$GJN zz<3q2{^Zdc`(N&;G~xv(w`2|6Ou?2Q1F|kHl{WEYA9ia@?P_IO`{fzkVtl{=qs4 z{(%?A#TWe_l^%cb^pRzs%iSpDUQv3iw~Ubv1N(R&;Y}82JKq;O_&yZ;`LOV>EB$QY zZHlMGZ}%#`L-g&!;Rme$^eR2d-DYw2=dZ;-PbfS1PS74p&!0Q<=*8h_i?f~2i@%jKSLt_%ezB#u*GX0=eVgdlDgKJs->x|3@XslZ`n;}qquBpI zaeS#*4yTz1iOY>CtT*C#!9M0SnqyAQenwu-gSKn^G%=|44Z@-Cka$o*zd`9So`1E1 z{)EzFoQ!9p-sjkMS?`xPCq>cC`M7%08}duU62XP +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include + + + +#if CTP_CHARGER_DETECT +#include +#endif + +#if defined(CONFIG_FB) +#include +#include + +#elif defined(CONFIG_HAS_EARLYSUSPEND) +#include +/* Early-suspend level */ +#define FT_SUSPEND_LEVEL 1 +#endif + +#if CTP_PROC_INTERFACE +#include "ft5x06_test_lib.h" +#endif + +#if CTP_LOCKDOWN_INFO +static u8 lockdown_info[FT_LOCKDOWN_SIZE]; +extern u8 tp_color; + +static u8 nomal_boot; +#endif + +static u8 TP_Maker, LCD_Maker; + +#define FT_DEBUG_DIR_NAME "ts_debug" + +#define TPD_MAX_POINTS_5 5 +#define TPD_MAX_POINTS_10 10 + +#define TPD_MAX_POINTS_2 2 +#define AUTO_CLB_NEED 1 +#define AUTO_CLB_NONEED 0 +static struct Upgrade_Info fts_updateinfo[] = { + {0x55, "FT5x06", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x03, 1, 2000}, + {0x08, "FT5606", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x06, 100, 2000}, + {0x0a, "FT5x16", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x07, 1, 1500}, + {0x05, "FT6208", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 60, 30, 0x79, 0x05, 10, 2000}, + {0x06, "FT6x06", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 100, 30, 0x79, 0x08, 10, 2000}, + {0x36, "FT6x36", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 100, 30, 0x79, 0x18, 10, 2000}, + {0x55, "FT5x06i", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x03, 1, 2000}, + {0x14, "FT5336", TPD_MAX_POINTS_10, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x13, "FT3316", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x12, "FT5436i", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x11, "FT5336i", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, +}; + +#define FT_STORE_TS_INFO(buf, id, name, max_tch, group_id, fw_vkey_support, \ + fw_name, fw_maj, fw_min, fw_sub_min) \ + snprintf(buf, FT_INFO_MAX_LEN, \ + "controller\t= focaltech\n" \ + "model\t\t= 0x%x\n" \ + "name\t\t= %s\n" \ + "max_touches\t= %d\n" \ + "drv_ver\t\t= 0x%x\n" \ + "group_id\t= 0x%x\n" \ + "fw_vkey_support\t= %s\n" \ + "fw_name\t\t= %s\n" \ + "fw_ver\t\t= %d.%d.%d\n", id, name, \ + max_tch, FT_DRIVER_VERSION, group_id, \ + fw_vkey_support, fw_name, fw_maj, fw_min, \ + fw_sub_min) + +#if CTP_PROC_INTERFACE +#define CTP_PARENT_PROC_NAME "touchscreen" +#define CTP_OPEN_PROC_NAME "ctp_openshort_test" +#define CTP_LOCKDOWN_INFOR_NAME "lockdown_info" + +#define CTP_COLOR_INFOR_NAME "panel_color" + + + + + +static struct semaphore g_device_mutex; + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); +static const struct file_operations ctp_open_procs_fops = { + .write = ctp_open_proc_write, + .read = ctp_open_proc_read, + .owner = THIS_MODULE, +}; + +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); + +static ssize_t ctp_color_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_color_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); + +static const struct file_operations ctp_lockdown_procs_fops = { + .write = ctp_lockdown_proc_write, + .read = ctp_lockdown_proc_read, + .owner = THIS_MODULE, +}; + + +static const struct file_operations ctp_color_procs_fops = { + .write = ctp_color_proc_write, + .read = ctp_color_proc_read, + .owner = THIS_MODULE, +}; + +#endif + +#if FTS_PROC_APK_DEBUG +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_RAWDATA 3 +#define PROC_AUTOCLB 4 + +#define PROC_NAME "ft5x0x-debug" +static unsigned char proc_operate_mode = PROC_RAWDATA; +static struct proc_dir_entry *ft5x0x_proc_entry +#endif + +static u8 is_ic_update_crash +static struct i2c_client *update_client + +#if CTP_CHARGER_DETECT +extern int power_supply_get_battery_charge_state(struct power_supply *psy); +static struct power_supply *batt_psy +static u8 is_charger_plug +static u8 pre_charger_status + +#endif + +#if CTP_PROC_INTERFACE +static struct i2c_client *g_focalclient +#endif + +#if CTP_PROC_INTERFACE +static int focal_i2c_Read(unsigned char *writebuf, + int writelen, unsigned char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = g_focalclient->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = g_focalclient->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(g_focalclient->adapter, msgs, 2); + if (ret < 0) + dev_err(&g_focalclient->dev, "f%s: i2c read error.\n", + __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = g_focalclient->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(g_focalclient->adapter, msgs, 1); + if (ret < 0) + dev_err(&g_focalclient->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} +/*write data by i2c*/ +static int focal_i2c_Write(unsigned char *writebuf, int writelen) +{ + int ret; + + struct i2c_msg msg[] = { + { + .addr = g_focalclient->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(g_focalclient->adapter, msg, 1); + if (ret < 0) + dev_err(&g_focalclient->dev, "%s i2c write error.\n", __func__); + + return ret; +} +#endif + +static int ft5x06_i2c_read(struct i2c_client *client, char *writebuf, + int writelen, char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) + dev_err(&client->dev, "%s: i2c read error.\n", __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} + +static int ft5x06_i2c_write(struct i2c_client *client, char *writebuf, + int writelen) { + int ret; + + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s: i2c write error.\n", __func__); + + return ret; +} + +static int ft5x0x_write_reg(struct i2c_client *client, u8 addr, const u8 val) +{ + u8 buf[2] = {0}; + + buf[0] = addr; + buf[1] = val; + + return ft5x06_i2c_write(client, buf, sizeof(buf)); +} + +static int ft5x0x_read_reg(struct i2c_client *client, u8 addr, u8 *val) +{ + return ft5x06_i2c_read(client, &addr, 1, val, 1); +} + +static void ft5x06_update_fw_vendor_id(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + u8 reg_addr; + int err; + + reg_addr = FT_REG_FW_VENDOR_ID; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_vendor_id, 1); + if (err < 0) + dev_err(&client->dev, "fw vendor id read failed"); +} + +static void ft5x06_update_fw_ver(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + u8 reg_addr; + int err; + + reg_addr = FT_REG_FW_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[0], 1); + if (err < 0) + dev_err(&client->dev, "fw major version read failed"); + + reg_addr = FT_REG_FW_MIN_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[1], 1); + if (err < 0) + dev_err(&client->dev, "fw minor version read failed"); + + reg_addr = FT_REG_FW_SUB_MIN_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[2], 1); + if (err < 0) + dev_err(&client->dev, "fw sub minor version read failed"); + + dev_info(&client->dev, "Firmware version = %d.%d.%d\n", + data->fw_ver[0], data->fw_ver[1], data->fw_ver[2]); +} + +static irqreturn_t ft5x06_ts_interrupt(int irq, void *dev_id) +{ + struct ft5x06_ts_data *data = dev_id; + struct input_dev *ip_dev; + int rc, i; + u32 id, x, y, status, num_touches; + u8 reg = 0x00, *buf; + bool update_input = false; + + if (!data) { + CTP_ERROR("%s: Invalid data\n", __func__); + return IRQ_HANDLED; + } + + +#if CTP_CHARGER_DETECT + if (!batt_psy) { + + batt_psy = power_supply_get_by_name("usb"); + } else{ + is_charger_plug = (u8)power_supply_get_battery_charge_state(batt_psy); + + + if (is_charger_plug != pre_charger_status) { + pre_charger_status = is_charger_plug; + ft5x0x_write_reg(update_client, 0x8B, is_charger_plug); + + } + } + +#endif + + ip_dev = data->input_dev; + buf = data->tch_data; + + rc = ft5x06_i2c_read(data->client, ®, 1, + buf, data->tch_data_len); + if (rc < 0) { + dev_err(&data->client->dev, "%s: read data fail\n", __func__); + return IRQ_HANDLED; + } + + for (i = 0; i < data->pdata->num_max_touches; i++) { + id = (buf[FT_TOUCH_ID_POS + FT_ONE_TCH_LEN * i]) >> 4; + if (id >= FT_MAX_ID) + break; + + update_input = true; + + x = (buf[FT_TOUCH_X_H_POS + FT_ONE_TCH_LEN * i] & 0x0F) << 8 | + (buf[FT_TOUCH_X_L_POS + FT_ONE_TCH_LEN * i]); + y = (buf[FT_TOUCH_Y_H_POS + FT_ONE_TCH_LEN * i] & 0x0F) << 8 | + (buf[FT_TOUCH_Y_L_POS + FT_ONE_TCH_LEN * i]); + + status = buf[FT_TOUCH_EVENT_POS + FT_ONE_TCH_LEN * i] >> 6; + + num_touches = buf[FT_TD_STATUS] & FT_STATUS_NUM_TP_MASK; + + /* invalid combination */ + if (!num_touches && !status && !id) + break; + + if (y == 2000) { + y = 1344; + switch (x) { + case 180: + x = 150; + break; + case 540: + x = 360; + break; + case 900: + x = 580; + break; + default: + break; + } + + } + + input_mt_slot(ip_dev, id); + if (status == FT_TOUCH_DOWN || status == FT_TOUCH_CONTACT) { + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 1); + input_report_abs(ip_dev, ABS_MT_POSITION_X, x); + input_report_abs(ip_dev, ABS_MT_POSITION_Y, y); + } else { + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 0); + } + } + + if (update_input) { + input_mt_report_pointer_emulation(ip_dev, false); + input_sync(ip_dev); + } + + if (num_touches == 0) { + for (i = 0; i < data->pdata->num_max_touches; i++) { + input_mt_slot(ip_dev, i); + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 0); + } + input_mt_report_pointer_emulation(ip_dev, false); + input_sync(ip_dev); + } + return IRQ_HANDLED; +} + +static int ft5x06_power_on(struct ft5x06_ts_data *data, bool on) +{ + int rc; + + if (!on) + goto power_off; + + rc = regulator_enable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd enable failed rc=%d\n", rc); + return rc; + } + + rc = regulator_enable(data->vcc_i2c); + if (rc) { + dev_err(&data->client->dev, + "Regulator vcc_i2c enable failed rc=%d\n", rc); + regulator_disable(data->vdd); + } + + return rc; + +power_off: + rc = regulator_disable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd disable failed rc=%d\n", rc); + return rc; + } + + rc = regulator_disable(data->vcc_i2c); + if (rc) { + dev_err(&data->client->dev, + "Regulator vcc_i2c disable failed rc=%d\n", rc); + rc = regulator_enable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd enable failed rc=%d\n", rc); + } + } + + return rc; +} + +static int ft5x06_power_init(struct ft5x06_ts_data *data, bool on) +{ + int rc; + + if (!on) + goto pwr_deinit; + + data->vdd = regulator_get(&data->client->dev, "vdd"); + if (IS_ERR(data->vdd)) { + rc = PTR_ERR(data->vdd); + dev_err(&data->client->dev, + "Regulator get failed vdd rc=%d\n", rc); + return rc; + } + + if (regulator_count_voltages(data->vdd) > 0) { + rc = regulator_set_voltage(data->vdd, FT_VTG_MIN_UV, + FT_VTG_MAX_UV); + if (rc) { + dev_err(&data->client->dev, + "Regulator set_vtg failed vdd rc=%d\n", rc); + goto reg_vdd_put; + } + } + + data->vcc_i2c = regulator_get(&data->client->dev, "vcc_i2c"); + if (IS_ERR(data->vcc_i2c)) { + rc = PTR_ERR(data->vcc_i2c); + dev_err(&data->client->dev, + "Regulator get failed vcc_i2c rc=%d\n", rc); + goto reg_vdd_set_vtg; + } + + if (regulator_count_voltages(data->vcc_i2c) > 0) { + rc = regulator_set_voltage(data->vcc_i2c, FT_I2C_VTG_MIN_UV, + FT_I2C_VTG_MAX_UV); + if (rc) { + dev_err(&data->client->dev, + "Regulator set_vtg failed vcc_i2c rc=%d\n", rc); + goto reg_vcc_i2c_put; + } + } + + return 0; + +reg_vcc_i2c_put: + regulator_put(data->vcc_i2c); +reg_vdd_set_vtg: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FT_VTG_MAX_UV); +reg_vdd_put: + regulator_put(data->vdd); + return rc; + +pwr_deinit: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FT_VTG_MAX_UV); + + regulator_put(data->vdd); + + if (regulator_count_voltages(data->vcc_i2c) > 0) + regulator_set_voltage(data->vcc_i2c, 0, FT_I2C_VTG_MAX_UV); + + regulator_put(data->vcc_i2c); + return 0; +} + +static int ft5x06_ts_pinctrl_select(struct ft5x06_ts_data *ft5x06_data, + bool on) +{ + struct pinctrl_state *pins_state; + int ret; + + pins_state = on ? ft5x06_data->gpio_state_active + : ft5x06_data->gpio_state_suspend; + if (!IS_ERR_OR_NULL(pins_state)) { + ret = pinctrl_select_state(ft5x06_data->ts_pinctrl, pins_state); + if (ret) { + dev_err(&ft5x06_data->client->dev, + "can not set %s pins\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + return ret; + } + } else { + dev_err(&ft5x06_data->client->dev, + "not a valid '%s' pinstate\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + } + + return 0; +} + + +#ifdef CONFIG_PM +static int ft5x06_ts_suspend(struct device *dev) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + char txbuf[2], i; + int err; + + if (data->loading_fw) { + dev_info(dev, "Firmware loading in process...\n"); + return 0; + } + + if (data->suspended) { + dev_info(dev, "Already in suspend state\n"); + return 0; + } + + disable_irq(data->client->irq); + + /* release all touches */ + for (i = 0; i < data->pdata->num_max_touches; i++) { + input_mt_slot(data->input_dev, i); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, 0); + } + input_mt_report_pointer_emulation(data->input_dev, false); + input_sync(data->input_dev); + + if (gpio_is_valid(data->pdata->reset_gpio)) { + txbuf[0] = FT_REG_PMODE; + txbuf[1] = FT_PMODE_HIBERNATE; + err = ft5x06_i2c_write(data->client, txbuf, sizeof(txbuf)); + + msleep(data->pdata->hard_rst_dly); + } + + + if (data->pdata->power_on) { + err = data->pdata->power_on(false); + if (err) { + dev_err(dev, "power off failed"); + goto pwr_off_fail; + } + } else { + err = ft5x06_power_on(data, false); + if (err) { + dev_err(dev, "power off failed"); + goto pwr_off_fail; + } + } + + data->suspended = true; + + return 0; + + +pwr_off_fail: + if (gpio_is_valid(data->pdata->reset_gpio)) { + gpio_set_value_cansleep(data->pdata->reset_gpio, 0); + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + enable_irq(data->client->irq); + return err; + +} + +static int ft5x06_ts_resume(struct device *dev) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + int err; + + if (!data->suspended) { + dev_dbg(dev, "Already in awake state\n"); + return 0; + } + + + if (data->pdata->power_on) { + err = data->pdata->power_on(true); + if (err) { + dev_err(dev, "power on failed"); + return err; + } + } else { + err = ft5x06_power_on(data, true); + if (err) { + dev_err(dev, "power on failed"); + return err; + } + } + + if (gpio_is_valid(data->pdata->reset_gpio)) { + gpio_set_value_cansleep(data->pdata->reset_gpio, 0); + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + + msleep(data->pdata->soft_rst_dly); + + enable_irq(data->client->irq); + +#if CTP_CHARGER_DETECT + batt_psy = power_supply_get_by_name("usb"); + if (!batt_psy) + CTP_ERROR("tp resume battery supply not found\n"); + else{ + is_charger_plug = (u8)power_supply_get_battery_charge_state(batt_psy); + + CTP_DEBUG("is_charger_plug %d, prev %d", is_charger_plug, pre_charger_status); + if (is_charger_plug) { + ft5x0x_write_reg(update_client, 0x8B, 1); + } else{ + ft5x0x_write_reg(update_client, 0x8B, 0); + } + } + pre_charger_status = is_charger_plug; +#endif + + + data->suspended = false; + + return 0; +} + +static const struct dev_pm_ops ft5x06_ts_pm_ops = { +#if (!defined(CONFIG_FB) && !defined(CONFIG_HAS_EARLYSUSPEND)) + .suspend = ft5x06_ts_suspend, + .resume = ft5x06_ts_resume, +#endif +}; + +#else +static int ft5x06_ts_suspend(struct device *dev) +{ + return 0; +} + +static int ft5x06_ts_resume(struct device *dev) +{ + return 0; +} + +#endif + +#if defined(CONFIG_FB) + +static void fb_notify_resume_work(struct work_struct *work) +{ + struct ft5x06_ts_data *ft5x06_data = + container_of(work, struct ft5x06_ts_data, fb_notify_work); + ft5x06_ts_resume(&ft5x06_data->client->dev); +} +static int fb_notifier_callback(struct notifier_block *self, + unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct ft5x06_ts_data *ft5x06_data = + container_of(self, struct ft5x06_ts_data, fb_notif); + + if (evdata && evdata->data && event == FB_EVENT_BLANK && + ft5x06_data && ft5x06_data->client) { + blank = evdata->data; + if (*blank == FB_BLANK_UNBLANK) + schedule_work(&ft5x06_data->fb_notify_work); + else if (*blank == FB_BLANK_POWERDOWN) { + flush_work(&ft5x06_data->fb_notify_work); + ft5x06_ts_suspend(&ft5x06_data->client->dev); + } + } + + return 0; +} +#elif defined(CONFIG_HAS_EARLYSUSPEND) +static void ft5x06_ts_early_suspend(struct early_suspend *handler) +{ + struct ft5x06_ts_data *data = container_of(handler, + struct ft5x06_ts_data, + early_suspend); + + ft5x06_ts_suspend(&data->client->dev); +} + +static void ft5x06_ts_late_resume(struct early_suspend *handler) +{ + struct ft5x06_ts_data *data = container_of(handler, + struct ft5x06_ts_data, + early_suspend); + + ft5x06_ts_resume(&data->client->dev); +} +#endif + +static int ft5x06_fw_upgrade_start(struct i2c_client *client, + const u8 *data, u32 data_len) +{ + struct ft5x06_ts_data *ts_data = i2c_get_clientdata(client); + struct fw_upgrade_info info = ts_data->pdata->info; + + u8 reg_addr; + u8 chip_id = 0x00; + u8 w_buf[FT_MAX_WR_BUF] = {0}, r_buf[FT_MAX_RD_BUF] = {0}; + u8 pkt_buf[FT_FW_PKT_LEN + FT_FW_PKT_META_LEN]; + int i, j, temp; + u32 pkt_num, pkt_len; + u8 is_5336_new_bootloader = false; + u8 is_5336_fwsize_30 = false; + u8 fw_ecc; + + +#if 1 + reg_addr = FT_REG_ID; + temp = ft5x06_i2c_read(client, ®_addr, 1, &chip_id, 1); + if (temp < 0) { + dev_err(&client->dev, "version read failed"); + } + + if (is_ic_update_crash) { + chip_id = CTP_IC_TYPE_1; + + } + for (i = 0; i < sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info); i++) { + if (chip_id == fts_updateinfo[i].CHIP_ID) { + info.auto_cal = fts_updateinfo[i].AUTO_CLB; + info.delay_55 = fts_updateinfo[i].delay_55; + info.delay_aa = fts_updateinfo[i].delay_aa; + info.delay_erase_flash = fts_updateinfo[i].delay_earse_flash; + info.delay_readid = fts_updateinfo[i].delay_readid; + info.upgrade_id_1 = fts_updateinfo[i].upgrade_id_1; + info.upgrade_id_2 = fts_updateinfo[i].upgrade_id_2; + + break; + } + } + + ts_data->family_id = chip_id; + + if (i >= sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info)) { + info.auto_cal = fts_updateinfo[7].AUTO_CLB; + info.delay_55 = fts_updateinfo[7].delay_55; + info.delay_aa = fts_updateinfo[7].delay_aa; + info.delay_erase_flash = fts_updateinfo[7].delay_earse_flash; + info.delay_readid = fts_updateinfo[7].delay_readid; + info.upgrade_id_1 = fts_updateinfo[7].upgrade_id_1; + info.upgrade_id_2 = fts_updateinfo[7].upgrade_id_2; + } +#endif + + CTP_DEBUG("enter fw_upgrade_start"); + dev_err(&client->dev, "id1 = 0x%x id2 = 0x%x family_id=0x%x\n", + info.upgrade_id_1, info.upgrade_id_2, ts_data->family_id); + /* determine firmware size */ + if (*(data + data_len - FT_BLOADER_SIZE_OFF) == FT_BLOADER_NEW_SIZE) + is_5336_fwsize_30 = true; + else + is_5336_fwsize_30 = false; + + + for (i = 0, j = 0; i < FT_UPGRADE_LOOP; i++) { + msleep(FT_EARSE_DLY_MS); + + if (gpio_is_valid(ts_data->pdata->reset_gpio)) { + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); + msleep(ts_data->pdata->hard_rst_dly); + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 1); + } + + if (i <= (FT_UPGRADE_LOOP / 2)) + msleep(info.delay_55 + i * 3); + else + msleep(info.delay_55 - (i - (FT_UPGRADE_LOOP / 2)) * 2); + + /* Enter upgrade mode */ + w_buf[0] = FT_UPGRADE_55; + ft5x06_i2c_write(client, &w_buf[0], 1); + usleep(FT_55_AA_DLY_NS); + w_buf[0] = FT_UPGRADE_AA; + ft5x06_i2c_write(client, &w_buf[0], 1); + + /* check READ_ID */ + msleep(info.delay_readid); + w_buf[0] = FT_READ_ID_REG; + w_buf[1] = 0x00; + w_buf[2] = 0x00; + w_buf[3] = 0x00; + + ft5x06_i2c_read(client, w_buf, 4, r_buf, 2); + + CTP_DEBUG("%X, %X", r_buf[0], r_buf[1]); + if (r_buf[0] != info.upgrade_id_1 + || r_buf[1] != info.upgrade_id_2) { + dev_err(&client->dev, "Upgrade ID mismatch(%d), IC=0x%x 0x%x, info=0x%x 0x%x\n", + i, r_buf[0], r_buf[1], + info.upgrade_id_1, info.upgrade_id_2); + } else + break; + } + + if (i >= FT_UPGRADE_LOOP) { + dev_err(&client->dev, "Abort upgrade\n"); + return -EIO; + } + + w_buf[0] = 0xcd; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 1); + + if (r_buf[0] <= 4) + is_5336_new_bootloader = FT_BLOADER_VERSION_LZ4; + else if (r_buf[0] == 7) + is_5336_new_bootloader = FT_BLOADER_VERSION_Z7; + else if (r_buf[0] >= 0x0f && + ((ts_data->family_id == FT_FT5336_FAMILY_ID_0x11) || + (ts_data->family_id == FT_FT5336_FAMILY_ID_0x12) || + (ts_data->family_id == FT_FT5336_FAMILY_ID_0x13) || + (ts_data->family_id == FT_FT5336_FAMILY_ID_0x14))) + is_5336_new_bootloader = FT_BLOADER_VERSION_GZF; + else + is_5336_new_bootloader = FT_BLOADER_VERSION_LZ4; + + dev_dbg(&client->dev, "bootloader type=%d, r_buf=0x%x, family_id=0x%x\n", + is_5336_new_bootloader, r_buf[0], ts_data->family_id); + + /* erase app and panel paramenter area */ + w_buf[0] = FT_ERASE_APP_REG; + ft5x06_i2c_write(client, w_buf, 1); + msleep(info.delay_erase_flash); + + if (is_5336_fwsize_30) { + w_buf[0] = FT_ERASE_PANEL_REG; + ft5x06_i2c_write(client, w_buf, 1); + } + msleep(FT_EARSE_DLY_MS); + + /* program firmware */ + if (is_5336_new_bootloader == FT_BLOADER_VERSION_LZ4 + || is_5336_new_bootloader == FT_BLOADER_VERSION_Z7) + data_len = data_len - FT_DATA_LEN_OFF_OLD_FW; + else + data_len = data_len - FT_DATA_LEN_OFF_NEW_FW; + + pkt_num = (data_len) / FT_FW_PKT_LEN; + pkt_len = FT_FW_PKT_LEN; + pkt_buf[0] = FT_FW_START_REG; + pkt_buf[1] = 0x00; + fw_ecc = 0; + + for (i = 0; i < pkt_num; i++) { + temp = i * FT_FW_PKT_LEN; + pkt_buf[2] = (u8) (temp >> FT_8BIT_SHIFT); + pkt_buf[3] = (u8) temp; + pkt_buf[4] = (u8) (pkt_len >> FT_8BIT_SHIFT); + pkt_buf[5] = (u8) pkt_len; + + for (j = 0; j < FT_FW_PKT_LEN; j++) { + pkt_buf[6 + j] = data[i * FT_FW_PKT_LEN + j]; + fw_ecc ^= pkt_buf[6 + j]; + } + + ft5x06_i2c_write(client, pkt_buf, + FT_FW_PKT_LEN + FT_FW_PKT_META_LEN); + msleep(FT_FW_PKT_DLY_MS); + } + + /* send remaining bytes */ + if ((data_len) % FT_FW_PKT_LEN > 0) { + temp = pkt_num * FT_FW_PKT_LEN; + pkt_buf[2] = (u8) (temp >> FT_8BIT_SHIFT); + pkt_buf[3] = (u8) temp; + temp = (data_len) % FT_FW_PKT_LEN; + pkt_buf[4] = (u8) (temp >> FT_8BIT_SHIFT); + pkt_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + pkt_buf[6 + i] = data[pkt_num * FT_FW_PKT_LEN + i]; + fw_ecc ^= pkt_buf[6 + i]; + } + + ft5x06_i2c_write(client, pkt_buf, temp + FT_FW_PKT_META_LEN); + msleep(FT_FW_PKT_DLY_MS); + } + + /* send the finishing packet */ + if (is_5336_new_bootloader == FT_BLOADER_VERSION_LZ4 || + is_5336_new_bootloader == FT_BLOADER_VERSION_Z7) { + for (i = 0; i < FT_FINISHING_PKT_LEN_OLD_FW; i++) { + if (is_5336_new_bootloader == FT_BLOADER_VERSION_Z7) + temp = FT_MAGIC_BLOADER_Z7 + i; + else if (is_5336_new_bootloader == + FT_BLOADER_VERSION_LZ4) + temp = FT_MAGIC_BLOADER_LZ4 + i; + pkt_buf[2] = (u8)(temp >> 8); + pkt_buf[3] = (u8)temp; + temp = 1; + pkt_buf[4] = (u8)(temp >> 8); + pkt_buf[5] = (u8)temp; + pkt_buf[6] = data[data_len + i]; + fw_ecc ^= pkt_buf[6]; + + ft5x06_i2c_write(client, + pkt_buf, temp + FT_FW_PKT_META_LEN); + msleep(FT_FW_PKT_DLY_MS); + } + } else if (is_5336_new_bootloader == FT_BLOADER_VERSION_GZF) { + for (i = 0; i < FT_FINISHING_PKT_LEN_NEW_FW; i++) { + if (is_5336_fwsize_30) + temp = FT_MAGIC_BLOADER_GZF_30 + i; + else + temp = FT_MAGIC_BLOADER_GZF + i; + pkt_buf[2] = (u8)(temp >> 8); + pkt_buf[3] = (u8)temp; + temp = 1; + pkt_buf[4] = (u8)(temp >> 8); + pkt_buf[5] = (u8)temp; + pkt_buf[6] = data[data_len + i]; + fw_ecc ^= pkt_buf[6]; + + ft5x06_i2c_write(client, + pkt_buf, temp + FT_FW_PKT_META_LEN); + msleep(FT_FW_PKT_DLY_MS); + + } + } + + /* verify checksum */ + w_buf[0] = FT_REG_ECC; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 1); + if (r_buf[0] != fw_ecc) { + dev_err(&client->dev, "ECC error! dev_ecc=%02x fw_ecc=%02x\n", + r_buf[0], fw_ecc); + return -EIO; + } + + /* reset */ + w_buf[0] = FT_REG_RESET_FW; + ft5x06_i2c_write(client, w_buf, 1); + msleep(ts_data->pdata->soft_rst_dly); + + dev_info(&client->dev, "Firmware upgrade successful\n"); + + return 0; +} + +static void fts_ctpm_read_lockdown(struct i2c_client *client, struct ft5x06_ts_data *data) +{ + u8 buf[128]; + u8 w_buf[4], r_buf[2]; + u32 i = 0, j = 0; + u32 k = 0; + struct ft5x06_ts_data *ts_data = i2c_get_clientdata(client); + + + for (i = 0, j = 0; i < FT_UPGRADE_LOOP; i++) { + msleep(FT_EARSE_DLY_MS); + + + if (gpio_is_valid(ts_data->pdata->reset_gpio)) { + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); + msleep(ts_data->pdata->hard_rst_dly); + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 1); + } + + if (i <= (FT_UPGRADE_LOOP / 2)) + msleep(30 + i * 3); + else + msleep(30 - (i - (FT_UPGRADE_LOOP / 2)) * 2); + + /* Enter upgrade mode */ + w_buf[0] = FT_UPGRADE_55; + ft5x06_i2c_write(client, &w_buf[0], 1); + usleep(FT_55_AA_DLY_NS); + w_buf[0] = FT_UPGRADE_AA; + ft5x06_i2c_write(client, &w_buf[0], 1); + + /* check READ_ID */ + msleep(10); + w_buf[0] = FT_READ_ID_REG; + w_buf[1] = 0x00; + w_buf[2] = 0x00; + w_buf[3] = 0x00; + + ft5x06_i2c_read(client, w_buf, 4, r_buf, 2); + + if (r_buf[0] != 0x79 || r_buf[1] != 0x11) { + continue; + } else + break; + } + /*--------- read current project setting ---------- */ + /*set read start address */ + + buf[0] = 0x03; + buf[1] = 0x00; + buf[2] = (u8)(0x07d0 >> 8); + buf[3] = (u8)(0x07d0); + + ft5x06_i2c_read(client, buf, 4, data->lockdown_info, 8); + msleep(10); + + if (gpio_is_valid(ts_data->pdata->reset_gpio)) { + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); + msleep(ts_data->pdata->hard_rst_dly); + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 1); + } + + msleep(200); + + for (k = 0 ; k < FT_LOCKDOWN_SIZE; k++) { + + lockdown_info[k] = data->lockdown_info[k]; + } + + tp_color = lockdown_info[2]; + TP_Maker = lockdown_info[0]; + LCD_Maker = lockdown_info[1]; + dev_info(&client->dev, "Lockdown info: %02X %02X %02X %02X %02X %02X %02X %02X", + lockdown_info[0], lockdown_info[1], + lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], + lockdown_info[6], lockdown_info[7]); +} + +#if TPD_AUTO_UPGRADE + +static unsigned char CTPM_FW1[] = { +#include "ft_app_ic_biel_ebbg_720p.txt" +}; + +static unsigned char CTPM_FW2[] = { +#include "ft_app_ic_oufei_boe_720p.txt" +}; + +static int fts_ctpm_fw_upgrade_with_i_file(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + int flag_TPID = 0; + u8 *pbt_buf = 0x0; + int rc = 0, fw_len = 0; + u8 uc_host_fm_ver, uc_tp_fm_ver, vendor_id, ic_type; + u8 reg_addr; + + reg_addr = 0xA6; + ft5x06_i2c_read(client, ®_addr, 1, &uc_tp_fm_ver, 1); + reg_addr = 0xA8; + ft5x06_i2c_read(client, ®_addr, 1, &vendor_id, 1); + reg_addr = 0xA3; + ft5x06_i2c_read(client, ®_addr, 1, &ic_type, 1); + + CTP_DEBUG("Vendor ID:0x%02X, TP FW:0x%02X, IC TYPE:%d", vendor_id, uc_tp_fm_ver, ic_type); + + if (vendor_id == 0xA8 || vendor_id == 0x00 || ic_type == 0xA3 || ic_type == 0x00) { + CTP_ERROR("vend_id read error,need project"); + + fts_ctpm_read_lockdown(client, data); + flag_TPID = 1; + is_ic_update_crash = 1; + } + + + if ((TP_Maker == TP_Biel && LCD_Maker == LCD_EBBG)) { + pbt_buf = CTPM_FW1; + fw_len = sizeof(CTPM_FW1); + CTP_DEBUG("BIEL+EBBG"); + } else if (((TP_Maker == TP_OUFEI && LCD_Maker == LCD_BOE)) || (vendor_id == 0x51)) { + pbt_buf = CTPM_FW2; + fw_len = sizeof(CTPM_FW2); + CTP_DEBUG("OUFEI+BOE"); + } + + else { + CTP_ERROR("read vendor_id fail"); + return -EPERM; + } + + CTP_DEBUG("update firmware size:%d", fw_len); + + if (sizeof(CTPM_FW1) < 8 || sizeof(CTPM_FW1) > 32 * 1024 || sizeof(CTPM_FW2) < 8 || sizeof(CTPM_FW2) > 32 * 1024) { + CTP_ERROR("FW length error\n"); + return -EPERM; + } + + if ((pbt_buf[fw_len - 8] ^ pbt_buf[fw_len - 6]) == 0xFF + && (pbt_buf[fw_len - 7] ^ pbt_buf[fw_len - 5]) == 0xFF + && (pbt_buf[fw_len - 3] ^ pbt_buf[fw_len - 4]) == 0xFF) { + + uc_host_fm_ver = pbt_buf[fw_len - 2]; + CTP_DEBUG("[FTS] uc_tp_fm_ver = %d.\n", uc_tp_fm_ver); + CTP_DEBUG("[FTS] uc_host_fm_ver = %d.\n", uc_host_fm_ver); + + if ((uc_tp_fm_ver < uc_host_fm_ver) || (is_ic_update_crash == 1)) { + rc = ft5x06_fw_upgrade_start(update_client, pbt_buf, fw_len); + if (rc != 0) { + CTP_DEBUG("[FTS] upgrade failed rc = %d.\n", rc); + } else { + CTP_DEBUG("[FTS] upgrade successfully.\n"); + } + } + } + + return rc; +} +#endif + +#if CTP_SYS_APK_UPDATE +static ssize_t ft5x06_fw_name_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u8 fw_version = 0x00; + + ft5x0x_read_reg(update_client, FT5x0x_REG_FW_VER, &fw_version); + + return sprintf(buf, "firmware version %02X\n", fw_version); +} + +static ssize_t ft5x06_fw_name_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + + if (size > FT_FW_NAME_MAX_LEN - 1) + return -EINVAL; + + strlcpy(data->fw_name, buf, size); + if (data->fw_name[size-1] == '\n') + data->fw_name[size-1] = 0; + + return size; +} + +static DEVICE_ATTR(fw_name, 0664, ft5x06_fw_name_show, ft5x06_fw_name_store); + +static int ft5x06_auto_cal(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + u8 temp = 0, i; + + /* set to factory mode */ + msleep(2 * data->pdata->soft_rst_dly); + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_FACTORYMODE_VALUE); + msleep(data->pdata->soft_rst_dly); + + /* start calibration */ + ft5x0x_write_reg(client, FT_DEV_MODE_REG_CAL, FT_CAL_START); + msleep(2 * data->pdata->soft_rst_dly); + for (i = 0; i < FT_CAL_RETRY; i++) { + ft5x0x_read_reg(client, FT_REG_CAL, &temp); + /*return to normal mode, calibration finish */ + if (((temp & FT_CAL_MASK) >> FT_4BIT_SHIFT) == FT_CAL_FIN) + break; + } + + /*calibration OK */ + msleep(2 * data->pdata->soft_rst_dly); + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_FACTORYMODE_VALUE); + msleep(data->pdata->soft_rst_dly); + + ft5x0x_write_reg(client, FT_DEV_MODE_REG_CAL, FT_CAL_STORE); + msleep(2 * data->pdata->soft_rst_dly); + + /* set to normal mode */ + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_WORKMODE_VALUE); + msleep(2 * data->pdata->soft_rst_dly); + + return 0; +} + + +static int ft5x06_fw_upgrade(struct device *dev, bool force) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + const struct firmware *fw = NULL; + int rc; + u8 fw_file_maj, fw_file_min, fw_file_sub_min, fw_file_vendor_id; + bool fw_upgrade = false; + + if (data->suspended) { + dev_err(dev, "Device is in suspend state: Exit FW upgrade\n"); + return -EBUSY; + } + + rc = request_firmware(&fw, data->fw_name, dev); + if (rc < 0) { + dev_err(dev, "Request firmware failed - %s (%d)\n", + data->fw_name, rc); + return rc; + } + + if (fw->size < FT_FW_MIN_SIZE || fw->size > FT_FW_MAX_SIZE) { + dev_err(dev, "Invalid firmware size (%zu)\n", fw->size); + rc = -EIO; + goto rel_fw; + } + + if (data->family_id == FT6X36_ID) { + fw_file_maj = FT_FW_FILE_MAJ_VER_FT6X36(fw); + fw_file_vendor_id = FT_FW_FILE_VENDOR_ID_FT6X36(fw); + } else { + fw_file_maj = FT_FW_FILE_MAJ_VER(fw); + fw_file_vendor_id = FT_FW_FILE_VENDOR_ID(fw); + } + fw_file_min = FT_FW_FILE_MIN_VER(fw); + fw_file_sub_min = FT_FW_FILE_SUB_MIN_VER(fw); + + dev_info(dev, "Current firmware: %d.%d.%d", data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); + dev_info(dev, "New firmware: %d.%d.%d", fw_file_maj, + fw_file_min, fw_file_sub_min); + + if (force) + fw_upgrade = true; + else if ((data->fw_ver[0] < fw_file_maj) && + data->fw_vendor_id == fw_file_vendor_id) + fw_upgrade = true; + + if (!fw_upgrade) { + dev_info(dev, "Exiting fw upgrade...\n"); + rc = -EFAULT; + goto rel_fw; + } + + /* start firmware upgrade */ + if (FT_FW_CHECK(fw, data)) { + rc = ft5x06_fw_upgrade_start(data->client, fw->data, fw->size); + if (rc < 0) + dev_err(dev, "update failed (%d). try later...\n", rc); + else if (data->pdata->info.auto_cal) + ft5x06_auto_cal(data->client); + } else { + dev_err(dev, "FW format error\n"); + rc = -EIO; + } + + ft5x06_update_fw_ver(data); + + FT_STORE_TS_INFO(data->ts_info, data->family_id, data->pdata->name, + data->pdata->num_max_touches, data->pdata->group_id, + data->pdata->fw_vkey_support ? "yes" : "no", + data->pdata->fw_name, data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); +rel_fw: + release_firmware(fw); + return rc; +} + + +static ssize_t ft5x06_update_fw_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + return snprintf(buf, 2, "%d\n", data->loading_fw); +} + +static ssize_t ft5x06_update_fw_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + unsigned long val; + int rc; + + if (size > 2) + return -EINVAL; + + rc = kstrtoul(buf, 10, &val); + if (rc != 0) + return rc; + + if (data->suspended) { + dev_info(dev, "In suspend state, try again later...\n"); + return size; + } + + mutex_lock(&data->input_dev->mutex); + if (!data->loading_fw && val) { + data->loading_fw = true; + ft5x06_fw_upgrade(dev, false); + data->loading_fw = false; + } + mutex_unlock(&data->input_dev->mutex); + + return size; +} + +static DEVICE_ATTR(update_fw, 0664, ft5x06_update_fw_show, + ft5x06_update_fw_store); + +static ssize_t ft5x06_force_update_fw_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + unsigned long val; + int rc; + + if (size > 2) + return -EINVAL; + + rc = kstrtoul(buf, 10, &val); + if (rc != 0) + return rc; + + mutex_lock(&data->input_dev->mutex); + if (!data->loading_fw && val) { + data->loading_fw = true; + ft5x06_fw_upgrade(dev, true); + data->loading_fw = false; + } + mutex_unlock(&data->input_dev->mutex); + + return size; +} + +static DEVICE_ATTR(force_update_fw, 0664, ft5x06_update_fw_show, + ft5x06_force_update_fw_store); + + +#define FT_DEBUG_DIR_NAME "ts_debug" + +static bool ft5x06_debug_addr_is_valid(int addr) +{ + if (addr < 0 || addr > 0xFF) { + pr_err("FT reg address is invalid: 0x%x\n", addr); + return false; + } + + return true; +} + +static int ft5x06_debug_data_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) + dev_info(&data->client->dev, + "Writing into FT registers not supported\n"); + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +static int ft5x06_debug_data_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + int rc; + u8 reg; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) { + rc = ft5x0x_read_reg(data->client, data->addr, ®); + if (rc < 0) + dev_err(&data->client->dev, + "FT read register 0x%x failed (%d)\n", + data->addr, rc); + else + *val = reg; + } + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_data_fops, ft5x06_debug_data_get, + ft5x06_debug_data_set, "0x%02llX\n"); + +static int ft5x06_debug_addr_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + if (ft5x06_debug_addr_is_valid(val)) { + mutex_lock(&data->input_dev->mutex); + data->addr = val; + mutex_unlock(&data->input_dev->mutex); + } + + return 0; +} + +static int ft5x06_debug_addr_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) + *val = data->addr; + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_addr_fops, ft5x06_debug_addr_get, + ft5x06_debug_addr_set, "0x%02llX\n"); + +static int ft5x06_debug_suspend_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (val) + ft5x06_ts_suspend(&data->client->dev); + else + ft5x06_ts_resume(&data->client->dev); + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +static int ft5x06_debug_suspend_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + *val = data->suspended; + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_suspend_fops, ft5x06_debug_suspend_get, + ft5x06_debug_suspend_set, "%lld\n"); + +static int ft5x06_debug_dump_info(struct seq_file *m, void *v) +{ + struct ft5x06_ts_data *data = m->private; + + seq_printf(m, "%s\n", data->ts_info); + + return 0; +} + +static int debugfs_dump_info_open(struct inode *inode, struct file *file) +{ + return single_open(file, ft5x06_debug_dump_info, inode->i_private); +} + +static const struct file_operations debug_dump_info_fops = { + .owner = THIS_MODULE, + .open = debugfs_dump_info_open, + .read = seq_read, + .release = single_release, +}; + +#endif + +static int ft5x0x_GetFirmwareSize(char *firmware_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[128]; + memset(filepath, 0, sizeof(filepath)); + + sprintf(filepath, "%s", firmware_name); + CTP_ERROR("filepath=%s\n", filepath); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + CTP_ERROR("error occured while opening file %s.\n", filepath); + return -EPERM; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +static int ft5x0x_ReadFirmware(char *firmware_name, unsigned char *firmware_buf) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s", firmware_name); + CTP_INFO("filepath=%s\n", filepath); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + CTP_ERROR("error occured while opening file %s.\n", filepath); + return -EPERM; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + + vfs_read(pfile, firmware_buf, fsize, &pos); + + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +static void delay_qt_ms(unsigned long w_ms) +{ + unsigned long i; + unsigned long j; + + for (i = 0; i < w_ms; i++) { + for (j = 0; j < 1000; j++) { + udelay(1); + } + } +} + +static int fts_ctpm_auto_clb(void) +{ + unsigned char uc_temp; + unsigned char i ; + + printk("[FTS] start auto CLB.\n"); + msleep(200); + ft5x0x_write_reg(update_client, 0, 0x40); + delay_qt_ms(100); + ft5x0x_write_reg(update_client, 2, 0x4); + delay_qt_ms(300); + for (i = 0; i < 100; i++) { + ft5x0x_read_reg(update_client, 0, &uc_temp); + if (((uc_temp&0x70)>>4) == 0x0) { + break; + } + delay_qt_ms(200); + printk("[FTS] waiting calibration %d\n", i); + } + + printk("[FTS] calibration OK.\n"); + + msleep(300); + ft5x0x_write_reg(update_client, 0, 0x40); + delay_qt_ms(100); + ft5x0x_write_reg(update_client, 2, 0x5); + delay_qt_ms(300); + ft5x0x_write_reg(update_client, 0, 0x0); + msleep(300); + printk("[FTS] store CLB result OK.\n"); + return 0; +} + + +static int fts_ctpm_fw_upgrade_with_app_file(char *firmware_name) +{ + unsigned char *pbt_buf = NULL; + int i_ret; + u8 fwver; + int fwsize = ft5x0x_GetFirmwareSize(firmware_name); + + CTP_DEBUG("enter fw_upgrade_with_app_file"); + if (fwsize <= 0) { + CTP_ERROR("%s ERROR:Get firmware size failed\n", __FUNCTION__); + return -EPERM; + } + + pbt_buf = (unsigned char *) kmalloc(fwsize+1, GFP_ATOMIC); + if (ft5x0x_ReadFirmware(firmware_name, pbt_buf)) { + CTP_ERROR("%s() - ERROR: request_firmware failed\n", __FUNCTION__); + kfree(pbt_buf); + return -EPERM; + } + + + + if ((pbt_buf[fwsize - 8] ^ pbt_buf[fwsize - 6]) != 0xFF + || (pbt_buf[fwsize - 7] ^ pbt_buf[fwsize - 5]) != 0xFF + || (pbt_buf[fwsize - 3] ^ pbt_buf[fwsize - 4]) != 0xFF) { + CTP_ERROR("the update file is not correct, please check\n"); + CTP_ERROR("checksum is %2x, %2x, %2x, %2x, %2x, %2x", pbt_buf[fwsize - 8], pbt_buf[fwsize - 6], pbt_buf[fwsize - 7], pbt_buf[fwsize - 5], pbt_buf[fwsize - 3], pbt_buf[fwsize - 4]); + return -EPERM; + } + /*call the upgrade function*/ + i_ret = ft5x06_fw_upgrade_start(update_client, pbt_buf, fwsize); + if (i_ret != 0) { + CTP_ERROR("%s() - ERROR:[FTS] upgrade failed i_ret = %d.\n", __FUNCTION__, i_ret); + + + } else { + CTP_INFO("[FTS] upgrade successfully.\n"); + if (ft5x0x_read_reg(update_client, FT5x0x_REG_FW_VER, &fwver) >= 0) + CTP_INFO("the new fw ver is 0x%02x\n", fwver); + + } + kfree(pbt_buf); + return i_ret; +} + +#if CTP_SYS_APK_UPDATE + +static ssize_t ft5x0x_fwupgradeapp_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} +#endif + +#if CTP_SYS_APK_UPDATE + +static ssize_t ft5x0x_fwupgradeapp_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + + + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + char fwname[128]; + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + + disable_irq(client->irq); + + fts_ctpm_fw_upgrade_with_app_file(fwname); + + enable_irq(client->irq); + + return count; +} + +#endif + +#if CTP_SYS_APK_UPDATE + +static DEVICE_ATTR(ftsfwupgradeapp, S_IRUGO|S_IWUSR, ft5x0x_fwupgradeapp_show, ft5x0x_fwupgradeapp_store); +#endif + +#if CTP_PROC_INTERFACE + +#define FT5X0X_INI_FILEPATH "/system/etc/" + +static int ft5x0x_GetInISize(char *config_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[128]; + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FT5X0X_INI_FILEPATH, config_name); + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pr_err("error occured while opening file %s.\n", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +static int ft5x0x_ReadInIData(char *config_name, char *config_buf) + +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FT5X0X_INI_FILEPATH, config_name); + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pr_err("error occured while opening file %s.\n", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, config_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +static int ft5x0x_get_testparam_from_ini(char *config_name) + +{ + char *filedata = NULL; + int inisize = ft5x0x_GetInISize(config_name); + CTP_INFO("inisize = %d \n ", inisize); + if (inisize <= 0) { + pr_err("%s ERROR:Get firmware size failed\n", __func__); + return -EIO; + } + filedata = kmalloc(inisize + 1, GFP_ATOMIC); + if (ft5x0x_ReadInIData(config_name, filedata)) { + pr_err("%s() - ERROR: request_firmware failed\n", __func__); + kfree(filedata); + return -EIO; + } else { + CTP_INFO("ft5x0x_ReadInIData successful\n"); + } + SetParamData(filedata); + return 0; +} + +#if CTP_SYS_APK_UPDATE +static ssize_t ft5x0x_ftsmcaptest_show(struct device *dev, struct device_attribute *attr, char *buf) + +{ + /* place holder for future use */ + return -EPERM; +} + +static ssize_t ft5x0x_ftsmcaptest_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) + +{ + char cfgname[128]; + memset(cfgname, 0, sizeof(cfgname)); + sprintf(cfgname, "%s", buf); + cfgname[count-1] = '\0'; + Init_I2C_Write_Func(focal_i2c_Write); + Init_I2C_Read_Func(focal_i2c_Read); + if (ft5x0x_get_testparam_from_ini(cfgname) < 0) + CTP_ERROR("get testparam from ini failure\n"); + else { + if (true == StartTestTP()) + CTP_INFO("tp test pass\n"); + else + CTP_INFO("tp test failure\n"); + FreeTestParamData(); + } + return count; +} + +static DEVICE_ATTR(ftsmcaptest, S_IRUGO|S_IWUSR, ft5x0x_ftsmcaptest_show, ft5x0x_ftsmcaptest_store); +#endif + +#endif + +#ifdef CONFIG_OF +static int ft5x06_get_dt_coords(struct device *dev, char *name, + struct ft5x06_ts_platform_data *pdata) +{ + u32 coords[FT_COORDS_ARR_SIZE]; + struct property *prop; + struct device_node *np = dev->of_node; + int coords_size, rc; + + prop = of_find_property(np, name, NULL); + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + coords_size = prop->length / sizeof(u32); + if (coords_size != FT_COORDS_ARR_SIZE) { + dev_err(dev, "invalid %s\n", name); + return -EINVAL; + } + + rc = of_property_read_u32_array(np, name, coords, coords_size); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read %s\n", name); + return rc; + } + + if (!strcmp(name, "ftech,panel-coords")) { + pdata->panel_minx = coords[0]; + pdata->panel_miny = coords[1]; + pdata->panel_maxx = coords[2]; + pdata->panel_maxy = coords[3]; + } else if (!strcmp(name, "ftech,display-coords")) { + pdata->x_min = coords[0]; + pdata->y_min = coords[1]; + pdata->x_max = coords[2]; + pdata->y_max = coords[3]; + } else { + dev_err(dev, "unsupported property %s\n", name); + return -EINVAL; + } + + return 0; +} + +static int ft5x06_parse_dt(struct device *dev, + struct ft5x06_ts_platform_data *pdata) +{ + int rc; + struct device_node *np = dev->of_node; + struct property *prop; + u32 temp_val, num_buttons; + u32 button_map[MAX_BUTTONS]; + + pdata->name = "ftech"; + rc = of_property_read_string(np, "ftech,name", &pdata->name); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read name\n"); + return rc; + } + + rc = ft5x06_get_dt_coords(dev, "ftech,panel-coords", pdata); + if (rc && (rc != -EINVAL)) + return rc; + + rc = ft5x06_get_dt_coords(dev, "ftech,display-coords", pdata); + if (rc) + return rc; + + + pdata->i2c_pull_up = of_property_read_bool(np, + "ftech,i2c-pull-up"); + + pdata->no_force_update = of_property_read_bool(np, + "ftech,no-force-update"); + /* reset, irq gpio info */ + pdata->reset_gpio = of_get_named_gpio_flags(np, "ftech,reset-gpio", + 0, &pdata->reset_gpio_flags); + if (pdata->reset_gpio < 0) + return pdata->reset_gpio; + + pdata->irq_gpio = of_get_named_gpio_flags(np, "ftech,irq-gpio", + 0, &pdata->irq_gpio_flags); + if (pdata->irq_gpio < 0) + return pdata->irq_gpio; + + pdata->fw_name = "ft_fw.bin"; + rc = of_property_read_string(np, "ftech,fw-name", &pdata->fw_name); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw name\n"); + return rc; + } + + rc = of_property_read_u32(np, "ftech,group-id", &temp_val); + if (!rc) + pdata->group_id = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,hard-reset-delay-ms", + &temp_val); + if (!rc) + pdata->hard_rst_dly = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,soft-reset-delay-ms", + &temp_val); + if (!rc) + pdata->soft_rst_dly = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,num-max-touches", &temp_val); + if (!rc) + pdata->num_max_touches = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,fw-delay-aa-ms", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay aa\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_aa = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-55-ms", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay 55\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_55 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-upgrade-id1", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw upgrade id1\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.upgrade_id_1 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-upgrade-id2", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw upgrade id2\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.upgrade_id_2 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-readid-ms", + &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay read id\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_readid = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-era-flsh-ms", + &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay erase flash\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_erase_flash = temp_val; + + pdata->info.auto_cal = of_property_read_bool(np, + "ftech,fw-auto-cal"); + + pdata->fw_vkey_support = of_property_read_bool(np, + "ftech,fw-vkey-support"); + + pdata->ignore_id_check = of_property_read_bool(np, + "ftech,ignore-id-check"); + + rc = of_property_read_u32(np, "ftech,family-id", &temp_val); + if (!rc) + pdata->family_id = temp_val; + else + return rc; + + prop = of_find_property(np, "ftech,button-map", NULL); + if (prop) { + num_buttons = prop->length / sizeof(temp_val); + if (num_buttons > MAX_BUTTONS) + return -EINVAL; + + rc = of_property_read_u32_array(np, + "ftech,button-map", button_map, + num_buttons); + if (rc) { + dev_err(dev, "Unable to read key codes\n"); + return rc; + } + } + + return 0; +} +#else +static int ft5x06_parse_dt(struct device *dev, + struct ft5x06_ts_platform_data *pdata) +{ + return -ENODEV; +} +#endif + +#if CTP_PROC_INTERFACE +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + + if (*ppos) { + CTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + return sprintf(ptr, "%02X%02X%02X%02X%02X%02X%02X%02X\n", + lockdown_info[0], lockdown_info[1], lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], lockdown_info[6], lockdown_info[7]); + +} + +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static ssize_t ctp_color_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + + if (*ppos) { + CTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + return sprintf(ptr, "%02X\n", lockdown_info[2]); + +} + +static ssize_t ctp_color_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + char cfgname[128]; + u8 fw_info[6] = {0x00}; + u8 reg_addr = 0xA3; + u8 result = 0; + + if (*ppos) { + CTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + ft5x06_i2c_read(update_client, ®_addr, 1, fw_info, 6); + CTP_INFO("ic is %x", fw_info[5]); + + if (fw_info[5] == VENDOR_BIEL_1080P) { + sprintf(cfgname, "%s", "ft5336_biel_1080p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else if (fw_info[5] == VENDOR_BIEL_720P) { + sprintf(cfgname, "%s", "ft5336_biel_720p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else if (fw_info[5] == VENDOR_TPK_1080P) { + sprintf(cfgname, "%s", "ft5336_tpk_1080p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else if (fw_info[5] == VENDOR_TPK_720P) { + sprintf(cfgname, "%s", "ft5336_tpk_720p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else if (fw_info[5] == VENDOR_O_FILM) { + sprintf(cfgname, "%s", "ft5336_oufei_720p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else if (fw_info[5] == VENDOR_LENS_720P) { + sprintf(cfgname, "%s", "ft5336_lens_720p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else { + CTP_INFO("no ini match the project ctp,please check!"); + return count; + } + + Init_I2C_Write_Func(focal_i2c_Write); + Init_I2C_Read_Func(focal_i2c_Read); + if (ft5x0x_get_testparam_from_ini(cfgname) < 0) { + CTP_ERROR("get testparam from ini failure\n"); + sprintf(ptr, "result=%d\n", 0); + } else { + if (true == StartTestTP()) { + CTP_INFO("tp test pass\n"); + result = 1; + + } else { + CTP_INFO("tp test failure\n"); + result = 0; + + } + FreeTestParamData(); + } + return sprintf(ptr, "result=%d\n", result); +} +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static void create_ctp_proc(void) +{ + + + + + + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_open_proc = NULL; + struct proc_dir_entry *ctp_lockdown_proc = NULL; + struct proc_dir_entry *ctp_color_proc = NULL; + + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + CTP_ERROR("ft5x06: create parent_proc fail\n"); + return; + } + + ctp_open_proc = proc_create(CTP_OPEN_PROC_NAME, 0777, ctp_device_proc, &ctp_open_procs_fops); + if (ctp_open_proc == NULL) { + CTP_ERROR("ft5x06: create open_proc fail\n"); + } + + ctp_lockdown_proc = proc_create(CTP_LOCKDOWN_INFOR_NAME, 0666, ctp_device_proc, &ctp_lockdown_procs_fops); + if (ctp_lockdown_proc == NULL) { + CTP_ERROR("ft5x06: create ctp_lockdown_proc fail\n"); + } + + + ctp_color_proc = proc_create(CTP_COLOR_INFOR_NAME, 0666, ctp_device_proc, &ctp_color_procs_fops); + if (ctp_color_proc == NULL) { + CTP_ERROR("ft5x06: create ctp_color_proc fail\n"); + } + +} +#endif + +#if WT_ADD_CTP_INFO +static int hardwareinfo_set(struct ft5x06_ts_data *data, u8 value_name, u8 color) +{ + char firmware_ver[HARDWARE_MAX_ITEM_LONGTH]; + char vendor_for_id[HARDWARE_MAX_ITEM_LONGTH]; + char ic_name[HARDWARE_MAX_ITEM_LONGTH]; + char ic_color[HARDWARE_MAX_ITEM_LONGTH]; + int err; + + u8 uc_tp_fm_ver, reg_addr; + if (lockdown_info[0] == TP_Biel) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "BIEL_HD"); + else if (lockdown_info[0] == TP_OUFEI) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "OUFEI_HD"); + else if (lockdown_info[0] == TP_LENS) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "LENS_HD"); + else + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "Other vendor"); + + switch (value_name) { + case IC_FT5X06: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5X06"); + break; + case IC_FT5606: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5606"); + break; + case IC_FT5X16: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5X16"); + break; + case IC_FT6208: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6208"); + break; + case IC_FT6X06: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6X06"); + break; + case IC_FT6X36: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6X36"); + break; + case IC_FT5336: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5336"); + break; + case IC_FT3316: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT3316"); + break; + case IC_FT5436i: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5436i"); + break; + case IC_FT5336i: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5336i"); + break; + default: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "Other IC"); + } + + switch (color) { + case TP_White: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "White"); + break; + case TP_Black: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "Black"); + break; + case TP_Golden: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "Golden"); + break; + default: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "other Color"); + } + + + if (nomal_boot) { + reg_addr = 0xA6; + ft5x06_i2c_read(data->client, ®_addr, 1, &uc_tp_fm_ver, 1); + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x, %s", vendor_for_id, ic_name, uc_tp_fm_ver, ic_color); + } else + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x, %s", vendor_for_id, ic_name, data->fw_ver[0], ic_color); + + err = hardwareinfo_set_prop(HARDWARE_TP, firmware_ver); + if (err < 0) + return -EPERM; + + return 0; +} +#endif +#if FTS_PROC_APK_DEBUG +static int ft5x0x_i2c_Read(struct i2c_client *client, char *writebuf, + int writelen, char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) + dev_err(&client->dev, "f%s: i2c read error.\n", + __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} +/*write data by i2c*/ +static int ft5x0x_i2c_Write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret; + + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(client->adapter, msg, 1); + if (ret < 0) + dev_err(&client->dev, "%s i2c write error.\n", __func__); + + return ret; +} + +static ssize_t ft5x0x_debug_write(struct file *filp, const char __user *buff, size_t len, loff_t *ppos) +{ + struct i2c_client *client = update_client; + unsigned char writebuf[FTS_PACKET_LENGTH]; + int buflen = len; + int writelen = 0; + int ret = 0; + + if (*ppos) + return -EPERM; + + if (copy_from_user(&writebuf, buff, buflen)) { + dev_err(&client->dev, "%s:copy from user error\n", __func__); + return -EFAULT; + } + proc_operate_mode = writebuf[0]; + CTP_INFO("write mode %x", proc_operate_mode); + switch (proc_operate_mode) { + case PROC_UPGRADE: + { + char upgrade_file_path[128]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + + disable_irq(client->irq); + + ret = fts_ctpm_fw_upgrade_with_app_file(upgrade_file_path); + + enable_irq(client->irq); + if (ret < 0) { + dev_err(&client->dev, "%s:upgrade failed.\n", __func__); + return ret; + } + } + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = ft5x0x_i2c_Write(client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&client->dev, "%s:write iic error\n", __func__); + return ret; + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = ft5x0x_i2c_Write(client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&client->dev, "%s:write iic error\n", __func__); + return ret; + } + break; + case PROC_RAWDATA: + break; + case PROC_AUTOCLB: + fts_ctpm_auto_clb(); + break; + default: + break; + } + + *ppos += len; + return len; +} + +static unsigned char debug_read_buf[PAGE_SIZE]; + +/*interface of read proc*/ +static ssize_t ft5x0x_debug_read(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) +{ + struct i2c_client *client = update_client; + int ret = 0; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + + if (*ppos) + return -EPERM; + + switch (proc_operate_mode) { + case PROC_UPGRADE: + /*after calling ft5x0x_debug_write to upgrade*/ + regaddr = 0xA6; + ret = ft5x0x_read_reg(client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(debug_read_buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(debug_read_buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = ft5x0x_i2c_Read(client, NULL, 0, debug_read_buf, readlen); + if (ret < 0) { + dev_err(&client->dev, "%s:read iic error\n", __func__); + return ret; + } else + + num_read_chars = 1; + break; + case PROC_RAWDATA: + break; + default: + break; + } + + memcpy(user_buf, debug_read_buf, num_read_chars); + *ppos += num_read_chars; + return num_read_chars; +} + +static const struct file_operations ctp_apk_proc_fops = { + .write = ft5x0x_debug_write, + .read = ft5x0x_debug_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static int ft5x0x_create_apk_debug_channel(struct i2c_client *client) +{ + ft5x0x_proc_entry = proc_create(PROC_NAME, 0666, NULL, &ctp_apk_proc_fops); + if (NULL == ft5x0x_proc_entry) { + dev_err(&client->dev, "Couldn't create proc entry!\n"); + return -ENOMEM; + } + return 0; +} + +static void ft5x0x_release_apk_debug_channel(void) +{ + if (ft5x0x_proc_entry) + remove_proc_entry(PROC_NAME, NULL); +} + +#endif + + +int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, 10); + dev_err(&client->dev, "cmd_line =%s \n", cmd_line); + if (ret == 0) { + dev_err(&client->dev, "mode: ffbm\n"); + return 1;/* factory mode*/ + } + else { + dev_err(&client->dev, "mode: no ffbm\n"); + return 2;/* no factory mode*/ + } + } + + nomal_boot = 1; + dev_err(&client->dev, "has no androidboot.mode \n"); + return 0; +} + +static int ft5x06_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) { + struct ft5x06_ts_platform_data *pdata; + struct ft5x06_ts_data *data; + struct input_dev *input_dev; + struct dentry *temp; + u8 reg_value; + u8 reg_addr; + int err; + int len; + u8 ic_name; +#if TPD_AUTO_UPGRADE + int ret_auto_upgrade = 0; + int i; +#endif + + temp = NULL; + update_client = client; +#if CTP_PROC_INTERFACE + g_focalclient = client; + sema_init(&g_device_mutex, 1); +#endif + + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, + sizeof(struct ft5x06_ts_platform_data), GFP_KERNEL); + if (!pdata) { + dev_err(&client->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + err = ft5x06_parse_dt(&client->dev, pdata); + if (err) { + dev_err(&client->dev, "DT parsing failed\n"); + return err; + } + } else + pdata = client->dev.platform_data; + + if (!pdata) { + dev_err(&client->dev, "Invalid pdata\n"); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "I2C not supported\n"); + return -ENODEV; + } + + data = devm_kzalloc(&client->dev, + sizeof(struct ft5x06_ts_data), GFP_KERNEL); + if (!data) { + dev_err(&client->dev, "Not enough memory\n"); + return -ENOMEM; + } + + if (pdata->fw_name) { + len = strlen(pdata->fw_name); + if (len > FT_FW_NAME_MAX_LEN - 1) { + dev_err(&client->dev, "Invalid firmware name\n"); + return -EINVAL; + } + + strlcpy(data->fw_name, pdata->fw_name, len + 1); + } + + data->tch_data_len = FT_TCH_LEN(pdata->num_max_touches); + data->tch_data = devm_kzalloc(&client->dev, + data->tch_data_len, GFP_KERNEL); + if (!data) { + return -ENOMEM; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + return -ENOMEM; + } + + data->input_dev = input_dev; + data->client = client; + data->pdata = pdata; + + input_dev->name = "ft5x06_720p"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + input_set_drvdata(input_dev, data); + i2c_set_clientdata(client, data); + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + input_mt_init_slots(input_dev, pdata->num_max_touches, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, + pdata->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, + pdata->y_max, 0, 0); + + err = input_register_device(input_dev); + if (err) { + dev_err(&client->dev, "Input device registration failed\n"); + goto free_inputdev; + } + + if (pdata->power_init) { + err = pdata->power_init(true); + if (err) { + dev_err(&client->dev, "power init failed"); + goto unreg_inputdev; + } + } else { + err = ft5x06_power_init(data, true); + if (err) { + dev_err(&client->dev, "power init failed"); + goto unreg_inputdev; + } + } + + if (pdata->power_on) { + err = pdata->power_on(true); + if (err) { + dev_err(&client->dev, "power on failed"); + goto pwr_deinit; + } + } else { + err = ft5x06_power_on(data, true); + if (err) { + dev_err(&client->dev, "power on failed"); + goto pwr_deinit; + } + } + if (gpio_is_valid(pdata->irq_gpio)) { + err = gpio_request(pdata->irq_gpio, "ft5x06_irq_gpio"); + if (err) { + dev_err(&client->dev, "irq gpio request failed"); + goto pwr_off; + } + err = gpio_direction_input(pdata->irq_gpio); + if (err) { + dev_err(&client->dev, + "set_direction for irq gpio failed\n"); + goto free_irq_gpio; + } + } + + if (gpio_is_valid(pdata->reset_gpio)) { + err = gpio_request(pdata->reset_gpio, "ft5x06_reset_gpio"); + if (err) { + goto free_irq_gpio; + } + + err = gpio_direction_output(pdata->reset_gpio, 0); + if (err) { + dev_err(&client->dev, + "set_direction for reset gpio failed\n"); + goto free_reset_gpio; + } + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + + /* make sure CTP already finish startup process */ + msleep(data->pdata->soft_rst_dly); + + /* check the controller id */ + reg_addr = FT_REG_ID; + err = ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) { + dev_err(&client->dev, "version read failed"); + + client->addr = 0x3E; + err = ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) { + dev_err(&client->dev, "version read failed addr -----3E"); + goto free_reset_gpio; + + } + } + ic_name = reg_value; + + dev_info(&client->dev, "Device ID = 0x%x\n", reg_value); + + if ((pdata->family_id != reg_value) && (!pdata->ignore_id_check)) { + dev_err(&client->dev, "%s:Unsupported controller\n", __func__); + goto free_reset_gpio; + } + + data->family_id = pdata->family_id; + + err = request_threaded_irq(client->irq, NULL, + ft5x06_ts_interrupt, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + client->dev.driver->name, data); + if (err) { + dev_err(&client->dev, "request irq failed\n"); + goto free_reset_gpio; + } + + disable_irq(data->client->irq); + +#if CTP_SYS_APK_UPDATE + err = device_create_file(&client->dev, &dev_attr_fw_name); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_ftsfwupgradeapp); + if (err) { + dev_err(&client->dev, "upgradeapp sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_ftsmcaptest); + if (err) { + dev_err(&client->dev, "ftsmcaptest sys file creation failed\n"); + } + err = device_create_file(&client->dev, &dev_attr_update_fw); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_force_update_fw); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + data->dir = debugfs_create_dir(FT_DEBUG_DIR_NAME, NULL); + if (data->dir == NULL || IS_ERR(data->dir)) { + pr_err("debugfs_create_dir failed(%ld)\n", PTR_ERR(data->dir)); + err = PTR_ERR(data->dir); + } else { + temp = debugfs_create_file("addr", S_IRUSR | S_IWUSR, data->dir, data, + &debug_addr_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("data", S_IRUSR | S_IWUSR, data->dir, data, + &debug_data_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("suspend", S_IRUSR | S_IWUSR, data->dir, + data, &debug_suspend_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("dump_info", S_IRUSR | S_IWUSR, data->dir, + data, &debug_dump_info_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + } +#endif + + data->ts_info = devm_kzalloc(&client->dev, + FT_INFO_MAX_LEN, GFP_KERNEL); + if (!data->ts_info) { + dev_err(&client->dev, "Not enough memory\n"); + goto free_irq_gpio; + } + + /*get some register information */ + reg_addr = FT_REG_POINT_RATE; + ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + dev_err(&client->dev, "report rate read failed"); + + dev_info(&client->dev, "report rate = %dHz\n", reg_value * 10); + + reg_addr = FT_REG_THGROUP; + err = ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + dev_err(&client->dev, "threshold read failed"); + + dev_dbg(&client->dev, "touch threshold = %d\n", reg_value * 4); + + ft5x06_update_fw_ver(data); + ft5x06_update_fw_vendor_id(data); + + FT_STORE_TS_INFO(data->ts_info, data->family_id, data->pdata->name, + data->pdata->num_max_touches, data->pdata->group_id, + data->pdata->fw_vkey_support ? "yes" : "no", + data->pdata->fw_name, data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); + +#if CTP_LOCKDOWN_INFO + fts_ctpm_read_lockdown(client, data); +#endif + +#if defined(CONFIG_FB) + INIT_WORK(&data->fb_notify_work, fb_notify_resume_work); + data->fb_notif.notifier_call = fb_notifier_callback; + + err = fb_register_client(&data->fb_notif); + + if (err) + dev_err(&client->dev, "Unable to register fb_notifier: %d\n", + err); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + + FT_SUSPEND_LEVEL; + data->early_suspend.suspend = ft5x06_ts_early_suspend; + data->early_suspend.resume = ft5x06_ts_late_resume; + register_early_suspend(&data->early_suspend); +#endif + +#if CTP_PROC_INTERFACE + create_ctp_proc(); +#endif + +#if FTS_PROC_APK_DEBUG + ft5x0x_create_apk_debug_channel(update_client); +#endif + + +#if TPD_AUTO_UPGRADE + + err = get_boot_mode(client); + if (err == 0) { + dev_err(&client->dev, "upgrade\n"); + CTP_DEBUG("********************Enter CTP Auto Upgrade********************\n"); + msleep(50); + i = 0; + do { + ret_auto_upgrade = fts_ctpm_fw_upgrade_with_i_file(data); + i++; + if (ret_auto_upgrade < 0) { + CTP_DEBUG(" ctp upgrade fail err = %d \n", ret_auto_upgrade); + } + } while ((ret_auto_upgrade < 0) && (i < 3)); + } else { + dev_err(&client->dev, "no upgrade\n"); + } +#endif + +#if WT_ADD_CTP_INFO + err = hardwareinfo_set(data, ic_name, lockdown_info[2]); + if (err < 0) + dev_err(&client->dev, "hardwareinfo set failed"); +#endif + +#if CTP_CHARGER_DETECT + batt_psy = power_supply_get_by_name("usb"); + if (!batt_psy) + CTP_DEBUG("tp battery supply not found\n"); +#endif + + enable_irq(data->client->irq); + + return 0; + + +free_reset_gpio: + if (gpio_is_valid(pdata->reset_gpio)) + gpio_free(pdata->reset_gpio); + if (data->ts_pinctrl) { + err = ft5x06_ts_pinctrl_select(data, false); + if (err < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } +free_irq_gpio: + if (gpio_is_valid(pdata->irq_gpio)) + gpio_free(pdata->irq_gpio); + if (data->ts_pinctrl) { + err = ft5x06_ts_pinctrl_select(data, false); + if (err < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } +pwr_off: +pwr_deinit: +unreg_inputdev: + input_unregister_device(input_dev); + input_dev = NULL; +free_inputdev: + input_free_device(input_dev); + return err; +} + +static int ft5x06_ts_remove(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + int retval; + +#if CTP_SYS_APK_UPDATE + device_remove_file(&client->dev, &dev_attr_fw_name); +#endif + +#if FTS_PROC_APK_DEBUG + ft5x0x_release_apk_debug_channel(); +#endif + + +#if defined(CONFIG_FB) + if (fb_unregister_client(&data->fb_notif)) + dev_err(&client->dev, "Error occurred while unregistering fb_notifier.\n"); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&data->early_suspend); +#endif + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + if (data->ts_pinctrl) { + retval = ft5x06_ts_pinctrl_select(data, false); + if (retval < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } + input_unregister_device(data->input_dev); + + return 0; +} + + +void ft5x06_ts_shutdown(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + int retval; + + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) { + retval = gpio_direction_output(data->pdata->reset_gpio, 0); + if (retval) { + dev_err(&data->client->dev, + "set_direction for reset gpio failed\n"); + } + gpio_free(data->pdata->reset_gpio); + } + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + if (data->pdata->power_init) + data->pdata->power_init(false); + else + ft5x06_power_init(data, false); +} + + +static const struct i2c_device_id ft5x06_ts_id[] = { + {"ft5x06_720p", 0}, + {}, +}; + +MODULE_DEVICE_TABLE(i2c, ft5x06_ts_id); + +#ifdef CONFIG_OF +static struct of_device_id ft5x06_match_table[] = { + { .compatible = "focaltech,5336",}, + { }, +}; +#else +#define ft5x06_match_table NULL +#endif + +static struct i2c_driver ft5x06_ts_driver = { + .probe = ft5x06_ts_probe, + .remove = ft5x06_ts_remove, + .shutdown = ft5x06_ts_shutdown, + .driver = { + .name = "ft5x06_720p", + .owner = THIS_MODULE, + .of_match_table = ft5x06_match_table, +#ifdef CONFIG_PM + .pm = &ft5x06_ts_pm_ops, +#endif + }, + .id_table = ft5x06_ts_id, +}; + +static int __init ft5x06_ts_init(void) +{ + return i2c_add_driver(&ft5x06_ts_driver); +} +module_init(ft5x06_ts_init); + +static void __exit ft5x06_ts_exit(void) +{ + i2c_del_driver(&ft5x06_ts_driver); +} +module_exit(ft5x06_ts_exit); + +MODULE_DESCRIPTION("FocalTech ft5x06 TouchScreen driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/ft5336/ft5x06_test_lib.h b/drivers/input/touchscreen/ft5336/ft5x06_test_lib.h new file mode 100755 index 0000000000000..77311c36e9173 --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft5x06_test_lib.h @@ -0,0 +1,24 @@ +#ifndef _FOCAL_MCAPTESTLIB_H +#define _FOCAL_MCAPTESTLIB_H + +#define TX_NUM_MAX 30 +#define RX_NUM_MAX 30 + + +#define boolean unsigned char +#define false 0 +#define true 1 + +typedef int (*FTS_I2c_Read_Function)(unsigned char * , int , unsigned char *, int); +typedef int (*FTS_I2c_Write_Function)(unsigned char * , int); + +int Init_I2C_Read_Func(FTS_I2c_Read_Function fpI2C_Read); +int Init_I2C_Write_Func(FTS_I2c_Write_Function fpI2C_Write); + + +int SetParamData(char *TestParamData); +int focal_save_error_data(char *databuf, int databuflen); +void FreeTestParamData(void); +boolean StartTestTP(void); + +#endif diff --git a/drivers/input/touchscreen/ft5336/ft_app_ic_biel_boe_720p.txt b/drivers/input/touchscreen/ft5336/ft_app_ic_biel_boe_720p.txt new file mode 100644 index 0000000000000..9668f76f858c2 --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft_app_ic_biel_boe_720p.txt @@ -0,0 +1,1807 @@ +0x2, 0x50,0xf0,0x2, 0x68,0x7c,0xe5,0x74,0x60,0x9, 0x74,0x1, 0x12,0x6e,0xa0,0x75, +0x74,0x0, 0x22,0xe4,0x12,0x6e,0xa0,0x75,0x74,0x1, 0x22,0x2, 0x50,0x5a,0xe5,0x55, +0xbe,0xb0,0x1, 0x68,0xf9,0x12,0x6e,0x86,0x60,0xfb,0x22,0x2, 0x67,0x13,0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x10,0x7e,0x34,0x10,0x2b,0x12,0x64,0xb9,0x12,0x6e,0x8f,0x60, +0xfb,0x22,0x22,0x2, 0x6e,0x56,0xc2,0x8e,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0x22,0x32,0x2, 0x63,0x5b,0xbe,0xb0, +0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x16,0xa2,0x22,0x22,0x2, 0x0, 0x5a,0xe5,0x52, +0x24,0xff,0x22,0x2, 0x67,0x4b,0xca,0x3b,0x7e,0xb3,0xf, 0x1b,0xf5,0x26,0x7e,0xd3, +0xf, 0x1c,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x33,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, +0xa, 0xe4,0x12,0x6d,0xee,0x6c,0xcc,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7c,0x19, +0xa3,0x13,0xba,0x7e,0x34,0x7f,0xff,0x74,0x7, 0xac,0xbc,0x59,0x35,0x13,0xb6,0x74, +0x7, 0xac,0xbc,0x59,0x35,0x13,0xb8,0xb, 0xc0,0xbe,0xc0,0xa, 0x78,0xd9,0xe5,0x26, +0x60,0x3, 0x2, 0x0, 0xef,0x12,0x6a,0xbb,0xbe,0xd0,0x0, 0x38,0x3, 0x2, 0x0, 0xdf, +0x74,0x1, 0x7a,0xb3,0xf, 0x20,0xe4,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7e, +0x34,0x13,0x6, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xee,0x2, 0x1, 0x14,0x4c, +0xdd,0x68,0x3, 0x2, 0x1, 0x14,0x75,0x25,0x0, 0x7e,0xa0,0xff,0x7e,0x71,0x25,0x74, +0x7, 0xac,0x7b,0x19,0xa3,0xe, 0x57,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xeb,0x74,0x1, +0x7a,0xb3,0xf, 0x1f,0x75,0x25,0x0, 0x2, 0x1, 0x4c,0x7e,0x51,0x25,0x74,0x7, 0xac, +0x5b,0x2e,0x24,0xe, 0xd, 0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x51,0x25,0xac,0x5b,0x2e,0x24,0xe, 0xf, 0xb, 0x28,0x30,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x5, 0x25,0xe5,0x26,0xbe,0xb1, +0x25,0x38,0xc7,0xe4,0x6c,0x77,0x7e,0x61,0x26,0x7e,0x24,0x13,0xb6,0x12,0x52,0xa6, +0x7e,0x71,0x26,0x7e,0x60,0xa, 0x7e,0x24,0x13,0xb6,0x12,0x52,0xa6,0x7c,0xcb,0x6c, +0xee,0x75,0x25,0x0, 0x2, 0x1, 0x92,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65,0x13, +0xba,0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x11,0xbc,0x76,0x78,0x3, 0x2, 0x1, 0x97, +0x5, 0x25,0xbe,0xc1,0x25,0x38,0xe0,0xbe,0xc1,0x25,0x68,0x3, 0x2, 0x1, 0xb8,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3c,0x2e,0x14,0x13, +0xb6,0x74,0x7, 0x12,0x48,0xc5,0xb, 0xc0,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xb2,0x7e, +0x24,0x13,0xb6,0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x4a,0x4c,0xdd, +0x68,0x3, 0x2, 0x1, 0xe7,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, +0x46,0x12,0x6d,0x4a,0x2, 0x4, 0x84,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x4, 0x84, +0x6c,0xee,0x2, 0x4, 0x7b,0x75,0x25,0x0, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65, +0xe, 0x57,0x7e,0x90,0x7, 0xac,0x9e,0x9, 0x74,0xe, 0x11,0xbc,0x67,0x78,0x3, 0x2, +0x2, 0x1b,0x5, 0x25,0xe5,0x25,0xbe,0xb0,0xa, 0x40,0xdd,0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x9, 0xf5,0xe, 0x57,0x49,0x34,0xe, 0xf, 0x49,0x25,0xe, 0x55,0x12,0x6d,0xbe, +0x7d,0x63,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, 0xa4, +0x49,0x25,0xe, 0x53,0x12,0x6d,0xbe,0x7d,0x13,0x2d,0x16,0x7a,0x15,0x21,0x7c,0x1f, +0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7,0xbe,0x14,0x0, 0x40,0x28,0x3, 0x2, 0x2, 0xd9, +0x7e,0x35,0x21,0xbe,0x34,0x0, 0x20,0x38,0x3, 0x2, 0x2, 0xae,0x7e,0x70,0x3, 0xac, +0x7f,0x9, 0xb3,0x12,0x2, 0x60,0x3, 0x2, 0x2, 0x97,0x9, 0xb3,0x12,0x3, 0xbe,0xb0, +0x0, 0x38,0x3, 0x2, 0x2, 0x89,0x2, 0x2, 0xbf,0x74,0x1, 0x19,0xb3,0x12,0x2, 0x6d, +0x22,0x7a,0x25,0x21,0x2, 0x2, 0xed,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0xa, 0x40,0x3, +0x2, 0x2, 0xed,0x2e,0x34,0x12,0x3, 0x4, 0x7a,0x39,0xb0,0x2, 0x2, 0xd1,0x7e,0x70, +0x3, 0xac,0x7f,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x2, 0xcc,0x7d, +0x23,0x2e,0x24,0x12,0x3, 0x14,0x7a,0x29,0xb0,0x2, 0x2, 0xed,0xe4,0x19,0xb3,0x12, +0x2, 0x6d,0x33,0x7a,0x35,0x21,0x2, 0x2, 0xed,0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7f, +0x19,0xa3,0x12,0x3, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x2, 0x7e,0x35,0x21, +0xbe,0x34,0x0, 0x20,0x28,0x3, 0x2, 0x3, 0x2e,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49, +0x35,0xe, 0x53,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x35,0xe, 0x55,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0x6d,0x33,0x7a, +0x35,0x21,0x7e,0xa0,0x1, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x1, 0x7e,0xf5, +0x21,0x7a,0xf5,0x23,0xa, 0xef,0x2e,0xe5,0x33,0x7e,0xe9,0xb0,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x3, 0x52,0x6d,0xee,0x74,0x2, 0xac,0xbf,0x59,0xe5,0x11,0xed,0x59,0xe5, +0x12,0x1f,0x7e,0x17,0xf, 0x5d,0xbe,0x15,0x23,0x28,0x3, 0x2, 0x3, 0x68,0x7e,0x4, +0x1, 0x0, 0x7a,0x5, 0x31,0x2, 0x3, 0x8b,0x7e,0x35,0x23,0x6d,0x22,0x7c,0x56,0x7c, +0x67,0x6c,0x77,0x12,0x48,0x3e,0x7d,0xe3,0x7a,0xe5,0x31,0xbe,0xe4,0x0, 0x10,0x40, +0x3, 0x2, 0x3, 0x8b,0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x31,0x74,0x2, 0xac,0xbf,0x49, +0x45,0x12,0x1f,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x3, 0xa5,0x49,0x45,0x11,0xed,0x7a, +0x45,0x31,0x2, 0x3, 0xac,0x7e,0x45,0x31,0x59,0x45,0x11,0xed,0x59,0xf5,0x12,0x1f, +0x7e,0x35,0x31,0xbe,0x34,0x1, 0x0, 0x38,0x3, 0x2, 0x3, 0xc3,0x7e,0x34,0x1, 0x0, +0x7a,0x35,0x31,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x25,0xe, 0x53,0x12,0x6d,0xbe,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31, +0xad,0x32,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, +0xac,0x5b,0x49,0x32,0xe, 0x53,0xac,0xbe,0x49,0x15,0xe, 0xd, 0xbd,0x13,0x38,0x3, +0x2, 0x4, 0x14,0x7d,0x2, 0x2e,0x4, 0xe, 0x53,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, +0x10,0x2, 0x4, 0x1e,0x2e,0x24,0xe, 0x53,0x9e,0x35,0x21,0x1b,0x28,0x30,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49,0x25,0xe, 0x55, +0x12,0x6d,0xbe,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31,0xad,0x32,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, 0xac,0x5b,0x49,0x32,0xe, +0x55,0xac,0xbe,0x49,0x15,0xe, 0xf, 0xbd,0x13,0x38,0x3, 0x2, 0x4, 0x6f,0x7d,0x2, +0x2e,0x4, 0xe, 0x55,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, 0x10,0x2, 0x4, 0x79,0x2e, +0x24,0xe, 0x55,0x9e,0x35,0x21,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x26,0xbc,0xbe,0x28, +0x3, 0x2, 0x1, 0xf5,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x49,0x45,0xe, 0x53,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x35,0x49,0x45,0xe, 0x55,0x1e,0x44,0x1e, +0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x37,0x9, 0xf5,0xe, 0x57,0x19,0xf5,0xe, 0x11, +0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x58,0x19,0x75,0xe, 0x12,0x74,0x7, 0xac,0xbe, +0x9, 0x75,0xe, 0x59,0x19,0x75,0xe, 0x13,0x7c,0xbf,0x54,0xf, 0xbe,0xb0,0xa, 0x40, +0x3, 0x2, 0x5, 0xd7,0x7c,0xfb,0xa, 0xf, 0x7d,0x10,0x2e,0x15,0x33,0x7e,0x19,0xb0, +0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x5, 0xf4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x4, 0xf9, +0x74,0xff,0x19,0xb0,0x13,0x6, 0x2, 0x5, 0xd7,0x9, 0x90,0x13,0x6, 0xbe,0x90,0xff, +0x68,0x3, 0x2, 0x5, 0x4b,0x74,0x1, 0x19,0xb0,0x13,0x6, 0x7e,0x15,0x35,0x74,0x7, +0xac,0xbe,0x59,0x15,0xe, 0xd, 0x7e,0x15,0x37,0x74,0x7, 0xac,0xbe,0x59,0x15,0xe, +0xf, 0x6c,0xdd,0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x50,0x7, 0xac, +0x5d,0x7e,0x30,0x15,0xac,0x3f,0x2d,0x12,0x2e,0x14,0x12,0x34,0x74,0x7, 0x12,0x48, +0xc5,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xdb,0x2, 0x5, 0xd7,0xbe,0x90,0x3, 0x50,0x3, +0x2, 0x5, 0x58,0xe4,0x19,0xb0,0x13,0x6, 0x7e,0x25,0x35,0x9, 0x80,0x13,0x6, 0x7e, +0x90,0x7, 0xac,0x89,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x43,0x59,0x24,0x12,0x34,0x7e, +0x25,0x37,0x59,0x24,0x12,0x36,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x5, 0xa0,0xe4, +0x2e,0x34,0x12,0x34,0x12,0x67,0xe7,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x74, +0x1, 0x7e,0x70,0x15,0xac,0x7f,0x2e,0x34,0x12,0x34,0x12,0x67,0xe7,0x2, 0x5, 0xc2, +0x49,0x34,0x12,0x34,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0xa, 0x3f,0x9, 0x43, +0x13,0x6, 0x7e,0x50,0x7, 0xac,0x45,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x32,0x49,0x33, +0x12,0x36,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0xa, 0x3f,0x2e,0x34,0x13,0x6, +0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x7c,0x1e,0x2e,0x10,0x27,0xa5,0xe7,0x60,0x3, +0x2, 0x5, 0xf4,0x7e,0x70,0x3, 0xac,0x7e,0x2e,0x34,0x12,0x1, 0x7e,0x24,0x0, 0x3, +0xe4,0x12,0x6d,0xee,0xb, 0xe0,0xbe,0xe0,0xa, 0x68,0x3, 0x2, 0x4, 0x86,0xe5,0x26, +0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x6, 0xe, 0x74,0x1, 0x7a,0xb3,0xf, 0x24,0xda,0x3b, +0x22,0xca,0x3b,0x7e,0xe3,0xf, 0x1b,0x4c,0xee,0x78,0x27,0x6c,0xff,0x6d,0x11,0x74, +0x2, 0xac,0xbf,0x59,0x15,0x13,0x56,0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x19, +0xa1,0x13,0x14,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x13,0x6a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xdb,0x6c,0xff,0x2, 0x7, 0xac,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xe, 0x11,0x54, +0xf, 0xf5,0x22,0xbe,0xb0,0xa, 0x40,0x3, 0x2, 0x7, 0xaa,0xe5,0x22,0xa, 0x1b,0x9, +0xb1,0xe, 0xdf,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x7, 0x85,0x75,0x21,0x0, 0x7e,0x31, +0x21,0x74,0x7, 0xac,0x3b,0x9, 0x71,0x13,0x14,0x7a,0x71,0x23,0xbe,0x71,0x22,0x68, +0x3, 0x2, 0x7, 0x77,0x49,0x21,0x13,0x12,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xf, +0x9d,0x32,0x12,0x6d,0xde,0x7d,0x63,0x7e,0xa1,0x21,0x74,0x7, 0xa4,0x49,0x25,0x13, +0x10,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6d,0xde,0x7d,0x3, +0x2d,0x6, 0xe5,0x23,0xa, 0x1b,0x9, 0xa1,0x13,0x6a,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0x71,0x23,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x13,0x56,0x2e,0x14,0x13,0x6a,0x7c,0xba, +0x14,0x7a,0x19,0xb0,0x2, 0x7, 0xaa,0x7e,0xa1,0x23,0x74,0x2, 0xa4,0x49,0x15,0x13, +0x56,0xbe,0x14,0x0, 0x32,0x28,0x9, 0xbe,0x4, 0x0, 0x32,0x28,0x3, 0x2, 0x7, 0x71, +0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, +0x80,0x6f,0xbe,0x4, 0x0, 0x96,0x28,0x63,0xe5,0x22,0xa, 0x1b,0x9, 0xb1,0xe, 0xdf, +0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0xe, 0xdf,0x7e,0xa0,0x3, 0xe5, +0x22,0xa, 0x1b,0x19,0xa1,0xe, 0xe9,0x7e,0x71,0x21,0x74,0x7, 0xac,0x7b,0x2e,0x34, +0x13,0x10,0x7e,0x14,0x13,0xb6,0x12,0x48,0xc5,0xbe,0xe0,0x0, 0x28,0x2d,0x1b,0xe0, +0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3f,0x2e,0x14, +0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x7e,0x34,0x13,0xb6,0x7e,0x30,0x7, 0xac,0x3e, +0x2e,0x14,0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x1b,0xf0,0x7e,0xa1,0x23,0x74,0x2, +0xa4,0x59,0x5, 0x13,0x56,0x80,0x33,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0xa, 0x50,0x3, +0x2, 0x6, 0x6e,0x80,0x25,0x6d,0x11,0x7e,0xa1,0x22,0x74,0x2, 0xa4,0x59,0x15,0x13, +0x56,0x7e,0xa0,0xff,0x7e,0x31,0x22,0x74,0x7, 0xac,0x3b,0x19,0xa1,0x13,0x14,0x7e, +0xa0,0x2, 0xe5,0x22,0xa, 0x1b,0x19,0xa1,0x13,0x6a,0xb, 0xf0,0xbc,0xef,0x28,0x3, +0x2, 0x6, 0x47,0x7a,0xe3,0xf, 0x1b,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0x10,0x7e, +0x14,0x0, 0x46,0x12,0x6d,0x4a,0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d, +0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x24,0xc, 0x75,0x25,0x0, +0x75,0x26,0x17,0x75,0x27,0x0, 0x7e,0x34,0x13,0xd0,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6d,0xee,0x6c,0x66,0x2, 0x8, 0xed,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xd, 0x18,0x7a, +0x71,0x23,0x9, 0xa5,0xd, 0x19,0x1a,0x17,0x7d,0x21,0x1b,0x25,0xb, 0x15,0x7c,0x43, +0x1a,0x1a,0x1b,0x15,0x1a,0xa, 0xb, 0x5, 0x7c,0x21,0xbe,0x50,0x0, 0x58,0x2, 0x6c, +0x55,0x7e,0x73,0x10,0x2b,0xa, 0x7, 0x1b,0x4, 0x1a,0x44,0xbd,0x40,0x8, 0x2, 0x7c, +0x41,0xbe,0x30,0x0, 0x58,0x2, 0x6c,0x33,0x7e,0x73,0x10,0x2c,0xa, 0x7, 0x1b,0x4, +0x1a,0x42,0xbd,0x40,0x8, 0x2, 0x7c,0x21,0xbe,0x51,0x24,0x58,0x3, 0x7a,0x51,0x24, +0xbe,0x41,0x25,0x8, 0x3, 0x7a,0x41,0x25,0xbe,0x31,0x26,0x58,0x3, 0x7a,0x31,0x26, +0xbe,0x21,0x27,0x8, 0x3, 0x7a,0x21,0x27,0x7c,0xf5,0x80,0x4b,0x7c,0xe3,0x80,0x41, +0x1a,0xef,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0xe, 0x2d,0xf, 0xe, 0x4, 0xe, 0x4, +0xe, 0x4, 0x7c,0x71,0x7a,0x71,0x21,0x7e,0x10,0x18,0xac,0x1f,0x7c,0xb1,0x2c,0xbe, +0x54,0x7, 0x7e,0x4, 0x0, 0x1, 0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7c,0xb1,0xf5, +0x22,0xa, 0x7, 0x2e,0x4, 0x13,0xd0,0x7e,0x9, 0xb0,0x45,0x22,0x7a,0x9, 0xb0,0xb, +0xe0,0xbc,0x2e,0x58,0xbb,0xb, 0xf0,0xbc,0x4f,0x58,0xb1,0xb, 0x60,0x7e,0x73,0xd, +0xf7,0xbc,0x76,0x28,0x3, 0x2, 0x8, 0x27,0xbe,0x70,0x0, 0x38,0x3, 0x2, 0xd, 0x43, +0x7e,0xe1,0x26,0x2, 0xd, 0x3a,0x6c,0xff,0x80,0x1f,0x1a,0x3e,0x3e,0x34,0x1a,0x2f, +0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36,0xb, 0x38,0x30,0xe, 0x34,0xe, +0x34,0x3e,0x24,0x59,0x32,0x13,0xb6,0xb, 0xf0,0x7e,0x73,0x10,0x2b,0xbc,0x7f,0x18, +0xd9,0x7e,0xf1,0x24,0x2, 0xd, 0x2f,0x1a,0x4f,0x7e,0x14,0x0, 0x18,0xad,0x14,0x1a, +0x3e,0x7d,0x51,0x2d,0x53,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7a,0xa1,0x21, +0x7e,0x50,0x18,0xac,0x5f,0x7c,0xb5,0x2c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x22,0xa, 0x2a,0x9, 0xb2,0x13,0xd0, +0x55,0x22,0x78,0x3, 0x2, 0xd, 0x2d,0xbe,0xf0,0x3, 0x58,0x3, 0x2, 0x9, 0xfe,0x7e, +0x53,0x10,0x2b,0xa, 0x25,0x1b,0x26,0xbd,0x42,0x18,0x73,0x7d,0xf4,0x3e,0xf4,0x49, +0x5f,0x13,0xba,0x49,0x2f,0x13,0xb2,0x2d,0x25,0x7d,0x52,0x3e,0x54,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x2d,0x25,0x49,0x5f,0x13,0xbc,0x49,0xef,0x13,0xb0,0x2d,0xe5,0x7d, +0x5e,0x3e,0x54,0x2d,0x5e,0x9d,0x25,0x49,0xef,0x13,0xb8,0x49,0x5f,0x13,0xb4,0x2d, +0x5e,0x7d,0xe5,0x3e,0xe4,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d, +0x5e,0x9d,0x25,0x49,0x5f,0x13,0xb6,0x7d,0x5, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x9d,0x10,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x2, 0xb, 0x55,0x4c,0xff, +0x78,0x5d,0x7d,0x24,0x3e,0x24,0x49,0x12,0x13,0xb6,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x3e,0x54,0x2d,0x50,0x7d,0x1, 0x3e,0x4, 0x2d,0x5, 0x2d,0x1, 0x49,0x12,0x13,0xb8, +0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5, 0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x9d,0x1, 0x49,0x12,0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x2d,0x50,0x9d,0x51,0x49,0x22,0x13,0xbc,0x3e,0x24,0x9d,0x52,0x2, 0xb, 0x55,0xbe, +0xf0,0x1, 0x78,0x69,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x49,0x20, +0x13,0xb6,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x25,0x9d,0x21,0x49,0x10, +0x13,0xb8,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x21,0x49,0x10, +0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10, +0x13,0xbc,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x52,0x2, 0xb, 0x55,0xbe,0xf0,0x2, +0x68,0x3, 0x2, 0xb, 0x75,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x50,0x13,0xb2,0x7d, +0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x15,0x9d,0x12,0x49,0x20,0x13,0xb6,0x7d, +0xf2,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5f,0x3e,0x24,0x3e,0x24,0x2d, +0x25,0x2d,0x21,0x49,0x50,0x13,0xb8,0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x2d,0x15,0x9d,0x21,0x49,0x50,0x13,0xba,0x7d,0x15,0x3e,0x14,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10,0x13,0xbc,0x7d,0x21,0x3e, +0x24,0x2d,0x21,0x9d,0x52,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7d,0x23,0x3e,0x24,0x7e,0x14,0x0, 0x30,0xad,0x14,0x2d,0x21,0x2d,0x26,0x1b, +0x28,0x50,0x2, 0xd, 0x11,0x7e,0xa3,0x10,0x2b,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x68, +0x3, 0x2, 0xc, 0x11,0x3e,0x44,0x49,0x24,0x13,0xb2,0x7d,0x12,0x3e,0x14,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x4, 0x13,0xb0,0x7d,0x10,0x3e,0x14,0x2d,0x10, +0x9d,0x21,0x49,0x4, 0x13,0xb4,0x7d,0x10,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x10,0x9d,0x21,0x49,0x14,0x13,0xb6,0x7d,0xf1,0x3e,0xf4,0x3e,0xf4, +0x3e,0xf4,0x3e,0xf4,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x9d,0xf, 0x3e,0x14,0x3e,0x14,0x2d,0x10,0x2d,0x12,0x49,0x4, +0x13,0xb8,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x20, +0x9d,0x12,0x49,0x4, 0x13,0xba,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x20, +0x2d,0x21,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x2, 0xd, +0x0, 0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x76,0x1a,0xf, 0x3e,0x4, 0x49,0x30,0x13, +0xb0,0x7d,0x23,0x3e,0x24,0x2d,0x23,0x49,0x10,0x13,0xb2,0x7d,0x31,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x2d,0x31,0x9d,0x32,0x49,0x20,0x13,0xb4,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x49,0x20,0x13,0xb6,0x7d,0x12,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x9d,0x21,0x2d,0x23,0x49,0x30,0x13,0xb8,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x31,0x9d,0x23,0xe, +0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e,0x80,0x71,0x7e, +0xb3,0x10,0x2b,0x14,0xbc,0xbf,0x78,0x79,0x1a,0x5f,0x3e,0x54,0x49,0x25,0x13,0xb2, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9d,0x32,0x49,0x25,0x13,0xb0,0x3e,0x24, +0x9d,0x32,0x49,0x25,0x13,0xb4,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x24,0x9d,0x32,0x49,0x15,0x13,0xb6,0x7d,0x21, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x2, 0x7d,0x21,0x3e,0x24,0x2d,0x20,0x2d,0x21, +0x2d,0x23,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e, +0x3e,0x34,0x1a,0xf, 0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d,0x31,0x2d,0x36,0x1b,0x38, +0x20,0x1a,0x1e,0x3e,0x14,0x1a,0x2f,0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x23,0x2d, +0x21,0x2d,0x26,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x25,0xbc,0xbf,0x48,0x3, 0x2, 0x9, 0x37,0xb, 0xe0,0xe5,0x27,0xbc,0xbe,0x48,0x3, +0x2, 0x9, 0x6, 0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7e,0xb3,0xd, 0xf7,0xf5,0x2c, +0x75,0x10,0x0, 0xe4,0x7a,0xb3,0x15,0x54,0x7a,0xb3,0x15,0x55,0x6d,0x22,0x7e,0x34, +0x7f,0xff,0x7e,0x67,0xf, 0xda,0x6c,0xee,0xe4,0xa, 0x1e,0x19,0xb1,0x13,0xb6,0x6c, +0xaa,0x7e,0x10,0x2, 0xac,0x1e,0x19,0xa0,0x15,0x2b,0x19,0xb0,0x15,0x2c,0xe5,0x2c, +0xbc,0xbe,0x28,0x24,0x9, 0x20,0xd, 0x18,0x7e,0x30,0x18,0xac,0x23,0x9, 0x10,0xd, +0x19,0xa, 0x1, 0x2d,0x10,0x3e,0x14,0x2d,0x16,0xb, 0x18,0x10,0xbd,0x12,0x48,0x2, +0x7d,0x21,0xbd,0x13,0x18,0x2, 0x7d,0x31,0xb, 0xe0,0xbe,0xe0,0x14,0x78,0xb9,0x2d, +0x32,0xe, 0x34,0xe5,0x2c,0xbe,0xb0,0x2, 0x50,0x3, 0x2, 0x11,0x9d,0x6c,0xee,0x7e, +0x30,0x6, 0xac,0x3e,0x7d,0x51,0x2e,0x54,0x69,0x5c,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x23,0x58,0x20,0x7d,0x51,0x2e,0x54,0x69,0x5e,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0x7a,0x25,0x30,0x2e,0x14,0x69,0x60,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0x7a,0x25,0x32,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc3,0x6c,0xee,0x2, 0x11, +0x8b,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19, +0xf5,0x23,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x13,0xb6,0x70,0xa, 0xa, 0x3e, +0xb, 0x34,0xa, 0x2e,0x19,0x72,0x13,0xb6,0xe5,0x2c,0x14,0xbc,0xbe,0x78,0x3, 0x2, +0x11,0x94,0xa, 0x5e,0xb, 0x54,0xf5,0x2d,0x2, 0x11,0x7f,0x7e,0x71,0x2d,0x74,0x2, +0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a,0xa1,0x24,0x9, 0xb3,0xd, 0x19,0xf5,0x25,0xa, +0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xde,0x7c,0xb7,0xf5,0x2a,0xe5,0x25, +0xa, 0x2b,0xe5,0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xde,0x7c,0xb7,0xf5,0x2b,0x75, +0x3d,0x2, 0x75,0x2f,0x0, 0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b, +0x2d,0x23,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0x7a,0x25,0x34,0x7e,0x11,0x24,0x74, +0x18,0xac,0x1b,0xe5,0x25,0xa, 0x1b,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0x7a,0x25,0x36,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0xe, 0x54,0x7a,0x55,0x38,0xbe,0x25,0x34,0x8, 0x14,0x7e,0x25,0x34, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x7a,0x25, +0x38,0xe5,0x2a,0xbe,0xb0,0x1, 0x38,0x37,0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x30,0x7c, +0xbf,0x54,0x2, 0xb4,0x2, 0x29,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, 0x20,0x7e, +0x71,0x22,0x74,0x18,0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d, +0x32,0xbe,0x35,0x38,0x18,0x3, 0x2, 0x11,0x13,0x75,0x2f,0x1, 0x2, 0x11,0x13,0xe5, +0x2a,0xbe,0xb0,0x1, 0x38,0xa, 0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x3, 0x2, 0x11,0x13, +0xe5,0x2a,0xbe,0xb0,0x4, 0x40,0x3, 0x2, 0x11,0x13,0xe5,0x2b,0xbe,0xb0,0x4, 0x40, +0x3, 0x2, 0x11,0x13,0x7c,0xbf,0x54,0x1, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x11,0x13, +0x6d,0x33,0x7a,0x35,0x3a,0x75,0x3c,0x0, 0x85,0x22,0x26,0x85,0x24,0x28,0xe5,0x24, +0xbe,0xb1,0x22,0x50,0x6, 0x85,0x24,0x26,0x85,0x22,0x28,0x85,0x23,0x27,0x85,0x25, +0x29,0xe5,0x25,0xbe,0xb1,0x23,0x50,0x6, 0x85,0x25,0x27,0x85,0x23,0x29,0x75,0x40, +0x0, 0x75,0x41,0x0, 0xe5,0x28,0xbe,0xb1,0x26,0x78,0x21,0x75,0x40,0x1, 0xe5,0x26, +0x60,0x5, 0xe5,0x26,0xb4,0xc, 0x3, 0x75,0x41,0x1, 0xe5,0x26,0xbe,0xb0,0x0, 0x28, +0x2, 0x15,0x26,0xe5,0x28,0xbe,0xb0,0xc, 0x50,0x2, 0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x27,0x78,0x21,0x75,0x40,0x1, 0xe5,0x27,0x60,0x5, 0xe5,0x27,0xb4,0x17,0x3, 0x75, +0x41,0x1, 0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x27,0xe5,0x29,0xbe,0xb0,0x17, +0x50,0x2, 0x5, 0x29,0x85,0x26,0x3e,0x80,0x78,0x85,0x27,0x3f,0x80,0x6a,0xe5,0x26, +0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x28,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x27,0xbe,0xb1, +0x3f,0x68,0x7, 0xe5,0x29,0xbe,0xb1,0x3f,0x78,0x24,0x7e,0x51,0x3e,0x74,0x18,0xac, +0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0xbe,0x24, +0x0, 0x0, 0x8, 0x6, 0x2e,0x25,0x3a,0x7a,0x25,0x3a,0x5, 0x3c,0x80,0x28,0x7e,0x51, +0x3e,0x74,0x18,0xac,0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0xbe,0x25,0x32,0x8, 0xc, 0xe5,0x3d,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x3d, +0x1, 0x80,0x3, 0x75,0x3d,0x0, 0x5, 0x3f,0xe5,0x29,0xbe,0xb1,0x3f,0x50,0x8f,0x5, +0x3e,0xe5,0x28,0xbe,0xb1,0x3e,0x50,0x81,0x7e,0x51,0x28,0x74,0x18,0xac,0x5b,0xe5, +0x27,0xa, 0x4b,0x2d,0x24,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x50,0x7e,0x25,0x3a,0x9d, +0x25,0x7e,0x31,0x26,0x74,0x18,0xac,0x3b,0xe5,0x29,0xa, 0xb, 0x7d,0x51,0x2d,0x50, +0x3e,0x54,0x2d,0x56,0xb, 0x58,0x50,0x9d,0x25,0x2d,0x14,0x3e,0x14,0x2d,0x16,0xb, +0x18,0x10,0x9d,0x21,0x7e,0x31,0x28,0x74,0x18,0xac,0x3b,0x2d,0x10,0x3e,0x14,0x2d, +0x16,0xb, 0x18,0x10,0x9d,0x21,0x7a,0x25,0x3a,0x7e,0x25,0x36,0x2e,0x25,0x34,0x7a, +0x25,0x38,0xe5,0x40,0xb4,0x1, 0x11,0xe5,0x41,0x70,0xd, 0x7e,0x25,0x3a,0x9e,0x25, +0x38,0x7a,0x25,0x3a,0x15,0x3c,0x15,0x3c,0xe5,0x3c,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x3c,0x24,0xfc,0xf5,0x3c,0x7e,0x25,0x3a,0xbe,0x24,0x0, 0x0, 0x58,0x3, 0x7a,0x35, +0x3a,0x7e,0x15,0x38,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x30,0x1a,0x26,0x1a,0x24,0x12, +0x48,0x24,0xe5,0x3c,0xa, 0x1b,0x6d,0x0, 0x12,0x48,0x24,0x7f,0x21,0x7e,0x35,0x3a, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x48,0x35,0xbf,0x12,0x8, 0xa, 0xe5, +0x3d,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x2f,0x2, 0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, +0x75,0x2f,0x2, 0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x63,0xe5,0x2f,0xa, 0x3b,0x2e,0x34, +0x15,0x53,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2d,0xa, 0x3b,0x9, 0xb3,0x13, +0xb6,0x70,0xc, 0xa, 0x2e,0x9, 0x52,0x13,0xb6,0x19,0x53,0x13,0xb6,0x80,0x3e,0x75, +0x2e,0x0, 0x80,0x32,0x9, 0x33,0x13,0xb6,0xa, 0x2e,0x9, 0xa2,0x13,0xb6,0xbc,0xa3, +0x28,0x12,0xe5,0x2e,0xa, 0x2b,0x9, 0x22,0x13,0xb6,0xbc,0x2a,0x78,0x16,0x19,0x32, +0x13,0xb6,0x80,0x10,0xe5,0x2e,0xa, 0x2b,0x9, 0xb2,0x13,0xb6,0xbc,0xb3,0x78,0x4, +0x19,0xa2,0x13,0xb6,0x5, 0x2e,0xe5,0x2c,0xbe,0xb1,0x2e,0x38,0xc7,0x5, 0x2d,0xe5, +0x2c,0xbe,0xb1,0x2d,0x28,0x3, 0x2, 0xe, 0x3b,0xb, 0xe0,0xe5,0x2c,0xbc,0xbe,0x28, +0x3, 0x2, 0xe, 0x1, 0x7e,0x34,0x13,0xb6,0x12,0x39,0xc4,0xf5,0x10,0xda,0x3b,0x22, +0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55, +0x7e,0x37,0xf, 0x61,0x7a,0x35,0x3e,0x6c,0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0xe4,0x19,0xb3,0xd, 0x71,0xa, 0x5d,0x3e,0x54,0xb, 0x54,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x39,0x9, 0xb3,0xd, 0x19,0xf5,0x3a, +0xbe,0xd1,0x3a,0x28,0x3, 0x2, 0x12,0xe, 0x7e,0xb3,0x10,0x2c,0xa, 0xb, 0x1b,0x4, +0xa, 0x3d,0x9d,0x3, 0xe5,0x3a,0xa, 0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0xe, 0x7c, +0x3a,0xa, 0x4d,0xe5,0x3a,0xa, 0xb, 0x9d,0x4, 0x7c,0x51,0x2, 0x12,0x59,0xbe,0xd1, +0x3a,0x38,0x3, 0x2, 0x12,0x27,0xe5,0x3a,0xa, 0xb, 0xa, 0x3d,0x2d,0x30,0xb, 0x34, +0x7c,0x37,0x6c,0x55,0x2, 0x12,0x59,0xa, 0xfd,0xe5,0x3a,0xa, 0x4b,0x2d,0xf4,0x7e, +0xb3,0x10,0x2c,0xa, 0xb, 0x7d,0x30,0x1b,0x34,0xbd,0xf3,0x18,0x3, 0x2, 0x12,0x59, +0xbd,0x43,0x8, 0x3, 0x2, 0x12,0x59,0xa, 0x3d,0x2d,0x30,0xe5,0x3a,0xa, 0xb, 0x9d, +0x30,0x7c,0x37,0xa, 0x3d,0x9d,0x3, 0x7c,0x51,0xbe,0xd1,0x39,0x28,0x3, 0x2, 0x12, +0x83,0x7e,0xb3,0x10,0x2b,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5,0x39,0xa, +0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0x83,0x7c,0x4a,0xa, 0xd, 0xe5,0x39,0xa, 0x3b, +0x2, 0x12,0xca,0xbe,0xd1,0x39,0x38,0x3, 0x2, 0x12,0x9c,0xe5,0x39,0xa, 0xb, 0xa, +0x3d,0x2d,0x30,0xb, 0x34,0x7c,0x47,0x6c,0x22,0x2, 0x12,0xce,0xa, 0x4d,0xe5,0x39, +0xa, 0x5b,0x2d,0x45,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7d,0x3, 0x1b,0x4, 0xbd,0x40, +0x18,0x3, 0x2, 0x12,0xce,0xbd,0x50,0x8, 0x3, 0x2, 0x12,0xce,0xa, 0xd, 0x2d,0x3, +0xe5,0x39,0xa, 0x3b,0x9d,0x3, 0x7c,0x41,0xa, 0xd, 0x9d,0x30,0x7c,0x27,0x7e,0x37, +0xf, 0xda,0x7c,0xb2,0x7e,0x23,0xf, 0x53,0x7e,0x4, 0x9, 0xc8,0x12,0x5c,0x41,0x7e, +0x37,0x9, 0xc8,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xca,0x7d,0x20,0x7a,0x1d,0x28, +0x7e,0x37,0x9, 0xcc,0x7d,0x3, 0x7e,0x37,0x9, 0xce,0x7d,0x20,0x7a,0x1d,0x2c,0x7e, +0x37,0x9, 0xd0,0x7d,0x3, 0x7e,0x37,0x9, 0xd2,0x7d,0x20,0x7a,0x1d,0x30,0x7e,0x37, +0x9, 0xd4,0x7d,0x3, 0x7e,0x37,0x9, 0xd6,0x7d,0x20,0x7a,0x1d,0x34,0xa, 0x2d,0xe5, +0x39,0xa, 0x3b,0x9d,0x32,0x7c,0xc7,0x2, 0x15,0x24,0xa, 0x4d,0xe5,0x3a,0xa, 0x5b, +0x9d,0x54,0xf5,0x38,0x2, 0x15,0xd, 0xbe,0xc0,0x0, 0x58,0x3, 0x2, 0x15,0xb, 0x7e, +0x73,0x10,0x2b,0xbc,0x7c,0x18,0x3, 0x2, 0x15,0xb, 0xe5,0x38,0xbe,0xb0,0x0, 0x58, +0x3, 0x2, 0x15,0xb, 0x7e,0x73,0x10,0x2c,0xbe,0x71,0x38,0x18,0x3, 0x2, 0x15,0xb, +0xe5,0x38,0x1a,0x1b,0x3e,0x14,0x1a,0x2c,0x7e,0x34,0x0, 0x30,0xad,0x32,0x2d,0x31, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x7e,0x53,0xf, 0x53,0xa, 0x25,0x9d,0x32,0x7a, +0x35,0x3c,0xbe,0x34,0x0, 0x0, 0x18,0x3, 0x2, 0x15,0xb, 0x7e,0x35,0x3e,0xbe,0x35, +0x3c,0x28,0x3, 0x2, 0x13,0xa6,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xd, 0x71,0x7e, +0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x39,0xa, 0x2b,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xde,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x13,0xd0,0xe5,0x3a,0xa, 0x2b,0xe5,0x38, +0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xde,0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x2, 0x15,0xb, +0x75,0x3b,0x0, 0x2, 0x14,0x60,0xbe,0xe1,0x3b,0x78,0x3, 0x2, 0x14,0x5e,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xde,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xde,0xbe, +0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0x75,0x3b,0xff,0x2, 0x14,0x6c,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xde,0xbe,0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xde,0xbe, +0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0x75,0x3b,0x0, 0x2, 0x14,0x6c,0x5, 0x3b, +0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x3b,0x8, 0x3, 0x2, 0x13,0xd6,0xe5,0x3b,0x60,0x3, +0x2, 0x14,0xc0,0x7e,0x35,0x3c,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x3c,0x7e, +0xf5,0x3c,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a, +0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34, +0x7e,0x1d,0x28,0x9f,0x17,0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30, +0xe5,0x3b,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x15,0xb, 0x7e,0xf5,0x3c,0x7d,0x3f,0x1a, +0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d, +0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34,0x7e,0x1d,0x28,0x9f,0x17, +0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30,0x5, 0x38,0xa, 0x2d,0xe5, +0x3a,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x38,0x1a,0x3b,0xbd,0x32,0x18,0x3, 0x2, +0x13,0x37,0xb, 0xc0,0xa, 0x2d,0xe5,0x39,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0x1a,0x3c, +0xbd,0x32,0x18,0x3, 0x2, 0x13,0x2a,0x74,0x6, 0x7e,0x1d,0x2c,0x2f,0x11,0x14,0x78, +0xfb,0x7a,0x1d,0x2c,0x7e,0xd, 0x28,0x7e,0x1d,0x2c,0x12,0x48,0x40,0x2e,0x34,0x0, +0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xd, 0x6b,0x74,0x6, 0x7e,0x1d,0x34,0x2f, +0x11,0x14,0x78,0xfb,0x7a,0x1d,0x34,0x7e,0x7d,0x30,0x7e,0x1d,0x34,0x7f,0x7, 0x12, +0x48,0x40,0x2e,0x34,0x0, 0x20,0x59,0x36,0xd, 0x6d,0x7e,0xb3,0xf, 0x60,0x7f,0x17, +0x70,0x3, 0x2, 0x15,0x91,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7a,0x1d,0x30,0xbe,0x18,0x0, 0x7f,0x38,0x3, 0x2, 0x15,0xa4,0x7e,0x18,0x0, +0x7f,0x7a,0x1d,0x30,0x7e,0x2d,0x30,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0x71,0x7e,0x70,0x7, 0xac,0x7f,0x19, +0xa3,0xd, 0x71,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xd, 0x71,0xbe,0x70,0xf, 0x38,0x3, +0x2, 0x15,0xdf,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xd, 0x71,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x11, +0x96,0xa5,0xbe,0x1, 0x58,0x7e,0xa3,0x10,0x2b,0xbc,0xa7,0x28,0xd, 0x7a,0x71,0xd, +0x74,0x30,0xac,0x7b,0x2e,0x37,0x16,0x9e,0x80,0x3c,0x7a,0x71,0xd, 0xbc,0xa7,0x78, +0x6, 0x7e,0x34,0x8, 0x9a,0x80,0x2f,0xa, 0x2a,0x7d,0x2, 0xb, 0x4, 0xa, 0x17,0xbd, +0x10,0x78,0x6, 0x7e,0x34,0x8, 0xca,0x80,0x1d,0x7d,0x2, 0xb, 0x5, 0xbd,0x10,0x78, +0x6, 0x7e,0x34,0x9, 0x2e,0x80,0xf, 0x2e,0x24,0x0, 0x3, 0xbd,0x12,0x68,0x3, 0x2, +0x19,0x6a,0x7e,0x34,0x9, 0x5e,0x7a,0x37,0x16,0x4f,0x2, 0x19,0x6a,0xa5,0xbe,0x0, +0x46,0x7e,0x64,0x0, 0xb, 0x7a,0x69,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf,0x1, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, +0x74,0x1, 0x7e,0x70,0x1, 0x80,0x36,0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3, +0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x21,0x74,0x27,0x7e,0x70, +0x3, 0x12,0x6d,0xad,0x2, 0x19,0x6a,0xa5,0xbe,0x2, 0x23,0xa5,0xbf,0x4, 0x7, 0x74, +0x1, 0x7e,0x70,0x4, 0x80,0x7, 0xa5,0xbf,0x5, 0x9, 0xe4,0x6c,0x77,0x12,0x0, 0x5e, +0x2, 0x19,0x6a,0xbe,0x70,0x1, 0x50,0x3, 0x2, 0x19,0x6a,0x2, 0x19,0x6a,0xa5,0xbe, +0x3, 0x15,0xbe,0x70,0xd, 0x28,0x9, 0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x2, 0x19,0x6a, +0x7a,0x73,0x10,0x2b,0x2, 0x19,0x6a,0xa5,0xbe,0x4, 0x15,0xbe,0x70,0x18,0x28,0x9, +0x74,0x18,0x7a,0xb3,0x10,0x2c,0x2, 0x19,0x6a,0x7a,0x73,0x10,0x2c,0x2, 0x19,0x6a, +0xa5,0xbe,0x5, 0x7, 0x7a,0x73,0x10,0x2d,0x2, 0x19,0x6a,0xa5,0xbe,0x7, 0x1e,0x7a, +0x73,0x10,0x4b,0x7c,0xb7,0x54,0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0x10, +0x54,0x5e,0x70,0x3, 0x4d,0x32,0x7a,0x37,0x10,0x54,0x2, 0x19,0x6a,0xa5,0xbe,0x8, +0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xac,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x16,0x2, 0x19,0x6a,0xa5,0xbe,0x9, 0x1c,0xbe,0x70,0xa, 0x50,0x3, 0x7e,0x70, +0xa, 0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xad,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x49,0x2, 0x19,0x6a,0xa5,0xbe,0xa, 0x10,0xa5,0xbf,0x0, 0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x10,0x3b,0x2, 0x19,0x6a,0xa5,0xbe,0xb, 0x14,0x7e,0xb3,0x10, +0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xae,0x2, 0x19,0x6a,0x7a,0x73,0x11,0x94,0x2, 0x19, +0x6a,0xa5,0xbe,0xc, 0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xd, 0xfe,0x2, +0x19,0x6a,0x7a,0x73,0x11,0x9d,0x2, 0x19,0x6a,0xa5,0xbe,0x4c,0x7, 0x7a,0x73,0xf, +0x46,0x2, 0x19,0x6a,0xa5,0xbe,0xfb,0x29,0x7a,0x71,0x8, 0x7e,0x37,0x10,0x50,0x5e, +0x70,0xdf,0x7a,0x37,0x10,0x50,0xe5,0x8, 0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x4e,0x37,0x10,0x50,0x7a,0x37,0x10,0x50,0x2, 0x19, +0x6a,0xa5,0xbe,0x4e,0x7, 0x7a,0x73,0x10,0x4a,0x2, 0x19,0x6a,0xa5,0xbe,0x4f,0x6, +0x12,0x0, 0x6, 0x2, 0x19,0x6a,0xbe,0x60,0x50,0x40,0x12,0xbe,0x60,0x51,0x38,0xd, +0xa, 0x26,0x2e,0x27,0x10,0x2f,0x9e,0x24,0x0, 0x50,0x2, 0x19,0x54,0xbe,0x60,0x52, +0x40,0x12,0xbe,0x60,0x55,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x31,0x9e,0x24,0x0, +0x52,0x2, 0x19,0x54,0xbe,0x60,0x56,0x40,0x12,0xbe,0x60,0x62,0x38,0xd, 0xa, 0x26, +0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x56,0x2, 0x19,0x54,0xbe,0x60,0x63,0x40,0x12, +0xbe,0x60,0x7a,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x63,0x2, +0x19,0x54,0xbe,0x60,0x7b,0x50,0x3, 0x2, 0x18,0xe8,0xbe,0x60,0x9f,0x28,0x3, 0x2, +0x18,0xe8,0x7e,0xb3,0x10,0x3b,0x70,0x48,0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24, +0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29, +0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f,0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17, +0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29, +0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, 0x2f,0x19,0x72,0xf, 0xdc,0x2, 0x19,0x6a, +0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27, +0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29,0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f, +0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17,0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27, +0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29,0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, +0x2f,0x19,0x72,0xf, 0x63,0x2, 0x19,0x6a,0xbe,0x60,0xa0,0x40,0x11,0xbe,0x60,0xac, +0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6c,0x9e,0x24,0x0, 0xa0,0x80,0x56,0xbe,0x60, +0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6e,0x9e,0x24, +0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38,0xc, 0xa, 0x26, +0x2e,0x27,0x10,0x70,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2,0x40,0x11,0xbe, +0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x72,0x9e,0x24,0x0, 0xd2,0x80,0x14, +0xbe,0x60,0xd6,0x40,0x14,0xbe,0x60,0xed,0x38,0xf, 0xa, 0x26,0x2e,0x27,0x10,0x74, +0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x80,0x11,0xa5,0xbe,0xf8,0x6, 0x7a,0x73,0x11, +0xe8,0x80,0x7, 0xa5,0xbe,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x3b,0x22,0xca,0x3b,0xe4, +0x7a,0xb3,0x13,0xde,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x23,0x6c,0xee,0x7e,0xa0,0xff, +0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0xff,0xa, 0x3e,0x19,0xb3,0x13, +0xca,0x7e,0x34,0xff,0xff,0x74,0x2, 0xac,0xbe,0x59,0x35,0x13,0xb6,0xe4,0xa, 0x3e, +0x19,0xb3,0x13,0xd4,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xd2,0x7e,0xb3,0xf, 0x1b,0x60, +0x3, 0x2, 0x19,0xe5,0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0x2, 0x1b,0xfc,0x6c,0xee,0x7e, +0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, +0x78,0xdd,0x2, 0x1b,0xfc,0x7e,0xb3,0xf, 0x1c,0x60,0x3, 0x2, 0x1a,0x38,0x6c,0xee, +0x2, 0x1a,0x2d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5e, +0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19, +0xe5,0xe, 0x11,0x74,0x1, 0xa, 0x3e,0x19,0xb3,0x13,0xd4,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0xbe,0x2, 0x1b,0xfc,0x6c,0xee,0x2, 0x1a,0x9e,0x6c,0xff,0x7e, +0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23,0x49,0x23,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x49, +0x35,0xe, 0xf, 0x9d,0x32,0x12,0x6d,0xde,0x7d,0x63,0x7e,0x70,0x2, 0xac,0x7f,0x2e, +0x35,0x23,0x49,0x23,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x9d,0x32, +0x12,0x6d,0xde,0x2d,0x36,0x7a,0x35,0x21,0x74,0x2, 0xac,0xbe,0x49,0x45,0x13,0xb6, +0xbe,0x45,0x21,0x38,0x3, 0x2, 0x1a,0x95,0xa, 0x4e,0x19,0xf4,0x13,0xca,0x7e,0x35, +0x21,0x59,0x35,0x13,0xb6,0xb, 0xf0,0xbe,0xf0,0xa, 0x78,0xa3,0xb, 0xe0,0x7e,0x73, +0xf, 0x1b,0xbc,0x7e,0x38,0x97,0x6c,0xee,0x2, 0x1b,0x52,0x74,0x1, 0x7a,0xb3,0x13, +0xde,0x6c,0xff,0x2, 0x1a,0xf1,0xbc,0xfe,0x78,0x3, 0x2, 0x1a,0xef,0xa, 0x3f,0x9, +0x63,0x13,0xca,0xa, 0x2e,0x9, 0x72,0x13,0xca,0xbc,0x76,0x68,0x3, 0x2, 0x1a,0xef, +0x74,0x2, 0xac,0xbf,0x49,0x25,0x13,0xb6,0x74,0x2, 0xac,0xbe,0x49,0x35,0x13,0xb6, +0xbd,0x32,0x50,0x3, 0x2, 0x1a,0xef,0xe4,0x7a,0xb3,0x13,0xde,0x2, 0x1a,0xf9,0xb, +0xf0,0x7e,0x73,0xf, 0x1b,0xbc,0x7f,0x38,0xbd,0x7e,0xb3,0x13,0xde,0xb4,0x1, 0x2, +0x80,0x3, 0x2, 0x1b,0x50,0x74,0x1, 0xa, 0x3e,0x9, 0xa3,0x13,0xca,0xa, 0x4a,0x19, +0xb4,0x13,0xd4,0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0x7, 0xac,0xbe, +0x49,0x35,0xe, 0xd, 0xa, 0x2e,0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e, +0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0xa, 0x2e, +0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28, +0xb, 0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, 0x1a,0xab,0x6c,0xee,0x2, +0x1b,0xc1,0x74,0x7, 0xac,0xbe,0x9, 0xb5,0xe, 0x11,0xb4,0xff,0x2, 0x80,0x3, 0x2, +0x1b,0xbf,0x6c,0xff,0xa, 0x3f,0x9, 0xb3,0x13,0xd4,0x60,0x3, 0x2, 0x1b,0xb8,0x74, +0x1, 0x19,0xb3,0x13,0xd4,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, +0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, +0xf, 0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac, +0xbe,0x19,0xf5,0xe, 0x11,0x2, 0x1b,0xbf,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xb5,0xb, +0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x38,0x99,0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13, +0xd4,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x1b,0xf5,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, +0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xcf,0x7e,0xf3,0xf, 0x1b, +0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13,0xd4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x4e, +0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c, +0x27,0x74,0x3, 0x19,0xb3,0x0, 0xa, 0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xa3,0x0, 0xa, +0xbe,0xa0,0x3, 0x68,0x3, 0x2, 0x1c,0x3f,0xe4,0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0x4c, +0xaa,0x68,0x3, 0x2, 0x1c,0x7c,0x74,0x2, 0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0xa, 0x3e, +0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xbe,0xb0,0x2, 0x78,0x3, 0x2, 0x1c,0x64,0x60, +0x3, 0x2, 0x1c,0x77,0x74,0x1, 0x7a,0x39,0xb0,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4, +0x19,0xe5,0xe, 0x11,0x2, 0x1c,0x7c,0x74,0x3, 0x7a,0x39,0xb0,0xa, 0x2e,0x2e,0x25, +0x23,0x7e,0x29,0x70,0x19,0x72,0x0, 0xa, 0xb, 0xe0,0xbe,0xe0,0xa, 0x50,0x3, 0x2, +0x1c,0x2, 0xda,0x3b,0x22,0xca,0x3b,0x75,0x24,0x0, 0x75,0x26,0x0, 0x75,0x27,0x0, +0x75,0x28,0x0, 0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x2a,0x7e,0xa3,0xf, 0x24,0x4c,0xaa, +0x78,0xf, 0x7e,0xb3,0xf, 0x20,0x70,0x9, 0x7e,0xb3,0xf, 0x21,0x70,0x3, 0x2, 0x1f, +0x54,0x4c,0xaa,0x78,0x11,0x7e,0xb3,0xf, 0x20,0x60,0x16,0x80,0x9, 0x7e,0x73,0x0, +0xff,0xbe,0x70,0xf, 0x38,0x6, 0x7e,0xb3,0x0, 0x8b,0x60,0xf1,0xe4,0x7a,0xb3,0x0, +0x8b,0x20,0x0, 0x6, 0x7e,0x74,0x15,0xca,0x80,0x4, 0x7e,0x74,0x16,0xc, 0x7d,0x37, +0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xee,0x74,0xaa,0x7a,0x79,0xb0,0x19,0xb7, +0x0, 0x1, 0x7e,0x73,0xf, 0x1d,0x19,0x77,0x0, 0x3, 0x75,0x25,0x0, 0x6c,0xdd,0x2, +0x1e,0xe1,0x7e,0x70,0x7, 0xac,0x7d,0x9, 0xa3,0xe, 0x9d,0x7a,0xa1,0x29,0x7c,0xba, +0x54,0xf, 0xa, 0x2b,0x2e,0x25,0x2a,0x7e,0x29,0xc0,0x7c,0xba,0x54,0xf0,0xbe,0xb0, +0x0, 0x28,0x13,0xb4,0xb0,0x2, 0x80,0x3, 0x2, 0x1e,0xdf,0x53,0x29,0xf, 0xbe,0xc0, +0x1, 0x68,0x3, 0x2, 0x1e,0xdf,0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x1e,0xdf,0x7e,0xa1, +0x25,0x74,0x6, 0xa4,0xf5,0x21,0x9, 0xb3,0xe, 0x9e,0xf5,0x27,0x74,0x7, 0xac,0xbd, +0x9, 0xb5,0xe, 0x9f,0xc4,0x54,0xf0,0xf5,0x28,0x7e,0x73,0xf, 0x46,0xbe,0x71,0x29, +0x28,0x68,0x7e,0xb3,0xf, 0x22,0x70,0x2a,0x7e,0x8, 0x0, 0x27,0xe5,0x29,0xa, 0x3b, +0x2e,0x34,0x0, 0x77,0x74,0x1, 0x7e,0x50,0xf, 0x12,0x5f,0x84,0x7e,0x8, 0x0, 0x28, +0xe5,0x29,0xa, 0x3b,0x2e,0x34,0x0, 0x81,0x74,0x10,0x7e,0x50,0x20,0x12,0x5f,0x84, +0x80,0x14,0xe5,0x29,0xa, 0x3b,0x9, 0xb3,0x0, 0x77,0xf5,0x27,0xe5,0x29,0xa, 0x3b, +0x9, 0xb3,0x0, 0x81,0xf5,0x28,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x2e,0x25,0x2a,0x7e, +0x29,0xb0,0xb4,0x1, 0x15,0xe4,0x19,0xb3,0x0, 0x77,0x6c,0xaa,0xe5,0x29,0xa, 0x3b, +0x19,0xa3,0x0, 0x81,0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0xf, 0x5f,0xb4,0xff, +0x15,0x74,0x7, 0xac,0xbd,0x9, 0xb5,0xe, 0x9d,0xbe,0xb0,0xff,0x68,0x5, 0x75,0x27, +0x1, 0x80,0x3, 0x75,0x27,0x0, 0x7e,0x90,0x7, 0xac,0x9d,0x49,0x54,0xe, 0x99,0x7a, +0x55,0x2c,0x49,0x54,0xe, 0x9b,0x7a,0x55,0x2e,0xbe,0xc0,0x1, 0x78,0x2e,0x75,0x30, +0x0, 0x7e,0x71,0x30,0x74,0x7, 0xac,0x7b,0x9, 0xb3,0x0, 0x90,0x54,0xf, 0xbe,0xb1, +0x29,0x78,0x10,0x49,0x23,0x0, 0x8c,0x7a,0x25,0x2c,0x49,0x53,0x0, 0x8e,0x7a,0x55, +0x2e,0x80,0x9, 0x5, 0x30,0xe5,0x30,0xbe,0xb0,0xa, 0x40,0xd5,0x7e,0x25,0x2c,0x7a, +0x25,0x22,0xa, 0x54,0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x21,0xa, 0x3b,0x7d,0x13, +0x2d,0x17,0x19,0xa1,0x0, 0x5, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x6, 0x7e,0x25, +0x2e,0x7a,0x25,0x22,0xa, 0x14,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x57,0x19,0x35, +0x0, 0x7, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x8, 0xe5,0x27,0x7d,0x23,0x2d,0x27, +0x19,0xb2,0x0, 0x9, 0xe5,0x28,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0xa, 0x9, 0xa4, +0xe, 0x9d,0x7c,0xba,0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x27,0x2e,0x24,0x0, +0x7, 0x7e,0x29,0xb0,0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x21,0xbe,0xc0, +0x1, 0x68,0x2, 0x5, 0x24,0x5, 0x26,0x7c,0xbc,0x3, 0x3, 0x54,0xc0,0x7d,0x13,0x2d, +0x17,0x2e,0x14,0x0, 0x5, 0x7e,0x19,0x50,0x2c,0x5b,0x7a,0x19,0x50,0x80,0xe, 0x2d, +0x37,0x2e,0x34,0x0, 0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x25,0xb, +0xd0,0x7e,0x73,0xf, 0x46,0xbc,0x7d,0x28,0x3, 0x2, 0x1d,0x12,0xe5,0x24,0x19,0xb7, +0x0, 0x4, 0xe5,0x26,0xbe,0xb0,0x0, 0x28,0x2d,0x74,0x42,0x19,0xb7,0x0, 0x2, 0xe4, +0x19,0xb7,0x0, 0x41,0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e, +0x24,0x0, 0x41,0x7e,0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x41, +0x78,0xe4,0xb2,0x0, 0x80,0xe, 0x7e,0xb3,0xf, 0x21,0xb4,0x1, 0xc, 0x7e,0xb3,0x10, +0xd1,0xb4,0x24,0x5, 0x74,0x1, 0x12,0x6e,0xa0,0x7e,0xb3,0xf, 0x20,0x60,0x6, 0x7e, +0x35,0x2a,0x12,0x68,0x19,0xe4,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x20,0x7a,0xb3, +0xf, 0x21,0x80,0x4, 0xe4,0x12,0x6e,0xa0,0x7e,0x24,0xe, 0x99,0x7e,0x34,0x0, 0x8c, +0x7e,0x14,0x0, 0x46,0x12,0x6d,0x4a,0xe5,0x26,0x70,0xd, 0x7e,0x34,0x0, 0x8c,0x7e, +0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xee,0xda,0x3b,0x22,0xca,0x79,0x75,0x26,0x17, +0x7e,0xb3,0xd, 0xf7,0xf5,0x21,0x70,0x3, 0x2, 0x22,0x1d,0x7e,0x34,0x13,0xb6,0x7e, +0x24,0x1, 0x2b,0xe4,0x12,0x6d,0xee,0x7e,0x34,0x14,0xe1,0x7e,0x24,0x0, 0x2, 0xe4, +0x12,0x6d,0xee,0x6c,0xaa,0x2, 0x20,0x32,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, +0x18,0x9, 0x23,0xd, 0x19,0x1a,0x3, 0x1b,0x5, 0x80,0x69,0xbe,0x10,0x0, 0x48,0x62, +0xbe,0x10,0xd, 0x58,0x5d,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25, +0x7c,0xb1,0x54,0x7, 0x7e,0x74,0x0, 0x1, 0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x7c, +0xef,0xa, 0x40,0x2e,0x44,0x14,0xe1,0x7e,0x49,0xb0,0x4c,0xbe,0x7a,0x49,0xb0,0x1a, +0x32,0x1b,0x35,0x7c,0xf7,0x80,0x1f,0xbe,0xf0,0x0, 0x48,0x18,0xe5,0x26,0xbc,0xbf, +0x8, 0x12,0x74,0x1, 0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0x4f,0x2d,0x43, +0x19,0xb4,0x13,0xb6,0xb, 0xf0,0x1a,0x22,0x2e,0x24,0x0, 0x3, 0x1a,0x3f,0xbd,0x32, +0x48,0xd5,0xb, 0x10,0x1a,0x23,0x2e,0x24,0x0, 0x3, 0x1a,0x31,0xbd,0x32,0x48,0x8b, +0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x1f,0xa8,0x6c,0x11,0x7c,0x1, 0xe, +0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, 0x7e,0x44,0x0, 0x1, +0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa, 0x30,0x9, 0xb3,0x14,0xe1,0x5c, +0xbe,0x78,0x3, 0x2, 0x20,0xf9,0x6d,0x33,0x7a,0x35,0x22,0x75,0x24,0x0, 0x1a,0x21, +0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x43,0x2e,0x47,0xf, 0xda,0x6c,0x0, 0x80,0x26, +0x1a,0xe1,0x7e,0xf4,0x0, 0x17,0xad,0xfe,0xa, 0x30,0x2d,0x3f,0x9, 0xb3,0x13,0xb6, +0x70,0x12,0x7e,0x70,0x2, 0xac,0x70,0x2d,0x34,0xb, 0x38,0x30,0x2e,0x35,0x22,0x7a, +0x35,0x22,0x5, 0x24,0xb, 0x0, 0xe5,0x26,0xbc,0xb0,0x38,0xd4,0xe5,0x24,0x60,0x49, +0xe5,0x24,0x1a,0x2b,0x7e,0x35,0x22,0x12,0x47,0xf2,0x7a,0x35,0x22,0x6c,0xff,0x80, +0x32,0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0xff,0x7d,0xe3,0x2d,0xef,0x9, +0xbe,0x13,0xb6,0xb4,0x1, 0x1b,0x1a,0x21,0x7e,0x34,0x0, 0x18,0xad,0x32,0x7d,0x23, +0x2d,0x2f,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x9e,0x35,0x22,0x1b,0x28, +0x30,0xb, 0xf0,0xe5,0x26,0xbc,0xbf,0x18,0xc8,0xb, 0x10,0xa5,0xb9,0xd, 0x2, 0x80, +0x3, 0x2, 0x20,0x3d,0x6c,0xaa,0x2, 0x22,0x14,0x7e,0x10,0x2, 0xac,0x1a,0x9, 0x30, +0xd, 0x18,0x9, 0x20,0xd, 0x19,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xf5,0x25,0x7c,0xba, +0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa5, +0xbb,0x0, 0x2c,0x1a,0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e, +0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x20,0x49,0x33,0x0, 0x30,0xbd,0x32,0x18,0x3, +0x2, 0x21,0xd9,0x1a,0x33,0xb, 0x34,0x7c,0xb7,0x19,0xb0,0xd, 0x18,0x80,0x7a,0xa5, +0xbb,0xc, 0x2c,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x22,0x2d,0x23,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x49,0x2, 0xff,0xd0,0xbd,0x3, 0x8, 0x59, +0x1a,0x33,0x1b,0x34,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x70,0xd, 0x18,0x80,0x4a,0x1a, +0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, +0xda,0x49,0x43,0x0, 0x30,0x49,0x3, 0xff,0xd0,0xbd,0x4, 0x8, 0x16,0xb, 0x38,0x20, +0xbd,0x2, 0x8, 0x25,0x1a,0x23,0x1b,0x24,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x50,0xd, +0x18,0x80,0x16,0xb, 0x38,0x0, 0xbd,0x40,0x8, 0xf, 0x1a,0x33,0xb, 0x34,0x7c,0x37, +0x7e,0x10,0x2, 0xac,0x1a,0x19,0x30,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33, +0xd, 0x18,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x2, 0x2d,0x3, 0x3e,0x4, +0x2e,0x7, 0xf, 0xda,0xb, 0x8, 0x0, 0xbe,0x4, 0x0, 0x3c,0x58,0x15,0x7c,0x7e,0x6e, +0x70,0xff,0xe5,0x25,0xa, 0x4b,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x5c,0xb7,0x7a, +0x49,0xb0,0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x21,0x9, 0xda,0x79,0x22, +0xca,0xd8,0xca,0x79,0x6c,0xaa,0x7e,0x34,0x11,0x9e,0x7e,0x44,0x11,0x4a,0xe4,0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfe,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, +0x17,0xbe,0xb0,0x0, 0x28,0x4f,0x7e,0x53,0xd, 0xf8,0xbe,0x50,0x0, 0x28,0x46,0x6c, +0xff,0x80,0x3c,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x40,0x9, 0xe1,0xd, 0x41, +0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x13,0xb, 0x18,0x0, 0x6d,0x11,0x9e,0x17,0xf, 0x4c, +0xbd,0x1, 0x58,0x19,0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x13,0x49,0x1, 0x0, 0x30,0x6d, +0x11,0x9e,0x17,0xf, 0x4a,0xbd,0x1, 0x58,0x4, 0x5, 0x6b,0x80,0xb, 0xb, 0xf0,0xbc, +0x5f,0x38,0xc0,0x80,0x3, 0x75,0x6b,0x0, 0xe5,0x6b,0xbe,0xb0,0x3, 0x40,0x17,0x7e, +0xb3,0xe, 0xa, 0x44,0x1, 0x7a,0xb3,0xe, 0xa, 0x75,0x6b,0x0, 0x7e,0xb3,0x16,0xbc, +0x44,0x1, 0x7a,0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfd,0x7a,0xb3,0xe, 0xa, +0x7e,0xb3,0xd, 0x16,0x70,0x59,0x7e,0x53,0xd, 0xf7,0xbe,0x50,0x0, 0x28,0x50,0x6c, +0xff,0x80,0x48,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x18,0x9, 0xe1,0xd, 0x19, +0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x14,0x49,0x11,0x0, 0x30,0x6d,0x0, 0x9e,0x7, 0xd, +0xff,0xbd,0x10,0x48,0xe, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x14,0xb, 0x18,0x10,0xbd, +0x10,0x58,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x2, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16, +0xbc,0x44,0x2, 0x7a,0xb3,0x16,0xbc,0x80,0x6, 0xb, 0xf0,0xbc,0x5f,0x38,0xb4,0x7e, +0xb3,0xe, 0x9, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x23,0xc3,0x7e,0xb3,0xd, 0x16,0x70, +0x6d,0x6c,0xff,0x80,0x61,0x7e,0x50,0x2, 0xac,0x5f,0x7d,0x12,0x2d,0x14,0xb, 0x18, +0x10,0xbe,0x17,0xd, 0xff,0x8, 0x4d,0x2d,0x23,0xb, 0x28,0x20,0xbe,0x27,0xd, 0xff, +0x58,0x42,0xbe,0xf1,0x6c,0x68,0x6, 0x7a,0xf1,0x6c,0x75,0x6d,0x0, 0xbe,0xf1,0x6c, +0x78,0x2, 0x5, 0x6d,0xe5,0x6d,0xbe,0xb0,0x10,0x28,0x33,0x75,0x6d,0x10,0xe5,0x51, +0x70,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x4, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x4, 0x7a,0xb3,0x16,0xbc,0x80,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3, +0xe, 0xa, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0x97,0x6c,0xaa, +0x6c,0xff,0x80,0x17,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x34,0xb, 0x38,0x30,0xbe,0x37, +0xd, 0xff,0x8, 0x5, 0x7e,0xa0,0x1, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc, +0xbf,0x38,0xe1,0x4c,0xaa,0x78,0x1a,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, +0xa, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0xb3,0x16,0xbc,0x54,0xfb,0x7a,0xb3,0x16, +0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xf7,0x7a,0xb3,0xe, 0xa, 0x7e,0x73,0xd, 0xfa,0xa, +0x27,0x7e,0x73,0xd, 0xf9,0xa, 0x37,0x2d,0x32,0xbe,0x37,0xe, 0x3, 0x28,0x14,0x7e, +0xb3,0xe, 0xa, 0x44,0x8, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc,0x44,0x8, 0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x44,0x10,0x7a,0xb3,0xe, 0xa, 0x6c,0xff,0x80, +0x49,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70, +0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30, +0x49,0x22,0x10,0x3, 0x9d,0x32,0x7a,0x35,0x21,0x12,0x6d,0xde,0xbe,0x37,0xe, 0x1, +0x28,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xef,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x10,0x7a,0xb3,0x16,0xbc,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f, +0x38,0xaf,0x7e,0x34,0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x12,0x6d,0xee,0x6c,0xff, +0x80,0x25,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e, +0x70,0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x30,0x59,0x32,0x10,0x3, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xd3,0xda, +0x79,0xda,0xd8,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x21,0x75,0x25,0x0, 0x75,0x26, +0x0, 0x7e,0x23,0xd, 0xf7,0x7a,0x21,0x23,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x13,0xb6, +0x7e,0x30,0x2, 0xac,0x23,0x7e,0x24,0xd, 0x18,0x7e,0x34,0x13,0xb8,0x12,0x6d,0x4a, +0xe5,0x23,0xbe,0xb0,0xa, 0x38,0x3, 0x2, 0x26,0xb9,0x75,0x24,0x0, 0x6c,0xff,0x2, +0x25,0xcd,0x7e,0x34,0x3, 0xff,0x7a,0x35,0x27,0x75,0x26,0xff,0x6c,0xee,0x80,0x7e, +0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x13,0xb8,0xbe,0xb0,0xff,0x68,0x6e,0x7c,0xbe, +0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7a,0xa1,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x2c,0xa, 0x2a,0x9, 0xb2, +0xd, 0x68,0x55,0x2c,0x68,0x46,0x9, 0x73,0x13,0xb9,0xa, 0x27,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0x15,0xa3,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xde,0x7d,0x63,0x74,0x2, 0xac, +0xbe,0x9, 0x75,0x13,0xb8,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa2,0xa, +0x37,0x9d,0x32,0x12,0x6d,0xde,0x2d,0x36,0x7a,0x35,0x29,0x7e,0x35,0x27,0xbe,0x35, +0x29,0x28,0x9, 0x7e,0x35,0x29,0x7a,0x35,0x27,0x7a,0xe1,0x26,0xb, 0xe0,0xe5,0x23, +0xbc,0xbe,0x28,0x3, 0x2, 0x25,0x0, 0xe5,0x26,0xbe,0xb0,0xff,0x68,0x3d,0x7e,0x71, +0x26,0x74,0x2, 0xac,0x7b,0x9, 0x33,0x13,0xb8,0x7e,0x50,0x18,0xac,0x53,0x9, 0xa3, +0x13,0xb9,0xa, 0xa, 0x2d,0x20,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28,0x20,0xbe, +0x24,0x0, 0x3c,0x48,0x16,0xe5,0x24,0x1a,0x2b,0x3e,0x24,0x19,0x32,0x13,0xe0,0x19, +0xa2,0x13,0xe1,0x74,0xff,0x19,0xb3,0x13,0xb8,0x5, 0x24,0xb, 0xf0,0xe5,0x11,0xbc, +0xbf,0x28,0x3, 0x2, 0x24,0xf2,0x7e,0xf1,0x24,0x2, 0x26,0x9f,0x6d,0x33,0x7a,0x35, +0x21,0x7e,0xa0,0xff,0x6c,0xee,0x2, 0x26,0x71,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c, +0x7b,0x7a,0x71,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0xb9,0xf5,0x2c,0xa, 0x37,0x9, 0xb3,0xd, 0x68,0x55,0x2c,0x68, +0x5e,0x7e,0x90,0x2, 0xac,0x9e,0x9, 0x44,0x13,0xb8,0xbe,0x40,0xff,0x68,0x50,0x7e, +0x50,0x18,0xac,0x45,0x9, 0xb4,0x13,0xb9,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27, +0x13,0xb6,0xb, 0x28,0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30, +0x7e,0x50,0x2, 0xac,0x5e,0x9, 0x62,0x13,0xb8,0x7e,0x30,0x18,0xac,0x36,0x9, 0x72, +0x13,0xb9,0xa, 0x7, 0x2d,0x10,0x3e,0x14,0x2e,0x17,0x13,0xb6,0xb, 0x18,0x40,0xbe, +0x45,0x21,0x8, 0xb, 0x7a,0x61,0x25,0x7a,0x71,0x26,0x7a,0x45,0x21,0x7c,0xae,0xb, +0xe0,0xe5,0x23,0xbc,0xbe,0x28,0x3, 0x2, 0x25,0xe9,0xbe,0xa0,0xff,0x68,0x1e,0x7e, +0x71,0x25,0x7e,0x90,0x2, 0xac,0x9f,0x19,0x74,0x13,0xe0,0xe5,0x26,0x19,0xb4,0x13, +0xe1,0x7e,0x70,0xff,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x13,0xb8,0xb, 0xf0,0xbe, +0xf0,0xa, 0x50,0x3, 0x2, 0x25,0xdc,0x7e,0x24,0x13,0xe0,0x7e,0x34,0x13,0xb8,0x7e, +0x14,0x0, 0x28,0x12,0x6d,0x4a,0x75,0x23,0xa, 0x7e,0x34,0x15,0xa2,0x7e,0x24,0x0, +0x14,0x74,0xff,0x12,0x6d,0xee,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0x55,0x7e,0x31,0x23, +0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x4a,0x7e, +0x31,0x23,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0x15,0xa2,0x12,0x6d, +0x4a,0x6c,0xff,0x80,0x27,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7c,0x67,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24, +0xd, 0x68,0x7e,0x29,0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xf0,0xe5,0x23,0xbc,0xbf, +0x38,0xd3,0x85,0x23,0x11,0xe5,0x23,0x7a,0xb3,0xd, 0xf7,0xda,0x3b,0x22,0x7c,0x7b, +0xbe,0x70,0x10,0x40,0x12,0xbe,0x70,0x4b,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x16,0x4f, +0x9e,0x34,0x0, 0x10,0x2, 0x29,0x69,0xa5,0xbf,0x0, 0x3, 0xe5,0xb, 0x22,0xa5,0xbf, +0x1, 0x3, 0xe5,0xd, 0x22,0xa5,0xbf,0x2, 0x5, 0x7e,0xb3,0xf, 0x28,0x22,0xbe,0x70, +0x3, 0x40,0x12,0xbe,0x70,0x5, 0x38,0xd, 0xa, 0x37,0x2e,0x34,0x10,0x2b,0x9e,0x34, +0x0, 0x3, 0x2, 0x29,0x69,0xa5,0xbf,0x6, 0x3, 0x74,0x1, 0x22,0xa5,0xbf,0x7, 0x5, +0x7e,0xb3,0x10,0x4b,0x22,0xa5,0xbf,0x8, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e, +0xb3,0xa, 0xac,0x22,0x7e,0xb3,0x11,0x16,0x22,0xa5,0xbf,0x9, 0x10,0x7e,0xb3,0x10, +0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xad,0x22,0x7e,0xb3,0x11,0x49,0x22,0xa5,0xbf,0xa, +0x5, 0x7e,0xb3,0x10,0x3b,0x22,0xa5,0xbf,0xb, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, +0x7e,0xb3,0xa, 0xae,0x22,0x7e,0xb3,0x11,0x94,0x22,0xa5,0xbf,0xc, 0x10,0x7e,0xb3, +0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xd, 0xfe,0x22,0x7e,0xb3,0x11,0x9d,0x22,0xa5,0xbf, +0x4c,0x5, 0x7e,0xb3,0xf, 0x46,0x22,0xa5,0xbf,0xfb,0x3, 0xe5,0x8, 0x22,0xa5,0xbf, +0x4e,0x5, 0x7e,0xb3,0x10,0x4a,0x22,0xbe,0x70,0x50,0x40,0x12,0xbe,0x70,0x51,0x38, +0xd, 0xa, 0x37,0x2e,0x37,0x10,0x2f,0x9e,0x34,0x0, 0x50,0x2, 0x29,0x69,0xbe,0x70, +0x52,0x40,0x12,0xbe,0x70,0x55,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x31,0x9e,0x34, +0x0, 0x52,0x2, 0x29,0x69,0xbe,0x70,0x56,0x40,0x12,0xbe,0x70,0x62,0x38,0xd, 0xa, +0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x56,0x2, 0x29,0x69,0xbe,0x70,0x63,0x40, +0x12,0xbe,0x70,0x7a,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x63, +0x2, 0x29,0x69,0xbe,0x70,0x7b,0x50,0x3, 0x2, 0x28,0xfd,0xbe,0x70,0x9f,0x28,0x3, +0x2, 0x28,0xfd,0x7e,0xb3,0x10,0x3b,0x70,0x4a,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe, +0x24,0x0, 0x18,0x58,0x22,0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e, +0x39,0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c, +0xab,0x80,0x19,0x1e,0xa0,0x80,0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, +0x93,0x7e,0x39,0x70,0xa, 0x57,0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3, +0xf, 0xdc,0x22,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x22,0xa, +0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba,0x30,0xe0, +0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e,0xa0,0x80, +0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70,0xa, 0x57, +0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0x63,0x22,0xbe,0x70,0xa0, +0x40,0x11,0xbe,0x70,0xac,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6c,0x9e,0x34,0x0, +0xa0,0x80,0x56,0xbe,0x70,0xad,0x40,0x11,0xbe,0x70,0xb9,0x38,0xc, 0xa, 0x37,0x2e, +0x37,0x10,0x6e,0x9e,0x34,0x0, 0xad,0x80,0x40,0xbe,0x70,0xba,0x40,0x11,0xbe,0x70, +0xd1,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x70,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe, +0x70,0xd2,0x40,0x11,0xbe,0x70,0xd5,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x72,0x9e, +0x34,0x0, 0xd2,0x80,0x14,0xbe,0x70,0xd6,0x40,0x13,0xbe,0x70,0xed,0x38,0xe, 0xa, +0x37,0x2e,0x37,0x10,0x74,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xa5,0xbf,0xf8, +0x5, 0x7e,0xb3,0x11,0xe8,0x22,0xa5,0xbf,0xfe,0x3, 0xe5,0xc, 0x22,0x74,0xff,0x22, +0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20,0x0, 0x41,0x0, 0x42,0x0, 0x22, +0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40,0x0, 0xa3,0x0, 0xa5,0x0, 0x44, +0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60,0x0, 0xe5,0x0, 0xe8,0x0, 0x66, +0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80,0x1, 0x47,0x1, 0x4b,0x0, 0x88, +0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0,0x1, 0x89,0x1, 0xad,0x0, 0xaa, +0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xaa, +0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0,0x1, 0x69,0x1, 0x6c,0x0, 0x88, +0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80,0x1, 0x27,0x1, 0x9, 0x0, 0x66, +0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60,0x0, 0xc5,0x0, 0xc6,0x0, 0x44, +0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40,0x0, 0x83,0x0, 0x64,0x0, 0x22, +0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20,0x0, 0x21,0x0, 0x21,0x0, 0x0, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0xca,0x3b,0x7e,0x34,0x13,0xff,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6d,0xee,0x7e,0xe0, +0x1, 0x7e,0x73,0x10,0x4d,0x7a,0x73,0x13,0xb6,0xe4,0x7a,0xb3,0x10,0x4d,0x6c,0xdd, +0x6c,0xcc,0x80,0x11,0xa, 0x3c,0x2e,0x37,0x10,0x6e,0x7e,0x39,0x70,0xbc,0x7d,0x40, +0x2, 0x7c,0xd7,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc,0x7c,0x38,0xe7,0xbe,0xd0,0x1f, +0x50,0xc, 0xa, 0x2d,0x7e,0x34,0x0, 0x1f,0x9d,0x32,0x7c,0xd7,0x80,0x2, 0x6c,0xdd, +0x7a,0xd1,0x21,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10,0x2b,0x12,0x6a, +0x72,0x2, 0x2d,0x7d,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37, +0xa, 0xaf,0x12,0x6e,0xdd,0x12,0x69,0x31,0x12,0x6e,0x86,0x60,0xfb,0xa9,0xb7,0xea, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x82,0x6c, +0xcc,0x80,0x78,0x6c,0xff,0x80,0x6a,0x4c,0xcc,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3, +0x13,0xe7,0x6d,0x33,0x74,0x2, 0xac,0xbf,0x59,0x35,0x13,0xb7,0xbe,0xf0,0x17,0x78, +0x13,0x7e,0x34,0x0, 0x1, 0x7c,0xbc,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x5e,0x34, +0x4, 0x44,0x68,0x3b,0x7e,0x50,0x30,0xac,0x5c,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x32, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, +0x14,0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xa, 0x3f,0x2e,0x34,0x13,0xe7,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xb, +0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0x8e,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc, +0x7c,0x38,0x80,0x75,0x22,0x0, 0x6c,0xcc,0x2, 0x2d,0x5b,0xa, 0x3c,0x9, 0xa3,0x13, +0xe7,0x4c,0xaa,0x78,0xf, 0x7e,0x44,0x22,0xc4,0x7e,0x70,0x2, 0xac,0x7c,0x59,0x43, +0x13,0xb7,0x80,0x25,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x12,0x13,0xb7,0xa, 0xa, 0x8d, +0x10,0x59,0x12,0x13,0xb7,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x32, +0x13,0xb7,0xbe,0x34,0x1f,0xa4,0x50,0x22,0xa, 0x1c,0x2e,0x14,0x13,0xff,0x7e,0x19, +0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1c,0x2e,0x17,0x10,0x74,0x7e,0x19,0xb0,0xbc,0xbd, +0x50,0x2f,0x4, 0x7a,0x19,0xb0,0x80,0x31,0x80,0x27,0xbe,0x34,0x25,0xe4,0x28,0x27, +0xa, 0x3c,0x2e,0x34,0x13,0xff,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xa, 0x3c,0x2e, +0x37,0x10,0x74,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14,0x7a,0x39,0xb0,0x80, +0x8, 0x5, 0x22,0x6c,0xee,0x80,0x2, 0x5, 0x22,0xb, 0xc0,0x7e,0x73,0x10,0x2c,0xbc, +0x7c,0x28,0x3, 0x2, 0x2c,0xbb,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10, +0x2b,0x12,0x6a,0x72,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x22,0x68,0xf, 0x7e,0xa1,0x21, +0x7c,0xba,0x14,0xf5,0x21,0x4c,0xaa,0x68,0x3, 0x2, 0x2c,0x4, 0x7e,0x73,0x13,0xb6, +0x7a,0x73,0x10,0x4d,0x6c,0xff,0x80,0x10,0xa, 0x3f,0x9, 0x73,0x13,0xff,0xbc,0x7d, +0x78,0x4, 0x6c,0xee,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0xe8, +0x7c,0xbe,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xb3,0x10,0x3c,0xf5,0x21,0xe4,0x7a,0xb3, +0x10,0x3c,0x7e,0xb3,0x10,0x3a,0xf5,0x22,0x74,0x3, 0x7a,0xb3,0x10,0x3a,0x7e,0x37, +0x10,0x48,0x7e,0x24,0x0, 0x25,0xe4,0x12,0x6d,0xee,0x7e,0xe0,0x7, 0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xdd,0x6c,0xdd, +0x7e,0x14,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0xa, 0x2d,0x2e, +0x27,0x10,0x48,0x7e,0x29,0x70,0x4c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25, +0x78,0xde,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x10,0x7e,0x34,0x10,0x2b,0x12,0x64,0xb9, +0x12,0x6e,0x8f,0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xde,0x6c, +0xdd,0xbe,0xd0,0x18,0x50,0x1e,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c, +0xbf,0x30,0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x16, +0x1e,0xf0,0x80,0x12,0xa, 0x3d,0x2e,0x37,0x10,0x33,0x9, 0x73,0xff,0xe8,0xa, 0x37, +0x2e,0x34,0x0, 0x18,0x7c,0xf7,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0xb, +0x38,0x30,0xbe,0x34,0x25,0x80,0x18,0x21,0x7e,0x34,0x0, 0x1, 0x7c,0xbe,0x60,0x5, +0x3e,0x34,0x14,0x78,0xfb,0x7d,0x13,0x6e,0x14,0xff,0xff,0xa, 0x2f,0x2e,0x27,0x10, +0x48,0x7e,0x29,0x70,0x5c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78,0x91, +0x1b,0xe0,0xbe,0xe0,0x0, 0x48,0x3, 0x2, 0x2d,0xdd,0x7e,0xe0,0xa, 0x74,0x2, 0x7a, +0xb3,0x10,0x3a,0x2, 0x2f,0xac,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac, +0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xdd,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10, +0x2c,0xa, 0x65,0x2d,0x63,0x7c,0xcd,0x6c,0xdd,0x2, 0x2f,0x74,0x7e,0xa3,0x10,0x2c, +0xbc,0xad,0x28,0x27,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf,0x30, +0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x2, 0x1e,0xf0, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x80,0x27,0xa, 0x2a,0xa, 0x3d,0x9d, +0x32,0x2e,0x37,0x10,0x33,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34,0x0, 0x18,0x7c,0xf7, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xa4, +0x9d,0x35,0xb, 0x38,0x30,0x7a,0x35,0x23,0xbe,0x34,0x2e,0xe0,0x8, 0x18,0x4c,0xee, +0x68,0x30,0xa, 0x2f,0x2e,0x27,0x10,0x48,0x7e,0x29,0xb0,0xbe,0xb0,0xfe,0x50,0x22, +0x4, 0x7a,0x29,0xb0,0x80,0x1c,0xbe,0x34,0x17,0x70,0x58,0x14,0xa, 0x3f,0x2e,0x37, +0x10,0x48,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x7a,0x39,0xb0,0x80,0x2, +0x1b,0xc0,0xb, 0xd0,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c,0xa, 0x25, +0x2d,0x23,0xa, 0x3d,0xbd,0x32,0x58,0x3, 0x2, 0x2e,0xdc,0x4c,0xcc,0x68,0x28,0x7e, +0x34,0x10,0x2b,0x12,0x5b,0x10,0x7e,0x34,0x10,0x2b,0x12,0x64,0xb9,0x12,0x6e,0x8f, +0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xde,0x7c,0xae,0x1b,0xe0, +0x4c,0xaa,0x68,0x3, 0x2, 0x2e,0xb6,0xe5,0x21,0x7a,0xb3,0x10,0x3c,0xe5,0x22,0x7a, +0xb3,0x10,0x3a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x24,0x15,0x56,0x7e,0x34, +0x13,0xfe,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x4a,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13, +0xb6,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x4a,0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x13,0xfc, +0x7e,0x73,0xf, 0x1c,0x7a,0x73,0x13,0xfd,0x7e,0xa3,0x13,0xfc,0xbe,0xa0,0x1, 0x38, +0x3, 0x7e,0xf0,0x1, 0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0xe4,0x80,0x10,0x7e,0xb3,0x15, +0xa1,0x4, 0x7a,0xb3,0x15,0xa1,0xbe,0xb0,0xc8,0x28,0x6, 0x74,0x14,0x7a,0xb3,0x15, +0xa1,0x7e,0xb3,0x15,0xa1,0xbe,0xb0,0x6, 0x50,0x3, 0x7e,0xf0,0x1, 0xbe,0xa0,0x1, +0x28,0x3f,0x7e,0x34,0x0, 0x21,0x7e,0x24,0x0, 0x23,0x7e,0x14,0x13,0xfe,0x12,0x65, +0xb6,0x7e,0x34,0x0, 0x25,0x7e,0x24,0x0, 0x27,0x7e,0x14,0x13,0xb6,0x12,0x65,0xb6, +0x7e,0x35,0x25,0x9e,0x35,0x21,0x12,0x6d,0xde,0xbe,0x34,0x0, 0x80,0x18,0xf, 0x7e, +0x35,0x27,0x9e,0x35,0x23,0x12,0x6d,0xde,0xbe,0x34,0x0, 0x80,0x8, 0x3, 0x7e,0xf0, +0x1, 0xbe,0xf0,0x0, 0x28,0x3, 0x2, 0x31,0x24,0x7e,0xf3,0x15,0x9f,0xbe,0xf3,0x15, +0x29,0x50,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73,0x13,0xfc,0x28,0x12,0x7e,0x24,0x15, +0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x4a,0x2, 0x31,0x24,0x7e, +0x73,0x15,0x9e,0xbe,0x70,0x2, 0x58,0x22,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x4a,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3, +0x15,0x53,0x7e,0xb3,0x15,0x9e,0x4, 0x2, 0x31,0x60,0x74,0x1, 0x7a,0xb3,0x15,0xa0, +0xe4,0x7a,0xb3,0x15,0x53,0x2, 0x31,0x60,0xbe,0xf3,0x15,0x29,0x78,0x2d,0x7e,0xa3, +0x15,0x29,0xbe,0xa3,0x13,0xfc,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a, +0xb3,0x15,0x53,0x80,0x6b,0xbe,0xa3,0x13,0xfc,0x28,0x4, 0x74,0x1, 0x80,0x1, 0xe4, +0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0x80,0x55,0x7e,0x73,0x15,0x29,0xbe, +0x73,0x13,0xfc,0x50,0x1a,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, +0x48,0x12,0x6d,0x4a,0xe4,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0x53,0x80,0x31,0x7e, +0x73,0x15,0x53,0xbe,0x70,0x2, 0x58,0x1c,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x4a,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0x7e,0xb3,0x15, +0x53,0x4, 0x80,0x7, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0xe4, +0x7a,0xb3,0x15,0x9e,0x7e,0xb3,0x15,0xa0,0x14,0x68,0x9, 0x4, 0x78,0x15,0x7e,0x24, +0x13,0xb6,0x80,0x4, 0x7e,0x24,0x14,0xe3,0x7e,0x34,0x15,0x56,0x7e,0x14,0x0, 0x48, +0x12,0x6d,0x4a,0x7e,0x73,0x15,0x29,0x7a,0x73,0x15,0x9f,0x7e,0x24,0x13,0xb6,0x7e, +0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x4a,0x7e,0x24,0x15,0x56,0x7e,0x34, +0xe, 0xd, 0x7e,0x14,0x0, 0x46,0x12,0x6d,0x4a,0x7e,0x73,0x15,0x9c,0x7a,0x73,0xf, +0x1b,0x7e,0x73,0x15,0x9d,0x7a,0x73,0xf, 0x1c,0xda,0xf8,0x22,0xca,0x79,0x7d,0x73, +0x12,0x60,0xdc,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27, +0x0, 0x27,0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c, +0xe, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49, +0x27,0x0, 0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34, +0x1c,0x14,0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c, +0x67,0x6c,0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38, +0x10,0x9, 0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, +0x25,0x4d,0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27, +0x7e,0x34,0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20, +0x6c,0xaa,0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e, +0x34,0x1c,0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, +0x4b,0x2d,0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe, +0xa0,0x19,0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e, +0x70,0x2, 0xac,0x7a,0x2e,0x34,0x29,0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e, +0x24,0x1c,0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x2b, +0x7e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x2b, +0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, +0xa0,0xbe,0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x5d,0xcb,0x49,0x27,0x0, 0x39,0x7e, +0x34,0x1c,0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33, +0x7e,0x34,0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, +0xb7,0x0, 0x1, 0x12,0x64,0x78,0x49,0x37,0x0, 0x47,0x12,0x7, 0xc9,0x49,0x37,0x0, +0x49,0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x5c,0xa5,0x49,0x27,0x0, 0x35, +0x7e,0x34,0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b, +0x38,0x20,0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22, +0xca,0x3b,0x6d,0x33,0x7a,0x35,0x23,0x7e,0xb3,0xf, 0x1b,0x60,0x6, 0x7e,0xb3,0xf, +0x1c,0x60,0x11,0xe5,0x22,0x60,0x5, 0x75,0x19,0x1, 0x80,0x3, 0x75,0x19,0x0, 0xe5, +0x19,0x2, 0x35,0x1f,0x7e,0xb3,0xd, 0x18,0xf5,0x21,0x7e,0x73,0xd, 0x19,0x7a,0x71, +0x22,0x6d,0x66,0x75,0x25,0x0, 0x75,0x26,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x3a,0x7e, +0x51,0x21,0x74,0x18,0xac,0x5b,0x2d,0x27,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28, +0x10,0xbe,0x14,0x0, 0x3c,0x8, 0x28,0x5, 0x25,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0x8, +0x49,0x12,0xff,0xd0,0x2d,0x61,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, 0x50,0x8, 0x49, +0x22,0x0, 0x30,0x2d,0x62,0x5, 0x26,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc0,0x7d, +0x73,0x80,0x38,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0x2d,0x37,0x3e,0x34,0x2e,0x37, +0xf, 0xda,0xb, 0x38,0x20,0xbe,0x24,0x0, 0x3c,0x8, 0x2c,0x5, 0x25,0xe5,0x21,0xbe, +0xb0,0x0, 0x28,0x8, 0x49,0x23,0xff,0xd0,0x2d,0x62,0x5, 0x26,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x8, 0x49,0x33,0x0, 0x30,0x2d,0x63,0x5, 0x26,0x7d,0x37,0xb, 0x34,0x7d, +0x73,0xbe,0x34,0x0, 0x18,0x48,0xbc,0xe5,0x25,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12, +0x7d,0x36,0x12,0x6d,0xde,0xe5,0x26,0xa, 0x2b,0x12,0x47,0xf2,0xbe,0x34,0x0, 0xf, +0x8, 0x8, 0x75,0x19,0x1, 0x74,0x1, 0x2, 0x35,0x1f,0x6d,0x33,0xe5,0x21,0xbe,0xb0, +0x0, 0x28,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0xff,0xd0,0x2d,0x32,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0x0, 0x30,0x2d,0x32,0x7e,0xa0,0x8, 0x80, +0x2d,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2e,0x14,0x6d,0xce,0x7a,0x31,0x82,0x7a, +0x21,0x83,0xe4,0x93,0x1a,0x1b,0xbd,0x13,0x8, 0x14,0x2e,0x24,0x6d,0xcf,0x7a,0x51, +0x82,0x7a,0x41,0x83,0xe4,0x93,0x1a,0x2b,0x2e,0x25,0x23,0x7a,0x25,0x23,0x7c,0x5a, +0x1b,0xa0,0xa5,0xbd,0x0, 0xcb,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0xe5,0x22,0xa, +0x2b,0x2d,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x12,0x6d,0xde,0xbe, +0x34,0x3, 0xe8,0x8, 0xa, 0x7e,0x35,0x23,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x23,0x7e, +0x35,0x23,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x23,0xe5, +0x19,0xa, 0x3b,0xbe,0x35,0x23,0x50,0x5, 0x7e,0x55,0x23,0xf5,0x19,0xe5,0x19,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x9b,0x7d,0xa3,0xbe,0x90,0x1, 0x28,0x1e,0xa, 0x15,0x1b, +0x15,0xa, 0x39,0xbd,0x31,0x58,0x14,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b, +0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x61,0x7d,0xb3,0x80,0x7, 0xbe,0x90,0x1, 0x78,0x15, +0x6d,0xbb,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d, +0x61,0x7d,0xc3,0x80,0x8, 0x4c,0x99,0x78,0x38,0x6d,0xcc,0x7d,0xbc,0x74,0x2, 0xac, +0xb9,0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x61,0x7d,0xd3,0x7e,0x70,0x2, +0xac,0x79,0x2d,0x3a,0x49,0x33,0x0, 0x2, 0x12,0x6d,0x61,0x7d,0xe3,0x74,0x2, 0xac, +0xb9,0x7d,0xf5,0x2d,0xfa,0x49,0x3f,0x0, 0x4, 0x12,0x6d,0x61,0x7d,0xf3,0x2, 0x36, +0x2d,0x7c,0xb5,0x24,0xfe,0xbc,0xb9,0x78,0x46,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d, +0xba,0x1b,0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x61,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79, +0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x61,0x7d,0xc3,0x74,0x2, 0xac,0xb9, +0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x61,0x7d,0xd3,0x74,0x2, 0xac,0xb9, +0x2d,0xa5,0x49,0x3a,0x0, 0x2, 0x12,0x6d,0x61,0x7d,0xe3,0x6d,0xff,0x80,0x3e,0x7c, +0xb5,0x14,0xbc,0xb9,0x78,0x37,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6, +0xb, 0xb8,0x30,0x12,0x6d,0x61,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b, +0x35,0xb, 0x38,0x30,0x12,0x6d,0x61,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d,0xd5,0x2d, +0xda,0xb, 0xd8,0x30,0x12,0x6d,0x61,0x7d,0xd3,0x6d,0xff,0x7d,0xef,0xa, 0x79,0x6d, +0x66,0x7f,0x3, 0x1b,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x7f,0x41, +0x7f,0x3, 0x1b,0xd, 0x7d,0x3b,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0x7d, +0x3d,0x1a,0x26,0x1a,0x24,0xa, 0x19,0x6d,0x0, 0x12,0x48,0x24,0x2f,0x41,0xa, 0x19, +0x6d,0x0, 0xb, 0xc, 0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0xa, +0x19,0x6d,0x0, 0xb, 0xd, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x14, +0x7d,0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x5b,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1d, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x7d,0x5e,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1f, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x48,0x40, +0x2e,0x34,0x0, 0x20,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xf, 0x1b,0x7e,0x64,0xe, +0xdf,0xe5,0x51,0xb4,0x1, 0x21,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x1a,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0x13,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0xa, 0x74,0x1e,0x7a, +0xb3,0xf, 0x26,0x74,0x14,0x80,0x8, 0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a, +0xb3,0xf, 0x27,0x4c,0xff,0x78,0xd, 0x75,0x1a,0x0, 0x7e,0xb3,0xf, 0x26,0x12,0x6e, +0xaf,0x2, 0x38,0x47,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14, +0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, +0x74,0x1, 0x80,0x1, 0xe4,0xb4,0x1, 0x9, 0xe5,0x1a,0x70,0x5, 0x75,0x17,0x1e,0xf5, +0x18,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80, +0x1, 0xe4,0xf5,0x1a,0x6c,0xee,0x7e,0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xe, 0x9d,0xf5, +0x21,0xbe,0xb0,0xff,0x78,0x3, 0x2, 0x38,0x3d,0xe5,0x21,0xa, 0x2b,0x2d,0x26,0x7e, +0x29,0xb0,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x38,0x3d,0x49,0x33,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x74,0x12,0x6d,0xbe,0x7a,0x35,0x22,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0x9b,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x76, +0x12,0x6d,0xbe,0x7a,0x35,0x24,0xe5,0x17,0xa, 0x3b,0xbe,0x35,0x22,0x28,0x56,0xbe, +0x35,0x24,0x28,0x51,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x74,0x74,0x7, +0xac,0xbe,0x59,0x35,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x76, +0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0x9b,0xe5,0x21,0xa, 0x3b,0x2d,0x36,0x7e,0x39, +0xb0,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, 0x28,0x2, 0x1b,0xf0,0x4c,0xff,0x78,0x4e,0x5, +0x18,0x7e,0x73,0xf, 0x27,0xbe,0x71,0x17,0x28,0x43,0xe5,0x18,0xbe,0xb0,0x32,0x40, +0x3c,0x5, 0x17,0x80,0x35,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x59,0x35,0x13,0x74,0x49,0x34,0xe, 0x9b,0x59,0x35,0x13,0x76, +0x7e,0x73,0xf, 0x26,0xbe,0x71,0x17,0x78,0x8, 0x7e,0xb3,0xf, 0x27,0xf5,0x17,0x80, +0x9, 0xe5,0x17,0xbe,0xb0,0x1, 0x28,0x2, 0x15,0x17,0x75,0x18,0x0, 0xb, 0xe0,0xbe, +0xe0,0xa, 0x68,0x3, 0x2, 0x37,0x56,0xda,0x3b,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3, +0x10,0x2b,0xf5,0x24,0x7e,0xe3,0x10,0x2c,0x1b,0xe0,0x6c,0xdd,0x7e,0x70,0x30,0xac, +0x7d,0x2e,0x37,0xf, 0xda,0x49,0x33,0x0, 0x2e,0x74,0x2, 0xac,0xbd,0x59,0x35,0x13, +0xb6,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0x7e,0xb3,0xf, 0xd3,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x39,0xc1,0x6c,0xcc,0x2, 0x39,0xb2,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3, +0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19,0xf5,0x23,0x75,0x21,0x3, 0x7e,0x73,0xe, +0x12,0xbe,0x70,0x20,0x50,0xa, 0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x3, 0x75,0x21,0x1, +0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, 0x75,0x21,0x2, 0x74,0x8, 0x7a,0xb3,0xf, 0x53, +0xe5,0x22,0xbe,0xb0,0x0, 0x28,0x21,0xe5,0x24,0xa, 0x2b,0x1b,0x24,0xe5,0x22,0xa, +0x3b,0xbd,0x32,0x58,0x13,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x23,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x21,0x2, 0x75,0x25,0x0, 0x80,0x45, +0xe5,0x25,0xbc,0xbc,0x68,0x3d,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xd, +0x18,0x7a,0xa1,0x26,0x9, 0xb3,0xd, 0x19,0xf5,0x27,0xa, 0x2a,0xe5,0x22,0xa, 0x3b, +0x9d,0x32,0x12,0x6d,0xde,0xbe,0x34,0x0, 0x3, 0x18,0x18,0xe5,0x27,0xa, 0x2b,0xe5, +0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xde,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x21, +0x1, 0x80,0xb, 0x5, 0x25,0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x25,0x38,0xb2,0xe5,0x51, +0xb4,0x1, 0x20,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x19,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, +0x12,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x9, 0x75,0x21,0x3, 0x74,0x1e,0x7a, +0xb3,0xf, 0x53,0xe5,0x23,0xbe,0xb0,0x17,0x50,0x1a,0x6c,0xdd,0x6d,0x33,0x7e,0x50, +0x30,0xac,0x5d,0x2e,0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, +0x78,0xec,0x80,0x3, 0x75,0x21,0x0, 0xe5,0x21,0x7c,0x7c,0x7c,0x6f,0x12,0x11,0xa0, +0x6c,0xdd,0x74,0x2, 0xac,0xbd,0x49,0x35,0x13,0xb6,0x7e,0x50,0x30,0xac,0x5d,0x2e, +0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0xb, 0xf0, +0xb, 0xc0,0x7e,0x73,0xd, 0xf7,0xbc,0x7c,0x28,0x3, 0x2, 0x38,0x89,0x7a,0xf3,0xd, +0xf7,0xda,0x3b,0x22,0xca,0x3b,0x7d,0x73,0x7e,0xb3,0xd, 0xf7,0xf5,0x4c,0x7e,0x37, +0xf, 0xda,0x7a,0x35,0x4f,0x75,0x42,0x0, 0x7e,0xc0,0x1, 0x80,0x19,0xe5,0x42,0xa, +0x3b,0x2d,0x37,0x7e,0x39,0x60,0xa, 0x2c,0x2d,0x27,0x7e,0x29,0x70,0xbc,0x76,0x40, +0x3, 0x7a,0xc1,0x42,0xb, 0xc0,0xe5,0x4c,0xbc,0xbc,0x38,0xe1,0xe5,0x42,0xa, 0x3b, +0x2d,0x37,0x7e,0x39,0xb0,0xf5,0x42,0x75,0x44,0x0, 0x7e,0xc0,0x1, 0x2, 0x3b,0xe, +0x75,0x4b,0x0, 0x6d,0x33,0x7a,0x35,0x4d,0x6c,0xdd,0x75,0x45,0x0, 0x75,0x46,0x0, +0x75,0x43,0x0, 0x2, 0x3a,0xc3,0x7e,0x71,0x43,0x74,0x2, 0xac,0x7b,0x9, 0xb3,0xd, +0x18,0xf5,0x47,0x9, 0xb3,0xd, 0x19,0xf5,0x48,0xe5,0x43,0xa, 0x3b,0x2d,0x37,0x7e, +0x39,0x70,0xbc,0x7c,0x78,0x7b,0xb, 0xd0,0xe5,0x47,0x25,0x45,0xf5,0x45,0xe5,0x48, +0x25,0x46,0xf5,0x46,0x7e,0x51,0x47,0xac,0x5d,0xe5,0x45,0xa, 0x3b,0x9d,0x32,0x12, +0x6d,0xde,0x7c,0xb7,0xf5,0x49,0x7e,0x51,0x48,0xac,0x5d,0xe5,0x46,0xa, 0x3b,0x9d, +0x32,0x12,0x6d,0xde,0x7c,0xb7,0xf5,0x4a,0x7e,0x51,0x4b,0xac,0x5d,0xe5,0x49,0xa, +0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2,0x7c,0xb7,0xf5,0x4b,0x7e,0x51, +0x4b,0xac,0x5d,0xe5,0x4a,0xa, 0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2, +0x7c,0xb7,0xf5,0x4b,0x7e,0x71,0x47,0x74,0x18,0xac,0x7b,0xe5,0x48,0xa, 0x2b,0x2d, +0x32,0x3e,0x34,0x2e,0x35,0x4f,0xb, 0x38,0x30,0xbe,0x35,0x4d,0x8, 0x3, 0x7a,0x35, +0x4d,0x5, 0x43,0xe5,0x4c,0xbe,0xb1,0x43,0x28,0x3, 0x2, 0x3a,0x26,0xbe,0xd0,0x0, +0x28,0x3a,0xe5,0x45,0x8c,0xbd,0xf5,0x45,0xe5,0x46,0x8c,0xbd,0xf5,0x46,0x7e,0xa1, +0x45,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x19,0xa3,0x15,0x2b,0xe5,0x46,0x19,0xb3, +0x15,0x2c,0x7e,0x25,0x4d,0x7e,0x71,0x45,0x74,0x18,0xac,0x7b,0xe5,0x46,0xa, 0x1b, +0x2d,0x31,0x3e,0x34,0x2e,0x35,0x4f,0x1b,0x38,0x20,0x5, 0x44,0xb, 0xc0,0xe5,0x42, +0xbc,0xbc,0x40,0x3, 0x2, 0x3a,0x10,0xe5,0x44,0xda,0x3b,0x22,0x74,0xd, 0x7a,0xb3, +0x10,0x2b,0x74,0x18,0x7a,0xb3,0x10,0x2c,0x74,0x4, 0x7a,0xb3,0x10,0x2d,0xe4,0x7a, +0xb3,0x10,0x2e,0x7e,0x34,0x11,0x9b,0x7a,0x37,0x10,0x2f,0x7e,0x34,0x11,0x97,0x7a, +0x37,0x10,0x31,0x7e,0x34,0xf, 0xc5,0x7a,0x37,0x10,0x33,0x7e,0x34,0xf, 0xad,0x7a, +0x37,0x10,0x35,0x74,0x15,0x7a,0xb3,0x10,0x37,0x74,0x17,0x7a,0xb3,0x10,0x38,0x74, +0x4, 0x7a,0xb3,0x10,0x3a,0xe4,0x7a,0xb3,0x10,0x3b,0x7a,0xb3,0x10,0x3c,0x7a,0xb3, +0x10,0x3d,0x74,0x2, 0x7a,0xb3,0x10,0x3e,0x74,0x45,0x7a,0xb3,0x10,0x3f,0x74,0x71, +0x7a,0xb3,0x10,0x40,0x74,0x3, 0x7a,0xb3,0x10,0x41,0x7e,0x34,0x1f,0xff,0x7a,0x37, +0x10,0x42,0x6d,0x33,0x7a,0x37,0x10,0x44,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10,0x46, +0x7e,0x34,0xf, 0xdc,0x7a,0x37,0x10,0x48,0x74,0x23,0x7a,0xb3,0x10,0x4a,0x74,0xa, +0x7a,0xb3,0x10,0x4b,0xe4,0x7a,0xb3,0x10,0x4c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10, +0x4e,0x74,0x2, 0x7a,0xb3,0x10,0x4f,0x7e,0x34,0x0, 0xf4,0x7a,0x37,0x10,0x52,0x7e, +0x34,0x3f,0xe0,0x7a,0x37,0x10,0x50,0x7e,0x34,0x29,0x28,0x7a,0x37,0x10,0x54,0x7e, +0x34,0x10,0x91,0x7a,0x37,0x10,0x62,0x7e,0x34,0x0, 0x3d,0x7a,0x37,0x10,0x64,0x7e, +0x34,0x0, 0x22,0x7a,0x37,0x10,0x66,0x7e,0x34,0x4c,0x0, 0x7a,0x37,0x10,0x56,0x7e, +0x34,0x3, 0xcf,0x7a,0x37,0x10,0x58,0x7e,0x34,0x7, 0x9a,0x7a,0x37,0x10,0x5a,0x7e, +0x34,0x5, 0x84,0x7a,0x37,0x10,0x5c,0x7e,0x34,0x0, 0x9, 0x7a,0x37,0x10,0x5e,0x7e, +0x34,0x0, 0xf, 0x7a,0x37,0x10,0x60,0x7e,0x34,0x0, 0x5d,0x7a,0x37,0x10,0x68,0xe4, +0x7a,0xb3,0x10,0x6a,0x74,0x7, 0x7a,0xb3,0x10,0x6b,0x7e,0x34,0x10,0xff,0x7a,0x37, +0x10,0x6c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x10,0x6e,0x7e,0x34,0xf, 0x2e,0x7a,0x37, +0x10,0x70,0x12,0x42,0x8d,0x7e,0x34,0x11,0xe9,0x7a,0x37,0x10,0x72,0x7e,0x34,0xf, +0x88,0x7a,0x37,0x10,0x74,0x7e,0x34,0x11,0x17,0x7a,0x37,0x10,0x76,0x2, 0x6c,0x66, +0xca,0x69,0xca,0xf8,0x7d,0xb1,0x7d,0xf2,0x7d,0xe3,0x9f,0x0, 0x7f,0x60,0x7f,0x40, +0x6d,0x66,0x7a,0x67,0x13,0xb6,0x7f,0x10,0x7d,0xa6,0x75,0x21,0x0, 0x6c,0xaa,0x80, +0x4b,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0xa1,0x2d,0xae,0xb, 0xa8,0xa0,0x7c,0xba,0x20, +0xe0,0x1e,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a, +0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x60,0x5, 0x21,0x80,0x1a, +0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a,0x8, 0x2, +0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x40,0xb, 0xa0,0x7e,0xf3,0x10,0x2c, +0xbc,0xfa,0x38,0xad,0xe5,0x21,0xa, 0x1b,0x6d,0x0, 0x7f,0x16,0x12,0x48,0x91,0x7a, +0x37,0x13,0xb6,0xe5,0x21,0xa, 0x3b,0x6d,0x22,0xa, 0x1f,0x6d,0x0, 0x9f,0x1, 0x7f, +0x14,0x12,0x48,0x91,0x6c,0xaa,0x80,0x2f,0x7c,0xba,0x7e,0x30,0x2, 0x7c,0x9a,0x20, +0xe0,0xf, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x9e,0x7, 0x13,0xb6,0x80, +0xd, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x7d,0x13,0x9d,0x1, 0x7d,0x14, +0x2d,0x1f,0x1b,0x18,0x0, 0xb, 0xa0,0x7e,0xb3,0x10,0x2c,0xbc,0xba,0x38,0xc9,0x9f, +0x66,0x7a,0x67,0x13,0xb6,0x6c,0xaa,0x80,0x29,0x7e,0x70,0x2, 0xac,0x7a,0x7d,0xa3, +0x2d,0xae,0x49,0xaa,0x0, 0x30,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x33, +0x9d,0x3b,0xbd,0x3a,0x8, 0x2, 0x7d,0xa3,0x7d,0x3a,0x1a,0x26,0x1a,0x24,0x2f,0x61, +0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xcf,0xa, 0x16,0x6d,0x0, 0x7f,0x16, +0x12,0x48,0x91,0x7a,0x37,0x13,0xb6,0x6c,0xaa,0x80,0x1d,0x7e,0x70,0x2, 0x7c,0x5a, +0xac,0x57,0x7d,0x32,0x2d,0x3e,0x49,0x43,0x0, 0x30,0x9e,0x47,0x13,0xb6,0x7d,0x32, +0x2d,0x3f,0x59,0x43,0x0, 0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xdb, +0xda,0xf8,0xda,0x69,0x22,0x7e,0x50,0x1, 0xe4,0x7a,0xb3,0xe, 0xb, 0x74,0x1, 0x7a, +0xb3,0xe, 0xc, 0x7e,0xa3,0xd, 0xf7,0x4c,0xaa,0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x16, +0xba,0xe4,0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, +0x7e,0x43,0xd, 0xfc,0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43, +0xd, 0x17,0xbe,0x40,0x0, 0x28,0x6b,0x7e,0xb3,0x16,0xb4,0x70,0x65,0x7e,0xb3,0x16, +0xb6,0x70,0x5f,0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x6d,0x33,0x6c,0x44,0x7e,0x30,0x2, +0xac,0x34,0x2e,0x17,0xf, 0xd6,0xb, 0x18,0x10,0xbd,0x13,0x58,0x2, 0x7d,0x31,0xb, +0x40,0xa5,0xbc,0x25,0xe8,0xbe,0x34,0xf8,0xf8,0x58,0x5, 0x7e,0x50,0x5, 0x80,0x1f, +0xbe,0x34,0xfb,0x50,0x58,0x5, 0x7e,0x50,0x4, 0x80,0x14,0xbe,0x34,0xfc,0xe0,0x58, +0x5, 0x7e,0x50,0x3, 0x80,0x9, 0xbe,0x34,0xfe,0xd4,0x58,0x3, 0x7e,0x50,0x2, 0xbe, +0x34,0xfc,0x18,0x58,0x3c,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d, +0x80,0x2f,0x7e,0x43,0xd, 0x16,0xa5,0xbc,0x0, 0x1d,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0xb3,0x16,0xb4,0x70,0x12,0x7e,0xb3,0x16,0xb6,0x70,0xc, 0xbe,0x50,0x3, 0x50,0x3, +0x7e,0x50,0x3, 0x74,0x1, 0x80,0x6, 0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, +0xc, 0x7e,0x43,0x16,0xba,0xbc,0x45,0x50,0x4, 0x7a,0x53,0x16,0xba,0xbe,0x50,0x2, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x1b,0x7e,0xb3,0xd, +0x16,0x70,0x15,0x7e,0xb3,0x16,0xb4,0x70,0xf, 0x7e,0xb3,0x16,0xb6,0x70,0x9, 0xe4, +0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xb3,0x16,0xb6,0xb4,0x1, 0x18,0xe4, +0x7a,0xb3,0x16,0xb6,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x7a, +0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xa3,0x16,0xba,0x74,0x2, 0xa4,0x7a,0x57, +0xe, 0x5, 0x7a,0x57,0xe, 0x7, 0x22,0xca,0x79,0x7c,0xfb,0xe5,0x55,0xbe,0xb0,0x1, +0x68,0xf9,0xe5,0x55,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x3f,0xe7,0xa9,0xd7,0xea,0x7e, +0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x82,0x12,0x0, +0x6e,0x50,0x27,0xa9,0xc7,0xea,0x7e,0xe3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x4d,0x7e, +0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x67,0x82,0x7a,0xe3,0x10,0x4d, +0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x3, 0x12,0x6a,0xdf,0x74,0x1, 0x7a,0xb3,0xf, 0xd3, +0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0xa, 0x18,0x12,0x66,0x67,0x7e, +0x37,0xf, 0xd6,0x7e,0x27,0xf, 0xd4,0x7e,0x14,0xa, 0x62,0x12,0x66,0x67,0x6c,0xaa, +0x80,0x36,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0xa, 0x92,0xbe,0x34,0x13,0x88,0x40, +0xc, 0xbe,0x34,0x75,0x30,0x28,0x1a,0xbe,0x34,0x7e,0xf4,0x50,0x14,0x7e,0xb3,0x16, +0xb7,0x4, 0x7a,0xb3,0x16,0xb7,0xb4,0xa, 0xd, 0x74,0x1, 0x7a,0xb3,0x16,0xb6,0x80, +0xf, 0xe4,0x7a,0xb3,0x16,0xb7,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xc2, +0x7e,0xa3,0x16,0xb6,0xbe,0xa0,0x1, 0x78,0x7, 0x7e,0xb3,0x16,0xb5,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x16,0xb5,0xbe,0xb0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb4, +0x4c,0xaa,0x78,0xd, 0xe4,0x7a,0xb3,0x16,0xb5,0x7a,0xb3,0x16,0xb4,0x7a,0xb3,0x16, +0xb7,0x74,0x1, 0x7a,0xb3,0xf, 0xd2,0x12,0x66,0xa1,0x12,0x6b,0x8a,0x7e,0xb3,0x11, +0xc, 0xb4,0x1, 0x31,0xbe,0xf0,0x1, 0x78,0x2c,0x7e,0xb3,0xd, 0xfc,0x70,0x26,0x12, +0x46,0xe9,0x7e,0xb3,0xd, 0xf7,0x70,0x19,0x7e,0x73,0x11,0x95,0xa, 0x37,0x9, 0x73, +0xf, 0x29,0x7a,0x73,0x10,0x4a,0xe4,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0x11,0xc, 0x80, +0x6, 0x6c,0xff,0x80,0x2, 0x6c,0xff,0x12,0x65,0xf2,0x12,0x6b,0xec,0x7c,0xbf,0xda, +0x79,0x22,0xca,0x3b,0x75,0x21,0x0, 0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4, +0x12,0x6d,0xee,0xe4,0x7a,0xb3,0xd, 0x16,0x7a,0xb3,0xd, 0x17,0x7e,0xb3,0xf, 0xd2, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x41,0x68,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, +0x74,0xff,0x12,0x6d,0xee,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12, +0x6d,0xee,0x7e,0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4c,0x7e,0x14, +0x13,0xb6,0x6c,0x11,0x12,0x4f,0xf, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, +0x30,0x7e,0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4a,0x7e,0x14,0x13,0xc0,0x12,0x4f,0xf, +0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x51,0x6c,0xcc,0x80,0x47,0x7c,0xbf,0xc4,0x23, +0x54,0x1f,0x7c,0x6b,0x7a,0x61,0x21,0xa, 0x2a,0x9, 0x72,0x13,0xc0,0x7e,0x50,0x2, +0xac,0x5f,0x19,0x72,0xa, 0xb1,0xa, 0x1c,0x9, 0x71,0x13,0xb6,0x19,0x72,0xa, 0xb2, +0x7c,0xbf,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x79,0xa, 0x46,0x2e,0x44,0xb, 0x79,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, +0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xb5,0xb, 0xa0,0xbc,0xda,0x38,0xab,0x7a,0xf3,0xd, +0x16,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xee,0x7e,0x34, +0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xee,0x7e,0x37,0xf, 0xd6,0x7e, +0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xb6,0x7e,0x10,0x1, 0x12,0x4f, +0xf, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0x10,0x2b,0x7e, +0x27,0xf, 0x4e,0x7e,0x14,0x13,0xc0,0x12,0x4f,0xf, 0x7c,0xdb,0x6c,0xff,0x6c,0xaa, +0x80,0xe, 0x6c,0xcc,0x80,0x4, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xf8,0xb, 0xa0, +0xbc,0xda,0x38,0xee,0x7a,0xf3,0xd, 0x17,0xda,0x3b,0x22,0xca,0xf8,0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x74,0x1, 0x7a,0xb3,0x10, +0x3c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10,0xa5,0x7e,0xb3,0xf, 0x26,0x12,0x6e,0xaf, +0x12,0x63,0xec,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x42,0x84,0x6d, +0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0x0, 0x64,0x7a,0x37,0xa, 0xaf,0xe4,0x7a,0xb3, +0x0, 0xff,0x12,0x6c,0x48,0x12,0x45,0xdf,0x12,0x6b,0x2, 0x6c,0xff,0x1a,0x2f,0x7e, +0x34,0x0, 0x18,0xad,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b, +0x35,0xb, 0x38,0x30,0x1a,0x2f,0x3e,0x24,0x59,0x32,0x13,0x9c,0xb, 0xf0,0xbe,0xf0, +0xd, 0x78,0xda,0x12,0x6b,0x48,0x12,0x6c,0x9e,0x12,0x69,0x5, 0x6c,0xff,0x1a,0x3f, +0x3e,0x34,0x49,0x23,0x13,0x9c,0x1a,0xf, 0x7e,0x14,0x0, 0x18,0xad,0x10,0x7d,0x31, +0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, +0xf0,0xbe,0xf0,0xd, 0x78,0xd8,0x12,0x69,0xd8,0x12,0x48,0xe6,0x7e,0xb3,0xf, 0xd3, +0x70,0x9, 0x7e,0xb3,0xf, 0xd2,0x70,0x3, 0x2, 0x41,0x93,0x12,0x1f,0x7b,0x12,0x33, +0x70,0x7a,0xb3,0xf, 0x25,0x12,0x6e,0xd, 0x12,0x6d,0x4, 0x70,0x3, 0x2, 0x41,0x93, +0x12,0x44,0xc9,0x7e,0x37,0xf, 0xda,0x12,0x8, 0x6, 0x12,0x6e,0xb5,0x12,0x4e,0x65, +0x12,0x0, 0x6e,0x50,0x3, 0x12,0x2f,0xc6,0x7e,0xb3,0x11,0x15,0xb4,0x1, 0x4, 0xe4, +0x12,0x6e,0xa0,0x12,0x68,0xd8,0x12,0x66,0xda,0x12,0x19,0x6d,0x12,0x6, 0x11,0x12, +0x6e,0xd4,0x12,0x65,0x3a,0x12,0x36,0xb7,0x12,0x55,0xf2,0x12,0x1c,0x95,0x12,0x49, +0xd0,0x2, 0x41,0x93,0x12,0x0, 0x1e,0x12,0x6e,0x29,0xda,0xf8,0x22,0xca,0x79,0x7e, +0x34,0x0, 0x60,0x12,0x69,0x86,0x7c,0xab,0x7a,0xa1,0x6a,0xbe,0xa0,0x8, 0x40,0x3, +0x2, 0x43,0xab,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0xe0,0x6, 0x80,0x3, 0x7e,0xe0,0x5, +0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x42,0xbf,0x73,0x2, +0x42,0xd7,0x2, 0x42,0xdc,0x2, 0x42,0xe1,0x2, 0x42,0xe6,0x2, 0x42,0xeb,0x2, 0x42, +0xf0,0x2, 0x42,0xf5,0x2, 0x42,0xfa,0x7e,0xf0,0x5e,0x80,0x26,0x7e,0xf0,0x5f,0x80, +0x21,0x7e,0xf0,0x61,0x80,0x1c,0x7e,0xf0,0x63,0x80,0x17,0x7e,0xf0,0x65,0x80,0x12, +0x7e,0xf0,0x67,0x80,0xd, 0x7e,0xf0,0x69,0x80,0x8, 0x7e,0xf0,0x6a,0x80,0x3, 0x7e, +0xf0,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x11,0xe9,0xa, 0xb, 0x7e,0xb3,0x10,0xff, +0xa, 0x1b,0x2d,0x1, 0x7c,0xb1,0x7c,0x1a,0x2e,0x10,0x21,0xa5,0xf7,0x7c,0x9b,0xa, +0x9, 0x5e,0x4, 0x0, 0x1, 0xbe,0x4, 0x0, 0x1, 0x78,0x1c,0x7c,0x79,0xac,0x7f,0x7e, +0x50,0x3, 0xac,0x5f,0xe, 0x24,0xe, 0x24,0x2d,0x32,0x7c,0xba,0x3e,0xb0,0x24,0x25, +0xa, 0xb, 0x1b,0x8, 0x30,0x80,0xd, 0xac,0x9f,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, +0xb, 0x1b,0x8, 0x40,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, 0xb, 0xb, 0x8, 0xf0,0x7e, +0x4, 0x0, 0xa, 0x7d,0x3f,0x8d,0x30,0x8d,0x30,0x7c,0x75,0xbe,0x70,0x0, 0x40,0x14, +0xbc,0xe7,0x28,0x10,0x7e,0xc4,0x0, 0x64,0x7d,0xdf,0x8d,0xdc,0x7d,0xd, 0x9d,0x1, +0x7c,0x61,0x80,0x17,0xbc,0xe7,0x38,0x19,0xbe,0x70,0x9, 0x38,0x14,0x7e,0xe4,0x0, +0x64,0x8d,0xfe,0x7d,0x2f,0xb, 0x24,0x9d,0x21,0x7c,0x65,0xa, 0x2a,0x19,0x62,0x11, +0xe9,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x3, 0x2, 0x43,0x4, 0xda,0x79,0x22,0xca,0x3b, +0x7c,0xeb,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x38,0x3, 0x2, 0x44,0xc0,0x7c,0xbe, +0x12,0xd, 0x46,0x7e,0xb3,0xd, 0xfc,0x60,0x1e,0x7e,0xb3,0x15,0x54,0x70,0x8, 0x7e, +0xb3,0x15,0x55,0x70,0x2, 0x80,0x10,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x28,0xc, +0xe5,0x12,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x1e,0x7e,0xf0,0x1, 0xbe, +0x73,0xf, 0x1c,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x15,0x54,0xbe, +0x73,0xf, 0x1c,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c,0xbe, +0x12,0xd, 0x46,0xe5,0x10,0x7a,0xb3,0xd, 0xf7,0x7e,0x31,0x10,0x74,0x2, 0xac,0x3b, +0x7e,0x24,0x15,0x2b,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x4a,0x75,0x12,0x64,0x75,0x13, +0x64,0x6c,0xee,0x80,0x67,0x6c,0xdd,0x80,0x59,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, +0x18,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0xa, 0x37,0x9d,0x32,0x12, +0x6d,0xde,0x7c,0xb7,0xf5,0x21,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, 0x19,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x19,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xde,0x7c, +0xc7,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0xa, 0xe5,0x12,0xbe,0xb1,0x21,0x28,0x3, 0x85, +0x21,0x12,0xbe,0xc0,0x0, 0x28,0x9, 0xe5,0x13,0xbc,0xbc,0x28,0x3, 0x7a,0xc1,0x13, +0xb, 0xd0,0x7e,0x73,0xd, 0xf7,0xbc,0x7d,0x38,0x9f,0xb, 0xe0,0x7e,0x73,0xd, 0xf7, +0xbc,0x7e,0x38,0x91,0xe5,0x12,0xb4,0x64,0x3, 0x75,0x12,0x0, 0xe5,0x13,0xb4,0x64, +0x3, 0x75,0x13,0x0, 0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x85,0x13,0x12,0x80,0x6, +0x75,0x12,0x64,0x75,0x13,0x64,0xda,0x3b,0x22,0x12,0x59,0x54,0x70,0x3, 0x2, 0x45, +0x50,0x75,0x6f,0x14,0x75,0x6e,0x1, 0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, +0x3b,0x2e,0x34,0x6e,0x98,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e, +0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19, +0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb, +0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x98,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4, +0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22, +0xe5,0x6e,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x45,0xdc,0x15,0x6f,0xe5,0x6f,0x60,0x79, +0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x98,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, +0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54, +0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x98,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c, +0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79, +0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e, +0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22,0x75,0x6e,0x0, 0xe5,0x21,0x22,0xca, +0x79,0x7e,0x74,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x20,0xe0,0x3, 0x2, 0x46,0xe6,0x54, +0xfe,0x7a,0xb3,0x10,0xfe,0x9, 0x77,0x0, 0x2, 0xbe,0x73,0xf, 0x52,0x68,0x16,0x7a, +0x73,0xf, 0x52,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x7a,0x37,0xf, 0x48,0x7e,0x79,0x70,0xbe,0x73,0xf, 0x5c,0x68,0xe, 0x7a,0x73, +0xf, 0x5c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x54,0x9, 0x77,0x0, 0x1, +0xa, 0x37,0xbe,0x37,0xf, 0x56,0x68,0x4, 0x7a,0x37,0xf, 0x56,0x7e,0x27,0xf, 0x5d, +0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x9, 0x77,0x0, 0x5, 0xa, 0x37,0xbd,0x32, +0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x5d,0x9, 0x77, +0x0, 0x8, 0xbe,0x73,0x11,0x11,0x68,0x24,0x7a,0x73,0x11,0x11,0xbe,0x70,0xf, 0x40, +0x5, 0xe4,0x19,0xb7,0x0, 0x8, 0x9, 0x77,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6d,0xfe, +0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0x11,0x10,0x9, 0x77,0x0, 0x9, +0xbe,0x73,0x11,0x13,0x68,0x8, 0x7a,0x73,0x11,0x13,0x7a,0x73,0x11,0x12,0x9, 0x77, +0x0, 0x7, 0xbe,0x73,0x11,0x14,0x68,0x4, 0x7a,0x73,0x11,0x14,0x9, 0xb7,0x0, 0xb, +0xbe,0xb1,0x51,0x68,0x5, 0xf5,0x51,0x12,0x6c,0xec,0x9, 0x77,0x0, 0x25,0xa, 0x37, +0xbe,0x37,0x11,0xd, 0x68,0x4, 0x7a,0x37,0x11,0xd, 0x9, 0x77,0x0, 0x6, 0xbe,0x73, +0x11,0xf, 0x68,0x4, 0x7a,0x73,0x11,0xf, 0x9, 0x77,0x0, 0x24,0xbe,0x73,0x11,0x15, +0x68,0x4, 0x7a,0x73,0x11,0x15,0xda,0x79,0x22,0xca,0x79,0xe4,0x6c,0xaa,0xa, 0x4a, +0x19,0xb4,0xd, 0x68,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xf3,0xe4,0x7a,0xb3,0xd, 0xf7, +0x7a,0xb3,0xd, 0xf8,0x7a,0xb3,0xd, 0xf9,0x7a,0xb3,0xd, 0xfa,0x7e,0xb3,0xf, 0xd3, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x47,0xef,0x7e,0xb3,0x10,0x2b,0xf5,0x21,0x7e,0xb3, +0x10,0x2c,0xf5,0x22,0x7e,0x37,0xf, 0x56,0x7a,0x35,0x23,0x7e,0x37,0xf, 0x58,0x7a, +0x35,0x25,0x7e,0x37,0xf, 0x5a,0x7a,0x35,0x27,0x7e,0x34,0x0, 0x14,0x7a,0x35,0x2d, +0x7e,0x37,0xf, 0xda,0x7e,0x24,0x0, 0x21,0x7e,0x14,0x0, 0x29,0x7e,0x4, 0x9, 0xc8, +0x12,0x4d,0xb6,0xe5,0x29,0x7a,0xb3,0xd, 0xf7,0xe5,0x2a,0x7a,0xb3,0xd, 0xf8,0xe5, +0x2b,0x7a,0xb3,0xd, 0xf9,0xe5,0x2c,0x7a,0xb3,0xd, 0xfa,0x6c,0xaa,0x80,0x6c,0x7e, +0x53,0xd, 0xf7,0xbc,0x5a,0x28,0x44,0x7c,0xba,0xc4,0x23,0x54,0x1f,0x7c,0x7b,0x7c, +0xba,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0x69, +0x7e,0x30,0x2, 0xac,0x3a,0x49,0x71,0x9, 0xc8,0x7d,0x7, 0xa, 0x0, 0x7c,0x41,0x19, +0x41,0xd, 0x18,0x7d,0x7, 0x7c,0x41,0x19,0x41,0xd, 0x19,0xa, 0x47,0x2e,0x44,0xd, +0x68,0x7e,0x49,0xb0,0x4c,0xb6,0x7a,0x49,0xb0,0x80,0x1e,0xa, 0x15,0xa, 0x2a,0x9d, +0x21,0x3e,0x24,0x49,0x72,0x9, 0xf0,0x7d,0x17,0xa, 0x12,0x7c,0xb3,0x19,0xb2,0xd, +0x40,0x7d,0x17,0x7c,0xb3,0x19,0xb2,0xd, 0x41,0xb, 0xa0,0x7e,0xb3,0xd, 0xf8,0xa, +0x2b,0x7e,0xb3,0xd, 0xf7,0xa, 0x1b,0x2d,0x12,0xa, 0x2a,0xbd,0x21,0x48,0x80,0xda, +0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, +0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32, +0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff, +0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12, +0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, +0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22, +0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf, +0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34, +0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40, +0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, +0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, +0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x48,0x40, +0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x48,0x40,0x30,0xd5,0x6, 0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, +0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e, +0x39,0x40,0x7a,0x19,0x40,0x22,0xca,0x79,0x6c,0xee,0x12,0x65,0x79,0x7d,0x43,0x6c, +0xaa,0x6c,0x77,0x7e,0x30,0x6, 0xac,0x37,0x2e,0x14,0x6c,0x2a,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70,0x5, +0x40,0xe1,0xbe,0xa0,0x5, 0x78,0x3, 0x2, 0x49,0xb7,0x7e,0x63,0xd, 0xf7,0xbe,0x60, +0x0, 0x38,0x3, 0x2, 0x49,0xb7,0x6c,0x77,0x2, 0x49,0xac,0x6c,0xff,0x6c,0x66,0x80, +0x41,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27,0xf, +0xda,0xb, 0x28,0x20,0x7e,0x30,0x6, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6c,0x2c,0x7e, +0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x2, 0x18,0x14,0xb, 0xf0,0x2e,0x14,0x6c,0x2e, +0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x28,0xe, 0x80,0x2, 0x6c,0xff, +0xb, 0x60,0x7e,0xb3,0x10,0x2b,0xbc,0xb6,0x38,0xb7,0x7e,0x50,0x6, 0xac,0x5a,0x7d, +0x12,0x2e,0x14,0x6c,0x2e,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x38, +0x17,0xb, 0xe0,0x2e,0x24,0x6c,0x2f,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0xbc, +0xbe,0x38,0x7, 0x75,0x14,0x40,0x80,0xf, 0x6c,0xee,0xb, 0x70,0x7e,0xb3,0x10,0x2c, +0xbc,0xb7,0x28,0x3, 0x2, 0x49,0x2b,0xe5,0x15,0x25,0x14,0xf5,0x14,0xbe,0xb0,0x0, +0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0xda,0x79,0x22, +0xca,0x3b,0x7e,0x73,0xd, 0xfb,0x7a,0x73,0xd, 0xfc,0x7e,0xa3,0xf, 0x1b,0x7a,0xa3, +0xf, 0x1c,0xe4,0x7a,0xb3,0xf, 0x1f,0x7e,0x37,0x11,0xd, 0x4d,0x33,0x78,0x3f,0xbe, +0xa0,0x0, 0x28,0x8, 0xe4,0x7a,0xb3,0x16,0xae,0x2, 0x4a,0x97,0x7e,0xb3,0x11,0xf, +0x20,0xe0,0x3, 0x2, 0x4a,0x97,0x7e,0xb3,0x11,0x14,0xbe,0xb3,0x16,0xae,0x28,0x3, +0x2, 0x4a,0x97,0xe4,0x7a,0xb3,0x16,0xae,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x11,0xd, +0x74,0x1, 0x7a,0xb3,0x10,0xa3,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x80,0x69,0xbe,0x34, +0x0, 0x1, 0x78,0x22,0xbe,0xa0,0x0, 0x28,0x5e,0x6d,0x22,0x7a,0x27,0x11,0xd, 0xe4, +0x7a,0xb3,0x10,0xa3,0x7a,0xb3,0x16,0xae,0x74,0x23,0x7a,0xb3,0x16,0xb1,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x80,0x41,0xbe,0x34,0x0, 0x3, 0x78,0x3b,0x6d,0x66,0x7a,0x67, +0x10,0x1, 0x7e,0x74,0xd, 0xac,0x7a,0x77,0xa, 0xaf,0x12,0x6e,0xda,0x12,0x60,0x30, +0x12,0x58,0x71,0x6d,0x33,0x7a,0x37,0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x7a,0x67,0x10,0x1, 0x7a,0x77,0xa, 0xaf,0x75,0x9a,0x7f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x7e,0xb3,0x16,0xb0,0x70,0x6, 0x12,0x5b,0x77, +0x12,0x64,0x32,0xda,0x3b,0x22,0x7d,0x53,0x9f,0x11,0xbe,0x54,0x0, 0x0, 0x40,0x2d, +0xbe,0x54,0x0, 0x3f,0x38,0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x25,0x7e,0x34,0x1, 0x7c, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x30,0x48,0x4, +0x7e,0x18,0x0, 0x30,0x7e,0x8, 0x0, 0x30,0x9f,0x1, 0x7f,0x10,0x22,0xbe,0x54,0x5, +0x80,0x40,0x29,0xbe,0x54,0x5, 0xaa,0x38,0x23,0x7d,0x25,0x9e,0x24,0x5, 0x7f,0x7e, +0x34,0x1, 0x7c,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, +0x30,0x48,0x4, 0x7e,0x18,0x0, 0x2f,0x2e,0x18,0x4, 0xd0,0x22,0xbe,0x54,0x5, 0xaa, +0x28,0x19,0x7d,0x25,0x9e,0x24,0x5, 0x9f,0x7e,0x34,0x1, 0x7c,0xad,0x32,0x6d,0x22, +0x7c,0x76,0x7c,0x65,0x1a,0x24,0x2e,0x18,0x5, 0x0, 0x22,0xbe,0x54,0x2, 0xdf,0x38, +0x8, 0x7e,0x34,0x2, 0xdf,0x9d,0x35,0x80,0x6, 0x7d,0x35,0x9e,0x34,0x2, 0xe0,0x6d, +0x22,0x7e,0x14,0x0, 0xe2,0x12,0x48,0x35,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x54, +0x2, 0xdf,0x38,0xa, 0x7e,0x8, 0x2, 0x7f,0x9f,0x1, 0x7f,0x10,0x80,0x4, 0x2e,0x18, +0x2, 0x80,0xbe,0x18,0x0, 0x30,0x58,0x5, 0x7e,0x18,0x0, 0x30,0x22,0xbe,0x18,0x4, +0xd0,0x8, 0x4, 0x7e,0x18,0x4, 0xd0,0x22,0x7e,0x34,0x10,0x7e,0x7e,0x24,0x0, 0x81, +0xe4,0x12,0x6d,0xee,0x74,0xc, 0x7a,0xb3,0x10,0x80,0x7a,0xb3,0x10,0x81,0x74,0x7, +0x7a,0xb3,0x10,0x82,0x74,0xf, 0x7a,0xb3,0x10,0x7e,0x74,0x3c,0x7a,0xb3,0x10,0x7f, +0x74,0xa0,0x7a,0xb3,0x10,0x83,0x74,0x1e,0x7a,0xb3,0x10,0x85,0x74,0x9, 0x7a,0xb3, +0x10,0x86,0x74,0x1e,0x7a,0xb3,0x10,0x87,0xe4,0x7a,0xb3,0x10,0x88,0x7a,0xb3,0x10, +0x89,0xf5,0x52,0xf5,0x51,0x7a,0xb3,0x10,0xa3,0x74,0x1, 0x7a,0xb3,0x10,0x84,0x7a, +0xb3,0x10,0xa2,0x7a,0xb3,0x10,0xa5,0x74,0x2f,0x7a,0xb3,0x10,0xa4,0x74,0xf1,0x7a, +0xb3,0x10,0xa6,0x74,0xb, 0x7a,0xb3,0x10,0xad,0x12,0x6e,0xc7,0xa, 0x36,0x7a,0x73, +0x10,0xa7,0x12,0x6e,0xc7,0x7a,0x73,0x10,0xa8,0x12,0x6e,0xcc,0xa, 0x36,0x7a,0x73, +0x10,0x9f,0x12,0x6e,0xcc,0x7a,0x73,0x10,0xa0,0xe4,0x7a,0xb3,0x10,0xae,0x74,0x1f, +0x7a,0xb3,0x10,0xcf,0xe4,0x7a,0xb3,0x10,0xb0,0x12,0x6e,0x1b,0x7a,0xb3,0x10,0xaf, +0x12,0x6d,0x1c,0x7a,0xb3,0x10,0xa1,0x7e,0x34,0x10,0x8e,0x7e,0x24,0x0, 0x8, 0x74, +0xff,0x12,0x6d,0xee,0x74,0x2f,0x7a,0xb3,0x10,0x8e,0x74,0x1, 0x7a,0xb3,0x10,0x8f, +0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x0, 0x40,0x2d,0xbe,0xf4,0x0, 0x3f,0x38,0x27,0x7e, +0x44,0x0, 0x3f,0x9d,0x4f,0x7e,0x54,0x1, 0x8b,0xad,0x54,0x6d,0x44,0x7c,0xba,0x7c, +0xa9,0xbe,0x28,0x0, 0x2f,0x40,0x4, 0x7e,0x28,0x0, 0x2f,0x7e,0x18,0x0, 0x2f,0x9f, +0x12,0x7f,0x21,0x2, 0x4c,0xef,0xbe,0xf4,0x3, 0x0, 0x40,0x22,0x7d,0x4f,0x9e,0x44, +0x3, 0x0, 0x7e,0x54,0x1, 0x7c,0xad,0x54,0x6d,0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28, +0x0, 0x32,0x40,0x4, 0x7e,0x28,0x0, 0x31,0x2e,0x28,0x2, 0x9e,0x80,0x51,0xbe,0xf4, +0x1, 0x9f,0x38,0x8, 0x7e,0x54,0x1, 0x9f,0x9d,0x5f,0x80,0x6, 0x7d,0x5f,0x9e,0x54, +0x1, 0xa0,0x6d,0x44,0x7e,0x14,0x0, 0xe3,0x7f,0x12,0x12,0x48,0x35,0x7f,0x21,0x7c, +0xba,0x7c,0xa9,0xa, 0x48,0xbe,0xf4,0x1, 0x9f,0x38,0xa, 0x7e,0x18,0x1, 0x67,0x9f, +0x12,0x7f,0x21,0x80,0x4, 0x2e,0x28,0x1, 0x68,0xbe,0x28,0x0, 0x2f,0x50,0x6, 0x7e, +0x28,0x0, 0x2f,0x80,0xa, 0xbe,0x28,0x2, 0x9e,0x28,0x4, 0x7e,0x28,0x2, 0x9e,0x2e, +0x28,0x0, 0x8, 0xbe,0x28,0x2, 0xd0,0x40,0x4, 0x7e,0x28,0x2, 0xcf,0x7d,0x35,0x22, +0xca,0x3b,0x6d,0x11,0x7d,0x1, 0x7d,0x21,0x7e,0xa0,0x2, 0x7e,0x70,0x2, 0x6c,0x66, +0x80,0x39,0x6c,0x99,0x80,0x2b,0x7e,0xd0,0x30,0xac,0xd6,0x7e,0xf0,0x2, 0xac,0xf9, +0x7d,0xf7,0x2d,0xf6,0x2e,0xf7,0xf, 0xda,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, 0x14,0x8, +0x4, 0xb, 0x4, 0x80,0x8, 0xbe,0xf4,0xff,0xec,0x58,0x2, 0xb, 0x24,0xb, 0x14,0x2c, +0x97,0x7e,0xb3,0x10,0x2c,0xbc,0xb9,0x38,0xcd,0x2c,0x6a,0x7e,0xb3,0x10,0x2b,0xbc, +0xb6,0x38,0xbf,0x7e,0x54,0x0, 0x3, 0xad,0x51,0x7d,0x35,0x1e,0x34,0x1e,0x34,0xbd, +0x30,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb8,0x7e,0xb3,0x16,0xb9,0xbe,0xb0,0x5, 0x50, +0x7, 0x4, 0x7a,0xb3,0x16,0xb9,0x80,0x39,0xe4,0x7a,0xb3,0x16,0xb9,0x75,0x72,0x1, +0x80,0x2f,0xbd,0x32,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb9,0x7e,0xb3,0x16,0xb8,0xbe, +0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb8,0x80,0x16,0xe4,0x7a,0xb3,0x16,0xb8, +0x75,0x72,0x2, 0x80,0xc, 0xe4,0x7a,0xb3,0x16,0xb8,0x7a,0xb3,0x16,0xb9,0x75,0x72, +0x0, 0xe5,0x72,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x56,0xf5, +0xba,0x7e,0x55,0x2d,0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1, +0x9, 0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54,0xe0,0x4c, +0xba,0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c,0xb7,0xf5, +0xc6,0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, 0x4, 0x6e, +0x34,0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x4, +0x1a,0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, 0x6, 0x7c, +0xb1,0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, 0x4e,0x37, +0x43,0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5, +0xa, 0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1,0x0, 0x3, +0x75,0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19,0xb1,0x0, +0x1, 0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0xf, 0xd2,0x60,0x6, 0x7e, +0xb3,0xf, 0xd3,0x70,0x18,0x7e,0x34,0xd, 0x68,0x7e,0x24,0x0, 0x3, 0xe4,0x12,0x6d, +0xee,0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4,0x12,0x6d,0xee,0x6c,0xee,0x80, +0x6b,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0x7a,0x71,0x21,0x9, 0x65,0xd, 0x19, +0x7a,0x61,0x22,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xdb,0x7c,0xbe,0x54,0x7, 0x7e, +0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xc5,0x7e,0x50,0x30,0xac, +0x57,0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0xbe, +0x37,0xf, 0x54,0x48,0x25,0xa, 0x3d,0x9, 0xb3,0xd, 0x68,0x5c,0xbc,0x68,0x1b,0x7e, +0x50,0x7, 0xac,0x5e,0x2e,0x24,0xd, 0x6b,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xe, +0xd, 0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x4a,0xb, 0xf0,0xb, 0xe0,0x7e,0x73,0xd, 0xf7, +0xbc,0x7e,0x38,0x8d,0x7a,0x73,0xd, 0xfb,0x7a,0xf3,0xf, 0x1b,0xda,0x3b,0x22,0xca, +0xf8,0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x2, 0x4f,0xaa,0x7e,0x90, +0x2, 0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, 0x6e,0x44, +0xff,0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0xa, 0x50,0x6b,0x4c,0xff,0x78, +0x14,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd, +0xe4,0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd,0x1b,0xf5, +0xb, 0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd,0xf4,0x18, +0x37,0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd,0x1b,0xc5, +0xb, 0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff,0xff,0xb, +0xf4,0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18,0x9, 0xa, +0xda,0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x3, 0x2, 0x4f, +0x1e,0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x33,0x7d,0x73,0x75,0x25,0x0, 0x7e, +0x64,0x5, 0xe0,0x75,0x23,0x0, 0x80,0x3c,0x75,0x24,0x0, 0x7e,0x51,0x23,0x74,0x18, +0xac,0x5b,0x3e,0x24,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2d,0x36,0x7a, +0x35,0x21,0x49,0x23,0x0, 0x30,0xb, 0x38,0x30,0x9d,0x32,0x12,0x6d,0xde,0xe5,0x24, +0xb4,0x17,0x2, 0x1e,0x34,0xbd,0x37,0x28,0x2, 0x7d,0x73,0x5, 0x24,0xe5,0x24,0xb4, +0x18,0xc9,0x5, 0x23,0xe5,0x25,0xa, 0x2b,0x7e,0x33,0x10,0x7c,0xa, 0x13,0x9d,0x12, +0x1b,0x14,0xe5,0x23,0xa, 0x2b,0xbd,0x21,0x48,0xae,0xbe,0x74,0x0, 0x41,0x28,0x11, +0x7e,0x34,0x0, 0x73,0x7e,0xa3,0x16,0x54,0x74,0x12,0xa4,0x59,0x35,0x16,0x65,0x80, +0x26,0x7e,0x43,0x16,0x54,0x7e,0x50,0x12,0xac,0x45,0x49,0x32,0x16,0x65,0xbd,0x37, +0x50,0x6, 0x59,0x72,0x16,0x65,0x80,0xf, 0xbe,0x34,0x0, 0x0, 0x28,0x9, 0x2e,0x24, +0x16,0x65,0x1b,0x34,0x1b,0x28,0x30,0xda,0x3b,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b, +0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x0, +0x46,0x7e,0x35,0x1e,0xb, 0x34,0x7a,0x35,0x1e,0x7e,0xb3,0x0, 0xff,0x4, 0x7a,0xb3, +0x0, 0xff,0x7e,0x35,0x1e,0xbe,0x34,0x3, 0xe8,0x40,0x13,0x6d,0x33,0x7a,0x35,0x1e, +0x7e,0xb3,0x16,0xae,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x16,0xae,0x7e,0x73, +0x16,0xb2,0xbe,0x73,0x16,0xb1,0x28,0xb, 0x7e,0xb3,0x16,0xb1,0x4, 0x7a,0xb3,0x16, +0xb1,0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb0,0x7e,0xb3,0x16,0xb3,0x60,0x5, 0x14, +0x7a,0xb3,0x16,0xb3,0x7e,0x37,0x10,0x1, 0xb, 0x34,0x7a,0x37,0x10,0x1, 0x7e,0x37, +0xa, 0xaf,0xbe,0x37,0x10,0x1, 0x28,0x3, 0x12,0x6e,0xdd,0xd0,0x82,0xd0,0x83,0xd0, +0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32, +0x75,0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e, +0xf8,0x16,0xbc,0x75,0x6a,0x0, 0x75,0x8, 0x1, 0x75,0x9, 0x0, 0x75,0xa, 0x0, 0x75, +0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0xc2,0x0, 0x75,0x11,0x0, +0x75,0x12,0x64,0x75,0x13,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x16,0x0, 0x75, +0x19,0x1, 0x75,0x1e,0x0, 0x75,0x1f,0x0, 0x75,0x72,0x0, 0x75,0x6e,0x0, 0x75,0x73, +0x0, 0x75,0x74,0x1, 0x75,0x70,0x18,0x75,0x71,0x0, 0x75,0x75,0x0, 0x75,0x76,0x0, +0x75,0x6b,0x0, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x6e, +0xe4,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44, +0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2, +0x80,0xdf,0x2, 0x5b,0xdc,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, 0x78,0xc, +0x7e,0x34,0x10,0x2b,0x12,0x6b,0x25,0xa9,0xc7,0xea,0x80,0x27,0xbe,0xd0,0x5, 0x78, +0x1f,0xa9,0xd7,0xea,0x7e,0xe3,0x10,0x4a,0x7e,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10, +0x4d,0x12,0x66,0x2d,0x7a,0xb3,0x10,0x4a,0x74,0x1, 0x7a,0xb3,0x10,0x78,0x80,0x3, +0xe4,0x80,0x4e,0x7e,0xb3,0x11,0x96,0x7e,0x34,0x10,0x2b,0xb4,0x1, 0xa, 0x12,0x31, +0xbc,0xe4,0x7a,0xb3,0x11,0x96,0x80,0xa, 0x12,0x60,0xdc,0x7e,0x34,0x10,0x2b,0x12, +0x5d,0xcb,0x7e,0x34,0x10,0x2b,0x12,0x6a,0x72,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, +0x7e,0x73,0x11,0xe8,0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x69,0x31,0xbe,0xd0,0x5, +0x78,0xd, 0x7a,0xe3,0x10,0x4a,0x7a,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x78,0x74, +0x1, 0xda,0x79,0xda,0xd8,0x22,0x7e,0x34,0xe, 0xd, 0x7e,0x24,0x0, 0x46,0x74,0xff, +0x12,0x6d,0xee,0x7e,0x34,0xe, 0x53,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xee, +0x7e,0x34,0xe, 0x99,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xee,0x6c,0xaa,0x74, +0x3, 0xa, 0x4a,0x19,0xb4,0xe, 0xdf,0x19,0xb4,0xe, 0xe9,0x7e,0x44,0xff,0xff,0x7e, +0x70,0x2, 0xac,0x7a,0x59,0x43,0xe, 0xf3,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0xf, +0x7, 0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd7,0xe4,0x7a,0xb3,0xf, 0x1b,0x7a,0xb3,0xf, +0x1c,0x7a,0xb3,0xf, 0x1d,0x7a,0xb3,0xf, 0x1f,0x7a,0xb3,0xf, 0x20,0x7a,0xb3,0xf, +0x21,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, +0x25,0x12,0x6a,0xbb,0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a,0xb3,0xf, 0x27, +0xe4,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7c,0xab,0x6c,0x33,0x7c,0x27,0x80,0x73, +0x7e,0x90,0x7, 0xac,0x93,0x9, 0xf4,0xe, 0x57,0x7e,0x10,0x7, 0xac,0x12,0x9, 0xb0, +0xe, 0x11,0xbc,0xfb,0x78,0x5b,0xbe,0xf0,0xff,0x68,0x56,0x7e,0x10,0x7, 0xac,0x1a, +0x7d,0xf0,0x2d,0xf2,0x19,0xff,0x0, 0x4, 0x49,0x44,0xe, 0x53,0x2d,0x2, 0x1b,0x8, +0x40,0x7e,0x10,0x7, 0xac,0x13,0x49,0x0, 0xe, 0x55,0x7e,0x90,0x7, 0xac,0x9a,0x2d, +0x42,0x59,0x4, 0x0, 0x2, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x12,0x7e,0x90, +0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x5, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10, +0xe, 0x13,0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x6, 0xb, 0xa0,0x80, +0x6, 0xb, 0x20,0xbc,0x62,0x38,0x89,0xb, 0x30,0xbe,0x30,0xa, 0x50,0x3, 0x2, 0x52, +0xac,0x7c,0xba,0xda,0xf8,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x3b,0xbe,0xa0,0x3e, +0x38,0x36,0xbe,0xa0,0x4, 0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x0, 0x8b,0xbe,0xa0,0x1, +0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x0, 0x6, 0x7e, +0x34,0x15,0xca,0x80,0x4, 0x7e,0x34,0x16,0xc, 0x7a,0x37,0x16,0x51,0xa, 0x3a,0x2e, +0x37,0x16,0x51,0x9, 0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0xb, 0x22,0xbe, +0xa0,0x80,0x40,0xc, 0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0xf, 0xfe,0x22, +0xbe,0xa0,0xfc,0x78,0x5, 0x7e,0xb3,0x10,0xa5,0x22,0xbe,0xa0,0xfd,0x78,0x8, 0x7e, +0x37,0x10,0x46,0x7e,0x39,0xb0,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3,0x10,0x4a, +0x22,0xbe,0xa0,0xf9,0x78,0x5, 0x7e,0xb3,0x16,0xbc,0x22,0xbe,0xa0,0xfa,0x78,0x3, +0xe5,0x6a,0x22,0xe4,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x4d,0xf5, +0x24,0xe4,0x7a,0xb3,0x10,0x4d,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10, +0x2b,0x12,0x6a,0x72,0x75,0x21,0x0, 0x12,0x69,0x31,0x12,0x6e,0x86,0x60,0xfb,0xa9, +0xb7,0xea,0x7d,0x36,0x7d,0x27,0x7e,0x14,0x18,0x0, 0x12,0x67,0x82,0x75,0x22,0x0, +0x80,0x36,0x75,0x23,0x0, 0x80,0x26,0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23, +0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, +0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x23,0x7e,0x73,0x10, +0x2c,0xbe,0x71,0x23,0x38,0xd1,0x5, 0x22,0x7e,0x73,0x10,0x2b,0xbe,0x71,0x22,0x38, +0xc1,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x4, 0x40,0x9d,0xe5,0x24,0x7a,0xb3,0x10,0x4d, +0xda,0x3b,0x22,0xca,0xf8,0x30,0x90,0x58,0xc2,0x90,0x5, 0xa, 0xe5,0xa, 0xb4,0x1, +0x6, 0xe5,0x91,0xf5,0xf, 0x80,0x29,0xe5,0xb, 0xc4,0x7c,0xfb,0x5e,0xf0,0x7, 0x78, +0xe, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x56,0x7b,0x80,0x11,0xbe, +0xf0,0x4, 0x78,0xc, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x15,0xe2, +0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53, +0x36,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e,0xf5,0x91, +0x30,0x91,0x28,0xc2,0x91,0x5, 0x9, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5, +0xbd,0x0, 0xb, 0xe5,0x9, 0x25,0xf, 0x12,0x53,0x36,0xf5,0x91,0x80,0xd, 0xa5,0xbd, +0x4, 0x9, 0xe5,0x9, 0x25,0xf, 0x12,0x27,0x2e,0xf5,0x91,0xda,0xf8,0x22,0x6c,0x33, +0xbe,0x30,0x18,0x50,0x1e,0xa, 0x3, 0x2e,0x7, 0x10,0x35,0x7e,0x9, 0xa0,0x7c,0xba, +0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x16,0x1e, +0xa0,0x80,0x12,0xa, 0x3, 0x2e,0x7, 0x10,0x33,0x9, 0x20,0xff,0xe8,0xa, 0x52,0x2e, +0x54,0x0, 0x18,0x7c,0xab,0x7e,0x23,0x10,0x3a,0xbe,0x20,0x3, 0x28,0xe, 0x7e,0x10, +0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x21,0xa, 0x42,0x2e,0x44, +0x0, 0xc, 0x7e,0x4, 0x0, 0xf, 0x9d,0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac,0x1a,0x2d, +0x2, 0xb, 0x8, 0x0, 0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e,0x44,0x7f, +0xff,0x9d,0x40,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xbe, +0x30,0x25,0x50,0x3, 0x2, 0x54,0xe0,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d, +0x32,0x2e,0x37,0xf, 0xd6,0xb, 0x38,0x10,0xbe,0x17,0xe, 0x7, 0x8, 0x12,0x7d,0x2, +0x2e,0x7, 0xf, 0xd4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30,0x80,0x18, +0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x27,0xf, 0xd4,0xb, 0x28, +0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xbb,0x6c, +0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xe, 0x7, 0x8, 0x12, +0x7d,0x2, 0x2e,0x4, 0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30, +0x80,0x18,0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x24,0x8, 0xe4, +0xb, 0x28,0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40, +0xc0,0x22,0xca,0x69,0xca,0xf8,0x6c,0x11,0x7e,0xd0,0x7, 0xac,0xd1,0x9, 0x6, 0xe, +0x9d,0x5e,0x0, 0xf, 0x49,0xf6,0xe, 0x9b,0xbe,0xf4,0x5, 0xa, 0x40,0x3c,0x49,0x46, +0xe, 0x99,0x7d,0x34,0x12,0x6b,0xab,0x7c,0xfb,0xbe,0xf0,0x3, 0x40,0xe, 0x7e,0x14, +0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x3e,0x74,0x2, 0xac,0xbf, +0x49,0x45,0x0, 0xf8,0x74,0x7, 0xac,0xb1,0x59,0x45,0xe, 0x99,0x7e,0x14,0x7, 0xd0, +0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x25,0xbe,0xf4,0x5, 0x0, 0x40,0x1f, +0x7e,0x14,0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x74,0x7, 0xac,0xb1, +0x49,0x15,0xe, 0x9b,0xbe,0x14,0x5, 0xa, 0x40,0x5, 0x7c,0xb0,0x12,0x68,0x4b,0xb, +0x10,0xbe,0x10,0xa, 0x40,0x82,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x70,0x41,0x7e, +0x74,0x0, 0xb, 0x7a,0x79,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c,0x7b,0xa5, +0xbf,0x4, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80, +0x13,0x74,0x27,0x7e,0x70,0x3, 0x80,0x4b,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, 0x74, +0x1, 0x7e,0x70,0x1, 0x12,0x0, 0x5e,0x80,0x45,0x74,0x27,0x7e,0x70,0x1, 0x80,0x33, +0xbe,0xb0,0xfc,0x68,0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa,0x5, 0x7e,0x60,0x5, 0x80, +0x10,0xa5,0xbf,0x55,0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5,0xbf,0x66,0x20,0x7e,0x60, +0x7, 0x74,0x27,0x7c,0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0,0xdf,0x38, +0x7, 0x24,0x80,0x12,0x6d,0xad,0x80,0x6, 0xb4,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x79, +0x22,0x6c,0x77,0x6c,0xaa,0x80,0x3c,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27, +0xf, 0xda,0x2e,0x24,0x0, 0x30,0x7d,0x12,0x1b,0x16,0xb, 0x18,0x40,0xbe,0x44,0x0, +0x3c,0x8, 0x1e,0x7e,0x14,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb, +0x5e,0x14,0x4, 0x44,0x68,0xb, 0x1b,0x25,0xb, 0x28,0x20,0xbd,0x42,0x8, 0x2, 0xb, +0x70,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xbc,0xbe,0x70,0x1, 0x40,0x30, +0x6c,0xaa,0x80,0x24,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, 0xda,0x2e, +0x24,0x0, 0x30,0x1b,0x25,0xb, 0x28,0x30,0x7e,0x30,0x2, 0xac,0x3a,0x59,0x31,0x0, +0xd2,0x6d,0x33,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xd4, +0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x63,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c, +0xab,0x7c,0xbe,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0xa, 0x2a,0x9, 0xb2,0xd, 0x68,0x5c,0xb7,0x68,0x40,0x7e,0x50,0x2, 0xac,0x5e,0x2e, +0x24,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x34,0xd, 0x18,0x7e,0x14,0x0, 0x2, +0x12,0x6d,0x4a,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbf,0x54,0x7, 0x7e, +0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x4a,0x2e,0x44,0xd, 0x68, +0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xe0,0x7e,0x63,0xd, 0xf7, +0xbc,0x6e,0x38,0x95,0x7a,0xf3,0xd, 0xf7,0xda,0x79,0x22,0x6d,0x33,0x7a,0x37,0x10, +0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xdd,0x7e,0xb3,0x10,0xa5, +0x24,0xfa,0x68,0x17,0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x0, 0xfe,0xbe, +0xb0,0x5, 0x68,0x4c,0x74,0x5, 0x7a,0xb3,0x0, 0xfe,0x22,0x7e,0xb3,0x0, 0xfe,0xb4, +0x5, 0x3e,0x74,0x6, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x33,0x75,0x9a,0x80, +0x7e,0x34,0x77,0xf8,0x12,0x69,0xaf,0x7e,0x34,0x77,0xf8,0x74,0x66,0x12,0x59,0xc5, +0x7e,0x34,0x77,0xf9,0x74,0xbb,0x12,0x59,0xc5,0x80,0x12,0x7e,0xb3,0x0, 0xfe,0xb4, +0x5, 0xe, 0x74,0x7, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x33,0x75,0xe9,0xff, +0x22,0x0, 0x0, 0x0, 0x0, 0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x16,0xac,0xb4,0x1, +0x14,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xe4,0x7a, +0xb3,0x16,0xac,0x80,0xb, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20, +0xa9,0xd0,0xca,0xc2,0xa8,0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x16,0xb3,0x7e,0xb3,0x16, +0xb3,0x70,0xfa,0x12,0x6e,0x7d,0x12,0x61,0x32,0x12,0x6b,0xcc,0x6d,0x33,0x7a,0x37, +0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xdd,0x12,0x6a,0x26, +0x12,0x6a,0x4c,0x12,0x52,0x16,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d, +0x2, 0x6e,0xc1,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9, +0x7d,0x36,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6d,0xee,0x7d,0x37,0x7e,0x24,0x0, 0x4a, +0xe4,0x12,0x6d,0xee,0x75,0x21,0x1, 0x12,0x6b,0xec,0xe5,0x55,0xbe,0xb0,0x1, 0x68, +0xf9,0x75,0x22,0x0, 0x7e,0x51,0x22,0x74,0x2, 0xac,0x5b,0x49,0x2, 0xa, 0x62,0x1e, +0x4, 0x1e,0x4, 0x7d,0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d,0x30,0x1b,0x18,0x30,0x49, +0x12,0xa, 0x18,0x1e,0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28, +0x30,0x5, 0x22,0xe5,0x22,0xb4,0x25,0xcc,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x5, 0x40, +0xb6,0xda,0x3b,0x22,0x6c,0x77,0x7e,0x63,0xd, 0xfa,0xa, 0x16,0x7e,0x63,0xd, 0xf9, +0xa, 0x26,0x2d,0x21,0xbe,0x24,0x0, 0xa0,0x28,0x3, 0x74,0x1, 0x22,0x6c,0xaa,0x80, +0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0x9a,0xbe,0x24,0x5, 0xdc,0x8, 0x9, +0xb, 0x70,0xbe,0x70,0x10,0x68,0xe, 0x80,0x2, 0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10, +0x2c,0xbc,0x6a,0x38,0xdc,0xa5,0xbf,0x10,0x2a,0x6c,0x77,0x6c,0xaa,0x80,0x1c,0x7e, +0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0xca,0xbe,0x24,0x9, 0xc4,0x8, 0x9, 0xb, 0x70, +0xa5,0xbf,0x8, 0x5, 0x74,0x1, 0x22,0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc, +0x6a,0x38,0xdc,0xe4,0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb,0x75,0xfb, +0xa5,0x75,0xfb,0xf, 0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68,0x18,0xbe,0x34,0x73, +0xf9,0x68,0x12,0xbe,0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9, +0xa9,0xc5,0xcb,0xe4,0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c,0xb7,0x54,0xfe,0xf5, +0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75,0xf6,0xff, +0x7a,0xa1,0xf6,0x80,0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75,0xf5,0x80,0x74,0x1, +0x12,0x6d,0x33,0xa9,0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5, +0xcb,0x74,0x1, 0x22,0x74,0xa, 0x7a,0xb3,0xf, 0x46,0x74,0x14,0x7a,0xb3,0xf, 0x47, +0x7e,0x34,0x3, 0x20,0x7a,0x37,0xf, 0x48,0x7a,0x37,0xf, 0x4a,0x7e,0x24,0x1, 0xf4, +0x7a,0x27,0xf, 0x4c,0x7a,0x37,0xf, 0x4e,0x7a,0x37,0xf, 0x50,0x74,0xc, 0x7a,0xb3, +0xf, 0x52,0x74,0x8, 0x7a,0xb3,0xf, 0x53,0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, 0x54, +0x7a,0x37,0xf, 0x56,0x7a,0x37,0xf, 0x58,0x7e,0x34,0x0, 0x28,0x7a,0x37,0xf, 0x5a, +0x74,0xf, 0x7a,0xb3,0xf, 0x5c,0xe4,0x7a,0xb3,0xf, 0x5f,0x74,0x4, 0x7a,0xb3,0xf, +0x60,0x7e,0x34,0x0, 0x64,0x7a,0x37,0xf, 0x61,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0xf, +0x5d,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x3c,0xf5,0x1d,0xe4,0x7a, +0xb3,0x10,0x3c,0x7d,0x36,0x7d,0x27,0x12,0x6a,0x97,0x7e,0x34,0x10,0x2b,0x12,0x5b, +0x10,0x75,0x1b,0x0, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xb9,0x12,0x6e,0x8f,0x60,0xfb, +0x7d,0x36,0x7e,0x25,0x70,0x12,0x54,0xde,0x75,0x1c,0x0, 0x7e,0x51,0x1c,0x74,0x2, +0xac,0x5b,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, +0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x1c,0xe5,0x1c,0xb4,0x25,0xdd,0x5, 0x1b, +0xe5,0x1b,0xbe,0xb0,0x4, 0x40,0xbd,0xe5,0x1d,0x7a,0xb3,0x10,0x3c,0xda,0x3b,0x22, +0x7d,0x3, 0x75,0xcc,0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0,0xe5,0xca, +0x54,0x1, 0x4c,0xba,0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1,0xe1,0x9, +0x70,0x0, 0xe, 0x2e,0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c,0xba,0xc4, +0x33,0x54,0xe0,0x7c,0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, 0xb0,0x0, +0x13,0x54,0x3, 0xa, 0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5,0xe3,0x54, +0xe7,0x4c,0xba,0xf5,0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12,0x5d,0x9, +0x9, 0xb0,0x0, 0x14,0xf5,0xe7,0x22,0x7e,0xb3,0x16,0xac,0x70,0x17,0xe5,0xcc,0x7a, +0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xaf,0x74,0x1, +0x7a,0xb3,0x16,0xac,0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc,0xc2,0xca, +0xc2,0xc8,0xa9,0xc4,0xcb,0x80,0x2e,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0x23,0xe5,0x75, +0xb4,0x1, 0x1e,0xe5,0x76,0xb4,0x1, 0x19,0xa9,0xc3,0xcb,0x7e,0x24,0x0, 0x1, 0x7e, +0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2, +0xcd,0xe4,0x12,0x6d,0x77,0x7e,0xb3,0x16,0xb0,0x60,0xcc,0x22,0x6d,0x33,0x7a,0x37, +0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xda,0x12,0x6e,0x7d, +0x12,0x61,0x32,0x12,0x6e,0xe3,0x12,0x6d,0x89,0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x12, +0x6b,0xcc,0x12,0x6a,0x26,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x12, +0x6e,0xc1,0x7e,0xb3,0x10,0xa5,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14,0x68,0x16, +0x14,0x68,0x13,0x24,0x5, 0x78,0xeb,0x12,0x41,0x6b,0x80,0xe6,0x12,0x5e,0x7e,0x80, +0xe1,0x12,0x69,0xff,0x80,0xdc,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x12,0x57,0xfb,0x80, +0xd1,0x7c,0xa5,0x7c,0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7, +0xf5,0xba,0x7c,0xb5,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2,0x1e,0xb0, +0x1e,0xb0,0x54,0xf, 0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x1e,0x50, +0x1e,0x50,0x1e,0x50,0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50, +0xf5,0xc1,0x7c,0xb3,0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0,0x43,0xc2, +0x7, 0x80,0x7, 0x43,0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2, +0x0, 0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, 0xac,0x13, +0x2e,0x4, 0x1c,0x3a,0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c,0x33,0x80, +0x43,0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0,0xb, 0x2d, +0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, 0xb0,0x54, +0x1f,0xa, 0xfb,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c,0xb2,0x1e, +0xb0,0x7e,0x90,0x2, 0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d,0xf, 0x1b, +0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, 0x9, 0xb2, +0x0, 0xc, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54,0x7f,0xf5, +0xe5,0x75,0xe4,0x7, 0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4,0xb, 0x6c, +0xaa,0xa, 0x1a,0x49,0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5,0xb, 0xa0, +0xbe,0xa0,0x25,0x40,0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39,0xb0,0xf5, +0xe5,0x75,0xe4,0x31,0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xe5, +0x75,0xe4,0x32,0x5e,0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0xca,0x79,0x7e,0x71, +0x54,0x3e,0x70,0x3e,0x70,0x7c,0xb7,0x24,0x56,0xa, 0x2b,0xb, 0x28,0x50,0x7c,0xab, +0x7c,0xb7,0x24,0x58,0xa, 0x3b,0xb, 0x38,0x70,0x4d,0x77,0x68,0x1f,0xbe,0xa0,0x1, +0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34,0x10,0x2b, +0x12,0x6b,0x25,0x7d,0x37,0x7e,0x24,0x18,0x0, 0x12,0x54,0xde,0x5, 0x54,0xe5,0x53, +0xbe,0xb1,0x54,0x28,0x10,0x12,0x62,0x79,0xb4,0x1, 0x5, 0x75,0x55,0x1, 0x80,0x8, +0x75,0x55,0x3, 0x80,0x3, 0x75,0x55,0x2, 0xda,0x79,0x22,0x6d,0x11,0x7e,0x24,0x1c, +0x1c,0x1b,0x28,0x10,0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0xa3,0x0, +0x50,0x80,0x2, 0x7c,0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e,0x19,0x40, +0xa, 0x14,0x7e,0x4, 0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, 0x14,0x1b, +0x8, 0x10,0x49,0x13,0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10, +0x49,0x13,0x0, 0x43,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0xb, 0x50, +0xbe,0x50,0xd, 0x40,0xb1,0x22,0x75,0x9, 0x0, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50, +0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53,0x36,0xf5,0x91,0x80,0xb, 0xa5,0xbd, +0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e,0xf5,0x91,0x75,0xa, 0x0, 0xe4,0x7a,0xb3,0x16, +0x4e,0x7e,0x34,0x15,0xca,0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xee,0x7e,0x34, +0x16,0xc, 0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xee,0x74,0xaa,0x7a,0xb3,0x15, +0xca,0x7a,0xb3,0x15,0xcb,0x7a,0xb3,0x16,0xc, 0x7a,0xb3,0x16,0xd, 0x22,0xca,0xf8, +0x74,0x3, 0x7a,0xb3,0x16,0xa3,0xe4,0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x74, +0x3, 0x7a,0xb3,0x16,0xa3,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a, +0x37,0xa, 0xaf,0x7e,0xf3,0x16,0xa3,0xbe,0xf0,0x3, 0x78,0x1d,0xe5,0xb, 0x30,0xe7, +0xe4,0x12,0x6b,0x2, 0x7e,0x37,0xf, 0xd6,0x7a,0x37,0x16,0xa0,0x7e,0x37,0xf, 0xda, +0x7a,0x37,0x16,0x9e,0x53,0xb, 0x7f,0x80,0xcc,0x7a,0xf3,0x10,0xa5,0x12,0x0, 0x1e, +0x12,0x0, 0x6a,0xda,0xf8,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, +0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7c, +0xb3,0xf5,0xbd,0xa, 0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5,0xc3,0xe5, +0xc4,0x54,0xe0,0x4c,0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23,0x4e,0x24, +0x0, 0x1, 0x7c,0x15,0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2,0x0, 0x0, +0x0, 0x0, 0xa9,0x37,0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x6c,0xaa,0x6c, +0x77,0x7e,0x10,0x30,0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d,0x1, 0x2e, +0x7, 0xf, 0xda,0xb, 0x8, 0x20,0xbe,0x27,0xe, 0x5, 0x8, 0x12,0x7d,0x41,0x2e,0x47, +0xf, 0xd8,0xb, 0x48,0x0, 0x2e,0x7, 0xe, 0x5, 0x1b,0x48,0x0, 0x80,0x18,0x6d,0x0, +0x9e,0x7, 0xe, 0x5, 0xbd,0x20,0x58,0xe, 0x2e,0x17,0xf, 0xd8,0xb, 0x18,0x20,0x9e, +0x27,0xe, 0x5, 0x1b,0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0,0xbe,0xa0, +0xd, 0x40,0xac,0x22,0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, 0x31,0x7e, +0x79,0x50,0xa5,0xbd,0x0, 0xb, 0x7e,0xd, 0x31,0x7e,0xb, 0x40,0x7a,0x79,0x40,0x80, +0x36,0x7e,0xd, 0x31,0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12,0x6d,0xde, +0xa, 0x2c,0xbd,0x32,0x8, 0x18,0x7e,0x1d,0x31,0x7e,0x1b,0xb0,0x7e,0x79,0xa0,0xbc, +0xba,0x7c,0xba,0x28,0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0,0x7e,0x79, +0x30,0x7e,0x1d,0x31,0x7a,0x1b,0x30,0xda,0x3b,0x22,0x7e,0xb3,0x10,0x39,0xb4,0x1, +0x26,0x7e,0x73,0xa, 0xac,0x7a,0x73,0x10,0x37,0x7e,0x73,0xa, 0xad,0x7a,0x73,0x10, +0x38,0x7e,0x73,0xa, 0xae,0x7a,0x73,0x10,0x3a,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10, +0x46,0x7e,0x34,0xf, 0xdc,0x80,0x24,0x7e,0x73,0x11,0x16,0x7a,0x73,0x10,0x37,0x7e, +0x73,0x11,0x49,0x7a,0x73,0x10,0x38,0x7e,0x73,0x11,0x94,0x7a,0x73,0x10,0x3a,0x7e, +0x34,0x11,0x9d,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, 0x63,0x7a,0x37,0x10,0x48,0x22, +0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x75,0x60,0xfc,0xe5,0x76,0x60,0xfc,0x20, +0x93,0xfd,0xd2,0x96,0xd2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e,0xb3,0x16, +0xac,0x70,0x17,0xe5,0xcc,0x7a,0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30, +0x7a,0x73,0x16,0xaf,0x74,0x1, 0x7a,0xb3,0x16,0xac,0xa9,0xc0,0xca,0x7e,0x24,0x0, +0x1, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd, +0x75,0x87,0x2, 0x0, 0x0, 0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e, +0x37,0xf, 0xd6,0xb, 0x38,0x10,0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x12,0x9, 0x2e,0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30, +0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e,0x24,0x3, +0x70,0x74,0x18,0x7e,0x13,0x10,0x2b,0x6c,0x0, 0x2, 0x5e,0xd6,0x9, 0xa3,0x0, 0x24, +0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43,0xcc,0x8, +0x9, 0x53,0x0, 0x2, 0x3e,0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca,0xa9,0xd0, +0xca,0xd2,0xcd,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9,0xc0,0xc9, +0x7e,0x14,0x1d,0x0, 0xb, 0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20,0x9, 0xb3, +0x0, 0x3f,0xb4,0x1, 0xc, 0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54,0xf0,0xf5, +0xe5,0x22,0x12,0x4b,0x78,0x12,0x3b,0x1c,0x12,0x68,0xab,0x7e,0x34,0x8, 0x50,0x7a, +0x37,0xf, 0xd4,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x7e,0x34,0x8, 0x9a,0x7e, +0x27,0xf, 0xd4,0x12,0x6a,0x97,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xf, 0xd8,0x7e,0x34, +0x3, 0x70,0x7a,0x37,0xf, 0xda,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xf, 0xd8,0x12,0x67, +0xb5,0x12,0x64,0xfa,0x12,0x5a,0x34,0x12,0x6a,0x4c,0x12,0x52,0x16,0x12,0x6e,0x60, +0x74,0x1, 0x7a,0xb3,0x11,0x96,0x22,0xca,0xf8,0x7e,0xb3,0xf, 0xd2,0xb4,0x1, 0x48, +0x6c,0xff,0x80,0x3c,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xac,0xbf, +0x9, 0xb5,0xa, 0xb1,0x7e,0x53,0x10,0x2b,0x12,0x35,0x22,0x74,0x4, 0xac,0xbf,0x59, +0x35,0xb, 0x86,0x7e,0x37,0xf, 0xd6,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0xb2,0x7e, +0x53,0x10,0x2c,0x12,0x35,0x22,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x88,0xb, 0xf0, +0x7e,0x73,0xd, 0x16,0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0xca,0x69,0xca,0xf8,0x7c, +0xfb,0x7e,0x24,0x0, 0x4, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24,0x56,0xa, +0x3b,0x1b,0x38,0x20,0x6d,0x66,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38,0x60,0xb, +0xf0,0x12,0x0, 0x6e,0x50,0x1e,0x7e,0x24,0x0, 0x5, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0, +0x7c,0xba,0x24,0x56,0xa, 0x3b,0x1b,0x38,0x20,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b, +0x38,0x60,0xb, 0xf0,0x7c,0xbf,0xda,0xf8,0xda,0x69,0x22,0x7e,0x47,0x16,0x65,0x6c, +0x77,0x7e,0xa0,0xff,0x7e,0x43,0x16,0x54,0xa, 0x14,0x9, 0x51,0xf, 0x29,0xbe,0x53, +0x10,0x4a,0x78,0x32,0x7e,0x50,0x12,0xac,0x45,0x49,0x22,0x16,0x65,0xbe,0x24,0x0, +0x41,0x40,0x23,0x7e,0x60,0x1, 0xbe,0x44,0x0, 0x19,0x40,0x18,0x7e,0x30,0x12,0xac, +0x36,0x49,0x21,0x16,0x65,0xbd,0x24,0x50,0x4, 0x7d,0x42,0x7c,0x76,0xb, 0x60,0xbe, +0x60,0x4, 0x40,0xe2,0x7c,0xa7,0x7c,0xba,0x22,0xca,0x79,0xe5,0x53,0xbe,0xb1,0x54, +0x38,0x4, 0x6c,0xff,0x80,0x3a,0xe5,0x54,0x3e,0xb0,0x3e,0xb0,0x24,0x56,0xa, 0x3b, +0xb, 0x38,0x30,0x7c,0xe7,0xbe,0xe0,0x1, 0x68,0xe, 0xbe,0xe0,0x2, 0x68,0x9, 0xbe, +0xe0,0x3, 0x68,0x4, 0x4c,0xee,0x78,0x7, 0x7c,0xbe,0x12,0x63,0x10,0x7c,0xfb,0xbe, +0xe0,0x4, 0x68,0x5, 0xbe,0xe0,0x5, 0x78,0x7, 0x7c,0xbe,0x12,0x51,0x85,0x7c,0xfb, +0x7c,0xbf,0xda,0x79,0x22,0x7e,0xa3,0xd, 0xf7,0xbe,0xa0,0x0, 0x28,0x40,0x6c,0x77, +0x80,0x38,0x7e,0x50,0x2, 0xac,0x57,0x9, 0x62,0xd, 0x18,0x9, 0x52,0xd, 0x19,0x7e, +0x30,0x2, 0xac,0x36,0x49,0x1, 0x11,0xce,0x7e,0x17,0xf, 0x4a,0xe, 0x14,0xbd,0x1, +0x48,0x13,0x7e,0x30,0x2, 0xac,0x35,0x49,0x1, 0x11,0x9e,0x7e,0x17,0xf, 0x4c,0xe, +0x14,0xbd,0x1, 0x58,0x3, 0x74,0x1, 0x22,0xb, 0x70,0xbc,0xa7,0x38,0xc4,0xe4,0x22, +0xca,0xf8,0x7c,0xfb,0xbe,0xf0,0x1, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xf0,0x2, 0x68, +0x4, 0x4c,0xff,0x78,0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x39,0x80,0x3, 0xe4,0x80,0x28, +0x12,0x5f,0xda,0x4c,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x10,0x3a,0x74,0x1e,0x7a,0xb3, +0x10,0x37,0x74,0xa, 0x7a,0xb3,0x10,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x10,0x7e, +0x34,0x10,0x2b,0x12,0x64,0xb9,0x74,0x1, 0xda,0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75, +0x75,0x1, 0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x60,0x2, 0x1b,0x28,0x30,0xb, +0x28,0x30,0x4e,0x70,0x2, 0x1b,0x28,0x30,0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0x6c, +0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b, +0xda,0x6b,0xda,0x7b,0x32,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36, +0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7a,0xa1, +0xc3,0x75,0xc5,0x40,0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, +0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x3b,0xe5,0xc6, +0xa, 0x2b,0x7c,0x45,0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22,0xe4,0x7a,0xb3,0x15, +0x9f,0x7a,0xb3,0x15,0x53,0x7a,0xb3,0x15,0x9e,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15, +0xa1,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x48,0x12,0x6d,0xee,0x7e,0x34,0x14,0xe3, +0x7e,0x24,0x0, 0x48,0xe4,0x12,0x6d,0xee,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x46, +0x74,0xff,0x12,0x6d,0xee,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x46,0x74,0xff,0x2, +0x6d,0xee,0xd2,0xcd,0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e,0xb3,0x16, +0xac,0xb4,0x1, 0x15,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38, +0x20,0x7e,0xb3,0x16,0xad,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d, +0x8, 0x1b,0x38,0x20,0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe4,0x7a,0xb3,0x16,0xac,0x22,0x7c,0xab,0x6c,0x33,0x80,0x36,0xa, 0x3, +0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d,0x3, 0x7e, +0x9, 0x10,0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e,0x20,0x1e, +0x20,0x7e,0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d,0xf, 0x1b, +0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x75,0x76,0x0, 0x75,0xe4,0x3, 0x49, +0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, 0x5e,0x24, +0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5,0x75,0xe4, +0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9,0xd6,0xea, +0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1,0x22,0x7e,0x34,0x1, 0x90,0x7a,0x37, +0xd, 0xff,0x7e,0x34,0x0, 0x19,0x7a,0x37,0xe, 0x1, 0x7e,0x34,0x0, 0x9c,0x7a,0x37, +0xe, 0x3, 0x7e,0x34,0x0, 0x2, 0x7a,0x37,0xe, 0x5, 0x7a,0x37,0xe, 0x7, 0x74,0x1, +0x7a,0xb3,0xe, 0x9, 0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x7e,0x34, +0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x2, 0x6d,0xee,0xca,0xf8,0x7e,0x24,0xe, 0xd, +0x7e,0x34,0xe, 0x99,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x4a,0x6c,0xff,0x74,0x7, 0xac, +0xbf,0x49,0x35,0xe, 0xd, 0x12,0x4c,0x41,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x99, +0x49,0x35,0xe, 0xf, 0x12,0x4a,0xa6,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x9b,0xb, +0xf0,0xbe,0xf0,0xa, 0x40,0xd7,0xda,0xf8,0x22,0x6d,0x33,0x6c,0xaa,0x80,0x2e,0x7e, +0x30,0x2, 0xac,0x3a,0x9, 0x51,0xd, 0x18,0x9, 0x41,0xd, 0x19,0x7e,0x10,0x30,0xac, +0x15,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xf, 0xda,0xb, 0x18,0x40,0xbe, +0x44,0x0, 0x0, 0x8, 0x6, 0xbd,0x43,0x8, 0x2, 0x7d,0x34,0xb, 0xa0,0x7e,0xb3,0xd, +0xf7,0xbc,0xba,0x38,0xca,0x22,0xca,0x79,0x7d,0x41,0x7d,0x13,0x6d,0x0, 0x7e,0x34, +0x7f,0xff,0x6c,0xaa,0x80,0x1b,0x7e,0xf0,0x7, 0xac,0xfa,0x7d,0xe7,0x2d,0xe4,0x49, +0xfe,0x0, 0x2, 0xbd,0xf0,0x28,0x2, 0x7d,0xf, 0xbd,0xf3,0x50,0x2, 0x7d,0x3f,0xb, +0xa0,0x9, 0xb4,0x0, 0x46,0xbc,0xba,0x38,0xdd,0x1b,0x18,0x0, 0x1b,0x28,0x30,0xda, +0x79,0x22,0xca,0xf8,0x7e,0xb3,0x10,0x4e,0x60,0x3, 0xb4,0x1, 0x2d,0xa9,0xc6,0xea, +0x12,0x2b,0xa0,0x7c,0xfb,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x67,0xb5, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x53,0xc5,0xbe,0xf0,0x1, 0x78,0x4, +0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0x10,0x4e,0xda,0xf8,0x22,0x7e,0xb3,0x16, +0x54,0x4, 0x7a,0xb3,0x16,0x54,0x7e,0x73,0x16,0x54,0xbe,0x70,0x4, 0x40,0x5, 0xe4, +0x7a,0xb3,0x16,0x54,0x7e,0xa3,0x16,0x54,0xbe,0xa0,0x3, 0x78,0x13,0x7e,0xb3,0x16, +0x9d,0x4, 0x7a,0xb3,0x16,0x9d,0xbe,0xb0,0x8, 0x40,0x5, 0xe4,0x7a,0xb3,0x16,0x9d, +0xa, 0x3a,0x9, 0xb3,0xf, 0x29,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d,0x21,0x7d, +0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x4a,0x7e,0xb3,0x10,0x3c,0xb4,0x1, 0x1f,0x6c, +0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d,0x26,0xb, +0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3,0xda,0x3b, +0x22,0x7e,0xb3,0x10,0x3d,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3,0x10,0x39, +0x12,0x5f,0xda,0x12,0x2d,0xb5,0xe4,0x7a,0xb3,0x10,0x39,0x12,0x5f,0xda,0x12,0x2d, +0xb5,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x25,0x7e,0x37,0xf, 0xd4,0x7e,0x24,0x8, 0xe4, +0x12,0x58,0xe3,0x74,0x2, 0x7a,0xb3,0x10,0x3d,0x22,0x7e,0xa3,0xf, 0x1c,0xbe,0xa0, +0x0, 0x38,0x2f,0xbe,0xa3,0xf, 0x1b,0x50,0x19,0x7e,0xb3,0xf, 0x25,0xbe,0xb3,0x12, +0x33,0x28,0x14,0x7e,0xb3,0x12,0x33,0x4, 0x7a,0xb3,0x12,0x33,0x7a,0xa3,0xf, 0x1b, +0x80,0x5, 0xe4,0x7a,0xb3,0x12,0x33,0x7e,0xb3,0xf, 0x1b,0x70,0x5, 0xe4,0x7a,0xb3, +0xf, 0x24,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12,0x54,0x53, +0x74,0x1, 0x7a,0xb3,0x16,0x4e,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75, +0x76,0x1, 0x75,0xe6,0x0, 0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0x6c,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0xca,0xf8,0x7d,0x1, 0x7d,0x13,0x7e,0xf3,0x10,0x4d,0xbe,0xf0,0x1, 0x78, +0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x2, 0x80,0x11,0x4c,0xff, +0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x4, 0x12, +0x5e,0xd6,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0xf, 0xd3,0x6c,0xaa,0x6c,0x33,0x6d,0xff, +0x7e,0x10,0x18,0xac,0x1a,0xa, 0xe3,0x2d,0xe, 0x3e,0x4, 0x7d,0x40,0x2d,0x42,0x1b, +0x48,0xf0,0x6d,0x44,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x18,0xdf,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xd6,0x22,0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c,0x33,0x4c, +0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d,0x30,0x80, +0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe,0x30,0x3, +0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x2a,0x2d, +0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x7e,0x24,0xff,0xff, +0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x14,0x2d,0x13,0x59, +0x21,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd1,0x22,0x7c,0xab,0x7e,0x24,0xe, +0xdf,0xbe,0xa0,0xa, 0x50,0x25,0xa, 0x3a,0x7d,0x13,0x2d,0x12,0x7e,0x19,0xb0,0xb4, +0x2, 0xe, 0x74,0x1, 0x7a,0x19,0xb0,0x74,0x3, 0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x22, +0x74,0x3, 0x7a,0x19,0xb0,0x2d,0x32,0x19,0xb3,0x0, 0xa, 0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x6e,0x6a,0x53,0xb, 0xfd,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x6d,0x33,0x7a,0x37,0x11, +0xd, 0x74,0x1, 0x7a,0xb3,0x11,0xf, 0x74,0xb, 0x7a,0xb3,0x11,0x10,0x74,0x9, 0x7a, +0xb3,0x11,0x11,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x7a,0xb3,0x11,0x13,0x7a,0xb3,0x11, +0x14,0x74,0x1, 0x7a,0xb3,0x11,0x15,0x22,0x7e,0xb3,0xf, 0x1b,0x70,0x1e,0x7e,0xa3, +0xf, 0x1c,0xbe,0xa0,0x0, 0x28,0x15,0xe5,0x16,0x70,0xd, 0x7a,0xa3,0xf, 0x1b,0x74, +0x1, 0x7a,0xb3,0xf, 0x22,0x5, 0x16,0x22,0x75,0x16,0x0, 0x22,0x75,0x16,0x0, 0xe4, +0x7a,0xb3,0xf, 0x22,0x22,0x6c,0xaa,0x80,0x1f,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23, +0x0, 0xd2,0x7e,0x70,0x18,0xac,0x7a,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, +0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xd9, +0x22,0x75,0x75,0x0, 0xa9,0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34, +0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x2, 0x1b,0x28, +0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, 0x5e,0x0, 0xa, +0x0, 0x96,0x1, 0x2c,0x0, 0x8, 0x0, 0x78,0x0, 0xfa,0x0, 0x7, 0x0, 0x50,0x0, 0xc8, +0x0, 0x6, 0x0, 0x32,0x0, 0xa0,0x0, 0x4, 0x0, 0x1e,0x0, 0x78,0x0, 0x3, 0x0, 0xa, +0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0xf5,0xf1,0x7c, +0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9,0x37,0xf5,0xfc, +0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5,0xcb,0x22,0xc2, +0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54,0x1e,0x54,0x3e, +0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, 0x12,0x6d,0x33, +0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x12,0x22,0x20,0x12,0x3d,0xb5,0x12,0x4d, +0x0, 0x60,0x6, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x7e,0xb3,0xe, 0xb, 0x60,0x3, 0x12, +0x60,0x86,0x7e,0xb3,0xe, 0xc, 0x60,0x6, 0x12,0x55,0x68,0x2, 0x5f,0x2d,0x22,0xe4, +0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0xf, 0x28,0x12,0x6a,0x26,0xb4, +0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x53,0xb, 0x8f,0x74,0x2, 0x80,0x2, 0x74, +0xff,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x66,0xa1,0x7e,0xb3, +0x10,0x3d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x65,0xf2,0x7e,0xb3,0x10,0x4e, +0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x34,0xa, 0xb1, +0x7e,0x24,0x3, 0x4d,0xe4,0x12,0x6d,0xee,0x7e,0x34,0xb, 0x86,0x7e,0x24,0x1, 0x90, +0x74,0xff,0x12,0x6d,0xee,0x7e,0x34,0xd, 0x6b,0x7e,0x24,0x0, 0x8c,0x74,0xff,0x2, +0x6d,0xee,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51,0x80,0x3, 0x7e, +0x39,0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23,0x0, 0x3b,0x7e, +0x34,0x1d,0x6, 0x1b,0x38,0x20,0x22,0xe4,0x7a,0xb3,0xf, 0xd2,0x6c,0xaa,0x6d,0x44, +0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x2, 0x1b,0x8, 0x40,0x6d,0x0, 0x2d,0x13, +0x1b,0x18,0x0, 0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x22,0x7e,0x34,0x12,0x1, 0x7e, +0x24,0x0, 0x1e,0xe4,0x12,0x6d,0xee,0x7e,0x34,0x12,0x1f,0x7e,0x24,0x0, 0x14,0xe4, +0x12,0x6d,0xee,0x7e,0x34,0x11,0xed,0x7e,0x24,0x0, 0x14,0xe4,0x2, 0x6d,0xee,0x12, +0x0, 0x6e,0x50,0x1d,0x12,0x6e,0xbb,0x7c,0xab,0x7e,0xb3,0x11,0x95,0xbe,0xb0,0x4, +0x68,0xf, 0xbe,0xa0,0xff,0x68,0xa, 0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x7a,0xa3,0x11, +0x95,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb3,0x10,0x3d,0x70,0x3, 0x7e,0xf0,0x1, 0x74, +0x1, 0x12,0x3e,0xf7,0xbe,0xb0,0x1, 0x68,0x5, 0xbe,0xf0,0x1, 0x78,0x4, 0xe4,0x12, +0x3e,0xf7,0xda,0xf8,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5,0x0, 0x75,0xe4, +0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, 0x9, 0xb3,0x0, +0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x7e,0x34,0x8, 0x9a,0x7e,0x24,0x11,0x9e, +0x7e,0x14,0x1, 0x90,0x12,0x3c,0x70,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x11,0x4a,0x7e, +0x14,0x0, 0xc8,0x12,0x3c,0x70,0x2, 0x57,0x1, 0x74,0x1, 0x12,0x6e,0x4b,0xa9,0xc3, +0xea,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x75,0x9a,0x7f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xe5,0x52,0xb4,0x1, 0x18,0xe5, +0x51,0x70,0x14,0x7e,0xb3,0x11,0x95,0x60,0xb, 0xe4,0x7a,0xb3,0x11,0x95,0x74,0x1, +0x7a,0xb3,0x11,0xc, 0x12,0x6c,0x66,0x85,0x51,0x52,0x22,0x6c,0xaa,0x7e,0x50,0x4, +0xac,0x5a,0x49,0x12,0x0, 0xec,0xbd,0x13,0x38,0x8, 0x49,0x22,0x0, 0xee,0xbd,0x23, +0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe4,0x7c,0xba,0x22,0x7e,0x24,0x0, 0x2, +0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0x9b,0x12,0x6c,0xb9,0x7e,0x34,0x7, +0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x2e,0x75,0x55,0x0, 0x75, +0x73,0x0, 0x75,0x54,0x0, 0x12,0x6c,0xb, 0x12,0x61,0xdb,0xf5,0x53,0x12,0x62,0x79, +0xb4,0x1, 0x4, 0x75,0x55,0x1, 0x22,0x75,0x55,0x3, 0x22,0x7e,0x34,0x0, 0x1, 0x7a, +0x35,0x56,0x7e,0x34,0xa, 0x18,0x7a,0x35,0x58,0x7e,0x34,0x0, 0x2, 0x7a,0x35,0x5a, +0x7e,0x34,0xa, 0x62,0x7a,0x35,0x5c,0x74,0x2, 0x22,0x0, 0x50,0x0, 0xa, 0x6, 0x4, +0x0, 0x78,0x0, 0xc, 0x6, 0x4, 0x0, 0xc8,0x0, 0x1e,0x8, 0x5, 0x1, 0x40,0x0, 0x50, +0x8, 0x5, 0x1, 0xf4,0x0, 0x64,0xa, 0x6, 0xe4,0x7a,0xb3,0x16,0xb1,0x7a,0xb3,0x16, +0xb0,0x7e,0xb3,0x10,0xa3,0x70,0x6, 0x7e,0x73,0x11,0x10,0x80,0x4, 0x7e,0x73,0x11, +0x12,0x7a,0x73,0x16,0xb2,0x22,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x2, 0x7a,0xb3,0x10, +0x7b,0x74,0x4, 0x7a,0xb3,0x10,0x7c,0x7e,0x34,0x16,0x55,0x7e,0x24,0x0, 0x48,0xe4, +0x2, 0x6d,0xee,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x75,0x92,0x7c,0xd2,0xad,0xd2, +0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0x22,0xe4,0x7a, +0xb3,0xd, 0xfb,0x7e,0x34,0x11,0x9e,0x7a,0x37,0xf, 0xd6,0x12,0x40,0x32,0x7e,0x34, +0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x2, 0x46,0xe9,0x75,0x75,0x1, 0x7e,0x24,0x1d,0x0, +0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e,0x34,0x0, 0x1, +0x2, 0x6e,0x35,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0xe5,0x51,0xb4,0x1, +0x6, 0x7e,0x34,0x0, 0x5a,0x80,0x4, 0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, 0x54,0x7a, +0x37,0xf, 0x56,0x22,0xca,0xf8,0x12,0x6e,0x40,0x7c,0xfb,0x12,0x0, 0x6e,0x50,0x7, +0x4c,0xff,0x78,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0xda,0xf8,0x22,0x7e,0x34,0x0, 0x24, +0x12,0x69,0x86,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, 0x57,0x2e,0x54, +0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0x7d,0x3, 0x80,0xa, 0x7e,0x29, +0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d,0x55,0x78,0xee, +0x22,0x7e,0x53,0xf, 0x47,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x9d,0x32,0xbe,0x34,0x0, +0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4,0x1, 0x3, 0x43, +0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3,0x16,0xa3,0xe4, +0x7a,0xb3,0x16,0xaa,0x74,0xff,0x7a,0xb3,0x16,0xa2,0x22,0x75,0x76,0x1, 0xd2,0xee, +0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x6e,0x35,0xa, 0x2b,0x19, +0x72,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x44,0x1, 0x7a,0xb3,0x10,0xfe,0x22,0x7d,0x13, +0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31,0x22,0x14,0x1, +0xa, 0x1, 0x0, 0x2, 0xfb,0x4, 0xf6,0x5, 0xec,0x6, 0xe7,0x7, 0xe2,0x8, 0x7d,0x23, +0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22,0x7d,0x13, +0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5,0x22,0x10,0x10, +0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x12,0x0, 0x42, +0x12,0x57,0x81,0x74,0x3, 0x12,0x43,0xae,0x2, 0x24,0xb4,0x7e,0x34,0x0, 0x21,0x12, +0x69,0x86,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x7e,0xb3,0x11,0x15,0xb4,0x1, 0x4, +0xe4,0x2, 0x6e,0xa0,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32,0x38,0xfa,0x22, +0x12,0x62,0xc5,0xb4,0x1, 0x2, 0xe4,0x22,0x74,0x1, 0x22,0xd2,0xcf,0xa9,0xd4,0xc9, +0x75,0xcc,0x0, 0xc2,0xca,0x22,0xa9,0xc0,0x93,0x75,0x9, 0x0, 0x75,0xa, 0x0, 0x32, +0x75,0x53,0x0, 0x75,0x54,0x0, 0x75,0x55,0x0, 0x22,0xa9,0x32,0x99,0x5, 0xd2,0x9c, +0xa9,0xd6,0xdf,0x22,0x75,0xb, 0x0, 0x12,0x6e,0xd1,0x2, 0x5e,0x26,0x12,0x6b,0x69, +0x12,0x6e,0xd7,0x2, 0x6e,0x74,0xe5,0x75,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xe5, +0x76,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80, +0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0xf5, +0x17,0x75,0x18,0x0, 0x22,0x12,0x61,0x87,0x2, 0x38,0x4a,0x12,0x4f,0xb6,0x2, 0x62, +0x2b,0x12,0x6e,0xe3,0x2, 0x6b,0xec,0x7e,0x34,0x1, 0x3, 0x22,0x7e,0x34,0x5, 0xb, +0x22,0x2, 0x6c,0x83,0x2, 0x0, 0x76,0x2, 0x6c,0xd3,0x2, 0x6e,0xa8,0x2, 0x6e,0x6a, +0xe5,0x6e,0x22,0x22,0x0, 0x1, 0x0, 0x8b,0x1, 0x0, 0x1, 0xa, 0xac,0x15,0x0, 0x1, +0xa, 0xad,0x17,0x0, 0x1, 0xa, 0xae,0x4, 0x0, 0x1, 0xd, 0xfe,0x30,0x0, 0x5, 0xf, +0x29,0x23,0x17,0x29,0x38,0x13,0x0, 0x18,0xf, 0x2e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x3, 0x0, 0x25,0xf, 0x63,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x18,0xf, 0x88,0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xf, 0xa0,0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xf, 0xad,0x0, 0x1, 0x2, 0x3, +0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x17,0x16,0x15,0x14,0x13,0xc, 0xd, 0xe, +0xf, 0x10,0x11,0x12,0x0, 0xd, 0xf, 0xc5,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, +0x0, 0x9, 0xa, 0xb, 0xc, 0x0, 0x25,0xf, 0xdc,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0xd, +0x10,0xff,0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x0, +0x1, 0x11,0xc, 0x0, 0x0, 0x1, 0x11,0x16,0x15,0x0, 0x32,0x11,0x17,0x0, 0x8, 0x0, +0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a,0x1, 0xbc,0x2, +0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, 0x7, 0xf9,0x8, +0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e,0xc, 0x83,0x0, +0x1, 0x11,0x49,0x17,0x0, 0x1, 0x11,0x94,0x2, 0x0, 0x1, 0x11,0x95,0x0, 0x0, 0x4, +0x11,0x97,0xff,0xff,0xff,0xff,0x0, 0x2, 0x11,0x9b,0xff,0x1f,0x0, 0x1, 0x11,0x9d, +0x30,0x0, 0x1, 0x11,0xe8,0x0, 0x0, 0x4, 0x11,0xe9,0x23,0x23,0x23,0x23,0x0, 0x1, +0x16,0x53,0x0, 0x0, 0x1, 0x15,0x53,0x0, 0x0, 0x1, 0x15,0x9e,0x0, 0x0, 0x1, 0x15, +0x9f,0x0, 0x0, 0x1, 0x15,0xa0,0x0, 0x0, 0x1, 0x15,0xa1,0x0, 0x0, 0x1, 0x12,0x33, +0x0, 0x0, 0x1, 0x16,0xac,0x0, 0x0, 0x1, 0x16,0xb4,0x0, 0x0, 0x1, 0x16,0xb5,0x0, +0x0, 0x1, 0x16,0xb6,0x0, 0x0, 0x1, 0x16,0xb7,0x0, 0x0, 0x1, 0x16,0xb8,0x0, 0x0, +0x1, 0x16,0xb9,0x0, 0x0, 0x1, 0x16,0xba,0x1, 0x0, 0x1, 0x16,0xbb,0x1, 0x0, 0xc, +0x0, 0xec,0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x6, +0x0, 0xf8,0x0, 0xb4,0x2, 0x1c,0x3, 0x84,0x0, 0x1, 0x16,0x54,0x3, 0x0, 0x1, 0x16, +0x9d,0x0, 0x0, 0x1, 0x0, 0xfe,0x0, 0x0, 0x1, 0x0, 0xff,0x0, 0x0, 0x1, 0x16,0xbc, +0x0, 0x0, 0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x70,0xd3,0x8f,0x2c,0x95,0x6a,0x2f, +0xf1, \ No newline at end of file diff --git a/drivers/input/touchscreen/ft5336/ft_app_ic_biel_ebbg_720p.txt b/drivers/input/touchscreen/ft5336/ft_app_ic_biel_ebbg_720p.txt new file mode 100644 index 0000000000000..94da926b7be7e --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft_app_ic_biel_ebbg_720p.txt @@ -0,0 +1,1810 @@ +0x2, 0x51,0x4f,0x2, 0x68,0xdc,0xe5,0x73,0x60,0x9, 0x74,0x1, 0x12,0x6e,0xd3,0x75, +0x73,0x0, 0x22,0xe4,0x12,0x6e,0xd3,0x75,0x73,0x1, 0x22,0x2, 0x50,0xb9,0xe5,0x55, +0xbe,0xb0,0x1, 0x68,0xf9,0x12,0x6e,0xb9,0x60,0xfb,0x22,0x2, 0x67,0x73,0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60, +0xfb,0x22,0x22,0x2, 0x6e,0x89,0xc2,0x8e,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0x22,0x32,0x2, 0x63,0xb7,0xbe,0xb0, +0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x16,0x9f,0x22,0x22,0x2, 0x0, 0x5a,0xe5,0x52, +0x24,0xff,0x22,0x2, 0x67,0xab,0xca,0x3b,0x7e,0xb3,0xf, 0x1b,0xf5,0x26,0x7e,0xd3, +0xf, 0x1c,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x33,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, +0xa, 0xe4,0x12,0x6e,0x21,0x6c,0xcc,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7c,0x19, +0xa3,0x13,0xba,0x7e,0x34,0x7f,0xff,0x74,0x7, 0xac,0xbc,0x59,0x35,0x13,0xb6,0x74, +0x7, 0xac,0xbc,0x59,0x35,0x13,0xb8,0xb, 0xc0,0xbe,0xc0,0xa, 0x78,0xd9,0xe5,0x26, +0x60,0x3, 0x2, 0x0, 0xef,0x12,0x6a,0xee,0xbe,0xd0,0x0, 0x38,0x3, 0x2, 0x0, 0xdf, +0x74,0x1, 0x7a,0xb3,0xf, 0x20,0xe4,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7e, +0x34,0x13,0x6, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x2, 0x1, 0x14,0x4c, +0xdd,0x68,0x3, 0x2, 0x1, 0x14,0x75,0x25,0x0, 0x7e,0xa0,0xff,0x7e,0x71,0x25,0x74, +0x7, 0xac,0x7b,0x19,0xa3,0xe, 0x57,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xeb,0x74,0x1, +0x7a,0xb3,0xf, 0x1f,0x75,0x25,0x0, 0x2, 0x1, 0x4c,0x7e,0x51,0x25,0x74,0x7, 0xac, +0x5b,0x2e,0x24,0xe, 0xd, 0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x51,0x25,0xac,0x5b,0x2e,0x24,0xe, 0xf, 0xb, 0x28,0x30,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x5, 0x25,0xe5,0x26,0xbe,0xb1, +0x25,0x38,0xc7,0xe4,0x6c,0x77,0x7e,0x61,0x26,0x7e,0x24,0x13,0xb6,0x12,0x53,0x2, +0x7e,0x71,0x26,0x7e,0x60,0xa, 0x7e,0x24,0x13,0xb6,0x12,0x53,0x2, 0x7c,0xcb,0x6c, +0xee,0x75,0x25,0x0, 0x2, 0x1, 0x92,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65,0x13, +0xba,0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x11,0xbc,0x76,0x78,0x3, 0x2, 0x1, 0x97, +0x5, 0x25,0xbe,0xc1,0x25,0x38,0xe0,0xbe,0xc1,0x25,0x68,0x3, 0x2, 0x1, 0xb8,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3c,0x2e,0x14,0x13, +0xb6,0x74,0x7, 0x12,0x49,0x26,0xb, 0xc0,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xb2,0x7e, +0x24,0x13,0xb6,0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x4c,0xdd, +0x68,0x3, 0x2, 0x1, 0xe7,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, +0x46,0x12,0x6d,0x7d,0x2, 0x4, 0x84,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x4, 0x84, +0x6c,0xee,0x2, 0x4, 0x7b,0x75,0x25,0x0, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65, +0xe, 0x57,0x7e,0x90,0x7, 0xac,0x9e,0x9, 0x74,0xe, 0x11,0xbc,0x67,0x78,0x3, 0x2, +0x2, 0x1b,0x5, 0x25,0xe5,0x25,0xbe,0xb0,0xa, 0x40,0xdd,0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x9, 0xf5,0xe, 0x57,0x49,0x34,0xe, 0xf, 0x49,0x25,0xe, 0x55,0x12,0x6d,0xf1, +0x7d,0x63,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, 0xa4, +0x49,0x25,0xe, 0x53,0x12,0x6d,0xf1,0x7d,0x13,0x2d,0x16,0x7a,0x15,0x21,0x7c,0x1f, +0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7,0xbe,0x14,0x0, 0x40,0x28,0x3, 0x2, 0x2, 0xd9, +0x7e,0x35,0x21,0xbe,0x34,0x0, 0x20,0x38,0x3, 0x2, 0x2, 0xae,0x7e,0x70,0x3, 0xac, +0x7f,0x9, 0xb3,0x12,0x2, 0x60,0x3, 0x2, 0x2, 0x97,0x9, 0xb3,0x12,0x3, 0xbe,0xb0, +0x0, 0x38,0x3, 0x2, 0x2, 0x89,0x2, 0x2, 0xbf,0x74,0x1, 0x19,0xb3,0x12,0x2, 0x6d, +0x22,0x7a,0x25,0x21,0x2, 0x2, 0xed,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0xa, 0x40,0x3, +0x2, 0x2, 0xed,0x2e,0x34,0x12,0x3, 0x4, 0x7a,0x39,0xb0,0x2, 0x2, 0xd1,0x7e,0x70, +0x3, 0xac,0x7f,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x2, 0xcc,0x7d, +0x23,0x2e,0x24,0x12,0x3, 0x14,0x7a,0x29,0xb0,0x2, 0x2, 0xed,0xe4,0x19,0xb3,0x12, +0x2, 0x6d,0x33,0x7a,0x35,0x21,0x2, 0x2, 0xed,0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7f, +0x19,0xa3,0x12,0x3, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x2, 0x7e,0x35,0x21, +0xbe,0x34,0x0, 0x20,0x28,0x3, 0x2, 0x3, 0x2e,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49, +0x35,0xe, 0x53,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x35,0xe, 0x55,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0x6d,0x33,0x7a, +0x35,0x21,0x7e,0xa0,0x1, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x1, 0x7e,0xf5, +0x21,0x7a,0xf5,0x23,0xa, 0xef,0x2e,0xe5,0x33,0x7e,0xe9,0xb0,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x3, 0x52,0x6d,0xee,0x74,0x2, 0xac,0xbf,0x59,0xe5,0x11,0xed,0x59,0xe5, +0x12,0x1f,0x7e,0x17,0xf, 0x5d,0xbe,0x15,0x23,0x28,0x3, 0x2, 0x3, 0x68,0x7e,0x4, +0x1, 0x0, 0x7a,0x5, 0x31,0x2, 0x3, 0x8b,0x7e,0x35,0x23,0x6d,0x22,0x7c,0x56,0x7c, +0x67,0x6c,0x77,0x12,0x48,0x9f,0x7d,0xe3,0x7a,0xe5,0x31,0xbe,0xe4,0x0, 0x10,0x40, +0x3, 0x2, 0x3, 0x8b,0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x31,0x74,0x2, 0xac,0xbf,0x49, +0x45,0x12,0x1f,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x3, 0xa5,0x49,0x45,0x11,0xed,0x7a, +0x45,0x31,0x2, 0x3, 0xac,0x7e,0x45,0x31,0x59,0x45,0x11,0xed,0x59,0xf5,0x12,0x1f, +0x7e,0x35,0x31,0xbe,0x34,0x1, 0x0, 0x38,0x3, 0x2, 0x3, 0xc3,0x7e,0x34,0x1, 0x0, +0x7a,0x35,0x31,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x25,0xe, 0x53,0x12,0x6d,0xf1,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31, +0xad,0x32,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, +0xac,0x5b,0x49,0x32,0xe, 0x53,0xac,0xbe,0x49,0x15,0xe, 0xd, 0xbd,0x13,0x38,0x3, +0x2, 0x4, 0x14,0x7d,0x2, 0x2e,0x4, 0xe, 0x53,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, +0x10,0x2, 0x4, 0x1e,0x2e,0x24,0xe, 0x53,0x9e,0x35,0x21,0x1b,0x28,0x30,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49,0x25,0xe, 0x55, +0x12,0x6d,0xf1,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31,0xad,0x32,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, 0xac,0x5b,0x49,0x32,0xe, +0x55,0xac,0xbe,0x49,0x15,0xe, 0xf, 0xbd,0x13,0x38,0x3, 0x2, 0x4, 0x6f,0x7d,0x2, +0x2e,0x4, 0xe, 0x55,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, 0x10,0x2, 0x4, 0x79,0x2e, +0x24,0xe, 0x55,0x9e,0x35,0x21,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x26,0xbc,0xbe,0x28, +0x3, 0x2, 0x1, 0xf5,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x49,0x45,0xe, 0x53,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x35,0x49,0x45,0xe, 0x55,0x1e,0x44,0x1e, +0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x37,0x9, 0xf5,0xe, 0x57,0x19,0xf5,0xe, 0x11, +0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x58,0x19,0x75,0xe, 0x12,0x74,0x7, 0xac,0xbe, +0x9, 0x75,0xe, 0x59,0x19,0x75,0xe, 0x13,0x7c,0xbf,0x54,0xf, 0xbe,0xb0,0xa, 0x40, +0x3, 0x2, 0x5, 0xd7,0x7c,0xfb,0xa, 0xf, 0x7d,0x10,0x2e,0x15,0x33,0x7e,0x19,0xb0, +0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x5, 0xf4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x4, 0xf9, +0x74,0xff,0x19,0xb0,0x13,0x6, 0x2, 0x5, 0xd7,0x9, 0x90,0x13,0x6, 0xbe,0x90,0xff, +0x68,0x3, 0x2, 0x5, 0x4b,0x74,0x1, 0x19,0xb0,0x13,0x6, 0x7e,0x15,0x35,0x74,0x7, +0xac,0xbe,0x59,0x15,0xe, 0xd, 0x7e,0x15,0x37,0x74,0x7, 0xac,0xbe,0x59,0x15,0xe, +0xf, 0x6c,0xdd,0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x50,0x7, 0xac, +0x5d,0x7e,0x30,0x15,0xac,0x3f,0x2d,0x12,0x2e,0x14,0x12,0x34,0x74,0x7, 0x12,0x49, +0x26,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xdb,0x2, 0x5, 0xd7,0xbe,0x90,0x3, 0x50,0x3, +0x2, 0x5, 0x58,0xe4,0x19,0xb0,0x13,0x6, 0x7e,0x25,0x35,0x9, 0x80,0x13,0x6, 0x7e, +0x90,0x7, 0xac,0x89,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x43,0x59,0x24,0x12,0x34,0x7e, +0x25,0x37,0x59,0x24,0x12,0x36,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x5, 0xa0,0xe4, +0x2e,0x34,0x12,0x34,0x12,0x68,0x47,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x74, +0x1, 0x7e,0x70,0x15,0xac,0x7f,0x2e,0x34,0x12,0x34,0x12,0x68,0x47,0x2, 0x5, 0xc2, +0x49,0x34,0x12,0x34,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0xa, 0x3f,0x9, 0x43, +0x13,0x6, 0x7e,0x50,0x7, 0xac,0x45,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x32,0x49,0x33, +0x12,0x36,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0xa, 0x3f,0x2e,0x34,0x13,0x6, +0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x7c,0x1e,0x2e,0x10,0x27,0xa5,0xe7,0x60,0x3, +0x2, 0x5, 0xf4,0x7e,0x70,0x3, 0xac,0x7e,0x2e,0x34,0x12,0x1, 0x7e,0x24,0x0, 0x3, +0xe4,0x12,0x6e,0x21,0xb, 0xe0,0xbe,0xe0,0xa, 0x68,0x3, 0x2, 0x4, 0x86,0xe5,0x26, +0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x6, 0xe, 0x74,0x1, 0x7a,0xb3,0xf, 0x24,0xda,0x3b, +0x22,0xca,0x3b,0x7e,0xe3,0xf, 0x1b,0x4c,0xee,0x78,0x27,0x6c,0xff,0x6d,0x11,0x74, +0x2, 0xac,0xbf,0x59,0x15,0x13,0x56,0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x19, +0xa1,0x13,0x14,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x13,0x6a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xdb,0x6c,0xff,0x2, 0x7, 0xac,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xe, 0x11,0x54, +0xf, 0xf5,0x22,0xbe,0xb0,0xa, 0x40,0x3, 0x2, 0x7, 0xaa,0xe5,0x22,0xa, 0x1b,0x9, +0xb1,0xe, 0xdf,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x7, 0x85,0x75,0x21,0x0, 0x7e,0x31, +0x21,0x74,0x7, 0xac,0x3b,0x9, 0x71,0x13,0x14,0x7a,0x71,0x23,0xbe,0x71,0x22,0x68, +0x3, 0x2, 0x7, 0x77,0x49,0x21,0x13,0x12,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xf, +0x9d,0x32,0x12,0x6e,0x11,0x7d,0x63,0x7e,0xa1,0x21,0x74,0x7, 0xa4,0x49,0x25,0x13, +0x10,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6e,0x11,0x7d,0x3, +0x2d,0x6, 0xe5,0x23,0xa, 0x1b,0x9, 0xa1,0x13,0x6a,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0x71,0x23,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x13,0x56,0x2e,0x14,0x13,0x6a,0x7c,0xba, +0x14,0x7a,0x19,0xb0,0x2, 0x7, 0xaa,0x7e,0xa1,0x23,0x74,0x2, 0xa4,0x49,0x15,0x13, +0x56,0xbe,0x14,0x0, 0x32,0x28,0x9, 0xbe,0x4, 0x0, 0x32,0x28,0x3, 0x2, 0x7, 0x71, +0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, +0x80,0x6f,0xbe,0x4, 0x0, 0x96,0x28,0x63,0xe5,0x22,0xa, 0x1b,0x9, 0xb1,0xe, 0xdf, +0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0xe, 0xdf,0x7e,0xa0,0x3, 0xe5, +0x22,0xa, 0x1b,0x19,0xa1,0xe, 0xe9,0x7e,0x71,0x21,0x74,0x7, 0xac,0x7b,0x2e,0x34, +0x13,0x10,0x7e,0x14,0x13,0xb6,0x12,0x49,0x26,0xbe,0xe0,0x0, 0x28,0x2d,0x1b,0xe0, +0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3f,0x2e,0x14, +0xe, 0xd, 0x74,0x7, 0x12,0x49,0x26,0x7e,0x34,0x13,0xb6,0x7e,0x30,0x7, 0xac,0x3e, +0x2e,0x14,0xe, 0xd, 0x74,0x7, 0x12,0x49,0x26,0x1b,0xf0,0x7e,0xa1,0x23,0x74,0x2, +0xa4,0x59,0x5, 0x13,0x56,0x80,0x33,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0xa, 0x50,0x3, +0x2, 0x6, 0x6e,0x80,0x25,0x6d,0x11,0x7e,0xa1,0x22,0x74,0x2, 0xa4,0x59,0x15,0x13, +0x56,0x7e,0xa0,0xff,0x7e,0x31,0x22,0x74,0x7, 0xac,0x3b,0x19,0xa1,0x13,0x14,0x7e, +0xa0,0x2, 0xe5,0x22,0xa, 0x1b,0x19,0xa1,0x13,0x6a,0xb, 0xf0,0xbc,0xef,0x28,0x3, +0x2, 0x6, 0x47,0x7a,0xe3,0xf, 0x1b,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0x10,0x7e, +0x14,0x0, 0x46,0x12,0x6d,0x7d,0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d, +0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x24,0xc, 0x75,0x25,0x0, +0x75,0x26,0x17,0x75,0x27,0x0, 0x7e,0x34,0x13,0xd0,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6e,0x21,0x6c,0x66,0x2, 0x8, 0xed,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xd, 0x18,0x7a, +0x71,0x23,0x9, 0xa5,0xd, 0x19,0x1a,0x17,0x7d,0x21,0x1b,0x25,0xb, 0x15,0x7c,0x43, +0x1a,0x1a,0x1b,0x15,0x1a,0xa, 0xb, 0x5, 0x7c,0x21,0xbe,0x50,0x0, 0x58,0x2, 0x6c, +0x55,0x7e,0x73,0x10,0x2b,0xa, 0x7, 0x1b,0x4, 0x1a,0x44,0xbd,0x40,0x8, 0x2, 0x7c, +0x41,0xbe,0x30,0x0, 0x58,0x2, 0x6c,0x33,0x7e,0x73,0x10,0x2c,0xa, 0x7, 0x1b,0x4, +0x1a,0x42,0xbd,0x40,0x8, 0x2, 0x7c,0x21,0xbe,0x51,0x24,0x58,0x3, 0x7a,0x51,0x24, +0xbe,0x41,0x25,0x8, 0x3, 0x7a,0x41,0x25,0xbe,0x31,0x26,0x58,0x3, 0x7a,0x31,0x26, +0xbe,0x21,0x27,0x8, 0x3, 0x7a,0x21,0x27,0x7c,0xf5,0x80,0x4b,0x7c,0xe3,0x80,0x41, +0x1a,0xef,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0xe, 0x2d,0xf, 0xe, 0x4, 0xe, 0x4, +0xe, 0x4, 0x7c,0x71,0x7a,0x71,0x21,0x7e,0x10,0x18,0xac,0x1f,0x7c,0xb1,0x2c,0xbe, +0x54,0x7, 0x7e,0x4, 0x0, 0x1, 0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7c,0xb1,0xf5, +0x22,0xa, 0x7, 0x2e,0x4, 0x13,0xd0,0x7e,0x9, 0xb0,0x45,0x22,0x7a,0x9, 0xb0,0xb, +0xe0,0xbc,0x2e,0x58,0xbb,0xb, 0xf0,0xbc,0x4f,0x58,0xb1,0xb, 0x60,0x7e,0x73,0xd, +0xf7,0xbc,0x76,0x28,0x3, 0x2, 0x8, 0x27,0xbe,0x70,0x0, 0x38,0x3, 0x2, 0xd, 0x43, +0x7e,0xe1,0x26,0x2, 0xd, 0x3a,0x6c,0xff,0x80,0x1f,0x1a,0x3e,0x3e,0x34,0x1a,0x2f, +0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36,0xb, 0x38,0x30,0xe, 0x34,0xe, +0x34,0x3e,0x24,0x59,0x32,0x13,0xb6,0xb, 0xf0,0x7e,0x73,0x10,0x2b,0xbc,0x7f,0x18, +0xd9,0x7e,0xf1,0x24,0x2, 0xd, 0x2f,0x1a,0x4f,0x7e,0x14,0x0, 0x18,0xad,0x14,0x1a, +0x3e,0x7d,0x51,0x2d,0x53,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7a,0xa1,0x21, +0x7e,0x50,0x18,0xac,0x5f,0x7c,0xb5,0x2c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x22,0xa, 0x2a,0x9, 0xb2,0x13,0xd0, +0x55,0x22,0x78,0x3, 0x2, 0xd, 0x2d,0xbe,0xf0,0x3, 0x58,0x3, 0x2, 0x9, 0xfe,0x7e, +0x53,0x10,0x2b,0xa, 0x25,0x1b,0x26,0xbd,0x42,0x18,0x73,0x7d,0xf4,0x3e,0xf4,0x49, +0x5f,0x13,0xba,0x49,0x2f,0x13,0xb2,0x2d,0x25,0x7d,0x52,0x3e,0x54,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x2d,0x25,0x49,0x5f,0x13,0xbc,0x49,0xef,0x13,0xb0,0x2d,0xe5,0x7d, +0x5e,0x3e,0x54,0x2d,0x5e,0x9d,0x25,0x49,0xef,0x13,0xb8,0x49,0x5f,0x13,0xb4,0x2d, +0x5e,0x7d,0xe5,0x3e,0xe4,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d, +0x5e,0x9d,0x25,0x49,0x5f,0x13,0xb6,0x7d,0x5, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x9d,0x10,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x2, 0xb, 0x55,0x4c,0xff, +0x78,0x5d,0x7d,0x24,0x3e,0x24,0x49,0x12,0x13,0xb6,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x3e,0x54,0x2d,0x50,0x7d,0x1, 0x3e,0x4, 0x2d,0x5, 0x2d,0x1, 0x49,0x12,0x13,0xb8, +0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5, 0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x9d,0x1, 0x49,0x12,0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x2d,0x50,0x9d,0x51,0x49,0x22,0x13,0xbc,0x3e,0x24,0x9d,0x52,0x2, 0xb, 0x55,0xbe, +0xf0,0x1, 0x78,0x69,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x49,0x20, +0x13,0xb6,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x25,0x9d,0x21,0x49,0x10, +0x13,0xb8,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x21,0x49,0x10, +0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10, +0x13,0xbc,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x52,0x2, 0xb, 0x55,0xbe,0xf0,0x2, +0x68,0x3, 0x2, 0xb, 0x75,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x50,0x13,0xb2,0x7d, +0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x15,0x9d,0x12,0x49,0x20,0x13,0xb6,0x7d, +0xf2,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5f,0x3e,0x24,0x3e,0x24,0x2d, +0x25,0x2d,0x21,0x49,0x50,0x13,0xb8,0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x2d,0x15,0x9d,0x21,0x49,0x50,0x13,0xba,0x7d,0x15,0x3e,0x14,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10,0x13,0xbc,0x7d,0x21,0x3e, +0x24,0x2d,0x21,0x9d,0x52,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7d,0x23,0x3e,0x24,0x7e,0x14,0x0, 0x30,0xad,0x14,0x2d,0x21,0x2d,0x26,0x1b, +0x28,0x50,0x2, 0xd, 0x11,0x7e,0xa3,0x10,0x2b,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x68, +0x3, 0x2, 0xc, 0x11,0x3e,0x44,0x49,0x24,0x13,0xb2,0x7d,0x12,0x3e,0x14,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x4, 0x13,0xb0,0x7d,0x10,0x3e,0x14,0x2d,0x10, +0x9d,0x21,0x49,0x4, 0x13,0xb4,0x7d,0x10,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x10,0x9d,0x21,0x49,0x14,0x13,0xb6,0x7d,0xf1,0x3e,0xf4,0x3e,0xf4, +0x3e,0xf4,0x3e,0xf4,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x9d,0xf, 0x3e,0x14,0x3e,0x14,0x2d,0x10,0x2d,0x12,0x49,0x4, +0x13,0xb8,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x20, +0x9d,0x12,0x49,0x4, 0x13,0xba,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x20, +0x2d,0x21,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x2, 0xd, +0x0, 0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x76,0x1a,0xf, 0x3e,0x4, 0x49,0x30,0x13, +0xb0,0x7d,0x23,0x3e,0x24,0x2d,0x23,0x49,0x10,0x13,0xb2,0x7d,0x31,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x2d,0x31,0x9d,0x32,0x49,0x20,0x13,0xb4,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x49,0x20,0x13,0xb6,0x7d,0x12,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x9d,0x21,0x2d,0x23,0x49,0x30,0x13,0xb8,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x31,0x9d,0x23,0xe, +0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e,0x80,0x71,0x7e, +0xb3,0x10,0x2b,0x14,0xbc,0xbf,0x78,0x79,0x1a,0x5f,0x3e,0x54,0x49,0x25,0x13,0xb2, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9d,0x32,0x49,0x25,0x13,0xb0,0x3e,0x24, +0x9d,0x32,0x49,0x25,0x13,0xb4,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x24,0x9d,0x32,0x49,0x15,0x13,0xb6,0x7d,0x21, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x2, 0x7d,0x21,0x3e,0x24,0x2d,0x20,0x2d,0x21, +0x2d,0x23,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e, +0x3e,0x34,0x1a,0xf, 0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d,0x31,0x2d,0x36,0x1b,0x38, +0x20,0x1a,0x1e,0x3e,0x14,0x1a,0x2f,0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x23,0x2d, +0x21,0x2d,0x26,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x25,0xbc,0xbf,0x48,0x3, 0x2, 0x9, 0x37,0xb, 0xe0,0xe5,0x27,0xbc,0xbe,0x48,0x3, +0x2, 0x9, 0x6, 0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7e,0xb3,0xd, 0xf7,0xf5,0x2c, +0x75,0x10,0x0, 0xe4,0x7a,0xb3,0x15,0x54,0x7a,0xb3,0x15,0x55,0x6d,0x22,0x7e,0x34, +0x7f,0xff,0x7e,0x67,0xf, 0xda,0x6c,0xee,0xe4,0xa, 0x1e,0x19,0xb1,0x13,0xb6,0x6c, +0xaa,0x7e,0x10,0x2, 0xac,0x1e,0x19,0xa0,0x15,0x2b,0x19,0xb0,0x15,0x2c,0xe5,0x2c, +0xbc,0xbe,0x28,0x24,0x9, 0x20,0xd, 0x18,0x7e,0x30,0x18,0xac,0x23,0x9, 0x10,0xd, +0x19,0xa, 0x1, 0x2d,0x10,0x3e,0x14,0x2d,0x16,0xb, 0x18,0x10,0xbd,0x12,0x48,0x2, +0x7d,0x21,0xbd,0x13,0x18,0x2, 0x7d,0x31,0xb, 0xe0,0xbe,0xe0,0x14,0x78,0xb9,0x2d, +0x32,0xe, 0x34,0xe5,0x2c,0xbe,0xb0,0x2, 0x50,0x3, 0x2, 0x11,0x9d,0x6c,0xee,0x7e, +0x30,0x6, 0xac,0x3e,0x7d,0x51,0x2e,0x54,0x69,0x8f,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x23,0x58,0x20,0x7d,0x51,0x2e,0x54,0x69,0x91,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0x7a,0x25,0x30,0x2e,0x14,0x69,0x93,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0x7a,0x25,0x32,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc3,0x6c,0xee,0x2, 0x11, +0x8b,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19, +0xf5,0x23,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x13,0xb6,0x70,0xa, 0xa, 0x3e, +0xb, 0x34,0xa, 0x2e,0x19,0x72,0x13,0xb6,0xe5,0x2c,0x14,0xbc,0xbe,0x78,0x3, 0x2, +0x11,0x94,0xa, 0x5e,0xb, 0x54,0xf5,0x2d,0x2, 0x11,0x7f,0x7e,0x71,0x2d,0x74,0x2, +0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a,0xa1,0x24,0x9, 0xb3,0xd, 0x19,0xf5,0x25,0xa, +0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x2a,0xe5,0x25, +0xa, 0x2b,0xe5,0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x2b,0x75, +0x3d,0x2, 0x75,0x2f,0x0, 0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b, +0x2d,0x23,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0x7a,0x25,0x34,0x7e,0x11,0x24,0x74, +0x18,0xac,0x1b,0xe5,0x25,0xa, 0x1b,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0x7a,0x25,0x36,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0xe, 0x54,0x7a,0x55,0x38,0xbe,0x25,0x34,0x8, 0x14,0x7e,0x25,0x34, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x7a,0x25, +0x38,0xe5,0x2a,0xbe,0xb0,0x1, 0x38,0x37,0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x30,0x7c, +0xbf,0x54,0x2, 0xb4,0x2, 0x29,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, 0x20,0x7e, +0x71,0x22,0x74,0x18,0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d, +0x32,0xbe,0x35,0x38,0x18,0x3, 0x2, 0x11,0x13,0x75,0x2f,0x1, 0x2, 0x11,0x13,0xe5, +0x2a,0xbe,0xb0,0x1, 0x38,0xa, 0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x3, 0x2, 0x11,0x13, +0xe5,0x2a,0xbe,0xb0,0x4, 0x40,0x3, 0x2, 0x11,0x13,0xe5,0x2b,0xbe,0xb0,0x4, 0x40, +0x3, 0x2, 0x11,0x13,0x7c,0xbf,0x54,0x1, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x11,0x13, +0x6d,0x33,0x7a,0x35,0x3a,0x75,0x3c,0x0, 0x85,0x22,0x26,0x85,0x24,0x28,0xe5,0x24, +0xbe,0xb1,0x22,0x50,0x6, 0x85,0x24,0x26,0x85,0x22,0x28,0x85,0x23,0x27,0x85,0x25, +0x29,0xe5,0x25,0xbe,0xb1,0x23,0x50,0x6, 0x85,0x25,0x27,0x85,0x23,0x29,0x75,0x40, +0x0, 0x75,0x41,0x0, 0xe5,0x28,0xbe,0xb1,0x26,0x78,0x21,0x75,0x40,0x1, 0xe5,0x26, +0x60,0x5, 0xe5,0x26,0xb4,0xc, 0x3, 0x75,0x41,0x1, 0xe5,0x26,0xbe,0xb0,0x0, 0x28, +0x2, 0x15,0x26,0xe5,0x28,0xbe,0xb0,0xc, 0x50,0x2, 0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x27,0x78,0x21,0x75,0x40,0x1, 0xe5,0x27,0x60,0x5, 0xe5,0x27,0xb4,0x17,0x3, 0x75, +0x41,0x1, 0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x27,0xe5,0x29,0xbe,0xb0,0x17, +0x50,0x2, 0x5, 0x29,0x85,0x26,0x3e,0x80,0x78,0x85,0x27,0x3f,0x80,0x6a,0xe5,0x26, +0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x28,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x27,0xbe,0xb1, +0x3f,0x68,0x7, 0xe5,0x29,0xbe,0xb1,0x3f,0x78,0x24,0x7e,0x51,0x3e,0x74,0x18,0xac, +0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0xbe,0x24, +0x0, 0x0, 0x8, 0x6, 0x2e,0x25,0x3a,0x7a,0x25,0x3a,0x5, 0x3c,0x80,0x28,0x7e,0x51, +0x3e,0x74,0x18,0xac,0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0xbe,0x25,0x32,0x8, 0xc, 0xe5,0x3d,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x3d, +0x1, 0x80,0x3, 0x75,0x3d,0x0, 0x5, 0x3f,0xe5,0x29,0xbe,0xb1,0x3f,0x50,0x8f,0x5, +0x3e,0xe5,0x28,0xbe,0xb1,0x3e,0x50,0x81,0x7e,0x51,0x28,0x74,0x18,0xac,0x5b,0xe5, +0x27,0xa, 0x4b,0x2d,0x24,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x50,0x7e,0x25,0x3a,0x9d, +0x25,0x7e,0x31,0x26,0x74,0x18,0xac,0x3b,0xe5,0x29,0xa, 0xb, 0x7d,0x51,0x2d,0x50, +0x3e,0x54,0x2d,0x56,0xb, 0x58,0x50,0x9d,0x25,0x2d,0x14,0x3e,0x14,0x2d,0x16,0xb, +0x18,0x10,0x9d,0x21,0x7e,0x31,0x28,0x74,0x18,0xac,0x3b,0x2d,0x10,0x3e,0x14,0x2d, +0x16,0xb, 0x18,0x10,0x9d,0x21,0x7a,0x25,0x3a,0x7e,0x25,0x36,0x2e,0x25,0x34,0x7a, +0x25,0x38,0xe5,0x40,0xb4,0x1, 0x11,0xe5,0x41,0x70,0xd, 0x7e,0x25,0x3a,0x9e,0x25, +0x38,0x7a,0x25,0x3a,0x15,0x3c,0x15,0x3c,0xe5,0x3c,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x3c,0x24,0xfc,0xf5,0x3c,0x7e,0x25,0x3a,0xbe,0x24,0x0, 0x0, 0x58,0x3, 0x7a,0x35, +0x3a,0x7e,0x15,0x38,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x30,0x1a,0x26,0x1a,0x24,0x12, +0x48,0x85,0xe5,0x3c,0xa, 0x1b,0x6d,0x0, 0x12,0x48,0x85,0x7f,0x21,0x7e,0x35,0x3a, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x48,0x96,0xbf,0x12,0x8, 0xa, 0xe5, +0x3d,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x2f,0x2, 0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, +0x75,0x2f,0x2, 0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x63,0xe5,0x2f,0xa, 0x3b,0x2e,0x34, +0x15,0x53,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2d,0xa, 0x3b,0x9, 0xb3,0x13, +0xb6,0x70,0xc, 0xa, 0x2e,0x9, 0x52,0x13,0xb6,0x19,0x53,0x13,0xb6,0x80,0x3e,0x75, +0x2e,0x0, 0x80,0x32,0x9, 0x33,0x13,0xb6,0xa, 0x2e,0x9, 0xa2,0x13,0xb6,0xbc,0xa3, +0x28,0x12,0xe5,0x2e,0xa, 0x2b,0x9, 0x22,0x13,0xb6,0xbc,0x2a,0x78,0x16,0x19,0x32, +0x13,0xb6,0x80,0x10,0xe5,0x2e,0xa, 0x2b,0x9, 0xb2,0x13,0xb6,0xbc,0xb3,0x78,0x4, +0x19,0xa2,0x13,0xb6,0x5, 0x2e,0xe5,0x2c,0xbe,0xb1,0x2e,0x38,0xc7,0x5, 0x2d,0xe5, +0x2c,0xbe,0xb1,0x2d,0x28,0x3, 0x2, 0xe, 0x3b,0xb, 0xe0,0xe5,0x2c,0xbc,0xbe,0x28, +0x3, 0x2, 0xe, 0x1, 0x7e,0x34,0x13,0xb6,0x12,0x3b,0x6a,0xf5,0x10,0xda,0x3b,0x22, +0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55, +0x7e,0x37,0xf, 0x61,0x7a,0x35,0x3e,0x6c,0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0xe4,0x19,0xb3,0xd, 0x71,0xa, 0x5d,0x3e,0x54,0xb, 0x54,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x39,0x9, 0xb3,0xd, 0x19,0xf5,0x3a, +0xbe,0xd1,0x3a,0x28,0x3, 0x2, 0x12,0xe, 0x7e,0xb3,0x10,0x2c,0xa, 0xb, 0x1b,0x4, +0xa, 0x3d,0x9d,0x3, 0xe5,0x3a,0xa, 0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0xe, 0x7c, +0x3a,0xa, 0x4d,0xe5,0x3a,0xa, 0xb, 0x9d,0x4, 0x7c,0x51,0x2, 0x12,0x59,0xbe,0xd1, +0x3a,0x38,0x3, 0x2, 0x12,0x27,0xe5,0x3a,0xa, 0xb, 0xa, 0x3d,0x2d,0x30,0xb, 0x34, +0x7c,0x37,0x6c,0x55,0x2, 0x12,0x59,0xa, 0xfd,0xe5,0x3a,0xa, 0x4b,0x2d,0xf4,0x7e, +0xb3,0x10,0x2c,0xa, 0xb, 0x7d,0x30,0x1b,0x34,0xbd,0xf3,0x18,0x3, 0x2, 0x12,0x59, +0xbd,0x43,0x8, 0x3, 0x2, 0x12,0x59,0xa, 0x3d,0x2d,0x30,0xe5,0x3a,0xa, 0xb, 0x9d, +0x30,0x7c,0x37,0xa, 0x3d,0x9d,0x3, 0x7c,0x51,0xbe,0xd1,0x39,0x28,0x3, 0x2, 0x12, +0x83,0x7e,0xb3,0x10,0x2b,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5,0x39,0xa, +0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0x83,0x7c,0x4a,0xa, 0xd, 0xe5,0x39,0xa, 0x3b, +0x2, 0x12,0xca,0xbe,0xd1,0x39,0x38,0x3, 0x2, 0x12,0x9c,0xe5,0x39,0xa, 0xb, 0xa, +0x3d,0x2d,0x30,0xb, 0x34,0x7c,0x47,0x6c,0x22,0x2, 0x12,0xce,0xa, 0x4d,0xe5,0x39, +0xa, 0x5b,0x2d,0x45,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7d,0x3, 0x1b,0x4, 0xbd,0x40, +0x18,0x3, 0x2, 0x12,0xce,0xbd,0x50,0x8, 0x3, 0x2, 0x12,0xce,0xa, 0xd, 0x2d,0x3, +0xe5,0x39,0xa, 0x3b,0x9d,0x3, 0x7c,0x41,0xa, 0xd, 0x9d,0x30,0x7c,0x27,0x7e,0x37, +0xf, 0xda,0x7c,0xb2,0x7e,0x23,0xf, 0x53,0x7e,0x4, 0x9, 0xc8,0x12,0x5c,0x9d,0x7e, +0x37,0x9, 0xc8,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xca,0x7d,0x20,0x7a,0x1d,0x28, +0x7e,0x37,0x9, 0xcc,0x7d,0x3, 0x7e,0x37,0x9, 0xce,0x7d,0x20,0x7a,0x1d,0x2c,0x7e, +0x37,0x9, 0xd0,0x7d,0x3, 0x7e,0x37,0x9, 0xd2,0x7d,0x20,0x7a,0x1d,0x30,0x7e,0x37, +0x9, 0xd4,0x7d,0x3, 0x7e,0x37,0x9, 0xd6,0x7d,0x20,0x7a,0x1d,0x34,0xa, 0x2d,0xe5, +0x39,0xa, 0x3b,0x9d,0x32,0x7c,0xc7,0x2, 0x15,0x24,0xa, 0x4d,0xe5,0x3a,0xa, 0x5b, +0x9d,0x54,0xf5,0x38,0x2, 0x15,0xd, 0xbe,0xc0,0x0, 0x58,0x3, 0x2, 0x15,0xb, 0x7e, +0x73,0x10,0x2b,0xbc,0x7c,0x18,0x3, 0x2, 0x15,0xb, 0xe5,0x38,0xbe,0xb0,0x0, 0x58, +0x3, 0x2, 0x15,0xb, 0x7e,0x73,0x10,0x2c,0xbe,0x71,0x38,0x18,0x3, 0x2, 0x15,0xb, +0xe5,0x38,0x1a,0x1b,0x3e,0x14,0x1a,0x2c,0x7e,0x34,0x0, 0x30,0xad,0x32,0x2d,0x31, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x7e,0x53,0xf, 0x53,0xa, 0x25,0x9d,0x32,0x7a, +0x35,0x3c,0xbe,0x34,0x0, 0x0, 0x18,0x3, 0x2, 0x15,0xb, 0x7e,0x35,0x3e,0xbe,0x35, +0x3c,0x28,0x3, 0x2, 0x13,0xa6,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xd, 0x71,0x7e, +0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x39,0xa, 0x2b,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x13,0xd0,0xe5,0x3a,0xa, 0x2b,0xe5,0x38, +0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x2, 0x15,0xb, +0x75,0x3b,0x0, 0x2, 0x14,0x60,0xbe,0xe1,0x3b,0x78,0x3, 0x2, 0x14,0x5e,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe, +0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0x75,0x3b,0xff,0x2, 0x14,0x6c,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe, +0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0x75,0x3b,0x0, 0x2, 0x14,0x6c,0x5, 0x3b, +0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x3b,0x8, 0x3, 0x2, 0x13,0xd6,0xe5,0x3b,0x60,0x3, +0x2, 0x14,0xc0,0x7e,0x35,0x3c,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x3c,0x7e, +0xf5,0x3c,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x85,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a, +0x2, 0x7f,0x17,0x12,0x48,0x85,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34, +0x7e,0x1d,0x28,0x9f,0x17,0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30, +0xe5,0x3b,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x15,0xb, 0x7e,0xf5,0x3c,0x7d,0x3f,0x1a, +0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48,0x85,0x7f,0x1, 0x7e,0x1d, +0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x85,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34,0x7e,0x1d,0x28,0x9f,0x17, +0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30,0x5, 0x38,0xa, 0x2d,0xe5, +0x3a,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x38,0x1a,0x3b,0xbd,0x32,0x18,0x3, 0x2, +0x13,0x37,0xb, 0xc0,0xa, 0x2d,0xe5,0x39,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0x1a,0x3c, +0xbd,0x32,0x18,0x3, 0x2, 0x13,0x2a,0x74,0x6, 0x7e,0x1d,0x2c,0x2f,0x11,0x14,0x78, +0xfb,0x7a,0x1d,0x2c,0x7e,0xd, 0x28,0x7e,0x1d,0x2c,0x12,0x48,0xa1,0x2e,0x34,0x0, +0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xd, 0x6b,0x74,0x6, 0x7e,0x1d,0x34,0x2f, +0x11,0x14,0x78,0xfb,0x7a,0x1d,0x34,0x7e,0x7d,0x30,0x7e,0x1d,0x34,0x7f,0x7, 0x12, +0x48,0xa1,0x2e,0x34,0x0, 0x20,0x59,0x36,0xd, 0x6d,0x7e,0xb3,0xf, 0x60,0x7f,0x17, +0x70,0x3, 0x2, 0x15,0x91,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7a,0x1d,0x30,0xbe,0x18,0x0, 0x7f,0x38,0x3, 0x2, 0x15,0xa4,0x7e,0x18,0x0, +0x7f,0x7a,0x1d,0x30,0x7e,0x2d,0x30,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0x71,0x7e,0x70,0x7, 0xac,0x7f,0x19, +0xa3,0xd, 0x71,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xd, 0x71,0xbe,0x70,0xf, 0x38,0x3, +0x2, 0x15,0xdf,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xd, 0x71,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x11, +0x96,0xa5,0xbe,0x1, 0x58,0x7e,0xa3,0x10,0x2b,0xbc,0xa7,0x28,0xd, 0x7a,0x71,0xd, +0x74,0x30,0xac,0x7b,0x2e,0x37,0x16,0x9b,0x80,0x3c,0x7a,0x71,0xd, 0xbc,0xa7,0x78, +0x6, 0x7e,0x34,0x8, 0x9a,0x80,0x2f,0xa, 0x2a,0x7d,0x2, 0xb, 0x4, 0xa, 0x17,0xbd, +0x10,0x78,0x6, 0x7e,0x34,0x8, 0xca,0x80,0x1d,0x7d,0x2, 0xb, 0x5, 0xbd,0x10,0x78, +0x6, 0x7e,0x34,0x9, 0x2e,0x80,0xf, 0x2e,0x24,0x0, 0x3, 0xbd,0x12,0x68,0x3, 0x2, +0x19,0x6a,0x7e,0x34,0x9, 0x5e,0x7a,0x37,0x0, 0xfb,0x2, 0x19,0x6a,0xa5,0xbe,0x0, +0x46,0x7e,0x64,0x0, 0xb, 0x7a,0x69,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf,0x1, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, +0x74,0x1, 0x7e,0x70,0x1, 0x80,0x36,0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3, +0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x21,0x74,0x27,0x7e,0x70, +0x3, 0x12,0x6d,0xe0,0x2, 0x19,0x6a,0xa5,0xbe,0x2, 0x23,0xa5,0xbf,0x4, 0x7, 0x74, +0x1, 0x7e,0x70,0x4, 0x80,0x7, 0xa5,0xbf,0x5, 0x9, 0xe4,0x6c,0x77,0x12,0x0, 0x5e, +0x2, 0x19,0x6a,0xbe,0x70,0x1, 0x50,0x3, 0x2, 0x19,0x6a,0x2, 0x19,0x6a,0xa5,0xbe, +0x3, 0x15,0xbe,0x70,0xd, 0x28,0x9, 0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x2, 0x19,0x6a, +0x7a,0x73,0x10,0x2b,0x2, 0x19,0x6a,0xa5,0xbe,0x4, 0x15,0xbe,0x70,0x18,0x28,0x9, +0x74,0x18,0x7a,0xb3,0x10,0x2c,0x2, 0x19,0x6a,0x7a,0x73,0x10,0x2c,0x2, 0x19,0x6a, +0xa5,0xbe,0x5, 0x7, 0x7a,0x73,0x10,0x2d,0x2, 0x19,0x6a,0xa5,0xbe,0x7, 0x1e,0x7a, +0x73,0x10,0x4b,0x7c,0xb7,0x54,0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0x10, +0x54,0x5e,0x70,0x3, 0x4d,0x32,0x7a,0x37,0x10,0x54,0x2, 0x19,0x6a,0xa5,0xbe,0x8, +0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xac,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x16,0x2, 0x19,0x6a,0xa5,0xbe,0x9, 0x1c,0xbe,0x70,0xa, 0x50,0x3, 0x7e,0x70, +0xa, 0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xad,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x49,0x2, 0x19,0x6a,0xa5,0xbe,0xa, 0x10,0xa5,0xbf,0x0, 0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x10,0x3b,0x2, 0x19,0x6a,0xa5,0xbe,0xb, 0x14,0x7e,0xb3,0x10, +0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xae,0x2, 0x19,0x6a,0x7a,0x73,0x11,0x94,0x2, 0x19, +0x6a,0xa5,0xbe,0xc, 0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xd, 0xfe,0x2, +0x19,0x6a,0x7a,0x73,0x11,0x9d,0x2, 0x19,0x6a,0xa5,0xbe,0x4c,0x7, 0x7a,0x73,0xf, +0x46,0x2, 0x19,0x6a,0xa5,0xbe,0xfb,0x29,0x7a,0x71,0x8, 0x7e,0x37,0x10,0x50,0x5e, +0x70,0xdf,0x7a,0x37,0x10,0x50,0xe5,0x8, 0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x4e,0x37,0x10,0x50,0x7a,0x37,0x10,0x50,0x2, 0x19, +0x6a,0xa5,0xbe,0x4e,0x7, 0x7a,0x73,0x10,0x4a,0x2, 0x19,0x6a,0xa5,0xbe,0x4f,0x6, +0x12,0x0, 0x6, 0x2, 0x19,0x6a,0xbe,0x60,0x50,0x40,0x12,0xbe,0x60,0x51,0x38,0xd, +0xa, 0x26,0x2e,0x27,0x10,0x2f,0x9e,0x24,0x0, 0x50,0x2, 0x19,0x54,0xbe,0x60,0x52, +0x40,0x12,0xbe,0x60,0x55,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x31,0x9e,0x24,0x0, +0x52,0x2, 0x19,0x54,0xbe,0x60,0x56,0x40,0x12,0xbe,0x60,0x62,0x38,0xd, 0xa, 0x26, +0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x56,0x2, 0x19,0x54,0xbe,0x60,0x63,0x40,0x12, +0xbe,0x60,0x7a,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x63,0x2, +0x19,0x54,0xbe,0x60,0x7b,0x50,0x3, 0x2, 0x18,0xe8,0xbe,0x60,0x9f,0x28,0x3, 0x2, +0x18,0xe8,0x7e,0xb3,0x10,0x3b,0x70,0x48,0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24, +0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29, +0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f,0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17, +0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29, +0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, 0x2f,0x19,0x72,0xf, 0xdc,0x2, 0x19,0x6a, +0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27, +0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29,0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f, +0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17,0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27, +0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29,0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, +0x2f,0x19,0x72,0xf, 0x63,0x2, 0x19,0x6a,0xbe,0x60,0xa0,0x40,0x11,0xbe,0x60,0xac, +0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6c,0x9e,0x24,0x0, 0xa0,0x80,0x56,0xbe,0x60, +0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6e,0x9e,0x24, +0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38,0xc, 0xa, 0x26, +0x2e,0x27,0x10,0x70,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2,0x40,0x11,0xbe, +0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x72,0x9e,0x24,0x0, 0xd2,0x80,0x14, +0xbe,0x60,0xd6,0x40,0x14,0xbe,0x60,0xed,0x38,0xf, 0xa, 0x26,0x2e,0x27,0x10,0x74, +0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x80,0x11,0xa5,0xbe,0xf8,0x6, 0x7a,0x73,0x11, +0xe8,0x80,0x7, 0xa5,0xbe,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x3b,0x22,0xca,0x3b,0xe4, +0x7a,0xb3,0x13,0xde,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x23,0x6c,0xee,0x7e,0xa0,0xff, +0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0xff,0xa, 0x3e,0x19,0xb3,0x13, +0xca,0x7e,0x34,0xff,0xff,0x74,0x2, 0xac,0xbe,0x59,0x35,0x13,0xb6,0xe4,0xa, 0x3e, +0x19,0xb3,0x13,0xd4,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xd2,0x7e,0xb3,0xf, 0x1b,0x60, +0x3, 0x2, 0x19,0xe5,0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0x2, 0x1c,0x18,0x6c,0xee,0x7e, +0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, +0x78,0xdd,0x2, 0x1c,0x18,0x7e,0xb3,0xf, 0x1c,0x60,0x3, 0x2, 0x1a,0x38,0x6c,0xee, +0x2, 0x1a,0x2d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5e, +0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19, +0xe5,0xe, 0x11,0x74,0x1, 0xa, 0x3e,0x19,0xb3,0x13,0xd4,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0xbe,0x2, 0x1c,0x18,0x6c,0xee,0x2, 0x1a,0xb7,0x6c,0xff,0xa, +0x3f,0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x1a,0xae, +0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x1a,0xae,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23, +0x49,0x23,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x9d,0x32,0x12,0x6e, +0x11,0x7d,0x63,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23,0x49,0x23,0x0, 0x14,0x74, +0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6e,0x11,0x2d,0x36,0x7a,0x35, +0x21,0x74,0x2, 0xac,0xbe,0x49,0x45,0x13,0xb6,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x1a, +0xae,0xa, 0x4e,0x19,0xf4,0x13,0xca,0x7e,0x35,0x21,0x59,0x35,0x13,0xb6,0xb, 0xf0, +0xbe,0xf0,0xa, 0x78,0x8a,0xb, 0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, +0x1a,0x3d,0x6c,0xee,0x2, 0x1b,0x6e,0x74,0x1, 0x7a,0xb3,0x13,0xde,0x6c,0xff,0x2, +0x1b,0xd, 0xbc,0xfe,0x78,0x3, 0x2, 0x1b,0xb, 0xa, 0x3f,0x9, 0x63,0x13,0xca,0xa, +0x2e,0x9, 0x72,0x13,0xca,0xbc,0x76,0x68,0x3, 0x2, 0x1b,0xb, 0x74,0x2, 0xac,0xbf, +0x49,0x25,0x13,0xb6,0x74,0x2, 0xac,0xbe,0x49,0x35,0x13,0xb6,0xbd,0x32,0x50,0x3, +0x2, 0x1b,0xb, 0xe4,0x7a,0xb3,0x13,0xde,0x2, 0x1b,0x15,0xb, 0xf0,0x7e,0x73,0xf, +0x1b,0xbc,0x7f,0x38,0xbd,0x7e,0xb3,0x13,0xde,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1b, +0x6c,0x74,0x1, 0xa, 0x3e,0x9, 0xa3,0x13,0xca,0xa, 0x4a,0x19,0xb4,0x13,0xd4,0x7e, +0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, +0xa, 0x2e,0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32, +0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0xa, 0x2e,0x9, 0x42,0x13,0xca, +0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0x7e,0x73, +0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, 0x1a,0xc7,0x6c,0xee,0x2, 0x1b,0xdd,0x74,0x7, +0xac,0xbe,0x9, 0xb5,0xe, 0x11,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x1b,0xdb,0x6c,0xff, +0xa, 0x3f,0x9, 0xb3,0x13,0xd4,0x60,0x3, 0x2, 0x1b,0xd4,0x74,0x1, 0x19,0xb3,0x13, +0xd4,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0x50,0x2, +0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19,0xf5,0xe, +0x11,0x2, 0x1b,0xdb,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xb5,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0x99,0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13,0xd4,0xbe,0xb0,0x1, +0x78,0x3, 0x2, 0x1c,0x11,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x14,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, +0x28,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xcf,0x7e,0xf3,0xf, 0x1b,0x6c,0xee,0xa, 0x3e, +0x9, 0xb3,0x13,0xd4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x6a,0xa, 0x3e,0x2e,0x35, +0x23,0x9, 0xb3,0x0, 0xa, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x43,0x74,0x3, 0x19, +0xb3,0x0, 0xa, 0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xa3,0x0, 0xa, 0xbe,0xa0,0x3, 0x68, +0x3, 0x2, 0x1c,0x5b,0xe4,0x7a,0x39,0xb0,0x2, 0x1c,0x98,0x4c,0xaa,0x68,0x3, 0x2, +0x1c,0x98,0x74,0x2, 0x7a,0x39,0xb0,0x2, 0x1c,0x98,0xa, 0x3e,0x2e,0x35,0x23,0x9, +0xb3,0x0, 0xa, 0xbe,0xb0,0x2, 0x78,0x3, 0x2, 0x1c,0x80,0x60,0x3, 0x2, 0x1c,0x93, +0x74,0x1, 0x7a,0x39,0xb0,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4,0x19,0xe5,0xe, 0x11, +0x2, 0x1c,0x98,0x74,0x3, 0x7a,0x39,0xb0,0xa, 0x2e,0x2e,0x25,0x23,0x7e,0x29,0x70, +0x19,0x72,0x0, 0xa, 0xb, 0xe0,0xbe,0xe0,0xa, 0x50,0x3, 0x2, 0x1c,0x1e,0xda,0x3b, +0x22,0xca,0x3b,0x75,0x24,0x0, 0x75,0x26,0x0, 0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e, +0x34,0xe, 0xdf,0x7a,0x35,0x2a,0x7e,0xa3,0xf, 0x24,0x4c,0xaa,0x78,0xf, 0x7e,0xb3, +0xf, 0x20,0x70,0x9, 0x7e,0xb3,0xf, 0x21,0x70,0x3, 0x2, 0x1f,0x70,0x4c,0xaa,0x78, +0x11,0x7e,0xb3,0xf, 0x20,0x60,0x16,0x80,0x9, 0x7e,0x73,0x16,0xba,0xbe,0x70,0xf, +0x38,0x6, 0x7e,0xb3,0x15,0xde,0x60,0xf1,0xe4,0x7a,0xb3,0x15,0xde,0x20,0x0, 0x6, +0x7e,0x74,0x0, 0x76,0x80,0x4, 0x7e,0x74,0x0, 0xb8,0x7d,0x37,0x7e,0x24,0x0, 0x42, +0x74,0xff,0x12,0x6e,0x21,0x74,0xaa,0x7a,0x79,0xb0,0x19,0xb7,0x0, 0x1, 0x7e,0x73, +0xf, 0x1d,0x19,0x77,0x0, 0x3, 0x75,0x25,0x0, 0x6c,0xdd,0x2, 0x1e,0xfd,0x7e,0x70, +0x7, 0xac,0x7d,0x9, 0xa3,0xe, 0x9d,0x7a,0xa1,0x29,0x7c,0xba,0x54,0xf, 0xa, 0x2b, +0x2e,0x25,0x2a,0x7e,0x29,0xc0,0x7c,0xba,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x13,0xb4, +0xb0,0x2, 0x80,0x3, 0x2, 0x1e,0xfb,0x53,0x29,0xf, 0xbe,0xc0,0x1, 0x68,0x3, 0x2, +0x1e,0xfb,0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x1e,0xfb,0x7e,0xa1,0x25,0x74,0x6, 0xa4, +0xf5,0x21,0x9, 0xb3,0xe, 0x9e,0xf5,0x27,0x74,0x7, 0xac,0xbd,0x9, 0xb5,0xe, 0x9f, +0xc4,0x54,0xf0,0xf5,0x28,0x7e,0x73,0xf, 0x46,0xbe,0x71,0x29,0x28,0x68,0x7e,0xb3, +0xf, 0x22,0x70,0x2a,0x7e,0x8, 0x0, 0x27,0xe5,0x29,0xa, 0x3b,0x2e,0x34,0x15,0xca, +0x74,0x1, 0x7e,0x50,0xf, 0x12,0x5f,0xe0,0x7e,0x8, 0x0, 0x28,0xe5,0x29,0xa, 0x3b, +0x2e,0x34,0x15,0xd4,0x74,0x10,0x7e,0x50,0x20,0x12,0x5f,0xe0,0x80,0x14,0xe5,0x29, +0xa, 0x3b,0x9, 0xb3,0x15,0xca,0xf5,0x27,0xe5,0x29,0xa, 0x3b,0x9, 0xb3,0x15,0xd4, +0xf5,0x28,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x2e,0x25,0x2a,0x7e,0x29,0xb0,0xb4,0x1, +0x15,0xe4,0x19,0xb3,0x15,0xca,0x6c,0xaa,0xe5,0x29,0xa, 0x3b,0x19,0xa3,0x15,0xd4, +0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0xf, 0x5f,0xb4,0xff,0x15,0x74,0x7, 0xac, +0xbd,0x9, 0xb5,0xe, 0x9d,0xbe,0xb0,0xff,0x68,0x5, 0x75,0x27,0x1, 0x80,0x3, 0x75, +0x27,0x0, 0x7e,0x90,0x7, 0xac,0x9d,0x49,0x54,0xe, 0x99,0x7a,0x55,0x2c,0x49,0x54, +0xe, 0x9b,0x7a,0x55,0x2e,0xbe,0xc0,0x1, 0x78,0x2e,0x75,0x30,0x0, 0x7e,0x71,0x30, +0x74,0x7, 0xac,0x7b,0x9, 0xb3,0x15,0xe3,0x54,0xf, 0xbe,0xb1,0x29,0x78,0x10,0x49, +0x23,0x15,0xdf,0x7a,0x25,0x2c,0x49,0x53,0x15,0xe1,0x7a,0x55,0x2e,0x80,0x9, 0x5, +0x30,0xe5,0x30,0xbe,0xb0,0xa, 0x40,0xd5,0x7e,0x25,0x2c,0x7a,0x25,0x22,0xa, 0x54, +0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x21,0xa, 0x3b,0x7d,0x13,0x2d,0x17,0x19,0xa1, +0x0, 0x5, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x6, 0x7e,0x25,0x2e,0x7a,0x25,0x22, +0xa, 0x14,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x57,0x19,0x35,0x0, 0x7, 0x7d,0x53, +0x2d,0x57,0x19,0x55,0x0, 0x8, 0xe5,0x27,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0x9, +0xe5,0x28,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0xa, 0x9, 0xa4,0xe, 0x9d,0x7c,0xba, +0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x27,0x2e,0x24,0x0, 0x7, 0x7e,0x29,0xb0, +0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x21,0xbe,0xc0,0x1, 0x68,0x2, 0x5, +0x24,0x5, 0x26,0x7c,0xbc,0x3, 0x3, 0x54,0xc0,0x7d,0x13,0x2d,0x17,0x2e,0x14,0x0, +0x5, 0x7e,0x19,0x50,0x2c,0x5b,0x7a,0x19,0x50,0x80,0xe, 0x2d,0x37,0x2e,0x34,0x0, +0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x25,0xb, 0xd0,0x7e,0x73,0xf, +0x46,0xbc,0x7d,0x28,0x3, 0x2, 0x1d,0x2e,0xe5,0x24,0x19,0xb7,0x0, 0x4, 0xe5,0x26, +0xbe,0xb0,0x0, 0x28,0x2d,0x74,0x42,0x19,0xb7,0x0, 0x2, 0xe4,0x19,0xb7,0x0, 0x41, +0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e,0x24,0x0, 0x41,0x7e, +0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x41,0x78,0xe4,0xb2,0x0, +0x80,0xe, 0x7e,0xb3,0xf, 0x21,0xb4,0x1, 0xc, 0x7e,0xb3,0x10,0xd1,0xb4,0x24,0x5, +0x74,0x1, 0x12,0x6e,0xd3,0x7e,0xb3,0xf, 0x20,0x60,0x6, 0x7e,0x35,0x2a,0x12,0x68, +0x79,0xe4,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x20,0x7a,0xb3,0xf, 0x21,0x80,0x4, +0xe4,0x12,0x6e,0xd3,0x7e,0x24,0xe, 0x99,0x7e,0x34,0x15,0xdf,0x7e,0x14,0x0, 0x46, +0x12,0x6d,0x7d,0xe5,0x26,0x70,0xd, 0x7e,0x34,0x15,0xdf,0x7e,0x24,0x0, 0x46,0x74, +0xff,0x12,0x6e,0x21,0xda,0x3b,0x22,0xca,0x79,0x75,0x26,0x17,0x7e,0xb3,0xd, 0xf7, +0xf5,0x21,0x70,0x3, 0x2, 0x22,0x39,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x1, 0x2b,0xe4, +0x12,0x6e,0x21,0x7e,0x34,0x14,0xe1,0x7e,0x24,0x0, 0x2, 0xe4,0x12,0x6e,0x21,0x6c, +0xaa,0x2, 0x20,0x4e,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, 0x18,0x9, 0x23,0xd, +0x19,0x1a,0x3, 0x1b,0x5, 0x80,0x69,0xbe,0x10,0x0, 0x48,0x62,0xbe,0x10,0xd, 0x58, +0x5d,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, +0x7e,0x74,0x0, 0x1, 0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x7c,0xef,0xa, 0x40,0x2e, +0x44,0x14,0xe1,0x7e,0x49,0xb0,0x4c,0xbe,0x7a,0x49,0xb0,0x1a,0x32,0x1b,0x35,0x7c, +0xf7,0x80,0x1f,0xbe,0xf0,0x0, 0x48,0x18,0xe5,0x26,0xbc,0xbf,0x8, 0x12,0x74,0x1, +0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0x4f,0x2d,0x43,0x19,0xb4,0x13,0xb6, +0xb, 0xf0,0x1a,0x22,0x2e,0x24,0x0, 0x3, 0x1a,0x3f,0xbd,0x32,0x48,0xd5,0xb, 0x10, +0x1a,0x23,0x2e,0x24,0x0, 0x3, 0x1a,0x31,0xbd,0x32,0x48,0x8b,0xb, 0xa0,0xe5,0x21, +0xbc,0xba,0x28,0x3, 0x2, 0x1f,0xc4,0x6c,0x11,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, +0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0xe9,0xa, 0x30,0x9, 0xb3,0x14,0xe1,0x5c,0xbe,0x78,0x3, 0x2, +0x21,0x15,0x6d,0x33,0x7a,0x35,0x22,0x75,0x24,0x0, 0x1a,0x21,0x7e,0x34,0x0, 0x30, +0xad,0x32,0x7d,0x43,0x2e,0x47,0xf, 0xda,0x6c,0x0, 0x80,0x26,0x1a,0xe1,0x7e,0xf4, +0x0, 0x17,0xad,0xfe,0xa, 0x30,0x2d,0x3f,0x9, 0xb3,0x13,0xb6,0x70,0x12,0x7e,0x70, +0x2, 0xac,0x70,0x2d,0x34,0xb, 0x38,0x30,0x2e,0x35,0x22,0x7a,0x35,0x22,0x5, 0x24, +0xb, 0x0, 0xe5,0x26,0xbc,0xb0,0x38,0xd4,0xe5,0x24,0x60,0x49,0xe5,0x24,0x1a,0x2b, +0x7e,0x35,0x22,0x12,0x48,0x53,0x7a,0x35,0x22,0x6c,0xff,0x80,0x32,0x1a,0x21,0x7e, +0x34,0x0, 0x17,0xad,0x32,0x1a,0xff,0x7d,0xe3,0x2d,0xef,0x9, 0xbe,0x13,0xb6,0xb4, +0x1, 0x1b,0x1a,0x21,0x7e,0x34,0x0, 0x18,0xad,0x32,0x7d,0x23,0x2d,0x2f,0x3e,0x24, +0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x9e,0x35,0x22,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x26,0xbc,0xbf,0x18,0xc8,0xb, 0x10,0xa5,0xb9,0xd, 0x2, 0x80,0x3, 0x2, 0x20,0x59, +0x6c,0xaa,0x2, 0x22,0x30,0x7e,0x10,0x2, 0xac,0x1a,0x9, 0x30,0xd, 0x18,0x9, 0x20, +0xd, 0x19,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xf5,0x25,0x7c,0xba,0x54,0x7, 0x7e,0x44, +0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa5,0xbb,0x0, 0x2c,0x1a, +0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, +0xda,0xb, 0x38,0x20,0x49,0x33,0x0, 0x30,0xbd,0x32,0x18,0x3, 0x2, 0x21,0xf5,0x1a, +0x33,0xb, 0x34,0x7c,0xb7,0x19,0xb0,0xd, 0x18,0x80,0x7a,0xa5,0xbb,0xc, 0x2c,0x1a, +0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x22,0x2d,0x23,0x3e,0x24,0x2e,0x27,0xf, +0xda,0xb, 0x28,0x30,0x49,0x2, 0xff,0xd0,0xbd,0x3, 0x8, 0x59,0x1a,0x33,0x1b,0x34, +0x7e,0x10,0x2, 0xac,0x1a,0x19,0x70,0xd, 0x18,0x80,0x4a,0x1a,0xe3,0x7e,0xf4,0x0, +0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x49,0x43,0x0, +0x30,0x49,0x3, 0xff,0xd0,0xbd,0x4, 0x8, 0x16,0xb, 0x38,0x20,0xbd,0x2, 0x8, 0x25, +0x1a,0x23,0x1b,0x24,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x50,0xd, 0x18,0x80,0x16,0xb, +0x38,0x0, 0xbd,0x40,0x8, 0xf, 0x1a,0x33,0xb, 0x34,0x7c,0x37,0x7e,0x10,0x2, 0xac, +0x1a,0x19,0x30,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, 0x18,0x1a,0x23, +0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x2, 0x2d,0x3, 0x3e,0x4, 0x2e,0x7, 0xf, 0xda, +0xb, 0x8, 0x0, 0xbe,0x4, 0x0, 0x3c,0x58,0x15,0x7c,0x7e,0x6e,0x70,0xff,0xe5,0x25, +0xa, 0x4b,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x5c,0xb7,0x7a,0x49,0xb0,0xb, 0xa0, +0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x21,0x25,0xda,0x79,0x22,0xca,0xd8,0xca,0x79, +0x6c,0xaa,0x7e,0x34,0x11,0x9e,0x7e,0x44,0x11,0x4a,0xe4,0x7a,0xb3,0x16,0xbb,0x7e, +0xb3,0xe, 0xa, 0x54,0xfe,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, 0x17,0xbe,0xb0,0x0, +0x28,0x4f,0x7e,0x53,0xd, 0xf8,0xbe,0x50,0x0, 0x28,0x46,0x6c,0xff,0x80,0x3c,0x7e, +0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x40,0x9, 0xe1,0xd, 0x41,0x7e,0x30,0x2, 0xac, +0x3e,0x2d,0x13,0xb, 0x18,0x0, 0x6d,0x11,0x9e,0x17,0xf, 0x4c,0xbd,0x1, 0x58,0x19, +0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x13,0x49,0x1, 0x0, 0x30,0x6d,0x11,0x9e,0x17,0xf, +0x4a,0xbd,0x1, 0x58,0x4, 0x5, 0x1d,0x80,0xb, 0xb, 0xf0,0xbc,0x5f,0x38,0xc0,0x80, +0x3, 0x75,0x1d,0x0, 0xe5,0x1d,0xbe,0xb0,0x3, 0x40,0x17,0x7e,0xb3,0xe, 0xa, 0x44, +0x1, 0x7a,0xb3,0xe, 0xa, 0x75,0x1d,0x0, 0x7e,0xb3,0x16,0xbb,0x44,0x1, 0x7a,0xb3, +0x16,0xbb,0x7e,0xb3,0xe, 0xa, 0x54,0xfd,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, 0x16, +0x70,0x59,0x7e,0x53,0xd, 0xf7,0xbe,0x50,0x0, 0x28,0x50,0x6c,0xff,0x80,0x48,0x7e, +0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x18,0x9, 0xe1,0xd, 0x19,0x7e,0x30,0x2, 0xac, +0x3d,0x2d,0x14,0x49,0x11,0x0, 0x30,0x6d,0x0, 0x9e,0x7, 0xd, 0xff,0xbd,0x10,0x48, +0xe, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x14,0xb, 0x18,0x10,0xbd,0x10,0x58,0x16,0x7e, +0xb3,0xe, 0xa, 0x44,0x2, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x2, 0x7a, +0xb3,0x16,0xbb,0x80,0x6, 0xb, 0xf0,0xbc,0x5f,0x38,0xb4,0x7e,0xb3,0xe, 0x9, 0xb4, +0x1, 0x2, 0x80,0x3, 0x2, 0x23,0xdf,0x7e,0xb3,0xd, 0x16,0x70,0x6d,0x6c,0xff,0x80, +0x61,0x7e,0x50,0x2, 0xac,0x5f,0x7d,0x12,0x2d,0x14,0xb, 0x18,0x10,0xbe,0x17,0xd, +0xff,0x8, 0x4d,0x2d,0x23,0xb, 0x28,0x20,0xbe,0x27,0xd, 0xff,0x58,0x42,0xbe,0xf1, +0x1e,0x68,0x6, 0x7a,0xf1,0x1e,0x75,0x1f,0x0, 0xbe,0xf1,0x1e,0x78,0x2, 0x5, 0x1f, +0xe5,0x1f,0xbe,0xb0,0x10,0x28,0x33,0x75,0x1f,0x10,0xe5,0x51,0x70,0x16,0x7e,0xb3, +0xe, 0xa, 0x44,0x4, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x4, 0x7a,0xb3, +0x16,0xbb,0x80,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x80,0xa, +0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0x97,0x6c,0xaa,0x6c,0xff,0x80,0x17, +0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x34,0xb, 0x38,0x30,0xbe,0x37,0xd, 0xff,0x8, 0x5, +0x7e,0xa0,0x1, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0xe1,0x4c, +0xaa,0x78,0x1a,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x75,0x1e,0xff, +0x75,0x1f,0x0, 0x7e,0xb3,0x16,0xbb,0x54,0xfb,0x7a,0xb3,0x16,0xbb,0x7e,0xb3,0xe, +0xa, 0x54,0xf7,0x7a,0xb3,0xe, 0xa, 0x7e,0x73,0xd, 0xfa,0xa, 0x27,0x7e,0x73,0xd, +0xf9,0xa, 0x37,0x2d,0x32,0xbe,0x37,0xe, 0x3, 0x28,0x14,0x7e,0xb3,0xe, 0xa, 0x44, +0x8, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x8, 0x7a,0xb3,0x16,0xbb,0x7e, +0xb3,0xe, 0xa, 0x44,0x10,0x7a,0xb3,0xe, 0xa, 0x6c,0xff,0x80,0x49,0x7e,0x50,0x2, +0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70,0x18,0xac,0x7d,0xa, +0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x49,0x22,0x10,0x3, +0x9d,0x32,0x7a,0x35,0x21,0x12,0x6e,0x11,0xbe,0x37,0xe, 0x1, 0x28,0x16,0x7e,0xb3, +0xe, 0xa, 0x54,0xef,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x10,0x7a,0xb3, +0x16,0xbb,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xaf,0x7e,0x34, +0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x12,0x6e,0x21,0x6c,0xff,0x80,0x25,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70,0x18,0xac,0x7d, +0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x59,0x32,0x10, +0x3, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xd3,0xda,0x79,0xda,0xd8,0x22, +0xca,0x3b,0x6d,0x33,0x7a,0x35,0x21,0x75,0x25,0x0, 0x75,0x26,0x0, 0x7e,0x23,0xd, +0xf7,0x7a,0x21,0x23,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x13,0xb6,0x7e,0x30,0x2, 0xac, +0x23,0x7e,0x24,0xd, 0x18,0x7e,0x34,0x13,0xb8,0x12,0x6d,0x7d,0xe5,0x23,0xbe,0xb0, +0xa, 0x38,0x3, 0x2, 0x26,0xd5,0x75,0x24,0x0, 0x6c,0xff,0x2, 0x25,0xe9,0x7e,0x34, +0x3, 0xff,0x7a,0x35,0x27,0x75,0x26,0xff,0x6c,0xee,0x80,0x7e,0x7e,0x70,0x2, 0xac, +0x7e,0x9, 0xb3,0x13,0xb8,0xbe,0xb0,0xff,0x68,0x6e,0x7c,0xbe,0xc4,0x23,0x54,0x1f, +0x7c,0xab,0x7a,0xa1,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e, +0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x2c,0xa, 0x2a,0x9, 0xb2,0xd, 0x68,0x55,0x2c, +0x68,0x46,0x9, 0x73,0x13,0xb9,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa3, +0xa, 0x37,0x9d,0x32,0x12,0x6e,0x11,0x7d,0x63,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x13, +0xb8,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa2,0xa, 0x37,0x9d,0x32,0x12, +0x6e,0x11,0x2d,0x36,0x7a,0x35,0x29,0x7e,0x35,0x27,0xbe,0x35,0x29,0x28,0x9, 0x7e, +0x35,0x29,0x7a,0x35,0x27,0x7a,0xe1,0x26,0xb, 0xe0,0xe5,0x23,0xbc,0xbe,0x28,0x3, +0x2, 0x25,0x1c,0xe5,0x26,0xbe,0xb0,0xff,0x68,0x3d,0x7e,0x71,0x26,0x74,0x2, 0xac, +0x7b,0x9, 0x33,0x13,0xb8,0x7e,0x50,0x18,0xac,0x53,0x9, 0xa3,0x13,0xb9,0xa, 0xa, +0x2d,0x20,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28,0x20,0xbe,0x24,0x0, 0x3c,0x48, +0x16,0xe5,0x24,0x1a,0x2b,0x3e,0x24,0x19,0x32,0x13,0xe0,0x19,0xa2,0x13,0xe1,0x74, +0xff,0x19,0xb3,0x13,0xb8,0x5, 0x24,0xb, 0xf0,0xe5,0x11,0xbc,0xbf,0x28,0x3, 0x2, +0x25,0xe, 0x7e,0xf1,0x24,0x2, 0x26,0xbb,0x6d,0x33,0x7a,0x35,0x21,0x7e,0xa0,0xff, +0x6c,0xee,0x2, 0x26,0x8d,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0x7b,0x7a,0x71,0x2b, +0x7c,0xbe,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0xb9,0xf5,0x2c,0xa, 0x37,0x9, 0xb3,0xd, 0x68,0x55,0x2c,0x68,0x5e,0x7e,0x90,0x2, +0xac,0x9e,0x9, 0x44,0x13,0xb8,0xbe,0x40,0xff,0x68,0x50,0x7e,0x50,0x18,0xac,0x45, +0x9, 0xb4,0x13,0xb9,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28, +0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac, +0x5e,0x9, 0x62,0x13,0xb8,0x7e,0x30,0x18,0xac,0x36,0x9, 0x72,0x13,0xb9,0xa, 0x7, +0x2d,0x10,0x3e,0x14,0x2e,0x17,0x13,0xb6,0xb, 0x18,0x40,0xbe,0x45,0x21,0x8, 0xb, +0x7a,0x61,0x25,0x7a,0x71,0x26,0x7a,0x45,0x21,0x7c,0xae,0xb, 0xe0,0xe5,0x23,0xbc, +0xbe,0x28,0x3, 0x2, 0x26,0x5, 0xbe,0xa0,0xff,0x68,0x1e,0x7e,0x71,0x25,0x7e,0x90, +0x2, 0xac,0x9f,0x19,0x74,0x13,0xe0,0xe5,0x26,0x19,0xb4,0x13,0xe1,0x7e,0x70,0xff, +0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x13,0xb8,0xb, 0xf0,0xbe,0xf0,0xa, 0x50,0x3, +0x2, 0x25,0xf8,0x7e,0x24,0x13,0xe0,0x7e,0x34,0x13,0xb8,0x7e,0x14,0x0, 0x28,0x12, +0x6d,0x7d,0x75,0x23,0xa, 0x7e,0x34,0x15,0xa2,0x7e,0x24,0x0, 0x14,0x74,0xff,0x12, +0x6e,0x21,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0x55,0x7e,0x31,0x23,0x74,0x2, 0xac,0x3b, +0x7e,0x24,0x13,0xb8,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x7d,0x7e,0x31,0x23,0x74,0x2, +0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0x15,0xa2,0x12,0x6d,0x7d,0x6c,0xff,0x80, +0x27,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24,0xd, 0x68,0x7e,0x29, +0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xf0,0xe5,0x23,0xbc,0xbf,0x38,0xd3,0x85,0x23, +0x11,0xe5,0x23,0x7a,0xb3,0xd, 0xf7,0xda,0x3b,0x22,0x7c,0x7b,0xbe,0x70,0x10,0x40, +0x12,0xbe,0x70,0x4b,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x0, 0xfb,0x9e,0x34,0x0, 0x10, +0x2, 0x29,0x85,0xa5,0xbf,0x0, 0x3, 0xe5,0xb, 0x22,0xa5,0xbf,0x1, 0x3, 0xe5,0xd, +0x22,0xa5,0xbf,0x2, 0x5, 0x7e,0xb3,0xf, 0x28,0x22,0xbe,0x70,0x3, 0x40,0x12,0xbe, +0x70,0x5, 0x38,0xd, 0xa, 0x37,0x2e,0x34,0x10,0x2b,0x9e,0x34,0x0, 0x3, 0x2, 0x29, +0x85,0xa5,0xbf,0x6, 0x3, 0x74,0x1, 0x22,0xa5,0xbf,0x7, 0x5, 0x7e,0xb3,0x10,0x4b, +0x22,0xa5,0xbf,0x8, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xac,0x22, +0x7e,0xb3,0x11,0x16,0x22,0xa5,0xbf,0x9, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e, +0xb3,0xa, 0xad,0x22,0x7e,0xb3,0x11,0x49,0x22,0xa5,0xbf,0xa, 0x5, 0x7e,0xb3,0x10, +0x3b,0x22,0xa5,0xbf,0xb, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xae, +0x22,0x7e,0xb3,0x11,0x94,0x22,0xa5,0xbf,0xc, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, +0x7e,0xb3,0xd, 0xfe,0x22,0x7e,0xb3,0x11,0x9d,0x22,0xa5,0xbf,0x4c,0x5, 0x7e,0xb3, +0xf, 0x46,0x22,0xa5,0xbf,0xfb,0x3, 0xe5,0x8, 0x22,0xa5,0xbf,0x4e,0x5, 0x7e,0xb3, +0x10,0x4a,0x22,0xbe,0x70,0x50,0x40,0x12,0xbe,0x70,0x51,0x38,0xd, 0xa, 0x37,0x2e, +0x37,0x10,0x2f,0x9e,0x34,0x0, 0x50,0x2, 0x29,0x85,0xbe,0x70,0x52,0x40,0x12,0xbe, +0x70,0x55,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x31,0x9e,0x34,0x0, 0x52,0x2, 0x29, +0x85,0xbe,0x70,0x56,0x40,0x12,0xbe,0x70,0x62,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10, +0x33,0x9e,0x34,0x0, 0x56,0x2, 0x29,0x85,0xbe,0x70,0x63,0x40,0x12,0xbe,0x70,0x7a, +0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x63,0x2, 0x29,0x85,0xbe, +0x70,0x7b,0x50,0x3, 0x2, 0x29,0x19,0xbe,0x70,0x9f,0x28,0x3, 0x2, 0x29,0x19,0x7e, +0xb3,0x10,0x3b,0x70,0x4a,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58, +0x22,0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba, +0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e, +0xa0,0x80,0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70, +0xa, 0x57,0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0xdc,0x22,0xa, +0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x22,0xa, 0x37,0x2e,0x37,0x10, +0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e, +0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e,0xa0,0x80,0x15,0xa, 0x37,0x2e, +0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70,0xa, 0x57,0x2e,0x54,0x0, 0x18, +0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0x63,0x22,0xbe,0x70,0xa0,0x40,0x11,0xbe,0x70, +0xac,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6c,0x9e,0x34,0x0, 0xa0,0x80,0x56,0xbe, +0x70,0xad,0x40,0x11,0xbe,0x70,0xb9,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6e,0x9e, +0x34,0x0, 0xad,0x80,0x40,0xbe,0x70,0xba,0x40,0x11,0xbe,0x70,0xd1,0x38,0xc, 0xa, +0x37,0x2e,0x37,0x10,0x70,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe,0x70,0xd2,0x40,0x11, +0xbe,0x70,0xd5,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x72,0x9e,0x34,0x0, 0xd2,0x80, +0x14,0xbe,0x70,0xd6,0x40,0x13,0xbe,0x70,0xed,0x38,0xe, 0xa, 0x37,0x2e,0x37,0x10, +0x74,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xa5,0xbf,0xf8,0x5, 0x7e,0xb3,0x11, +0xe8,0x22,0xa5,0xbf,0xfe,0x3, 0xe5,0xc, 0x22,0x74,0xff,0x22,0xca,0x3b,0x7e,0x34, +0x22,0xc4,0x7a,0x35,0x25,0x7e,0x34,0x13,0xff,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6e, +0x21,0x75,0x24,0x1, 0x7e,0x73,0x10,0x4d,0x7a,0x73,0x13,0xb6,0xe4,0x7a,0xb3,0x10, +0x4d,0x75,0x22,0x0, 0x6c,0xee,0x80,0x12,0xa, 0x3e,0x2e,0x37,0x10,0x6e,0x7e,0x39, +0xb0,0xbe,0xb1,0x22,0x40,0x2, 0xf5,0x22,0xb, 0xe0,0x7e,0x73,0x10,0x2b,0xbc,0x7e, +0x38,0xe6,0xe5,0x22,0xbe,0xb0,0x1f,0x50,0xe, 0xe5,0x22,0xa, 0x4b,0x7e,0x54,0x0, +0x1f,0x9d,0x54,0xf5,0x22,0x80,0x3, 0x75,0x22,0x0, 0x85,0x22,0x21,0x7e,0x34,0x10, +0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a,0xa5,0x2, 0x2b,0x9a,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x12, +0x69,0x64,0x12,0x6e,0xb9,0x60,0xfb,0xa9,0xb7,0xea,0x7e,0x37,0xf, 0xda,0x7e,0x27, +0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2,0x6c,0xee,0x80,0x78,0x6c,0xff,0x80, +0x6a,0x4c,0xee,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3,0x13,0xe7,0x6d,0x33,0x74,0x2, +0xac,0xbf,0x59,0x35,0x13,0xb7,0xbe,0xf0,0x17,0x78,0x13,0x7e,0x34,0x0, 0x1, 0x7c, +0xbe,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x5e,0x34,0x4, 0x44,0x68,0x3b,0x7e,0x50, +0x30,0xac,0x5e,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x10,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0x7e,0x50,0x2, 0xac,0x5f, +0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xa, 0x3f,0x2e,0x34, +0x13,0xe7,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc, +0x7f,0x38,0x8e,0xb, 0xe0,0x7e,0x73,0x10,0x2b,0xbc,0x7e,0x38,0x80,0x75,0x23,0x0, +0x6c,0xee,0x2, 0x2b,0x78,0xa, 0x3e,0x9, 0xa3,0x13,0xe7,0x4c,0xaa,0x78,0xf, 0x7e, +0x44,0x22,0xc4,0x7e,0x70,0x2, 0xac,0x7e,0x59,0x43,0x13,0xb7,0x80,0x25,0x7e,0x50, +0x2, 0xac,0x5e,0x49,0x12,0x13,0xb7,0xa, 0xa, 0x8d,0x10,0x59,0x12,0x13,0xb7,0x2e, +0x24,0x13,0xb7,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x34,0x22,0xc4,0x7a,0x35,0x25,0x7e,0x64,0x3, 0x20,0x7e,0x70, +0x2, 0xac,0x7e,0x49,0x23,0x13,0xb7,0x7e,0x15,0x25,0x9d,0x16,0xbd,0x21,0x50,0x23, +0xa, 0x1e,0x2e,0x14,0x13,0xff,0x7e,0x19,0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1e,0x2e, +0x17,0x10,0x74,0x7e,0x19,0xb0,0xbe,0xb1,0x22,0x50,0x32,0x4, 0x7a,0x19,0xb0,0x80, +0x35,0x80,0x2a,0x7d,0x36,0x2e,0x35,0x25,0xbd,0x23,0x28,0x28,0xa, 0x3e,0x2e,0x34, +0x13,0xff,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xa, 0x3e,0x2e,0x37,0x10,0x74,0x7e, +0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14,0x7a,0x39,0xb0,0x80,0x9, 0x5, 0x23,0x75, +0x24,0x0, 0x80,0x2, 0x5, 0x23,0xb, 0xe0,0x7e,0x73,0x10,0x2c,0xbc,0x7e,0x28,0x3, +0x2, 0x2a,0xc5,0x7e,0x34,0x10,0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a, +0xa5,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x23,0x68,0xf, 0x7e,0xa1,0x21,0x7c,0xba,0x14, +0xf5,0x21,0x4c,0xaa,0x68,0x3, 0x2, 0x2a,0xe, 0x7e,0x73,0x13,0xb6,0x7a,0x73,0x10, +0x4d,0x6c,0xff,0x80,0x12,0xa, 0x3f,0x9, 0x73,0x13,0xff,0xbe,0x71,0x22,0x78,0x5, +0x75,0x24,0x0, 0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0xe6,0xe5, +0x24,0xda,0x3b,0x22,0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20,0x0, 0x41, +0x0, 0x42,0x0, 0x22,0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40,0x0, 0xa3, +0x0, 0xa5,0x0, 0x44,0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60,0x0, 0xe5, +0x0, 0xe8,0x0, 0x66,0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80,0x1, 0x47, +0x1, 0x4b,0x0, 0x88,0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0,0x1, 0x89, +0x1, 0xad,0x0, 0xaa,0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xaa,0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0,0x1, 0x69, +0x1, 0x6c,0x0, 0x88,0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80,0x1, 0x27, +0x1, 0x9, 0x0, 0x66,0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60,0x0, 0xc5, +0x0, 0xc6,0x0, 0x44,0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40,0x0, 0x83, +0x0, 0x64,0x0, 0x22,0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20,0x0, 0x21, +0x0, 0x21,0x0, 0x0, 0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0xca,0x3b,0x7e,0xb3,0x10,0x3c,0xf5,0x21,0xe4,0x7a,0xb3,0x10, +0x3c,0x7e,0xb3,0x10,0x3a,0xf5,0x22,0x74,0x3, 0x7a,0xb3,0x10,0x3a,0x7e,0x37,0x10, +0x48,0x7e,0x24,0x0, 0x25,0xe4,0x12,0x6e,0x21,0x7e,0xe0,0x7, 0x6d,0x33,0x7a,0x37, +0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x6c,0xdd,0x7e, +0x14,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0xa, 0x2d,0x2e,0x27, +0x10,0x48,0x7e,0x29,0x70,0x4c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78, +0xde,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12, +0x6e,0xc2,0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x6f,0x12,0x55,0x3a,0x6c,0xdd, +0xbe,0xd0,0x18,0x50,0x1e,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf, +0x30,0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x16,0x1e, +0xf0,0x80,0x12,0xa, 0x3d,0x2e,0x37,0x10,0x33,0x9, 0x73,0xff,0xe8,0xa, 0x37,0x2e, +0x34,0x0, 0x18,0x7c,0xf7,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0xb, 0x38, +0x30,0xbe,0x34,0x25,0x80,0x18,0x21,0x7e,0x34,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7d,0x13,0x6e,0x14,0xff,0xff,0xa, 0x2f,0x2e,0x27,0x10,0x48, +0x7e,0x29,0x70,0x5c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78,0x91,0x1b, +0xe0,0xbe,0xe0,0x0, 0x48,0x3, 0x2, 0x2e,0x1c,0x7e,0xe0,0xa, 0x74,0x2, 0x7a,0xb3, +0x10,0x3a,0x2, 0x2f,0xeb,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a, +0x37,0xa, 0xaf,0x12,0x6f,0x10,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c, +0xa, 0x65,0x2d,0x63,0x7c,0xcd,0x6c,0xdd,0x2, 0x2f,0xb3,0x7e,0xa3,0x10,0x2c,0xbc, +0xad,0x28,0x27,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf,0x30,0xe0, +0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x2, 0x1e,0xf0,0x7e, +0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x80,0x27,0xa, 0x2a,0xa, 0x3d,0x9d,0x32, +0x2e,0x37,0x10,0x33,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34,0x0, 0x18,0x7c,0xf7,0x7e, +0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xa4,0x9d, +0x35,0xb, 0x38,0x30,0x7a,0x35,0x23,0xbe,0x34,0x2e,0xe0,0x8, 0x18,0x4c,0xee,0x68, +0x30,0xa, 0x2f,0x2e,0x27,0x10,0x48,0x7e,0x29,0xb0,0xbe,0xb0,0xfe,0x50,0x22,0x4, +0x7a,0x29,0xb0,0x80,0x1c,0xbe,0x34,0x17,0x70,0x58,0x14,0xa, 0x3f,0x2e,0x37,0x10, +0x48,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x7a,0x39,0xb0,0x80,0x2, 0x1b, +0xc0,0xb, 0xd0,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c,0xa, 0x25,0x2d, +0x23,0xa, 0x3d,0xbd,0x32,0x58,0x3, 0x2, 0x2f,0x1b,0x4c,0xcc,0x68,0x28,0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60, +0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x6f,0x12,0x55,0x3a,0x7c,0xae,0x1b,0xe0,0x4c, +0xaa,0x68,0x3, 0x2, 0x2e,0xf5,0xe5,0x21,0x7a,0xb3,0x10,0x3c,0xe5,0x22,0x7a,0xb3, +0x10,0x3a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x24,0x15,0x56,0x7e,0x34,0x13, +0xfe,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0xb6, +0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x13,0xfc,0x7e, +0x73,0xf, 0x1c,0x7a,0x73,0x13,0xfd,0x7e,0xa3,0x13,0xfc,0xbe,0xa0,0x1, 0x38,0x3, +0x7e,0xf0,0x1, 0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0xe4,0x80,0x10,0x7e,0xb3,0x15,0xa1, +0x4, 0x7a,0xb3,0x15,0xa1,0xbe,0xb0,0xc8,0x28,0x6, 0x74,0x14,0x7a,0xb3,0x15,0xa1, +0x7e,0xb3,0x15,0xa1,0xbe,0xb0,0x6, 0x50,0x3, 0x7e,0xf0,0x1, 0xbe,0xa0,0x1, 0x28, +0x3f,0x7e,0x34,0x0, 0x21,0x7e,0x24,0x0, 0x23,0x7e,0x14,0x13,0xfe,0x12,0x66,0x16, +0x7e,0x34,0x0, 0x25,0x7e,0x24,0x0, 0x27,0x7e,0x14,0x13,0xb6,0x12,0x66,0x16,0x7e, +0x35,0x25,0x9e,0x35,0x21,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x80,0x18,0xf, 0x7e,0x35, +0x27,0x9e,0x35,0x23,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x80,0x8, 0x3, 0x7e,0xf0,0x1, +0xbe,0xf0,0x0, 0x28,0x3, 0x2, 0x31,0x63,0x7e,0xf3,0x15,0x9f,0xbe,0xf3,0x15,0x29, +0x50,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73,0x13,0xfc,0x28,0x12,0x7e,0x24,0x15,0x56, +0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x2, 0x31,0x63,0x7e,0x73, +0x15,0x9e,0xbe,0x70,0x2, 0x58,0x22,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e, +0x14,0x0, 0x48,0x12,0x6d,0x7d,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15, +0x53,0x7e,0xb3,0x15,0x9e,0x4, 0x2, 0x31,0x9f,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4, +0x7a,0xb3,0x15,0x53,0x2, 0x31,0x9f,0xbe,0xf3,0x15,0x29,0x78,0x2d,0x7e,0xa3,0x15, +0x29,0xbe,0xa3,0x13,0xfc,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3, +0x15,0x53,0x80,0x6b,0xbe,0xa3,0x13,0xfc,0x28,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x7a, +0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0x80,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73, +0x13,0xfc,0x50,0x1a,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48, +0x12,0x6d,0x7d,0xe4,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0x53,0x80,0x31,0x7e,0x73, +0x15,0x53,0xbe,0x70,0x2, 0x58,0x1c,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e, +0x14,0x0, 0x48,0x12,0x6d,0x7d,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0x7e,0xb3,0x15,0x53, +0x4, 0x80,0x7, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0xe4,0x7a, +0xb3,0x15,0x9e,0x7e,0xb3,0x15,0xa0,0x14,0x68,0x9, 0x4, 0x78,0x15,0x7e,0x24,0x13, +0xb6,0x80,0x4, 0x7e,0x24,0x14,0xe3,0x7e,0x34,0x15,0x56,0x7e,0x14,0x0, 0x48,0x12, +0x6d,0x7d,0x7e,0x73,0x15,0x29,0x7a,0x73,0x15,0x9f,0x7e,0x24,0x13,0xb6,0x7e,0x34, +0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x7e,0x24,0x15,0x56,0x7e,0x34,0xe, +0xd, 0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x7e,0x73,0x15,0x9c,0x7a,0x73,0xf, 0x1b, +0x7e,0x73,0x15,0x9d,0x7a,0x73,0xf, 0x1c,0xda,0xf8,0x22,0xca,0x79,0x7d,0x73,0x12, +0x61,0x38,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27,0x0, +0x27,0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c,0xe, +0x1b,0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49,0x27, +0x0, 0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34,0x1c, +0x14,0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c,0x67, +0x6c,0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38,0x10, +0x9, 0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, 0x25, +0x4d,0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27,0x7e, +0x34,0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c, +0xaa,0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e,0x34, +0x1c,0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e,0x34, +0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, 0x4b, +0x2d,0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0, +0x19,0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70, +0x2, 0xac,0x7a,0x2e,0x34,0x2b,0xd4,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e,0x24, +0x1c,0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x2d,0xd2, +0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e,0x34, +0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x2d,0xd4, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, 0xa0, +0xbe,0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x5e,0x27,0x49,0x27,0x0, 0x39,0x7e,0x34, +0x1c,0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38,0x20, +0x49,0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33,0x7e, +0x34,0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, 0xb7, +0x0, 0x1, 0x12,0x65,0x18,0x49,0x37,0x0, 0x47,0x12,0x7, 0xc9,0x49,0x37,0x0, 0x49, +0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x5d,0x1, 0x49,0x27,0x0, 0x35,0x7e, +0x34,0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22,0xca, +0x3b,0x6d,0x33,0x7a,0x35,0x23,0x7e,0xb3,0xf, 0x1b,0x60,0x6, 0x7e,0xb3,0xf, 0x1c, +0x60,0x11,0xe5,0x22,0x60,0x5, 0x75,0x18,0x1, 0x80,0x3, 0x75,0x18,0x0, 0xe5,0x18, +0x2, 0x35,0x5e,0x7e,0xb3,0xd, 0x18,0xf5,0x21,0x7e,0x73,0xd, 0x19,0x7a,0x71,0x22, +0x6d,0x66,0x75,0x25,0x0, 0x75,0x26,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x3a,0x7e,0x51, +0x21,0x74,0x18,0xac,0x5b,0x2d,0x27,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x10, +0xbe,0x14,0x0, 0x32,0x8, 0x28,0x5, 0x25,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0x8, 0x49, +0x12,0xff,0xd0,0x2d,0x61,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, 0x50,0x8, 0x49,0x22, +0x0, 0x30,0x2d,0x62,0x5, 0x26,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc0,0x7d,0x73, +0x80,0x38,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0x2d,0x37,0x3e,0x34,0x2e,0x37,0xf, +0xda,0xb, 0x38,0x20,0xbe,0x24,0x0, 0x32,0x8, 0x2c,0x5, 0x25,0xe5,0x21,0xbe,0xb0, +0x0, 0x28,0x8, 0x49,0x23,0xff,0xd0,0x2d,0x62,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, +0x50,0x8, 0x49,0x33,0x0, 0x30,0x2d,0x63,0x5, 0x26,0x7d,0x37,0xb, 0x34,0x7d,0x73, +0xbe,0x34,0x0, 0x18,0x48,0xbc,0xe5,0x25,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12,0x7d, +0x36,0x12,0x6e,0x11,0xe5,0x26,0xa, 0x2b,0x12,0x48,0x53,0xbe,0x34,0x0, 0xf, 0x8, +0x8, 0x75,0x18,0x1, 0x74,0x1, 0x2, 0x35,0x5e,0x6d,0x33,0xe5,0x21,0xbe,0xb0,0x0, +0x28,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0xff,0xd0,0x2d,0x32,0xe5,0x21,0xbe,0xb0,0xc, +0x50,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0x0, 0x30,0x2d,0x32,0x7e,0xa0,0x8, 0x80,0x2d, +0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2e,0x14,0x6e,0x1, 0x7a,0x31,0x82,0x7a,0x21, +0x83,0xe4,0x93,0x1a,0x1b,0xbd,0x13,0x8, 0x14,0x2e,0x24,0x6e,0x2, 0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x1a,0x2b,0x2e,0x25,0x23,0x7a,0x25,0x23,0x7c,0x5a,0x1b, +0xa0,0xa5,0xbd,0x0, 0xcb,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0xe5,0x22,0xa, 0x2b, +0x2d,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x12,0x6e,0x11,0xbe,0x34, +0x3, 0xe8,0x8, 0xa, 0x7e,0x35,0x23,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x23,0x7e,0x35, +0x23,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x23,0xe5,0x18, +0xa, 0x3b,0xbe,0x35,0x23,0x50,0x5, 0x7e,0x55,0x23,0xf5,0x18,0xe5,0x18,0xda,0x3b, +0x22,0xca,0x3b,0x7c,0x9b,0x7d,0xa3,0xbe,0x90,0x1, 0x28,0x1e,0xa, 0x15,0x1b,0x15, +0xa, 0x39,0xbd,0x31,0x58,0x14,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6, +0xb, 0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x80,0x7, 0xbe,0x90,0x1, 0x78,0x15,0x6d, +0xbb,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x94, +0x7d,0xc3,0x80,0x8, 0x4c,0x99,0x78,0x38,0x6d,0xcc,0x7d,0xbc,0x74,0x2, 0xac,0xb9, +0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x7e,0x70,0x2, 0xac, +0x79,0x2d,0x3a,0x49,0x33,0x0, 0x2, 0x12,0x6d,0x94,0x7d,0xe3,0x74,0x2, 0xac,0xb9, +0x7d,0xf5,0x2d,0xfa,0x49,0x3f,0x0, 0x4, 0x12,0x6d,0x94,0x7d,0xf3,0x2, 0x36,0x6c, +0x7c,0xb5,0x24,0xfe,0xbc,0xb9,0x78,0x46,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba, +0x1b,0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d, +0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x94,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d, +0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x74,0x2, 0xac,0xb9,0x2d, +0xa5,0x49,0x3a,0x0, 0x2, 0x12,0x6d,0x94,0x7d,0xe3,0x6d,0xff,0x80,0x3e,0x7c,0xb5, +0x14,0xbc,0xb9,0x78,0x37,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6,0xb, +0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35, +0xb, 0x38,0x30,0x12,0x6d,0x94,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d,0xd5,0x2d,0xda, +0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x6d,0xff,0x7d,0xef,0xa, 0x79,0x6d,0x66, +0x7f,0x3, 0x1b,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x7f,0x41,0x7f, +0x3, 0x1b,0xd, 0x7d,0x3b,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x41,0x7d,0x3d, +0x1a,0x26,0x1a,0x24,0xa, 0x19,0x6d,0x0, 0x12,0x48,0x85,0x2f,0x41,0xa, 0x19,0x6d, +0x0, 0xb, 0xc, 0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x41,0xa, 0x19, +0x6d,0x0, 0xb, 0xd, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x14,0x7d, +0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x5b,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1d,0x1a, +0x2, 0x1a,0x0, 0x2f,0x2, 0x7d,0x5e,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1f,0x1a, +0x2, 0x1a,0x0, 0x2f,0x2, 0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x48,0xa1,0x2e, +0x34,0x0, 0x20,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xf, 0x1b,0x7e,0x64,0xe, 0xdf, +0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7, +0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x5, 0x80,0x2, +0x74,0x3, 0x7a,0xb3,0xf, 0x26,0x74,0x1, 0x7a,0xb3,0xf, 0x27,0x4c,0xff,0x78,0xd, +0x75,0x19,0x0, 0x7e,0xb3,0xf, 0x26,0x12,0x6e,0xe2,0x2, 0x38,0x85,0xe5,0x51,0xb4, +0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, +0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xb4,0x1, +0x9, 0xe5,0x19,0x70,0x5, 0x75,0x16,0x5, 0xf5,0x17,0xe5,0x51,0xb4,0x1, 0x1b,0x7e, +0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, +0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xf5,0x19,0x6c,0xee,0x7e, +0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xe, 0x9d,0xf5,0x21,0xbe,0xb0,0xff,0x78,0x3, 0x2, +0x38,0x7b,0xe5,0x21,0xa, 0x2b,0x2d,0x26,0x7e,0x29,0xb0,0xb4,0x2, 0x2, 0x80,0x3, +0x2, 0x38,0x7b,0x49,0x33,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13, +0x74,0x12,0x6d,0xf1,0x7a,0x35,0x22,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0x9b,0x7e, +0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x76,0x12,0x6d,0xf1,0x7a,0x35,0x24,0xe5, +0x16,0xa, 0x3b,0xbe,0x35,0x22,0x28,0x59,0xbe,0x35,0x24,0x28,0x54,0x7e,0xa1,0x21, +0x74,0x4, 0xa4,0x49,0x35,0x13,0x74,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0x99,0x7e, +0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x76,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, +0x9b,0xe5,0x21,0xa, 0x3b,0x2d,0x36,0x7e,0x39,0xb0,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, +0x28,0x2, 0x1b,0xf0,0x4c,0xff,0x78,0x53,0x5, 0x17,0xe5,0x17,0xbe,0xb0,0x32,0x40, +0x3, 0x75,0x17,0x0, 0x7e,0x73,0xf, 0x27,0xbe,0x71,0x16,0x28,0x3e,0x5, 0x16,0x80, +0x3a,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4, +0x59,0x35,0x13,0x74,0x49,0x34,0xe, 0x9b,0x59,0x35,0x13,0x76,0x7e,0x73,0xf, 0x26, +0xbe,0x71,0x16,0x50,0x8, 0x7e,0xb3,0xf, 0x27,0xf5,0x16,0x80,0xb, 0x7e,0x73,0xf, +0x27,0xbe,0x71,0x16,0x50,0x2, 0x15,0x16,0x75,0x17,0x0, 0xb, 0xe0,0xbe,0xe0,0xa, +0x68,0x3, 0x2, 0x37,0x8f,0xda,0x3b,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0x10,0x2b, +0xf5,0x24,0x7e,0xe3,0x10,0x2c,0x1b,0xe0,0x6c,0xdd,0x7e,0x70,0x30,0xac,0x7d,0x2e, +0x37,0xf, 0xda,0x49,0x33,0x0, 0x2e,0x74,0x2, 0xac,0xbd,0x59,0x35,0x13,0xb6,0xb, +0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0x7e,0xb3,0xf, 0xd3,0xb4,0x1, 0x2, 0x80,0x3, 0x2, +0x39,0xff,0x6c,0xcc,0x2, 0x39,0xf0,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0xd, 0x18, +0xf5,0x22,0x9, 0xb3,0xd, 0x19,0xf5,0x23,0x75,0x21,0x3, 0x7e,0x73,0xe, 0x12,0xbe, +0x70,0x20,0x50,0xa, 0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x3, 0x75,0x21,0x1, 0x7e,0xb3, +0xd, 0xfd,0xb4,0x1, 0x3, 0x75,0x21,0x2, 0x74,0x8, 0x7a,0xb3,0xf, 0x53,0xe5,0x22, +0xbe,0xb0,0x0, 0x28,0x21,0xe5,0x24,0xa, 0x2b,0x1b,0x24,0xe5,0x22,0xa, 0x3b,0xbd, +0x32,0x58,0x13,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2e,0x1b,0x24,0xe5,0x23, +0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x21,0x2, 0x75,0x25,0x0, 0x80,0x45,0xe5,0x25, +0xbc,0xbc,0x68,0x3d,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a, +0xa1,0x26,0x9, 0xb3,0xd, 0x19,0xf5,0x27,0xa, 0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32, +0x12,0x6e,0x11,0xbe,0x34,0x0, 0x3, 0x18,0x18,0xe5,0x27,0xa, 0x2b,0xe5,0x23,0xa, +0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x21,0x1, 0x80, +0xb, 0x5, 0x25,0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x25,0x38,0xb2,0xe5,0x51,0xb4,0x1, +0x20,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x19,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x12,0x7e, +0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x9, 0x75,0x21,0x3, 0x74,0x1e,0x7a,0xb3,0xf, +0x53,0xe5,0x23,0xbe,0xb0,0x17,0x50,0x1a,0x6c,0xdd,0x6d,0x33,0x7e,0x50,0x30,0xac, +0x5d,0x2e,0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xec, +0x80,0x3, 0x75,0x21,0x0, 0xe5,0x21,0x7c,0x7c,0x7c,0x6f,0x12,0x11,0xa0,0x6c,0xdd, +0x74,0x2, 0xac,0xbd,0x49,0x35,0x13,0xb6,0x7e,0x50,0x30,0xac,0x5d,0x2e,0x27,0xf, +0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0xb, 0xf0,0xb, 0xc0, +0x7e,0x73,0xd, 0xf7,0xbc,0x7c,0x28,0x3, 0x2, 0x38,0xc7,0x7a,0xf3,0xd, 0xf7,0xda, +0x3b,0x22,0x7e,0x50,0x1, 0xe4,0x7a,0xb3,0xe, 0xb, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, +0x7e,0xa3,0xd, 0xf7,0x4c,0xaa,0x78,0x1d,0x7e,0x43,0xd, 0xf8,0xbe,0x40,0x0, 0x28, +0x14,0x7e,0x43,0x16,0xb7,0xbe,0x40,0x1, 0x28,0xb, 0x74,0x1, 0x7a,0xb3,0xe, 0xb, +0xe4,0x7a,0xb3,0x10,0x3d,0x4c,0xaa,0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x16,0xb7,0xe4, +0x7a,0xb3,0x16,0xb8,0xbe,0xa0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43, +0xd, 0xfc,0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43,0xd, 0x17, +0xbe,0x40,0x0, 0x28,0x6b,0x7e,0xb3,0x16,0xb1,0x70,0x65,0x7e,0xb3,0x16,0xb3,0x70, +0x5f,0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x6d,0x33,0x6c,0x44,0x7e,0x30,0x2, 0xac,0x34, +0x2e,0x17,0xf, 0xd6,0xb, 0x18,0x10,0xbd,0x13,0x58,0x2, 0x7d,0x31,0xb, 0x40,0xa5, +0xbc,0x25,0xe8,0xbe,0x34,0xf8,0xf8,0x58,0x5, 0x7e,0x50,0x5, 0x80,0x1f,0xbe,0x34, +0xfb,0x50,0x58,0x5, 0x7e,0x50,0x4, 0x80,0x14,0xbe,0x34,0xfc,0xe0,0x58,0x5, 0x7e, +0x50,0x3, 0x80,0x9, 0xbe,0x34,0xfe,0xd4,0x58,0x3, 0x7e,0x50,0x2, 0xbe,0x34,0xfc, +0x18,0x58,0x3c,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x80,0x2f, +0x7e,0x43,0xd, 0x16,0xa5,0xbc,0x0, 0x1d,0xbe,0xa0,0x0, 0x28,0x18,0x7e,0xb3,0x16, +0xb1,0x70,0x12,0x7e,0xb3,0x16,0xb3,0x70,0xc, 0xbe,0x50,0x3, 0x50,0x3, 0x7e,0x50, +0x3, 0x74,0x1, 0x80,0x6, 0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e, +0x43,0x16,0xb7,0xbc,0x45,0x50,0x4, 0x7a,0x53,0x16,0xb7,0xbe,0x50,0x2, 0x28,0x6, +0x74,0x1, 0x7a,0xb3,0x16,0xb8,0xbe,0xa0,0x0, 0x28,0x1b,0x7e,0xb3,0xd, 0x16,0x70, +0x15,0x7e,0xb3,0x16,0xb1,0x70,0xf, 0x7e,0xb3,0x16,0xb3,0x70,0x9, 0xe4,0x7a,0xb3, +0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xb3,0x16,0xb3,0xb4,0x1, 0x18,0xe4,0x7a,0xb3, +0x16,0xb3,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0xf, +0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xa3,0x16,0xb7,0x7e,0x50,0x8, 0xac,0x5a,0x7a,0x27, +0xe, 0x5, 0x74,0x4, 0xa4,0x7a,0x57,0xe, 0x7, 0x22,0xca,0x3b,0x7d,0x73,0x7e,0xb3, +0xd, 0xf7,0xf5,0x4c,0x7e,0x37,0xf, 0xda,0x7a,0x35,0x4f,0x75,0x42,0x0, 0x7e,0xc0, +0x1, 0x80,0x19,0xe5,0x42,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0x60,0xa, 0x2c,0x2d,0x27, +0x7e,0x29,0x70,0xbc,0x76,0x40,0x3, 0x7a,0xc1,0x42,0xb, 0xc0,0xe5,0x4c,0xbc,0xbc, +0x38,0xe1,0xe5,0x42,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0xb0,0xf5,0x42,0x75,0x44,0x0, +0x7e,0xc0,0x1, 0x2, 0x3c,0xb4,0x75,0x4b,0x0, 0x6d,0x33,0x7a,0x35,0x4d,0x6c,0xdd, +0x75,0x45,0x0, 0x75,0x46,0x0, 0x75,0x43,0x0, 0x2, 0x3c,0x69,0x7e,0x71,0x43,0x74, +0x2, 0xac,0x7b,0x9, 0xb3,0xd, 0x18,0xf5,0x47,0x9, 0xb3,0xd, 0x19,0xf5,0x48,0xe5, +0x43,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0x70,0xbc,0x7c,0x78,0x7b,0xb, 0xd0,0xe5,0x47, +0x25,0x45,0xf5,0x45,0xe5,0x48,0x25,0x46,0xf5,0x46,0x7e,0x51,0x47,0xac,0x5d,0xe5, +0x45,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x49,0x7e,0x51,0x48,0xac, +0x5d,0xe5,0x46,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x4a,0x7e,0x51, +0x4b,0xac,0x5d,0xe5,0x49,0xa, 0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x48,0x53, +0x7c,0xb7,0xf5,0x4b,0x7e,0x51,0x4b,0xac,0x5d,0xe5,0x4a,0xa, 0x3b,0xbd,0x32,0x8, +0x9, 0xa, 0x2d,0x12,0x48,0x53,0x7c,0xb7,0xf5,0x4b,0x7e,0x71,0x47,0x74,0x18,0xac, +0x7b,0xe5,0x48,0xa, 0x2b,0x2d,0x32,0x3e,0x34,0x2e,0x35,0x4f,0xb, 0x38,0x30,0xbe, +0x35,0x4d,0x8, 0x3, 0x7a,0x35,0x4d,0x5, 0x43,0xe5,0x4c,0xbe,0xb1,0x43,0x28,0x3, +0x2, 0x3b,0xcc,0xbe,0xd0,0x0, 0x28,0x3a,0xe5,0x45,0x8c,0xbd,0xf5,0x45,0xe5,0x46, +0x8c,0xbd,0xf5,0x46,0x7e,0xa1,0x45,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x19,0xa3, +0x15,0x2b,0xe5,0x46,0x19,0xb3,0x15,0x2c,0x7e,0x25,0x4d,0x7e,0x71,0x45,0x74,0x18, +0xac,0x7b,0xe5,0x46,0xa, 0x1b,0x2d,0x31,0x3e,0x34,0x2e,0x35,0x4f,0x1b,0x38,0x20, +0x5, 0x44,0xb, 0xc0,0xe5,0x42,0xbc,0xbc,0x40,0x3, 0x2, 0x3b,0xb6,0xe5,0x44,0xda, +0x3b,0x22,0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x74,0x18,0x7a,0xb3,0x10,0x2c,0x74,0x4, +0x7a,0xb3,0x10,0x2d,0xe4,0x7a,0xb3,0x10,0x2e,0x7e,0x34,0x11,0x9b,0x7a,0x37,0x10, +0x2f,0x7e,0x34,0x11,0x97,0x7a,0x37,0x10,0x31,0x7e,0x34,0xf, 0xc5,0x7a,0x37,0x10, +0x33,0x7e,0x34,0xf, 0xad,0x7a,0x37,0x10,0x35,0x74,0x15,0x7a,0xb3,0x10,0x37,0x74, +0x17,0x7a,0xb3,0x10,0x38,0x74,0x4, 0x7a,0xb3,0x10,0x3a,0xe4,0x7a,0xb3,0x10,0x3b, +0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x3d,0x74,0x2, 0x7a,0xb3,0x10,0x3e,0x74,0x45, +0x7a,0xb3,0x10,0x3f,0x74,0x71,0x7a,0xb3,0x10,0x40,0x74,0x3, 0x7a,0xb3,0x10,0x41, +0x7e,0x34,0x1f,0xff,0x7a,0x37,0x10,0x42,0x6d,0x33,0x7a,0x37,0x10,0x44,0x7e,0x34, +0xd, 0xfe,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, 0xdc,0x7a,0x37,0x10,0x48,0x74,0x20, +0x7a,0xb3,0x10,0x4a,0x74,0xa, 0x7a,0xb3,0x10,0x4b,0xe4,0x7a,0xb3,0x10,0x4c,0x7a, +0xb3,0x10,0x4d,0x7a,0xb3,0x10,0x4e,0x74,0x2, 0x7a,0xb3,0x10,0x4f,0x7e,0x34,0x0, +0xf4,0x7a,0x37,0x10,0x52,0x7e,0x34,0x3f,0xe0,0x7a,0x37,0x10,0x50,0x7e,0x34,0x29, +0x28,0x7a,0x37,0x10,0x54,0x7e,0x34,0x10,0x91,0x7a,0x37,0x10,0x62,0x7e,0x34,0x0, +0x3d,0x7a,0x37,0x10,0x64,0x7e,0x34,0x0, 0x22,0x7a,0x37,0x10,0x66,0x7e,0x34,0x4c, +0x0, 0x7a,0x37,0x10,0x56,0x7e,0x34,0x3, 0xcf,0x7a,0x37,0x10,0x58,0x7e,0x34,0x7, +0x9a,0x7a,0x37,0x10,0x5a,0x7e,0x34,0x5, 0x84,0x7a,0x37,0x10,0x5c,0x7e,0x34,0x0, +0x9, 0x7a,0x37,0x10,0x5e,0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x10,0x60,0x7e,0x34,0x0, +0x5d,0x7a,0x37,0x10,0x68,0xe4,0x7a,0xb3,0x10,0x6a,0x74,0x7, 0x7a,0xb3,0x10,0x6b, +0x7e,0x34,0x10,0xff,0x7a,0x37,0x10,0x6c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x10,0x6e, +0x7e,0x34,0xf, 0x2e,0x7a,0x37,0x10,0x70,0x12,0x41,0xcf,0x7e,0x34,0x11,0xe9,0x7a, +0x37,0x10,0x72,0x7e,0x34,0xf, 0x88,0x7a,0x37,0x10,0x74,0x7e,0x34,0x11,0x17,0x7a, +0x37,0x10,0x76,0x2, 0x6c,0x99,0xca,0x69,0xca,0xf8,0x7d,0xb1,0x7d,0xf2,0x7d,0xe3, +0x9f,0x0, 0x7f,0x60,0x7f,0x40,0x6d,0x66,0x7a,0x67,0x13,0xb6,0x7f,0x10,0x7d,0xa6, +0x75,0x21,0x0, 0x6c,0xaa,0x80,0x4b,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0xa1,0x2d,0xae, +0xb, 0xa8,0xa0,0x7c,0xba,0x20,0xe0,0x1e,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, +0x6d,0x11,0x9d,0x1b,0xbd,0x1a,0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, +0x2f,0x60,0x5, 0x21,0x80,0x1a,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11, +0x9d,0x1b,0xbd,0x1a,0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x40, +0xb, 0xa0,0x7e,0xf3,0x10,0x2c,0xbc,0xfa,0x38,0xad,0xe5,0x21,0xa, 0x1b,0x6d,0x0, +0x7f,0x16,0x12,0x48,0xf2,0x7a,0x37,0x13,0xb6,0xe5,0x21,0xa, 0x3b,0x6d,0x22,0xa, +0x1f,0x6d,0x0, 0x9f,0x1, 0x7f,0x14,0x12,0x48,0xf2,0x6c,0xaa,0x80,0x2f,0x7c,0xba, +0x7e,0x30,0x2, 0x7c,0x9a,0x20,0xe0,0xf, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18, +0x0, 0x9e,0x7, 0x13,0xb6,0x80,0xd, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, +0x7d,0x13,0x9d,0x1, 0x7d,0x14,0x2d,0x1f,0x1b,0x18,0x0, 0xb, 0xa0,0x7e,0xb3,0x10, +0x2c,0xbc,0xba,0x38,0xc9,0x9f,0x66,0x7a,0x67,0x13,0xb6,0x6c,0xaa,0x80,0x29,0x7e, +0x70,0x2, 0xac,0x7a,0x7d,0xa3,0x2d,0xae,0x49,0xaa,0x0, 0x30,0xbd,0xab,0x8, 0x4, +0x7d,0xab,0x80,0xa, 0x6d,0x33,0x9d,0x3b,0xbd,0x3a,0x8, 0x2, 0x7d,0xa3,0x7d,0x3a, +0x1a,0x26,0x1a,0x24,0x2f,0x61,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xcf, +0xa, 0x16,0x6d,0x0, 0x7f,0x16,0x12,0x48,0xf2,0x7a,0x37,0x13,0xb6,0x6c,0xaa,0x80, +0x1d,0x7e,0x70,0x2, 0x7c,0x5a,0xac,0x57,0x7d,0x32,0x2d,0x3e,0x49,0x43,0x0, 0x30, +0x9e,0x47,0x13,0xb6,0x7d,0x32,0x2d,0x3f,0x59,0x43,0x0, 0x30,0xb, 0xa0,0x7e,0xb3, +0x10,0x2b,0xbc,0xba,0x38,0xdb,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x7c,0xfb,0xe5, +0x55,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x55,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x40,0x4b, +0xa9,0xd7,0xea,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12, +0x67,0xe2,0x12,0x0, 0x6e,0x50,0x27,0xa9,0xc7,0xea,0x7e,0xe3,0x10,0x4d,0xe4,0x7a, +0xb3,0x10,0x4d,0x7e,0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2, +0x7a,0xe3,0x10,0x4d,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x3, 0x12,0x6b,0x12,0x74,0x1, +0x7a,0xb3,0xf, 0xd3,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0xa, 0x18, +0x12,0x66,0xc7,0x7e,0x37,0xf, 0xd6,0x7e,0x27,0xf, 0xd4,0x7e,0x14,0xa, 0x62,0x12, +0x66,0xc7,0x6c,0xaa,0x80,0x36,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0xa, 0x92,0xbe, +0x34,0x13,0x88,0x40,0xc, 0xbe,0x34,0x75,0x30,0x28,0x1a,0xbe,0x34,0x7e,0xf4,0x50, +0x14,0x7e,0xb3,0x16,0xb4,0x4, 0x7a,0xb3,0x16,0xb4,0xb4,0xa, 0xd, 0x74,0x1, 0x7a, +0xb3,0x16,0xb3,0x80,0xf, 0xe4,0x7a,0xb3,0x16,0xb4,0xb, 0xa0,0x7e,0xb3,0x10,0x2b, +0xbc,0xba,0x38,0xc2,0x7e,0xa3,0x16,0xb3,0xbe,0xa0,0x1, 0x78,0x7, 0x7e,0xb3,0x16, +0xb2,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x16,0xb2,0xbe,0xb0,0x0, 0x28,0x6, 0x74,0x1, +0x7a,0xb3,0x16,0xb1,0x4c,0xaa,0x78,0xd, 0xe4,0x7a,0xb3,0x16,0xb2,0x7a,0xb3,0x16, +0xb1,0x7a,0xb3,0x16,0xb4,0x74,0x1, 0x7a,0xb3,0xf, 0xd2,0x12,0x67,0x1, 0x12,0x6b, +0xbd,0x7e,0xb3,0x11,0xc, 0xb4,0x1, 0x31,0xbe,0xf0,0x1, 0x78,0x2c,0x7e,0xb3,0xd, +0xfc,0x70,0x26,0x12,0x47,0x4a,0x7e,0xb3,0xd, 0xf7,0x70,0x19,0x7e,0x73,0x11,0x95, +0xa, 0x37,0x9, 0x73,0xf, 0x29,0x7a,0x73,0x10,0x4a,0xe4,0x7a,0xb3,0x10,0x4e,0x7a, +0xb3,0x11,0xc, 0x80,0x6, 0x6c,0xff,0x80,0x2, 0x6c,0xff,0x12,0x66,0x52,0x12,0x6c, +0x1f,0x7c,0xbf,0xda,0x79,0x22,0xca,0x3b,0x75,0x21,0x0, 0x7e,0x34,0xb, 0x79,0x7e, +0x24,0x0, 0xd, 0xe4,0x12,0x6e,0x21,0xe4,0x7a,0xb3,0xd, 0x16,0x7a,0xb3,0xd, 0x17, +0x7e,0xb3,0xf, 0xd2,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x41,0xcc,0x7e,0x34,0x13,0xb6, +0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, +0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e,0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27, +0xf, 0x4c,0x7e,0x14,0x13,0xb6,0x6c,0x11,0x12,0x4f,0x6e,0x7c,0xeb,0x7e,0x37,0xf, +0xd6,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4a,0x7e,0x14,0x13, +0xc0,0x12,0x4f,0x6e,0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x51,0x6c,0xcc,0x80,0x47, +0x7c,0xbf,0xc4,0x23,0x54,0x1f,0x7c,0x6b,0x7a,0x61,0x21,0xa, 0x2a,0x9, 0x72,0x13, +0xc0,0x7e,0x50,0x2, 0xac,0x5f,0x19,0x72,0xa, 0xb1,0xa, 0x1c,0x9, 0x71,0x13,0xb6, +0x19,0x72,0xa, 0xb2,0x7c,0xbf,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0x79,0xa, 0x46,0x2e,0x44,0xb, 0x79,0x7e,0x49,0xb0,0x4c,0xb7, +0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xb5,0xb, 0xa0,0xbc,0xda,0x38, +0xab,0x7a,0xf3,0xd, 0x16,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12, +0x6e,0x21,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e, +0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xb6,0x7e, +0x10,0x1, 0x12,0x4f,0x6e,0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x7e, +0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x6e,0x7c,0xdb, +0x6c,0xff,0x6c,0xaa,0x80,0xe, 0x6c,0xcc,0x80,0x4, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec, +0x38,0xf8,0xb, 0xa0,0xbc,0xda,0x38,0xee,0x7a,0xf3,0xd, 0x17,0xda,0x3b,0x22,0xca, +0x79,0x7e,0x34,0x0, 0x60,0x12,0x69,0xb9,0x7c,0xab,0x7a,0xa1,0x6a,0xbe,0xa0,0x8, +0x40,0x3, 0x2, 0x42,0xed,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0xe0,0x6, 0x80,0x3, 0x7e, +0xe0,0x5, 0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x42,0x1, +0x73,0x2, 0x42,0x19,0x2, 0x42,0x1e,0x2, 0x42,0x23,0x2, 0x42,0x28,0x2, 0x42,0x2d, +0x2, 0x42,0x32,0x2, 0x42,0x37,0x2, 0x42,0x3c,0x7e,0xf0,0x5e,0x80,0x26,0x7e,0xf0, +0x5f,0x80,0x21,0x7e,0xf0,0x61,0x80,0x1c,0x7e,0xf0,0x63,0x80,0x17,0x7e,0xf0,0x65, +0x80,0x12,0x7e,0xf0,0x67,0x80,0xd, 0x7e,0xf0,0x69,0x80,0x8, 0x7e,0xf0,0x6a,0x80, +0x3, 0x7e,0xf0,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x11,0xe9,0xa, 0xb, 0x7e,0xb3, +0x10,0xff,0xa, 0x1b,0x2d,0x1, 0x7c,0xb1,0x7c,0x1a,0x2e,0x10,0x21,0xa5,0xf7,0x7c, +0x9b,0xa, 0x9, 0x5e,0x4, 0x0, 0x1, 0xbe,0x4, 0x0, 0x1, 0x78,0x1c,0x7c,0x79,0xac, +0x7f,0x7e,0x50,0x3, 0xac,0x5f,0xe, 0x24,0xe, 0x24,0x2d,0x32,0x7c,0xba,0x3e,0xb0, +0x24,0x25,0xa, 0xb, 0x1b,0x8, 0x30,0x80,0xd, 0xac,0x9f,0x7c,0xba,0x3e,0xb0,0x24, +0x25,0xa, 0xb, 0x1b,0x8, 0x40,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, 0xb, 0xb, 0x8, +0xf0,0x7e,0x4, 0x0, 0xa, 0x7d,0x3f,0x8d,0x30,0x8d,0x30,0x7c,0x75,0xbe,0x70,0x0, +0x40,0x14,0xbc,0xe7,0x28,0x10,0x7e,0xc4,0x0, 0x64,0x7d,0xdf,0x8d,0xdc,0x7d,0xd, +0x9d,0x1, 0x7c,0x61,0x80,0x17,0xbc,0xe7,0x38,0x19,0xbe,0x70,0x9, 0x38,0x14,0x7e, +0xe4,0x0, 0x64,0x8d,0xfe,0x7d,0x2f,0xb, 0x24,0x9d,0x21,0x7c,0x65,0xa, 0x2a,0x19, +0x62,0x11,0xe9,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x3, 0x2, 0x42,0x46,0xda,0x79,0x22, +0xca,0xf8,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf, +0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10,0xa5,0x7e,0xb3, +0xf, 0x26,0x12,0x6e,0xe2,0x12,0x64,0x48,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x44,0x6, 0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0x0, 0x64,0x7a,0x37, +0xa, 0xaf,0xe4,0x7a,0xb3,0x16,0xba,0x12,0x6c,0x7b,0x12,0x46,0x40,0x12,0x6b,0x35, +0x6c,0xff,0x1a,0x2f,0x7e,0x34,0x0, 0x18,0xad,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda, +0x2e,0x34,0x0, 0x30,0x1b,0x35,0xb, 0x38,0x30,0x1a,0x2f,0x3e,0x24,0x59,0x32,0x13, +0x9c,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xda,0x12,0x6b,0x7b,0x12,0x6c,0xd1,0x12,0x69, +0x38,0x6c,0xff,0x1a,0x3f,0x3e,0x34,0x49,0x23,0x13,0x9c,0x1a,0xf, 0x7e,0x14,0x0, +0x18,0xad,0x10,0x7d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b, +0x35,0x1b,0x38,0x20,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xd8,0x12,0x6a,0xb, 0x12,0x49, +0x47,0x7e,0xb3,0xf, 0xd3,0x70,0x9, 0x7e,0xb3,0xf, 0xd2,0x70,0x3, 0x2, 0x43,0x18, +0x12,0x1f,0x97,0x12,0x33,0xaf,0x7a,0xb3,0xf, 0x25,0x12,0x6e,0x40,0x12,0x6d,0x37, +0x70,0x3, 0x2, 0x43,0x18,0x12,0x45,0x2a,0x7e,0x37,0xf, 0xda,0x12,0x8, 0x6, 0x12, +0x6e,0xe8,0x12,0x4e,0xc4,0x12,0x0, 0x6e,0x50,0x3, 0x12,0x30,0x5, 0x7e,0xb3,0x11, +0x15,0xb4,0x1, 0x4, 0xe4,0x12,0x6e,0xd3,0x12,0x67,0x3a,0x12,0x19,0x6d,0x12,0x6, +0x11,0x12,0x6f,0x7, 0x12,0x65,0x9a,0x12,0x36,0xf6,0x12,0x56,0x4e,0x12,0x1c,0xb1, +0x12,0x4b,0x9, 0x2, 0x43,0x18,0x12,0x0, 0x1e,0x12,0x6e,0x5c,0xda,0xf8,0x22,0xca, +0x3b,0x7c,0xeb,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x38,0x3, 0x2, 0x45,0x21,0x7c, +0xbe,0x12,0xd, 0x46,0x7e,0xb3,0xd, 0xfc,0x60,0x1e,0x7e,0xb3,0x15,0x54,0x70,0x8, +0x7e,0xb3,0x15,0x55,0x70,0x2, 0x80,0x10,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x28, +0xc, 0xe5,0x12,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x1e,0x7e,0xf0,0x1, +0xbe,0x73,0xf, 0x1c,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x15,0x54, +0xbe,0x73,0xf, 0x1c,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c, +0xbe,0x12,0xd, 0x46,0xe5,0x10,0x7a,0xb3,0xd, 0xf7,0x7e,0x31,0x10,0x74,0x2, 0xac, +0x3b,0x7e,0x24,0x15,0x2b,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x7d,0x75,0x12,0x64,0x75, +0x13,0x64,0x6c,0xee,0x80,0x67,0x6c,0xdd,0x80,0x59,0x74,0x2, 0xac,0xbd,0x9, 0x75, +0xd, 0x18,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0xa, 0x37,0x9d,0x32, +0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x21,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, 0x19,0xa, +0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x19,0xa, 0x37,0x9d,0x32,0x12,0x6e,0x11, +0x7c,0xc7,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0xa, 0xe5,0x12,0xbe,0xb1,0x21,0x28,0x3, +0x85,0x21,0x12,0xbe,0xc0,0x0, 0x28,0x9, 0xe5,0x13,0xbc,0xbc,0x28,0x3, 0x7a,0xc1, +0x13,0xb, 0xd0,0x7e,0x73,0xd, 0xf7,0xbc,0x7d,0x38,0x9f,0xb, 0xe0,0x7e,0x73,0xd, +0xf7,0xbc,0x7e,0x38,0x91,0xe5,0x12,0xb4,0x64,0x3, 0x75,0x12,0x0, 0xe5,0x13,0xb4, +0x64,0x3, 0x75,0x13,0x0, 0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x85,0x13,0x12,0x80, +0x6, 0x75,0x12,0x64,0x75,0x13,0x64,0xda,0x3b,0x22,0x12,0x59,0xb0,0x70,0x3, 0x2, +0x45,0xb1,0x75,0x6e,0x14,0x75,0x6d,0x1, 0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, +0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab, +0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e, +0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38, +0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a, +0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23, +0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, +0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4, +0x22,0xe5,0x6d,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x46,0x3d,0x15,0x6e,0xe5,0x6e,0x60, +0x79,0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a, +0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23, +0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, +0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1, +0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93, +0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, +0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10, +0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22,0x75,0x6d,0x0, 0xe5,0x21,0x22, +0xca,0x79,0x7e,0x74,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x20,0xe0,0x3, 0x2, 0x47,0x47, +0x54,0xfe,0x7a,0xb3,0x10,0xfe,0x9, 0x77,0x0, 0x2, 0xbe,0x73,0xf, 0x52,0x68,0x16, +0x7a,0x73,0xf, 0x52,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x7a,0x37,0xf, 0x48,0x7e,0x79,0x70,0xbe,0x73,0xf, 0x5c,0x68,0xe, 0x7a, +0x73,0xf, 0x5c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x54,0x9, 0x77,0x0, +0x1, 0xa, 0x37,0xbe,0x37,0xf, 0x56,0x68,0x4, 0x7a,0x37,0xf, 0x56,0x7e,0x27,0xf, +0x5d,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x9, 0x77,0x0, 0x5, 0xa, 0x37,0xbd, +0x32,0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x5d,0x9, +0x77,0x0, 0x8, 0xbe,0x73,0x11,0x11,0x68,0x24,0x7a,0x73,0x11,0x11,0xbe,0x70,0xf, +0x40,0x5, 0xe4,0x19,0xb7,0x0, 0x8, 0x9, 0x77,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6e, +0x31,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0x11,0x10,0x9, 0x77,0x0, +0x9, 0xbe,0x73,0x11,0x13,0x68,0x8, 0x7a,0x73,0x11,0x13,0x7a,0x73,0x11,0x12,0x9, +0x77,0x0, 0x7, 0xbe,0x73,0x11,0x14,0x68,0x4, 0x7a,0x73,0x11,0x14,0x9, 0xb7,0x0, +0xb, 0xbe,0xb1,0x51,0x68,0x5, 0xf5,0x51,0x12,0x6d,0x1f,0x9, 0x77,0x0, 0x25,0xa, +0x37,0xbe,0x37,0x11,0xd, 0x68,0x4, 0x7a,0x37,0x11,0xd, 0x9, 0x77,0x0, 0x6, 0xbe, +0x73,0x11,0xf, 0x68,0x4, 0x7a,0x73,0x11,0xf, 0x9, 0x77,0x0, 0x24,0xbe,0x73,0x11, +0x15,0x68,0x4, 0x7a,0x73,0x11,0x15,0xda,0x79,0x22,0xca,0x79,0xe4,0x6c,0xaa,0xa, +0x4a,0x19,0xb4,0xd, 0x68,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xf3,0xe4,0x7a,0xb3,0xd, +0xf7,0x7a,0xb3,0xd, 0xf8,0x7a,0xb3,0xd, 0xf9,0x7a,0xb3,0xd, 0xfa,0x7e,0xb3,0xf, +0xd3,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x48,0x50,0x7e,0xb3,0x10,0x2b,0xf5,0x21,0x7e, +0xb3,0x10,0x2c,0xf5,0x22,0x7e,0x37,0xf, 0x56,0x7a,0x35,0x23,0x7e,0x37,0xf, 0x58, +0x7a,0x35,0x25,0x7e,0x37,0xf, 0x5a,0x7a,0x35,0x27,0x7e,0x34,0x0, 0x14,0x7a,0x35, +0x2d,0x7e,0x37,0xf, 0xda,0x7e,0x24,0x0, 0x21,0x7e,0x14,0x0, 0x29,0x7e,0x4, 0x9, +0xc8,0x12,0x4e,0x15,0xe5,0x29,0x7a,0xb3,0xd, 0xf7,0xe5,0x2a,0x7a,0xb3,0xd, 0xf8, +0xe5,0x2b,0x7a,0xb3,0xd, 0xf9,0xe5,0x2c,0x7a,0xb3,0xd, 0xfa,0x6c,0xaa,0x80,0x6c, +0x7e,0x53,0xd, 0xf7,0xbc,0x5a,0x28,0x44,0x7c,0xba,0xc4,0x23,0x54,0x1f,0x7c,0x7b, +0x7c,0xba,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x69,0x7e,0x30,0x2, 0xac,0x3a,0x49,0x71,0x9, 0xc8,0x7d,0x7, 0xa, 0x0, 0x7c,0x41, +0x19,0x41,0xd, 0x18,0x7d,0x7, 0x7c,0x41,0x19,0x41,0xd, 0x19,0xa, 0x47,0x2e,0x44, +0xd, 0x68,0x7e,0x49,0xb0,0x4c,0xb6,0x7a,0x49,0xb0,0x80,0x1e,0xa, 0x15,0xa, 0x2a, +0x9d,0x21,0x3e,0x24,0x49,0x72,0x9, 0xf0,0x7d,0x17,0xa, 0x12,0x7c,0xb3,0x19,0xb2, +0xd, 0x40,0x7d,0x17,0x7c,0xb3,0x19,0xb2,0xd, 0x41,0xb, 0xa0,0x7e,0xb3,0xd, 0xf8, +0xa, 0x2b,0x7e,0xb3,0xd, 0xf7,0xa, 0x1b,0x2d,0x12,0xa, 0x2a,0xbd,0x21,0x48,0x80, +0xda,0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff, +0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d, +0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34, +0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d, +0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d, +0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d, +0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, +0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d, +0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, +0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d, +0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f, +0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x48, +0xa1,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x48,0xa1,0x30,0xd5,0x6, 0x9f, +0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, +0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, +0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0xca,0x79,0x6c,0xee,0x12,0x65,0xd9,0x7d,0x43, +0x6c,0xaa,0x6c,0x77,0x7e,0x30,0x6, 0xac,0x37,0x2e,0x14,0x6c,0x5d,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70, +0x5, 0x40,0xe1,0xbe,0xa0,0x5, 0x78,0x3, 0x2, 0x4a,0x18,0x7e,0x63,0xd, 0xf7,0xbe, +0x60,0x0, 0x38,0x3, 0x2, 0x4a,0x18,0x6c,0x77,0x2, 0x4a,0xd, 0x6c,0xff,0x6c,0x66, +0x80,0x41,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27, +0xf, 0xda,0xb, 0x28,0x20,0x7e,0x30,0x6, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6c,0x5f, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x2, 0x18,0x14,0xb, 0xf0,0x2e,0x14,0x6c, +0x61,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x28,0xe, 0x80,0x2, 0x6c, +0xff,0xb, 0x60,0x7e,0xb3,0x10,0x2b,0xbc,0xb6,0x38,0xb7,0x7e,0x50,0x6, 0xac,0x5a, +0x7d,0x12,0x2e,0x14,0x6c,0x61,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf, +0x38,0x17,0xb, 0xe0,0x2e,0x24,0x6c,0x62,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93, +0xbc,0xbe,0x38,0x7, 0x75,0x14,0x20,0x80,0xf, 0x6c,0xee,0xb, 0x70,0x7e,0xb3,0x10, +0x2c,0xbc,0xb7,0x28,0x3, 0x2, 0x49,0x8c,0xe5,0x15,0x25,0x14,0xf5,0x14,0xbe,0xb0, +0x0, 0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0xda,0x79, +0x22,0x7d,0x53,0x9f,0x11,0xbe,0x54,0x0, 0x0, 0x40,0x2d,0xbe,0x54,0x0, 0x3f,0x38, +0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x25,0x7e,0x34,0x1, 0xe1,0xad,0x32,0x6d,0x22,0x7c, +0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x39,0x48,0x4, 0x7e,0x18,0x0, 0x39,0x7e, +0x8, 0x0, 0x39,0x9f,0x1, 0x7f,0x10,0x22,0xbe,0x54,0x5, 0x80,0x40,0x29,0xbe,0x54, +0x5, 0xb8,0x38,0x23,0x7d,0x25,0x9e,0x24,0x5, 0x7f,0x7e,0x34,0x1, 0x7d,0xad,0x32, +0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x30,0x48,0x4, 0x7e,0x18, +0x0, 0x2f,0x2e,0x18,0x4, 0xd0,0x22,0xbe,0x54,0x5, 0xb8,0x28,0x19,0x7d,0x25,0x9e, +0x24,0x5, 0x9f,0x7e,0x34,0x1, 0x7d,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a, +0x24,0x2e,0x18,0x5, 0x0, 0x22,0xbe,0x54,0x2, 0xdf,0x38,0xe, 0x7e,0x34,0x2, 0xdf, +0x9d,0x35,0x6d,0x22,0x7e,0x14,0x0, 0xdd,0x80,0xc, 0x7d,0x35,0x9e,0x34,0x2, 0xe0, +0x6d,0x22,0x7e,0x14,0x0, 0xe3,0x12,0x48,0x96,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe, +0x54,0x2, 0xdf,0x38,0xa, 0x7e,0x8, 0x2, 0x7f,0x9f,0x1, 0x7f,0x10,0x80,0x4, 0x2e, +0x18,0x2, 0x80,0xbe,0x18,0x0, 0x39,0x58,0x5, 0x7e,0x18,0x0, 0x39,0x22,0xbe,0x18, +0x4, 0xd0,0x8, 0x4, 0x7e,0x18,0x4, 0xd0,0x22,0xca,0x3b,0x7e,0x73,0xd, 0xfb,0x7a, +0x73,0xd, 0xfc,0x7e,0xa3,0xf, 0x1b,0x7a,0xa3,0xf, 0x1c,0xe4,0x7a,0xb3,0xf, 0x1f, +0x7e,0x37,0x11,0xd, 0x4d,0x33,0x78,0x3f,0xbe,0xa0,0x0, 0x28,0x8, 0xe4,0x7a,0xb3, +0x16,0xab,0x2, 0x4b,0xd0,0x7e,0xb3,0x11,0xf, 0x20,0xe0,0x3, 0x2, 0x4b,0xd0,0x7e, +0xb3,0x11,0x14,0xbe,0xb3,0x16,0xab,0x28,0x3, 0x2, 0x4b,0xd0,0xe4,0x7a,0xb3,0x16, +0xab,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x11,0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa3,0x74, +0x1e,0x7a,0xb3,0x11,0x12,0x80,0x69,0xbe,0x34,0x0, 0x1, 0x78,0x22,0xbe,0xa0,0x0, +0x28,0x5e,0x6d,0x22,0x7a,0x27,0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x7a,0xb3,0x16, +0xab,0x74,0x25,0x7a,0xb3,0x16,0xae,0x74,0x1, 0x7a,0xb3,0x16,0xad,0x80,0x41,0xbe, +0x34,0x0, 0x3, 0x78,0x3b,0x6d,0x66,0x7a,0x67,0x10,0x1, 0x7e,0x74,0xd, 0xac,0x7a, +0x77,0xa, 0xaf,0x12,0x6f,0xd, 0x12,0x60,0x8c,0x12,0x58,0xcd,0x6d,0x33,0x7a,0x37, +0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x74,0x1, 0x7a,0xb3,0x16,0xad,0x7a,0x67,0x10, +0x1, 0x7a,0x77,0xa, 0xaf,0x75,0x9a,0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf, +0x7e,0xb3,0x16,0xad,0x70,0x6, 0x12,0x5b,0xd3,0x12,0x64,0x8e,0xda,0x3b,0x22,0x7e, +0x34,0x10,0x7e,0x7e,0x24,0x0, 0x81,0xe4,0x12,0x6e,0x21,0x74,0xc, 0x7a,0xb3,0x10, +0x80,0x7a,0xb3,0x10,0x81,0x74,0x9, 0x7a,0xb3,0x10,0x82,0x74,0xf, 0x7a,0xb3,0x10, +0x7e,0x74,0x3c,0x7a,0xb3,0x10,0x7f,0x74,0xa0,0x7a,0xb3,0x10,0x83,0x74,0x1e,0x7a, +0xb3,0x10,0x85,0x74,0xb, 0x7a,0xb3,0x10,0x86,0x74,0x1e,0x7a,0xb3,0x10,0x87,0xe4, +0x7a,0xb3,0x10,0x88,0x7a,0xb3,0x10,0x89,0xf5,0x52,0xf5,0x51,0x7a,0xb3,0x10,0xa3, +0x74,0x1, 0x7a,0xb3,0x10,0x84,0x7a,0xb3,0x10,0xa2,0x7a,0xb3,0x10,0xa5,0x74,0x5, +0x7a,0xb3,0x10,0xa4,0x74,0x3b,0x7a,0xb3,0x10,0xa6,0x74,0xb, 0x7a,0xb3,0x10,0xad, +0x12,0x6e,0xfa,0xa, 0x36,0x7a,0x73,0x10,0xa7,0x12,0x6e,0xfa,0x7a,0x73,0x10,0xa8, +0x12,0x6e,0xff,0xa, 0x36,0x7a,0x73,0x10,0x9f,0x12,0x6e,0xff,0x7a,0x73,0x10,0xa0, +0xe4,0x7a,0xb3,0x10,0xae,0x74,0x1f,0x7a,0xb3,0x10,0xcf,0xe4,0x7a,0xb3,0x10,0xb0, +0x12,0x6e,0x4e,0x7a,0xb3,0x10,0xaf,0x12,0x6d,0x4f,0x7a,0xb3,0x10,0xa1,0x7e,0x34, +0x10,0x8e,0x7e,0x24,0x0, 0x8, 0x74,0xff,0x12,0x6e,0x21,0x74,0x5, 0x7a,0xb3,0x10, +0x8e,0x74,0x1, 0x7a,0xb3,0x10,0x8f,0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x0, 0x40,0x2d, +0xbe,0xf4,0x0, 0x3f,0x38,0x27,0x7e,0x44,0x0, 0x3f,0x9d,0x4f,0x7e,0x54,0x1, 0x8c, +0xad,0x54,0x6d,0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x32,0x40,0x4, 0x7e,0x28, +0x0, 0x32,0x7e,0x18,0x0, 0x32,0x9f,0x12,0x7f,0x21,0x2, 0x4d,0x5c,0xbe,0xf4,0x3, +0x0, 0x40,0x22,0x7d,0x4f,0x9e,0x44,0x3, 0x0, 0x7e,0x54,0x1, 0x82,0xad,0x54,0x6d, +0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x2e,0x40,0x4, 0x7e,0x28,0x0, 0x2d,0x2e, +0x28,0x2, 0xa2,0x80,0x57,0xbe,0xf4,0x1, 0x9f,0x38,0xe, 0x7e,0x54,0x1, 0x9f,0x9d, +0x5f,0x6d,0x44,0x7e,0x14,0x0, 0xdd,0x80,0xc, 0x7d,0x5f,0x9e,0x54,0x1, 0xa0,0x6d, +0x44,0x7e,0x14,0x0, 0xe5,0x7f,0x12,0x12,0x48,0x96,0x7f,0x21,0x7c,0xba,0x7c,0xa9, +0xa, 0x48,0xbe,0xf4,0x1, 0x9f,0x38,0xa, 0x7e,0x18,0x1, 0x67,0x9f,0x12,0x7f,0x21, +0x80,0x4, 0x2e,0x28,0x1, 0x68,0xbe,0x28,0x0, 0x32,0x50,0x6, 0x7e,0x28,0x0, 0x32, +0x80,0xa, 0xbe,0x28,0x2, 0xa2,0x28,0x4, 0x7e,0x28,0x2, 0xa2,0x7d,0x35,0x22,0xca, +0x3b,0x6d,0x11,0x7d,0x1, 0x7d,0x21,0x7e,0xa0,0x2, 0x7e,0x70,0x2, 0x6c,0x66,0x80, +0x39,0x6c,0x99,0x80,0x2b,0x7e,0xd0,0x30,0xac,0xd6,0x7e,0xf0,0x2, 0xac,0xf9,0x7d, +0xf7,0x2d,0xf6,0x2e,0xf7,0xf, 0xda,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, 0x14,0x8, 0x4, +0xb, 0x4, 0x80,0x8, 0xbe,0xf4,0xff,0xec,0x58,0x2, 0xb, 0x24,0xb, 0x14,0x2c,0x97, +0x7e,0xb3,0x10,0x2c,0xbc,0xb9,0x38,0xcd,0x2c,0x6a,0x7e,0xb3,0x10,0x2b,0xbc,0xb6, +0x38,0xbf,0x7e,0x54,0x0, 0x3, 0xad,0x51,0x7d,0x35,0x1e,0x34,0x1e,0x34,0xbd,0x30, +0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb5,0x7e,0xb3,0x16,0xb6,0xbe,0xb0,0x5, 0x50,0x7, +0x4, 0x7a,0xb3,0x16,0xb6,0x80,0x39,0xe4,0x7a,0xb3,0x16,0xb6,0x75,0x71,0x1, 0x80, +0x2f,0xbd,0x32,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb6,0x7e,0xb3,0x16,0xb5,0xbe,0xb0, +0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb5,0x80,0x16,0xe4,0x7a,0xb3,0x16,0xb5,0x75, +0x71,0x2, 0x80,0xc, 0xe4,0x7a,0xb3,0x16,0xb5,0x7a,0xb3,0x16,0xb6,0x75,0x71,0x0, +0xe5,0x71,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x56,0xf5,0xba, +0x7e,0x55,0x2d,0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1,0x9, +0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54,0xe0,0x4c,0xba, +0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c,0xb7,0xf5,0xc6, +0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, 0x4, 0x6e,0x34, +0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x4, 0x1a, +0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, 0x6, 0x7c,0xb1, +0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, 0x4e,0x96,0x43, +0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xa, +0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1,0x0, 0x3, 0x75, +0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19,0xb1,0x0, 0x1, +0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0xf, 0xd2,0x60,0x6, 0x7e,0xb3, +0xf, 0xd3,0x70,0x18,0x7e,0x34,0xd, 0x68,0x7e,0x24,0x0, 0x3, 0xe4,0x12,0x6e,0x21, +0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4,0x12,0x6e,0x21,0x6c,0xee,0x80,0x6b, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0x7a,0x71,0x21,0x9, 0x65,0xd, 0x19,0x7a, +0x61,0x22,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xdb,0x7c,0xbe,0x54,0x7, 0x7e,0x24, +0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xc5,0x7e,0x50,0x30,0xac,0x57, +0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0xbe,0x37, +0xf, 0x54,0x48,0x25,0xa, 0x3d,0x9, 0xb3,0xd, 0x68,0x5c,0xbc,0x68,0x1b,0x7e,0x50, +0x7, 0xac,0x5e,0x2e,0x24,0xd, 0x6b,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xe, 0xd, +0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x7d,0xb, 0xf0,0xb, 0xe0,0x7e,0x73,0xd, 0xf7,0xbc, +0x7e,0x38,0x8d,0x7a,0x73,0xd, 0xfb,0x7a,0xf3,0xf, 0x1b,0xda,0x3b,0x22,0xca,0xf8, +0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x2, 0x50,0x9, 0x7e,0x90,0x2, +0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, 0x6e,0x44,0xff, +0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0xa, 0x50,0x6b,0x4c,0xff,0x78,0x14, +0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xe4, +0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd,0x1b,0xf5,0xb, +0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd,0xf4,0x18,0x37, +0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd,0x1b,0xc5,0xb, +0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff,0xff,0xb, 0xf4, +0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18,0x9, 0xa, 0xda, +0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x3, 0x2, 0x4f,0x7d, +0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x33,0x7d,0x73,0x75,0x25,0x0, 0x7e,0x64, +0x5, 0xe0,0x75,0x23,0x0, 0x80,0x3c,0x75,0x24,0x0, 0x7e,0x51,0x23,0x74,0x18,0xac, +0x5b,0x3e,0x24,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2d,0x36,0x7a,0x35, +0x21,0x49,0x23,0x0, 0x30,0xb, 0x38,0x30,0x9d,0x32,0x12,0x6e,0x11,0xe5,0x24,0xb4, +0x17,0x2, 0x1e,0x34,0xbd,0x37,0x28,0x2, 0x7d,0x73,0x5, 0x24,0xe5,0x24,0xb4,0x18, +0xc9,0x5, 0x23,0xe5,0x25,0xa, 0x2b,0x7e,0x33,0x10,0x7c,0xa, 0x13,0x9d,0x12,0x1b, +0x14,0xe5,0x23,0xa, 0x2b,0xbd,0x21,0x48,0xae,0xbe,0x74,0x0, 0x41,0x28,0x11,0x7e, +0x34,0x0, 0x73,0x7e,0xa3,0x16,0x25,0x74,0x12,0xa4,0x59,0x35,0x16,0x36,0x80,0x26, +0x7e,0x43,0x16,0x25,0x7e,0x50,0x12,0xac,0x45,0x49,0x32,0x16,0x36,0xbd,0x37,0x50, +0x6, 0x59,0x72,0x16,0x36,0x80,0xf, 0xbe,0x34,0x0, 0x0, 0x28,0x9, 0x2e,0x24,0x16, +0x36,0x1b,0x34,0x1b,0x28,0x30,0xda,0x3b,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca, +0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x0, 0x46, +0x7e,0x35,0x6b,0xb, 0x34,0x7a,0x35,0x6b,0x7e,0xb3,0x16,0xba,0x4, 0x7a,0xb3,0x16, +0xba,0x7e,0x35,0x6b,0xbe,0x34,0x3, 0xe8,0x40,0x13,0x6d,0x33,0x7a,0x35,0x6b,0x7e, +0xb3,0x16,0xab,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x16,0xab,0x7e,0x73,0x16, +0xaf,0xbe,0x73,0x16,0xae,0x28,0xb, 0x7e,0xb3,0x16,0xae,0x4, 0x7a,0xb3,0x16,0xae, +0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xad,0x7e,0xb3,0x16,0xb0,0x60,0x5, 0x14,0x7a, +0xb3,0x16,0xb0,0x7e,0x37,0x10,0x1, 0xb, 0x34,0x7a,0x37,0x10,0x1, 0x7e,0x37,0xa, +0xaf,0xbe,0x37,0x10,0x1, 0x28,0x3, 0x12,0x6f,0x10,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x75, +0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8, +0x16,0xbb,0x75,0x6a,0x0, 0x75,0x8, 0x1, 0x75,0x9, 0x0, 0x75,0xa, 0x0, 0x75,0xc, +0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0xc2,0x0, 0x75,0x11,0x0, 0x75, +0x12,0x64,0x75,0x13,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x18,0x1, 0x75,0x6b, +0x0, 0x75,0x6c,0x0, 0x75,0x71,0x0, 0x75,0x6d,0x0, 0x75,0x72,0x0, 0x75,0x73,0x1, +0x75,0x6f,0x18,0x75,0x70,0x0, 0x75,0x74,0x0, 0x75,0x75,0x0, 0x75,0x1d,0x0, 0x75, +0x1e,0xff,0x75,0x1f,0x0, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x6f,0x17,0xb, 0xa, 0x40, +0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, +0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x5c, +0x38,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, 0x78,0xc, 0x7e,0x34,0x10,0x2b, +0x12,0x6b,0x58,0xa9,0xc7,0xea,0x80,0x27,0xbe,0xd0,0x5, 0x78,0x1f,0xa9,0xd7,0xea, +0x7e,0xe3,0x10,0x4a,0x7e,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x4d,0x12,0x66,0x8d, +0x7a,0xb3,0x10,0x4a,0x74,0x1, 0x7a,0xb3,0x10,0x78,0x80,0x3, 0xe4,0x80,0x4e,0x7e, +0xb3,0x11,0x96,0x7e,0x34,0x10,0x2b,0xb4,0x1, 0xa, 0x12,0x31,0xfb,0xe4,0x7a,0xb3, +0x11,0x96,0x80,0xa, 0x12,0x61,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5e,0x27,0x7e,0x34, +0x10,0x2b,0x12,0x6a,0xa5,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, 0x7e,0x73,0x11,0xe8, +0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x69,0x64,0xbe,0xd0,0x5, 0x78,0xd, 0x7a,0xe3, +0x10,0x4a,0x7a,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x1, 0xda,0x79,0xda, +0xd8,0x22,0x7e,0x34,0xe, 0xd, 0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x7e, +0x34,0xe, 0x53,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0xe, 0x99, +0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x6c,0xaa,0x74,0x3, 0xa, 0x4a,0x19, +0xb4,0xe, 0xdf,0x19,0xb4,0xe, 0xe9,0x7e,0x44,0xff,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x59,0x43,0xe, 0xf3,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0xf, 0x7, 0xb, 0xa0,0xbe, +0xa0,0xa, 0x40,0xd7,0xe4,0x7a,0xb3,0xf, 0x1b,0x7a,0xb3,0xf, 0x1c,0x7a,0xb3,0xf, +0x1d,0x7a,0xb3,0xf, 0x1f,0x7a,0xb3,0xf, 0x20,0x7a,0xb3,0xf, 0x21,0x7a,0xb3,0xf, +0x22,0x7a,0xb3,0xf, 0x23,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x25,0x12,0x6a,0xee, +0x74,0x3, 0x7a,0xb3,0xf, 0x26,0x74,0x1, 0x7a,0xb3,0xf, 0x27,0xe4,0x7a,0xb3,0xf, +0x28,0x22,0xca,0xf8,0x7c,0xab,0x6c,0x33,0x7c,0x27,0x80,0x73,0x7e,0x90,0x7, 0xac, +0x93,0x9, 0xf4,0xe, 0x57,0x7e,0x10,0x7, 0xac,0x12,0x9, 0xb0,0xe, 0x11,0xbc,0xfb, +0x78,0x5b,0xbe,0xf0,0xff,0x68,0x56,0x7e,0x10,0x7, 0xac,0x1a,0x7d,0xf0,0x2d,0xf2, +0x19,0xff,0x0, 0x4, 0x49,0x44,0xe, 0x53,0x2d,0x2, 0x1b,0x8, 0x40,0x7e,0x10,0x7, +0xac,0x13,0x49,0x0, 0xe, 0x55,0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x59,0x4, 0x0, +0x2, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x12,0x7e,0x90,0x7, 0xac,0x9a,0x2d, +0x42,0x19,0x14,0x0, 0x5, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x13,0x7e,0x90, +0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x6, 0xb, 0xa0,0x80,0x6, 0xb, 0x20,0xbc, +0x62,0x38,0x89,0xb, 0x30,0xbe,0x30,0xa, 0x50,0x3, 0x2, 0x53,0x8, 0x7c,0xba,0xda, +0xf8,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x3b,0xbe,0xa0,0x3e,0x38,0x36,0xbe,0xa0, +0x4, 0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x15,0xde,0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0, +0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x0, 0x6, 0x7e,0x34,0x0, 0x76,0x80, +0x4, 0x7e,0x34,0x0, 0xb8,0x7a,0x37,0x0, 0xfd,0xa, 0x3a,0x2e,0x37,0x0, 0xfd,0x9, +0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0xb, 0x22,0xbe,0xa0,0x80,0x40,0xc, +0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0xf, 0xfe,0x22,0xbe,0xa0,0xfc,0x78, +0x5, 0x7e,0xb3,0x10,0xa5,0x22,0xbe,0xa0,0xfd,0x78,0x8, 0x7e,0x37,0x10,0x46,0x7e, +0x39,0xb0,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3,0x10,0x4a,0x22,0xbe,0xa0,0xf9, +0x78,0x5, 0x7e,0xb3,0x16,0xbb,0x22,0xbe,0xa0,0xfa,0x78,0x3, 0xe5,0x6a,0x22,0xe4, +0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x4d,0xf5,0x24,0xe4,0x7a,0xb3, +0x10,0x4d,0x7e,0x34,0x10,0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a,0xa5, +0x75,0x21,0x0, 0x12,0x69,0x64,0x12,0x6e,0xb9,0x60,0xfb,0xa9,0xb7,0xea,0x7d,0x36, +0x7d,0x27,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2,0x75,0x22,0x0, 0x80,0x36,0x75,0x23, +0x0, 0x80,0x26,0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b,0x2d,0x23, +0x3e,0x24,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, +0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x23,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x23, +0x38,0xd1,0x5, 0x22,0x7e,0x73,0x10,0x2b,0xbe,0x71,0x22,0x38,0xc1,0x5, 0x21,0xe5, +0x21,0xbe,0xb0,0x4, 0x40,0x9d,0xe5,0x24,0x7a,0xb3,0x10,0x4d,0xda,0x3b,0x22,0xca, +0xf8,0x30,0x90,0x58,0xc2,0x90,0x5, 0xa, 0xe5,0xa, 0xb4,0x1, 0x6, 0xe5,0x91,0xf5, +0xf, 0x80,0x29,0xe5,0xb, 0xc4,0x7c,0xfb,0x5e,0xf0,0x7, 0x78,0xe, 0xe5,0xa, 0x25, +0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x56,0xd7,0x80,0x11,0xbe,0xf0,0x4, 0x78,0xc, +0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x15,0xe2,0xe5,0xb, 0xc4,0x7c, +0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80, +0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x4a,0xf5,0x91,0x30,0x91,0x28,0xc2, +0x91,0x5, 0x9, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0xb, 0xe5, +0x9, 0x25,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80,0xd, 0xa5,0xbd,0x4, 0x9, 0xe5,0x9, +0x25,0xf, 0x12,0x27,0x4a,0xf5,0x91,0xda,0xf8,0x22,0x6c,0x33,0xbe,0x30,0x18,0x50, +0x1e,0xa, 0x3, 0x2e,0x7, 0x10,0x35,0x7e,0x9, 0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, +0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x16,0x1e,0xa0,0x80,0x12,0xa, +0x3, 0x2e,0x7, 0x10,0x33,0x9, 0x20,0xff,0xe8,0xa, 0x52,0x2e,0x54,0x0, 0x18,0x7c, +0xab,0x7e,0x23,0x10,0x3a,0xbe,0x20,0x3, 0x28,0xe, 0x7e,0x10,0x2, 0xac,0x1a,0x2d, +0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x21,0xa, 0x42,0x2e,0x44,0x0, 0xc, 0x7e,0x4, +0x0, 0xf, 0x9d,0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0x0, +0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e,0x44,0x7f,0xff,0x9d,0x40,0x7e, +0x10,0x2, 0xac,0x13,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xbe,0x30,0x25,0x50,0x3, +0x2, 0x55,0x3c,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e,0x37,0xf, +0xd6,0xb, 0x38,0x10,0xbe,0x17,0xe, 0x7, 0x8, 0x12,0x7d,0x2, 0x2e,0x7, 0xf, 0xd4, +0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30,0x80,0x18,0x6d,0x33,0x9e,0x37, +0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x9e,0x37,0xe, +0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xbb,0x6c,0xaa,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xe, 0x7, 0x8, 0x12,0x7d,0x2, 0x2e,0x4, +0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30,0x80,0x18,0x6d,0x33, +0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x9e, +0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xc0,0x22,0xca,0x69, +0xca,0xf8,0x6c,0x11,0x7e,0xd0,0x7, 0xac,0xd1,0x9, 0x6, 0xe, 0x9d,0x5e,0x0, 0xf, +0x49,0xf6,0xe, 0x9b,0xbe,0xf4,0x5, 0x18,0x40,0x3c,0x49,0x46,0xe, 0x99,0x7d,0x34, +0x12,0x6b,0xde,0x7c,0xfb,0xbe,0xf0,0x3, 0x40,0xe, 0x7e,0x14,0x4, 0xff,0x74,0x7, +0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x3e,0x74,0x2, 0xac,0xbf,0x49,0x45,0x16,0x95, +0x74,0x7, 0xac,0xb1,0x59,0x45,0xe, 0x99,0x7e,0x14,0x7, 0xd0,0x74,0x7, 0xac,0xb1, +0x59,0x15,0xe, 0x9b,0x80,0x25,0xbe,0xf4,0x5, 0x0, 0x40,0x1f,0x7e,0x14,0x4, 0xff, +0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x74,0x7, 0xac,0xb1,0x49,0x15,0xe, 0x9b, +0xbe,0x14,0x5, 0xa, 0x40,0x5, 0x7c,0xb0,0x12,0x68,0xab,0xb, 0x10,0xbe,0x10,0xa, +0x40,0x82,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x70,0x41,0x7e,0x74,0x0, 0xb, 0x7a, +0x79,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c,0x7b,0xa5,0xbf,0x4, 0x15,0x7e, +0xb3,0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x13,0x74,0x27,0x7e, +0x70,0x3, 0x80,0x4b,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, 0x74,0x1, 0x7e,0x70,0x1, +0x12,0x0, 0x5e,0x80,0x45,0x74,0x27,0x7e,0x70,0x1, 0x80,0x33,0xbe,0xb0,0xfc,0x68, +0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa,0x5, 0x7e,0x60,0x5, 0x80,0x10,0xa5,0xbf,0x55, +0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5,0xbf,0x66,0x20,0x7e,0x60,0x7, 0x74,0x27,0x7c, +0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0x24,0x80,0x12, +0x6d,0xe0,0x80,0x6, 0xb4,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x79,0x22,0x6c,0x77,0x6c, +0xaa,0x80,0x3c,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, 0xda,0x2e,0x24, +0x0, 0x30,0x7d,0x12,0x1b,0x16,0xb, 0x18,0x40,0xbe,0x44,0x0, 0x3c,0x8, 0x1e,0x7e, +0x14,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x5e,0x14,0x4, 0x44, +0x68,0xb, 0x1b,0x25,0xb, 0x28,0x20,0xbd,0x42,0x8, 0x2, 0xb, 0x70,0xb, 0xa0,0x7e, +0x63,0x10,0x2b,0xbc,0x6a,0x38,0xbc,0xbe,0x70,0x1, 0x40,0x30,0x6c,0xaa,0x80,0x24, +0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, 0xda,0x2e,0x24,0x0, 0x30,0x1b, +0x25,0xb, 0x28,0x30,0x7e,0x30,0x2, 0xac,0x3a,0x59,0x31,0x16,0x6f,0x6d,0x33,0x1b, +0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xd4,0x22,0xca,0x79,0x6c, +0xff,0x6c,0xee,0x80,0x63,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbe,0x54, +0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x2a,0x9, 0xb2, +0xd, 0x68,0x5c,0xb7,0x68,0x40,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x24,0xd, 0x18,0x7e, +0x70,0x2, 0xac,0x7f,0x2e,0x34,0xd, 0x18,0x7e,0x14,0x0, 0x2, 0x12,0x6d,0x7d,0x7c, +0xbf,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x4a,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x4c, +0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xe0,0x7e,0x63,0xd, 0xf7,0xbc,0x6e,0x38,0x95, +0x7a,0xf3,0xd, 0xf7,0xda,0x79,0x22,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, +0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x7e,0xb3,0x10,0xa5,0x24,0xfa,0x68,0x17, +0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x16,0xb9,0xbe,0xb0,0x5, 0x68,0x4c, +0x74,0x5, 0x7a,0xb3,0x16,0xb9,0x22,0x7e,0xb3,0x16,0xb9,0xb4,0x5, 0x3e,0x74,0x6, +0x7a,0xb3,0x16,0xb9,0x74,0xfa,0x12,0x6d,0x66,0x75,0x9a,0x80,0x7e,0x34,0x77,0xf8, +0x12,0x69,0xe2,0x7e,0x34,0x77,0xf8,0x74,0x66,0x12,0x5a,0x21,0x7e,0x34,0x77,0xf9, +0x74,0xbb,0x12,0x5a,0x21,0x80,0x12,0x7e,0xb3,0x16,0xb9,0xb4,0x5, 0xe, 0x74,0x7, +0x7a,0xb3,0x16,0xb9,0x74,0xfa,0x12,0x6d,0x66,0x75,0xe9,0xff,0x22,0x0, 0x0, 0x0, +0x0, 0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x16,0xa9,0xb4,0x1, 0x14,0x7e,0x73,0x16, +0xac,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xe4,0x7a,0xb3,0x16,0xa9,0x80, +0xb, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xd0,0xca,0xc2, +0xa8,0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x16,0xb0,0x7e,0xb3,0x16,0xb0,0x70,0xfa,0x12, +0x6e,0xb0,0x12,0x61,0x8e,0x12,0x6b,0xff,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34, +0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x12,0x6a,0x59,0x12,0x6a,0x7f,0x12, +0x52,0x72,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x2, 0x6e,0xf4,0xca, +0x3b,0x7d,0x72,0x7d,0x63,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0x7d,0x36,0x7e,0x24, +0x0, 0x4a,0xe4,0x12,0x6e,0x21,0x7d,0x37,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6e,0x21, +0x75,0x21,0x1, 0x12,0x6c,0x1f,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0x75,0x22,0x0, +0x7e,0x51,0x22,0x74,0x2, 0xac,0x5b,0x49,0x2, 0xa, 0x62,0x1e,0x4, 0x1e,0x4, 0x7d, +0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d,0x30,0x1b,0x18,0x30,0x49,0x12,0xa, 0x18,0x1e, +0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x22,0xe5, +0x22,0xb4,0x25,0xcc,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x5, 0x40,0xb6,0xda,0x3b,0x22, +0x6c,0x77,0x7e,0x63,0xd, 0xfa,0xa, 0x16,0x7e,0x63,0xd, 0xf9,0xa, 0x26,0x2d,0x21, +0xbe,0x24,0x0, 0xb4,0x28,0x3, 0x74,0x1, 0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x22,0x8, 0x9a,0xbe,0x24,0x3, 0xe8,0x8, 0x9, 0xb, 0x70,0xbe,0x70, +0x10,0x68,0xe, 0x80,0x2, 0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10,0x2c,0xbc,0x6a,0x38, +0xdc,0xa5,0xbf,0x10,0x2a,0x6c,0x77,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x22,0x8, 0xca,0xbe,0x24,0x7, 0xd0,0x8, 0x9, 0xb, 0x70,0xa5,0xbf,0x8, 0x5, +0x74,0x1, 0x22,0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xdc,0xe4, +0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb,0x75,0xfb,0xa5,0x75,0xfb,0xf, +0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68,0x18,0xbe,0x34,0x73,0xf9,0x68,0x12,0xbe, +0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0xe4, +0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c,0xb7,0x54,0xfe,0xf5,0xf2,0x75,0xf3,0x80, +0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75,0xf6,0xff,0x7a,0xa1,0xf6,0x80, +0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75,0xf5,0x80,0x74,0x1, 0x12,0x6d,0x66,0xa9, +0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0x74,0x1, 0x22, +0x74,0xa, 0x7a,0xb3,0xf, 0x46,0x74,0x14,0x7a,0xb3,0xf, 0x47,0x7e,0x34,0x3, 0x20, +0x7a,0x37,0xf, 0x48,0x7a,0x37,0xf, 0x4a,0x7e,0x24,0x2, 0x58,0x7a,0x27,0xf, 0x4c, +0x7a,0x37,0xf, 0x4e,0x7a,0x37,0xf, 0x50,0x74,0xc, 0x7a,0xb3,0xf, 0x52,0x74,0x8, +0x7a,0xb3,0xf, 0x53,0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, 0x54,0x7a,0x37,0xf, 0x56, +0x7a,0x37,0xf, 0x58,0x7e,0x34,0x0, 0x28,0x7a,0x37,0xf, 0x5a,0x74,0xf, 0x7a,0xb3, +0xf, 0x5c,0xe4,0x7a,0xb3,0xf, 0x5f,0x74,0x4, 0x7a,0xb3,0xf, 0x60,0x7e,0x34,0x0, +0x64,0x7a,0x37,0xf, 0x61,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0xf, 0x5d,0x22,0xca,0x3b, +0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x3c,0xf5,0x1c,0xe4,0x7a,0xb3,0x10,0x3c,0x7d, +0x36,0x7d,0x27,0x12,0x6a,0xca,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x75,0x1a,0x0, +0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60,0xfb,0x7d,0x36,0x7e,0x25, +0x6f,0x12,0x55,0x3a,0x75,0x1b,0x0, 0x7e,0x51,0x1b,0x74,0x2, 0xac,0x5b,0x7d,0x32, +0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31, +0x1b,0x28,0x30,0x5, 0x1b,0xe5,0x1b,0xb4,0x25,0xdd,0x5, 0x1a,0xe5,0x1a,0xbe,0xb0, +0x4, 0x40,0xbd,0xe5,0x1c,0x7a,0xb3,0x10,0x3c,0xda,0x3b,0x22,0x7d,0x3, 0x75,0xcc, +0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0,0xe5,0xca,0x54,0x1, 0x4c,0xba, +0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1,0xe1,0x9, 0x70,0x0, 0xe, 0x2e, +0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c,0xba,0xc4,0x33,0x54,0xe0,0x7c, +0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, 0xb0,0x0, 0x13,0x54,0x3, 0xa, +0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5,0xe3,0x54,0xe7,0x4c,0xba,0xf5, +0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12,0x5d,0x65,0x9, 0xb0,0x0, 0x14, +0xf5,0xe7,0x22,0x7e,0xb3,0x16,0xa9,0x70,0x17,0xe5,0xcc,0x7a,0xb3,0x16,0xaa,0x7e, +0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xac,0x74,0x1, 0x7a,0xb3,0x16,0xa9, +0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc,0xc2,0xca,0xc2,0xc8,0xa9,0xc4, +0xcb,0x80,0x2e,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0x23,0xe5,0x74,0xb4,0x1, 0x1e,0xe5, +0x75,0xb4,0x1, 0x19,0xa9,0xc3,0xcb,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0xe4,0x12,0x6d, +0xaa,0x7e,0xb3,0x16,0xad,0x60,0xcc,0x22,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34, +0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0xd, 0x12,0x6e,0xb0,0x12,0x61,0x8e,0x12, +0x6f,0x16,0x12,0x6d,0xbc,0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x12,0x6b,0xff,0x12,0x6a, +0x59,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x12,0x6e,0xf4,0x7e,0xb3, +0x10,0xa5,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14,0x68,0x16,0x14,0x68,0x13,0x24, +0x5, 0x78,0xeb,0x12,0x42,0xf0,0x80,0xe6,0x12,0x5e,0xda,0x80,0xe1,0x12,0x6a,0x32, +0x80,0xdc,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x12,0x58,0x57,0x80,0xd1,0x7c,0xa5,0x7c, +0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5, +0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2,0x1e,0xb0,0x1e,0xb0,0x54,0xf, +0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x1e,0x50,0x1e,0x50,0x1e,0x50, +0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1,0x7c,0xb3, +0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0,0x43,0xc2,0x7, 0x80,0x7, 0x43, +0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0xa9,0xc6,0xcb, +0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, 0xac,0x13,0x2e,0x4, 0x1c,0x3a, +0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c,0x33,0x80,0x43,0xa, 0x3, 0x2d, +0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0,0xb, 0x2d,0x3, 0x7e,0x9, 0xb0, +0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x3e, +0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c,0xb2,0x1e,0xb0,0x7e,0x90,0x2, +0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d,0xf, 0x1b,0x48,0x0, 0xb, 0x30, +0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, 0x9, 0xb2,0x0, 0xc, 0x54,0x7f, +0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x7, +0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4,0xb, 0x6c,0xaa,0xa, 0x1a,0x49, +0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5,0xb, 0xa0,0xbe,0xa0,0x25,0x40, +0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39,0xb0,0xf5,0xe5,0x75,0xe4,0x31, +0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x32,0x5e, +0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0xca,0x79,0x7e,0x71,0x54,0x3e,0x70,0x3e, +0x70,0x7c,0xb7,0x24,0x56,0xa, 0x2b,0xb, 0x28,0x50,0x7c,0xab,0x7c,0xb7,0x24,0x58, +0xa, 0x3b,0xb, 0x38,0x70,0x4d,0x77,0x68,0x1f,0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0, +0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x58,0x7d, +0x37,0x7e,0x24,0x18,0x0, 0x12,0x55,0x3a,0x5, 0x54,0xe5,0x53,0xbe,0xb1,0x54,0x28, +0x10,0x12,0x62,0xd5,0xb4,0x1, 0x5, 0x75,0x55,0x1, 0x80,0x8, 0x75,0x55,0x3, 0x80, +0x3, 0x75,0x55,0x2, 0xda,0x79,0x22,0x6d,0x11,0x7e,0x24,0x1c,0x1c,0x1b,0x28,0x10, +0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0xa3,0x0, 0x50,0x80,0x2, 0x7c, +0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x7e,0x4, +0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, 0x14,0x1b,0x8, 0x10,0x49,0x13, +0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0x49,0x13,0x0, 0x43, +0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0xb, 0x50,0xbe,0x50,0xd, 0x40, +0xb1,0x22,0x75,0x9, 0x0, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, +0x9, 0xe5,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, +0x12,0x27,0x4a,0xf5,0x91,0x75,0xa, 0x0, 0xe4,0x7a,0xb3,0x0, 0xfa,0x7e,0x34,0x0, +0x76,0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0x0, 0xb8,0x7e,0x24, +0x0, 0x42,0x74,0xff,0x12,0x6e,0x21,0x74,0xaa,0x7a,0xb3,0x0, 0x76,0x7a,0xb3,0x0, +0x77,0x7a,0xb3,0x0, 0xb8,0x7a,0xb3,0x0, 0xb9,0x22,0xca,0xf8,0x74,0x3, 0x7a,0xb3, +0x16,0xa0,0xe4,0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x74,0x3, 0x7a,0xb3,0x16, +0xa0,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x7e, +0xf3,0x16,0xa0,0xbe,0xf0,0x3, 0x78,0x1d,0xe5,0xb, 0x30,0xe7,0xe4,0x12,0x6b,0x35, +0x7e,0x37,0xf, 0xd6,0x7a,0x37,0x16,0x9d,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x16,0x9b, +0x53,0xb, 0x7f,0x80,0xcc,0x7a,0xf3,0x10,0xa5,0x12,0x0, 0x1e,0x12,0x0, 0x6a,0xda, +0xf8,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5, +0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7c,0xb3,0xf5,0xbd,0xa, +0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5,0xc3,0xe5,0xc4,0x54,0xe0,0x4c, +0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23,0x4e,0x24,0x0, 0x1, 0x7c,0x15, +0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2,0x0, 0x0, 0x0, 0x0, 0xa9,0x37, +0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x6c,0xaa,0x6c,0x77,0x7e,0x10,0x30, +0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d,0x1, 0x2e,0x7, 0xf, 0xda,0xb, +0x8, 0x20,0xbe,0x27,0xe, 0x5, 0x8, 0x12,0x7d,0x41,0x2e,0x47,0xf, 0xd8,0xb, 0x48, +0x0, 0x2e,0x7, 0xe, 0x5, 0x1b,0x48,0x0, 0x80,0x18,0x6d,0x0, 0x9e,0x7, 0xe, 0x5, +0xbd,0x20,0x58,0xe, 0x2e,0x17,0xf, 0xd8,0xb, 0x18,0x20,0x9e,0x27,0xe, 0x5, 0x1b, +0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0,0xbe,0xa0,0xd, 0x40,0xac,0x22, +0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, 0x31,0x7e,0x79,0x50,0xa5,0xbd, +0x0, 0xb, 0x7e,0xd, 0x31,0x7e,0xb, 0x40,0x7a,0x79,0x40,0x80,0x36,0x7e,0xd, 0x31, +0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12,0x6e,0x11,0xa, 0x2c,0xbd,0x32, +0x8, 0x18,0x7e,0x1d,0x31,0x7e,0x1b,0xb0,0x7e,0x79,0xa0,0xbc,0xba,0x7c,0xba,0x28, +0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0,0x7e,0x79,0x30,0x7e,0x1d,0x31, +0x7a,0x1b,0x30,0xda,0x3b,0x22,0x7e,0xb3,0x10,0x39,0xb4,0x1, 0x26,0x7e,0x73,0xa, +0xac,0x7a,0x73,0x10,0x37,0x7e,0x73,0xa, 0xad,0x7a,0x73,0x10,0x38,0x7e,0x73,0xa, +0xae,0x7a,0x73,0x10,0x3a,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, +0xdc,0x80,0x24,0x7e,0x73,0x11,0x16,0x7a,0x73,0x10,0x37,0x7e,0x73,0x11,0x49,0x7a, +0x73,0x10,0x38,0x7e,0x73,0x11,0x94,0x7a,0x73,0x10,0x3a,0x7e,0x34,0x11,0x9d,0x7a, +0x37,0x10,0x46,0x7e,0x34,0xf, 0x63,0x7a,0x37,0x10,0x48,0x22,0xe5,0x55,0xbe,0xb0, +0x1, 0x68,0xf9,0xe5,0x74,0x60,0xfc,0xe5,0x75,0x60,0xfc,0x20,0x93,0xfd,0xd2,0x96, +0xd2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e,0xb3,0x16,0xa9,0x70,0x17,0xe5, +0xcc,0x7a,0xb3,0x16,0xaa,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xac, +0x74,0x1, 0x7a,0xb3,0x16,0xa9,0xa9,0xc0,0xca,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d, +0x8, 0x1b,0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0x75,0x87,0x2, 0x0, +0x0, 0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e,0x37,0xf, 0xd6,0xb, +0x38,0x10,0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xa0, +0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e, +0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0, +0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e,0x24,0x3, 0x70,0x74,0x18,0x7e, +0x13,0x10,0x2b,0x6c,0x0, 0x2, 0x5f,0x32,0x9, 0xa3,0x0, 0x24,0xbe,0xa0,0x1, 0x78, +0x5, 0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43,0xcc,0x8, 0x9, 0x53,0x0, 0x2, +0x3e,0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca,0xa9,0xd0,0xca,0xd2,0xcd,0xbe, +0xa0,0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9,0xc0,0xc9,0x7e,0x14,0x1d,0x0, +0xb, 0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20,0x9, 0xb3,0x0, 0x3f,0xb4,0x1, +0xc, 0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54,0xf0,0xf5,0xe5,0x22,0x12,0x4b, +0xdf,0x12,0x3c,0xc2,0x12,0x69,0xb, 0x7e,0x34,0x8, 0x50,0x7a,0x37,0xf, 0xd4,0x7e, +0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x7e,0x34,0x8, 0x9a,0x7e,0x27,0xf, 0xd4,0x12, +0x6a,0xca,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xf, 0xd8,0x7e,0x34,0x3, 0x70,0x7a,0x37, +0xf, 0xda,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xf, 0xd8,0x12,0x68,0x15,0x12,0x64,0xd4, +0x12,0x5a,0x90,0x12,0x6a,0x7f,0x12,0x52,0x72,0x12,0x6e,0x93,0x74,0x1, 0x7a,0xb3, +0x11,0x96,0x22,0xca,0xf8,0x7e,0xb3,0xf, 0xd2,0xb4,0x1, 0x48,0x6c,0xff,0x80,0x3c, +0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0xb1, +0x7e,0x53,0x10,0x2b,0x12,0x35,0x61,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x86,0x7e, +0x37,0xf, 0xd6,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0xb2,0x7e,0x53,0x10,0x2c,0x12, +0x35,0x61,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x88,0xb, 0xf0,0x7e,0x73,0xd, 0x16, +0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0xca,0x69,0xca,0xf8,0x7c,0xfb,0x7e,0x24,0x0, +0x4, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24,0x56,0xa, 0x3b,0x1b,0x38,0x20, +0x6d,0x66,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38,0x60,0xb, 0xf0,0x12,0x0, 0x6e, +0x50,0x1e,0x7e,0x24,0x0, 0x5, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24,0x56, +0xa, 0x3b,0x1b,0x38,0x20,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38,0x60,0xb, 0xf0, +0x7c,0xbf,0xda,0xf8,0xda,0x69,0x22,0x7e,0x47,0x16,0x36,0x6c,0x77,0x7e,0xa0,0xff, +0x7e,0x43,0x16,0x25,0xa, 0x14,0x9, 0x51,0xf, 0x29,0xbe,0x53,0x10,0x4a,0x78,0x32, +0x7e,0x50,0x12,0xac,0x45,0x49,0x22,0x16,0x36,0xbe,0x24,0x0, 0x41,0x40,0x23,0x7e, +0x60,0x1, 0xbe,0x44,0x0, 0x19,0x40,0x18,0x7e,0x30,0x12,0xac,0x36,0x49,0x21,0x16, +0x36,0xbd,0x24,0x50,0x4, 0x7d,0x42,0x7c,0x76,0xb, 0x60,0xbe,0x60,0x4, 0x40,0xe2, +0x7c,0xa7,0x7c,0xba,0x22,0xca,0x79,0xe5,0x53,0xbe,0xb1,0x54,0x38,0x4, 0x6c,0xff, +0x80,0x3a,0xe5,0x54,0x3e,0xb0,0x3e,0xb0,0x24,0x56,0xa, 0x3b,0xb, 0x38,0x30,0x7c, +0xe7,0xbe,0xe0,0x1, 0x68,0xe, 0xbe,0xe0,0x2, 0x68,0x9, 0xbe,0xe0,0x3, 0x68,0x4, +0x4c,0xee,0x78,0x7, 0x7c,0xbe,0x12,0x63,0x6c,0x7c,0xfb,0xbe,0xe0,0x4, 0x68,0x5, +0xbe,0xe0,0x5, 0x78,0x7, 0x7c,0xbe,0x12,0x51,0xe1,0x7c,0xfb,0x7c,0xbf,0xda,0x79, +0x22,0x7e,0xa3,0xd, 0xf7,0xbe,0xa0,0x0, 0x28,0x40,0x6c,0x77,0x80,0x38,0x7e,0x50, +0x2, 0xac,0x57,0x9, 0x62,0xd, 0x18,0x9, 0x52,0xd, 0x19,0x7e,0x30,0x2, 0xac,0x36, +0x49,0x1, 0x11,0xce,0x7e,0x17,0xf, 0x4a,0xe, 0x14,0xbd,0x1, 0x48,0x13,0x7e,0x30, +0x2, 0xac,0x35,0x49,0x1, 0x11,0x9e,0x7e,0x17,0xf, 0x4c,0xe, 0x14,0xbd,0x1, 0x58, +0x3, 0x74,0x1, 0x22,0xb, 0x70,0xbc,0xa7,0x38,0xc4,0xe4,0x22,0xca,0xf8,0x7c,0xfb, +0xbe,0xf0,0x1, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xf0,0x2, 0x68,0x4, 0x4c,0xff,0x78, +0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x39,0x80,0x3, 0xe4,0x80,0x28,0x12,0x60,0x36,0x4c, +0xff,0x78,0x11,0xe4,0x7a,0xb3,0x10,0x3a,0x74,0x1e,0x7a,0xb3,0x10,0x37,0x74,0xa, +0x7a,0xb3,0x10,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12, +0x65,0x59,0x74,0x1, 0xda,0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca, +0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75,0x74,0x1, 0x7e,0x24, +0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x60,0x2, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x70, +0x2, 0x1b,0x28,0x30,0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0xc8,0xd0,0x82,0xd0,0x83, +0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b, +0x32,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba, +0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7a,0xa1,0xc3,0x75,0xc5,0x40, +0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5, +0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x3b,0xe5,0xc6,0xa, 0x2b,0x7c,0x45, +0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22,0xe4,0x7a,0xb3,0x15,0x9f,0x7a,0xb3,0x15, +0x53,0x7a,0xb3,0x15,0x9e,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0xa1,0x7e,0x34,0x15, +0x56,0x7e,0x24,0x0, 0x48,0x12,0x6e,0x21,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x48, +0xe4,0x12,0x6e,0x21,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e, +0x21,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x46,0x74,0xff,0x2, 0x6e,0x21,0xd2,0xcd, +0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e,0xb3,0x16,0xa9,0xb4,0x1, 0x15, +0x7e,0x73,0x16,0xac,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x7e,0xb3,0x16, +0xaa,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20, +0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a, +0xb3,0x16,0xa9,0x22,0x7e,0x34,0x1, 0x90,0x7a,0x37,0xd, 0xff,0x7e,0x34,0x0, 0x19, +0x7a,0x37,0xe, 0x1, 0x7e,0x34,0x0, 0x9c,0x7a,0x37,0xe, 0x3, 0x7e,0x34,0x0, 0x8, +0x7a,0x37,0xe, 0x5, 0x7e,0x34,0x0, 0x4, 0x7a,0x37,0xe, 0x7, 0x74,0x1, 0x7a,0xb3, +0xe, 0x9, 0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x7e,0x34,0x10,0x3, +0x7e,0x24,0x0, 0x28,0xe4,0x2, 0x6e,0x21,0x7c,0xab,0x6c,0x33,0x80,0x36,0xa, 0x3, +0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d,0x3, 0x7e, +0x9, 0x10,0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e,0x20,0x1e, +0x20,0x7e,0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d,0xf, 0x1b, +0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x75,0x75,0x0, 0x75,0xe4,0x3, 0x49, +0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, 0x5e,0x24, +0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5,0x75,0xe4, +0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9,0xd6,0xea, +0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1,0x22,0xca,0xf8,0x7e,0x24,0xe, 0xd, +0x7e,0x34,0xe, 0x99,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x6c,0xff,0x74,0x7, 0xac, +0xbf,0x49,0x35,0xe, 0xd, 0x12,0x4c,0xa8,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x99, +0x49,0x35,0xe, 0xf, 0x12,0x4a,0x31,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x9b,0xb, +0xf0,0xbe,0xf0,0xa, 0x40,0xd7,0xda,0xf8,0x22,0x6d,0x33,0x6c,0xaa,0x80,0x2e,0x7e, +0x30,0x2, 0xac,0x3a,0x9, 0x51,0xd, 0x18,0x9, 0x41,0xd, 0x19,0x7e,0x10,0x30,0xac, +0x15,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xf, 0xda,0xb, 0x18,0x40,0xbe, +0x44,0x0, 0x0, 0x8, 0x6, 0xbd,0x43,0x8, 0x2, 0x7d,0x34,0xb, 0xa0,0x7e,0xb3,0xd, +0xf7,0xbc,0xba,0x38,0xca,0x22,0xca,0x79,0x7d,0x41,0x7d,0x13,0x6d,0x0, 0x7e,0x34, +0x7f,0xff,0x6c,0xaa,0x80,0x1b,0x7e,0xf0,0x7, 0xac,0xfa,0x7d,0xe7,0x2d,0xe4,0x49, +0xfe,0x0, 0x2, 0xbd,0xf0,0x28,0x2, 0x7d,0xf, 0xbd,0xf3,0x50,0x2, 0x7d,0x3f,0xb, +0xa0,0x9, 0xb4,0x0, 0x46,0xbc,0xba,0x38,0xdd,0x1b,0x18,0x0, 0x1b,0x28,0x30,0xda, +0x79,0x22,0xca,0xf8,0x7e,0xb3,0x10,0x4e,0x60,0x3, 0xb4,0x1, 0x2d,0xa9,0xc6,0xea, +0x12,0x29,0x9c,0x7c,0xfb,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x68,0x15, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x54,0x21,0xbe,0xf0,0x1, 0x78,0x4, +0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0x10,0x4e,0xda,0xf8,0x22,0x7e,0xb3,0x16, +0x25,0x4, 0x7a,0xb3,0x16,0x25,0x7e,0x73,0x16,0x25,0xbe,0x70,0x4, 0x40,0x5, 0xe4, +0x7a,0xb3,0x16,0x25,0x7e,0xa3,0x16,0x25,0xbe,0xa0,0x3, 0x78,0x13,0x7e,0xb3,0x16, +0x6e,0x4, 0x7a,0xb3,0x16,0x6e,0xbe,0xb0,0x8, 0x40,0x5, 0xe4,0x7a,0xb3,0x16,0x6e, +0xa, 0x3a,0x9, 0xb3,0xf, 0x29,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d,0x21,0x7d, +0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x7d,0x7e,0xb3,0x10,0x3c,0xb4,0x1, 0x1f,0x6c, +0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d,0x26,0xb, +0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3,0xda,0x3b, +0x22,0x7e,0xb3,0x10,0x3d,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3,0x10,0x39, +0x12,0x60,0x36,0x12,0x2d,0xf4,0xe4,0x7a,0xb3,0x10,0x39,0x12,0x60,0x36,0x12,0x2d, +0xf4,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x58,0x7e,0x37,0xf, 0xd4,0x7e,0x24,0x8, 0xe4, +0x12,0x59,0x3f,0x74,0x2, 0x7a,0xb3,0x10,0x3d,0x22,0x7e,0xa3,0xf, 0x1c,0xbe,0xa0, +0x0, 0x38,0x2f,0xbe,0xa3,0xf, 0x1b,0x50,0x19,0x7e,0xb3,0xf, 0x25,0xbe,0xb3,0x12, +0x33,0x28,0x14,0x7e,0xb3,0x12,0x33,0x4, 0x7a,0xb3,0x12,0x33,0x7a,0xa3,0xf, 0x1b, +0x80,0x5, 0xe4,0x7a,0xb3,0x12,0x33,0x7e,0xb3,0xf, 0x1b,0x70,0x5, 0xe4,0x7a,0xb3, +0xf, 0x24,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12,0x54,0xaf, +0x74,0x1, 0x7a,0xb3,0x0, 0xfa,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75, +0x75,0x1, 0x75,0xe6,0x0, 0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0xc8,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0xca,0xf8,0x7d,0x1, 0x7d,0x13,0x7e,0xf3,0x10,0x4d,0xbe,0xf0,0x1, 0x78, +0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x2, 0x80,0x11,0x4c,0xff, +0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x4, 0x12, +0x5f,0x32,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0xf, 0xd3,0x6c,0xaa,0x6c,0x33,0x6d,0xff, +0x7e,0x10,0x18,0xac,0x1a,0xa, 0xe3,0x2d,0xe, 0x3e,0x4, 0x7d,0x40,0x2d,0x42,0x1b, +0x48,0xf0,0x6d,0x44,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x18,0xdf,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xd6,0x22,0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c,0x33,0x4c, +0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d,0x30,0x80, +0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe,0x30,0x3, +0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x2a,0x2d, +0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x7e,0x24,0xff,0xff, +0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x14,0x2d,0x13,0x59, +0x21,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd1,0x22,0x7c,0xab,0x7e,0x24,0xe, +0xdf,0xbe,0xa0,0xa, 0x50,0x25,0xa, 0x3a,0x7d,0x13,0x2d,0x12,0x7e,0x19,0xb0,0xb4, +0x2, 0xe, 0x74,0x1, 0x7a,0x19,0xb0,0x74,0x3, 0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x22, +0x74,0x3, 0x7a,0x19,0xb0,0x2d,0x32,0x19,0xb3,0x0, 0xa, 0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x6e,0x9d,0x53,0xb, 0xfd,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x6d,0x33,0x7a,0x37,0x11, +0xd, 0x74,0x1, 0x7a,0xb3,0x11,0xf, 0x74,0x9, 0x7a,0xb3,0x11,0x10,0x74,0xb, 0x7a, +0xb3,0x11,0x11,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x7a,0xb3,0x11,0x13,0x7a,0xb3,0x11, +0x14,0x74,0x1, 0x7a,0xb3,0x11,0x15,0x22,0x6c,0xaa,0x80,0x1f,0x7e,0x70,0x2, 0xac, +0x7a,0x49,0x23,0x16,0x6f,0x7e,0x70,0x18,0xac,0x7a,0x3e,0x34,0x2e,0x37,0xf, 0xda, +0x2e,0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc, +0xba,0x38,0xd9,0x22,0x75,0x74,0x0, 0xa9,0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28, +0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, +0x2, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, +0x5e,0x0, 0xa, 0x0, 0x96,0x1, 0x2c,0x0, 0x8, 0x0, 0x78,0x0, 0xfa,0x0, 0x7, 0x0, +0x50,0x0, 0xc8,0x0, 0x5, 0x0, 0x14,0x0, 0xa0,0x0, 0x3, 0x0, 0xa, 0x0, 0x78,0x0, +0x2, 0x0, 0x5, 0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56, +0xf5,0xf1,0x7c,0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9, +0x37,0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5, +0xcb,0x22,0xc2,0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54, +0x1e,0x54,0x3e,0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, +0x12,0x6d,0x66,0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x12,0x22,0x3c,0x12,0x3a, +0x2, 0x12,0x4d,0x5f,0x60,0x6, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x7e,0xb3,0xe, 0xb, +0x60,0x3, 0x12,0x60,0xe2,0x7e,0xb3,0xe, 0xc, 0x60,0x6, 0x12,0x55,0xc4,0x2, 0x5f, +0x89,0x22,0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0xf, 0x28,0x12, +0x6a,0x59,0xb4,0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x53,0xb, 0x8f,0x74,0x2, +0x80,0x2, 0x74,0xff,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x67, +0x1, 0x7e,0xb3,0x10,0x3d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x66,0x52,0x7e, +0xb3,0x10,0x4e,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0x7e, +0x34,0xa, 0xb1,0x7e,0x24,0x3, 0x4d,0xe4,0x12,0x6e,0x21,0x7e,0x34,0xb, 0x86,0x7e, +0x24,0x1, 0x90,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0xd, 0x6b,0x7e,0x24,0x0, 0x8c, +0x74,0xff,0x2, 0x6e,0x21,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51, +0x80,0x3, 0x7e,0x39,0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23, +0x0, 0x3b,0x7e,0x34,0x1d,0x6, 0x1b,0x38,0x20,0x22,0xe4,0x7a,0xb3,0xf, 0xd2,0x6c, +0xaa,0x6d,0x44,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x2, 0x1b,0x8, 0x40,0x6d, +0x0, 0x2d,0x13,0x1b,0x18,0x0, 0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x22,0x7e,0x34, +0x12,0x1, 0x7e,0x24,0x0, 0x1e,0xe4,0x12,0x6e,0x21,0x7e,0x34,0x12,0x1f,0x7e,0x24, +0x0, 0x14,0xe4,0x12,0x6e,0x21,0x7e,0x34,0x11,0xed,0x7e,0x24,0x0, 0x14,0xe4,0x2, +0x6e,0x21,0x12,0x0, 0x6e,0x50,0x1d,0x12,0x6e,0xee,0x7c,0xab,0x7e,0xb3,0x11,0x95, +0xbe,0xb0,0x4, 0x68,0xf, 0xbe,0xa0,0xff,0x68,0xa, 0x74,0x1, 0x7a,0xb3,0x11,0xc, +0x7a,0xa3,0x11,0x95,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb3,0x10,0x3d,0x70,0x3, 0x7e, +0xf0,0x1, 0x74,0x1, 0x12,0x3f,0x5b,0xbe,0xb0,0x1, 0x68,0x5, 0xbe,0xf0,0x1, 0x78, +0x4, 0xe4,0x12,0x3f,0x5b,0xda,0xf8,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5, +0x0, 0x75,0xe4,0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, +0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x7e,0x34,0x8, 0x9a,0x7e, +0x24,0x11,0x9e,0x7e,0x14,0x1, 0x90,0x12,0x3e,0x16,0x7e,0x34,0x9, 0x2e,0x7e,0x24, +0x11,0x4a,0x7e,0x14,0x0, 0xc8,0x12,0x3e,0x16,0x2, 0x57,0x5d,0x74,0x1, 0x12,0x6e, +0x7e,0xa9,0xc3,0xea,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x75, +0x9a,0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xe5,0x52,0xb4, +0x1, 0x18,0xe5,0x51,0x70,0x14,0x7e,0xb3,0x11,0x95,0x60,0xb, 0xe4,0x7a,0xb3,0x11, +0x95,0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x12,0x6c,0x99,0x85,0x51,0x52,0x22,0x6c,0xaa, +0x7e,0x50,0x4, 0xac,0x5a,0x49,0x12,0x16,0x89,0xbd,0x13,0x38,0x8, 0x49,0x22,0x16, +0x8b,0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe4,0x7c,0xba,0x22,0x7e, +0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0xce,0x12,0x6c,0xec, +0x7e,0x34,0x7, 0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x2e,0x75, +0x55,0x0, 0x75,0x72,0x0, 0x75,0x54,0x0, 0x12,0x6c,0x3e,0x12,0x62,0x37,0xf5,0x53, +0x12,0x62,0xd5,0xb4,0x1, 0x4, 0x75,0x55,0x1, 0x22,0x75,0x55,0x3, 0x22,0x7e,0x34, +0x0, 0x1, 0x7a,0x35,0x56,0x7e,0x34,0xa, 0x18,0x7a,0x35,0x58,0x7e,0x34,0x0, 0x2, +0x7a,0x35,0x5a,0x7e,0x34,0xa, 0x62,0x7a,0x35,0x5c,0x74,0x2, 0x22,0x0, 0x50,0x0, +0xc, 0x6, 0x4, 0x0, 0x78,0x0, 0xf, 0x6, 0x4, 0x0, 0xc8,0x0, 0x1e,0x8, 0x5, 0x1, +0x40,0x0, 0x50,0x8, 0x5, 0x1, 0xf4,0x0, 0x64,0xa, 0x6, 0xe4,0x7a,0xb3,0x16,0xae, +0x7a,0xb3,0x16,0xad,0x7e,0xb3,0x10,0xa3,0x70,0x6, 0x7e,0x73,0x11,0x10,0x80,0x4, +0x7e,0x73,0x11,0x12,0x7a,0x73,0x16,0xaf,0x22,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x2, +0x7a,0xb3,0x10,0x7b,0x74,0x4, 0x7a,0xb3,0x10,0x7c,0x7e,0x34,0x16,0x26,0x7e,0x24, +0x0, 0x48,0xe4,0x2, 0x6e,0x21,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x75,0x92,0x70, +0xd2,0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8, +0x22,0xe4,0x7a,0xb3,0xd, 0xfb,0x7e,0x34,0x11,0x9e,0x7a,0x37,0xf, 0xd6,0x12,0x40, +0x96,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x2, 0x47,0x4a,0x75,0x74,0x1, 0x7e, +0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e, +0x34,0x0, 0x1, 0x2, 0x6e,0x68,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34, +0xc9,0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0xe5, +0x51,0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0x5a,0x80,0x4, 0x7e,0x34,0x0, 0x3c,0x7a,0x37, +0xf, 0x54,0x7a,0x37,0xf, 0x56,0x22,0xca,0xf8,0x12,0x6e,0x73,0x7c,0xfb,0x12,0x0, +0x6e,0x50,0x7, 0x4c,0xff,0x78,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0xda,0xf8,0x22,0x7e, +0x34,0x0, 0x24,0x12,0x69,0xb9,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, +0x57,0x2e,0x54,0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0x7d,0x3, 0x80, +0xa, 0x7e,0x29,0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d, +0x55,0x78,0xee,0x22,0x7e,0x53,0xf, 0x47,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x9d,0x32, +0xbe,0x34,0x0, 0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4, +0x1, 0x3, 0x43,0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3, +0x16,0xa0,0xe4,0x7a,0xb3,0x16,0xa7,0x74,0xff,0x7a,0xb3,0x16,0x9f,0x22,0x75,0x75, +0x1, 0xd2,0xee,0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x6e,0x68, +0xa, 0x2b,0x19,0x72,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x44,0x1, 0x7a,0xb3,0x10,0xfe, +0x22,0x7d,0x13,0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31, +0x22,0x14,0x1, 0xa, 0x1, 0x0, 0x2, 0xfb,0x4, 0xf6,0x5, 0xec,0x6, 0xe7,0x7, 0xe2, +0x8, 0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32, +0x22,0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5, +0x22,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, +0x12,0x0, 0x42,0x12,0x57,0xdd,0x74,0x3, 0x12,0x44,0xf, 0x2, 0x24,0xd0,0x7e,0x34, +0x0, 0x21,0x12,0x69,0xb9,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x7e,0xb3,0x11,0x15, +0xb4,0x1, 0x4, 0xe4,0x2, 0x6e,0xd3,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32, +0x38,0xfa,0x22,0x12,0x63,0x21,0xb4,0x1, 0x2, 0xe4,0x22,0x74,0x1, 0x22,0xd2,0xcf, +0xa9,0xd4,0xc9,0x75,0xcc,0x0, 0xc2,0xca,0x22,0xa9,0xc0,0x93,0x75,0x9, 0x0, 0x75, +0xa, 0x0, 0x32,0x75,0x53,0x0, 0x75,0x54,0x0, 0x75,0x55,0x0, 0x22,0xa9,0x32,0x99, +0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x75,0xb, 0x0, 0x12,0x6f,0x4, 0x2, 0x5e,0x82, +0x12,0x6b,0x9c,0x12,0x6f,0xa, 0x2, 0x6e,0xa7,0xe5,0x74,0x60,0x3, 0x74,0x1, 0x22, +0xe4,0x22,0xe5,0x75,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x1, 0x2, 0x4, 0x8, 0x10, +0x20,0x40,0x80,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0xf5,0x16,0x75,0x17,0x0, 0x22,0x12,0x61,0xe3,0x2, 0x38,0x88,0x12,0x50, +0x15,0x2, 0x62,0x87,0x12,0x6f,0x16,0x2, 0x6c,0x1f,0x7e,0x34,0x1, 0x3, 0x22,0x7e, +0x34,0x5, 0xb, 0x22,0x2, 0x6c,0xb6,0x2, 0x0, 0x76,0x2, 0x6d,0x6, 0x2, 0x6e,0xdb, +0x2, 0x6e,0x9d,0xe5,0x6d,0x22,0x22,0x0, 0x1, 0x15,0xde,0x1, 0x0, 0x1, 0xa, 0xac, +0x15,0x0, 0x1, 0xa, 0xad,0x17,0x0, 0x1, 0xa, 0xae,0x4, 0x0, 0x1, 0xd, 0xfe,0x40, +0x0, 0x5, 0xf, 0x29,0x20,0x17,0x29,0x38,0x13,0x0, 0x18,0xf, 0x2e,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25,0xf, 0x63,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x18, +0xf, 0x88,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xf, 0xa0,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xf, 0xad,0x0, +0x1, 0x2, 0x3, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x17,0x16,0x15,0x14,0x13, +0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x0, 0xd, 0xf, 0xc5,0x1, 0x2, 0x3, 0x4, 0x5, +0x6, 0x7, 0x8, 0x0, 0x9, 0xa, 0xb, 0xc, 0x0, 0x25,0xf, 0xdc,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x0, 0xd, 0x10,0xff,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0x0, 0x1, 0x11,0xc, 0x0, 0x0, 0x1, 0x11,0x16,0x15,0x0, 0x32,0x11,0x17, +0x0, 0x8, 0x0, 0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a, +0x1, 0xbc,0x2, 0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, +0x7, 0xf9,0x8, 0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e, +0xc, 0x83,0x0, 0x1, 0x11,0x49,0x17,0x0, 0x1, 0x11,0x94,0x2, 0x0, 0x1, 0x11,0x95, +0x0, 0x0, 0x4, 0x11,0x97,0xff,0xff,0xff,0xff,0x0, 0x2, 0x11,0x9b,0xff,0x1f,0x0, +0x1, 0x11,0x9d,0x40,0x0, 0x1, 0x11,0xe8,0x0, 0x0, 0x4, 0x11,0xe9,0x19,0x1e,0x1e, +0x1e,0x0, 0x1, 0x0, 0xff,0x0, 0x0, 0x1, 0x15,0x53,0x0, 0x0, 0x1, 0x15,0x9e,0x0, +0x0, 0x1, 0x15,0x9f,0x0, 0x0, 0x1, 0x15,0xa0,0x0, 0x0, 0x1, 0x15,0xa1,0x0, 0x0, +0x1, 0x12,0x33,0x0, 0x0, 0x1, 0x16,0xa9,0x0, 0x0, 0x1, 0x16,0xb1,0x0, 0x0, 0x1, +0x16,0xb2,0x0, 0x0, 0x1, 0x16,0xb3,0x0, 0x0, 0x1, 0x16,0xb4,0x0, 0x0, 0x1, 0x16, +0xb5,0x0, 0x0, 0x1, 0x16,0xb6,0x0, 0x0, 0x1, 0x16,0xb7,0x1, 0x0, 0x1, 0x16,0xb8, +0x1, 0x0, 0xc, 0x16,0x89,0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, +0x94,0x0, 0x6, 0x16,0x95,0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x1, 0x16,0x25,0x3, +0x0, 0x1, 0x16,0x6e,0x0, 0x0, 0x1, 0x16,0xb9,0x0, 0x0, 0x1, 0x16,0xba,0x0, 0x0, +0x1, 0x16,0xbb,0x0, 0x0, 0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x71,0x6, 0x8e,0xf9, +0x4d,0xb2,0x5, 0x3b, \ No newline at end of file diff --git a/drivers/input/touchscreen/ft5336/ft_app_ic_lens_tianma_720p.txt b/drivers/input/touchscreen/ft5336/ft_app_ic_lens_tianma_720p.txt new file mode 100644 index 0000000000000..8bee7390d71a3 --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft_app_ic_lens_tianma_720p.txt @@ -0,0 +1,1806 @@ +0x2, 0x50,0xe2,0x2, 0x68,0x6e,0xe5,0x74,0x60,0x9, 0x74,0x1, 0x12,0x6e,0x92,0x75, +0x74,0x0, 0x22,0xe4,0x12,0x6e,0x92,0x75,0x74,0x1, 0x22,0x2, 0x50,0x4c,0xe5,0x55, +0xbe,0xb0,0x1, 0x68,0xf9,0x12,0x6e,0x78,0x60,0xfb,0x22,0x2, 0x67,0x5, 0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81,0x60, +0xfb,0x22,0x22,0x2, 0x6e,0x48,0xc2,0x8e,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0x22,0x32,0x2, 0x63,0x4d,0xbe,0xb0, +0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x16,0xa2,0x22,0x22,0x2, 0x0, 0x5a,0xe5,0x52, +0x24,0xff,0x22,0x2, 0x67,0x3d,0xca,0x3b,0x7e,0xb3,0xf, 0x1b,0xf5,0x26,0x7e,0xd3, +0xf, 0x1c,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x33,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, +0xa, 0xe4,0x12,0x6d,0xe0,0x6c,0xcc,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7c,0x19, +0xa3,0x13,0xba,0x7e,0x34,0x7f,0xff,0x74,0x7, 0xac,0xbc,0x59,0x35,0x13,0xb6,0x74, +0x7, 0xac,0xbc,0x59,0x35,0x13,0xb8,0xb, 0xc0,0xbe,0xc0,0xa, 0x78,0xd9,0xe5,0x26, +0x60,0x3, 0x2, 0x0, 0xef,0x12,0x6a,0xad,0xbe,0xd0,0x0, 0x38,0x3, 0x2, 0x0, 0xdf, +0x74,0x1, 0x7a,0xb3,0xf, 0x20,0xe4,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7e, +0x34,0x13,0x6, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x2, 0x1, 0x14,0x4c, +0xdd,0x68,0x3, 0x2, 0x1, 0x14,0x75,0x25,0x0, 0x7e,0xa0,0xff,0x7e,0x71,0x25,0x74, +0x7, 0xac,0x7b,0x19,0xa3,0xe, 0x57,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xeb,0x74,0x1, +0x7a,0xb3,0xf, 0x1f,0x75,0x25,0x0, 0x2, 0x1, 0x4c,0x7e,0x51,0x25,0x74,0x7, 0xac, +0x5b,0x2e,0x24,0xe, 0xd, 0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x51,0x25,0xac,0x5b,0x2e,0x24,0xe, 0xf, 0xb, 0x28,0x30,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x5, 0x25,0xe5,0x26,0xbe,0xb1, +0x25,0x38,0xc7,0xe4,0x6c,0x77,0x7e,0x61,0x26,0x7e,0x24,0x13,0xb6,0x12,0x52,0x98, +0x7e,0x71,0x26,0x7e,0x60,0xa, 0x7e,0x24,0x13,0xb6,0x12,0x52,0x98,0x7c,0xcb,0x6c, +0xee,0x75,0x25,0x0, 0x2, 0x1, 0x92,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65,0x13, +0xba,0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x11,0xbc,0x76,0x78,0x3, 0x2, 0x1, 0x97, +0x5, 0x25,0xbe,0xc1,0x25,0x38,0xe0,0xbe,0xc1,0x25,0x68,0x3, 0x2, 0x1, 0xb8,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3c,0x2e,0x14,0x13, +0xb6,0x74,0x7, 0x12,0x48,0xc5,0xb, 0xc0,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xb2,0x7e, +0x24,0x13,0xb6,0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x4c,0xdd, +0x68,0x3, 0x2, 0x1, 0xe7,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, +0x46,0x12,0x6d,0x3c,0x2, 0x4, 0x84,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x4, 0x84, +0x6c,0xee,0x2, 0x4, 0x7b,0x75,0x25,0x0, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65, +0xe, 0x57,0x7e,0x90,0x7, 0xac,0x9e,0x9, 0x74,0xe, 0x11,0xbc,0x67,0x78,0x3, 0x2, +0x2, 0x1b,0x5, 0x25,0xe5,0x25,0xbe,0xb0,0xa, 0x40,0xdd,0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x9, 0xf5,0xe, 0x57,0x49,0x34,0xe, 0xf, 0x49,0x25,0xe, 0x55,0x12,0x6d,0xb0, +0x7d,0x63,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, 0xa4, +0x49,0x25,0xe, 0x53,0x12,0x6d,0xb0,0x7d,0x13,0x2d,0x16,0x7a,0x15,0x21,0x7c,0x1f, +0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7,0xbe,0x14,0x0, 0x40,0x28,0x3, 0x2, 0x2, 0xd9, +0x7e,0x35,0x21,0xbe,0x34,0x0, 0x20,0x38,0x3, 0x2, 0x2, 0xae,0x7e,0x70,0x3, 0xac, +0x7f,0x9, 0xb3,0x12,0x2, 0x60,0x3, 0x2, 0x2, 0x97,0x9, 0xb3,0x12,0x3, 0xbe,0xb0, +0x0, 0x38,0x3, 0x2, 0x2, 0x89,0x2, 0x2, 0xbf,0x74,0x1, 0x19,0xb3,0x12,0x2, 0x6d, +0x22,0x7a,0x25,0x21,0x2, 0x2, 0xed,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0xa, 0x40,0x3, +0x2, 0x2, 0xed,0x2e,0x34,0x12,0x3, 0x4, 0x7a,0x39,0xb0,0x2, 0x2, 0xd1,0x7e,0x70, +0x3, 0xac,0x7f,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x2, 0xcc,0x7d, +0x23,0x2e,0x24,0x12,0x3, 0x14,0x7a,0x29,0xb0,0x2, 0x2, 0xed,0xe4,0x19,0xb3,0x12, +0x2, 0x6d,0x33,0x7a,0x35,0x21,0x2, 0x2, 0xed,0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7f, +0x19,0xa3,0x12,0x3, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x2, 0x7e,0x35,0x21, +0xbe,0x34,0x0, 0x20,0x28,0x3, 0x2, 0x3, 0x2e,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49, +0x35,0xe, 0x53,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x35,0xe, 0x55,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0x6d,0x33,0x7a, +0x35,0x21,0x7e,0xa0,0x1, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x1, 0x7e,0xf5, +0x21,0x7a,0xf5,0x23,0xa, 0xef,0x2e,0xe5,0x33,0x7e,0xe9,0xb0,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x3, 0x52,0x6d,0xee,0x74,0x2, 0xac,0xbf,0x59,0xe5,0x11,0xed,0x59,0xe5, +0x12,0x1f,0x7e,0x17,0xf, 0x5d,0xbe,0x15,0x23,0x28,0x3, 0x2, 0x3, 0x68,0x7e,0x4, +0x1, 0x0, 0x7a,0x5, 0x31,0x2, 0x3, 0x8b,0x7e,0x35,0x23,0x6d,0x22,0x7c,0x56,0x7c, +0x67,0x6c,0x77,0x12,0x48,0x3e,0x7d,0xe3,0x7a,0xe5,0x31,0xbe,0xe4,0x0, 0x10,0x40, +0x3, 0x2, 0x3, 0x8b,0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x31,0x74,0x2, 0xac,0xbf,0x49, +0x45,0x12,0x1f,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x3, 0xa5,0x49,0x45,0x11,0xed,0x7a, +0x45,0x31,0x2, 0x3, 0xac,0x7e,0x45,0x31,0x59,0x45,0x11,0xed,0x59,0xf5,0x12,0x1f, +0x7e,0x35,0x31,0xbe,0x34,0x1, 0x0, 0x38,0x3, 0x2, 0x3, 0xc3,0x7e,0x34,0x1, 0x0, +0x7a,0x35,0x31,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x25,0xe, 0x53,0x12,0x6d,0xb0,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31, +0xad,0x32,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, +0xac,0x5b,0x49,0x32,0xe, 0x53,0xac,0xbe,0x49,0x15,0xe, 0xd, 0xbd,0x13,0x38,0x3, +0x2, 0x4, 0x14,0x7d,0x2, 0x2e,0x4, 0xe, 0x53,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, +0x10,0x2, 0x4, 0x1e,0x2e,0x24,0xe, 0x53,0x9e,0x35,0x21,0x1b,0x28,0x30,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49,0x25,0xe, 0x55, +0x12,0x6d,0xb0,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31,0xad,0x32,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, 0xac,0x5b,0x49,0x32,0xe, +0x55,0xac,0xbe,0x49,0x15,0xe, 0xf, 0xbd,0x13,0x38,0x3, 0x2, 0x4, 0x6f,0x7d,0x2, +0x2e,0x4, 0xe, 0x55,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, 0x10,0x2, 0x4, 0x79,0x2e, +0x24,0xe, 0x55,0x9e,0x35,0x21,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x26,0xbc,0xbe,0x28, +0x3, 0x2, 0x1, 0xf5,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x49,0x45,0xe, 0x53,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x35,0x49,0x45,0xe, 0x55,0x1e,0x44,0x1e, +0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x37,0x9, 0xf5,0xe, 0x57,0x19,0xf5,0xe, 0x11, +0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x58,0x19,0x75,0xe, 0x12,0x74,0x7, 0xac,0xbe, +0x9, 0x75,0xe, 0x59,0x19,0x75,0xe, 0x13,0x7c,0xbf,0x54,0xf, 0xbe,0xb0,0xa, 0x40, +0x3, 0x2, 0x5, 0xd7,0x7c,0xfb,0xa, 0xf, 0x7d,0x10,0x2e,0x15,0x33,0x7e,0x19,0xb0, +0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x5, 0xf4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x4, 0xf9, +0x74,0xff,0x19,0xb0,0x13,0x6, 0x2, 0x5, 0xd7,0x9, 0x90,0x13,0x6, 0xbe,0x90,0xff, +0x68,0x3, 0x2, 0x5, 0x4b,0x74,0x1, 0x19,0xb0,0x13,0x6, 0x7e,0x15,0x35,0x74,0x7, +0xac,0xbe,0x59,0x15,0xe, 0xd, 0x7e,0x15,0x37,0x74,0x7, 0xac,0xbe,0x59,0x15,0xe, +0xf, 0x6c,0xdd,0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x50,0x7, 0xac, +0x5d,0x7e,0x30,0x15,0xac,0x3f,0x2d,0x12,0x2e,0x14,0x12,0x34,0x74,0x7, 0x12,0x48, +0xc5,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xdb,0x2, 0x5, 0xd7,0xbe,0x90,0x3, 0x50,0x3, +0x2, 0x5, 0x58,0xe4,0x19,0xb0,0x13,0x6, 0x7e,0x25,0x35,0x9, 0x80,0x13,0x6, 0x7e, +0x90,0x7, 0xac,0x89,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x43,0x59,0x24,0x12,0x34,0x7e, +0x25,0x37,0x59,0x24,0x12,0x36,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x5, 0xa0,0xe4, +0x2e,0x34,0x12,0x34,0x12,0x67,0xd9,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x74, +0x1, 0x7e,0x70,0x15,0xac,0x7f,0x2e,0x34,0x12,0x34,0x12,0x67,0xd9,0x2, 0x5, 0xc2, +0x49,0x34,0x12,0x34,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0xa, 0x3f,0x9, 0x43, +0x13,0x6, 0x7e,0x50,0x7, 0xac,0x45,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x32,0x49,0x33, +0x12,0x36,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0xa, 0x3f,0x2e,0x34,0x13,0x6, +0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x7c,0x1e,0x2e,0x10,0x27,0xa5,0xe7,0x60,0x3, +0x2, 0x5, 0xf4,0x7e,0x70,0x3, 0xac,0x7e,0x2e,0x34,0x12,0x1, 0x7e,0x24,0x0, 0x3, +0xe4,0x12,0x6d,0xe0,0xb, 0xe0,0xbe,0xe0,0xa, 0x68,0x3, 0x2, 0x4, 0x86,0xe5,0x26, +0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x6, 0xe, 0x74,0x1, 0x7a,0xb3,0xf, 0x24,0xda,0x3b, +0x22,0xca,0x3b,0x7e,0xe3,0xf, 0x1b,0x4c,0xee,0x78,0x27,0x6c,0xff,0x6d,0x11,0x74, +0x2, 0xac,0xbf,0x59,0x15,0x13,0x56,0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x19, +0xa1,0x13,0x14,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x13,0x6a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xdb,0x6c,0xff,0x2, 0x7, 0xac,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xe, 0x11,0x54, +0xf, 0xf5,0x22,0xbe,0xb0,0xa, 0x40,0x3, 0x2, 0x7, 0xaa,0xe5,0x22,0xa, 0x1b,0x9, +0xb1,0xe, 0xdf,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x7, 0x85,0x75,0x21,0x0, 0x7e,0x31, +0x21,0x74,0x7, 0xac,0x3b,0x9, 0x71,0x13,0x14,0x7a,0x71,0x23,0xbe,0x71,0x22,0x68, +0x3, 0x2, 0x7, 0x77,0x49,0x21,0x13,0x12,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xf, +0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x7e,0xa1,0x21,0x74,0x7, 0xa4,0x49,0x25,0x13, +0x10,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x3, +0x2d,0x6, 0xe5,0x23,0xa, 0x1b,0x9, 0xa1,0x13,0x6a,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0x71,0x23,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x13,0x56,0x2e,0x14,0x13,0x6a,0x7c,0xba, +0x14,0x7a,0x19,0xb0,0x2, 0x7, 0xaa,0x7e,0xa1,0x23,0x74,0x2, 0xa4,0x49,0x15,0x13, +0x56,0xbe,0x14,0x0, 0x32,0x28,0x9, 0xbe,0x4, 0x0, 0x32,0x28,0x3, 0x2, 0x7, 0x71, +0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, +0x80,0x6f,0xbe,0x4, 0x0, 0x96,0x28,0x63,0xe5,0x22,0xa, 0x1b,0x9, 0xb1,0xe, 0xdf, +0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0xe, 0xdf,0x7e,0xa0,0x3, 0xe5, +0x22,0xa, 0x1b,0x19,0xa1,0xe, 0xe9,0x7e,0x71,0x21,0x74,0x7, 0xac,0x7b,0x2e,0x34, +0x13,0x10,0x7e,0x14,0x13,0xb6,0x12,0x48,0xc5,0xbe,0xe0,0x0, 0x28,0x2d,0x1b,0xe0, +0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3f,0x2e,0x14, +0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x7e,0x34,0x13,0xb6,0x7e,0x30,0x7, 0xac,0x3e, +0x2e,0x14,0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x1b,0xf0,0x7e,0xa1,0x23,0x74,0x2, +0xa4,0x59,0x5, 0x13,0x56,0x80,0x33,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0xa, 0x50,0x3, +0x2, 0x6, 0x6e,0x80,0x25,0x6d,0x11,0x7e,0xa1,0x22,0x74,0x2, 0xa4,0x59,0x15,0x13, +0x56,0x7e,0xa0,0xff,0x7e,0x31,0x22,0x74,0x7, 0xac,0x3b,0x19,0xa1,0x13,0x14,0x7e, +0xa0,0x2, 0xe5,0x22,0xa, 0x1b,0x19,0xa1,0x13,0x6a,0xb, 0xf0,0xbc,0xef,0x28,0x3, +0x2, 0x6, 0x47,0x7a,0xe3,0xf, 0x1b,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0x10,0x7e, +0x14,0x0, 0x46,0x12,0x6d,0x3c,0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d, +0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x24,0xc, 0x75,0x25,0x0, +0x75,0x26,0x17,0x75,0x27,0x0, 0x7e,0x34,0x13,0xd0,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6d,0xe0,0x6c,0x66,0x2, 0x8, 0xed,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xd, 0x18,0x7a, +0x71,0x23,0x9, 0xa5,0xd, 0x19,0x1a,0x17,0x7d,0x21,0x1b,0x25,0xb, 0x15,0x7c,0x43, +0x1a,0x1a,0x1b,0x15,0x1a,0xa, 0xb, 0x5, 0x7c,0x21,0xbe,0x50,0x0, 0x58,0x2, 0x6c, +0x55,0x7e,0x73,0x10,0x2b,0xa, 0x7, 0x1b,0x4, 0x1a,0x44,0xbd,0x40,0x8, 0x2, 0x7c, +0x41,0xbe,0x30,0x0, 0x58,0x2, 0x6c,0x33,0x7e,0x73,0x10,0x2c,0xa, 0x7, 0x1b,0x4, +0x1a,0x42,0xbd,0x40,0x8, 0x2, 0x7c,0x21,0xbe,0x51,0x24,0x58,0x3, 0x7a,0x51,0x24, +0xbe,0x41,0x25,0x8, 0x3, 0x7a,0x41,0x25,0xbe,0x31,0x26,0x58,0x3, 0x7a,0x31,0x26, +0xbe,0x21,0x27,0x8, 0x3, 0x7a,0x21,0x27,0x7c,0xf5,0x80,0x4b,0x7c,0xe3,0x80,0x41, +0x1a,0xef,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0xe, 0x2d,0xf, 0xe, 0x4, 0xe, 0x4, +0xe, 0x4, 0x7c,0x71,0x7a,0x71,0x21,0x7e,0x10,0x18,0xac,0x1f,0x7c,0xb1,0x2c,0xbe, +0x54,0x7, 0x7e,0x4, 0x0, 0x1, 0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7c,0xb1,0xf5, +0x22,0xa, 0x7, 0x2e,0x4, 0x13,0xd0,0x7e,0x9, 0xb0,0x45,0x22,0x7a,0x9, 0xb0,0xb, +0xe0,0xbc,0x2e,0x58,0xbb,0xb, 0xf0,0xbc,0x4f,0x58,0xb1,0xb, 0x60,0x7e,0x73,0xd, +0xf7,0xbc,0x76,0x28,0x3, 0x2, 0x8, 0x27,0xbe,0x70,0x0, 0x38,0x3, 0x2, 0xd, 0x43, +0x7e,0xe1,0x26,0x2, 0xd, 0x3a,0x6c,0xff,0x80,0x1f,0x1a,0x3e,0x3e,0x34,0x1a,0x2f, +0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36,0xb, 0x38,0x30,0xe, 0x34,0xe, +0x34,0x3e,0x24,0x59,0x32,0x13,0xb6,0xb, 0xf0,0x7e,0x73,0x10,0x2b,0xbc,0x7f,0x18, +0xd9,0x7e,0xf1,0x24,0x2, 0xd, 0x2f,0x1a,0x4f,0x7e,0x14,0x0, 0x18,0xad,0x14,0x1a, +0x3e,0x7d,0x51,0x2d,0x53,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7a,0xa1,0x21, +0x7e,0x50,0x18,0xac,0x5f,0x7c,0xb5,0x2c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x22,0xa, 0x2a,0x9, 0xb2,0x13,0xd0, +0x55,0x22,0x78,0x3, 0x2, 0xd, 0x2d,0xbe,0xf0,0x3, 0x58,0x3, 0x2, 0x9, 0xfe,0x7e, +0x53,0x10,0x2b,0xa, 0x25,0x1b,0x26,0xbd,0x42,0x18,0x73,0x7d,0xf4,0x3e,0xf4,0x49, +0x5f,0x13,0xba,0x49,0x2f,0x13,0xb2,0x2d,0x25,0x7d,0x52,0x3e,0x54,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x2d,0x25,0x49,0x5f,0x13,0xbc,0x49,0xef,0x13,0xb0,0x2d,0xe5,0x7d, +0x5e,0x3e,0x54,0x2d,0x5e,0x9d,0x25,0x49,0xef,0x13,0xb8,0x49,0x5f,0x13,0xb4,0x2d, +0x5e,0x7d,0xe5,0x3e,0xe4,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d, +0x5e,0x9d,0x25,0x49,0x5f,0x13,0xb6,0x7d,0x5, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x9d,0x10,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x2, 0xb, 0x55,0x4c,0xff, +0x78,0x5d,0x7d,0x24,0x3e,0x24,0x49,0x12,0x13,0xb6,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x3e,0x54,0x2d,0x50,0x7d,0x1, 0x3e,0x4, 0x2d,0x5, 0x2d,0x1, 0x49,0x12,0x13,0xb8, +0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5, 0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x9d,0x1, 0x49,0x12,0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x2d,0x50,0x9d,0x51,0x49,0x22,0x13,0xbc,0x3e,0x24,0x9d,0x52,0x2, 0xb, 0x55,0xbe, +0xf0,0x1, 0x78,0x69,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x49,0x20, +0x13,0xb6,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x25,0x9d,0x21,0x49,0x10, +0x13,0xb8,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x21,0x49,0x10, +0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10, +0x13,0xbc,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x52,0x2, 0xb, 0x55,0xbe,0xf0,0x2, +0x68,0x3, 0x2, 0xb, 0x75,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x50,0x13,0xb2,0x7d, +0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x15,0x9d,0x12,0x49,0x20,0x13,0xb6,0x7d, +0xf2,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5f,0x3e,0x24,0x3e,0x24,0x2d, +0x25,0x2d,0x21,0x49,0x50,0x13,0xb8,0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x2d,0x15,0x9d,0x21,0x49,0x50,0x13,0xba,0x7d,0x15,0x3e,0x14,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10,0x13,0xbc,0x7d,0x21,0x3e, +0x24,0x2d,0x21,0x9d,0x52,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7d,0x23,0x3e,0x24,0x7e,0x14,0x0, 0x30,0xad,0x14,0x2d,0x21,0x2d,0x26,0x1b, +0x28,0x50,0x2, 0xd, 0x11,0x7e,0xa3,0x10,0x2b,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x68, +0x3, 0x2, 0xc, 0x11,0x3e,0x44,0x49,0x24,0x13,0xb2,0x7d,0x12,0x3e,0x14,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x4, 0x13,0xb0,0x7d,0x10,0x3e,0x14,0x2d,0x10, +0x9d,0x21,0x49,0x4, 0x13,0xb4,0x7d,0x10,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x10,0x9d,0x21,0x49,0x14,0x13,0xb6,0x7d,0xf1,0x3e,0xf4,0x3e,0xf4, +0x3e,0xf4,0x3e,0xf4,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x9d,0xf, 0x3e,0x14,0x3e,0x14,0x2d,0x10,0x2d,0x12,0x49,0x4, +0x13,0xb8,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x20, +0x9d,0x12,0x49,0x4, 0x13,0xba,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x20, +0x2d,0x21,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x2, 0xd, +0x0, 0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x76,0x1a,0xf, 0x3e,0x4, 0x49,0x30,0x13, +0xb0,0x7d,0x23,0x3e,0x24,0x2d,0x23,0x49,0x10,0x13,0xb2,0x7d,0x31,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x2d,0x31,0x9d,0x32,0x49,0x20,0x13,0xb4,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x49,0x20,0x13,0xb6,0x7d,0x12,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x9d,0x21,0x2d,0x23,0x49,0x30,0x13,0xb8,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x31,0x9d,0x23,0xe, +0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e,0x80,0x71,0x7e, +0xb3,0x10,0x2b,0x14,0xbc,0xbf,0x78,0x79,0x1a,0x5f,0x3e,0x54,0x49,0x25,0x13,0xb2, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9d,0x32,0x49,0x25,0x13,0xb0,0x3e,0x24, +0x9d,0x32,0x49,0x25,0x13,0xb4,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x24,0x9d,0x32,0x49,0x15,0x13,0xb6,0x7d,0x21, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x2, 0x7d,0x21,0x3e,0x24,0x2d,0x20,0x2d,0x21, +0x2d,0x23,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e, +0x3e,0x34,0x1a,0xf, 0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d,0x31,0x2d,0x36,0x1b,0x38, +0x20,0x1a,0x1e,0x3e,0x14,0x1a,0x2f,0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x23,0x2d, +0x21,0x2d,0x26,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x25,0xbc,0xbf,0x48,0x3, 0x2, 0x9, 0x37,0xb, 0xe0,0xe5,0x27,0xbc,0xbe,0x48,0x3, +0x2, 0x9, 0x6, 0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7e,0xb3,0xd, 0xf7,0xf5,0x2c, +0x75,0x10,0x0, 0xe4,0x7a,0xb3,0x15,0x54,0x7a,0xb3,0x15,0x55,0x6d,0x22,0x7e,0x34, +0x7f,0xff,0x7e,0x67,0xf, 0xda,0x6c,0xee,0xe4,0xa, 0x1e,0x19,0xb1,0x13,0xb6,0x6c, +0xaa,0x7e,0x10,0x2, 0xac,0x1e,0x19,0xa0,0x15,0x2b,0x19,0xb0,0x15,0x2c,0xe5,0x2c, +0xbc,0xbe,0x28,0x24,0x9, 0x20,0xd, 0x18,0x7e,0x30,0x18,0xac,0x23,0x9, 0x10,0xd, +0x19,0xa, 0x1, 0x2d,0x10,0x3e,0x14,0x2d,0x16,0xb, 0x18,0x10,0xbd,0x12,0x48,0x2, +0x7d,0x21,0xbd,0x13,0x18,0x2, 0x7d,0x31,0xb, 0xe0,0xbe,0xe0,0x14,0x78,0xb9,0x2d, +0x32,0xe, 0x34,0xe5,0x2c,0xbe,0xb0,0x2, 0x50,0x3, 0x2, 0x11,0x9d,0x6c,0xee,0x7e, +0x30,0x6, 0xac,0x3e,0x7d,0x51,0x2e,0x54,0x69,0x4e,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x23,0x58,0x20,0x7d,0x51,0x2e,0x54,0x69,0x50,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0x7a,0x25,0x30,0x2e,0x14,0x69,0x52,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0x7a,0x25,0x32,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc3,0x6c,0xee,0x2, 0x11, +0x8b,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19, +0xf5,0x23,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x13,0xb6,0x70,0xa, 0xa, 0x3e, +0xb, 0x34,0xa, 0x2e,0x19,0x72,0x13,0xb6,0xe5,0x2c,0x14,0xbc,0xbe,0x78,0x3, 0x2, +0x11,0x94,0xa, 0x5e,0xb, 0x54,0xf5,0x2d,0x2, 0x11,0x7f,0x7e,0x71,0x2d,0x74,0x2, +0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a,0xa1,0x24,0x9, 0xb3,0xd, 0x19,0xf5,0x25,0xa, +0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x2a,0xe5,0x25, +0xa, 0x2b,0xe5,0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x2b,0x75, +0x3d,0x2, 0x75,0x2f,0x0, 0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b, +0x2d,0x23,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0x7a,0x25,0x34,0x7e,0x11,0x24,0x74, +0x18,0xac,0x1b,0xe5,0x25,0xa, 0x1b,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0x7a,0x25,0x36,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0xe, 0x54,0x7a,0x55,0x38,0xbe,0x25,0x34,0x8, 0x14,0x7e,0x25,0x34, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x7a,0x25, +0x38,0xe5,0x2a,0xbe,0xb0,0x1, 0x38,0x37,0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x30,0x7c, +0xbf,0x54,0x2, 0xb4,0x2, 0x29,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, 0x20,0x7e, +0x71,0x22,0x74,0x18,0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d, +0x32,0xbe,0x35,0x38,0x18,0x3, 0x2, 0x11,0x13,0x75,0x2f,0x1, 0x2, 0x11,0x13,0xe5, +0x2a,0xbe,0xb0,0x1, 0x38,0xa, 0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x3, 0x2, 0x11,0x13, +0xe5,0x2a,0xbe,0xb0,0x4, 0x40,0x3, 0x2, 0x11,0x13,0xe5,0x2b,0xbe,0xb0,0x4, 0x40, +0x3, 0x2, 0x11,0x13,0x7c,0xbf,0x54,0x1, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x11,0x13, +0x6d,0x33,0x7a,0x35,0x3a,0x75,0x3c,0x0, 0x85,0x22,0x26,0x85,0x24,0x28,0xe5,0x24, +0xbe,0xb1,0x22,0x50,0x6, 0x85,0x24,0x26,0x85,0x22,0x28,0x85,0x23,0x27,0x85,0x25, +0x29,0xe5,0x25,0xbe,0xb1,0x23,0x50,0x6, 0x85,0x25,0x27,0x85,0x23,0x29,0x75,0x40, +0x0, 0x75,0x41,0x0, 0xe5,0x28,0xbe,0xb1,0x26,0x78,0x21,0x75,0x40,0x1, 0xe5,0x26, +0x60,0x5, 0xe5,0x26,0xb4,0xc, 0x3, 0x75,0x41,0x1, 0xe5,0x26,0xbe,0xb0,0x0, 0x28, +0x2, 0x15,0x26,0xe5,0x28,0xbe,0xb0,0xc, 0x50,0x2, 0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x27,0x78,0x21,0x75,0x40,0x1, 0xe5,0x27,0x60,0x5, 0xe5,0x27,0xb4,0x17,0x3, 0x75, +0x41,0x1, 0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x27,0xe5,0x29,0xbe,0xb0,0x17, +0x50,0x2, 0x5, 0x29,0x85,0x26,0x3e,0x80,0x78,0x85,0x27,0x3f,0x80,0x6a,0xe5,0x26, +0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x28,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x27,0xbe,0xb1, +0x3f,0x68,0x7, 0xe5,0x29,0xbe,0xb1,0x3f,0x78,0x24,0x7e,0x51,0x3e,0x74,0x18,0xac, +0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0xbe,0x24, +0x0, 0x0, 0x8, 0x6, 0x2e,0x25,0x3a,0x7a,0x25,0x3a,0x5, 0x3c,0x80,0x28,0x7e,0x51, +0x3e,0x74,0x18,0xac,0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0xbe,0x25,0x32,0x8, 0xc, 0xe5,0x3d,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x3d, +0x1, 0x80,0x3, 0x75,0x3d,0x0, 0x5, 0x3f,0xe5,0x29,0xbe,0xb1,0x3f,0x50,0x8f,0x5, +0x3e,0xe5,0x28,0xbe,0xb1,0x3e,0x50,0x81,0x7e,0x51,0x28,0x74,0x18,0xac,0x5b,0xe5, +0x27,0xa, 0x4b,0x2d,0x24,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x50,0x7e,0x25,0x3a,0x9d, +0x25,0x7e,0x31,0x26,0x74,0x18,0xac,0x3b,0xe5,0x29,0xa, 0xb, 0x7d,0x51,0x2d,0x50, +0x3e,0x54,0x2d,0x56,0xb, 0x58,0x50,0x9d,0x25,0x2d,0x14,0x3e,0x14,0x2d,0x16,0xb, +0x18,0x10,0x9d,0x21,0x7e,0x31,0x28,0x74,0x18,0xac,0x3b,0x2d,0x10,0x3e,0x14,0x2d, +0x16,0xb, 0x18,0x10,0x9d,0x21,0x7a,0x25,0x3a,0x7e,0x25,0x36,0x2e,0x25,0x34,0x7a, +0x25,0x38,0xe5,0x40,0xb4,0x1, 0x11,0xe5,0x41,0x70,0xd, 0x7e,0x25,0x3a,0x9e,0x25, +0x38,0x7a,0x25,0x3a,0x15,0x3c,0x15,0x3c,0xe5,0x3c,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x3c,0x24,0xfc,0xf5,0x3c,0x7e,0x25,0x3a,0xbe,0x24,0x0, 0x0, 0x58,0x3, 0x7a,0x35, +0x3a,0x7e,0x15,0x38,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x30,0x1a,0x26,0x1a,0x24,0x12, +0x48,0x24,0xe5,0x3c,0xa, 0x1b,0x6d,0x0, 0x12,0x48,0x24,0x7f,0x21,0x7e,0x35,0x3a, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x48,0x35,0xbf,0x12,0x8, 0xa, 0xe5, +0x3d,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x2f,0x2, 0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, +0x75,0x2f,0x2, 0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x63,0xe5,0x2f,0xa, 0x3b,0x2e,0x34, +0x15,0x53,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2d,0xa, 0x3b,0x9, 0xb3,0x13, +0xb6,0x70,0xc, 0xa, 0x2e,0x9, 0x52,0x13,0xb6,0x19,0x53,0x13,0xb6,0x80,0x3e,0x75, +0x2e,0x0, 0x80,0x32,0x9, 0x33,0x13,0xb6,0xa, 0x2e,0x9, 0xa2,0x13,0xb6,0xbc,0xa3, +0x28,0x12,0xe5,0x2e,0xa, 0x2b,0x9, 0x22,0x13,0xb6,0xbc,0x2a,0x78,0x16,0x19,0x32, +0x13,0xb6,0x80,0x10,0xe5,0x2e,0xa, 0x2b,0x9, 0xb2,0x13,0xb6,0xbc,0xb3,0x78,0x4, +0x19,0xa2,0x13,0xb6,0x5, 0x2e,0xe5,0x2c,0xbe,0xb1,0x2e,0x38,0xc7,0x5, 0x2d,0xe5, +0x2c,0xbe,0xb1,0x2d,0x28,0x3, 0x2, 0xe, 0x3b,0xb, 0xe0,0xe5,0x2c,0xbc,0xbe,0x28, +0x3, 0x2, 0xe, 0x1, 0x7e,0x34,0x13,0xb6,0x12,0x39,0xc4,0xf5,0x10,0xda,0x3b,0x22, +0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55, +0x7e,0x37,0xf, 0x61,0x7a,0x35,0x3e,0x6c,0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0xe4,0x19,0xb3,0xd, 0x71,0xa, 0x5d,0x3e,0x54,0xb, 0x54,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x39,0x9, 0xb3,0xd, 0x19,0xf5,0x3a, +0xbe,0xd1,0x3a,0x28,0x3, 0x2, 0x12,0xe, 0x7e,0xb3,0x10,0x2c,0xa, 0xb, 0x1b,0x4, +0xa, 0x3d,0x9d,0x3, 0xe5,0x3a,0xa, 0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0xe, 0x7c, +0x3a,0xa, 0x4d,0xe5,0x3a,0xa, 0xb, 0x9d,0x4, 0x7c,0x51,0x2, 0x12,0x59,0xbe,0xd1, +0x3a,0x38,0x3, 0x2, 0x12,0x27,0xe5,0x3a,0xa, 0xb, 0xa, 0x3d,0x2d,0x30,0xb, 0x34, +0x7c,0x37,0x6c,0x55,0x2, 0x12,0x59,0xa, 0xfd,0xe5,0x3a,0xa, 0x4b,0x2d,0xf4,0x7e, +0xb3,0x10,0x2c,0xa, 0xb, 0x7d,0x30,0x1b,0x34,0xbd,0xf3,0x18,0x3, 0x2, 0x12,0x59, +0xbd,0x43,0x8, 0x3, 0x2, 0x12,0x59,0xa, 0x3d,0x2d,0x30,0xe5,0x3a,0xa, 0xb, 0x9d, +0x30,0x7c,0x37,0xa, 0x3d,0x9d,0x3, 0x7c,0x51,0xbe,0xd1,0x39,0x28,0x3, 0x2, 0x12, +0x83,0x7e,0xb3,0x10,0x2b,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5,0x39,0xa, +0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0x83,0x7c,0x4a,0xa, 0xd, 0xe5,0x39,0xa, 0x3b, +0x2, 0x12,0xca,0xbe,0xd1,0x39,0x38,0x3, 0x2, 0x12,0x9c,0xe5,0x39,0xa, 0xb, 0xa, +0x3d,0x2d,0x30,0xb, 0x34,0x7c,0x47,0x6c,0x22,0x2, 0x12,0xce,0xa, 0x4d,0xe5,0x39, +0xa, 0x5b,0x2d,0x45,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7d,0x3, 0x1b,0x4, 0xbd,0x40, +0x18,0x3, 0x2, 0x12,0xce,0xbd,0x50,0x8, 0x3, 0x2, 0x12,0xce,0xa, 0xd, 0x2d,0x3, +0xe5,0x39,0xa, 0x3b,0x9d,0x3, 0x7c,0x41,0xa, 0xd, 0x9d,0x30,0x7c,0x27,0x7e,0x37, +0xf, 0xda,0x7c,0xb2,0x7e,0x23,0xf, 0x53,0x7e,0x4, 0x9, 0xc8,0x12,0x5c,0x33,0x7e, +0x37,0x9, 0xc8,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xca,0x7d,0x20,0x7a,0x1d,0x28, +0x7e,0x37,0x9, 0xcc,0x7d,0x3, 0x7e,0x37,0x9, 0xce,0x7d,0x20,0x7a,0x1d,0x2c,0x7e, +0x37,0x9, 0xd0,0x7d,0x3, 0x7e,0x37,0x9, 0xd2,0x7d,0x20,0x7a,0x1d,0x30,0x7e,0x37, +0x9, 0xd4,0x7d,0x3, 0x7e,0x37,0x9, 0xd6,0x7d,0x20,0x7a,0x1d,0x34,0xa, 0x2d,0xe5, +0x39,0xa, 0x3b,0x9d,0x32,0x7c,0xc7,0x2, 0x15,0x24,0xa, 0x4d,0xe5,0x3a,0xa, 0x5b, +0x9d,0x54,0xf5,0x38,0x2, 0x15,0xd, 0xbe,0xc0,0x0, 0x58,0x3, 0x2, 0x15,0xb, 0x7e, +0x73,0x10,0x2b,0xbc,0x7c,0x18,0x3, 0x2, 0x15,0xb, 0xe5,0x38,0xbe,0xb0,0x0, 0x58, +0x3, 0x2, 0x15,0xb, 0x7e,0x73,0x10,0x2c,0xbe,0x71,0x38,0x18,0x3, 0x2, 0x15,0xb, +0xe5,0x38,0x1a,0x1b,0x3e,0x14,0x1a,0x2c,0x7e,0x34,0x0, 0x30,0xad,0x32,0x2d,0x31, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x7e,0x53,0xf, 0x53,0xa, 0x25,0x9d,0x32,0x7a, +0x35,0x3c,0xbe,0x34,0x0, 0x0, 0x18,0x3, 0x2, 0x15,0xb, 0x7e,0x35,0x3e,0xbe,0x35, +0x3c,0x28,0x3, 0x2, 0x13,0xa6,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xd, 0x71,0x7e, +0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x39,0xa, 0x2b,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x13,0xd0,0xe5,0x3a,0xa, 0x2b,0xe5,0x38, +0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x2, 0x15,0xb, +0x75,0x3b,0x0, 0x2, 0x14,0x60,0xbe,0xe1,0x3b,0x78,0x3, 0x2, 0x14,0x5e,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe, +0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0x75,0x3b,0xff,0x2, 0x14,0x6c,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe, +0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0x75,0x3b,0x0, 0x2, 0x14,0x6c,0x5, 0x3b, +0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x3b,0x8, 0x3, 0x2, 0x13,0xd6,0xe5,0x3b,0x60,0x3, +0x2, 0x14,0xc0,0x7e,0x35,0x3c,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x3c,0x7e, +0xf5,0x3c,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a, +0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34, +0x7e,0x1d,0x28,0x9f,0x17,0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30, +0xe5,0x3b,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x15,0xb, 0x7e,0xf5,0x3c,0x7d,0x3f,0x1a, +0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d, +0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34,0x7e,0x1d,0x28,0x9f,0x17, +0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30,0x5, 0x38,0xa, 0x2d,0xe5, +0x3a,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x38,0x1a,0x3b,0xbd,0x32,0x18,0x3, 0x2, +0x13,0x37,0xb, 0xc0,0xa, 0x2d,0xe5,0x39,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0x1a,0x3c, +0xbd,0x32,0x18,0x3, 0x2, 0x13,0x2a,0x74,0x6, 0x7e,0x1d,0x2c,0x2f,0x11,0x14,0x78, +0xfb,0x7a,0x1d,0x2c,0x7e,0xd, 0x28,0x7e,0x1d,0x2c,0x12,0x48,0x40,0x2e,0x34,0x0, +0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xd, 0x6b,0x74,0x6, 0x7e,0x1d,0x34,0x2f, +0x11,0x14,0x78,0xfb,0x7a,0x1d,0x34,0x7e,0x7d,0x30,0x7e,0x1d,0x34,0x7f,0x7, 0x12, +0x48,0x40,0x2e,0x34,0x0, 0x20,0x59,0x36,0xd, 0x6d,0x7e,0xb3,0xf, 0x60,0x7f,0x17, +0x70,0x3, 0x2, 0x15,0x91,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7a,0x1d,0x30,0xbe,0x18,0x0, 0x7f,0x38,0x3, 0x2, 0x15,0xa4,0x7e,0x18,0x0, +0x7f,0x7a,0x1d,0x30,0x7e,0x2d,0x30,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0x71,0x7e,0x70,0x7, 0xac,0x7f,0x19, +0xa3,0xd, 0x71,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xd, 0x71,0xbe,0x70,0xf, 0x38,0x3, +0x2, 0x15,0xdf,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xd, 0x71,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x11, +0x96,0xa5,0xbe,0x1, 0x58,0x7e,0xa3,0x10,0x2b,0xbc,0xa7,0x28,0xd, 0x7a,0x71,0xd, +0x74,0x30,0xac,0x7b,0x2e,0x37,0x16,0x9e,0x80,0x3c,0x7a,0x71,0xd, 0xbc,0xa7,0x78, +0x6, 0x7e,0x34,0x8, 0x9a,0x80,0x2f,0xa, 0x2a,0x7d,0x2, 0xb, 0x4, 0xa, 0x17,0xbd, +0x10,0x78,0x6, 0x7e,0x34,0x8, 0xca,0x80,0x1d,0x7d,0x2, 0xb, 0x5, 0xbd,0x10,0x78, +0x6, 0x7e,0x34,0x9, 0x2e,0x80,0xf, 0x2e,0x24,0x0, 0x3, 0xbd,0x12,0x68,0x3, 0x2, +0x19,0x6a,0x7e,0x34,0x9, 0x5e,0x7a,0x37,0x16,0x4f,0x2, 0x19,0x6a,0xa5,0xbe,0x0, +0x46,0x7e,0x64,0x0, 0xb, 0x7a,0x69,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf,0x1, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, +0x74,0x1, 0x7e,0x70,0x1, 0x80,0x36,0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3, +0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x21,0x74,0x27,0x7e,0x70, +0x3, 0x12,0x6d,0x9f,0x2, 0x19,0x6a,0xa5,0xbe,0x2, 0x23,0xa5,0xbf,0x4, 0x7, 0x74, +0x1, 0x7e,0x70,0x4, 0x80,0x7, 0xa5,0xbf,0x5, 0x9, 0xe4,0x6c,0x77,0x12,0x0, 0x5e, +0x2, 0x19,0x6a,0xbe,0x70,0x1, 0x50,0x3, 0x2, 0x19,0x6a,0x2, 0x19,0x6a,0xa5,0xbe, +0x3, 0x15,0xbe,0x70,0xd, 0x28,0x9, 0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x2, 0x19,0x6a, +0x7a,0x73,0x10,0x2b,0x2, 0x19,0x6a,0xa5,0xbe,0x4, 0x15,0xbe,0x70,0x18,0x28,0x9, +0x74,0x18,0x7a,0xb3,0x10,0x2c,0x2, 0x19,0x6a,0x7a,0x73,0x10,0x2c,0x2, 0x19,0x6a, +0xa5,0xbe,0x5, 0x7, 0x7a,0x73,0x10,0x2d,0x2, 0x19,0x6a,0xa5,0xbe,0x7, 0x1e,0x7a, +0x73,0x10,0x4b,0x7c,0xb7,0x54,0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0x10, +0x54,0x5e,0x70,0x3, 0x4d,0x32,0x7a,0x37,0x10,0x54,0x2, 0x19,0x6a,0xa5,0xbe,0x8, +0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xac,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x16,0x2, 0x19,0x6a,0xa5,0xbe,0x9, 0x1c,0xbe,0x70,0xa, 0x50,0x3, 0x7e,0x70, +0xa, 0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xad,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x49,0x2, 0x19,0x6a,0xa5,0xbe,0xa, 0x10,0xa5,0xbf,0x0, 0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x10,0x3b,0x2, 0x19,0x6a,0xa5,0xbe,0xb, 0x14,0x7e,0xb3,0x10, +0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xae,0x2, 0x19,0x6a,0x7a,0x73,0x11,0x94,0x2, 0x19, +0x6a,0xa5,0xbe,0xc, 0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xd, 0xfe,0x2, +0x19,0x6a,0x7a,0x73,0x11,0x9d,0x2, 0x19,0x6a,0xa5,0xbe,0x4c,0x7, 0x7a,0x73,0xf, +0x46,0x2, 0x19,0x6a,0xa5,0xbe,0xfb,0x29,0x7a,0x71,0x8, 0x7e,0x37,0x10,0x50,0x5e, +0x70,0xdf,0x7a,0x37,0x10,0x50,0xe5,0x8, 0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x4e,0x37,0x10,0x50,0x7a,0x37,0x10,0x50,0x2, 0x19, +0x6a,0xa5,0xbe,0x4e,0x7, 0x7a,0x73,0x10,0x4a,0x2, 0x19,0x6a,0xa5,0xbe,0x4f,0x6, +0x12,0x0, 0x6, 0x2, 0x19,0x6a,0xbe,0x60,0x50,0x40,0x12,0xbe,0x60,0x51,0x38,0xd, +0xa, 0x26,0x2e,0x27,0x10,0x2f,0x9e,0x24,0x0, 0x50,0x2, 0x19,0x54,0xbe,0x60,0x52, +0x40,0x12,0xbe,0x60,0x55,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x31,0x9e,0x24,0x0, +0x52,0x2, 0x19,0x54,0xbe,0x60,0x56,0x40,0x12,0xbe,0x60,0x62,0x38,0xd, 0xa, 0x26, +0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x56,0x2, 0x19,0x54,0xbe,0x60,0x63,0x40,0x12, +0xbe,0x60,0x7a,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x63,0x2, +0x19,0x54,0xbe,0x60,0x7b,0x50,0x3, 0x2, 0x18,0xe8,0xbe,0x60,0x9f,0x28,0x3, 0x2, +0x18,0xe8,0x7e,0xb3,0x10,0x3b,0x70,0x48,0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24, +0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29, +0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f,0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17, +0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29, +0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, 0x2f,0x19,0x72,0xf, 0xdc,0x2, 0x19,0x6a, +0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27, +0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29,0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f, +0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17,0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27, +0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29,0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, +0x2f,0x19,0x72,0xf, 0x63,0x2, 0x19,0x6a,0xbe,0x60,0xa0,0x40,0x11,0xbe,0x60,0xac, +0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6c,0x9e,0x24,0x0, 0xa0,0x80,0x56,0xbe,0x60, +0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6e,0x9e,0x24, +0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38,0xc, 0xa, 0x26, +0x2e,0x27,0x10,0x70,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2,0x40,0x11,0xbe, +0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x72,0x9e,0x24,0x0, 0xd2,0x80,0x14, +0xbe,0x60,0xd6,0x40,0x14,0xbe,0x60,0xed,0x38,0xf, 0xa, 0x26,0x2e,0x27,0x10,0x74, +0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x80,0x11,0xa5,0xbe,0xf8,0x6, 0x7a,0x73,0x11, +0xe8,0x80,0x7, 0xa5,0xbe,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x3b,0x22,0xca,0x3b,0xe4, +0x7a,0xb3,0x13,0xde,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x23,0x6c,0xee,0x7e,0xa0,0xff, +0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0xff,0xa, 0x3e,0x19,0xb3,0x13, +0xca,0x7e,0x34,0xff,0xff,0x74,0x2, 0xac,0xbe,0x59,0x35,0x13,0xb6,0xe4,0xa, 0x3e, +0x19,0xb3,0x13,0xd4,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xd2,0x7e,0xb3,0xf, 0x1b,0x60, +0x3, 0x2, 0x19,0xe5,0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0x2, 0x1b,0xfc,0x6c,0xee,0x7e, +0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, +0x78,0xdd,0x2, 0x1b,0xfc,0x7e,0xb3,0xf, 0x1c,0x60,0x3, 0x2, 0x1a,0x38,0x6c,0xee, +0x2, 0x1a,0x2d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5e, +0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19, +0xe5,0xe, 0x11,0x74,0x1, 0xa, 0x3e,0x19,0xb3,0x13,0xd4,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0xbe,0x2, 0x1b,0xfc,0x6c,0xee,0x2, 0x1a,0x9e,0x6c,0xff,0x7e, +0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23,0x49,0x23,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x49, +0x35,0xe, 0xf, 0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x7e,0x70,0x2, 0xac,0x7f,0x2e, +0x35,0x23,0x49,0x23,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x9d,0x32, +0x12,0x6d,0xd0,0x2d,0x36,0x7a,0x35,0x21,0x74,0x2, 0xac,0xbe,0x49,0x45,0x13,0xb6, +0xbe,0x45,0x21,0x38,0x3, 0x2, 0x1a,0x95,0xa, 0x4e,0x19,0xf4,0x13,0xca,0x7e,0x35, +0x21,0x59,0x35,0x13,0xb6,0xb, 0xf0,0xbe,0xf0,0xa, 0x78,0xa3,0xb, 0xe0,0x7e,0x73, +0xf, 0x1b,0xbc,0x7e,0x38,0x97,0x6c,0xee,0x2, 0x1b,0x52,0x74,0x1, 0x7a,0xb3,0x13, +0xde,0x6c,0xff,0x2, 0x1a,0xf1,0xbc,0xfe,0x78,0x3, 0x2, 0x1a,0xef,0xa, 0x3f,0x9, +0x63,0x13,0xca,0xa, 0x2e,0x9, 0x72,0x13,0xca,0xbc,0x76,0x68,0x3, 0x2, 0x1a,0xef, +0x74,0x2, 0xac,0xbf,0x49,0x25,0x13,0xb6,0x74,0x2, 0xac,0xbe,0x49,0x35,0x13,0xb6, +0xbd,0x32,0x50,0x3, 0x2, 0x1a,0xef,0xe4,0x7a,0xb3,0x13,0xde,0x2, 0x1a,0xf9,0xb, +0xf0,0x7e,0x73,0xf, 0x1b,0xbc,0x7f,0x38,0xbd,0x7e,0xb3,0x13,0xde,0xb4,0x1, 0x2, +0x80,0x3, 0x2, 0x1b,0x50,0x74,0x1, 0xa, 0x3e,0x9, 0xa3,0x13,0xca,0xa, 0x4a,0x19, +0xb4,0x13,0xd4,0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0x7, 0xac,0xbe, +0x49,0x35,0xe, 0xd, 0xa, 0x2e,0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e, +0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0xa, 0x2e, +0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28, +0xb, 0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, 0x1a,0xab,0x6c,0xee,0x2, +0x1b,0xc1,0x74,0x7, 0xac,0xbe,0x9, 0xb5,0xe, 0x11,0xb4,0xff,0x2, 0x80,0x3, 0x2, +0x1b,0xbf,0x6c,0xff,0xa, 0x3f,0x9, 0xb3,0x13,0xd4,0x60,0x3, 0x2, 0x1b,0xb8,0x74, +0x1, 0x19,0xb3,0x13,0xd4,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, +0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, +0xf, 0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac, +0xbe,0x19,0xf5,0xe, 0x11,0x2, 0x1b,0xbf,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xb5,0xb, +0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x38,0x99,0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13, +0xd4,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x1b,0xf5,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, +0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xcf,0x7e,0xf3,0xf, 0x1b, +0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13,0xd4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x4e, +0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c, +0x27,0x74,0x3, 0x19,0xb3,0x0, 0xa, 0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xa3,0x0, 0xa, +0xbe,0xa0,0x3, 0x68,0x3, 0x2, 0x1c,0x3f,0xe4,0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0x4c, +0xaa,0x68,0x3, 0x2, 0x1c,0x7c,0x74,0x2, 0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0xa, 0x3e, +0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xbe,0xb0,0x2, 0x78,0x3, 0x2, 0x1c,0x64,0x60, +0x3, 0x2, 0x1c,0x77,0x74,0x1, 0x7a,0x39,0xb0,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4, +0x19,0xe5,0xe, 0x11,0x2, 0x1c,0x7c,0x74,0x3, 0x7a,0x39,0xb0,0xa, 0x2e,0x2e,0x25, +0x23,0x7e,0x29,0x70,0x19,0x72,0x0, 0xa, 0xb, 0xe0,0xbe,0xe0,0xa, 0x50,0x3, 0x2, +0x1c,0x2, 0xda,0x3b,0x22,0xca,0x3b,0x75,0x24,0x0, 0x75,0x26,0x0, 0x75,0x27,0x0, +0x75,0x28,0x0, 0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x2a,0x7e,0xa3,0xf, 0x24,0x4c,0xaa, +0x78,0xf, 0x7e,0xb3,0xf, 0x20,0x70,0x9, 0x7e,0xb3,0xf, 0x21,0x70,0x3, 0x2, 0x1f, +0x54,0x4c,0xaa,0x78,0x11,0x7e,0xb3,0xf, 0x20,0x60,0x16,0x80,0x9, 0x7e,0x73,0x0, +0xff,0xbe,0x70,0xf, 0x38,0x6, 0x7e,0xb3,0x0, 0x8b,0x60,0xf1,0xe4,0x7a,0xb3,0x0, +0x8b,0x20,0x0, 0x6, 0x7e,0x74,0x15,0xca,0x80,0x4, 0x7e,0x74,0x16,0xc, 0x7d,0x37, +0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0,0x74,0xaa,0x7a,0x79,0xb0,0x19,0xb7, +0x0, 0x1, 0x7e,0x73,0xf, 0x1d,0x19,0x77,0x0, 0x3, 0x75,0x25,0x0, 0x6c,0xdd,0x2, +0x1e,0xe1,0x7e,0x70,0x7, 0xac,0x7d,0x9, 0xa3,0xe, 0x9d,0x7a,0xa1,0x29,0x7c,0xba, +0x54,0xf, 0xa, 0x2b,0x2e,0x25,0x2a,0x7e,0x29,0xc0,0x7c,0xba,0x54,0xf0,0xbe,0xb0, +0x0, 0x28,0x13,0xb4,0xb0,0x2, 0x80,0x3, 0x2, 0x1e,0xdf,0x53,0x29,0xf, 0xbe,0xc0, +0x1, 0x68,0x3, 0x2, 0x1e,0xdf,0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x1e,0xdf,0x7e,0xa1, +0x25,0x74,0x6, 0xa4,0xf5,0x21,0x9, 0xb3,0xe, 0x9e,0xf5,0x27,0x74,0x7, 0xac,0xbd, +0x9, 0xb5,0xe, 0x9f,0xc4,0x54,0xf0,0xf5,0x28,0x7e,0x73,0xf, 0x46,0xbe,0x71,0x29, +0x28,0x68,0x7e,0xb3,0xf, 0x22,0x70,0x2a,0x7e,0x8, 0x0, 0x27,0xe5,0x29,0xa, 0x3b, +0x2e,0x34,0x0, 0x77,0x74,0x1, 0x7e,0x50,0xf, 0x12,0x5f,0x76,0x7e,0x8, 0x0, 0x28, +0xe5,0x29,0xa, 0x3b,0x2e,0x34,0x0, 0x81,0x74,0x10,0x7e,0x50,0x20,0x12,0x5f,0x76, +0x80,0x14,0xe5,0x29,0xa, 0x3b,0x9, 0xb3,0x0, 0x77,0xf5,0x27,0xe5,0x29,0xa, 0x3b, +0x9, 0xb3,0x0, 0x81,0xf5,0x28,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x2e,0x25,0x2a,0x7e, +0x29,0xb0,0xb4,0x1, 0x15,0xe4,0x19,0xb3,0x0, 0x77,0x6c,0xaa,0xe5,0x29,0xa, 0x3b, +0x19,0xa3,0x0, 0x81,0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0xf, 0x5f,0xb4,0xff, +0x15,0x74,0x7, 0xac,0xbd,0x9, 0xb5,0xe, 0x9d,0xbe,0xb0,0xff,0x68,0x5, 0x75,0x27, +0x1, 0x80,0x3, 0x75,0x27,0x0, 0x7e,0x90,0x7, 0xac,0x9d,0x49,0x54,0xe, 0x99,0x7a, +0x55,0x2c,0x49,0x54,0xe, 0x9b,0x7a,0x55,0x2e,0xbe,0xc0,0x1, 0x78,0x2e,0x75,0x30, +0x0, 0x7e,0x71,0x30,0x74,0x7, 0xac,0x7b,0x9, 0xb3,0x0, 0x90,0x54,0xf, 0xbe,0xb1, +0x29,0x78,0x10,0x49,0x23,0x0, 0x8c,0x7a,0x25,0x2c,0x49,0x53,0x0, 0x8e,0x7a,0x55, +0x2e,0x80,0x9, 0x5, 0x30,0xe5,0x30,0xbe,0xb0,0xa, 0x40,0xd5,0x7e,0x25,0x2c,0x7a, +0x25,0x22,0xa, 0x54,0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x21,0xa, 0x3b,0x7d,0x13, +0x2d,0x17,0x19,0xa1,0x0, 0x5, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x6, 0x7e,0x25, +0x2e,0x7a,0x25,0x22,0xa, 0x14,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x57,0x19,0x35, +0x0, 0x7, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x8, 0xe5,0x27,0x7d,0x23,0x2d,0x27, +0x19,0xb2,0x0, 0x9, 0xe5,0x28,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0xa, 0x9, 0xa4, +0xe, 0x9d,0x7c,0xba,0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x27,0x2e,0x24,0x0, +0x7, 0x7e,0x29,0xb0,0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x21,0xbe,0xc0, +0x1, 0x68,0x2, 0x5, 0x24,0x5, 0x26,0x7c,0xbc,0x3, 0x3, 0x54,0xc0,0x7d,0x13,0x2d, +0x17,0x2e,0x14,0x0, 0x5, 0x7e,0x19,0x50,0x2c,0x5b,0x7a,0x19,0x50,0x80,0xe, 0x2d, +0x37,0x2e,0x34,0x0, 0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x25,0xb, +0xd0,0x7e,0x73,0xf, 0x46,0xbc,0x7d,0x28,0x3, 0x2, 0x1d,0x12,0xe5,0x24,0x19,0xb7, +0x0, 0x4, 0xe5,0x26,0xbe,0xb0,0x0, 0x28,0x2d,0x74,0x42,0x19,0xb7,0x0, 0x2, 0xe4, +0x19,0xb7,0x0, 0x41,0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e, +0x24,0x0, 0x41,0x7e,0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x41, +0x78,0xe4,0xb2,0x0, 0x80,0xe, 0x7e,0xb3,0xf, 0x21,0xb4,0x1, 0xc, 0x7e,0xb3,0x10, +0xd1,0xb4,0x24,0x5, 0x74,0x1, 0x12,0x6e,0x92,0x7e,0xb3,0xf, 0x20,0x60,0x6, 0x7e, +0x35,0x2a,0x12,0x68,0xb, 0xe4,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x20,0x7a,0xb3, +0xf, 0x21,0x80,0x4, 0xe4,0x12,0x6e,0x92,0x7e,0x24,0xe, 0x99,0x7e,0x34,0x0, 0x8c, +0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0xe5,0x26,0x70,0xd, 0x7e,0x34,0x0, 0x8c,0x7e, +0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0xda,0x3b,0x22,0xca,0x79,0x75,0x26,0x17, +0x7e,0xb3,0xd, 0xf7,0xf5,0x21,0x70,0x3, 0x2, 0x22,0x1d,0x7e,0x34,0x13,0xb6,0x7e, +0x24,0x1, 0x2b,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x14,0xe1,0x7e,0x24,0x0, 0x2, 0xe4, +0x12,0x6d,0xe0,0x6c,0xaa,0x2, 0x20,0x32,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, +0x18,0x9, 0x23,0xd, 0x19,0x1a,0x3, 0x1b,0x5, 0x80,0x69,0xbe,0x10,0x0, 0x48,0x62, +0xbe,0x10,0xd, 0x58,0x5d,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25, +0x7c,0xb1,0x54,0x7, 0x7e,0x74,0x0, 0x1, 0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x7c, +0xef,0xa, 0x40,0x2e,0x44,0x14,0xe1,0x7e,0x49,0xb0,0x4c,0xbe,0x7a,0x49,0xb0,0x1a, +0x32,0x1b,0x35,0x7c,0xf7,0x80,0x1f,0xbe,0xf0,0x0, 0x48,0x18,0xe5,0x26,0xbc,0xbf, +0x8, 0x12,0x74,0x1, 0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0x4f,0x2d,0x43, +0x19,0xb4,0x13,0xb6,0xb, 0xf0,0x1a,0x22,0x2e,0x24,0x0, 0x3, 0x1a,0x3f,0xbd,0x32, +0x48,0xd5,0xb, 0x10,0x1a,0x23,0x2e,0x24,0x0, 0x3, 0x1a,0x31,0xbd,0x32,0x48,0x8b, +0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x1f,0xa8,0x6c,0x11,0x7c,0x1, 0xe, +0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, 0x7e,0x44,0x0, 0x1, +0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa, 0x30,0x9, 0xb3,0x14,0xe1,0x5c, +0xbe,0x78,0x3, 0x2, 0x20,0xf9,0x6d,0x33,0x7a,0x35,0x22,0x75,0x24,0x0, 0x1a,0x21, +0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x43,0x2e,0x47,0xf, 0xda,0x6c,0x0, 0x80,0x26, +0x1a,0xe1,0x7e,0xf4,0x0, 0x17,0xad,0xfe,0xa, 0x30,0x2d,0x3f,0x9, 0xb3,0x13,0xb6, +0x70,0x12,0x7e,0x70,0x2, 0xac,0x70,0x2d,0x34,0xb, 0x38,0x30,0x2e,0x35,0x22,0x7a, +0x35,0x22,0x5, 0x24,0xb, 0x0, 0xe5,0x26,0xbc,0xb0,0x38,0xd4,0xe5,0x24,0x60,0x49, +0xe5,0x24,0x1a,0x2b,0x7e,0x35,0x22,0x12,0x47,0xf2,0x7a,0x35,0x22,0x6c,0xff,0x80, +0x32,0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0xff,0x7d,0xe3,0x2d,0xef,0x9, +0xbe,0x13,0xb6,0xb4,0x1, 0x1b,0x1a,0x21,0x7e,0x34,0x0, 0x18,0xad,0x32,0x7d,0x23, +0x2d,0x2f,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x9e,0x35,0x22,0x1b,0x28, +0x30,0xb, 0xf0,0xe5,0x26,0xbc,0xbf,0x18,0xc8,0xb, 0x10,0xa5,0xb9,0xd, 0x2, 0x80, +0x3, 0x2, 0x20,0x3d,0x6c,0xaa,0x2, 0x22,0x14,0x7e,0x10,0x2, 0xac,0x1a,0x9, 0x30, +0xd, 0x18,0x9, 0x20,0xd, 0x19,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xf5,0x25,0x7c,0xba, +0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa5, +0xbb,0x0, 0x2c,0x1a,0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e, +0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x20,0x49,0x33,0x0, 0x30,0xbd,0x32,0x18,0x3, +0x2, 0x21,0xd9,0x1a,0x33,0xb, 0x34,0x7c,0xb7,0x19,0xb0,0xd, 0x18,0x80,0x7a,0xa5, +0xbb,0xc, 0x2c,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x22,0x2d,0x23,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x49,0x2, 0xff,0xd0,0xbd,0x3, 0x8, 0x59, +0x1a,0x33,0x1b,0x34,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x70,0xd, 0x18,0x80,0x4a,0x1a, +0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, +0xda,0x49,0x43,0x0, 0x30,0x49,0x3, 0xff,0xd0,0xbd,0x4, 0x8, 0x16,0xb, 0x38,0x20, +0xbd,0x2, 0x8, 0x25,0x1a,0x23,0x1b,0x24,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x50,0xd, +0x18,0x80,0x16,0xb, 0x38,0x0, 0xbd,0x40,0x8, 0xf, 0x1a,0x33,0xb, 0x34,0x7c,0x37, +0x7e,0x10,0x2, 0xac,0x1a,0x19,0x30,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33, +0xd, 0x18,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x2, 0x2d,0x3, 0x3e,0x4, +0x2e,0x7, 0xf, 0xda,0xb, 0x8, 0x0, 0xbe,0x4, 0x0, 0x3c,0x58,0x15,0x7c,0x7e,0x6e, +0x70,0xff,0xe5,0x25,0xa, 0x4b,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x5c,0xb7,0x7a, +0x49,0xb0,0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x21,0x9, 0xda,0x79,0x22, +0xca,0xd8,0xca,0x79,0x6c,0xaa,0x7e,0x34,0x11,0x9e,0x7e,0x44,0x11,0x4a,0xe4,0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfe,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, +0x17,0xbe,0xb0,0x0, 0x28,0x4f,0x7e,0x53,0xd, 0xf8,0xbe,0x50,0x0, 0x28,0x46,0x6c, +0xff,0x80,0x3c,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x40,0x9, 0xe1,0xd, 0x41, +0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x13,0xb, 0x18,0x0, 0x6d,0x11,0x9e,0x17,0xf, 0x4c, +0xbd,0x1, 0x58,0x19,0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x13,0x49,0x1, 0x0, 0x30,0x6d, +0x11,0x9e,0x17,0xf, 0x4a,0xbd,0x1, 0x58,0x4, 0x5, 0x6b,0x80,0xb, 0xb, 0xf0,0xbc, +0x5f,0x38,0xc0,0x80,0x3, 0x75,0x6b,0x0, 0xe5,0x6b,0xbe,0xb0,0x3, 0x40,0x17,0x7e, +0xb3,0xe, 0xa, 0x44,0x1, 0x7a,0xb3,0xe, 0xa, 0x75,0x6b,0x0, 0x7e,0xb3,0x16,0xbc, +0x44,0x1, 0x7a,0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfd,0x7a,0xb3,0xe, 0xa, +0x7e,0xb3,0xd, 0x16,0x70,0x59,0x7e,0x53,0xd, 0xf7,0xbe,0x50,0x0, 0x28,0x50,0x6c, +0xff,0x80,0x48,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x18,0x9, 0xe1,0xd, 0x19, +0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x14,0x49,0x11,0x0, 0x30,0x6d,0x0, 0x9e,0x7, 0xd, +0xff,0xbd,0x10,0x48,0xe, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x14,0xb, 0x18,0x10,0xbd, +0x10,0x58,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x2, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16, +0xbc,0x44,0x2, 0x7a,0xb3,0x16,0xbc,0x80,0x6, 0xb, 0xf0,0xbc,0x5f,0x38,0xb4,0x7e, +0xb3,0xe, 0x9, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x23,0xc3,0x7e,0xb3,0xd, 0x16,0x70, +0x6d,0x6c,0xff,0x80,0x61,0x7e,0x50,0x2, 0xac,0x5f,0x7d,0x12,0x2d,0x14,0xb, 0x18, +0x10,0xbe,0x17,0xd, 0xff,0x8, 0x4d,0x2d,0x23,0xb, 0x28,0x20,0xbe,0x27,0xd, 0xff, +0x58,0x42,0xbe,0xf1,0x6c,0x68,0x6, 0x7a,0xf1,0x6c,0x75,0x6d,0x0, 0xbe,0xf1,0x6c, +0x78,0x2, 0x5, 0x6d,0xe5,0x6d,0xbe,0xb0,0x10,0x28,0x33,0x75,0x6d,0x10,0xe5,0x51, +0x70,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x4, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x4, 0x7a,0xb3,0x16,0xbc,0x80,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3, +0xe, 0xa, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0x97,0x6c,0xaa, +0x6c,0xff,0x80,0x17,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x34,0xb, 0x38,0x30,0xbe,0x37, +0xd, 0xff,0x8, 0x5, 0x7e,0xa0,0x1, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc, +0xbf,0x38,0xe1,0x4c,0xaa,0x78,0x1a,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, +0xa, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0xb3,0x16,0xbc,0x54,0xfb,0x7a,0xb3,0x16, +0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xf7,0x7a,0xb3,0xe, 0xa, 0x7e,0x73,0xd, 0xfa,0xa, +0x27,0x7e,0x73,0xd, 0xf9,0xa, 0x37,0x2d,0x32,0xbe,0x37,0xe, 0x3, 0x28,0x14,0x7e, +0xb3,0xe, 0xa, 0x44,0x8, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc,0x44,0x8, 0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x44,0x10,0x7a,0xb3,0xe, 0xa, 0x6c,0xff,0x80, +0x49,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70, +0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30, +0x49,0x22,0x10,0x3, 0x9d,0x32,0x7a,0x35,0x21,0x12,0x6d,0xd0,0xbe,0x37,0xe, 0x1, +0x28,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xef,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x10,0x7a,0xb3,0x16,0xbc,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f, +0x38,0xaf,0x7e,0x34,0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x12,0x6d,0xe0,0x6c,0xff, +0x80,0x25,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e, +0x70,0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x30,0x59,0x32,0x10,0x3, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xd3,0xda, +0x79,0xda,0xd8,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x21,0x75,0x25,0x0, 0x75,0x26, +0x0, 0x7e,0x23,0xd, 0xf7,0x7a,0x21,0x23,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x13,0xb6, +0x7e,0x30,0x2, 0xac,0x23,0x7e,0x24,0xd, 0x18,0x7e,0x34,0x13,0xb8,0x12,0x6d,0x3c, +0xe5,0x23,0xbe,0xb0,0xa, 0x38,0x3, 0x2, 0x26,0xb9,0x75,0x24,0x0, 0x6c,0xff,0x2, +0x25,0xcd,0x7e,0x34,0x3, 0xff,0x7a,0x35,0x27,0x75,0x26,0xff,0x6c,0xee,0x80,0x7e, +0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x13,0xb8,0xbe,0xb0,0xff,0x68,0x6e,0x7c,0xbe, +0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7a,0xa1,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x2c,0xa, 0x2a,0x9, 0xb2, +0xd, 0x68,0x55,0x2c,0x68,0x46,0x9, 0x73,0x13,0xb9,0xa, 0x27,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0x15,0xa3,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x74,0x2, 0xac, +0xbe,0x9, 0x75,0x13,0xb8,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa2,0xa, +0x37,0x9d,0x32,0x12,0x6d,0xd0,0x2d,0x36,0x7a,0x35,0x29,0x7e,0x35,0x27,0xbe,0x35, +0x29,0x28,0x9, 0x7e,0x35,0x29,0x7a,0x35,0x27,0x7a,0xe1,0x26,0xb, 0xe0,0xe5,0x23, +0xbc,0xbe,0x28,0x3, 0x2, 0x25,0x0, 0xe5,0x26,0xbe,0xb0,0xff,0x68,0x3d,0x7e,0x71, +0x26,0x74,0x2, 0xac,0x7b,0x9, 0x33,0x13,0xb8,0x7e,0x50,0x18,0xac,0x53,0x9, 0xa3, +0x13,0xb9,0xa, 0xa, 0x2d,0x20,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28,0x20,0xbe, +0x24,0x0, 0x3c,0x48,0x16,0xe5,0x24,0x1a,0x2b,0x3e,0x24,0x19,0x32,0x13,0xe0,0x19, +0xa2,0x13,0xe1,0x74,0xff,0x19,0xb3,0x13,0xb8,0x5, 0x24,0xb, 0xf0,0xe5,0x11,0xbc, +0xbf,0x28,0x3, 0x2, 0x24,0xf2,0x7e,0xf1,0x24,0x2, 0x26,0x9f,0x6d,0x33,0x7a,0x35, +0x21,0x7e,0xa0,0xff,0x6c,0xee,0x2, 0x26,0x71,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c, +0x7b,0x7a,0x71,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0xb9,0xf5,0x2c,0xa, 0x37,0x9, 0xb3,0xd, 0x68,0x55,0x2c,0x68, +0x5e,0x7e,0x90,0x2, 0xac,0x9e,0x9, 0x44,0x13,0xb8,0xbe,0x40,0xff,0x68,0x50,0x7e, +0x50,0x18,0xac,0x45,0x9, 0xb4,0x13,0xb9,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27, +0x13,0xb6,0xb, 0x28,0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30, +0x7e,0x50,0x2, 0xac,0x5e,0x9, 0x62,0x13,0xb8,0x7e,0x30,0x18,0xac,0x36,0x9, 0x72, +0x13,0xb9,0xa, 0x7, 0x2d,0x10,0x3e,0x14,0x2e,0x17,0x13,0xb6,0xb, 0x18,0x40,0xbe, +0x45,0x21,0x8, 0xb, 0x7a,0x61,0x25,0x7a,0x71,0x26,0x7a,0x45,0x21,0x7c,0xae,0xb, +0xe0,0xe5,0x23,0xbc,0xbe,0x28,0x3, 0x2, 0x25,0xe9,0xbe,0xa0,0xff,0x68,0x1e,0x7e, +0x71,0x25,0x7e,0x90,0x2, 0xac,0x9f,0x19,0x74,0x13,0xe0,0xe5,0x26,0x19,0xb4,0x13, +0xe1,0x7e,0x70,0xff,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x13,0xb8,0xb, 0xf0,0xbe, +0xf0,0xa, 0x50,0x3, 0x2, 0x25,0xdc,0x7e,0x24,0x13,0xe0,0x7e,0x34,0x13,0xb8,0x7e, +0x14,0x0, 0x28,0x12,0x6d,0x3c,0x75,0x23,0xa, 0x7e,0x34,0x15,0xa2,0x7e,0x24,0x0, +0x14,0x74,0xff,0x12,0x6d,0xe0,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0x55,0x7e,0x31,0x23, +0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x3c,0x7e, +0x31,0x23,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0x15,0xa2,0x12,0x6d, +0x3c,0x6c,0xff,0x80,0x27,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7c,0x67,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24, +0xd, 0x68,0x7e,0x29,0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xf0,0xe5,0x23,0xbc,0xbf, +0x38,0xd3,0x85,0x23,0x11,0xe5,0x23,0x7a,0xb3,0xd, 0xf7,0xda,0x3b,0x22,0x7c,0x7b, +0xbe,0x70,0x10,0x40,0x12,0xbe,0x70,0x4b,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x16,0x4f, +0x9e,0x34,0x0, 0x10,0x2, 0x29,0x69,0xa5,0xbf,0x0, 0x3, 0xe5,0xb, 0x22,0xa5,0xbf, +0x1, 0x3, 0xe5,0xd, 0x22,0xa5,0xbf,0x2, 0x5, 0x7e,0xb3,0xf, 0x28,0x22,0xbe,0x70, +0x3, 0x40,0x12,0xbe,0x70,0x5, 0x38,0xd, 0xa, 0x37,0x2e,0x34,0x10,0x2b,0x9e,0x34, +0x0, 0x3, 0x2, 0x29,0x69,0xa5,0xbf,0x6, 0x3, 0x74,0x1, 0x22,0xa5,0xbf,0x7, 0x5, +0x7e,0xb3,0x10,0x4b,0x22,0xa5,0xbf,0x8, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e, +0xb3,0xa, 0xac,0x22,0x7e,0xb3,0x11,0x16,0x22,0xa5,0xbf,0x9, 0x10,0x7e,0xb3,0x10, +0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xad,0x22,0x7e,0xb3,0x11,0x49,0x22,0xa5,0xbf,0xa, +0x5, 0x7e,0xb3,0x10,0x3b,0x22,0xa5,0xbf,0xb, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, +0x7e,0xb3,0xa, 0xae,0x22,0x7e,0xb3,0x11,0x94,0x22,0xa5,0xbf,0xc, 0x10,0x7e,0xb3, +0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xd, 0xfe,0x22,0x7e,0xb3,0x11,0x9d,0x22,0xa5,0xbf, +0x4c,0x5, 0x7e,0xb3,0xf, 0x46,0x22,0xa5,0xbf,0xfb,0x3, 0xe5,0x8, 0x22,0xa5,0xbf, +0x4e,0x5, 0x7e,0xb3,0x10,0x4a,0x22,0xbe,0x70,0x50,0x40,0x12,0xbe,0x70,0x51,0x38, +0xd, 0xa, 0x37,0x2e,0x37,0x10,0x2f,0x9e,0x34,0x0, 0x50,0x2, 0x29,0x69,0xbe,0x70, +0x52,0x40,0x12,0xbe,0x70,0x55,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x31,0x9e,0x34, +0x0, 0x52,0x2, 0x29,0x69,0xbe,0x70,0x56,0x40,0x12,0xbe,0x70,0x62,0x38,0xd, 0xa, +0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x56,0x2, 0x29,0x69,0xbe,0x70,0x63,0x40, +0x12,0xbe,0x70,0x7a,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x63, +0x2, 0x29,0x69,0xbe,0x70,0x7b,0x50,0x3, 0x2, 0x28,0xfd,0xbe,0x70,0x9f,0x28,0x3, +0x2, 0x28,0xfd,0x7e,0xb3,0x10,0x3b,0x70,0x4a,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe, +0x24,0x0, 0x18,0x58,0x22,0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e, +0x39,0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c, +0xab,0x80,0x19,0x1e,0xa0,0x80,0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, +0x93,0x7e,0x39,0x70,0xa, 0x57,0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3, +0xf, 0xdc,0x22,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x22,0xa, +0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba,0x30,0xe0, +0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e,0xa0,0x80, +0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70,0xa, 0x57, +0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0x63,0x22,0xbe,0x70,0xa0, +0x40,0x11,0xbe,0x70,0xac,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6c,0x9e,0x34,0x0, +0xa0,0x80,0x56,0xbe,0x70,0xad,0x40,0x11,0xbe,0x70,0xb9,0x38,0xc, 0xa, 0x37,0x2e, +0x37,0x10,0x6e,0x9e,0x34,0x0, 0xad,0x80,0x40,0xbe,0x70,0xba,0x40,0x11,0xbe,0x70, +0xd1,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x70,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe, +0x70,0xd2,0x40,0x11,0xbe,0x70,0xd5,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x72,0x9e, +0x34,0x0, 0xd2,0x80,0x14,0xbe,0x70,0xd6,0x40,0x13,0xbe,0x70,0xed,0x38,0xe, 0xa, +0x37,0x2e,0x37,0x10,0x74,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xa5,0xbf,0xf8, +0x5, 0x7e,0xb3,0x11,0xe8,0x22,0xa5,0xbf,0xfe,0x3, 0xe5,0xc, 0x22,0x74,0xff,0x22, +0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20,0x0, 0x41,0x0, 0x42,0x0, 0x22, +0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40,0x0, 0xa3,0x0, 0xa5,0x0, 0x44, +0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60,0x0, 0xe5,0x0, 0xe8,0x0, 0x66, +0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80,0x1, 0x47,0x1, 0x4b,0x0, 0x88, +0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0,0x1, 0x89,0x1, 0xad,0x0, 0xaa, +0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xaa, +0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0,0x1, 0x69,0x1, 0x6c,0x0, 0x88, +0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80,0x1, 0x27,0x1, 0x9, 0x0, 0x66, +0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60,0x0, 0xc5,0x0, 0xc6,0x0, 0x44, +0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40,0x0, 0x83,0x0, 0x64,0x0, 0x22, +0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20,0x0, 0x21,0x0, 0x21,0x0, 0x0, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0xca,0x3b,0x7e,0x34,0x13,0xff,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6d,0xe0,0x7e,0xe0, +0x1, 0x7e,0x73,0x10,0x4d,0x7a,0x73,0x13,0xb6,0xe4,0x7a,0xb3,0x10,0x4d,0x6c,0xdd, +0x6c,0xcc,0x80,0x11,0xa, 0x3c,0x2e,0x37,0x10,0x6e,0x7e,0x39,0x70,0xbc,0x7d,0x40, +0x2, 0x7c,0xd7,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc,0x7c,0x38,0xe7,0xbe,0xd0,0x1f, +0x50,0xc, 0xa, 0x2d,0x7e,0x34,0x0, 0x1f,0x9d,0x32,0x7c,0xd7,0x80,0x2, 0x6c,0xdd, +0x7a,0xd1,0x21,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10,0x2b,0x12,0x6a, +0x64,0x2, 0x2d,0x7d,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37, +0xa, 0xaf,0x12,0x6e,0xcf,0x12,0x69,0x23,0x12,0x6e,0x78,0x60,0xfb,0xa9,0xb7,0xea, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x6c, +0xcc,0x80,0x78,0x6c,0xff,0x80,0x6a,0x4c,0xcc,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3, +0x13,0xe7,0x6d,0x33,0x74,0x2, 0xac,0xbf,0x59,0x35,0x13,0xb7,0xbe,0xf0,0x17,0x78, +0x13,0x7e,0x34,0x0, 0x1, 0x7c,0xbc,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x5e,0x34, +0x4, 0x44,0x68,0x3b,0x7e,0x50,0x30,0xac,0x5c,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x32, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, +0x14,0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xa, 0x3f,0x2e,0x34,0x13,0xe7,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xb, +0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0x8e,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc, +0x7c,0x38,0x80,0x75,0x22,0x0, 0x6c,0xcc,0x2, 0x2d,0x5b,0xa, 0x3c,0x9, 0xa3,0x13, +0xe7,0x4c,0xaa,0x78,0xf, 0x7e,0x44,0x22,0xc4,0x7e,0x70,0x2, 0xac,0x7c,0x59,0x43, +0x13,0xb7,0x80,0x25,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x12,0x13,0xb7,0xa, 0xa, 0x8d, +0x10,0x59,0x12,0x13,0xb7,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x32, +0x13,0xb7,0xbe,0x34,0x1f,0xa4,0x50,0x22,0xa, 0x1c,0x2e,0x14,0x13,0xff,0x7e,0x19, +0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1c,0x2e,0x17,0x10,0x74,0x7e,0x19,0xb0,0xbc,0xbd, +0x50,0x2f,0x4, 0x7a,0x19,0xb0,0x80,0x31,0x80,0x27,0xbe,0x34,0x25,0xe4,0x28,0x27, +0xa, 0x3c,0x2e,0x34,0x13,0xff,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xa, 0x3c,0x2e, +0x37,0x10,0x74,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14,0x7a,0x39,0xb0,0x80, +0x8, 0x5, 0x22,0x6c,0xee,0x80,0x2, 0x5, 0x22,0xb, 0xc0,0x7e,0x73,0x10,0x2c,0xbc, +0x7c,0x28,0x3, 0x2, 0x2c,0xbb,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10, +0x2b,0x12,0x6a,0x64,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x22,0x68,0xf, 0x7e,0xa1,0x21, +0x7c,0xba,0x14,0xf5,0x21,0x4c,0xaa,0x68,0x3, 0x2, 0x2c,0x4, 0x7e,0x73,0x13,0xb6, +0x7a,0x73,0x10,0x4d,0x6c,0xff,0x80,0x10,0xa, 0x3f,0x9, 0x73,0x13,0xff,0xbc,0x7d, +0x78,0x4, 0x6c,0xee,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0xe8, +0x7c,0xbe,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xb3,0x10,0x3c,0xf5,0x21,0xe4,0x7a,0xb3, +0x10,0x3c,0x7e,0xb3,0x10,0x3a,0xf5,0x22,0x74,0x3, 0x7a,0xb3,0x10,0x3a,0x7e,0x37, +0x10,0x48,0x7e,0x24,0x0, 0x25,0xe4,0x12,0x6d,0xe0,0x7e,0xe0,0x7, 0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x6c,0xdd, +0x7e,0x14,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0xa, 0x2d,0x2e, +0x27,0x10,0x48,0x7e,0x29,0x70,0x4c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25, +0x78,0xde,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab, +0x12,0x6e,0x81,0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xd0,0x6c, +0xdd,0xbe,0xd0,0x18,0x50,0x1e,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c, +0xbf,0x30,0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x16, +0x1e,0xf0,0x80,0x12,0xa, 0x3d,0x2e,0x37,0x10,0x33,0x9, 0x73,0xff,0xe8,0xa, 0x37, +0x2e,0x34,0x0, 0x18,0x7c,0xf7,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0xb, +0x38,0x30,0xbe,0x34,0x25,0x80,0x18,0x21,0x7e,0x34,0x0, 0x1, 0x7c,0xbe,0x60,0x5, +0x3e,0x34,0x14,0x78,0xfb,0x7d,0x13,0x6e,0x14,0xff,0xff,0xa, 0x2f,0x2e,0x27,0x10, +0x48,0x7e,0x29,0x70,0x5c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78,0x91, +0x1b,0xe0,0xbe,0xe0,0x0, 0x48,0x3, 0x2, 0x2d,0xdd,0x7e,0xe0,0xa, 0x74,0x2, 0x7a, +0xb3,0x10,0x3a,0x2, 0x2f,0xac,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac, +0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10, +0x2c,0xa, 0x65,0x2d,0x63,0x7c,0xcd,0x6c,0xdd,0x2, 0x2f,0x74,0x7e,0xa3,0x10,0x2c, +0xbc,0xad,0x28,0x27,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf,0x30, +0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x2, 0x1e,0xf0, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x80,0x27,0xa, 0x2a,0xa, 0x3d,0x9d, +0x32,0x2e,0x37,0x10,0x33,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34,0x0, 0x18,0x7c,0xf7, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xa4, +0x9d,0x35,0xb, 0x38,0x30,0x7a,0x35,0x23,0xbe,0x34,0x2e,0xe0,0x8, 0x18,0x4c,0xee, +0x68,0x30,0xa, 0x2f,0x2e,0x27,0x10,0x48,0x7e,0x29,0xb0,0xbe,0xb0,0xfe,0x50,0x22, +0x4, 0x7a,0x29,0xb0,0x80,0x1c,0xbe,0x34,0x17,0x70,0x58,0x14,0xa, 0x3f,0x2e,0x37, +0x10,0x48,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x7a,0x39,0xb0,0x80,0x2, +0x1b,0xc0,0xb, 0xd0,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c,0xa, 0x25, +0x2d,0x23,0xa, 0x3d,0xbd,0x32,0x58,0x3, 0x2, 0x2e,0xdc,0x4c,0xcc,0x68,0x28,0x7e, +0x34,0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81, +0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xd0,0x7c,0xae,0x1b,0xe0, +0x4c,0xaa,0x68,0x3, 0x2, 0x2e,0xb6,0xe5,0x21,0x7a,0xb3,0x10,0x3c,0xe5,0x22,0x7a, +0xb3,0x10,0x3a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x24,0x15,0x56,0x7e,0x34, +0x13,0xfe,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13, +0xb6,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x13,0xfc, +0x7e,0x73,0xf, 0x1c,0x7a,0x73,0x13,0xfd,0x7e,0xa3,0x13,0xfc,0xbe,0xa0,0x1, 0x38, +0x3, 0x7e,0xf0,0x1, 0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0xe4,0x80,0x10,0x7e,0xb3,0x15, +0xa1,0x4, 0x7a,0xb3,0x15,0xa1,0xbe,0xb0,0xc8,0x28,0x6, 0x74,0x14,0x7a,0xb3,0x15, +0xa1,0x7e,0xb3,0x15,0xa1,0xbe,0xb0,0x6, 0x50,0x3, 0x7e,0xf0,0x1, 0xbe,0xa0,0x1, +0x28,0x3f,0x7e,0x34,0x0, 0x21,0x7e,0x24,0x0, 0x23,0x7e,0x14,0x13,0xfe,0x12,0x65, +0xa8,0x7e,0x34,0x0, 0x25,0x7e,0x24,0x0, 0x27,0x7e,0x14,0x13,0xb6,0x12,0x65,0xa8, +0x7e,0x35,0x25,0x9e,0x35,0x21,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x80,0x18,0xf, 0x7e, +0x35,0x27,0x9e,0x35,0x23,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x80,0x8, 0x3, 0x7e,0xf0, +0x1, 0xbe,0xf0,0x0, 0x28,0x3, 0x2, 0x31,0x24,0x7e,0xf3,0x15,0x9f,0xbe,0xf3,0x15, +0x29,0x50,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73,0x13,0xfc,0x28,0x12,0x7e,0x24,0x15, +0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x2, 0x31,0x24,0x7e, +0x73,0x15,0x9e,0xbe,0x70,0x2, 0x58,0x22,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3, +0x15,0x53,0x7e,0xb3,0x15,0x9e,0x4, 0x2, 0x31,0x60,0x74,0x1, 0x7a,0xb3,0x15,0xa0, +0xe4,0x7a,0xb3,0x15,0x53,0x2, 0x31,0x60,0xbe,0xf3,0x15,0x29,0x78,0x2d,0x7e,0xa3, +0x15,0x29,0xbe,0xa3,0x13,0xfc,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a, +0xb3,0x15,0x53,0x80,0x6b,0xbe,0xa3,0x13,0xfc,0x28,0x4, 0x74,0x1, 0x80,0x1, 0xe4, +0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0x80,0x55,0x7e,0x73,0x15,0x29,0xbe, +0x73,0x13,0xfc,0x50,0x1a,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, +0x48,0x12,0x6d,0x3c,0xe4,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0x53,0x80,0x31,0x7e, +0x73,0x15,0x53,0xbe,0x70,0x2, 0x58,0x1c,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0x7e,0xb3,0x15, +0x53,0x4, 0x80,0x7, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0xe4, +0x7a,0xb3,0x15,0x9e,0x7e,0xb3,0x15,0xa0,0x14,0x68,0x9, 0x4, 0x78,0x15,0x7e,0x24, +0x13,0xb6,0x80,0x4, 0x7e,0x24,0x14,0xe3,0x7e,0x34,0x15,0x56,0x7e,0x14,0x0, 0x48, +0x12,0x6d,0x3c,0x7e,0x73,0x15,0x29,0x7a,0x73,0x15,0x9f,0x7e,0x24,0x13,0xb6,0x7e, +0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x7e,0x24,0x15,0x56,0x7e,0x34, +0xe, 0xd, 0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x7e,0x73,0x15,0x9c,0x7a,0x73,0xf, +0x1b,0x7e,0x73,0x15,0x9d,0x7a,0x73,0xf, 0x1c,0xda,0xf8,0x22,0xca,0x79,0x7d,0x73, +0x12,0x60,0xce,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27, +0x0, 0x27,0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c, +0xe, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49, +0x27,0x0, 0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34, +0x1c,0x14,0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c, +0x67,0x6c,0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38, +0x10,0x9, 0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, +0x25,0x4d,0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27, +0x7e,0x34,0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20, +0x6c,0xaa,0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e, +0x34,0x1c,0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, +0x4b,0x2d,0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe, +0xa0,0x19,0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e, +0x70,0x2, 0xac,0x7a,0x2e,0x34,0x29,0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e, +0x24,0x1c,0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x2b, +0x7e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x2b, +0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, +0xa0,0xbe,0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x5d,0xbd,0x49,0x27,0x0, 0x39,0x7e, +0x34,0x1c,0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33, +0x7e,0x34,0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, +0xb7,0x0, 0x1, 0x12,0x64,0x6a,0x49,0x37,0x0, 0x47,0x12,0x7, 0xc9,0x49,0x37,0x0, +0x49,0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x5c,0x97,0x49,0x27,0x0, 0x35, +0x7e,0x34,0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b, +0x38,0x20,0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22, +0xca,0x3b,0x6d,0x33,0x7a,0x35,0x23,0x7e,0xb3,0xf, 0x1b,0x60,0x6, 0x7e,0xb3,0xf, +0x1c,0x60,0x11,0xe5,0x22,0x60,0x5, 0x75,0x19,0x1, 0x80,0x3, 0x75,0x19,0x0, 0xe5, +0x19,0x2, 0x35,0x1f,0x7e,0xb3,0xd, 0x18,0xf5,0x21,0x7e,0x73,0xd, 0x19,0x7a,0x71, +0x22,0x6d,0x66,0x75,0x25,0x0, 0x75,0x26,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x3a,0x7e, +0x51,0x21,0x74,0x18,0xac,0x5b,0x2d,0x27,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28, +0x10,0xbe,0x14,0x0, 0x32,0x8, 0x28,0x5, 0x25,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0x8, +0x49,0x12,0xff,0xd0,0x2d,0x61,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, 0x50,0x8, 0x49, +0x22,0x0, 0x30,0x2d,0x62,0x5, 0x26,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc0,0x7d, +0x73,0x80,0x38,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0x2d,0x37,0x3e,0x34,0x2e,0x37, +0xf, 0xda,0xb, 0x38,0x20,0xbe,0x24,0x0, 0x32,0x8, 0x2c,0x5, 0x25,0xe5,0x21,0xbe, +0xb0,0x0, 0x28,0x8, 0x49,0x23,0xff,0xd0,0x2d,0x62,0x5, 0x26,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x8, 0x49,0x33,0x0, 0x30,0x2d,0x63,0x5, 0x26,0x7d,0x37,0xb, 0x34,0x7d, +0x73,0xbe,0x34,0x0, 0x18,0x48,0xbc,0xe5,0x25,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12, +0x7d,0x36,0x12,0x6d,0xd0,0xe5,0x26,0xa, 0x2b,0x12,0x47,0xf2,0xbe,0x34,0x0, 0xf, +0x8, 0x8, 0x75,0x19,0x1, 0x74,0x1, 0x2, 0x35,0x1f,0x6d,0x33,0xe5,0x21,0xbe,0xb0, +0x0, 0x28,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0xff,0xd0,0x2d,0x32,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0x0, 0x30,0x2d,0x32,0x7e,0xa0,0x8, 0x80, +0x2d,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2e,0x14,0x6d,0xc0,0x7a,0x31,0x82,0x7a, +0x21,0x83,0xe4,0x93,0x1a,0x1b,0xbd,0x13,0x8, 0x14,0x2e,0x24,0x6d,0xc1,0x7a,0x51, +0x82,0x7a,0x41,0x83,0xe4,0x93,0x1a,0x2b,0x2e,0x25,0x23,0x7a,0x25,0x23,0x7c,0x5a, +0x1b,0xa0,0xa5,0xbd,0x0, 0xcb,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0xe5,0x22,0xa, +0x2b,0x2d,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x12,0x6d,0xd0,0xbe, +0x34,0x3, 0xe8,0x8, 0xa, 0x7e,0x35,0x23,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x23,0x7e, +0x35,0x23,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x23,0xe5, +0x19,0xa, 0x3b,0xbe,0x35,0x23,0x50,0x5, 0x7e,0x55,0x23,0xf5,0x19,0xe5,0x19,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x9b,0x7d,0xa3,0xbe,0x90,0x1, 0x28,0x1e,0xa, 0x15,0x1b, +0x15,0xa, 0x39,0xbd,0x31,0x58,0x14,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b, +0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x80,0x7, 0xbe,0x90,0x1, 0x78,0x15, +0x6d,0xbb,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d, +0x53,0x7d,0xc3,0x80,0x8, 0x4c,0x99,0x78,0x38,0x6d,0xcc,0x7d,0xbc,0x74,0x2, 0xac, +0xb9,0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x7e,0x70,0x2, +0xac,0x79,0x2d,0x3a,0x49,0x33,0x0, 0x2, 0x12,0x6d,0x53,0x7d,0xe3,0x74,0x2, 0xac, +0xb9,0x7d,0xf5,0x2d,0xfa,0x49,0x3f,0x0, 0x4, 0x12,0x6d,0x53,0x7d,0xf3,0x2, 0x36, +0x2d,0x7c,0xb5,0x24,0xfe,0xbc,0xb9,0x78,0x46,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d, +0xba,0x1b,0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79, +0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x53,0x7d,0xc3,0x74,0x2, 0xac,0xb9, +0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x74,0x2, 0xac,0xb9, +0x2d,0xa5,0x49,0x3a,0x0, 0x2, 0x12,0x6d,0x53,0x7d,0xe3,0x6d,0xff,0x80,0x3e,0x7c, +0xb5,0x14,0xbc,0xb9,0x78,0x37,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6, +0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b, +0x35,0xb, 0x38,0x30,0x12,0x6d,0x53,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d,0xd5,0x2d, +0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x6d,0xff,0x7d,0xef,0xa, 0x79,0x6d, +0x66,0x7f,0x3, 0x1b,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x7f,0x41, +0x7f,0x3, 0x1b,0xd, 0x7d,0x3b,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0x7d, +0x3d,0x1a,0x26,0x1a,0x24,0xa, 0x19,0x6d,0x0, 0x12,0x48,0x24,0x2f,0x41,0xa, 0x19, +0x6d,0x0, 0xb, 0xc, 0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0xa, +0x19,0x6d,0x0, 0xb, 0xd, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x14, +0x7d,0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x5b,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1d, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x7d,0x5e,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1f, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x48,0x40, +0x2e,0x34,0x0, 0x20,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xf, 0x1b,0x7e,0x64,0xe, +0xdf,0xe5,0x51,0xb4,0x1, 0x21,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x1a,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0x13,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0xa, 0x74,0x1e,0x7a, +0xb3,0xf, 0x26,0x74,0x14,0x80,0x8, 0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a, +0xb3,0xf, 0x27,0x4c,0xff,0x78,0xd, 0x75,0x1a,0x0, 0x7e,0xb3,0xf, 0x26,0x12,0x6e, +0xa1,0x2, 0x38,0x47,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14, +0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, +0x74,0x1, 0x80,0x1, 0xe4,0xb4,0x1, 0x9, 0xe5,0x1a,0x70,0x5, 0x75,0x17,0x1e,0xf5, +0x18,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80, +0x1, 0xe4,0xf5,0x1a,0x6c,0xee,0x7e,0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xe, 0x9d,0xf5, +0x21,0xbe,0xb0,0xff,0x78,0x3, 0x2, 0x38,0x3d,0xe5,0x21,0xa, 0x2b,0x2d,0x26,0x7e, +0x29,0xb0,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x38,0x3d,0x49,0x33,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x74,0x12,0x6d,0xb0,0x7a,0x35,0x22,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0x9b,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x76, +0x12,0x6d,0xb0,0x7a,0x35,0x24,0xe5,0x17,0xa, 0x3b,0xbe,0x35,0x22,0x28,0x56,0xbe, +0x35,0x24,0x28,0x51,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x74,0x74,0x7, +0xac,0xbe,0x59,0x35,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x76, +0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0x9b,0xe5,0x21,0xa, 0x3b,0x2d,0x36,0x7e,0x39, +0xb0,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, 0x28,0x2, 0x1b,0xf0,0x4c,0xff,0x78,0x4e,0x5, +0x18,0x7e,0x73,0xf, 0x27,0xbe,0x71,0x17,0x28,0x43,0xe5,0x18,0xbe,0xb0,0x32,0x40, +0x3c,0x5, 0x17,0x80,0x35,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x59,0x35,0x13,0x74,0x49,0x34,0xe, 0x9b,0x59,0x35,0x13,0x76, +0x7e,0x73,0xf, 0x26,0xbe,0x71,0x17,0x78,0x8, 0x7e,0xb3,0xf, 0x27,0xf5,0x17,0x80, +0x9, 0xe5,0x17,0xbe,0xb0,0x1, 0x28,0x2, 0x15,0x17,0x75,0x18,0x0, 0xb, 0xe0,0xbe, +0xe0,0xa, 0x68,0x3, 0x2, 0x37,0x56,0xda,0x3b,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3, +0x10,0x2b,0xf5,0x24,0x7e,0xe3,0x10,0x2c,0x1b,0xe0,0x6c,0xdd,0x7e,0x70,0x30,0xac, +0x7d,0x2e,0x37,0xf, 0xda,0x49,0x33,0x0, 0x2e,0x74,0x2, 0xac,0xbd,0x59,0x35,0x13, +0xb6,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0x7e,0xb3,0xf, 0xd3,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x39,0xc1,0x6c,0xcc,0x2, 0x39,0xb2,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3, +0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19,0xf5,0x23,0x75,0x21,0x3, 0x7e,0x73,0xe, +0x12,0xbe,0x70,0x20,0x50,0xa, 0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x3, 0x75,0x21,0x1, +0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, 0x75,0x21,0x2, 0x74,0x8, 0x7a,0xb3,0xf, 0x53, +0xe5,0x22,0xbe,0xb0,0x0, 0x28,0x21,0xe5,0x24,0xa, 0x2b,0x1b,0x24,0xe5,0x22,0xa, +0x3b,0xbd,0x32,0x58,0x13,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x23,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x21,0x2, 0x75,0x25,0x0, 0x80,0x45, +0xe5,0x25,0xbc,0xbc,0x68,0x3d,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xd, +0x18,0x7a,0xa1,0x26,0x9, 0xb3,0xd, 0x19,0xf5,0x27,0xa, 0x2a,0xe5,0x22,0xa, 0x3b, +0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x3, 0x18,0x18,0xe5,0x27,0xa, 0x2b,0xe5, +0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x21, +0x1, 0x80,0xb, 0x5, 0x25,0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x25,0x38,0xb2,0xe5,0x51, +0xb4,0x1, 0x20,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x19,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, +0x12,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x9, 0x75,0x21,0x3, 0x74,0x1e,0x7a, +0xb3,0xf, 0x53,0xe5,0x23,0xbe,0xb0,0x17,0x50,0x1a,0x6c,0xdd,0x6d,0x33,0x7e,0x50, +0x30,0xac,0x5d,0x2e,0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, +0x78,0xec,0x80,0x3, 0x75,0x21,0x0, 0xe5,0x21,0x7c,0x7c,0x7c,0x6f,0x12,0x11,0xa0, +0x6c,0xdd,0x74,0x2, 0xac,0xbd,0x49,0x35,0x13,0xb6,0x7e,0x50,0x30,0xac,0x5d,0x2e, +0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0xb, 0xf0, +0xb, 0xc0,0x7e,0x73,0xd, 0xf7,0xbc,0x7c,0x28,0x3, 0x2, 0x38,0x89,0x7a,0xf3,0xd, +0xf7,0xda,0x3b,0x22,0xca,0x3b,0x7d,0x73,0x7e,0xb3,0xd, 0xf7,0xf5,0x4c,0x7e,0x37, +0xf, 0xda,0x7a,0x35,0x4f,0x75,0x42,0x0, 0x7e,0xc0,0x1, 0x80,0x19,0xe5,0x42,0xa, +0x3b,0x2d,0x37,0x7e,0x39,0x60,0xa, 0x2c,0x2d,0x27,0x7e,0x29,0x70,0xbc,0x76,0x40, +0x3, 0x7a,0xc1,0x42,0xb, 0xc0,0xe5,0x4c,0xbc,0xbc,0x38,0xe1,0xe5,0x42,0xa, 0x3b, +0x2d,0x37,0x7e,0x39,0xb0,0xf5,0x42,0x75,0x44,0x0, 0x7e,0xc0,0x1, 0x2, 0x3b,0xe, +0x75,0x4b,0x0, 0x6d,0x33,0x7a,0x35,0x4d,0x6c,0xdd,0x75,0x45,0x0, 0x75,0x46,0x0, +0x75,0x43,0x0, 0x2, 0x3a,0xc3,0x7e,0x71,0x43,0x74,0x2, 0xac,0x7b,0x9, 0xb3,0xd, +0x18,0xf5,0x47,0x9, 0xb3,0xd, 0x19,0xf5,0x48,0xe5,0x43,0xa, 0x3b,0x2d,0x37,0x7e, +0x39,0x70,0xbc,0x7c,0x78,0x7b,0xb, 0xd0,0xe5,0x47,0x25,0x45,0xf5,0x45,0xe5,0x48, +0x25,0x46,0xf5,0x46,0x7e,0x51,0x47,0xac,0x5d,0xe5,0x45,0xa, 0x3b,0x9d,0x32,0x12, +0x6d,0xd0,0x7c,0xb7,0xf5,0x49,0x7e,0x51,0x48,0xac,0x5d,0xe5,0x46,0xa, 0x3b,0x9d, +0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x4a,0x7e,0x51,0x4b,0xac,0x5d,0xe5,0x49,0xa, +0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2,0x7c,0xb7,0xf5,0x4b,0x7e,0x51, +0x4b,0xac,0x5d,0xe5,0x4a,0xa, 0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2, +0x7c,0xb7,0xf5,0x4b,0x7e,0x71,0x47,0x74,0x18,0xac,0x7b,0xe5,0x48,0xa, 0x2b,0x2d, +0x32,0x3e,0x34,0x2e,0x35,0x4f,0xb, 0x38,0x30,0xbe,0x35,0x4d,0x8, 0x3, 0x7a,0x35, +0x4d,0x5, 0x43,0xe5,0x4c,0xbe,0xb1,0x43,0x28,0x3, 0x2, 0x3a,0x26,0xbe,0xd0,0x0, +0x28,0x3a,0xe5,0x45,0x8c,0xbd,0xf5,0x45,0xe5,0x46,0x8c,0xbd,0xf5,0x46,0x7e,0xa1, +0x45,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x19,0xa3,0x15,0x2b,0xe5,0x46,0x19,0xb3, +0x15,0x2c,0x7e,0x25,0x4d,0x7e,0x71,0x45,0x74,0x18,0xac,0x7b,0xe5,0x46,0xa, 0x1b, +0x2d,0x31,0x3e,0x34,0x2e,0x35,0x4f,0x1b,0x38,0x20,0x5, 0x44,0xb, 0xc0,0xe5,0x42, +0xbc,0xbc,0x40,0x3, 0x2, 0x3a,0x10,0xe5,0x44,0xda,0x3b,0x22,0x74,0xd, 0x7a,0xb3, +0x10,0x2b,0x74,0x18,0x7a,0xb3,0x10,0x2c,0x74,0x4, 0x7a,0xb3,0x10,0x2d,0xe4,0x7a, +0xb3,0x10,0x2e,0x7e,0x34,0x11,0x9b,0x7a,0x37,0x10,0x2f,0x7e,0x34,0x11,0x97,0x7a, +0x37,0x10,0x31,0x7e,0x34,0xf, 0xc5,0x7a,0x37,0x10,0x33,0x7e,0x34,0xf, 0xad,0x7a, +0x37,0x10,0x35,0x74,0x15,0x7a,0xb3,0x10,0x37,0x74,0x17,0x7a,0xb3,0x10,0x38,0x74, +0x4, 0x7a,0xb3,0x10,0x3a,0xe4,0x7a,0xb3,0x10,0x3b,0x7a,0xb3,0x10,0x3c,0x7a,0xb3, +0x10,0x3d,0x74,0x2, 0x7a,0xb3,0x10,0x3e,0x74,0x45,0x7a,0xb3,0x10,0x3f,0x74,0x71, +0x7a,0xb3,0x10,0x40,0x74,0x3, 0x7a,0xb3,0x10,0x41,0x7e,0x34,0x1f,0xff,0x7a,0x37, +0x10,0x42,0x6d,0x33,0x7a,0x37,0x10,0x44,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10,0x46, +0x7e,0x34,0xf, 0xdc,0x7a,0x37,0x10,0x48,0x74,0x20,0x7a,0xb3,0x10,0x4a,0x74,0xa, +0x7a,0xb3,0x10,0x4b,0xe4,0x7a,0xb3,0x10,0x4c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10, +0x4e,0x74,0x2, 0x7a,0xb3,0x10,0x4f,0x7e,0x34,0x0, 0xf4,0x7a,0x37,0x10,0x52,0x7e, +0x34,0x3f,0xe0,0x7a,0x37,0x10,0x50,0x7e,0x34,0x29,0x28,0x7a,0x37,0x10,0x54,0x7e, +0x34,0x10,0x91,0x7a,0x37,0x10,0x62,0x7e,0x34,0x0, 0x3d,0x7a,0x37,0x10,0x64,0x7e, +0x34,0x0, 0x22,0x7a,0x37,0x10,0x66,0x7e,0x34,0x4c,0x0, 0x7a,0x37,0x10,0x56,0x7e, +0x34,0x3, 0xcf,0x7a,0x37,0x10,0x58,0x7e,0x34,0x7, 0x9a,0x7a,0x37,0x10,0x5a,0x7e, +0x34,0x5, 0x84,0x7a,0x37,0x10,0x5c,0x7e,0x34,0x0, 0x9, 0x7a,0x37,0x10,0x5e,0x7e, +0x34,0x0, 0xf, 0x7a,0x37,0x10,0x60,0x7e,0x34,0x0, 0x5d,0x7a,0x37,0x10,0x68,0xe4, +0x7a,0xb3,0x10,0x6a,0x74,0x7, 0x7a,0xb3,0x10,0x6b,0x7e,0x34,0x10,0xff,0x7a,0x37, +0x10,0x6c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x10,0x6e,0x7e,0x34,0xf, 0x2e,0x7a,0x37, +0x10,0x70,0x12,0x42,0x8d,0x7e,0x34,0x11,0xe9,0x7a,0x37,0x10,0x72,0x7e,0x34,0xf, +0x88,0x7a,0x37,0x10,0x74,0x7e,0x34,0x11,0x17,0x7a,0x37,0x10,0x76,0x2, 0x6c,0x58, +0xca,0x69,0xca,0xf8,0x7d,0xb1,0x7d,0xf2,0x7d,0xe3,0x9f,0x0, 0x7f,0x60,0x7f,0x40, +0x6d,0x66,0x7a,0x67,0x13,0xb6,0x7f,0x10,0x7d,0xa6,0x75,0x21,0x0, 0x6c,0xaa,0x80, +0x4b,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0xa1,0x2d,0xae,0xb, 0xa8,0xa0,0x7c,0xba,0x20, +0xe0,0x1e,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a, +0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x60,0x5, 0x21,0x80,0x1a, +0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a,0x8, 0x2, +0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x40,0xb, 0xa0,0x7e,0xf3,0x10,0x2c, +0xbc,0xfa,0x38,0xad,0xe5,0x21,0xa, 0x1b,0x6d,0x0, 0x7f,0x16,0x12,0x48,0x91,0x7a, +0x37,0x13,0xb6,0xe5,0x21,0xa, 0x3b,0x6d,0x22,0xa, 0x1f,0x6d,0x0, 0x9f,0x1, 0x7f, +0x14,0x12,0x48,0x91,0x6c,0xaa,0x80,0x2f,0x7c,0xba,0x7e,0x30,0x2, 0x7c,0x9a,0x20, +0xe0,0xf, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x9e,0x7, 0x13,0xb6,0x80, +0xd, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x7d,0x13,0x9d,0x1, 0x7d,0x14, +0x2d,0x1f,0x1b,0x18,0x0, 0xb, 0xa0,0x7e,0xb3,0x10,0x2c,0xbc,0xba,0x38,0xc9,0x9f, +0x66,0x7a,0x67,0x13,0xb6,0x6c,0xaa,0x80,0x29,0x7e,0x70,0x2, 0xac,0x7a,0x7d,0xa3, +0x2d,0xae,0x49,0xaa,0x0, 0x30,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x33, +0x9d,0x3b,0xbd,0x3a,0x8, 0x2, 0x7d,0xa3,0x7d,0x3a,0x1a,0x26,0x1a,0x24,0x2f,0x61, +0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xcf,0xa, 0x16,0x6d,0x0, 0x7f,0x16, +0x12,0x48,0x91,0x7a,0x37,0x13,0xb6,0x6c,0xaa,0x80,0x1d,0x7e,0x70,0x2, 0x7c,0x5a, +0xac,0x57,0x7d,0x32,0x2d,0x3e,0x49,0x43,0x0, 0x30,0x9e,0x47,0x13,0xb6,0x7d,0x32, +0x2d,0x3f,0x59,0x43,0x0, 0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xdb, +0xda,0xf8,0xda,0x69,0x22,0x7e,0x50,0x1, 0xe4,0x7a,0xb3,0xe, 0xb, 0x74,0x1, 0x7a, +0xb3,0xe, 0xc, 0x7e,0xa3,0xd, 0xf7,0x4c,0xaa,0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x16, +0xba,0xe4,0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, +0x7e,0x43,0xd, 0xfc,0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43, +0xd, 0x17,0xbe,0x40,0x0, 0x28,0x6b,0x7e,0xb3,0x16,0xb4,0x70,0x65,0x7e,0xb3,0x16, +0xb6,0x70,0x5f,0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x6d,0x33,0x6c,0x44,0x7e,0x30,0x2, +0xac,0x34,0x2e,0x17,0xf, 0xd6,0xb, 0x18,0x10,0xbd,0x13,0x58,0x2, 0x7d,0x31,0xb, +0x40,0xa5,0xbc,0x25,0xe8,0xbe,0x34,0xf8,0xf8,0x58,0x5, 0x7e,0x50,0x5, 0x80,0x1f, +0xbe,0x34,0xfb,0x50,0x58,0x5, 0x7e,0x50,0x4, 0x80,0x14,0xbe,0x34,0xfc,0xe0,0x58, +0x5, 0x7e,0x50,0x3, 0x80,0x9, 0xbe,0x34,0xfe,0xd4,0x58,0x3, 0x7e,0x50,0x2, 0xbe, +0x34,0xfc,0x18,0x58,0x3c,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d, +0x80,0x2f,0x7e,0x43,0xd, 0x16,0xa5,0xbc,0x0, 0x1d,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0xb3,0x16,0xb4,0x70,0x12,0x7e,0xb3,0x16,0xb6,0x70,0xc, 0xbe,0x50,0x3, 0x50,0x3, +0x7e,0x50,0x3, 0x74,0x1, 0x80,0x6, 0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, +0xc, 0x7e,0x43,0x16,0xba,0xbc,0x45,0x50,0x4, 0x7a,0x53,0x16,0xba,0xbe,0x50,0x2, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x1b,0x7e,0xb3,0xd, +0x16,0x70,0x15,0x7e,0xb3,0x16,0xb4,0x70,0xf, 0x7e,0xb3,0x16,0xb6,0x70,0x9, 0xe4, +0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xb3,0x16,0xb6,0xb4,0x1, 0x18,0xe4, +0x7a,0xb3,0x16,0xb6,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x7a, +0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xa3,0x16,0xba,0x74,0x2, 0xa4,0x7a,0x57, +0xe, 0x5, 0x7a,0x57,0xe, 0x7, 0x22,0xca,0x79,0x7c,0xfb,0xe5,0x55,0xbe,0xb0,0x1, +0x68,0xf9,0xe5,0x55,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x3f,0xe7,0xa9,0xd7,0xea,0x7e, +0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x12,0x0, +0x6e,0x50,0x27,0xa9,0xc7,0xea,0x7e,0xe3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x4d,0x7e, +0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x7a,0xe3,0x10,0x4d, +0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x3, 0x12,0x6a,0xd1,0x74,0x1, 0x7a,0xb3,0xf, 0xd3, +0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0xa, 0x18,0x12,0x66,0x59,0x7e, +0x37,0xf, 0xd6,0x7e,0x27,0xf, 0xd4,0x7e,0x14,0xa, 0x62,0x12,0x66,0x59,0x6c,0xaa, +0x80,0x36,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0xa, 0x92,0xbe,0x34,0x13,0x88,0x40, +0xc, 0xbe,0x34,0x75,0x30,0x28,0x1a,0xbe,0x34,0x7e,0xf4,0x50,0x14,0x7e,0xb3,0x16, +0xb7,0x4, 0x7a,0xb3,0x16,0xb7,0xb4,0xa, 0xd, 0x74,0x1, 0x7a,0xb3,0x16,0xb6,0x80, +0xf, 0xe4,0x7a,0xb3,0x16,0xb7,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xc2, +0x7e,0xa3,0x16,0xb6,0xbe,0xa0,0x1, 0x78,0x7, 0x7e,0xb3,0x16,0xb5,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x16,0xb5,0xbe,0xb0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb4, +0x4c,0xaa,0x78,0xd, 0xe4,0x7a,0xb3,0x16,0xb5,0x7a,0xb3,0x16,0xb4,0x7a,0xb3,0x16, +0xb7,0x74,0x1, 0x7a,0xb3,0xf, 0xd2,0x12,0x66,0x93,0x12,0x6b,0x7c,0x7e,0xb3,0x11, +0xc, 0xb4,0x1, 0x31,0xbe,0xf0,0x1, 0x78,0x2c,0x7e,0xb3,0xd, 0xfc,0x70,0x26,0x12, +0x46,0xe9,0x7e,0xb3,0xd, 0xf7,0x70,0x19,0x7e,0x73,0x11,0x95,0xa, 0x37,0x9, 0x73, +0xf, 0x29,0x7a,0x73,0x10,0x4a,0xe4,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0x11,0xc, 0x80, +0x6, 0x6c,0xff,0x80,0x2, 0x6c,0xff,0x12,0x65,0xe4,0x12,0x6b,0xde,0x7c,0xbf,0xda, +0x79,0x22,0xca,0x3b,0x75,0x21,0x0, 0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4, +0x12,0x6d,0xe0,0xe4,0x7a,0xb3,0xd, 0x16,0x7a,0xb3,0xd, 0x17,0x7e,0xb3,0xf, 0xd2, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x41,0x68,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, +0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12, +0x6d,0xe0,0x7e,0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4c,0x7e,0x14, +0x13,0xb6,0x6c,0x11,0x12,0x4f,0x1, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, +0x30,0x7e,0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4a,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x1, +0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x51,0x6c,0xcc,0x80,0x47,0x7c,0xbf,0xc4,0x23, +0x54,0x1f,0x7c,0x6b,0x7a,0x61,0x21,0xa, 0x2a,0x9, 0x72,0x13,0xc0,0x7e,0x50,0x2, +0xac,0x5f,0x19,0x72,0xa, 0xb1,0xa, 0x1c,0x9, 0x71,0x13,0xb6,0x19,0x72,0xa, 0xb2, +0x7c,0xbf,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x79,0xa, 0x46,0x2e,0x44,0xb, 0x79,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, +0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xb5,0xb, 0xa0,0xbc,0xda,0x38,0xab,0x7a,0xf3,0xd, +0x16,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34, +0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x7e,0x37,0xf, 0xd6,0x7e, +0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xb6,0x7e,0x10,0x1, 0x12,0x4f, +0x1, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0x10,0x2b,0x7e, +0x27,0xf, 0x4e,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x1, 0x7c,0xdb,0x6c,0xff,0x6c,0xaa, +0x80,0xe, 0x6c,0xcc,0x80,0x4, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xf8,0xb, 0xa0, +0xbc,0xda,0x38,0xee,0x7a,0xf3,0xd, 0x17,0xda,0x3b,0x22,0xca,0xf8,0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x74,0x1, 0x7a,0xb3,0x10, +0x3c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10,0xa5,0x7e,0xb3,0xf, 0x26,0x12,0x6e,0xa1, +0x12,0x63,0xde,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x42,0x84,0x6d, +0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0x0, 0x64,0x7a,0x37,0xa, 0xaf,0xe4,0x7a,0xb3, +0x0, 0xff,0x12,0x6c,0x3a,0x12,0x45,0xdf,0x12,0x6a,0xf4,0x6c,0xff,0x1a,0x2f,0x7e, +0x34,0x0, 0x18,0xad,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b, +0x35,0xb, 0x38,0x30,0x1a,0x2f,0x3e,0x24,0x59,0x32,0x13,0x9c,0xb, 0xf0,0xbe,0xf0, +0xd, 0x78,0xda,0x12,0x6b,0x3a,0x12,0x6c,0x90,0x12,0x68,0xf7,0x6c,0xff,0x1a,0x3f, +0x3e,0x34,0x49,0x23,0x13,0x9c,0x1a,0xf, 0x7e,0x14,0x0, 0x18,0xad,0x10,0x7d,0x31, +0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, +0xf0,0xbe,0xf0,0xd, 0x78,0xd8,0x12,0x69,0xca,0x12,0x48,0xe6,0x7e,0xb3,0xf, 0xd3, +0x70,0x9, 0x7e,0xb3,0xf, 0xd2,0x70,0x3, 0x2, 0x41,0x93,0x12,0x1f,0x7b,0x12,0x33, +0x70,0x7a,0xb3,0xf, 0x25,0x12,0x6d,0xff,0x12,0x6c,0xf6,0x70,0x3, 0x2, 0x41,0x93, +0x12,0x44,0xc9,0x7e,0x37,0xf, 0xda,0x12,0x8, 0x6, 0x12,0x6e,0xa7,0x12,0x4e,0x57, +0x12,0x0, 0x6e,0x50,0x3, 0x12,0x2f,0xc6,0x7e,0xb3,0x11,0x15,0xb4,0x1, 0x4, 0xe4, +0x12,0x6e,0x92,0x12,0x68,0xca,0x12,0x66,0xcc,0x12,0x19,0x6d,0x12,0x6, 0x11,0x12, +0x6e,0xc6,0x12,0x65,0x2c,0x12,0x36,0xb7,0x12,0x55,0xe4,0x12,0x1c,0x95,0x12,0x49, +0xd0,0x2, 0x41,0x93,0x12,0x0, 0x1e,0x12,0x6e,0x1b,0xda,0xf8,0x22,0xca,0x79,0x7e, +0x34,0x0, 0x60,0x12,0x69,0x78,0x7c,0xab,0x7a,0xa1,0x6a,0xbe,0xa0,0x8, 0x40,0x3, +0x2, 0x43,0xab,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0xe0,0x6, 0x80,0x3, 0x7e,0xe0,0x5, +0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x42,0xbf,0x73,0x2, +0x42,0xd7,0x2, 0x42,0xdc,0x2, 0x42,0xe1,0x2, 0x42,0xe6,0x2, 0x42,0xeb,0x2, 0x42, +0xf0,0x2, 0x42,0xf5,0x2, 0x42,0xfa,0x7e,0xf0,0x5e,0x80,0x26,0x7e,0xf0,0x5f,0x80, +0x21,0x7e,0xf0,0x61,0x80,0x1c,0x7e,0xf0,0x63,0x80,0x17,0x7e,0xf0,0x65,0x80,0x12, +0x7e,0xf0,0x67,0x80,0xd, 0x7e,0xf0,0x69,0x80,0x8, 0x7e,0xf0,0x6a,0x80,0x3, 0x7e, +0xf0,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x11,0xe9,0xa, 0xb, 0x7e,0xb3,0x10,0xff, +0xa, 0x1b,0x2d,0x1, 0x7c,0xb1,0x7c,0x1a,0x2e,0x10,0x21,0xa5,0xf7,0x7c,0x9b,0xa, +0x9, 0x5e,0x4, 0x0, 0x1, 0xbe,0x4, 0x0, 0x1, 0x78,0x1c,0x7c,0x79,0xac,0x7f,0x7e, +0x50,0x3, 0xac,0x5f,0xe, 0x24,0xe, 0x24,0x2d,0x32,0x7c,0xba,0x3e,0xb0,0x24,0x25, +0xa, 0xb, 0x1b,0x8, 0x30,0x80,0xd, 0xac,0x9f,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, +0xb, 0x1b,0x8, 0x40,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, 0xb, 0xb, 0x8, 0xf0,0x7e, +0x4, 0x0, 0xa, 0x7d,0x3f,0x8d,0x30,0x8d,0x30,0x7c,0x75,0xbe,0x70,0x0, 0x40,0x14, +0xbc,0xe7,0x28,0x10,0x7e,0xc4,0x0, 0x64,0x7d,0xdf,0x8d,0xdc,0x7d,0xd, 0x9d,0x1, +0x7c,0x61,0x80,0x17,0xbc,0xe7,0x38,0x19,0xbe,0x70,0x9, 0x38,0x14,0x7e,0xe4,0x0, +0x64,0x8d,0xfe,0x7d,0x2f,0xb, 0x24,0x9d,0x21,0x7c,0x65,0xa, 0x2a,0x19,0x62,0x11, +0xe9,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x3, 0x2, 0x43,0x4, 0xda,0x79,0x22,0xca,0x3b, +0x7c,0xeb,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x38,0x3, 0x2, 0x44,0xc0,0x7c,0xbe, +0x12,0xd, 0x46,0x7e,0xb3,0xd, 0xfc,0x60,0x1e,0x7e,0xb3,0x15,0x54,0x70,0x8, 0x7e, +0xb3,0x15,0x55,0x70,0x2, 0x80,0x10,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x28,0xc, +0xe5,0x12,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x1e,0x7e,0xf0,0x1, 0xbe, +0x73,0xf, 0x1c,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x15,0x54,0xbe, +0x73,0xf, 0x1c,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c,0xbe, +0x12,0xd, 0x46,0xe5,0x10,0x7a,0xb3,0xd, 0xf7,0x7e,0x31,0x10,0x74,0x2, 0xac,0x3b, +0x7e,0x24,0x15,0x2b,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x3c,0x75,0x12,0x64,0x75,0x13, +0x64,0x6c,0xee,0x80,0x67,0x6c,0xdd,0x80,0x59,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, +0x18,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0xa, 0x37,0x9d,0x32,0x12, +0x6d,0xd0,0x7c,0xb7,0xf5,0x21,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, 0x19,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x19,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xd0,0x7c, +0xc7,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0xa, 0xe5,0x12,0xbe,0xb1,0x21,0x28,0x3, 0x85, +0x21,0x12,0xbe,0xc0,0x0, 0x28,0x9, 0xe5,0x13,0xbc,0xbc,0x28,0x3, 0x7a,0xc1,0x13, +0xb, 0xd0,0x7e,0x73,0xd, 0xf7,0xbc,0x7d,0x38,0x9f,0xb, 0xe0,0x7e,0x73,0xd, 0xf7, +0xbc,0x7e,0x38,0x91,0xe5,0x12,0xb4,0x64,0x3, 0x75,0x12,0x0, 0xe5,0x13,0xb4,0x64, +0x3, 0x75,0x13,0x0, 0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x85,0x13,0x12,0x80,0x6, +0x75,0x12,0x64,0x75,0x13,0x64,0xda,0x3b,0x22,0x12,0x59,0x46,0x70,0x3, 0x2, 0x45, +0x50,0x75,0x6f,0x14,0x75,0x6e,0x1, 0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, +0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e, +0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19, +0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb, +0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4, +0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22, +0xe5,0x6e,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x45,0xdc,0x15,0x6f,0xe5,0x6f,0x60,0x79, +0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, +0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54, +0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c, +0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79, +0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e, +0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22,0x75,0x6e,0x0, 0xe5,0x21,0x22,0xca, +0x79,0x7e,0x74,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x20,0xe0,0x3, 0x2, 0x46,0xe6,0x54, +0xfe,0x7a,0xb3,0x10,0xfe,0x9, 0x77,0x0, 0x2, 0xbe,0x73,0xf, 0x52,0x68,0x16,0x7a, +0x73,0xf, 0x52,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x7a,0x37,0xf, 0x48,0x7e,0x79,0x70,0xbe,0x73,0xf, 0x5c,0x68,0xe, 0x7a,0x73, +0xf, 0x5c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x54,0x9, 0x77,0x0, 0x1, +0xa, 0x37,0xbe,0x37,0xf, 0x56,0x68,0x4, 0x7a,0x37,0xf, 0x56,0x7e,0x27,0xf, 0x5d, +0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x9, 0x77,0x0, 0x5, 0xa, 0x37,0xbd,0x32, +0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x5d,0x9, 0x77, +0x0, 0x8, 0xbe,0x73,0x11,0x11,0x68,0x24,0x7a,0x73,0x11,0x11,0xbe,0x70,0xf, 0x40, +0x5, 0xe4,0x19,0xb7,0x0, 0x8, 0x9, 0x77,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6d,0xf0, +0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0x11,0x10,0x9, 0x77,0x0, 0x9, +0xbe,0x73,0x11,0x13,0x68,0x8, 0x7a,0x73,0x11,0x13,0x7a,0x73,0x11,0x12,0x9, 0x77, +0x0, 0x7, 0xbe,0x73,0x11,0x14,0x68,0x4, 0x7a,0x73,0x11,0x14,0x9, 0xb7,0x0, 0xb, +0xbe,0xb1,0x51,0x68,0x5, 0xf5,0x51,0x12,0x6c,0xde,0x9, 0x77,0x0, 0x25,0xa, 0x37, +0xbe,0x37,0x11,0xd, 0x68,0x4, 0x7a,0x37,0x11,0xd, 0x9, 0x77,0x0, 0x6, 0xbe,0x73, +0x11,0xf, 0x68,0x4, 0x7a,0x73,0x11,0xf, 0x9, 0x77,0x0, 0x24,0xbe,0x73,0x11,0x15, +0x68,0x4, 0x7a,0x73,0x11,0x15,0xda,0x79,0x22,0xca,0x79,0xe4,0x6c,0xaa,0xa, 0x4a, +0x19,0xb4,0xd, 0x68,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xf3,0xe4,0x7a,0xb3,0xd, 0xf7, +0x7a,0xb3,0xd, 0xf8,0x7a,0xb3,0xd, 0xf9,0x7a,0xb3,0xd, 0xfa,0x7e,0xb3,0xf, 0xd3, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x47,0xef,0x7e,0xb3,0x10,0x2b,0xf5,0x21,0x7e,0xb3, +0x10,0x2c,0xf5,0x22,0x7e,0x37,0xf, 0x56,0x7a,0x35,0x23,0x7e,0x37,0xf, 0x58,0x7a, +0x35,0x25,0x7e,0x37,0xf, 0x5a,0x7a,0x35,0x27,0x7e,0x34,0x0, 0x14,0x7a,0x35,0x2d, +0x7e,0x37,0xf, 0xda,0x7e,0x24,0x0, 0x21,0x7e,0x14,0x0, 0x29,0x7e,0x4, 0x9, 0xc8, +0x12,0x4d,0xa8,0xe5,0x29,0x7a,0xb3,0xd, 0xf7,0xe5,0x2a,0x7a,0xb3,0xd, 0xf8,0xe5, +0x2b,0x7a,0xb3,0xd, 0xf9,0xe5,0x2c,0x7a,0xb3,0xd, 0xfa,0x6c,0xaa,0x80,0x6c,0x7e, +0x53,0xd, 0xf7,0xbc,0x5a,0x28,0x44,0x7c,0xba,0xc4,0x23,0x54,0x1f,0x7c,0x7b,0x7c, +0xba,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0x69, +0x7e,0x30,0x2, 0xac,0x3a,0x49,0x71,0x9, 0xc8,0x7d,0x7, 0xa, 0x0, 0x7c,0x41,0x19, +0x41,0xd, 0x18,0x7d,0x7, 0x7c,0x41,0x19,0x41,0xd, 0x19,0xa, 0x47,0x2e,0x44,0xd, +0x68,0x7e,0x49,0xb0,0x4c,0xb6,0x7a,0x49,0xb0,0x80,0x1e,0xa, 0x15,0xa, 0x2a,0x9d, +0x21,0x3e,0x24,0x49,0x72,0x9, 0xf0,0x7d,0x17,0xa, 0x12,0x7c,0xb3,0x19,0xb2,0xd, +0x40,0x7d,0x17,0x7c,0xb3,0x19,0xb2,0xd, 0x41,0xb, 0xa0,0x7e,0xb3,0xd, 0xf8,0xa, +0x2b,0x7e,0xb3,0xd, 0xf7,0xa, 0x1b,0x2d,0x12,0xa, 0x2a,0xbd,0x21,0x48,0x80,0xda, +0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, +0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32, +0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff, +0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12, +0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, +0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22, +0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf, +0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34, +0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40, +0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, +0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, +0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x48,0x40, +0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x48,0x40,0x30,0xd5,0x6, 0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, +0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e, +0x39,0x40,0x7a,0x19,0x40,0x22,0xca,0x79,0x6c,0xee,0x12,0x65,0x6b,0x7d,0x43,0x6c, +0xaa,0x6c,0x77,0x7e,0x30,0x6, 0xac,0x37,0x2e,0x14,0x6c,0x1c,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70,0x5, +0x40,0xe1,0xbe,0xa0,0x5, 0x78,0x3, 0x2, 0x49,0xb7,0x7e,0x63,0xd, 0xf7,0xbe,0x60, +0x0, 0x38,0x3, 0x2, 0x49,0xb7,0x6c,0x77,0x2, 0x49,0xac,0x6c,0xff,0x6c,0x66,0x80, +0x41,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27,0xf, +0xda,0xb, 0x28,0x20,0x7e,0x30,0x6, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6c,0x1e,0x7e, +0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x2, 0x18,0x14,0xb, 0xf0,0x2e,0x14,0x6c,0x20, +0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x28,0xe, 0x80,0x2, 0x6c,0xff, +0xb, 0x60,0x7e,0xb3,0x10,0x2b,0xbc,0xb6,0x38,0xb7,0x7e,0x50,0x6, 0xac,0x5a,0x7d, +0x12,0x2e,0x14,0x6c,0x20,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x38, +0x17,0xb, 0xe0,0x2e,0x24,0x6c,0x21,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0xbc, +0xbe,0x38,0x7, 0x75,0x14,0x40,0x80,0xf, 0x6c,0xee,0xb, 0x70,0x7e,0xb3,0x10,0x2c, +0xbc,0xb7,0x28,0x3, 0x2, 0x49,0x2b,0xe5,0x15,0x25,0x14,0xf5,0x14,0xbe,0xb0,0x0, +0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0xda,0x79,0x22, +0xca,0x3b,0x7e,0x73,0xd, 0xfb,0x7a,0x73,0xd, 0xfc,0x7e,0xa3,0xf, 0x1b,0x7a,0xa3, +0xf, 0x1c,0xe4,0x7a,0xb3,0xf, 0x1f,0x7e,0x37,0x11,0xd, 0x4d,0x33,0x78,0x3f,0xbe, +0xa0,0x0, 0x28,0x8, 0xe4,0x7a,0xb3,0x16,0xae,0x2, 0x4a,0x97,0x7e,0xb3,0x11,0xf, +0x20,0xe0,0x3, 0x2, 0x4a,0x97,0x7e,0xb3,0x11,0x14,0xbe,0xb3,0x16,0xae,0x28,0x3, +0x2, 0x4a,0x97,0xe4,0x7a,0xb3,0x16,0xae,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x11,0xd, +0x74,0x1, 0x7a,0xb3,0x10,0xa3,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x80,0x69,0xbe,0x34, +0x0, 0x1, 0x78,0x22,0xbe,0xa0,0x0, 0x28,0x5e,0x6d,0x22,0x7a,0x27,0x11,0xd, 0xe4, +0x7a,0xb3,0x10,0xa3,0x7a,0xb3,0x16,0xae,0x74,0x23,0x7a,0xb3,0x16,0xb1,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x80,0x41,0xbe,0x34,0x0, 0x3, 0x78,0x3b,0x6d,0x66,0x7a,0x67, +0x10,0x1, 0x7e,0x74,0xd, 0xac,0x7a,0x77,0xa, 0xaf,0x12,0x6e,0xcc,0x12,0x60,0x22, +0x12,0x58,0x63,0x6d,0x33,0x7a,0x37,0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x7a,0x67,0x10,0x1, 0x7a,0x77,0xa, 0xaf,0x75,0x9a,0x7f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x7e,0xb3,0x16,0xb0,0x70,0x6, 0x12,0x5b,0x69, +0x12,0x64,0x24,0xda,0x3b,0x22,0x7d,0x53,0x9f,0x11,0xbe,0x54,0x0, 0x0, 0x40,0x2d, +0xbe,0x54,0x0, 0x3f,0x38,0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x25,0x7e,0x34,0x1, 0x92, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x32,0x48,0x4, +0x7e,0x18,0x0, 0x32,0x7e,0x8, 0x0, 0x32,0x9f,0x1, 0x7f,0x10,0x22,0xbe,0x54,0x5, +0x80,0x40,0x29,0xbe,0x54,0x5, 0xaa,0x38,0x23,0x7d,0x25,0x9e,0x24,0x5, 0x7f,0x7e, +0x34,0x1, 0x92,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, +0x32,0x48,0x4, 0x7e,0x18,0x0, 0x31,0x2e,0x18,0x4, 0xce,0x22,0xbe,0x54,0x5, 0xaa, +0x28,0x19,0x7d,0x25,0x9e,0x24,0x5, 0x9f,0x7e,0x34,0x1, 0x92,0xad,0x32,0x6d,0x22, +0x7c,0x76,0x7c,0x65,0x1a,0x24,0x2e,0x18,0x5, 0x0, 0x22,0xbe,0x54,0x2, 0xdf,0x38, +0x8, 0x7e,0x34,0x2, 0xdf,0x9d,0x35,0x80,0x6, 0x7d,0x35,0x9e,0x34,0x2, 0xe0,0x6d, +0x22,0x7e,0x14,0x0, 0xe1,0x12,0x48,0x35,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x54, +0x2, 0xdf,0x38,0xa, 0x7e,0x8, 0x2, 0x7f,0x9f,0x1, 0x7f,0x10,0x80,0x4, 0x2e,0x18, +0x2, 0x80,0xbe,0x18,0x0, 0x32,0x58,0x5, 0x7e,0x18,0x0, 0x32,0x22,0xbe,0x18,0x4, +0xce,0x8, 0x4, 0x7e,0x18,0x4, 0xce,0x22,0x7e,0x34,0x10,0x7e,0x7e,0x24,0x0, 0x81, +0xe4,0x12,0x6d,0xe0,0x74,0xc, 0x7a,0xb3,0x10,0x80,0x7a,0xb3,0x10,0x81,0x74,0x7, +0x7a,0xb3,0x10,0x82,0x74,0xf, 0x7a,0xb3,0x10,0x7e,0x74,0x3c,0x7a,0xb3,0x10,0x7f, +0x74,0xa0,0x7a,0xb3,0x10,0x83,0x74,0x1e,0x7a,0xb3,0x10,0x85,0x74,0x9, 0x7a,0xb3, +0x10,0x86,0x74,0x1e,0x7a,0xb3,0x10,0x87,0xe4,0x7a,0xb3,0x10,0x88,0x7a,0xb3,0x10, +0x89,0xf5,0x52,0xf5,0x51,0x7a,0xb3,0x10,0xa3,0x74,0x1, 0x7a,0xb3,0x10,0x84,0x7a, +0xb3,0x10,0xa2,0x7a,0xb3,0x10,0xa5,0x74,0x16,0x7a,0xb3,0x10,0xa4,0x74,0xf4,0x7a, +0xb3,0x10,0xa6,0x74,0xb, 0x7a,0xb3,0x10,0xad,0x12,0x6e,0xb9,0xa, 0x36,0x7a,0x73, +0x10,0xa7,0x12,0x6e,0xb9,0x7a,0x73,0x10,0xa8,0x12,0x6e,0xbe,0xa, 0x36,0x7a,0x73, +0x10,0x9f,0x12,0x6e,0xbe,0x7a,0x73,0x10,0xa0,0xe4,0x7a,0xb3,0x10,0xae,0x74,0x1f, +0x7a,0xb3,0x10,0xcf,0xe4,0x7a,0xb3,0x10,0xb0,0x12,0x6e,0xd, 0x7a,0xb3,0x10,0xaf, +0x12,0x6d,0xe, 0x7a,0xb3,0x10,0xa1,0x7e,0x34,0x10,0x8e,0x7e,0x24,0x0, 0x8, 0x74, +0xff,0x12,0x6d,0xe0,0x74,0x16,0x7a,0xb3,0x10,0x8e,0x74,0x1, 0x7a,0xb3,0x10,0x8f, +0x22,0xca,0x3b,0x6d,0x11,0x7d,0x1, 0x7d,0x21,0x7e,0xa0,0x2, 0x7e,0x70,0x2, 0x6c, +0x66,0x80,0x39,0x6c,0x99,0x80,0x2b,0x7e,0xd0,0x30,0xac,0xd6,0x7e,0xf0,0x2, 0xac, +0xf9,0x7d,0xf7,0x2d,0xf6,0x2e,0xf7,0xf, 0xda,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, 0x14, +0x8, 0x4, 0xb, 0x4, 0x80,0x8, 0xbe,0xf4,0xff,0xec,0x58,0x2, 0xb, 0x24,0xb, 0x14, +0x2c,0x97,0x7e,0xb3,0x10,0x2c,0xbc,0xb9,0x38,0xcd,0x2c,0x6a,0x7e,0xb3,0x10,0x2b, +0xbc,0xb6,0x38,0xbf,0x7e,0x54,0x0, 0x3, 0xad,0x51,0x7d,0x35,0x1e,0x34,0x1e,0x34, +0xbd,0x30,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb8,0x7e,0xb3,0x16,0xb9,0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb9,0x80,0x39,0xe4,0x7a,0xb3,0x16,0xb9,0x75,0x72, +0x1, 0x80,0x2f,0xbd,0x32,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb9,0x7e,0xb3,0x16,0xb8, +0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb8,0x80,0x16,0xe4,0x7a,0xb3,0x16, +0xb8,0x75,0x72,0x2, 0x80,0xc, 0xe4,0x7a,0xb3,0x16,0xb8,0x7a,0xb3,0x16,0xb9,0x75, +0x72,0x0, 0xe5,0x72,0xda,0x3b,0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x0, 0x40,0x2d,0xbe, +0xf4,0x0, 0x3f,0x38,0x27,0x7e,0x44,0x0, 0x3f,0x9d,0x4f,0x7e,0x54,0x1, 0x8e,0xad, +0x54,0x6d,0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x32,0x40,0x4, 0x7e,0x28,0x0, +0x32,0x7e,0x18,0x0, 0x32,0x9f,0x12,0x7f,0x21,0x2, 0x4d,0xa5,0xbe,0xf4,0x3, 0x0, +0x40,0x22,0x7d,0x4f,0x9e,0x44,0x3, 0x0, 0x7e,0x54,0x1, 0xc0,0xad,0x54,0x6d,0x44, +0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x32,0x40,0x4, 0x7e,0x28,0x0, 0x31,0x2e,0x28, +0x2, 0x9e,0x80,0x51,0xbe,0xf4,0x1, 0x9f,0x38,0x8, 0x7e,0x54,0x1, 0x9f,0x9d,0x5f, +0x80,0x6, 0x7d,0x5f,0x9e,0x54,0x1, 0xa0,0x6d,0x44,0x7e,0x14,0x0, 0xe2,0x7f,0x12, +0x12,0x48,0x35,0x7f,0x21,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0xbe,0xf4,0x1, 0x9f,0x38, +0xa, 0x7e,0x18,0x1, 0x67,0x9f,0x12,0x7f,0x21,0x80,0x4, 0x2e,0x28,0x1, 0x68,0xbe, +0x28,0x0, 0x32,0x50,0x6, 0x7e,0x28,0x0, 0x32,0x80,0xa, 0xbe,0x28,0x2, 0x9e,0x28, +0x4, 0x7e,0x28,0x2, 0x9e,0x7d,0x35,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, +0x56,0xf5,0xba,0x7e,0x55,0x2d,0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50, +0xf5,0xc1,0x9, 0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54, +0xe0,0x4c,0xba,0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c, +0xb7,0xf5,0xc6,0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, +0x4, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75, +0xc5,0x4, 0x1a,0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, +0x6, 0x7c,0xb1,0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, +0x4e,0x29,0x43,0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, +0x75,0xc5,0xa, 0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1, +0x0, 0x3, 0x75,0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19, +0xb1,0x0, 0x1, 0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0xf, 0xd2,0x60, +0x6, 0x7e,0xb3,0xf, 0xd3,0x70,0x18,0x7e,0x34,0xd, 0x68,0x7e,0x24,0x0, 0x3, 0xe4, +0x12,0x6d,0xe0,0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4,0x12,0x6d,0xe0,0x6c, +0xee,0x80,0x6b,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0x7a,0x71,0x21,0x9, 0x65, +0xd, 0x19,0x7a,0x61,0x22,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xdb,0x7c,0xbe,0x54, +0x7, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xc5,0x7e,0x50, +0x30,0xac,0x57,0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x30,0xbe,0x37,0xf, 0x54,0x48,0x25,0xa, 0x3d,0x9, 0xb3,0xd, 0x68,0x5c,0xbc,0x68, +0x1b,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0xd, 0x6b,0x7e,0x70,0x7, 0xac,0x7f,0x2e, +0x34,0xe, 0xd, 0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x3c,0xb, 0xf0,0xb, 0xe0,0x7e,0x73, +0xd, 0xf7,0xbc,0x7e,0x38,0x8d,0x7a,0x73,0xd, 0xfb,0x7a,0xf3,0xf, 0x1b,0xda,0x3b, +0x22,0xca,0xf8,0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x2, 0x4f,0x9c, +0x7e,0x90,0x2, 0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, +0x6e,0x44,0xff,0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0xa, 0x50,0x6b,0x4c, +0xff,0x78,0x14,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, +0xe4,0xbd,0xe4,0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd, +0x1b,0xf5,0xb, 0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0xf4,0x18,0x37,0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd, +0x1b,0xc5,0xb, 0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff, +0xff,0xb, 0xf4,0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18, +0x9, 0xa, 0xda,0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x3, +0x2, 0x4f,0x10,0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x33,0x7d,0x73,0x75,0x25, +0x0, 0x7e,0x64,0x5, 0xe0,0x75,0x23,0x0, 0x80,0x3c,0x75,0x24,0x0, 0x7e,0x51,0x23, +0x74,0x18,0xac,0x5b,0x3e,0x24,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2d, +0x36,0x7a,0x35,0x21,0x49,0x23,0x0, 0x30,0xb, 0x38,0x30,0x9d,0x32,0x12,0x6d,0xd0, +0xe5,0x24,0xb4,0x17,0x2, 0x1e,0x34,0xbd,0x37,0x28,0x2, 0x7d,0x73,0x5, 0x24,0xe5, +0x24,0xb4,0x18,0xc9,0x5, 0x23,0xe5,0x25,0xa, 0x2b,0x7e,0x33,0x10,0x7c,0xa, 0x13, +0x9d,0x12,0x1b,0x14,0xe5,0x23,0xa, 0x2b,0xbd,0x21,0x48,0xae,0xbe,0x74,0x0, 0x41, +0x28,0x11,0x7e,0x34,0x0, 0x73,0x7e,0xa3,0x16,0x54,0x74,0x12,0xa4,0x59,0x35,0x16, +0x65,0x80,0x26,0x7e,0x43,0x16,0x54,0x7e,0x50,0x12,0xac,0x45,0x49,0x32,0x16,0x65, +0xbd,0x37,0x50,0x6, 0x59,0x72,0x16,0x65,0x80,0xf, 0xbe,0x34,0x0, 0x0, 0x28,0x9, +0x2e,0x24,0x16,0x65,0x1b,0x34,0x1b,0x28,0x30,0xda,0x3b,0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x0, 0x46,0x7e,0x35,0x1e,0xb, 0x34,0x7a,0x35,0x1e,0x7e,0xb3,0x0, 0xff,0x4, +0x7a,0xb3,0x0, 0xff,0x7e,0x35,0x1e,0xbe,0x34,0x3, 0xe8,0x40,0x13,0x6d,0x33,0x7a, +0x35,0x1e,0x7e,0xb3,0x16,0xae,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x16,0xae, +0x7e,0x73,0x16,0xb2,0xbe,0x73,0x16,0xb1,0x28,0xb, 0x7e,0xb3,0x16,0xb1,0x4, 0x7a, +0xb3,0x16,0xb1,0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb0,0x7e,0xb3,0x16,0xb3,0x60, +0x5, 0x14,0x7a,0xb3,0x16,0xb3,0x7e,0x37,0x10,0x1, 0xb, 0x34,0x7a,0x37,0x10,0x1, +0x7e,0x37,0xa, 0xaf,0xbe,0x37,0x10,0x1, 0x28,0x3, 0x12,0x6e,0xcf,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x75,0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x16,0xbc,0x75,0x6a,0x0, 0x75,0x8, 0x1, 0x75,0x9, 0x0, 0x75,0xa, +0x0, 0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0xc2,0x0, 0x75, +0x11,0x0, 0x75,0x12,0x64,0x75,0x13,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x16, +0x0, 0x75,0x19,0x1, 0x75,0x1e,0x0, 0x75,0x1f,0x0, 0x75,0x72,0x0, 0x75,0x6e,0x0, +0x75,0x73,0x0, 0x75,0x74,0x1, 0x75,0x70,0x18,0x75,0x71,0x0, 0x75,0x75,0x0, 0x75, +0x76,0x0, 0x75,0x6b,0x0, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0x4, 0x0, 0xff,0x7e, +0x14,0x6e,0xd6,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, +0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44, +0x78,0xf2,0x80,0xdf,0x2, 0x5b,0xce,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, +0x78,0xc, 0x7e,0x34,0x10,0x2b,0x12,0x6b,0x17,0xa9,0xc7,0xea,0x80,0x27,0xbe,0xd0, +0x5, 0x78,0x1f,0xa9,0xd7,0xea,0x7e,0xe3,0x10,0x4a,0x7e,0xf3,0x10,0x4d,0xe4,0x7a, +0xb3,0x10,0x4d,0x12,0x66,0x1f,0x7a,0xb3,0x10,0x4a,0x74,0x1, 0x7a,0xb3,0x10,0x78, +0x80,0x3, 0xe4,0x80,0x4e,0x7e,0xb3,0x11,0x96,0x7e,0x34,0x10,0x2b,0xb4,0x1, 0xa, +0x12,0x31,0xbc,0xe4,0x7a,0xb3,0x11,0x96,0x80,0xa, 0x12,0x60,0xce,0x7e,0x34,0x10, +0x2b,0x12,0x5d,0xbd,0x7e,0x34,0x10,0x2b,0x12,0x6a,0x64,0x7e,0xb3,0x10,0xa5,0xb4, +0x3, 0xa, 0x7e,0x73,0x11,0xe8,0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x69,0x23,0xbe, +0xd0,0x5, 0x78,0xd, 0x7a,0xe3,0x10,0x4a,0x7a,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10, +0x78,0x74,0x1, 0xda,0x79,0xda,0xd8,0x22,0x7e,0x34,0xe, 0xd, 0x7e,0x24,0x0, 0x46, +0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0xe, 0x53,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12, +0x6d,0xe0,0x7e,0x34,0xe, 0x99,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0x6c, +0xaa,0x74,0x3, 0xa, 0x4a,0x19,0xb4,0xe, 0xdf,0x19,0xb4,0xe, 0xe9,0x7e,0x44,0xff, +0xff,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0xe, 0xf3,0x7e,0x70,0x2, 0xac,0x7a,0x59, +0x43,0xf, 0x7, 0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd7,0xe4,0x7a,0xb3,0xf, 0x1b,0x7a, +0xb3,0xf, 0x1c,0x7a,0xb3,0xf, 0x1d,0x7a,0xb3,0xf, 0x1f,0x7a,0xb3,0xf, 0x20,0x7a, +0xb3,0xf, 0x21,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7a,0xb3,0xf, 0x24,0x7a, +0xb3,0xf, 0x25,0x12,0x6a,0xad,0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a,0xb3, +0xf, 0x27,0xe4,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7c,0xab,0x6c,0x33,0x7c,0x27, +0x80,0x73,0x7e,0x90,0x7, 0xac,0x93,0x9, 0xf4,0xe, 0x57,0x7e,0x10,0x7, 0xac,0x12, +0x9, 0xb0,0xe, 0x11,0xbc,0xfb,0x78,0x5b,0xbe,0xf0,0xff,0x68,0x56,0x7e,0x10,0x7, +0xac,0x1a,0x7d,0xf0,0x2d,0xf2,0x19,0xff,0x0, 0x4, 0x49,0x44,0xe, 0x53,0x2d,0x2, +0x1b,0x8, 0x40,0x7e,0x10,0x7, 0xac,0x13,0x49,0x0, 0xe, 0x55,0x7e,0x90,0x7, 0xac, +0x9a,0x2d,0x42,0x59,0x4, 0x0, 0x2, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x12, +0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x5, 0x7e,0x10,0x7, 0xac,0x12, +0x9, 0x10,0xe, 0x13,0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x6, 0xb, +0xa0,0x80,0x6, 0xb, 0x20,0xbc,0x62,0x38,0x89,0xb, 0x30,0xbe,0x30,0xa, 0x50,0x3, +0x2, 0x52,0x9e,0x7c,0xba,0xda,0xf8,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x3b,0xbe, +0xa0,0x3e,0x38,0x36,0xbe,0xa0,0x4, 0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x0, 0x8b,0xbe, +0xa0,0x1, 0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x0, +0x6, 0x7e,0x34,0x15,0xca,0x80,0x4, 0x7e,0x34,0x16,0xc, 0x7a,0x37,0x16,0x51,0xa, +0x3a,0x2e,0x37,0x16,0x51,0x9, 0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0xb, +0x22,0xbe,0xa0,0x80,0x40,0xc, 0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0xf, +0xfe,0x22,0xbe,0xa0,0xfc,0x78,0x5, 0x7e,0xb3,0x10,0xa5,0x22,0xbe,0xa0,0xfd,0x78, +0x8, 0x7e,0x37,0x10,0x46,0x7e,0x39,0xb0,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3, +0x10,0x4a,0x22,0xbe,0xa0,0xf9,0x78,0x5, 0x7e,0xb3,0x16,0xbc,0x22,0xbe,0xa0,0xfa, +0x78,0x3, 0xe5,0x6a,0x22,0xe4,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10, +0x4d,0xf5,0x24,0xe4,0x7a,0xb3,0x10,0x4d,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e, +0x34,0x10,0x2b,0x12,0x6a,0x64,0x75,0x21,0x0, 0x12,0x69,0x23,0x12,0x6e,0x78,0x60, +0xfb,0xa9,0xb7,0xea,0x7d,0x36,0x7d,0x27,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x75, +0x22,0x0, 0x80,0x36,0x75,0x23,0x0, 0x80,0x26,0x7e,0x51,0x22,0x74,0x18,0xac,0x5b, +0xe5,0x23,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, +0x14,0xe, 0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x23,0x7e, +0x73,0x10,0x2c,0xbe,0x71,0x23,0x38,0xd1,0x5, 0x22,0x7e,0x73,0x10,0x2b,0xbe,0x71, +0x22,0x38,0xc1,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x4, 0x40,0x9d,0xe5,0x24,0x7a,0xb3, +0x10,0x4d,0xda,0x3b,0x22,0xca,0xf8,0x30,0x90,0x58,0xc2,0x90,0x5, 0xa, 0xe5,0xa, +0xb4,0x1, 0x6, 0xe5,0x91,0xf5,0xf, 0x80,0x29,0xe5,0xb, 0xc4,0x7c,0xfb,0x5e,0xf0, +0x7, 0x78,0xe, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x56,0x6d,0x80, +0x11,0xbe,0xf0,0x4, 0x78,0xc, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12, +0x15,0xe2,0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, +0x12,0x53,0x28,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e, +0xf5,0x91,0x30,0x91,0x28,0xc2,0x91,0x5, 0x9, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50, +0x7, 0xa5,0xbd,0x0, 0xb, 0xe5,0x9, 0x25,0xf, 0x12,0x53,0x28,0xf5,0x91,0x80,0xd, +0xa5,0xbd,0x4, 0x9, 0xe5,0x9, 0x25,0xf, 0x12,0x27,0x2e,0xf5,0x91,0xda,0xf8,0x22, +0x6c,0x33,0xbe,0x30,0x18,0x50,0x1e,0xa, 0x3, 0x2e,0x7, 0x10,0x35,0x7e,0x9, 0xa0, +0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80, +0x16,0x1e,0xa0,0x80,0x12,0xa, 0x3, 0x2e,0x7, 0x10,0x33,0x9, 0x20,0xff,0xe8,0xa, +0x52,0x2e,0x54,0x0, 0x18,0x7c,0xab,0x7e,0x23,0x10,0x3a,0xbe,0x20,0x3, 0x28,0xe, +0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x21,0xa, 0x42, +0x2e,0x44,0x0, 0xc, 0x7e,0x4, 0x0, 0xf, 0x9d,0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac, +0x1a,0x2d,0x2, 0xb, 0x8, 0x0, 0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e, +0x44,0x7f,0xff,0x9d,0x40,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x3, 0x1b,0x8, 0x40,0xb, +0x30,0xbe,0x30,0x25,0x50,0x3, 0x2, 0x54,0xd2,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac, +0x5a,0x7d,0x32,0x2e,0x37,0xf, 0xd6,0xb, 0x38,0x10,0xbe,0x17,0xe, 0x7, 0x8, 0x12, +0x7d,0x2, 0x2e,0x7, 0xf, 0xd4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30, +0x80,0x18,0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x27,0xf, 0xd4, +0xb, 0x28,0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78, +0xbb,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xe, 0x7, +0x8, 0x12,0x7d,0x2, 0x2e,0x4, 0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b, +0x8, 0x30,0x80,0x18,0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x24, +0x8, 0xe4,0xb, 0x28,0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0, +0x25,0x40,0xc0,0x22,0xca,0x69,0xca,0xf8,0x6c,0x11,0x7e,0xd0,0x7, 0xac,0xd1,0x9, +0x6, 0xe, 0x9d,0x5e,0x0, 0xf, 0x49,0xf6,0xe, 0x9b,0xbe,0xf4,0x5, 0xa, 0x40,0x3c, +0x49,0x46,0xe, 0x99,0x7d,0x34,0x12,0x6b,0x9d,0x7c,0xfb,0xbe,0xf0,0x3, 0x40,0xe, +0x7e,0x14,0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x3e,0x74,0x2, +0xac,0xbf,0x49,0x45,0x0, 0xf8,0x74,0x7, 0xac,0xb1,0x59,0x45,0xe, 0x99,0x7e,0x14, +0x7, 0xd0,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x25,0xbe,0xf4,0x5, 0x0, +0x40,0x1f,0x7e,0x14,0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x74,0x7, +0xac,0xb1,0x49,0x15,0xe, 0x9b,0xbe,0x14,0x5, 0xa, 0x40,0x5, 0x7c,0xb0,0x12,0x68, +0x3d,0xb, 0x10,0xbe,0x10,0xa, 0x40,0x82,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x70, +0x41,0x7e,0x74,0x0, 0xb, 0x7a,0x79,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0xa5,0xbf,0x4, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70, +0x3, 0x80,0x13,0x74,0x27,0x7e,0x70,0x3, 0x80,0x4b,0x7e,0xb3,0x10,0xa5,0xb4,0x3, +0xa, 0x74,0x1, 0x7e,0x70,0x1, 0x12,0x0, 0x5e,0x80,0x45,0x74,0x27,0x7e,0x70,0x1, +0x80,0x33,0xbe,0xb0,0xfc,0x68,0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa,0x5, 0x7e,0x60, +0x5, 0x80,0x10,0xa5,0xbf,0x55,0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5,0xbf,0x66,0x20, +0x7e,0x60,0x7, 0x74,0x27,0x7c,0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0, +0xdf,0x38,0x7, 0x24,0x80,0x12,0x6d,0x9f,0x80,0x6, 0xb4,0xfe,0x3, 0x7a,0x71,0xc, +0xda,0x79,0x22,0x6c,0x77,0x6c,0xaa,0x80,0x3c,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24, +0x2e,0x27,0xf, 0xda,0x2e,0x24,0x0, 0x30,0x7d,0x12,0x1b,0x16,0xb, 0x18,0x40,0xbe, +0x44,0x0, 0x3c,0x8, 0x1e,0x7e,0x14,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0x14,0x14, +0x78,0xfb,0x5e,0x14,0x4, 0x44,0x68,0xb, 0x1b,0x25,0xb, 0x28,0x20,0xbd,0x42,0x8, +0x2, 0xb, 0x70,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xbc,0xbe,0x70,0x1, +0x40,0x30,0x6c,0xaa,0x80,0x24,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, +0xda,0x2e,0x24,0x0, 0x30,0x1b,0x25,0xb, 0x28,0x30,0x7e,0x30,0x2, 0xac,0x3a,0x59, +0x31,0x0, 0xd2,0x6d,0x33,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba, +0x38,0xd4,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x63,0x7c,0xbe,0xc4,0x23,0x54, +0x1f,0x7c,0xab,0x7c,0xbe,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0xa, 0x2a,0x9, 0xb2,0xd, 0x68,0x5c,0xb7,0x68,0x40,0x7e,0x50,0x2, 0xac, +0x5e,0x2e,0x24,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x34,0xd, 0x18,0x7e,0x14, +0x0, 0x2, 0x12,0x6d,0x3c,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbf,0x54, +0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x4a,0x2e,0x44, +0xd, 0x68,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xe0,0x7e,0x63, +0xd, 0xf7,0xbc,0x6e,0x38,0x95,0x7a,0xf3,0xd, 0xf7,0xda,0x79,0x22,0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x7e,0xb3, +0x10,0xa5,0x24,0xfa,0x68,0x17,0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x0, +0xfe,0xbe,0xb0,0x5, 0x68,0x4c,0x74,0x5, 0x7a,0xb3,0x0, 0xfe,0x22,0x7e,0xb3,0x0, +0xfe,0xb4,0x5, 0x3e,0x74,0x6, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x25,0x75, +0x9a,0x80,0x7e,0x34,0x77,0xf8,0x12,0x69,0xa1,0x7e,0x34,0x77,0xf8,0x74,0x66,0x12, +0x59,0xb7,0x7e,0x34,0x77,0xf9,0x74,0xbb,0x12,0x59,0xb7,0x80,0x12,0x7e,0xb3,0x0, +0xfe,0xb4,0x5, 0xe, 0x74,0x7, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x25,0x75, +0xe9,0xff,0x22,0x0, 0x0, 0x0, 0x0, 0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x16,0xac, +0xb4,0x1, 0x14,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20, +0xe4,0x7a,0xb3,0x16,0xac,0x80,0xb, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xd0,0xca,0xc2,0xa8,0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x16,0xb3,0x7e, +0xb3,0x16,0xb3,0x70,0xfa,0x12,0x6e,0x6f,0x12,0x61,0x24,0x12,0x6b,0xbe,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x12, +0x6a,0x18,0x12,0x6a,0x3e,0x12,0x52,0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3, +0x10,0x4d,0x2, 0x6e,0xb3,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xe5,0x55,0xbe,0xb0,0x1, +0x68,0xf9,0x7d,0x36,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6d,0xe0,0x7d,0x37,0x7e,0x24, +0x0, 0x4a,0xe4,0x12,0x6d,0xe0,0x75,0x21,0x1, 0x12,0x6b,0xde,0xe5,0x55,0xbe,0xb0, +0x1, 0x68,0xf9,0x75,0x22,0x0, 0x7e,0x51,0x22,0x74,0x2, 0xac,0x5b,0x49,0x2, 0xa, +0x62,0x1e,0x4, 0x1e,0x4, 0x7d,0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d,0x30,0x1b,0x18, +0x30,0x49,0x12,0xa, 0x18,0x1e,0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31, +0x1b,0x28,0x30,0x5, 0x22,0xe5,0x22,0xb4,0x25,0xcc,0x5, 0x21,0xe5,0x21,0xbe,0xb0, +0x5, 0x40,0xb6,0xda,0x3b,0x22,0x6c,0x77,0x7e,0x63,0xd, 0xfa,0xa, 0x16,0x7e,0x63, +0xd, 0xf9,0xa, 0x26,0x2d,0x21,0xbe,0x24,0x0, 0xb4,0x28,0x3, 0x74,0x1, 0x22,0x6c, +0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0x9a,0xbe,0x24,0x3, 0x84, +0x8, 0x9, 0xb, 0x70,0xbe,0x70,0x10,0x68,0xe, 0x80,0x2, 0x6c,0x77,0xb, 0xa0,0x7e, +0x63,0x10,0x2c,0xbc,0x6a,0x38,0xdc,0xa5,0xbf,0x10,0x2a,0x6c,0x77,0x6c,0xaa,0x80, +0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0xca,0xbe,0x24,0x7, 0xd0,0x8, 0x9, +0xb, 0x70,0xa5,0xbf,0x8, 0x5, 0x74,0x1, 0x22,0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10, +0x2b,0xbc,0x6a,0x38,0xdc,0xe4,0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb, +0x75,0xfb,0xa5,0x75,0xfb,0xf, 0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68,0x18,0xbe, +0x34,0x73,0xf9,0x68,0x12,0xbe,0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, 0xd2,0xaf, +0xc2,0xc9,0xa9,0xc5,0xcb,0xe4,0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c,0xb7,0x54, +0xfe,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75, +0xf6,0xff,0x7a,0xa1,0xf6,0x80,0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75,0xf5,0x80, +0x74,0x1, 0x12,0x6d,0x25,0xa9,0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9, +0xa9,0xc5,0xcb,0x74,0x1, 0x22,0x74,0xa, 0x7a,0xb3,0xf, 0x46,0x74,0x14,0x7a,0xb3, +0xf, 0x47,0x7e,0x34,0x3, 0x20,0x7a,0x37,0xf, 0x48,0x7a,0x37,0xf, 0x4a,0x7e,0x24, +0x1, 0xf4,0x7a,0x27,0xf, 0x4c,0x7a,0x37,0xf, 0x4e,0x7a,0x37,0xf, 0x50,0x74,0xc, +0x7a,0xb3,0xf, 0x52,0x74,0x8, 0x7a,0xb3,0xf, 0x53,0x7e,0x34,0x0, 0x3c,0x7a,0x37, +0xf, 0x54,0x7a,0x37,0xf, 0x56,0x7a,0x37,0xf, 0x58,0x7e,0x34,0x0, 0x28,0x7a,0x37, +0xf, 0x5a,0x74,0xf, 0x7a,0xb3,0xf, 0x5c,0xe4,0x7a,0xb3,0xf, 0x5f,0x74,0x4, 0x7a, +0xb3,0xf, 0x60,0x7e,0x34,0x0, 0x64,0x7a,0x37,0xf, 0x61,0x7e,0x34,0xa, 0x0, 0x7a, +0x37,0xf, 0x5d,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x3c,0xf5,0x1d, +0xe4,0x7a,0xb3,0x10,0x3c,0x7d,0x36,0x7d,0x27,0x12,0x6a,0x89,0x7e,0x34,0x10,0x2b, +0x12,0x5b,0x2, 0x75,0x1b,0x0, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81, +0x60,0xfb,0x7d,0x36,0x7e,0x25,0x70,0x12,0x54,0xd0,0x75,0x1c,0x0, 0x7e,0x51,0x1c, +0x74,0x2, 0xac,0x5b,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d, +0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x1c,0xe5,0x1c,0xb4,0x25,0xdd, +0x5, 0x1b,0xe5,0x1b,0xbe,0xb0,0x4, 0x40,0xbd,0xe5,0x1d,0x7a,0xb3,0x10,0x3c,0xda, +0x3b,0x22,0x7d,0x3, 0x75,0xcc,0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0, +0xe5,0xca,0x54,0x1, 0x4c,0xba,0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1, +0xe1,0x9, 0x70,0x0, 0xe, 0x2e,0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c, +0xba,0xc4,0x33,0x54,0xe0,0x7c,0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, +0xb0,0x0, 0x13,0x54,0x3, 0xa, 0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5, +0xe3,0x54,0xe7,0x4c,0xba,0xf5,0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12, +0x5c,0xfb,0x9, 0xb0,0x0, 0x14,0xf5,0xe7,0x22,0x7e,0xb3,0x16,0xac,0x70,0x17,0xe5, +0xcc,0x7a,0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xaf, +0x74,0x1, 0x7a,0xb3,0x16,0xac,0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc, +0xc2,0xca,0xc2,0xc8,0xa9,0xc4,0xcb,0x80,0x2e,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0x23, +0xe5,0x75,0xb4,0x1, 0x1e,0xe5,0x76,0xb4,0x1, 0x19,0xa9,0xc3,0xcb,0x7e,0x24,0x0, +0x1, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3, +0xc9,0xc2,0xcd,0xe4,0x12,0x6d,0x69,0x7e,0xb3,0x16,0xb0,0x60,0xcc,0x22,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcc,0x12, +0x6e,0x6f,0x12,0x61,0x24,0x12,0x6e,0xd5,0x12,0x6d,0x7b,0x74,0x1, 0x7a,0xb3,0x10, +0xa5,0x12,0x6b,0xbe,0x12,0x6a,0x18,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10, +0x4d,0x12,0x6e,0xb3,0x7e,0xb3,0x10,0xa5,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14, +0x68,0x16,0x14,0x68,0x13,0x24,0x5, 0x78,0xeb,0x12,0x41,0x6b,0x80,0xe6,0x12,0x5e, +0x70,0x80,0xe1,0x12,0x69,0xf1,0x80,0xdc,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x12,0x57, +0xed,0x80,0xd1,0x7c,0xa5,0x7c,0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36, +0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2, +0x1e,0xb0,0x1e,0xb0,0x54,0xf, 0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44, +0x1e,0x50,0x1e,0x50,0x1e,0x50,0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd, +0xa, 0x50,0xf5,0xc1,0x7c,0xb3,0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0, +0x43,0xc2,0x7, 0x80,0x7, 0x43,0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5, +0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, +0xac,0x13,0x2e,0x4, 0x1c,0x3a,0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c, +0x33,0x80,0x43,0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0, +0xb, 0x2d,0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, +0xb0,0x54,0x1f,0xa, 0xfb,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c, +0xb2,0x1e,0xb0,0x7e,0x90,0x2, 0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d, +0xf, 0x1b,0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, +0x9, 0xb2,0x0, 0xc, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54, +0x7f,0xf5,0xe5,0x75,0xe4,0x7, 0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4, +0xb, 0x6c,0xaa,0xa, 0x1a,0x49,0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5, +0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39, +0xb0,0xf5,0xe5,0x75,0xe4,0x31,0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff, +0xf5,0xe5,0x75,0xe4,0x32,0x5e,0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0xca,0x79, +0x7e,0x71,0x54,0x3e,0x70,0x3e,0x70,0x7c,0xb7,0x24,0x56,0xa, 0x2b,0xb, 0x28,0x50, +0x7c,0xab,0x7c,0xb7,0x24,0x58,0xa, 0x3b,0xb, 0x38,0x70,0x4d,0x77,0x68,0x1f,0xbe, +0xa0,0x1, 0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34, +0x10,0x2b,0x12,0x6b,0x17,0x7d,0x37,0x7e,0x24,0x18,0x0, 0x12,0x54,0xd0,0x5, 0x54, +0xe5,0x53,0xbe,0xb1,0x54,0x28,0x10,0x12,0x62,0x6b,0xb4,0x1, 0x5, 0x75,0x55,0x1, +0x80,0x8, 0x75,0x55,0x3, 0x80,0x3, 0x75,0x55,0x2, 0xda,0x79,0x22,0x6d,0x11,0x7e, +0x24,0x1c,0x1c,0x1b,0x28,0x10,0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, +0xa3,0x0, 0x50,0x80,0x2, 0x7c,0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e, +0x19,0x40,0xa, 0x14,0x7e,0x4, 0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, +0x14,0x1b,0x8, 0x10,0x49,0x13,0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b, +0x8, 0x10,0x49,0x13,0x0, 0x43,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10, +0xb, 0x50,0xbe,0x50,0xd, 0x40,0xb1,0x22,0x75,0x9, 0x0, 0xe5,0xb, 0xc4,0x7c,0x5b, +0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53,0x28,0xf5,0x91,0x80,0xb, +0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e,0xf5,0x91,0x75,0xa, 0x0, 0xe4,0x7a, +0xb3,0x16,0x4e,0x7e,0x34,0x15,0xca,0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0, +0x7e,0x34,0x16,0xc, 0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0,0x74,0xaa,0x7a, +0xb3,0x15,0xca,0x7a,0xb3,0x15,0xcb,0x7a,0xb3,0x16,0xc, 0x7a,0xb3,0x16,0xd, 0x22, +0xca,0xf8,0x74,0x3, 0x7a,0xb3,0x16,0xa3,0xe4,0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10, +0x4d,0x74,0x3, 0x7a,0xb3,0x16,0xa3,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, +0xac,0x7a,0x37,0xa, 0xaf,0x7e,0xf3,0x16,0xa3,0xbe,0xf0,0x3, 0x78,0x1d,0xe5,0xb, +0x30,0xe7,0xe4,0x12,0x6a,0xf4,0x7e,0x37,0xf, 0xd6,0x7a,0x37,0x16,0xa0,0x7e,0x37, +0xf, 0xda,0x7a,0x37,0x16,0x9e,0x53,0xb, 0x7f,0x80,0xcc,0x7a,0xf3,0x10,0xa5,0x12, +0x0, 0x1e,0x12,0x0, 0x6a,0xda,0xf8,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5, +0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5, +0xbc,0x7c,0xb3,0xf5,0xbd,0xa, 0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5, +0xc3,0xe5,0xc4,0x54,0xe0,0x4c,0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23, +0x4e,0x24,0x0, 0x1, 0x7c,0x15,0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2, +0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x6c, +0xaa,0x6c,0x77,0x7e,0x10,0x30,0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d, +0x1, 0x2e,0x7, 0xf, 0xda,0xb, 0x8, 0x20,0xbe,0x27,0xe, 0x5, 0x8, 0x12,0x7d,0x41, +0x2e,0x47,0xf, 0xd8,0xb, 0x48,0x0, 0x2e,0x7, 0xe, 0x5, 0x1b,0x48,0x0, 0x80,0x18, +0x6d,0x0, 0x9e,0x7, 0xe, 0x5, 0xbd,0x20,0x58,0xe, 0x2e,0x17,0xf, 0xd8,0xb, 0x18, +0x20,0x9e,0x27,0xe, 0x5, 0x1b,0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0, +0xbe,0xa0,0xd, 0x40,0xac,0x22,0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, +0x31,0x7e,0x79,0x50,0xa5,0xbd,0x0, 0xb, 0x7e,0xd, 0x31,0x7e,0xb, 0x40,0x7a,0x79, +0x40,0x80,0x36,0x7e,0xd, 0x31,0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12, +0x6d,0xd0,0xa, 0x2c,0xbd,0x32,0x8, 0x18,0x7e,0x1d,0x31,0x7e,0x1b,0xb0,0x7e,0x79, +0xa0,0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0, +0x7e,0x79,0x30,0x7e,0x1d,0x31,0x7a,0x1b,0x30,0xda,0x3b,0x22,0x7e,0xb3,0x10,0x39, +0xb4,0x1, 0x26,0x7e,0x73,0xa, 0xac,0x7a,0x73,0x10,0x37,0x7e,0x73,0xa, 0xad,0x7a, +0x73,0x10,0x38,0x7e,0x73,0xa, 0xae,0x7a,0x73,0x10,0x3a,0x7e,0x34,0xd, 0xfe,0x7a, +0x37,0x10,0x46,0x7e,0x34,0xf, 0xdc,0x80,0x24,0x7e,0x73,0x11,0x16,0x7a,0x73,0x10, +0x37,0x7e,0x73,0x11,0x49,0x7a,0x73,0x10,0x38,0x7e,0x73,0x11,0x94,0x7a,0x73,0x10, +0x3a,0x7e,0x34,0x11,0x9d,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, 0x63,0x7a,0x37,0x10, +0x48,0x22,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x75,0x60,0xfc,0xe5,0x76,0x60, +0xfc,0x20,0x93,0xfd,0xd2,0x96,0xd2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e, +0xb3,0x16,0xac,0x70,0x17,0xe5,0xcc,0x7a,0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, +0x38,0x30,0x7a,0x73,0x16,0xaf,0x74,0x1, 0x7a,0xb3,0x16,0xac,0xa9,0xc0,0xca,0x7e, +0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9, +0xc2,0xcd,0x75,0x87,0x2, 0x0, 0x0, 0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d, +0x32,0x2e,0x37,0xf, 0xd6,0xb, 0x38,0x10,0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x2d, +0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x9, 0x2e,0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e, +0x24,0x3, 0x70,0x74,0x18,0x7e,0x13,0x10,0x2b,0x6c,0x0, 0x2, 0x5e,0xc8,0x9, 0xa3, +0x0, 0x24,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43, +0xcc,0x8, 0x9, 0x53,0x0, 0x2, 0x3e,0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca, +0xa9,0xd0,0xca,0xd2,0xcd,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9, +0xc0,0xc9,0x7e,0x14,0x1d,0x0, 0xb, 0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20, +0x9, 0xb3,0x0, 0x3f,0xb4,0x1, 0xc, 0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54, +0xf0,0xf5,0xe5,0x22,0x12,0x4b,0x78,0x12,0x3b,0x1c,0x12,0x68,0x9d,0x7e,0x34,0x8, +0x50,0x7a,0x37,0xf, 0xd4,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x7e,0x34,0x8, +0x9a,0x7e,0x27,0xf, 0xd4,0x12,0x6a,0x89,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xf, 0xd8, +0x7e,0x34,0x3, 0x70,0x7a,0x37,0xf, 0xda,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xf, 0xd8, +0x12,0x67,0xa7,0x12,0x64,0xec,0x12,0x5a,0x26,0x12,0x6a,0x3e,0x12,0x52,0x8, 0x12, +0x6e,0x52,0x74,0x1, 0x7a,0xb3,0x11,0x96,0x22,0xca,0xf8,0x7e,0xb3,0xf, 0xd2,0xb4, +0x1, 0x48,0x6c,0xff,0x80,0x3c,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, +0xac,0xbf,0x9, 0xb5,0xa, 0xb1,0x7e,0x53,0x10,0x2b,0x12,0x35,0x22,0x74,0x4, 0xac, +0xbf,0x59,0x35,0xb, 0x86,0x7e,0x37,0xf, 0xd6,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, +0xb2,0x7e,0x53,0x10,0x2c,0x12,0x35,0x22,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x88, +0xb, 0xf0,0x7e,0x73,0xd, 0x16,0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0xca,0x69,0xca, +0xf8,0x7c,0xfb,0x7e,0x24,0x0, 0x4, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24, +0x56,0xa, 0x3b,0x1b,0x38,0x20,0x6d,0x66,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38, +0x60,0xb, 0xf0,0x12,0x0, 0x6e,0x50,0x1e,0x7e,0x24,0x0, 0x5, 0x7c,0xaf,0x3e,0xa0, +0x3e,0xa0,0x7c,0xba,0x24,0x56,0xa, 0x3b,0x1b,0x38,0x20,0x7c,0xba,0x24,0x58,0xa, +0x3b,0x1b,0x38,0x60,0xb, 0xf0,0x7c,0xbf,0xda,0xf8,0xda,0x69,0x22,0x7e,0x47,0x16, +0x65,0x6c,0x77,0x7e,0xa0,0xff,0x7e,0x43,0x16,0x54,0xa, 0x14,0x9, 0x51,0xf, 0x29, +0xbe,0x53,0x10,0x4a,0x78,0x32,0x7e,0x50,0x12,0xac,0x45,0x49,0x22,0x16,0x65,0xbe, +0x24,0x0, 0x41,0x40,0x23,0x7e,0x60,0x1, 0xbe,0x44,0x0, 0x19,0x40,0x18,0x7e,0x30, +0x12,0xac,0x36,0x49,0x21,0x16,0x65,0xbd,0x24,0x50,0x4, 0x7d,0x42,0x7c,0x76,0xb, +0x60,0xbe,0x60,0x4, 0x40,0xe2,0x7c,0xa7,0x7c,0xba,0x22,0xca,0x79,0xe5,0x53,0xbe, +0xb1,0x54,0x38,0x4, 0x6c,0xff,0x80,0x3a,0xe5,0x54,0x3e,0xb0,0x3e,0xb0,0x24,0x56, +0xa, 0x3b,0xb, 0x38,0x30,0x7c,0xe7,0xbe,0xe0,0x1, 0x68,0xe, 0xbe,0xe0,0x2, 0x68, +0x9, 0xbe,0xe0,0x3, 0x68,0x4, 0x4c,0xee,0x78,0x7, 0x7c,0xbe,0x12,0x63,0x2, 0x7c, +0xfb,0xbe,0xe0,0x4, 0x68,0x5, 0xbe,0xe0,0x5, 0x78,0x7, 0x7c,0xbe,0x12,0x51,0x77, +0x7c,0xfb,0x7c,0xbf,0xda,0x79,0x22,0x7e,0xa3,0xd, 0xf7,0xbe,0xa0,0x0, 0x28,0x40, +0x6c,0x77,0x80,0x38,0x7e,0x50,0x2, 0xac,0x57,0x9, 0x62,0xd, 0x18,0x9, 0x52,0xd, +0x19,0x7e,0x30,0x2, 0xac,0x36,0x49,0x1, 0x11,0xce,0x7e,0x17,0xf, 0x4a,0xe, 0x14, +0xbd,0x1, 0x48,0x13,0x7e,0x30,0x2, 0xac,0x35,0x49,0x1, 0x11,0x9e,0x7e,0x17,0xf, +0x4c,0xe, 0x14,0xbd,0x1, 0x58,0x3, 0x74,0x1, 0x22,0xb, 0x70,0xbc,0xa7,0x38,0xc4, +0xe4,0x22,0xca,0xf8,0x7c,0xfb,0xbe,0xf0,0x1, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xf0, +0x2, 0x68,0x4, 0x4c,0xff,0x78,0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x39,0x80,0x3, 0xe4, +0x80,0x28,0x12,0x5f,0xcc,0x4c,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x10,0x3a,0x74,0x1e, +0x7a,0xb3,0x10,0x37,0x74,0xa, 0x7a,0xb3,0x10,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5b, +0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x74,0x1, 0xda,0xf8,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x75,0x75,0x1, 0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x60,0x2, 0x1b,0x28, +0x30,0xb, 0x28,0x30,0x4e,0x70,0x2, 0x1b,0x28,0x30,0xe5,0x55,0xb4,0x1, 0x3, 0x12, +0x5d,0x5e,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b, +0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9, +0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc, +0x7a,0xa1,0xc3,0x75,0xc5,0x40,0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, +0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x3b, +0xe5,0xc6,0xa, 0x2b,0x7c,0x45,0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22,0xe4,0x7a, +0xb3,0x15,0x9f,0x7a,0xb3,0x15,0x53,0x7a,0xb3,0x15,0x9e,0x7a,0xb3,0x15,0xa0,0x7a, +0xb3,0x15,0xa1,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x48,0x12,0x6d,0xe0,0x7e,0x34, +0x14,0xe3,0x7e,0x24,0x0, 0x48,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x15,0x56,0x7e,0x24, +0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x46,0x74, +0xff,0x2, 0x6d,0xe0,0xd2,0xcd,0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e, +0xb3,0x16,0xac,0xb4,0x1, 0x15,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, +0x1b,0x38,0x20,0x7e,0xb3,0x16,0xad,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e, +0x34,0x1d,0x8, 0x1b,0x38,0x20,0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x16,0xac,0x22,0x7c,0xab,0x6c,0x33,0x80,0x36, +0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d, +0x3, 0x7e,0x9, 0x10,0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e, +0x20,0x1e,0x20,0x7e,0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d, +0xf, 0x1b,0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x75,0x76,0x0, 0x75,0xe4, +0x3, 0x49,0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, +0x5e,0x24,0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5, +0x75,0xe4,0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9, +0xd6,0xea,0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1,0x22,0x7e,0x34,0x1, 0x90, +0x7a,0x37,0xd, 0xff,0x7e,0x34,0x0, 0x19,0x7a,0x37,0xe, 0x1, 0x7e,0x34,0x0, 0x9c, +0x7a,0x37,0xe, 0x3, 0x7e,0x34,0x0, 0x2, 0x7a,0x37,0xe, 0x5, 0x7a,0x37,0xe, 0x7, +0x74,0x1, 0x7a,0xb3,0xe, 0x9, 0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, +0x7e,0x34,0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x2, 0x6d,0xe0,0xca,0xf8,0x7e,0x24, +0xe, 0xd, 0x7e,0x34,0xe, 0x99,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x6c,0xff,0x74, +0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x12,0x4c,0xf7,0x74,0x7, 0xac,0xbf,0x59,0x35, +0xe, 0x99,0x49,0x35,0xe, 0xf, 0x12,0x4a,0xa6,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, +0x9b,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xd7,0xda,0xf8,0x22,0x6d,0x33,0x6c,0xaa,0x80, +0x2e,0x7e,0x30,0x2, 0xac,0x3a,0x9, 0x51,0xd, 0x18,0x9, 0x41,0xd, 0x19,0x7e,0x10, +0x30,0xac,0x15,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xf, 0xda,0xb, 0x18, +0x40,0xbe,0x44,0x0, 0x0, 0x8, 0x6, 0xbd,0x43,0x8, 0x2, 0x7d,0x34,0xb, 0xa0,0x7e, +0xb3,0xd, 0xf7,0xbc,0xba,0x38,0xca,0x22,0xca,0x79,0x7d,0x41,0x7d,0x13,0x6d,0x0, +0x7e,0x34,0x7f,0xff,0x6c,0xaa,0x80,0x1b,0x7e,0xf0,0x7, 0xac,0xfa,0x7d,0xe7,0x2d, +0xe4,0x49,0xfe,0x0, 0x2, 0xbd,0xf0,0x28,0x2, 0x7d,0xf, 0xbd,0xf3,0x50,0x2, 0x7d, +0x3f,0xb, 0xa0,0x9, 0xb4,0x0, 0x46,0xbc,0xba,0x38,0xdd,0x1b,0x18,0x0, 0x1b,0x28, +0x30,0xda,0x79,0x22,0xca,0xf8,0x7e,0xb3,0x10,0x4e,0x60,0x3, 0xb4,0x1, 0x2d,0xa9, +0xc6,0xea,0x12,0x2b,0xa0,0x7c,0xfb,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12, +0x67,0xa7,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x53,0xb7,0xbe,0xf0,0x1, +0x78,0x4, 0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0x10,0x4e,0xda,0xf8,0x22,0x7e, +0xb3,0x16,0x54,0x4, 0x7a,0xb3,0x16,0x54,0x7e,0x73,0x16,0x54,0xbe,0x70,0x4, 0x40, +0x5, 0xe4,0x7a,0xb3,0x16,0x54,0x7e,0xa3,0x16,0x54,0xbe,0xa0,0x3, 0x78,0x13,0x7e, +0xb3,0x16,0x9d,0x4, 0x7a,0xb3,0x16,0x9d,0xbe,0xb0,0x8, 0x40,0x5, 0xe4,0x7a,0xb3, +0x16,0x9d,0xa, 0x3a,0x9, 0xb3,0xf, 0x29,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d, +0x21,0x7d,0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x3c,0x7e,0xb3,0x10,0x3c,0xb4,0x1, +0x1f,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d, +0x26,0xb, 0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3, +0xda,0x3b,0x22,0x7e,0xb3,0x10,0x3d,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3, +0x10,0x39,0x12,0x5f,0xcc,0x12,0x2d,0xb5,0xe4,0x7a,0xb3,0x10,0x39,0x12,0x5f,0xcc, +0x12,0x2d,0xb5,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x17,0x7e,0x37,0xf, 0xd4,0x7e,0x24, +0x8, 0xe4,0x12,0x58,0xd5,0x74,0x2, 0x7a,0xb3,0x10,0x3d,0x22,0x7e,0xa3,0xf, 0x1c, +0xbe,0xa0,0x0, 0x38,0x2f,0xbe,0xa3,0xf, 0x1b,0x50,0x19,0x7e,0xb3,0xf, 0x25,0xbe, +0xb3,0x12,0x33,0x28,0x14,0x7e,0xb3,0x12,0x33,0x4, 0x7a,0xb3,0x12,0x33,0x7a,0xa3, +0xf, 0x1b,0x80,0x5, 0xe4,0x7a,0xb3,0x12,0x33,0x7e,0xb3,0xf, 0x1b,0x70,0x5, 0xe4, +0x7a,0xb3,0xf, 0x24,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca, +0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12, +0x54,0x45,0x74,0x1, 0x7a,0xb3,0x16,0x4e,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, +0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x75,0x76,0x1, 0x75,0xe6,0x0, 0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0x5e,0xd0, +0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda, +0x6b,0xda,0x7b,0x32,0xca,0xf8,0x7d,0x1, 0x7d,0x13,0x7e,0xf3,0x10,0x4d,0xbe,0xf0, +0x1, 0x78,0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x2, 0x80,0x11, +0x4c,0xff,0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, +0x4, 0x12,0x5e,0xc8,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0xf, 0xd3,0x6c,0xaa,0x6c,0x33, +0x6d,0xff,0x7e,0x10,0x18,0xac,0x1a,0xa, 0xe3,0x2d,0xe, 0x3e,0x4, 0x7d,0x40,0x2d, +0x42,0x1b,0x48,0xf0,0x6d,0x44,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x18, +0xdf,0xb, 0xa0,0xbe,0xa0,0xd, 0x40,0xd6,0x22,0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c, +0x33,0x4c,0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d, +0x30,0x80,0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe, +0x30,0x3, 0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, +0x2a,0x2d,0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x7e,0x24, +0xff,0xff,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x14,0x2d, +0x13,0x59,0x21,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd1,0x22,0x7c,0xab,0x7e, +0x24,0xe, 0xdf,0xbe,0xa0,0xa, 0x50,0x25,0xa, 0x3a,0x7d,0x13,0x2d,0x12,0x7e,0x19, +0xb0,0xb4,0x2, 0xe, 0x74,0x1, 0x7a,0x19,0xb0,0x74,0x3, 0x2d,0x23,0x19,0xb2,0x0, +0xa, 0x22,0x74,0x3, 0x7a,0x19,0xb0,0x2d,0x32,0x19,0xb3,0x0, 0xa, 0x22,0xca,0x7b, +0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83, +0xc0,0x82,0x12,0x6e,0x5c,0x53,0xb, 0xfd,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, +0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x6d,0x33,0x7a, +0x37,0x11,0xd, 0x74,0x1, 0x7a,0xb3,0x11,0xf, 0x74,0xb, 0x7a,0xb3,0x11,0x10,0x74, +0x9, 0x7a,0xb3,0x11,0x11,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x7a,0xb3,0x11,0x13,0x7a, +0xb3,0x11,0x14,0x74,0x1, 0x7a,0xb3,0x11,0x15,0x22,0x7e,0xb3,0xf, 0x1b,0x70,0x1e, +0x7e,0xa3,0xf, 0x1c,0xbe,0xa0,0x0, 0x28,0x15,0xe5,0x16,0x70,0xd, 0x7a,0xa3,0xf, +0x1b,0x74,0x1, 0x7a,0xb3,0xf, 0x22,0x5, 0x16,0x22,0x75,0x16,0x0, 0x22,0x75,0x16, +0x0, 0xe4,0x7a,0xb3,0xf, 0x22,0x22,0x6c,0xaa,0x80,0x1f,0x7e,0x70,0x2, 0xac,0x7a, +0x49,0x23,0x0, 0xd2,0x7e,0x70,0x18,0xac,0x7a,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e, +0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba, +0x38,0xd9,0x22,0x75,0x75,0x0, 0xa9,0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30, +0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x2, +0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, 0x5e, +0x0, 0xa, 0x0, 0x96,0x1, 0x2c,0x0, 0x8, 0x0, 0x78,0x0, 0xfa,0x0, 0x7, 0x0, 0x50, +0x0, 0xc8,0x0, 0x6, 0x0, 0x32,0x0, 0xa0,0x0, 0x4, 0x0, 0x1e,0x0, 0x78,0x0, 0x3, +0x0, 0xa, 0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0xf5, +0xf1,0x7c,0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9,0x37, +0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5,0xcb, +0x22,0xc2,0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x3e,0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, 0x12, +0x6d,0x25,0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x12,0x22,0x20,0x12,0x3d,0xb5, +0x12,0x4c,0x41,0x60,0x6, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x7e,0xb3,0xe, 0xb, 0x60, +0x3, 0x12,0x60,0x78,0x7e,0xb3,0xe, 0xc, 0x60,0x6, 0x12,0x55,0x5a,0x2, 0x5f,0x1f, +0x22,0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0xf, 0x28,0x12,0x6a, +0x18,0xb4,0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x53,0xb, 0x8f,0x74,0x2, 0x80, +0x2, 0x74,0xff,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x66,0x93, +0x7e,0xb3,0x10,0x3d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x65,0xe4,0x7e,0xb3, +0x10,0x4e,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x34, +0xa, 0xb1,0x7e,0x24,0x3, 0x4d,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0xb, 0x86,0x7e,0x24, +0x1, 0x90,0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0xd, 0x6b,0x7e,0x24,0x0, 0x8c,0x74, +0xff,0x2, 0x6d,0xe0,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51,0x80, +0x3, 0x7e,0x39,0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23,0x0, +0x3b,0x7e,0x34,0x1d,0x6, 0x1b,0x38,0x20,0x22,0xe4,0x7a,0xb3,0xf, 0xd2,0x6c,0xaa, +0x6d,0x44,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x2, 0x1b,0x8, 0x40,0x6d,0x0, +0x2d,0x13,0x1b,0x18,0x0, 0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x22,0x7e,0x34,0x12, +0x1, 0x7e,0x24,0x0, 0x1e,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x12,0x1f,0x7e,0x24,0x0, +0x14,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x11,0xed,0x7e,0x24,0x0, 0x14,0xe4,0x2, 0x6d, +0xe0,0x12,0x0, 0x6e,0x50,0x1d,0x12,0x6e,0xad,0x7c,0xab,0x7e,0xb3,0x11,0x95,0xbe, +0xb0,0x4, 0x68,0xf, 0xbe,0xa0,0xff,0x68,0xa, 0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x7a, +0xa3,0x11,0x95,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb3,0x10,0x3d,0x70,0x3, 0x7e,0xf0, +0x1, 0x74,0x1, 0x12,0x3e,0xf7,0xbe,0xb0,0x1, 0x68,0x5, 0xbe,0xf0,0x1, 0x78,0x4, +0xe4,0x12,0x3e,0xf7,0xda,0xf8,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5,0x0, +0x75,0xe4,0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, 0x9, +0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x7e,0x34,0x8, 0x9a,0x7e,0x24, +0x11,0x9e,0x7e,0x14,0x1, 0x90,0x12,0x3c,0x70,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x11, +0x4a,0x7e,0x14,0x0, 0xc8,0x12,0x3c,0x70,0x2, 0x56,0xf3,0x74,0x1, 0x12,0x6e,0x3d, +0xa9,0xc3,0xea,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x75,0x9a, +0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xe5,0x52,0xb4,0x1, +0x18,0xe5,0x51,0x70,0x14,0x7e,0xb3,0x11,0x95,0x60,0xb, 0xe4,0x7a,0xb3,0x11,0x95, +0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x12,0x6c,0x58,0x85,0x51,0x52,0x22,0x6c,0xaa,0x7e, +0x50,0x4, 0xac,0x5a,0x49,0x12,0x0, 0xec,0xbd,0x13,0x38,0x8, 0x49,0x22,0x0, 0xee, +0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe4,0x7c,0xba,0x22,0x7e,0x24, +0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0x8d,0x12,0x6c,0xab,0x7e, +0x34,0x7, 0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x2e,0x75,0x55, +0x0, 0x75,0x73,0x0, 0x75,0x54,0x0, 0x12,0x6b,0xfd,0x12,0x61,0xcd,0xf5,0x53,0x12, +0x62,0x6b,0xb4,0x1, 0x4, 0x75,0x55,0x1, 0x22,0x75,0x55,0x3, 0x22,0x7e,0x34,0x0, +0x1, 0x7a,0x35,0x56,0x7e,0x34,0xa, 0x18,0x7a,0x35,0x58,0x7e,0x34,0x0, 0x2, 0x7a, +0x35,0x5a,0x7e,0x34,0xa, 0x62,0x7a,0x35,0x5c,0x74,0x2, 0x22,0x0, 0x50,0x0, 0xa, +0x6, 0x4, 0x0, 0x78,0x0, 0xc, 0x6, 0x4, 0x0, 0xc8,0x0, 0x1e,0x8, 0x5, 0x1, 0x40, +0x0, 0x50,0x8, 0x5, 0x1, 0xf4,0x0, 0x64,0xa, 0x6, 0xe4,0x7a,0xb3,0x16,0xb1,0x7a, +0xb3,0x16,0xb0,0x7e,0xb3,0x10,0xa3,0x70,0x6, 0x7e,0x73,0x11,0x10,0x80,0x4, 0x7e, +0x73,0x11,0x12,0x7a,0x73,0x16,0xb2,0x22,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x2, 0x7a, +0xb3,0x10,0x7b,0x74,0x4, 0x7a,0xb3,0x10,0x7c,0x7e,0x34,0x16,0x55,0x7e,0x24,0x0, +0x48,0xe4,0x2, 0x6d,0xe0,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x75,0x92,0x7c,0xd2, +0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0x22, +0xe4,0x7a,0xb3,0xd, 0xfb,0x7e,0x34,0x11,0x9e,0x7a,0x37,0xf, 0xd6,0x12,0x40,0x32, +0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x2, 0x46,0xe9,0x75,0x75,0x1, 0x7e,0x24, +0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e,0x34, +0x0, 0x1, 0x2, 0x6e,0x27,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34,0xc9, +0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0xe5,0x51, +0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0x5a,0x80,0x4, 0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, +0x54,0x7a,0x37,0xf, 0x56,0x22,0xca,0xf8,0x12,0x6e,0x32,0x7c,0xfb,0x12,0x0, 0x6e, +0x50,0x7, 0x4c,0xff,0x78,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0xda,0xf8,0x22,0x7e,0x34, +0x0, 0x24,0x12,0x69,0x78,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, 0x57, +0x2e,0x54,0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0x7d,0x3, 0x80,0xa, +0x7e,0x29,0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d,0x55, +0x78,0xee,0x22,0x7e,0x53,0xf, 0x47,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x9d,0x32,0xbe, +0x34,0x0, 0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4,0x1, +0x3, 0x43,0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3,0x16, +0xa3,0xe4,0x7a,0xb3,0x16,0xaa,0x74,0xff,0x7a,0xb3,0x16,0xa2,0x22,0x75,0x76,0x1, +0xd2,0xee,0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x6e,0x27,0xa, +0x2b,0x19,0x72,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x44,0x1, 0x7a,0xb3,0x10,0xfe,0x22, +0x7d,0x13,0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31,0x22, +0x14,0x1, 0xa, 0x1, 0x0, 0x2, 0xfb,0x4, 0xf6,0x5, 0xec,0x6, 0xe7,0x7, 0xe2,0x8, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5,0x22, +0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x12, +0x0, 0x42,0x12,0x57,0x73,0x74,0x3, 0x12,0x43,0xae,0x2, 0x24,0xb4,0x7e,0x34,0x0, +0x21,0x12,0x69,0x78,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x7e,0xb3,0x11,0x15,0xb4, +0x1, 0x4, 0xe4,0x2, 0x6e,0x92,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32,0x38, +0xfa,0x22,0x12,0x62,0xb7,0xb4,0x1, 0x2, 0xe4,0x22,0x74,0x1, 0x22,0xd2,0xcf,0xa9, +0xd4,0xc9,0x75,0xcc,0x0, 0xc2,0xca,0x22,0xa9,0xc0,0x93,0x75,0x9, 0x0, 0x75,0xa, +0x0, 0x32,0x75,0x53,0x0, 0x75,0x54,0x0, 0x75,0x55,0x0, 0x22,0xa9,0x32,0x99,0x5, +0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x75,0xb, 0x0, 0x12,0x6e,0xc3,0x2, 0x5e,0x18,0x12, +0x6b,0x5b,0x12,0x6e,0xc9,0x2, 0x6e,0x66,0xe5,0x75,0x60,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xe5,0x76,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20, +0x40,0x80,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf, +0x22,0xf5,0x17,0x75,0x18,0x0, 0x22,0x12,0x61,0x79,0x2, 0x38,0x4a,0x12,0x4f,0xa8, +0x2, 0x62,0x1d,0x12,0x6e,0xd5,0x2, 0x6b,0xde,0x7e,0x34,0x1, 0x3, 0x22,0x7e,0x34, +0x5, 0xb, 0x22,0x2, 0x6c,0x75,0x2, 0x0, 0x76,0x2, 0x6c,0xc5,0x2, 0x6e,0x9a,0x2, +0x6e,0x5c,0xe5,0x6e,0x22,0x22,0x0, 0x1, 0x0, 0x8b,0x1, 0x0, 0x1, 0xa, 0xac,0x15, +0x0, 0x1, 0xa, 0xad,0x17,0x0, 0x1, 0xa, 0xae,0x4, 0x0, 0x1, 0xd, 0xfe,0x40,0x0, +0x5, 0xf, 0x29,0x20,0x17,0x29,0x38,0x13,0x0, 0x18,0xf, 0x2e,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x3, 0x0, 0x25,0xf, 0x63,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x18,0xf, +0x88,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xf, 0xa0,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xf, 0xad,0x0, 0x1, +0x2, 0x3, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x17,0x16,0x15,0x14,0x13,0xc, +0xd, 0xe, 0xf, 0x10,0x11,0x12,0x0, 0xd, 0xf, 0xc5,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x0, 0x9, 0xa, 0xb, 0xc, 0x0, 0x25,0xf, 0xdc,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0xd, 0x10,0xff,0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, +0xa, 0x0, 0x1, 0x11,0xc, 0x0, 0x0, 0x1, 0x11,0x16,0x15,0x0, 0x32,0x11,0x17,0x0, +0x8, 0x0, 0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a,0x1, +0xbc,0x2, 0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, 0x7, +0xf9,0x8, 0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e,0xc, +0x83,0x0, 0x1, 0x11,0x49,0x17,0x0, 0x1, 0x11,0x94,0x2, 0x0, 0x1, 0x11,0x95,0x0, +0x0, 0x4, 0x11,0x97,0xff,0xff,0xff,0xff,0x0, 0x2, 0x11,0x9b,0xff,0x1f,0x0, 0x1, +0x11,0x9d,0x40,0x0, 0x1, 0x11,0xe8,0x0, 0x0, 0x4, 0x11,0xe9,0x23,0x23,0x23,0x23, +0x0, 0x1, 0x16,0x53,0x0, 0x0, 0x1, 0x15,0x53,0x0, 0x0, 0x1, 0x15,0x9e,0x0, 0x0, +0x1, 0x15,0x9f,0x0, 0x0, 0x1, 0x15,0xa0,0x0, 0x0, 0x1, 0x15,0xa1,0x0, 0x0, 0x1, +0x12,0x33,0x0, 0x0, 0x1, 0x16,0xac,0x0, 0x0, 0x1, 0x16,0xb4,0x0, 0x0, 0x1, 0x16, +0xb5,0x0, 0x0, 0x1, 0x16,0xb6,0x0, 0x0, 0x1, 0x16,0xb7,0x0, 0x0, 0x1, 0x16,0xb8, +0x0, 0x0, 0x1, 0x16,0xb9,0x0, 0x0, 0x1, 0x16,0xba,0x1, 0x0, 0x1, 0x16,0xbb,0x1, +0x0, 0xc, 0x0, 0xec,0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94, +0x0, 0x6, 0x0, 0xf8,0x0, 0xb4,0x2, 0x1c,0x3, 0x84,0x0, 0x1, 0x16,0x54,0x3, 0x0, +0x1, 0x16,0x9d,0x0, 0x0, 0x1, 0x0, 0xfe,0x0, 0x0, 0x1, 0x0, 0xff,0x0, 0x0, 0x1, +0x16,0xbc,0x0, 0x0, 0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x70,0xc5,0x8f,0x3a,0x20, +0xdf,0x16,0xf4, diff --git a/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_boe_720p.txt b/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_boe_720p.txt new file mode 100644 index 0000000000000..4c88fe0ccdace --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_boe_720p.txt @@ -0,0 +1,1810 @@ +0x2, 0x51,0x4f,0x2, 0x68,0xdc,0xe5,0x73,0x60,0x9, 0x74,0x1, 0x12,0x6e,0xd3,0x75, +0x73,0x0, 0x22,0xe4,0x12,0x6e,0xd3,0x75,0x73,0x1, 0x22,0x2, 0x50,0xb9,0xe5,0x55, +0xbe,0xb0,0x1, 0x68,0xf9,0x12,0x6e,0xb9,0x60,0xfb,0x22,0x2, 0x67,0x73,0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60, +0xfb,0x22,0x22,0x2, 0x6e,0x89,0xc2,0x8e,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0x22,0x32,0x2, 0x63,0xb7,0xbe,0xb0, +0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x16,0x9f,0x22,0x22,0x2, 0x0, 0x5a,0xe5,0x52, +0x24,0xff,0x22,0x2, 0x67,0xab,0xca,0x3b,0x7e,0xb3,0xf, 0x1b,0xf5,0x26,0x7e,0xd3, +0xf, 0x1c,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x33,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, +0xa, 0xe4,0x12,0x6e,0x21,0x6c,0xcc,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7c,0x19, +0xa3,0x13,0xba,0x7e,0x34,0x7f,0xff,0x74,0x7, 0xac,0xbc,0x59,0x35,0x13,0xb6,0x74, +0x7, 0xac,0xbc,0x59,0x35,0x13,0xb8,0xb, 0xc0,0xbe,0xc0,0xa, 0x78,0xd9,0xe5,0x26, +0x60,0x3, 0x2, 0x0, 0xef,0x12,0x6a,0xee,0xbe,0xd0,0x0, 0x38,0x3, 0x2, 0x0, 0xdf, +0x74,0x1, 0x7a,0xb3,0xf, 0x20,0xe4,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7e, +0x34,0x13,0x6, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x2, 0x1, 0x14,0x4c, +0xdd,0x68,0x3, 0x2, 0x1, 0x14,0x75,0x25,0x0, 0x7e,0xa0,0xff,0x7e,0x71,0x25,0x74, +0x7, 0xac,0x7b,0x19,0xa3,0xe, 0x57,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xeb,0x74,0x1, +0x7a,0xb3,0xf, 0x1f,0x75,0x25,0x0, 0x2, 0x1, 0x4c,0x7e,0x51,0x25,0x74,0x7, 0xac, +0x5b,0x2e,0x24,0xe, 0xd, 0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x51,0x25,0xac,0x5b,0x2e,0x24,0xe, 0xf, 0xb, 0x28,0x30,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x5, 0x25,0xe5,0x26,0xbe,0xb1, +0x25,0x38,0xc7,0xe4,0x6c,0x77,0x7e,0x61,0x26,0x7e,0x24,0x13,0xb6,0x12,0x53,0x2, +0x7e,0x71,0x26,0x7e,0x60,0xa, 0x7e,0x24,0x13,0xb6,0x12,0x53,0x2, 0x7c,0xcb,0x6c, +0xee,0x75,0x25,0x0, 0x2, 0x1, 0x92,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65,0x13, +0xba,0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x11,0xbc,0x76,0x78,0x3, 0x2, 0x1, 0x97, +0x5, 0x25,0xbe,0xc1,0x25,0x38,0xe0,0xbe,0xc1,0x25,0x68,0x3, 0x2, 0x1, 0xb8,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3c,0x2e,0x14,0x13, +0xb6,0x74,0x7, 0x12,0x49,0x26,0xb, 0xc0,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xb2,0x7e, +0x24,0x13,0xb6,0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x4c,0xdd, +0x68,0x3, 0x2, 0x1, 0xe7,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, +0x46,0x12,0x6d,0x7d,0x2, 0x4, 0x84,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x4, 0x84, +0x6c,0xee,0x2, 0x4, 0x7b,0x75,0x25,0x0, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65, +0xe, 0x57,0x7e,0x90,0x7, 0xac,0x9e,0x9, 0x74,0xe, 0x11,0xbc,0x67,0x78,0x3, 0x2, +0x2, 0x1b,0x5, 0x25,0xe5,0x25,0xbe,0xb0,0xa, 0x40,0xdd,0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x9, 0xf5,0xe, 0x57,0x49,0x34,0xe, 0xf, 0x49,0x25,0xe, 0x55,0x12,0x6d,0xf1, +0x7d,0x63,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, 0xa4, +0x49,0x25,0xe, 0x53,0x12,0x6d,0xf1,0x7d,0x13,0x2d,0x16,0x7a,0x15,0x21,0x7c,0x1f, +0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7,0xbe,0x14,0x0, 0x40,0x28,0x3, 0x2, 0x2, 0xd9, +0x7e,0x35,0x21,0xbe,0x34,0x0, 0x20,0x38,0x3, 0x2, 0x2, 0xae,0x7e,0x70,0x3, 0xac, +0x7f,0x9, 0xb3,0x12,0x2, 0x60,0x3, 0x2, 0x2, 0x97,0x9, 0xb3,0x12,0x3, 0xbe,0xb0, +0x0, 0x38,0x3, 0x2, 0x2, 0x89,0x2, 0x2, 0xbf,0x74,0x1, 0x19,0xb3,0x12,0x2, 0x6d, +0x22,0x7a,0x25,0x21,0x2, 0x2, 0xed,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0xa, 0x40,0x3, +0x2, 0x2, 0xed,0x2e,0x34,0x12,0x3, 0x4, 0x7a,0x39,0xb0,0x2, 0x2, 0xd1,0x7e,0x70, +0x3, 0xac,0x7f,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x2, 0xcc,0x7d, +0x23,0x2e,0x24,0x12,0x3, 0x14,0x7a,0x29,0xb0,0x2, 0x2, 0xed,0xe4,0x19,0xb3,0x12, +0x2, 0x6d,0x33,0x7a,0x35,0x21,0x2, 0x2, 0xed,0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7f, +0x19,0xa3,0x12,0x3, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x2, 0x7e,0x35,0x21, +0xbe,0x34,0x0, 0x20,0x28,0x3, 0x2, 0x3, 0x2e,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49, +0x35,0xe, 0x53,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x35,0xe, 0x55,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0x6d,0x33,0x7a, +0x35,0x21,0x7e,0xa0,0x1, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x1, 0x7e,0xf5, +0x21,0x7a,0xf5,0x23,0xa, 0xef,0x2e,0xe5,0x33,0x7e,0xe9,0xb0,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x3, 0x52,0x6d,0xee,0x74,0x2, 0xac,0xbf,0x59,0xe5,0x11,0xed,0x59,0xe5, +0x12,0x1f,0x7e,0x17,0xf, 0x5d,0xbe,0x15,0x23,0x28,0x3, 0x2, 0x3, 0x68,0x7e,0x4, +0x1, 0x0, 0x7a,0x5, 0x31,0x2, 0x3, 0x8b,0x7e,0x35,0x23,0x6d,0x22,0x7c,0x56,0x7c, +0x67,0x6c,0x77,0x12,0x48,0x9f,0x7d,0xe3,0x7a,0xe5,0x31,0xbe,0xe4,0x0, 0x10,0x40, +0x3, 0x2, 0x3, 0x8b,0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x31,0x74,0x2, 0xac,0xbf,0x49, +0x45,0x12,0x1f,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x3, 0xa5,0x49,0x45,0x11,0xed,0x7a, +0x45,0x31,0x2, 0x3, 0xac,0x7e,0x45,0x31,0x59,0x45,0x11,0xed,0x59,0xf5,0x12,0x1f, +0x7e,0x35,0x31,0xbe,0x34,0x1, 0x0, 0x38,0x3, 0x2, 0x3, 0xc3,0x7e,0x34,0x1, 0x0, +0x7a,0x35,0x31,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x25,0xe, 0x53,0x12,0x6d,0xf1,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31, +0xad,0x32,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, +0xac,0x5b,0x49,0x32,0xe, 0x53,0xac,0xbe,0x49,0x15,0xe, 0xd, 0xbd,0x13,0x38,0x3, +0x2, 0x4, 0x14,0x7d,0x2, 0x2e,0x4, 0xe, 0x53,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, +0x10,0x2, 0x4, 0x1e,0x2e,0x24,0xe, 0x53,0x9e,0x35,0x21,0x1b,0x28,0x30,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49,0x25,0xe, 0x55, +0x12,0x6d,0xf1,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31,0xad,0x32,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, 0xac,0x5b,0x49,0x32,0xe, +0x55,0xac,0xbe,0x49,0x15,0xe, 0xf, 0xbd,0x13,0x38,0x3, 0x2, 0x4, 0x6f,0x7d,0x2, +0x2e,0x4, 0xe, 0x55,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, 0x10,0x2, 0x4, 0x79,0x2e, +0x24,0xe, 0x55,0x9e,0x35,0x21,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x26,0xbc,0xbe,0x28, +0x3, 0x2, 0x1, 0xf5,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x49,0x45,0xe, 0x53,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x35,0x49,0x45,0xe, 0x55,0x1e,0x44,0x1e, +0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x37,0x9, 0xf5,0xe, 0x57,0x19,0xf5,0xe, 0x11, +0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x58,0x19,0x75,0xe, 0x12,0x74,0x7, 0xac,0xbe, +0x9, 0x75,0xe, 0x59,0x19,0x75,0xe, 0x13,0x7c,0xbf,0x54,0xf, 0xbe,0xb0,0xa, 0x40, +0x3, 0x2, 0x5, 0xd7,0x7c,0xfb,0xa, 0xf, 0x7d,0x10,0x2e,0x15,0x33,0x7e,0x19,0xb0, +0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x5, 0xf4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x4, 0xf9, +0x74,0xff,0x19,0xb0,0x13,0x6, 0x2, 0x5, 0xd7,0x9, 0x90,0x13,0x6, 0xbe,0x90,0xff, +0x68,0x3, 0x2, 0x5, 0x4b,0x74,0x1, 0x19,0xb0,0x13,0x6, 0x7e,0x15,0x35,0x74,0x7, +0xac,0xbe,0x59,0x15,0xe, 0xd, 0x7e,0x15,0x37,0x74,0x7, 0xac,0xbe,0x59,0x15,0xe, +0xf, 0x6c,0xdd,0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x50,0x7, 0xac, +0x5d,0x7e,0x30,0x15,0xac,0x3f,0x2d,0x12,0x2e,0x14,0x12,0x34,0x74,0x7, 0x12,0x49, +0x26,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xdb,0x2, 0x5, 0xd7,0xbe,0x90,0x3, 0x50,0x3, +0x2, 0x5, 0x58,0xe4,0x19,0xb0,0x13,0x6, 0x7e,0x25,0x35,0x9, 0x80,0x13,0x6, 0x7e, +0x90,0x7, 0xac,0x89,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x43,0x59,0x24,0x12,0x34,0x7e, +0x25,0x37,0x59,0x24,0x12,0x36,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x5, 0xa0,0xe4, +0x2e,0x34,0x12,0x34,0x12,0x68,0x47,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x74, +0x1, 0x7e,0x70,0x15,0xac,0x7f,0x2e,0x34,0x12,0x34,0x12,0x68,0x47,0x2, 0x5, 0xc2, +0x49,0x34,0x12,0x34,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0xa, 0x3f,0x9, 0x43, +0x13,0x6, 0x7e,0x50,0x7, 0xac,0x45,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x32,0x49,0x33, +0x12,0x36,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0xa, 0x3f,0x2e,0x34,0x13,0x6, +0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x7c,0x1e,0x2e,0x10,0x27,0xa5,0xe7,0x60,0x3, +0x2, 0x5, 0xf4,0x7e,0x70,0x3, 0xac,0x7e,0x2e,0x34,0x12,0x1, 0x7e,0x24,0x0, 0x3, +0xe4,0x12,0x6e,0x21,0xb, 0xe0,0xbe,0xe0,0xa, 0x68,0x3, 0x2, 0x4, 0x86,0xe5,0x26, +0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x6, 0xe, 0x74,0x1, 0x7a,0xb3,0xf, 0x24,0xda,0x3b, +0x22,0xca,0x3b,0x7e,0xe3,0xf, 0x1b,0x4c,0xee,0x78,0x27,0x6c,0xff,0x6d,0x11,0x74, +0x2, 0xac,0xbf,0x59,0x15,0x13,0x56,0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x19, +0xa1,0x13,0x14,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x13,0x6a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xdb,0x6c,0xff,0x2, 0x7, 0xac,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xe, 0x11,0x54, +0xf, 0xf5,0x22,0xbe,0xb0,0xa, 0x40,0x3, 0x2, 0x7, 0xaa,0xe5,0x22,0xa, 0x1b,0x9, +0xb1,0xe, 0xdf,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x7, 0x85,0x75,0x21,0x0, 0x7e,0x31, +0x21,0x74,0x7, 0xac,0x3b,0x9, 0x71,0x13,0x14,0x7a,0x71,0x23,0xbe,0x71,0x22,0x68, +0x3, 0x2, 0x7, 0x77,0x49,0x21,0x13,0x12,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xf, +0x9d,0x32,0x12,0x6e,0x11,0x7d,0x63,0x7e,0xa1,0x21,0x74,0x7, 0xa4,0x49,0x25,0x13, +0x10,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6e,0x11,0x7d,0x3, +0x2d,0x6, 0xe5,0x23,0xa, 0x1b,0x9, 0xa1,0x13,0x6a,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0x71,0x23,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x13,0x56,0x2e,0x14,0x13,0x6a,0x7c,0xba, +0x14,0x7a,0x19,0xb0,0x2, 0x7, 0xaa,0x7e,0xa1,0x23,0x74,0x2, 0xa4,0x49,0x15,0x13, +0x56,0xbe,0x14,0x0, 0x32,0x28,0x9, 0xbe,0x4, 0x0, 0x32,0x28,0x3, 0x2, 0x7, 0x71, +0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, +0x80,0x6f,0xbe,0x4, 0x0, 0x96,0x28,0x63,0xe5,0x22,0xa, 0x1b,0x9, 0xb1,0xe, 0xdf, +0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0xe, 0xdf,0x7e,0xa0,0x3, 0xe5, +0x22,0xa, 0x1b,0x19,0xa1,0xe, 0xe9,0x7e,0x71,0x21,0x74,0x7, 0xac,0x7b,0x2e,0x34, +0x13,0x10,0x7e,0x14,0x13,0xb6,0x12,0x49,0x26,0xbe,0xe0,0x0, 0x28,0x2d,0x1b,0xe0, +0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3f,0x2e,0x14, +0xe, 0xd, 0x74,0x7, 0x12,0x49,0x26,0x7e,0x34,0x13,0xb6,0x7e,0x30,0x7, 0xac,0x3e, +0x2e,0x14,0xe, 0xd, 0x74,0x7, 0x12,0x49,0x26,0x1b,0xf0,0x7e,0xa1,0x23,0x74,0x2, +0xa4,0x59,0x5, 0x13,0x56,0x80,0x33,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0xa, 0x50,0x3, +0x2, 0x6, 0x6e,0x80,0x25,0x6d,0x11,0x7e,0xa1,0x22,0x74,0x2, 0xa4,0x59,0x15,0x13, +0x56,0x7e,0xa0,0xff,0x7e,0x31,0x22,0x74,0x7, 0xac,0x3b,0x19,0xa1,0x13,0x14,0x7e, +0xa0,0x2, 0xe5,0x22,0xa, 0x1b,0x19,0xa1,0x13,0x6a,0xb, 0xf0,0xbc,0xef,0x28,0x3, +0x2, 0x6, 0x47,0x7a,0xe3,0xf, 0x1b,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0x10,0x7e, +0x14,0x0, 0x46,0x12,0x6d,0x7d,0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d, +0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x24,0xc, 0x75,0x25,0x0, +0x75,0x26,0x17,0x75,0x27,0x0, 0x7e,0x34,0x13,0xd0,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6e,0x21,0x6c,0x66,0x2, 0x8, 0xed,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xd, 0x18,0x7a, +0x71,0x23,0x9, 0xa5,0xd, 0x19,0x1a,0x17,0x7d,0x21,0x1b,0x25,0xb, 0x15,0x7c,0x43, +0x1a,0x1a,0x1b,0x15,0x1a,0xa, 0xb, 0x5, 0x7c,0x21,0xbe,0x50,0x0, 0x58,0x2, 0x6c, +0x55,0x7e,0x73,0x10,0x2b,0xa, 0x7, 0x1b,0x4, 0x1a,0x44,0xbd,0x40,0x8, 0x2, 0x7c, +0x41,0xbe,0x30,0x0, 0x58,0x2, 0x6c,0x33,0x7e,0x73,0x10,0x2c,0xa, 0x7, 0x1b,0x4, +0x1a,0x42,0xbd,0x40,0x8, 0x2, 0x7c,0x21,0xbe,0x51,0x24,0x58,0x3, 0x7a,0x51,0x24, +0xbe,0x41,0x25,0x8, 0x3, 0x7a,0x41,0x25,0xbe,0x31,0x26,0x58,0x3, 0x7a,0x31,0x26, +0xbe,0x21,0x27,0x8, 0x3, 0x7a,0x21,0x27,0x7c,0xf5,0x80,0x4b,0x7c,0xe3,0x80,0x41, +0x1a,0xef,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0xe, 0x2d,0xf, 0xe, 0x4, 0xe, 0x4, +0xe, 0x4, 0x7c,0x71,0x7a,0x71,0x21,0x7e,0x10,0x18,0xac,0x1f,0x7c,0xb1,0x2c,0xbe, +0x54,0x7, 0x7e,0x4, 0x0, 0x1, 0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7c,0xb1,0xf5, +0x22,0xa, 0x7, 0x2e,0x4, 0x13,0xd0,0x7e,0x9, 0xb0,0x45,0x22,0x7a,0x9, 0xb0,0xb, +0xe0,0xbc,0x2e,0x58,0xbb,0xb, 0xf0,0xbc,0x4f,0x58,0xb1,0xb, 0x60,0x7e,0x73,0xd, +0xf7,0xbc,0x76,0x28,0x3, 0x2, 0x8, 0x27,0xbe,0x70,0x0, 0x38,0x3, 0x2, 0xd, 0x43, +0x7e,0xe1,0x26,0x2, 0xd, 0x3a,0x6c,0xff,0x80,0x1f,0x1a,0x3e,0x3e,0x34,0x1a,0x2f, +0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36,0xb, 0x38,0x30,0xe, 0x34,0xe, +0x34,0x3e,0x24,0x59,0x32,0x13,0xb6,0xb, 0xf0,0x7e,0x73,0x10,0x2b,0xbc,0x7f,0x18, +0xd9,0x7e,0xf1,0x24,0x2, 0xd, 0x2f,0x1a,0x4f,0x7e,0x14,0x0, 0x18,0xad,0x14,0x1a, +0x3e,0x7d,0x51,0x2d,0x53,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7a,0xa1,0x21, +0x7e,0x50,0x18,0xac,0x5f,0x7c,0xb5,0x2c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x22,0xa, 0x2a,0x9, 0xb2,0x13,0xd0, +0x55,0x22,0x78,0x3, 0x2, 0xd, 0x2d,0xbe,0xf0,0x3, 0x58,0x3, 0x2, 0x9, 0xfe,0x7e, +0x53,0x10,0x2b,0xa, 0x25,0x1b,0x26,0xbd,0x42,0x18,0x73,0x7d,0xf4,0x3e,0xf4,0x49, +0x5f,0x13,0xba,0x49,0x2f,0x13,0xb2,0x2d,0x25,0x7d,0x52,0x3e,0x54,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x2d,0x25,0x49,0x5f,0x13,0xbc,0x49,0xef,0x13,0xb0,0x2d,0xe5,0x7d, +0x5e,0x3e,0x54,0x2d,0x5e,0x9d,0x25,0x49,0xef,0x13,0xb8,0x49,0x5f,0x13,0xb4,0x2d, +0x5e,0x7d,0xe5,0x3e,0xe4,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d, +0x5e,0x9d,0x25,0x49,0x5f,0x13,0xb6,0x7d,0x5, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x9d,0x10,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x2, 0xb, 0x55,0x4c,0xff, +0x78,0x5d,0x7d,0x24,0x3e,0x24,0x49,0x12,0x13,0xb6,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x3e,0x54,0x2d,0x50,0x7d,0x1, 0x3e,0x4, 0x2d,0x5, 0x2d,0x1, 0x49,0x12,0x13,0xb8, +0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5, 0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x9d,0x1, 0x49,0x12,0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x2d,0x50,0x9d,0x51,0x49,0x22,0x13,0xbc,0x3e,0x24,0x9d,0x52,0x2, 0xb, 0x55,0xbe, +0xf0,0x1, 0x78,0x69,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x49,0x20, +0x13,0xb6,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x25,0x9d,0x21,0x49,0x10, +0x13,0xb8,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x21,0x49,0x10, +0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10, +0x13,0xbc,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x52,0x2, 0xb, 0x55,0xbe,0xf0,0x2, +0x68,0x3, 0x2, 0xb, 0x75,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x50,0x13,0xb2,0x7d, +0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x15,0x9d,0x12,0x49,0x20,0x13,0xb6,0x7d, +0xf2,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5f,0x3e,0x24,0x3e,0x24,0x2d, +0x25,0x2d,0x21,0x49,0x50,0x13,0xb8,0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x2d,0x15,0x9d,0x21,0x49,0x50,0x13,0xba,0x7d,0x15,0x3e,0x14,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10,0x13,0xbc,0x7d,0x21,0x3e, +0x24,0x2d,0x21,0x9d,0x52,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7d,0x23,0x3e,0x24,0x7e,0x14,0x0, 0x30,0xad,0x14,0x2d,0x21,0x2d,0x26,0x1b, +0x28,0x50,0x2, 0xd, 0x11,0x7e,0xa3,0x10,0x2b,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x68, +0x3, 0x2, 0xc, 0x11,0x3e,0x44,0x49,0x24,0x13,0xb2,0x7d,0x12,0x3e,0x14,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x4, 0x13,0xb0,0x7d,0x10,0x3e,0x14,0x2d,0x10, +0x9d,0x21,0x49,0x4, 0x13,0xb4,0x7d,0x10,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x10,0x9d,0x21,0x49,0x14,0x13,0xb6,0x7d,0xf1,0x3e,0xf4,0x3e,0xf4, +0x3e,0xf4,0x3e,0xf4,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x9d,0xf, 0x3e,0x14,0x3e,0x14,0x2d,0x10,0x2d,0x12,0x49,0x4, +0x13,0xb8,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x20, +0x9d,0x12,0x49,0x4, 0x13,0xba,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x20, +0x2d,0x21,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x2, 0xd, +0x0, 0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x76,0x1a,0xf, 0x3e,0x4, 0x49,0x30,0x13, +0xb0,0x7d,0x23,0x3e,0x24,0x2d,0x23,0x49,0x10,0x13,0xb2,0x7d,0x31,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x2d,0x31,0x9d,0x32,0x49,0x20,0x13,0xb4,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x49,0x20,0x13,0xb6,0x7d,0x12,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x9d,0x21,0x2d,0x23,0x49,0x30,0x13,0xb8,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x31,0x9d,0x23,0xe, +0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e,0x80,0x71,0x7e, +0xb3,0x10,0x2b,0x14,0xbc,0xbf,0x78,0x79,0x1a,0x5f,0x3e,0x54,0x49,0x25,0x13,0xb2, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9d,0x32,0x49,0x25,0x13,0xb0,0x3e,0x24, +0x9d,0x32,0x49,0x25,0x13,0xb4,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x24,0x9d,0x32,0x49,0x15,0x13,0xb6,0x7d,0x21, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x2, 0x7d,0x21,0x3e,0x24,0x2d,0x20,0x2d,0x21, +0x2d,0x23,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e, +0x3e,0x34,0x1a,0xf, 0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d,0x31,0x2d,0x36,0x1b,0x38, +0x20,0x1a,0x1e,0x3e,0x14,0x1a,0x2f,0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x23,0x2d, +0x21,0x2d,0x26,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x25,0xbc,0xbf,0x48,0x3, 0x2, 0x9, 0x37,0xb, 0xe0,0xe5,0x27,0xbc,0xbe,0x48,0x3, +0x2, 0x9, 0x6, 0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7e,0xb3,0xd, 0xf7,0xf5,0x2c, +0x75,0x10,0x0, 0xe4,0x7a,0xb3,0x15,0x54,0x7a,0xb3,0x15,0x55,0x6d,0x22,0x7e,0x34, +0x7f,0xff,0x7e,0x67,0xf, 0xda,0x6c,0xee,0xe4,0xa, 0x1e,0x19,0xb1,0x13,0xb6,0x6c, +0xaa,0x7e,0x10,0x2, 0xac,0x1e,0x19,0xa0,0x15,0x2b,0x19,0xb0,0x15,0x2c,0xe5,0x2c, +0xbc,0xbe,0x28,0x24,0x9, 0x20,0xd, 0x18,0x7e,0x30,0x18,0xac,0x23,0x9, 0x10,0xd, +0x19,0xa, 0x1, 0x2d,0x10,0x3e,0x14,0x2d,0x16,0xb, 0x18,0x10,0xbd,0x12,0x48,0x2, +0x7d,0x21,0xbd,0x13,0x18,0x2, 0x7d,0x31,0xb, 0xe0,0xbe,0xe0,0x14,0x78,0xb9,0x2d, +0x32,0xe, 0x34,0xe5,0x2c,0xbe,0xb0,0x2, 0x50,0x3, 0x2, 0x11,0x9d,0x6c,0xee,0x7e, +0x30,0x6, 0xac,0x3e,0x7d,0x51,0x2e,0x54,0x69,0x8f,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x23,0x58,0x20,0x7d,0x51,0x2e,0x54,0x69,0x91,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0x7a,0x25,0x30,0x2e,0x14,0x69,0x93,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0x7a,0x25,0x32,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc3,0x6c,0xee,0x2, 0x11, +0x8b,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19, +0xf5,0x23,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x13,0xb6,0x70,0xa, 0xa, 0x3e, +0xb, 0x34,0xa, 0x2e,0x19,0x72,0x13,0xb6,0xe5,0x2c,0x14,0xbc,0xbe,0x78,0x3, 0x2, +0x11,0x94,0xa, 0x5e,0xb, 0x54,0xf5,0x2d,0x2, 0x11,0x7f,0x7e,0x71,0x2d,0x74,0x2, +0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a,0xa1,0x24,0x9, 0xb3,0xd, 0x19,0xf5,0x25,0xa, +0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x2a,0xe5,0x25, +0xa, 0x2b,0xe5,0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x2b,0x75, +0x3d,0x2, 0x75,0x2f,0x0, 0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b, +0x2d,0x23,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0x7a,0x25,0x34,0x7e,0x11,0x24,0x74, +0x18,0xac,0x1b,0xe5,0x25,0xa, 0x1b,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0x7a,0x25,0x36,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0xe, 0x54,0x7a,0x55,0x38,0xbe,0x25,0x34,0x8, 0x14,0x7e,0x25,0x34, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x7a,0x25, +0x38,0xe5,0x2a,0xbe,0xb0,0x1, 0x38,0x37,0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x30,0x7c, +0xbf,0x54,0x2, 0xb4,0x2, 0x29,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, 0x20,0x7e, +0x71,0x22,0x74,0x18,0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d, +0x32,0xbe,0x35,0x38,0x18,0x3, 0x2, 0x11,0x13,0x75,0x2f,0x1, 0x2, 0x11,0x13,0xe5, +0x2a,0xbe,0xb0,0x1, 0x38,0xa, 0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x3, 0x2, 0x11,0x13, +0xe5,0x2a,0xbe,0xb0,0x4, 0x40,0x3, 0x2, 0x11,0x13,0xe5,0x2b,0xbe,0xb0,0x4, 0x40, +0x3, 0x2, 0x11,0x13,0x7c,0xbf,0x54,0x1, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x11,0x13, +0x6d,0x33,0x7a,0x35,0x3a,0x75,0x3c,0x0, 0x85,0x22,0x26,0x85,0x24,0x28,0xe5,0x24, +0xbe,0xb1,0x22,0x50,0x6, 0x85,0x24,0x26,0x85,0x22,0x28,0x85,0x23,0x27,0x85,0x25, +0x29,0xe5,0x25,0xbe,0xb1,0x23,0x50,0x6, 0x85,0x25,0x27,0x85,0x23,0x29,0x75,0x40, +0x0, 0x75,0x41,0x0, 0xe5,0x28,0xbe,0xb1,0x26,0x78,0x21,0x75,0x40,0x1, 0xe5,0x26, +0x60,0x5, 0xe5,0x26,0xb4,0xc, 0x3, 0x75,0x41,0x1, 0xe5,0x26,0xbe,0xb0,0x0, 0x28, +0x2, 0x15,0x26,0xe5,0x28,0xbe,0xb0,0xc, 0x50,0x2, 0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x27,0x78,0x21,0x75,0x40,0x1, 0xe5,0x27,0x60,0x5, 0xe5,0x27,0xb4,0x17,0x3, 0x75, +0x41,0x1, 0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x27,0xe5,0x29,0xbe,0xb0,0x17, +0x50,0x2, 0x5, 0x29,0x85,0x26,0x3e,0x80,0x78,0x85,0x27,0x3f,0x80,0x6a,0xe5,0x26, +0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x28,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x27,0xbe,0xb1, +0x3f,0x68,0x7, 0xe5,0x29,0xbe,0xb1,0x3f,0x78,0x24,0x7e,0x51,0x3e,0x74,0x18,0xac, +0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0xbe,0x24, +0x0, 0x0, 0x8, 0x6, 0x2e,0x25,0x3a,0x7a,0x25,0x3a,0x5, 0x3c,0x80,0x28,0x7e,0x51, +0x3e,0x74,0x18,0xac,0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0xbe,0x25,0x32,0x8, 0xc, 0xe5,0x3d,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x3d, +0x1, 0x80,0x3, 0x75,0x3d,0x0, 0x5, 0x3f,0xe5,0x29,0xbe,0xb1,0x3f,0x50,0x8f,0x5, +0x3e,0xe5,0x28,0xbe,0xb1,0x3e,0x50,0x81,0x7e,0x51,0x28,0x74,0x18,0xac,0x5b,0xe5, +0x27,0xa, 0x4b,0x2d,0x24,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x50,0x7e,0x25,0x3a,0x9d, +0x25,0x7e,0x31,0x26,0x74,0x18,0xac,0x3b,0xe5,0x29,0xa, 0xb, 0x7d,0x51,0x2d,0x50, +0x3e,0x54,0x2d,0x56,0xb, 0x58,0x50,0x9d,0x25,0x2d,0x14,0x3e,0x14,0x2d,0x16,0xb, +0x18,0x10,0x9d,0x21,0x7e,0x31,0x28,0x74,0x18,0xac,0x3b,0x2d,0x10,0x3e,0x14,0x2d, +0x16,0xb, 0x18,0x10,0x9d,0x21,0x7a,0x25,0x3a,0x7e,0x25,0x36,0x2e,0x25,0x34,0x7a, +0x25,0x38,0xe5,0x40,0xb4,0x1, 0x11,0xe5,0x41,0x70,0xd, 0x7e,0x25,0x3a,0x9e,0x25, +0x38,0x7a,0x25,0x3a,0x15,0x3c,0x15,0x3c,0xe5,0x3c,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x3c,0x24,0xfc,0xf5,0x3c,0x7e,0x25,0x3a,0xbe,0x24,0x0, 0x0, 0x58,0x3, 0x7a,0x35, +0x3a,0x7e,0x15,0x38,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x30,0x1a,0x26,0x1a,0x24,0x12, +0x48,0x85,0xe5,0x3c,0xa, 0x1b,0x6d,0x0, 0x12,0x48,0x85,0x7f,0x21,0x7e,0x35,0x3a, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x48,0x96,0xbf,0x12,0x8, 0xa, 0xe5, +0x3d,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x2f,0x2, 0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, +0x75,0x2f,0x2, 0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x63,0xe5,0x2f,0xa, 0x3b,0x2e,0x34, +0x15,0x53,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2d,0xa, 0x3b,0x9, 0xb3,0x13, +0xb6,0x70,0xc, 0xa, 0x2e,0x9, 0x52,0x13,0xb6,0x19,0x53,0x13,0xb6,0x80,0x3e,0x75, +0x2e,0x0, 0x80,0x32,0x9, 0x33,0x13,0xb6,0xa, 0x2e,0x9, 0xa2,0x13,0xb6,0xbc,0xa3, +0x28,0x12,0xe5,0x2e,0xa, 0x2b,0x9, 0x22,0x13,0xb6,0xbc,0x2a,0x78,0x16,0x19,0x32, +0x13,0xb6,0x80,0x10,0xe5,0x2e,0xa, 0x2b,0x9, 0xb2,0x13,0xb6,0xbc,0xb3,0x78,0x4, +0x19,0xa2,0x13,0xb6,0x5, 0x2e,0xe5,0x2c,0xbe,0xb1,0x2e,0x38,0xc7,0x5, 0x2d,0xe5, +0x2c,0xbe,0xb1,0x2d,0x28,0x3, 0x2, 0xe, 0x3b,0xb, 0xe0,0xe5,0x2c,0xbc,0xbe,0x28, +0x3, 0x2, 0xe, 0x1, 0x7e,0x34,0x13,0xb6,0x12,0x3b,0x6a,0xf5,0x10,0xda,0x3b,0x22, +0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55, +0x7e,0x37,0xf, 0x61,0x7a,0x35,0x3e,0x6c,0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0xe4,0x19,0xb3,0xd, 0x71,0xa, 0x5d,0x3e,0x54,0xb, 0x54,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x39,0x9, 0xb3,0xd, 0x19,0xf5,0x3a, +0xbe,0xd1,0x3a,0x28,0x3, 0x2, 0x12,0xe, 0x7e,0xb3,0x10,0x2c,0xa, 0xb, 0x1b,0x4, +0xa, 0x3d,0x9d,0x3, 0xe5,0x3a,0xa, 0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0xe, 0x7c, +0x3a,0xa, 0x4d,0xe5,0x3a,0xa, 0xb, 0x9d,0x4, 0x7c,0x51,0x2, 0x12,0x59,0xbe,0xd1, +0x3a,0x38,0x3, 0x2, 0x12,0x27,0xe5,0x3a,0xa, 0xb, 0xa, 0x3d,0x2d,0x30,0xb, 0x34, +0x7c,0x37,0x6c,0x55,0x2, 0x12,0x59,0xa, 0xfd,0xe5,0x3a,0xa, 0x4b,0x2d,0xf4,0x7e, +0xb3,0x10,0x2c,0xa, 0xb, 0x7d,0x30,0x1b,0x34,0xbd,0xf3,0x18,0x3, 0x2, 0x12,0x59, +0xbd,0x43,0x8, 0x3, 0x2, 0x12,0x59,0xa, 0x3d,0x2d,0x30,0xe5,0x3a,0xa, 0xb, 0x9d, +0x30,0x7c,0x37,0xa, 0x3d,0x9d,0x3, 0x7c,0x51,0xbe,0xd1,0x39,0x28,0x3, 0x2, 0x12, +0x83,0x7e,0xb3,0x10,0x2b,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5,0x39,0xa, +0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0x83,0x7c,0x4a,0xa, 0xd, 0xe5,0x39,0xa, 0x3b, +0x2, 0x12,0xca,0xbe,0xd1,0x39,0x38,0x3, 0x2, 0x12,0x9c,0xe5,0x39,0xa, 0xb, 0xa, +0x3d,0x2d,0x30,0xb, 0x34,0x7c,0x47,0x6c,0x22,0x2, 0x12,0xce,0xa, 0x4d,0xe5,0x39, +0xa, 0x5b,0x2d,0x45,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7d,0x3, 0x1b,0x4, 0xbd,0x40, +0x18,0x3, 0x2, 0x12,0xce,0xbd,0x50,0x8, 0x3, 0x2, 0x12,0xce,0xa, 0xd, 0x2d,0x3, +0xe5,0x39,0xa, 0x3b,0x9d,0x3, 0x7c,0x41,0xa, 0xd, 0x9d,0x30,0x7c,0x27,0x7e,0x37, +0xf, 0xda,0x7c,0xb2,0x7e,0x23,0xf, 0x53,0x7e,0x4, 0x9, 0xc8,0x12,0x5c,0x9d,0x7e, +0x37,0x9, 0xc8,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xca,0x7d,0x20,0x7a,0x1d,0x28, +0x7e,0x37,0x9, 0xcc,0x7d,0x3, 0x7e,0x37,0x9, 0xce,0x7d,0x20,0x7a,0x1d,0x2c,0x7e, +0x37,0x9, 0xd0,0x7d,0x3, 0x7e,0x37,0x9, 0xd2,0x7d,0x20,0x7a,0x1d,0x30,0x7e,0x37, +0x9, 0xd4,0x7d,0x3, 0x7e,0x37,0x9, 0xd6,0x7d,0x20,0x7a,0x1d,0x34,0xa, 0x2d,0xe5, +0x39,0xa, 0x3b,0x9d,0x32,0x7c,0xc7,0x2, 0x15,0x24,0xa, 0x4d,0xe5,0x3a,0xa, 0x5b, +0x9d,0x54,0xf5,0x38,0x2, 0x15,0xd, 0xbe,0xc0,0x0, 0x58,0x3, 0x2, 0x15,0xb, 0x7e, +0x73,0x10,0x2b,0xbc,0x7c,0x18,0x3, 0x2, 0x15,0xb, 0xe5,0x38,0xbe,0xb0,0x0, 0x58, +0x3, 0x2, 0x15,0xb, 0x7e,0x73,0x10,0x2c,0xbe,0x71,0x38,0x18,0x3, 0x2, 0x15,0xb, +0xe5,0x38,0x1a,0x1b,0x3e,0x14,0x1a,0x2c,0x7e,0x34,0x0, 0x30,0xad,0x32,0x2d,0x31, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x7e,0x53,0xf, 0x53,0xa, 0x25,0x9d,0x32,0x7a, +0x35,0x3c,0xbe,0x34,0x0, 0x0, 0x18,0x3, 0x2, 0x15,0xb, 0x7e,0x35,0x3e,0xbe,0x35, +0x3c,0x28,0x3, 0x2, 0x13,0xa6,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xd, 0x71,0x7e, +0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x39,0xa, 0x2b,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x13,0xd0,0xe5,0x3a,0xa, 0x2b,0xe5,0x38, +0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x2, 0x15,0xb, +0x75,0x3b,0x0, 0x2, 0x14,0x60,0xbe,0xe1,0x3b,0x78,0x3, 0x2, 0x14,0x5e,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe, +0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0x75,0x3b,0xff,0x2, 0x14,0x6c,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe, +0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0x75,0x3b,0x0, 0x2, 0x14,0x6c,0x5, 0x3b, +0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x3b,0x8, 0x3, 0x2, 0x13,0xd6,0xe5,0x3b,0x60,0x3, +0x2, 0x14,0xc0,0x7e,0x35,0x3c,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x3c,0x7e, +0xf5,0x3c,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x85,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a, +0x2, 0x7f,0x17,0x12,0x48,0x85,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34, +0x7e,0x1d,0x28,0x9f,0x17,0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30, +0xe5,0x3b,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x15,0xb, 0x7e,0xf5,0x3c,0x7d,0x3f,0x1a, +0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48,0x85,0x7f,0x1, 0x7e,0x1d, +0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x85,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34,0x7e,0x1d,0x28,0x9f,0x17, +0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30,0x5, 0x38,0xa, 0x2d,0xe5, +0x3a,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x38,0x1a,0x3b,0xbd,0x32,0x18,0x3, 0x2, +0x13,0x37,0xb, 0xc0,0xa, 0x2d,0xe5,0x39,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0x1a,0x3c, +0xbd,0x32,0x18,0x3, 0x2, 0x13,0x2a,0x74,0x6, 0x7e,0x1d,0x2c,0x2f,0x11,0x14,0x78, +0xfb,0x7a,0x1d,0x2c,0x7e,0xd, 0x28,0x7e,0x1d,0x2c,0x12,0x48,0xa1,0x2e,0x34,0x0, +0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xd, 0x6b,0x74,0x6, 0x7e,0x1d,0x34,0x2f, +0x11,0x14,0x78,0xfb,0x7a,0x1d,0x34,0x7e,0x7d,0x30,0x7e,0x1d,0x34,0x7f,0x7, 0x12, +0x48,0xa1,0x2e,0x34,0x0, 0x20,0x59,0x36,0xd, 0x6d,0x7e,0xb3,0xf, 0x60,0x7f,0x17, +0x70,0x3, 0x2, 0x15,0x91,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7a,0x1d,0x30,0xbe,0x18,0x0, 0x7f,0x38,0x3, 0x2, 0x15,0xa4,0x7e,0x18,0x0, +0x7f,0x7a,0x1d,0x30,0x7e,0x2d,0x30,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0x71,0x7e,0x70,0x7, 0xac,0x7f,0x19, +0xa3,0xd, 0x71,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xd, 0x71,0xbe,0x70,0xf, 0x38,0x3, +0x2, 0x15,0xdf,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xd, 0x71,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x11, +0x96,0xa5,0xbe,0x1, 0x58,0x7e,0xa3,0x10,0x2b,0xbc,0xa7,0x28,0xd, 0x7a,0x71,0xd, +0x74,0x30,0xac,0x7b,0x2e,0x37,0x16,0x9b,0x80,0x3c,0x7a,0x71,0xd, 0xbc,0xa7,0x78, +0x6, 0x7e,0x34,0x8, 0x9a,0x80,0x2f,0xa, 0x2a,0x7d,0x2, 0xb, 0x4, 0xa, 0x17,0xbd, +0x10,0x78,0x6, 0x7e,0x34,0x8, 0xca,0x80,0x1d,0x7d,0x2, 0xb, 0x5, 0xbd,0x10,0x78, +0x6, 0x7e,0x34,0x9, 0x2e,0x80,0xf, 0x2e,0x24,0x0, 0x3, 0xbd,0x12,0x68,0x3, 0x2, +0x19,0x6a,0x7e,0x34,0x9, 0x5e,0x7a,0x37,0x0, 0xfb,0x2, 0x19,0x6a,0xa5,0xbe,0x0, +0x46,0x7e,0x64,0x0, 0xb, 0x7a,0x69,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf,0x1, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, +0x74,0x1, 0x7e,0x70,0x1, 0x80,0x36,0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3, +0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x21,0x74,0x27,0x7e,0x70, +0x3, 0x12,0x6d,0xe0,0x2, 0x19,0x6a,0xa5,0xbe,0x2, 0x23,0xa5,0xbf,0x4, 0x7, 0x74, +0x1, 0x7e,0x70,0x4, 0x80,0x7, 0xa5,0xbf,0x5, 0x9, 0xe4,0x6c,0x77,0x12,0x0, 0x5e, +0x2, 0x19,0x6a,0xbe,0x70,0x1, 0x50,0x3, 0x2, 0x19,0x6a,0x2, 0x19,0x6a,0xa5,0xbe, +0x3, 0x15,0xbe,0x70,0xd, 0x28,0x9, 0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x2, 0x19,0x6a, +0x7a,0x73,0x10,0x2b,0x2, 0x19,0x6a,0xa5,0xbe,0x4, 0x15,0xbe,0x70,0x18,0x28,0x9, +0x74,0x18,0x7a,0xb3,0x10,0x2c,0x2, 0x19,0x6a,0x7a,0x73,0x10,0x2c,0x2, 0x19,0x6a, +0xa5,0xbe,0x5, 0x7, 0x7a,0x73,0x10,0x2d,0x2, 0x19,0x6a,0xa5,0xbe,0x7, 0x1e,0x7a, +0x73,0x10,0x4b,0x7c,0xb7,0x54,0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0x10, +0x54,0x5e,0x70,0x3, 0x4d,0x32,0x7a,0x37,0x10,0x54,0x2, 0x19,0x6a,0xa5,0xbe,0x8, +0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xac,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x16,0x2, 0x19,0x6a,0xa5,0xbe,0x9, 0x1c,0xbe,0x70,0xa, 0x50,0x3, 0x7e,0x70, +0xa, 0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xad,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x49,0x2, 0x19,0x6a,0xa5,0xbe,0xa, 0x10,0xa5,0xbf,0x0, 0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x10,0x3b,0x2, 0x19,0x6a,0xa5,0xbe,0xb, 0x14,0x7e,0xb3,0x10, +0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xae,0x2, 0x19,0x6a,0x7a,0x73,0x11,0x94,0x2, 0x19, +0x6a,0xa5,0xbe,0xc, 0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xd, 0xfe,0x2, +0x19,0x6a,0x7a,0x73,0x11,0x9d,0x2, 0x19,0x6a,0xa5,0xbe,0x4c,0x7, 0x7a,0x73,0xf, +0x46,0x2, 0x19,0x6a,0xa5,0xbe,0xfb,0x29,0x7a,0x71,0x8, 0x7e,0x37,0x10,0x50,0x5e, +0x70,0xdf,0x7a,0x37,0x10,0x50,0xe5,0x8, 0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x4e,0x37,0x10,0x50,0x7a,0x37,0x10,0x50,0x2, 0x19, +0x6a,0xa5,0xbe,0x4e,0x7, 0x7a,0x73,0x10,0x4a,0x2, 0x19,0x6a,0xa5,0xbe,0x4f,0x6, +0x12,0x0, 0x6, 0x2, 0x19,0x6a,0xbe,0x60,0x50,0x40,0x12,0xbe,0x60,0x51,0x38,0xd, +0xa, 0x26,0x2e,0x27,0x10,0x2f,0x9e,0x24,0x0, 0x50,0x2, 0x19,0x54,0xbe,0x60,0x52, +0x40,0x12,0xbe,0x60,0x55,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x31,0x9e,0x24,0x0, +0x52,0x2, 0x19,0x54,0xbe,0x60,0x56,0x40,0x12,0xbe,0x60,0x62,0x38,0xd, 0xa, 0x26, +0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x56,0x2, 0x19,0x54,0xbe,0x60,0x63,0x40,0x12, +0xbe,0x60,0x7a,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x63,0x2, +0x19,0x54,0xbe,0x60,0x7b,0x50,0x3, 0x2, 0x18,0xe8,0xbe,0x60,0x9f,0x28,0x3, 0x2, +0x18,0xe8,0x7e,0xb3,0x10,0x3b,0x70,0x48,0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24, +0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29, +0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f,0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17, +0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29, +0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, 0x2f,0x19,0x72,0xf, 0xdc,0x2, 0x19,0x6a, +0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27, +0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29,0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f, +0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17,0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27, +0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29,0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, +0x2f,0x19,0x72,0xf, 0x63,0x2, 0x19,0x6a,0xbe,0x60,0xa0,0x40,0x11,0xbe,0x60,0xac, +0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6c,0x9e,0x24,0x0, 0xa0,0x80,0x56,0xbe,0x60, +0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6e,0x9e,0x24, +0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38,0xc, 0xa, 0x26, +0x2e,0x27,0x10,0x70,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2,0x40,0x11,0xbe, +0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x72,0x9e,0x24,0x0, 0xd2,0x80,0x14, +0xbe,0x60,0xd6,0x40,0x14,0xbe,0x60,0xed,0x38,0xf, 0xa, 0x26,0x2e,0x27,0x10,0x74, +0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x80,0x11,0xa5,0xbe,0xf8,0x6, 0x7a,0x73,0x11, +0xe8,0x80,0x7, 0xa5,0xbe,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x3b,0x22,0xca,0x3b,0xe4, +0x7a,0xb3,0x13,0xde,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x23,0x6c,0xee,0x7e,0xa0,0xff, +0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0xff,0xa, 0x3e,0x19,0xb3,0x13, +0xca,0x7e,0x34,0xff,0xff,0x74,0x2, 0xac,0xbe,0x59,0x35,0x13,0xb6,0xe4,0xa, 0x3e, +0x19,0xb3,0x13,0xd4,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xd2,0x7e,0xb3,0xf, 0x1b,0x60, +0x3, 0x2, 0x19,0xe5,0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0x2, 0x1c,0x18,0x6c,0xee,0x7e, +0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, +0x78,0xdd,0x2, 0x1c,0x18,0x7e,0xb3,0xf, 0x1c,0x60,0x3, 0x2, 0x1a,0x38,0x6c,0xee, +0x2, 0x1a,0x2d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5e, +0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19, +0xe5,0xe, 0x11,0x74,0x1, 0xa, 0x3e,0x19,0xb3,0x13,0xd4,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0xbe,0x2, 0x1c,0x18,0x6c,0xee,0x2, 0x1a,0xb7,0x6c,0xff,0xa, +0x3f,0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x1a,0xae, +0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x1a,0xae,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23, +0x49,0x23,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x9d,0x32,0x12,0x6e, +0x11,0x7d,0x63,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23,0x49,0x23,0x0, 0x14,0x74, +0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6e,0x11,0x2d,0x36,0x7a,0x35, +0x21,0x74,0x2, 0xac,0xbe,0x49,0x45,0x13,0xb6,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x1a, +0xae,0xa, 0x4e,0x19,0xf4,0x13,0xca,0x7e,0x35,0x21,0x59,0x35,0x13,0xb6,0xb, 0xf0, +0xbe,0xf0,0xa, 0x78,0x8a,0xb, 0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, +0x1a,0x3d,0x6c,0xee,0x2, 0x1b,0x6e,0x74,0x1, 0x7a,0xb3,0x13,0xde,0x6c,0xff,0x2, +0x1b,0xd, 0xbc,0xfe,0x78,0x3, 0x2, 0x1b,0xb, 0xa, 0x3f,0x9, 0x63,0x13,0xca,0xa, +0x2e,0x9, 0x72,0x13,0xca,0xbc,0x76,0x68,0x3, 0x2, 0x1b,0xb, 0x74,0x2, 0xac,0xbf, +0x49,0x25,0x13,0xb6,0x74,0x2, 0xac,0xbe,0x49,0x35,0x13,0xb6,0xbd,0x32,0x50,0x3, +0x2, 0x1b,0xb, 0xe4,0x7a,0xb3,0x13,0xde,0x2, 0x1b,0x15,0xb, 0xf0,0x7e,0x73,0xf, +0x1b,0xbc,0x7f,0x38,0xbd,0x7e,0xb3,0x13,0xde,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1b, +0x6c,0x74,0x1, 0xa, 0x3e,0x9, 0xa3,0x13,0xca,0xa, 0x4a,0x19,0xb4,0x13,0xd4,0x7e, +0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, +0xa, 0x2e,0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32, +0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0xa, 0x2e,0x9, 0x42,0x13,0xca, +0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0x7e,0x73, +0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, 0x1a,0xc7,0x6c,0xee,0x2, 0x1b,0xdd,0x74,0x7, +0xac,0xbe,0x9, 0xb5,0xe, 0x11,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x1b,0xdb,0x6c,0xff, +0xa, 0x3f,0x9, 0xb3,0x13,0xd4,0x60,0x3, 0x2, 0x1b,0xd4,0x74,0x1, 0x19,0xb3,0x13, +0xd4,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0x50,0x2, +0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19,0xf5,0xe, +0x11,0x2, 0x1b,0xdb,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xb5,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0x99,0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13,0xd4,0xbe,0xb0,0x1, +0x78,0x3, 0x2, 0x1c,0x11,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x14,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, +0x28,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xcf,0x7e,0xf3,0xf, 0x1b,0x6c,0xee,0xa, 0x3e, +0x9, 0xb3,0x13,0xd4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x6a,0xa, 0x3e,0x2e,0x35, +0x23,0x9, 0xb3,0x0, 0xa, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x43,0x74,0x3, 0x19, +0xb3,0x0, 0xa, 0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xa3,0x0, 0xa, 0xbe,0xa0,0x3, 0x68, +0x3, 0x2, 0x1c,0x5b,0xe4,0x7a,0x39,0xb0,0x2, 0x1c,0x98,0x4c,0xaa,0x68,0x3, 0x2, +0x1c,0x98,0x74,0x2, 0x7a,0x39,0xb0,0x2, 0x1c,0x98,0xa, 0x3e,0x2e,0x35,0x23,0x9, +0xb3,0x0, 0xa, 0xbe,0xb0,0x2, 0x78,0x3, 0x2, 0x1c,0x80,0x60,0x3, 0x2, 0x1c,0x93, +0x74,0x1, 0x7a,0x39,0xb0,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4,0x19,0xe5,0xe, 0x11, +0x2, 0x1c,0x98,0x74,0x3, 0x7a,0x39,0xb0,0xa, 0x2e,0x2e,0x25,0x23,0x7e,0x29,0x70, +0x19,0x72,0x0, 0xa, 0xb, 0xe0,0xbe,0xe0,0xa, 0x50,0x3, 0x2, 0x1c,0x1e,0xda,0x3b, +0x22,0xca,0x3b,0x75,0x24,0x0, 0x75,0x26,0x0, 0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e, +0x34,0xe, 0xdf,0x7a,0x35,0x2a,0x7e,0xa3,0xf, 0x24,0x4c,0xaa,0x78,0xf, 0x7e,0xb3, +0xf, 0x20,0x70,0x9, 0x7e,0xb3,0xf, 0x21,0x70,0x3, 0x2, 0x1f,0x70,0x4c,0xaa,0x78, +0x11,0x7e,0xb3,0xf, 0x20,0x60,0x16,0x80,0x9, 0x7e,0x73,0x16,0xba,0xbe,0x70,0xf, +0x38,0x6, 0x7e,0xb3,0x15,0xde,0x60,0xf1,0xe4,0x7a,0xb3,0x15,0xde,0x20,0x0, 0x6, +0x7e,0x74,0x0, 0x76,0x80,0x4, 0x7e,0x74,0x0, 0xb8,0x7d,0x37,0x7e,0x24,0x0, 0x42, +0x74,0xff,0x12,0x6e,0x21,0x74,0xaa,0x7a,0x79,0xb0,0x19,0xb7,0x0, 0x1, 0x7e,0x73, +0xf, 0x1d,0x19,0x77,0x0, 0x3, 0x75,0x25,0x0, 0x6c,0xdd,0x2, 0x1e,0xfd,0x7e,0x70, +0x7, 0xac,0x7d,0x9, 0xa3,0xe, 0x9d,0x7a,0xa1,0x29,0x7c,0xba,0x54,0xf, 0xa, 0x2b, +0x2e,0x25,0x2a,0x7e,0x29,0xc0,0x7c,0xba,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x13,0xb4, +0xb0,0x2, 0x80,0x3, 0x2, 0x1e,0xfb,0x53,0x29,0xf, 0xbe,0xc0,0x1, 0x68,0x3, 0x2, +0x1e,0xfb,0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x1e,0xfb,0x7e,0xa1,0x25,0x74,0x6, 0xa4, +0xf5,0x21,0x9, 0xb3,0xe, 0x9e,0xf5,0x27,0x74,0x7, 0xac,0xbd,0x9, 0xb5,0xe, 0x9f, +0xc4,0x54,0xf0,0xf5,0x28,0x7e,0x73,0xf, 0x46,0xbe,0x71,0x29,0x28,0x68,0x7e,0xb3, +0xf, 0x22,0x70,0x2a,0x7e,0x8, 0x0, 0x27,0xe5,0x29,0xa, 0x3b,0x2e,0x34,0x15,0xca, +0x74,0x1, 0x7e,0x50,0xf, 0x12,0x5f,0xe0,0x7e,0x8, 0x0, 0x28,0xe5,0x29,0xa, 0x3b, +0x2e,0x34,0x15,0xd4,0x74,0x10,0x7e,0x50,0x20,0x12,0x5f,0xe0,0x80,0x14,0xe5,0x29, +0xa, 0x3b,0x9, 0xb3,0x15,0xca,0xf5,0x27,0xe5,0x29,0xa, 0x3b,0x9, 0xb3,0x15,0xd4, +0xf5,0x28,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x2e,0x25,0x2a,0x7e,0x29,0xb0,0xb4,0x1, +0x15,0xe4,0x19,0xb3,0x15,0xca,0x6c,0xaa,0xe5,0x29,0xa, 0x3b,0x19,0xa3,0x15,0xd4, +0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0xf, 0x5f,0xb4,0xff,0x15,0x74,0x7, 0xac, +0xbd,0x9, 0xb5,0xe, 0x9d,0xbe,0xb0,0xff,0x68,0x5, 0x75,0x27,0x1, 0x80,0x3, 0x75, +0x27,0x0, 0x7e,0x90,0x7, 0xac,0x9d,0x49,0x54,0xe, 0x99,0x7a,0x55,0x2c,0x49,0x54, +0xe, 0x9b,0x7a,0x55,0x2e,0xbe,0xc0,0x1, 0x78,0x2e,0x75,0x30,0x0, 0x7e,0x71,0x30, +0x74,0x7, 0xac,0x7b,0x9, 0xb3,0x15,0xe3,0x54,0xf, 0xbe,0xb1,0x29,0x78,0x10,0x49, +0x23,0x15,0xdf,0x7a,0x25,0x2c,0x49,0x53,0x15,0xe1,0x7a,0x55,0x2e,0x80,0x9, 0x5, +0x30,0xe5,0x30,0xbe,0xb0,0xa, 0x40,0xd5,0x7e,0x25,0x2c,0x7a,0x25,0x22,0xa, 0x54, +0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x21,0xa, 0x3b,0x7d,0x13,0x2d,0x17,0x19,0xa1, +0x0, 0x5, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x6, 0x7e,0x25,0x2e,0x7a,0x25,0x22, +0xa, 0x14,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x57,0x19,0x35,0x0, 0x7, 0x7d,0x53, +0x2d,0x57,0x19,0x55,0x0, 0x8, 0xe5,0x27,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0x9, +0xe5,0x28,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0xa, 0x9, 0xa4,0xe, 0x9d,0x7c,0xba, +0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x27,0x2e,0x24,0x0, 0x7, 0x7e,0x29,0xb0, +0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x21,0xbe,0xc0,0x1, 0x68,0x2, 0x5, +0x24,0x5, 0x26,0x7c,0xbc,0x3, 0x3, 0x54,0xc0,0x7d,0x13,0x2d,0x17,0x2e,0x14,0x0, +0x5, 0x7e,0x19,0x50,0x2c,0x5b,0x7a,0x19,0x50,0x80,0xe, 0x2d,0x37,0x2e,0x34,0x0, +0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x25,0xb, 0xd0,0x7e,0x73,0xf, +0x46,0xbc,0x7d,0x28,0x3, 0x2, 0x1d,0x2e,0xe5,0x24,0x19,0xb7,0x0, 0x4, 0xe5,0x26, +0xbe,0xb0,0x0, 0x28,0x2d,0x74,0x42,0x19,0xb7,0x0, 0x2, 0xe4,0x19,0xb7,0x0, 0x41, +0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e,0x24,0x0, 0x41,0x7e, +0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x41,0x78,0xe4,0xb2,0x0, +0x80,0xe, 0x7e,0xb3,0xf, 0x21,0xb4,0x1, 0xc, 0x7e,0xb3,0x10,0xd1,0xb4,0x24,0x5, +0x74,0x1, 0x12,0x6e,0xd3,0x7e,0xb3,0xf, 0x20,0x60,0x6, 0x7e,0x35,0x2a,0x12,0x68, +0x79,0xe4,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x20,0x7a,0xb3,0xf, 0x21,0x80,0x4, +0xe4,0x12,0x6e,0xd3,0x7e,0x24,0xe, 0x99,0x7e,0x34,0x15,0xdf,0x7e,0x14,0x0, 0x46, +0x12,0x6d,0x7d,0xe5,0x26,0x70,0xd, 0x7e,0x34,0x15,0xdf,0x7e,0x24,0x0, 0x46,0x74, +0xff,0x12,0x6e,0x21,0xda,0x3b,0x22,0xca,0x79,0x75,0x26,0x17,0x7e,0xb3,0xd, 0xf7, +0xf5,0x21,0x70,0x3, 0x2, 0x22,0x39,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x1, 0x2b,0xe4, +0x12,0x6e,0x21,0x7e,0x34,0x14,0xe1,0x7e,0x24,0x0, 0x2, 0xe4,0x12,0x6e,0x21,0x6c, +0xaa,0x2, 0x20,0x4e,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, 0x18,0x9, 0x23,0xd, +0x19,0x1a,0x3, 0x1b,0x5, 0x80,0x69,0xbe,0x10,0x0, 0x48,0x62,0xbe,0x10,0xd, 0x58, +0x5d,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, +0x7e,0x74,0x0, 0x1, 0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x7c,0xef,0xa, 0x40,0x2e, +0x44,0x14,0xe1,0x7e,0x49,0xb0,0x4c,0xbe,0x7a,0x49,0xb0,0x1a,0x32,0x1b,0x35,0x7c, +0xf7,0x80,0x1f,0xbe,0xf0,0x0, 0x48,0x18,0xe5,0x26,0xbc,0xbf,0x8, 0x12,0x74,0x1, +0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0x4f,0x2d,0x43,0x19,0xb4,0x13,0xb6, +0xb, 0xf0,0x1a,0x22,0x2e,0x24,0x0, 0x3, 0x1a,0x3f,0xbd,0x32,0x48,0xd5,0xb, 0x10, +0x1a,0x23,0x2e,0x24,0x0, 0x3, 0x1a,0x31,0xbd,0x32,0x48,0x8b,0xb, 0xa0,0xe5,0x21, +0xbc,0xba,0x28,0x3, 0x2, 0x1f,0xc4,0x6c,0x11,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, +0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0xe9,0xa, 0x30,0x9, 0xb3,0x14,0xe1,0x5c,0xbe,0x78,0x3, 0x2, +0x21,0x15,0x6d,0x33,0x7a,0x35,0x22,0x75,0x24,0x0, 0x1a,0x21,0x7e,0x34,0x0, 0x30, +0xad,0x32,0x7d,0x43,0x2e,0x47,0xf, 0xda,0x6c,0x0, 0x80,0x26,0x1a,0xe1,0x7e,0xf4, +0x0, 0x17,0xad,0xfe,0xa, 0x30,0x2d,0x3f,0x9, 0xb3,0x13,0xb6,0x70,0x12,0x7e,0x70, +0x2, 0xac,0x70,0x2d,0x34,0xb, 0x38,0x30,0x2e,0x35,0x22,0x7a,0x35,0x22,0x5, 0x24, +0xb, 0x0, 0xe5,0x26,0xbc,0xb0,0x38,0xd4,0xe5,0x24,0x60,0x49,0xe5,0x24,0x1a,0x2b, +0x7e,0x35,0x22,0x12,0x48,0x53,0x7a,0x35,0x22,0x6c,0xff,0x80,0x32,0x1a,0x21,0x7e, +0x34,0x0, 0x17,0xad,0x32,0x1a,0xff,0x7d,0xe3,0x2d,0xef,0x9, 0xbe,0x13,0xb6,0xb4, +0x1, 0x1b,0x1a,0x21,0x7e,0x34,0x0, 0x18,0xad,0x32,0x7d,0x23,0x2d,0x2f,0x3e,0x24, +0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x9e,0x35,0x22,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x26,0xbc,0xbf,0x18,0xc8,0xb, 0x10,0xa5,0xb9,0xd, 0x2, 0x80,0x3, 0x2, 0x20,0x59, +0x6c,0xaa,0x2, 0x22,0x30,0x7e,0x10,0x2, 0xac,0x1a,0x9, 0x30,0xd, 0x18,0x9, 0x20, +0xd, 0x19,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xf5,0x25,0x7c,0xba,0x54,0x7, 0x7e,0x44, +0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa5,0xbb,0x0, 0x2c,0x1a, +0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, +0xda,0xb, 0x38,0x20,0x49,0x33,0x0, 0x30,0xbd,0x32,0x18,0x3, 0x2, 0x21,0xf5,0x1a, +0x33,0xb, 0x34,0x7c,0xb7,0x19,0xb0,0xd, 0x18,0x80,0x7a,0xa5,0xbb,0xc, 0x2c,0x1a, +0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x22,0x2d,0x23,0x3e,0x24,0x2e,0x27,0xf, +0xda,0xb, 0x28,0x30,0x49,0x2, 0xff,0xd0,0xbd,0x3, 0x8, 0x59,0x1a,0x33,0x1b,0x34, +0x7e,0x10,0x2, 0xac,0x1a,0x19,0x70,0xd, 0x18,0x80,0x4a,0x1a,0xe3,0x7e,0xf4,0x0, +0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x49,0x43,0x0, +0x30,0x49,0x3, 0xff,0xd0,0xbd,0x4, 0x8, 0x16,0xb, 0x38,0x20,0xbd,0x2, 0x8, 0x25, +0x1a,0x23,0x1b,0x24,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x50,0xd, 0x18,0x80,0x16,0xb, +0x38,0x0, 0xbd,0x40,0x8, 0xf, 0x1a,0x33,0xb, 0x34,0x7c,0x37,0x7e,0x10,0x2, 0xac, +0x1a,0x19,0x30,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, 0x18,0x1a,0x23, +0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x2, 0x2d,0x3, 0x3e,0x4, 0x2e,0x7, 0xf, 0xda, +0xb, 0x8, 0x0, 0xbe,0x4, 0x0, 0x3c,0x58,0x15,0x7c,0x7e,0x6e,0x70,0xff,0xe5,0x25, +0xa, 0x4b,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x5c,0xb7,0x7a,0x49,0xb0,0xb, 0xa0, +0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x21,0x25,0xda,0x79,0x22,0xca,0xd8,0xca,0x79, +0x6c,0xaa,0x7e,0x34,0x11,0x9e,0x7e,0x44,0x11,0x4a,0xe4,0x7a,0xb3,0x16,0xbb,0x7e, +0xb3,0xe, 0xa, 0x54,0xfe,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, 0x17,0xbe,0xb0,0x0, +0x28,0x4f,0x7e,0x53,0xd, 0xf8,0xbe,0x50,0x0, 0x28,0x46,0x6c,0xff,0x80,0x3c,0x7e, +0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x40,0x9, 0xe1,0xd, 0x41,0x7e,0x30,0x2, 0xac, +0x3e,0x2d,0x13,0xb, 0x18,0x0, 0x6d,0x11,0x9e,0x17,0xf, 0x4c,0xbd,0x1, 0x58,0x19, +0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x13,0x49,0x1, 0x0, 0x30,0x6d,0x11,0x9e,0x17,0xf, +0x4a,0xbd,0x1, 0x58,0x4, 0x5, 0x1d,0x80,0xb, 0xb, 0xf0,0xbc,0x5f,0x38,0xc0,0x80, +0x3, 0x75,0x1d,0x0, 0xe5,0x1d,0xbe,0xb0,0x3, 0x40,0x17,0x7e,0xb3,0xe, 0xa, 0x44, +0x1, 0x7a,0xb3,0xe, 0xa, 0x75,0x1d,0x0, 0x7e,0xb3,0x16,0xbb,0x44,0x1, 0x7a,0xb3, +0x16,0xbb,0x7e,0xb3,0xe, 0xa, 0x54,0xfd,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, 0x16, +0x70,0x59,0x7e,0x53,0xd, 0xf7,0xbe,0x50,0x0, 0x28,0x50,0x6c,0xff,0x80,0x48,0x7e, +0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x18,0x9, 0xe1,0xd, 0x19,0x7e,0x30,0x2, 0xac, +0x3d,0x2d,0x14,0x49,0x11,0x0, 0x30,0x6d,0x0, 0x9e,0x7, 0xd, 0xff,0xbd,0x10,0x48, +0xe, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x14,0xb, 0x18,0x10,0xbd,0x10,0x58,0x16,0x7e, +0xb3,0xe, 0xa, 0x44,0x2, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x2, 0x7a, +0xb3,0x16,0xbb,0x80,0x6, 0xb, 0xf0,0xbc,0x5f,0x38,0xb4,0x7e,0xb3,0xe, 0x9, 0xb4, +0x1, 0x2, 0x80,0x3, 0x2, 0x23,0xdf,0x7e,0xb3,0xd, 0x16,0x70,0x6d,0x6c,0xff,0x80, +0x61,0x7e,0x50,0x2, 0xac,0x5f,0x7d,0x12,0x2d,0x14,0xb, 0x18,0x10,0xbe,0x17,0xd, +0xff,0x8, 0x4d,0x2d,0x23,0xb, 0x28,0x20,0xbe,0x27,0xd, 0xff,0x58,0x42,0xbe,0xf1, +0x1e,0x68,0x6, 0x7a,0xf1,0x1e,0x75,0x1f,0x0, 0xbe,0xf1,0x1e,0x78,0x2, 0x5, 0x1f, +0xe5,0x1f,0xbe,0xb0,0x10,0x28,0x33,0x75,0x1f,0x10,0xe5,0x51,0x70,0x16,0x7e,0xb3, +0xe, 0xa, 0x44,0x4, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x4, 0x7a,0xb3, +0x16,0xbb,0x80,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x80,0xa, +0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0x97,0x6c,0xaa,0x6c,0xff,0x80,0x17, +0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x34,0xb, 0x38,0x30,0xbe,0x37,0xd, 0xff,0x8, 0x5, +0x7e,0xa0,0x1, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0xe1,0x4c, +0xaa,0x78,0x1a,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x75,0x1e,0xff, +0x75,0x1f,0x0, 0x7e,0xb3,0x16,0xbb,0x54,0xfb,0x7a,0xb3,0x16,0xbb,0x7e,0xb3,0xe, +0xa, 0x54,0xf7,0x7a,0xb3,0xe, 0xa, 0x7e,0x73,0xd, 0xfa,0xa, 0x27,0x7e,0x73,0xd, +0xf9,0xa, 0x37,0x2d,0x32,0xbe,0x37,0xe, 0x3, 0x28,0x14,0x7e,0xb3,0xe, 0xa, 0x44, +0x8, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x8, 0x7a,0xb3,0x16,0xbb,0x7e, +0xb3,0xe, 0xa, 0x44,0x10,0x7a,0xb3,0xe, 0xa, 0x6c,0xff,0x80,0x49,0x7e,0x50,0x2, +0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70,0x18,0xac,0x7d,0xa, +0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x49,0x22,0x10,0x3, +0x9d,0x32,0x7a,0x35,0x21,0x12,0x6e,0x11,0xbe,0x37,0xe, 0x1, 0x28,0x16,0x7e,0xb3, +0xe, 0xa, 0x54,0xef,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x10,0x7a,0xb3, +0x16,0xbb,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xaf,0x7e,0x34, +0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x12,0x6e,0x21,0x6c,0xff,0x80,0x25,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70,0x18,0xac,0x7d, +0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x59,0x32,0x10, +0x3, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xd3,0xda,0x79,0xda,0xd8,0x22, +0xca,0x3b,0x6d,0x33,0x7a,0x35,0x21,0x75,0x25,0x0, 0x75,0x26,0x0, 0x7e,0x23,0xd, +0xf7,0x7a,0x21,0x23,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x13,0xb6,0x7e,0x30,0x2, 0xac, +0x23,0x7e,0x24,0xd, 0x18,0x7e,0x34,0x13,0xb8,0x12,0x6d,0x7d,0xe5,0x23,0xbe,0xb0, +0xa, 0x38,0x3, 0x2, 0x26,0xd5,0x75,0x24,0x0, 0x6c,0xff,0x2, 0x25,0xe9,0x7e,0x34, +0x3, 0xff,0x7a,0x35,0x27,0x75,0x26,0xff,0x6c,0xee,0x80,0x7e,0x7e,0x70,0x2, 0xac, +0x7e,0x9, 0xb3,0x13,0xb8,0xbe,0xb0,0xff,0x68,0x6e,0x7c,0xbe,0xc4,0x23,0x54,0x1f, +0x7c,0xab,0x7a,0xa1,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e, +0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x2c,0xa, 0x2a,0x9, 0xb2,0xd, 0x68,0x55,0x2c, +0x68,0x46,0x9, 0x73,0x13,0xb9,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa3, +0xa, 0x37,0x9d,0x32,0x12,0x6e,0x11,0x7d,0x63,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x13, +0xb8,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa2,0xa, 0x37,0x9d,0x32,0x12, +0x6e,0x11,0x2d,0x36,0x7a,0x35,0x29,0x7e,0x35,0x27,0xbe,0x35,0x29,0x28,0x9, 0x7e, +0x35,0x29,0x7a,0x35,0x27,0x7a,0xe1,0x26,0xb, 0xe0,0xe5,0x23,0xbc,0xbe,0x28,0x3, +0x2, 0x25,0x1c,0xe5,0x26,0xbe,0xb0,0xff,0x68,0x3d,0x7e,0x71,0x26,0x74,0x2, 0xac, +0x7b,0x9, 0x33,0x13,0xb8,0x7e,0x50,0x18,0xac,0x53,0x9, 0xa3,0x13,0xb9,0xa, 0xa, +0x2d,0x20,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28,0x20,0xbe,0x24,0x0, 0x3c,0x48, +0x16,0xe5,0x24,0x1a,0x2b,0x3e,0x24,0x19,0x32,0x13,0xe0,0x19,0xa2,0x13,0xe1,0x74, +0xff,0x19,0xb3,0x13,0xb8,0x5, 0x24,0xb, 0xf0,0xe5,0x11,0xbc,0xbf,0x28,0x3, 0x2, +0x25,0xe, 0x7e,0xf1,0x24,0x2, 0x26,0xbb,0x6d,0x33,0x7a,0x35,0x21,0x7e,0xa0,0xff, +0x6c,0xee,0x2, 0x26,0x8d,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0x7b,0x7a,0x71,0x2b, +0x7c,0xbe,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0xb9,0xf5,0x2c,0xa, 0x37,0x9, 0xb3,0xd, 0x68,0x55,0x2c,0x68,0x5e,0x7e,0x90,0x2, +0xac,0x9e,0x9, 0x44,0x13,0xb8,0xbe,0x40,0xff,0x68,0x50,0x7e,0x50,0x18,0xac,0x45, +0x9, 0xb4,0x13,0xb9,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28, +0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac, +0x5e,0x9, 0x62,0x13,0xb8,0x7e,0x30,0x18,0xac,0x36,0x9, 0x72,0x13,0xb9,0xa, 0x7, +0x2d,0x10,0x3e,0x14,0x2e,0x17,0x13,0xb6,0xb, 0x18,0x40,0xbe,0x45,0x21,0x8, 0xb, +0x7a,0x61,0x25,0x7a,0x71,0x26,0x7a,0x45,0x21,0x7c,0xae,0xb, 0xe0,0xe5,0x23,0xbc, +0xbe,0x28,0x3, 0x2, 0x26,0x5, 0xbe,0xa0,0xff,0x68,0x1e,0x7e,0x71,0x25,0x7e,0x90, +0x2, 0xac,0x9f,0x19,0x74,0x13,0xe0,0xe5,0x26,0x19,0xb4,0x13,0xe1,0x7e,0x70,0xff, +0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x13,0xb8,0xb, 0xf0,0xbe,0xf0,0xa, 0x50,0x3, +0x2, 0x25,0xf8,0x7e,0x24,0x13,0xe0,0x7e,0x34,0x13,0xb8,0x7e,0x14,0x0, 0x28,0x12, +0x6d,0x7d,0x75,0x23,0xa, 0x7e,0x34,0x15,0xa2,0x7e,0x24,0x0, 0x14,0x74,0xff,0x12, +0x6e,0x21,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0x55,0x7e,0x31,0x23,0x74,0x2, 0xac,0x3b, +0x7e,0x24,0x13,0xb8,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x7d,0x7e,0x31,0x23,0x74,0x2, +0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0x15,0xa2,0x12,0x6d,0x7d,0x6c,0xff,0x80, +0x27,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24,0xd, 0x68,0x7e,0x29, +0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xf0,0xe5,0x23,0xbc,0xbf,0x38,0xd3,0x85,0x23, +0x11,0xe5,0x23,0x7a,0xb3,0xd, 0xf7,0xda,0x3b,0x22,0x7c,0x7b,0xbe,0x70,0x10,0x40, +0x12,0xbe,0x70,0x4b,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x0, 0xfb,0x9e,0x34,0x0, 0x10, +0x2, 0x29,0x85,0xa5,0xbf,0x0, 0x3, 0xe5,0xb, 0x22,0xa5,0xbf,0x1, 0x3, 0xe5,0xd, +0x22,0xa5,0xbf,0x2, 0x5, 0x7e,0xb3,0xf, 0x28,0x22,0xbe,0x70,0x3, 0x40,0x12,0xbe, +0x70,0x5, 0x38,0xd, 0xa, 0x37,0x2e,0x34,0x10,0x2b,0x9e,0x34,0x0, 0x3, 0x2, 0x29, +0x85,0xa5,0xbf,0x6, 0x3, 0x74,0x1, 0x22,0xa5,0xbf,0x7, 0x5, 0x7e,0xb3,0x10,0x4b, +0x22,0xa5,0xbf,0x8, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xac,0x22, +0x7e,0xb3,0x11,0x16,0x22,0xa5,0xbf,0x9, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e, +0xb3,0xa, 0xad,0x22,0x7e,0xb3,0x11,0x49,0x22,0xa5,0xbf,0xa, 0x5, 0x7e,0xb3,0x10, +0x3b,0x22,0xa5,0xbf,0xb, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xae, +0x22,0x7e,0xb3,0x11,0x94,0x22,0xa5,0xbf,0xc, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, +0x7e,0xb3,0xd, 0xfe,0x22,0x7e,0xb3,0x11,0x9d,0x22,0xa5,0xbf,0x4c,0x5, 0x7e,0xb3, +0xf, 0x46,0x22,0xa5,0xbf,0xfb,0x3, 0xe5,0x8, 0x22,0xa5,0xbf,0x4e,0x5, 0x7e,0xb3, +0x10,0x4a,0x22,0xbe,0x70,0x50,0x40,0x12,0xbe,0x70,0x51,0x38,0xd, 0xa, 0x37,0x2e, +0x37,0x10,0x2f,0x9e,0x34,0x0, 0x50,0x2, 0x29,0x85,0xbe,0x70,0x52,0x40,0x12,0xbe, +0x70,0x55,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x31,0x9e,0x34,0x0, 0x52,0x2, 0x29, +0x85,0xbe,0x70,0x56,0x40,0x12,0xbe,0x70,0x62,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10, +0x33,0x9e,0x34,0x0, 0x56,0x2, 0x29,0x85,0xbe,0x70,0x63,0x40,0x12,0xbe,0x70,0x7a, +0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x63,0x2, 0x29,0x85,0xbe, +0x70,0x7b,0x50,0x3, 0x2, 0x29,0x19,0xbe,0x70,0x9f,0x28,0x3, 0x2, 0x29,0x19,0x7e, +0xb3,0x10,0x3b,0x70,0x4a,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58, +0x22,0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba, +0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e, +0xa0,0x80,0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70, +0xa, 0x57,0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0xdc,0x22,0xa, +0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x22,0xa, 0x37,0x2e,0x37,0x10, +0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e, +0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e,0xa0,0x80,0x15,0xa, 0x37,0x2e, +0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70,0xa, 0x57,0x2e,0x54,0x0, 0x18, +0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0x63,0x22,0xbe,0x70,0xa0,0x40,0x11,0xbe,0x70, +0xac,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6c,0x9e,0x34,0x0, 0xa0,0x80,0x56,0xbe, +0x70,0xad,0x40,0x11,0xbe,0x70,0xb9,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6e,0x9e, +0x34,0x0, 0xad,0x80,0x40,0xbe,0x70,0xba,0x40,0x11,0xbe,0x70,0xd1,0x38,0xc, 0xa, +0x37,0x2e,0x37,0x10,0x70,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe,0x70,0xd2,0x40,0x11, +0xbe,0x70,0xd5,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x72,0x9e,0x34,0x0, 0xd2,0x80, +0x14,0xbe,0x70,0xd6,0x40,0x13,0xbe,0x70,0xed,0x38,0xe, 0xa, 0x37,0x2e,0x37,0x10, +0x74,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xa5,0xbf,0xf8,0x5, 0x7e,0xb3,0x11, +0xe8,0x22,0xa5,0xbf,0xfe,0x3, 0xe5,0xc, 0x22,0x74,0xff,0x22,0xca,0x3b,0x7e,0x34, +0x22,0xc4,0x7a,0x35,0x25,0x7e,0x34,0x13,0xff,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6e, +0x21,0x75,0x24,0x1, 0x7e,0x73,0x10,0x4d,0x7a,0x73,0x13,0xb6,0xe4,0x7a,0xb3,0x10, +0x4d,0x75,0x22,0x0, 0x6c,0xee,0x80,0x12,0xa, 0x3e,0x2e,0x37,0x10,0x6e,0x7e,0x39, +0xb0,0xbe,0xb1,0x22,0x40,0x2, 0xf5,0x22,0xb, 0xe0,0x7e,0x73,0x10,0x2b,0xbc,0x7e, +0x38,0xe6,0xe5,0x22,0xbe,0xb0,0x1f,0x50,0xe, 0xe5,0x22,0xa, 0x4b,0x7e,0x54,0x0, +0x1f,0x9d,0x54,0xf5,0x22,0x80,0x3, 0x75,0x22,0x0, 0x85,0x22,0x21,0x7e,0x34,0x10, +0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a,0xa5,0x2, 0x2b,0x9a,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x12, +0x69,0x64,0x12,0x6e,0xb9,0x60,0xfb,0xa9,0xb7,0xea,0x7e,0x37,0xf, 0xda,0x7e,0x27, +0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2,0x6c,0xee,0x80,0x78,0x6c,0xff,0x80, +0x6a,0x4c,0xee,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3,0x13,0xe7,0x6d,0x33,0x74,0x2, +0xac,0xbf,0x59,0x35,0x13,0xb7,0xbe,0xf0,0x17,0x78,0x13,0x7e,0x34,0x0, 0x1, 0x7c, +0xbe,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x5e,0x34,0x4, 0x44,0x68,0x3b,0x7e,0x50, +0x30,0xac,0x5e,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x10,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0x7e,0x50,0x2, 0xac,0x5f, +0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xa, 0x3f,0x2e,0x34, +0x13,0xe7,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc, +0x7f,0x38,0x8e,0xb, 0xe0,0x7e,0x73,0x10,0x2b,0xbc,0x7e,0x38,0x80,0x75,0x23,0x0, +0x6c,0xee,0x2, 0x2b,0x78,0xa, 0x3e,0x9, 0xa3,0x13,0xe7,0x4c,0xaa,0x78,0xf, 0x7e, +0x44,0x22,0xc4,0x7e,0x70,0x2, 0xac,0x7e,0x59,0x43,0x13,0xb7,0x80,0x25,0x7e,0x50, +0x2, 0xac,0x5e,0x49,0x12,0x13,0xb7,0xa, 0xa, 0x8d,0x10,0x59,0x12,0x13,0xb7,0x2e, +0x24,0x13,0xb7,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x34,0x22,0xc4,0x7a,0x35,0x25,0x7e,0x64,0x3, 0xe8,0x7e,0x70, +0x2, 0xac,0x7e,0x49,0x23,0x13,0xb7,0x7e,0x15,0x25,0x9d,0x16,0xbd,0x21,0x50,0x23, +0xa, 0x1e,0x2e,0x14,0x13,0xff,0x7e,0x19,0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1e,0x2e, +0x17,0x10,0x74,0x7e,0x19,0xb0,0xbe,0xb1,0x22,0x50,0x32,0x4, 0x7a,0x19,0xb0,0x80, +0x35,0x80,0x2a,0x7d,0x36,0x2e,0x35,0x25,0xbd,0x23,0x28,0x28,0xa, 0x3e,0x2e,0x34, +0x13,0xff,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xa, 0x3e,0x2e,0x37,0x10,0x74,0x7e, +0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14,0x7a,0x39,0xb0,0x80,0x9, 0x5, 0x23,0x75, +0x24,0x0, 0x80,0x2, 0x5, 0x23,0xb, 0xe0,0x7e,0x73,0x10,0x2c,0xbc,0x7e,0x28,0x3, +0x2, 0x2a,0xc5,0x7e,0x34,0x10,0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a, +0xa5,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x23,0x68,0xf, 0x7e,0xa1,0x21,0x7c,0xba,0x14, +0xf5,0x21,0x4c,0xaa,0x68,0x3, 0x2, 0x2a,0xe, 0x7e,0x73,0x13,0xb6,0x7a,0x73,0x10, +0x4d,0x6c,0xff,0x80,0x12,0xa, 0x3f,0x9, 0x73,0x13,0xff,0xbe,0x71,0x22,0x78,0x5, +0x75,0x24,0x0, 0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0xe6,0xe5, +0x24,0xda,0x3b,0x22,0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20,0x0, 0x41, +0x0, 0x42,0x0, 0x22,0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40,0x0, 0xa3, +0x0, 0xa5,0x0, 0x44,0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60,0x0, 0xe5, +0x0, 0xe8,0x0, 0x66,0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80,0x1, 0x47, +0x1, 0x4b,0x0, 0x88,0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0,0x1, 0x89, +0x1, 0xad,0x0, 0xaa,0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xaa,0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0,0x1, 0x69, +0x1, 0x6c,0x0, 0x88,0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80,0x1, 0x27, +0x1, 0x9, 0x0, 0x66,0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60,0x0, 0xc5, +0x0, 0xc6,0x0, 0x44,0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40,0x0, 0x83, +0x0, 0x64,0x0, 0x22,0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20,0x0, 0x21, +0x0, 0x21,0x0, 0x0, 0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0xca,0x3b,0x7e,0xb3,0x10,0x3c,0xf5,0x21,0xe4,0x7a,0xb3,0x10, +0x3c,0x7e,0xb3,0x10,0x3a,0xf5,0x22,0x74,0x3, 0x7a,0xb3,0x10,0x3a,0x7e,0x37,0x10, +0x48,0x7e,0x24,0x0, 0x25,0xe4,0x12,0x6e,0x21,0x7e,0xe0,0x7, 0x6d,0x33,0x7a,0x37, +0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x6c,0xdd,0x7e, +0x14,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0xa, 0x2d,0x2e,0x27, +0x10,0x48,0x7e,0x29,0x70,0x4c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78, +0xde,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12, +0x6e,0xc2,0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x6f,0x12,0x55,0x3a,0x6c,0xdd, +0xbe,0xd0,0x18,0x50,0x1e,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf, +0x30,0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x16,0x1e, +0xf0,0x80,0x12,0xa, 0x3d,0x2e,0x37,0x10,0x33,0x9, 0x73,0xff,0xe8,0xa, 0x37,0x2e, +0x34,0x0, 0x18,0x7c,0xf7,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0xb, 0x38, +0x30,0xbe,0x34,0x25,0x80,0x18,0x21,0x7e,0x34,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7d,0x13,0x6e,0x14,0xff,0xff,0xa, 0x2f,0x2e,0x27,0x10,0x48, +0x7e,0x29,0x70,0x5c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78,0x91,0x1b, +0xe0,0xbe,0xe0,0x0, 0x48,0x3, 0x2, 0x2e,0x1c,0x7e,0xe0,0xa, 0x74,0x2, 0x7a,0xb3, +0x10,0x3a,0x2, 0x2f,0xeb,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a, +0x37,0xa, 0xaf,0x12,0x6f,0x10,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c, +0xa, 0x65,0x2d,0x63,0x7c,0xcd,0x6c,0xdd,0x2, 0x2f,0xb3,0x7e,0xa3,0x10,0x2c,0xbc, +0xad,0x28,0x27,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf,0x30,0xe0, +0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x2, 0x1e,0xf0,0x7e, +0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x80,0x27,0xa, 0x2a,0xa, 0x3d,0x9d,0x32, +0x2e,0x37,0x10,0x33,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34,0x0, 0x18,0x7c,0xf7,0x7e, +0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xa4,0x9d, +0x35,0xb, 0x38,0x30,0x7a,0x35,0x23,0xbe,0x34,0x2e,0xe0,0x8, 0x18,0x4c,0xee,0x68, +0x30,0xa, 0x2f,0x2e,0x27,0x10,0x48,0x7e,0x29,0xb0,0xbe,0xb0,0xfe,0x50,0x22,0x4, +0x7a,0x29,0xb0,0x80,0x1c,0xbe,0x34,0x17,0x70,0x58,0x14,0xa, 0x3f,0x2e,0x37,0x10, +0x48,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x7a,0x39,0xb0,0x80,0x2, 0x1b, +0xc0,0xb, 0xd0,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c,0xa, 0x25,0x2d, +0x23,0xa, 0x3d,0xbd,0x32,0x58,0x3, 0x2, 0x2f,0x1b,0x4c,0xcc,0x68,0x28,0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60, +0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x6f,0x12,0x55,0x3a,0x7c,0xae,0x1b,0xe0,0x4c, +0xaa,0x68,0x3, 0x2, 0x2e,0xf5,0xe5,0x21,0x7a,0xb3,0x10,0x3c,0xe5,0x22,0x7a,0xb3, +0x10,0x3a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x24,0x15,0x56,0x7e,0x34,0x13, +0xfe,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0xb6, +0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x13,0xfc,0x7e, +0x73,0xf, 0x1c,0x7a,0x73,0x13,0xfd,0x7e,0xa3,0x13,0xfc,0xbe,0xa0,0x1, 0x38,0x3, +0x7e,0xf0,0x1, 0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0xe4,0x80,0x10,0x7e,0xb3,0x15,0xa1, +0x4, 0x7a,0xb3,0x15,0xa1,0xbe,0xb0,0xc8,0x28,0x6, 0x74,0x14,0x7a,0xb3,0x15,0xa1, +0x7e,0xb3,0x15,0xa1,0xbe,0xb0,0x6, 0x50,0x3, 0x7e,0xf0,0x1, 0xbe,0xa0,0x1, 0x28, +0x3f,0x7e,0x34,0x0, 0x21,0x7e,0x24,0x0, 0x23,0x7e,0x14,0x13,0xfe,0x12,0x66,0x16, +0x7e,0x34,0x0, 0x25,0x7e,0x24,0x0, 0x27,0x7e,0x14,0x13,0xb6,0x12,0x66,0x16,0x7e, +0x35,0x25,0x9e,0x35,0x21,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x80,0x18,0xf, 0x7e,0x35, +0x27,0x9e,0x35,0x23,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x80,0x8, 0x3, 0x7e,0xf0,0x1, +0xbe,0xf0,0x0, 0x28,0x3, 0x2, 0x31,0x63,0x7e,0xf3,0x15,0x9f,0xbe,0xf3,0x15,0x29, +0x50,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73,0x13,0xfc,0x28,0x12,0x7e,0x24,0x15,0x56, +0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x2, 0x31,0x63,0x7e,0x73, +0x15,0x9e,0xbe,0x70,0x2, 0x58,0x22,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e, +0x14,0x0, 0x48,0x12,0x6d,0x7d,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15, +0x53,0x7e,0xb3,0x15,0x9e,0x4, 0x2, 0x31,0x9f,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4, +0x7a,0xb3,0x15,0x53,0x2, 0x31,0x9f,0xbe,0xf3,0x15,0x29,0x78,0x2d,0x7e,0xa3,0x15, +0x29,0xbe,0xa3,0x13,0xfc,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3, +0x15,0x53,0x80,0x6b,0xbe,0xa3,0x13,0xfc,0x28,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x7a, +0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0x80,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73, +0x13,0xfc,0x50,0x1a,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48, +0x12,0x6d,0x7d,0xe4,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0x53,0x80,0x31,0x7e,0x73, +0x15,0x53,0xbe,0x70,0x2, 0x58,0x1c,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e, +0x14,0x0, 0x48,0x12,0x6d,0x7d,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0x7e,0xb3,0x15,0x53, +0x4, 0x80,0x7, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0xe4,0x7a, +0xb3,0x15,0x9e,0x7e,0xb3,0x15,0xa0,0x14,0x68,0x9, 0x4, 0x78,0x15,0x7e,0x24,0x13, +0xb6,0x80,0x4, 0x7e,0x24,0x14,0xe3,0x7e,0x34,0x15,0x56,0x7e,0x14,0x0, 0x48,0x12, +0x6d,0x7d,0x7e,0x73,0x15,0x29,0x7a,0x73,0x15,0x9f,0x7e,0x24,0x13,0xb6,0x7e,0x34, +0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x7e,0x24,0x15,0x56,0x7e,0x34,0xe, +0xd, 0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x7e,0x73,0x15,0x9c,0x7a,0x73,0xf, 0x1b, +0x7e,0x73,0x15,0x9d,0x7a,0x73,0xf, 0x1c,0xda,0xf8,0x22,0xca,0x79,0x7d,0x73,0x12, +0x61,0x38,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27,0x0, +0x27,0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c,0xe, +0x1b,0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49,0x27, +0x0, 0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34,0x1c, +0x14,0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c,0x67, +0x6c,0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38,0x10, +0x9, 0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, 0x25, +0x4d,0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27,0x7e, +0x34,0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c, +0xaa,0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e,0x34, +0x1c,0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e,0x34, +0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, 0x4b, +0x2d,0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0, +0x19,0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70, +0x2, 0xac,0x7a,0x2e,0x34,0x2b,0xd4,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e,0x24, +0x1c,0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x2d,0xd2, +0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e,0x34, +0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x2d,0xd4, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, 0xa0, +0xbe,0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x5e,0x27,0x49,0x27,0x0, 0x39,0x7e,0x34, +0x1c,0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38,0x20, +0x49,0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33,0x7e, +0x34,0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, 0xb7, +0x0, 0x1, 0x12,0x65,0x18,0x49,0x37,0x0, 0x47,0x12,0x7, 0xc9,0x49,0x37,0x0, 0x49, +0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x5d,0x1, 0x49,0x27,0x0, 0x35,0x7e, +0x34,0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22,0xca, +0x3b,0x6d,0x33,0x7a,0x35,0x23,0x7e,0xb3,0xf, 0x1b,0x60,0x6, 0x7e,0xb3,0xf, 0x1c, +0x60,0x11,0xe5,0x22,0x60,0x5, 0x75,0x18,0x1, 0x80,0x3, 0x75,0x18,0x0, 0xe5,0x18, +0x2, 0x35,0x5e,0x7e,0xb3,0xd, 0x18,0xf5,0x21,0x7e,0x73,0xd, 0x19,0x7a,0x71,0x22, +0x6d,0x66,0x75,0x25,0x0, 0x75,0x26,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x3a,0x7e,0x51, +0x21,0x74,0x18,0xac,0x5b,0x2d,0x27,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x10, +0xbe,0x14,0x0, 0x32,0x8, 0x28,0x5, 0x25,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0x8, 0x49, +0x12,0xff,0xd0,0x2d,0x61,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, 0x50,0x8, 0x49,0x22, +0x0, 0x30,0x2d,0x62,0x5, 0x26,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc0,0x7d,0x73, +0x80,0x38,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0x2d,0x37,0x3e,0x34,0x2e,0x37,0xf, +0xda,0xb, 0x38,0x20,0xbe,0x24,0x0, 0x32,0x8, 0x2c,0x5, 0x25,0xe5,0x21,0xbe,0xb0, +0x0, 0x28,0x8, 0x49,0x23,0xff,0xd0,0x2d,0x62,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, +0x50,0x8, 0x49,0x33,0x0, 0x30,0x2d,0x63,0x5, 0x26,0x7d,0x37,0xb, 0x34,0x7d,0x73, +0xbe,0x34,0x0, 0x18,0x48,0xbc,0xe5,0x25,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12,0x7d, +0x36,0x12,0x6e,0x11,0xe5,0x26,0xa, 0x2b,0x12,0x48,0x53,0xbe,0x34,0x0, 0xf, 0x8, +0x8, 0x75,0x18,0x1, 0x74,0x1, 0x2, 0x35,0x5e,0x6d,0x33,0xe5,0x21,0xbe,0xb0,0x0, +0x28,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0xff,0xd0,0x2d,0x32,0xe5,0x21,0xbe,0xb0,0xc, +0x50,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0x0, 0x30,0x2d,0x32,0x7e,0xa0,0x8, 0x80,0x2d, +0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2e,0x14,0x6e,0x1, 0x7a,0x31,0x82,0x7a,0x21, +0x83,0xe4,0x93,0x1a,0x1b,0xbd,0x13,0x8, 0x14,0x2e,0x24,0x6e,0x2, 0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x1a,0x2b,0x2e,0x25,0x23,0x7a,0x25,0x23,0x7c,0x5a,0x1b, +0xa0,0xa5,0xbd,0x0, 0xcb,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0xe5,0x22,0xa, 0x2b, +0x2d,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x12,0x6e,0x11,0xbe,0x34, +0x2, 0xbc,0x8, 0xa, 0x7e,0x35,0x23,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x23,0x7e,0x35, +0x23,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x23,0xe5,0x18, +0xa, 0x3b,0xbe,0x35,0x23,0x50,0x5, 0x7e,0x55,0x23,0xf5,0x18,0xe5,0x18,0xda,0x3b, +0x22,0xca,0x3b,0x7c,0x9b,0x7d,0xa3,0xbe,0x90,0x1, 0x28,0x1e,0xa, 0x15,0x1b,0x15, +0xa, 0x39,0xbd,0x31,0x58,0x14,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6, +0xb, 0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x80,0x7, 0xbe,0x90,0x1, 0x78,0x15,0x6d, +0xbb,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x94, +0x7d,0xc3,0x80,0x8, 0x4c,0x99,0x78,0x38,0x6d,0xcc,0x7d,0xbc,0x74,0x2, 0xac,0xb9, +0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x7e,0x70,0x2, 0xac, +0x79,0x2d,0x3a,0x49,0x33,0x0, 0x2, 0x12,0x6d,0x94,0x7d,0xe3,0x74,0x2, 0xac,0xb9, +0x7d,0xf5,0x2d,0xfa,0x49,0x3f,0x0, 0x4, 0x12,0x6d,0x94,0x7d,0xf3,0x2, 0x36,0x6c, +0x7c,0xb5,0x24,0xfe,0xbc,0xb9,0x78,0x46,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba, +0x1b,0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d, +0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x94,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d, +0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x74,0x2, 0xac,0xb9,0x2d, +0xa5,0x49,0x3a,0x0, 0x2, 0x12,0x6d,0x94,0x7d,0xe3,0x6d,0xff,0x80,0x3e,0x7c,0xb5, +0x14,0xbc,0xb9,0x78,0x37,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6,0xb, +0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35, +0xb, 0x38,0x30,0x12,0x6d,0x94,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d,0xd5,0x2d,0xda, +0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x6d,0xff,0x7d,0xef,0xa, 0x79,0x6d,0x66, +0x7f,0x3, 0x1b,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x7f,0x41,0x7f, +0x3, 0x1b,0xd, 0x7d,0x3b,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x41,0x7d,0x3d, +0x1a,0x26,0x1a,0x24,0xa, 0x19,0x6d,0x0, 0x12,0x48,0x85,0x2f,0x41,0xa, 0x19,0x6d, +0x0, 0xb, 0xc, 0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x41,0xa, 0x19, +0x6d,0x0, 0xb, 0xd, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x14,0x7d, +0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x5b,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1d,0x1a, +0x2, 0x1a,0x0, 0x2f,0x2, 0x7d,0x5e,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1f,0x1a, +0x2, 0x1a,0x0, 0x2f,0x2, 0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x48,0xa1,0x2e, +0x34,0x0, 0x20,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xf, 0x1b,0x7e,0x64,0xe, 0xdf, +0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7, +0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x5, 0x80,0x2, +0x74,0x3, 0x7a,0xb3,0xf, 0x26,0x74,0x1, 0x7a,0xb3,0xf, 0x27,0x4c,0xff,0x78,0xd, +0x75,0x19,0x0, 0x7e,0xb3,0xf, 0x26,0x12,0x6e,0xe2,0x2, 0x38,0x85,0xe5,0x51,0xb4, +0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, +0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xb4,0x1, +0x9, 0xe5,0x19,0x70,0x5, 0x75,0x16,0x5, 0xf5,0x17,0xe5,0x51,0xb4,0x1, 0x1b,0x7e, +0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, +0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xf5,0x19,0x6c,0xee,0x7e, +0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xe, 0x9d,0xf5,0x21,0xbe,0xb0,0xff,0x78,0x3, 0x2, +0x38,0x7b,0xe5,0x21,0xa, 0x2b,0x2d,0x26,0x7e,0x29,0xb0,0xb4,0x2, 0x2, 0x80,0x3, +0x2, 0x38,0x7b,0x49,0x33,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13, +0x74,0x12,0x6d,0xf1,0x7a,0x35,0x22,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0x9b,0x7e, +0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x76,0x12,0x6d,0xf1,0x7a,0x35,0x24,0xe5, +0x16,0xa, 0x3b,0xbe,0x35,0x22,0x28,0x59,0xbe,0x35,0x24,0x28,0x54,0x7e,0xa1,0x21, +0x74,0x4, 0xa4,0x49,0x35,0x13,0x74,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0x99,0x7e, +0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x76,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, +0x9b,0xe5,0x21,0xa, 0x3b,0x2d,0x36,0x7e,0x39,0xb0,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, +0x28,0x2, 0x1b,0xf0,0x4c,0xff,0x78,0x53,0x5, 0x17,0xe5,0x17,0xbe,0xb0,0x32,0x40, +0x3, 0x75,0x17,0x0, 0x7e,0x73,0xf, 0x27,0xbe,0x71,0x16,0x28,0x3e,0x5, 0x16,0x80, +0x3a,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4, +0x59,0x35,0x13,0x74,0x49,0x34,0xe, 0x9b,0x59,0x35,0x13,0x76,0x7e,0x73,0xf, 0x26, +0xbe,0x71,0x16,0x50,0x8, 0x7e,0xb3,0xf, 0x27,0xf5,0x16,0x80,0xb, 0x7e,0x73,0xf, +0x27,0xbe,0x71,0x16,0x50,0x2, 0x15,0x16,0x75,0x17,0x0, 0xb, 0xe0,0xbe,0xe0,0xa, +0x68,0x3, 0x2, 0x37,0x8f,0xda,0x3b,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0x10,0x2b, +0xf5,0x24,0x7e,0xe3,0x10,0x2c,0x1b,0xe0,0x6c,0xdd,0x7e,0x70,0x30,0xac,0x7d,0x2e, +0x37,0xf, 0xda,0x49,0x33,0x0, 0x2e,0x74,0x2, 0xac,0xbd,0x59,0x35,0x13,0xb6,0xb, +0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0x7e,0xb3,0xf, 0xd3,0xb4,0x1, 0x2, 0x80,0x3, 0x2, +0x39,0xff,0x6c,0xcc,0x2, 0x39,0xf0,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0xd, 0x18, +0xf5,0x22,0x9, 0xb3,0xd, 0x19,0xf5,0x23,0x75,0x21,0x3, 0x7e,0x73,0xe, 0x12,0xbe, +0x70,0x20,0x50,0xa, 0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x3, 0x75,0x21,0x1, 0x7e,0xb3, +0xd, 0xfd,0xb4,0x1, 0x3, 0x75,0x21,0x2, 0x74,0x8, 0x7a,0xb3,0xf, 0x53,0xe5,0x22, +0xbe,0xb0,0x0, 0x28,0x21,0xe5,0x24,0xa, 0x2b,0x1b,0x24,0xe5,0x22,0xa, 0x3b,0xbd, +0x32,0x58,0x13,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2e,0x1b,0x24,0xe5,0x23, +0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x21,0x2, 0x75,0x25,0x0, 0x80,0x45,0xe5,0x25, +0xbc,0xbc,0x68,0x3d,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a, +0xa1,0x26,0x9, 0xb3,0xd, 0x19,0xf5,0x27,0xa, 0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32, +0x12,0x6e,0x11,0xbe,0x34,0x0, 0x3, 0x18,0x18,0xe5,0x27,0xa, 0x2b,0xe5,0x23,0xa, +0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x21,0x1, 0x80, +0xb, 0x5, 0x25,0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x25,0x38,0xb2,0xe5,0x51,0xb4,0x1, +0x20,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x19,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x12,0x7e, +0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x9, 0x75,0x21,0x3, 0x74,0x1e,0x7a,0xb3,0xf, +0x53,0xe5,0x23,0xbe,0xb0,0x17,0x50,0x1a,0x6c,0xdd,0x6d,0x33,0x7e,0x50,0x30,0xac, +0x5d,0x2e,0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xec, +0x80,0x3, 0x75,0x21,0x0, 0xe5,0x21,0x7c,0x7c,0x7c,0x6f,0x12,0x11,0xa0,0x6c,0xdd, +0x74,0x2, 0xac,0xbd,0x49,0x35,0x13,0xb6,0x7e,0x50,0x30,0xac,0x5d,0x2e,0x27,0xf, +0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0xb, 0xf0,0xb, 0xc0, +0x7e,0x73,0xd, 0xf7,0xbc,0x7c,0x28,0x3, 0x2, 0x38,0xc7,0x7a,0xf3,0xd, 0xf7,0xda, +0x3b,0x22,0x7e,0x50,0x1, 0xe4,0x7a,0xb3,0xe, 0xb, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, +0x7e,0xa3,0xd, 0xf7,0x4c,0xaa,0x78,0x1d,0x7e,0x43,0xd, 0xf8,0xbe,0x40,0x0, 0x28, +0x14,0x7e,0x43,0x16,0xb7,0xbe,0x40,0x1, 0x28,0xb, 0x74,0x1, 0x7a,0xb3,0xe, 0xb, +0xe4,0x7a,0xb3,0x10,0x3d,0x4c,0xaa,0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x16,0xb7,0xe4, +0x7a,0xb3,0x16,0xb8,0xbe,0xa0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43, +0xd, 0xfc,0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43,0xd, 0x17, +0xbe,0x40,0x0, 0x28,0x6b,0x7e,0xb3,0x16,0xb1,0x70,0x65,0x7e,0xb3,0x16,0xb3,0x70, +0x5f,0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x6d,0x33,0x6c,0x44,0x7e,0x30,0x2, 0xac,0x34, +0x2e,0x17,0xf, 0xd6,0xb, 0x18,0x10,0xbd,0x13,0x58,0x2, 0x7d,0x31,0xb, 0x40,0xa5, +0xbc,0x25,0xe8,0xbe,0x34,0xf8,0xf8,0x58,0x5, 0x7e,0x50,0x5, 0x80,0x1f,0xbe,0x34, +0xfb,0x50,0x58,0x5, 0x7e,0x50,0x4, 0x80,0x14,0xbe,0x34,0xfc,0xe0,0x58,0x5, 0x7e, +0x50,0x3, 0x80,0x9, 0xbe,0x34,0xfe,0xd4,0x58,0x3, 0x7e,0x50,0x2, 0xbe,0x34,0xfc, +0x18,0x58,0x3c,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x80,0x2f, +0x7e,0x43,0xd, 0x16,0xa5,0xbc,0x0, 0x1d,0xbe,0xa0,0x0, 0x28,0x18,0x7e,0xb3,0x16, +0xb1,0x70,0x12,0x7e,0xb3,0x16,0xb3,0x70,0xc, 0xbe,0x50,0x3, 0x50,0x3, 0x7e,0x50, +0x3, 0x74,0x1, 0x80,0x6, 0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e, +0x43,0x16,0xb7,0xbc,0x45,0x50,0x4, 0x7a,0x53,0x16,0xb7,0xbe,0x50,0x2, 0x28,0x6, +0x74,0x1, 0x7a,0xb3,0x16,0xb8,0xbe,0xa0,0x0, 0x28,0x1b,0x7e,0xb3,0xd, 0x16,0x70, +0x15,0x7e,0xb3,0x16,0xb1,0x70,0xf, 0x7e,0xb3,0x16,0xb3,0x70,0x9, 0xe4,0x7a,0xb3, +0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xb3,0x16,0xb3,0xb4,0x1, 0x18,0xe4,0x7a,0xb3, +0x16,0xb3,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0xf, +0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xa3,0x16,0xb7,0x7e,0x50,0x8, 0xac,0x5a,0x7a,0x27, +0xe, 0x5, 0x74,0x4, 0xa4,0x7a,0x57,0xe, 0x7, 0x22,0xca,0x3b,0x7d,0x73,0x7e,0xb3, +0xd, 0xf7,0xf5,0x4c,0x7e,0x37,0xf, 0xda,0x7a,0x35,0x4f,0x75,0x42,0x0, 0x7e,0xc0, +0x1, 0x80,0x19,0xe5,0x42,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0x60,0xa, 0x2c,0x2d,0x27, +0x7e,0x29,0x70,0xbc,0x76,0x40,0x3, 0x7a,0xc1,0x42,0xb, 0xc0,0xe5,0x4c,0xbc,0xbc, +0x38,0xe1,0xe5,0x42,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0xb0,0xf5,0x42,0x75,0x44,0x0, +0x7e,0xc0,0x1, 0x2, 0x3c,0xb4,0x75,0x4b,0x0, 0x6d,0x33,0x7a,0x35,0x4d,0x6c,0xdd, +0x75,0x45,0x0, 0x75,0x46,0x0, 0x75,0x43,0x0, 0x2, 0x3c,0x69,0x7e,0x71,0x43,0x74, +0x2, 0xac,0x7b,0x9, 0xb3,0xd, 0x18,0xf5,0x47,0x9, 0xb3,0xd, 0x19,0xf5,0x48,0xe5, +0x43,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0x70,0xbc,0x7c,0x78,0x7b,0xb, 0xd0,0xe5,0x47, +0x25,0x45,0xf5,0x45,0xe5,0x48,0x25,0x46,0xf5,0x46,0x7e,0x51,0x47,0xac,0x5d,0xe5, +0x45,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x49,0x7e,0x51,0x48,0xac, +0x5d,0xe5,0x46,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x4a,0x7e,0x51, +0x4b,0xac,0x5d,0xe5,0x49,0xa, 0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x48,0x53, +0x7c,0xb7,0xf5,0x4b,0x7e,0x51,0x4b,0xac,0x5d,0xe5,0x4a,0xa, 0x3b,0xbd,0x32,0x8, +0x9, 0xa, 0x2d,0x12,0x48,0x53,0x7c,0xb7,0xf5,0x4b,0x7e,0x71,0x47,0x74,0x18,0xac, +0x7b,0xe5,0x48,0xa, 0x2b,0x2d,0x32,0x3e,0x34,0x2e,0x35,0x4f,0xb, 0x38,0x30,0xbe, +0x35,0x4d,0x8, 0x3, 0x7a,0x35,0x4d,0x5, 0x43,0xe5,0x4c,0xbe,0xb1,0x43,0x28,0x3, +0x2, 0x3b,0xcc,0xbe,0xd0,0x0, 0x28,0x3a,0xe5,0x45,0x8c,0xbd,0xf5,0x45,0xe5,0x46, +0x8c,0xbd,0xf5,0x46,0x7e,0xa1,0x45,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x19,0xa3, +0x15,0x2b,0xe5,0x46,0x19,0xb3,0x15,0x2c,0x7e,0x25,0x4d,0x7e,0x71,0x45,0x74,0x18, +0xac,0x7b,0xe5,0x46,0xa, 0x1b,0x2d,0x31,0x3e,0x34,0x2e,0x35,0x4f,0x1b,0x38,0x20, +0x5, 0x44,0xb, 0xc0,0xe5,0x42,0xbc,0xbc,0x40,0x3, 0x2, 0x3b,0xb6,0xe5,0x44,0xda, +0x3b,0x22,0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x74,0x18,0x7a,0xb3,0x10,0x2c,0x74,0x4, +0x7a,0xb3,0x10,0x2d,0xe4,0x7a,0xb3,0x10,0x2e,0x7e,0x34,0x11,0x9b,0x7a,0x37,0x10, +0x2f,0x7e,0x34,0x11,0x97,0x7a,0x37,0x10,0x31,0x7e,0x34,0xf, 0xc5,0x7a,0x37,0x10, +0x33,0x7e,0x34,0xf, 0xad,0x7a,0x37,0x10,0x35,0x74,0x15,0x7a,0xb3,0x10,0x37,0x74, +0x17,0x7a,0xb3,0x10,0x38,0x74,0x4, 0x7a,0xb3,0x10,0x3a,0xe4,0x7a,0xb3,0x10,0x3b, +0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x3d,0x74,0x2, 0x7a,0xb3,0x10,0x3e,0x74,0x45, +0x7a,0xb3,0x10,0x3f,0x74,0x71,0x7a,0xb3,0x10,0x40,0x74,0x3, 0x7a,0xb3,0x10,0x41, +0x7e,0x34,0x1f,0xff,0x7a,0x37,0x10,0x42,0x6d,0x33,0x7a,0x37,0x10,0x44,0x7e,0x34, +0xd, 0xfe,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, 0xdc,0x7a,0x37,0x10,0x48,0x74,0x20, +0x7a,0xb3,0x10,0x4a,0x74,0xa, 0x7a,0xb3,0x10,0x4b,0xe4,0x7a,0xb3,0x10,0x4c,0x7a, +0xb3,0x10,0x4d,0x7a,0xb3,0x10,0x4e,0x74,0x2, 0x7a,0xb3,0x10,0x4f,0x7e,0x34,0x0, +0xf4,0x7a,0x37,0x10,0x52,0x7e,0x34,0x3f,0xe0,0x7a,0x37,0x10,0x50,0x7e,0x34,0x29, +0x28,0x7a,0x37,0x10,0x54,0x7e,0x34,0x10,0x91,0x7a,0x37,0x10,0x62,0x7e,0x34,0x0, +0x3d,0x7a,0x37,0x10,0x64,0x7e,0x34,0x0, 0x22,0x7a,0x37,0x10,0x66,0x7e,0x34,0x4c, +0x0, 0x7a,0x37,0x10,0x56,0x7e,0x34,0x3, 0xcf,0x7a,0x37,0x10,0x58,0x7e,0x34,0x7, +0x9a,0x7a,0x37,0x10,0x5a,0x7e,0x34,0x5, 0x84,0x7a,0x37,0x10,0x5c,0x7e,0x34,0x0, +0x9, 0x7a,0x37,0x10,0x5e,0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x10,0x60,0x7e,0x34,0x0, +0x5d,0x7a,0x37,0x10,0x68,0xe4,0x7a,0xb3,0x10,0x6a,0x74,0x7, 0x7a,0xb3,0x10,0x6b, +0x7e,0x34,0x10,0xff,0x7a,0x37,0x10,0x6c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x10,0x6e, +0x7e,0x34,0xf, 0x2e,0x7a,0x37,0x10,0x70,0x12,0x41,0xcf,0x7e,0x34,0x11,0xe9,0x7a, +0x37,0x10,0x72,0x7e,0x34,0xf, 0x88,0x7a,0x37,0x10,0x74,0x7e,0x34,0x11,0x17,0x7a, +0x37,0x10,0x76,0x2, 0x6c,0x99,0xca,0x69,0xca,0xf8,0x7d,0xb1,0x7d,0xf2,0x7d,0xe3, +0x9f,0x0, 0x7f,0x60,0x7f,0x40,0x6d,0x66,0x7a,0x67,0x13,0xb6,0x7f,0x10,0x7d,0xa6, +0x75,0x21,0x0, 0x6c,0xaa,0x80,0x4b,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0xa1,0x2d,0xae, +0xb, 0xa8,0xa0,0x7c,0xba,0x20,0xe0,0x1e,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, +0x6d,0x11,0x9d,0x1b,0xbd,0x1a,0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, +0x2f,0x60,0x5, 0x21,0x80,0x1a,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11, +0x9d,0x1b,0xbd,0x1a,0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x40, +0xb, 0xa0,0x7e,0xf3,0x10,0x2c,0xbc,0xfa,0x38,0xad,0xe5,0x21,0xa, 0x1b,0x6d,0x0, +0x7f,0x16,0x12,0x48,0xf2,0x7a,0x37,0x13,0xb6,0xe5,0x21,0xa, 0x3b,0x6d,0x22,0xa, +0x1f,0x6d,0x0, 0x9f,0x1, 0x7f,0x14,0x12,0x48,0xf2,0x6c,0xaa,0x80,0x2f,0x7c,0xba, +0x7e,0x30,0x2, 0x7c,0x9a,0x20,0xe0,0xf, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18, +0x0, 0x9e,0x7, 0x13,0xb6,0x80,0xd, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, +0x7d,0x13,0x9d,0x1, 0x7d,0x14,0x2d,0x1f,0x1b,0x18,0x0, 0xb, 0xa0,0x7e,0xb3,0x10, +0x2c,0xbc,0xba,0x38,0xc9,0x9f,0x66,0x7a,0x67,0x13,0xb6,0x6c,0xaa,0x80,0x29,0x7e, +0x70,0x2, 0xac,0x7a,0x7d,0xa3,0x2d,0xae,0x49,0xaa,0x0, 0x30,0xbd,0xab,0x8, 0x4, +0x7d,0xab,0x80,0xa, 0x6d,0x33,0x9d,0x3b,0xbd,0x3a,0x8, 0x2, 0x7d,0xa3,0x7d,0x3a, +0x1a,0x26,0x1a,0x24,0x2f,0x61,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xcf, +0xa, 0x16,0x6d,0x0, 0x7f,0x16,0x12,0x48,0xf2,0x7a,0x37,0x13,0xb6,0x6c,0xaa,0x80, +0x1d,0x7e,0x70,0x2, 0x7c,0x5a,0xac,0x57,0x7d,0x32,0x2d,0x3e,0x49,0x43,0x0, 0x30, +0x9e,0x47,0x13,0xb6,0x7d,0x32,0x2d,0x3f,0x59,0x43,0x0, 0x30,0xb, 0xa0,0x7e,0xb3, +0x10,0x2b,0xbc,0xba,0x38,0xdb,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x7c,0xfb,0xe5, +0x55,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x55,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x40,0x4b, +0xa9,0xd7,0xea,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12, +0x67,0xe2,0x12,0x0, 0x6e,0x50,0x27,0xa9,0xc7,0xea,0x7e,0xe3,0x10,0x4d,0xe4,0x7a, +0xb3,0x10,0x4d,0x7e,0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2, +0x7a,0xe3,0x10,0x4d,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x3, 0x12,0x6b,0x12,0x74,0x1, +0x7a,0xb3,0xf, 0xd3,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0xa, 0x18, +0x12,0x66,0xc7,0x7e,0x37,0xf, 0xd6,0x7e,0x27,0xf, 0xd4,0x7e,0x14,0xa, 0x62,0x12, +0x66,0xc7,0x6c,0xaa,0x80,0x36,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0xa, 0x92,0xbe, +0x34,0x13,0x88,0x40,0xc, 0xbe,0x34,0x75,0x30,0x28,0x1a,0xbe,0x34,0x7e,0xf4,0x50, +0x14,0x7e,0xb3,0x16,0xb4,0x4, 0x7a,0xb3,0x16,0xb4,0xb4,0xa, 0xd, 0x74,0x1, 0x7a, +0xb3,0x16,0xb3,0x80,0xf, 0xe4,0x7a,0xb3,0x16,0xb4,0xb, 0xa0,0x7e,0xb3,0x10,0x2b, +0xbc,0xba,0x38,0xc2,0x7e,0xa3,0x16,0xb3,0xbe,0xa0,0x1, 0x78,0x7, 0x7e,0xb3,0x16, +0xb2,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x16,0xb2,0xbe,0xb0,0x0, 0x28,0x6, 0x74,0x1, +0x7a,0xb3,0x16,0xb1,0x4c,0xaa,0x78,0xd, 0xe4,0x7a,0xb3,0x16,0xb2,0x7a,0xb3,0x16, +0xb1,0x7a,0xb3,0x16,0xb4,0x74,0x1, 0x7a,0xb3,0xf, 0xd2,0x12,0x67,0x1, 0x12,0x6b, +0xbd,0x7e,0xb3,0x11,0xc, 0xb4,0x1, 0x31,0xbe,0xf0,0x1, 0x78,0x2c,0x7e,0xb3,0xd, +0xfc,0x70,0x26,0x12,0x47,0x4a,0x7e,0xb3,0xd, 0xf7,0x70,0x19,0x7e,0x73,0x11,0x95, +0xa, 0x37,0x9, 0x73,0xf, 0x29,0x7a,0x73,0x10,0x4a,0xe4,0x7a,0xb3,0x10,0x4e,0x7a, +0xb3,0x11,0xc, 0x80,0x6, 0x6c,0xff,0x80,0x2, 0x6c,0xff,0x12,0x66,0x52,0x12,0x6c, +0x1f,0x7c,0xbf,0xda,0x79,0x22,0xca,0x3b,0x75,0x21,0x0, 0x7e,0x34,0xb, 0x79,0x7e, +0x24,0x0, 0xd, 0xe4,0x12,0x6e,0x21,0xe4,0x7a,0xb3,0xd, 0x16,0x7a,0xb3,0xd, 0x17, +0x7e,0xb3,0xf, 0xd2,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x41,0xcc,0x7e,0x34,0x13,0xb6, +0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, +0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e,0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27, +0xf, 0x4c,0x7e,0x14,0x13,0xb6,0x6c,0x11,0x12,0x4f,0x6e,0x7c,0xeb,0x7e,0x37,0xf, +0xd6,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4a,0x7e,0x14,0x13, +0xc0,0x12,0x4f,0x6e,0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x51,0x6c,0xcc,0x80,0x47, +0x7c,0xbf,0xc4,0x23,0x54,0x1f,0x7c,0x6b,0x7a,0x61,0x21,0xa, 0x2a,0x9, 0x72,0x13, +0xc0,0x7e,0x50,0x2, 0xac,0x5f,0x19,0x72,0xa, 0xb1,0xa, 0x1c,0x9, 0x71,0x13,0xb6, +0x19,0x72,0xa, 0xb2,0x7c,0xbf,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0x79,0xa, 0x46,0x2e,0x44,0xb, 0x79,0x7e,0x49,0xb0,0x4c,0xb7, +0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xb5,0xb, 0xa0,0xbc,0xda,0x38, +0xab,0x7a,0xf3,0xd, 0x16,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12, +0x6e,0x21,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e, +0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xb6,0x7e, +0x10,0x1, 0x12,0x4f,0x6e,0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x7e, +0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x6e,0x7c,0xdb, +0x6c,0xff,0x6c,0xaa,0x80,0xe, 0x6c,0xcc,0x80,0x4, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec, +0x38,0xf8,0xb, 0xa0,0xbc,0xda,0x38,0xee,0x7a,0xf3,0xd, 0x17,0xda,0x3b,0x22,0xca, +0x79,0x7e,0x34,0x0, 0x60,0x12,0x69,0xb9,0x7c,0xab,0x7a,0xa1,0x6a,0xbe,0xa0,0x8, +0x40,0x3, 0x2, 0x42,0xed,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0xe0,0x6, 0x80,0x3, 0x7e, +0xe0,0x5, 0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x42,0x1, +0x73,0x2, 0x42,0x19,0x2, 0x42,0x1e,0x2, 0x42,0x23,0x2, 0x42,0x28,0x2, 0x42,0x2d, +0x2, 0x42,0x32,0x2, 0x42,0x37,0x2, 0x42,0x3c,0x7e,0xf0,0x5e,0x80,0x26,0x7e,0xf0, +0x5f,0x80,0x21,0x7e,0xf0,0x61,0x80,0x1c,0x7e,0xf0,0x63,0x80,0x17,0x7e,0xf0,0x65, +0x80,0x12,0x7e,0xf0,0x67,0x80,0xd, 0x7e,0xf0,0x69,0x80,0x8, 0x7e,0xf0,0x6a,0x80, +0x3, 0x7e,0xf0,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x11,0xe9,0xa, 0xb, 0x7e,0xb3, +0x10,0xff,0xa, 0x1b,0x2d,0x1, 0x7c,0xb1,0x7c,0x1a,0x2e,0x10,0x21,0xa5,0xf7,0x7c, +0x9b,0xa, 0x9, 0x5e,0x4, 0x0, 0x1, 0xbe,0x4, 0x0, 0x1, 0x78,0x1c,0x7c,0x79,0xac, +0x7f,0x7e,0x50,0x3, 0xac,0x5f,0xe, 0x24,0xe, 0x24,0x2d,0x32,0x7c,0xba,0x3e,0xb0, +0x24,0x25,0xa, 0xb, 0x1b,0x8, 0x30,0x80,0xd, 0xac,0x9f,0x7c,0xba,0x3e,0xb0,0x24, +0x25,0xa, 0xb, 0x1b,0x8, 0x40,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, 0xb, 0xb, 0x8, +0xf0,0x7e,0x4, 0x0, 0xa, 0x7d,0x3f,0x8d,0x30,0x8d,0x30,0x7c,0x75,0xbe,0x70,0x0, +0x40,0x14,0xbc,0xe7,0x28,0x10,0x7e,0xc4,0x0, 0x64,0x7d,0xdf,0x8d,0xdc,0x7d,0xd, +0x9d,0x1, 0x7c,0x61,0x80,0x17,0xbc,0xe7,0x38,0x19,0xbe,0x70,0x9, 0x38,0x14,0x7e, +0xe4,0x0, 0x64,0x8d,0xfe,0x7d,0x2f,0xb, 0x24,0x9d,0x21,0x7c,0x65,0xa, 0x2a,0x19, +0x62,0x11,0xe9,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x3, 0x2, 0x42,0x46,0xda,0x79,0x22, +0xca,0xf8,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf, +0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10,0xa5,0x7e,0xb3, +0xf, 0x26,0x12,0x6e,0xe2,0x12,0x64,0x48,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x44,0x6, 0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0x0, 0x64,0x7a,0x37, +0xa, 0xaf,0xe4,0x7a,0xb3,0x16,0xba,0x12,0x6c,0x7b,0x12,0x46,0x40,0x12,0x6b,0x35, +0x6c,0xff,0x1a,0x2f,0x7e,0x34,0x0, 0x18,0xad,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda, +0x2e,0x34,0x0, 0x30,0x1b,0x35,0xb, 0x38,0x30,0x1a,0x2f,0x3e,0x24,0x59,0x32,0x13, +0x9c,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xda,0x12,0x6b,0x7b,0x12,0x6c,0xd1,0x12,0x69, +0x38,0x6c,0xff,0x1a,0x3f,0x3e,0x34,0x49,0x23,0x13,0x9c,0x1a,0xf, 0x7e,0x14,0x0, +0x18,0xad,0x10,0x7d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b, +0x35,0x1b,0x38,0x20,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xd8,0x12,0x6a,0xb, 0x12,0x49, +0x47,0x7e,0xb3,0xf, 0xd3,0x70,0x9, 0x7e,0xb3,0xf, 0xd2,0x70,0x3, 0x2, 0x43,0x18, +0x12,0x1f,0x97,0x12,0x33,0xaf,0x7a,0xb3,0xf, 0x25,0x12,0x6e,0x40,0x12,0x6d,0x37, +0x70,0x3, 0x2, 0x43,0x18,0x12,0x45,0x2a,0x7e,0x37,0xf, 0xda,0x12,0x8, 0x6, 0x12, +0x6e,0xe8,0x12,0x4e,0xc4,0x12,0x0, 0x6e,0x50,0x3, 0x12,0x30,0x5, 0x7e,0xb3,0x11, +0x15,0xb4,0x1, 0x4, 0xe4,0x12,0x6e,0xd3,0x12,0x67,0x3a,0x12,0x19,0x6d,0x12,0x6, +0x11,0x12,0x6f,0x7, 0x12,0x65,0x9a,0x12,0x36,0xf6,0x12,0x56,0x4e,0x12,0x1c,0xb1, +0x12,0x4b,0x9, 0x2, 0x43,0x18,0x12,0x0, 0x1e,0x12,0x6e,0x5c,0xda,0xf8,0x22,0xca, +0x3b,0x7c,0xeb,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x38,0x3, 0x2, 0x45,0x21,0x7c, +0xbe,0x12,0xd, 0x46,0x7e,0xb3,0xd, 0xfc,0x60,0x1e,0x7e,0xb3,0x15,0x54,0x70,0x8, +0x7e,0xb3,0x15,0x55,0x70,0x2, 0x80,0x10,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x28, +0xc, 0xe5,0x12,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x1e,0x7e,0xf0,0x1, +0xbe,0x73,0xf, 0x1c,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x15,0x54, +0xbe,0x73,0xf, 0x1c,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c, +0xbe,0x12,0xd, 0x46,0xe5,0x10,0x7a,0xb3,0xd, 0xf7,0x7e,0x31,0x10,0x74,0x2, 0xac, +0x3b,0x7e,0x24,0x15,0x2b,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x7d,0x75,0x12,0x64,0x75, +0x13,0x64,0x6c,0xee,0x80,0x67,0x6c,0xdd,0x80,0x59,0x74,0x2, 0xac,0xbd,0x9, 0x75, +0xd, 0x18,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0xa, 0x37,0x9d,0x32, +0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x21,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, 0x19,0xa, +0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x19,0xa, 0x37,0x9d,0x32,0x12,0x6e,0x11, +0x7c,0xc7,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0xa, 0xe5,0x12,0xbe,0xb1,0x21,0x28,0x3, +0x85,0x21,0x12,0xbe,0xc0,0x0, 0x28,0x9, 0xe5,0x13,0xbc,0xbc,0x28,0x3, 0x7a,0xc1, +0x13,0xb, 0xd0,0x7e,0x73,0xd, 0xf7,0xbc,0x7d,0x38,0x9f,0xb, 0xe0,0x7e,0x73,0xd, +0xf7,0xbc,0x7e,0x38,0x91,0xe5,0x12,0xb4,0x64,0x3, 0x75,0x12,0x0, 0xe5,0x13,0xb4, +0x64,0x3, 0x75,0x13,0x0, 0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x85,0x13,0x12,0x80, +0x6, 0x75,0x12,0x64,0x75,0x13,0x64,0xda,0x3b,0x22,0x12,0x59,0xb0,0x70,0x3, 0x2, +0x45,0xb1,0x75,0x6e,0x14,0x75,0x6d,0x1, 0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, +0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab, +0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e, +0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38, +0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a, +0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23, +0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, +0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4, +0x22,0xe5,0x6d,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x46,0x3d,0x15,0x6e,0xe5,0x6e,0x60, +0x79,0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a, +0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23, +0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, +0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1, +0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93, +0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, +0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10, +0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22,0x75,0x6d,0x0, 0xe5,0x21,0x22, +0xca,0x79,0x7e,0x74,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x20,0xe0,0x3, 0x2, 0x47,0x47, +0x54,0xfe,0x7a,0xb3,0x10,0xfe,0x9, 0x77,0x0, 0x2, 0xbe,0x73,0xf, 0x52,0x68,0x16, +0x7a,0x73,0xf, 0x52,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x7a,0x37,0xf, 0x48,0x7e,0x79,0x70,0xbe,0x73,0xf, 0x5c,0x68,0xe, 0x7a, +0x73,0xf, 0x5c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x54,0x9, 0x77,0x0, +0x1, 0xa, 0x37,0xbe,0x37,0xf, 0x56,0x68,0x4, 0x7a,0x37,0xf, 0x56,0x7e,0x27,0xf, +0x5d,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x9, 0x77,0x0, 0x5, 0xa, 0x37,0xbd, +0x32,0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x5d,0x9, +0x77,0x0, 0x8, 0xbe,0x73,0x11,0x11,0x68,0x24,0x7a,0x73,0x11,0x11,0xbe,0x70,0xf, +0x40,0x5, 0xe4,0x19,0xb7,0x0, 0x8, 0x9, 0x77,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6e, +0x31,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0x11,0x10,0x9, 0x77,0x0, +0x9, 0xbe,0x73,0x11,0x13,0x68,0x8, 0x7a,0x73,0x11,0x13,0x7a,0x73,0x11,0x12,0x9, +0x77,0x0, 0x7, 0xbe,0x73,0x11,0x14,0x68,0x4, 0x7a,0x73,0x11,0x14,0x9, 0xb7,0x0, +0xb, 0xbe,0xb1,0x51,0x68,0x5, 0xf5,0x51,0x12,0x6d,0x1f,0x9, 0x77,0x0, 0x25,0xa, +0x37,0xbe,0x37,0x11,0xd, 0x68,0x4, 0x7a,0x37,0x11,0xd, 0x9, 0x77,0x0, 0x6, 0xbe, +0x73,0x11,0xf, 0x68,0x4, 0x7a,0x73,0x11,0xf, 0x9, 0x77,0x0, 0x24,0xbe,0x73,0x11, +0x15,0x68,0x4, 0x7a,0x73,0x11,0x15,0xda,0x79,0x22,0xca,0x79,0xe4,0x6c,0xaa,0xa, +0x4a,0x19,0xb4,0xd, 0x68,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xf3,0xe4,0x7a,0xb3,0xd, +0xf7,0x7a,0xb3,0xd, 0xf8,0x7a,0xb3,0xd, 0xf9,0x7a,0xb3,0xd, 0xfa,0x7e,0xb3,0xf, +0xd3,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x48,0x50,0x7e,0xb3,0x10,0x2b,0xf5,0x21,0x7e, +0xb3,0x10,0x2c,0xf5,0x22,0x7e,0x37,0xf, 0x56,0x7a,0x35,0x23,0x7e,0x37,0xf, 0x58, +0x7a,0x35,0x25,0x7e,0x37,0xf, 0x5a,0x7a,0x35,0x27,0x7e,0x34,0x0, 0x14,0x7a,0x35, +0x2d,0x7e,0x37,0xf, 0xda,0x7e,0x24,0x0, 0x21,0x7e,0x14,0x0, 0x29,0x7e,0x4, 0x9, +0xc8,0x12,0x4e,0x15,0xe5,0x29,0x7a,0xb3,0xd, 0xf7,0xe5,0x2a,0x7a,0xb3,0xd, 0xf8, +0xe5,0x2b,0x7a,0xb3,0xd, 0xf9,0xe5,0x2c,0x7a,0xb3,0xd, 0xfa,0x6c,0xaa,0x80,0x6c, +0x7e,0x53,0xd, 0xf7,0xbc,0x5a,0x28,0x44,0x7c,0xba,0xc4,0x23,0x54,0x1f,0x7c,0x7b, +0x7c,0xba,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x69,0x7e,0x30,0x2, 0xac,0x3a,0x49,0x71,0x9, 0xc8,0x7d,0x7, 0xa, 0x0, 0x7c,0x41, +0x19,0x41,0xd, 0x18,0x7d,0x7, 0x7c,0x41,0x19,0x41,0xd, 0x19,0xa, 0x47,0x2e,0x44, +0xd, 0x68,0x7e,0x49,0xb0,0x4c,0xb6,0x7a,0x49,0xb0,0x80,0x1e,0xa, 0x15,0xa, 0x2a, +0x9d,0x21,0x3e,0x24,0x49,0x72,0x9, 0xf0,0x7d,0x17,0xa, 0x12,0x7c,0xb3,0x19,0xb2, +0xd, 0x40,0x7d,0x17,0x7c,0xb3,0x19,0xb2,0xd, 0x41,0xb, 0xa0,0x7e,0xb3,0xd, 0xf8, +0xa, 0x2b,0x7e,0xb3,0xd, 0xf7,0xa, 0x1b,0x2d,0x12,0xa, 0x2a,0xbd,0x21,0x48,0x80, +0xda,0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff, +0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d, +0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34, +0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d, +0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d, +0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d, +0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, +0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d, +0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, +0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d, +0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f, +0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x48, +0xa1,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x48,0xa1,0x30,0xd5,0x6, 0x9f, +0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, +0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, +0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0xca,0x79,0x6c,0xee,0x12,0x65,0xd9,0x7d,0x43, +0x6c,0xaa,0x6c,0x77,0x7e,0x30,0x6, 0xac,0x37,0x2e,0x14,0x6c,0x5d,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70, +0x5, 0x40,0xe1,0xbe,0xa0,0x5, 0x78,0x3, 0x2, 0x4a,0x18,0x7e,0x63,0xd, 0xf7,0xbe, +0x60,0x0, 0x38,0x3, 0x2, 0x4a,0x18,0x6c,0x77,0x2, 0x4a,0xd, 0x6c,0xff,0x6c,0x66, +0x80,0x41,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27, +0xf, 0xda,0xb, 0x28,0x20,0x7e,0x30,0x6, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6c,0x5f, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x2, 0x18,0x14,0xb, 0xf0,0x2e,0x14,0x6c, +0x61,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x28,0xe, 0x80,0x2, 0x6c, +0xff,0xb, 0x60,0x7e,0xb3,0x10,0x2b,0xbc,0xb6,0x38,0xb7,0x7e,0x50,0x6, 0xac,0x5a, +0x7d,0x12,0x2e,0x14,0x6c,0x61,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf, +0x38,0x17,0xb, 0xe0,0x2e,0x24,0x6c,0x62,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93, +0xbc,0xbe,0x38,0x7, 0x75,0x14,0x40,0x80,0xf, 0x6c,0xee,0xb, 0x70,0x7e,0xb3,0x10, +0x2c,0xbc,0xb7,0x28,0x3, 0x2, 0x49,0x8c,0xe5,0x15,0x25,0x14,0xf5,0x14,0xbe,0xb0, +0x0, 0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0xda,0x79, +0x22,0x7d,0x53,0x9f,0x11,0xbe,0x54,0x0, 0x0, 0x40,0x2d,0xbe,0x54,0x0, 0x3f,0x38, +0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x25,0x7e,0x34,0x1, 0x8e,0xad,0x32,0x6d,0x22,0x7c, +0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x34,0x48,0x4, 0x7e,0x18,0x0, 0x34,0x7e, +0x8, 0x0, 0x34,0x9f,0x1, 0x7f,0x10,0x22,0xbe,0x54,0x5, 0x80,0x40,0x29,0xbe,0x54, +0x5, 0xb8,0x38,0x23,0x7d,0x25,0x9e,0x24,0x5, 0x7f,0x7e,0x34,0x1, 0x8e,0xad,0x32, +0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x32,0x48,0x4, 0x7e,0x18, +0x0, 0x31,0x2e,0x18,0x4, 0xce,0x22,0xbe,0x54,0x5, 0xb8,0x28,0x19,0x7d,0x25,0x9e, +0x24,0x5, 0x9f,0x7e,0x34,0x1, 0x8e,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a, +0x24,0x2e,0x18,0x5, 0x0, 0x22,0xbe,0x54,0x2, 0xdf,0x38,0xe, 0x7e,0x34,0x2, 0xdf, +0x9d,0x35,0x6d,0x22,0x7e,0x14,0x0, 0xdf,0x80,0xc, 0x7d,0x35,0x9e,0x34,0x2, 0xe0, +0x6d,0x22,0x7e,0x14,0x0, 0xe1,0x12,0x48,0x96,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe, +0x54,0x2, 0xdf,0x38,0xa, 0x7e,0x8, 0x2, 0x7f,0x9f,0x1, 0x7f,0x10,0x80,0x4, 0x2e, +0x18,0x2, 0x80,0xbe,0x18,0x0, 0x34,0x58,0x5, 0x7e,0x18,0x0, 0x34,0x22,0xbe,0x18, +0x4, 0xce,0x8, 0x4, 0x7e,0x18,0x4, 0xce,0x22,0xca,0x3b,0x7e,0x73,0xd, 0xfb,0x7a, +0x73,0xd, 0xfc,0x7e,0xa3,0xf, 0x1b,0x7a,0xa3,0xf, 0x1c,0xe4,0x7a,0xb3,0xf, 0x1f, +0x7e,0x37,0x11,0xd, 0x4d,0x33,0x78,0x3f,0xbe,0xa0,0x0, 0x28,0x8, 0xe4,0x7a,0xb3, +0x16,0xab,0x2, 0x4b,0xd0,0x7e,0xb3,0x11,0xf, 0x20,0xe0,0x3, 0x2, 0x4b,0xd0,0x7e, +0xb3,0x11,0x14,0xbe,0xb3,0x16,0xab,0x28,0x3, 0x2, 0x4b,0xd0,0xe4,0x7a,0xb3,0x16, +0xab,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x11,0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa3,0x74, +0x1e,0x7a,0xb3,0x11,0x12,0x80,0x69,0xbe,0x34,0x0, 0x1, 0x78,0x22,0xbe,0xa0,0x0, +0x28,0x5e,0x6d,0x22,0x7a,0x27,0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x7a,0xb3,0x16, +0xab,0x74,0x23,0x7a,0xb3,0x16,0xae,0x74,0x1, 0x7a,0xb3,0x16,0xad,0x80,0x41,0xbe, +0x34,0x0, 0x3, 0x78,0x3b,0x6d,0x66,0x7a,0x67,0x10,0x1, 0x7e,0x74,0xd, 0xac,0x7a, +0x77,0xa, 0xaf,0x12,0x6f,0xd, 0x12,0x60,0x8c,0x12,0x58,0xcd,0x6d,0x33,0x7a,0x37, +0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x74,0x1, 0x7a,0xb3,0x16,0xad,0x7a,0x67,0x10, +0x1, 0x7a,0x77,0xa, 0xaf,0x75,0x9a,0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf, +0x7e,0xb3,0x16,0xad,0x70,0x6, 0x12,0x5b,0xd3,0x12,0x64,0x8e,0xda,0x3b,0x22,0x7e, +0x34,0x10,0x7e,0x7e,0x24,0x0, 0x81,0xe4,0x12,0x6e,0x21,0x74,0xc, 0x7a,0xb3,0x10, +0x80,0x7a,0xb3,0x10,0x81,0x74,0x9, 0x7a,0xb3,0x10,0x82,0x74,0xf, 0x7a,0xb3,0x10, +0x7e,0x74,0x3c,0x7a,0xb3,0x10,0x7f,0x74,0xa0,0x7a,0xb3,0x10,0x83,0x74,0x1e,0x7a, +0xb3,0x10,0x85,0x74,0x9, 0x7a,0xb3,0x10,0x86,0x74,0x1e,0x7a,0xb3,0x10,0x87,0xe4, +0x7a,0xb3,0x10,0x88,0x7a,0xb3,0x10,0x89,0xf5,0x52,0xf5,0x51,0x7a,0xb3,0x10,0xa3, +0x74,0x1, 0x7a,0xb3,0x10,0x84,0x7a,0xb3,0x10,0xa2,0x7a,0xb3,0x10,0xa5,0x74,0x4, +0x7a,0xb3,0x10,0xa4,0x74,0x51,0x7a,0xb3,0x10,0xa6,0x74,0xb, 0x7a,0xb3,0x10,0xad, +0x12,0x6e,0xfa,0xa, 0x36,0x7a,0x73,0x10,0xa7,0x12,0x6e,0xfa,0x7a,0x73,0x10,0xa8, +0x12,0x6e,0xff,0xa, 0x36,0x7a,0x73,0x10,0x9f,0x12,0x6e,0xff,0x7a,0x73,0x10,0xa0, +0xe4,0x7a,0xb3,0x10,0xae,0x74,0x1f,0x7a,0xb3,0x10,0xcf,0xe4,0x7a,0xb3,0x10,0xb0, +0x12,0x6e,0x4e,0x7a,0xb3,0x10,0xaf,0x12,0x6d,0x4f,0x7a,0xb3,0x10,0xa1,0x7e,0x34, +0x10,0x8e,0x7e,0x24,0x0, 0x8, 0x74,0xff,0x12,0x6e,0x21,0x74,0x4, 0x7a,0xb3,0x10, +0x8e,0x74,0x1, 0x7a,0xb3,0x10,0x8f,0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x0, 0x40,0x2d, +0xbe,0xf4,0x0, 0x3f,0x38,0x27,0x7e,0x44,0x0, 0x3f,0x9d,0x4f,0x7e,0x54,0x1, 0x8c, +0xad,0x54,0x6d,0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x32,0x40,0x4, 0x7e,0x28, +0x0, 0x32,0x7e,0x18,0x0, 0x32,0x9f,0x12,0x7f,0x21,0x2, 0x4d,0x5c,0xbe,0xf4,0x3, +0x0, 0x40,0x22,0x7d,0x4f,0x9e,0x44,0x3, 0x0, 0x7e,0x54,0x1, 0xbe,0xad,0x54,0x6d, +0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x32,0x40,0x4, 0x7e,0x28,0x0, 0x31,0x2e, +0x28,0x2, 0x9e,0x80,0x57,0xbe,0xf4,0x1, 0x9f,0x38,0xe, 0x7e,0x54,0x1, 0x9f,0x9d, +0x5f,0x6d,0x44,0x7e,0x14,0x0, 0xe0,0x80,0xc, 0x7d,0x5f,0x9e,0x54,0x1, 0xa0,0x6d, +0x44,0x7e,0x14,0x0, 0xe2,0x7f,0x12,0x12,0x48,0x96,0x7f,0x21,0x7c,0xba,0x7c,0xa9, +0xa, 0x48,0xbe,0xf4,0x1, 0x9f,0x38,0xa, 0x7e,0x18,0x1, 0x67,0x9f,0x12,0x7f,0x21, +0x80,0x4, 0x2e,0x28,0x1, 0x68,0xbe,0x28,0x0, 0x32,0x50,0x6, 0x7e,0x28,0x0, 0x32, +0x80,0xa, 0xbe,0x28,0x2, 0x9e,0x28,0x4, 0x7e,0x28,0x2, 0x9e,0x7d,0x35,0x22,0xca, +0x3b,0x6d,0x11,0x7d,0x1, 0x7d,0x21,0x7e,0xa0,0x2, 0x7e,0x70,0x2, 0x6c,0x66,0x80, +0x39,0x6c,0x99,0x80,0x2b,0x7e,0xd0,0x30,0xac,0xd6,0x7e,0xf0,0x2, 0xac,0xf9,0x7d, +0xf7,0x2d,0xf6,0x2e,0xf7,0xf, 0xda,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, 0x14,0x8, 0x4, +0xb, 0x4, 0x80,0x8, 0xbe,0xf4,0xff,0xec,0x58,0x2, 0xb, 0x24,0xb, 0x14,0x2c,0x97, +0x7e,0xb3,0x10,0x2c,0xbc,0xb9,0x38,0xcd,0x2c,0x6a,0x7e,0xb3,0x10,0x2b,0xbc,0xb6, +0x38,0xbf,0x7e,0x54,0x0, 0x3, 0xad,0x51,0x7d,0x35,0x1e,0x34,0x1e,0x34,0xbd,0x30, +0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb5,0x7e,0xb3,0x16,0xb6,0xbe,0xb0,0x5, 0x50,0x7, +0x4, 0x7a,0xb3,0x16,0xb6,0x80,0x39,0xe4,0x7a,0xb3,0x16,0xb6,0x75,0x71,0x1, 0x80, +0x2f,0xbd,0x32,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb6,0x7e,0xb3,0x16,0xb5,0xbe,0xb0, +0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb5,0x80,0x16,0xe4,0x7a,0xb3,0x16,0xb5,0x75, +0x71,0x2, 0x80,0xc, 0xe4,0x7a,0xb3,0x16,0xb5,0x7a,0xb3,0x16,0xb6,0x75,0x71,0x0, +0xe5,0x71,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x56,0xf5,0xba, +0x7e,0x55,0x2d,0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1,0x9, +0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54,0xe0,0x4c,0xba, +0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c,0xb7,0xf5,0xc6, +0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, 0x4, 0x6e,0x34, +0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x4, 0x1a, +0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, 0x6, 0x7c,0xb1, +0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, 0x4e,0x96,0x43, +0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xa, +0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1,0x0, 0x3, 0x75, +0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19,0xb1,0x0, 0x1, +0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0xf, 0xd2,0x60,0x6, 0x7e,0xb3, +0xf, 0xd3,0x70,0x18,0x7e,0x34,0xd, 0x68,0x7e,0x24,0x0, 0x3, 0xe4,0x12,0x6e,0x21, +0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4,0x12,0x6e,0x21,0x6c,0xee,0x80,0x6b, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0x7a,0x71,0x21,0x9, 0x65,0xd, 0x19,0x7a, +0x61,0x22,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xdb,0x7c,0xbe,0x54,0x7, 0x7e,0x24, +0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xc5,0x7e,0x50,0x30,0xac,0x57, +0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0xbe,0x37, +0xf, 0x54,0x48,0x25,0xa, 0x3d,0x9, 0xb3,0xd, 0x68,0x5c,0xbc,0x68,0x1b,0x7e,0x50, +0x7, 0xac,0x5e,0x2e,0x24,0xd, 0x6b,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xe, 0xd, +0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x7d,0xb, 0xf0,0xb, 0xe0,0x7e,0x73,0xd, 0xf7,0xbc, +0x7e,0x38,0x8d,0x7a,0x73,0xd, 0xfb,0x7a,0xf3,0xf, 0x1b,0xda,0x3b,0x22,0xca,0xf8, +0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x2, 0x50,0x9, 0x7e,0x90,0x2, +0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, 0x6e,0x44,0xff, +0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0xa, 0x50,0x6b,0x4c,0xff,0x78,0x14, +0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xe4, +0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd,0x1b,0xf5,0xb, +0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd,0xf4,0x18,0x37, +0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd,0x1b,0xc5,0xb, +0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff,0xff,0xb, 0xf4, +0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18,0x9, 0xa, 0xda, +0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x3, 0x2, 0x4f,0x7d, +0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x33,0x7d,0x73,0x75,0x25,0x0, 0x7e,0x64, +0x5, 0xe0,0x75,0x23,0x0, 0x80,0x3c,0x75,0x24,0x0, 0x7e,0x51,0x23,0x74,0x18,0xac, +0x5b,0x3e,0x24,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2d,0x36,0x7a,0x35, +0x21,0x49,0x23,0x0, 0x30,0xb, 0x38,0x30,0x9d,0x32,0x12,0x6e,0x11,0xe5,0x24,0xb4, +0x17,0x2, 0x1e,0x34,0xbd,0x37,0x28,0x2, 0x7d,0x73,0x5, 0x24,0xe5,0x24,0xb4,0x18, +0xc9,0x5, 0x23,0xe5,0x25,0xa, 0x2b,0x7e,0x33,0x10,0x7c,0xa, 0x13,0x9d,0x12,0x1b, +0x14,0xe5,0x23,0xa, 0x2b,0xbd,0x21,0x48,0xae,0xbe,0x74,0x0, 0x41,0x28,0x11,0x7e, +0x34,0x0, 0x73,0x7e,0xa3,0x16,0x25,0x74,0x12,0xa4,0x59,0x35,0x16,0x36,0x80,0x26, +0x7e,0x43,0x16,0x25,0x7e,0x50,0x12,0xac,0x45,0x49,0x32,0x16,0x36,0xbd,0x37,0x50, +0x6, 0x59,0x72,0x16,0x36,0x80,0xf, 0xbe,0x34,0x0, 0x0, 0x28,0x9, 0x2e,0x24,0x16, +0x36,0x1b,0x34,0x1b,0x28,0x30,0xda,0x3b,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca, +0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x0, 0x46, +0x7e,0x35,0x6b,0xb, 0x34,0x7a,0x35,0x6b,0x7e,0xb3,0x16,0xba,0x4, 0x7a,0xb3,0x16, +0xba,0x7e,0x35,0x6b,0xbe,0x34,0x3, 0xe8,0x40,0x13,0x6d,0x33,0x7a,0x35,0x6b,0x7e, +0xb3,0x16,0xab,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x16,0xab,0x7e,0x73,0x16, +0xaf,0xbe,0x73,0x16,0xae,0x28,0xb, 0x7e,0xb3,0x16,0xae,0x4, 0x7a,0xb3,0x16,0xae, +0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xad,0x7e,0xb3,0x16,0xb0,0x60,0x5, 0x14,0x7a, +0xb3,0x16,0xb0,0x7e,0x37,0x10,0x1, 0xb, 0x34,0x7a,0x37,0x10,0x1, 0x7e,0x37,0xa, +0xaf,0xbe,0x37,0x10,0x1, 0x28,0x3, 0x12,0x6f,0x10,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x75, +0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8, +0x16,0xbb,0x75,0x6a,0x0, 0x75,0x8, 0x1, 0x75,0x9, 0x0, 0x75,0xa, 0x0, 0x75,0xc, +0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0xc2,0x0, 0x75,0x11,0x0, 0x75, +0x12,0x64,0x75,0x13,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x18,0x1, 0x75,0x6b, +0x0, 0x75,0x6c,0x0, 0x75,0x71,0x0, 0x75,0x6d,0x0, 0x75,0x72,0x0, 0x75,0x73,0x1, +0x75,0x6f,0x18,0x75,0x70,0x0, 0x75,0x74,0x0, 0x75,0x75,0x0, 0x75,0x1d,0x0, 0x75, +0x1e,0xff,0x75,0x1f,0x0, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x6f,0x17,0xb, 0xa, 0x40, +0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, +0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x5c, +0x38,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, 0x78,0xc, 0x7e,0x34,0x10,0x2b, +0x12,0x6b,0x58,0xa9,0xc7,0xea,0x80,0x27,0xbe,0xd0,0x5, 0x78,0x1f,0xa9,0xd7,0xea, +0x7e,0xe3,0x10,0x4a,0x7e,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x4d,0x12,0x66,0x8d, +0x7a,0xb3,0x10,0x4a,0x74,0x1, 0x7a,0xb3,0x10,0x78,0x80,0x3, 0xe4,0x80,0x4e,0x7e, +0xb3,0x11,0x96,0x7e,0x34,0x10,0x2b,0xb4,0x1, 0xa, 0x12,0x31,0xfb,0xe4,0x7a,0xb3, +0x11,0x96,0x80,0xa, 0x12,0x61,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5e,0x27,0x7e,0x34, +0x10,0x2b,0x12,0x6a,0xa5,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, 0x7e,0x73,0x11,0xe8, +0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x69,0x64,0xbe,0xd0,0x5, 0x78,0xd, 0x7a,0xe3, +0x10,0x4a,0x7a,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x1, 0xda,0x79,0xda, +0xd8,0x22,0x7e,0x34,0xe, 0xd, 0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x7e, +0x34,0xe, 0x53,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0xe, 0x99, +0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x6c,0xaa,0x74,0x3, 0xa, 0x4a,0x19, +0xb4,0xe, 0xdf,0x19,0xb4,0xe, 0xe9,0x7e,0x44,0xff,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x59,0x43,0xe, 0xf3,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0xf, 0x7, 0xb, 0xa0,0xbe, +0xa0,0xa, 0x40,0xd7,0xe4,0x7a,0xb3,0xf, 0x1b,0x7a,0xb3,0xf, 0x1c,0x7a,0xb3,0xf, +0x1d,0x7a,0xb3,0xf, 0x1f,0x7a,0xb3,0xf, 0x20,0x7a,0xb3,0xf, 0x21,0x7a,0xb3,0xf, +0x22,0x7a,0xb3,0xf, 0x23,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x25,0x12,0x6a,0xee, +0x74,0x3, 0x7a,0xb3,0xf, 0x26,0x74,0x1, 0x7a,0xb3,0xf, 0x27,0xe4,0x7a,0xb3,0xf, +0x28,0x22,0xca,0xf8,0x7c,0xab,0x6c,0x33,0x7c,0x27,0x80,0x73,0x7e,0x90,0x7, 0xac, +0x93,0x9, 0xf4,0xe, 0x57,0x7e,0x10,0x7, 0xac,0x12,0x9, 0xb0,0xe, 0x11,0xbc,0xfb, +0x78,0x5b,0xbe,0xf0,0xff,0x68,0x56,0x7e,0x10,0x7, 0xac,0x1a,0x7d,0xf0,0x2d,0xf2, +0x19,0xff,0x0, 0x4, 0x49,0x44,0xe, 0x53,0x2d,0x2, 0x1b,0x8, 0x40,0x7e,0x10,0x7, +0xac,0x13,0x49,0x0, 0xe, 0x55,0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x59,0x4, 0x0, +0x2, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x12,0x7e,0x90,0x7, 0xac,0x9a,0x2d, +0x42,0x19,0x14,0x0, 0x5, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x13,0x7e,0x90, +0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x6, 0xb, 0xa0,0x80,0x6, 0xb, 0x20,0xbc, +0x62,0x38,0x89,0xb, 0x30,0xbe,0x30,0xa, 0x50,0x3, 0x2, 0x53,0x8, 0x7c,0xba,0xda, +0xf8,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x3b,0xbe,0xa0,0x3e,0x38,0x36,0xbe,0xa0, +0x4, 0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x15,0xde,0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0, +0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x0, 0x6, 0x7e,0x34,0x0, 0x76,0x80, +0x4, 0x7e,0x34,0x0, 0xb8,0x7a,0x37,0x0, 0xfd,0xa, 0x3a,0x2e,0x37,0x0, 0xfd,0x9, +0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0xb, 0x22,0xbe,0xa0,0x80,0x40,0xc, +0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0xf, 0xfe,0x22,0xbe,0xa0,0xfc,0x78, +0x5, 0x7e,0xb3,0x10,0xa5,0x22,0xbe,0xa0,0xfd,0x78,0x8, 0x7e,0x37,0x10,0x46,0x7e, +0x39,0xb0,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3,0x10,0x4a,0x22,0xbe,0xa0,0xf9, +0x78,0x5, 0x7e,0xb3,0x16,0xbb,0x22,0xbe,0xa0,0xfa,0x78,0x3, 0xe5,0x6a,0x22,0xe4, +0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x4d,0xf5,0x24,0xe4,0x7a,0xb3, +0x10,0x4d,0x7e,0x34,0x10,0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a,0xa5, +0x75,0x21,0x0, 0x12,0x69,0x64,0x12,0x6e,0xb9,0x60,0xfb,0xa9,0xb7,0xea,0x7d,0x36, +0x7d,0x27,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2,0x75,0x22,0x0, 0x80,0x36,0x75,0x23, +0x0, 0x80,0x26,0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b,0x2d,0x23, +0x3e,0x24,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, +0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x23,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x23, +0x38,0xd1,0x5, 0x22,0x7e,0x73,0x10,0x2b,0xbe,0x71,0x22,0x38,0xc1,0x5, 0x21,0xe5, +0x21,0xbe,0xb0,0x4, 0x40,0x9d,0xe5,0x24,0x7a,0xb3,0x10,0x4d,0xda,0x3b,0x22,0xca, +0xf8,0x30,0x90,0x58,0xc2,0x90,0x5, 0xa, 0xe5,0xa, 0xb4,0x1, 0x6, 0xe5,0x91,0xf5, +0xf, 0x80,0x29,0xe5,0xb, 0xc4,0x7c,0xfb,0x5e,0xf0,0x7, 0x78,0xe, 0xe5,0xa, 0x25, +0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x56,0xd7,0x80,0x11,0xbe,0xf0,0x4, 0x78,0xc, +0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x15,0xe2,0xe5,0xb, 0xc4,0x7c, +0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80, +0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x4a,0xf5,0x91,0x30,0x91,0x28,0xc2, +0x91,0x5, 0x9, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0xb, 0xe5, +0x9, 0x25,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80,0xd, 0xa5,0xbd,0x4, 0x9, 0xe5,0x9, +0x25,0xf, 0x12,0x27,0x4a,0xf5,0x91,0xda,0xf8,0x22,0x6c,0x33,0xbe,0x30,0x18,0x50, +0x1e,0xa, 0x3, 0x2e,0x7, 0x10,0x35,0x7e,0x9, 0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, +0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x16,0x1e,0xa0,0x80,0x12,0xa, +0x3, 0x2e,0x7, 0x10,0x33,0x9, 0x20,0xff,0xe8,0xa, 0x52,0x2e,0x54,0x0, 0x18,0x7c, +0xab,0x7e,0x23,0x10,0x3a,0xbe,0x20,0x3, 0x28,0xe, 0x7e,0x10,0x2, 0xac,0x1a,0x2d, +0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x21,0xa, 0x42,0x2e,0x44,0x0, 0xc, 0x7e,0x4, +0x0, 0xf, 0x9d,0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0x0, +0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e,0x44,0x7f,0xff,0x9d,0x40,0x7e, +0x10,0x2, 0xac,0x13,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xbe,0x30,0x25,0x50,0x3, +0x2, 0x55,0x3c,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e,0x37,0xf, +0xd6,0xb, 0x38,0x10,0xbe,0x17,0xe, 0x7, 0x8, 0x12,0x7d,0x2, 0x2e,0x7, 0xf, 0xd4, +0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30,0x80,0x18,0x6d,0x33,0x9e,0x37, +0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x9e,0x37,0xe, +0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xbb,0x6c,0xaa,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xe, 0x7, 0x8, 0x12,0x7d,0x2, 0x2e,0x4, +0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30,0x80,0x18,0x6d,0x33, +0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x9e, +0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xc0,0x22,0xca,0x69, +0xca,0xf8,0x6c,0x11,0x7e,0xd0,0x7, 0xac,0xd1,0x9, 0x6, 0xe, 0x9d,0x5e,0x0, 0xf, +0x49,0xf6,0xe, 0x9b,0xbe,0xf4,0x5, 0x18,0x40,0x3c,0x49,0x46,0xe, 0x99,0x7d,0x34, +0x12,0x6b,0xde,0x7c,0xfb,0xbe,0xf0,0x3, 0x40,0xe, 0x7e,0x14,0x4, 0xff,0x74,0x7, +0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x3e,0x74,0x2, 0xac,0xbf,0x49,0x45,0x16,0x95, +0x74,0x7, 0xac,0xb1,0x59,0x45,0xe, 0x99,0x7e,0x14,0x7, 0xd0,0x74,0x7, 0xac,0xb1, +0x59,0x15,0xe, 0x9b,0x80,0x25,0xbe,0xf4,0x5, 0x0, 0x40,0x1f,0x7e,0x14,0x4, 0xff, +0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x74,0x7, 0xac,0xb1,0x49,0x15,0xe, 0x9b, +0xbe,0x14,0x5, 0xa, 0x40,0x5, 0x7c,0xb0,0x12,0x68,0xab,0xb, 0x10,0xbe,0x10,0xa, +0x40,0x82,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x70,0x41,0x7e,0x74,0x0, 0xb, 0x7a, +0x79,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c,0x7b,0xa5,0xbf,0x4, 0x15,0x7e, +0xb3,0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x13,0x74,0x27,0x7e, +0x70,0x3, 0x80,0x4b,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, 0x74,0x1, 0x7e,0x70,0x1, +0x12,0x0, 0x5e,0x80,0x45,0x74,0x27,0x7e,0x70,0x1, 0x80,0x33,0xbe,0xb0,0xfc,0x68, +0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa,0x5, 0x7e,0x60,0x5, 0x80,0x10,0xa5,0xbf,0x55, +0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5,0xbf,0x66,0x20,0x7e,0x60,0x7, 0x74,0x27,0x7c, +0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0x24,0x80,0x12, +0x6d,0xe0,0x80,0x6, 0xb4,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x79,0x22,0x6c,0x77,0x6c, +0xaa,0x80,0x3c,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, 0xda,0x2e,0x24, +0x0, 0x30,0x7d,0x12,0x1b,0x16,0xb, 0x18,0x40,0xbe,0x44,0x0, 0x3c,0x8, 0x1e,0x7e, +0x14,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x5e,0x14,0x4, 0x44, +0x68,0xb, 0x1b,0x25,0xb, 0x28,0x20,0xbd,0x42,0x8, 0x2, 0xb, 0x70,0xb, 0xa0,0x7e, +0x63,0x10,0x2b,0xbc,0x6a,0x38,0xbc,0xbe,0x70,0x1, 0x40,0x30,0x6c,0xaa,0x80,0x24, +0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, 0xda,0x2e,0x24,0x0, 0x30,0x1b, +0x25,0xb, 0x28,0x30,0x7e,0x30,0x2, 0xac,0x3a,0x59,0x31,0x16,0x6f,0x6d,0x33,0x1b, +0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xd4,0x22,0xca,0x79,0x6c, +0xff,0x6c,0xee,0x80,0x63,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbe,0x54, +0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x2a,0x9, 0xb2, +0xd, 0x68,0x5c,0xb7,0x68,0x40,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x24,0xd, 0x18,0x7e, +0x70,0x2, 0xac,0x7f,0x2e,0x34,0xd, 0x18,0x7e,0x14,0x0, 0x2, 0x12,0x6d,0x7d,0x7c, +0xbf,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x4a,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x4c, +0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xe0,0x7e,0x63,0xd, 0xf7,0xbc,0x6e,0x38,0x95, +0x7a,0xf3,0xd, 0xf7,0xda,0x79,0x22,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, +0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x7e,0xb3,0x10,0xa5,0x24,0xfa,0x68,0x17, +0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x16,0xb9,0xbe,0xb0,0x5, 0x68,0x4c, +0x74,0x5, 0x7a,0xb3,0x16,0xb9,0x22,0x7e,0xb3,0x16,0xb9,0xb4,0x5, 0x3e,0x74,0x6, +0x7a,0xb3,0x16,0xb9,0x74,0xfa,0x12,0x6d,0x66,0x75,0x9a,0x80,0x7e,0x34,0x77,0xf8, +0x12,0x69,0xe2,0x7e,0x34,0x77,0xf8,0x74,0x66,0x12,0x5a,0x21,0x7e,0x34,0x77,0xf9, +0x74,0xbb,0x12,0x5a,0x21,0x80,0x12,0x7e,0xb3,0x16,0xb9,0xb4,0x5, 0xe, 0x74,0x7, +0x7a,0xb3,0x16,0xb9,0x74,0xfa,0x12,0x6d,0x66,0x75,0xe9,0xff,0x22,0x0, 0x0, 0x0, +0x0, 0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x16,0xa9,0xb4,0x1, 0x14,0x7e,0x73,0x16, +0xac,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xe4,0x7a,0xb3,0x16,0xa9,0x80, +0xb, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xd0,0xca,0xc2, +0xa8,0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x16,0xb0,0x7e,0xb3,0x16,0xb0,0x70,0xfa,0x12, +0x6e,0xb0,0x12,0x61,0x8e,0x12,0x6b,0xff,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34, +0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x12,0x6a,0x59,0x12,0x6a,0x7f,0x12, +0x52,0x72,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x2, 0x6e,0xf4,0xca, +0x3b,0x7d,0x72,0x7d,0x63,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0x7d,0x36,0x7e,0x24, +0x0, 0x4a,0xe4,0x12,0x6e,0x21,0x7d,0x37,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6e,0x21, +0x75,0x21,0x1, 0x12,0x6c,0x1f,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0x75,0x22,0x0, +0x7e,0x51,0x22,0x74,0x2, 0xac,0x5b,0x49,0x2, 0xa, 0x62,0x1e,0x4, 0x1e,0x4, 0x7d, +0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d,0x30,0x1b,0x18,0x30,0x49,0x12,0xa, 0x18,0x1e, +0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x22,0xe5, +0x22,0xb4,0x25,0xcc,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x5, 0x40,0xb6,0xda,0x3b,0x22, +0x6c,0x77,0x7e,0x63,0xd, 0xfa,0xa, 0x16,0x7e,0x63,0xd, 0xf9,0xa, 0x26,0x2d,0x21, +0xbe,0x24,0x0, 0x96,0x28,0x3, 0x74,0x1, 0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x22,0x8, 0x9a,0xbe,0x24,0x3, 0xe8,0x8, 0x9, 0xb, 0x70,0xbe,0x70, +0x10,0x68,0xe, 0x80,0x2, 0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10,0x2c,0xbc,0x6a,0x38, +0xdc,0xa5,0xbf,0x10,0x2a,0x6c,0x77,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x22,0x8, 0xca,0xbe,0x24,0x7, 0xd0,0x8, 0x9, 0xb, 0x70,0xa5,0xbf,0x8, 0x5, +0x74,0x1, 0x22,0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xdc,0xe4, +0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb,0x75,0xfb,0xa5,0x75,0xfb,0xf, +0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68,0x18,0xbe,0x34,0x73,0xf9,0x68,0x12,0xbe, +0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0xe4, +0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c,0xb7,0x54,0xfe,0xf5,0xf2,0x75,0xf3,0x80, +0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75,0xf6,0xff,0x7a,0xa1,0xf6,0x80, +0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75,0xf5,0x80,0x74,0x1, 0x12,0x6d,0x66,0xa9, +0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0x74,0x1, 0x22, +0x74,0xa, 0x7a,0xb3,0xf, 0x46,0x74,0x14,0x7a,0xb3,0xf, 0x47,0x7e,0x34,0x3, 0x20, +0x7a,0x37,0xf, 0x48,0x7a,0x37,0xf, 0x4a,0x7e,0x24,0x2, 0x58,0x7a,0x27,0xf, 0x4c, +0x7a,0x37,0xf, 0x4e,0x7a,0x37,0xf, 0x50,0x74,0xc, 0x7a,0xb3,0xf, 0x52,0x74,0x8, +0x7a,0xb3,0xf, 0x53,0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, 0x54,0x7a,0x37,0xf, 0x56, +0x7a,0x37,0xf, 0x58,0x7e,0x34,0x0, 0x28,0x7a,0x37,0xf, 0x5a,0x74,0xf, 0x7a,0xb3, +0xf, 0x5c,0xe4,0x7a,0xb3,0xf, 0x5f,0x74,0x4, 0x7a,0xb3,0xf, 0x60,0x7e,0x34,0x0, +0x64,0x7a,0x37,0xf, 0x61,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0xf, 0x5d,0x22,0xca,0x3b, +0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x3c,0xf5,0x1c,0xe4,0x7a,0xb3,0x10,0x3c,0x7d, +0x36,0x7d,0x27,0x12,0x6a,0xca,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x75,0x1a,0x0, +0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60,0xfb,0x7d,0x36,0x7e,0x25, +0x6f,0x12,0x55,0x3a,0x75,0x1b,0x0, 0x7e,0x51,0x1b,0x74,0x2, 0xac,0x5b,0x7d,0x32, +0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31, +0x1b,0x28,0x30,0x5, 0x1b,0xe5,0x1b,0xb4,0x25,0xdd,0x5, 0x1a,0xe5,0x1a,0xbe,0xb0, +0x4, 0x40,0xbd,0xe5,0x1c,0x7a,0xb3,0x10,0x3c,0xda,0x3b,0x22,0x7d,0x3, 0x75,0xcc, +0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0,0xe5,0xca,0x54,0x1, 0x4c,0xba, +0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1,0xe1,0x9, 0x70,0x0, 0xe, 0x2e, +0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c,0xba,0xc4,0x33,0x54,0xe0,0x7c, +0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, 0xb0,0x0, 0x13,0x54,0x3, 0xa, +0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5,0xe3,0x54,0xe7,0x4c,0xba,0xf5, +0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12,0x5d,0x65,0x9, 0xb0,0x0, 0x14, +0xf5,0xe7,0x22,0x7e,0xb3,0x16,0xa9,0x70,0x17,0xe5,0xcc,0x7a,0xb3,0x16,0xaa,0x7e, +0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xac,0x74,0x1, 0x7a,0xb3,0x16,0xa9, +0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc,0xc2,0xca,0xc2,0xc8,0xa9,0xc4, +0xcb,0x80,0x2e,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0x23,0xe5,0x74,0xb4,0x1, 0x1e,0xe5, +0x75,0xb4,0x1, 0x19,0xa9,0xc3,0xcb,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0xe4,0x12,0x6d, +0xaa,0x7e,0xb3,0x16,0xad,0x60,0xcc,0x22,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34, +0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0xd, 0x12,0x6e,0xb0,0x12,0x61,0x8e,0x12, +0x6f,0x16,0x12,0x6d,0xbc,0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x12,0x6b,0xff,0x12,0x6a, +0x59,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x12,0x6e,0xf4,0x7e,0xb3, +0x10,0xa5,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14,0x68,0x16,0x14,0x68,0x13,0x24, +0x5, 0x78,0xeb,0x12,0x42,0xf0,0x80,0xe6,0x12,0x5e,0xda,0x80,0xe1,0x12,0x6a,0x32, +0x80,0xdc,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x12,0x58,0x57,0x80,0xd1,0x7c,0xa5,0x7c, +0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5, +0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2,0x1e,0xb0,0x1e,0xb0,0x54,0xf, +0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x1e,0x50,0x1e,0x50,0x1e,0x50, +0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1,0x7c,0xb3, +0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0,0x43,0xc2,0x7, 0x80,0x7, 0x43, +0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0xa9,0xc6,0xcb, +0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, 0xac,0x13,0x2e,0x4, 0x1c,0x3a, +0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c,0x33,0x80,0x43,0xa, 0x3, 0x2d, +0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0,0xb, 0x2d,0x3, 0x7e,0x9, 0xb0, +0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x3e, +0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c,0xb2,0x1e,0xb0,0x7e,0x90,0x2, +0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d,0xf, 0x1b,0x48,0x0, 0xb, 0x30, +0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, 0x9, 0xb2,0x0, 0xc, 0x54,0x7f, +0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x7, +0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4,0xb, 0x6c,0xaa,0xa, 0x1a,0x49, +0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5,0xb, 0xa0,0xbe,0xa0,0x25,0x40, +0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39,0xb0,0xf5,0xe5,0x75,0xe4,0x31, +0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x32,0x5e, +0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0xca,0x79,0x7e,0x71,0x54,0x3e,0x70,0x3e, +0x70,0x7c,0xb7,0x24,0x56,0xa, 0x2b,0xb, 0x28,0x50,0x7c,0xab,0x7c,0xb7,0x24,0x58, +0xa, 0x3b,0xb, 0x38,0x70,0x4d,0x77,0x68,0x1f,0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0, +0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x58,0x7d, +0x37,0x7e,0x24,0x18,0x0, 0x12,0x55,0x3a,0x5, 0x54,0xe5,0x53,0xbe,0xb1,0x54,0x28, +0x10,0x12,0x62,0xd5,0xb4,0x1, 0x5, 0x75,0x55,0x1, 0x80,0x8, 0x75,0x55,0x3, 0x80, +0x3, 0x75,0x55,0x2, 0xda,0x79,0x22,0x6d,0x11,0x7e,0x24,0x1c,0x1c,0x1b,0x28,0x10, +0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0xa3,0x0, 0x50,0x80,0x2, 0x7c, +0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x7e,0x4, +0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, 0x14,0x1b,0x8, 0x10,0x49,0x13, +0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0x49,0x13,0x0, 0x43, +0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0xb, 0x50,0xbe,0x50,0xd, 0x40, +0xb1,0x22,0x75,0x9, 0x0, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, +0x9, 0xe5,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, +0x12,0x27,0x4a,0xf5,0x91,0x75,0xa, 0x0, 0xe4,0x7a,0xb3,0x0, 0xfa,0x7e,0x34,0x0, +0x76,0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0x0, 0xb8,0x7e,0x24, +0x0, 0x42,0x74,0xff,0x12,0x6e,0x21,0x74,0xaa,0x7a,0xb3,0x0, 0x76,0x7a,0xb3,0x0, +0x77,0x7a,0xb3,0x0, 0xb8,0x7a,0xb3,0x0, 0xb9,0x22,0xca,0xf8,0x74,0x3, 0x7a,0xb3, +0x16,0xa0,0xe4,0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x74,0x3, 0x7a,0xb3,0x16, +0xa0,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x7e, +0xf3,0x16,0xa0,0xbe,0xf0,0x3, 0x78,0x1d,0xe5,0xb, 0x30,0xe7,0xe4,0x12,0x6b,0x35, +0x7e,0x37,0xf, 0xd6,0x7a,0x37,0x16,0x9d,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x16,0x9b, +0x53,0xb, 0x7f,0x80,0xcc,0x7a,0xf3,0x10,0xa5,0x12,0x0, 0x1e,0x12,0x0, 0x6a,0xda, +0xf8,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5, +0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7c,0xb3,0xf5,0xbd,0xa, +0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5,0xc3,0xe5,0xc4,0x54,0xe0,0x4c, +0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23,0x4e,0x24,0x0, 0x1, 0x7c,0x15, +0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2,0x0, 0x0, 0x0, 0x0, 0xa9,0x37, +0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x6c,0xaa,0x6c,0x77,0x7e,0x10,0x30, +0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d,0x1, 0x2e,0x7, 0xf, 0xda,0xb, +0x8, 0x20,0xbe,0x27,0xe, 0x5, 0x8, 0x12,0x7d,0x41,0x2e,0x47,0xf, 0xd8,0xb, 0x48, +0x0, 0x2e,0x7, 0xe, 0x5, 0x1b,0x48,0x0, 0x80,0x18,0x6d,0x0, 0x9e,0x7, 0xe, 0x5, +0xbd,0x20,0x58,0xe, 0x2e,0x17,0xf, 0xd8,0xb, 0x18,0x20,0x9e,0x27,0xe, 0x5, 0x1b, +0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0,0xbe,0xa0,0xd, 0x40,0xac,0x22, +0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, 0x31,0x7e,0x79,0x50,0xa5,0xbd, +0x0, 0xb, 0x7e,0xd, 0x31,0x7e,0xb, 0x40,0x7a,0x79,0x40,0x80,0x36,0x7e,0xd, 0x31, +0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12,0x6e,0x11,0xa, 0x2c,0xbd,0x32, +0x8, 0x18,0x7e,0x1d,0x31,0x7e,0x1b,0xb0,0x7e,0x79,0xa0,0xbc,0xba,0x7c,0xba,0x28, +0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0,0x7e,0x79,0x30,0x7e,0x1d,0x31, +0x7a,0x1b,0x30,0xda,0x3b,0x22,0x7e,0xb3,0x10,0x39,0xb4,0x1, 0x26,0x7e,0x73,0xa, +0xac,0x7a,0x73,0x10,0x37,0x7e,0x73,0xa, 0xad,0x7a,0x73,0x10,0x38,0x7e,0x73,0xa, +0xae,0x7a,0x73,0x10,0x3a,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, +0xdc,0x80,0x24,0x7e,0x73,0x11,0x16,0x7a,0x73,0x10,0x37,0x7e,0x73,0x11,0x49,0x7a, +0x73,0x10,0x38,0x7e,0x73,0x11,0x94,0x7a,0x73,0x10,0x3a,0x7e,0x34,0x11,0x9d,0x7a, +0x37,0x10,0x46,0x7e,0x34,0xf, 0x63,0x7a,0x37,0x10,0x48,0x22,0xe5,0x55,0xbe,0xb0, +0x1, 0x68,0xf9,0xe5,0x74,0x60,0xfc,0xe5,0x75,0x60,0xfc,0x20,0x93,0xfd,0xd2,0x96, +0xd2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e,0xb3,0x16,0xa9,0x70,0x17,0xe5, +0xcc,0x7a,0xb3,0x16,0xaa,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xac, +0x74,0x1, 0x7a,0xb3,0x16,0xa9,0xa9,0xc0,0xca,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d, +0x8, 0x1b,0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0x75,0x87,0x2, 0x0, +0x0, 0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e,0x37,0xf, 0xd6,0xb, +0x38,0x10,0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xa0, +0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e, +0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0, +0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e,0x24,0x3, 0x70,0x74,0x18,0x7e, +0x13,0x10,0x2b,0x6c,0x0, 0x2, 0x5f,0x32,0x9, 0xa3,0x0, 0x24,0xbe,0xa0,0x1, 0x78, +0x5, 0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43,0xcc,0x8, 0x9, 0x53,0x0, 0x2, +0x3e,0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca,0xa9,0xd0,0xca,0xd2,0xcd,0xbe, +0xa0,0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9,0xc0,0xc9,0x7e,0x14,0x1d,0x0, +0xb, 0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20,0x9, 0xb3,0x0, 0x3f,0xb4,0x1, +0xc, 0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54,0xf0,0xf5,0xe5,0x22,0x12,0x4b, +0xdf,0x12,0x3c,0xc2,0x12,0x69,0xb, 0x7e,0x34,0x8, 0x50,0x7a,0x37,0xf, 0xd4,0x7e, +0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x7e,0x34,0x8, 0x9a,0x7e,0x27,0xf, 0xd4,0x12, +0x6a,0xca,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xf, 0xd8,0x7e,0x34,0x3, 0x70,0x7a,0x37, +0xf, 0xda,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xf, 0xd8,0x12,0x68,0x15,0x12,0x64,0xd4, +0x12,0x5a,0x90,0x12,0x6a,0x7f,0x12,0x52,0x72,0x12,0x6e,0x93,0x74,0x1, 0x7a,0xb3, +0x11,0x96,0x22,0xca,0xf8,0x7e,0xb3,0xf, 0xd2,0xb4,0x1, 0x48,0x6c,0xff,0x80,0x3c, +0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0xb1, +0x7e,0x53,0x10,0x2b,0x12,0x35,0x61,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x86,0x7e, +0x37,0xf, 0xd6,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0xb2,0x7e,0x53,0x10,0x2c,0x12, +0x35,0x61,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x88,0xb, 0xf0,0x7e,0x73,0xd, 0x16, +0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0xca,0x69,0xca,0xf8,0x7c,0xfb,0x7e,0x24,0x0, +0x4, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24,0x56,0xa, 0x3b,0x1b,0x38,0x20, +0x6d,0x66,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38,0x60,0xb, 0xf0,0x12,0x0, 0x6e, +0x50,0x1e,0x7e,0x24,0x0, 0x5, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24,0x56, +0xa, 0x3b,0x1b,0x38,0x20,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38,0x60,0xb, 0xf0, +0x7c,0xbf,0xda,0xf8,0xda,0x69,0x22,0x7e,0x47,0x16,0x36,0x6c,0x77,0x7e,0xa0,0xff, +0x7e,0x43,0x16,0x25,0xa, 0x14,0x9, 0x51,0xf, 0x29,0xbe,0x53,0x10,0x4a,0x78,0x32, +0x7e,0x50,0x12,0xac,0x45,0x49,0x22,0x16,0x36,0xbe,0x24,0x0, 0x41,0x40,0x23,0x7e, +0x60,0x1, 0xbe,0x44,0x0, 0x19,0x40,0x18,0x7e,0x30,0x12,0xac,0x36,0x49,0x21,0x16, +0x36,0xbd,0x24,0x50,0x4, 0x7d,0x42,0x7c,0x76,0xb, 0x60,0xbe,0x60,0x4, 0x40,0xe2, +0x7c,0xa7,0x7c,0xba,0x22,0xca,0x79,0xe5,0x53,0xbe,0xb1,0x54,0x38,0x4, 0x6c,0xff, +0x80,0x3a,0xe5,0x54,0x3e,0xb0,0x3e,0xb0,0x24,0x56,0xa, 0x3b,0xb, 0x38,0x30,0x7c, +0xe7,0xbe,0xe0,0x1, 0x68,0xe, 0xbe,0xe0,0x2, 0x68,0x9, 0xbe,0xe0,0x3, 0x68,0x4, +0x4c,0xee,0x78,0x7, 0x7c,0xbe,0x12,0x63,0x6c,0x7c,0xfb,0xbe,0xe0,0x4, 0x68,0x5, +0xbe,0xe0,0x5, 0x78,0x7, 0x7c,0xbe,0x12,0x51,0xe1,0x7c,0xfb,0x7c,0xbf,0xda,0x79, +0x22,0x7e,0xa3,0xd, 0xf7,0xbe,0xa0,0x0, 0x28,0x40,0x6c,0x77,0x80,0x38,0x7e,0x50, +0x2, 0xac,0x57,0x9, 0x62,0xd, 0x18,0x9, 0x52,0xd, 0x19,0x7e,0x30,0x2, 0xac,0x36, +0x49,0x1, 0x11,0xce,0x7e,0x17,0xf, 0x4a,0xe, 0x14,0xbd,0x1, 0x48,0x13,0x7e,0x30, +0x2, 0xac,0x35,0x49,0x1, 0x11,0x9e,0x7e,0x17,0xf, 0x4c,0xe, 0x14,0xbd,0x1, 0x58, +0x3, 0x74,0x1, 0x22,0xb, 0x70,0xbc,0xa7,0x38,0xc4,0xe4,0x22,0xca,0xf8,0x7c,0xfb, +0xbe,0xf0,0x1, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xf0,0x2, 0x68,0x4, 0x4c,0xff,0x78, +0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x39,0x80,0x3, 0xe4,0x80,0x28,0x12,0x60,0x36,0x4c, +0xff,0x78,0x11,0xe4,0x7a,0xb3,0x10,0x3a,0x74,0x1e,0x7a,0xb3,0x10,0x37,0x74,0xa, +0x7a,0xb3,0x10,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12, +0x65,0x59,0x74,0x1, 0xda,0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca, +0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75,0x74,0x1, 0x7e,0x24, +0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x60,0x2, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x70, +0x2, 0x1b,0x28,0x30,0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0xc8,0xd0,0x82,0xd0,0x83, +0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b, +0x32,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba, +0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7a,0xa1,0xc3,0x75,0xc5,0x40, +0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5, +0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x3b,0xe5,0xc6,0xa, 0x2b,0x7c,0x45, +0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22,0xe4,0x7a,0xb3,0x15,0x9f,0x7a,0xb3,0x15, +0x53,0x7a,0xb3,0x15,0x9e,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0xa1,0x7e,0x34,0x15, +0x56,0x7e,0x24,0x0, 0x48,0x12,0x6e,0x21,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x48, +0xe4,0x12,0x6e,0x21,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e, +0x21,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x46,0x74,0xff,0x2, 0x6e,0x21,0xd2,0xcd, +0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e,0xb3,0x16,0xa9,0xb4,0x1, 0x15, +0x7e,0x73,0x16,0xac,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x7e,0xb3,0x16, +0xaa,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20, +0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a, +0xb3,0x16,0xa9,0x22,0x7e,0x34,0x1, 0x90,0x7a,0x37,0xd, 0xff,0x7e,0x34,0x0, 0x19, +0x7a,0x37,0xe, 0x1, 0x7e,0x34,0x0, 0x9c,0x7a,0x37,0xe, 0x3, 0x7e,0x34,0x0, 0x8, +0x7a,0x37,0xe, 0x5, 0x7e,0x34,0x0, 0x4, 0x7a,0x37,0xe, 0x7, 0x74,0x1, 0x7a,0xb3, +0xe, 0x9, 0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x7e,0x34,0x10,0x3, +0x7e,0x24,0x0, 0x28,0xe4,0x2, 0x6e,0x21,0x7c,0xab,0x6c,0x33,0x80,0x36,0xa, 0x3, +0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d,0x3, 0x7e, +0x9, 0x10,0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e,0x20,0x1e, +0x20,0x7e,0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d,0xf, 0x1b, +0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x75,0x75,0x0, 0x75,0xe4,0x3, 0x49, +0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, 0x5e,0x24, +0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5,0x75,0xe4, +0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9,0xd6,0xea, +0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1,0x22,0xca,0xf8,0x7e,0x24,0xe, 0xd, +0x7e,0x34,0xe, 0x99,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x6c,0xff,0x74,0x7, 0xac, +0xbf,0x49,0x35,0xe, 0xd, 0x12,0x4c,0xa8,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x99, +0x49,0x35,0xe, 0xf, 0x12,0x4a,0x31,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x9b,0xb, +0xf0,0xbe,0xf0,0xa, 0x40,0xd7,0xda,0xf8,0x22,0x6d,0x33,0x6c,0xaa,0x80,0x2e,0x7e, +0x30,0x2, 0xac,0x3a,0x9, 0x51,0xd, 0x18,0x9, 0x41,0xd, 0x19,0x7e,0x10,0x30,0xac, +0x15,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xf, 0xda,0xb, 0x18,0x40,0xbe, +0x44,0x0, 0x0, 0x8, 0x6, 0xbd,0x43,0x8, 0x2, 0x7d,0x34,0xb, 0xa0,0x7e,0xb3,0xd, +0xf7,0xbc,0xba,0x38,0xca,0x22,0xca,0x79,0x7d,0x41,0x7d,0x13,0x6d,0x0, 0x7e,0x34, +0x7f,0xff,0x6c,0xaa,0x80,0x1b,0x7e,0xf0,0x7, 0xac,0xfa,0x7d,0xe7,0x2d,0xe4,0x49, +0xfe,0x0, 0x2, 0xbd,0xf0,0x28,0x2, 0x7d,0xf, 0xbd,0xf3,0x50,0x2, 0x7d,0x3f,0xb, +0xa0,0x9, 0xb4,0x0, 0x46,0xbc,0xba,0x38,0xdd,0x1b,0x18,0x0, 0x1b,0x28,0x30,0xda, +0x79,0x22,0xca,0xf8,0x7e,0xb3,0x10,0x4e,0x60,0x3, 0xb4,0x1, 0x2d,0xa9,0xc6,0xea, +0x12,0x29,0x9c,0x7c,0xfb,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x68,0x15, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x54,0x21,0xbe,0xf0,0x1, 0x78,0x4, +0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0x10,0x4e,0xda,0xf8,0x22,0x7e,0xb3,0x16, +0x25,0x4, 0x7a,0xb3,0x16,0x25,0x7e,0x73,0x16,0x25,0xbe,0x70,0x4, 0x40,0x5, 0xe4, +0x7a,0xb3,0x16,0x25,0x7e,0xa3,0x16,0x25,0xbe,0xa0,0x3, 0x78,0x13,0x7e,0xb3,0x16, +0x6e,0x4, 0x7a,0xb3,0x16,0x6e,0xbe,0xb0,0x8, 0x40,0x5, 0xe4,0x7a,0xb3,0x16,0x6e, +0xa, 0x3a,0x9, 0xb3,0xf, 0x29,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d,0x21,0x7d, +0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x7d,0x7e,0xb3,0x10,0x3c,0xb4,0x1, 0x1f,0x6c, +0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d,0x26,0xb, +0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3,0xda,0x3b, +0x22,0x7e,0xb3,0x10,0x3d,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3,0x10,0x39, +0x12,0x60,0x36,0x12,0x2d,0xf4,0xe4,0x7a,0xb3,0x10,0x39,0x12,0x60,0x36,0x12,0x2d, +0xf4,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x58,0x7e,0x37,0xf, 0xd4,0x7e,0x24,0x8, 0xe4, +0x12,0x59,0x3f,0x74,0x2, 0x7a,0xb3,0x10,0x3d,0x22,0x7e,0xa3,0xf, 0x1c,0xbe,0xa0, +0x0, 0x38,0x2f,0xbe,0xa3,0xf, 0x1b,0x50,0x19,0x7e,0xb3,0xf, 0x25,0xbe,0xb3,0x12, +0x33,0x28,0x14,0x7e,0xb3,0x12,0x33,0x4, 0x7a,0xb3,0x12,0x33,0x7a,0xa3,0xf, 0x1b, +0x80,0x5, 0xe4,0x7a,0xb3,0x12,0x33,0x7e,0xb3,0xf, 0x1b,0x70,0x5, 0xe4,0x7a,0xb3, +0xf, 0x24,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12,0x54,0xaf, +0x74,0x1, 0x7a,0xb3,0x0, 0xfa,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75, +0x75,0x1, 0x75,0xe6,0x0, 0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0xc8,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0xca,0xf8,0x7d,0x1, 0x7d,0x13,0x7e,0xf3,0x10,0x4d,0xbe,0xf0,0x1, 0x78, +0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x2, 0x80,0x11,0x4c,0xff, +0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x4, 0x12, +0x5f,0x32,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0xf, 0xd3,0x6c,0xaa,0x6c,0x33,0x6d,0xff, +0x7e,0x10,0x18,0xac,0x1a,0xa, 0xe3,0x2d,0xe, 0x3e,0x4, 0x7d,0x40,0x2d,0x42,0x1b, +0x48,0xf0,0x6d,0x44,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x18,0xdf,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xd6,0x22,0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c,0x33,0x4c, +0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d,0x30,0x80, +0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe,0x30,0x3, +0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x2a,0x2d, +0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x7e,0x24,0xff,0xff, +0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x14,0x2d,0x13,0x59, +0x21,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd1,0x22,0x7c,0xab,0x7e,0x24,0xe, +0xdf,0xbe,0xa0,0xa, 0x50,0x25,0xa, 0x3a,0x7d,0x13,0x2d,0x12,0x7e,0x19,0xb0,0xb4, +0x2, 0xe, 0x74,0x1, 0x7a,0x19,0xb0,0x74,0x3, 0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x22, +0x74,0x3, 0x7a,0x19,0xb0,0x2d,0x32,0x19,0xb3,0x0, 0xa, 0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x6e,0x9d,0x53,0xb, 0xfd,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x6d,0x33,0x7a,0x37,0x11, +0xd, 0x74,0x1, 0x7a,0xb3,0x11,0xf, 0x74,0xb, 0x7a,0xb3,0x11,0x10,0x74,0x9, 0x7a, +0xb3,0x11,0x11,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x7a,0xb3,0x11,0x13,0x7a,0xb3,0x11, +0x14,0x74,0x1, 0x7a,0xb3,0x11,0x15,0x22,0x6c,0xaa,0x80,0x1f,0x7e,0x70,0x2, 0xac, +0x7a,0x49,0x23,0x16,0x6f,0x7e,0x70,0x18,0xac,0x7a,0x3e,0x34,0x2e,0x37,0xf, 0xda, +0x2e,0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc, +0xba,0x38,0xd9,0x22,0x75,0x74,0x0, 0xa9,0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28, +0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, +0x2, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, +0x5e,0x0, 0xf, 0x0, 0x96,0x1, 0x2c,0x0, 0xc, 0x0, 0x78,0x0, 0xfa,0x0, 0xa, 0x0, +0x64,0x0, 0xc8,0x0, 0x6, 0x0, 0x32,0x0, 0xa0,0x0, 0x3, 0x0, 0xf, 0x0, 0x78,0x0, +0x2, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56, +0xf5,0xf1,0x7c,0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9, +0x37,0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5, +0xcb,0x22,0xc2,0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54, +0x1e,0x54,0x3e,0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, +0x12,0x6d,0x66,0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x12,0x22,0x3c,0x12,0x3a, +0x2, 0x12,0x4d,0x5f,0x60,0x6, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x7e,0xb3,0xe, 0xb, +0x60,0x3, 0x12,0x60,0xe2,0x7e,0xb3,0xe, 0xc, 0x60,0x6, 0x12,0x55,0xc4,0x2, 0x5f, +0x89,0x22,0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0xf, 0x28,0x12, +0x6a,0x59,0xb4,0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x53,0xb, 0x8f,0x74,0x2, +0x80,0x2, 0x74,0xff,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x67, +0x1, 0x7e,0xb3,0x10,0x3d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x66,0x52,0x7e, +0xb3,0x10,0x4e,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0x7e, +0x34,0xa, 0xb1,0x7e,0x24,0x3, 0x4d,0xe4,0x12,0x6e,0x21,0x7e,0x34,0xb, 0x86,0x7e, +0x24,0x1, 0x90,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0xd, 0x6b,0x7e,0x24,0x0, 0x8c, +0x74,0xff,0x2, 0x6e,0x21,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51, +0x80,0x3, 0x7e,0x39,0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23, +0x0, 0x3b,0x7e,0x34,0x1d,0x6, 0x1b,0x38,0x20,0x22,0xe4,0x7a,0xb3,0xf, 0xd2,0x6c, +0xaa,0x6d,0x44,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x2, 0x1b,0x8, 0x40,0x6d, +0x0, 0x2d,0x13,0x1b,0x18,0x0, 0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x22,0x7e,0x34, +0x12,0x1, 0x7e,0x24,0x0, 0x1e,0xe4,0x12,0x6e,0x21,0x7e,0x34,0x12,0x1f,0x7e,0x24, +0x0, 0x14,0xe4,0x12,0x6e,0x21,0x7e,0x34,0x11,0xed,0x7e,0x24,0x0, 0x14,0xe4,0x2, +0x6e,0x21,0x12,0x0, 0x6e,0x50,0x1d,0x12,0x6e,0xee,0x7c,0xab,0x7e,0xb3,0x11,0x95, +0xbe,0xb0,0x4, 0x68,0xf, 0xbe,0xa0,0xff,0x68,0xa, 0x74,0x1, 0x7a,0xb3,0x11,0xc, +0x7a,0xa3,0x11,0x95,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb3,0x10,0x3d,0x70,0x3, 0x7e, +0xf0,0x1, 0x74,0x1, 0x12,0x3f,0x5b,0xbe,0xb0,0x1, 0x68,0x5, 0xbe,0xf0,0x1, 0x78, +0x4, 0xe4,0x12,0x3f,0x5b,0xda,0xf8,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5, +0x0, 0x75,0xe4,0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, +0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x7e,0x34,0x8, 0x9a,0x7e, +0x24,0x11,0x9e,0x7e,0x14,0x1, 0x90,0x12,0x3e,0x16,0x7e,0x34,0x9, 0x2e,0x7e,0x24, +0x11,0x4a,0x7e,0x14,0x0, 0xc8,0x12,0x3e,0x16,0x2, 0x57,0x5d,0x74,0x1, 0x12,0x6e, +0x7e,0xa9,0xc3,0xea,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x75, +0x9a,0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xe5,0x52,0xb4, +0x1, 0x18,0xe5,0x51,0x70,0x14,0x7e,0xb3,0x11,0x95,0x60,0xb, 0xe4,0x7a,0xb3,0x11, +0x95,0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x12,0x6c,0x99,0x85,0x51,0x52,0x22,0x6c,0xaa, +0x7e,0x50,0x4, 0xac,0x5a,0x49,0x12,0x16,0x89,0xbd,0x13,0x38,0x8, 0x49,0x22,0x16, +0x8b,0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe4,0x7c,0xba,0x22,0x7e, +0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0xce,0x12,0x6c,0xec, +0x7e,0x34,0x7, 0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x2e,0x75, +0x55,0x0, 0x75,0x72,0x0, 0x75,0x54,0x0, 0x12,0x6c,0x3e,0x12,0x62,0x37,0xf5,0x53, +0x12,0x62,0xd5,0xb4,0x1, 0x4, 0x75,0x55,0x1, 0x22,0x75,0x55,0x3, 0x22,0x7e,0x34, +0x0, 0x1, 0x7a,0x35,0x56,0x7e,0x34,0xa, 0x18,0x7a,0x35,0x58,0x7e,0x34,0x0, 0x2, +0x7a,0x35,0x5a,0x7e,0x34,0xa, 0x62,0x7a,0x35,0x5c,0x74,0x2, 0x22,0x0, 0x50,0x0, +0xa, 0x6, 0x4, 0x0, 0x78,0x0, 0xc, 0x6, 0x4, 0x0, 0xc8,0x0, 0x1e,0x8, 0x5, 0x1, +0x40,0x0, 0x50,0x8, 0x5, 0x1, 0xf4,0x0, 0x64,0xa, 0x6, 0xe4,0x7a,0xb3,0x16,0xae, +0x7a,0xb3,0x16,0xad,0x7e,0xb3,0x10,0xa3,0x70,0x6, 0x7e,0x73,0x11,0x10,0x80,0x4, +0x7e,0x73,0x11,0x12,0x7a,0x73,0x16,0xaf,0x22,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x2, +0x7a,0xb3,0x10,0x7b,0x74,0x4, 0x7a,0xb3,0x10,0x7c,0x7e,0x34,0x16,0x26,0x7e,0x24, +0x0, 0x48,0xe4,0x2, 0x6e,0x21,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x75,0x92,0x70, +0xd2,0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8, +0x22,0xe4,0x7a,0xb3,0xd, 0xfb,0x7e,0x34,0x11,0x9e,0x7a,0x37,0xf, 0xd6,0x12,0x40, +0x96,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x2, 0x47,0x4a,0x75,0x74,0x1, 0x7e, +0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e, +0x34,0x0, 0x1, 0x2, 0x6e,0x68,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34, +0xc9,0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0xe5, +0x51,0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0x5a,0x80,0x4, 0x7e,0x34,0x0, 0x3c,0x7a,0x37, +0xf, 0x54,0x7a,0x37,0xf, 0x56,0x22,0xca,0xf8,0x12,0x6e,0x73,0x7c,0xfb,0x12,0x0, +0x6e,0x50,0x7, 0x4c,0xff,0x78,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0xda,0xf8,0x22,0x7e, +0x34,0x0, 0x24,0x12,0x69,0xb9,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, +0x57,0x2e,0x54,0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0x7d,0x3, 0x80, +0xa, 0x7e,0x29,0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d, +0x55,0x78,0xee,0x22,0x7e,0x53,0xf, 0x47,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x9d,0x32, +0xbe,0x34,0x0, 0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4, +0x1, 0x3, 0x43,0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3, +0x16,0xa0,0xe4,0x7a,0xb3,0x16,0xa7,0x74,0xff,0x7a,0xb3,0x16,0x9f,0x22,0x75,0x75, +0x1, 0xd2,0xee,0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x6e,0x68, +0xa, 0x2b,0x19,0x72,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x44,0x1, 0x7a,0xb3,0x10,0xfe, +0x22,0x7d,0x13,0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31, +0x22,0x32,0x1, 0x19,0x1, 0x0, 0x2, 0xf8,0x4, 0xe7,0x5, 0xce,0x6, 0xc2,0x7, 0xb5, +0x8, 0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32, +0x22,0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5, +0x22,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, +0x12,0x0, 0x42,0x12,0x57,0xdd,0x74,0x3, 0x12,0x44,0xf, 0x2, 0x24,0xd0,0x7e,0x34, +0x0, 0x21,0x12,0x69,0xb9,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x7e,0xb3,0x11,0x15, +0xb4,0x1, 0x4, 0xe4,0x2, 0x6e,0xd3,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32, +0x38,0xfa,0x22,0x12,0x63,0x21,0xb4,0x1, 0x2, 0xe4,0x22,0x74,0x1, 0x22,0xd2,0xcf, +0xa9,0xd4,0xc9,0x75,0xcc,0x0, 0xc2,0xca,0x22,0xa9,0xc0,0x93,0x75,0x9, 0x0, 0x75, +0xa, 0x0, 0x32,0x75,0x53,0x0, 0x75,0x54,0x0, 0x75,0x55,0x0, 0x22,0xa9,0x32,0x99, +0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x75,0xb, 0x0, 0x12,0x6f,0x4, 0x2, 0x5e,0x82, +0x12,0x6b,0x9c,0x12,0x6f,0xa, 0x2, 0x6e,0xa7,0xe5,0x74,0x60,0x3, 0x74,0x1, 0x22, +0xe4,0x22,0xe5,0x75,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x1, 0x2, 0x4, 0x8, 0x10, +0x20,0x40,0x80,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0xf5,0x16,0x75,0x17,0x0, 0x22,0x12,0x61,0xe3,0x2, 0x38,0x88,0x12,0x50, +0x15,0x2, 0x62,0x87,0x12,0x6f,0x16,0x2, 0x6c,0x1f,0x7e,0x34,0x1, 0x3, 0x22,0x7e, +0x34,0x5, 0xb, 0x22,0x2, 0x6c,0xb6,0x2, 0x0, 0x76,0x2, 0x6d,0x6, 0x2, 0x6e,0xdb, +0x2, 0x6e,0x9d,0xe5,0x6d,0x22,0x22,0x0, 0x1, 0x15,0xde,0x1, 0x0, 0x1, 0xa, 0xac, +0x15,0x0, 0x1, 0xa, 0xad,0x17,0x0, 0x1, 0xa, 0xae,0x4, 0x0, 0x1, 0xd, 0xfe,0x40, +0x0, 0x5, 0xf, 0x29,0x20,0x17,0x29,0x38,0x13,0x0, 0x18,0xf, 0x2e,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25,0xf, 0x63,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x18, +0xf, 0x88,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xf, 0xa0,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xf, 0xad,0xc, +0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, +0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x0, 0xd, 0xf, 0xc5,0x1, 0x2, 0x3, 0x4, 0x5, +0x6, 0x7, 0x8, 0x0, 0x9, 0xa, 0xb, 0xc, 0x0, 0x25,0xf, 0xdc,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x0, 0xd, 0x10,0xff,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0x0, 0x1, 0x11,0xc, 0x0, 0x0, 0x1, 0x11,0x16,0x15,0x0, 0x32,0x11,0x17, +0x0, 0x8, 0x0, 0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a, +0x1, 0xbc,0x2, 0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, +0x7, 0xf9,0x8, 0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e, +0xc, 0x83,0x0, 0x1, 0x11,0x49,0x17,0x0, 0x1, 0x11,0x94,0x2, 0x0, 0x1, 0x11,0x95, +0x0, 0x0, 0x4, 0x11,0x97,0xff,0xff,0xff,0xff,0x0, 0x2, 0x11,0x9b,0xff,0x1f,0x0, +0x1, 0x11,0x9d,0x40,0x0, 0x1, 0x11,0xe8,0x0, 0x0, 0x4, 0x11,0xe9,0x19,0x1e,0x1e, +0x1e,0x0, 0x1, 0x0, 0xff,0x0, 0x0, 0x1, 0x15,0x53,0x0, 0x0, 0x1, 0x15,0x9e,0x0, +0x0, 0x1, 0x15,0x9f,0x0, 0x0, 0x1, 0x15,0xa0,0x0, 0x0, 0x1, 0x15,0xa1,0x0, 0x0, +0x1, 0x12,0x33,0x0, 0x0, 0x1, 0x16,0xa9,0x0, 0x0, 0x1, 0x16,0xb1,0x0, 0x0, 0x1, +0x16,0xb2,0x0, 0x0, 0x1, 0x16,0xb3,0x0, 0x0, 0x1, 0x16,0xb4,0x0, 0x0, 0x1, 0x16, +0xb5,0x0, 0x0, 0x1, 0x16,0xb6,0x0, 0x0, 0x1, 0x16,0xb7,0x1, 0x0, 0x1, 0x16,0xb8, +0x1, 0x0, 0xc, 0x16,0x89,0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, +0x94,0x0, 0x6, 0x16,0x95,0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x1, 0x16,0x25,0x3, +0x0, 0x1, 0x16,0x6e,0x0, 0x0, 0x1, 0x16,0xb9,0x0, 0x0, 0x1, 0x16,0xba,0x0, 0x0, +0x1, 0x16,0xbb,0x0, 0x0, 0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x71,0x6, 0x8e,0xf9, +0xc3,0x3c,0x4, 0x51, \ No newline at end of file diff --git a/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_tianma_720p.txt b/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_tianma_720p.txt new file mode 100644 index 0000000000000..d475004e5121e --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_tianma_720p.txt @@ -0,0 +1,1806 @@ +0x2, 0x50,0xe2,0x2, 0x68,0x6e,0xe5,0x74,0x60,0x9, 0x74,0x1, 0x12,0x6e,0x92,0x75, +0x74,0x0, 0x22,0xe4,0x12,0x6e,0x92,0x75,0x74,0x1, 0x22,0x2, 0x50,0x4c,0xe5,0x55, +0xbe,0xb0,0x1, 0x68,0xf9,0x12,0x6e,0x78,0x60,0xfb,0x22,0x2, 0x67,0x5, 0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81,0x60, +0xfb,0x22,0x22,0x2, 0x6e,0x48,0xc2,0x8e,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0x22,0x32,0x2, 0x63,0x4d,0xbe,0xb0, +0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x16,0xa2,0x22,0x22,0x2, 0x0, 0x5a,0xe5,0x52, +0x24,0xff,0x22,0x2, 0x67,0x3d,0xca,0x3b,0x7e,0xb3,0xf, 0x1b,0xf5,0x26,0x7e,0xd3, +0xf, 0x1c,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x33,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, +0xa, 0xe4,0x12,0x6d,0xe0,0x6c,0xcc,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7c,0x19, +0xa3,0x13,0xba,0x7e,0x34,0x7f,0xff,0x74,0x7, 0xac,0xbc,0x59,0x35,0x13,0xb6,0x74, +0x7, 0xac,0xbc,0x59,0x35,0x13,0xb8,0xb, 0xc0,0xbe,0xc0,0xa, 0x78,0xd9,0xe5,0x26, +0x60,0x3, 0x2, 0x0, 0xef,0x12,0x6a,0xad,0xbe,0xd0,0x0, 0x38,0x3, 0x2, 0x0, 0xdf, +0x74,0x1, 0x7a,0xb3,0xf, 0x20,0xe4,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7e, +0x34,0x13,0x6, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x2, 0x1, 0x14,0x4c, +0xdd,0x68,0x3, 0x2, 0x1, 0x14,0x75,0x25,0x0, 0x7e,0xa0,0xff,0x7e,0x71,0x25,0x74, +0x7, 0xac,0x7b,0x19,0xa3,0xe, 0x57,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xeb,0x74,0x1, +0x7a,0xb3,0xf, 0x1f,0x75,0x25,0x0, 0x2, 0x1, 0x4c,0x7e,0x51,0x25,0x74,0x7, 0xac, +0x5b,0x2e,0x24,0xe, 0xd, 0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x51,0x25,0xac,0x5b,0x2e,0x24,0xe, 0xf, 0xb, 0x28,0x30,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x5, 0x25,0xe5,0x26,0xbe,0xb1, +0x25,0x38,0xc7,0xe4,0x6c,0x77,0x7e,0x61,0x26,0x7e,0x24,0x13,0xb6,0x12,0x52,0x98, +0x7e,0x71,0x26,0x7e,0x60,0xa, 0x7e,0x24,0x13,0xb6,0x12,0x52,0x98,0x7c,0xcb,0x6c, +0xee,0x75,0x25,0x0, 0x2, 0x1, 0x92,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65,0x13, +0xba,0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x11,0xbc,0x76,0x78,0x3, 0x2, 0x1, 0x97, +0x5, 0x25,0xbe,0xc1,0x25,0x38,0xe0,0xbe,0xc1,0x25,0x68,0x3, 0x2, 0x1, 0xb8,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3c,0x2e,0x14,0x13, +0xb6,0x74,0x7, 0x12,0x48,0xc5,0xb, 0xc0,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xb2,0x7e, +0x24,0x13,0xb6,0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x4c,0xdd, +0x68,0x3, 0x2, 0x1, 0xe7,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, +0x46,0x12,0x6d,0x3c,0x2, 0x4, 0x84,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x4, 0x84, +0x6c,0xee,0x2, 0x4, 0x7b,0x75,0x25,0x0, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65, +0xe, 0x57,0x7e,0x90,0x7, 0xac,0x9e,0x9, 0x74,0xe, 0x11,0xbc,0x67,0x78,0x3, 0x2, +0x2, 0x1b,0x5, 0x25,0xe5,0x25,0xbe,0xb0,0xa, 0x40,0xdd,0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x9, 0xf5,0xe, 0x57,0x49,0x34,0xe, 0xf, 0x49,0x25,0xe, 0x55,0x12,0x6d,0xb0, +0x7d,0x63,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, 0xa4, +0x49,0x25,0xe, 0x53,0x12,0x6d,0xb0,0x7d,0x13,0x2d,0x16,0x7a,0x15,0x21,0x7c,0x1f, +0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7,0xbe,0x14,0x0, 0x40,0x28,0x3, 0x2, 0x2, 0xd9, +0x7e,0x35,0x21,0xbe,0x34,0x0, 0x20,0x38,0x3, 0x2, 0x2, 0xae,0x7e,0x70,0x3, 0xac, +0x7f,0x9, 0xb3,0x12,0x2, 0x60,0x3, 0x2, 0x2, 0x97,0x9, 0xb3,0x12,0x3, 0xbe,0xb0, +0x0, 0x38,0x3, 0x2, 0x2, 0x89,0x2, 0x2, 0xbf,0x74,0x1, 0x19,0xb3,0x12,0x2, 0x6d, +0x22,0x7a,0x25,0x21,0x2, 0x2, 0xed,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0xa, 0x40,0x3, +0x2, 0x2, 0xed,0x2e,0x34,0x12,0x3, 0x4, 0x7a,0x39,0xb0,0x2, 0x2, 0xd1,0x7e,0x70, +0x3, 0xac,0x7f,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x2, 0xcc,0x7d, +0x23,0x2e,0x24,0x12,0x3, 0x14,0x7a,0x29,0xb0,0x2, 0x2, 0xed,0xe4,0x19,0xb3,0x12, +0x2, 0x6d,0x33,0x7a,0x35,0x21,0x2, 0x2, 0xed,0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7f, +0x19,0xa3,0x12,0x3, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x2, 0x7e,0x35,0x21, +0xbe,0x34,0x0, 0x20,0x28,0x3, 0x2, 0x3, 0x2e,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49, +0x35,0xe, 0x53,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x35,0xe, 0x55,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0x6d,0x33,0x7a, +0x35,0x21,0x7e,0xa0,0x1, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x1, 0x7e,0xf5, +0x21,0x7a,0xf5,0x23,0xa, 0xef,0x2e,0xe5,0x33,0x7e,0xe9,0xb0,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x3, 0x52,0x6d,0xee,0x74,0x2, 0xac,0xbf,0x59,0xe5,0x11,0xed,0x59,0xe5, +0x12,0x1f,0x7e,0x17,0xf, 0x5d,0xbe,0x15,0x23,0x28,0x3, 0x2, 0x3, 0x68,0x7e,0x4, +0x1, 0x0, 0x7a,0x5, 0x31,0x2, 0x3, 0x8b,0x7e,0x35,0x23,0x6d,0x22,0x7c,0x56,0x7c, +0x67,0x6c,0x77,0x12,0x48,0x3e,0x7d,0xe3,0x7a,0xe5,0x31,0xbe,0xe4,0x0, 0x10,0x40, +0x3, 0x2, 0x3, 0x8b,0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x31,0x74,0x2, 0xac,0xbf,0x49, +0x45,0x12,0x1f,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x3, 0xa5,0x49,0x45,0x11,0xed,0x7a, +0x45,0x31,0x2, 0x3, 0xac,0x7e,0x45,0x31,0x59,0x45,0x11,0xed,0x59,0xf5,0x12,0x1f, +0x7e,0x35,0x31,0xbe,0x34,0x1, 0x0, 0x38,0x3, 0x2, 0x3, 0xc3,0x7e,0x34,0x1, 0x0, +0x7a,0x35,0x31,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x25,0xe, 0x53,0x12,0x6d,0xb0,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31, +0xad,0x32,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, +0xac,0x5b,0x49,0x32,0xe, 0x53,0xac,0xbe,0x49,0x15,0xe, 0xd, 0xbd,0x13,0x38,0x3, +0x2, 0x4, 0x14,0x7d,0x2, 0x2e,0x4, 0xe, 0x53,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, +0x10,0x2, 0x4, 0x1e,0x2e,0x24,0xe, 0x53,0x9e,0x35,0x21,0x1b,0x28,0x30,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49,0x25,0xe, 0x55, +0x12,0x6d,0xb0,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31,0xad,0x32,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, 0xac,0x5b,0x49,0x32,0xe, +0x55,0xac,0xbe,0x49,0x15,0xe, 0xf, 0xbd,0x13,0x38,0x3, 0x2, 0x4, 0x6f,0x7d,0x2, +0x2e,0x4, 0xe, 0x55,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, 0x10,0x2, 0x4, 0x79,0x2e, +0x24,0xe, 0x55,0x9e,0x35,0x21,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x26,0xbc,0xbe,0x28, +0x3, 0x2, 0x1, 0xf5,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x49,0x45,0xe, 0x53,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x35,0x49,0x45,0xe, 0x55,0x1e,0x44,0x1e, +0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x37,0x9, 0xf5,0xe, 0x57,0x19,0xf5,0xe, 0x11, +0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x58,0x19,0x75,0xe, 0x12,0x74,0x7, 0xac,0xbe, +0x9, 0x75,0xe, 0x59,0x19,0x75,0xe, 0x13,0x7c,0xbf,0x54,0xf, 0xbe,0xb0,0xa, 0x40, +0x3, 0x2, 0x5, 0xd7,0x7c,0xfb,0xa, 0xf, 0x7d,0x10,0x2e,0x15,0x33,0x7e,0x19,0xb0, +0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x5, 0xf4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x4, 0xf9, +0x74,0xff,0x19,0xb0,0x13,0x6, 0x2, 0x5, 0xd7,0x9, 0x90,0x13,0x6, 0xbe,0x90,0xff, +0x68,0x3, 0x2, 0x5, 0x4b,0x74,0x1, 0x19,0xb0,0x13,0x6, 0x7e,0x15,0x35,0x74,0x7, +0xac,0xbe,0x59,0x15,0xe, 0xd, 0x7e,0x15,0x37,0x74,0x7, 0xac,0xbe,0x59,0x15,0xe, +0xf, 0x6c,0xdd,0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x50,0x7, 0xac, +0x5d,0x7e,0x30,0x15,0xac,0x3f,0x2d,0x12,0x2e,0x14,0x12,0x34,0x74,0x7, 0x12,0x48, +0xc5,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xdb,0x2, 0x5, 0xd7,0xbe,0x90,0x3, 0x50,0x3, +0x2, 0x5, 0x58,0xe4,0x19,0xb0,0x13,0x6, 0x7e,0x25,0x35,0x9, 0x80,0x13,0x6, 0x7e, +0x90,0x7, 0xac,0x89,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x43,0x59,0x24,0x12,0x34,0x7e, +0x25,0x37,0x59,0x24,0x12,0x36,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x5, 0xa0,0xe4, +0x2e,0x34,0x12,0x34,0x12,0x67,0xd9,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x74, +0x1, 0x7e,0x70,0x15,0xac,0x7f,0x2e,0x34,0x12,0x34,0x12,0x67,0xd9,0x2, 0x5, 0xc2, +0x49,0x34,0x12,0x34,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0xa, 0x3f,0x9, 0x43, +0x13,0x6, 0x7e,0x50,0x7, 0xac,0x45,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x32,0x49,0x33, +0x12,0x36,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0xa, 0x3f,0x2e,0x34,0x13,0x6, +0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x7c,0x1e,0x2e,0x10,0x27,0xa5,0xe7,0x60,0x3, +0x2, 0x5, 0xf4,0x7e,0x70,0x3, 0xac,0x7e,0x2e,0x34,0x12,0x1, 0x7e,0x24,0x0, 0x3, +0xe4,0x12,0x6d,0xe0,0xb, 0xe0,0xbe,0xe0,0xa, 0x68,0x3, 0x2, 0x4, 0x86,0xe5,0x26, +0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x6, 0xe, 0x74,0x1, 0x7a,0xb3,0xf, 0x24,0xda,0x3b, +0x22,0xca,0x3b,0x7e,0xe3,0xf, 0x1b,0x4c,0xee,0x78,0x27,0x6c,0xff,0x6d,0x11,0x74, +0x2, 0xac,0xbf,0x59,0x15,0x13,0x56,0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x19, +0xa1,0x13,0x14,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x13,0x6a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xdb,0x6c,0xff,0x2, 0x7, 0xac,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xe, 0x11,0x54, +0xf, 0xf5,0x22,0xbe,0xb0,0xa, 0x40,0x3, 0x2, 0x7, 0xaa,0xe5,0x22,0xa, 0x1b,0x9, +0xb1,0xe, 0xdf,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x7, 0x85,0x75,0x21,0x0, 0x7e,0x31, +0x21,0x74,0x7, 0xac,0x3b,0x9, 0x71,0x13,0x14,0x7a,0x71,0x23,0xbe,0x71,0x22,0x68, +0x3, 0x2, 0x7, 0x77,0x49,0x21,0x13,0x12,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xf, +0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x7e,0xa1,0x21,0x74,0x7, 0xa4,0x49,0x25,0x13, +0x10,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x3, +0x2d,0x6, 0xe5,0x23,0xa, 0x1b,0x9, 0xa1,0x13,0x6a,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0x71,0x23,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x13,0x56,0x2e,0x14,0x13,0x6a,0x7c,0xba, +0x14,0x7a,0x19,0xb0,0x2, 0x7, 0xaa,0x7e,0xa1,0x23,0x74,0x2, 0xa4,0x49,0x15,0x13, +0x56,0xbe,0x14,0x0, 0x32,0x28,0x9, 0xbe,0x4, 0x0, 0x32,0x28,0x3, 0x2, 0x7, 0x71, +0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, +0x80,0x6f,0xbe,0x4, 0x0, 0x96,0x28,0x63,0xe5,0x22,0xa, 0x1b,0x9, 0xb1,0xe, 0xdf, +0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0xe, 0xdf,0x7e,0xa0,0x3, 0xe5, +0x22,0xa, 0x1b,0x19,0xa1,0xe, 0xe9,0x7e,0x71,0x21,0x74,0x7, 0xac,0x7b,0x2e,0x34, +0x13,0x10,0x7e,0x14,0x13,0xb6,0x12,0x48,0xc5,0xbe,0xe0,0x0, 0x28,0x2d,0x1b,0xe0, +0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3f,0x2e,0x14, +0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x7e,0x34,0x13,0xb6,0x7e,0x30,0x7, 0xac,0x3e, +0x2e,0x14,0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x1b,0xf0,0x7e,0xa1,0x23,0x74,0x2, +0xa4,0x59,0x5, 0x13,0x56,0x80,0x33,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0xa, 0x50,0x3, +0x2, 0x6, 0x6e,0x80,0x25,0x6d,0x11,0x7e,0xa1,0x22,0x74,0x2, 0xa4,0x59,0x15,0x13, +0x56,0x7e,0xa0,0xff,0x7e,0x31,0x22,0x74,0x7, 0xac,0x3b,0x19,0xa1,0x13,0x14,0x7e, +0xa0,0x2, 0xe5,0x22,0xa, 0x1b,0x19,0xa1,0x13,0x6a,0xb, 0xf0,0xbc,0xef,0x28,0x3, +0x2, 0x6, 0x47,0x7a,0xe3,0xf, 0x1b,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0x10,0x7e, +0x14,0x0, 0x46,0x12,0x6d,0x3c,0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d, +0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x24,0xc, 0x75,0x25,0x0, +0x75,0x26,0x17,0x75,0x27,0x0, 0x7e,0x34,0x13,0xd0,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6d,0xe0,0x6c,0x66,0x2, 0x8, 0xed,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xd, 0x18,0x7a, +0x71,0x23,0x9, 0xa5,0xd, 0x19,0x1a,0x17,0x7d,0x21,0x1b,0x25,0xb, 0x15,0x7c,0x43, +0x1a,0x1a,0x1b,0x15,0x1a,0xa, 0xb, 0x5, 0x7c,0x21,0xbe,0x50,0x0, 0x58,0x2, 0x6c, +0x55,0x7e,0x73,0x10,0x2b,0xa, 0x7, 0x1b,0x4, 0x1a,0x44,0xbd,0x40,0x8, 0x2, 0x7c, +0x41,0xbe,0x30,0x0, 0x58,0x2, 0x6c,0x33,0x7e,0x73,0x10,0x2c,0xa, 0x7, 0x1b,0x4, +0x1a,0x42,0xbd,0x40,0x8, 0x2, 0x7c,0x21,0xbe,0x51,0x24,0x58,0x3, 0x7a,0x51,0x24, +0xbe,0x41,0x25,0x8, 0x3, 0x7a,0x41,0x25,0xbe,0x31,0x26,0x58,0x3, 0x7a,0x31,0x26, +0xbe,0x21,0x27,0x8, 0x3, 0x7a,0x21,0x27,0x7c,0xf5,0x80,0x4b,0x7c,0xe3,0x80,0x41, +0x1a,0xef,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0xe, 0x2d,0xf, 0xe, 0x4, 0xe, 0x4, +0xe, 0x4, 0x7c,0x71,0x7a,0x71,0x21,0x7e,0x10,0x18,0xac,0x1f,0x7c,0xb1,0x2c,0xbe, +0x54,0x7, 0x7e,0x4, 0x0, 0x1, 0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7c,0xb1,0xf5, +0x22,0xa, 0x7, 0x2e,0x4, 0x13,0xd0,0x7e,0x9, 0xb0,0x45,0x22,0x7a,0x9, 0xb0,0xb, +0xe0,0xbc,0x2e,0x58,0xbb,0xb, 0xf0,0xbc,0x4f,0x58,0xb1,0xb, 0x60,0x7e,0x73,0xd, +0xf7,0xbc,0x76,0x28,0x3, 0x2, 0x8, 0x27,0xbe,0x70,0x0, 0x38,0x3, 0x2, 0xd, 0x43, +0x7e,0xe1,0x26,0x2, 0xd, 0x3a,0x6c,0xff,0x80,0x1f,0x1a,0x3e,0x3e,0x34,0x1a,0x2f, +0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36,0xb, 0x38,0x30,0xe, 0x34,0xe, +0x34,0x3e,0x24,0x59,0x32,0x13,0xb6,0xb, 0xf0,0x7e,0x73,0x10,0x2b,0xbc,0x7f,0x18, +0xd9,0x7e,0xf1,0x24,0x2, 0xd, 0x2f,0x1a,0x4f,0x7e,0x14,0x0, 0x18,0xad,0x14,0x1a, +0x3e,0x7d,0x51,0x2d,0x53,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7a,0xa1,0x21, +0x7e,0x50,0x18,0xac,0x5f,0x7c,0xb5,0x2c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x22,0xa, 0x2a,0x9, 0xb2,0x13,0xd0, +0x55,0x22,0x78,0x3, 0x2, 0xd, 0x2d,0xbe,0xf0,0x3, 0x58,0x3, 0x2, 0x9, 0xfe,0x7e, +0x53,0x10,0x2b,0xa, 0x25,0x1b,0x26,0xbd,0x42,0x18,0x73,0x7d,0xf4,0x3e,0xf4,0x49, +0x5f,0x13,0xba,0x49,0x2f,0x13,0xb2,0x2d,0x25,0x7d,0x52,0x3e,0x54,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x2d,0x25,0x49,0x5f,0x13,0xbc,0x49,0xef,0x13,0xb0,0x2d,0xe5,0x7d, +0x5e,0x3e,0x54,0x2d,0x5e,0x9d,0x25,0x49,0xef,0x13,0xb8,0x49,0x5f,0x13,0xb4,0x2d, +0x5e,0x7d,0xe5,0x3e,0xe4,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d, +0x5e,0x9d,0x25,0x49,0x5f,0x13,0xb6,0x7d,0x5, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x9d,0x10,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x2, 0xb, 0x55,0x4c,0xff, +0x78,0x5d,0x7d,0x24,0x3e,0x24,0x49,0x12,0x13,0xb6,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x3e,0x54,0x2d,0x50,0x7d,0x1, 0x3e,0x4, 0x2d,0x5, 0x2d,0x1, 0x49,0x12,0x13,0xb8, +0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5, 0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x9d,0x1, 0x49,0x12,0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x2d,0x50,0x9d,0x51,0x49,0x22,0x13,0xbc,0x3e,0x24,0x9d,0x52,0x2, 0xb, 0x55,0xbe, +0xf0,0x1, 0x78,0x69,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x49,0x20, +0x13,0xb6,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x25,0x9d,0x21,0x49,0x10, +0x13,0xb8,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x21,0x49,0x10, +0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10, +0x13,0xbc,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x52,0x2, 0xb, 0x55,0xbe,0xf0,0x2, +0x68,0x3, 0x2, 0xb, 0x75,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x50,0x13,0xb2,0x7d, +0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x15,0x9d,0x12,0x49,0x20,0x13,0xb6,0x7d, +0xf2,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5f,0x3e,0x24,0x3e,0x24,0x2d, +0x25,0x2d,0x21,0x49,0x50,0x13,0xb8,0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x2d,0x15,0x9d,0x21,0x49,0x50,0x13,0xba,0x7d,0x15,0x3e,0x14,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10,0x13,0xbc,0x7d,0x21,0x3e, +0x24,0x2d,0x21,0x9d,0x52,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7d,0x23,0x3e,0x24,0x7e,0x14,0x0, 0x30,0xad,0x14,0x2d,0x21,0x2d,0x26,0x1b, +0x28,0x50,0x2, 0xd, 0x11,0x7e,0xa3,0x10,0x2b,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x68, +0x3, 0x2, 0xc, 0x11,0x3e,0x44,0x49,0x24,0x13,0xb2,0x7d,0x12,0x3e,0x14,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x4, 0x13,0xb0,0x7d,0x10,0x3e,0x14,0x2d,0x10, +0x9d,0x21,0x49,0x4, 0x13,0xb4,0x7d,0x10,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x10,0x9d,0x21,0x49,0x14,0x13,0xb6,0x7d,0xf1,0x3e,0xf4,0x3e,0xf4, +0x3e,0xf4,0x3e,0xf4,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x9d,0xf, 0x3e,0x14,0x3e,0x14,0x2d,0x10,0x2d,0x12,0x49,0x4, +0x13,0xb8,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x20, +0x9d,0x12,0x49,0x4, 0x13,0xba,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x20, +0x2d,0x21,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x2, 0xd, +0x0, 0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x76,0x1a,0xf, 0x3e,0x4, 0x49,0x30,0x13, +0xb0,0x7d,0x23,0x3e,0x24,0x2d,0x23,0x49,0x10,0x13,0xb2,0x7d,0x31,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x2d,0x31,0x9d,0x32,0x49,0x20,0x13,0xb4,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x49,0x20,0x13,0xb6,0x7d,0x12,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x9d,0x21,0x2d,0x23,0x49,0x30,0x13,0xb8,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x31,0x9d,0x23,0xe, +0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e,0x80,0x71,0x7e, +0xb3,0x10,0x2b,0x14,0xbc,0xbf,0x78,0x79,0x1a,0x5f,0x3e,0x54,0x49,0x25,0x13,0xb2, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9d,0x32,0x49,0x25,0x13,0xb0,0x3e,0x24, +0x9d,0x32,0x49,0x25,0x13,0xb4,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x24,0x9d,0x32,0x49,0x15,0x13,0xb6,0x7d,0x21, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x2, 0x7d,0x21,0x3e,0x24,0x2d,0x20,0x2d,0x21, +0x2d,0x23,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e, +0x3e,0x34,0x1a,0xf, 0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d,0x31,0x2d,0x36,0x1b,0x38, +0x20,0x1a,0x1e,0x3e,0x14,0x1a,0x2f,0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x23,0x2d, +0x21,0x2d,0x26,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x25,0xbc,0xbf,0x48,0x3, 0x2, 0x9, 0x37,0xb, 0xe0,0xe5,0x27,0xbc,0xbe,0x48,0x3, +0x2, 0x9, 0x6, 0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7e,0xb3,0xd, 0xf7,0xf5,0x2c, +0x75,0x10,0x0, 0xe4,0x7a,0xb3,0x15,0x54,0x7a,0xb3,0x15,0x55,0x6d,0x22,0x7e,0x34, +0x7f,0xff,0x7e,0x67,0xf, 0xda,0x6c,0xee,0xe4,0xa, 0x1e,0x19,0xb1,0x13,0xb6,0x6c, +0xaa,0x7e,0x10,0x2, 0xac,0x1e,0x19,0xa0,0x15,0x2b,0x19,0xb0,0x15,0x2c,0xe5,0x2c, +0xbc,0xbe,0x28,0x24,0x9, 0x20,0xd, 0x18,0x7e,0x30,0x18,0xac,0x23,0x9, 0x10,0xd, +0x19,0xa, 0x1, 0x2d,0x10,0x3e,0x14,0x2d,0x16,0xb, 0x18,0x10,0xbd,0x12,0x48,0x2, +0x7d,0x21,0xbd,0x13,0x18,0x2, 0x7d,0x31,0xb, 0xe0,0xbe,0xe0,0x14,0x78,0xb9,0x2d, +0x32,0xe, 0x34,0xe5,0x2c,0xbe,0xb0,0x2, 0x50,0x3, 0x2, 0x11,0x9d,0x6c,0xee,0x7e, +0x30,0x6, 0xac,0x3e,0x7d,0x51,0x2e,0x54,0x69,0x4e,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x23,0x58,0x20,0x7d,0x51,0x2e,0x54,0x69,0x50,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0x7a,0x25,0x30,0x2e,0x14,0x69,0x52,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0x7a,0x25,0x32,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc3,0x6c,0xee,0x2, 0x11, +0x8b,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19, +0xf5,0x23,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x13,0xb6,0x70,0xa, 0xa, 0x3e, +0xb, 0x34,0xa, 0x2e,0x19,0x72,0x13,0xb6,0xe5,0x2c,0x14,0xbc,0xbe,0x78,0x3, 0x2, +0x11,0x94,0xa, 0x5e,0xb, 0x54,0xf5,0x2d,0x2, 0x11,0x7f,0x7e,0x71,0x2d,0x74,0x2, +0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a,0xa1,0x24,0x9, 0xb3,0xd, 0x19,0xf5,0x25,0xa, +0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x2a,0xe5,0x25, +0xa, 0x2b,0xe5,0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x2b,0x75, +0x3d,0x2, 0x75,0x2f,0x0, 0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b, +0x2d,0x23,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0x7a,0x25,0x34,0x7e,0x11,0x24,0x74, +0x18,0xac,0x1b,0xe5,0x25,0xa, 0x1b,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0x7a,0x25,0x36,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0xe, 0x54,0x7a,0x55,0x38,0xbe,0x25,0x34,0x8, 0x14,0x7e,0x25,0x34, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x7a,0x25, +0x38,0xe5,0x2a,0xbe,0xb0,0x1, 0x38,0x37,0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x30,0x7c, +0xbf,0x54,0x2, 0xb4,0x2, 0x29,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, 0x20,0x7e, +0x71,0x22,0x74,0x18,0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d, +0x32,0xbe,0x35,0x38,0x18,0x3, 0x2, 0x11,0x13,0x75,0x2f,0x1, 0x2, 0x11,0x13,0xe5, +0x2a,0xbe,0xb0,0x1, 0x38,0xa, 0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x3, 0x2, 0x11,0x13, +0xe5,0x2a,0xbe,0xb0,0x4, 0x40,0x3, 0x2, 0x11,0x13,0xe5,0x2b,0xbe,0xb0,0x4, 0x40, +0x3, 0x2, 0x11,0x13,0x7c,0xbf,0x54,0x1, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x11,0x13, +0x6d,0x33,0x7a,0x35,0x3a,0x75,0x3c,0x0, 0x85,0x22,0x26,0x85,0x24,0x28,0xe5,0x24, +0xbe,0xb1,0x22,0x50,0x6, 0x85,0x24,0x26,0x85,0x22,0x28,0x85,0x23,0x27,0x85,0x25, +0x29,0xe5,0x25,0xbe,0xb1,0x23,0x50,0x6, 0x85,0x25,0x27,0x85,0x23,0x29,0x75,0x40, +0x0, 0x75,0x41,0x0, 0xe5,0x28,0xbe,0xb1,0x26,0x78,0x21,0x75,0x40,0x1, 0xe5,0x26, +0x60,0x5, 0xe5,0x26,0xb4,0xc, 0x3, 0x75,0x41,0x1, 0xe5,0x26,0xbe,0xb0,0x0, 0x28, +0x2, 0x15,0x26,0xe5,0x28,0xbe,0xb0,0xc, 0x50,0x2, 0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x27,0x78,0x21,0x75,0x40,0x1, 0xe5,0x27,0x60,0x5, 0xe5,0x27,0xb4,0x17,0x3, 0x75, +0x41,0x1, 0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x27,0xe5,0x29,0xbe,0xb0,0x17, +0x50,0x2, 0x5, 0x29,0x85,0x26,0x3e,0x80,0x78,0x85,0x27,0x3f,0x80,0x6a,0xe5,0x26, +0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x28,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x27,0xbe,0xb1, +0x3f,0x68,0x7, 0xe5,0x29,0xbe,0xb1,0x3f,0x78,0x24,0x7e,0x51,0x3e,0x74,0x18,0xac, +0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0xbe,0x24, +0x0, 0x0, 0x8, 0x6, 0x2e,0x25,0x3a,0x7a,0x25,0x3a,0x5, 0x3c,0x80,0x28,0x7e,0x51, +0x3e,0x74,0x18,0xac,0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0xbe,0x25,0x32,0x8, 0xc, 0xe5,0x3d,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x3d, +0x1, 0x80,0x3, 0x75,0x3d,0x0, 0x5, 0x3f,0xe5,0x29,0xbe,0xb1,0x3f,0x50,0x8f,0x5, +0x3e,0xe5,0x28,0xbe,0xb1,0x3e,0x50,0x81,0x7e,0x51,0x28,0x74,0x18,0xac,0x5b,0xe5, +0x27,0xa, 0x4b,0x2d,0x24,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x50,0x7e,0x25,0x3a,0x9d, +0x25,0x7e,0x31,0x26,0x74,0x18,0xac,0x3b,0xe5,0x29,0xa, 0xb, 0x7d,0x51,0x2d,0x50, +0x3e,0x54,0x2d,0x56,0xb, 0x58,0x50,0x9d,0x25,0x2d,0x14,0x3e,0x14,0x2d,0x16,0xb, +0x18,0x10,0x9d,0x21,0x7e,0x31,0x28,0x74,0x18,0xac,0x3b,0x2d,0x10,0x3e,0x14,0x2d, +0x16,0xb, 0x18,0x10,0x9d,0x21,0x7a,0x25,0x3a,0x7e,0x25,0x36,0x2e,0x25,0x34,0x7a, +0x25,0x38,0xe5,0x40,0xb4,0x1, 0x11,0xe5,0x41,0x70,0xd, 0x7e,0x25,0x3a,0x9e,0x25, +0x38,0x7a,0x25,0x3a,0x15,0x3c,0x15,0x3c,0xe5,0x3c,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x3c,0x24,0xfc,0xf5,0x3c,0x7e,0x25,0x3a,0xbe,0x24,0x0, 0x0, 0x58,0x3, 0x7a,0x35, +0x3a,0x7e,0x15,0x38,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x30,0x1a,0x26,0x1a,0x24,0x12, +0x48,0x24,0xe5,0x3c,0xa, 0x1b,0x6d,0x0, 0x12,0x48,0x24,0x7f,0x21,0x7e,0x35,0x3a, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x48,0x35,0xbf,0x12,0x8, 0xa, 0xe5, +0x3d,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x2f,0x2, 0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, +0x75,0x2f,0x2, 0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x63,0xe5,0x2f,0xa, 0x3b,0x2e,0x34, +0x15,0x53,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2d,0xa, 0x3b,0x9, 0xb3,0x13, +0xb6,0x70,0xc, 0xa, 0x2e,0x9, 0x52,0x13,0xb6,0x19,0x53,0x13,0xb6,0x80,0x3e,0x75, +0x2e,0x0, 0x80,0x32,0x9, 0x33,0x13,0xb6,0xa, 0x2e,0x9, 0xa2,0x13,0xb6,0xbc,0xa3, +0x28,0x12,0xe5,0x2e,0xa, 0x2b,0x9, 0x22,0x13,0xb6,0xbc,0x2a,0x78,0x16,0x19,0x32, +0x13,0xb6,0x80,0x10,0xe5,0x2e,0xa, 0x2b,0x9, 0xb2,0x13,0xb6,0xbc,0xb3,0x78,0x4, +0x19,0xa2,0x13,0xb6,0x5, 0x2e,0xe5,0x2c,0xbe,0xb1,0x2e,0x38,0xc7,0x5, 0x2d,0xe5, +0x2c,0xbe,0xb1,0x2d,0x28,0x3, 0x2, 0xe, 0x3b,0xb, 0xe0,0xe5,0x2c,0xbc,0xbe,0x28, +0x3, 0x2, 0xe, 0x1, 0x7e,0x34,0x13,0xb6,0x12,0x39,0xc4,0xf5,0x10,0xda,0x3b,0x22, +0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55, +0x7e,0x37,0xf, 0x61,0x7a,0x35,0x3e,0x6c,0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0xe4,0x19,0xb3,0xd, 0x71,0xa, 0x5d,0x3e,0x54,0xb, 0x54,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x39,0x9, 0xb3,0xd, 0x19,0xf5,0x3a, +0xbe,0xd1,0x3a,0x28,0x3, 0x2, 0x12,0xe, 0x7e,0xb3,0x10,0x2c,0xa, 0xb, 0x1b,0x4, +0xa, 0x3d,0x9d,0x3, 0xe5,0x3a,0xa, 0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0xe, 0x7c, +0x3a,0xa, 0x4d,0xe5,0x3a,0xa, 0xb, 0x9d,0x4, 0x7c,0x51,0x2, 0x12,0x59,0xbe,0xd1, +0x3a,0x38,0x3, 0x2, 0x12,0x27,0xe5,0x3a,0xa, 0xb, 0xa, 0x3d,0x2d,0x30,0xb, 0x34, +0x7c,0x37,0x6c,0x55,0x2, 0x12,0x59,0xa, 0xfd,0xe5,0x3a,0xa, 0x4b,0x2d,0xf4,0x7e, +0xb3,0x10,0x2c,0xa, 0xb, 0x7d,0x30,0x1b,0x34,0xbd,0xf3,0x18,0x3, 0x2, 0x12,0x59, +0xbd,0x43,0x8, 0x3, 0x2, 0x12,0x59,0xa, 0x3d,0x2d,0x30,0xe5,0x3a,0xa, 0xb, 0x9d, +0x30,0x7c,0x37,0xa, 0x3d,0x9d,0x3, 0x7c,0x51,0xbe,0xd1,0x39,0x28,0x3, 0x2, 0x12, +0x83,0x7e,0xb3,0x10,0x2b,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5,0x39,0xa, +0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0x83,0x7c,0x4a,0xa, 0xd, 0xe5,0x39,0xa, 0x3b, +0x2, 0x12,0xca,0xbe,0xd1,0x39,0x38,0x3, 0x2, 0x12,0x9c,0xe5,0x39,0xa, 0xb, 0xa, +0x3d,0x2d,0x30,0xb, 0x34,0x7c,0x47,0x6c,0x22,0x2, 0x12,0xce,0xa, 0x4d,0xe5,0x39, +0xa, 0x5b,0x2d,0x45,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7d,0x3, 0x1b,0x4, 0xbd,0x40, +0x18,0x3, 0x2, 0x12,0xce,0xbd,0x50,0x8, 0x3, 0x2, 0x12,0xce,0xa, 0xd, 0x2d,0x3, +0xe5,0x39,0xa, 0x3b,0x9d,0x3, 0x7c,0x41,0xa, 0xd, 0x9d,0x30,0x7c,0x27,0x7e,0x37, +0xf, 0xda,0x7c,0xb2,0x7e,0x23,0xf, 0x53,0x7e,0x4, 0x9, 0xc8,0x12,0x5c,0x33,0x7e, +0x37,0x9, 0xc8,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xca,0x7d,0x20,0x7a,0x1d,0x28, +0x7e,0x37,0x9, 0xcc,0x7d,0x3, 0x7e,0x37,0x9, 0xce,0x7d,0x20,0x7a,0x1d,0x2c,0x7e, +0x37,0x9, 0xd0,0x7d,0x3, 0x7e,0x37,0x9, 0xd2,0x7d,0x20,0x7a,0x1d,0x30,0x7e,0x37, +0x9, 0xd4,0x7d,0x3, 0x7e,0x37,0x9, 0xd6,0x7d,0x20,0x7a,0x1d,0x34,0xa, 0x2d,0xe5, +0x39,0xa, 0x3b,0x9d,0x32,0x7c,0xc7,0x2, 0x15,0x24,0xa, 0x4d,0xe5,0x3a,0xa, 0x5b, +0x9d,0x54,0xf5,0x38,0x2, 0x15,0xd, 0xbe,0xc0,0x0, 0x58,0x3, 0x2, 0x15,0xb, 0x7e, +0x73,0x10,0x2b,0xbc,0x7c,0x18,0x3, 0x2, 0x15,0xb, 0xe5,0x38,0xbe,0xb0,0x0, 0x58, +0x3, 0x2, 0x15,0xb, 0x7e,0x73,0x10,0x2c,0xbe,0x71,0x38,0x18,0x3, 0x2, 0x15,0xb, +0xe5,0x38,0x1a,0x1b,0x3e,0x14,0x1a,0x2c,0x7e,0x34,0x0, 0x30,0xad,0x32,0x2d,0x31, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x7e,0x53,0xf, 0x53,0xa, 0x25,0x9d,0x32,0x7a, +0x35,0x3c,0xbe,0x34,0x0, 0x0, 0x18,0x3, 0x2, 0x15,0xb, 0x7e,0x35,0x3e,0xbe,0x35, +0x3c,0x28,0x3, 0x2, 0x13,0xa6,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xd, 0x71,0x7e, +0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x39,0xa, 0x2b,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x13,0xd0,0xe5,0x3a,0xa, 0x2b,0xe5,0x38, +0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x2, 0x15,0xb, +0x75,0x3b,0x0, 0x2, 0x14,0x60,0xbe,0xe1,0x3b,0x78,0x3, 0x2, 0x14,0x5e,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe, +0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0x75,0x3b,0xff,0x2, 0x14,0x6c,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe, +0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0x75,0x3b,0x0, 0x2, 0x14,0x6c,0x5, 0x3b, +0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x3b,0x8, 0x3, 0x2, 0x13,0xd6,0xe5,0x3b,0x60,0x3, +0x2, 0x14,0xc0,0x7e,0x35,0x3c,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x3c,0x7e, +0xf5,0x3c,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a, +0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34, +0x7e,0x1d,0x28,0x9f,0x17,0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30, +0xe5,0x3b,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x15,0xb, 0x7e,0xf5,0x3c,0x7d,0x3f,0x1a, +0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d, +0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34,0x7e,0x1d,0x28,0x9f,0x17, +0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30,0x5, 0x38,0xa, 0x2d,0xe5, +0x3a,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x38,0x1a,0x3b,0xbd,0x32,0x18,0x3, 0x2, +0x13,0x37,0xb, 0xc0,0xa, 0x2d,0xe5,0x39,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0x1a,0x3c, +0xbd,0x32,0x18,0x3, 0x2, 0x13,0x2a,0x74,0x6, 0x7e,0x1d,0x2c,0x2f,0x11,0x14,0x78, +0xfb,0x7a,0x1d,0x2c,0x7e,0xd, 0x28,0x7e,0x1d,0x2c,0x12,0x48,0x40,0x2e,0x34,0x0, +0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xd, 0x6b,0x74,0x6, 0x7e,0x1d,0x34,0x2f, +0x11,0x14,0x78,0xfb,0x7a,0x1d,0x34,0x7e,0x7d,0x30,0x7e,0x1d,0x34,0x7f,0x7, 0x12, +0x48,0x40,0x2e,0x34,0x0, 0x20,0x59,0x36,0xd, 0x6d,0x7e,0xb3,0xf, 0x60,0x7f,0x17, +0x70,0x3, 0x2, 0x15,0x91,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7a,0x1d,0x30,0xbe,0x18,0x0, 0x7f,0x38,0x3, 0x2, 0x15,0xa4,0x7e,0x18,0x0, +0x7f,0x7a,0x1d,0x30,0x7e,0x2d,0x30,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0x71,0x7e,0x70,0x7, 0xac,0x7f,0x19, +0xa3,0xd, 0x71,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xd, 0x71,0xbe,0x70,0xf, 0x38,0x3, +0x2, 0x15,0xdf,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xd, 0x71,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x11, +0x96,0xa5,0xbe,0x1, 0x58,0x7e,0xa3,0x10,0x2b,0xbc,0xa7,0x28,0xd, 0x7a,0x71,0xd, +0x74,0x30,0xac,0x7b,0x2e,0x37,0x16,0x9e,0x80,0x3c,0x7a,0x71,0xd, 0xbc,0xa7,0x78, +0x6, 0x7e,0x34,0x8, 0x9a,0x80,0x2f,0xa, 0x2a,0x7d,0x2, 0xb, 0x4, 0xa, 0x17,0xbd, +0x10,0x78,0x6, 0x7e,0x34,0x8, 0xca,0x80,0x1d,0x7d,0x2, 0xb, 0x5, 0xbd,0x10,0x78, +0x6, 0x7e,0x34,0x9, 0x2e,0x80,0xf, 0x2e,0x24,0x0, 0x3, 0xbd,0x12,0x68,0x3, 0x2, +0x19,0x6a,0x7e,0x34,0x9, 0x5e,0x7a,0x37,0x16,0x4f,0x2, 0x19,0x6a,0xa5,0xbe,0x0, +0x46,0x7e,0x64,0x0, 0xb, 0x7a,0x69,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf,0x1, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, +0x74,0x1, 0x7e,0x70,0x1, 0x80,0x36,0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3, +0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x21,0x74,0x27,0x7e,0x70, +0x3, 0x12,0x6d,0x9f,0x2, 0x19,0x6a,0xa5,0xbe,0x2, 0x23,0xa5,0xbf,0x4, 0x7, 0x74, +0x1, 0x7e,0x70,0x4, 0x80,0x7, 0xa5,0xbf,0x5, 0x9, 0xe4,0x6c,0x77,0x12,0x0, 0x5e, +0x2, 0x19,0x6a,0xbe,0x70,0x1, 0x50,0x3, 0x2, 0x19,0x6a,0x2, 0x19,0x6a,0xa5,0xbe, +0x3, 0x15,0xbe,0x70,0xd, 0x28,0x9, 0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x2, 0x19,0x6a, +0x7a,0x73,0x10,0x2b,0x2, 0x19,0x6a,0xa5,0xbe,0x4, 0x15,0xbe,0x70,0x18,0x28,0x9, +0x74,0x18,0x7a,0xb3,0x10,0x2c,0x2, 0x19,0x6a,0x7a,0x73,0x10,0x2c,0x2, 0x19,0x6a, +0xa5,0xbe,0x5, 0x7, 0x7a,0x73,0x10,0x2d,0x2, 0x19,0x6a,0xa5,0xbe,0x7, 0x1e,0x7a, +0x73,0x10,0x4b,0x7c,0xb7,0x54,0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0x10, +0x54,0x5e,0x70,0x3, 0x4d,0x32,0x7a,0x37,0x10,0x54,0x2, 0x19,0x6a,0xa5,0xbe,0x8, +0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xac,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x16,0x2, 0x19,0x6a,0xa5,0xbe,0x9, 0x1c,0xbe,0x70,0xa, 0x50,0x3, 0x7e,0x70, +0xa, 0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xad,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x49,0x2, 0x19,0x6a,0xa5,0xbe,0xa, 0x10,0xa5,0xbf,0x0, 0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x10,0x3b,0x2, 0x19,0x6a,0xa5,0xbe,0xb, 0x14,0x7e,0xb3,0x10, +0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xae,0x2, 0x19,0x6a,0x7a,0x73,0x11,0x94,0x2, 0x19, +0x6a,0xa5,0xbe,0xc, 0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xd, 0xfe,0x2, +0x19,0x6a,0x7a,0x73,0x11,0x9d,0x2, 0x19,0x6a,0xa5,0xbe,0x4c,0x7, 0x7a,0x73,0xf, +0x46,0x2, 0x19,0x6a,0xa5,0xbe,0xfb,0x29,0x7a,0x71,0x8, 0x7e,0x37,0x10,0x50,0x5e, +0x70,0xdf,0x7a,0x37,0x10,0x50,0xe5,0x8, 0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x4e,0x37,0x10,0x50,0x7a,0x37,0x10,0x50,0x2, 0x19, +0x6a,0xa5,0xbe,0x4e,0x7, 0x7a,0x73,0x10,0x4a,0x2, 0x19,0x6a,0xa5,0xbe,0x4f,0x6, +0x12,0x0, 0x6, 0x2, 0x19,0x6a,0xbe,0x60,0x50,0x40,0x12,0xbe,0x60,0x51,0x38,0xd, +0xa, 0x26,0x2e,0x27,0x10,0x2f,0x9e,0x24,0x0, 0x50,0x2, 0x19,0x54,0xbe,0x60,0x52, +0x40,0x12,0xbe,0x60,0x55,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x31,0x9e,0x24,0x0, +0x52,0x2, 0x19,0x54,0xbe,0x60,0x56,0x40,0x12,0xbe,0x60,0x62,0x38,0xd, 0xa, 0x26, +0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x56,0x2, 0x19,0x54,0xbe,0x60,0x63,0x40,0x12, +0xbe,0x60,0x7a,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x63,0x2, +0x19,0x54,0xbe,0x60,0x7b,0x50,0x3, 0x2, 0x18,0xe8,0xbe,0x60,0x9f,0x28,0x3, 0x2, +0x18,0xe8,0x7e,0xb3,0x10,0x3b,0x70,0x48,0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24, +0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29, +0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f,0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17, +0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29, +0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, 0x2f,0x19,0x72,0xf, 0xdc,0x2, 0x19,0x6a, +0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27, +0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29,0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f, +0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17,0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27, +0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29,0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, +0x2f,0x19,0x72,0xf, 0x63,0x2, 0x19,0x6a,0xbe,0x60,0xa0,0x40,0x11,0xbe,0x60,0xac, +0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6c,0x9e,0x24,0x0, 0xa0,0x80,0x56,0xbe,0x60, +0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6e,0x9e,0x24, +0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38,0xc, 0xa, 0x26, +0x2e,0x27,0x10,0x70,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2,0x40,0x11,0xbe, +0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x72,0x9e,0x24,0x0, 0xd2,0x80,0x14, +0xbe,0x60,0xd6,0x40,0x14,0xbe,0x60,0xed,0x38,0xf, 0xa, 0x26,0x2e,0x27,0x10,0x74, +0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x80,0x11,0xa5,0xbe,0xf8,0x6, 0x7a,0x73,0x11, +0xe8,0x80,0x7, 0xa5,0xbe,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x3b,0x22,0xca,0x3b,0xe4, +0x7a,0xb3,0x13,0xde,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x23,0x6c,0xee,0x7e,0xa0,0xff, +0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0xff,0xa, 0x3e,0x19,0xb3,0x13, +0xca,0x7e,0x34,0xff,0xff,0x74,0x2, 0xac,0xbe,0x59,0x35,0x13,0xb6,0xe4,0xa, 0x3e, +0x19,0xb3,0x13,0xd4,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xd2,0x7e,0xb3,0xf, 0x1b,0x60, +0x3, 0x2, 0x19,0xe5,0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0x2, 0x1b,0xfc,0x6c,0xee,0x7e, +0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, +0x78,0xdd,0x2, 0x1b,0xfc,0x7e,0xb3,0xf, 0x1c,0x60,0x3, 0x2, 0x1a,0x38,0x6c,0xee, +0x2, 0x1a,0x2d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5e, +0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19, +0xe5,0xe, 0x11,0x74,0x1, 0xa, 0x3e,0x19,0xb3,0x13,0xd4,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0xbe,0x2, 0x1b,0xfc,0x6c,0xee,0x2, 0x1a,0x9e,0x6c,0xff,0x7e, +0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23,0x49,0x23,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x49, +0x35,0xe, 0xf, 0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x7e,0x70,0x2, 0xac,0x7f,0x2e, +0x35,0x23,0x49,0x23,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x9d,0x32, +0x12,0x6d,0xd0,0x2d,0x36,0x7a,0x35,0x21,0x74,0x2, 0xac,0xbe,0x49,0x45,0x13,0xb6, +0xbe,0x45,0x21,0x38,0x3, 0x2, 0x1a,0x95,0xa, 0x4e,0x19,0xf4,0x13,0xca,0x7e,0x35, +0x21,0x59,0x35,0x13,0xb6,0xb, 0xf0,0xbe,0xf0,0xa, 0x78,0xa3,0xb, 0xe0,0x7e,0x73, +0xf, 0x1b,0xbc,0x7e,0x38,0x97,0x6c,0xee,0x2, 0x1b,0x52,0x74,0x1, 0x7a,0xb3,0x13, +0xde,0x6c,0xff,0x2, 0x1a,0xf1,0xbc,0xfe,0x78,0x3, 0x2, 0x1a,0xef,0xa, 0x3f,0x9, +0x63,0x13,0xca,0xa, 0x2e,0x9, 0x72,0x13,0xca,0xbc,0x76,0x68,0x3, 0x2, 0x1a,0xef, +0x74,0x2, 0xac,0xbf,0x49,0x25,0x13,0xb6,0x74,0x2, 0xac,0xbe,0x49,0x35,0x13,0xb6, +0xbd,0x32,0x50,0x3, 0x2, 0x1a,0xef,0xe4,0x7a,0xb3,0x13,0xde,0x2, 0x1a,0xf9,0xb, +0xf0,0x7e,0x73,0xf, 0x1b,0xbc,0x7f,0x38,0xbd,0x7e,0xb3,0x13,0xde,0xb4,0x1, 0x2, +0x80,0x3, 0x2, 0x1b,0x50,0x74,0x1, 0xa, 0x3e,0x9, 0xa3,0x13,0xca,0xa, 0x4a,0x19, +0xb4,0x13,0xd4,0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0x7, 0xac,0xbe, +0x49,0x35,0xe, 0xd, 0xa, 0x2e,0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e, +0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0xa, 0x2e, +0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28, +0xb, 0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, 0x1a,0xab,0x6c,0xee,0x2, +0x1b,0xc1,0x74,0x7, 0xac,0xbe,0x9, 0xb5,0xe, 0x11,0xb4,0xff,0x2, 0x80,0x3, 0x2, +0x1b,0xbf,0x6c,0xff,0xa, 0x3f,0x9, 0xb3,0x13,0xd4,0x60,0x3, 0x2, 0x1b,0xb8,0x74, +0x1, 0x19,0xb3,0x13,0xd4,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, +0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, +0xf, 0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac, +0xbe,0x19,0xf5,0xe, 0x11,0x2, 0x1b,0xbf,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xb5,0xb, +0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x38,0x99,0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13, +0xd4,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x1b,0xf5,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, +0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xcf,0x7e,0xf3,0xf, 0x1b, +0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13,0xd4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x4e, +0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c, +0x27,0x74,0x3, 0x19,0xb3,0x0, 0xa, 0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xa3,0x0, 0xa, +0xbe,0xa0,0x3, 0x68,0x3, 0x2, 0x1c,0x3f,0xe4,0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0x4c, +0xaa,0x68,0x3, 0x2, 0x1c,0x7c,0x74,0x2, 0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0xa, 0x3e, +0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xbe,0xb0,0x2, 0x78,0x3, 0x2, 0x1c,0x64,0x60, +0x3, 0x2, 0x1c,0x77,0x74,0x1, 0x7a,0x39,0xb0,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4, +0x19,0xe5,0xe, 0x11,0x2, 0x1c,0x7c,0x74,0x3, 0x7a,0x39,0xb0,0xa, 0x2e,0x2e,0x25, +0x23,0x7e,0x29,0x70,0x19,0x72,0x0, 0xa, 0xb, 0xe0,0xbe,0xe0,0xa, 0x50,0x3, 0x2, +0x1c,0x2, 0xda,0x3b,0x22,0xca,0x3b,0x75,0x24,0x0, 0x75,0x26,0x0, 0x75,0x27,0x0, +0x75,0x28,0x0, 0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x2a,0x7e,0xa3,0xf, 0x24,0x4c,0xaa, +0x78,0xf, 0x7e,0xb3,0xf, 0x20,0x70,0x9, 0x7e,0xb3,0xf, 0x21,0x70,0x3, 0x2, 0x1f, +0x54,0x4c,0xaa,0x78,0x11,0x7e,0xb3,0xf, 0x20,0x60,0x16,0x80,0x9, 0x7e,0x73,0x0, +0xff,0xbe,0x70,0xf, 0x38,0x6, 0x7e,0xb3,0x0, 0x8b,0x60,0xf1,0xe4,0x7a,0xb3,0x0, +0x8b,0x20,0x0, 0x6, 0x7e,0x74,0x15,0xca,0x80,0x4, 0x7e,0x74,0x16,0xc, 0x7d,0x37, +0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0,0x74,0xaa,0x7a,0x79,0xb0,0x19,0xb7, +0x0, 0x1, 0x7e,0x73,0xf, 0x1d,0x19,0x77,0x0, 0x3, 0x75,0x25,0x0, 0x6c,0xdd,0x2, +0x1e,0xe1,0x7e,0x70,0x7, 0xac,0x7d,0x9, 0xa3,0xe, 0x9d,0x7a,0xa1,0x29,0x7c,0xba, +0x54,0xf, 0xa, 0x2b,0x2e,0x25,0x2a,0x7e,0x29,0xc0,0x7c,0xba,0x54,0xf0,0xbe,0xb0, +0x0, 0x28,0x13,0xb4,0xb0,0x2, 0x80,0x3, 0x2, 0x1e,0xdf,0x53,0x29,0xf, 0xbe,0xc0, +0x1, 0x68,0x3, 0x2, 0x1e,0xdf,0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x1e,0xdf,0x7e,0xa1, +0x25,0x74,0x6, 0xa4,0xf5,0x21,0x9, 0xb3,0xe, 0x9e,0xf5,0x27,0x74,0x7, 0xac,0xbd, +0x9, 0xb5,0xe, 0x9f,0xc4,0x54,0xf0,0xf5,0x28,0x7e,0x73,0xf, 0x46,0xbe,0x71,0x29, +0x28,0x68,0x7e,0xb3,0xf, 0x22,0x70,0x2a,0x7e,0x8, 0x0, 0x27,0xe5,0x29,0xa, 0x3b, +0x2e,0x34,0x0, 0x77,0x74,0x1, 0x7e,0x50,0xf, 0x12,0x5f,0x76,0x7e,0x8, 0x0, 0x28, +0xe5,0x29,0xa, 0x3b,0x2e,0x34,0x0, 0x81,0x74,0x10,0x7e,0x50,0x20,0x12,0x5f,0x76, +0x80,0x14,0xe5,0x29,0xa, 0x3b,0x9, 0xb3,0x0, 0x77,0xf5,0x27,0xe5,0x29,0xa, 0x3b, +0x9, 0xb3,0x0, 0x81,0xf5,0x28,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x2e,0x25,0x2a,0x7e, +0x29,0xb0,0xb4,0x1, 0x15,0xe4,0x19,0xb3,0x0, 0x77,0x6c,0xaa,0xe5,0x29,0xa, 0x3b, +0x19,0xa3,0x0, 0x81,0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0xf, 0x5f,0xb4,0xff, +0x15,0x74,0x7, 0xac,0xbd,0x9, 0xb5,0xe, 0x9d,0xbe,0xb0,0xff,0x68,0x5, 0x75,0x27, +0x1, 0x80,0x3, 0x75,0x27,0x0, 0x7e,0x90,0x7, 0xac,0x9d,0x49,0x54,0xe, 0x99,0x7a, +0x55,0x2c,0x49,0x54,0xe, 0x9b,0x7a,0x55,0x2e,0xbe,0xc0,0x1, 0x78,0x2e,0x75,0x30, +0x0, 0x7e,0x71,0x30,0x74,0x7, 0xac,0x7b,0x9, 0xb3,0x0, 0x90,0x54,0xf, 0xbe,0xb1, +0x29,0x78,0x10,0x49,0x23,0x0, 0x8c,0x7a,0x25,0x2c,0x49,0x53,0x0, 0x8e,0x7a,0x55, +0x2e,0x80,0x9, 0x5, 0x30,0xe5,0x30,0xbe,0xb0,0xa, 0x40,0xd5,0x7e,0x25,0x2c,0x7a, +0x25,0x22,0xa, 0x54,0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x21,0xa, 0x3b,0x7d,0x13, +0x2d,0x17,0x19,0xa1,0x0, 0x5, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x6, 0x7e,0x25, +0x2e,0x7a,0x25,0x22,0xa, 0x14,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x57,0x19,0x35, +0x0, 0x7, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x8, 0xe5,0x27,0x7d,0x23,0x2d,0x27, +0x19,0xb2,0x0, 0x9, 0xe5,0x28,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0xa, 0x9, 0xa4, +0xe, 0x9d,0x7c,0xba,0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x27,0x2e,0x24,0x0, +0x7, 0x7e,0x29,0xb0,0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x21,0xbe,0xc0, +0x1, 0x68,0x2, 0x5, 0x24,0x5, 0x26,0x7c,0xbc,0x3, 0x3, 0x54,0xc0,0x7d,0x13,0x2d, +0x17,0x2e,0x14,0x0, 0x5, 0x7e,0x19,0x50,0x2c,0x5b,0x7a,0x19,0x50,0x80,0xe, 0x2d, +0x37,0x2e,0x34,0x0, 0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x25,0xb, +0xd0,0x7e,0x73,0xf, 0x46,0xbc,0x7d,0x28,0x3, 0x2, 0x1d,0x12,0xe5,0x24,0x19,0xb7, +0x0, 0x4, 0xe5,0x26,0xbe,0xb0,0x0, 0x28,0x2d,0x74,0x42,0x19,0xb7,0x0, 0x2, 0xe4, +0x19,0xb7,0x0, 0x41,0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e, +0x24,0x0, 0x41,0x7e,0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x41, +0x78,0xe4,0xb2,0x0, 0x80,0xe, 0x7e,0xb3,0xf, 0x21,0xb4,0x1, 0xc, 0x7e,0xb3,0x10, +0xd1,0xb4,0x24,0x5, 0x74,0x1, 0x12,0x6e,0x92,0x7e,0xb3,0xf, 0x20,0x60,0x6, 0x7e, +0x35,0x2a,0x12,0x68,0xb, 0xe4,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x20,0x7a,0xb3, +0xf, 0x21,0x80,0x4, 0xe4,0x12,0x6e,0x92,0x7e,0x24,0xe, 0x99,0x7e,0x34,0x0, 0x8c, +0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0xe5,0x26,0x70,0xd, 0x7e,0x34,0x0, 0x8c,0x7e, +0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0xda,0x3b,0x22,0xca,0x79,0x75,0x26,0x17, +0x7e,0xb3,0xd, 0xf7,0xf5,0x21,0x70,0x3, 0x2, 0x22,0x1d,0x7e,0x34,0x13,0xb6,0x7e, +0x24,0x1, 0x2b,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x14,0xe1,0x7e,0x24,0x0, 0x2, 0xe4, +0x12,0x6d,0xe0,0x6c,0xaa,0x2, 0x20,0x32,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, +0x18,0x9, 0x23,0xd, 0x19,0x1a,0x3, 0x1b,0x5, 0x80,0x69,0xbe,0x10,0x0, 0x48,0x62, +0xbe,0x10,0xd, 0x58,0x5d,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25, +0x7c,0xb1,0x54,0x7, 0x7e,0x74,0x0, 0x1, 0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x7c, +0xef,0xa, 0x40,0x2e,0x44,0x14,0xe1,0x7e,0x49,0xb0,0x4c,0xbe,0x7a,0x49,0xb0,0x1a, +0x32,0x1b,0x35,0x7c,0xf7,0x80,0x1f,0xbe,0xf0,0x0, 0x48,0x18,0xe5,0x26,0xbc,0xbf, +0x8, 0x12,0x74,0x1, 0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0x4f,0x2d,0x43, +0x19,0xb4,0x13,0xb6,0xb, 0xf0,0x1a,0x22,0x2e,0x24,0x0, 0x3, 0x1a,0x3f,0xbd,0x32, +0x48,0xd5,0xb, 0x10,0x1a,0x23,0x2e,0x24,0x0, 0x3, 0x1a,0x31,0xbd,0x32,0x48,0x8b, +0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x1f,0xa8,0x6c,0x11,0x7c,0x1, 0xe, +0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, 0x7e,0x44,0x0, 0x1, +0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa, 0x30,0x9, 0xb3,0x14,0xe1,0x5c, +0xbe,0x78,0x3, 0x2, 0x20,0xf9,0x6d,0x33,0x7a,0x35,0x22,0x75,0x24,0x0, 0x1a,0x21, +0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x43,0x2e,0x47,0xf, 0xda,0x6c,0x0, 0x80,0x26, +0x1a,0xe1,0x7e,0xf4,0x0, 0x17,0xad,0xfe,0xa, 0x30,0x2d,0x3f,0x9, 0xb3,0x13,0xb6, +0x70,0x12,0x7e,0x70,0x2, 0xac,0x70,0x2d,0x34,0xb, 0x38,0x30,0x2e,0x35,0x22,0x7a, +0x35,0x22,0x5, 0x24,0xb, 0x0, 0xe5,0x26,0xbc,0xb0,0x38,0xd4,0xe5,0x24,0x60,0x49, +0xe5,0x24,0x1a,0x2b,0x7e,0x35,0x22,0x12,0x47,0xf2,0x7a,0x35,0x22,0x6c,0xff,0x80, +0x32,0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0xff,0x7d,0xe3,0x2d,0xef,0x9, +0xbe,0x13,0xb6,0xb4,0x1, 0x1b,0x1a,0x21,0x7e,0x34,0x0, 0x18,0xad,0x32,0x7d,0x23, +0x2d,0x2f,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x9e,0x35,0x22,0x1b,0x28, +0x30,0xb, 0xf0,0xe5,0x26,0xbc,0xbf,0x18,0xc8,0xb, 0x10,0xa5,0xb9,0xd, 0x2, 0x80, +0x3, 0x2, 0x20,0x3d,0x6c,0xaa,0x2, 0x22,0x14,0x7e,0x10,0x2, 0xac,0x1a,0x9, 0x30, +0xd, 0x18,0x9, 0x20,0xd, 0x19,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xf5,0x25,0x7c,0xba, +0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa5, +0xbb,0x0, 0x2c,0x1a,0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e, +0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x20,0x49,0x33,0x0, 0x30,0xbd,0x32,0x18,0x3, +0x2, 0x21,0xd9,0x1a,0x33,0xb, 0x34,0x7c,0xb7,0x19,0xb0,0xd, 0x18,0x80,0x7a,0xa5, +0xbb,0xc, 0x2c,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x22,0x2d,0x23,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x49,0x2, 0xff,0xd0,0xbd,0x3, 0x8, 0x59, +0x1a,0x33,0x1b,0x34,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x70,0xd, 0x18,0x80,0x4a,0x1a, +0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, +0xda,0x49,0x43,0x0, 0x30,0x49,0x3, 0xff,0xd0,0xbd,0x4, 0x8, 0x16,0xb, 0x38,0x20, +0xbd,0x2, 0x8, 0x25,0x1a,0x23,0x1b,0x24,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x50,0xd, +0x18,0x80,0x16,0xb, 0x38,0x0, 0xbd,0x40,0x8, 0xf, 0x1a,0x33,0xb, 0x34,0x7c,0x37, +0x7e,0x10,0x2, 0xac,0x1a,0x19,0x30,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33, +0xd, 0x18,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x2, 0x2d,0x3, 0x3e,0x4, +0x2e,0x7, 0xf, 0xda,0xb, 0x8, 0x0, 0xbe,0x4, 0x0, 0x3c,0x58,0x15,0x7c,0x7e,0x6e, +0x70,0xff,0xe5,0x25,0xa, 0x4b,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x5c,0xb7,0x7a, +0x49,0xb0,0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x21,0x9, 0xda,0x79,0x22, +0xca,0xd8,0xca,0x79,0x6c,0xaa,0x7e,0x34,0x11,0x9e,0x7e,0x44,0x11,0x4a,0xe4,0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfe,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, +0x17,0xbe,0xb0,0x0, 0x28,0x4f,0x7e,0x53,0xd, 0xf8,0xbe,0x50,0x0, 0x28,0x46,0x6c, +0xff,0x80,0x3c,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x40,0x9, 0xe1,0xd, 0x41, +0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x13,0xb, 0x18,0x0, 0x6d,0x11,0x9e,0x17,0xf, 0x4c, +0xbd,0x1, 0x58,0x19,0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x13,0x49,0x1, 0x0, 0x30,0x6d, +0x11,0x9e,0x17,0xf, 0x4a,0xbd,0x1, 0x58,0x4, 0x5, 0x6b,0x80,0xb, 0xb, 0xf0,0xbc, +0x5f,0x38,0xc0,0x80,0x3, 0x75,0x6b,0x0, 0xe5,0x6b,0xbe,0xb0,0x3, 0x40,0x17,0x7e, +0xb3,0xe, 0xa, 0x44,0x1, 0x7a,0xb3,0xe, 0xa, 0x75,0x6b,0x0, 0x7e,0xb3,0x16,0xbc, +0x44,0x1, 0x7a,0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfd,0x7a,0xb3,0xe, 0xa, +0x7e,0xb3,0xd, 0x16,0x70,0x59,0x7e,0x53,0xd, 0xf7,0xbe,0x50,0x0, 0x28,0x50,0x6c, +0xff,0x80,0x48,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x18,0x9, 0xe1,0xd, 0x19, +0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x14,0x49,0x11,0x0, 0x30,0x6d,0x0, 0x9e,0x7, 0xd, +0xff,0xbd,0x10,0x48,0xe, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x14,0xb, 0x18,0x10,0xbd, +0x10,0x58,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x2, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16, +0xbc,0x44,0x2, 0x7a,0xb3,0x16,0xbc,0x80,0x6, 0xb, 0xf0,0xbc,0x5f,0x38,0xb4,0x7e, +0xb3,0xe, 0x9, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x23,0xc3,0x7e,0xb3,0xd, 0x16,0x70, +0x6d,0x6c,0xff,0x80,0x61,0x7e,0x50,0x2, 0xac,0x5f,0x7d,0x12,0x2d,0x14,0xb, 0x18, +0x10,0xbe,0x17,0xd, 0xff,0x8, 0x4d,0x2d,0x23,0xb, 0x28,0x20,0xbe,0x27,0xd, 0xff, +0x58,0x42,0xbe,0xf1,0x6c,0x68,0x6, 0x7a,0xf1,0x6c,0x75,0x6d,0x0, 0xbe,0xf1,0x6c, +0x78,0x2, 0x5, 0x6d,0xe5,0x6d,0xbe,0xb0,0x10,0x28,0x33,0x75,0x6d,0x10,0xe5,0x51, +0x70,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x4, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x4, 0x7a,0xb3,0x16,0xbc,0x80,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3, +0xe, 0xa, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0x97,0x6c,0xaa, +0x6c,0xff,0x80,0x17,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x34,0xb, 0x38,0x30,0xbe,0x37, +0xd, 0xff,0x8, 0x5, 0x7e,0xa0,0x1, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc, +0xbf,0x38,0xe1,0x4c,0xaa,0x78,0x1a,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, +0xa, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0xb3,0x16,0xbc,0x54,0xfb,0x7a,0xb3,0x16, +0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xf7,0x7a,0xb3,0xe, 0xa, 0x7e,0x73,0xd, 0xfa,0xa, +0x27,0x7e,0x73,0xd, 0xf9,0xa, 0x37,0x2d,0x32,0xbe,0x37,0xe, 0x3, 0x28,0x14,0x7e, +0xb3,0xe, 0xa, 0x44,0x8, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc,0x44,0x8, 0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x44,0x10,0x7a,0xb3,0xe, 0xa, 0x6c,0xff,0x80, +0x49,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70, +0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30, +0x49,0x22,0x10,0x3, 0x9d,0x32,0x7a,0x35,0x21,0x12,0x6d,0xd0,0xbe,0x37,0xe, 0x1, +0x28,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xef,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x10,0x7a,0xb3,0x16,0xbc,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f, +0x38,0xaf,0x7e,0x34,0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x12,0x6d,0xe0,0x6c,0xff, +0x80,0x25,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e, +0x70,0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x30,0x59,0x32,0x10,0x3, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xd3,0xda, +0x79,0xda,0xd8,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x21,0x75,0x25,0x0, 0x75,0x26, +0x0, 0x7e,0x23,0xd, 0xf7,0x7a,0x21,0x23,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x13,0xb6, +0x7e,0x30,0x2, 0xac,0x23,0x7e,0x24,0xd, 0x18,0x7e,0x34,0x13,0xb8,0x12,0x6d,0x3c, +0xe5,0x23,0xbe,0xb0,0xa, 0x38,0x3, 0x2, 0x26,0xb9,0x75,0x24,0x0, 0x6c,0xff,0x2, +0x25,0xcd,0x7e,0x34,0x3, 0xff,0x7a,0x35,0x27,0x75,0x26,0xff,0x6c,0xee,0x80,0x7e, +0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x13,0xb8,0xbe,0xb0,0xff,0x68,0x6e,0x7c,0xbe, +0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7a,0xa1,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x2c,0xa, 0x2a,0x9, 0xb2, +0xd, 0x68,0x55,0x2c,0x68,0x46,0x9, 0x73,0x13,0xb9,0xa, 0x27,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0x15,0xa3,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x74,0x2, 0xac, +0xbe,0x9, 0x75,0x13,0xb8,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa2,0xa, +0x37,0x9d,0x32,0x12,0x6d,0xd0,0x2d,0x36,0x7a,0x35,0x29,0x7e,0x35,0x27,0xbe,0x35, +0x29,0x28,0x9, 0x7e,0x35,0x29,0x7a,0x35,0x27,0x7a,0xe1,0x26,0xb, 0xe0,0xe5,0x23, +0xbc,0xbe,0x28,0x3, 0x2, 0x25,0x0, 0xe5,0x26,0xbe,0xb0,0xff,0x68,0x3d,0x7e,0x71, +0x26,0x74,0x2, 0xac,0x7b,0x9, 0x33,0x13,0xb8,0x7e,0x50,0x18,0xac,0x53,0x9, 0xa3, +0x13,0xb9,0xa, 0xa, 0x2d,0x20,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28,0x20,0xbe, +0x24,0x0, 0x3c,0x48,0x16,0xe5,0x24,0x1a,0x2b,0x3e,0x24,0x19,0x32,0x13,0xe0,0x19, +0xa2,0x13,0xe1,0x74,0xff,0x19,0xb3,0x13,0xb8,0x5, 0x24,0xb, 0xf0,0xe5,0x11,0xbc, +0xbf,0x28,0x3, 0x2, 0x24,0xf2,0x7e,0xf1,0x24,0x2, 0x26,0x9f,0x6d,0x33,0x7a,0x35, +0x21,0x7e,0xa0,0xff,0x6c,0xee,0x2, 0x26,0x71,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c, +0x7b,0x7a,0x71,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0xb9,0xf5,0x2c,0xa, 0x37,0x9, 0xb3,0xd, 0x68,0x55,0x2c,0x68, +0x5e,0x7e,0x90,0x2, 0xac,0x9e,0x9, 0x44,0x13,0xb8,0xbe,0x40,0xff,0x68,0x50,0x7e, +0x50,0x18,0xac,0x45,0x9, 0xb4,0x13,0xb9,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27, +0x13,0xb6,0xb, 0x28,0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30, +0x7e,0x50,0x2, 0xac,0x5e,0x9, 0x62,0x13,0xb8,0x7e,0x30,0x18,0xac,0x36,0x9, 0x72, +0x13,0xb9,0xa, 0x7, 0x2d,0x10,0x3e,0x14,0x2e,0x17,0x13,0xb6,0xb, 0x18,0x40,0xbe, +0x45,0x21,0x8, 0xb, 0x7a,0x61,0x25,0x7a,0x71,0x26,0x7a,0x45,0x21,0x7c,0xae,0xb, +0xe0,0xe5,0x23,0xbc,0xbe,0x28,0x3, 0x2, 0x25,0xe9,0xbe,0xa0,0xff,0x68,0x1e,0x7e, +0x71,0x25,0x7e,0x90,0x2, 0xac,0x9f,0x19,0x74,0x13,0xe0,0xe5,0x26,0x19,0xb4,0x13, +0xe1,0x7e,0x70,0xff,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x13,0xb8,0xb, 0xf0,0xbe, +0xf0,0xa, 0x50,0x3, 0x2, 0x25,0xdc,0x7e,0x24,0x13,0xe0,0x7e,0x34,0x13,0xb8,0x7e, +0x14,0x0, 0x28,0x12,0x6d,0x3c,0x75,0x23,0xa, 0x7e,0x34,0x15,0xa2,0x7e,0x24,0x0, +0x14,0x74,0xff,0x12,0x6d,0xe0,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0x55,0x7e,0x31,0x23, +0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x3c,0x7e, +0x31,0x23,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0x15,0xa2,0x12,0x6d, +0x3c,0x6c,0xff,0x80,0x27,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7c,0x67,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24, +0xd, 0x68,0x7e,0x29,0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xf0,0xe5,0x23,0xbc,0xbf, +0x38,0xd3,0x85,0x23,0x11,0xe5,0x23,0x7a,0xb3,0xd, 0xf7,0xda,0x3b,0x22,0x7c,0x7b, +0xbe,0x70,0x10,0x40,0x12,0xbe,0x70,0x4b,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x16,0x4f, +0x9e,0x34,0x0, 0x10,0x2, 0x29,0x69,0xa5,0xbf,0x0, 0x3, 0xe5,0xb, 0x22,0xa5,0xbf, +0x1, 0x3, 0xe5,0xd, 0x22,0xa5,0xbf,0x2, 0x5, 0x7e,0xb3,0xf, 0x28,0x22,0xbe,0x70, +0x3, 0x40,0x12,0xbe,0x70,0x5, 0x38,0xd, 0xa, 0x37,0x2e,0x34,0x10,0x2b,0x9e,0x34, +0x0, 0x3, 0x2, 0x29,0x69,0xa5,0xbf,0x6, 0x3, 0x74,0x1, 0x22,0xa5,0xbf,0x7, 0x5, +0x7e,0xb3,0x10,0x4b,0x22,0xa5,0xbf,0x8, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e, +0xb3,0xa, 0xac,0x22,0x7e,0xb3,0x11,0x16,0x22,0xa5,0xbf,0x9, 0x10,0x7e,0xb3,0x10, +0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xad,0x22,0x7e,0xb3,0x11,0x49,0x22,0xa5,0xbf,0xa, +0x5, 0x7e,0xb3,0x10,0x3b,0x22,0xa5,0xbf,0xb, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, +0x7e,0xb3,0xa, 0xae,0x22,0x7e,0xb3,0x11,0x94,0x22,0xa5,0xbf,0xc, 0x10,0x7e,0xb3, +0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xd, 0xfe,0x22,0x7e,0xb3,0x11,0x9d,0x22,0xa5,0xbf, +0x4c,0x5, 0x7e,0xb3,0xf, 0x46,0x22,0xa5,0xbf,0xfb,0x3, 0xe5,0x8, 0x22,0xa5,0xbf, +0x4e,0x5, 0x7e,0xb3,0x10,0x4a,0x22,0xbe,0x70,0x50,0x40,0x12,0xbe,0x70,0x51,0x38, +0xd, 0xa, 0x37,0x2e,0x37,0x10,0x2f,0x9e,0x34,0x0, 0x50,0x2, 0x29,0x69,0xbe,0x70, +0x52,0x40,0x12,0xbe,0x70,0x55,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x31,0x9e,0x34, +0x0, 0x52,0x2, 0x29,0x69,0xbe,0x70,0x56,0x40,0x12,0xbe,0x70,0x62,0x38,0xd, 0xa, +0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x56,0x2, 0x29,0x69,0xbe,0x70,0x63,0x40, +0x12,0xbe,0x70,0x7a,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x63, +0x2, 0x29,0x69,0xbe,0x70,0x7b,0x50,0x3, 0x2, 0x28,0xfd,0xbe,0x70,0x9f,0x28,0x3, +0x2, 0x28,0xfd,0x7e,0xb3,0x10,0x3b,0x70,0x4a,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe, +0x24,0x0, 0x18,0x58,0x22,0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e, +0x39,0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c, +0xab,0x80,0x19,0x1e,0xa0,0x80,0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, +0x93,0x7e,0x39,0x70,0xa, 0x57,0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3, +0xf, 0xdc,0x22,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x22,0xa, +0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba,0x30,0xe0, +0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e,0xa0,0x80, +0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70,0xa, 0x57, +0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0x63,0x22,0xbe,0x70,0xa0, +0x40,0x11,0xbe,0x70,0xac,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6c,0x9e,0x34,0x0, +0xa0,0x80,0x56,0xbe,0x70,0xad,0x40,0x11,0xbe,0x70,0xb9,0x38,0xc, 0xa, 0x37,0x2e, +0x37,0x10,0x6e,0x9e,0x34,0x0, 0xad,0x80,0x40,0xbe,0x70,0xba,0x40,0x11,0xbe,0x70, +0xd1,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x70,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe, +0x70,0xd2,0x40,0x11,0xbe,0x70,0xd5,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x72,0x9e, +0x34,0x0, 0xd2,0x80,0x14,0xbe,0x70,0xd6,0x40,0x13,0xbe,0x70,0xed,0x38,0xe, 0xa, +0x37,0x2e,0x37,0x10,0x74,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xa5,0xbf,0xf8, +0x5, 0x7e,0xb3,0x11,0xe8,0x22,0xa5,0xbf,0xfe,0x3, 0xe5,0xc, 0x22,0x74,0xff,0x22, +0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20,0x0, 0x41,0x0, 0x42,0x0, 0x22, +0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40,0x0, 0xa3,0x0, 0xa5,0x0, 0x44, +0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60,0x0, 0xe5,0x0, 0xe8,0x0, 0x66, +0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80,0x1, 0x47,0x1, 0x4b,0x0, 0x88, +0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0,0x1, 0x89,0x1, 0xad,0x0, 0xaa, +0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xaa, +0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0,0x1, 0x69,0x1, 0x6c,0x0, 0x88, +0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80,0x1, 0x27,0x1, 0x9, 0x0, 0x66, +0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60,0x0, 0xc5,0x0, 0xc6,0x0, 0x44, +0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40,0x0, 0x83,0x0, 0x64,0x0, 0x22, +0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20,0x0, 0x21,0x0, 0x21,0x0, 0x0, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0xca,0x3b,0x7e,0x34,0x13,0xff,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6d,0xe0,0x7e,0xe0, +0x1, 0x7e,0x73,0x10,0x4d,0x7a,0x73,0x13,0xb6,0xe4,0x7a,0xb3,0x10,0x4d,0x6c,0xdd, +0x6c,0xcc,0x80,0x11,0xa, 0x3c,0x2e,0x37,0x10,0x6e,0x7e,0x39,0x70,0xbc,0x7d,0x40, +0x2, 0x7c,0xd7,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc,0x7c,0x38,0xe7,0xbe,0xd0,0x1f, +0x50,0xc, 0xa, 0x2d,0x7e,0x34,0x0, 0x1f,0x9d,0x32,0x7c,0xd7,0x80,0x2, 0x6c,0xdd, +0x7a,0xd1,0x21,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10,0x2b,0x12,0x6a, +0x64,0x2, 0x2d,0x7d,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37, +0xa, 0xaf,0x12,0x6e,0xcf,0x12,0x69,0x23,0x12,0x6e,0x78,0x60,0xfb,0xa9,0xb7,0xea, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x6c, +0xcc,0x80,0x78,0x6c,0xff,0x80,0x6a,0x4c,0xcc,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3, +0x13,0xe7,0x6d,0x33,0x74,0x2, 0xac,0xbf,0x59,0x35,0x13,0xb7,0xbe,0xf0,0x17,0x78, +0x13,0x7e,0x34,0x0, 0x1, 0x7c,0xbc,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x5e,0x34, +0x4, 0x44,0x68,0x3b,0x7e,0x50,0x30,0xac,0x5c,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x32, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, +0x14,0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xa, 0x3f,0x2e,0x34,0x13,0xe7,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xb, +0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0x8e,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc, +0x7c,0x38,0x80,0x75,0x22,0x0, 0x6c,0xcc,0x2, 0x2d,0x5b,0xa, 0x3c,0x9, 0xa3,0x13, +0xe7,0x4c,0xaa,0x78,0xf, 0x7e,0x44,0x22,0xc4,0x7e,0x70,0x2, 0xac,0x7c,0x59,0x43, +0x13,0xb7,0x80,0x25,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x12,0x13,0xb7,0xa, 0xa, 0x8d, +0x10,0x59,0x12,0x13,0xb7,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x32, +0x13,0xb7,0xbe,0x34,0x1e,0xdc,0x50,0x22,0xa, 0x1c,0x2e,0x14,0x13,0xff,0x7e,0x19, +0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1c,0x2e,0x17,0x10,0x74,0x7e,0x19,0xb0,0xbc,0xbd, +0x50,0x2f,0x4, 0x7a,0x19,0xb0,0x80,0x31,0x80,0x27,0xbe,0x34,0x26,0xac,0x28,0x27, +0xa, 0x3c,0x2e,0x34,0x13,0xff,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xa, 0x3c,0x2e, +0x37,0x10,0x74,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14,0x7a,0x39,0xb0,0x80, +0x8, 0x5, 0x22,0x6c,0xee,0x80,0x2, 0x5, 0x22,0xb, 0xc0,0x7e,0x73,0x10,0x2c,0xbc, +0x7c,0x28,0x3, 0x2, 0x2c,0xbb,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10, +0x2b,0x12,0x6a,0x64,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x22,0x68,0xf, 0x7e,0xa1,0x21, +0x7c,0xba,0x14,0xf5,0x21,0x4c,0xaa,0x68,0x3, 0x2, 0x2c,0x4, 0x7e,0x73,0x13,0xb6, +0x7a,0x73,0x10,0x4d,0x6c,0xff,0x80,0x10,0xa, 0x3f,0x9, 0x73,0x13,0xff,0xbc,0x7d, +0x78,0x4, 0x6c,0xee,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0xe8, +0x7c,0xbe,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xb3,0x10,0x3c,0xf5,0x21,0xe4,0x7a,0xb3, +0x10,0x3c,0x7e,0xb3,0x10,0x3a,0xf5,0x22,0x74,0x3, 0x7a,0xb3,0x10,0x3a,0x7e,0x37, +0x10,0x48,0x7e,0x24,0x0, 0x25,0xe4,0x12,0x6d,0xe0,0x7e,0xe0,0x7, 0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x6c,0xdd, +0x7e,0x14,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0xa, 0x2d,0x2e, +0x27,0x10,0x48,0x7e,0x29,0x70,0x4c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25, +0x78,0xde,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab, +0x12,0x6e,0x81,0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xd0,0x6c, +0xdd,0xbe,0xd0,0x18,0x50,0x1e,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c, +0xbf,0x30,0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x16, +0x1e,0xf0,0x80,0x12,0xa, 0x3d,0x2e,0x37,0x10,0x33,0x9, 0x73,0xff,0xe8,0xa, 0x37, +0x2e,0x34,0x0, 0x18,0x7c,0xf7,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0xb, +0x38,0x30,0xbe,0x34,0x25,0x80,0x18,0x21,0x7e,0x34,0x0, 0x1, 0x7c,0xbe,0x60,0x5, +0x3e,0x34,0x14,0x78,0xfb,0x7d,0x13,0x6e,0x14,0xff,0xff,0xa, 0x2f,0x2e,0x27,0x10, +0x48,0x7e,0x29,0x70,0x5c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78,0x91, +0x1b,0xe0,0xbe,0xe0,0x0, 0x48,0x3, 0x2, 0x2d,0xdd,0x7e,0xe0,0xa, 0x74,0x2, 0x7a, +0xb3,0x10,0x3a,0x2, 0x2f,0xac,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac, +0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10, +0x2c,0xa, 0x65,0x2d,0x63,0x7c,0xcd,0x6c,0xdd,0x2, 0x2f,0x74,0x7e,0xa3,0x10,0x2c, +0xbc,0xad,0x28,0x27,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf,0x30, +0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x2, 0x1e,0xf0, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x80,0x27,0xa, 0x2a,0xa, 0x3d,0x9d, +0x32,0x2e,0x37,0x10,0x33,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34,0x0, 0x18,0x7c,0xf7, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xa4, +0x9d,0x35,0xb, 0x38,0x30,0x7a,0x35,0x23,0xbe,0x34,0x2e,0xe0,0x8, 0x18,0x4c,0xee, +0x68,0x30,0xa, 0x2f,0x2e,0x27,0x10,0x48,0x7e,0x29,0xb0,0xbe,0xb0,0xfe,0x50,0x22, +0x4, 0x7a,0x29,0xb0,0x80,0x1c,0xbe,0x34,0x17,0x70,0x58,0x14,0xa, 0x3f,0x2e,0x37, +0x10,0x48,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x7a,0x39,0xb0,0x80,0x2, +0x1b,0xc0,0xb, 0xd0,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c,0xa, 0x25, +0x2d,0x23,0xa, 0x3d,0xbd,0x32,0x58,0x3, 0x2, 0x2e,0xdc,0x4c,0xcc,0x68,0x28,0x7e, +0x34,0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81, +0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xd0,0x7c,0xae,0x1b,0xe0, +0x4c,0xaa,0x68,0x3, 0x2, 0x2e,0xb6,0xe5,0x21,0x7a,0xb3,0x10,0x3c,0xe5,0x22,0x7a, +0xb3,0x10,0x3a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x24,0x15,0x56,0x7e,0x34, +0x13,0xfe,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13, +0xb6,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x13,0xfc, +0x7e,0x73,0xf, 0x1c,0x7a,0x73,0x13,0xfd,0x7e,0xa3,0x13,0xfc,0xbe,0xa0,0x1, 0x38, +0x3, 0x7e,0xf0,0x1, 0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0xe4,0x80,0x10,0x7e,0xb3,0x15, +0xa1,0x4, 0x7a,0xb3,0x15,0xa1,0xbe,0xb0,0xc8,0x28,0x6, 0x74,0x14,0x7a,0xb3,0x15, +0xa1,0x7e,0xb3,0x15,0xa1,0xbe,0xb0,0x6, 0x50,0x3, 0x7e,0xf0,0x1, 0xbe,0xa0,0x1, +0x28,0x3f,0x7e,0x34,0x0, 0x21,0x7e,0x24,0x0, 0x23,0x7e,0x14,0x13,0xfe,0x12,0x65, +0xa8,0x7e,0x34,0x0, 0x25,0x7e,0x24,0x0, 0x27,0x7e,0x14,0x13,0xb6,0x12,0x65,0xa8, +0x7e,0x35,0x25,0x9e,0x35,0x21,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x80,0x18,0xf, 0x7e, +0x35,0x27,0x9e,0x35,0x23,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x80,0x8, 0x3, 0x7e,0xf0, +0x1, 0xbe,0xf0,0x0, 0x28,0x3, 0x2, 0x31,0x24,0x7e,0xf3,0x15,0x9f,0xbe,0xf3,0x15, +0x29,0x50,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73,0x13,0xfc,0x28,0x12,0x7e,0x24,0x15, +0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x2, 0x31,0x24,0x7e, +0x73,0x15,0x9e,0xbe,0x70,0x2, 0x58,0x22,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3, +0x15,0x53,0x7e,0xb3,0x15,0x9e,0x4, 0x2, 0x31,0x60,0x74,0x1, 0x7a,0xb3,0x15,0xa0, +0xe4,0x7a,0xb3,0x15,0x53,0x2, 0x31,0x60,0xbe,0xf3,0x15,0x29,0x78,0x2d,0x7e,0xa3, +0x15,0x29,0xbe,0xa3,0x13,0xfc,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a, +0xb3,0x15,0x53,0x80,0x6b,0xbe,0xa3,0x13,0xfc,0x28,0x4, 0x74,0x1, 0x80,0x1, 0xe4, +0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0x80,0x55,0x7e,0x73,0x15,0x29,0xbe, +0x73,0x13,0xfc,0x50,0x1a,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, +0x48,0x12,0x6d,0x3c,0xe4,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0x53,0x80,0x31,0x7e, +0x73,0x15,0x53,0xbe,0x70,0x2, 0x58,0x1c,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0x7e,0xb3,0x15, +0x53,0x4, 0x80,0x7, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0xe4, +0x7a,0xb3,0x15,0x9e,0x7e,0xb3,0x15,0xa0,0x14,0x68,0x9, 0x4, 0x78,0x15,0x7e,0x24, +0x13,0xb6,0x80,0x4, 0x7e,0x24,0x14,0xe3,0x7e,0x34,0x15,0x56,0x7e,0x14,0x0, 0x48, +0x12,0x6d,0x3c,0x7e,0x73,0x15,0x29,0x7a,0x73,0x15,0x9f,0x7e,0x24,0x13,0xb6,0x7e, +0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x7e,0x24,0x15,0x56,0x7e,0x34, +0xe, 0xd, 0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x7e,0x73,0x15,0x9c,0x7a,0x73,0xf, +0x1b,0x7e,0x73,0x15,0x9d,0x7a,0x73,0xf, 0x1c,0xda,0xf8,0x22,0xca,0x79,0x7d,0x73, +0x12,0x60,0xce,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27, +0x0, 0x27,0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c, +0xe, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49, +0x27,0x0, 0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34, +0x1c,0x14,0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c, +0x67,0x6c,0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38, +0x10,0x9, 0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, +0x25,0x4d,0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27, +0x7e,0x34,0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20, +0x6c,0xaa,0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e, +0x34,0x1c,0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, +0x4b,0x2d,0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe, +0xa0,0x19,0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e, +0x70,0x2, 0xac,0x7a,0x2e,0x34,0x29,0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e, +0x24,0x1c,0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x2b, +0x7e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x2b, +0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, +0xa0,0xbe,0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x5d,0xbd,0x49,0x27,0x0, 0x39,0x7e, +0x34,0x1c,0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33, +0x7e,0x34,0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, +0xb7,0x0, 0x1, 0x12,0x64,0x6a,0x49,0x37,0x0, 0x47,0x12,0x7, 0xc9,0x49,0x37,0x0, +0x49,0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x5c,0x97,0x49,0x27,0x0, 0x35, +0x7e,0x34,0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b, +0x38,0x20,0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22, +0xca,0x3b,0x6d,0x33,0x7a,0x35,0x23,0x7e,0xb3,0xf, 0x1b,0x60,0x6, 0x7e,0xb3,0xf, +0x1c,0x60,0x11,0xe5,0x22,0x60,0x5, 0x75,0x19,0x1, 0x80,0x3, 0x75,0x19,0x0, 0xe5, +0x19,0x2, 0x35,0x1f,0x7e,0xb3,0xd, 0x18,0xf5,0x21,0x7e,0x73,0xd, 0x19,0x7a,0x71, +0x22,0x6d,0x66,0x75,0x25,0x0, 0x75,0x26,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x3a,0x7e, +0x51,0x21,0x74,0x18,0xac,0x5b,0x2d,0x27,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28, +0x10,0xbe,0x14,0x0, 0x32,0x8, 0x28,0x5, 0x25,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0x8, +0x49,0x12,0xff,0xd0,0x2d,0x61,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, 0x50,0x8, 0x49, +0x22,0x0, 0x30,0x2d,0x62,0x5, 0x26,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc0,0x7d, +0x73,0x80,0x38,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0x2d,0x37,0x3e,0x34,0x2e,0x37, +0xf, 0xda,0xb, 0x38,0x20,0xbe,0x24,0x0, 0x32,0x8, 0x2c,0x5, 0x25,0xe5,0x21,0xbe, +0xb0,0x0, 0x28,0x8, 0x49,0x23,0xff,0xd0,0x2d,0x62,0x5, 0x26,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x8, 0x49,0x33,0x0, 0x30,0x2d,0x63,0x5, 0x26,0x7d,0x37,0xb, 0x34,0x7d, +0x73,0xbe,0x34,0x0, 0x18,0x48,0xbc,0xe5,0x25,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12, +0x7d,0x36,0x12,0x6d,0xd0,0xe5,0x26,0xa, 0x2b,0x12,0x47,0xf2,0xbe,0x34,0x0, 0xf, +0x8, 0x8, 0x75,0x19,0x1, 0x74,0x1, 0x2, 0x35,0x1f,0x6d,0x33,0xe5,0x21,0xbe,0xb0, +0x0, 0x28,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0xff,0xd0,0x2d,0x32,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0x0, 0x30,0x2d,0x32,0x7e,0xa0,0x8, 0x80, +0x2d,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2e,0x14,0x6d,0xc0,0x7a,0x31,0x82,0x7a, +0x21,0x83,0xe4,0x93,0x1a,0x1b,0xbd,0x13,0x8, 0x14,0x2e,0x24,0x6d,0xc1,0x7a,0x51, +0x82,0x7a,0x41,0x83,0xe4,0x93,0x1a,0x2b,0x2e,0x25,0x23,0x7a,0x25,0x23,0x7c,0x5a, +0x1b,0xa0,0xa5,0xbd,0x0, 0xcb,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0xe5,0x22,0xa, +0x2b,0x2d,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x12,0x6d,0xd0,0xbe, +0x34,0x3, 0xe8,0x8, 0xa, 0x7e,0x35,0x23,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x23,0x7e, +0x35,0x23,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x23,0xe5, +0x19,0xa, 0x3b,0xbe,0x35,0x23,0x50,0x5, 0x7e,0x55,0x23,0xf5,0x19,0xe5,0x19,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x9b,0x7d,0xa3,0xbe,0x90,0x1, 0x28,0x1e,0xa, 0x15,0x1b, +0x15,0xa, 0x39,0xbd,0x31,0x58,0x14,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b, +0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x80,0x7, 0xbe,0x90,0x1, 0x78,0x15, +0x6d,0xbb,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d, +0x53,0x7d,0xc3,0x80,0x8, 0x4c,0x99,0x78,0x38,0x6d,0xcc,0x7d,0xbc,0x74,0x2, 0xac, +0xb9,0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x7e,0x70,0x2, +0xac,0x79,0x2d,0x3a,0x49,0x33,0x0, 0x2, 0x12,0x6d,0x53,0x7d,0xe3,0x74,0x2, 0xac, +0xb9,0x7d,0xf5,0x2d,0xfa,0x49,0x3f,0x0, 0x4, 0x12,0x6d,0x53,0x7d,0xf3,0x2, 0x36, +0x2d,0x7c,0xb5,0x24,0xfe,0xbc,0xb9,0x78,0x46,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d, +0xba,0x1b,0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79, +0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x53,0x7d,0xc3,0x74,0x2, 0xac,0xb9, +0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x74,0x2, 0xac,0xb9, +0x2d,0xa5,0x49,0x3a,0x0, 0x2, 0x12,0x6d,0x53,0x7d,0xe3,0x6d,0xff,0x80,0x3e,0x7c, +0xb5,0x14,0xbc,0xb9,0x78,0x37,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6, +0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b, +0x35,0xb, 0x38,0x30,0x12,0x6d,0x53,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d,0xd5,0x2d, +0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x6d,0xff,0x7d,0xef,0xa, 0x79,0x6d, +0x66,0x7f,0x3, 0x1b,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x7f,0x41, +0x7f,0x3, 0x1b,0xd, 0x7d,0x3b,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0x7d, +0x3d,0x1a,0x26,0x1a,0x24,0xa, 0x19,0x6d,0x0, 0x12,0x48,0x24,0x2f,0x41,0xa, 0x19, +0x6d,0x0, 0xb, 0xc, 0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0xa, +0x19,0x6d,0x0, 0xb, 0xd, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x14, +0x7d,0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x5b,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1d, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x7d,0x5e,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1f, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x48,0x40, +0x2e,0x34,0x0, 0x20,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xf, 0x1b,0x7e,0x64,0xe, +0xdf,0xe5,0x51,0xb4,0x1, 0x21,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x1a,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0x13,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0xa, 0x74,0x1e,0x7a, +0xb3,0xf, 0x26,0x74,0x14,0x80,0x8, 0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a, +0xb3,0xf, 0x27,0x4c,0xff,0x78,0xd, 0x75,0x1a,0x0, 0x7e,0xb3,0xf, 0x26,0x12,0x6e, +0xa1,0x2, 0x38,0x47,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14, +0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, +0x74,0x1, 0x80,0x1, 0xe4,0xb4,0x1, 0x9, 0xe5,0x1a,0x70,0x5, 0x75,0x17,0x1e,0xf5, +0x18,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80, +0x1, 0xe4,0xf5,0x1a,0x6c,0xee,0x7e,0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xe, 0x9d,0xf5, +0x21,0xbe,0xb0,0xff,0x78,0x3, 0x2, 0x38,0x3d,0xe5,0x21,0xa, 0x2b,0x2d,0x26,0x7e, +0x29,0xb0,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x38,0x3d,0x49,0x33,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x74,0x12,0x6d,0xb0,0x7a,0x35,0x22,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0x9b,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x76, +0x12,0x6d,0xb0,0x7a,0x35,0x24,0xe5,0x17,0xa, 0x3b,0xbe,0x35,0x22,0x28,0x56,0xbe, +0x35,0x24,0x28,0x51,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x74,0x74,0x7, +0xac,0xbe,0x59,0x35,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x76, +0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0x9b,0xe5,0x21,0xa, 0x3b,0x2d,0x36,0x7e,0x39, +0xb0,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, 0x28,0x2, 0x1b,0xf0,0x4c,0xff,0x78,0x4e,0x5, +0x18,0x7e,0x73,0xf, 0x27,0xbe,0x71,0x17,0x28,0x43,0xe5,0x18,0xbe,0xb0,0x32,0x40, +0x3c,0x5, 0x17,0x80,0x35,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x59,0x35,0x13,0x74,0x49,0x34,0xe, 0x9b,0x59,0x35,0x13,0x76, +0x7e,0x73,0xf, 0x26,0xbe,0x71,0x17,0x78,0x8, 0x7e,0xb3,0xf, 0x27,0xf5,0x17,0x80, +0x9, 0xe5,0x17,0xbe,0xb0,0x1, 0x28,0x2, 0x15,0x17,0x75,0x18,0x0, 0xb, 0xe0,0xbe, +0xe0,0xa, 0x68,0x3, 0x2, 0x37,0x56,0xda,0x3b,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3, +0x10,0x2b,0xf5,0x24,0x7e,0xe3,0x10,0x2c,0x1b,0xe0,0x6c,0xdd,0x7e,0x70,0x30,0xac, +0x7d,0x2e,0x37,0xf, 0xda,0x49,0x33,0x0, 0x2e,0x74,0x2, 0xac,0xbd,0x59,0x35,0x13, +0xb6,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0x7e,0xb3,0xf, 0xd3,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x39,0xc1,0x6c,0xcc,0x2, 0x39,0xb2,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3, +0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19,0xf5,0x23,0x75,0x21,0x3, 0x7e,0x73,0xe, +0x12,0xbe,0x70,0x20,0x50,0xa, 0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x3, 0x75,0x21,0x1, +0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, 0x75,0x21,0x2, 0x74,0x8, 0x7a,0xb3,0xf, 0x53, +0xe5,0x22,0xbe,0xb0,0x0, 0x28,0x21,0xe5,0x24,0xa, 0x2b,0x1b,0x24,0xe5,0x22,0xa, +0x3b,0xbd,0x32,0x58,0x13,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x23,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x21,0x2, 0x75,0x25,0x0, 0x80,0x45, +0xe5,0x25,0xbc,0xbc,0x68,0x3d,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xd, +0x18,0x7a,0xa1,0x26,0x9, 0xb3,0xd, 0x19,0xf5,0x27,0xa, 0x2a,0xe5,0x22,0xa, 0x3b, +0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x3, 0x18,0x18,0xe5,0x27,0xa, 0x2b,0xe5, +0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x21, +0x1, 0x80,0xb, 0x5, 0x25,0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x25,0x38,0xb2,0xe5,0x51, +0xb4,0x1, 0x20,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x19,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, +0x12,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x9, 0x75,0x21,0x3, 0x74,0x1e,0x7a, +0xb3,0xf, 0x53,0xe5,0x23,0xbe,0xb0,0x17,0x50,0x1a,0x6c,0xdd,0x6d,0x33,0x7e,0x50, +0x30,0xac,0x5d,0x2e,0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, +0x78,0xec,0x80,0x3, 0x75,0x21,0x0, 0xe5,0x21,0x7c,0x7c,0x7c,0x6f,0x12,0x11,0xa0, +0x6c,0xdd,0x74,0x2, 0xac,0xbd,0x49,0x35,0x13,0xb6,0x7e,0x50,0x30,0xac,0x5d,0x2e, +0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0xb, 0xf0, +0xb, 0xc0,0x7e,0x73,0xd, 0xf7,0xbc,0x7c,0x28,0x3, 0x2, 0x38,0x89,0x7a,0xf3,0xd, +0xf7,0xda,0x3b,0x22,0xca,0x3b,0x7d,0x73,0x7e,0xb3,0xd, 0xf7,0xf5,0x4c,0x7e,0x37, +0xf, 0xda,0x7a,0x35,0x4f,0x75,0x42,0x0, 0x7e,0xc0,0x1, 0x80,0x19,0xe5,0x42,0xa, +0x3b,0x2d,0x37,0x7e,0x39,0x60,0xa, 0x2c,0x2d,0x27,0x7e,0x29,0x70,0xbc,0x76,0x40, +0x3, 0x7a,0xc1,0x42,0xb, 0xc0,0xe5,0x4c,0xbc,0xbc,0x38,0xe1,0xe5,0x42,0xa, 0x3b, +0x2d,0x37,0x7e,0x39,0xb0,0xf5,0x42,0x75,0x44,0x0, 0x7e,0xc0,0x1, 0x2, 0x3b,0xe, +0x75,0x4b,0x0, 0x6d,0x33,0x7a,0x35,0x4d,0x6c,0xdd,0x75,0x45,0x0, 0x75,0x46,0x0, +0x75,0x43,0x0, 0x2, 0x3a,0xc3,0x7e,0x71,0x43,0x74,0x2, 0xac,0x7b,0x9, 0xb3,0xd, +0x18,0xf5,0x47,0x9, 0xb3,0xd, 0x19,0xf5,0x48,0xe5,0x43,0xa, 0x3b,0x2d,0x37,0x7e, +0x39,0x70,0xbc,0x7c,0x78,0x7b,0xb, 0xd0,0xe5,0x47,0x25,0x45,0xf5,0x45,0xe5,0x48, +0x25,0x46,0xf5,0x46,0x7e,0x51,0x47,0xac,0x5d,0xe5,0x45,0xa, 0x3b,0x9d,0x32,0x12, +0x6d,0xd0,0x7c,0xb7,0xf5,0x49,0x7e,0x51,0x48,0xac,0x5d,0xe5,0x46,0xa, 0x3b,0x9d, +0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x4a,0x7e,0x51,0x4b,0xac,0x5d,0xe5,0x49,0xa, +0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2,0x7c,0xb7,0xf5,0x4b,0x7e,0x51, +0x4b,0xac,0x5d,0xe5,0x4a,0xa, 0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2, +0x7c,0xb7,0xf5,0x4b,0x7e,0x71,0x47,0x74,0x18,0xac,0x7b,0xe5,0x48,0xa, 0x2b,0x2d, +0x32,0x3e,0x34,0x2e,0x35,0x4f,0xb, 0x38,0x30,0xbe,0x35,0x4d,0x8, 0x3, 0x7a,0x35, +0x4d,0x5, 0x43,0xe5,0x4c,0xbe,0xb1,0x43,0x28,0x3, 0x2, 0x3a,0x26,0xbe,0xd0,0x0, +0x28,0x3a,0xe5,0x45,0x8c,0xbd,0xf5,0x45,0xe5,0x46,0x8c,0xbd,0xf5,0x46,0x7e,0xa1, +0x45,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x19,0xa3,0x15,0x2b,0xe5,0x46,0x19,0xb3, +0x15,0x2c,0x7e,0x25,0x4d,0x7e,0x71,0x45,0x74,0x18,0xac,0x7b,0xe5,0x46,0xa, 0x1b, +0x2d,0x31,0x3e,0x34,0x2e,0x35,0x4f,0x1b,0x38,0x20,0x5, 0x44,0xb, 0xc0,0xe5,0x42, +0xbc,0xbc,0x40,0x3, 0x2, 0x3a,0x10,0xe5,0x44,0xda,0x3b,0x22,0x74,0xd, 0x7a,0xb3, +0x10,0x2b,0x74,0x18,0x7a,0xb3,0x10,0x2c,0x74,0x4, 0x7a,0xb3,0x10,0x2d,0xe4,0x7a, +0xb3,0x10,0x2e,0x7e,0x34,0x11,0x9b,0x7a,0x37,0x10,0x2f,0x7e,0x34,0x11,0x97,0x7a, +0x37,0x10,0x31,0x7e,0x34,0xf, 0xc5,0x7a,0x37,0x10,0x33,0x7e,0x34,0xf, 0xad,0x7a, +0x37,0x10,0x35,0x74,0x15,0x7a,0xb3,0x10,0x37,0x74,0x17,0x7a,0xb3,0x10,0x38,0x74, +0x4, 0x7a,0xb3,0x10,0x3a,0xe4,0x7a,0xb3,0x10,0x3b,0x7a,0xb3,0x10,0x3c,0x7a,0xb3, +0x10,0x3d,0x74,0x2, 0x7a,0xb3,0x10,0x3e,0x74,0x45,0x7a,0xb3,0x10,0x3f,0x74,0x71, +0x7a,0xb3,0x10,0x40,0x74,0x3, 0x7a,0xb3,0x10,0x41,0x7e,0x34,0x1f,0xff,0x7a,0x37, +0x10,0x42,0x6d,0x33,0x7a,0x37,0x10,0x44,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10,0x46, +0x7e,0x34,0xf, 0xdc,0x7a,0x37,0x10,0x48,0x74,0x20,0x7a,0xb3,0x10,0x4a,0x74,0xa, +0x7a,0xb3,0x10,0x4b,0xe4,0x7a,0xb3,0x10,0x4c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10, +0x4e,0x74,0x2, 0x7a,0xb3,0x10,0x4f,0x7e,0x34,0x0, 0xf4,0x7a,0x37,0x10,0x52,0x7e, +0x34,0x3f,0xe0,0x7a,0x37,0x10,0x50,0x7e,0x34,0x29,0x28,0x7a,0x37,0x10,0x54,0x7e, +0x34,0x10,0x91,0x7a,0x37,0x10,0x62,0x7e,0x34,0x0, 0x3d,0x7a,0x37,0x10,0x64,0x7e, +0x34,0x0, 0x22,0x7a,0x37,0x10,0x66,0x7e,0x34,0x4c,0x0, 0x7a,0x37,0x10,0x56,0x7e, +0x34,0x3, 0xcf,0x7a,0x37,0x10,0x58,0x7e,0x34,0x7, 0x9a,0x7a,0x37,0x10,0x5a,0x7e, +0x34,0x5, 0x84,0x7a,0x37,0x10,0x5c,0x7e,0x34,0x0, 0x9, 0x7a,0x37,0x10,0x5e,0x7e, +0x34,0x0, 0xf, 0x7a,0x37,0x10,0x60,0x7e,0x34,0x0, 0x5d,0x7a,0x37,0x10,0x68,0xe4, +0x7a,0xb3,0x10,0x6a,0x74,0x7, 0x7a,0xb3,0x10,0x6b,0x7e,0x34,0x10,0xff,0x7a,0x37, +0x10,0x6c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x10,0x6e,0x7e,0x34,0xf, 0x2e,0x7a,0x37, +0x10,0x70,0x12,0x42,0x8d,0x7e,0x34,0x11,0xe9,0x7a,0x37,0x10,0x72,0x7e,0x34,0xf, +0x88,0x7a,0x37,0x10,0x74,0x7e,0x34,0x11,0x17,0x7a,0x37,0x10,0x76,0x2, 0x6c,0x58, +0xca,0x69,0xca,0xf8,0x7d,0xb1,0x7d,0xf2,0x7d,0xe3,0x9f,0x0, 0x7f,0x60,0x7f,0x40, +0x6d,0x66,0x7a,0x67,0x13,0xb6,0x7f,0x10,0x7d,0xa6,0x75,0x21,0x0, 0x6c,0xaa,0x80, +0x4b,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0xa1,0x2d,0xae,0xb, 0xa8,0xa0,0x7c,0xba,0x20, +0xe0,0x1e,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a, +0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x60,0x5, 0x21,0x80,0x1a, +0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a,0x8, 0x2, +0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x40,0xb, 0xa0,0x7e,0xf3,0x10,0x2c, +0xbc,0xfa,0x38,0xad,0xe5,0x21,0xa, 0x1b,0x6d,0x0, 0x7f,0x16,0x12,0x48,0x91,0x7a, +0x37,0x13,0xb6,0xe5,0x21,0xa, 0x3b,0x6d,0x22,0xa, 0x1f,0x6d,0x0, 0x9f,0x1, 0x7f, +0x14,0x12,0x48,0x91,0x6c,0xaa,0x80,0x2f,0x7c,0xba,0x7e,0x30,0x2, 0x7c,0x9a,0x20, +0xe0,0xf, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x9e,0x7, 0x13,0xb6,0x80, +0xd, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x7d,0x13,0x9d,0x1, 0x7d,0x14, +0x2d,0x1f,0x1b,0x18,0x0, 0xb, 0xa0,0x7e,0xb3,0x10,0x2c,0xbc,0xba,0x38,0xc9,0x9f, +0x66,0x7a,0x67,0x13,0xb6,0x6c,0xaa,0x80,0x29,0x7e,0x70,0x2, 0xac,0x7a,0x7d,0xa3, +0x2d,0xae,0x49,0xaa,0x0, 0x30,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x33, +0x9d,0x3b,0xbd,0x3a,0x8, 0x2, 0x7d,0xa3,0x7d,0x3a,0x1a,0x26,0x1a,0x24,0x2f,0x61, +0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xcf,0xa, 0x16,0x6d,0x0, 0x7f,0x16, +0x12,0x48,0x91,0x7a,0x37,0x13,0xb6,0x6c,0xaa,0x80,0x1d,0x7e,0x70,0x2, 0x7c,0x5a, +0xac,0x57,0x7d,0x32,0x2d,0x3e,0x49,0x43,0x0, 0x30,0x9e,0x47,0x13,0xb6,0x7d,0x32, +0x2d,0x3f,0x59,0x43,0x0, 0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xdb, +0xda,0xf8,0xda,0x69,0x22,0x7e,0x50,0x1, 0xe4,0x7a,0xb3,0xe, 0xb, 0x74,0x1, 0x7a, +0xb3,0xe, 0xc, 0x7e,0xa3,0xd, 0xf7,0x4c,0xaa,0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x16, +0xba,0xe4,0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, +0x7e,0x43,0xd, 0xfc,0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43, +0xd, 0x17,0xbe,0x40,0x0, 0x28,0x6b,0x7e,0xb3,0x16,0xb4,0x70,0x65,0x7e,0xb3,0x16, +0xb6,0x70,0x5f,0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x6d,0x33,0x6c,0x44,0x7e,0x30,0x2, +0xac,0x34,0x2e,0x17,0xf, 0xd6,0xb, 0x18,0x10,0xbd,0x13,0x58,0x2, 0x7d,0x31,0xb, +0x40,0xa5,0xbc,0x25,0xe8,0xbe,0x34,0xf8,0xf8,0x58,0x5, 0x7e,0x50,0x5, 0x80,0x1f, +0xbe,0x34,0xfb,0x50,0x58,0x5, 0x7e,0x50,0x4, 0x80,0x14,0xbe,0x34,0xfc,0xe0,0x58, +0x5, 0x7e,0x50,0x3, 0x80,0x9, 0xbe,0x34,0xfe,0xd4,0x58,0x3, 0x7e,0x50,0x2, 0xbe, +0x34,0xfc,0x18,0x58,0x3c,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d, +0x80,0x2f,0x7e,0x43,0xd, 0x16,0xa5,0xbc,0x0, 0x1d,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0xb3,0x16,0xb4,0x70,0x12,0x7e,0xb3,0x16,0xb6,0x70,0xc, 0xbe,0x50,0x3, 0x50,0x3, +0x7e,0x50,0x3, 0x74,0x1, 0x80,0x6, 0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, +0xc, 0x7e,0x43,0x16,0xba,0xbc,0x45,0x50,0x4, 0x7a,0x53,0x16,0xba,0xbe,0x50,0x2, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x1b,0x7e,0xb3,0xd, +0x16,0x70,0x15,0x7e,0xb3,0x16,0xb4,0x70,0xf, 0x7e,0xb3,0x16,0xb6,0x70,0x9, 0xe4, +0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xb3,0x16,0xb6,0xb4,0x1, 0x18,0xe4, +0x7a,0xb3,0x16,0xb6,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x7a, +0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xa3,0x16,0xba,0x74,0x2, 0xa4,0x7a,0x57, +0xe, 0x5, 0x7a,0x57,0xe, 0x7, 0x22,0xca,0x79,0x7c,0xfb,0xe5,0x55,0xbe,0xb0,0x1, +0x68,0xf9,0xe5,0x55,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x3f,0xe7,0xa9,0xd7,0xea,0x7e, +0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x12,0x0, +0x6e,0x50,0x27,0xa9,0xc7,0xea,0x7e,0xe3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x4d,0x7e, +0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x7a,0xe3,0x10,0x4d, +0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x3, 0x12,0x6a,0xd1,0x74,0x1, 0x7a,0xb3,0xf, 0xd3, +0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0xa, 0x18,0x12,0x66,0x59,0x7e, +0x37,0xf, 0xd6,0x7e,0x27,0xf, 0xd4,0x7e,0x14,0xa, 0x62,0x12,0x66,0x59,0x6c,0xaa, +0x80,0x36,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0xa, 0x92,0xbe,0x34,0x13,0x88,0x40, +0xc, 0xbe,0x34,0x75,0x30,0x28,0x1a,0xbe,0x34,0x7e,0xf4,0x50,0x14,0x7e,0xb3,0x16, +0xb7,0x4, 0x7a,0xb3,0x16,0xb7,0xb4,0xa, 0xd, 0x74,0x1, 0x7a,0xb3,0x16,0xb6,0x80, +0xf, 0xe4,0x7a,0xb3,0x16,0xb7,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xc2, +0x7e,0xa3,0x16,0xb6,0xbe,0xa0,0x1, 0x78,0x7, 0x7e,0xb3,0x16,0xb5,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x16,0xb5,0xbe,0xb0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb4, +0x4c,0xaa,0x78,0xd, 0xe4,0x7a,0xb3,0x16,0xb5,0x7a,0xb3,0x16,0xb4,0x7a,0xb3,0x16, +0xb7,0x74,0x1, 0x7a,0xb3,0xf, 0xd2,0x12,0x66,0x93,0x12,0x6b,0x7c,0x7e,0xb3,0x11, +0xc, 0xb4,0x1, 0x31,0xbe,0xf0,0x1, 0x78,0x2c,0x7e,0xb3,0xd, 0xfc,0x70,0x26,0x12, +0x46,0xe9,0x7e,0xb3,0xd, 0xf7,0x70,0x19,0x7e,0x73,0x11,0x95,0xa, 0x37,0x9, 0x73, +0xf, 0x29,0x7a,0x73,0x10,0x4a,0xe4,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0x11,0xc, 0x80, +0x6, 0x6c,0xff,0x80,0x2, 0x6c,0xff,0x12,0x65,0xe4,0x12,0x6b,0xde,0x7c,0xbf,0xda, +0x79,0x22,0xca,0x3b,0x75,0x21,0x0, 0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4, +0x12,0x6d,0xe0,0xe4,0x7a,0xb3,0xd, 0x16,0x7a,0xb3,0xd, 0x17,0x7e,0xb3,0xf, 0xd2, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x41,0x68,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, +0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12, +0x6d,0xe0,0x7e,0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4c,0x7e,0x14, +0x13,0xb6,0x6c,0x11,0x12,0x4f,0x1, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, +0x30,0x7e,0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4a,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x1, +0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x51,0x6c,0xcc,0x80,0x47,0x7c,0xbf,0xc4,0x23, +0x54,0x1f,0x7c,0x6b,0x7a,0x61,0x21,0xa, 0x2a,0x9, 0x72,0x13,0xc0,0x7e,0x50,0x2, +0xac,0x5f,0x19,0x72,0xa, 0xb1,0xa, 0x1c,0x9, 0x71,0x13,0xb6,0x19,0x72,0xa, 0xb2, +0x7c,0xbf,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x79,0xa, 0x46,0x2e,0x44,0xb, 0x79,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, +0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xb5,0xb, 0xa0,0xbc,0xda,0x38,0xab,0x7a,0xf3,0xd, +0x16,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34, +0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x7e,0x37,0xf, 0xd6,0x7e, +0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xb6,0x7e,0x10,0x1, 0x12,0x4f, +0x1, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0x10,0x2b,0x7e, +0x27,0xf, 0x4e,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x1, 0x7c,0xdb,0x6c,0xff,0x6c,0xaa, +0x80,0xe, 0x6c,0xcc,0x80,0x4, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xf8,0xb, 0xa0, +0xbc,0xda,0x38,0xee,0x7a,0xf3,0xd, 0x17,0xda,0x3b,0x22,0xca,0xf8,0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x74,0x1, 0x7a,0xb3,0x10, +0x3c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10,0xa5,0x7e,0xb3,0xf, 0x26,0x12,0x6e,0xa1, +0x12,0x63,0xde,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x42,0x84,0x6d, +0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0x0, 0x64,0x7a,0x37,0xa, 0xaf,0xe4,0x7a,0xb3, +0x0, 0xff,0x12,0x6c,0x3a,0x12,0x45,0xdf,0x12,0x6a,0xf4,0x6c,0xff,0x1a,0x2f,0x7e, +0x34,0x0, 0x18,0xad,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b, +0x35,0xb, 0x38,0x30,0x1a,0x2f,0x3e,0x24,0x59,0x32,0x13,0x9c,0xb, 0xf0,0xbe,0xf0, +0xd, 0x78,0xda,0x12,0x6b,0x3a,0x12,0x6c,0x90,0x12,0x68,0xf7,0x6c,0xff,0x1a,0x3f, +0x3e,0x34,0x49,0x23,0x13,0x9c,0x1a,0xf, 0x7e,0x14,0x0, 0x18,0xad,0x10,0x7d,0x31, +0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, +0xf0,0xbe,0xf0,0xd, 0x78,0xd8,0x12,0x69,0xca,0x12,0x48,0xe6,0x7e,0xb3,0xf, 0xd3, +0x70,0x9, 0x7e,0xb3,0xf, 0xd2,0x70,0x3, 0x2, 0x41,0x93,0x12,0x1f,0x7b,0x12,0x33, +0x70,0x7a,0xb3,0xf, 0x25,0x12,0x6d,0xff,0x12,0x6c,0xf6,0x70,0x3, 0x2, 0x41,0x93, +0x12,0x44,0xc9,0x7e,0x37,0xf, 0xda,0x12,0x8, 0x6, 0x12,0x6e,0xa7,0x12,0x4e,0x57, +0x12,0x0, 0x6e,0x50,0x3, 0x12,0x2f,0xc6,0x7e,0xb3,0x11,0x15,0xb4,0x1, 0x4, 0xe4, +0x12,0x6e,0x92,0x12,0x68,0xca,0x12,0x66,0xcc,0x12,0x19,0x6d,0x12,0x6, 0x11,0x12, +0x6e,0xc6,0x12,0x65,0x2c,0x12,0x36,0xb7,0x12,0x55,0xe4,0x12,0x1c,0x95,0x12,0x49, +0xd0,0x2, 0x41,0x93,0x12,0x0, 0x1e,0x12,0x6e,0x1b,0xda,0xf8,0x22,0xca,0x79,0x7e, +0x34,0x0, 0x60,0x12,0x69,0x78,0x7c,0xab,0x7a,0xa1,0x6a,0xbe,0xa0,0x8, 0x40,0x3, +0x2, 0x43,0xab,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0xe0,0x6, 0x80,0x3, 0x7e,0xe0,0x5, +0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x42,0xbf,0x73,0x2, +0x42,0xd7,0x2, 0x42,0xdc,0x2, 0x42,0xe1,0x2, 0x42,0xe6,0x2, 0x42,0xeb,0x2, 0x42, +0xf0,0x2, 0x42,0xf5,0x2, 0x42,0xfa,0x7e,0xf0,0x5e,0x80,0x26,0x7e,0xf0,0x5f,0x80, +0x21,0x7e,0xf0,0x61,0x80,0x1c,0x7e,0xf0,0x63,0x80,0x17,0x7e,0xf0,0x65,0x80,0x12, +0x7e,0xf0,0x67,0x80,0xd, 0x7e,0xf0,0x69,0x80,0x8, 0x7e,0xf0,0x6a,0x80,0x3, 0x7e, +0xf0,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x11,0xe9,0xa, 0xb, 0x7e,0xb3,0x10,0xff, +0xa, 0x1b,0x2d,0x1, 0x7c,0xb1,0x7c,0x1a,0x2e,0x10,0x21,0xa5,0xf7,0x7c,0x9b,0xa, +0x9, 0x5e,0x4, 0x0, 0x1, 0xbe,0x4, 0x0, 0x1, 0x78,0x1c,0x7c,0x79,0xac,0x7f,0x7e, +0x50,0x3, 0xac,0x5f,0xe, 0x24,0xe, 0x24,0x2d,0x32,0x7c,0xba,0x3e,0xb0,0x24,0x25, +0xa, 0xb, 0x1b,0x8, 0x30,0x80,0xd, 0xac,0x9f,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, +0xb, 0x1b,0x8, 0x40,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, 0xb, 0xb, 0x8, 0xf0,0x7e, +0x4, 0x0, 0xa, 0x7d,0x3f,0x8d,0x30,0x8d,0x30,0x7c,0x75,0xbe,0x70,0x0, 0x40,0x14, +0xbc,0xe7,0x28,0x10,0x7e,0xc4,0x0, 0x64,0x7d,0xdf,0x8d,0xdc,0x7d,0xd, 0x9d,0x1, +0x7c,0x61,0x80,0x17,0xbc,0xe7,0x38,0x19,0xbe,0x70,0x9, 0x38,0x14,0x7e,0xe4,0x0, +0x64,0x8d,0xfe,0x7d,0x2f,0xb, 0x24,0x9d,0x21,0x7c,0x65,0xa, 0x2a,0x19,0x62,0x11, +0xe9,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x3, 0x2, 0x43,0x4, 0xda,0x79,0x22,0xca,0x3b, +0x7c,0xeb,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x38,0x3, 0x2, 0x44,0xc0,0x7c,0xbe, +0x12,0xd, 0x46,0x7e,0xb3,0xd, 0xfc,0x60,0x1e,0x7e,0xb3,0x15,0x54,0x70,0x8, 0x7e, +0xb3,0x15,0x55,0x70,0x2, 0x80,0x10,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x28,0xc, +0xe5,0x12,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x1e,0x7e,0xf0,0x1, 0xbe, +0x73,0xf, 0x1c,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x15,0x54,0xbe, +0x73,0xf, 0x1c,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c,0xbe, +0x12,0xd, 0x46,0xe5,0x10,0x7a,0xb3,0xd, 0xf7,0x7e,0x31,0x10,0x74,0x2, 0xac,0x3b, +0x7e,0x24,0x15,0x2b,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x3c,0x75,0x12,0x64,0x75,0x13, +0x64,0x6c,0xee,0x80,0x67,0x6c,0xdd,0x80,0x59,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, +0x18,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0xa, 0x37,0x9d,0x32,0x12, +0x6d,0xd0,0x7c,0xb7,0xf5,0x21,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, 0x19,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x19,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xd0,0x7c, +0xc7,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0xa, 0xe5,0x12,0xbe,0xb1,0x21,0x28,0x3, 0x85, +0x21,0x12,0xbe,0xc0,0x0, 0x28,0x9, 0xe5,0x13,0xbc,0xbc,0x28,0x3, 0x7a,0xc1,0x13, +0xb, 0xd0,0x7e,0x73,0xd, 0xf7,0xbc,0x7d,0x38,0x9f,0xb, 0xe0,0x7e,0x73,0xd, 0xf7, +0xbc,0x7e,0x38,0x91,0xe5,0x12,0xb4,0x64,0x3, 0x75,0x12,0x0, 0xe5,0x13,0xb4,0x64, +0x3, 0x75,0x13,0x0, 0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x85,0x13,0x12,0x80,0x6, +0x75,0x12,0x64,0x75,0x13,0x64,0xda,0x3b,0x22,0x12,0x59,0x46,0x70,0x3, 0x2, 0x45, +0x50,0x75,0x6f,0x14,0x75,0x6e,0x1, 0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, +0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e, +0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19, +0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb, +0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4, +0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22, +0xe5,0x6e,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x45,0xdc,0x15,0x6f,0xe5,0x6f,0x60,0x79, +0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, +0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54, +0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c, +0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79, +0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e, +0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22,0x75,0x6e,0x0, 0xe5,0x21,0x22,0xca, +0x79,0x7e,0x74,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x20,0xe0,0x3, 0x2, 0x46,0xe6,0x54, +0xfe,0x7a,0xb3,0x10,0xfe,0x9, 0x77,0x0, 0x2, 0xbe,0x73,0xf, 0x52,0x68,0x16,0x7a, +0x73,0xf, 0x52,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x7a,0x37,0xf, 0x48,0x7e,0x79,0x70,0xbe,0x73,0xf, 0x5c,0x68,0xe, 0x7a,0x73, +0xf, 0x5c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x54,0x9, 0x77,0x0, 0x1, +0xa, 0x37,0xbe,0x37,0xf, 0x56,0x68,0x4, 0x7a,0x37,0xf, 0x56,0x7e,0x27,0xf, 0x5d, +0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x9, 0x77,0x0, 0x5, 0xa, 0x37,0xbd,0x32, +0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x5d,0x9, 0x77, +0x0, 0x8, 0xbe,0x73,0x11,0x11,0x68,0x24,0x7a,0x73,0x11,0x11,0xbe,0x70,0xf, 0x40, +0x5, 0xe4,0x19,0xb7,0x0, 0x8, 0x9, 0x77,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6d,0xf0, +0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0x11,0x10,0x9, 0x77,0x0, 0x9, +0xbe,0x73,0x11,0x13,0x68,0x8, 0x7a,0x73,0x11,0x13,0x7a,0x73,0x11,0x12,0x9, 0x77, +0x0, 0x7, 0xbe,0x73,0x11,0x14,0x68,0x4, 0x7a,0x73,0x11,0x14,0x9, 0xb7,0x0, 0xb, +0xbe,0xb1,0x51,0x68,0x5, 0xf5,0x51,0x12,0x6c,0xde,0x9, 0x77,0x0, 0x25,0xa, 0x37, +0xbe,0x37,0x11,0xd, 0x68,0x4, 0x7a,0x37,0x11,0xd, 0x9, 0x77,0x0, 0x6, 0xbe,0x73, +0x11,0xf, 0x68,0x4, 0x7a,0x73,0x11,0xf, 0x9, 0x77,0x0, 0x24,0xbe,0x73,0x11,0x15, +0x68,0x4, 0x7a,0x73,0x11,0x15,0xda,0x79,0x22,0xca,0x79,0xe4,0x6c,0xaa,0xa, 0x4a, +0x19,0xb4,0xd, 0x68,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xf3,0xe4,0x7a,0xb3,0xd, 0xf7, +0x7a,0xb3,0xd, 0xf8,0x7a,0xb3,0xd, 0xf9,0x7a,0xb3,0xd, 0xfa,0x7e,0xb3,0xf, 0xd3, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x47,0xef,0x7e,0xb3,0x10,0x2b,0xf5,0x21,0x7e,0xb3, +0x10,0x2c,0xf5,0x22,0x7e,0x37,0xf, 0x56,0x7a,0x35,0x23,0x7e,0x37,0xf, 0x58,0x7a, +0x35,0x25,0x7e,0x37,0xf, 0x5a,0x7a,0x35,0x27,0x7e,0x34,0x0, 0x14,0x7a,0x35,0x2d, +0x7e,0x37,0xf, 0xda,0x7e,0x24,0x0, 0x21,0x7e,0x14,0x0, 0x29,0x7e,0x4, 0x9, 0xc8, +0x12,0x4d,0xa8,0xe5,0x29,0x7a,0xb3,0xd, 0xf7,0xe5,0x2a,0x7a,0xb3,0xd, 0xf8,0xe5, +0x2b,0x7a,0xb3,0xd, 0xf9,0xe5,0x2c,0x7a,0xb3,0xd, 0xfa,0x6c,0xaa,0x80,0x6c,0x7e, +0x53,0xd, 0xf7,0xbc,0x5a,0x28,0x44,0x7c,0xba,0xc4,0x23,0x54,0x1f,0x7c,0x7b,0x7c, +0xba,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0x69, +0x7e,0x30,0x2, 0xac,0x3a,0x49,0x71,0x9, 0xc8,0x7d,0x7, 0xa, 0x0, 0x7c,0x41,0x19, +0x41,0xd, 0x18,0x7d,0x7, 0x7c,0x41,0x19,0x41,0xd, 0x19,0xa, 0x47,0x2e,0x44,0xd, +0x68,0x7e,0x49,0xb0,0x4c,0xb6,0x7a,0x49,0xb0,0x80,0x1e,0xa, 0x15,0xa, 0x2a,0x9d, +0x21,0x3e,0x24,0x49,0x72,0x9, 0xf0,0x7d,0x17,0xa, 0x12,0x7c,0xb3,0x19,0xb2,0xd, +0x40,0x7d,0x17,0x7c,0xb3,0x19,0xb2,0xd, 0x41,0xb, 0xa0,0x7e,0xb3,0xd, 0xf8,0xa, +0x2b,0x7e,0xb3,0xd, 0xf7,0xa, 0x1b,0x2d,0x12,0xa, 0x2a,0xbd,0x21,0x48,0x80,0xda, +0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, +0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32, +0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff, +0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12, +0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, +0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22, +0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf, +0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34, +0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40, +0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, +0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, +0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x48,0x40, +0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x48,0x40,0x30,0xd5,0x6, 0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, +0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e, +0x39,0x40,0x7a,0x19,0x40,0x22,0xca,0x79,0x6c,0xee,0x12,0x65,0x6b,0x7d,0x43,0x6c, +0xaa,0x6c,0x77,0x7e,0x30,0x6, 0xac,0x37,0x2e,0x14,0x6c,0x1c,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70,0x5, +0x40,0xe1,0xbe,0xa0,0x5, 0x78,0x3, 0x2, 0x49,0xb7,0x7e,0x63,0xd, 0xf7,0xbe,0x60, +0x0, 0x38,0x3, 0x2, 0x49,0xb7,0x6c,0x77,0x2, 0x49,0xac,0x6c,0xff,0x6c,0x66,0x80, +0x41,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27,0xf, +0xda,0xb, 0x28,0x20,0x7e,0x30,0x6, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6c,0x1e,0x7e, +0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x2, 0x18,0x14,0xb, 0xf0,0x2e,0x14,0x6c,0x20, +0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x28,0xe, 0x80,0x2, 0x6c,0xff, +0xb, 0x60,0x7e,0xb3,0x10,0x2b,0xbc,0xb6,0x38,0xb7,0x7e,0x50,0x6, 0xac,0x5a,0x7d, +0x12,0x2e,0x14,0x6c,0x20,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x38, +0x17,0xb, 0xe0,0x2e,0x24,0x6c,0x21,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0xbc, +0xbe,0x38,0x7, 0x75,0x14,0x40,0x80,0xf, 0x6c,0xee,0xb, 0x70,0x7e,0xb3,0x10,0x2c, +0xbc,0xb7,0x28,0x3, 0x2, 0x49,0x2b,0xe5,0x15,0x25,0x14,0xf5,0x14,0xbe,0xb0,0x0, +0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0xda,0x79,0x22, +0xca,0x3b,0x7e,0x73,0xd, 0xfb,0x7a,0x73,0xd, 0xfc,0x7e,0xa3,0xf, 0x1b,0x7a,0xa3, +0xf, 0x1c,0xe4,0x7a,0xb3,0xf, 0x1f,0x7e,0x37,0x11,0xd, 0x4d,0x33,0x78,0x3f,0xbe, +0xa0,0x0, 0x28,0x8, 0xe4,0x7a,0xb3,0x16,0xae,0x2, 0x4a,0x97,0x7e,0xb3,0x11,0xf, +0x20,0xe0,0x3, 0x2, 0x4a,0x97,0x7e,0xb3,0x11,0x14,0xbe,0xb3,0x16,0xae,0x28,0x3, +0x2, 0x4a,0x97,0xe4,0x7a,0xb3,0x16,0xae,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x11,0xd, +0x74,0x1, 0x7a,0xb3,0x10,0xa3,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x80,0x69,0xbe,0x34, +0x0, 0x1, 0x78,0x22,0xbe,0xa0,0x0, 0x28,0x5e,0x6d,0x22,0x7a,0x27,0x11,0xd, 0xe4, +0x7a,0xb3,0x10,0xa3,0x7a,0xb3,0x16,0xae,0x74,0x23,0x7a,0xb3,0x16,0xb1,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x80,0x41,0xbe,0x34,0x0, 0x3, 0x78,0x3b,0x6d,0x66,0x7a,0x67, +0x10,0x1, 0x7e,0x74,0xd, 0xac,0x7a,0x77,0xa, 0xaf,0x12,0x6e,0xcc,0x12,0x60,0x22, +0x12,0x58,0x63,0x6d,0x33,0x7a,0x37,0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x7a,0x67,0x10,0x1, 0x7a,0x77,0xa, 0xaf,0x75,0x9a,0x7f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x7e,0xb3,0x16,0xb0,0x70,0x6, 0x12,0x5b,0x69, +0x12,0x64,0x24,0xda,0x3b,0x22,0x7d,0x53,0x9f,0x11,0xbe,0x54,0x0, 0x0, 0x40,0x2d, +0xbe,0x54,0x0, 0x3f,0x38,0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x25,0x7e,0x34,0x1, 0x7c, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x30,0x48,0x4, +0x7e,0x18,0x0, 0x30,0x7e,0x8, 0x0, 0x30,0x9f,0x1, 0x7f,0x10,0x22,0xbe,0x54,0x5, +0x80,0x40,0x29,0xbe,0x54,0x5, 0xaa,0x38,0x23,0x7d,0x25,0x9e,0x24,0x5, 0x7f,0x7e, +0x34,0x1, 0x7c,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, +0x30,0x48,0x4, 0x7e,0x18,0x0, 0x2f,0x2e,0x18,0x4, 0xd0,0x22,0xbe,0x54,0x5, 0xaa, +0x28,0x19,0x7d,0x25,0x9e,0x24,0x5, 0x9f,0x7e,0x34,0x1, 0x7c,0xad,0x32,0x6d,0x22, +0x7c,0x76,0x7c,0x65,0x1a,0x24,0x2e,0x18,0x5, 0x0, 0x22,0xbe,0x54,0x2, 0xdf,0x38, +0x8, 0x7e,0x34,0x2, 0xdf,0x9d,0x35,0x80,0x6, 0x7d,0x35,0x9e,0x34,0x2, 0xe0,0x6d, +0x22,0x7e,0x14,0x0, 0xe2,0x12,0x48,0x35,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x54, +0x2, 0xdf,0x38,0xa, 0x7e,0x8, 0x2, 0x7f,0x9f,0x1, 0x7f,0x10,0x80,0x4, 0x2e,0x18, +0x2, 0x80,0xbe,0x18,0x0, 0x30,0x58,0x5, 0x7e,0x18,0x0, 0x30,0x22,0xbe,0x18,0x4, +0xd0,0x8, 0x4, 0x7e,0x18,0x4, 0xd0,0x22,0x7e,0x34,0x10,0x7e,0x7e,0x24,0x0, 0x81, +0xe4,0x12,0x6d,0xe0,0x74,0xc, 0x7a,0xb3,0x10,0x80,0x7a,0xb3,0x10,0x81,0x74,0x7, +0x7a,0xb3,0x10,0x82,0x74,0xf, 0x7a,0xb3,0x10,0x7e,0x74,0x3c,0x7a,0xb3,0x10,0x7f, +0x74,0xa0,0x7a,0xb3,0x10,0x83,0x74,0x1e,0x7a,0xb3,0x10,0x85,0x74,0x9, 0x7a,0xb3, +0x10,0x86,0x74,0x1e,0x7a,0xb3,0x10,0x87,0xe4,0x7a,0xb3,0x10,0x88,0x7a,0xb3,0x10, +0x89,0xf5,0x52,0xf5,0x51,0x7a,0xb3,0x10,0xa3,0x74,0x1, 0x7a,0xb3,0x10,0x84,0x7a, +0xb3,0x10,0xa2,0x7a,0xb3,0x10,0xa5,0x74,0x9, 0x7a,0xb3,0x10,0xa4,0x74,0xf3,0x7a, +0xb3,0x10,0xa6,0x74,0xb, 0x7a,0xb3,0x10,0xad,0x12,0x6e,0xb9,0xa, 0x36,0x7a,0x73, +0x10,0xa7,0x12,0x6e,0xb9,0x7a,0x73,0x10,0xa8,0x12,0x6e,0xbe,0xa, 0x36,0x7a,0x73, +0x10,0x9f,0x12,0x6e,0xbe,0x7a,0x73,0x10,0xa0,0xe4,0x7a,0xb3,0x10,0xae,0x74,0x1f, +0x7a,0xb3,0x10,0xcf,0xe4,0x7a,0xb3,0x10,0xb0,0x12,0x6e,0xd, 0x7a,0xb3,0x10,0xaf, +0x12,0x6d,0xe, 0x7a,0xb3,0x10,0xa1,0x7e,0x34,0x10,0x8e,0x7e,0x24,0x0, 0x8, 0x74, +0xff,0x12,0x6d,0xe0,0x74,0x9, 0x7a,0xb3,0x10,0x8e,0x74,0x1, 0x7a,0xb3,0x10,0x8f, +0x22,0xca,0x3b,0x6d,0x11,0x7d,0x1, 0x7d,0x21,0x7e,0xa0,0x2, 0x7e,0x70,0x2, 0x6c, +0x66,0x80,0x39,0x6c,0x99,0x80,0x2b,0x7e,0xd0,0x30,0xac,0xd6,0x7e,0xf0,0x2, 0xac, +0xf9,0x7d,0xf7,0x2d,0xf6,0x2e,0xf7,0xf, 0xda,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, 0x14, +0x8, 0x4, 0xb, 0x4, 0x80,0x8, 0xbe,0xf4,0xff,0xec,0x58,0x2, 0xb, 0x24,0xb, 0x14, +0x2c,0x97,0x7e,0xb3,0x10,0x2c,0xbc,0xb9,0x38,0xcd,0x2c,0x6a,0x7e,0xb3,0x10,0x2b, +0xbc,0xb6,0x38,0xbf,0x7e,0x54,0x0, 0x3, 0xad,0x51,0x7d,0x35,0x1e,0x34,0x1e,0x34, +0xbd,0x30,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb8,0x7e,0xb3,0x16,0xb9,0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb9,0x80,0x39,0xe4,0x7a,0xb3,0x16,0xb9,0x75,0x72, +0x1, 0x80,0x2f,0xbd,0x32,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb9,0x7e,0xb3,0x16,0xb8, +0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb8,0x80,0x16,0xe4,0x7a,0xb3,0x16, +0xb8,0x75,0x72,0x2, 0x80,0xc, 0xe4,0x7a,0xb3,0x16,0xb8,0x7a,0xb3,0x16,0xb9,0x75, +0x72,0x0, 0xe5,0x72,0xda,0x3b,0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x0, 0x40,0x2d,0xbe, +0xf4,0x0, 0x3f,0x38,0x27,0x7e,0x44,0x0, 0x3f,0x9d,0x4f,0x7e,0x54,0x1, 0x7c,0xad, +0x54,0x6d,0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x2f,0x40,0x4, 0x7e,0x28,0x0, +0x2f,0x7e,0x18,0x0, 0x2f,0x9f,0x12,0x7f,0x21,0x2, 0x4d,0xa5,0xbe,0xf4,0x3, 0x0, +0x40,0x22,0x7d,0x4f,0x9e,0x44,0x3, 0x0, 0x7e,0x54,0x1, 0x7c,0xad,0x54,0x6d,0x44, +0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x2f,0x40,0x4, 0x7e,0x28,0x0, 0x2e,0x2e,0x28, +0x2, 0xa1,0x80,0x51,0xbe,0xf4,0x1, 0x9f,0x38,0x8, 0x7e,0x54,0x1, 0x9f,0x9d,0x5f, +0x80,0x6, 0x7d,0x5f,0x9e,0x54,0x1, 0xa0,0x6d,0x44,0x7e,0x14,0x0, 0xe4,0x7f,0x12, +0x12,0x48,0x35,0x7f,0x21,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0xbe,0xf4,0x1, 0x9f,0x38, +0xa, 0x7e,0x18,0x1, 0x67,0x9f,0x12,0x7f,0x21,0x80,0x4, 0x2e,0x28,0x1, 0x68,0xbe, +0x28,0x0, 0x2f,0x50,0x6, 0x7e,0x28,0x0, 0x2f,0x80,0xa, 0xbe,0x28,0x2, 0xa1,0x28, +0x4, 0x7e,0x28,0x2, 0xa1,0x7d,0x35,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, +0x56,0xf5,0xba,0x7e,0x55,0x2d,0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50, +0xf5,0xc1,0x9, 0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54, +0xe0,0x4c,0xba,0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c, +0xb7,0xf5,0xc6,0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, +0x4, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75, +0xc5,0x4, 0x1a,0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, +0x6, 0x7c,0xb1,0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, +0x4e,0x29,0x43,0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, +0x75,0xc5,0xa, 0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1, +0x0, 0x3, 0x75,0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19, +0xb1,0x0, 0x1, 0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0xf, 0xd2,0x60, +0x6, 0x7e,0xb3,0xf, 0xd3,0x70,0x18,0x7e,0x34,0xd, 0x68,0x7e,0x24,0x0, 0x3, 0xe4, +0x12,0x6d,0xe0,0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4,0x12,0x6d,0xe0,0x6c, +0xee,0x80,0x6b,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0x7a,0x71,0x21,0x9, 0x65, +0xd, 0x19,0x7a,0x61,0x22,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xdb,0x7c,0xbe,0x54, +0x7, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xc5,0x7e,0x50, +0x30,0xac,0x57,0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x30,0xbe,0x37,0xf, 0x54,0x48,0x25,0xa, 0x3d,0x9, 0xb3,0xd, 0x68,0x5c,0xbc,0x68, +0x1b,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0xd, 0x6b,0x7e,0x70,0x7, 0xac,0x7f,0x2e, +0x34,0xe, 0xd, 0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x3c,0xb, 0xf0,0xb, 0xe0,0x7e,0x73, +0xd, 0xf7,0xbc,0x7e,0x38,0x8d,0x7a,0x73,0xd, 0xfb,0x7a,0xf3,0xf, 0x1b,0xda,0x3b, +0x22,0xca,0xf8,0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x2, 0x4f,0x9c, +0x7e,0x90,0x2, 0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, +0x6e,0x44,0xff,0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0xa, 0x50,0x6b,0x4c, +0xff,0x78,0x14,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, +0xe4,0xbd,0xe4,0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd, +0x1b,0xf5,0xb, 0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0xf4,0x18,0x37,0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd, +0x1b,0xc5,0xb, 0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff, +0xff,0xb, 0xf4,0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18, +0x9, 0xa, 0xda,0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x3, +0x2, 0x4f,0x10,0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x33,0x7d,0x73,0x75,0x25, +0x0, 0x7e,0x64,0x5, 0xe0,0x75,0x23,0x0, 0x80,0x3c,0x75,0x24,0x0, 0x7e,0x51,0x23, +0x74,0x18,0xac,0x5b,0x3e,0x24,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2d, +0x36,0x7a,0x35,0x21,0x49,0x23,0x0, 0x30,0xb, 0x38,0x30,0x9d,0x32,0x12,0x6d,0xd0, +0xe5,0x24,0xb4,0x17,0x2, 0x1e,0x34,0xbd,0x37,0x28,0x2, 0x7d,0x73,0x5, 0x24,0xe5, +0x24,0xb4,0x18,0xc9,0x5, 0x23,0xe5,0x25,0xa, 0x2b,0x7e,0x33,0x10,0x7c,0xa, 0x13, +0x9d,0x12,0x1b,0x14,0xe5,0x23,0xa, 0x2b,0xbd,0x21,0x48,0xae,0xbe,0x74,0x0, 0x41, +0x28,0x11,0x7e,0x34,0x0, 0x73,0x7e,0xa3,0x16,0x54,0x74,0x12,0xa4,0x59,0x35,0x16, +0x65,0x80,0x26,0x7e,0x43,0x16,0x54,0x7e,0x50,0x12,0xac,0x45,0x49,0x32,0x16,0x65, +0xbd,0x37,0x50,0x6, 0x59,0x72,0x16,0x65,0x80,0xf, 0xbe,0x34,0x0, 0x0, 0x28,0x9, +0x2e,0x24,0x16,0x65,0x1b,0x34,0x1b,0x28,0x30,0xda,0x3b,0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x0, 0x46,0x7e,0x35,0x1e,0xb, 0x34,0x7a,0x35,0x1e,0x7e,0xb3,0x0, 0xff,0x4, +0x7a,0xb3,0x0, 0xff,0x7e,0x35,0x1e,0xbe,0x34,0x3, 0xe8,0x40,0x13,0x6d,0x33,0x7a, +0x35,0x1e,0x7e,0xb3,0x16,0xae,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x16,0xae, +0x7e,0x73,0x16,0xb2,0xbe,0x73,0x16,0xb1,0x28,0xb, 0x7e,0xb3,0x16,0xb1,0x4, 0x7a, +0xb3,0x16,0xb1,0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb0,0x7e,0xb3,0x16,0xb3,0x60, +0x5, 0x14,0x7a,0xb3,0x16,0xb3,0x7e,0x37,0x10,0x1, 0xb, 0x34,0x7a,0x37,0x10,0x1, +0x7e,0x37,0xa, 0xaf,0xbe,0x37,0x10,0x1, 0x28,0x3, 0x12,0x6e,0xcf,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x75,0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x16,0xbc,0x75,0x6a,0x0, 0x75,0x8, 0x1, 0x75,0x9, 0x0, 0x75,0xa, +0x0, 0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0xc2,0x0, 0x75, +0x11,0x0, 0x75,0x12,0x64,0x75,0x13,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x16, +0x0, 0x75,0x19,0x1, 0x75,0x1e,0x0, 0x75,0x1f,0x0, 0x75,0x72,0x0, 0x75,0x6e,0x0, +0x75,0x73,0x0, 0x75,0x74,0x1, 0x75,0x70,0x18,0x75,0x71,0x0, 0x75,0x75,0x0, 0x75, +0x76,0x0, 0x75,0x6b,0x0, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0x4, 0x0, 0xff,0x7e, +0x14,0x6e,0xd6,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, +0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44, +0x78,0xf2,0x80,0xdf,0x2, 0x5b,0xce,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, +0x78,0xc, 0x7e,0x34,0x10,0x2b,0x12,0x6b,0x17,0xa9,0xc7,0xea,0x80,0x27,0xbe,0xd0, +0x5, 0x78,0x1f,0xa9,0xd7,0xea,0x7e,0xe3,0x10,0x4a,0x7e,0xf3,0x10,0x4d,0xe4,0x7a, +0xb3,0x10,0x4d,0x12,0x66,0x1f,0x7a,0xb3,0x10,0x4a,0x74,0x1, 0x7a,0xb3,0x10,0x78, +0x80,0x3, 0xe4,0x80,0x4e,0x7e,0xb3,0x11,0x96,0x7e,0x34,0x10,0x2b,0xb4,0x1, 0xa, +0x12,0x31,0xbc,0xe4,0x7a,0xb3,0x11,0x96,0x80,0xa, 0x12,0x60,0xce,0x7e,0x34,0x10, +0x2b,0x12,0x5d,0xbd,0x7e,0x34,0x10,0x2b,0x12,0x6a,0x64,0x7e,0xb3,0x10,0xa5,0xb4, +0x3, 0xa, 0x7e,0x73,0x11,0xe8,0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x69,0x23,0xbe, +0xd0,0x5, 0x78,0xd, 0x7a,0xe3,0x10,0x4a,0x7a,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10, +0x78,0x74,0x1, 0xda,0x79,0xda,0xd8,0x22,0x7e,0x34,0xe, 0xd, 0x7e,0x24,0x0, 0x46, +0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0xe, 0x53,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12, +0x6d,0xe0,0x7e,0x34,0xe, 0x99,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0x6c, +0xaa,0x74,0x3, 0xa, 0x4a,0x19,0xb4,0xe, 0xdf,0x19,0xb4,0xe, 0xe9,0x7e,0x44,0xff, +0xff,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0xe, 0xf3,0x7e,0x70,0x2, 0xac,0x7a,0x59, +0x43,0xf, 0x7, 0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd7,0xe4,0x7a,0xb3,0xf, 0x1b,0x7a, +0xb3,0xf, 0x1c,0x7a,0xb3,0xf, 0x1d,0x7a,0xb3,0xf, 0x1f,0x7a,0xb3,0xf, 0x20,0x7a, +0xb3,0xf, 0x21,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7a,0xb3,0xf, 0x24,0x7a, +0xb3,0xf, 0x25,0x12,0x6a,0xad,0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a,0xb3, +0xf, 0x27,0xe4,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7c,0xab,0x6c,0x33,0x7c,0x27, +0x80,0x73,0x7e,0x90,0x7, 0xac,0x93,0x9, 0xf4,0xe, 0x57,0x7e,0x10,0x7, 0xac,0x12, +0x9, 0xb0,0xe, 0x11,0xbc,0xfb,0x78,0x5b,0xbe,0xf0,0xff,0x68,0x56,0x7e,0x10,0x7, +0xac,0x1a,0x7d,0xf0,0x2d,0xf2,0x19,0xff,0x0, 0x4, 0x49,0x44,0xe, 0x53,0x2d,0x2, +0x1b,0x8, 0x40,0x7e,0x10,0x7, 0xac,0x13,0x49,0x0, 0xe, 0x55,0x7e,0x90,0x7, 0xac, +0x9a,0x2d,0x42,0x59,0x4, 0x0, 0x2, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x12, +0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x5, 0x7e,0x10,0x7, 0xac,0x12, +0x9, 0x10,0xe, 0x13,0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x6, 0xb, +0xa0,0x80,0x6, 0xb, 0x20,0xbc,0x62,0x38,0x89,0xb, 0x30,0xbe,0x30,0xa, 0x50,0x3, +0x2, 0x52,0x9e,0x7c,0xba,0xda,0xf8,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x3b,0xbe, +0xa0,0x3e,0x38,0x36,0xbe,0xa0,0x4, 0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x0, 0x8b,0xbe, +0xa0,0x1, 0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x0, +0x6, 0x7e,0x34,0x15,0xca,0x80,0x4, 0x7e,0x34,0x16,0xc, 0x7a,0x37,0x16,0x51,0xa, +0x3a,0x2e,0x37,0x16,0x51,0x9, 0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0xb, +0x22,0xbe,0xa0,0x80,0x40,0xc, 0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0xf, +0xfe,0x22,0xbe,0xa0,0xfc,0x78,0x5, 0x7e,0xb3,0x10,0xa5,0x22,0xbe,0xa0,0xfd,0x78, +0x8, 0x7e,0x37,0x10,0x46,0x7e,0x39,0xb0,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3, +0x10,0x4a,0x22,0xbe,0xa0,0xf9,0x78,0x5, 0x7e,0xb3,0x16,0xbc,0x22,0xbe,0xa0,0xfa, +0x78,0x3, 0xe5,0x6a,0x22,0xe4,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10, +0x4d,0xf5,0x24,0xe4,0x7a,0xb3,0x10,0x4d,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e, +0x34,0x10,0x2b,0x12,0x6a,0x64,0x75,0x21,0x0, 0x12,0x69,0x23,0x12,0x6e,0x78,0x60, +0xfb,0xa9,0xb7,0xea,0x7d,0x36,0x7d,0x27,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x75, +0x22,0x0, 0x80,0x36,0x75,0x23,0x0, 0x80,0x26,0x7e,0x51,0x22,0x74,0x18,0xac,0x5b, +0xe5,0x23,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, +0x14,0xe, 0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x23,0x7e, +0x73,0x10,0x2c,0xbe,0x71,0x23,0x38,0xd1,0x5, 0x22,0x7e,0x73,0x10,0x2b,0xbe,0x71, +0x22,0x38,0xc1,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x4, 0x40,0x9d,0xe5,0x24,0x7a,0xb3, +0x10,0x4d,0xda,0x3b,0x22,0xca,0xf8,0x30,0x90,0x58,0xc2,0x90,0x5, 0xa, 0xe5,0xa, +0xb4,0x1, 0x6, 0xe5,0x91,0xf5,0xf, 0x80,0x29,0xe5,0xb, 0xc4,0x7c,0xfb,0x5e,0xf0, +0x7, 0x78,0xe, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x56,0x6d,0x80, +0x11,0xbe,0xf0,0x4, 0x78,0xc, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12, +0x15,0xe2,0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, +0x12,0x53,0x28,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e, +0xf5,0x91,0x30,0x91,0x28,0xc2,0x91,0x5, 0x9, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50, +0x7, 0xa5,0xbd,0x0, 0xb, 0xe5,0x9, 0x25,0xf, 0x12,0x53,0x28,0xf5,0x91,0x80,0xd, +0xa5,0xbd,0x4, 0x9, 0xe5,0x9, 0x25,0xf, 0x12,0x27,0x2e,0xf5,0x91,0xda,0xf8,0x22, +0x6c,0x33,0xbe,0x30,0x18,0x50,0x1e,0xa, 0x3, 0x2e,0x7, 0x10,0x35,0x7e,0x9, 0xa0, +0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80, +0x16,0x1e,0xa0,0x80,0x12,0xa, 0x3, 0x2e,0x7, 0x10,0x33,0x9, 0x20,0xff,0xe8,0xa, +0x52,0x2e,0x54,0x0, 0x18,0x7c,0xab,0x7e,0x23,0x10,0x3a,0xbe,0x20,0x3, 0x28,0xe, +0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x21,0xa, 0x42, +0x2e,0x44,0x0, 0xc, 0x7e,0x4, 0x0, 0xf, 0x9d,0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac, +0x1a,0x2d,0x2, 0xb, 0x8, 0x0, 0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e, +0x44,0x7f,0xff,0x9d,0x40,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x3, 0x1b,0x8, 0x40,0xb, +0x30,0xbe,0x30,0x25,0x50,0x3, 0x2, 0x54,0xd2,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac, +0x5a,0x7d,0x32,0x2e,0x37,0xf, 0xd6,0xb, 0x38,0x10,0xbe,0x17,0xe, 0x7, 0x8, 0x12, +0x7d,0x2, 0x2e,0x7, 0xf, 0xd4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30, +0x80,0x18,0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x27,0xf, 0xd4, +0xb, 0x28,0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78, +0xbb,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xe, 0x7, +0x8, 0x12,0x7d,0x2, 0x2e,0x4, 0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b, +0x8, 0x30,0x80,0x18,0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x24, +0x8, 0xe4,0xb, 0x28,0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0, +0x25,0x40,0xc0,0x22,0xca,0x69,0xca,0xf8,0x6c,0x11,0x7e,0xd0,0x7, 0xac,0xd1,0x9, +0x6, 0xe, 0x9d,0x5e,0x0, 0xf, 0x49,0xf6,0xe, 0x9b,0xbe,0xf4,0x5, 0xa, 0x40,0x3c, +0x49,0x46,0xe, 0x99,0x7d,0x34,0x12,0x6b,0x9d,0x7c,0xfb,0xbe,0xf0,0x3, 0x40,0xe, +0x7e,0x14,0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x3e,0x74,0x2, +0xac,0xbf,0x49,0x45,0x0, 0xf8,0x74,0x7, 0xac,0xb1,0x59,0x45,0xe, 0x99,0x7e,0x14, +0x7, 0xd0,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x25,0xbe,0xf4,0x5, 0x0, +0x40,0x1f,0x7e,0x14,0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x74,0x7, +0xac,0xb1,0x49,0x15,0xe, 0x9b,0xbe,0x14,0x5, 0xa, 0x40,0x5, 0x7c,0xb0,0x12,0x68, +0x3d,0xb, 0x10,0xbe,0x10,0xa, 0x40,0x82,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x70, +0x41,0x7e,0x74,0x0, 0xb, 0x7a,0x79,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0xa5,0xbf,0x4, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70, +0x3, 0x80,0x13,0x74,0x27,0x7e,0x70,0x3, 0x80,0x4b,0x7e,0xb3,0x10,0xa5,0xb4,0x3, +0xa, 0x74,0x1, 0x7e,0x70,0x1, 0x12,0x0, 0x5e,0x80,0x45,0x74,0x27,0x7e,0x70,0x1, +0x80,0x33,0xbe,0xb0,0xfc,0x68,0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa,0x5, 0x7e,0x60, +0x5, 0x80,0x10,0xa5,0xbf,0x55,0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5,0xbf,0x66,0x20, +0x7e,0x60,0x7, 0x74,0x27,0x7c,0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0, +0xdf,0x38,0x7, 0x24,0x80,0x12,0x6d,0x9f,0x80,0x6, 0xb4,0xfe,0x3, 0x7a,0x71,0xc, +0xda,0x79,0x22,0x6c,0x77,0x6c,0xaa,0x80,0x3c,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24, +0x2e,0x27,0xf, 0xda,0x2e,0x24,0x0, 0x30,0x7d,0x12,0x1b,0x16,0xb, 0x18,0x40,0xbe, +0x44,0x0, 0x3c,0x8, 0x1e,0x7e,0x14,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0x14,0x14, +0x78,0xfb,0x5e,0x14,0x4, 0x44,0x68,0xb, 0x1b,0x25,0xb, 0x28,0x20,0xbd,0x42,0x8, +0x2, 0xb, 0x70,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xbc,0xbe,0x70,0x1, +0x40,0x30,0x6c,0xaa,0x80,0x24,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, +0xda,0x2e,0x24,0x0, 0x30,0x1b,0x25,0xb, 0x28,0x30,0x7e,0x30,0x2, 0xac,0x3a,0x59, +0x31,0x0, 0xd2,0x6d,0x33,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba, +0x38,0xd4,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x63,0x7c,0xbe,0xc4,0x23,0x54, +0x1f,0x7c,0xab,0x7c,0xbe,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0xa, 0x2a,0x9, 0xb2,0xd, 0x68,0x5c,0xb7,0x68,0x40,0x7e,0x50,0x2, 0xac, +0x5e,0x2e,0x24,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x34,0xd, 0x18,0x7e,0x14, +0x0, 0x2, 0x12,0x6d,0x3c,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbf,0x54, +0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x4a,0x2e,0x44, +0xd, 0x68,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xe0,0x7e,0x63, +0xd, 0xf7,0xbc,0x6e,0x38,0x95,0x7a,0xf3,0xd, 0xf7,0xda,0x79,0x22,0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x7e,0xb3, +0x10,0xa5,0x24,0xfa,0x68,0x17,0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x0, +0xfe,0xbe,0xb0,0x5, 0x68,0x4c,0x74,0x5, 0x7a,0xb3,0x0, 0xfe,0x22,0x7e,0xb3,0x0, +0xfe,0xb4,0x5, 0x3e,0x74,0x6, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x25,0x75, +0x9a,0x80,0x7e,0x34,0x77,0xf8,0x12,0x69,0xa1,0x7e,0x34,0x77,0xf8,0x74,0x66,0x12, +0x59,0xb7,0x7e,0x34,0x77,0xf9,0x74,0xbb,0x12,0x59,0xb7,0x80,0x12,0x7e,0xb3,0x0, +0xfe,0xb4,0x5, 0xe, 0x74,0x7, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x25,0x75, +0xe9,0xff,0x22,0x0, 0x0, 0x0, 0x0, 0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x16,0xac, +0xb4,0x1, 0x14,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20, +0xe4,0x7a,0xb3,0x16,0xac,0x80,0xb, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xd0,0xca,0xc2,0xa8,0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x16,0xb3,0x7e, +0xb3,0x16,0xb3,0x70,0xfa,0x12,0x6e,0x6f,0x12,0x61,0x24,0x12,0x6b,0xbe,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x12, +0x6a,0x18,0x12,0x6a,0x3e,0x12,0x52,0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3, +0x10,0x4d,0x2, 0x6e,0xb3,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xe5,0x55,0xbe,0xb0,0x1, +0x68,0xf9,0x7d,0x36,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6d,0xe0,0x7d,0x37,0x7e,0x24, +0x0, 0x4a,0xe4,0x12,0x6d,0xe0,0x75,0x21,0x1, 0x12,0x6b,0xde,0xe5,0x55,0xbe,0xb0, +0x1, 0x68,0xf9,0x75,0x22,0x0, 0x7e,0x51,0x22,0x74,0x2, 0xac,0x5b,0x49,0x2, 0xa, +0x62,0x1e,0x4, 0x1e,0x4, 0x7d,0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d,0x30,0x1b,0x18, +0x30,0x49,0x12,0xa, 0x18,0x1e,0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31, +0x1b,0x28,0x30,0x5, 0x22,0xe5,0x22,0xb4,0x25,0xcc,0x5, 0x21,0xe5,0x21,0xbe,0xb0, +0x5, 0x40,0xb6,0xda,0x3b,0x22,0x6c,0x77,0x7e,0x63,0xd, 0xfa,0xa, 0x16,0x7e,0x63, +0xd, 0xf9,0xa, 0x26,0x2d,0x21,0xbe,0x24,0x0, 0xa0,0x28,0x3, 0x74,0x1, 0x22,0x6c, +0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0x9a,0xbe,0x24,0x3, 0xe8, +0x8, 0x9, 0xb, 0x70,0xbe,0x70,0x10,0x68,0xe, 0x80,0x2, 0x6c,0x77,0xb, 0xa0,0x7e, +0x63,0x10,0x2c,0xbc,0x6a,0x38,0xdc,0xa5,0xbf,0x10,0x2a,0x6c,0x77,0x6c,0xaa,0x80, +0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0xca,0xbe,0x24,0x7, 0xd0,0x8, 0x9, +0xb, 0x70,0xa5,0xbf,0x8, 0x5, 0x74,0x1, 0x22,0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10, +0x2b,0xbc,0x6a,0x38,0xdc,0xe4,0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb, +0x75,0xfb,0xa5,0x75,0xfb,0xf, 0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68,0x18,0xbe, +0x34,0x73,0xf9,0x68,0x12,0xbe,0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, 0xd2,0xaf, +0xc2,0xc9,0xa9,0xc5,0xcb,0xe4,0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c,0xb7,0x54, +0xfe,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75, +0xf6,0xff,0x7a,0xa1,0xf6,0x80,0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75,0xf5,0x80, +0x74,0x1, 0x12,0x6d,0x25,0xa9,0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9, +0xa9,0xc5,0xcb,0x74,0x1, 0x22,0x74,0xa, 0x7a,0xb3,0xf, 0x46,0x74,0x14,0x7a,0xb3, +0xf, 0x47,0x7e,0x34,0x3, 0x20,0x7a,0x37,0xf, 0x48,0x7a,0x37,0xf, 0x4a,0x7e,0x24, +0x1, 0xf4,0x7a,0x27,0xf, 0x4c,0x7a,0x37,0xf, 0x4e,0x7a,0x37,0xf, 0x50,0x74,0xc, +0x7a,0xb3,0xf, 0x52,0x74,0x8, 0x7a,0xb3,0xf, 0x53,0x7e,0x34,0x0, 0x3c,0x7a,0x37, +0xf, 0x54,0x7a,0x37,0xf, 0x56,0x7a,0x37,0xf, 0x58,0x7e,0x34,0x0, 0x28,0x7a,0x37, +0xf, 0x5a,0x74,0xf, 0x7a,0xb3,0xf, 0x5c,0xe4,0x7a,0xb3,0xf, 0x5f,0x74,0x4, 0x7a, +0xb3,0xf, 0x60,0x7e,0x34,0x0, 0x64,0x7a,0x37,0xf, 0x61,0x7e,0x34,0xa, 0x0, 0x7a, +0x37,0xf, 0x5d,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x3c,0xf5,0x1d, +0xe4,0x7a,0xb3,0x10,0x3c,0x7d,0x36,0x7d,0x27,0x12,0x6a,0x89,0x7e,0x34,0x10,0x2b, +0x12,0x5b,0x2, 0x75,0x1b,0x0, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81, +0x60,0xfb,0x7d,0x36,0x7e,0x25,0x70,0x12,0x54,0xd0,0x75,0x1c,0x0, 0x7e,0x51,0x1c, +0x74,0x2, 0xac,0x5b,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d, +0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x1c,0xe5,0x1c,0xb4,0x25,0xdd, +0x5, 0x1b,0xe5,0x1b,0xbe,0xb0,0x4, 0x40,0xbd,0xe5,0x1d,0x7a,0xb3,0x10,0x3c,0xda, +0x3b,0x22,0x7d,0x3, 0x75,0xcc,0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0, +0xe5,0xca,0x54,0x1, 0x4c,0xba,0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1, +0xe1,0x9, 0x70,0x0, 0xe, 0x2e,0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c, +0xba,0xc4,0x33,0x54,0xe0,0x7c,0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, +0xb0,0x0, 0x13,0x54,0x3, 0xa, 0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5, +0xe3,0x54,0xe7,0x4c,0xba,0xf5,0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12, +0x5c,0xfb,0x9, 0xb0,0x0, 0x14,0xf5,0xe7,0x22,0x7e,0xb3,0x16,0xac,0x70,0x17,0xe5, +0xcc,0x7a,0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xaf, +0x74,0x1, 0x7a,0xb3,0x16,0xac,0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc, +0xc2,0xca,0xc2,0xc8,0xa9,0xc4,0xcb,0x80,0x2e,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0x23, +0xe5,0x75,0xb4,0x1, 0x1e,0xe5,0x76,0xb4,0x1, 0x19,0xa9,0xc3,0xcb,0x7e,0x24,0x0, +0x1, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3, +0xc9,0xc2,0xcd,0xe4,0x12,0x6d,0x69,0x7e,0xb3,0x16,0xb0,0x60,0xcc,0x22,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcc,0x12, +0x6e,0x6f,0x12,0x61,0x24,0x12,0x6e,0xd5,0x12,0x6d,0x7b,0x74,0x1, 0x7a,0xb3,0x10, +0xa5,0x12,0x6b,0xbe,0x12,0x6a,0x18,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10, +0x4d,0x12,0x6e,0xb3,0x7e,0xb3,0x10,0xa5,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14, +0x68,0x16,0x14,0x68,0x13,0x24,0x5, 0x78,0xeb,0x12,0x41,0x6b,0x80,0xe6,0x12,0x5e, +0x70,0x80,0xe1,0x12,0x69,0xf1,0x80,0xdc,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x12,0x57, +0xed,0x80,0xd1,0x7c,0xa5,0x7c,0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36, +0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2, +0x1e,0xb0,0x1e,0xb0,0x54,0xf, 0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44, +0x1e,0x50,0x1e,0x50,0x1e,0x50,0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd, +0xa, 0x50,0xf5,0xc1,0x7c,0xb3,0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0, +0x43,0xc2,0x7, 0x80,0x7, 0x43,0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5, +0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, +0xac,0x13,0x2e,0x4, 0x1c,0x3a,0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c, +0x33,0x80,0x43,0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0, +0xb, 0x2d,0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, +0xb0,0x54,0x1f,0xa, 0xfb,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c, +0xb2,0x1e,0xb0,0x7e,0x90,0x2, 0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d, +0xf, 0x1b,0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, +0x9, 0xb2,0x0, 0xc, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54, +0x7f,0xf5,0xe5,0x75,0xe4,0x7, 0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4, +0xb, 0x6c,0xaa,0xa, 0x1a,0x49,0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5, +0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39, +0xb0,0xf5,0xe5,0x75,0xe4,0x31,0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff, +0xf5,0xe5,0x75,0xe4,0x32,0x5e,0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0xca,0x79, +0x7e,0x71,0x54,0x3e,0x70,0x3e,0x70,0x7c,0xb7,0x24,0x56,0xa, 0x2b,0xb, 0x28,0x50, +0x7c,0xab,0x7c,0xb7,0x24,0x58,0xa, 0x3b,0xb, 0x38,0x70,0x4d,0x77,0x68,0x1f,0xbe, +0xa0,0x1, 0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34, +0x10,0x2b,0x12,0x6b,0x17,0x7d,0x37,0x7e,0x24,0x18,0x0, 0x12,0x54,0xd0,0x5, 0x54, +0xe5,0x53,0xbe,0xb1,0x54,0x28,0x10,0x12,0x62,0x6b,0xb4,0x1, 0x5, 0x75,0x55,0x1, +0x80,0x8, 0x75,0x55,0x3, 0x80,0x3, 0x75,0x55,0x2, 0xda,0x79,0x22,0x6d,0x11,0x7e, +0x24,0x1c,0x1c,0x1b,0x28,0x10,0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, +0xa3,0x0, 0x50,0x80,0x2, 0x7c,0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e, +0x19,0x40,0xa, 0x14,0x7e,0x4, 0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, +0x14,0x1b,0x8, 0x10,0x49,0x13,0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b, +0x8, 0x10,0x49,0x13,0x0, 0x43,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10, +0xb, 0x50,0xbe,0x50,0xd, 0x40,0xb1,0x22,0x75,0x9, 0x0, 0xe5,0xb, 0xc4,0x7c,0x5b, +0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53,0x28,0xf5,0x91,0x80,0xb, +0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e,0xf5,0x91,0x75,0xa, 0x0, 0xe4,0x7a, +0xb3,0x16,0x4e,0x7e,0x34,0x15,0xca,0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0, +0x7e,0x34,0x16,0xc, 0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0,0x74,0xaa,0x7a, +0xb3,0x15,0xca,0x7a,0xb3,0x15,0xcb,0x7a,0xb3,0x16,0xc, 0x7a,0xb3,0x16,0xd, 0x22, +0xca,0xf8,0x74,0x3, 0x7a,0xb3,0x16,0xa3,0xe4,0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10, +0x4d,0x74,0x3, 0x7a,0xb3,0x16,0xa3,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, +0xac,0x7a,0x37,0xa, 0xaf,0x7e,0xf3,0x16,0xa3,0xbe,0xf0,0x3, 0x78,0x1d,0xe5,0xb, +0x30,0xe7,0xe4,0x12,0x6a,0xf4,0x7e,0x37,0xf, 0xd6,0x7a,0x37,0x16,0xa0,0x7e,0x37, +0xf, 0xda,0x7a,0x37,0x16,0x9e,0x53,0xb, 0x7f,0x80,0xcc,0x7a,0xf3,0x10,0xa5,0x12, +0x0, 0x1e,0x12,0x0, 0x6a,0xda,0xf8,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5, +0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5, +0xbc,0x7c,0xb3,0xf5,0xbd,0xa, 0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5, +0xc3,0xe5,0xc4,0x54,0xe0,0x4c,0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23, +0x4e,0x24,0x0, 0x1, 0x7c,0x15,0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2, +0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x6c, +0xaa,0x6c,0x77,0x7e,0x10,0x30,0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d, +0x1, 0x2e,0x7, 0xf, 0xda,0xb, 0x8, 0x20,0xbe,0x27,0xe, 0x5, 0x8, 0x12,0x7d,0x41, +0x2e,0x47,0xf, 0xd8,0xb, 0x48,0x0, 0x2e,0x7, 0xe, 0x5, 0x1b,0x48,0x0, 0x80,0x18, +0x6d,0x0, 0x9e,0x7, 0xe, 0x5, 0xbd,0x20,0x58,0xe, 0x2e,0x17,0xf, 0xd8,0xb, 0x18, +0x20,0x9e,0x27,0xe, 0x5, 0x1b,0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0, +0xbe,0xa0,0xd, 0x40,0xac,0x22,0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, +0x31,0x7e,0x79,0x50,0xa5,0xbd,0x0, 0xb, 0x7e,0xd, 0x31,0x7e,0xb, 0x40,0x7a,0x79, +0x40,0x80,0x36,0x7e,0xd, 0x31,0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12, +0x6d,0xd0,0xa, 0x2c,0xbd,0x32,0x8, 0x18,0x7e,0x1d,0x31,0x7e,0x1b,0xb0,0x7e,0x79, +0xa0,0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0, +0x7e,0x79,0x30,0x7e,0x1d,0x31,0x7a,0x1b,0x30,0xda,0x3b,0x22,0x7e,0xb3,0x10,0x39, +0xb4,0x1, 0x26,0x7e,0x73,0xa, 0xac,0x7a,0x73,0x10,0x37,0x7e,0x73,0xa, 0xad,0x7a, +0x73,0x10,0x38,0x7e,0x73,0xa, 0xae,0x7a,0x73,0x10,0x3a,0x7e,0x34,0xd, 0xfe,0x7a, +0x37,0x10,0x46,0x7e,0x34,0xf, 0xdc,0x80,0x24,0x7e,0x73,0x11,0x16,0x7a,0x73,0x10, +0x37,0x7e,0x73,0x11,0x49,0x7a,0x73,0x10,0x38,0x7e,0x73,0x11,0x94,0x7a,0x73,0x10, +0x3a,0x7e,0x34,0x11,0x9d,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, 0x63,0x7a,0x37,0x10, +0x48,0x22,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x75,0x60,0xfc,0xe5,0x76,0x60, +0xfc,0x20,0x93,0xfd,0xd2,0x96,0xd2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e, +0xb3,0x16,0xac,0x70,0x17,0xe5,0xcc,0x7a,0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, +0x38,0x30,0x7a,0x73,0x16,0xaf,0x74,0x1, 0x7a,0xb3,0x16,0xac,0xa9,0xc0,0xca,0x7e, +0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9, +0xc2,0xcd,0x75,0x87,0x2, 0x0, 0x0, 0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d, +0x32,0x2e,0x37,0xf, 0xd6,0xb, 0x38,0x10,0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x2d, +0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x9, 0x2e,0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e, +0x24,0x3, 0x70,0x74,0x18,0x7e,0x13,0x10,0x2b,0x6c,0x0, 0x2, 0x5e,0xc8,0x9, 0xa3, +0x0, 0x24,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43, +0xcc,0x8, 0x9, 0x53,0x0, 0x2, 0x3e,0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca, +0xa9,0xd0,0xca,0xd2,0xcd,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9, +0xc0,0xc9,0x7e,0x14,0x1d,0x0, 0xb, 0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20, +0x9, 0xb3,0x0, 0x3f,0xb4,0x1, 0xc, 0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54, +0xf0,0xf5,0xe5,0x22,0x12,0x4b,0x78,0x12,0x3b,0x1c,0x12,0x68,0x9d,0x7e,0x34,0x8, +0x50,0x7a,0x37,0xf, 0xd4,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x7e,0x34,0x8, +0x9a,0x7e,0x27,0xf, 0xd4,0x12,0x6a,0x89,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xf, 0xd8, +0x7e,0x34,0x3, 0x70,0x7a,0x37,0xf, 0xda,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xf, 0xd8, +0x12,0x67,0xa7,0x12,0x64,0xec,0x12,0x5a,0x26,0x12,0x6a,0x3e,0x12,0x52,0x8, 0x12, +0x6e,0x52,0x74,0x1, 0x7a,0xb3,0x11,0x96,0x22,0xca,0xf8,0x7e,0xb3,0xf, 0xd2,0xb4, +0x1, 0x48,0x6c,0xff,0x80,0x3c,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, +0xac,0xbf,0x9, 0xb5,0xa, 0xb1,0x7e,0x53,0x10,0x2b,0x12,0x35,0x22,0x74,0x4, 0xac, +0xbf,0x59,0x35,0xb, 0x86,0x7e,0x37,0xf, 0xd6,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, +0xb2,0x7e,0x53,0x10,0x2c,0x12,0x35,0x22,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x88, +0xb, 0xf0,0x7e,0x73,0xd, 0x16,0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0xca,0x69,0xca, +0xf8,0x7c,0xfb,0x7e,0x24,0x0, 0x4, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24, +0x56,0xa, 0x3b,0x1b,0x38,0x20,0x6d,0x66,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38, +0x60,0xb, 0xf0,0x12,0x0, 0x6e,0x50,0x1e,0x7e,0x24,0x0, 0x5, 0x7c,0xaf,0x3e,0xa0, +0x3e,0xa0,0x7c,0xba,0x24,0x56,0xa, 0x3b,0x1b,0x38,0x20,0x7c,0xba,0x24,0x58,0xa, +0x3b,0x1b,0x38,0x60,0xb, 0xf0,0x7c,0xbf,0xda,0xf8,0xda,0x69,0x22,0x7e,0x47,0x16, +0x65,0x6c,0x77,0x7e,0xa0,0xff,0x7e,0x43,0x16,0x54,0xa, 0x14,0x9, 0x51,0xf, 0x29, +0xbe,0x53,0x10,0x4a,0x78,0x32,0x7e,0x50,0x12,0xac,0x45,0x49,0x22,0x16,0x65,0xbe, +0x24,0x0, 0x41,0x40,0x23,0x7e,0x60,0x1, 0xbe,0x44,0x0, 0x19,0x40,0x18,0x7e,0x30, +0x12,0xac,0x36,0x49,0x21,0x16,0x65,0xbd,0x24,0x50,0x4, 0x7d,0x42,0x7c,0x76,0xb, +0x60,0xbe,0x60,0x4, 0x40,0xe2,0x7c,0xa7,0x7c,0xba,0x22,0xca,0x79,0xe5,0x53,0xbe, +0xb1,0x54,0x38,0x4, 0x6c,0xff,0x80,0x3a,0xe5,0x54,0x3e,0xb0,0x3e,0xb0,0x24,0x56, +0xa, 0x3b,0xb, 0x38,0x30,0x7c,0xe7,0xbe,0xe0,0x1, 0x68,0xe, 0xbe,0xe0,0x2, 0x68, +0x9, 0xbe,0xe0,0x3, 0x68,0x4, 0x4c,0xee,0x78,0x7, 0x7c,0xbe,0x12,0x63,0x2, 0x7c, +0xfb,0xbe,0xe0,0x4, 0x68,0x5, 0xbe,0xe0,0x5, 0x78,0x7, 0x7c,0xbe,0x12,0x51,0x77, +0x7c,0xfb,0x7c,0xbf,0xda,0x79,0x22,0x7e,0xa3,0xd, 0xf7,0xbe,0xa0,0x0, 0x28,0x40, +0x6c,0x77,0x80,0x38,0x7e,0x50,0x2, 0xac,0x57,0x9, 0x62,0xd, 0x18,0x9, 0x52,0xd, +0x19,0x7e,0x30,0x2, 0xac,0x36,0x49,0x1, 0x11,0xce,0x7e,0x17,0xf, 0x4a,0xe, 0x14, +0xbd,0x1, 0x48,0x13,0x7e,0x30,0x2, 0xac,0x35,0x49,0x1, 0x11,0x9e,0x7e,0x17,0xf, +0x4c,0xe, 0x14,0xbd,0x1, 0x58,0x3, 0x74,0x1, 0x22,0xb, 0x70,0xbc,0xa7,0x38,0xc4, +0xe4,0x22,0xca,0xf8,0x7c,0xfb,0xbe,0xf0,0x1, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xf0, +0x2, 0x68,0x4, 0x4c,0xff,0x78,0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x39,0x80,0x3, 0xe4, +0x80,0x28,0x12,0x5f,0xcc,0x4c,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x10,0x3a,0x74,0x1e, +0x7a,0xb3,0x10,0x37,0x74,0xa, 0x7a,0xb3,0x10,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5b, +0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x74,0x1, 0xda,0xf8,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x75,0x75,0x1, 0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x60,0x2, 0x1b,0x28, +0x30,0xb, 0x28,0x30,0x4e,0x70,0x2, 0x1b,0x28,0x30,0xe5,0x55,0xb4,0x1, 0x3, 0x12, +0x5d,0x5e,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b, +0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9, +0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc, +0x7a,0xa1,0xc3,0x75,0xc5,0x40,0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, +0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x3b, +0xe5,0xc6,0xa, 0x2b,0x7c,0x45,0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22,0xe4,0x7a, +0xb3,0x15,0x9f,0x7a,0xb3,0x15,0x53,0x7a,0xb3,0x15,0x9e,0x7a,0xb3,0x15,0xa0,0x7a, +0xb3,0x15,0xa1,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x48,0x12,0x6d,0xe0,0x7e,0x34, +0x14,0xe3,0x7e,0x24,0x0, 0x48,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x15,0x56,0x7e,0x24, +0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x46,0x74, +0xff,0x2, 0x6d,0xe0,0xd2,0xcd,0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e, +0xb3,0x16,0xac,0xb4,0x1, 0x15,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, +0x1b,0x38,0x20,0x7e,0xb3,0x16,0xad,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e, +0x34,0x1d,0x8, 0x1b,0x38,0x20,0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x16,0xac,0x22,0x7c,0xab,0x6c,0x33,0x80,0x36, +0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d, +0x3, 0x7e,0x9, 0x10,0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e, +0x20,0x1e,0x20,0x7e,0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d, +0xf, 0x1b,0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x75,0x76,0x0, 0x75,0xe4, +0x3, 0x49,0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, +0x5e,0x24,0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5, +0x75,0xe4,0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9, +0xd6,0xea,0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1,0x22,0x7e,0x34,0x1, 0x90, +0x7a,0x37,0xd, 0xff,0x7e,0x34,0x0, 0x19,0x7a,0x37,0xe, 0x1, 0x7e,0x34,0x0, 0x9c, +0x7a,0x37,0xe, 0x3, 0x7e,0x34,0x0, 0x2, 0x7a,0x37,0xe, 0x5, 0x7a,0x37,0xe, 0x7, +0x74,0x1, 0x7a,0xb3,0xe, 0x9, 0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, +0x7e,0x34,0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x2, 0x6d,0xe0,0xca,0xf8,0x7e,0x24, +0xe, 0xd, 0x7e,0x34,0xe, 0x99,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x6c,0xff,0x74, +0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x12,0x4c,0xf7,0x74,0x7, 0xac,0xbf,0x59,0x35, +0xe, 0x99,0x49,0x35,0xe, 0xf, 0x12,0x4a,0xa6,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, +0x9b,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xd7,0xda,0xf8,0x22,0x6d,0x33,0x6c,0xaa,0x80, +0x2e,0x7e,0x30,0x2, 0xac,0x3a,0x9, 0x51,0xd, 0x18,0x9, 0x41,0xd, 0x19,0x7e,0x10, +0x30,0xac,0x15,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xf, 0xda,0xb, 0x18, +0x40,0xbe,0x44,0x0, 0x0, 0x8, 0x6, 0xbd,0x43,0x8, 0x2, 0x7d,0x34,0xb, 0xa0,0x7e, +0xb3,0xd, 0xf7,0xbc,0xba,0x38,0xca,0x22,0xca,0x79,0x7d,0x41,0x7d,0x13,0x6d,0x0, +0x7e,0x34,0x7f,0xff,0x6c,0xaa,0x80,0x1b,0x7e,0xf0,0x7, 0xac,0xfa,0x7d,0xe7,0x2d, +0xe4,0x49,0xfe,0x0, 0x2, 0xbd,0xf0,0x28,0x2, 0x7d,0xf, 0xbd,0xf3,0x50,0x2, 0x7d, +0x3f,0xb, 0xa0,0x9, 0xb4,0x0, 0x46,0xbc,0xba,0x38,0xdd,0x1b,0x18,0x0, 0x1b,0x28, +0x30,0xda,0x79,0x22,0xca,0xf8,0x7e,0xb3,0x10,0x4e,0x60,0x3, 0xb4,0x1, 0x2d,0xa9, +0xc6,0xea,0x12,0x2b,0xa0,0x7c,0xfb,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12, +0x67,0xa7,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x53,0xb7,0xbe,0xf0,0x1, +0x78,0x4, 0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0x10,0x4e,0xda,0xf8,0x22,0x7e, +0xb3,0x16,0x54,0x4, 0x7a,0xb3,0x16,0x54,0x7e,0x73,0x16,0x54,0xbe,0x70,0x4, 0x40, +0x5, 0xe4,0x7a,0xb3,0x16,0x54,0x7e,0xa3,0x16,0x54,0xbe,0xa0,0x3, 0x78,0x13,0x7e, +0xb3,0x16,0x9d,0x4, 0x7a,0xb3,0x16,0x9d,0xbe,0xb0,0x8, 0x40,0x5, 0xe4,0x7a,0xb3, +0x16,0x9d,0xa, 0x3a,0x9, 0xb3,0xf, 0x29,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d, +0x21,0x7d,0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x3c,0x7e,0xb3,0x10,0x3c,0xb4,0x1, +0x1f,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d, +0x26,0xb, 0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3, +0xda,0x3b,0x22,0x7e,0xb3,0x10,0x3d,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3, +0x10,0x39,0x12,0x5f,0xcc,0x12,0x2d,0xb5,0xe4,0x7a,0xb3,0x10,0x39,0x12,0x5f,0xcc, +0x12,0x2d,0xb5,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x17,0x7e,0x37,0xf, 0xd4,0x7e,0x24, +0x8, 0xe4,0x12,0x58,0xd5,0x74,0x2, 0x7a,0xb3,0x10,0x3d,0x22,0x7e,0xa3,0xf, 0x1c, +0xbe,0xa0,0x0, 0x38,0x2f,0xbe,0xa3,0xf, 0x1b,0x50,0x19,0x7e,0xb3,0xf, 0x25,0xbe, +0xb3,0x12,0x33,0x28,0x14,0x7e,0xb3,0x12,0x33,0x4, 0x7a,0xb3,0x12,0x33,0x7a,0xa3, +0xf, 0x1b,0x80,0x5, 0xe4,0x7a,0xb3,0x12,0x33,0x7e,0xb3,0xf, 0x1b,0x70,0x5, 0xe4, +0x7a,0xb3,0xf, 0x24,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca, +0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12, +0x54,0x45,0x74,0x1, 0x7a,0xb3,0x16,0x4e,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, +0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x75,0x76,0x1, 0x75,0xe6,0x0, 0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0x5e,0xd0, +0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda, +0x6b,0xda,0x7b,0x32,0xca,0xf8,0x7d,0x1, 0x7d,0x13,0x7e,0xf3,0x10,0x4d,0xbe,0xf0, +0x1, 0x78,0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x2, 0x80,0x11, +0x4c,0xff,0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, +0x4, 0x12,0x5e,0xc8,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0xf, 0xd3,0x6c,0xaa,0x6c,0x33, +0x6d,0xff,0x7e,0x10,0x18,0xac,0x1a,0xa, 0xe3,0x2d,0xe, 0x3e,0x4, 0x7d,0x40,0x2d, +0x42,0x1b,0x48,0xf0,0x6d,0x44,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x18, +0xdf,0xb, 0xa0,0xbe,0xa0,0xd, 0x40,0xd6,0x22,0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c, +0x33,0x4c,0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d, +0x30,0x80,0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe, +0x30,0x3, 0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, +0x2a,0x2d,0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x7e,0x24, +0xff,0xff,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x14,0x2d, +0x13,0x59,0x21,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd1,0x22,0x7c,0xab,0x7e, +0x24,0xe, 0xdf,0xbe,0xa0,0xa, 0x50,0x25,0xa, 0x3a,0x7d,0x13,0x2d,0x12,0x7e,0x19, +0xb0,0xb4,0x2, 0xe, 0x74,0x1, 0x7a,0x19,0xb0,0x74,0x3, 0x2d,0x23,0x19,0xb2,0x0, +0xa, 0x22,0x74,0x3, 0x7a,0x19,0xb0,0x2d,0x32,0x19,0xb3,0x0, 0xa, 0x22,0xca,0x7b, +0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83, +0xc0,0x82,0x12,0x6e,0x5c,0x53,0xb, 0xfd,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, +0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x6d,0x33,0x7a, +0x37,0x11,0xd, 0x74,0x1, 0x7a,0xb3,0x11,0xf, 0x74,0xb, 0x7a,0xb3,0x11,0x10,0x74, +0x9, 0x7a,0xb3,0x11,0x11,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x7a,0xb3,0x11,0x13,0x7a, +0xb3,0x11,0x14,0x74,0x1, 0x7a,0xb3,0x11,0x15,0x22,0x7e,0xb3,0xf, 0x1b,0x70,0x1e, +0x7e,0xa3,0xf, 0x1c,0xbe,0xa0,0x0, 0x28,0x15,0xe5,0x16,0x70,0xd, 0x7a,0xa3,0xf, +0x1b,0x74,0x1, 0x7a,0xb3,0xf, 0x22,0x5, 0x16,0x22,0x75,0x16,0x0, 0x22,0x75,0x16, +0x0, 0xe4,0x7a,0xb3,0xf, 0x22,0x22,0x6c,0xaa,0x80,0x1f,0x7e,0x70,0x2, 0xac,0x7a, +0x49,0x23,0x0, 0xd2,0x7e,0x70,0x18,0xac,0x7a,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e, +0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba, +0x38,0xd9,0x22,0x75,0x75,0x0, 0xa9,0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30, +0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x2, +0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, 0x5e, +0x0, 0xa, 0x0, 0x96,0x1, 0x2c,0x0, 0x9, 0x0, 0x50,0x0, 0xfa,0x0, 0x8, 0x0, 0x3c, +0x0, 0xc8,0x0, 0x6, 0x0, 0x32,0x0, 0xa0,0x0, 0x4, 0x0, 0x1e,0x0, 0x78,0x0, 0x3, +0x0, 0xa, 0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0xf5, +0xf1,0x7c,0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9,0x37, +0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5,0xcb, +0x22,0xc2,0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x3e,0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, 0x12, +0x6d,0x25,0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x12,0x22,0x20,0x12,0x3d,0xb5, +0x12,0x4c,0x41,0x60,0x6, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x7e,0xb3,0xe, 0xb, 0x60, +0x3, 0x12,0x60,0x78,0x7e,0xb3,0xe, 0xc, 0x60,0x6, 0x12,0x55,0x5a,0x2, 0x5f,0x1f, +0x22,0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0xf, 0x28,0x12,0x6a, +0x18,0xb4,0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x53,0xb, 0x8f,0x74,0x2, 0x80, +0x2, 0x74,0xff,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x66,0x93, +0x7e,0xb3,0x10,0x3d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x65,0xe4,0x7e,0xb3, +0x10,0x4e,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x34, +0xa, 0xb1,0x7e,0x24,0x3, 0x4d,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0xb, 0x86,0x7e,0x24, +0x1, 0x90,0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0xd, 0x6b,0x7e,0x24,0x0, 0x8c,0x74, +0xff,0x2, 0x6d,0xe0,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51,0x80, +0x3, 0x7e,0x39,0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23,0x0, +0x3b,0x7e,0x34,0x1d,0x6, 0x1b,0x38,0x20,0x22,0xe4,0x7a,0xb3,0xf, 0xd2,0x6c,0xaa, +0x6d,0x44,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x2, 0x1b,0x8, 0x40,0x6d,0x0, +0x2d,0x13,0x1b,0x18,0x0, 0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x22,0x7e,0x34,0x12, +0x1, 0x7e,0x24,0x0, 0x1e,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x12,0x1f,0x7e,0x24,0x0, +0x14,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x11,0xed,0x7e,0x24,0x0, 0x14,0xe4,0x2, 0x6d, +0xe0,0x12,0x0, 0x6e,0x50,0x1d,0x12,0x6e,0xad,0x7c,0xab,0x7e,0xb3,0x11,0x95,0xbe, +0xb0,0x4, 0x68,0xf, 0xbe,0xa0,0xff,0x68,0xa, 0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x7a, +0xa3,0x11,0x95,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb3,0x10,0x3d,0x70,0x3, 0x7e,0xf0, +0x1, 0x74,0x1, 0x12,0x3e,0xf7,0xbe,0xb0,0x1, 0x68,0x5, 0xbe,0xf0,0x1, 0x78,0x4, +0xe4,0x12,0x3e,0xf7,0xda,0xf8,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5,0x0, +0x75,0xe4,0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, 0x9, +0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x7e,0x34,0x8, 0x9a,0x7e,0x24, +0x11,0x9e,0x7e,0x14,0x1, 0x90,0x12,0x3c,0x70,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x11, +0x4a,0x7e,0x14,0x0, 0xc8,0x12,0x3c,0x70,0x2, 0x56,0xf3,0x74,0x1, 0x12,0x6e,0x3d, +0xa9,0xc3,0xea,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x75,0x9a, +0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xe5,0x52,0xb4,0x1, +0x18,0xe5,0x51,0x70,0x14,0x7e,0xb3,0x11,0x95,0x60,0xb, 0xe4,0x7a,0xb3,0x11,0x95, +0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x12,0x6c,0x58,0x85,0x51,0x52,0x22,0x6c,0xaa,0x7e, +0x50,0x4, 0xac,0x5a,0x49,0x12,0x0, 0xec,0xbd,0x13,0x38,0x8, 0x49,0x22,0x0, 0xee, +0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe4,0x7c,0xba,0x22,0x7e,0x24, +0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0x8d,0x12,0x6c,0xab,0x7e, +0x34,0x7, 0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x2e,0x75,0x55, +0x0, 0x75,0x73,0x0, 0x75,0x54,0x0, 0x12,0x6b,0xfd,0x12,0x61,0xcd,0xf5,0x53,0x12, +0x62,0x6b,0xb4,0x1, 0x4, 0x75,0x55,0x1, 0x22,0x75,0x55,0x3, 0x22,0x7e,0x34,0x0, +0x1, 0x7a,0x35,0x56,0x7e,0x34,0xa, 0x18,0x7a,0x35,0x58,0x7e,0x34,0x0, 0x2, 0x7a, +0x35,0x5a,0x7e,0x34,0xa, 0x62,0x7a,0x35,0x5c,0x74,0x2, 0x22,0x0, 0x50,0x0, 0xa, +0x6, 0x4, 0x0, 0x78,0x0, 0xc, 0x6, 0x4, 0x0, 0xc8,0x0, 0x1e,0x8, 0x5, 0x1, 0x40, +0x0, 0x50,0x8, 0x5, 0x1, 0xf4,0x0, 0x64,0xa, 0x6, 0xe4,0x7a,0xb3,0x16,0xb1,0x7a, +0xb3,0x16,0xb0,0x7e,0xb3,0x10,0xa3,0x70,0x6, 0x7e,0x73,0x11,0x10,0x80,0x4, 0x7e, +0x73,0x11,0x12,0x7a,0x73,0x16,0xb2,0x22,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x2, 0x7a, +0xb3,0x10,0x7b,0x74,0x4, 0x7a,0xb3,0x10,0x7c,0x7e,0x34,0x16,0x55,0x7e,0x24,0x0, +0x48,0xe4,0x2, 0x6d,0xe0,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x75,0x92,0x7c,0xd2, +0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0x22, +0xe4,0x7a,0xb3,0xd, 0xfb,0x7e,0x34,0x11,0x9e,0x7a,0x37,0xf, 0xd6,0x12,0x40,0x32, +0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x2, 0x46,0xe9,0x75,0x75,0x1, 0x7e,0x24, +0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e,0x34, +0x0, 0x1, 0x2, 0x6e,0x27,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34,0xc9, +0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0xe5,0x51, +0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0x5a,0x80,0x4, 0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, +0x54,0x7a,0x37,0xf, 0x56,0x22,0xca,0xf8,0x12,0x6e,0x32,0x7c,0xfb,0x12,0x0, 0x6e, +0x50,0x7, 0x4c,0xff,0x78,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0xda,0xf8,0x22,0x7e,0x34, +0x0, 0x24,0x12,0x69,0x78,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, 0x57, +0x2e,0x54,0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0x7d,0x3, 0x80,0xa, +0x7e,0x29,0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d,0x55, +0x78,0xee,0x22,0x7e,0x53,0xf, 0x47,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x9d,0x32,0xbe, +0x34,0x0, 0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4,0x1, +0x3, 0x43,0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3,0x16, +0xa3,0xe4,0x7a,0xb3,0x16,0xaa,0x74,0xff,0x7a,0xb3,0x16,0xa2,0x22,0x75,0x76,0x1, +0xd2,0xee,0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x6e,0x27,0xa, +0x2b,0x19,0x72,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x44,0x1, 0x7a,0xb3,0x10,0xfe,0x22, +0x7d,0x13,0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31,0x22, +0x14,0x1, 0xa, 0x1, 0x0, 0x2, 0xfb,0x4, 0xf6,0x5, 0xec,0x6, 0xe7,0x7, 0xe2,0x8, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5,0x22, +0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x12, +0x0, 0x42,0x12,0x57,0x73,0x74,0x3, 0x12,0x43,0xae,0x2, 0x24,0xb4,0x7e,0x34,0x0, +0x21,0x12,0x69,0x78,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x7e,0xb3,0x11,0x15,0xb4, +0x1, 0x4, 0xe4,0x2, 0x6e,0x92,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32,0x38, +0xfa,0x22,0x12,0x62,0xb7,0xb4,0x1, 0x2, 0xe4,0x22,0x74,0x1, 0x22,0xd2,0xcf,0xa9, +0xd4,0xc9,0x75,0xcc,0x0, 0xc2,0xca,0x22,0xa9,0xc0,0x93,0x75,0x9, 0x0, 0x75,0xa, +0x0, 0x32,0x75,0x53,0x0, 0x75,0x54,0x0, 0x75,0x55,0x0, 0x22,0xa9,0x32,0x99,0x5, +0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x75,0xb, 0x0, 0x12,0x6e,0xc3,0x2, 0x5e,0x18,0x12, +0x6b,0x5b,0x12,0x6e,0xc9,0x2, 0x6e,0x66,0xe5,0x75,0x60,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xe5,0x76,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20, +0x40,0x80,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf, +0x22,0xf5,0x17,0x75,0x18,0x0, 0x22,0x12,0x61,0x79,0x2, 0x38,0x4a,0x12,0x4f,0xa8, +0x2, 0x62,0x1d,0x12,0x6e,0xd5,0x2, 0x6b,0xde,0x7e,0x34,0x1, 0x3, 0x22,0x7e,0x34, +0x5, 0xb, 0x22,0x2, 0x6c,0x75,0x2, 0x0, 0x76,0x2, 0x6c,0xc5,0x2, 0x6e,0x9a,0x2, +0x6e,0x5c,0xe5,0x6e,0x22,0x22,0x0, 0x1, 0x0, 0x8b,0x1, 0x0, 0x1, 0xa, 0xac,0x15, +0x0, 0x1, 0xa, 0xad,0x17,0x0, 0x1, 0xa, 0xae,0x4, 0x0, 0x1, 0xd, 0xfe,0x30,0x0, +0x5, 0xf, 0x29,0x20,0x17,0x29,0x38,0x13,0x0, 0x18,0xf, 0x2e,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x3, 0x0, 0x0, 0x0, 0x25,0xf, 0x63,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x18,0xf, +0x88,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xf, 0xa0,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xf, 0xad,0xc, 0xd, +0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0xb, +0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x0, 0xd, 0xf, 0xc5,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x0, 0x9, 0xa, 0xb, 0xc, 0x0, 0x25,0xf, 0xdc,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0xd, 0x10,0xff,0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, +0xa, 0x0, 0x1, 0x11,0xc, 0x0, 0x0, 0x1, 0x11,0x16,0x15,0x0, 0x32,0x11,0x17,0x0, +0x8, 0x0, 0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a,0x1, +0xbc,0x2, 0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, 0x7, +0xf9,0x8, 0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e,0xc, +0x83,0x0, 0x1, 0x11,0x49,0x17,0x0, 0x1, 0x11,0x94,0x2, 0x0, 0x1, 0x11,0x95,0x0, +0x0, 0x4, 0x11,0x97,0xff,0xff,0xff,0xff,0x0, 0x2, 0x11,0x9b,0xff,0x1f,0x0, 0x1, +0x11,0x9d,0x30,0x0, 0x1, 0x11,0xe8,0x0, 0x0, 0x4, 0x11,0xe9,0x23,0x23,0x23,0x23, +0x0, 0x1, 0x16,0x53,0x0, 0x0, 0x1, 0x15,0x53,0x0, 0x0, 0x1, 0x15,0x9e,0x0, 0x0, +0x1, 0x15,0x9f,0x0, 0x0, 0x1, 0x15,0xa0,0x0, 0x0, 0x1, 0x15,0xa1,0x0, 0x0, 0x1, +0x12,0x33,0x0, 0x0, 0x1, 0x16,0xac,0x0, 0x0, 0x1, 0x16,0xb4,0x0, 0x0, 0x1, 0x16, +0xb5,0x0, 0x0, 0x1, 0x16,0xb6,0x0, 0x0, 0x1, 0x16,0xb7,0x0, 0x0, 0x1, 0x16,0xb8, +0x0, 0x0, 0x1, 0x16,0xb9,0x0, 0x0, 0x1, 0x16,0xba,0x1, 0x0, 0x1, 0x16,0xbb,0x1, +0x0, 0xc, 0x0, 0xec,0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94, +0x0, 0x6, 0x0, 0xf8,0x0, 0xb4,0x2, 0x1c,0x3, 0x84,0x0, 0x1, 0x16,0x54,0x3, 0x0, +0x1, 0x16,0x9d,0x0, 0x0, 0x1, 0x0, 0xfe,0x0, 0x0, 0x1, 0x0, 0xff,0x0, 0x0, 0x1, +0x16,0xbc,0x0, 0x0, 0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x70,0xc5,0x8f,0x3a,0xa2, +0x5d,0x9, 0xf3, \ No newline at end of file diff --git a/drivers/input/touchscreen/gen_vkeys.c b/drivers/input/touchscreen/gen_vkeys.c index dde582f4f8bff..d26eb4d28a818 100644 --- a/drivers/input/touchscreen/gen_vkeys.c +++ b/drivers/input/touchscreen/gen_vkeys.c @@ -30,7 +30,7 @@ #define BORDER_ADJUST_NUM 3 #define BORDER_ADJUST_DENOM 4 -static struct kobject *vkey_obj; +struct kobject *vkey_obj; static char *vkey_buf; static ssize_t vkey_show(struct kobject *obj, diff --git a/drivers/input/touchscreen/gen_vkeys_gt.c b/drivers/input/touchscreen/gen_vkeys_gt.c new file mode 100644 index 0000000000000..539b5e50f8655 --- /dev/null +++ b/drivers/input/touchscreen/gen_vkeys_gt.c @@ -0,0 +1,229 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define MAX_BUF_SIZE 256 +#define VKEY_VER_CODE "0x01" + +#define HEIGHT_SCALE_NUM 8 +#define HEIGHT_SCALE_DENOM 10 + +#define VKEY_Y_OFFSET_DEFAULT 0 + +/* numerator and denomenator for border equations */ +#define BORDER_ADJUST_NUM 3 +#define BORDER_ADJUST_DENOM 4 + +extern struct kobject *vkey_obj; +static char *vkey_buf; + +static ssize_t vkey_show(struct kobject *obj, + struct kobj_attribute *attr, char *buf) +{ + strlcpy(buf, vkey_buf, MAX_BUF_SIZE); + return strnlen(buf, MAX_BUF_SIZE); +} + +static struct kobj_attribute vkey_obj_attr = { + .attr = { + .mode = S_IRUGO, + }, + .show = vkey_show, +}; + +static struct attribute *vkey_attr[] = { + &vkey_obj_attr.attr, + NULL, +}; + +static struct attribute_group vkey_grp = { + .attrs = vkey_attr, +}; + +static int vkey_parse_dt(struct device *dev, + struct vkeys_platform_data *pdata) +{ + struct device_node *np = dev->of_node; + struct property *prop; + int rc, val; + + rc = of_property_read_string(np, "label", &pdata->name); + if (rc) { + dev_err(dev, "Failed to read label\n"); + return -EINVAL; + } + + rc = of_property_read_u32(np, "qcom,disp-maxx", &pdata->disp_maxx); + if (rc) { + dev_err(dev, "Failed to read display max x\n"); + return -EINVAL; + } + + rc = of_property_read_u32(np, "qcom,disp-maxy", &pdata->disp_maxy); + if (rc) { + dev_err(dev, "Failed to read display max y\n"); + return -EINVAL; + } + + rc = of_property_read_u32(np, "qcom,panel-maxx", &pdata->panel_maxx); + if (rc) { + dev_err(dev, "Failed to read panel max x\n"); + return -EINVAL; + } + + rc = of_property_read_u32(np, "qcom,panel-maxy", &pdata->panel_maxy); + if (rc) { + dev_err(dev, "Failed to read panel max y\n"); + return -EINVAL; + } + + prop = of_find_property(np, "qcom,key-codes", NULL); + if (prop) { + pdata->num_keys = prop->length / sizeof(u32); + pdata->keycodes = devm_kzalloc(dev, + sizeof(u32) * pdata->num_keys, GFP_KERNEL); + if (!pdata->keycodes) + return -ENOMEM; + rc = of_property_read_u32_array(np, "qcom,key-codes", + pdata->keycodes, pdata->num_keys); + if (rc) { + dev_err(dev, "Failed to read key codes\n"); + return -EINVAL; + } + } + + pdata->y_offset = VKEY_Y_OFFSET_DEFAULT; + rc = of_property_read_u32(np, "qcom,y-offset", &val); + if (!rc) + pdata->y_offset = val; + else if (rc != -EINVAL) { + dev_err(dev, "Failed to read y position offset\n"); + return rc; + } + return 0; +} + +static int vkeys_probe(struct platform_device *pdev) +{ + struct vkeys_platform_data *pdata; + int width, height, center_x, center_y; + int x1 = 0, x2 = 0, i, c = 0, ret, border; + char *name; + + vkey_buf = devm_kzalloc(&pdev->dev, MAX_BUF_SIZE, GFP_KERNEL); + if (!vkey_buf) { + dev_err(&pdev->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + if (pdev->dev.of_node) { + pdata = devm_kzalloc(&pdev->dev, + sizeof(struct vkeys_platform_data), GFP_KERNEL); + if (!pdata) { + dev_err(&pdev->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + ret = vkey_parse_dt(&pdev->dev, pdata); + if (ret) { + dev_err(&pdev->dev, "Parsing DT failed(%d)", ret); + return ret; + } + } else + pdata = pdev->dev.platform_data; + + if (!pdata || !pdata->name || !pdata->keycodes || !pdata->num_keys || + !pdata->disp_maxx || !pdata->disp_maxy || !pdata->panel_maxy) { + dev_err(&pdev->dev, "pdata is invalid\n"); + return -EINVAL; + } + + border = (pdata->panel_maxx - pdata->disp_maxx) * 2; + width = ((pdata->disp_maxx - (border * (pdata->num_keys - 1))) + / pdata->num_keys); + height = (pdata->panel_maxy - pdata->disp_maxy); + center_y = pdata->disp_maxy + (height / 2) + pdata->y_offset; + height = height * HEIGHT_SCALE_NUM / HEIGHT_SCALE_DENOM; + + x2 -= border * BORDER_ADJUST_NUM / BORDER_ADJUST_DENOM; + + for (i = 0; i < pdata->num_keys; i++) { + x1 = x2 + border; + x2 = x2 + border + width; + center_x = x1 + (x2 - x1) / 2; + c += snprintf(vkey_buf + c, MAX_BUF_SIZE - c, + "%s:%d:%d:%d:%d:%d\n", + VKEY_VER_CODE, pdata->keycodes[i], + center_x, center_y, width, height); + } + + vkey_buf[c] = '\0'; + + name = devm_kzalloc(&pdev->dev, sizeof(*name) * MAX_BUF_SIZE, + GFP_KERNEL); + if (!name) + return -ENOMEM; + + snprintf(name, MAX_BUF_SIZE, + "virtualkeys.%s", pdata->name); + vkey_obj_attr.attr.name = name; + + + if (!vkey_obj) { + vkey_obj = kobject_create_and_add("board_properties", NULL); + } + + ret = sysfs_create_group(vkey_obj, &vkey_grp); + if (ret) { + dev_err(&pdev->dev, "failed to create attributes\n"); + goto destroy_kobj; + } + return 0; + +destroy_kobj: + kobject_put(vkey_obj); + + return ret; +} + +static int vkeys_remove(struct platform_device *pdev) +{ + sysfs_remove_group(vkey_obj, &vkey_grp); + kobject_put(vkey_obj); + + return 0; +} + +static struct of_device_id vkey_match_table[] = { + { .compatible = "qcom,gen-vkeys_gt",}, + { }, +}; + +static struct platform_driver vkeys_driver = { + .probe = vkeys_probe, + .remove = vkeys_remove, + .driver = { + .owner = THIS_MODULE, + .name = "gen_vkeys_gt", + .of_match_table = vkey_match_table, + }, +}; + +module_platform_driver(vkeys_driver); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_rmi_dev.c b/drivers/input/touchscreen/synaptics_rmi_dev.c index 1b69d53b9bddf..d83912664865e 100644 --- a/drivers/input/touchscreen/synaptics_rmi_dev.c +++ b/drivers/input/touchscreen/synaptics_rmi_dev.c @@ -73,19 +73,19 @@ struct rmidev_data { }; static struct device_attribute attrs[] = { - __ATTR(open, S_IWUSR | S_IWGRP, + __ATTR(open, S_IWUSR, NULL, rmidev_sysfs_open_store), - __ATTR(release, S_IWUSR | S_IWGRP, + __ATTR(release, S_IWUSR, NULL, rmidev_sysfs_release_store), - __ATTR(address, S_IWUSR | S_IWGRP, + __ATTR(address, S_IWUSR, NULL, rmidev_sysfs_address_store), - __ATTR(length, S_IWUSR | S_IWGRP, + __ATTR(length, S_IWUSR, NULL, rmidev_sysfs_length_store), - __ATTR(data, (S_IWUSR | S_IWGRP), + __ATTR(data, S_IWUSR, rmidev_sysfs_data_show, rmidev_sysfs_data_store), }; diff --git a/drivers/irqchip/msm_show_resume_irq.c b/drivers/irqchip/msm_show_resume_irq.c index 4a796207738fd..bdb76fd910e5c 100644 --- a/drivers/irqchip/msm_show_resume_irq.c +++ b/drivers/irqchip/msm_show_resume_irq.c @@ -15,7 +15,7 @@ #include #include -int msm_show_resume_irq_mask; +int msm_show_resume_irq_mask = 1; module_param_named( debug_mask, msm_show_resume_irq_mask, int, S_IRUGO | S_IWUSR | S_IWGRP diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 7e3e74ce82e34..1018fbcbbdccf 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -542,7 +542,23 @@ config LEDS_AW2013 This option enables support for the AW2013 RGB LED connected through I2C. Say Y to enable support for the AW2013 LED. +config DIFFERENT_TP_COLOR + tristate "TP support for different color" + help + This option enables support for different color. + +config COLOFUL_RGB_FOR_PROJECT + tristate "different colorful rgb_control for project" + help + This option enables colorful rgb_control for project. + comment "LED Triggers" source "drivers/leds/trigger/Kconfig" endif # NEW_LEDS + +config VIB_GPIO + tristate "LED support for LM3533" + help + This option enables support for the LEDs on National Semiconductor / + TI LM3533 Lighting Power chips diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index c5178d9dbf19c..93ec56b84b6a8 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -60,9 +60,7 @@ obj-$(CONFIG_LEDS_SYSCON) += leds-syscon.o obj-$(CONFIG_LEDS_VERSATILE) += leds-versatile.o obj-$(CONFIG_LEDS_MENF21BMC) += leds-menf21bmc.o obj-$(CONFIG_LEDS_AW2013) += leds-aw2013.o - -# LED SPI Drivers +obj-$(CONFIG_VIB_GPIO) += gpio_vib.o obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o - -# LED Triggers +obj-y +=leds-msm-gpio-flash.o obj-$(CONFIG_LEDS_TRIGGERS) += trigger/ diff --git a/drivers/leds/gpio_vib.c b/drivers/leds/gpio_vib.c new file mode 100644 index 0000000000000..293d130d3c10d --- /dev/null +++ b/drivers/leds/gpio_vib.c @@ -0,0 +1,224 @@ +/* drivers/misc/timed_gpio.c + * + * Copyright (C) 2008 Google, Inc. + * Author: Mike Lockwood + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include "../staging/android/timed_output.h" +#include "../staging/android/timed_gpio.h" +#include +#include +#define GPIO_VIB_NAME "gpio-vibrator" + +struct timed_gpio_data { + struct timed_output_dev dev; + struct hrtimer timer; + spinlock_t lock; + unsigned gpio; + int max_timeout; + u8 active_low; +}; +struct gpio_vib { + const char *name; + unsigned gpio; + int max_timeout; + unsigned active_low:1; +}; +static void delete_gpio_vib(struct timed_gpio_data *vib) +{ + if (!gpio_is_valid(vib->gpio)) + return; + timed_output_dev_unregister(&vib->dev); + gpio_free(vib->gpio); +} +static enum hrtimer_restart gpio_timer_func(struct hrtimer *timer) +{ + struct timed_gpio_data *data = + container_of(timer, struct timed_gpio_data, timer); + + gpio_direction_output(data->gpio, data->active_low ? 1 : 0); + return HRTIMER_NORESTART; +} + +static int gpio_get_time(struct timed_output_dev *dev) +{ + struct timed_gpio_data *data; + struct timeval t; + + data = container_of(dev, struct timed_gpio_data, dev); + + if (!hrtimer_active(&data->timer)) + return 0; + + t = ktime_to_timeval(hrtimer_get_remaining(&data->timer)); + + return t.tv_sec * 1000 + t.tv_usec / 1000; +} + +static void gpio_enable(struct timed_output_dev *dev, int value) +{ + struct timed_gpio_data *data = + container_of(dev, struct timed_gpio_data, dev); + unsigned long flags; + + spin_lock_irqsave(&data->lock, flags); + + /* cancel previous timer and set GPIO according to value */ + hrtimer_cancel(&data->timer); + gpio_direction_output(data->gpio, data->active_low ? !value : !!value); + + if (value > 0) { + if (value > data->max_timeout) + value = data->max_timeout; + printk("max_timeout is %d\n", data->max_timeout); + hrtimer_start(&data->timer, + ktime_set(value / 1000, (value % 1000) * 1000000), + HRTIMER_MODE_REL); + } + + spin_unlock_irqrestore(&data->lock, flags); +} +static int create_gpio_vib(const struct gpio_vib *template, + struct timed_gpio_data *gpio_dat, struct device *parent) +{ + int ret; + gpio_dat->gpio = template->gpio; + hrtimer_init(&gpio_dat->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + gpio_dat->timer.function = gpio_timer_func; + spin_lock_init(&gpio_dat->lock); + gpio_dat->dev.name = template->name; + gpio_dat->dev.get_time = gpio_get_time; + gpio_dat->dev.enable = gpio_enable; + ret = gpio_request(gpio_dat->gpio, gpio_dat->dev.name); + if (ret < 0) + return 0; + ret = timed_output_dev_register(&gpio_dat->dev); + if (ret < 0) { + gpio_free(gpio_dat->gpio); + return 0; + } + gpio_dat->max_timeout = template->max_timeout; + gpio_dat->active_low = template->active_low; + gpio_direction_output(gpio_dat->gpio, gpio_dat->active_low); + return 0; +} +struct gpio_vibs_priv { + int num_vibs; + struct timed_gpio_data vibs[]; +}; + +static inline int sizeof_gpio_vibs_priv(int num_vibs) +{ + return sizeof(struct gpio_vibs_priv) + + (sizeof(struct timed_gpio_data) * num_vibs); +} + +#define DEFAULT_TIME_MAX_MS 50000 +static struct gpio_vibs_priv *gpio_vibs_create_of(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node, *child; + int count, ret; + unsigned timerv; + struct gpio_vibs_priv *priv; + count = of_get_child_count(np); + if (!count) + return ERR_PTR(-ENODEV); + + for_each_child_of_node(np, child) + if (of_get_gpio(child, 0) == -EPROBE_DEFER) + return ERR_PTR(-EPROBE_DEFER); + + priv = devm_kzalloc(&pdev->dev, sizeof_gpio_vibs_priv(count), + GFP_KERNEL); + if (!priv) + return ERR_PTR(-ENOMEM); + + for_each_child_of_node(np, child) { + struct gpio_vib vib = {}; + enum of_gpio_flags flags; + vib.gpio = of_get_gpio_flags(child, 0, &flags); + vib.active_low = flags & OF_GPIO_ACTIVE_LOW; + vib.name = of_get_property(child, "label", NULL) ? : child->name; + ret = of_property_read_u32(child, "max_timeout", &timerv); + if (!ret) { + vib.max_timeout = timerv; + printk("wingtech vib.max_timeout = %d\n", vib.max_timeout); + } else{ + vib.max_timeout = DEFAULT_TIME_MAX_MS; + printk("wingtech vib.max_timeout used default = %d, ret=%d\n", vib.max_timeout, ret); + } + + ret = create_gpio_vib(&vib, &priv->vibs[priv->num_vibs++], + &pdev->dev); + if (ret < 0) { + of_node_put(child); + goto err; + } + } + return priv; + err: + for (count = priv->num_vibs - 2; count >= 0; count--) + delete_gpio_vib(&priv->vibs[count]); + return ERR_PTR(-ENODEV); +} + +static int timed_gpio_probe(struct platform_device *pdev) +{ + struct gpio_vibs_priv *priv; + priv = gpio_vibs_create_of(pdev); + if (IS_ERR(priv)) + return PTR_ERR(priv); + platform_set_drvdata(pdev, priv); + return 0; +} + +static int timed_gpio_remove(struct platform_device *pdev) +{ + struct timed_gpio_platform_data *pdata = pdev->dev.platform_data; + struct timed_gpio_data *gpio_data = platform_get_drvdata(pdev); + int i; + + for (i = 0; i < pdata->num_gpios; i++) { + timed_output_dev_unregister(&gpio_data[i].dev); + gpio_free(gpio_data[i].gpio); + } + + return 0; +} +static struct of_device_id vib_match_table[] = { + { .compatible = "gpio-vibrator", + }, + {} +}; +static struct platform_driver timed_gpio_driver = { + .probe = timed_gpio_probe, + .remove = timed_gpio_remove, + .driver = { + .name = GPIO_VIB_NAME, + .owner = THIS_MODULE, + .of_match_table = vib_match_table, + }, +}; + +module_platform_driver(timed_gpio_driver); + +MODULE_AUTHOR("Mike Lockwood "); +MODULE_DESCRIPTION("timed gpio driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c index e8b1120f486d6..b32cb63dc5c34 100644 --- a/drivers/leds/led-triggers.c +++ b/drivers/leds/led-triggers.c @@ -2,6 +2,7 @@ * LED Triggers Core * * Copyright 2005-2007 Openedhand Ltd. + * Copyright (C) 2018 XiaoMi, Inc. * * Author: Richard Purdie * @@ -305,6 +306,23 @@ void led_trigger_blink_oneshot(struct led_trigger *trig, } EXPORT_SYMBOL_GPL(led_trigger_blink_oneshot); +struct led_trigger *led_trigger_get(const char *name) +{ + struct led_trigger *_trig; + + down_write(&triggers_list_lock); + /* Make sure the trigger's name isn't already in use */ + list_for_each_entry(_trig, &trigger_list, next_trig) { + if (!strcmp(_trig->name, name)) { + up_write(&triggers_list_lock); + return _trig; + } + } + up_write(&triggers_list_lock); + return NULL; +} + + void led_trigger_register_simple(const char *name, struct led_trigger **tp) { struct led_trigger *trig; @@ -325,6 +343,9 @@ void led_trigger_register_simple(const char *name, struct led_trigger **tp) pr_warn("LED trigger %s failed to register (no memory)\n", name); } + if (!strcmp("switch_trigger", name) && trig == NULL) { + trig = led_trigger_get(name); + } *tp = trig; } EXPORT_SYMBOL_GPL(led_trigger_register_simple); diff --git a/drivers/leds/leds-aw2013.c b/drivers/leds/leds-aw2013.c index d0a39fab2821c..e30d8c983c5d8 100644 --- a/drivers/leds/leds-aw2013.c +++ b/drivers/leds/leds-aw2013.c @@ -1,656 +1,756 @@ -/* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include #include -#include -#include +#include +#include #include -#include #include +#include #include -#include - -/* register address */ -#define AW_REG_RESET 0x00 -#define AW_REG_GLOBAL_CONTROL 0x01 -#define AW_REG_LED_STATUS 0x02 -#define AW_REG_LED_ENABLE 0x30 -#define AW_REG_LED_CONFIG_BASE 0x31 -#define AW_REG_LED_BRIGHTNESS_BASE 0x34 -#define AW_REG_TIMESET0_BASE 0x37 -#define AW_REG_TIMESET1_BASE 0x38 - -/* register bits */ -#define AW2013_CHIPID 0x33 -#define AW_LED_MOUDLE_ENABLE_MASK 0x01 -#define AW_LED_FADE_OFF_MASK 0x40 -#define AW_LED_FADE_ON_MASK 0x20 -#define AW_LED_BREATHE_MODE_MASK 0x10 -#define AW_LED_RESET_MASK 0x55 - -#define AW_LED_RESET_DELAY 8 -#define AW2013_VDD_MIN_UV 2600000 -#define AW2013_VDD_MAX_UV 3300000 -#define AW2013_VI2C_MIN_UV 1800000 -#define AW2013_VI2C_MAX_UV 1800000 - -#define MAX_RISE_TIME_MS 7 -#define MAX_HOLD_TIME_MS 5 -#define MAX_FALL_TIME_MS 7 -#define MAX_OFF_TIME_MS 5 - -struct aw2013_led { - struct i2c_client *client; +#include +#include +#include + +#include + +enum led_colors{ + LED_RED = 0, + LED_GREEN, + LED_BLUE, + LED_WHITE, + LED_YELLOW, + LED_CYAN, + LED_PURPLE, + LED_COLORS_MAX +}; + +struct rgb_info{ +int blinking; +int brightness; +int on_time; +int off_time; +}; + +struct aw2013_led_data { struct led_classdev cdev; - struct aw2013_platform_data *pdata; - struct work_struct brightness_work; - struct mutex lock; - struct regulator *vdd; - struct regulator *vcc; + enum led_colors color; +}; + + +struct aw2013_leds_priv { int num_leds; - int id; - bool poweron; + struct aw2013_led_data leds[]; }; -static int aw2013_write(struct aw2013_led *led, u8 reg, u8 val) +struct aw2013_dev_data { + struct i2c_client *i2c; + struct regulator *regulator; + struct aw2013_leds_priv *leds_priv; + struct rgb_info leds[LED_COLORS_MAX]; + enum led_colors current_color; + struct mutex led_lock; + struct work_struct set_color_work; +}; + + +struct aw2013_led{ + const char *name; + const char *default_trigger; + unsigned retain_state_suspended:1; + unsigned default_state:2; + +}; + +static inline int sizeof_aw2013_leds_priv(int num_leds) { - return i2c_smbus_write_byte_data(led->client, reg, val); + return sizeof(struct aw2013_leds_priv) + + (sizeof(struct aw2013_led_data) * num_leds); } -static int aw2013_read(struct aw2013_led *led, u8 reg, u8 *val) + + +static struct aw2013_dev_data *s_aw2013; +bool blink_frequency_adjust; + +#define AW2013_I2C_NAME "aw2013" +#if 1 + +#define AW2013_RSTR 0x0 +#define AW2013_GCR 0x01 +#define AW2013_STATUS 0x02 +#define AW2013_LEDE 0x30 +#define AW2013_LCFG0 0x31 +#define AW2013_LCFG1 0x32 +#define AW2013_LCFG2 0x33 +#define AW2013_PWM0 0x34 +#define AW2013_PWM1 0x35 +#define AW2013_PWM2 0x36 +#define AW2013_LED0_T0 0x37 +#define AW2013_LED0_T1 0x38 +#define AW2013_LED0_T2 0x39 +#define AW2013_LED1_T0 0x3A +#define AW2013_LED1_T1 0x3B +#define AW2013_LED1_T2 0x3C +#define AW2013_LED2_T0 0x3D +#define AW2013_LED2_T1 0x3E +#define AW2013_LED2_T2 0x3F +#define AW2013_ASR 0x77 + +#define Bre_Imax 0x72 +#define Rise_t 0x02 +#define Fall_t 0x02 +#define Hold_time 0x03 +#define Off_time 0x03 +#define Delay_time 0x00 +#define Period_Num 0x00 +#define Imax_R 0x62 +#define Imax_G 0x62 +#define Imax_B 0x62 + +#define MAX_BRIGHTNESS_RED 255 +#define MAX_BRIGHTNESS_GREEN 255 +#define MAX_BRIGHTNESS_BLUE 255 +u8 tp_color; + + +#if defined(CONFIG_DIFFERENT_TP_COLOR) + extern u8 tp_rgb_color; +#else + static u8 tp_rgb_color; +#endif + + +typedef unsigned char U8; +static int aw2013_debug_enable; +#define AW2013_DEBUG(format, args...) do { \ + if (aw2013_debug_enable) \ + {\ + printk(format, ##args);\ + } \ +} while (0) +struct i2c_client *aw2013_client; +static int aw2013_pdata; +struct i2c_board_info aw2013_info = { + .type = "aw2013", + .addr = 0x45, + .platform_data = &aw2013_pdata, + }; + + +static int aw2013_has_inited; + + + +#endif + +static int aw2013_i2c_write(unsigned char cmd, unsigned char data) { - s32 ret; + int ret; + ret = i2c_smbus_write_byte_data(s_aw2013->i2c, cmd, data); - ret = i2c_smbus_read_byte_data(led->client, reg); - if (ret < 0) - return ret; + return ret; +} - *val = ret; - return 0; +enum led_colors devname_to_color(const char *dev_name) +{ + if (!strcmp(dev_name, "red")) { + return LED_RED; + } else if (!strcmp(dev_name, "green")) { + return LED_GREEN; + } else if (!strcmp(dev_name, "blue")) { + return LED_BLUE; + } else if (!strcmp(dev_name, "white")) { + return LED_WHITE; + } else if (!strcmp(dev_name, "yellow")) { + return LED_YELLOW; + } else if (!strcmp(dev_name, "cyan")) { + return LED_CYAN; + } else if (!strcmp(dev_name, "purple")) { + return LED_PURPLE; + } + + return LED_COLORS_MAX; } -static int aw2013_power_on(struct aw2013_led *led, bool on) +int aw2013_set_color_singlecolor(struct aw2013_dev_data *aw2013, enum led_colors color) { - int rc; - - if (on) { - rc = regulator_enable(led->vdd); - if (rc) { - dev_err(&led->client->dev, - "Regulator vdd enable failed rc=%d\n", rc); - return rc; + unsigned char red_on = 0, green_on = 0, blue_on = 0; + unsigned char blink_flag = 0; + + switch (color) { + case LED_RED: + red_on = 1; + aw2013->leds[LED_GREEN].brightness = 0; + aw2013->leds[LED_BLUE].brightness = 0; + if (aw2013->leds[LED_RED].brightness == 0) { + red_on = 0; + } + if (aw2013->leds[LED_RED].blinking) { + blink_flag = 0x10; + aw2013_i2c_write(0x0, 0x54); + } else + blink_flag = 0x0; + break; + case LED_GREEN: + green_on = 1; + aw2013->leds[LED_RED].brightness = 0; + aw2013->leds[LED_BLUE].brightness = 0; + if (aw2013->leds[LED_GREEN].brightness == 0) { + green_on = 0; + } + if (aw2013->leds[LED_GREEN].blinking) { + blink_flag = 0x10; + aw2013_i2c_write(0x0, 0x54); + } else + blink_flag = 0x0; + break; + case LED_BLUE: + blue_on = 1; + aw2013->leds[LED_RED].brightness = 0; + aw2013->leds[LED_GREEN].brightness = 0; + if (aw2013->leds[LED_BLUE].brightness == 0) { + blue_on = 0; + } + if (aw2013->leds[LED_BLUE].blinking) { + blink_flag = 0x10; + aw2013_i2c_write(0x0, 0x54); + } else + blink_flag = 0x0; + break; + default: + goto rgb_exit; + } + if (red_on || green_on || blue_on) { + if (0 == aw2013_has_inited) { + aw2013_i2c_write(0x0, 0x55); + aw2013_i2c_write(0x01, 0x1); + mdelay(1); + aw2013_has_inited = 1; } - rc = regulator_enable(led->vcc); - if (rc) { - dev_err(&led->client->dev, - "Regulator vcc enable failed rc=%d\n", rc); - goto fail_enable_reg; + aw2013_i2c_write(0x01, 0xe1); +#if defined(CONFIG_COLOFUL_RGB_FOR_PROJECT) + switch (tp_rgb_color) { + case 0x32: + aw2013_i2c_write(0x31, blink_flag|0x62); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, aw2013->leds[LED_RED].brightness); + aw2013_i2c_write(0x35, aw2013->leds[LED_GREEN].brightness); + aw2013_i2c_write(0x36, aw2013->leds[LED_BLUE].brightness); + break; + default: + aw2013_i2c_write(0x31, blink_flag|0x61); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, aw2013->leds[LED_RED].brightness); + aw2013_i2c_write(0x35, aw2013->leds[LED_GREEN].brightness); + aw2013_i2c_write(0x36, aw2013->leds[LED_BLUE].brightness); + break; } - led->poweron = true; - } else { - rc = regulator_disable(led->vdd); - if (rc) { - dev_err(&led->client->dev, - "Regulator vdd disable failed rc=%d\n", rc); - return rc; +#else + switch (tp_rgb_color) { + case 0x32: + aw2013_i2c_write(0x31, blink_flag|0x62); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + break; + default: + aw2013_i2c_write(0x31, blink_flag|0x61); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + break; } +#endif + + if (blink_frequency_adjust) { + aw2013_i2c_write(0x37, Rise_t<<4 | blink_flag); + aw2013_i2c_write(0x38, Fall_t<<4 | blink_flag); + aw2013_i2c_write(0x39, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3a, Rise_t<<4 | blink_flag); + aw2013_i2c_write(0x3b, Fall_t<<4 | blink_flag); + aw2013_i2c_write(0x3c, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3d, Rise_t<<4 | blink_flag); + aw2013_i2c_write(0x3e, Fall_t<<4 | blink_flag); + aw2013_i2c_write(0x3f, Delay_time<<4 | Period_Num); + } else { + aw2013_i2c_write(0x37, Rise_t<<4 | Hold_time); + aw2013_i2c_write(0x38, Fall_t<<4 | Off_time); + aw2013_i2c_write(0x39, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3a, Rise_t<<4 | Hold_time); + aw2013_i2c_write(0x3b, Fall_t<<4 | Off_time); + aw2013_i2c_write(0x3c, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3d, Rise_t<<4 | Hold_time); + aw2013_i2c_write(0x3e, Fall_t<<4 | Off_time); + aw2013_i2c_write(0x3f, Delay_time<<4 | Period_Num); + } + aw2013_i2c_write(0x30, 0x7); + mdelay(1); + } else{ + aw2013_i2c_write(0x01, 0); + mdelay(1); + aw2013_i2c_write(0x30, 0); + aw2013_i2c_write(0x34, 0); + aw2013_i2c_write(0x35, 0); + aw2013_i2c_write(0x36, 0); + mdelay(1); + aw2013_has_inited = 0; + } +rgb_exit: + return 0; - rc = regulator_disable(led->vcc); - if (rc) { - dev_err(&led->client->dev, - "Regulator vcc disable failed rc=%d\n", rc); - goto fail_disable_reg; +} + + +int aw2013_set_color_multicolor(struct aw2013_dev_data *aw2013, enum led_colors color) +{ + unsigned char blink_flag = 0; + + if (aw2013->leds[color].brightness) { + if (aw2013->leds[color].blinking) + blink_flag = 0x10; + aw2013_i2c_write(0x01, 0); + aw2013_i2c_write(0x0, 0x55); + mdelay(1); + if (0 == aw2013_has_inited) { + aw2013_has_inited = 1; } - led->poweron = false; + aw2013_i2c_write(0x01, 0x1); +#if defined(CONFIG_COLOFUL_RGB_FOR_PROJECT) + switch (color) { + case LED_WHITE: + aw2013_i2c_write(0x0, 0x54); + aw2013_i2c_write(0x01, 0xe1); + if (0x32 == tp_rgb_color) + aw2013_i2c_write(0x31, blink_flag|0x62); + else + aw2013_i2c_write(0x31, blink_flag|0x61); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + aw2013_i2c_write(0x30, 0x7); + break; + case LED_YELLOW: + + aw2013_i2c_write(0x0, 0x54); + aw2013_i2c_write(0x01, 0xe1); + aw2013_i2c_write(0x31, blink_flag|0x62); + aw2013_i2c_write(0x32, blink_flag|0x62); + aw2013_i2c_write(0x33, 0); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, 0); + aw2013_i2c_write(0x30, 0x3); + break; + case LED_PURPLE: + + aw2013_i2c_write(0x0, 0x54); + aw2013_i2c_write(0x01, 0xe1); + aw2013_i2c_write(0x31, blink_flag|0x62); + aw2013_i2c_write(0x32, 0); + aw2013_i2c_write(0x33, blink_flag|0x62); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, 0); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + aw2013_i2c_write(0x30, 0x5); + + break; + case LED_CYAN: + + aw2013_i2c_write(0x0, 0x54); + aw2013_i2c_write(0x01, 0xe1); + aw2013_i2c_write(0x31, 0); + aw2013_i2c_write(0x32, blink_flag|0x62); + aw2013_i2c_write(0x33, blink_flag|0x62); + aw2013_i2c_write(0x34, 0); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + aw2013_i2c_write(0x30, 0x6); + + break; + default: + break; + } +#else + switch (tp_rgb_color) { + case 0x32: + aw2013_i2c_write(0x31, blink_flag|0x62); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + break; + default: + aw2013_i2c_write(0x31, blink_flag|0x61); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + break; + } + aw2013_i2c_write(0x30, 0x7); +#endif + aw2013_i2c_write(0x37, Rise_t<<4 | Hold_time); + aw2013_i2c_write(0x3a, Rise_t<<4 | Hold_time); + aw2013_i2c_write(0x3d, Rise_t<<4 | Hold_time); + + aw2013_i2c_write(0x38, Fall_t<<4 | Off_time); + aw2013_i2c_write(0x3b, Fall_t<<4 | Off_time); + aw2013_i2c_write(0x3e, Fall_t<<4 | Off_time); + + aw2013_i2c_write(0x39, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3c, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3f, Delay_time<<4 | Period_Num); + } else { + aw2013_i2c_write(0x01, 0); + mdelay(1); + aw2013_i2c_write(0x30, 0); + aw2013_i2c_write(0x34, 0); + aw2013_i2c_write(0x35, 0); + aw2013_i2c_write(0x36, 0); + mdelay(1); + aw2013_has_inited = 0; } - return rc; + return 0; +} -fail_enable_reg: - rc = regulator_disable(led->vdd); - if (rc) - dev_err(&led->client->dev, - "Regulator vdd disable failed rc=%d\n", rc); - return rc; +static void set_color_delayed(struct work_struct *ws) +{ + enum led_colors color; + struct aw2013_dev_data *aw2013 = + container_of(ws, struct aw2013_dev_data, set_color_work); -fail_disable_reg: - rc = regulator_enable(led->vdd); - if (rc) - dev_err(&led->client->dev, - "Regulator vdd enable failed rc=%d\n", rc); + mutex_lock(&s_aw2013->led_lock); + color = aw2013->current_color; + AW2013_DEBUG("aw2013 set_color_delayed color = %d, brightness = %d, blink = %d \n", color, aw2013->leds[color].brightness, aw2013->leds[color].blinking); - return rc; + if (color == LED_RED || color == LED_GREEN || color == LED_BLUE) { + aw2013_set_color_singlecolor(aw2013, color); + } else { + aw2013_set_color_multicolor(aw2013, color); + } + mutex_unlock(&s_aw2013->led_lock); } -static int aw2013_power_init(struct aw2013_led *led, bool on) + + +int aw2013_set_color(struct aw2013_dev_data *aw2013, enum led_colors color) { - int rc; - - if (on) { - led->vdd = regulator_get(&led->client->dev, "vdd"); - if (IS_ERR(led->vdd)) { - rc = PTR_ERR(led->vdd); - dev_err(&led->client->dev, - "Regulator get failed vdd rc=%d\n", rc); - return rc; - } - if (regulator_count_voltages(led->vdd) > 0) { - rc = regulator_set_voltage(led->vdd, AW2013_VDD_MIN_UV, - AW2013_VDD_MAX_UV); - if (rc) { - dev_err(&led->client->dev, - "Regulator set_vtg failed vdd rc=%d\n", - rc); - goto reg_vdd_put; - } - } + aw2013->current_color = color; + schedule_work(&s_aw2013->set_color_work); - led->vcc = regulator_get(&led->client->dev, "vcc"); - if (IS_ERR(led->vcc)) { - rc = PTR_ERR(led->vcc); - dev_err(&led->client->dev, - "Regulator get failed vcc rc=%d\n", rc); - goto reg_vdd_set_vtg; - } + return 0; - if (regulator_count_voltages(led->vcc) > 0) { - rc = regulator_set_voltage(led->vcc, AW2013_VI2C_MIN_UV, - AW2013_VI2C_MAX_UV); - if (rc) { - dev_err(&led->client->dev, - "Regulator set_vtg failed vcc rc=%d\n", rc); - goto reg_vcc_put; - } - } - } else { - if (regulator_count_voltages(led->vdd) > 0) - regulator_set_voltage(led->vdd, 0, AW2013_VDD_MAX_UV); +} - regulator_put(led->vdd); +static void aw2013_led_set(struct led_classdev *led_cdev, + enum led_brightness value) +{ + enum led_colors color; + color = devname_to_color(led_cdev->name); + s_aw2013->leds[color].brightness = value; + s_aw2013->leds[color].blinking = 0; + aw2013_set_color(s_aw2013, color); +} - if (regulator_count_voltages(led->vcc) > 0) - regulator_set_voltage(led->vcc, 0, AW2013_VI2C_MAX_UV); +static int aw2013_led_blink_set(struct led_classdev *led_cdev, + unsigned long *delay_on, unsigned long *delay_off) +{ + enum led_colors color; - regulator_put(led->vcc); - } - return 0; + color = devname_to_color(led_cdev->name); + s_aw2013->leds[color].blinking = 1; + s_aw2013->leds[color].brightness = 255; + s_aw2013->leds[color].on_time = *delay_on; + s_aw2013->leds[color].off_time = *delay_off; -reg_vcc_put: - regulator_put(led->vcc); -reg_vdd_set_vtg: - if (regulator_count_voltages(led->vdd) > 0) - regulator_set_voltage(led->vdd, 0, AW2013_VDD_MAX_UV); -reg_vdd_put: - regulator_put(led->vdd); - return rc; + led_cdev->brightness = s_aw2013->leds[color].brightness; + aw2013_set_color(s_aw2013, color); + + return 0; } -static void aw2013_brightness_work(struct work_struct *work) + +static int aw2013_i2c_check_device( + struct i2c_client *client) { - struct aw2013_led *led = container_of(work, struct aw2013_led, - brightness_work); - u8 val; - - mutex_lock(&led->pdata->led->lock); - - /* enable regulators if they are disabled */ - if (!led->pdata->led->poweron) { - if (aw2013_power_on(led->pdata->led, true)) { - dev_err(&led->pdata->led->client->dev, "power on failed"); - mutex_unlock(&led->pdata->led->lock); - return; - } + int err; + int retreive_count = 0; + while (retreive_count++ < 5) { + msleep(10); + err = aw2013_i2c_write(AW2013_RSTR, 0x55); + if (err == 0) + break; } - if (led->cdev.brightness > 0) { - if (led->cdev.brightness > led->cdev.max_brightness) - led->cdev.brightness = led->cdev.max_brightness; - aw2013_write(led, AW_REG_GLOBAL_CONTROL, - AW_LED_MOUDLE_ENABLE_MASK); - aw2013_write(led, AW_REG_LED_CONFIG_BASE + led->id, - led->pdata->max_current); - aw2013_write(led, AW_REG_LED_BRIGHTNESS_BASE + led->id, - led->cdev.brightness); - aw2013_read(led, AW_REG_LED_ENABLE, &val); - aw2013_write(led, AW_REG_LED_ENABLE, val | (1 << led->id)); - } else { - aw2013_read(led, AW_REG_LED_ENABLE, &val); - aw2013_write(led, AW_REG_LED_ENABLE, val & (~(1 << led->id))); - } - aw2013_read(led, AW_REG_LED_ENABLE, &val); - /* - * If value in AW_REG_LED_ENABLE is 0, it means the RGB leds are - * all off. So we need to power it off. - */ - if (val == 0) { - if (aw2013_power_on(led->pdata->led, false)) { - dev_err(&led->pdata->led->client->dev, - "power off failed"); - mutex_unlock(&led->pdata->led->lock); - return; - } - } - mutex_unlock(&led->pdata->led->lock); + return err; } -static void aw2013_led_blink_set(struct aw2013_led *led, unsigned long blinking) +static int aw2013_power_up(struct aw2013_dev_data *pdata, struct i2c_client *client, bool enable) { - u8 val; - - /* enable regulators if they are disabled */ - if (!led->pdata->led->poweron) { - if (aw2013_power_on(led->pdata->led, true)) { - dev_err(&led->pdata->led->client->dev, "power on failed"); - return; - } + int err = -1; + + pdata->regulator = devm_regulator_get(&client->dev, "rgb_led"); + if (IS_ERR(pdata->regulator)) { + dev_err(&client->dev, "regulator get failed\n"); + err = PTR_ERR(pdata->regulator); + pdata->regulator = NULL; + return err; } - led->cdev.brightness = blinking ? led->cdev.max_brightness : 0; - - if (blinking > 0) { - aw2013_write(led, AW_REG_GLOBAL_CONTROL, - AW_LED_MOUDLE_ENABLE_MASK); - aw2013_write(led, AW_REG_LED_CONFIG_BASE + led->id, - AW_LED_FADE_OFF_MASK | AW_LED_FADE_ON_MASK | - AW_LED_BREATHE_MODE_MASK | led->pdata->max_current); - aw2013_write(led, AW_REG_LED_BRIGHTNESS_BASE + led->id, - led->cdev.brightness); - aw2013_write(led, AW_REG_TIMESET0_BASE + led->id * 3, - led->pdata->rise_time_ms << 4 | - led->pdata->hold_time_ms); - aw2013_write(led, AW_REG_TIMESET1_BASE + led->id * 3, - led->pdata->fall_time_ms << 4 | - led->pdata->off_time_ms); - aw2013_read(led, AW_REG_LED_ENABLE, &val); - aw2013_write(led, AW_REG_LED_ENABLE, val | (1 << led->id)); + if (enable) { + + err = regulator_enable(pdata->regulator); + msleep(100); } else { - aw2013_read(led, AW_REG_LED_ENABLE, &val); - aw2013_write(led, AW_REG_LED_ENABLE, val & (~(1 << led->id))); + err = regulator_disable(pdata->regulator); } - aw2013_read(led, AW_REG_LED_ENABLE, &val); - /* - * If value in AW_REG_LED_ENABLE is 0, it means the RGB leds are - * all off. So we need to power it off. - */ - if (val == 0) { - if (aw2013_power_on(led->pdata->led, false)) { - dev_err(&led->pdata->led->client->dev, - "power off failed"); - return; - } - } + return err; } -static void aw2013_set_brightness(struct led_classdev *cdev, - enum led_brightness brightness) -{ - struct aw2013_led *led = container_of(cdev, struct aw2013_led, cdev); - led->cdev.brightness = brightness; - schedule_work(&led->brightness_work); +static ssize_t blink_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct led_classdev *led_cdev = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", led_cdev->brightness); } -static ssize_t aw2013_store_blink(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + +static ssize_t blink_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) { unsigned long blinking; struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct aw2013_led *led = - container_of(led_cdev, struct aw2013_led, cdev); ssize_t ret = -EINVAL; + enum led_colors color; ret = kstrtoul(buf, 10, &blinking); if (ret) return ret; - mutex_lock(&led->pdata->led->lock); - aw2013_led_blink_set(led, blinking); - mutex_unlock(&led->pdata->led->lock); - return len; -} + color = devname_to_color(led_cdev->name); + led_cdev->brightness = + s_aw2013->leds[color].brightness = blinking ? 255 : 0; + s_aw2013->leds[color].blinking = blinking; -static ssize_t aw2013_led_time_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct aw2013_led *led = - container_of(led_cdev, struct aw2013_led, cdev); + led_cdev->brightness = s_aw2013->leds[color].brightness; - return snprintf(buf, PAGE_SIZE, "%d %d %d %d\n", - led->pdata->rise_time_ms, led->pdata->hold_time_ms, - led->pdata->fall_time_ms, led->pdata->off_time_ms); -} + aw2013_set_color(s_aw2013, color); -static ssize_t aw2013_led_time_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct aw2013_led *led = - container_of(led_cdev, struct aw2013_led, cdev); - int rc, rise_time_ms, hold_time_ms, fall_time_ms, off_time_ms; - - rc = sscanf(buf, "%d %d %d %d", - &rise_time_ms, &hold_time_ms, - &fall_time_ms, &off_time_ms); - - mutex_lock(&led->pdata->led->lock); - led->pdata->rise_time_ms = (rise_time_ms > MAX_RISE_TIME_MS) ? - MAX_RISE_TIME_MS : rise_time_ms; - led->pdata->hold_time_ms = (hold_time_ms > MAX_HOLD_TIME_MS) ? - MAX_HOLD_TIME_MS : hold_time_ms; - led->pdata->fall_time_ms = (fall_time_ms > MAX_FALL_TIME_MS) ? - MAX_FALL_TIME_MS : fall_time_ms; - led->pdata->off_time_ms = (off_time_ms > MAX_OFF_TIME_MS) ? - MAX_OFF_TIME_MS : off_time_ms; - aw2013_led_blink_set(led, 1); - mutex_unlock(&led->pdata->led->lock); - return len; + return count; } +static DEVICE_ATTR(blink, 0664, blink_show, blink_store); -static DEVICE_ATTR(blink, 0664, NULL, aw2013_store_blink); -static DEVICE_ATTR(led_time, 0664, aw2013_led_time_show, aw2013_led_time_store); -static struct attribute *aw2013_led_attributes[] = { - &dev_attr_blink.attr, - &dev_attr_led_time.attr, - NULL, -}; - -static struct attribute_group aw2013_led_attr_group = { - .attrs = aw2013_led_attributes -}; - -static int aw_2013_check_chipid(struct aw2013_led *led) +static int create_aw2013_led(const struct aw2013_led *template, + struct aw2013_led_data *led_dat, struct device *parent, + int (*blink_set)(unsigned, int, unsigned long *, unsigned long *)) { - u8 val; - - aw2013_write(led, AW_REG_RESET, AW_LED_RESET_MASK); - usleep(AW_LED_RESET_DELAY); - aw2013_read(led, AW_REG_RESET, &val); - if (val == AW2013_CHIPID) - return 0; - else - return -EINVAL; -} + int ret; -static int aw2013_led_err_handle(struct aw2013_led *led_array, - int parsed_leds) -{ - int i; - /* - * If probe fails, cannot free resource of all LEDs, only free - * resources of LEDs which have allocated these resource really. - */ - for (i = 0; i < parsed_leds; i++) { - sysfs_remove_group(&led_array[i].cdev.dev->kobj, - &aw2013_led_attr_group); - led_classdev_unregister(&led_array[i].cdev); - cancel_work_sync(&led_array[i].brightness_work); - devm_kfree(&led_array->client->dev, led_array[i].pdata); - led_array[i].pdata = NULL; - } - return i; -} - -static int aw2013_led_parse_child_node(struct aw2013_led *led_array, - struct device_node *node) -{ - struct aw2013_led *led; - struct device_node *temp; - struct aw2013_platform_data *pdata; - int rc = 0, parsed_leds = 0; - - for_each_child_of_node(node, temp) { - led = &led_array[parsed_leds]; - led->client = led_array->client; - - pdata = devm_kzalloc(&led->client->dev, - sizeof(struct aw2013_platform_data), - GFP_KERNEL); - if (!pdata) { - dev_err(&led->client->dev, - "Failed to allocate memory\n"); - goto free_err; - } - pdata->led = led_array; - led->pdata = pdata; - - rc = of_property_read_string(temp, "aw2013,name", - &led->cdev.name); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading led name, rc = %d\n", rc); - goto free_pdata; - } + led_dat->cdev.name = template->name; + led_dat->cdev.default_trigger = template->default_trigger; + led_dat->color = devname_to_color(template->name); + led_dat->cdev.brightness = 0; + if (!template->retain_state_suspended) + led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; - rc = of_property_read_u32(temp, "aw2013,id", - &led->id); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading id, rc = %d\n", rc); - goto free_pdata; - } + led_dat->cdev.blink_set = aw2013_led_blink_set; + led_dat->cdev.brightness_set = aw2013_led_set; - rc = of_property_read_u32(temp, "aw2013,max-brightness", - &led->cdev.max_brightness); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading max-brightness, rc = %d\n", - rc); - goto free_pdata; - } + ret = led_classdev_register(parent, &led_dat->cdev); - rc = of_property_read_u32(temp, "aw2013,max-current", - &led->pdata->max_current); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading max-current, rc = %d\n", rc); - goto free_pdata; - } + device_create_file(led_dat->cdev.dev, &dev_attr_blink); - rc = of_property_read_u32(temp, "aw2013,rise-time-ms", - &led->pdata->rise_time_ms); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading rise-time-ms, rc = %d\n", rc); - goto free_pdata; - } + if (ret < 0) + return ret; - rc = of_property_read_u32(temp, "aw2013,hold-time-ms", - &led->pdata->hold_time_ms); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading hold-time-ms, rc = %d\n", rc); - goto free_pdata; - } + return 0; +} - rc = of_property_read_u32(temp, "aw2013,fall-time-ms", - &led->pdata->fall_time_ms); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading fall-time-ms, rc = %d\n", rc); - goto free_pdata; - } +static void delete_aw2013_led(struct aw2013_led_data *led) +{ + device_remove_file(led->cdev.dev, &dev_attr_blink); + led_classdev_unregister(&led->cdev); +} - rc = of_property_read_u32(temp, "aw2013,off-time-ms", - &led->pdata->off_time_ms); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading off-time-ms, rc = %d\n", rc); - goto free_pdata; +static struct aw2013_leds_priv *aw2013_leds_create_of(struct i2c_client *client) +{ + struct device_node *np = client->dev.of_node; + struct device_node *child; + struct aw2013_leds_priv *priv; + int count, ret; + + /* count LEDs in this device, so we know how much to allocate */ + count = of_get_child_count(np); + if (!count) + return ERR_PTR(-ENODEV); + + priv = devm_kzalloc(&client->dev, sizeof_aw2013_leds_priv(count), + GFP_KERNEL); + if (!priv) + return ERR_PTR(-ENOMEM); + + for_each_child_of_node(np, child) { + struct aw2013_led led = {}; + + led.name = of_get_property(child, "label", NULL) ? : child->name; + led.default_trigger = + of_get_property(child, "linux,default-trigger", NULL); + led.retain_state_suspended = + (unsigned)of_property_read_bool(child, + "retain-state-suspended"); + + ret = create_aw2013_led(&led, &priv->leds[priv->num_leds++], + &client->dev, NULL); + if (ret < 0) { + of_node_put(child); + goto err; } + } - INIT_WORK(&led->brightness_work, aw2013_brightness_work); + return priv; - led->cdev.brightness_set = aw2013_set_brightness; +err: + for (count = priv->num_leds - 2; count >= 0; count--) + delete_aw2013_led(&priv->leds[count]); - rc = led_classdev_register(&led->client->dev, &led->cdev); - if (rc) { - dev_err(&led->client->dev, - "unable to register led %d,rc=%d\n", - led->id, rc); - goto free_pdata; - } + devm_kfree(&client->dev, priv); - rc = sysfs_create_group(&led->cdev.dev->kobj, - &aw2013_led_attr_group); - if (rc) { - dev_err(&led->client->dev, "led sysfs rc: %d\n", rc); - goto free_class; - } - parsed_leds++; - } - - return 0; - -free_class: - aw2013_led_err_handle(led_array, parsed_leds); - led_classdev_unregister(&led_array[parsed_leds].cdev); - cancel_work_sync(&led_array[parsed_leds].brightness_work); - devm_kfree(&led->client->dev, led_array[parsed_leds].pdata); - led_array[parsed_leds].pdata = NULL; - return rc; - -free_pdata: - aw2013_led_err_handle(led_array, parsed_leds); - devm_kfree(&led->client->dev, led_array[parsed_leds].pdata); - return rc; - -free_err: - aw2013_led_err_handle(led_array, parsed_leds); - return rc; + return ERR_PTR(-ENODEV); } -static int aw2013_led_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct aw2013_led *led_array; - struct device_node *node; - int ret, num_leds = 0; - node = client->dev.of_node; - if (node == NULL) - return -EINVAL; +static int aw2013_led_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ - num_leds = of_get_child_count(node); + int err = 0; + struct aw2013_leds_priv *priv; + printk("aw2013_led_probe start\n"); + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, + "%s: check_functionality failed.", __func__); + err = -ENODEV; + goto exit0; + } - if (!num_leds) - return -EINVAL; + /* Allocate memory for driver data */ + s_aw2013 = kzalloc(sizeof(struct aw2013_dev_data), GFP_KERNEL); + if (!s_aw2013) { + dev_err(&client->dev, + "%s: memory allocation failed.", __func__); + err = -ENOMEM; + goto exit1; + } - led_array = devm_kzalloc(&client->dev, - (sizeof(struct aw2013_led) * num_leds), GFP_KERNEL); - if (!led_array) - return -ENOMEM; + /***** I2C initialization *****/ + s_aw2013->i2c = client; + /* set client data */ + i2c_set_clientdata(client, s_aw2013); - led_array->client = client; - led_array->num_leds = num_leds; + mutex_init(&s_aw2013->led_lock); - mutex_init(&led_array->lock); + INIT_WORK(&s_aw2013->set_color_work, set_color_delayed); - ret = aw_2013_check_chipid(led_array); - if (ret) { - dev_err(&client->dev, "Check chip id error\n"); - goto free_led_arry; + if (0 != aw2013_power_up(s_aw2013, client, true)) { + goto exit2; } - - ret = aw2013_led_parse_child_node(led_array, node); - if (ret) { - dev_err(&client->dev, "parsed node error\n"); - goto free_led_arry; + if (0 != aw2013_i2c_check_device(client)) { + dev_err(&client->dev, + "%s: aw2013_i2c_check_device failed.", __func__); + goto exit2; } - i2c_set_clientdata(client, led_array); + blink_frequency_adjust = of_property_read_bool(client->dev.of_node, "blink-frequency-adjustable"); - ret = aw2013_power_init(led_array, true); - if (ret) { - dev_err(&client->dev, "power init failed"); - goto fail_parsed_node; - } + priv = aw2013_leds_create_of(client); + + if (IS_ERR(priv)) + goto exit3; + + s_aw2013->leds_priv = priv; return 0; -fail_parsed_node: - aw2013_led_err_handle(led_array, num_leds); -free_led_arry: - mutex_destroy(&led_array->lock); - devm_kfree(&client->dev, led_array); - led_array = NULL; - return ret; +exit3: +exit2: + kfree(s_aw2013); +exit1: +exit0: + return err; } static int aw2013_led_remove(struct i2c_client *client) { - struct aw2013_led *led_array = i2c_get_clientdata(client); - int i, parsed_leds = led_array->num_leds; - - for (i = 0; i < parsed_leds; i++) { - sysfs_remove_group(&led_array[i].cdev.dev->kobj, - &aw2013_led_attr_group); - led_classdev_unregister(&led_array[i].cdev); - cancel_work_sync(&led_array[i].brightness_work); - devm_kfree(&client->dev, led_array[i].pdata); - led_array[i].pdata = NULL; - } - mutex_destroy(&led_array->lock); - devm_kfree(&client->dev, led_array); - led_array = NULL; + int count = 0; + struct aw2013_dev_data *aw2013 = i2c_get_clientdata(client); + + for (count = aw2013->leds_priv->num_leds - 2; count >= 0; count--) + delete_aw2013_led(&(aw2013->leds_priv->leds[count])); + + devm_kfree(&client->dev, aw2013->leds_priv); + + kfree(aw2013); + dev_info(&client->dev, "successfully removed."); return 0; } static const struct i2c_device_id aw2013_led_id[] = { - {"aw2013_led", 0}, - {}, + {AW2013_I2C_NAME, 0 }, + { } }; -MODULE_DEVICE_TABLE(i2c, aw2013_led_id); - -static struct of_device_id aw2013_match_table[] = { - { .compatible = "awinic,aw2013",}, +static struct of_device_id aw2013_led_match_table[] = { + { .compatible = "awinc,aw2013", }, { }, }; static struct i2c_driver aw2013_led_driver = { - .probe = aw2013_led_probe, - .remove = aw2013_led_remove, + .probe = aw2013_led_probe, + .remove = aw2013_led_remove, + .id_table = aw2013_led_id, .driver = { - .name = "aw2013_led", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(aw2013_match_table), + .name = AW2013_I2C_NAME, + .owner = THIS_MODULE, + .of_match_table = aw2013_led_match_table, + }, - .id_table = aw2013_led_id, }; static int __init aw2013_led_init(void) { + pr_info("aw2013 led driver: initialize."); return i2c_add_driver(&aw2013_led_driver); } -module_init(aw2013_led_init); static void __exit aw2013_led_exit(void) { + pr_info("aw2013 led driver: release."); i2c_del_driver(&aw2013_led_driver); } + +subsys_initcall(aw2013_led_init); module_exit(aw2013_led_exit); -MODULE_DESCRIPTION("AWINIC aw2013 LED driver"); -MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("ming he "); +MODULE_DESCRIPTION("aw2013 driver"); +MODULE_LICENSE("GPL"); + + diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index b4518c8751c8d..a264998fb5c9c 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -2,25 +2,65 @@ * LEDs driver for GPIOs * * Copyright (C) 2007 8D Technologies inc. + * Copyright (C) 2018 XiaoMi, Inc. * Raphael Assenat * Copyright (C) 2008 Freescale Semiconductor, Inc. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * */ -#include -#include #include +#include +#include +#include +#include #include -#include -#include -#include #include -#include +#include #include #include +#include +#include +#include +#include +#include + +#define DUTY_CLCLE 50 +#define ADJUST_NUM 15 +#define JUSTTIMES 6 +#define JUST_DELAY 6 + +#define HRTIME_JUST_DELAY 9000 + + + +#ifndef USE_HRTIMER_SIMULATION +static s64 dealt; +#else +static s64 adjust_dealt; + +#endif + +static DEFINE_SPINLOCK(infrared_lock); +struct pm_qos_request infrared_qos_req; + + +struct gpio_ir_tx_packet { + struct completion done; + struct hrtimer timer; + unsigned int gpio_nr; + bool high_active; + u32 pulse; + u32 space; + unsigned int *buffer; + unsigned int length; + unsigned int next; + bool on; + bool abort; +}; struct gpio_led_data { struct led_classdev cdev; @@ -34,9 +74,16 @@ struct gpio_led_data { unsigned long *delay_on, unsigned long *delay_off); }; +struct mutex ir_lock; + + +#if defined (WT_USE_FAN54015) +extern int fan54015_getcharge_stat(void); +#endif + static void gpio_led_work(struct work_struct *work) { - struct gpio_led_data *led_dat = + struct gpio_led_data *led_dat = container_of(work, struct gpio_led_data, work); if (led_dat->blinking) { @@ -46,6 +93,7 @@ static void gpio_led_work(struct work_struct *work) led_dat->blinking = 0; } else gpio_set_value_cansleep(led_dat->gpio, led_dat->new_level); + printk("infr has been end"); } static void gpio_led_set(struct led_classdev *led_cdev, @@ -53,8 +101,8 @@ static void gpio_led_set(struct led_classdev *led_cdev, { struct gpio_led_data *led_dat = container_of(led_cdev, struct gpio_led_data, cdev); - int level; - + int level, ret = 0; + printk("infr has been start"); if (value == LED_OFF) level = 0; else @@ -76,7 +124,11 @@ static void gpio_led_set(struct led_classdev *led_cdev, NULL, NULL); led_dat->blinking = 0; } else - gpio_set_value(led_dat->gpio, level); + ret = gpio_direction_output(led_dat->gpio, level); + if (ret) { + printk("infrared unable to set dir for gpio [%d]\n", led_dat->gpio); + } + } } @@ -91,11 +143,291 @@ static int gpio_blink_set(struct led_classdev *led_cdev, delay_on, delay_off); } +static void gpio_ir_tx_set(struct gpio_ir_tx_packet *gpkt, bool on) +{ + if (gpkt->high_active) + gpio_set_value(gpkt->gpio_nr, on); + else + gpio_set_value(gpkt->gpio_nr, !on); +} + +#if defined(USE_HRTIMER_SIMULATION) +static s64 hrtime_adjust(struct gpio_ir_tx_packet *gpkt) +{ + s64 now; + int i; + unsigned long flags; + + spin_lock_irqsave(&infrared_lock, flags); + + now = ktime_to_ns(ktime_get()); + for (i = 0; i < ADJUST_NUM; i++) { + gpio_ir_tx_set(gpkt, false); + } + spin_unlock_irqrestore(&infrared_lock, flags); + + return (ktime_to_ns(ktime_get())-now)/ADJUST_NUM; +} + +static enum hrtimer_restart gpio_ir_tx_timer(struct hrtimer *timer) +{ + s64 delay_ns = 0, dealt_t = 0; + ktime_t start = ktime_get(); + + struct gpio_ir_tx_packet *gpkt = container_of(timer, struct gpio_ir_tx_packet, timer); + enum hrtimer_restart restart = HRTIMER_RESTART; + + if (!gpkt->abort && gpkt->next < gpkt->length) { + if (gpkt->next & 0x01) { /* space */ + gpio_ir_tx_set(gpkt, false); + + delay_ns = gpkt->buffer[gpkt->next++] * NSEC_PER_USEC; + } else if (!gpkt->pulse || !gpkt->space) { + gpio_ir_tx_set(gpkt, true); + + + delay_ns = gpkt->buffer[gpkt->next++] * NSEC_PER_USEC; + } else { /* pulse with soft carrier */ + + +#if 1 + unsigned int usecs; + + usecs = gpkt->on ? gpkt->pulse : gpkt->space; + usecs = min(usecs, gpkt->buffer[gpkt->next]); + + gpio_ir_tx_set(gpkt, gpkt->on); + + + + delay_ns = usecs * NSEC_PER_USEC; + + gpkt->buffer[gpkt->next] -= usecs; + gpkt->on = !gpkt->on; + + if (!gpkt->buffer[gpkt->next]) + gpkt->next++; +#endif + } + } else { + restart = HRTIMER_NORESTART; + gpio_ir_tx_set(gpkt, false); + complete(&gpkt->done); + } + + dealt_t = ktime_to_ns(ktime_sub(ktime_get(), start)) + adjust_dealt; + + if (delay_ns >= dealt_t) + delay_ns -= dealt_t; + + hrtimer_forward_now(&gpkt->timer, ns_to_ktime(delay_ns)); + + return restart; +} + +static int gpio_ir_tx_transmit_with_timer(struct gpio_ir_tx_packet *gpkt) +{ + int rc = 0, hrtimer = 0, i = 0; + + init_completion(&gpkt->done); + + adjust_dealt = hrtime_adjust(gpkt); + if (adjust_dealt > HRTIME_JUST_DELAY) { + for (i = 0; i < JUSTTIMES; i++) { + adjust_dealt = hrtime_adjust(gpkt); + } + printk("infrared time_adjust fail!! adjust_dealt=%lld\n", adjust_dealt); + if (adjust_dealt > HRTIME_JUST_DELAY) + adjust_dealt = HRTIME_JUST_DELAY; + } + + hrtimer_init(&gpkt->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED); + gpkt->timer.function = gpio_ir_tx_timer; + + + + + hrtimer = hrtimer_is_hres_active(&gpkt->timer); + + if (!hrtimer) { + printk("unable to use High-Resolution timer\n"); + } + + hrtimer_start(&gpkt->timer, ns_to_ktime(0), HRTIMER_MODE_REL_PINNED); + + rc = wait_for_completion_interruptible(&gpkt->done); + if (rc != 0) { /* signal exit immediately */ + gpkt->abort = true; + wait_for_completion(&gpkt->done); + } + + return gpkt->next ? : -ERESTARTSYS; +} + +#else +static s64 time_adjust(struct gpio_ir_tx_packet *gpkt) +{ + s64 now; + int i; + unsigned long flags; + + spin_lock_irqsave(&infrared_lock, flags); + + now = ktime_to_us(ktime_get()); + for (i = 0; i < ADJUST_NUM; i++) { + gpio_ir_tx_set(gpkt, false); + } + spin_unlock_irqrestore(&infrared_lock, flags); + + return (ktime_to_us(ktime_get())-now)/ADJUST_NUM; +} + +static long pwm_ir_tx_work(void *arg) +{ + struct gpio_ir_tx_packet *gpkt = arg; + unsigned long flags; + + /* disable irq for acurracy timing */ + spin_lock_irqsave(&infrared_lock, flags); + for (; gpkt->next < gpkt->length; gpkt->next++) { + + + if (gpkt->next & 0x01) { /* space */ + gpio_ir_tx_set(gpkt, false); + if (gpkt->buffer[gpkt->next] >= dealt) + udelay(gpkt->buffer[gpkt->next] - dealt); + } else if (!gpkt->pulse || !gpkt->space) { + gpio_ir_tx_set(gpkt, true); + if (gpkt->buffer[gpkt->next] >= dealt) + udelay(gpkt->buffer[gpkt->next] - dealt); + } else { /* pulse with soft carrier */ + while (gpkt->buffer[gpkt->next]) { + unsigned int usecs; + usecs = gpkt->on ? gpkt->pulse : gpkt->space; + usecs = min(usecs, gpkt->buffer[gpkt->next]); + + gpio_ir_tx_set(gpkt, gpkt->on); + + if (usecs >= dealt) + udelay(usecs - dealt); + + gpkt->buffer[gpkt->next] -= usecs; + gpkt->on = !gpkt->on; + } + } + } + + gpio_ir_tx_set(gpkt, false); + + spin_unlock_irqrestore(&infrared_lock, flags); + + return gpkt->next ? : -ERESTARTSYS; +} + +static int gpio_ir_tx_transmit_with_delay(struct gpio_ir_tx_packet *gpkt) +{ + + + int cpu, rc = -ENODEV; + int try_again = JUSTTIMES; + + dealt = time_adjust(gpkt); + + while (try_again && (dealt > JUST_DELAY)) { + try_again--; + dealt = time_adjust(gpkt); + printk("jeft time_adjust again!! dealt=%lld\n", dealt); + } + + if (dealt > JUST_DELAY) + goto out; + + + + + + for_each_online_cpu(cpu) + { + + if (cpu != 0) { + rc = work_on_cpu(cpu, pwm_ir_tx_work, gpkt); + break; + } + } + + if (rc == -ENODEV) { + pr_warn("pwm-ir: can't ron on the auxilliary cpu\n"); + + } + + return rc; + +out: + printk("jeft cpu too low infrared send fail dealt =%lld\n", dealt); + return rc; +} +#endif +static ssize_t transmit_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct led_classdev *led_cdev = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", led_cdev->brightness); +} + +static ssize_t transmit_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int *temp_buf = (int *)buf; + int rc = 0; + u32 carrier, period; + + struct gpio_ir_tx_packet gpkt = {}; + struct led_classdev *led_cdev = dev_get_drvdata(dev); + struct gpio_led_data *led_dat = + container_of(led_cdev, struct gpio_led_data, cdev); + + + mutex_lock(&ir_lock); + + carrier = temp_buf[0]; + period = NSEC_PER_MSEC / carrier; + + gpkt.pulse = period * DUTY_CLCLE / 100; + gpkt.space = period - gpkt.pulse; + + gpkt.gpio_nr = led_dat->gpio; + gpkt.high_active = 1/*gdata->tx_high_active*/; + gpkt.buffer = (unsigned int *)&temp_buf[1]; + gpkt.length = ((int)count/4 - 1); + + pm_qos_update_request(&infrared_qos_req, 1); +#if defined(USE_HRTIMER_SIMULATION) + rc = gpio_ir_tx_transmit_with_timer(&gpkt); +#else + if (gpkt.high_active) { + gpio_direction_output(gpkt.gpio_nr, 0); + } + rc = gpio_ir_tx_transmit_with_delay(&gpkt); +#endif + pm_qos_update_request(&infrared_qos_req, PM_QOS_DEFAULT_VALUE); + + + mutex_unlock(&ir_lock); + + return rc; +} +static DEVICE_ATTR(transmit, 0664, transmit_show, transmit_store); + static int create_gpio_led(const struct gpio_led *template, struct gpio_led_data *led_dat, struct device *parent, int (*blink_set)(unsigned, int, unsigned long *, unsigned long *)) { int ret, state; +#if defined (WT_USE_FAN54015) + int chg_status; +#endif led_dat->gpio = -1; @@ -105,7 +437,6 @@ static int create_gpio_led(const struct gpio_led *template, template->gpio, template->name); return 0; } - ret = devm_gpio_request(parent, template->gpio, template->name); if (ret < 0) return ret; @@ -129,16 +460,30 @@ static int create_gpio_led(const struct gpio_led *template, if (!template->retain_state_suspended) led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; +#if defined (WT_USE_FAN54015) + chg_status = fan54015_getcharge_stat(); + if (!strcmp(template->name, "red")) { + if ((chg_status & 0x1) != 0x1) { + ret = gpio_direction_output(led_dat->gpio, led_dat->active_low ^ state); + if (ret < 0) + return ret; + } + } +#else ret = gpio_direction_output(led_dat->gpio, led_dat->active_low ^ state); if (ret < 0) return ret; - +#endif INIT_WORK(&led_dat->work, gpio_led_work); ret = led_classdev_register(parent, &led_dat->cdev); if (ret < 0) return ret; + if (strcmp(led_dat->cdev.name, "infrared") == 0) { + device_create_file(led_dat->cdev.dev, &dev_attr_transmit); + } + return 0; } @@ -170,11 +515,11 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) int count, ret; /* count LEDs in this device, so we know how much to allocate */ - count = of_get_available_child_count(np); + count = of_get_child_count(np); if (!count) return ERR_PTR(-ENODEV); - for_each_available_child_of_node(np, child) + for_each_child_of_node(np, child) if (of_get_gpio(child, 0) == -EPROBE_DEFER) return ERR_PTR(-EPROBE_DEFER); @@ -183,7 +528,7 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) if (!priv) return ERR_PTR(-ENOMEM); - for_each_available_child_of_node(np, child) { + for_each_child_of_node(np, child) { struct gpio_led led = {}; enum of_gpio_flags flags; const char *state; @@ -203,8 +548,9 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) led.default_state = LEDS_GPIO_DEFSTATE_OFF; } - if (of_get_property(child, "retain-state-suspended", NULL)) - led.retain_state_suspended = 1; + led.retain_state_suspended = + (unsigned)of_property_read_bool(child, + "retain-state-suspended"); ret = create_gpio_led(&led, &priv->leds[priv->num_leds++], &pdev->dev, NULL); @@ -226,8 +572,6 @@ static const struct of_device_id of_gpio_leds_match[] = { { .compatible = "gpio-leds", }, {}, }; - -MODULE_DEVICE_TABLE(of, of_gpio_leds_match); #else /* CONFIG_OF_GPIO */ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) { @@ -235,12 +579,19 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) } #endif /* CONFIG_OF_GPIO */ + static int gpio_led_probe(struct platform_device *pdev) { - struct gpio_led_platform_data *pdata = dev_get_platdata(&pdev->dev); + struct gpio_led_platform_data *pdata = pdev->dev.platform_data; struct gpio_leds_priv *priv; + struct pinctrl *pinctrl; int i, ret = 0; + pinctrl = devm_pinctrl_get_select_default(&pdev->dev); + if (IS_ERR(pinctrl)) + dev_warn(&pdev->dev, + "pins are not configured from the driver\n"); + if (pdata && pdata->num_leds) { priv = devm_kzalloc(&pdev->dev, sizeof_gpio_leds_priv(pdata->num_leds), @@ -267,6 +618,9 @@ static int gpio_led_probe(struct platform_device *pdev) } platform_set_drvdata(pdev, priv); + pm_qos_add_request(&infrared_qos_req, + PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE); + mutex_init(&ir_lock); return 0; } @@ -279,6 +633,8 @@ static int gpio_led_remove(struct platform_device *pdev) for (i = 0; i < priv->num_leds; i++) delete_gpio_led(&priv->leds[i]); + platform_set_drvdata(pdev, NULL); + pm_qos_remove_request(&infrared_qos_req); return 0; } diff --git a/drivers/leds/leds-msm-gpio-flash.c b/drivers/leds/leds-msm-gpio-flash.c new file mode 100644 index 0000000000000..e72d0c98c0c50 --- /dev/null +++ b/drivers/leds/leds-msm-gpio-flash.c @@ -0,0 +1,325 @@ + +/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* #define CONFIG_GPIO_FLASH_DEBUG */ +#undef CDBG +#define CDBG(fmt, args...) pr_err(fmt, ##args) + +#define LED_GPIO_FLASH_DRIVER_NAME "qcom,leds-gpio-flash" +#define LED_TRIGGER_DEFAULT "none" + +#define GPIO_OUT_LOW (0 << 1) +#define GPIO_OUT_HIGH (1 << 1) + +enum msm_flash_seq_type_t { + FLASH_EN, + FLASH_NOW, +}; + +struct msm_flash_ctrl_seq { + enum msm_flash_seq_type_t seq_type; + uint8_t flash_on_val; + uint8_t torch_on_val; + uint8_t flash_off_val; +}; + +struct led_gpio_flash_data { + int flash_en; + int flash_now; + int brightness; + struct led_classdev cdev; + struct pinctrl *pinctrl; + struct pinctrl_state *gpio_state_default; + struct msm_flash_ctrl_seq ctrl_seq[2]; +}; + +static struct of_device_id led_gpio_flash_of_match[] = { + {.compatible = LED_GPIO_FLASH_DRIVER_NAME,}, + {}, +}; + +static void led_gpio_brightness_set(struct led_classdev *led_cdev, + enum led_brightness value) +{ + int rc = 0; + struct led_gpio_flash_data *flash_led = + container_of(led_cdev, struct led_gpio_flash_data, cdev); + + int brightness = value; + int flash_en = 0, flash_now = 0; + + if (brightness > LED_HALF) { + flash_en = + flash_led->ctrl_seq[FLASH_EN].flash_on_val; + flash_now = + flash_led->ctrl_seq[FLASH_NOW].flash_on_val; + } else if (brightness > LED_OFF) { + flash_en = + flash_led->ctrl_seq[FLASH_EN].torch_on_val; + flash_now = + flash_led->ctrl_seq[FLASH_NOW].torch_on_val; + } else { + flash_en = 0; + flash_now = 0; + } + CDBG("%s:flash_en=%d, flash_now=%d\n", __func__, flash_en, flash_now); + + rc = gpio_direction_output(93/*flash_led->flash_en*/, flash_en); + if (rc) { + pr_err("%s: Failed to set gpio %d\n", __func__, + flash_led->flash_en); + goto err; + } + rc = gpio_direction_output(90/*flash_led->flash_now*/, flash_now); + if (rc) { + pr_err("%s: Failed to set gpio %d\n", __func__, + flash_led->flash_now); + goto err; + } + flash_led->brightness = brightness; +err: + return; +} + +static enum led_brightness led_gpio_brightness_get(struct led_classdev + *led_cdev) +{ + struct led_gpio_flash_data *flash_led = + container_of(led_cdev, struct led_gpio_flash_data, cdev); + return flash_led->brightness; +} + +int led_gpio_flash_probe(struct platform_device *pdev) +{ + int rc = 0; + const char *temp_str; + struct led_gpio_flash_data *flash_led = NULL; + struct device_node *node = pdev->dev.of_node; + const char *seq_name = NULL; + uint32_t array_flash_seq[2]; + uint32_t array_torch_seq[2]; + int i = 0; + uint32_t flash_gpio_en, flash_gpio_now; + + flash_led = devm_kzalloc(&pdev->dev, sizeof(struct led_gpio_flash_data), + GFP_KERNEL); + if (flash_led == NULL) { + dev_err(&pdev->dev, "%s:%d Unable to allocate memory\n", + __func__, __LINE__); + return -ENOMEM; + } + + flash_led->cdev.default_trigger = LED_TRIGGER_DEFAULT; + rc = of_property_read_string(node, "linux,default-trigger", &temp_str); + if (!rc) + flash_led->cdev.default_trigger = temp_str; + + flash_led->pinctrl = devm_pinctrl_get(&pdev->dev); + if (IS_ERR(flash_led->pinctrl)) { + pr_err("%s:failed to get pinctrl\n", __func__); + return PTR_ERR(flash_led->pinctrl); + } + + flash_led->gpio_state_default = pinctrl_lookup_state(flash_led->pinctrl, + "flash_default"); + if (IS_ERR(flash_led->gpio_state_default)) { + pr_err("%s:can not get active pinstate\n", __func__); + return -EINVAL; + } + + rc = pinctrl_select_state(flash_led->pinctrl, + flash_led->gpio_state_default); + if (rc) + pr_err("%s:set state failed!\n", __func__); + + + flash_led->flash_en = of_property_read_u32(node, "qcom,flash-en", &flash_gpio_en); + if (flash_led->flash_en < 0) { + dev_err(&pdev->dev, + "Looking up %s property in node %s failed. rc = %d\n", + "flash-en", node->full_name, flash_led->flash_en); + goto error; + } else { + rc = gpio_request(flash_gpio_en, "FLASH_EN"); + if (rc) { + dev_err(&pdev->dev, + "%s: Failed to request gpio %d,rc = %d\n", + __func__, flash_gpio_en, rc); + + goto error; + } + } + + + flash_led->flash_now = of_property_read_u32(node, "qcom,flash-now", &flash_gpio_now); + if (flash_led->flash_now < 0) { + dev_err(&pdev->dev, + "Looking up %s property in node %s failed. rc = %d\n", + "flash-now", node->full_name, flash_led->flash_now); + goto error; + } else { + rc = gpio_request(flash_gpio_now, "FLASH_NOW"); + if (rc) { + dev_err(&pdev->dev, + "%s: Failed to request gpio %d,rc = %d\n", + __func__, flash_gpio_now, rc); + goto error; + } + } + + rc = of_property_read_string(node, "linux,name", &flash_led->cdev.name); + if (rc) { + dev_err(&pdev->dev, "%s: Failed to read linux name. rc = %d\n", + __func__, rc); + goto error; + } + + rc = of_property_read_u32_array(node, "qcom,flash-seq-val", + array_flash_seq, 2); + + if (rc < 0) { + pr_err("%s get flash op seq failed %d\n", + __func__, __LINE__); + goto error; + } + + rc = of_property_read_u32_array(node, "qcom,torch-seq-val", + array_torch_seq, 2); + + if (rc < 0) { + pr_err("%s get torch op seq failed %d\n", + __func__, __LINE__); + goto error; + } + + for (i = 0; i < 2; i++) { + rc = of_property_read_string_index(node, + "qcom,op-seq", i, + &seq_name); + CDBG("%s seq_name[%d] = %s\n", __func__, i, + seq_name); + if (rc < 0) + dev_err(&pdev->dev, "%s failed %d\n", + __func__, __LINE__); + + if (!strcmp(seq_name, "flash_en")) { + flash_led->ctrl_seq[FLASH_EN].seq_type = + FLASH_EN; + CDBG("%s:%d seq_type[%d] %d\n", __func__, __LINE__, + i, flash_led->ctrl_seq[FLASH_EN].seq_type); + if (array_flash_seq[i] == 0) + flash_led->ctrl_seq[FLASH_EN].flash_on_val = + GPIO_OUT_LOW; + else + flash_led->ctrl_seq[FLASH_EN].flash_on_val = + GPIO_OUT_HIGH; + + if (array_torch_seq[i] == 0) + flash_led->ctrl_seq[FLASH_EN].torch_on_val = + GPIO_OUT_LOW; + else + flash_led->ctrl_seq[FLASH_EN].torch_on_val = + GPIO_OUT_HIGH; + } else if (!strcmp(seq_name, "flash_now")) { + flash_led->ctrl_seq[FLASH_NOW].seq_type = + FLASH_NOW; + CDBG("%s:%d seq_type[%d] %d\n", __func__, __LINE__, + i, flash_led->ctrl_seq[i].seq_type); + if (array_flash_seq[i] == 0) + flash_led->ctrl_seq[FLASH_NOW].flash_on_val = + GPIO_OUT_LOW; + else + flash_led->ctrl_seq[FLASH_NOW].flash_on_val = + GPIO_OUT_HIGH; + + if (array_torch_seq[i] == 0) + flash_led->ctrl_seq[FLASH_NOW].torch_on_val = + GPIO_OUT_LOW; + else + flash_led->ctrl_seq[FLASH_NOW].torch_on_val = + GPIO_OUT_HIGH; + } + + } + + platform_set_drvdata(pdev, flash_led); + flash_led->cdev.max_brightness = LED_FULL; + flash_led->cdev.brightness_set = led_gpio_brightness_set; + flash_led->cdev.brightness_get = led_gpio_brightness_get; + + rc = led_classdev_register(&pdev->dev, &flash_led->cdev); + if (rc) { + dev_err(&pdev->dev, "%s: Failed to register led dev. rc = %d\n", + __func__, rc); + goto error; + } + pr_err("%s:probe successfully!\n", __func__); + return 0; + +error: + if (IS_ERR(flash_led->pinctrl)) + devm_pinctrl_put(flash_led->pinctrl); + devm_kfree(&pdev->dev, flash_led); + return rc; +} + +int led_gpio_flash_remove(struct platform_device *pdev) +{ + struct led_gpio_flash_data *flash_led = + (struct led_gpio_flash_data *)platform_get_drvdata(pdev); + if (IS_ERR(flash_led->pinctrl)) + devm_pinctrl_put(flash_led->pinctrl); + led_classdev_unregister(&flash_led->cdev); + devm_kfree(&pdev->dev, flash_led); + return 0; +} + +static struct platform_driver led_gpio_flash_driver = { + .probe = led_gpio_flash_probe, + .remove = led_gpio_flash_remove, + .driver = { + .name = LED_GPIO_FLASH_DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = led_gpio_flash_of_match, + } +}; + +static int __init led_gpio_flash_init(void) +{ + return platform_driver_register(&led_gpio_flash_driver); +} + +static void __exit led_gpio_flash_exit(void) +{ + return platform_driver_unregister(&led_gpio_flash_driver); +} + +late_initcall(led_gpio_flash_init); +module_exit(led_gpio_flash_exit); + +MODULE_DESCRIPTION("QCOM GPIO LEDs driver"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("leds:leds-msm-gpio-flash"); diff --git a/drivers/leds/leds-qpnp-flash.c b/drivers/leds/leds-qpnp-flash.c index 26a99c5869565..a0b502aa35793 100644 --- a/drivers/leds/leds-qpnp-flash.c +++ b/drivers/leds/leds-qpnp-flash.c @@ -1,4 +1,5 @@ /* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -29,6 +30,8 @@ #include "leds.h" #include #include +#include + #define FLASH_LED_PERIPHERAL_SUBTYPE(base) (base + 0x05) #define FLASH_SAFETY_TIMER(base) (base + 0x40) @@ -246,6 +249,8 @@ struct qpnp_flash_led { struct workqueue_struct *ordered_workq; struct qpnp_vadc_chip *vadc_dev; struct mutex flash_led_lock; + struct wake_lock flashlight_led_lock; + struct qpnp_flash_led_buffer *log; struct dentry *dbgfs_root; int num_leds; u16 base; @@ -1246,6 +1251,8 @@ static void qpnp_flash_led_work(struct work_struct *work) /* Global lock is to synchronize between the flash leds and torch */ mutex_lock(&led->flash_led_lock); + + dev_dbg(&led->spmi_dev->dev, "wt flash_node.cdev.name=%s\n", flash_node->cdev.name); /* Local lock is to synchronize for one led instance */ mutex_lock(&flash_node->cdev.led_access); @@ -1801,6 +1808,8 @@ static void qpnp_flash_led_work(struct work_struct *work) return; } + +extern int32_t wt_flash_flashlight(bool boolean); static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev, enum led_brightness value) { @@ -1818,6 +1827,22 @@ static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev, value = flash_node->cdev.max_brightness; flash_node->cdev.brightness = value; + + + pr_debug("WT flash_node.cdev.name=%s, brightness=%d, id=%d, flash_node->type=%d\n", flash_node->cdev.name, + flash_node->cdev.brightness, flash_node->id, flash_node->type); + + if (!strcmp(flash_node->cdev.name, "flashlight")) { + pr_info("wt_flash_flashlight enter value=%d\n", value); + if (value > 0) { + wt_flash_flashlight(true); + wake_lock(&led->flashlight_led_lock); + } else{ + wt_flash_flashlight(false); + wake_unlock(&led->flashlight_led_lock); + } + } + if (led->flash_node[led->num_leds - 1].id == FLASH_LED_SWITCH) { if (flash_node->type == TORCH) @@ -2506,6 +2531,8 @@ static int qpnp_flash_led_probe(struct spmi_device *spmi) } mutex_init(&led->flash_led_lock); + wake_lock_init(&led->flashlight_led_lock, WAKE_LOCK_SUSPEND, + "flashlight_led_lock_wt"); led->ordered_workq = alloc_ordered_workqueue("flash_led_workqueue", 0); if (!led->ordered_workq) { @@ -2645,6 +2672,7 @@ static int qpnp_flash_led_probe(struct spmi_device *spmi) led_classdev_unregister(&led->flash_node[i].cdev); } mutex_destroy(&led->flash_led_lock); + wake_lock_destroy(&led->flashlight_led_lock); destroy_workqueue(led->ordered_workq); return rc; @@ -2670,6 +2698,7 @@ static int qpnp_flash_led_remove(struct spmi_device *spmi) } debugfs_remove_recursive(led->dbgfs_root); mutex_destroy(&led->flash_led_lock); + wake_lock_destroy(&led->flashlight_led_lock); destroy_workqueue(led->ordered_workq); return 0; diff --git a/drivers/leds/leds-qpnp-wled.c b/drivers/leds/leds-qpnp-wled.c index 06b80c8d312f5..cbe114cb36bbb 100644 --- a/drivers/leds/leds-qpnp-wled.c +++ b/drivers/leds/leds-qpnp-wled.c @@ -91,7 +91,7 @@ #define QPNP_WLED_BOOST_DUTY_MAX_NS 156 #define QPNP_WLED_DEF_BOOST_DUTY_NS 104 #define QPNP_WLED_SWITCH_FREQ_MASK 0x70 -#define QPNP_WLED_SWITCH_FREQ_800_KHZ 800 +#define QPNP_WLED_SWITCH_FREQ_600_KHZ 600 #define QPNP_WLED_SWITCH_FREQ_1600_KHZ 1600 #define QPNP_WLED_SWITCH_FREQ_OVERWRITE 0x80 #define QPNP_WLED_OVP_MASK GENMASK(1, 0) @@ -161,7 +161,7 @@ #define QPNP_WLED_SINK_TEST5_HYB 0x14 #define QPNP_WLED_SINK_TEST5_DIG 0x1E -#define QPNP_WLED_SWITCH_FREQ_800_KHZ_CODE 0x0B +#define QPNP_WLED_SWITCH_FREQ_600_KHZ_CODE 0x0B #define QPNP_WLED_SWITCH_FREQ_1600_KHZ_CODE 0x05 #define QPNP_WLED_DISP_SEL_REG(b) (b + 0x44) @@ -1087,7 +1087,7 @@ static int qpnp_wled_config(struct qpnp_wled *wled) if (wled->switch_freq_khz == QPNP_WLED_SWITCH_FREQ_1600_KHZ) temp = QPNP_WLED_SWITCH_FREQ_1600_KHZ_CODE; else - temp = QPNP_WLED_SWITCH_FREQ_800_KHZ_CODE; + temp = QPNP_WLED_SWITCH_FREQ_600_KHZ_CODE; rc = qpnp_wled_read_reg(wled, ®, QPNP_WLED_SWITCH_FREQ_REG(wled->ctrl_base)); @@ -1555,7 +1555,7 @@ static int qpnp_wled_parse_dt(struct qpnp_wled *wled) return rc; } - wled->switch_freq_khz = QPNP_WLED_SWITCH_FREQ_800_KHZ; + wled->switch_freq_khz = QPNP_WLED_SWITCH_FREQ_600_KHZ; rc = of_property_read_u32(spmi->dev.of_node, "qcom,switch-freq-khz", &temp_val); if (!rc) { diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 8b747528b02d4..66d2ab3ec9b83 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -233,7 +233,7 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, if (v->mode == DM_VERITY_MODE_LOGGING) return 0; - if (v->mode == DM_VERITY_MODE_RESTART) + if (v->mode == DM_VERITY_MODE_RESTART && system_state != SYSTEM_POWER_OFF) kernel_restart("dm-verity device corrupted"); return 1; diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index 6f644d870b2c6..18daac6ab23d8 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -1,4 +1,5 @@ /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -662,8 +663,139 @@ static int32_t msm_cpp_poll_rx_empty(void __iomem *cpp_base) } return rc; } +static int msm_cpp_dump_addr(struct cpp_device *cpp_dev, + struct msm_cpp_frame_info_t *frame_info) +{ + int32_t s_base, p_base; + uint32_t rd_off, wr0_off, wr1_off, wr2_off, wr3_off; + uint32_t wr0_mdata_off, wr1_mdata_off, wr2_mdata_off, wr3_mdata_off; + uint32_t rd_ref_off, wr_ref_off; + uint32_t s_size, p_size; + uint8_t tnr_enabled, ubwc_enabled, cds_en; + int32_t i = 0; + uint32_t *cpp_frame_msg; + + cpp_frame_msg = frame_info->cpp_cmd_msg; + + /* Update stripe/plane size and base offsets */ + s_base = cpp_dev->payload_params.stripe_base; + s_size = cpp_dev->payload_params.stripe_size; + p_base = cpp_dev->payload_params.plane_base; + p_size = cpp_dev->payload_params.plane_size; + + /* Fetch engine Offset */ + rd_off = cpp_dev->payload_params.rd_pntr_off; + /* Write engine offsets */ + wr0_off = cpp_dev->payload_params.wr_0_pntr_off; + wr1_off = wr0_off + 1; + wr2_off = wr1_off + 1; + wr3_off = wr2_off + 1; + /* Reference engine offsets */ + rd_ref_off = cpp_dev->payload_params.rd_ref_pntr_off; + wr_ref_off = cpp_dev->payload_params.wr_ref_pntr_off; + /* Meta data offsets */ + wr0_mdata_off = + cpp_dev->payload_params.wr_0_meta_data_wr_pntr_off; + wr1_mdata_off = (wr0_mdata_off + 1); + wr2_mdata_off = (wr1_mdata_off + 1); + wr3_mdata_off = (wr2_mdata_off + 1); + + tnr_enabled = ((frame_info->feature_mask & TNR_MASK) >> 2); + ubwc_enabled = ((frame_info->feature_mask & UBWC_MASK) >> 5); + cds_en = ((frame_info->feature_mask & CDS_MASK) >> 6); + + for (i = 0; i < frame_info->num_strips; i++) { + pr_err("stripe %d: in %x, out1 %x out2 %x, out3 %x, out4 %x\n", + i, cpp_frame_msg[s_base + rd_off + i * s_size], + cpp_frame_msg[s_base + wr0_off + i * s_size], + cpp_frame_msg[s_base + wr1_off + i * s_size], + cpp_frame_msg[s_base + wr2_off + i * s_size], + cpp_frame_msg[s_base + wr3_off + i * s_size]); + + if (tnr_enabled) { + pr_err("stripe %d: read_ref %x, write_ref %x\n", i, + cpp_frame_msg[s_base + rd_ref_off + i * s_size], + cpp_frame_msg[s_base + wr_ref_off + i * s_size] + ); + } + + if (cds_en) { + pr_err("stripe %d:, dsdn_off %x\n", i, + cpp_frame_msg[s_base + rd_ref_off + i * s_size] + ); + } + if (ubwc_enabled) { + pr_err("stripe %d: metadata %x, %x, %x, %x\n", i, + cpp_frame_msg[s_base + wr0_mdata_off + + i * s_size], + cpp_frame_msg[s_base + wr1_mdata_off + + i * s_size], + cpp_frame_msg[s_base + wr2_mdata_off + + i * s_size], + cpp_frame_msg[s_base + wr3_mdata_off + + i * s_size] + ); + } + + } + return 0; +} +static void msm_cpp_iommu_fault_handler(struct iommu_domain *domain, + struct device *dev, unsigned long iova, int flags, void *token) +{ + struct cpp_device *cpp_dev = NULL; + struct msm_cpp_frame_info_t *processed_frame[MAX_CPP_PROCESSING_FRAME]; + int32_t i = 0, queue_len = 0; + struct msm_device_queue *queue = NULL; + int32_t rc = 0; + + if (token) { + cpp_dev = token; + disable_irq(cpp_dev->irq->start); + if (atomic_read(&cpp_timer.used)) { + atomic_set(&cpp_timer.used, 0); + del_timer_sync(&cpp_timer.cpp_timer); + } + mutex_lock(&cpp_dev->mutex); + tasklet_kill(&cpp_dev->cpp_tasklet); + + rc = cpp_load_fw(cpp_dev, cpp_dev->fw_name_bin); + + if (rc < 0) { + pr_err("load fw failure %d-retry\n", rc); + rc = msm_cpp_reset_vbif_and_load_fw(cpp_dev); + if (rc < 0) { + msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8); + mutex_unlock(&cpp_dev->mutex); + return; + } + } + queue = &cpp_timer.data.cpp_dev->processing_q; + queue_len = queue->len; + if (!queue_len) { + pr_err("%s:%d: Invalid queuelen\n", __func__, __LINE__); + msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8); + mutex_unlock(&cpp_dev->mutex); + return; + } + for (i = 0; i < queue_len; i++) { + if (cpp_timer.data.processed_frame[i]) { + processed_frame[i] = + cpp_timer.data.processed_frame[i]; + pr_err("Fault on identity=0x%x, frame_id=%03d\n", + processed_frame[i]->identity, + processed_frame[i]->frame_id); + msm_cpp_dump_addr(cpp_dev, processed_frame[i]); + msm_cpp_dump_frame_cmd(processed_frame[i]); + } + } + msm_cpp_flush_queue_and_release_buffer(cpp_dev, queue_len); + msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8); + mutex_unlock(&cpp_dev->mutex); + } +} static int cpp_init_mem(struct cpp_device *cpp_dev) { int rc = 0; @@ -679,6 +811,12 @@ static int cpp_init_mem(struct cpp_device *cpp_dev) return -ENODEV; cpp_dev->iommu_hdl = iommu_hdl; + + cam_smmu_reg_client_page_fault_handler( + cpp_dev->iommu_hdl, + msm_cpp_iommu_fault_handler, cpp_dev); + + return 0; } diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c index f3a2fe0348720..f22eea05a38f1 100755 --- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c @@ -1,4 +1,5 @@ /* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -573,7 +574,11 @@ static int32_t msm_actuator_move_focus( CDBG("called, dir %d, num_steps %d\n", dir, num_steps); - if (dest_step_pos == a_ctrl->curr_step_pos) + + if ((dest_step_pos == a_ctrl->curr_step_pos) || + ((dest_step_pos <= a_ctrl->total_steps) && + (a_ctrl->step_position_table[dest_step_pos] == + a_ctrl->step_position_table[a_ctrl->curr_step_pos]))) return rc; if ((sign_dir > MSM_ACTUATOR_MOVE_SIGNED_NEAR) || @@ -812,27 +817,37 @@ static int32_t msm_actuator_park_lens(struct msm_actuator_ctrl_t *a_ctrl) next_lens_pos = a_ctrl->step_position_table[a_ctrl->curr_step_pos]; while (next_lens_pos) { /* conditions which help to reduce park lens time */ - if (next_lens_pos > (a_ctrl->park_lens.max_step * - PARK_LENS_LONG_STEP)) { - next_lens_pos = next_lens_pos - - (a_ctrl->park_lens.max_step * - PARK_LENS_LONG_STEP); - } else if (next_lens_pos > (a_ctrl->park_lens.max_step * - PARK_LENS_MID_STEP)) { - next_lens_pos = next_lens_pos - - (a_ctrl->park_lens.max_step * - PARK_LENS_MID_STEP); - } else if (next_lens_pos > (a_ctrl->park_lens.max_step * - PARK_LENS_SMALL_STEP)) { - next_lens_pos = next_lens_pos - - (a_ctrl->park_lens.max_step * - PARK_LENS_SMALL_STEP); - } else { - next_lens_pos = (next_lens_pos > - a_ctrl->park_lens.max_step) ? - (next_lens_pos - a_ctrl->park_lens. - max_step) : 0; - } + #if defined(CONFIG_D1_ROSY) + if (next_lens_pos > 400) { + next_lens_pos = 400; + } else if (next_lens_pos > 25) { + next_lens_pos = next_lens_pos - 25; + } else{ + next_lens_pos = 0; + } + #else + if (next_lens_pos > (a_ctrl->park_lens.max_step * + PARK_LENS_LONG_STEP)) { + next_lens_pos = next_lens_pos - + (a_ctrl->park_lens.max_step * + PARK_LENS_LONG_STEP); + } else if (next_lens_pos > (a_ctrl->park_lens.max_step * + PARK_LENS_MID_STEP)) { + next_lens_pos = next_lens_pos - + (a_ctrl->park_lens.max_step * + PARK_LENS_MID_STEP); + } else if (next_lens_pos > (a_ctrl->park_lens.max_step * + PARK_LENS_SMALL_STEP)) { + next_lens_pos = next_lens_pos - + (a_ctrl->park_lens.max_step * + PARK_LENS_SMALL_STEP); + } else { + next_lens_pos = (next_lens_pos > + a_ctrl->park_lens.max_step) ? + (next_lens_pos - a_ctrl->park_lens. + max_step) : 0; + } + #endif a_ctrl->func_tbl->actuator_parse_i2c_params(a_ctrl, next_lens_pos, a_ctrl->park_lens.hw_params, a_ctrl->park_lens.damping_delay); @@ -851,7 +866,11 @@ static int32_t msm_actuator_park_lens(struct msm_actuator_ctrl_t *a_ctrl) } a_ctrl->i2c_tbl_index = 0; /* Use typical damping time delay to avoid tick sound */ - usleep_range(10000, 12000); + #if defined(CONFIG_D1_ROSY) + usleep_range(13000, 14000); + #else + usleep_range(10000, 12000); + #endif } return 0; diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c index 7a9977d9409bf..3fce5d8441d47 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c +++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c @@ -1413,10 +1413,15 @@ static int32_t msm_cci_init(struct v4l2_subdev *sd, } /* Re-initialize the completion */ - reinit_completion(&cci_dev->cci_master_info[master].reset_complete); + reinit_completion(&cci_dev->cci_master_info[MASTER_0].reset_complete); for (i = 0; i < NUM_QUEUES; i++) - reinit_completion(&cci_dev->cci_master_info[master]. + reinit_completion(&cci_dev->cci_master_info[MASTER_0]. report_q[i]); + reinit_completion(&cci_dev->cci_master_info[MASTER_1].reset_complete); + for (i = 0; i < NUM_QUEUES; i++) + reinit_completion(&cci_dev->cci_master_info[MASTER_1]. + report_q[i]); + rc = msm_camera_enable_irq(cci_dev->irq, true); if (rc < 0) pr_err("%s: irq enable failed\n", __func__); diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/Makefile b/drivers/media/platform/msm/camera_v2/sensor/eeprom/Makefile index ba78a650b4ba8..eee3727adcfc9 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/Makefile +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/Makefile @@ -3,3 +3,4 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2/common ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/cci obj-$(CONFIG_MSM_EEPROM) += msm_eeprom.o +obj-y += msm_eeprom_insensor_ov13850.o diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c index dd2f9192e32f7..85e2b8f939302 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c @@ -1,4 +1,5 @@ /* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -17,9 +18,16 @@ #include "msm_sd.h" #include "msm_cci.h" #include "msm_eeprom.h" +#if defined(CONFIG_D1_ROSY) +#include "msm_eeprom_otp_interface.h" +#endif #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) +char fusionid_back_d1[64] = { 0 }; +char fusionid_front_d1[64] = { 0 }; +extern char fusionid_front[]; +extern char fusionid_back[]; DEFINE_MSM_MUTEX(msm_eeprom_mutex); #ifdef CONFIG_COMPAT @@ -1515,12 +1523,6 @@ static int msm_eeprom_config32(struct msm_eeprom_ctrl_t *e_ctrl, rc = eeprom_config_read_cal_data32(e_ctrl, argp); break; case CFG_EEPROM_INIT: - if (e_ctrl->userspace_probe == 0) { - pr_err("%s:%d Eeprom already probed at kernel boot", - __func__, __LINE__); - rc = -EINVAL; - break; - } if (e_ctrl->cal_data.num_data == 0) { rc = eeprom_init_config32(e_ctrl, argp); if (rc < 0) @@ -1576,6 +1578,35 @@ static long msm_eeprom_subdev_fops_ioctl32(struct file *file, unsigned int cmd, #endif +static uint16_t fusion_read_id_D1_back(uint8_t *data) +{ + uint16_t i; + uint8_t *fusion_id = data; + memset(fusionid_back_d1, 0, sizeof(fusionid_back_d1)); + for (i = 0; i < 16; i++) { + sprintf(fusionid_back_d1 + strlen(fusionid_back_d1), "%u", fusion_id[i]); + } + CDBG("fusionid_back: %s\n", fusionid_back_d1); + return 0; +} + +static uint16_t fusion_read_id_D1_front(uint8_t *data) +{ + uint16_t i; + uint8_t *fusion_id = data; + memset(fusionid_front_d1, 0, sizeof(fusionid_front_d1)); + for (i = 0; i < 16; i++) { + sprintf(fusionid_front_d1 + strlen(fusionid_front_d1), "%u", fusion_id[i]); + } + CDBG("fusionid_front: %s\n", fusionid_front_d1); + return 0; +} + + +static int module_id = -1; +int main_module_id = -1; +int sub_module_id = -1; + static int msm_eeprom_platform_probe(struct platform_device *pdev) { int rc = 0; @@ -1669,6 +1700,8 @@ static int msm_eeprom_platform_probe(struct platform_device *pdev) &eb_info->eeprom_name); CDBG("%s qcom,eeprom-name %s, rc %d\n", __func__, eb_info->eeprom_name, rc); + printk("%s qcom,eeprom-name %s, rc %d\n", __func__, + eb_info->eeprom_name, rc); if (rc < 0) { pr_err("%s failed %d\n", __func__, __LINE__); e_ctrl->userspace_probe = 1; @@ -1716,6 +1749,57 @@ static int msm_eeprom_platform_probe(struct platform_device *pdev) pr_err("failed rc %d\n", rc); goto memdata_free; } + + + if (!strcmp(eb_info->eeprom_name, "ov13850")) { + eeprom_init_ov13850_reg_otp(e_ctrl); + } + + +#if defined(CONFIG_D1_ROSY) + /* 1. init insensor otp */ + if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_i")) { + printk("insensor eeprom todo init the otp register!\n"); + eeprom_init_ov5675_reg_otp(e_ctrl, 0x20); + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_ii")) { + printk("insensor eeprom todo init the otp register!\n"); + eeprom_init_ov5675_reg_otp(e_ctrl, 0x6c); + } else { + printk("the eeprom is not insensor!\n"); + } + + if (!strcmp(eb_info->eeprom_name, "ovt_ov12a10_i")) { + module_id = sensor_eeprom_match_crc_id(e_ctrl, 0x00); + pr_err("eeprom %s read module id %d", eb_info->eeprom_name, module_id); + if (7 != module_id) { + pr_err("%s match id for ovt_ov12a10_i failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "sony_imx486_ii")) { + module_id = sensor_eeprom_match_crc_id(e_ctrl, 0x00); + pr_err("eeprom %s read module id %d\n", eb_info->eeprom_name, module_id); + if (1 != module_id) { + pr_err("%s match id for sony_imx486_ii failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_i")) { + module_id = sensor_eeprom_match_crc_id(e_ctrl, 0x7010); + pr_err("eeprom %s read module id %d\n", eb_info->eeprom_name, module_id); + if (6 != module_id) { + pr_err("%s match id for ovt_ov5675_i failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_ii")) { + module_id = sensor_eeprom_match_crc_id(e_ctrl, 0x7010); + pr_err("eeprom %s read module id %d\n", eb_info->eeprom_name, module_id); + if (7 != module_id) { + pr_err("%s match id for ovt_ov5675_ii failed\n", __func__); + goto power_down; + } + } +#endif + + rc = read_eeprom_memory(e_ctrl, &e_ctrl->cal_data); if (rc < 0) { pr_err("%s read_eeprom_memory failed\n", __func__); @@ -1725,6 +1809,314 @@ static int msm_eeprom_platform_probe(struct platform_device *pdev) CDBG("memory_data[%d] = 0x%X\n", j, e_ctrl->cal_data.mapdata[j]); + if (!strcmp(eb_info->eeprom_name, "s5k3l8_ofilm")) { + CDBG("match id for s5k3l8_ofilm\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for s5k3l8_ofilm module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for s5k3l8_ofilm success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for s5k3l8_ofilm failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k3l8_ofilm_riva")) { + CDBG("match id for s5k3l8_ofilm_riva\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for s5k3l8_ofilm_riva module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for s5k3l8_ofilm_riva success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for s5k3l8_ofilm_riva failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k3l8_sunny")) { + CDBG("match id for s5k3l8_sunny\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for s5k3l8_sunny module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for s5k3l8_sunny success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for s5k3l8_sunny failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ov13855_qtech")) { + CDBG("match id for ov13855_qtech\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for ov13855_qtech module_id=%d\n", module_id); + if (module_id == 11) { + CDBG("match id for ov13855_qtech success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for ov13855_qtech failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ov13855_sunny")) { + CDBG("match id for ov13855_sunny\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for ov13855_sunny module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for ov13855_sunny success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for ov13855_sunny failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ov13850")) { + + printk("match id for ov13850 AWB:[mapdata[8]:0x%x, mapdata[9]:0x%x; mapdata[0]:0x%x, mapdata[1]:0x%x] AF:[mapdata[16]:0x%x mapdata[24]:0x%x] LSC:[mapdata[32]:0x%x mapdata[221]:0x%x]\n", + e_ctrl->cal_data.mapdata[8], e_ctrl->cal_data.mapdata[9]&0x1f, e_ctrl->cal_data.mapdata[0], e_ctrl->cal_data.mapdata[1]&0x1f, + e_ctrl->cal_data.mapdata[16], e_ctrl->cal_data.mapdata[24], e_ctrl->cal_data.mapdata[32], e_ctrl->cal_data.mapdata[221]); + if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for ov13850 module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for ov13850 success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for ov13850 failed\n", __func__); + goto power_down; + } + ov13850_eeprom_sensor_writereg(e_ctrl, 0x0100, 0x00, 1); + + } else if (!strcmp(eb_info->eeprom_name, "s5k3l2")) { + CDBG("match id for s5k3l2\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for s5k3l2 module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for s5k3l2 success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for s5k3l2 failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ov5675_ofilm")) { + CDBG("match id for ov5675_ofilm\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for ov5675_ofilm module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for ov5670_ofilm success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for ov5670_ofilm failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_i")) { + CDBG("match id for ovt_ov5675_i\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + + } else if (e_ctrl->cal_data.mapdata[80] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[81] & 0x1f; + + } else { + module_id = -1; + } + printk("match id for ovt_ov5675_i module_id=%d\n", module_id); + if (module_id == 6) { + CDBG("match id for ovt_ov5675_i success\n"); + sub_module_id = module_id; + fusion_read_id_D1_front(&e_ctrl->cal_data.mapdata[16]); + strcpy(fusionid_front, fusionid_front_d1 + strlen(fusionid_front_d1)); + } else { + pr_err("%s match id for ovt_ov5675_i failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_ii")) { + CDBG("match id for ovt_ov5675_ii\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + + } else if (e_ctrl->cal_data.mapdata[80] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[81] & 0x1f; + + } else { + module_id = -1; + } + printk("match id for ovt_ov5675_ii module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for ovt_ov5675_ii success\n"); + sub_module_id = module_id; + fusion_read_id_D1_front(&e_ctrl->cal_data.mapdata[16]); + strcpy(fusionid_front, fusionid_front_d1 + strlen(fusionid_front_d1)); + } else { + pr_err("%s match id for ovt_ov5675_ii failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k5e8_sunny")) { + CDBG("match id for s5k5e8_sunny\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for s5k5e8_sunny module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for s5k5e8_sunny success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for s5k5e8_sunny failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k5e8_ofilm_riva")) { + CDBG("match id for s5k5e8_ofilm_riva\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for s5k5e8_ofilm_riva module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for s5k5e8_ofilm_riva success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for s5k5e8_ofilm_riva failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ov5675")) { + CDBG("match id for ov5675\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for ov5675 module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for ov5675 success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for ov5670 failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k5e8_qtech_riva")) { + CDBG("match id for s5k5e8_qtech_riva\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for s5k5e8_qtech_riva module_id=%d\n", module_id); + if (module_id == 11) { + CDBG("match id for s5k5e8_qtech_riva success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for s5k5e8_qtech_riva failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k5e8_ofilm")) { + CDBG("match id for s5k5e8_ofilm\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for s5k5e8_ofilm module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for s5k5e8_ofilm success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for s5k5e8_ofilm failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov12a10_i")) { + CDBG("match id for ovt_ov12a10_i\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for ovt_ov12a10_i module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for ovt_ov12a10_i success\n"); + main_module_id = module_id; + fusion_read_id_D1_back(&e_ctrl->cal_data.mapdata[16]); + strcpy(fusionid_back, fusionid_back_d1 + strlen(fusionid_back_d1)); + } else { + pr_err("%s match id for ovt_ov12a10_i failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "sony_imx486_ii")) { + CDBG("match id for sony_imx486_ii\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for sony_imx486_ii module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for sony_imx486_ii success\n"); + main_module_id = module_id; + fusion_read_id_D1_back(&e_ctrl->cal_data.mapdata[16]); + strcpy(fusionid_back, fusionid_back_d1 + strlen(fusionid_back_d1)); + } else { + pr_err("%s match id for sony_imx486_ii failed\n", __func__); + goto power_down; + } + } else { + pr_err("%s eeprom name match failed\n", __func__); + goto power_down; + } + CDBG("%s eeprom module id: main_module_id=%d sub_module_id=%d\n", __func__, main_module_id, sub_module_id); + e_ctrl->is_supported |= msm_eeprom_match_crc(&e_ctrl->cal_data); rc = msm_camera_power_down(power_info, diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.h b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.h index 5e348a8001a6a..fdd8a80e653ae 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.h +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.h @@ -1,4 +1,5 @@ /* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -48,4 +49,7 @@ struct msm_eeprom_ctrl_t { uint8_t is_supported; }; +extern int ov13850_eeprom_sensor_writereg(struct msm_eeprom_ctrl_t *s_ctrl, uint32_t reg_addr, uint32_t reg_value, uint32_t delay); +extern int eeprom_init_ov13850_reg_otp(struct msm_eeprom_ctrl_t *e_ctrl); + #endif diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_insensor_ov13850.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_insensor_ov13850.c new file mode 100644 index 0000000000000..1dfed860b65a1 --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_insensor_ov13850.c @@ -0,0 +1,62 @@ +#include "msm_sd.h" +#include "msm_eeprom.h" +#include "msm_cci.h" +#include "msm_camera_io_util.h" +#include "msm_camera_i2c_mux.h" +#include + +static uint16_t ov13850_eeprom_sensor_readreg( + struct msm_eeprom_ctrl_t *s_ctrl, uint32_t reg_addr) +{ + uint16_t reg_value = 0; + s_ctrl->i2c_client.i2c_func_tbl->i2c_read( + &(s_ctrl->i2c_client), + reg_addr, + ®_value, MSM_CAMERA_I2C_BYTE_DATA); + return reg_value ; +} + +int ov13850_eeprom_sensor_writereg( + struct msm_eeprom_ctrl_t *s_ctrl, uint32_t reg_addr, uint32_t reg_value, uint32_t delay) +{ + int rc = 0; + rc = s_ctrl->i2c_client.i2c_func_tbl->i2c_write( + &(s_ctrl->i2c_client), reg_addr, reg_value, MSM_CAMERA_I2C_BYTE_DATA); + msleep(delay); + return rc; +} + +int eeprom_init_ov13850_reg_otp(struct msm_eeprom_ctrl_t *e_ctrl) +{ + int rc = 0, temp = 0; + if (!e_ctrl) { + pr_err("%s e_ctrl is NULL\n", __func__); + return -EINVAL; + } + + e_ctrl->i2c_client.addr_type = MSM_CAMERA_I2C_WORD_ADDR; + e_ctrl->i2c_client.cci_client->sid = 0x20 >> 1; + + + rc = ov13850_eeprom_sensor_writereg(e_ctrl, 0x0100, 0x01, 1); + + + temp = ov13850_eeprom_sensor_readreg(e_ctrl, 0x5002); + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x5002, (temp&(~0x02)), 0); + printk("%s %d E temp=0x%x\n", __func__, __LINE__, temp); + + + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x3d88, 0x72, 0); + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x3d89, 0x20, 0); + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x3d8a, 0x73, 0); + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x3d8b, 0xb9, 0); + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x3d81, 0x01, 10); + + if (rc < 0) { + pr_err("i2c write faild\n"); + return rc; + } + + return rc; +} + diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_otp_interface.h b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_otp_interface.h new file mode 100644 index 0000000000000..4ee86280bb9aa --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_otp_interface.h @@ -0,0 +1,90 @@ +/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#ifndef MSM_EEPROM_INSENSOR_H +#define MSM_EEPROM_INSENSOR_H + +static uint16_t eeprom_sensor_readreg( + struct msm_eeprom_ctrl_t *s_ctrl, uint32_t reg_addr) +{ + uint16_t reg_value = 0; + s_ctrl->i2c_client.i2c_func_tbl->i2c_read( + &(s_ctrl->i2c_client), + reg_addr, + ®_value, MSM_CAMERA_I2C_BYTE_DATA); + return reg_value ; +} + +static int eeprom_sensor_writereg( + struct msm_eeprom_ctrl_t *s_ctrl, uint32_t reg_addr, uint32_t reg_value, uint32_t delay) +{ + int rc = 0; + rc = s_ctrl->i2c_client.i2c_func_tbl->i2c_write( + &(s_ctrl->i2c_client), reg_addr, reg_value, MSM_CAMERA_I2C_BYTE_DATA); + msleep(delay); + return rc; +} + +static int eeprom_init_ov5675_reg_otp(struct msm_eeprom_ctrl_t *e_ctrl, uint16_t addr) +{ + int rc = 0; + if (!e_ctrl) { + pr_err("%s e_ctrl is NULL\n", __func__); + return -EINVAL; + } + + printk("%s %d E\n", __func__, __LINE__); + + e_ctrl->i2c_client.addr_type = MSM_CAMERA_I2C_WORD_ADDR; + e_ctrl->i2c_client.cci_client->sid = addr >> 1; + rc = eeprom_sensor_writereg(e_ctrl, 0x3d88, 0x7010, 1); + if (rc < 0) { + pr_err("i2c write faild\n"); + return rc; + } + rc = eeprom_sensor_writereg(e_ctrl, 0x3d8a, 0x70a4, 1); + if (rc < 0) { + pr_err("i2c write faild\n"); + return rc; + } + rc = eeprom_sensor_writereg(e_ctrl, 0x3d81, 0x01, 1); + if (rc < 0) { + pr_err("i2c write faild\n"); + return rc; + } + rc = eeprom_sensor_writereg(e_ctrl, 0x0100, 0x01, 1); + if (rc < 0) { + pr_err("i2c write faild\n"); + return rc; + } + + printk("%s : %d X\n", __func__, __LINE__); + + return 0; +} + +static uint16_t sensor_eeprom_match_crc_id(struct msm_eeprom_ctrl_t *e_ctrl, uint32_t addr) +{ + uint16_t data = 0; + e_ctrl->i2c_client.addr_type = MSM_CAMERA_I2C_WORD_ADDR; + + data = eeprom_sensor_readreg(e_ctrl, addr); + + if (0x01 != data) { + pr_err("eeprom match otp id failed! map valid data is %x !\n", data); + return -EPERM; + } + data = eeprom_sensor_readreg(e_ctrl, addr+1); + + return data; +} +#endif diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c index 680e7d946a2b8..075f342a113a1 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c +++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c @@ -1,4 +1,5 @@ /* Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -23,7 +24,7 @@ #define CDBG(fmt, args...) pr_debug(fmt, ##args) DEFINE_MSM_MUTEX(msm_flash_mutex); - +struct msm_flash_ctrl_t *flash_ctrl_wt = NULL; static struct v4l2_file_operations msm_flash_v4l2_subdev_fops; static struct led_trigger *torch_trigger; @@ -61,13 +62,16 @@ void msm_torch_brightness_set(struct led_classdev *led_cdev, pr_err("No torch trigger found, can't set brightness\n"); return; } - led_trigger_event(torch_trigger, value); + if (value == LED_OFF) { + led_trigger_event(flash_ctrl_wt->switch_trigger, 0); + } else + led_trigger_event(flash_ctrl_wt->switch_trigger, 1); }; static struct led_classdev msm_torch_led[MAX_LED_TRIGGERS] = { { - .name = "torch-light0", + .name = "flashlight", .brightness_set = msm_torch_brightness_set, .brightness = LED_OFF, }, @@ -579,7 +583,11 @@ static int32_t msm_flash_low( led_trigger_event(flash_ctrl->flash_trigger[i], 0); /* Turn on flash triggers */ + #if defined(CONFIG_D1_ROSY) for (i = 0; i < flash_ctrl->torch_num_sources; i++) { + #else + for (i = 0; i < flash_ctrl->torch_num_sources - 1; i++) { + #endif if (flash_ctrl->torch_trigger[i]) { max_current = flash_ctrl->torch_max_current[i]; if (flash_data->flash_current[i] >= 0 && @@ -602,6 +610,69 @@ static int32_t msm_flash_low( return 0; } +static int32_t msm_gpio_flash_low( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ + CDBG("Enter\n"); + gpio_direction_output(93, 1); + return 0; +} + +static int32_t msm_gpio_flash_high( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ + CDBG("Enter\n"); + gpio_direction_output(90, 1); + return 0; +} + +static int32_t msm_gpio_flash_off( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ + CDBG("Enter\n"); + gpio_direction_output(90, 0); + gpio_direction_output(93, 0); + return 0; +} + + +int flag_led = 0; + +int32_t wt_flash_flashlight(bool boolean) +{ + uint32_t curr = 0; + int32_t i = 0; + + if (boolean) + curr = 100; + else + curr = 0; + + if (flag_led > 0 && boolean == 0) { + return 0; + } + + if (flash_ctrl_wt) { + CDBG("WT Enter\n"); + /* Turn on flash triggers */ + CDBG("WT_XJB flash_ctrl_wt->torch_num_sources = %d", flash_ctrl_wt->torch_num_sources); + for (i = 0; i < flash_ctrl_wt->torch_num_sources - 1; i++) { + CDBG("WT low_flash_current[%d] = %d\n", i, curr); + if (flash_ctrl_wt->torch_trigger[i]) { + led_trigger_event(flash_ctrl_wt->torch_trigger[i], + curr); + } + } + if (flash_ctrl_wt->switch_trigger) + led_trigger_event(flash_ctrl_wt->switch_trigger, 1); + CDBG("WT Exit\n"); + } + return 0; +} + static int32_t msm_flash_high( struct msm_flash_ctrl_t *flash_ctrl, struct msm_flash_cfg_data_t *flash_data) @@ -611,10 +682,14 @@ static int32_t msm_flash_high( int32_t i = 0; /* Turn off torch triggers */ - for (i = 0; i < flash_ctrl->torch_num_sources; i++) + #if defined(CONIFG_D1_ROSY) + for (i = 0; i < flash_ctrl->torch_num_sources; i++) { + #else + for (i = 0; i < flash_ctrl->torch_num_sources - 1; i++) { + #endif if (flash_ctrl->torch_trigger[i]) led_trigger_event(flash_ctrl->torch_trigger[i], 0); - + } /* Turn on flash triggers */ for (i = 0; i < flash_ctrl->flash_num_sources; i++) { if (flash_ctrl->flash_trigger[i]) { @@ -661,7 +736,7 @@ static int32_t msm_flash_release( static int32_t msm_flash_config(struct msm_flash_ctrl_t *flash_ctrl, void __user *argp) { - int32_t rc = 0; + int32_t rc = -EINVAL; struct msm_flash_cfg_data_t *flash_data = (struct msm_flash_cfg_data_t *) argp; @@ -669,6 +744,14 @@ static int32_t msm_flash_config(struct msm_flash_ctrl_t *flash_ctrl, CDBG("Enter %s type %d\n", __func__, flash_data->cfg_type); + if (flash_data->cfg_type == 2 && flag_led > 0) { + flag_led--; + } else if (flash_data->cfg_type == 3) { + flag_led++; + } else if (flash_data->cfg_type == 1) { + flag_led = 0; + } + switch (flash_data->cfg_type) { case CFG_FLASH_INIT: rc = msm_flash_init_prepare(flash_ctrl, flash_data); @@ -947,6 +1030,7 @@ static int32_t msm_flash_get_dt_data(struct device_node *of_node, struct msm_flash_ctrl_t *fctrl) { int32_t rc = 0; + struct device_node *switch_src_node_pmic = NULL; CDBG("called\n"); @@ -980,13 +1064,15 @@ static int32_t msm_flash_get_dt_data(struct device_node *of_node, } /* Read the flash and torch source info from device tree node */ + switch_src_node_pmic = of_parse_phandle(of_node, "qcom,switch-source", 0); + if (switch_src_node_pmic) { rc = msm_flash_get_pmic_source_info(of_node, fctrl); if (rc < 0) { pr_err("%s:%d msm_flash_get_pmic_source_info failed rc %d\n", __func__, __LINE__, rc); return rc; + } } - /* Read the gpio information from device tree */ rc = msm_sensor_driver_get_gpio_data( &(fctrl->power_info.gpio_conf), of_node); @@ -1155,7 +1241,7 @@ static int32_t msm_flash_platform_probe(struct platform_device *pdev) msm_flash_subdev_fops_ioctl; #endif flash_ctrl->msm_sd.sd.devnode->fops = &msm_flash_v4l2_subdev_fops; - + flash_ctrl_wt = flash_ctrl; if (flash_ctrl->flash_driver_type == FLASH_DRIVER_PMIC) rc = msm_torch_create_classdev(pdev, flash_ctrl); @@ -1207,9 +1293,9 @@ static struct msm_flash_table msm_gpio_flash_table = { .func_tbl = { .camera_flash_init = msm_flash_gpio_init, .camera_flash_release = msm_flash_release, - .camera_flash_off = msm_flash_off, - .camera_flash_low = msm_flash_low, - .camera_flash_high = msm_flash_high, + .camera_flash_off = msm_gpio_flash_off, + .camera_flash_low = msm_gpio_flash_low, + .camera_flash_high = msm_gpio_flash_high, }, }; diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c old mode 100755 new mode 100644 index f8f28702e4c22..6cf75928d463d --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c @@ -1,4 +1,5 @@ /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -17,12 +18,15 @@ #include "camera.h" #include "msm_cci.h" #include "msm_camera_dt_util.h" +#include /* Logging macro */ #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) #define SENSOR_MAX_MOUNTANGLE (360) +char fusionid_back[64] = { 0 }; +char fusionid_front[64] = { 0 }; static struct v4l2_file_operations msm_sensor_v4l2_subdev_fops; static int32_t msm_sensor_driver_platform_probe(struct platform_device *pdev); @@ -635,6 +639,224 @@ static void msm_sensor_fill_sensor_info(struct msm_sensor_ctrl_t *s_ctrl, strlcpy(entity_name, s_ctrl->msm_sd.sd.entity.name, MAX_SENSOR_NAME); } +extern int main_module_id; +extern int sub_module_id; + +#if defined(CONFIG_D1_ROSY) +static const char *module_info[] = { + "Unkonw", + "Sunny", + "Unkonw", + "Semco", + "Unkonw", + "Unkonw", + "Qtech", + "Ofilm", + "Unkonw", + "Unkonw", + "Unkonw", + "Unkonw", + "Unknow", + "Unknow", + "Unknow", + "Liteon", +}; +#else +static const char *module_info[] = { + "Unkonw", + "Sunny", + "Huaquan", + "Fushikang", + "Guangzhen", + "Daling", + "Xinli", + "O-film", + "Boyi", + "Sanglaishi", + "Qunhui", + "Q-Tech", + "Unknow", + "Unknow", + "Unknow", + "Unknow", +}; +#endif +ssize_t kobj_fusion_id_show_back(struct kobject *kobject, struct attribute *attr, char *buf); +struct attribute camera_attr_back = { + .name = "fusion_id_back", + .mode = S_IRWXUGO, +}; + +static struct attribute *def_attrs_back[] = { + &camera_attr_back, + NULL, +}; + +struct sysfs_ops obj_camera_sysops_back = { + .show = kobj_fusion_id_show_back, + .store = NULL, +}; + +struct kobj_type ktype_back = { + .release = NULL, + .sysfs_ops = &obj_camera_sysops_back, + .default_attrs = def_attrs_back, +}; + + +ssize_t kobj_fusion_id_show_back(struct kobject *kobject, struct attribute *attr, char *buf) +{ + CDBG("back_attrname:%s", attr->name); + return sprintf(buf, "%s", fusionid_back); +} + +struct kobject kobj_back; +ssize_t kobj_fusion_id_show_front(struct kobject *kobject, struct attribute *attr, char *buf); +struct attribute camera_attr_front = { + .name = "fusion_id_front", + .mode = S_IRWXUGO, +}; + +static struct attribute *def_attrs_front[] = { + &camera_attr_front, + NULL, +}; + +struct sysfs_ops obj_camera_sysops_front = { + .show = kobj_fusion_id_show_front, + .store = NULL, +}; + +struct kobj_type ktype_front = { + .release = NULL, + .sysfs_ops = &obj_camera_sysops_front, + .default_attrs = def_attrs_front, +}; + + +ssize_t kobj_fusion_id_show_front(struct kobject *kobject, struct attribute *attr, char *buf) +{ + CDBG("front_attrname:%s", attr->name); + return sprintf(buf, "%s", fusionid_front); +} + +struct kobject kobj_front; + +static uint16_t fusion_read_id_s5k3l8(struct msm_sensor_ctrl_t *s_ctrl) +{ + uint16_t value1, value3, value5; + + struct msm_camera_i2c_client *sensor_i2c_client; + sensor_i2c_client = s_ctrl->sensor_i2c_client; + + memset(fusionid_back, 0, sizeof(fusionid_back)); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0100, 0x0100, 2); + mdelay(10); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0a02, 0x0000, 2); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0a00, 0x0100, 2); + mdelay(10); + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x0a24, &value1, 2); + CDBG(" s5k3l8 fusion_sensor_readreg value1 =%d\n", value1); + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x0a26, &value3, 2); + CDBG(" s5k3l8 fusion_sensor_readreg value3 =%d\n", value3); + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x0a28, &value5, 1); + CDBG(" s5k3l8 fusion_sensor_readreg value5 =%d\n", value5); + sprintf(fusionid_back, "%d%d%d", value1, value3, value5); + CDBG(" s5k3l8 fusion_sensor_readreg fusionid=%s\n", fusionid_back); + return 0; +} + +static uint16_t fusion_read_id_ov5675(struct msm_sensor_ctrl_t *s_ctrl) +{ + uint16_t data[15] = {0}; + uint16_t *p = NULL; + uint8_t i; + struct msm_camera_i2c_client *sensor_i2c_client; + sensor_i2c_client = s_ctrl->sensor_i2c_client; + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0100, 0x01, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x5001, 0x02, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d84, 0xC0, 1); + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d88, 0x70, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d89, 0x00, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d8a, 0x70, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d8b, 0x0f, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d81, 0x01, 1); + mdelay(10); + + p = data; + + memset(fusionid_front, 0, sizeof(fusionid_front)); + for (i = 0; i < 15; i++) { + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x7000+i, p+i, 1); + CDBG("data[%d]=%x\n", i, data[i]); + sprintf(fusionid_front + strlen(fusionid_front), "%u", data[i]); + } + CDBG("fusionid_front=%s\n", fusionid_front); + return 0; +} + +static uint16_t fusion_read_id_s5k5e8(struct msm_sensor_ctrl_t *s_ctrl) +{ + uint16_t data[8] = {0}; + uint16_t *p = NULL; + uint8_t i; + struct msm_camera_i2c_client *sensor_i2c_client; + sensor_i2c_client = s_ctrl->sensor_i2c_client; + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0a00, 0x04&0x00ff, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0a02, 0x00&0x00ff, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0a00, 0x01&0x00ff, 1); + mdelay(10); + p = data; + + memset(fusionid_front, 0, sizeof(fusionid_front)); + for (i = 0; i < 8; i++) { + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x0a04+i, p+i, 1); + CDBG("data[%d]=%x\n", i, data[i]); + sprintf(fusionid_front + strlen(fusionid_front), "%u", data[i]); + } + CDBG("fusionid_front=%s\n", fusionid_front); + + return 0; +} + +static uint16_t fusion_read_id_ov13855(struct msm_sensor_ctrl_t *s_ctrl) +{ + uint16_t data[16] = {0}; + uint16_t *p = NULL; + uint16_t temp1 = 0x0; + uint8_t i; + struct msm_camera_i2c_client *sensor_i2c_client; + sensor_i2c_client = s_ctrl->sensor_i2c_client; + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0100, 0x01, 1); + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x5000, &temp1, 1); + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x5000, (0x00 & 0x10) | (temp1 & (~0x10)), 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d84, 0xC0, 1); + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d88, 0x70, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d89, 0x00, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d8a, 0x70, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d8b, 0x0f, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d81, 0x01, 1); + mdelay(10); + + p = data; + + memset(fusionid_back, 0, sizeof(fusionid_back)); + for (i = 0; i < 15; i++) { + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x7000+i, p+i, 1); + CDBG("data[%d]=%x\n", i, data[i]); + sprintf(fusionid_back + strlen(fusionid_back), "%u", data[i]); + } + CDBG("fusionid_back=%s\n", fusionid_back); + return 0; +} + + /* static function definition */ int32_t msm_sensor_driver_probe(void *setting, struct msm_sensor_info_t *probed_info, char *entity_name) @@ -750,6 +972,119 @@ int32_t msm_sensor_driver_probe(void *setting, goto free_slave_info; } + + if (!strcmp(slave_info->sensor_name, "s5k3l8_ofilm")) { + if (main_module_id != 7) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k3l8_ofilm_riva")) { + if (main_module_id != 7) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k3l8_sunny")) { + if (main_module_id != 1) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ov13855_sunny")) { + if (main_module_id != 1) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ov13855_qtech")) { + if (main_module_id != 11) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ov13850_q13v06k")) { + if (main_module_id != 1) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k3l2")) { + if (main_module_id != 7) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ov5675_ofilm")) { + if (sub_module_id != 7) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ovt_ov5675_i")) { + if (sub_module_id != 6) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ovt_ov5675_ii")) { + if (sub_module_id != 7) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "sony_imx486_ii")) { + if (main_module_id != 1) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k5e8_sunny")) { + if (sub_module_id != 1) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ov5675")) { + if (sub_module_id != 1) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k5e8_ofilm")) { + if (sub_module_id != 7) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k5e8_qtech_riva")) { + if (sub_module_id != 11) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k5e8_ofilm_riva")) { + if (sub_module_id != 7) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ovt_ov12a10_i")) { + if (main_module_id != 7) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else { + pr_err("sensor name is %s, is nothing to do", slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + + pr_err("%s:%d camera sensor probe %s", __func__, __LINE__, slave_info->sensor_name); + + rc = kobject_init_and_add(&kobj_back, &ktype_back, NULL, "camera_fusion_id_back"); + rc = kobject_init_and_add(&kobj_front, &ktype_front, NULL, "camera_fusion_id_front"); /* Extract s_ctrl from camera id */ s_ctrl = g_sctrl[slave_info->camera_id]; if (!s_ctrl) { @@ -898,8 +1233,19 @@ int32_t msm_sensor_driver_probe(void *setting, pr_err("%s power up failed", slave_info->sensor_name); goto free_camera_info; } + if (!strcmp(slave_info->sensor_name, "ov13855_qtech")) { + fusion_read_id_ov13855(s_ctrl); + } else if (!strcmp(slave_info->sensor_name, "s5k3l8_ofilm_riva")) { + fusion_read_id_s5k3l8(s_ctrl); + } else if (!strcmp(slave_info->sensor_name, "ov5675_ofilm")) { + fusion_read_id_ov5675(s_ctrl); + } else if ((!strcmp(slave_info->sensor_name, "s5k5e8_qtech_riva")) || (!strcmp(slave_info->sensor_name, "s5k5e8_ofilm_riva"))) { + fusion_read_id_s5k5e8(s_ctrl); + } else { + printk("read fusion id fail\n"); + } - pr_err("%s probe succeeded", slave_info->sensor_name); + printk("camera sensor probe %s succeeded\n", slave_info->sensor_name); /* * Update the subdevice id of flash-src based on availability in kernel. @@ -953,6 +1299,19 @@ int32_t msm_sensor_driver_probe(void *setting, msm_sensor_fill_sensor_info(s_ctrl, probed_info, entity_name); + hardwareinfo_set_prop(probed_info->position == BACK_CAMERA_B + ? HARDWARE_BACK_CAM:HARDWARE_FRONT_CAM, probed_info->sensor_name); + if (main_module_id > 0) { + hardwareinfo_set_prop(HARDWARE_BACK_CAM_MOUDULE_ID, module_info[main_module_id]); + } else{ + hardwareinfo_set_prop(HARDWARE_BACK_CAM_MOUDULE_ID, module_info[0]); + } + if (sub_module_id > 0) { + hardwareinfo_set_prop(HARDWARE_FRONT_CAM_MOUDULE_ID, module_info[sub_module_id]); + } else{ + hardwareinfo_set_prop(HARDWARE_FRONT_CAM_MOUDULE_ID, module_info[0]); + } + /* * Set probe succeeded flag to 1 so that no other camera shall * probed on this slot diff --git a/drivers/media/radio/radio-iris-transport.c b/drivers/media/radio/radio-iris-transport.c index c6e432fdd27de..1f5efc022b467 100644 --- a/drivers/media/radio/radio-iris-transport.c +++ b/drivers/media/radio/radio-iris-transport.c @@ -9,6 +9,7 @@ * * Copyright (C) 2002-2003 Maxim Krasnyansky * Copyright (C) 2004-2006 Marcel Holtmann + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 @@ -210,6 +211,9 @@ static void radio_hci_smd_deregister(void) { FMDBG(""); + /* may deregistered by hcismd_fm_set_enable already */ + if (hs.hdev == NULL) + return; radio_hci_unregister_dev(); kfree(hs.hdev); hs.hdev = NULL; diff --git a/drivers/media/radio/radio-iris.c b/drivers/media/radio/radio-iris.c index eb364e8d95ddb..f9e60653087f7 100644 --- a/drivers/media/radio/radio-iris.c +++ b/drivers/media/radio/radio-iris.c @@ -3344,6 +3344,7 @@ static int iris_vidioc_g_ctrl(struct file *file, void *priv, struct hci_fm_def_data_rd_req rd; int lsb, msb; + mutex_lock(&fm_smd_enable); if (unlikely(radio == NULL)) { FMDERR(":radio is null"); retval = -EINVAL; @@ -3681,6 +3682,7 @@ static int iris_vidioc_g_ctrl(struct file *file, void *priv, } END: + mutex_unlock(&fm_smd_enable); if (retval > 0) retval = -EINVAL; if (ctrl != NULL && retval < 0) @@ -3697,6 +3699,7 @@ static int iris_vidioc_g_ext_ctrls(struct file *file, void *priv, struct iris_device *radio = video_get_drvdata(video_devdata(file)); struct hci_fm_def_data_rd_req default_data_rd; + mutex_lock(&fm_smd_enable); if (unlikely(radio == NULL)) { FMDERR(":radio is null"); retval = -EINVAL; @@ -3728,6 +3731,7 @@ static int iris_vidioc_g_ext_ctrls(struct file *file, void *priv, } END: + mutex_unlock(&fm_smd_enable); if (retval > 0) retval = -EINVAL; @@ -3750,6 +3754,7 @@ static int iris_vidioc_s_ext_ctrls(struct file *file, void *priv, struct iris_device *radio = video_get_drvdata(video_devdata(file)); char *data = NULL; + mutex_lock(&fm_smd_enable); if (unlikely(radio == NULL)) { FMDERR(":radio is null"); retval = -EINVAL; @@ -3961,6 +3966,7 @@ static int iris_vidioc_s_ext_ctrls(struct file *file, void *priv, } END: + mutex_unlock(&fm_smd_enable); if (retval > 0) retval = -EINVAL; @@ -3984,6 +3990,7 @@ static int iris_vidioc_s_ctrl(struct file *file, void *priv, __u8 intf_det_low_th, intf_det_high_th, intf_det_out; unsigned int spur_freq; + mutex_lock(&fm_smd_enable); if (unlikely(radio == NULL)) { FMDERR(":radio is null"); retval = -EINVAL; @@ -4984,6 +4991,7 @@ static int iris_vidioc_s_ctrl(struct file *file, void *priv, } END: + mutex_unlock(&fm_smd_enable); if (retval > 0) retval = -EINVAL; @@ -5087,11 +5095,12 @@ static int iris_vidioc_g_tuner(struct file *file, void *priv, FMDERR("Invalid Tuner Index"); return -EINVAL; } + mutex_lock(&fm_smd_enable); if (radio->mode == FM_RECV) { retval = hci_cmd(HCI_FM_GET_STATION_PARAM_CMD, radio->fm_hdev); if (retval < 0) { FMDERR("Failed to Get station params"); - return retval; + goto END; } tuner->type = V4L2_TUNER_RADIO; tuner->rangelow = @@ -5107,16 +5116,20 @@ static int iris_vidioc_g_tuner(struct file *file, void *priv, retval = hci_cmd(HCI_FM_GET_TX_CONFIG, radio->fm_hdev); if (retval < 0) { FMDERR("get Tx config failed %d\n", retval); - return retval; + goto END; } tuner->type = V4L2_TUNER_RADIO; tuner->rangelow = radio->trans_conf.band_low_limit * TUNE_PARAM; tuner->rangehigh = radio->trans_conf.band_high_limit * TUNE_PARAM; - } else - return -EINVAL; - return 0; + } else { + retval = -EINVAL; + goto END; + } +END: + mutex_unlock(&fm_smd_enable); + return retval; } static int iris_vidioc_s_tuner(struct file *file, void *priv, @@ -5138,6 +5151,7 @@ static int iris_vidioc_s_tuner(struct file *file, void *priv, if (tuner->index > 0) return -EINVAL; + mutex_lock(&fm_smd_enable); if (radio->mode == FM_RECV) { radio->recv_conf.band_low_limit = tuner->rangelow / TUNE_PARAM; radio->recv_conf.band_high_limit = @@ -5153,17 +5167,22 @@ static int iris_vidioc_s_tuner(struct file *file, void *priv, &radio->stereo_mode, radio->fm_hdev); } - if (retval < 0) + if (retval < 0) { FMDERR(": set tuner failed with %d\n", retval); - return retval; + goto END; + } } else if (radio->mode == FM_TRANS) { radio->trans_conf.band_low_limit = tuner->rangelow / TUNE_PARAM; radio->trans_conf.band_high_limit = tuner->rangehigh / TUNE_PARAM; - } else - return -EINVAL; + } else { + retval = -EINVAL; + goto END; + } +END: + mutex_unlock(&fm_smd_enable); return retval; } @@ -5200,6 +5219,7 @@ static int iris_vidioc_s_frequency(struct file *file, void *priv, if (freq->type != V4L2_TUNER_RADIO) return -EINVAL; + mutex_lock(&fm_smd_enable); /* We turn off RDS prior to tuning to a new station. because of a bug in SoC which prevents tuning during RDS transmission. @@ -5224,6 +5244,7 @@ static int iris_vidioc_s_frequency(struct file *file, void *priv, radio->fm_hdev); } + mutex_unlock(&fm_smd_enable); if (retval < 0) FMDERR(" set frequency failed with %d\n", retval); return retval; @@ -5240,6 +5261,7 @@ static int iris_fops_release(struct file *file) FMDBG("state %d", radio->mode); mutex_lock(&radio->lock); + mutex_lock(&fm_smd_enable); if (radio->mode == FM_OFF) goto END; @@ -5260,12 +5282,12 @@ static int iris_fops_release(struct file *file) radio->is_fm_closing = false; } else if (radio->mode == FM_CALIB) { radio->mode = FM_OFF; + mutex_unlock(&fm_smd_enable); mutex_unlock(&radio->lock); return retval; } END: FMDBG("mode %d", radio->mode); - mutex_lock(&fm_smd_enable); if (radio->fm_hdev != NULL) radio->fm_hdev->close_smd(); mutex_unlock(&fm_smd_enable); diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c index cade82fbebcf2..4b611fe0f9ecb 100644 --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c @@ -20,6 +20,13 @@ #include #include +#define convert_in_user(srcptr, dstptr) \ +({ \ + typeof(*srcptr) val; \ + \ + get_user(val, srcptr) || put_user(val, dstptr); \ +}) + static long native_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret = -ENOIOCTLCMD; @@ -45,27 +52,45 @@ struct v4l2_window32 { compat_caddr_t bitmap; }; -static int get_v4l2_window32(struct v4l2_window *kp, struct v4l2_window32 __user *up) +static int bufsize_v4l2_window32(struct v4l2_window32 __user *up) { + __u32 clipcount; + + if (get_user(clipcount, &up->clipcount)) + return -EFAULT; + if (clipcount > 2048) + return -EINVAL; + return clipcount * sizeof(struct v4l2_clip); +} + +static int get_v4l2_window32(struct v4l2_window __user *kp, struct + v4l2_window32 __user *up, void __user *aux_buf, int aux_space) +{ + __u32 clipcount; + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_window32)) || - copy_from_user(&kp->w, &up->w, sizeof(up->w)) || - get_user(kp->field, &up->field) || - get_user(kp->chromakey, &up->chromakey) || - get_user(kp->clipcount, &up->clipcount)) + copy_in_user(&kp->w, &up->w, sizeof(up->w)) || + convert_in_user(&up->field, &kp->field) || + convert_in_user(&up->chromakey, &kp->chromakey) || + get_user(clipcount, &up->clipcount) || + put_user(clipcount, &kp->clipcount)) return -EFAULT; - if (kp->clipcount > 2048) + if (clipcount > 2048) return -EINVAL; - if (kp->clipcount) { + if (clipcount) { struct v4l2_clip32 __user *uclips; struct v4l2_clip __user *kclips; - int n = kp->clipcount; + int n = clipcount; compat_caddr_t p; if (get_user(p, &up->clips)) return -EFAULT; uclips = compat_ptr(p); - kclips = compat_alloc_user_space(n * sizeof(struct v4l2_clip)); - kp->clips = kclips; + if (aux_space < n * sizeof(struct v4l2_clip)) + return -EFAULT; + kclips = aux_buf; + if (put_user(kclips, &kp->clips)) + return -EFAULT; while (--n >= 0) { if (copy_in_user(&kclips->c, &uclips->c, sizeof(uclips->c))) return -EFAULT; @@ -74,75 +99,77 @@ static int get_v4l2_window32(struct v4l2_window *kp, struct v4l2_window32 __user uclips += 1; kclips += 1; } - } else - kp->clips = NULL; + } else { + if (put_user(NULL, &kp->clips)) + return -EFAULT; + } return 0; } -static int put_v4l2_window32(struct v4l2_window *kp, struct v4l2_window32 __user *up) +static int put_v4l2_window32(struct v4l2_window __user *kp, struct v4l2_window32 __user *up) { - if (copy_to_user(&up->w, &kp->w, sizeof(kp->w)) || - put_user(kp->field, &up->field) || - put_user(kp->chromakey, &up->chromakey) || - put_user(kp->clipcount, &up->clipcount)) - return -EFAULT; + if (copy_in_user(&up->w, &kp->w, sizeof(kp->w)) || + convert_in_user(&kp->field, &up->field) || + convert_in_user(&kp->chromakey, &up->chromakey) || + convert_in_user(&kp->clipcount, &up->clipcount)) + return -EFAULT; return 0; } -static inline int get_v4l2_pix_format(struct v4l2_pix_format *kp, struct v4l2_pix_format __user *up) +static inline int get_v4l2_pix_format(struct v4l2_pix_format __user *kp, struct v4l2_pix_format __user *up) { - if (copy_from_user(kp, up, sizeof(struct v4l2_pix_format))) + if (copy_in_user(kp, up, sizeof(struct v4l2_pix_format))) return -EFAULT; return 0; } -static inline int get_v4l2_pix_format_mplane(struct v4l2_pix_format_mplane *kp, +static inline int get_v4l2_pix_format_mplane(struct v4l2_pix_format_mplane __user *kp, struct v4l2_pix_format_mplane __user *up) { - if (copy_from_user(kp, up, sizeof(struct v4l2_pix_format_mplane))) + if (copy_in_user(kp, up, sizeof(struct v4l2_pix_format_mplane))) return -EFAULT; return 0; } -static inline int put_v4l2_pix_format(struct v4l2_pix_format *kp, struct v4l2_pix_format __user *up) +static inline int put_v4l2_pix_format(struct v4l2_pix_format __user *kp, struct v4l2_pix_format __user *up) { - if (copy_to_user(up, kp, sizeof(struct v4l2_pix_format))) + if (copy_in_user(up, kp, sizeof(struct v4l2_pix_format))) return -EFAULT; return 0; } -static inline int put_v4l2_pix_format_mplane(struct v4l2_pix_format_mplane *kp, +static inline int put_v4l2_pix_format_mplane(struct v4l2_pix_format_mplane __user *kp, struct v4l2_pix_format_mplane __user *up) { - if (copy_to_user(up, kp, sizeof(struct v4l2_pix_format_mplane))) + if (copy_in_user(up, kp, sizeof(struct v4l2_pix_format_mplane))) return -EFAULT; return 0; } -static inline int get_v4l2_vbi_format(struct v4l2_vbi_format *kp, struct v4l2_vbi_format __user *up) +static inline int get_v4l2_vbi_format(struct v4l2_vbi_format __user *kp, struct v4l2_vbi_format __user *up) { - if (copy_from_user(kp, up, sizeof(struct v4l2_vbi_format))) + if (copy_in_user(kp, up, sizeof(struct v4l2_vbi_format))) return -EFAULT; return 0; } -static inline int put_v4l2_vbi_format(struct v4l2_vbi_format *kp, struct v4l2_vbi_format __user *up) +static inline int put_v4l2_vbi_format(struct v4l2_vbi_format __user *kp, struct v4l2_vbi_format __user *up) { - if (copy_to_user(up, kp, sizeof(struct v4l2_vbi_format))) + if (copy_in_user(up, kp, sizeof(struct v4l2_vbi_format))) return -EFAULT; return 0; } -static inline int get_v4l2_sliced_vbi_format(struct v4l2_sliced_vbi_format *kp, struct v4l2_sliced_vbi_format __user *up) +static inline int get_v4l2_sliced_vbi_format(struct v4l2_sliced_vbi_format __user *kp, struct v4l2_sliced_vbi_format __user *up) { - if (copy_from_user(kp, up, sizeof(struct v4l2_sliced_vbi_format))) + if (copy_in_user(kp, up, sizeof(struct v4l2_sliced_vbi_format))) return -EFAULT; return 0; } -static inline int put_v4l2_sliced_vbi_format(struct v4l2_sliced_vbi_format *kp, struct v4l2_sliced_vbi_format __user *up) +static inline int put_v4l2_sliced_vbi_format(struct v4l2_sliced_vbi_format __user *kp, struct v4l2_sliced_vbi_format __user *up) { - if (copy_to_user(up, kp, sizeof(struct v4l2_sliced_vbi_format))) + if (copy_in_user(up, kp, sizeof(struct v4l2_sliced_vbi_format))) return -EFAULT; return 0; } @@ -176,12 +203,31 @@ struct v4l2_create_buffers32 { __u32 reserved[8]; }; -static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up) +static int __bufsize_v4l2_format32(struct v4l2_format32 __user *up) { - if (get_user(kp->type, &up->type)) + __u32 type; + + if (get_user(type, &up->type)) return -EFAULT; - switch (kp->type) { + switch (type) { + case V4L2_BUF_TYPE_VIDEO_OVERLAY: + case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: + return bufsize_v4l2_window32(&up->fmt.win); + default: + return 0; + } +} + +static int __get_v4l2_format32(struct v4l2_format __user *kp, struct + v4l2_format32 __user *up, void __user *aux_buf, int aux_space) +{ + __u32 type; + + if (get_user(type, &up->type) || put_user(type, &kp->type)) + return -EFAULT; + + switch (type) { case V4L2_BUF_TYPE_VIDEO_CAPTURE: case V4L2_BUF_TYPE_VIDEO_OUTPUT: return get_v4l2_pix_format(&kp->fmt.pix, &up->fmt.pix); @@ -191,7 +237,7 @@ static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us &up->fmt.pix_mp); case V4L2_BUF_TYPE_VIDEO_OVERLAY: case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: - return get_v4l2_window32(&kp->fmt.win, &up->fmt.win); + return get_v4l2_window32(&kp->fmt.win, &up->fmt.win, aux_buf, aux_space); case V4L2_BUF_TYPE_VBI_CAPTURE: case V4L2_BUF_TYPE_VBI_OUTPUT: return get_v4l2_vbi_format(&kp->fmt.vbi, &up->fmt.vbi); @@ -205,24 +251,46 @@ static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us } } -static int get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up) +static int bufsize_v4l2_format32(struct v4l2_format32 __user *up) { if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_format32))) return -EFAULT; - return __get_v4l2_format32(kp, up); + return __bufsize_v4l2_format32(up); } -static int get_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_buffers32 __user *up) +static int get_v4l2_format32(struct v4l2_format __user *kp, struct + v4l2_format32 __user *up, void __user *aux_buf, int aux_space) +{ + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_format32))) + return -EFAULT; + return __get_v4l2_format32(kp, up, aux_buf, aux_space); +} + +static int bufsize_v4l2_create32(struct v4l2_create_buffers32 __user *up) +{ + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_create_buffers32))) + return -EFAULT; + return __bufsize_v4l2_format32(&up->format); +} + +static int get_v4l2_create32(struct v4l2_create_buffers __user *kp, struct + v4l2_create_buffers32 __user *up, void __user *aux_buf, + int aux_space) { if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_create_buffers32)) || - copy_from_user(kp, up, offsetof(struct v4l2_create_buffers32, format))) + copy_in_user(kp, up, offsetof(struct v4l2_create_buffers32, format))) return -EFAULT; - return __get_v4l2_format32(&kp->format, &up->format); + return __get_v4l2_format32(&kp->format, &up->format, aux_buf, aux_space); } -static int __put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up) +static int __put_v4l2_format32(struct v4l2_format __user *kp, struct v4l2_format32 __user *up) { - switch (kp->type) { + __u32 type; + + if (get_user(type, &kp->type)) + return -EFAULT; + + switch (type) { case V4L2_BUF_TYPE_VIDEO_CAPTURE: case V4L2_BUF_TYPE_VIDEO_OUTPUT: return put_v4l2_pix_format(&kp->fmt.pix, &up->fmt.pix); @@ -246,7 +314,7 @@ static int __put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us } } -static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up) +static int put_v4l2_format32(struct v4l2_format __user *kp, struct v4l2_format32 __user *up) { if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_format32)) || put_user(kp->type, &up->type)) @@ -254,10 +322,10 @@ static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user return __put_v4l2_format32(kp, up); } -static int put_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_buffers32 __user *up) +static int put_v4l2_create32(struct v4l2_create_buffers __user *kp, struct v4l2_create_buffers32 __user *up) { if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_create_buffers32)) || - copy_to_user(up, kp, offsetof(struct v4l2_create_buffers32, format.fmt))) + copy_in_user(up, kp, offsetof(struct v4l2_create_buffers32, format.fmt))) return -EFAULT; return __put_v4l2_format32(&kp->format, &up->format); } @@ -271,24 +339,24 @@ struct v4l2_standard32 { __u32 reserved[4]; }; -static int get_v4l2_standard32(struct v4l2_standard *kp, struct v4l2_standard32 __user *up) +static int get_v4l2_standard32(struct v4l2_standard __user *kp, struct v4l2_standard32 __user *up) { /* other fields are not set by the user, nor used by the driver */ if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_standard32)) || - get_user(kp->index, &up->index)) + convert_in_user(&up->index, &kp->index)) return -EFAULT; return 0; } -static int put_v4l2_standard32(struct v4l2_standard *kp, struct v4l2_standard32 __user *up) +static int put_v4l2_standard32(struct v4l2_standard __user *kp, struct v4l2_standard32 __user *up) { if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_standard32)) || - put_user(kp->index, &up->index) || - copy_to_user(up->id, &kp->id, sizeof(__u64)) || - copy_to_user(up->name, kp->name, 24) || - copy_to_user(&up->frameperiod, &kp->frameperiod, sizeof(kp->frameperiod)) || - put_user(kp->framelines, &up->framelines) || - copy_to_user(up->reserved, kp->reserved, 4 * sizeof(__u32))) + convert_in_user(&kp->index, &up->index) || + copy_in_user(up->id, &kp->id, sizeof(__u64)) || + copy_in_user(up->name, kp->name, 24) || + copy_in_user(&up->frameperiod, &kp->frameperiod, sizeof(kp->frameperiod)) || + convert_in_user(&kp->framelines, &up->framelines) || + copy_in_user(up->reserved, kp->reserved, 4 * sizeof(__u32))) return -EFAULT; return 0; } @@ -331,7 +399,6 @@ struct v4l2_buffer32 { static int get_v4l2_plane32(struct v4l2_plane __user *up, struct v4l2_plane32 __user *up32, enum v4l2_memory memory) { - void __user *up_pln; compat_long_t p; if (copy_in_user(up, up32, 2 * sizeof(__u32)) || @@ -344,10 +411,9 @@ static int get_v4l2_plane32(struct v4l2_plane __user *up, struct v4l2_plane32 __ return -EFAULT; if (memory == V4L2_MEMORY_USERPTR) { - if (get_user(p, &up32->m.userptr)) - return -EFAULT; - up_pln = compat_ptr(p); - if (put_user((unsigned long)up_pln, &up->m.userptr)) + if (get_user(p, &up32->m.userptr) || + put_user((unsigned long) compat_ptr(p), + &up->m.userptr)) return -EFAULT; } else if (memory == V4L2_MEMORY_DMABUF) { if (copy_in_user(&up->m.fd, &up32->m.fd, sizeof(int))) @@ -390,8 +456,34 @@ static int put_v4l2_plane32(struct v4l2_plane __user *up, struct v4l2_plane32 __ return 0; } -static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user *up) +static int bufsize_v4l2_buffer32(struct v4l2_buffer32 __user *up) { + __u32 type; + __u32 length; + + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_buffer32)) || + get_user(type, &up->type) || + get_user(length, &up->length)) + return -EFAULT; + + if (V4L2_TYPE_IS_MULTIPLANAR(type)) { + if (length > VIDEO_MAX_PLANES) + return -EINVAL; + + /* We don't really care if userspace decides to kill itself + * by passing a very big length value + */ + return length * sizeof(struct v4l2_plane); + } + return 0; +} + +static int get_v4l2_buffer32(struct v4l2_buffer __user *kp, struct + v4l2_buffer32 __user *up, void __user *aux_buf, int aux_space) +{ + __u32 type; + __u32 length; + enum v4l2_memory memory; struct v4l2_plane32 __user *uplane32; struct v4l2_plane __user *uplane; compat_caddr_t p; @@ -399,28 +491,40 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user int ret; if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_buffer32)) || - get_user(kp->index, &up->index) || - get_user(kp->type, &up->type) || - get_user(kp->flags, &up->flags) || - get_user(kp->memory, &up->memory) || - get_user(kp->length, &up->length)) + convert_in_user(&up->index, &kp->index) || + get_user(type, &up->type) || + put_user(type, &kp->type) || + convert_in_user(&up->flags, &kp->flags) || + get_user(memory, &up->memory) || + put_user(memory, &kp->memory) || + convert_in_user(&up->length, &kp->length) || + get_user(length, &up->length) || + put_user(length, &kp->length)) return -EFAULT; - if (V4L2_TYPE_IS_OUTPUT(kp->type)) - if (get_user(kp->bytesused, &up->bytesused) || - get_user(kp->field, &up->field) || - get_user(kp->timestamp.tv_sec, &up->timestamp.tv_sec) || - get_user(kp->timestamp.tv_usec, - &up->timestamp.tv_usec)) + if (V4L2_TYPE_IS_OUTPUT(type)) + if (convert_in_user(&up->bytesused, &kp->bytesused) || + convert_in_user(&up->field, &kp->field) || + convert_in_user(&up->timestamp.tv_sec, &kp->timestamp.tv_sec) || + convert_in_user(&up->timestamp.tv_usec, + &kp->timestamp.tv_usec)) return -EFAULT; - if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) { - num_planes = kp->length; + if (type == V4L2_BUF_TYPE_PRIVATE) { + compat_long_t tmp; + + if (get_user(tmp, &up->m.userptr) || + put_user((unsigned long) compat_ptr(tmp), + &kp->m.userptr)) + return -EFAULT; + } + + if (V4L2_TYPE_IS_MULTIPLANAR(type)) { + num_planes = length; if (num_planes == 0) { - kp->m.planes = NULL; /* num_planes == 0 is legal, e.g. when userspace doesn't * need planes array on DQBUF*/ - return 0; + return put_user(NULL, &kp->m.planes); } if (get_user(p, &up->m.planes)) @@ -433,39 +537,44 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user /* We don't really care if userspace decides to kill itself * by passing a very big num_planes value */ - uplane = compat_alloc_user_space(num_planes * - sizeof(struct v4l2_plane)); - kp->m.planes = (__force struct v4l2_plane *)uplane; + if (aux_space < num_planes * sizeof(struct v4l2_plane)) + return -EFAULT; + + uplane = aux_buf; + if (put_user((__force struct v4l2_plane *)uplane, + &kp->m.planes)) + return -EFAULT; while (--num_planes >= 0) { - ret = get_v4l2_plane32(uplane, uplane32, kp->memory); + ret = get_v4l2_plane32(uplane, uplane32, memory); if (ret) return ret; ++uplane; ++uplane32; } } else { - switch (kp->memory) { + switch (memory) { case V4L2_MEMORY_MMAP: - if (get_user(kp->m.offset, &up->m.offset)) + if (convert_in_user(&up->m.offset, &kp->m.offset)) return -EFAULT; break; case V4L2_MEMORY_USERPTR: { - compat_long_t tmp; + compat_long_t tmp; - if (get_user(tmp, &up->m.userptr)) - return -EFAULT; - - kp->m.userptr = (unsigned long)compat_ptr(tmp); + if (get_user(tmp, &up->m.userptr) || + put_user((unsigned long) + compat_ptr(tmp), + &kp->m.userptr)) + return -EFAULT; } break; case V4L2_MEMORY_OVERLAY: - if (get_user(kp->m.offset, &up->m.offset)) + if (convert_in_user(&up->m.offset, &kp->m.offset)) return -EFAULT; break; case V4L2_MEMORY_DMABUF: - if (get_user(kp->m.fd, &up->m.fd)) + if (convert_in_user(&up->m.fd, &kp->m.fd)) return -EFAULT; break; } @@ -474,8 +583,11 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user return 0; } -static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user *up) +static int put_v4l2_buffer32(struct v4l2_buffer __user *kp, struct v4l2_buffer32 __user *up) { + __u32 type; + __u32 length; + enum v4l2_memory memory; struct v4l2_plane32 __user *uplane32; struct v4l2_plane __user *uplane; compat_caddr_t p; @@ -483,56 +595,63 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user int ret; if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_buffer32)) || - put_user(kp->index, &up->index) || - put_user(kp->type, &up->type) || - put_user(kp->flags, &up->flags) || - put_user(kp->memory, &up->memory)) + convert_in_user(&kp->index, &up->index) || + get_user(type, &kp->type) || + put_user(type, &up->type) || + convert_in_user(&kp->flags, &up->flags) || + get_user(memory, &kp->memory) || + put_user(memory, &up->memory)) return -EFAULT; - if (put_user(kp->bytesused, &up->bytesused) || - put_user(kp->field, &up->field) || - put_user(kp->timestamp.tv_sec, &up->timestamp.tv_sec) || - put_user(kp->timestamp.tv_usec, &up->timestamp.tv_usec) || - copy_to_user(&up->timecode, &kp->timecode, sizeof(struct v4l2_timecode)) || - put_user(kp->sequence, &up->sequence) || - put_user(kp->reserved2, &up->reserved2) || - put_user(kp->reserved, &up->reserved) || - put_user(kp->length, &up->length)) + if (convert_in_user(&kp->bytesused, &up->bytesused) || + convert_in_user(&kp->field, &up->field) || + convert_in_user(&kp->timestamp.tv_sec, &up->timestamp.tv_sec) || + convert_in_user(&kp->timestamp.tv_usec, &up->timestamp.tv_usec) || + copy_in_user(&up->timecode, &kp->timecode, sizeof(struct v4l2_timecode)) || + convert_in_user(&kp->sequence, &up->sequence) || + convert_in_user(&kp->reserved2, &up->reserved2) || + convert_in_user(&kp->reserved, &up->reserved) || + get_user(length, &kp->length) || + put_user(length, &up->length)) + return -EFAULT; + if(type == V4L2_BUF_TYPE_PRIVATE) + if (convert_in_user(&kp->m.userptr, &up->m.userptr)) return -EFAULT; - if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) { - num_planes = kp->length; + if (V4L2_TYPE_IS_MULTIPLANAR(type)) { + num_planes = length; if (num_planes == 0) return 0; - uplane = (__force struct v4l2_plane __user *)kp->m.planes; + if (get_user(uplane, ((__force struct v4l2_plane __user **)&kp->m.planes))) + return -EFAULT; if (get_user(p, &up->m.planes)) return -EFAULT; uplane32 = compat_ptr(p); while (--num_planes >= 0) { - ret = put_v4l2_plane32(uplane, uplane32, kp->memory); + ret = put_v4l2_plane32(uplane, uplane32, memory); if (ret) return ret; ++uplane; ++uplane32; } } else { - switch (kp->memory) { + switch (memory) { case V4L2_MEMORY_MMAP: - if (put_user(kp->m.offset, &up->m.offset)) + if (convert_in_user(&kp->m.offset, &up->m.offset)) return -EFAULT; break; case V4L2_MEMORY_USERPTR: - if (put_user(kp->m.userptr, &up->m.userptr)) + if (convert_in_user(&kp->m.userptr, &up->m.userptr)) return -EFAULT; break; case V4L2_MEMORY_OVERLAY: - if (put_user(kp->m.offset, &up->m.offset)) + if (convert_in_user(&kp->m.offset, &up->m.offset)) return -EFAULT; break; case V4L2_MEMORY_DMABUF: - if (put_user(kp->m.fd, &up->m.fd)) + if (convert_in_user(&kp->m.fd, &up->m.fd)) return -EFAULT; break; } @@ -542,44 +661,45 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user } struct v4l2_framebuffer32 { - __u32 capability; - __u32 flags; - compat_caddr_t base; + __u32 capability; + __u32 flags; + compat_caddr_t base; struct { - __u32 width; - __u32 height; - __u32 pixelformat; - __u32 field; - __u32 bytesperline; - __u32 sizeimage; - __u32 colorspace; - __u32 priv; + __u32 width; + __u32 height; + __u32 pixelformat; + __u32 field; + __u32 bytesperline; + __u32 sizeimage; + __u32 colorspace; + __u32 priv; } fmt; }; -static int get_v4l2_framebuffer32(struct v4l2_framebuffer *kp, struct v4l2_framebuffer32 __user *up) +static int get_v4l2_framebuffer32(struct v4l2_framebuffer __user *kp, struct v4l2_framebuffer32 __user *up) { - u32 tmp; + compat_caddr_t tmp; if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_framebuffer32)) || get_user(tmp, &up->base) || - get_user(kp->capability, &up->capability) || - get_user(kp->flags, &up->flags) || - copy_from_user(&kp->fmt, &up->fmt, sizeof(up->fmt))) + put_user((__force void *)compat_ptr(tmp), &kp->base) || + convert_in_user(&up->capability, &kp->capability) || + convert_in_user(&up->flags, &kp->flags) || + get_v4l2_pix_format((struct v4l2_pix_format *)&kp->fmt, (struct v4l2_pix_format *)&up->fmt)) return -EFAULT; - kp->base = (__force void *)compat_ptr(tmp); return 0; } -static int put_v4l2_framebuffer32(struct v4l2_framebuffer *kp, struct v4l2_framebuffer32 __user *up) +static int put_v4l2_framebuffer32(struct v4l2_framebuffer __user *kp, struct v4l2_framebuffer32 __user *up) { - u32 tmp = (u32)((unsigned long)kp->base); + void *base; if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_framebuffer32)) || - put_user(tmp, &up->base) || - put_user(kp->capability, &up->capability) || - put_user(kp->flags, &up->flags) || - copy_to_user(&up->fmt, &kp->fmt, sizeof(up->fmt))) + get_user(base, &kp->base) || + put_user(ptr_to_compat(base), &up->base) || + convert_in_user(&kp->capability, &up->capability) || + convert_in_user(&kp->flags, &up->flags) || + put_v4l2_pix_format((struct v4l2_pix_format *)&kp->fmt, (struct v4l2_pix_format *)&up->fmt)) return -EFAULT; return 0; } @@ -597,16 +717,16 @@ struct v4l2_input32 { /* The 64-bit v4l2_input struct has extra padding at the end of the struct. Otherwise it is identical to the 32-bit version. */ -static inline int get_v4l2_input32(struct v4l2_input *kp, struct v4l2_input32 __user *up) +static inline int get_v4l2_input32(struct v4l2_input __user *kp, struct v4l2_input32 __user *up) { - if (copy_from_user(kp, up, sizeof(struct v4l2_input32))) + if (copy_in_user(kp, up, sizeof(struct v4l2_input32))) return -EFAULT; return 0; } -static inline int put_v4l2_input32(struct v4l2_input *kp, struct v4l2_input32 __user *up) +static inline int put_v4l2_input32(struct v4l2_input __user *kp, struct v4l2_input32 __user *up) { - if (copy_to_user(up, kp, sizeof(struct v4l2_input32))) + if (copy_in_user(up, kp, sizeof(struct v4l2_input32))) return -EFAULT; return 0; } @@ -647,35 +767,51 @@ static inline int ctrl_is_pointer(u32 id) } } -static int get_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext_controls32 __user *up) +static int bufsize_v4l2_ext_controls32(struct v4l2_ext_controls32 __user *up) +{ + __u32 count; + + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_ext_controls32)) || + get_user(count, &up->count)) + return -EFAULT; + if (count > V4L2_CID_MAX_CTRLS) + return -EINVAL; + return count * sizeof(struct v4l2_ext_control); +} + +static int get_v4l2_ext_controls32(struct v4l2_ext_controls __user *kp, struct + v4l2_ext_controls32 __user *up, void __user *aux_buf, + int aux_space) { struct v4l2_ext_control32 __user *ucontrols; struct v4l2_ext_control __user *kcontrols; - int n; + __u32 count; + unsigned int n; compat_caddr_t p; if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_ext_controls32)) || - get_user(kp->ctrl_class, &up->ctrl_class) || - get_user(kp->count, &up->count) || - get_user(kp->error_idx, &up->error_idx) || - copy_from_user(kp->reserved, up->reserved, sizeof(kp->reserved))) + convert_in_user(&up->ctrl_class, &kp->ctrl_class) || + get_user(count, &up->count) || + put_user(count, &kp->count) || + convert_in_user(&up->error_idx, &kp->error_idx) || + copy_in_user(kp->reserved, up->reserved, sizeof(kp->reserved))) return -EFAULT; - n = kp->count; - if (n == 0) { - kp->controls = NULL; - return 0; - } + if (count == 0) + return put_user(NULL, &kp->controls); if (get_user(p, &up->controls)) return -EFAULT; ucontrols = compat_ptr(p); if (!access_ok(VERIFY_READ, ucontrols, - n * sizeof(struct v4l2_ext_control32))) + count * sizeof(struct v4l2_ext_control32))) + return -EFAULT; + if (aux_space < count * sizeof(struct v4l2_ext_control)) + return -EFAULT; + kcontrols = aux_buf; + if (put_user((__force struct v4l2_ext_control *)kcontrols, + &kp->controls)) return -EFAULT; - kcontrols = compat_alloc_user_space(n * sizeof(struct v4l2_ext_control)); - kp->controls = (__force struct v4l2_ext_control *)kcontrols; - while (--n >= 0) { + for (n = 0; n < count; n++) { u32 id; - if (copy_in_user(kcontrols, ucontrols, sizeof(*ucontrols))) return -EFAULT; if (get_user(id, &kcontrols->id)) @@ -695,31 +831,33 @@ static int get_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext return 0; } -static int put_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext_controls32 __user *up) +static int put_v4l2_ext_controls32(struct v4l2_ext_controls __user *kp, struct v4l2_ext_controls32 __user *up) { struct v4l2_ext_control32 __user *ucontrols; - struct v4l2_ext_control __user *kcontrols = - (__force struct v4l2_ext_control __user *)kp->controls; - int n = kp->count; + struct v4l2_ext_control __user *kcontrols; + __u32 count; + unsigned int n; compat_caddr_t p; if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_ext_controls32)) || - put_user(kp->ctrl_class, &up->ctrl_class) || - put_user(kp->count, &up->count) || - put_user(kp->error_idx, &up->error_idx) || - copy_to_user(up->reserved, kp->reserved, sizeof(up->reserved))) + get_user(kcontrols, &kp->controls) || + convert_in_user(&kp->ctrl_class, &up->ctrl_class) || + get_user(count, &kp->count) || + put_user(count, &up->count) || + convert_in_user(&kp->error_idx, &up->error_idx) || + copy_in_user(up->reserved, kp->reserved, sizeof(up->reserved))) return -EFAULT; - if (!kp->count) + if (!count) return 0; if (get_user(p, &up->controls)) return -EFAULT; ucontrols = compat_ptr(p); if (!access_ok(VERIFY_WRITE, ucontrols, - n * sizeof(struct v4l2_ext_control32))) + count * sizeof(struct v4l2_ext_control32))) return -EFAULT; - while (--n >= 0) { + for (n = 0; n < count; n++) { unsigned size = sizeof(*ucontrols); u32 id; @@ -753,16 +891,17 @@ struct v4l2_event32 { __u32 reserved[8]; }; -static int put_v4l2_event32(struct v4l2_event *kp, struct v4l2_event32 __user *up) +static int put_v4l2_event32(struct v4l2_event __user *kp, struct v4l2_event32 __user *up) { if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_event32)) || - put_user(kp->type, &up->type) || - copy_to_user(&up->u, &kp->u, sizeof(kp->u)) || - put_user(kp->pending, &up->pending) || - put_user(kp->sequence, &up->sequence) || - compat_put_timespec(&kp->timestamp, &up->timestamp) || - put_user(kp->id, &up->id) || - copy_to_user(up->reserved, kp->reserved, 8 * sizeof(__u32))) + convert_in_user(&kp->type, &up->type) || + copy_in_user(&up->u, &kp->u, sizeof(kp->u)) || + convert_in_user(&kp->pending, &up->pending) || + convert_in_user(&kp->sequence, &up->sequence) || + convert_in_user(&kp->timestamp.tv_sec, &up->timestamp.tv_sec) || + convert_in_user(&kp->timestamp.tv_nsec, &up->timestamp.tv_nsec) || + convert_in_user(&kp->id, &up->id) || + copy_in_user(up->reserved, kp->reserved, 8 * sizeof(__u32))) return -EFAULT; return 0; } @@ -775,31 +914,34 @@ struct v4l2_edid32 { compat_caddr_t edid; }; -static int get_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up) +#define v4l2_subdev_edid32 v4l2_edid32 + +static int get_v4l2_subdev_edid32(struct v4l2_subdev_edid __user *kp, struct v4l2_subdev_edid32 __user *up) { - u32 tmp; + compat_uptr_t tmp; - if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_edid32)) || - get_user(kp->pad, &up->pad) || - get_user(kp->start_block, &up->start_block) || - get_user(kp->blocks, &up->blocks) || + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_subdev_edid32)) || + convert_in_user(&up->pad, &kp->pad) || + convert_in_user(&up->start_block, &kp->start_block) || + convert_in_user(&up->blocks, &kp->blocks) || get_user(tmp, &up->edid) || - copy_from_user(kp->reserved, up->reserved, sizeof(kp->reserved))) + put_user(compat_ptr(tmp), &kp->edid) || + copy_in_user(kp->reserved, up->reserved, sizeof(kp->reserved))) return -EFAULT; - kp->edid = (__force u8 *)compat_ptr(tmp); return 0; } -static int put_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up) +static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid __user *kp, struct v4l2_subdev_edid32 __user *up) { - u32 tmp = (u32)((unsigned long)kp->edid); - - if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_edid32)) || - put_user(kp->pad, &up->pad) || - put_user(kp->start_block, &up->start_block) || - put_user(kp->blocks, &up->blocks) || - put_user(tmp, &up->edid) || - copy_to_user(up->reserved, kp->reserved, sizeof(up->reserved))) + void *edid; + + if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_subdev_edid32)) || + convert_in_user(&kp->pad, &up->pad) || + convert_in_user(&kp->start_block, &up->start_block) || + convert_in_user(&kp->blocks, &up->blocks) || + get_user(edid, &kp->edid) || + put_user(ptr_to_compat(edid), &up->edid) || + copy_in_user(up->reserved, kp->reserved, sizeof(up->reserved))) return -EFAULT; return 0; } @@ -832,22 +974,37 @@ static int put_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up) #define VIDIOC_G_OUTPUT32 _IOR ('V', 46, s32) #define VIDIOC_S_OUTPUT32 _IOWR('V', 47, s32) +/* + * Note that these macros contain return statements to avoid the need for the + * "caller" to check return values. + */ +#define ALLOC_USER_SPACE(size) \ +({ \ + void __user *up_native; \ + up_native = compat_alloc_user_space(size); \ + if (!up_native) \ + return -ENOMEM; \ + if (clear_user(up_native, size)) \ + return -EFAULT; \ + up_native; \ +}) + +#define ALLOC_AND_GET(bufsizefunc, getfunc, structname) \ + do { \ + aux_space = bufsizefunc(up); \ + if (aux_space < 0) \ + return aux_space; \ + up_native = ALLOC_USER_SPACE(sizeof(struct structname) + aux_space); \ + aux_buf = up_native + sizeof(struct structname); \ + err = getfunc(up_native, up, aux_buf, aux_space); \ + } while (0) + static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - union { - struct v4l2_format v2f; - struct v4l2_buffer v2b; - struct v4l2_framebuffer v2fb; - struct v4l2_input v2i; - struct v4l2_standard v2s; - struct v4l2_ext_controls v2ecs; - struct v4l2_event v2ev; - struct v4l2_create_buffers v2crt; - struct v4l2_edid v2edid; - unsigned long vx; - int vi; - } karg; void __user *up = compat_ptr(arg); + void __user *up_native = NULL; + void __user *aux_buf; + int aux_space; int compatible_arg = 1; long err = 0; @@ -886,30 +1043,35 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar case VIDIOC_STREAMOFF: case VIDIOC_S_INPUT: case VIDIOC_S_OUTPUT: - err = get_user(karg.vi, (s32 __user *)up); + up_native = ALLOC_USER_SPACE(sizeof(unsigned __user)); + if (convert_in_user((compat_uint_t __user *)up, + (unsigned __user *) up_native)) + return -EFAULT; compatible_arg = 0; break; case VIDIOC_G_INPUT: case VIDIOC_G_OUTPUT: + up_native = ALLOC_USER_SPACE(sizeof(unsigned __user)); compatible_arg = 0; break; case VIDIOC_G_EDID: case VIDIOC_S_EDID: - err = get_v4l2_edid32(&karg.v2edid, up); + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_subdev_edid)); + err = get_v4l2_subdev_edid32(up_native, up); compatible_arg = 0; break; case VIDIOC_G_FMT: case VIDIOC_S_FMT: case VIDIOC_TRY_FMT: - err = get_v4l2_format32(&karg.v2f, up); + ALLOC_AND_GET(bufsize_v4l2_format32, get_v4l2_format32, v4l2_format); compatible_arg = 0; break; case VIDIOC_CREATE_BUFS: - err = get_v4l2_create32(&karg.v2crt, up); + ALLOC_AND_GET(bufsize_v4l2_create32, get_v4l2_create32, v4l2_create_buffers); compatible_arg = 0; break; @@ -917,36 +1079,41 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar case VIDIOC_QUERYBUF: case VIDIOC_QBUF: case VIDIOC_DQBUF: - err = get_v4l2_buffer32(&karg.v2b, up); + ALLOC_AND_GET(bufsize_v4l2_buffer32, get_v4l2_buffer32, v4l2_buffer); compatible_arg = 0; break; case VIDIOC_S_FBUF: - err = get_v4l2_framebuffer32(&karg.v2fb, up); + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_framebuffer)); + err = get_v4l2_framebuffer32((struct v4l2_framebuffer *)up_native, (struct v4l2_framebuffer32 *)up); compatible_arg = 0; break; case VIDIOC_G_FBUF: + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_framebuffer)); compatible_arg = 0; break; case VIDIOC_ENUMSTD: - err = get_v4l2_standard32(&karg.v2s, up); + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_standard)); + err = get_v4l2_standard32(up_native, up); compatible_arg = 0; break; case VIDIOC_ENUMINPUT: - err = get_v4l2_input32(&karg.v2i, up); + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_input)); + err = get_v4l2_input32(up_native, up); compatible_arg = 0; break; case VIDIOC_G_EXT_CTRLS: case VIDIOC_S_EXT_CTRLS: case VIDIOC_TRY_EXT_CTRLS: - err = get_v4l2_ext_controls32(&karg.v2ecs, up); + ALLOC_AND_GET(bufsize_v4l2_ext_controls32, get_v4l2_ext_controls32, v4l2_ext_controls); compatible_arg = 0; break; case VIDIOC_DQEVENT: + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_event)); compatible_arg = 0; break; } @@ -955,13 +1122,8 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar if (compatible_arg) err = native_ioctl(file, cmd, (unsigned long)up); - else { - mm_segment_t old_fs = get_fs(); - - set_fs(KERNEL_DS); - err = native_ioctl(file, cmd, (unsigned long)&karg); - set_fs(old_fs); - } + else + err = native_ioctl(file, cmd, (unsigned long)up_native); /* Special case: even after an error we need to put the results back for these ioctls since the error_idx will @@ -970,7 +1132,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar case VIDIOC_G_EXT_CTRLS: case VIDIOC_S_EXT_CTRLS: case VIDIOC_TRY_EXT_CTRLS: - if (put_v4l2_ext_controls32(&karg.v2ecs, up)) + if (put_v4l2_ext_controls32(up_native, up)) err = -EFAULT; break; } @@ -982,44 +1144,45 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar case VIDIOC_S_OUTPUT: case VIDIOC_G_INPUT: case VIDIOC_G_OUTPUT: - err = put_user(((s32)karg.vi), (s32 __user *)up); + err = convert_in_user(((unsigned __user *)up_native), + (compat_uint_t __user *)up); break; case VIDIOC_G_FBUF: - err = put_v4l2_framebuffer32(&karg.v2fb, up); + err = put_v4l2_framebuffer32(up_native, up); break; case VIDIOC_DQEVENT: - err = put_v4l2_event32(&karg.v2ev, up); + err = put_v4l2_event32(up_native, up); break; case VIDIOC_G_EDID: case VIDIOC_S_EDID: - err = put_v4l2_edid32(&karg.v2edid, up); + err = put_v4l2_subdev_edid32(up_native, up); break; case VIDIOC_G_FMT: case VIDIOC_S_FMT: case VIDIOC_TRY_FMT: - err = put_v4l2_format32(&karg.v2f, up); + err = put_v4l2_format32(up_native, up); break; case VIDIOC_CREATE_BUFS: - err = put_v4l2_create32(&karg.v2crt, up); + err = put_v4l2_create32(up_native, up); break; case VIDIOC_QUERYBUF: case VIDIOC_QBUF: case VIDIOC_DQBUF: - err = put_v4l2_buffer32(&karg.v2b, up); + err = put_v4l2_buffer32(up_native, up); break; case VIDIOC_ENUMSTD: - err = put_v4l2_standard32(&karg.v2s, up); + err = put_v4l2_standard32(up_native, up); break; case VIDIOC_ENUMINPUT: - err = put_v4l2_input32(&karg.v2i, up); + err = put_v4l2_input32(up_native, up); break; } return err; diff --git a/drivers/mfd/wcd9xxx-core.c b/drivers/mfd/wcd9xxx-core.c index a446376650f01..7987c20331ef3 100644 --- a/drivers/mfd/wcd9xxx-core.c +++ b/drivers/mfd/wcd9xxx-core.c @@ -3107,19 +3107,19 @@ static int wcd9xxx_slim_probe(struct slim_device *slim) ("wcd9xxx_core", 0); if (!IS_ERR(debugfs_wcd9xxx_dent)) { debugfs_peek = debugfs_create_file("slimslave_peek", - S_IFREG | S_IRUGO, debugfs_wcd9xxx_dent, + S_IFREG | S_IRUSR, debugfs_wcd9xxx_dent, (void *) "slimslave_peek", &codec_debug_ops); debugfs_poke = debugfs_create_file("slimslave_poke", - S_IFREG | S_IRUGO, debugfs_wcd9xxx_dent, + S_IFREG | S_IRUSR, debugfs_wcd9xxx_dent, (void *) "slimslave_poke", &codec_debug_ops); debugfs_power_state = debugfs_create_file("power_state", - S_IFREG | S_IRUGO, debugfs_wcd9xxx_dent, + S_IFREG | S_IRUSR, debugfs_wcd9xxx_dent, (void *) "power_state", &codec_debug_ops); debugfs_reg_dump = debugfs_create_file("slimslave_reg_dump", - S_IFREG | S_IRUGO, debugfs_wcd9xxx_dent, + S_IFREG | S_IRUSR, debugfs_wcd9xxx_dent, (void *) "slimslave_reg_dump", &codec_debug_ops); } #endif diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 0b9117c0e7dae..e6f726c943fbb 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -68,3 +68,4 @@ obj-$(CONFIG_TI_DRV2667) += ti_drv2667.o obj-$(CONFIG_USB_EXT_TYPE_C_PERICOM) += type-c-pericom.o obj-$(CONFIG_USB_EXT_TYPE_C_TI) += type-c-ti.o obj-$(CONFIG_QPNP_MISC) += qpnp-misc.o +obj-y += hardware_info.o diff --git a/drivers/misc/hardware_info.c b/drivers/misc/hardware_info.c new file mode 100755 index 0000000000000..c5913658b2f96 --- /dev/null +++ b/drivers/misc/hardware_info.c @@ -0,0 +1,331 @@ +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +typedef struct hardwareinfo_get{ + void (*get)(void *driver_data); + void *driver_data; +} hardwareinfo_get; + +static hardwareinfo_get hardwareinfo_get_tp; + +void hardwareinfo_tp_register(void (*fn)(void *), void *driver_data) +{ + hardwareinfo_get_tp.get = fn; + hardwareinfo_get_tp.driver_data = driver_data; +} +char Lcm_name[HARDWARE_MAX_ITEM_LONGTH]; +char board_id[HARDWARE_MAX_ITEM_LONGTH]; +static char hardwareinfo_name[HARDWARE_MAX_ITEM][HARDWARE_MAX_ITEM_LONGTH]; + + +char *hardwareinfo_items[HARDWARE_MAX_ITEM] = { + "LCD", + "TP", + "MEMORY", + "CAM_FRONT", + "CAM_BACK", + "BT", + "WIFI", + "GSENSOR", + "PLSENSOR", + "GYROSENSOR", + "MSENSOR", + "GPS", + "FM", + "BATTERY", + "CAM_M_BACK", + "CAM_M_FRONT", + "BOARD_ID", +}; + +#define FP_PROC_NAME "hwinfo" + +static char hdware_info_fp[100] = "unknow"; + + +static ssize_t fp_hwinfo_proc_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) +{ + size_t min; + min = min(count, (size_t)(ARRAY_SIZE(hdware_info_fp) - 1)); + memset(hdware_info_fp, 0, ARRAY_SIZE(hdware_info_fp)); + if (copy_from_user(hdware_info_fp, buf, min)) { + pr_err("%s: copy from user error.", __func__); + return -EPERM; + } + + return min; +} + +static ssize_t fp_hwinfo_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + size_t min; + char *p; + size_t size = ARRAY_SIZE(hdware_info_fp) + strlen("Fingerprint: \n"); + + if (*ppos) + return 0; + *ppos += count; + + min = min(count, size); + p = kzalloc(size, GFP_KERNEL); + snprintf(p, size, "Fingerprint: %s\n", hdware_info_fp); + + if (copy_to_user(buf, p, min)) { + pr_err("%s: copy to user error.", __func__); + kfree(p); + return -EPERM; + } + kfree(p); + + return min; +} + + +static const struct file_operations fp_hwinfo_fops = { + .write = fp_hwinfo_proc_write, + .read = fp_hwinfo_proc_read, + .owner = THIS_MODULE, +}; + +/* +* This function will create a node named FP_PROC_NAME for user to read the fingerprint +* infomation.Just cat /proc/FP_PROC_NAME. +*/ +void fp_hwinfo_proc_create(void) +{ + struct proc_dir_entry *fp_hwinfo_proc_dir; + + fp_hwinfo_proc_dir = proc_create(FP_PROC_NAME, 0666, NULL, &fp_hwinfo_fops); + if (fp_hwinfo_proc_dir == NULL) + pr_err("[HW_INFO][ERR]: create fp_hwinfo_proc fail\n"); +} + +int hardwareinfo_set_prop(int cmd, const char *name) +{ + if (cmd < 0 || cmd >= HARDWARE_MAX_ITEM) + return -EPERM; + + strcpy(hardwareinfo_name[cmd], name); + + return 0; +} +EXPORT_SYMBOL_GPL(hardwareinfo_set_prop); + + +static long hardwareinfo_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret = 0, hardwareinfo_num; + void __user *data = (void __user *)arg; + + + switch (cmd) { + case HARDWARE_LCD_GET: + hardwareinfo_set_prop(HARDWARE_LCD, Lcm_name); + hardwareinfo_num = HARDWARE_LCD; + break; + case HARDWARE_TP_GET: + hardwareinfo_num = HARDWARE_TP; + if (hardwareinfo_get_tp.get) + hardwareinfo_get_tp.get(hardwareinfo_get_tp.driver_data); + break; + case HARDWARE_FLASH_GET: + hardwareinfo_num = HARDWARE_FLASH; + break; + case HARDWARE_FRONT_CAM_GET: + hardwareinfo_num = HARDWARE_FRONT_CAM; + break; + case HARDWARE_BACK_CAM_GET: + hardwareinfo_num = HARDWARE_BACK_CAM; + break; + case HARDWARE_BT_GET: + hardwareinfo_set_prop(HARDWARE_BT, "Qualcomm"); + hardwareinfo_num = HARDWARE_BT; + break; + case HARDWARE_WIFI_GET: + hardwareinfo_set_prop(HARDWARE_WIFI, "Qualcomm"); + hardwareinfo_num = HARDWARE_WIFI; + break; + case HARDWARE_ACCELEROMETER_GET: + hardwareinfo_num = HARDWARE_ACCELEROMETER; + break; + case HARDWARE_ALSPS_GET: + hardwareinfo_num = HARDWARE_ALSPS; + break; + case HARDWARE_GYROSCOPE_GET: + hardwareinfo_num = HARDWARE_GYROSCOPE; + break; + case HARDWARE_MAGNETOMETER_GET: + hardwareinfo_num = HARDWARE_MAGNETOMETER; + break; + case HARDWARE_GPS_GET: + hardwareinfo_set_prop(HARDWARE_GPS, "Qualcomm"); + hardwareinfo_num = HARDWARE_GPS; + break; + case HARDWARE_FM_GET: + hardwareinfo_set_prop(HARDWARE_FM, "Qualcomm"); + hardwareinfo_num = HARDWARE_FM; + break; + case HARDWARE_BATTERY_ID_GET: + hardwareinfo_num = HARDWARE_BATTERY_ID; + break; + case HARDWARE_BACK_CAM_MOUDULE_ID_GET: + hardwareinfo_num = HARDWARE_BACK_CAM_MOUDULE_ID; + break; + case HARDWARE_FRONT_CAM_MODULE_ID_GET: + hardwareinfo_num = HARDWARE_FRONT_CAM_MOUDULE_ID; + break; + case HARDWARE_BOARD_ID_GET: + hardwareinfo_set_prop(HARDWARE_BOARD_ID, board_id); + hardwareinfo_num = HARDWARE_BOARD_ID; + break; + case HARDWARE_BACK_CAM_MOUDULE_ID_SET: + if (copy_from_user(hardwareinfo_name[HARDWARE_BACK_CAM_MOUDULE_ID], data, sizeof(data))) { + pr_err("wgz copy_from_user error"); + ret = -EINVAL; + } + goto set_ok; + break; + case HARDWARE_FRONT_CAM_MODULE_ID_SET: + if (copy_from_user(hardwareinfo_name[HARDWARE_FRONT_CAM_MOUDULE_ID], data, sizeof(data))) { + pr_err("wgz copy_from_user error"); + ret = -EINVAL; + } + goto set_ok; + break; + default: + ret = -EINVAL; + goto err_out; + } + + if (copy_to_user(data, hardwareinfo_name[hardwareinfo_num], strlen(hardwareinfo_name[hardwareinfo_num]) + 1)) { + + ret = -EINVAL; + } +set_ok: +err_out: + return ret; +} + +static ssize_t show_boardinfo(struct device *dev, struct device_attribute *attr, char *buf) +{ + int i = 0; + char temp_buffer[HARDWARE_MAX_ITEM_LONGTH]; + int buf_size = 0; + + for (i = 0; i < HARDWARE_MAX_ITEM; i++) { + memset(temp_buffer, 0, HARDWARE_MAX_ITEM_LONGTH); + if (i == HARDWARE_LCD) { + sprintf(temp_buffer, "%s : %s\n", hardwareinfo_items[i], Lcm_name); + } else if (i == HARDWARE_BT || i == HARDWARE_WIFI || i == HARDWARE_GPS || i == HARDWARE_FM) { + sprintf(temp_buffer, "%s : %s\n", hardwareinfo_items[i], "Qualcomm"); + } else { + sprintf(temp_buffer, "%s : %s\n", hardwareinfo_items[i], hardwareinfo_name[i]); + } + strcat(buf, temp_buffer); + buf_size += strlen(temp_buffer); + } + + return buf_size; +} +static DEVICE_ATTR(boardinfo, S_IRUGO, show_boardinfo, NULL); + + +static int boardinfo_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + int rc = 0; + + printk("%s: start\n", __func__); + + rc = device_create_file(dev, &dev_attr_boardinfo); + if (rc < 0) + return rc; + + dev_info(dev, "%s: ok\n", __func__); + + return 0; +} + +static int boardinfo_remove(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + + device_remove_file(dev, &dev_attr_boardinfo); + dev_info(&pdev->dev, "%s\n", __func__); + return 0; +} + + +static struct file_operations hardwareinfo_fops = { + .owner = THIS_MODULE, + .open = simple_open, + .unlocked_ioctl = hardwareinfo_ioctl, + .compat_ioctl = hardwareinfo_ioctl, +}; + +static struct miscdevice hardwareinfo_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "hardwareinfo", + .fops = &hardwareinfo_fops, +}; + +static struct of_device_id boardinfo_of_match[] = { + { .compatible = "wt:boardinfo", }, + {} +}; + +static struct platform_driver boardinfo_driver = { + .driver = { + .name = "boardinfo", + .owner = THIS_MODULE, + .of_match_table = boardinfo_of_match, + }, + .probe = boardinfo_probe, + .remove = boardinfo_remove, +}; + + + +static int __init hardwareinfo_init_module(void) +{ + int ret, i; + + for (i = 0; i < HARDWARE_MAX_ITEM; i++) + strcpy(hardwareinfo_name[i], "NULL"); + + ret = misc_register(&hardwareinfo_device); + if (ret < 0) { + return -ENODEV; + } + + ret = platform_driver_register(&boardinfo_driver); + if (ret != 0) { + return -ENODEV; + } + + fp_hwinfo_proc_create(); + + return 0; +} + +static void __exit hardwareinfo_exit_module(void) +{ + misc_deregister(&hardwareinfo_device); +} + +module_init(hardwareinfo_init_module); +module_exit(hardwareinfo_exit_module); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Ming He "); + + diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index 91165514156ea..d437724f2243a 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -27,6 +27,14 @@ config MMC_PERF_PROFILING If you say Y here, support will be added for collecting performance numbers at the MMC Queue and Host layers. +config MMC_ERROR_STATUS + bool "MMC error status" + depends on MMC != n + default n + help + If you say Y here, user space query if eMMC driver has encountered any error or not. + WARNNING:Only SCM could open it. + if MMC source "drivers/mmc/core/Kconfig" diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 80a3cc1a4977d..695f3664ce013 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -3,6 +3,7 @@ * * Copyright 2002 Hewlett-Packard Company * Copyright 2005-2008 Pierre Ossman + * Copyright (C) 2018 XiaoMi, Inc. * * Use consistent with the GNU GPL is permitted, * provided that this copyright notice is @@ -3460,6 +3461,7 @@ static inline int mmc_blk_cmdq_part_switch(struct mmc_card *card, struct mmc_host *host = card->host; struct mmc_cmdq_context_info *ctx = &host->cmdq_ctx; u8 part_config = card->ext_csd.part_config; + int ret = 0, err = 0; if ((main_md->part_curr == md->part_type) && (card->part_curr == md->part_type)) @@ -3469,40 +3471,70 @@ static inline int mmc_blk_cmdq_part_switch(struct mmc_card *card, card->ext_csd.cmdq_support && (md->flags & MMC_BLK_CMD_QUEUE))); - if (!test_bit(CMDQ_STATE_HALT, &ctx->curr_state)) - WARN_ON(mmc_cmdq_halt(host, true)); + if (!test_bit(CMDQ_STATE_HALT, &ctx->curr_state)) { + ret = mmc_cmdq_halt(host, true); + if (ret) { + pr_err("%s: %s: halt: failed: %d\n", + mmc_hostname(host), __func__, ret); + goto out; + } + } /* disable CQ mode in card */ if (mmc_card_cmdq(card)) { - WARN_ON(mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, + ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_CMDQ, 0, - card->ext_csd.generic_cmd6_time)); + card->ext_csd.generic_cmd6_time); + if (ret) { + pr_err("%s: %s: cmdq mode disable failed %d\n", + mmc_hostname(host), __func__, ret); + goto cmdq_unhalt; + } mmc_card_clr_cmdq(card); } part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK; part_config |= md->part_type; - WARN_ON(mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, + ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG, part_config, - card->ext_csd.part_time)); + card->ext_csd.part_time); + if (ret) { + pr_err("%s: %s: mmc_switch failure, %d -> %d , err = %d\n", + mmc_hostname(host), __func__, main_md->part_curr, + md->part_type, ret); + goto cmdq_switch; + } card->ext_csd.part_config = part_config; card->part_curr = md->part_type; main_md->part_curr = md->part_type; - WARN_ON(mmc_blk_cmdq_switch(card, md, true)); - WARN_ON(mmc_cmdq_halt(host, false)); - - return 0; +cmdq_switch: + err = mmc_blk_cmdq_switch(card, md, true); + if (err) { + pr_err("%s: %s: mmc_blk_cmdq_switch failed: %d\n", + mmc_hostname(host), __func__, err); + ret = err; + } +cmdq_unhalt: + err = mmc_cmdq_halt(host, false); + if (err) { + pr_err("%s: %s: unhalt: failed: %d\n", + mmc_hostname(host), __func__, err); + ret = err; + } +out: + return ret; } static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req) { - int ret; + int ret, err = 0; struct mmc_blk_data *md = mq->data; struct mmc_card *card = md->queue.card; + struct mmc_host *host = card->host; unsigned int cmd_flags = req ? req->cmd_flags : 0; mmc_get_card(card); @@ -3524,9 +3556,20 @@ static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req) ret = mmc_blk_cmdq_part_switch(card, md); if (ret) { - pr_err("%s: %s: partition switch failed %d\n", + pr_err("%s: %s: partition switch failed %d, resetting cmdq\n", md->disk->disk_name, __func__, ret); - goto out; + + mmc_blk_cmdq_reset(host, false); + err = mmc_blk_cmdq_part_switch(card, md); + if (!err) { + pr_err("%s: %s: partition switch success err = %d\n", + md->disk->disk_name, __func__, err); + } else { + pr_err("%s: %s: partition switch failed err = %d\n", + md->disk->disk_name, __func__, err); + ret = 0; + goto out; + } } if (req) { @@ -3716,7 +3759,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, INIT_LIST_HEAD(&md->part); md->usage = 1; - ret = mmc_init_queue(&md->queue, card, &md->lock, subname, area_type); + ret = mmc_init_queue(&md->queue, card, NULL, subname, area_type); if (ret) goto err_putdisk; @@ -4013,6 +4056,10 @@ static const struct mmc_fixup blk_fixups[] = MMC_FIXUP("SEM32G", CID_MANFID_SANDISK, 0x100, add_quirk, MMC_QUIRK_INAND_CMD38), + MMC_FIXUP(CID_NAME_ANY, CID_MANFID_ANY, CID_OEMID_ANY, + add_quirk_mmc, MMC_QUIRK_BROKEN_CLK_GATING), + + /* * Some MMC cards experience performance degradation with CMD23 * instead of CMD12-bounded multiblock transfers. For now we'll @@ -4099,6 +4146,11 @@ static const struct mmc_fixup blk_fixups[] = MMC_FIXUP("VZL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), + MMC_FIXUP("Q3J96R", CID_MANFID_MICRON, CID_OEMID_ANY, add_quirk_mmc, + MMC_QUIRK_BROKEN_CLK_GATING), + + MMC_FIXUP("Q3J97V", CID_MANFID_MICRON, CID_OEMID_ANY, add_quirk_mmc, + MMC_QUIRK_BROKEN_CLK_GATING), END_FIXUP }; @@ -4115,6 +4167,10 @@ static int mmc_blk_probe(struct mmc_card *card) mmc_fixup_device(card, blk_fixups); + if (mmc_card_mmc(card)) { + pr_info("card->quirks = 0x%x\n", card->quirks); + } + md = mmc_blk_alloc(card); if (IS_ERR(md)) return PTR_ERR(md); diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index ef71d57a08c65..49ea792094f0c 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c @@ -3,6 +3,7 @@ * * Copyright (C) 2003 Russell King, All Rights Reserved. * Copyright 2006-2007 Pierre Ossman + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -715,15 +716,13 @@ int mmc_queue_suspend(struct mmc_queue *mq, int wait) if (wait) { /* - * After blk_stop_queue is called, wait for all + * After blk_cleanup_queue is called, wait for all * active_reqs to complete. * Then wait for cmdq thread to exit before calling * cmdq shutdown to avoid race between issuing * requests and shutdown of cmdq. */ - spin_lock_irqsave(q->queue_lock, flags); - blk_stop_queue(q); - spin_unlock_irqrestore(q->queue_lock, flags); + blk_cleanup_queue(q); if (host->cmdq_ctx.active_reqs) wait_for_completion( @@ -748,10 +747,15 @@ int mmc_queue_suspend(struct mmc_queue *mq, int wait) } if (!(test_and_set_bit(MMC_QUEUE_SUSPENDED, &mq->flags))) { - spin_lock_irqsave(q->queue_lock, flags); - blk_stop_queue(q); - spin_unlock_irqrestore(q->queue_lock, flags); - + if (!wait) { + /* suspend/stop the queue in case of suspend */ + spin_lock_irqsave(q->queue_lock, flags); + blk_stop_queue(q); + spin_unlock_irqrestore(q->queue_lock, flags); + } else { + /* shutdown the queue in case of shutdown/reboot */ + blk_cleanup_queue(q); + } rc = down_trylock(&mq->thread_sem); if (rc && !wait) { /* diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index 99c1d17a8b127..2f83e90bd50f2 100644 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c @@ -169,6 +169,20 @@ static int mmc_bus_suspend(struct device *dev) if (mmc_bus_needs_resume(host)) return 0; ret = host->bus_ops->suspend(host); + + /* + * bus_ops->suspend may fail due to some reason + * In such cases if we return error to PM framework + * from here without calling drv->resume then mmc + * request may get stuck since PM framework will assume + * that mmc bus is not suspended (because of error) and + * it won't call resume again. + * + * So in case of error call drv->resume. + */ + if (ret && dev->driver && drv->resume) + drv->resume(card); + return ret; } diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 91433dfc82714..3cfac0311c370 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -2189,6 +2189,30 @@ void mmc_set_ungated(struct mmc_host *host) } #endif +int mmc_execute_tuning(struct mmc_card *card) +{ + struct mmc_host *host = card->host; + u32 opcode; + int err; + + if (!host->ops->execute_tuning) + return 0; + + if (mmc_card_mmc(card)) + opcode = MMC_SEND_TUNING_BLOCK_HS200; + else + opcode = MMC_SEND_TUNING_BLOCK; + + mmc_host_clk_hold(host); + err = host->ops->execute_tuning(host, opcode); + mmc_host_clk_release(host); + + if (err) + pr_err("%s: tuning execution failed\n", mmc_hostname(host)); + + return err; +} + /* * Change the bus mode (open drain/push-pull) of a host. */ @@ -2875,6 +2899,13 @@ static void _mmc_detect_change(struct mmc_host *host, unsigned long delay, pm_wakeup_event(mmc_dev(host), 5000); host->detect_change = 1; + /* + * Change in cd_gpio state, so make sure detection part is + * not overided because of manual resume. + */ + if (cd_irq && mmc_bus_manual_resume(host)) + host->ignore_bus_resume_flags = true; + mmc_schedule_delayed_work(&host->detect, delay); } @@ -3795,7 +3826,8 @@ void mmc_rescan(struct work_struct *work) host->bus_ops->detect(host); host->detect_change = 0; - + if (host->ignore_bus_resume_flags) + host->ignore_bus_resume_flags = false; /* * Let mmc_bus_put() free the bus/bus_ops if we've found that * the card is no longer present. @@ -4048,7 +4080,8 @@ int mmc_pm_notify(struct notifier_block *notify_block, spin_lock_irqsave(&host->lock, flags); host->rescan_disable = 0; - if (mmc_bus_manual_resume(host)) { + if (mmc_bus_manual_resume(host) && + !host->ignore_bus_resume_flags) { spin_unlock_irqrestore(&host->lock, flags); break; } diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h index 49953c8e27b71..4fc7621e1eb3c 100644 --- a/drivers/mmc/core/core.h +++ b/drivers/mmc/core/core.h @@ -72,6 +72,8 @@ void mmc_remove_card_debugfs(struct mmc_card *card); void mmc_init_context_info(struct mmc_host *host); +int mmc_execute_tuning(struct mmc_card *card); + extern bool mmc_can_scale_clk(struct mmc_host *host); extern int mmc_init_clk_scaling(struct mmc_host *host); extern int mmc_suspend_clk_scaling(struct mmc_host *host); diff --git a/drivers/mmc/core/debugfs.c b/drivers/mmc/core/debugfs.c index aa8dcc87f31a7..8229fb22d5363 100644 --- a/drivers/mmc/core/debugfs.c +++ b/drivers/mmc/core/debugfs.c @@ -2,6 +2,7 @@ * Debugfs support for hosts and cards * * Copyright (C) 2008 Atmel Corporation + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -322,6 +323,34 @@ static int mmc_force_err_set(void *data, u64 val) } DEFINE_SIMPLE_ATTRIBUTE(mmc_force_err_fops, NULL, mmc_force_err_set, "%llu\n"); +#ifdef CONFIG_MMC_ERROR_STATUS +static int mmc_err_state_get(void *data, u64 *val) +{ + struct mmc_host *host = data; + + if (!host) + return -EINVAL; + + *val = host->err_occurred ? 1 : 0; + + return 0; +} + +static int mmc_err_state_clear(void *data, u64 val) +{ + struct mmc_host *host = data; + + if (!host) + return -EINVAL; + + host->err_occurred = false; + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(mmc_err_state, mmc_err_state_get, + mmc_err_state_clear, "%llu\n"); +#endif void mmc_add_host_debugfs(struct mmc_host *host) { @@ -368,7 +397,11 @@ void mmc_add_host_debugfs(struct mmc_host *host) root, host, &mmc_ring_buffer_fops)) goto err_node; #endif - +#ifdef CONFIG_MMC_ERROR_STATUS + if (!debugfs_create_file("err_state", S_IRUSR | S_IWUSR, root, host, + &mmc_err_state)) + goto err_node; +#endif #ifdef CONFIG_MMC_CLKGATE if (!debugfs_create_u32("clk_delay", (S_IRUSR | S_IWUSR), root, &host->clk_delay)) @@ -761,6 +794,9 @@ static ssize_t mmc_bkops_stats_write(struct file *filp, if (!card) return cnt; + if (!access_ok(VERIFY_READ, ubuf, cnt)) + return cnt; + stats = &card->bkops.stats; err = kstrtoint_from_user(ubuf, cnt, 0, &value); diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 317c666fa436f..c111a2f182223 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -4,6 +4,7 @@ * Copyright (C) 2003-2004 Russell King, All Rights Reserved. * Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved. * MMCv4 support Copyright (C) 2006 Philip Langdale, All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -660,6 +661,8 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) ext_csd[EXT_CSD_MAX_PACKED_WRITES]; card->ext_csd.max_packed_reads = ext_csd[EXT_CSD_MAX_PACKED_READS]; + card->ext_csd.life_time_est_typ_a = ext_csd[EXT_CSD_LIFE_TIME_EST_TYP_A]; + card->ext_csd.life_time_est_typ_b = ext_csd[EXT_CSD_LIFE_TIME_EST_TYP_B]; } else { card->ext_csd.data_sector_size = 512; } @@ -808,11 +811,13 @@ MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial); MMC_DEV_ATTR(enhanced_area_offset, "%llu\n", card->ext_csd.enhanced_area_offset); MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size); +MMC_DEV_ATTR(life_time_est_typ_a, "%u\n", card->ext_csd.life_time_est_typ_a); +MMC_DEV_ATTR(life_time_est_typ_b, "%u\n", card->ext_csd.life_time_est_typ_b); MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult); MMC_DEV_ATTR(enhanced_rpmb_supported, "%#x\n", card->ext_csd.enhanced_rpmb_supported); MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors); - +MMC_DEV_ATTR(fw_version, "%#x\n", card->ext_csd.fw_version); static struct attribute *mmc_std_attrs[] = { &dev_attr_cid.attr, &dev_attr_csd.attr, @@ -828,9 +833,12 @@ static struct attribute *mmc_std_attrs[] = { &dev_attr_serial.attr, &dev_attr_enhanced_area_offset.attr, &dev_attr_enhanced_area_size.attr, + &dev_attr_life_time_est_typ_a.attr, + &dev_attr_life_time_est_typ_b.attr, &dev_attr_raw_rpmb_size_mult.attr, &dev_attr_enhanced_rpmb_supported.attr, &dev_attr_rel_sectors.attr, + &dev_attr_fw_version.attr, NULL, }; ATTRIBUTE_GROUPS(mmc_std); @@ -1379,7 +1387,6 @@ EXPORT_SYMBOL(tuning_blk_pattern_8bit); static int mmc_hs200_tuning(struct mmc_card *card) { struct mmc_host *host = card->host; - int err = 0; /* * Timing should be adjusted to the HS400 target @@ -1389,18 +1396,7 @@ static int mmc_hs200_tuning(struct mmc_card *card) host->ios.bus_width == MMC_BUS_WIDTH_8) mmc_set_timing(host, MMC_TIMING_MMC_HS400); - if (host->ops->execute_tuning) { - mmc_host_clk_hold(host); - err = host->ops->execute_tuning(host, - MMC_SEND_TUNING_BLOCK_HS200); - mmc_host_clk_release(host); - - if (err) - pr_warn("%s: tuning execution failed\n", - mmc_hostname(host)); - } - - return err; + return mmc_execute_tuning(card); } static int mmc_select_cmdq(struct mmc_card *card) @@ -2370,7 +2366,7 @@ static int mmc_test_awake_ext_csd(struct mmc_host *host) static int _mmc_suspend(struct mmc_host *host, bool is_suspend) { - int err = 0; + int err = 0, ret; BUG_ON(!host); BUG_ON(!host->card); @@ -2379,7 +2375,9 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend) if (err) { pr_err("%s: %s: fail to suspend clock scaling (%d)\n", mmc_hostname(host), __func__, err); - goto out; + if (host->card->cmdq_init) + wake_up(&host->cmdq_ctx.wait); + return err; } mmc_claim_host(host); @@ -2403,12 +2401,12 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend) if (mmc_card_doing_bkops(host->card)) { err = mmc_stop_bkops(host->card); if (err) - goto out; + goto out_err; } err = mmc_flush_cache(host->card); if (err) - goto out; + goto out_err; if (mmc_can_sleepawake(host)) { /* @@ -2425,16 +2423,38 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend) err = mmc_deselect_cards(host); } - if (!err) { - mmc_power_off(host); - mmc_card_set_suspended(host->card); + if (err) + goto out_err; + mmc_power_off(host); + mmc_card_set_suspended(host->card); + + goto out; + +out_err: + /* + * In case of err let's put controller back in cmdq mode and unhalt + * the controller. + * We expect cmdq_enable and unhalt won't return any error + * since it is anyway enabling few registers. + */ + if (host->card->cmdq_init) { + mmc_host_clk_hold(host); + ret = host->cmdq_ops->enable(host); + if (ret) + pr_err("%s: %s: enabling CMDQ mode failed (%d)\n", + mmc_hostname(host), __func__, ret); + mmc_host_clk_release(host); + mmc_cmdq_halt(host, false); } + out: /* Kick CMDQ thread to process any requests came in while suspending */ if (host->card->cmdq_init) wake_up(&host->cmdq_ctx.wait); mmc_release_host(host); + if (err) + mmc_resume_clk_scaling(host); return err; } diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 08c3144adb27a..1d21b905a03c2 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -730,15 +730,10 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card) * SPI mode doesn't define CMD19 and tuning is only valid for SDR50 and * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. */ - if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning && + if (!mmc_host_is_spi(card->host) && (card->sd_bus_speed == UHS_SDR50_BUS_SPEED || - card->sd_bus_speed == UHS_SDR104_BUS_SPEED)) { - mmc_host_clk_hold(card->host); - err = card->host->ops->execute_tuning(card->host, - MMC_SEND_TUNING_BLOCK); - mmc_host_clk_release(card->host); - } - + card->sd_bus_speed == UHS_SDR104_BUS_SPEED)) + err = mmc_execute_tuning(card); out: kfree(status); @@ -1229,7 +1224,10 @@ static int mmc_sd_suspend(struct mmc_host *host) if (!err) { pm_runtime_disable(&host->card->dev); pm_runtime_set_suspended(&host->card->dev); - } + /* if suspend fails, force mmc_detect_change during resume */ + } else if (mmc_bus_manual_resume(host)) + host->ignore_bus_resume_flags = true; + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; @@ -1278,6 +1276,7 @@ static int _mmc_sd_resume(struct mmc_host *host) if (err) { pr_err("%s: %s: mmc_sd_init_card_failed (%d)\n", mmc_hostname(host), __func__, err); + mmc_power_off(host); goto out; } mmc_card_clr_suspended(host->card); diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 889588d416821..4dbd734889dfd 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -643,17 +643,11 @@ static int mmc_sdio_init_uhs_card(struct mmc_card *card) * SPI mode doesn't define CMD19 and tuning is only valid for SDR50 and * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. */ - if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning && + if (!mmc_host_is_spi(card->host) && ((card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR50) || - (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104))) { - mmc_host_clk_hold(card->host); - err = card->host->ops->execute_tuning(card->host, - MMC_SEND_TUNING_BLOCK); - mmc_host_clk_release(card->host); - } - + (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104))) + err = mmc_execute_tuning(card); out: - return err; } diff --git a/drivers/mmc/host/cmdq_hci.c b/drivers/mmc/host/cmdq_hci.c index de8fb69d9c92c..eb9ccac6d7d25 100644 --- a/drivers/mmc/host/cmdq_hci.c +++ b/drivers/mmc/host/cmdq_hci.c @@ -1,4 +1,5 @@ /* Copyright (c) 2015-2016 The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -403,7 +404,15 @@ static int cmdq_enable(struct mmc_host *mmc) cmdq_writel(cq_host, mmc->card->rca, CQSSC2); /* send QSR at lesser intervals than the default */ - cmdq_writel(cq_host, SEND_QSR_INTERVAL, CQSSC1); + if (CID_MANFID_MICRON == mmc->card->cid.manfid) { + if ((cmdq_readl(cq_host, CQSSC1) | SEND_QSR_INTERVAL) > 0x70040) + + cmdq_writel(cq_host, cmdq_readl(cq_host, CQSSC1) | SEND_QSR_INTERVAL, CQSSC1); + else + cmdq_writel(cq_host, 0x70040, CQSSC1); + } else{ + cmdq_writel(cq_host, SEND_QSR_INTERVAL, CQSSC1); + } /* enable bkops exception indication */ if (mmc_card_configured_manual_bkops(mmc->card) && diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 9f6dfdf4d45c4..af4e167dec0fd 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -172,7 +172,9 @@ static void sdhci_dumpregs(struct sdhci_host *host) readl(host->ioaddr + SDHCI_ADMA_ERROR), readl(host->ioaddr + SDHCI_ADMA_ADDRESS_LOW)); } - + #ifdef CONFIG_MMC_ERROR_STATUS + host->mmc->err_occurred = true; + #endif if (host->ops->dump_vendor_regs) host->ops->dump_vendor_regs(host); sdhci_dump_state(host); diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index 789957d43a137..ef301f45cbdc7 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h @@ -124,7 +124,7 @@ #include #include #include -#include +#include #include #include diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index 2559206d87046..29e8e6eceb64e 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h @@ -22,7 +22,7 @@ #include #include -#include +#include /* compilation time flags */ diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 9af296a1ca999..e5ea8b9973c48 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h @@ -16,6 +16,7 @@ #include #include #include +#include #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index 7785240a0da1a..9416e5a7e0c82 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h index 95f47b9f50d4f..5c8be806b83a7 100644 --- a/drivers/net/ethernet/intel/igb/igb.h +++ b/drivers/net/ethernet/intel/igb/igb.h @@ -29,7 +29,7 @@ #include "e1000_mac.h" #include "e1000_82575.h" -#include +#include #include #include #include diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index 5032a602d5c98..f26eeb705a773 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h @@ -38,7 +38,7 @@ #include #include -#include +#include #include #include diff --git a/drivers/net/ethernet/ti/cpts.h b/drivers/net/ethernet/ti/cpts.h index 1a581ef7eee8f..69a46b92c7d6c 100644 --- a/drivers/net/ethernet/ti/cpts.h +++ b/drivers/net/ethernet/ti/cpts.h @@ -27,6 +27,7 @@ #include #include #include +#include struct cpsw_cpts { u32 idver; /* Identification and version */ diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 0a9e10337142d..a2e4418bb071f 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -723,6 +723,23 @@ const void * __init of_flat_dt_match_machine(const void *default_match, return best_data; } +void __init early_init_dt_check_for_powerup_reason(unsigned long node) +{ + unsigned long pu_reason; + int len; + const __be32 *prop; + + pr_debug("Looking for powerup reason properties... \n"); + + prop = of_get_flat_dt_prop(node, "pureason", &len); + if (!prop) + return; + pu_reason = of_read_ulong(prop, len/4); + early_init_dt_setup_pureason_arch(pu_reason); + + pr_debug("Powerup reason %lu\n", pu_reason); +} + #ifdef CONFIG_BLK_DEV_INITRD /** * early_init_dt_check_for_initrd - Decode initrd location from flat tree @@ -749,6 +766,7 @@ static void __init early_init_dt_check_for_initrd(unsigned long node) initrd_start = (unsigned long)__va(start); initrd_end = (unsigned long)__va(end); initrd_below_start_ok = 1; + early_init_dt_check_for_powerup_reason(node); pr_debug("initrd_start=0x%llx initrd_end=0x%llx\n", (unsigned long long)start, (unsigned long long)end); diff --git a/drivers/of/of_batterydata.c b/drivers/of/of_batterydata.c index 4fddbdefce5b5..cfe46089b72be 100644 --- a/drivers/of/of_batterydata.c +++ b/drivers/of/of_batterydata.c @@ -1,4 +1,5 @@ /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -19,6 +20,7 @@ #include #include #include +#include static int of_batterydata_read_lut(const struct device_node *np, int max_cols, int max_rows, int *ncols, int *nrows, @@ -310,6 +312,17 @@ static int64_t of_batterydata_convert_battery_id_kohm(int batt_id_uv, return resistor_value_kohm; } + +#ifdef CONFIG_C3N_SMB358 +extern int battid_resister; +#endif + +int battery_type_id = 0 ; + +#if defined(CONFIG_A13N_PMI8952) || defined(CONFIG_D1_ROSY) +static char *default_batt_type = "Generic_Battery"; +#endif + struct device_node *of_batterydata_get_best_profile( const struct device_node *batterydata_container_node, const char *psy_name, const char *batt_type) @@ -322,6 +335,7 @@ struct device_node *of_batterydata_get_best_profile( int delta = 0, best_delta = 0, best_id_kohm = 0, id_range_pct, batt_id_kohm = 0, i = 0, rc = 0, limit = 0; bool in_range = false; + bool default_id = false; psy = power_supply_get_by_name(psy_name); if (!psy) { @@ -335,7 +349,13 @@ struct device_node *of_batterydata_get_best_profile( return ERR_PTR(-ENOSYS); } - batt_id_kohm = ret.intval / 1000; +#ifdef CONFIG_C3N_SMB358 + batt_id_kohm = battid_resister; + pr_err("C3N batt_id = %d\n", batt_id_kohm); +#else + batt_id_kohm = ret.intval / 1000; + pr_err("WT batt_id = %d\n", batt_id_kohm); +#endif /* read battery id range percentage for best profile */ rc = of_property_read_u32(batterydata_container_node, @@ -387,6 +407,26 @@ struct device_node *of_batterydata_get_best_profile( } } +#if defined(CONFIG_A13N_PMI8952) || defined(CONFIG_D1_ROSY) + + if (best_node == NULL) { + for_each_child_of_node(batterydata_container_node, node) { + if (default_batt_type != NULL) { + rc = of_property_read_string(node, "qcom,battery-type", + &battery_type); + if (!rc && strcmp(battery_type, default_batt_type) == 0) { + best_node = node; + best_id_kohm = batt_id_kohm; + default_id = true; + pr_err("No battery data found, Use default battery data\n"); + break; + } + } + } + } + +#endif + if (best_node == NULL) { pr_err("No battery data found\n"); return best_node; @@ -394,7 +434,7 @@ struct device_node *of_batterydata_get_best_profile( /* check that profile id is in range of the measured batt_id */ if (abs(best_id_kohm - batt_id_kohm) > - ((best_id_kohm * id_range_pct) / 100)) { + ((best_id_kohm * id_range_pct) / 100) && !default_id) { pr_err("out of range: profile id %d batt id %d pct %d", best_id_kohm, batt_id_kohm, id_range_pct); return NULL; @@ -402,11 +442,24 @@ struct device_node *of_batterydata_get_best_profile( rc = of_property_read_string(best_node, "qcom,battery-type", &battery_type); - if (!rc) + if (!rc) { + hardwareinfo_set_prop(HARDWARE_BATTERY_ID, battery_type); pr_info("%s found\n", battery_type); + } else pr_info("%s found\n", best_node->name); +#ifdef CONFIG_C3N_SMB358 + + if (strcmp(battery_type, "wingtech-feimaotui-4v4-3030mah") == 0) { + battery_type_id = 1; + } else if (strcmp(battery_type, "wingtech-xingwangda-4v4-3030mah") == 0) { + battery_type_id = 2; + } + +#endif + + return best_node; } diff --git a/drivers/platform/msm/qpnp-power-on.c b/drivers/platform/msm/qpnp-power-on.c index 991716f06500a..e3961a3268e4a 100644 --- a/drivers/platform/msm/qpnp-power-on.c +++ b/drivers/platform/msm/qpnp-power-on.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -30,6 +31,8 @@ #include #include +#include + #define CREATE_MASK(NUM_BITS, POS) \ ((unsigned char) (((1 << (NUM_BITS)) - 1) << (POS))) #define PON_MASK(MSB_BIT, LSB_BIT) \ @@ -68,6 +71,7 @@ ((pon)->base + PON_OFFSET((pon)->subtype, 0xA, 0xC2)) #define QPNP_POFF_REASON1(pon) \ ((pon)->base + PON_OFFSET((pon)->subtype, 0xC, 0xC5)) +#define QPNP_POFF_REASON2(pon) ((pon)->base + 0xD) #define QPNP_PON_WARM_RESET_REASON2(pon) ((pon)->base + 0xB) #define QPNP_PON_OFF_REASON(pon) ((pon)->base + 0xC7) #define QPNP_FAULT_REASON1(pon) ((pon)->base + 0xC8) @@ -242,6 +246,7 @@ static const char * const qpnp_pon_reason[] = { [7] = "Triggered from KPD (power key press)", }; +static struct qpnp_pon *fake_power_pon; #define POFF_REASON_FAULT_OFFSET 16 #define POFF_REASON_S3_RESET_OFFSET 32 static const char * const qpnp_poff_reason[] = { @@ -612,6 +617,79 @@ int qpnp_pon_is_warm_reset(void) } EXPORT_SYMBOL(qpnp_pon_is_warm_reset); +int qpnp_pon_is_ps_hold_reset(void) +{ + struct qpnp_pon *pon = sys_reset_dev; + int rc; + u8 reg = 0; + + if (!pon) + return 0; + + rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + QPNP_POFF_REASON1(pon), ®, 1); + if (rc) { + dev_err(&pon->spmi->dev, + "Unable to read addr=%x, rc(%d)\n", + QPNP_POFF_REASON1(pon), rc); + return 0; + } + + /* The bit 1 is 1, means by PS_HOLD/MSM controlled shutdown */ + if (reg & 0x2) + return 1; + + dev_info(&pon->spmi->dev, + "hw_reset reason1 is 0x%x\n", + reg); + + rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + QPNP_POFF_REASON2(pon), ®, 1); + + dev_info(&pon->spmi->dev, + "hw_reset reason2 is 0x%x\n", + reg); + return 0; +} +EXPORT_SYMBOL(qpnp_pon_is_ps_hold_reset); + +int qpnp_pon_is_lpk(void) +{ + struct qpnp_pon *pon = sys_reset_dev; + int rc; + u8 reg = 0; + + if (!pon) + return 0; + + rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + QPNP_POFF_REASON1(pon), ®, 1); + if (rc) { + dev_err(&pon->spmi->dev, + "Unable to read addr=%x, rc(%d)\n", + QPNP_POFF_REASON1(pon), rc); + return 0; + } + + + if (reg & 0x80) + return 1; + + dev_info(&pon->spmi->dev, + "hw_reset reason1 is 0x%x\n", + reg); + + rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + QPNP_POFF_REASON2(pon), ®, 1); + + dev_info(&pon->spmi->dev, + "hw_reset reason2 is 0x%x\n", + reg); + + return 0; +} +EXPORT_SYMBOL(qpnp_pon_is_lpk); + /** * qpnp_pon_wd_config - Disable the wd in a warm reset. * @enable: to enable or disable the PON watch dog @@ -859,6 +937,18 @@ static irqreturn_t qpnp_kpdpwr_irq(int irq, void *_pon) return IRQ_HANDLED; } +void qpnp_kpdpwr_simulate(void) +{ + int rc; + + if (fake_power_pon == NULL) + return; + + rc = qpnp_pon_input_dispatch(fake_power_pon, PON_KPDPWR); + if (rc) + printk(KERN_WARNING "fake_power_pon Unable to send input event\n"); +} + static irqreturn_t qpnp_kpdpwr_bark_irq(int irq, void *_pon) { return IRQ_HANDLED; @@ -1592,6 +1682,7 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) } rc = qpnp_pon_request_irqs(pon, cfg); + fake_power_pon = pon; if (rc) { dev_err(&pon->spmi->dev, "Unable to request-irq's\n"); goto unreg_input_dev; @@ -1963,6 +2054,30 @@ static int read_gen2_pon_off_reason(struct qpnp_pon *pon, u16 *reason, return 0; } +extern char board_id[HARDWARE_MAX_ITEM_LONGTH]; +void probe_board_and_set(void) +{ + char *boadrid_start, *boardvol_start; + char boardid_info[HARDWARE_MAX_ITEM_LONGTH]; + + boadrid_start = strstr(saved_command_line, "board_id="); + boardvol_start = strstr(saved_command_line, "board_vol="); + memset(boardid_info, 0, HARDWARE_MAX_ITEM_LONGTH); + if (boadrid_start != NULL) { + boardvol_start = strstr(boadrid_start, ":board_vol="); + if (boardvol_start != NULL) { + strncpy(boardid_info, boadrid_start+sizeof("board_id=")-1, boardvol_start-(boadrid_start+sizeof("board_id=")-1)); + } else { + strncpy(boardid_info, boadrid_start+sizeof("board_id=")-1, 9); + } + } else { + sprintf(boardid_info, "boarid not define!"); + } + + strcpy(board_id, boardid_info); +} + + static int qpnp_pon_probe(struct spmi_device *spmi) { struct qpnp_pon *pon; @@ -1977,6 +2092,8 @@ static int qpnp_pon_probe(struct spmi_device *spmi) u8 s3_src_reg; unsigned long flags; + printk("heming add qpnp_pon_probe\n"); + pon = devm_kzalloc(&spmi->dev, sizeof(struct qpnp_pon), GFP_KERNEL); if (!pon) { @@ -2330,6 +2447,10 @@ static int qpnp_pon_probe(struct spmi_device *spmi) "qcom,store-hard-reset-reason"); qpnp_pon_debugfs_init(spmi); + + probe_board_and_set(); + printk("heming add qpnp_pon_probe end\n"); + return 0; } diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig index 7d27cc9334bdb..5037004c23127 100644 --- a/drivers/power/Kconfig +++ b/drivers/power/Kconfig @@ -462,6 +462,63 @@ config SMB358_CHARGER The driver reports the charger status via the power supply framework. A charger status change triggers an IRQ via the device STAT pin. +config CHARGER_BQ2560 + tristate "BQ2560X Battery Charger" + depends on I2C + help + Say Y to include support for SMB358 Battery Charger. + SMB358 is a single path switching mode charger capable of charging + Say Y to include support for BQ2560X Battery Charger. + BQ2560X is a single path switching mode charger capable of charging + the battery with 2Amps of current. + The driver supports charger enable/disable. + The driver reports the charger status via the power supply framework. + A charger status change triggers an IRQ via the device STAT pin. + +config GAUGE_BQ27426 + tristate "BQ27426 Battery Fg" + depends on I2C + help + Say Y to include support for BQ27426 Battery Charger. + BQ27426 is a single path switching mode charger capable of charging + the battery with 2Amps of current. + The driver supports charger enable/disable. + The driver reports the charger status via the power supply framework. + A charger status change triggers an IRQ via the device STAT pin. + + +config C3N_SMB358 + bool "to seperate different projects" + default n + help + Say Y here to enable a function which disabled TEMP protect... + WARNNING:Only SCM could open it. + +config C3B_BQ2560X + bool "to seperate different projects" + default n + help + Say Y here to enable a function which disabled TEMP protect... + WARNNING:Only SCM could open it. + +config A13N_PMI8952 + bool "to seperate different projects" + default n + help + Say Y here to enable A13N_PMI8952 macro + +config D1_ROSY + bool "to seperate different projects" + default n + help + Say Y here to enable D1_ROSY macro + +config BATTERY_CW2015 + tristate "CW2015 battery driver" + depends on I2C + help + Say Y here to enable Test sysfs Interface for CW2015 Drivers. + config SMB23X_CHARGER tristate "SMB23X Battery Charger" depends on I2C @@ -616,6 +673,13 @@ config MSM_BCL_PERIPHERAL_CTL provides routines to configure and monitor the BCL PMIC peripheral. +config DISABLE_TEMP_PROTECT + bool "control of TEMP protect" + default n + help + Say Y here to enable a function which disabled TEMP protect... + WARNNING:Only SCM could open it. + source "drivers/power/reset/Kconfig" endif # POWER_SUPPLY diff --git a/drivers/power/Makefile b/drivers/power/Makefile index babd404fbd148..4b0656851721c 100644 --- a/drivers/power/Makefile +++ b/drivers/power/Makefile @@ -66,6 +66,9 @@ obj-$(CONFIG_SMB135X_CHARGER) += smb135x-charger.o obj-$(CONFIG_SMB1360_CHARGER_FG) += smb1360-charger-fg.o obj-$(CONFIG_SMB138X_CHARGER) += smb138x-charger.o pmic-voter.o obj-$(CONFIG_SMB358_CHARGER) += smb358-charger.o +obj-$(CONFIG_BATTERY_CW2015) += cw2015_battery.o ### add for c3 +obj-$(CONFIG_CHARGER_BQ2560) += bq2560x_charger.o +obj-$(CONFIG_GAUGE_BQ27426) += bq27426_fg.o obj-$(CONFIG_SMB23X_CHARGER) += smb23x-charger.o obj-$(CONFIG_BATTERY_BQ28400) += bq28400_battery.o obj-$(CONFIG_QPNP_BMS) += qpnp-bms.o batterydata-lib.o diff --git a/drivers/power/bq2560x.h b/drivers/power/bq2560x.h new file mode 100644 index 0000000000000..373e4aea274a5 --- /dev/null +++ b/drivers/power/bq2560x.h @@ -0,0 +1,69 @@ +/* + * BQ2560x battery charging driver + * + * Copyright (C) 2013 Texas Instruments + * Copyright (C) 2018 XiaoMi, Inc. + * + * This package is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef _LINUX_BQ2560X_I2C_H +#define _LINUX_BQ2560X_I2C_H + +#include + + +struct bq2560x_charge_param { + int vlim; + int ilim; + int ichg; + int vreg; +}; + +enum stat_ctrl { + STAT_CTRL_STAT, + STAT_CTRL_ICHG, + STAT_CTRL_INDPM, + STAT_CTRL_DISABLE, +}; + +enum vboost { + BOOSTV_4850 = 4850, + BOOSTV_5000 = 5000, + BOOSTV_5150 = 5150, + BOOSTV_5300 = 5300, +}; + +enum iboost { + BOOSTI_500 = 500, + BOOSTI_1200 = 1200, +}; + +enum vac_ovp { + VAC_OVP_5500 = 5500, + VAC_OVP_6500 = 6500, + VAC_OVP_10500 = 10500, + VAC_OVP_14300 = 14300, +}; + + +struct bq2560x_platform_data { + struct bq2560x_charge_param usb; + struct bq2560x_charge_param ta; + int iprechg; + int iterm; + + enum stat_ctrl statctrl; + enum vboost boostv; + enum iboost boosti; + enum vac_ovp vac_ovp; + +}; + +#endif diff --git a/drivers/power/bq2560x_charger.c b/drivers/power/bq2560x_charger.c new file mode 100644 index 0000000000000..12918b57bfcbc --- /dev/null +++ b/drivers/power/bq2560x_charger.c @@ -0,0 +1,2466 @@ +/* + * BQ2560x battery charging driver + * + * Copyright (C) 2013 Texas Instruments + * Copyright (C) 2018 XiaoMi, Inc. + * + * This package is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#define pr_fmt(fmt) "bq2560x: %s: " fmt, __func__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bq2560x_reg.h" +#include "bq2560x.h" + +#if 0 +#undef pr_debug +#define pr_debug pr_err +#undef pr_info +#define pr_info pr_err +#undef dev_dbg +#define dev_dbg dev_err +#else +#undef pr_info +#define pr_info pr_debug +#endif + +enum bq2560x_vbus_type { + BQ2560X_VBUS_NONE = REG08_VBUS_TYPE_NONE, + BQ2560X_VBUS_USB = REG08_VBUS_TYPE_USB, + BQ2560X_VBUS_ADAPTER = REG08_VBUS_TYPE_ADAPTER, + BQ2560X_VBUS_OTG = REG08_VBUS_TYPE_OTG, +}; + +enum bq2560x_part_no { + BQ25600 = 0x00, + BQ25601 = 0x02, +}; + +enum { + USER = BIT(0), + JEITA = BIT(1), + BATT_FC = BIT(2), + BATT_PRES = BIT(3), + SOC = BIT(4), + CURRENT = BIT(5), +}; + +enum wakeup_src { + WAKEUP_SRC_MONITOR = 0, + WAKEUP_SRC_JEITA, + WAKEUP_SRC_MAX, +}; + +#define WAKEUP_SRC_MASK (~(~0 << WAKEUP_SRC_MAX)) +struct bq2560x_wakeup_source { + struct wakeup_source source; + unsigned long enabled_bitmap; + spinlock_t ws_lock; +}; + +enum bq2560x_charge_state { + CHARGE_STATE_IDLE = REG08_CHRG_STAT_IDLE, + CHARGE_STATE_PRECHG = REG08_CHRG_STAT_PRECHG, + CHARGE_STATE_FASTCHG = REG08_CHRG_STAT_FASTCHG, + CHARGE_STATE_CHGDONE = REG08_CHRG_STAT_CHGDONE, +}; + +struct bq2560x_otg_regulator { + struct regulator_desc rdesc; + struct regulator_dev *rdev; +}; + + +struct bq2560x { + struct device *dev; + struct i2c_client *client; + + enum bq2560x_part_no part_no; + int revision; + + int gpio_ce; + + int vbus_type; + + int status; + int call_state; + + struct mutex data_lock; + struct mutex i2c_rw_lock; + struct mutex profile_change_lock; + struct mutex charging_disable_lock; + struct mutex irq_complete; + + struct bq2560x_wakeup_source bq2560x_ws; + + bool irq_waiting; + bool irq_disabled; + bool resume_completed; + + bool batt_present; + bool usb_present; + int batt_capacity; + + bool batt_full; + + bool charge_enabled;/* Register bit status */ + bool otg_enabled; + bool batfet_enabled; + bool in_hiz; + + bool vindpm_triggered; + bool iindpm_triggered; + + bool in_therm_regulation; + bool in_vsys_regulation; + + bool power_good; + bool vbus_good; + + bool topoff_active; + bool acov_triggered; + + /* if use software jeita in case of NTC is connected to gauge */ + bool software_jeita_supported; + bool jeita_active; + + bool batt_hot; + bool batt_cold; + bool batt_warm; + bool batt_cool; + bool batt_cool_5; + + int batt_hot_degc; + int batt_warm_degc; + int batt_cold_cool_degc; + int batt_cool_normal_degc; + int batt_cold_degc; + int hot_temp_hysteresis; + int cold_temp_hysteresis; + + int batt_cold_cool_ma; + int batt_cool_normal_ma; + int batt_warm_ma; + int batt_cool_mv; + int batt_warm_mv; + + + int batt_temp; + + int jeita_ma; + int jeita_mv; + + unsigned int thermal_levels; + unsigned int therm_lvl_sel; + unsigned int *thermal_mitigation; + + int usb_psy_ma; + int charge_state; + int charging_disabled_status; + + int fault_status; + + int skip_writes; + int skip_reads; + + struct bq2560x_platform_data *platform_data; + + struct delayed_work discharge_jeita_work; + struct delayed_work charge_jeita_work; + + struct alarm jeita_alarm; + + struct dentry *debug_root; + + struct bq2560x_otg_regulator otg_vreg; + + struct power_supply *usb_psy; + struct power_supply *bms_psy; + struct power_supply batt_psy; +}; + +static int BatteryTestStatus_enable; +static int bq2560x_battery_capacity; + +#define FG_LOG_INTERVAL 150 +static void bq2560x_dump_status(struct bq2560x *bq); +static int calculate_jeita_poll_interval(struct bq2560x *bq); +static void bq2560x_dump_fg_reg(struct bq2560x *bq) +{ + union power_supply_propval val = {0,}; + static int dump_cnt; + + if (++dump_cnt >= (FG_LOG_INTERVAL / calculate_jeita_poll_interval(bq))) { + dump_cnt = 0; + val.intval = 0; + bq->bms_psy->set_property(bq->bms_psy, + POWER_SUPPLY_PROP_UPDATE_NOW, &val); + bq2560x_dump_status(bq); + } +} + + +static int __bq2560x_read_reg(struct bq2560x *bq, u8 reg, u8 *data) +{ + s32 ret; + + ret = i2c_smbus_read_byte_data(bq->client, reg); + if (ret < 0) { + pr_err("i2c read fail: can't read from reg 0x%02X\n", reg); + return ret; + } + + *data = (u8)ret; + + return 0; +} + +static int __bq2560x_write_reg(struct bq2560x *bq, int reg, u8 val) +{ + s32 ret; + + ret = i2c_smbus_write_byte_data(bq->client, reg, val); + if (ret < 0) { + pr_err("i2c write fail: can't write 0x%02X to reg 0x%02X: %d\n", + val, reg, ret); + return ret; + } + return 0; +} + +static int bq2560x_read_byte(struct bq2560x *bq, u8 *data, u8 reg) +{ + int ret; + + if (bq->skip_reads) { + *data = 0; + return 0; + } + + mutex_lock(&bq->i2c_rw_lock); + ret = __bq2560x_read_reg(bq, reg, data); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + + +static int bq2560x_write_byte(struct bq2560x *bq, u8 reg, u8 data) +{ + int ret; + + if (bq->skip_writes) { + return 0; + } + + mutex_lock(&bq->i2c_rw_lock); + ret = __bq2560x_write_reg(bq, reg, data); + mutex_unlock(&bq->i2c_rw_lock); + + if (ret) { + pr_err("Failed: reg=%02X, ret=%d\n", reg, ret); + } + + return ret; +} + + +static int bq2560x_update_bits(struct bq2560x *bq, u8 reg, + u8 mask, u8 data) +{ + int ret; + u8 tmp; + + + if (bq->skip_reads || bq->skip_writes) + return 0; + + mutex_lock(&bq->i2c_rw_lock); + ret = __bq2560x_read_reg(bq, reg, &tmp); + if (ret) { + pr_err("Failed: reg=%02X, ret=%d\n", reg, ret); + goto out; + } + + tmp &= ~mask; + tmp |= data & mask; + + ret = __bq2560x_write_reg(bq, reg, tmp); + if (ret) { + pr_err("Failed: reg=%02X, ret=%d\n", reg, ret); + } + +out: + mutex_unlock(&bq->i2c_rw_lock); + return ret; +} +static void bq2560x_stay_awake(struct bq2560x_wakeup_source *source, + enum wakeup_src wk_src) +{ + unsigned long flags; + + spin_lock_irqsave(&source->ws_lock, flags); + + if (!__test_and_set_bit(wk_src, &source->enabled_bitmap)) { + __pm_stay_awake(&source->source); + pr_debug("enabled source %s, wakeup_src %d\n", + source->source.name, wk_src); + } + spin_unlock_irqrestore(&source->ws_lock, flags); +} + +static void bq2560x_relax(struct bq2560x_wakeup_source *source, + enum wakeup_src wk_src) +{ + unsigned long flags; + + spin_lock_irqsave(&source->ws_lock, flags); + if (__test_and_clear_bit(wk_src, &source->enabled_bitmap) && + !(source->enabled_bitmap & WAKEUP_SRC_MASK)) { + __pm_relax(&source->source); + pr_debug("disabled source %s\n", source->source.name); + } + spin_unlock_irqrestore(&source->ws_lock, flags); + + pr_debug("relax source %s, wakeup_src %d\n", + source->source.name, wk_src); +} + +static void bq2560x_wakeup_src_init(struct bq2560x *bq) +{ + spin_lock_init(&bq->bq2560x_ws.ws_lock); + wakeup_source_init(&bq->bq2560x_ws.source, "bq2560x"); +} + + + +static int bq2560x_enable_otg(struct bq2560x *bq) +{ + u8 val = REG01_OTG_ENABLE << REG01_OTG_CONFIG_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_01, + REG01_OTG_CONFIG_MASK, val); + +} + +static int bq2560x_disable_otg(struct bq2560x *bq) +{ + u8 val = REG01_OTG_DISABLE << REG01_OTG_CONFIG_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_01, + REG01_OTG_CONFIG_MASK, val); + +} + +static int bq2560x_enable_charger(struct bq2560x *bq) +{ + int ret; + u8 val = REG01_CHG_ENABLE << REG01_CHG_CONFIG_SHIFT; + + ret = bq2560x_update_bits(bq, BQ2560X_REG_01, REG01_CHG_CONFIG_MASK, val); + + return ret; +} + +static int bq2560x_disable_charger(struct bq2560x *bq) +{ + int ret; + u8 val = REG01_CHG_DISABLE << REG01_CHG_CONFIG_SHIFT; + + ret = bq2560x_update_bits(bq, BQ2560X_REG_01, REG01_CHG_CONFIG_MASK, val); + return ret; +} + +int bq2560x_set_chargecurrent(struct bq2560x *bq, int curr) +{ + u8 ichg; + + ichg = (curr - REG02_ICHG_BASE)/REG02_ICHG_LSB; + return bq2560x_update_bits(bq, BQ2560X_REG_02, REG02_ICHG_MASK, + ichg << REG02_ICHG_SHIFT); + +} + +int bq2560x_set_term_current(struct bq2560x *bq, int curr) +{ + u8 iterm; + + iterm = (curr - REG03_ITERM_BASE) / REG03_ITERM_LSB; + + return bq2560x_update_bits(bq, BQ2560X_REG_03, REG03_ITERM_MASK, + iterm << REG03_ITERM_SHIFT); +} + + +int bq2560x_set_prechg_current(struct bq2560x *bq, int curr) +{ + u8 iprechg; + + iprechg = (curr - REG03_IPRECHG_BASE) / REG03_IPRECHG_LSB; + + return bq2560x_update_bits(bq, BQ2560X_REG_03, REG03_IPRECHG_MASK, + iprechg << REG03_IPRECHG_SHIFT); +} + +int bq2560x_set_chargevolt(struct bq2560x *bq, int volt) +{ + u8 val; + + val = (volt - REG04_VREG_BASE)/REG04_VREG_LSB; + return bq2560x_update_bits(bq, BQ2560X_REG_04, REG04_VREG_MASK, + val << REG04_VREG_SHIFT); +} + + +int bq2560x_set_input_volt_limit(struct bq2560x *bq, int volt) +{ + u8 val; + val = (volt - REG06_VINDPM_BASE) / REG06_VINDPM_LSB; + return bq2560x_update_bits(bq, BQ2560X_REG_06, REG06_VINDPM_MASK, + val << REG06_VINDPM_SHIFT); +} + +int bq2560x_set_input_current_limit(struct bq2560x *bq, int curr) +{ + u8 val; + + val = (curr - REG00_IINLIM_BASE) / REG00_IINLIM_LSB; + return bq2560x_update_bits(bq, BQ2560X_REG_00, REG00_IINLIM_MASK, + val << REG00_IINLIM_SHIFT); +} + + +int bq2560x_set_watchdog_timer(struct bq2560x *bq, u8 timeout) +{ + u8 temp; + + temp = (u8)(((timeout - REG05_WDT_BASE) / REG05_WDT_LSB) << REG05_WDT_SHIFT); + + return bq2560x_update_bits(bq, BQ2560X_REG_05, REG05_WDT_MASK, temp); +} +EXPORT_SYMBOL_GPL(bq2560x_set_watchdog_timer); + +int bq2560x_disable_watchdog_timer(struct bq2560x *bq) +{ + u8 val = REG05_WDT_DISABLE << REG05_WDT_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_05, REG05_WDT_MASK, val); +} +EXPORT_SYMBOL_GPL(bq2560x_disable_watchdog_timer); + +int bq2560x_reset_watchdog_timer(struct bq2560x *bq) +{ + u8 val = REG01_WDT_RESET << REG01_WDT_RESET_SHIFT; + + pr_err("bq2560x_reset_watchdog_timer\n"); + return bq2560x_update_bits(bq, BQ2560X_REG_01, REG01_WDT_RESET_MASK, val); +} +EXPORT_SYMBOL_GPL(bq2560x_reset_watchdog_timer); + +int bq2560x_reset_chip(struct bq2560x *bq) +{ + int ret; + u8 val = REG0B_REG_RESET << REG0B_REG_RESET_SHIFT; + + ret = bq2560x_update_bits(bq, BQ2560X_REG_0B, REG0B_REG_RESET_MASK, val); + return ret; +} +EXPORT_SYMBOL_GPL(bq2560x_reset_chip); + +int bq2560x_enter_hiz_mode(struct bq2560x *bq) +{ + u8 val = REG00_HIZ_ENABLE << REG00_ENHIZ_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_00, REG00_ENHIZ_MASK, val); + +} +EXPORT_SYMBOL_GPL(bq2560x_enter_hiz_mode); + +int bq2560x_exit_hiz_mode(struct bq2560x *bq) +{ + + u8 val = REG00_HIZ_DISABLE << REG00_ENHIZ_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_00, REG00_ENHIZ_MASK, val); + +} +EXPORT_SYMBOL_GPL(bq2560x_exit_hiz_mode); + +int bq2560x_get_hiz_mode(struct bq2560x *bq, u8 *state) +{ + u8 val; + int ret; + + ret = bq2560x_read_byte(bq, &val, BQ2560X_REG_00); + if (ret) + return ret; + *state = (val & REG00_ENHIZ_MASK) >> REG00_ENHIZ_SHIFT; + + return 0; +} +EXPORT_SYMBOL_GPL(bq2560x_get_hiz_mode); + + +static int bq2560x_enable_term(struct bq2560x *bq, bool enable) +{ + u8 val; + int ret; + + if (enable) + val = REG05_TERM_ENABLE << REG05_EN_TERM_SHIFT; + else + val = REG05_TERM_DISABLE << REG05_EN_TERM_SHIFT; + + ret = bq2560x_update_bits(bq, BQ2560X_REG_05, REG05_EN_TERM_MASK, val); + + return ret; +} +EXPORT_SYMBOL_GPL(bq2560x_enable_term); + +int bq2560x_set_boost_current(struct bq2560x *bq, int curr) +{ + u8 val; + + val = REG02_BOOST_LIM_0P5A; + if (curr == BOOSTI_1200) + val = REG02_BOOST_LIM_1P2A; + + return bq2560x_update_bits(bq, BQ2560X_REG_02, REG02_BOOST_LIM_MASK, + val << REG02_BOOST_LIM_SHIFT); +} + +int bq2560x_set_boost_voltage(struct bq2560x *bq, int volt) +{ + u8 val; + + if (volt == BOOSTV_4850) + val = REG06_BOOSTV_4P85V; + else if (volt == BOOSTV_5150) + val = REG06_BOOSTV_5P15V; + else if (volt == BOOSTV_5300) + val = REG06_BOOSTV_5P3V; + else + val = REG06_BOOSTV_5V; + + return bq2560x_update_bits(bq, BQ2560X_REG_06, REG06_BOOSTV_MASK, + val << REG06_BOOSTV_SHIFT); +} + +static int bq2560x_set_acovp_threshold(struct bq2560x *bq, int volt) +{ + u8 val; + + if (volt == VAC_OVP_14300) + val = REG06_OVP_14P3V; + else if (volt == VAC_OVP_10500) + val = REG06_OVP_10P5V; + else if (volt == VAC_OVP_6500) + val = REG06_OVP_6P5V; + else + val = REG06_OVP_5P5V; + + return bq2560x_update_bits(bq, BQ2560X_REG_06, REG06_OVP_MASK, + val << REG06_OVP_SHIFT); +} + + +static int bq2560x_set_stat_ctrl(struct bq2560x *bq, int ctrl) +{ + u8 val; + + val = ctrl; + + return bq2560x_update_bits(bq, BQ2560X_REG_00, REG00_STAT_CTRL_MASK, + val << REG00_STAT_CTRL_SHIFT); +} + + +static int bq2560x_set_int_mask(struct bq2560x *bq, int mask) +{ + u8 val; + + val = mask; + + return bq2560x_update_bits(bq, BQ2560X_REG_0A, REG0A_INT_MASK_MASK, + val << REG0A_INT_MASK_SHIFT); +} + + +static int bq2560x_enable_batfet(struct bq2560x *bq) +{ + const u8 val = REG07_BATFET_ON << REG07_BATFET_DIS_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_07, REG07_BATFET_DIS_MASK, + val); +} +EXPORT_SYMBOL_GPL(bq2560x_enable_batfet); + + +static int bq2560x_disable_batfet(struct bq2560x *bq) +{ + const u8 val = REG07_BATFET_OFF << REG07_BATFET_DIS_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_07, REG07_BATFET_DIS_MASK, + val); +} +EXPORT_SYMBOL_GPL(bq2560x_disable_batfet); + +static int bq2560x_set_batfet_delay(struct bq2560x *bq, uint8_t delay) +{ + u8 val; + + if (delay == 0) + val = REG07_BATFET_DLY_0S; + else + val = REG07_BATFET_DLY_10S; + + val <<= REG07_BATFET_DLY_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_07, REG07_BATFET_DLY_MASK, + val); +} +EXPORT_SYMBOL_GPL(bq2560x_set_batfet_delay); + +static int bq2560x_charging_disable(struct bq2560x *bq, int reason, + int disable) +{ + + int ret = 0; + int disabled; + + mutex_lock(&bq->charging_disable_lock); + + disabled = bq->charging_disabled_status; + + pr_err("reason=%d requested_disable=%d disabled_status=%d\n", + reason, disable, disabled); + + if (disable == true) + disabled |= reason; + else + disabled &= ~reason; + + if (disabled && bq->charge_enabled) + ret = bq2560x_disable_charger(bq); + else if (!disabled && !bq->charge_enabled) + ret = bq2560x_enable_charger(bq); + + if (ret) { + pr_err("Couldn't disable/enable charging for reason=%d ret=%d\n", + ret, reason); + } else { + bq->charging_disabled_status = disabled; + mutex_lock(&bq->data_lock); + bq->charge_enabled = !disabled; + mutex_unlock(&bq->data_lock); + } + mutex_unlock(&bq->charging_disable_lock); + + return ret; +} + + +static struct power_supply *get_bms_psy(struct bq2560x *bq) +{ + if (bq->bms_psy) + return bq->bms_psy; + bq->bms_psy = power_supply_get_by_name("bms"); + if (!bq->bms_psy) + pr_debug("bms power supply not found\n"); + + return bq->bms_psy; +} + +static int bq2560x_get_batt_property(struct bq2560x *bq, + enum power_supply_property psp, + union power_supply_propval *val) +{ + struct power_supply *bms_psy = get_bms_psy(bq); + + int ret; + + if (!bms_psy) + return -EINVAL; + + ret = bms_psy->get_property(bms_psy, psp, val); + + return ret; +} + +static inline bool is_device_suspended(struct bq2560x *bq); +static int bq2560x_get_prop_charge_type(struct bq2560x *bq) +{ + u8 val = 0; + if (is_device_suspended(bq)) + return POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; + + bq2560x_read_byte(bq, &val, BQ2560X_REG_08); + val &= REG08_CHRG_STAT_MASK; + val >>= REG08_CHRG_STAT_SHIFT; + switch (val) { + case CHARGE_STATE_FASTCHG: + return POWER_SUPPLY_CHARGE_TYPE_FAST; + case CHARGE_STATE_PRECHG: + return POWER_SUPPLY_CHARGE_TYPE_TRICKLE; + case CHARGE_STATE_CHGDONE: + case CHARGE_STATE_IDLE: + return POWER_SUPPLY_CHARGE_TYPE_NONE; + default: + return POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; + } +} + +static int bq2560x_get_prop_batt_present(struct bq2560x *bq) +{ + union power_supply_propval batt_prop = {0,}; + int ret; + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_PRESENT, &batt_prop); + if (!ret) { + mutex_lock(&bq->data_lock); + bq->batt_present = batt_prop.intval; + mutex_unlock(&bq->data_lock); + } + return ret; + +} + +static int bq2560x_get_prop_batt_capacity(struct bq2560x *bq) +{ + union power_supply_propval batt_prop = {0,}; + int ret; + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_CAPACITY, &batt_prop); + + if (!ret) + bq->batt_capacity = batt_prop.intval; + + return ret; + +} + + +static int bq2560x_get_prop_batt_full(struct bq2560x *bq) +{ + union power_supply_propval batt_prop = {0,}; + int ret; + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_STATUS, &batt_prop); + if (!ret) { + mutex_lock(&bq->data_lock); + bq->batt_full = (batt_prop.intval == POWER_SUPPLY_STATUS_FULL); + mutex_unlock(&bq->data_lock); + } + return ret; +} + +static int bq2560x_get_prop_charge_status(struct bq2560x *bq) +{ + union power_supply_propval batt_prop = {0,}; + int ret; + u8 status; + + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_08); + if (ret) { + return POWER_SUPPLY_STATUS_UNKNOWN; + } + + mutex_lock(&bq->data_lock); + bq->charge_state = (status & REG08_CHRG_STAT_MASK) >> REG08_CHRG_STAT_SHIFT; + mutex_unlock(&bq->data_lock); + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_STATUS, &batt_prop); + if (!ret && ((batt_prop.intval == POWER_SUPPLY_STATUS_FULL) || + (bq->jeita_active && (bq->charge_state == CHARGE_STATE_CHGDONE)))) + return POWER_SUPPLY_STATUS_FULL; + + + switch (bq->charge_state) { + case CHARGE_STATE_FASTCHG: + case CHARGE_STATE_PRECHG: + return POWER_SUPPLY_STATUS_CHARGING; + case CHARGE_STATE_CHGDONE: + return POWER_SUPPLY_STATUS_NOT_CHARGING; + case CHARGE_STATE_IDLE: + return POWER_SUPPLY_STATUS_DISCHARGING; + default: + return POWER_SUPPLY_STATUS_UNKNOWN; + } + +} + +static int bq2560x_get_prop_health(struct bq2560x *bq) +{ + int ret; + union power_supply_propval batt_prop = {0,}; + + if (bq->software_jeita_supported) { + if (bq->jeita_active) { + if (bq->batt_hot) + ret = POWER_SUPPLY_HEALTH_OVERHEAT; + else if (bq->batt_warm) + ret = POWER_SUPPLY_HEALTH_WARM; + else if (bq->batt_cool) + ret = POWER_SUPPLY_HEALTH_COOL; + else if (bq->batt_cold) + ret = POWER_SUPPLY_HEALTH_COLD; + } else { + ret = POWER_SUPPLY_HEALTH_GOOD; + } + } else {/* get health status from gauge */ + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_HEALTH, &batt_prop); + if (!ret) + ret = batt_prop.intval; + else + ret = POWER_SUPPLY_HEALTH_UNKNOWN; + } + return ret; +} + + +static enum power_supply_property bq2560x_charger_props[] = { + + POWER_SUPPLY_PROP_CHARGE_TYPE, + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_CHARGING_ENABLED, + POWER_SUPPLY_PROP_CHARGING_CALL_STATE, + POWER_SUPPLY_PROP_HEALTH, + POWER_SUPPLY_PROP_CAPACITY, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CURRENT_NOW, + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, + + POWER_SUPPLY_PROP_CAPACITY_LEVEL, + POWER_SUPPLY_PROP_TEMP, + + POWER_SUPPLY_PROP_CHARGE_FULL, + + + + POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL, + POWER_SUPPLY_PROP_TECHNOLOGY, + POWER_SUPPLY_PROP_RESISTANCE_ID, +}; + +void static runin_work(struct bq2560x *bq, int runin_flag) +{ + int rc; + + if (1 == runin_flag) { + pr_err("bq2560x_enter_hiz_mode, bq->usb_present = %d\n", bq->usb_present); + rc = bq2560x_enter_hiz_mode(bq); + if (rc) { + dev_err(bq->dev, "Couldn't disenable charge rc=%d\n", rc); + } + } else if (2 == runin_flag) { + pr_err("bq2560x_exit_hiz_mode, bq->usb_present = %d\n", bq->usb_present); + rc = bq2560x_exit_hiz_mode(bq); + if (rc) { + dev_err(bq->dev, "Couldn't enable charge rc=%d\n", rc); + } + } +} + + +static int bq2560x_charger_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) +{ + + struct bq2560x *bq = container_of(psy, struct bq2560x, batt_psy); + + switch (psp) { + case POWER_SUPPLY_PROP_CHARGE_TYPE: + val->intval = bq2560x_get_prop_charge_type(bq); + pr_debug("POWER_SUPPLY_PROP_CHARGE_TYPE:%d\n", val->intval); + break; + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: + val->intval = bq->call_state; + break; + case POWER_SUPPLY_PROP_CHARGING_ENABLED: + val->intval = bq->charge_enabled; + break; + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + val->intval = 3000; + break; + case POWER_SUPPLY_PROP_STATUS: + val->intval = bq2560x_get_prop_charge_status(bq); + break; + case POWER_SUPPLY_PROP_HEALTH: + val->intval = bq2560x_get_prop_health(bq); + break; + case POWER_SUPPLY_PROP_CAPACITY: + bq2560x_get_batt_property(bq, psp, val); + bq2560x_battery_capacity = val->intval; + + break; + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: + val->intval = bq->therm_lvl_sel; + break; + case POWER_SUPPLY_PROP_PRESENT: + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + case POWER_SUPPLY_PROP_CURRENT_NOW: + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + case POWER_SUPPLY_PROP_TEMP: + case POWER_SUPPLY_PROP_CHARGE_FULL: + case POWER_SUPPLY_PROP_TECHNOLOGY: + case POWER_SUPPLY_PROP_RESISTANCE_ID: + return bq2560x_get_batt_property(bq, psp, val); + default: + return -EINVAL; + + } + + return 0; +} + +static int bq2560x_system_temp_level_set(struct bq2560x *bq, int); +static int bq2560x_update_charging_profile(struct bq2560x *bq); +extern int bq_runin_test; +static int bq2560x_charger_set_property(struct power_supply *psy, + enum power_supply_property prop, + const union power_supply_propval *val) +{ + struct bq2560x *bq = container_of(psy, + struct bq2560x, batt_psy); + + switch (prop) { + case POWER_SUPPLY_PROP_CHARGING_ENABLED: + bq2560x_charging_disable(bq, USER, !val->intval); + + if (bq_runin_test) { + pr_err("bq_runin_test\n"); + runin_work(bq, bq_runin_test); + bq_runin_test = 0; + } + + power_supply_changed(&bq->batt_psy); + power_supply_changed(bq->usb_psy); + pr_info("POWER_SUPPLY_PROP_CHARGING_ENABLED: %s\n", + val->intval ? "enable" : "disable"); + break; + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: + bq2560x_system_temp_level_set(bq, val->intval); + break; + + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: + bq->call_state = val->intval; + bq2560x_update_charging_profile(bq); + break; + + default: + return -EINVAL; + } + + return 0; +} + +static int bq2560x_charger_is_writeable(struct power_supply *psy, + enum power_supply_property prop) +{ + int ret; + + switch (prop) { + case POWER_SUPPLY_PROP_CHARGING_ENABLED: + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: + ret = 1; + break; + default: + ret = 0; + break; + } + return ret; +} + +#define calling_current_max 700 +static int bq2560x_update_charging_profile(struct bq2560x *bq) +{ + int ret; + int chg_ma; + int chg_mv; + int icl; + int therm_ma; + + union power_supply_propval prop = {0,}; + + + if (!bq->usb_present) + return 0; + + ret = bq->usb_psy->get_property(bq->usb_psy, + POWER_SUPPLY_PROP_TYPE, &prop); + + if (ret < 0) { + pr_err("couldn't read USB TYPE property, ret=%d\n", ret); + return ret; + } + + mutex_lock(&bq->profile_change_lock); + if (bq->jeita_active) { + chg_ma = bq->jeita_ma; + chg_mv = bq->jeita_mv; + } else { + if (prop.intval == POWER_SUPPLY_TYPE_USB_DCP || prop.intval == POWER_SUPPLY_TYPE_USB_CDP) { + chg_ma = bq->platform_data->ta.ichg; + chg_mv = bq->platform_data->ta.vreg; + } else { + chg_ma = bq->platform_data->usb.ichg; + chg_mv = bq->platform_data->usb.vreg; + } + } + + icl = bq->usb_psy_ma; + if (bq->therm_lvl_sel > 0 + && bq->therm_lvl_sel < (bq->thermal_levels - 1)) + /* + * consider thermal limit only when it is active and not at + * the highest level + */ + therm_ma = bq->thermal_mitigation[bq->therm_lvl_sel]; + else + therm_ma = bq->usb_psy_ma; + + icl = min(therm_ma, icl); + + + if (bq->call_state == 0) { + if (prop.intval == POWER_SUPPLY_TYPE_USB_DCP || prop.intval == POWER_SUPPLY_TYPE_USB_CDP) { + if (bq->jeita_active) { + icl = bq->jeita_ma; + } else{ + icl = calling_current_max; + } + } else{ + icl = bq->platform_data->usb.ichg; + } + pr_err("bq2560x_set_calling_current to =%d\n", icl); + } + + + pr_info("charge volt = %d, charge curr = %d, input curr limit = %d\n", + chg_mv, chg_ma, icl); + + ret = bq2560x_set_input_current_limit(bq, icl); + if (ret < 0) + pr_err("couldn't set input current limit, ret=%d\n", ret); + + ret = bq2560x_set_input_volt_limit(bq, bq->platform_data->ta.vlim); + if (ret < 0) + pr_err("couldn't set input voltage limit, ret=%d\n", ret); + +#ifdef CONFIG_DISABLE_TEMP_PROTECT + chg_mv = 4100; +#endif + + ret = bq2560x_set_chargevolt(bq, chg_mv); + if (ret < 0) + pr_err("couldn't set charge voltage ret=%d\n", ret); + + ret = bq2560x_set_chargecurrent(bq, chg_ma); + if (ret < 0) + pr_err("couldn't set charge current, ret=%d\n", ret); + + mutex_unlock(&bq->profile_change_lock); + + return 0; +} + + +static int bq2560x_system_temp_level_set(struct bq2560x *bq, + int lvl_sel) +{ + int ret = 0; + int prev_therm_lvl; + + pr_err("%s lvl_sel=%d, bq->therm_lvl_sel = %d\n", __func__, lvl_sel, bq->therm_lvl_sel); + if (BatteryTestStatus_enable) + return 0; + + if (!bq->thermal_mitigation) { + pr_err("Thermal mitigation not supported\n"); + return -EINVAL; + } + + if (lvl_sel < 0) { + pr_err("Unsupported level selected %d\n", lvl_sel); + return -EINVAL; + } + + if (lvl_sel >= bq->thermal_levels) { + pr_err("Unsupported level selected %d forcing %d\n", lvl_sel, + bq->thermal_levels - 1); + lvl_sel = bq->thermal_levels - 1; + } + + if (lvl_sel == bq->therm_lvl_sel) + return 0; + + + prev_therm_lvl = bq->therm_lvl_sel; + bq->therm_lvl_sel = lvl_sel; + + ret = bq2560x_update_charging_profile(bq); + if (ret) + pr_err("Couldn't set USB current ret = %d\n", ret); + + + return ret; +} + +static void bq2560x_factory_mode_control_capacity_work(struct bq2560x *bq) +{ +#ifdef WT_COMPILE_FACTORY_VERSION + int ret; + + pr_err("bq2560x_factory_mode_control_capacity_work\n"); + if (bq2560x_battery_capacity >= 80 && bq2560x_battery_capacity <= 100) { + ret = bq2560x_charging_disable(bq, SOC, true); + if (ret) { + dev_err(bq->dev, "factory_mode_control_capacity disable fail: %d\n", ret); + } + } else if (bq2560x_battery_capacity >= 0 && bq2560x_battery_capacity < 80) { + ret = bq2560x_charging_disable(bq, SOC, false); + if (ret) { + dev_err(bq->dev, "actory_mode_control_capacity enable fail: %d\n", ret); + } + } + +#endif + +} + +static int pc_suspend; +static void bq2560x_external_power_changed(struct power_supply *psy) +{ + struct bq2560x *bq = container_of(psy, struct bq2560x, batt_psy); + + union power_supply_propval prop = {0,}; + int ret, current_limit = 0; + + + ret = bq->usb_psy->get_property(bq->usb_psy, + POWER_SUPPLY_PROP_CURRENT_MAX, &prop); + if (ret < 0) + pr_err("could not read USB current_max property, ret=%d\n", ret); + else + current_limit = prop.intval / 1000; + + pr_info("current_limit = %d\n", current_limit); + + if (bq->usb_psy_ma != current_limit) { + bq->usb_psy_ma = current_limit; + bq2560x_update_charging_profile(bq); + if (current_limit <= 2) { + pc_suspend = 1; + bq2560x_charging_disable(bq, CURRENT, 1); + } else{ + pc_suspend = 0; + bq2560x_charging_disable(bq, CURRENT, 0); + } + } + + ret = bq->usb_psy->get_property(bq->usb_psy, + POWER_SUPPLY_PROP_ONLINE, &prop); + if (ret < 0) + pr_err("could not read USB ONLINE property, ret=%d\n", ret); + else + pr_info("usb online status =%d\n", prop.intval); + + ret = 0; + bq2560x_get_prop_charge_status(bq); + if (bq->usb_present && !pc_suspend/*&& bq->charge_state != CHARGE_STATE_IDLE*//* && bq->charge_enabled *//*!bq->charging_disabled_status*/ + /*&& bq->usb_psy_ma != 0*/) { + if (prop.intval == 0) { + pr_err("set usb online\n"); + ret = power_supply_set_online(bq->usb_psy, true); + } + } else { + if (prop.intval == 1) { + pr_err("set usb offline\n"); + ret = power_supply_set_online(bq->usb_psy, false); + } + } + + if (ret < 0) + pr_info("could not set usb online state, ret=%d\n", ret); +} + + +static int bq2560x_psy_register(struct bq2560x *bq) +{ + int ret; + + bq->batt_psy.name = "battery"; + bq->batt_psy.type = POWER_SUPPLY_TYPE_BATTERY; + bq->batt_psy.properties = bq2560x_charger_props; + bq->batt_psy.num_properties = ARRAY_SIZE(bq2560x_charger_props); + bq->batt_psy.get_property = bq2560x_charger_get_property; + bq->batt_psy.set_property = bq2560x_charger_set_property; + bq->batt_psy.external_power_changed = bq2560x_external_power_changed; + bq->batt_psy.property_is_writeable = bq2560x_charger_is_writeable; + + ret = power_supply_register(bq->dev, &bq->batt_psy); + if (ret < 0) { + pr_err("failed to register batt_psy:%d\n", ret); + return ret; + } + + return 0; +} + +static void bq2560x_psy_unregister(struct bq2560x *bq) +{ + power_supply_unregister(&bq->batt_psy); +} + + +static int bq2560x_otg_regulator_enable(struct regulator_dev *rdev) +{ + int ret; + struct bq2560x *bq = rdev_get_drvdata(rdev); + + ret = bq2560x_enable_otg(bq); + if (ret) { + pr_err("Couldn't enable OTG mode ret=%d\n", ret); + } else { + bq->otg_enabled = true; + pr_info("bq2560x OTG mode Enabled!\n"); + } + + return ret; +} + + +static int bq2560x_otg_regulator_disable(struct regulator_dev *rdev) +{ + int ret; + struct bq2560x *bq = rdev_get_drvdata(rdev); + + ret = bq2560x_disable_otg(bq); + if (ret) { + pr_err("Couldn't disable OTG mode, ret=%d\n", ret); + } else { + bq->otg_enabled = false; + pr_info("bq2560x OTG mode Disabled\n"); + } + + return ret; +} + + +static int bq2560x_otg_regulator_is_enable(struct regulator_dev *rdev) +{ + int ret; + u8 status; + u8 enabled; + struct bq2560x *bq = rdev_get_drvdata(rdev); + + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_01); + if (ret) + return ret; + enabled = ((status & REG01_OTG_CONFIG_MASK) >> REG01_OTG_CONFIG_SHIFT); + + return (enabled == REG01_OTG_ENABLE) ? 1 : 0; + +} + + +struct regulator_ops bq2560x_otg_reg_ops = { + .enable = bq2560x_otg_regulator_enable, + .disable = bq2560x_otg_regulator_disable, + .is_enabled = bq2560x_otg_regulator_is_enable, +}; + +static int bq2560x_regulator_init(struct bq2560x *bq) +{ + int ret = 0; + struct regulator_init_data *init_data; + struct regulator_config cfg = {}; + + init_data = of_get_regulator_init_data(bq->dev, bq->dev->of_node); + if (!init_data) { + dev_err(bq->dev, "Unable to allocate memory\n"); + return -ENOMEM; + } + + if (init_data->constraints.name) { + bq->otg_vreg.rdesc.owner = THIS_MODULE; + bq->otg_vreg.rdesc.type = REGULATOR_VOLTAGE; + bq->otg_vreg.rdesc.ops = &bq2560x_otg_reg_ops; + bq->otg_vreg.rdesc.name = init_data->constraints.name; + pr_info("regualtor name = %s\n", bq->otg_vreg.rdesc.name); + + cfg.dev = bq->dev; + cfg.init_data = init_data; + cfg.driver_data = bq; + cfg.of_node = bq->dev->of_node; + + init_data->constraints.valid_ops_mask + |= REGULATOR_CHANGE_STATUS; + + bq->otg_vreg.rdev = regulator_register( + &bq->otg_vreg.rdesc, &cfg); + if (IS_ERR(bq->otg_vreg.rdev)) { + ret = PTR_ERR(bq->otg_vreg.rdev); + bq->otg_vreg.rdev = NULL; + if (ret != -EPROBE_DEFER) + dev_err(bq->dev, + "OTG reg failed, rc=%d\n", ret); + } + } + + return ret; +} + + +static int bq2560x_parse_jeita_dt(struct device *dev, struct bq2560x *bq) +{ + struct device_node *np = dev->of_node; + int ret; + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-hot-degc", + &bq->batt_hot_degc); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-hot-degc\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-warm-degc", + &bq->batt_warm_degc); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-warm-degc\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-cool-normal-degc", + &bq->batt_cool_normal_degc); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cool-normal-degc\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-cold-cool-degc", + &bq->batt_cold_cool_degc); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cold-cool-degc\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-cold-degc", + &bq->batt_cold_degc); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cold-degc\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-hot-hysteresis", + &bq->hot_temp_hysteresis); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-hot-hysteresis\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-cold-hysteresis", + &bq->cold_temp_hysteresis); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cold-hysteresis\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-cold-cool-ma", + &bq->batt_cold_cool_ma); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cold-cool-ma\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-cool-normal-ma", + &bq->batt_cool_normal_ma); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cool-normal-ma\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-cool-mv", + &bq->batt_cool_mv); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cool-mv\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-warm-ma", + &bq->batt_warm_ma); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-warm-ma\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti, bq2560x, jeita-warm-mv", + &bq->batt_warm_mv); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-warm-mv\n"); + return ret; + } + + bq->software_jeita_supported = + of_property_read_bool(np, "ti, bq2560x, software-jeita-supported"); + + return 0; +} + + +static struct bq2560x_platform_data *bq2560x_parse_dt(struct device *dev, + struct bq2560x *bq) +{ + int ret; + struct device_node *np = dev->of_node; + struct bq2560x_platform_data *pdata; + + pdata = devm_kzalloc(dev, sizeof(struct bq2560x_platform_data), + GFP_KERNEL); + if (!pdata) { + pr_err("Out of memory\n"); + return NULL; + } + + bq->call_state = 1; + ret = of_property_read_u32(np, "ti,bq2560x,chip-enable-gpio", &bq->gpio_ce); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,chip-enable-gpio\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, usb-vlim", &pdata->usb.vlim); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,usb-vlim\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, usb-ilim", &pdata->usb.ilim); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,usb-ilim\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, usb-vreg", &pdata->usb.vreg); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,usb-vreg\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, usb-ichg", &pdata->usb.ichg); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,usb-ichg\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, ta-vlim", &pdata->ta.vlim); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,ta-vlim\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, ta-ilim", &pdata->ta.ilim); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,ta-ilim\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, ta-vreg", &pdata->ta.vreg); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,ta-vreg\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, ta-ichg", &pdata->ta.ichg); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,ta-ichg\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, stat-pin-ctrl", &pdata->statctrl); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,stat-pin-ctrl\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, precharge-current", &pdata->iprechg); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,precharge-current\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, termination-current", &pdata->iterm); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,termination-current\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, boost-voltage", &pdata->boostv); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,boost-voltage\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, boost-current", &pdata->boosti); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,boost-current\n"); + } + + ret = of_property_read_u32(np, "ti, bq2560x, vac-ovp-threshold", &pdata->vac_ovp); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,vac-ovp-threshold\n"); + } + + if (of_find_property(np, "qcom,thermal-mitigation", + &bq->thermal_levels)) { + bq->thermal_mitigation = devm_kzalloc(bq->dev, + bq->thermal_levels, + GFP_KERNEL); + + if (bq->thermal_mitigation == NULL) { + pr_err("thermal mitigation kzalloc() failed.\n"); + + } + + bq->thermal_levels /= sizeof(int); + ret = of_property_read_u32_array(np, + "qcom,thermal-mitigation", + bq->thermal_mitigation, bq->thermal_levels); + if (ret) { + pr_err("Couldn't read thermal limits ret = %d\n", ret); + + } + } + + + return pdata; +} + + +static void bq2560x_init_jeita(struct bq2560x *bq) +{ + + bq->batt_temp = -EINVAL; + + /* set default value in case of dts read fail */ + bq->batt_hot_degc = 600; + bq->batt_warm_degc = 450; + bq->batt_cool_normal_degc = 150; + bq->batt_cold_cool_degc = 50; + bq->batt_cold_degc = 0; + + bq->hot_temp_hysteresis = 50; + bq->cold_temp_hysteresis = 50; + + bq->batt_cold_cool_ma = 300; + bq->batt_cool_normal_ma = 600; + bq->batt_cool_mv = 4100; + bq->batt_warm_ma = 400; + bq->batt_warm_mv = 4100; + + bq->software_jeita_supported = true; + + /* DTS setting will overwrite above default value */ + + bq2560x_parse_jeita_dt(&bq->client->dev, bq); +} + +static int bq2560x_init_device(struct bq2560x *bq) +{ + int ret; + + bq2560x_disable_watchdog_timer(bq); + + bq2560x_enable_batfet(bq); + + ret = bq2560x_set_stat_ctrl(bq, bq->platform_data->statctrl); + if (ret) + pr_err("Failed to set stat pin control mode, ret = %d\n", ret); + + ret = bq2560x_set_prechg_current(bq, bq->platform_data->iprechg); + if (ret) + pr_err("Failed to set prechg current, ret = %d\n", ret); + + ret = bq2560x_set_term_current(bq, bq->platform_data->iterm); + if (ret) + pr_err("Failed to set termination current, ret = %d\n", ret); + + ret = bq2560x_set_boost_voltage(bq, bq->platform_data->boostv); + if (ret) + pr_err("Failed to set boost voltage, ret = %d\n", ret); + + ret = bq2560x_set_boost_current(bq, bq->platform_data->boosti); + if (ret) + pr_err("Failed to set boost current, ret = %d\n", ret); + + ret = bq2560x_set_acovp_threshold(bq, bq->platform_data->vac_ovp); + if (ret) + pr_err("Failed to set acovp threshold, ret = %d\n", ret); + + ret = bq2560x_set_int_mask(bq, REG0A_IINDPM_INT_MASK | REG0A_VINDPM_INT_MASK); + if (ret) + pr_err("Failed to set vindpm and iindpm int mask\n"); + + ret = bq2560x_enable_charger(bq); + if (ret) { + pr_err("Failed to enable charger, ret = %d\n", ret); + } else { + bq->charge_enabled = true; + pr_info("Charger Enabled Successfully!\n"); + } + + return 0; +} + + +static int bq2560x_detect_device(struct bq2560x *bq) +{ + int ret; + u8 data; + + ret = bq2560x_read_byte(bq, &data, BQ2560X_REG_0B); + if (ret == 0) { + bq->part_no = (data & REG0B_PN_MASK) >> REG0B_PN_SHIFT; + bq->revision = (data & REG0B_DEV_REV_MASK) >> REG0B_DEV_REV_SHIFT; + } + + return ret; +} + +static void bq2560x_check_jeita(struct bq2560x *bq) +{ + + int ret; + bool last_hot, last_warm, last_cool, last_cold, last_cool_5; + bool chg_disabled_jeita, jeita_hot_cold; + union power_supply_propval batt_prop = {0,}; + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_TEMP, &batt_prop); + if (!ret) + bq->batt_temp = batt_prop.intval; + + if (bq->batt_temp == -EINVAL) + return; + + last_hot = bq->batt_hot; + last_warm = bq->batt_warm; + last_cool = bq->batt_cool; + last_cold = bq->batt_cold; + last_cool_5 = bq->batt_cool_5; + + if (bq->batt_temp >= bq->batt_hot_degc) {/* HOT */ + if (!bq->batt_hot) { + bq->batt_hot = true; + bq->batt_warm = false; + bq->batt_cool = false; + bq->batt_cold = false; + bq->jeita_ma = 0; + bq->jeita_mv = 0; + } + } else if (bq->batt_temp >= bq->batt_warm_degc) {/* WARM */ + if (!bq->batt_hot || + (bq->batt_temp < bq->batt_hot_degc - bq->hot_temp_hysteresis)) { + bq->batt_hot = false; + bq->batt_warm = true; + bq->batt_cool = false; + bq->batt_cold = false; + bq->jeita_mv = bq->batt_warm_mv; + bq->jeita_ma = bq->batt_warm_ma; + } + } else if (bq->batt_temp < bq->batt_cold_degc) {/* COLD */ + if (!bq->batt_cold) { + bq->batt_hot = false; + bq->batt_warm = false; + bq->batt_cool = false; + bq->batt_cold = true; + bq->jeita_ma = 0; + bq->jeita_mv = 0; + } + } else if (bq->batt_temp < bq->batt_cold_cool_degc) {/* 0 - 5 COOL */ + if (!bq->batt_cold || + (bq->batt_temp > bq->batt_cold_degc + bq->cold_temp_hysteresis)) { + pr_err("bq2560x_check_jeita status cold -> cool\n"); + bq->batt_hot = false; + bq->batt_warm = false; + bq->batt_cool = true; + bq->batt_cold = false; + bq->batt_cool_5 = true; + bq->jeita_mv = bq->batt_cool_mv; + bq->jeita_ma = bq->batt_cold_cool_ma; + } + } else if (bq->batt_temp < bq->batt_cool_normal_degc) {/* 5 - 15 COOL */ + pr_err("bq2560x_check_jeita status cool -> normal\n"); + bq->batt_hot = false; + bq->batt_warm = false; + bq->batt_cool = true; + bq->batt_cold = false; + bq->batt_cool_5 = false; + bq->jeita_mv = bq->batt_cool_mv; + bq->jeita_ma = bq->batt_cool_normal_ma; + } else {/* NORMAL */ + bq->batt_hot = false; + bq->batt_warm = false; + bq->batt_cool = false; + bq->batt_cold = false; + } + + bq->jeita_active = bq->batt_cool || bq->batt_hot || + bq->batt_cold || bq->batt_warm; + + if ((last_cold != bq->batt_cold) || (last_warm != bq->batt_warm) || + (last_cool_5 != bq->batt_cool_5) || (last_cool != bq->batt_cool) || (last_hot != bq->batt_hot)) { + bq2560x_update_charging_profile(bq); + power_supply_changed(&bq->batt_psy); + power_supply_changed(bq->usb_psy); + } else if (bq->batt_hot || bq->batt_cold) { + power_supply_changed(&bq->batt_psy); + power_supply_changed(bq->usb_psy); + } + + + jeita_hot_cold = bq->jeita_active && (bq->batt_hot || bq->batt_cold); + chg_disabled_jeita = !!(bq->charging_disabled_status & JEITA); + if (jeita_hot_cold ^ chg_disabled_jeita) + bq2560x_charging_disable(bq, JEITA, jeita_hot_cold); + +} + +static void bq2560x_check_batt_pres(struct bq2560x *bq) +{ + int ret = 0; + bool chg_disabled_pres; + + ret = bq2560x_get_prop_batt_present(bq); + if (!ret) { + chg_disabled_pres = !!(bq->charging_disabled_status & BATT_PRES); + if (chg_disabled_pres ^ !bq->batt_present) { + ret = bq2560x_charging_disable(bq, BATT_PRES, !bq->batt_present); + if (ret) { + pr_err("failed to %s charging, ret = %d\n", + bq->batt_present ? "disable" : "enable", + ret); + } + power_supply_changed(&bq->batt_psy); + power_supply_changed(bq->usb_psy); + } + } + +} + +static void bq2560x_check_batt_capacity(struct bq2560x *bq) +{ + int ret = 0; + int last_batt_capacity = bq->batt_capacity; + + ret = bq2560x_get_prop_batt_capacity(bq); + if (!ret) { + if (last_batt_capacity != bq->batt_capacity) { + pr_err("Battery capacity changed, new capacity = %d\n", bq->batt_capacity); + power_supply_changed(&bq->batt_psy); + } + } + +} + +static void bq2560x_check_batt_full(struct bq2560x *bq) +{ + int ret = 0; + bool chg_disabled_fc; + + ret = bq2560x_get_prop_batt_full(bq); + if (!ret) { + chg_disabled_fc = !!(bq->charging_disabled_status & BATT_FC); + if (chg_disabled_fc ^ bq->batt_full) { + ret = bq2560x_charging_disable(bq, BATT_FC, bq->batt_full); + if (ret) { + pr_err("failed to %s charging, ret = %d\n", + bq->batt_full ? "disable" : "enable", + ret); + } + power_supply_changed(&bq->batt_psy); + power_supply_changed(bq->usb_psy); + } + } +} + + +static int calculate_jeita_poll_interval(struct bq2560x *bq) +{ + int interval; + + if (bq->batt_hot || bq->batt_cold) + interval = 10; + else if (bq->batt_warm || bq->batt_cool) + interval = 30; + else + interval = 50; + return interval; +} + +static enum alarmtimer_restart bq2560x_jeita_alarm_cb(struct alarm *alarm, + ktime_t now) +{ + struct bq2560x *bq = container_of(alarm, + struct bq2560x, jeita_alarm); + unsigned long ns; + + bq2560x_stay_awake(&bq->bq2560x_ws, WAKEUP_SRC_JEITA); + schedule_delayed_work(&bq->charge_jeita_work, HZ/2); + + ns = calculate_jeita_poll_interval(bq) * 1000000000LL; + alarm_forward_now(alarm, ns_to_ktime(ns)); + return ALARMTIMER_RESTART; +} + +static void bq2560x_charge_jeita_workfunc(struct work_struct *work) +{ + struct bq2560x *bq = container_of(work, + struct bq2560x, charge_jeita_work.work); + + bq2560x_reset_watchdog_timer(bq); + bq2560x_factory_mode_control_capacity_work(bq); + + bq2560x_check_batt_pres(bq); + bq2560x_check_batt_full(bq); + bq2560x_check_batt_capacity(bq); + + bq2560x_dump_fg_reg(bq); + + bq2560x_check_jeita(bq); + bq2560x_relax(&bq->bq2560x_ws, WAKEUP_SRC_JEITA); +} + + +static void bq2560x_discharge_jeita_workfunc(struct work_struct *work) +{ + struct bq2560x *bq = container_of(work, + struct bq2560x, discharge_jeita_work.work); + + bq2560x_check_batt_pres(bq); + bq2560x_check_batt_full(bq); + bq2560x_check_batt_capacity(bq); + + bq2560x_dump_fg_reg(bq); + + bq2560x_check_jeita(bq); + + schedule_delayed_work(&bq->discharge_jeita_work, + calculate_jeita_poll_interval(bq) * HZ); +} + +static const unsigned char *charge_stat_str[] = { + "Not Charging", + "Precharging", + "Fast Charging", + "Charge Done", +}; + +static void bq2560x_dump_status(struct bq2560x *bq) +{ + u8 status; + u8 addr; + int ret; + u8 val; + union power_supply_propval batt_prop = {0,}; + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_CURRENT_NOW, &batt_prop); + + if (!ret) + pr_err("FG current:%d\n", batt_prop.intval); + + pr_err("bq Reg[0x00 -0x0B] = "); + for (addr = 0x0; addr <= 0x0B; addr++) { + ret = bq2560x_read_byte(bq, &val, addr); + if (!ret) { + printk("0x%02X, ", val); + } else + pr_err("bq Reg red err"); + } + printk("\n"); + + if (!bq->power_good) + pr_info("Power Poor\n"); + if (!bq->vbus_good) + pr_info("Vbus voltage not good!\n"); + if (bq->vindpm_triggered) + pr_info("VINDPM triggered\n"); + if (bq->iindpm_triggered) + pr_info("IINDPM triggered\n"); + if (bq->acov_triggered) + pr_info("ACOV triggered\n"); + + if (bq->fault_status & REG09_FAULT_WDT_MASK) + pr_info("Watchdog timer expired!\n"); + if (bq->fault_status & REG09_FAULT_BOOST_MASK) + pr_info("Boost fault occurred!\n"); + + status = (bq->fault_status & REG09_FAULT_CHRG_MASK) >> REG09_FAULT_CHRG_SHIFT; + if (status == REG09_FAULT_CHRG_INPUT) + pr_info("input fault!\n"); + else if (status == REG09_FAULT_CHRG_THERMAL) + pr_info("charge thermal shutdown fault!\n"); + else if (status == REG09_FAULT_CHRG_TIMER) + pr_info("charge timer expired fault!\n"); + + if (bq->fault_status & REG09_FAULT_BAT_MASK) + pr_info("battery ovp fault!\n"); + + if (!bq->software_jeita_supported) { + status = (bq->fault_status & REG09_FAULT_NTC_MASK) >> REG09_FAULT_NTC_SHIFT; + + if (status == REG09_FAULT_NTC_WARM) + pr_debug("JEITA ACTIVE: WARM\n"); + else if (status == REG09_FAULT_NTC_COOL) + pr_debug("JEITA ACTIVE: COOL\n"); + else if (status == REG09_FAULT_NTC_COLD) + pr_debug("JEITA ACTIVE: COLD\n"); + else if (status == REG09_FAULT_NTC_HOT) + pr_debug("JEITA ACTIVE: HOT!\n"); + } else if (bq->jeita_active) { + if (bq->batt_hot) + pr_debug("JEITA ACTIVE: HOT\n"); + else if (bq->batt_warm) + pr_debug("JEITA ACTIVE: WARM\n"); + else if (bq->batt_cool) + pr_debug("JEITA ACTIVE: COOL\n"); + else if (bq->batt_cold) + pr_debug("JEITA ACTIVE: COLD\n"); + } + + pr_info("%s\n", charge_stat_str[bq->charge_state]); +} + + +static void bq2560x_update_status(struct bq2560x *bq) +{ + u8 status; + int ret; + + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_0A); + if (ret) { + pr_err("failed to read reg0a\n"); + return; + } + + mutex_lock(&bq->data_lock); + bq->vbus_good = !!(status & REG0A_VBUS_GD_MASK); + bq->vindpm_triggered = !!(status & REG0A_VINDPM_STAT_MASK); + bq->iindpm_triggered = !!(status & REG0A_IINDPM_STAT_MASK); + bq->topoff_active = !!(status & REG0A_TOPOFF_ACTIVE_MASK); + bq->acov_triggered = !!(status & REG0A_ACOV_STAT_MASK); + mutex_unlock(&bq->data_lock); + + /* Read twice to get present status */ + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_09); + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_09); + if (ret) + return; + + mutex_lock(&bq->data_lock); + bq->fault_status = status; + mutex_unlock(&bq->data_lock); + +} + + +static irqreturn_t bq2560x_charger_interrupt(int irq, void *dev_id) +{ + struct bq2560x *bq = dev_id; + + u8 status; + int ret; + + mutex_lock(&bq->irq_complete); + bq->irq_waiting = true; + if (!bq->resume_completed) { + dev_dbg(bq->dev, "IRQ triggered before device-resume\n"); + if (!bq->irq_disabled) { + disable_irq_nosync(irq); + bq->irq_disabled = true; + } + mutex_unlock(&bq->irq_complete); + return IRQ_HANDLED; + } + bq->irq_waiting = false; + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_08); + if (ret) { + mutex_unlock(&bq->irq_complete); + return IRQ_HANDLED; + } + + mutex_lock(&bq->data_lock); + bq->power_good = !!(status & REG08_PG_STAT_MASK); + mutex_unlock(&bq->data_lock); + + if (!bq->power_good) { + if (bq->usb_present) { + bq->usb_present = false; + power_supply_set_present(bq->usb_psy, bq->usb_present); + } + if (bq->software_jeita_supported) { + alarm_try_to_cancel(&bq->jeita_alarm); + } + + bq2560x_disable_watchdog_timer(bq); + + schedule_delayed_work(&bq->discharge_jeita_work, + calculate_jeita_poll_interval(bq) * HZ); + + pr_err("usb removed, set usb present = %d\n", bq->usb_present); + } else if (bq->power_good && !bq->usb_present) { + bq->usb_present = true; + msleep(10); + power_supply_set_present(bq->usb_psy, bq->usb_present); + + cancel_delayed_work(&bq->discharge_jeita_work); + + if (bq->software_jeita_supported) { + ret = alarm_start_relative(&bq->jeita_alarm, + ns_to_ktime(1000000000LL)); + if (ret) + pr_err("start alarm for JEITA detection failed, ret=%d\n", + ret); + } + + bq2560x_set_watchdog_timer(bq, 160); + + pr_err("usb plugged in, set usb present = %d\n", bq->usb_present); + } + + bq2560x_update_status(bq); + + mutex_unlock(&bq->irq_complete); + + power_supply_changed(&bq->batt_psy); + + return IRQ_HANDLED; +} + + +static void determine_initial_status(struct bq2560x *bq) +{ + int ret; + u8 status = 0; + ret = bq2560x_get_hiz_mode(bq, &status); + if (!ret) + bq->in_hiz = !!status; + + bq2560x_charger_interrupt(bq->client->irq, bq); +} + + +static ssize_t bq2560x_show_registers(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct bq2560x *bq = dev_get_drvdata(dev); + u8 addr; + u8 val; + u8 tmpbuf[200]; + int len; + int idx = 0; + int ret ; + + idx = snprintf(buf, PAGE_SIZE, "%s:\n", "bq2560x Reg"); + for (addr = 0x0; addr <= 0x0B; addr++) { + ret = bq2560x_read_byte(bq, &val, addr); + if (ret == 0) { + len = snprintf(tmpbuf, PAGE_SIZE - idx, "Reg[0x%.2x] = 0x%.2x\n", addr, val); + memcpy(&buf[idx], tmpbuf, len); + idx += len; + } + } + + return idx; +} + +static ssize_t bq2560x_store_registers(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct bq2560x *bq = dev_get_drvdata(dev); + int ret; + unsigned int reg; + unsigned int val; + + ret = sscanf(buf, "%x %x", ®, &val); + if (ret == 2 && reg < 0x0B) { + bq2560x_write_byte(bq, (unsigned char)reg, (unsigned char)val); + } + + return count; +} + +static ssize_t bq2560x_battery_test_status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%d\n", BatteryTestStatus_enable); +} +static ssize_t bq2560x_battery_test_status_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int retval; + unsigned int input; + + if (sscanf(buf, "%u", &input) != 1) + retval = -EINVAL; + else + BatteryTestStatus_enable = input; + + pr_err("BatteryTestStatus_enable = %d\n", BatteryTestStatus_enable); + + return retval; +} +static DEVICE_ATTR(registers, S_IRUGO | S_IWUSR, bq2560x_show_registers, bq2560x_store_registers); +static DEVICE_ATTR(BatteryTestStatus, S_IRUGO | S_IWUSR, bq2560x_battery_test_status_show, bq2560x_battery_test_status_store); + +static struct attribute *bq2560x_attributes[] = { + &dev_attr_registers.attr, + &dev_attr_BatteryTestStatus.attr, + NULL, +}; + +static const struct attribute_group bq2560x_attr_group = { + .attrs = bq2560x_attributes, +}; + + +static int show_registers(struct seq_file *m, void *data) +{ + struct bq2560x *bq = m->private; + u8 addr; + int ret; + u8 val; + + for (addr = 0x0; addr <= 0x0B; addr++) { + ret = bq2560x_read_byte(bq, &val, addr); + if (!ret) + seq_printf(m, "Reg[0x%02X] = 0x%02X\n", addr, val); + } + return 0; +} + + +static int reg_debugfs_open(struct inode *inode, struct file *file) +{ + struct bq2560x *bq = inode->i_private; + + return single_open(file, show_registers, bq); +} + + +static const struct file_operations reg_debugfs_ops = { + .owner = THIS_MODULE, + .open = reg_debugfs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void create_debugfs_entry(struct bq2560x *bq) +{ + bq->debug_root = debugfs_create_dir("bq2560x", NULL); + if (!bq->debug_root) + pr_err("Failed to create debug dir\n"); + + if (bq->debug_root) { + + debugfs_create_file("registers", S_IFREG | S_IRUGO, + bq->debug_root, bq, ®_debugfs_ops); + + debugfs_create_x32("charging_disable_status", S_IFREG | S_IRUGO, + bq->debug_root, &(bq->charging_disabled_status)); + + debugfs_create_x32("fault_status", S_IFREG | S_IRUGO, + bq->debug_root, &(bq->fault_status)); + + debugfs_create_x32("vbus_type", S_IFREG | S_IRUGO, + bq->debug_root, &(bq->vbus_type)); + + debugfs_create_x32("charge_state", S_IFREG | S_IRUGO, + bq->debug_root, &(bq->charge_state)); + + debugfs_create_x32("skip_reads", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->skip_reads)); + debugfs_create_x32("skip_writes", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->skip_writes)); + } +} + + +static int bq2560x_charger_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct bq2560x *bq; + struct power_supply *usb_psy; + struct power_supply *bms_psy; + + int ret; + + usb_psy = power_supply_get_by_name("usb"); + if (!usb_psy) { + dev_dbg(&client->dev, "USB supply not found, defer probe\n"); + return -EPROBE_DEFER; + } + + bms_psy = power_supply_get_by_name("bms"); + if (!bms_psy) { + dev_dbg(&client->dev, "bms supply not found, defer probe\n"); + return -EPROBE_DEFER; + } + + bq = devm_kzalloc(&client->dev, sizeof(struct bq2560x), GFP_KERNEL); + if (!bq) { + pr_err("Out of memory\n"); + return -ENOMEM; + } + + bq->dev = &client->dev; + bq->usb_psy = usb_psy; + bq->bms_psy = bms_psy; + + bq->client = client; + i2c_set_clientdata(client, bq); + + mutex_init(&bq->i2c_rw_lock); + mutex_init(&bq->data_lock); + mutex_init(&bq->profile_change_lock); + mutex_init(&bq->charging_disable_lock); + mutex_init(&bq->irq_complete); + + bq->resume_completed = true; + bq->irq_waiting = false; + + ret = bq2560x_detect_device(bq); + if (ret) { + pr_err("No bq2560x device found!\n"); + return -ENODEV; + } + + bq2560x_init_jeita(bq); + + if (client->dev.of_node) + bq->platform_data = bq2560x_parse_dt(&client->dev, bq); + else + bq->platform_data = client->dev.platform_data; + + if (!bq->platform_data) { + pr_err("No platform data provided.\n"); + return -EINVAL; + } + + if (gpio_is_valid(bq->gpio_ce)) { + ret = devm_gpio_request(&client->dev, bq->gpio_ce, "bq2560x_ce"); + if (ret) { + pr_err("Failed to request chip enable gpio %d:, err: %d\n", bq->gpio_ce, ret); + return ret; + } + gpio_direction_output(bq->gpio_ce, 0); + } + + ret = bq2560x_init_device(bq); + if (ret) { + pr_err("Failed to init device\n"); + return ret; + } + + ret = bq2560x_psy_register(bq); + if (ret) + return ret; + ret = bq2560x_regulator_init(bq); + if (ret) { + pr_err("Couldn't initialize bq2560x regulator ret=%d\n", ret); + return ret; + } + + INIT_DELAYED_WORK(&bq->charge_jeita_work, bq2560x_charge_jeita_workfunc); + INIT_DELAYED_WORK(&bq->discharge_jeita_work, bq2560x_discharge_jeita_workfunc); + + alarm_init(&bq->jeita_alarm, ALARM_BOOTTIME, bq2560x_jeita_alarm_cb); + + if (client->irq) { + ret = devm_request_threaded_irq(&client->dev, client->irq, NULL, + bq2560x_charger_interrupt, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "bq2560x charger irq", bq); + if (ret < 0) { + pr_err("request irq for irq=%d failed, ret =%d\n", client->irq, ret); + goto err_1; + } + enable_irq_wake(client->irq); + } + + bq2560x_wakeup_src_init(bq); + + device_init_wakeup(bq->dev, 1); + create_debugfs_entry(bq); + + ret = sysfs_create_group(&bq->dev->kobj, &bq2560x_attr_group); + if (ret) { + dev_err(bq->dev, "failed to register sysfs. err: %d\n", ret); + } + + bq2560x_exit_hiz_mode(bq); + determine_initial_status(bq); + + + pr_info("bq2560x probe successfully, Part Num:%d, Revision:%d\n!", + bq->part_no, bq->revision); + + return 0; + +err_1: + bq2560x_psy_unregister(bq); + + return ret; +} + +static inline bool is_device_suspended(struct bq2560x *bq) +{ + return !bq->resume_completed; +} + +static int bq2560x_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq2560x *bq = i2c_get_clientdata(client); + + mutex_lock(&bq->irq_complete); + bq->resume_completed = false; + mutex_unlock(&bq->irq_complete); + + return 0; +} + +static int bq2560x_suspend_noirq(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq2560x *bq = i2c_get_clientdata(client); + + if (bq->irq_waiting) { + pr_err_ratelimited("Aborting suspend, an interrupt was detected while suspending\n"); + return -EBUSY; + } + return 0; +} + +static int bq2560x_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq2560x *bq = i2c_get_clientdata(client); + + + mutex_lock(&bq->irq_complete); + bq->resume_completed = true; + if (bq->irq_waiting) { + bq->irq_disabled = false; + enable_irq(client->irq); + mutex_unlock(&bq->irq_complete); + bq2560x_charger_interrupt(client->irq, bq); + } else { + mutex_unlock(&bq->irq_complete); + } + + power_supply_changed(&bq->batt_psy); + + return 0; +} +static int bq2560x_charger_remove(struct i2c_client *client) +{ + struct bq2560x *bq = i2c_get_clientdata(client); + + alarm_try_to_cancel(&bq->jeita_alarm); + + cancel_delayed_work_sync(&bq->charge_jeita_work); + cancel_delayed_work_sync(&bq->discharge_jeita_work); + + regulator_unregister(bq->otg_vreg.rdev); + + bq2560x_psy_unregister(bq); + + mutex_destroy(&bq->charging_disable_lock); + mutex_destroy(&bq->profile_change_lock); + mutex_destroy(&bq->data_lock); + mutex_destroy(&bq->i2c_rw_lock); + mutex_destroy(&bq->irq_complete); + + debugfs_remove_recursive(bq->debug_root); + sysfs_remove_group(&bq->dev->kobj, &bq2560x_attr_group); + + + return 0; +} + + +static void bq2560x_charger_shutdown(struct i2c_client *client) +{ + pr_info("Shutdown Successfully\n"); +} + +static struct of_device_id bq2560x_charger_match_table[] = { + {.compatible = "ti,bq25600-charger",}, + {.compatible = "ti,bq25601-charger",}, + {}, +}; +MODULE_DEVICE_TABLE(of, bq2560x_charger_match_table); + +static const struct i2c_device_id bq2560x_charger_id[] = { + { "bq25600-charger", BQ25600 }, + { "bq25601-charger", BQ25601 }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, bq2560x_charger_id); + +static const struct dev_pm_ops bq2560x_pm_ops = { + .resume = bq2560x_resume, + .suspend_noirq = bq2560x_suspend_noirq, + .suspend = bq2560x_suspend, +}; +static struct i2c_driver bq2560x_charger_driver = { + .driver = { + .name = "bq2560x-charger", + .owner = THIS_MODULE, + .of_match_table = bq2560x_charger_match_table, + .pm = &bq2560x_pm_ops, + }, + .id_table = bq2560x_charger_id, + + .probe = bq2560x_charger_probe, + .remove = bq2560x_charger_remove, + .shutdown = bq2560x_charger_shutdown, + +}; + +module_i2c_driver(bq2560x_charger_driver); + +MODULE_DESCRIPTION("TI BQ2560x Charger Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Texas Instruments"); diff --git a/drivers/power/bq2560x_reg.h b/drivers/power/bq2560x_reg.h new file mode 100644 index 0000000000000..5f57ced00cff5 --- /dev/null +++ b/drivers/power/bq2560x_reg.h @@ -0,0 +1,307 @@ + +#ifndef __BQ2560X_HEADER__ +#define __BQ2560X_HEADER__ + +/* Register 00h */ +#define BQ2560X_REG_00 0x00 +#define REG00_ENHIZ_MASK 0x80 +#define REG00_ENHIZ_SHIFT 7 +#define REG00_HIZ_ENABLE 1 +#define REG00_HIZ_DISABLE 0 + +#define REG00_STAT_CTRL_MASK 0x60 +#define REG00_STAT_CTRL_SHIFT 5 +#define REG00_STAT_CTRL_STAT 0 +#define REG00_STAT_CTRL_ICHG 1 +#define REG00_STAT_CTRL_IINDPM 2 +#define REG00_STAT_CTRL_DISABLE 3 + +#define REG00_IINLIM_MASK 0x1F +#define REG00_IINLIM_SHIFT 0 +#define REG00_IINLIM_LSB 100 +#define REG00_IINLIM_BASE 100 + +/* Register 01h */ +#define BQ2560X_REG_01 0x01 +#define REG01_PFM_DIS_MASK 0x80 +#define REG01_PFM_DIS_SHIFT 7 +#define REG01_PFM_ENABLE 0 +#define REG01_PFM_DISABLE 1 + +#define REG01_WDT_RESET_MASK 0x40 +#define REG01_WDT_RESET_SHIFT 6 +#define REG01_WDT_RESET 1 + +#define REG01_OTG_CONFIG_MASK 0x20 +#define REG01_OTG_CONFIG_SHIFT 5 +#define REG01_OTG_ENABLE 1 +#define REG01_OTG_DISABLE 0 + +#define REG01_CHG_CONFIG_MASK 0x10 +#define REG01_CHG_CONFIG_SHIFT 4 +#define REG01_CHG_DISABLE 0 +#define REG01_CHG_ENABLE 1 + +#define REG01_SYS_MINV_MASK 0x0E +#define REG01_SYS_MINV_SHIFT 1 + +#define REG01_MIN_VBAT_SEL_MASK 0x01 +#define REG01_MIN_VBAT_SEL_SHIFT 0 +#define REG01_MIN_VBAT_2P8V 0 +#define REG01_MIN_VBAT_2P5V 1 + + +/* Register 0x02*/ +#define BQ2560X_REG_02 0x02 +#define REG02_BOOST_LIM_MASK 0x80 +#define REG02_BOOST_LIM_SHIFT 7 +#define REG02_BOOST_LIM_0P5A 0 +#define REG02_BOOST_LIM_1P2A 1 + +#define REG02_Q1_FULLON_MASK 0x40 +#define REG02_Q1_FULLON_SHIFT 6 +#define REG02_Q1_FULLON_ENABLE 1 +#define REG02_Q1_FULLON_DISABLE 0 + +#define REG02_ICHG_MASK 0x3F +#define REG02_ICHG_SHIFT 0 +#define REG02_ICHG_BASE 0 +#define REG02_ICHG_LSB 60 + +/* Register 0x03*/ +#define BQ2560X_REG_03 0x03 +#define REG03_IPRECHG_MASK 0xF0 +#define REG03_IPRECHG_SHIFT 4 +#define REG03_IPRECHG_BASE 60 +#define REG03_IPRECHG_LSB 60 + +#define REG03_ITERM_MASK 0x0F +#define REG03_ITERM_SHIFT 0 +#define REG03_ITERM_BASE 60 +#define REG03_ITERM_LSB 60 + + +/* Register 0x04*/ +#define BQ2560X_REG_04 0x04 +#define REG04_VREG_MASK 0xF8 +#define REG04_VREG_SHIFT 3 +#define REG04_VREG_BASE 3856 +#define REG04_VREG_LSB 32 + +#define REG04_TOPOFF_TIMER_MASK 0x06 +#define REG04_TOPOFF_TIMER_SHIFT 1 +#define REG04_TOPOFF_TIMER_DISABLE 0 +#define REG04_TOPOFF_TIMER_15M 1 +#define REG04_TOPOFF_TIMER_30M 2 +#define REG04_TOPOFF_TIMER_45M 3 + + +#define REG04_VRECHG_MASK 0x01 +#define REG04_VRECHG_SHIFT 0 +#define REG04_VRECHG_100MV 0 +#define REG04_VRECHG_200MV 1 + +/* Register 0x05*/ +#define BQ2560X_REG_05 0x05 +#define REG05_EN_TERM_MASK 0x80 +#define REG05_EN_TERM_SHIFT 7 +#define REG05_TERM_ENABLE 1 +#define REG05_TERM_DISABLE 0 + +#define REG05_WDT_MASK 0x30 +#define REG05_WDT_SHIFT 4 +#define REG05_WDT_DISABLE 0 +#define REG05_WDT_40S 1 +#define REG05_WDT_80S 2 +#define REG05_WDT_160S 3 +#define REG05_WDT_BASE 0 +#define REG05_WDT_LSB 40 + +#define REG05_EN_TIMER_MASK 0x08 +#define REG05_EN_TIMER_SHIFT 3 +#define REG05_CHG_TIMER_ENABLE 1 +#define REG05_CHG_TIMER_DISABLE 0 + +#define REG05_CHG_TIMER_MASK 0x04 +#define REG05_CHG_TIMER_SHIFT 2 +#define REG05_CHG_TIMER_5HOURS 0 +#define REG05_CHG_TIMER_10HOURS 1 + +#define REG05_TREG_MASK 0x02 +#define REG05_TREG_SHIFT 1 +#define REG05_TREG_90C 0 +#define REG05_TREG_110C 1 + +#define REG05_JEITA_ISET_MASK 0x01 +#define REG05_JEITA_ISET_SHIFT 0 +#define REG05_JEITA_ISET_50PCT 0 +#define REG05_JEITA_ISET_20PCT 1 + + +/* Register 0x06*/ +#define BQ2560X_REG_06 0x06 +#define REG06_OVP_MASK 0xC0 +#define REG06_OVP_SHIFT 0x6 +#define REG06_OVP_5P5V 0 +#define REG06_OVP_6P5V 1 +#define REG06_OVP_10P5V 2 +#define REG06_OVP_14P3V 3 + +#define REG06_BOOSTV_MASK 0x30 +#define REG06_BOOSTV_SHIFT 4 +#define REG06_BOOSTV_4P85V 0 +#define REG06_BOOSTV_5V 1 +#define REG06_BOOSTV_5P15V 2 +#define REG06_BOOSTV_5P3V 3 + +#define REG06_VINDPM_MASK 0x0F +#define REG06_VINDPM_SHIFT 0 +#define REG06_VINDPM_BASE 3900 +#define REG06_VINDPM_LSB 100 + +/* Register 0x07*/ +#define BQ2560X_REG_07 0x07 +#define REG07_FORCE_DPDM_MASK 0x80 +#define REG07_FORCE_DPDM_SHIFT 7 +#define REG07_FORCE_DPDM 1 + +#define REG07_TMR2X_EN_MASK 0x40 +#define REG07_TMR2X_EN_SHIFT 6 +#define REG07_TMR2X_ENABLE 1 +#define REG07_TMR2X_DISABLE 0 + +#define REG07_BATFET_DIS_MASK 0x20 +#define REG07_BATFET_DIS_SHIFT 5 +#define REG07_BATFET_OFF 1 +#define REG07_BATFET_ON 0 + +#define REG07_JEITA_VSET_MASK 0x10 +#define REG07_JEITA_VSET_SHIFT 4 +#define REG07_JEITA_VSET_4100 0 +#define REG07_JEITA_VSET_VREG 1 + +#define REG07_BATFET_DLY_MASK 0x08 +#define REG07_BATFET_DLY_SHIFT 3 +#define REG07_BATFET_DLY_0S 0 +#define REG07_BATFET_DLY_10S 1 + +#define REG07_BATFET_RST_EN_MASK 0x04 +#define REG07_BATFET_RST_EN_SHIFT 2 +#define REG07_BATFET_RST_DISABLE 0 +#define REG07_BATFET_RST_ENABLE 1 + +#define REG07_VDPM_BAT_TRACK_MASK 0x03 +#define REG07_VDPM_BAT_TRACK_SHIFT 0 +#define REG07_VDPM_BAT_TRACK_DISABLE 0 +#define REG07_VDPM_BAT_TRACK_200MV 1 +#define REG07_VDPM_BAT_TRACK_250MV 2 +#define REG07_VDPM_BAT_TRACK_300MV 3 + +/* Register 0x08*/ +#define BQ2560X_REG_08 0x08 +#define REG08_VBUS_STAT_MASK 0xE0 +#define REG08_VBUS_STAT_SHIFT 5 +#define REG08_VBUS_TYPE_NONE 0 +#define REG08_VBUS_TYPE_USB 1 +#define REG08_VBUS_TYPE_ADAPTER 3 +#define REG08_VBUS_TYPE_OTG 7 + +#define REG08_CHRG_STAT_MASK 0x18 +#define REG08_CHRG_STAT_SHIFT 3 +#define REG08_CHRG_STAT_IDLE 0 +#define REG08_CHRG_STAT_PRECHG 1 +#define REG08_CHRG_STAT_FASTCHG 2 +#define REG08_CHRG_STAT_CHGDONE 3 + +#define REG08_PG_STAT_MASK 0x04 +#define REG08_PG_STAT_SHIFT 2 +#define REG08_POWER_GOOD 1 + +#define REG08_THERM_STAT_MASK 0x02 +#define REG08_THERM_STAT_SHIFT 1 + +#define REG08_VSYS_STAT_MASK 0x01 +#define REG08_VSYS_STAT_SHIFT 0 +#define REG08_IN_VSYS_STAT 1 + + +/* Register 0x09*/ +#define BQ2560X_REG_09 0x09 +#define REG09_FAULT_WDT_MASK 0x80 +#define REG09_FAULT_WDT_SHIFT 7 +#define REG09_FAULT_WDT 1 + +#define REG09_FAULT_BOOST_MASK 0x40 +#define REG09_FAULT_BOOST_SHIFT 6 + +#define REG09_FAULT_CHRG_MASK 0x30 +#define REG09_FAULT_CHRG_SHIFT 4 +#define REG09_FAULT_CHRG_NORMAL 0 +#define REG09_FAULT_CHRG_INPUT 1 +#define REG09_FAULT_CHRG_THERMAL 2 +#define REG09_FAULT_CHRG_TIMER 3 + +#define REG09_FAULT_BAT_MASK 0x08 +#define REG09_FAULT_BAT_SHIFT 3 +#define REG09_FAULT_BAT_OVP 1 + +#define REG09_FAULT_NTC_MASK 0x07 +#define REG09_FAULT_NTC_SHIFT 0 +#define REG09_FAULT_NTC_NORMAL 0 +#define REG09_FAULT_NTC_WARM 2 +#define REG09_FAULT_NTC_COOL 3 +#define REG09_FAULT_NTC_COLD 5 +#define REG09_FAULT_NTC_HOT 6 + + +/* Register 0x0A */ +#define BQ2560X_REG_0A 0x0A +#define REG0A_VBUS_GD_MASK 0x80 +#define REG0A_VBUS_GD_SHIFT 7 +#define REG0A_VBUS_GD 1 + +#define REG0A_VINDPM_STAT_MASK 0x40 +#define REG0A_VINDPM_STAT_SHIFT 6 +#define REG0A_VINDPM_ACTIVE 1 + +#define REG0A_IINDPM_STAT_MASK 0x20 +#define REG0A_IINDPM_STAT_SHIFT 5 +#define REG0A_IINDPM_ACTIVE 1 + +#define REG0A_TOPOFF_ACTIVE_MASK 0x08 +#define REG0A_TOPOFF_ACTIVE_SHIFT 3 +#define REG0A_TOPOFF_ACTIVE 1 + +#define REG0A_ACOV_STAT_MASK 0x04 +#define REG0A_ACOV_STAT_SHIFT 2 +#define REG0A_ACOV_ACTIVE 1 + +#define REG0A_VINDPM_INT_MASK 0x02 +#define REG0A_VINDPM_INT_SHIFT 1 +#define REG0A_VINDPM_INT_ENABLE 0 +#define REG0A_VINDPM_INT_DISABLE 1 + +#define REG0A_IINDPM_INT_MASK 0x01 +#define REG0A_IINDPM_INT_SHIFT 0 +#define REG0A_IINDPM_INT_ENABLE 0 +#define REG0A_IINDPM_INT_DISABLE 1 + +#define REG0A_INT_MASK_MASK 0x03 +#define REG0A_INT_MASK_SHIFT 0 + + +#define BQ2560X_REG_0B 0x0B +#define REG0B_REG_RESET_MASK 0x80 +#define REG0B_REG_RESET_SHIFT 7 +#define REG0B_REG_RESET 1 + +#define REG0B_PN_MASK 0x78 +#define REG0B_PN_SHIFT 3 + +#define REG0B_DEV_REV_MASK 0x03 +#define REG0B_DEV_REV_SHIFT 0 + + +#endif + + diff --git a/drivers/power/bq27426_fg.c b/drivers/power/bq27426_fg.c new file mode 100644 index 0000000000000..73b1e8b50f4e8 --- /dev/null +++ b/drivers/power/bq27426_fg.c @@ -0,0 +1,2290 @@ +/* + * bqGauge battery driver + * + * Copyright (C) 2008 Rodolfo Giometti + * Copyright (C) 2008 Eurotech S.p.A. + * Copyright (C) 2010-2011 Lars-Peter Clausen + * Copyright (C) 2011 Pali Rohár + * Copyright (C) 2018 XiaoMi, Inc. + * + * Based on a previous work by Copyright (C) 2008 Texas Instruments, Inc. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This package is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +/* + * Datasheets: + */ +#define pr_fmt(fmt) "bq27426- %s: " fmt, __func__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bqfs_cmd_type.h" + +#include +#include "bq27426_gmfs_desay.h" +#include "bq27426_gmfs_scud.h" +#include "bq27426_gmfs_sunwoda.h" +#include "bq27426_gmfs_atl.h" +#include "bq27426_gmfs_default.h" + + +#undef pr_info +#define pr_info pr_debug + +#define MONITOR_ALARM_CHECK_NS 5000000000 +#define INVALID_REG_ADDR 0xFF +#define BQFS_UPDATE_KEY 0x8F91 + + +#define FG_FLAGS_OT BIT(15) +#define FG_FLAGS_UT BIT(14) +#define FG_FLAGS_FC BIT(9) +#define FG_FLAGS_CHG BIT(8) +#define FG_FLAGS_OCVTAKEN BIT(7) +#define FG_FLAGS_ITPOR BIT(5) +#define FG_FLAGS_CFGUPMODE BIT(4) +#define FG_FLAGS_BAT_DET BIT(3) +#define FG_FLAGS_SOC1 BIT(2) +#define FG_FLAGS_SOCF BIT(1) +#define FG_FLAGS_DSG BIT(0) + + +enum bq_fg_reg_idx { + BQ_FG_REG_CTRL = 0, + BQ_FG_REG_TEMP, /* Battery Temperature */ + BQ_FG_REG_VOLT, /* Battery Voltage */ + BQ_FG_REG_AI, /* Average Current */ + BQ_FG_REG_FLAGS, /* Flags */ + BQ_FG_REG_TTE, /* Time to Empty */ + BQ_FG_REG_TTF, /* Time to Full */ + BQ_FG_REG_FCC, /* Full Charge Capacity */ + BQ_FG_REG_RM, /* Remaining Capacity */ + BQ_FG_REG_CC, /* Cycle Count */ + BQ_FG_REG_SOC, /* Relative State of Charge */ + BQ_FG_REG_SOH, /* State of Health */ + BQ_FG_REG_DC, /* Design Capacity */ + NUM_REGS, +}; + +enum bq_fg_subcmd { + FG_SUBCMD_CTRL_STATUS = 0x0000, + FG_SUBCMD_PART_NUM = 0x0001, + FG_SUBCMD_FW_VER = 0x0002, + FG_SUBCMD_DM_CODE = 0x0004, + FG_SUBCMD_CHEM_ID = 0x0008, + FG_SUBCMD_BAT_INSERT = 0x000C, + FG_SUBCMD_BAT_REMOVE = 0x000D, + FG_SUBCMD_SET_CFGUPDATE = 0x0013, + FG_SUBCMD_SEAL = 0x0020, + FG_SUBCMD_PULSE_SOC_INT = 0x0023, + FG_SUBCMD_CHEM_A = 0x0030, + FG_SUBCMD_CHEM_B = 0x0031, + FG_SUBCMD_CHEM_C = 0x0032, + FG_SUBCMD_SOFT_RESET = 0x0042, +}; + + +enum { + SEAL_STATE_FA, + SEAL_STATE_UNSEALED, + SEAL_STATE_SEALED, +}; + + +enum bq_fg_device { + BQ27X00, + BQ27426, +}; + +enum { + UPDATE_REASON_FG_RESET = 1, + UPDATE_REASON_NEW_VERSION, + UPDATE_REASON_FORCED, +}; + +struct batt_chem_id { + u16 id; + u16 cmd; +}; + +static struct batt_chem_id batt_chem_id_arr[] = { + {3230, FG_SUBCMD_CHEM_A}, + {1202, FG_SUBCMD_CHEM_B}, + {3142, FG_SUBCMD_CHEM_C}, +}; + +struct bq_batt_ids { + int kohm; + const char *battery_type; +}; + +static struct bq_batt_ids bq_batt_ids_attr[] = { + {30, "wingtech-Desay-4v4-3000mah"}, + {68, "wingtech-Scud-4v4-3000mah"}, + {330, "wingtech-Sunwoda-4v4-3000mah"}, + {82, "wingtech-Atl-4v4-3000mah"}, +}; + + +struct fg_batt_profile { + const bqfs_cmd_t *bqfs_image; + u32 array_size; + u8 version; +}; + +static const struct fg_batt_profile bqfs_image[] = { + { bqfs_default, ARRAY_SIZE(bqfs_default), 1}, + { bqfs_desay, ARRAY_SIZE(bqfs_desay), 33}, + { bqfs_scud, ARRAY_SIZE(bqfs_scud), 98}, + { bqfs_sunwoda, ARRAY_SIZE(bqfs_sunwoda), 61}, + { bqfs_atl, ARRAY_SIZE(bqfs_atl), 98}, +}; + +const unsigned char *device2str[] = { + "bq27x00", + "bq27426", +}; + +const unsigned char *update_reason_str[] = { + "Reset", + "New Version", + "Force", +}; + +static u8 bq27426_regs[NUM_REGS] = { + 0x00, /* CONTROL */ + 0x02, /* TEMP */ + 0x04, /* VOLT */ + 0x10, /* AVG CURRENT */ + 0x06, /* FLAGS */ + 0xFF, /* Time to empty */ + 0xFF, /* Time to full */ + 0x0E, /* Full charge capacity */ + 0x0C, /* Remaining Capacity */ + 0xFF, /* CycleCount */ + 0x1C, /* State of Charge */ + 0x20, /* State of Health */ + 0xFF, /* Design Capacity */ +}; + +struct bq_fg_chip; + +enum { + BATTERY_PROFILE_A, + BATTERY_PROFILE_B, + BATTERY_PROFILE_MAX, +}; + +struct bq_fg_chip { + struct device *dev; + struct i2c_client *client; + + + struct mutex i2c_rw_lock; + struct mutex data_lock; + struct mutex update_lock; + struct mutex irq_complete; + + struct work_struct fg_soc_work; + struct alarm fg_soc_alarm; + int usb_present; + + bool irq_waiting; + bool irq_disabled; + bool resume_completed; + + int force_update; + int fw_ver; + int df_ver; + + u8 chip; + u8 regs[NUM_REGS]; + + int batt_id; + + /* status tracking */ + + bool batt_present; + bool batt_fc; + bool batt_ot; + bool batt_ut; + bool batt_soc1; + bool batt_socf; + bool batt_dsg; + bool allow_chg; + bool cfg_update_mode; + bool itpor; + + int seal_state; /* 0 - Full Access, 1 - Unsealed, 2 - Sealed */ + int batt_tte; + int batt_soc; + int batt_fcc; /* Full charge capacity */ + int batt_rm; /* Remaining capacity */ + int batt_dc; /* Design Capacity */ + int batt_volt; + int batt_temp; + int batt_curr; + + int batt_cyclecnt; /* cycle count */ + + + struct work_struct update_work; + + unsigned long last_update; + + /* debug */ + int skip_reads; + int skip_writes; + + int fake_soc; + int fake_temp; + + struct dentry *debug_root; + + struct power_supply *batt_psy; + struct power_supply fg_psy; + struct power_supply *usb_psy; + + struct qpnp_vadc_chip *vadc_dev; + struct regulator *vdd; + struct regulator *vcc_i2c; + u32 connected_rid; + const char *battery_type; +}; + + + +static int __fg_read_byte(struct i2c_client *client, u8 reg, u8 *val) +{ + s32 ret; + + ret = i2c_smbus_read_byte_data(client, reg); + if (ret < 0) { + pr_err("i2c read byte fail: can't read from reg 0x%02X\n", reg); + return ret; + } + + *val = (u8)ret; + + return 0; +} + +static int __fg_write_byte(struct i2c_client *client, u8 reg, u8 val) +{ + s32 ret; + + ret = i2c_smbus_write_byte_data(client, reg, val); + if (ret < 0) { + pr_err("i2c write byte fail: can't write 0x%02X to reg 0x%02X\n", + val, reg); + return ret; + } + + return 0; +} + + +static int __fg_read_word(struct i2c_client *client, u8 reg, u16 *val) +{ + s32 ret; + + ret = i2c_smbus_read_word_data(client, reg); + if (ret < 0) { + pr_err("i2c read word fail: can't read from reg 0x%02X\n", reg); + return ret; + } + + *val = (u16)ret; + + return 0; +} + + +static int __fg_write_word(struct i2c_client *client, u8 reg, u16 val) +{ + s32 ret; + + ret = i2c_smbus_write_word_data(client, reg, val); + if (ret < 0) { + pr_err("i2c write word fail: can't write 0x%02X to reg 0x%02X\n", + val, reg); + return ret; + } + + return 0; +} + +static int __fg_read_block(struct i2c_client *client, u8 reg, u8 *buf, u8 len) +{ + int ret; + struct i2c_msg msg[2]; + int i; + + msg[0].addr = client->addr; + msg[0].flags = 0; + msg[0].buf = ® + msg[0].len = 1; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = len; + + for (i = 0; i < 3; i++) { + ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + if (ret >= 0) + return ret; + else + msleep(5); + } + return ret; +} + +static int __fg_write_block(struct i2c_client *client, u8 reg, u8 *buf, u8 len) +{ + int ret; + struct i2c_msg msg; + u8 data[64]; + int i = 0; + + data[0] = reg; + memcpy(&data[1], buf, len); + + msg.addr = client->addr; + msg.flags = 0; + msg.buf = data; + msg.len = len + 1; + + for (i = 0; i < 3; i++) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret >= 0) + return ret; + else + msleep(5); + } + return ret; +} + + +static int fg_read_byte(struct bq_fg_chip *bq, u8 reg, u8 *val) +{ + int ret; + + if (bq->skip_reads) { + *val = 0; + return 0; + } + + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_read_byte(bq->client, reg, val); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + +static int fg_write_byte(struct bq_fg_chip *bq, u8 reg, u8 val) +{ + int ret; + + if (bq->skip_writes) + return 0; + + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_write_byte(bq->client, reg, val); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + +static int fg_read_word(struct bq_fg_chip *bq, u8 reg, u16 *val) +{ + int ret; + + if (bq->skip_reads) { + *val = 0; + return 0; + } + + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_read_word(bq->client, reg, val); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + +static int fg_write_word(struct bq_fg_chip *bq, u8 reg, u16 val) +{ + int ret; + + if (bq->skip_writes) + return 0; + + + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_write_word(bq->client, reg, val); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + +static int fg_read_block(struct bq_fg_chip *bq, u8 reg, u8 *buf, u8 len) +{ + int ret; + + if (bq->skip_reads) + return 0; + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_read_block(bq->client, reg, buf, len); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; + +} + +static int fg_write_block(struct bq_fg_chip *bq, u8 reg, u8 *data, u8 len) +{ + int ret; + + if (bq->skip_writes) + return 0; + + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_write_block(bq->client, reg, data, len); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + +#define CTRL_REG 0x00 + +#define FG_DFT_UNSEAL_KEY1 0x80008000 +#define FG_DFT_UNSEAL_KEY2 0x36724614 + +#define FG_DFT_UNSEAL_FA_KEY 0xFFFFFFFF + +static u8 checksum(u8 *data, u8 len) +{ + u8 i; + u16 sum = 0; + + for (i = 0; i < len; i++) + sum += data[i]; + + sum &= 0xFF; + + return (0xFF - sum); +} + +#if 1 +static void fg_print_buf(const char *msg, u8 *buf, u8 len) +{ + int i; + int idx = 0; + int num; + u8 strbuf[128]; + + pr_err("%s buf: ", msg); + for (i = 0; i < len; i++) { + num = sprintf(&strbuf[idx], "%02X ", buf[i]); + idx += num; + } + pr_err("%s\n", strbuf); +} +#else +static void fg_print_buf(const char *msg, u8 *buf, u8 len) +{} +#endif + + +#define TIMEOUT_INIT_COMPLETED 100 +static int fg_check_init_completed(struct bq_fg_chip *bq) +{ + int ret; + int i = 0; + u16 status; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_CTRL_STATUS); + if (ret < 0) { + pr_err("Failed to write control status cmd, ret = %d\n", ret); + return ret; + } + + msleep(5); + + while (i++ < TIMEOUT_INIT_COMPLETED) { + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &status); + if (ret >= 0 && (status & 0x0080)) + return 0; + msleep(100); + } + pr_err("wait for FG INITCOMP timeout\n"); + return ret; +} + +static int fg_get_seal_state(struct bq_fg_chip *bq) +{ + int ret; + u16 status; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_CTRL_STATUS); + if (ret < 0) { + pr_err("Failed to write control status cmd, ret = %d\n", ret); + return ret; + } + + msleep(5); + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &status); + if (ret < 0) { + pr_err("Failed to read control status, ret = %d\n", ret); + return ret; + } + pr_err("control_status = 0x%04X", status); + if (status & 0x2000) + bq->seal_state = SEAL_STATE_SEALED; + else + bq->seal_state = SEAL_STATE_UNSEALED; + + return 0; +} + +static int fg_unseal(struct bq_fg_chip *bq, u32 key) +{ + int ret; + int retry = 0; + + ret = fg_get_seal_state(bq); + if (ret) + return ret; + if (bq->seal_state == SEAL_STATE_UNSEALED) + return 0; + + pr_info(":key - 0x%08X\n", key); + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], key & 0xFFFF); + if (ret < 0) { + pr_err("unable to write unseal key step 1, ret = %d\n", ret); + return ret; + } + + msleep(5); + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], (key >> 16) & 0xFFFF); + if (ret < 0) { + pr_err("unable to write unseal key step 2, ret = %d\n", ret); + return ret; + } + + msleep(5); + + while (retry++ < 1000) { + fg_get_seal_state(bq); + if (bq->seal_state == SEAL_STATE_UNSEALED) { + return 0; + } + msleep(100); + } + + return -EPERM; +} + + +static int fg_unseal_fa(struct bq_fg_chip *bq, u32 key) +{ + int ret; + int retry = 0; + + pr_info(":key - %d\n", key); + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], key & 0xFFFF); + if (ret < 0) { + pr_err("unable to write unseal key step 1, ret = %d\n", ret); + return ret; + } + + msleep(5); + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], (key >> 16) & 0xFFFF); + if (ret < 0) { + pr_err("unable to write unseal key step 2, ret = %d\n", ret); + return ret; + } + + msleep(5); + + while (retry++ < 1000) { + fg_get_seal_state(bq); + if (bq->seal_state == SEAL_STATE_FA) { + return 0; + } + msleep(10); + } + + return -1; +} +EXPORT_SYMBOL_GPL(fg_unseal_fa); + +static int fg_seal(struct bq_fg_chip *bq) +{ + int ret; + int retry = 0; + + fg_get_seal_state(bq); + + if (bq->seal_state == SEAL_STATE_SEALED) + return 0; + msleep(5); + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_SEAL); + + if (ret < 0) { + pr_err("Failed to send seal command\n"); + return ret; + } + + while (retry++ < 1000) { + fg_get_seal_state(bq); + if (bq->seal_state == SEAL_STATE_SEALED) + return 0; + msleep(200); + } + + return -1; +} + + + +static int fg_check_cfg_update_mode(struct bq_fg_chip *bq) +{ + int ret; + u16 flags; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_FLAGS], &flags); + if (ret < 0) { + return ret; + } + + bq->cfg_update_mode = !!(flags & FG_FLAGS_CFGUPMODE); + + return 0; + +} + +static int fg_check_itpor(struct bq_fg_chip *bq) +{ + int ret; + u16 flags; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_FLAGS], &flags); + if (ret < 0) { + return ret; + } + + bq->itpor = !!(flags & FG_FLAGS_ITPOR); + + return 0; +} + + +static int fg_read_dm_version(struct bq_fg_chip *bq, u8 *ver) +{ + int ret; + u16 dm_code = 0; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_DM_CODE); + if (ret < 0) { + pr_err("Failed to write control status cmd, ret = %d\n", ret); + return ret; + } + + msleep(5); + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &dm_code); + if (!ret) + *ver = dm_code & 0xFF; + return ret; +} + +#define CFG_UPDATE_POLLING_RETRY_LIMIT 50 +static int fg_dm_pre_access(struct bq_fg_chip *bq) +{ + int ret; + int i = 0; + + ret = fg_check_init_completed(bq); + if (ret < 0) + return ret; + ret = fg_unseal(bq, FG_DFT_UNSEAL_KEY1); + if (ret < 0) + return ret; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_SET_CFGUPDATE); + if (ret < 0) + return ret; + + msleep(10); + + while(i++ < CFG_UPDATE_POLLING_RETRY_LIMIT) { + ret = fg_check_cfg_update_mode(bq); + if (!ret && bq->cfg_update_mode) + return 0; + msleep(400); + } + + pr_err("Failed to enter cfgupdate mode\n"); + + return -EPERM; +} +EXPORT_SYMBOL_GPL(fg_dm_pre_access); + +static int fg_dm_post_access(struct bq_fg_chip *bq) +{ + int ret; + int i = 0; + + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], + FG_SUBCMD_SOFT_RESET); + if (ret < 0) + return ret; + + msleep(100); + + while (i++ < CFG_UPDATE_POLLING_RETRY_LIMIT) { + ret = fg_check_cfg_update_mode(bq); + if (!ret && !bq->cfg_update_mode) + break; + msleep(100); + } + + if (i == CFG_UPDATE_POLLING_RETRY_LIMIT) { + pr_err("Failed to exit cfgupdate mode\n"); + return -EPERM; + } else { + return fg_seal(bq); + } +} +EXPORT_SYMBOL_GPL(fg_dm_post_access); + +#define DM_ACCESS_BLOCK_DATA_CHKSUM 0x60 +#define DM_ACCESS_BLOCK_DATA_CTRL 0x61 +#define DM_ACCESS_BLOCK_DATA_CLASS 0x3E +#define DM_ACCESS_DATA_BLOCK 0x3F +#define DM_ACCESS_BLOCK_DATA 0x40 + + +static int fg_dm_read_block(struct bq_fg_chip *bq, u8 classid, + u8 offset, u8 *buf) +{ + int ret; + u8 cksum_calc, cksum; + u8 blk_offset = offset >> 5; + + pr_info("subclass:%d, offset:%d\n", classid, offset); + + ret = fg_write_byte(bq, DM_ACCESS_BLOCK_DATA_CTRL, 0); + if (ret < 0) + return ret; + msleep(5); + ret = fg_write_byte(bq, DM_ACCESS_BLOCK_DATA_CLASS, classid); + if (ret < 0) + return ret; + msleep(5); + ret = fg_write_byte(bq, DM_ACCESS_DATA_BLOCK, blk_offset); + if (ret < 0) + return ret; + msleep(5); + ret = fg_read_block(bq, DM_ACCESS_BLOCK_DATA, buf, 32); + if (ret < 0) + return ret; + + fg_print_buf(__func__, buf, 32); + + msleep(5); + cksum_calc = checksum(buf, 32); + ret = fg_read_byte(bq, DM_ACCESS_BLOCK_DATA_CHKSUM, &cksum); + if (!ret && cksum_calc == cksum) + return 0; + else + return 1; +} +EXPORT_SYMBOL_GPL(fg_dm_read_block); + +static int fg_dm_write_block(struct bq_fg_chip *bq, u8 classid, + u8 offset, u8 *data) +{ + int ret; + u8 cksum; + u8 buf[64]; + u8 blk_offset = offset >> 5; + + pr_info("subclass:%d, offset:%d\n", classid, offset); + + ret = fg_write_byte(bq, DM_ACCESS_BLOCK_DATA_CTRL, 0); + if (ret < 0) + return ret; + msleep(5); + ret = fg_write_byte(bq, DM_ACCESS_BLOCK_DATA_CLASS, classid); + if (ret < 0) + return ret; + msleep(5); + ret = fg_write_byte(bq, DM_ACCESS_DATA_BLOCK, blk_offset); + if (ret < 0) + return ret; + ret = fg_write_block(bq, DM_ACCESS_BLOCK_DATA, data, 32); + msleep(5); + + fg_print_buf(__func__, data, 32); + + cksum = checksum(data, 32); + ret = fg_write_byte(bq, DM_ACCESS_BLOCK_DATA_CHKSUM, cksum); + if (ret < 0) + return ret; + msleep(5); + + ret = fg_write_byte(bq, DM_ACCESS_DATA_BLOCK, blk_offset); + if (ret < 0) + return ret; + msleep(5); + ret = fg_read_block(bq, DM_ACCESS_BLOCK_DATA, buf, 32); + if (ret < 0) + return ret; + if (memcpy(data, buf, 32)) { + pr_err("Error updating subclass %d offset %d\n", + classid, offset); + return 1; + } + return 0; +} +EXPORT_SYMBOL_GPL(fg_dm_write_block); + +static int fg_read_fw_version(struct bq_fg_chip *bq) +{ + + int ret; + u16 version; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], 0x0002); + + if (ret < 0) { + pr_err("Failed to send firmware version subcommand:%d\n", ret); + return ret; + } + + mdelay(2); + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &version); + if (ret < 0) { + pr_err("Failed to read firmware version:%d\n", ret); + return ret; + } + + return version; +} + + +static int fg_read_status(struct bq_fg_chip *bq) +{ + int ret; + u16 flags; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_FLAGS], &flags); + if (ret < 0) { + return ret; + } + + mutex_lock(&bq->data_lock); + bq->batt_present = !!(flags & FG_FLAGS_BAT_DET); + bq->batt_ot = !!(flags & FG_FLAGS_OT); + bq->batt_ut = !!(flags & FG_FLAGS_UT); + bq->batt_fc = !!(flags & FG_FLAGS_FC); + bq->batt_soc1 = !!(flags & FG_FLAGS_SOC1); + bq->batt_socf = !!(flags & FG_FLAGS_SOCF); + bq->batt_dsg = !!(flags & FG_FLAGS_DSG); + bq->allow_chg = !!(flags & FG_FLAGS_CHG); + mutex_unlock(&bq->data_lock); + + return 0; +} + + +static int fg_get_charger_present(struct bq_fg_chip *bq) +{ + union power_supply_propval prop = {0,}; + int ret; + + ret = bq->usb_psy->get_property(bq->usb_psy, + POWER_SUPPLY_PROP_PRESENT, &prop); + + if (!ret) + bq->usb_present = prop.intval; + + return ret; +} + +#define CYCLE_DETECT_TIME 30 +u16 monitor_soc = 0; +static int fg_read_rsoc(struct bq_fg_chip *bq) +{ + int ret; + u16 soc = 0; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_SOC], &soc); + if (ret < 0) { + pr_err("could not read RSOC, ret = %d\n", ret); + return ret; + } + + return soc; + +} + +bool monitor_soc_up = 0; +bool monitor_soc_down = 0; +static int fg_read_new_rsoc(struct bq_fg_chip *bq) +{ + u16 new_soc = 0; + ktime_t kt; + + new_soc = fg_read_rsoc(bq); + fg_get_charger_present(bq); + if (!monitor_soc_up && bq->usb_present && (new_soc == 100 && (bq->batt_soc >= 90 && bq->batt_soc <= 98))) { + pr_err("soc jumped, new_soc = %d, old_soc = %d\n", new_soc, bq->batt_soc); + monitor_soc_up = 1; + monitor_soc_down = 0; + kt = ns_to_ktime(CYCLE_DETECT_TIME*NSEC_PER_SEC); + alarm_start_relative(&bq->fg_soc_alarm, kt); + } + + if (monitor_soc_up || monitor_soc_down) { + } else{ + monitor_soc = new_soc; + } + + return monitor_soc; + +} + +static enum alarmtimer_restart fg_soc_alarm_callback(struct alarm *alarm, + ktime_t now) +{ + struct bq_fg_chip *bq = container_of(alarm, struct bq_fg_chip, + fg_soc_alarm); + + pr_err("fg_soc_jump_callback\n"); + pm_stay_awake(bq->dev); + schedule_work(&bq->fg_soc_work); + + return ALARMTIMER_NORESTART; +} + +static void fg_soc_work_fn(struct work_struct *work) +{ + struct bq_fg_chip *bq = container_of(work, struct bq_fg_chip, + fg_soc_work); + ktime_t kt; + u16 real_soc = 0; + real_soc = fg_read_rsoc(bq); + + fg_get_charger_present(bq); + if (monitor_soc_up && bq->usb_present) { + monitor_soc += 1; + monitor_soc = (monitor_soc <= 100) ? monitor_soc : 100; + } + + pr_err("fg_soc_work_fn monitor_soc = %d\n", monitor_soc); + if (!bq->usb_present && monitor_soc <= 99) { + pr_err("fg_soc_work_fn fg_soc_work_fn monitor_soc_down\n"); + monitor_soc_down = 1; + monitor_soc_up = 0; + } + if (monitor_soc == 100 || real_soc <= monitor_soc) { + pr_err("fg_soc_work_fn alarm stop\n"); + monitor_soc_up = 0; + monitor_soc_down = 0; + } + + power_supply_changed(&bq->fg_psy); + + if (monitor_soc_down || monitor_soc_up) { + kt = ns_to_ktime(CYCLE_DETECT_TIME*NSEC_PER_SEC); + alarm_start_relative(&bq->fg_soc_alarm, kt); + } + + pm_relax(bq->dev); +} + + +#define DEFAULT_TEMP 2980 +static int fg_read_temperature(struct bq_fg_chip *bq) +{ + int ret; + u16 temp = 0; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_TEMP], &temp); + if (ret < 0) { + pr_err("could not read temperature, ret = %d\n", ret); + return ret; + } + + +#ifdef CONFIG_DISABLE_TEMP_PROTECT + pr_err("Disable temp control Version!\n"); + return DEFAULT_TEMP; +#else + return temp; +#endif + +} + +#define DEFAULT_RESISTER 45 +static int fg_get_battid_resister(struct bq_fg_chip *bq) +{ + int rc = 0; + int bq_battid_resister = 0; + struct qpnp_vadc_result results; + + rc = qpnp_vadc_read(bq->vadc_dev, P_MUX4_1_1, &results); + if (rc) { + pr_debug("Unable to read batt resister rc=%d\n", rc); + return DEFAULT_RESISTER; + } + + bq_battid_resister = (results.physical)*100/(1800000 - results.physical); + + return bq_battid_resister; +} + + +static char *bq_default_batt_type = "Generic_Battery"; + +static int bq_batterydata_get_best_profile(struct bq_fg_chip *bq) +{ + int delta = 0, best_id_kohm = 0, id_range_pct = 15, + batt_id_kohm = 0, i = 0, limit = 0; + + batt_id_kohm = fg_get_battid_resister(bq); + + for (i = 0; i < ARRAY_SIZE(bq_batt_ids_attr); i++) { + delta = abs(bq_batt_ids_attr[i].kohm - batt_id_kohm); + limit = (bq_batt_ids_attr[i].kohm * id_range_pct) / 100; + if (delta <= limit) { + best_id_kohm = bq_batt_ids_attr[i].kohm; + bq->battery_type = bq_batt_ids_attr[i].battery_type; + goto out; + } + } + + pr_err("out of range, using default battery, best_id_kohm=%d\n", batt_id_kohm); + + bq->battery_type = bq_default_batt_type; + +out: + pr_err("%s found\n", bq->battery_type); + hardwareinfo_set_prop(HARDWARE_BATTERY_ID, bq->battery_type); + + if (best_id_kohm == 30) { + bq->batt_id = 1; + } else if (best_id_kohm == 68) { + bq->batt_id = 2; + } else if (best_id_kohm == 330) { + bq->batt_id = 3; + } else if (best_id_kohm == 82) { + bq->batt_id = 4; + } else + bq->batt_id = 0; + + return 0; +} + + +static int fg_read_volt(struct bq_fg_chip *bq) +{ + int ret; + u16 volt = 0; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_VOLT], &volt); + if (ret < 0) { + pr_err("could not read voltage, ret = %d\n", ret); + return ret; + } + + return volt; + +} + +static int fg_read_current(struct bq_fg_chip *bq, int *curr) +{ + int ret; + u16 avg_curr = 0; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_AI], &avg_curr); + if (ret < 0) { + pr_err("could not read current, ret = %d\n", ret); + return ret; + } + *curr = (int)((s16)avg_curr); + + return ret; +} + +static int fg_read_fcc(struct bq_fg_chip *bq) +{ + int ret; + u16 fcc; + + if (bq->regs[BQ_FG_REG_FCC] == INVALID_REG_ADDR) { + pr_err("FCC command not supported!\n"); + return 0; + } + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_FCC], &fcc); + + if (ret < 0) { + pr_err("could not read FCC, ret=%d\n", ret); + } + + return fcc; +} + +static int fg_read_dc(struct bq_fg_chip *bq) +{ + + int ret; + u16 dc; + + if (bq->regs[BQ_FG_REG_DC] == INVALID_REG_ADDR) { + pr_err("DesignCapacity command not supported!\n"); + return 0; + } + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_DC], &dc); + + if (ret < 0) { + pr_err("could not read DC, ret=%d\n", ret); + return ret; + } + + return dc; +} + + +static int fg_read_rm(struct bq_fg_chip *bq) +{ + int ret; + u16 rm; + + if (bq->regs[BQ_FG_REG_RM] == INVALID_REG_ADDR) { + pr_err("RemainingCapacity command not supported!\n"); + return 0; + } + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_RM], &rm); + + if (ret < 0) { + pr_err("could not read DC, ret=%d\n", ret); + return ret; + } + + return rm; + +} + +static int fg_read_cyclecount(struct bq_fg_chip *bq) +{ + int ret; + u16 cc; + + if (bq->regs[BQ_FG_REG_CC] == INVALID_REG_ADDR) { + pr_err("Cycle Count not supported!\n"); + return -EPERM; + } + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CC], &cc); + + if (ret < 0) { + pr_err("could not read Cycle Count, ret=%d\n", ret); + return ret; + } + + return cc; +} + +static int fg_read_tte(struct bq_fg_chip *bq) +{ + int ret; + u16 tte; + + if (bq->regs[BQ_FG_REG_TTE] == INVALID_REG_ADDR) { + pr_err("Time To Empty not supported!\n"); + return -EPERM; + } + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_TTE], &tte); + + if (ret < 0) { + pr_err("could not read Time To Empty, ret=%d\n", ret); + return ret; + } + + if (ret == 0xFFFF) + return -ENODATA; + + return tte; +} + +static int fg_get_batt_status(struct bq_fg_chip *bq) +{ + union power_supply_propval prop = {0,}; + int ret; + + ret = bq->usb_psy->get_property(bq->usb_psy, + POWER_SUPPLY_PROP_PRESENT, &prop); + if (ret < 0) + pr_err("could not read USB current_max property, ret=%d\n", ret); + fg_read_status(bq); + + if (!bq->batt_present) + return POWER_SUPPLY_STATUS_UNKNOWN; + else if (bq->batt_fc && prop.intval) + return POWER_SUPPLY_STATUS_FULL; + else if (bq->batt_dsg) + return POWER_SUPPLY_STATUS_DISCHARGING; + else if (bq->batt_curr > 0) + return POWER_SUPPLY_STATUS_CHARGING; + else + return POWER_SUPPLY_STATUS_NOT_CHARGING; + +} + + +static int fg_get_batt_capacity_level(struct bq_fg_chip *bq) +{ + if (!bq->batt_present) + return POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN; + else if (bq->batt_fc) + return POWER_SUPPLY_CAPACITY_LEVEL_FULL; + else if (bq->batt_soc1) + return POWER_SUPPLY_CAPACITY_LEVEL_LOW; + else if (bq->batt_socf) + return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; + else + return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; + +} + + +static int fg_get_batt_health(struct bq_fg_chip *bq) +{ + if (!bq->batt_present) + return POWER_SUPPLY_HEALTH_UNKNOWN; + else if (bq->batt_ot) + return POWER_SUPPLY_HEALTH_OVERHEAT; + else if (bq->batt_ut) + return POWER_SUPPLY_HEALTH_COLD; + else + return POWER_SUPPLY_HEALTH_GOOD; + +} + +static enum power_supply_property fg_props[] = { + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CURRENT_NOW, + POWER_SUPPLY_PROP_RESISTANCE_ID, + POWER_SUPPLY_PROP_BATTERY_TYPE, + POWER_SUPPLY_PROP_CAPACITY, + POWER_SUPPLY_PROP_CAPACITY_LEVEL, + POWER_SUPPLY_PROP_TEMP, + + POWER_SUPPLY_PROP_CHARGE_FULL, + + + POWER_SUPPLY_PROP_HEALTH, + POWER_SUPPLY_PROP_TECHNOLOGY, + POWER_SUPPLY_PROP_UPDATE_NOW, +}; + +static int fg_get_property(struct power_supply *psy, enum power_supply_property psp, + union power_supply_propval *val) +{ + struct bq_fg_chip *bq = container_of(psy, struct bq_fg_chip, fg_psy); + int ret; + + mutex_lock(&bq->update_lock); + switch (psp) { + case POWER_SUPPLY_PROP_STATUS: + val->intval = fg_get_batt_status(bq); + break; + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + ret = fg_read_volt(bq); + mutex_lock(&bq->data_lock); + if (ret >= 0) + bq->batt_volt = ret; + val->intval = bq->batt_volt * 1000; + mutex_unlock(&bq->data_lock); + + break; + case POWER_SUPPLY_PROP_PRESENT: + val->intval = bq->batt_present; + break; + case POWER_SUPPLY_PROP_CURRENT_NOW: + mutex_lock(&bq->data_lock); + fg_read_current(bq, &bq->batt_curr); + val->intval = -bq->batt_curr * 1000; + pr_info("bq27426 current=%d\n", val->intval); + mutex_unlock(&bq->data_lock); + break; + case POWER_SUPPLY_PROP_RESISTANCE_ID: + val->intval = fg_get_battid_resister(bq); + break; + case POWER_SUPPLY_PROP_BATTERY_TYPE: + val->strval = bq->battery_type; + break; + case POWER_SUPPLY_PROP_CAPACITY: + if (bq->fake_soc >= 0) { + val->intval = bq->fake_soc; + break; + } + ret = fg_read_new_rsoc(bq); + mutex_lock(&bq->data_lock); + if (ret >= 0) + bq->batt_soc = ret; + val->intval = bq->batt_soc; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + val->intval = fg_get_batt_capacity_level(bq); + break; + + case POWER_SUPPLY_PROP_TEMP: + if (bq->fake_temp != -EINVAL) { + val->intval = bq->fake_temp; + break; + } + ret = fg_read_temperature(bq); + mutex_lock(&bq->data_lock); + if (ret > 0) + bq->batt_temp = ret; + val->intval = bq->batt_temp - 2730; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: + ret = fg_read_tte(bq); + mutex_lock(&bq->data_lock); + if (ret >= 0) + bq->batt_tte = ret; + + val->intval = bq->batt_tte; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_CHARGE_FULL: + ret = fg_read_fcc(bq); + mutex_lock(&bq->data_lock); + if (ret > 0) + bq->batt_fcc = ret; + + val->intval = 3000; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + ret = fg_read_dc(bq); + mutex_lock(&bq->data_lock); + if (ret > 0) + bq->batt_dc = ret; + val->intval = bq->batt_dc * 1000; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_CYCLE_COUNT: + ret = fg_read_cyclecount(bq); + mutex_lock(&bq->data_lock); + if (ret >= 0) + bq->batt_cyclecnt = ret; + val->intval = bq->batt_cyclecnt; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_HEALTH: + val->intval = fg_get_batt_health(bq); + break; + + case POWER_SUPPLY_PROP_TECHNOLOGY: + val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; + break; + + case POWER_SUPPLY_PROP_UPDATE_NOW: + val->intval = 0; + break; + + default: + mutex_unlock(&bq->update_lock); + return -EINVAL; + } + mutex_unlock(&bq->update_lock); + return 0; +} + +static void fg_dump_registers(struct bq_fg_chip *bq); + +static int fg_set_property(struct power_supply *psy, + enum power_supply_property prop, + const union power_supply_propval *val) +{ + struct bq_fg_chip *bq = container_of(psy, struct bq_fg_chip, + fg_psy); + switch (prop) { + case POWER_SUPPLY_PROP_TEMP: + bq->fake_temp = val->intval; + break; + case POWER_SUPPLY_PROP_CAPACITY: + bq->fake_soc = val->intval; + power_supply_changed(&bq->fg_psy); + break; + case POWER_SUPPLY_PROP_UPDATE_NOW: + fg_dump_registers(bq); + break; + default: + return -EINVAL; + } + + return 0; +} + + +static int fg_prop_is_writeable(struct power_supply *psy, + enum power_supply_property prop) +{ + int ret; + + switch (prop) { + case POWER_SUPPLY_PROP_TEMP: + case POWER_SUPPLY_PROP_CAPACITY: + case POWER_SUPPLY_PROP_UPDATE_NOW: + ret = 1; + break; + default: + ret = 0; + break; + } + return ret; +} + + + +static void fg_external_power_changed(struct power_supply *psy) +{ + +} + +static int fg_psy_register(struct bq_fg_chip *bq) +{ + int ret; + + bq->fg_psy.name = "bms"; + bq->fg_psy.type = POWER_SUPPLY_TYPE_BMS; + bq->fg_psy.properties = fg_props; + bq->fg_psy.num_properties = ARRAY_SIZE(fg_props); + bq->fg_psy.get_property = fg_get_property; + bq->fg_psy.set_property = fg_set_property; + bq->fg_psy.external_power_changed = fg_external_power_changed; + bq->fg_psy.property_is_writeable = fg_prop_is_writeable; + + + ret = power_supply_register(bq->dev, &bq->fg_psy); + if (ret < 0) { + pr_err("Failed to register fg_psy:%d\n", ret); + return ret; + } + + return 0; +} + + +static void fg_psy_unregister(struct bq_fg_chip *bq) +{ + + power_supply_unregister(&bq->fg_psy); +} + + +static int fg_change_chem_id(struct bq_fg_chip *bq, u16 new_id) +{ + int ret; + u16 old_id; + + int i; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_CHEM_ID); + if (ret < 0) { + pr_err("Failed to write chemid subcmd, ret = %d\n", ret); + return ret; + } + + msleep(5); + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &old_id); + if (ret < 0) { + pr_err("Failed to read control status, ret = %d\n", ret); + return ret; + } + + if (new_id == old_id) { + pr_info("new chemid is same as old one, skip change\n"); + return 0; + } + + for (i = 0; i < ARRAY_SIZE(batt_chem_id_arr); i++) { + if (new_id == batt_chem_id_arr[i].id) + break; + } + + if (i == ARRAY_SIZE(batt_chem_id_arr)) { + pr_err("not supported chem_id %d\n", new_id); + return -1; + } + + msleep(5); + ret = fg_dm_pre_access(bq); + if (ret < 0) + return ret; + msleep(5); + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], batt_chem_id_arr[i].cmd); + if (ret < 0) { + pr_err("Failed to send chem_id command, ret=%d\n", ret); + fg_dm_post_access(bq); + return ret; + } + + msleep(5); + ret = fg_dm_post_access(bq); + if (ret < 0) + return ret; + + msleep(2000); + /* Read back checm id to confirm */ + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &old_id); + if (ret < 0) { + pr_err("Failed to read control status, ret = %d\n", ret); + return ret; + } + + if (new_id == old_id) { + pr_info("chem ID changed successfully\n"); + return 0; + } else { + return -1; + } +} +EXPORT_SYMBOL_GPL(fg_change_chem_id); + +static int fg_check_update_necessary(struct bq_fg_chip *bq) +{ + int ret; + u8 dm_ver = 0xFF; + + ret = fg_check_itpor(bq); + if (!ret && bq->itpor) + return UPDATE_REASON_FG_RESET; + + ret = fg_read_dm_version(bq, &dm_ver); + pr_err("bq27426 dm_ver = %d\n", dm_ver); + if (!ret && dm_ver < bqfs_image[bq->batt_id].version) + return UPDATE_REASON_NEW_VERSION; + else + return 0; +} + +static bool fg_update_bqfs_execute_cmd(struct bq_fg_chip *bq, + const bqfs_cmd_t *cmd) +{ + int ret; + int i; + u8 tmp_buf[CMD_MAX_DATA_SIZE]; + + switch (cmd->cmd_type) { + case CMD_R: + ret = fg_read_block(bq, cmd->reg, (u8 *)&cmd->data.bytes, cmd->data_len); + if (ret < 0) + return false; + else + return true; + break; + case CMD_W: + ret = fg_write_block(bq, cmd->reg, (u8 *)&cmd->data.bytes, cmd->data_len); + if (ret < 0) + return false; + else + return true; + break; + case CMD_C: + if (fg_read_block(bq, cmd->reg, tmp_buf, cmd->data_len) < 0) + return false; + if (memcmp(tmp_buf, cmd->data.bytes, cmd->data_len)) { + pr_info("CMD_C failed at line %d\n", cmd->line_num); + for (i = 0; i < cmd->data_len; i++) { + pr_err("Read: %02X, Cmp:%02X", tmp_buf[i], cmd->data.bytes[i]); + } + return false; + } + + return true; + break; + case CMD_X: + mdelay(cmd->data.delay); + return true; + break; + default: + pr_err("Unsupported command at line %d\n", cmd->line_num); + return false; + } + +} +EXPORT_SYMBOL_GPL(fg_update_bqfs_execute_cmd); + +static void fg_update_bqfs(struct bq_fg_chip *bq) +{ + int i; + const bqfs_cmd_t *image; + int reason = 0; + + + if (bq->force_update == ~BQFS_UPDATE_KEY) + reason = UPDATE_REASON_FORCED; + else + reason = fg_check_update_necessary(bq); + + if (!reason) { + pr_info("Fuel Gauge parameter no need update, ignored\n"); + return; + } + + if (bq->batt_id >= ARRAY_SIZE(bqfs_image) || + bq->batt_id < 0) { + pr_err("batt_id is out of range"); + return; + } + /* TODO:if unseal, enter cfg update mode cmd sequence are in gmfs file, + no need to do explicitly */ + fg_dm_pre_access(bq); + + pr_err("Fuel Gauge parameter update, reason:%s, version:%d, batt_id=%d Start...\n", + update_reason_str[reason - 1], bqfs_image[bq->batt_id].version, bq->batt_id); + + mutex_lock(&bq->update_lock); + image = bqfs_image[bq->batt_id].bqfs_image; + for (i = 0; i < bqfs_image[bq->batt_id].array_size; i++) { + if (!fg_update_bqfs_execute_cmd(bq, &image[i])) { + mutex_unlock(&bq->update_lock); + pr_err("Failed at command: %d\n", i); + fg_dm_post_access(bq); + return; + } + mdelay(5); + } + mutex_unlock(&bq->update_lock); + + pr_err("Done!\n"); + + /* TODO:exit cfg update mode and seal device if these are not handled in gmfs file */ + fg_dm_post_access(bq); + return; + +} +EXPORT_SYMBOL_GPL(fg_update_bqfs); + + +static const u8 fg_dump_regs[] = { + 0x00, 0x02, 0x04, 0x06, + 0x08, 0x0A, 0x0C, 0x0E, + 0x10, 0x16, 0x18, 0x1A, + 0x1C, 0x1E, 0x20, 0x28, + 0x2A, 0x2C, 0x2E, 0x30, + 0x66, 0x68, 0x6C, 0x6E, + 0x70, +}; + +static void fg_dump_registers(struct bq_fg_chip *bq) +{ + int i; + int ret; + u16 val = 0; + + if (bq->batt_present) { + mutex_lock(&bq->update_lock); + + bq->batt_soc = fg_read_new_rsoc(bq); + bq->batt_volt = fg_read_volt(bq); + fg_read_current(bq, &bq->batt_curr); + bq->batt_temp = fg_read_temperature(bq); + bq->batt_rm = fg_read_rm(bq); + + mutex_unlock(&bq->update_lock); + pr_err("BQ27426 --RSOC:%d, Volt:%d, Current:%d, Temperature:%d\n", + bq->batt_soc, bq->batt_volt, bq->batt_curr, bq->batt_temp - 2730); + } + + pr_err("Reg[00 -70] = "); + for (i = 0; i < ARRAY_SIZE(fg_dump_regs); i++) { + msleep(5); + ret = fg_read_word(bq, fg_dump_regs[i], &val); + if (!ret) + printk("0x%04X, ", val); + } + printk("\n"); +} +EXPORT_SYMBOL_GPL(fg_dump_registers); + + +static int show_registers(struct seq_file *m, void *data) +{ + struct bq_fg_chip *bq = m->private; + int i; + int ret; + u16 val = 0; + + for (i = 0; i < ARRAY_SIZE(fg_dump_regs); i++) { + msleep(5); + ret = fg_read_word(bq, fg_dump_regs[i], &val); + if (!ret) + seq_printf(m, "Reg[%02X] = 0x%04X\n", + fg_dump_regs[i], val); + } + return 0; +} + + +static int reg_debugfs_open(struct inode *inode, struct file *file) +{ + struct bq_fg_chip *bq = inode->i_private; + + return single_open(file, show_registers, bq); +} + +static const struct file_operations reg_debugfs_ops = { + .owner = THIS_MODULE, + .open = reg_debugfs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void create_debugfs_entry(struct bq_fg_chip *bq) +{ + bq->debug_root = debugfs_create_dir("bq_fg", NULL); + if (!bq->debug_root) + pr_err("Failed to create debug dir\n"); + + if (bq->debug_root) { + + debugfs_create_file("registers", S_IFREG | S_IRUGO, + bq->debug_root, bq, ®_debugfs_ops); + + debugfs_create_x32("fake_soc", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->fake_soc)); + + debugfs_create_x32("fake_temp", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->fake_temp)); + + debugfs_create_x32("skip_reads", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->skip_reads)); + debugfs_create_x32("skip_writes", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->skip_writes)); + } +} + +static ssize_t fg_attr_show_Ra_table(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + int ret; + u8 rd_buf[64]; + u8 temp_buf[100]; + int len, i, idx; + u8 *err_str[] = { + "Failed to enter configure mode", + "Failed to Read Ra Table", + "Failed to exit configure mode", + }; + + memset(buf, 0, 64); + mutex_lock(&bq->update_lock); + ret = fg_dm_pre_access(bq); + if (ret) { + sprintf(buf, "%s", err_str[0]); + mutex_unlock(&bq->update_lock); + return strlen(err_str[0]); + } + + ret = fg_dm_read_block(bq, 89, 0, rd_buf); + if (ret) { + sprintf(buf, "%s", err_str[1]); + fg_dm_post_access(bq); + mutex_unlock(&bq->update_lock); + return strlen(err_str[1]); + } + + fg_dm_post_access(bq); + + idx = 0; + for (i = 0; i < 30; i++) { + len = sprintf(temp_buf, "%02X ", rd_buf[i]); + memcpy(&buf[idx], temp_buf, len); + idx += len; + } + mutex_unlock(&bq->update_lock); + return idx; +} + +static ssize_t fg_attr_show_Qmax(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + int ret; + u8 rd_buf[64]; + int len; + u8 *err_str[] = { + "Failed to enter configure mode", + "Failed to Qmax", + }; + + memset(buf, 0, 64); + mutex_lock(&bq->update_lock); + ret = fg_dm_pre_access(bq); + if (ret) { + sprintf(buf, "%s", err_str[0]); + mutex_unlock(&bq->update_lock); + return strlen(err_str[0]); + } + + ret = fg_dm_read_block(bq, 82, 0, rd_buf); + if (ret) { + sprintf(buf, "%s", err_str[1]); + fg_dm_post_access(bq); + mutex_unlock(&bq->update_lock); + return strlen(err_str[1]); + } + + len = sprintf(buf, "Qmax Cell 0 = %d\n", (rd_buf[0] << 8) | rd_buf[1]); + fg_dm_post_access(bq); + + mutex_unlock(&bq->update_lock); + return len; +} + +static ssize_t fg_attr_store_update(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + unsigned int key = 0; + + sscanf(buf, "%x", &key); + if (key == BQFS_UPDATE_KEY) { + bq->force_update = ~key; + schedule_work(&bq->update_work); + } + return count; +} + +static ssize_t fg_attr_show_dmcode(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + int ret; + u8 ver; + + ret = fg_read_dm_version(bq, &ver); + if (!ret) + return sprintf(buf, "0x%02X\n", ver); + else + return sprintf(buf, "Read DM code error"); +} + + +static DEVICE_ATTR(RaTable, S_IRUGO, fg_attr_show_Ra_table, NULL); +static DEVICE_ATTR(Qmax, S_IRUGO, fg_attr_show_Qmax, NULL); +static DEVICE_ATTR(update, S_IWUSR, NULL, fg_attr_store_update); +static DEVICE_ATTR(dmcode, S_IRUGO, fg_attr_show_dmcode, NULL); + + +static struct attribute *fg_attributes[] = { + &dev_attr_RaTable.attr, + &dev_attr_Qmax.attr, + &dev_attr_update.attr, + &dev_attr_dmcode.attr, + NULL, +}; + + +static const struct attribute_group fg_attr_group = { + .attrs = fg_attributes, +}; + + +static void fg_update_bqfs_workfunc(struct work_struct *work) +{ + struct bq_fg_chip *bq = container_of(work, + struct bq_fg_chip, update_work); + + fg_update_bqfs(bq); +} + +static irqreturn_t fg_irq_thread(int irq, void *dev_id) +{ + struct bq_fg_chip *bq = dev_id; + + + + + bool last_batt_present; + + mutex_lock(&bq->irq_complete); + bq->irq_waiting = true; + if (!bq->resume_completed) { + pr_info("IRQ triggered before device resume\n"); + if (!bq->irq_disabled) { + disable_irq_nosync(irq); + bq->irq_disabled = true; + } + mutex_unlock(&bq->irq_complete); + return IRQ_HANDLED; + } + bq->irq_waiting = false; + + last_batt_present = bq->batt_present; + + mutex_lock(&bq->update_lock); + fg_read_status(bq); + mutex_unlock(&bq->update_lock); + pr_info("itpor=%d, cfg_mode = %d, seal_state=%d, batt_present=%d", + bq->itpor, bq->cfg_update_mode, bq->seal_state, bq->batt_present); + + if (!last_batt_present && bq->batt_present) {/* battery inserted */ + pr_info("Battery inserted\n"); + } else if (last_batt_present && !bq->batt_present) {/* battery removed */ + pr_info("Battery removed\n"); + bq->batt_soc = -ENODATA; + bq->batt_fcc = -ENODATA; + bq->batt_rm = -ENODATA; + bq->batt_volt = -ENODATA; + bq->batt_curr = -ENODATA; + bq->batt_temp = -ENODATA; + bq->batt_cyclecnt = -ENODATA; + } + power_supply_changed(&bq->fg_psy); + mutex_unlock(&bq->irq_complete); + + return IRQ_HANDLED; +} + + +static void determine_initial_status(struct bq_fg_chip *bq) +{ + fg_irq_thread(bq->client->irq, bq); +} + +#define SMB_VTG_MIN_UV 1800000 +#define SMB_VTG_MAX_UV 1800000 + +static int bq_fg_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + + int ret; + int rc = 0; + struct bq_fg_chip *bq; + struct power_supply *usb_psy; + u8 *regs; + + usb_psy = power_supply_get_by_name("usb"); + if (!usb_psy) { + dev_dbg(&client->dev, "USB supply not found, defer probe\n"); + return -EPROBE_DEFER; + } + + bq = devm_kzalloc(&client->dev, sizeof(*bq), GFP_KERNEL); + + if (!bq) { + pr_err("Could not allocate memory\n"); + return -ENOMEM; + } + + bq->dev = &client->dev; + bq->client = client; + bq->chip = id->driver_data; + bq->usb_psy = usb_psy; + + bq->batt_soc = -ENODATA; + bq->batt_fcc = -ENODATA; + bq->batt_rm = -ENODATA; + bq->batt_dc = -ENODATA; + bq->batt_volt = -ENODATA; + bq->batt_temp = -ENODATA; + bq->batt_curr = -ENODATA; + bq->batt_cyclecnt = -ENODATA; + + bq->fake_soc = -EINVAL; + bq->fake_temp = -EINVAL; + + if (bq->chip == BQ27426) { + regs = bq27426_regs; + } else { + pr_err("unexpected fuel gauge: %d\n", bq->chip); + regs = bq27426_regs; + } + + memcpy(bq->regs, regs, NUM_REGS); + + i2c_set_clientdata(client, bq); + + mutex_init(&bq->i2c_rw_lock); + mutex_init(&bq->data_lock); + mutex_init(&bq->update_lock); + mutex_init(&bq->irq_complete); + + bq->resume_completed = true; + bq->irq_waiting = false; + + bq->vadc_dev = qpnp_get_vadc(bq->dev, "battid"); + if (IS_ERR(bq->vadc_dev)) { + ret = PTR_ERR(bq->vadc_dev); + if (ret == -EPROBE_DEFER) + pr_err("vadc not found - defer rc=%d\n", ret); + else + pr_err("vadc property missing, rc=%d\n", ret); + + return ret; + } + + bq->vcc_i2c = regulator_get(bq->dev, "vcc_i2c"); + if (IS_ERR(bq->vcc_i2c)) { + pr_err("Regulator get failed vdd rc=%d\n", rc); + + } + + if (regulator_count_voltages(bq->vcc_i2c) > 0) { + rc = regulator_set_voltage(bq->vcc_i2c, SMB_VTG_MIN_UV, + SMB_VTG_MAX_UV); + if (rc) { + pr_err("Regulator set_vtg failed vdd rc=%d\n", rc); + } + } + + rc = regulator_enable(bq->vcc_i2c); + if (rc) { + pr_err("Regulator vdd enable failed rc=%d\n", rc); + } + + ret = bq_batterydata_get_best_profile(bq); + if (ret < 0) { + dev_err(&client->dev, "Unable to parse DT nodes\n"); + } + INIT_WORK(&bq->update_work, fg_update_bqfs_workfunc); + + + INIT_WORK(&bq->fg_soc_work, fg_soc_work_fn); + alarm_init(&bq->fg_soc_alarm, ALARM_REALTIME, fg_soc_alarm_callback); + + fg_update_bqfs(bq); + + if (client->irq) { + ret = devm_request_threaded_irq(&client->dev, client->irq, NULL, + fg_irq_thread, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "bq fuel gauge irq", bq); + if (ret < 0) { + pr_err("request irq for irq=%d failed, ret = %d\n", client->irq, ret); + goto err_1; + } + enable_irq_wake(client->irq); + } + + device_init_wakeup(bq->dev, 1); + + bq->fw_ver = fg_read_fw_version(bq); + + fg_psy_register(bq); + + create_debugfs_entry(bq); + ret = sysfs_create_group(&bq->dev->kobj, &fg_attr_group); + if (ret) { + pr_err("Failed to register sysfs, err:%d\n", ret); + } + + determine_initial_status(bq); + bq->batt_soc = fg_read_rsoc(bq); + monitor_soc = bq->batt_soc; + + pr_info("bq fuel gauge probe successfully, %s FW ver:%d\n", + device2str[bq->chip], bq->fw_ver); + + return 0; + +err_1: + fg_psy_unregister(bq); + return ret; +} + + +static inline bool is_device_suspended(struct bq_fg_chip *bq) +{ + return !bq->resume_completed; +} + + +static int bq_fg_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + mutex_lock(&bq->irq_complete); + bq->resume_completed = false; + mutex_unlock(&bq->irq_complete); + + return 0; +} + +static int bq_fg_suspend_noirq(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + if (bq->irq_waiting) { + pr_err_ratelimited("Aborting suspend, an interrupt was detected while suspending\n"); + return -EBUSY; + } + return 0; + +} + + +static int bq_fg_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + mutex_lock(&bq->irq_complete); + bq->resume_completed = true; + if (bq->irq_waiting) { + bq->irq_disabled = false; + enable_irq(client->irq); + mutex_unlock(&bq->irq_complete); + fg_irq_thread(client->irq, bq); + } else { + mutex_unlock(&bq->irq_complete); + } + + power_supply_changed(&bq->fg_psy); + + return 0; + + +} + +static int bq_fg_remove(struct i2c_client *client) +{ + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + fg_psy_unregister(bq); + + mutex_destroy(&bq->data_lock); + mutex_destroy(&bq->i2c_rw_lock); + mutex_destroy(&bq->update_lock); + mutex_destroy(&bq->irq_complete); + + alarm_cancel(&bq->fg_soc_alarm); + + debugfs_remove_recursive(bq->debug_root); + sysfs_remove_group(&bq->dev->kobj, &fg_attr_group); + + return 0; + +} + +static void bq_fg_shutdown(struct i2c_client *client) +{ + pr_info("bq fuel gauge driver shutdown!\n"); +} + +static struct of_device_id bq_fg_match_table[] = { + {.compatible = "ti,bq27426",}, + {}, +}; +MODULE_DEVICE_TABLE(of, bq_fg_match_table); + +static const struct i2c_device_id bq_fg_id[] = { + { "bq27426", BQ27426 }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, bq_fg_id); + +static const struct dev_pm_ops bq_fg_pm_ops = { + .resume = bq_fg_resume, + .suspend_noirq = bq_fg_suspend_noirq, + .suspend = bq_fg_suspend, +}; + +static struct i2c_driver bq_fg_driver = { + .driver = { + .name = "bq_fg", + .owner = THIS_MODULE, + .of_match_table = bq_fg_match_table, + .pm = &bq_fg_pm_ops, + }, + .id_table = bq_fg_id, + + .probe = bq_fg_probe, + .remove = bq_fg_remove, + .shutdown = bq_fg_shutdown, + +}; + +module_i2c_driver(bq_fg_driver); + +MODULE_DESCRIPTION("TI BQ2742x Gauge Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Texas Instruments"); diff --git a/drivers/power/bq27426_gmfs.h b/drivers/power/bq27426_gmfs.h new file mode 100644 index 0000000000000..7b5a70f48697c --- /dev/null +++ b/drivers/power/bq27426_gmfs.h @@ -0,0 +1,946 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + +#ifndef __BQFS_FILE__ +#define __BQFS_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_image[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x62, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x69} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x69} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x79, 0x07, 0x9F, 0x23, 0x00, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x0E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x0E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x0A, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x59} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x59} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x77, 0x01, 0x2C, 0x02, 0x58, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x90} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x90} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x40, 0x00, 0x02, 0x00, 0x32, 0x81, 0x0C, 0x08, 0x2E, 0x52, 0x0C, 0x1C, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x14, 0x03, 0xE8, 0x01, 0x01, 0x00, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCE, 0x00, 0x01, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x15, 0x07, 0x11, 0x2C, 0xD3, 0xD7, 0xE0, 0xE0, 0xE3, 0xE3, 0xE6, 0xE5, 0xE5, 0xEA, 0xF4, 0xD3, 0xCA, 0xF3, 0xF3, 0xEB, 0xF0, 0xE2, 0xF0, 0xEE, 0xF2, 0xF2, 0xF7, 0xF9, 0xFA, 0xFA, 0xFC, 0xFE} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x08} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x08} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xF8, 0xF9, 0xF8, 0xF6, 0xEF, 0xF0, 0xF0, 0xFE, 0xFD, 0xE9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xED} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xED} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFB, 0x1D, 0x05, 0x09, 0x06, 0x03, 0x02, 0xFF, 0x00, 0xFC, 0xFF, 0xFD, 0xFF, 0xFA, 0x0E, 0x19, 0x02, 0x01, 0x02, 0xFB, 0xF5, 0xF5, 0x02, 0x01, 0x05, 0xFE, 0xFB, 0xFD, 0xFE, 0xFC, 0xF7, 0xFB} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE3} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE3} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFA, 0xFD, 0xFE, 0x03, 0xFA, 0x0B, 0xFE, 0x03, 0xB9, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xC7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xC7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0x4B, 0x01, 0x05, 0x02, 0x06, 0x06, 0xFF, 0x03, 0xFA, 0x01, 0xFD, 0xFA, 0x01, 0x1A, 0xE5, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x33} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x33} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0xE0, 0x00, 0x00, 0x28, 0x08, 0x42, 0xDF, 0xFE, 0xE5, 0xFB, 0xFD, 0xF8, 0xED, 0x0F, 0x09, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x0D, 0x00, 0x09, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x23, 0x00, 0x15, 0x00, 0x18, 0x00, 0x17, 0x00, 0x17, 0x00, 0x18, 0x00, 0x18, 0x00, 0x16, 0x00, 0x24, 0x00, 0x25, 0x00, 0x5B, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x63} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x63} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0E, 0xBB, 0x0E, 0xE3, 0x0E, 0x9C, 0x11, 0x30, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x00, 0x00, 0x00, 0xD4, 0x86, 0x4A, 0xC6, 0xB4, 0xC2, 0x6E, 0x2B, 0x03, 0x7C, 0x01, 0x48, 0xFD, 0xA3, 0xF6, 0x75, 0x12, 0x58, 0x2D, 0xB7, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xD4, 0x1A, 0x05} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x1C, 0x98, 0x02, 0xD3, 0xFF, 0xB9, 0x30, 0xEF, 0x05, 0x11, 0x05, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x3C, 0x00, 0x50, 0x3C, 0x00, 0x64, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x69, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0xFF, 0x0B, 0xD6, 0x7E, 0x74, 0x6D, 0xC6, 0x93, 0x0B, 0x0D, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x69, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6B, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xEF, 0x05, 0x11, 0x05, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x3C, 0x00, 0x50, 0x3C, 0x00, 0x64, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6B, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, +}; + +#endif diff --git a/drivers/power/bq27426_gmfs_atl.h b/drivers/power/bq27426_gmfs_atl.h new file mode 100644 index 0000000000000..afda7293698de --- /dev/null +++ b/drivers/power/bq27426_gmfs_atl.h @@ -0,0 +1,822 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + + +#ifndef __BQFS_ATL_FILE__ +#define __BQFS_ATL_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_atl[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x13, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 1100}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x63, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x71, 0x0F, 0x96, 0x20, 0x62, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xB8} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xB8} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x01, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x79, 0x00, 0xE8, 0x02, 0x5C, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x3D, 0xE7, 0x00, 0x00, 0x00, 0x01, 0x0B, 0xCC, 0x2D, 0x6B, 0x0D, 0x48, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x00, 0x7F, 0xFF, 0x01, 0x00, 0x73, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCE, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x86} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x86} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x16, 0x64, 0x11, 0x28, 0xDD, 0xDB, 0xDF, 0xE0, 0xDD, 0xDF, 0xE9, 0xE6, 0xDC, 0xE6, 0xE6, 0xE9, 0xE2, 0xE8, 0xED, 0xE6, 0xE3, 0xEE, 0xEC, 0xF2, 0xF1, 0xF5, 0xF8, 0xF8, 0xF8, 0xFA, 0xFB, 0xFC} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFD, 0xF6, 0xF5, 0xF1, 0xF2, 0xEE, 0xF6, 0xFE, 0xFC, 0xE8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFB, 0x1D, 0x04, 0x14, 0x29, 0x14, 0x0A, 0x2B, 0x1B, 0xC7, 0xE7, 0x4B, 0xF7, 0x08, 0xED, 0x21, 0x09, 0x07, 0x0E, 0xF8, 0xDD, 0xD4, 0xFD, 0x08, 0x03, 0xE9, 0xF9, 0xFA, 0xFA, 0xF1, 0xE9, 0xDE} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xE9, 0xFF, 0x06, 0x11, 0xFC, 0x0A, 0x00, 0x14, 0xC3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0x88, 0x01, 0x03, 0x03, 0xF4, 0x0B, 0xBF, 0x4F, 0xFE, 0x06, 0x00, 0xFA, 0xF7, 0x20, 0x82, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0xC9, 0x01, 0x04, 0x12, 0x21, 0xFB, 0xA3, 0x02, 0xDF, 0xF5, 0xFD, 0xE2, 0xED, 0xFD, 0x74, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x29, 0x00, 0x29, 0x00, 0x26, 0x00, 0x2A, 0x00, 0x23, 0x00, 0x19, 0x00, 0x19, 0x00, 0x17, 0x00, 0x15, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x18, 0x00, 0x51, 0x00, 0xB3, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x88} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x88} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0B, 0x9B, 0x0E, 0xE6, 0x0E, 0xA7, 0x11, 0x2A, 0x10, 0xEA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x00, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x42, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 2000}, + }, +}; + +#endif + + diff --git a/drivers/power/bq27426_gmfs_default.h b/drivers/power/bq27426_gmfs_default.h new file mode 100644 index 0000000000000..a902e55f02819 --- /dev/null +++ b/drivers/power/bq27426_gmfs_default.h @@ -0,0 +1,946 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + +#ifndef __BQFS_DEFAULT_FILE__ +#define __BQFS_DEFAULT_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_default[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x62, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x69} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x69} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x79, 0x07, 0x9F, 0x23, 0x00, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x0E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x0E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x0A, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x59} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x59} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x77, 0x01, 0x2C, 0x02, 0x58, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x90} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x90} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x40, 0x00, 0x02, 0x00, 0x32, 0x81, 0x0C, 0x08, 0x2E, 0x52, 0x0C, 0x1C, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x14, 0x03, 0xE8, 0x01, 0x01, 0x00, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCE, 0x00, 0x01, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x15, 0x07, 0x11, 0x2C, 0xD3, 0xD7, 0xE0, 0xE0, 0xE3, 0xE3, 0xE6, 0xE5, 0xE5, 0xEA, 0xF4, 0xD3, 0xCA, 0xF3, 0xF3, 0xEB, 0xF0, 0xE2, 0xF0, 0xEE, 0xF2, 0xF2, 0xF7, 0xF9, 0xFA, 0xFA, 0xFC, 0xFE} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x08} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x08} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xF8, 0xF9, 0xF8, 0xF6, 0xEF, 0xF0, 0xF0, 0xFE, 0xFD, 0xE9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xED} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xED} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFB, 0x1D, 0x05, 0x09, 0x06, 0x03, 0x02, 0xFF, 0x00, 0xFC, 0xFF, 0xFD, 0xFF, 0xFA, 0x0E, 0x19, 0x02, 0x01, 0x02, 0xFB, 0xF5, 0xF5, 0x02, 0x01, 0x05, 0xFE, 0xFB, 0xFD, 0xFE, 0xFC, 0xF7, 0xFB} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE3} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE3} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFA, 0xFD, 0xFE, 0x03, 0xFA, 0x0B, 0xFE, 0x03, 0xB9, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xC7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xC7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0x4B, 0x01, 0x05, 0x02, 0x06, 0x06, 0xFF, 0x03, 0xFA, 0x01, 0xFD, 0xFA, 0x01, 0x1A, 0xE5, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x33} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x33} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0xE0, 0x00, 0x00, 0x28, 0x08, 0x42, 0xDF, 0xFE, 0xE5, 0xFB, 0xFD, 0xF8, 0xED, 0x0F, 0x09, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x0D, 0x00, 0x09, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x23, 0x00, 0x15, 0x00, 0x18, 0x00, 0x17, 0x00, 0x17, 0x00, 0x18, 0x00, 0x18, 0x00, 0x16, 0x00, 0x24, 0x00, 0x25, 0x00, 0x5B, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x63} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x63} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0E, 0xBB, 0x0E, 0xE3, 0x0E, 0x9C, 0x11, 0x30, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x00, 0x00, 0x00, 0xD4, 0x86, 0x4A, 0xC6, 0xB4, 0xC2, 0x6E, 0x2B, 0x03, 0x7C, 0x01, 0x48, 0xFD, 0xA3, 0xF6, 0x75, 0x12, 0x58, 0x2D, 0xB7, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xD4, 0x1A, 0x05} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x1C, 0x98, 0x02, 0xD3, 0xFF, 0xB9, 0x30, 0xEF, 0x05, 0x11, 0x05, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x3C, 0x00, 0x50, 0x3C, 0x00, 0x64, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x69, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0xFF, 0x0B, 0xD6, 0x7E, 0x74, 0x6D, 0xC6, 0x93, 0x0B, 0x0D, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x69, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6B, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xEF, 0x05, 0x11, 0x05, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x3C, 0x00, 0x50, 0x3C, 0x00, 0x64, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6B, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, +}; + +#endif diff --git a/drivers/power/bq27426_gmfs_desay.h b/drivers/power/bq27426_gmfs_desay.h new file mode 100644 index 0000000000000..eeb676acfa9d2 --- /dev/null +++ b/drivers/power/bq27426_gmfs_desay.h @@ -0,0 +1,822 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + + +#ifndef __BQFS_DESAI_FILE__ +#define __BQFS_DESAI_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_desay[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x13, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 1100}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x63, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x68} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x68} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x79, 0x0F, 0x86, 0x20, 0x21, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x01} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x01} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x04, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4D} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4D} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x79, 0x00, 0xE8, 0x02, 0x5C, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x41, 0xF3, 0x00, 0x00, 0x00, 0x01, 0x0B, 0xCC, 0x2D, 0x6B, 0x0D, 0x16, 0x00, 0x96, 0x00, 0x32, 0x00, 0x14, 0x03, 0xE8, 0x01, 0x00, 0x78, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCD, 0x00, 0x02, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x53} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x53} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x16, 0x86, 0x11, 0x35, 0xD4, 0xD2, 0xDF, 0xE0, 0xE6, 0xE5, 0xDD, 0xE8, 0xEA, 0xEB, 0xEC, 0xCD, 0xCB, 0xF3, 0xF4, 0xE9, 0xF0, 0xE3, 0xF2, 0xED, 0xF2, 0xF4, 0xF8, 0xF8, 0xFA, 0xF9, 0xFC, 0xFD} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x8B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x8B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xF7, 0xF8, 0xFB, 0xF6, 0xEF, 0xF1, 0xF1, 0xFB, 0xFF, 0xDD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xF8, 0x52, 0x04, 0x39, 0x55, 0x0C, 0x05, 0xE4, 0xEF, 0x32, 0xE4, 0xC8, 0xF5, 0x1B, 0x54, 0x66, 0x01, 0xED, 0xEE, 0xD4, 0xE9, 0xD8, 0x10, 0x09, 0xFE, 0xF4, 0xF7, 0xF3, 0xFC, 0xEA, 0xDD, 0xEE} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x80} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x80} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xEB, 0xEC, 0xE7, 0x22, 0xD3, 0x39, 0x07, 0xD7, 0xDB, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xD9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xD9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0x43, 0x01, 0x07, 0x01, 0x09, 0x08, 0x00, 0x03, 0xF9, 0x02, 0xFB, 0x01, 0x00, 0x00, 0x02, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x30} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x30} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0x9F, 0x00, 0x08, 0x2B, 0x3D, 0x05, 0xC7, 0xF7, 0xC6, 0xF9, 0x01, 0x1C, 0xCC, 0xEA, 0x0E, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x72} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x72} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x31, 0x00, 0x31, 0x00, 0x32, 0x00, 0x34, 0x00, 0x35, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x2D, 0x00, 0x30, 0x00, 0x30, 0x00, 0x35, 0x00, 0x45, 0x00, 0x64, 0x00, 0xA5, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x70} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x70} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0B, 0xFD, 0x0E, 0xE4, 0x0E, 0xAF, 0x11, 0x29, 0x10, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x32} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x32} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x00, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x42, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 2000}, + }, +}; + +#endif + + diff --git a/drivers/power/bq27426_gmfs_scud.h b/drivers/power/bq27426_gmfs_scud.h new file mode 100644 index 0000000000000..f587f38a5b7b7 --- /dev/null +++ b/drivers/power/bq27426_gmfs_scud.h @@ -0,0 +1,822 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + + +#ifndef __BQFS_FEIMAOTUI_FILE__ +#define __BQFS_FEIMAOTUI_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_scud[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x13, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 1100}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x63, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x71, 0x0F, 0x96, 0x20, 0x62, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xB8} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xB8} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x01, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x79, 0x00, 0xE8, 0x02, 0x5C, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x3D, 0xE7, 0x00, 0x00, 0x00, 0x01, 0x0B, 0xCC, 0x2D, 0x6B, 0x0D, 0x48, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x00, 0x7F, 0xFF, 0x01, 0x00, 0x73, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCE, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x86} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x86} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x16, 0x64, 0x11, 0x28, 0xDD, 0xDB, 0xDF, 0xE0, 0xDD, 0xDF, 0xE9, 0xE6, 0xDC, 0xE6, 0xE6, 0xE9, 0xE2, 0xE8, 0xED, 0xE6, 0xE3, 0xEE, 0xEC, 0xF2, 0xF1, 0xF5, 0xF8, 0xF8, 0xF8, 0xFA, 0xFB, 0xFC} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFD, 0xF6, 0xF5, 0xF1, 0xF2, 0xEE, 0xF6, 0xFE, 0xFC, 0xE8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFB, 0x1D, 0x04, 0x14, 0x29, 0x14, 0x0A, 0x2B, 0x1B, 0xC7, 0xE7, 0x4B, 0xF7, 0x08, 0xED, 0x21, 0x09, 0x07, 0x0E, 0xF8, 0xDD, 0xD4, 0xFD, 0x08, 0x03, 0xE9, 0xF9, 0xFA, 0xFA, 0xF1, 0xE9, 0xDE} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xE9, 0xFF, 0x06, 0x11, 0xFC, 0x0A, 0x00, 0x14, 0xC3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0x88, 0x01, 0x03, 0x03, 0xF4, 0x0B, 0xBF, 0x4F, 0xFE, 0x06, 0x00, 0xFA, 0xF7, 0x20, 0x82, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0xC9, 0x01, 0x04, 0x12, 0x21, 0xFB, 0xA3, 0x02, 0xDF, 0xF5, 0xFD, 0xE2, 0xED, 0xFD, 0x74, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x29, 0x00, 0x29, 0x00, 0x26, 0x00, 0x2A, 0x00, 0x23, 0x00, 0x19, 0x00, 0x19, 0x00, 0x17, 0x00, 0x15, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x18, 0x00, 0x51, 0x00, 0xB3, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x88} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x88} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0B, 0x9B, 0x0E, 0xE6, 0x0E, 0xA7, 0x11, 0x2A, 0x10, 0xEA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x00, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x42, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 2000}, + }, +}; + +#endif + + diff --git a/drivers/power/bq27426_gmfs_sunwoda.h b/drivers/power/bq27426_gmfs_sunwoda.h new file mode 100644 index 0000000000000..d172381cb2dc8 --- /dev/null +++ b/drivers/power/bq27426_gmfs_sunwoda.h @@ -0,0 +1,822 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + + +#ifndef __BQFS_XINGWANGDA_FILE__ +#define __BQFS_XINGWANGDA_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_sunwoda[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x13, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 1100}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x63, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x79, 0x0F, 0x96, 0x20, 0x3D, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xD5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xD5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x01, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x79, 0x00, 0xE8, 0x02, 0x5C, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x40, 0x61, 0x00, 0x00, 0x1E, 0x01, 0x0B, 0xCC, 0x2D, 0x6B, 0x0C, 0xE4, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x00, 0x7F, 0xFF, 0x01, 0x00, 0x79, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCE, 0x00, 0x01, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x49} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x49} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x16, 0x33, 0x11, 0x2B, 0xDD, 0xDE, 0xE0, 0xE1, 0xE2, 0xE2, 0xE4, 0xE4, 0xE3, 0xE5, 0xE9, 0xE3, 0xD7, 0xE7, 0xED, 0xEA, 0xE8, 0xEB, 0xEA, 0xF0, 0xF2, 0xF5, 0xF5, 0xF8, 0xF9, 0xFB, 0xF9, 0xFD} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFB, 0xF6, 0xF7, 0xF6, 0xF2, 0xEF, 0xF4, 0xFA, 0xDA, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x78} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x78} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xF9, 0xD9, 0x05, 0x10, 0x0B, 0x03, 0xFF, 0xFD, 0xFF, 0xFC, 0xFD, 0x04, 0x01, 0xF9, 0x06, 0x2C, 0x07, 0x0B, 0xF7, 0xE9, 0xF4, 0x05, 0x03, 0x02, 0xFF, 0x02, 0xFD, 0xFA, 0xF8, 0x01, 0xEA, 0xF2} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x29} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x29} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFC, 0xF7, 0xF8, 0x05, 0x06, 0x03, 0x0D, 0xC9, 0x12, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x9D} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x9D} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0xA9, 0x00, 0x03, 0x05, 0x01, 0xFC, 0x07, 0x08, 0xF4, 0xFE, 0xF9, 0xF7, 0x01, 0x02, 0x36, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0x94, 0x00, 0xED, 0x1A, 0x23, 0x05, 0xD9, 0xFF, 0xF0, 0x03, 0x07, 0xFD, 0x19, 0x33, 0x13, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x07} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x07} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x2D, 0x00, 0x26, 0x00, 0x28, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x26, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2A, 0x00, 0x2B, 0x00, 0x2B, 0x00, 0x31, 0x00, 0x3A, 0x00, 0x3C, 0x00, 0x4F, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x39} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x39} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0C, 0x99, 0x0E, 0xE3, 0x0E, 0xAD, 0x11, 0x0D, 0x10, 0xEA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x96} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x96} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x00, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x42, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 2000}, + }, +}; + +#endif + + diff --git a/drivers/power/bqfs_cmd_type.h b/drivers/power/bqfs_cmd_type.h new file mode 100644 index 0000000000000..311779ec6b5ce --- /dev/null +++ b/drivers/power/bqfs_cmd_type.h @@ -0,0 +1,42 @@ + + +#ifndef __BQFS_CMD_TYPE__ +#define __BQFS_CMD_TYPE__ + + +#define CMD_MAX_DATA_SIZE 110 +#define RETRY_LIMIT 3 +#define CMD_RETRY_DELAY 100 /* in ms */ + +#ifdef __GNUC__ +#define __PACKED __attribute__((packed)) +#else +#error "Make sure structure cmd_t is packed" +#endif + +typedef enum { + CMD_INVALID = 0, + CMD_R, /* Read */ + CMD_W, /* Write */ + CMD_C, /* Compare */ + CMD_X, /* Delay */ +} cmd_type_t; + +/* + * DO NOT change the order of fields - particularly reg + * should be immediately followed by data + */ +typedef struct { + cmd_type_t cmd_type; + u8 addr; + u8 reg; + union { + u8 bytes[CMD_MAX_DATA_SIZE + 1]; + u16 delay; + } data; + u8 data_len; + u16 line_num; +} __PACKED bqfs_cmd_t; + + +#endif diff --git a/drivers/power/cw2015_battery.c b/drivers/power/cw2015_battery.c new file mode 100644 index 0000000000000..06cba04f01b48 --- /dev/null +++ b/drivers/power/cw2015_battery.c @@ -0,0 +1,1300 @@ +/* + * Gas_Gauge driver for CW2015/2013 + * Copyright (C) 2012, CellWise + * Copyright (C) 2018 XiaoMi, Inc. + * + * Authors: ChenGang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation.And this driver depends on + * I2C and uses IIC bus for communication with the host. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +#define REG_VERSION 0x0 +#define REG_VCELL 0x2 +#define REG_SOC 0x4 +#define REG_RRT_ALERT 0x6 +#define REG_CONFIG 0x8 +#define REG_MODE 0xA +#define REG_BATINFO 0x10 + +#define MODE_SLEEP_MASK (0x3<<6) +#define MODE_SLEEP (0x3<<6) +#define MODE_NORMAL (0x0<<6) +#define MODE_QUICK_START (0x3<<4) +#define MODE_RESTART (0xf<<0) + +#define CONFIG_UPDATE_FLG (0x1<<1) +#define ATHD (0x0<<3) + + +#define BATTERY_UP_MAX_CHANGE 420 +#define BATTERY_DOWN_CHANGE 60 +#define BATTERY_DOWN_MIN_CHANGE_RUN 30 +#define BATTERY_DOWN_MIN_CHANGE_SLEEP 1800 +#define BATTERY_DOWN_MAX_CHANGE_RUN_AC_ONLINE 1800 + + + +#define BAT_LOW_INTERRUPT 0 +#define INVALID_GPIO (-1) +#define GPIO_LOW 0 +#define GPIO_HIGH 1 +#define USB_CHARGER_MODE 1 +#define AC_CHARGER_MODE 2 +int cw_capacity; + +struct cw_battery { + struct i2c_client *client; + struct workqueue_struct *battery_workqueue; + struct delayed_work battery_delay_work; + + struct delayed_work bat_low_wakeup_work; + const struct cw_bat_platform_data *plat_data; + struct power_supply rk_bat; + struct power_supply *batt_psy; + + + + long sleep_time_capacity_change; + long run_time_capacity_change; + + long sleep_time_charge_start; + long run_time_charge_start; + + int charger_mode; + int charger_init_mode; + int capacity; + int voltage; + int status; + int time_to_empty; + int alt; + + int bat_change; + struct regulator *vcc_i2c; + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + struct pinctrl_state *pinctrl_state_release; +}; + + +static u8 config_info[SIZE_BATINFO] = { + #include "profile_WT801_88509_NT_XinWangDa.h" +}; +static u8 config_info_xinwangda[SIZE_BATINFO] = { + #include "profile_WT801_88509_NT_XinWangDa.h" +}; +static u8 config_info_feimaotui[SIZE_BATINFO] = { + #include "profile_WT1001_88509_NT_Feimaotui.h" +}; + + + + +/* write data to address */ +static int cw_i2c_write( + struct i2c_client *client, + u8 addr, + u8 *pdata, + unsigned int datalen) +{ + int ret = 0; + u8 tmp_buf[128]; + unsigned int bytelen = 0; + + if (datalen > 125) { + pr_debug("%s too big datalen = %d!\n", __func__, datalen); + return -EPERM; + } + + tmp_buf[0] = addr; + bytelen++; + + if (datalen != 0 && pdata != NULL) { + memcpy(&tmp_buf[bytelen], pdata, datalen); + bytelen += datalen; + } + ret = i2c_master_send(client, tmp_buf, bytelen); + return ret; +} + +/* read data from addr */ +static int cw_i2c_read( + struct i2c_client *client, + u8 addr, + u8 *pdata, + unsigned int datalen) +{ + int ret = 0; + if (datalen > 126) { + pr_debug("%s too big datalen = %d!\n", __func__, datalen); + return -EPERM; + } + + /* set data address */ + ret = cw_i2c_write(client, addr, NULL, 0); + if (ret < 0) { + pr_debug("%s set data address fail!, ret is %d\n", __func__, ret); + return ret; + } + /* read data */ + return i2c_master_recv(client, pdata, datalen); +} + +static int cw_update_config_info(struct cw_battery *cw_bat) +{ + int ret; + u8 reg_val; + int i; + u8 reset_val; + + pr_debug("func: %s-------\n", __func__); + + /* make sure no in sleep mode */ + ret = cw_i2c_read(cw_bat->client, REG_MODE, ®_val, 1); + if (ret < 0) + return ret; + + reset_val = reg_val; + if ((reg_val & MODE_SLEEP_MASK) == MODE_SLEEP) { + dev_err(&cw_bat->client->dev, "Error, device in sleep mode, cannot update battery info\n"); + return -EPERM; + } + + /* update new battery info */ + for (i = 0; i < SIZE_BATINFO; i++) { + pr_debug("cw_bat->plat_data->cw_bat_config_info[%d] = 0x%x\n", i, \ + cw_bat->plat_data->cw_bat_config_info[i]); + ret = cw_i2c_write(cw_bat->client, REG_BATINFO + i, &cw_bat->plat_data->cw_bat_config_info[i], 1); + + if (ret < 0) + return ret; + } + + /* readback & check */ + for (i = 0; i < SIZE_BATINFO; i++) { + ret = cw_i2c_read(cw_bat->client, REG_BATINFO + i, ®_val, 1); + if (reg_val != cw_bat->plat_data->cw_bat_config_info[i]) + return -EPERM; + } + + /* set cw2015/cw2013 to use new battery info */ + ret = cw_i2c_read(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + + reg_val |= CONFIG_UPDATE_FLG; /* set UPDATE_FLAG */ + reg_val &= 0x07; /* clear ATHD */ + reg_val |= ATHD; /* set ATHD */ + ret = cw_i2c_write(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + + /* check 2015/cw2013 for ATHD & update_flag */ + ret = cw_i2c_read(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + + if (!(reg_val & CONFIG_UPDATE_FLG)) { + + pr_debug("update flag for new battery info have not set..\n"); + reg_val = MODE_SLEEP; + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + pr_debug("report battery capacity error"); + return -EPERM; + + } + + if ((reg_val & 0xf8) != ATHD) { + pr_debug("the new ATHD have not set..\n"); + } + + /* reset */ + reset_val &= ~(MODE_RESTART); + reg_val = reset_val | MODE_RESTART; + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + if (ret < 0) + return ret; + + msleep(10); + ret = cw_i2c_write(cw_bat->client, REG_MODE, &reset_val, 1); + if (ret < 0) + return ret; + + return 0; +} + +static int cw_check_ic(struct cw_battery *cw_bat) +{ + int ret = 1 ; + u8 reg_val = 0; + + ret = cw_i2c_read(cw_bat->client, REG_MODE/*REG_VERSION*/, ®_val, 1); + + if (ret < 0) { + if (ret == -107) { + return -107; + } else { + return ret; + } + } + if ((reg_val == 0xC0) || (reg_val == 0x00)) { + ret = 0; + } + + return ret; +} + +static int cw_init(struct cw_battery *cw_bat) +{ + int ret; + int i; + u8 reg_val = MODE_SLEEP; + if ((reg_val & MODE_SLEEP_MASK) == MODE_SLEEP) { + reg_val = MODE_NORMAL; + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + if (ret < 0) + return ret; + } + + ret = cw_i2c_read(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + + if ((reg_val & 0xf8) != ATHD) { + pr_debug("the new ATHD have not set\n"); + reg_val &= 0x07; /* clear ATHD */ + reg_val |= ATHD; /* set ATHD */ + ret = cw_i2c_write(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + } + + ret = cw_i2c_read(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + + if (!(reg_val & CONFIG_UPDATE_FLG)) { + pr_debug("update flag for new battery info have not set\n"); + ret = cw_update_config_info(cw_bat); + if (ret < 0) + return ret; + } else { + for (i = 0; i < SIZE_BATINFO; i++) { + ret = cw_i2c_read(cw_bat->client, (REG_BATINFO + i), ®_val, 1); + if (ret < 0) + return ret; + + if (cw_bat->plat_data->cw_bat_config_info[i] != reg_val) + break; + } + + if (i != SIZE_BATINFO) { + pr_debug("update flag for new battery info have not set\n"); + ret = cw_update_config_info(cw_bat); + if (ret < 0) + return ret; + } + } + + for (i = 0; i < 30; i++) { + msleep(100); + ret = cw_i2c_read(cw_bat->client, REG_SOC, ®_val, 1); + if (ret < 0) + return ret; + else if (reg_val <= 0x64) + break; + + if (i > 25) + dev_err(&cw_bat->client->dev, "cw2015/cw2013 input unvalid power error\n"); + + } + if (i >= 30) { + reg_val = MODE_SLEEP; + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + pr_debug("report battery capacity error"); + return -EPERM; + } + return 0; +} + +static void cw_update_time_member_charge_start(struct cw_battery *cw_bat) +{ + struct timespec ts; + int new_run_time; + int new_sleep_time; + + ktime_get_ts(&ts); + new_run_time = ts.tv_sec; + + get_monotonic_boottime(&ts); + new_sleep_time = ts.tv_sec - new_run_time; + + cw_bat->run_time_charge_start = new_run_time; + cw_bat->sleep_time_charge_start = new_sleep_time; +} + +static void cw_update_time_member_capacity_change(struct cw_battery *cw_bat) +{ + struct timespec ts; + int new_run_time; + int new_sleep_time; + + ktime_get_ts(&ts); + new_run_time = ts.tv_sec; + + get_monotonic_boottime(&ts); + new_sleep_time = ts.tv_sec - new_run_time; + + cw_bat->run_time_capacity_change = new_run_time; + cw_bat->sleep_time_capacity_change = new_sleep_time; +} + +static int cw_quickstart(struct cw_battery *cw_bat) +{ + int ret = 0; + u8 reg_val = MODE_QUICK_START; + + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + if (ret < 0) { + dev_err(&cw_bat->client->dev, "Error quick start1\n"); + return ret; + } + + reg_val = MODE_NORMAL; + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + if (ret < 0) { + dev_err(&cw_bat->client->dev, "Error quick start2\n"); + return ret; + } + return 1; +} + +static int cw_get_capacity(struct cw_battery *cw_bat) +{ + + int ret; + u8 reg_val[2]; + + struct timespec ts; + long new_run_time; + long new_sleep_time; + long capacity_or_aconline_time; + int allow_change; + int allow_capacity; + static int if_quickstart; + static int jump_flag; + static int jump_flag2; + static int reset_loop; + int charge_time; + u8 reset_val; + + + + + ret = cw_i2c_read(cw_bat->client, REG_SOC, reg_val, 2); + if (ret < 0) + return ret; + + cw_capacity = reg_val[0]; + if ((cw_capacity < 0) || (cw_capacity > 100)) { + dev_err(&cw_bat->client->dev, "get cw_capacity error; cw_capacity = %d\n", cw_capacity); + reset_loop++; + + if (reset_loop > 5) { + reset_val = MODE_SLEEP; + ret = cw_i2c_write(cw_bat->client, REG_MODE, &reset_val, 1); + if (ret < 0) + return ret; + reset_val = MODE_NORMAL; + msleep(10); + ret = cw_i2c_write(cw_bat->client, REG_MODE, &reset_val, 1); + if (ret < 0) + return ret; + pr_debug("report battery capacity error"); + ret = cw_update_config_info(cw_bat); + if (ret) + return ret; + reset_loop = 0; + } + return cw_capacity; + } else { + reset_loop = 0; + } + + if (cw_capacity == 0) + pr_debug("the cw201x capacity is 0 !!!!!!!, funciton: %s, line: %d\n", __func__, __LINE__); + else + pr_debug("the cw201x capacity is %d, funciton: %s\n", cw_capacity, __func__); + + + + ktime_get_ts(&ts); + new_run_time = ts.tv_sec; + + get_monotonic_boottime(&ts); + new_sleep_time = ts.tv_sec - new_run_time; + + if (((cw_bat->charger_mode > 0) && (cw_capacity <= (cw_bat->capacity - 1)) && (cw_capacity > (cw_bat->capacity - 30/*9*/))) + || ((cw_bat->charger_mode == 0) && (cw_capacity == (cw_bat->capacity + 1)))) { + + if (!(cw_capacity == 0 && cw_bat->capacity <= 2)) { + cw_capacity = cw_bat->capacity; + } + } + + if ((cw_bat->charger_mode > 0) && (cw_capacity >= 95) && (cw_capacity <= cw_bat->capacity)) { + + capacity_or_aconline_time = (cw_bat->sleep_time_capacity_change > cw_bat->sleep_time_charge_start) ? cw_bat->sleep_time_capacity_change : cw_bat->sleep_time_charge_start; + capacity_or_aconline_time += (cw_bat->run_time_capacity_change > cw_bat->run_time_charge_start) ? cw_bat->run_time_capacity_change : cw_bat->run_time_charge_start; + allow_change = (new_sleep_time + new_run_time - capacity_or_aconline_time) / BATTERY_UP_MAX_CHANGE; + if (allow_change > 0) { + allow_capacity = cw_bat->capacity + allow_change; + cw_capacity = (allow_capacity <= 100) ? allow_capacity : 100; + jump_flag = 1; + } else if (cw_capacity <= cw_bat->capacity) { + cw_capacity = cw_bat->capacity; + } + + } else if ((cw_bat->charger_mode == 0) && cw_bat->capacity == 100 && cw_capacity < cw_bat->capacity && jump_flag2 == 0) { + cw_capacity = cw_bat->capacity; + jump_flag2 = 1; + } else if ((cw_bat->charger_mode == 0) && (cw_capacity <= cw_bat->capacity) && (cw_capacity >= 90) && ((jump_flag == 1) || (jump_flag2 == 1))) { + capacity_or_aconline_time = (cw_bat->sleep_time_capacity_change > cw_bat->sleep_time_charge_start) ? cw_bat->sleep_time_capacity_change : cw_bat->sleep_time_charge_start; + capacity_or_aconline_time += (cw_bat->run_time_capacity_change > cw_bat->run_time_charge_start) ? cw_bat->run_time_capacity_change : cw_bat->run_time_charge_start; + allow_change = (new_sleep_time + new_run_time - capacity_or_aconline_time) / BATTERY_DOWN_CHANGE; + if (allow_change > 0) { + allow_capacity = cw_bat->capacity - allow_change; + if (cw_capacity >= allow_capacity) { + jump_flag = 0; + jump_flag2 = 0; + } else{ + cw_capacity = (allow_capacity <= 100) ? allow_capacity : 100; + } + } else if (cw_capacity <= cw_bat->capacity) { + cw_capacity = cw_bat->capacity; + } + } + + if ((cw_capacity == 0) && (cw_bat->capacity > 1)) { + allow_change = ((new_run_time - cw_bat->run_time_capacity_change) / BATTERY_DOWN_MIN_CHANGE_RUN); + allow_change += ((new_sleep_time - cw_bat->sleep_time_capacity_change) / BATTERY_DOWN_MIN_CHANGE_SLEEP); + + allow_capacity = cw_bat->capacity - allow_change; + cw_capacity = (allow_capacity >= cw_capacity) ? allow_capacity : cw_capacity; + pr_debug("report GGIC POR happened"); + reg_val[0] = MODE_NORMAL; + ret = cw_i2c_write(cw_bat->client, REG_MODE, reg_val, 1); + if (ret < 0) + return ret; + pr_debug("report battery capacity jump 0 "); + } + +#if 1 + if ((cw_bat->charger_mode > 0) && (cw_capacity == 0)) { + charge_time = new_sleep_time + new_run_time - cw_bat->sleep_time_charge_start - cw_bat->run_time_charge_start; + if ((charge_time > BATTERY_DOWN_MAX_CHANGE_RUN_AC_ONLINE) && (if_quickstart == 0)) { + cw_quickstart(cw_bat); + reset_val = MODE_SLEEP; + ret = cw_i2c_write(cw_bat->client, REG_MODE, &reset_val, 1); + if (ret < 0) + return ret; + reset_val = MODE_NORMAL; + msleep(10); + ret = cw_i2c_write(cw_bat->client, REG_MODE, &reset_val, 1); + if (ret < 0) + return ret; + pr_debug("report battery capacity error"); + ret = cw_update_config_info(cw_bat); + if (ret) + return ret; + pr_debug("report battery capacity still 0 if in changing"); + if_quickstart = 1; + } + } else if ((if_quickstart == 1) && (cw_bat->charger_mode == 0)) { + if_quickstart = 0; + } + +#endif + +#ifdef SYSTEM_SHUTDOWN_VOLTAGE + if ((cw_bat->charger_mode == 0) && (cw_capacity <= 20) && (cw_bat->voltage <= SYSTEM_SHUTDOWN_VOLTAGE)) { + if (if_quickstart == 10) { + + allow_change = ((new_run_time - cw_bat->run_time_capacity_change) / BATTERY_DOWN_MIN_CHANGE_RUN); + allow_change += ((new_sleep_time - cw_bat->sleep_time_capacity_change) / BATTERY_DOWN_MIN_CHANGE_SLEEP); + + allow_capacity = cw_bat->capacity - allow_change; + cw_capacity = (allow_capacity >= 0) ? allow_capacity : 0; + + if (cw_capacity < 1) { + cw_quickstart(cw_bat); + if_quickstart = 12; + cw_capacity = 0; + } + } else if (if_quickstart <= 10) + if_quickstart = if_quickstart+2; + pr_debug("the cw201x voltage is less than SYSTEM_SHUTDOWN_VOLTAGE !!!!!!!, funciton: %s, line: %d\n", __func__, __LINE__); + } else if ((cw_bat->charger_mode > 0) && (if_quickstart <= 12)) { + if_quickstart = 0; + } +#endif + return cw_capacity; +} + +static int cw_get_vol(struct cw_battery *cw_bat) +{ + int ret; + u8 reg_val[2]; + u16 value16, value16_1, value16_2, value16_3; + int voltage; + + ret = cw_i2c_read(cw_bat->client, REG_VCELL, reg_val, 2); + if (ret < 0) + return ret; + value16 = (reg_val[0] * 256) + reg_val[1]; + + ret = cw_i2c_read(cw_bat->client, REG_VCELL, reg_val, 2); + if (ret < 0) + return ret; + value16_1 = (reg_val[0] << 8) + reg_val[1]; + + ret = cw_i2c_read(cw_bat->client, REG_VCELL, reg_val, 2); + if (ret < 0) + return ret; + value16_2 = (reg_val[0] << 8) + reg_val[1]; + + + if (value16 > value16_1) { + value16_3 = value16; + value16 = value16_1; + value16_1 = value16_3; + } + + if (value16_1 > value16_2) { + value16_3 = value16_1; + value16_1 = value16_2; + value16_2 = value16_3; + } + + if (value16 > value16_1) { + value16_3 = value16; + value16 = value16_1; + value16_1 = value16_3; + } + + voltage = value16_1 * 312 / 1024; + voltage = voltage * 1000; + + pr_debug("get cw_voltage : cw_voltage = %d\n", voltage); + + return voltage; +} + +#ifdef BAT_LOW_INTERRUPT +static int cw_get_alt(struct cw_battery *cw_bat) +{ + int ret = 0; + u8 reg_val; + u8 value8 = 0; + int alrt; + + ret = cw_i2c_read(cw_bat->client, REG_RRT_ALERT, ®_val, 1); + if (ret < 0) + return ret; + value8 = reg_val; + alrt = value8 >> 7; + + + value8 = value8&0x7f; + reg_val = value8; + ret = cw_i2c_write(cw_bat->client, REG_RRT_ALERT, ®_val, 1); + if (ret < 0) { + dev_err(&cw_bat->client->dev, "Error clear ALRT\n"); + return ret; + } + return alrt; +} +#endif + +static int cw_get_time_to_empty(struct cw_battery *cw_bat) +{ + int ret; + u8 reg_val; + u16 value16; + + ret = cw_i2c_read(cw_bat->client, REG_RRT_ALERT, ®_val, 1); + if (ret < 0) + return ret; + + value16 = reg_val; + + ret = cw_i2c_read(cw_bat->client, REG_RRT_ALERT + 1, ®_val, 1); + if (ret < 0) + return ret; + + value16 = ((value16 << 8) + reg_val) & 0x1fff; + return value16; +} + +static void rk_bat_update_capacity(struct cw_battery *cw_bat) +{ + + + cw_capacity = cw_get_capacity(cw_bat); + if ((cw_capacity >= 0) && (cw_capacity <= 100) && (cw_bat->capacity != cw_capacity)) { + cw_bat->capacity = cw_capacity; + cw_bat->bat_change = 1; + cw_update_time_member_capacity_change(cw_bat); + + if (cw_bat->capacity == 0) + pr_debug("report battery capacity 0 and will shutdown if no changing"); + } +} + + +static void rk_bat_update_vol(struct cw_battery *cw_bat) +{ + int ret; + ret = cw_get_vol(cw_bat); + if ((ret >= 0) && (cw_bat->voltage != ret)) { + cw_bat->voltage = ret; + cw_bat->bat_change = 1; + } +} + + + +extern int power_supply_get_battery_charge_state(struct power_supply *psy); +static struct power_supply *charge_psy; +static u8 is_charger_plug; + + +static void rk_bat_update_status(struct cw_battery *cw_bat) +{ + int status; + union power_supply_propval ret = {0,}; + + + + + if (!charge_psy) { + charge_psy = power_supply_get_by_name("usb"); + } else{ + is_charger_plug = (u8)power_supply_get_battery_charge_state(charge_psy); + } + + pr_debug("Chaman for test is_charger_plug %d\n", is_charger_plug); + if (is_charger_plug == 0) + cw_bat->charger_mode = POWER_SUPPLY_TYPE_UNKNOWN; + else + cw_bat->charger_mode = USB_CHARGER_MODE; + + if (cw_bat->batt_psy == NULL) + cw_bat->batt_psy = power_supply_get_by_name("battery"); + if (cw_bat->batt_psy) { + /* if battery has been registered, use the status property */ + cw_bat->batt_psy->get_property(cw_bat->batt_psy, + POWER_SUPPLY_PROP_STATUS, &ret); + status = ret.intval; + } else{ + /* Default to false if the battery power supply is not registered. */ + pr_debug("battery power supply is not registered\n"); + status = POWER_SUPPLY_STATUS_UNKNOWN; + } + + if (cw_bat->status != status) { + cw_bat->status = status; + cw_bat->bat_change = 1; + } +} + +static void rk_bat_update_time_to_empty(struct cw_battery *cw_bat) +{ + int ret; + ret = cw_get_time_to_empty(cw_bat); + if ((ret >= 0) && (cw_bat->time_to_empty != ret)) { + cw_bat->time_to_empty = ret; + cw_bat->bat_change = 1; + } + +} + +static void cw_bat_work(struct work_struct *work) +{ + struct delayed_work *delay_work; + struct cw_battery *cw_bat; + + + delay_work = container_of(work, struct delayed_work, work); + cw_bat = container_of(delay_work, struct cw_battery, battery_delay_work); + + rk_bat_update_status(cw_bat); + rk_bat_update_capacity(cw_bat); + rk_bat_update_vol(cw_bat); + rk_bat_update_time_to_empty(cw_bat); + + if (cw_bat->bat_change) { + power_supply_changed(&cw_bat->rk_bat); + cw_bat->bat_change = 0; + } + + queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(10000)); + + pr_debug("cw_bat->bat_change = %d, cw_bat->time_to_empty = %d, cw_bat->capacity = %d, cw_bat->voltage = %d\n", \ + cw_bat->bat_change, cw_bat->time_to_empty, cw_bat->capacity, cw_bat->voltage); +} + +static int rk_battery_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) +{ + int ret = 0; + struct cw_battery *cw_bat; + + cw_bat = container_of(psy, struct cw_battery, rk_bat); + switch (psp) { + case POWER_SUPPLY_PROP_CAPACITY: + val->intval = cw_bat->capacity; + break; + + case POWER_SUPPLY_PROP_PRESENT: + val->intval = cw_bat->voltage <= 0 ? 0 : 1; + break; + + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + val->intval = cw_bat->voltage; + break; + + case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: + val->intval = cw_bat->time_to_empty; + break; + + case POWER_SUPPLY_PROP_TECHNOLOGY: + val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; + break; + + default: + break; + } + return ret; +} + +static enum power_supply_property rk_battery_properties[] = { + POWER_SUPPLY_PROP_CAPACITY, + + + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, + POWER_SUPPLY_PROP_TECHNOLOGY, +}; + +#ifdef BAT_LOW_INTERRUPT + +#define WAKE_LOCK_TIMEOUT (10 * HZ) +static struct wake_lock bat_low_wakelock; + +static void bat_low_detect_do_wakeup(struct work_struct *work) +{ + struct delayed_work *delay_work; + struct cw_battery *cw_bat; + + delay_work = container_of(work, struct delayed_work, work); + cw_bat = container_of(delay_work, struct cw_battery, bat_low_wakeup_work); + pr_debug("func: %s-------\n", __func__); + cw_get_alt(cw_bat); + +} + +static irqreturn_t bat_low_detect_irq_handler(int irq, void *dev_id) +{ + struct cw_battery *cw_bat = dev_id; + + wake_lock_timeout(&bat_low_wakelock, WAKE_LOCK_TIMEOUT); + queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->bat_low_wakeup_work, msecs_to_jiffies(20)); + return IRQ_HANDLED; +} +#endif + +#ifdef CONFIG_PM +static int cw_bat_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cw_battery *cw_bat = i2c_get_clientdata(client); + pr_debug("%s\n", __func__); + cancel_delayed_work(&cw_bat->battery_delay_work); + + pr_debug("cw_bat->capacity:%d\n", cw_bat->capacity); + return 0; +} + +static int cw_bat_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cw_battery *cw_bat = i2c_get_clientdata(client); + pr_debug("%s\n", __func__); + queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(1)); + pr_debug("cw_bat->capacity:%d\n", cw_bat->capacity); + return 0; +} + +static const struct dev_pm_ops cw_bat_pm_ops = { + .suspend = cw_bat_suspend, + .resume = cw_bat_resume, + +}; +#endif + +#ifdef CONFIG_OF +static int cw_bat_parse_dt(struct device *dev, struct cw_bat_platform_data *pdata) +{ + struct device_node *np = dev->of_node; + pdata->bat_low_pin = of_get_named_gpio_flags(np, + "cw2015,irq-gpio", 0, &pdata->irq_flags); + + return 0; +} +#else +static int cw_bat_parse_dt(struct device *dev, struct cw_bat_platform_data *pdata) +{ + return 0; +} +#endif +#ifdef BAT_LOW_INTERRUPT +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" +#define CW_I2C_VTG_MIN_UV 1800000 +#define CW_I2C_VTG_MAX_UV 1800000 +#define CW_VIO_LOAD_MAX_UA 10000 +static int cw_bat_regulator_configure(struct cw_battery *cw_bat, bool on) +{ + int retval; + + if (on == false) + goto hw_shutdown; + + cw_bat->vcc_i2c = regulator_get(&cw_bat->client->dev, + "vcc_i2c"); + if (IS_ERR(cw_bat->vcc_i2c)) { + dev_err(&cw_bat->client->dev, + "%s: Failed to get i2c regulator\n", + __func__); + retval = PTR_ERR(cw_bat->vcc_i2c); + goto hw_shutdown; + } + + if (regulator_count_voltages(cw_bat->vcc_i2c) > 0) { + retval = regulator_set_voltage(cw_bat->vcc_i2c, + CW_I2C_VTG_MIN_UV, CW_I2C_VTG_MAX_UV); + if (retval) { + dev_err(&cw_bat->client->dev, + "%s reg set i2c vtg failed retval =%d\n", __func__, + retval); + goto err_set_vtg_i2c; + } + } + return 0; + +err_set_vtg_i2c: + regulator_put(cw_bat->vcc_i2c); + +hw_shutdown: + if (regulator_count_voltages(cw_bat->vcc_i2c) > 0) + regulator_set_voltage(cw_bat->vcc_i2c, 0, + CW_I2C_VTG_MAX_UV); + regulator_put(cw_bat->vcc_i2c); + + return 0; +}; + +static int reg_set_optimum_mode_check(struct regulator *reg, int load_uA) +{ + return (regulator_count_voltages(reg) > 0) ? + regulator_set_optimum_mode(reg, load_uA) : 0; +} + +static int cw_bat_power_on(struct cw_battery *cw_bat, + bool on) { + int retval; + + if (on == false) + goto power_off; + + retval = reg_set_optimum_mode_check(cw_bat->vcc_i2c, CW_VIO_LOAD_MAX_UA); + if (retval < 0) { + dev_err(&cw_bat->client->dev, + "%s Regulator vcc_i2c set_opt failed rc=%d\n", __func__, + retval); + goto power_off; + } + + retval = regulator_enable(cw_bat->vcc_i2c); + if (retval) { + dev_err(&cw_bat->client->dev, + "%s Regulator vcc_i2c enable failed rc=%d\n", __func__, + retval); + goto error_reg_en_vcc_i2c; + } + + msleep(200); + return 0; + +error_reg_en_vcc_i2c: + reg_set_optimum_mode_check(cw_bat->vcc_i2c, 0); + return retval; + +power_off: + reg_set_optimum_mode_check(cw_bat->vcc_i2c, 0); + regulator_disable(cw_bat->vcc_i2c); + + msleep(100); + return 0; +} + +static int cw_bat_pinctrl_init(struct cw_battery *cw_bat) +{ + int retval; + + /* Get pinctrl if target uses pinctrl */ + cw_bat->ts_pinctrl = devm_pinctrl_get(&(cw_bat->client->dev)); + if (IS_ERR_OR_NULL(cw_bat->ts_pinctrl)) { + retval = PTR_ERR(cw_bat->ts_pinctrl); + pr_debug( + "%s Target does not use pinctrl %d\n", __func__, retval); + goto err_pinctrl_get; + } + + cw_bat->pinctrl_state_active + = pinctrl_lookup_state(cw_bat->ts_pinctrl, + PINCTRL_STATE_ACTIVE); + if (IS_ERR_OR_NULL(cw_bat->pinctrl_state_active)) { + retval = PTR_ERR(cw_bat->pinctrl_state_active); + dev_err(&cw_bat->client->dev, + "%s Can not lookup %s pinstate %d\n", + __func__, PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_lookup; + } + + cw_bat->pinctrl_state_suspend + = pinctrl_lookup_state(cw_bat->ts_pinctrl, + PINCTRL_STATE_SUSPEND); + if (IS_ERR_OR_NULL(cw_bat->pinctrl_state_suspend)) { + retval = PTR_ERR(cw_bat->pinctrl_state_suspend); + dev_err(&cw_bat->client->dev, + "%s Can not lookup %s pinstate %d\n", + __func__, PINCTRL_STATE_SUSPEND, retval); + goto err_pinctrl_lookup; + } + + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(cw_bat->ts_pinctrl); +err_pinctrl_get: + cw_bat->ts_pinctrl = NULL; + return retval; +} + + +static int cw_bat_pinctrl_select(struct cw_battery *cw_bat, bool on) +{ + struct pinctrl_state *pins_state; + int ret; + + pins_state = on ? cw_bat->pinctrl_state_active + : cw_bat->pinctrl_state_suspend; + if (!IS_ERR_OR_NULL(pins_state)) { + ret = pinctrl_select_state(cw_bat->ts_pinctrl, pins_state); + if (ret) { + dev_err(&cw_bat->client->dev, + "%s can not set %s pins\n", __func__, + on ? "pmx_ts_active" : "pmx_ts_suspend"); + return ret; + } + } else + dev_err(&cw_bat->client->dev, + "%s not a valid '%s' pinstate\n", __func__, + on ? "pmx_ts_active" : "pmx_ts_suspend"); + + return 0; +} + + +static int cw_bat_gpio_configure(struct cw_battery *cw_bat, bool on) +{ + int retval = 0; + + if (on) { + if (gpio_is_valid(cw_bat->plat_data->bat_low_pin)) { + /* configure irq gpio */ + retval = gpio_request(cw_bat->plat_data->bat_low_pin, + "rmi4_irq_gpio"); + if (retval) { + dev_err(&cw_bat->client->dev, + "%s unable to request gpio [%d]\n", __func__, + cw_bat->plat_data->bat_low_pin); + goto err_irq_gpio_req; + } + retval = gpio_direction_input(cw_bat->plat_data->bat_low_pin); + if (retval) { + dev_err(&cw_bat->client->dev, + "%s unable to set direction for gpio " \ + "[%d]\n", __func__, cw_bat->plat_data->bat_low_pin); + goto err_irq_gpio_dir; + } + } else { + dev_err(&cw_bat->client->dev, + "%s irq gpio not provided\n", __func__); + goto err_irq_gpio_req; + } + + return 0; + } else { + return 0; + } + +err_irq_gpio_dir: + if (gpio_is_valid(cw_bat->plat_data->bat_low_pin)) + gpio_free(cw_bat->plat_data->bat_low_pin); +err_irq_gpio_req: + return retval; +} +#endif + +extern int battery_type_id ; +static int cw_bat_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct cw_bat_platform_data *pdata = client->dev.platform_data; + struct cw_battery *cw_bat; + int ret; + int loop = 0; + + pr_debug("\ncw2015/cw2013 driver v1.2 probe start, battery_type_id is %d\n", battery_type_id); + + cw_bat = kzalloc(sizeof(struct cw_battery), GFP_KERNEL); + if (!cw_bat) { + dev_err(&cw_bat->client->dev, "fail to allocate memory\n"); + return -ENOMEM; + } + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, + sizeof(struct cw_bat_platform_data), GFP_KERNEL); + if (!pdata) { + dev_err(&client->dev, + "GTP Failed to allocate memory for pdata\n"); + return -ENOMEM; + } + ret = cw_bat_parse_dt(&client->dev, pdata); + if (ret) + return ret; + } else { + pdata = client->dev.platform_data; + } + + if (!pdata) { + dev_err(&client->dev, "Invalid pdata\n"); + return -EINVAL; + } + + + else if (battery_type_id == 1) { + pdata->cw_bat_config_info = config_info_feimaotui; + } else if (battery_type_id == 2) { + pdata->cw_bat_config_info = config_info_xinwangda; + } else { + pdata->cw_bat_config_info = config_info; + } + + + + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "I2C not supported\n"); + return -ENODEV; + } + + cw_bat->client = client; + i2c_set_clientdata(client, cw_bat); + + cw_bat->plat_data = pdata; + ret = cw_check_ic(cw_bat); + + while ((loop++ < 5) && (ret != 0)) { + pr_debug(" check ret is %d, loop is %d \n" , ret, loop); + ret = cw_check_ic(cw_bat); + } + + + if (ret != 0) { + pr_debug(" wc_check_ic fail ,return ENODEV \n"); + return -ENODEV; + } + + ret = cw_init(cw_bat); + while ((loop++ < 2000) && (ret != 0)) { + ret = cw_init(cw_bat); + } + + if (ret) { + return ret; + } + + cw_bat->rk_bat.name = "rk-bat"; + cw_bat->rk_bat.type = POWER_SUPPLY_TYPE_BATTERY; + cw_bat->rk_bat.properties = rk_battery_properties; + cw_bat->rk_bat.num_properties = ARRAY_SIZE(rk_battery_properties); + cw_bat->rk_bat.get_property = rk_battery_get_property; + ret = power_supply_register(&client->dev, &cw_bat->rk_bat); + if (ret < 0) { + dev_err(&cw_bat->client->dev, "power supply register rk_bat error\n"); + pr_debug("rk_bat_register_fail\n"); + goto rk_bat_register_fail; + } + + cw_bat->charger_mode = 0; + cw_bat->capacity = 0; + cw_bat->voltage = 0; + cw_bat->status = 0; + cw_bat->time_to_empty = 0; + cw_bat->bat_change = 0; + + cw_update_time_member_capacity_change(cw_bat); + cw_update_time_member_charge_start(cw_bat); + + cw_bat->battery_workqueue = create_singlethread_workqueue("rk_battery"); + INIT_DELAYED_WORK(&cw_bat->battery_delay_work, cw_bat_work); + + queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(10)); + +#ifdef BAT_LOW_INTERRUPT + ret = cw_bat_regulator_configure(cw_bat, true); + if (ret < 0) { + dev_err(&client->dev, "%s Failed to configure regulators\n", __func__); + goto err_reg_configure; + } + + ret = cw_bat_power_on(cw_bat, true); + if (ret < 0) { + dev_err(&client->dev, "%s Failed to power on\n", __func__); + goto err_power_device; + + } + + ret = cw_bat_pinctrl_init(cw_bat); + if (!ret && cw_bat->ts_pinctrl) { + ret = pinctrl_select_state(cw_bat->ts_pinctrl, + cw_bat->pinctrl_state_active); + if (ret < 0) + goto err_pinctrl_select; + } + + ret = cw_bat_gpio_configure(cw_bat, true); + if (ret < 0) { + dev_err(&client->dev, "%s Failed to configure gpios\n", __func__); + goto err_gpio_config; + } + + INIT_DELAYED_WORK(&cw_bat->bat_low_wakeup_work, bat_low_detect_do_wakeup); + wake_lock_init(&bat_low_wakelock, WAKE_LOCK_SUSPEND, "bat_low_detect"); + cw_bat->client->irq = gpio_to_irq(pdata->bat_low_pin); + ret = request_threaded_irq(client->irq, NULL, + bat_low_detect_irq_handler, pdata->irq_flags, + "bat_low_detect", cw_bat); + if (ret) { + dev_err(&client->dev, "request irq failed\n"); + gpio_free(cw_bat->plat_data->bat_low_pin); + } + /*Chaman add for charger detect*/ + charge_psy = power_supply_get_by_name("usb"); + + err_gpio_config: + if (cw_bat->ts_pinctrl) { + ret = cw_bat_pinctrl_select(cw_bat, false); + if (ret < 0) + pr_err("Cannot get idle pinctrl state\n"); + } + err_pinctrl_select: + if (cw_bat->ts_pinctrl) { + pinctrl_put(cw_bat->ts_pinctrl); + } + err_power_device: + cw_bat_power_on(cw_bat, false); + err_reg_configure: + cw_bat_regulator_configure(cw_bat, false); +#endif + + pr_debug("\ncw2015/cw2013 driver v1.2 probe sucess\n"); + return 0; + +rk_bat_register_fail: + pr_debug("cw2015/cw2013 driver v1.2 probe error!!!!\n"); + return ret; +} + +static int cw_bat_remove(struct i2c_client *client) +{ + struct cw_battery *cw_bat = i2c_get_clientdata(client); + pr_debug("%s\n", __func__); + cancel_delayed_work(&cw_bat->battery_delay_work); + return 0; +} + +static const struct i2c_device_id cw_id[] = { + { "cw201x", 0 }, +}; +MODULE_DEVICE_TABLE(i2c, cw_id); + +static struct of_device_id cw2015_match_table[] = { + { .compatible = "cellwise,cw2015", }, + { }, +}; +static struct i2c_driver cw_bat_driver = { + .driver = { + .name = "cw201x", + +#ifdef CONFIG_PM + .pm = &cw_bat_pm_ops, +#endif + .of_match_table = cw2015_match_table, + }, + .probe = cw_bat_probe, + .remove = cw_bat_remove, + .id_table = cw_id, +}; + +static int __init cw_bat_init(void) +{ + return i2c_add_driver(&cw_bat_driver); +} + +static void __exit cw_bat_exit(void) +{ + i2c_del_driver(&cw_bat_driver); +} + +late_initcall(cw_bat_init); +module_exit(cw_bat_exit); + +MODULE_AUTHOR("ben"); +MODULE_DESCRIPTION("cw2015/cw2013 battery driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/power/pmic-voter.c b/drivers/power/pmic-voter.c index 4ba0db459f032..0e6936805a6c5 100644 --- a/drivers/power/pmic-voter.c +++ b/drivers/power/pmic-voter.c @@ -18,7 +18,7 @@ #include "pmic-voter.h" -#define NUM_MAX_CLIENTS 8 +#define NUM_MAX_CLIENTS 10 struct client_vote { int state; diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c index 27bcf6e2b6858..328483b6a36ab 100644 --- a/drivers/power/power_supply_core.c +++ b/drivers/power/power_supply_core.c @@ -4,6 +4,7 @@ * Copyright © 2007 Anton Vorontsov * Copyright © 2004 Szabolcs Gyurko * Copyright © 2003 Ian Molton + * Copyright (C) 2018 XiaoMi, Inc. * * Modified: 2004, Oct Szabolcs Gyurko * @@ -270,6 +271,26 @@ int power_supply_set_low_power_state(struct power_supply *psy, int value) } EXPORT_SYMBOL(power_supply_set_low_power_state); +int power_supply_get_battery_charge_state(struct power_supply *psy) +{ + union power_supply_propval ret = {0,}; + + if (!psy) { + pr_err("power supply is NULL\n"); + } + + if (psy->get_property) { + psy->get_property(psy, POWER_SUPPLY_PROP_PRESENT, &ret); + } + + pr_debug("online:%d\n", ret.intval); + + return ret.intval; + +} + +EXPORT_SYMBOL(power_supply_get_battery_charge_state); + /** * power_supply_set_dp_dm - * @psy: the power supply to control @@ -765,11 +786,70 @@ static void psy_unregister_cooler(struct power_supply *psy) } #endif + + +int bq_runin_test = 0; +static ssize_t show_StopCharging_Test(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* Disable charging */ + bool charging_enable = false; + struct power_supply *batt_psy = NULL; + int rc; + + bq_runin_test = 1; + batt_psy = power_supply_get_by_name("battery"); + if (batt_psy) { + rc = power_supply_set_charging_enabled(batt_psy, 0); + if (rc) + pr_err("disable charging failed\n"); + pr_err("show_StopCharging_Test : %x success\n", charging_enable); + } else + pr_err("get battery power supply Error!!\n"); + + return sprintf(buf, "chr=%d\n", charging_enable); +} + +static ssize_t store_StopCharging_Test(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + return -EPERM; +} +static DEVICE_ATTR(StopCharging_Test, 0664, show_StopCharging_Test, store_StopCharging_Test); + +static ssize_t show_StartCharging_Test(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* Enable charging */ + bool charging_enable = true; + struct power_supply *batt_psy = NULL; + int rc; + + bq_runin_test = 2; + batt_psy = power_supply_get_by_name("battery"); + if (batt_psy) { + rc = power_supply_set_charging_enabled(batt_psy, 1); + if (rc) + pr_err("enable charging failed\n"); + pr_err("show_StartCharging_Test : %x success\n", charging_enable); + } else + pr_err("get battery power supply Error!!\n"); + + return sprintf(buf, "chr=%d\n", charging_enable); +} + +static ssize_t store_StartCharging_Test(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + return -EPERM; +} +static DEVICE_ATTR(StartCharging_Test, 0664, show_StartCharging_Test, store_StartCharging_Test); + + + + static int __power_supply_register(struct device *parent, struct power_supply *psy, bool ws) { struct device *dev; int rc; + int ret_device_file = 0; dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) @@ -819,6 +899,11 @@ static int __power_supply_register(struct device *parent, power_supply_changed(psy); + if (strcmp(psy->name, "battery") == 0) { + pr_err("battery powe supply creat attr file!!\n"); + ret_device_file = device_create_file(dev, &dev_attr_StopCharging_Test); + ret_device_file = device_create_file(dev, &dev_attr_StartCharging_Test); + } return 0; create_triggers_failed: diff --git a/drivers/power/power_supply_sysfs.c b/drivers/power/power_supply_sysfs.c index a444df4623ba2..5f30098c8addc 100644 --- a/drivers/power/power_supply_sysfs.c +++ b/drivers/power/power_supply_sysfs.c @@ -5,6 +5,7 @@ * Copyright © 2007 Anton Vorontsov * Copyright © 2004 Szabolcs Gyurko * Copyright © 2003 Ian Molton + * Copyright (C) 2018 XiaoMi, Inc. * * Modified: 2004, Oct Szabolcs Gyurko * @@ -225,6 +226,7 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(temp_cool), POWER_SUPPLY_ATTR(temp_warm), POWER_SUPPLY_ATTR(system_temp_level), + POWER_SUPPLY_ATTR(charger_type), POWER_SUPPLY_ATTR(resistance), POWER_SUPPLY_ATTR(resistance_capacitive), POWER_SUPPLY_ATTR(resistance_id), @@ -253,6 +255,7 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(enable_jeita_detection), POWER_SUPPLY_ATTR(battery_info), POWER_SUPPLY_ATTR(battery_info_id), + POWER_SUPPLY_ATTR(charging_call_state), /* Local extensions of type int64_t */ POWER_SUPPLY_ATTR(charge_counter_ext), /* Properties of type `const char *' */ diff --git a/drivers/power/profile_WT1001_88509_NT_Feimaotui.h b/drivers/power/profile_WT1001_88509_NT_Feimaotui.h new file mode 100644 index 0000000000000..4d42c13b01aa0 --- /dev/null +++ b/drivers/power/profile_WT1001_88509_NT_Feimaotui.h @@ -0,0 +1,64 @@ +0x18 +, 0x07 +, 0x6D +, 0x6C +, 0x6B +, 0x6A +, 0x65 +, 0x65 +, 0x56 +, 0x78 +, 0x63 +, 0x49 +, 0x67 +, 0x56 +, 0x47 +, 0x3E +, 0x38 +, 0x2D +, 0x2B +, 0x24 +, 0x2B +, 0x31 +, 0x44 +, 0x4E +, 0x17 +, 0x63 +, 0x0B +, 0x85 +, 0x0D +, 0x1A +, 0x52 +, 0x5D +, 0x78 +, 0x74 +, 0x74 +, 0x78 +, 0x3E +, 0x1B +, 0x5E +, 0x22 +, 0x1C +, 0x3F +, 0x29 +, 0x53 +, 0x81 +, 0x97 +, 0x98 +, 0x23 +, 0x75 +, 0x7A +, 0x95 +, 0xC2 +, 0x7B +, 0x99 +, 0xBA +, 0xCB +, 0x2F +, 0x7D +, 0x72 +, 0xA5 +, 0xB5 +, 0xC1 +, 0x58 +, 0x91 diff --git a/drivers/power/profile_WT702_88509_NT_DeSai.h b/drivers/power/profile_WT702_88509_NT_DeSai.h new file mode 100644 index 0000000000000..55909fd752b27 --- /dev/null +++ b/drivers/power/profile_WT702_88509_NT_DeSai.h @@ -0,0 +1,64 @@ +0x17 +, 0xEC +, 0x6F +, 0x6D +, 0x6D +, 0x68 +, 0x66 +, 0x63 +, 0x58 +, 0x75 +, 0x65 +, 0x44 +, 0x5A +, 0x5C +, 0x4C +, 0x43 +, 0x37 +, 0x2E +, 0x2A +, 0x21 +, 0x1E +, 0x2D +, 0x45 +, 0x54 +, 0x23 +, 0x2E +, 0x0B +, 0x85 +, 0x41 +, 0x63 +, 0x50 +, 0x60 +, 0x70 +, 0x65 +, 0x69 +, 0x69 +, 0x3B +, 0x19 +, 0x7A +, 0x4F +, 0x06 +, 0x39 +, 0x21 +, 0x4D +, 0x86 +, 0x95 +, 0x98 +, 0x4D +, 0x6E +, 0x88 +, 0x98 +, 0xA4 +, 0x50 +, 0x87 +, 0xB0 +, 0xCB +, 0x2F +, 0x7D +, 0x72 +, 0xA5 +, 0xB5 +, 0xC1 +, 0x46 +, 0xAE diff --git a/drivers/power/profile_WT801_88509_NT_XinWangDa.h b/drivers/power/profile_WT801_88509_NT_XinWangDa.h new file mode 100644 index 0000000000000..8ab813520335b --- /dev/null +++ b/drivers/power/profile_WT801_88509_NT_XinWangDa.h @@ -0,0 +1,64 @@ +0x18 +, 0x03 +, 0x6A +, 0x6B +, 0x6D +, 0x6A +, 0x68 +, 0x65 +, 0x60 +, 0x63 +, 0x60 +, 0x54 +, 0x5D +, 0x59 +, 0x48 +, 0x40 +, 0x38 +, 0x31 +, 0x27 +, 0x24 +, 0x28 +, 0x31 +, 0x43 +, 0x4D +, 0x28 +, 0x49 +, 0x0B +, 0x85 +, 0x1C +, 0x37 +, 0x57 +, 0x6E +, 0x79 +, 0x7A +, 0x7A +, 0x7A +, 0x3D +, 0x1A +, 0x62 +, 0x3F +, 0x0A +, 0x44 +, 0x34 +, 0x55 +, 0x82 +, 0x97 +, 0x9B +, 0x13 +, 0x41 +, 0x81 +, 0x94 +, 0xC2 +, 0x74 +, 0x9C +, 0xBC +, 0xCB +, 0x2F +, 0x7D +, 0x72 +, 0xA5 +, 0xB5 +, 0xC1 +, 0x95 +, 0x61 diff --git a/drivers/power/profile_WT902_88509_NT_GuangYu.h b/drivers/power/profile_WT902_88509_NT_GuangYu.h new file mode 100644 index 0000000000000..ac811defb47b9 --- /dev/null +++ b/drivers/power/profile_WT902_88509_NT_GuangYu.h @@ -0,0 +1,64 @@ +0x17 +, 0xFD +, 0x6A +, 0x6B +, 0x6C +, 0x6A +, 0x68 +, 0x66 +, 0x60 +, 0x62 +, 0x5C +, 0x58 +, 0x60 +, 0x5B +, 0x49 +, 0x3D +, 0x38 +, 0x2E +, 0x2A +, 0x21 +, 0x27 +, 0x32 +, 0x42 +, 0x52 +, 0x26 +, 0x31 +, 0x0B +, 0x85 +, 0x46 +, 0x6C +, 0x5E +, 0x73 +, 0x85 +, 0x80 +, 0x81 +, 0x84 +, 0x3D +, 0x1A +, 0x5E +, 0x49 +, 0x07 +, 0x37 +, 0x32 +, 0x54 +, 0x82 +, 0x96 +, 0x9D +, 0x15 +, 0x61 +, 0x80 +, 0x94 +, 0xB9 +, 0x6A +, 0x8A +, 0x98 +, 0xCB +, 0x2F +, 0x7D +, 0x72 +, 0xA5 +, 0xB5 +, 0xC1 +, 0x46 +, 0xAE diff --git a/drivers/power/qpnp-fg.c b/drivers/power/qpnp-fg.c index eb774749a5f4e..89600dbcb56ef 100644 --- a/drivers/power/qpnp-fg.c +++ b/drivers/power/qpnp-fg.c @@ -1,4 +1,5 @@ /* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -845,6 +846,30 @@ static int fg_sec_masked_write(struct fg_chip *chip, u16 addr, u8 mask, u8 val, return rc; } + +static int area_version_flag; +static void get_area_version(struct fg_chip *chip) +{ + char *boardid_string = NULL; + char boardid_start[32] = " "; + int India; + + boardid_string = strstr(saved_command_line, "board_id="); + + if (boardid_string != NULL) { + strncpy(boardid_start, boardid_string+9, 9); + India = strncmp(boardid_start, "S88567CA1", 9); + if (!India) { + pr_err("India version!\n"); + area_version_flag = 1; + } else{ + pr_err("Normal version!\n"); + area_version_flag = 0; + } + } +} + + #define RIF_MEM_ACCESS_REQ BIT(7) static int fg_check_rif_mem_access(struct fg_chip *chip, bool *status) { @@ -1963,11 +1988,6 @@ static void fg_handle_battery_insertion(struct fg_chip *chip) } -static int soc_to_setpoint(int soc) -{ - return DIV_ROUND_CLOSEST(soc * 255, 100); -} - static void batt_to_setpoint_adc(int vbatt_mv, u8 *data) { int val; @@ -2195,9 +2215,6 @@ static int get_prop_capacity(struct fg_chip *chip) if (chip->battery_missing) return MISSING_CAPACITY; - if (!chip->profile_loaded && !chip->use_otp_profile) - return DEFAULT_CAPACITY; - if (chip->charge_full) return FULL_CAPACITY; @@ -2231,6 +2248,18 @@ static int get_prop_capacity(struct fg_chip *chip) return FULL_CAPACITY; } + +#if defined(CONFIG_D1_ROSY) + if (((chip->health == POWER_SUPPLY_HEALTH_COOL) + || (chip->health == POWER_SUPPLY_HEALTH_COLD)) + && msoc >= 247) { + pr_info("wt msoc= %d, chip->health=%d\n", msoc, chip->health); + return DIV_ROUND_CLOSEST((msoc - 1) * (FULL_CAPACITY - 2), + FULL_SOC_RAW - 2) + 2; + } +#endif + + return DIV_ROUND_CLOSEST((msoc - 1) * (FULL_CAPACITY - 2), FULL_SOC_RAW - 2) + 1; } @@ -2966,7 +2995,8 @@ static void update_cycle_count(struct work_struct *work) static int fg_get_cycle_count(struct fg_chip *chip) { - int count; + int count = 0; + int i = 0; if (!chip->cyc_ctr.en) return 0; @@ -2975,11 +3005,34 @@ static int fg_get_cycle_count(struct fg_chip *chip) return -EINVAL; mutex_lock(&chip->cyc_ctr.lock); - count = chip->cyc_ctr.count[chip->cyc_ctr.id - 1]; + for (i = 0; i < BUCKET_COUNT; i++) + count += chip->cyc_ctr.count[i]; + count /= BUCKET_COUNT; mutex_unlock(&chip->cyc_ctr.lock); return count; } +static int fg_set_cycle_count(struct fg_chip *chip, int value) +{ + int rc = 0; + int i = 0; + int address; + u8 data[2]; + + for (i = 0; i < BUCKET_COUNT; i++) { + data[0] = value & 0xFF; + data[1] = value >> 8; + + address = BATT_CYCLE_NUMBER_REG + i * 2; + rc = fg_mem_write(chip, data, address, 2, BATT_CYCLE_OFFSET, 0); + if (rc < 0) + pr_err("failed to write BATT_CYCLE[%d] rc=%d\n", i, rc); + else + chip->cyc_ctr.count[i] = value; + } + return rc; +} + static void half_float_to_buffer(int64_t uval, u8 *buffer) { u16 raw; @@ -3943,8 +3996,15 @@ static void status_change_work(struct work_struct *work) } if (chip->status == POWER_SUPPLY_STATUS_FULL) { +#if defined(CONFIG_D1_ROSY) + + if (capacity >= 99 && chip->hold_soc_while_full + && (chip->health == POWER_SUPPLY_HEALTH_GOOD || chip->health == POWER_SUPPLY_HEALTH_COOL)) { + +#else if (capacity >= 99 && chip->hold_soc_while_full && chip->health == POWER_SUPPLY_HEALTH_GOOD) { +#endif if (fg_debug_mask & FG_STATUS) pr_info("holding soc at 100\n"); chip->charge_full = true; @@ -4097,49 +4157,76 @@ static void check_gain_compensation(struct fg_chip *chip) } } +#define WARNTEMP 30 +#define COOLTEMP 10 + static void fg_hysteresis_config(struct fg_chip *chip) { int hard_hot = 0, hard_cold = 0; + int soft_hot = 0, soft_cold = 0; + soft_hot = get_prop_jeita_temp(chip, FG_MEM_SOFT_HOT); + soft_cold = get_prop_jeita_temp(chip, FG_MEM_SOFT_COLD); hard_hot = get_prop_jeita_temp(chip, FG_MEM_HARD_HOT); hard_cold = get_prop_jeita_temp(chip, FG_MEM_HARD_COLD); + if (chip->health == POWER_SUPPLY_HEALTH_OVERHEAT && !chip->batt_hot) { /* turn down the hard hot threshold */ + set_prop_jeita_temp(chip, FG_MEM_HARD_HOT, hard_hot - chip->hot_hysteresis); chip->batt_hot = true; - set_prop_jeita_temp(chip, FG_MEM_HARD_HOT, - hard_hot - chip->hot_hysteresis); - if (fg_debug_mask & FG_STATUS) - pr_info("hard hot hysteresis: old hot=%d, new hot=%d\n", - hard_hot, hard_hot - chip->hot_hysteresis); - } else if (chip->health == POWER_SUPPLY_HEALTH_COLD && - !chip->batt_cold) { + chip->batt_warm = false; + chip->batt_cold = false; + chip->batt_cold = false; + } else if (chip->health != POWER_SUPPLY_HEALTH_OVERHEAT && chip->batt_hot) { + /* restore the hard hot threshold */ + set_prop_jeita_temp(chip, FG_MEM_HARD_HOT, hard_hot + chip->hot_hysteresis); + chip->batt_hot = false; + chip->batt_warm = true; + chip->batt_cold = false; + chip->batt_cool = false; + } else if (chip->health == POWER_SUPPLY_HEALTH_WARM && !chip->batt_warm) { + /* turn down the soft hot threshold */ + set_prop_jeita_temp(chip, FG_MEM_SOFT_HOT, soft_hot - WARNTEMP); + chip->batt_hot = false; + chip->batt_warm = true; + chip->batt_cold = false; + chip->batt_cool = false; + } else if (chip->health != POWER_SUPPLY_HEALTH_WARM && chip->batt_warm) { + /* restore the soft hot threshold */ + set_prop_jeita_temp(chip, FG_MEM_SOFT_HOT, soft_hot + WARNTEMP); + chip->batt_warm = false; + chip->batt_hot = false; + chip->batt_cold = false; + chip->batt_cool = false; + } else if (chip->health == POWER_SUPPLY_HEALTH_COOL && !chip->batt_cool) { + /* turn up the soft cold threshold */ + set_prop_jeita_temp(chip, FG_MEM_SOFT_COLD, soft_cold + COOLTEMP); + chip->batt_hot = false; + chip->batt_warm = false; + chip->batt_cold = false; + chip->batt_cool = true; + } else if (chip->health != POWER_SUPPLY_HEALTH_COOL && chip->batt_cool) { + /* restore the soft cold threshold */ + set_prop_jeita_temp(chip, FG_MEM_SOFT_COLD, soft_cold - COOLTEMP); + chip->batt_cool = false; + chip->batt_hot = false; + chip->batt_warm = false; + chip->batt_cold = false; + } else if (chip->health == POWER_SUPPLY_HEALTH_COLD && !chip->batt_cold) { /* turn up the hard cold threshold */ + set_prop_jeita_temp(chip, FG_MEM_HARD_COLD, hard_cold + chip->cold_hysteresis); + chip->batt_hot = false; + chip->batt_warm = false; chip->batt_cold = true; - set_prop_jeita_temp(chip, FG_MEM_HARD_COLD, - hard_cold + chip->cold_hysteresis); - if (fg_debug_mask & FG_STATUS) - pr_info("hard cold hysteresis: old cold=%d, new cold=%d\n", - hard_cold, hard_cold + chip->hot_hysteresis); - } else if (chip->health != POWER_SUPPLY_HEALTH_OVERHEAT && - chip->batt_hot) { - /* restore the hard hot threshold */ - set_prop_jeita_temp(chip, FG_MEM_HARD_HOT, - hard_hot + chip->hot_hysteresis); - chip->batt_hot = !chip->batt_hot; - if (fg_debug_mask & FG_STATUS) - pr_info("restore hard hot threshold: old hot=%d, new hot=%d\n", - hard_hot, - hard_hot + chip->hot_hysteresis); + chip->batt_cool = false; } else if (chip->health != POWER_SUPPLY_HEALTH_COLD && chip->batt_cold) { /* restore the hard cold threshold */ - set_prop_jeita_temp(chip, FG_MEM_HARD_COLD, - hard_cold - chip->cold_hysteresis); - chip->batt_cold = !chip->batt_cold; - if (fg_debug_mask & FG_STATUS) - pr_info("restore hard cold threshold: old cold=%d, new cold=%d\n", - hard_cold, - hard_cold - chip->cold_hysteresis); + set_prop_jeita_temp(chip, FG_MEM_HARD_COLD, hard_cold - chip->cold_hysteresis); + chip->batt_cold = false; + chip->batt_hot = false; + chip->batt_warm = false; + chip->batt_cool = true; } } @@ -4169,6 +4256,9 @@ static int fg_init_batt_temp_state(struct fg_chip *chip) (batt_info_sts & JEITA_HARD_HOT_RT_STS) ? true : false; chip->batt_cold = (batt_info_sts & JEITA_HARD_COLD_RT_STS) ? true : false; + chip->batt_warm = false; + chip->batt_cool = false; + if (chip->batt_hot || chip->batt_cold) { if (chip->batt_hot) { chip->health = POWER_SUPPLY_HEALTH_OVERHEAT; @@ -4661,8 +4751,8 @@ static int fg_power_set_property(struct power_supply *psy, schedule_work(&chip->set_resume_soc_work); } - if (chip->jeita_hysteresis_support) - fg_hysteresis_config(chip); + + fg_hysteresis_config(chip); break; case POWER_SUPPLY_PROP_CHARGE_DONE: chip->charge_done = val->intval; @@ -4671,6 +4761,10 @@ static int fg_power_set_property(struct power_supply *psy, schedule_work(&chip->set_resume_soc_work); } break; + case POWER_SUPPLY_PROP_CYCLE_COUNT: + rc = fg_set_cycle_count(chip, val->intval); + pr_info("Cycle count is modified to %d by userspace\n", val->intval); + break; case POWER_SUPPLY_PROP_CYCLE_COUNT_ID: if ((val->intval > 0) && (val->intval <= BUCKET_COUNT)) { chip->cyc_ctr.id = val->intval; @@ -4712,6 +4806,7 @@ static int fg_property_is_writeable(struct power_supply *psy, case POWER_SUPPLY_PROP_CYCLE_COUNT_ID: case POWER_SUPPLY_PROP_BATTERY_INFO: case POWER_SUPPLY_PROP_BATTERY_INFO_ID: + case POWER_SUPPLY_PROP_CYCLE_COUNT: return 1; default: break; @@ -6190,6 +6285,44 @@ static int fg_do_restart(struct fg_chip *chip, bool write_profile) return -EINVAL; } + +#define REDO_BATID_DURING_FIRST_EST BIT(4) +static void fg_hw_restart(struct fg_chip *chip) +{ + u8 reg, rc; + int batt_id; + u8 data[4]; + + reg = 0x80; + fg_masked_write(chip, 0x4150, reg, reg, 1); + fg_masked_write(chip, chip->soc_base + SOC_RESTART, 0xFF, 0, 1); + mdelay(5); + + reg = REDO_BATID_DURING_FIRST_EST|REDO_FIRST_ESTIMATE; + fg_masked_write(chip, chip->soc_base + SOC_RESTART, reg, reg, 1); + mdelay(5); + + reg = REDO_BATID_DURING_FIRST_EST | REDO_FIRST_ESTIMATE | RESTART_GO; + fg_masked_write(chip, chip->soc_base + SOC_RESTART, reg, reg, 1); + mdelay(1000); + + fg_masked_write(chip, chip->soc_base + SOC_RESTART, 0xFF, 0, 1); + fg_masked_write(chip, 0x4150, 0x80, 0, 1); + + mdelay(2000); + + rc = fg_mem_read(chip, data, fg_data[FG_DATA_BATT_ID].address, + fg_data[FG_DATA_BATT_ID].len, fg_data[FG_DATA_BATT_ID].offset, 0); + if (rc) { + pr_err("XJB Failed to get sram battery id data\n"); + } else { + fg_data[FG_DATA_BATT_ID].value = data[0] * LSB_8B; + } + batt_id = get_sram_prop_now(chip, FG_DATA_BATT_ID); + pr_err("fg_hw_restart. wingtech after restart battery id = %d\n", batt_id); +} + + #define FG_PROFILE_LEN 128 #define PROFILE_COMPARE_LEN 32 #define THERMAL_COEFF_ADDR 0x444 @@ -6204,6 +6337,8 @@ static int fg_batt_profile_init(struct fg_chip *chip) const char *data, *batt_type_str; bool tried_again = false, vbat_in_range, profiles_same; u8 reg = 0; + int value; + wait: fg_stay_awake(&chip->profile_wakeup_source); @@ -6224,6 +6359,21 @@ static int fg_batt_profile_init(struct fg_chip *chip) if (!is_charger_available(chip)) goto reschedule; + + value = get_sram_prop_now(chip, FG_DATA_BATT_ID); + pr_err("wingtech init FG_DATA_BATT_ID =%d\n", value); +#if defined(CONFIG_A13N_PMI8952) + if (!(((value > 85000) && (value < 115000)) || ((value > 57000) && (value < 78000)) || ((value > 24000) && (value < 35000)))) { + + fg_hw_restart(chip); + } + +#elif defined(CONFIG_D1_ROSY) + if (!(((value > 57000) && (value < 78000)) || ((value > 280000) && (value < 380000)))) { + fg_hw_restart(chip); + } +#endif + /* Disable charging for a FG cycle before calculating vbat_in_range */ if (!chip->charging_disabled) { rc = set_prop_enable_charging(chip, false); @@ -6290,6 +6440,12 @@ static int fg_batt_profile_init(struct fg_chip *chip) if (rc) pr_warn("couldn't find battery max voltage\n"); + if (area_version_flag == 1) + chip->batt_max_voltage_uv = 4380000; + + #ifdef CONFIG_DISABLE_TEMP_PROTECT + chip->batt_max_voltage_uv = 4100000; + #endif /* * Only configure from profile if fg-cc-cv-threshold-mv is not @@ -6583,9 +6739,10 @@ static void charge_full_work(struct work_struct *work) int rc; u8 buffer[3]; int bsoc; - int resume_soc_raw = FULL_SOC_RAW - settings[FG_MEM_RESUME_SOC].value; + int resume_soc_raw = settings[FG_MEM_RESUME_SOC].value; bool disable = false; u8 reg; + int msoc = 0, retry = 0; if (chip->status != POWER_SUPPLY_STATUS_FULL) { if (fg_debug_mask & FG_STATUS) @@ -6628,6 +6785,15 @@ static void charge_full_work(struct work_struct *work) pr_info("wrote %06x into soc full\n", bsoc); } fg_mem_release(chip); + + + while (msoc != 0xFF && retry != 8) { + msleep(200); + msoc = get_monotonic_soc_raw(chip); + retry++; + } + + /* * wait one cycle to make sure the soc is updated before clearing * the soc mask bit @@ -6904,6 +7070,14 @@ static int fg_of_init(struct fg_chip *chip) OF_READ_SETTING(FG_MEM_HARD_HOT, "hot-bat-decidegc", rc, 1); OF_READ_SETTING(FG_MEM_HARD_COLD, "cold-bat-decidegc", rc, 1); + #ifdef CONFIG_DISABLE_TEMP_PROTECT + settings[FG_MEM_HARD_HOT].value = 850; + settings[FG_MEM_SOFT_HOT].value = 850; + settings[FG_MEM_HARD_COLD].value = -250; + settings[FG_MEM_SOFT_COLD].value = -250; + #endif + + if (of_find_property(node, "qcom,cold-hot-jeita-hysteresis", NULL)) { int hard_hot = 0, soft_hot = 0, hard_cold = 0, soft_cold = 0; @@ -6977,6 +7151,9 @@ static int fg_of_init(struct fg_chip *chip) DEFAULT_EVALUATION_CURRENT_MA); OF_READ_PROPERTY(chip->cc_cv_threshold_mv, "fg-cc-cv-threshold-mv", rc, 0); + if (area_version_flag == 1) + chip->cc_cv_threshold_mv = 4370; + if (of_property_read_bool(chip->spmi->dev.of_node, "qcom,capacity-learning-on")) chip->batt_aging_mode = FG_AGING_CC; @@ -7928,7 +8105,7 @@ static int fg_common_hw_init(struct fg_chip *chip) } rc = fg_mem_masked_write(chip, settings[FG_MEM_DELTA_SOC].address, 0xFF, - soc_to_setpoint(settings[FG_MEM_DELTA_SOC].value), + settings[FG_MEM_DELTA_SOC].value, settings[FG_MEM_DELTA_SOC].offset); if (rc) { pr_err("failed to write delta soc rc=%d\n", rc); @@ -8710,6 +8887,8 @@ static int fg_probe(struct spmi_device *spmi) } } + get_area_version(chip); + rc = fg_detect_pmic_type(chip); if (rc) { pr_err("Unable to detect PMIC type rc=%d\n", rc); diff --git a/drivers/power/qpnp-smbcharger.c b/drivers/power/qpnp-smbcharger.c index 352c2e538aa2d..25b6e44187949 100644 --- a/drivers/power/qpnp-smbcharger.c +++ b/drivers/power/qpnp-smbcharger.c @@ -1,4 +1,5 @@ /* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -125,11 +126,18 @@ struct smbchg_chip { int bmd_pin_src; int jeita_temp_hard_limit; int aicl_rerun_period_s; + + int customize_cool_low_limit; + int customize_cool_high_limit; + int fcc_customize_cool_ma; + int fcc_batt_cool_ma; + bool use_vfloat_adjustments; bool iterm_disabled; bool bmd_algo_disabled; bool soft_vfloat_comp_disabled; bool chg_enabled; + int call_state; bool charge_unknown_battery; bool chg_inhibit_en; bool chg_inhibit_source_fg; @@ -248,8 +256,12 @@ struct smbchg_chip { struct smbchg_regulator otg_vreg; struct smbchg_regulator ext_otg_vreg; struct work_struct usb_set_online_work; + struct delayed_work period_update_work; struct delayed_work vfloat_adjust_work; struct delayed_work hvdcp_det_work; + + struct delayed_work monitor_charging_temp_5_work; + spinlock_t sec_access_lock; struct mutex therm_lvl_lock; struct mutex usb_set_online_lock; @@ -281,6 +293,7 @@ struct smbchg_chip { struct votable *aicl_deglitch_short_votable; struct votable *hvdcp_enable_votable; }; +struct smbchg_chip *wt_chip = NULL; enum qpnp_schg { QPNP_SCHG, @@ -311,6 +324,8 @@ enum smbchg_wa { SMBCHG_FLASH_BUCK_SWITCH_FREQ_WA = BIT(7), SMBCHG_ICL_CONTROL_WA = BIT(8), }; +static inline void dump_reg(struct smbchg_chip *chip, u16 addr, + const char *name); enum print_reason { PR_REGISTER = BIT(0), @@ -329,6 +344,7 @@ enum wake_reason { PM_ESR_PULSE = BIT(2), PM_PARALLEL_TAPER = BIT(3), PM_DETECT_HVDCP = BIT(4), + PM_CHARGER_ONLINE = BIT(5), }; enum fcc_voters { @@ -347,6 +363,7 @@ enum icl_voters { SW_AICL_ICL_VOTER, CHG_SUSPEND_WORKAROUND_ICL_VOTER, SHUTDOWN_WORKAROUND_ICL_VOTER, + CALL_ICL_VOTER, NUM_ICL_VOTER, }; @@ -428,12 +445,12 @@ enum hvdcp_voters { HVDCP_PULSING_VOTER, NUM_HVDCP_VOTERS, }; -static int smbchg_debug_mask; +static int smbchg_debug_mask = PR_INTERRUPT | PR_STATUS | PR_MISC; module_param_named( debug_mask, smbchg_debug_mask, int, S_IRUSR | S_IWUSR ); -static int smbchg_parallel_en = 1; +static int smbchg_parallel_en; module_param_named( parallel_en, smbchg_parallel_en, int, S_IRUSR | S_IWUSR ); @@ -450,19 +467,19 @@ module_param_named( int, S_IRUSR | S_IWUSR ); -static int smbchg_default_hvdcp_icl_ma = 1800; +static int smbchg_default_hvdcp_icl_ma = 1200; module_param_named( default_hvdcp_icl_ma, smbchg_default_hvdcp_icl_ma, int, S_IRUSR | S_IWUSR ); -static int smbchg_default_hvdcp3_icl_ma = 3000; +static int smbchg_default_hvdcp3_icl_ma = 2000; module_param_named( default_hvdcp3_icl_ma, smbchg_default_hvdcp3_icl_ma, int, S_IRUSR | S_IWUSR ); -static int smbchg_default_dcp_icl_ma = 1800; +static int smbchg_default_dcp_icl_ma = 2000; module_param_named( default_dcp_icl_ma, smbchg_default_dcp_icl_ma, int, S_IRUSR | S_IWUSR @@ -649,6 +666,30 @@ static int smbchg_sec_masked_write(struct smbchg_chip *chip, u16 base, u8 mask, return rc; } + +static int area_version_flag; +static void get_area_version(struct smbchg_chip *chip) +{ + char *boardid_string = NULL; + char boardid_start[32] = " "; + int India; + + boardid_string = strstr(saved_command_line, "board_id="); + + if (boardid_string != NULL) { + strncpy(boardid_start, boardid_string+9, 9); + India = strncmp(boardid_start, "S88567CA1", 9); + if (!India) { + pr_err("India version!\n"); + area_version_flag = 1; + } else{ + pr_err("Normal version!\n"); + area_version_flag = 0; + } + } +} + + static void smbchg_stay_awake(struct smbchg_chip *chip, int reason) { int reasons; @@ -977,7 +1018,7 @@ static int get_prop_batt_status(struct smbchg_chip *chip) else status = POWER_SUPPLY_STATUS_CHARGING; out: - pr_smb_rt(PR_MISC, "CHGR_STS = 0x%02x\n", reg); + pr_smb_rt(PR_DUMP, "CHGR_STS = 0x%02x\n", reg); return status; } @@ -1097,7 +1138,19 @@ static int get_prop_batt_temp(struct smbchg_chip *chip) pr_smb(PR_STATUS, "Couldn't get temperature rc = %d\n", rc); temp = DEFAULT_BATT_TEMP; } - return temp; + #ifdef CONFIG_DISABLE_TEMP_PROTECT + pr_smb(PR_STATUS, "WINGTECH disable temp protect version; real temp:%d\n", temp); + return 250; + #endif + + if (temp < -100) { + temp = temp - 55; + return temp; + } else if (temp > 450) { + temp = temp - 10; + return temp; + } else + return temp; } #define DEFAULT_BATT_CURRENT_NOW 0 @@ -1167,8 +1220,17 @@ static int get_prop_batt_voltage_max_design(struct smbchg_chip *chip) return uv; } +#if defined(CONFIG_D1_ROSY) +#define DEFAULT_BATT_CAPACITY_MAX_DESIGN 3300 +#else +#define DEFAULT_BATT_CAPACITY_MAX_DESIGN 4100000 +#endif static int get_prop_batt_health(struct smbchg_chip *chip) { + #ifdef CONFIG_DISABLE_TEMP_PROTECT + return POWER_SUPPLY_HEALTH_GOOD; + #endif + if (chip->batt_hot) return POWER_SUPPLY_HEALTH_OVERHEAT; else if (chip->batt_cold) @@ -1571,7 +1633,7 @@ static struct power_supply *get_parallel_psy(struct smbchg_chip *chip) return chip->parallel.psy; chip->parallel.psy = power_supply_get_by_name("usb-parallel"); if (!chip->parallel.psy) - pr_smb(PR_STATUS, "parallel charger not found\n"); + pr_smb(PR_DUMP, "parallel charger not found\n"); return chip->parallel.psy; } @@ -1585,6 +1647,8 @@ static void smbchg_usb_update_online_work(struct work_struct *work) int online; online = user_enabled && chip->usb_present && !chip->very_weak_charger; + pr_err("chip->usb_online:%d,online:%d,user_enabled:%d,chip->usb_present:%d,chip->very_weak_charger:%d\n", + chip->usb_online, online, user_enabled, chip->usb_present, chip->very_weak_charger); mutex_lock(&chip->usb_set_online_lock); if (chip->usb_online != online) { @@ -3623,6 +3687,12 @@ static int smbchg_config_chg_battery_type(struct smbchg_chip *chip) pr_warn("couldn't find battery max voltage rc=%d\n", rc); ret = rc; } else { + if (area_version_flag == 1) + max_voltage_uv = 4380000; + + #ifdef CONFIG_DISABLE_TEMP_PROTECT + max_voltage_uv = 4100000; + #endif if (chip->vfloat_mv != (max_voltage_uv / 1000)) { pr_info("Vfloat changed from %dmV to %dmV for battery-type %s\n", chip->vfloat_mv, (max_voltage_uv / 1000), @@ -3778,6 +3848,32 @@ static void smbchg_external_power_changed(struct power_supply *psy) power_supply_changed(&chip->batt_psy); } + +#define call_current_max 900 +#define d1_call_current_max 1200 +void smbchg_set_calling_current(struct smbchg_chip *chip) +{ + enum power_supply_type usb_supply_type; + char *usb_type_name = "null"; + + read_usb_type(chip, &usb_type_name, &usb_supply_type); + pr_smb(PR_MISC, "chip->call_state =%d, usb_supply_type =%d\n", chip->call_state, usb_supply_type); + if ((chip->call_state == 0)) { + if (usb_supply_type == POWER_SUPPLY_TYPE_USB_DCP) { +#if defined(CONFIG_D1_ROSY) + pr_smb(PR_MISC, "call_icl_voltage vote 1200mA when calling\n"); + vote(chip->usb_icl_votable, CALL_ICL_VOTER, true, d1_call_current_max); +#else + pr_smb(PR_MISC, "call_icl_voltage vote 900mA when calling\n"); + vote(chip->usb_icl_votable, CALL_ICL_VOTER, true, call_current_max); +#endif + } + } else { + pr_smb(PR_MISC, "call_icl_volter false"); + vote(chip->usb_icl_votable, CALL_ICL_VOTER, false, 0); + } +} + static int smbchg_otg_regulator_enable(struct regulator_dev *rdev) { int rc = 0; @@ -3862,7 +3958,7 @@ struct regulator_ops smbchg_otg_reg_ops = { #define ADAPTER_ALLOWANCE_MASK 0x7 #define USBIN_ADAPTER_9V 0x3 #define USBIN_ADAPTER_5V_9V_CONT 0x2 -#define USBIN_ADAPTER_5V_UNREGULATED_9V 0x5 +#define USBIN_ADAPTER_5V_UNREGULATED_9V 0x6 static int smbchg_external_otg_regulator_enable(struct regulator_dev *rdev) { int rc = 0; @@ -4722,6 +4818,95 @@ static int smbchg_restricted_charging(struct smbchg_chip *chip, bool enable) return rc; } + +#define FACTORY_DISCHAGE_CAPACITY_THRESHOLD 80 +static int smbchg_factory_mode_controlled_by_capacity(struct smbchg_chip *chip) +{ +#ifdef WT_COMPILE_FACTORY_VERSION + int rc, capacity_now; + + capacity_now = get_prop_batt_capacity(chip); + if ((capacity_now >= FACTORY_DISCHAGE_CAPACITY_THRESHOLD) && (capacity_now <= 100)) { + pr_smb(PR_DUMP, "capacity_now = %d, disable charge\n", capacity_now); + rc = smbchg_charging_en(chip, false); + if (rc) { + pr_err("failed to disable charge in factory mode\n"); + return rc; + } + } else if ((capacity_now >= 0) && (capacity_now < FACTORY_DISCHAGE_CAPACITY_THRESHOLD)) { + pr_smb(PR_DUMP, "capacity_now = %d, enable charge\n", capacity_now); + rc = smbchg_charging_en(chip, true); + if (rc) { + pr_err("failed to enable charge in factory mode\n"); + return rc; + } + } +#endif + return 0; +} + + + +#define MONITOR_PERIOD 20000 +static bool in_cool_low; +static bool in_cool_high; +static int smbchg_get_iusb(struct smbchg_chip *chip); +static void smbchg_monitor_charging_temp_5_work(struct work_struct *work) +{ + int battery_temperature; + bool usb_preset; + int batt_temp; + int chg_current; + int usb_current; + struct smbchg_chip *chip = container_of(work, struct smbchg_chip, monitor_charging_temp_5_work.work); + + usb_preset = is_usb_present(chip); + pr_smb(PR_DUMP, "monitor begin work. usb_preset = %d\n", usb_preset); + if (usb_preset) { + set_property_on_fg(chip, POWER_SUPPLY_PROP_UPDATE_NOW, 1); + battery_temperature = get_prop_batt_temp(chip); + if ((battery_temperature > chip->customize_cool_low_limit) + && (battery_temperature <= chip->customize_cool_high_limit)) { + if ((chip->fcc_customize_cool_ma > 0) && (!in_cool_low)) { + pr_smb(PR_DUMP, "between temp range 0 - 5\n"); + if (chip->customize_cool_high_limit < 60) + chip->customize_cool_high_limit = 60; + + in_cool_low = true; + in_cool_high = false; + vote(chip->fcc_votable, RESTRICTED_CHG_FCC_VOTER, true, chip->fcc_customize_cool_ma); + } + } else { + if (chip->batt_cool) { + + if ((chip->fcc_batt_cool_ma > 0) && (!in_cool_high) && (battery_temperature > chip->customize_cool_high_limit)) { + pr_smb(PR_DUMP, "between temp range 5 - 15\n"); + if (chip->customize_cool_high_limit > 50) + chip->customize_cool_high_limit = 50; + + in_cool_low = false; + in_cool_high = true; + vote(chip->fcc_votable, RESTRICTED_CHG_FCC_VOTER, true, chip->fcc_batt_cool_ma); + } + } else { + in_cool_low = false; + in_cool_high = false; + } + } + } + + batt_temp = get_prop_batt_temp(chip)/10; + chg_current = get_prop_batt_current_now(chip); + usb_current = smbchg_get_iusb(chip); + pr_smb(PR_DUMP, "@**batt_temp=%d,chg_current=%d,usb_current=%d\n", batt_temp, chg_current, usb_current); + + smbchg_factory_mode_controlled_by_capacity(chip); + + schedule_delayed_work(&chip->monitor_charging_temp_5_work, msecs_to_jiffies(MONITOR_PERIOD)); + +} + + static void handle_usb_removal(struct smbchg_chip *chip) { struct power_supply *parallel_psy = get_parallel_psy(chip); @@ -4775,6 +4960,14 @@ static void handle_usb_removal(struct smbchg_chip *chip) HVDCP_SHORT_DEGLITCH_VOTER, false, 0); if (!chip->hvdcp_not_supported) restore_from_hvdcp_detection(chip); + +#if defined(CONFIG_D1_ROSY) + in_cool_low = false; + in_cool_high = false; + chip->customize_cool_high_limit = 50; + cancel_delayed_work_sync(&chip->monitor_charging_temp_5_work); + smbchg_relax(chip, PM_CHARGER_ONLINE); +#endif } static bool is_usbin_uv_high(struct smbchg_chip *chip) @@ -4802,6 +4995,8 @@ static void handle_usb_insertion(struct smbchg_chip *chip) read_usb_type(chip, &usb_type_name, &usb_supply_type); pr_smb(PR_STATUS, "inserted type = %d (%s)", usb_supply_type, usb_type_name); + pr_smb(PR_STATUS, "plugged cable will call smbchg_set_calling_current \n"); + smbchg_set_calling_current(chip); smbchg_aicl_deglitch_wa_check(chip); if (chip->typec_psy) @@ -4849,6 +5044,11 @@ static void handle_usb_insertion(struct smbchg_chip *chip) rc = enable_irq_wake(chip->aicl_done_irq); chip->enable_aicl_wake = true; } + +#if defined(CONFIG_D1_ROSY) + smbchg_stay_awake(chip, PM_CHARGER_ONLINE); + schedule_delayed_work(&chip->monitor_charging_temp_5_work, msecs_to_jiffies(MONITOR_PERIOD)); +#endif } void update_usb_status(struct smbchg_chip *chip, bool usb_present, bool force) @@ -5799,6 +5999,7 @@ static enum power_supply_property smbchg_battery_properties[] = { POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_PROP_TECHNOLOGY, POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL, + POWER_SUPPLY_PROP_CHARGER_TYPE, POWER_SUPPLY_PROP_FLASH_CURRENT_MAX, POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, POWER_SUPPLY_PROP_VOLTAGE_MAX, @@ -5820,6 +6021,8 @@ static enum power_supply_property smbchg_battery_properties[] = { POWER_SUPPLY_PROP_RESTRICTED_CHARGING, POWER_SUPPLY_PROP_ALLOW_HVDCP3, POWER_SUPPLY_PROP_MAX_PULSE_ALLOWED, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, + POWER_SUPPLY_PROP_CHARGING_CALL_STATE, }; static int smbchg_battery_set_property(struct power_supply *psy, @@ -5903,6 +6106,13 @@ static int smbchg_battery_set_property(struct power_supply *psy, power_supply_changed(&chip->batt_psy); } break; + + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: + chip->call_state = val->intval; + pr_smb(PR_STATUS, "calling will call smbchg_set_calling_current and will detect cable plugged chip->call_state =%d\n", chip->call_state); + smbchg_set_calling_current(chip); + break; + default: return -EINVAL; } @@ -5927,6 +6137,7 @@ static int smbchg_battery_is_writeable(struct power_supply *psy, case POWER_SUPPLY_PROP_RERUN_AICL: case POWER_SUPPLY_PROP_RESTRICTED_CHARGING: case POWER_SUPPLY_PROP_ALLOW_HVDCP3: + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: rc = 1; break; default: @@ -5957,6 +6168,11 @@ static int smbchg_battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_CHARGING_ENABLED: val->intval = chip->chg_enabled; break; + + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: + val->intval = chip->call_state; + break; + case POWER_SUPPLY_PROP_CHARGE_TYPE: val->intval = get_prop_charge_type(chip); break; @@ -5967,7 +6183,7 @@ static int smbchg_battery_get_property(struct power_supply *psy, val->intval = get_prop_batt_health(chip); break; case POWER_SUPPLY_PROP_TECHNOLOGY: - val->intval = POWER_SUPPLY_TECHNOLOGY_LION; + val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; break; case POWER_SUPPLY_PROP_FLASH_CURRENT_MAX: val->intval = smbchg_calc_max_flash_current(chip); @@ -5978,6 +6194,9 @@ static int smbchg_battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: val->intval = chip->therm_lvl_sel; break; + case POWER_SUPPLY_PROP_CHARGER_TYPE: + val->intval = chip->usb_supply_type; + break; case POWER_SUPPLY_PROP_INPUT_CURRENT_MAX: val->intval = smbchg_get_aicl_level_ma(chip) * 1000; break; @@ -6006,6 +6225,9 @@ static int smbchg_battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_TEMP: val->intval = get_prop_batt_temp(chip); break; + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + val->intval = DEFAULT_BATT_CAPACITY_MAX_DESIGN; + break; case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: val->intval = get_prop_batt_voltage_max_design(chip); break; @@ -6167,6 +6389,8 @@ static irqreturn_t batt_cold_handler(int irq, void *_chip) get_prop_batt_health(chip)); return IRQ_HANDLED; } +#define BATT_WARM_CURRENT 900 +#define BATT_WARM_VOLTAGE 15 static irqreturn_t batt_warm_handler(int irq, void *_chip) { @@ -6176,6 +6400,10 @@ static irqreturn_t batt_warm_handler(int irq, void *_chip) smbchg_read(chip, ®, chip->bat_if_base + RT_STS, 1); chip->batt_warm = !!(reg & HOT_BAT_SOFT_BIT); pr_smb(PR_INTERRUPT, "triggered: 0x%02x\n", reg); + smbchg_fastchg_current_comp_set(chip, + BATT_WARM_CURRENT); + smbchg_float_voltage_comp_set(chip, + BATT_WARM_VOLTAGE); smbchg_parallel_usb_check_ok(chip); if (chip->psy_registered) power_supply_changed(&chip->batt_psy); @@ -6184,6 +6412,8 @@ static irqreturn_t batt_warm_handler(int irq, void *_chip) return IRQ_HANDLED; } +#define BATT_COOL_CURRENT 900 +#define BATT_COOL_VOLTAGE 5 static irqreturn_t batt_cool_handler(int irq, void *_chip) { struct smbchg_chip *chip = _chip; @@ -6191,7 +6421,27 @@ static irqreturn_t batt_cool_handler(int irq, void *_chip) smbchg_read(chip, ®, chip->bat_if_base + RT_STS, 1); chip->batt_cool = !!(reg & COLD_BAT_SOFT_BIT); - pr_smb(PR_INTERRUPT, "triggered: 0x%02x\n", reg); + pr_smb(PR_INTERRUPT, "triggered: 0x%02x, batt_cool=%d\n", reg, chip->batt_cool); +#if defined(CONFIG_D1_ROSY) + + if (chip->batt_cool) { + if (chip->fcc_batt_cool_ma > 0) { + vote(chip->fcc_votable, RESTRICTED_CHG_FCC_VOTER, true, chip->fcc_batt_cool_ma); + } + } else { + in_cool_low = false; + in_cool_high = false; + vote(chip->fcc_votable, RESTRICTED_CHG_FCC_VOTER, true, chip->cfg_fastchg_current_ma); + } + +#else + if (chip->batt_cool) { + smbchg_fastchg_current_comp_set(chip, + BATT_COOL_CURRENT); + smbchg_float_voltage_comp_set(chip, + BATT_COOL_VOLTAGE); + } +#endif smbchg_parallel_usb_check_ok(chip); if (chip->psy_registered) power_supply_changed(&chip->batt_psy); @@ -6436,6 +6686,13 @@ static irqreturn_t usbin_uv_handler(int irq, void *_chip) int aicl_level = smbchg_get_aicl_level_ma(chip); int rc; u8 reg; + bool usb_present = is_usb_present(chip); + + + pr_err( + "chip->usb_present = %d rt_sts = 0x%02x aicl = %d\n", + chip->usb_present, reg, aicl_level); + pr_err("CHG %s, chip->usb_present = %d usb_present = %d\n", __func__, chip->usb_present, usb_present); rc = smbchg_read(chip, ®, chip->usb_chgpth_base + RT_STS, 1); if (rc) { @@ -6567,9 +6824,15 @@ static irqreturn_t src_detect_handler(int irq, void *_chip) if (src_detect) { update_usb_status(chip, usb_present, 0); +#if defined(CONFIG_D1_ROSY) + smbchg_stay_awake(chip, PM_CHARGER_ONLINE); +#endif } else { update_usb_status(chip, 0, false); chip->aicl_irq_count = 0; +#if defined(CONFIG_D1_ROSY) + smbchg_relax(chip, PM_CHARGER_ONLINE); +#endif } out: return IRQ_HANDLED; @@ -6810,6 +7073,7 @@ static inline int get_bpd(const char *name) #define OTG_PIN_CTRL_RID_DIS 0x04 #define OTG_CMD_CTRL_RID_EN 0x08 #define AICL_ADC_BIT BIT(6) +#define OTG_CURRENT_REG SMB_MASK(1, 0) static void batt_ov_wa_check(struct smbchg_chip *chip) { int rc; @@ -6854,6 +7118,26 @@ static void batt_ov_wa_check(struct smbchg_chip *chip) } } + +#if defined(CONFIG_D1_ROSY) +#define CCMP_CFG 0xFA +#define COLD_SL_FV_COMP BIT(2) +#define COLD_SL_CHG_I_COMP BIT(0) +static int smbchg_cold_soft_limit_comp_dis_set(struct smbchg_chip *chip) +{ + int rc; + + rc = smbchg_sec_masked_write(chip, chip->chgr_base + CCMP_CFG, + COLD_SL_FV_COMP | COLD_SL_CHG_I_COMP, 0); + if (rc) + dev_err(chip->dev, "Couldn't set COLD_SL_FV_COMP and COLD_SL_CHG_I_COMP rc = %d\n", + rc); + + return rc; +} +#endif + + static int smbchg_hw_init(struct smbchg_chip *chip) { int rc, i; @@ -7091,6 +7375,17 @@ static int smbchg_hw_init(struct smbchg_chip *chip) } } + +#if defined(CONFIG_D1_ROSY) + rc = smbchg_cold_soft_limit_comp_dis_set(chip); + if (rc) { + dev_err(chip->dev, "Couldn't set cold_soft_limit_comp_dis rc = %d\n", + rc); + return rc; + } +#endif + + /* make the buck switch faster to prevent some vbus oscillation */ rc = smbchg_sec_masked_write(chip, chip->usb_chgpth_base + TR_8OR32B, @@ -7259,6 +7554,27 @@ static int smbchg_hw_init(struct smbchg_chip *chip) return rc; } } +#if defined(CONFIG_D1_ROSY) + + rc = smbchg_sec_masked_write(chip, chip->otg_base + 0xF3, + OTG_CURRENT_REG, 0x1); + if (rc < 0) { + dev_err(chip->dev, "Couldn't set OTG current config rc = %d\n", + rc); + return rc; + } + +#else + + rc = smbchg_sec_masked_write(chip, chip->otg_base + 0xF3, + OTG_CURRENT_REG, 0x2); + if (rc < 0) { + dev_err(chip->dev, "Couldn't set OTG current config rc = %d\n", + rc); + return rc; + } + +#endif if (chip->wa_flags & SMBCHG_BATT_OV_WA) batt_ov_wa_check(chip); @@ -7423,6 +7739,18 @@ static int smb_parse_dt(struct smbchg_chip *chip) if (chip->cfg_fastchg_current_ma == -EINVAL) chip->cfg_fastchg_current_ma = DEFAULT_FCC_MA; OF_PROP_READ(chip, chip->vfloat_mv, "float-voltage-mv", rc, 1); + if (area_version_flag == 1) + chip->vfloat_mv = 4380; + + #ifdef CONFIG_DISABLE_TEMP_PROTECT + chip->vfloat_mv = 4100; + #endif + + OF_PROP_READ(chip, chip->customize_cool_low_limit, "customize-cool-low-limit", rc, 1); + OF_PROP_READ(chip, chip->customize_cool_high_limit, "customize-cool-high-limit", rc, 1); + OF_PROP_READ(chip, chip->fcc_customize_cool_ma, "fastchg-current-customize-cool", rc, 1); + OF_PROP_READ(chip, chip->fcc_batt_cool_ma, "fastchg-current-bat-cool", rc, 1); + OF_PROP_READ(chip, chip->safety_time, "charging-timeout-mins", rc, 1); OF_PROP_READ(chip, chip->vled_max_uv, "vled-max-uv", rc, 1); if (chip->vled_max_uv < 0) @@ -7492,6 +7820,7 @@ static int smb_parse_dt(struct smbchg_chip *chip) "qcom,soft-vfloat-comp-disabled"); chip->chg_enabled = !(of_property_read_bool(node, "qcom,charging-disabled")); + chip->call_state = 1; chip->charge_unknown_battery = of_property_read_bool(node, "qcom,charge-unknown-battery"); chip->chg_inhibit_en = of_property_read_bool(node, @@ -8004,6 +8333,109 @@ static int smbchg_check_chg_version(struct smbchg_chip *chip) return 0; } + +static int period_ms; +static int set_period_ms(const char *val, struct kernel_param *kp) +{ + int ret; + + ret = param_set_int(val, kp); + if (ret) { + pr_err("error setting value %d\n", ret); + return ret; + } + if (wt_chip) { + pr_info("set_period_ms to %d\n", period_ms); + cancel_delayed_work_sync(&wt_chip->period_update_work); + schedule_delayed_work(&wt_chip->period_update_work, + round_jiffies_relative(msecs_to_jiffies + (period_ms))); + return 0; + } + return -EINVAL; +} +module_param_call(period_ms, set_period_ms, param_get_uint, + &period_ms, 0644); + +#define LOW_SOC_HEARTBEAT_MS 20000 +#define HEARTBEAT_MS 60000 +#define OFFCHG_FORCE_POWEROFF_DELTA HZ*60*10 +#define NORMAL_FORCE_POWEROFF_DELTA HZ*60*1 +static void period_update(struct work_struct *work) +{ + struct delayed_work *dwork = to_delayed_work(work); + struct smbchg_chip *chip = container_of(dwork, + struct smbchg_chip, period_update_work); + + int period = 500; + int temp, voltage, cap, status, charge_type, present, chg_current, usb_present, usb_current; + static int old_temp; + static int old_cap; + static int old_status; + static int old_present; + static int old_usb_present; + static int printk_counter; + + union power_supply_propval prop = {0,}; + int vbus; + + if (chip == NULL) { + pr_err("pmic fatal error:the_chip=null\n!!"); + return; + } + + if (smbchg_debug_mask == 0xFF) + dump_regs(chip); + + temp = get_prop_batt_temp(chip)/10; + voltage = get_prop_batt_voltage_now(chip)/1000; + cap = get_prop_batt_capacity(chip); + status = get_prop_batt_status(chip); + charge_type = get_prop_charge_type(chip); + present = get_prop_batt_present(chip); + chg_current = get_prop_batt_current_now(chip); + usb_present = is_usb_present(chip); + usb_current = smbchg_get_iusb(chip); + + chip->usb_psy->get_property(chip->usb_psy, POWER_SUPPLY_PROP_VOLTAGE_NOW, &prop); + vbus = prop.intval; + + printk_counter++; + /*if heatbeat_ms is bigger than 500ms,must output the logs directly.*/ + if ((period_ms >= 500) || (abs(temp-old_temp) >= 1) || (old_cap != cap) || (old_status != status) + || (old_present != present) || (old_usb_present != usb_present) || (printk_counter >= 5)) { + pr_info("***temp=%d,vol=%d,cap=%d,status=%d,chg_state=%d,current=%d,present=%d,usb_present=%d\n", + temp, voltage, cap, status, charge_type, chg_current, present, usb_present); + + pr_info("***present=%d,usb_present=%d,usb_current=%d, Vbus=%d\n", + present, usb_present, usb_current, vbus); + + + old_temp = temp; + old_cap = cap; + old_status = status; + old_present = present; + old_usb_present = usb_present; + printk_counter = 0; + } + + power_supply_changed(&chip->batt_psy); + + if (period_ms >= 500) { + period = period_ms; + } else { + if (cap <= 5) + period = LOW_SOC_HEARTBEAT_MS; + else + period = HEARTBEAT_MS; + } + + schedule_delayed_work(&chip->period_update_work, + round_jiffies_relative(msecs_to_jiffies + (period))); +} + + static void rerun_hvdcp_det_if_necessary(struct smbchg_chip *chip) { enum power_supply_type usb_supply_type; @@ -8184,10 +8616,14 @@ static int smbchg_probe(struct spmi_device *spmi) return PTR_ERR(chip->hvdcp_enable_votable); INIT_WORK(&chip->usb_set_online_work, smbchg_usb_update_online_work); + INIT_DELAYED_WORK(&chip->period_update_work, period_update); INIT_DELAYED_WORK(&chip->parallel_en_work, smbchg_parallel_usb_en_work); INIT_DELAYED_WORK(&chip->vfloat_adjust_work, smbchg_vfloat_adjust_work); INIT_DELAYED_WORK(&chip->hvdcp_det_work, smbchg_hvdcp_det_work); + + INIT_DELAYED_WORK(&chip->monitor_charging_temp_5_work, smbchg_monitor_charging_temp_5_work); + init_completion(&chip->src_det_lowered); init_completion(&chip->src_det_raised); init_completion(&chip->usbin_uv_lowered); @@ -8212,6 +8648,8 @@ static int smbchg_probe(struct spmi_device *spmi) mutex_init(&chip->usb_status_lock); device_init_wakeup(chip->dev, true); + get_area_version(chip); + rc = smbchg_parse_peripherals(chip); if (rc) { dev_err(chip->dev, "Error parsing DT peripherals: %d\n", rc); @@ -8331,6 +8769,8 @@ static int smbchg_probe(struct spmi_device *spmi) chip->revision[ANA_MAJOR], chip->revision[ANA_MINOR], get_prop_batt_present(chip), chip->dc_present, chip->usb_present); + schedule_delayed_work(&chip->period_update_work, + round_jiffies_relative(msecs_to_jiffies(HEARTBEAT_MS))); return 0; unregister_led_class: @@ -8398,11 +8838,9 @@ static void smbchg_shutdown(struct spmi_device *spmi) disable_irq(chip->otg_oc_irq); disable_irq(chip->power_ok_irq); disable_irq(chip->recharge_irq); - disable_irq(chip->src_detect_irq); disable_irq(chip->taper_irq); disable_irq(chip->usbid_change_irq); disable_irq(chip->usbin_ov_irq); - disable_irq(chip->usbin_uv_irq); disable_irq(chip->vbat_low_irq); disable_irq(chip->wdog_timeout_irq); @@ -8460,6 +8898,9 @@ static void smbchg_shutdown(struct spmi_device *spmi) if (rc < 0) pr_err("Couldn't fake insertion rc=%d\n", rc); + disable_irq(chip->src_detect_irq); + disable_irq(chip->usbin_uv_irq); + pr_smb(PR_MISC, "Wait 1S to settle\n"); msleep(1000); chip->hvdcp_3_det_ignore_uv = false; diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c index ee3e72b3537ac..4350fa5ed6f97 100644 --- a/drivers/power/reset/msm-poweroff.c +++ b/drivers/power/reset/msm-poweroff.c @@ -1,4 +1,5 @@ /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -55,7 +56,9 @@ static void __iomem *msm_ps_hold; static phys_addr_t tcsr_boot_misc_detect; static void scm_disable_sdi(void); -#ifdef CONFIG_MSM_DLOAD_MODE +#if defined(WT_FINAL_RELEASE) +static int download_mode; +#elif defined(CONFIG_MSM_DLOAD_MODE) /* Runtime could be only changed value once. * There is no API from TZ to re-enable the registers. * So the SDI cannot be re-enabled when it already by-passed. @@ -154,17 +157,18 @@ static bool get_dload_mode(void) static void enable_emergency_dload_mode(void) { +#ifdef WT_COMPILE_FACTORY_VERSION int ret; if (emergency_dload_mode_addr) { __raw_writel(EMERGENCY_DLOAD_MAGIC1, - emergency_dload_mode_addr); + emergency_dload_mode_addr); __raw_writel(EMERGENCY_DLOAD_MAGIC2, - emergency_dload_mode_addr + - sizeof(unsigned int)); + emergency_dload_mode_addr + + sizeof(unsigned int)); __raw_writel(EMERGENCY_DLOAD_MAGIC3, - emergency_dload_mode_addr + - (2 * sizeof(unsigned int))); + emergency_dload_mode_addr + + (2 * sizeof(unsigned int))); /* Need disable the pmic wdt, then the emergency dload mode * will not auto reset. */ @@ -175,6 +179,9 @@ static void enable_emergency_dload_mode(void) ret = scm_set_dload_mode(SCM_EDLOAD_MODE, 0); if (ret) pr_err("Failed to set secure EDLOAD mode: %d\n", ret); +#else + pr_err("Failed to set secure EDLOAD mode: Xiaomi Required\n"); +#endif } static int dload_set(const char *val, struct kernel_param *kp) @@ -216,6 +223,7 @@ static bool get_dload_mode(void) static void scm_disable_sdi(void) { +#ifdef WT_FINAL_RELEASE int ret; struct scm_desc desc = { .args[0] = 1, @@ -232,6 +240,7 @@ static void scm_disable_sdi(void) SCM_WDOG_DEBUG_BOOT_PART), &desc); if (ret) pr_err("Failed to disable secure wdog debug: %d\n", ret); +#endif } void msm_set_restart_mode(int mode) @@ -264,6 +273,17 @@ static void halt_spmi_pmic_arbiter(void) } } +static bool device_locked_flag; +static int __init device_locked(char *str) +{ + if (strcmp(str, "1")) + device_locked_flag = false; + else + device_locked_flag = true; + return 1; +} +__setup("device_locked=", device_locked); + static void msm_restart_prepare(const char *cmd) { bool need_warm_reset = false; @@ -281,12 +301,12 @@ static void msm_restart_prepare(const char *cmd) if (qpnp_pon_check_hard_reset_stored()) { /* Set warm reset as true when device is in dload mode */ - if (get_dload_mode() || + if (get_dload_mode() || in_panic || ((cmd != NULL && cmd[0] != '\0') && !strcmp(cmd, "edl"))) need_warm_reset = true; } else { - need_warm_reset = (get_dload_mode() || + need_warm_reset = (get_dload_mode() || in_panic || (cmd != NULL && cmd[0] != '\0')); } @@ -297,7 +317,11 @@ static void msm_restart_prepare(const char *cmd) qpnp_pon_system_pwr_off(PON_POWER_OFF_HARD_RESET); } - if (cmd != NULL) { + if (in_panic) { + qpnp_pon_system_pwr_off(PON_POWER_OFF_WARM_RESET); + qpnp_pon_set_restart_reason(PON_RESTART_REASON_PANIC); + __raw_writel(0x77665504, restart_reason); + } else if (cmd != NULL) { if (!strncmp(cmd, "bootloader", 10)) { qpnp_pon_set_restart_reason( PON_RESTART_REASON_BOOTLOADER); @@ -322,6 +346,8 @@ static void msm_restart_prepare(const char *cmd) qpnp_pon_set_restart_reason( PON_RESTART_REASON_KEYS_CLEAR); __raw_writel(0x7766550a, restart_reason); + } else if (!strncmp(cmd, "fastmmi", 7)) { + __raw_writel(0x77665505, restart_reason); } else if (!strncmp(cmd, "oem-", 4)) { unsigned long code; int ret; @@ -329,11 +355,20 @@ static void msm_restart_prepare(const char *cmd) if (!ret) __raw_writel(0x6f656d00 | (code & 0xff), restart_reason); +#ifdef WT_COMPILE_FACTORY_VERSION } else if (!strncmp(cmd, "edl", 3)) { - enable_emergency_dload_mode(); + enable_emergency_dload_mode(); +#else + } else if (!strncmp(cmd, "edl", 3) && !device_locked_flag) { + enable_emergency_dload_mode(); +#endif } else { + qpnp_pon_set_restart_reason(PON_RESTART_REASON_NORMAL); __raw_writel(0x77665501, restart_reason); } + } else { + qpnp_pon_set_restart_reason(PON_RESTART_REASON_NORMAL); + __raw_writel(0x77665501, restart_reason); } flush_cache_all(); @@ -397,6 +432,8 @@ static void do_msm_poweroff(void) pr_notice("Powering off the SoC\n"); set_dload_mode(0); + qpnp_pon_set_restart_reason(PON_RESTART_REASON_UNKNOWN); + __raw_writel(0x0, restart_reason); scm_disable_sdi(); qpnp_pon_system_pwr_off(PON_POWER_OFF_SHUTDOWN); @@ -569,6 +606,9 @@ static int msm_restart_probe(struct platform_device *pdev) if (mem) tcsr_boot_misc_detect = mem->start; + + qpnp_pon_set_restart_reason(PON_RESTART_REASON_UNKNOWN); + __raw_writel(0x77665506, restart_reason); pm_power_off = do_msm_poweroff; arm_pm_restart = do_msm_restart; diff --git a/drivers/power/smb358-charger.c b/drivers/power/smb358-charger.c index 75cf2f964ca10..396742b14081b 100644 --- a/drivers/power/smb358-charger.c +++ b/drivers/power/smb358-charger.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved. +/* Copyright (c) 2014 The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -29,6 +30,15 @@ #include #include +#include +#include +#include +#include + +#include +#include + + #define _SMB358_MASK(BITS, POS) \ ((unsigned char)(((1 << (BITS)) - 1) << (POS))) #define SMB358_MASK(LEFT_BIT_POS, RIGHT_BIT_POS) \ @@ -48,6 +58,7 @@ #define OTHER_CTRL_REG 0x9 #define FAULT_INT_REG 0xC #define STATUS_INT_REG 0xD +#define OTG_CONTROL_REG 0xA /* Command registers */ #define CMD_A_REG 0x30 @@ -90,6 +101,10 @@ #define CHG_CTRL_APSD_EN_MASK BIT(2) #define CHG_ITERM_MASK 0x07 #define CHG_PIN_CTRL_USBCS_REG_BIT 0x0 +#define OTG_CURRENT_CONTROL_BIT2 BIT(2) +#define OTG_CURRENT_CONTROL_BIT3 BIT(3) + + /* This is to select if use external pin EN to control CHG */ #define CHG_PIN_CTRL_CHG_EN_LOW_PIN_BIT SMB358_MASK(6, 5) #define CHG_PIN_CTRL_CHG_EN_LOW_REG_BIT 0x0 @@ -175,17 +190,40 @@ #define SMB358_FAST_CHG_MAX_MA 2000 #define SMB358_FAST_CHG_SHIFT 5 #define SMB_FAST_CHG_CURRENT_MASK 0xE0 -#define SMB358_DEFAULT_BATT_CAPACITY 50 +#define SMB358_DEFAULT_BATT_CAPACITY 10 #define SMB358_BATT_GOOD_THRE_2P5 0x1 +#ifdef CONFIG_C3N_SMB358 +#define BATTERY_FCC 3030 +#else +#define BATTERY_FCC 3000 +#endif + + +int pre_usb_current_ma = -EINVAL; +bool thermal = false; +bool recovery = false; +int fastmmi_mode = 0; + +#define DEBUG + +extern struct device_node *of_batterydata_get_best_profile( + const struct device_node *batterydata_container_node, + const char *psy_name, const char *batt_type); + + + enum { - USER = BIT(0), - THERMAL = BIT(1), - CURRENT = BIT(2), - SOC = BIT(3), - FAKE_BATTERY = BIT(4), + USER = BIT(0), + THERMAL = BIT(1), + CURRENT = BIT(2), + SOC = BIT(3), }; +enum path_type { + USB, + DC, +}; struct smb358_regulator { struct regulator_desc rdesc; struct regulator_dev *rdev; @@ -208,26 +246,28 @@ struct smb358_charger { bool chg_autonomous_mode; bool disable_apsd; bool using_pmic_therm; - bool pmic_vbat_sns; bool battery_missing; const char *bms_psy_name; bool resume_completed; bool irq_waiting; bool bms_controlled_charging; - bool skip_usb_suspend_for_fake_battery; struct mutex read_write_lock; struct mutex path_suspend_lock; struct mutex irq_complete; + struct wake_lock wake_lock_hightemp; u8 irq_cfg_mask[2]; + u8 power_ok; int irq_gpio; int charging_disabled; int fastchg_current_max_ma; - unsigned int cool_bat_ma; + + int psy_usb_ma; + + unsigned int cool_cold_bat_ma; + unsigned int cool_normal_bat_ma; unsigned int warm_bat_ma; unsigned int cool_bat_mv; unsigned int warm_bat_mv; - unsigned int connected_rid; - /* debugfs related */ #if defined(CONFIG_DEBUG_FS) struct dentry *debug_root; @@ -240,16 +280,20 @@ struct smb358_charger { bool batt_warm; bool batt_cool; bool jeita_supported; + int psy_health_sts; int charging_disabled_status; int usb_suspended; /* power supply */ struct power_supply *usb_psy; struct power_supply *bms_psy; + struct power_supply *rk_bat; struct power_supply batt_psy; /* otg 5V regulator */ struct smb358_regulator otg_vreg; + struct work_struct batt_temp_work; + struct alarm batt_temp_alarm; /* adc_tm paramters */ struct qpnp_vadc_chip *vadc_dev; @@ -260,10 +304,34 @@ struct smb358_charger { int cool_bat_decidegc; int warm_bat_decidegc; int bat_present_decidegc; + unsigned int thermal_levels; + unsigned int therm_lvl_sel; + int *thermal_mitigation; + struct mutex current_change_lock; /* i2c pull up regulator */ struct regulator *vcc_i2c; + unsigned int fcc_mah; + const char *battery_type; + + + struct delayed_work abnormal_detect; }; +int hot_status = 0; +int cold_status = 0; +int warm_status = 0; +int cool_status = 0; + +int cool_status_5 = 0; + +static int smb358_charging_disable(struct smb358_charger *chip, + int reason, int disable); +static int smb358_get_prop_batt_temp(struct smb358_charger *chip); +static void smb358_chg_set_appropriate_vddmax( + struct smb358_charger *chip); +static void smb358_chg_set_appropriate_battery_current( + struct smb358_charger *chip); + struct smb_irq_info { const char *name; int (*smb_irq)(struct smb358_charger *chip, @@ -292,6 +360,8 @@ static char *pm_batt_supplied_to[] = { "bms", }; +static void dump_regs(struct smb358_charger *chip); + static int __smb358_read_reg(struct smb358_charger *chip, u8 reg, u8 *val) { s32 ret; @@ -384,6 +454,241 @@ static int smb358_enable_volatile_writes(struct smb358_charger *chip) return rc; } + +static int disable_software_temp_monitor; +int dis_sof_temp_monitor_set(const char *val, const struct kernel_param *kp) +{ + if (!val) + val = "1"; + return strtobool(val, kp->arg); +} + +int dis_sof_temp_monitor_get(char *buffer, const struct kernel_param *kp) +{ + disable_software_temp_monitor = 1; + return sprintf(buffer, "%c", *(bool *)kp->arg ? 'Y' : 'N'); +} + +static struct kernel_param_ops dis_sof_temp_monitor_ops = { + .set = dis_sof_temp_monitor_set, + .get = dis_sof_temp_monitor_get, +}; + +module_param_cb(disable_software_temp_monitor, &dis_sof_temp_monitor_ops + , &disable_software_temp_monitor, 0644); + +MODULE_PARM_DESC(debug, "1:disable software temp monitor , 0:enable,default:0"); + + + +#define DELAY_COUNT 3 +#define VFLT_300MV 0x0C +#define VFLT_200MV 0x08 +#define VFLT_100MV 0x04 +#define VFLT_50MV 0x00 +#define VFLT_MASK 0x0C +static void qpnp_lbc_temp_alarm_work_fn(struct work_struct *work) +{ + ktime_t kt; + int batt_temp = 250; + u64 monitor_second = 10LL*NSEC_PER_SEC; + static int disabled_delay_times = DELAY_COUNT; + static int enabled_delay_times = DELAY_COUNT; + static int chg_enabled1; + static int chg_enabled2; + static int chg_enabled3; + static int chg_disabled; + u8 reg = 0; + int rc; + + struct smb358_charger *chip = container_of(work, struct smb358_charger, batt_temp_work); + + smb358_read_reg(chip, IRQ_E_REG, ®); + if (!reg) { + chip->chg_present = true; + power_supply_set_present(chip->usb_psy, chip->chg_present); + } else { + chip->chg_present = false; + smb358_charging_disable(chip, THERMAL, 1); + power_supply_set_present(chip->usb_psy, chip->chg_present); + } + + + if (!chip->chg_present) { + enabled_delay_times = DELAY_COUNT; + disabled_delay_times = DELAY_COUNT; + chg_disabled = 0; + chg_enabled1 = 0; + chg_enabled2 = 0; + chg_enabled3 = 0; + hot_status = 0; + cold_status = 0; + + + + pr_err("wgz usb plug out or charge done\n"); + goto exit; + } + + if (disable_software_temp_monitor) { + smb358_charging_disable(chip, THERMAL, 0); + enabled_delay_times = DELAY_COUNT; + disabled_delay_times = DELAY_COUNT; + chg_disabled = 0; + chg_enabled1 = 0; + chg_enabled2 = 0; + chg_enabled3 = 0; + hot_status = 0; + cold_status = 0; + warm_status = 0; + cool_status = 0; + goto out; + } + + batt_temp = smb358_get_prop_batt_temp(chip); + pr_err("wgz temp = %d , disabled_delay_times = %d , enabled_delay_times = %d\n" + , batt_temp , disabled_delay_times , enabled_delay_times); + + if (batt_temp >= 0 && batt_temp <= 150) { + reg = VFLT_100MV; + rc = smb358_masked_write(chip, CHG_OTH_CURRENT_CTRL_REG, + VFLT_MASK, reg); + if (rc) { + dev_err(chip->dev, + "Couldn't set inhibit threshold rc = %d\n", rc); + } + } + + + if ((batt_temp > 550 || batt_temp < 0) && !chg_disabled) { + wake_lock(&chip->wake_lock_hightemp); + if ((disabled_delay_times++) >= DELAY_COUNT) { + pr_err("wgz temp high disable charger\n"); + enabled_delay_times = 0; + disabled_delay_times = 0; + chg_disabled = 1; + chg_enabled1 = 0; + chg_enabled2 = 0; + chg_enabled3 = 0; + if (batt_temp > 550) { + pr_err("battery is too hot\n"); + hot_status = 1; + cold_status = 0; + warm_status = 0; + cool_status = 0; + } else if (batt_temp < 0) { + pr_err("battery is too cold\n"); + hot_status = 0; + cold_status = 1; + warm_status = 0; + cool_status = 0; + } + smb358_charging_disable(chip, THERMAL, 1); + wake_unlock(&chip->wake_lock_hightemp); + power_supply_changed(&chip->batt_psy); + } + } else if (((batt_temp > 450 && batt_temp <= 550) || (batt_temp > 50 && batt_temp <= 150)) && !chg_enabled1) { + wake_lock(&chip->wake_lock_hightemp); + if ((disabled_delay_times++) >= DELAY_COUNT) { + enabled_delay_times = 0; + disabled_delay_times = 0; + chg_disabled = 0; + chg_enabled1 = 1; + chg_enabled2 = 0; + chg_enabled3 = 0; + + if (batt_temp > 450 && batt_temp <= 550) { + pr_err("battery is too warm\n"); + hot_status = 0; + cold_status = 0; + warm_status = 1; + cool_status = 0; + } else if (batt_temp > 50 && batt_temp <= 150) { + pr_err("battery is too cool_normal\n"); + hot_status = 0; + cold_status = 0; + warm_status = 0; + cool_status = 1; + cool_status_5 = 2; + } + + smb358_charging_disable(chip, THERMAL, 0); + smb358_chg_set_appropriate_battery_current(chip); + smb358_chg_set_appropriate_vddmax(chip); + wake_unlock(&chip->wake_lock_hightemp); + power_supply_changed(&chip->batt_psy); + } + } + + else if ((!chg_enabled3) && ((batt_temp >= 0) && (batt_temp <= 50))) { + wake_lock(&chip->wake_lock_hightemp); + if ((disabled_delay_times++) >= DELAY_COUNT) { + pr_err("battery is too cool_cold\n"); + enabled_delay_times = 0; + disabled_delay_times = 0; + chg_disabled = 0; + chg_enabled1 = 0; + chg_enabled2 = 0; + chg_enabled3 = 1; + + hot_status = 0; + cold_status = 0; + warm_status = 0; + cool_status = 1; + cool_status_5 = 1; + smb358_chg_set_appropriate_battery_current(chip); + smb358_chg_set_appropriate_vddmax(chip); + wake_unlock(&chip->wake_lock_hightemp); + power_supply_changed(&chip->batt_psy); + } + } + + else if ((!chg_enabled2) && ((batt_temp > 150) && (batt_temp <= 450))) { + { + wake_lock(&chip->wake_lock_hightemp); + if (enabled_delay_times++ == DELAY_COUNT) { + pr_err("battery is normal\n"); + enabled_delay_times = 0; + disabled_delay_times = 0; + chg_disabled = 0; + chg_enabled1 = 0; + chg_enabled2 = 1; + chg_enabled3 = 0; + + smb358_charging_disable(chip, THERMAL, 0); + hot_status = 0; + cold_status = 0; + warm_status = 0; + cool_status = 0; + smb358_chg_set_appropriate_battery_current(chip); + smb358_chg_set_appropriate_vddmax(chip); + wake_unlock(&chip->wake_lock_hightemp); + power_supply_changed(&chip->batt_psy); + } + } + } +out: + kt = ns_to_ktime(monitor_second); + alarm_start_relative(&chip->batt_temp_alarm, kt); +exit: + pm_relax(chip->dev); +} + + +static enum alarmtimer_restart batt_temp_alarm_callback(struct alarm *alarm, + ktime_t now) +{ + struct smb358_charger *chip = container_of(alarm, struct smb358_charger, + batt_temp_alarm); + + pr_err("wgz %s:%d\n" , __FUNCTION__ , __LINE__); + pm_stay_awake(chip->dev); + schedule_work(&chip->batt_temp_work); + + return ALARMTIMER_NORESTART; +} + + static int smb358_fastchg_current_set(struct smb358_charger *chip, unsigned int fastchg_current) { @@ -391,7 +696,7 @@ static int smb358_fastchg_current_set(struct smb358_charger *chip, if ((fastchg_current < SMB358_FAST_CHG_MIN_MA) || (fastchg_current > SMB358_FAST_CHG_MAX_MA)) { - dev_dbg(chip->dev, "bad fastchg current mA=%d asked to set\n", + pr_debug("bad fastchg current mA=%d asked to set\n", fastchg_current); return -EINVAL; } @@ -408,7 +713,7 @@ static int smb358_fastchg_current_set(struct smb358_charger *chip, } i = i << SMB358_FAST_CHG_SHIFT; - dev_dbg(chip->dev, "fastchg limit=%d setting %02x\n", + pr_debug("fastchg limit=%d setting %02x\n", fastchg_current, i); return smb358_masked_write(chip, CHG_CURRENT_CTRL_REG, @@ -568,6 +873,15 @@ static int smb358_chg_otg_regulator_enable(struct regulator_dev *rdev) if (rc) dev_err(chip->dev, "Couldn't enable OTG mode rc=%d, reg=%2x\n", rc, CMD_A_REG); + + + rc = smb358_masked_write(chip, OTG_CONTROL_REG, OTG_CURRENT_CONTROL_BIT2, + OTG_CURRENT_CONTROL_BIT2); + if (rc) + dev_err(chip->dev, "Couldn't enable OTG current control rc=%d, reg=%2x\n", + rc, OTG_CONTROL_REG); + + return rc; } @@ -646,53 +960,6 @@ static int smb358_regulator_init(struct smb358_charger *chip) return rc; } -static int __smb358_path_suspend(struct smb358_charger *chip, bool suspend) -{ - int rc; - - rc = smb358_masked_write(chip, CMD_A_REG, CMD_A_CHG_SUSP_EN_MASK, - suspend ? CMD_A_CHG_SUSP_EN_BIT : 0); - if (rc < 0) - dev_err(chip->dev, "Couldn't set CMD_A reg, rc = %d\n", rc); - - return rc; -} - -static int smb358_path_suspend(struct smb358_charger *chip, int reason, - bool suspend) -{ - int rc = 0; - int suspended; - - mutex_lock(&chip->path_suspend_lock); - suspended = chip->usb_suspended; - - if (suspend == false) - suspended &= ~reason; - else - suspended |= reason; - - if (!chip->usb_suspended && suspended) { - rc = __smb358_path_suspend(chip, true); - chip->usb_suspended = suspended; - power_supply_set_online(chip->usb_psy, !chip->usb_suspended); - power_supply_changed(chip->usb_psy); - } else if (chip->usb_suspended && !suspended) { - rc = __smb358_path_suspend(chip, false); - chip->usb_suspended = suspended; - power_supply_set_online(chip->usb_psy, !chip->usb_suspended); - power_supply_changed(chip->usb_psy); - } - - if (rc) - dev_err(chip->dev, "Couldn't set/unset suspend rc = %d\n", rc); - - mutex_unlock(&chip->path_suspend_lock); - - return rc; -} - - static int __smb358_charging_disable(struct smb358_charger *chip, bool disable) { int rc; @@ -711,6 +978,9 @@ static int smb358_charging_disable(struct smb358_charger *chip, int rc = 0; int disabled; + if (disable == true) { + pre_usb_current_ma = -EINVAL; + } disabled = chip->charging_disabled_status; pr_debug("reason = %d requested_disable = %d disabled_status = %d\n", @@ -738,19 +1008,17 @@ static int smb358_charging_disable(struct smb358_charger *chip, return rc; } -#define MAX_INV_BATT_ID 7700 -#define MIN_INV_BATT_ID 7300 static int smb358_hw_init(struct smb358_charger *chip) { int rc; u8 reg = 0, mask = 0; /* - * If the charger is pre-configured for autonomous operation, - * do not apply additonal settings - */ + * If the charger is pre-configured for autonomous operation, + * do not apply additonal settings + */ if (chip->chg_autonomous_mode) { - dev_dbg(chip->dev, "Charger configured for autonomous mode\n"); + pr_debug("Charger configured for autonomous mode\n"); return 0; } @@ -792,9 +1060,6 @@ static int smb358_hw_init(struct smb358_charger *chip) if (!chip->disable_apsd) reg = CHG_CTRL_APSD_EN_BIT; - else - reg = 0; - rc = smb358_masked_write(chip, CHG_CTRL_REG, CHG_CTRL_APSD_EN_MASK, reg); if (rc) { @@ -853,17 +1118,6 @@ static int smb358_hw_init(struct smb358_charger *chip) if (rc) dev_err(chip->dev, "Couldn't set recharge para rc=%d\n", rc); - /* suspend USB path for fake battery */ - if (!chip->skip_usb_suspend_for_fake_battery) { - if ((chip->connected_rid >= MIN_INV_BATT_ID) && - (chip->connected_rid <= MAX_INV_BATT_ID)) { - rc = smb358_path_suspend(chip, FAKE_BATTERY, true); - if (!rc) - dev_info(chip->dev, - "Suspended USB path reason FAKE_BATTERY\n"); - } - } - /* enable/disable charging */ if (chip->charging_disabled) { rc = smb358_charging_disable(chip, USER, 1); @@ -872,9 +1126,9 @@ static int smb358_hw_init(struct smb358_charger *chip) chip->charging_disabled ? "disable" : "enable", rc); } else { /* - * Enable charging explictly, - * because not sure the default behavior. - */ + * Enable charging explictly, + * because not sure the default behavior. + */ rc = __smb358_charging_disable(chip, 0); if (rc) dev_err(chip->dev, "Couldn't enable charging\n"); @@ -908,6 +1162,12 @@ static enum power_supply_property smb358_battery_properties[] = { POWER_SUPPLY_PROP_MODEL_NAME, POWER_SUPPLY_PROP_TEMP, POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CURRENT_NOW, + POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, + POWER_SUPPLY_PROP_CHARGE_FULL, + POWER_SUPPLY_PROP_BATTERY_TYPE, + POWER_SUPPLY_PROP_RESISTANCE_ID, }; static int smb358_get_prop_batt_status(struct smb358_charger *chip) @@ -915,23 +1175,23 @@ static int smb358_get_prop_batt_status(struct smb358_charger *chip) int rc; u8 reg = 0; - if (chip->batt_full) - return POWER_SUPPLY_STATUS_FULL; - rc = smb358_read_reg(chip, STATUS_C_REG, ®); + pr_debug("XXX::smb358_get_prop_batt_status:reg=0x%x\r\n", reg); if (rc) { dev_err(chip->dev, "Couldn't read STAT_C rc = %d\n", rc); return POWER_SUPPLY_STATUS_UNKNOWN; } - dev_dbg(chip->dev, "%s: STATUS_C_REG=%x\n", __func__, reg); + pr_debug("%s: STATUS_C_REG=%x\n", __func__, reg); - if (reg & STATUS_C_CHG_HOLD_OFF_BIT) - return POWER_SUPPLY_STATUS_NOT_CHARGING; + if ((chip->batt_full)) + return POWER_SUPPLY_STATUS_FULL; if ((reg & STATUS_C_CHARGING_MASK) && !(reg & STATUS_C_CHG_ERR_STATUS_BIT)) return POWER_SUPPLY_STATUS_CHARGING; + if ((reg & STATUS_C_CHG_HOLD_OFF_BIT) || !chip->power_ok) + return POWER_SUPPLY_STATUS_NOT_CHARGING; return POWER_SUPPLY_STATUS_DISCHARGING; } @@ -941,6 +1201,7 @@ static int smb358_get_prop_batt_present(struct smb358_charger *chip) return !chip->battery_missing; } +static struct power_supply *cw2015_psy; static int smb358_get_prop_batt_capacity(struct smb358_charger *chip) { union power_supply_propval ret = {0, }; @@ -948,17 +1209,41 @@ static int smb358_get_prop_batt_capacity(struct smb358_charger *chip) if (chip->fake_battery_soc >= 0) return chip->fake_battery_soc; + if (!cw2015_psy) + cw2015_psy = power_supply_get_by_name("rk-bat"); + if (cw2015_psy) { + cw2015_psy->get_property(cw2015_psy, + POWER_SUPPLY_PROP_CAPACITY, &ret); + pr_err("CW2015_BATTERY_CAPACITY IS:%d\n", ret.intval); + return ret.intval; + } + if (chip->bms_psy) { chip->bms_psy->get_property(chip->bms_psy, POWER_SUPPLY_PROP_CAPACITY, &ret); + pr_err("BMS_BATTERY_CAPACITY IS:%d\n", ret.intval); return ret.intval; + } - dev_dbg(chip->dev, - "Couldn't get bms_psy, return default capacity\n"); + pr_debug("Couldn't get bms_psy, return default capacity\n"); return SMB358_DEFAULT_BATT_CAPACITY; } +static int get_prop_current_now(struct smb358_charger *chip) +{ + union power_supply_propval ret = {0,}; + if (chip->bms_psy) { + chip->bms_psy->get_property(chip->bms_psy, + POWER_SUPPLY_PROP_CURRENT_NOW, &ret); + pr_debug("xujismbcur = %d\n", ret.intval); + return ret.intval; + } else { + pr_debug("No BMS supply registered return 0\n"); + } + return 1000; +} + static int smb358_get_prop_charge_type(struct smb358_charger *chip) { int rc; @@ -970,7 +1255,7 @@ static int smb358_get_prop_charge_type(struct smb358_charger *chip) return POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; } - dev_dbg(chip->dev, "%s: STATUS_C_REG=%x\n", __func__, reg); + pr_debug("%s: STATUS_C_REG=%x\n", __func__, reg); reg &= STATUS_C_CHARGING_MASK; @@ -987,18 +1272,24 @@ static int smb358_get_prop_charge_type(struct smb358_charger *chip) static int smb358_get_prop_batt_health(struct smb358_charger *chip) { union power_supply_propval ret = {0, }; - - if (chip->batt_hot) - ret.intval = POWER_SUPPLY_HEALTH_OVERHEAT; - else if (chip->batt_cold) - ret.intval = POWER_SUPPLY_HEALTH_COLD; - else if (chip->batt_warm) - ret.intval = POWER_SUPPLY_HEALTH_WARM; - else if (chip->batt_cool) - ret.intval = POWER_SUPPLY_HEALTH_COOL; + if (!disable_software_temp_monitor) { + if (hot_status == 1) + return POWER_SUPPLY_HEALTH_OVERHEAT; + if (cold_status == 1) + return POWER_SUPPLY_HEALTH_COLD; + if (cool_status == 1) + return POWER_SUPPLY_HEALTH_COOL; + if (warm_status == 1) + return POWER_SUPPLY_HEALTH_WARM; + else if (chip->psy_health_sts == POWER_SUPPLY_HEALTH_OVERVOLTAGE) + ret.intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; + else + ret.intval = POWER_SUPPLY_HEALTH_GOOD; + } else - ret.intval = POWER_SUPPLY_HEALTH_GOOD; + ret.intval = POWER_SUPPLY_HEALTH_GOOD; + pr_err("battery health is %d\n", ret.intval); return ret.intval; } @@ -1008,52 +1299,146 @@ static int smb358_get_prop_batt_temp(struct smb358_charger *chip) int rc = 0; struct qpnp_vadc_result results; - if (!smb358_get_prop_batt_present(chip) - || !chip->vadc_dev - || !chip->using_pmic_therm) + if (!smb358_get_prop_batt_present(chip)) return DEFAULT_TEMP; - rc = qpnp_vadc_read(chip->vadc_dev, LR_MUX1_BATT_THERM, &results); + rc = qpnp_vadc_read(chip->vadc_dev, P_MUX2_1_1, &results); if (rc) { pr_debug("Unable to read batt temperature rc=%d\n", rc); return DEFAULT_TEMP; } - pr_debug("get_bat_temp %d, %lld\n", + pr_err("get_bat_temp %d, %lld\n", results.adc_code, results.physical); - return (int)results.physical; + #ifdef CONFIG_DISABLE_TEMP_PROTECT + pr_err("WINGTECH disable temp protect version; real temp:%lld\n", results.physical*10); + return 250; + #endif + if (results.physical*10 > 46 && results.physical*10 < 51) + return results.physical * 10 + 4; + else if (results.physical*10 > 51 && results.physical*10 < 56) + return results.physical*10 + 6; + else + return results.physical*10; + + } +int battid_resister = 0; +#define DEFAULT_RESISTER 50 + + + int smb358_get_prop_battid_resister(struct smb358_charger *chip) +{ + int rc = 0; + struct qpnp_vadc_result results; + + rc = qpnp_vadc_read(chip->vadc_dev, P_MUX4_1_1, &results); + if (rc) { + pr_debug("Unable to read batt resister rc=%d\n", rc); + return DEFAULT_RESISTER; + } + battid_resister = (results.physical)*68/(1800000 - results.physical); + pr_debug("battid_resister = %d\n", battid_resister); + + return battid_resister; +} + +#define SMB358_DEFAULT_BATT_VOLTAGE 4000 + static int smb358_get_prop_battery_voltage_now(struct smb358_charger *chip) +{ + + union power_supply_propval ret = {0, }; + + if (chip->fake_battery_soc >= 0) + return chip->fake_battery_soc; + + if (!cw2015_psy) + cw2015_psy = power_supply_get_by_name("rk-bat"); + if (cw2015_psy) { + cw2015_psy->get_property(cw2015_psy, + POWER_SUPPLY_PROP_VOLTAGE_NOW, &ret); + pr_err("POWER_SUPPLY_PROP_VOLTAGE_NOW IS:%d\n", ret.intval); + return ret.intval; + } + pr_debug("Couldn't get bms_psy, return default capacity\n"); + return SMB358_DEFAULT_BATT_VOLTAGE; +} + +static int __smb358_path_suspend(struct smb358_charger *chip, bool suspend) +{ + int rc; + + rc = smb358_masked_write(chip, CMD_A_REG, + CMD_A_CHG_SUSP_EN_MASK, + suspend ? CMD_A_CHG_SUSP_EN_BIT : 0); + if (rc < 0) + dev_err(chip->dev, "Couldn't set CMD_A reg, rc = %d\n", rc); + return rc; +} + +static int smb358_path_suspend(struct smb358_charger *chip, int reason, + bool suspend) { int rc = 0; - struct qpnp_vadc_result results; + int suspended; - if (!chip->vadc_dev || !chip->pmic_vbat_sns) - return 0; + mutex_lock(&chip->path_suspend_lock); + suspended = chip->usb_suspended; - rc = qpnp_vadc_read(chip->vadc_dev, VBAT_SNS, &results); - if (rc) { - pr_err("Unable to read vbat rc=%d\n", rc); - return 0; + if (suspend == false) + suspended &= ~reason; + else + suspended |= reason; + + if (!chip->usb_suspended && suspended) { + rc = __smb358_path_suspend(chip, true); + chip->usb_suspended = suspended; + power_supply_set_online(chip->usb_psy, !chip->usb_suspended); + power_supply_changed(chip->usb_psy); + } else if (chip->usb_suspended && !suspended) { + rc = __smb358_path_suspend(chip, false); + chip->usb_suspended = suspended; + power_supply_set_online(chip->usb_psy, !chip->usb_suspended); + power_supply_changed(chip->usb_psy); } - return results.physical; + + if (rc) + dev_err(chip->dev, "Couldn't set/unset suspend rc = %d\n", rc); + + mutex_unlock(&chip->path_suspend_lock); + return rc; } static int smb358_set_usb_chg_current(struct smb358_charger *chip, - int current_ma) + int curr_ma) { int i, rc = 0; u8 reg1 = 0, reg2 = 0, mask = 0; + int current_ma; - dev_dbg(chip->dev, "%s: USB current_ma = %d\n", __func__, current_ma); + pr_debug("%s: USB current_ma = %d\n", __func__, curr_ma); if (chip->chg_autonomous_mode) { - dev_dbg(chip->dev, "%s: Charger in autonmous mode\n", __func__); + pr_debug("%s: Charger in autonmous mode\n", __func__); return 0; } + if (recovery != true && curr_ma == pre_usb_current_ma) { + return 0; + } + recovery = false; + + if (thermal == false) { + current_ma = curr_ma; + pre_usb_current_ma = curr_ma; + pr_debug("current ma1 is %d\n", current_ma); + } else { + current_ma = min(curr_ma, chip->thermal_mitigation[chip->therm_lvl_sel]); + pr_debug("current ma2 is %d\n", current_ma); + } if (current_ma < USB3_MIN_CURRENT_MA && current_ma != 2) current_ma = USB2_MIN_CURRENT_MA; @@ -1088,7 +1473,12 @@ static int smb358_set_usb_chg_current(struct smb358_charger *chip, if (rc) dev_err(chip->dev, "Couldn't set input mA rc=%d\n", rc); } - + mask = 0; + rc = __smb358_write_reg(chip, CMD_B_REG, mask); + if (rc) { + dev_err(chip->dev, + "smb358_write Failed: reg=%03X, rc=%d\n", CMD_B_REG, rc); + } mask = CMD_B_CHG_HC_ENABLE_BIT | CMD_B_CHG_USB_500_900_ENABLE_BIT; rc = smb358_masked_write(chip, CMD_B_REG, mask, reg2); if (rc < 0) @@ -1120,6 +1510,7 @@ smb358_batt_property_is_writeable(struct power_supply *psy, switch (psp) { case POWER_SUPPLY_PROP_CHARGING_ENABLED: case POWER_SUPPLY_PROP_CAPACITY: + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: return 1; default: break; @@ -1135,6 +1526,106 @@ static int bound_soc(int soc) return soc; } +static int smb358_set_appropriate_current(struct smb358_charger *chip, + enum path_type path) +{ + int therm_ma; + + + int rc = 0; + + if (!chip->usb_psy && path == USB) + return 0; + /* + * If battery is absent do not modify the current at all, these + * would be some appropriate values set by the bootloader or default + * configuration and since it is the only source of power we should + * not change it + */ + if (chip->battery_missing) { + pr_debug("ignoring current request since battery is absent\n"); + return 0; + } + + #if 0 + if (path == USB) { + path_current = chip->usb_psy_ma; + func = smb135x_set_usb_chg_current; + } else { + path_current = chip->dc_psy_ma; + func = smb135x_set_dc_chg_current; + if (chip->dc_psy_type == -EINVAL) + func = NULL; + } + #endif + + if (chip->therm_lvl_sel >= 0 + && chip->therm_lvl_sel <= (chip->thermal_levels - 1)) { /* + * consider thermal limit only when it is active and not at + * the highest level + */ + therm_ma = chip->thermal_mitigation[chip->therm_lvl_sel]; + if (chip->therm_lvl_sel == 0) { + thermal = false; + recovery = true; + } else { + thermal = true; + } + } else { + + pr_debug("Not effective thermal levels\n"); + pr_debug("therm_ma is %d\n", therm_ma); + } + + + therm_ma = min(therm_ma, chip->psy_usb_ma); + pr_debug("therm_ma is %d\n", therm_ma); + pr_debug("chip->psy_usb_ma is %d\n", chip->psy_usb_ma); + pr_debug("thermal limited charging current to %d\n", therm_ma); + + smb358_set_usb_chg_current(chip, therm_ma); + return rc; +} + + +static int smb358_system_temp_level_set(struct smb358_charger *chip, + int lvl_sel) +{ + int rc = 0; + int prev_therm_lvl; + + if (!chip->thermal_mitigation) { + pr_err("Thermal mitigation not supported\n"); + return -EINVAL; + } + + if (lvl_sel < 0) { + pr_err("Unsupported level selected %d\n", lvl_sel); + return -EINVAL; + } + + if (lvl_sel >= chip->thermal_levels) { + pr_err("Unsupported level selected %d forcing %d\n", lvl_sel, + chip->thermal_levels - 1); + lvl_sel = chip->thermal_levels - 1; + } + + if (lvl_sel == chip->therm_lvl_sel) + return 0; + + mutex_lock(&chip->current_change_lock); + prev_therm_lvl = chip->therm_lvl_sel; + chip->therm_lvl_sel = lvl_sel; + pr_debug("chip->therm_lvl_sel = %d\n", chip->therm_lvl_sel); + + smb358_set_appropriate_current(chip, USB); + + mutex_unlock(&chip->current_change_lock); + return rc; +} + + + static int smb358_battery_set_property(struct power_supply *psy, enum power_supply_property prop, const union power_supply_propval *val) @@ -1156,14 +1647,16 @@ static int smb358_battery_set_property(struct power_supply *psy, rc); } else { chip->batt_full = true; - dev_dbg(chip->dev, "status = FULL, batt_full = %d\n", + + pr_debug("status = FULL, batt_full = %d\n", chip->batt_full); } break; case POWER_SUPPLY_STATUS_DISCHARGING: chip->batt_full = false; + power_supply_changed(&chip->batt_psy); - dev_dbg(chip->dev, "status = DISCHARGING, batt_full = %d\n", + pr_debug("status = DISCHARGING, batt_full = %d\n", chip->batt_full); break; case POWER_SUPPLY_STATUS_CHARGING: @@ -1174,7 +1667,8 @@ static int smb358_battery_set_property(struct power_supply *psy, rc); } else { chip->batt_full = false; - dev_dbg(chip->dev, "status = CHARGING, batt_full = %d\n", + + pr_debug("status = CHARGING, batt_full = %d\n", chip->batt_full); } break; @@ -1190,6 +1684,9 @@ static int smb358_battery_set_property(struct power_supply *psy, chip->fake_battery_soc = bound_soc(val->intval); power_supply_changed(&chip->batt_psy); break; + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: + smb358_system_temp_level_set(chip, val->intval); + break; default: return -EINVAL; } @@ -1198,8 +1695,8 @@ static int smb358_battery_set_property(struct power_supply *psy, } static int smb358_battery_get_property(struct power_supply *psy, - enum power_supply_property prop, - union power_supply_propval *val) + enum power_supply_property prop, + union power_supply_propval *val) { struct smb358_charger *chip = container_of(psy, struct smb358_charger, batt_psy); @@ -1224,17 +1721,35 @@ static int smb358_battery_get_property(struct power_supply *psy, val->intval = smb358_get_prop_batt_health(chip); break; case POWER_SUPPLY_PROP_TECHNOLOGY: - val->intval = POWER_SUPPLY_TECHNOLOGY_LION; + val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; break; case POWER_SUPPLY_PROP_MODEL_NAME: val->strval = "SMB358"; break; + case POWER_SUPPLY_PROP_BATTERY_TYPE: + val->strval = (chip->battery_type); + break; + case POWER_SUPPLY_PROP_RESISTANCE_ID: + val->intval = smb358_get_prop_battid_resister(chip); + break; case POWER_SUPPLY_PROP_TEMP: val->intval = smb358_get_prop_batt_temp(chip); break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: val->intval = smb358_get_prop_battery_voltage_now(chip); break; + case POWER_SUPPLY_PROP_CURRENT_NOW: + val->intval = get_prop_current_now(chip); + break; + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: + val->intval = chip->therm_lvl_sel; + break; + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + val->intval = chip->fcc_mah; + break; + case POWER_SUPPLY_PROP_CHARGE_FULL: + val->intval = chip->fcc_mah; + break; default: return -EINVAL; } @@ -1248,13 +1763,13 @@ static int apsd_complete(struct smb358_charger *chip, u8 status) enum power_supply_type type = POWER_SUPPLY_TYPE_UNKNOWN; /* - * If apsd is disabled, charger detection is done by - * DCIN UV irq. - * status = ZERO - indicates charger removed, handled - * by DCIN UV irq - */ + * If apsd is disabled, charger detection is done by + * DCIN UV irq. + * status = ZERO - indicates charger removed, handled + * by DCIN UV irq + */ if (chip->disable_apsd || status == 0) { - dev_dbg(chip->dev, "APSD %s, status = %d\n", + pr_debug("APSD %s, status = %d\n", chip->disable_apsd ? "disabled" : "enabled", !!status); return 0; } @@ -1265,7 +1780,7 @@ static int apsd_complete(struct smb358_charger *chip, u8 status) return rc; } - dev_dbg(chip->dev, "%s: STATUS_D_REG=%x\n", __func__, reg); + pr_debug("%s: STATUS_D_REG=%x\n", __func__, reg); switch (reg & STATUS_D_CHARGING_PORT_MASK) { case STATUS_D_PORT_ACA_DOCK: @@ -1293,13 +1808,13 @@ static int apsd_complete(struct smb358_charger *chip, u8 status) chip->chg_present = !!status; - dev_dbg(chip->dev, "APSD complete. USB type detected=%d chg_present=%d", + pr_debug("APSD complete. USB type detected=%d chg_present=%d", type, chip->chg_present); power_supply_set_supply_type(chip->usb_psy, type); - /* SMB is now done sampling the D+/D- lines, indicate USB driver */ - dev_dbg(chip->dev, "%s updating usb_psy present=%d", __func__, + /* SMB is now done sampling the D+/D- lines, indicate USB driver */ + pr_err("%s pluginupdating usb_psy present=%d", __func__, chip->chg_present); power_supply_set_present(chip->usb_psy, chip->chg_present); @@ -1309,16 +1824,22 @@ static int apsd_complete(struct smb358_charger *chip, u8 status) static int chg_uv(struct smb358_charger *chip, u8 status) { int rc; + ktime_t kt; /* use this to detect USB insertion only if !apsd */ if (chip->disable_apsd && status == 0) { + kt = ns_to_ktime(1LL*NSEC_PER_SEC); + alarm_start_relative(&chip->batt_temp_alarm, kt); chip->chg_present = true; - dev_dbg(chip->dev, "%s updating usb_psy present=%d", + pre_usb_current_ma = -EINVAL; + + pr_err("%s pluginupdating usb_psy present=%d", __func__, chip->chg_present); - power_supply_set_supply_type(chip->usb_psy, - POWER_SUPPLY_TYPE_USB); + + + power_supply_set_present(chip->usb_psy, chip->chg_present); - if (chip->bms_controlled_charging) { + if (chip->bms_controlled_charging) /* * Disable SOC based USB suspend to enable charging on * USB insertion. @@ -1326,35 +1847,41 @@ static int chg_uv(struct smb358_charger *chip, u8 status) rc = smb358_charging_disable(chip, SOC, false); if (rc < 0) dev_err(chip->dev, - "Couldn't disable usb suspend rc = %d\n", - rc); - } + "Couldn't disable usb suspend rc = %d\n", + rc); } if (status != 0) { chip->chg_present = false; - dev_dbg(chip->dev, "%s updating usb_psy present=%d", + pre_usb_current_ma = -EINVAL; + + pr_err("%s plugoutupdating usb_psy present=%d", __func__, chip->chg_present); /* we can't set usb_psy as UNKNOWN here, will lead USERSPACE issue */ + smb358_charging_disable(chip, THERMAL, 1); + + kt = ns_to_ktime(0); + alarm_start_relative(&chip->batt_temp_alarm, kt); power_supply_set_present(chip->usb_psy, chip->chg_present); } power_supply_changed(chip->usb_psy); - dev_dbg(chip->dev, "chip->chg_present = %d\n", chip->chg_present); + pr_debug("chip->chg_present = %d\n", chip->chg_present); return 0; } static int chg_ov(struct smb358_charger *chip, u8 status) { - u8 psy_health_sts; + + if (status) - psy_health_sts = POWER_SUPPLY_HEALTH_OVERVOLTAGE; + chip->psy_health_sts = POWER_SUPPLY_HEALTH_OVERVOLTAGE; else - psy_health_sts = POWER_SUPPLY_HEALTH_GOOD; + chip->psy_health_sts = POWER_SUPPLY_HEALTH_GOOD; power_supply_set_health_state( - chip->usb_psy, psy_health_sts); + chip->usb_psy, chip->psy_health_sts); power_supply_changed(chip->usb_psy); return 0; @@ -1363,16 +1890,18 @@ static int chg_ov(struct smb358_charger *chip, u8 status) #define STATUS_FAST_CHARGING BIT(6) static int fast_chg(struct smb358_charger *chip, u8 status) { - dev_dbg(chip->dev, "%s\n", __func__); + pr_debug("%s\n", __func__); - if (status & STATUS_FAST_CHARGING) + if (status & STATUS_FAST_CHARGING) { chip->batt_full = false; + + } return 0; } static int chg_term(struct smb358_charger *chip, u8 status) { - dev_dbg(chip->dev, "%s\n", __func__); + pr_debug("%s\n", __func__); if (!chip->iterm_disabled) chip->batt_full = !!status; return 0; @@ -1380,13 +1909,13 @@ static int chg_term(struct smb358_charger *chip, u8 status) static int taper_chg(struct smb358_charger *chip, u8 status) { - dev_dbg(chip->dev, "%s\n", __func__); + pr_debug("%s\n", __func__); return 0; } static int chg_recharge(struct smb358_charger *chip, u8 status) { - dev_dbg(chip->dev, "%s, status = %d\n", __func__, !!status); + pr_debug("%s, status = %d\n", __func__, !!status); /* to check the status mean */ chip->batt_full = !status; return 0; @@ -1398,13 +1927,19 @@ static void smb358_chg_set_appropriate_battery_current( int rc; unsigned int current_max = chip->fastchg_current_max_ma; - if (chip->batt_cool) - current_max = - min(current_max, chip->cool_bat_ma); - if (chip->batt_warm) + if (cool_status) { + if (cool_status_5 == 1) + current_max = + min(current_max, chip->cool_cold_bat_ma); + if (cool_status_5 == 2) + current_max = + min(current_max, chip->cool_normal_bat_ma); + } + + if (warm_status) current_max = min(current_max, chip->warm_bat_ma); - dev_dbg(chip->dev, "setting %dmA", current_max); + pr_debug("setting %dmA", current_max); rc = smb358_fastchg_current_set(chip, current_max); if (rc) dev_err(chip->dev, @@ -1417,19 +1952,22 @@ static void smb358_chg_set_appropriate_vddmax( int rc; unsigned int vddmax = chip->vfloat_mv; - if (chip->batt_cool) + if (cool_status) vddmax = min(vddmax, chip->cool_bat_mv); - if (chip->batt_warm) + if (warm_status) vddmax = min(vddmax, chip->warm_bat_mv); - dev_dbg(chip->dev, "setting %dmV\n", vddmax); + #ifdef CONFIG_DISABLE_TEMP_PROTECT + vddmax = 4100; + #endif + pr_debug("setting %dmV\n", vddmax); rc = smb358_float_voltage_set(chip, vddmax); if (rc) dev_err(chip->dev, "Couldn't set float voltage rc = %d\n", rc); } -#define HYSTERESIS_DECIDEGC 20 +#define HYSTERESIS_DECIDEGC 0 static void smb_chg_adc_notification(enum qpnp_tm_state state, void *ctx) { struct smb358_charger *chip = ctx; @@ -1442,7 +1980,7 @@ static void smb_chg_adc_notification(enum qpnp_tm_state state, void *ctx) return; } - temp = smb358_get_prop_batt_temp(chip); + temp = 250; pr_debug("temp = %d state = %s\n", temp, state == ADC_TM_WARM_STATE ? "hot" : "cold"); @@ -1592,7 +2130,7 @@ static void smb_chg_adc_notification(enum qpnp_tm_state state, void *ctx) chip->batt_hot = bat_hot; chip->batt_cold = bat_cold; /* stop charging explicitly since we use PMIC thermal pin*/ - if (bat_hot || bat_cold || chip->battery_missing) + if ((bat_hot || bat_cold || chip->battery_missing) && !disable_software_temp_monitor) smb358_charging_disable(chip, THERMAL, 1); else smb358_charging_disable(chip, THERMAL, 0); @@ -1646,6 +2184,19 @@ static int battery_missing(struct smb358_charger *chip, u8 status) return 0; } +/** + * power_ok_handler() - called when the switcher turns on or turns off + * @chip: pointer to smb135x_chg chip + * @rt_stat: the status bit indicating switcher turning on or off + */ +static int power_ok_handler(struct smb358_charger *chip, u8 rt_stat) +{ + chip->power_ok = !!rt_stat; + msleep(30); + power_supply_changed(&chip->batt_psy); + return 0; +} + static struct irq_handler_info handlers[] = { [0] = { .stat_reg = IRQ_A_REG, @@ -1761,6 +2312,7 @@ static struct irq_handler_info handlers[] = { .irq_info = { { .name = "power_ok", + .smb_irq = power_ok_handler, }, { .name = "otg_det", @@ -1778,6 +2330,39 @@ static struct irq_handler_info handlers[] = { #define IRQ_LATCHED_MASK 0x02 #define IRQ_STATUS_MASK 0x01 #define BITS_PER_IRQ 2 +static int smb358_update_power_on_state(struct smb358_charger *chip) +{ + int i, j; + int rc; + u8 rt_stat, prev_rt_stat, changed; + struct smb_irq_info *info; + for (i = 0; i < ARRAY_SIZE(handlers); i++) { + if (handlers[i].stat_reg == IRQ_F_REG) { + rc = smb358_read_reg(chip, handlers[i].stat_reg, + &handlers[i].val); + if (rc < 0) { + dev_err(chip->dev, "Couldn't read %d rc = %d\n", + handlers[i].stat_reg, rc); + return -EPERM; + } + info = handlers[i].irq_info; + for (j = 0; j < ARRAY_SIZE(handlers[i].irq_info); j++) { + if (!strcmp(info[j].name, "power_ok")) { + rt_stat = handlers[i].val + & (IRQ_STATUS_MASK << (j * BITS_PER_IRQ)); + prev_rt_stat = handlers[i].prev_val & (IRQ_STATUS_MASK << (j * BITS_PER_IRQ)); + changed = prev_rt_stat ^ rt_stat; + if (changed) { + handlers[i].prev_val = handlers[i].val; + chip->power_ok = rt_stat; + pr_debug("chip->power_ok = %d\n", chip->power_ok); + } + } + } + } + } + return 0; +} static irqreturn_t smb358_chg_stat_handler(int irq, void *dev_id) { struct smb358_charger *chip = dev_id; @@ -1787,18 +2372,15 @@ static irqreturn_t smb358_chg_stat_handler(int irq, void *dev_id) u8 rt_stat, prev_rt_stat; int rc; int handler_count = 0; - mutex_lock(&chip->irq_complete); - chip->irq_waiting = true; if (!chip->resume_completed) { - dev_dbg(chip->dev, "IRQ triggered before device-resume\n"); + pr_debug("IRQ triggered before device-resume\n"); disable_irq_nosync(irq); mutex_unlock(&chip->irq_complete); return IRQ_HANDLED; } chip->irq_waiting = false; - for (i = 0; i < ARRAY_SIZE(handlers); i++) { rc = smb358_read_reg(chip, handlers[i].stat_reg, &handlers[i].val); @@ -1810,7 +2392,7 @@ static irqreturn_t smb358_chg_stat_handler(int irq, void *dev_id) for (j = 0; j < ARRAY_SIZE(handlers[i].irq_info); j++) { triggered = handlers[i].val - & (IRQ_LATCHED_MASK << (j * BITS_PER_IRQ)); + & (IRQ_LATCHED_MASK << (j * BITS_PER_IRQ)); rt_stat = handlers[i].val & (IRQ_STATUS_MASK << (j * BITS_PER_IRQ)); prev_rt_stat = handlers[i].prev_val @@ -1834,13 +2416,11 @@ static irqreturn_t smb358_chg_stat_handler(int irq, void *dev_id) } handlers[i].prev_val = handlers[i].val; } - pr_debug("handler count = %d\n", handler_count); if (handler_count) { pr_debug("batt psy changed\n"); power_supply_changed(&chip->batt_psy); } - mutex_unlock(&chip->irq_complete); return IRQ_HANDLED; @@ -1859,15 +2439,18 @@ static irqreturn_t smb358_chg_valid_handler(int irq, void *dev_id) } present ^= chip->chg_valid_act_low; - dev_dbg(chip->dev, "%s: chg_present = %d\n", __func__, present); + pr_debug("%s: chg_present = %d\n", __func__, present); if (present != chip->chg_present) { chip->chg_present = present; - dev_dbg(chip->dev, "%s updating usb_psy present=%d", + pre_usb_current_ma = -EINVAL; + + pr_debug("%s updating usb_psy present=%d", __func__, chip->chg_present); power_supply_set_present(chip->usb_psy, chip->chg_present); + power_supply_changed(&chip->batt_psy); } - + pr_debug("smb358_chg_valid_handler has been started\n"); return IRQ_HANDLED; } @@ -1877,6 +2460,11 @@ static void smb358_external_power_changed(struct power_supply *psy) struct smb358_charger, batt_psy); union power_supply_propval prop = {0,}; int rc, current_limit = 0; + int vol; + + dump_regs(chip); + vol = smb358_get_prop_battery_voltage_now(chip); + pr_debug("batt_vol = %d\n", vol); if (chip->bms_psy_name) chip->bms_psy = @@ -1890,11 +2478,14 @@ static void smb358_external_power_changed(struct power_supply *psy) else current_limit = prop.intval / 1000; - + chip->psy_usb_ma = current_limit; smb358_enable_volatile_writes(chip); smb358_set_usb_chg_current(chip, current_limit); - dev_dbg(chip->dev, "current_limit = %d\n", current_limit); + smb358_chg_set_appropriate_battery_current(chip); + smb358_chg_set_appropriate_vddmax(chip); + + pr_debug("current_limit = %d\n", current_limit); } #if defined(CONFIG_DEBUG_FS) @@ -2005,7 +2596,7 @@ static int show_irq_count(struct seq_file *m, void *data) seq_printf(m, "%s=%d\t(high=%d low=%d)\n", handlers[i].irq_info[j].name, handlers[i].irq_info[j].high - + handlers[i].irq_info[j].low, + + handlers[i].irq_info[j].low, handlers[i].irq_info[j].high, handlers[i].irq_info[j].low); total += (handlers[i].irq_info[j].high @@ -2117,59 +2708,34 @@ static void dump_regs(struct smb358_charger *chip) } #endif -static int smb_parse_batt_id(struct smb358_charger *chip) +extern int battery_type_id; +static const char *default_batt_type = "Generic_Battery"; +static int smb_parse_dt_battery(struct smb358_charger *chip) { - int rc = 0, rpull = 0, vref = 0; - int64_t denom, batt_id_uv, numerator; - struct device_node *node = chip->dev->of_node; - struct qpnp_vadc_result result; - - rc = of_property_read_u32(node, "qcom,batt-id-vref-uv", &vref); - if (rc < 0) { - dev_err(chip->dev, - "Couldn't read batt-id-vref-uv rc=%d\n", rc); - return rc; - } - - rc = of_property_read_u32(node, "qcom,batt-id-rpullup-kohm", &rpull); - if (rc < 0) { - dev_err(chip->dev, - "Couldn't read batt-id-rpullup-kohm rc=%d\n", rc); - return rc; - } - /* read battery ID */ - rc = qpnp_vadc_read(chip->vadc_dev, LR_MUX2_BAT_ID, &result); - if (rc) { - dev_err(chip->dev, - "Couldn't read batt id channel=%d, rc=%d\n", - LR_MUX2_BAT_ID, rc); - return rc; - } - batt_id_uv = result.physical; + struct device_node *node = chip->dev->of_node; + struct device_node *batt_node, *profile_node; - if (batt_id_uv == 0) { - /*vadc not correct or batt id line grounded, report 0 kohms */ - dev_warn(chip->dev, "batt_id_uv=0, batt-id grounded\n"); + batt_node = of_find_node_by_name(node, "qcom,battery-data"); + if (!batt_node) { return 0; } + profile_node = of_batterydata_get_best_profile(batt_node, + "battery", NULL); - numerator = batt_id_uv * rpull * 1000; - denom = vref - batt_id_uv; - - /* batt id connector might be open, return 0 kohms */ - if (denom == 0) - return 0; - - chip->connected_rid = div64_s64(numerator, denom); + if (battery_type_id == 1 || battery_type_id == 2) + of_property_read_string(profile_node, "qcom,battery-type", &chip->battery_type); + else { + chip->battery_type = default_batt_type; + hardwareinfo_set_prop(HARDWARE_BATTERY_ID, chip->battery_type); + } + dev_err(chip->dev, "found battery type is %s\n", chip->battery_type); - dev_dbg(chip->dev, - "batt_id_voltage=%lld numerator=%lld denom=%lld connected_rid=%d\n", - batt_id_uv, numerator, denom, chip->connected_rid); return 0; } + static int smb_parse_dt(struct smb358_charger *chip) { int rc; @@ -2194,8 +2760,6 @@ static int smb_parse_dt(struct smb358_charger *chip) chip->using_pmic_therm = of_property_read_bool(node, "qcom,using-pmic-therm"); - chip->pmic_vbat_sns = of_property_read_bool(node, - "qcom,using-vbat-sns"); chip->bms_controlled_charging = of_property_read_bool(node, "qcom,bms-controlled-charging"); @@ -2207,7 +2771,7 @@ static int smb_parse_dt(struct smb358_charger *chip) chip->chg_valid_gpio = of_get_named_gpio_flags(node, "qcom,chg-valid-gpio", 0, &gpio_flags); if (!gpio_is_valid(chip->chg_valid_gpio)) - dev_dbg(chip->dev, "Invalid chg-valid-gpio"); + pr_debug("Invalid chg-valid-gpio"); else chip->chg_valid_act_low = gpio_flags & OF_GPIO_ACTIVE_LOW; @@ -2262,8 +2826,13 @@ static int smb_parse_dt(struct smb358_charger *chip) rc |= of_property_read_u32(node, "qcom,warm-bat-mv", &chip->warm_bat_mv); - rc |= of_property_read_u32(node, "qcom,cool-bat-ma", - &chip->cool_bat_ma); + /*rc |= of_property_read_u32(node, "qcom,cool-bat-ma", + &chip->cool_bat_ma);*/ + rc |= of_property_read_u32(node, "qcom,cool-cold-bat-ma", + &chip->cool_cold_bat_ma); + + rc |= of_property_read_u32(node, "qcom,cool-normal-bat-ma", + &chip->cool_normal_bat_ma); rc |= of_property_read_u32(node, "qcom,warm-bat-ma", &chip->warm_bat_ma); @@ -2273,6 +2842,27 @@ static int smb_parse_dt(struct smb358_charger *chip) chip->jeita_supported = true; } + if (of_find_property(node, "qcom,thermal-mitigation", + &chip->thermal_levels)) { + chip->thermal_mitigation = devm_kzalloc(chip->dev, + chip->thermal_levels, + GFP_KERNEL); + + if (chip->thermal_mitigation == NULL) { + pr_err("thermal mitigation kzalloc() failed.\n"); + return -ENOMEM; + } + + chip->thermal_levels /= sizeof(int); + rc = of_property_read_u32_array(node, + "qcom,thermal-mitigation", + chip->thermal_mitigation, chip->thermal_levels); + pr_debug("thermal_mitigations = %d, %d, %d, %d; thermal_levels = %d\n", chip->thermal_mitigation[0], chip->thermal_mitigation[1], chip->thermal_mitigation[2], chip->thermal_mitigation[3], chip->thermal_levels); + if (rc) { + pr_err("Couldn't read threm limits rc = %d\n", rc); + return rc; + } + } pr_debug("jeita_supported = %d", chip->jeita_supported); rc = of_property_read_u32(node, "qcom,bat-present-decidegc", @@ -2292,28 +2882,19 @@ static int smb_parse_dt(struct smb358_charger *chip) } } - chip->skip_usb_suspend_for_fake_battery = of_property_read_bool(node, - "qcom,skip-usb-suspend-for-fake-battery"); - if (!chip->skip_usb_suspend_for_fake_battery) { - if (!chip->vadc_dev) { - dev_err(chip->dev, - "VADC device not present with usb suspend on fake battery\n"); - return -EINVAL; - } - rc = smb_parse_batt_id(chip); - if (rc) { - dev_err(chip->dev, - "failed to read batt-id rc=%d\n", rc); - return rc; - } + rc = of_property_read_u32(node, "qcom,battery-fcc", + &chip->fcc_mah); + if (rc) { + chip->fcc_mah = BATTERY_FCC; } + pr_debug("inhibit-disabled = %d, recharge-disabled = %d, recharge-mv = %d,", chip->inhibit_disabled, chip->recharge_disabled, chip->recharge_mv); pr_debug("vfloat-mv = %d, iterm-disabled = %d,", - chip->vfloat_mv, chip->iterm_disabled); + chip->vfloat_mv, chip->iterm_ma); pr_debug("fastchg-current = %d, charging-disabled = %d,", chip->fastchg_current_max_ma, chip->charging_disabled); @@ -2322,6 +2903,7 @@ static int smb_parse_dt(struct smb358_charger *chip) chip->cold_bat_decidegc); pr_debug("hot-bat-degree = %d, bat-present-decidegc = %d\n", chip->hot_bat_decidegc, chip->bat_present_decidegc); + pr_debug("fcc_mah is %d \n", chip->fcc_mah); return 0; } @@ -2391,8 +2973,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) struct dentry *ent; ent = debugfs_create_file("config_registers", S_IFREG | S_IRUGO, - chip->debug_root, chip, - &cnfg_debugfs_ops); + chip->debug_root, chip, + &cnfg_debugfs_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2401,8 +2983,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_file("status_registers", S_IFREG | S_IRUGO, - chip->debug_root, chip, - &status_debugfs_ops); + chip->debug_root, chip, + &status_debugfs_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2411,8 +2993,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_file("cmd_registers", S_IFREG | S_IRUGO, - chip->debug_root, chip, - &cmd_debugfs_ops); + chip->debug_root, chip, + &cmd_debugfs_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2421,8 +3003,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_x32("address", S_IFREG | S_IWUSR | S_IRUGO, - chip->debug_root, - &(chip->peek_poke_address)); + chip->debug_root, + &(chip->peek_poke_address)); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2431,8 +3013,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_file("data", S_IFREG | S_IWUSR | S_IRUGO, - chip->debug_root, chip, - &poke_poke_debug_ops); + chip->debug_root, chip, + &poke_poke_debug_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2441,9 +3023,9 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_file("force_irq", - S_IFREG | S_IWUSR | S_IRUGO, - chip->debug_root, chip, - &force_irq_ops); + S_IFREG | S_IWUSR | S_IRUGO, + chip->debug_root, chip, + &force_irq_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2452,8 +3034,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_file("irq_count", S_IFREG | S_IRUGO, - chip->debug_root, chip, - &irq_count_debugfs_ops); + chip->debug_root, chip, + &irq_count_debugfs_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2468,16 +3050,89 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } #endif +int into_fastmmi_mode(struct smb358_charger *chip) +{ + int ret; + char *cmdline_fastmmi = NULL; + char *temp; + + cmdline_fastmmi = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_fastmmi != NULL) { + temp = cmdline_fastmmi + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + if (ret == 0) { + pr_err("into fastmmi mode\n"); + fastmmi_mode = 1; + return 1;/* fastmmi mode*/ + } else{ + pr_err("others modes\n"); + fastmmi_mode = 0; + return 2;/* Others mode*/ + } + } + pr_err("has no androidboot.mode \n"); + return 0; +} + +bool disable_charging = false; +void get_capacity_disable_charging(struct smb358_charger *chip) +{ + char *boardid_string = NULL; + char boardid_start[32] = " "; + int India_0; + int India_1; + + boardid_string = strstr(saved_command_line, "board_id="); + + if (boardid_string != NULL) { + strncpy(boardid_start, boardid_string+9, 9); + India_0 = strncmp(boardid_start, "S88503BA1", 9); + India_1 = strncmp(boardid_start, "S88503BB1", 9); + } + if (((India_0 == 0) || (India_1 == 0)) && (into_fastmmi_mode(chip) == 1)) { + disable_charging = true; + } else{ + pr_err("else discharg\n"); + disable_charging = false; + } +} +static void charger_abnormal_detect_work(struct work_struct *work) +{ + struct smb358_charger *chip = container_of(work, + struct smb358_charger, + abnormal_detect.work); + int rc, soc; + soc = smb358_get_prop_batt_capacity(chip); + get_capacity_disable_charging(chip); + if (into_fastmmi_mode(chip) == 1) { + if (disable_charging) { + if (soc >= 80 && soc <= 100) { + rc = smb358_charging_disable(chip, SOC, true); + if (rc < 0) { + dev_err(chip->dev, "Couldn't disable charging: rc = %d\n", rc); + } + } else if (soc >= 0 && soc < 80) { + rc = smb358_charging_disable(chip, SOC, false); + if (rc < 0) { + dev_err(chip->dev, "Couldn't enable charging: rc = %d\n", rc); + } + } + } + schedule_delayed_work(&chip->abnormal_detect, msecs_to_jiffies(20000)); + } +} + #define SMB_I2C_VTG_MIN_UV 1800000 #define SMB_I2C_VTG_MAX_UV 1800000 static int smb358_charger_probe(struct i2c_client *client, const struct i2c_device_id *id) { int rc, irq; + ktime_t kt; + struct smb358_charger *chip; struct power_supply *usb_psy; u8 reg = 0; - usb_psy = power_supply_get_by_name("usb"); if (!usb_psy) { dev_dbg(&client->dev, "USB psy not found; deferring probe\n"); @@ -2495,15 +3150,13 @@ static int smb358_charger_probe(struct i2c_client *client, chip->usb_psy = usb_psy; chip->fake_battery_soc = -EINVAL; - if (of_find_property(chip->dev->of_node, "qcom,chg-vadc", NULL)) { - /* early for VADC get, defer probe if needed */ - chip->vadc_dev = qpnp_get_vadc(chip->dev, "chg"); - if (IS_ERR(chip->vadc_dev)) { - rc = PTR_ERR(chip->vadc_dev); - if (rc != -EPROBE_DEFER) - pr_err("vadc property configured incorrectly\n"); - return rc; - } + /* early for VADC get, defer probe if needed */ + chip->vadc_dev = qpnp_get_vadc(chip->dev, "chg"); + if (IS_ERR(chip->vadc_dev)) { + rc = PTR_ERR(chip->vadc_dev); + if (rc != -EPROBE_DEFER) + pr_err("vadc property missing\n"); + return rc; } rc = smb_parse_dt(chip); @@ -2529,14 +3182,28 @@ static int smb358_charger_probe(struct i2c_client *client, dev_err(&client->dev, "Regulator vcc_i2c enable failed rc = %d\n", rc); - goto err_set_vtg_i2c; + pr_debug("first alarm start\n"); goto err_set_vtg_i2c; } } mutex_init(&chip->irq_complete); mutex_init(&chip->read_write_lock); mutex_init(&chip->path_suspend_lock); + mutex_init(&chip->current_change_lock); + wake_lock_init(&chip->wake_lock_hightemp, WAKE_LOCK_SUSPEND, "wake_lock_hightemp"); + + + + INIT_DELAYED_WORK(&chip->abnormal_detect, charger_abnormal_detect_work); + + + INIT_WORK(&chip->batt_temp_work, qpnp_lbc_temp_alarm_work_fn); + alarm_init(&chip->batt_temp_alarm, ALARM_REALTIME, batt_temp_alarm_callback); + if (chip->chg_present) { + kt = ns_to_ktime(5LL*NSEC_PER_SEC); + alarm_start_relative(&chip->batt_temp_alarm, kt); + } /* probe the device to check if its actually connected */ rc = smb358_read_reg(chip, CHG_OTH_CURRENT_CTRL_REG, ®); if (rc) { @@ -2571,6 +3238,14 @@ static int smb358_charger_probe(struct i2c_client *client, chip->resume_completed = true; + if (chip->bms_psy) { + chip->batt_psy.bms_psy_ok = 1; + } else { + chip->batt_psy.bms_psy_ok = 0; + } + + smb358_update_power_on_state(chip); + chip->batt_psy.bms_psy_ok = 0; rc = power_supply_register(chip->dev, &chip->batt_psy); if (rc < 0) { dev_err(&client->dev, "Couldn't register batt psy rc = %d\n", @@ -2586,6 +3261,11 @@ static int smb358_charger_probe(struct i2c_client *client, "Couldn't initialize smb358 ragulator rc=%d\n", rc); goto fail_regulator_register; } + rc = smb_parse_dt_battery(chip); + if (rc) { + dev_err(&client->dev, + " smb_parse_dt_battery rc=%d\n", rc); + } rc = smb358_hw_init(chip); if (rc) { @@ -2656,7 +3336,7 @@ static int smb358_charger_probe(struct i2c_client *client, } rc = devm_request_threaded_irq(&client->dev, irq, NULL, smb358_chg_stat_handler, - IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "smb358_chg_stat_irq", chip); if (rc) { dev_err(&client->dev, @@ -2683,7 +3363,8 @@ static int smb358_charger_probe(struct i2c_client *client, chip->adc_param.btm_ctx = chip; chip->adc_param.threshold_notification = smb_chg_adc_notification; - chip->adc_param.channel = LR_MUX1_BATT_THERM; + chip->adc_param.channel = P_MUX2_1_1; + /* update battery missing info in tm_channel_measure*/ rc = qpnp_adc_tm_channel_measure(chip->adc_tm_dev, @@ -2698,6 +3379,17 @@ static int smb358_charger_probe(struct i2c_client *client, dev_info(chip->dev, "SMB358 successfully probed. charger=%d, batt=%d\n", chip->chg_present, smb358_get_prop_batt_present(chip)); + + if (chip->bms_psy_name) { + chip->bms_psy = power_supply_get_by_name((char *)chip->bms_psy_name); + if (chip->bms_psy && chip->bms_psy->bms_psy_ok == 1 && chip->power_ok) { + chip->batt_psy.bms_psy_ok = 1; + } + + } + + schedule_delayed_work(&chip->abnormal_detect, 0); + return 0; fail_chg_valid_irq: @@ -2722,6 +3414,11 @@ static int smb358_charger_remove(struct i2c_client *client) { struct smb358_charger *chip = i2c_get_clientdata(client); + pr_err("smb358 charger remove\n"); + hot_status = 0; + cold_status = 0; + warm_status = 0; + cool_status = 0; power_supply_unregister(&chip->batt_psy); if (gpio_is_valid(chip->chg_valid_gpio)) gpio_free(chip->chg_valid_gpio); @@ -2730,7 +3427,12 @@ static int smb358_charger_remove(struct i2c_client *client) regulator_disable(chip->vcc_i2c); mutex_destroy(&chip->irq_complete); + wake_lock_destroy(&chip->wake_lock_hightemp); debugfs_remove_recursive(chip->debug_root); + + alarm_cancel(&chip->batt_temp_alarm); + cancel_work_sync(&chip->batt_temp_work); + cancel_delayed_work(&chip->abnormal_detect); return 0; } @@ -2740,7 +3442,6 @@ static int smb358_suspend(struct device *dev) struct smb358_charger *chip = i2c_get_clientdata(client); int rc; int i; - for (i = 0; i < 2; i++) { rc = smb358_read_reg(chip, FAULT_INT_REG + i, &chip->irq_cfg_mask[i]); diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index cce12d14704ad..31584dce04988 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -900,3 +900,17 @@ config REGULATOR_KRYO endif +config REGULATOR_TPS65132 + tristate "TI TPS65132 Power regulator" + depends on I2C + select REGMAP_I2C + help + This driver supports TPS65132 voltage regulator chips. The chip has + a synchronous boost converter that generates a positive voltage which + is regulated down by an integrated LDO, providing a positive supply + rail. It also has a negative supply rail which is generated by an + integrated negative charge pump driven from the boost converter + output. Both output regulators support 4V~6V voltage range and + can be configured separately. Each regulator can be enabled and + disabled independently through an external pin. + diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile index 3334ef2fe320e..eab8b43104112 100644 --- a/drivers/regulator/Makefile +++ b/drivers/regulator/Makefile @@ -110,4 +110,5 @@ obj-$(CONFIG_REGULATOR_QPNP_LABIBB) += qpnp-labibb-regulator.o obj-$(CONFIG_REGULATOR_STUB) += stub-regulator.o obj-$(CONFIG_REGULATOR_KRYO) += kryo-regulator.o obj-$(CONFIG_REGULATOR_CPR2_GFX) += cpr2-gfx-regulator.o +obj-$(CONFIG_REGULATOR_TPS65132) += tps65132-regulator.o ccflags-$(CONFIG_REGULATOR_DEBUG) += -DDEBUG diff --git a/drivers/regulator/tps65132-regulator.c b/drivers/regulator/tps65132-regulator.c new file mode 100644 index 0000000000000..f3293414c6ef0 --- /dev/null +++ b/drivers/regulator/tps65132-regulator.c @@ -0,0 +1,628 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#define pr_fmt(fmt) "%s: " fmt, __func__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct tps65132_regulator { + struct regulator_init_data *init_data; + struct regulator_dev *rdev; + struct device_node *node; + struct regulator_desc rdesc; + struct tps65132_chip *chip; + const char *name; + u8 vol_reg; + u8 dischg_bit_pos; + bool dischg_en; + u8 ctrl_reg; + u8 wrt_en_bit_pos; + u8 read_eeprom_bit_pos; + int en_gpio; + enum of_gpio_flags gpio_flags; + bool is_enabled; + int curr_uV; + u8 vol_set_val; + bool vol_set_postpone; +}; + +struct tps65132_chip { + struct tps65132_regulator *vreg; + struct regulator *i2c_pwr; + struct regmap *regmap; + struct device *dev; + u8 num_regulators; + u8 apps_cfg; + u8 apps_dischg_reg; + u8 apps_cfg_bit_pos; + u8 apps_dischg_val; + bool apps_dischg_cfg_postpone; + bool en_gpio_lpm; +}; + +#define TPS65132_REG_VPOS 0x00 +#define TPS65132_REG_VNEG 0x01 +#define TPS65132_VOLTAGE_MASK 0x1f +#define TPS65132_REG_APPS_DISCHARGE 0x03 +#define TPS65132_DISCHARGE_NEG_BIT 0 +#define TPS65132_DISCHARGE_POS_BIT 1 +#define TPS65132_APPSCFG_BIT 6 +#define TPS65132_REG_CTRL 0xff +#define TPS65132_WRITE_EN_BIT 7 + +#define TPS65132_VOLTAGE_MIN 4000000 +#define TPS65132_VOLTAGE_MAX 6000000 +#define TPS65132_VOLTAGE_STEP 100000 +#define TPS65132_VOLTAGE_LEVELS \ + ((TPS65132_VOLTAGE_MAX - TPS65132_VOLTAGE_MIN) \ + / TPS65132_VOLTAGE_STEP + 1) +#define TPS65132_CTRL_READ_DAC 0 +#define TPS65132_CTRL_READ_EEPROM 1 + +#define TPS65132_NEG_TABLET_CURR_LIMIT_UA 80000 +#define TPS65132_NEG_SMARTPHONE_CURR_LIMIT_UA 40000 +#define TPS65132_POS_CURR_LIMIT_UA 200000 + +#define I2C_VOLTAGE_LEVEL 1800000 + +enum { + TPS65132_POSITIVE_BOOST = 0, + TPS65132_NEGATIVE_BOOST, +}; + +static struct of_regulator_match tps65132_reg_matches[] = { + { .name = "pos-boost", .driver_data = (void *)TPS65132_POSITIVE_BOOST }, + { .name = "neg-boost", .driver_data = (void *)TPS65132_NEGATIVE_BOOST }, +}; + +static int tps65132_regulator_disable(struct regulator_dev *rdev) +{ + struct tps65132_regulator *vreg = rdev_get_drvdata(rdev); + struct tps65132_chip *chip = vreg->chip; + printk("tps65132_regulator_disable\n"); + printk("vreg->en_gpio is %d\n", vreg->en_gpio); + if (chip->en_gpio_lpm) { + gpio_direction_output(vreg->en_gpio, 0); + } else{ + gpio_set_value_cansleep(vreg->en_gpio, + vreg->gpio_flags & OF_GPIO_ACTIVE_LOW ? 1 : 0); +} + vreg->is_enabled = false; + + return 0; +} + +static int tps65132_regulator_enable(struct regulator_dev *rdev) +{ + struct tps65132_regulator *vreg = rdev_get_drvdata(rdev); + struct tps65132_chip *chip = vreg->chip; + int rc; + printk("tps65132_regulator_enable\n"); + printk("vreg->en_gpio is %d\n", vreg->en_gpio); + if (chip->en_gpio_lpm) { + gpio_direction_output(vreg->en_gpio, 1); +} + else { + gpio_set_value_cansleep(vreg->en_gpio, + vreg->gpio_flags & OF_GPIO_ACTIVE_LOW ? 0 : 1); +} + vreg->is_enabled = true; + + if (chip->apps_dischg_cfg_postpone) { + rc = regmap_write(chip->regmap, chip->apps_dischg_reg, + chip->apps_dischg_val); + if (rc) { + pr_err("apps_dischg set failed, rc = %d\n", rc); + return rc; + } + chip->apps_dischg_cfg_postpone = false; + } + + if (vreg->vol_set_postpone) { + rc = regmap_write(rdev->regmap, vreg->vol_reg, + vreg->vol_set_val); + + if (rc) { + pr_err("set voltage failed, rc = %d\n", rc); + return rc; + } + vreg->vol_set_postpone = false; + } + + return 0; +} + +static int tps65132_regulator_get_voltage(struct regulator_dev *rdev) +{ + struct tps65132_regulator *vreg = rdev_get_drvdata(rdev); + int rc, val; + return 0; + + if (!rdev->regmap) { + pr_err("regmap not found\n"); + return -EINVAL; + } + if (!vreg->is_enabled) + return vreg->curr_uV; + + rc = regmap_write(rdev->regmap, vreg->ctrl_reg, TPS65132_CTRL_READ_DAC); + if (rc) { + pr_err("failed to write reg %d, rc = %d\n", vreg->ctrl_reg, rc); + return rc; + } + + rc = regmap_read(rdev->regmap, vreg->vol_reg, &val); + if (rc) { + pr_err("read reg %d failed, rc = %d\n", vreg->vol_reg, rc); + return rc; + } else { + vreg->curr_uV = (val & TPS65132_VOLTAGE_MASK) * + TPS65132_VOLTAGE_STEP + TPS65132_VOLTAGE_MIN; + } + + return vreg->curr_uV; +} + +static int tps65132_regulator_set_voltage(struct regulator_dev *rdev, + int min_uV, int max_uV, unsigned *selector) +{ + struct tps65132_regulator *vreg = rdev_get_drvdata(rdev); + int val, new_uV, rc; + + if (!rdev->regmap) { + pr_err("regmap not found\n"); + return -EINVAL; + } + + val = DIV_ROUND_UP(min_uV - TPS65132_VOLTAGE_MIN, + TPS65132_VOLTAGE_STEP); + val = val & TPS65132_VOLTAGE_MASK; + new_uV = TPS65132_VOLTAGE_MIN + (val * TPS65132_VOLTAGE_STEP); + if (new_uV > max_uV) { + pr_err("failed to set voltage (%d %d)\n", min_uV, max_uV); + return -EINVAL; + } + if (!vreg->is_enabled) { + vreg->vol_set_val = val; + vreg->vol_set_postpone = true; + } else { + rc = regmap_write(rdev->regmap, vreg->vol_reg, val); + if (rc) { + pr_err("failed to write reg %d, rc = %d\n", + vreg->vol_reg, rc); + return rc; + } + } + vreg->curr_uV = new_uV; + + *selector = val; + + return 0; +} + +static int tps65132_regulator_list_voltage(struct regulator_dev *rdev, + unsigned selector) +{ + if (selector >= TPS65132_VOLTAGE_LEVELS) + return 0; + + return selector * TPS65132_VOLTAGE_STEP + TPS65132_VOLTAGE_MIN; +} + +static int tps65132_regulator_is_enabled(struct regulator_dev *rdev) +{ + struct tps65132_regulator *vreg = rdev_get_drvdata(rdev); + + return vreg->is_enabled ? 1 : 0; +} + +static struct regulator_ops tps65132_ops = { + .set_voltage = tps65132_regulator_set_voltage, + .get_voltage = tps65132_regulator_get_voltage, + .list_voltage = tps65132_regulator_list_voltage, + .enable = tps65132_regulator_enable, + .disable = tps65132_regulator_disable, + .is_enabled = tps65132_regulator_is_enabled, +}; + +static int tps65132_regulator_gpio_init(struct tps65132_chip *chip) +{ + struct tps65132_regulator *vreg; + u32 gpio; + enum of_gpio_flags flags; + int state; + int i, rc = 0; + + for (i = 0; i < chip->num_regulators; i++) { + vreg = &chip->vreg[i]; + gpio = vreg->en_gpio; + flags = vreg->gpio_flags; + if (gpio_is_valid(gpio)) { + rc = devm_gpio_request(chip->dev, gpio, vreg->name); + if (rc < 0) { + pr_err("gpio %d request failed, rc = %d\n", + gpio, rc); + return rc; + } + state = gpio_get_value_cansleep(gpio); + if (state < 0) { + pr_err("gpio %d: get value failed, rc = %d\n", + gpio, state); + return state; + } + rc = gpio_direction_output(gpio, state); + if (rc < 0) { + pr_err("gpio %d set output failed, rc = %d\n", + gpio, rc); + return rc; + } + if (((flags & OF_GPIO_ACTIVE_LOW) && (state == 0)) || + (!(flags & OF_GPIO_ACTIVE_LOW) && (state == 1))) + vreg->is_enabled = true; + } else { + pr_err("gpio %d is invalid for %s EN-pin\n", + gpio, vreg->name); + return -EINVAL; + } + } + + return rc; +} + +static int tps65132_regulator_apps_dischg_config(struct tps65132_chip *chip) +{ + struct tps65132_regulator *vreg; + u8 value = 0; + bool online = false; + int i, rc = 0; + + if (chip->apps_cfg > 0) + value = BIT(chip->apps_cfg_bit_pos); + + for (i = 0; i < chip->num_regulators; i++) { + vreg = &chip->vreg[i]; + if (vreg->dischg_en) + value |= BIT(vreg->dischg_bit_pos); + if (vreg->is_enabled) + online = true; + } + if (online) { + rc = regmap_write(chip->regmap, chip->apps_dischg_reg, value); + if (rc) + pr_err("write reg %d failed, rc = %d\n", + chip->apps_dischg_reg, rc); + } else { + chip->apps_dischg_cfg_postpone = true; + chip->apps_dischg_val = value; + } + + return 0; +} + +static int tps65132_regulator_hw_init(struct tps65132_chip *chip) +{ + int rc; + struct regulator *i2c_pwr = chip->i2c_pwr; + + rc = tps65132_regulator_gpio_init(chip); + if (rc) { + pr_err("gpios initialize failed, rc = %d\n", rc); + return rc; + } + + if (i2c_pwr) { + if (regulator_count_voltages(i2c_pwr) > 0) { + rc = regulator_set_voltage(i2c_pwr, + I2C_VOLTAGE_LEVEL, I2C_VOLTAGE_LEVEL); + if (rc < 0) { + pr_err("set i2c-pwr voltage failed, rc = %d\n", + rc); + return rc; + } + } + rc = regulator_enable(i2c_pwr); + if (rc) { + pr_err("enable i2c-pwr voltage failed, rc = %d\n", rc); + return rc; + } + } + + rc = tps65132_regulator_apps_dischg_config(chip); + if (rc) + pr_err("appscfg set failed, rc = %d\n", rc); + + return rc; +} + +static int tps65132_parse_dt(struct tps65132_chip *chip, + struct i2c_client *client) +{ + struct device_node *node; + struct of_regulator_match *match; + int type, i, rc; + u32 current_limit; + + if (!client->dev.of_node) { + pr_err("device node missing\n"); + return -EINVAL; + } + + node = of_find_node_by_name(client->dev.of_node, "regulators"); + if (!node) { + pr_err("get regulators node failed\n"); + return -EINVAL; + } + + rc = of_regulator_match(&client->dev, node, tps65132_reg_matches, + ARRAY_SIZE(tps65132_reg_matches)); + if (rc < 0) { + pr_err("regulator match failed, rc = %d\n", rc); + return rc; + } + + chip->num_regulators = rc; + + chip->vreg = devm_kzalloc(&client->dev, chip->num_regulators * + sizeof(struct tps65132_regulator), + GFP_KERNEL); + if (!chip->vreg) { + pr_err("memory allocation failed for vreg\n"); + return -ENOMEM; + } + if (of_find_property(client->dev.of_node, "i2c-pwr-supply", NULL)) { + chip->i2c_pwr = devm_regulator_get(&client->dev, "i2c-pwr"); + if (IS_ERR_OR_NULL(chip->i2c_pwr)) { + rc = PTR_RET(chip->i2c_pwr); + if (rc != EPROBE_DEFER) + pr_err("get i2c_pwr failed, rc = %d\n", rc); + return rc; + } + } + chip->en_gpio_lpm = of_property_read_bool(client->dev.of_node, + "ti,en-gpio-lpm"); + + for (i = 0; i < chip->num_regulators; i++) { + match = &tps65132_reg_matches[i]; + if (!match->init_data) + continue; + match->init_data->constraints.input_uV = + match->init_data->constraints.max_uV; + match->init_data->constraints.valid_ops_mask = + REGULATOR_CHANGE_VOLTAGE | + REGULATOR_CHANGE_STATUS; + + chip->vreg[i].init_data = match->init_data; + chip->vreg[i].node = match->of_node; + chip->vreg[i].chip = chip; + chip->vreg[i].name = match->init_data->constraints.name; + chip->vreg[i].ctrl_reg = TPS65132_REG_CTRL; + chip->vreg[i].wrt_en_bit_pos = TPS65132_WRITE_EN_BIT; + chip->vreg[i].read_eeprom_bit_pos = + TPS65132_WRITE_EN_BIT; + chip->vreg[i].dischg_en = of_property_read_bool( + match->of_node, "ti,discharge-enable"); + rc = of_property_read_u32(match->of_node, "ti,enable-time", + &chip->vreg[i].rdesc.enable_time); + if (rc < 0) { + pr_debug("ti,enable-time read failed, rc = %d\n", rc); + chip->vreg[i].rdesc.enable_time = 800; + } + rc = of_property_read_u32(match->of_node, "ti,current-limit", + ¤t_limit); + type = (uintptr_t)match->driver_data; + if (type == TPS65132_POSITIVE_BOOST) { + chip->vreg[i].vol_reg = TPS65132_REG_VPOS; + chip->vreg[i].dischg_bit_pos = + TPS65132_DISCHARGE_POS_BIT; + if (!rc && (current_limit != + TPS65132_POS_CURR_LIMIT_UA)) { + pr_err("current limit %duA is invalid for postive boost\n", + current_limit); + return -EINVAL; + } + } else if (type == TPS65132_NEGATIVE_BOOST) { + chip->vreg[i].vol_reg = TPS65132_REG_VNEG; + chip->vreg[i].dischg_bit_pos = + TPS65132_DISCHARGE_NEG_BIT; + if (!rc && (current_limit != + TPS65132_NEG_TABLET_CURR_LIMIT_UA) && + (current_limit != + TPS65132_NEG_SMARTPHONE_CURR_LIMIT_UA)) { + pr_err("current limit %duA is invalid for negative boost\n", + current_limit); + return -EINVAL; + } else if (!rc && (current_limit == + TPS65132_NEG_TABLET_CURR_LIMIT_UA)) { + chip->apps_cfg = 1; + } + } else { + pr_err("unknown regulator type: %d\n", type); + return -EINVAL; + } + rc = 0; + chip->vreg[i].en_gpio = of_get_named_gpio_flags( + match->of_node, "ti,en-gpio", 0, + &chip->vreg[i].gpio_flags); + if (chip->vreg[i].en_gpio < 0) { + pr_err("get ti,en-gpio failed, rc = %d\n", + chip->vreg[i].en_gpio); + return chip->vreg[i].en_gpio; + } + } + chip->apps_dischg_reg = TPS65132_REG_APPS_DISCHARGE; + chip->apps_cfg_bit_pos = TPS65132_APPSCFG_BIT; + + return rc; +} + +static struct regmap_config tps65132_regmap_config = { + .reg_bits = 8, + .val_bits = 8, +}; + +static int tps65132_regulator_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct tps65132_chip *chip; + struct regulator_config config = {}; + struct regulator_desc *rdesc; + int i, j, rc; + chip = devm_kzalloc(&client->dev, sizeof(struct tps65132_chip), + GFP_KERNEL); + if (!chip) { + pr_err("memory allocation failed for tps65132_chip\n"); + return -ENOMEM; + } + rc = tps65132_parse_dt(chip, client); + if (rc) { + pr_err("parse device tree failed for tps65132, rc = %d\n", + rc); + return rc; + } + chip->regmap = devm_regmap_init_i2c(client, &tps65132_regmap_config); + if (IS_ERR(chip->regmap)) { + pr_err("init regmap failed for tps65132, rc = %ld\n", + PTR_ERR(chip->regmap)); + return PTR_ERR(chip->regmap); + } + chip->dev = &client->dev; + + rc = tps65132_regulator_hw_init(chip); + if (rc < 0) { + pr_err("hardware init failed for tps65132, rc = %d\n", rc); + return rc; + } + i2c_set_clientdata(client, chip); + + for (i = 0; i < chip->num_regulators; i++) { + config.dev = &client->dev; + config.init_data = chip->vreg[i].init_data; + config.regmap = chip->regmap; + config.driver_data = &chip->vreg[i]; + config.of_node = chip->vreg[i].node; + + rdesc = &chip->vreg[i].rdesc; + rdesc->name = chip->vreg[i].name; + rdesc->type = REGULATOR_VOLTAGE; + rdesc->owner = THIS_MODULE; + rdesc->n_voltages = TPS65132_VOLTAGE_LEVELS; + if (of_get_property(client->dev.of_node, "vin-supply", NULL)) + rdesc->supply_name = "vin"; + rdesc->ops = &tps65132_ops; + chip->vreg[i].rdev = regulator_register(rdesc, &config); + if (IS_ERR(chip->vreg[i].rdev)) { + pr_err("regulator register failed, rc = %ld\n", + PTR_ERR(chip->vreg[i].rdev)); + for (j = i - 1; j >= 0; j--) + regulator_unregister(chip->vreg[j].rdev); + + return PTR_ERR(chip->vreg[i].rdev); + } + } + + return 0; +} + +static int tps65132_regulator_remove(struct i2c_client *client) +{ + struct tps65132_chip *chip = i2c_get_clientdata(client); + struct regulator *i2c_pwr = chip->i2c_pwr; + int i; + + if (i2c_pwr) + regulator_disable(i2c_pwr); + + for (i = 0; i < chip->num_regulators; i++) + regulator_unregister(chip->vreg[i].rdev); + + return 0; +} + +static struct of_device_id tps65132_match_table[] = { + { .compatible = "ti,tps65132", }, + {}, +}; +MODULE_DEVICE_TABLE(of, tps65132_match_table); + +static const struct i2c_device_id tps65132_id[] = { + {"tps65132", -1}, + { }, +}; + +static int tps65132_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct tps65132_chip *chip = i2c_get_clientdata(client); + int rc = 0; + + if (chip->i2c_pwr) + rc = regulator_disable(chip->i2c_pwr); + + return rc; +} + +static int tps65132_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct tps65132_chip *chip = i2c_get_clientdata(client); + int rc = 0; + + if (chip->i2c_pwr) + rc = regulator_enable(chip->i2c_pwr); + + return rc; +} + +const struct dev_pm_ops tps65132_pm_ops = { + .resume = tps65132_resume, + .suspend = tps65132_suspend, +}; + +static struct i2c_driver tps65132_regulator_driver = { + .driver = { + .name = "tps65132", + .owner = THIS_MODULE, + .of_match_table = tps65132_match_table, + }, + .probe = tps65132_regulator_probe, + .remove = tps65132_regulator_remove, + .id_table = tps65132_id, +}; + +static int __init tps65132_init(void) +{ + return i2c_add_driver(&tps65132_regulator_driver); +} +subsys_initcall(tps65132_init); + +static void __exit tps65132_exit(void) +{ + i2c_del_driver(&tps65132_regulator_driver); +} +module_exit(tps65132_exit); + +MODULE_DESCRIPTION("TI TPS65132 regulator driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 8a2a593c41e9d..1dd8de53b0ecb 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -406,6 +406,9 @@ sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) struct sg_header *old_hdr = NULL; int retval = 0; + if (unlikely(segment_eq(get_fs(), KERNEL_DS))) + return -EINVAL; + if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) return -ENXIO; SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp, @@ -510,7 +513,7 @@ sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) old_hdr->result = EIO; break; case DID_ERROR: - old_hdr->result = (srp->sense_b[0] == 0 && + old_hdr->result = (srp->sense_b[0] == 0 && hp->masked_status == GOOD) ? 0 : EIO; break; default: @@ -875,8 +878,10 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) return -ENXIO; if (!access_ok(VERIFY_WRITE, p, SZ_SG_IO_HDR)) return -EFAULT; + mutex_lock(&sfp->parentdp->open_rel_lock); result = sg_new_write(sfp, filp, p, SZ_SG_IO_HDR, 1, read_only, 1, &srp); + mutex_unlock(&sfp->parentdp->open_rel_lock); if (result < 0) return result; result = wait_event_interruptible(sfp->read_wait, @@ -916,8 +921,10 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) sfp->low_dma = 1; if ((0 == sfp->low_dma) && (0 == sg_res_in_use(sfp))) { val = (int) sfp->reserve.bufflen; + mutex_lock(&sfp->parentdp->open_rel_lock); sg_remove_scat(sfp, &sfp->reserve); sg_build_reserve(sfp, val); + mutex_unlock(&sfp->parentdp->open_rel_lock); } } else { if (atomic_read(&sdp->detaching)) @@ -985,15 +992,17 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) result = get_user(val, ip); if (result) return result; - if (val < 0) - return -EINVAL; + if (val < 0) + return -EINVAL; val = min_t(int, val, max_sectors_bytes(sdp->device->request_queue)); if (val != sfp->reserve.bufflen) { if (sg_res_in_use(sfp) || sfp->mmap_called) return -EBUSY; + mutex_lock(&sfp->parentdp->open_rel_lock); sg_remove_scat(sfp, &sfp->reserve); sg_build_reserve(sfp, val); + mutex_unlock(&sfp->parentdp->open_rel_lock); } return 0; case SG_GET_RESERVED_SIZE: @@ -1020,6 +1029,8 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) result = get_user(val, ip); if (result) return result; + if (val > SG_MAX_CDB_SIZE) + return -ENOMEM; sfp->next_cmd_len = (val > 0) ? val : 0; return 0; case SG_GET_VERSION_NUM: @@ -1046,8 +1057,8 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) if (srp) { rinfo[val].req_state = srp->done + 1; rinfo[val].problem = - srp->header.masked_status & - srp->header.host_status & + srp->header.masked_status & + srp->header.host_status & srp->header.driver_status; if (srp->done) rinfo[val].duration = @@ -1068,7 +1079,7 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) } } read_unlock_irqrestore(&sfp->rq_list_lock, iflags); - result = __copy_to_user(p, rinfo, + result = __copy_to_user(p, rinfo, SZ_SG_REQ_INFO * SG_MAX_QUEUE); result = result ? -EFAULT : 0; kfree(rinfo); @@ -1170,14 +1181,14 @@ static long sg_compat_ioctl(struct file *filp, unsigned int cmd_in, unsigned lon return -ENXIO; sdev = sdp->device; - if (sdev->host->hostt->compat_ioctl) { + if (sdev->host->hostt->compat_ioctl) { int ret; ret = sdev->host->hostt->compat_ioctl(sdev, cmd_in, (void __user *)arg); return ret; } - + return -ENOIOCTLCMD; } #endif @@ -1661,7 +1672,7 @@ init_sg(void) else def_reserved_size = sg_big_buff; - rc = register_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), + rc = register_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), SG_MAX_DEVS, "sg"); if (rc) return rc; @@ -2346,7 +2357,7 @@ static const struct file_operations adio_fops = { }; static int sg_proc_single_open_dressz(struct inode *inode, struct file *file); -static ssize_t sg_proc_write_dressz(struct file *filp, +static ssize_t sg_proc_write_dressz(struct file *filp, const char __user *buffer, size_t count, loff_t *off); static const struct file_operations dressz_fops = { .owner = THIS_MODULE, @@ -2486,7 +2497,7 @@ static int sg_proc_single_open_adio(struct inode *inode, struct file *file) return single_open(file, sg_proc_seq_show_int, &sg_allow_dio); } -static ssize_t +static ssize_t sg_proc_write_adio(struct file *filp, const char __user *buffer, size_t count, loff_t *off) { @@ -2507,7 +2518,7 @@ static int sg_proc_single_open_dressz(struct inode *inode, struct file *file) return single_open(file, sg_proc_seq_show_int, &sg_big_buff); } -static ssize_t +static ssize_t sg_proc_write_dressz(struct file *filp, const char __user *buffer, size_t count, loff_t *off) { @@ -2667,7 +2678,7 @@ static void sg_proc_debug_helper(struct seq_file *s, Sg_device * sdp) hp = &srp->header; new_interface = (hp->interface_id == '\0') ? 0 : 1; if (srp->res_used) { - if (new_interface && + if (new_interface && (SG_FLAG_MMAP_IO & hp->flags)) cp = " mmap>> "; else diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig index a4852719085b3..e3ed488f2f9fa 100644 --- a/drivers/soc/qcom/Kconfig +++ b/drivers/soc/qcom/Kconfig @@ -826,6 +826,21 @@ config MSM_REMOTEQDSS enable/disable these events. Interface located in /sys/class/remoteqdss. +config SERIAL_NUM + bool "Enable Serial Number Proc Interface" + help + Provide a interface for reading CPU serial number + +config SECBOOT_FUSE + bool "Enable Secure boot fuse Proc Interface" + help + rovide a interface for reading CPU secure boot fuse setting. Interface located in + proc/secboot_fuse_reg + +config CPUMAXFREQ + bool "Enable CPUMAXFREQ Proc Interface" + help + Provide a interface for getting the maximum frequency supported by cpu core config QCOM_SMCINVOKE bool "Secure QSEE Support" help diff --git a/drivers/soc/qcom/Makefile b/drivers/soc/qcom/Makefile index d61b4f8c9ed93..2500709d994a9 100644 --- a/drivers/soc/qcom/Makefile +++ b/drivers/soc/qcom/Makefile @@ -86,6 +86,9 @@ ifdef CONFIG_MSM_SUBSYSTEM_RESTART obj-y += subsystem_restart.o obj-y += ramdump.o endif +obj-$(CONFIG_SERIAL_NUM) += serial_num.o +obj-$(CONFIG_SECBOOT_FUSE) += secboot_fuse.o +obj-$(CONFIG_CPUMAXFREQ) += cpumaxfreq.o obj-$(CONFIG_MSM_SERVICE_NOTIFIER) += service-notifier.o obj-$(CONFIG_MSM_SYSMON_COMM) += sysmon.o sysmon-qmi.o diff --git a/drivers/soc/qcom/cpumaxfreq.c b/drivers/soc/qcom/cpumaxfreq.c new file mode 100644 index 0000000000000..0ee532ea330a0 --- /dev/null +++ b/drivers/soc/qcom/cpumaxfreq.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include + +static struct proc_dir_entry *entry; + +static unsigned int cpumaxfreq = 0; + +static int cpumaxfreq_read(struct seq_file *m, void *v) +{ + int ret; + + pr_debug("cpumaxfreq: %u kHz\n", cpumaxfreq); + + ret = cpumaxfreq/1000 + 5; + seq_printf(m, "%u.%02u\n", ret/1000, ret%1000/10); + + return 0; +} + +static int cpumaxfreq_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, cpumaxfreq_read, NULL); +} + +static const struct file_operations cpumaxfreq_fops = { + .open = cpumaxfreq_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int __init cpumaxfreq_init(void) +{ + int cpu; + struct cpufreq_policy policy; + + entry = proc_create("cpumaxfreq", 0444 /* read only*/, + NULL /* parent dir */, &cpumaxfreq_fops); + + for_each_possible_cpu(cpu) { + if (cpufreq_get_policy(&policy, cpu)) + continue; + if (policy.cpuinfo.max_freq > cpumaxfreq) + cpumaxfreq = policy.cpuinfo.max_freq; + } + + return !entry; +} +module_init(cpumaxfreq_init); + +static void __exit cpumaxfreq_exit(void) +{ + proc_remove(entry); +} +module_exit(cpumaxfreq_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("Return the max freqency supported by any core of the processor"); diff --git a/drivers/soc/qcom/secboot_fuse.c b/drivers/soc/qcom/secboot_fuse.c new file mode 100644 index 0000000000000..badceec978208 --- /dev/null +++ b/drivers/soc/qcom/secboot_fuse.c @@ -0,0 +1,121 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define secboot_fuse_readl(drvdata, off) __raw_readl(drvdata->base + off) + +#define SECBOOT_FUSE (0x000) + +static uint32_t secboot_fuse; + +struct secboot_fuse_drvdata { + void __iomem *base; + struct device *dev; +}; + +static struct secboot_fuse_drvdata *secdrvdata; + +static int secboot_fuse_read(struct seq_file *m, void *v) +{ + struct secboot_fuse_drvdata *drvdata = secdrvdata; + + if (!drvdata) + return false; + + if (secboot_fuse == 0) + secboot_fuse = secboot_fuse_readl(drvdata, SECBOOT_FUSE); + + dev_dbg(drvdata->dev, "secboot register: %x\n", secboot_fuse); + + seq_printf(m, "0x%x\n", secboot_fuse); + + return 0; + +} + +static int secboot_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, secboot_fuse_read, NULL); +} + +static const struct file_operations secboot_fops = { + .open = secboot_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void secboot_fuse_create_proc(void) +{ + struct proc_dir_entry *entry; + entry = proc_create("secboot_fuse_reg", 0 /* default mode */, + NULL /* parent dir */, &secboot_fops); +} + +static int secboot_fuse_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct secboot_fuse_drvdata *drvdata; + struct resource *res; + + drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) + return -ENOMEM; + /* Store the driver data pointer for use in exported functions */ + secdrvdata = drvdata; + drvdata->dev = &pdev->dev; + platform_set_drvdata(pdev, drvdata); + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sec-boot-base"); + if (!res) + return -ENODEV; + + drvdata->base = devm_ioremap(dev, res->start, resource_size(res)); + if (!drvdata->base) + return -ENOMEM; + + secboot_fuse_create_proc(); + dev_info(dev, "Secboot-fuse interface initialized\n"); + return 0; +} + +static int secboot_fuse_remove(struct platform_device *pdev) +{ + return 0; +} + +static struct of_device_id secboot_fuse_match[] = { + {.compatible = "qcom,sec-boot-fuse"}, + {} +}; + +static struct platform_driver secboot_fuse_driver = { + .probe = secboot_fuse_probe, + .remove = secboot_fuse_remove, + .driver = { + .name = "msm-secboot-fuse", + .owner = THIS_MODULE, + .of_match_table = secboot_fuse_match, + }, +}; + +static int __init secboot_fuse_init(void) +{ + return platform_driver_register(&secboot_fuse_driver); +} +arch_initcall(secboot_fuse_init); + +static void __exit secboot_fuse_exit(void) +{ + platform_driver_unregister(&secboot_fuse_driver); +} +module_exit(secboot_fuse_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("JTag Fuse driver"); diff --git a/drivers/soc/qcom/serial_num.c b/drivers/soc/qcom/serial_num.c new file mode 100644 index 0000000000000..e0fca88ba6a12 --- /dev/null +++ b/drivers/soc/qcom/serial_num.c @@ -0,0 +1,121 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define sn_readl(drvdata, off) __raw_readl(drvdata->base + off) + +#define SERIAL_NUM (0x000) + +static uint32_t sn; + +struct sn_drvdata { + void __iomem *base; + struct device *dev; +}; + +static struct sn_drvdata *sndrvdata; + +static int sn_read(struct seq_file *m, void *v) +{ + struct sn_drvdata *drvdata = sndrvdata; + + if (!drvdata) + return false; + + if (sn == 0) + sn = sn_readl(drvdata, SERIAL_NUM); + + dev_dbg(drvdata->dev, "serial num: %x\n", sn); + + seq_printf(m, "0x%x\n", sn); + + return 0; + +} + +static int sn_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, sn_read, NULL); +} + +static const struct file_operations sn_fops = { + .open = sn_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void sn_create_proc(void) +{ + struct proc_dir_entry *entry; + entry = proc_create("serial_num", 0 /* default mode */, + NULL /* parent dir */, &sn_fops); +} + +static int sn_fuse_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct sn_drvdata *drvdata; + struct resource *res; + + drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) + return -ENOMEM; + /* Store the driver data pointer for use in exported functions */ + sndrvdata = drvdata; + drvdata->dev = &pdev->dev; + platform_set_drvdata(pdev, drvdata); + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sn-base"); + if (!res) + return -ENODEV; + + drvdata->base = devm_ioremap(dev, res->start, resource_size(res)); + if (!drvdata->base) + return -ENOMEM; + + sn_create_proc(); + dev_info(dev, "SN interface initialized\n"); + return 0; +} + +static int sn_fuse_remove(struct platform_device *pdev) +{ + return 0; +} + +static struct of_device_id sn_fuse_match[] = { + {.compatible = "qcom,sn-fuse"}, + {} +}; + +static struct platform_driver sn_fuse_driver = { + .probe = sn_fuse_probe, + .remove = sn_fuse_remove, + .driver = { + .name = "msm-sn-fuse", + .owner = THIS_MODULE, + .of_match_table = sn_fuse_match, + }, +}; + +static int __init sn_fuse_init(void) +{ + return platform_driver_register(&sn_fuse_driver); +} +arch_initcall(sn_fuse_init); + +static void __exit sn_fuse_exit(void) +{ + platform_driver_unregister(&sn_fuse_driver); +} +module_exit(sn_fuse_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("JTag Fuse driver"); diff --git a/drivers/soc/qcom/subsystem_restart.c b/drivers/soc/qcom/subsystem_restart.c index fa9f9fc335b40..f1ad238d30674 100644 --- a/drivers/soc/qcom/subsystem_restart.c +++ b/drivers/soc/qcom/subsystem_restart.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -149,6 +150,7 @@ struct restart_log { * @restart_level: restart level (0 - panic, 1 - related, 2 - independent, etc.) * @restart_order: order of other devices this devices restarts with * @crash_count: number of times the device has crashed + * @dentry: debugfs directory for this device * @do_ramdump_on_put: ramdump on subsystem_put() if true * @err_ready: completion variable to record error ready from subsystem * @crashed: indicates if subsystem has crashed @@ -170,6 +172,9 @@ struct subsys_device { int restart_level; int crash_count; struct subsys_soc_restart_order *restart_order; +#ifdef CONFIG_DEBUG_FS + struct dentry *dentry; +#endif bool do_ramdump_on_put; struct cdev char_dev; dev_t dev_no; @@ -403,6 +408,23 @@ module_param(max_restarts, int, 0644); static long max_history_time = 3600; module_param(max_history_time, long, 0644); +#ifdef WT_COMPILE_FACTORY_VERSION +static int adsp_crash_num = 0; +module_param(adsp_crash_num, int, 0644); + +static int modem_crash_num = 0; +module_param(modem_crash_num, int, 0644); + +static int venus_crash_num = 0; +module_param(venus_crash_num, int, 0644); + +static int wcnss_crash_num = 0; +module_param(wcnss_crash_num, int, 0644); + +static int a506_zap_crash_num = 0; +module_param(a506_zap_crash_num, int, 0644); +#endif + static void do_epoch_check(struct subsys_device *dev) { int n = 0; @@ -1035,6 +1057,19 @@ int subsystem_restart_dev(struct subsys_device *dev) return -EBUSY; } +#ifdef WT_COMPILE_FACTORY_VERSION + if (!strcmp(name, "adsp")) + adsp_crash_num++; + if (!strcmp(name, "modem")) + modem_crash_num++; + if(!strcmp(name, "venus")) + venus_crash_num++; + if (!strcmp(name, "wcnss")) + wcnss_crash_num++; + if (!strcmp(name, "a506_zap")) + a506_zap_crash_num++; +#endif + pr_info("Restart sequence requested for %s, restart_level = %s.\n", name, restart_levels[dev->restart_level]); @@ -1143,6 +1178,87 @@ void notify_proxy_unvote(struct device *device) notify_each_subsys_device(&dev, 1, SUBSYS_PROXY_UNVOTE, NULL); } +#ifdef CONFIG_DEBUG_FS +static ssize_t subsys_debugfs_read(struct file *filp, char __user *ubuf, + size_t cnt, loff_t *ppos) +{ + int r; + char buf[40]; + struct subsys_device *subsys = filp->private_data; + + r = snprintf(buf, sizeof(buf), "%d\n", subsys->count); + return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); +} + +static ssize_t subsys_debugfs_write(struct file *filp, + const char __user *ubuf, size_t cnt, loff_t *ppos) +{ + struct subsys_device *subsys = filp->private_data; + char buf[10]; + char *cmp; + + cnt = min(cnt, sizeof(buf) - 1); + if (copy_from_user(&buf, ubuf, cnt)) + return -EFAULT; + buf[cnt] = '\0'; + cmp = strstrip(buf); + + if (!strcmp(cmp, "restart")) { + if (subsystem_restart_dev(subsys)) + return -EIO; + } else if (!strcmp(cmp, "get")) { + if (subsystem_get(subsys->desc->name)) + return -EIO; + } else if (!strcmp(cmp, "put")) { + subsystem_put(subsys); + } else { + return -EINVAL; + } + + return cnt; +} + +static const struct file_operations subsys_debugfs_fops = { + .open = simple_open, + .read = subsys_debugfs_read, + .write = subsys_debugfs_write, +}; + +static struct dentry *subsys_base_dir; + +static int __init subsys_debugfs_init(void) +{ + subsys_base_dir = debugfs_create_dir("msm_subsys", NULL); + return !subsys_base_dir ? -ENOMEM : 0; +} + +static void subsys_debugfs_exit(void) +{ + debugfs_remove_recursive(subsys_base_dir); +} + +static int subsys_debugfs_add(struct subsys_device *subsys) +{ + if (!subsys_base_dir) + return -ENOMEM; + + subsys->dentry = debugfs_create_file(subsys->desc->name, + S_IRUGO | S_IWUSR, subsys_base_dir, + subsys, &subsys_debugfs_fops); + return !subsys->dentry ? -ENOMEM : 0; +} + +static void subsys_debugfs_remove(struct subsys_device *subsys) +{ + debugfs_remove(subsys->dentry); +} +#else +static int __init subsys_debugfs_init(void) { return 0; }; +static void subsys_debugfs_exit(void) { } +static int subsys_debugfs_add(struct subsys_device *subsys) { return 0; } +static void subsys_debugfs_remove(struct subsys_device *subsys) { } +#endif + static int subsys_device_open(struct inode *inode, struct file *file) { struct subsys_device *device, *subsys_dev = 0; @@ -1558,7 +1674,11 @@ struct subsys_device *subsys_register(struct subsys_desc *desc) subsys->desc->sysmon_pid = -1; strlcpy(subsys->desc->fw_name, desc->name, sizeof(subsys->desc->fw_name)); - +#ifdef WT_FINAL_RELEASE + subsys->restart_level = RESET_SUBSYS_COUPLED; +#else + subsys->restart_level = RESET_SOC; +#endif subsys->notify = subsys_notif_add_subsys(desc->name); snprintf(subsys->wlname, sizeof(subsys->wlname), "ssr(%s)", desc->name); @@ -1579,8 +1699,17 @@ struct subsys_device *subsys_register(struct subsys_desc *desc) mutex_init(&subsys->track.lock); + ret = subsys_debugfs_add(subsys); + if (ret) { + ida_simple_remove(&subsys_ida, subsys->id); + wakeup_source_trash(&subsys->ssr_wlock); + kfree(subsys); + return ERR_PTR(ret); + } + ret = device_register(&subsys->dev); if (ret) { + subsys_debugfs_remove(subsys); put_device(&subsys->dev); return ERR_PTR(ret); } @@ -1642,6 +1771,7 @@ struct subsys_device *subsys_register(struct subsys_desc *desc) if (ofnode) subsys_remove_restart_order(ofnode); err_register: + subsys_debugfs_remove(subsys); device_unregister(&subsys->dev); return ERR_PTR(ret); } @@ -1670,6 +1800,7 @@ void subsys_unregister(struct subsys_device *subsys) WARN_ON(subsys->count); device_unregister(&subsys->dev); mutex_unlock(&subsys->track.lock); + subsys_debugfs_remove(subsys); subsys_char_device_remove(subsys); sysmon_notifier_unregister(subsys->desc); if (subsys->desc->edge) @@ -1709,6 +1840,9 @@ static int __init subsys_restart_init(void) ret = bus_register(&subsys_bus_type); if (ret) goto err_bus; + ret = subsys_debugfs_init(); + if (ret) + goto err_debugfs; char_class = class_create(THIS_MODULE, "subsys"); if (IS_ERR(char_class)) { @@ -1727,6 +1861,8 @@ static int __init subsys_restart_init(void) err_soc: class_destroy(char_class); err_class: + subsys_debugfs_exit(); +err_debugfs: bus_unregister(&subsys_bus_type); err_bus: destroy_workqueue(ssr_wq); diff --git a/drivers/soc/qcom/watchdog_v2.c b/drivers/soc/qcom/watchdog_v2.c index d97ddd5fd2f31..de22502d9528d 100644 --- a/drivers/soc/qcom/watchdog_v2.c +++ b/drivers/soc/qcom/watchdog_v2.c @@ -104,6 +104,23 @@ module_param(WDT_HZ, long, 0); static int ipi_opt_en; module_param(ipi_opt_en, int, 0); +#ifdef CONFIG_FIRE_WATCHDOG +static int wdog_fire; +static int wdog_fire_set(const char *val, struct kernel_param *kp); +module_param_call(wdog_fire, wdog_fire_set, param_get_int, + &wdog_fire, 0644); + +static int wdog_fire_set(const char *val, struct kernel_param *kp) +{ + printk(KERN_INFO "trigger wdog_fire_set\n"); + local_irq_disable(); + while (1) + ; + + return 0; +} +#endif + static void dump_cpu_alive_mask(struct msm_watchdog_data *wdog_dd) { static char alive_mask_buf[MASK_SIZE]; @@ -168,6 +185,11 @@ static int panic_wdog_handler(struct notifier_block *this, wdog_dd->base + WDT0_BITE_TIME); __raw_writel(1, wdog_dd->base + WDT0_RST); } +#ifdef CONFIG_DUMP_ALL_STACKS + /* Suspend wdog until all stacks are printed */ + printk(KERN_INFO "D Status stack trace dump:\n"); + show_state_filter(TASK_UNINTERRUPTIBLE); +#endif return NOTIFY_DONE; } diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index 1a981ef27fadf..823503f624091 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c @@ -4,6 +4,7 @@ * Copyright (C) 2006 SWAPP * Andrea Paterniani * Copyright (C) 2007 David Brownell (simplification, cleanup) + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -92,7 +93,7 @@ struct spidev_data { static LIST_HEAD(device_list); static DEFINE_MUTEX(device_list_lock); -static unsigned bufsiz = 4096; +static unsigned bufsiz = 512*4096; module_param(bufsiz, uint, S_IRUGO); MODULE_PARM_DESC(bufsiz, "data bytes in biggest supported SPI message"); @@ -162,6 +163,10 @@ spidev_sync_write(struct spidev_data *spidev, size_t len) struct spi_transfer t = { .tx_buf = spidev->tx_buffer, .len = len, + .delay_usecs = 0, + .cs_change = 0, + + .speed_hz = 960000, }; struct spi_message m; @@ -544,36 +549,18 @@ static int spidev_open(struct inode *inode, struct file *filp) goto err_find_dev; } - if (!spidev->tx_buffer) { - spidev->tx_buffer = kmalloc(bufsiz, GFP_KERNEL); - if (!spidev->tx_buffer) { - dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); - status = -ENOMEM; - goto err_find_dev; - } - } - - if (!spidev->rx_buffer) { - spidev->rx_buffer = kmalloc(bufsiz, GFP_KERNEL); - if (!spidev->rx_buffer) { - dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); - status = -ENOMEM; - goto err_alloc_rx_buf; - } - } + memset(spidev->tx_buffer, 0, bufsiz); + memset(spidev->rx_buffer, 0, bufsiz); spidev->users++; filp->private_data = spidev; nonseekable_open(inode, filp); - mutex_unlock(&device_list_lock); return 0; -err_alloc_rx_buf: - kfree(spidev->tx_buffer); - spidev->tx_buffer = NULL; err_find_dev: mutex_unlock(&device_list_lock); + return status; } @@ -591,12 +578,6 @@ static int spidev_release(struct inode *inode, struct file *filp) if (!spidev->users) { int dofree; - kfree(spidev->tx_buffer); - spidev->tx_buffer = NULL; - - kfree(spidev->rx_buffer); - spidev->rx_buffer = NULL; - /* ... after we unbound from the underlying device? */ spin_lock_irq(&spidev->spi_lock); dofree = (spidev->spi == NULL); @@ -675,12 +656,40 @@ static int spidev_probe(struct spi_device *spi) set_bit(minor, minors); list_add(&spidev->device_entry, &device_list); } + + if (!spidev->tx_buffer) { + spidev->tx_buffer = kmalloc(bufsiz, GFP_KERNEL); + if (!spidev->tx_buffer) { + dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); + status = -ENOMEM; + goto err_find_dev; + } + } + + if (!spidev->rx_buffer) { + spidev->rx_buffer = kmalloc(bufsiz, GFP_KERNEL); + if (!spidev->rx_buffer) { + dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); + status = -ENOMEM; + goto err_alloc_rx_buf; + } + } + mutex_unlock(&device_list_lock); if (status == 0) spi_set_drvdata(spi, spidev); else - kfree(spidev); + goto err_dev_status; + + return status; +err_dev_status: + kfree(spidev); +err_alloc_rx_buf: + kfree(spidev->tx_buffer); + spidev->tx_buffer = NULL; +err_find_dev: + mutex_unlock(&device_list_lock); return status; } @@ -691,6 +700,13 @@ static int spidev_remove(struct spi_device *spi) /* make sure ops on existing fds can abort cleanly */ spin_lock_irq(&spidev->spi_lock); + + kfree(spidev->tx_buffer); + spidev->tx_buffer = NULL; + + kfree(spidev->rx_buffer); + spidev->rx_buffer = NULL; + spidev->spi = NULL; spin_unlock_irq(&spidev->spi_lock); diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 4690ae9a267f3..605a6871301d0 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -108,4 +108,8 @@ source "drivers/staging/skein/Kconfig" source "drivers/staging/unisys/Kconfig" +source "drivers/staging/ktrace/Kconfig" + +source "drivers/staging/rtmm/Kconfig" + endif # STAGING diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 53503056d747e..a7b95b4413806 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -45,3 +45,6 @@ obj-$(CONFIG_MTD_SPINAND_MT29F) += mt29f_spinand/ obj-$(CONFIG_GS_FPGABOOT) += gs_fpgaboot/ obj-$(CONFIG_CRYPTO_SKEIN) += skein/ obj-$(CONFIG_UNISYSSPAR) += unisys/ +obj-$(CONFIG_KTRACE) += ktrace/ +obj-$(CONFIG_RTMM) += rtmm/ + diff --git a/drivers/staging/android/Kconfig b/drivers/staging/android/Kconfig index b14adec68d8f6..9f6976beb1d18 100644 --- a/drivers/staging/android/Kconfig +++ b/drivers/staging/android/Kconfig @@ -32,6 +32,28 @@ config ANDROID_BINDER_IPC_32BIT Note that enabling this will break newer Android user-space. +config ANDROID_BINDER_DEVICES + string "Android Binder devices" + depends on ANDROID_BINDER_IPC + default "binder,hwbinder,vndbinder" + ---help--- + Default value for the binder.devices parameter. + + The binder.devices parameter is a comma-separated list of strings + that specifies the names of the binder device nodes that will be + created. Each binder device has its own context manager, and is + therefore logically separated from the other devices. + +config ANDROID_BINDER_IPC_SELFTEST + bool "Android Binder IPC Driver Selftest" + depends on ANDROID_BINDER_IPC + ---help--- + This feature allows binder selftest to run. + + Binder selftest checks the allocation and free of binder buffers + exhaustively with combinations of various buffer sizes and + alignments. + config ASHMEM bool "Enable the Anonymous Shared Memory Subsystem" default n @@ -126,6 +148,12 @@ config ONESHOT_SYNC_USER help Provide a userspace API for creating oneshot sync objects. +config ANDROID_WHETSTONE + bool "Android Whetstone" + default N + ---help--- + report to whetstone the memory state when reach target limit value. + source "drivers/staging/android/ion/Kconfig" source "drivers/staging/android/fiq_debugger/Kconfig" diff --git a/drivers/staging/android/Makefile b/drivers/staging/android/Makefile index a6cf4808234dc..0ed34e2873f07 100644 --- a/drivers/staging/android/Makefile +++ b/drivers/staging/android/Makefile @@ -3,11 +3,13 @@ ccflags-y += -I$(src) # needed for trace events obj-y += ion/ obj-$(CONFIG_FIQ_DEBUGGER) += fiq_debugger/ -obj-$(CONFIG_ANDROID_BINDER_IPC) += binder.o +obj-$(CONFIG_ANDROID_BINDER_IPC) += binder.o binder_alloc.o +obj-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o obj-$(CONFIG_ASHMEM) += ashmem.o obj-$(CONFIG_ANDROID_LOGGER) += logger.o obj-$(CONFIG_ANDROID_TIMED_OUTPUT) += timed_output.o obj-$(CONFIG_ANDROID_TIMED_GPIO) += timed_gpio.o +obj-$(CONFIG_ANDROID_WHETSTONE) += memsw_state.o obj-$(CONFIG_ANDROID_LOW_MEMORY_KILLER) += lowmemorykiller.o obj-$(CONFIG_SYNC) += sync.o obj-$(CONFIG_SW_SYNC) += sw_sync.o diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c index 8cb5d4e4d45b5..ea356c961b425 100644 --- a/drivers/staging/android/ashmem.c +++ b/drivers/staging/android/ashmem.c @@ -396,6 +396,7 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma) ret = PTR_ERR(vmfile); goto out; } + vmfile->f_mode |= FMODE_LSEEK; asma->file = vmfile; } get_file(asma->file); @@ -757,10 +758,12 @@ static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; case ASHMEM_SET_SIZE: ret = -EINVAL; + mutex_lock(&ashmem_mutex); if (!asma->file) { ret = 0; asma->size = (size_t) arg; } + mutex_unlock(&ashmem_mutex); break; case ASHMEM_GET_SIZE: ret = asma->size; diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index 4bcab3a89acce..299d78d2e9c3b 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -15,6 +15,40 @@ * */ +/* + * Locking overview + * + * There are 3 main spinlocks which must be acquired in the + * order shown: + * + * 1) proc->outer_lock : protects binder_ref + * binder_proc_lock() and binder_proc_unlock() are + * used to acq/rel. + * 2) node->lock : protects most fields of binder_node. + * binder_node_lock() and binder_node_unlock() are + * used to acq/rel + * 3) proc->inner_lock : protects the thread and node lists + * (proc->threads, proc->waiting_threads, proc->nodes) + * and all todo lists associated with the binder_proc + * (proc->todo, thread->todo, proc->delivered_death and + * node->async_todo), as well as thread->transaction_stack + * binder_inner_proc_lock() and binder_inner_proc_unlock() + * are used to acq/rel + * + * Any lock under procA must never be nested under any lock at the same + * level or below on procB. + * + * Functions that require a lock held on entry indicate which lock + * in the suffix of the function name: + * + * foo_olocked() : requires node->outer_lock + * foo_nlocked() : requires node->lock + * foo_ilocked() : requires proc->inner_lock + * foo_oilocked(): requires proc->outer_lock and proc->inner_lock + * foo_nilocked(): requires node->lock and proc->inner_lock + * ... + */ + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include @@ -24,7 +58,6 @@ #include #include #include -#include #include #include #include @@ -34,27 +67,27 @@ #include #include #include -#include -#include #include #include +#include #include "binder.h" +#include "binder_alloc.h" #include "binder_trace.h" -static DEFINE_MUTEX(binder_main_lock); +static HLIST_HEAD(binder_deferred_list); static DEFINE_MUTEX(binder_deferred_lock); -static DEFINE_MUTEX(binder_mmap_lock); +static HLIST_HEAD(binder_devices); static HLIST_HEAD(binder_procs); -static HLIST_HEAD(binder_deferred_list); +static DEFINE_MUTEX(binder_procs_lock); + static HLIST_HEAD(binder_dead_nodes); +static DEFINE_SPINLOCK(binder_dead_nodes_lock); static struct dentry *binder_debugfs_dir_entry_root; static struct dentry *binder_debugfs_dir_entry_proc; -static struct binder_node *binder_context_mgr_node; -static kuid_t binder_context_mgr_uid = INVALID_UID; -static int binder_last_id; +static atomic_t binder_last_id; static struct workqueue_struct *binder_deferred_workqueue; #define BINDER_DEBUG_ENTRY(name) \ @@ -101,16 +134,15 @@ enum { BINDER_DEBUG_TRANSACTION_COMPLETE = 1U << 10, BINDER_DEBUG_FREE_BUFFER = 1U << 11, BINDER_DEBUG_INTERNAL_REFS = 1U << 12, - BINDER_DEBUG_BUFFER_ALLOC = 1U << 13, - BINDER_DEBUG_PRIORITY_CAP = 1U << 14, - BINDER_DEBUG_BUFFER_ALLOC_ASYNC = 1U << 15, + BINDER_DEBUG_PRIORITY_CAP = 1U << 13, + BINDER_DEBUG_SPINLOCKS = 1U << 14, }; static uint32_t binder_debug_mask = BINDER_DEBUG_USER_ERROR | BINDER_DEBUG_FAILED_TRANSACTION | BINDER_DEBUG_DEAD_TRANSACTION; module_param_named(debug_mask, binder_debug_mask, uint, S_IWUSR | S_IRUGO); -static bool binder_debug_no_lock; -module_param_named(proc_no_lock, binder_debug_no_lock, bool, S_IWUSR | S_IRUGO); +static char *binder_devices_param = CONFIG_ANDROID_BINDER_DEVICES; +module_param_named(devices, binder_devices_param, charp, S_IRUGO); static DECLARE_WAIT_QUEUE_HEAD(binder_user_error_wait); static int binder_stop_on_user_error; @@ -142,6 +174,17 @@ module_param_call(stop_on_user_error, binder_set_stop_on_user_error, binder_stop_on_user_error = 2; \ } while (0) +#define to_flat_binder_object(hdr) \ + container_of(hdr, struct flat_binder_object, hdr) + +#define to_binder_fd_object(hdr) container_of(hdr, struct binder_fd_object, hdr) + +#define to_binder_buffer_object(hdr) \ + container_of(hdr, struct binder_buffer_object, hdr) + +#define to_binder_fd_array_object(hdr) \ + container_of(hdr, struct binder_fd_array_object, hdr) + enum binder_stat_types { BINDER_STAT_PROC, BINDER_STAT_THREAD, @@ -154,26 +197,27 @@ enum binder_stat_types { }; struct binder_stats { - int br[_IOC_NR(BR_FAILED_REPLY) + 1]; - int bc[_IOC_NR(BC_DEAD_BINDER_DONE) + 1]; - int obj_created[BINDER_STAT_COUNT]; - int obj_deleted[BINDER_STAT_COUNT]; + atomic_t br[_IOC_NR(BR_FAILED_REPLY) + 1]; + atomic_t bc[_IOC_NR(BC_REPLY_SG) + 1]; + atomic_t obj_created[BINDER_STAT_COUNT]; + atomic_t obj_deleted[BINDER_STAT_COUNT]; }; static struct binder_stats binder_stats; static inline void binder_stats_deleted(enum binder_stat_types type) { - binder_stats.obj_deleted[type]++; + atomic_inc(&binder_stats.obj_deleted[type]); } static inline void binder_stats_created(enum binder_stat_types type) { - binder_stats.obj_created[type]++; + atomic_inc(&binder_stats.obj_created[type]); } struct binder_transaction_log_entry { int debug_id; + int debug_id_done; int call_type; int from_proc; int from_thread; @@ -183,10 +227,14 @@ struct binder_transaction_log_entry { int to_node; int data_size; int offsets_size; + int return_error_line; + uint32_t return_error; + uint32_t return_error_param; + const char *context_name; }; struct binder_transaction_log { - int next; - int full; + atomic_t cur; + bool full; struct binder_transaction_log_entry entry[32]; }; static struct binder_transaction_log binder_transaction_log; @@ -196,22 +244,50 @@ static struct binder_transaction_log_entry *binder_transaction_log_add( struct binder_transaction_log *log) { struct binder_transaction_log_entry *e; + unsigned int cur = atomic_inc_return(&log->cur); - e = &log->entry[log->next]; - memset(e, 0, sizeof(*e)); - log->next++; - if (log->next == ARRAY_SIZE(log->entry)) { - log->next = 0; + if (cur >= ARRAY_SIZE(log->entry)) log->full = 1; - } + e = &log->entry[cur % ARRAY_SIZE(log->entry)]; + WRITE_ONCE(e->debug_id_done, 0); + /* + * write-barrier to synchronize access to e->debug_id_done. + * We make sure the initialized 0 value is seen before + * memset() other fields are zeroed by memset. + */ + smp_wmb(); + memset(e, 0, sizeof(*e)); return e; } +struct binder_context { + struct binder_node *binder_context_mgr_node; + struct mutex context_mgr_node_lock; + + kuid_t binder_context_mgr_uid; + const char *name; +}; + +struct binder_device { + struct hlist_node hlist; + struct miscdevice miscdev; + struct binder_context context; +}; + +/** + * struct binder_work - work enqueued on a worklist + * @entry: node enqueued on list + * @type: type of work to be performed + * + * There are separate work lists for proc, thread, and node (async). + */ struct binder_work { struct list_head entry; + enum { BINDER_WORK_TRANSACTION = 1, BINDER_WORK_TRANSACTION_COMPLETE, + BINDER_WORK_RETURN_ERROR, BINDER_WORK_NODE, BINDER_WORK_DEAD_BINDER, BINDER_WORK_DEAD_BINDER_AND_CLEAR, @@ -219,8 +295,76 @@ struct binder_work { } type; }; +struct binder_error { + struct binder_work work; + uint32_t cmd; +}; + +/** + * struct binder_node - binder node bookkeeping + * @debug_id: unique ID for debugging + * (invariant after initialized) + * @lock: lock for node fields + * @work: worklist element for node work + * (protected by @proc->inner_lock) + * @rb_node: element for proc->nodes tree + * (protected by @proc->inner_lock) + * @dead_node: element for binder_dead_nodes list + * (protected by binder_dead_nodes_lock) + * @proc: binder_proc that owns this node + * (invariant after initialized) + * @refs: list of references on this node + * (protected by @lock) + * @internal_strong_refs: used to take strong references when + * initiating a transaction + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @local_weak_refs: weak user refs from local process + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @local_strong_refs: strong user refs from local process + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @tmp_refs: temporary kernel refs + * (protected by @proc->inner_lock while @proc + * is valid, and by binder_dead_nodes_lock + * if @proc is NULL. During inc/dec and node release + * it is also protected by @lock to provide safety + * as the node dies and @proc becomes NULL) + * @ptr: userspace pointer for node + * (invariant, no lock needed) + * @cookie: userspace cookie for node + * (invariant, no lock needed) + * @has_strong_ref: userspace notified of strong ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @pending_strong_ref: userspace has acked notification of strong ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @has_weak_ref: userspace notified of weak ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @pending_weak_ref: userspace has acked notification of weak ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @has_async_transaction: async transaction to node in progress + * (protected by @lock) + * @sched_policy: minimum scheduling policy for node + * (invariant after initialized) + * @accept_fds: file descriptor operations supported for node + * (invariant after initialized) + * @min_priority: minimum scheduling priority + * (invariant after initialized) + * @inherit_rt: inherit RT scheduling policy from caller + * (invariant after initialized) + * @async_todo: list of async work items + * (protected by @proc->inner_lock) + * + * Bookkeeping structure for binder nodes. + */ struct binder_node { int debug_id; + spinlock_t lock; struct binder_work work; union { struct rb_node rb_node; @@ -231,87 +375,185 @@ struct binder_node { int internal_strong_refs; int local_weak_refs; int local_strong_refs; + int tmp_refs; binder_uintptr_t ptr; binder_uintptr_t cookie; - unsigned has_strong_ref:1; - unsigned pending_strong_ref:1; - unsigned has_weak_ref:1; - unsigned pending_weak_ref:1; - unsigned has_async_transaction:1; - unsigned accept_fds:1; - unsigned min_priority:8; + struct { + /* + * bitfield elements protected by + * proc inner_lock + */ + u8 has_strong_ref:1; + u8 pending_strong_ref:1; + u8 has_weak_ref:1; + u8 pending_weak_ref:1; + }; + struct { + /* + * invariant after initialization + */ + u8 sched_policy:2; + u8 inherit_rt:1; + u8 accept_fds:1; + u8 min_priority; + }; + bool has_async_transaction; struct list_head async_todo; }; struct binder_ref_death { + /** + * @work: worklist element for death notifications + * (protected by inner_lock of the proc that + * this ref belongs to) + */ struct binder_work work; binder_uintptr_t cookie; }; +/** + * struct binder_ref_data - binder_ref counts and id + * @debug_id: unique ID for the ref + * @desc: unique userspace handle for ref + * @strong: strong ref count (debugging only if not locked) + * @weak: weak ref count (debugging only if not locked) + * + * Structure to hold ref count and ref id information. Since + * the actual ref can only be accessed with a lock, this structure + * is used to return information about the ref to callers of + * ref inc/dec functions. + */ +struct binder_ref_data { + int debug_id; + uint32_t desc; + int strong; + int weak; +}; + +/** + * struct binder_ref - struct to track references on nodes + * @data: binder_ref_data containing id, handle, and current refcounts + * @rb_node_desc: node for lookup by @data.desc in proc's rb_tree + * @rb_node_node: node for lookup by @node in proc's rb_tree + * @node_entry: list entry for node->refs list in target node + * (protected by @node->lock) + * @proc: binder_proc containing ref + * @node: binder_node of target node. When cleaning up a + * ref for deletion in binder_cleanup_ref, a non-NULL + * @node indicates the node must be freed + * @death: pointer to death notification (ref_death) if requested + * (protected by @node->lock) + * + * Structure to track references from procA to target node (on procB). This + * structure is unsafe to access without holding @proc->outer_lock. + */ struct binder_ref { /* Lookups needed: */ /* node + proc => ref (transaction) */ /* desc + proc => ref (transaction, inc/dec ref) */ /* node => refs + procs (proc exit) */ - int debug_id; + struct binder_ref_data data; struct rb_node rb_node_desc; struct rb_node rb_node_node; struct hlist_node node_entry; struct binder_proc *proc; struct binder_node *node; - uint32_t desc; - int strong; - int weak; struct binder_ref_death *death; }; -struct binder_buffer { - struct list_head entry; /* free and allocated entries by address */ - struct rb_node rb_node; /* free entry by size or allocated entry */ - /* by address */ - unsigned free:1; - unsigned allow_user_free:1; - unsigned async_transaction:1; - unsigned debug_id:29; - - struct binder_transaction *transaction; - - struct binder_node *target_node; - size_t data_size; - size_t offsets_size; - uint8_t data[0]; -}; - enum binder_deferred_state { BINDER_DEFERRED_PUT_FILES = 0x01, BINDER_DEFERRED_FLUSH = 0x02, BINDER_DEFERRED_RELEASE = 0x04, }; +/** + * struct binder_priority - scheduler policy and priority + * @sched_policy scheduler policy + * @prio [100..139] for SCHED_NORMAL, [0..99] for FIFO/RT + * + * The binder driver supports inheriting the following scheduler policies: + * SCHED_NORMAL + * SCHED_BATCH + * SCHED_FIFO + * SCHED_RR + */ +struct binder_priority { + unsigned int sched_policy; + int prio; +}; + +/** + * struct binder_proc - binder process bookkeeping + * @proc_node: element for binder_procs list + * @threads: rbtree of binder_threads in this proc + * (protected by @inner_lock) + * @nodes: rbtree of binder nodes associated with + * this proc ordered by node->ptr + * (protected by @inner_lock) + * @refs_by_desc: rbtree of refs ordered by ref->desc + * (protected by @outer_lock) + * @refs_by_node: rbtree of refs ordered by ref->node + * (protected by @outer_lock) + * @waiting_threads: threads currently waiting for proc work + * (protected by @inner_lock) + * @pid PID of group_leader of process + * (invariant after initialized) + * @tsk task_struct for group_leader of process + * (invariant after initialized) + * @files files_struct for process + * (invariant after initialized) + * @deferred_work_node: element for binder_deferred_list + * (protected by binder_deferred_lock) + * @deferred_work: bitmap of deferred work to perform + * (protected by binder_deferred_lock) + * @is_dead: process is dead and awaiting free + * when outstanding transactions are cleaned up + * (protected by @inner_lock) + * @todo: list of work for this process + * (protected by @inner_lock) + * @wait: wait queue head to wait for proc work + * (invariant after initialized) + * @stats: per-process binder statistics + * (atomics, no lock needed) + * @delivered_death: list of delivered death notification + * (protected by @inner_lock) + * @max_threads: cap on number of binder threads + * (protected by @inner_lock) + * @requested_threads: number of binder threads requested but not + * yet started. In current implementation, can + * only be 0 or 1. + * (protected by @inner_lock) + * @requested_threads_started: number binder threads started + * (protected by @inner_lock) + * @tmp_ref: temporary reference to indicate proc is in use + * (protected by @inner_lock) + * @default_priority: default scheduler priority + * (invariant after initialized) + * @debugfs_entry: debugfs node + * @alloc: binder allocator bookkeeping + * @context: binder_context for this proc + * (invariant after initialized) + * @inner_lock: can nest under outer_lock and/or node lock + * @outer_lock: no nesting under innor or node lock + * Lock order: 1) outer, 2) node, 3) inner + * + * Bookkeeping structure for binder processes + */ struct binder_proc { struct hlist_node proc_node; struct rb_root threads; struct rb_root nodes; struct rb_root refs_by_desc; struct rb_root refs_by_node; + struct list_head waiting_threads; int pid; - struct vm_area_struct *vma; - struct mm_struct *vma_vm_mm; struct task_struct *tsk; struct files_struct *files; struct hlist_node deferred_work_node; int deferred_work; - void *buffer; - ptrdiff_t user_buffer_offset; - - struct list_head buffers; - struct rb_root free_buffers; - struct rb_root allocated_buffers; - size_t free_async_space; + bool is_dead; - struct page **pages; - size_t buffer_size; - uint32_t buffer_free; struct list_head todo; wait_queue_head_t wait; struct binder_stats stats; @@ -319,9 +561,13 @@ struct binder_proc { int max_threads; int requested_threads; int requested_threads_started; - int ready_threads; - long default_priority; + int tmp_ref; + struct binder_priority default_priority; struct dentry *debugfs_entry; + struct binder_alloc alloc; + struct binder_context *context; + spinlock_t inner_lock; + spinlock_t outer_lock; }; enum { @@ -330,22 +576,60 @@ enum { BINDER_LOOPER_STATE_EXITED = 0x04, BINDER_LOOPER_STATE_INVALID = 0x08, BINDER_LOOPER_STATE_WAITING = 0x10, - BINDER_LOOPER_STATE_NEED_RETURN = 0x20 + BINDER_LOOPER_STATE_POLL = 0x20, }; +/** + * struct binder_thread - binder thread bookkeeping + * @proc: binder process for this thread + * (invariant after initialization) + * @rb_node: element for proc->threads rbtree + * (protected by @proc->inner_lock) + * @waiting_thread_node: element for @proc->waiting_threads list + * (protected by @proc->inner_lock) + * @pid: PID for this thread + * (invariant after initialization) + * @looper: bitmap of looping state + * (only accessed by this thread) + * @looper_needs_return: looping thread needs to exit driver + * (no lock needed) + * @transaction_stack: stack of in-progress transactions for this thread + * (protected by @proc->inner_lock) + * @todo: list of work to do for this thread + * (protected by @proc->inner_lock) + * @return_error: transaction errors reported by this thread + * (only accessed by this thread) + * @reply_error: transaction errors reported by target thread + * (protected by @proc->inner_lock) + * @wait: wait queue for thread work + * @stats: per-thread statistics + * (atomics, no lock needed) + * @tmp_ref: temporary reference to indicate thread is in use + * (atomic since @proc->inner_lock cannot + * always be acquired) + * @is_dead: thread is dead and awaiting free + * when outstanding transactions are cleaned up + * (protected by @proc->inner_lock) + * @task: struct task_struct for this thread + * + * Bookkeeping structure for binder threads. + */ struct binder_thread { struct binder_proc *proc; struct rb_node rb_node; + struct list_head waiting_thread_node; int pid; - int looper; + int looper; /* only modified by this thread */ + bool looper_need_return; /* can be written by other thread */ struct binder_transaction *transaction_stack; struct list_head todo; - uint32_t return_error; /* Write failed, return error code in read buf */ - uint32_t return_error2; /* Write failed, return error code in read */ - /* buffer. Used when sending a reply to a dead process that */ - /* we are also waiting on */ + struct binder_error return_error; + struct binder_error reply_error; wait_queue_head_t wait; struct binder_stats stats; + atomic_t tmp_ref; + bool is_dead; + struct task_struct *task; }; struct binder_transaction { @@ -362,13 +646,257 @@ struct binder_transaction { struct binder_buffer *buffer; unsigned int code; unsigned int flags; - long priority; - long saved_priority; + struct binder_priority priority; + struct binder_priority saved_priority; + bool set_priority_called; kuid_t sender_euid; + /** + * @lock: protects @from, @to_proc, and @to_thread + * + * @from, @to_proc, and @to_thread can be set to NULL + * during thread teardown + */ + spinlock_t lock; }; +/** + * binder_proc_lock() - Acquire outer lock for given binder_proc + * @proc: struct binder_proc to acquire + * + * Acquires proc->outer_lock. Used to protect binder_ref + * structures associated with the given proc. + */ +#define binder_proc_lock(proc) _binder_proc_lock(proc, __LINE__) +static void +_binder_proc_lock(struct binder_proc *proc, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_lock(&proc->outer_lock); +} + +/** + * binder_proc_unlock() - Release spinlock for given binder_proc + * @proc: struct binder_proc to acquire + * + * Release lock acquired via binder_proc_lock() + */ +#define binder_proc_unlock(_proc) _binder_proc_unlock(_proc, __LINE__) +static void +_binder_proc_unlock(struct binder_proc *proc, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_unlock(&proc->outer_lock); +} + +/** + * binder_inner_proc_lock() - Acquire inner lock for given binder_proc + * @proc: struct binder_proc to acquire + * + * Acquires proc->inner_lock. Used to protect todo lists + */ +#define binder_inner_proc_lock(proc) _binder_inner_proc_lock(proc, __LINE__) +static void +_binder_inner_proc_lock(struct binder_proc *proc, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_lock(&proc->inner_lock); +} + +/** + * binder_inner_proc_unlock() - Release inner lock for given binder_proc + * @proc: struct binder_proc to acquire + * + * Release lock acquired via binder_inner_proc_lock() + */ +#define binder_inner_proc_unlock(proc) _binder_inner_proc_unlock(proc, __LINE__) +static void +_binder_inner_proc_unlock(struct binder_proc *proc, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_unlock(&proc->inner_lock); +} + +/** + * binder_node_lock() - Acquire spinlock for given binder_node + * @node: struct binder_node to acquire + * + * Acquires node->lock. Used to protect binder_node fields + */ +#define binder_node_lock(node) _binder_node_lock(node, __LINE__) +static void +_binder_node_lock(struct binder_node *node, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_lock(&node->lock); +} + +/** + * binder_node_unlock() - Release spinlock for given binder_proc + * @node: struct binder_node to acquire + * + * Release lock acquired via binder_node_lock() + */ +#define binder_node_unlock(node) _binder_node_unlock(node, __LINE__) +static void +_binder_node_unlock(struct binder_node *node, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_unlock(&node->lock); +} + +/** + * binder_node_inner_lock() - Acquire node and inner locks + * @node: struct binder_node to acquire + * + * Acquires node->lock. If node->proc also acquires + * proc->inner_lock. Used to protect binder_node fields + */ +#define binder_node_inner_lock(node) _binder_node_inner_lock(node, __LINE__) +static void +_binder_node_inner_lock(struct binder_node *node, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_lock(&node->lock); + if (node->proc) + binder_inner_proc_lock(node->proc); +} + +/** + * binder_node_unlock() - Release node and inner locks + * @node: struct binder_node to acquire + * + * Release lock acquired via binder_node_lock() + */ +#define binder_node_inner_unlock(node) _binder_node_inner_unlock(node, __LINE__) +static void +_binder_node_inner_unlock(struct binder_node *node, int line) +{ + struct binder_proc *proc = node->proc; + + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + if (proc) + binder_inner_proc_unlock(proc); + spin_unlock(&node->lock); +} + +static bool binder_worklist_empty_ilocked(struct list_head *list) +{ + return list_empty(list); +} + +/** + * binder_worklist_empty() - Check if no items on the work list + * @proc: binder_proc associated with list + * @list: list to check + * + * Return: true if there are no items on list, else false + */ +static bool binder_worklist_empty(struct binder_proc *proc, + struct list_head *list) +{ + bool ret; + + binder_inner_proc_lock(proc); + ret = binder_worklist_empty_ilocked(list); + binder_inner_proc_unlock(proc); + return ret; +} + +static void +binder_enqueue_work_ilocked(struct binder_work *work, + struct list_head *target_list) +{ + BUG_ON(target_list == NULL); + BUG_ON(work->entry.next && !list_empty(&work->entry)); + list_add_tail(&work->entry, target_list); +} + +/** + * binder_enqueue_work() - Add an item to the work list + * @proc: binder_proc associated with list + * @work: struct binder_work to add to list + * @target_list: list to add work to + * + * Adds the work to the specified list. Asserts that work + * is not already on a list. + */ +static void +binder_enqueue_work(struct binder_proc *proc, + struct binder_work *work, + struct list_head *target_list) +{ + binder_inner_proc_lock(proc); + binder_enqueue_work_ilocked(work, target_list); + binder_inner_proc_unlock(proc); +} + +static void +binder_dequeue_work_ilocked(struct binder_work *work) +{ + list_del_init(&work->entry); +} + +/** + * binder_dequeue_work() - Removes an item from the work list + * @proc: binder_proc associated with list + * @work: struct binder_work to remove from list + * + * Removes the specified work item from whatever list it is on. + * Can safely be called if work is not on any list. + */ +static void +binder_dequeue_work(struct binder_proc *proc, struct binder_work *work) +{ + binder_inner_proc_lock(proc); + binder_dequeue_work_ilocked(work); + binder_inner_proc_unlock(proc); +} + +static struct binder_work *binder_dequeue_work_head_ilocked( + struct list_head *list) +{ + struct binder_work *w; + + w = list_first_entry_or_null(list, struct binder_work, entry); + if (w) + list_del_init(&w->entry); + return w; +} + +/** + * binder_dequeue_work_head() - Dequeues the item at head of list + * @proc: binder_proc associated with list + * @list: list to dequeue head + * + * Removes the head of the list if there are items on the list + * + * Return: pointer dequeued binder_work, NULL if list was empty + */ +static struct binder_work *binder_dequeue_work_head( + struct binder_proc *proc, + struct list_head *list) +{ + struct binder_work *w; + + binder_inner_proc_lock(proc); + w = binder_dequeue_work_head_ilocked(list); + binder_inner_proc_unlock(proc); + return w; +} + static void binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer); +static void binder_free_thread(struct binder_thread *thread); +static void binder_free_proc(struct binder_proc *proc); +static void binder_inc_node_tmpref_ilocked(struct binder_node *node); static int task_get_unused_fd_flags(struct binder_proc *proc, int flags) { @@ -419,475 +947,330 @@ static long task_close_fd(struct binder_proc *proc, unsigned int fd) return retval; } -static inline void binder_lock(const char *tag) +static bool binder_has_work_ilocked(struct binder_thread *thread, + bool do_proc_work) { - trace_binder_lock(tag); - mutex_lock(&binder_main_lock); - trace_binder_locked(tag); + return !binder_worklist_empty_ilocked(&thread->todo) || + thread->looper_need_return || + (do_proc_work && + !binder_worklist_empty_ilocked(&thread->proc->todo)); } -static inline void binder_unlock(const char *tag) +static bool binder_has_work(struct binder_thread *thread, bool do_proc_work) { - trace_binder_unlock(tag); - mutex_unlock(&binder_main_lock); -} + bool has_work; -static void binder_set_nice(long nice) -{ - long min_nice; + binder_inner_proc_lock(thread->proc); + has_work = binder_has_work_ilocked(thread, do_proc_work); + binder_inner_proc_unlock(thread->proc); - if (can_nice(current, nice)) { - set_user_nice(current, nice); - return; - } - min_nice = rlimit_to_nice(current->signal->rlim[RLIMIT_NICE].rlim_cur); - binder_debug(BINDER_DEBUG_PRIORITY_CAP, - "%d: nice value %ld not allowed use %ld instead\n", - current->pid, nice, min_nice); - set_user_nice(current, min_nice); - if (min_nice <= MAX_NICE) - return; - binder_user_error("%d RLIMIT_NICE not set\n", current->pid); + return has_work; } -static size_t binder_buffer_size(struct binder_proc *proc, - struct binder_buffer *buffer) +static bool binder_available_for_proc_work_ilocked(struct binder_thread *thread) { - if (list_is_last(&buffer->entry, &proc->buffers)) - return proc->buffer + proc->buffer_size - (void *)buffer->data; - return (size_t)list_entry(buffer->entry.next, - struct binder_buffer, entry) - (size_t)buffer->data; + return !thread->transaction_stack && + binder_worklist_empty_ilocked(&thread->todo) && + (thread->looper & (BINDER_LOOPER_STATE_ENTERED | + BINDER_LOOPER_STATE_REGISTERED)); } -static void binder_insert_free_buffer(struct binder_proc *proc, - struct binder_buffer *new_buffer) +static void binder_wakeup_poll_threads_ilocked(struct binder_proc *proc, + bool sync) { - struct rb_node **p = &proc->free_buffers.rb_node; - struct rb_node *parent = NULL; - struct binder_buffer *buffer; - size_t buffer_size; - size_t new_buffer_size; - - BUG_ON(!new_buffer->free); - - new_buffer_size = binder_buffer_size(proc, new_buffer); - - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: add free buffer, size %zd, at %pK\n", - proc->pid, new_buffer_size, new_buffer); - - while (*p) { - parent = *p; - buffer = rb_entry(parent, struct binder_buffer, rb_node); - BUG_ON(!buffer->free); - - buffer_size = binder_buffer_size(proc, buffer); + struct rb_node *n; + struct binder_thread *thread; - if (new_buffer_size < buffer_size) - p = &parent->rb_left; - else - p = &parent->rb_right; + for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) { + thread = rb_entry(n, struct binder_thread, rb_node); + if (thread->looper & BINDER_LOOPER_STATE_POLL && + binder_available_for_proc_work_ilocked(thread)) { + if (sync) + wake_up_interruptible_sync(&thread->wait); + else + wake_up_interruptible(&thread->wait); + } } - rb_link_node(&new_buffer->rb_node, parent, p); - rb_insert_color(&new_buffer->rb_node, &proc->free_buffers); } -static void binder_insert_allocated_buffer(struct binder_proc *proc, - struct binder_buffer *new_buffer) +/** + * binder_select_thread_ilocked() - selects a thread for doing proc work. + * @proc: process to select a thread from + * + * Note that calling this function moves the thread off the waiting_threads + * list, so it can only be woken up by the caller of this function, or a + * signal. Therefore, callers *should* always wake up the thread this function + * returns. + * + * Return: If there's a thread currently waiting for process work, + * returns that thread. Otherwise returns NULL. + */ +static struct binder_thread * +binder_select_thread_ilocked(struct binder_proc *proc) { - struct rb_node **p = &proc->allocated_buffers.rb_node; - struct rb_node *parent = NULL; - struct binder_buffer *buffer; + struct binder_thread *thread; - BUG_ON(new_buffer->free); + assert_spin_locked(&proc->inner_lock); + thread = list_first_entry_or_null(&proc->waiting_threads, + struct binder_thread, + waiting_thread_node); - while (*p) { - parent = *p; - buffer = rb_entry(parent, struct binder_buffer, rb_node); - BUG_ON(buffer->free); + if (thread) + list_del_init(&thread->waiting_thread_node); - if (new_buffer < buffer) - p = &parent->rb_left; - else if (new_buffer > buffer) - p = &parent->rb_right; - else - BUG(); - } - rb_link_node(&new_buffer->rb_node, parent, p); - rb_insert_color(&new_buffer->rb_node, &proc->allocated_buffers); + return thread; } -static struct binder_buffer *binder_buffer_lookup(struct binder_proc *proc, - uintptr_t user_ptr) +/** + * binder_wakeup_thread_ilocked() - wakes up a thread for doing proc work. + * @proc: process to wake up a thread in + * @thread: specific thread to wake-up (may be NULL) + * @sync: whether to do a synchronous wake-up + * + * This function wakes up a thread in the @proc process. + * The caller may provide a specific thread to wake-up in + * the @thread parameter. If @thread is NULL, this function + * will wake up threads that have called poll(). + * + * Note that for this function to work as expected, callers + * should first call binder_select_thread() to find a thread + * to handle the work (if they don't have a thread already), + * and pass the result into the @thread parameter. + */ +static void binder_wakeup_thread_ilocked(struct binder_proc *proc, + struct binder_thread *thread, + bool sync) { - struct rb_node *n = proc->allocated_buffers.rb_node; - struct binder_buffer *buffer; - struct binder_buffer *kern_ptr; + assert_spin_locked(&proc->inner_lock); - kern_ptr = (struct binder_buffer *)(user_ptr - proc->user_buffer_offset - - offsetof(struct binder_buffer, data)); - - while (n) { - buffer = rb_entry(n, struct binder_buffer, rb_node); - BUG_ON(buffer->free); - - if (kern_ptr < buffer) - n = n->rb_left; - else if (kern_ptr > buffer) - n = n->rb_right; + if (thread) { + if (sync) + wake_up_interruptible_sync(&thread->wait); else - return buffer; + wake_up_interruptible(&thread->wait); + return; } - return NULL; + + /* Didn't find a thread waiting for proc work; this can happen + * in two scenarios: + * 1. All threads are busy handling transactions + * In that case, one of those threads should call back into + * the kernel driver soon and pick up this work. + * 2. Threads are using the (e)poll interface, in which case + * they may be blocked on the waitqueue without having been + * added to waiting_threads. For this case, we just iterate + * over all threads not handling transaction work, and + * wake them all up. We wake all because we don't know whether + * a thread that called into (e)poll is handling non-binder + * work currently. + */ + binder_wakeup_poll_threads_ilocked(proc, sync); } -static int binder_update_page_range(struct binder_proc *proc, int allocate, - void *start, void *end, - struct vm_area_struct *vma) +static void binder_wakeup_proc_ilocked(struct binder_proc *proc) { - void *page_addr; - unsigned long user_page_addr; - struct page **page; - struct mm_struct *mm; - - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: %s pages %pK-%pK\n", proc->pid, - allocate ? "allocate" : "free", start, end); + struct binder_thread *thread = binder_select_thread_ilocked(proc); - if (end <= start) - return 0; + binder_wakeup_thread_ilocked(proc, thread, /* sync = */false); +} - trace_binder_update_page_range(proc, allocate, start, end); +static bool is_rt_policy(int policy) +{ + return policy == SCHED_FIFO || policy == SCHED_RR; +} - if (vma) - mm = NULL; - else - mm = get_task_mm(proc->tsk); +static bool is_fair_policy(int policy) +{ + return policy == SCHED_NORMAL || policy == SCHED_BATCH; +} - if (mm) { - down_write(&mm->mmap_sem); - vma = proc->vma; - if (vma && mm != proc->vma_vm_mm) { - pr_err("%d: vma mm and task mm mismatch\n", - proc->pid); - vma = NULL; - } - } +static bool binder_supported_policy(int policy) +{ + return is_fair_policy(policy) || is_rt_policy(policy); +} - if (allocate == 0) - goto free_range; +static int to_userspace_prio(int policy, int kernel_priority) +{ + if (is_fair_policy(policy)) + return PRIO_TO_NICE(kernel_priority); + else + return MAX_USER_RT_PRIO - 1 - kernel_priority; +} - if (vma == NULL) { - pr_err("%d: binder_alloc_buf failed to map pages in userspace, no vma\n", - proc->pid); - goto err_no_vma; - } +static int to_kernel_prio(int policy, int user_priority) +{ + if (is_fair_policy(policy)) + return NICE_TO_PRIO(user_priority); + else + return MAX_USER_RT_PRIO - 1 - user_priority; +} - for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) { - int ret; +static void binder_do_set_priority(struct task_struct *task, + struct binder_priority desired, + bool verify) +{ + int priority; /* user-space prio value */ + bool has_cap_nice; + unsigned int policy = desired.sched_policy; - page = &proc->pages[(page_addr - proc->buffer) / PAGE_SIZE]; - - BUG_ON(*page); - *page = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO); - if (*page == NULL) { - pr_err("%d: binder_alloc_buf failed for page at %pK\n", - proc->pid, page_addr); - goto err_alloc_page_failed; - } - ret = map_kernel_range_noflush((unsigned long)page_addr, - PAGE_SIZE, PAGE_KERNEL, page); - flush_cache_vmap((unsigned long)page_addr, - (unsigned long)page_addr + PAGE_SIZE); - if (ret != 1) { - pr_err("%d: binder_alloc_buf failed to map page at %pK in kernel\n", - proc->pid, page_addr); - goto err_map_kernel_failed; - } - user_page_addr = - (uintptr_t)page_addr + proc->user_buffer_offset; - ret = vm_insert_page(vma, user_page_addr, page[0]); - if (ret) { - pr_err("%d: binder_alloc_buf failed to map page at %lx in userspace\n", - proc->pid, user_page_addr); - goto err_vm_insert_page_failed; - } - /* vm_insert_page does not seem to increment the refcount */ - } - if (mm) { - up_write(&mm->mmap_sem); - mmput(mm); - } - return 0; + if (task->policy == policy && task->normal_prio == desired.prio) + return; -free_range: - for (page_addr = end - PAGE_SIZE; page_addr >= start; - page_addr -= PAGE_SIZE) { - page = &proc->pages[(page_addr - proc->buffer) / PAGE_SIZE]; - if (vma) - zap_page_range(vma, (uintptr_t)page_addr + - proc->user_buffer_offset, PAGE_SIZE, NULL); -err_vm_insert_page_failed: - unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE); -err_map_kernel_failed: - __free_page(*page); - *page = NULL; -err_alloc_page_failed: - ; - } -err_no_vma: - if (mm) { - up_write(&mm->mmap_sem); - mmput(mm); - } - return -ENOMEM; -} - -static struct binder_buffer *binder_alloc_buf(struct binder_proc *proc, - size_t data_size, - size_t offsets_size, int is_async) -{ - struct rb_node *n = proc->free_buffers.rb_node; - struct binder_buffer *buffer; - size_t buffer_size; - struct rb_node *best_fit = NULL; - void *has_page_addr; - void *end_page_addr; - size_t size; - - if (proc->vma == NULL) { - pr_err("%d: binder_alloc_buf, no vma\n", - proc->pid); - return NULL; - } + has_cap_nice = has_capability_noaudit(task, CAP_SYS_NICE); - size = ALIGN(data_size, sizeof(void *)) + - ALIGN(offsets_size, sizeof(void *)); + priority = to_userspace_prio(policy, desired.prio); - if (size < data_size || size < offsets_size) { - binder_user_error("%d: got transaction with invalid size %zd-%zd\n", - proc->pid, data_size, offsets_size); - return NULL; - } + if (verify && is_rt_policy(policy) && !has_cap_nice) { + long max_rtprio = task_rlimit(task, RLIMIT_RTPRIO); - if (is_async && - proc->free_async_space < size + sizeof(struct binder_buffer)) { - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_alloc_buf size %zd failed, no async space left\n", - proc->pid, size); - return NULL; + if (max_rtprio == 0) { + policy = SCHED_NORMAL; + priority = MIN_NICE; + } else if (priority > max_rtprio) { + priority = max_rtprio; + } } - while (n) { - buffer = rb_entry(n, struct binder_buffer, rb_node); - BUG_ON(!buffer->free); - buffer_size = binder_buffer_size(proc, buffer); + if (verify && is_fair_policy(policy) && !has_cap_nice) { + long min_nice = rlimit_to_nice(task_rlimit(task, RLIMIT_NICE)); - if (size < buffer_size) { - best_fit = n; - n = n->rb_left; - } else if (size > buffer_size) - n = n->rb_right; - else { - best_fit = n; - break; + if (min_nice > MAX_NICE) { + binder_user_error("%d RLIMIT_NICE not set\n", + task->pid); + return; + } else if (priority < min_nice) { + priority = min_nice; } } - if (best_fit == NULL) { - pr_err("%d: binder_alloc_buf size %zd failed, no address space\n", - proc->pid, size); - return NULL; - } - if (n == NULL) { - buffer = rb_entry(best_fit, struct binder_buffer, rb_node); - buffer_size = binder_buffer_size(proc, buffer); - } - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_alloc_buf size %zd got buffer %pK size %zd\n", - proc->pid, size, buffer, buffer_size); + if (policy != desired.sched_policy || + to_kernel_prio(policy, priority) != desired.prio) + binder_debug(BINDER_DEBUG_PRIORITY_CAP, + "%d: priority %d not allowed, using %d instead\n", + task->pid, desired.prio, + to_kernel_prio(policy, priority)); - has_page_addr = - (void *)(((uintptr_t)buffer->data + buffer_size) & PAGE_MASK); - if (n == NULL) { - if (size + sizeof(struct binder_buffer) + 4 >= buffer_size) - buffer_size = size; /* no room for other buffers */ - else - buffer_size = size + sizeof(struct binder_buffer); - } - end_page_addr = - (void *)PAGE_ALIGN((uintptr_t)buffer->data + buffer_size); - if (end_page_addr > has_page_addr) - end_page_addr = has_page_addr; - if (binder_update_page_range(proc, 1, - (void *)PAGE_ALIGN((uintptr_t)buffer->data), end_page_addr, NULL)) - return NULL; + trace_binder_set_priority(task->tgid, task->pid, task->normal_prio, + to_kernel_prio(policy, priority), + desired.prio); - rb_erase(best_fit, &proc->free_buffers); - buffer->free = 0; - binder_insert_allocated_buffer(proc, buffer); - if (buffer_size != size) { - struct binder_buffer *new_buffer = (void *)buffer->data + size; + /* Set the actual priority */ + if (task->policy != policy || is_rt_policy(policy)) { + struct sched_param params; - list_add(&new_buffer->entry, &buffer->entry); - new_buffer->free = 1; - binder_insert_free_buffer(proc, new_buffer); - } - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_alloc_buf size %zd got %pK\n", - proc->pid, size, buffer); - buffer->data_size = data_size; - buffer->offsets_size = offsets_size; - buffer->async_transaction = is_async; - if (is_async) { - proc->free_async_space -= size + sizeof(struct binder_buffer); - binder_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, - "%d: binder_alloc_buf size %zd async free %zd\n", - proc->pid, size, proc->free_async_space); - } + params.sched_priority = is_rt_policy(policy) ? priority : 0; - return buffer; + sched_setscheduler_nocheck(task, + policy | SCHED_RESET_ON_FORK, + ¶ms); + } + if (is_fair_policy(policy)) + set_user_nice(task, priority); } -static void *buffer_start_page(struct binder_buffer *buffer) +static void binder_set_priority(struct task_struct *task, + struct binder_priority desired) { - return (void *)((uintptr_t)buffer & PAGE_MASK); + binder_do_set_priority(task, desired, /* verify = */ true); } -static void *buffer_end_page(struct binder_buffer *buffer) +static void binder_restore_priority(struct task_struct *task, + struct binder_priority desired) { - return (void *)(((uintptr_t)(buffer + 1) - 1) & PAGE_MASK); + binder_do_set_priority(task, desired, /* verify = */ false); } -static void binder_delete_free_buffer(struct binder_proc *proc, - struct binder_buffer *buffer) +static void binder_transaction_priority(struct task_struct *task, + struct binder_transaction *t, + struct binder_priority node_prio, + bool inherit_rt) { - struct binder_buffer *prev, *next = NULL; - int free_page_end = 1; - int free_page_start = 1; + struct binder_priority desired_prio = t->priority; - BUG_ON(proc->buffers.next == &buffer->entry); - prev = list_entry(buffer->entry.prev, struct binder_buffer, entry); - BUG_ON(!prev->free); - if (buffer_end_page(prev) == buffer_start_page(buffer)) { - free_page_start = 0; - if (buffer_end_page(prev) == buffer_end_page(buffer)) - free_page_end = 0; - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: merge free, buffer %pK share page with %pK\n", - proc->pid, buffer, prev); - } + if (t->set_priority_called) + return; - if (!list_is_last(&buffer->entry, &proc->buffers)) { - next = list_entry(buffer->entry.next, - struct binder_buffer, entry); - if (buffer_start_page(next) == buffer_end_page(buffer)) { - free_page_end = 0; - if (buffer_start_page(next) == - buffer_start_page(buffer)) - free_page_start = 0; - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: merge free, buffer %pK share page with %pK\n", - proc->pid, buffer, prev); - } + t->set_priority_called = true; + t->saved_priority.sched_policy = task->policy; + t->saved_priority.prio = task->normal_prio; + + if (!inherit_rt && is_rt_policy(desired_prio.sched_policy)) { + desired_prio.prio = NICE_TO_PRIO(0); + desired_prio.sched_policy = SCHED_NORMAL; } - list_del(&buffer->entry); - if (free_page_start || free_page_end) { - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: merge free, buffer %pK do not share page%s%s with %pK or %pK\n", - proc->pid, buffer, free_page_start ? "" : " end", - free_page_end ? "" : " start", prev, next); - binder_update_page_range(proc, 0, free_page_start ? - buffer_start_page(buffer) : buffer_end_page(buffer), - (free_page_end ? buffer_end_page(buffer) : - buffer_start_page(buffer)) + PAGE_SIZE, NULL); + + if (node_prio.prio < t->priority.prio || + (node_prio.prio == t->priority.prio && + node_prio.sched_policy == SCHED_FIFO)) { + /* + * In case the minimum priority on the node is + * higher (lower value), use that priority. If + * the priority is the same, but the node uses + * SCHED_FIFO, prefer SCHED_FIFO, since it can + * run unbounded, unlike SCHED_RR. + */ + desired_prio = node_prio; } + + binder_set_priority(task, desired_prio); } -static void binder_free_buf(struct binder_proc *proc, - struct binder_buffer *buffer) +static struct binder_node *binder_get_node_ilocked(struct binder_proc *proc, + binder_uintptr_t ptr) { - size_t size, buffer_size; + struct rb_node *n = proc->nodes.rb_node; + struct binder_node *node; - buffer_size = binder_buffer_size(proc, buffer); + assert_spin_locked(&proc->inner_lock); - size = ALIGN(buffer->data_size, sizeof(void *)) + - ALIGN(buffer->offsets_size, sizeof(void *)); + while (n) { + node = rb_entry(n, struct binder_node, rb_node); - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_free_buf %pK size %zd buffer_size %zd\n", - proc->pid, buffer, size, buffer_size); - - BUG_ON(buffer->free); - BUG_ON(size > buffer_size); - BUG_ON(buffer->transaction != NULL); - BUG_ON((void *)buffer < proc->buffer); - BUG_ON((void *)buffer > proc->buffer + proc->buffer_size); - - if (buffer->async_transaction) { - proc->free_async_space += size + sizeof(struct binder_buffer); - - binder_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, - "%d: binder_free_buf size %zd async free %zd\n", - proc->pid, size, proc->free_async_space); - } - - binder_update_page_range(proc, 0, - (void *)PAGE_ALIGN((uintptr_t)buffer->data), - (void *)(((uintptr_t)buffer->data + buffer_size) & PAGE_MASK), - NULL); - rb_erase(&buffer->rb_node, &proc->allocated_buffers); - buffer->free = 1; - if (!list_is_last(&buffer->entry, &proc->buffers)) { - struct binder_buffer *next = list_entry(buffer->entry.next, - struct binder_buffer, entry); - - if (next->free) { - rb_erase(&next->rb_node, &proc->free_buffers); - binder_delete_free_buffer(proc, next); - } - } - if (proc->buffers.next != &buffer->entry) { - struct binder_buffer *prev = list_entry(buffer->entry.prev, - struct binder_buffer, entry); - - if (prev->free) { - binder_delete_free_buffer(proc, buffer); - rb_erase(&prev->rb_node, &proc->free_buffers); - buffer = prev; + if (ptr < node->ptr) + n = n->rb_left; + else if (ptr > node->ptr) + n = n->rb_right; + else { + /* + * take an implicit weak reference + * to ensure node stays alive until + * call to binder_put_node() + */ + binder_inc_node_tmpref_ilocked(node); + return node; } } - binder_insert_free_buffer(proc, buffer); + return NULL; } static struct binder_node *binder_get_node(struct binder_proc *proc, binder_uintptr_t ptr) { - struct rb_node *n = proc->nodes.rb_node; struct binder_node *node; - while (n) { - node = rb_entry(n, struct binder_node, rb_node); - - if (ptr < node->ptr) - n = n->rb_left; - else if (ptr > node->ptr) - n = n->rb_right; - else - return node; - } - return NULL; + binder_inner_proc_lock(proc); + node = binder_get_node_ilocked(proc, ptr); + binder_inner_proc_unlock(proc); + return node; } -static struct binder_node *binder_new_node(struct binder_proc *proc, - binder_uintptr_t ptr, - binder_uintptr_t cookie) +static struct binder_node *binder_init_node_ilocked( + struct binder_proc *proc, + struct binder_node *new_node, + struct flat_binder_object *fp) { struct rb_node **p = &proc->nodes.rb_node; struct rb_node *parent = NULL; struct binder_node *node; + binder_uintptr_t ptr = fp ? fp->binder : 0; + binder_uintptr_t cookie = fp ? fp->cookie : 0; + __u32 flags = fp ? fp->flags : 0; + s8 priority; + + assert_spin_locked(&proc->inner_lock); while (*p) { + parent = *p; node = rb_entry(parent, struct binder_node, rb_node); @@ -895,39 +1278,87 @@ static struct binder_node *binder_new_node(struct binder_proc *proc, p = &(*p)->rb_left; else if (ptr > node->ptr) p = &(*p)->rb_right; - else - return NULL; + else { + /* + * A matching node is already in + * the rb tree. Abandon the init + * and return it. + */ + binder_inc_node_tmpref_ilocked(node); + return node; + } } - - node = kzalloc(sizeof(*node), GFP_KERNEL); - if (node == NULL) - return NULL; + node = new_node; binder_stats_created(BINDER_STAT_NODE); + node->tmp_refs++; rb_link_node(&node->rb_node, parent, p); rb_insert_color(&node->rb_node, &proc->nodes); - node->debug_id = ++binder_last_id; + node->debug_id = atomic_inc_return(&binder_last_id); node->proc = proc; node->ptr = ptr; node->cookie = cookie; node->work.type = BINDER_WORK_NODE; + priority = flags & FLAT_BINDER_FLAG_PRIORITY_MASK; + node->sched_policy = (flags & FLAT_BINDER_FLAG_SCHED_POLICY_MASK) >> + FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT; + node->min_priority = to_kernel_prio(node->sched_policy, priority); + node->accept_fds = !!(flags & FLAT_BINDER_FLAG_ACCEPTS_FDS); +/* node->inherit_rt = !!(flags & FLAT_BINDER_FLAG_INHERIT_RT);*/ + node->inherit_rt = true; + spin_lock_init(&node->lock); INIT_LIST_HEAD(&node->work.entry); INIT_LIST_HEAD(&node->async_todo); binder_debug(BINDER_DEBUG_INTERNAL_REFS, "%d:%d node %d u%016llx c%016llx created\n", proc->pid, current->pid, node->debug_id, (u64)node->ptr, (u64)node->cookie); + return node; } -static int binder_inc_node(struct binder_node *node, int strong, int internal, - struct list_head *target_list) +static struct binder_node *binder_new_node(struct binder_proc *proc, + struct flat_binder_object *fp) +{ + struct binder_node *node; + struct binder_node *new_node = kzalloc(sizeof(*node), GFP_KERNEL); + + if (!new_node) + return NULL; + binder_inner_proc_lock(proc); + node = binder_init_node_ilocked(proc, new_node, fp); + binder_inner_proc_unlock(proc); + if (node != new_node) + /* + * The node was already added by another thread + */ + kfree(new_node); + + return node; +} + +static void binder_free_node(struct binder_node *node) +{ + kfree(node); + binder_stats_deleted(BINDER_STAT_NODE); +} + +static int binder_inc_node_nilocked(struct binder_node *node, int strong, + int internal, + struct list_head *target_list) { + struct binder_proc *proc = node->proc; + + assert_spin_locked(&node->lock); + if (proc) + assert_spin_locked(&proc->inner_lock); if (strong) { if (internal) { if (target_list == NULL && node->internal_strong_refs == 0 && - !(node == binder_context_mgr_node && - node->has_strong_ref)) { + !(node->proc && + node == node->proc->context-> + binder_context_mgr_node && + node->has_strong_ref)) { pr_err("invalid inc strong node for %d\n", node->debug_id); return -EINVAL; @@ -936,8 +1367,8 @@ static int binder_inc_node(struct binder_node *node, int strong, int internal, } else node->local_strong_refs++; if (!node->has_strong_ref && target_list) { - list_del_init(&node->work.entry); - list_add_tail(&node->work.entry, target_list); + binder_dequeue_work_ilocked(&node->work); + binder_enqueue_work_ilocked(&node->work, target_list); } } else { if (!internal) @@ -948,58 +1379,169 @@ static int binder_inc_node(struct binder_node *node, int strong, int internal, node->debug_id); return -EINVAL; } - list_add_tail(&node->work.entry, target_list); + binder_enqueue_work_ilocked(&node->work, target_list); } } return 0; } -static int binder_dec_node(struct binder_node *node, int strong, int internal) +static int binder_inc_node(struct binder_node *node, int strong, int internal, + struct list_head *target_list) +{ + int ret; + + binder_node_inner_lock(node); + ret = binder_inc_node_nilocked(node, strong, internal, target_list); + binder_node_inner_unlock(node); + + return ret; +} + +static bool binder_dec_node_nilocked(struct binder_node *node, + int strong, int internal) { + struct binder_proc *proc = node->proc; + + assert_spin_locked(&node->lock); + if (proc) + assert_spin_locked(&proc->inner_lock); if (strong) { if (internal) node->internal_strong_refs--; else node->local_strong_refs--; if (node->local_strong_refs || node->internal_strong_refs) - return 0; + return false; } else { if (!internal) node->local_weak_refs--; - if (node->local_weak_refs || !hlist_empty(&node->refs)) - return 0; + if (node->local_weak_refs || node->tmp_refs || + !hlist_empty(&node->refs)) + return false; } - if (node->proc && (node->has_strong_ref || node->has_weak_ref)) { + + if (proc && (node->has_strong_ref || node->has_weak_ref)) { if (list_empty(&node->work.entry)) { - list_add_tail(&node->work.entry, &node->proc->todo); - wake_up_interruptible(&node->proc->wait); + binder_enqueue_work_ilocked(&node->work, &proc->todo); + binder_wakeup_proc_ilocked(proc); } } else { if (hlist_empty(&node->refs) && !node->local_strong_refs && - !node->local_weak_refs) { - list_del_init(&node->work.entry); - if (node->proc) { - rb_erase(&node->rb_node, &node->proc->nodes); + !node->local_weak_refs && !node->tmp_refs) { + if (proc) { + binder_dequeue_work_ilocked(&node->work); + rb_erase(&node->rb_node, &proc->nodes); binder_debug(BINDER_DEBUG_INTERNAL_REFS, "refless node %d deleted\n", node->debug_id); } else { + BUG_ON(!list_empty(&node->work.entry)); + spin_lock(&binder_dead_nodes_lock); + /* + * tmp_refs could have changed so + * check it again + */ + if (node->tmp_refs) { + spin_unlock(&binder_dead_nodes_lock); + return false; + } hlist_del(&node->dead_node); + spin_unlock(&binder_dead_nodes_lock); binder_debug(BINDER_DEBUG_INTERNAL_REFS, "dead node %d deleted\n", node->debug_id); } - kfree(node); - binder_stats_deleted(BINDER_STAT_NODE); + return true; } } + return false; +} - return 0; +static void binder_dec_node(struct binder_node *node, int strong, int internal) +{ + bool free_node; + + binder_node_inner_lock(node); + free_node = binder_dec_node_nilocked(node, strong, internal); + binder_node_inner_unlock(node); + if (free_node) + binder_free_node(node); } +static void binder_inc_node_tmpref_ilocked(struct binder_node *node) +{ + /* + * No call to binder_inc_node() is needed since we + * don't need to inform userspace of any changes to + * tmp_refs + */ + node->tmp_refs++; +} -static struct binder_ref *binder_get_ref(struct binder_proc *proc, - uint32_t desc, bool need_strong_ref) +/** + * binder_inc_node_tmpref() - take a temporary reference on node + * @node: node to reference + * + * Take reference on node to prevent the node from being freed + * while referenced only by a local variable. The inner lock is + * needed to serialize with the node work on the queue (which + * isn't needed after the node is dead). If the node is dead + * (node->proc is NULL), use binder_dead_nodes_lock to protect + * node->tmp_refs against dead-node-only cases where the node + * lock cannot be acquired (eg traversing the dead node list to + * print nodes) + */ +static void binder_inc_node_tmpref(struct binder_node *node) +{ + binder_node_lock(node); + if (node->proc) + binder_inner_proc_lock(node->proc); + else + spin_lock(&binder_dead_nodes_lock); + binder_inc_node_tmpref_ilocked(node); + if (node->proc) + binder_inner_proc_unlock(node->proc); + else + spin_unlock(&binder_dead_nodes_lock); + binder_node_unlock(node); +} + +/** + * binder_dec_node_tmpref() - remove a temporary reference on node + * @node: node to reference + * + * Release temporary reference on node taken via binder_inc_node_tmpref() + */ +static void binder_dec_node_tmpref(struct binder_node *node) +{ + bool free_node; + + binder_node_inner_lock(node); + if (!node->proc) + spin_lock(&binder_dead_nodes_lock); + node->tmp_refs--; + BUG_ON(node->tmp_refs < 0); + if (!node->proc) + spin_unlock(&binder_dead_nodes_lock); + /* + * Call binder_dec_node() to check if all refcounts are 0 + * and cleanup is needed. Calling with strong=0 and internal=1 + * causes no actual reference to be released in binder_dec_node(). + * If that changes, a change is needed here too. + */ + free_node = binder_dec_node_nilocked(node, 0, 1); + binder_node_inner_unlock(node); + if (free_node) + binder_free_node(node); +} + +static void binder_put_node(struct binder_node *node) +{ + binder_dec_node_tmpref(node); +} + +static struct binder_ref *binder_get_ref_olocked(struct binder_proc *proc, + u32 desc, bool need_strong_ref) { struct rb_node *n = proc->refs_by_desc.rb_node; struct binder_ref *ref; @@ -1007,11 +1549,11 @@ static struct binder_ref *binder_get_ref(struct binder_proc *proc, while (n) { ref = rb_entry(n, struct binder_ref, rb_node_desc); - if (desc < ref->desc) { + if (desc < ref->data.desc) { n = n->rb_left; - } else if (desc > ref->desc) { + } else if (desc > ref->data.desc) { n = n->rb_right; - } else if (need_strong_ref && !ref->strong) { + } else if (need_strong_ref && !ref->data.strong) { binder_user_error("tried to use weak ref as strong ref\n"); return NULL; } else { @@ -1021,13 +1563,34 @@ static struct binder_ref *binder_get_ref(struct binder_proc *proc, return NULL; } -static struct binder_ref *binder_get_ref_for_node(struct binder_proc *proc, - struct binder_node *node) +/** + * binder_get_ref_for_node_olocked() - get the ref associated with given node + * @proc: binder_proc that owns the ref + * @node: binder_node of target + * @new_ref: newly allocated binder_ref to be initialized or %NULL + * + * Look up the ref for the given node and return it if it exists + * + * If it doesn't exist and the caller provides a newly allocated + * ref, initialize the fields of the newly allocated ref and insert + * into the given proc rb_trees and node refs list. + * + * Return: the ref for node. It is possible that another thread + * allocated/initialized the ref first in which case the + * returned ref would be different than the passed-in + * new_ref. new_ref must be kfree'd by the caller in + * this case. + */ +static struct binder_ref *binder_get_ref_for_node_olocked( + struct binder_proc *proc, + struct binder_node *node, + struct binder_ref *new_ref) { - struct rb_node *n; + struct binder_context *context = proc->context; struct rb_node **p = &proc->refs_by_node.rb_node; struct rb_node *parent = NULL; - struct binder_ref *ref, *new_ref; + struct binder_ref *ref; + struct rb_node *n; while (*p) { parent = *p; @@ -1040,22 +1603,22 @@ static struct binder_ref *binder_get_ref_for_node(struct binder_proc *proc, else return ref; } - new_ref = kzalloc(sizeof(*ref), GFP_KERNEL); - if (new_ref == NULL) + if (!new_ref) return NULL; + binder_stats_created(BINDER_STAT_REF); - new_ref->debug_id = ++binder_last_id; + new_ref->data.debug_id = atomic_inc_return(&binder_last_id); new_ref->proc = proc; new_ref->node = node; rb_link_node(&new_ref->rb_node_node, parent, p); rb_insert_color(&new_ref->rb_node_node, &proc->refs_by_node); - new_ref->desc = (node == binder_context_mgr_node) ? 0 : 1; + new_ref->data.desc = (node == context->binder_context_mgr_node) ? 0 : 1; for (n = rb_first(&proc->refs_by_desc); n != NULL; n = rb_next(n)) { ref = rb_entry(n, struct binder_ref, rb_node_desc); - if (ref->desc > new_ref->desc) + if (ref->data.desc > new_ref->data.desc) break; - new_ref->desc = ref->desc + 1; + new_ref->data.desc = ref->data.desc + 1; } p = &proc->refs_by_desc.rb_node; @@ -1063,306 +1626,1252 @@ static struct binder_ref *binder_get_ref_for_node(struct binder_proc *proc, parent = *p; ref = rb_entry(parent, struct binder_ref, rb_node_desc); - if (new_ref->desc < ref->desc) + if (new_ref->data.desc < ref->data.desc) p = &(*p)->rb_left; - else if (new_ref->desc > ref->desc) + else if (new_ref->data.desc > ref->data.desc) p = &(*p)->rb_right; else BUG(); } rb_link_node(&new_ref->rb_node_desc, parent, p); rb_insert_color(&new_ref->rb_node_desc, &proc->refs_by_desc); - if (node) { - hlist_add_head(&new_ref->node_entry, &node->refs); - binder_debug(BINDER_DEBUG_INTERNAL_REFS, - "%d new ref %d desc %d for node %d\n", - proc->pid, new_ref->debug_id, new_ref->desc, - node->debug_id); - } else { - binder_debug(BINDER_DEBUG_INTERNAL_REFS, - "%d new ref %d desc %d for dead node\n", - proc->pid, new_ref->debug_id, new_ref->desc); - } + binder_node_lock(node); + hlist_add_head(&new_ref->node_entry, &node->refs); + + binder_debug(BINDER_DEBUG_INTERNAL_REFS, + "%d new ref %d desc %d for node %d\n", + proc->pid, new_ref->data.debug_id, new_ref->data.desc, + node->debug_id); + binder_node_unlock(node); return new_ref; } -static void binder_delete_ref(struct binder_ref *ref) +static void binder_cleanup_ref_olocked(struct binder_ref *ref) { + bool delete_node = false; + binder_debug(BINDER_DEBUG_INTERNAL_REFS, "%d delete ref %d desc %d for node %d\n", - ref->proc->pid, ref->debug_id, ref->desc, + ref->proc->pid, ref->data.debug_id, ref->data.desc, ref->node->debug_id); rb_erase(&ref->rb_node_desc, &ref->proc->refs_by_desc); rb_erase(&ref->rb_node_node, &ref->proc->refs_by_node); - if (ref->strong) - binder_dec_node(ref->node, 1, 1); + + binder_node_inner_lock(ref->node); + if (ref->data.strong) + binder_dec_node_nilocked(ref->node, 1, 1); + hlist_del(&ref->node_entry); - binder_dec_node(ref->node, 0, 1); + delete_node = binder_dec_node_nilocked(ref->node, 0, 1); + binder_node_inner_unlock(ref->node); + /* + * Clear ref->node unless we want the caller to free the node + */ + if (!delete_node) { + /* + * The caller uses ref->node to determine + * whether the node needs to be freed. Clear + * it since the node is still alive. + */ + ref->node = NULL; + } + if (ref->death) { binder_debug(BINDER_DEBUG_DEAD_BINDER, "%d delete ref %d desc %d has death notification\n", - ref->proc->pid, ref->debug_id, ref->desc); - list_del(&ref->death->work.entry); - kfree(ref->death); + ref->proc->pid, ref->data.debug_id, + ref->data.desc); + binder_dequeue_work(ref->proc, &ref->death->work); binder_stats_deleted(BINDER_STAT_DEATH); } - kfree(ref); binder_stats_deleted(BINDER_STAT_REF); } -static int binder_inc_ref(struct binder_ref *ref, int strong, - struct list_head *target_list) +/** + * binder_inc_ref_olocked() - increment the ref for given handle + * @ref: ref to be incremented + * @strong: if true, strong increment, else weak + * @target_list: list to queue node work on + * + * Increment the ref. @ref->proc->outer_lock must be held on entry + * + * Return: 0, if successful, else errno + */ +static int binder_inc_ref_olocked(struct binder_ref *ref, int strong, + struct list_head *target_list) { int ret; if (strong) { - if (ref->strong == 0) { + if (ref->data.strong == 0) { ret = binder_inc_node(ref->node, 1, 1, target_list); if (ret) return ret; } - ref->strong++; + ref->data.strong++; } else { - if (ref->weak == 0) { + if (ref->data.weak == 0) { ret = binder_inc_node(ref->node, 0, 1, target_list); if (ret) return ret; } - ref->weak++; + ref->data.weak++; } return 0; } - -static int binder_dec_ref(struct binder_ref *ref, int strong) +/** + * binder_dec_ref() - dec the ref for given handle + * @ref: ref to be decremented + * @strong: if true, strong decrement, else weak + * + * Decrement the ref. + * + * Return: true if ref is cleaned up and ready to be freed + */ +static bool binder_dec_ref_olocked(struct binder_ref *ref, int strong) { if (strong) { - if (ref->strong == 0) { + if (ref->data.strong == 0) { binder_user_error("%d invalid dec strong, ref %d desc %d s %d w %d\n", - ref->proc->pid, ref->debug_id, - ref->desc, ref->strong, ref->weak); - return -EINVAL; + ref->proc->pid, ref->data.debug_id, + ref->data.desc, ref->data.strong, + ref->data.weak); + return false; } - ref->strong--; - if (ref->strong == 0) { - int ret; + ref->data.strong--; + if (ref->data.strong == 0) + binder_dec_node(ref->node, strong, 1); + } else { + if (ref->data.weak == 0) { + binder_user_error("%d invalid dec weak, ref %d desc %d s %d w %d\n", + ref->proc->pid, ref->data.debug_id, + ref->data.desc, ref->data.strong, + ref->data.weak); + return false; + } + ref->data.weak--; + } + if (ref->data.strong == 0 && ref->data.weak == 0) { + binder_cleanup_ref_olocked(ref); + return true; + } + return false; +} - ret = binder_dec_node(ref->node, strong, 1); - if (ret) - return ret; +/** + * binder_get_node_from_ref() - get the node from the given proc/desc + * @proc: proc containing the ref + * @desc: the handle associated with the ref + * @need_strong_ref: if true, only return node if ref is strong + * @rdata: the id/refcount data for the ref + * + * Given a proc and ref handle, return the associated binder_node + * + * Return: a binder_node or NULL if not found or not strong when strong required + */ +static struct binder_node *binder_get_node_from_ref( + struct binder_proc *proc, + u32 desc, bool need_strong_ref, + struct binder_ref_data *rdata) +{ + struct binder_node *node; + struct binder_ref *ref; + + binder_proc_lock(proc); + ref = binder_get_ref_olocked(proc, desc, need_strong_ref); + if (!ref) + goto err_no_ref; + node = ref->node; + /* + * Take an implicit reference on the node to ensure + * it stays alive until the call to binder_put_node() + */ + binder_inc_node_tmpref(node); + if (rdata) + *rdata = ref->data; + binder_proc_unlock(proc); + + return node; + +err_no_ref: + binder_proc_unlock(proc); + return NULL; +} + +/** + * binder_free_ref() - free the binder_ref + * @ref: ref to free + * + * Free the binder_ref. Free the binder_node indicated by ref->node + * (if non-NULL) and the binder_ref_death indicated by ref->death. + */ +static void binder_free_ref(struct binder_ref *ref) +{ + if (ref->node) + binder_free_node(ref->node); + kfree(ref->death); + kfree(ref); +} + +/** + * binder_update_ref_for_handle() - inc/dec the ref for given handle + * @proc: proc containing the ref + * @desc: the handle associated with the ref + * @increment: true=inc reference, false=dec reference + * @strong: true=strong reference, false=weak reference + * @rdata: the id/refcount data for the ref + * + * Given a proc and ref handle, increment or decrement the ref + * according to "increment" arg. + * + * Return: 0 if successful, else errno + */ +static int binder_update_ref_for_handle(struct binder_proc *proc, + uint32_t desc, bool increment, bool strong, + struct binder_ref_data *rdata) +{ + int ret = 0; + struct binder_ref *ref; + bool delete_ref = false; + + binder_proc_lock(proc); + ref = binder_get_ref_olocked(proc, desc, strong); + if (!ref) { + ret = -EINVAL; + goto err_no_ref; + } + if (increment) + ret = binder_inc_ref_olocked(ref, strong, NULL); + else + delete_ref = binder_dec_ref_olocked(ref, strong); + + if (rdata) + *rdata = ref->data; + binder_proc_unlock(proc); + + if (delete_ref) + binder_free_ref(ref); + return ret; + +err_no_ref: + binder_proc_unlock(proc); + return ret; +} + +/** + * binder_dec_ref_for_handle() - dec the ref for given handle + * @proc: proc containing the ref + * @desc: the handle associated with the ref + * @strong: true=strong reference, false=weak reference + * @rdata: the id/refcount data for the ref + * + * Just calls binder_update_ref_for_handle() to decrement the ref. + * + * Return: 0 if successful, else errno + */ +static int binder_dec_ref_for_handle(struct binder_proc *proc, + uint32_t desc, bool strong, struct binder_ref_data *rdata) +{ + return binder_update_ref_for_handle(proc, desc, false, strong, rdata); +} + + +/** + * binder_inc_ref_for_node() - increment the ref for given proc/node + * @proc: proc containing the ref + * @node: target node + * @strong: true=strong reference, false=weak reference + * @target_list: worklist to use if node is incremented + * @rdata: the id/refcount data for the ref + * + * Given a proc and node, increment the ref. Create the ref if it + * doesn't already exist + * + * Return: 0 if successful, else errno + */ +static int binder_inc_ref_for_node(struct binder_proc *proc, + struct binder_node *node, + bool strong, + struct list_head *target_list, + struct binder_ref_data *rdata) +{ + struct binder_ref *ref; + struct binder_ref *new_ref = NULL; + int ret = 0; + + binder_proc_lock(proc); + ref = binder_get_ref_for_node_olocked(proc, node, NULL); + if (!ref) { + binder_proc_unlock(proc); + new_ref = kzalloc(sizeof(*ref), GFP_KERNEL); + if (!new_ref) + return -ENOMEM; + binder_proc_lock(proc); + ref = binder_get_ref_for_node_olocked(proc, node, new_ref); + } + ret = binder_inc_ref_olocked(ref, strong, target_list); + *rdata = ref->data; + binder_proc_unlock(proc); + if (new_ref && ref != new_ref) + /* + * Another thread created the ref first so + * free the one we allocated + */ + kfree(new_ref); + return ret; +} + +static void binder_pop_transaction_ilocked(struct binder_thread *target_thread, + struct binder_transaction *t) +{ + BUG_ON(!target_thread); + assert_spin_locked(&target_thread->proc->inner_lock); + BUG_ON(target_thread->transaction_stack != t); + BUG_ON(target_thread->transaction_stack->from != target_thread); + target_thread->transaction_stack = + target_thread->transaction_stack->from_parent; + t->from = NULL; +} + +/** + * binder_thread_dec_tmpref() - decrement thread->tmp_ref + * @thread: thread to decrement + * + * A thread needs to be kept alive while being used to create or + * handle a transaction. binder_get_txn_from() is used to safely + * extract t->from from a binder_transaction and keep the thread + * indicated by t->from from being freed. When done with that + * binder_thread, this function is called to decrement the + * tmp_ref and free if appropriate (thread has been released + * and no transaction being processed by the driver) + */ +static void binder_thread_dec_tmpref(struct binder_thread *thread) +{ + /* + * atomic is used to protect the counter value while + * it cannot reach zero or thread->is_dead is false + */ + binder_inner_proc_lock(thread->proc); + atomic_dec(&thread->tmp_ref); + if (thread->is_dead && !atomic_read(&thread->tmp_ref)) { + binder_inner_proc_unlock(thread->proc); + binder_free_thread(thread); + return; + } + binder_inner_proc_unlock(thread->proc); +} + +/** + * binder_proc_dec_tmpref() - decrement proc->tmp_ref + * @proc: proc to decrement + * + * A binder_proc needs to be kept alive while being used to create or + * handle a transaction. proc->tmp_ref is incremented when + * creating a new transaction or the binder_proc is currently in-use + * by threads that are being released. When done with the binder_proc, + * this function is called to decrement the counter and free the + * proc if appropriate (proc has been released, all threads have + * been released and not currenly in-use to process a transaction). + */ +static void binder_proc_dec_tmpref(struct binder_proc *proc) +{ + binder_inner_proc_lock(proc); + proc->tmp_ref--; + if (proc->is_dead && RB_EMPTY_ROOT(&proc->threads) && + !proc->tmp_ref) { + binder_inner_proc_unlock(proc); + binder_free_proc(proc); + return; + } + binder_inner_proc_unlock(proc); +} + +/** + * binder_get_txn_from() - safely extract the "from" thread in transaction + * @t: binder transaction for t->from + * + * Atomically return the "from" thread and increment the tmp_ref + * count for the thread to ensure it stays alive until + * binder_thread_dec_tmpref() is called. + * + * Return: the value of t->from + */ +static struct binder_thread *binder_get_txn_from( + struct binder_transaction *t) +{ + struct binder_thread *from; + + spin_lock(&t->lock); + from = t->from; + if (from) + atomic_inc(&from->tmp_ref); + spin_unlock(&t->lock); + return from; +} + +/** + * binder_get_txn_from_and_acq_inner() - get t->from and acquire inner lock + * @t: binder transaction for t->from + * + * Same as binder_get_txn_from() except it also acquires the proc->inner_lock + * to guarantee that the thread cannot be released while operating on it. + * The caller must call binder_inner_proc_unlock() to release the inner lock + * as well as call binder_dec_thread_txn() to release the reference. + * + * Return: the value of t->from + */ +static struct binder_thread *binder_get_txn_from_and_acq_inner( + struct binder_transaction *t) +{ + struct binder_thread *from; + + from = binder_get_txn_from(t); + if (!from) + return NULL; + binder_inner_proc_lock(from->proc); + if (t->from) { + BUG_ON(from != t->from); + return from; + } + binder_inner_proc_unlock(from->proc); + binder_thread_dec_tmpref(from); + return NULL; +} + +static void binder_free_transaction(struct binder_transaction *t) +{ + if (t->buffer) + t->buffer->transaction = NULL; + kfree(t); + binder_stats_deleted(BINDER_STAT_TRANSACTION); +} + +static void binder_send_failed_reply(struct binder_transaction *t, + uint32_t error_code) +{ + struct binder_thread *target_thread; + struct binder_transaction *next; + + BUG_ON(t->flags & TF_ONE_WAY); + while (1) { + target_thread = binder_get_txn_from_and_acq_inner(t); + if (target_thread) { + binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, + "send failed reply for transaction %d to %d:%d\n", + t->debug_id, + target_thread->proc->pid, + target_thread->pid); + + binder_pop_transaction_ilocked(target_thread, t); + if (target_thread->reply_error.cmd == BR_OK) { + target_thread->reply_error.cmd = error_code; + binder_enqueue_work_ilocked( + &target_thread->reply_error.work, + &target_thread->todo); + wake_up_interruptible(&target_thread->wait); + } else { + WARN(1, "Unexpected reply error: %u\n", + target_thread->reply_error.cmd); + } + binder_inner_proc_unlock(target_thread->proc); + binder_thread_dec_tmpref(target_thread); + binder_free_transaction(t); + return; } + next = t->from_parent; + + binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, + "send failed reply for transaction %d, target dead\n", + t->debug_id); + + binder_free_transaction(t); + if (next == NULL) { + binder_debug(BINDER_DEBUG_DEAD_BINDER, + "reply failed, no target thread at root\n"); + return; + } + t = next; + binder_debug(BINDER_DEBUG_DEAD_BINDER, + "reply failed, no target thread -- retry %d\n", + t->debug_id); + } +} + +/** + * binder_cleanup_transaction() - cleans up undelivered transaction + * @t: transaction that needs to be cleaned up + * @reason: reason the transaction wasn't delivered + * @error_code: error to return to caller (if synchronous call) + */ +static void binder_cleanup_transaction(struct binder_transaction *t, + const char *reason, + uint32_t error_code) +{ + if (t->buffer->target_node && !(t->flags & TF_ONE_WAY)) { + binder_send_failed_reply(t, error_code); } else { - if (ref->weak == 0) { - binder_user_error("%d invalid dec weak, ref %d desc %d s %d w %d\n", - ref->proc->pid, ref->debug_id, - ref->desc, ref->strong, ref->weak); - return -EINVAL; + binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, + "undelivered transaction %d, %s\n", + t->debug_id, reason); + binder_free_transaction(t); + } +} + +/** + * binder_validate_object() - checks for a valid metadata object in a buffer. + * @buffer: binder_buffer that we're parsing. + * @offset: offset in the buffer at which to validate an object. + * + * Return: If there's a valid metadata object at @offset in @buffer, the + * size of that object. Otherwise, it returns zero. + */ +static size_t binder_validate_object(struct binder_buffer *buffer, u64 offset) +{ + /* Check if we can read a header first */ + struct binder_object_header *hdr; + size_t object_size = 0; + + if (offset > buffer->data_size - sizeof(*hdr) || + buffer->data_size < sizeof(*hdr) || + !IS_ALIGNED(offset, sizeof(u32))) + return 0; + + /* Ok, now see if we can read a complete object. */ + hdr = (struct binder_object_header *)(buffer->data + offset); + switch (hdr->type) { + case BINDER_TYPE_BINDER: + case BINDER_TYPE_WEAK_BINDER: + case BINDER_TYPE_HANDLE: + case BINDER_TYPE_WEAK_HANDLE: + object_size = sizeof(struct flat_binder_object); + break; + case BINDER_TYPE_FD: + object_size = sizeof(struct binder_fd_object); + break; + case BINDER_TYPE_PTR: + object_size = sizeof(struct binder_buffer_object); + break; + case BINDER_TYPE_FDA: + object_size = sizeof(struct binder_fd_array_object); + break; + default: + return 0; + } + if (offset <= buffer->data_size - object_size && + buffer->data_size >= object_size) + return object_size; + else + return 0; +} + +/** + * binder_validate_ptr() - validates binder_buffer_object in a binder_buffer. + * @b: binder_buffer containing the object + * @index: index in offset array at which the binder_buffer_object is + * located + * @start: points to the start of the offset array + * @num_valid: the number of valid offsets in the offset array + * + * Return: If @index is within the valid range of the offset array + * described by @start and @num_valid, and if there's a valid + * binder_buffer_object at the offset found in index @index + * of the offset array, that object is returned. Otherwise, + * %NULL is returned. + * Note that the offset found in index @index itself is not + * verified; this function assumes that @num_valid elements + * from @start were previously verified to have valid offsets. + */ +static struct binder_buffer_object *binder_validate_ptr(struct binder_buffer *b, + binder_size_t index, + binder_size_t *start, + binder_size_t num_valid) +{ + struct binder_buffer_object *buffer_obj; + binder_size_t *offp; + + if (index >= num_valid) + return NULL; + + offp = start + index; + buffer_obj = (struct binder_buffer_object *)(b->data + *offp); + if (buffer_obj->hdr.type != BINDER_TYPE_PTR) + return NULL; + + return buffer_obj; +} + +/** + * binder_validate_fixup() - validates pointer/fd fixups happen in order. + * @b: transaction buffer + * @objects_start start of objects buffer + * @buffer: binder_buffer_object in which to fix up + * @offset: start offset in @buffer to fix up + * @last_obj: last binder_buffer_object that we fixed up in + * @last_min_offset: minimum fixup offset in @last_obj + * + * Return: %true if a fixup in buffer @buffer at offset @offset is + * allowed. + * + * For safety reasons, we only allow fixups inside a buffer to happen + * at increasing offsets; additionally, we only allow fixup on the last + * buffer object that was verified, or one of its parents. + * + * Example of what is allowed: + * + * A + * B (parent = A, offset = 0) + * C (parent = A, offset = 16) + * D (parent = C, offset = 0) + * E (parent = A, offset = 32) // min_offset is 16 (C.parent_offset) + * + * Examples of what is not allowed: + * + * Decreasing offsets within the same parent: + * A + * C (parent = A, offset = 16) + * B (parent = A, offset = 0) // decreasing offset within A + * + * Referring to a parent that wasn't the last object or any of its parents: + * A + * B (parent = A, offset = 0) + * C (parent = A, offset = 0) + * C (parent = A, offset = 16) + * D (parent = B, offset = 0) // B is not A or any of A's parents + */ +static bool binder_validate_fixup(struct binder_buffer *b, + binder_size_t *objects_start, + struct binder_buffer_object *buffer, + binder_size_t fixup_offset, + struct binder_buffer_object *last_obj, + binder_size_t last_min_offset) +{ + if (!last_obj) { + /* Nothing to fix up in */ + return false; + } + + while (last_obj != buffer) { + /* + * Safe to retrieve the parent of last_obj, since it + * was already previously verified by the driver. + */ + if ((last_obj->flags & BINDER_BUFFER_FLAG_HAS_PARENT) == 0) + return false; + last_min_offset = last_obj->parent_offset + sizeof(uintptr_t); + last_obj = (struct binder_buffer_object *) + (b->data + *(objects_start + last_obj->parent)); + } + return (fixup_offset >= last_min_offset); +} + +static void binder_transaction_buffer_release(struct binder_proc *proc, + struct binder_buffer *buffer, + binder_size_t *failed_at) +{ + binder_size_t *offp, *off_start, *off_end; + int debug_id = buffer->debug_id; + + binder_debug(BINDER_DEBUG_TRANSACTION, + "%d buffer release %d, size %zd-%zd, failed at %p\n", + proc->pid, buffer->debug_id, + buffer->data_size, buffer->offsets_size, failed_at); + + if (buffer->target_node) + binder_dec_node(buffer->target_node, 1, 0); + + off_start = (binder_size_t *)(buffer->data + + ALIGN(buffer->data_size, sizeof(void *))); + if (failed_at) + off_end = failed_at; + else + off_end = (void *)off_start + buffer->offsets_size; + for (offp = off_start; offp < off_end; offp++) { + struct binder_object_header *hdr; + size_t object_size = binder_validate_object(buffer, *offp); + + if (object_size == 0) { + pr_err("transaction release %d bad object at offset %lld, size %zd\n", + debug_id, (u64)*offp, buffer->data_size); + continue; + } + hdr = (struct binder_object_header *)(buffer->data + *offp); + switch (hdr->type) { + case BINDER_TYPE_BINDER: + case BINDER_TYPE_WEAK_BINDER: { + struct flat_binder_object *fp; + struct binder_node *node; + + fp = to_flat_binder_object(hdr); + node = binder_get_node(proc, fp->binder); + if (node == NULL) { + pr_err("transaction release %d bad node %016llx\n", + debug_id, (u64)fp->binder); + break; + } + binder_debug(BINDER_DEBUG_TRANSACTION, + " node %d u%016llx\n", + node->debug_id, (u64)node->ptr); + binder_dec_node(node, hdr->type == BINDER_TYPE_BINDER, + 0); + binder_put_node(node); + } break; + case BINDER_TYPE_HANDLE: + case BINDER_TYPE_WEAK_HANDLE: { + struct flat_binder_object *fp; + struct binder_ref_data rdata; + int ret; + + fp = to_flat_binder_object(hdr); + ret = binder_dec_ref_for_handle(proc, fp->handle, + hdr->type == BINDER_TYPE_HANDLE, &rdata); + + if (ret) { + pr_err("transaction release %d bad handle %d, ret = %d\n", + debug_id, fp->handle, ret); + break; + } + binder_debug(BINDER_DEBUG_TRANSACTION, + " ref %d desc %d\n", + rdata.debug_id, rdata.desc); + } break; + + case BINDER_TYPE_FD: { + struct binder_fd_object *fp = to_binder_fd_object(hdr); + + binder_debug(BINDER_DEBUG_TRANSACTION, + " fd %d\n", fp->fd); + if (failed_at) + task_close_fd(proc, fp->fd); + } break; + case BINDER_TYPE_PTR: + /* + * Nothing to do here, this will get cleaned up when the + * transaction buffer gets freed + */ + break; + case BINDER_TYPE_FDA: { + struct binder_fd_array_object *fda; + struct binder_buffer_object *parent; + uintptr_t parent_buffer; + u32 *fd_array; + size_t fd_index; + binder_size_t fd_buf_size; + + fda = to_binder_fd_array_object(hdr); + parent = binder_validate_ptr(buffer, fda->parent, + off_start, + offp - off_start); + if (!parent) { + pr_err("transaction release %d bad parent offset", + debug_id); + continue; + } + /* + * Since the parent was already fixed up, convert it + * back to kernel address space to access it + */ + parent_buffer = parent->buffer - + binder_alloc_get_user_buffer_offset( + &proc->alloc); + + fd_buf_size = sizeof(u32) * fda->num_fds; + if (fda->num_fds >= SIZE_MAX / sizeof(u32)) { + pr_err("transaction release %d invalid number of fds (%lld)\n", + debug_id, (u64)fda->num_fds); + continue; + } + if (fd_buf_size > parent->length || + fda->parent_offset > parent->length - fd_buf_size) { + /* No space for all file descriptors here. */ + pr_err("transaction release %d not enough space for %lld fds in buffer\n", + debug_id, (u64)fda->num_fds); + continue; + } + fd_array = (u32 *)(parent_buffer + fda->parent_offset); + for (fd_index = 0; fd_index < fda->num_fds; fd_index++) + task_close_fd(proc, fd_array[fd_index]); + } break; + default: + pr_err("transaction release %d bad object type %x\n", + debug_id, hdr->type); + break; } - ref->weak--; } - if (ref->strong == 0 && ref->weak == 0) - binder_delete_ref(ref); - return 0; } -static void binder_pop_transaction(struct binder_thread *target_thread, - struct binder_transaction *t) +static int binder_translate_binder(struct flat_binder_object *fp, + struct binder_transaction *t, + struct binder_thread *thread) +{ + struct binder_node *node; + struct binder_proc *proc = thread->proc; + struct binder_proc *target_proc = t->to_proc; + struct binder_ref_data rdata; + int ret = 0; + + node = binder_get_node(proc, fp->binder); + if (!node) { + node = binder_new_node(proc, fp); + if (!node) + return -ENOMEM; + } + if (fp->cookie != node->cookie) { + binder_user_error("%d:%d sending u%016llx node %d, cookie mismatch %016llx != %016llx\n", + proc->pid, thread->pid, (u64)fp->binder, + node->debug_id, (u64)fp->cookie, + (u64)node->cookie); + ret = -EINVAL; + goto done; + } + if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { + ret = -EPERM; + goto done; + } + + ret = binder_inc_ref_for_node(target_proc, node, + fp->hdr.type == BINDER_TYPE_BINDER, + &thread->todo, &rdata); + if (ret) + goto done; + + if (fp->hdr.type == BINDER_TYPE_BINDER) + fp->hdr.type = BINDER_TYPE_HANDLE; + else + fp->hdr.type = BINDER_TYPE_WEAK_HANDLE; + fp->binder = 0; + fp->handle = rdata.desc; + fp->cookie = 0; + + trace_binder_transaction_node_to_ref(t, node, &rdata); + binder_debug(BINDER_DEBUG_TRANSACTION, + " node %d u%016llx -> ref %d desc %d\n", + node->debug_id, (u64)node->ptr, + rdata.debug_id, rdata.desc); +done: + binder_put_node(node); + return ret; +} + +static int binder_translate_handle(struct flat_binder_object *fp, + struct binder_transaction *t, + struct binder_thread *thread) +{ + struct binder_proc *proc = thread->proc; + struct binder_proc *target_proc = t->to_proc; + struct binder_node *node; + struct binder_ref_data src_rdata; + int ret = 0; + + node = binder_get_node_from_ref(proc, fp->handle, + fp->hdr.type == BINDER_TYPE_HANDLE, &src_rdata); + if (!node) { + binder_user_error("%d:%d got transaction with invalid handle, %d\n", + proc->pid, thread->pid, fp->handle); + return -EINVAL; + } + if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { + ret = -EPERM; + goto done; + } + + binder_node_lock(node); + if (node->proc == target_proc) { + if (fp->hdr.type == BINDER_TYPE_HANDLE) + fp->hdr.type = BINDER_TYPE_BINDER; + else + fp->hdr.type = BINDER_TYPE_WEAK_BINDER; + fp->binder = node->ptr; + fp->cookie = node->cookie; + if (node->proc) + binder_inner_proc_lock(node->proc); + binder_inc_node_nilocked(node, + fp->hdr.type == BINDER_TYPE_BINDER, + 0, NULL); + if (node->proc) + binder_inner_proc_unlock(node->proc); + trace_binder_transaction_ref_to_node(t, node, &src_rdata); + binder_debug(BINDER_DEBUG_TRANSACTION, + " ref %d desc %d -> node %d u%016llx\n", + src_rdata.debug_id, src_rdata.desc, node->debug_id, + (u64)node->ptr); + binder_node_unlock(node); + } else { + struct binder_ref_data dest_rdata; + + binder_node_unlock(node); + ret = binder_inc_ref_for_node(target_proc, node, + fp->hdr.type == BINDER_TYPE_HANDLE, + NULL, &dest_rdata); + if (ret) + goto done; + + fp->binder = 0; + fp->handle = dest_rdata.desc; + fp->cookie = 0; + trace_binder_transaction_ref_to_ref(t, node, &src_rdata, + &dest_rdata); + binder_debug(BINDER_DEBUG_TRANSACTION, + " ref %d desc %d -> ref %d desc %d (node %d)\n", + src_rdata.debug_id, src_rdata.desc, + dest_rdata.debug_id, dest_rdata.desc, + node->debug_id); + } +done: + binder_put_node(node); + return ret; +} + +static int binder_translate_fd(int fd, + struct binder_transaction *t, + struct binder_thread *thread, + struct binder_transaction *in_reply_to) +{ + struct binder_proc *proc = thread->proc; + struct binder_proc *target_proc = t->to_proc; + int target_fd; + struct file *file; + int ret; + bool target_allows_fd; + + if (in_reply_to) + target_allows_fd = !!(in_reply_to->flags & TF_ACCEPT_FDS); + else + target_allows_fd = t->buffer->target_node->accept_fds; + if (!target_allows_fd) { + binder_user_error("%d:%d got %s with fd, %d, but target does not allow fds\n", + proc->pid, thread->pid, + in_reply_to ? "reply" : "transaction", + fd); + ret = -EPERM; + goto err_fd_not_accepted; + } + + file = fget(fd); + if (!file) { + binder_user_error("%d:%d got transaction with invalid fd, %d\n", + proc->pid, thread->pid, fd); + ret = -EBADF; + goto err_fget; + } + ret = security_binder_transfer_file(proc->tsk, target_proc->tsk, file); + if (ret < 0) { + ret = -EPERM; + goto err_security; + } + + target_fd = task_get_unused_fd_flags(target_proc, O_CLOEXEC); + if (target_fd < 0) { + ret = -ENOMEM; + goto err_get_unused_fd; + } + task_fd_install(target_proc, target_fd, file); + trace_binder_transaction_fd(t, fd, target_fd); + binder_debug(BINDER_DEBUG_TRANSACTION, " fd %d -> %d\n", + fd, target_fd); + + return target_fd; + +err_get_unused_fd: +err_security: + fput(file); +err_fget: +err_fd_not_accepted: + return ret; +} + +static int binder_translate_fd_array(struct binder_fd_array_object *fda, + struct binder_buffer_object *parent, + struct binder_transaction *t, + struct binder_thread *thread, + struct binder_transaction *in_reply_to) { - if (target_thread) { - BUG_ON(target_thread->transaction_stack != t); - BUG_ON(target_thread->transaction_stack->from != target_thread); - target_thread->transaction_stack = - target_thread->transaction_stack->from_parent; - t->from = NULL; + binder_size_t fdi, fd_buf_size, num_installed_fds; + int target_fd; + uintptr_t parent_buffer; + u32 *fd_array; + struct binder_proc *proc = thread->proc; + struct binder_proc *target_proc = t->to_proc; + + fd_buf_size = sizeof(u32) * fda->num_fds; + if (fda->num_fds >= SIZE_MAX / sizeof(u32)) { + binder_user_error("%d:%d got transaction with invalid number of fds (%lld)\n", + proc->pid, thread->pid, (u64)fda->num_fds); + return -EINVAL; } - t->need_reply = 0; - if (t->buffer) - t->buffer->transaction = NULL; - kfree(t); - binder_stats_deleted(BINDER_STAT_TRANSACTION); + if (fd_buf_size > parent->length || + fda->parent_offset > parent->length - fd_buf_size) { + /* No space for all file descriptors here. */ + binder_user_error("%d:%d not enough space to store %lld fds in buffer\n", + proc->pid, thread->pid, (u64)fda->num_fds); + return -EINVAL; + } + /* + * Since the parent was already fixed up, convert it + * back to the kernel address space to access it + */ + parent_buffer = parent->buffer - + binder_alloc_get_user_buffer_offset(&target_proc->alloc); + fd_array = (u32 *)(parent_buffer + fda->parent_offset); + if (!IS_ALIGNED((unsigned long)fd_array, sizeof(u32))) { + binder_user_error("%d:%d parent offset not aligned correctly.\n", + proc->pid, thread->pid); + return -EINVAL; + } + for (fdi = 0; fdi < fda->num_fds; fdi++) { + target_fd = binder_translate_fd(fd_array[fdi], t, thread, + in_reply_to); + if (target_fd < 0) + goto err_translate_fd_failed; + fd_array[fdi] = target_fd; + } + return 0; + +err_translate_fd_failed: + /* + * Failed to allocate fd or security error, free fds + * installed so far. + */ + num_installed_fds = fdi; + for (fdi = 0; fdi < num_installed_fds; fdi++) + task_close_fd(target_proc, fd_array[fdi]); + return target_fd; } -static void binder_send_failed_reply(struct binder_transaction *t, - uint32_t error_code) +static int binder_fixup_parent(struct binder_transaction *t, + struct binder_thread *thread, + struct binder_buffer_object *bp, + binder_size_t *off_start, + binder_size_t num_valid, + struct binder_buffer_object *last_fixup_obj, + binder_size_t last_fixup_min_off) { - struct binder_thread *target_thread; - struct binder_transaction *next; + struct binder_buffer_object *parent; + u8 *parent_buffer; + struct binder_buffer *b = t->buffer; + struct binder_proc *proc = thread->proc; + struct binder_proc *target_proc = t->to_proc; - BUG_ON(t->flags & TF_ONE_WAY); - while (1) { - target_thread = t->from; - if (target_thread) { - if (target_thread->return_error != BR_OK && - target_thread->return_error2 == BR_OK) { - target_thread->return_error2 = - target_thread->return_error; - target_thread->return_error = BR_OK; - } - if (target_thread->return_error == BR_OK) { - binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, - "send failed reply for transaction %d to %d:%d\n", - t->debug_id, - target_thread->proc->pid, - target_thread->pid); - - binder_pop_transaction(target_thread, t); - target_thread->return_error = error_code; - wake_up_interruptible(&target_thread->wait); - } else { - pr_err("reply failed, target thread, %d:%d, has error code %d already\n", - target_thread->proc->pid, - target_thread->pid, - target_thread->return_error); - } - return; - } - next = t->from_parent; + if (!(bp->flags & BINDER_BUFFER_FLAG_HAS_PARENT)) + return 0; - binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, - "send failed reply for transaction %d, target dead\n", - t->debug_id); + parent = binder_validate_ptr(b, bp->parent, off_start, num_valid); + if (!parent) { + binder_user_error("%d:%d got transaction with invalid parent offset or type\n", + proc->pid, thread->pid); + return -EINVAL; + } - binder_pop_transaction(target_thread, t); - if (next == NULL) { - binder_debug(BINDER_DEBUG_DEAD_BINDER, - "reply failed, no target thread at root\n"); - return; - } - t = next; - binder_debug(BINDER_DEBUG_DEAD_BINDER, - "reply failed, no target thread -- retry %d\n", - t->debug_id); + if (!binder_validate_fixup(b, off_start, + parent, bp->parent_offset, + last_fixup_obj, + last_fixup_min_off)) { + binder_user_error("%d:%d got transaction with out-of-order buffer fixup\n", + proc->pid, thread->pid); + return -EINVAL; + } + + if (parent->length < sizeof(binder_uintptr_t) || + bp->parent_offset > parent->length - sizeof(binder_uintptr_t)) { + /* No space for a pointer here! */ + binder_user_error("%d:%d got transaction with invalid parent offset\n", + proc->pid, thread->pid); + return -EINVAL; } + parent_buffer = (u8 *)(parent->buffer - + binder_alloc_get_user_buffer_offset( + &target_proc->alloc)); + *(binder_uintptr_t *)(parent_buffer + bp->parent_offset) = bp->buffer; + + return 0; } -static void binder_transaction_buffer_release(struct binder_proc *proc, - struct binder_buffer *buffer, - binder_size_t *failed_at) +/** + * binder_proc_transaction() - sends a transaction to a process and wakes it up + * @t: transaction to send + * @proc: process to send the transaction to + * @thread: thread in @proc to send the transaction to (may be NULL) + * + * This function queues a transaction to the specified process. It will try + * to find a thread in the target process to handle the transaction and + * wake it up. If no thread is found, the work is queued to the proc + * waitqueue. + * + * If the @thread parameter is not NULL, the transaction is always queued + * to the waitlist of that specific thread. + * + * Return: true if the transactions was successfully queued + * false if the target process or thread is dead + */ +static bool binder_proc_transaction(struct binder_transaction *t, + struct binder_proc *proc, + struct binder_thread *thread) { - binder_size_t *offp, *off_end; - int debug_id = buffer->debug_id; + struct list_head *target_list = NULL; + struct binder_node *node = t->buffer->target_node; + struct binder_priority node_prio; + bool oneway = !!(t->flags & TF_ONE_WAY); + bool wakeup = true; + + BUG_ON(!node); + binder_node_lock(node); + node_prio.prio = node->min_priority; + node_prio.sched_policy = node->sched_policy; + + if (oneway) { + BUG_ON(thread); + if (node->has_async_transaction) { + target_list = &node->async_todo; + wakeup = false; + } else { + node->has_async_transaction = 1; + } + } - binder_debug(BINDER_DEBUG_TRANSACTION, - "%d buffer release %d, size %zd-%zd, failed at %pK\n", - proc->pid, buffer->debug_id, - buffer->data_size, buffer->offsets_size, failed_at); + binder_inner_proc_lock(proc); - if (buffer->target_node) - binder_dec_node(buffer->target_node, 1, 0); + if (proc->is_dead || (thread && thread->is_dead)) { + binder_inner_proc_unlock(proc); + binder_node_unlock(node); + return false; + } - offp = (binder_size_t *)(buffer->data + - ALIGN(buffer->data_size, sizeof(void *))); - if (failed_at) - off_end = failed_at; - else - off_end = (void *)offp + buffer->offsets_size; - for (; offp < off_end; offp++) { - struct flat_binder_object *fp; + if (!thread && !target_list) + thread = binder_select_thread_ilocked(proc); - if (*offp > buffer->data_size - sizeof(*fp) || - buffer->data_size < sizeof(*fp) || - !IS_ALIGNED(*offp, sizeof(u32))) { - pr_err("transaction release %d bad offset %lld, size %zd\n", - debug_id, (u64)*offp, buffer->data_size); - continue; - } - fp = (struct flat_binder_object *)(buffer->data + *offp); - switch (fp->type) { - case BINDER_TYPE_BINDER: - case BINDER_TYPE_WEAK_BINDER: { - struct binder_node *node = binder_get_node(proc, fp->binder); + if (thread) { + target_list = &thread->todo; + binder_transaction_priority(thread->task, t, node_prio, + node->inherit_rt); + } else if (!target_list) { + target_list = &proc->todo; + } else { + BUG_ON(target_list != &node->async_todo); + } - if (node == NULL) { - pr_err("transaction release %d bad node %016llx\n", - debug_id, (u64)fp->binder); - break; - } - binder_debug(BINDER_DEBUG_TRANSACTION, - " node %d u%016llx\n", - node->debug_id, (u64)node->ptr); - binder_dec_node(node, fp->type == BINDER_TYPE_BINDER, 0); - } break; - case BINDER_TYPE_HANDLE: - case BINDER_TYPE_WEAK_HANDLE: { - struct binder_ref *ref = binder_get_ref(proc, fp->handle, - fp->type == BINDER_TYPE_HANDLE); - if (ref == NULL) { - pr_err("transaction release %d bad handle %d\n", - debug_id, fp->handle); - break; - } - binder_debug(BINDER_DEBUG_TRANSACTION, - " ref %d desc %d (node %d)\n", - ref->debug_id, ref->desc, ref->node->debug_id); - binder_dec_ref(ref, fp->type == BINDER_TYPE_HANDLE); - } break; + binder_enqueue_work_ilocked(&t->work, target_list); - case BINDER_TYPE_FD: - binder_debug(BINDER_DEBUG_TRANSACTION, - " fd %d\n", fp->handle); - if (failed_at) - task_close_fd(proc, fp->handle); - break; + if (wakeup) + binder_wakeup_thread_ilocked(proc, thread, !oneway /* sync */); - default: - pr_err("transaction release %d bad object type %x\n", - debug_id, fp->type); - break; - } - } + binder_inner_proc_unlock(proc); + binder_node_unlock(node); + + return true; +} + +/** + * binder_get_node_refs_for_txn() - Get required refs on node for txn + * @node: struct binder_node for which to get refs + * @proc: returns @node->proc if valid + * @error: if no @proc then returns BR_DEAD_REPLY + * + * User-space normally keeps the node alive when creating a transaction + * since it has a reference to the target. The local strong ref keeps it + * alive if the sending process dies before the target process processes + * the transaction. If the source process is malicious or has a reference + * counting bug, relying on the local strong ref can fail. + * + * Since user-space can cause the local strong ref to go away, we also take + * a tmpref on the node to ensure it survives while we are constructing + * the transaction. We also need a tmpref on the proc while we are + * constructing the transaction, so we take that here as well. + * + * Return: The target_node with refs taken or NULL if no @node->proc is NULL. + * Also sets @proc if valid. If the @node->proc is NULL indicating that the + * target proc has died, @error is set to BR_DEAD_REPLY + */ +static struct binder_node *binder_get_node_refs_for_txn( + struct binder_node *node, + struct binder_proc **procp, + uint32_t *error) +{ + struct binder_node *target_node = NULL; + + binder_node_inner_lock(node); + if (node->proc) { + target_node = node; + binder_inc_node_nilocked(node, 1, 0, NULL); + binder_inc_node_tmpref_ilocked(node); + node->proc->tmp_ref++; + *procp = node->proc; + } else + *error = BR_DEAD_REPLY; + binder_node_inner_unlock(node); + + return target_node; } static void binder_transaction(struct binder_proc *proc, struct binder_thread *thread, - struct binder_transaction_data *tr, int reply) + struct binder_transaction_data *tr, int reply, + binder_size_t extra_buffers_size) { + int ret; struct binder_transaction *t; struct binder_work *tcomplete; - binder_size_t *offp, *off_end; + binder_size_t *offp, *off_end, *off_start; binder_size_t off_min; - struct binder_proc *target_proc; + u8 *sg_bufp, *sg_buf_end; + struct binder_proc *target_proc = NULL; struct binder_thread *target_thread = NULL; struct binder_node *target_node = NULL; - struct list_head *target_list; - wait_queue_head_t *target_wait; struct binder_transaction *in_reply_to = NULL; struct binder_transaction_log_entry *e; - uint32_t return_error; + uint32_t return_error = 0; + uint32_t return_error_param = 0; + uint32_t return_error_line = 0; + struct binder_buffer_object *last_fixup_obj = NULL; + binder_size_t last_fixup_min_off = 0; + struct binder_context *context = proc->context; + int t_debug_id = atomic_inc_return(&binder_last_id); e = binder_transaction_log_add(&binder_transaction_log); + e->debug_id = t_debug_id; e->call_type = reply ? 2 : !!(tr->flags & TF_ONE_WAY); e->from_proc = proc->pid; e->from_thread = thread->pid; e->target_handle = tr->target.handle; e->data_size = tr->data_size; e->offsets_size = tr->offsets_size; + e->context_name = proc->context->name; if (reply) { + binder_inner_proc_lock(proc); in_reply_to = thread->transaction_stack; if (in_reply_to == NULL) { + binder_inner_proc_unlock(proc); binder_user_error("%d:%d got reply transaction with no transaction stack\n", proc->pid, thread->pid); return_error = BR_FAILED_REPLY; + return_error_param = -EPROTO; + return_error_line = __LINE__; goto err_empty_call_stack; } - binder_set_nice(in_reply_to->saved_priority); if (in_reply_to->to_thread != thread) { + spin_lock(&in_reply_to->lock); binder_user_error("%d:%d got reply transaction with bad transaction stack, transaction %d has target %d:%d\n", proc->pid, thread->pid, in_reply_to->debug_id, in_reply_to->to_proc ? in_reply_to->to_proc->pid : 0, in_reply_to->to_thread ? in_reply_to->to_thread->pid : 0); + spin_unlock(&in_reply_to->lock); + binder_inner_proc_unlock(proc); return_error = BR_FAILED_REPLY; + return_error_param = -EPROTO; + return_error_line = __LINE__; in_reply_to = NULL; goto err_bad_call_stack; } thread->transaction_stack = in_reply_to->to_parent; - target_thread = in_reply_to->from; + binder_inner_proc_unlock(proc); + target_thread = binder_get_txn_from_and_acq_inner(in_reply_to); if (target_thread == NULL) { return_error = BR_DEAD_REPLY; + return_error_line = __LINE__; goto err_dead_binder; } if (target_thread->transaction_stack != in_reply_to) { @@ -1371,104 +2880,148 @@ static void binder_transaction(struct binder_proc *proc, target_thread->transaction_stack ? target_thread->transaction_stack->debug_id : 0, in_reply_to->debug_id); + binder_inner_proc_unlock(target_thread->proc); return_error = BR_FAILED_REPLY; + return_error_param = -EPROTO; + return_error_line = __LINE__; in_reply_to = NULL; target_thread = NULL; goto err_dead_binder; } target_proc = target_thread->proc; + target_proc->tmp_ref++; + binder_inner_proc_unlock(target_thread->proc); } else { if (tr->target.handle) { struct binder_ref *ref; - ref = binder_get_ref(proc, tr->target.handle, true); - if (ref == NULL) { + + /* + * There must already be a strong ref + * on this node. If so, do a strong + * increment on the node to ensure it + * stays alive until the transaction is + * done. + */ + binder_proc_lock(proc); + ref = binder_get_ref_olocked(proc, tr->target.handle, + true); + if (ref) { + target_node = binder_get_node_refs_for_txn( + ref->node, &target_proc, + &return_error); + } else { binder_user_error("%d:%d got transaction to invalid handle\n", - proc->pid, thread->pid); + proc->pid, thread->pid); return_error = BR_FAILED_REPLY; - goto err_invalid_target_handle; } - target_node = ref->node; + binder_proc_unlock(proc); } else { - target_node = binder_context_mgr_node; - if (target_node == NULL) { + mutex_lock(&context->context_mgr_node_lock); + target_node = context->binder_context_mgr_node; + if (target_node) + target_node = binder_get_node_refs_for_txn( + target_node, &target_proc, + &return_error); + else return_error = BR_DEAD_REPLY; - goto err_no_context_mgr_node; - } + mutex_unlock(&context->context_mgr_node_lock); } - e->to_node = target_node->debug_id; - target_proc = target_node->proc; - if (target_proc == NULL) { - return_error = BR_DEAD_REPLY; + if (!target_node) { + /* + * return_error is set above + */ + return_error_param = -EINVAL; + return_error_line = __LINE__; goto err_dead_binder; } - if (security_binder_transaction(proc->tsk, target_proc->tsk) < 0) { + e->to_node = target_node->debug_id; + if (security_binder_transaction(proc->tsk, + target_proc->tsk) < 0) { return_error = BR_FAILED_REPLY; + return_error_param = -EPERM; + return_error_line = __LINE__; goto err_invalid_target_handle; } + binder_inner_proc_lock(proc); if (!(tr->flags & TF_ONE_WAY) && thread->transaction_stack) { struct binder_transaction *tmp; tmp = thread->transaction_stack; if (tmp->to_thread != thread) { + spin_lock(&tmp->lock); binder_user_error("%d:%d got new transaction with bad transaction stack, transaction %d has target %d:%d\n", proc->pid, thread->pid, tmp->debug_id, tmp->to_proc ? tmp->to_proc->pid : 0, tmp->to_thread ? tmp->to_thread->pid : 0); + spin_unlock(&tmp->lock); + binder_inner_proc_unlock(proc); return_error = BR_FAILED_REPLY; + return_error_param = -EPROTO; + return_error_line = __LINE__; goto err_bad_call_stack; } while (tmp) { - if (tmp->from && tmp->from->proc == target_proc) - target_thread = tmp->from; + struct binder_thread *from; + + spin_lock(&tmp->lock); + from = tmp->from; + if (from && from->proc == target_proc) { + atomic_inc(&from->tmp_ref); + target_thread = from; + spin_unlock(&tmp->lock); + break; + } + spin_unlock(&tmp->lock); tmp = tmp->from_parent; } } + binder_inner_proc_unlock(proc); } - if (target_thread) { + if (target_thread) e->to_thread = target_thread->pid; - target_list = &target_thread->todo; - target_wait = &target_thread->wait; - } else { - target_list = &target_proc->todo; - target_wait = &target_proc->wait; - } e->to_proc = target_proc->pid; /* TODO: reuse incoming transaction for reply */ t = kzalloc(sizeof(*t), GFP_KERNEL); if (t == NULL) { return_error = BR_FAILED_REPLY; + return_error_param = -ENOMEM; + return_error_line = __LINE__; goto err_alloc_t_failed; } binder_stats_created(BINDER_STAT_TRANSACTION); + spin_lock_init(&t->lock); tcomplete = kzalloc(sizeof(*tcomplete), GFP_KERNEL); if (tcomplete == NULL) { return_error = BR_FAILED_REPLY; + return_error_param = -ENOMEM; + return_error_line = __LINE__; goto err_alloc_tcomplete_failed; } binder_stats_created(BINDER_STAT_TRANSACTION_COMPLETE); - t->debug_id = ++binder_last_id; - e->debug_id = t->debug_id; + t->debug_id = t_debug_id; if (reply) binder_debug(BINDER_DEBUG_TRANSACTION, - "%d:%d BC_REPLY %d -> %d:%d, data %016llx-%016llx size %lld-%lld\n", + "%d:%d BC_REPLY %d -> %d:%d, data %016llx-%016llx size %lld-%lld-%lld\n", proc->pid, thread->pid, t->debug_id, target_proc->pid, target_thread->pid, (u64)tr->data.ptr.buffer, (u64)tr->data.ptr.offsets, - (u64)tr->data_size, (u64)tr->offsets_size); + (u64)tr->data_size, (u64)tr->offsets_size, + (u64)extra_buffers_size); else binder_debug(BINDER_DEBUG_TRANSACTION, - "%d:%d BC_TRANSACTION %d -> %d - node %d, data %016llx-%016llx size %lld-%lld\n", + "%d:%d BC_TRANSACTION %d -> %d - node %d, data %016llx-%016llx size %lld-%lld-%lld\n", proc->pid, thread->pid, t->debug_id, target_proc->pid, target_node->debug_id, (u64)tr->data.ptr.buffer, (u64)tr->data.ptr.offsets, - (u64)tr->data_size, (u64)tr->offsets_size); + (u64)tr->data_size, (u64)tr->offsets_size, + (u64)extra_buffers_size); if (!reply && !(tr->flags & TF_ONE_WAY)) t->from = thread; @@ -1479,14 +3032,30 @@ static void binder_transaction(struct binder_proc *proc, t->to_thread = target_thread; t->code = tr->code; t->flags = tr->flags; - t->priority = task_nice(current); + if (!(t->flags & TF_ONE_WAY) && + binder_supported_policy(current->policy)) { + /* Inherit supported policies for synchronous transactions */ + t->priority.sched_policy = current->policy; + t->priority.prio = current->normal_prio; + } else { + /* Otherwise, fall back to the default priority */ + t->priority = target_proc->default_priority; + } trace_binder_transaction(reply, t, target_node); - t->buffer = binder_alloc_buf(target_proc, tr->data_size, - tr->offsets_size, !reply && (t->flags & TF_ONE_WAY)); - if (t->buffer == NULL) { - return_error = BR_FAILED_REPLY; + t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size, + tr->offsets_size, extra_buffers_size, + !reply && (t->flags & TF_ONE_WAY)); + if (IS_ERR(t->buffer)) { + /* + * -ESRCH indicates VMA cleared. The target is dying. + */ + return_error_param = PTR_ERR(t->buffer); + return_error = return_error_param == -ESRCH ? + BR_DEAD_REPLY : BR_FAILED_REPLY; + return_error_line = __LINE__; + t->buffer = NULL; goto err_binder_alloc_buf_failed; } t->buffer->allow_user_free = 0; @@ -1494,17 +3063,17 @@ static void binder_transaction(struct binder_proc *proc, t->buffer->transaction = t; t->buffer->target_node = target_node; trace_binder_transaction_alloc_buf(t->buffer); - if (target_node) - binder_inc_node(target_node, 1, 0, NULL); - - offp = (binder_size_t *)(t->buffer->data + - ALIGN(tr->data_size, sizeof(void *))); + off_start = (binder_size_t *)(t->buffer->data + + ALIGN(tr->data_size, sizeof(void *))); + offp = off_start; if (copy_from_user(t->buffer->data, (const void __user *)(uintptr_t) tr->data.ptr.buffer, tr->data_size)) { binder_user_error("%d:%d got transaction with invalid data ptr\n", proc->pid, thread->pid); return_error = BR_FAILED_REPLY; + return_error_param = -EFAULT; + return_error_line = __LINE__; goto err_copy_data_failed; } if (copy_from_user(offp, (const void __user *)(uintptr_t) @@ -1512,228 +3081,244 @@ static void binder_transaction(struct binder_proc *proc, binder_user_error("%d:%d got transaction with invalid offsets ptr\n", proc->pid, thread->pid); return_error = BR_FAILED_REPLY; + return_error_param = -EFAULT; + return_error_line = __LINE__; goto err_copy_data_failed; } if (!IS_ALIGNED(tr->offsets_size, sizeof(binder_size_t))) { binder_user_error("%d:%d got transaction with invalid offsets size, %lld\n", proc->pid, thread->pid, (u64)tr->offsets_size); return_error = BR_FAILED_REPLY; + return_error_param = -EINVAL; + return_error_line = __LINE__; + goto err_bad_offset; + } + if (!IS_ALIGNED(extra_buffers_size, sizeof(u64))) { + binder_user_error("%d:%d got transaction with unaligned buffers size, %lld\n", + proc->pid, thread->pid, + (u64)extra_buffers_size); + return_error = BR_FAILED_REPLY; + return_error_param = -EINVAL; + return_error_line = __LINE__; goto err_bad_offset; } - off_end = (void *)offp + tr->offsets_size; + off_end = (void *)off_start + tr->offsets_size; + sg_bufp = (u8 *)(PTR_ALIGN(off_end, sizeof(void *))); + sg_buf_end = sg_bufp + extra_buffers_size; off_min = 0; for (; offp < off_end; offp++) { - struct flat_binder_object *fp; + struct binder_object_header *hdr; + size_t object_size = binder_validate_object(t->buffer, *offp); - if (*offp > t->buffer->data_size - sizeof(*fp) || - *offp < off_min || - t->buffer->data_size < sizeof(*fp) || - !IS_ALIGNED(*offp, sizeof(u32))) { - binder_user_error("%d:%d got transaction with invalid offset, %lld (min %lld, max %lld)\n", + if (object_size == 0 || *offp < off_min) { + binder_user_error("%d:%d got transaction with invalid offset (%lld, min %lld max %lld) or object.\n", proc->pid, thread->pid, (u64)*offp, (u64)off_min, - (u64)(t->buffer->data_size - - sizeof(*fp))); + (u64)t->buffer->data_size); return_error = BR_FAILED_REPLY; + return_error_param = -EINVAL; + return_error_line = __LINE__; goto err_bad_offset; } - fp = (struct flat_binder_object *)(t->buffer->data + *offp); - off_min = *offp + sizeof(struct flat_binder_object); - switch (fp->type) { + + hdr = (struct binder_object_header *)(t->buffer->data + *offp); + off_min = *offp + object_size; + switch (hdr->type) { case BINDER_TYPE_BINDER: case BINDER_TYPE_WEAK_BINDER: { - struct binder_ref *ref; - struct binder_node *node = binder_get_node(proc, fp->binder); + struct flat_binder_object *fp; - if (node == NULL) { - node = binder_new_node(proc, fp->binder, fp->cookie); - if (node == NULL) { - return_error = BR_FAILED_REPLY; - goto err_binder_new_node_failed; - } - node->min_priority = fp->flags & FLAT_BINDER_FLAG_PRIORITY_MASK; - node->accept_fds = !!(fp->flags & FLAT_BINDER_FLAG_ACCEPTS_FDS); - } - if (fp->cookie != node->cookie) { - binder_user_error("%d:%d sending u%016llx node %d, cookie mismatch %016llx != %016llx\n", - proc->pid, thread->pid, - (u64)fp->binder, node->debug_id, - (u64)fp->cookie, (u64)node->cookie); + fp = to_flat_binder_object(hdr); + ret = binder_translate_binder(fp, t, thread); + if (ret < 0) { return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_for_node_failed; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; } - if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { + } break; + case BINDER_TYPE_HANDLE: + case BINDER_TYPE_WEAK_HANDLE: { + struct flat_binder_object *fp; + + fp = to_flat_binder_object(hdr); + ret = binder_translate_handle(fp, t, thread); + if (ret < 0) { return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_for_node_failed; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; } - ref = binder_get_ref_for_node(target_proc, node); - if (ref == NULL) { + } break; + + case BINDER_TYPE_FD: { + struct binder_fd_object *fp = to_binder_fd_object(hdr); + int target_fd = binder_translate_fd(fp->fd, t, thread, + in_reply_to); + + if (target_fd < 0) { return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_for_node_failed; + return_error_param = target_fd; + return_error_line = __LINE__; + goto err_translate_failed; } - if (fp->type == BINDER_TYPE_BINDER) - fp->type = BINDER_TYPE_HANDLE; - else - fp->type = BINDER_TYPE_WEAK_HANDLE; - fp->binder = 0; - fp->handle = ref->desc; - fp->cookie = 0; - binder_inc_ref(ref, fp->type == BINDER_TYPE_HANDLE, - &thread->todo); - - trace_binder_transaction_node_to_ref(t, node, ref); - binder_debug(BINDER_DEBUG_TRANSACTION, - " node %d u%016llx -> ref %d desc %d\n", - node->debug_id, (u64)node->ptr, - ref->debug_id, ref->desc); + fp->pad_binder = 0; + fp->fd = target_fd; } break; - case BINDER_TYPE_HANDLE: - case BINDER_TYPE_WEAK_HANDLE: { - struct binder_ref *ref = binder_get_ref(proc, fp->handle, - fp->type == BINDER_TYPE_HANDLE); - if (ref == NULL) { - binder_user_error("%d:%d got transaction with invalid handle, %d\n", - proc->pid, - thread->pid, fp->handle); + case BINDER_TYPE_FDA: { + struct binder_fd_array_object *fda = + to_binder_fd_array_object(hdr); + struct binder_buffer_object *parent = + binder_validate_ptr(t->buffer, fda->parent, + off_start, + offp - off_start); + if (!parent) { + binder_user_error("%d:%d got transaction with invalid parent offset or type\n", + proc->pid, thread->pid); return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_failed; + return_error_param = -EINVAL; + return_error_line = __LINE__; + goto err_bad_parent; } - if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { + if (!binder_validate_fixup(t->buffer, off_start, + parent, fda->parent_offset, + last_fixup_obj, + last_fixup_min_off)) { + binder_user_error("%d:%d got transaction with out-of-order buffer fixup\n", + proc->pid, thread->pid); return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_failed; - } - if (ref->node->proc == target_proc) { - if (fp->type == BINDER_TYPE_HANDLE) - fp->type = BINDER_TYPE_BINDER; - else - fp->type = BINDER_TYPE_WEAK_BINDER; - fp->binder = ref->node->ptr; - fp->cookie = ref->node->cookie; - binder_inc_node(ref->node, fp->type == BINDER_TYPE_BINDER, 0, NULL); - trace_binder_transaction_ref_to_node(t, ref); - binder_debug(BINDER_DEBUG_TRANSACTION, - " ref %d desc %d -> node %d u%016llx\n", - ref->debug_id, ref->desc, ref->node->debug_id, - (u64)ref->node->ptr); - } else { - struct binder_ref *new_ref; - - new_ref = binder_get_ref_for_node(target_proc, ref->node); - if (new_ref == NULL) { - return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_for_node_failed; - } - fp->binder = 0; - fp->handle = new_ref->desc; - fp->cookie = 0; - binder_inc_ref(new_ref, fp->type == BINDER_TYPE_HANDLE, NULL); - trace_binder_transaction_ref_to_ref(t, ref, - new_ref); - binder_debug(BINDER_DEBUG_TRANSACTION, - " ref %d desc %d -> ref %d desc %d (node %d)\n", - ref->debug_id, ref->desc, new_ref->debug_id, - new_ref->desc, ref->node->debug_id); + return_error_param = -EINVAL; + return_error_line = __LINE__; + goto err_bad_parent; } - } break; - - case BINDER_TYPE_FD: { - int target_fd; - struct file *file; - - if (reply) { - if (!(in_reply_to->flags & TF_ACCEPT_FDS)) { - binder_user_error("%d:%d got reply with fd, %d, but target does not allow fds\n", - proc->pid, thread->pid, fp->handle); - return_error = BR_FAILED_REPLY; - goto err_fd_not_allowed; - } - } else if (!target_node->accept_fds) { - binder_user_error("%d:%d got transaction with fd, %d, but target does not allow fds\n", - proc->pid, thread->pid, fp->handle); + ret = binder_translate_fd_array(fda, parent, t, thread, + in_reply_to); + if (ret < 0) { return_error = BR_FAILED_REPLY; - goto err_fd_not_allowed; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; } - - file = fget(fp->handle); - if (file == NULL) { - binder_user_error("%d:%d got transaction with invalid fd, %d\n", - proc->pid, thread->pid, fp->handle); + last_fixup_obj = parent; + last_fixup_min_off = + fda->parent_offset + sizeof(u32) * fda->num_fds; + } break; + case BINDER_TYPE_PTR: { + struct binder_buffer_object *bp = + to_binder_buffer_object(hdr); + size_t buf_left = sg_buf_end - sg_bufp; + + if (bp->length > buf_left) { + binder_user_error("%d:%d got transaction with too large buffer\n", + proc->pid, thread->pid); return_error = BR_FAILED_REPLY; - goto err_fget_failed; + return_error_param = -EINVAL; + return_error_line = __LINE__; + goto err_bad_offset; } - if (security_binder_transfer_file(proc->tsk, target_proc->tsk, file) < 0) { - fput(file); + if (copy_from_user(sg_bufp, + (const void __user *)(uintptr_t) + bp->buffer, bp->length)) { + binder_user_error("%d:%d got transaction with invalid offsets ptr\n", + proc->pid, thread->pid); + return_error_param = -EFAULT; return_error = BR_FAILED_REPLY; - goto err_get_unused_fd_failed; + return_error_line = __LINE__; + goto err_copy_data_failed; } - target_fd = task_get_unused_fd_flags(target_proc, O_CLOEXEC); - if (target_fd < 0) { - fput(file); + /* Fixup buffer pointer to target proc address space */ + bp->buffer = (uintptr_t)sg_bufp + + binder_alloc_get_user_buffer_offset( + &target_proc->alloc); + sg_bufp += ALIGN(bp->length, sizeof(u64)); + + ret = binder_fixup_parent(t, thread, bp, off_start, + offp - off_start, + last_fixup_obj, + last_fixup_min_off); + if (ret < 0) { return_error = BR_FAILED_REPLY; - goto err_get_unused_fd_failed; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; } - task_fd_install(target_proc, target_fd, file); - trace_binder_transaction_fd(t, fp->handle, target_fd); - binder_debug(BINDER_DEBUG_TRANSACTION, - " fd %d -> %d\n", fp->handle, target_fd); - /* TODO: fput? */ - fp->binder = 0; - fp->handle = target_fd; + last_fixup_obj = bp; + last_fixup_min_off = 0; } break; - default: binder_user_error("%d:%d got transaction with invalid object type, %x\n", - proc->pid, thread->pid, fp->type); + proc->pid, thread->pid, hdr->type); return_error = BR_FAILED_REPLY; + return_error_param = -EINVAL; + return_error_line = __LINE__; goto err_bad_object_type; } } + tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE; + binder_enqueue_work(proc, tcomplete, &thread->todo); + t->work.type = BINDER_WORK_TRANSACTION; + if (reply) { + binder_inner_proc_lock(target_proc); + if (target_thread->is_dead) { + binder_inner_proc_unlock(target_proc); + goto err_dead_proc_or_thread; + } BUG_ON(t->buffer->async_transaction != 0); - binder_pop_transaction(target_thread, in_reply_to); + binder_pop_transaction_ilocked(target_thread, in_reply_to); + binder_enqueue_work_ilocked(&t->work, &target_thread->todo); + binder_inner_proc_unlock(target_proc); + wake_up_interruptible_sync(&target_thread->wait); + binder_restore_priority(current, in_reply_to->saved_priority); + binder_free_transaction(in_reply_to); } else if (!(t->flags & TF_ONE_WAY)) { BUG_ON(t->buffer->async_transaction != 0); + binder_inner_proc_lock(proc); t->need_reply = 1; t->from_parent = thread->transaction_stack; thread->transaction_stack = t; + binder_inner_proc_unlock(proc); + if (!binder_proc_transaction(t, target_proc, target_thread)) { + binder_inner_proc_lock(proc); + binder_pop_transaction_ilocked(thread, t); + binder_inner_proc_unlock(proc); + goto err_dead_proc_or_thread; + } } else { BUG_ON(target_node == NULL); BUG_ON(t->buffer->async_transaction != 1); - if (target_node->has_async_transaction) { - target_list = &target_node->async_todo; - target_wait = NULL; - } else - target_node->has_async_transaction = 1; - } - t->work.type = BINDER_WORK_TRANSACTION; - list_add_tail(&t->work.entry, target_list); - tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE; - list_add_tail(&tcomplete->entry, &thread->todo); - if (target_wait) { - if (reply || !(t->flags & TF_ONE_WAY)) { - preempt_disable(); - wake_up_interruptible_sync(target_wait); - preempt_enable_no_resched(); - } - else { - wake_up_interruptible(target_wait); - } + if (!binder_proc_transaction(t, target_proc, NULL)) + goto err_dead_proc_or_thread; } + if (target_thread) + binder_thread_dec_tmpref(target_thread); + binder_proc_dec_tmpref(target_proc); + if (target_node) + binder_dec_node_tmpref(target_node); + /* + * write barrier to synchronize with initialization + * of log entry + */ + smp_wmb(); + WRITE_ONCE(e->debug_id_done, t_debug_id); return; -err_get_unused_fd_failed: -err_fget_failed: -err_fd_not_allowed: -err_binder_get_ref_for_node_failed: -err_binder_get_ref_failed: -err_binder_new_node_failed: +err_dead_proc_or_thread: + return_error = BR_DEAD_REPLY; + return_error_line = __LINE__; + binder_dequeue_work(proc, tcomplete); +err_translate_failed: err_bad_object_type: err_bad_offset: +err_bad_parent: err_copy_data_failed: trace_binder_transaction_failed_buffer_release(t->buffer); binder_transaction_buffer_release(target_proc, t->buffer, offp); + if (target_node) + binder_dec_node_tmpref(target_node); + target_node = NULL; t->buffer->transaction = NULL; - binder_free_buf(target_proc, t->buffer); + binder_alloc_free_buf(&target_proc->alloc, t->buffer); err_binder_alloc_buf_failed: kfree(tcomplete); binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); @@ -1745,25 +3330,52 @@ static void binder_transaction(struct binder_proc *proc, err_empty_call_stack: err_dead_binder: err_invalid_target_handle: -err_no_context_mgr_node: + if (target_thread) + binder_thread_dec_tmpref(target_thread); + if (target_proc) + binder_proc_dec_tmpref(target_proc); + if (target_node) { + binder_dec_node(target_node, 1, 0); + binder_dec_node_tmpref(target_node); + } + binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, - "%d:%d transaction failed %d, size %lld-%lld\n", - proc->pid, thread->pid, return_error, - (u64)tr->data_size, (u64)tr->offsets_size); + "%d:%d transaction failed %d/%d, size %lld-%lld line %d\n", + proc->pid, thread->pid, return_error, return_error_param, + (u64)tr->data_size, (u64)tr->offsets_size, + return_error_line); { struct binder_transaction_log_entry *fe; + e->return_error = return_error; + e->return_error_param = return_error_param; + e->return_error_line = return_error_line; fe = binder_transaction_log_add(&binder_transaction_log_failed); *fe = *e; + /* + * write barrier to synchronize with initialization + * of log entry + */ + smp_wmb(); + WRITE_ONCE(e->debug_id_done, t_debug_id); + WRITE_ONCE(fe->debug_id_done, t_debug_id); } - BUG_ON(thread->return_error != BR_OK); + BUG_ON(thread->return_error.cmd != BR_OK); if (in_reply_to) { - thread->return_error = BR_TRANSACTION_COMPLETE; + binder_restore_priority(current, in_reply_to->saved_priority); + thread->return_error.cmd = BR_TRANSACTION_COMPLETE; + binder_enqueue_work(thread->proc, + &thread->return_error.work, + &thread->todo); binder_send_failed_reply(in_reply_to, return_error); - } else - thread->return_error = return_error; + } else { + thread->return_error.cmd = return_error; + binder_enqueue_work(thread->proc, + &thread->return_error.work, + &thread->todo); + } } static int binder_thread_write(struct binder_proc *proc, @@ -1772,19 +3384,22 @@ static int binder_thread_write(struct binder_proc *proc, binder_size_t *consumed) { uint32_t cmd; + struct binder_context *context = proc->context; void __user *buffer = (void __user *)(uintptr_t)binder_buffer; void __user *ptr = buffer + *consumed; void __user *end = buffer + size; - while (ptr < end && thread->return_error == BR_OK) { + while (ptr < end && thread->return_error.cmd == BR_OK) { + int ret; + if (get_user(cmd, (uint32_t __user *)ptr)) return -EFAULT; ptr += sizeof(uint32_t); trace_binder_command(cmd); if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.bc)) { - binder_stats.bc[_IOC_NR(cmd)]++; - proc->stats.bc[_IOC_NR(cmd)]++; - thread->stats.bc[_IOC_NR(cmd)]++; + atomic_inc(&binder_stats.bc[_IOC_NR(cmd)]); + atomic_inc(&proc->stats.bc[_IOC_NR(cmd)]); + atomic_inc(&thread->stats.bc[_IOC_NR(cmd)]); } switch (cmd) { case BC_INCREFS: @@ -1792,53 +3407,61 @@ static int binder_thread_write(struct binder_proc *proc, case BC_RELEASE: case BC_DECREFS: { uint32_t target; - struct binder_ref *ref; const char *debug_string; + bool strong = cmd == BC_ACQUIRE || cmd == BC_RELEASE; + bool increment = cmd == BC_INCREFS || cmd == BC_ACQUIRE; + struct binder_ref_data rdata; if (get_user(target, (uint32_t __user *)ptr)) return -EFAULT; + ptr += sizeof(uint32_t); - if (target == 0 && binder_context_mgr_node && - (cmd == BC_INCREFS || cmd == BC_ACQUIRE)) { - ref = binder_get_ref_for_node(proc, - binder_context_mgr_node); - if (ref->desc != target) { - binder_user_error("%d:%d tried to acquire reference to desc 0, got %d instead\n", - proc->pid, thread->pid, - ref->desc); - } - } else - ref = binder_get_ref(proc, target, - cmd == BC_ACQUIRE || - cmd == BC_RELEASE); - if (ref == NULL) { - binder_user_error("%d:%d refcount change on invalid ref %d\n", - proc->pid, thread->pid, target); - break; + ret = -1; + if (increment && !target) { + struct binder_node *ctx_mgr_node; + mutex_lock(&context->context_mgr_node_lock); + ctx_mgr_node = context->binder_context_mgr_node; + if (ctx_mgr_node) + ret = binder_inc_ref_for_node( + proc, ctx_mgr_node, + strong, NULL, &rdata); + mutex_unlock(&context->context_mgr_node_lock); + } + if (ret) + ret = binder_update_ref_for_handle( + proc, target, increment, strong, + &rdata); + if (!ret && rdata.desc != target) { + binder_user_error("%d:%d tried to acquire reference to desc %d, got %d instead\n", + proc->pid, thread->pid, + target, rdata.desc); } switch (cmd) { case BC_INCREFS: debug_string = "IncRefs"; - binder_inc_ref(ref, 0, NULL); break; case BC_ACQUIRE: debug_string = "Acquire"; - binder_inc_ref(ref, 1, NULL); break; case BC_RELEASE: debug_string = "Release"; - binder_dec_ref(ref, 1); break; case BC_DECREFS: default: debug_string = "DecRefs"; - binder_dec_ref(ref, 0); + break; + } + if (ret) { + binder_user_error("%d:%d %s %d refcount change on invalid ref %d ret %d\n", + proc->pid, thread->pid, debug_string, + strong, target, ret); break; } binder_debug(BINDER_DEBUG_USER_REFS, - "%d:%d %s ref %d desc %d s %d w %d for node %d\n", - proc->pid, thread->pid, debug_string, ref->debug_id, - ref->desc, ref->strong, ref->weak, ref->node->debug_id); + "%d:%d %s ref %d desc %d s %d w %d\n", + proc->pid, thread->pid, debug_string, + rdata.debug_id, rdata.desc, rdata.strong, + rdata.weak); break; } case BC_INCREFS_DONE: @@ -1846,6 +3469,7 @@ static int binder_thread_write(struct binder_proc *proc, binder_uintptr_t node_ptr; binder_uintptr_t cookie; struct binder_node *node; + bool free_node; if (get_user(node_ptr, (binder_uintptr_t __user *)ptr)) return -EFAULT; @@ -1870,13 +3494,17 @@ static int binder_thread_write(struct binder_proc *proc, "BC_INCREFS_DONE" : "BC_ACQUIRE_DONE", (u64)node_ptr, node->debug_id, (u64)cookie, (u64)node->cookie); + binder_put_node(node); break; } + binder_node_inner_lock(node); if (cmd == BC_ACQUIRE_DONE) { if (node->pending_strong_ref == 0) { binder_user_error("%d:%d BC_ACQUIRE_DONE node %d has no pending acquire request\n", proc->pid, thread->pid, node->debug_id); + binder_node_inner_unlock(node); + binder_put_node(node); break; } node->pending_strong_ref = 0; @@ -1885,16 +3513,23 @@ static int binder_thread_write(struct binder_proc *proc, binder_user_error("%d:%d BC_INCREFS_DONE node %d has no pending increfs request\n", proc->pid, thread->pid, node->debug_id); + binder_node_inner_unlock(node); + binder_put_node(node); break; } node->pending_weak_ref = 0; } - binder_dec_node(node, cmd == BC_ACQUIRE_DONE, 0); + free_node = binder_dec_node_nilocked(node, + cmd == BC_ACQUIRE_DONE, 0); + WARN_ON(free_node); binder_debug(BINDER_DEBUG_USER_REFS, - "%d:%d %s node %d ls %d lw %d\n", + "%d:%d %s node %d ls %d lw %d tr %d\n", proc->pid, thread->pid, cmd == BC_INCREFS_DONE ? "BC_INCREFS_DONE" : "BC_ACQUIRE_DONE", - node->debug_id, node->local_strong_refs, node->local_weak_refs); + node->debug_id, node->local_strong_refs, + node->local_weak_refs, node->tmp_refs); + binder_node_inner_unlock(node); + binder_put_node(node); break; } case BC_ATTEMPT_ACQUIRE: @@ -1912,7 +3547,8 @@ static int binder_thread_write(struct binder_proc *proc, return -EFAULT; ptr += sizeof(binder_uintptr_t); - buffer = binder_buffer_lookup(proc, data_ptr); + buffer = binder_alloc_prepare_to_free(&proc->alloc, + data_ptr); if (buffer == NULL) { binder_user_error("%d:%d BC_FREE_BUFFER u%016llx no match\n", proc->pid, thread->pid, (u64)data_ptr); @@ -1934,18 +3570,41 @@ static int binder_thread_write(struct binder_proc *proc, buffer->transaction = NULL; } if (buffer->async_transaction && buffer->target_node) { - BUG_ON(!buffer->target_node->has_async_transaction); - if (list_empty(&buffer->target_node->async_todo)) - buffer->target_node->has_async_transaction = 0; - else - list_move_tail(buffer->target_node->async_todo.next, &thread->todo); + struct binder_node *buf_node; + struct binder_work *w; + + buf_node = buffer->target_node; + binder_node_inner_lock(buf_node); + BUG_ON(!buf_node->has_async_transaction); + BUG_ON(buf_node->proc != proc); + w = binder_dequeue_work_head_ilocked( + &buf_node->async_todo); + if (!w) { + buf_node->has_async_transaction = 0; + } else { + binder_enqueue_work_ilocked( + w, &proc->todo); + binder_wakeup_proc_ilocked(proc); + } + binder_node_inner_unlock(buf_node); } trace_binder_transaction_buffer_release(buffer); binder_transaction_buffer_release(proc, buffer, NULL); - binder_free_buf(proc, buffer); + binder_alloc_free_buf(&proc->alloc, buffer); break; } + case BC_TRANSACTION_SG: + case BC_REPLY_SG: { + struct binder_transaction_data_sg tr; + + if (copy_from_user(&tr, ptr, sizeof(tr))) + return -EFAULT; + ptr += sizeof(tr); + binder_transaction(proc, thread, &tr.transaction_data, + cmd == BC_REPLY_SG, tr.buffers_size); + break; + } case BC_TRANSACTION: case BC_REPLY: { struct binder_transaction_data tr; @@ -1953,7 +3612,8 @@ static int binder_thread_write(struct binder_proc *proc, if (copy_from_user(&tr, ptr, sizeof(tr))) return -EFAULT; ptr += sizeof(tr); - binder_transaction(proc, thread, &tr, cmd == BC_REPLY); + binder_transaction(proc, thread, &tr, + cmd == BC_REPLY, 0); break; } @@ -1961,6 +3621,7 @@ static int binder_thread_write(struct binder_proc *proc, binder_debug(BINDER_DEBUG_THREADS, "%d:%d BC_REGISTER_LOOPER\n", proc->pid, thread->pid); + binder_inner_proc_lock(proc); if (thread->looper & BINDER_LOOPER_STATE_ENTERED) { thread->looper |= BINDER_LOOPER_STATE_INVALID; binder_user_error("%d:%d ERROR: BC_REGISTER_LOOPER called after BC_ENTER_LOOPER\n", @@ -1974,6 +3635,7 @@ static int binder_thread_write(struct binder_proc *proc, proc->requested_threads_started++; } thread->looper |= BINDER_LOOPER_STATE_REGISTERED; + binder_inner_proc_unlock(proc); break; case BC_ENTER_LOOPER: binder_debug(BINDER_DEBUG_THREADS, @@ -1998,7 +3660,7 @@ static int binder_thread_write(struct binder_proc *proc, uint32_t target; binder_uintptr_t cookie; struct binder_ref *ref; - struct binder_ref_death *death; + struct binder_ref_death *death = NULL; if (get_user(target, (uint32_t __user *)ptr)) return -EFAULT; @@ -2006,7 +3668,29 @@ static int binder_thread_write(struct binder_proc *proc, if (get_user(cookie, (binder_uintptr_t __user *)ptr)) return -EFAULT; ptr += sizeof(binder_uintptr_t); - ref = binder_get_ref(proc, target, false); + if (cmd == BC_REQUEST_DEATH_NOTIFICATION) { + /* + * Allocate memory for death notification + * before taking lock + */ + death = kzalloc(sizeof(*death), GFP_KERNEL); + if (death == NULL) { + WARN_ON(thread->return_error.cmd != + BR_OK); + thread->return_error.cmd = BR_ERROR; + binder_enqueue_work( + thread->proc, + &thread->return_error.work, + &thread->todo); + binder_debug( + BINDER_DEBUG_FAILED_TRANSACTION, + "%d:%d BC_REQUEST_DEATH_NOTIFICATION failed\n", + proc->pid, thread->pid); + break; + } + } + binder_proc_lock(proc); + ref = binder_get_ref_olocked(proc, target, false); if (ref == NULL) { binder_user_error("%d:%d %s invalid ref %d\n", proc->pid, thread->pid, @@ -2014,6 +3698,8 @@ static int binder_thread_write(struct binder_proc *proc, "BC_REQUEST_DEATH_NOTIFICATION" : "BC_CLEAR_DEATH_NOTIFICATION", target); + binder_proc_unlock(proc); + kfree(death); break; } @@ -2023,21 +3709,18 @@ static int binder_thread_write(struct binder_proc *proc, cmd == BC_REQUEST_DEATH_NOTIFICATION ? "BC_REQUEST_DEATH_NOTIFICATION" : "BC_CLEAR_DEATH_NOTIFICATION", - (u64)cookie, ref->debug_id, ref->desc, - ref->strong, ref->weak, ref->node->debug_id); + (u64)cookie, ref->data.debug_id, + ref->data.desc, ref->data.strong, + ref->data.weak, ref->node->debug_id); + binder_node_lock(ref->node); if (cmd == BC_REQUEST_DEATH_NOTIFICATION) { if (ref->death) { binder_user_error("%d:%d BC_REQUEST_DEATH_NOTIFICATION death notification already set\n", proc->pid, thread->pid); - break; - } - death = kzalloc(sizeof(*death), GFP_KERNEL); - if (death == NULL) { - thread->return_error = BR_ERROR; - binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, - "%d:%d BC_REQUEST_DEATH_NOTIFICATION failed\n", - proc->pid, thread->pid); + binder_node_unlock(ref->node); + binder_proc_unlock(proc); + kfree(death); break; } binder_stats_created(BINDER_STAT_DEATH); @@ -2046,17 +3729,19 @@ static int binder_thread_write(struct binder_proc *proc, ref->death = death; if (ref->node->proc == NULL) { ref->death->work.type = BINDER_WORK_DEAD_BINDER; - if (thread->looper & (BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_ENTERED)) { - list_add_tail(&ref->death->work.entry, &thread->todo); - } else { - list_add_tail(&ref->death->work.entry, &proc->todo); - wake_up_interruptible(&proc->wait); - } + + binder_inner_proc_lock(proc); + binder_enqueue_work_ilocked( + &ref->death->work, &proc->todo); + binder_wakeup_proc_ilocked(proc); + binder_inner_proc_unlock(proc); } } else { if (ref->death == NULL) { binder_user_error("%d:%d BC_CLEAR_DEATH_NOTIFICATION death notification not active\n", proc->pid, thread->pid); + binder_node_unlock(ref->node); + binder_proc_unlock(proc); break; } death = ref->death; @@ -2065,22 +3750,35 @@ static int binder_thread_write(struct binder_proc *proc, proc->pid, thread->pid, (u64)death->cookie, (u64)cookie); + binder_node_unlock(ref->node); + binder_proc_unlock(proc); break; } ref->death = NULL; + binder_inner_proc_lock(proc); if (list_empty(&death->work.entry)) { death->work.type = BINDER_WORK_CLEAR_DEATH_NOTIFICATION; - if (thread->looper & (BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_ENTERED)) { - list_add_tail(&death->work.entry, &thread->todo); - } else { - list_add_tail(&death->work.entry, &proc->todo); - wake_up_interruptible(&proc->wait); + if (thread->looper & + (BINDER_LOOPER_STATE_REGISTERED | + BINDER_LOOPER_STATE_ENTERED)) + binder_enqueue_work_ilocked( + &death->work, + &thread->todo); + else { + binder_enqueue_work_ilocked( + &death->work, + &proc->todo); + binder_wakeup_proc_ilocked( + proc); } } else { BUG_ON(death->work.type != BINDER_WORK_DEAD_BINDER); death->work.type = BINDER_WORK_DEAD_BINDER_AND_CLEAR; } + binder_inner_proc_unlock(proc); } + binder_node_unlock(ref->node); + binder_proc_unlock(proc); } break; case BC_DEAD_BINDER_DONE: { struct binder_work *w; @@ -2090,9 +3788,14 @@ static int binder_thread_write(struct binder_proc *proc, if (get_user(cookie, (binder_uintptr_t __user *)ptr)) return -EFAULT; - ptr += sizeof(void *); - list_for_each_entry(w, &proc->delivered_death, entry) { - struct binder_ref_death *tmp_death = container_of(w, struct binder_ref_death, work); + ptr += sizeof(cookie); + binder_inner_proc_lock(proc); + list_for_each_entry(w, &proc->delivered_death, + entry) { + struct binder_ref_death *tmp_death = + container_of(w, + struct binder_ref_death, + work); if (tmp_death->cookie == cookie) { death = tmp_death; @@ -2100,25 +3803,31 @@ static int binder_thread_write(struct binder_proc *proc, } } binder_debug(BINDER_DEBUG_DEAD_BINDER, - "%d:%d BC_DEAD_BINDER_DONE %016llx found %pK\n", + "%d:%d BC_DEAD_BINDER_DONE %016llx found %p\n", proc->pid, thread->pid, (u64)cookie, death); if (death == NULL) { binder_user_error("%d:%d BC_DEAD_BINDER_DONE %016llx not found\n", proc->pid, thread->pid, (u64)cookie); + binder_inner_proc_unlock(proc); break; } - - list_del_init(&death->work.entry); + binder_dequeue_work_ilocked(&death->work); if (death->work.type == BINDER_WORK_DEAD_BINDER_AND_CLEAR) { death->work.type = BINDER_WORK_CLEAR_DEATH_NOTIFICATION; - if (thread->looper & (BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_ENTERED)) { - list_add_tail(&death->work.entry, &thread->todo); - } else { - list_add_tail(&death->work.entry, &proc->todo); - wake_up_interruptible(&proc->wait); + if (thread->looper & + (BINDER_LOOPER_STATE_REGISTERED | + BINDER_LOOPER_STATE_ENTERED)) + binder_enqueue_work_ilocked( + &death->work, &thread->todo); + else { + binder_enqueue_work_ilocked( + &death->work, + &proc->todo); + binder_wakeup_proc_ilocked(proc); } } + binder_inner_proc_unlock(proc); } break; default: @@ -2136,23 +3845,73 @@ static void binder_stat_br(struct binder_proc *proc, { trace_binder_return(cmd); if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.br)) { - binder_stats.br[_IOC_NR(cmd)]++; - proc->stats.br[_IOC_NR(cmd)]++; - thread->stats.br[_IOC_NR(cmd)]++; + atomic_inc(&binder_stats.br[_IOC_NR(cmd)]); + atomic_inc(&proc->stats.br[_IOC_NR(cmd)]); + atomic_inc(&thread->stats.br[_IOC_NR(cmd)]); } } -static int binder_has_proc_work(struct binder_proc *proc, - struct binder_thread *thread) +static int binder_put_node_cmd(struct binder_proc *proc, + struct binder_thread *thread, + void __user **ptrp, + binder_uintptr_t node_ptr, + binder_uintptr_t node_cookie, + int node_debug_id, + uint32_t cmd, const char *cmd_name) { - return !list_empty(&proc->todo) || - (thread->looper & BINDER_LOOPER_STATE_NEED_RETURN); + void __user *ptr = *ptrp; + + if (put_user(cmd, (uint32_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(uint32_t); + + if (put_user(node_ptr, (binder_uintptr_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(binder_uintptr_t); + + if (put_user(node_cookie, (binder_uintptr_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(binder_uintptr_t); + + binder_stat_br(proc, thread, cmd); + binder_debug(BINDER_DEBUG_USER_REFS, "%d:%d %s %d u%016llx c%016llx\n", + proc->pid, thread->pid, cmd_name, node_debug_id, + (u64)node_ptr, (u64)node_cookie); + + *ptrp = ptr; + return 0; } -static int binder_has_thread_work(struct binder_thread *thread) +static int binder_wait_for_work(struct binder_thread *thread, + bool do_proc_work) { - return !list_empty(&thread->todo) || thread->return_error != BR_OK || - (thread->looper & BINDER_LOOPER_STATE_NEED_RETURN); + DEFINE_WAIT(wait); + struct binder_proc *proc = thread->proc; + int ret = 0; + + freezer_do_not_count(); + binder_inner_proc_lock(proc); + for (;;) { + prepare_to_wait(&thread->wait, &wait, TASK_INTERRUPTIBLE); + if (binder_has_work_ilocked(thread, do_proc_work)) + break; + if (do_proc_work) + list_add(&thread->waiting_thread_node, + &proc->waiting_threads); + binder_inner_proc_unlock(proc); + schedule(); + binder_inner_proc_lock(proc); + list_del_init(&thread->waiting_thread_node); + if (signal_pending(current)) { + ret = -ERESTARTSYS; + break; + } + } + finish_wait(&thread->wait, &wait); + binder_inner_proc_unlock(proc); + freezer_count(); + + return ret; } static int binder_thread_read(struct binder_proc *proc, @@ -2165,46 +3924,24 @@ static int binder_thread_read(struct binder_proc *proc, void __user *end = buffer + size; int ret = 0; - int wait_for_proc_work; - - if (*consumed == 0) { - if (put_user(BR_NOOP, (uint32_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(uint32_t); - } - -retry: - wait_for_proc_work = thread->transaction_stack == NULL && - list_empty(&thread->todo); + int wait_for_proc_work; - if (thread->return_error != BR_OK && ptr < end) { - if (thread->return_error2 != BR_OK) { - if (put_user(thread->return_error2, (uint32_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(uint32_t); - binder_stat_br(proc, thread, thread->return_error2); - if (ptr == end) - goto done; - thread->return_error2 = BR_OK; - } - if (put_user(thread->return_error, (uint32_t __user *)ptr)) + if (*consumed == 0) { + if (put_user(BR_NOOP, (uint32_t __user *)ptr)) return -EFAULT; ptr += sizeof(uint32_t); - binder_stat_br(proc, thread, thread->return_error); - thread->return_error = BR_OK; - goto done; } +retry: + binder_inner_proc_lock(proc); + wait_for_proc_work = binder_available_for_proc_work_ilocked(thread); + binder_inner_proc_unlock(proc); thread->looper |= BINDER_LOOPER_STATE_WAITING; - if (wait_for_proc_work) - proc->ready_threads++; - - binder_unlock(__func__); trace_binder_wait_for_work(wait_for_proc_work, !!thread->transaction_stack, - !list_empty(&thread->todo)); + !binder_worklist_empty(proc, &thread->todo)); if (wait_for_proc_work) { if (!(thread->looper & (BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_ENTERED))) { @@ -2213,24 +3950,16 @@ static int binder_thread_read(struct binder_proc *proc, wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2); } - binder_set_nice(proc->default_priority); - if (non_block) { - if (!binder_has_proc_work(proc, thread)) - ret = -EAGAIN; - } else - ret = wait_event_freezable_exclusive(proc->wait, binder_has_proc_work(proc, thread)); - } else { - if (non_block) { - if (!binder_has_thread_work(thread)) - ret = -EAGAIN; - } else - ret = wait_event_freezable(thread->wait, binder_has_thread_work(thread)); + binder_restore_priority(current, proc->default_priority); } - binder_lock(__func__); + if (non_block) { + if (!binder_has_work(thread, wait_for_proc_work)) + ret = -EAGAIN; + } else { + ret = binder_wait_for_work(thread, wait_for_proc_work); + } - if (wait_for_proc_work) - proc->ready_threads--; thread->looper &= ~BINDER_LOOPER_STATE_WAITING; if (ret) @@ -2239,31 +3968,52 @@ static int binder_thread_read(struct binder_proc *proc, while (1) { uint32_t cmd; struct binder_transaction_data tr; - struct binder_work *w; + struct binder_work *w = NULL; + struct list_head *list = NULL; struct binder_transaction *t = NULL; + struct binder_thread *t_from; + + binder_inner_proc_lock(proc); + if (!binder_worklist_empty_ilocked(&thread->todo)) + list = &thread->todo; + else if (!binder_worklist_empty_ilocked(&proc->todo) && + wait_for_proc_work) + list = &proc->todo; + else { + binder_inner_proc_unlock(proc); - if (!list_empty(&thread->todo)) { - w = list_first_entry(&thread->todo, struct binder_work, - entry); - } else if (!list_empty(&proc->todo) && wait_for_proc_work) { - w = list_first_entry(&proc->todo, struct binder_work, - entry); - } else { /* no data added */ - if (ptr - buffer == 4 && - !(thread->looper & BINDER_LOOPER_STATE_NEED_RETURN)) + if (ptr - buffer == 4 && !thread->looper_need_return) goto retry; break; } - if (end - ptr < sizeof(tr) + 4) + if (end - ptr < sizeof(tr) + 4) { + binder_inner_proc_unlock(proc); break; + } + w = binder_dequeue_work_head_ilocked(list); switch (w->type) { case BINDER_WORK_TRANSACTION: { + binder_inner_proc_unlock(proc); t = container_of(w, struct binder_transaction, work); } break; + case BINDER_WORK_RETURN_ERROR: { + struct binder_error *e = container_of( + w, struct binder_error, work); + + WARN_ON(e->cmd == BR_OK); + binder_inner_proc_unlock(proc); + if (put_user(e->cmd, (uint32_t __user *)ptr)) + return -EFAULT; + e->cmd = BR_OK; + ptr += sizeof(uint32_t); + + binder_stat_br(proc, thread, cmd); + } break; case BINDER_WORK_TRANSACTION_COMPLETE: { + binder_inner_proc_unlock(proc); cmd = BR_TRANSACTION_COMPLETE; if (put_user(cmd, (uint32_t __user *)ptr)) return -EFAULT; @@ -2273,113 +4023,134 @@ static int binder_thread_read(struct binder_proc *proc, binder_debug(BINDER_DEBUG_TRANSACTION_COMPLETE, "%d:%d BR_TRANSACTION_COMPLETE\n", proc->pid, thread->pid); - - list_del(&w->entry); kfree(w); binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); } break; case BINDER_WORK_NODE: { struct binder_node *node = container_of(w, struct binder_node, work); - uint32_t cmd = BR_NOOP; - const char *cmd_name; - int strong = node->internal_strong_refs || node->local_strong_refs; - int weak = !hlist_empty(&node->refs) || node->local_weak_refs || strong; - - if (weak && !node->has_weak_ref) { - cmd = BR_INCREFS; - cmd_name = "BR_INCREFS"; + int strong, weak; + binder_uintptr_t node_ptr = node->ptr; + binder_uintptr_t node_cookie = node->cookie; + int node_debug_id = node->debug_id; + int has_weak_ref; + int has_strong_ref; + void __user *orig_ptr = ptr; + + BUG_ON(proc != node->proc); + strong = node->internal_strong_refs || + node->local_strong_refs; + weak = !hlist_empty(&node->refs) || + node->local_weak_refs || + node->tmp_refs || strong; + has_strong_ref = node->has_strong_ref; + has_weak_ref = node->has_weak_ref; + + if (weak && !has_weak_ref) { node->has_weak_ref = 1; node->pending_weak_ref = 1; node->local_weak_refs++; - } else if (strong && !node->has_strong_ref) { - cmd = BR_ACQUIRE; - cmd_name = "BR_ACQUIRE"; + } + if (strong && !has_strong_ref) { node->has_strong_ref = 1; node->pending_strong_ref = 1; node->local_strong_refs++; - } else if (!strong && node->has_strong_ref) { - cmd = BR_RELEASE; - cmd_name = "BR_RELEASE"; + } + if (!strong && has_strong_ref) node->has_strong_ref = 0; - } else if (!weak && node->has_weak_ref) { - cmd = BR_DECREFS; - cmd_name = "BR_DECREFS"; + if (!weak && has_weak_ref) node->has_weak_ref = 0; - } - if (cmd != BR_NOOP) { - if (put_user(cmd, (uint32_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(uint32_t); - if (put_user(node->ptr, - (binder_uintptr_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(binder_uintptr_t); - if (put_user(node->cookie, - (binder_uintptr_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(binder_uintptr_t); - - binder_stat_br(proc, thread, cmd); - binder_debug(BINDER_DEBUG_USER_REFS, - "%d:%d %s %d u%016llx c%016llx\n", - proc->pid, thread->pid, cmd_name, - node->debug_id, - (u64)node->ptr, (u64)node->cookie); - } else { - list_del_init(&w->entry); - if (!weak && !strong) { - binder_debug(BINDER_DEBUG_INTERNAL_REFS, - "%d:%d node %d u%016llx c%016llx deleted\n", - proc->pid, thread->pid, - node->debug_id, - (u64)node->ptr, - (u64)node->cookie); - rb_erase(&node->rb_node, &proc->nodes); - kfree(node); - binder_stats_deleted(BINDER_STAT_NODE); - } else { - binder_debug(BINDER_DEBUG_INTERNAL_REFS, - "%d:%d node %d u%016llx c%016llx state unchanged\n", - proc->pid, thread->pid, - node->debug_id, - (u64)node->ptr, - (u64)node->cookie); - } - } + if (!weak && !strong) { + binder_debug(BINDER_DEBUG_INTERNAL_REFS, + "%d:%d node %d u%016llx c%016llx deleted\n", + proc->pid, thread->pid, + node_debug_id, + (u64)node_ptr, + (u64)node_cookie); + rb_erase(&node->rb_node, &proc->nodes); + binder_inner_proc_unlock(proc); + binder_node_lock(node); + /* + * Acquire the node lock before freeing the + * node to serialize with other threads that + * may have been holding the node lock while + * decrementing this node (avoids race where + * this thread frees while the other thread + * is unlocking the node after the final + * decrement) + */ + binder_node_unlock(node); + binder_free_node(node); + } else + binder_inner_proc_unlock(proc); + + if (weak && !has_weak_ref) + ret = binder_put_node_cmd( + proc, thread, &ptr, node_ptr, + node_cookie, node_debug_id, + BR_INCREFS, "BR_INCREFS"); + if (!ret && strong && !has_strong_ref) + ret = binder_put_node_cmd( + proc, thread, &ptr, node_ptr, + node_cookie, node_debug_id, + BR_ACQUIRE, "BR_ACQUIRE"); + if (!ret && !strong && has_strong_ref) + ret = binder_put_node_cmd( + proc, thread, &ptr, node_ptr, + node_cookie, node_debug_id, + BR_RELEASE, "BR_RELEASE"); + if (!ret && !weak && has_weak_ref) + ret = binder_put_node_cmd( + proc, thread, &ptr, node_ptr, + node_cookie, node_debug_id, + BR_DECREFS, "BR_DECREFS"); + if (orig_ptr == ptr) + binder_debug(BINDER_DEBUG_INTERNAL_REFS, + "%d:%d node %d u%016llx c%016llx state unchanged\n", + proc->pid, thread->pid, + node_debug_id, + (u64)node_ptr, + (u64)node_cookie); + if (ret) + return ret; } break; case BINDER_WORK_DEAD_BINDER: case BINDER_WORK_DEAD_BINDER_AND_CLEAR: case BINDER_WORK_CLEAR_DEATH_NOTIFICATION: { struct binder_ref_death *death; uint32_t cmd; + binder_uintptr_t cookie; death = container_of(w, struct binder_ref_death, work); if (w->type == BINDER_WORK_CLEAR_DEATH_NOTIFICATION) cmd = BR_CLEAR_DEATH_NOTIFICATION_DONE; else cmd = BR_DEAD_BINDER; - if (put_user(cmd, (uint32_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(uint32_t); - if (put_user(death->cookie, - (binder_uintptr_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(binder_uintptr_t); - binder_stat_br(proc, thread, cmd); + cookie = death->cookie; + binder_debug(BINDER_DEBUG_DEATH_NOTIFICATION, "%d:%d %s %016llx\n", proc->pid, thread->pid, cmd == BR_DEAD_BINDER ? "BR_DEAD_BINDER" : "BR_CLEAR_DEATH_NOTIFICATION_DONE", - (u64)death->cookie); - + (u64)cookie); if (w->type == BINDER_WORK_CLEAR_DEATH_NOTIFICATION) { - list_del(&w->entry); + binder_inner_proc_unlock(proc); kfree(death); binder_stats_deleted(BINDER_STAT_DEATH); - } else - list_move(&w->entry, &proc->delivered_death); + } else { + binder_enqueue_work_ilocked( + w, &proc->delivered_death); + binder_inner_proc_unlock(proc); + } + if (put_user(cmd, (uint32_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(uint32_t); + if (put_user(cookie, + (binder_uintptr_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(binder_uintptr_t); + binder_stat_br(proc, thread, cmd); if (cmd == BR_DEAD_BINDER) goto done; /* DEAD_BINDER notifications can cause transactions */ } break; @@ -2391,16 +4162,14 @@ static int binder_thread_read(struct binder_proc *proc, BUG_ON(t->buffer == NULL); if (t->buffer->target_node) { struct binder_node *target_node = t->buffer->target_node; + struct binder_priority node_prio; tr.target.ptr = target_node->ptr; tr.cookie = target_node->cookie; - t->saved_priority = task_nice(current); - if (t->priority < target_node->min_priority && - !(t->flags & TF_ONE_WAY)) - binder_set_nice(t->priority); - else if (!(t->flags & TF_ONE_WAY) || - t->saved_priority > target_node->min_priority) - binder_set_nice(target_node->min_priority); + node_prio.sched_policy = target_node->sched_policy; + node_prio.prio = target_node->min_priority; + binder_transaction_priority(current, t, node_prio, + target_node->inherit_rt); cmd = BR_TRANSACTION; } else { tr.target.ptr = 0; @@ -2411,8 +4180,9 @@ static int binder_thread_read(struct binder_proc *proc, tr.flags = t->flags; tr.sender_euid = from_kuid(current_user_ns(), t->sender_euid); - if (t->from) { - struct task_struct *sender = t->from->proc->tsk; + t_from = binder_get_txn_from(t); + if (t_from) { + struct task_struct *sender = t_from->proc->tsk; tr.sender_pid = task_tgid_nr_ns(sender, task_active_pid_ns(current)); @@ -2422,18 +4192,32 @@ static int binder_thread_read(struct binder_proc *proc, tr.data_size = t->buffer->data_size; tr.offsets_size = t->buffer->offsets_size; - tr.data.ptr.buffer = (binder_uintptr_t)( - (uintptr_t)t->buffer->data + - proc->user_buffer_offset); + tr.data.ptr.buffer = (binder_uintptr_t) + ((uintptr_t)t->buffer->data + + binder_alloc_get_user_buffer_offset(&proc->alloc)); tr.data.ptr.offsets = tr.data.ptr.buffer + ALIGN(t->buffer->data_size, sizeof(void *)); - if (put_user(cmd, (uint32_t __user *)ptr)) + if (put_user(cmd, (uint32_t __user *)ptr)) { + if (t_from) + binder_thread_dec_tmpref(t_from); + + binder_cleanup_transaction(t, "put_user failed", + BR_FAILED_REPLY); + return -EFAULT; + } ptr += sizeof(uint32_t); - if (copy_to_user(ptr, &tr, sizeof(tr))) + if (copy_to_user(ptr, &tr, sizeof(tr))) { + if (t_from) + binder_thread_dec_tmpref(t_from); + + binder_cleanup_transaction(t, "copy_to_user failed", + BR_FAILED_REPLY); + return -EFAULT; + } ptr += sizeof(tr); trace_binder_transaction_received(t); @@ -2443,21 +4227,22 @@ static int binder_thread_read(struct binder_proc *proc, proc->pid, thread->pid, (cmd == BR_TRANSACTION) ? "BR_TRANSACTION" : "BR_REPLY", - t->debug_id, t->from ? t->from->proc->pid : 0, - t->from ? t->from->pid : 0, cmd, + t->debug_id, t_from ? t_from->proc->pid : 0, + t_from ? t_from->pid : 0, cmd, t->buffer->data_size, t->buffer->offsets_size, (u64)tr.data.ptr.buffer, (u64)tr.data.ptr.offsets); - list_del(&t->work.entry); + if (t_from) + binder_thread_dec_tmpref(t_from); t->buffer->allow_user_free = 1; if (cmd == BR_TRANSACTION && !(t->flags & TF_ONE_WAY)) { + binder_inner_proc_lock(thread->proc); t->to_parent = thread->transaction_stack; t->to_thread = thread; thread->transaction_stack = t; + binder_inner_proc_unlock(thread->proc); } else { - t->buffer->transaction = NULL; - kfree(t); - binder_stats_deleted(BINDER_STAT_TRANSACTION); + binder_free_transaction(t); } break; } @@ -2465,45 +4250,52 @@ static int binder_thread_read(struct binder_proc *proc, done: *consumed = ptr - buffer; - if (proc->requested_threads + proc->ready_threads == 0 && + binder_inner_proc_lock(proc); + if (proc->requested_threads == 0 && + list_empty(&thread->proc->waiting_threads) && proc->requested_threads_started < proc->max_threads && (thread->looper & (BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_ENTERED)) /* the user-space code fails to */ /*spawn a new thread if we leave this out */) { proc->requested_threads++; + binder_inner_proc_unlock(proc); binder_debug(BINDER_DEBUG_THREADS, "%d:%d BR_SPAWN_LOOPER\n", proc->pid, thread->pid); if (put_user(BR_SPAWN_LOOPER, (uint32_t __user *)buffer)) return -EFAULT; binder_stat_br(proc, thread, BR_SPAWN_LOOPER); - } + } else + binder_inner_proc_unlock(proc); return 0; } -static void binder_release_work(struct list_head *list) +static void binder_release_work(struct binder_proc *proc, + struct list_head *list) { struct binder_work *w; - while (!list_empty(list)) { - w = list_first_entry(list, struct binder_work, entry); - list_del_init(&w->entry); + while (1) { + w = binder_dequeue_work_head(proc, list); + if (!w) + return; + switch (w->type) { case BINDER_WORK_TRANSACTION: { struct binder_transaction *t; t = container_of(w, struct binder_transaction, work); - if (t->buffer->target_node && - !(t->flags & TF_ONE_WAY)) { - binder_send_failed_reply(t, BR_DEAD_REPLY); - } else { - binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, - "undelivered transaction %d\n", - t->debug_id); - t->buffer->transaction = NULL; - kfree(t); - binder_stats_deleted(BINDER_STAT_TRANSACTION); - } + + binder_cleanup_transaction(t, "process died.", + BR_DEAD_REPLY); + } break; + case BINDER_WORK_RETURN_ERROR: { + struct binder_error *e = container_of( + w, struct binder_error, work); + + binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, + "undelivered TRANSACTION_ERROR: %u\n", + e->cmd); } break; case BINDER_WORK_TRANSACTION_COMPLETE: { binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, @@ -2531,7 +4323,8 @@ static void binder_release_work(struct list_head *list) } -static struct binder_thread *binder_get_thread(struct binder_proc *proc) +static struct binder_thread *binder_get_thread_ilocked( + struct binder_proc *proc, struct binder_thread *new_thread) { struct binder_thread *thread = NULL; struct rb_node *parent = NULL; @@ -2546,38 +4339,102 @@ static struct binder_thread *binder_get_thread(struct binder_proc *proc) else if (current->pid > thread->pid) p = &(*p)->rb_right; else - break; + return thread; } - if (*p == NULL) { - thread = kzalloc(sizeof(*thread), GFP_KERNEL); - if (thread == NULL) + if (!new_thread) + return NULL; + thread = new_thread; + binder_stats_created(BINDER_STAT_THREAD); + thread->proc = proc; + thread->pid = current->pid; + get_task_struct(current); + thread->task = current; + atomic_set(&thread->tmp_ref, 0); + init_waitqueue_head(&thread->wait); + INIT_LIST_HEAD(&thread->todo); + rb_link_node(&thread->rb_node, parent, p); + rb_insert_color(&thread->rb_node, &proc->threads); + thread->looper_need_return = true; + thread->return_error.work.type = BINDER_WORK_RETURN_ERROR; + thread->return_error.cmd = BR_OK; + thread->reply_error.work.type = BINDER_WORK_RETURN_ERROR; + thread->reply_error.cmd = BR_OK; + INIT_LIST_HEAD(&new_thread->waiting_thread_node); + return thread; +} + +static struct binder_thread *binder_get_thread(struct binder_proc *proc) +{ + struct binder_thread *thread; + struct binder_thread *new_thread; + + binder_inner_proc_lock(proc); + thread = binder_get_thread_ilocked(proc, NULL); + binder_inner_proc_unlock(proc); + if (!thread) { + new_thread = kzalloc(sizeof(*thread), GFP_KERNEL); + if (new_thread == NULL) return NULL; - binder_stats_created(BINDER_STAT_THREAD); - thread->proc = proc; - thread->pid = current->pid; - init_waitqueue_head(&thread->wait); - INIT_LIST_HEAD(&thread->todo); - rb_link_node(&thread->rb_node, parent, p); - rb_insert_color(&thread->rb_node, &proc->threads); - thread->looper |= BINDER_LOOPER_STATE_NEED_RETURN; - thread->return_error = BR_OK; - thread->return_error2 = BR_OK; + binder_inner_proc_lock(proc); + thread = binder_get_thread_ilocked(proc, new_thread); + binder_inner_proc_unlock(proc); + if (thread != new_thread) + kfree(new_thread); } return thread; } -static int binder_free_thread(struct binder_proc *proc, - struct binder_thread *thread) +static void binder_free_proc(struct binder_proc *proc) +{ + BUG_ON(!list_empty(&proc->todo)); + BUG_ON(!list_empty(&proc->delivered_death)); + binder_alloc_deferred_release(&proc->alloc); + put_task_struct(proc->tsk); + binder_stats_deleted(BINDER_STAT_PROC); + kfree(proc); +} + +static void binder_free_thread(struct binder_thread *thread) +{ + BUG_ON(!list_empty(&thread->todo)); + binder_stats_deleted(BINDER_STAT_THREAD); + binder_proc_dec_tmpref(thread->proc); + put_task_struct(thread->task); + kfree(thread); +} + +static int binder_thread_release(struct binder_proc *proc, + struct binder_thread *thread) { struct binder_transaction *t; struct binder_transaction *send_reply = NULL; int active_transactions = 0; - + struct binder_transaction *last_t = NULL; + + binder_inner_proc_lock(thread->proc); + /* + * take a ref on the proc so it survives + * after we remove this thread from proc->threads. + * The corresponding dec is when we actually + * free the thread in binder_free_thread() + */ + proc->tmp_ref++; + /* + * take a ref on this thread to ensure it + * survives while we are releasing it + */ + atomic_inc(&thread->tmp_ref); rb_erase(&thread->rb_node, &proc->threads); t = thread->transaction_stack; - if (t && t->to_thread == thread) - send_reply = t; + if (t) { + spin_lock(&t->lock); + if (t->to_thread == thread) + send_reply = t; + } + thread->is_dead = true; + while (t) { + last_t = t; active_transactions++; binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, "release %d:%d transaction %d %s, still active\n", @@ -2598,12 +4455,16 @@ static int binder_free_thread(struct binder_proc *proc, t = t->from_parent; } else BUG(); + spin_unlock(&last_t->lock); + if (t) + spin_lock(&t->lock); } + binder_inner_proc_unlock(thread->proc); + if (send_reply) binder_send_failed_reply(send_reply, BR_DEAD_REPLY); - binder_release_work(&thread->todo); - kfree(thread); - binder_stats_deleted(BINDER_STAT_THREAD); + binder_release_work(proc, &thread->todo); + binder_thread_dec_tmpref(thread); return active_transactions; } @@ -2612,30 +4473,21 @@ static unsigned int binder_poll(struct file *filp, { struct binder_proc *proc = filp->private_data; struct binder_thread *thread = NULL; - int wait_for_proc_work; - - binder_lock(__func__); + bool wait_for_proc_work; thread = binder_get_thread(proc); - wait_for_proc_work = thread->transaction_stack == NULL && - list_empty(&thread->todo) && thread->return_error == BR_OK; + binder_inner_proc_lock(thread->proc); + thread->looper |= BINDER_LOOPER_STATE_POLL; + wait_for_proc_work = binder_available_for_proc_work_ilocked(thread); - binder_unlock(__func__); + binder_inner_proc_unlock(thread->proc); + + poll_wait(filp, &thread->wait, wait); + + if (binder_has_work(thread, wait_for_proc_work)) + return POLLIN; - if (wait_for_proc_work) { - if (binder_has_proc_work(proc, thread)) - return POLLIN; - poll_wait(filp, &proc->wait, wait); - if (binder_has_proc_work(proc, thread)) - return POLLIN; - } else { - if (binder_has_thread_work(thread)) - return POLLIN; - poll_wait(filp, &thread->wait, wait); - if (binder_has_thread_work(thread)) - return POLLIN; - } return 0; } @@ -2682,8 +4534,10 @@ static int binder_ioctl_write_read(struct file *filp, &bwr.read_consumed, filp->f_flags & O_NONBLOCK); trace_binder_read_done(ret); - if (!list_empty(&proc->todo)) - wake_up_interruptible(&proc->wait); + binder_inner_proc_lock(proc); + if (!binder_worklist_empty_ilocked(&proc->todo)) + binder_wakeup_proc_ilocked(proc); + binder_inner_proc_unlock(proc); if (ret < 0) { if (copy_to_user(ubuf, &bwr, sizeof(bwr))) ret = -EFAULT; @@ -2707,9 +4561,12 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp) { int ret = 0; struct binder_proc *proc = filp->private_data; + struct binder_context *context = proc->context; + struct binder_node *new_node; kuid_t curr_euid = current_euid(); - if (binder_context_mgr_node != NULL) { + mutex_lock(&context->context_mgr_node_lock); + if (context->binder_context_mgr_node) { pr_err("BINDER_SET_CONTEXT_MGR already set\n"); ret = -EBUSY; goto out; @@ -2717,31 +4574,60 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp) ret = security_binder_set_context_mgr(proc->tsk); if (ret < 0) goto out; - if (uid_valid(binder_context_mgr_uid)) { - if (!uid_eq(binder_context_mgr_uid, curr_euid)) { + if (uid_valid(context->binder_context_mgr_uid)) { + if (!uid_eq(context->binder_context_mgr_uid, curr_euid)) { pr_err("BINDER_SET_CONTEXT_MGR bad uid %d != %d\n", from_kuid(&init_user_ns, curr_euid), from_kuid(&init_user_ns, - binder_context_mgr_uid)); + context->binder_context_mgr_uid)); ret = -EPERM; goto out; } } else { - binder_context_mgr_uid = curr_euid; + context->binder_context_mgr_uid = curr_euid; } - binder_context_mgr_node = binder_new_node(proc, 0, 0); - if (binder_context_mgr_node == NULL) { + new_node = binder_new_node(proc, NULL); + if (!new_node) { ret = -ENOMEM; goto out; } - binder_context_mgr_node->local_weak_refs++; - binder_context_mgr_node->local_strong_refs++; - binder_context_mgr_node->has_strong_ref = 1; - binder_context_mgr_node->has_weak_ref = 1; + binder_node_lock(new_node); + new_node->local_weak_refs++; + new_node->local_strong_refs++; + new_node->has_strong_ref = 1; + new_node->has_weak_ref = 1; + context->binder_context_mgr_node = new_node; + binder_node_unlock(new_node); + binder_put_node(new_node); out: + mutex_unlock(&context->context_mgr_node_lock); return ret; } +static int binder_ioctl_get_node_debug_info(struct binder_proc *proc, + struct binder_node_debug_info *info) { + struct rb_node *n; + binder_uintptr_t ptr = info->ptr; + + memset(info, 0, sizeof(*info)); + + binder_inner_proc_lock(proc); + for (n = rb_first(&proc->nodes); n != NULL; n = rb_next(n)) { + struct binder_node *node = rb_entry(n, struct binder_node, + rb_node); + if (node->ptr > ptr) { + info->ptr = node->ptr; + info->cookie = node->cookie; + info->has_strong_ref = node->has_strong_ref; + info->has_weak_ref = node->has_weak_ref; + break; + } + } + binder_inner_proc_unlock(proc); + + return 0; +} + static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { int ret; @@ -2753,13 +4639,14 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) /*pr_info("binder_ioctl: %d:%d %x %lx\n", proc->pid, current->pid, cmd, arg);*/ + binder_selftest_alloc(&proc->alloc); + trace_binder_ioctl(cmd, arg); ret = wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2); if (ret) goto err_unlocked; - binder_lock(__func__); thread = binder_get_thread(proc); if (thread == NULL) { ret = -ENOMEM; @@ -2772,12 +4659,19 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) if (ret) goto err; break; - case BINDER_SET_MAX_THREADS: - if (copy_from_user(&proc->max_threads, ubuf, sizeof(proc->max_threads))) { + case BINDER_SET_MAX_THREADS: { + int max_threads; + + if (copy_from_user(&max_threads, ubuf, + sizeof(max_threads))) { ret = -EINVAL; goto err; } + binder_inner_proc_lock(proc); + proc->max_threads = max_threads; + binder_inner_proc_unlock(proc); break; + } case BINDER_SET_CONTEXT_MGR: ret = binder_ioctl_set_ctx_mgr(filp); if (ret) @@ -2786,7 +4680,7 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) case BINDER_THREAD_EXIT: binder_debug(BINDER_DEBUG_THREADS, "%d:%d exit\n", proc->pid, thread->pid); - binder_free_thread(proc, thread); + binder_thread_release(proc, thread); thread = NULL; break; case BINDER_VERSION: { @@ -2803,6 +4697,24 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) } break; } + case BINDER_GET_NODE_DEBUG_INFO: { + struct binder_node_debug_info info; + + if (copy_from_user(&info, ubuf, sizeof(info))) { + ret = -EFAULT; + goto err; + } + + ret = binder_ioctl_get_node_debug_info(proc, &info); + if (ret < 0) + goto err; + + if (copy_to_user(ubuf, &info, sizeof(info))) { + ret = -EFAULT; + goto err; + } + break; + } default: ret = -EINVAL; goto err; @@ -2810,8 +4722,7 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ret = 0; err: if (thread) - thread->looper &= ~BINDER_LOOPER_STATE_NEED_RETURN; - binder_unlock(__func__); + thread->looper_need_return = false; wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2); if (ret && ret != -ERESTARTSYS) pr_info("%d:%d ioctl %x %lx returned %d\n", proc->pid, current->pid, cmd, arg, ret); @@ -2840,8 +4751,7 @@ static void binder_vma_close(struct vm_area_struct *vma) proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, (unsigned long)pgprot_val(vma->vm_page_prot)); - proc->vma = NULL; - proc->vma_vm_mm = NULL; + binder_alloc_vma_close(&proc->alloc); binder_defer_work(proc, BINDER_DEFERRED_PUT_FILES); } @@ -2859,20 +4769,18 @@ static struct vm_operations_struct binder_vm_ops = { static int binder_mmap(struct file *filp, struct vm_area_struct *vma) { int ret; - struct vm_struct *area; struct binder_proc *proc = filp->private_data; const char *failure_string; - struct binder_buffer *buffer; - if (proc->tsk != current) + if (proc->tsk != current->group_leader) return -EINVAL; if ((vma->vm_end - vma->vm_start) > SZ_4M) vma->vm_end = vma->vm_start + SZ_4M; binder_debug(BINDER_DEBUG_OPEN_CLOSE, - "binder_mmap: %d %lx-%lx (%ld K) vma %lx pagep %lx\n", - proc->pid, vma->vm_start, vma->vm_end, + "%s: %d %lx-%lx (%ld K) vma %lx pagep %lx\n", + __func__, proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, (unsigned long)pgprot_val(vma->vm_page_prot)); @@ -2882,73 +4790,15 @@ static int binder_mmap(struct file *filp, struct vm_area_struct *vma) goto err_bad_arg; } vma->vm_flags = (vma->vm_flags | VM_DONTCOPY) & ~VM_MAYWRITE; - - mutex_lock(&binder_mmap_lock); - if (proc->buffer) { - ret = -EBUSY; - failure_string = "already mapped"; - goto err_already_mapped; - } - - area = get_vm_area(vma->vm_end - vma->vm_start, VM_IOREMAP); - if (area == NULL) { - ret = -ENOMEM; - failure_string = "get_vm_area"; - goto err_get_vm_area_failed; - } - proc->buffer = area->addr; - proc->user_buffer_offset = vma->vm_start - (uintptr_t)proc->buffer; - mutex_unlock(&binder_mmap_lock); - -#ifdef CONFIG_CPU_CACHE_VIPT - if (cache_is_vipt_aliasing()) { - while (CACHE_COLOUR((vma->vm_start ^ (uint32_t)proc->buffer))) { - pr_info("binder_mmap: %d %lx-%lx maps %pK bad alignment\n", proc->pid, vma->vm_start, vma->vm_end, proc->buffer); - vma->vm_start += PAGE_SIZE; - } - } -#endif - proc->pages = kzalloc(sizeof(proc->pages[0]) * ((vma->vm_end - vma->vm_start) / PAGE_SIZE), GFP_KERNEL); - if (proc->pages == NULL) { - ret = -ENOMEM; - failure_string = "alloc page array"; - goto err_alloc_pages_failed; - } - proc->buffer_size = vma->vm_end - vma->vm_start; - vma->vm_ops = &binder_vm_ops; vma->vm_private_data = proc; - if (binder_update_page_range(proc, 1, proc->buffer, proc->buffer + PAGE_SIZE, vma)) { - ret = -ENOMEM; - failure_string = "alloc small buf"; - goto err_alloc_small_buf_failed; - } - buffer = proc->buffer; - INIT_LIST_HEAD(&proc->buffers); - list_add(&buffer->entry, &proc->buffers); - buffer->free = 1; - binder_insert_free_buffer(proc, buffer); - proc->free_async_space = proc->buffer_size / 2; - barrier(); + ret = binder_alloc_mmap_handler(&proc->alloc, vma); + if (ret) + return ret; proc->files = get_files_struct(current); - proc->vma = vma; - proc->vma_vm_mm = vma->vm_mm; - - /*pr_info("binder_mmap: %d %lx-%lx maps %pK\n", - proc->pid, vma->vm_start, vma->vm_end, proc->buffer);*/ return 0; -err_alloc_small_buf_failed: - kfree(proc->pages); - proc->pages = NULL; -err_alloc_pages_failed: - mutex_lock(&binder_mmap_lock); - vfree(proc->buffer); - proc->buffer = NULL; -err_get_vm_area_failed: -err_already_mapped: - mutex_unlock(&binder_mmap_lock); err_bad_arg: pr_err("binder_mmap: %d %lx-%lx %s failed %d\n", proc->pid, vma->vm_start, vma->vm_end, failure_string, ret); @@ -2958,6 +4808,7 @@ static int binder_mmap(struct file *filp, struct vm_area_struct *vma) static int binder_open(struct inode *nodp, struct file *filp) { struct binder_proc *proc; + struct binder_device *binder_dev; binder_debug(BINDER_DEBUG_OPEN_CLOSE, "binder_open: %d:%d\n", current->group_leader->pid, current->pid); @@ -2965,28 +4816,49 @@ static int binder_open(struct inode *nodp, struct file *filp) proc = kzalloc(sizeof(*proc), GFP_KERNEL); if (proc == NULL) return -ENOMEM; - get_task_struct(current); - proc->tsk = current; + spin_lock_init(&proc->inner_lock); + spin_lock_init(&proc->outer_lock); + get_task_struct(current->group_leader); + proc->tsk = current->group_leader; INIT_LIST_HEAD(&proc->todo); - init_waitqueue_head(&proc->wait); - proc->default_priority = task_nice(current); + if (binder_supported_policy(current->policy)) { + proc->default_priority.sched_policy = current->policy; + proc->default_priority.prio = current->normal_prio; + } else { + proc->default_priority.sched_policy = SCHED_NORMAL; + proc->default_priority.prio = NICE_TO_PRIO(0); + } - binder_lock(__func__); + binder_dev = container_of(filp->private_data, struct binder_device, + miscdev); + proc->context = &binder_dev->context; + binder_alloc_init(&proc->alloc); binder_stats_created(BINDER_STAT_PROC); - hlist_add_head(&proc->proc_node, &binder_procs); proc->pid = current->group_leader->pid; INIT_LIST_HEAD(&proc->delivered_death); + INIT_LIST_HEAD(&proc->waiting_threads); filp->private_data = proc; - binder_unlock(__func__); + mutex_lock(&binder_procs_lock); + hlist_add_head(&proc->proc_node, &binder_procs); + mutex_unlock(&binder_procs_lock); if (binder_debugfs_dir_entry_proc) { char strbuf[11]; snprintf(strbuf, sizeof(strbuf), "%u", proc->pid); + /* + * proc debug entries are shared between contexts, so + * this will fail if the process tries to open the driver + * again with a different context. The priting code will + * anyway print all contexts that a given PID has, so this + * is not a problem. + */ proc->debugfs_entry = debugfs_create_file(strbuf, S_IRUGO, - binder_debugfs_dir_entry_proc, proc, &binder_proc_fops); + binder_debugfs_dir_entry_proc, + (void *)(unsigned long)proc->pid, + &binder_proc_fops); } return 0; @@ -3006,16 +4878,17 @@ static void binder_deferred_flush(struct binder_proc *proc) struct rb_node *n; int wake_count = 0; + binder_inner_proc_lock(proc); for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) { struct binder_thread *thread = rb_entry(n, struct binder_thread, rb_node); - thread->looper |= BINDER_LOOPER_STATE_NEED_RETURN; + thread->looper_need_return = true; if (thread->looper & BINDER_LOOPER_STATE_WAITING) { wake_up_interruptible(&thread->wait); wake_count++; } } - wake_up_interruptible_all(&proc->wait); + binder_inner_proc_unlock(proc); binder_debug(BINDER_DEBUG_OPEN_CLOSE, "binder_flush: %d woke %d threads\n", proc->pid, @@ -3036,13 +4909,21 @@ static int binder_node_release(struct binder_node *node, int refs) { struct binder_ref *ref; int death = 0; - - list_del_init(&node->work.entry); - binder_release_work(&node->async_todo); - - if (hlist_empty(&node->refs)) { - kfree(node); - binder_stats_deleted(BINDER_STAT_NODE); + struct binder_proc *proc = node->proc; + + binder_release_work(proc, &node->async_todo); + + binder_node_lock(node); + binder_inner_proc_lock(proc); + binder_dequeue_work_ilocked(&node->work); + /* + * The caller must have taken a temporary ref on the node, + */ + BUG_ON(!node->tmp_refs); + if (hlist_empty(&node->refs) && node->tmp_refs == 1) { + binder_inner_proc_unlock(proc); + binder_node_unlock(node); + binder_free_node(node); return refs; } @@ -3050,59 +4931,84 @@ static int binder_node_release(struct binder_node *node, int refs) node->proc = NULL; node->local_strong_refs = 0; node->local_weak_refs = 0; + binder_inner_proc_unlock(proc); + + spin_lock(&binder_dead_nodes_lock); hlist_add_head(&node->dead_node, &binder_dead_nodes); + spin_unlock(&binder_dead_nodes_lock); hlist_for_each_entry(ref, &node->refs, node_entry) { refs++; - - if (!ref->death) + /* + * Need the node lock to synchronize + * with new notification requests and the + * inner lock to synchronize with queued + * death notifications. + */ + binder_inner_proc_lock(ref->proc); + if (!ref->death) { + binder_inner_proc_unlock(ref->proc); continue; + } death++; - if (list_empty(&ref->death->work.entry)) { - ref->death->work.type = BINDER_WORK_DEAD_BINDER; - list_add_tail(&ref->death->work.entry, - &ref->proc->todo); - wake_up_interruptible(&ref->proc->wait); - } else - BUG(); + BUG_ON(!list_empty(&ref->death->work.entry)); + ref->death->work.type = BINDER_WORK_DEAD_BINDER; + binder_enqueue_work_ilocked(&ref->death->work, + &ref->proc->todo); + binder_wakeup_proc_ilocked(ref->proc); + binder_inner_proc_unlock(ref->proc); } binder_debug(BINDER_DEBUG_DEAD_BINDER, "node %d now dead, refs %d, death %d\n", node->debug_id, refs, death); + binder_node_unlock(node); + binder_put_node(node); return refs; } static void binder_deferred_release(struct binder_proc *proc) { - struct binder_transaction *t; + struct binder_context *context = proc->context; struct rb_node *n; - int threads, nodes, incoming_refs, outgoing_refs, buffers, - active_transactions, page_count; + int threads, nodes, incoming_refs, outgoing_refs, active_transactions; - BUG_ON(proc->vma); BUG_ON(proc->files); + mutex_lock(&binder_procs_lock); hlist_del(&proc->proc_node); + mutex_unlock(&binder_procs_lock); - if (binder_context_mgr_node && binder_context_mgr_node->proc == proc) { + mutex_lock(&context->context_mgr_node_lock); + if (context->binder_context_mgr_node && + context->binder_context_mgr_node->proc == proc) { binder_debug(BINDER_DEBUG_DEAD_BINDER, "%s: %d context_mgr_node gone\n", __func__, proc->pid); - binder_context_mgr_node = NULL; + context->binder_context_mgr_node = NULL; } - + mutex_unlock(&context->context_mgr_node_lock); + binder_inner_proc_lock(proc); + /* + * Make sure proc stays alive after we + * remove all the threads + */ + proc->tmp_ref++; + + proc->is_dead = true; threads = 0; active_transactions = 0; while ((n = rb_first(&proc->threads))) { struct binder_thread *thread; thread = rb_entry(n, struct binder_thread, rb_node); + binder_inner_proc_unlock(proc); threads++; - active_transactions += binder_free_thread(proc, thread); + active_transactions += binder_thread_release(proc, thread); + binder_inner_proc_lock(proc); } nodes = 0; @@ -3112,73 +5018,42 @@ static void binder_deferred_release(struct binder_proc *proc) node = rb_entry(n, struct binder_node, rb_node); nodes++; + /* + * take a temporary ref on the node before + * calling binder_node_release() which will either + * kfree() the node or call binder_put_node() + */ + binder_inc_node_tmpref_ilocked(node); rb_erase(&node->rb_node, &proc->nodes); + binder_inner_proc_unlock(proc); incoming_refs = binder_node_release(node, incoming_refs); + binder_inner_proc_lock(proc); } + binder_inner_proc_unlock(proc); outgoing_refs = 0; + binder_proc_lock(proc); while ((n = rb_first(&proc->refs_by_desc))) { struct binder_ref *ref; ref = rb_entry(n, struct binder_ref, rb_node_desc); outgoing_refs++; - binder_delete_ref(ref); - } - - binder_release_work(&proc->todo); - binder_release_work(&proc->delivered_death); - - buffers = 0; - while ((n = rb_first(&proc->allocated_buffers))) { - struct binder_buffer *buffer; - - buffer = rb_entry(n, struct binder_buffer, rb_node); - - t = buffer->transaction; - if (t) { - t->buffer = NULL; - buffer->transaction = NULL; - pr_err("release proc %d, transaction %d, not freed\n", - proc->pid, t->debug_id); - /*BUG();*/ - } - - binder_free_buf(proc, buffer); - buffers++; - } - - binder_stats_deleted(BINDER_STAT_PROC); - - page_count = 0; - if (proc->pages) { - int i; - - for (i = 0; i < proc->buffer_size / PAGE_SIZE; i++) { - void *page_addr; - - if (!proc->pages[i]) - continue; - - page_addr = proc->buffer + i * PAGE_SIZE; - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%s: %d: page %d at %pK not freed\n", - __func__, proc->pid, i, page_addr); - unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE); - __free_page(proc->pages[i]); - page_count++; - } - kfree(proc->pages); - vfree(proc->buffer); + binder_cleanup_ref_olocked(ref); + binder_proc_unlock(proc); + binder_free_ref(ref); + binder_proc_lock(proc); } + binder_proc_unlock(proc); - put_task_struct(proc->tsk); + binder_release_work(proc, &proc->todo); + binder_release_work(proc, &proc->delivered_death); binder_debug(BINDER_DEBUG_OPEN_CLOSE, - "%s: %d threads %d, nodes %d (ref %d), refs %d, active transactions %d, buffers %d, pages %d\n", + "%s: %d threads %d, nodes %d (ref %d), refs %d, active transactions %d\n", __func__, proc->pid, threads, nodes, incoming_refs, - outgoing_refs, active_transactions, buffers, page_count); + outgoing_refs, active_transactions); - kfree(proc); + binder_proc_dec_tmpref(proc); } static void binder_deferred_func(struct work_struct *work) @@ -3189,7 +5064,6 @@ static void binder_deferred_func(struct work_struct *work) int defer; do { - binder_lock(__func__); mutex_lock(&binder_deferred_lock); if (!hlist_empty(&binder_deferred_list)) { proc = hlist_entry(binder_deferred_list.first, @@ -3216,7 +5090,6 @@ static void binder_deferred_func(struct work_struct *work) if (defer & BINDER_DEFERRED_RELEASE) binder_deferred_release(proc); /* frees proc */ - binder_unlock(__func__); if (files) put_files_struct(files); } while (proc); @@ -3236,41 +5109,52 @@ binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer) mutex_unlock(&binder_deferred_lock); } -static void print_binder_transaction(struct seq_file *m, const char *prefix, - struct binder_transaction *t) +static void print_binder_transaction_ilocked(struct seq_file *m, + struct binder_proc *proc, + const char *prefix, + struct binder_transaction *t) { + struct binder_proc *to_proc; + struct binder_buffer *buffer = t->buffer; + + spin_lock(&t->lock); + to_proc = t->to_proc; seq_printf(m, - "%s %d: %pK from %d:%d to %d:%d code %x flags %x pri %ld r%d", + "%s %d: %p from %d:%d to %d:%d code %x flags %x pri %d:%d r%d", prefix, t->debug_id, t, t->from ? t->from->proc->pid : 0, t->from ? t->from->pid : 0, - t->to_proc ? t->to_proc->pid : 0, + to_proc ? to_proc->pid : 0, t->to_thread ? t->to_thread->pid : 0, - t->code, t->flags, t->priority, t->need_reply); - if (t->buffer == NULL) { - seq_puts(m, " buffer free\n"); + t->code, t->flags, t->priority.sched_policy, + t->priority.prio, t->need_reply); + spin_unlock(&t->lock); + + if (proc != to_proc) { + /* + * Can only safely deref buffer if we are holding the + * correct proc inner lock for this node + */ + seq_puts(m, "\n"); return; } - if (t->buffer->target_node) - seq_printf(m, " node %d", - t->buffer->target_node->debug_id); - seq_printf(m, " size %zd:%zd data %pK\n", - t->buffer->data_size, t->buffer->offsets_size, - t->buffer->data); -} -static void print_binder_buffer(struct seq_file *m, const char *prefix, - struct binder_buffer *buffer) -{ - seq_printf(m, "%s %d: %pK size %zd:%zd %s\n", - prefix, buffer->debug_id, buffer->data, + if (buffer == NULL) { + seq_puts(m, " buffer free\n"); + return; + } + if (buffer->target_node) + seq_printf(m, " node %d", buffer->target_node->debug_id); + seq_printf(m, " size %zd:%zd data %p\n", buffer->data_size, buffer->offsets_size, - buffer->transaction ? "active" : "delivered"); + buffer->data); } -static void print_binder_work(struct seq_file *m, const char *prefix, - const char *transaction_prefix, - struct binder_work *w) +static void print_binder_work_ilocked(struct seq_file *m, + struct binder_proc *proc, + const char *prefix, + const char *transaction_prefix, + struct binder_work *w) { struct binder_node *node; struct binder_transaction *t; @@ -3278,8 +5162,16 @@ static void print_binder_work(struct seq_file *m, const char *prefix, switch (w->type) { case BINDER_WORK_TRANSACTION: t = container_of(w, struct binder_transaction, work); - print_binder_transaction(m, transaction_prefix, t); + print_binder_transaction_ilocked( + m, proc, transaction_prefix, t); break; + case BINDER_WORK_RETURN_ERROR: { + struct binder_error *e = container_of( + w, struct binder_error, work); + + seq_printf(m, "%stransaction error: %u\n", + prefix, e->cmd); + } break; case BINDER_WORK_TRANSACTION_COMPLETE: seq_printf(m, "%stransaction complete\n", prefix); break; @@ -3304,40 +5196,46 @@ static void print_binder_work(struct seq_file *m, const char *prefix, } } -static void print_binder_thread(struct seq_file *m, - struct binder_thread *thread, - int print_always) +static void print_binder_thread_ilocked(struct seq_file *m, + struct binder_thread *thread, + int print_always) { struct binder_transaction *t; struct binder_work *w; size_t start_pos = m->count; size_t header_pos; - seq_printf(m, " thread %d: l %02x\n", thread->pid, thread->looper); + seq_printf(m, " thread %d: l %02x need_return %d tr %d\n", + thread->pid, thread->looper, + thread->looper_need_return, + atomic_read(&thread->tmp_ref)); header_pos = m->count; t = thread->transaction_stack; while (t) { if (t->from == thread) { - print_binder_transaction(m, - " outgoing transaction", t); + print_binder_transaction_ilocked(m, thread->proc, + " outgoing transaction", t); t = t->from_parent; } else if (t->to_thread == thread) { - print_binder_transaction(m, + print_binder_transaction_ilocked(m, thread->proc, " incoming transaction", t); t = t->to_parent; } else { - print_binder_transaction(m, " bad transaction", t); + print_binder_transaction_ilocked(m, thread->proc, + " bad transaction", t); t = NULL; } } list_for_each_entry(w, &thread->todo, entry) { - print_binder_work(m, " ", " pending transaction", w); + print_binder_work_ilocked(m, thread->proc, " ", + " pending transaction", w); } if (!print_always && m->count == header_pos) m->count = start_pos; } -static void print_binder_node(struct seq_file *m, struct binder_node *node) +static void print_binder_node_nilocked(struct seq_file *m, + struct binder_node *node) { struct binder_ref *ref; struct binder_work *w; @@ -3347,27 +5245,35 @@ static void print_binder_node(struct seq_file *m, struct binder_node *node) hlist_for_each_entry(ref, &node->refs, node_entry) count++; - seq_printf(m, " node %d: u%016llx c%016llx hs %d hw %d ls %d lw %d is %d iw %d", + seq_printf(m, " node %d: u%016llx c%016llx pri %d:%d hs %d hw %d ls %d lw %d is %d iw %d tr %d", node->debug_id, (u64)node->ptr, (u64)node->cookie, + node->sched_policy, node->min_priority, node->has_strong_ref, node->has_weak_ref, node->local_strong_refs, node->local_weak_refs, - node->internal_strong_refs, count); + node->internal_strong_refs, count, node->tmp_refs); if (count) { seq_puts(m, " proc"); hlist_for_each_entry(ref, &node->refs, node_entry) seq_printf(m, " %d", ref->proc->pid); } seq_puts(m, "\n"); - list_for_each_entry(w, &node->async_todo, entry) - print_binder_work(m, " ", - " pending async transaction", w); + if (node->proc) { + list_for_each_entry(w, &node->async_todo, entry) + print_binder_work_ilocked(m, node->proc, " ", + " pending async transaction", w); + } } -static void print_binder_ref(struct seq_file *m, struct binder_ref *ref) +static void print_binder_ref_olocked(struct seq_file *m, + struct binder_ref *ref) { + binder_node_lock(ref->node); seq_printf(m, " ref %d: desc %d %snode %d s %d w %d d %pK\n", - ref->debug_id, ref->desc, ref->node->proc ? "" : "dead ", - ref->node->debug_id, ref->strong, ref->weak, ref->death); + ref->data.debug_id, ref->data.desc, + ref->node->proc ? "" : "dead ", + ref->node->debug_id, ref->data.strong, + ref->data.weak, ref->death); + binder_node_unlock(ref->node); } static void print_binder_proc(struct seq_file *m, @@ -3377,35 +5283,60 @@ static void print_binder_proc(struct seq_file *m, struct rb_node *n; size_t start_pos = m->count; size_t header_pos; + struct binder_node *last_node = NULL; seq_printf(m, "proc %d\n", proc->pid); + seq_printf(m, "context %s\n", proc->context->name); header_pos = m->count; + binder_inner_proc_lock(proc); for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) - print_binder_thread(m, rb_entry(n, struct binder_thread, + print_binder_thread_ilocked(m, rb_entry(n, struct binder_thread, rb_node), print_all); + for (n = rb_first(&proc->nodes); n != NULL; n = rb_next(n)) { struct binder_node *node = rb_entry(n, struct binder_node, rb_node); - if (print_all || node->has_async_transaction) - print_binder_node(m, node); + /* + * take a temporary reference on the node so it + * survives and isn't removed from the tree + * while we print it. + */ + binder_inc_node_tmpref_ilocked(node); + /* Need to drop inner lock to take node lock */ + binder_inner_proc_unlock(proc); + if (last_node) + binder_put_node(last_node); + binder_node_inner_lock(node); + print_binder_node_nilocked(m, node); + binder_node_inner_unlock(node); + last_node = node; + binder_inner_proc_lock(proc); } + binder_inner_proc_unlock(proc); + if (last_node) + binder_put_node(last_node); + if (print_all) { + binder_proc_lock(proc); for (n = rb_first(&proc->refs_by_desc); n != NULL; n = rb_next(n)) - print_binder_ref(m, rb_entry(n, struct binder_ref, - rb_node_desc)); + print_binder_ref_olocked(m, rb_entry(n, + struct binder_ref, + rb_node_desc)); + binder_proc_unlock(proc); } - for (n = rb_first(&proc->allocated_buffers); n != NULL; n = rb_next(n)) - print_binder_buffer(m, " buffer", - rb_entry(n, struct binder_buffer, rb_node)); + binder_alloc_print_allocated(m, &proc->alloc); + binder_inner_proc_lock(proc); list_for_each_entry(w, &proc->todo, entry) - print_binder_work(m, " ", " pending transaction", w); + print_binder_work_ilocked(m, proc, " ", + " pending transaction", w); list_for_each_entry(w, &proc->delivered_death, entry) { seq_puts(m, " has delivered dead binder\n"); break; } + binder_inner_proc_unlock(proc); if (!print_all && m->count == header_pos) m->count = start_pos; } @@ -3448,7 +5379,9 @@ static const char * const binder_command_strings[] = { "BC_EXIT_LOOPER", "BC_REQUEST_DEATH_NOTIFICATION", "BC_CLEAR_DEATH_NOTIFICATION", - "BC_DEAD_BINDER_DONE" + "BC_DEAD_BINDER_DONE", + "BC_TRANSACTION_SG", + "BC_REPLY_SG", }; static const char * const binder_objstat_strings[] = { @@ -3469,17 +5402,21 @@ static void print_binder_stats(struct seq_file *m, const char *prefix, BUILD_BUG_ON(ARRAY_SIZE(stats->bc) != ARRAY_SIZE(binder_command_strings)); for (i = 0; i < ARRAY_SIZE(stats->bc); i++) { - if (stats->bc[i]) + int temp = atomic_read(&stats->bc[i]); + + if (temp) seq_printf(m, "%s%s: %d\n", prefix, - binder_command_strings[i], stats->bc[i]); + binder_command_strings[i], temp); } BUILD_BUG_ON(ARRAY_SIZE(stats->br) != ARRAY_SIZE(binder_return_strings)); for (i = 0; i < ARRAY_SIZE(stats->br); i++) { - if (stats->br[i]) + int temp = atomic_read(&stats->br[i]); + + if (temp) seq_printf(m, "%s%s: %d\n", prefix, - binder_return_strings[i], stats->br[i]); + binder_return_strings[i], temp); } BUILD_BUG_ON(ARRAY_SIZE(stats->obj_created) != @@ -3487,11 +5424,15 @@ static void print_binder_stats(struct seq_file *m, const char *prefix, BUILD_BUG_ON(ARRAY_SIZE(stats->obj_created) != ARRAY_SIZE(stats->obj_deleted)); for (i = 0; i < ARRAY_SIZE(stats->obj_created); i++) { - if (stats->obj_created[i] || stats->obj_deleted[i]) - seq_printf(m, "%s%s: active %d total %d\n", prefix, + int created = atomic_read(&stats->obj_created[i]); + int deleted = atomic_read(&stats->obj_deleted[i]); + + if (created || deleted) + seq_printf(m, "%s%s: active %d total %d\n", + prefix, binder_objstat_strings[i], - stats->obj_created[i] - stats->obj_deleted[i], - stats->obj_created[i]); + created - deleted, + created); } } @@ -3499,50 +5440,61 @@ static void print_binder_proc_stats(struct seq_file *m, struct binder_proc *proc) { struct binder_work *w; + struct binder_thread *thread; struct rb_node *n; - int count, strong, weak; + int count, strong, weak, ready_threads; + size_t free_async_space = + binder_alloc_get_free_async_space(&proc->alloc); seq_printf(m, "proc %d\n", proc->pid); + seq_printf(m, "context %s\n", proc->context->name); count = 0; + ready_threads = 0; + binder_inner_proc_lock(proc); for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) count++; + + list_for_each_entry(thread, &proc->waiting_threads, waiting_thread_node) + ready_threads++; + seq_printf(m, " threads: %d\n", count); seq_printf(m, " requested threads: %d+%d/%d\n" " ready threads %d\n" " free async space %zd\n", proc->requested_threads, proc->requested_threads_started, proc->max_threads, - proc->ready_threads, proc->free_async_space); + ready_threads, + free_async_space); count = 0; for (n = rb_first(&proc->nodes); n != NULL; n = rb_next(n)) count++; + binder_inner_proc_unlock(proc); seq_printf(m, " nodes: %d\n", count); count = 0; strong = 0; weak = 0; + binder_proc_lock(proc); for (n = rb_first(&proc->refs_by_desc); n != NULL; n = rb_next(n)) { struct binder_ref *ref = rb_entry(n, struct binder_ref, rb_node_desc); count++; - strong += ref->strong; - weak += ref->weak; + strong += ref->data.strong; + weak += ref->data.weak; } + binder_proc_unlock(proc); seq_printf(m, " refs: %d s %d w %d\n", count, strong, weak); - count = 0; - for (n = rb_first(&proc->allocated_buffers); n != NULL; n = rb_next(n)) - count++; + count = binder_alloc_get_allocated_count(&proc->alloc); seq_printf(m, " buffers: %d\n", count); + binder_alloc_print_pages(m, &proc->alloc); + count = 0; + binder_inner_proc_lock(proc); list_for_each_entry(w, &proc->todo, entry) { - switch (w->type) { - case BINDER_WORK_TRANSACTION: + if (w->type == BINDER_WORK_TRANSACTION) count++; - break; - default: - break; - } } + binder_inner_proc_unlock(proc); seq_printf(m, " pending transactions: %d\n", count); print_binder_stats(m, " ", &proc->stats); @@ -3553,107 +5505,131 @@ static int binder_state_show(struct seq_file *m, void *unused) { struct binder_proc *proc; struct binder_node *node; - int do_lock = !binder_debug_no_lock; - - if (do_lock) - binder_lock(__func__); + struct binder_node *last_node = NULL; seq_puts(m, "binder state:\n"); + spin_lock(&binder_dead_nodes_lock); if (!hlist_empty(&binder_dead_nodes)) seq_puts(m, "dead nodes:\n"); - hlist_for_each_entry(node, &binder_dead_nodes, dead_node) - print_binder_node(m, node); + hlist_for_each_entry(node, &binder_dead_nodes, dead_node) { + /* + * take a temporary reference on the node so it + * survives and isn't removed from the list + * while we print it. + */ + node->tmp_refs++; + spin_unlock(&binder_dead_nodes_lock); + if (last_node) + binder_put_node(last_node); + binder_node_lock(node); + print_binder_node_nilocked(m, node); + binder_node_unlock(node); + last_node = node; + spin_lock(&binder_dead_nodes_lock); + } + spin_unlock(&binder_dead_nodes_lock); + if (last_node) + binder_put_node(last_node); + mutex_lock(&binder_procs_lock); hlist_for_each_entry(proc, &binder_procs, proc_node) print_binder_proc(m, proc, 1); - if (do_lock) - binder_unlock(__func__); + mutex_unlock(&binder_procs_lock); + return 0; } static int binder_stats_show(struct seq_file *m, void *unused) { struct binder_proc *proc; - int do_lock = !binder_debug_no_lock; - - if (do_lock) - binder_lock(__func__); seq_puts(m, "binder stats:\n"); print_binder_stats(m, "", &binder_stats); + mutex_lock(&binder_procs_lock); hlist_for_each_entry(proc, &binder_procs, proc_node) print_binder_proc_stats(m, proc); - if (do_lock) - binder_unlock(__func__); + mutex_unlock(&binder_procs_lock); + return 0; } static int binder_transactions_show(struct seq_file *m, void *unused) { struct binder_proc *proc; - int do_lock = !binder_debug_no_lock; - - if (do_lock) - binder_lock(__func__); seq_puts(m, "binder transactions:\n"); + mutex_lock(&binder_procs_lock); hlist_for_each_entry(proc, &binder_procs, proc_node) print_binder_proc(m, proc, 0); - if (do_lock) - binder_unlock(__func__); + mutex_unlock(&binder_procs_lock); + return 0; } static int binder_proc_show(struct seq_file *m, void *unused) { struct binder_proc *itr; - struct binder_proc *proc = m->private; - int do_lock = !binder_debug_no_lock; - bool valid_proc = false; - - if (do_lock) - binder_lock(__func__); + int pid = (unsigned long)m->private; + mutex_lock(&binder_procs_lock); hlist_for_each_entry(itr, &binder_procs, proc_node) { - if (itr == proc) { - valid_proc = true; - break; + if (itr->pid == pid) { + seq_puts(m, "binder proc state:\n"); + print_binder_proc(m, itr, 1); } } - if (valid_proc) { - seq_puts(m, "binder proc state:\n"); - print_binder_proc(m, proc, 1); - } - if (do_lock) - binder_unlock(__func__); + mutex_unlock(&binder_procs_lock); + return 0; } static void print_binder_transaction_log_entry(struct seq_file *m, struct binder_transaction_log_entry *e) { + int debug_id = READ_ONCE(e->debug_id_done); + /* + * read barrier to guarantee debug_id_done read before + * we print the log values + */ + smp_rmb(); seq_printf(m, - "%d: %s from %d:%d to %d:%d node %d handle %d size %d:%d\n", + "%d: %s from %d:%d to %d:%d context %s node %d handle %d size %d:%d ret %d/%d l=%d", e->debug_id, (e->call_type == 2) ? "reply" : ((e->call_type == 1) ? "async" : "call "), e->from_proc, - e->from_thread, e->to_proc, e->to_thread, e->to_node, - e->target_handle, e->data_size, e->offsets_size); + e->from_thread, e->to_proc, e->to_thread, e->context_name, + e->to_node, e->target_handle, e->data_size, e->offsets_size, + e->return_error, e->return_error_param, + e->return_error_line); + /* + * read-barrier to guarantee read of debug_id_done after + * done printing the fields of the entry + */ + smp_rmb(); + seq_printf(m, debug_id && debug_id == READ_ONCE(e->debug_id_done) ? + "\n" : " (incomplete)\n"); } static int binder_transaction_log_show(struct seq_file *m, void *unused) { struct binder_transaction_log *log = m->private; + unsigned int log_cur = atomic_read(&log->cur); + unsigned int count; + unsigned int cur; int i; - if (log->full) { - for (i = log->next; i < ARRAY_SIZE(log->entry); i++) - print_binder_transaction_log_entry(m, &log->entry[i]); + count = log_cur + 1; + cur = count < ARRAY_SIZE(log->entry) && !log->full ? + 0 : count % ARRAY_SIZE(log->entry); + if (count > ARRAY_SIZE(log->entry) || log->full) + count = ARRAY_SIZE(log->entry); + for (i = 0; i < count; i++) { + unsigned int index = cur++ % ARRAY_SIZE(log->entry); + + print_binder_transaction_log_entry(m, &log->entry[index]); } - for (i = 0; i < log->next; i++) - print_binder_transaction_log_entry(m, &log->entry[i]); return 0; } @@ -3668,21 +5644,50 @@ static const struct file_operations binder_fops = { .release = binder_release, }; -static struct miscdevice binder_miscdev = { - .minor = MISC_DYNAMIC_MINOR, - .name = "binder", - .fops = &binder_fops -}; - BINDER_DEBUG_ENTRY(state); BINDER_DEBUG_ENTRY(stats); BINDER_DEBUG_ENTRY(transactions); BINDER_DEBUG_ENTRY(transaction_log); +static int __init init_binder_device(const char *name) +{ + int ret; + struct binder_device *binder_device; + + binder_device = kzalloc(sizeof(*binder_device), GFP_KERNEL); + if (!binder_device) + return -ENOMEM; + + binder_device->miscdev.fops = &binder_fops; + binder_device->miscdev.minor = MISC_DYNAMIC_MINOR; + binder_device->miscdev.name = name; + + binder_device->context.binder_context_mgr_uid = INVALID_UID; + binder_device->context.name = name; + mutex_init(&binder_device->context.context_mgr_node_lock); + + ret = misc_register(&binder_device->miscdev); + if (ret < 0) { + kfree(binder_device); + return ret; + } + + hlist_add_head(&binder_device->hlist, &binder_devices); + + return ret; +} + static int __init binder_init(void) { int ret; + char *device_name, *device_names; + struct binder_device *device; + struct hlist_node *tmp; + binder_alloc_shrinker_init(); + + atomic_set(&binder_transaction_log.cur, ~0U); + atomic_set(&binder_transaction_log_failed.cur, ~0U); binder_deferred_workqueue = create_singlethread_workqueue("binder"); if (!binder_deferred_workqueue) return -ENOMEM; @@ -3691,7 +5696,7 @@ static int __init binder_init(void) if (binder_debugfs_dir_entry_root) binder_debugfs_dir_entry_proc = debugfs_create_dir("proc", binder_debugfs_dir_entry_root); - ret = misc_register(&binder_miscdev); + if (binder_debugfs_dir_entry_root) { debugfs_create_file("state", S_IRUGO, @@ -3719,6 +5724,37 @@ static int __init binder_init(void) &binder_transaction_log_failed, &binder_transaction_log_fops); } + + /* + * Copy the module_parameter string, because we don't want to + * tokenize it in-place. + */ + device_names = kzalloc(strlen(binder_devices_param) + 1, GFP_KERNEL); + if (!device_names) { + ret = -ENOMEM; + goto err_alloc_device_names_failed; + } + strcpy(device_names, binder_devices_param); + + while ((device_name = strsep(&device_names, ","))) { + ret = init_binder_device(device_name); + if (ret) + goto err_init_binder_device_failed; + } + + return ret; + +err_init_binder_device_failed: + hlist_for_each_entry_safe(device, tmp, &binder_devices, hlist) { + misc_deregister(&device->miscdev); + hlist_del(&device->hlist); + kfree(device); + } +err_alloc_device_names_failed: + debugfs_remove_recursive(binder_debugfs_dir_entry_root); + + destroy_workqueue(binder_deferred_workqueue); + return ret; } diff --git a/drivers/staging/android/binder_alloc.c b/drivers/staging/android/binder_alloc.c new file mode 100644 index 0000000000000..6f66ef97626a3 --- /dev/null +++ b/drivers/staging/android/binder_alloc.c @@ -0,0 +1,1012 @@ +/* binder_alloc.c + * + * Android IPC Subsystem + * + * Copyright (C) 2007-2017 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "binder_alloc.h" +#include "binder_trace.h" + +struct list_lru binder_alloc_lru; + +static DEFINE_MUTEX(binder_alloc_mmap_lock); + +enum { + BINDER_DEBUG_OPEN_CLOSE = 1U << 1, + BINDER_DEBUG_BUFFER_ALLOC = 1U << 2, + BINDER_DEBUG_BUFFER_ALLOC_ASYNC = 1U << 3, +}; +static uint32_t binder_alloc_debug_mask; + +module_param_named(debug_mask, binder_alloc_debug_mask, + uint, S_IWUSR | S_IRUGO); + +#define binder_alloc_debug(mask, x...) \ + do { \ + if (binder_alloc_debug_mask & mask) \ + pr_info(x); \ + } while (0) + +static struct binder_buffer *binder_buffer_next(struct binder_buffer *buffer) +{ + return list_entry(buffer->entry.next, struct binder_buffer, entry); +} + +static struct binder_buffer *binder_buffer_prev(struct binder_buffer *buffer) +{ + return list_entry(buffer->entry.prev, struct binder_buffer, entry); +} + +static size_t binder_alloc_buffer_size(struct binder_alloc *alloc, + struct binder_buffer *buffer) +{ + if (list_is_last(&buffer->entry, &alloc->buffers)) + return (u8 *)alloc->buffer + + alloc->buffer_size - (u8 *)buffer->data; + return (u8 *)binder_buffer_next(buffer)->data - (u8 *)buffer->data; +} + +static void binder_insert_free_buffer(struct binder_alloc *alloc, + struct binder_buffer *new_buffer) +{ + struct rb_node **p = &alloc->free_buffers.rb_node; + struct rb_node *parent = NULL; + struct binder_buffer *buffer; + size_t buffer_size; + size_t new_buffer_size; + + BUG_ON(!new_buffer->free); + + new_buffer_size = binder_alloc_buffer_size(alloc, new_buffer); + + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: add free buffer, size %zd, at %pK\n", + alloc->pid, new_buffer_size, new_buffer); + + while (*p) { + parent = *p; + buffer = rb_entry(parent, struct binder_buffer, rb_node); + BUG_ON(!buffer->free); + + buffer_size = binder_alloc_buffer_size(alloc, buffer); + + if (new_buffer_size < buffer_size) + p = &parent->rb_left; + else + p = &parent->rb_right; + } + rb_link_node(&new_buffer->rb_node, parent, p); + rb_insert_color(&new_buffer->rb_node, &alloc->free_buffers); +} + +static void binder_insert_allocated_buffer_locked( + struct binder_alloc *alloc, struct binder_buffer *new_buffer) +{ + struct rb_node **p = &alloc->allocated_buffers.rb_node; + struct rb_node *parent = NULL; + struct binder_buffer *buffer; + + BUG_ON(new_buffer->free); + + while (*p) { + parent = *p; + buffer = rb_entry(parent, struct binder_buffer, rb_node); + BUG_ON(buffer->free); + + if (new_buffer->data < buffer->data) + p = &parent->rb_left; + else if (new_buffer->data > buffer->data) + p = &parent->rb_right; + else + BUG(); + } + rb_link_node(&new_buffer->rb_node, parent, p); + rb_insert_color(&new_buffer->rb_node, &alloc->allocated_buffers); +} + +static struct binder_buffer *binder_alloc_prepare_to_free_locked( + struct binder_alloc *alloc, + uintptr_t user_ptr) +{ + struct rb_node *n = alloc->allocated_buffers.rb_node; + struct binder_buffer *buffer; + void *kern_ptr; + + kern_ptr = (void *)(user_ptr - alloc->user_buffer_offset); + + while (n) { + buffer = rb_entry(n, struct binder_buffer, rb_node); + BUG_ON(buffer->free); + + if (kern_ptr < buffer->data) + n = n->rb_left; + else if (kern_ptr > buffer->data) + n = n->rb_right; + else { + /* + * Guard against user threads attempting to + * free the buffer twice + */ + if (buffer->free_in_progress) { + pr_err("%d:%d FREE_BUFFER u%016llx user freed buffer twice\n", + alloc->pid, current->pid, (u64)user_ptr); + return NULL; + } + buffer->free_in_progress = 1; + return buffer; + } + } + return NULL; +} + +/** + * binder_alloc_buffer_lookup() - get buffer given user ptr + * @alloc: binder_alloc for this proc + * @user_ptr: User pointer to buffer data + * + * Validate userspace pointer to buffer data and return buffer corresponding to + * that user pointer. Search the rb tree for buffer that matches user data + * pointer. + * + * Return: Pointer to buffer or NULL + */ +struct binder_buffer *binder_alloc_prepare_to_free(struct binder_alloc *alloc, + uintptr_t user_ptr) +{ + struct binder_buffer *buffer; + + mutex_lock(&alloc->mutex); + buffer = binder_alloc_prepare_to_free_locked(alloc, user_ptr); + mutex_unlock(&alloc->mutex); + return buffer; +} + +static int binder_update_page_range(struct binder_alloc *alloc, int allocate, + void *start, void *end) +{ + void *page_addr; + unsigned long user_page_addr; + struct binder_lru_page *page; + struct vm_area_struct *vma = NULL; + struct mm_struct *mm = NULL; + bool need_mm = false; + + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: %s pages %pK-%pK\n", alloc->pid, + allocate ? "allocate" : "free", start, end); + + if (end <= start) + return 0; + + trace_binder_update_page_range(alloc, allocate, start, end); + + if (allocate == 0) + goto free_range; + + for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) { + page = &alloc->pages[(page_addr - alloc->buffer) / PAGE_SIZE]; + if (!page->page_ptr) { + need_mm = true; + break; + } + } + + /* Same as mmget_not_zero() in later kernel versions */ + if (need_mm && atomic_inc_not_zero(&alloc->vma_vm_mm->mm_users)) + mm = alloc->vma_vm_mm; + + if (mm) { + down_write(&mm->mmap_sem); + vma = alloc->vma; + } + + if (!vma && need_mm) { + pr_err("%d: binder_alloc_buf failed to map pages in userspace, no vma\n", + alloc->pid); + goto err_no_vma; + } + + for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) { + int ret; + bool on_lru; + size_t index; + + index = (page_addr - alloc->buffer) / PAGE_SIZE; + page = &alloc->pages[index]; + + if (page->page_ptr) { + trace_binder_alloc_lru_start(alloc, index); + + on_lru = list_lru_del(&binder_alloc_lru, &page->lru); + WARN_ON(!on_lru); + + trace_binder_alloc_lru_end(alloc, index); + continue; + } + + if (WARN_ON(!vma)) + goto err_page_ptr_cleared; + + trace_binder_alloc_page_start(alloc, index); + page->page_ptr = alloc_page(GFP_KERNEL | + __GFP_HIGHMEM | + __GFP_ZERO); + if (!page->page_ptr) { + pr_err("%d: binder_alloc_buf failed for page at %pK\n", + alloc->pid, page_addr); + goto err_alloc_page_failed; + } + page->alloc = alloc; + INIT_LIST_HEAD(&page->lru); + + ret = map_kernel_range_noflush((unsigned long)page_addr, + PAGE_SIZE, PAGE_KERNEL, + &page->page_ptr); + flush_cache_vmap((unsigned long)page_addr, + (unsigned long)page_addr + PAGE_SIZE); + if (ret != 1) { + pr_err("%d: binder_alloc_buf failed to map page at %pK in kernel\n", + alloc->pid, page_addr); + goto err_map_kernel_failed; + } + user_page_addr = + (uintptr_t)page_addr + alloc->user_buffer_offset; + ret = vm_insert_page(vma, user_page_addr, page[0].page_ptr); + if (ret) { + pr_err("%d: binder_alloc_buf failed to map page at %lx in userspace\n", + alloc->pid, user_page_addr); + goto err_vm_insert_page_failed; + } + + trace_binder_alloc_page_end(alloc, index); + /* vm_insert_page does not seem to increment the refcount */ + } + if (mm) { + up_write(&mm->mmap_sem); + mmput(mm); + } + return 0; + +free_range: + for (page_addr = end - PAGE_SIZE; page_addr >= start; + page_addr -= PAGE_SIZE) { + bool ret; + size_t index; + + index = (page_addr - alloc->buffer) / PAGE_SIZE; + page = &alloc->pages[index]; + + trace_binder_free_lru_start(alloc, index); + + ret = list_lru_add(&binder_alloc_lru, &page->lru); + WARN_ON(!ret); + + trace_binder_free_lru_end(alloc, index); + continue; + +err_vm_insert_page_failed: + unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE); +err_map_kernel_failed: + __free_page(page->page_ptr); + page->page_ptr = NULL; +err_alloc_page_failed: +err_page_ptr_cleared: + ; + } +err_no_vma: + if (mm) { + up_write(&mm->mmap_sem); + mmput(mm); + } + return vma ? -ENOMEM : -ESRCH; +} + +struct binder_buffer *binder_alloc_new_buf_locked(struct binder_alloc *alloc, + size_t data_size, + size_t offsets_size, + size_t extra_buffers_size, + int is_async) +{ + struct rb_node *n = alloc->free_buffers.rb_node; + struct binder_buffer *buffer; + size_t buffer_size; + struct rb_node *best_fit = NULL; + void *has_page_addr; + void *end_page_addr; + size_t size, data_offsets_size; + int ret; + + if (alloc->vma == NULL) { + pr_err("%d: binder_alloc_buf, no vma\n", + alloc->pid); + return ERR_PTR(-ESRCH); + } + + data_offsets_size = ALIGN(data_size, sizeof(void *)) + + ALIGN(offsets_size, sizeof(void *)); + + if (data_offsets_size < data_size || data_offsets_size < offsets_size) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: got transaction with invalid size %zd-%zd\n", + alloc->pid, data_size, offsets_size); + return ERR_PTR(-EINVAL); + } + size = data_offsets_size + ALIGN(extra_buffers_size, sizeof(void *)); + if (size < data_offsets_size || size < extra_buffers_size) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: got transaction with invalid extra_buffers_size %zd\n", + alloc->pid, extra_buffers_size); + return ERR_PTR(-EINVAL); + } + if (is_async && + alloc->free_async_space < size + sizeof(struct binder_buffer)) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_alloc_buf size %zd failed, no async space left\n", + alloc->pid, size); + return ERR_PTR(-ENOSPC); + } + + /* Pad 0-size buffers so they get assigned unique addresses */ + size = max(size, sizeof(void *)); + + while (n) { + buffer = rb_entry(n, struct binder_buffer, rb_node); + BUG_ON(!buffer->free); + buffer_size = binder_alloc_buffer_size(alloc, buffer); + + if (size < buffer_size) { + best_fit = n; + n = n->rb_left; + } else if (size > buffer_size) + n = n->rb_right; + else { + best_fit = n; + break; + } + } + if (best_fit == NULL) { + size_t allocated_buffers = 0; + size_t largest_alloc_size = 0; + size_t total_alloc_size = 0; + size_t free_buffers = 0; + size_t largest_free_size = 0; + size_t total_free_size = 0; + + for (n = rb_first(&alloc->allocated_buffers); n != NULL; + n = rb_next(n)) { + buffer = rb_entry(n, struct binder_buffer, rb_node); + buffer_size = binder_alloc_buffer_size(alloc, buffer); + allocated_buffers++; + total_alloc_size += buffer_size; + if (buffer_size > largest_alloc_size) + largest_alloc_size = buffer_size; + } + for (n = rb_first(&alloc->free_buffers); n != NULL; + n = rb_next(n)) { + buffer = rb_entry(n, struct binder_buffer, rb_node); + buffer_size = binder_alloc_buffer_size(alloc, buffer); + free_buffers++; + total_free_size += buffer_size; + if (buffer_size > largest_free_size) + largest_free_size = buffer_size; + } + pr_err("%d: binder_alloc_buf size %zd failed, no address space\n", + alloc->pid, size); + pr_err("allocated: %zd (num: %zd largest: %zd), free: %zd (num: %zd largest: %zd)\n", + total_alloc_size, allocated_buffers, largest_alloc_size, + total_free_size, free_buffers, largest_free_size); + return ERR_PTR(-ENOSPC); + } + if (n == NULL) { + buffer = rb_entry(best_fit, struct binder_buffer, rb_node); + buffer_size = binder_alloc_buffer_size(alloc, buffer); + } + + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_alloc_buf size %zd got buffer %pK size %zd\n", + alloc->pid, size, buffer, buffer_size); + + has_page_addr = + (void *)(((uintptr_t)buffer->data + buffer_size) & PAGE_MASK); + WARN_ON(n && buffer_size != size); + end_page_addr = + (void *)PAGE_ALIGN((uintptr_t)buffer->data + size); + if (end_page_addr > has_page_addr) + end_page_addr = has_page_addr; + ret = binder_update_page_range(alloc, 1, + (void *)PAGE_ALIGN((uintptr_t)buffer->data), end_page_addr); + if (ret) + return ERR_PTR(ret); + + if (buffer_size != size) { + struct binder_buffer *new_buffer; + + new_buffer = kzalloc(sizeof(*buffer), GFP_KERNEL); + if (!new_buffer) { + pr_err("%s: %d failed to alloc new buffer struct\n", + __func__, alloc->pid); + goto err_alloc_buf_struct_failed; + } + new_buffer->data = (u8 *)buffer->data + size; + list_add(&new_buffer->entry, &buffer->entry); + new_buffer->free = 1; + binder_insert_free_buffer(alloc, new_buffer); + } + + rb_erase(best_fit, &alloc->free_buffers); + buffer->free = 0; + buffer->free_in_progress = 0; + binder_insert_allocated_buffer_locked(alloc, buffer); + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_alloc_buf size %zd got %pK\n", + alloc->pid, size, buffer); + buffer->data_size = data_size; + buffer->offsets_size = offsets_size; + buffer->async_transaction = is_async; + buffer->extra_buffers_size = extra_buffers_size; + if (is_async) { + alloc->free_async_space -= size + sizeof(struct binder_buffer); + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, + "%d: binder_alloc_buf size %zd async free %zd\n", + alloc->pid, size, alloc->free_async_space); + } + return buffer; + +err_alloc_buf_struct_failed: + binder_update_page_range(alloc, 0, + (void *)PAGE_ALIGN((uintptr_t)buffer->data), + end_page_addr); + return ERR_PTR(-ENOMEM); +} + +/** + * binder_alloc_new_buf() - Allocate a new binder buffer + * @alloc: binder_alloc for this proc + * @data_size: size of user data buffer + * @offsets_size: user specified buffer offset + * @extra_buffers_size: size of extra space for meta-data (eg, security context) + * @is_async: buffer for async transaction + * + * Allocate a new buffer given the requested sizes. Returns + * the kernel version of the buffer pointer. The size allocated + * is the sum of the three given sizes (each rounded up to + * pointer-sized boundary) + * + * Return: The allocated buffer or %NULL if error + */ +struct binder_buffer *binder_alloc_new_buf(struct binder_alloc *alloc, + size_t data_size, + size_t offsets_size, + size_t extra_buffers_size, + int is_async) +{ + struct binder_buffer *buffer; + + mutex_lock(&alloc->mutex); + buffer = binder_alloc_new_buf_locked(alloc, data_size, offsets_size, + extra_buffers_size, is_async); + mutex_unlock(&alloc->mutex); + return buffer; +} + +static void *buffer_start_page(struct binder_buffer *buffer) +{ + return (void *)((uintptr_t)buffer->data & PAGE_MASK); +} + +static void *prev_buffer_end_page(struct binder_buffer *buffer) +{ + return (void *)(((uintptr_t)(buffer->data) - 1) & PAGE_MASK); +} + +static void binder_delete_free_buffer(struct binder_alloc *alloc, + struct binder_buffer *buffer) +{ + struct binder_buffer *prev, *next = NULL; + bool to_free = true; + BUG_ON(alloc->buffers.next == &buffer->entry); + prev = binder_buffer_prev(buffer); + BUG_ON(!prev->free); + if (prev_buffer_end_page(prev) == buffer_start_page(buffer)) { + to_free = false; + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: merge free, buffer %pK share page with %pK\n", + alloc->pid, buffer->data, prev->data); + } + + if (!list_is_last(&buffer->entry, &alloc->buffers)) { + next = binder_buffer_next(buffer); + if (buffer_start_page(next) == buffer_start_page(buffer)) { + to_free = false; + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: merge free, buffer %pK share page with %pK\n", + alloc->pid, + buffer->data, + next->data); + } + } + + if (PAGE_ALIGNED(buffer->data)) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: merge free, buffer start %pK is page aligned\n", + alloc->pid, buffer->data); + to_free = false; + } + + if (to_free) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: merge free, buffer %pK do not share page with %pK or %pK\n", + alloc->pid, buffer->data, + prev->data, next ? next->data : NULL); + binder_update_page_range(alloc, 0, buffer_start_page(buffer), + buffer_start_page(buffer) + PAGE_SIZE); + } + list_del(&buffer->entry); + kfree(buffer); +} + +static void binder_free_buf_locked(struct binder_alloc *alloc, + struct binder_buffer *buffer) +{ + size_t size, buffer_size; + + buffer_size = binder_alloc_buffer_size(alloc, buffer); + + size = ALIGN(buffer->data_size, sizeof(void *)) + + ALIGN(buffer->offsets_size, sizeof(void *)) + + ALIGN(buffer->extra_buffers_size, sizeof(void *)); + + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_free_buf %pK size %zd buffer_size %zd\n", + alloc->pid, buffer, size, buffer_size); + + BUG_ON(buffer->free); + BUG_ON(size > buffer_size); + BUG_ON(buffer->transaction != NULL); + BUG_ON(buffer->data < alloc->buffer); + BUG_ON(buffer->data > alloc->buffer + alloc->buffer_size); + + if (buffer->async_transaction) { + alloc->free_async_space += size + sizeof(struct binder_buffer); + + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, + "%d: binder_free_buf size %zd async free %zd\n", + alloc->pid, size, alloc->free_async_space); + } + + binder_update_page_range(alloc, 0, + (void *)PAGE_ALIGN((uintptr_t)buffer->data), + (void *)(((uintptr_t)buffer->data + buffer_size) & PAGE_MASK)); + + rb_erase(&buffer->rb_node, &alloc->allocated_buffers); + buffer->free = 1; + if (!list_is_last(&buffer->entry, &alloc->buffers)) { + struct binder_buffer *next = binder_buffer_next(buffer); + + if (next->free) { + rb_erase(&next->rb_node, &alloc->free_buffers); + binder_delete_free_buffer(alloc, next); + } + } + if (alloc->buffers.next != &buffer->entry) { + struct binder_buffer *prev = binder_buffer_prev(buffer); + + if (prev->free) { + binder_delete_free_buffer(alloc, buffer); + rb_erase(&prev->rb_node, &alloc->free_buffers); + buffer = prev; + } + } + binder_insert_free_buffer(alloc, buffer); +} + +/** + * binder_alloc_free_buf() - free a binder buffer + * @alloc: binder_alloc for this proc + * @buffer: kernel pointer to buffer + * + * Free the buffer allocated via binder_alloc_new_buffer() + */ +void binder_alloc_free_buf(struct binder_alloc *alloc, + struct binder_buffer *buffer) +{ + mutex_lock(&alloc->mutex); + binder_free_buf_locked(alloc, buffer); + mutex_unlock(&alloc->mutex); +} + +/** + * binder_alloc_mmap_handler() - map virtual address space for proc + * @alloc: alloc structure for this proc + * @vma: vma passed to mmap() + * + * Called by binder_mmap() to initialize the space specified in + * vma for allocating binder buffers + * + * Return: + * 0 = success + * -EBUSY = address space already mapped + * -ENOMEM = failed to map memory to given address space + */ +int binder_alloc_mmap_handler(struct binder_alloc *alloc, + struct vm_area_struct *vma) +{ + int ret; + struct vm_struct *area; + const char *failure_string; + struct binder_buffer *buffer; + + mutex_lock(&binder_alloc_mmap_lock); + if (alloc->buffer) { + ret = -EBUSY; + failure_string = "already mapped"; + goto err_already_mapped; + } + + area = get_vm_area(vma->vm_end - vma->vm_start, VM_IOREMAP); + if (area == NULL) { + ret = -ENOMEM; + failure_string = "get_vm_area"; + goto err_get_vm_area_failed; + } + alloc->buffer = area->addr; + alloc->user_buffer_offset = + vma->vm_start - (uintptr_t)alloc->buffer; + mutex_unlock(&binder_alloc_mmap_lock); + +#ifdef CONFIG_CPU_CACHE_VIPT + if (cache_is_vipt_aliasing()) { + while (CACHE_COLOUR( + (vma->vm_start ^ (uint32_t)alloc->buffer))) { + pr_info("binder_mmap: %d %lx-%lx maps %pK bad alignment\n", + alloc->pid, vma->vm_start, vma->vm_end, + alloc->buffer); + vma->vm_start += PAGE_SIZE; + } + } +#endif + alloc->pages = kzalloc(sizeof(alloc->pages[0]) * + ((vma->vm_end - vma->vm_start) / PAGE_SIZE), + GFP_KERNEL); + if (alloc->pages == NULL) { + ret = -ENOMEM; + failure_string = "alloc page array"; + goto err_alloc_pages_failed; + } + alloc->buffer_size = vma->vm_end - vma->vm_start; + + buffer = kzalloc(sizeof(*buffer), GFP_KERNEL); + if (!buffer) { + ret = -ENOMEM; + failure_string = "alloc buffer struct"; + goto err_alloc_buf_struct_failed; + } + + buffer->data = alloc->buffer; + list_add(&buffer->entry, &alloc->buffers); + buffer->free = 1; + binder_insert_free_buffer(alloc, buffer); + alloc->free_async_space = alloc->buffer_size / 2; + barrier(); + alloc->vma = vma; + alloc->vma_vm_mm = vma->vm_mm; + /* Same as mmgrab() in later kernel versions */ + atomic_inc(&alloc->vma_vm_mm->mm_count); + + return 0; + +err_alloc_buf_struct_failed: + kfree(alloc->pages); + alloc->pages = NULL; +err_alloc_pages_failed: + mutex_lock(&binder_alloc_mmap_lock); + vfree(alloc->buffer); + alloc->buffer = NULL; +err_get_vm_area_failed: +err_already_mapped: + mutex_unlock(&binder_alloc_mmap_lock); + pr_err("%s: %d %lx-%lx %s failed %d\n", __func__, + alloc->pid, vma->vm_start, vma->vm_end, failure_string, ret); + return ret; +} + + +void binder_alloc_deferred_release(struct binder_alloc *alloc) +{ + struct rb_node *n; + int buffers, page_count; + struct binder_buffer *buffer; + + BUG_ON(alloc->vma); + + buffers = 0; + mutex_lock(&alloc->mutex); + while ((n = rb_first(&alloc->allocated_buffers))) { + buffer = rb_entry(n, struct binder_buffer, rb_node); + + /* Transaction should already have been freed */ + BUG_ON(buffer->transaction); + + binder_free_buf_locked(alloc, buffer); + buffers++; + } + + while (!list_empty(&alloc->buffers)) { + buffer = list_first_entry(&alloc->buffers, + struct binder_buffer, entry); + WARN_ON(!buffer->free); + + list_del(&buffer->entry); + WARN_ON_ONCE(!list_empty(&alloc->buffers)); + kfree(buffer); + } + + page_count = 0; + if (alloc->pages) { + int i; + + for (i = 0; i < alloc->buffer_size / PAGE_SIZE; i++) { + void *page_addr; + bool on_lru; + + if (!alloc->pages[i].page_ptr) + continue; + + on_lru = list_lru_del(&binder_alloc_lru, + &alloc->pages[i].lru); + page_addr = alloc->buffer + i * PAGE_SIZE; + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%s: %d: page %d at %pK %s\n", + __func__, alloc->pid, i, page_addr, + on_lru ? "on lru" : "active"); + unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE); + __free_page(alloc->pages[i].page_ptr); + page_count++; + } + kfree(alloc->pages); + vfree(alloc->buffer); + } + mutex_unlock(&alloc->mutex); + if (alloc->vma_vm_mm) + mmdrop(alloc->vma_vm_mm); + + binder_alloc_debug(BINDER_DEBUG_OPEN_CLOSE, + "%s: %d buffers %d, pages %d\n", + __func__, alloc->pid, buffers, page_count); +} + +static void print_binder_buffer(struct seq_file *m, const char *prefix, + struct binder_buffer *buffer) +{ + seq_printf(m, "%s %d: %pK size %zd:%zd:%zd %s\n", + prefix, buffer->debug_id, buffer->data, + buffer->data_size, buffer->offsets_size, + buffer->extra_buffers_size, + buffer->transaction ? "active" : "delivered"); +} + +/** + * binder_alloc_print_allocated() - print buffer info + * @m: seq_file for output via seq_printf() + * @alloc: binder_alloc for this proc + * + * Prints information about every buffer associated with + * the binder_alloc state to the given seq_file + */ +void binder_alloc_print_allocated(struct seq_file *m, + struct binder_alloc *alloc) +{ + struct rb_node *n; + + mutex_lock(&alloc->mutex); + for (n = rb_first(&alloc->allocated_buffers); n != NULL; n = rb_next(n)) + print_binder_buffer(m, " buffer", + rb_entry(n, struct binder_buffer, rb_node)); + mutex_unlock(&alloc->mutex); +} + +/** + * binder_alloc_print_pages() - print page usage + * @m: seq_file for output via seq_printf() + * @alloc: binder_alloc for this proc + */ +void binder_alloc_print_pages(struct seq_file *m, + struct binder_alloc *alloc) +{ + struct binder_lru_page *page; + int i; + int active = 0; + int lru = 0; + int free = 0; + + mutex_lock(&alloc->mutex); + for (i = 0; i < alloc->buffer_size / PAGE_SIZE; i++) { + page = &alloc->pages[i]; + if (!page->page_ptr) + free++; + else if (list_empty(&page->lru)) + active++; + else + lru++; + } + mutex_unlock(&alloc->mutex); + seq_printf(m, " pages: %d:%d:%d\n", active, lru, free); +} + +/** + * binder_alloc_get_allocated_count() - return count of buffers + * @alloc: binder_alloc for this proc + * + * Return: count of allocated buffers + */ +int binder_alloc_get_allocated_count(struct binder_alloc *alloc) +{ + struct rb_node *n; + int count = 0; + + mutex_lock(&alloc->mutex); + for (n = rb_first(&alloc->allocated_buffers); n != NULL; n = rb_next(n)) + count++; + mutex_unlock(&alloc->mutex); + return count; +} + + +/** + * binder_alloc_vma_close() - invalidate address space + * @alloc: binder_alloc for this proc + * + * Called from binder_vma_close() when releasing address space. + * Clears alloc->vma to prevent new incoming transactions from + * allocating more buffers. + */ +void binder_alloc_vma_close(struct binder_alloc *alloc) +{ + WRITE_ONCE(alloc->vma, NULL); +} + +/** + * binder_alloc_free_page() - shrinker callback to free pages + * @item: item to free + * @lock: lock protecting the item + * @cb_arg: callback argument + * + * Called from list_lru_walk() in binder_shrink_scan() to free + * up pages when the system is under memory pressure. + */ +enum lru_status binder_alloc_free_page(struct list_head *item, + spinlock_t *lock, + void *cb_arg) +{ + struct mm_struct *mm = NULL; + struct binder_lru_page *page = container_of(item, + struct binder_lru_page, + lru); + struct binder_alloc *alloc; + uintptr_t page_addr; + size_t index; + struct vm_area_struct *vma; + + alloc = page->alloc; + if (!mutex_trylock(&alloc->mutex)) + goto err_get_alloc_mutex_failed; + + if (!page->page_ptr) + goto err_page_already_freed; + + index = page - alloc->pages; + page_addr = (uintptr_t)alloc->buffer + index * PAGE_SIZE; + vma = alloc->vma; + if (vma) { + /* Same as mmget_not_zero() in later kernel versions */ + if (!atomic_inc_not_zero(&alloc->vma_vm_mm->mm_users)) + goto err_mmget; + mm = alloc->vma_vm_mm; + if (!down_write_trylock(&mm->mmap_sem)) + goto err_down_write_mmap_sem_failed; + } + + list_del_init(item); + spin_unlock(lock); + + if (vma) { + trace_binder_unmap_user_start(alloc, index); + + zap_page_range(vma, + page_addr + + alloc->user_buffer_offset, + PAGE_SIZE, NULL); + + trace_binder_unmap_user_end(alloc, index); + + up_write(&mm->mmap_sem); + mmput(mm); + } + + trace_binder_unmap_kernel_start(alloc, index); + + unmap_kernel_range(page_addr, PAGE_SIZE); + __free_page(page->page_ptr); + page->page_ptr = NULL; + + trace_binder_unmap_kernel_end(alloc, index); + + spin_lock(lock); + mutex_unlock(&alloc->mutex); + return LRU_REMOVED_RETRY; + +err_down_write_mmap_sem_failed: + mmput_async(mm); +err_mmget: +err_page_already_freed: + mutex_unlock(&alloc->mutex); +err_get_alloc_mutex_failed: + return LRU_SKIP; +} + +static unsigned long +binder_shrink_count(struct shrinker *shrink, struct shrink_control *sc) +{ + unsigned long ret = list_lru_count(&binder_alloc_lru); + return ret; +} + +static unsigned long +binder_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) +{ + unsigned long ret; + + ret = list_lru_walk(&binder_alloc_lru, binder_alloc_free_page, + NULL, sc->nr_to_scan); + return ret; +} + +static struct shrinker binder_shrinker = { + .count_objects = binder_shrink_count, + .scan_objects = binder_shrink_scan, + .seeks = DEFAULT_SEEKS, +}; + +/** + * binder_alloc_init() - called by binder_open() for per-proc initialization + * @alloc: binder_alloc for this proc + * + * Called from binder_open() to initialize binder_alloc fields for + * new binder proc + */ +void binder_alloc_init(struct binder_alloc *alloc) +{ + alloc->pid = current->group_leader->pid; + mutex_init(&alloc->mutex); + INIT_LIST_HEAD(&alloc->buffers); +} + +void binder_alloc_shrinker_init(void) +{ + list_lru_init(&binder_alloc_lru); + register_shrinker(&binder_shrinker); +} diff --git a/drivers/staging/android/binder_alloc.h b/drivers/staging/android/binder_alloc.h new file mode 100644 index 0000000000000..fb3fe4a4e88d9 --- /dev/null +++ b/drivers/staging/android/binder_alloc.h @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2017 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef _LINUX_BINDER_ALLOC_H +#define _LINUX_BINDER_ALLOC_H + +#include +#include +#include +#include +#include +#include +#include + +extern struct list_lru binder_alloc_lru; +struct binder_transaction; + +/** + * struct binder_buffer - buffer used for binder transactions + * @entry: entry alloc->buffers + * @rb_node: node for allocated_buffers/free_buffers rb trees + * @free: true if buffer is free + * @allow_user_free: describe the second member of struct blah, + * @async_transaction: describe the second member of struct blah, + * @debug_id: describe the second member of struct blah, + * @transaction: describe the second member of struct blah, + * @target_node: describe the second member of struct blah, + * @data_size: describe the second member of struct blah, + * @offsets_size: describe the second member of struct blah, + * @extra_buffers_size: describe the second member of struct blah, + * @data:i describe the second member of struct blah, + * + * Bookkeeping structure for binder transaction buffers + */ +struct binder_buffer { + struct list_head entry; /* free and allocated entries by address */ + struct rb_node rb_node; /* free entry by size or allocated entry */ + /* by address */ + unsigned free:1; + unsigned allow_user_free:1; + unsigned async_transaction:1; + unsigned free_in_progress:1; + unsigned debug_id:28; + + struct binder_transaction *transaction; + + struct binder_node *target_node; + size_t data_size; + size_t offsets_size; + size_t extra_buffers_size; + void *data; +}; + +/** + * struct binder_lru_page - page object used for binder shrinker + * @page_ptr: pointer to physical page in mmap'd space + * @lru: entry in binder_alloc_lru + * @alloc: binder_alloc for a proc + */ +struct binder_lru_page { + struct list_head lru; + struct page *page_ptr; + struct binder_alloc *alloc; +}; + +/** + * struct binder_alloc - per-binder proc state for binder allocator + * @vma: vm_area_struct passed to mmap_handler + * (invarient after mmap) + * @tsk: tid for task that called init for this proc + * (invariant after init) + * @vma_vm_mm: copy of vma->vm_mm (invarient after mmap) + * @buffer: base of per-proc address space mapped via mmap + * @user_buffer_offset: offset between user and kernel VAs for buffer + * @buffers: list of all buffers for this proc + * @free_buffers: rb tree of buffers available for allocation + * sorted by size + * @allocated_buffers: rb tree of allocated buffers sorted by address + * @free_async_space: VA space available for async buffers. This is + * initialized at mmap time to 1/2 the full VA space + * @pages: array of binder_lru_page + * @buffer_size: size of address space specified via mmap + * @pid: pid for associated binder_proc (invariant after init) + * + * Bookkeeping structure for per-proc address space management for binder + * buffers. It is normally initialized during binder_init() and binder_mmap() + * calls. The address space is used for both user-visible buffers and for + * struct binder_buffer objects used to track the user buffers + */ +struct binder_alloc { + struct mutex mutex; + struct vm_area_struct *vma; + struct mm_struct *vma_vm_mm; + void *buffer; + ptrdiff_t user_buffer_offset; + struct list_head buffers; + struct rb_root free_buffers; + struct rb_root allocated_buffers; + size_t free_async_space; + struct binder_lru_page *pages; + size_t buffer_size; + uint32_t buffer_free; + int pid; +}; + +#ifdef CONFIG_ANDROID_BINDER_IPC_SELFTEST +void binder_selftest_alloc(struct binder_alloc *alloc); +#else +static inline void binder_selftest_alloc(struct binder_alloc *alloc) {} +#endif +enum lru_status binder_alloc_free_page(struct list_head *item, + spinlock_t *lock, void *cb_arg); +extern struct binder_buffer *binder_alloc_new_buf(struct binder_alloc *alloc, + size_t data_size, + size_t offsets_size, + size_t extra_buffers_size, + int is_async); +extern void binder_alloc_init(struct binder_alloc *alloc); +void binder_alloc_shrinker_init(void); +extern void binder_alloc_vma_close(struct binder_alloc *alloc); +extern struct binder_buffer * +binder_alloc_prepare_to_free(struct binder_alloc *alloc, + uintptr_t user_ptr); +extern void binder_alloc_free_buf(struct binder_alloc *alloc, + struct binder_buffer *buffer); +extern int binder_alloc_mmap_handler(struct binder_alloc *alloc, + struct vm_area_struct *vma); +extern void binder_alloc_deferred_release(struct binder_alloc *alloc); +extern int binder_alloc_get_allocated_count(struct binder_alloc *alloc); +extern void binder_alloc_print_allocated(struct seq_file *m, + struct binder_alloc *alloc); +void binder_alloc_print_pages(struct seq_file *m, + struct binder_alloc *alloc); + +/** + * binder_alloc_get_free_async_space() - get free space available for async + * @alloc: binder_alloc for this proc + * + * Return: the bytes remaining in the address-space for async transactions + */ +static inline size_t +binder_alloc_get_free_async_space(struct binder_alloc *alloc) +{ + size_t free_async_space; + + mutex_lock(&alloc->mutex); + free_async_space = alloc->free_async_space; + mutex_unlock(&alloc->mutex); + return free_async_space; +} + +/** + * binder_alloc_get_user_buffer_offset() - get offset between kernel/user addrs + * @alloc: binder_alloc for this proc + * + * Return: the offset between kernel and user-space addresses to use for + * virtual address conversion + */ +static inline ptrdiff_t +binder_alloc_get_user_buffer_offset(struct binder_alloc *alloc) +{ + /* + * user_buffer_offset is constant if vma is set and + * undefined if vma is not set. It is possible to + * get here with !alloc->vma if the target process + * is dying while a transaction is being initiated. + * Returning the old value is ok in this case and + * the transaction will fail. + */ + return alloc->user_buffer_offset; +} + +#endif /* _LINUX_BINDER_ALLOC_H */ + diff --git a/drivers/staging/android/binder_alloc_selftest.c b/drivers/staging/android/binder_alloc_selftest.c new file mode 100644 index 0000000000000..f14f78cb5b469 --- /dev/null +++ b/drivers/staging/android/binder_alloc_selftest.c @@ -0,0 +1,310 @@ +/* binder_alloc_selftest.c + * + * Android IPC Subsystem + * + * Copyright (C) 2017 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include "binder_alloc.h" + +#define BUFFER_NUM 5 +#define BUFFER_MIN_SIZE (PAGE_SIZE / 8) + +static bool binder_selftest_run = true; +static int binder_selftest_failures; +static DEFINE_MUTEX(binder_selftest_lock); + +/** + * enum buf_end_align_type - Page alignment of a buffer + * end with regard to the end of the previous buffer. + * + * In the pictures below, buf2 refers to the buffer we + * are aligning. buf1 refers to previous buffer by addr. + * Symbol [ means the start of a buffer, ] means the end + * of a buffer, and | means page boundaries. + */ +enum buf_end_align_type { + /** + * @SAME_PAGE_UNALIGNED: The end of this buffer is on + * the same page as the end of the previous buffer and + * is not page aligned. Examples: + * buf1 ][ buf2 ][ ... + * buf1 ]|[ buf2 ][ ... + */ + SAME_PAGE_UNALIGNED = 0, + /** + * @SAME_PAGE_ALIGNED: When the end of the previous buffer + * is not page aligned, the end of this buffer is on the + * same page as the end of the previous buffer and is page + * aligned. When the previous buffer is page aligned, the + * end of this buffer is aligned to the next page boundary. + * Examples: + * buf1 ][ buf2 ]| ... + * buf1 ]|[ buf2 ]| ... + */ + SAME_PAGE_ALIGNED, + /** + * @NEXT_PAGE_UNALIGNED: The end of this buffer is on + * the page next to the end of the previous buffer and + * is not page aligned. Examples: + * buf1 ][ buf2 | buf2 ][ ... + * buf1 ]|[ buf2 | buf2 ][ ... + */ + NEXT_PAGE_UNALIGNED, + /** + * @NEXT_PAGE_ALIGNED: The end of this buffer is on + * the page next to the end of the previous buffer and + * is page aligned. Examples: + * buf1 ][ buf2 | buf2 ]| ... + * buf1 ]|[ buf2 | buf2 ]| ... + */ + NEXT_PAGE_ALIGNED, + /** + * @NEXT_NEXT_UNALIGNED: The end of this buffer is on + * the page that follows the page after the end of the + * previous buffer and is not page aligned. Examples: + * buf1 ][ buf2 | buf2 | buf2 ][ ... + * buf1 ]|[ buf2 | buf2 | buf2 ][ ... + */ + NEXT_NEXT_UNALIGNED, + LOOP_END, +}; + +static void pr_err_size_seq(size_t *sizes, int *seq) +{ + int i; + + pr_err("alloc sizes: "); + for (i = 0; i < BUFFER_NUM; i++) + pr_cont("[%zu]", sizes[i]); + pr_cont("\n"); + pr_err("free seq: "); + for (i = 0; i < BUFFER_NUM; i++) + pr_cont("[%d]", seq[i]); + pr_cont("\n"); +} + +static bool check_buffer_pages_allocated(struct binder_alloc *alloc, + struct binder_buffer *buffer, + size_t size) +{ + void *page_addr, *end; + int page_index; + + end = (void *)PAGE_ALIGN((uintptr_t)buffer->data + size); + page_addr = buffer->data; + for (; page_addr < end; page_addr += PAGE_SIZE) { + page_index = (page_addr - alloc->buffer) / PAGE_SIZE; + if (!alloc->pages[page_index].page_ptr || + !list_empty(&alloc->pages[page_index].lru)) { + pr_err("expect alloc but is %s at page index %d\n", + alloc->pages[page_index].page_ptr ? + "lru" : "free", page_index); + return false; + } + } + return true; +} + +static void binder_selftest_alloc_buf(struct binder_alloc *alloc, + struct binder_buffer *buffers[], + size_t *sizes, int *seq) +{ + int i; + + for (i = 0; i < BUFFER_NUM; i++) { + buffers[i] = binder_alloc_new_buf(alloc, sizes[i], 0, 0, 0); + if (IS_ERR(buffers[i]) || + !check_buffer_pages_allocated(alloc, buffers[i], + sizes[i])) { + pr_err_size_seq(sizes, seq); + binder_selftest_failures++; + } + } +} + +static void binder_selftest_free_buf(struct binder_alloc *alloc, + struct binder_buffer *buffers[], + size_t *sizes, int *seq, size_t end) +{ + int i; + + for (i = 0; i < BUFFER_NUM; i++) + binder_alloc_free_buf(alloc, buffers[seq[i]]); + + for (i = 0; i < end / PAGE_SIZE; i++) { + /** + * Error message on a free page can be false positive + * if binder shrinker ran during binder_alloc_free_buf + * calls above. + */ + if (list_empty(&alloc->pages[i].lru)) { + pr_err_size_seq(sizes, seq); + pr_err("expect lru but is %s at page index %d\n", + alloc->pages[i].page_ptr ? "alloc" : "free", i); + binder_selftest_failures++; + } + } +} + +static void binder_selftest_free_page(struct binder_alloc *alloc) +{ + int i; + unsigned long count; + + while ((count = list_lru_count(&binder_alloc_lru))) { + list_lru_walk(&binder_alloc_lru, binder_alloc_free_page, + NULL, count); + } + + for (i = 0; i < (alloc->buffer_size / PAGE_SIZE); i++) { + if (alloc->pages[i].page_ptr) { + pr_err("expect free but is %s at page index %d\n", + list_empty(&alloc->pages[i].lru) ? + "alloc" : "lru", i); + binder_selftest_failures++; + } + } +} + +static void binder_selftest_alloc_free(struct binder_alloc *alloc, + size_t *sizes, int *seq, size_t end) +{ + struct binder_buffer *buffers[BUFFER_NUM]; + + binder_selftest_alloc_buf(alloc, buffers, sizes, seq); + binder_selftest_free_buf(alloc, buffers, sizes, seq, end); + + /* Allocate from lru. */ + binder_selftest_alloc_buf(alloc, buffers, sizes, seq); + if (list_lru_count(&binder_alloc_lru)) + pr_err("lru list should be empty but is not\n"); + + binder_selftest_free_buf(alloc, buffers, sizes, seq, end); + binder_selftest_free_page(alloc); +} + +static bool is_dup(int *seq, int index, int val) +{ + int i; + + for (i = 0; i < index; i++) { + if (seq[i] == val) + return true; + } + return false; +} + +/* Generate BUFFER_NUM factorial free orders. */ +static void binder_selftest_free_seq(struct binder_alloc *alloc, + size_t *sizes, int *seq, + int index, size_t end) +{ + int i; + + if (index == BUFFER_NUM) { + binder_selftest_alloc_free(alloc, sizes, seq, end); + return; + } + for (i = 0; i < BUFFER_NUM; i++) { + if (is_dup(seq, index, i)) + continue; + seq[index] = i; + binder_selftest_free_seq(alloc, sizes, seq, index + 1, end); + } +} + +static void binder_selftest_alloc_size(struct binder_alloc *alloc, + size_t *end_offset) +{ + int i; + int seq[BUFFER_NUM] = {0}; + size_t front_sizes[BUFFER_NUM]; + size_t back_sizes[BUFFER_NUM]; + size_t last_offset, offset = 0; + + for (i = 0; i < BUFFER_NUM; i++) { + last_offset = offset; + offset = end_offset[i]; + front_sizes[i] = offset - last_offset; + back_sizes[BUFFER_NUM - i - 1] = front_sizes[i]; + } + /* + * Buffers share the first or last few pages. + * Only BUFFER_NUM - 1 buffer sizes are adjustable since + * we need one giant buffer before getting to the last page. + */ + back_sizes[0] += alloc->buffer_size - end_offset[BUFFER_NUM - 1]; + binder_selftest_free_seq(alloc, front_sizes, seq, 0, + end_offset[BUFFER_NUM - 1]); + binder_selftest_free_seq(alloc, back_sizes, seq, 0, alloc->buffer_size); +} + +static void binder_selftest_alloc_offset(struct binder_alloc *alloc, + size_t *end_offset, int index) +{ + int align; + size_t end, prev; + + if (index == BUFFER_NUM) { + binder_selftest_alloc_size(alloc, end_offset); + return; + } + prev = index == 0 ? 0 : end_offset[index - 1]; + end = prev; + + BUILD_BUG_ON(BUFFER_MIN_SIZE * BUFFER_NUM >= PAGE_SIZE); + + for (align = SAME_PAGE_UNALIGNED; align < LOOP_END; align++) { + if (align % 2) + end = ALIGN(end, PAGE_SIZE); + else + end += BUFFER_MIN_SIZE; + end_offset[index] = end; + binder_selftest_alloc_offset(alloc, end_offset, index + 1); + } +} + +/** + * binder_selftest_alloc() - Test alloc and free of buffer pages. + * @alloc: Pointer to alloc struct. + * + * Allocate BUFFER_NUM buffers to cover all page alignment cases, + * then free them in all orders possible. Check that pages are + * correctly allocated, put onto lru when buffers are freed, and + * are freed when binder_alloc_free_page is called. + */ +void binder_selftest_alloc(struct binder_alloc *alloc) +{ + size_t end_offset[BUFFER_NUM]; + + if (!binder_selftest_run) + return; + mutex_lock(&binder_selftest_lock); + if (!binder_selftest_run || !alloc->vma) + goto done; + pr_info("STARTED\n"); + binder_selftest_alloc_offset(alloc, end_offset, 0); + binder_selftest_run = false; + if (binder_selftest_failures > 0) + pr_info("%d tests FAILED\n", binder_selftest_failures); + else + pr_info("PASSED\n"); + +done: + mutex_unlock(&binder_selftest_lock); +} diff --git a/drivers/staging/android/binder_trace.h b/drivers/staging/android/binder_trace.h index 7f20f3dc83690..b11dffc521e85 100644 --- a/drivers/staging/android/binder_trace.h +++ b/drivers/staging/android/binder_trace.h @@ -23,7 +23,8 @@ struct binder_buffer; struct binder_node; struct binder_proc; -struct binder_ref; +struct binder_alloc; +struct binder_ref_data; struct binder_thread; struct binder_transaction; @@ -84,6 +85,30 @@ DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_ioctl_done); DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_write_done); DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_read_done); +TRACE_EVENT(binder_set_priority, + TP_PROTO(int proc, int thread, unsigned int old_prio, + unsigned int desired_prio, unsigned int new_prio), + TP_ARGS(proc, thread, old_prio, new_prio, desired_prio), + + TP_STRUCT__entry( + __field(int, proc) + __field(int, thread) + __field(unsigned int, old_prio) + __field(unsigned int, new_prio) + __field(unsigned int, desired_prio) + ), + TP_fast_assign( + __entry->proc = proc; + __entry->thread = thread; + __entry->old_prio = old_prio; + __entry->new_prio = new_prio; + __entry->desired_prio = desired_prio; + ), + TP_printk("proc=%d thread=%d old=%d => new=%d desired=%d", + __entry->proc, __entry->thread, __entry->old_prio, + __entry->new_prio, __entry->desired_prio) +); + TRACE_EVENT(binder_wait_for_work, TP_PROTO(bool proc_work, bool transaction_stack, bool thread_todo), TP_ARGS(proc_work, transaction_stack, thread_todo), @@ -146,8 +171,8 @@ TRACE_EVENT(binder_transaction_received, TRACE_EVENT(binder_transaction_node_to_ref, TP_PROTO(struct binder_transaction *t, struct binder_node *node, - struct binder_ref *ref), - TP_ARGS(t, node, ref), + struct binder_ref_data *rdata), + TP_ARGS(t, node, rdata), TP_STRUCT__entry( __field(int, debug_id) @@ -160,8 +185,8 @@ TRACE_EVENT(binder_transaction_node_to_ref, __entry->debug_id = t->debug_id; __entry->node_debug_id = node->debug_id; __entry->node_ptr = node->ptr; - __entry->ref_debug_id = ref->debug_id; - __entry->ref_desc = ref->desc; + __entry->ref_debug_id = rdata->debug_id; + __entry->ref_desc = rdata->desc; ), TP_printk("transaction=%d node=%d src_ptr=0x%016llx ==> dest_ref=%d dest_desc=%d", __entry->debug_id, __entry->node_debug_id, @@ -170,8 +195,9 @@ TRACE_EVENT(binder_transaction_node_to_ref, ); TRACE_EVENT(binder_transaction_ref_to_node, - TP_PROTO(struct binder_transaction *t, struct binder_ref *ref), - TP_ARGS(t, ref), + TP_PROTO(struct binder_transaction *t, struct binder_node *node, + struct binder_ref_data *rdata), + TP_ARGS(t, node, rdata), TP_STRUCT__entry( __field(int, debug_id) @@ -182,10 +208,10 @@ TRACE_EVENT(binder_transaction_ref_to_node, ), TP_fast_assign( __entry->debug_id = t->debug_id; - __entry->ref_debug_id = ref->debug_id; - __entry->ref_desc = ref->desc; - __entry->node_debug_id = ref->node->debug_id; - __entry->node_ptr = ref->node->ptr; + __entry->ref_debug_id = rdata->debug_id; + __entry->ref_desc = rdata->desc; + __entry->node_debug_id = node->debug_id; + __entry->node_ptr = node->ptr; ), TP_printk("transaction=%d node=%d src_ref=%d src_desc=%d ==> dest_ptr=0x%016llx", __entry->debug_id, __entry->node_debug_id, @@ -194,9 +220,10 @@ TRACE_EVENT(binder_transaction_ref_to_node, ); TRACE_EVENT(binder_transaction_ref_to_ref, - TP_PROTO(struct binder_transaction *t, struct binder_ref *src_ref, - struct binder_ref *dest_ref), - TP_ARGS(t, src_ref, dest_ref), + TP_PROTO(struct binder_transaction *t, struct binder_node *node, + struct binder_ref_data *src_ref, + struct binder_ref_data *dest_ref), + TP_ARGS(t, node, src_ref, dest_ref), TP_STRUCT__entry( __field(int, debug_id) @@ -208,7 +235,7 @@ TRACE_EVENT(binder_transaction_ref_to_ref, ), TP_fast_assign( __entry->debug_id = t->debug_id; - __entry->node_debug_id = src_ref->node->debug_id; + __entry->node_debug_id = node->debug_id; __entry->src_ref_debug_id = src_ref->debug_id; __entry->src_ref_desc = src_ref->desc; __entry->dest_ref_debug_id = dest_ref->debug_id; @@ -268,9 +295,9 @@ DEFINE_EVENT(binder_buffer_class, binder_transaction_failed_buffer_release, TP_ARGS(buffer)); TRACE_EVENT(binder_update_page_range, - TP_PROTO(struct binder_proc *proc, bool allocate, + TP_PROTO(struct binder_alloc *alloc, bool allocate, void *start, void *end), - TP_ARGS(proc, allocate, start, end), + TP_ARGS(alloc, allocate, start, end), TP_STRUCT__entry( __field(int, proc) __field(bool, allocate) @@ -278,9 +305,9 @@ TRACE_EVENT(binder_update_page_range, __field(size_t, size) ), TP_fast_assign( - __entry->proc = proc->pid; + __entry->proc = alloc->pid; __entry->allocate = allocate; - __entry->offset = start - proc->buffer; + __entry->offset = start - alloc->buffer; __entry->size = end - start; ), TP_printk("proc=%d allocate=%d offset=%zu size=%zu", @@ -288,6 +315,61 @@ TRACE_EVENT(binder_update_page_range, __entry->offset, __entry->size) ); +DECLARE_EVENT_CLASS(binder_lru_page_class, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index), + TP_STRUCT__entry( + __field(int, proc) + __field(size_t, page_index) + ), + TP_fast_assign( + __entry->proc = alloc->pid; + __entry->page_index = page_index; + ), + TP_printk("proc=%d page_index=%zu", + __entry->proc, __entry->page_index) +); + +DEFINE_EVENT(binder_lru_page_class, binder_alloc_lru_start, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_alloc_lru_end, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_free_lru_start, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_free_lru_end, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_alloc_page_start, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_alloc_page_end, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_unmap_user_start, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_unmap_user_end, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_unmap_kernel_start, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_unmap_kernel_end, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + TRACE_EVENT(binder_command, TP_PROTO(uint32_t cmd), TP_ARGS(cmd), diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index ffab992311063..1cf5962f12499 100755 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -473,7 +473,7 @@ static struct ion_handle *pass_to_user(struct ion_handle *handle) /* Must hold the client lock */ static int user_ion_handle_put_nolock(struct ion_handle *handle) { - int ret; + int ret = 0; if (--handle->user_ref_count == 0) ret = ion_handle_put_nolock(handle); diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c index 062de5ae1738f..10e8a73cee3c1 100644 --- a/drivers/staging/android/ion/ion_system_heap.c +++ b/drivers/staging/android/ion/ion_system_heap.c @@ -37,7 +37,7 @@ static gfp_t high_order_gfp_flags = (GFP_HIGHUSER | __GFP_NOWARN | static gfp_t low_order_gfp_flags = (GFP_HIGHUSER | __GFP_NOWARN); #ifndef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS -static const unsigned int orders[] = {9, 8, 4, 0}; +static const unsigned int orders[] = {4, 0}; #else static const unsigned int orders[] = {0}; #endif diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c index d70c1233e3518..9b6c97e3524a4 100644 --- a/drivers/staging/android/lowmemorykiller.c +++ b/drivers/staging/android/lowmemorykiller.c @@ -32,35 +32,22 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -#include +#include +#include #include #include #include #include #include #include +#include #include -#include -#include -#include -#include -#include #include -#include -#define CREATE_TRACE_POINTS -#include -#ifdef CONFIG_HIGHMEM -#define _ZONE ZONE_HIGHMEM -#else -#define _ZONE ZONE_NORMAL -#endif +#define CONFIG_CONVERT_ADJ_TO_SCORE_ADJ -#define CREATE_TRACE_POINTS -#include "trace/lowmemorykiller.h" - -static uint32_t lowmem_debug_level = 1; +static u32 lowmem_debug_level = 1; static short lowmem_adj[6] = { 0, 1, @@ -75,311 +62,41 @@ static int lowmem_minfree[6] = { 16 * 1024, /* 64MB */ }; static int lowmem_minfree_size = 4; -static int lmk_fast_run = 1; static unsigned long lowmem_deathpending_timeout; +static bool kill_one_more; + #define lowmem_print(level, x...) \ do { \ if (lowmem_debug_level >= (level)) \ pr_info(x); \ } while (0) -static unsigned long lowmem_count(struct shrinker *s, - struct shrink_control *sc) -{ - return global_page_state(NR_ACTIVE_ANON) + - global_page_state(NR_ACTIVE_FILE) + - global_page_state(NR_INACTIVE_ANON) + - global_page_state(NR_INACTIVE_FILE); -} - -static atomic_t shift_adj = ATOMIC_INIT(0); -static short adj_max_shift = 353; -module_param_named(adj_max_shift, adj_max_shift, short, - S_IRUGO | S_IWUSR); - -/* User knob to enable/disable adaptive lmk feature */ -static int enable_adaptive_lmk; -module_param_named(enable_adaptive_lmk, enable_adaptive_lmk, int, - S_IRUGO | S_IWUSR); - -/* - * This parameter controls the behaviour of LMK when vmpressure is in - * the range of 90-94. Adaptive lmk triggers based on number of file - * pages wrt vmpressure_file_min, when vmpressure is in the range of - * 90-94. Usually this is a pseudo minfree value, higher than the - * highest configured value in minfree array. - */ -static int vmpressure_file_min; -module_param_named(vmpressure_file_min, vmpressure_file_min, int, - S_IRUGO | S_IWUSR); - -enum { - VMPRESSURE_NO_ADJUST = 0, - VMPRESSURE_ADJUST_ENCROACH, - VMPRESSURE_ADJUST_NORMAL, -}; - -int adjust_minadj(short *min_score_adj) -{ - int ret = VMPRESSURE_NO_ADJUST; - if (!enable_adaptive_lmk) - return 0; - - if (atomic_read(&shift_adj) && - (*min_score_adj > adj_max_shift)) { - if (*min_score_adj == OOM_SCORE_ADJ_MAX + 1) - ret = VMPRESSURE_ADJUST_ENCROACH; - else - ret = VMPRESSURE_ADJUST_NORMAL; - *min_score_adj = adj_max_shift; - } - atomic_set(&shift_adj, 0); - - return ret; -} - -static int lmk_vmpressure_notifier(struct notifier_block *nb, - unsigned long action, void *data) -{ - int other_free, other_file; - unsigned long pressure = action; - int array_size = ARRAY_SIZE(lowmem_adj); - - if (!enable_adaptive_lmk) - return 0; - - if (pressure >= 95) { - other_file = global_page_state(NR_FILE_PAGES) + zcache_pages() - - global_page_state(NR_SHMEM) - - total_swapcache_pages(); - other_free = global_page_state(NR_FREE_PAGES); - - atomic_set(&shift_adj, 1); - trace_almk_vmpressure(pressure, other_free, other_file); - } else if (pressure >= 90) { - if (lowmem_adj_size < array_size) - array_size = lowmem_adj_size; - if (lowmem_minfree_size < array_size) - array_size = lowmem_minfree_size; - - other_file = global_page_state(NR_FILE_PAGES) + zcache_pages() - - global_page_state(NR_SHMEM) - - total_swapcache_pages(); - - other_free = global_page_state(NR_FREE_PAGES); - - if ((other_free < lowmem_minfree[array_size - 1]) && - (other_file < vmpressure_file_min)) { - atomic_set(&shift_adj, 1); - trace_almk_vmpressure(pressure, other_free, - other_file); - } - } else if (atomic_read(&shift_adj)) { - /* - * shift_adj would have been set by a previous invocation - * of notifier, which is not followed by a lowmem_shrink yet. - * Since vmpressure has improved, reset shift_adj to avoid - * false adaptive LMK trigger. - */ - trace_almk_vmpressure(pressure, other_free, other_file); - atomic_set(&shift_adj, 0); - } - - return 0; -} - -static struct notifier_block lmk_vmpr_nb = { - .notifier_call = lmk_vmpressure_notifier, -}; - -static int test_task_flag(struct task_struct *p, int flag) +static bool test_tsk_lmk_waiting(struct task_struct *p) { struct task_struct *t; for_each_thread(p, t) { task_lock(t); - if (test_tsk_thread_flag(t, flag)) { + if (unlikely(task_lmk_waiting(t))) { task_unlock(t); - return 1; + return true; } task_unlock(t); } - return 0; + return false; } -static DEFINE_MUTEX(scan_mutex); - -int can_use_cma_pages(gfp_t gfp_mask) -{ - int can_use = 0; - int mtype = gfpflags_to_migratetype(gfp_mask); - int i = 0; - int *mtype_fallbacks = get_migratetype_fallbacks(mtype); - - if (is_migrate_cma(mtype)) { - can_use = 1; - } else { - for (i = 0;; i++) { - int fallbacktype = mtype_fallbacks[i]; - - if (is_migrate_cma(fallbacktype)) { - can_use = 1; - break; - } - - if (fallbacktype == MIGRATE_RESERVE) - break; - } - } - return can_use; -} - -void tune_lmk_zone_param(struct zonelist *zonelist, int classzone_idx, - int *other_free, int *other_file, - int use_cma_pages) -{ - struct zone *zone; - struct zoneref *zoneref; - int zone_idx; - - for_each_zone_zonelist(zone, zoneref, zonelist, MAX_NR_ZONES) { - zone_idx = zonelist_zone_idx(zoneref); - if (zone_idx == ZONE_MOVABLE) { - if (!use_cma_pages && other_free) - *other_free -= - zone_page_state(zone, NR_FREE_CMA_PAGES); - continue; - } - - if (zone_idx > classzone_idx) { - if (other_free != NULL) - *other_free -= zone_page_state(zone, - NR_FREE_PAGES); - if (other_file != NULL) - *other_file -= zone_page_state(zone, - NR_FILE_PAGES) - - zone_page_state(zone, NR_SHMEM) - - zone_page_state(zone, NR_SWAPCACHE); - } else if (zone_idx < classzone_idx) { - if (zone_watermark_ok(zone, 0, 0, classzone_idx, 0) && - other_free) { - if (!use_cma_pages) { - *other_free -= min( - zone->lowmem_reserve[classzone_idx] + - zone_page_state( - zone, NR_FREE_CMA_PAGES), - zone_page_state( - zone, NR_FREE_PAGES)); - } else { - *other_free -= - zone->lowmem_reserve[classzone_idx]; - } - } else { - if (other_free) - *other_free -= - zone_page_state(zone, NR_FREE_PAGES); - } - } - } -} - -#ifdef CONFIG_HIGHMEM -void adjust_gfp_mask(gfp_t *gfp_mask) -{ - struct zone *preferred_zone; - struct zonelist *zonelist; - enum zone_type high_zoneidx; - - if (current_is_kswapd()) { - zonelist = node_zonelist(0, *gfp_mask); - high_zoneidx = gfp_zone(*gfp_mask); - first_zones_zonelist(zonelist, high_zoneidx, NULL, - &preferred_zone); - - if (high_zoneidx == ZONE_NORMAL) { - if (zone_watermark_ok_safe(preferred_zone, 0, - high_wmark_pages(preferred_zone), 0, - 0)) - *gfp_mask |= __GFP_HIGHMEM; - } else if (high_zoneidx == ZONE_HIGHMEM) { - *gfp_mask |= __GFP_HIGHMEM; - } - } -} -#else -void adjust_gfp_mask(gfp_t *unused) -{ -} -#endif - -void tune_lmk_param(int *other_free, int *other_file, struct shrink_control *sc) +static unsigned long lowmem_count(struct shrinker *s, + struct shrink_control *sc) { - gfp_t gfp_mask; - struct zone *preferred_zone; - struct zonelist *zonelist; - enum zone_type high_zoneidx, classzone_idx; - unsigned long balance_gap; - int use_cma_pages; - - gfp_mask = sc->gfp_mask; - adjust_gfp_mask(&gfp_mask); - - zonelist = node_zonelist(0, gfp_mask); - high_zoneidx = gfp_zone(gfp_mask); - first_zones_zonelist(zonelist, high_zoneidx, NULL, &preferred_zone); - classzone_idx = zone_idx(preferred_zone); - use_cma_pages = can_use_cma_pages(gfp_mask); - - balance_gap = min(low_wmark_pages(preferred_zone), - (preferred_zone->present_pages + - KSWAPD_ZONE_BALANCE_GAP_RATIO-1) / - KSWAPD_ZONE_BALANCE_GAP_RATIO); - - if (likely(current_is_kswapd() && zone_watermark_ok(preferred_zone, 0, - high_wmark_pages(preferred_zone) + SWAP_CLUSTER_MAX + - balance_gap, 0, 0))) { - if (lmk_fast_run) - tune_lmk_zone_param(zonelist, classzone_idx, other_free, - other_file, use_cma_pages); - else - tune_lmk_zone_param(zonelist, classzone_idx, other_free, - NULL, use_cma_pages); - - if (zone_watermark_ok(preferred_zone, 0, 0, _ZONE, 0)) { - if (!use_cma_pages) { - *other_free -= min( - preferred_zone->lowmem_reserve[_ZONE] - + zone_page_state( - preferred_zone, NR_FREE_CMA_PAGES), - zone_page_state( - preferred_zone, NR_FREE_PAGES)); - } else { - *other_free -= - preferred_zone->lowmem_reserve[_ZONE]; - } - } else { - *other_free -= zone_page_state(preferred_zone, - NR_FREE_PAGES); - } - - lowmem_print(4, "lowmem_shrink of kswapd tunning for highmem " - "ofree %d, %d\n", *other_free, *other_file); - } else { - tune_lmk_zone_param(zonelist, classzone_idx, other_free, - other_file, use_cma_pages); - - if (!use_cma_pages) { - *other_free -= - zone_page_state(preferred_zone, NR_FREE_CMA_PAGES); - } - - lowmem_print(4, "lowmem_shrink tunning for others ofree %d, " - "%d\n", *other_free, *other_file); - } + return global_page_state(NR_ACTIVE_ANON) + + global_page_state(NR_ACTIVE_FILE) + + global_page_state(NR_INACTIVE_ANON) + + global_page_state(NR_INACTIVE_FILE); } static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) @@ -389,29 +106,16 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) unsigned long rem = 0; int tasksize; int i; - int ret = 0; short min_score_adj = OOM_SCORE_ADJ_MAX + 1; int minfree = 0; int selected_tasksize = 0; short selected_oom_score_adj; int array_size = ARRAY_SIZE(lowmem_adj); - int other_free; - int other_file; - - if (mutex_lock_interruptible(&scan_mutex) < 0) - return 0; - - other_free = global_page_state(NR_FREE_PAGES); - - if (global_page_state(NR_SHMEM) + total_swapcache_pages() < - global_page_state(NR_FILE_PAGES) + zcache_pages()) - other_file = global_page_state(NR_FILE_PAGES) + zcache_pages() - + int other_free = global_page_state(NR_FREE_PAGES) - totalreserve_pages; + int other_file = global_page_state(NR_FILE_PAGES) - global_page_state(NR_SHMEM) - + global_page_state(NR_UNEVICTABLE) - total_swapcache_pages(); - else - other_file = 0; - - tune_lmk_param(&other_free, &other_file, sc); if (lowmem_adj_size < array_size) array_size = lowmem_adj_size; @@ -419,29 +123,26 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) array_size = lowmem_minfree_size; for (i = 0; i < array_size; i++) { minfree = lowmem_minfree[i]; - if (other_free < minfree && other_file < minfree) { + if (other_free < minfree && other_file < (minfree + minfree / 4)) { min_score_adj = lowmem_adj[i]; break; } } - ret = adjust_minadj(&min_score_adj); - lowmem_print(3, "lowmem_scan %lu, %x, ofree %d %d, ma %hd\n", sc->nr_to_scan, sc->gfp_mask, other_free, other_file, min_score_adj); if (min_score_adj == OOM_SCORE_ADJ_MAX + 1) { - trace_almk_shrink(0, ret, other_free, other_file, 0); lowmem_print(5, "lowmem_scan %lu, %x, return 0\n", sc->nr_to_scan, sc->gfp_mask); - mutex_unlock(&scan_mutex); return 0; } selected_oom_score_adj = min_score_adj; rcu_read_lock(); +again: for_each_process(tsk) { struct task_struct *p; short oom_score_adj; @@ -449,18 +150,10 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) if (tsk->flags & PF_KTHREAD) continue; - /* if task no longer has any memory ignore it */ - if (test_task_flag(tsk, TIF_MM_RELEASED)) + if (test_tsk_lmk_waiting(tsk)) { + lowmem_print(2, "%s (%d) is already killed, skip\n", + tsk->comm, tsk->pid); continue; - - if (time_before_eq(jiffies, lowmem_deathpending_timeout)) { - if (test_task_flag(tsk, TIF_MEMDIE)) { - rcu_read_unlock(); - /* give the system time to free up the memory */ - msleep_interruptible(20); - mutex_unlock(&scan_mutex); - return 0; - } } p = find_lock_task_mm(tsk); @@ -473,6 +166,9 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) continue; } tasksize = get_mm_rss(p->mm); +#ifdef CONFIG_ZRAM + tasksize += (get_mm_counter(p->mm, MM_SWAPENTS) / 3); +#endif task_unlock(p); if (tasksize <= 0) continue; @@ -486,63 +182,41 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) selected = p; selected_tasksize = tasksize; selected_oom_score_adj = oom_score_adj; - lowmem_print(3, "select '%s' (%d), adj %hd, size %d, to kill\n", - p->comm, p->pid, oom_score_adj, tasksize); + lowmem_print(2, "select '%s' (%d, %d), adj %hd, size %d, to kill\n", + p->comm, p->pid, p->tgid, oom_score_adj, tasksize); } if (selected) { - long cache_size = other_file * (long)(PAGE_SIZE / 1024); - long cache_limit = minfree * (long)(PAGE_SIZE / 1024); - long free = other_free * (long)(PAGE_SIZE / 1024); - trace_lowmemory_kill(selected, cache_size, cache_limit, free); - lowmem_print(1, "Killing '%s' (%d), adj %hd,\n" \ - " to free %ldkB on behalf of '%s' (%d) because\n" \ - " cache %ldkB is below limit %ldkB for oom_score_adj %hd\n" \ - " Free memory is %ldkB above reserved.\n" \ - " Free CMA is %ldkB\n" \ - " Total reserve is %ldkB\n" \ - " Total free pages is %ldkB\n" \ - " Total file cache is %ldkB\n" \ - " Total zcache is %ldkB\n" \ - " GFP mask is 0x%x\n", + task_lock(selected); + send_sig(SIGKILL, selected, 0); + if (selected->mm) + task_set_lmk_waiting(selected); + task_unlock(selected); + lowmem_print(1, "Killing '%s' (%d), adj %hd,\n" + " to free %ldkB on behalf of '%s' (%d) because\n" + " cache %ldkB is below limit %ldkB for oom_score_adj %hd\n" + " Free memory is %ldkB above reserved\n", selected->comm, selected->pid, selected_oom_score_adj, selected_tasksize * (long)(PAGE_SIZE / 1024), current->comm, current->pid, - cache_size, cache_limit, + other_file * (long)(PAGE_SIZE / 1024), + minfree * (long)(PAGE_SIZE / 1024), min_score_adj, - other_free * (long)(PAGE_SIZE / 1024), - global_page_state(NR_FREE_CMA_PAGES) * - (long)(PAGE_SIZE / 1024), - totalreserve_pages * (long)(PAGE_SIZE / 1024), - global_page_state(NR_FREE_PAGES) * - (long)(PAGE_SIZE / 1024), - global_page_state(NR_FILE_PAGES) * - (long)(PAGE_SIZE / 1024), - (long)zcache_pages() * (long)(PAGE_SIZE / 1024), - sc->gfp_mask); - - if (lowmem_debug_level >= 2 && selected_oom_score_adj == 0) { - show_mem(SHOW_MEM_FILTER_NODES); - dump_tasks(NULL, NULL); - } - + other_free * (long)(PAGE_SIZE / 1024)); lowmem_deathpending_timeout = jiffies + HZ; - set_tsk_thread_flag(selected, TIF_MEMDIE); - send_sig(SIGKILL, selected, 0); rem += selected_tasksize; - rcu_read_unlock(); - /* give the system time to free up the memory */ - msleep_interruptible(20); - trace_almk_shrink(selected_tasksize, ret, - other_free, other_file, selected_oom_score_adj); - } else { - trace_almk_shrink(1, ret, other_free, other_file, 0); - rcu_read_unlock(); + } + + if (kill_one_more) { + selected = NULL; + kill_one_more = false; + goto again; } lowmem_print(4, "lowmem_scan %lu, %x, return %lu\n", sc->nr_to_scan, sc->gfp_mask, rem); - mutex_unlock(&scan_mutex); + rcu_read_unlock(); + return rem; } @@ -552,19 +226,45 @@ static struct shrinker lowmem_shrinker = { .seeks = DEFAULT_SEEKS * 16 }; -static int __init lowmem_init(void) + +/* + * when vmpressure >= vmpressure_level_critical(95), we will kill one more process + */ +static int lmk_vmpressure_notifier(struct notifier_block *nb, + unsigned long action, void *data) { - register_shrinker(&lowmem_shrinker); - vmpressure_notifier_register(&lmk_vmpr_nb); + unsigned long pressure = action; + + if (pressure >= 95) { + if (!kill_one_more) { + kill_one_more = true; + lowmem_print(1, "vmpressure %ld, set kill_one_more true\n", + pressure); + } + } else { + if (kill_one_more) { + kill_one_more = false; + lowmem_print(1, "vmpressure %ld, set kill_one_more false\n", + pressure); + } + } + return 0; } -static void __exit lowmem_exit(void) +static struct notifier_block lmk_vmpr_nb = { + .notifier_call = lmk_vmpressure_notifier, +}; + +static int __init lowmem_init(void) { - unregister_shrinker(&lowmem_shrinker); + register_shrinker(&lowmem_shrinker); + vmpressure_notifier_register(&lmk_vmpr_nb); + return 0; } +device_initcall(lowmem_init); -#ifdef CONFIG_ANDROID_LOW_MEMORY_KILLER_AUTODETECT_OOM_ADJ_VALUES +#ifdef CONFIG_CONVERT_ADJ_TO_SCORE_ADJ static short lowmem_oom_adj_to_oom_score_adj(short oom_adj) { if (oom_adj == OOM_ADJUST_MAX) @@ -641,8 +341,12 @@ static const struct kparam_array __param_arr_adj = { }; #endif +/* + * not really modular, but the easiest way to keep compat with existing + * bootargs behaviour is to continue using module_param here. + */ module_param_named(cost, lowmem_shrinker.seeks, int, S_IRUGO | S_IWUSR); -#ifdef CONFIG_ANDROID_LOW_MEMORY_KILLER_AUTODETECT_OOM_ADJ_VALUES +#ifdef CONFIG_CONVERT_ADJ_TO_SCORE_ADJ module_param_cb(adj, &lowmem_adj_array_ops, .arr = &__param_arr_adj, S_IRUGO | S_IWUSR); __MODULE_PARM_TYPE(adj, "array of short"); @@ -653,10 +357,4 @@ module_param_array_named(adj, lowmem_adj, short, &lowmem_adj_size, module_param_array_named(minfree, lowmem_minfree, uint, &lowmem_minfree_size, S_IRUGO | S_IWUSR); module_param_named(debug_level, lowmem_debug_level, uint, S_IRUGO | S_IWUSR); -module_param_named(lmk_fast_run, lmk_fast_run, int, S_IRUGO | S_IWUSR); - -module_init(lowmem_init); -module_exit(lowmem_exit); - -MODULE_LICENSE("GPL"); diff --git a/drivers/staging/android/memsw_state.c b/drivers/staging/android/memsw_state.c new file mode 100644 index 0000000000000..44bc39cbcca0c --- /dev/null +++ b/drivers/staging/android/memsw_state.c @@ -0,0 +1,306 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "memsw_state.h" + +#define memsw_freeram (global_page_state(NR_FREE_PAGES) - totalreserve_pages) +#define memsw_filepage (global_page_state(NR_FILE_PAGES) - total_swapcache_pages()) + +#define MEMSW_FREEMEM_KB ((memsw_freeram + memsw_filepage) << (PAGE_SHIFT - 10)) +#define MEMSW_FREESWAP_KB (get_nr_swap_pages() << (PAGE_SHIFT - 10)) +#define MEMSW_EXTRA_KB (16 << (PAGE_SHIFT - 10)) + +static uint32_t check_pending_times; + +static int memsw_dev_open(struct inode *inode, struct file *file) +{ + struct memsw_dev *memsw_dev; + struct memsw_reader *reader; + int ret, i = MINOR(inode->i_rdev); + + + memsw_dev = memsw_dev_get_w_check(i); + if (memsw_dev == NULL) + return -ENODEV; + + + if (!(file->f_mode & FMODE_READ)) + ret = -EBADF; + + ret = nonseekable_open(inode, file); + if (ret) + return ret; + + reader = kmalloc(sizeof(struct memsw_reader), GFP_KERNEL); + if (!reader) + return -ENOMEM; + + reader->dev = memsw_dev; + reader->version = 1; + reader->auth_rights = in_egroup_p(inode->i_gid) || capable(CAP_SYS_ADMIN); + INIT_LIST_HEAD(&reader->list); + + mutex_lock(&memsw_dev->mutex); + list_add_tail(&reader->list, &memsw_dev->reader_list); + mutex_unlock(&memsw_dev->mutex); + + file->private_data = reader; + + return 0; +} + +static inline void memsw_dev_update_data(struct memsw_dev *memsw_dev) +{ + mutex_lock(&memsw_dev->mutex); + (memsw_dev->memsw_data).current_freeram = MEMSW_FREEMEM_KB; + (memsw_dev->memsw_data).current_freeswap = MEMSW_FREESWAP_KB; + mutex_unlock(&memsw_dev->mutex); +} + +static inline int memsw_dev_event_pending(struct memsw_dev *memsw_dev) +{ + int pending = 0; + + mutex_lock(&memsw_dev->mutex); + if ((memsw_dev->memsw_data).mem_threshold >= MEMSW_FREEMEM_KB) { + (memsw_dev->memsw_data).low_mem_triggered = 1; + pending = 1; + } else { + (memsw_dev->memsw_data).low_mem_triggered = 0; + } + if (((memsw_dev->memsw_data).swap_threshold >= MEMSW_FREESWAP_KB) && (total_swap_pages != 0)) { + (memsw_dev->memsw_data).low_swap_triggered = 1; + pending = 1; + } else { + (memsw_dev->memsw_data).low_swap_triggered = 0; + } + mutex_unlock(&memsw_dev->mutex); + + return pending; +} + +static ssize_t memsw_dev_read(struct file *file, char __user *buf, + size_t count, loff_t *pos) +{ + ssize_t ret = 0; + struct memsw_reader *reader = file->private_data; + struct memsw_dev *memsw_dev = reader->dev; + + if (!(reader->auth_rights)) + return -EPERM; + + if (!memsw_dev_event_pending(memsw_dev) && (file->f_flags & O_NONBLOCK)) + return -EAGAIN; + + wait_event_interruptible(memsw_dev->wq, memsw_dev_event_pending(memsw_dev)); + + memsw_dev_update_data(memsw_dev); + if (copy_to_user(buf, &memsw_dev->memsw_data, sizeof(struct memsw_state_data))) + return -EFAULT; + + ret = sizeof(struct memsw_state_data); + + return ret; +} + +static unsigned int memsw_dev_poll(struct file *file, poll_table *wait) +{ + struct memsw_reader *reader = file->private_data; + struct memsw_dev *memsw_dev = reader->dev; + + poll_wait(file, &memsw_dev->wq, wait); + return (memsw_dev_event_pending(memsw_dev) ? (POLLIN | POLLRDNORM) : 0); +} + +static long memsw_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + long ret = -EINVAL; + struct memsw_reader *reader = file->private_data; + struct memsw_dev *memsw_dev = reader->dev; + void __user *argp = (void __user *) arg; + + if (!(reader->auth_rights)) + return -EPERM; + + mutex_lock(&memsw_dev->mutex); + + switch (cmd) { + case GET_MEM_THRESHOLD: + ret = copy_to_user(argp, &(memsw_dev->memsw_data.mem_threshold), sizeof(unsigned long)); + break; + case SET_MEM_THRESHOLD: + ret = copy_from_user(&(memsw_dev->memsw_data.mem_threshold), argp, sizeof(unsigned long)); + if (ret == 0) { + if ((memsw_dev->memsw_data).mem_threshold <= MEMSW_FREEMEM_KB) { + (memsw_dev->memsw_data).low_mem_triggered = 1; + wake_up_interruptible(&memsw_dev->wq); + } + } + break; + case GET_SWAP_THRESHOLD: + ret = copy_to_user(argp, &(memsw_dev->memsw_data.swap_threshold), sizeof(unsigned long)); + break; + case SET_SWAP_THRESHOLD: + ret = copy_from_user(&(memsw_dev->memsw_data.swap_threshold), argp, sizeof(unsigned long)); + if (ret == 0) { + if ((memsw_dev->memsw_data).swap_threshold <= MEMSW_FREESWAP_KB) { + (memsw_dev->memsw_data).low_swap_triggered = 1; + wake_up_interruptible(&memsw_dev->wq); + } + } + break; + case GET_MEMSW_DEV_VERSION: + ret = copy_to_user(argp, &(reader->version), sizeof(uint8_t)); + break; + case SET_MEMSW_DEV_VERSION: + ret = copy_from_user(&(reader->version), argp, sizeof(uint8_t)); + break; + } + + mutex_unlock(&memsw_dev->mutex); + + return ret; +} + +static int memsw_dev_release(struct inode *inode, struct file *file) +{ + struct memsw_reader *reader = file->private_data; + struct memsw_dev *memsw_dev = reader->dev; + + mutex_lock(&memsw_dev->mutex); + list_del(&reader->list); + mutex_unlock(&memsw_dev->mutex); + kfree(reader); + + return 0; +} + +static const struct file_operations memsw_dev_fops = { + .owner = THIS_MODULE, + .open = memsw_dev_open, + .read = memsw_dev_read, + .poll = memsw_dev_poll, + .unlocked_ioctl = memsw_dev_ioctl, + .compat_ioctl = memsw_dev_ioctl, + .release = memsw_dev_release, + .llseek = no_llseek, +}; + +static struct memsw_dev memsw_state_dev = { + .memsw_data = { 0 }, + .misc_dev = { + .minor = MISC_DYNAMIC_MINOR, + .name = "xiaomi_memsw_state", + .fops = &memsw_dev_fops, + .parent = NULL, + }, + .wq = __WAIT_QUEUE_HEAD_INITIALIZER(memsw_state_dev.wq), + .reader_list = LIST_HEAD_INIT(memsw_state_dev.reader_list), + .mutex = __MUTEX_INITIALIZER(memsw_state_dev.mutex), +}; + +struct memsw_dev *memsw_dev_get_wo_check(void) +{ + return &memsw_state_dev; +} + +struct memsw_dev *memsw_dev_get_w_check(int minor) +{ + if (memsw_state_dev.misc_dev.minor == minor) + return &memsw_state_dev; + else + return NULL; +} + +static inline int memsw_dev_check_pending(void) +{ + struct memsw_dev *memsw_dev = memsw_dev_get_wo_check(); + + if (memsw_dev_event_pending(memsw_dev)) + wake_up_interruptible(&memsw_dev->wq); + + return 0; +} + +DECLARE_WAIT_QUEUE_HEAD(kmemswchkd_wq); + +static void kmemsw_chkd_try_to_sleep(void) +{ + DEFINE_WAIT(wait); + prepare_to_wait(&kmemswchkd_wq, &wait, TASK_INTERRUPTIBLE); + if (!kthread_should_stop()) + schedule(); + finish_wait(&kmemswchkd_wq, &wait); +} + +static int kmemsw_chkd(void *data) +{ + while (!kthread_should_stop()) { + check_pending_times++; + memsw_dev_check_pending(); + kmemsw_chkd_try_to_sleep(); + } + return -EPERM; +} + +void wakeup_kmemsw_chkd(void) +{ + if (!waitqueue_active(&kmemswchkd_wq)) + return; + wake_up_interruptible(&kmemswchkd_wq); +} +EXPORT_SYMBOL(wakeup_kmemsw_chkd); + +static struct task_struct *kmemswchkd_ktp; +static int __init kmemswchkd_init(void) +{ + int ret = 0; + struct memsw_dev *memsw_dev = memsw_dev_get_wo_check(); + ret = misc_register(&memsw_dev->misc_dev); + if (ret < 0) { + printk(KERN_WARNING "misc register device 'memsw_state' failed: %d", ret); + goto err_out; + } + + if (kmemswchkd_ktp) + return -EPERM; + + + kmemswchkd_ktp = kthread_run(kmemsw_chkd, NULL, "kmemsw_chkd"); + if (IS_ERR(kmemswchkd_ktp)) { + printk(KERN_WARNING"Failed to start kmemswchkd thread.\n"); + kmemswchkd_ktp = NULL; + ret = -1; + } + +err_out: + return ret; +} + +static void __init kmemswchkd_exit(void) +{ + struct memsw_dev *memsw_dev = memsw_dev_get_wo_check(); + misc_deregister(&memsw_dev->misc_dev); + + if (kmemswchkd_ktp != NULL) { + kthread_stop(kmemswchkd_ktp); + kmemswchkd_ktp = NULL; + } +} + +module_param_named(check_times, check_pending_times, uint, S_IRUGO | S_IWUSR); + +module_init(kmemswchkd_init); +module_exit(kmemswchkd_exit); + +MODULE_LICENSE("GPL"); + diff --git a/drivers/staging/android/memsw_state.h b/drivers/staging/android/memsw_state.h new file mode 100644 index 0000000000000..8a24c256282d3 --- /dev/null +++ b/drivers/staging/android/memsw_state.h @@ -0,0 +1,45 @@ +#ifndef _MEMSW_STATE_H +#define _MEMSW_STATE_H + +#include +#include + +struct memsw_state_data { + uint8_t low_mem_triggered; + uint8_t low_swap_triggered; + unsigned long mem_threshold; + unsigned long swap_threshold; + unsigned long current_freeram; + unsigned long current_freeswap; +}; + +struct memsw_dev { + struct memsw_state_data memsw_data; + struct miscdevice misc_dev; + wait_queue_head_t wq; + struct list_head reader_list; + struct mutex mutex; /* protects reader_list */ +}; + +struct memsw_reader { + struct memsw_dev *dev; /* associated device*/ + struct list_head list; /* node in memsw_dev.reader_list*/ + uint8_t auth_rights; + uint8_t version; +}; + +struct memsw_dev *memsw_dev_get_wo_check(void); +struct memsw_dev *memsw_dev_get_w_check(int minor); +void wakeup_kmemsw_chkd(void); + +#define __MEMSWIO 0xAE + +#define GET_MEM_THRESHOLD _IO(__MEMSWIO, 0x11) +#define SET_MEM_THRESHOLD _IO(__MEMSWIO, 0x12) +#define GET_SWAP_THRESHOLD _IO(__MEMSWIO, 0x13) +#define SET_SWAP_THRESHOLD _IO(__MEMSWIO, 0x14) +#define GET_MEMSW_DEV_VERSION _IO(__MEMSWIO, 0x15) +#define SET_MEMSW_DEV_VERSION _IO(__MEMSWIO, 0x16) + +#endif + diff --git a/drivers/staging/android/uapi/binder.h b/drivers/staging/android/uapi/binder.h index dba4cef3a8d35..712314f2e9993 100644 --- a/drivers/staging/android/uapi/binder.h +++ b/drivers/staging/android/uapi/binder.h @@ -32,11 +32,60 @@ enum { BINDER_TYPE_HANDLE = B_PACK_CHARS('s', 'h', '*', B_TYPE_LARGE), BINDER_TYPE_WEAK_HANDLE = B_PACK_CHARS('w', 'h', '*', B_TYPE_LARGE), BINDER_TYPE_FD = B_PACK_CHARS('f', 'd', '*', B_TYPE_LARGE), + BINDER_TYPE_FDA = B_PACK_CHARS('f', 'd', 'a', B_TYPE_LARGE), + BINDER_TYPE_PTR = B_PACK_CHARS('p', 't', '*', B_TYPE_LARGE), }; -enum { +/** + * enum flat_binder_object_shifts: shift values for flat_binder_object_flags + * @FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT: shift for getting scheduler policy. + * + */ +enum flat_binder_object_shifts { + FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT = 9, +}; + +/** + * enum flat_binder_object_flags - flags for use in flat_binder_object.flags + */ +enum flat_binder_object_flags { + /** + * @FLAT_BINDER_FLAG_PRIORITY_MASK: bit-mask for min scheduler priority + * + * These bits can be used to set the minimum scheduler priority + * at which transactions into this node should run. Valid values + * in these bits depend on the scheduler policy encoded in + * @FLAT_BINDER_FLAG_SCHED_POLICY_MASK. + * + * For SCHED_NORMAL/SCHED_BATCH, the valid range is between [-20..19] + * For SCHED_FIFO/SCHED_RR, the value can run between [1..99] + */ FLAT_BINDER_FLAG_PRIORITY_MASK = 0xff, + /** + * @FLAT_BINDER_FLAG_ACCEPTS_FDS: whether the node accepts fds. + */ FLAT_BINDER_FLAG_ACCEPTS_FDS = 0x100, + /** + * @FLAT_BINDER_FLAG_SCHED_POLICY_MASK: bit-mask for scheduling policy + * + * These two bits can be used to set the min scheduling policy at which + * transactions on this node should run. These match the UAPI + * scheduler policy values, eg: + * 00b: SCHED_NORMAL + * 01b: SCHED_FIFO + * 10b: SCHED_RR + * 11b: SCHED_BATCH + */ + FLAT_BINDER_FLAG_SCHED_POLICY_MASK = + 3U << FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT, + + /** + * @FLAT_BINDER_FLAG_INHERIT_RT: whether the node inherits RT policy + * + * Only when set, calls into this node will inherit a real-time + * scheduling policy from the caller (for synchronous transactions). + */ + FLAT_BINDER_FLAG_INHERIT_RT = 0x800, }; #ifdef BINDER_IPC_32BIT @@ -47,6 +96,14 @@ typedef __u64 binder_size_t; typedef __u64 binder_uintptr_t; #endif +/** + * struct binder_object_header - header shared by all binder metadata objects. + * @type: type of the object + */ +struct binder_object_header { + __u32 type; +}; + /* * This is the flattened representation of a Binder object for transfer * between processes. The 'offsets' supplied as part of a binder transaction @@ -55,9 +112,8 @@ typedef __u64 binder_uintptr_t; * between processes. */ struct flat_binder_object { - /* 8 bytes for large_flat_header. */ - __u32 type; - __u32 flags; + struct binder_object_header hdr; + __u32 flags; /* 8 bytes of data. */ union { @@ -69,6 +125,86 @@ struct flat_binder_object { binder_uintptr_t cookie; }; +/** + * struct binder_fd_object - describes a filedescriptor to be fixed up. + * @hdr: common header structure + * @pad_flags: padding to remain compatible with old userspace code + * @pad_binder: padding to remain compatible with old userspace code + * @fd: file descriptor + * @cookie: opaque data, used by user-space + */ +struct binder_fd_object { + struct binder_object_header hdr; + __u32 pad_flags; + union { + binder_uintptr_t pad_binder; + __u32 fd; + }; + + binder_uintptr_t cookie; +}; + +/* struct binder_buffer_object - object describing a userspace buffer + * @hdr: common header structure + * @flags: one or more BINDER_BUFFER_* flags + * @buffer: address of the buffer + * @length: length of the buffer + * @parent: index in offset array pointing to parent buffer + * @parent_offset: offset in @parent pointing to this buffer + * + * A binder_buffer object represents an object that the + * binder kernel driver can copy verbatim to the target + * address space. A buffer itself may be pointed to from + * within another buffer, meaning that the pointer inside + * that other buffer needs to be fixed up as well. This + * can be done by setting the BINDER_BUFFER_FLAG_HAS_PARENT + * flag in @flags, by setting @parent buffer to the index + * in the offset array pointing to the parent binder_buffer_object, + * and by setting @parent_offset to the offset in the parent buffer + * at which the pointer to this buffer is located. + */ +struct binder_buffer_object { + struct binder_object_header hdr; + __u32 flags; + binder_uintptr_t buffer; + binder_size_t length; + binder_size_t parent; + binder_size_t parent_offset; +}; + +enum { + BINDER_BUFFER_FLAG_HAS_PARENT = 0x01, +}; + +/* struct binder_fd_array_object - object describing an array of fds in a buffer + * @hdr: common header structure + * @pad: padding to ensure correct alignment + * @num_fds: number of file descriptors in the buffer + * @parent: index in offset array to buffer holding the fd array + * @parent_offset: start offset of fd array in the buffer + * + * A binder_fd_array object represents an array of file + * descriptors embedded in a binder_buffer_object. It is + * different from a regular binder_buffer_object because it + * describes a list of file descriptors to fix up, not an opaque + * blob of memory, and hence the kernel needs to treat it differently. + * + * An example of how this would be used is with Android's + * native_handle_t object, which is a struct with a list of integers + * and a list of file descriptors. The native_handle_t struct itself + * will be represented by a struct binder_buffer_objct, whereas the + * embedded list of file descriptors is represented by a + * struct binder_fd_array_object with that binder_buffer_object as + * a parent. + */ +struct binder_fd_array_object { + struct binder_object_header hdr; + __u32 pad; + binder_size_t num_fds; + binder_size_t parent; + binder_size_t parent_offset; +}; + /* * On 64-bit platforms where user code may run in 32-bits the driver must * translate the buffer (and local binder) addresses appropriately. @@ -96,6 +232,19 @@ struct binder_version { #define BINDER_CURRENT_PROTOCOL_VERSION 8 #endif +/* + * Use with BINDER_GET_NODE_DEBUG_INFO, driver reads ptr, writes to all fields. + * Set ptr to NULL for the first call to get the info for the first node, and + * then repeat the call passing the previously returned value to get the next + * nodes. ptr will be 0 when there are no more nodes. + */ +struct binder_node_debug_info { + binder_uintptr_t ptr; + binder_uintptr_t cookie; + __u32 has_strong_ref; + __u32 has_weak_ref; +}; + #define BINDER_WRITE_READ _IOWR('b', 1, struct binder_write_read) #define BINDER_SET_IDLE_TIMEOUT _IOW('b', 3, __s64) #define BINDER_SET_MAX_THREADS _IOW('b', 5, __u32) @@ -103,6 +252,7 @@ struct binder_version { #define BINDER_SET_CONTEXT_MGR _IOW('b', 7, __s32) #define BINDER_THREAD_EXIT _IOW('b', 8, __s32) #define BINDER_VERSION _IOWR('b', 9, struct binder_version) +#define BINDER_GET_NODE_DEBUG_INFO _IOWR('b', 11, struct binder_node_debug_info) /* * NOTE: Two special error codes you should check for when calling @@ -161,6 +311,11 @@ struct binder_transaction_data { } data; }; +struct binder_transaction_data_sg { + struct binder_transaction_data transaction_data; + binder_size_t buffers_size; +}; + struct binder_ptr_cookie { binder_uintptr_t ptr; binder_uintptr_t cookie; @@ -345,6 +500,12 @@ enum binder_driver_command_protocol { /* * void *: cookie */ + + BC_TRANSACTION_SG = _IOW('c', 17, struct binder_transaction_data_sg), + BC_REPLY_SG = _IOW('c', 18, struct binder_transaction_data_sg), + /* + * binder_transaction_data_sg: the sent command. + */ }; #endif /* _UAPI_LINUX_BINDER_H */ diff --git a/drivers/staging/ktrace/Kconfig b/drivers/staging/ktrace/Kconfig new file mode 100644 index 0000000000000..9a1cb2f7d7024 --- /dev/null +++ b/drivers/staging/ktrace/Kconfig @@ -0,0 +1,6 @@ +config KTRACE + bool "enable ktrace" + select DEBUG_FS + default y + help + add kernel trace, such as slow path time, direct reclaim time diff --git a/drivers/staging/ktrace/Makefile b/drivers/staging/ktrace/Makefile new file mode 100644 index 0000000000000..29399e8471a0a --- /dev/null +++ b/drivers/staging/ktrace/Makefile @@ -0,0 +1,3 @@ +obj-$(CONFIG_KTRACE) += ktrace_main.o ktrace_mm.o ktrace_print.o \ + ktrace_queue.o ktrace_sched.o ktrace_event.o \ + ktrace_binder.o ktrace_cpufreq.o diff --git a/drivers/staging/ktrace/ktrace_binder.c b/drivers/staging/ktrace/ktrace_binder.c new file mode 100644 index 0000000000000..efc4df119d3f1 --- /dev/null +++ b/drivers/staging/ktrace/ktrace_binder.c @@ -0,0 +1,216 @@ +#define pr_fmt(fmt) "ktrace : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BINDER_ITEMS_READ_MAX DEFAULT_ITEMS_PER_READ + +struct binder_entry { + long long time_stamp_ns; + unsigned char type; + pid_t pid; + unsigned int time_us; +}; + +struct binder_stats { + atomic_t count; + u64 time; /* us */ +}; + +struct ktrace_binder { + struct ktrace_queue *q; + struct dentry *dir; + + void *buf; + int entry_size; + int max; + + unsigned int match_all_pid; + unsigned int filter[KTRACE_BINDER_TYPE_NR]; + struct binder_stats stats[KTRACE_BINDER_TYPE_NR]; +}; + +static struct ktrace_binder __binder = { + .filter = { + [KTRACE_BINDER_TYPE_SAMPLE1] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE2] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE3] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE4] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE5] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE6] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE7] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE8] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE9] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE10] = MS_TO_US(1), + + /* Do not change below values */ + [KTRACE_BINDER_TYPE_TRANSACTION] = MS_TO_US(1), + } +}; + +static const char *const binder_event_name[KTRACE_BINDER_TYPE_NR] = { + "sam_1", + "sam_2", + "sam_3", + "sam_4", + "sam_5", + "sam_6", + "sam_7", + "sam_8", + "sam_9", + "sam_10", + + "transaction", +}; + +void ktrace_add_binder_event(unsigned char type, u64 time_stamp, u64 delta) +{ + struct ktrace_binder *binder = &__binder; + struct ktrace_queue *q = binder->q; + struct binder_entry e; + u64 delta_us = delta >> 10; /* ns => us */ + pid_t pid = current->pid; + + if (unlikely(!binder->buf || type >= KTRACE_BINDER_TYPE_NR)) + return; + + if (likely(delta_us < binder->filter[type])) + return; + + if (!binder->match_all_pid && !ktrace_sched_match_pid(pid)) + return; + + e.time_stamp_ns = time_stamp; + e.type = type; + e.pid = pid; + e.time_us = (unsigned int)delta_us; + + atomic_inc(&binder->stats[type].count); + binder->stats[type].time += delta_us; + + ktrace_tryadd_queue(q, &e); +} + +static int binder_show_entry(struct seq_file *m, void *entry, bool debug) +{ + struct binder_entry *e = (struct binder_entry *)entry; + int ret; + + ret = seq_printf(m, "%lld %5d <%s> %d.%03d ms\n", + e->time_stamp_ns, e->pid, + binder_event_name[e->type], + e->time_us / 1000, e->time_us % 1000); + + return ret; +} + +KTRACE_QUEUE_RO_SINGLE(binder); + +static int binder_stats_show(struct seq_file *m, void *v) +{ + struct ktrace_binder *binder = (struct ktrace_binder *)m->private; + int i; + + seq_puts(m, "statatistics:\n"); + for (i = 0; i < KTRACE_BINDER_TYPE_NR; i++) { + seq_printf(m, " %-32s %6d %llu ms\n", binder_event_name[i], + atomic_read(&binder->stats[i].count), + binder->stats[i].time >> 10); + } + + return 0; +} +KTRACE_ENTRY_RO_SINGLE(binder_stats); + +static int binder_reset_write(void *data, u64 val) +{ + struct ktrace_queue *q = data; + struct ktrace_binder *binder = q->priv; + int clean = val; + int i; + + if (clean) { + ktrace_reset_queue(q); + + for (i = 0; i < KTRACE_BINDER_TYPE_NR; i++) { + atomic_set(&binder->stats[i].count, 0); + binder->stats[i].time = 0; + } + } + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(binder_reset, NULL, binder_reset_write, "%llu\n"); + +int __init ktrace_binder_init(struct dentry *dir, struct ktrace_queue *q) +{ + struct ktrace_binder *binder = &__binder; + void *buf; + int i; + + BUILD_BUG_ON(sizeof(binder_event_name) / sizeof(binder_event_name[0]) + != KTRACE_BINDER_TYPE_NR); + + memset(binder, sizeof(struct ktrace_binder), 0); + + buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!buf) + return -ENOMEM; + binder->q = q; + + binder->entry_size = sizeof(struct binder_entry); + binder->max = (PAGE_SIZE << 1) / binder->entry_size; + + binder->dir = debugfs_create_dir("binder", dir); + + ktrace_init_queue(q, binder->dir, binder, buf, binder->entry_size, binder->max, + BINDER_ITEMS_READ_MAX, + binder_show_entry); + + if (binder->dir) { + debugfs_create_file("trace", + S_IFREG | S_IRUGO, + binder->dir, + q, + &binder_fops); + + debugfs_create_bool("match_all_pids", + S_IFREG | S_IRUGO | S_IWUSR , + binder->dir, + &binder->match_all_pid); + + debugfs_create_file("stats", + S_IFREG | S_IRUGO, + binder->dir, + binder, + &binder_stats_fops); + + for (i = 0; i < KTRACE_BINDER_TYPE_NR; i++) { + char name[32]; + snprintf(name, sizeof(name) - 1, "filter_%s", binder_event_name[i]); + + debugfs_create_u32(name, + S_IFREG | S_IRUGO | S_IWUSR, + binder->dir, + &binder->filter[i]); + } + + debugfs_create_file("reset", S_IWUSR, binder->dir, q, + &binder_reset); + } + + smp_mb(); + binder->buf = buf; + pr_info("binder ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/ktrace/ktrace_cpufreq.c b/drivers/staging/ktrace/ktrace_cpufreq.c new file mode 100644 index 0000000000000..07fe470d809e3 --- /dev/null +++ b/drivers/staging/ktrace/ktrace_cpufreq.c @@ -0,0 +1,316 @@ +#define pr_fmt(fmt) "ktrace : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PROC_HASH_BITS 10 +DECLARE_HASHTABLE(proc_hash, PROC_HASH_BITS); + +#define CPUFREQ_ITEMS_READ_MAX DEFAULT_ITEMS_PER_READ +#define KTRACE_CPUFREQ_MITIGATED_NR 2 + +struct cpufreq_entry { + s64 time_stamp_ns; + unsigned char type; + pid_t pid; + unsigned int cpu; + unsigned int target_freq; + unsigned int max; +}; + +struct cpufreq_mitigated { + bool ismitigated; + unsigned int cpu; + unsigned int max; + char comm[TASK_COMM_LEN]; +}; + +struct proc_entry { + pid_t pid; + char comm[TASK_COMM_LEN]; + unsigned long long load; + struct hlist_node hash; +}; + +struct ktrace_cpufreq { + struct ktrace_queue *q; + struct dentry *dir; + + void *buf; + int entry_size; + int max; + struct cpufreq_mitigated mitigated[KTRACE_CPUFREQ_MITIGATED_NR]; +}; + +static struct ktrace_cpufreq __cf; + +static const char const *cpufreq_event_name[KTRACE_CPUFREQ_TYPE_NR] = { + "sam_1", + "sam_2", + "sam_3", + "sam_4", + "sam_5", + "sam_6", + "sam_7", + "sam_8", + "sam_9", + "sam_10", + + "mitigation", + "unpluged", +}; + +static int cpufreq_show_entry(struct seq_file *m, void *entry, bool debug) +{ + struct cpufreq_entry *e = (struct cpufreq_entry *)entry; + int ret; + + if (e->type == KTRACE_CPUFREQ_TYPE_MITIGATION) { + if (debug) { + ret = seq_printf(m, "%lld %5d <%s> %d ms %u %u %u\n", + e->time_stamp_ns, e->pid, + cpufreq_event_name[e->type], -1, + e->cpu, e->target_freq, e->max); + } else { + ret = seq_printf(m, "%lld %5d <%s> %d ms %u %u %u\n", + e->time_stamp_ns, e->pid, + cpufreq_event_name[e->type], -1, + e->cpu, e->target_freq, e->max); + } + } else { + ret = seq_printf(m, "%lld %5d <%s> %d ms %u\n", + e->time_stamp_ns, e->pid, + cpufreq_event_name[e->type], -1, + e->cpu); + } + + return ret; +} + +KTRACE_QUEUE_RO_SINGLE(cpufreq); + +void ktrace_add_cpufreq_event(unsigned char type, pid_t pid, u64 time_stamp, + unsigned int cpu, unsigned int target_freq, unsigned int max) +{ + struct ktrace_cpufreq *cpufreq = &__cf; + struct ktrace_queue *q = cpufreq->q; + struct cpufreq_entry e; + + if (unlikely(!cpufreq->buf)) + return; + + if (!ktrace_sched_match_pid(pid)) + return; + + e.time_stamp_ns = time_stamp; + e.type = type; + e.pid = pid; + e.cpu = cpu; + e.target_freq = target_freq; + e.max = max; + + ktrace_tryadd_queue(q, &e); +} + +void ktrace_cpufreq_set_mitigated(char *comm, unsigned int cpu, + const struct cpumask *related_cpus, unsigned int max) +{ + struct ktrace_cpufreq *cpufreq = &__cf; + int i; + + for (i = 0; i < KTRACE_CPUFREQ_MITIGATED_NR; i++) { + struct cpufreq_mitigated *cm = &cpufreq->mitigated[i]; + + if (cm->cpu == -1 || cpumask_test_cpu(cm->cpu, related_cpus) != 0) { + if (max == 0) { + + cm->ismitigated = false; + cm->max = UINT_MAX; + } else if (max < cm->max) { + + + cm->ismitigated = true; + cm->cpu = cpu; + cm->max = max; + memcpy(cm->comm, comm, TASK_COMM_LEN); + } + break; + } + } +} + +static int cpufreq_mitigated_show(struct seq_file *m, void *v) +{ + struct ktrace_cpufreq *cpufreq = (struct ktrace_cpufreq *)m->private; + int i; + + for (i = 0; i < KTRACE_CPUFREQ_MITIGATED_NR; i++) { + struct cpufreq_mitigated *cm = &cpufreq->mitigated[i]; + if (cm->ismitigated) { + seq_printf(m, "%u %u <%s>\n", + cm->cpu, cm->max, cm->comm); + } + } + + return 0; +} + +KTRACE_ENTRY_RO_SINGLE(cpufreq_mitigated); + +static void __init cpufreq_mitigated_init(struct ktrace_cpufreq *cpufreq) +{ + int i; + + for (i = 0; i < KTRACE_CPUFREQ_MITIGATED_NR; i++) { + struct cpufreq_mitigated *cm = &cpufreq->mitigated[i]; + cm->ismitigated = false; + cm->cpu = -1; + cm->max = UINT_MAX; + } +} + +void ktrace_cpufreq_update_history(struct task_struct *p, u32 runtime, int samples, u32 scale_runtime) +{ + u32 load = runtime; + + if (samples) + load += samples * scale_runtime; + + p->ravg.proc_load += load; +} + +static inline struct proc_entry *find_proc_entry(pid_t pid) +{ + struct proc_entry *proc_entry; + hash_for_each_possible(proc_hash, proc_entry, hash, pid) { + if (proc_entry->pid == pid) + return proc_entry; + } + return NULL; +} + +static inline struct proc_entry *find_or_register_proc(pid_t pid, char *comm) +{ + struct proc_entry *proc_entry; + + proc_entry = find_proc_entry(pid); + if (proc_entry) + return proc_entry; + + proc_entry = kzalloc(sizeof(struct proc_entry), GFP_ATOMIC); + if (!proc_entry) + return NULL; + + proc_entry->pid = pid; + memcpy(proc_entry->comm, comm, TASK_COMM_LEN); + proc_entry->load = 0; + + hash_add(proc_hash, &proc_entry->hash, pid); + + return proc_entry; +} + +static int cpufreq_procload_show(struct seq_file *m, void *v) +{ + struct proc_entry *proc_entry; + struct task_struct *task, *temp; + struct hlist_node *tmp; + unsigned long bkt; + + read_lock(&tasklist_lock); + do_each_thread(temp, task) { + proc_entry = find_or_register_proc(task->tgid, task->group_leader->comm); + + if (!proc_entry) { + pr_err("%s: failed to find the proc_entry for pid %d\n", + __func__, task->tgid); + read_unlock(&tasklist_lock); + return -ENOMEM; + } + + proc_entry->load += task->ravg.proc_load; + + } while_each_thread(temp, task); + read_unlock(&tasklist_lock); + + hash_for_each_safe(proc_hash, bkt, tmp, proc_entry, hash) { + if (proc_entry->load > 0) { + seq_printf(m, "%d %s %llu\n", proc_entry->pid, + proc_entry->comm, proc_entry->load); + } + hash_del(&proc_entry->hash); + kfree(proc_entry); + } + + return 0; + +} + +KTRACE_ENTRY_RO_SINGLE(cpufreq_procload); + +int __init ktrace_cpufreq_init(struct dentry *dir, struct ktrace_queue *q) +{ + struct ktrace_cpufreq *cpufreq = &__cf; + void *buf; + + hash_init(proc_hash); + + BUILD_BUG_ON(sizeof(cpufreq_event_name) / sizeof(cpufreq_event_name[0]) + != KTRACE_CPUFREQ_TYPE_NR); + + buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!buf) + return -ENOMEM; + cpufreq->q = q; + + cpufreq->entry_size = sizeof(struct cpufreq_entry); + cpufreq->max = (PAGE_SIZE << 1) / cpufreq->entry_size; + + cpufreq_mitigated_init(cpufreq); + + cpufreq->dir = debugfs_create_dir("cpufreq", dir); + + ktrace_init_queue(q, cpufreq->dir, cpufreq, buf, cpufreq->entry_size, cpufreq->max, + CPUFREQ_ITEMS_READ_MAX, + cpufreq_show_entry); + + if (cpufreq->dir) { + debugfs_create_file("trace", + S_IFREG | S_IRUGO, + cpufreq->dir, + q, + &cpufreq_fops); + + debugfs_create_file("mitigated", + S_IFREG | S_IRUGO, + cpufreq->dir, + cpufreq, + &cpufreq_mitigated_fops); + + debugfs_create_file("procload", + S_IFREG | S_IRUGO, + cpufreq->dir, + cpufreq, + &cpufreq_procload_fops); + } + + smp_mb(); + cpufreq->buf = buf; + + pr_info("cpufreq ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/ktrace/ktrace_event.c b/drivers/staging/ktrace/ktrace_event.c new file mode 100644 index 0000000000000..a1a2f9765ddaf --- /dev/null +++ b/drivers/staging/ktrace/ktrace_event.c @@ -0,0 +1,133 @@ + +#define pr_fmt(fmt) "ktrace : " fmt + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +struct event_entry { + atomic64_t created_count; + atomic64_t deleted_count; +}; + +struct ktrace_event { + struct dentry *dir; + + struct event_entry entry[KTRACE_EVENT_NR]; + +}; + +static const char const *event_str[KTRACE_EVENT_NR] = { + "event-1", + "event-2", + "event-3", + "event-4", + "event-5", + "event-6", + "event-7", + "event-8", + "event-9", + "event-10", + + "event-11", + "event-12", + "event-13", + "event-14", + "event-15", + "event-16", + "event-17", + "event-18", + "event-19", + "event-20", +}; + + +static struct ktrace_event __event; + +void ktrace_event_inc(unsigned char type) +{ + struct ktrace_event *event = &__event; + struct event_entry *ee = &event->entry[type]; + + atomic_long_inc(&ee->created_count); + + return; +} + +void ktrace_event_dec(unsigned char type) +{ + struct ktrace_event *event = &__event; + struct event_entry *ee = &event->entry[type]; + + atomic_long_inc(&ee->deleted_count); + + return; +} + +void ktrace_event_add(unsigned char type, int i) +{ + struct ktrace_event *event = &__event; + struct event_entry *ee = &event->entry[type]; + + atomic_long_add(i, &ee->created_count); + + return; +} + +void ktrace_event_sub(unsigned char type, int i) +{ + struct ktrace_event *event = &__event; + struct event_entry *ee = &event->entry[type]; + + atomic_long_add(i, &ee->deleted_count); + + return; +} + +static int event_stats_show(struct seq_file *m, void *v) +{ + struct ktrace_event *event = m->private; + int i; + + seq_puts(m, "event stats:\n"); + + for (i = 0; i < KTRACE_EVENT_NR; i++) { + long created = atomic_long_read(&event->entry[i].created_count); + long deleted = atomic_long_read(&event->entry[i].deleted_count); + seq_printf(m, " %-20s %ld - %ld = %ld\n", event_str[i], + created, deleted, created - deleted); + } + + return 0; +} + +KTRACE_ENTRY_RO_SINGLE(event_stats); + +int __init ktrace_event_init(struct dentry *dir) +{ + struct ktrace_event *event = &__event; + + memset(event, sizeof(struct ktrace_event), 0); + + event->dir = debugfs_create_dir("event", dir); + + if (event->dir) { + debugfs_create_file("stats", + S_IFREG | S_IRUGO, + event->dir, + event, + &event_stats_fops); + } + + pr_info("event ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/ktrace/ktrace_main.c b/drivers/staging/ktrace/ktrace_main.c new file mode 100644 index 0000000000000..f1296b9e2b79e --- /dev/null +++ b/drivers/staging/ktrace/ktrace_main.c @@ -0,0 +1,52 @@ + +#define pr_fmt(fmt) "ktrace : " fmt + +#include +#include +#include +#include +#include +#include + +static struct ktrace __kt; + +struct ktrace *get_ktrace(void) +{ + return &__kt; +} + +static int __init ktrace_init(void) +{ + struct ktrace *kt = get_ktrace(); + + if (!debugfs_initialized()) { + pr_warn("debugfs not available, stat dir not created\n"); + return -ENOENT; + } + kt->dir = debugfs_create_dir("ktrace", NULL); + if (!kt->dir) { + pr_err("debugfs 'ktrace' stat dir creation failed\n"); + return -ENOMEM ; + } + + ktrace_print_init(kt->dir, &kt->queue[QUEUE_STR]); + + ktrace_event_init(kt->dir); + + ktrace_mm_init(kt->dir, &kt->queue[QUEUE_MM]); + + ktrace_sched_init(kt->dir, &kt->queue[QUEUE_SCHED]); + + ktrace_binder_init(kt->dir, &kt->queue[QUEUE_BINDER]); + + ktrace_cpufreq_init(kt->dir, &kt->queue[QUEUE_CPUFREQ]); + + pr_info("ktrace init OK\n"); + + return 0; +} + +fs_initcall(ktrace_init); + +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_AUTHOR("Cai Liu "); diff --git a/drivers/staging/ktrace/ktrace_mm.c b/drivers/staging/ktrace/ktrace_mm.c new file mode 100644 index 0000000000000..b033ebdac5d1c --- /dev/null +++ b/drivers/staging/ktrace/ktrace_mm.c @@ -0,0 +1,284 @@ + +#define pr_fmt(fmt) "ktrace : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MM_ITEMS_READ_MAX DEFAULT_ITEMS_PER_READ + +struct mm_entry { + long long time_stamp_ns; + unsigned char type; + pid_t pid; + unsigned int time_us; +}; + +struct mm_stats { + atomic_t count; + u64 time; /* us */ +}; + +struct ktrace_mm { + struct ktrace_queue *q; + struct dentry *dir; + + void *buf; + int entry_size; + int max; + + unsigned int match_all_pid; + unsigned int filter[KTRACE_MM_TYPE_NR]; + struct mm_stats stats[KTRACE_MM_TYPE_NR]; +}; + +static struct ktrace_mm __mm = { + .filter = { + [KTRACE_MM_TYPE_SAMPLE1] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE2] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE3] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE4] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE5] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE6] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE7] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE8] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE9] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE10] = MS_TO_US(1), + + /* Do not change below values */ + [KTRACE_MM_TYPE_SLOW_PATH] = MS_TO_US(1), + [KTRACE_MM_TYPE_COMPACT] = MS_TO_US(1), + [KTRACE_MM_TYPE_DIRECT_RECLAIM] = MS_TO_US(1), + } +}; + +static const char *const mm_event_name[KTRACE_MM_TYPE_NR] = { + "sam_1", + "sam_2", + "sam_3", + "sam_4", + "sam_5", + "sam_6", + "sam_7", + "sam_8", + "sam_9", + "sam_10", + + "slow_path", + "compact", + "direct_reclaim", +}; + +void ktrace_add_mm_event(unsigned char type, u64 time_stamp, u64 delta) +{ + struct ktrace_mm *mm = &__mm; + struct ktrace_queue *q = mm->q; + struct mm_entry e; + u64 delta_us = delta >> 10; /* ns => us */ + pid_t pid = current->pid; + + if (unlikely(!mm->buf || type >= KTRACE_MM_TYPE_NR)) + return; + + if (!mm->match_all_pid && !ktrace_sched_match_pid(pid)) + return; + + if (likely(delta_us < mm->filter[type])) + return; + + e.time_stamp_ns = time_stamp; + e.type = type; + e.pid = pid; + e.time_us = (unsigned int)delta_us; + + atomic_inc(&mm->stats[type].count); + mm->stats[type].time += delta_us; + + ktrace_tryadd_queue(q, &e); +} + +static int mm_show_entry(struct seq_file *m, void *entry, bool debug) +{ + struct mm_entry *e = (struct mm_entry *)entry; + int ret; + + ret = seq_printf(m, "%lld %5d <%s> %d.%03d ms\n", + e->time_stamp_ns, e->pid, + mm_event_name[e->type], + e->time_us / 1000, e->time_us % 1000); + + return ret; + + return 0; +} + +KTRACE_QUEUE_RO_SINGLE(mm); + +static int mm_fragment_show(struct seq_file *m, void *v) +{ + int nid; + unsigned int order; + + /* Flush pending updates to the LRU lists */ + lru_add_drain_all(); + + seq_printf(m, "%-15s ", "fragmentation "); + for (order = 0; order < MAX_ORDER; ++order) + seq_printf(m, "%6d ", order); + seq_putc(m, '\n'); + + for_each_online_node(nid) { + pg_data_t *pgdat = NODE_DATA(nid); + int zoneid; + + if (!node_state(pgdat->node_id, N_MEMORY)) + continue; + + for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) { + struct zone *zone = &pgdat->node_zones[zoneid]; + int fragindex; + unsigned long flags; + + if (!populated_zone(zone)) + continue; + + seq_printf(m, "Node %d, zone %8s ", + pgdat->node_id, zone->name); + + if (!spin_trylock_irqsave(&zone->lock, flags)) + return 0; + + for (order = 0; order < MAX_ORDER; order++) { + fragindex = fragmentation_index(zone, order); + if (fragindex == -1000) { + seq_printf(m, "%6s ", "ok"); + } else { + seq_printf(m, "%6d ", fragindex); + } + } + seq_putc(m, '\n'); + spin_unlock_irqrestore(&zone->lock, flags); + } + } + + return 0; +} + +KTRACE_ENTRY_RO_SINGLE(mm_fragment); + +static int mm_stats_show(struct seq_file *m, void *v) +{ + struct ktrace_mm *mm = (struct ktrace_mm *)m->private; + int i; + + seq_puts(m, "statatistics:\n"); + for (i = 0; i < KTRACE_MM_TYPE_NR; i++) { + seq_printf(m, " %-32s %6d %llu ms\n", mm_event_name[i], + atomic_read(&mm->stats[i].count), + mm->stats[i].time >> 10); + } + + return 0; +} +KTRACE_ENTRY_RO_SINGLE(mm_stats); + +static int mm_reset_write(void *data, u64 val) +{ + struct ktrace_queue *q = data; + struct ktrace_mm *mm = q->priv; + int clean = val; + int i; + + if (clean) { + ktrace_reset_queue(q); + + for (i = 0; i < KTRACE_MM_TYPE_NR; i++) { + atomic_set(&mm->stats[i].count, 0); + mm->stats[i].time = 0; + } + } + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(mm_reset, NULL, mm_reset_write, "%llu\n"); + +int __init ktrace_mm_init(struct dentry *dir, struct ktrace_queue *q) +{ + struct ktrace_mm *mm = &__mm; + void *buf; + int i; + + BUILD_BUG_ON(sizeof(mm_event_name) / sizeof(mm_event_name[0]) + != KTRACE_MM_TYPE_NR); + + memset(mm, sizeof(struct ktrace_mm), 0); + + buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!buf) + return -ENOMEM; + mm->q = q; + + mm->entry_size = sizeof(struct mm_entry); + mm->max = (PAGE_SIZE << 1) / mm->entry_size; + + mm->dir = debugfs_create_dir("mm", dir); + + ktrace_init_queue(q, mm->dir, mm, buf, mm->entry_size, mm->max, + MM_ITEMS_READ_MAX, + mm_show_entry); + + if (mm->dir) { + debugfs_create_file("trace", + S_IFREG | S_IRUGO, + mm->dir, + q, + &mm_fops); + + debugfs_create_bool("match_all_pids", + S_IFREG | S_IRUGO | S_IWUSR , + mm->dir, + &mm->match_all_pid); + + debugfs_create_file("fragmentation", + S_IFREG | S_IRUGO, + mm->dir, + q, + &mm_fragment_fops); + + debugfs_create_file("stats", + S_IFREG | S_IRUGO, + mm->dir, + mm, + &mm_stats_fops); + + for (i = 0; i < KTRACE_MM_TYPE_NR; i++) { + char name[32]; + snprintf(name, sizeof(name) - 1, "filter_%s", mm_event_name[i]); + + debugfs_create_u32(name, + S_IFREG | S_IRUGO | S_IWUSR, + mm->dir, + &mm->filter[i]); + } + + debugfs_create_file("reset", S_IWUSR, mm->dir, q, + &mm_reset); + } + + smp_mb(); + mm->buf = buf; + pr_info("mm ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/ktrace/ktrace_print.c b/drivers/staging/ktrace/ktrace_print.c new file mode 100644 index 0000000000000..3f6d45acf9ab9 --- /dev/null +++ b/drivers/staging/ktrace/ktrace_print.c @@ -0,0 +1,109 @@ + +#define pr_fmt(fmt) "ktrace : " fmt + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUF_SIZE 64 + +struct ktrace_print { + struct ktrace_queue *q; + struct dentry *dir; + + void *buf; + int entry_size; + int max; +}; + +static struct ktrace_print __print; + +void ktrace_print(const char *fmt, ...) +{ + struct ktrace_print *kp = &__print; + struct ktrace_queue *q = kp->q; + char buf[BUF_SIZE]; + va_list args; + int cnt; + + if (unlikely(!kp->buf)) + return; + + va_start(args, fmt); + cnt = vsnprintf(buf, BUF_SIZE, fmt, args); + va_end(args); + + ktrace_add_queue_multi(q, buf, cnt); + + return; +} + +static int str_show_entry(struct seq_file *m, void *entry, bool debug) +{ + char *b = (char *)entry; + int ret; + + ret = seq_putc(m, *b); + + return ret; +} + +KTRACE_QUEUE_RO_SINGLE(print); + +static int print_clean_write(void *data, u64 val) +{ + struct ktrace_queue *q = data; + int clean = val; + + if (clean) { + ktrace_reset_queue(q); + } + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(print_clean, NULL, print_clean_write, "%llu\n"); + +int __init ktrace_print_init(struct dentry *dir, struct ktrace_queue *q) +{ + struct ktrace_print *kp = &__print; + void *buf; + + memset(kp, sizeof(struct ktrace_print), 0); + + buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!buf) + return -ENOMEM; + kp->q = q; + + kp->entry_size = 1; + kp->max = (PAGE_SIZE << 1); + kp->dir = debugfs_create_dir("print", dir); + + ktrace_init_queue(q, kp->dir, kp, buf, kp->entry_size, kp->max, + DEFAULT_ITEMS_PER_READ, + str_show_entry); + + if (kp->dir) { + debugfs_create_file("trace", + S_IFREG | S_IRUGO, + kp->dir, + q, + &print_fops); + + debugfs_create_file("clean", S_IWUSR, kp->dir, q, + &print_clean); + } + + smp_mb(); + kp->buf = buf; + pr_info("kp ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/ktrace/ktrace_queue.c b/drivers/staging/ktrace/ktrace_queue.c new file mode 100644 index 0000000000000..504cafae25aae --- /dev/null +++ b/drivers/staging/ktrace/ktrace_queue.c @@ -0,0 +1,238 @@ + +#define pr_fmt(fmt) "ktrace : " fmt + + +#include +#include +#include +#include +#include +#include +#include +#include + + + +#ifdef KTRACE_QUEUE_NOLOCK + +static inline int KTRACE_QUEUE_TRYLOCK(spinlock_t *lock, unsigned long flags) +{ + return 1; +} +static inline void KTRACE_QUEUE_LOCK(spinlock_t *lock, unsigned long flags) {} +static inline void KTRACE_QUEUE_UNLOCK(spinlock_t *lock, unsigned long flags) {} + +#else + +#define KTRACE_QUEUE_TRYLOCK(lock, flags) \ + spin_trylock_irqsave(lock, flags) + +#define KTRACE_QUEUE_LOCK(lock, flags) \ + spin_lock_irqsave(lock, flags) + +#define KTRACE_QUEUE_UNLOCK(lock, flags) \ + spin_unlock_irqrestore(lock, flags) + +#endif + +void *ktrace_q_start(struct seq_file *m, loff_t *pos) +{ + struct ktrace_queue *q = m->private; + unsigned long flags; + void *ret = (void *) 1; + int enable_debug = q->enable_debug; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + if (enable_debug) { + seq_printf(m, "-> queue: tail %d, head %d, max %d\n", + q->tail, q->head, q->max); + } + + q->read_cnt = 0; + + if (QUEUE_EMPTY(q->head, q->tail)) { + ret = NULL; + } + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); + + return ret; +} + +void *ktrace_q_next(struct seq_file *m, void *v, loff_t *pos) +{ + struct ktrace_queue *q = m->private; + unsigned long flags; + void *ret = (void *) 1; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + + q->read_cnt += 1; + + if ((q->read_cnt >= q->items_per_read) || + QUEUE_EMPTY(q->head, q->tail)) { + ret = NULL; + } + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); + + return ret; + +} + +void ktrace_q_stop(struct seq_file *m, void *v) +{ + struct ktrace_queue *q = m->private; + int enable_debug = q->enable_debug; + + if (enable_debug) { + seq_printf(m, " queue: tail %d, head %d, max %d\n", + q->tail, q->head, q->max); + } +} + +int ktrace_q_show(struct seq_file *m, void *v) +{ + struct ktrace_queue *q = m->private; + unsigned long flags; + int enable_debug = q->enable_debug; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + if (QUEUE_EMPTY(q->head, q->tail)) { + goto out; + } + + q->show_entry(m, q->buf + q->tail * q->entry_size, enable_debug); + + q->tail = QUEUE_NEXT(q->tail, q->max); + +out: + KTRACE_QUEUE_UNLOCK(&q->lock, flags); + + return 0; +} + +int ktrace_q_single_show(struct seq_file *m, void *v) +{ + struct ktrace_queue *q = m->private; + unsigned long flags; + int ret; + int enable_debug = q->enable_debug; + int tail; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + if (enable_debug) { + seq_printf(m, "-> queue: tail %d, head %d, max %d\n", + q->tail, q->head, q->max); + } + + tail = q->tail; + while (!QUEUE_EMPTY(q->head, tail)) { + + ret = q->show_entry(m, q->buf + tail * q->entry_size, q->enable_debug); + tail = QUEUE_NEXT(tail, q->max); + + if (ret) + break; + } + + if (!ret) + q->tail = tail; + + if (enable_debug) { + seq_printf(m, " queue: tail %d, head %d, max %d\n", + q->tail, q->head, q->max); + } + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); + + return 0; +} + +void ktrace_tryadd_queue(struct ktrace_queue *q, void *entry) +{ + unsigned long flags; + void *dst; + + if (!KTRACE_QUEUE_TRYLOCK(&q->lock, flags)) + return; + + dst = q->buf + q->head * q->entry_size; + memcpy(dst, entry, q->entry_size); + + if (QUEUE_FULL(q->tail, q->head, q->max)) + q->tail = QUEUE_NEXT(q->tail, q->max); + + q->head = QUEUE_NEXT(q->head, q->max); + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); + +} + +void ktrace_add_queue_multi(struct ktrace_queue *q, void *entry, int num) +{ + unsigned long flags; + void *dst; + int i; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + for (i = 0; i < num; i++) { + dst = q->buf + q->head * q->entry_size; + memcpy(dst, entry + i * q->entry_size, q->entry_size); + + if (QUEUE_FULL(q->tail, q->head, q->max)) + q->tail = QUEUE_NEXT(q->tail, q->max); + + q->head = QUEUE_NEXT(q->head, q->max); + } + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); +} + +void ktrace_reset_queue(struct ktrace_queue *q) +{ + unsigned long flags; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + q->head = 0; + q->tail = 0; + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); +} + +void __init ktrace_init_queue(struct ktrace_queue *q, struct dentry *dir, + void *priv, void *buf, int entry_size, int max, int items_per_read, + int(*show_entry)(struct seq_file *, void *, bool)) +{ + spin_lock_init(&q->lock); + + q->priv = priv; + q->buf = buf; + q->entry_size = entry_size; + + q->head = 0; + q->tail = 0; + q->max = max; + q->read_cnt = 0; + q->items_per_read = items_per_read; + q->show_entry = show_entry; + + if (dir) { + debugfs_create_bool("queue_debug", + S_IFREG | S_IRUGO | S_IWUSR, + dir, + &q->enable_debug); + debugfs_create_u32("items_per_read", + S_IFREG | S_IRUGO | S_IWUSR, + dir, + &q->items_per_read); + } + + return; +} diff --git a/drivers/staging/ktrace/ktrace_sched.c b/drivers/staging/ktrace/ktrace_sched.c new file mode 100644 index 0000000000000..0b622c85c5efc --- /dev/null +++ b/drivers/staging/ktrace/ktrace_sched.c @@ -0,0 +1,568 @@ +#define pr_fmt(fmt) "ktrace : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MONITOR_PID_NR 5 +#define INVALID_PID -1 + +#define SCHED_ITEMS_READ_MAX DEFAULT_ITEMS_PER_READ + +#define BLOCK_REASON_NR 30 + +#define USE_THREAD_TO_UPDATE_PIDS 0 + +struct sched_entry { + s64 time_stamp_ns; + unsigned char type; + pid_t pid; + unsigned int time_us; + void *pc; +}; + +struct sched_stats { + atomic_t count; + u64 time; /* us */ +}; + +struct sched_block_reason { + void *pc; + int count; + u64 time; /* us */ +}; + +struct ktrace_sched { + struct ktrace_queue *q; + struct dentry *dir; + + void *buf; + int entry_size; + int max; + + int enable_debug; + + struct task_struct *thread; + + unsigned int filter[KTRACE_SCHED_TYPE_NR]; /* us */ + struct sched_stats stats[KTRACE_SCHED_TYPE_NR]; + struct sched_block_reason block_reason[BLOCK_REASON_NR]; + + /* currently do not consider lock here*/ + pid_t pids[MONITOR_PID_NR]; + int pid_nr; + + pid_t new_pids[MONITOR_PID_NR]; + int new_pid_nr; + bool match_all_pid; +}; + +static struct ktrace_sched __ks = { + .filter = { + [KTRACE_SCHED_TYPE_SAMPLE1] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE2] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE3] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE4] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE5] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE6] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE7] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE8] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE9] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE10] = MS_TO_US(1), + + /* Do not change below values */ + [KTRACE_SCHED_TYPE_PREEMPT] = MS_TO_US(2), + [KTRACE_SCHED_TYPE_WAIT] = MS_TO_US(2), + [KTRACE_SCHED_TYPE_BLOCK] = MS_TO_US(2), + } + +}; + +static const char const *sched_event_name[KTRACE_SCHED_TYPE_NR] = { + "sam_1", + "sam_2", + "sam_3", + "sam_4", + "sam_5", + "sam_6", + "sam_7", + "sam_8", + "sam_9", + "sam_10", + + "p", + "w", + "b", +}; + +#define ktrace_sched_debug(enable, x...) \ + do { \ + if (enable) \ + ktrace_print(x); \ + } while (0) + +static int sched_show_entry(struct seq_file *m, void *entry, bool debug) +{ + struct sched_entry *e = (struct sched_entry *)entry; + int ret; + + if (e->pc) { + if (debug) { + ret = seq_printf(m, "%lld %5d <%s> %d.%03d ms %pS\n", + e->time_stamp_ns, e->pid, + sched_event_name[e->type], + e->time_us / 1000, e->time_us % 1000, + e->pc); + } else { + ret = seq_printf(m, "%lld %5d <%s> %d.%03d ms %ps\n", + e->time_stamp_ns, e->pid, + sched_event_name[e->type], + e->time_us / 1000, e->time_us % 1000, + e->pc); + } + } else { + ret = seq_printf(m, "%lld %5d <%s> %d.%03d ms\n", + e->time_stamp_ns, e->pid, + sched_event_name[e->type], + e->time_us / 1000, e->time_us % 1000); + } + + return ret; +} + +KTRACE_QUEUE_RO_SINGLE(sched); + + +static int sched_stats_show(struct seq_file *m, void *v) +{ + struct ktrace_sched *sched = (struct ktrace_sched *)m->private; + int i; + u64 total_block_time = 0; + int total_block_cnt = 0; + + seq_puts(m, "sched stats:\n"); + for (i = 0; i < KTRACE_SCHED_TYPE_NR; i++) { + seq_printf(m, " %-20s %6d %llu ms\n", sched_event_name[i], + atomic_read(&sched->stats[i].count), + sched->stats[i].time / 1000); + } + + seq_puts(m, "\n"); + + seq_puts(m, "Block reason:\n"); + for (i = 0; i < BLOCK_REASON_NR; i++) { + struct sched_block_reason *reason = &sched->block_reason[i]; + + if (!reason->pc) + break; + + total_block_time += reason->time; + total_block_cnt += reason->count; + seq_printf(m, " %2d. %-40pS => %d, total %lld ms, avg %lld.%lld ms\n", + i + 1, reason->pc, reason->count, + reason->time / 1000, (reason->time / reason->count) / 1000, + (reason->time / reason->count) % 1000); + } + seq_printf(m, " total: %d, %lld ms\n", total_block_cnt, total_block_time / 1000); + + return 0; +} +KTRACE_ENTRY_RO_SINGLE(sched_stats); + +static inline int __match_pid(pid_t *pids, int nr, pid_t new_pid) +{ + int i; + int match = 0; + + for (i = 0; i < nr; i++) { + if (pids[i] == INVALID_PID) + break; + + if (pids[i] == new_pid) { + match = 1; + break; + } + } + + return match; +} + +static inline int sched_match_pid(struct ktrace_sched *sched, pid_t pid) +{ + + if (unlikely(sched->match_all_pid)) + return 1; + + return __match_pid(sched->pids, sched->pid_nr, pid); +} + +static void sched_init_pids(struct ktrace_sched *sched) +{ + int i; + + for (i = 0; i < MONITOR_PID_NR; i++) { + sched->pids[i] = INVALID_PID; + sched->new_pids[i] = INVALID_PID; + } + sched->pid_nr = 0; + sched->new_pid_nr = 0; +} + +static void sched_erase_pids(pid_t *pids, int *nr) +{ + int i; + + for (i = 0; i < *nr; i++) { + pids[i] = INVALID_PID; + } + *nr = 0; + + return; +} + +static void sched_update_pids(struct ktrace_sched *sched) +{ + int i; + int n = 0; + + if (sched->enable_debug) { + char buf[64]; + for (i = 0; i < sched->pid_nr; i++) { + if (sched->pids[i] == INVALID_PID) + break; + n += snprintf(buf + n, sizeof(buf) - n - 1, "%d ", sched->pids[i]); + } + + n += snprintf(buf + n, sizeof(buf) - n - 1, "=> "); + + for (i = 0; i < sched->new_pid_nr; i++) { + if (sched->new_pids[i] == INVALID_PID) + break; + n += snprintf(buf + n, sizeof(buf) - n - 1, "%d ", sched->new_pids[i]); + } + + n += snprintf(buf + n, sizeof(buf) - n - 1, "\n"); + + ktrace_sched_debug(sched->enable_debug, buf); + KTRACE_BEGIN(buf); + KTRACE_END(); + } + + sched_erase_pids(sched->pids, &sched->pid_nr); + + for (i = 0; i < sched->new_pid_nr; i++) { + sched->pids[i] = sched->new_pids[i]; + sched->pid_nr++; + } + + sched_erase_pids(sched->new_pids, &sched->new_pid_nr); + +} + +static int sched_switch_pid(struct ktrace_sched *sched) +{ + /* + * Add action here + * such as: sched_set_fifo_scheduler(sched); + */ + + sched_update_pids(sched); + + return 0; +} + +static int sched_pid_show(struct seq_file *m, void *v) +{ + struct ktrace_sched *sched = m->private; + int i; + + if (sched->match_all_pid) { + seq_puts(m, "match all pids\n"); + return 0; + } + + seq_printf(m, "%d pids registered\n", sched->pid_nr); + + for (i = 0; i < sched->pid_nr; i++) { + if (sched->pids[i] == INVALID_PID) + break; + + seq_printf(m, "%d ", sched->pids[i]); + } + seq_putc(m, '\n'); + + return 0; +} + +static int sched_pid_open(struct inode *inode, struct file *file) +{ + int ret; + + ret = single_open(file, sched_pid_show, inode->i_private); + if (!ret) { + /* + struct seq_file *m = file->private_data; + m->private = inode->i_private; // single_open do not need it + */ + } + return ret; +} + +static ssize_t sched_pid_write(struct file *file, const char __user *user_buf, + size_t size, loff_t *ppos) +{ + struct ktrace_sched *sched = ((struct seq_file *)file->private_data)->private; + char buf[64], *tmp; + + char *pid_str; + pid_t pid; + int ret = 0; + + if (size >= sizeof(buf)) + return -EINVAL; + + if (copy_from_user(&buf, user_buf, size)) + return -EFAULT; + + buf[size] = 0; + tmp = buf; + + if (strncmp(buf, "all", strlen("all")) == 0) { + sched->match_all_pid = 1; + return size; + } else if (strncmp(buf, "notall", strlen("notall")) == 0) { + sched->match_all_pid = 0; + return size; + } + + /* Currently do not add lock here, consider later */ + while ((pid_str = strsep(&tmp, ","))) { + ret = kstrtoint(pid_str, 10, &pid); + if (ret < 0) + break; + + if (sched->new_pid_nr >= MONITOR_PID_NR - 1) { + ret = -EINVAL; + break; + } + + sched->new_pids[sched->new_pid_nr++] = pid; + } + + if (!ret) { + if (USE_THREAD_TO_UPDATE_PIDS) + wake_up_process(sched->thread); + else + sched_update_pids(sched); + } else { + sched_erase_pids(sched->new_pids, &sched->new_pid_nr); + } + return ret ? ret : size; +} + +static const struct file_operations sched_pid_fops = { + .owner = THIS_MODULE, + .open = sched_pid_open, + .read = seq_read, + .write = sched_pid_write, + .llseek = seq_lseek, + .release = seq_release, +}; + +static int sched_reset_write(void *data, u64 val) +{ + struct ktrace_queue *q = data; + struct ktrace_sched *sched = q->priv; + int clean = val; + int i; + + if (clean) { + ktrace_reset_queue(q); + + for (i = 0; i < KTRACE_SCHED_TYPE_NR; i++) { + atomic_set(&sched->stats[i].count, 0); + sched->stats[i].time = 0; + } + + for (i = 0; i < BLOCK_REASON_NR; i++) { + struct sched_block_reason *reason = &sched->block_reason[i]; + + reason->count = 0; + reason->pc = NULL; + reason->time = 0; + } + } + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(sched_reset, NULL, sched_reset_write, "%llu\n"); + +static inline void sched_add_block_reason(struct ktrace_sched *sched, void *pc, + unsigned int time) +{ + int i; + + for (i = 0; i < BLOCK_REASON_NR; i++) { + struct sched_block_reason *reason = &sched->block_reason[i]; + if (reason->pc == NULL || reason->pc == pc) { + if (reason->pc == NULL) + reason->pc = pc; + reason->count++; + reason->time += time; + break; + } + } +} + +void ktrace_add_sched_event(unsigned char type, pid_t pid, u64 time_stamp, u64 delta, void *pc) +{ + struct ktrace_sched *sched = &__ks; + struct ktrace_queue *q = sched->q; + struct sched_entry e; + u64 delta_us = delta >> 10; /* ns => us */ + + if (unlikely(!sched->buf)) + return; + + if (pid == 0) + return; + + if (likely(delta_us < sched->filter[type])) + return; + + if (!sched_match_pid(sched, pid)) + return; + + e.time_stamp_ns = time_stamp; + e.type = type; + e.pid = pid; + e.time_us = (unsigned int)delta_us; + e.pc = pc; + + atomic_inc(&sched->stats[type].count); + sched->stats[type].time += delta_us; + + if (type == KTRACE_SCHED_TYPE_BLOCK) + sched_add_block_reason(sched, pc, delta_us); + + ktrace_tryadd_queue(q, &e); +} + +int ktrace_sched_match_pid(pid_t pid) +{ + struct ktrace_sched *sched = &__ks; + + return sched_match_pid(sched, pid); +} + +static int ktrace_sched_thread(void *d) +{ + struct ktrace_sched *sched = (struct ktrace_sched *)d; + struct sched_param param = { + .sched_priority = 1 + }; + + sched_setscheduler(current, SCHED_FIFO, ¶m); + + while (!kthread_should_stop()) { + int ret; + + set_current_state(TASK_INTERRUPTIBLE); + + if (sched->new_pid_nr == 0) + schedule(); + + set_current_state(TASK_RUNNING); + + ret = sched_switch_pid(sched); + } + + return 0; +} + +int __init ktrace_sched_init(struct dentry *dir, struct ktrace_queue *q) +{ + struct ktrace_sched *sched = &__ks; + void *buf; + int i; + + BUILD_BUG_ON(sizeof(sched_event_name) / sizeof(sched_event_name[0]) + != KTRACE_SCHED_TYPE_NR); + + memset(sched, sizeof(struct ktrace_sched), 0); + + if (USE_THREAD_TO_UPDATE_PIDS) { + sched->thread = kthread_run(ktrace_sched_thread, sched, "ktrace-sched"); + if (IS_ERR(sched->thread)) { + return PTR_ERR(sched->thread); + } + } + + buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!buf) + return -ENOMEM; + sched->q = q; + + sched->entry_size = sizeof(struct sched_entry); + sched->max = (PAGE_SIZE << 1) / sched->entry_size; + + sched_init_pids(sched); + + sched->dir = debugfs_create_dir("sched", dir); + + ktrace_init_queue(q, sched->dir, sched, buf, sched->entry_size, sched->max, + SCHED_ITEMS_READ_MAX, + sched_show_entry); + + if (sched->dir) { + debugfs_create_file("trace", + S_IFREG | S_IRUGO, + sched->dir, + q, + &sched_fops); + + debugfs_create_file("stats", + S_IFREG | S_IRUGO, + sched->dir, + sched, + &sched_stats_fops); + + for (i = 0; i < KTRACE_SCHED_TYPE_NR; i++) { + char name[32]; + snprintf(name, sizeof(name) - 1, "filter_%s", sched_event_name[i]); + + debugfs_create_u32(name, + S_IFREG | S_IRUGO | S_IWUSR, + sched->dir, + &sched->filter[i]); + } + + debugfs_create_file("pids", S_IRUGO | S_IWUSR, sched->dir, sched, + &sched_pid_fops); + + debugfs_create_bool("sched_debug", + S_IFREG | S_IRUGO | S_IWUSR, + sched->dir, + &sched->enable_debug); + + debugfs_create_file("reset", S_IWUSR, sched->dir, q, + &sched_reset); + } + + smp_mb(); + sched->buf = buf; + + pr_info("sched ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/rtmm/Kconfig b/drivers/staging/rtmm/Kconfig new file mode 100644 index 0000000000000..6a66cfd4a2438 --- /dev/null +++ b/drivers/staging/rtmm/Kconfig @@ -0,0 +1,5 @@ +config RTMM + bool "enable runtime mem optimization" + select DEBUG_FS + help + Thie module is created by MIUI to optimize mem performance. diff --git a/drivers/staging/rtmm/Makefile b/drivers/staging/rtmm/Makefile new file mode 100644 index 0000000000000..604ee02d3dfde --- /dev/null +++ b/drivers/staging/rtmm/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_RTMM) += rtmm_main.o rtmm_pool.o rtmm_reclaim.o diff --git a/drivers/staging/rtmm/rtmm_main.c b/drivers/staging/rtmm/rtmm_main.c new file mode 100644 index 0000000000000..2d076e770d4fb --- /dev/null +++ b/drivers/staging/rtmm/rtmm_main.c @@ -0,0 +1,37 @@ + +#define pr_fmt(fmt) "rtmm : " fmt + +#include +#include +#include +#include +#include +#include + +static int __init rtmm_init(void) +{ + struct dentry *dir; + + if (!debugfs_initialized()) { + pr_warn("debugfs not available, stat dir not created\n"); + return -ENOENT; + } + dir = debugfs_create_dir("rtmm", NULL); + if (!dir) { + pr_err("debugfs 'rtmm' stat dir creation failed\n"); + return -ENOMEM ; + } + + rtmm_pool_init(dir); + + rtmm_reclaim_init(dir); + + pr_info("rtmm init OK\n"); + + return 0; +} + +fs_initcall(rtmm_init); + +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_AUTHOR("Cai Liu "); diff --git a/drivers/staging/rtmm/rtmm_pool.c b/drivers/staging/rtmm/rtmm_pool.c new file mode 100644 index 0000000000000..84348fbae82ad --- /dev/null +++ b/drivers/staging/rtmm/rtmm_pool.c @@ -0,0 +1,402 @@ + +#define pr_fmt(fmt) "rtmm : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define MP_NAME_LEN 12 + +enum { + NR_THREAD_ALLOC_FROM_BUDDY = 0, + NR_ALLOC_FROM_POOL, + NR_ALLOC_FROM_BUDDY, + + NR_FREE_TO_POOL, + NR_FREE_TO_BUDDY, + + NR_THREAD_ALLOC_FAIL, + + NR_WAKEUP_FROM_ALLOC, + NR_WAKEUP_FROM_FREE, + NR_WAKEUP_FROM_SET_MAXNR, + + NR_STAT +}; + +static const char *stat_str[NR_STAT] = { + [NR_THREAD_ALLOC_FROM_BUDDY] = "thread alloc", + [NR_ALLOC_FROM_POOL] = "alloc from pool", + [NR_ALLOC_FROM_BUDDY] = "alloc from buddy", + + [NR_FREE_TO_POOL] = "free to pool", + [NR_FREE_TO_BUDDY] = "free to buddy", + + [NR_THREAD_ALLOC_FAIL] = "thread alloc fail", + + [NR_WAKEUP_FROM_ALLOC] = "wakeup from alloc", + [NR_WAKEUP_FROM_FREE] = "wakeup from free", + [NR_WAKEUP_FROM_SET_MAXNR] = "wakeup from set maxnr", +}; + +struct mpool { + atomic_t init; + gfp_t gfp_mask; + int order; + + atomic_t cur_nr; /* do not need atomic here */ + atomic_t max_nr; + atomic_t low_wm_nr; + + atomic_t stat[NR_STAT]; + + struct list_head list; + spinlock_t lock; + + int pool_type; + struct dentry *dir; + struct rtmm_pool *pool; + + struct page *(*__alloc_pages)(void); + void (*__free_pages)(void *addr); +}; + +struct rtmm_pool { + struct dentry *dir; + + struct mpool mp[RTMM_POOL_NR]; + + struct task_struct *tsk; + wait_queue_head_t waitqueue; +}; + +static struct page *mp_alloc_pages_ti(void); +static void mp_free_pages_ti(void *addr); + +static struct rtmm_pool __pool = { + .mp = { + [RTMM_POOL_THREADINFO] = { + .init = ATOMIC_INIT(0), + .max_nr = ATOMIC_INIT(40), + .__alloc_pages = mp_alloc_pages_ti, + .__free_pages = mp_free_pages_ti, + } + } +}; + +static inline struct rtmm_pool *get_pool(void) +{ + return &__pool; +} + +static inline bool __mp_is_not_full(struct mpool *mp) +{ + return (atomic_read(&mp->cur_nr) < atomic_read(&mp->max_nr)); +} + +static inline bool __mp_is_not_empty(struct mpool *mp) +{ + return (atomic_read(&mp->cur_nr) > 0); +} + +static inline bool __mp_is_below_wm(struct mpool *mp) +{ + return (atomic_read(&mp->cur_nr) < atomic_read(&mp->low_wm_nr)); +} + +static inline bool __pool_thread_running(struct task_struct *tsk) +{ + return (tsk && (tsk->state == TASK_RUNNING)); +} + +static inline void __mp_wakeup(struct mpool *mp, int type) +{ + wake_up(&mp->pool->waitqueue); + + atomic_inc(&mp->stat[type]); +} + +static struct page *mp_alloc_pages(struct mpool *mp) +{ + struct page *page = NULL; + + if (__mp_is_not_empty(mp)) { + spin_lock(&mp->lock); + if (!list_empty(&mp->list)) { + page = list_first_entry(&mp->list, struct page , lru); + list_del(&page->lru); + } + spin_unlock(&mp->lock); + } + + if (page) { + atomic_dec(&mp->cur_nr); + atomic_inc(&mp->stat[NR_ALLOC_FROM_POOL]); + } + + if (__mp_is_below_wm(mp) && !__pool_thread_running(mp->pool->tsk)) + __mp_wakeup(mp, NR_WAKEUP_FROM_ALLOC); + + return page; +} + +static void mp_free_pages(struct mpool *mp, void *addr) +{ + struct page *page = virt_to_page(addr); + + spin_lock(&mp->lock); + list_add(&page->lru, &mp->list); + spin_unlock(&mp->lock); + + atomic_inc(&mp->cur_nr); + atomic_inc(&mp->stat[NR_FREE_TO_POOL]); + + if (__mp_is_below_wm(mp) && !__pool_thread_running(mp->pool->tsk)) + __mp_wakeup(mp, NR_WAKEUP_FROM_FREE); +} + +static struct page *mp_alloc_pages_ti(void) +{ + return alloc_kmem_pages_node(NUMA_NO_NODE, THREADINFO_GFP, + THREAD_SIZE_ORDER); +} + +static void mp_free_pages_ti(void *addr) +{ + /* free to buddy system */ + kasan_alloc_pages(virt_to_page(addr), THREAD_SIZE_ORDER); + free_kmem_pages((unsigned long)addr, THREAD_SIZE_ORDER); +} + + +static int __pool_is_not_full(struct rtmm_pool *pool) +{ + int i; + int not_full = 0; + + for (i = 0; i < RTMM_POOL_NR; i++) { + if (__mp_is_not_full(&pool->mp[i])) { + not_full = 1; + break; + } + } + + return not_full; +} + +struct page *rtmm_alloc_pages(int pool_type) +{ + struct rtmm_pool *pool = get_pool(); + struct mpool *mp = &pool->mp[pool_type]; + struct page *page = NULL; + + if (1 || ktrace_sched_match_pid(current->pid)) + page = mp_alloc_pages(mp); + + if (!page) { + page = mp->__alloc_pages(); + + atomic_inc(&mp->stat[NR_ALLOC_FROM_BUDDY]); + } + + return page; +} + +void rtmm_free_pages(void *addr, int pool_type) +{ + struct rtmm_pool *pool = get_pool(); + struct mpool *mp = &pool->mp[pool_type]; + + if (atomic_read(&mp->init) && __mp_is_not_full(mp)) { + mp_free_pages(mp, addr); + } else { + mp->__free_pages(addr); + atomic_inc(&mp->stat[NR_FREE_TO_BUDDY]); + } +} + +static int mp_thread(void *data) +{ + struct rtmm_pool *pool = data; + struct sched_param param = { .sched_priority = 0 }; + + sched_setscheduler(pool->tsk, SCHED_NORMAL, ¶m); + + while (true) { + int i; + + wait_event_freezable(pool->waitqueue, __pool_is_not_full(pool)); + + for (i = 0; i < RTMM_POOL_NR; i++) { + struct mpool *mp = &pool->mp[i]; + + while (__mp_is_not_full(mp)) { + struct page *page = mp->__alloc_pages(); + + if (!page) { + atomic_inc(&mp->stat[NR_THREAD_ALLOC_FAIL]); + continue; + } + + spin_lock(&mp->lock); + list_add_tail(&page->lru, &mp->list); + spin_unlock(&mp->lock); + + atomic_inc(&mp->cur_nr); + atomic_inc(&mp->stat[NR_THREAD_ALLOC_FROM_BUDDY]); + } + } + } + + return 0; +} + +static int mp_maxnr_read(void *data, u64 *val) +{ + struct mpool *mp = (struct mpool *)data; + + *val = atomic_read(&mp->max_nr); + + return 0; +} + +static int mp_maxnr_write(void *data, u64 val) +{ + struct mpool *mp = (struct mpool *)data; + + int old_nr = atomic_read(&mp->max_nr); + int new_nr = (unsigned int)val; + + atomic_set(&mp->max_nr, val); + + if (old_nr < new_nr) + __mp_wakeup(mp, NR_WAKEUP_FROM_SET_MAXNR); + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(pool_max_nr, mp_maxnr_read, + mp_maxnr_write, "%llu\n"); + +static int mp_stats_show(struct seq_file *s, void *v) +{ + struct mpool *mp = s->private; + int i; + + seq_puts(s, "\n"); + + seq_printf(s, "max %d, low_wm %d, cur %d\n", + atomic_read(&mp->max_nr), + atomic_read(&mp->low_wm_nr), + atomic_read(&mp->cur_nr)); + + seq_puts(s, "----\n"); + + for (i = 0; i < NR_STAT; i++) { + seq_printf(s, " %-25s: %d\n", + stat_str[i], + atomic_read(&mp->stat[i])); + } + + seq_puts(s, "----\n"); + seq_printf(s, " pool hit rate %d%%\n", + 100 * atomic_read(&mp->stat[NR_ALLOC_FROM_POOL]) / + (atomic_read(&mp->stat[NR_ALLOC_FROM_POOL]) + + atomic_read(&mp->stat[NR_ALLOC_FROM_BUDDY]))); + + return 0; +} + +static int mp_stats_open(struct inode *inode, struct file *file) +{ + return single_open(file, mp_stats_show, inode->i_private); +} + +static const struct file_operations mp_stat_ops = { + .open = mp_stats_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void __init mp_init(struct rtmm_pool *pool) +{ + int i; + + for (i = 0; i < RTMM_POOL_NR; i++) { + struct mpool *mp = &pool->mp[i]; + int j; + + mp->pool = pool; + mp->pool_type = i; + + spin_lock_init(&mp->lock); + INIT_LIST_HEAD(&mp->list); + atomic_set(&mp->cur_nr, 0); + atomic_set(&mp->low_wm_nr, atomic_read(&mp->max_nr) * 3 / 4); + + for (j = 0; j < NR_STAT; j++) + atomic_set(&mp->stat[j], 0); + + if (pool->dir) { + char mp_dir_name[MP_NAME_LEN]; + + snprintf(mp_dir_name , MP_NAME_LEN - 1, "pool-%d", mp->pool_type); + mp->dir = debugfs_create_dir(mp_dir_name, pool->dir); + + if (mp->dir) { + debugfs_create_file("pool_max_nr", S_IRUGO | S_IWUSR, mp->dir, mp, + &pool_max_nr); + + debugfs_create_file("stat", S_IFREG | S_IRUGO, + mp->dir, mp, &mp_stat_ops); + } + } + + atomic_set(&mp->init, 1); + } + +} + +int __init rtmm_pool_init(struct dentry *dir) +{ + struct rtmm_pool *pool = get_pool(); + + memset(pool, sizeof(struct rtmm_pool), 0); + + pool->dir = debugfs_create_dir("pool", dir); + if (!pool->dir) { + pr_err("fail to create debugfs dir\n"); + } + + init_waitqueue_head(&pool->waitqueue); + + mp_init(pool); + pool->tsk = kthread_run(mp_thread, pool, "rtmm_pool"); + if (IS_ERR(pool->tsk)) { + pr_err("%s: creating thread for rtmm pool failed\n", + __func__); + return PTR_ERR_OR_ZERO(pool->tsk); + } + + smp_mb(); + + pr_info("rtmm mp init OK\n"); + + return 0; +} + diff --git a/drivers/staging/rtmm/rtmm_reclaim.c b/drivers/staging/rtmm/rtmm_reclaim.c new file mode 100644 index 0000000000000..fcbc05769156f --- /dev/null +++ b/drivers/staging/rtmm/rtmm_reclaim.c @@ -0,0 +1,609 @@ + +#define pr_fmt(fmt) "rtmm : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#define MB_TO_PAGES(m) (((m) << 20) >> PAGE_SHIFT) +#define PAGES_TO_MB(p) (((p) << PAGE_SHIFT) >> 20) + +#define GLOBAL_RECLAIM_MAX_SIZE 200 /* MB */ + +enum reclaim_type { + RECLAIM_NONE = 0, + RECLAIM_KILL, + RECLAIM_PROC, + RECLAIM_GLOBAL, /* global lru*/ +}; + +enum page_type { + RECLAIM_PAGE_NONE = 0, + RECLAIM_PAGE_FILE, + RECLAIM_PAGE_ANON, + RECLAIM_PAGE_ALL, /* anon/file pages */ +}; + +#define CMD_STR_LEN 64 + +struct reclaim_cmd { + /* proc reclaim; global reclaim ; kill */ + int type; + + /* proc reclaim ; kill*/ + pid_t pid; + + int page_type; /* anon/file */ + + /* global reclaim */ + int order; + + int nr_to_reclaim; + + struct list_head list; +}; + +struct rtmm_reclaim { + struct dentry *dir; + + struct task_struct *tsk; + wait_queue_head_t waitqueue; + + spinlock_t lock; + struct list_head cmd_todo; + atomic_t cmd_nr; +}; + +struct rtmm_reclaim __reclaim; + +static inline struct rtmm_reclaim *get_reclaim(void) +{ + return &__reclaim; +} + +/* + * kill a process + */ +static int mem_process_kill(pid_t pid) +{ + struct task_struct *task; + struct signal_struct *sig; + struct mm_struct *mm; + int oom_score_adj; + unsigned long rss = 0; + int ret = 0; + + rcu_read_lock(); + task = find_task_by_vpid(pid); + if (!task) { + ret = -ESRCH; + goto out; + } + mm = task->mm; + sig = task->signal; + if (!mm || !sig) { + ret = -ESRCH; + goto out; + } + + oom_score_adj = sig->oom_score_adj; + if (oom_score_adj < 0) { + pr_warn("KILL: odj %d, exit\n", oom_score_adj); + ret = -EPERM; + goto out; + } + + rss = get_mm_rss(mm); + + pr_info("kill process %d(%s)\n", pid, task->comm); + send_sig(SIGKILL, task, 0); +out: + rcu_read_unlock(); + + return rss; +} + +static struct task_struct *find_get_task_by_pid(pid_t pid) +{ + struct task_struct *p; + + rcu_read_lock(); + p = find_task_by_vpid(pid); + if (p) + get_task_struct(p); + + rcu_read_unlock(); + + return p; +} + +/* + * reclaim anon/file pages of a process + */ +static int mem_process_reclaim(pid_t pid, int type, int nr_to_reclaim) +{ + struct task_struct *task; + struct mm_struct *mm; + struct vm_area_struct *vma; + struct mm_walk reclaim_walk = {}; + struct reclaim_param rp; + int ret = 0; + + task = find_get_task_by_pid(pid); + if (!task) + return -ESRCH; + + mm = get_task_mm(task); + if (!mm) { + ret = -EINVAL; + goto out; + } + + reclaim_walk.mm = mm; + reclaim_walk.pmd_entry = reclaim_pte_range; + + rp.nr_scanned = 0; + rp.nr_to_reclaim = nr_to_reclaim; + rp.nr_reclaimed = 0; + reclaim_walk.private = &rp; + + down_read(&mm->mmap_sem); + + for (vma = mm->mmap; vma; vma = vma->vm_next) { + if (is_vm_hugetlb_page(vma)) + continue; + + if (type == RECLAIM_PAGE_ANON && vma->vm_file) + continue; + + if (type == RECLAIM_PAGE_FILE && !vma->vm_file) + continue; + + rp.vma = vma; + ret = walk_page_range(vma->vm_start, vma->vm_end, + &reclaim_walk); + if (ret) + break; + } + + flush_tlb_mm(mm); + up_read(&mm->mmap_sem); + mmput(mm); + +out: + put_task_struct(task); + + /* -EPIPE is returned in reclaim_pte_range() to break the iteration, + * it is a valid value, so we set the ret as 0 here. + */ + if (ret == -EPIPE) + ret = 0; + + pr_info("process reclaim: pid %d, page_type %d, try to reclaim %d, reclaimed %d(scan %d)\n", + pid, type, nr_to_reclaim, rp.nr_reclaimed, rp.nr_scanned); + + return ret; +} + +static int mem_global_reclaim(unsigned long nr_to_reclaim) +{ +#define RECLAIM_PAGES_PER_LOOP MB_TO_PAGES(1) + + unsigned long nr_reclaimed = 0; + int loop = nr_to_reclaim / RECLAIM_PAGES_PER_LOOP; + int remain = nr_to_reclaim % RECLAIM_PAGES_PER_LOOP; + + /* Currently we only consider loops instead of nr_to_reclaim */ + while (loop--) { + nr_reclaimed += reclaim_global(RECLAIM_PAGES_PER_LOOP); + + if (nr_reclaimed >= nr_to_reclaim) + break; + } + if (remain && (nr_reclaimed < nr_to_reclaim)) + nr_reclaimed += reclaim_global(remain); + + pr_info("global reclaim: try to reclaim %ld, reclaimed %ld\n", + nr_to_reclaim, nr_reclaimed); + + return nr_reclaimed; +} + + +static struct reclaim_cmd *__alloc_reclaim_cmd(void) +{ + struct reclaim_cmd *cmd; + + cmd = kzalloc(sizeof(struct reclaim_cmd), GFP_KERNEL); + if (!cmd) { + pr_err("fail to get an empty slot\n"); + return NULL; + } + cmd->type = RECLAIM_NONE; + INIT_LIST_HEAD(&cmd->list); + + return cmd; +} + +static void __release_reclaim_cmd(struct reclaim_cmd *cmd) +{ + kfree(cmd); +} + +static void __enqueue_reclaim_cmd(struct rtmm_reclaim *reclaim, struct reclaim_cmd *cmd) +{ + spin_lock(&reclaim->lock); + list_add_tail(&cmd->list, &reclaim->cmd_todo); + spin_unlock(&reclaim->lock); + + atomic_inc(&reclaim->cmd_nr); + + wake_up(&reclaim->waitqueue); + + return; +} + +static struct reclaim_cmd *__dequeue_reclaim_cmd(struct rtmm_reclaim *reclaim) +{ + struct reclaim_cmd *cmd = NULL; + + spin_lock(&reclaim->lock); + if (!list_empty(&reclaim->cmd_todo)) { + cmd = list_first_entry(&reclaim->cmd_todo, struct reclaim_cmd, + list); + list_del(&cmd->list); + } + spin_unlock(&reclaim->lock); + + atomic_dec(&reclaim->cmd_nr); + + return cmd; +} + + +static int mem_reclaim_thread(void *data) +{ + struct rtmm_reclaim *reclaim = data; + struct sched_param param = { .sched_priority = 0 }; + + sched_setscheduler(reclaim->tsk, SCHED_NORMAL, ¶m); + + while (true) { + struct reclaim_cmd *cmd; + + wait_event_freezable(reclaim->waitqueue, (atomic_read(&reclaim->cmd_nr) > 0)); + + while (atomic_read(&reclaim->cmd_nr) > 0) { + cmd = __dequeue_reclaim_cmd(reclaim); + if (!cmd) + break; + + switch (cmd->type) { + case RECLAIM_KILL: + mem_process_kill(cmd->pid); + break; + + case RECLAIM_PROC: + mem_process_reclaim(cmd->pid, cmd->page_type, cmd->nr_to_reclaim); + break; + + case RECLAIM_GLOBAL: + mem_global_reclaim(cmd->nr_to_reclaim); + break; + + default: + pr_err("unknow type %d", cmd->type); + break; + } + + __release_reclaim_cmd(cmd); + } + } + + return 0; +} + +static int sys_kill_process(void *data, u64 val) +{ + struct rtmm_reclaim *reclaim = (struct rtmm_reclaim *)data; + struct reclaim_cmd *cmd; + pid_t pid = (pid_t)val; + + cmd = __alloc_reclaim_cmd(); + if (!cmd) { + pr_err("fail to get an empty slot in kill reclaim\n"); + return -ENOMEM; + } + cmd->type = RECLAIM_KILL; + cmd->pid = pid; + + __enqueue_reclaim_cmd(reclaim, cmd); + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(kill_ops, NULL, sys_kill_process, "%llu\n"); + +static int sys_proc_reclaim_show(struct seq_file *m, void *v) +{ + return 0; +} + + +static int sys_proc_reclaim_open(struct inode *inode, struct file *file) +{ + int ret; + + ret = single_open(file, sys_proc_reclaim_show, inode->i_private); + if (!ret) { + } + return ret; +} + +static ssize_t sys_proc_reclaim_write(struct file *file, const char __user *user_buf, + size_t size, loff_t *ppos) +{ + struct rtmm_reclaim *reclaim = ((struct seq_file *)file->private_data)->private; + char buf[CMD_STR_LEN]; + int ret; + pid_t pid; + int page_type; + int size_MB; + struct reclaim_cmd *cmd; + + if (size >= sizeof(buf)) + return -EINVAL; + + if (copy_from_user(&buf, user_buf, size)) + return -EFAULT; + + buf[size] = 0; + + ret = sscanf(buf, "%d %d %d", &pid, &page_type, &size_MB); + + if (ret != 3) { + pr_err("param err in proc reclaim cmd(%s)\n", buf); + return -EINVAL; + } + + cmd = __alloc_reclaim_cmd(); + if (!cmd) { + pr_err("fail to get an empty slot in proc reclaim\n"); + return -ENOMEM; + } + cmd->type = RECLAIM_PROC; + cmd->pid = pid; + cmd->page_type = page_type; + cmd->nr_to_reclaim = MB_TO_PAGES(size_MB); + + __enqueue_reclaim_cmd(reclaim, cmd); + + return size; +} + +static const struct file_operations proc_reclaim_fops = { + .owner = THIS_MODULE, + .open = sys_proc_reclaim_open, + .read = seq_read, + .write = sys_proc_reclaim_write, + .llseek = seq_lseek, + .release = seq_release, +}; + +static int sys_global_reclaim_show(struct seq_file *m, void *v) +{ + return 0; +} + +static int sys_global_reclaim_open(struct inode *inode, struct file *file) +{ + int ret; + + ret = single_open(file, sys_global_reclaim_show, inode->i_private); + if (!ret) { + } + return ret; +} + +static ssize_t sys_global_reclaim_write(struct file *file, const char __user *user_buf, + size_t size, loff_t *ppos) +{ + struct rtmm_reclaim *reclaim = ((struct seq_file *)file->private_data)->private; + char buf[CMD_STR_LEN]; + int ret; + int size_MB; + struct reclaim_cmd *cmd; + + if (size >= sizeof(buf)) + return -EINVAL; + + if (copy_from_user(&buf, user_buf, size)) + return -EFAULT; + + buf[size] = 0; + + ret = sscanf(buf, "%d", &size_MB); + + if (ret != 1) { + pr_err("param err in global reclaim cmd(%s)\n", buf); + return -EINVAL; + } + + if (size_MB > GLOBAL_RECLAIM_MAX_SIZE) { + pr_err("global reclaim: size %d MB to big, return\n", size_MB); + return -EINVAL; + } + + cmd = __alloc_reclaim_cmd(); + if (!cmd) { + pr_err("fail to get an empty slot in global reclaim\n"); + return -ENOMEM; + } + cmd->type = RECLAIM_GLOBAL; + cmd->nr_to_reclaim = MB_TO_PAGES(size_MB); + + __enqueue_reclaim_cmd(reclaim, cmd); + + return size; +} + +static const struct file_operations global_reclaim_fops = { + .owner = THIS_MODULE, + .open = sys_global_reclaim_open, + .read = seq_read, + .write = sys_global_reclaim_write, + .llseek = seq_lseek, + .release = seq_release, +}; + + +static int sys_auto_reclaim_show(struct seq_file *m, void *v) +{ + return 0; +} + +static int sys_auto_reclaim_open(struct inode *inode, struct file *file) +{ + int ret; + + ret = single_open(file, sys_auto_reclaim_show, inode->i_private); + if (!ret) { + } + return ret; +} + +static ssize_t sys_auto_reclaim_write(struct file *file, const char __user *user_buf, + size_t size, loff_t *ppos) +{ + struct rtmm_reclaim *reclaim = ((struct seq_file *)file->private_data)->private; + char buf[CMD_STR_LEN]; + int ret; + struct reclaim_cmd *cmd; + int target_free_size; + int cur_free = global_page_state(NR_FREE_PAGES); + int cur_free_size = PAGES_TO_MB(cur_free); + int reclaim_size; + + if (size >= sizeof(buf)) + return -EINVAL; + + if (copy_from_user(&buf, user_buf, size)) + return -EFAULT; + + buf[size] = 0; + + ret = sscanf(buf, "%d", &target_free_size); + + if (ret != 1) { + pr_err("param err in auto reclaim cmd(%s)\n", buf); + return -EINVAL; + } + + if (target_free_size > GLOBAL_RECLAIM_MAX_SIZE) { + pr_err("auto reclaim: size %d MB to big, return\n", target_free_size); + return -EINVAL; + } + + reclaim_size = target_free_size - cur_free_size; + if (reclaim_size <= 0) + return size; + + cmd = __alloc_reclaim_cmd(); + if (!cmd) { + pr_err("fail to get an empty slot in auto reclaim\n"); + return -ENOMEM; + } + cmd->type = RECLAIM_GLOBAL; + cmd->nr_to_reclaim = MB_TO_PAGES(reclaim_size); + + __enqueue_reclaim_cmd(reclaim, cmd); + + return size; +} + +static const struct file_operations auto_reclaim_fops = { + .owner = THIS_MODULE, + .open = sys_auto_reclaim_open, + .read = seq_read, + .write = sys_auto_reclaim_write, + .llseek = seq_lseek, + .release = seq_release, +}; + +static void __init reclaim_init(struct rtmm_reclaim *reclaim) +{ + spin_lock_init(&reclaim->lock); + init_waitqueue_head(&reclaim->waitqueue); + + atomic_set(&reclaim->cmd_nr, 0); + INIT_LIST_HEAD(&reclaim->cmd_todo); + + if (reclaim->dir) { + debugfs_create_file("kill", + S_IFREG | S_IRUGO | S_IWUSR, + reclaim->dir, + reclaim, + &kill_ops); + + debugfs_create_file("proc_reclaim", + S_IFREG | S_IRUGO | S_IWUSR, + reclaim->dir, + reclaim, + &proc_reclaim_fops); + + debugfs_create_file("global_reclaim", + S_IFREG | S_IRUGO | S_IWUSR, + reclaim->dir, + reclaim, + &global_reclaim_fops); + + debugfs_create_file("auto_reclaim", + S_IFREG | S_IRUGO | S_IWUSR, + reclaim->dir, + reclaim, + &auto_reclaim_fops); + } +} + +int __init rtmm_reclaim_init(struct dentry *dir) +{ + struct rtmm_reclaim *reclaim = get_reclaim(); + + memset(reclaim, 0, sizeof(struct rtmm_reclaim)); + + reclaim->dir = debugfs_create_dir("reclaim", dir); + if (!reclaim->dir) { + pr_err("fail to create debugfs dir\n"); + } + + reclaim_init(reclaim); + + reclaim->tsk = kthread_run(mem_reclaim_thread, reclaim, "rtmm_reclaim"); + if (IS_ERR(reclaim->tsk)) { + pr_err("%s: creating thread for rtmm reclaim failed\n", + __func__); + return PTR_ERR_OR_ZERO(reclaim->tsk); + } + + pr_info("rtmm reclaim init OK\n"); + + return 0; +} diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index dd03cefddf814..bd30104d3b0e9 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -45,6 +46,8 @@ #include #include +#include + #include "power.h" #include "core.h" #include "gadget.h" @@ -52,8 +55,13 @@ #include "debug.h" #include "xhci.h" +#if defined(CONFIG_D1_ROSY) +#define DWC3_IDEV_CHG_MAX 2000 +#else #define DWC3_IDEV_CHG_MAX 1500 +#endif #define DWC3_HVDCP_CHG_MAX 1800 +#define DWC3_PROPRIETARY_CHG_MAX 1000 /* AHB2PHY register offsets */ #define PERIPH_SS_AHB2PHY_TOP_CFG 0x10 @@ -188,6 +196,7 @@ struct dwc3_msm { struct regulator *dwc3_gdsc; struct usb_phy *hs_phy, *ss_phy; + struct qpnp_vadc_chip *vadc_dev; struct dbm *dbm; @@ -243,6 +252,8 @@ struct dwc3_msm { atomic_t in_p3; unsigned int lpm_to_suspend_delay; bool init; + + int wt_check_times; }; #define USB_HSPHY_3P3_VOL_MIN 3050000 /* uV */ @@ -2387,6 +2398,28 @@ static irqreturn_t msm_dwc3_pwr_irq(int irq, void *data) return IRQ_HANDLED; } + +static int dwc3_msm_prop_usbin_voltage_now(struct dwc3_msm *mdwc) +{ + int rc = 0; + struct qpnp_vadc_result results; + + if (IS_ERR_OR_NULL(mdwc->vadc_dev)) { + mdwc->vadc_dev = qpnp_get_vadc(mdwc->dev, "usbin"); + if (IS_ERR(mdwc->vadc_dev)) + return PTR_ERR(mdwc->vadc_dev); + } + + rc = qpnp_vadc_read(mdwc->vadc_dev, USBIN, &results); + if (rc) { + pr_err("Unable to read usbin rc=%d\n", rc); + return 0; + } else { + return results.physical; + } +} + + static int dwc3_msm_power_get_property_usb(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) @@ -2415,6 +2448,9 @@ static int dwc3_msm_power_get_property_usb(struct power_supply *psy, case POWER_SUPPLY_PROP_HEALTH: val->intval = mdwc->health_status; break; + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + val->intval = dwc3_msm_prop_usbin_voltage_now(mdwc); + break; case POWER_SUPPLY_PROP_USB_OTG: val->intval = !mdwc->id_state; break; @@ -2586,6 +2622,7 @@ static enum power_supply_property dwc3_msm_pm_power_props_usb[] = { POWER_SUPPLY_PROP_INPUT_CURRENT_MAX, POWER_SUPPLY_PROP_TYPE, POWER_SUPPLY_PROP_HEALTH, + POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_USB_OTG, }; @@ -3365,7 +3402,10 @@ static int dwc3_msm_gadget_vbus_draw(struct dwc3_msm *mdwc, unsigned mA) if (mdwc->charging_disabled) return 0; - if (mdwc->chg_type != DWC3_INVALID_CHARGER) { + + if ((mdwc->chg_type != DWC3_INVALID_CHARGER) && + (mdwc->chg_type != DWC3_PROPRIETARY_CHARGER) && + (mdwc->chg_type != DWC3_DCP_CHARGER)) { dev_dbg(mdwc->dev, "SKIP setting power supply type again,chg_type = %d\n", mdwc->chg_type); @@ -3442,7 +3482,18 @@ static void dwc3_check_float_lines(struct dwc3_msm *mdwc) dwc3_msm_gadget_vbus_draw(mdwc, 0); /* Get linestate with Idp_src enabled */ - dpdm = usb_phy_dpdm_with_idp_src(mdwc->hs_phy); + if (mdwc->otg_state == OTG_STATE_UNDEFINED) { + dpdm = usb_phy_dpdm_with_idp_src(mdwc->hs_phy); + } else { + do { + dpdm = usb_phy_dpdm_with_idp_src(mdwc->hs_phy); + if (dpdm == 0 || dpdm == 0x3) + break; + mdwc->wt_check_times++; + msleep(200); + } while (mdwc->wt_check_times < 10); + } + dev_err(mdwc->dev, "%s: linestate(dpdm) = %d\n", __func__, dpdm); if (dpdm == 0x2) { /* DP is HIGH = lines are floating */ mdwc->chg_type = DWC3_PROPRIETARY_CHARGER; @@ -3450,6 +3501,13 @@ static void dwc3_check_float_lines(struct dwc3_msm *mdwc) pm_runtime_put_sync(mdwc->dev); dbg_event(0xFF, "FLT psync", atomic_read(&mdwc->dev->power.usage_count)); + } else if (dpdm == 0x3) { + mdwc->chg_type = DWC3_DCP_CHARGER; + mdwc->otg_state = OTG_STATE_B_IDLE; + pm_runtime_put_sync(mdwc->dev); + dbg_event(0xFF, "FLT psync", + atomic_read(&mdwc->dev->power.usage_count)); + } else if (dpdm) { dev_dbg(mdwc->dev, "%s:invalid linestate:%x\n", __func__, dpdm); } @@ -3529,6 +3587,8 @@ static void dwc3_otg_sm_work(struct work_struct *w) dev_dbg(mdwc->dev, "%s state\n", state); dbg_event(0xFF, state, 0); + dev_info(mdwc->dev, "XJB enter ,mdwc->otg_state= %d\n", mdwc->otg_state); + /* Check OTG state */ switch (mdwc->otg_state) { case OTG_STATE_UNDEFINED: @@ -3559,13 +3619,19 @@ static void dwc3_otg_sm_work(struct work_struct *w) dbg_event(0xFF, "undef_b_sess_vld", 0); switch (mdwc->chg_type) { case DWC3_DCP_CHARGER: - case DWC3_PROPRIETARY_CHARGER: dev_dbg(mdwc->dev, "DCP charger\n"); dwc3_msm_gadget_vbus_draw(mdwc, dcp_max_current); atomic_set(&dwc->in_lpm, 1); pm_relax(mdwc->dev); break; + case DWC3_PROPRIETARY_CHARGER: + dev_dbg(mdwc->dev, "PROPRIETARY charger\n"); + dwc3_msm_gadget_vbus_draw(mdwc, + DWC3_PROPRIETARY_CHG_MAX); + atomic_set(&dwc->in_lpm, 1); + pm_relax(mdwc->dev); + break; case DWC3_CDP_CHARGER: case DWC3_SDP_CHARGER: atomic_set(&dwc->in_lpm, 0); @@ -3577,8 +3643,10 @@ static void dwc3_otg_sm_work(struct work_struct *w) if (mdwc->detect_dpdm_floating && mdwc->chg_type == DWC3_SDP_CHARGER) { dwc3_check_float_lines(mdwc); - if (mdwc->chg_type != DWC3_SDP_CHARGER) + if (mdwc->chg_type != DWC3_SDP_CHARGER) { + work = 1; break; + } } dwc3_otg_start_peripheral(mdwc, 1); mdwc->otg_state = OTG_STATE_B_PERIPHERAL; @@ -3616,11 +3684,15 @@ static void dwc3_otg_sm_work(struct work_struct *w) dev_dbg(mdwc->dev, "b_sess_vld\n"); switch (mdwc->chg_type) { case DWC3_DCP_CHARGER: - case DWC3_PROPRIETARY_CHARGER: dev_dbg(mdwc->dev, "lpm, DCP charger\n"); dwc3_msm_gadget_vbus_draw(mdwc, dcp_max_current); break; + case DWC3_PROPRIETARY_CHARGER: + dev_dbg(mdwc->dev, "lpm, PROPRIETARY charger\n"); + dwc3_msm_gadget_vbus_draw(mdwc, + DWC3_PROPRIETARY_CHG_MAX); + break; case DWC3_CDP_CHARGER: dwc3_msm_gadget_vbus_draw(mdwc, DWC3_IDEV_CHG_MAX); @@ -3640,8 +3712,10 @@ static void dwc3_otg_sm_work(struct work_struct *w) if (mdwc->detect_dpdm_floating && mdwc->chg_type == DWC3_SDP_CHARGER) { dwc3_check_float_lines(mdwc); - if (mdwc->chg_type != DWC3_SDP_CHARGER) + if (mdwc->chg_type != DWC3_SDP_CHARGER) { + work = 1; break; + } } dwc3_otg_start_peripheral(mdwc, 1); mdwc->otg_state = OTG_STATE_B_PERIPHERAL; @@ -3653,6 +3727,7 @@ static void dwc3_otg_sm_work(struct work_struct *w) } } else { mdwc->typec_current_max = 0; + mdwc->wt_check_times = 0; dwc3_msm_gadget_vbus_draw(mdwc, 0); dev_dbg(mdwc->dev, "No device, allowing suspend\n"); } @@ -3762,8 +3837,10 @@ static void dwc3_otg_sm_work(struct work_struct *w) } - if (work) + if (work) { + dev_info(mdwc->dev, "XJB delay = %lu mdwc->wt_check_times = %d\n", delay, mdwc->wt_check_times); schedule_delayed_work(&mdwc->sm_work, delay); + } ret: return; diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index c50669ad12c05..197603bc724c8 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2,6 +2,7 @@ * gadget.c - DesignWare USB3 DRD Controller Gadget Framework Link * * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com + * Copyright (C) 2018 XiaoMi, Inc. * * Authors: Felipe Balbi , * Sebastian Andrzej Siewior @@ -40,6 +41,13 @@ #include "debug.h" #include "io.h" +#ifdef WT_COMPILE_FACTORY_VERSION +#undef dev_dbg +#define dev_dbg dev_info +#undef pr_debug +#define pr_debug pr_info +#endif + static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc, bool remote_wakeup); static int dwc3_gadget_wakeup_int(struct dwc3 *dwc); @@ -675,7 +683,9 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) dwc3_gadget_giveback(dep, req, -ESHUTDOWN); } - } else if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { + /* For isoc endpoints explicitly stop active transfers */ + } else if (dep->endpoint.desc && + usb_endpoint_xfer_isoc(dep->endpoint.desc)) { dwc3_stop_active_transfer(dwc, dep->number, true); } @@ -3015,7 +3025,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) dwc3_gadget_usb3_phy_suspend(dwc, false); - usb_gadget_vbus_draw(&dwc->gadget, 0); + usb_gadget_vbus_draw(&dwc->gadget, 3); if (dwc->gadget.speed != USB_SPEED_UNKNOWN) dwc3_disconnect_gadget(dwc); diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c index 7366e57b29dea..5f762f350defa 100644 --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -80,6 +80,13 @@ USB_VIDEO_MODULE_PARAMETERS(); #endif #include "debug.h" +#ifdef WT_COMPILE_FACTORY_VERSION +#undef dev_dbg +#define dev_dbg dev_info +#undef pr_debug +#define pr_debug pr_info +#endif + MODULE_AUTHOR("Mike Lockwood"); MODULE_DESCRIPTION("Android Composite USB Driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/usb/gadget/ci13xxx_msm.c b/drivers/usb/gadget/ci13xxx_msm.c index 6ba3c16ca3009..ef32fb3ff6084 100644 --- a/drivers/usb/gadget/ci13xxx_msm.c +++ b/drivers/usb/gadget/ci13xxx_msm.c @@ -15,6 +15,13 @@ #include "ci13xxx_udc.c" +#ifdef WT_COMPILE_FACTORY_VERSION +#undef dev_dbg +#define dev_dbg dev_info +#undef pr_debug +#define pr_debug pr_info +#endif + #define MSM_USB_BASE (udc->regs) #define CI13XXX_MSM_MAX_LOG2_ITC 7 diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c index 2ee974eddb63d..bcd0afe0f0b4f 100644 --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c @@ -69,7 +69,12 @@ #include #include "ci13xxx_udc.h" - +#ifdef WT_COMPILE_FACTORY_VERSION +#undef dev_dbg +#define dev_dbg dev_info +#undef pr_debug +#define pr_debug pr_info +#endif /****************************************************************************** * DEFINE *****************************************************************************/ diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 928899e3e3f77..1540bf2f5a317 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -2,6 +2,7 @@ * composite.c - infrastructure for Composite USB Gadgets * * Copyright (C) 2006-2008 David Brownell + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,7 +28,12 @@ #define SSUSB_GADGET_VBUS_DRAW 900 /* in mA */ #define SSUSB_GADGET_VBUS_DRAW_UNITS 8 #define HSUSB_GADGET_VBUS_DRAW_UNITS 2 - +#ifdef WT_COMPILE_FACTORY_VERSION +#undef dev_dbg +#define dev_dbg dev_info +#undef pr_debug +#define pr_debug pr_info +#endif static bool enable_l1_for_hs; module_param(enable_l1_for_hs, bool, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(enable_l1_for_hs, "Enable support for L1 LPM for HS devices"); diff --git a/drivers/usb/gadget/function/f_mtp.c b/drivers/usb/gadget/function/f_mtp.c index 6f5969135ca36..2f8203a39c45c 100644 --- a/drivers/usb/gadget/function/f_mtp.c +++ b/drivers/usb/gadget/function/f_mtp.c @@ -815,6 +815,11 @@ static void send_file_work(struct work_struct *data) offset = dev->xfer_file_offset; count = dev->xfer_file_length; + if (count < 0) { + dev->xfer_result = -EINVAL; + return; + } + DBG(cdev, "send_file_work(%lld %lld)\n", offset, count); if (dev->xfer_send_header) { @@ -934,6 +939,11 @@ static void receive_file_work(struct work_struct *data) offset = dev->xfer_file_offset; count = dev->xfer_file_length; + if (count < 0) { + dev->xfer_result = -EINVAL; + return; + } + DBG(cdev, "receive_file_work(%lld)\n", count); if (!IS_ALIGNED(count, dev->ep_out->maxpacket)) DBG(cdev, "%s- count(%lld) not multiple of mtu(%d)\n", __func__, diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index 95386a2f38e92..8684bd3a013e2 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c @@ -1,4 +1,5 @@ /* Copyright (c) 2009-2016, Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -54,7 +55,7 @@ #define DRIVER_NAME "msm_otg" -#define CHG_RECHECK_DELAY (jiffies + msecs_to_jiffies(2000)) +#define CHG_RECHECK_DELAY (jiffies + msecs_to_jiffies(5000)) #define ULPI_IO_TIMEOUT_USEC (10 * 1000) #define USB_PHY_3P3_VOL_MIN 3050000 /* uV */ #define USB_PHY_3P3_VOL_MAX 3300000 /* uV */ @@ -132,6 +133,19 @@ static char bus_clkname[USB_NUM_BUS_CLOCKS][20] = {"bimc_clk", "snoc_clk", "pcnoc_clk"}; static bool bus_clk_rate_set; + +static int oem_is_kpoc; +static int __init oem_kpoc_setup(char *str) +{ + if (!strncmp(str, "charger", 4)) { + oem_is_kpoc = 1; + printk("[oem][kpoc] disable udc @kpoc mode\n"); + } + return 1; +} +__setup("androidboot.mode=", oem_kpoc_setup); + + static void dbg_inc(unsigned *idx) { *idx = (*idx + 1) & (DEBUG_MAX_MSG-1); @@ -473,10 +487,13 @@ static void ulpi_init(struct msm_otg *motg) static int msm_otg_phy_clk_reset(struct msm_otg *motg) { int ret; + unsigned long flags; if (!motg->phy_reset_clk) return 0; - + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + motg->otg_phy_clk_enable = false; + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); if (motg->sleep_clk) clk_disable_unprepare(motg->sleep_clk); if (motg->phy_csr_clk) @@ -507,6 +524,9 @@ static int msm_otg_phy_clk_reset(struct msm_otg *motg) clk_prepare_enable(motg->phy_csr_clk); if (motg->sleep_clk) clk_prepare_enable(motg->sleep_clk); + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + motg->otg_phy_clk_enable = true; + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); return 0; } @@ -1418,6 +1438,11 @@ static int msm_otg_suspend(struct msm_otg *motg) if (!(phy->state == OTG_STATE_B_PERIPHERAL && test_bit(A_BUS_SUSPEND, &motg->inputs)) || !motg->pdata->core_clk_always_on_workaround) { + unsigned long flags; + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + motg->otg_phy_clk_enable = false; + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); + clk_disable_unprepare(motg->pclk); clk_disable_unprepare(motg->core_clk); if (motg->phy_csr_clk) @@ -1551,6 +1576,7 @@ static int msm_otg_resume(struct msm_otg *motg) } if (motg->lpm_flags & CLOCKS_DOWN) { + unsigned long flags; if (motg->phy_csr_clk) { ret = clk_prepare_enable(motg->phy_csr_clk); WARN(ret, "USB phy_csr_clk enable failed\n"); @@ -1560,6 +1586,10 @@ static int msm_otg_resume(struct msm_otg *motg) ret = clk_prepare_enable(motg->pclk); WARN(ret, "USB pclk enable failed\n"); motg->lpm_flags &= ~CLOCKS_DOWN; + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + motg->otg_phy_clk_enable = true; + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); + } if (motg->lpm_flags & PHY_PWR_COLLAPSED) { @@ -2220,7 +2250,13 @@ static bool msm_otg_read_pmic_id_state(struct msm_otg *motg) static bool msm_otg_read_phy_id_state(struct msm_otg *motg) { u8 val; + unsigned long flags; + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + if (false == motg->otg_phy_clk_enable) { + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); + return motg->id_state; + } /* * clear the pending/outstanding interrupts and * read the ID status from the SRC_STATUS register. @@ -2236,6 +2272,7 @@ static bool msm_otg_read_phy_id_state(struct msm_otg *motg) writeb_relaxed(0x0, USB2_PHY_USB_PHY_IRQ_CMD); val = readb_relaxed(USB2_PHY_USB_PHY_INTERRUPT_SRC_STATUS); + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); if (val & USB_PHY_IDDIG_1_0) return false; /* ID is grounded */ else @@ -2831,6 +2868,18 @@ static void msm_otg_sm_work(struct work_struct *w) IDEV_CHG_MAX); /* fall through */ case USB_SDP_CHARGER: + + if (oem_is_kpoc) { + motg->chg_type = USB_DCP_CHARGER; + msm_otg_notify_charger(motg, 500); + otg->phy->state = OTG_STATE_B_CHARGER; + work = 0; + pm_runtime_put_noidle(otg->phy->dev); + pm_runtime_suspend(otg->phy->dev); + break; + } + + msm_otg_notify_charger(motg, IDEV_CHG_MIN); pm_runtime_get_sync(otg->phy->dev); msm_otg_start_peripheral(otg, 1); otg->phy->state = @@ -4427,6 +4476,9 @@ static int msm_otg_probe(struct platform_device *pdev) } } + motg->otg_phy_clk_enable = true; + spin_lock_init(&motg->otg_phy_clk_lock); + of_property_read_u32(pdev->dev.of_node, "qcom,pm-qos-latency", &motg->pm_qos_latency); @@ -4992,6 +5044,7 @@ static int msm_otg_remove(struct platform_device *pdev) struct msm_otg *motg = platform_get_drvdata(pdev); struct usb_phy *phy = &motg->phy; int cnt = 0; + unsigned long flags; if (phy->otg->host || phy->otg->gadget) return -EBUSY; @@ -5060,6 +5113,9 @@ static int msm_otg_remove(struct platform_device *pdev) clk_disable_unprepare(motg->pclk); clk_disable_unprepare(motg->core_clk); + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + motg->otg_phy_clk_enable = false; + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); if (motg->phy_csr_clk) clk_disable_unprepare(motg->phy_csr_clk); if (motg->xo_clk) { diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 2a708dd2eceed..a39b333efd51a 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -2,6 +2,7 @@ * linux/drivers/video/fbmem.c * * Copyright (C) 1994 Martin Schaller + * Copyright (C) 2018 XiaoMi, Inc. * * 2001 - Documented with DocBook * - Brad Douglas @@ -1054,13 +1055,21 @@ EXPORT_SYMBOL(fb_set_var); int fb_blank(struct fb_info *info, int blank) -{ +{ struct fb_event event; int ret = -EINVAL, early_ret; if (blank > FB_BLANK_POWERDOWN) blank = FB_BLANK_POWERDOWN; + + if (info->blank == blank) { + if (info->fbops->fb_blank) + ret = info->fbops->fb_blank(blank, info); + return ret; + } + + event.info = info; event.data = ␣ @@ -1080,6 +1089,9 @@ fb_blank(struct fb_info *info, int blank) fb_notifier_call_chain(FB_R_EARLY_EVENT_BLANK, &event); } + if (!ret) + info->blank = blank; + return ret; } EXPORT_SYMBOL(fb_blank); @@ -1641,6 +1653,7 @@ static int do_register_framebuffer(struct fb_info *fb_info) if (!registered_fb[i]) break; fb_info->node = i; + fb_info->blank = -1; atomic_set(&fb_info->count, 1); mutex_init(&fb_info->lock); mutex_init(&fb_info->mm_lock); diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c index 7e9fab7faf4fe..df9bdaa6910a0 100644 --- a/drivers/video/msm/mdss/mdss_dsi.c +++ b/drivers/video/msm/mdss/mdss_dsi.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -35,6 +36,13 @@ #include "mdss_dba_utils.h" #define XO_CLK_RATE 19200000 + +struct mutex gamma_lock; +struct mutex ce_lock; +struct mutex eye_lock; +struct mutex cabc_lock; + + #define CMDLINE_DSI_CTL_NUM_STRING_LEN 2 /* Master structure to hold all the information about the DSI/panel */ @@ -44,6 +52,8 @@ static struct mdss_dsi_data *mdss_dsi_res; #define DSI_ENABLE_PC_LATENCY PM_QOS_DEFAULT_VALUE static struct pm_qos_request mdss_dsi_pm_qos_request; +bool is_Lcm_Present = false; +bool is_tianma_panel = false; static void mdss_dsi_pm_qos_add_request(struct mdss_dsi_ctrl_pdata *ctrl_pdata) { @@ -292,6 +302,8 @@ static int mdss_dsi_panel_power_off(struct mdss_panel_data *pdata) ret = 0; } + usleep(500); + if (mdss_dsi_pinctrl_set_state(ctrl_pdata, false)) pr_debug("reset disable: pinctrl not enabled\n"); @@ -306,6 +318,8 @@ static int mdss_dsi_panel_power_off(struct mdss_panel_data *pdata) return ret; } +int tp_gesture_onoff = 0; +EXPORT_SYMBOL(tp_gesture_onoff); static int mdss_dsi_panel_power_on(struct mdss_panel_data *pdata) { int ret = 0; @@ -344,7 +358,6 @@ static int mdss_dsi_panel_power_on(struct mdss_panel_data *pdata) pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); } - return ret; } @@ -1324,6 +1337,7 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) struct mipi_panel_info *mipi; struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; int cur_power_state; + unsigned long timeout = jiffies; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); @@ -1425,6 +1439,9 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + pr_info("%s: mdss_dsi_on time=%ums \n", __func__, + jiffies_to_msecs(jiffies-timeout)); + end: pr_debug("%s-:\n", __func__); return ret; @@ -2770,6 +2787,10 @@ static struct device_node *mdss_dsi_find_panel_of_node( panel_name[i] = *(str1 + i); panel_name[i] = 0; } + + if (!strcmp(panel_name, "qcom,mdss_dsi_ili9881c_tianma_c3b_720p_video")) + is_tianma_panel = true; + pr_info("%s: cmdline:%s panel_name:%s\n", __func__, panel_cfg, panel_name); if (!strcmp(panel_name, NONE_PANEL)) @@ -2808,12 +2829,13 @@ static struct device_node *mdss_dsi_find_panel_of_node( cfg_np_name, MDSS_MAX_PANEL_LEN); } } - + is_Lcm_Present = true; return dsi_pan_node; } end: if (strcmp(panel_name, NONE_PANEL)) dsi_pan_node = mdss_dsi_pref_prim_panel(pdev); + is_Lcm_Present = false; exit: return dsi_pan_node; } @@ -3652,6 +3674,10 @@ static int mdss_dsi_probe(struct platform_device *pdev) pr_err("%s: Invalid DSI hw configuration\n", __func__); goto error; } + mutex_init(&gamma_lock); + mutex_init(&ce_lock); + mutex_init(&eye_lock); + mutex_init(&cabc_lock); mdss_dsi_config_clk_src(pdev); @@ -4182,6 +4208,223 @@ static int mdss_dsi_register_driver(void) return platform_driver_register(&mdss_dsi_driver); } +int current_gamma = NATURE; +int current_ce = STANDARD; +int current_eye = 0; +int poweron = 0; + +extern int mdss_dsi_panel_gamma(struct mdss_panel_data *pdata); + int mdss_panel_set_gamma(struct mdss_panel_data *pdata, int mode) +{ + int ret = 0; + struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + + if (poweron == 0 && is_tianma_panel) { + poweron++; + current_gamma = 0; + } + + if (mode != current_gamma) { + pr_err("%s: Set panel gamma, mode is %d\n", __func__, mode); + mutex_lock(&gamma_lock); + ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); + + switch (mode) { + case WARM: + ctrl_pdata->gamma_cmds = ctrl_pdata->warm_cmds; + current_gamma = WARM; + break; + case COOL: + ctrl_pdata->gamma_cmds = ctrl_pdata->cool_cmds; + current_gamma = COOL; + break; + case NATURE: + ctrl_pdata->gamma_cmds = ctrl_pdata->nature_cmds; + current_gamma = NATURE; + break; + default: + ret = -EINVAL; + goto err_out; + } + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(0, &ctrl_pdata->panel_data); + + ret = mdss_dsi_panel_gamma(pdata); + if (ret) { + pr_err("%s: unable to set the panel gamma\n", + __func__); + goto err_out; + } + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) { + mdss_dsi_set_tx_power_mode(1, &ctrl_pdata->panel_data); + } + +err_out: + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + mutex_unlock(&gamma_lock); + } + + return ret; +} + +extern int mdss_dsi_panel_dispparam(struct mdss_panel_data *pdata); +int mdss_panel_set_dispparam(struct mdss_panel_data *pdata, int level) +{ + int ret = 0; + struct mipi_panel_info *mipi; + struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; + + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + if (current_eye != level) { + mutex_lock(&eye_lock); + ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mipi = &pdata->panel_info.mipi; + if ((level < 0) || (level > 8)) { + pr_err("%s: Invalid level to protect eyes\n", __func__); + mutex_unlock(&eye_lock); + return -EINVAL; + } + + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); + + current_eye = level; + if (level == 0) { + ctrl_pdata->eyemode = false; + if (current_gamma == WARM) + ctrl_pdata->dispparam_cmds = ctrl_pdata->warm_cmds; + if (current_gamma == COOL) + ctrl_pdata->dispparam_cmds = ctrl_pdata->cool_cmds; + if (current_gamma == NATURE) + ctrl_pdata->dispparam_cmds = ctrl_pdata->nature_cmds; + } else{ + ctrl_pdata->eyemode = true; + ctrl_pdata->dispparam_cmds = ctrl_pdata->eye_cmds[level-1]; + } + + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(0, &ctrl_pdata->panel_data); + ret = mdss_dsi_panel_dispparam(pdata); + if (ret) { + pr_err("%s: unable to set the panel gamma\n", + __func__); + goto err_out; + } + + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(1, &ctrl_pdata->panel_data); + +err_out: + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + mutex_unlock(&eye_lock); + } + return ret; +} + +extern int mdss_dsi_panel_ce(struct mdss_panel_data *pdata); + int mdss_panel_set_ce(struct mdss_panel_data *pdata, int mode) +{ + int ret = 0; + struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + if (mode != current_ce) { + pr_err("%s: Set panel ce, mode is %d\n", __func__, mode); + mutex_lock(&ce_lock); + ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); + switch (mode) { + case VIVID: + ctrl_pdata->ce_cmds = ctrl_pdata->vivid_cmds; + current_ce = VIVID; + break; + case STANDARD: + ctrl_pdata->ce_cmds = ctrl_pdata->standard_cmds; + current_ce = STANDARD; + break; + case BRIGHT: + ctrl_pdata->ce_cmds = ctrl_pdata->bright_cmds; + current_ce = BRIGHT; + break; + default: + ret = -EINVAL; + goto err_out; + } + + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(0, &ctrl_pdata->panel_data); + + ret = mdss_dsi_panel_ce(pdata); + if (ret) { + pr_err("%s: unable to set the panel ce\n", __func__); + goto err_out; + } + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(1, &ctrl_pdata->panel_data); + +err_out: + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + mutex_unlock(&ce_lock); + } + return ret; +} +extern int mdss_dsi_panel_cabc(struct mdss_panel_data *pdata); + int mdss_panel_set_cabc(struct mdss_panel_data *pdata, int mode) +{ + int ret = 0; + struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + pr_err("%s: Set panel cabc, mode is %d\n", __func__, mode); + mutex_lock(&cabc_lock); + ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); + switch (mode) { + case CABC_ON: + ctrl_pdata->cabc_cmds = ctrl_pdata->cabc_on_cmds; + break; + case CABC_OFF: + ctrl_pdata->cabc_cmds = ctrl_pdata->cabc_off_cmds; + break; + default: + pr_err("%s: Set panel cabc fail, mode is %d\n", __func__, mode); + ret = -EINVAL; + goto err_out; + } + + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(0, &ctrl_pdata->panel_data); + + ret = mdss_dsi_panel_cabc(pdata); + if (ret) { + pr_err("%s: unable to set the panel cabc\n", __func__); + goto err_out; + } + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(1, &ctrl_pdata->panel_data); + +err_out: + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + mutex_unlock(&cabc_lock); + + return ret; +} + static int __init mdss_dsi_driver_init(void) { int ret; diff --git a/drivers/video/msm/mdss/mdss_dsi.h b/drivers/video/msm/mdss/mdss_dsi.h index 38ed93f50047a..dfc7eaeeec5d8 100644 --- a/drivers/video/msm/mdss/mdss_dsi.h +++ b/drivers/video/msm/mdss/mdss_dsi.h @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -64,6 +65,21 @@ #define NONE_PANEL "none" +enum { + WARM = 1, + COOL = 3, + NATURE = 2, + STANDARD = 10, + VIVID = 11, + BRIGHT = 12, +}; + +enum { /* mipi dsi panel */ + CABC_ON = 1, + CABC_OFF = 0, +}; + + enum { /* mipi dsi panel */ DSI_VIDEO_MODE, DSI_CMD_MODE, @@ -429,6 +445,7 @@ struct mdss_dsi_ctrl_pdata { int irq_cnt; int disp_te_gpio; int rst_gpio; + int iovdd_gpio; int disp_en_gpio; int bklt_en_gpio; int mode_gpio; @@ -468,6 +485,22 @@ struct mdss_dsi_ctrl_pdata { struct dsi_panel_cmds post_panel_on_cmds; struct dsi_panel_cmds off_cmds; struct dsi_panel_cmds status_cmds; + struct dsi_panel_cmds warm_cmds; + struct dsi_panel_cmds cool_cmds; + struct dsi_panel_cmds nature_cmds; + struct dsi_panel_cmds vivid_cmds; + struct dsi_panel_cmds standard_cmds; + struct dsi_panel_cmds bright_cmds; + struct dsi_panel_cmds eye_cmds[8]; + struct dsi_panel_cmds cabc_cmds; + struct dsi_panel_cmds cabc_on_cmds; + struct dsi_panel_cmds cabc_off_cmds; + int eye_cmds_num; + bool eyemode; + struct dsi_panel_cmds dispparam_cmds; + struct dsi_panel_cmds gamma_cmds; + struct dsi_panel_cmds ce_cmds; + bool init_last; u32 *status_valid_params; u32 *status_cmds_rlen; u32 *status_value; @@ -618,6 +651,10 @@ int mdss_dsi_pre_clkon_cb(void *priv, enum mdss_dsi_clk_type clk_type, enum mdss_dsi_clk_state new_state); int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable); +int mdss_panel_set_ce(struct mdss_panel_data *pdata, int mode); +int mdss_panel_set_gamma(struct mdss_panel_data *pdata, int mode); +int mdss_panel_set_dispparam(struct mdss_panel_data *pdata, int mode); +int mdss_panel_set_cabc(struct mdss_panel_data *pdata, int mode); void mdss_dsi_phy_disable(struct mdss_dsi_ctrl_pdata *ctrl); void mdss_dsi_cmd_test_pattern(struct mdss_dsi_ctrl_pdata *ctrl); void mdss_dsi_video_test_pattern(struct mdss_dsi_ctrl_pdata *ctrl); diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index 9598519d867f7..52404e8c6be48 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -603,7 +604,7 @@ static inline bool mdss_dsi_poll_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) if (readl_poll_timeout(((ctrl->ctrl_base) + 0x00a8), clk, (clk & 0x0010), - 10, 1000)) { + 100, 20000)) { pr_err("%s: ndx=%d clk lane NOT stopped, clk=%x\n", __func__, ctrl->ndx, clk); @@ -643,6 +644,7 @@ static void mdss_dsi_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) mdss_dsi_stop_hs_clk_lane(ctrl); mutex_lock(&ctrl->clk_lane_mutex); + MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt, current->pid, XLOG_FUNC_ENTRY); mdss_dsi_clk_ctrl(ctrl, ctrl->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); if (ctrl->clk_lane_cnt) { @@ -658,6 +660,7 @@ static void mdss_dsi_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) ctrl->ndx, ctrl->clk_lane_cnt); mdss_dsi_clk_ctrl(ctrl, ctrl->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt, current->pid, XLOG_FUNC_EXIT); mutex_unlock(&ctrl->clk_lane_mutex); } @@ -665,6 +668,10 @@ static void mdss_dsi_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) * mdss_dsi_stop_hs_clk_lane: * this function is work around solution for 8994 dsi clk lane * may stuck at HS problem + * since this function is called by event_thread, it may wakeup + * after next kickoff had been lunched and start_hs_clk_lane + * had been started. Therefore more than 1 vsync polling time is needed. + * Use 50ms timeout to cover 30 FPS case. */ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) { @@ -672,6 +679,8 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) u32 lane = 0; mutex_lock(&ctrl->clk_lane_mutex); + MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt, current->pid, + XLOG_FUNC_ENTRY); if (ctrl->clk_lane_cnt == 0) /* stopped already */ goto release; @@ -681,7 +690,7 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) if (readl_poll_timeout(((ctrl->ctrl_base) + 0x000c), fifo, ((fifo & 0x11110000) == 0x11110000), - 10, 1000)) { + 100, 50000)) { pr_err("%s: fifo NOT empty, fifo=%x\n", __func__, fifo); goto end; @@ -691,7 +700,7 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) if (readl_poll_timeout(((ctrl->ctrl_base) + 0x00a8), lane, ((lane & 0x000f) == 0x000f), - 100, 2000)) { + 100, 20000)) { pr_err("%s: datalane NOT stopped, lane=%x\n", __func__, lane); } @@ -708,6 +717,8 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) mdss_dsi_clk_ctrl(ctrl, ctrl->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt, + current->pid, XLOG_FUNC_EXIT); mutex_unlock(&ctrl->clk_lane_mutex); } diff --git a/drivers/video/msm/mdss/mdss_dsi_panel.c b/drivers/video/msm/mdss/mdss_dsi_panel.c index c694db751a2a4..bfa5e93124dad 100644 --- a/drivers/video/msm/mdss/mdss_dsi_panel.c +++ b/drivers/video/msm/mdss/mdss_dsi_panel.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -25,6 +26,7 @@ #include "mdss_dsi.h" #include "mdss_dba_utils.h" +#include #define DT_CMD_HDR 6 #define MIN_REFRESH_RATE 48 @@ -32,6 +34,9 @@ #define VSYNC_DELAY msecs_to_jiffies(17) +extern char Lcm_name[HARDWARE_MAX_ITEM_LONGTH]; +extern bool is_Lcm_Present; + DEFINE_LED_TRIGGER(bl_led_trigger); void mdss_dsi_panel_pwm_cfg(struct mdss_dsi_ctrl_pdata *ctrl) @@ -94,7 +99,6 @@ static void mdss_dsi_panel_bklt_pwm(struct mdss_dsi_ctrl_pdata *ctrl, int level) pr_debug("%s: bklt_ctrl=%d pwm_period=%d pwm_gpio=%d pwm_lpg_chan=%d\n", __func__, ctrl->bklt_ctrl, ctrl->pwm_period, ctrl->pwm_pmic_gpio, ctrl->pwm_lpg_chan); - pr_debug("%s: ndx=%d level=%d duty=%d\n", __func__, ctrl->ndx, level, duty); @@ -270,11 +274,13 @@ static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata) return rc; } +extern int tp_gesture_onoff; int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; struct mdss_panel_info *pinfo = NULL; int i, rc = 0; + unsigned long timeout = jiffies; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); @@ -285,6 +291,7 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) panel_data); pinfo = &(ctrl_pdata->panel_data.panel_info); + if ((mdss_dsi_is_right_ctrl(ctrl_pdata) && mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data)) || pinfo->is_dba_panel) { @@ -381,11 +388,17 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) gpio_set_value((ctrl_pdata->disp_en_gpio), 0); gpio_free(ctrl_pdata->disp_en_gpio); } - gpio_set_value((ctrl_pdata->rst_gpio), 0); + + if (((tp_gesture_onoff) || (pinfo->pwr_off_rst_pull_high)) && pinfo->panel_dead == 0) + gpio_set_value((ctrl_pdata->rst_gpio), 1); + else + gpio_set_value((ctrl_pdata->rst_gpio), 0); gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->mode_gpio)) gpio_free(ctrl_pdata->mode_gpio); } + pr_info("%s: mdss_dsi_panel_reset time=%ums \n", __func__, + jiffies_to_msecs(jiffies-timeout)); exit: return rc; @@ -708,6 +721,7 @@ static int mdss_dsi_panel_on(struct mdss_panel_data *pdata) struct mdss_panel_info *pinfo; struct dsi_panel_cmds *on_cmds; int ret = 0; + unsigned long timeout = jiffies; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); @@ -734,14 +748,54 @@ static int mdss_dsi_panel_on(struct mdss_panel_data *pdata) pr_debug("%s: ndx=%d cmd_cnt=%d\n", __func__, ctrl->ndx, on_cmds->cmd_cnt); + + if (ctrl->eyemode == true && (!strcmp(Lcm_name, "nt35521s_HD720p_video_EBBG_c3a"))) { + if (on_cmds->cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, on_cmds, CMD_REQ_COMMIT); + if (ctrl->dispparam_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->dispparam_cmds, CMD_REQ_COMMIT); + } else{ + if (ctrl->init_last) { + if (ctrl->eyemode == true) { + if (ctrl->dispparam_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->dispparam_cmds, CMD_REQ_COMMIT); + } else{ + if (ctrl->gamma_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->gamma_cmds, CMD_REQ_COMMIT); + if (ctrl->ce_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->ce_cmds, CMD_REQ_COMMIT); + } + } + if (on_cmds->cmd_cnt) mdss_dsi_panel_cmds_send(ctrl, on_cmds, CMD_REQ_COMMIT); + if (pinfo->cabcmode) { + if (ctrl->cabc_on_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->cabc_on_cmds, CMD_REQ_COMMIT); + } + + if (!ctrl->init_last) { + if (ctrl->eyemode == true) { + if (ctrl->dispparam_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->dispparam_cmds, CMD_REQ_COMMIT); + } else{ + if (ctrl->gamma_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->gamma_cmds, CMD_REQ_COMMIT); + if (ctrl->ce_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->ce_cmds, CMD_REQ_COMMIT); + } + } + } if (pinfo->compression_mode == COMPRESSION_DSC) mdss_dsi_panel_dsc_pps_send(ctrl, pinfo); if (ctrl->ds_registered) mdss_dba_utils_video_on(pinfo->dba_data, pinfo); + + pr_info("%s: mdss_dsi_panel_on time=%ums \n", __func__, + jiffies_to_msecs(jiffies-timeout)); + end: pr_debug("%s:-\n", __func__); return ret; @@ -790,6 +844,7 @@ static int mdss_dsi_panel_off(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl = NULL; struct mdss_panel_info *pinfo; + unsigned long timeout = jiffies; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); @@ -814,6 +869,8 @@ static int mdss_dsi_panel_off(struct mdss_panel_data *pdata) mdss_dba_utils_video_off(pinfo->dba_data); mdss_dba_utils_hdcp_enable(pinfo->dba_data, false); } + pr_info("%s: mdss_dsi_panel_off time=%ums \n", __func__, + jiffies_to_msecs(jiffies-timeout)); end: pr_debug("%s:-\n", __func__); @@ -844,6 +901,97 @@ static int mdss_dsi_panel_low_power_config(struct mdss_panel_data *pdata, return 0; } +int mdss_dsi_panel_gamma(struct mdss_panel_data *pdata) +{ + struct mipi_panel_info *mipi; + struct mdss_dsi_ctrl_pdata *ctrl = NULL; + + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + + ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mipi = &pdata->panel_info.mipi; + + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); + + if (ctrl->gamma_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->gamma_cmds, CMD_REQ_COMMIT); + + pr_debug("%s:-\n", __func__); + return 0; +} +int mdss_dsi_panel_ce(struct mdss_panel_data *pdata) +{ + struct mipi_panel_info *mipi; + struct mdss_dsi_ctrl_pdata *ctrl = NULL; + + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + + ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mipi = &pdata->panel_info.mipi; + + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); + + if (ctrl->ce_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->ce_cmds, CMD_REQ_COMMIT); + + pr_debug("%s:-\n", __func__); + return 0; +} + +int mdss_dsi_panel_dispparam(struct mdss_panel_data *pdata) +{ + struct mipi_panel_info *mipi; + struct mdss_dsi_ctrl_pdata *ctrl = NULL; + + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + + ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mipi = &pdata->panel_info.mipi; + + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); + + if (ctrl->dispparam_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->dispparam_cmds, CMD_REQ_COMMIT); + + pr_debug("%s:-\n", __func__); + return 0; +} + +int mdss_dsi_panel_cabc(struct mdss_panel_data *pdata) +{ + struct mipi_panel_info *mipi; + struct mdss_dsi_ctrl_pdata *ctrl = NULL; + + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + + ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mipi = &pdata->panel_info.mipi; + + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); + + if (ctrl->cabc_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->cabc_cmds, CMD_REQ_COMMIT); + + pr_debug("%s:-\n", __func__); + return 0; +} + static void mdss_dsi_parse_trigger(struct device_node *np, char *trigger, char *trigger_key) { @@ -892,7 +1040,8 @@ static int mdss_dsi_parse_dcs_cmds(struct device_node *np, while (len >= sizeof(*dchdr)) { dchdr = (struct dsi_ctrl_hdr *)bp; dchdr->dlen = ntohs(dchdr->dlen); - if (dchdr->dlen > len) { + + if (dchdr->dlen > len || dchdr->dlen < 0) { pr_err("%s: dtsi cmd=%x error, len=%d", __func__, dchdr->dtype, dchdr->dlen); goto exit_free; @@ -1493,7 +1642,7 @@ static int mdss_dsi_parse_reset_seq(struct device_node *np, } return 0; } - +extern int panel_dead2tp; static bool mdss_dsi_cmp_panel_reg_v2(struct mdss_dsi_ctrl_pdata *ctrl) { int i, j; @@ -1507,9 +1656,18 @@ static bool mdss_dsi_cmp_panel_reg_v2(struct mdss_dsi_ctrl_pdata *ctrl) for (j = 0; j < ctrl->groups; ++j) { for (i = 0; i < len; ++i) { - if (ctrl->return_buf[i] != - ctrl->status_value[group + i]) + if (ctrl->return_buf[i] != ctrl->status_value[group + i]) { + pr_info("%s: LCD ESD check fail, return_buf[%d]=0x%02x , status_value=[%d]=0x%02x \n", __func__, + i, ctrl->return_buf[i], group + i, ctrl->status_value[group + i]); break; + } + #ifdef CONFIG_D1_ROSY + + if (panel_dead2tp) { + pr_info("%s: LCD ESD check fail, panel_dead2tp is %d\n ", __func__, panel_dead2tp); + break; + } + #endif } if (i == len) @@ -1724,7 +1882,8 @@ static void mdss_dsi_parse_esd_params(struct device_node *np, pinfo->esd_check_enabled = of_property_read_bool(np, "qcom,esd-check-enabled"); - if (!pinfo->esd_check_enabled) + + if ((!pinfo->esd_check_enabled) || (!is_Lcm_Present)) return; ctrl->status_mode = ESD_MAX; @@ -2360,6 +2519,21 @@ static int mdss_panel_parse_display_timings(struct device_node *np, return rc; } + +void mdss_dsi_parse_eye_command(struct device_node *np, struct mdss_dsi_ctrl_pdata *ctrl_pdata) +{ + int i = 0; + char cmd_key[] = "qcom,mdss-dsi-panel-eye-command01"; + int cmd_len = strlen(cmd_key); + for (i = 1; i <= ctrl_pdata->eye_cmds_num; i++) { + cmd_key[cmd_len-1] = i%10 + '0'; + cmd_key[cmd_len-2] = i/10 + '0'; + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->eye_cmds[i-1], + cmd_key, "qcom,mdss-dsi-panel-gamma-command-state"); + } +} + static int mdss_panel_parse_dt(struct device_node *np, struct mdss_dsi_ctrl_pdata *ctrl_pdata) { @@ -2428,6 +2602,9 @@ static int mdss_panel_parse_dt(struct device_node *np, rc = of_property_read_u32(np, "qcom,mdss-brightness-max-level", &tmp); pinfo->brightness_max = (!rc ? tmp : MDSS_MAX_BL_BRIGHTNESS); + #if defined(WT_COMPILE_FACTORY_VERSION) && defined(CONFIG_D1_ROSY) + pinfo->brightness_max = 255; + #endif rc = of_property_read_u32(np, "qcom,mdss-dsi-bl-min-level", &tmp); pinfo->bl_min = (!rc ? tmp : 0); rc = of_property_read_u32(np, "qcom,mdss-dsi-bl-max-level", &tmp); @@ -2556,9 +2733,44 @@ static int mdss_panel_parse_dt(struct device_node *np, mdss_dsi_parse_reset_seq(np, pinfo->rst_seq, &(pinfo->rst_seq_len), "qcom,mdss-dsi-reset-sequence"); + + rc = of_property_read_u32(np, "qcom,mdss-dsi-pwr-off-rst-pull-high", &tmp); + pinfo->pwr_off_rst_pull_high = (!rc ? tmp : 0); + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->off_cmds, "qcom,mdss-dsi-off-command", "qcom,mdss-dsi-off-command-state"); + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->warm_cmds, + "qcom,mdss-dsi-panel-warm-command", "qcom,mdss-dsi-panel-gamma-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->cool_cmds, + "qcom,mdss-dsi-panel-cool-command", "qcom,mdss-dsi-panel-gamma-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->nature_cmds, + "qcom,mdss-dsi-panel-nature-command", "qcom,mdss-dsi-panel-gamma-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->standard_cmds, + "qcom,mdss-dsi-panel-ce-std-command", "qcom,mdss-dsi-panel-ce-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->vivid_cmds, + "qcom,mdss-dsi-panel-ce-vivid-command", "qcom,mdss-dsi-panel-ce-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->bright_cmds, + "qcom,mdss-dsi-panel-ce-bright-command", "qcom,mdss-dsi-panel-ce-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->cabc_on_cmds, + "qcom,mdss-dsi-panel-cabc-on-command", "qcom,mdss-dsi-panel-cabc-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->cabc_off_cmds, + "qcom,mdss-dsi-panel-cabc-off-command", "qcom,mdss-dsi-panel-cabc-command-state"); + + rc = of_property_read_u32(np, "qcom,mdss-dsi-panel-eye-command-num", &tmp); + ctrl_pdata->eye_cmds_num = (!rc ? tmp : 0); + + mdss_dsi_parse_eye_command(np, ctrl_pdata); + + ctrl_pdata->init_last = of_property_read_bool(np, "qcom, mdss-dsi-init-last"); + rc = of_property_read_u32(np, "qcom,adjust-timer-wakeup-ms", &tmp); pinfo->adjust_timer_delay_ms = (!rc ? tmp : 0); @@ -2621,7 +2833,13 @@ int mdss_dsi_panel_init(struct device_node *node, } else { pr_info("%s: Panel Name = %s\n", __func__, panel_name); strlcpy(&pinfo->panel_name[0], panel_name, MDSS_MAX_PANEL_LEN); + /*add for hardware info*/ + strcpy(Lcm_name, panel_name); } + + if (!is_Lcm_Present) + strcpy(Lcm_name, ""); + rc = mdss_panel_parse_dt(node, ctrl_pdata); if (rc) { pr_err("%s:%d panel dt parse failed\n", __func__, __LINE__); @@ -2636,7 +2854,9 @@ int mdss_dsi_panel_init(struct device_node *node, ctrl_pdata->post_panel_on = mdss_dsi_post_panel_on; ctrl_pdata->off = mdss_dsi_panel_off; ctrl_pdata->low_power_config = mdss_dsi_panel_low_power_config; - ctrl_pdata->panel_data.set_backlight = mdss_dsi_panel_bl_ctrl; + if (is_Lcm_Present) { + ctrl_pdata->panel_data.set_backlight = mdss_dsi_panel_bl_ctrl; + } ctrl_pdata->switch_mode = mdss_dsi_panel_switch_mode; return 0; diff --git a/drivers/video/msm/mdss/mdss_dsi_status.c b/drivers/video/msm/mdss/mdss_dsi_status.c index bf545ae311f2c..5459cb1ec756f 100644 --- a/drivers/video/msm/mdss/mdss_dsi_status.c +++ b/drivers/video/msm/mdss/mdss_dsi_status.c @@ -30,7 +30,7 @@ #include "mdss_panel.h" #include "mdss_mdp.h" -#define STATUS_CHECK_INTERVAL_MS 5000 +#define STATUS_CHECK_INTERVAL_MS 2000 #define STATUS_CHECK_INTERVAL_MIN_MS 50 #define DSI_STATUS_CHECK_INIT -1 #define DSI_STATUS_CHECK_DISABLE 1 diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index fe3f1dd05bd01..d3f99836c4afa 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -3,6 +3,7 @@ * * Copyright (C) 2007 Google Incorporated * Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -48,12 +49,16 @@ #include #include #include + +#include +#include #include "mdss_fb.h" #include "mdss_mdp_splash_logo.h" #define CREATE_TRACE_POINTS #include "mdss_debug.h" #include "mdss_smmu.h" #include "mdss_mdp.h" +#include "mdss_dsi.h" #ifdef CONFIG_FB_MSM_TRIPLE_BUFFER #define MDSS_FB_NUM 3 @@ -115,6 +120,36 @@ static int mdss_fb_send_panel_event(struct msm_fb_data_type *mfd, int event, void *arg); static void mdss_fb_set_mdp_sync_pt_threshold(struct msm_fb_data_type *mfd, int type); + +#define WAIT_RESUME_TIMEOUT 200 +static struct fb_info *prim_fbi; +static struct delayed_work prim_panel_work; +static atomic_t prim_panel_is_on; +static struct wake_lock prim_panel_wakelock; +static void prim_panel_off_delayed_work(struct work_struct *work) +{ +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_lock(); +#endif + if (!lock_fb_info(prim_fbi)) { +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_unlock(); +#endif + return; + } + + if (atomic_read(&prim_panel_is_on)) { + fb_blank(prim_fbi, FB_BLANK_POWERDOWN); + atomic_set(&prim_panel_is_on, false); + wake_unlock(&prim_panel_wakelock); + } + + unlock_fb_info(prim_fbi); +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_unlock(); +#endif +} + void mdss_fb_no_update_notify_timer_cb(unsigned long data) { struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)data; @@ -257,11 +292,21 @@ static int mdss_fb_notify_update(struct msm_fb_data_type *mfd, static int lcd_backlight_registered; +#define WINGTECH_MDSS_BRIGHT_TO_BL(out, v, bl_min, bl_max, min_bright, max_bright) do {\ + if (v <= ((int)min_bright*(int)bl_max-(int)bl_min*(int)max_bright)\ + /((int)bl_max - (int)bl_min)) out = 1; \ + else \ + out = (((int)bl_max - (int)bl_min)*v + \ + ((int)max_bright*(int)bl_min - (int)min_bright*(int)bl_max)) \ + /((int)max_bright - (int)min_bright); \ + } while (0) static void mdss_fb_set_bl_brightness(struct led_classdev *led_cdev, enum led_brightness value) { struct msm_fb_data_type *mfd = dev_get_drvdata(led_cdev->dev->parent); - int bl_lvl; + int bl_lvl, brightness_min; + + brightness_min = 10; if (mfd->boot_notification_led) { led_trigger_event(mfd->boot_notification_led, 0); @@ -271,13 +316,16 @@ static void mdss_fb_set_bl_brightness(struct led_classdev *led_cdev, if (value > mfd->panel_info->brightness_max) value = mfd->panel_info->brightness_max; - /* This maps android backlight level 0 to 255 into - driver backlight level 0 to bl_max with rounding */ - MDSS_BRIGHT_TO_BL(bl_lvl, value, mfd->panel_info->bl_max, - mfd->panel_info->brightness_max); + if (mfd->panel_info->bl_min == 1) + mfd->panel_info->bl_min = 5; + WINGTECH_MDSS_BRIGHT_TO_BL(bl_lvl, value, mfd->panel_info->bl_min, mfd->panel_info->bl_max, + brightness_min, mfd->panel_info->brightness_max); + if (bl_lvl && !value) + bl_lvl = 0; if (!bl_lvl && value) bl_lvl = 1; + pr_debug("bl_lvl is %d, value is %d\n", bl_lvl, value); if (!IS_CALIB_MODE_BL(mfd) && (!mfd->ext_bl_ctrl || !value || !mfd->bl_level)) { @@ -836,6 +884,7 @@ static void mdss_fb_shutdown(struct platform_device *pdev) struct msm_fb_data_type *mfd = platform_get_drvdata(pdev); mfd->shutdown_pending = true; + pr_err("mdss_fb_shutdown, shutdown_pending = true\n"); /* wake up threads waiting on idle or kickoff queues */ wake_up_all(&mfd->idle_wait_q); @@ -1267,6 +1316,12 @@ static int mdss_fb_remove(struct platform_device *pdev) if (!mfd) return -ENODEV; + if (mfd->panel_info && mfd->panel_info->is_prim_panel) { + atomic_set(&prim_panel_is_on, false); + cancel_delayed_work_sync(&prim_panel_work); + wake_lock_destroy(&prim_panel_wakelock); + } + mdss_fb_remove_sysfs(mfd); pm_runtime_disable(mfd->fbi->dev); @@ -1442,6 +1497,31 @@ static int mdss_fb_resume(struct platform_device *pdev) #endif #ifdef CONFIG_PM_SLEEP + +static int mdss_fb_pm_prepare(struct device *dev) +{ + struct msm_fb_data_type *mfd = dev_get_drvdata(dev); + + if (!mfd) + return -ENODEV; + if (mfd->panel_info->is_prim_panel) + atomic_inc(&mfd->resume_pending); + return 0; +} + +static void mdss_fb_pm_complete(struct device *dev) +{ + struct msm_fb_data_type *mfd = dev_get_drvdata(dev); + + if (!mfd) + return; + if (mfd->panel_info->is_prim_panel) { + atomic_set(&mfd->resume_pending, 0); + wake_up_all(&mfd->resume_wait_q); + } + return; +} + static int mdss_fb_pm_suspend(struct device *dev) { struct msm_fb_data_type *mfd = dev_get_drvdata(dev); @@ -1476,6 +1556,9 @@ static int mdss_fb_pm_resume(struct device *dev) #endif static const struct dev_pm_ops mdss_fb_pm_ops = { + + .prepare = mdss_fb_pm_prepare, + .complete = mdss_fb_pm_complete, SET_SYSTEM_SLEEP_PM_OPS(mdss_fb_pm_suspend, mdss_fb_pm_resume) }; @@ -1607,6 +1690,7 @@ void mdss_fb_update_backlight(struct msm_fb_data_type *mfd) pdata->set_backlight(pdata, temp); mfd->bl_level_scaled = mfd->unset_bl_level; mfd->allow_bl_update = true; + pr_info("LCD backlight level=%u \n", temp); } } mutex_unlock(&mfd->bl_lock); @@ -1917,6 +2001,14 @@ static int mdss_fb_blank(int blank_mode, struct fb_info *info) struct mdss_panel_data *pdata; struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par; + if ((info == prim_fbi) && (blank_mode == FB_BLANK_UNBLANK) && + atomic_read(&prim_panel_is_on)) { + atomic_set(&prim_panel_is_on, false); + wake_unlock(&prim_panel_wakelock); + cancel_delayed_work_sync(&prim_panel_work); + return 0; + } + ret = mdss_fb_pan_idle(mfd); if (ret) { pr_warn("mdss_fb_pan_idle for fb%d failed. ret=%d\n", @@ -2540,6 +2632,7 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd) atomic_set(&mfd->commits_pending, 0); atomic_set(&mfd->ioctl_ref_cnt, 0); atomic_set(&mfd->kickoff_pending, 0); + atomic_set(&mfd->resume_pending, 0); init_timer(&mfd->no_update.timer); mfd->no_update.timer.function = mdss_fb_no_update_notify_timer_cb; @@ -2555,6 +2648,7 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd) init_waitqueue_head(&mfd->idle_wait_q); init_waitqueue_head(&mfd->ioctl_q); init_waitqueue_head(&mfd->kickoff_wait_q); + init_waitqueue_head(&mfd->resume_wait_q); ret = fb_alloc_cmap(&fbi->cmap, 256, 0); if (ret) @@ -2573,6 +2667,14 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd) pr_info("FrameBuffer[%d] %dx%d registered successfully!\n", mfd->index, fbi->var.xres, fbi->var.yres); + if (panel_info->is_prim_panel) { + prim_fbi = fbi; + atomic_set(&prim_panel_is_on, false); + INIT_DELAYED_WORK(&prim_panel_work, prim_panel_off_delayed_work); + wake_lock_init(&prim_panel_wakelock, WAKE_LOCK_SUSPEND, "prim_panel_wakelock"); + } + + return 0; } @@ -2983,6 +3085,7 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, static int mdss_fb_pan_idle(struct msm_fb_data_type *mfd) { int ret = 0; + static int shutdown_pending_count; ret = wait_event_timeout(mfd->idle_wait_q, (!atomic_read(&mfd->commits_pending) || @@ -2996,8 +3099,14 @@ static int mdss_fb_pan_idle(struct msm_fb_data_type *mfd) "dbg_bus", "vbif_dbg_bus"); ret = -ETIMEDOUT; } else if (mfd->shutdown_pending) { - pr_debug("Shutdown signalled\n"); - ret = -ESHUTDOWN; + if (shutdown_pending_count++ < 10) { + pr_debug("Shutdown signalled\n"); + ret = -ESHUTDOWN; + } else { + pr_debug("work around for shutdown fail\n"); + shutdown_pending_count = 0; + ret = 0; + } } else { ret = 0; } @@ -4602,6 +4711,10 @@ int mdss_fb_do_ioctl(struct fb_info *info, unsigned int cmd, struct mdp_buf_sync buf_sync; unsigned int dsi_mode = 0; struct mdss_panel_data *pdata = NULL; + unsigned int Color_mode = 0; + unsigned int CE_mode = 0; + unsigned int Eye_mode = 0; + unsigned int CABC_mode = 0; if (!info || !info->par) return -EINVAL; @@ -4680,6 +4793,36 @@ int mdss_fb_do_ioctl(struct fb_info *info, unsigned int cmd, ret = mdss_fb_async_position_update_ioctl(info, argp); break; + case MSMFB_ENHANCE_SET_GAMMA: + if (copy_from_user(&Color_mode, argp, sizeof(Color_mode))) { + pr_err("%s: MSMFB_ENHANCE_SET_GAMMA ioctl failed\n", __func__); + goto exit; + } + ret = mdss_panel_set_gamma(pdata, Color_mode); + break; + + case MSMFB_ENHANCE_SET_CE: + if (copy_from_user(&CE_mode, argp, sizeof(CE_mode))) { + pr_err("%s: MSMFB_ENHANCE_SET_CE ioctl failed\n", __func__); + goto exit; + } + ret = mdss_panel_set_ce(pdata, CE_mode); + break; + case MSMFB_ENHANCE_SET_EYE: + if (copy_from_user(&Eye_mode, argp, sizeof(Eye_mode))) { + pr_err("%s: MSMFB_ENHANCE_SET_EYE ioctl failed\n", __func__); + goto exit; + } + ret = mdss_panel_set_dispparam(pdata, Eye_mode); + break; + case MSMFB_SET_CABC: + if (copy_from_user(&CABC_mode, argp, sizeof(CABC_mode))) { + pr_err("%s: MSMFB_SET_CABC ioctl failed\n", __func__); + goto exit; + } + ret = mdss_panel_set_cabc(pdata, CABC_mode); + pdata->panel_info.cabcmode = CABC_mode; + break; default: if (mfd->mdp.ioctl_handler) ret = mfd->mdp.ioctl_handler(mfd, cmd, argp); @@ -4878,6 +5021,8 @@ int mdss_fb_suspres_panel(struct device *dev, void *data) * from the panel. The function sends the PANEL_ALIVE=0 status to HAL * layer. */ +int panel_dead2tp = 0; +EXPORT_SYMBOL(panel_dead2tp); void mdss_fb_report_panel_dead(struct msm_fb_data_type *mfd) { char *envp[2] = {"PANEL_ALIVE=0", NULL}; @@ -4889,7 +5034,63 @@ void mdss_fb_report_panel_dead(struct msm_fb_data_type *mfd) } pdata->panel_info.panel_dead = true; + panel_dead2tp = pdata->panel_info.panel_dead; kobject_uevent_env(&mfd->fbi->dev->kobj, KOBJ_CHANGE, envp); pr_err("Panel has gone bad, sending uevent - %s\n", envp[0]); } + +/* + * mdss_prim_panel_fb_unblank() - Unblank primary panel FB + * @timeout : >0 blank primary panel FB after timeout (ms) + */ +int mdss_prim_panel_fb_unblank(int timeout) +{ + int ret = 0; + struct msm_fb_data_type *mfd = NULL; + + if (prim_fbi) { + mfd = (struct msm_fb_data_type *)prim_fbi->par; + ret = wait_event_timeout(mfd->resume_wait_q, + !atomic_read(&mfd->resume_pending), + msecs_to_jiffies(WAIT_RESUME_TIMEOUT)); + if (!ret) { + pr_info("Primary fb resume timeout\n"); + return -ETIMEDOUT; + } +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_lock(); +#endif + if (!lock_fb_info(prim_fbi)) { +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_unlock(); +#endif + return -ENODEV; + } + if (prim_fbi->blank == FB_BLANK_UNBLANK) { + unlock_fb_info(prim_fbi); +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_unlock(); +#endif + return 0; + } + wake_lock(&prim_panel_wakelock); + ret = fb_blank(prim_fbi, FB_BLANK_UNBLANK); + if (!ret) { + atomic_set(&prim_panel_is_on, true); + if (timeout > 0) + schedule_delayed_work(&prim_panel_work, msecs_to_jiffies(timeout)); + else + wake_unlock(&prim_panel_wakelock); + } else + wake_unlock(&prim_panel_wakelock); + unlock_fb_info(prim_fbi); +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_unlock(); +#endif + return ret; + } + + pr_err("primary panel is not existed\n"); + return -EINVAL; +} diff --git a/drivers/video/msm/mdss/mdss_fb.h b/drivers/video/msm/mdss/mdss_fb.h index 56997e40d2443..4f5c6e37817aa 100644 --- a/drivers/video/msm/mdss/mdss_fb.h +++ b/drivers/video/msm/mdss/mdss_fb.h @@ -1,4 +1,5 @@ /* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -322,6 +323,9 @@ struct msm_fb_data_type { struct task_struct *disp_thread; atomic_t commits_pending; atomic_t kickoff_pending; + + atomic_t resume_pending; + wait_queue_head_t resume_wait_q; wait_queue_head_t commit_wait_q; wait_queue_head_t idle_wait_q; wait_queue_head_t kickoff_wait_q; diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index 2a163e7ecddb2..3c9da0bc13f60 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -2132,6 +2132,7 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, commit_cb.data = mfd; ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL, &commit_cb); + ctl->panel_data->panel_info.kickoff_count++; ATRACE_END("display_commit"); } diff --git a/drivers/video/msm/mdss/mdss_panel.h b/drivers/video/msm/mdss/mdss_panel.h index 38b0fc222227e..fa32966044704 100644 --- a/drivers/video/msm/mdss/mdss_panel.h +++ b/drivers/video/msm/mdss/mdss_panel.h @@ -620,11 +620,13 @@ struct mdss_panel_info { u32 out_format; u32 rst_seq[MDSS_DSI_RST_SEQ_LEN]; u32 rst_seq_len; + u32 pwr_off_rst_pull_high; u32 vic; /* video identification code */ struct mdss_rect roi; int pwm_pmic_gpio; int pwm_lpg_chan; int pwm_period; + unsigned int cabcmode; bool dynamic_fps; bool ulps_feature_enabled; bool ulps_suspend_enabled; @@ -731,6 +733,8 @@ struct mdss_panel_info { /* debugfs structure for the panel */ struct mdss_panel_debugfs_info *debugfs_info; + u64 kickoff_count; + u64 panel_active; /* HDR properties of display panel*/ struct mdss_panel_hdr_properties hdr_properties; diff --git a/drivers/video/msm/mdss/mdss_rotator.c b/drivers/video/msm/mdss/mdss_rotator.c index 5dbedc42eb43b..c6be47c555320 100644 --- a/drivers/video/msm/mdss/mdss_rotator.c +++ b/drivers/video/msm/mdss/mdss_rotator.c @@ -1126,6 +1126,7 @@ static void mdss_rotator_release_from_work_distribution( bool free_perf = false; u32 wb_idx = entry->queue->hw->wb_id; + mutex_lock(&mgr->lock); mutex_lock(&entry->perf->work_dis_lock); if (entry->perf->work_distribution[wb_idx]) entry->perf->work_distribution[wb_idx]--; @@ -1149,6 +1150,7 @@ static void mdss_rotator_release_from_work_distribution( mdss_rotator_clk_ctrl(mgr, false); entry->perf = NULL; } + mutex_unlock(&mgr->lock); } } @@ -2045,7 +2047,6 @@ static int mdss_rotator_close_session(struct mdss_rot_mgr *mgr, list_del_init(&perf->list); mutex_unlock(&perf->work_dis_lock); mutex_unlock(&private->perf_lock); - mutex_unlock(&mgr->lock); if (offload_release_work) goto done; @@ -2058,6 +2059,7 @@ static int mdss_rotator_close_session(struct mdss_rot_mgr *mgr, done: pr_debug("Closed session id:%u", id); ATRACE_END(__func__); + mutex_unlock(&mgr->lock); return 0; } diff --git a/fs/attr.c b/fs/attr.c index 6530ced19697d..ebb3ee561c1d1 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -187,7 +187,7 @@ EXPORT_SYMBOL(setattr_copy); * the file open for write, as there can be no conflicting delegation in * that case. */ -int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **delegated_inode) +int notify_change2(struct vfsmount *mnt, struct dentry *dentry, struct iattr *attr, struct inode **delegated_inode) { struct inode *inode = dentry->d_inode; umode_t mode = inode->i_mode; @@ -262,7 +262,9 @@ int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **de if (error) return error; - if (inode->i_op->setattr) + if (mnt && inode->i_op->setattr2) + error = inode->i_op->setattr2(mnt, dentry, attr); + else if (inode->i_op->setattr) error = inode->i_op->setattr(dentry, attr); else error = simple_setattr(dentry, attr); @@ -275,4 +277,10 @@ int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **de return error; } +EXPORT_SYMBOL(notify_change2); + +int notify_change(struct dentry *dentry, struct iattr *attr, struct inode **delegated_inode) +{ + return notify_change2(NULL, dentry, attr, delegated_inode); +} EXPORT_SYMBOL(notify_change); diff --git a/fs/coredump.c b/fs/coredump.c index 7eb6181184ea0..b4b521aa7b804 100644 --- a/fs/coredump.c +++ b/fs/coredump.c @@ -707,7 +707,7 @@ void do_coredump(const siginfo_t *siginfo) goto close_fail; if (!(cprm.file->f_mode & FMODE_CAN_WRITE)) goto close_fail; - if (do_truncate(cprm.file->f_path.dentry, 0, 0, cprm.file)) + if (do_truncate2(cprm.file->f_path.mnt, cprm.file->f_path.dentry, 0, 0, cprm.file)) goto close_fail; } diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index 8dc0492ff81c7..5edc638165ae4 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c @@ -1745,7 +1745,7 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, mutex_lock(tfm_mutex); rc = crypto_blkcipher_setkey( desc.tfm, auth_tok->token.password.session_key_encryption_key, - auth_tok->token.password.session_key_encryption_key_bytes); + ecryptfs_get_key_size_to_store_key(crypt_stat)); if (unlikely(rc < 0)) { mutex_unlock(tfm_mutex); printk(KERN_ERR "Error setting key for crypto context\n"); @@ -2294,12 +2294,11 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, if (auth_tok->token.password.flags & ECRYPTFS_SESSION_KEY_ENCRYPTION_KEY_SET) { ecryptfs_printk(KERN_DEBUG, "Using previously generated " - "session key encryption key of size [%d]\n", - auth_tok->token.password. - session_key_encryption_key_bytes); + "session key encryption key of size [%zd]\n", + ecryptfs_get_key_size_to_store_key(crypt_stat)); memcpy(session_key_encryption_key, auth_tok->token.password.session_key_encryption_key, - auth_tok->token.password.session_key_encryption_key_bytes); + ecryptfs_get_key_size_to_store_key(crypt_stat)); ecryptfs_printk(KERN_DEBUG, "Cached session key encryption key:\n"); if (ecryptfs_verbosity > 0) @@ -2332,7 +2331,7 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, } mutex_lock(tfm_mutex); rc = crypto_blkcipher_setkey(desc.tfm, session_key_encryption_key, - auth_tok->token.password.session_key_encryption_key_bytes); + ecryptfs_get_key_size_to_store_key(crypt_stat)); if (rc < 0) { mutex_unlock(tfm_mutex); ecryptfs_printk(KERN_ERR, "Error setting key for crypto " diff --git a/fs/exec.c b/fs/exec.c index b7a5f46181b0f..b079500cb496b 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1092,7 +1092,7 @@ EXPORT_SYMBOL(flush_old_exec); void would_dump(struct linux_binprm *bprm, struct file *file) { - if (inode_permission(file_inode(file), MAY_READ) < 0) + if (inode_permission2(file->f_path.mnt, file_inode(file), MAY_READ) < 0) bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP; } EXPORT_SYMBOL(would_dump); diff --git a/fs/inode.c b/fs/inode.c index 56d1d2b4bf317..da55347c44a28 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1598,7 +1598,7 @@ int should_remove_suid(struct dentry *dentry) } EXPORT_SYMBOL(should_remove_suid); -static int __remove_suid(struct dentry *dentry, int kill) +static int __remove_suid(struct vfsmount *mnt, struct dentry *dentry, int kill) { struct iattr newattrs; @@ -1607,7 +1607,7 @@ static int __remove_suid(struct dentry *dentry, int kill) * Note we call this on write, so notify_change will not * encounter any conflicting delegations: */ - return notify_change(dentry, &newattrs, NULL); + return notify_change2(mnt, dentry, &newattrs, NULL); } int file_remove_suid(struct file *file) @@ -1630,7 +1630,7 @@ int file_remove_suid(struct file *file) if (killpriv) error = security_inode_killpriv(dentry); if (!error && killsuid) - error = __remove_suid(dentry, killsuid); + error = __remove_suid(file->f_path.mnt, dentry, killsuid); if (!error) inode_has_no_xattr(inode); diff --git a/fs/internal.h b/fs/internal.h index ff683fcf3e16b..7644ead97418c 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -83,9 +83,11 @@ extern struct file *get_empty_filp(void); * super.c */ extern int do_remount_sb(struct super_block *, int, void *, int); +extern int do_remount_sb2(struct vfsmount *, struct super_block *, int, + void *, int); extern bool grab_super_passive(struct super_block *sb); extern struct dentry *mount_fs(struct file_system_type *, - int, const char *, void *); + int, const char *, struct vfsmount *, void *); extern struct super_block *user_get_super(dev_t); /* diff --git a/fs/namei.c b/fs/namei.c index 46e02f4c630a2..5ec9ccc4f7ff1 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -368,9 +368,11 @@ EXPORT_SYMBOL(generic_permission); * flag in inode->i_opflags, that says "this has not special * permission function, use the fast case". */ -static inline int do_inode_permission(struct inode *inode, int mask) +static inline int do_inode_permission(struct vfsmount *mnt, struct inode *inode, int mask) { if (unlikely(!(inode->i_opflags & IOP_FASTPERM))) { + if (likely(mnt && inode->i_op->permission2)) + return inode->i_op->permission2(mnt, inode, mask); if (likely(inode->i_op->permission)) return inode->i_op->permission(inode, mask); @@ -394,7 +396,7 @@ static inline int do_inode_permission(struct inode *inode, int mask) * This does not check for a read-only file system. You probably want * inode_permission(). */ -int __inode_permission(struct inode *inode, int mask) +int __inode_permission2(struct vfsmount *mnt, struct inode *inode, int mask) { int retval; @@ -406,7 +408,7 @@ int __inode_permission(struct inode *inode, int mask) return -EACCES; } - retval = do_inode_permission(inode, mask); + retval = do_inode_permission(mnt, inode, mask); if (retval) return retval; @@ -414,7 +416,14 @@ int __inode_permission(struct inode *inode, int mask) if (retval) return retval; - return security_inode_permission(inode, mask); + retval = security_inode_permission(inode, mask); + return retval; +} +EXPORT_SYMBOL(__inode_permission2); + +int __inode_permission(struct inode *inode, int mask) +{ + return __inode_permission2(NULL, inode, mask); } EXPORT_SYMBOL(__inode_permission); @@ -450,14 +459,20 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) * * When checking for MAY_APPEND, MAY_WRITE must also be set in @mask. */ -int inode_permission(struct inode *inode, int mask) +int inode_permission2(struct vfsmount *mnt, struct inode *inode, int mask) { int retval; retval = sb_permission(inode->i_sb, inode, mask); if (retval) return retval; - return __inode_permission(inode, mask); + return __inode_permission2(mnt, inode, mask); +} +EXPORT_SYMBOL(inode_permission2); + +int inode_permission(struct inode *inode, int mask) +{ + return inode_permission2(NULL, inode, mask); } EXPORT_SYMBOL(inode_permission); @@ -1512,13 +1527,13 @@ static int lookup_slow(struct nameidata *nd, struct path *path) static inline int may_lookup(struct nameidata *nd) { if (nd->flags & LOOKUP_RCU) { - int err = inode_permission(nd->inode, MAY_EXEC|MAY_NOT_BLOCK); + int err = inode_permission2(nd->path.mnt, nd->inode, MAY_EXEC|MAY_NOT_BLOCK); if (err != -ECHILD) return err; if (unlazy_walk(nd, NULL)) return -ECHILD; } - return inode_permission(nd->inode, MAY_EXEC); + return inode_permission2(nd->path.mnt, nd->inode, MAY_EXEC); } static inline int handle_dots(struct nameidata *nd, int type) @@ -1856,11 +1871,12 @@ static int path_init(int dfd, const char *name, unsigned int flags, nd->depth = 0; if (flags & LOOKUP_ROOT) { struct dentry *root = nd->root.dentry; + struct vfsmount *mnt = nd->root.mnt; struct inode *inode = root->d_inode; if (*name) { if (!d_can_lookup(root)) return -ENOTDIR; - retval = inode_permission(inode, MAY_EXEC); + retval = inode_permission2(mnt, inode, MAY_EXEC); if (retval) return retval; } @@ -2114,6 +2130,7 @@ static struct dentry *lookup_hash(struct nameidata *nd) /** * lookup_one_len - filesystem helper to lookup single pathname component * @name: pathname component to lookup + * @mnt: mount we are looking up on * @base: base directory to lookup from * @len: maximum length @len should be interpreted to * @@ -2122,7 +2139,7 @@ static struct dentry *lookup_hash(struct nameidata *nd) * nameidata argument is passed to the filesystem methods and a filesystem * using this helper needs to be prepared for that. */ -struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) +struct dentry *lookup_one_len2(const char *name, struct vfsmount *mnt, struct dentry *base, int len) { struct qstr this; unsigned int c; @@ -2156,12 +2173,18 @@ struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) return ERR_PTR(err); } - err = inode_permission(base->d_inode, MAY_EXEC); + err = inode_permission2(mnt, base->d_inode, MAY_EXEC); if (err) return ERR_PTR(err); return __lookup_hash(&this, base, 0); } +EXPORT_SYMBOL(lookup_one_len2); + +struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) +{ + return lookup_one_len2(name, NULL, base, len); +} EXPORT_SYMBOL(lookup_one_len); int user_path_at_empty(int dfd, const char __user *name, unsigned flags, @@ -2441,7 +2464,7 @@ EXPORT_SYMBOL(__check_sticky); * 10. We don't allow removal of NFS sillyrenamed files; it's handled by * nfs_async_unlink(). */ -static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) +static int may_delete(struct vfsmount *mnt, struct inode *dir, struct dentry *victim, bool isdir) { struct inode *inode = victim->d_inode; int error; @@ -2453,7 +2476,7 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); - error = inode_permission(dir, MAY_WRITE | MAY_EXEC); + error = inode_permission2(mnt, dir, MAY_WRITE | MAY_EXEC); if (error) return error; if (IS_APPEND(dir)) @@ -2484,14 +2507,14 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) * 3. We should have write and exec permissions on dir * 4. We can't do it if dir is immutable (done in permission()) */ -static inline int may_create(struct inode *dir, struct dentry *child) +static inline int may_create(struct vfsmount *mnt, struct inode *dir, struct dentry *child) { audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE); if (child->d_inode) return -EEXIST; if (IS_DEADDIR(dir)) return -ENOENT; - return inode_permission(dir, MAY_WRITE | MAY_EXEC); + return inode_permission2(mnt, dir, MAY_WRITE | MAY_EXEC); } /* @@ -2501,7 +2524,7 @@ struct dentry *lock_rename(struct dentry *p1, struct dentry *p2) { struct dentry *p; - if (p1 == p2) { + if (p1 == p2 || p1->d_inode == p2->d_inode) { mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT); return NULL; } @@ -2538,10 +2561,10 @@ void unlock_rename(struct dentry *p1, struct dentry *p2) } EXPORT_SYMBOL(unlock_rename); -int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - bool want_excl) +int vfs_create2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, + umode_t mode, bool want_excl) { - int error = may_create(dir, dentry); + int error = may_create(mnt, dir, dentry); if (error) return error; @@ -2563,11 +2586,19 @@ int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, return error; } +EXPORT_SYMBOL(vfs_create2); + +int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, + bool want_excl) +{ + return vfs_create2(NULL, dir, dentry, mode, want_excl); +} EXPORT_SYMBOL(vfs_create); static int may_open(struct path *path, int acc_mode, int flag) { struct dentry *dentry = path->dentry; + struct vfsmount *mnt = path->mnt; struct inode *inode = dentry->d_inode; int error; @@ -2596,7 +2627,7 @@ static int may_open(struct path *path, int acc_mode, int flag) break; } - error = inode_permission(inode, acc_mode); + error = inode_permission2(mnt, inode, acc_mode); if (error) return error; @@ -2631,7 +2662,7 @@ static int handle_truncate(struct file *filp) if (!error) error = security_path_truncate(path); if (!error) { - error = do_truncate(path->dentry, 0, + error = do_truncate2(path->mnt, path->dentry, 0, ATTR_MTIME|ATTR_CTIME|ATTR_OPEN, filp); } @@ -2652,7 +2683,7 @@ static int may_o_create(struct path *dir, struct dentry *dentry, umode_t mode) if (error) return error; - error = inode_permission(dir->dentry->d_inode, MAY_WRITE | MAY_EXEC); + error = inode_permission2(dir->mnt, dir->dentry->d_inode, MAY_WRITE | MAY_EXEC); if (error) return error; @@ -2850,6 +2881,7 @@ static int lookup_open(struct nameidata *nd, struct path *path, bool got_write, int *opened) { struct dentry *dir = nd->path.dentry; + struct vfsmount *mnt = nd->path.mnt; struct inode *dir_inode = dir->d_inode; struct dentry *dentry; int error; @@ -2897,7 +2929,7 @@ static int lookup_open(struct nameidata *nd, struct path *path, error = security_path_mknod(&nd->path, dentry, mode, 0); if (error) goto out_dput; - error = vfs_create(dir->d_inode, dentry, mode, + error = vfs_create2(mnt, dir->d_inode, dentry, mode, nd->flags & LOOKUP_EXCL); if (error) goto out_dput; @@ -3169,7 +3201,7 @@ static int do_tmpfile(int dfd, struct filename *pathname, if (unlikely(error)) goto out; /* we want directory to be writable */ - error = inode_permission(nd->inode, MAY_WRITE | MAY_EXEC); + error = inode_permission2(nd->path.mnt, nd->inode, MAY_WRITE | MAY_EXEC); if (error) goto out2; dentry = nd->path.dentry; @@ -3419,9 +3451,9 @@ struct dentry *user_path_create(int dfd, const char __user *pathname, } EXPORT_SYMBOL(user_path_create); -int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) +int vfs_mknod2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) { - int error = may_create(dir, dentry); + int error = may_create(mnt, dir, dentry); if (error) return error; @@ -3453,6 +3485,12 @@ int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) return error; } +EXPORT_SYMBOL(vfs_mknod2); + +int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) +{ + return vfs_mknod2(NULL, dir, dentry, mode, dev); +} EXPORT_SYMBOL(vfs_mknod); static int may_mknod(umode_t mode) @@ -3495,10 +3533,10 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, goto out; switch (mode & S_IFMT) { case 0: case S_IFREG: - error = vfs_create(path.dentry->d_inode,dentry,mode,true); + error = vfs_create2(path.mnt, path.dentry->d_inode, dentry, mode, true); break; case S_IFCHR: case S_IFBLK: - error = vfs_mknod(path.dentry->d_inode,dentry,mode, + error = vfs_mknod2(path.mnt, path.dentry->d_inode, dentry, mode, new_decode_dev(dev)); break; case S_IFIFO: case S_IFSOCK: @@ -3519,9 +3557,9 @@ SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, d return sys_mknodat(AT_FDCWD, filename, mode, dev); } -int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) +int vfs_mkdir2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, umode_t mode) { - int error = may_create(dir, dentry); + int error = may_create(mnt, dir, dentry); unsigned max_links = dir->i_sb->s_max_links; if (error) @@ -3543,6 +3581,12 @@ int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) fsnotify_mkdir(dir, dentry); return error; } +EXPORT_SYMBOL(vfs_mkdir2); + +int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) +{ + return vfs_mkdir2(NULL, dir, dentry, mode); +} EXPORT_SYMBOL(vfs_mkdir); SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode) @@ -3561,7 +3605,7 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode) mode &= ~current_umask(); error = security_path_mkdir(&path, dentry, mode); if (!error) - error = vfs_mkdir(path.dentry->d_inode, dentry, mode); + error = vfs_mkdir2(path.mnt, path.dentry->d_inode, dentry, mode); done_path_create(&path, dentry); if (retry_estale(error, lookup_flags)) { lookup_flags |= LOOKUP_REVAL; @@ -3600,9 +3644,9 @@ void dentry_unhash(struct dentry *dentry) } EXPORT_SYMBOL(dentry_unhash); -int vfs_rmdir(struct inode *dir, struct dentry *dentry) +int vfs_rmdir2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry) { - int error = may_delete(dir, dentry, 1); + int error = may_delete(mnt, dir, dentry, 1); if (error) return error; @@ -3637,6 +3681,10 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry) d_delete(dentry); return error; } +int vfs_rmdir(struct inode *dir, struct dentry *dentry) +{ + return vfs_rmdir2(NULL, dir, dentry); +} EXPORT_SYMBOL(vfs_rmdir); static long do_rmdir(int dfd, const char __user *pathname) @@ -3680,7 +3728,7 @@ static long do_rmdir(int dfd, const char __user *pathname) error = security_path_rmdir(&nd.path, dentry); if (error) goto exit3; - error = vfs_rmdir(nd.path.dentry->d_inode, dentry); + error = vfs_rmdir2(nd.path.mnt, nd.path.dentry->d_inode, dentry); exit3: dput(dentry); exit2: @@ -3719,10 +3767,10 @@ SYSCALL_DEFINE1(rmdir, const char __user *, pathname) * be appropriate for callers that expect the underlying filesystem not * to be NFS exported. */ -int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) +int vfs_unlink2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) { struct inode *target = dentry->d_inode; - int error = may_delete(dir, dentry, 0); + int error = may_delete(mnt, dir, dentry, 0); if (error) return error; @@ -3757,6 +3805,12 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegate return error; } +EXPORT_SYMBOL(vfs_unlink2); + +int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) +{ + return vfs_unlink2(NULL, dir, dentry, delegated_inode); +} EXPORT_SYMBOL(vfs_unlink); /* @@ -3802,7 +3856,7 @@ static long do_unlinkat(int dfd, const char __user *pathname) error = security_path_unlink(&nd.path, dentry); if (error) goto exit2; - error = vfs_unlink(nd.path.dentry->d_inode, dentry, &delegated_inode); + error = vfs_unlink2(nd.path.mnt, nd.path.dentry->d_inode, dentry, &delegated_inode); exit2: dput(dentry); } @@ -3852,9 +3906,9 @@ SYSCALL_DEFINE1(unlink, const char __user *, pathname) return do_unlinkat(AT_FDCWD, pathname); } -int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) +int vfs_symlink2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, const char *oldname) { - int error = may_create(dir, dentry); + int error = may_create(mnt, dir, dentry); if (error) return error; @@ -3871,6 +3925,12 @@ int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) fsnotify_create(dir, dentry); return error; } +EXPORT_SYMBOL(vfs_symlink2); + +int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) +{ + return vfs_symlink2(NULL, dir, dentry, oldname); +} EXPORT_SYMBOL(vfs_symlink); SYSCALL_DEFINE3(symlinkat, const char __user *, oldname, @@ -3893,7 +3953,7 @@ SYSCALL_DEFINE3(symlinkat, const char __user *, oldname, error = security_path_symlink(&path, dentry, from->name); if (!error) - error = vfs_symlink(path.dentry->d_inode, dentry, from->name); + error = vfs_symlink2(path.mnt, path.dentry->d_inode, dentry, from->name); done_path_create(&path, dentry); if (retry_estale(error, lookup_flags)) { lookup_flags |= LOOKUP_REVAL; @@ -3928,7 +3988,7 @@ SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newn * be appropriate for callers that expect the underlying filesystem not * to be NFS exported. */ -int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry, struct inode **delegated_inode) +int vfs_link2(struct vfsmount *mnt, struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry, struct inode **delegated_inode) { struct inode *inode = old_dentry->d_inode; unsigned max_links = dir->i_sb->s_max_links; @@ -3937,7 +3997,7 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de if (!inode) return -ENOENT; - error = may_create(dir, new_dentry); + error = may_create(mnt, dir, new_dentry); if (error) return error; @@ -3980,6 +4040,12 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de fsnotify_link(dir, inode, new_dentry); return error; } +EXPORT_SYMBOL(vfs_link2); + +int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry, struct inode **delegated_inode) +{ + return vfs_link2(NULL, old_dentry, dir, new_dentry, delegated_inode); +} EXPORT_SYMBOL(vfs_link); /* @@ -4035,7 +4101,7 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname, error = security_path_link(old_path.dentry, &new_path, new_dentry); if (error) goto out_dput; - error = vfs_link(old_path.dentry, new_path.dentry->d_inode, new_dentry, &delegated_inode); + error = vfs_link2(old_path.mnt, old_path.dentry, new_path.dentry->d_inode, new_dentry, &delegated_inode); out_dput: done_path_create(&new_path, new_dentry); if (delegated_inode) { @@ -4110,7 +4176,8 @@ SYSCALL_DEFINE2(link, const char __user *, oldname, const char __user *, newname * ->i_mutex on parents, which works but leads to some truly excessive * locking]. */ -int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, +int vfs_rename2(struct vfsmount *mnt, + struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry, struct inode **delegated_inode, unsigned int flags) { @@ -4125,19 +4192,19 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, if (source == target) return 0; - error = may_delete(old_dir, old_dentry, is_dir); + error = may_delete(mnt, old_dir, old_dentry, is_dir); if (error) return error; if (!target) { - error = may_create(new_dir, new_dentry); + error = may_create(mnt, new_dir, new_dentry); } else { new_is_dir = d_is_dir(new_dentry); if (!(flags & RENAME_EXCHANGE)) - error = may_delete(new_dir, new_dentry, is_dir); + error = may_delete(mnt, new_dir, new_dentry, is_dir); else - error = may_delete(new_dir, new_dentry, new_is_dir); + error = may_delete(mnt, new_dir, new_dentry, new_is_dir); } if (error) return error; @@ -4154,12 +4221,12 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, */ if (new_dir != old_dir) { if (is_dir) { - error = inode_permission(source, MAY_WRITE); + error = inode_permission2(mnt, source, MAY_WRITE); if (error) return error; } if ((flags & RENAME_EXCHANGE) && new_is_dir) { - error = inode_permission(target, MAY_WRITE); + error = inode_permission2(mnt, target, MAY_WRITE); if (error) return error; } @@ -4242,6 +4309,14 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, return error; } +EXPORT_SYMBOL(vfs_rename2); + +int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, + struct inode *new_dir, struct dentry *new_dentry, + struct inode **delegated_inode, unsigned int flags) +{ + return vfs_rename2(NULL, old_dir, old_dentry, new_dir, new_dentry, delegated_inode, flags); +} EXPORT_SYMBOL(vfs_rename); SYSCALL_DEFINE5(renameat2, int, olddfd, const char __user *, oldname, @@ -4356,7 +4431,7 @@ SYSCALL_DEFINE5(renameat2, int, olddfd, const char __user *, oldname, &newnd.path, new_dentry, flags); if (error) goto exit5; - error = vfs_rename(old_dir->d_inode, old_dentry, + error = vfs_rename2(oldnd.path.mnt, old_dir->d_inode, old_dentry, new_dir->d_inode, new_dentry, &delegated_inode, flags); exit5: @@ -4401,7 +4476,7 @@ SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newna int vfs_whiteout(struct inode *dir, struct dentry *dentry) { - int error = may_create(dir, dentry); + int error = may_create(NULL, dir, dentry); if (error) return error; diff --git a/fs/namespace.c b/fs/namespace.c index ff5ba8c5c4e97..9953cc3924a69 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -568,6 +568,7 @@ int sb_prepare_remount_readonly(struct super_block *sb) static void free_vfsmnt(struct mount *mnt) { + kfree(mnt->mnt.data); kfree(mnt->mnt_devname); #ifdef CONFIG_SMP free_percpu(mnt->mnt_pcp); @@ -901,11 +902,21 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void if (!mnt) return ERR_PTR(-ENOMEM); + mnt->mnt.data = NULL; + if (type->alloc_mnt_data) { + mnt->mnt.data = type->alloc_mnt_data(); + if (!mnt->mnt.data) { + mnt_free_id(mnt); + free_vfsmnt(mnt); + return ERR_PTR(-ENOMEM); + } + } if (flags & MS_KERNMOUNT) mnt->mnt.mnt_flags = MNT_INTERNAL; - root = mount_fs(type, flags, name, data); + root = mount_fs(type, flags, name, &mnt->mnt, data); if (IS_ERR(root)) { + kfree(mnt->mnt.data); mnt_free_id(mnt); free_vfsmnt(mnt); return ERR_CAST(root); @@ -933,6 +944,14 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root, if (!mnt) return ERR_PTR(-ENOMEM); + if (sb->s_op->clone_mnt_data) { + mnt->mnt.data = sb->s_op->clone_mnt_data(old->mnt.data); + if (!mnt->mnt.data) { + err = -ENOMEM; + goto out_free; + } + } + if (flag & (CL_SLAVE | CL_PRIVATE | CL_SHARED_TO_SLAVE)) mnt->mnt_group_id = 0; /* not a peer of original */ else @@ -1000,6 +1019,7 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root, return mnt; out_free: + kfree(mnt->mnt.data); mnt_free_id(mnt); free_vfsmnt(mnt); return ERR_PTR(err); @@ -2139,8 +2159,14 @@ static int do_remount(struct path *path, int flags, int mnt_flags, err = change_mount_flags(path->mnt, flags); else if (!capable(CAP_SYS_ADMIN)) err = -EPERM; - else - err = do_remount_sb(sb, flags, data, 0); + else { + err = do_remount_sb2(path->mnt, sb, flags, data, 0); + namespace_lock(); + lock_mount_hash(); + propagate_remount(mnt); + unlock_mount_hash(); + namespace_unlock(); + } if (!err) { lock_mount_hash(); mnt_flags |= mnt->mnt.mnt_flags & ~MNT_USER_SETTABLE_MASK; diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index c991616acca9e..fcbb414721d22 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -475,7 +475,7 @@ static int fanotify_find_path(int dfd, const char __user *filename, } /* you can only watch an inode if you have read permissions on it */ - ret = inode_permission(path->dentry->d_inode, MAY_READ); + ret = inode_permission2(path->mnt, path->dentry->d_inode, MAY_READ); if (ret) path_put(path); out: diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c index 8637f33b826d5..b2ddc882dac92 100644 --- a/fs/notify/inotify/inotify_user.c +++ b/fs/notify/inotify/inotify_user.c @@ -338,7 +338,7 @@ static int inotify_find_inode(const char __user *dirname, struct path *path, uns if (error) return error; /* you can only watch an inode if you have read permissions on it */ - error = inode_permission(path->dentry->d_inode, MAY_READ); + error = inode_permission2(path->mnt, path->dentry->d_inode, MAY_READ); if (error) path_put(path); return error; @@ -735,7 +735,7 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname, /* support stacked filesystems */ if(path.dentry && path.dentry->d_op) { if (path.dentry->d_op->d_canonical_path) { - path.dentry->d_op->d_canonical_path(path.dentry, &alteredpath); + path.dentry->d_op->d_canonical_path(&path, &alteredpath); canonical_path = &alteredpath; path_put(&path); } diff --git a/fs/open.c b/fs/open.c index 1651f35d50f5c..d7e0e1b8b0cf9 100644 --- a/fs/open.c +++ b/fs/open.c @@ -34,8 +34,8 @@ #include "internal.h" -int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, - struct file *filp) +int do_truncate2(struct vfsmount *mnt, struct dentry *dentry, loff_t length, + unsigned int time_attrs, struct file *filp) { int ret; struct iattr newattrs; @@ -58,17 +58,24 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, mutex_lock(&dentry->d_inode->i_mutex); /* Note any delegations or leases have already been broken: */ - ret = notify_change(dentry, &newattrs, NULL); + ret = notify_change2(mnt, dentry, &newattrs, NULL); mutex_unlock(&dentry->d_inode->i_mutex); return ret; } +int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, + struct file *filp) +{ + return do_truncate2(NULL, dentry, length, time_attrs, filp); +} long vfs_truncate(struct path *path, loff_t length) { struct inode *inode; + struct vfsmount *mnt; long error; inode = path->dentry->d_inode; + mnt = path->mnt; /* For directories it's -EISDIR, for other non-regulars - -EINVAL */ if (S_ISDIR(inode->i_mode)) @@ -80,7 +87,7 @@ long vfs_truncate(struct path *path, loff_t length) if (error) goto out; - error = inode_permission(inode, MAY_WRITE); + error = inode_permission2(mnt, inode, MAY_WRITE); if (error) goto mnt_drop_write_and_out; @@ -104,7 +111,7 @@ long vfs_truncate(struct path *path, loff_t length) if (!error) error = security_path_truncate(path); if (!error) - error = do_truncate(path->dentry, length, 0, NULL); + error = do_truncate2(mnt, path->dentry, length, 0, NULL); put_write_and_out: put_write_access(inode); @@ -153,6 +160,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) { struct inode *inode; struct dentry *dentry; + struct vfsmount *mnt; struct fd f; int error; @@ -169,6 +177,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) small = 0; dentry = f.file->f_path.dentry; + mnt = f.file->f_path.mnt; inode = dentry->d_inode; error = -EINVAL; if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE)) @@ -188,7 +197,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) if (!error) error = security_path_truncate(&f.file->f_path); if (!error) - error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, f.file); + error = do_truncate2(mnt, dentry, length, ATTR_MTIME|ATTR_CTIME, f.file); sb_end_write(inode->i_sb); out_putf: fdput(f); @@ -322,6 +331,7 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) struct cred *override_cred; struct path path; struct inode *inode; + struct vfsmount *mnt; int res; unsigned int lookup_flags = LOOKUP_FOLLOW; @@ -352,6 +362,7 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) goto out; inode = path.dentry->d_inode; + mnt = path.mnt; if ((mode & MAY_EXEC) && S_ISREG(inode->i_mode)) { /* @@ -363,7 +374,7 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) goto out_path_release; } - res = inode_permission(inode, mode | MAY_ACCESS); + res = inode_permission2(mnt, inode, mode | MAY_ACCESS); /* SuS v2 requires we report a read only fs too */ if (res || !(mode & S_IWOTH) || special_file(inode->i_mode)) goto out_path_release; @@ -407,7 +418,7 @@ SYSCALL_DEFINE1(chdir, const char __user *, filename) if (error) goto out; - error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); + error = inode_permission2(path.mnt, path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); if (error) goto dput_and_out; @@ -427,6 +438,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) { struct fd f = fdget_raw(fd); struct inode *inode; + struct vfsmount *mnt; int error = -EBADF; error = -EBADF; @@ -434,12 +446,13 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) goto out; inode = file_inode(f.file); + mnt = f.file->f_path.mnt; error = -ENOTDIR; if (!S_ISDIR(inode->i_mode)) goto out_putf; - error = inode_permission(inode, MAY_EXEC | MAY_CHDIR); + error = inode_permission2(mnt, inode, MAY_EXEC | MAY_CHDIR); if (!error) set_fs_pwd(current->fs, &f.file->f_path); out_putf: @@ -458,7 +471,7 @@ SYSCALL_DEFINE1(chroot, const char __user *, filename) if (error) goto out; - error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); + error = inode_permission2(path.mnt, path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); if (error) goto dput_and_out; @@ -498,7 +511,7 @@ static int chmod_common(struct path *path, umode_t mode) goto out_unlock; newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO); newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; - error = notify_change(path->dentry, &newattrs, &delegated_inode); + error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode); out_unlock: mutex_unlock(&inode->i_mutex); if (delegated_inode) { @@ -578,7 +591,7 @@ static int chown_common(struct path *path, uid_t user, gid_t group) mutex_lock(&inode->i_mutex); error = security_path_chown(path, uid, gid); if (!error) - error = notify_change(path->dentry, &newattrs, &delegated_inode); + error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode); mutex_unlock(&inode->i_mutex); if (delegated_inode) { error = break_deleg_wait(&delegated_inode); diff --git a/fs/pnode.c b/fs/pnode.c index aae331a5d03b2..33ab85985473a 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -403,3 +403,18 @@ int propagate_umount(struct hlist_head *list) __propagate_umount(mnt); return 0; } + +int propagate_remount(struct mount *mnt) +{ + struct mount *m; + struct super_block *sb = mnt->mnt.mnt_sb; + int ret = 0; + + if (sb->s_op->copy_mnt_data) { + for (m = first_slave(mnt); m->mnt_slave.next != &mnt->mnt_slave_list; m = next_slave(m)) { + sb->s_op->copy_mnt_data(m->mnt.data, mnt->mnt.data); + } + } + + return ret; +} diff --git a/fs/pnode.h b/fs/pnode.h index 16afc3d6d2f2d..47dc0399da603 100644 --- a/fs/pnode.h +++ b/fs/pnode.h @@ -42,6 +42,7 @@ int propagate_mnt(struct mount *, struct mountpoint *, struct mount *, struct hlist_head *); int propagate_umount(struct hlist_head *); int propagate_mount_busy(struct mount *, int); +int propagate_remount(struct mount *); void mnt_release_group_id(struct mount *); int get_dominating_id(struct mount *mnt, const struct path *root); unsigned int mnt_get_count(struct mount *mnt); diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 251cc6e8bef8b..69dc4a339bce0 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1400,7 +1400,7 @@ const struct file_operations proc_pagemap_operations = { #endif /* CONFIG_PROC_PAGE_MONITOR */ #ifdef CONFIG_PROCESS_RECLAIM -static int reclaim_pte_range(pmd_t *pmd, unsigned long addr, +int reclaim_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, struct mm_walk *walk) { struct reclaim_param *rp = walk->private; @@ -1427,6 +1427,9 @@ static int reclaim_pte_range(pmd_t *pmd, unsigned long addr, if (!page) continue; + if (page_mapcount(page) != 1) + continue; + if (isolate_lru_page(page)) continue; @@ -1449,7 +1452,7 @@ static int reclaim_pte_range(pmd_t *pmd, unsigned long addr, goto cont; cond_resched(); - return 0; + return (rp->nr_to_reclaim == 0) ? -EPIPE : 0; } enum reclaim_type { @@ -1517,6 +1520,7 @@ static ssize_t reclaim_write(struct file *file, const char __user *buf, unsigned long start = 0; unsigned long end = 0; struct reclaim_param rp; + int ret; memset(buffer, 0, sizeof(buffer)); if (count > sizeof(buffer) - 1) @@ -1578,7 +1582,7 @@ static ssize_t reclaim_write(struct file *file, const char __user *buf, reclaim_walk.mm = mm; reclaim_walk.pmd_entry = reclaim_pte_range; - rp.nr_to_reclaim = ~0; + rp.nr_to_reclaim = INT_MAX; rp.nr_reclaimed = 0; reclaim_walk.private = &rp; @@ -1592,9 +1596,11 @@ static ssize_t reclaim_write(struct file *file, const char __user *buf, continue; rp.vma = vma; - walk_page_range(max(vma->vm_start, start), + ret = walk_page_range(max(vma->vm_start, start), min(vma->vm_end, end), &reclaim_walk); + if (ret) + break; vma = vma->vm_next; } } else { @@ -1609,8 +1615,10 @@ static ssize_t reclaim_write(struct file *file, const char __user *buf, continue; rp.vma = vma; - walk_page_range(vma->vm_start, vma->vm_end, + ret = walk_page_range(vma->vm_start, vma->vm_end, &reclaim_walk); + if (ret) + break; } } diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c index 73ca1740d8395..f68d0fe2abd40 100644 --- a/fs/proc_namespace.c +++ b/fs/proc_namespace.c @@ -112,7 +112,9 @@ static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt) if (err) goto out; show_mnt_opts(m, mnt); - if (sb->s_op->show_options) + if (sb->s_op->show_options2) + err = sb->s_op->show_options2(mnt, m, mnt_path.dentry); + else if (sb->s_op->show_options) err = sb->s_op->show_options(m, mnt_path.dentry); seq_puts(m, " 0 0\n"); out: @@ -173,7 +175,9 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt) err = show_sb_opts(m, sb); if (err) goto out; - if (sb->s_op->show_options) + if (sb->s_op->show_options2) { + err = sb->s_op->show_options2(mnt, m, mnt->mnt_root); + } else if (sb->s_op->show_options) err = sb->s_op->show_options(m, mnt->mnt_root); seq_putc(m, '\n'); out: diff --git a/fs/pstore/Kconfig b/fs/pstore/Kconfig index 916b8e23d9684..11aff0a7fc495 100644 --- a/fs/pstore/Kconfig +++ b/fs/pstore/Kconfig @@ -60,3 +60,11 @@ config PSTORE_RAM "ramoops.ko". For more information, see Documentation/ramoops.txt. + +config PSTORE_LAST_KMSG + bool "export /proc/last_kmsg" + default y + depends on PSTORE + help + When the option is enabled, pstore will export a proc filesystem + interface /proc/last_kmsg. diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index 6dce93c8ac290..eda661c008a43 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c @@ -36,6 +36,9 @@ #include #include #include +#ifdef CONFIG_PSTORE_LAST_KMSG +#include +#endif #include "internal.h" @@ -270,6 +273,24 @@ int pstore_is_mounted(void) return pstore_sb != NULL; } +#ifdef CONFIG_PSTORE_LAST_KMSG +static char *console_buffer; +static ssize_t console_bufsize; + +static ssize_t last_kmsg_read(struct file *file, char __user *buf, + size_t len, loff_t *offset) +{ + return simple_read_from_buffer(buf, len, offset, + console_buffer, console_bufsize); +} + +static const struct file_operations last_kmsg_fops = { + .owner = THIS_MODULE, + .read = last_kmsg_read, + .llseek = default_llseek, +}; +#endif + /* * Make a regular file in the root directory of our file system. * Load it up with "size" bytes of data from "buf". @@ -371,6 +392,13 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, int count, list_add(&private->list, &allpstore); spin_unlock_irqrestore(&allpstore_lock, flags); +#ifdef CONFIG_PSTORE_LAST_KMSG + if (type == PSTORE_TYPE_CONSOLE) { + console_buffer = private->data; + console_bufsize = size; + } +#endif + mutex_unlock(&root->d_inode->i_mutex); return 0; @@ -441,6 +469,9 @@ static struct kobject *pstore_kobj; static int __init init_pstore_fs(void) { int err = 0; +#ifdef CONFIG_PSTORE_LAST_KMSG + struct proc_dir_entry *last_kmsg_entry = NULL; +#endif /* Create a convenient mount point for people to access pstore */ pstore_kobj = kobject_create_and_add("pstore", fs_kobj); @@ -453,6 +484,15 @@ static int __init init_pstore_fs(void) if (err < 0) kobject_put(pstore_kobj); +#ifdef CONFIG_PSTORE_LAST_KMSG + last_kmsg_entry = proc_create_data("last_kmsg", S_IFREG | S_IRUGO, + NULL, &last_kmsg_fops, NULL); + if (!last_kmsg_entry) { + pr_err("Failed to create last_kmsg\n"); + goto out; + } +#endif + out: return err; } diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index c28dc6802cf4f..ab64d4ff2bfd0 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -34,16 +34,22 @@ #include #include #include +#include +#include #define RAMOOPS_KERNMSG_HDR "====" #define MIN_MEM_SIZE 4096UL +#define SZ_2_1M 0x100000 +#define PSTORE_RAM_SIZE_DEFAULT SZ_2_1M +#define RAM_MAX_MEM (1 << 31) + static ulong record_size = MIN_MEM_SIZE; module_param(record_size, ulong, 0400); MODULE_PARM_DESC(record_size, "size of each dump done on oops/panic"); -static ulong ramoops_console_size = MIN_MEM_SIZE; +static ulong ramoops_console_size = 256*1024UL; module_param_named(console_size, ramoops_console_size, ulong, 0400); MODULE_PARM_DESC(console_size, "size of kernel console log"); @@ -625,6 +631,36 @@ static void ramoops_register_dummy(void) } } +void __init pstore_ram_reserve_memory(void) +{ + phys_addr_t mem; + size_t size; + int ret; + + size = PSTORE_RAM_SIZE_DEFAULT; + size = ALIGN(size, PAGE_SIZE); + + mem = memblock_find_in_range(0, RAM_MAX_MEM, size, PAGE_SIZE); + if (!mem) { + pr_err("Cannot find memblock range for pstore_ram\n"); + return; + } + + ret = memblock_reserve(mem, size); + if (ret) { + pr_err("Failed to reserve memory from 0x%llx-0x%llx\n", + (unsigned long long)mem, + (unsigned long long)(mem + size - 1)); + return; + } + + mem_address = mem; + mem_size = size; + + printk("reserved RAM buffer: mem_address:0x%zx mem_size:0x%llx \n", + size, (unsigned long long)mem); +} + static int __init ramoops_init(void) { ramoops_register_dummy(); diff --git a/fs/sdcardfs/dentry.c b/fs/sdcardfs/dentry.c index ba165ef11e272..0466b55fa25ee 100644 --- a/fs/sdcardfs/dentry.c +++ b/fs/sdcardfs/dentry.c @@ -34,6 +34,8 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) struct dentry *parent_lower_dentry = NULL; struct dentry *lower_cur_parent_dentry = NULL; struct dentry *lower_dentry = NULL; + struct inode *inode; + struct sdcardfs_inode_data *data; if (flags & LOOKUP_RCU) return -ECHILD; @@ -46,7 +48,8 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) spin_unlock(&dentry->d_lock); /* check uninitialized obb_dentry and - * whether the base obbpath has been changed or not */ + * whether the base obbpath has been changed or not + */ if (is_obbpath_invalid(dentry)) { d_drop(dentry); return 0; @@ -59,6 +62,14 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) lower_dentry = lower_path.dentry; lower_cur_parent_dentry = dget_parent(lower_dentry); + if ((lower_dentry->d_flags & DCACHE_OP_REVALIDATE)) { + err = lower_dentry->d_op->d_revalidate(lower_dentry, flags); + if (err == 0) { + d_drop(dentry); + goto out; + } + } + spin_lock(&lower_dentry->d_lock); if (d_unhashed(lower_dentry)) { spin_unlock(&lower_dentry->d_lock); @@ -76,17 +87,13 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) if (dentry < lower_dentry) { spin_lock(&dentry->d_lock); - spin_lock(&lower_dentry->d_lock); + spin_lock_nested(&lower_dentry->d_lock, DENTRY_D_LOCK_NESTED); } else { spin_lock(&lower_dentry->d_lock); - spin_lock(&dentry->d_lock); + spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); } - if (dentry->d_name.len != lower_dentry->d_name.len) { - __d_drop(dentry); - err = 0; - } else if (strncasecmp(dentry->d_name.name, lower_dentry->d_name.name, - dentry->d_name.len) != 0) { + if (!qstr_case_eq(&dentry->d_name, &lower_dentry->d_name)) { __d_drop(dentry); err = 0; } @@ -98,6 +105,21 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) spin_unlock(&dentry->d_lock); spin_unlock(&lower_dentry->d_lock); } + if (!err) + goto out; + + /* If our top's inode is gone, we may be out of date */ + inode = igrab(dentry->d_inode); + if (inode) { + data = top_data_get(SDCARDFS_I(inode)); + if (!data || data->abandoned) { + d_drop(dentry); + err = 0; + } + if (data) + data_put(data); + iput(inode); + } out: dput(parent_dentry); @@ -110,12 +132,10 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) static void sdcardfs_d_release(struct dentry *dentry) { /* release and reset the lower paths */ - if(has_graft_path(dentry)) { + if (has_graft_path(dentry)) sdcardfs_put_reset_orig_path(dentry); - } sdcardfs_put_reset_lower_path(dentry); free_dentry_private_data(dentry); - return; } static int sdcardfs_hash_ci(const struct dentry *dentry, @@ -132,12 +152,10 @@ static int sdcardfs_hash_ci(const struct dentry *dentry, unsigned long hash; name = qstr->name; - //len = vfat_striptail_len(qstr); len = qstr->len; hash = init_name_hash(); while (len--) - //hash = partial_name_hash(nls_tolower(t, *name++), hash); hash = partial_name_hash(tolower(*name++), hash); qstr->hash = end_name_hash(hash); @@ -151,32 +169,26 @@ static int sdcardfs_cmp_ci(const struct dentry *parent, const struct dentry *dentry, unsigned int len, const char *str, const struct qstr *name) { - /* This function is copy of vfat_cmpi */ - // FIXME Should we support national language? - //struct nls_table *t = MSDOS_SB(parent->d_sb)->nls_io; - //unsigned int alen, blen; + /* FIXME Should we support national language? */ - /* A filename cannot end in '.' or we treat it like it has none */ - /* - alen = vfat_striptail_len(name); - blen = __vfat_striptail_len(len, str); - if (alen == blen) { - if (nls_strnicmp(t, name->name, str, alen) == 0) - return 0; - } - */ if (name->len == len) { - if (strncasecmp(name->name, str, len) == 0) + if (str_n_case_eq(name->name, str, len)) return 0; } return 1; } +static void sdcardfs_canonical_path(const struct path *path, + struct path *actual_path) +{ + sdcardfs_get_real_lower(path->dentry, actual_path); +} + const struct dentry_operations sdcardfs_ci_dops = { .d_revalidate = sdcardfs_d_revalidate, .d_release = sdcardfs_d_release, - .d_hash = sdcardfs_hash_ci, + .d_hash = sdcardfs_hash_ci, .d_compare = sdcardfs_cmp_ci, - .d_canonical_path = sdcardfs_get_real_lower, + .d_canonical_path = sdcardfs_canonical_path, }; diff --git a/fs/sdcardfs/derived_perm.c b/fs/sdcardfs/derived_perm.c index 128b3e56851fb..d567eddb333ed 100644 --- a/fs/sdcardfs/derived_perm.c +++ b/fs/sdcardfs/derived_perm.c @@ -26,100 +26,302 @@ static void inherit_derived_state(struct inode *parent, struct inode *child) struct sdcardfs_inode_info *pi = SDCARDFS_I(parent); struct sdcardfs_inode_info *ci = SDCARDFS_I(child); - ci->perm = PERM_INHERIT; - ci->userid = pi->userid; - ci->d_uid = pi->d_uid; - ci->under_android = pi->under_android; + ci->data->perm = PERM_INHERIT; + ci->data->userid = pi->data->userid; + ci->data->d_uid = pi->data->d_uid; + ci->data->under_android = pi->data->under_android; + ci->data->under_cache = pi->data->under_cache; + ci->data->under_obb = pi->data->under_obb; + set_top(ci, pi->top_data); } /* helper function for derived state */ -void setup_derived_state(struct inode *inode, perm_t perm, - userid_t userid, uid_t uid, bool under_android) +void setup_derived_state(struct inode *inode, perm_t perm, userid_t userid, + uid_t uid, bool under_android, + struct sdcardfs_inode_data *top) { struct sdcardfs_inode_info *info = SDCARDFS_I(inode); - info->perm = perm; - info->userid = userid; - info->d_uid = uid; - info->under_android = under_android; + info->data->perm = perm; + info->data->userid = userid; + info->data->d_uid = uid; + info->data->under_android = under_android; + info->data->under_cache = false; + info->data->under_obb = false; + set_top(info, top); } -/* While renaming, there is a point where we want the path from dentry, but the name from newdentry */ -void get_derived_permission_new(struct dentry *parent, struct dentry *dentry, struct dentry *newdentry) +/* While renaming, there is a point where we want the path from dentry, + * but the name from newdentry + */ +void get_derived_permission_new(struct dentry *parent, struct dentry *dentry, + const struct qstr *name) { - struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); struct sdcardfs_inode_info *info = SDCARDFS_I(dentry->d_inode); - struct sdcardfs_inode_info *parent_info= SDCARDFS_I(parent->d_inode); + struct sdcardfs_inode_data *parent_data = + SDCARDFS_I(parent->d_inode)->data; appid_t appid; + unsigned long user_num; + int err; + struct qstr q_Android = QSTR_LITERAL("Android"); + struct qstr q_data = QSTR_LITERAL("data"); + struct qstr q_obb = QSTR_LITERAL("obb"); + struct qstr q_media = QSTR_LITERAL("media"); + struct qstr q_cache = QSTR_LITERAL("cache"); /* By default, each inode inherits from its parent. * the properties are maintained on its private fields * because the inode attributes will be modified with that of * its lower inode. - * The derived state will be updated on the last - * stage of each system call by fix_derived_permission(inode). + * These values are used by our custom permission call instead + * of using the inode permissions. */ inherit_derived_state(parent->d_inode, dentry->d_inode); + /* Files don't get special labels */ + if (!S_ISDIR(dentry->d_inode->i_mode)) + return; /* Derive custom permissions based on parent and current node */ - switch (parent_info->perm) { - case PERM_INHERIT: - /* Already inherited above */ - break; - case PERM_PRE_ROOT: - /* Legacy internal layout places users at top level */ - info->perm = PERM_ROOT; - info->userid = simple_strtoul(newdentry->d_name.name, NULL, 10); - break; - case PERM_ROOT: - /* Assume masked off by default. */ - if (!strcasecmp(newdentry->d_name.name, "Android")) { - /* App-specific directories inside; let anyone traverse */ - info->perm = PERM_ANDROID; - info->under_android = true; - } - break; - case PERM_ANDROID: - if (!strcasecmp(newdentry->d_name.name, "data")) { - /* App-specific directories inside; let anyone traverse */ - info->perm = PERM_ANDROID_DATA; - } else if (!strcasecmp(newdentry->d_name.name, "obb")) { - /* App-specific directories inside; let anyone traverse */ - info->perm = PERM_ANDROID_OBB; - /* Single OBB directory is always shared */ - } else if (!strcasecmp(newdentry->d_name.name, "media")) { - /* App-specific directories inside; let anyone traverse */ - info->perm = PERM_ANDROID_MEDIA; - } - break; - case PERM_ANDROID_DATA: - case PERM_ANDROID_OBB: - case PERM_ANDROID_MEDIA: - appid = get_appid(sbi->pkgl_id, newdentry->d_name.name); - if (appid != 0) { - info->d_uid = multiuser_get_uid(parent_info->userid, appid); - } - break; + switch (parent_data->perm) { + case PERM_INHERIT: + case PERM_ANDROID_PACKAGE_CACHE: + /* Already inherited above */ + break; + case PERM_PRE_ROOT: + /* Legacy internal layout places users at top level */ + info->data->perm = PERM_ROOT; + err = kstrtoul(name->name, 10, &user_num); + if (err) + info->data->userid = 0; + else + info->data->userid = user_num; + set_top(info, info->data); + break; + case PERM_ROOT: + /* Assume masked off by default. */ + if (qstr_case_eq(name, &q_Android)) { + /* App-specific directories inside; let anyone traverse */ + info->data->perm = PERM_ANDROID; + info->data->under_android = true; + set_top(info, info->data); + } + break; + case PERM_ANDROID: + if (qstr_case_eq(name, &q_data)) { + /* App-specific directories inside; let anyone traverse */ + info->data->perm = PERM_ANDROID_DATA; + set_top(info, info->data); + } else if (qstr_case_eq(name, &q_obb)) { + /* App-specific directories inside; let anyone traverse */ + info->data->perm = PERM_ANDROID_OBB; + info->data->under_obb = true; + set_top(info, info->data); + /* Single OBB directory is always shared */ + } else if (qstr_case_eq(name, &q_media)) { + /* App-specific directories inside; let anyone traverse */ + info->data->perm = PERM_ANDROID_MEDIA; + set_top(info, info->data); + } + break; + case PERM_ANDROID_OBB: + case PERM_ANDROID_DATA: + case PERM_ANDROID_MEDIA: + info->data->perm = PERM_ANDROID_PACKAGE; + appid = get_appid(name->name); + if (appid != 0 && !is_excluded(name->name, parent_data->userid)) + info->data->d_uid = + multiuser_get_uid(parent_data->userid, appid); + set_top(info, info->data); + break; + case PERM_ANDROID_PACKAGE: + if (qstr_case_eq(name, &q_cache)) { + info->data->perm = PERM_ANDROID_PACKAGE_CACHE; + info->data->under_cache = true; + } + break; } } void get_derived_permission(struct dentry *parent, struct dentry *dentry) { - get_derived_permission_new(parent, dentry, dentry); + get_derived_permission_new(parent, dentry, &dentry->d_name); } -void get_derive_permissions_recursive(struct dentry *parent) { - struct dentry *dentry; - list_for_each_entry(dentry, &parent->d_subdirs, d_child) { - if (dentry && dentry->d_inode) { - mutex_lock(&dentry->d_inode->i_mutex); - get_derived_permission(parent, dentry); - fix_derived_permission(dentry->d_inode); - get_derive_permissions_recursive(dentry); - mutex_unlock(&dentry->d_inode->i_mutex); +static appid_t get_type(const char *name) +{ + const char *ext = strrchr(name, '.'); + appid_t id; + + if (ext && ext[0]) { + ext = &ext[1]; + id = get_ext_gid(ext); + return id?:AID_MEDIA_RW; + } + return AID_MEDIA_RW; +} + +void fixup_lower_ownership(struct dentry *dentry, const char *name) +{ + struct path path; + struct inode *inode; + struct inode *delegated_inode = NULL; + int error; + struct sdcardfs_inode_info *info; + struct sdcardfs_inode_data *info_d; + struct sdcardfs_inode_data *info_top; + perm_t perm; + struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); + uid_t uid = sbi->options.fs_low_uid; + gid_t gid = sbi->options.fs_low_gid; + struct iattr newattrs; + + info = SDCARDFS_I(dentry->d_inode); + info_d = info->data; + perm = info_d->perm; + if (info_d->under_obb) { + perm = PERM_ANDROID_OBB; + } else if (info_d->under_cache) { + perm = PERM_ANDROID_PACKAGE_CACHE; + } else if (perm == PERM_INHERIT) { + info_top = top_data_get(info); + perm = info_top->perm; + data_put(info_top); + } + + switch (perm) { + case PERM_ROOT: + case PERM_ANDROID: + case PERM_ANDROID_DATA: + case PERM_ANDROID_MEDIA: + case PERM_ANDROID_PACKAGE: + case PERM_ANDROID_PACKAGE_CACHE: + uid = multiuser_get_uid(info_d->userid, uid); + break; + case PERM_ANDROID_OBB: + uid = AID_MEDIA_OBB; + break; + case PERM_PRE_ROOT: + default: + break; + } + switch (perm) { + case PERM_ROOT: + case PERM_ANDROID: + case PERM_ANDROID_DATA: + case PERM_ANDROID_MEDIA: + if (S_ISDIR(dentry->d_inode->i_mode)) + gid = multiuser_get_uid(info_d->userid, AID_MEDIA_RW); + else + gid = multiuser_get_uid(info_d->userid, get_type(name)); + break; + case PERM_ANDROID_OBB: + gid = AID_MEDIA_OBB; + break; + case PERM_ANDROID_PACKAGE: + if (uid_is_app(info_d->d_uid)) + gid = multiuser_get_ext_gid(info_d->d_uid); + else + gid = multiuser_get_uid(info_d->userid, AID_MEDIA_RW); + break; + case PERM_ANDROID_PACKAGE_CACHE: + if (uid_is_app(info_d->d_uid)) + gid = multiuser_get_ext_cache_gid(info_d->d_uid); + else + gid = multiuser_get_uid(info_d->userid, AID_MEDIA_RW); + break; + case PERM_PRE_ROOT: + default: + break; + } + + sdcardfs_get_lower_path(dentry, &path); + inode = path.dentry->d_inode; + if (path.dentry->d_inode->i_gid.val != gid || path.dentry->d_inode->i_uid.val != uid) { +retry_deleg: + newattrs.ia_valid = ATTR_GID | ATTR_UID | ATTR_FORCE; + newattrs.ia_uid = make_kuid(current_user_ns(), uid); + newattrs.ia_gid = make_kgid(current_user_ns(), gid); + if (!S_ISDIR(inode->i_mode)) + newattrs.ia_valid |= + ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV; + mutex_lock(&inode->i_mutex); + error = security_path_chown(&path, newattrs.ia_uid, newattrs.ia_gid); + if (!error) + error = notify_change2(path.mnt, path.dentry, &newattrs, &delegated_inode); + mutex_unlock(&inode->i_mutex); + if (delegated_inode) { + error = break_deleg_wait(&delegated_inode); + if (!error) + goto retry_deleg; } + if (error) + pr_debug("sdcardfs: Failed to touch up lower fs gid/uid for %s\n", name); } + sdcardfs_put_lower_path(dentry, &path); +} + +static int descendant_may_need_fixup(struct sdcardfs_inode_data *data, + struct limit_search *limit) +{ + if (data->perm == PERM_ROOT) + return (limit->flags & BY_USERID) ? + data->userid == limit->userid : 1; + if (data->perm == PERM_PRE_ROOT || data->perm == PERM_ANDROID) + return 1; + return 0; +} + +static int needs_fixup(perm_t perm) +{ + if (perm == PERM_ANDROID_DATA || perm == PERM_ANDROID_OBB + || perm == PERM_ANDROID_MEDIA) + return 1; + return 0; +} + +static void __fixup_perms_recursive(struct dentry *dentry, struct limit_search *limit, int depth) +{ + struct dentry *child; + struct sdcardfs_inode_info *info; + + /* + * All paths will terminate their recursion on hitting PERM_ANDROID_OBB, + * PERM_ANDROID_MEDIA, or PERM_ANDROID_DATA. This happens at a depth of + * at most 3. + */ + WARN(depth > 3, "%s: Max expected depth exceeded!\n", __func__); + spin_lock_nested(&dentry->d_lock, depth); + if (!dentry->d_inode) { + spin_unlock(&dentry->d_lock); + return; + } + info = SDCARDFS_I(dentry->d_inode); + + if (needs_fixup(info->data->perm)) { + list_for_each_entry(child, &dentry->d_subdirs, d_child) { + spin_lock_nested(&child->d_lock, depth + 1); + if (!(limit->flags & BY_NAME) || qstr_case_eq(&child->d_name, &limit->name)) { + if (child->d_inode) { + get_derived_permission(dentry, child); + fixup_tmp_permissions(child->d_inode); + spin_unlock(&child->d_lock); + break; + } + } + spin_unlock(&child->d_lock); + } + } else if (descendant_may_need_fixup(info->data, limit)) { + list_for_each_entry(child, &dentry->d_subdirs, d_child) { + __fixup_perms_recursive(child, limit, depth + 1); + } + } + spin_unlock(&dentry->d_lock); +} + +void fixup_perms_recursive(struct dentry *dentry, struct limit_search *limit) +{ + __fixup_perms_recursive(dentry, limit, 0); } /* main function for updating derived permission */ @@ -127,41 +329,38 @@ inline void update_derived_permission_lock(struct dentry *dentry) { struct dentry *parent; - if(!dentry || !dentry->d_inode) { - printk(KERN_ERR "sdcardfs: %s: invalid dentry\n", __func__); + if (!dentry || !dentry->d_inode) { + pr_err("sdcardfs: %s: invalid dentry\n", __func__); return; } /* FIXME: * 1. need to check whether the dentry is updated or not * 2. remove the root dentry update */ - mutex_lock(&dentry->d_inode->i_mutex); - if(IS_ROOT(dentry)) { - //setup_default_pre_root_state(dentry->d_inode); - } else { + if (!IS_ROOT(dentry)) { parent = dget_parent(dentry); - if(parent) { + if (parent) { get_derived_permission(parent, dentry); dput(parent); } } - fix_derived_permission(dentry->d_inode); - mutex_unlock(&dentry->d_inode->i_mutex); + fixup_tmp_permissions(dentry->d_inode); } int need_graft_path(struct dentry *dentry) { int ret = 0; struct dentry *parent = dget_parent(dentry); - struct sdcardfs_inode_info *parent_info= SDCARDFS_I(parent->d_inode); + struct sdcardfs_inode_info *parent_info = SDCARDFS_I(parent->d_inode); struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); + struct qstr obb = QSTR_LITERAL("obb"); - if(parent_info->perm == PERM_ANDROID && - !strcasecmp(dentry->d_name.name, "obb")) { + if (parent_info->data->perm == PERM_ANDROID && + qstr_case_eq(&dentry->d_name, &obb)) { /* /Android/obb is the base obbpath of DERIVED_UNIFIED */ - if(!(sbi->options.multiuser == false - && parent_info->userid == 0)) { + if (!(sbi->options.multiuser == false + && parent_info->data->userid == 0)) { ret = 1; } } @@ -175,36 +374,40 @@ int is_obbpath_invalid(struct dentry *dent) struct sdcardfs_dentry_info *di = SDCARDFS_D(dent); struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dent->d_sb); char *path_buf, *obbpath_s; + int need_put = 0; + struct path lower_path; /* check the base obbpath has been changed. * this routine can check an uninitialized obb dentry as well. - * regarding the uninitialized obb, refer to the sdcardfs_mkdir() */ + * regarding the uninitialized obb, refer to the sdcardfs_mkdir() + */ spin_lock(&di->lock); - if(di->orig_path.dentry) { - if(!di->lower_path.dentry) { + if (di->orig_path.dentry) { + if (!di->lower_path.dentry) { ret = 1; } else { path_get(&di->lower_path); - //lower_parent = lock_parent(lower_path->dentry); path_buf = kmalloc(PATH_MAX, GFP_ATOMIC); - if(!path_buf) { + if (!path_buf) { ret = 1; - printk(KERN_ERR "sdcardfs: fail to allocate path_buf in %s.\n", __func__); + pr_err("sdcardfs: fail to allocate path_buf in %s.\n", __func__); } else { obbpath_s = d_path(&di->lower_path, path_buf, PATH_MAX); if (d_unhashed(di->lower_path.dentry) || - strcasecmp(sbi->obbpath_s, obbpath_s)) { + !str_case_eq(sbi->obbpath_s, obbpath_s)) { ret = 1; } kfree(path_buf); } - //unlock_dir(lower_parent); - path_put(&di->lower_path); + pathcpy(&lower_path, &di->lower_path); + need_put = 1; } } spin_unlock(&di->lock); + if (need_put) + path_put(&lower_path); return ret; } @@ -212,17 +415,18 @@ int is_base_obbpath(struct dentry *dentry) { int ret = 0; struct dentry *parent = dget_parent(dentry); - struct sdcardfs_inode_info *parent_info= SDCARDFS_I(parent->d_inode); + struct sdcardfs_inode_info *parent_info = SDCARDFS_I(parent->d_inode); struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); + struct qstr q_obb = QSTR_LITERAL("obb"); spin_lock(&SDCARDFS_D(dentry)->lock); if (sbi->options.multiuser) { - if(parent_info->perm == PERM_PRE_ROOT && - !strcasecmp(dentry->d_name.name, "obb")) { + if (parent_info->data->perm == PERM_PRE_ROOT && + qstr_case_eq(&dentry->d_name, &q_obb)) { ret = 1; } - } else if (parent_info->perm == PERM_ANDROID && - !strcasecmp(dentry->d_name.name, "obb")) { + } else if (parent_info->data->perm == PERM_ANDROID && + qstr_case_eq(&dentry->d_name, &q_obb)) { ret = 1; } spin_unlock(&SDCARDFS_D(dentry)->lock); @@ -232,7 +436,8 @@ int is_base_obbpath(struct dentry *dentry) /* The lower_path will be stored to the dentry's orig_path * and the base obbpath will be copyed to the lower_path variable. * if an error returned, there's no change in the lower_path - * returns: -ERRNO if error (0: no error) */ + * returns: -ERRNO if error (0: no error) + */ int setup_obb_dentry(struct dentry *dentry, struct path *lower_path) { int err = 0; @@ -241,23 +446,24 @@ int setup_obb_dentry(struct dentry *dentry, struct path *lower_path) /* A local obb dentry must have its own orig_path to support rmdir * and mkdir of itself. Usually, we expect that the sbi->obbpath - * is avaiable on this stage. */ + * is avaiable on this stage. + */ sdcardfs_set_orig_path(dentry, lower_path); err = kern_path(sbi->obbpath_s, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &obbpath); - if(!err) { + if (!err) { /* the obbpath base has been found */ - printk(KERN_INFO "sdcardfs: the sbi->obbpath is found\n"); pathcpy(lower_path, &obbpath); } else { /* if the sbi->obbpath is not available, we can optionally * setup the lower_path with its orig_path. * but, the current implementation just returns an error * because the sdcard daemon also regards this case as - * a lookup fail. */ - printk(KERN_INFO "sdcardfs: the sbi->obbpath is not available\n"); + * a lookup fail. + */ + pr_info("sdcardfs: the sbi->obbpath is not available\n"); } return err; } diff --git a/fs/sdcardfs/file.c b/fs/sdcardfs/file.c index 82911179f976a..2f338718cc576 100644 --- a/fs/sdcardfs/file.c +++ b/fs/sdcardfs/file.c @@ -65,7 +65,7 @@ static ssize_t sdcardfs_write(struct file *file, const char __user *buf, /* check disk space */ if (!check_min_free_space(dentry, count, 0)) { - printk(KERN_INFO "No minimum free space.\n"); + pr_err("No minimum free space.\n"); return -ENOSPC; } @@ -113,6 +113,13 @@ static long sdcardfs_unlocked_ioctl(struct file *file, unsigned int cmd, if (lower_file->f_op->unlocked_ioctl) err = lower_file->f_op->unlocked_ioctl(lower_file, cmd, arg); + /* some ioctls can change inode attributes (EXT2_IOC_SETFLAGS) */ + if (!err) { + sdcardfs_copy_and_fix_attrs(file_inode(file), + file_inode(lower_file)); + fsstack_copy_inode_size(file_inode(file), + file_inode(lower_file)); + } out: return err; } @@ -160,8 +167,7 @@ static int sdcardfs_mmap(struct file *file, struct vm_area_struct *vma) lower_file = sdcardfs_lower_file(file); if (willwrite && !lower_file->f_mapping->a_ops->writepage) { err = -EINVAL; - printk(KERN_ERR "sdcardfs: lower file system does not " - "support writeable mmap\n"); + pr_err("sdcardfs: lower file system does not support writeable mmap\n"); goto out; } @@ -173,16 +179,10 @@ static int sdcardfs_mmap(struct file *file, struct vm_area_struct *vma) if (!SDCARDFS_F(file)->lower_vm_ops) { err = lower_file->f_op->mmap(lower_file, vma); if (err) { - printk(KERN_ERR "sdcardfs: lower mmap failed %d\n", err); + pr_err("sdcardfs: lower mmap failed %d\n", err); goto out; } saved_vm_ops = vma->vm_ops; /* save: came from lower ->mmap */ - err = do_munmap(current->mm, vma->vm_start, - vma->vm_end - vma->vm_start); - if (err) { - printk(KERN_ERR "sdcardfs: do_munmap failed %d\n", err); - goto out; - } } /* @@ -195,6 +195,9 @@ static int sdcardfs_mmap(struct file *file, struct vm_area_struct *vma) file->f_mapping->a_ops = &sdcardfs_aops; /* set our aops */ if (!SDCARDFS_F(file)->lower_vm_ops) /* save for our ->fault */ SDCARDFS_F(file)->lower_vm_ops = saved_vm_ops; + vma->vm_private_data = file; + get_file(lower_file); + vma->vm_file = lower_file; out: return err; @@ -216,16 +219,13 @@ static int sdcardfs_open(struct inode *inode, struct file *file) goto out_err; } - if(!check_caller_access_to_name(parent->d_inode, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(parent->d_inode, &dentry->d_name)) { err = -EACCES; goto out_err; } /* save current_cred and override it */ - OVERRIDE_CRED(sbi, saved_cred); + OVERRIDE_CRED(sbi, saved_cred, SDCARDFS_I(inode)); file->private_data = kzalloc(sizeof(struct sdcardfs_file_info), GFP_KERNEL); @@ -253,6 +253,7 @@ static int sdcardfs_open(struct inode *inode, struct file *file) kfree(SDCARDFS_F(file)); else { sdcardfs_copy_and_fix_attrs(inode, sdcardfs_lower_inode(inode)); + fsstack_copy_inode_size(inode, sdcardfs_lower_inode(inode)); } out_revert_cred: @@ -323,6 +324,85 @@ static int sdcardfs_fasync(int fd, struct file *file, int flag) return err; } +/* + * Sdcardfs cannot use generic_file_llseek as ->llseek, because it would + * only set the offset of the upper file. So we have to implement our + * own method to set both the upper and lower file offsets + * consistently. + */ +static loff_t sdcardfs_file_llseek(struct file *file, loff_t offset, int whence) +{ + int err; + struct file *lower_file; + + err = generic_file_llseek(file, offset, whence); + if (err < 0) + goto out; + + lower_file = sdcardfs_lower_file(file); + err = generic_file_llseek(lower_file, offset, whence); + +out: + return err; +} + +/* + * Sdcardfs read_iter, redirect modified iocb to lower read_iter + */ +ssize_t sdcardfs_read_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + int err; + struct file *file = iocb->ki_filp, *lower_file; + + lower_file = sdcardfs_lower_file(file); + if (!lower_file->f_op->read_iter) { + err = -EINVAL; + goto out; + } + + get_file(lower_file); /* prevent lower_file from being released */ + iocb->ki_filp = lower_file; + err = lower_file->f_op->read_iter(iocb, iter); + iocb->ki_filp = file; + fput(lower_file); + /* update upper inode atime as needed */ + if (err >= 0 || err == -EIOCBQUEUED) + fsstack_copy_attr_atime(file->f_path.dentry->d_inode, + file_inode(lower_file)); +out: + return err; +} + +/* + * Sdcardfs write_iter, redirect modified iocb to lower write_iter + */ +ssize_t sdcardfs_write_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + int err; + struct file *file = iocb->ki_filp, *lower_file; + + lower_file = sdcardfs_lower_file(file); + if (!lower_file->f_op->write_iter) { + err = -EINVAL; + goto out; + } + + get_file(lower_file); /* prevent lower_file from being released */ + iocb->ki_filp = lower_file; + err = lower_file->f_op->write_iter(iocb, iter); + iocb->ki_filp = file; + fput(lower_file); + /* update upper inode times/sizes as needed */ + if (err >= 0 || err == -EIOCBQUEUED) { + fsstack_copy_inode_size(file->f_path.dentry->d_inode, + file_inode(lower_file)); + fsstack_copy_attr_times(file->f_path.dentry->d_inode, + file_inode(lower_file)); + } +out: + return err; +} + const struct file_operations sdcardfs_main_fops = { .llseek = generic_file_llseek, .read = sdcardfs_read, @@ -337,11 +417,13 @@ const struct file_operations sdcardfs_main_fops = { .release = sdcardfs_file_release, .fsync = sdcardfs_fsync, .fasync = sdcardfs_fasync, + .read_iter = sdcardfs_read_iter, + .write_iter = sdcardfs_write_iter, }; /* trimmed directory options */ const struct file_operations sdcardfs_dir_fops = { - .llseek = generic_file_llseek, + .llseek = sdcardfs_file_llseek, .read = generic_read_dir, .iterate = sdcardfs_readdir, .unlocked_ioctl = sdcardfs_unlocked_ioctl, diff --git a/fs/sdcardfs/inode.c b/fs/sdcardfs/inode.c index 69060ee52e6b7..9b2e4fc3379f7 100644 --- a/fs/sdcardfs/inode.c +++ b/fs/sdcardfs/inode.c @@ -19,18 +19,26 @@ */ #include "sdcardfs.h" +#include +#include /* Do not directly use this function. Use OVERRIDE_CRED() instead. */ -const struct cred * override_fsids(struct sdcardfs_sb_info* sbi) +const struct cred *override_fsids(struct sdcardfs_sb_info *sbi, + struct sdcardfs_inode_data *data) { - struct cred * cred; - const struct cred * old_cred; + struct cred *cred; + const struct cred *old_cred; + uid_t uid; cred = prepare_creds(); if (!cred) return NULL; - cred->fsuid = make_kuid(&init_user_ns, sbi->options.fs_low_uid); + if (data->under_obb) + uid = AID_MEDIA_OBB; + else + uid = multiuser_get_uid(data->userid, sbi->options.fs_low_uid); + cred->fsuid = make_kuid(&init_user_ns, uid); cred->fsgid = make_kgid(&init_user_ns, sbi->options.fs_low_gid); old_cred = override_creds(cred); @@ -39,9 +47,9 @@ const struct cred * override_fsids(struct sdcardfs_sb_info* sbi) } /* Do not directly use this function, use REVERT_CRED() instead. */ -void revert_fsids(const struct cred * old_cred) +void revert_fsids(const struct cred *old_cred) { - const struct cred * cur_cred; + const struct cred *cur_cred; cur_cred = current->cred; revert_creds(old_cred); @@ -53,38 +61,54 @@ static int sdcardfs_create(struct inode *dir, struct dentry *dentry, { int err; struct dentry *lower_dentry; + struct vfsmount *lower_dentry_mnt; struct dentry *lower_parent_dentry = NULL; struct path lower_path; const struct cred *saved_cred = NULL; + struct fs_struct *saved_fs; + struct fs_struct *copied_fs; - if(!check_caller_access_to_name(dir, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(dir, &dentry->d_name)) { err = -EACCES; goto out_eacces; } /* save current_cred and override it */ - OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dir)); sdcardfs_get_lower_path(dentry, &lower_path); lower_dentry = lower_path.dentry; + lower_dentry_mnt = lower_path.mnt; lower_parent_dentry = lock_parent(lower_dentry); /* set last 16bytes of mode field to 0664 */ mode = (mode & S_IFMT) | 00664; - err = vfs_create(lower_parent_dentry->d_inode, lower_dentry, mode, want_excl); + + /* temporarily change umask for lower fs write */ + saved_fs = current->fs; + copied_fs = copy_fs_struct(current->fs); + if (!copied_fs) { + err = -ENOMEM; + goto out_unlock; + } + current->fs = copied_fs; + current->fs->umask = 0; + err = vfs_create2(lower_dentry_mnt, lower_parent_dentry->d_inode, lower_dentry, mode, want_excl); if (err) goto out; - err = sdcardfs_interpose(dentry, dir->i_sb, &lower_path, SDCARDFS_I(dir)->userid); + err = sdcardfs_interpose(dentry, dir->i_sb, &lower_path, + SDCARDFS_I(dir)->data->userid); if (err) goto out; fsstack_copy_attr_times(dir, sdcardfs_lower_inode(dir)); fsstack_copy_inode_size(dir, lower_parent_dentry->d_inode); + fixup_lower_ownership(dentry, dentry->d_name.name); out: + current->fs = saved_fs; + free_fs_struct(copied_fs); +out_unlock: unlock_dir(lower_parent_dentry); sdcardfs_put_lower_path(dentry, &lower_path); REVERT_CRED(saved_cred); @@ -138,28 +162,27 @@ static int sdcardfs_unlink(struct inode *dir, struct dentry *dentry) { int err; struct dentry *lower_dentry; + struct vfsmount *lower_mnt; struct inode *lower_dir_inode = sdcardfs_lower_inode(dir); struct dentry *lower_dir_dentry; struct path lower_path; const struct cred *saved_cred = NULL; - if(!check_caller_access_to_name(dir, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(dir, &dentry->d_name)) { err = -EACCES; goto out_eacces; } /* save current_cred and override it */ - OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dir)); sdcardfs_get_lower_path(dentry, &lower_path); lower_dentry = lower_path.dentry; + lower_mnt = lower_path.mnt; dget(lower_dentry); lower_dir_dentry = lock_parent(lower_dentry); - err = vfs_unlink(lower_dir_inode, lower_dentry, NULL); + err = vfs_unlink2(lower_mnt, lower_dir_inode, lower_dentry, NULL); /* * Note: unlinking on top of NFS can cause silly-renamed files. @@ -219,14 +242,15 @@ static int sdcardfs_symlink(struct inode *dir, struct dentry *dentry, } #endif -static int touch(char *abs_path, mode_t mode) { +static int touch(char *abs_path, mode_t mode) +{ struct file *filp = filp_open(abs_path, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, mode); + if (IS_ERR(filp)) { if (PTR_ERR(filp) == -EEXIST) { return 0; - } - else { - printk(KERN_ERR "sdcardfs: failed to open(%s): %ld\n", + } else { + pr_err("sdcardfs: failed to open(%s): %ld\n", abs_path, PTR_ERR(filp)); return PTR_ERR(filp); } @@ -240,31 +264,29 @@ static int sdcardfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode int err; int make_nomedia_in_obb = 0; struct dentry *lower_dentry; + struct vfsmount *lower_mnt; struct dentry *lower_parent_dentry = NULL; struct path lower_path; struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); const struct cred *saved_cred = NULL; - struct sdcardfs_inode_info *pi = SDCARDFS_I(dir); - char *page_buf; - char *nomedia_dir_name; - char *nomedia_fullpath; - int fullpath_namelen; + struct sdcardfs_inode_data *pd = SDCARDFS_I(dir)->data; int touch_err = 0; + struct fs_struct *saved_fs; + struct fs_struct *copied_fs; + struct qstr q_obb = QSTR_LITERAL("obb"); + struct qstr q_data = QSTR_LITERAL("data"); - if(!check_caller_access_to_name(dir, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(dir, &dentry->d_name)) { err = -EACCES; goto out_eacces; } /* save current_cred and override it */ - OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dir)); /* check disk space */ if (!check_min_free_space(dentry, 0, 1)) { - printk(KERN_INFO "sdcardfs: No minimum free space.\n"); + pr_err("sdcardfs: No minimum free space.\n"); err = -ENOSPC; goto out_revert; } @@ -272,87 +294,84 @@ static int sdcardfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode /* the lower_dentry is negative here */ sdcardfs_get_lower_path(dentry, &lower_path); lower_dentry = lower_path.dentry; + lower_mnt = lower_path.mnt; lower_parent_dentry = lock_parent(lower_dentry); /* set last 16bytes of mode field to 0775 */ mode = (mode & S_IFMT) | 00775; - err = vfs_mkdir(lower_parent_dentry->d_inode, lower_dentry, mode); - if (err) + /* temporarily change umask for lower fs write */ + saved_fs = current->fs; + copied_fs = copy_fs_struct(current->fs); + if (!copied_fs) { + err = -ENOMEM; + unlock_dir(lower_parent_dentry); + goto out_unlock; + } + current->fs = copied_fs; + current->fs->umask = 0; + err = vfs_mkdir2(lower_mnt, lower_parent_dentry->d_inode, lower_dentry, mode); + + if (err) { + unlock_dir(lower_parent_dentry); goto out; + } /* if it is a local obb dentry, setup it with the base obbpath */ - if(need_graft_path(dentry)) { + if (need_graft_path(dentry)) { err = setup_obb_dentry(dentry, &lower_path); - if(err) { + if (err) { /* if the sbi->obbpath is not available, the lower_path won't be * changed by setup_obb_dentry() but the lower path is saved to * its orig_path. this dentry will be revalidated later. - * but now, the lower_path should be NULL */ + * but now, the lower_path should be NULL + */ sdcardfs_put_reset_lower_path(dentry); /* the newly created lower path which saved to its orig_path or * the lower_path is the base obbpath. - * therefore, an additional path_get is required */ + * therefore, an additional path_get is required + */ path_get(&lower_path); } else make_nomedia_in_obb = 1; } - err = sdcardfs_interpose(dentry, dir->i_sb, &lower_path, pi->userid); - if (err) + err = sdcardfs_interpose(dentry, dir->i_sb, &lower_path, pd->userid); + if (err) { + unlock_dir(lower_parent_dentry); goto out; + } fsstack_copy_attr_times(dir, sdcardfs_lower_inode(dir)); fsstack_copy_inode_size(dir, lower_parent_dentry->d_inode); /* update number of links on parent directory */ set_nlink(dir, sdcardfs_lower_inode(dir)->i_nlink); - - if ((!sbi->options.multiuser) && (!strcasecmp(dentry->d_name.name, "obb")) - && (pi->perm == PERM_ANDROID) && (pi->userid == 0)) + fixup_lower_ownership(dentry, dentry->d_name.name); + unlock_dir(lower_parent_dentry); + if ((!sbi->options.multiuser) && (qstr_case_eq(&dentry->d_name, &q_obb)) + && (pd->perm == PERM_ANDROID) && (pd->userid == 0)) make_nomedia_in_obb = 1; /* When creating /Android/data and /Android/obb, mark them as .nomedia */ if (make_nomedia_in_obb || - ((pi->perm == PERM_ANDROID) && (!strcasecmp(dentry->d_name.name, "data")))) { - - page_buf = (char *)__get_free_page(GFP_KERNEL); - if (!page_buf) { - printk(KERN_ERR "sdcardfs: failed to allocate page buf\n"); - goto out; - } - - nomedia_dir_name = d_absolute_path(&lower_path, page_buf, PAGE_SIZE); - if (IS_ERR(nomedia_dir_name)) { - free_page((unsigned long)page_buf); - printk(KERN_ERR "sdcardfs: failed to get .nomedia dir name\n"); - goto out; - } - - fullpath_namelen = page_buf + PAGE_SIZE - nomedia_dir_name - 1; - fullpath_namelen += strlen("/.nomedia"); - nomedia_fullpath = kzalloc(fullpath_namelen + 1, GFP_KERNEL); - if (!nomedia_fullpath) { - free_page((unsigned long)page_buf); - printk(KERN_ERR "sdcardfs: failed to allocate .nomedia fullpath buf\n"); - goto out; - } - - strcpy(nomedia_fullpath, nomedia_dir_name); - free_page((unsigned long)page_buf); - strcat(nomedia_fullpath, "/.nomedia"); - touch_err = touch(nomedia_fullpath, 0664); + ((pd->perm == PERM_ANDROID) + && (qstr_case_eq(&dentry->d_name, &q_data)))) { + REVERT_CRED(saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dentry->d_inode)); + set_fs_pwd(current->fs, &lower_path); + touch_err = touch(".nomedia", 0664); if (touch_err) { - printk(KERN_ERR "sdcardfs: failed to touch(%s): %d\n", - nomedia_fullpath, touch_err); - kfree(nomedia_fullpath); + pr_err("sdcardfs: failed to create .nomedia in %s: %d\n", + lower_path.dentry->d_name.name, touch_err); goto out; } - kfree(nomedia_fullpath); } out: - unlock_dir(lower_parent_dentry); + current->fs = saved_fs; + free_fs_struct(copied_fs); +out_unlock: sdcardfs_put_lower_path(dentry, &lower_path); out_revert: REVERT_CRED(saved_cred); @@ -364,29 +383,29 @@ static int sdcardfs_rmdir(struct inode *dir, struct dentry *dentry) { struct dentry *lower_dentry; struct dentry *lower_dir_dentry; + struct vfsmount *lower_mnt; int err; struct path lower_path; const struct cred *saved_cred = NULL; - if(!check_caller_access_to_name(dir, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(dir, &dentry->d_name)) { err = -EACCES; goto out_eacces; } /* save current_cred and override it */ - OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dir)); /* sdcardfs_get_real_lower(): in case of remove an user's obb dentry - * the dentry on the original path should be deleted. */ + * the dentry on the original path should be deleted. + */ sdcardfs_get_real_lower(dentry, &lower_path); lower_dentry = lower_path.dentry; + lower_mnt = lower_path.mnt; lower_dir_dentry = lock_parent(lower_dentry); - err = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry); + err = vfs_rmdir2(lower_mnt, lower_dir_dentry->d_inode, lower_dentry); if (err) goto out; @@ -450,27 +469,25 @@ static int sdcardfs_rename(struct inode *old_dir, struct dentry *old_dentry, struct dentry *lower_new_dentry = NULL; struct dentry *lower_old_dir_dentry = NULL; struct dentry *lower_new_dir_dentry = NULL; + struct vfsmount *lower_mnt = NULL; struct dentry *trap = NULL; - struct dentry *new_parent = NULL; struct path lower_old_path, lower_new_path; const struct cred *saved_cred = NULL; - if(!check_caller_access_to_name(old_dir, old_dentry->d_name.name) || - !check_caller_access_to_name(new_dir, new_dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " new_dentry: %s, task:%s\n", - __func__, new_dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(old_dir, &old_dentry->d_name) || + !check_caller_access_to_name(new_dir, &new_dentry->d_name)) { err = -EACCES; goto out_eacces; } /* save current_cred and override it */ - OVERRIDE_CRED(SDCARDFS_SB(old_dir->i_sb), saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(old_dir->i_sb), saved_cred, SDCARDFS_I(new_dir)); sdcardfs_get_real_lower(old_dentry, &lower_old_path); sdcardfs_get_lower_path(new_dentry, &lower_new_path); lower_old_dentry = lower_old_path.dentry; lower_new_dentry = lower_new_path.dentry; + lower_mnt = lower_old_path.mnt; lower_old_dir_dentry = dget_parent(lower_old_dentry); lower_new_dir_dentry = dget_parent(lower_new_dentry); @@ -486,7 +503,8 @@ static int sdcardfs_rename(struct inode *old_dir, struct dentry *old_dentry, goto out; } - err = vfs_rename(lower_old_dir_dentry->d_inode, lower_old_dentry, + err = vfs_rename2(lower_mnt, + lower_old_dir_dentry->d_inode, lower_old_dentry, lower_new_dir_dentry->d_inode, lower_new_dentry, NULL, 0); if (err) @@ -499,25 +517,11 @@ static int sdcardfs_rename(struct inode *old_dir, struct dentry *old_dentry, if (new_dir != old_dir) { sdcardfs_copy_and_fix_attrs(old_dir, lower_old_dir_dentry->d_inode); fsstack_copy_inode_size(old_dir, lower_old_dir_dentry->d_inode); - - /* update the derived permission of the old_dentry - * with its new parent - */ - new_parent = dget_parent(new_dentry); - if(new_parent) { - if(old_dentry->d_inode) { - update_derived_permission_lock(old_dentry); - } - dput(new_parent); - } } - /* At this point, not all dentry information has been moved, so - * we pass along new_dentry for the name.*/ - mutex_lock(&old_dentry->d_inode->i_mutex); - get_derived_permission_new(new_dentry->d_parent, old_dentry, new_dentry); - fix_derived_permission(old_dentry->d_inode); - get_derive_permissions_recursive(old_dentry); - mutex_unlock(&old_dentry->d_inode->i_mutex); + get_derived_permission_new(new_dentry->d_parent, old_dentry, &new_dentry->d_name); + fixup_tmp_permissions(old_dentry->d_inode); + fixup_lower_ownership(old_dentry, new_dentry->d_name.name); + d_invalidate(old_dentry); /* Can't fixup ownership recursively :( */ out: unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry); dput(lower_old_dir_dentry); @@ -588,16 +592,61 @@ static void *sdcardfs_follow_link(struct dentry *dentry, struct nameidata *nd) } #endif -static int sdcardfs_permission(struct inode *inode, int mask) +static int sdcardfs_permission_wrn(struct inode *inode, int mask) +{ + WARN_RATELIMIT(1, "sdcardfs does not support permission. Use permission2.\n"); + return -EINVAL; +} + +void copy_attrs(struct inode *dest, const struct inode *src) +{ + dest->i_mode = src->i_mode; + dest->i_uid = src->i_uid; + dest->i_gid = src->i_gid; + dest->i_rdev = src->i_rdev; + dest->i_atime = src->i_atime; + dest->i_mtime = src->i_mtime; + dest->i_ctime = src->i_ctime; + dest->i_blkbits = src->i_blkbits; + dest->i_flags = src->i_flags; +#ifdef CONFIG_FS_POSIX_ACL + dest->i_acl = src->i_acl; +#endif +#ifdef CONFIG_SECURITY + dest->i_security = src->i_security; +#endif +} + +static int sdcardfs_permission(struct vfsmount *mnt, struct inode *inode, int mask) { int err; + struct inode tmp; + struct sdcardfs_inode_data *top = top_data_get(SDCARDFS_I(inode)); + + if (!top) + return -EINVAL; /* * Permission check on sdcardfs inode. * Calling process should have AID_SDCARD_RW permission + * Since generic_permission only needs i_mode, i_uid, + * i_gid, and i_sb, we can create a fake inode to pass + * this information down in. + * + * The underlying code may attempt to take locks in some + * cases for features we're not using, but if that changes, + * locks must be dealt with to avoid undefined behavior. */ - err = generic_permission(inode, mask); - + copy_attrs(&tmp, inode); + tmp.i_uid = make_kuid(&init_user_ns, top->d_uid); + tmp.i_gid = make_kgid(&init_user_ns, get_gid(mnt, top)); + tmp.i_mode = (inode->i_mode & S_IFMT) + | get_mode(mnt, SDCARDFS_I(inode), top); + data_put(top); + tmp.i_sb = inode->i_sb; + if (IS_POSIXACL(inode)) + pr_warn("%s: This may be undefined behavior...\n", __func__); + err = generic_permission(&tmp, mask); /* XXX * Original sdcardfs code calls inode_permission(lower_inode,.. ) * for checking inode permission. But doing such things here seems @@ -614,6 +663,7 @@ static int sdcardfs_permission(struct inode *inode, int mask) * we check it with AID_MEDIA_RW permission */ struct inode *lower_inode; + OVERRIDE_CRED(SDCARDFS_SB(inode->sb)); lower_inode = sdcardfs_lower_inode(inode); @@ -626,47 +676,85 @@ static int sdcardfs_permission(struct inode *inode, int mask) } -static int sdcardfs_setattr(struct dentry *dentry, struct iattr *ia) +static int sdcardfs_setattr_wrn(struct dentry *dentry, struct iattr *ia) +{ + WARN_RATELIMIT(1, "sdcardfs does not support setattr. User setattr2.\n"); + return -EINVAL; +} + +static int sdcardfs_setattr(struct vfsmount *mnt, struct dentry *dentry, struct iattr *ia) { int err; struct dentry *lower_dentry; + struct vfsmount *lower_mnt; struct inode *inode; struct inode *lower_inode; struct path lower_path; struct iattr lower_ia; struct dentry *parent; + struct inode tmp; + struct sdcardfs_inode_data *top; + const struct cred *saved_cred = NULL; inode = dentry->d_inode; + top = top_data_get(SDCARDFS_I(inode)); + + if (!top) + return -EINVAL; + + /* + * Permission check on sdcardfs inode. + * Calling process should have AID_SDCARD_RW permission + * Since generic_permission only needs i_mode, i_uid, + * i_gid, and i_sb, we can create a fake inode to pass + * this information down in. + * + * The underlying code may attempt to take locks in some + * cases for features we're not using, but if that changes, + * locks must be dealt with to avoid undefined behavior. + * + */ + copy_attrs(&tmp, inode); + tmp.i_uid = make_kuid(&init_user_ns, top->d_uid); + tmp.i_gid = make_kgid(&init_user_ns, get_gid(mnt, top)); + tmp.i_mode = (inode->i_mode & S_IFMT) + | get_mode(mnt, SDCARDFS_I(inode), top); + tmp.i_size = i_size_read(inode); + data_put(top); + tmp.i_sb = inode->i_sb; /* * Check if user has permission to change inode. We don't check if * this user can change the lower inode: that should happen when * calling notify_change on the lower inode. */ - err = inode_change_ok(inode, ia); + /* prepare our own lower struct iattr (with the lower file) */ + memcpy(&lower_ia, ia, sizeof(lower_ia)); + /* Allow touch updating timestamps. A previous permission check ensures + * we have write access. Changes to mode, owner, and group are ignored + */ + ia->ia_valid |= ATTR_FORCE; + err = inode_change_ok(&tmp, ia); - /* no vfs_XXX operations required, cred overriding will be skipped. wj*/ if (!err) { /* check the Android group ID */ parent = dget_parent(dentry); - if(!check_caller_access_to_name(parent->d_inode, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(parent->d_inode, &dentry->d_name)) err = -EACCES; - } dput(parent); } if (err) goto out_err; + /* save current_cred and override it */ + OVERRIDE_CRED(SDCARDFS_SB(dentry->d_sb), saved_cred, SDCARDFS_I(inode)); + sdcardfs_get_lower_path(dentry, &lower_path); lower_dentry = lower_path.dentry; + lower_mnt = lower_path.mnt; lower_inode = sdcardfs_lower_inode(inode); - /* prepare our own lower struct iattr (with the lower file) */ - memcpy(&lower_ia, ia, sizeof(lower_ia)); if (ia->ia_valid & ATTR_FILE) lower_ia.ia_file = sdcardfs_lower_file(ia->ia_file); @@ -680,13 +768,9 @@ static int sdcardfs_setattr(struct dentry *dentry, struct iattr *ia) * afterwards in the other cases: we fsstack_copy_inode_size from * the lower level. */ - if (current->mm) - down_write(¤t->mm->mmap_sem); if (ia->ia_valid & ATTR_SIZE) { - err = inode_newsize_ok(inode, ia->ia_size); + err = inode_newsize_ok(&tmp, ia->ia_size); if (err) { - if (current->mm) - up_write(¤t->mm->mmap_sem); goto out; } truncate_setsize(inode, ia->ia_size); @@ -706,11 +790,9 @@ static int sdcardfs_setattr(struct dentry *dentry, struct iattr *ia) * tries to open(), unlink(), then ftruncate() a file. */ mutex_lock(&lower_dentry->d_inode->i_mutex); - err = notify_change(lower_dentry, &lower_ia, /* note: lower_ia */ + err = notify_change2(lower_mnt, lower_dentry, &lower_ia, /* note: lower_ia */ NULL); mutex_unlock(&lower_dentry->d_inode->i_mutex); - if (current->mm) - up_write(¤t->mm->mmap_sem); if (err) goto out; @@ -725,48 +807,69 @@ static int sdcardfs_setattr(struct dentry *dentry, struct iattr *ia) out: sdcardfs_put_lower_path(dentry, &lower_path); + REVERT_CRED(saved_cred); out_err: return err; } +static int sdcardfs_fillattr(struct vfsmount *mnt, + struct inode *inode, struct kstat *stat) +{ + struct sdcardfs_inode_info *info = SDCARDFS_I(inode); + struct sdcardfs_inode_data *top = top_data_get(info); + + if (!top) + return -EINVAL; + + stat->dev = inode->i_sb->s_dev; + stat->ino = inode->i_ino; + stat->mode = (inode->i_mode & S_IFMT) | get_mode(mnt, info, top); + stat->nlink = inode->i_nlink; + stat->uid = make_kuid(&init_user_ns, top->d_uid); + stat->gid = make_kgid(&init_user_ns, get_gid(mnt, top)); + stat->rdev = inode->i_rdev; + stat->size = i_size_read(inode); + stat->atime = inode->i_atime; + stat->mtime = inode->i_mtime; + stat->ctime = inode->i_ctime; + stat->blksize = (1 << inode->i_blkbits); + stat->blocks = inode->i_blocks; + data_put(top); + return 0; +} + static int sdcardfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) { - struct dentry *lower_dentry; - struct inode *inode; - struct inode *lower_inode; + struct kstat lower_stat; struct path lower_path; struct dentry *parent; + int err; parent = dget_parent(dentry); - if(!check_caller_access_to_name(parent->d_inode, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(parent->d_inode, &dentry->d_name)) { dput(parent); return -EACCES; } dput(parent); - inode = dentry->d_inode; - sdcardfs_get_lower_path(dentry, &lower_path); - lower_dentry = lower_path.dentry; - lower_inode = sdcardfs_lower_inode(inode); - - - sdcardfs_copy_and_fix_attrs(inode, lower_inode); - fsstack_copy_inode_size(inode, lower_inode); - - - generic_fillattr(inode, stat); + err = vfs_getattr(&lower_path, &lower_stat); + if (err) + goto out; + sdcardfs_copy_and_fix_attrs(dentry->d_inode, + lower_path.dentry->d_inode); + fsstack_copy_inode_size(dentry->d_inode, lower_path.dentry->d_inode); + err = sdcardfs_fillattr(mnt, dentry->d_inode, stat); + stat->blocks = lower_stat.blocks; +out: sdcardfs_put_lower_path(dentry, &lower_path); - return 0; + return err; } const struct inode_operations sdcardfs_symlink_iops = { - .permission = sdcardfs_permission, - .setattr = sdcardfs_setattr, + .permission2 = sdcardfs_permission, + .setattr2 = sdcardfs_setattr, /* XXX Following operations are implemented, * but FUSE(sdcard) or FAT does not support them * These methods are *NOT* perfectly tested. @@ -779,14 +882,14 @@ const struct inode_operations sdcardfs_symlink_iops = { const struct inode_operations sdcardfs_dir_iops = { .create = sdcardfs_create, .lookup = sdcardfs_lookup, -#if 0 - .permission = sdcardfs_permission, -#endif + .permission = sdcardfs_permission_wrn, + .permission2 = sdcardfs_permission, .unlink = sdcardfs_unlink, .mkdir = sdcardfs_mkdir, .rmdir = sdcardfs_rmdir, .rename = sdcardfs_rename, - .setattr = sdcardfs_setattr, + .setattr = sdcardfs_setattr_wrn, + .setattr2 = sdcardfs_setattr, .getattr = sdcardfs_getattr, /* XXX Following operations are implemented, * but FUSE(sdcard) or FAT does not support them @@ -798,7 +901,9 @@ const struct inode_operations sdcardfs_dir_iops = { }; const struct inode_operations sdcardfs_main_iops = { - .permission = sdcardfs_permission, - .setattr = sdcardfs_setattr, + .permission = sdcardfs_permission_wrn, + .permission2 = sdcardfs_permission, + .setattr = sdcardfs_setattr_wrn, + .setattr2 = sdcardfs_setattr, .getattr = sdcardfs_getattr, }; diff --git a/fs/sdcardfs/lookup.c b/fs/sdcardfs/lookup.c index a01b06a514fd9..57199654f634a 100644 --- a/fs/sdcardfs/lookup.c +++ b/fs/sdcardfs/lookup.c @@ -36,8 +36,7 @@ int sdcardfs_init_dentry_cache(void) void sdcardfs_destroy_dentry_cache(void) { - if (sdcardfs_dentry_cachep) - kmem_cache_destroy(sdcardfs_dentry_cachep); + kmem_cache_destroy(sdcardfs_dentry_cachep); } void free_dentry_private_data(struct dentry *dentry) @@ -72,7 +71,8 @@ struct inode_data { static int sdcardfs_inode_test(struct inode *inode, void *candidate_data/*void *candidate_lower_inode*/) { struct inode *current_lower_inode = sdcardfs_lower_inode(inode); - userid_t current_userid = SDCARDFS_I(inode)->userid; + userid_t current_userid = SDCARDFS_I(inode)->data->userid; + if (current_lower_inode == ((struct inode_data *)candidate_data)->lower_inode && current_userid == ((struct inode_data *)candidate_data)->id) return 1; /* found a match */ @@ -91,7 +91,9 @@ struct inode *sdcardfs_iget(struct super_block *sb, struct inode *lower_inode, u struct sdcardfs_inode_info *info; struct inode_data data; struct inode *inode; /* the new inode to return */ - int err; + + if (!igrab(lower_inode)) + return ERR_PTR(-ESTALE); data.id = id; data.lower_inode = lower_inode; @@ -102,26 +104,23 @@ struct inode *sdcardfs_iget(struct super_block *sb, struct inode *lower_inode, u * instead. */ lower_inode->i_ino, /* hashval */ - sdcardfs_inode_test, /* inode comparison function */ + sdcardfs_inode_test, /* inode comparison function */ sdcardfs_inode_set, /* inode init function */ &data); /* data passed to test+set fxns */ if (!inode) { - err = -EACCES; iput(lower_inode); - return ERR_PTR(err); + return ERR_PTR(-ENOMEM); } - /* if found a cached inode, then just return it */ - if (!(inode->i_state & I_NEW)) + /* if found a cached inode, then just return it (after iput) */ + if (!(inode->i_state & I_NEW)) { + iput(lower_inode); return inode; + } /* initialize new inode */ info = SDCARDFS_I(inode); inode->i_ino = lower_inode->i_ino; - if (!igrab(lower_inode)) { - err = -ESTALE; - return ERR_PTR(err); - } sdcardfs_set_lower_inode(inode, lower_inode); inode->i_version++; @@ -164,27 +163,26 @@ struct inode *sdcardfs_iget(struct super_block *sb, struct inode *lower_inode, u } /* - * Connect a sdcardfs inode dentry/inode with several lower ones. This is - * the classic stackable file system "vnode interposition" action. - * - * @dentry: sdcardfs's dentry which interposes on lower one - * @sb: sdcardfs's super_block - * @lower_path: the lower path (caller does path_get/put) + * Helper interpose routine, called directly by ->lookup to handle + * spliced dentries. */ -int sdcardfs_interpose(struct dentry *dentry, struct super_block *sb, - struct path *lower_path, userid_t id) +static struct dentry *__sdcardfs_interpose(struct dentry *dentry, + struct super_block *sb, + struct path *lower_path, + userid_t id) { - int err = 0; struct inode *inode; struct inode *lower_inode; struct super_block *lower_sb; + struct dentry *ret_dentry = NULL; + struct dentry *alias = NULL; lower_inode = lower_path->dentry->d_inode; lower_sb = sdcardfs_lower_super(sb); /* check that the lower file system didn't cross a mount point */ if (lower_inode->i_sb != lower_sb) { - err = -EXDEV; + ret_dentry = ERR_PTR(-EXDEV); goto out; } @@ -196,14 +194,68 @@ int sdcardfs_interpose(struct dentry *dentry, struct super_block *sb, /* inherit lower inode number for sdcardfs's inode */ inode = sdcardfs_iget(sb, lower_inode, id); if (IS_ERR(inode)) { - err = PTR_ERR(inode); + ret_dentry = ERR_CAST(inode); + goto out; + } + + alias = d_find_any_alias(inode); + if (IS_ERR(alias)) { + ret_dentry = alias; goto out; } - d_add(dentry, inode); - update_derived_permission_lock(dentry); + /* Allow to 'obb' inode have multiple dentry */ + if (need_graft_path(dentry) || + (alias && alias->d_parent != dentry->d_parent)) { + d_add(dentry, inode); + } else { + ret_dentry = d_splice_alias(inode, dentry); + dentry = ret_dentry ?: dentry; + } + + if (!IS_ERR(dentry)) + update_derived_permission_lock(dentry); out: - return err; + return ret_dentry; +} + +/* + * Connect an sdcardfs inode dentry/inode with several lower ones. This is + * the classic stackable file system "vnode interposition" action. + * + * @dentry: sdcardfs's dentry which interposes on lower one + * @sb: sdcardfs's super_block + * @lower_path: the lower path (caller does path_get/put) + */ +int sdcardfs_interpose(struct dentry *dentry, struct super_block *sb, + struct path *lower_path, userid_t id) +{ + struct dentry *ret_dentry; + + ret_dentry = __sdcardfs_interpose(dentry, sb, lower_path, id); + return PTR_ERR(ret_dentry); +} + +struct sdcardfs_name_data { + struct dir_context ctx; + const struct qstr *to_find; + char *name; + bool found; +}; + +static int sdcardfs_name_match(void *__buf, const char *name, int namelen, + loff_t offset, u64 ino, unsigned int d_type) +{ + struct sdcardfs_name_data *buf = (struct sdcardfs_name_data *) __buf; + struct qstr candidate = QSTR_INIT(name, namelen); + + if (qstr_case_eq(buf->to_find, &candidate)) { + memcpy(buf->name, name, namelen); + buf->name[namelen] = 0; + buf->found = true; + return 1; + } + return 0; } /* @@ -219,9 +271,10 @@ static struct dentry *__sdcardfs_lookup(struct dentry *dentry, struct vfsmount *lower_dir_mnt; struct dentry *lower_dir_dentry = NULL; struct dentry *lower_dentry; - const char *name; + const struct qstr *name; struct path lower_path; - struct qstr this; + struct qstr dname; + struct dentry *ret_dentry = NULL; struct sdcardfs_sb_info *sbi; sbi = SDCARDFS_SB(dentry->d_sb); @@ -231,47 +284,90 @@ static struct dentry *__sdcardfs_lookup(struct dentry *dentry, if (IS_ROOT(dentry)) goto out; - name = dentry->d_name.name; + name = &dentry->d_name; /* now start the actual lookup procedure */ lower_dir_dentry = lower_parent_path->dentry; lower_dir_mnt = lower_parent_path->mnt; /* Use vfs_path_lookup to check if the dentry exists or not */ - err = vfs_path_lookup(lower_dir_dentry, lower_dir_mnt, name, 0, + err = vfs_path_lookup(lower_dir_dentry, lower_dir_mnt, name->name, 0, &lower_path); + /* check for other cases */ + if (err == -ENOENT) { + struct file *file; + const struct cred *cred = current_cred(); + + struct sdcardfs_name_data buffer = { + .ctx.actor = sdcardfs_name_match, + .to_find = name, + .name = __getname(), + .found = false, + }; + + if (!buffer.name) { + err = -ENOMEM; + goto out; + } + file = dentry_open(lower_parent_path, O_RDONLY, cred); + if (IS_ERR(file)) { + err = PTR_ERR(file); + goto put_name; + } + err = iterate_dir(file, &buffer.ctx); + fput(file); + if (err) + goto put_name; + + if (buffer.found) + err = vfs_path_lookup(lower_dir_dentry, + lower_dir_mnt, + buffer.name, 0, + &lower_path); + else + err = -ENOENT; +put_name: + __putname(buffer.name); + } /* no error: handle positive dentries */ if (!err) { /* check if the dentry is an obb dentry * if true, the lower_inode must be replaced with - * the inode of the graft path */ + * the inode of the graft path + */ - if(need_graft_path(dentry)) { + if (need_graft_path(dentry)) { /* setup_obb_dentry() - * The lower_path will be stored to the dentry's orig_path + * The lower_path will be stored to the dentry's orig_path * and the base obbpath will be copyed to the lower_path variable. * if an error returned, there's no change in the lower_path - * returns: -ERRNO if error (0: no error) */ + * returns: -ERRNO if error (0: no error) + */ err = setup_obb_dentry(dentry, &lower_path); - if(err) { + if (err) { /* if the sbi->obbpath is not available, we can optionally * setup the lower_path with its orig_path. * but, the current implementation just returns an error * because the sdcard daemon also regards this case as - * a lookup fail. */ - printk(KERN_INFO "sdcardfs: base obbpath is not available\n"); + * a lookup fail. + */ + pr_info("sdcardfs: base obbpath is not available\n"); sdcardfs_put_reset_orig_path(dentry); goto out; } } sdcardfs_set_lower_path(dentry, &lower_path); - err = sdcardfs_interpose(dentry, dentry->d_sb, &lower_path, id); - if (err) /* path_put underlying path on error */ + ret_dentry = + __sdcardfs_interpose(dentry, dentry->d_sb, &lower_path, id); + if (IS_ERR(ret_dentry)) { + err = PTR_ERR(ret_dentry); + /* path_put underlying path on error */ sdcardfs_put_reset_lower_path(dentry); + } goto out; } @@ -283,21 +379,24 @@ static struct dentry *__sdcardfs_lookup(struct dentry *dentry, goto out; /* instatiate a new negative dentry */ - this.name = name; - this.len = strlen(name); - this.hash = full_name_hash(this.name, this.len); - lower_dentry = d_lookup(lower_dir_dentry, &this); - if (lower_dentry) - goto setup_lower; - - lower_dentry = d_alloc(lower_dir_dentry, &this); + dname.name = name->name; + dname.len = name->len; + + /* See if the low-level filesystem might want + * to use its own hash + */ + lower_dentry = d_hash_and_lookup(lower_dir_dentry, &dname); + if (IS_ERR(lower_dentry)) + return lower_dentry; if (!lower_dentry) { - err = -ENOMEM; + /* We called vfs_path_lookup earlier, and did not get a negative + * dentry then. Don't confuse the lower filesystem by forcing + * one on it now... + */ + err = -ENOENT; goto out; } - d_add(lower_dentry, NULL); /* instantiate and hash */ -setup_lower: lower_path.dentry = lower_dentry; lower_path.mnt = mntget(lower_dir_mnt); sdcardfs_set_lower_path(dentry, &lower_path); @@ -311,14 +410,16 @@ static struct dentry *__sdcardfs_lookup(struct dentry *dentry, err = 0; out: - return ERR_PTR(err); + if (err) + return ERR_PTR(err); + return ret_dentry; } /* * On success: - * fills dentry object appropriate values and returns NULL. + * fills dentry object appropriate values and returns NULL. * On fail (== error) - * returns error ptr + * returns error ptr * * @dir : Parent inode. It is locked (dir->i_mutex) * @dentry : Target dentry to lookup. we should set each of fields. @@ -335,16 +436,13 @@ struct dentry *sdcardfs_lookup(struct inode *dir, struct dentry *dentry, parent = dget_parent(dentry); - if(!check_caller_access_to_name(parent->d_inode, dentry->d_name.name)) { + if (!check_caller_access_to_name(parent->d_inode, &dentry->d_name)) { ret = ERR_PTR(-EACCES); - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); goto out_err; - } + } /* save current_cred and override it */ - OVERRIDE_CRED_PTR(SDCARDFS_SB(dir->i_sb), saved_cred); + OVERRIDE_CRED_PTR(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dir)); sdcardfs_get_lower_path(parent, &lower_parent_path); @@ -355,21 +453,19 @@ struct dentry *sdcardfs_lookup(struct inode *dir, struct dentry *dentry, goto out; } - ret = __sdcardfs_lookup(dentry, flags, &lower_parent_path, SDCARDFS_I(dir)->userid); + ret = __sdcardfs_lookup(dentry, flags, &lower_parent_path, + SDCARDFS_I(dir)->data->userid); if (IS_ERR(ret)) - { goto out; - } if (ret) dentry = ret; if (dentry->d_inode) { fsstack_copy_attr_times(dentry->d_inode, sdcardfs_lower_inode(dentry->d_inode)); - /* get drived permission */ - mutex_lock(&dentry->d_inode->i_mutex); + /* get derived permission */ get_derived_permission(parent, dentry); - fix_derived_permission(dentry->d_inode); - mutex_unlock(&dentry->d_inode->i_mutex); + fixup_tmp_permissions(dentry->d_inode); + fixup_lower_ownership(dentry, dentry->d_name.name); } /* update parent directory's atime */ fsstack_copy_attr_atime(parent->d_inode, diff --git a/fs/sdcardfs/main.c b/fs/sdcardfs/main.c index a6522286d7314..5931c87c7a1bc 100644 --- a/fs/sdcardfs/main.c +++ b/fs/sdcardfs/main.c @@ -28,9 +28,8 @@ enum { Opt_fsgid, Opt_gid, Opt_debug, - Opt_lower_fs, Opt_mask, - Opt_multiuser, // May need? + Opt_multiuser, Opt_userid, Opt_reserved_mb, Opt_err, @@ -49,7 +48,8 @@ static const match_table_t sdcardfs_tokens = { }; static int parse_options(struct super_block *sb, char *options, int silent, - int *debug, struct sdcardfs_mount_options *opts) + int *debug, struct sdcardfs_vfsmount_options *vfsopts, + struct sdcardfs_mount_options *opts) { char *p; substring_t args[MAX_OPT_ARGS]; @@ -58,10 +58,10 @@ static int parse_options(struct super_block *sb, char *options, int silent, /* by default, we use AID_MEDIA_RW as uid, gid */ opts->fs_low_uid = AID_MEDIA_RW; opts->fs_low_gid = AID_MEDIA_RW; - opts->mask = 0; + vfsopts->mask = 0; opts->multiuser = false; opts->fs_user_id = 0; - opts->gid = 0; + vfsopts->gid = 0; /* by default, 0MB is reserved */ opts->reserved_mb = 0; @@ -72,6 +72,7 @@ static int parse_options(struct super_block *sb, char *options, int silent, while ((p = strsep(&options, ",")) != NULL) { int token; + if (!*p) continue; @@ -94,7 +95,7 @@ static int parse_options(struct super_block *sb, char *options, int silent, case Opt_gid: if (match_int(&args[0], &option)) return 0; - opts->gid = option; + vfsopts->gid = option; break; case Opt_userid: if (match_int(&args[0], &option)) @@ -104,7 +105,7 @@ static int parse_options(struct super_block *sb, char *options, int silent, case Opt_mask: if (match_int(&args[0], &option)) return 0; - opts->mask = option; + vfsopts->mask = option; break; case Opt_multiuser: opts->multiuser = true; @@ -116,25 +117,81 @@ static int parse_options(struct super_block *sb, char *options, int silent, break; /* unknown option */ default: - if (!silent) { - printk( KERN_ERR "Unrecognized mount option \"%s\" " - "or missing value", p); - } + if (!silent) + pr_err("Unrecognized mount option \"%s\" or missing value", p); return -EINVAL; } } if (*debug) { - printk( KERN_INFO "sdcardfs : options - debug:%d\n", *debug); - printk( KERN_INFO "sdcardfs : options - uid:%d\n", + pr_info("sdcardfs : options - debug:%d\n", *debug); + pr_info("sdcardfs : options - uid:%d\n", opts->fs_low_uid); - printk( KERN_INFO "sdcardfs : options - gid:%d\n", + pr_info("sdcardfs : options - gid:%d\n", opts->fs_low_gid); } return 0; } +int parse_options_remount(struct super_block *sb, char *options, int silent, + struct sdcardfs_vfsmount_options *vfsopts) +{ + char *p; + substring_t args[MAX_OPT_ARGS]; + int option; + int debug; + + if (!options) + return 0; + + while ((p = strsep(&options, ",")) != NULL) { + int token; + + if (!*p) + continue; + + token = match_token(p, sdcardfs_tokens, args); + + switch (token) { + case Opt_debug: + debug = 1; + break; + case Opt_gid: + if (match_int(&args[0], &option)) + return 0; + vfsopts->gid = option; + + break; + case Opt_mask: + if (match_int(&args[0], &option)) + return 0; + vfsopts->mask = option; + break; + case Opt_multiuser: + case Opt_userid: + case Opt_fsuid: + case Opt_fsgid: + case Opt_reserved_mb: + pr_warn("Option \"%s\" can't be changed during remount\n", p); + break; + /* unknown option */ + default: + if (!silent) + pr_err("Unrecognized mount option \"%s\" or missing value", p); + return -EINVAL; + } + } + + if (debug) { + pr_info("sdcardfs : options - debug:%d\n", debug); + pr_info("sdcardfs : options - gid:%d\n", vfsopts->gid); + pr_info("sdcardfs : options - mask:%d\n", vfsopts->mask); + } + + return 0; +} + #if 0 /* * our custom d_alloc_root work-alike @@ -164,57 +221,58 @@ static struct dentry *sdcardfs_d_alloc_root(struct super_block *sb) #endif DEFINE_MUTEX(sdcardfs_super_list_lock); -LIST_HEAD(sdcardfs_super_list); EXPORT_SYMBOL_GPL(sdcardfs_super_list_lock); +LIST_HEAD(sdcardfs_super_list); EXPORT_SYMBOL_GPL(sdcardfs_super_list); /* * There is no need to lock the sdcardfs_super_info's rwsem as there is no * way anyone can have a reference to the superblock at this point in time. */ -static int sdcardfs_read_super(struct super_block *sb, const char *dev_name, - void *raw_data, int silent) +static int sdcardfs_read_super(struct vfsmount *mnt, struct super_block *sb, + const char *dev_name, void *raw_data, int silent) { int err = 0; int debug; struct super_block *lower_sb; struct path lower_path; struct sdcardfs_sb_info *sb_info; + struct sdcardfs_vfsmount_options *mnt_opt = mnt->data; struct inode *inode; - printk(KERN_INFO "sdcardfs version 2.0\n"); + pr_info("sdcardfs version 2.0\n"); if (!dev_name) { - printk(KERN_ERR - "sdcardfs: read_super: missing dev_name argument\n"); + pr_err("sdcardfs: read_super: missing dev_name argument\n"); err = -EINVAL; goto out; } - printk(KERN_INFO "sdcardfs: dev_name -> %s\n", dev_name); - printk(KERN_INFO "sdcardfs: options -> %s\n", (char *)raw_data); + pr_info("sdcardfs: dev_name -> %s\n", dev_name); + pr_info("sdcardfs: options -> %s\n", (char *)raw_data); + pr_info("sdcardfs: mnt -> %p\n", mnt); /* parse lower path */ err = kern_path(dev_name, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &lower_path); if (err) { - printk(KERN_ERR "sdcardfs: error accessing lower directory '%s'\n", dev_name); + pr_err("sdcardfs: error accessing lower directory '%s'\n", dev_name); goto out; } /* allocate superblock private data */ sb->s_fs_info = kzalloc(sizeof(struct sdcardfs_sb_info), GFP_KERNEL); if (!SDCARDFS_SB(sb)) { - printk(KERN_CRIT "sdcardfs: read_super: out of memory\n"); + pr_crit("sdcardfs: read_super: out of memory\n"); err = -ENOMEM; goto out_free; } sb_info = sb->s_fs_info; /* parse options */ - err = parse_options(sb, raw_data, silent, &debug, &sb_info->options); + err = parse_options(sb, raw_data, silent, &debug, mnt_opt, &sb_info->options); if (err) { - printk(KERN_ERR "sdcardfs: invalid options\n"); + pr_err("sdcardfs: invalid options\n"); goto out_freesbi; } @@ -267,23 +325,24 @@ static int sdcardfs_read_super(struct super_block *sb, const char *dev_name, /* setup permission policy */ sb_info->obbpath_s = kzalloc(PATH_MAX, GFP_KERNEL); mutex_lock(&sdcardfs_super_list_lock); - if(sb_info->options.multiuser) { - setup_derived_state(sb->s_root->d_inode, PERM_PRE_ROOT, sb_info->options.fs_user_id, AID_ROOT, false); + if (sb_info->options.multiuser) { + setup_derived_state(sb->s_root->d_inode, PERM_PRE_ROOT, + sb_info->options.fs_user_id, AID_ROOT, + false, SDCARDFS_I(sb->s_root->d_inode)->data); snprintf(sb_info->obbpath_s, PATH_MAX, "%s/obb", dev_name); - /*err = prepare_dir(sb_info->obbpath_s, - sb_info->options.fs_low_uid, - sb_info->options.fs_low_gid, 00755);*/ } else { - setup_derived_state(sb->s_root->d_inode, PERM_ROOT, sb_info->options.fs_low_uid, AID_ROOT, false); + setup_derived_state(sb->s_root->d_inode, PERM_ROOT, + sb_info->options.fs_user_id, AID_ROOT, + false, SDCARDFS_I(sb->s_root->d_inode)->data); snprintf(sb_info->obbpath_s, PATH_MAX, "%s/Android/obb", dev_name); } - fix_derived_permission(sb->s_root->d_inode); + fixup_tmp_permissions(sb->s_root->d_inode); sb_info->sb = sb; list_add(&sb_info->list, &sdcardfs_super_list); mutex_unlock(&sdcardfs_super_list_lock); if (!silent) - printk(KERN_INFO "sdcardfs: mounted on top of %s type %s\n", + pr_info("sdcardfs: mounted on top of %s type %s\n", dev_name, lower_sb->s_type->name); goto out; /* all is well */ @@ -305,58 +364,71 @@ static int sdcardfs_read_super(struct super_block *sb, const char *dev_name, return err; } -/* A feature which supports mount_nodev() with options */ -static struct dentry *mount_nodev_with_options(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data, - int (*fill_super)(struct super_block *, const char *, void *, int)) +struct sdcardfs_mount_private { + struct vfsmount *mnt; + const char *dev_name; + void *raw_data; +}; +static int __sdcardfs_fill_super( + struct super_block *sb, + void *_priv, int silent) { - int error; - struct super_block *s = sget(fs_type, NULL, set_anon_super, flags, NULL); + struct sdcardfs_mount_private *priv = _priv; - if (IS_ERR(s)) - return ERR_CAST(s); + return sdcardfs_read_super(priv->mnt, + sb, priv->dev_name, priv->raw_data, silent); +} - s->s_flags = flags; +static struct dentry *sdcardfs_mount(struct vfsmount *mnt, + struct file_system_type *fs_type, int flags, + const char *dev_name, void *raw_data) +{ + struct sdcardfs_mount_private priv = { + .mnt = mnt, + .dev_name = dev_name, + .raw_data = raw_data + }; + + return mount_nodev(fs_type, flags, + &priv, __sdcardfs_fill_super); +} - error = fill_super(s, dev_name, data, flags & MS_SILENT ? 1 : 0); - if (error) { - deactivate_locked_super(s); - return ERR_PTR(error); - } - s->s_flags |= MS_ACTIVE; - return dget(s->s_root); +static struct dentry *sdcardfs_mount_wrn(struct file_system_type *fs_type, + int flags, const char *dev_name, void *raw_data) +{ + WARN(1, "sdcardfs does not support mount. Use mount2.\n"); + return ERR_PTR(-EINVAL); } -struct dentry *sdcardfs_mount(struct file_system_type *fs_type, int flags, - const char *dev_name, void *raw_data) +void *sdcardfs_alloc_mnt_data(void) { - /* - * dev_name is a lower_path_name, - * raw_data is a option string. - */ - return mount_nodev_with_options(fs_type, flags, dev_name, - raw_data, sdcardfs_read_super); + return kmalloc(sizeof(struct sdcardfs_vfsmount_options), GFP_KERNEL); } -void sdcardfs_kill_sb(struct super_block *sb) { +void sdcardfs_kill_sb(struct super_block *sb) +{ struct sdcardfs_sb_info *sbi; + if (sb->s_magic == SDCARDFS_SUPER_MAGIC) { sbi = SDCARDFS_SB(sb); mutex_lock(&sdcardfs_super_list_lock); list_del(&sbi->list); mutex_unlock(&sdcardfs_super_list_lock); } - generic_shutdown_super(sb); + kill_anon_super(sb); } static struct file_system_type sdcardfs_fs_type = { .owner = THIS_MODULE, .name = SDCARDFS_NAME, - .mount = sdcardfs_mount, + .mount = sdcardfs_mount_wrn, + .mount2 = sdcardfs_mount, + .alloc_mnt_data = sdcardfs_alloc_mnt_data, .kill_sb = sdcardfs_kill_sb, .fs_flags = 0, }; +MODULE_ALIAS_FS(SDCARDFS_NAME); static int __init init_sdcardfs_fs(void) { @@ -392,10 +464,15 @@ static void __exit exit_sdcardfs_fs(void) pr_info("Completed sdcardfs module unload\n"); } -MODULE_AUTHOR("Erez Zadok, Filesystems and Storage Lab, Stony Brook University" - " (http://www.fsl.cs.sunysb.edu/)"); -MODULE_DESCRIPTION("Wrapfs " SDCARDFS_VERSION - " (http://wrapfs.filesystems.org/)"); +/* Original wrapfs authors */ +MODULE_AUTHOR("Erez Zadok, Filesystems and Storage Lab, Stony Brook University (http://www.fsl.cs.sunysb.edu/)"); + +/* Original sdcardfs authors */ +MODULE_AUTHOR("Woojoong Lee, Daeho Jeong, Kitae Lee, Yeongjin Gil System Memory Lab., Samsung Electronics"); + +/* Current maintainer */ +MODULE_AUTHOR("Daniel Rosenberg, Google"); +MODULE_DESCRIPTION("Sdcardfs " SDCARDFS_VERSION); MODULE_LICENSE("GPL"); module_init(init_sdcardfs_fs); diff --git a/fs/sdcardfs/mmap.c b/fs/sdcardfs/mmap.c index acbaee05e963a..f61896128cfe0 100644 --- a/fs/sdcardfs/mmap.c +++ b/fs/sdcardfs/mmap.c @@ -23,28 +23,46 @@ static int sdcardfs_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { int err; - struct file *file, *lower_file; + struct file *file; const struct vm_operations_struct *lower_vm_ops; - struct vm_area_struct lower_vma; - memcpy(&lower_vma, vma, sizeof(struct vm_area_struct)); - file = lower_vma.vm_file; + file = (struct file *)vma->vm_private_data; lower_vm_ops = SDCARDFS_F(file)->lower_vm_ops; BUG_ON(!lower_vm_ops); - lower_file = sdcardfs_lower_file(file); - /* - * XXX: vm_ops->fault may be called in parallel. Because we have to - * resort to temporarily changing the vma->vm_file to point to the - * lower file, a concurrent invocation of sdcardfs_fault could see a - * different value. In this workaround, we keep a different copy of - * the vma structure in our stack, so we never expose a different - * value of the vma->vm_file called to us, even temporarily. A - * better fix would be to change the calling semantics of ->fault to - * take an explicit file pointer. - */ - lower_vma.vm_file = lower_file; - err = lower_vm_ops->fault(&lower_vma, vmf); + err = lower_vm_ops->fault(vma, vmf); + return err; +} + +static void sdcardfs_vm_open(struct vm_area_struct *vma) +{ + struct file *file = (struct file *)vma->vm_private_data; + + get_file(file); +} + +static void sdcardfs_vm_close(struct vm_area_struct *vma) +{ + struct file *file = (struct file *)vma->vm_private_data; + + fput(file); +} + +static int sdcardfs_page_mkwrite(struct vm_area_struct *vma, + struct vm_fault *vmf) +{ + int err = 0; + struct file *file; + const struct vm_operations_struct *lower_vm_ops; + + file = (struct file *)vma->vm_private_data; + lower_vm_ops = SDCARDFS_F(file)->lower_vm_ops; + BUG_ON(!lower_vm_ops); + if (!lower_vm_ops->page_mkwrite) + goto out; + + err = lower_vm_ops->page_mkwrite(vma, vmf); +out: return err; } @@ -52,30 +70,20 @@ static ssize_t sdcardfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos) { /* - * This function returns zero on purpose in order to support direct IO. - * __dentry_open checks a_ops->direct_IO and returns EINVAL if it is null. - * - * However, this function won't be called by certain file operations - * including generic fs functions. * reads and writes are delivered to - * the lower file systems and the direct IOs will be handled by them. - * - * NOTE: exceptionally, on the recent kernels (since Linux 3.8.x), - * swap_writepage invokes this function directly. + * This function should never be called directly. We need it + * to exist, to get past a check in open_check_o_direct(), + * which is called from do_last(). */ - printk(KERN_INFO "%s, operation is not supported\n", __func__); - return 0; + return -EINVAL; } -/* - * XXX: the default address_space_ops for sdcardfs is empty. We cannot set - * our inode->i_mapping->a_ops to NULL because too many code paths expect - * the a_ops vector to be non-NULL. - */ const struct address_space_operations sdcardfs_aops = { - /* empty on purpose */ .direct_IO = sdcardfs_direct_IO, }; const struct vm_operations_struct sdcardfs_vm_ops = { .fault = sdcardfs_fault, + .page_mkwrite = sdcardfs_page_mkwrite, + .open = sdcardfs_vm_open, + .close = sdcardfs_vm_close, }; diff --git a/fs/sdcardfs/multiuser.h b/fs/sdcardfs/multiuser.h index 923ba101dfa9f..85341e753f8c9 100644 --- a/fs/sdcardfs/multiuser.h +++ b/fs/sdcardfs/multiuser.h @@ -18,20 +18,36 @@ * General Public License. */ -#define MULTIUSER_APP_PER_USER_RANGE 100000 +#define AID_USER_OFFSET 100000 /* offset for uid ranges for each user */ +#define AID_APP_START 10000 /* first app user */ +#define AID_APP_END 19999 /* last app user */ +#define AID_CACHE_GID_START 20000 /* start of gids for apps to mark cached data */ +#define AID_EXT_GID_START 30000 /* start of gids for apps to mark external data */ +#define AID_EXT_CACHE_GID_START 40000 /* start of gids for apps to mark external cached data */ +#define AID_EXT_CACHE_GID_END 49999 /* end of gids for apps to mark external cached data */ +#define AID_SHARED_GID_START 50000 /* start of gids for apps in each user to share */ typedef uid_t userid_t; typedef uid_t appid_t; -static inline userid_t multiuser_get_user_id(uid_t uid) { - return uid / MULTIUSER_APP_PER_USER_RANGE; +static inline uid_t multiuser_get_uid(userid_t user_id, appid_t app_id) +{ + return (user_id * AID_USER_OFFSET) + (app_id % AID_USER_OFFSET); } -static inline appid_t multiuser_get_app_id(uid_t uid) { - return uid % MULTIUSER_APP_PER_USER_RANGE; +static inline bool uid_is_app(uid_t uid) +{ + appid_t appid = uid % AID_USER_OFFSET; + + return appid >= AID_APP_START && appid <= AID_APP_END; } -static inline uid_t multiuser_get_uid(userid_t userId, appid_t appId) { - return userId * MULTIUSER_APP_PER_USER_RANGE + (appId % MULTIUSER_APP_PER_USER_RANGE); +static inline gid_t multiuser_get_ext_cache_gid(uid_t uid) +{ + return uid - AID_APP_START + AID_EXT_CACHE_GID_START; } +static inline gid_t multiuser_get_ext_gid(uid_t uid) +{ + return uid - AID_APP_START + AID_EXT_GID_START; +} diff --git a/fs/sdcardfs/packagelist.c b/fs/sdcardfs/packagelist.c index fead71eac95f2..d552dde9c1309 100644 --- a/fs/sdcardfs/packagelist.c +++ b/fs/sdcardfs/packagelist.c @@ -20,8 +20,10 @@ #include "sdcardfs.h" #include +#include #include - +#include +#include #include #include @@ -29,382 +31,827 @@ #include -#define STRING_BUF_SIZE (512) - struct hashtable_entry { struct hlist_node hlist; - void *key; - unsigned int value; + struct hlist_node dlist; /* for deletion cleanup */ + struct qstr key; + atomic_t value; }; -struct sb_list { - struct super_block *sb; - struct list_head list; -}; +static DEFINE_HASHTABLE(package_to_appid, 8); +static DEFINE_HASHTABLE(package_to_userid, 8); +static DEFINE_HASHTABLE(ext_to_groupid, 8); -struct packagelist_data { - DECLARE_HASHTABLE(package_to_appid,8); - struct mutex hashtable_lock; -}; +static struct kmem_cache *hashtable_entry_cachep; -static struct packagelist_data *pkgl_data_all; +static unsigned int full_name_case_hash(const unsigned char *name, unsigned int len) +{ + unsigned long hash = init_name_hash(); -static struct kmem_cache *hashtable_entry_cachep; + while (len--) + hash = partial_name_hash(tolower(*name++), hash); + return end_name_hash(hash); +} -static unsigned int str_hash(const char *key) { - int i; - unsigned int h = strlen(key); - char *data = (char *)key; +static inline void qstr_init(struct qstr *q, const char *name) +{ + q->name = name; + q->len = strlen(q->name); + q->hash = full_name_case_hash(q->name, q->len); +} + +static inline int qstr_copy(const struct qstr *src, struct qstr *dest) +{ + dest->name = kstrdup(src->name, GFP_KERNEL); + dest->hash_len = src->hash_len; + return !!dest->name; +} + + +static appid_t __get_appid(const struct qstr *key) +{ + struct hashtable_entry *hash_cur; + unsigned int hash = key->hash; + appid_t ret_id; - for (i = 0; i < strlen(key); i++) { - h = h * 31 + *data; - data++; + rcu_read_lock(); + hash_for_each_possible_rcu(package_to_appid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) { + ret_id = atomic_read(&hash_cur->value); + rcu_read_unlock(); + return ret_id; + } } - return h; + rcu_read_unlock(); + return 0; +} + +appid_t get_appid(const char *key) +{ + struct qstr q; + + qstr_init(&q, key); + return __get_appid(&q); } -appid_t get_appid(void *pkgl_id, const char *app_name) +static appid_t __get_ext_gid(const struct qstr *key) { - struct packagelist_data *pkgl_dat = pkgl_data_all; struct hashtable_entry *hash_cur; - unsigned int hash = str_hash(app_name); + unsigned int hash = key->hash; appid_t ret_id; - mutex_lock(&pkgl_dat->hashtable_lock); - hash_for_each_possible(pkgl_dat->package_to_appid, hash_cur, hlist, hash) { - if (!strcasecmp(app_name, hash_cur->key)) { - ret_id = (appid_t)hash_cur->value; - mutex_unlock(&pkgl_dat->hashtable_lock); + rcu_read_lock(); + hash_for_each_possible_rcu(ext_to_groupid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) { + ret_id = atomic_read(&hash_cur->value); + rcu_read_unlock(); return ret_id; } } - mutex_unlock(&pkgl_dat->hashtable_lock); + rcu_read_unlock(); + return 0; +} + +appid_t get_ext_gid(const char *key) +{ + struct qstr q; + + qstr_init(&q, key); + return __get_ext_gid(&q); +} + +static appid_t __is_excluded(const struct qstr *app_name, userid_t user) +{ + struct hashtable_entry *hash_cur; + unsigned int hash = app_name->hash; + + rcu_read_lock(); + hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) { + if (atomic_read(&hash_cur->value) == user && + qstr_case_eq(app_name, &hash_cur->key)) { + rcu_read_unlock(); + return 1; + } + } + rcu_read_unlock(); return 0; } +appid_t is_excluded(const char *key, userid_t user) +{ + struct qstr q; + + qstr_init(&q, key); + return __is_excluded(&q, user); +} + /* Kernel has already enforced everything we returned through * derive_permissions_locked(), so this is used to lock down access - * even further, such as enforcing that apps hold sdcard_rw. */ -int check_caller_access_to_name(struct inode *parent_node, const char* name) { + * even further, such as enforcing that apps hold sdcard_rw. + */ +int check_caller_access_to_name(struct inode *parent_node, const struct qstr *name) +{ + struct qstr q_autorun = QSTR_LITERAL("autorun.inf"); + struct qstr q__android_secure = QSTR_LITERAL(".android_secure"); + struct qstr q_android_secure = QSTR_LITERAL("android_secure"); /* Always block security-sensitive files at root */ - if (parent_node && SDCARDFS_I(parent_node)->perm == PERM_ROOT) { - if (!strcasecmp(name, "autorun.inf") - || !strcasecmp(name, ".android_secure") - || !strcasecmp(name, "android_secure")) { + if (parent_node && SDCARDFS_I(parent_node)->data->perm == PERM_ROOT) { + if (qstr_case_eq(name, &q_autorun) + || qstr_case_eq(name, &q__android_secure) + || qstr_case_eq(name, &q_android_secure)) { return 0; } } /* Root always has access; access for any other UIDs should always - * be controlled through packages.list. */ - if (from_kuid(&init_user_ns, current_fsuid()) == 0) { + * be controlled through packages.list. + */ + if (from_kuid(&init_user_ns, current_fsuid()) == 0) return 1; - } /* No extra permissions to enforce */ return 1; } -/* This function is used when file opening. The open flags must be - * checked before calling check_caller_access_to_name() */ -int open_flags_to_access_mode(int open_flags) { - if((open_flags & O_ACCMODE) == O_RDONLY) { - return 0; /* R_OK */ - } else if ((open_flags & O_ACCMODE) == O_WRONLY) { - return 1; /* W_OK */ - } else { - /* Probably O_RDRW, but treat as default to be safe */ - return 1; /* R_OK | W_OK */ +static struct hashtable_entry *alloc_hashtable_entry(const struct qstr *key, + appid_t value) +{ + struct hashtable_entry *ret = kmem_cache_alloc(hashtable_entry_cachep, + GFP_KERNEL); + if (!ret) + return NULL; + INIT_HLIST_NODE(&ret->dlist); + INIT_HLIST_NODE(&ret->hlist); + + if (!qstr_copy(key, &ret->key)) { + kmem_cache_free(hashtable_entry_cachep, ret); + return NULL; } + + atomic_set(&ret->value, value); + return ret; } -static int insert_str_to_int_lock(struct packagelist_data *pkgl_dat, char *key, - unsigned int value) +static int insert_packagelist_appid_entry_locked(const struct qstr *key, appid_t value) { struct hashtable_entry *hash_cur; struct hashtable_entry *new_entry; - unsigned int hash = str_hash(key); + unsigned int hash = key->hash; - hash_for_each_possible(pkgl_dat->package_to_appid, hash_cur, hlist, hash) { - if (!strcasecmp(key, hash_cur->key)) { - hash_cur->value = value; + hash_for_each_possible_rcu(package_to_appid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) { + atomic_set(&hash_cur->value, value); return 0; } } - new_entry = kmem_cache_alloc(hashtable_entry_cachep, GFP_KERNEL); + new_entry = alloc_hashtable_entry(key, value); + if (!new_entry) + return -ENOMEM; + hash_add_rcu(package_to_appid, &new_entry->hlist, hash); + return 0; +} + +static int insert_ext_gid_entry_locked(const struct qstr *key, appid_t value) +{ + struct hashtable_entry *hash_cur; + struct hashtable_entry *new_entry; + unsigned int hash = key->hash; + + /* An extension can only belong to one gid */ + hash_for_each_possible_rcu(ext_to_groupid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) + return -EINVAL; + } + new_entry = alloc_hashtable_entry(key, value); if (!new_entry) return -ENOMEM; - new_entry->key = kstrdup(key, GFP_KERNEL); - new_entry->value = value; - hash_add(pkgl_dat->package_to_appid, &new_entry->hlist, hash); + hash_add_rcu(ext_to_groupid, &new_entry->hlist, hash); return 0; } -static void fixup_perms(struct super_block *sb) { - if (sb && sb->s_magic == SDCARDFS_SUPER_MAGIC) { - mutex_lock(&sb->s_root->d_inode->i_mutex); - get_derive_permissions_recursive(sb->s_root); - mutex_unlock(&sb->s_root->d_inode->i_mutex); +static int insert_userid_exclude_entry_locked(const struct qstr *key, userid_t value) +{ + struct hashtable_entry *hash_cur; + struct hashtable_entry *new_entry; + unsigned int hash = key->hash; + + /* Only insert if not already present */ + hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) { + if (atomic_read(&hash_cur->value) == value && + qstr_case_eq(key, &hash_cur->key)) + return 0; } + new_entry = alloc_hashtable_entry(key, value); + if (!new_entry) + return -ENOMEM; + hash_add_rcu(package_to_userid, &new_entry->hlist, hash); + return 0; } -static int insert_str_to_int(struct packagelist_data *pkgl_dat, char *key, - unsigned int value) { - int ret; +static void fixup_all_perms_name(const struct qstr *key) +{ struct sdcardfs_sb_info *sbinfo; - mutex_lock(&sdcardfs_super_list_lock); - mutex_lock(&pkgl_dat->hashtable_lock); - ret = insert_str_to_int_lock(pkgl_dat, key, value); - mutex_unlock(&pkgl_dat->hashtable_lock); + struct limit_search limit = { + .flags = BY_NAME, + .name = QSTR_INIT(key->name, key->len), + }; + list_for_each_entry(sbinfo, &sdcardfs_super_list, list) { + if (sbinfo_has_sdcard_magic(sbinfo)) + fixup_perms_recursive(sbinfo->sb->s_root, &limit); + } +} +static void fixup_all_perms_name_userid(const struct qstr *key, userid_t userid) +{ + struct sdcardfs_sb_info *sbinfo; + struct limit_search limit = { + .flags = BY_NAME | BY_USERID, + .name = QSTR_INIT(key->name, key->len), + .userid = userid, + }; list_for_each_entry(sbinfo, &sdcardfs_super_list, list) { - if (sbinfo) { - fixup_perms(sbinfo->sb); - } + if (sbinfo_has_sdcard_magic(sbinfo)) + fixup_perms_recursive(sbinfo->sb->s_root, &limit); } +} + +static void fixup_all_perms_userid(userid_t userid) +{ + struct sdcardfs_sb_info *sbinfo; + struct limit_search limit = { + .flags = BY_USERID, + .userid = userid, + }; + list_for_each_entry(sbinfo, &sdcardfs_super_list, list) { + if (sbinfo_has_sdcard_magic(sbinfo)) + fixup_perms_recursive(sbinfo->sb->s_root, &limit); + } +} + +static int insert_packagelist_entry(const struct qstr *key, appid_t value) +{ + int err; + + mutex_lock(&sdcardfs_super_list_lock); + err = insert_packagelist_appid_entry_locked(key, value); + if (!err) + fixup_all_perms_name(key); mutex_unlock(&sdcardfs_super_list_lock); - return ret; + + return err; } -static void remove_str_to_int_lock(struct hashtable_entry *h_entry) { - kfree(h_entry->key); - hash_del(&h_entry->hlist); - kmem_cache_free(hashtable_entry_cachep, h_entry); +static int insert_ext_gid_entry(const struct qstr *key, appid_t value) +{ + int err; + + mutex_lock(&sdcardfs_super_list_lock); + err = insert_ext_gid_entry_locked(key, value); + mutex_unlock(&sdcardfs_super_list_lock); + + return err; } -static void remove_str_to_int(struct packagelist_data *pkgl_dat, const char *key) +static int insert_userid_exclude_entry(const struct qstr *key, userid_t value) { - struct sdcardfs_sb_info *sbinfo; - struct hashtable_entry *hash_cur; - unsigned int hash = str_hash(key); + int err; + mutex_lock(&sdcardfs_super_list_lock); - mutex_lock(&pkgl_dat->hashtable_lock); - hash_for_each_possible(pkgl_dat->package_to_appid, hash_cur, hlist, hash) { - if (!strcasecmp(key, hash_cur->key)) { - remove_str_to_int_lock(hash_cur); + err = insert_userid_exclude_entry_locked(key, value); + if (!err) + fixup_all_perms_name_userid(key, value); + mutex_unlock(&sdcardfs_super_list_lock); + + return err; +} + +static void free_hashtable_entry(struct hashtable_entry *entry) +{ + kfree(entry->key.name); + kmem_cache_free(hashtable_entry_cachep, entry); +} + +static void remove_packagelist_entry_locked(const struct qstr *key) +{ + struct hashtable_entry *hash_cur; + unsigned int hash = key->hash; + struct hlist_node *h_t; + HLIST_HEAD(free_list); + + hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) { + hash_del_rcu(&hash_cur->hlist); + hlist_add_head(&hash_cur->dlist, &free_list); + } + } + hash_for_each_possible_rcu(package_to_appid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) { + hash_del_rcu(&hash_cur->hlist); + hlist_add_head(&hash_cur->dlist, &free_list); break; } } - mutex_unlock(&pkgl_dat->hashtable_lock); - list_for_each_entry(sbinfo, &sdcardfs_super_list, list) { - if (sbinfo) { - fixup_perms(sbinfo->sb); + synchronize_rcu(); + hlist_for_each_entry_safe(hash_cur, h_t, &free_list, dlist) + free_hashtable_entry(hash_cur); +} + +static void remove_packagelist_entry(const struct qstr *key) +{ + mutex_lock(&sdcardfs_super_list_lock); + remove_packagelist_entry_locked(key); + fixup_all_perms_name(key); + mutex_unlock(&sdcardfs_super_list_lock); +} + +static void remove_ext_gid_entry_locked(const struct qstr *key, gid_t group) +{ + struct hashtable_entry *hash_cur; + unsigned int hash = key->hash; + + hash_for_each_possible_rcu(ext_to_groupid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key) && atomic_read(&hash_cur->value) == group) { + hash_del_rcu(&hash_cur->hlist); + synchronize_rcu(); + free_hashtable_entry(hash_cur); + break; } } +} + +static void remove_ext_gid_entry(const struct qstr *key, gid_t group) +{ + mutex_lock(&sdcardfs_super_list_lock); + remove_ext_gid_entry_locked(key, group); mutex_unlock(&sdcardfs_super_list_lock); - return; } -static void remove_all_hashentrys(struct packagelist_data *pkgl_dat) +static void remove_userid_all_entry_locked(userid_t userid) { struct hashtable_entry *hash_cur; struct hlist_node *h_t; + HLIST_HEAD(free_list); int i; - mutex_lock(&pkgl_dat->hashtable_lock); - hash_for_each_safe(pkgl_dat->package_to_appid, i, h_t, hash_cur, hlist) - remove_str_to_int_lock(hash_cur); - mutex_unlock(&pkgl_dat->hashtable_lock); - hash_init(pkgl_dat->package_to_appid); + + hash_for_each_rcu(package_to_userid, i, hash_cur, hlist) { + if (atomic_read(&hash_cur->value) == userid) { + hash_del_rcu(&hash_cur->hlist); + hlist_add_head(&hash_cur->dlist, &free_list); + } + } + synchronize_rcu(); + hlist_for_each_entry_safe(hash_cur, h_t, &free_list, dlist) { + free_hashtable_entry(hash_cur); + } } -static struct packagelist_data * packagelist_create(void) +static void remove_userid_all_entry(userid_t userid) { - struct packagelist_data *pkgl_dat; + mutex_lock(&sdcardfs_super_list_lock); + remove_userid_all_entry_locked(userid); + fixup_all_perms_userid(userid); + mutex_unlock(&sdcardfs_super_list_lock); +} - pkgl_dat = kmalloc(sizeof(*pkgl_dat), GFP_KERNEL | __GFP_ZERO); - if (!pkgl_dat) { - printk(KERN_ERR "sdcardfs: Failed to create hash\n"); - return ERR_PTR(-ENOMEM); +static void remove_userid_exclude_entry_locked(const struct qstr *key, userid_t userid) +{ + struct hashtable_entry *hash_cur; + unsigned int hash = key->hash; + + hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key) && + atomic_read(&hash_cur->value) == userid) { + hash_del_rcu(&hash_cur->hlist); + synchronize_rcu(); + free_hashtable_entry(hash_cur); + break; + } } +} - mutex_init(&pkgl_dat->hashtable_lock); - hash_init(pkgl_dat->package_to_appid); - - return pkgl_dat; +static void remove_userid_exclude_entry(const struct qstr *key, userid_t userid) +{ + mutex_lock(&sdcardfs_super_list_lock); + remove_userid_exclude_entry_locked(key, userid); + fixup_all_perms_name_userid(key, userid); + mutex_unlock(&sdcardfs_super_list_lock); } -static void packagelist_destroy(struct packagelist_data *pkgl_dat) +static void packagelist_destroy(void) { - remove_all_hashentrys(pkgl_dat); - printk(KERN_INFO "sdcardfs: destroyed packagelist pkgld\n"); - kfree(pkgl_dat); + struct hashtable_entry *hash_cur; + struct hlist_node *h_t; + HLIST_HEAD(free_list); + int i; + + mutex_lock(&sdcardfs_super_list_lock); + hash_for_each_rcu(package_to_appid, i, hash_cur, hlist) { + hash_del_rcu(&hash_cur->hlist); + hlist_add_head(&hash_cur->dlist, &free_list); + } + hash_for_each_rcu(package_to_userid, i, hash_cur, hlist) { + hash_del_rcu(&hash_cur->hlist); + hlist_add_head(&hash_cur->dlist, &free_list); + } + synchronize_rcu(); + hlist_for_each_entry_safe(hash_cur, h_t, &free_list, dlist) + free_hashtable_entry(hash_cur); + mutex_unlock(&sdcardfs_super_list_lock); + pr_info("sdcardfs: destroyed packagelist pkgld\n"); } -struct package_appid { +struct package_details { struct config_item item; - int add_pid; + struct qstr name; }; -static inline struct package_appid *to_package_appid(struct config_item *item) +static inline struct package_details *to_package_details(struct config_item *item) { - return item ? container_of(item, struct package_appid, item) : NULL; + return item ? container_of(item, struct package_details, item) : NULL; } -static struct configfs_attribute package_appid_attr_add_pid = { - .ca_owner = THIS_MODULE, - .ca_name = "appid", - .ca_mode = S_IRUGO | S_IWUGO, -}; +CONFIGFS_ATTR_STRUCT(package_details); +#define PACKAGE_DETAILS_ATTR(_name, _mode, _show, _store) \ +struct package_details_attribute package_details_attr_##_name = __CONFIGFS_ATTR(_name, _mode, _show, _store) +#define PACKAGE_DETAILS_ATTRIBUTE(name) (&package_details_attr_##name.attr) -static struct configfs_attribute *package_appid_attrs[] = { - &package_appid_attr_add_pid, - NULL, -}; +static ssize_t package_details_appid_show(struct package_details *package_details, + char *page) +{ + return scnprintf(page, PAGE_SIZE, "%u\n", __get_appid(&package_details->name)); +} + +static ssize_t package_details_appid_store(struct package_details *package_details, + const char *page, size_t count) +{ + unsigned int tmp; + int ret; + + ret = kstrtouint(page, 10, &tmp); + if (ret) + return ret; + + ret = insert_packagelist_entry(&package_details->name, tmp); + + if (ret) + return ret; + + return count; +} -static ssize_t package_appid_attr_show(struct config_item *item, - struct configfs_attribute *attr, +static ssize_t package_details_excluded_userids_show(struct package_details *package_details, char *page) { - ssize_t count; - count = sprintf(page, "%d\n", get_appid(pkgl_data_all, item->ci_name)); + struct hashtable_entry *hash_cur; + unsigned int hash = package_details->name.hash; + int count = 0; + + rcu_read_lock(); + hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) { + if (qstr_case_eq(&package_details->name, &hash_cur->key)) + count += scnprintf(page + count, PAGE_SIZE - count, + "%d ", atomic_read(&hash_cur->value)); + } + rcu_read_unlock(); + if (count) + count--; + count += scnprintf(page + count, PAGE_SIZE - count, "\n"); return count; } -static ssize_t package_appid_attr_store(struct config_item *item, - struct configfs_attribute *attr, +static ssize_t package_details_excluded_userids_store(struct package_details *package_details, const char *page, size_t count) { - struct package_appid *package_appid = to_package_appid(item); - unsigned long tmp; - char *p = (char *) page; + unsigned int tmp; int ret; - tmp = simple_strtoul(p, &p, 10); - if (!p || (*p && (*p != '\n'))) - return -EINVAL; + ret = kstrtouint(page, 10, &tmp); + if (ret) + return ret; + + ret = insert_userid_exclude_entry(&package_details->name, tmp); - if (tmp > INT_MAX) - return -ERANGE; - ret = insert_str_to_int(pkgl_data_all, item->ci_name, (unsigned int)tmp); - package_appid->add_pid = tmp; if (ret) return ret; return count; } -static void package_appid_release(struct config_item *item) +static ssize_t package_details_clear_userid_store(struct package_details *package_details, + const char *page, size_t count) { - printk(KERN_INFO "sdcardfs: removing %s\n", item->ci_dentry->d_name.name); - /* item->ci_name is freed already, so we rely on the dentry */ - remove_str_to_int(pkgl_data_all, item->ci_dentry->d_name.name); - kfree(to_package_appid(item)); + unsigned int tmp; + int ret; + + ret = kstrtouint(page, 10, &tmp); + if (ret) + return ret; + remove_userid_exclude_entry(&package_details->name, tmp); + return count; +} + +static void package_details_release(struct config_item *item) +{ + struct package_details *package_details = to_package_details(item); + + pr_info("sdcardfs: removing %s\n", package_details->name.name); + remove_packagelist_entry(&package_details->name); + kfree(package_details->name.name); + kfree(package_details); } -static struct configfs_item_operations package_appid_item_ops = { - .release = package_appid_release, - .show_attribute = package_appid_attr_show, - .store_attribute = package_appid_attr_store, +PACKAGE_DETAILS_ATTR(appid, S_IRUGO | S_IWUGO, package_details_appid_show, package_details_appid_store); +PACKAGE_DETAILS_ATTR(excluded_userids, S_IRUGO | S_IWUGO, + package_details_excluded_userids_show, package_details_excluded_userids_store); +PACKAGE_DETAILS_ATTR(clear_userid, S_IWUGO, NULL, package_details_clear_userid_store); + +static struct configfs_attribute *package_details_attrs[] = { + PACKAGE_DETAILS_ATTRIBUTE(appid), + PACKAGE_DETAILS_ATTRIBUTE(excluded_userids), + PACKAGE_DETAILS_ATTRIBUTE(clear_userid), + NULL, +}; + +CONFIGFS_ATTR_OPS(package_details); + +static struct configfs_item_operations package_details_item_ops = { + .release = package_details_release, + .show_attribute = package_details_attr_show, + .store_attribute = package_details_attr_store, }; static struct config_item_type package_appid_type = { - .ct_item_ops = &package_appid_item_ops, - .ct_attrs = package_appid_attrs, + .ct_item_ops = &package_details_item_ops, + .ct_attrs = package_details_attrs, .ct_owner = THIS_MODULE, }; - -struct sdcardfs_packages { +struct extensions_value { struct config_group group; + unsigned int num; +}; + +struct extension_details { + struct config_item item; + struct qstr name; + unsigned int num; }; -static inline struct sdcardfs_packages *to_sdcardfs_packages(struct config_item *item) +static inline struct extensions_value *to_extensions_value(struct config_item *item) { - return item ? container_of(to_config_group(item), struct sdcardfs_packages, group) : NULL; + return item ? container_of(to_config_group(item), struct extensions_value, group) : NULL; } -static struct config_item *sdcardfs_packages_make_item(struct config_group *group, const char *name) +static inline struct extension_details *to_extension_details(struct config_item *item) { - struct package_appid *package_appid; + return item ? container_of(item, struct extension_details, item) : NULL; +} + +static void extension_details_release(struct config_item *item) +{ + struct extension_details *extension_details = to_extension_details(item); + + pr_info("sdcardfs: No longer mapping %s files to gid %d\n", + extension_details->name.name, extension_details->num); + remove_ext_gid_entry(&extension_details->name, extension_details->num); + kfree(extension_details->name.name); + kfree(extension_details); +} + +static struct configfs_item_operations extension_details_item_ops = { + .release = extension_details_release, +}; - package_appid = kzalloc(sizeof(struct package_appid), GFP_KERNEL); - if (!package_appid) +static struct config_item_type extension_details_type = { + .ct_item_ops = &extension_details_item_ops, + .ct_owner = THIS_MODULE, +}; + +static struct config_item *extension_details_make_item(struct config_group *group, const char *name) +{ + struct extensions_value *extensions_value = to_extensions_value(&group->cg_item); + struct extension_details *extension_details = kzalloc(sizeof(struct extension_details), GFP_KERNEL); + const char *tmp; + int ret; + + if (!extension_details) return ERR_PTR(-ENOMEM); - config_item_init_type_name(&package_appid->item, name, - &package_appid_type); + tmp = kstrdup(name, GFP_KERNEL); + if (!tmp) { + kfree(extension_details); + return ERR_PTR(-ENOMEM); + } + qstr_init(&extension_details->name, tmp); + ret = insert_ext_gid_entry(&extension_details->name, extensions_value->num); - package_appid->add_pid = 0; + if (ret) { + kfree(extension_details->name.name); + kfree(extension_details); + return ERR_PTR(ret); + } + config_item_init_type_name(&extension_details->item, name, &extension_details_type); - return &package_appid->item; + return &extension_details->item; } -static struct configfs_attribute sdcardfs_packages_attr_description = { - .ca_owner = THIS_MODULE, - .ca_name = "packages_gid.list", - .ca_mode = S_IRUGO, +static struct configfs_group_operations extensions_value_group_ops = { + .make_item = extension_details_make_item, }; -static struct configfs_attribute *sdcardfs_packages_attrs[] = { - &sdcardfs_packages_attr_description, - NULL, +static struct config_item_type extensions_name_type = { + .ct_group_ops = &extensions_value_group_ops, + .ct_owner = THIS_MODULE, +}; + +static struct config_group *extensions_make_group(struct config_group *group, const char *name) +{ + struct extensions_value *extensions_value; + unsigned int tmp; + int ret; + + extensions_value = kzalloc(sizeof(struct extensions_value), GFP_KERNEL); + if (!extensions_value) + return ERR_PTR(-ENOMEM); + ret = kstrtouint(name, 10, &tmp); + if (ret) { + kfree(extensions_value); + return ERR_PTR(ret); + } + + extensions_value->num = tmp; + config_group_init_type_name(&extensions_value->group, name, + &extensions_name_type); + return &extensions_value->group; +} + +static void extensions_drop_group(struct config_group *group, struct config_item *item) +{ + struct extensions_value *value = to_extensions_value(item); + + pr_info("sdcardfs: No longer mapping any files to gid %d\n", value->num); + kfree(value); +} + +static struct configfs_group_operations extensions_group_ops = { + .make_group = extensions_make_group, + .drop_item = extensions_drop_group, }; -static ssize_t packages_attr_show(struct config_item *item, - struct configfs_attribute *attr, +static struct config_item_type extensions_type = { + .ct_group_ops = &extensions_group_ops, + .ct_owner = THIS_MODULE, +}; + +struct config_group extension_group = { + .cg_item = { + .ci_namebuf = "extensions", + .ci_type = &extensions_type, + }, +}; + +struct packages { + struct configfs_subsystem subsystem; +}; + +static inline struct packages *to_packages(struct config_item *item) +{ + return item ? container_of(to_configfs_subsystem(to_config_group(item)), struct packages, subsystem) : NULL; +} + +CONFIGFS_ATTR_STRUCT(packages); +#define PACKAGES_ATTR(_name, _mode, _show, _store) \ +struct packages_attribute packages_attr_##_name = __CONFIGFS_ATTR(_name, _mode, _show, _store) +#define PACKAGES_ATTR_RO(_name, _show) \ +struct packages_attribute packages_attr_##_name = __CONFIGFS_ATTR_RO(_name, _show) + +static struct config_item *packages_make_item(struct config_group *group, const char *name) +{ + struct package_details *package_details; + const char *tmp; + + package_details = kzalloc(sizeof(struct package_details), GFP_KERNEL); + if (!package_details) + return ERR_PTR(-ENOMEM); + tmp = kstrdup(name, GFP_KERNEL); + if (!tmp) { + kfree(package_details); + return ERR_PTR(-ENOMEM); + } + qstr_init(&package_details->name, tmp); + config_item_init_type_name(&package_details->item, name, + &package_appid_type); + + return &package_details->item; +} + +static ssize_t packages_list_show(struct packages *packages, char *page) { - struct hashtable_entry *hash_cur; - struct hlist_node *h_t; + struct hashtable_entry *hash_cur_app; + struct hashtable_entry *hash_cur_user; int i; - int count = 0; - mutex_lock(&pkgl_data_all->hashtable_lock); - hash_for_each_safe(pkgl_data_all->package_to_appid, i, h_t, hash_cur, hlist) - count += snprintf(page + count, PAGE_SIZE - count, "%s %d\n", (char *)hash_cur->key, hash_cur->value); - mutex_unlock(&pkgl_data_all->hashtable_lock); - + int count = 0, written = 0; + const char errormsg[] = "\n"; + unsigned int hash; + + rcu_read_lock(); + hash_for_each_rcu(package_to_appid, i, hash_cur_app, hlist) { + written = scnprintf(page + count, PAGE_SIZE - sizeof(errormsg) - count, "%s %d\n", + hash_cur_app->key.name, atomic_read(&hash_cur_app->value)); + hash = hash_cur_app->key.hash; + hash_for_each_possible_rcu(package_to_userid, hash_cur_user, hlist, hash) { + if (qstr_case_eq(&hash_cur_app->key, &hash_cur_user->key)) { + written += scnprintf(page + count + written - 1, + PAGE_SIZE - sizeof(errormsg) - count - written + 1, + " %d\n", atomic_read(&hash_cur_user->value)) - 1; + } + } + if (count + written == PAGE_SIZE - sizeof(errormsg) - 1) { + count += scnprintf(page + count, PAGE_SIZE - count, errormsg); + break; + } + count += written; + } + rcu_read_unlock(); return count; } -static void sdcardfs_packages_release(struct config_item *item) +static ssize_t packages_remove_userid_store(struct packages *packages, + const char *page, size_t count) { + unsigned int tmp; + int ret; - printk(KERN_INFO "sdcardfs: destroyed something?\n"); - kfree(to_sdcardfs_packages(item)); + ret = kstrtouint(page, 10, &tmp); + if (ret) + return ret; + remove_userid_all_entry(tmp); + return count; } -static struct configfs_item_operations sdcardfs_packages_item_ops = { - .release = sdcardfs_packages_release, - .show_attribute = packages_attr_show, +struct packages_attribute packages_attr_packages_gid_list = __CONFIGFS_ATTR_RO(packages_gid.list, packages_list_show); +PACKAGES_ATTR(remove_userid, S_IWUGO, NULL, packages_remove_userid_store); + +static struct configfs_attribute *packages_attrs[] = { + &packages_attr_packages_gid_list.attr, + &packages_attr_remove_userid.attr, + NULL, +}; + +CONFIGFS_ATTR_OPS(packages) +static struct configfs_item_operations packages_item_ops = { + .show_attribute = packages_attr_show, + .store_attribute = packages_attr_store, }; /* * Note that, since no extra work is required on ->drop_item(), * no ->drop_item() is provided. */ -static struct configfs_group_operations sdcardfs_packages_group_ops = { - .make_item = sdcardfs_packages_make_item, +static struct configfs_group_operations packages_group_ops = { + .make_item = packages_make_item, }; -static struct config_item_type sdcardfs_packages_type = { - .ct_item_ops = &sdcardfs_packages_item_ops, - .ct_group_ops = &sdcardfs_packages_group_ops, - .ct_attrs = sdcardfs_packages_attrs, +static struct config_item_type packages_type = { + .ct_item_ops = &packages_item_ops, + .ct_group_ops = &packages_group_ops, + .ct_attrs = packages_attrs, .ct_owner = THIS_MODULE, }; -static struct configfs_subsystem sdcardfs_packages_subsys = { - .su_group = { - .cg_item = { - .ci_namebuf = "sdcardfs", - .ci_type = &sdcardfs_packages_type, +struct config_group *sd_default_groups[] = { + &extension_group, + NULL, +}; + +static struct packages sdcardfs_packages = { + .subsystem = { + .su_group = { + .cg_item = { + .ci_namebuf = "sdcardfs", + .ci_type = &packages_type, + }, + .default_groups = sd_default_groups, }, }, }; static int configfs_sdcardfs_init(void) { - int ret; - struct configfs_subsystem *subsys = &sdcardfs_packages_subsys; + int ret, i; + struct configfs_subsystem *subsys = &sdcardfs_packages.subsystem; + for (i = 0; sd_default_groups[i]; i++) + config_group_init(sd_default_groups[i]); config_group_init(&subsys->su_group); mutex_init(&subsys->su_mutex); ret = configfs_register_subsystem(subsys); if (ret) { - printk(KERN_ERR "Error %d while registering subsystem %s\n", + pr_err("Error %d while registering subsystem %s\n", ret, subsys->su_group.cg_item.ci_namebuf); } @@ -413,7 +860,7 @@ static int configfs_sdcardfs_init(void) static void configfs_sdcardfs_exit(void) { - configfs_unregister_subsystem(&sdcardfs_packages_subsys); + configfs_unregister_subsystem(&sdcardfs_packages.subsystem); } int packagelist_init(void) @@ -422,19 +869,17 @@ int packagelist_init(void) kmem_cache_create("packagelist_hashtable_entry", sizeof(struct hashtable_entry), 0, 0, NULL); if (!hashtable_entry_cachep) { - printk(KERN_ERR "sdcardfs: failed creating pkgl_hashtable entry slab cache\n"); + pr_err("sdcardfs: failed creating pkgl_hashtable entry slab cache\n"); return -ENOMEM; } - pkgl_data_all = packagelist_create(); configfs_sdcardfs_init(); - return 0; + return 0; } void packagelist_exit(void) { configfs_sdcardfs_exit(); - packagelist_destroy(pkgl_data_all); - if (hashtable_entry_cachep) - kmem_cache_destroy(hashtable_entry_cachep); + packagelist_destroy(); + kmem_cache_destroy(hashtable_entry_cachep); } diff --git a/fs/sdcardfs/sdcardfs.h b/fs/sdcardfs/sdcardfs.h index 62c59da5ca858..f26994cb869a2 100644 --- a/fs/sdcardfs/sdcardfs.h +++ b/fs/sdcardfs/sdcardfs.h @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include #include @@ -52,7 +54,7 @@ #define SDCARDFS_ROOT_INO 1 /* useful for tracking code reachability */ -#define UDBG printk(KERN_DEFAULT "DBG:%s:%s:%d\n", __FILE__, __func__, __LINE__) +#define UDBG pr_default("DBG:%s:%s:%d\n", __FILE__, __func__, __LINE__) #define SDCARDFS_DIRENT_SIZE 256 @@ -65,71 +67,90 @@ #define AID_SDCARD_PICS 1033 /* external storage photos access */ #define AID_SDCARD_AV 1034 /* external storage audio/video access */ #define AID_SDCARD_ALL 1035 /* access all users external storage */ +#define AID_MEDIA_OBB 1059 /* obb files */ + +#define AID_SDCARD_IMAGE 1057 #define AID_PACKAGE_INFO 1027 -#define fix_derived_permission(x) \ + +/* + * Permissions are handled by our permission function. + * We don't want anyone who happens to look at our inode value to prematurely + * block access, so store more permissive values. These are probably never + * used. + */ +#define fixup_tmp_permissions(x) \ do { \ - (x)->i_uid = make_kuid(&init_user_ns, SDCARDFS_I(x)->d_uid); \ - (x)->i_gid = make_kgid(&init_user_ns, get_gid(SDCARDFS_I(x))); \ - (x)->i_mode = ((x)->i_mode & S_IFMT) | get_mode(SDCARDFS_I(x));\ + (x)->i_uid = make_kuid(&init_user_ns, \ + SDCARDFS_I(x)->data->d_uid); \ + (x)->i_gid = make_kgid(&init_user_ns, AID_SDCARD_RW); \ + (x)->i_mode = ((x)->i_mode & S_IFMT) | 0775;\ } while (0) - /* OVERRIDE_CRED() and REVERT_CRED() - * OVERRID_CRED() - * backup original task->cred - * and modifies task->cred->fsuid/fsgid to specified value. + * OVERRIDE_CRED() + * backup original task->cred + * and modifies task->cred->fsuid/fsgid to specified value. * REVERT_CRED() - * restore original task->cred->fsuid/fsgid. + * restore original task->cred->fsuid/fsgid. * These two macro should be used in pair, and OVERRIDE_CRED() should be * placed at the beginning of a function, right after variable declaration. */ -#define OVERRIDE_CRED(sdcardfs_sbi, saved_cred) \ - saved_cred = override_fsids(sdcardfs_sbi); \ - if (!saved_cred) { return -ENOMEM; } +#define OVERRIDE_CRED(sdcardfs_sbi, saved_cred, info) \ + do { \ + saved_cred = override_fsids(sdcardfs_sbi, info->data); \ + if (!saved_cred) \ + return -ENOMEM; \ + } while (0) -#define OVERRIDE_CRED_PTR(sdcardfs_sbi, saved_cred) \ - saved_cred = override_fsids(sdcardfs_sbi); \ - if (!saved_cred) { return ERR_PTR(-ENOMEM); } +#define OVERRIDE_CRED_PTR(sdcardfs_sbi, saved_cred, info) \ + do { \ + saved_cred = override_fsids(sdcardfs_sbi, info->data); \ + if (!saved_cred) \ + return ERR_PTR(-ENOMEM); \ + } while (0) #define REVERT_CRED(saved_cred) revert_fsids(saved_cred) -#define DEBUG_CRED() \ - printk("KAKJAGI: %s:%d fsuid %d fsgid %d\n", \ - __FUNCTION__, __LINE__, \ - (int)current->cred->fsuid, \ - (int)current->cred->fsgid); - /* Android 5.0 support */ /* Permission mode for a specific node. Controls how file permissions - * are derived for children nodes. */ + * are derived for children nodes. + */ typedef enum { - /* Nothing special; this node should just inherit from its parent. */ - PERM_INHERIT, - /* This node is one level above a normal root; used for legacy layouts - * which use the first level to represent user_id. */ - PERM_PRE_ROOT, - /* This node is "/" */ - PERM_ROOT, - /* This node is "/Android" */ - PERM_ANDROID, - /* This node is "/Android/data" */ - PERM_ANDROID_DATA, - /* This node is "/Android/obb" */ - PERM_ANDROID_OBB, - /* This node is "/Android/media" */ - PERM_ANDROID_MEDIA, + /* Nothing special; this node should just inherit from its parent. */ + PERM_INHERIT, + /* This node is one level above a normal root; used for legacy layouts + * which use the first level to represent user_id. + */ + PERM_PRE_ROOT, + /* This node is "/" */ + PERM_ROOT, + /* This node is "/Android" */ + PERM_ANDROID, + /* This node is "/Android/data" */ + PERM_ANDROID_DATA, + /* This node is "/Android/obb" */ + PERM_ANDROID_OBB, + /* This node is "/Android/media" */ + PERM_ANDROID_MEDIA, + /* This node is "/Android/[data|media|obb]/[package]" */ + PERM_ANDROID_PACKAGE, + /* This node is "/Android/[data|media|obb]/[package]/cache" */ + PERM_ANDROID_PACKAGE_CACHE, } perm_t; struct sdcardfs_sb_info; struct sdcardfs_mount_options; +struct sdcardfs_inode_info; +struct sdcardfs_inode_data; /* Do not directly use this function. Use OVERRIDE_CRED() instead. */ -const struct cred * override_fsids(struct sdcardfs_sb_info* sbi); +const struct cred *override_fsids(struct sdcardfs_sb_info *sbi, + struct sdcardfs_inode_data *data); /* Do not directly use this function, use REVERT_CRED() instead. */ -void revert_fsids(const struct cred * old_cred); +void revert_fsids(const struct cred *old_cred); /* operations vectors defined in specific files */ extern const struct file_operations sdcardfs_main_fops; @@ -161,14 +182,26 @@ struct sdcardfs_file_info { const struct vm_operations_struct *lower_vm_ops; }; -/* sdcardfs inode data in memory */ -struct sdcardfs_inode_info { - struct inode *lower_inode; - /* state derived based on current position in hierachy */ +struct sdcardfs_inode_data { + struct kref refcount; + bool abandoned; + perm_t perm; userid_t userid; uid_t d_uid; bool under_android; + bool under_cache; + bool under_obb; +}; + +/* sdcardfs inode data in memory */ +struct sdcardfs_inode_info { + struct inode *lower_inode; + /* state derived based on current position in hierarchy */ + struct sdcardfs_inode_data *data; + + /* top folder for ownership */ + struct sdcardfs_inode_data *top_data; struct inode vfs_inode; }; @@ -185,18 +218,25 @@ struct sdcardfs_mount_options { uid_t fs_low_uid; gid_t fs_low_gid; userid_t fs_user_id; - gid_t gid; - mode_t mask; bool multiuser; unsigned int reserved_mb; }; +struct sdcardfs_vfsmount_options { + gid_t gid; + mode_t mask; +}; + +extern int parse_options_remount(struct super_block *sb, char *options, int silent, + struct sdcardfs_vfsmount_options *vfsopts); + /* sdcardfs super-block data in memory */ struct sdcardfs_sb_info { struct super_block *sb; struct super_block *lower_sb; /* derived perm policy : some of options have been added - * to sdcardfs_mount_options (Android 4.4 support) */ + * to sdcardfs_mount_options (Android 4.4 support) + */ struct sdcardfs_mount_options options; spinlock_t lock; /* protects obbpath */ char *obbpath_s; @@ -307,7 +347,7 @@ static inline void sdcardfs_put_reset_##pname(const struct dentry *dent) \ { \ struct path pname; \ spin_lock(&SDCARDFS_D(dent)->lock); \ - if(SDCARDFS_D(dent)->pname.dentry) { \ + if (SDCARDFS_D(dent)->pname.dentry) { \ pathcpy(&pname, &SDCARDFS_D(dent)->pname); \ SDCARDFS_D(dent)->pname.dentry = NULL; \ SDCARDFS_D(dent)->pname.mnt = NULL; \ @@ -321,38 +361,97 @@ static inline void sdcardfs_put_reset_##pname(const struct dentry *dent) \ SDCARDFS_DENT_FUNC(lower_path) SDCARDFS_DENT_FUNC(orig_path) -static inline int get_gid(struct sdcardfs_inode_info *info) { - struct sdcardfs_sb_info *sb_info = SDCARDFS_SB(info->vfs_inode.i_sb); - if (sb_info->options.gid == AID_SDCARD_RW) { +static inline bool sbinfo_has_sdcard_magic(struct sdcardfs_sb_info *sbinfo) +{ + return sbinfo && sbinfo->sb + && sbinfo->sb->s_magic == SDCARDFS_SUPER_MAGIC; +} + +static inline struct sdcardfs_inode_data *data_get( + struct sdcardfs_inode_data *data) +{ + if (data) + kref_get(&data->refcount); + return data; +} + +static inline struct sdcardfs_inode_data *top_data_get( + struct sdcardfs_inode_info *info) +{ + return data_get(info->top_data); +} + +extern void data_release(struct kref *ref); + +static inline void data_put(struct sdcardfs_inode_data *data) +{ + kref_put(&data->refcount, data_release); +} + +static inline void release_own_data(struct sdcardfs_inode_info *info) +{ + /* + * This happens exactly once per inode. At this point, the inode that + * originally held this data is about to be freed, and all references + * to it are held as a top value, and will likely be released soon. + */ + info->data->abandoned = true; + data_put(info->data); +} + +static inline void set_top(struct sdcardfs_inode_info *info, + struct sdcardfs_inode_data *top) +{ + struct sdcardfs_inode_data *old_top = info->top_data; + + if (top) + data_get(top); + info->top_data = top; + if (old_top) + data_put(old_top); +} + +static inline int get_gid(struct vfsmount *mnt, + struct sdcardfs_inode_data *data) +{ + struct sdcardfs_vfsmount_options *opts = mnt->data; + + if (opts->gid == AID_SDCARD_RW) /* As an optimization, certain trusted system components only run * as owner but operate across all users. Since we're now handing * out the sdcard_rw GID only to trusted apps, we're okay relaxing * the user boundary enforcement for the default view. The UIDs - * assigned to app directories are still multiuser aware. */ + * assigned to app directories are still multiuser aware. + */ return AID_SDCARD_RW; - } else { - return multiuser_get_uid(info->userid, sb_info->options.gid); - } + else + return multiuser_get_uid(data->userid, opts->gid); } -static inline int get_mode(struct sdcardfs_inode_info *info) { + +static inline int get_mode(struct vfsmount *mnt, + struct sdcardfs_inode_info *info, + struct sdcardfs_inode_data *data) +{ int owner_mode; int filtered_mode; - struct sdcardfs_sb_info *sb_info = SDCARDFS_SB(info->vfs_inode.i_sb); - int visible_mode = 0775 & ~sb_info->options.mask; + struct sdcardfs_vfsmount_options *opts = mnt->data; + int visible_mode = 0775 & ~opts->mask; - if (info->perm == PERM_PRE_ROOT) { + + if (data->perm == PERM_PRE_ROOT) { /* Top of multi-user view should always be visible to ensure - * secondary users can traverse inside. */ + * secondary users can traverse inside. + */ visible_mode = 0711; - } else if (info->under_android) { + } else if (data->under_android) { /* Block "other" access to Android directories, since only apps * belonging to a specific user should be in there; we still - * leave +x open for the default view. */ - if (sb_info->options.gid == AID_SDCARD_RW) { + * leave +x open for the default view. + */ + if (opts->gid == AID_SDCARD_RW) visible_mode = visible_mode & ~0006; - } else { + else visible_mode = visible_mode & ~0007; - } } owner_mode = info->lower_inode->i_mode & 0700; filtered_mode = visible_mode & (owner_mode | (owner_mode >> 3) | (owner_mode >> 6)); @@ -377,7 +476,7 @@ static inline void sdcardfs_get_real_lower(const struct dentry *dent, /* in case of a local obb dentry * the orig_path should be returned */ - if(has_graft_path(dent)) + if (has_graft_path(dent)) sdcardfs_get_orig_path(dent, real_lower); else sdcardfs_get_lower_path(dent, real_lower); @@ -386,7 +485,7 @@ static inline void sdcardfs_get_real_lower(const struct dentry *dent, static inline void sdcardfs_put_real_lower(const struct dentry *dent, struct path *real_lower) { - if(has_graft_path(dent)) + if (has_graft_path(dent)) sdcardfs_put_orig_path(dent, real_lower); else sdcardfs_put_lower_path(dent, real_lower); @@ -396,20 +495,31 @@ extern struct mutex sdcardfs_super_list_lock; extern struct list_head sdcardfs_super_list; /* for packagelist.c */ -extern appid_t get_appid(void *pkgl_id, const char *app_name); -extern int check_caller_access_to_name(struct inode *parent_node, const char* name); -extern int open_flags_to_access_mode(int open_flags); +extern appid_t get_appid(const char *app_name); +extern appid_t get_ext_gid(const char *app_name); +extern appid_t is_excluded(const char *app_name, userid_t userid); +extern int check_caller_access_to_name(struct inode *parent_node, const struct qstr *name); extern int packagelist_init(void); extern void packagelist_exit(void); /* for derived_perm.c */ +#define BY_NAME (1 << 0) +#define BY_USERID (1 << 1) +struct limit_search { + unsigned int flags; + struct qstr name; + userid_t userid; +}; + extern void setup_derived_state(struct inode *inode, perm_t perm, - userid_t userid, uid_t uid, bool under_android); + userid_t userid, uid_t uid, bool under_android, + struct sdcardfs_inode_data *top); extern void get_derived_permission(struct dentry *parent, struct dentry *dentry); -extern void get_derived_permission_new(struct dentry *parent, struct dentry *dentry, struct dentry *newdentry); -extern void get_derive_permissions_recursive(struct dentry *parent); +extern void get_derived_permission_new(struct dentry *parent, struct dentry *dentry, const struct qstr *name); +extern void fixup_perms_recursive(struct dentry *dentry, struct limit_search *limit); extern void update_derived_permission_lock(struct dentry *dentry); +void fixup_lower_ownership(struct dentry *dentry, const char *name); extern int need_graft_path(struct dentry *dentry); extern int is_base_obbpath(struct dentry *dentry); extern int is_obbpath_invalid(struct dentry *dentry); @@ -419,6 +529,7 @@ extern int setup_obb_dentry(struct dentry *dentry, struct path *lower_path); static inline struct dentry *lock_parent(struct dentry *dentry) { struct dentry *dir = dget_parent(dentry); + mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT); return dir; } @@ -444,7 +555,7 @@ static inline int prepare_dir(const char *path_s, uid_t uid, gid_t gid, mode_t m goto out_unlock; } - err = vfs_mkdir(parent.dentry->d_inode, dent, mode); + err = vfs_mkdir2(parent.mnt, parent.dentry->d_inode, dent, mode); if (err) { if (err == -EEXIST) err = 0; @@ -455,7 +566,7 @@ static inline int prepare_dir(const char *path_s, uid_t uid, gid_t gid, mode_t m attrs.ia_gid = make_kgid(&init_user_ns, gid); attrs.ia_valid = ATTR_UID | ATTR_GID; mutex_lock(&dent->d_inode->i_mutex); - notify_change(dent, &attrs, NULL); + notify_change2(parent.mnt, dent, &attrs, NULL); mutex_unlock(&dent->d_inode->i_mutex); out_dput: @@ -513,12 +624,16 @@ static inline int check_min_free_space(struct dentry *dentry, size_t size, int d return 1; } -/* Copies attrs and maintains sdcardfs managed attrs */ +/* + * Copies attrs and maintains sdcardfs managed attrs + * Since our permission check handles all special permissions, set those to be open + */ static inline void sdcardfs_copy_and_fix_attrs(struct inode *dest, const struct inode *src) { - dest->i_mode = (src->i_mode & S_IFMT) | get_mode(SDCARDFS_I(dest)); - dest->i_uid = make_kuid(&init_user_ns, SDCARDFS_I(dest)->d_uid); - dest->i_gid = make_kgid(&init_user_ns, get_gid(SDCARDFS_I(dest))); + dest->i_mode = (src->i_mode & S_IFMT) | S_IRWXU | S_IRWXG | + S_IROTH | S_IXOTH; /* 0775 */ + dest->i_uid = make_kuid(&init_user_ns, SDCARDFS_I(dest)->data->d_uid); + dest->i_gid = make_kgid(&init_user_ns, AID_SDCARD_RW); dest->i_rdev = src->i_rdev; dest->i_atime = src->i_atime; dest->i_mtime = src->i_mtime; @@ -527,4 +642,23 @@ static inline void sdcardfs_copy_and_fix_attrs(struct inode *dest, const struct dest->i_flags = src->i_flags; set_nlink(dest, src->i_nlink); } + +static inline bool str_case_eq(const char *s1, const char *s2) +{ + return !strcasecmp(s1, s2); +} + +static inline bool str_n_case_eq(const char *s1, const char *s2, size_t len) +{ + return !strncasecmp(s1, s2, len); +} + +static inline bool qstr_case_eq(const struct qstr *q1, const struct qstr *q2) +{ + return q1->len == q2->len && str_n_case_eq(q1->name, q2->name, q1->len); +} + +/* */ +#define QSTR_LITERAL(string) QSTR_INIT(string, sizeof(string)-1) + #endif /* not _SDCARDFS_H_ */ diff --git a/fs/sdcardfs/super.c b/fs/sdcardfs/super.c index 1d6490128c990..7f4539b4b2493 100644 --- a/fs/sdcardfs/super.c +++ b/fs/sdcardfs/super.c @@ -26,6 +26,23 @@ */ static struct kmem_cache *sdcardfs_inode_cachep; +/* + * To support the top references, we must track some data separately. + * An sdcardfs_inode_info always has a reference to its data, and once set up, + * also has a reference to its top. The top may be itself, in which case it + * holds two references to its data. When top is changed, it takes a ref to the + * new data and then drops the ref to the old data. + */ +static struct kmem_cache *sdcardfs_inode_data_cachep; + +void data_release(struct kref *ref) +{ + struct sdcardfs_inode_data *data = + container_of(ref, struct sdcardfs_inode_data, refcount); + + kmem_cache_free(sdcardfs_inode_data_cachep, data); +} + /* final actions when unmounting a file system */ static void sdcardfs_put_super(struct super_block *sb) { @@ -36,7 +53,7 @@ static void sdcardfs_put_super(struct super_block *sb) if (!spd) return; - if(spd->obbpath_s) { + if (spd->obbpath_s) { kfree(spd->obbpath_s); path_put(&spd->obbpath); } @@ -64,7 +81,7 @@ static int sdcardfs_statfs(struct dentry *dentry, struct kstatfs *buf) if (sbi->options.reserved_mb) { /* Invalid statfs informations. */ if (buf->f_bsize == 0) { - printk(KERN_ERR "Returned block size is zero.\n"); + pr_err("Returned block size is zero.\n"); return -EINVAL; } @@ -100,14 +117,61 @@ static int sdcardfs_remount_fs(struct super_block *sb, int *flags, char *options * SILENT, but anything else left over is an error. */ if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT)) != 0) { - printk(KERN_ERR - "sdcardfs: remount flags 0x%x unsupported\n", *flags); + pr_err("sdcardfs: remount flags 0x%x unsupported\n", *flags); err = -EINVAL; } return err; } +/* + * @mnt: mount point we are remounting + * @sb: superblock we are remounting + * @flags: numeric mount options + * @options: mount options string + */ +static int sdcardfs_remount_fs2(struct vfsmount *mnt, struct super_block *sb, + int *flags, char *options) +{ + int err = 0; + + /* + * The VFS will take care of "ro" and "rw" flags among others. We + * can safely accept a few flags (RDONLY, MANDLOCK), and honor + * SILENT, but anything else left over is an error. + */ + if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT | MS_REMOUNT)) != 0) { + pr_err("sdcardfs: remount flags 0x%x unsupported\n", *flags); + err = -EINVAL; + } + pr_info("Remount options were %s for vfsmnt %p.\n", options, mnt); + err = parse_options_remount(sb, options, *flags & ~MS_SILENT, mnt->data); + + + return err; +} + +static void *sdcardfs_clone_mnt_data(void *data) +{ + struct sdcardfs_vfsmount_options *opt = kmalloc(sizeof(struct sdcardfs_vfsmount_options), GFP_KERNEL); + struct sdcardfs_vfsmount_options *old = data; + + if (!opt) + return NULL; + opt->gid = old->gid; + opt->mask = old->mask; + return opt; +} + +static void sdcardfs_copy_mnt_data(void *data, void *newdata) +{ + struct sdcardfs_vfsmount_options *old = data; + struct sdcardfs_vfsmount_options *new = newdata; + + old->gid = new->gid; + old->mask = new->mask; +} + /* * Called by iput() when the inode reference count reached zero * and the inode is not hashed anywhere. Used to clear anything @@ -119,6 +183,7 @@ static void sdcardfs_evict_inode(struct inode *inode) struct inode *lower_inode; truncate_inode_pages(&inode->i_data, 0); + set_top(SDCARDFS_I(inode), NULL); clear_inode(inode); /* * Decrement a reference to a lower_inode, which was incremented @@ -132,6 +197,7 @@ static void sdcardfs_evict_inode(struct inode *inode) static struct inode *sdcardfs_alloc_inode(struct super_block *sb) { struct sdcardfs_inode_info *i; + struct sdcardfs_inode_data *d; i = kmem_cache_alloc(sdcardfs_inode_cachep, GFP_KERNEL); if (!i) @@ -140,15 +206,33 @@ static struct inode *sdcardfs_alloc_inode(struct super_block *sb) /* memset everything up to the inode to 0 */ memset(i, 0, offsetof(struct sdcardfs_inode_info, vfs_inode)); + d = kmem_cache_alloc(sdcardfs_inode_data_cachep, + GFP_KERNEL | __GFP_ZERO); + if (!d) { + kmem_cache_free(sdcardfs_inode_cachep, i); + return NULL; + } + + i->data = d; + kref_init(&d->refcount); + i->vfs_inode.i_version = 1; return &i->vfs_inode; } -static void sdcardfs_destroy_inode(struct inode *inode) +static void i_callback(struct rcu_head *head) { + struct inode *inode = container_of(head, struct inode, i_rcu); + + release_own_data(SDCARDFS_I(inode)); kmem_cache_free(sdcardfs_inode_cachep, SDCARDFS_I(inode)); } +static void sdcardfs_destroy_inode(struct inode *inode) +{ + call_rcu(&inode->i_rcu, i_callback); +} + /* sdcardfs inode cache constructor */ static void init_once(void *obj) { @@ -159,22 +243,31 @@ static void init_once(void *obj) int sdcardfs_init_inode_cache(void) { - int err = 0; - sdcardfs_inode_cachep = kmem_cache_create("sdcardfs_inode_cache", sizeof(struct sdcardfs_inode_info), 0, SLAB_RECLAIM_ACCOUNT, init_once); + if (!sdcardfs_inode_cachep) - err = -ENOMEM; - return err; + return -ENOMEM; + + sdcardfs_inode_data_cachep = + kmem_cache_create("sdcardfs_inode_data_cache", + sizeof(struct sdcardfs_inode_data), 0, + SLAB_RECLAIM_ACCOUNT, NULL); + if (!sdcardfs_inode_data_cachep) { + kmem_cache_destroy(sdcardfs_inode_cachep); + return -ENOMEM; + } + + return 0; } /* sdcardfs inode cache destructor */ void sdcardfs_destroy_inode_cache(void) { - if (sdcardfs_inode_cachep) - kmem_cache_destroy(sdcardfs_inode_cachep); + kmem_cache_destroy(sdcardfs_inode_data_cachep); + kmem_cache_destroy(sdcardfs_inode_cachep); } /* @@ -190,19 +283,25 @@ static void sdcardfs_umount_begin(struct super_block *sb) lower_sb->s_op->umount_begin(lower_sb); } -static int sdcardfs_show_options(struct seq_file *m, struct dentry *root) +static int sdcardfs_show_options(struct vfsmount *mnt, struct seq_file *m, + struct dentry *root) { struct sdcardfs_sb_info *sbi = SDCARDFS_SB(root->d_sb); struct sdcardfs_mount_options *opts = &sbi->options; + struct sdcardfs_vfsmount_options *vfsopts = mnt->data; if (opts->fs_low_uid != 0) - seq_printf(m, ",uid=%u", opts->fs_low_uid); + seq_printf(m, ",fsuid=%u", opts->fs_low_uid); if (opts->fs_low_gid != 0) - seq_printf(m, ",gid=%u", opts->fs_low_gid); - + seq_printf(m, ",fsgid=%u", opts->fs_low_gid); + if (vfsopts->gid != 0) + seq_printf(m, ",gid=%u", vfsopts->gid); if (opts->multiuser) - seq_printf(m, ",multiuser"); - + seq_puts(m, ",multiuser"); + if (vfsopts->mask) + seq_printf(m, ",mask=%u", vfsopts->mask); + if (opts->fs_user_id) + seq_printf(m, ",userid=%u", opts->fs_user_id); if (opts->reserved_mb != 0) seq_printf(m, ",reserved=%uMB", opts->reserved_mb); @@ -213,9 +312,12 @@ const struct super_operations sdcardfs_sops = { .put_super = sdcardfs_put_super, .statfs = sdcardfs_statfs, .remount_fs = sdcardfs_remount_fs, + .remount_fs2 = sdcardfs_remount_fs2, + .clone_mnt_data = sdcardfs_clone_mnt_data, + .copy_mnt_data = sdcardfs_copy_mnt_data, .evict_inode = sdcardfs_evict_inode, .umount_begin = sdcardfs_umount_begin, - .show_options = sdcardfs_show_options, + .show_options2 = sdcardfs_show_options, .alloc_inode = sdcardfs_alloc_inode, .destroy_inode = sdcardfs_destroy_inode, .drop_inode = generic_delete_inode, diff --git a/fs/super.c b/fs/super.c index cdf6dec26549a..2693e90ab8762 100644 --- a/fs/super.c +++ b/fs/super.c @@ -682,7 +682,8 @@ struct super_block *user_get_super(dev_t dev) } /** - * do_remount_sb - asks filesystem to change mount options. + * do_remount_sb2 - asks filesystem to change mount options. + * @mnt: mount we are looking at * @sb: superblock in question * @flags: numeric part of options * @data: the rest of options @@ -690,7 +691,7 @@ struct super_block *user_get_super(dev_t dev) * * Alters the mount options of a mounted file system. */ -int do_remount_sb(struct super_block *sb, int flags, void *data, int force) +int do_remount_sb2(struct vfsmount *mnt, struct super_block *sb, int flags, void *data, int force) { int retval; int remount_ro; @@ -732,7 +733,16 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) } } - if (sb->s_op->remount_fs) { + if (mnt && sb->s_op->remount_fs2) { + retval = sb->s_op->remount_fs2(mnt, sb, &flags, data); + if (retval) { + if (!force) + goto cancel_readonly; + /* If forced remount, go ahead despite any errors */ + WARN(1, "forced remount of a %s fs returned %i\n", + sb->s_type->name, retval); + } + } else if (sb->s_op->remount_fs) { retval = sb->s_op->remount_fs(sb, &flags, data); if (retval) { if (!force) @@ -764,6 +774,11 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) return retval; } +int do_remount_sb(struct super_block *sb, int flags, void *data, int force) +{ + return do_remount_sb2(NULL, sb, flags, data, force); +} + static void do_emergency_remount(struct work_struct *work) { struct super_block *sb, *p = NULL; @@ -1086,7 +1101,7 @@ struct dentry *mount_single(struct file_system_type *fs_type, EXPORT_SYMBOL(mount_single); struct dentry * -mount_fs(struct file_system_type *type, int flags, const char *name, void *data) +mount_fs(struct file_system_type *type, int flags, const char *name, struct vfsmount *mnt, void *data) { struct dentry *root; struct super_block *sb; @@ -1103,7 +1118,10 @@ mount_fs(struct file_system_type *type, int flags, const char *name, void *data) goto out_free_secdata; } - root = type->mount(type, flags, name, data); + if (type->mount2) + root = type->mount2(mnt, type, flags, name, data); + else + root = type->mount(type, flags, name, data); if (IS_ERR(root)) { error = PTR_ERR(root); goto out_free_secdata; diff --git a/fs/utimes.c b/fs/utimes.c index aa138d64560a6..dfb457546c604 100644 --- a/fs/utimes.c +++ b/fs/utimes.c @@ -97,14 +97,14 @@ static int utimes_common(struct path *path, struct timespec *times) goto mnt_drop_write_and_out; if (!inode_owner_or_capable(inode)) { - error = inode_permission(inode, MAY_WRITE); + error = inode_permission2(path->mnt, inode, MAY_WRITE); if (error) goto mnt_drop_write_and_out; } } retry_deleg: mutex_lock(&inode->i_mutex); - error = notify_change(path->dentry, &newattrs, &delegated_inode); + error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode); mutex_unlock(&inode->i_mutex); if (delegated_inode) { error = break_deleg_wait(&delegated_inode); diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h index 49766d24aef28..e14f77b7a0aa9 100644 --- a/include/clocksource/arm_arch_timer.h +++ b/include/clocksource/arm_arch_timer.h @@ -16,7 +16,7 @@ #ifndef __CLKSOURCE_ARM_ARCH_TIMER_H #define __CLKSOURCE_ARM_ARCH_TIMER_H -#include +#include #include #define ARCH_TIMER_CTRL_ENABLE (1 << 0) diff --git a/include/dt-bindings/input/input.h b/include/dt-bindings/input/input.h index 042e7b3b62963..885a2688d5fb8 100644 --- a/include/dt-bindings/input/input.h +++ b/include/dt-bindings/input/input.h @@ -269,6 +269,8 @@ #define KEY_MICMUTE 248 /* Mute / unmute the microphone */ +#define KEY_ANTENNA_DET 252 +#define KEY_ANTENNA_DET_UP 253 /* Code 255 is reserved for special needs of AT keyboard driver */ #define BTN_MISC 0x100 diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index d144e99d2399f..2abe24777b460 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -18,8 +18,6 @@ #include #include -/* clocksource cycle base type */ -typedef u64 cycle_t; struct clocksource; struct module; @@ -27,106 +25,6 @@ struct module; #include #endif -/** - * struct cyclecounter - hardware abstraction for a free running counter - * Provides completely state-free accessors to the underlying hardware. - * Depending on which hardware it reads, the cycle counter may wrap - * around quickly. Locking rules (if necessary) have to be defined - * by the implementor and user of specific instances of this API. - * - * @read: returns the current cycle value - * @mask: bitmask for two's complement - * subtraction of non 64 bit counters, - * see CLOCKSOURCE_MASK() helper macro - * @mult: cycle to nanosecond multiplier - * @shift: cycle to nanosecond divisor (power of two) - */ -struct cyclecounter { - cycle_t (*read)(const struct cyclecounter *cc); - cycle_t mask; - u32 mult; - u32 shift; -}; - -/** - * struct timecounter - layer above a %struct cyclecounter which counts nanoseconds - * Contains the state needed by timecounter_read() to detect - * cycle counter wrap around. Initialize with - * timecounter_init(). Also used to convert cycle counts into the - * corresponding nanosecond counts with timecounter_cyc2time(). Users - * of this code are responsible for initializing the underlying - * cycle counter hardware, locking issues and reading the time - * more often than the cycle counter wraps around. The nanosecond - * counter will only wrap around after ~585 years. - * - * @cc: the cycle counter used by this instance - * @cycle_last: most recent cycle counter value seen by - * timecounter_read() - * @nsec: continuously increasing count - */ -struct timecounter { - const struct cyclecounter *cc; - cycle_t cycle_last; - u64 nsec; -}; - -/** - * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds - * @cc: Pointer to cycle counter. - * @cycles: Cycles - * - * XXX - This could use some mult_lxl_ll() asm optimization. Same code - * as in cyc2ns, but with unsigned result. - */ -static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc, - cycle_t cycles) -{ - u64 ret = (u64)cycles; - ret = (ret * cc->mult) >> cc->shift; - return ret; -} - -/** - * timecounter_init - initialize a time counter - * @tc: Pointer to time counter which is to be initialized/reset - * @cc: A cycle counter, ready to be used. - * @start_tstamp: Arbitrary initial time stamp. - * - * After this call the current cycle register (roughly) corresponds to - * the initial time stamp. Every call to timecounter_read() increments - * the time stamp counter by the number of elapsed nanoseconds. - */ -extern void timecounter_init(struct timecounter *tc, - const struct cyclecounter *cc, - u64 start_tstamp); - -/** - * timecounter_read - return nanoseconds elapsed since timecounter_init() - * plus the initial time stamp - * @tc: Pointer to time counter. - * - * In other words, keeps track of time since the same epoch as - * the function which generated the initial time stamp. - */ -extern u64 timecounter_read(struct timecounter *tc); - -/** - * timecounter_cyc2time - convert a cycle counter to same - * time base as values returned by - * timecounter_read() - * @tc: Pointer to time counter. - * @cycle_tstamp: a value returned by tc->cc->read() - * - * Cycle counts that are converted correctly as long as they - * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], - * with "max cycle count" == cs->mask+1. - * - * This allows conversion of cycle counter values which were generated - * in the past. - */ -extern u64 timecounter_cyc2time(struct timecounter *tc, - cycle_t cycle_tstamp); - /** * struct clocksource - hardware abstraction for a free running counter * Provides mostly state-free accessors to the underlying hardware. diff --git a/include/linux/dcache.h b/include/linux/dcache.h index f29c340bf6296..5d567e32d8b69 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -160,8 +160,8 @@ struct dentry_operations { char *(*d_dname)(struct dentry *, char *, int); struct vfsmount *(*d_automount)(struct path *); int (*d_manage)(struct dentry *, bool); + void (*d_canonical_path)(const struct path *, struct path *); struct inode *(*d_select_inode)(struct dentry *, unsigned); - void (*d_canonical_path)(const struct dentry *, struct path *); } ____cacheline_aligned; /* @@ -280,7 +280,7 @@ extern void d_rehash(struct dentry *); * This adds the entry to the hash queues and initializes @inode. * The entry was actually filled in earlier during d_alloc(). */ - + static inline void d_add(struct dentry *entry, struct inode *inode) { d_instantiate(entry, inode); @@ -345,7 +345,7 @@ extern char *dentry_path(struct dentry *, char *, int); * @dentry: dentry to get a reference to * * Given a dentry or %NULL pointer increment the reference count - * if appropriate and return the dentry. A dentry will not be + * if appropriate and return the dentry. A dentry will not be * destroyed when it has references. */ static inline struct dentry *dget_dlock(struct dentry *dentry) @@ -370,7 +370,7 @@ extern struct dentry *dget_parent(struct dentry *dentry); * * Returns true if the dentry passed is not currently hashed. */ - + static inline int d_unhashed(const struct dentry *dentry) { return hlist_bl_unhashed(&dentry->d_hash); diff --git a/include/linux/delay.h b/include/linux/delay.h index a6ecb34cf547d..0e303d1aacd8b 100644 --- a/include/linux/delay.h +++ b/include/linux/delay.h @@ -47,6 +47,11 @@ void msleep(unsigned int msecs); unsigned long msleep_interruptible(unsigned int msecs); void usleep_range(unsigned long min, unsigned long max); +static inline void usleep(unsigned long usecs) +{ + usleep_range(usecs, usecs); +} + static inline void ssleep(unsigned int seconds) { msleep(seconds * 1000); diff --git a/include/linux/fb.h b/include/linux/fb.h index 3cde50f14de03..3770513765fc0 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -503,6 +503,7 @@ struct fb_info { } *apertures; bool skip_vt_switch; /* no VT switch on suspend/resume required */ + int blank; }; static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { diff --git a/include/linux/fs.h b/include/linux/fs.h index 835dabb5a9dfe..a942e614dfaed 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1422,13 +1422,21 @@ extern bool inode_owner_or_capable(const struct inode *inode); * VFS helper functions.. */ extern int vfs_create(struct inode *, struct dentry *, umode_t, bool); +extern int vfs_create2(struct vfsmount *, struct inode *, struct dentry *, umode_t, bool); extern int vfs_mkdir(struct inode *, struct dentry *, umode_t); +extern int vfs_mkdir2(struct vfsmount *, struct inode *, struct dentry *, umode_t); extern int vfs_mknod(struct inode *, struct dentry *, umode_t, dev_t); +extern int vfs_mknod2(struct vfsmount *, struct inode *, struct dentry *, umode_t, dev_t); extern int vfs_symlink(struct inode *, struct dentry *, const char *); +extern int vfs_symlink2(struct vfsmount *, struct inode *, struct dentry *, const char *); extern int vfs_link(struct dentry *, struct inode *, struct dentry *, struct inode **); +extern int vfs_link2(struct vfsmount *, struct dentry *, struct inode *, struct dentry *, struct inode **); extern int vfs_rmdir(struct inode *, struct dentry *); +extern int vfs_rmdir2(struct vfsmount *, struct inode *, struct dentry *); extern int vfs_unlink(struct inode *, struct dentry *, struct inode **); +extern int vfs_unlink2(struct vfsmount *, struct inode *, struct dentry *, struct inode **); extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int); +extern int vfs_rename2(struct vfsmount *, struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int); extern int vfs_whiteout(struct inode *, struct dentry *); /* @@ -1530,6 +1538,7 @@ struct inode_operations { struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int); void * (*follow_link) (struct dentry *, struct nameidata *); int (*permission) (struct inode *, int); + int (*permission2) (struct vfsmount *, struct inode *, int); struct posix_acl * (*get_acl)(struct inode *, int); int (*readlink) (struct dentry *, char __user *,int); @@ -1547,6 +1556,7 @@ struct inode_operations { int (*rename2) (struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); int (*setattr) (struct dentry *, struct iattr *); + int (*setattr2) (struct vfsmount *, struct dentry *, struct iattr *); int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); @@ -1590,9 +1600,13 @@ struct super_operations { int (*unfreeze_fs) (struct super_block *); int (*statfs) (struct dentry *, struct kstatfs *); int (*remount_fs) (struct super_block *, int *, char *); + int (*remount_fs2) (struct vfsmount *, struct super_block *, int *, char *); + void *(*clone_mnt_data) (void *); + void (*copy_mnt_data) (void *, void *); void (*umount_begin) (struct super_block *); int (*show_options)(struct seq_file *, struct dentry *); + int (*show_options2)(struct vfsmount *, struct seq_file *, struct dentry *); int (*show_devname)(struct seq_file *, struct dentry *); int (*show_path)(struct seq_file *, struct dentry *); int (*show_stats)(struct seq_file *, struct dentry *); @@ -1795,7 +1809,7 @@ int sync_inode_metadata(struct inode *inode, int wait); struct file_system_type { const char *name; int fs_flags; -#define FS_REQUIRES_DEV 1 +#define FS_REQUIRES_DEV 1 #define FS_BINARY_MOUNTDATA 2 #define FS_HAS_SUBTYPE 4 #define FS_USERNS_MOUNT 8 /* Can be mounted by userns root */ @@ -1804,6 +1818,9 @@ struct file_system_type { #define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() during rename() internally. */ struct dentry *(*mount) (struct file_system_type *, int, const char *, void *); + struct dentry *(*mount2) (struct vfsmount *, struct file_system_type *, int, + const char *, void *); + void *(*alloc_mnt_data) (void); void (*kill_sb) (struct super_block *); struct module *owner; struct file_system_type * next; @@ -2071,6 +2088,8 @@ struct filename { extern long vfs_truncate(struct path *, loff_t); extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs, struct file *filp); +extern int do_truncate2(struct vfsmount *, struct dentry *, loff_t start, + unsigned int time_attrs, struct file *filp); extern int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len); extern long do_sys_open(int dfd, const char __user *filename, int flags, @@ -2291,8 +2310,11 @@ extern void emergency_remount(void); extern sector_t bmap(struct inode *, sector_t); #endif extern int notify_change(struct dentry *, struct iattr *, struct inode **); +extern int notify_change2(struct vfsmount *, struct dentry *, struct iattr *, struct inode **); extern int inode_permission(struct inode *, int); +extern int inode_permission2(struct vfsmount *, struct inode *, int); extern int __inode_permission(struct inode *, int); +extern int __inode_permission2(struct vfsmount *, struct inode *, int); extern int generic_permission(struct inode *, int); extern int __check_sticky(struct inode *dir, struct inode *inode); diff --git a/include/linux/hardware_info.h b/include/linux/hardware_info.h new file mode 100755 index 0000000000000..4813d4defbada --- /dev/null +++ b/include/linux/hardware_info.h @@ -0,0 +1,54 @@ +#ifndef __HARDWARE_H__ +#define __HARDWARE_H__ + +#define HARDWARE_MAX_ITEM_LONGTH 64 + +enum{ + HARDWARE_LCD = 0, + HARDWARE_TP, + HARDWARE_FLASH, + HARDWARE_FRONT_CAM, + HARDWARE_BACK_CAM, + HARDWARE_BT, + HARDWARE_WIFI, + HARDWARE_ACCELEROMETER, + HARDWARE_ALSPS, + HARDWARE_GYROSCOPE, + HARDWARE_MAGNETOMETER, + HARDWARE_GPS, + HARDWARE_FM, + HARDWARE_BATTERY_ID, + HARDWARE_BACK_CAM_MOUDULE_ID, + HARDWARE_FRONT_CAM_MOUDULE_ID, + HARDWARE_BOARD_ID, + HARDWARE_MAX_ITEM +}; + + +#define HARDWARE_ID 'H' +#define HARDWARE_LCD_GET _IOWR(HARDWARE_ID, 0x01, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_TP_GET _IOWR(HARDWARE_ID, 0x02, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_FLASH_GET _IOWR(HARDWARE_ID, 0x03, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_FRONT_CAM_GET _IOWR(HARDWARE_ID, 0x04, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BACK_CAM_GET _IOWR(HARDWARE_ID, 0x05, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_ACCELEROMETER_GET _IOWR(HARDWARE_ID, 0x06, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_ALSPS_GET _IOWR(HARDWARE_ID, 0x07, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_GYROSCOPE_GET _IOWR(HARDWARE_ID, 0x08, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_MAGNETOMETER_GET _IOWR(HARDWARE_ID, 0x09, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BT_GET _IOWR(HARDWARE_ID, 0x10, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_WIFI_GET _IOWR(HARDWARE_ID, 0x11, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_GPS_GET _IOWR(HARDWARE_ID, 0x12, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_FM_GET _IOWR(HARDWARE_ID, 0x13, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BATTERY_ID_GET _IOWR(HARDWARE_ID, 0x15, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BACK_CAM_MOUDULE_ID_GET _IOWR(HARDWARE_ID, 0x16, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_FRONT_CAM_MODULE_ID_GET _IOWR(HARDWARE_ID, 0x17, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BOARD_ID_GET _IOWR(HARDWARE_ID, 0x18, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BACK_CAM_MOUDULE_ID_SET _IOWR(HARDWARE_ID, 0x81, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_FRONT_CAM_MODULE_ID_SET _IOWR(HARDWARE_ID, 0x82, char[HARDWARE_MAX_ITEM_LONGTH]) + + + + +int hardwareinfo_set_prop(int cmd, const char *name); +void hardwareinfo_tp_register(void (*fn)(void *), void *driver_data); +#endif diff --git a/include/linux/input/ft5346.h b/include/linux/input/ft5346.h new file mode 100644 index 0000000000000..d9f223c0dbf51 --- /dev/null +++ b/include/linux/input/ft5346.h @@ -0,0 +1,348 @@ +/* + * + * FocalTech ft5x06 TouchScreen driver header file. + * + * Copyright (c) 2010 Focal tech Ltd. + * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#ifndef __LINUX_FT5X06_TS_H__ +#define __LINUX_FT5X06_TS_H__ + +#define FT5X06_ID 0x55 +#define FT5X16_ID 0x0A +#define FT5X36_ID 0x14 +#define FT6X06_ID 0x06 +#define FT6X36_ID 0x36 + +#define FT_DRIVER_VERSION 0x02 + +#define FT_META_REGS 3 +#define FT_ONE_TCH_LEN 6 +#define FT_TCH_LEN(x) (FT_META_REGS + FT_ONE_TCH_LEN * x) + +#define FT_PRESS 0x7F +#define FT_MAX_ID 0x0F +#define FT_TOUCH_X_H_POS 3 +#define FT_TOUCH_X_L_POS 4 +#define FT_TOUCH_Y_H_POS 5 +#define FT_TOUCH_Y_L_POS 6 +#define FT_TD_STATUS 2 +#define FT_TOUCH_EVENT_POS 3 +#define FT_TOUCH_ID_POS 5 +#define FT_TOUCH_DOWN 0 +#define FT_TOUCH_CONTACT 2 +#define FT_LOCKDOWN_SIZE 8 + + +/*register address*/ +#define FT_REG_DEV_MODE 0x00 +#define FT_DEV_MODE_REG_CAL 0x02 +#define FT_REG_ID 0xA3 +#define FT_REG_PMODE 0xA5 +#define FT_REG_FW_VER 0xA6 +#define FT_REG_FW_VENDOR_ID 0xA8 +#define FT_REG_POINT_RATE 0x88 +#define FT_REG_THGROUP 0x80 +#define FT_REG_ECC 0xCC +#define FT_REG_RESET_FW 0x07 +#define FT_REG_FW_MIN_VER 0xB2 +#define FT_REG_FW_SUB_MIN_VER 0xB3 + +/*Firmware vendors*/ +#define VENDOR_O_FILM 0x51 +#define VENDOR_Lens 0x3B +#define VENDOR_DS 0x53 + +/*IC name*/ + +#define TP_IC_FT5X06 0x55 +#define TP_IC_FT5606 0x08 +#define TP_IC_FT5X16 0x0A +#define TP_IC_FT6208 0x05 +#define TP_IC_FT6X06 0x06 +#define TP_IC_FT6X36 0x36 +#define TP_IC_FT5336 0x14 +#define TP_IC_FT3316 0x13 +#define TP_IC_FT5436i 0x12 +#define TP_IC_FT5336i 0x11 +#define TP_IC_FT5346 0x54 + + +/*TP Color*/ +#define TP_White 0x31 +#define TP_Black 0x32 +#define TP_Golden 0x38 + +/*TP Maker*/ +#define TP_OUFEI 0x34 +#define TP_LENS 0x32 +#define TP_DS 0x45 + +/*LCD Maker*/ +#define TP_TIANMA 0x36 + +#define TP_EBBG 0x37 + +/*PROJECT Id*/ +#define PROJECT_C3B 0x0c +#define PROJECT_C3N 0xc3 + +/* power register bits*/ +#define FT_PMODE_ACTIVE 0x00 +#define FT_PMODE_MONITOR 0x01 +#define FT_PMODE_STANDBY 0x02 +#define FT_PMODE_HIBERNATE 0x03 +#define FT_FACTORYMODE_VALUE 0x40 +#define FT_WORKMODE_VALUE 0x00 +#define FT_RST_CMD_REG1 0xFC +#define FT_RST_CMD_REG2 0xBC +#define FT_READ_ID_REG 0x90 +#define FT_ERASE_APP_REG 0x61 +#define FT_ERASE_PANEL_REG 0x63 +#define FT_FW_START_REG 0xBF + +#define FT_STATUS_NUM_TP_MASK 0x0F + +#define FT_VTG_MIN_UV 2600000 +#define FT_VTG_MAX_UV 3300000 +#define FT_I2C_VTG_MIN_UV 1800000 +#define FT_I2C_VTG_MAX_UV 1800000 + +#define FT_COORDS_ARR_SIZE 4 +#define MAX_BUTTONS 4 + +#define FT_8BIT_SHIFT 8 +#define FT_4BIT_SHIFT 4 +#define FT_FW_NAME_MAX_LEN 50 + +#define FT5316_ID 0x0A +#define FT5306I_ID 0x55 +#define FT6X06_ID 0x06 +#define FT6X36_ID 0x36 + +#define FT_UPGRADE_AA 0xAA +#define FT_UPGRADE_55 0x55 + +#define FT_FW_MIN_SIZE 8 +#define FT_FW_MAX_SIZE 32768 + +#define FT5x0x_REG_FW_VER 0xA6 + + +/* Firmware file is not supporting minor and sub minor so use 0 */ +#define FT_FW_FILE_MAJ_VER(x) ((x)->data[(x)->size - 2]) +#define FT_FW_FILE_MIN_VER(x) 0 +#define FT_FW_FILE_SUB_MIN_VER(x) 0 +#define FT_FW_FILE_VENDOR_ID(x) ((x)->data[(x)->size - 1]) + +#define FT_FW_FILE_MAJ_VER_FT6X36(x) ((x)->data[0x10a]) +#define FT_FW_FILE_VENDOR_ID_FT6X36(x) ((x)->data[0x108]) + +/** +* Application data verification will be run before upgrade flow. +* Firmware image stores some flags with negative and positive value +* in corresponding addresses, we need pick them out do some check to +* make sure the application data is valid. +*/ +#define FT_FW_CHECK(x, ts_data) \ + (ts_data->family_id == FT6X36_ID ? \ + (((x)->data[0x104] ^ (x)->data[0x105]) == 0xFF \ + && ((x)->data[0x106] ^ (x)->data[0x107]) == 0xFF) : \ + (((x)->data[(x)->size - 8] ^ (x)->data[(x)->size - 6]) == 0xFF \ + && ((x)->data[(x)->size - 7] ^ (x)->data[(x)->size - 5]) == 0xFF \ + && ((x)->data[(x)->size - 3] ^ (x)->data[(x)->size - 4]) == 0xFF)) + +#define FT_MAX_TRIES 5 +#define FT_RETRY_DLY 20 + +#define FT_MAX_WR_BUF 10 +#define FT_MAX_RD_BUF 2 +#define FT_FW_PKT_LEN 128 +#define FT_FW_PKT_META_LEN 6 +#define FT_FW_PKT_DLY_MS 20 +#define FT_FW_LAST_PKT 0x6ffa +#define FT_EARSE_DLY_MS 100 +#define FT_55_AA_DLY_NS 5000 + +#define FT_UPGRADE_LOOP 30 +#define FT_CAL_START 0x04 +#define FT_CAL_FIN 0x00 +#define FT_CAL_STORE 0x05 +#define FT_CAL_RETRY 100 +#define FT_REG_CAL 0x00 +#define FT_CAL_MASK 0x7C + +#define FT_INFO_MAX_LEN 512 +#define FTS_PACKET_LENGTH 128 + + +#define FT_BLOADER_SIZE_OFF 12 +#define FT_BLOADER_NEW_SIZE 30 +#define FT_DATA_LEN_OFF_OLD_FW 8 +#define FT_DATA_LEN_OFF_NEW_FW 14 +#define FT_FINISHING_PKT_LEN_OLD_FW 6 +#define FT_FINISHING_PKT_LEN_NEW_FW 12 +#define FT_MAGIC_BLOADER_Z7 0x7bfa +#define FT_MAGIC_BLOADER_LZ4 0x6ffa +#define FT_MAGIC_BLOADER_GZF_30 0x7ff4 +#define FT_MAGIC_BLOADER_GZF 0x7bf4 + +enum { + FT_BLOADER_VERSION_LZ4 = 0, + FT_BLOADER_VERSION_Z7 = 1, + FT_BLOADER_VERSION_GZF = 2, +}; + +enum { + FT_FT5336_FAMILY_ID_0x11 = 0x11, + FT_FT5336_FAMILY_ID_0x12 = 0x12, + FT_FT5336_FAMILY_ID_0x13 = 0x13, + FT_FT5336_FAMILY_ID_0x14 = 0x14, +}; + +struct fw_upgrade_info { + bool auto_cal; + u16 delay_aa; + u16 delay_55; + u8 upgrade_id_1; + u8 upgrade_id_2; + u16 delay_readid; + u16 delay_erase_flash; +}; + +struct Upgrade_Info { + u8 CHIP_ID; + u8 FTS_NAME[20]; + u8 TPD_MAX_POINTS; + u8 AUTO_CLB; + u16 delay_aa; /*delay of write FT_UPGRADE_AA */ + u16 delay_55; /*delay of write FT_UPGRADE_55 */ + u8 upgrade_id_1; /*upgrade id 1 */ + u8 upgrade_id_2; /*upgrade id 2 */ + u16 delay_readid; /*delay of read id */ + u16 delay_earse_flash; /*delay of earse flash*/ +}; + + +struct ft5x06_ts_platform_data { + struct fw_upgrade_info info; + const char *name; + const char *fw_name; + u32 irqflags; + u32 irq_gpio; + u32 irq_gpio_flags; + u32 reset_gpio; + u32 reset_gpio_flags; + u32 family_id; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; + u32 panel_minx; + u32 panel_miny; + u32 panel_maxx; + u32 panel_maxy; + u32 group_id; + u32 hard_rst_dly; + u32 soft_rst_dly; + u32 num_max_touches; + bool fw_vkey_support; + bool no_force_update; + bool i2c_pull_up; + bool ignore_id_check; + int (*power_init) (bool); + int (*power_on) (bool); +}; + +struct ft5x06_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + const struct ft5x06_ts_platform_data *pdata; + struct regulator *vdd; + struct regulator *vcc_i2c; + char fw_name[FT_FW_NAME_MAX_LEN]; + u8 lockdown_info[FT_LOCKDOWN_SIZE]; + bool loading_fw; + u8 family_id; + struct dentry *dir; + u16 addr; + bool suspended; + char *ts_info; + u8 *tch_data; + u32 tch_data_len; + u8 fw_ver[3]; + u8 fw_vendor_id; +#if defined(CONFIG_FB) + struct notifier_block fb_notif; + struct work_struct fb_notify_work; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + struct pinctrl *ts_pinctrl; + struct pinctrl_state *gpio_state_active; + struct pinctrl_state *gpio_state_suspend; +}; + + + +#define CTP_IC_TYPE_0 0x12 +#define CTP_IC_TYPE_1 0x14 +#define CTP_IC_TYPE_2 0x54 + +#define CTP_SYS_APK_UPDATE 0 + +#define TPD_AUTO_UPGRADE 1 +#define FTS_PROC_APK_DEBUG 1 + +#define CTP_CHARGER_DETECT 1 + +#define CTP_PROC_INTERFACE 1 + + + +#if CTP_PROC_INTERFACE +extern int fts_open_short_test(char *ini_file_name, char *bufdest, ssize_t *pinumread); +#endif +#define WT_ADD_CTP_INFO 1 +#define WT_CTP_GESTURE_SUPPORT 1 +#define KEYCODE_WAKEUP 143 +#define MXT_INPUT_EVENT_START 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define MXT_INPUT_EVENT_STYLUS_MODE_OFF 2 +#define MXT_INPUT_EVENT_STYLUS_MODE_ON 3 +#define MXT_INPUT_EVENT_WAKUP_MODE_OFF 4 +#define MXT_INPUT_EVENT_WAKUP_MODE_ON 5 +#define MXT_INPUT_EVENT_EDGE_DISABLE 6 +#define MXT_INPUT_EVENT_EDGE_FINGER 7 +#define MXT_INPUT_EVENT_EDGE_HANDGRIP 8 +#define MXT_INPUT_EVENT_EDGE_FINGER_HANDGRIP 9 +#define MXT_INPUT_EVENT_END 9 +#define CTP_DEBUG_ON 0 +#define CTP_DEBUG_FUNC_ON 1 +#define CTP_INFO(fmt, arg...) printk("FT5X06-TP-TAG INFO:"fmt"\n", ##arg) + +#define CTP_ERROR(fmt, arg...) printk("FT5X06-TP-TAG ERROR:"fmt"\n", ##arg) + +#define CTP_DEBUG(fmt, arg...) do {\ + if (CTP_DEBUG_ON)\ + printk("FT5X06-TP-TAG DEBUG:[%d]"fmt"\n", __LINE__, ##arg);\ + } while (0) +#define CTP_DEBUG_FUNC() do {\ + if (CTP_DEBUG_FUNC_ON)\ + printk("FT5X06-TP-TAG Func:%s@Line:%d\n", __func__, __LINE__);\ + } while (0) + + +#endif diff --git a/include/linux/input/ft5x06_720p.h b/include/linux/input/ft5x06_720p.h new file mode 100644 index 0000000000000..7e9db84de7f53 --- /dev/null +++ b/include/linux/input/ft5x06_720p.h @@ -0,0 +1,334 @@ +/* + * + * FocalTech ft5x06 TouchScreen driver header file. + * + * Copyright (c) 2010 Focal tech Ltd. + * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#ifndef __LINUX_FT5X06_TS_H__ +#define __LINUX_FT5X06_TS_H__ + +#define FT5X06_ID 0x55 +#define FT5X16_ID 0x0A +#define FT5X36_ID 0x14 +#define FT6X06_ID 0x06 +#define FT6X36_ID 0x36 + +#define FT_DRIVER_VERSION 0x02 + +#define FT_META_REGS 3 +#define FT_ONE_TCH_LEN 6 +#define FT_TCH_LEN(x) (FT_META_REGS + FT_ONE_TCH_LEN * x) + +#define FT_PRESS 0x7F +#define FT_MAX_ID 0x0F +#define FT_TOUCH_X_H_POS 3 +#define FT_TOUCH_X_L_POS 4 +#define FT_TOUCH_Y_H_POS 5 +#define FT_TOUCH_Y_L_POS 6 +#define FT_TD_STATUS 2 +#define FT_TOUCH_EVENT_POS 3 +#define FT_TOUCH_ID_POS 5 +#define FT_TOUCH_DOWN 0 +#define FT_TOUCH_CONTACT 2 +#define FT_LOCKDOWN_SIZE 8 + + +/*register address*/ +#define FT_REG_DEV_MODE 0x00 +#define FT_DEV_MODE_REG_CAL 0x02 +#define FT_REG_ID 0xA3 +#define FT_REG_PMODE 0xA5 +#define FT_REG_FW_VER 0xA6 +#define FT_REG_FW_VENDOR_ID 0xA8 +#define FT_REG_POINT_RATE 0x88 +#define FT_REG_THGROUP 0x80 +#define FT_REG_ECC 0xCC +#define FT_REG_RESET_FW 0x07 +#define FT_REG_FW_MIN_VER 0xB2 +#define FT_REG_FW_SUB_MIN_VER 0xB3 + +/*Firmware vendors*/ +#define VENDOR_O_FILM 0x51 +#define VENDOR_MUTTO 0x53 +#define VENDOR_BIEL_1080P 0x3B +#define VENDOR_TPK_1080P 0x5C +#define VENDOR_BIEL_720P 0xF1 +#define VENDOR_TPK_720P 0xF2 +#define VENDOR_OUFEI_720P 0xF3 +#define VENDOR_LENS_720P 0xF4 + + +#define VENDOR_WINTEK 0x89 +#define VENDOR_GIS 0x8F + + +/*IC name*/ +#define IC_FT5X06 0x55 +#define IC_FT5606 0x08 +#define IC_FT5X16 0x0A +#define IC_FT6208 0x05 +#define IC_FT6X06 0x06 +#define IC_FT6X36 0x36 +#define IC_FT5336 0x14 +#define IC_FT3316 0x13 +#define IC_FT5436i 0x12 +#define IC_FT5336i 0x11 + +/*TP Color*/ +#define TP_White 0x31 +#define TP_Black 0x32 +#define TP_Golden 0x38 + +/*TP Maker*/ +#define TP_OUFEI 0x34 +#define TP_LENS 0x32 +#define TP_Biel 0x31 + +/*LCD Maker*/ +#define LCD_TIANMA 0x36 +#define LCD_EBBG 0x37 +#define LCD_BOE 0x35 + +/* power register bits*/ +#define FT_PMODE_ACTIVE 0x00 +#define FT_PMODE_MONITOR 0x01 +#define FT_PMODE_STANDBY 0x02 +#define FT_PMODE_HIBERNATE 0x03 +#define FT_FACTORYMODE_VALUE 0x40 +#define FT_WORKMODE_VALUE 0x00 +#define FT_RST_CMD_REG1 0xFC +#define FT_RST_CMD_REG2 0xBC +#define FT_READ_ID_REG 0x90 +#define FT_ERASE_APP_REG 0x61 +#define FT_ERASE_PANEL_REG 0x63 +#define FT_FW_START_REG 0xBF + +#define FT_STATUS_NUM_TP_MASK 0x0F + +#define FT_VTG_MIN_UV 2600000 +#define FT_VTG_MAX_UV 3300000 +#define FT_I2C_VTG_MIN_UV 1800000 +#define FT_I2C_VTG_MAX_UV 1800000 + +#define FT_COORDS_ARR_SIZE 4 +#define MAX_BUTTONS 4 + +#define FT_8BIT_SHIFT 8 +#define FT_4BIT_SHIFT 4 +#define FT_FW_NAME_MAX_LEN 50 + +#define FT5316_ID 0x0A +#define FT5306I_ID 0x55 +#define FT6X06_ID 0x06 +#define FT6X36_ID 0x36 + +#define FT_UPGRADE_AA 0xAA +#define FT_UPGRADE_55 0x55 + +#define FT_FW_MIN_SIZE 8 +#define FT_FW_MAX_SIZE 32768 + +#define FT5x0x_REG_FW_VER 0xA6 + + +/* Firmware file is not supporting minor and sub minor so use 0 */ +#define FT_FW_FILE_MAJ_VER(x) ((x)->data[(x)->size - 2]) +#define FT_FW_FILE_MIN_VER(x) 0 +#define FT_FW_FILE_SUB_MIN_VER(x) 0 +#define FT_FW_FILE_VENDOR_ID(x) ((x)->data[(x)->size - 1]) + +#define FT_FW_FILE_MAJ_VER_FT6X36(x) ((x)->data[0x10a]) +#define FT_FW_FILE_VENDOR_ID_FT6X36(x) ((x)->data[0x108]) + +/** +* Application data verification will be run before upgrade flow. +* Firmware image stores some flags with negative and positive value +* in corresponding addresses, we need pick them out do some check to +* make sure the application data is valid. +*/ +#define FT_FW_CHECK(x, ts_data) \ + (ts_data->family_id == FT6X36_ID ? \ + (((x)->data[0x104] ^ (x)->data[0x105]) == 0xFF \ + && ((x)->data[0x106] ^ (x)->data[0x107]) == 0xFF) : \ + (((x)->data[(x)->size - 8] ^ (x)->data[(x)->size - 6]) == 0xFF \ + && ((x)->data[(x)->size - 7] ^ (x)->data[(x)->size - 5]) == 0xFF \ + && ((x)->data[(x)->size - 3] ^ (x)->data[(x)->size - 4]) == 0xFF)) + +#define FT_MAX_TRIES 5 +#define FT_RETRY_DLY 20 + +#define FT_MAX_WR_BUF 10 +#define FT_MAX_RD_BUF 2 +#define FT_FW_PKT_LEN 128 +#define FT_FW_PKT_META_LEN 6 +#define FT_FW_PKT_DLY_MS 20 +#define FT_FW_LAST_PKT 0x6ffa +#define FT_EARSE_DLY_MS 100 +#define FT_55_AA_DLY_NS 5000 + +#define FT_UPGRADE_LOOP 30 +#define FT_CAL_START 0x04 +#define FT_CAL_FIN 0x00 +#define FT_CAL_STORE 0x05 +#define FT_CAL_RETRY 100 +#define FT_REG_CAL 0x00 +#define FT_CAL_MASK 0x7C + +#define FT_INFO_MAX_LEN 512 +#define FTS_PACKET_LENGTH 128 + + +#define FT_BLOADER_SIZE_OFF 12 +#define FT_BLOADER_NEW_SIZE 30 +#define FT_DATA_LEN_OFF_OLD_FW 8 +#define FT_DATA_LEN_OFF_NEW_FW 14 +#define FT_FINISHING_PKT_LEN_OLD_FW 6 +#define FT_FINISHING_PKT_LEN_NEW_FW 12 +#define FT_MAGIC_BLOADER_Z7 0x7bfa +#define FT_MAGIC_BLOADER_LZ4 0x6ffa +#define FT_MAGIC_BLOADER_GZF_30 0x7ff4 +#define FT_MAGIC_BLOADER_GZF 0x7bf4 + +enum { + FT_BLOADER_VERSION_LZ4 = 0, + FT_BLOADER_VERSION_Z7 = 1, + FT_BLOADER_VERSION_GZF = 2, +}; + +enum { + FT_FT5336_FAMILY_ID_0x11 = 0x11, + FT_FT5336_FAMILY_ID_0x12 = 0x12, + FT_FT5336_FAMILY_ID_0x13 = 0x13, + FT_FT5336_FAMILY_ID_0x14 = 0x14, +}; + +struct fw_upgrade_info { + bool auto_cal; + u16 delay_aa; + u16 delay_55; + u8 upgrade_id_1; + u8 upgrade_id_2; + u16 delay_readid; + u16 delay_erase_flash; +}; + +struct Upgrade_Info { + u8 CHIP_ID; + u8 FTS_NAME[20]; + u8 TPD_MAX_POINTS; + u8 AUTO_CLB; + u16 delay_aa; /*delay of write FT_UPGRADE_AA */ + u16 delay_55; /*delay of write FT_UPGRADE_55 */ + u8 upgrade_id_1; /*upgrade id 1 */ + u8 upgrade_id_2; /*upgrade id 2 */ + u16 delay_readid; /*delay of read id */ + u16 delay_earse_flash; /*delay of earse flash*/ +}; + + +struct ft5x06_ts_platform_data { + struct fw_upgrade_info info; + const char *name; + const char *fw_name; + u32 irqflags; + u32 irq_gpio; + u32 irq_gpio_flags; + u32 reset_gpio; + u32 reset_gpio_flags; + u32 family_id; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; + u32 panel_minx; + u32 panel_miny; + u32 panel_maxx; + u32 panel_maxy; + u32 group_id; + u32 hard_rst_dly; + u32 soft_rst_dly; + u32 num_max_touches; + bool fw_vkey_support; + bool no_force_update; + bool i2c_pull_up; + bool ignore_id_check; + int (*power_init) (bool); + int (*power_on) (bool); +}; + +struct ft5x06_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + const struct ft5x06_ts_platform_data *pdata; + struct regulator *vdd; + struct regulator *vcc_i2c; + char fw_name[FT_FW_NAME_MAX_LEN]; + u8 lockdown_info[FT_LOCKDOWN_SIZE]; + bool loading_fw; + u8 family_id; + struct dentry *dir; + u16 addr; + bool suspended; + char *ts_info; + u8 *tch_data; + u32 tch_data_len; + u8 fw_ver[3]; + u8 fw_vendor_id; +#if defined(CONFIG_FB) + struct notifier_block fb_notif; + struct work_struct fb_notify_work; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + struct pinctrl *ts_pinctrl; + struct pinctrl_state *gpio_state_active; + struct pinctrl_state *gpio_state_suspend; +}; + + + +#define CTP_IC_TYPE_0 0x12 +#define CTP_IC_TYPE_1 0x14 + +#define CTP_SYS_APK_UPDATE 0 + +#define TPD_AUTO_UPGRADE 1 +#define FTS_PROC_APK_DEBUG 1 + +#define CTP_CHARGER_DETECT 1 + +#define CTP_PROC_INTERFACE 1 +#define CTP_LOCKDOWN_INFO 1 + + +#define WT_ADD_CTP_INFO 1 + +#define CTP_DEBUG_ON 1 +#define CTP_DEBUG_FUNC_ON 0 +#define CTP_INFO(fmt, arg...) printk("FT5X06-TP-TAG INFO:"fmt"\n", ##arg) + +#define CTP_ERROR(fmt, arg...) printk("FT5X06-TP-TAG ERROR:"fmt"\n", ##arg) + +#define CTP_DEBUG(fmt, arg...) do {\ + if (CTP_DEBUG_ON)\ + printk("FT5X06-TP-TAG DEBUG:[%d]"fmt"\n", __LINE__, ##arg);\ + } while (0) +#define CTP_DEBUG_FUNC() do {\ + if (CTP_DEBUG_FUNC_ON)\ + printk("FT5X06-TP-TAG Func:%s@Line:%d\n", __func__, __LINE__);\ + } while (0) + + +#endif diff --git a/include/linux/input/gen_vkeys_gt.h b/include/linux/input/gen_vkeys_gt.h new file mode 100644 index 0000000000000..a58158d703bda --- /dev/null +++ b/include/linux/input/gen_vkeys_gt.h @@ -0,0 +1,24 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __GEN_VKEYS_ +struct vkeys_platform_data { + const char *name; + int disp_maxx; + int disp_maxy; + int panel_maxx; + int panel_maxy; + int *keycodes; + int num_keys; + int y_offset; +}; +#endif diff --git a/include/linux/ktrace.h b/include/linux/ktrace.h new file mode 100644 index 0000000000000..b125b5b072c1f --- /dev/null +++ b/include/linux/ktrace.h @@ -0,0 +1,287 @@ +#ifndef __KTRACE_H__ +#define __KTRACE_H__ + +#include +#include + +#define US_TO_NS(usec) ((usec) * 1000) +#define MS_TO_US(msec) ((msec) * 1000) + +#define QUEUE_NEXT(v, max) (((v) + 1) % (max)) +#define QUEUE_ADD(v, a, max) (((v) + (a)) % (max)) +#define QUEUE_EMPTY(tail, head) ((tail) == (head)) +#define QUEUE_FULL(tail, head, max) ((((head) + 1) % (max)) == tail) + +#define DEFAULT_ITEMS_PER_READ INT_MAX + +enum { + KTRACE_MM_TYPE_SAMPLE1 = 0, + KTRACE_MM_TYPE_SAMPLE2, + KTRACE_MM_TYPE_SAMPLE3, + KTRACE_MM_TYPE_SAMPLE4, + KTRACE_MM_TYPE_SAMPLE5, + KTRACE_MM_TYPE_SAMPLE6, + KTRACE_MM_TYPE_SAMPLE7, + KTRACE_MM_TYPE_SAMPLE8, + KTRACE_MM_TYPE_SAMPLE9, + KTRACE_MM_TYPE_SAMPLE10, + + KTRACE_MM_TYPE_SLOW_PATH, + KTRACE_MM_TYPE_COMPACT, + KTRACE_MM_TYPE_DIRECT_RECLAIM, + KTRACE_MM_TYPE_NR, +}; + +enum { + KTRACE_SCHED_TYPE_SAMPLE1 = 0, + KTRACE_SCHED_TYPE_SAMPLE2, + KTRACE_SCHED_TYPE_SAMPLE3, + KTRACE_SCHED_TYPE_SAMPLE4, + KTRACE_SCHED_TYPE_SAMPLE5, + KTRACE_SCHED_TYPE_SAMPLE6, + KTRACE_SCHED_TYPE_SAMPLE7, + KTRACE_SCHED_TYPE_SAMPLE8, + KTRACE_SCHED_TYPE_SAMPLE9, + KTRACE_SCHED_TYPE_SAMPLE10, + + KTRACE_SCHED_TYPE_PREEMPT, + KTRACE_SCHED_TYPE_WAIT, + KTRACE_SCHED_TYPE_BLOCK, + KTRACE_SCHED_TYPE_NR, +}; + +enum { + KTRACE_BINDER_TYPE_SAMPLE1 = 0, + KTRACE_BINDER_TYPE_SAMPLE2, + KTRACE_BINDER_TYPE_SAMPLE3, + KTRACE_BINDER_TYPE_SAMPLE4, + KTRACE_BINDER_TYPE_SAMPLE5, + KTRACE_BINDER_TYPE_SAMPLE6, + KTRACE_BINDER_TYPE_SAMPLE7, + KTRACE_BINDER_TYPE_SAMPLE8, + KTRACE_BINDER_TYPE_SAMPLE9, + KTRACE_BINDER_TYPE_SAMPLE10, + + KTRACE_BINDER_TYPE_TRANSACTION, + KTRACE_BINDER_TYPE_NR, +}; + +enum { + KTRACE_CPUFREQ_TYPE_SAMPLE1 = 0, + KTRACE_CPUFREQ_TYPE_SAMPLE2, + KTRACE_CPUFREQ_TYPE_SAMPLE3, + KTRACE_CPUFREQ_TYPE_SAMPLE4, + KTRACE_CPUFREQ_TYPE_SAMPLE5, + KTRACE_CPUFREQ_TYPE_SAMPLE6, + KTRACE_CPUFREQ_TYPE_SAMPLE7, + KTRACE_CPUFREQ_TYPE_SAMPLE8, + KTRACE_CPUFREQ_TYPE_SAMPLE9, + KTRACE_CPUFREQ_TYPE_SAMPLE10, + + KTRACE_CPUFREQ_TYPE_MITIGATION, + KTRACE_CPUFREQ_TYPE_UNPLUGED, + KTRACE_CPUFREQ_TYPE_NR, +}; + +enum { + QUEUE_MM = 0, + QUEUE_STR, + QUEUE_SCHED, + QUEUE_BINDER, + QUEUE_CPUFREQ, + QUEUE_NR +}; + +enum { + KTRACE_EVENT_1 = 0, + KTRACE_EVENT_2, + KTRACE_EVENT_3, + KTRACE_EVENT_4, + KTRACE_EVENT_5, + KTRACE_EVENT_6, + KTRACE_EVENT_7, + KTRACE_EVENT_8, + KTRACE_EVENT_9, + KTRACE_EVENT_10, + + KTRACE_EVENT_11, + KTRACE_EVENT_12, + KTRACE_EVENT_13, + KTRACE_EVENT_14, + KTRACE_EVENT_15, + KTRACE_EVENT_16, + KTRACE_EVENT_17, + KTRACE_EVENT_18, + KTRACE_EVENT_19, + KTRACE_EVENT_20, + + KTRACE_EVENT_NR +}; + +struct ktrace_queue { + spinlock_t lock; + + void *buf; + int entry_size; + int max; + int head; + int tail; + + int read_cnt; + int items_per_read; + + int enable_debug; + + int (*show_entry)(struct seq_file *m, void *entry, bool debug); + + void *priv; +}; + +struct ktrace { + struct dentry *dir; + + struct ktrace_queue queue[QUEUE_NR]; + + /* str ktrace */ + spinlock_t str_lock; + int str_queue_head; + int str_queue_tail; + int str_queue_max; + char *str_buf; + + int str_enable_debug; +}; + +/* use single_open() */ +#define KTRACE_ENTRY_RO_SINGLE(name) \ +static int name##_open(struct inode *inode, struct file *file) \ +{ \ + return single_open(file, name##_show, inode->i_private); \ +} \ +\ +static const struct file_operations name##_fops = { \ + .owner = THIS_MODULE, \ + .open = name##_open, \ + .read = seq_read, \ + .llseek = no_llseek, \ + .release = single_release, \ +}; + +/* use single_open() */ +#define KTRACE_QUEUE_RO_SINGLE(name) \ +static int name##_open(struct inode *inode, struct file *file) \ +{ \ + return single_open(file, ktrace_q_single_show, inode->i_private); \ +} \ +\ +static const struct file_operations name##_fops = { \ + .owner = THIS_MODULE, \ + .open = name##_open, \ + .read = seq_read, \ + .llseek = no_llseek, \ + .release = single_release, \ +}; + + +/* use seq_open() */ +#define KTRACE_QUEUE_RO(name) \ +\ +static const struct seq_operations name##_seq_ops = { \ + .start = ktrace_q_start, \ + .stop = ktrace_q_stop, \ + .next = ktrace_q_next, \ + .show = ktrace_q_show, \ +}; \ +static int name##_open(struct inode *inode, struct file *file) \ +{ \ + int ret; \ +\ + ret = seq_open(file, &name##_seq_ops); \ + if (!ret) { \ + struct seq_file *m = file->private_data; \ + m->private = inode->i_private; \ + } \ + return ret; \ +} \ +\ +static const struct file_operations name##_fops = { \ + .owner = THIS_MODULE, \ + .open = name##_open, \ + .read = seq_read, \ + .llseek = no_llseek, \ + .release = seq_release, \ +}; + +/* + * sed -i 's/^\([^\[]*\[[0-9]\{3\}\] [^\s]\{4\} \s*[0-9]\+\.[0-9]\+:\) \([^:]*:\) \(tracing_mark_write: .*\)/\1 \3/g' .html + */ +#define KTRACE_BEGIN(name) trace_printk("tracing_mark_write: B|%d|%s\n", current->tgid, name) +#define KTRACE_END() trace_printk("tracing_mark_write: E\n") +#define KTRACE_FUNC() KTRACE_BEGIN(__func__) +#define KTRACE_INT(name, value) trace_printk("tracing_mark_write: C|%d|%s|%d\n", current->tgid, name, (int)(value)) +#define KTRACE_BEGIN_MSG(fmt...) \ + do { \ + char buf[64]; \ + snprintf(buf, sizeof(buf) - 1, fmt); \ + KTRACE_BEGIN(buf); \ + } while (0); + +#ifdef CONFIG_KTRACE + +struct ktrace *get_ktrace(void); +int __init ktrace_mm_init(struct dentry *dir, struct ktrace_queue *q); +int __init ktrace_print_init(struct dentry *dir, struct ktrace_queue *q); +int __init ktrace_sched_init(struct dentry *dir, struct ktrace_queue *q); +int __init ktrace_binder_init(struct dentry *dir, struct ktrace_queue *q); +int __init ktrace_cpufreq_init(struct dentry *dir, struct ktrace_queue *q); +int __init ktrace_event_init(struct dentry *dir); + +void ktrace_add_mm_event(unsigned char type, u64 time_stamp, u64 delta); +void ktrace_add_sched_event(unsigned char type, pid_t pid, u64 time_stamp, u64 delta, void *pc); +void ktrace_add_binder_event(unsigned char type, u64 time_stamp, u64 delta); +int ktrace_sched_match_pid(pid_t pid); +void ktrace_add_cpufreq_event(unsigned char type, pid_t pid, u64 time_stamp, + unsigned int cpu, unsigned int target_freq, unsigned int max); +void ktrace_cpufreq_set_mitigated(char *comm, unsigned int cpu, + const struct cpumask *related_cpus, unsigned int max); +void ktrace_cpufreq_update_history(struct task_struct *p, u32 runtime, int samples, u32 scale_runtime); +void ktrace_print(const char *fmt, ...); + +void *ktrace_q_start(struct seq_file *m, loff_t *pos); +void *ktrace_q_next(struct seq_file *m, void *v, loff_t *pos); +void ktrace_q_stop(struct seq_file *m, void *v); +int ktrace_q_show(struct seq_file *m, void *v); +int ktrace_q_single_show(struct seq_file *m, void *v); +void ktrace_init_queue(struct ktrace_queue *q, struct dentry *dir, + void *priv, void *buf, int entry_size, int max, int items_per_read, + int(*show_entry)(struct seq_file *, void *, bool)); +void ktrace_tryadd_queue(struct ktrace_queue *q, void *entry); +void ktrace_add_queue_multi(struct ktrace_queue *q, void *entry, int num); +void ktrace_reset_queue(struct ktrace_queue *q); + +void ktrace_event_inc(unsigned char type); +void ktrace_event_dec(unsigned char type); +void ktrace_event_add(unsigned char type, int i); +void ktrace_event_sub(unsigned char type, int i); +#else +static inline void ktrace_add_mm_event(unsigned char type, u64 time_stamp, u64 delta) {} +static inline void ktrace_print(const char *fmt, ...) {} +static inline void ktrace_add_sched_event(unsigned char type, pid_t pid, u64 time_stamp, u64 delta, void *pc) {} +static inline void ktrace_add_binder_event(unsigned char type, u64 time_stamp, u64 delta) {} +static inline int ktrace_sched_match_pid(pid_t pid) { return 0; } +static inline void ktrace_add_cpufreq_event(unsigned char type, pid_t pid, u64 time_stamp, + unsigned int cpu, unsigned int target_freq, unsigned int max) {} +static inline void ktrace_cpufreq_set_mitigated(char *comm, unsigned int cpu, + const struct cpumask *related_cpus, unsigned int max){} +static inline void ktrace_cpufreq_update_history(struct task_struct *p, u32 runtime, int samples, u32 scale_runtime) {} + + + +static inline void ktrace_event_inc(unsigned char type) {} +static inline void ktrace_event_dec(unsigned char type) {} +static inline void ktrace_event_add(unsigned char type, int i) {} +static inline void ktrace_event_sub(unsigned char type, int i) {} + +#endif + +#endif diff --git a/include/linux/mdss_io_util.h b/include/linux/mdss_io_util.h index 6ad21e8878774..1e5227a9eadfc 100644 --- a/include/linux/mdss_io_util.h +++ b/include/linux/mdss_io_util.h @@ -1,4 +1,5 @@ /* Copyright (c) 2012, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -109,4 +110,5 @@ int mdss_i2c_byte_read(struct i2c_client *client, uint8_t slave_addr, int mdss_i2c_byte_write(struct i2c_client *client, uint8_t slave_addr, uint8_t reg_offset, uint8_t *value); +int mdss_prim_panel_fb_unblank(int timeout); #endif /* __MDSS_IO_UTIL_H__ */ diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 37e4404d0227f..22fc8f9edc049 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -42,7 +42,7 @@ #include -#include +#include #define MAX_MSIX_P_PORT 17 #define MAX_MSIX 64 diff --git a/include/linux/mm.h b/include/linux/mm.h index b6b3d75a1bde7..e890d9f07a256 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2205,6 +2205,9 @@ struct reclaim_param { }; extern struct reclaim_param reclaim_task_anon(struct task_struct *task, int nr_to_reclaim); +extern int reclaim_pte_range(pmd_t *pmd, unsigned long addr, + unsigned long end, struct mm_walk *walk); +extern unsigned long reclaim_global(unsigned long nr_to_reclaim); #endif #endif /* __KERNEL__ */ diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 2e67166e323ec..b57da43998b12 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -469,6 +470,7 @@ struct mm_struct { bool tlb_flush_pending; #endif struct uprobes_state uprobes_state; + struct work_struct async_put_work; #ifdef CONFIG_MSM_APP_SETTINGS int app_setting; #endif diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 43c952e5f4671..f57daa844270a 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -130,6 +130,8 @@ struct mmc_ext_csd { u8 raw_sectors[4]; /* 212 - 4 bytes */ u8 cmdq_depth; /* 307 */ u8 cmdq_support; /* 308 */ + u8 life_time_est_typ_a; /* 268 */ + u8 life_time_est_typ_b; /* 269 */ u8 barrier_support; /* 486 */ u8 barrier_en; diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index cf2a50c380667..e6da99015cabc 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -501,6 +501,7 @@ struct mmc_host { unsigned int bus_resume_flags; #define MMC_BUSRESUME_MANUAL_RESUME (1 << 0) #define MMC_BUSRESUME_NEEDS_RESUME (1 << 1) +bool ignore_bus_resume_flags; unsigned int sdio_irqs; struct task_struct *sdio_irq_thread; @@ -517,7 +518,9 @@ struct mmc_host { struct mmc_supply supply; struct dentry *debugfs_root; - +#ifdef CONFIG_MMC_ERROR_STATUS + bool err_occurred; +#endif struct mmc_async_req *areq; /* active async req */ struct mmc_context_info context_info; /* async synchronization info */ diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index ed6638ab7ca51..b8a6c3ef411de 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h @@ -286,6 +286,8 @@ struct _mmc_csd { #define EXT_CSD_FW_VERSION 254 /* RO */ #define EXT_CSD_CMDQ_DEPTH 307 /* RO */ #define EXT_CSD_CMDQ_SUPPORT 308 /* RO */ +#define EXT_CSD_LIFE_TIME_EST_TYP_A 268 /* RO */ +#define EXT_CSD_LIFE_TIME_EST_TYP_B 269 /* RO */ #define EXT_CSD_BARRIER_SUPPORT 486 /* RO */ #define EXT_CSD_TAG_UNIT_SIZE 498 /* RO */ #define EXT_CSD_DATA_TAG_SUPPORT 499 /* RO */ diff --git a/include/linux/mount.h b/include/linux/mount.h index c2c561dc01144..7c9e561fa0111 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h @@ -66,6 +66,7 @@ struct vfsmount { struct dentry *mnt_root; /* root of the mounted tree */ struct super_block *mnt_sb; /* pointer to superblock */ int mnt_flags; + void *data; }; struct file; /* forward dec */ diff --git a/include/linux/namei.h b/include/linux/namei.h index c9ad7a100d052..f6ff630b39aa3 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h @@ -75,6 +75,7 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *, const char *, unsigned int, struct path *); extern struct dentry *lookup_one_len(const char *, struct dentry *, int); +extern struct dentry *lookup_one_len2(const char *, struct vfsmount *mnt, struct dentry *, int); extern int follow_down_one(struct path *); extern int follow_down(struct path *); diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h index 35feeca7bf2c8..242ec59d88423 100644 --- a/include/linux/of_fdt.h +++ b/include/linux/of_fdt.h @@ -56,6 +56,7 @@ extern int of_flat_dt_is_compatible(unsigned long node, const char *name); extern int of_flat_dt_match(unsigned long node, const char *const *matches); extern unsigned long of_get_flat_dt_root(void); extern int of_get_flat_dt_size(void); +extern void early_init_dt_setup_pureason_arch(unsigned long pu_reason); /* * early_init_dt_scan_chosen - scan the device tree for ramdisk and bootargs @@ -113,6 +114,7 @@ static inline void early_init_fdt_scan_reserved_mem(void) {} static inline const char *of_flat_dt_get_machine_name(void) { return NULL; } static inline void unflatten_device_tree(void) {} static inline void unflatten_and_copy_device_tree(void) {} +static inline void early_init_dt_setup_pureason_arch(unsigned long pu_reason) {} #endif /* CONFIG_OF_FLATTREE */ #endif /* __ASSEMBLY__ */ diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 20227882f5499..eb65b3392d0b1 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -220,11 +220,6 @@ static inline struct page *__page_cache_alloc(gfp_t gfp) page = alloc_pages(gfp, 0); - if (page && is_cma_pageblock(page)) { - __free_page(page); - page = alloc_pages(gfp & ~__GFP_MOVABLE, 0); - } - return page; } #endif diff --git a/include/linux/pid.h b/include/linux/pid.h index 23705a53abbaa..97b745ddece50 100644 --- a/include/linux/pid.h +++ b/include/linux/pid.h @@ -8,7 +8,9 @@ enum pid_type PIDTYPE_PID, PIDTYPE_PGID, PIDTYPE_SID, - PIDTYPE_MAX + PIDTYPE_MAX, + /* only valid to __task_pid_nr_ns() */ + __PIDTYPE_TGID }; /* diff --git a/include/linux/power/cw2015_battery.h b/include/linux/power/cw2015_battery.h new file mode 100644 index 0000000000000..fb03ca53c996f --- /dev/null +++ b/include/linux/power/cw2015_battery.h @@ -0,0 +1,55 @@ +/* + * Gas_Gauge driver for CW2015/2013 + * Copyright (C) 2012, CellWise + * Copyright (C) 2018 XiaoMi, Inc. + * + * Authors: ChenGang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation.And this driver depends on + * I2C and uses IIC bus for communication with the host. + * + */ + +#ifndef __LINUX_CW2015_BATTERY_H__ +#define __LINUX_CW2015_BATTERY_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#define SIZE_BATINFO 64 + + + +struct cw_bat_platform_data { + int (*io_init)(void); + + int is_usb_charge; + int is_dc_charge; + u8 *cw_bat_config_info; + u32 irq_flags; + u32 dc_det_pin; + u32 dc_det_level; + + u32 bat_low_pin; + u32 bat_low_level; + u32 chg_ok_pin; + u32 chg_ok_level; + u32 chg_mode_sel_pin; + u32 chg_mode_sel_level; +}; + +#endif + diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 7a98cebe117f0..63f5e8d77f45d 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -4,6 +4,7 @@ * Copyright © 2007 Anton Vorontsov * Copyright © 2004 Szabolcs Gyurko * Copyright © 2003 Ian Molton + * Copyright (C) 2018 XiaoMi, Inc. * * Modified: 2004, Oct Szabolcs Gyurko * @@ -188,6 +189,7 @@ enum power_supply_property { POWER_SUPPLY_PROP_COOL_TEMP, POWER_SUPPLY_PROP_WARM_TEMP, POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL, + POWER_SUPPLY_PROP_CHARGER_TYPE, POWER_SUPPLY_PROP_RESISTANCE, POWER_SUPPLY_PROP_RESISTANCE_CAPACITIVE, POWER_SUPPLY_PROP_RESISTANCE_ID, /* in Ohms */ @@ -216,6 +218,7 @@ enum power_supply_property { POWER_SUPPLY_PROP_ENABLE_JEITA_DETECTION, POWER_SUPPLY_PROP_BATTERY_INFO, POWER_SUPPLY_PROP_BATTERY_INFO_ID, + POWER_SUPPLY_PROP_CHARGING_CALL_STATE, /* Local extensions of type int64_t */ POWER_SUPPLY_PROP_CHARGE_COUNTER_EXT, /* Properties of type `const char *' */ @@ -290,6 +293,7 @@ struct power_supply { bool no_thermal; /* For APM emulation, think legacy userspace. */ int use_for_apm; + u8 bms_psy_ok; /* private */ struct device *dev; diff --git a/include/linux/qpnp/power-on.h b/include/linux/qpnp/power-on.h index da8f5a8622dde..e301dba1e137a 100644 --- a/include/linux/qpnp/power-on.h +++ b/include/linux/qpnp/power-on.h @@ -58,6 +58,8 @@ enum pon_restart_reason { PON_RESTART_REASON_DMVERITY_CORRUPTED = 0x04, PON_RESTART_REASON_DMVERITY_ENFORCE = 0x05, PON_RESTART_REASON_KEYS_CLEAR = 0x06, + PON_RESTART_REASON_NORMAL = 0x20, + PON_RESTART_REASON_PANIC = 0x21, }; #ifdef CONFIG_QPNP_POWER_ON @@ -67,6 +69,8 @@ int qpnp_pon_trigger_config(enum pon_trigger_source pon_src, bool enable); int qpnp_pon_wd_config(bool enable); int qpnp_pon_set_restart_reason(enum pon_restart_reason reason); bool qpnp_pon_check_hard_reset_stored(void); +int qpnp_pon_is_lpk(void); +int qpnp_pon_is_ps_hold_reset(void); #else static int qpnp_pon_system_pwr_off(enum pon_power_off_type type) @@ -91,6 +95,9 @@ static inline bool qpnp_pon_check_hard_reset_stored(void) { return false; } +static inline int qpnp_pon_is_lpk(void) { return -ENODEV; } +static inline int qpnp_pon_is_ps_hold_reset(void) { return -ENODEV; } + #endif #endif diff --git a/include/linux/rtmm.h b/include/linux/rtmm.h new file mode 100644 index 0000000000000..e55a80e63c1ed --- /dev/null +++ b/include/linux/rtmm.h @@ -0,0 +1,31 @@ +#ifndef __RTMM_H__ +#define __MIMEM_H__ + + +#define GLOBAL_RECLAIM_SWAPPINESS 150 + +enum { + RTMM_POOL_THREADINFO = 0, + RTMM_POOL_NR +}; + +int __init rtmm_pool_init(struct dentry *dir); +struct page *rtmm_alloc_pages(int pool_type); +void rtmm_free_pages(void *addr, int pool_type); + +int __init rtmm_reclaim_init(struct dentry *dir); + +struct scan_control; +#ifdef CONFIG_RTMM +static inline bool rtmm_reclaim(struct scan_control *sc) +{ + return strncmp("rtmm_reclaim", current->comm, strlen("rtmm_reclaim")) == 0; +} +#else +static inline bool rtmm_reclaim(struct scan_control *sc) +{ + return false; +} +#endif + +#endif diff --git a/include/linux/sched.h b/include/linux/sched.h index 1cb810887a371..7b093814d0039 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1182,6 +1182,7 @@ struct ravg { u64 mark_start; u32 sum, demand; u32 sum_history[RAVG_HIST_SIZE_MAX]; + u64 proc_load; #ifdef CONFIG_SCHED_FREQ_INPUT u32 curr_window, prev_window; u16 active_windows; @@ -1338,6 +1339,8 @@ struct task_struct { u64 last_wake_ts; u64 last_switch_out_ts; u64 last_cpu_selected_ts; + u64 last_preempt; + u64 last_wakeup; #ifdef CONFIG_SCHED_QHMP u64 run_start; #endif @@ -1862,14 +1865,16 @@ static inline pid_t task_tgid_nr(struct task_struct *tsk) return tsk->tgid; } -pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns); +static inline pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns) +{ + return __task_pid_nr_ns(tsk, __PIDTYPE_TGID, ns); +} static inline pid_t task_tgid_vnr(struct task_struct *tsk) { - return pid_vnr(task_tgid(tsk)); + return __task_pid_nr_ns(tsk, __PIDTYPE_TGID, NULL); } - static inline int pid_alive(const struct task_struct *p); static inline pid_t task_ppid_nr_ns(const struct task_struct *tsk, struct pid_namespace *ns) { @@ -2113,7 +2118,7 @@ static inline void memalloc_noio_restore(unsigned int flags) #define PFA_NO_NEW_PRIVS 0 /* May not gain new privileges. */ #define PFA_SPREAD_PAGE 1 /* Spread page cache over cpuset */ #define PFA_SPREAD_SLAB 2 /* Spread some slab caches over cpuset */ - +#define PFA_LMK_WAITING 3 /* Lowmemorykiller is waiting */ #define TASK_PFA_TEST(name, func) \ static inline bool task_##func(struct task_struct *p) \ @@ -2136,6 +2141,9 @@ TASK_PFA_TEST(SPREAD_SLAB, spread_slab) TASK_PFA_SET(SPREAD_SLAB, spread_slab) TASK_PFA_CLEAR(SPREAD_SLAB, spread_slab) +TASK_PFA_TEST(LMK_WAITING, lmk_waiting) +TASK_PFA_SET(LMK_WAITING, lmk_waiting) + /* * task->jobctl flags */ @@ -2617,6 +2625,11 @@ static inline void mmdrop(struct mm_struct * mm) /* mmput gets rid of the mappings and all user-space */ extern int mmput(struct mm_struct *); +/* same as above but performs the slow path from the async kontext. Can + * be called from the atomic context as well + */ +extern void mmput_async(struct mm_struct *); + /* Grab a reference to a task's mm, if it is not already going away */ extern struct mm_struct *get_task_mm(struct task_struct *task); /* diff --git a/include/linux/timecounter.h b/include/linux/timecounter.h new file mode 100644 index 0000000000000..146f07a6651be --- /dev/null +++ b/include/linux/timecounter.h @@ -0,0 +1,122 @@ +/* + * linux/include/linux/timecounter.h + * + * based on code that migrated away from + * linux/include/linux/clocksource.h + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#ifndef _LINUX_TIMECOUNTER_H +#define _LINUX_TIMECOUNTER_H + +#include + +/** + * struct cyclecounter - hardware abstraction for a free running counter + * Provides completely state-free accessors to the underlying hardware. + * Depending on which hardware it reads, the cycle counter may wrap + * around quickly. Locking rules (if necessary) have to be defined + * by the implementor and user of specific instances of this API. + * + * @read: returns the current cycle value + * @mask: bitmask for two's complement + * subtraction of non 64 bit counters, + * see CLOCKSOURCE_MASK() helper macro + * @mult: cycle to nanosecond multiplier + * @shift: cycle to nanosecond divisor (power of two) + */ +struct cyclecounter { + cycle_t (*read)(const struct cyclecounter *cc); + cycle_t mask; + u32 mult; + u32 shift; +}; + +/** + * struct timecounter - layer above a %struct cyclecounter which counts nanoseconds + * Contains the state needed by timecounter_read() to detect + * cycle counter wrap around. Initialize with + * timecounter_init(). Also used to convert cycle counts into the + * corresponding nanosecond counts with timecounter_cyc2time(). Users + * of this code are responsible for initializing the underlying + * cycle counter hardware, locking issues and reading the time + * more often than the cycle counter wraps around. The nanosecond + * counter will only wrap around after ~585 years. + * + * @cc: the cycle counter used by this instance + * @cycle_last: most recent cycle counter value seen by + * timecounter_read() + * @nsec: continuously increasing count + */ +struct timecounter { + const struct cyclecounter *cc; + cycle_t cycle_last; + u64 nsec; +}; + +/** + * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds + * @cc: Pointer to cycle counter. + * @cycles: Cycles + * + * XXX - This could use some mult_lxl_ll() asm optimization. Same code + * as in cyc2ns, but with unsigned result. + */ +static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc, + cycle_t cycles) +{ + u64 ret = (u64)cycles; + ret = (ret * cc->mult) >> cc->shift; + return ret; +} + +/** + * timecounter_init - initialize a time counter + * @tc: Pointer to time counter which is to be initialized/reset + * @cc: A cycle counter, ready to be used. + * @start_tstamp: Arbitrary initial time stamp. + * + * After this call the current cycle register (roughly) corresponds to + * the initial time stamp. Every call to timecounter_read() increments + * the time stamp counter by the number of elapsed nanoseconds. + */ +extern void timecounter_init(struct timecounter *tc, + const struct cyclecounter *cc, + u64 start_tstamp); + +/** + * timecounter_read - return nanoseconds elapsed since timecounter_init() + * plus the initial time stamp + * @tc: Pointer to time counter. + * + * In other words, keeps track of time since the same epoch as + * the function which generated the initial time stamp. + */ +extern u64 timecounter_read(struct timecounter *tc); + +/** + * timecounter_cyc2time - convert a cycle counter to same + * time base as values returned by + * timecounter_read() + * @tc: Pointer to time counter. + * @cycle_tstamp: a value returned by tc->cc->read() + * + * Cycle counts that are converted correctly as long as they + * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], + * with "max cycle count" == cs->mask+1. + * + * This allows conversion of cycle counter values which were generated + * in the past. + */ +extern u64 timecounter_cyc2time(struct timecounter *tc, + cycle_t cycle_tstamp); + +#endif diff --git a/include/linux/types.h b/include/linux/types.h index 049fc8697cb15..d23c45e74f8a2 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -213,5 +213,8 @@ struct callback_head { }; #define rcu_head callback_head +/* clocksource cycle base type */ +typedef u64 cycle_t; + #endif /* __ASSEMBLY__ */ #endif /* _LINUX_TYPES_H */ diff --git a/include/linux/usb/msm_hsusb.h b/include/linux/usb/msm_hsusb.h index c6a75ff91e64e..572eef14c8829 100644 --- a/include/linux/usb/msm_hsusb.h +++ b/include/linux/usb/msm_hsusb.h @@ -3,6 +3,7 @@ * Copyright (C) 2008 Google, Inc. * Author: Brian Swetland * Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -120,9 +121,10 @@ enum msm_usb_phy_type { QUSB_ULPI_PHY, }; -#define IDEV_CHG_MAX 1500 +#define IDEV_CHG_MAX 1000 #define IUNIT 100 #define IDEV_HVDCP_CHG_MAX 1800 +#define IDEV_CHG_MIN 500 /** * Different states involved in USB charger detection. @@ -421,6 +423,8 @@ struct msm_otg { struct clk *phy_csr_clk; struct clk *bus_clks[USB_NUM_BUS_CLOCKS]; struct clk *phy_ref_clk; + spinlock_t otg_phy_clk_lock; + bool otg_phy_clk_enable; long core_clk_rate; long core_clk_svs_rate; long core_clk_nominal_rate; diff --git a/include/linux/zpool.h b/include/linux/zpool.h index 56529b34dc635..2e97b7707dffc 100644 --- a/include/linux/zpool.h +++ b/include/linux/zpool.h @@ -36,10 +36,12 @@ enum zpool_mapmode { ZPOOL_MM_DEFAULT = ZPOOL_MM_RW }; -struct zpool *zpool_create_pool(char *type, char *name, - gfp_t gfp, struct zpool_ops *ops); +bool zpool_has_pool(char *type); -char *zpool_get_type(struct zpool *pool); +struct zpool *zpool_create_pool(const char *type, const char *name, + gfp_t gfp, const struct zpool_ops *ops); + +const char *zpool_get_type(struct zpool *pool); void zpool_destroy_pool(struct zpool *pool); @@ -81,7 +83,10 @@ struct zpool_driver { atomic_t refcount; struct list_head list; - void *(*create)(char *name, gfp_t gfp, struct zpool_ops *ops); + void *(*create)(const char *name, + gfp_t gfp, + const struct zpool_ops *ops, + struct zpool *zpool); void (*destroy)(void *pool); int (*malloc)(void *pool, size_t size, gfp_t gfp, @@ -102,6 +107,4 @@ void zpool_register_driver(struct zpool_driver *driver); int zpool_unregister_driver(struct zpool_driver *driver); -int zpool_evict(void *pool, unsigned long handle); - #endif diff --git a/include/linux/zsmalloc.h b/include/linux/zsmalloc.h index 1338190b54783..57a8e98f2708c 100644 --- a/include/linux/zsmalloc.h +++ b/include/linux/zsmalloc.h @@ -34,12 +34,17 @@ enum zs_mapmode { */ }; +struct zs_pool_stats { + /* How many pages were migrated (freed) */ + unsigned long pages_compacted; +}; + struct zs_pool; -struct zs_pool *zs_create_pool(char *name, gfp_t flags); +struct zs_pool *zs_create_pool(const char *name); void zs_destroy_pool(struct zs_pool *pool); -unsigned long zs_malloc(struct zs_pool *pool, size_t size); +unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t flags); void zs_free(struct zs_pool *pool, unsigned long obj); void *zs_map_object(struct zs_pool *pool, unsigned long handle, @@ -49,4 +54,5 @@ void zs_unmap_object(struct zs_pool *pool, unsigned long handle); unsigned long zs_get_total_pages(struct zs_pool *pool); unsigned long zs_compact(struct zs_pool *pool); +void zs_pool_stats(struct zs_pool *pool, struct zs_pool_stats *stats); #endif diff --git a/include/scsi/fc/Kbuild b/include/scsi/fc/Kbuild deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/include/sound/rawmidi.h b/include/sound/rawmidi.h index 5bd2bfbf6dd11..0afad5cd6253a 100644 --- a/include/sound/rawmidi.h +++ b/include/sound/rawmidi.h @@ -77,6 +77,7 @@ struct snd_rawmidi_runtime { size_t xruns; /* over/underruns counter */ /* misc */ spinlock_t lock; + struct mutex realloc_mutex; wait_queue_head_t sleep; /* event handler (new bytes, input only) */ void (*event)(struct snd_rawmidi_substream *substream); diff --git a/include/uapi/linux/input.h b/include/uapi/linux/input.h index 7082516374d27..6db9562a0ac78 100644 --- a/include/uapi/linux/input.h +++ b/include/uapi/linux/input.h @@ -481,6 +481,11 @@ struct input_keymap_entry { #define KEY_MICMUTE 248 /* Mute / unmute the microphone */ +#define KEY_NEXTSONG_NEW 250 +#define KEY_PREVIOUSSONG_NEW 251 + +#define KEY_ANTENNA_DET 252 +#define KEY_ANTENNA_DET_UP 253 /* Code 255 is reserved for special needs of AT keyboard driver */ #define BTN_MISC 0x100 diff --git a/include/uapi/linux/msm_mdp.h b/include/uapi/linux/msm_mdp.h index 1fc1e39fd9704..00847271c3f2e 100644 --- a/include/uapi/linux/msm_mdp.h +++ b/include/uapi/linux/msm_mdp.h @@ -71,6 +71,11 @@ #define MSMFB_MDP_PP_GET_FEATURE_VERSION _IOWR(MSMFB_IOCTL_MAGIC, 171, \ struct mdp_pp_feature_version) +#define MSMFB_ENHANCE_SET_GAMMA _IOWR(MSMFB_IOCTL_MAGIC, 172, unsigned int) +#define MSMFB_ENHANCE_SET_CE _IOWR(MSMFB_IOCTL_MAGIC, 173, unsigned int) +#define MSMFB_ENHANCE_SET_EYE _IOWR(MSMFB_IOCTL_MAGIC, 174, unsigned int) +#define MSMFB_SET_CABC _IOWR(MSMFB_IOCTL_MAGIC, 175, unsigned int) + #define FB_TYPE_3D_PANEL 0x10101010 #define MDP_IMGTYPE2_START 0x10000 #define MSMFB_DRIVER_VERSION 0xF9E8D701 diff --git a/ipc/mqueue.c b/ipc/mqueue.c index f65a044d66c54..3949468d5af19 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -751,7 +751,7 @@ static struct file *do_create(struct ipc_namespace *ipc_ns, struct inode *dir, } mode &= ~current_umask(); - ret = vfs_create(dir, path->dentry, mode, true); + ret = vfs_create2(path->mnt, dir, path->dentry, mode, true); path->dentry->d_fsdata = NULL; if (ret) return ERR_PTR(ret); @@ -767,7 +767,7 @@ static struct file *do_open(struct path *path, int oflag) if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY)) return ERR_PTR(-EINVAL); acc = oflag2acc[oflag & O_ACCMODE]; - if (inode_permission(path->dentry->d_inode, acc)) + if (inode_permission2(path->mnt, path->dentry->d_inode, acc)) return ERR_PTR(-EACCES); return dentry_open(path, oflag, current_cred()); } @@ -800,7 +800,7 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, umode_t, mode, ro = mnt_want_write(mnt); /* we'll drop it in any case */ error = 0; mutex_lock(&root->d_inode->i_mutex); - path.dentry = lookup_one_len(name->name, root, strlen(name->name)); + path.dentry = lookup_one_len2(name->name, mnt, root, strlen(name->name)); if (IS_ERR(path.dentry)) { error = PTR_ERR(path.dentry); goto out_putfd; @@ -871,7 +871,7 @@ SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name) if (err) goto out_name; mutex_lock_nested(&mnt->mnt_root->d_inode->i_mutex, I_MUTEX_PARENT); - dentry = lookup_one_len(name->name, mnt->mnt_root, + dentry = lookup_one_len2(name->name, mnt, mnt->mnt_root, strlen(name->name)); if (IS_ERR(dentry)) { err = PTR_ERR(dentry); @@ -883,7 +883,7 @@ SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name) err = -ENOENT; } else { ihold(inode); - err = vfs_unlink(dentry->d_parent->d_inode, dentry, NULL); + err = vfs_unlink2(mnt, dentry->d_parent->d_inode, dentry, NULL); } dput(dentry); diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 67f5f177c0715..72f96e69eec3f 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -315,7 +315,8 @@ static const char *const bpf_jmp_string[] = { [BPF_EXIT >> 4] = "exit", }; -static void print_bpf_insn(struct bpf_insn *insn) +static void print_bpf_insn(const struct bpf_verifier_env *env, + const struct bpf_insn *insn) { u8 class = BPF_CLASS(insn->code); @@ -379,9 +380,19 @@ static void print_bpf_insn(struct bpf_insn *insn) insn->code, bpf_ldst_string[BPF_SIZE(insn->code) >> 3], insn->src_reg, insn->imm); - } else if (BPF_MODE(insn->code) == BPF_IMM) { - verbose("(%02x) r%d = 0x%x\n", - insn->code, insn->dst_reg, insn->imm); + } else if (BPF_MODE(insn->code) == BPF_IMM && + BPF_SIZE(insn->code) == BPF_DW) { + /* At this point, we already made sure that the second + * part of the ldimm64 insn is accessible. + */ + u64 imm = ((u64)(insn + 1)->imm << 32) | (u32)insn->imm; + bool map_ptr = insn->src_reg == BPF_PSEUDO_MAP_FD; + + if (map_ptr && !env->allow_ptr_leaks) + imm = 0; + + verbose("(%02x) r%d = 0x%llx\n", insn->code, + insn->dst_reg, (unsigned long long)imm); } else { verbose("BUG_ld_%02x\n", insn->code); return; @@ -1534,7 +1545,7 @@ static int do_check(struct verifier_env *env) if (log_level) { verbose("%d: ", insn_idx); - print_bpf_insn(insn); + print_bpf_insn(env, insn); } if (class == BPF_ALU || class == BPF_ALU64) { diff --git a/kernel/cpu.c b/kernel/cpu.c index 8503e5eaa4585..23d4b48b020fc 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -24,6 +24,7 @@ #include #include +#include #include "smpboot.h" @@ -492,6 +493,10 @@ static int _cpu_up(unsigned int cpu, int tasks_frozen) nr_calls--; pr_warn("%s: attempt to bring up CPU %u failed\n", __func__, cpu); + + ktrace_add_cpufreq_event(KTRACE_CPUFREQ_TYPE_UNPLUGED, + current->pid, ktime_to_ns(ktime_get()), cpu, 0, 0); + goto out_notify; } diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 71b52dd957de1..4e39fcba59d45 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c @@ -99,6 +99,7 @@ struct cpuset { /* user-configured CPUs and Memory Nodes allow to tasks */ cpumask_var_t cpus_allowed; + cpumask_var_t cpus_requested; nodemask_t mems_allowed; /* effective CPUs and Memory Nodes allow to tasks */ @@ -385,7 +386,7 @@ static void cpuset_update_task_spread_flag(struct cpuset *cs, static int is_cpuset_subset(const struct cpuset *p, const struct cpuset *q) { - return cpumask_subset(p->cpus_allowed, q->cpus_allowed) && + return cpumask_subset(p->cpus_requested, q->cpus_requested) && nodes_subset(p->mems_allowed, q->mems_allowed) && is_cpu_exclusive(p) <= is_cpu_exclusive(q) && is_mem_exclusive(p) <= is_mem_exclusive(q); @@ -484,7 +485,7 @@ static int validate_change(struct cpuset *cur, struct cpuset *trial) cpuset_for_each_child(c, css, par) { if ((is_cpu_exclusive(trial) || is_cpu_exclusive(c)) && c != cur && - cpumask_intersects(trial->cpus_allowed, c->cpus_allowed)) + cpumask_intersects(trial->cpus_requested, c->cpus_requested)) goto out; if ((is_mem_exclusive(trial) || is_mem_exclusive(c)) && c != cur && @@ -923,17 +924,18 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, if (!*buf) { cpumask_clear(trialcs->cpus_allowed); } else { - retval = cpulist_parse(buf, trialcs->cpus_allowed); + retval = cpulist_parse(buf, trialcs->cpus_requested); if (retval < 0) return retval; - if (!cpumask_subset(trialcs->cpus_allowed, - top_cpuset.cpus_allowed)) + if (!cpumask_subset(trialcs->cpus_requested, cpu_present_mask)) return -EINVAL; + + cpumask_and(trialcs->cpus_allowed, trialcs->cpus_requested, cpu_active_mask); } /* Nothing to do if the cpus didn't change */ - if (cpumask_equal(cs->cpus_allowed, trialcs->cpus_allowed)) + if (cpumask_equal(cs->cpus_requested, trialcs->cpus_requested)) return 0; retval = validate_change(cs, trialcs); @@ -942,6 +944,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, mutex_lock(&callback_mutex); cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed); + cpumask_copy(cs->cpus_requested, trialcs->cpus_requested); mutex_unlock(&callback_mutex); /* use trialcs->cpus_allowed as a temp variable */ @@ -1454,6 +1457,27 @@ static int cpuset_can_attach(struct cgroup_subsys_state *css, return ret; } +static int cpuset_allow_attach(struct cgroup_subsys_state *css, + struct cgroup_taskset *tset) +{ + const struct cred *cred = current_cred(), *tcred; + struct task_struct *task; + + if (capable(CAP_SYS_NICE)) + return 0; + + cgroup_taskset_for_each(task, tset) { + tcred = __task_cred(task); + + if (current != task && !uid_eq(cred->euid, tcred->uid) && + !uid_eq(cred->euid, tcred->suid)) + return -EACCES; + } + + return 0; +} + + static void cpuset_cancel_attach(struct cgroup_subsys_state *css, struct cgroup_taskset *tset) { @@ -1714,7 +1738,7 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v) switch (type) { case FILE_CPULIST: - s += cpulist_scnprintf(s, count, cs->cpus_allowed); + s += cpulist_scnprintf(s, count, cs->cpus_requested); break; case FILE_MEMLIST: s += nodelist_scnprintf(s, count, cs->mems_allowed); @@ -1914,11 +1938,14 @@ cpuset_css_alloc(struct cgroup_subsys_state *parent_css) return ERR_PTR(-ENOMEM); if (!alloc_cpumask_var(&cs->cpus_allowed, GFP_KERNEL)) goto free_cs; + if (!alloc_cpumask_var(&cs->cpus_requested, GFP_KERNEL)) + goto free_allowed; if (!alloc_cpumask_var(&cs->effective_cpus, GFP_KERNEL)) - goto free_cpus; + goto free_requested; set_bit(CS_SCHED_LOAD_BALANCE, &cs->flags); cpumask_clear(cs->cpus_allowed); + cpumask_clear(cs->cpus_requested); nodes_clear(cs->mems_allowed); cpumask_clear(cs->effective_cpus); nodes_clear(cs->effective_mems); @@ -1927,7 +1954,9 @@ cpuset_css_alloc(struct cgroup_subsys_state *parent_css) return &cs->css; -free_cpus: +free_requested: + free_cpumask_var(cs->cpus_requested); +free_allowed: free_cpumask_var(cs->cpus_allowed); free_cs: kfree(cs); @@ -1990,6 +2019,7 @@ static int cpuset_css_online(struct cgroup_subsys_state *css) cs->mems_allowed = parent->mems_allowed; cs->effective_mems = parent->mems_allowed; cpumask_copy(cs->cpus_allowed, parent->cpus_allowed); + cpumask_copy(cs->cpus_requested, parent->cpus_requested); cpumask_copy(cs->effective_cpus, parent->cpus_allowed); mutex_unlock(&callback_mutex); out_unlock: @@ -2024,6 +2054,7 @@ static void cpuset_css_free(struct cgroup_subsys_state *css) free_cpumask_var(cs->effective_cpus); free_cpumask_var(cs->cpus_allowed); + free_cpumask_var(cs->cpus_requested); kfree(cs); } @@ -2051,6 +2082,7 @@ struct cgroup_subsys cpuset_cgrp_subsys = { .css_offline = cpuset_css_offline, .css_free = cpuset_css_free, .can_attach = cpuset_can_attach, + .allow_attach = cpuset_allow_attach, .cancel_attach = cpuset_cancel_attach, .attach = cpuset_attach, .bind = cpuset_bind, @@ -2072,8 +2104,11 @@ int __init cpuset_init(void) BUG(); if (!alloc_cpumask_var(&top_cpuset.effective_cpus, GFP_KERNEL)) BUG(); + if (!alloc_cpumask_var(&top_cpuset.cpus_requested, GFP_KERNEL)) + BUG(); cpumask_setall(top_cpuset.cpus_allowed); + cpumask_setall(top_cpuset.cpus_requested); nodes_setall(top_cpuset.mems_allowed); cpumask_setall(top_cpuset.effective_cpus); nodes_setall(top_cpuset.effective_mems); @@ -2207,7 +2242,7 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs) goto retry; } - cpumask_and(&new_cpus, cs->cpus_allowed, parent_cs(cs)->effective_cpus); + cpumask_and(&new_cpus, cs->cpus_requested, parent_cs(cs)->effective_cpus); nodes_and(new_mems, cs->mems_allowed, parent_cs(cs)->effective_mems); cpus_updated = !cpumask_equal(&new_cpus, cs->effective_cpus); diff --git a/kernel/events/core.c b/kernel/events/core.c index 94a2c9dca1a87..62372aa81df99 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7435,6 +7435,37 @@ static void mutex_lock_double(struct mutex *a, struct mutex *b) mutex_lock_nested(b, SINGLE_DEPTH_NESTING); } +/* + * Variation on perf_event_ctx_lock_nested(), except we take two context + * mutexes. + */ +static struct perf_event_context * +__perf_event_ctx_lock_double(struct perf_event *group_leader, + struct perf_event_context *ctx) +{ + struct perf_event_context *gctx; + +again: + rcu_read_lock(); + gctx = ACCESS_ONCE(group_leader->ctx); + if (!atomic_inc_not_zero(&gctx->refcount)) { + rcu_read_unlock(); + goto again; + } + rcu_read_unlock(); + + mutex_lock_double(&gctx->mutex, &ctx->mutex); + + if (group_leader->ctx != gctx) { + mutex_unlock(&ctx->mutex); + mutex_unlock(&gctx->mutex); + put_ctx(gctx); + goto again; + } + + return gctx; +} + /** * sys_perf_event_open - open a performance event, associate it to a task/cpu * @@ -7664,14 +7695,31 @@ SYSCALL_DEFINE5(perf_event_open, } if (move_group) { - gctx = group_leader->ctx; + gctx = __perf_event_ctx_lock_double(group_leader, ctx); + + /* + * Check if we raced against another sys_perf_event_open() call + * moving the software group underneath us. + */ + if (!(group_leader->group_flags & PERF_GROUP_SOFTWARE)) { + /* + * If someone moved the group out from under us, check + * if this new event wound up on the same ctx, if so + * its the regular !move_group case, otherwise fail. + */ + if (gctx != ctx) { + err = -EINVAL; + goto err_locked; + } else { + perf_event_ctx_unlock(group_leader, gctx); + move_group = 0; + } + } /* * See perf_event_ctx_lock() for comments on the details * of swizzling perf_event::ctx. */ - mutex_lock_double(&gctx->mutex, &ctx->mutex); - perf_remove_from_context(group_leader, false); /* @@ -7712,7 +7760,7 @@ SYSCALL_DEFINE5(perf_event_open, perf_unpin_context(ctx); if (move_group) { - mutex_unlock(&gctx->mutex); + perf_event_ctx_unlock(group_leader, gctx); put_ctx(gctx); } mutex_unlock(&ctx->mutex); @@ -7743,6 +7791,11 @@ SYSCALL_DEFINE5(perf_event_open, fd_install(event_fd, event_file); return event_fd; +err_locked: + if (move_group) + perf_event_ctx_unlock(group_leader, gctx); + mutex_unlock(&ctx->mutex); + fput(event_file); err_context: perf_unpin_context(ctx); put_ctx(ctx); diff --git a/kernel/fork.c b/kernel/fork.c index 786c9dce31ba8..3eac3fd8c71e1 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -76,6 +76,8 @@ #include #include +#include + #include #include #include @@ -151,16 +153,24 @@ void __weak arch_release_thread_info(struct thread_info *ti) static struct thread_info *alloc_thread_info_node(struct task_struct *tsk, int node) { +#ifdef CONFIG_RTMM + struct page *page = rtmm_alloc_pages(RTMM_POOL_THREADINFO); +#else struct page *page = alloc_kmem_pages_node(node, THREADINFO_GFP, THREAD_SIZE_ORDER); +#endif return page ? page_address(page) : NULL; } static inline void free_thread_info(struct thread_info *ti) { +#ifdef CONFIG_RTMM + rtmm_free_pages(ti, RTMM_POOL_THREADINFO); +#else kasan_alloc_pages(virt_to_page(ti), THREAD_SIZE_ORDER); free_kmem_pages((unsigned long)ti, THREAD_SIZE_ORDER); +#endif } # else static struct kmem_cache *thread_info_cache; @@ -661,6 +671,27 @@ void __mmdrop(struct mm_struct *mm) } EXPORT_SYMBOL_GPL(__mmdrop); +static inline void __mmput(struct mm_struct *mm) +{ + VM_BUG_ON(atomic_read(&mm->mm_users)); + + uprobe_clear_state(mm); + exit_aio(mm); + ksm_exit(mm); + khugepaged_exit(mm); /* must run before exit_mmap */ + exit_mmap(mm); + set_mm_exe_file(mm, NULL); + if (!list_empty(&mm->mmlist)) { + spin_lock(&mmlist_lock); + list_del(&mm->mmlist); + spin_unlock(&mmlist_lock); + } + if (mm->binfmt) + module_put(mm->binfmt->module); + mmdrop(mm); +} + + /* * Decrement the use count and release all resources for an mm. */ @@ -670,26 +701,27 @@ int mmput(struct mm_struct *mm) might_sleep(); if (atomic_dec_and_test(&mm->mm_users)) { - uprobe_clear_state(mm); - exit_aio(mm); - ksm_exit(mm); - khugepaged_exit(mm); /* must run before exit_mmap */ - exit_mmap(mm); - set_mm_exe_file(mm, NULL); - if (!list_empty(&mm->mmlist)) { - spin_lock(&mmlist_lock); - list_del(&mm->mmlist); - spin_unlock(&mmlist_lock); - } - if (mm->binfmt) - module_put(mm->binfmt->module); - mmdrop(mm); + __mmput(mm); mm_freed = 1; } return mm_freed; } EXPORT_SYMBOL_GPL(mmput); +static void mmput_async_fn(struct work_struct *work) +{ + struct mm_struct *mm = container_of(work, struct mm_struct, async_put_work); + __mmput(mm); +} + +void mmput_async(struct mm_struct *mm) +{ + if (atomic_dec_and_test(&mm->mm_users)) { + INIT_WORK(&mm->async_put_work, mmput_async_fn); + schedule_work(&mm->async_put_work); + } +} + void set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file) { if (new_exe_file) diff --git a/kernel/pid.c b/kernel/pid.c index 82430c858d697..65a386e248110 100644 --- a/kernel/pid.c +++ b/kernel/pid.c @@ -523,8 +523,11 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type, if (!ns) ns = task_active_pid_ns(current); if (likely(pid_alive(task))) { - if (type != PIDTYPE_PID) + if (type != PIDTYPE_PID) { + if (type == __PIDTYPE_TGID) + type = PIDTYPE_PID; task = task->group_leader; + } nr = pid_nr_ns(task->pids[type].pid, ns); } rcu_read_unlock(); @@ -533,12 +536,6 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type, } EXPORT_SYMBOL(__task_pid_nr_ns); -pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns) -{ - return pid_nr_ns(task_tgid(tsk), ns); -} -EXPORT_SYMBOL(task_tgid_nr_ns); - struct pid_namespace *task_active_pid_ns(struct task_struct *tsk) { return ns_of_pid(task_pid(tsk)); diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index 67ecc6b59e1c6..e1e59512337b8 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig @@ -18,6 +18,16 @@ config SUSPEND_FREEZER Turning OFF this setting is NOT recommended! If in doubt, say Y. +config SUSPEND_SKIP_SYNC + bool "Skip kernel's sys_sync() on suspend to RAM/standby" + depends on SUSPEND + depends on EXPERT + help + Skip the kernel sys_sync() before freezing user processes. + Some systems prefer not to pay this cost on every invocation + of suspend, or they are content with invoking sync() from + user-space before invoking suspend. Say Y if that's your case. + config WAKELOCK bool "Android's method of preventing suspend" default y diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index a212348cbfbfb..08deeaf752d7e 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -463,11 +463,13 @@ static int enter_state(suspend_state_t state) if (state == PM_SUSPEND_FREEZE) freeze_begin(); +#ifndef CONFIG_SUSPEND_SKIP_SYNC trace_suspend_resume(TPS("sync_filesystems"), 0, true); printk(KERN_INFO "PM: Syncing filesystems ... "); sys_sync(); printk("done.\n"); trace_suspend_resume(TPS("sync_filesystems"), 0, false); +#endif pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); error = suspend_prepare(state); diff --git a/kernel/sched/qhmp_core.c b/kernel/sched/qhmp_core.c index ce2c0c3dc1a12..65bc5fc785070 100644 --- a/kernel/sched/qhmp_core.c +++ b/kernel/sched/qhmp_core.c @@ -76,6 +76,8 @@ #include #include #include +#include +#include #include #include @@ -1904,6 +1906,9 @@ static void update_task_demand(struct task_struct *p, struct rq *rq, /* Process (window_start - mark_start) first */ add_to_task_demand(rq, p, window_start - mark_start); + ktrace_cpufreq_update_history(p, p->ravg.sum, nr_full_windows, + scale_exec_time(window_size, rq)); + /* Push new sample(s) into task's demand history */ update_history(rq, p, p->ravg.sum, 1, event); if (nr_full_windows) @@ -3231,6 +3236,9 @@ ttwu_do_wakeup(struct rq *rq, struct task_struct *p, int wake_flags) { check_preempt_curr(rq, p, wake_flags); trace_sched_wakeup(p, true); + if (ktrace_sched_match_pid(p->pid)) { + p->last_wakeup = sched_ktime_clock(); + } p->state = TASK_RUNNING; #ifdef CONFIG_SMP @@ -4061,6 +4069,23 @@ static inline void prepare_task_switch(struct rq *rq, struct task_struct *prev, struct task_struct *next) { + if (ktrace_sched_match_pid(prev->pid) && prev->state == TASK_RUNNING) { + prev->last_preempt = sched_ktime_clock(); + } else if (ktrace_sched_match_pid(next->pid) && next->state == TASK_RUNNING) { + s64 now = sched_ktime_clock(); + + if (next->last_preempt) { + ktrace_add_sched_event(KTRACE_SCHED_TYPE_PREEMPT, next->pid, + now, (now - next->last_preempt), NULL); + } else if (next->last_wakeup) { + ktrace_add_sched_event(KTRACE_SCHED_TYPE_WAIT, next->pid, + now, (now - next->last_wakeup), NULL); + } + + next->last_preempt = 0; + next->last_wakeup = 0; + } + trace_sched_switch(prev, next); sched_info_switch(rq, prev, next); perf_event_task_sched_out(prev, next); diff --git a/kernel/sched/qhmp_fair.c b/kernel/sched/qhmp_fair.c index f19c331cf9cba..c7d12d71ffc42 100644 --- a/kernel/sched/qhmp_fair.c +++ b/kernel/sched/qhmp_fair.c @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -4935,6 +4936,12 @@ static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) trace_sched_stat_blocked(tsk, delta); + if (ktrace_sched_match_pid(tsk->pid)) { + ktrace_add_sched_event(KTRACE_SCHED_TYPE_BLOCK, + tsk->pid, sched_ktime_clock(), delta, + (void *)get_wchan(tsk)); + } + /* * Blocking time is in units of nanosecs, so shift by * 20 to get a milliseconds-range estimation of the diff --git a/kernel/sched/sched_avg.c b/kernel/sched/sched_avg.c index c70e0466c36c4..cfb0607f1f5e3 100644 --- a/kernel/sched/sched_avg.c +++ b/kernel/sched/sched_avg.c @@ -107,7 +107,7 @@ EXPORT_SYMBOL(sched_get_nr_running_avg); */ void sched_update_nr_prod(int cpu, long delta, bool inc) { - int diff; + s64 diff; s64 curr_time; unsigned long flags, nr_running; diff --git a/kernel/time/Makefile b/kernel/time/Makefile index d678ca611304b..bfbbb41c07348 100644 --- a/kernel/time/Makefile +++ b/kernel/time/Makefile @@ -1,6 +1,6 @@ obj-y += time.o timer.o hrtimer.o itimer.o posix-timers.o posix-cpu-timers.o obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o -obj-y += timeconv.o posix-clock.o alarmtimer.o +obj-y += timeconv.o timecounter.o posix-clock.o alarmtimer.o obj-$(CONFIG_GENERIC_CLOCKEVENTS_BUILD) += clockevents.o obj-$(CONFIG_GENERIC_CLOCKEVENTS) += tick-common.o diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index 47d256ff51ec7..b250a70b903cd 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c @@ -26,6 +26,9 @@ #include #include +#include +#include + #ifdef CONFIG_MSM_PM #include "lpm-levels.h" #endif @@ -54,6 +57,15 @@ static struct wakeup_source *ws; static struct delayed_work work; static struct workqueue_struct *power_off_alarm_workqueue; +#define AUTOWAKEUP_MAGIC 0xA2370000 +#define AUTOWAKEUP_MASK 0x0000FFFF + +static unsigned int auto_wakeup_time = AUTOWAKEUP_MAGIC; +#define AUTOWAKEUP_VALID_TIME_GET() \ + (AUTOWAKEUP_MAGIC == (auto_wakeup_time & (~AUTOWAKEUP_MASK)) ? (AUTOWAKEUP_MASK & auto_wakeup_time) : 0) +module_param_named(auto_wakeup_time, auto_wakeup_time, uint, S_IRUGO | S_IWUSR | S_IWGRP); +MODULE_PARM_DESC(auto_wakeup_time, "vRTC auto wakeup expire time(default is 0s)"); + #ifdef CONFIG_RTC_CLASS /* rtc timer and device for setting alarm wakeups at suspend */ static struct rtc_timer rtctimer; @@ -372,6 +384,7 @@ static int alarmtimer_suspend(struct device *dev) struct rtc_device *rtc; int i; int ret = 0; + unsigned int wakeup_time = 0; cancel_delayed_work_sync(&work); @@ -408,6 +421,12 @@ static int alarmtimer_suspend(struct device *dev) return -EBUSY; } + wakeup_time = AUTOWAKEUP_VALID_TIME_GET(); + if (unlikely(0 != wakeup_time)) { + min = ktime_set(wakeup_time, 0); + pr_err("auto wakeup: wake up in %d seconds\n", wakeup_time); + } + /* Setup a timer to fire that far in the future */ rtc_timer_cancel(rtc, &rtctimer); rtc_read_time(rtc, &tm); @@ -486,10 +505,16 @@ static int alarmtimer_suspend(struct device *dev) return ret; } #endif + +void qpnp_kpdpwr_simulate(void); static int alarmtimer_resume(struct device *dev) { struct rtc_device *rtc; + if (unlikely(0 != AUTOWAKEUP_VALID_TIME_GET())) { + qpnp_kpdpwr_simulate(); + } + rtc = alarmtimer_get_rtcdev(); /* If we have no rtcdev, just return */ if (!rtc) diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 93aabc88fdc60..6e86678018496 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -34,82 +34,6 @@ #include "tick-internal.h" #include "timekeeping_internal.h" -void timecounter_init(struct timecounter *tc, - const struct cyclecounter *cc, - u64 start_tstamp) -{ - tc->cc = cc; - tc->cycle_last = cc->read(cc); - tc->nsec = start_tstamp; -} -EXPORT_SYMBOL_GPL(timecounter_init); - -/** - * timecounter_read_delta - get nanoseconds since last call of this function - * @tc: Pointer to time counter - * - * When the underlying cycle counter runs over, this will be handled - * correctly as long as it does not run over more than once between - * calls. - * - * The first call to this function for a new time counter initializes - * the time tracking and returns an undefined result. - */ -static u64 timecounter_read_delta(struct timecounter *tc) -{ - cycle_t cycle_now, cycle_delta; - u64 ns_offset; - - /* read cycle counter: */ - cycle_now = tc->cc->read(tc->cc); - - /* calculate the delta since the last timecounter_read_delta(): */ - cycle_delta = (cycle_now - tc->cycle_last) & tc->cc->mask; - - /* convert to nanoseconds: */ - ns_offset = cyclecounter_cyc2ns(tc->cc, cycle_delta); - - /* update time stamp of timecounter_read_delta() call: */ - tc->cycle_last = cycle_now; - - return ns_offset; -} - -u64 timecounter_read(struct timecounter *tc) -{ - u64 nsec; - - /* increment time by nanoseconds since last call */ - nsec = timecounter_read_delta(tc); - nsec += tc->nsec; - tc->nsec = nsec; - - return nsec; -} -EXPORT_SYMBOL_GPL(timecounter_read); - -u64 timecounter_cyc2time(struct timecounter *tc, - cycle_t cycle_tstamp) -{ - u64 cycle_delta = (cycle_tstamp - tc->cycle_last) & tc->cc->mask; - u64 nsec; - - /* - * Instead of always treating cycle_tstamp as more recent - * than tc->cycle_last, detect when it is too far in the - * future and treat it as old time stamp instead. - */ - if (cycle_delta > tc->cc->mask / 2) { - cycle_delta = (tc->cycle_last - cycle_tstamp) & tc->cc->mask; - nsec = tc->nsec - cyclecounter_cyc2ns(tc->cc, cycle_delta); - } else { - nsec = cyclecounter_cyc2ns(tc->cc, cycle_delta) + tc->nsec; - } - - return nsec; -} -EXPORT_SYMBOL_GPL(timecounter_cyc2time); - /** * clocks_calc_mult_shift - calculate mult/shift factors for scaled math of clocks * @mult: pointer to mult variable diff --git a/kernel/time/timecounter.c b/kernel/time/timecounter.c new file mode 100644 index 0000000000000..f97fb2145fe29 --- /dev/null +++ b/kernel/time/timecounter.c @@ -0,0 +1,95 @@ +/* + * linux/kernel/time/timecounter.c + * + * based on code that migrated away from + * linux/kernel/time/clocksource.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include + +void timecounter_init(struct timecounter *tc, + const struct cyclecounter *cc, + u64 start_tstamp) +{ + tc->cc = cc; + tc->cycle_last = cc->read(cc); + tc->nsec = start_tstamp; +} +EXPORT_SYMBOL_GPL(timecounter_init); + +/** + * timecounter_read_delta - get nanoseconds since last call of this function + * @tc: Pointer to time counter + * + * When the underlying cycle counter runs over, this will be handled + * correctly as long as it does not run over more than once between + * calls. + * + * The first call to this function for a new time counter initializes + * the time tracking and returns an undefined result. + */ +static u64 timecounter_read_delta(struct timecounter *tc) +{ + cycle_t cycle_now, cycle_delta; + u64 ns_offset; + + /* read cycle counter: */ + cycle_now = tc->cc->read(tc->cc); + + /* calculate the delta since the last timecounter_read_delta(): */ + cycle_delta = (cycle_now - tc->cycle_last) & tc->cc->mask; + + /* convert to nanoseconds: */ + ns_offset = cyclecounter_cyc2ns(tc->cc, cycle_delta); + + /* update time stamp of timecounter_read_delta() call: */ + tc->cycle_last = cycle_now; + + return ns_offset; +} + +u64 timecounter_read(struct timecounter *tc) +{ + u64 nsec; + + /* increment time by nanoseconds since last call */ + nsec = timecounter_read_delta(tc); + nsec += tc->nsec; + tc->nsec = nsec; + + return nsec; +} +EXPORT_SYMBOL_GPL(timecounter_read); + +u64 timecounter_cyc2time(struct timecounter *tc, + cycle_t cycle_tstamp) +{ + u64 cycle_delta = (cycle_tstamp - tc->cycle_last) & tc->cc->mask; + u64 nsec; + + /* + * Instead of always treating cycle_tstamp as more recent + * than tc->cycle_last, detect when it is too far in the + * future and treat it as old time stamp instead. + */ + if (cycle_delta > tc->cc->mask / 2) { + cycle_delta = (tc->cycle_last - cycle_tstamp) & tc->cc->mask; + nsec = tc->nsec - cyclecounter_cyc2ns(tc->cc, cycle_delta); + } else { + nsec = cyclecounter_cyc2ns(tc->cc, cycle_delta) + tc->nsec; + } + + return nsec; +} +EXPORT_SYMBOL_GPL(timecounter_cyc2time); diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 9b75ae8f0bd06..d6ea0a8ed1dec 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -192,6 +192,21 @@ config ENABLE_MUST_CHECK suppress the "warning: ignoring return value of 'foo', declared with attribute warn_unused_result" messages. +config FIRE_WATCHDOG + bool "Provide watchdog trigger" + default n + depends on PRINTK && MSM_WATCHDOG_V2 + help + Provide a way to trigger watchdog for debugging purpose. + +config DUMP_ALL_STACKS + bool "Show all task stack information in logbuf on panic" + default n + depends on PRINTK && MSM_WATCHDOG_V2 + help + Selecting this option for debugging purpose to dump all task stack + under watchdog disable condition. + config FRAME_WARN int "Warn for stack frames larger than (needs gcc 4.4)" range 0 8192 diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 30d683e54ab5f..e8b2419725688 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1546,7 +1546,6 @@ COMPAT_SYSCALL_DEFINE5(get_mempolicy, int __user *, policy, COMPAT_SYSCALL_DEFINE3(set_mempolicy, int, mode, compat_ulong_t __user *, nmask, compat_ulong_t, maxnode) { - long err = 0; unsigned long __user *nm = NULL; unsigned long nr_bits, alloc_size; DECLARE_BITMAP(bm, MAX_NUMNODES); @@ -1555,14 +1554,13 @@ COMPAT_SYSCALL_DEFINE3(set_mempolicy, int, mode, compat_ulong_t __user *, nmask, alloc_size = ALIGN(nr_bits, BITS_PER_LONG) / 8; if (nmask) { - err = compat_get_bitmap(bm, nmask, nr_bits); + if (compat_get_bitmap(bm, nmask, nr_bits)) + return -EFAULT; nm = compat_alloc_user_space(alloc_size); - err |= copy_to_user(nm, bm, alloc_size); + if (copy_to_user(nm, bm, alloc_size)) + return -EFAULT; } - if (err) - return -EFAULT; - return sys_set_mempolicy(mode, nm, nr_bits+1); } @@ -1570,7 +1568,6 @@ COMPAT_SYSCALL_DEFINE6(mbind, compat_ulong_t, start, compat_ulong_t, len, compat_ulong_t, mode, compat_ulong_t __user *, nmask, compat_ulong_t, maxnode, compat_ulong_t, flags) { - long err = 0; unsigned long __user *nm = NULL; unsigned long nr_bits, alloc_size; nodemask_t bm; @@ -1579,14 +1576,13 @@ COMPAT_SYSCALL_DEFINE6(mbind, compat_ulong_t, start, compat_ulong_t, len, alloc_size = ALIGN(nr_bits, BITS_PER_LONG) / 8; if (nmask) { - err = compat_get_bitmap(nodes_addr(bm), nmask, nr_bits); + if (compat_get_bitmap(nodes_addr(bm), nmask, nr_bits)) + return -EFAULT; nm = compat_alloc_user_space(alloc_size); - err |= copy_to_user(nm, nodes_addr(bm), alloc_size); + if (copy_to_user(nm, nodes_addr(bm), alloc_size)) + return -EFAULT; } - if (err) - return -EFAULT; - return sys_mbind(start, len, mode, nm, nr_bits+1, flags); } diff --git a/mm/migrate.c b/mm/migrate.c index 7204f7464b3c7..79004be4ff5ab 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -37,6 +37,7 @@ #include #include #include +#include #include @@ -1470,7 +1471,6 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages, const int __user *, nodes, int __user *, status, int, flags) { - const struct cred *cred = current_cred(), *tcred; struct task_struct *task; struct mm_struct *mm; int err; @@ -1494,14 +1494,9 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages, /* * Check if this process has the right to modify the specified - * process. The right exists if the process has administrative - * capabilities, superuser privileges or the same - * userid as the target process. + * process. Use the regular "ptrace_may_access()" checks. */ - tcred = __task_cred(task); - if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) && - !uid_eq(cred->uid, tcred->suid) && !uid_eq(cred->uid, tcred->uid) && - !capable(CAP_SYS_NICE)) { + if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS)) { rcu_read_unlock(); err = -EPERM; goto out; diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5b87e0674296c..ed4e77728747d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -60,6 +60,7 @@ #include #include #include +#include #include #include @@ -1155,7 +1156,8 @@ static void change_pageblock_range(struct page *pageblock_page, * is worse than movable allocations stealing from unmovable and reclaimable * pageblocks. */ -static bool can_steal_fallback(unsigned int order, int start_mt) +static bool can_steal_fallback(unsigned int order, int start_mt, + int fallback_type, unsigned int start_order) { /* * Leaving this order check is intended, although there is @@ -1167,10 +1169,15 @@ static bool can_steal_fallback(unsigned int order, int start_mt) if (order >= pageblock_order) return true; - if (order >= pageblock_order / 2 || - start_mt == MIGRATE_RECLAIMABLE || - start_mt == MIGRATE_UNMOVABLE || - page_group_by_mobility_disabled) + /* don't let unmovable allocations cause migrations simply because of free pages */ + if ((start_mt != MIGRATE_UNMOVABLE && order >= pageblock_order / 2) || + /* only steal reclaimable page blocks for unmovable allocations */ + (start_mt == MIGRATE_UNMOVABLE && fallback_type != MIGRATE_MOVABLE && order >= pageblock_order / 2) || + /* reclaimable can steal aggressively */ + start_mt == MIGRATE_RECLAIMABLE || + /* allow unmovable allocs up to 64K without migrating blocks */ + (start_mt == MIGRATE_UNMOVABLE && start_order >= 5) || + page_group_by_mobility_disabled) return true; return false; @@ -1205,7 +1212,7 @@ static void steal_suitable_fallback(struct zone *zone, struct page *page, /* Check whether there is a suitable fallback freepage with requested order. */ static int find_suitable_fallback(struct free_area *area, unsigned int order, - int migratetype, bool *can_steal) + int migratetype, bool *can_steal, unsigned int start_order) { int i; int fallback_mt; @@ -1222,7 +1229,7 @@ static int find_suitable_fallback(struct free_area *area, unsigned int order, if (list_empty(&area->free_list[fallback_mt])) continue; - if (can_steal_fallback(order, migratetype)) + if (can_steal_fallback(order, migratetype, fallback_mt, start_order)) *can_steal = true; return fallback_mt; @@ -1247,7 +1254,7 @@ __rmqueue_fallback(struct zone *zone, unsigned int order, int start_migratetype) --current_order) { area = &(zone->free_area[current_order]); fallback_mt = find_suitable_fallback(area, current_order, - start_migratetype, &can_steal); + start_migratetype, &can_steal, order); if (fallback_mt == -1) continue; @@ -3046,10 +3053,15 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, * can deadlock because I/O on the device might not * complete. */ + u64 start_time, end_time; gfp_mask = memalloc_noio_flags(gfp_mask); + + start_time = ktime_get_ns(); page = __alloc_pages_slowpath(gfp_mask, order, zonelist, high_zoneidx, nodemask, preferred_zone, classzone_idx, migratetype); + end_time = ktime_get_ns(); + ktrace_add_mm_event(KTRACE_MM_TYPE_SLOW_PATH, end_time, end_time - start_time); } trace_mm_page_alloc(page, order, gfp_mask, migratetype); diff --git a/mm/vmscan.c b/mm/vmscan.c index 0e7f752f779ef..cccc61bc717df 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2,6 +2,7 @@ * linux/mm/vmscan.c * * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds + * Copyright (C) 2018 XiaoMi, Inc. * * Swap reorganised 29.12.95, Stephen Tweedie. * kswapd added: 7.1.96 sct @@ -52,6 +53,7 @@ #include #include +#include #include "internal.h" @@ -3350,6 +3352,10 @@ static void kswapd_try_to_sleep(pg_data_t *pgdat, int order, int classzone_idx) finish_wait(&pgdat->kswapd_wait, &wait); } +#if defined(CONFIG_ANDROID_WHETSTONE) +extern void wakeup_kmemsw_chkd(void); +#endif + /* * The background pageout daemon, started as a kernel thread * from the init process. @@ -3449,6 +3455,9 @@ static int kswapd(void *p) balanced_classzone_idx = classzone_idx; balanced_order = balance_pgdat(pgdat, order, &balanced_classzone_idx); +#if defined(CONFIG_ANDROID_WHETSTONE) + wakeup_kmemsw_chkd(); +#endif } } @@ -3525,6 +3534,43 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim) } #endif /* CONFIG_HIBERNATION */ +#ifdef CONFIG_RTMM +/* + * reclaim anon/file pages from global lru + * + * TODO: merge with shrink_all_memory()?? + */ +unsigned long reclaim_global(unsigned long nr_to_reclaim) +{ + struct reclaim_state reclaim_state; + struct scan_control sc = { + .nr_to_reclaim = max(nr_to_reclaim, SWAP_CLUSTER_MAX), + .gfp_mask = GFP_HIGHUSER_MOVABLE, + .order = 0, + .priority = DEF_PRIORITY, + .may_writepage = 1, + .may_unmap = 1, + .may_swap = 1, + }; + struct zonelist *zonelist = node_zonelist(numa_node_id(), sc.gfp_mask); + struct task_struct *p = current; + unsigned long nr_reclaimed; + + p->flags |= PF_MEMALLOC; + lockdep_set_current_reclaim_state(sc.gfp_mask); + reclaim_state.reclaimed_slab = 0; + p->reclaim_state = &reclaim_state; + + nr_reclaimed = do_try_to_free_pages(zonelist, &sc); + + p->reclaim_state = NULL; + lockdep_clear_current_reclaim_state(); + p->flags &= ~PF_MEMALLOC; + + return nr_reclaimed; +} +#endif + /* It's optimal to keep kswapds on the same CPUs as their memory, but not required for correctness. So if the last cpu in a node goes away, we get changed to run anywhere: as the first one comes back, diff --git a/mm/zpool.c b/mm/zpool.c index bacdab6e47de3..fd3ff719c32cb 100644 --- a/mm/zpool.c +++ b/mm/zpool.c @@ -18,11 +18,9 @@ #include struct zpool { - char *type; - struct zpool_driver *driver; void *pool; - struct zpool_ops *ops; + const struct zpool_ops *ops; struct list_head list; }; @@ -73,34 +71,8 @@ int zpool_unregister_driver(struct zpool_driver *driver) } EXPORT_SYMBOL(zpool_unregister_driver); -/** - * zpool_evict() - evict callback from a zpool implementation. - * @pool: pool to evict from. - * @handle: handle to evict. - * - * This can be used by zpool implementations to call the - * user's evict zpool_ops struct evict callback. - */ -int zpool_evict(void *pool, unsigned long handle) -{ - struct zpool *zpool; - - spin_lock(&pools_lock); - list_for_each_entry(zpool, &pools_head, list) { - if (zpool->pool == pool) { - spin_unlock(&pools_lock); - if (!zpool->ops || !zpool->ops->evict) - return -EINVAL; - return zpool->ops->evict(zpool, handle); - } - } - spin_unlock(&pools_lock); - - return -ENOENT; -} -EXPORT_SYMBOL(zpool_evict); - -static struct zpool_driver *zpool_get_driver(char *type) +/* this assumes @type is null-terminated. */ +static struct zpool_driver *zpool_get_driver(const char *type) { struct zpool_driver *driver; @@ -126,6 +98,41 @@ static void zpool_put_driver(struct zpool_driver *driver) module_put(driver->owner); } +/** + * zpool_has_pool() - Check if the pool driver is available + * @type The type of the zpool to check (e.g. zbud, zsmalloc) + * + * This checks if the @type pool driver is available. This will try to load + * the requested module, if needed, but there is no guarantee the module will + * still be loaded and available immediately after calling. If this returns + * true, the caller should assume the pool is available, but must be prepared + * to handle the @zpool_create_pool() returning failure. However if this + * returns false, the caller should assume the requested pool type is not + * available; either the requested pool type module does not exist, or could + * not be loaded, and calling @zpool_create_pool() with the pool type will + * fail. + * + * The @type string must be null-terminated. + * + * Returns: true if @type pool is available, false if not + */ +bool zpool_has_pool(char *type) +{ + struct zpool_driver *driver = zpool_get_driver(type); + + if (!driver) { + request_module("zpool-%s", type); + driver = zpool_get_driver(type); + } + + if (!driver) + return false; + + zpool_put_driver(driver); + return true; +} +EXPORT_SYMBOL(zpool_has_pool); + /** * zpool_create_pool() - Create a new zpool * @type The type of the zpool to create (e.g. zbud, zsmalloc) @@ -139,15 +146,17 @@ static void zpool_put_driver(struct zpool_driver *driver) * * Implementations must guarantee this to be thread-safe. * + * The @type and @name strings must be null-terminated. + * * Returns: New zpool on success, NULL on failure. */ -struct zpool *zpool_create_pool(char *type, char *name, gfp_t gfp, - struct zpool_ops *ops) +struct zpool *zpool_create_pool(const char *type, const char *name, gfp_t gfp, + const struct zpool_ops *ops) { struct zpool_driver *driver; struct zpool *zpool; - pr_info("creating pool type %s\n", type); + pr_debug("creating pool type %s\n", type); driver = zpool_get_driver(type); @@ -168,9 +177,8 @@ struct zpool *zpool_create_pool(char *type, char *name, gfp_t gfp, return NULL; } - zpool->type = driver->type; zpool->driver = driver; - zpool->pool = driver->create(name, gfp, ops); + zpool->pool = driver->create(name, gfp, ops, zpool); zpool->ops = ops; if (!zpool->pool) { @@ -180,7 +188,7 @@ struct zpool *zpool_create_pool(char *type, char *name, gfp_t gfp, return NULL; } - pr_info("created %s pool\n", type); + pr_debug("created pool type %s\n", type); spin_lock(&pools_lock); list_add(&zpool->list, &pools_head); @@ -202,7 +210,7 @@ struct zpool *zpool_create_pool(char *type, char *name, gfp_t gfp, */ void zpool_destroy_pool(struct zpool *zpool) { - pr_info("destroying pool type %s\n", zpool->type); + pr_debug("destroying pool type %s\n", zpool->driver->type); spin_lock(&pools_lock); list_del(&zpool->list); @@ -222,9 +230,9 @@ void zpool_destroy_pool(struct zpool *zpool) * * Returns: The type of zpool. */ -char *zpool_get_type(struct zpool *zpool) +const char *zpool_get_type(struct zpool *zpool) { - return zpool->type; + return zpool->driver->type; } /** @@ -347,20 +355,6 @@ u64 zpool_get_total_size(struct zpool *zpool) return zpool->driver->total_size(zpool->pool); } -static int __init init_zpool(void) -{ - pr_info("loaded\n"); - return 0; -} - -static void __exit exit_zpool(void) -{ - pr_info("unloaded\n"); -} - -module_init(init_zpool); -module_exit(exit_zpool); - MODULE_LICENSE("GPL"); MODULE_AUTHOR("Dan Streetman "); MODULE_DESCRIPTION("Common API for compressed memory storage"); diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index a8b5e749e84e7..b6d4f258cb53c 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -16,7 +16,7 @@ * struct page(s) to form a zspage. * * Usage of struct page fields: - * page->first_page: points to the first component (0-order) page + * page->private: points to the first component (0-order) page * page->index (union with page->freelist): offset of the first object * starting in this page. For the first page, this is * always 0, so we use this field (aka freelist) to point @@ -26,8 +26,7 @@ * * For _first_ page only: * - * page->private (union with page->first_page): refers to the - * component page after the first page + * page->private: refers to the component page after the first page * If the page is first_page for huge object, it stores handle. * Look at size_class->huge. * page->freelist: points to the first free object in zspage. @@ -38,6 +37,7 @@ * page->lru: links together first pages of various zspages. * Basically forming list of zspages in a fullness group. * page->mapping: class index and fullness group of the zspage + * page->inuse: the number of objects that are used in this zspage * * Usage of struct page flags: * PG_private: identifies the first component page @@ -45,9 +45,7 @@ * */ -#ifdef CONFIG_ZSMALLOC_DEBUG -#define DEBUG -#endif +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include #include @@ -62,7 +60,7 @@ #include #include #include -#include +#include #include #include #include @@ -170,17 +168,20 @@ enum zs_stat_type { OBJ_USED, CLASS_ALMOST_FULL, CLASS_ALMOST_EMPTY, - NR_ZS_STAT_TYPE, }; #ifdef CONFIG_ZSMALLOC_STAT - -static struct dentry *zs_stat_root; +#define NR_ZS_STAT_TYPE (CLASS_ALMOST_EMPTY + 1) +#else +#define NR_ZS_STAT_TYPE (OBJ_USED + 1) +#endif struct zs_size_stat { unsigned long objs[NR_ZS_STAT_TYPE]; }; +#ifdef CONFIG_ZSMALLOC_STAT +static struct dentry *zs_stat_root; #endif /* @@ -205,6 +206,8 @@ static int zs_size_classes; static const int fullness_threshold_frac = 4; struct size_class { + spinlock_t lock; + struct page *fullness_list[_ZS_NR_FULLNESS_GROUPS]; /* * Size of objects stored in this class. Must be multiple * of ZS_ALIGN. @@ -212,18 +215,12 @@ struct size_class { int size; unsigned int index; + struct zs_size_stat stats; + /* Number of PAGE_SIZE sized pages to combine to form a 'zspage' */ int pages_per_zspage; /* huge object: pages_per_zspage == 1 && maxobj_per_zspage == 1 */ bool huge; - -#ifdef CONFIG_ZSMALLOC_STAT - struct zs_size_stat stats; -#endif - - spinlock_t lock; - - struct page *fullness_list[_ZS_NR_FULLNESS_GROUPS]; }; /* @@ -247,14 +244,22 @@ struct link_free { }; struct zs_pool { - char *name; + const char *name; struct size_class **size_class; struct kmem_cache *handle_cachep; - gfp_t flags; /* allocation flags used when growing pool */ atomic_long_t pages_allocated; + struct zs_pool_stats stats; + + /* Compact classes */ + struct shrinker shrinker; + /* + * To signify that register_shrinker() was successful + * and unregister_shrinker() will not Oops. + */ + bool shrinker_enabled; #ifdef CONFIG_ZSMALLOC_STAT struct dentry *stat_dentry; #endif @@ -277,7 +282,6 @@ struct mapping_area { #endif char *vm_addr; /* address of kmap_atomic()'ed pages */ enum zs_mapmode vm_mm; /* mapping mode */ - bool huge; }; static int create_handle_cache(struct zs_pool *pool) @@ -289,14 +293,13 @@ static int create_handle_cache(struct zs_pool *pool) static void destroy_handle_cache(struct zs_pool *pool) { - if (pool->handle_cachep) - kmem_cache_destroy(pool->handle_cachep); + kmem_cache_destroy(pool->handle_cachep); } -static unsigned long alloc_handle(struct zs_pool *pool) +static unsigned long alloc_handle(struct zs_pool *pool, gfp_t gfp) { return (unsigned long)kmem_cache_alloc(pool->handle_cachep, - pool->flags & ~__GFP_HIGHMEM); + gfp & ~__GFP_HIGHMEM); } static void free_handle(struct zs_pool *pool, unsigned long handle) @@ -306,16 +309,28 @@ static void free_handle(struct zs_pool *pool, unsigned long handle) static void record_obj(unsigned long handle, unsigned long obj) { - *(unsigned long *)handle = obj; + /* + * lsb of @obj represents handle lock while other bits + * represent object value the handle is pointing so + * updating shouldn't do store tearing. + */ + WRITE_ONCE(*(unsigned long *)handle, obj); } /* zpool driver */ #ifdef CONFIG_ZPOOL -static void *zs_zpool_create(char *name, gfp_t gfp, struct zpool_ops *zpool_ops) +static void *zs_zpool_create(const char *name, gfp_t gfp, + const struct zpool_ops *zpool_ops, + struct zpool *zpool) { - return zs_create_pool(name, gfp); + /* + * Ignore global gfp flags: zs_malloc() may be invoked from + * different contexts and its caller must provide a valid + * gfp mask. + */ + return zs_create_pool(name); } static void zs_zpool_destroy(void *pool) @@ -326,7 +341,7 @@ static void zs_zpool_destroy(void *pool) static int zs_zpool_malloc(void *pool, size_t size, gfp_t gfp, unsigned long *handle) { - *handle = zs_malloc(pool, size); + *handle = zs_malloc(pool, size, gfp); return *handle ? 0 : -1; } static void zs_zpool_free(void *pool, unsigned long handle) @@ -404,26 +419,28 @@ static int is_last_page(struct page *page) return PagePrivate2(page); } -static void get_zspage_mapping(struct page *page, unsigned int *class_idx, +static void get_zspage_mapping(struct page *first_page, + unsigned int *class_idx, enum fullness_group *fullness) { unsigned long m; - BUG_ON(!is_first_page(page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); - m = (unsigned long)page->mapping; + m = (unsigned long)first_page->mapping; *fullness = m & FULLNESS_MASK; *class_idx = (m >> FULLNESS_BITS) & CLASS_IDX_MASK; } -static void set_zspage_mapping(struct page *page, unsigned int class_idx, +static void set_zspage_mapping(struct page *first_page, + unsigned int class_idx, enum fullness_group fullness) { unsigned long m; - BUG_ON(!is_first_page(page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); m = ((class_idx & CLASS_IDX_MASK) << FULLNESS_BITS) | (fullness & FULLNESS_MASK); - page->mapping = (struct address_space *)m; + first_page->mapping = (struct address_space *)m; } /* @@ -444,36 +461,40 @@ static int get_size_class_index(int size) return min(zs_size_classes - 1, idx); } -#ifdef CONFIG_ZSMALLOC_STAT - static inline void zs_stat_inc(struct size_class *class, enum zs_stat_type type, unsigned long cnt) { - class->stats.objs[type] += cnt; + if (type < NR_ZS_STAT_TYPE) + class->stats.objs[type] += cnt; } static inline void zs_stat_dec(struct size_class *class, enum zs_stat_type type, unsigned long cnt) { - class->stats.objs[type] -= cnt; + if (type < NR_ZS_STAT_TYPE) + class->stats.objs[type] -= cnt; } static inline unsigned long zs_stat_get(struct size_class *class, enum zs_stat_type type) { - return class->stats.objs[type]; + if (type < NR_ZS_STAT_TYPE) + return class->stats.objs[type]; + return 0; } -static int __init zs_stat_init(void) +#ifdef CONFIG_ZSMALLOC_STAT + +static void __init zs_stat_init(void) { - if (!debugfs_initialized()) - return -ENODEV; + if (!debugfs_initialized()) { + pr_warn("debugfs not available, stat dir not created\n"); + return; + } zs_stat_root = debugfs_create_dir("zsmalloc", NULL); if (!zs_stat_root) - return -ENOMEM; - - return 0; + pr_warn("debugfs 'zsmalloc' stat dir creation failed\n"); } static void __exit zs_stat_exit(void) @@ -481,6 +502,8 @@ static void __exit zs_stat_exit(void) debugfs_remove_recursive(zs_stat_root); } +static unsigned long zs_can_compact(struct size_class *class); + static int zs_stats_size_show(struct seq_file *s, void *v) { int i; @@ -488,14 +511,15 @@ static int zs_stats_size_show(struct seq_file *s, void *v) struct size_class *class; int objs_per_zspage; unsigned long class_almost_full, class_almost_empty; - unsigned long obj_allocated, obj_used, pages_used; + unsigned long obj_allocated, obj_used, pages_used, freeable; unsigned long total_class_almost_full = 0, total_class_almost_empty = 0; unsigned long total_objs = 0, total_used_objs = 0, total_pages = 0; + unsigned long total_freeable = 0; - seq_printf(s, " %5s %5s %11s %12s %13s %10s %10s %16s\n", + seq_printf(s, " %5s %5s %11s %12s %13s %10s %10s %16s %8s\n", "class", "size", "almost_full", "almost_empty", "obj_allocated", "obj_used", "pages_used", - "pages_per_zspage"); + "pages_per_zspage", "freeable"); for (i = 0; i < zs_size_classes; i++) { class = pool->size_class[i]; @@ -508,6 +532,7 @@ static int zs_stats_size_show(struct seq_file *s, void *v) class_almost_empty = zs_stat_get(class, CLASS_ALMOST_EMPTY); obj_allocated = zs_stat_get(class, OBJ_ALLOCATED); obj_used = zs_stat_get(class, OBJ_USED); + freeable = zs_can_compact(class); spin_unlock(&class->lock); objs_per_zspage = get_maxobj_per_zspage(class->size, @@ -515,23 +540,25 @@ static int zs_stats_size_show(struct seq_file *s, void *v) pages_used = obj_allocated / objs_per_zspage * class->pages_per_zspage; - seq_printf(s, " %5u %5u %11lu %12lu %13lu %10lu %10lu %16d\n", + seq_printf(s, " %5u %5u %11lu %12lu %13lu" + " %10lu %10lu %16d %8lu\n", i, class->size, class_almost_full, class_almost_empty, obj_allocated, obj_used, pages_used, - class->pages_per_zspage); + class->pages_per_zspage, freeable); total_class_almost_full += class_almost_full; total_class_almost_empty += class_almost_empty; total_objs += obj_allocated; total_used_objs += obj_used; total_pages += pages_used; + total_freeable += freeable; } seq_puts(s, "\n"); - seq_printf(s, " %5s %5s %11lu %12lu %13lu %10lu %10lu\n", + seq_printf(s, " %5s %5s %11lu %12lu %13lu %10lu %10lu %16s %8lu\n", "Total", "", total_class_almost_full, total_class_almost_empty, total_objs, - total_used_objs, total_pages); + total_used_objs, total_pages, "", total_freeable); return 0; } @@ -548,17 +575,19 @@ static const struct file_operations zs_stat_size_ops = { .release = single_release, }; -static int zs_pool_stat_create(char *name, struct zs_pool *pool) +static void zs_pool_stat_create(struct zs_pool *pool, const char *name) { struct dentry *entry; - if (!zs_stat_root) - return -ENODEV; + if (!zs_stat_root) { + pr_warn("no root stat dir, not creating <%s> stat dir\n", name); + return; + } entry = debugfs_create_dir(name, zs_stat_root); if (!entry) { pr_warn("debugfs dir <%s> creation failed\n", name); - return -ENOMEM; + return; } pool->stat_dentry = entry; @@ -567,10 +596,9 @@ static int zs_pool_stat_create(char *name, struct zs_pool *pool) if (!entry) { pr_warn("%s: debugfs file entry <%s> creation failed\n", name, "classes"); - return -ENOMEM; + debugfs_remove_recursive(pool->stat_dentry); + pool->stat_dentry = NULL; } - - return 0; } static void zs_pool_stat_destroy(struct zs_pool *pool) @@ -579,44 +607,23 @@ static void zs_pool_stat_destroy(struct zs_pool *pool) } #else /* CONFIG_ZSMALLOC_STAT */ - -static inline void zs_stat_inc(struct size_class *class, - enum zs_stat_type type, unsigned long cnt) +static void __init zs_stat_init(void) { } -static inline void zs_stat_dec(struct size_class *class, - enum zs_stat_type type, unsigned long cnt) -{ -} - -static inline unsigned long zs_stat_get(struct size_class *class, - enum zs_stat_type type) -{ - return 0; -} - -static int __init zs_stat_init(void) -{ - return 0; -} - static void __exit zs_stat_exit(void) { } -static inline int zs_pool_stat_create(char *name, struct zs_pool *pool) +static inline void zs_pool_stat_create(struct zs_pool *pool, const char *name) { - return 0; } static inline void zs_pool_stat_destroy(struct zs_pool *pool) { } - #endif - /* * For each size class, zspages are divided into different groups * depending on how "full" they are. This was done so that we could @@ -624,14 +631,15 @@ static inline void zs_pool_stat_destroy(struct zs_pool *pool) * the pool (not yet implemented). This function returns fullness * status of the given page. */ -static enum fullness_group get_fullness_group(struct page *page) +static enum fullness_group get_fullness_group(struct page *first_page) { int inuse, max_objects; enum fullness_group fg; - BUG_ON(!is_first_page(page)); - inuse = page->inuse; - max_objects = page->objects; + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); + + inuse = first_page->inuse; + max_objects = first_page->objects; if (inuse == 0) fg = ZS_EMPTY; @@ -651,48 +659,59 @@ static enum fullness_group get_fullness_group(struct page *page) * have. This functions inserts the given zspage into the freelist * identified by . */ -static void insert_zspage(struct page *page, struct size_class *class, - enum fullness_group fullness) +static void insert_zspage(struct size_class *class, + enum fullness_group fullness, + struct page *first_page) { struct page **head; - BUG_ON(!is_first_page(page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); if (fullness >= _ZS_NR_FULLNESS_GROUPS) return; - head = &class->fullness_list[fullness]; - if (*head) - list_add_tail(&page->lru, &(*head)->lru); - - *head = page; zs_stat_inc(class, fullness == ZS_ALMOST_EMPTY ? CLASS_ALMOST_EMPTY : CLASS_ALMOST_FULL, 1); + + head = &class->fullness_list[fullness]; + if (!*head) { + *head = first_page; + return; + } + + /* + * We want to see more ZS_FULL pages and less almost + * empty/full. Put pages with higher ->inuse first. + */ + list_add_tail(&first_page->lru, &(*head)->lru); + if (first_page->inuse >= (*head)->inuse) + *head = first_page; } /* * This function removes the given zspage from the freelist identified * by . */ -static void remove_zspage(struct page *page, struct size_class *class, - enum fullness_group fullness) +static void remove_zspage(struct size_class *class, + enum fullness_group fullness, + struct page *first_page) { struct page **head; - BUG_ON(!is_first_page(page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); if (fullness >= _ZS_NR_FULLNESS_GROUPS) return; head = &class->fullness_list[fullness]; - BUG_ON(!*head); + VM_BUG_ON_PAGE(!*head, first_page); if (list_empty(&(*head)->lru)) *head = NULL; - else if (*head == page) + else if (*head == first_page) *head = (struct page *)list_entry((*head)->lru.next, struct page, lru); - list_del_init(&page->lru); + list_del_init(&first_page->lru); zs_stat_dec(class, fullness == ZS_ALMOST_EMPTY ? CLASS_ALMOST_EMPTY : CLASS_ALMOST_FULL, 1); } @@ -707,21 +726,19 @@ static void remove_zspage(struct page *page, struct size_class *class, * fullness group. */ static enum fullness_group fix_fullness_group(struct size_class *class, - struct page *page) + struct page *first_page) { int class_idx; enum fullness_group currfg, newfg; - BUG_ON(!is_first_page(page)); - - get_zspage_mapping(page, &class_idx, &currfg); - newfg = get_fullness_group(page); + get_zspage_mapping(first_page, &class_idx, &currfg); + newfg = get_fullness_group(first_page); if (newfg == currfg) goto out; - remove_zspage(page, class, currfg); - insert_zspage(page, class, newfg); - set_zspage_mapping(page, class_idx, newfg); + remove_zspage(class, currfg, first_page); + insert_zspage(class, newfg, first_page); + set_zspage_mapping(first_page, class_idx, newfg); out: return newfg; @@ -773,7 +790,7 @@ static struct page *get_first_page(struct page *page) if (is_first_page(page)) return page; else - return page->first_page; + return (struct page *)page_private(page); } static struct page *get_next_page(struct page *page) @@ -799,7 +816,7 @@ static void *location_to_obj(struct page *page, unsigned long obj_idx) unsigned long obj; if (!page) { - BUG_ON(obj_idx); + VM_BUG_ON(obj_idx); return NULL; } @@ -832,8 +849,8 @@ static unsigned long obj_to_head(struct size_class *class, struct page *page, void *obj) { if (class->huge) { - VM_BUG_ON(!is_first_page(page)); - return *(unsigned long *)page_private(page); + VM_BUG_ON_PAGE(!is_first_page(page), page); + return page_private(page); } else return *(unsigned long *)obj; } @@ -882,8 +899,8 @@ static void free_zspage(struct page *first_page) { struct page *nextp, *tmp, *head_extra; - BUG_ON(!is_first_page(first_page)); - BUG_ON(first_page->inuse); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); + VM_BUG_ON_PAGE(first_page->inuse, first_page); head_extra = (struct page *)page_private(first_page); @@ -904,12 +921,13 @@ static void free_zspage(struct page *first_page) } /* Initialize a newly allocated zspage */ -static void init_zspage(struct page *first_page, struct size_class *class) +static void init_zspage(struct size_class *class, struct page *first_page) { unsigned long off = 0; struct page *page = first_page; - BUG_ON(!is_first_page(first_page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); + while (page) { struct page *next_page; struct link_free *link; @@ -958,7 +976,7 @@ static struct page *alloc_zspage(struct size_class *class, gfp_t flags) * Allocate individual pages and link them together as: * 1. first page->private = first sub-page * 2. all sub-pages are linked together using page->lru - * 3. each sub-page is linked to the first page using page->first_page + * 3. each sub-page is linked to the first page using page->private * * For each size class, First/Head pages are linked together using * page->lru. Also, we set PG_private to identify the first page @@ -983,7 +1001,7 @@ static struct page *alloc_zspage(struct size_class *class, gfp_t flags) if (i == 1) set_page_private(first_page, (unsigned long)page); if (i >= 1) - page->first_page = first_page; + set_page_private(page, (unsigned long)first_page); if (i >= 2) list_add(&page->lru, &prev_page->lru); if (i == class->pages_per_zspage - 1) /* last page */ @@ -991,7 +1009,7 @@ static struct page *alloc_zspage(struct size_class *class, gfp_t flags) prev_page = page; } - init_zspage(first_page, class); + init_zspage(class, first_page); first_page->freelist = location_to_obj(first_page, 0); /* Maximum number of objects we can store in this zspage */ @@ -1122,11 +1140,9 @@ static void __zs_unmap_object(struct mapping_area *area, goto out; buf = area->vm_buf; - if (!area->huge) { - buf = buf + ZS_HANDLE_SIZE; - size -= ZS_HANDLE_SIZE; - off += ZS_HANDLE_SIZE; - } + buf = buf + ZS_HANDLE_SIZE; + size -= ZS_HANDLE_SIZE; + off += ZS_HANDLE_SIZE; sizes[0] = PAGE_SIZE - off; sizes[1] = size - sizes[0]; @@ -1226,11 +1242,11 @@ static bool can_merge(struct size_class *prev, int size, int pages_per_zspage) return true; } -static bool zspage_full(struct page *page) +static bool zspage_full(struct page *first_page) { - BUG_ON(!is_first_page(page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); - return page->inuse == page->objects; + return first_page->inuse == first_page->objects; } unsigned long zs_get_total_pages(struct zs_pool *pool) @@ -1266,14 +1282,12 @@ void *zs_map_object(struct zs_pool *pool, unsigned long handle, struct page *pages[2]; void *ret; - BUG_ON(!handle); - /* * Because we use per-cpu mapping areas shared among the * pools/users, we can't allow mapping in interrupt context * because it can corrupt another users mappings. */ - BUG_ON(in_interrupt()); + WARN_ON_ONCE(in_interrupt()); /* From now on, migration cannot move the object */ pin_tag(handle); @@ -1317,8 +1331,6 @@ void zs_unmap_object(struct zs_pool *pool, unsigned long handle) struct size_class *class; struct mapping_area *area; - BUG_ON(!handle); - obj = handle_to_obj(handle); obj_to_location(obj, &page, &obj_idx); get_zspage_mapping(get_first_page(page), &class_idx, &fg); @@ -1342,8 +1354,8 @@ void zs_unmap_object(struct zs_pool *pool, unsigned long handle) } EXPORT_SYMBOL_GPL(zs_unmap_object); -static unsigned long obj_malloc(struct page *first_page, - struct size_class *class, unsigned long handle) +static unsigned long obj_malloc(struct size_class *class, + struct page *first_page, unsigned long handle) { unsigned long obj; struct link_free *link; @@ -1383,7 +1395,7 @@ static unsigned long obj_malloc(struct page *first_page, * otherwise 0. * Allocation requests with size > ZS_MAX_ALLOC_SIZE will fail. */ -unsigned long zs_malloc(struct zs_pool *pool, size_t size) +unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t gfp) { unsigned long handle, obj; struct size_class *class; @@ -1392,7 +1404,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size) if (unlikely(!size || size > ZS_MAX_ALLOC_SIZE)) return 0; - handle = alloc_handle(pool); + handle = alloc_handle(pool, gfp); if (!handle) return 0; @@ -1405,7 +1417,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size) if (!first_page) { spin_unlock(&class->lock); - first_page = alloc_zspage(class, pool->flags); + first_page = alloc_zspage(class, gfp); if (unlikely(!first_page)) { free_handle(pool, handle); return 0; @@ -1420,7 +1432,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size) class->size, class->pages_per_zspage)); } - obj = obj_malloc(first_page, class, handle); + obj = obj_malloc(class, first_page, handle); /* Now move the zspage to another fullness group, if required */ fix_fullness_group(class, first_page); record_obj(handle, obj); @@ -1430,23 +1442,17 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size) } EXPORT_SYMBOL_GPL(zs_malloc); -static void obj_free(struct zs_pool *pool, struct size_class *class, - unsigned long obj) +static void obj_free(struct size_class *class, unsigned long obj) { struct link_free *link; struct page *first_page, *f_page; unsigned long f_objidx, f_offset; void *vaddr; - int class_idx; - enum fullness_group fullness; - - BUG_ON(!obj); obj &= ~OBJ_ALLOCATED_TAG; obj_to_location(obj, &f_page, &f_objidx); first_page = get_first_page(f_page); - get_zspage_mapping(first_page, &class_idx, &fullness); f_offset = obj_idx_to_offset(f_page, f_objidx, class->size); vaddr = kmap_atomic(f_page); @@ -1482,7 +1488,7 @@ void zs_free(struct zs_pool *pool, unsigned long handle) class = pool->size_class[class_idx]; spin_lock(&class->lock); - obj_free(pool, class, obj); + obj_free(class, obj); fullness = fix_fullness_group(class, first_page); if (fullness == ZS_EMPTY) { zs_stat_dec(class, OBJ_ALLOCATED, get_maxobj_per_zspage( @@ -1498,8 +1504,8 @@ void zs_free(struct zs_pool *pool, unsigned long handle) } EXPORT_SYMBOL_GPL(zs_free); -static void zs_object_copy(unsigned long src, unsigned long dst, - struct size_class *class) +static void zs_object_copy(struct size_class *class, unsigned long dst, + unsigned long src) { struct page *s_page, *d_page; unsigned long s_objidx, d_objidx; @@ -1542,7 +1548,6 @@ static void zs_object_copy(unsigned long src, unsigned long dst, kunmap_atomic(d_addr); kunmap_atomic(s_addr); s_page = get_next_page(s_page); - BUG_ON(!s_page); s_addr = kmap_atomic(s_page); d_addr = kmap_atomic(d_page); s_size = class->size - written; @@ -1552,7 +1557,6 @@ static void zs_object_copy(unsigned long src, unsigned long dst, if (d_off >= PAGE_SIZE) { kunmap_atomic(d_addr); d_page = get_next_page(d_page); - BUG_ON(!d_page); d_addr = kmap_atomic(d_page); d_size = class->size - written; d_off = 0; @@ -1567,8 +1571,8 @@ static void zs_object_copy(unsigned long src, unsigned long dst, * Find alloced object in zspage from index object and * return handle. */ -static unsigned long find_alloced_obj(struct page *page, int index, - struct size_class *class) +static unsigned long find_alloced_obj(struct size_class *class, + struct page *page, int index) { unsigned long head; int offset = 0; @@ -1605,8 +1609,6 @@ struct zs_compact_control { /* Starting object index within @s_page which used for live object * in the subpage. */ int index; - /* how many of objects are migrated */ - int nr_migrated; }; static int migrate_zspage(struct zs_pool *pool, struct size_class *class, @@ -1617,11 +1619,10 @@ static int migrate_zspage(struct zs_pool *pool, struct size_class *class, struct page *s_page = cc->s_page; struct page *d_page = cc->d_page; unsigned long index = cc->index; - int nr_migrated = 0; int ret = 0; while (1) { - handle = find_alloced_obj(s_page, index, class); + handle = find_alloced_obj(class, s_page, index); if (!handle) { s_page = get_next_page(s_page); if (!s_page) @@ -1638,24 +1639,29 @@ static int migrate_zspage(struct zs_pool *pool, struct size_class *class, } used_obj = handle_to_obj(handle); - free_obj = obj_malloc(d_page, class, handle); - zs_object_copy(used_obj, free_obj, class); + free_obj = obj_malloc(class, d_page, handle); + zs_object_copy(class, free_obj, used_obj); index++; + /* + * record_obj updates handle's value to free_obj and it will + * invalidate lock bit(ie, HANDLE_PIN_BIT) of handle, which + * breaks synchronization using pin_tag(e,g, zs_free) so + * let's keep the lock bit. + */ + free_obj |= BIT(HANDLE_PIN_BIT); record_obj(handle, free_obj); unpin_tag(handle); - obj_free(pool, class, used_obj); - nr_migrated++; + obj_free(class, used_obj); } /* Remember last position in this iteration */ cc->s_page = s_page; cc->index = index; - cc->nr_migrated = nr_migrated; return ret; } -static struct page *alloc_target_page(struct size_class *class) +static struct page *isolate_target_page(struct size_class *class) { int i; struct page *page; @@ -1663,7 +1669,7 @@ static struct page *alloc_target_page(struct size_class *class) for (i = 0; i < _ZS_NR_FULLNESS_GROUPS; i++) { page = class->fullness_list[i]; if (page) { - remove_zspage(page, class, i); + remove_zspage(class, i, page); break; } } @@ -1671,15 +1677,22 @@ static struct page *alloc_target_page(struct size_class *class) return page; } -static void putback_zspage(struct zs_pool *pool, struct size_class *class, - struct page *first_page) +/* + * putback_zspage - add @first_page into right class's fullness list + * @pool: target pool + * @class: destination class + * @first_page: target page + * + * Return @fist_page's fullness_group + */ +static enum fullness_group putback_zspage(struct zs_pool *pool, + struct size_class *class, + struct page *first_page) { enum fullness_group fullness; - BUG_ON(!is_first_page(first_page)); - fullness = get_fullness_group(first_page); - insert_zspage(first_page, class, fullness); + insert_zspage(class, fullness, first_page); set_zspage_mapping(first_page, class->index, fullness); if (fullness == ZS_EMPTY) { @@ -1690,50 +1703,73 @@ static void putback_zspage(struct zs_pool *pool, struct size_class *class, free_zspage(first_page); } + + return fullness; } static struct page *isolate_source_page(struct size_class *class) { - struct page *page; + int i; + struct page *page = NULL; - page = class->fullness_list[ZS_ALMOST_EMPTY]; - if (page) - remove_zspage(page, class, ZS_ALMOST_EMPTY); + for (i = ZS_ALMOST_EMPTY; i >= ZS_ALMOST_FULL; i--) { + page = class->fullness_list[i]; + if (!page) + continue; + + remove_zspage(class, i, page); + break; + } return page; } -static unsigned long __zs_compact(struct zs_pool *pool, - struct size_class *class) +/* + * + * Based on the number of unused allocated objects calculate + * and return the number of pages that we can free. + */ +static unsigned long zs_can_compact(struct size_class *class) +{ + unsigned long obj_wasted; + unsigned long obj_allocated = zs_stat_get(class, OBJ_ALLOCATED); + unsigned long obj_used = zs_stat_get(class, OBJ_USED); + + if (obj_allocated <= obj_used) + return 0; + + obj_wasted = obj_allocated - obj_used; + obj_wasted /= get_maxobj_per_zspage(class->size, + class->pages_per_zspage); + + return obj_wasted * class->pages_per_zspage; +} + +static void __zs_compact(struct zs_pool *pool, struct size_class *class) { - int nr_to_migrate; struct zs_compact_control cc; struct page *src_page; struct page *dst_page = NULL; - unsigned long nr_total_migrated = 0; spin_lock(&class->lock); while ((src_page = isolate_source_page(class))) { - BUG_ON(!is_first_page(src_page)); + if (!zs_can_compact(class)) + break; - /* The goal is to migrate all live objects in source page */ - nr_to_migrate = src_page->inuse; cc.index = 0; cc.s_page = src_page; - while ((dst_page = alloc_target_page(class))) { + while ((dst_page = isolate_target_page(class))) { cc.d_page = dst_page; /* - * If there is no more space in dst_page, try to - * allocate another zspage. + * If there is no more space in dst_page, resched + * and see if anyone had allocated another zspage. */ if (!migrate_zspage(pool, class, &cc)) break; putback_zspage(pool, class, dst_page); - nr_total_migrated += cc.nr_migrated; - nr_to_migrate -= cc.nr_migrated; } /* Stop if we couldn't find slot */ @@ -1741,9 +1777,9 @@ static unsigned long __zs_compact(struct zs_pool *pool, break; putback_zspage(pool, class, dst_page); - putback_zspage(pool, class, src_page); + if (putback_zspage(pool, class, src_page) == ZS_EMPTY) + pool->stats.pages_compacted += class->pages_per_zspage; spin_unlock(&class->lock); - nr_total_migrated += cc.nr_migrated; cond_resched(); spin_lock(&class->lock); } @@ -1752,14 +1788,11 @@ static unsigned long __zs_compact(struct zs_pool *pool, putback_zspage(pool, class, src_page); spin_unlock(&class->lock); - - return nr_total_migrated; } unsigned long zs_compact(struct zs_pool *pool) { int i; - unsigned long nr_migrated = 0; struct size_class *class; for (i = zs_size_classes - 1; i >= 0; i--) { @@ -1768,13 +1801,77 @@ unsigned long zs_compact(struct zs_pool *pool) continue; if (class->index != i) continue; - nr_migrated += __zs_compact(pool, class); + __zs_compact(pool, class); } - return nr_migrated; + return pool->stats.pages_compacted; } EXPORT_SYMBOL_GPL(zs_compact); +void zs_pool_stats(struct zs_pool *pool, struct zs_pool_stats *stats) +{ + memcpy(stats, &pool->stats, sizeof(struct zs_pool_stats)); +} +EXPORT_SYMBOL_GPL(zs_pool_stats); + +static unsigned long zs_shrinker_scan(struct shrinker *shrinker, + struct shrink_control *sc) +{ + unsigned long pages_freed; + struct zs_pool *pool = container_of(shrinker, struct zs_pool, + shrinker); + + pages_freed = pool->stats.pages_compacted; + /* + * Compact classes and calculate compaction delta. + * Can run concurrently with a manually triggered + * (by user) compaction. + */ + pages_freed = zs_compact(pool) - pages_freed; + + return pages_freed ? pages_freed : SHRINK_STOP; +} + +static unsigned long zs_shrinker_count(struct shrinker *shrinker, + struct shrink_control *sc) +{ + int i; + struct size_class *class; + unsigned long pages_to_free = 0; + struct zs_pool *pool = container_of(shrinker, struct zs_pool, + shrinker); + + for (i = zs_size_classes - 1; i >= 0; i--) { + class = pool->size_class[i]; + if (!class) + continue; + if (class->index != i) + continue; + + pages_to_free += zs_can_compact(class); + } + + return pages_to_free; +} + +static void zs_unregister_shrinker(struct zs_pool *pool) +{ + if (pool->shrinker_enabled) { + unregister_shrinker(&pool->shrinker); + pool->shrinker_enabled = false; + } +} + +static int zs_register_shrinker(struct zs_pool *pool) +{ + pool->shrinker.scan_objects = zs_shrinker_scan; + pool->shrinker.count_objects = zs_shrinker_count; + pool->shrinker.batch = 0; + pool->shrinker.seeks = DEFAULT_SEEKS; + + return register_shrinker(&pool->shrinker); +} + /** * zs_create_pool - Creates an allocation pool to work from. * @flags: allocation flags used to allocate pool metadata @@ -1785,7 +1882,7 @@ EXPORT_SYMBOL_GPL(zs_compact); * On success, a pointer to the newly created pool is returned, * otherwise NULL. */ -struct zs_pool *zs_create_pool(char *name, gfp_t flags) +struct zs_pool *zs_create_pool(const char *name) { int i; struct zs_pool *pool; @@ -1855,11 +1952,15 @@ struct zs_pool *zs_create_pool(char *name, gfp_t flags) prev_class = class; } - pool->flags = flags; - - if (zs_pool_stat_create(name, pool)) - goto err; + /* debug only, don't abort if it fails */ + zs_pool_stat_create(pool, name); + /* + * Not critical, we still can use the pool + * and user can trigger compaction manually. + */ + if (zs_register_shrinker(pool) == 0) + pool->shrinker_enabled = true; return pool; err: @@ -1872,6 +1973,7 @@ void zs_destroy_pool(struct zs_pool *pool) { int i; + zs_unregister_shrinker(pool); zs_pool_stat_destroy(pool); for (i = 0; i < zs_size_classes; i++) { @@ -1913,17 +2015,10 @@ static int __init zs_init(void) zpool_register_driver(&zs_zpool_driver); #endif - ret = zs_stat_init(); - if (ret) { - pr_err("zs stat initialization failed\n"); - goto stat_fail; - } + zs_stat_init(); + return 0; -stat_fail: -#ifdef CONFIG_ZPOOL - zpool_unregister_driver(&zs_zpool_driver); -#endif notifier_fail: zs_unregister_cpu_notifier(); diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c index ec2cf37c7c944..52650ff1a3cd6 100644 --- a/net/bluetooth/bnep/core.c +++ b/net/bluetooth/bnep/core.c @@ -533,6 +533,9 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) BT_DBG(""); + if (!l2cap_is_socket(sock)) + return -EBADFD; + baswap((void *) dst, &l2cap_pi(sock->sk)->chan->dst); baswap((void *) src, &l2cap_pi(sock->sk)->chan->src); diff --git a/net/core/iovec.c b/net/core/iovec.c index e1ec45ab1e63c..4c3fd5845f4b5 100644 --- a/net/core/iovec.c +++ b/net/core/iovec.c @@ -88,6 +88,10 @@ int csum_partial_copy_fromiovecend(unsigned char *kdata, struct iovec *iov, __wsum csum = *csump; int partial_cnt = 0, err = 0; + /* No data? Done! */ + if (len == 0) + return 0; + /* Skip over the finished iovecs */ while (offset >= iov->iov_len) { offset -= iov->iov_len; diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 92cd5bf4751cf..e9a8975f2824c 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c @@ -468,6 +468,9 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, newsk->sk_backlog_rcv = dccp_v4_do_rcv; newnp->pktoptions = NULL; newnp->opt = NULL; + newnp->ipv6_mc_list = NULL; + newnp->ipv6_ac_list = NULL; + newnp->ipv6_fl_list = NULL; newnp->mcast_oif = inet6_iif(skb); newnp->mcast_hops = ipv6_hdr(skb)->hop_limit; @@ -542,6 +545,9 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, /* Clone RX bits */ newnp->rxopt.all = np->rxopt.all; + newnp->ipv6_mc_list = NULL; + newnp->ipv6_ac_list = NULL; + newnp->ipv6_fl_list = NULL; /* Clone pktoptions received with SYN */ newnp->pktoptions = NULL; diff --git a/net/ipc_router/ipc_router_core.c b/net/ipc_router/ipc_router_core.c index b0317b688d75e..47730b708838c 100644 --- a/net/ipc_router/ipc_router_core.c +++ b/net/ipc_router/ipc_router_core.c @@ -720,7 +720,7 @@ static void *msm_ipc_router_skb_to_buf(struct sk_buff_head *skb_head, unsigned int len) { struct sk_buff *temp; - unsigned int offset = 0, buf_len = 0, copy_len; + int offset = 0, buf_len = 0, copy_len; void *buf; if (!skb_head) { diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 4fcfaf8693140..9fe51f80d91e9 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -785,6 +785,12 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos, ret = -EAGAIN; break; } + /* if __tcp_splice_read() got nothing while we have + * an skb in receive queue, we do not want to loop. + * This might happen with URG data. + */ + if (!skb_queue_empty(&sk->sk_receive_queue)) + break; sk_wait_data(sk, &timeo); if (signal_pending(current)) { ret = sock_intr_errno(timeo); diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index b1f3a7dd8fb1b..918ef0385e6a5 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1624,6 +1624,14 @@ int tcp_v4_rcv(struct sk_buff *skb) if (!pskb_may_pull(skb, th->doff * 4)) goto discard_it; + + /* Assuming a trustworthy entity did the checksum and found the csum + * invalid, drop the packet. + */ + if (skb->ip_summed == CHECKSUM_COMPLETE && skb->csum_valid == 0) + goto csum_error; + + /* An explanation is required here, I think. * Packet length and doff are validated by header prediction, * provided case of th->doff==0 is eliminated. diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 1a93a39b2aab0..96c59dbd5b74a 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c @@ -367,35 +367,37 @@ static void ip6gre_tunnel_uninit(struct net_device *dev) static void ip6gre_err(struct sk_buff *skb, struct inet6_skb_parm *opt, - u8 type, u8 code, int offset, __be32 info) + u8 type, u8 code, int offset, __be32 info) { - const struct ipv6hdr *ipv6h = (const struct ipv6hdr *)skb->data; - __be16 *p = (__be16 *)(skb->data + offset); - int grehlen = offset + 4; + const struct gre_base_hdr *greh; + const struct ipv6hdr *ipv6h; + int grehlen = sizeof(*greh); struct ip6_tnl *t; + int key_off = 0; __be16 flags; + __be32 key; - flags = p[0]; - if (flags&(GRE_CSUM|GRE_KEY|GRE_SEQ|GRE_ROUTING|GRE_VERSION)) { - if (flags&(GRE_VERSION|GRE_ROUTING)) - return; - if (flags&GRE_KEY) { - grehlen += 4; - if (flags&GRE_CSUM) - grehlen += 4; - } + if (!pskb_may_pull(skb, offset + grehlen)) + return; + greh = (const struct gre_base_hdr *)(skb->data + offset); + flags = greh->flags; + if (flags & (GRE_VERSION | GRE_ROUTING)) + return; + if (flags & GRE_CSUM) + grehlen += 4; + if (flags & GRE_KEY) { + key_off = grehlen + offset; + grehlen += 4; } - /* If only 8 bytes returned, keyed message will be dropped here */ - if (!pskb_may_pull(skb, grehlen)) + if (!pskb_may_pull(skb, offset + grehlen)) return; ipv6h = (const struct ipv6hdr *)skb->data; - p = (__be16 *)(skb->data + offset); + greh = (const struct gre_base_hdr *)(skb->data + offset); + key = key_off ? *(__be32 *)(skb->data + key_off) : 0; t = ip6gre_tunnel_lookup(skb->dev, &ipv6h->daddr, &ipv6h->saddr, - flags & GRE_KEY ? - *(((__be32 *)p) + (grehlen / 4) - 1) : 0, - p[1]); + key, greh->protocol); if (t == NULL) return; diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index f29d510072c7d..54ad474c8ffd1 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1076,7 +1076,7 @@ static struct sock *tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, #ifdef CONFIG_TCP_MD5SIG newtp->af_specific = &tcp_sock_ipv6_mapped_specific; #endif - + newnp->ipv6_mc_list = NULL; newnp->ipv6_ac_list = NULL; newnp->ipv6_fl_list = NULL; newnp->pktoptions = NULL; @@ -1148,6 +1148,7 @@ static struct sock *tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, First: no IPv4 options. */ newinet->inet_opt = NULL; + newnp->ipv6_mc_list = NULL; newnp->ipv6_ac_list = NULL; newnp->ipv6_fl_list = NULL; diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index 1b095ca37aa46..bc043dc989637 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c @@ -1168,11 +1168,10 @@ static int ipxitf_ioctl(unsigned int cmd, void __user *arg) sipx->sipx_network = ipxif->if_netnum; memcpy(sipx->sipx_node, ipxif->if_node, sizeof(sipx->sipx_node)); - rc = -EFAULT; + rc = 0; if (copy_to_user(arg, &ifr, sizeof(ifr))) - break; + rc = -EFAULT; ipxitf_put(ipxif); - rc = 0; break; } case SIOCAIPXITFCRT: diff --git a/net/rmnet_data/rmnet_data_handlers.c b/net/rmnet_data/rmnet_data_handlers.c index 9d04b2f8ddd95..fa309f5fa5eac 100644 --- a/net/rmnet_data/rmnet_data_handlers.c +++ b/net/rmnet_data/rmnet_data_handlers.c @@ -411,6 +411,7 @@ static rx_handler_result_t _rmnet_map_ingress_handler(struct sk_buff *skb, else if (ckresult != RMNET_MAP_CHECKSUM_ERR_UNKNOWN_IP_VERSION && ckresult != RMNET_MAP_CHECKSUM_ERR_UNKNOWN_TRANSPORT && ckresult != RMNET_MAP_CHECKSUM_VALID_FLAG_NOT_SET + && ckresult != RMNET_MAP_CHECKSUM_VALIDATION_FAILED && ckresult != RMNET_MAP_CHECKSUM_FRAGMENTED_PACKET) { rmnet_kfree_skb(skb, RMNET_STATS_SKBFREE_INGRESS_BAD_MAP_CKSUM); diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 6c06434657996..85b3192ce5e19 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -301,8 +301,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, [NL80211_ATTR_PID] = { .type = NLA_U32 }, [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, - [NL80211_ATTR_PMKID] = { .type = NLA_BINARY, - .len = WLAN_PMKID_LEN }, + [NL80211_ATTR_PMKID] = { .len = WLAN_PMKID_LEN }, [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 4769382d9478f..9d6d229e147d0 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -3296,9 +3296,15 @@ int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, struct xfrm_state *x_new[XFRM_MAX_DEPTH]; struct xfrm_migrate *mp; + /* Stage 0 - sanity checks */ if ((err = xfrm_migrate_check(m, num_migrate)) < 0) goto out; + if (dir >= XFRM_POLICY_MAX) { + err = -EINVAL; + goto out; + } + /* Stage 1 - find policy */ if ((pol = xfrm_migrate_policy_find(sel, dir, type, net)) == NULL) { err = -ENOENT; diff --git a/security/commoncap.c b/security/commoncap.c index af871332626a7..76d8017c724a3 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -96,13 +96,16 @@ int cap_capable(const struct cred *cred, struct user_namespace *targ_ns, for (;;) { /* Do we have the necessary capabilities? */ if (ns == cred->user_ns) - return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM; - + #ifdef WT_COMPILE_FACTORY_VERSION + return 0; + #else + return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM; + #endif /* Have we tried all of the parent namespaces? */ if (ns == &init_user_ns) return -EPERM; - /* + /* * The owner of the user namespace in the parent of the * user namespace has all caps. */ diff --git a/security/inode.c b/security/inode.c index 8e7ca62078abe..b5f9474e58d83 100644 --- a/security/inode.c +++ b/security/inode.c @@ -105,7 +105,7 @@ struct dentry *securityfs_create_file(const char *name, umode_t mode, dir = parent->d_inode; mutex_lock(&dir->i_mutex); - dentry = lookup_one_len(name, parent, strlen(name)); + dentry = lookup_one_len2(name, mount, parent, strlen(name)); if (IS_ERR(dentry)) goto out; diff --git a/sound/core/pcm.c b/sound/core/pcm.c index 2a456f2d8bd53..87a31ec77bb6f 100644 --- a/sound/core/pcm.c +++ b/sound/core/pcm.c @@ -150,7 +150,9 @@ static int snd_pcm_control_ioctl(struct snd_card *card, err = -ENXIO; goto _error; } + mutex_lock(&pcm->open_mutex); err = snd_pcm_info_user(substream, info); + mutex_unlock(&pcm->open_mutex); _error: mutex_unlock(®ister_mutex); return err; @@ -158,7 +160,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card, case SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE: { int val; - + if (get_user(val, (int __user *)arg)) return -EFAULT; control->prefer_pcm_subdevice = val; diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c index 857741431fc63..1264598cd3cd7 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c @@ -115,6 +115,7 @@ static int snd_rawmidi_runtime_create(struct snd_rawmidi_substream *substream) return -ENOMEM; runtime->substream = substream; spin_lock_init(&runtime->lock); + mutex_init(&runtime->realloc_mutex); init_waitqueue_head(&runtime->sleep); INIT_WORK(&runtime->event_work, snd_rawmidi_input_event_work); runtime->event = NULL; @@ -637,8 +638,10 @@ int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream, struct snd_rawmidi_params * params) { char *newbuf; + char *oldbuf; struct snd_rawmidi_runtime *runtime = substream->runtime; - + unsigned long flags; + if (substream->append && substream->use_count > 1) return -EBUSY; snd_rawmidi_drain_output(substream); @@ -649,13 +652,22 @@ int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream, return -EINVAL; } if (params->buffer_size != runtime->buffer_size) { - newbuf = krealloc(runtime->buffer, params->buffer_size, + mutex_lock(&runtime->realloc_mutex); + newbuf = __krealloc(runtime->buffer, params->buffer_size, GFP_KERNEL); - if (!newbuf) + if (!newbuf) { + mutex_unlock(&runtime->realloc_mutex); return -ENOMEM; + } + spin_lock_irqsave(&runtime->lock, flags); + oldbuf = runtime->buffer; runtime->buffer = newbuf; runtime->buffer_size = params->buffer_size; runtime->avail = runtime->buffer_size; + spin_unlock_irqrestore(&runtime->lock, flags); + if (oldbuf != newbuf) + kfree(oldbuf); + mutex_unlock(&runtime->realloc_mutex); } runtime->avail_min = params->avail_min; substream->active_sensing = !params->no_active_sensing; @@ -667,7 +679,9 @@ int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream, struct snd_rawmidi_params * params) { char *newbuf; + char *oldbuf; struct snd_rawmidi_runtime *runtime = substream->runtime; + unsigned long flags; snd_rawmidi_drain_input(substream); if (params->buffer_size < 32 || params->buffer_size > 1024L * 1024L) { @@ -677,12 +691,21 @@ int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream, return -EINVAL; } if (params->buffer_size != runtime->buffer_size) { - newbuf = krealloc(runtime->buffer, params->buffer_size, + mutex_lock(&runtime->realloc_mutex); + newbuf = __krealloc(runtime->buffer, params->buffer_size, GFP_KERNEL); - if (!newbuf) + if (!newbuf) { + mutex_unlock(&runtime->realloc_mutex); return -ENOMEM; + } + spin_lock_irqsave(&runtime->lock, flags); + oldbuf = runtime->buffer; runtime->buffer = newbuf; runtime->buffer_size = params->buffer_size; + spin_unlock_irqrestore(&runtime->lock, flags); + if (oldbuf != newbuf) + kfree(oldbuf); + mutex_unlock(&runtime->realloc_mutex); } runtime->avail_min = params->avail_min; return 0; @@ -954,6 +977,8 @@ static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream, struct snd_rawmidi_runtime *runtime = substream->runtime; unsigned long appl_ptr; + if (userbuf) + mutex_lock(&runtime->realloc_mutex); spin_lock_irqsave(&runtime->lock, flags); while (count > 0 && runtime->avail) { count1 = runtime->buffer_size - runtime->appl_ptr; @@ -974,6 +999,7 @@ static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream, spin_unlock_irqrestore(&runtime->lock, flags); if (copy_to_user(userbuf + result, runtime->buffer + appl_ptr, count1)) { + mutex_unlock(&runtime->realloc_mutex); return result > 0 ? result : -EFAULT; } spin_lock_irqsave(&runtime->lock, flags); @@ -982,6 +1008,8 @@ static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream, count -= count1; } spin_unlock_irqrestore(&runtime->lock, flags); + if (userbuf) + mutex_unlock(&runtime->realloc_mutex); return result; } @@ -1246,10 +1274,14 @@ static long snd_rawmidi_kernel_write1(struct snd_rawmidi_substream *substream, return -EINVAL; result = 0; + if (userbuf) + mutex_lock(&runtime->realloc_mutex); spin_lock_irqsave(&runtime->lock, flags); if (substream->append) { if ((long)runtime->avail < count) { spin_unlock_irqrestore(&runtime->lock, flags); + if (userbuf) + mutex_unlock(&runtime->realloc_mutex); return -EAGAIN; } } @@ -1285,6 +1317,8 @@ static long snd_rawmidi_kernel_write1(struct snd_rawmidi_substream *substream, __end: count1 = runtime->avail < runtime->buffer_size; spin_unlock_irqrestore(&runtime->lock, flags); + if (userbuf) + mutex_unlock(&runtime->realloc_mutex); if (count1) snd_rawmidi_output_trigger(substream, 1); return result; diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c index a4dabd55e3978..f54a79fba0782 100644 --- a/sound/core/seq/seq_clientmgr.c +++ b/sound/core/seq/seq_clientmgr.c @@ -1251,8 +1251,8 @@ static int snd_seq_ioctl_set_client_info(struct snd_seq_client *client, } -/* - * CREATE PORT ioctl() +/* + * CREATE PORT ioctl() */ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, void __user *arg) @@ -1260,6 +1260,7 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, struct snd_seq_client_port *port; struct snd_seq_port_info info; struct snd_seq_port_callback *callback; + int port_idx; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1273,7 +1274,9 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, return -ENOMEM; if (client->type == USER_CLIENT && info.kernel) { - snd_seq_delete_port(client, port->addr.port); + port_idx = port->addr.port; + snd_seq_port_unlock(port); + snd_seq_delete_port(client, port_idx); return -EINVAL; } if (client->type == KERNEL_CLIENT) { @@ -1295,6 +1298,7 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, snd_seq_set_port_info(port, &info); snd_seq_system_client_ev_port_start(port->addr.client, port->addr.port); + snd_seq_port_unlock(port); if (copy_to_user(arg, &info, sizeof(info))) return -EFAULT; @@ -1302,8 +1306,8 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, return 0; } -/* - * DELETE PORT ioctl() +/* + * DELETE PORT ioctl() */ static int snd_seq_ioctl_delete_port(struct snd_seq_client *client, void __user *arg) diff --git a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c index 9c1c8d50f593e..cde2c6ca6d47e 100644 --- a/sound/core/seq/seq_ports.c +++ b/sound/core/seq/seq_ports.c @@ -121,15 +121,16 @@ static void port_subs_info_init(struct snd_seq_port_subs_info *grp) grp->close = NULL; } - -/* create a port, port number is returned (-1 on failure) */ +/* create a port, port number is returned (-1 on failure); +* the caller needs to unref the port via snd_seq_port_unlock() appropriately +*/ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, int port) { unsigned long flags; struct snd_seq_client_port *new_port, *p; int num = -1; - + /* sanity check */ if (snd_BUG_ON(!client)) return NULL; @@ -151,6 +152,7 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, snd_use_lock_init(&new_port->use_lock); port_subs_info_init(&new_port->c_src); port_subs_info_init(&new_port->c_dest); + snd_use_lock_use(&new_port->use_lock); num = port >= 0 ? port : 0; mutex_lock(&client->ports_mutex); @@ -165,9 +167,9 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, list_add_tail(&new_port->list, &p->list); client->num_ports++; new_port->addr.port = num; /* store the port number in the port */ + sprintf(new_port->name, "port-%d", num); write_unlock_irqrestore(&client->ports_lock, flags); mutex_unlock(&client->ports_mutex); - sprintf(new_port->name, "port-%d", num); return new_port; } diff --git a/sound/core/timer.c b/sound/core/timer.c index 9d543fab20551..592c93cbbb081 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -305,8 +305,6 @@ int snd_timer_open(struct snd_timer_instance **ti, return 0; } -static int _snd_timer_stop(struct snd_timer_instance *timeri, int event); - /* * close a timer instance */ @@ -395,7 +393,6 @@ unsigned long snd_timer_resolution(struct snd_timer_instance *timeri) static void snd_timer_notify1(struct snd_timer_instance *ti, int event) { struct snd_timer *timer; - unsigned long flags; unsigned long resolution = 0; struct snd_timer_instance *ts; struct timespec tstamp; @@ -419,34 +416,66 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event) return; if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) return; - spin_lock_irqsave(&timer->lock, flags); list_for_each_entry(ts, &ti->slave_active_head, active_list) if (ts->ccallback) ts->ccallback(ts, event + 100, &tstamp, resolution); - spin_unlock_irqrestore(&timer->lock, flags); } -static int snd_timer_start1(struct snd_timer *timer, struct snd_timer_instance *timeri, - unsigned long sticks) +/* start/continue a master timer */ +static int snd_timer_start1(struct snd_timer_instance *timeri, + bool start, unsigned long ticks) { + struct snd_timer *timer; + int result; + unsigned long flags; + + timer = timeri->timer; + if (!timer) + return -EINVAL; + + spin_lock_irqsave(&timer->lock, flags); + if (timer->card && timer->card->shutdown) { + result = -ENODEV; + goto unlock; + } + if (timeri->flags & (SNDRV_TIMER_IFLG_RUNNING | + SNDRV_TIMER_IFLG_START)) { + result = -EBUSY; + goto unlock; + } + + if (start) + timeri->ticks = timeri->cticks = ticks; + else if (!timeri->cticks) + timeri->cticks = 1; + timeri->pticks = 0; + list_move_tail(&timeri->active_list, &timer->active_list_head); if (timer->running) { if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) goto __start_now; timer->flags |= SNDRV_TIMER_FLG_RESCHED; timeri->flags |= SNDRV_TIMER_IFLG_START; - return 1; /* delayed start */ + result = 1; /* delayed start */ } else { - timer->sticks = sticks; + if (start) + timer->sticks = ticks; timer->hw.start(timer); __start_now: timer->running++; timeri->flags |= SNDRV_TIMER_IFLG_RUNNING; - return 0; + result = 0; } + snd_timer_notify1(timeri, start ? SNDRV_TIMER_EVENT_START : + SNDRV_TIMER_EVENT_CONTINUE); + unlock: + spin_unlock_irqrestore(&timer->lock, flags); + return result; } -static int snd_timer_start_slave(struct snd_timer_instance *timeri) +/* start/continue a slave timer */ +static int snd_timer_start_slave(struct snd_timer_instance *timeri, + bool start) { unsigned long flags; @@ -460,88 +489,37 @@ static int snd_timer_start_slave(struct snd_timer_instance *timeri) spin_lock(&timeri->timer->lock); list_add_tail(&timeri->active_list, &timeri->master->slave_active_head); + snd_timer_notify1(timeri, start ? SNDRV_TIMER_EVENT_START : + SNDRV_TIMER_EVENT_CONTINUE); spin_unlock(&timeri->timer->lock); } spin_unlock_irqrestore(&slave_active_lock, flags); return 1; /* delayed start */ } -/* - * start the timer instance - */ -int snd_timer_start(struct snd_timer_instance *timeri, unsigned int ticks) -{ - struct snd_timer *timer; - int result = -EINVAL; - unsigned long flags; - - if (timeri == NULL || ticks < 1) - return -EINVAL; - if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) { - result = snd_timer_start_slave(timeri); - if (result >= 0) - snd_timer_notify1(timeri, SNDRV_TIMER_EVENT_START); - return result; - } - timer = timeri->timer; - if (timer == NULL) - return -EINVAL; - if (timer->card && timer->card->shutdown) - return -ENODEV; - spin_lock_irqsave(&timer->lock, flags); - if (timeri->flags & (SNDRV_TIMER_IFLG_RUNNING | - SNDRV_TIMER_IFLG_START)) { - result = -EBUSY; - goto unlock; - } - timeri->ticks = timeri->cticks = ticks; - timeri->pticks = 0; - result = snd_timer_start1(timer, timeri, ticks); - unlock: - spin_unlock_irqrestore(&timer->lock, flags); - if (result >= 0) - snd_timer_notify1(timeri, SNDRV_TIMER_EVENT_START); - return result; -} - -static int _snd_timer_stop(struct snd_timer_instance *timeri, int event) +/* stop/pause a master timer */ +static int snd_timer_stop1(struct snd_timer_instance *timeri, bool stop) { struct snd_timer *timer; + int result = 0; unsigned long flags; - if (snd_BUG_ON(!timeri)) - return -ENXIO; - - if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) { - spin_lock_irqsave(&slave_active_lock, flags); - if (!(timeri->flags & SNDRV_TIMER_IFLG_RUNNING)) { - spin_unlock_irqrestore(&slave_active_lock, flags); - return -EBUSY; - } - if (timeri->timer) - spin_lock(&timeri->timer->lock); - timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING; - list_del_init(&timeri->ack_list); - list_del_init(&timeri->active_list); - if (timeri->timer) - spin_unlock(&timeri->timer->lock); - spin_unlock_irqrestore(&slave_active_lock, flags); - goto __end; - } timer = timeri->timer; if (!timer) return -EINVAL; spin_lock_irqsave(&timer->lock, flags); if (!(timeri->flags & (SNDRV_TIMER_IFLG_RUNNING | SNDRV_TIMER_IFLG_START))) { - spin_unlock_irqrestore(&timer->lock, flags); - return -EBUSY; + result = -EBUSY; + goto unlock; } list_del_init(&timeri->ack_list); list_del_init(&timeri->active_list); - if (timer->card && timer->card->shutdown) { - spin_unlock_irqrestore(&timer->lock, flags); - return 0; + if (timer->card && timer->card->shutdown) + goto unlock; + if (stop) { + timeri->cticks = timeri->ticks; + timeri->pticks = 0; } if ((timeri->flags & SNDRV_TIMER_IFLG_RUNNING) && !(--timer->running)) { @@ -556,13 +534,49 @@ static int _snd_timer_stop(struct snd_timer_instance *timeri, int event) } } timeri->flags &= ~(SNDRV_TIMER_IFLG_RUNNING | SNDRV_TIMER_IFLG_START); + snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP : + SNDRV_TIMER_EVENT_CONTINUE); + unlock: spin_unlock_irqrestore(&timer->lock, flags); - __end: - if (event != SNDRV_TIMER_EVENT_RESOLUTION) - snd_timer_notify1(timeri, event); + return result; +} + +/* stop/pause a slave timer */ +static int snd_timer_stop_slave(struct snd_timer_instance *timeri, bool stop) +{ + unsigned long flags; + + spin_lock_irqsave(&slave_active_lock, flags); + if (!(timeri->flags & SNDRV_TIMER_IFLG_RUNNING)) { + spin_unlock_irqrestore(&slave_active_lock, flags); + return -EBUSY; + } + timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING; + if (timeri->timer) { + spin_lock(&timeri->timer->lock); + list_del_init(&timeri->ack_list); + list_del_init(&timeri->active_list); + snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP : + SNDRV_TIMER_EVENT_CONTINUE); + spin_unlock(&timeri->timer->lock); + } + spin_unlock_irqrestore(&slave_active_lock, flags); return 0; } +/* + * start the timer instance + */ +int snd_timer_start(struct snd_timer_instance *timeri, unsigned int ticks) +{ + if (timeri == NULL || ticks < 1) + return -EINVAL; + if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) + return snd_timer_start_slave(timeri, true); + else + return snd_timer_start1(timeri, true, ticks); +} + /* * stop the timer instance. * @@ -570,21 +584,10 @@ static int _snd_timer_stop(struct snd_timer_instance *timeri, int event) */ int snd_timer_stop(struct snd_timer_instance *timeri) { - struct snd_timer *timer; - unsigned long flags; - int err; - - err = _snd_timer_stop(timeri, SNDRV_TIMER_EVENT_STOP); - if (err < 0) - return err; - timer = timeri->timer; - if (!timer) - return -EINVAL; - spin_lock_irqsave(&timer->lock, flags); - timeri->cticks = timeri->ticks; - timeri->pticks = 0; - spin_unlock_irqrestore(&timer->lock, flags); - return 0; + if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) + return snd_timer_stop_slave(timeri, true); + else + return snd_timer_stop1(timeri, true); } /* @@ -592,32 +595,10 @@ int snd_timer_stop(struct snd_timer_instance *timeri) */ int snd_timer_continue(struct snd_timer_instance *timeri) { - struct snd_timer *timer; - int result = -EINVAL; - unsigned long flags; - - if (timeri == NULL) - return result; if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) - return snd_timer_start_slave(timeri); - timer = timeri->timer; - if (! timer) - return -EINVAL; - if (timer->card && timer->card->shutdown) - return -ENODEV; - spin_lock_irqsave(&timer->lock, flags); - if (timeri->flags & SNDRV_TIMER_IFLG_RUNNING) { - result = -EBUSY; - goto unlock; - } - if (!timeri->cticks) - timeri->cticks = 1; - timeri->pticks = 0; - result = snd_timer_start1(timer, timeri, timer->sticks); - unlock: - spin_unlock_irqrestore(&timer->lock, flags); - snd_timer_notify1(timeri, SNDRV_TIMER_EVENT_CONTINUE); - return result; + return snd_timer_start_slave(timeri, false); + else + return snd_timer_start1(timeri, false, 0); } /* @@ -625,7 +606,10 @@ int snd_timer_continue(struct snd_timer_instance *timeri) */ int snd_timer_pause(struct snd_timer_instance * timeri) { - return _snd_timer_stop(timeri, SNDRV_TIMER_EVENT_PAUSE); + if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) + return snd_timer_stop_slave(timeri, false); + else + return snd_timer_stop1(timeri, false); } /* @@ -1936,6 +1920,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, tu = file->private_data; unit = tu->tread ? sizeof(struct snd_timer_tread) : sizeof(struct snd_timer_read); + mutex_lock(&tu->ioctl_lock); spin_lock_irq(&tu->qlock); while ((long)count - result >= unit) { while (!tu->qused) { @@ -1951,7 +1936,9 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, add_wait_queue(&tu->qchange_sleep, &wait); spin_unlock_irq(&tu->qlock); + mutex_unlock(&tu->ioctl_lock); schedule(); + mutex_lock(&tu->ioctl_lock); spin_lock_irq(&tu->qlock); remove_wait_queue(&tu->qchange_sleep, &wait); @@ -1989,6 +1976,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, } _error: spin_unlock_irq(&tu->qlock); + mutex_unlock(&tu->ioctl_lock); return result > 0 ? result : err; } diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h index a09703a2b2c18..5484c6596943b 100644 --- a/sound/pci/hda/hda_priv.h +++ b/sound/pci/hda/hda_priv.h @@ -15,7 +15,7 @@ #ifndef __SOUND_HDA_PRIV_H #define __SOUND_HDA_PRIV_H -#include +#include #include #include diff --git a/sound/soc/codecs/msm8x16-wcd.c b/sound/soc/codecs/msm8x16-wcd.c index f6c7839aa2684..c72ea29207c7d 100644 --- a/sound/soc/codecs/msm8x16-wcd.c +++ b/sound/soc/codecs/msm8x16-wcd.c @@ -1,4 +1,5 @@ /* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -33,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -98,7 +100,7 @@ enum { #define SPK_PMD 2 #define SPK_PMU 3 -#define MICBIAS_DEFAULT_VAL 1800000 +#define MICBIAS_DEFAULT_VAL 2400000 #define MICBIAS_MIN_VAL 1600000 #define MICBIAS_STEP_SIZE 50000 @@ -132,8 +134,10 @@ enum { static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1); static struct snd_soc_dai_driver msm8x16_wcd_i2s_dai[]; -/* By default enable the internal speaker boost */ -static bool spkr_boost_en = true; + +static struct switch_dev accdet_data; +static int accdet_state; +static bool spkr_boost_en; #define MSM8X16_WCD_ACQUIRE_LOCK(x) \ mutex_lock_nested(&x, SINGLE_DEPTH_NESTING) @@ -955,7 +959,8 @@ static void msm8x16_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, msm8x16_wcd_compute_impedance(codec, impedance_l, impedance_r, zl, zr, high); - pr_debug("%s: RL %d ohm, RR %d ohm\n", __func__, *zl, *zr); + + pr_err("%s: RL %d ohm, RR %d ohm\n", __func__, *zl, *zr); pr_debug("%s: Impedance detection completed\n", __func__); } @@ -1162,6 +1167,11 @@ static int __msm8x16_wcd_reg_read(struct snd_soc_codec *codec, pr_debug("%s reg = %x\n", __func__, reg); mutex_lock(&msm8x16_wcd->io_lock); pdata = snd_soc_card_get_drvdata(codec->component.card); + + if (pdata == NULL) { + mutex_unlock(&msm8x16_wcd->io_lock); + return ret; + } if (MSM8X16_WCD_IS_TOMBAK_REG(reg)) ret = msm8x16_wcd_spmi_read(reg, 1, &temp); else if (MSM8X16_WCD_IS_DIGITAL_REG(reg)) { @@ -1218,6 +1228,11 @@ static int __msm8x16_wcd_reg_write(struct snd_soc_codec *codec, mutex_lock(&msm8x16_wcd->io_lock); pdata = snd_soc_card_get_drvdata(codec->component.card); + + if (pdata == NULL) { + mutex_unlock(&msm8x16_wcd->io_lock); + return ret; + } if (MSM8X16_WCD_IS_TOMBAK_REG(reg)) ret = msm8x16_wcd_spmi_write(reg, 1, &val); else if (MSM8X16_WCD_IS_DIGITAL_REG(reg)) { @@ -4073,6 +4088,9 @@ void wcd_imped_config(struct snd_soc_codec *codec, value = wcd_get_impedance_value(imped); +#ifdef WT_COMPILE_FACTORY_VERSION + value = 16; +#endif if (value < wcd_imped_val[0]) { pr_debug("%s, detected impedance is less than 4 Ohm\n", __func__); @@ -4086,6 +4104,9 @@ void wcd_imped_config(struct snd_soc_codec *codec, codec_version = get_codec_version(msm8x16_wcd); + pr_err("%s codec_version %d imped %u set_gain %d\n", __func__, + codec_version, value, set_gain); + if (set_gain) { switch (codec_version) { case TOMBAK_1_0: @@ -4223,14 +4244,23 @@ static int msm8x16_wcd_lo_dac_event(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_PRE_PMU: snd_soc_update_bits(codec, MSM8X16_WCD_A_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10); + + #ifdef CONFIG_D1_ROSY + snd_soc_update_bits(codec, + MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 0x20, 0x00); + #else snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 0x20, 0x20); + #endif snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 0x80, 0x80); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x08, 0x08); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x40, 0x40); +#if defined(CONFIG_D1_ROSY) + msleep(5); +#endif break; case SND_SOC_DAPM_POST_PMU: snd_soc_update_bits(codec, @@ -4308,6 +4338,17 @@ static int msm8x16_wcd_hphr_dac_event(struct snd_soc_dapm_widget *w, return 0; } +void msm8x16_wcd_codec_set_headset_state(u32 state) +{ + switch_set_state((struct switch_dev *)&accdet_data, state); + accdet_state = state; +} + +int msm8x16_wcd_codec_get_headset_state(void) +{ + pr_debug("%s accdet_state = %d\n", __func__, accdet_state); + return accdet_state; +} static int msm8x16_wcd_hph_pa_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { @@ -4432,6 +4473,9 @@ static const struct snd_soc_dapm_route audio_map[] = { {"Ext Spk", NULL, "Ext Spk Switch"}, {"Ext Spk Switch", "On", "HPHL PA"}, {"Ext Spk Switch", "On", "HPHR PA"}, + #if defined (CONFIG_D1_ROSY) + {"Ext Spk Switch", "On", "LINEOUT PA"}, + #endif {"HPHL PA", NULL, "HPHL"}, {"HPHR PA", NULL, "HPHR"}, @@ -5093,9 +5137,15 @@ static const struct snd_soc_dapm_widget msm8x16_wcd_dapm_widgets[] = { SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), +#ifdef CONFIG_D1_ROSY + SND_SOC_DAPM_PGA_E("LINEOUT PA", MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, + 5, 1 , NULL, 0, msm8x16_wcd_codec_enable_lo_pa, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), +#else SND_SOC_DAPM_PGA_E("LINEOUT PA", MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 5, 0 , NULL, 0, msm8x16_wcd_codec_enable_lo_pa, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), +#endif SND_SOC_DAPM_SUPPLY("VDD_SPKDRV", SND_SOC_NOPM, 0, 0, msm89xx_wcd_codec_enable_vdd_spkr, @@ -5852,6 +5902,15 @@ static int msm8x16_wcd_codec_probe(struct snd_soc_codec *codec) wcd_mbhc_init(&msm8x16_wcd_priv->mbhc, codec, &mbhc_cb, &intr_ids, wcd_mbhc_registers, true); + accdet_data.name = "h2w"; + accdet_data.index = 0; + accdet_data.state = 0; + + ret = switch_dev_register(&accdet_data); + if (ret) { + dev_err(codec->dev, "%s: Failed to register h2w\n", __func__); + return -ENOMEM; + } msm8x16_wcd_priv->mclk_enabled = false; msm8x16_wcd_priv->clock_active = false; diff --git a/sound/soc/codecs/wcd-mbhc-v2.c b/sound/soc/codecs/wcd-mbhc-v2.c index e24ee3b71b2aa..aa7772070033c 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.c +++ b/sound/soc/codecs/wcd-mbhc-v2.c @@ -1,4 +1,5 @@ /* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -67,6 +68,11 @@ enum wcd_mbhc_cs_mb_en_flag { WCD_MBHC_EN_NONE, }; + +#ifdef CONFIG_C3B_BQ2560X +static int wt_correct_accessory_type; +#endif + static void wcd_mbhc_jack_report(struct wcd_mbhc *mbhc, struct snd_soc_jack *jack, int status, int mask) { @@ -335,11 +341,15 @@ static int wcd_event_notify(struct notifier_block *self, unsigned long val, wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_PULLUP); else /* enable current source and disable mb, pullup*/ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); + wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) + +#else /* configure cap settings properly when micbias is disabled */ if (mbhc->mbhc_cb->set_cap_mode) mbhc->mbhc_cb->set_cap_mode(codec, micbias1, false); +#endif break; case WCD_EVENT_PRE_HPHL_PA_OFF: mutex_lock(&mbhc->hphl_pa_lock); @@ -355,7 +365,7 @@ static int wcd_event_notify(struct notifier_block *self, unsigned long val, wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); else /* Disable micbias, pullup & enable cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); + wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); mutex_unlock(&mbhc->hphl_pa_lock); break; case WCD_EVENT_PRE_HPHR_PA_OFF: @@ -372,7 +382,7 @@ static int wcd_event_notify(struct notifier_block *self, unsigned long val, wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); else /* Disable micbias, pullup & enable cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); + wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); mutex_unlock(&mbhc->hphr_pa_lock); break; case WCD_EVENT_PRE_HPHL_PA_ON: @@ -558,8 +568,9 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - pr_debug("%s: enter insertion %d hph_status %x\n", - __func__, insertion, mbhc->hph_status); + + printk("%s: enter insertion %d hph_status %x, jack_type %d, current_plug %u\n", + __func__, insertion, mbhc->hph_status, jack_type, mbhc->current_plug); if (!insertion) { /* Report removal */ mbhc->hph_status &= ~jack_type; @@ -600,7 +611,10 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, jack_type, mbhc->hph_status); wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, mbhc->hph_status, WCD_MBHC_JACK_MASK); + msm8x16_wcd_codec_set_headset_state(mbhc->hph_status); + #if 0 wcd_mbhc_set_and_turnoff_hph_padac(mbhc); + #endif hphrocp_off_report(mbhc, SND_JACK_OC_HPHR); hphlocp_off_report(mbhc, SND_JACK_OC_HPHL); mbhc->current_plug = MBHC_PLUG_TYPE_NONE; @@ -716,6 +730,7 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, (mbhc->hph_status | SND_JACK_MECHANICAL), WCD_MBHC_JACK_MASK); wcd_mbhc_clr_and_turnon_hph_padac(mbhc); + msm8x16_wcd_codec_set_headset_state(mbhc->hph_status); } pr_debug("%s: leave hph_status %x\n", __func__, mbhc->hph_status); } @@ -812,7 +827,8 @@ static void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, bool anc_mic_found = false; enum snd_jack_types jack_type; - pr_debug("%s: enter current_plug(%d) new_plug(%d)\n", + + printk("%s: enter current_plug(%d) new_plug(%d)\n", __func__, mbhc->current_plug, plug_type); WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); @@ -822,6 +838,10 @@ static void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, goto exit; } +#ifdef CONFIG_C3B_BQ2560X + wt_correct_accessory_type = false; +#endif + if (plug_type == MBHC_PLUG_TYPE_HEADPHONE) { /* * Nothing was reported previously @@ -834,7 +854,35 @@ static void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, SND_JACK_HEADPHONE); if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADSET); + + #ifndef CONFIG_C3B_BQ2560X wcd_mbhc_report_plug(mbhc, 1, SND_JACK_UNSUPPORTED); + #else + /* + * calculate impedance detection + * If Zl and Zr > 20k then it is special accessory + * otherwise unsupported cable. + */ + if (mbhc->impedance_detect) { + mbhc->mbhc_cb->compute_impedance(mbhc, + &mbhc->zl, &mbhc->zr); + pr_err("%s: RL %d ohm, RR %d ohm\n", __func__, mbhc->zl, mbhc->zr); + if ((mbhc->zl > 20000) && (mbhc->zr > 20000)) { + pr_debug("%s: special accessory \n", __func__); + /* Toggle switch back */ + if (mbhc->mbhc_cfg->swap_gnd_mic && + mbhc->mbhc_cfg->swap_gnd_mic(mbhc->codec)) { + pr_debug("%s: US_EU gpio present,flip switch again\n" + , __func__); + } + wcd_mbhc_report_plug(mbhc, 1, SND_JACK_HEADSET); + wt_correct_accessory_type = true; + } else { + wcd_mbhc_report_plug(mbhc, 1, SND_JACK_UNSUPPORTED); + } + } + #endif + } else if (plug_type == MBHC_PLUG_TYPE_HEADSET) { if (mbhc->mbhc_cfg->enable_anc_mic_detect) anc_mic_found = wcd_mbhc_detect_anc_plug_type(mbhc); @@ -852,7 +900,8 @@ static void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, if (mbhc->mbhc_cfg->detect_extn_cable) { /* High impedance device found. Report as LINEOUT */ wcd_mbhc_report_plug(mbhc, 1, SND_JACK_LINEOUT); - pr_debug("%s: setup mic trigger for further detection\n", + + printk("%s: setup mic trigger for further detection\n", __func__); /* Disable HW FSM and current source */ @@ -1079,9 +1128,9 @@ static void wcd_enable_mbhc_supply(struct wcd_mbhc *mbhc, WCD_MBHC_EN_PULLUP); else wcd_enable_curr_micbias(mbhc, - WCD_MBHC_EN_CS); + WCD_MBHC_EN_MB); } else if (plug_type == MBHC_PLUG_TYPE_HEADPHONE) { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); + wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); } else { wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_NONE); } @@ -1196,6 +1245,7 @@ static void wcd_correct_swch_plug(struct work_struct *work) plug_type = MBHC_PLUG_TYPE_INVALID; } + printk("%s button check: plug_type %d\n", __func__, plug_type); do { cross_conn = wcd_check_cross_conn(mbhc); try++; @@ -1208,7 +1258,8 @@ static void wcd_correct_swch_plug(struct work_struct *work) pr_debug("%s: cross con found, start polling\n", __func__); plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - pr_debug("%s: Plug found, plug type is %d\n", + + printk("%s cross_conn check: Plug found, plug type is %d\n", __func__, plug_type); goto correct_plug_type; } @@ -1306,7 +1357,8 @@ static void wcd_correct_swch_plug(struct work_struct *work) * This is due to GND/MIC switch didn't * work, Report unsupported plug. */ - pr_debug("%s: switch didnt work\n", + + printk("%s cross_conn check: switch didnt work\n", __func__); plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; goto report; @@ -1333,7 +1385,8 @@ static void wcd_correct_swch_plug(struct work_struct *work) */ if (mbhc->mbhc_cfg->swap_gnd_mic && mbhc->mbhc_cfg->swap_gnd_mic(codec)) { - pr_debug("%s: US_EU gpio present,flip switch\n" + + printk("%s cross_conn check: US_EU gpio present,flip switch\n" , __func__); continue; } @@ -1343,12 +1396,16 @@ static void wcd_correct_swch_plug(struct work_struct *work) WCD_MBHC_REG_READ(WCD_MBHC_HPHL_SCHMT_RESULT, hphl_sch); WCD_MBHC_REG_READ(WCD_MBHC_MIC_SCHMT_RESULT, mic_sch); if (hs_comp_res && !(hphl_sch || mic_sch)) { - pr_debug("%s: cable is extension cable\n", __func__); + + printk("%s: cable is extension cable\n", __func__); plug_type = MBHC_PLUG_TYPE_HIGH_HPH; wrk_complete = true; } else { pr_debug("%s: cable might be headset: %d\n", __func__, plug_type); + + printk("%s: hs_comp_res %u, hphl_sch %u, mic_sch %u\n", + __func__, hs_comp_res, hphl_sch, mic_sch); if (!(plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP)) { plug_type = MBHC_PLUG_TYPE_HEADSET; /* @@ -1362,7 +1419,8 @@ static void wcd_correct_swch_plug(struct work_struct *work) MBHC_PLUG_TYPE_ANC_HEADPHONE)) && !wcd_swch_level_remove(mbhc) && !mbhc->btn_press_intr) { - pr_debug("%s: cable is %sheadset\n", + + printk("%s: cable is %sheadset\n", __func__, ((spl_hs_count == WCD_MBHC_SPL_HS_CNT) ? @@ -1414,6 +1472,14 @@ static void wcd_correct_swch_plug(struct work_struct *work) mbhc->btn_press_intr); WCD_MBHC_RSC_LOCK(mbhc); wcd_mbhc_find_plug_and_report(mbhc, plug_type); + + #ifdef CONFIG_C3B_BQ2560X + if (wt_correct_accessory_type == true) { + plug_type = MBHC_PLUG_TYPE_HEADSET; + wt_correct_accessory_type = false; + } + #endif + WCD_MBHC_RSC_UNLOCK(mbhc); enable_supply: if (mbhc->mbhc_cb->mbhc_micbias_control) @@ -1440,8 +1506,17 @@ static void wcd_correct_swch_plug(struct work_struct *work) wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, true); WCD_MBHC_RSC_UNLOCK(mbhc); } - if (mbhc->mbhc_cb->set_cap_mode) + if (mbhc->mbhc_cb->set_cap_mode) { +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) + + /*bug 225893 ,20161111,add,headset button erro*/ + if (plug_type == MBHC_PLUG_TYPE_HEADSET) { + mbhc->mbhc_cb->set_cap_mode(codec, micbias1, true); + pr_debug("%s:set_cap_mode micbias1=%d, micbias2 = %d==>true , MBHC_PLUG_TYPE_HEADSET\n", __func__, micbias1, micbias2); + } else +#endif mbhc->mbhc_cb->set_cap_mode(codec, micbias1, micbias2); + } if (mbhc->mbhc_cb->hph_pull_down_ctrl) mbhc->mbhc_cb->hph_pull_down_ctrl(codec, true); @@ -1503,7 +1578,8 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, !detection_type); - pr_debug("%s: mbhc->current_plug: %d detection_type: %d\n", __func__, + + printk("%s: mbhc->current_plug: %d detection_type: %d\n", __func__, mbhc->current_plug, detection_type); wcd_cancel_hs_detect_plug(mbhc, &mbhc->correct_plug_swch); @@ -1883,6 +1959,8 @@ static void wcd_btn_lpress_fn(struct work_struct *work) mbhc = container_of(dwork, struct wcd_mbhc, mbhc_btn_dwork); WCD_MBHC_REG_READ(WCD_MBHC_BTN_RESULT, btn_result); + + printk("%s: current_plug %d, long button press %x\n", __func__, mbhc->current_plug, mbhc->buttons_pressed); if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) { pr_debug("%s: Reporting long button press event, btn_result: %d\n", __func__, btn_result); @@ -1923,7 +2001,8 @@ static irqreturn_t wcd_mbhc_btn_press_handler(int irq, void *data) int mask; unsigned long msec_val; - pr_debug("%s: enter\n", __func__); + + printk("%s: enter, current_plug %d\n", __func__, mbhc->current_plug); complete(&mbhc->btn_press_compl); WCD_MBHC_RSC_LOCK(mbhc); wcd_cancel_btn_work(mbhc); @@ -1973,7 +2052,8 @@ static irqreturn_t wcd_mbhc_release_handler(int irq, void *data) struct wcd_mbhc *mbhc = data; int ret; - pr_debug("%s: enter\n", __func__); + + printk("%s: enter, current_plug %d\n", __func__, mbhc->current_plug); WCD_MBHC_RSC_LOCK(mbhc); if (wcd_swch_level_remove(mbhc)) { pr_debug("%s: Switch level is low ", __func__); @@ -2000,8 +2080,9 @@ static irqreturn_t wcd_mbhc_release_handler(int irq, void *data) if (mbhc->buttons_pressed & WCD_MBHC_JACK_BUTTON_MASK) { ret = wcd_cancel_btn_work(mbhc); if (ret == 0) { - pr_debug("%s: Reporting long button release event\n", - __func__); + + printk("%s: Reporting long button release event %x\n", + __func__, mbhc->buttons_pressed); wcd_mbhc_jack_report(mbhc, &mbhc->button_jack, 0, mbhc->buttons_pressed); } else { @@ -2009,6 +2090,8 @@ static irqreturn_t wcd_mbhc_release_handler(int irq, void *data) pr_debug("%s: Switch irq kicked in, ignore\n", __func__); } else { + + printk("%s: reporting btn press and release %x\n", __func__, mbhc->buttons_pressed); pr_debug("%s: Reporting btn press\n", __func__); wcd_mbhc_jack_report(mbhc, diff --git a/sound/soc/codecs/wcd-mbhc-v2.h b/sound/soc/codecs/wcd-mbhc-v2.h index bc48cbff45769..dce5b26f6ba44 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.h +++ b/sound/soc/codecs/wcd-mbhc-v2.h @@ -527,3 +527,4 @@ static inline void wcd_mbhc_deinit(struct wcd_mbhc *mbhc) #endif #endif /* __WCD_MBHC_V2_H__ */ +extern void msm8x16_wcd_codec_set_headset_state(u32 state); diff --git a/sound/soc/msm/AW87319_Audio_M.c b/sound/soc/msm/AW87319_Audio_M.c new file mode 100644 index 0000000000000..f6e24e29cd0b1 --- /dev/null +++ b/sound/soc/msm/AW87319_Audio_M.c @@ -0,0 +1,454 @@ +/************************************************************************** +* AW87319_Audio.c +* +* Create Date : +* +* Modify Date : +* +* Create by : AWINIC Technology CO., LTD +* +* Version : 0.9, 2016/02/15 +**************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define AW87319_I2C_NAME "AW87319_PA" +#define AW87319_I2C_BUS 0 +#define AW87319_I2C_ADDR 0x58 + +unsigned char AW87319_Audio_Reciver(void); +unsigned char AW87319_Audio_Speaker(void); +unsigned char AW87319_Audio_OFF(void); + + +unsigned char aw87319_hw_on(void); +unsigned char aw87319_hw_off(void); +unsigned char aw87319_sw_on(void); +unsigned char aw87319_sw_off(void); + +static ssize_t aw87319_get_reg(struct device *cd, struct device_attribute *attr, char *buf); +static ssize_t aw87319_set_reg(struct device *cd, struct device_attribute *attr, const char *buf, size_t len); +static ssize_t aw87319_set_swen(struct device *cd, struct device_attribute *attr, const char *buf, size_t len); +static ssize_t aw87319_get_swen(struct device *cd, struct device_attribute *attr, char *buf); +static ssize_t aw87319_set_hwen(struct device *cd, struct device_attribute *attr, const char *buf, size_t len); +static ssize_t aw87319_get_hwen(struct device *cd, struct device_attribute *attr, char *buf); + +static DEVICE_ATTR(reg, 0660, aw87319_get_reg, aw87319_set_reg); +static DEVICE_ATTR(swen, 0660, aw87319_get_swen, aw87319_set_swen); +static DEVICE_ATTR(hwen, 0660, aw87319_get_hwen, aw87319_set_hwen); + +struct i2c_client *aw87319_pa_client; +int aw87319_rst; +struct pinctrl *aw87319ctrl = NULL; +struct pinctrl_state *aw87319_rst_high = NULL; +struct pinctrl_state *aw87319_rst_low = NULL; + + + + + + +char Spk_Pa_Flag[] = " "; + +static void aw87319_pa_pwron(void) +{ + pr_debug("%s enter\n", __func__); + gpio_direction_output(aw87319_rst, false); + msleep(1); + gpio_direction_output(aw87319_rst, true); + msleep(10); +} + +static void aw87319_pa_pwroff(void) +{ + pr_debug("%s enter\n", __func__); + gpio_direction_output(aw87319_rst, false); + msleep(1); +} + + + + + +unsigned char I2C_write_reg(unsigned char addr, unsigned char reg_data) +{ + char ret; + u8 wdbuf[512] = {0}; + + struct i2c_msg msgs[] = { + { + .addr = aw87319_pa_client->addr, + .flags = 0, + .len = 2, + .buf = wdbuf, + }, + }; + + wdbuf[0] = addr; + wdbuf[1] = reg_data; + + if (NULL == aw87319_pa_client) { + pr_err("msg %s aw87319_pa_client is NULL\n", __func__); + return -EPERM; + } + + ret = i2c_transfer(aw87319_pa_client->adapter, msgs, 1); + if (ret < 0) + pr_err("msg %s i2c read error: %d\n", __func__, ret); + + return ret; +} + +unsigned char I2C_read_reg(unsigned char addr) +{ + unsigned char ret; + u8 rdbuf[512] = {0}; + + struct i2c_msg msgs[] = { + { + .addr = aw87319_pa_client->addr, + .flags = 0, + .len = 1, + .buf = rdbuf, + }, + { + .addr = aw87319_pa_client->addr, + .flags = I2C_M_RD, + .len = 1, + .buf = rdbuf, + }, + }; + + rdbuf[0] = addr; + + if (NULL == aw87319_pa_client) { + pr_err("msg %s aw87319_pa_client is NULL\n", __func__); + return -EPERM; + } + + ret = i2c_transfer(aw87319_pa_client->adapter, msgs, 2); + if (ret < 0) + pr_err("msg %s i2c read error: %d\n", __func__, ret); + + return rdbuf[0]; +} + + + + + +unsigned char AW87319_Audio_Reciver(void) +{ + aw87319_hw_on(); + + I2C_write_reg(0x05, 0x03); + + I2C_write_reg(0x01, 0x02); + I2C_write_reg(0x01, 0x06); + + return 0; +} + +unsigned char AW87319_Audio_Speaker(void) +{ + aw87319_hw_on(); + + I2C_write_reg(0x02, 0x28); + I2C_write_reg(0x03, 0x05); + I2C_write_reg(0x04, 0x04); + I2C_write_reg(0x05, 0x0D); + #if defined CONFIG_D1_ROSY + I2C_write_reg(0x06, 0x05); + #else + I2C_write_reg(0x06, 0x03); + #endif + I2C_write_reg(0x07, 0x52); + I2C_write_reg(0x08, 0x28); + I2C_write_reg(0x09, 0x02); + + I2C_write_reg(0x01, 0x03); + I2C_write_reg(0x01, 0x07); + + return 0; +} + + +unsigned char AW87319_Audio_OFF(void) +{ + I2C_write_reg(0x01, 0x00); + aw87319_hw_off(); + + return 0; +} + + + + +unsigned char aw87319_sw_on(void) +{ + unsigned char reg; + reg = I2C_read_reg(0x01); + reg |= 0x04; + I2C_write_reg(0x01, reg); + + return 0; +} + +unsigned char aw87319_sw_off(void) +{ + unsigned char reg; + reg = I2C_read_reg(0x01); + reg &= 0xFB; + I2C_write_reg(0x01, reg); + + return 0; +} + +unsigned char aw87319_hw_on(void) +{ + aw87319_pa_pwron(); + I2C_write_reg(0x64, 0x2C); + + return 0; +} + +unsigned char aw87319_hw_off(void) +{ + aw87319_pa_pwroff(); + + return 0; +} + + + +static ssize_t aw87319_get_reg(struct device *cd, struct device_attribute *attr, char *buf) +{ + unsigned char reg_val; + ssize_t len = 0; + u8 i; + for (i = 0; i < 0x10; i++) { + reg_val = I2C_read_reg(i); + len += snprintf(buf+len, PAGE_SIZE-len, "reg%2X = 0x%2X, ", i, reg_val); + } + + return len; +} + +static ssize_t aw87319_set_reg(struct device *cd, struct device_attribute *attr, const char *buf, size_t len) +{ + unsigned int databuf[2]; + if (2 == sscanf(buf, "%x %x", &databuf[0], &databuf[1])) { + I2C_write_reg(databuf[0], databuf[1]); + } + return len; +} + +static ssize_t aw87319_get_swen(struct device *cd, struct device_attribute *attr, char *buf) +{ + ssize_t len = 0; + len += snprintf(buf+len, PAGE_SIZE-len, "aw87319_sw_on(void)\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "echo 1 > swen\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "aw87319_sw_off(void)\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "echo 0 > swen\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "\n"); + + return len; +} + +static ssize_t aw87319_set_swen(struct device *cd, struct device_attribute *attr, const char *buf, size_t len) +{ + unsigned int databuf[16]; + + sscanf(buf, "%d", &databuf[0]); + if (databuf[0] == 0) { + aw87319_sw_off(); + } else { + aw87319_sw_on(); + } + + return len; +} + +static ssize_t aw87319_get_hwen(struct device *cd, struct device_attribute *attr, char *buf) +{ + ssize_t len = 0; + len += snprintf(buf+len, PAGE_SIZE-len, "aw87319_hw_on(void)\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "echo 1 > hwen\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "aw87319_hw_off(void)\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "echo 0 > hwen\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "\n"); + + return len; +} + +static ssize_t aw87319_set_hwen(struct device *cd, struct device_attribute *attr, const char *buf, size_t len) +{ + unsigned int databuf[16]; + + sscanf(buf, "%d", &databuf[0]); + if (databuf[0] == 0) { + aw87319_hw_off(); + } else { + aw87319_hw_on(); + } + + return len; +} + + +static int aw87319_create_sysfs(struct i2c_client *client) +{ + int err; + struct device *dev = &(client->dev); + + err = device_create_file(dev, &dev_attr_reg); + err = device_create_file(dev, &dev_attr_swen); + err = device_create_file(dev, &dev_attr_hwen); + return err; +} + + + + + +static int aw87319_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + unsigned char reg_value; + unsigned char cnt = 5; + int err = 0; + + pr_debug("%s Enter\n", __func__); + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + err = -ENODEV; + goto exit_check_functionality_failed; + } + + + aw87319_rst = of_get_named_gpio(client->dev.of_node, "qcom,ext_pa_spk_aw87319_rst", 0); + if (aw87319_rst < 0) { + err = -ENODEV; + goto exit_gpio_get_failed; + } + if (gpio_request_one(aw87319_rst, GPIOF_DIR_OUT , "spk_enable")) { + pr_err("%s: request spk_pa_gpio fail!\n", __func__); + goto exit_gpio_request_failed; + } + + pr_debug("%s: aw87319_rst = %d \n", __func__, aw87319_rst); + aw87319_pa_client = client; + + aw87319_hw_on(); + msleep(10); + + while (cnt > 0) { + I2C_write_reg(0x64, 0x2C); + reg_value = I2C_read_reg(0x00); + printk("AW87319 CHIPID=0x%2x\n", reg_value); + if (reg_value == 0x9B) { + break; + } + cnt--; + msleep(10); + } + if (!cnt) { + err = -ENODEV; + aw87319_hw_off(); + strncpy(Spk_Pa_Flag, "S88537A12", 9); + pr_err("%s:can not find AW87319, board is S88537A12\n!", __func__); + goto exit_create_singlethread; + } + + aw87319_create_sysfs(client); + + aw87319_hw_off(); + + return 0; + +exit_create_singlethread: + aw87319_pa_client = NULL; +exit_gpio_request_failed: + gpio_free(aw87319_rst); +exit_gpio_get_failed: +exit_check_functionality_failed: + return err; +} + +static int aw87319_i2c_remove(struct i2c_client *client) +{ + aw87319_pa_client = NULL; + return 0; +} + +static const struct i2c_device_id aw87319_i2c_id[] = { + { AW87319_I2C_NAME, 0 }, + { } +}; + + +static const struct of_device_id extpa_of_match[] = { + {.compatible = "awinic,aw87319_pa"}, + {}, +}; + +static struct i2c_driver aw87319_i2c_driver = { + .driver = { + .owner = THIS_MODULE, + .name = AW87319_I2C_NAME, + .of_match_table = extpa_of_match, +}, + .probe = aw87319_i2c_probe, + .remove = aw87319_i2c_remove, + .id_table = aw87319_i2c_id, +}; + +static int __init aw87319_pa_init(void) +{ + int ret; + printk("%s Enter\n", __func__); + + ret = i2c_add_driver(&aw87319_i2c_driver); + if (ret) { + printk("****[%s] Unable to register driver (%d)\n", __func__, ret); + return ret; + } + return 0; +} + +static void __exit aw87319_pa_exit(void) +{ + printk("%s Enter\n", __func__); + i2c_del_driver(&aw87319_i2c_driver); +} + + +subsys_initcall(aw87319_pa_init); +module_exit(aw87319_pa_exit); + +MODULE_AUTHOR(""); +MODULE_DESCRIPTION("AWINIC AW87319 PA driver"); +MODULE_LICENSE("GPL"); + diff --git a/sound/soc/msm/Kconfig b/sound/soc/msm/Kconfig index 640b926861337..c0de03f346a18 100644 --- a/sound/soc/msm/Kconfig +++ b/sound/soc/msm/Kconfig @@ -250,6 +250,9 @@ config SND_SOC_MSM8909 the machine drivers and the corresponding DAI-links. +config SND_SOC_AW87319 + tristate "Build AWINIC AW87319 ASoc Speaker PA" + config SND_SOC_MDM9640 tristate "SoC Machine driver for MDM9640 boards" depends on ARCH_MDM9640 diff --git a/sound/soc/msm/Makefile b/sound/soc/msm/Makefile index 163f985fbb044..afa2435144fe4 100644 --- a/sound/soc/msm/Makefile +++ b/sound/soc/msm/Makefile @@ -41,6 +41,9 @@ obj-$(CONFIG_SND_SOC_MDM9607) += snd-soc-mdm9607.o snd-soc-msm8909-objs := msm8952.o msm-audio-pinctrl.o obj-$(CONFIG_SND_SOC_MSM8909) += snd-soc-msm8909.o +#for AW87319 sound Speaker PA +obj-$(CONFIG_SND_SOC_AW87319) += AW87319_Audio_M.o + # for MDM9640 sound card driver snd-soc-mdm9640-objs := mdm9640.o obj-$(CONFIG_SND_SOC_MDM9640) += snd-soc-mdm9640.o \ No newline at end of file diff --git a/sound/soc/msm/msm8952.c b/sound/soc/msm/msm8952.c index 5caf6075a6486..dce8368df463c 100644 --- a/sound/soc/msm/msm8952.c +++ b/sound/soc/msm/msm8952.c @@ -1,4 +1,5 @@ /* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -25,6 +26,7 @@ #include #include #include +#include #include #include "qdsp6v2/msm-pcm-routing-v2.h" #include "msm-audio-pinctrl.h" @@ -47,11 +49,26 @@ #define QUIN_MI2S_ID (1 << 4) #define DEFAULT_MCLK_RATE 9600000 - +#if defined(CONFIG_C3N_SMB358) +#define AW8736_MODE 5 +#elif defined(CONFIG_C3B_BQ2560X) +#define AW8736_MODE 3 +#else +#define AW8738_MODE 5 +#endif #define WCD_MBHC_DEF_RLOADS 5 #define MAX_WSA_CODEC_NAME_LENGTH 80 #define MSM_DT_MAX_PROP_SIZE 80 +#define EXT_CLASS_D_EN_DELAY 13000 +#define EXT_CLASS_D_DIS_DELAY 3000 +#define EXT_CLASS_D_DELAY_DELTA 2000 + +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) || defined(CONFIG_D1_ROSY) +#else +#define A13_AW87319_SPK_PA 1 +#define A12_AW8738_SPK_PA 2 +#endif enum btsco_rates { RATE_8KHZ_ID, RATE_16KHZ_ID, @@ -72,6 +89,17 @@ static atomic_t quat_mi2s_clk_ref; static atomic_t quin_mi2s_clk_ref; static atomic_t auxpcm_mi2s_clk_ref; +static int headset_gpio; +static int spk_pa_gpio; +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) || defined(CONFIG_D1_ROSY) +#else +static int Spk_Pa_Id; + +static struct delayed_work lineout_amp_enable; +static struct delayed_work lineout_amp_dualmode; +static struct delayed_work lineout_hs_sw_enable; +#endif + static int msm8952_enable_dig_cdc_clk(struct snd_soc_codec *codec, int enable, bool dapm); static bool msm8952_swap_gnd_mic(struct snd_soc_codec *codec); @@ -80,6 +108,10 @@ static int msm8952_mclk_event(struct snd_soc_dapm_widget *w, static int msm8952_wsa_switch_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event); +#if defined (CONFIG_D1_ROSY) +extern unsigned char AW87319_Audio_Speaker(void); +extern unsigned char AW87319_Audio_OFF(void); +#endif /* * Android L spec * Need to report LINEIN @@ -93,9 +125,9 @@ static struct wcd_mbhc_config mbhc_cfg = { .swap_gnd_mic = NULL, .hs_ext_micbias = false, .key_code[0] = KEY_MEDIA, - .key_code[1] = KEY_VOICECOMMAND, - .key_code[2] = KEY_VOLUMEUP, - .key_code[3] = KEY_VOLUMEDOWN, + .key_code[1] = KEY_PREVIOUSSONG_NEW, + .key_code[2] = KEY_NEXTSONG_NEW, + .key_code[3] = KEY_VOICECOMMAND, .key_code[4] = 0, .key_code[5] = 0, .key_code[6] = 0, @@ -168,6 +200,11 @@ static const char *const btsco_rate_text[] = {"BTSCO_RATE_8KHZ", static const char *const proxy_rx_ch_text[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"}; static const char *const vi_feed_ch_text[] = {"One", "Two"}; +static const char *const lineout_text[] = {"DISABLE", "ENABLE", "DUALMODE"}; +#if defined(CONFIG_D1_ROSY) +#else +static const char *const hs_amp_text[] = {"DISABLE", "ENABLE"}; +#endif static char const *mi2s_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96", "KHZ_192"}; @@ -254,6 +291,11 @@ int is_ext_spk_gpio_support(struct platform_device *pdev, pr_err("%s: Invalid external speaker gpio: %d", __func__, pdata->spk_ext_pa_gpio); return -EINVAL; + + #ifdef CONFIG_C3B_BQ2560X + if (gpio_request_one(pdata->spk_ext_pa_gpio, GPIOF_DIR_OUT , "spk_enable")) + dev_err(&pdev->dev, "%s: request spk_ext_pa_gpio fail!\n", __func__); + #endif } } return 0; @@ -261,6 +303,8 @@ int is_ext_spk_gpio_support(struct platform_device *pdev, static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable) { + #if defined(CONFIG_D1_ROSY) + #else struct snd_soc_card *card = codec->component.card; struct msm8916_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); int ret; @@ -270,11 +314,21 @@ static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable) pdata->spk_ext_pa_gpio); return false; } - + #endif pr_debug("%s: %s external speaker PA\n", __func__, enable ? "Enable" : "Disable"); if (enable) { + + #ifdef CONFIG_C3B_BQ2560X + pr_debug("%s spk pa mode %d\n", __func__, AW8736_MODE); + for (ret = 0; ret < AW8736_MODE; ret++) { + gpio_direction_output(pdata->spk_ext_pa_gpio, false); + gpio_direction_output(pdata->spk_ext_pa_gpio, true); + } + #elif defined(CONFIG_D1_ROSY) + AW87319_Audio_Speaker(); + #else ret = msm_gpioset_activate(CLIENT_WCD_INT, "ext_spk_gpio"); if (ret) { pr_err("%s: gpio set cannot be de-activated %s\n", @@ -282,7 +336,17 @@ static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable) return ret; } gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, enable); + #endif } else { + + #ifdef CONFIG_C3B_BQ2560X + gpio_direction_output(pdata->spk_ext_pa_gpio, false); + /* time takes disable the external power amplifier */ + usleep_range(EXT_CLASS_D_DIS_DELAY, + EXT_CLASS_D_DIS_DELAY + EXT_CLASS_D_DELAY_DELTA); + #elif defined(CONFIG_D1_ROSY) + AW87319_Audio_OFF(); + #else gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, enable); ret = msm_gpioset_suspend(CLIENT_WCD_INT, "ext_spk_gpio"); if (ret) { @@ -290,6 +354,7 @@ static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable) __func__, "ext_spk_gpio"); return ret; } + #endif } return 0; } @@ -715,6 +780,217 @@ static int msm8952_enable_dig_cdc_clk(struct snd_soc_codec *codec, return ret; } +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) +static void msm8952_ext_hs_control(u32 enable) +{ + gpio_direction_output(headset_gpio, enable); + pr_err("%s: %s [hjf] headset 111PAs.\n", __func__, + enable ? "Enable" : "Disable"); +} +static void msm8952_ext_spk_control(u32 enable) +{ + int i = 0; + + if (enable) { + /* Open external audio PA device */ + for (i = 0; i < AW8736_MODE; i++) { + gpio_direction_output(spk_pa_gpio, false); + gpio_direction_output(spk_pa_gpio, true); + } + usleep_range(EXT_CLASS_D_EN_DELAY, + EXT_CLASS_D_EN_DELAY + EXT_CLASS_D_DELAY_DELTA); + } else { + gpio_direction_output(spk_pa_gpio, false); + /* time takes disable the external power amplifier */ + usleep_range(EXT_CLASS_D_DIS_DELAY, + EXT_CLASS_D_DIS_DELAY + EXT_CLASS_D_DELAY_DELTA); + } + + pr_err("%s: %s [hjf] external speaker 222PAs.\n", __func__, + enable ? "Enable" : "Disable"); +} +static void msm8x16_ext_spk_delayed_dualmode(u32 enable) +{ + int i = 0; + + /* Open the headset device */ + gpio_direction_output(headset_gpio, true); + usleep_range(EXT_CLASS_D_EN_DELAY, + EXT_CLASS_D_EN_DELAY + EXT_CLASS_D_DELAY_DELTA); + + for (i = 0; i < AW8736_MODE; i++) { + gpio_direction_output(spk_pa_gpio, false); + gpio_direction_output(spk_pa_gpio, true); + } + usleep_range(EXT_CLASS_D_EN_DELAY, + EXT_CLASS_D_EN_DELAY + EXT_CLASS_D_DELAY_DELTA); + + pr_debug("%s: Enable external speaker PAs dualmode.\n", __func__); +} +#elif defined(CONFIG_D1_ROSY) +static void msm8952_ext_spk_control(u32 enable) +{ + if (enable) { + AW87319_Audio_Speaker(); + } else { + AW87319_Audio_OFF(); + } + + pr_debug("%s: external speaker PAs %s.\n", __func__, enable ? "Enable" : "Disable"); +} +#else +static void msm8952_ext_hs_control(u32 enable) +{ + gpio_direction_output(headset_gpio, enable); + pr_err("%s: %s headset 111PAs.\n", __func__, + enable ? "Enable" : "Disable"); +} + +static void msm8952_ext_hs_delay_enable(struct work_struct *work) +{ + gpio_direction_output(headset_gpio, true); + pr_err("%s: headset 111PAs.\n", __func__); +} + +extern unsigned char AW87319_Audio_Speaker(void); +extern unsigned char AW87319_Audio_OFF(void); +static void AW8738_Audio_Ctl(bool enable) +{ + int i = 0; + if (enable) { + /* Open external audio PA device */ + for (i = 0; i < AW8738_MODE; i++) { + gpio_direction_output(spk_pa_gpio, false); + gpio_direction_output(spk_pa_gpio, true); + } + usleep_range(EXT_CLASS_D_EN_DELAY, + EXT_CLASS_D_EN_DELAY + EXT_CLASS_D_DELAY_DELTA); + } else { + /* Disable external audio PA device */ + gpio_direction_output(spk_pa_gpio, false); + usleep_range(EXT_CLASS_D_DIS_DELAY, + EXT_CLASS_D_DIS_DELAY + EXT_CLASS_D_DELAY_DELTA); + } + +} +static void msm8952_ext_spk_control(u32 enable) +{ + if (enable) { + /* Open external audio PA device */ + if (A13_AW87319_SPK_PA == Spk_Pa_Id) { + AW87319_Audio_Speaker(); + } else if (A12_AW8738_SPK_PA == Spk_Pa_Id) { + AW8738_Audio_Ctl(enable); + } + } else { + /* Disable external audio PA device */ + if (A13_AW87319_SPK_PA == Spk_Pa_Id) { + AW87319_Audio_OFF(); + } else if (A12_AW8738_SPK_PA == Spk_Pa_Id) { + AW8738_Audio_Ctl(enable); + } + } + pr_debug("%s: external speaker PAs %s.\n", __func__, enable ? "Enable" : "Disable"); +} + +static void msm8952_ext_spk__delayed_enable(struct work_struct *work) +{ + if (A13_AW87319_SPK_PA == Spk_Pa_Id) + AW87319_Audio_Speaker(); + else if (A12_AW8738_SPK_PA == Spk_Pa_Id) + AW8738_Audio_Ctl(true); + + pr_debug("%s: external speaker enable.\n", __func__); +} + +static void msm8x16_ext_spk_delayed_dualmode(struct work_struct *work) +{ + /* Open the headset device */ + gpio_direction_output(headset_gpio, true); + usleep_range(EXT_CLASS_D_EN_DELAY, EXT_CLASS_D_EN_DELAY + EXT_CLASS_D_DELAY_DELTA); + + /* Open the speaker device */ + if (A13_AW87319_SPK_PA == Spk_Pa_Id) + AW87319_Audio_Speaker(); + else if (A12_AW8738_SPK_PA == Spk_Pa_Id) + AW8738_Audio_Ctl(true); + + pr_debug("%s: Enable external speaker PAs dualmode.\n", __func__); +} +#endif +#if defined(CONFIG_D1_ROSY) +#else +static int headset_status_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_debug("%s: get headset_status_get\n", __func__); + return 0; +} + +static int headset_status_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int state = 0; + state = ucontrol->value.integer.value[0]; + pr_debug("%s: set external speaker PA mode:%d\n", __func__, state); + + switch (state) { + case 1: + #if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) + msm8952_ext_hs_control(1); + #else + schedule_delayed_work(&lineout_hs_sw_enable, msecs_to_jiffies(50)); + #endif + break; + case 0: + msm8952_ext_hs_control(0); + break; + default: + pr_err("%s: Unexpected input value\n", __func__); + break; + } + return 0; +} +#endif +static int lineout_status_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_debug("%s: get lineout_status_get\n", __func__); + return 0; +} +static int lineout_status_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int state = 0; + state = ucontrol->value.integer.value[0]; + pr_debug("%s: external speaker PA mode:%d\n", __func__, state); + + switch (state) { + case 1: + #if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) || defined(CONFIG_D1_ROSY) + msm8952_ext_spk_control(1); + #else + schedule_delayed_work(&lineout_amp_enable, msecs_to_jiffies(50)); + #endif + break; + case 0: + msm8952_ext_spk_control(0); + break; + case 2: + #if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) + msm8x16_ext_spk_delayed_dualmode(1); + #elif defined(CONFIG_D1_ROSY) + msm8952_ext_spk_control(1); + #else + schedule_delayed_work(&lineout_amp_dualmode, msecs_to_jiffies(50)); + #endif + break; + default: + pr_err("%s: Unexpected input value\n", __func__); + break; + } + return 0; +} static int msm_btsco_rate_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -1001,6 +1277,11 @@ static const struct soc_enum msm_snd_enum[] = { vi_feed_ch_text), SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(mi2s_rx_sample_rate_text), mi2s_rx_sample_rate_text), + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(lineout_text), lineout_text), + #if defined(CONFIG_D1_ROSY) + #else + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(hs_amp_text), hs_amp_text), + #endif }; static const struct snd_kcontrol_new msm_snd_controls[] = { @@ -1018,6 +1299,13 @@ static const struct snd_kcontrol_new msm_snd_controls[] = { msm_proxy_rx_ch_get, msm_proxy_rx_ch_put), SOC_ENUM_EXT("VI_FEED_TX Channels", msm_snd_enum[5], msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), + SOC_ENUM_EXT("Lineout_1 amp", msm_snd_enum[7], + lineout_status_get, lineout_status_put), + #if defined(CONFIG_D1_ROSY) + #else + SOC_ENUM_EXT("headset amp", msm_snd_enum[8], + headset_status_get, headset_status_put), + #endif SOC_ENUM_EXT("MI2S_RX SampleRate", msm_snd_enum[6], mi2s_rx_sample_rate_get, mi2s_rx_sample_rate_put), }; @@ -1167,6 +1455,11 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) pr_debug("%s(): substream = %s stream = %d\n", __func__, substream->name, substream->stream); + if (!q6core_is_adsp_ready()) { + pr_err("%s(): adsp not ready\n", __func__); + return -EINVAL; + } + /* * configure the slave select to * invalid state for internal codec @@ -1257,6 +1550,11 @@ static int msm_prim_auxpcm_startup(struct snd_pcm_substream *substream) pr_debug("%s(): substream = %s\n", __func__, substream->name); + if (!q6core_is_adsp_ready()) { + pr_err("%s(): adsp not ready\n", __func__); + return -EINVAL; + } + /* mux config to route the AUX MI2S */ if (pdata->vaddr_gpio_mux_mic_ctl) { val = ioread32(pdata->vaddr_gpio_mux_mic_ctl); @@ -1323,6 +1621,12 @@ static int msm_sec_mi2s_snd_startup(struct snd_pcm_substream *substream) __func__); return 0; } + + if (!q6core_is_adsp_ready()) { + pr_err("%s(): adsp not ready\n", __func__); + return -EINVAL; + } + if ((pdata->ext_pa & SEC_MI2S_ID) == SEC_MI2S_ID) { if (pdata->vaddr_gpio_mux_spkr_ctl) { val = ioread32(pdata->vaddr_gpio_mux_spkr_ctl); @@ -1396,6 +1700,12 @@ static int msm_quat_mi2s_snd_startup(struct snd_pcm_substream *substream) pr_debug("%s(): substream = %s stream = %d\n", __func__, substream->name, substream->stream); + + if (!q6core_is_adsp_ready()) { + pr_err("%s(): adsp not ready\n", __func__); + return -EINVAL; + } + if (pdata->vaddr_gpio_mux_mic_ctl) { val = ioread32(pdata->vaddr_gpio_mux_mic_ctl); val = val | 0x02020002; @@ -1454,6 +1764,12 @@ static int msm_quin_mi2s_snd_startup(struct snd_pcm_substream *substream) pr_debug("%s(): substream = %s stream = %d\n", __func__, substream->name, substream->stream); + + if (!q6core_is_adsp_ready()) { + pr_err("%s(): adsp not ready\n", __func__); + return -EINVAL; + } + if (pdata->vaddr_gpio_mux_quin_ctl) { val = ioread32(pdata->vaddr_gpio_mux_quin_ctl); val = val | 0x00000001; @@ -1515,7 +1831,9 @@ static void *def_msm8952_wcd_mbhc_cal(void) return NULL; #define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(msm8952_wcd_cal)->X) = (Y)) - S(v_hs_max, 1500); +/*--- +bug 264424 ,zhanghao,modify,20170522,fix is can not identfiy headset --*/ +/*--- +bug 329872 ,yangrun,modify,20171229,fix the problem that delay identfiy headset --*/ + S(v_hs_max, 1700); #undef S #define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(msm8952_wcd_cal)->X) = (Y)) S(num_btn, WCD_MBHC_DEF_BUTTONS); @@ -1538,19 +1856,38 @@ static void *def_msm8952_wcd_mbhc_cal(void) * 210-290 == Button 2 * 360-680 == Button 3 */ - btn_low[0] = 75; - btn_high[0] = 75; - btn_low[1] = 150; - btn_high[1] = 150; - btn_low[2] = 225; - btn_high[2] = 225; - btn_low[3] = 450; - btn_high[3] = 450; - btn_low[4] = 500; - btn_high[4] = 500; + + btn_low[0] = 25; + btn_high[0] = 75; + btn_low[1] = 200; + btn_high[1] = 225; + btn_low[2] = 325; + btn_high[2] = 450; + btn_low[3] = 500; + btn_high[3] = 510; + btn_low[4] = 530; + btn_high[4] = 540; + return msm8952_wcd_cal; } +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) || defined(CONFIG_D1_ROSY) +#else +extern char Spk_Pa_Flag[]; + +static void Set_Spk_PA_Id(void) +{ + int ret = 0; + + ret = strncmp(Spk_Pa_Flag, "S88537A12", 9); + if (ret == 0) { + Spk_Pa_Id = A12_AW8738_SPK_PA; + } else{ + Spk_Pa_Id = A13_AW87319_SPK_PA; + } + pr_err("%s:Spk_Pa_Id =%d\n!", __func__, Spk_Pa_Id); +} +#endif static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) { @@ -1598,6 +1935,19 @@ static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) return ret; } } + +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) || defined(CONFIG_D1_ROSY) +#else + INIT_DELAYED_WORK(&lineout_amp_enable, msm8952_ext_spk__delayed_enable); + + INIT_DELAYED_WORK(&lineout_amp_dualmode, msm8x16_ext_spk_delayed_dualmode); + + INIT_DELAYED_WORK(&lineout_hs_sw_enable, msm8952_ext_hs_delay_enable); + + /*Set Externl speaker PA Hardware ID*/ + Set_Spk_PA_Id(); +#endif + return 0; } @@ -2984,6 +3334,28 @@ static int msm8952_asoc_machine_probe(struct platform_device *pdev) } pdata->mclk_freq = id; + spk_pa_gpio = of_get_named_gpio(pdev->dev.of_node, "ext-spk-amp-gpio", 0); + if (spk_pa_gpio < 0) { + dev_err(&pdev->dev, + "%s: error! spk_pa_gpio is :%d\n", __func__, spk_pa_gpio); + } else { + if (gpio_request_one(spk_pa_gpio, GPIOF_DIR_OUT , "spk_enable")) { + dev_err(&pdev->dev, "%s: request spk_pa_gpio fail!\n", __func__); + } + } + pr_debug("%s: request spk_pa_gpio is %d!\n", __func__, spk_pa_gpio); + + headset_gpio = of_get_named_gpio(pdev->dev.of_node, "headset-gpio", 0); + if (headset_gpio < 0) { + dev_err(&pdev->dev, + "%s: error! headset_gpio is :%d\n", __func__, headset_gpio); + } else { + if (gpio_request_one(headset_gpio, GPIOF_DIR_OUT , "headset_enable")) { + dev_err(&pdev->dev, "%s: request headset_gpio fail!\n", __func__); + } + } + pr_debug("%s:request headset_gpio is %d!\n", __func__, headset_gpio); + /*reading the gpio configurations from dtsi file*/ ret = msm_gpioset_initialize(CLIENT_WCD_INT, &pdev->dev); if (ret < 0) { @@ -3201,6 +3573,12 @@ static int msm8952_asoc_machine_probe(struct platform_device *pdev) kfree(msm8952_codec_conf[i].name_prefix); } } + + if (spk_pa_gpio > 0) + gpio_free(spk_pa_gpio); + if (headset_gpio > 0) + gpio_free(headset_gpio); + err1: devm_kfree(&pdev->dev, pdata); return ret; diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index 07f0c473be9d5..9a0e64c7075f6 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -2931,6 +2931,15 @@ int q6asm_set_shared_circ_buff(struct audio_client *ac, int bytes_to_alloc, rc; size_t len; + mutex_lock(&ac->cmd_lock); + + if (ac->port[dir].buf) { + pr_err("%s: Buffer already allocated\n", __func__); + rc = -EINVAL; + mutex_unlock(&ac->cmd_lock); + goto done; + } + buf_circ = kzalloc(sizeof(struct audio_buffer), GFP_KERNEL); if (!buf_circ) { @@ -2938,9 +2947,7 @@ int q6asm_set_shared_circ_buff(struct audio_client *ac, goto done; } - mutex_lock(&ac->cmd_lock); - ac->port[dir].buf = buf_circ; bytes_to_alloc = bufsz * bufcnt; bytes_to_alloc = PAGE_ALIGN(bytes_to_alloc); @@ -2953,11 +2960,12 @@ int q6asm_set_shared_circ_buff(struct audio_client *ac, if (rc) { pr_err("%s: Audio ION alloc is failed, rc = %d\n", __func__, rc); - mutex_unlock(&ac->cmd_lock); kfree(buf_circ); + mutex_unlock(&ac->cmd_lock); goto done; } + ac->port[dir].buf = buf_circ; buf_circ->used = dir ^ 1; buf_circ->size = bytes_to_alloc; buf_circ->actual_size = bytes_to_alloc; @@ -3119,12 +3127,6 @@ int q6asm_open_shared_io(struct audio_client *ac, goto done; } - if (ac->port[dir].buf) { - pr_err("%s: Buffer already allocated\n", __func__); - rc = -EINVAL; - goto done; - } - rc = q6asm_set_shared_circ_buff(ac, open, bufsz, bufcnt, dir); if (rc) diff --git a/sound/soc/msm/qdsp6v2/rtac.c b/sound/soc/msm/qdsp6v2/rtac.c index 641a17bded648..22bed9249f2c4 100644 --- a/sound/soc/msm/qdsp6v2/rtac.c +++ b/sound/soc/msm/qdsp6v2/rtac.c @@ -883,6 +883,14 @@ int send_adm_apr(void *buf, u32 opcode) bytes_returned = ((u32 *)rtac_cal[ADM_RTAC_CAL].cal_data. kvaddr)[2] + 3 * sizeof(u32); + if (bytes_returned > rtac_cal[ADM_RTAC_CAL]. + map_data.map_size) { + pr_err("%s: Invalid data size = %d\n", + __func__, bytes_returned); + result = -EINVAL; + goto err; + } + if (bytes_returned > user_buf_size) { pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", __func__, user_buf_size, bytes_returned); @@ -1105,6 +1113,14 @@ int send_rtac_asm_apr(void *buf, u32 opcode) bytes_returned = ((u32 *)rtac_cal[ASM_RTAC_CAL].cal_data. kvaddr)[2] + 3 * sizeof(u32); + if (bytes_returned > rtac_cal[ASM_RTAC_CAL]. + map_data.map_size) { + pr_err("%s: Invalid data size = %d\n", + __func__, bytes_returned); + result = -EINVAL; + goto err; + } + if (bytes_returned > user_buf_size) { pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", __func__, user_buf_size, bytes_returned); @@ -1364,6 +1380,14 @@ static int send_rtac_afe_apr(void *buf, uint32_t opcode) bytes_returned = get_resp->param_size + sizeof(struct afe_port_param_data_v2); + if (bytes_returned > rtac_cal[AFE_RTAC_CAL]. + map_data.map_size) { + pr_err("%s: Invalid data size = %d\n", + __func__, bytes_returned); + result = -EINVAL; + goto err; + } + if (bytes_returned > user_afe_buf.buf_size) { pr_err("%s: user size = 0x%x, returned size = 0x%x\n", __func__, user_afe_buf.buf_size, @@ -1586,6 +1610,14 @@ int send_voice_apr(u32 mode, void *buf, u32 opcode) bytes_returned = ((u32 *)rtac_cal[VOICE_RTAC_CAL].cal_data. kvaddr)[2] + 3 * sizeof(u32); + if (bytes_returned > rtac_cal[VOICE_RTAC_CAL]. + map_data.map_size) { + pr_err("%s: Invalid data size = %d\n", + __func__, bytes_returned); + result = -EINVAL; + goto err; + } + if (bytes_returned > user_buf_size) { pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", __func__, user_buf_size, bytes_returned); diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index f3a78254b3078..7b4a7e84f06b4 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -350,12 +350,7 @@ static void snd_complete_urb(struct urb *urb) struct snd_usb_endpoint *ep = ctx->ep; int err; - /* - * Add this dev state check to avoid to call invalid ctx which is - * free during disconnetion handler. - */ - if (urb->dev->state == USB_STATE_NOTATTACHED) - return; + if (unlikely(urb->status == -ENOENT || /* unlinked */ urb->status == -ENODEV || /* device removed */ urb->status == -ECONNRESET || /* unlinked */ diff --git a/tools/testing/selftests/powerpc/copyloops/asm/processor.h b/tools/testing/selftests/powerpc/copyloops/asm/processor.h deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/tools/testing/selftests/powerpc/primitives/asm/ppc-opcode.h b/tools/testing/selftests/powerpc/primitives/asm/ppc-opcode.h deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/tools/virtio/linux/hrtimer.h b/tools/virtio/linux/hrtimer.h deleted file mode 100644 index e69de29bb2d1d..0000000000000 From 77a8d5a440cb27ed2fdf3767aadf8d259701094f Mon Sep 17 00:00:00 2001 From: hehao Date: Thu, 3 May 2018 18:08:12 +0800 Subject: [PATCH 1015/1015] Fixed RedMi 5A can't charge issue. Change-Id: I7410e2f49d516521ad34f4957f29269194c5fcc7 Signed-off-by: hehao --- drivers/mfd/wcd9xxx-core.c | 2 +- drivers/power/bq2560x_charger.c | 58 ++++++++++++------------- drivers/video/msm/mdss/mdss_dsi_panel.c | 2 +- sound/soc/msm/msm8994.c | 2 +- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/drivers/mfd/wcd9xxx-core.c b/drivers/mfd/wcd9xxx-core.c index 7987c20331ef3..3649e7c9fcbdd 100644 --- a/drivers/mfd/wcd9xxx-core.c +++ b/drivers/mfd/wcd9xxx-core.c @@ -2755,7 +2755,7 @@ static struct wcd9xxx_pdata *wcd9xxx_populate_dt_pdata(struct device *dev) "qcom,cdc-reset-gpio", 0); if (pdata->reset_gpio < 0) { dev_err(dev, "Looking up %s property in node %s failed %d\n", - "qcom, cdc-reset-gpio", + "qcom,cdc-reset-gpio", dev->of_node->full_name, pdata->reset_gpio); goto err; } diff --git a/drivers/power/bq2560x_charger.c b/drivers/power/bq2560x_charger.c index 12918b57bfcbc..e33a695f28161 100644 --- a/drivers/power/bq2560x_charger.c +++ b/drivers/power/bq2560x_charger.c @@ -208,8 +208,8 @@ struct bq2560x { struct power_supply batt_psy; }; -static int BatteryTestStatus_enable; -static int bq2560x_battery_capacity; +static int BatteryTestStatus_enable = 0; +static int bq2560x_battery_capacity = 0; #define FG_LOG_INTERVAL 150 static void bq2560x_dump_status(struct bq2560x *bq); @@ -1354,84 +1354,84 @@ static int bq2560x_parse_jeita_dt(struct device *dev, struct bq2560x *bq) struct device_node *np = dev->of_node; int ret; - ret = of_property_read_u32(np, "ti, bq2560x, jeita-hot-degc", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-hot-degc", &bq->batt_hot_degc); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-hot-degc\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-warm-degc", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-warm-degc", &bq->batt_warm_degc); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-warm-degc\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-cool-normal-degc", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cool-normal-degc", &bq->batt_cool_normal_degc); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-cool-normal-degc\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-cold-cool-degc", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cold-cool-degc", &bq->batt_cold_cool_degc); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-cold-cool-degc\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-cold-degc", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cold-degc", &bq->batt_cold_degc); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-cold-degc\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-hot-hysteresis", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-hot-hysteresis", &bq->hot_temp_hysteresis); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-hot-hysteresis\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-cold-hysteresis", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cold-hysteresis", &bq->cold_temp_hysteresis); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-cold-hysteresis\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-cold-cool-ma", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cold-cool-ma", &bq->batt_cold_cool_ma); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-cold-cool-ma\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-cool-normal-ma", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cool-normal-ma", &bq->batt_cool_normal_ma); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-cool-normal-ma\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-cool-mv", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cool-mv", &bq->batt_cool_mv); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-cool-mv\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-warm-ma", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-warm-ma", &bq->batt_warm_ma); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-warm-ma\n"); return ret; } - ret = of_property_read_u32(np, "ti, bq2560x, jeita-warm-mv", + ret = of_property_read_u32(np, "ti,bq2560x,jeita-warm-mv", &bq->batt_warm_mv); if (ret) { pr_err("Failed to read ti,bq2560x,jeita-warm-mv\n"); @@ -1439,7 +1439,7 @@ static int bq2560x_parse_jeita_dt(struct device *dev, struct bq2560x *bq) } bq->software_jeita_supported = - of_property_read_bool(np, "ti, bq2560x, software-jeita-supported"); + of_property_read_bool(np, "ti,bq2560x,software-jeita-supported"); return 0; } @@ -1465,72 +1465,72 @@ static struct bq2560x_platform_data *bq2560x_parse_dt(struct device *dev, pr_err("Failed to read node of ti,bq2560x,chip-enable-gpio\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, usb-vlim", &pdata->usb.vlim); + ret = of_property_read_u32(np, "ti,bq2560x,usb-vlim", &pdata->usb.vlim); if (ret) { pr_err("Failed to read node of ti,bq2560x,usb-vlim\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, usb-ilim", &pdata->usb.ilim); + ret = of_property_read_u32(np, "ti,bq2560x,usb-ilim", &pdata->usb.ilim); if (ret) { pr_err("Failed to read node of ti,bq2560x,usb-ilim\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, usb-vreg", &pdata->usb.vreg); + ret = of_property_read_u32(np, "ti,bq2560x,usb-vreg", &pdata->usb.vreg); if (ret) { pr_err("Failed to read node of ti,bq2560x,usb-vreg\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, usb-ichg", &pdata->usb.ichg); + ret = of_property_read_u32(np, "ti,bq2560x,usb-ichg", &pdata->usb.ichg); if (ret) { pr_err("Failed to read node of ti,bq2560x,usb-ichg\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, ta-vlim", &pdata->ta.vlim); + ret = of_property_read_u32(np, "ti,bq2560x,ta-vlim", &pdata->ta.vlim); if (ret) { pr_err("Failed to read node of ti,bq2560x,ta-vlim\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, ta-ilim", &pdata->ta.ilim); + ret = of_property_read_u32(np, "ti,bq2560x,ta-ilim", &pdata->ta.ilim); if (ret) { pr_err("Failed to read node of ti,bq2560x,ta-ilim\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, ta-vreg", &pdata->ta.vreg); + ret = of_property_read_u32(np, "ti,bq2560x,ta-vreg", &pdata->ta.vreg); if (ret) { pr_err("Failed to read node of ti,bq2560x,ta-vreg\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, ta-ichg", &pdata->ta.ichg); + ret = of_property_read_u32(np, "ti,bq2560x,ta-ichg", &pdata->ta.ichg); if (ret) { pr_err("Failed to read node of ti,bq2560x,ta-ichg\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, stat-pin-ctrl", &pdata->statctrl); + ret = of_property_read_u32(np, "ti,bq2560x,stat-pin-ctrl", &pdata->statctrl); if (ret) { pr_err("Failed to read node of ti,bq2560x,stat-pin-ctrl\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, precharge-current", &pdata->iprechg); + ret = of_property_read_u32(np, "ti,bq2560x,precharge-current", &pdata->iprechg); if (ret) { pr_err("Failed to read node of ti,bq2560x,precharge-current\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, termination-current", &pdata->iterm); + ret = of_property_read_u32(np, "ti,bq2560x,termination-current", &pdata->iterm); if (ret) { pr_err("Failed to read node of ti,bq2560x,termination-current\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, boost-voltage", &pdata->boostv); + ret = of_property_read_u32(np, "ti,bq2560x,boost-voltage", &pdata->boostv); if (ret) { pr_err("Failed to read node of ti,bq2560x,boost-voltage\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, boost-current", &pdata->boosti); + ret = of_property_read_u32(np, "ti,bq2560x,boost-current", &pdata->boosti); if (ret) { pr_err("Failed to read node of ti,bq2560x,boost-current\n"); } - ret = of_property_read_u32(np, "ti, bq2560x, vac-ovp-threshold", &pdata->vac_ovp); + ret = of_property_read_u32(np, "ti,bq2560x,vac-ovp-threshold", &pdata->vac_ovp); if (ret) { pr_err("Failed to read node of ti,bq2560x,vac-ovp-threshold\n"); } diff --git a/drivers/video/msm/mdss/mdss_dsi_panel.c b/drivers/video/msm/mdss/mdss_dsi_panel.c index bfa5e93124dad..fee8519e79d6f 100644 --- a/drivers/video/msm/mdss/mdss_dsi_panel.c +++ b/drivers/video/msm/mdss/mdss_dsi_panel.c @@ -2769,7 +2769,7 @@ static int mdss_panel_parse_dt(struct device_node *np, mdss_dsi_parse_eye_command(np, ctrl_pdata); - ctrl_pdata->init_last = of_property_read_bool(np, "qcom, mdss-dsi-init-last"); + ctrl_pdata->init_last = of_property_read_bool(np, "qcom,mdss-dsi-init-last"); rc = of_property_read_u32(np, "qcom,adjust-timer-wakeup-ms", &tmp); pinfo->adjust_timer_delay_ms = (!rc ? tmp : 0); diff --git a/sound/soc/msm/msm8994.c b/sound/soc/msm/msm8994.c index 9f803ab09625c..2d5428066cede 100644 --- a/sound/soc/msm/msm8994.c +++ b/sound/soc/msm/msm8994.c @@ -3439,7 +3439,7 @@ static int msm8994_asoc_machine_probe(struct platform_device *pdev) if (pdata->mclk_gpio < 0) { dev_err(&pdev->dev, "Looking up %s property in node %s failed %d\n", - "qcom, cdc-mclk-gpios", pdev->dev.of_node->full_name, + "qcom,cdc-mclk-gpios", pdev->dev.of_node->full_name, pdata->mclk_gpio); ret = -ENODEV; goto err;